Merge commit '877c94338e9ee442241b1cbea1baedada46203da' into master

Upgrade cros_sdk to version 13506.0.0.

BUG=b/170152381
TEST=local presubmit

Signed-off-by: Robert Kolchmeyer <rkolchmeyer@google.com>
Change-Id: I834cf0bb0026a4f26596d2107969806c9870ff68
diff --git a/OWNERS.kernel b/OWNERS.kernel
new file mode 100644
index 0000000..9340c2f
--- /dev/null
+++ b/OWNERS.kernel
@@ -0,0 +1,6 @@
+# Some files may benefit from kernel-domain expertise.
+briannorris@chromium.org
+dianders@chromium.org
+drinkcat@chromium.org
+groeck@chromium.org
+swboyd@chromium.org
diff --git a/OWNERS.security b/OWNERS.security
new file mode 100644
index 0000000..da09356
--- /dev/null
+++ b/OWNERS.security
@@ -0,0 +1,3 @@
+allenwebb@chromium.org
+jorgelo@chromium.org
+mnissler@chromium.org
diff --git a/PRESUBMIT.cfg b/PRESUBMIT.cfg
index 8acfa5e..bfd4996 100644
--- a/PRESUBMIT.cfg
+++ b/PRESUBMIT.cfg
@@ -21,3 +21,4 @@
 
 [Hook Scripts]
 hook0=./sys-apps/dbus/presubmit_check.sh
+cros lint=../../../chromite/bin/cros lint ${PRESUBMIT_FILES}
diff --git a/app-accessibility/googletts/Manifest b/app-accessibility/googletts/Manifest
index c58609c..ff03ebe 100644
--- a/app-accessibility/googletts/Manifest
+++ b/app-accessibility/googletts/Manifest
@@ -1 +1 @@
-DIST googletts-14.tar.xz 103868612 BLAKE2B 855717f7986a2e8a582b87da64043af2595ca4f4f40b139bdda972d6a7bc44e2975f6d108433167d87f1895f424a04f1d51333b39fc0ee52a7791bc28758946e SHA512 9bdfd49f31aca6ca07c37a062c17b16a91a05b2d43af829c07fa2a472d4b2af58a272cfeeec918aecc75b51c7cbd22841df632c0c55c8712d82290c6758852cd
+DIST googletts-14.3.tar.xz 103622512 BLAKE2B 17683bb71e529ff8ad75b6b00aef7f0a5787d01715cc96643ebabd86c7117c61ca5c72d13c527cea27fbd660d806a9360d8c812b86a92976fc4cf3fcd4b2652b SHA512 42c8d1e4d4e263d20767de7bce7e85d6ae1dc01aa8c4794a192cd60d3eadf606d8f6fd5571d70487963c819300d7d7ee4061785a493d0b50e23d7bdb06c0e99f
diff --git a/app-accessibility/googletts/googletts-14-r1.ebuild b/app-accessibility/googletts/googletts-14-r1.ebuild
deleted file mode 120000
index 2d3ad53..0000000
--- a/app-accessibility/googletts/googletts-14-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-googletts-14.ebuild
\ No newline at end of file
diff --git a/app-accessibility/googletts/googletts-14.3.ebuild b/app-accessibility/googletts/googletts-14.3.ebuild
new file mode 100644
index 0000000..2e03ac0
--- /dev/null
+++ b/app-accessibility/googletts/googletts-14.3.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v3
+#
+# Web port of the Google text-to-speech engine.
+
+EAPI=6
+
+DESCRIPTION="Google text-to-speech engine"
+SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.xz"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+# Files in /usr/share/chromeos-assets/speech_synthesis/ moved from
+# chromeos-base/common-assets.
+RDEPEND="!<chromeos-base/common-assets-0.0.2-r123"
+
+S="${WORKDIR}"
+
+src_install() {
+	local tts_path=/usr/share/chromeos-assets/speech_synthesis
+	mkdir -p "patts" || die
+
+	if use amd64 ; then
+		cp "libchrometts_x86_64.so" "patts/libchrometts.so" || die
+	elif use arm64 ; then
+		cp "libchrometts_arm64.so" "patts/libchrometts.so" || die
+	elif use arm ; then
+		cp "libchrometts_armv7.so" "patts/libchrometts.so" || die
+	else
+		ewarn "Text-to-speech unsupported on this architecture."
+		return
+	fi
+
+	cp ./*.{css,html,js,json,png,svg,zvoice} "patts/" || die
+
+	chmod 644 patts/* || die
+	chmod 755 patts/libchrometts.so || die
+
+	# Create and install a squashfs file.
+	mksquashfs "patts" "patts.squash" 			-all-root \
+		-noappend -no-recovery -no-exports -exit-on-error -comp lzo \
+		-b 1M -4k-align -root-mode 0755 -no-progress || die
+
+	keepdir "${tts_path}"/patts
+	insinto "${tts_path}"
+	doins "patts.squash"
+
+	# Install an Upstart script that mount and unmount the squash file when
+	# system-services start and stop.
+	insinto "/etc/init"
+	doins "googletts.conf"
+}
diff --git a/app-accessibility/googletts/googletts-14.ebuild b/app-accessibility/googletts/googletts-14.ebuild
deleted file mode 100644
index b998985..0000000
--- a/app-accessibility/googletts/googletts-14.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v3
-#
-# Web port of the Google text-to-speech engine.
-
-EAPI=6
-
-DESCRIPTION="Google text-to-speech engine"
-SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.xz"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-# Files in /usr/share/chromeos-assets/speech_synthesis/ moved from
-# chromeos-base/common-assets.
-RDEPEND="!<chromeos-base/common-assets-0.0.2-r123"
-
-S="${WORKDIR}"
-
-src_install() {
-	local tts_path=/usr/share/chromeos-assets/speech_synthesis
-	mkdir -p "patts" || die
-
-	if use amd64 ; then
-		cp "libchrometts_x86_64.so" "patts/libchrometts.so" || die
-	elif use arm64 ; then
-		cp "libchrometts_arm64.so" "patts/libchrometts.so" || die
-	elif use arm ; then
-		cp "libchrometts_armv7.so" "patts/libchrometts.so" || die
-	else
-		ewarn "Text-to-speech unsupported on this architecture."
-		return
-	fi
-
-	cp ./*.{css,html,js,json,png,svg,zvoice} "patts/" || die
-
-	chmod 644 patts/* || die
-	chmod 755 patts/libchrometts.so || die
-
-	# Create and install a squashfs file.
-	mksquashfs "patts" "patts.squash" 			-all-root \
-		-noappend -no-recovery -no-exports -exit-on-error -comp lzo \
-		-b 1M -4k-align -root-mode 0755 -no-progress || die
-
-	keepdir "${tts_path}"/patts
-	insinto "${tts_path}"
-	doins "patts.squash"
-
-	# Install Upstart scripts that mount and unmount the squash file when
-	# Chrome UI starts and stops.
-	insinto "/etc/init"
-	doins "googletts-start.conf"
-	doins "googletts-stop.conf"
-}
diff --git a/app-benchmarks/stress-ng/Manifest b/app-benchmarks/stress-ng/Manifest
deleted file mode 100644
index 8ffbf30..0000000
--- a/app-benchmarks/stress-ng/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST stress-ng-0.09.57.tar.xz 386624 BLAKE2B 524a69e08dc2443d3a66ad46d07f509333eb497ede6bfe11ef10f84fc33720597eae5ce58d706e5384be19f361fc7b4b762110e3ca10556ef4ccfd804dcd1be4 SHA512 5c3bd06be0f66a6bbb88393b3d22400b5a307e4c45e27d7cb15502370b0873ec11c911aa31fa066400152169ec5bea29c1c0260899dedbc640fbef09ee672cb5
diff --git a/app-benchmarks/stress-ng/files/stress-ng-0.09.53-makefile.patch b/app-benchmarks/stress-ng/files/stress-ng-0.09.53-makefile.patch
deleted file mode 100644
index cf08858d..0000000
--- a/app-benchmarks/stress-ng/files/stress-ng-0.09.53-makefile.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- a/Makefile	2019-02-15 13:06:01.000000000 +0100
-+++ b/Makefile	2019-02-19 21:44:10.000000000 +0100
-@@ -21,7 +21,7 @@
- # Codename "portable pressure producer"
- #
- 
--CFLAGS += -Wall -Wextra -DVERSION='"$(VERSION)"' -O2 -std=gnu99
-+CFLAGS += -Wall -Wextra -DVERSION='"$(VERSION)"' -std=gnu99
- 
- #
- # Pedantic flags
-@@ -347,12 +347,10 @@
- .o: stress-ng.h Makefile
- 
- .c.o: stress-ng.h Makefile $(SRC)
--	@echo "CC $<"
--	@$(CC) $(CFLAGS) -c -o $@ $<
-+	$(CC) $(CFLAGS) -c -o $@ $<
- 
- stress-ng: $(OBJS)
--	@echo "LD $@"
--	@$(CC) $(CPPFLAGS) $(CFLAGS) $(OBJS) -lm $(LDFLAGS) -o $@
-+	$(CC) $(CPPFLAGS) $(CFLAGS) $(OBJS) -lm $(LDFLAGS) -o $@
- 	@sync
- 
- makeconfig:
-@@ -373,7 +371,7 @@
- 		sed '$$ s/.$$//' >> apparmor-data.c
- 	@echo "};" >> apparmor-data.c
- 	@echo "const size_t g_apparmor_data_len = sizeof(g_apparmor_data);" >> apparmor-data.c
--	@echo "CC $<"
-+	echo "CC $<"
- 	@$(CC) -c apparmor-data.c -o apparmor-data.o
- 	@rm -rf apparmor-data.c apparmor-data.bin
- 
-@@ -389,12 +387,12 @@
- core-perf.o: core-perf.c core-perf-event.c
- 	@$(CC) $(CFLAGS) -E core-perf-event.c | grep "PERF_COUNT" | sed 's/,/ /' | \
- 	awk {'print "#define _SNG_" $$1 " (1)"'} > core-perf-event.h
--	@echo CC $<
--	@$(CC) $(CFLAGS) -c -o $@ $<
-+	echo CC $<
-+	$(CC) $(CFLAGS) -c -o $@ $<
- 
- stress-vecmath.o: stress-vecmath.c
--	@echo CC $<
--	@$(CC) $(CFLAGS) -fno-builtin -c -o $@ $<
-+	echo CC $<
-+	$(CC) $(CFLAGS) -fno-builtin -c -o $@ $<
- 	@touch stress-ng.c
- 
- $(OBJS): stress-ng.h Makefile
-@@ -442,6 +440,6 @@
- 	mkdir -p ${DESTDIR}${BINDIR}
- 	cp stress-ng ${DESTDIR}${BINDIR}
- 	mkdir -p ${DESTDIR}${MANDIR}
--	cp stress-ng.1.gz ${DESTDIR}${MANDIR}
-+	cp stress-ng.1 ${DESTDIR}${MANDIR}
- 	mkdir -p ${DESTDIR}${JOBDIR}
- 	cp -rp example-jobs/*.job ${DESTDIR}${JOBDIR}
diff --git a/app-benchmarks/stress-ng/metadata.xml b/app-benchmarks/stress-ng/metadata.xml
deleted file mode 100644
index 41c8fd9..0000000
--- a/app-benchmarks/stress-ng/metadata.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
-<pkgmetadata>
-	<maintainer type="person">
-		<email>ck+gentoo@bl4ckb0x.de</email>
-		<name>Conrad Kostecki</name>
-	</maintainer>
-	<maintainer type="project">
-		<email>proxy-maint@gentoo.org</email>
-		<name>Proxy Maintainers</name>
-	</maintainer>
-	<longdescription>
-		Stress-ng will stress test a computer system in various selectable ways.
-		It was designed to exercise various physical subsystems of a computer
-		as well as the various operating system kernel interfaces.
-		It features 200 stress tests, 70 CPU specific stress tests,
-		that exercise floating point, integer, bit manipulation and control flow
-		and over 20 virtual memory stress tests.
-	</longdescription>
-	<upstream>
-		<bugs-to>https://github.com/ColinIanKing/stress-ng/issues</bugs-to>
-		<remote-id type="github">ColinIanKing/stress-ng</remote-id>
-	</upstream>
-</pkgmetadata>
diff --git a/app-benchmarks/stress-ng/stress-ng-0.09.57.ebuild b/app-benchmarks/stress-ng/stress-ng-0.09.57.ebuild
deleted file mode 100644
index d8cd895..0000000
--- a/app-benchmarks/stress-ng/stress-ng-0.09.57.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-DESCRIPTION="Stress test for a computer system with various selectable ways"
-HOMEPAGE="https://kernel.ubuntu.com/~cking/stress-ng/"
-SRC_URI="https://kernel.ubuntu.com/~cking/tarballs/${PN}/${P}.tar.xz"
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-DEPEND="
-	dev-libs/libaio
-	dev-libs/libbsd
-	dev-libs/libgcrypt:0=
-	sys-apps/attr
-	sys-apps/keyutils
-	sys-libs/libapparmor
-	sys-libs/libcap
-	sys-libs/zlib:=
-"
-
-RDEPEND="${DEPEND}"
-
-DOCS=( "README" "README.Android" "TODO" "syscalls.txt" )
-
-PATCHES=( "${FILESDIR}/${PN}-0.09.53-makefile.patch" )
diff --git a/app-crypt/trousers-tests/trousers-tests-0.0.1-r80.ebuild b/app-crypt/trousers-tests/trousers-tests-0.0.1-r80.ebuild
deleted file mode 100644
index bb6759de..0000000
--- a/app-crypt/trousers-tests/trousers-tests-0.0.1-r80.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="10dbd8f557c0cef1e41a2f00ef38834f31913adf"
-CROS_WORKON_TREE="5858217ad29e54dd69c94a9be8da7ba4b050ff5c"
-CROS_WORKON_PROJECT="chromiumos/third_party/trousers"
-CROS_WORKON_EGIT_BRANCH="master-0.3.13"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Trousers TPM tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/trousers/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-DEPEND="
-	app-crypt/trousers
-	!<chromeos-base/autotest-tests-0.0.1-r1521
-"
-RDEPEND="${DEPEND}"
-
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-IUSE_TESTS="
-	+tests_hardware_TPM
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME=trousers
-
-# path from root of repo
-AUTOTEST_CLIENT_SITE_TESTS=autotest
-
-src_compile() {
-	# for Makefile
-	export TROUSERS_DIR=${WORKDIR}/${P}
-	autotest_src_compile
-}
-
diff --git a/app-crypt/trousers-tests/trousers-tests-0.0.1-r84.ebuild b/app-crypt/trousers-tests/trousers-tests-0.0.1-r84.ebuild
new file mode 100644
index 0000000..51e81b7
--- /dev/null
+++ b/app-crypt/trousers-tests/trousers-tests-0.0.1-r84.ebuild
@@ -0,0 +1,43 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="eb1eddcef6a5fabc375256e5067276fac5d5965c"
+CROS_WORKON_TREE="6e7dfce147d12e5fcc5389e16682e7b68ebb5597"
+CROS_WORKON_PROJECT="chromiumos/third_party/trousers"
+CROS_WORKON_EGIT_BRANCH="master-0.3.13"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Trousers TPM tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/trousers/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+DEPEND="
+	app-crypt/trousers
+	!<chromeos-base/autotest-tests-0.0.1-r1521
+"
+RDEPEND="${DEPEND}"
+
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+IUSE_TESTS="
+	+tests_hardware_TPM
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME=trousers
+
+# path from root of repo
+AUTOTEST_CLIENT_SITE_TESTS=autotest
+
+src_compile() {
+	# for Makefile
+	export TROUSERS_DIR=${WORKDIR}/${P}
+	autotest_src_compile
+}
+
diff --git a/app-crypt/trousers/trousers-0.3.3-r91.ebuild b/app-crypt/trousers/trousers-0.3.3-r91.ebuild
deleted file mode 100644
index 92afc6b..0000000
--- a/app-crypt/trousers/trousers-0.3.3-r91.ebuild
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 1999-2009 Gentoo Foundation
-# Copyright 2010 Google, Inc.
-# Distributed under the terms of the GNU General Public License v2
-# $Header$
-
-EAPI="5"
-CROS_WORKON_COMMIT="10dbd8f557c0cef1e41a2f00ef38834f31913adf"
-CROS_WORKON_TREE="5858217ad29e54dd69c94a9be8da7ba4b050ff5c"
-CROS_WORKON_PROJECT="chromiumos/third_party/trousers"
-CROS_WORKON_EGIT_BRANCH="master-0.3.13"
-
-inherit autotools base cros-debug cros-sanitizers cros-workon flag-o-matic libchrome systemd user
-
-DESCRIPTION="An open-source TCG Software Stack (TSS) v1.1 implementation"
-HOMEPAGE="http://trousers.sf.net"
-LICENSE="CPL-1.0"
-KEYWORDS="*"
-SLOT="0"
-IUSE="asan doc mocktpm systemd tss_trace"
-
-COMMON_DEPEND="
-	chromeos-base/metrics
-	>=dev-libs/openssl-0.9.7:0="
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	dev-util/pkgconfig"
-
-## TODO: Check if this patch is useful for us.
-## PATCHES=(	"${FILESDIR}/${PN}-0.2.3-nouseradd.patch" )
-
-pkg_setup() {
-	# New user/group for the daemon
-	enewgroup tss
-	enewuser tss
-}
-
-src_prepare() {
-	base_src_prepare
-
-	sed -e "s/-Werror //" -i configure.in
-	eautoreconf
-}
-
-src_configure() {
-	sanitizers-setup-env
-	use tss_trace && append-cppflags -DTSS_TRACE
-	use mocktpm && append-cppflags -DMOCK_TPM
-
-	cros-debug-add-NDEBUG
-	econf
-}
-
-src_install() {
-	default
-	dodoc NICETOHAVES
-	use doc && dodoc doc/*
-
-	# Install the empty system.data files
-	dodir /etc/trousers
-	insinto /etc/trousers
-	doins "${S}"/dist/system.data.*
-
-	# Install the init scripts
-	if use systemd; then
-		systemd_dounit init/*.service
-		systemd_enable_service boot-services.target tcsd.service
-		systemd_enable_service boot-services.target tpm-probe.service
-	else
-		insinto /etc/init
-		doins init/*.conf
-	fi
-	exeinto /usr/share/cros/init
-	doexe init/tcsd-pre-start.sh
-}
-
-pkg_postinst() {
-	elog "If you have problems starting tcsd, please check permissions and"
-	elog "ownership on /dev/tpm* and ~tss/system.data"
-}
diff --git a/app-crypt/trousers/trousers-0.3.3-r97.ebuild b/app-crypt/trousers/trousers-0.3.3-r97.ebuild
new file mode 100644
index 0000000..6d24374
--- /dev/null
+++ b/app-crypt/trousers/trousers-0.3.3-r97.ebuild
@@ -0,0 +1,82 @@
+# Copyright 1999-2009 Gentoo Foundation
+# Copyright 2010 Google, Inc.
+# Distributed under the terms of the GNU General Public License v2
+# $Header$
+
+EAPI="5"
+CROS_WORKON_COMMIT="eb1eddcef6a5fabc375256e5067276fac5d5965c"
+CROS_WORKON_TREE="6e7dfce147d12e5fcc5389e16682e7b68ebb5597"
+CROS_WORKON_PROJECT="chromiumos/third_party/trousers"
+CROS_WORKON_EGIT_BRANCH="master-0.3.13"
+
+inherit autotools base cros-debug cros-sanitizers cros-workon flag-o-matic libchrome systemd user
+
+DESCRIPTION="An open-source TCG Software Stack (TSS) v1.1 implementation"
+HOMEPAGE="http://trousers.sf.net"
+LICENSE="CPL-1.0"
+KEYWORDS="*"
+SLOT="0"
+IUSE="asan doc mocktpm systemd tss_trace"
+
+COMMON_DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152
+	>=dev-libs/openssl-0.9.7:0="
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	dev-util/pkgconfig"
+
+## TODO: Check if this patch is useful for us.
+## PATCHES=(	"${FILESDIR}/${PN}-0.2.3-nouseradd.patch" )
+
+pkg_setup() {
+	# New user/group for the daemon
+	enewgroup tss
+	enewuser tss
+}
+
+src_prepare() {
+	base_src_prepare
+
+	sed -e "s/-Werror //" -i configure.in
+	eautoreconf
+}
+
+src_configure() {
+	sanitizers-setup-env
+	use tss_trace && append-cppflags -DTSS_TRACE
+	use mocktpm && append-cppflags -DMOCK_TPM
+
+	cros-debug-add-NDEBUG
+	export BASE_VER="$(libchrome_ver)"
+	econf
+}
+
+src_install() {
+	default
+	dodoc NICETOHAVES
+	use doc && dodoc doc/*
+
+	# Install the empty system.data files
+	dodir /etc/trousers
+	insinto /etc/trousers
+	doins "${S}"/dist/system.data.*
+
+	# Install the init scripts
+	if use systemd; then
+		systemd_dounit init/*.service
+		systemd_enable_service boot-services.target tcsd.service
+		systemd_enable_service boot-services.target tpm-probe.service
+	else
+		insinto /etc/init
+		doins init/*.conf
+	fi
+	exeinto /usr/share/cros/init
+	doexe init/tcsd-pre-start.sh
+}
+
+pkg_postinst() {
+	elog "If you have problems starting tcsd, please check permissions and"
+	elog "ownership on /dev/tpm* and ~tss/system.data"
+}
diff --git a/app-crypt/trousers/trousers-9999.ebuild b/app-crypt/trousers/trousers-9999.ebuild
index 3003614..98acf56 100644
--- a/app-crypt/trousers/trousers-9999.ebuild
+++ b/app-crypt/trousers/trousers-9999.ebuild
@@ -17,7 +17,7 @@
 IUSE="asan doc mocktpm systemd tss_trace"
 
 COMMON_DEPEND="
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	>=dev-libs/openssl-0.9.7:0="
 
 RDEPEND="${COMMON_DEPEND}"
@@ -47,6 +47,7 @@
 	use mocktpm && append-cppflags -DMOCK_TPM
 
 	cros-debug-add-NDEBUG
+	export BASE_VER="$(libchrome_ver)"
 	econf
 }
 
diff --git a/app-emulation/qemu/Manifest b/app-emulation/qemu/Manifest
new file mode 100644
index 0000000..96bd155
--- /dev/null
+++ b/app-emulation/qemu/Manifest
@@ -0,0 +1,3 @@
+DIST qemu-20200718-keycodemapdb.tar.gz 47598 BLAKE2B 8ffeb7afd4c2ccbdb686d61428dc106a98907a96bb4980e187eace15c1c2454196fd16cb7b48d1887db98ff9aea55089ab192479068eaec0ac04c9e632fe5e81 SHA512 0db43f9933b5837ff534415c7084777f939ed3db7523e73fbb046567b96d5c097cf81b7670368447b6da38d514c62e0ede9b4b872954c4f42078b0dc8431e66d
+DIST qemu-20200729-berkeley-testfloat-3.tar.gz 139221 BLAKE2B 7e4a0632224f8e8d5a11ae373bbe334adb3eaee9c0bc5626be1d6148cbb219b2311ce20bc7a8ff7d532f932c497fc8f3ead75ccf4a8d406fcc4e0fca15061c0a SHA512 98a8b1be0c2854e36f1eef9de0ea5609a30e35cf231da7bb63242d636a6139d61ff78f117e8e24e0d076a588abf12cbeea06dc8ba625b84feccc07e05cd365a3
+DIST qemu-20200729-slirp.tar.gz 126451 BLAKE2B cf139056b275b54aec11e708bc7832817b707c91adaaa830c5e73ca03f3283d699073d96cac0c64a2fe72abe60c35b8d7b5f777d70ba7d2aabce1f21b6b1b5e4 SHA512 09038eb718b01a67389d1a9db1b5a4db6e0195ea4365670b90dbb3a87e18b82b85e43c24f718eba3c4045a325469836c6da0286bd5d8952ca171e9eb7800d19f
diff --git a/app-emulation/qemu/files/65-kvm.rules-r1 b/app-emulation/qemu/files/65-kvm.rules-r1
new file mode 100644
index 0000000..ab3776a
--- /dev/null
+++ b/app-emulation/qemu/files/65-kvm.rules-r1
@@ -0,0 +1,2 @@
+KERNEL=="kvm", GROUP="kvm", MODE="0660"
+KERNEL=="vhost-net", GROUP="kvm", MODE="0660", OPTIONS+="static_node=vhost-net"
diff --git a/app-emulation/qemu/files/bridge.conf b/app-emulation/qemu/files/bridge.conf
new file mode 100644
index 0000000..2bde37e
--- /dev/null
+++ b/app-emulation/qemu/files/bridge.conf
@@ -0,0 +1,14 @@
+# This should have the following permissions: root:qemu 0640
+
+# allow br0
+# Uncommenting the above would allow users in the 'qemu' group
+# to add devices to 'br0'
+
+# allow virbr0
+# Uncommenting the above would allow users in the 'qemu' group
+# to add devices to 'virbr0'
+
+# include /etc/qemu/bob.conf
+# Uncommenting the above would allow users in the 'bob' group
+# to have permissions defined in it, iff it has the following
+# permissions: root:bob 0640
diff --git a/app-emulation/qemu/files/qemu-binfmt.initd.head b/app-emulation/qemu/files/qemu-binfmt.initd.head
new file mode 100644
index 0000000..832ddb0
--- /dev/null
+++ b/app-emulation/qemu/files/qemu-binfmt.initd.head
@@ -0,0 +1,64 @@
+#!/sbin/openrc-run
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# Enable automatic non-native program execution by the kernel.
+
+# Defaulting to OC should be safe because it comes down to:
+#  - do we trust the interp itself to not be malicious?  yes; we built it.
+#  - do we trust the programs we're running?  ish; same permission as native
+#    binaries apply.  so if user can do bad stuff natively, cross isn't worse.
+: ${QEMU_BINFMT_FLAGS:=OC}
+
+depend() {
+	after procfs
+}
+
+start() {
+	ebegin "Registering qemu-user binaries (flags: ${QEMU_BINFMT_FLAGS})"
+
+	if [ ! -d /proc/sys/fs/binfmt_misc ] ; then
+		modprobe -q binfmt_misc
+	fi
+
+	if [ ! -d /proc/sys/fs/binfmt_misc ] ; then
+		eend 1 "You need support for 'misc binaries' in your kernel!"
+		return
+	fi
+
+	if [ ! -f /proc/sys/fs/binfmt_misc/register ] ; then
+		mount -t binfmt_misc -o nodev,noexec,nosuid \
+			binfmt_misc /proc/sys/fs/binfmt_misc >/dev/null 2>&1
+		eend $? || return
+	fi
+
+	# Probe the native cpu type so we don't try registering them.
+	local cpu="$(uname -m)"
+	case "${cpu}" in
+	armv[4-9]*)
+		cpu="arm"
+		;;
+	i386|i486|i586|i686|i86pc|BePC|x86_64)
+		cpu="i386"
+		;;
+	m68k)
+		cpu="m68k"
+		;;
+	mips*)
+		cpu="mips"
+		;;
+	"Power Macintosh"|ppc|ppc64)
+		cpu="ppc"
+		;;
+	s390*)
+		cpu="s390"
+		;;
+	sh*)
+		cpu="sh"
+		;;
+	sparc*)
+		cpu="sparc"
+		;;
+	esac
+
+	# Register the interpreter for each cpu except for the native one.
diff --git a/app-emulation/qemu/files/qemu-binfmt.initd.tail b/app-emulation/qemu/files/qemu-binfmt.initd.tail
new file mode 100644
index 0000000..7679481
--- /dev/null
+++ b/app-emulation/qemu/files/qemu-binfmt.initd.tail
@@ -0,0 +1,14 @@
+	eend 0
+}
+
+stop() {
+	# We unregister everything in the "qemu-xxx" namespace.
+	ebegin "Unregistering qemu-user binaries"
+	local f
+	for f in /proc/sys/fs/binfmt_misc/qemu-* ; do
+		if [ -f "${f}" ] ; then
+			echo '-1' > "${f}"
+		fi
+	done
+	eend 0
+}
diff --git a/app-emulation/qemu/metadata.xml b/app-emulation/qemu/metadata.xml
new file mode 100644
index 0000000..0c30c45
--- /dev/null
+++ b/app-emulation/qemu/metadata.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>tamiko@gentoo.org</email>
+		<name>Matthias Maier</name>
+	</maintainer>
+	<maintainer type="person">
+		<email>slyfox@gentoo.org</email>
+		<name>Sergei Trofimovich</name>
+	</maintainer>
+	<maintainer type="project">
+		<email>virtualization@gentoo.org</email>
+		<name>Gentoo Virtualization Project</name>
+	</maintainer>
+	<use>
+		<flag name="accessibility">Adds support for braille displays using brltty</flag>
+		<flag name="aio">Enables support for Linux's Async IO</flag>
+		<flag name="alsa">Enable alsa output for sound emulation</flag>
+		<flag name="capstone">Enable disassembly support with <pkg>dev-libs/capstone</pkg></flag>
+		<flag name="curl">Support ISOs / -cdrom directives vis HTTP or HTTPS.</flag>
+		<flag name="fdt">Enables firmware device tree support</flag>
+		<flag name="glusterfs">Enables GlusterFS cluster fileystem via
+			<pkg>sys-cluster/glusterfs</pkg></flag>
+		<flag name="gnutls">Enable TLS support for the VNC console server.
+		For 1.4 and newer this also enables WebSocket support.
+		For 2.0 through 2.3 also enables disk quorum support.</flag>
+		<flag name="iscsi">Enable direct iSCSI support via
+		<pkg>net-libs/libiscsi</pkg> instead of indirectly via the Linux
+		block layer that <pkg>sys-block/open-iscsi</pkg> does.</flag>
+		<flag name="io-uring">Enable efficient I/O via <pkg>sys-libs/liburing</pkg>.</flag>
+		<flag name="ncurses">Enable the ncurses-based console</flag>
+		<flag name="nfs">Enable NFS support</flag>
+		<flag name="numa">Enable NUMA support</flag>
+		<flag name="pin-upstream-blobs">Pin the versions of BIOS firmware to the version included in the upstream release.
+		This is needed to sanely support migration/suspend/resume/snapshotting/etc... of instances.
+		When the blobs are different, random corruption/bugs/crashes/etc... may be observed.</flag>
+		<flag name="plugins">Enable qemu plugin API via shared library loading.</flag>
+		<flag name="pulseaudio">Enable pulseaudio output for sound emulation</flag>
+		<flag name="rbd">Enable rados block device backend support, see http://ceph.newdream.net/wiki/QEMU-RBD</flag>
+		<flag name="sdl">Enable the SDL-based console</flag>
+		<flag name="sdl-image">SDL Image support for icons</flag>
+		<flag name="spice">Enable Spice protocol support via <pkg>app-emulation/spice</pkg></flag>
+		<flag name="ssh">Enable SSH based block device support via <pkg>net-libs/libssh2</pkg></flag>
+		<flag name="static-user">Build the User targets as static binaries</flag>
+		<flag name="static">Build the User and Software MMU (system) targets as well as tools as static binaries</flag>
+		<flag name="systemtap">Enable SystemTAP/DTrace tracing</flag>
+		<flag name="tci">Enable the TCG Interpreter which can speed up or slowdown workloads depending on the host and guest CPUs being emulated. In the future it will be a runtime option but for now its compile time.</flag>
+		<flag name="jemalloc">Enable jemalloc allocator support</flag>
+		<flag name="jpeg">Enable jpeg image support for the VNC console server</flag>
+		<flag name="png">Enable png image support for the VNC console server</flag>
+		<flag name="usb">Enable USB passthrough via <pkg>dev-libs/libusb</pkg></flag>
+		<flag name="usbredir">Use <pkg>sys-apps/usbredir</pkg> to redirect USB devices to another machine over TCP</flag>
+		<flag name="vde">Enable VDE-based networking</flag>
+		<flag name="vhost-net">Enable accelerated networking using vhost-net, see http://www.linux-kvm.org/page/VhostNet</flag>
+		<flag name="vhost-user-fs">Enable shared file system access using the FUSE protocol carried over virtio.</flag>
+		<flag name="virgl">Enable experimental Virgil 3d (virtual software GPU)</flag>
+		<flag name="virtfs">Enable VirtFS via virtio-9p-pci / fsdev. See http://wiki.qemu.org/Documentation/9psetup</flag>
+		<flag name="vte">Enable terminal support (<pkg>x11-libs/vte</pkg>) in the GTK+ interface</flag>
+		<flag name="xattr">Add support for getting and setting POSIX extended attributes, through
+		<pkg>sys-apps/attr</pkg>. Requisite for the virtfs backend.
+	</flag>
+		<flag name="xen">Enables support for Xen backends</flag>
+		<flag name="xfs">Support xfsctl() notification and syncing for XFS backed
+		virtual disks.</flag>
+		<flag name="xkb">Depend on x11-libs/libxkbcommon to build qemu-keymap tool for converting xkb keymaps</flag>
+	</use>
+</pkgmetadata>
diff --git a/app-emulation/qemu/qemu-9999.ebuild b/app-emulation/qemu/qemu-9999.ebuild
new file mode 100644
index 0000000..d638127
--- /dev/null
+++ b/app-emulation/qemu/qemu-9999.ebuild
@@ -0,0 +1,841 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_PROJECT="chromiumos/third_party/qemu"
+CROS_WORKON_BLACKLIST="1"
+
+PYTHON_COMPAT=( python{3_6,3_7,3_8} )
+PYTHON_REQ_USE="ncurses,readline"
+
+PLOCALES="bg de_DE fr_FR hu it tr zh_CN"
+
+FIRMWARE_ABI_VERSION="4.0.0-r50"
+
+inherit cros-workon eutils linux-info toolchain-funcs multilib python-r1 \
+	udev fcaps readme.gentoo-r1 pax-utils l10n xdg-utils flag-o-matic
+
+DESCRIPTION="QEMU + Kernel-based Virtual Machine userland tools"
+HOMEPAGE="http://www.qemu.org http://www.linux-kvm.org"
+SLIRP_REV="2faae0f778f818fadc873308f983289df697eb93"
+TESTFLOAT_REV="5a59dcec19327396a011a17fd924aed4fec416b3"
+KEYCODEMAPDB_REV="6b3d716e2b6472eb7189d3220552280ef3d832ce"
+
+SRC_URI="https://gitlab.freedesktop.org/slirp/libslirp/repository/archive.tar.gz?ref=${SLIRP_REV} -> ${PN}-20200729-slirp.tar.gz
+https://github.com/cota/berkeley-testfloat-3/archive/${TESTFLOAT_REV}.tar.gz -> ${PN}-20200729-berkeley-testfloat-3.tar.gz
+https://github.com/qemu/keycodemapdb/archive/${KEYCODEMAPDB_REV}.tar.gz -> ${PN}-20200718-keycodemapdb.tar.gz"
+
+LICENSE="GPL-2 LGPL-2 BSD-2"
+SLOT="0"
+KEYWORDS="~*"
+
+IUSE="accessibility +aio alsa bzip2 capstone +caps +curl debug doc
+	+fdt glusterfs gnutls gtk infiniband iscsi io-uring
+	jemalloc +jpeg kernel_linux
+	kernel_FreeBSD lzo ncurses nfs nls numa opengl +oss +pin-upstream-blobs
+	plugins +png pulseaudio python rbd sasl +seccomp sdl sdl-image selinux
+	smartcard snappy spice ssh static static-user systemtap tci test usb
+	usbredir vde +vhost-net vhost-user-fs virgl virtfs +vnc vte xattr xen
+	xfs +xkb zstd"
+
+COMMON_TARGETS="aarch64 alpha arm cris hppa i386 m68k microblaze microblazeel
+	mips mips64 mips64el mipsel nios2 or1k ppc ppc64 riscv32 riscv64 s390x
+	sh4 sh4eb sparc sparc64 x86_64 xtensa xtensaeb"
+IUSE_SOFTMMU_TARGETS="${COMMON_TARGETS}
+	lm32 moxie rx tricore unicore32"
+IUSE_USER_TARGETS="${COMMON_TARGETS}
+	aarch64_be armeb mipsn32 mipsn32el ppc64abi32 ppc64le sparc32plus
+	tilegx"
+
+use_softmmu_targets=$(printf ' qemu_softmmu_targets_%s' ${IUSE_SOFTMMU_TARGETS})
+use_user_targets=$(printf ' qemu_user_targets_%s' ${IUSE_USER_TARGETS})
+IUSE+=" ${use_softmmu_targets} ${use_user_targets}"
+
+RESTRICT="!test? ( test )"
+# Allow no targets to be built so that people can get a tools-only build.
+# Block USE flag configurations known to not work.
+REQUIRED_USE="${PYTHON_REQUIRED_USE}
+	qemu_softmmu_targets_arm? ( fdt )
+	qemu_softmmu_targets_microblaze? ( fdt )
+	qemu_softmmu_targets_mips64el? ( fdt )
+	qemu_softmmu_targets_ppc64? ( fdt )
+	qemu_softmmu_targets_ppc? ( fdt )
+	qemu_softmmu_targets_riscv32? ( fdt )
+	qemu_softmmu_targets_riscv64? ( fdt )
+	static? ( static-user !alsa !gtk !opengl !pulseaudio !plugins !rbd !snappy )
+	static-user? ( !plugins )
+	virtfs? ( xattr )
+	vte? ( gtk )
+	plugins? ( !static !static-user )
+"
+
+# Dependencies required for qemu tools (qemu-nbd, qemu-img, qemu-io, ...)
+# and user/softmmu targets (qemu-*, qemu-system-*).
+#
+# Yep, you need both libcap and libcap-ng since virtfs only uses libcap.
+#
+# The attr lib isn't always linked in (although the USE flag is always
+# respected).  This is because qemu supports using the C library's API
+# when available rather than always using the external library.
+ALL_DEPEND="
+	>=dev-libs/glib-2.0[static-libs(+)]
+	sys-libs/zlib[static-libs(+)]
+	python? ( ${PYTHON_DEPS} )
+	systemtap? ( dev-util/systemtap )
+	xattr? ( sys-apps/attr[static-libs(+)] )"
+
+# Dependencies required for qemu tools (qemu-nbd, qemu-img, qemu-io, ...)
+# softmmu targets (qemu-system-*).
+SOFTMMU_TOOLS_DEPEND="
+	dev-libs/libxml2[static-libs(+)]
+	xkb? ( x11-libs/libxkbcommon[static-libs(+)] )
+	>=x11-libs/pixman-0.28.0[static-libs(+)]
+	accessibility? (
+		app-accessibility/brltty[api]
+		app-accessibility/brltty[static-libs(+)]
+	)
+	aio? ( dev-libs/libaio[static-libs(+)] )
+	alsa? ( >=media-libs/alsa-lib-1.0.13 )
+	bzip2? ( app-arch/bzip2[static-libs(+)] )
+	capstone? ( dev-libs/capstone:= )
+	caps? ( sys-libs/libcap-ng[static-libs(+)] )
+	curl? ( >=net-misc/curl-7.15.4[static-libs(+)] )
+	fdt? ( >=sys-apps/dtc-1.5.0[static-libs(+)] )
+	glusterfs? ( >=sys-cluster/glusterfs-3.4.0[static-libs(+)] )
+	gnutls? (
+		dev-libs/nettle:=[static-libs(+)]
+		>=net-libs/gnutls-3.0:=[static-libs(+)]
+	)
+	gtk? (
+		x11-libs/gtk+:3
+		vte? ( x11-libs/vte:2.91 )
+	)
+	infiniband? (
+		sys-fabric/libibumad:=[static-libs(+)]
+		sys-fabric/libibverbs:=[static-libs(+)]
+		sys-fabric/librdmacm:=[static-libs(+)]
+	)
+	iscsi? ( net-libs/libiscsi )
+	io-uring? ( sys-libs/liburing[static-libs(+)] )
+	jemalloc? ( dev-libs/jemalloc )
+	jpeg? ( virtual/jpeg:0=[static-libs(+)] )
+	lzo? ( dev-libs/lzo:2[static-libs(+)] )
+	ncurses? (
+		sys-libs/ncurses:0=[unicode]
+		sys-libs/ncurses:0=[static-libs(+)]
+	)
+	nfs? ( >=net-fs/libnfs-1.9.3:=[static-libs(+)] )
+	numa? ( sys-process/numactl[static-libs(+)] )
+	opengl? (
+		virtual/opengl
+		media-libs/libepoxy[static-libs(+)]
+		media-libs/mesa[static-libs(+)]
+		media-libs/mesa[egl,gbm]
+	)
+	png? ( media-libs/libpng:0=[static-libs(+)] )
+	pulseaudio? ( media-sound/pulseaudio )
+	rbd? ( sys-cluster/ceph )
+	sasl? ( dev-libs/cyrus-sasl[static-libs(+)] )
+	sdl? (
+		media-libs/libsdl2[video]
+		media-libs/libsdl2[static-libs(+)]
+	)
+	sdl-image? ( media-libs/sdl2-image[static-libs(+)] )
+	seccomp? ( >=sys-libs/libseccomp-2.1.0[static-libs(+)] )
+	smartcard? ( >=app-emulation/libcacard-2.5.0[static-libs(+)] )
+	snappy? ( app-arch/snappy:= )
+	spice? (
+		>=app-emulation/spice-protocol-0.12.3
+		>=app-emulation/spice-0.12.0[static-libs(+)]
+	)
+	ssh? ( >=net-libs/libssh-0.8.6[static-libs(+)] )
+	usb? ( >=virtual/libusb-1-r2[static-libs(+)] )
+	usbredir? ( >=sys-apps/usbredir-0.6[static-libs(+)] )
+	vde? ( net-misc/vde[static-libs(+)] )
+	virgl? ( media-libs/virglrenderer[static-libs(+)] )
+	virtfs? ( sys-libs/libcap )
+	xen? ( app-emulation/xen-tools:= )
+	xfs? ( sys-fs/xfsprogs[static-libs(+)] )
+	zstd? ( >=app-arch/zstd-1.4.0[static-libs(+)] )
+"
+
+# NOTE: ~sys-firmware/edk2-ovmf-201905[binary] and
+# ~sys-firmware/seabios-1.12.0[binary,seavgabios] were in the
+# pin-upstream-blobs list but I took them out because of lack of ebuild
+# TODO: uprev seabios to 1.12 instead of hacking it to use 1.11 here below
+X86_FIRMWARE_DEPEND="
+	pin-upstream-blobs? (
+		~sys-firmware/ipxe-1.0.0_p20190728[binary]
+		~sys-firmware/seabios-1.11.0[binary,seavgabios]
+		~sys-firmware/sgabios-0.1_pre8[binary]
+	)
+	!pin-upstream-blobs? (
+		sys-firmware/edk2-ovmf
+		sys-firmware/ipxe
+		>=sys-firmware/seabios-1.10.2[seavgabios]
+		sys-firmware/sgabios
+	)"
+PPC64_FIRMWARE_DEPEND="
+	pin-upstream-blobs? (
+		~sys-firmware/seabios-1.12.0[binary,seavgabios]
+	)
+	!pin-upstream-blobs? (
+		>=sys-firmware/seabios-1.10.2[seavgabios]
+	)
+"
+
+BDEPEND="
+	$(python_gen_impl_dep)
+	dev-lang/perl
+	sys-apps/texinfo
+	virtual/pkgconfig
+	doc? ( dev-python/sphinx )
+	gtk? ( nls? ( sys-devel/gettext ) )
+	test? (
+		dev-libs/glib[utils]
+		sys-devel/bc
+	)
+"
+CDEPEND="
+	!static? (
+		${ALL_DEPEND//\[static-libs(+)]}
+		${SOFTMMU_TOOLS_DEPEND//\[static-libs(+)]}
+	)
+	qemu_softmmu_targets_i386? ( ${X86_FIRMWARE_DEPEND} )
+	qemu_softmmu_targets_x86_64? ( ${X86_FIRMWARE_DEPEND} )
+	qemu_softmmu_targets_ppc64? ( ${PPC64_FIRMWARE_DEPEND} )
+"
+DEPEND="${CDEPEND}
+	kernel_linux? ( >=sys-kernel/linux-headers-2.6.35 )
+	static? (
+		${ALL_DEPEND}
+		${SOFTMMU_TOOLS_DEPEND}
+	)
+	static-user? ( ${ALL_DEPEND} )"
+RDEPEND="${CDEPEND}
+	acct-group/kvm
+	selinux? ( sec-policy/selinux-qemu )"
+
+QA_PREBUILT="
+	usr/share/qemu/hppa-firmware.img
+	usr/share/qemu/openbios-ppc
+	usr/share/qemu/openbios-sparc64
+	usr/share/qemu/openbios-sparc32
+	usr/share/qemu/palcode-clipper
+	usr/share/qemu/s390-ccw.img
+	usr/share/qemu/s390-netboot.img
+	usr/share/qemu/u-boot.e500"
+
+QA_WX_LOAD="usr/bin/qemu-i386
+	usr/bin/qemu-x86_64
+	usr/bin/qemu-alpha
+	usr/bin/qemu-arm
+	usr/bin/qemu-cris
+	usr/bin/qemu-m68k
+	usr/bin/qemu-microblaze
+	usr/bin/qemu-microblazeel
+	usr/bin/qemu-mips
+	usr/bin/qemu-mipsel
+	usr/bin/qemu-or1k
+	usr/bin/qemu-ppc
+	usr/bin/qemu-ppc64
+	usr/bin/qemu-ppc64abi32
+	usr/bin/qemu-sh4
+	usr/bin/qemu-sh4eb
+	usr/bin/qemu-sparc
+	usr/bin/qemu-sparc64
+	usr/bin/qemu-armeb
+	usr/bin/qemu-sparc32plus
+	usr/bin/qemu-s390x
+	usr/bin/qemu-unicore32"
+
+DOC_CONTENTS="If you don't have kvm compiled into the kernel, make sure you have the
+kernel module loaded before running kvm. The easiest way to ensure that the
+kernel module is loaded is to load it on boot.
+	For AMD CPUs the module is called 'kvm-amd'.
+	For Intel CPUs the module is called 'kvm-intel'.
+Please review /etc/conf.d/modules for how to load these.
+
+Make sure your user is in the 'kvm' group. Just run
+	$ gpasswd -a <USER> kvm
+then have <USER> re-login.
+
+For brand new installs, the default permissions on /dev/kvm might not let
+you access it.  You can tell udev to reset ownership/perms:
+	$ udevadm trigger -c add /dev/kvm
+
+If you want to register binfmt handlers for qemu user targets:
+For openrc:
+	# rc-update add qemu-binfmt
+For systemd:
+	# ln -s /usr/share/qemu/binfmt.d/qemu.conf /etc/binfmt.d/qemu.conf"
+
+pkg_pretend() {
+	if use kernel_linux && kernel_is lt 2 6 25; then
+		eerror "This version of KVM requres a host kernel of 2.6.25 or higher."
+	elif use kernel_linux; then
+		if ! linux_config_exists; then
+			eerror "Unable to check your kernel for KVM support"
+		else
+			CONFIG_CHECK="~KVM ~TUN ~BRIDGE"
+			ERROR_KVM="You must enable KVM in your kernel to continue"
+			ERROR_KVM_AMD="If you have an AMD CPU, you must enable KVM_AMD in"
+			ERROR_KVM_AMD+=" your kernel configuration."
+			ERROR_KVM_INTEL="If you have an Intel CPU, you must enable"
+			ERROR_KVM_INTEL+=" KVM_INTEL in your kernel configuration."
+			ERROR_TUN="You will need the Universal TUN/TAP driver compiled"
+			ERROR_TUN+=" into your kernel or loaded as a module to use the"
+			ERROR_TUN+=" virtual network device if using -net tap."
+			ERROR_BRIDGE="You will also need support for 802.1d"
+			ERROR_BRIDGE+=" Ethernet Bridging for some network configurations."
+			use vhost-net && CONFIG_CHECK+=" ~VHOST_NET"
+			ERROR_VHOST_NET="You must enable VHOST_NET to have vhost-net"
+			ERROR_VHOST_NET+=" support"
+
+			if use amd64 || use x86 || use amd64-linux || use x86-linux; then
+				if grep -q AuthenticAMD /proc/cpuinfo; then
+					CONFIG_CHECK+=" ~KVM_AMD"
+				elif grep -q GenuineIntel /proc/cpuinfo; then
+					CONFIG_CHECK+=" ~KVM_INTEL"
+				fi
+			fi
+
+			use python && CONFIG_CHECK+=" ~DEBUG_FS"
+			ERROR_DEBUG_FS="debugFS support required for kvm_stat"
+
+			# Now do the actual checks setup above
+			check_extra_config
+		fi
+	fi
+
+	if grep -qs '/usr/bin/qemu-kvm' "${EROOT}"/etc/libvirt/qemu/*.xml; then
+		eerror "The kvm/qemu-kvm wrappers no longer exist, but your libvirt"
+		eerror "instances are still pointing to it.  Please update your"
+		eerror "configs in /etc/libvirt/qemu/ to use the -enable-kvm flag"
+		eerror "and the right system binary (e.g. qemu-system-x86_64)."
+		die "update your virt configs to not use qemu-kvm"
+	fi
+}
+
+# Sanity check to make sure target lists are kept up-to-date.
+check_targets() {
+	local var=$1 mak=$2
+	local detected sorted
+
+	pushd "${S}"/default-configs >/dev/null || die
+
+	# Force C locale until glibc is updated. #564936
+	detected=$(echo $(printf '%s\n' *-${mak}.mak | sed "s:-${mak}.mak::" | LC_COLLATE=C sort -u))
+	sorted=$(echo $(printf '%s\n' ${!var} | LC_COLLATE=C sort -u))
+	if [[ ${sorted} != "${detected}" ]] ; then
+		eerror "The ebuild needs to be kept in sync."
+		eerror "${var}: ${sorted}"
+		eerror "$(printf '%-*s' ${#var} configure): ${detected}"
+		die "sync ${var} to the list of targets"
+	fi
+
+	popd >/dev/null
+}
+
+handle_locales() {
+	# Make sure locale list is kept up-to-date.
+	local detected sorted
+	detected=$(echo $(cd po && printf '%s\n' *.po | grep -v messages.po | sed 's:.po$::' | sort -u))
+	sorted=$(echo $(printf '%s\n' ${PLOCALES} | sort -u))
+	if [[ ${sorted} != "${detected}" ]] ; then
+		eerror "The ebuild needs to be kept in sync."
+		eerror "PLOCALES: ${sorted}"
+		eerror " po/*.po: ${detected}"
+		die "sync PLOCALES"
+	fi
+
+	# Deal with selective install of locales.
+	if use nls ; then
+		# Delete locales the user does not want. #577814
+		rm_loc() { rm po/$1.po || die; }
+		l10n_for_each_disabled_locale_do rm_loc
+	else
+		# Cheap hack to disable gettext .mo generation.
+		rm -f po/*.po
+	fi
+}
+
+src_unpack() {
+	mkdir -p "${S}" "${S}"/tests/fp "${S}"/ui || die
+
+	default
+
+	mv "libslirp-${SLIRP_REV}-${SLIRP_REV}" "${S}"/slirp || die
+	mv "berkeley-testfloat-3-${TESTFLOAT_REV}" "${S}"/tests/fp/berkeley-testfloat-3 || die
+	mv "keycodemapdb-${KEYCODEMAPDB_REV}" "${S}"/ui/keycodemapdb || die
+
+	cros-workon_src_unpack
+}
+
+src_prepare() {
+	check_targets IUSE_SOFTMMU_TARGETS softmmu
+	check_targets IUSE_USER_TARGETS linux-user
+
+	default
+
+	# Use correct toolchain to fix cross-compiling
+	tc-export AR AS LD NM OBJCOPY PKG_CONFIG RANLIB
+	export WINDRES=${CHOST}-windres
+
+	# Verbose builds
+	MAKEOPTS+=" V=1"
+
+	# Run after we've applied all patches.
+	handle_locales
+
+	# Remove bundled copy of libfdt
+	rm -r dtc || die
+}
+
+##
+# configures qemu based on the build directory and the build type
+# we are using.
+#
+qemu_src_configure() {
+	debug-print-function ${FUNCNAME} "$@"
+
+	local buildtype=$1
+	local builddir="${S}/${buildtype}-build"
+
+	mkdir "${builddir}"
+
+	local conf_opts=(
+		--prefix=/usr
+		--sysconfdir=/etc
+		--bindir=/usr/bin
+		--libdir=/usr/$(get_libdir)
+		--datadir=/usr/share
+		--docdir=/usr/share/doc/${PF}/html
+		--mandir=/usr/share/man
+		--with-confsuffix=/qemu
+		--localstatedir=/var
+		--disable-bsd-user
+		--disable-guest-agent
+		--disable-strip
+		--disable-werror
+		# We support gnutls/nettle for crypto operations.  It is possible
+		# to use gcrypt when gnutls/nettle are disabled (but not when they
+		# are enabled), but it's not really worth the hassle.  Disable it
+		# all the time to avoid automatically detecting it. #568856
+		--disable-gcrypt
+		--python="${PYTHON}"
+		--cc="$(tc-getCC)"
+		--cxx="$(tc-getCXX)"
+		--host-cc="$(tc-getBUILD_CC)"
+		$(use_enable debug debug-info)
+		$(use_enable debug debug-tcg)
+		$(use_enable doc docs)
+		$(use_enable plugins)
+		$(use_enable tci tcg-interpreter)
+		$(use_enable xattr attr)
+	)
+
+	# Disable options not used by user targets. This simplifies building
+	# static user targets (USE=static-user) considerably.
+	conf_notuser() {
+		if [[ ${buildtype} == "user" ]] ; then
+			echo "--disable-${2:-$1}"
+		else
+			use_enable "$@"
+		fi
+	}
+	conf_opts+=(
+		$(conf_notuser accessibility brlapi)
+		$(conf_notuser aio linux-aio)
+		$(conf_notuser bzip2)
+		$(conf_notuser capstone)
+		$(conf_notuser caps cap-ng)
+		$(conf_notuser curl)
+		$(conf_notuser fdt)
+		$(conf_notuser glusterfs)
+		$(conf_notuser gnutls)
+		$(conf_notuser gnutls nettle)
+		$(conf_notuser gtk)
+		$(conf_notuser infiniband rdma)
+		$(conf_notuser iscsi libiscsi)
+		$(conf_notuser io-uring linux-io-uring)
+		$(conf_notuser jemalloc jemalloc)
+		$(conf_notuser jpeg vnc-jpeg)
+		$(conf_notuser kernel_linux kvm)
+		$(conf_notuser lzo)
+		$(conf_notuser ncurses curses)
+		$(conf_notuser nfs libnfs)
+		$(conf_notuser numa)
+		$(conf_notuser opengl)
+		$(conf_notuser png vnc-png)
+		$(conf_notuser rbd)
+		$(conf_notuser sasl vnc-sasl)
+		$(conf_notuser sdl)
+		$(conf_notuser sdl-image)
+		$(conf_notuser seccomp)
+		$(conf_notuser smartcard)
+		$(conf_notuser snappy)
+		$(conf_notuser spice)
+		$(conf_notuser ssh libssh)
+		$(conf_notuser usb libusb)
+		$(conf_notuser usbredir usb-redir)
+		$(conf_notuser vde)
+		$(conf_notuser vhost-net)
+		$(conf_notuser vhost-user-fs)
+		$(conf_notuser virgl virglrenderer)
+		$(conf_notuser virtfs)
+		$(conf_notuser vnc)
+		$(conf_notuser vte)
+		$(conf_notuser xen)
+		$(conf_notuser xen xen-pci-passthrough)
+		$(conf_notuser xfs xfsctl)
+		$(conf_notuser xkb xkbcommon)
+		$(conf_notuser zstd)
+	)
+
+	if [[ ${buildtype} == "user" ]] ; then
+		conf_opts+=( --disable-libxml2 )
+	else
+		conf_opts+=( --enable-libxml2 )
+	fi
+
+	if [[ ! ${buildtype} == "user" ]] ; then
+		# audio options
+		local audio_opts=(
+			# Note: backend order matters here: #716202
+			# We iterate from higher-level to lower level.
+			$(usex pulseaudio pa "")
+			$(usev sdl)
+			$(usev alsa)
+			$(usev oss)
+		)
+		conf_opts+=(
+			--audio-drv-list=$(printf "%s," "${audio_opts[@]}")
+		)
+	fi
+
+	case ${buildtype} in
+	user)
+		conf_opts+=(
+			--enable-linux-user
+			--disable-system
+			--disable-blobs
+			--disable-tools
+		)
+		local static_flag="static-user"
+		;;
+	softmmu)
+		conf_opts+=(
+			--disable-linux-user
+			--enable-system
+			--disable-tools
+		)
+		local static_flag="static"
+		;;
+	tools)
+		conf_opts+=(
+			--disable-linux-user
+			--disable-system
+			--disable-blobs
+			--enable-tools
+		)
+		local static_flag="static"
+		;;
+	esac
+
+	local targets="${buildtype}_targets"
+	[[ -n ${targets} ]] && conf_opts+=( --target-list="${!targets}" )
+
+	# Add support for SystemTAP
+	use systemtap && conf_opts+=( --enable-trace-backend=dtrace )
+
+	# We always want to attempt to build with PIE support as it results
+	# in a more secure binary. But it doesn't work with static or if
+	# the current GCC doesn't have PIE support.
+	if use ${static_flag}; then
+		conf_opts+=( --static --disable-pie )
+	else
+		tc-enables-pie && conf_opts+=( --enable-pie )
+	fi
+
+	echo "../configure ${conf_opts[*]}"
+	cd "${builddir}"
+	../configure "${conf_opts[@]}" || die "configure failed"
+
+	# FreeBSD's kernel does not support QEMU assigning/grabbing
+	# host USB devices yet
+	use kernel_FreeBSD && \
+		sed -i -E -e "s|^(HOST_USB=)bsd|\1stub|" "${S}"/config-host.mak
+}
+
+src_configure() {
+	local target
+
+	python_setup
+
+	softmmu_targets= softmmu_bins=()
+	user_targets= user_bins=()
+
+	for target in ${IUSE_SOFTMMU_TARGETS} ; do
+		if use "qemu_softmmu_targets_${target}"; then
+			softmmu_targets+=",${target}-softmmu"
+			softmmu_bins+=( "qemu-system-${target}" )
+		fi
+	done
+
+	for target in ${IUSE_USER_TARGETS} ; do
+		if use "qemu_user_targets_${target}"; then
+			user_targets+=",${target}-linux-user"
+			user_bins+=( "qemu-${target}" )
+		fi
+	done
+
+	softmmu_targets=${softmmu_targets#,}
+	user_targets=${user_targets#,}
+
+	[[ -n ${softmmu_targets} ]] && qemu_src_configure "softmmu"
+	[[ -n ${user_targets}    ]] && qemu_src_configure "user"
+	qemu_src_configure "tools"
+}
+
+src_compile() {
+	if [[ -n ${user_targets} ]]; then
+		cd "${S}/user-build"
+		default
+	fi
+
+	if [[ -n ${softmmu_targets} ]]; then
+		cd "${S}/softmmu-build"
+		default
+	fi
+
+	cd "${S}/tools-build"
+	default
+}
+
+src_test() {
+	if [[ -n ${softmmu_targets} ]]; then
+		cd "${S}/softmmu-build"
+		pax-mark m */qemu-system-* #515550
+		emake check
+	fi
+}
+
+qemu_python_install() {
+	python_domodule "${S}/python/qemu"
+
+	python_doscript "${S}/scripts/kvm/vmxcap"
+	python_doscript "${S}/scripts/qmp/qmp-shell"
+	python_doscript "${S}/scripts/qmp/qemu-ga-client"
+}
+
+# Generate binfmt support files.
+#   - /etc/init.d/qemu-binfmt script which registers the user handlers (openrc)
+#   - /usr/share/qemu/binfmt.d/qemu.conf (for use with systemd-binfmt)
+generate_initd() {
+	local out="${T}/qemu-binfmt"
+	local out_systemd="${T}/qemu.conf"
+	local d="${T}/binfmt.d"
+
+	einfo "Generating qemu binfmt scripts and configuration files"
+
+	# Generate the debian fragments first.
+	mkdir -p "${d}"
+	"${S}"/scripts/qemu-binfmt-conf.sh \
+		--debian \
+		--exportdir "${d}" \
+		--qemu-path "${EPREFIX}/usr/bin" \
+		|| die
+	# Then turn the fragments into a shell script we can source.
+	sed -E -i \
+		-e 's:^([^ ]+) (.*)$:\1="\2":' \
+		"${d}"/* || die
+
+	# Generate the init.d script by assembling the fragments from above.
+	local f qcpu package interpreter magic mask
+	cat "${FILESDIR}"/qemu-binfmt.initd.head >"${out}" || die
+	for f in "${d}"/qemu-* ; do
+		source "${f}"
+
+		# Normalize the cpu logic like we do in the init.d for the native cpu.
+		qcpu=${package#qemu-}
+		case ${qcpu} in
+		arm*)   qcpu="arm";;
+		mips*)  qcpu="mips";;
+		ppc*)   qcpu="ppc";;
+		s390*)  qcpu="s390";;
+		sh*)    qcpu="sh";;
+		sparc*) qcpu="sparc";;
+		esac
+
+		# we use 'printf' here to be portable across 'sh'
+		# implementations: #679168
+		cat <<EOF >>"${out}"
+	if [ "\${cpu}" != "${qcpu}" -a -x "${interpreter}" ] ; then
+		printf '%s\n' ':${package}:M::${magic}:${mask}:${interpreter}:'"\${QEMU_BINFMT_FLAGS}" >/proc/sys/fs/binfmt_misc/register
+	fi
+EOF
+
+		echo ":${package}:M::${magic}:${mask}:${interpreter}:OC" >>"${out_systemd}"
+
+	done
+	cat "${FILESDIR}"/qemu-binfmt.initd.tail >>"${out}" || die
+}
+
+src_install() {
+	if [[ -n ${user_targets} ]]; then
+		cd "${S}/user-build"
+		emake DESTDIR="${ED}" install
+
+		# Install binfmt handler init script for user targets.
+		generate_initd
+		doinitd "${T}/qemu-binfmt"
+
+		# Install binfmt/qemu.conf.
+		insinto "/usr/share/qemu/binfmt.d"
+		doins "${T}/qemu.conf"
+	fi
+
+	if [[ -n ${softmmu_targets} ]]; then
+		cd "${S}/softmmu-build"
+		emake DESTDIR="${ED}" install
+
+		# This might not exist if the test failed. #512010
+		[[ -e check-report.html ]] && dodoc check-report.html
+
+		if use kernel_linux; then
+			udev_newrules "${FILESDIR}"/65-kvm.rules-r1 65-kvm.rules
+		fi
+
+		if use python; then
+			python_foreach_impl qemu_python_install
+		fi
+	fi
+
+	cd "${S}/tools-build"
+	emake DESTDIR="${ED}" install
+
+	# Disable mprotect on the qemu binaries as they use JITs to be fast #459348
+	pushd "${ED}"/usr/bin >/dev/null
+	pax-mark mr "${softmmu_bins[@]}" "${user_bins[@]}" # bug 575594
+	popd >/dev/null
+
+	# Install config file example for qemu-bridge-helper
+	insinto "/etc/qemu"
+	doins "${FILESDIR}/bridge.conf"
+
+	cd "${S}"
+	dodoc Changelog MAINTAINERS docs/specs/pci-ids.txt
+	newdoc pc-bios/README README.pc-bios
+
+	# Disallow stripping of prebuilt firmware files.
+	dostrip -x ${QA_PREBUILT}
+
+	if [[ -n ${softmmu_targets} ]]; then
+		# Remove SeaBIOS since we're using the SeaBIOS packaged one
+		rm "${ED}/usr/share/qemu/bios.bin"
+		rm "${ED}/usr/share/qemu/bios-256k.bin"
+		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
+			dosym ../seabios/bios.bin /usr/share/qemu/bios.bin
+			dosym ../seabios/bios-256k.bin /usr/share/qemu/bios-256k.bin
+		fi
+
+		# Remove vgabios since we're using the seavgabios packaged one
+		rm "${ED}/usr/share/qemu/vgabios.bin"
+		rm "${ED}/usr/share/qemu/vgabios-cirrus.bin"
+		rm "${ED}/usr/share/qemu/vgabios-qxl.bin"
+		rm "${ED}/usr/share/qemu/vgabios-stdvga.bin"
+		rm "${ED}/usr/share/qemu/vgabios-virtio.bin"
+		rm "${ED}/usr/share/qemu/vgabios-vmware.bin"
+		# PPC64 loads vgabios-stdvga
+		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386 || use qemu_softmmu_targets_ppc64; then
+			dosym ../seavgabios/vgabios-isavga.bin /usr/share/qemu/vgabios.bin
+			dosym ../seavgabios/vgabios-cirrus.bin /usr/share/qemu/vgabios-cirrus.bin
+			dosym ../seavgabios/vgabios-qxl.bin /usr/share/qemu/vgabios-qxl.bin
+			dosym ../seavgabios/vgabios-stdvga.bin /usr/share/qemu/vgabios-stdvga.bin
+			dosym ../seavgabios/vgabios-virtio.bin /usr/share/qemu/vgabios-virtio.bin
+			dosym ../seavgabios/vgabios-vmware.bin /usr/share/qemu/vgabios-vmware.bin
+		fi
+
+		# Remove sgabios since we're using the sgabios packaged one
+		rm "${ED}/usr/share/qemu/sgabios.bin"
+		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
+			dosym ../sgabios/sgabios.bin /usr/share/qemu/sgabios.bin
+		fi
+
+		# Remove iPXE since we're using the iPXE packaged one
+		rm "${ED}"/usr/share/qemu/pxe-*.rom
+		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
+			dosym ../ipxe/8086100e.rom /usr/share/qemu/pxe-e1000.rom
+			dosym ../ipxe/80861209.rom /usr/share/qemu/pxe-eepro100.rom
+			dosym ../ipxe/10500940.rom /usr/share/qemu/pxe-ne2k_pci.rom
+			dosym ../ipxe/10222000.rom /usr/share/qemu/pxe-pcnet.rom
+			dosym ../ipxe/10ec8139.rom /usr/share/qemu/pxe-rtl8139.rom
+			dosym ../ipxe/1af41000.rom /usr/share/qemu/pxe-virtio.rom
+		fi
+	fi
+
+	DISABLE_AUTOFORMATTING=true
+	readme.gentoo_create_doc
+}
+
+firmware_abi_change() {
+	local pv
+	for pv in ${REPLACING_VERSIONS}; do
+		if ver_test $pv -lt ${FIRMWARE_ABI_VERSION}; then
+			return 0
+		fi
+	done
+	return 1
+}
+
+pkg_postinst() {
+	if [[ -n ${softmmu_targets} ]] && use kernel_linux; then
+		udev_reload
+	fi
+
+	xdg_icon_cache_update
+
+	[[ -z ${EPREFIX} ]] && [[ -f ${EROOT}/usr/libexec/qemu-bridge-helper ]] && \
+		fcaps cap_net_admin ${EROOT}/usr/libexec/qemu-bridge-helper
+
+	DISABLE_AUTOFORMATTING=true
+	readme.gentoo_print_elog
+
+	if use pin-upstream-blobs && firmware_abi_change; then
+		ewarn "This version of qemu pins new versions of firmware blobs:"
+		ewarn "	$(best_version sys-firmware/edk2-ovmf)"
+		ewarn "	$(best_version sys-firmware/ipxe)"
+		ewarn "	$(best_version sys-firmware/seabios)"
+		ewarn "	$(best_version sys-firmware/sgabios)"
+		ewarn "This might break resume of hibernated guests (started with a different"
+		ewarn "firmware version) and live migration to/from qemu versions with different"
+		ewarn "firmware. Please (cold) restart all running guests. For functional"
+		ewarn "guest migration ensure that all"
+		ewarn "hosts run at least"
+		ewarn "	app-emulation/qemu-${FIRMWARE_ABI_VERSION}."
+	fi
+}
+
+pkg_info() {
+	echo "Using:"
+	echo "  $(best_version app-emulation/spice-protocol)"
+	echo "  $(best_version sys-firmware/edk2-ovmf)"
+	if has_version 'sys-firmware/edk2-ovmf[binary]'; then
+		echo "    USE=binary"
+	else
+		echo "    USE=''"
+	fi
+	echo "  $(best_version sys-firmware/ipxe)"
+	echo "  $(best_version sys-firmware/seabios)"
+	if has_version 'sys-firmware/seabios[binary]'; then
+		echo "    USE=binary"
+	else
+		echo "    USE=''"
+	fi
+	echo "  $(best_version sys-firmware/sgabios)"
+}
+
+pkg_postrm() {
+	xdg_icon_cache_update
+}
diff --git a/app-misc/evtest/Manifest b/app-misc/evtest/Manifest
index c7f2514..67c61c1 100644
--- a/app-misc/evtest/Manifest
+++ b/app-misc/evtest/Manifest
@@ -1,2 +1 @@
-DIST evtest-1.31-mans.tar.gz 1661 SHA256 38a96a8a6c6790353678aaf90336b2b0efe7b13bf2552a705336d07df05a866b SHA512 b3cd5cc8aaf6620a3243318ae42e807a8819a25082606707787ab8b1ac75f1f6dfc8b544d38a74b489d348981489153c33841ba0b0466ace3e3a83b031754321 WHIRLPOOL aa2490d4c69725d9adfc89a49942728aacf02941c0a85d9f99deb6aefd2a4e6b5a69ec5b1541b9883f2218a18151a617cb02418bd36ad3f25be209efcdeb74a6
-DIST evtest-1.31.tar.gz 17968 SHA256 c95a688ff2f116dbbb42bbe7f30175624d78895e35ad6daf4960abd0b7f92e3b SHA512 1657d880c531c6c8407bf7a66ab159a5992c9ab70b840e600e91ad3a7429a07ec2c2f3bca6848614ebbad01a4a5993e43e4388705455f9d31f8b60b06c04a7c4 WHIRLPOOL 97b6299cbdae15596c3ebf29f9a7ff3b68e58cfd3d25c7f066f2387ac08ea112cdf5a3e5e68406f15e849531dc7ff2b9f06b730bf8a9c1f4d39c7e96f64c7b4c
+DIST evtest-1.34.tar.gz 19954 BLAKE2B 17ca600e89070d65f2bb95b468b921278ab63e50aa6042a974e8d4ac214b51355423c910bb0911e16a6bfc27e9fce59159719aae7d280679e7b292d02a2ee955 SHA512 5b4a18f13b86b1e2f5f723f6abb18c0a50d7f96b4412f46f503895c7ea8701a67a3237701de367c6b789533d8de887baa8f8f8e7e2fc4611235408ae21021b38
diff --git a/app-misc/evtest/evtest-1.31-r4.ebuild b/app-misc/evtest/evtest-1.31-r4.ebuild
deleted file mode 120000
index f5a99b5..0000000
--- a/app-misc/evtest/evtest-1.31-r4.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-evtest-1.31.ebuild
\ No newline at end of file
diff --git a/app-misc/evtest/evtest-1.31.ebuild b/app-misc/evtest/evtest-1.31.ebuild
deleted file mode 100644
index 3af6c01..0000000
--- a/app-misc/evtest/evtest-1.31.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.  1
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="4"
-
-inherit autotools eutils
-
-DESCRIPTION="A test program for capturing input device events."
-HOMEPAGE="http://cgit.freedesktop.org/evtest/"
-SRC_URI="http://cgit.freedesktop.org/evtest/snapshot/${P}.tar.gz
-	mirror://gentoo/${P}-mans.tar.gz"
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+xml"
-
-# We bundled the man pages ourselves to avoid xmlto/asciidoc.
-# We need libxml2 for the capture tool.  While at runtime,
-# we have a file that can be used with xsltproc, we don't
-# directly need it ourselves, so don't depend on libxslt.
-# tar zcf ${P}-mans.tar.gz *.1 --transform=s:^:evtest-${P}/:
-RDEPEND=""
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-S=${WORKDIR}/${PN}-${P}
-
-src_prepare() {
-	epatch "${FILESDIR}/1.29-add-grab-flag.patch"
-	epatch "${FILESDIR}/1.31-add-safe-flag.patch"
-	eautoreconf
-}
-
-src_configure() {
-	# We pre-compile the man pages.
-	XMLTO=$(type -P true) ASCIIDOC=$(type -P true) \
-	econf
-}
diff --git a/app-misc/evtest/evtest-1.34.ebuild b/app-misc/evtest/evtest-1.34.ebuild
new file mode 100644
index 0000000..5691e60
--- /dev/null
+++ b/app-misc/evtest/evtest-1.34.ebuild
@@ -0,0 +1,28 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit autotools eutils
+
+DESCRIPTION="A test program for capturing input device events."
+HOMEPAGE="https://gitlab.freedesktop.org/libevdev/evtest/"
+SRC_URI="https://gitlab.freedesktop.org/libevdev/evtest/-/archive/${P}/evtest-${P}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+xml"
+
+BDEPEND="virtual/pkgconfig"
+
+S=${WORKDIR}/${PN}-${P}
+
+PATCHES=(
+	"${FILESDIR}/1.34-add-safe-flag.patch"
+)
+
+src_prepare() {
+	default
+	eautoreconf
+}
diff --git a/app-misc/evtest/files/1.29-add-grab-flag.patch b/app-misc/evtest/files/1.29-add-grab-flag.patch
deleted file mode 100644
index bee00ab..0000000
--- a/app-misc/evtest/files/1.29-add-grab-flag.patch
+++ /dev/null
@@ -1,185 +0,0 @@
-https://bugs.freedesktop.org/show_bug.cgi?id=88572
-
-From 6074a20cd8be0db82eb9425538c507075ff6fb61 Mon Sep 17 00:00:00 2001
-From: Joseph Hwang <josephsih@chromium.org>
-Date: Fri, 23 Jan 2015 16:22:16 +0800
-Subject: [PATCH] add grab flag
-
-If the --grab flag is given in capture mode, evtest keeps an EVIOCGRAB
-on the device. While this grab is active, other processes will not
-receive events from the kernel devices. The grab is released again
-when evtest quits.
-
-TEST=Check that the cursor is frozen when --grab option is specified.
-$ evtest --grab
----
- evtest.c   | 45 +++++++++++++++++++++++++++++++++++++--------
- evtest.txt |  6 +++++-
- 2 files changed, 42 insertions(+), 9 deletions(-)
-
-diff --git a/evtest.c b/evtest.c
-index 74230ea..7263bdb 100644
---- a/evtest.c
-+++ b/evtest.c
-@@ -55,6 +55,10 @@
- #include <errno.h>
- #include <getopt.h>
- #include <ctype.h>
-+#include <signal.h>
-+#include <sys/time.h>
-+#include <sys/types.h>
-+#include <unistd.h>
- 
- #define BITS_PER_LONG (sizeof(long) * 8)
- #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
-@@ -93,6 +97,14 @@ static const struct query_mode {
- 	{ "EV_SW",  EV_SW, SW_MAX, EVIOCGSW(SW_MAX) },
- };
- 
-+static int grab_flag = 0;
-+static volatile sig_atomic_t stop = 0;
-+
-+static void interrupt_handler(int sig)
-+{
-+	stop = 1;
-+}
-+
- /**
-  * Look up an entry in the query_modes table by its textual name.
-  *
-@@ -675,8 +687,9 @@ static int version(void)
- static int usage(void)
- {
- 	printf("USAGE:\n");
--	printf(" Grab mode:\n");
--	printf("   %s /dev/input/eventX\n", program_invocation_short_name);
-+	printf(" Capture mode:\n");
-+	printf("   %s [--grab] /dev/input/eventX\n", program_invocation_short_name);
-+	printf("     --grab  grab the device for exclusive access\n");
- 	printf("\n");
- 	printf(" Query mode: (check exit code)\n");
- 	printf("   %s --query /dev/input/eventX <type> <value>\n",
-@@ -768,8 +781,15 @@ static int print_events(int fd)
- {
- 	struct input_event ev[64];
- 	int i, rd;
-+	fd_set rdfs;
- 
--	while (1) {
-+	FD_ZERO(&rdfs);
-+	FD_SET(fd, &rdfs);
-+
-+	while (!stop) {
-+		select(fd + 1, &rdfs, NULL, NULL, NULL);
-+		if (stop)
-+			break;
- 		rd = read(fd, ev, sizeof(struct input_event) * 64);
- 
- 		if (rd < (int) sizeof(struct input_event)) {
-@@ -800,6 +820,9 @@ static int print_events(int fd)
- 		}
- 
- 	}
-+
-+	ioctl(fd, EVIOCGRAB, (void*)0);
-+	return EXIT_SUCCESS;
- }
- 
- /**
-@@ -808,13 +831,13 @@ static int print_events(int fd)
-  * @param fd The file descriptor to the device.
-  * @return 0 if the grab was successful, or 1 otherwise.
-  */
--static int test_grab(int fd)
-+static int test_grab(int fd, int grab_flag)
- {
- 	int rc;
- 
- 	rc = ioctl(fd, EVIOCGRAB, (void*)1);
- 
--	if (!rc)
-+	if (rc == 0 && !grab_flag)
- 		ioctl(fd, EVIOCGRAB, (void*)0);
- 
- 	return rc;
-@@ -827,7 +850,7 @@ static int test_grab(int fd)
-  * @param device The device to monitor, or NULL if the user should be prompted.
-  * @return 0 on success, non-zero on error.
-  */
--static int do_capture(const char *device)
-+static int do_capture(const char *device, int grab_flag)
- {
- 	int fd;
- 	char *filename;
-@@ -867,7 +890,7 @@ static int do_capture(const char *device)
- 
- 	printf("Testing ... (interrupt to exit)\n");
- 
--	if (test_grab(fd))
-+	if (test_grab(fd, grab_flag))
- 	{
- 		printf("***********************************************\n");
- 		printf("  This device is grabbed by another process.\n");
-@@ -878,6 +901,9 @@ static int do_capture(const char *device)
- 		printf("***********************************************\n");
- 	}
- 
-+	signal(SIGINT, interrupt_handler);
-+	signal(SIGTERM, interrupt_handler);
-+
- 	return print_events(fd);
- }
- 
-@@ -954,6 +980,7 @@ static int do_query(const char *device, const char *event_type, const char *keyn
- }
- 
- static const struct option long_options[] = {
-+	{ "grab", no_argument, &grab_flag, 1 },
- 	{ "query", no_argument, NULL, MODE_QUERY },
- 	{ "version", no_argument, NULL, MODE_VERSION },
- 	{ 0, },
-@@ -972,6 +999,8 @@ int main (int argc, char **argv)
- 		if (c == -1)
- 			break;
- 		switch (c) {
-+		case 0:
-+			break;
- 		case MODE_QUERY:
- 			mode = c;
- 			break;
-@@ -986,7 +1015,7 @@ int main (int argc, char **argv)
- 		device = argv[optind++];
- 
- 	if (mode == MODE_CAPTURE)
--		return do_capture(device);
-+		return do_capture(device, grab_flag);
- 
- 	if ((argc - optind) < 2) {
- 		fprintf(stderr, "Query mode requires device, type and key parameters\n");
-diff --git a/evtest.txt b/evtest.txt
-index b614482..f64b44b 100644
---- a/evtest.txt
-+++ b/evtest.txt
-@@ -8,7 +8,7 @@ NAME
- 
- SYNOPSIS
- --------
--     evtest /dev/input/eventX
-+     evtest [--grab] /dev/input/eventX
- 
-      evtest --query /dev/input/eventX <type> <value>
- 
-@@ -19,6 +19,10 @@ display information about the specified input device, including all the events
- supported by the device. It then monitors the device and displays all the
- events layer events generated.
- 
-+If the --grab flag is given in capture mode, evtest keeps an EVIOCGRAB on the
-+device. While this grab is active, other processes will not receive events
-+from the kernel devices. The grab is released again when evtest quits.
-+
- In the second invocation type ("query mode"), evtest performs a one-shot query
- of the state of a specific key *value* of an event *type*.
- 
--- 
-2.2.0.rc0.207.ga3a616c
-
diff --git a/app-misc/evtest/files/1.31-add-safe-flag.patch b/app-misc/evtest/files/1.31-add-safe-flag.patch
deleted file mode 100644
index 9ee428b..0000000
--- a/app-misc/evtest/files/1.31-add-safe-flag.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From d3a6d69e9b0d765f4b0d9f9b108cb90c72417947 Mon Sep 17 00:00:00 2001
-From: Jingkui Wang <jkwang@google.com>
-Date: Wed, 6 Sep 2017 10:13:29 -0700
-Subject: [PATCH] Enable safe mode for evtest
-
-This patch enables --safe for evtest. When evtest is called with --safe,
-all the sensitive event info will be hidden.
----
- evtest.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 55 insertions(+), 2 deletions(-)
-
-diff --git a/evtest.c b/evtest.c
-index 2cf25f0..fa9df4a 100644
---- a/evtest.c
-+++ b/evtest.c
-@@ -98,6 +98,7 @@ static const struct query_mode {
- };
- 
- static int grab_flag = 0;
-+static int safe_flag = 0;
- static volatile sig_atomic_t stop = 0;
- 
- static void interrupt_handler(int sig)
-@@ -595,6 +596,7 @@ static const char * const * const names[EV_MAX + 1] = {
- 	[EV_FF] = force,			[EV_FF_STATUS] = forcestatus,
- };
- 
-+static int cached_absinfo[ABS_MAX][6] = {0};
- /**
-  * Convert a string to a specific key/snd/led/sw code. The string can either
-  * be the name of the key in question (e.g. "SW_DOCK") or the numerical
-@@ -716,6 +718,10 @@ static int usage(void)
- 	printf("   %s --query /dev/input/eventX <type> <value>\n",
- 		program_invocation_short_name);
- 
-+	printf("\n");
-+	printf(" Safe mode:\n");
-+	printf("   %s --safe\n", program_invocation_short_name);
-+	printf("     --safe  hide sensitive event information\n");
- 	printf("\n");
- 	printf("<type> is one of: EV_KEY, EV_SW, EV_LED, EV_SND\n");
- 	printf("<value> can either be a numerical value, or the textual name of the\n");
-@@ -733,7 +739,7 @@ static int usage(void)
-  */
- static void print_absdata(int fd, int axis)
- {
--	int abs[6] = {0};
-+	int* abs = cached_absinfo[axis];
- 	int k;
- 
- 	ioctl(fd, EVIOCGABS(axis), abs);
-@@ -823,6 +829,47 @@ static int print_device_info(int fd)
- 	return 0;
- }
- 
-+/**
-+ * Print event safely and do not print any sensitive infomation.
-+ *
-+ * @param ev The event to print.
-+ */
-+static void safe_print_event(struct input_event* ev) {
-+	const char* type_str = events[ev->type] ? events[ev->type] : "?";
-+	const char* code_str =
-+		names[ev->type] ? (names[ev->type][ev->code] ?
-+				  names[ev->type][ev->code] : "?") : "?";
-+	printf("type %d (%s)", ev->type, type_str);
-+	switch (ev->type) {
-+		case EV_KEY:
-+			printf(", code *, value %d\n", ev->value);
-+			break;
-+		case EV_REL:
-+			printf(", code %d (%s)\n", ev->code, code_str);
-+			break;
-+		case EV_ABS:
-+			printf(", code %d (%s), ", ev->code, code_str);
-+			if (ev->value == cached_absinfo[ev->code][1])
-+				printf("%s\n", "value = abs_min");
-+			else if (ev->value == cached_absinfo[ev->code][2])
-+				printf("%s\n", "value = abs_max");
-+			else if (ev->value > cached_absinfo[ev->code][2] &&
-+				 ev->value < cached_absinfo[ev->code][1])
-+				printf("%s\n", "value out of range (min, max)");
-+			else
-+				printf("%s\n", "value in range (min, max)");
-+			break;
-+		case EV_MSC:
-+			if (ev->code == MSC_TIMESTAMP)
-+				printf(", code %d (%s), value %s\n", ev->code,
-+				       code_str, ev->value ? "non-zero" : "0");
-+			else
-+				printf(", code %d (%s)\n", ev->code, code_str);
-+		default:
-+			break;
-+	}
-+}
-+
- /**
-  * Print device events as they come in.
-  *
-@@ -851,13 +898,18 @@ static int print_events(int fd)
- 		}
- 
- 		for (i = 0; i < rd / sizeof(struct input_event); i++) {
--			printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);
-+			if (safe_flag)
-+				printf("Event: time %ld, ", ev[i].time.tv_sec);
-+			else
-+				printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);
- 
- 			if (ev[i].type == EV_SYN) {
- 				if (ev[i].code == SYN_MT_REPORT)
- 					printf("++++++++++++++ %s ++++++++++++\n", syns[ev[i].code]);
- 				else
- 					printf("-------------- %s ------------\n", syns[ev[i].code]);
-+			} else if (safe_flag) {
-+				safe_print_event(&ev[i]);
- 			} else {
- 				printf("type %d (%s), code %d (%s), ",
- 					ev[i].type,
-@@ -1034,6 +1086,7 @@ static int do_query(const char *device, const char *event_type, const char *keyn
- static const struct option long_options[] = {
- 	{ "grab", no_argument, &grab_flag, 1 },
- 	{ "query", no_argument, NULL, MODE_QUERY },
-+	{ "safe", no_argument, &safe_flag, 1 },
- 	{ "version", no_argument, NULL, MODE_VERSION },
- 	{ 0, },
- };
--- 
-2.14.1.581.gf28d330327-goog
-
diff --git a/app-misc/evtest/files/1.34-add-safe-flag.patch b/app-misc/evtest/files/1.34-add-safe-flag.patch
new file mode 100644
index 0000000..5e0b189
--- /dev/null
+++ b/app-misc/evtest/files/1.34-add-safe-flag.patch
@@ -0,0 +1,133 @@
+From 218cc1e499c93d4bcd1deda3821a303db72da304 Mon Sep 17 00:00:00 2001
+From: Harry Cutts <hcutts@chromium.org>
+Date: Tue, 11 Aug 2020 14:56:58 -0700
+Subject: [PATCH] Enable safe mode for evtest
+
+This patch enables --safe for evtest. When evtest is called with --safe,
+all the sensitive event info will be hidden.
+---
+ evtest.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 56 insertions(+), 3 deletions(-)
+
+diff --git a/evtest.c b/evtest.c
+index 37d4f85..dc79baf 100644
+--- a/evtest.c
++++ b/evtest.c
+@@ -105,6 +105,7 @@ static const struct query_mode {
+ };
+ 
+ static int grab_flag = 0;
++static int safe_flag = 0;
+ static volatile sig_atomic_t stop = 0;
+ 
+ static void interrupt_handler(int sig)
+@@ -814,6 +815,8 @@ static const char * const * const names[EV_MAX + 1] = {
+ 	[EV_FF] = force,			[EV_FF_STATUS] = forcestatus,
+ };
+ 
++static int cached_absinfo[ABS_MAX][6] = {0};
++
+ /**
+  * Convert a string to a specific key/snd/led/sw code. The string can either
+  * be the name of the key in question (e.g. "SW_DOCK") or the numerical
+@@ -941,7 +944,10 @@ static int usage(void)
+ 	printf(" Query mode: (check exit code)\n");
+ 	printf("   %s --query /dev/input/eventX <type> <value>\n",
+ 		program_invocation_short_name);
+-
++	printf("\n");
++	printf(" Safe mode:\n");
++	printf("   %s --safe\n", program_invocation_short_name);
++	printf("     --safe  hide sensitive event information\n");
+ 	printf("\n");
+ 	printf("<type> is one of: EV_KEY, EV_SW, EV_LED, EV_SND\n");
+ 	printf("<value> can either be a numerical value, or the textual name of the\n");
+@@ -959,7 +965,7 @@ static int usage(void)
+  */
+ static void print_absdata(int fd, int axis)
+ {
+-	int abs[6] = {0};
++	int* abs = cached_absinfo[axis];
+ 	int k;
+ 
+ 	ioctl(fd, EVIOCGABS(axis), abs);
+@@ -1106,6 +1112,47 @@ static int print_device_info(int fd)
+ 	return 0;
+ }
+ 
++/**
++ * Print event safely and do not print any sensitive infomation.
++ *
++ * @param ev The event to print.
++ */
++static void safe_print_event(struct input_event* ev) {
++	const char* type_str = events[ev->type] ? events[ev->type] : "?";
++	const char* code_str =
++		names[ev->type] ? (names[ev->type][ev->code] ?
++				  names[ev->type][ev->code] : "?") : "?";
++	printf("type %d (%s)", ev->type, type_str);
++	switch (ev->type) {
++		case EV_KEY:
++			printf(", code *, value %d\n", ev->value);
++			break;
++		case EV_REL:
++			printf(", code %d (%s)\n", ev->code, code_str);
++			break;
++		case EV_ABS:
++			printf(", code %d (%s), ", ev->code, code_str);
++			if (ev->value == cached_absinfo[ev->code][1])
++				printf("%s\n", "value = abs_min");
++			else if (ev->value == cached_absinfo[ev->code][2])
++				printf("%s\n", "value = abs_max");
++			else if (ev->value > cached_absinfo[ev->code][2] &&
++				 ev->value < cached_absinfo[ev->code][1])
++				printf("%s\n", "value out of range (min, max)");
++			else
++				printf("%s\n", "value in range (min, max)");
++			break;
++		case EV_MSC:
++			if (ev->code == MSC_TIMESTAMP)
++				printf(", code %d (%s), value %s\n", ev->code,
++				       code_str, ev->value ? "non-zero" : "0");
++			else
++				printf(", code %d (%s)\n", ev->code, code_str);
++		default:
++			break;
++	}
++}
++
+ /**
+  * Print device events as they come in.
+  *
+@@ -1139,7 +1186,10 @@ static int print_events(int fd)
+ 			type = ev[i].type;
+ 			code = ev[i].code;
+ 
+-			printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);
++			if (safe_flag)
++				printf("Event: time %ld, ", ev[i].time.tv_sec);
++			else
++				printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);
+ 
+ 			if (type == EV_SYN) {
+ 				if (code == SYN_MT_REPORT)
+@@ -1148,6 +1198,8 @@ static int print_events(int fd)
+ 					printf(">>>>>>>>>>>>>> %s <<<<<<<<<<<<\n", codename(type, code));
+ 				else
+ 					printf("-------------- %s ------------\n", codename(type, code));
++			} else if (safe_flag) {
++				safe_print_event(&ev[i]);
+ 			} else {
+ 				printf("type %d (%s), code %d (%s), ",
+ 					type, typename(type),
+@@ -1329,6 +1381,7 @@ static int do_query(const char *device, const char *event_type, const char *keyn
+ static const struct option long_options[] = {
+ 	{ "grab", no_argument, &grab_flag, 1 },
+ 	{ "query", no_argument, NULL, MODE_QUERY },
++	{ "safe", no_argument, &safe_flag, 1 },
+ 	{ "version", no_argument, NULL, MODE_VERSION },
+ 	{ 0, },
+ };
+-- 
+2.28.0.236.gb10cc79966-goog
+
diff --git a/app-text/ghostscript-gpl/files/ghostscript-9.52-fix-memory-corruption.patch b/app-text/ghostscript-gpl/files/ghostscript-9.52-fix-memory-corruption.patch
new file mode 100644
index 0000000..fafaf0ab
--- /dev/null
+++ b/app-text/ghostscript-gpl/files/ghostscript-9.52-fix-memory-corruption.patch
@@ -0,0 +1,49 @@
+From 5d499272b95a6b890a1397e11d20937de000d31b Mon Sep 17 00:00:00 2001
+From: Ray Johnston <ray.johnston@artifex.com>
+Date: Wed, 22 Jul 2020 09:57:54 -0700
+Subject: [PATCH] Bug 702582, CVE 2020-15900 Memory Corruption in Ghostscript
+ 9.52
+
+Fix the 'rsearch' calculation for the 'post' size to give the correct
+size.  Previous calculation would result in a size that was too large,
+and could underflow to max uint32_t. Also fix 'rsearch' to return the
+correct 'pre' string with empty string match.
+
+A future change may 'undefine' this undocumented, non-standard operator
+during initialization as we do with the many other non-standard internal
+PostScript operators and procedures.
+---
+ psi/zstring.c | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/psi/zstring.c b/psi/zstring.c
+index 33662dafa..58e1af2b3 100644
+--- a/psi/zstring.c
++++ b/psi/zstring.c
+@@ -142,13 +142,18 @@ search_impl(i_ctx_t *i_ctx_p, bool forward)
+     return 0;
+ found:
+     op->tas.type_attrs = op1->tas.type_attrs;
+-    op->value.bytes = ptr;
+-    r_set_size(op, size);
++    op->value.bytes = ptr;				/* match */
++    op->tas.rsize = size;				/* match */
+     push(2);
+-    op[-1] = *op1;
+-    r_set_size(op - 1, ptr - op[-1].value.bytes);
+-    op1->value.bytes = ptr + size;
+-    r_set_size(op1, count + (!forward ? (size - 1) : 0));
++    op[-1] = *op1;					/* pre */
++    op[-3].value.bytes = ptr + size;			/* post */
++    if (forward) {
++        op[-1].tas.rsize = ptr - op[-1].value.bytes;	/* pre */
++        op[-3].tas.rsize = count;			/* post */
++    } else {
++        op[-1].tas.rsize = count;			/* pre */
++        op[-3].tas.rsize -= count + size;		/* post */
++    }
+     make_true(op);
+     return 0;
+ }
+-- 
+2.17.1
diff --git a/app-text/ghostscript-gpl/ghostscript-gpl-9.52-r1.ebuild b/app-text/ghostscript-gpl/ghostscript-gpl-9.52-r4.ebuild
similarity index 100%
rename from app-text/ghostscript-gpl/ghostscript-gpl-9.52-r1.ebuild
rename to app-text/ghostscript-gpl/ghostscript-gpl-9.52-r4.ebuild
diff --git a/app-text/ghostscript-gpl/ghostscript-gpl-9.52.ebuild b/app-text/ghostscript-gpl/ghostscript-gpl-9.52.ebuild
index 0aefc4e..b08863c 100644
--- a/app-text/ghostscript-gpl/ghostscript-gpl-9.52.ebuild
+++ b/app-text/ghostscript-gpl/ghostscript-gpl-9.52.ebuild
@@ -167,7 +167,7 @@
 	# See the readme.txt file in the autotest directory to learn how the list
 	# was created.
 	local devices=(
-		ap3250 bj10e bj200 bjc600 bjc800 bjc880j bjccolor cdj500
+		ap3250 bit bj10e bj200 bjc600 bjc800 bjc880j bjccolor cdj500
 		cdj550 cdnj500 cljet5c declj250 djet500 dnj650c epl2050 eplcolor
 		eps9high eps9mid epson epsonc hl1250 ibmpro imagen jetp3852 laserjet
 		lbp8 lips2p lips3 lips4 ljet2p ljet3 ljet4 ljetplus lp1800 lp1900
diff --git a/chromeos-base/android-sdk/android-sdk-5303910-r3.ebuild b/chromeos-base/android-sdk/android-sdk-5303910-r3.ebuild
new file mode 120000
index 0000000..580e574
--- /dev/null
+++ b/chromeos-base/android-sdk/android-sdk-5303910-r3.ebuild
@@ -0,0 +1 @@
+android-sdk-5303910.ebuild
\ No newline at end of file
diff --git a/chromeos-base/android-sdk/android-sdk-5303910.ebuild b/chromeos-base/android-sdk/android-sdk-5303910.ebuild
index 6a17a21..dea3f73 100644
--- a/chromeos-base/android-sdk/android-sdk-5303910.ebuild
+++ b/chromeos-base/android-sdk/android-sdk-5303910.ebuild
@@ -36,8 +36,11 @@
 RESTRICT="strip"
 
 DEPEND=""
+# CTS P depends on Java 8 or 9. CTS R depends on Java 9 or later.
+# Include both JDK8 and JDK11 in the chroot.
 RDEPEND="
-	>=virtual/jdk-1.5
+	<=virtual/jdk-9
+	>=virtual/jdk-9
 	>=dev-java/ant-core-1.6.5
 	sys-libs/zlib"
 BDEPEND=""
diff --git a/chromeos-base/aosp-frameworks-base-proto/Manifest b/chromeos-base/aosp-frameworks-base-proto/Manifest
index e3fc2ae..5db89e5 100644
--- a/chromeos-base/aosp-frameworks-base-proto/Manifest
+++ b/chromeos-base/aosp-frameworks-base-proto/Manifest
@@ -1 +1 @@
-DIST aosp-frameworks-base-core-proto-20190912.tar.gz 144568 BLAKE2B 73eb7fd9c3f6046a0ece234cc9cc16979f3faf7052cfb5e6a7426d426c0e34f8fa52acba9e0eba736096609b9768a170521fcdde104fb5766ce265f3b2461115 SHA512 9d2fd37b6217b0e98d588821db17bcfa4e1263a7ccd700c6ab9958c586e96cb081b9ef1ed6042c5939ee46944a2ed63fe105505aab5a612c85ec586896c80f69
+DIST aosp-frameworks-base-core-proto-20200929.tar.gz 179171 BLAKE2B 598801bf86f4cca4d97cbb3ad9eece2e09fdd18ee0ea34f044dca531544252c2279d79627b168e69001c624a46106db9bdfa58fca1098be2cb38dea8a5fd9e11 SHA512 789de18dc3c5a1b0a7252da3bcd19e4abe674c6a31fd209d243a24d55960f0f159f29fabf2406ffd7392499f1ab19be8424134dfafe51eaf44c0f86b8cf37b6c
diff --git a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912-r1.ebuild b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912-r1.ebuild
deleted file mode 120000
index 66557b3..0000000
--- a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-aosp-frameworks-base-proto-20190912.ebuild
\ No newline at end of file
diff --git a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912.ebuild b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912.ebuild
deleted file mode 100644
index d0cfd0b..0000000
--- a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20190912.ebuild
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-# Honor the imports from the proto files + our own prefix.
-CROS_GO_PACKAGES=(
-	"android.com/frameworks/..."
-)
-
-inherit cros-go
-
-DESCRIPTION="AOSP frameworks/base protobuf files"
-HOMEPAGE="https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-dev/core/proto/"
-GIT_COMMIT="873f1727e5c7af9174ca662ad26ba5b95096d1f8"
-SRC_URI="https://android.googlesource.com/platform/frameworks/base/+archive/${GIT_COMMIT}/core/proto.tar.gz -> aosp-frameworks-base-core-proto-${PV}.tar.gz"
-
-LICENSE="Apache-2.0"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	dev-go/protobuf
-	dev-libs/protobuf:=
-"
-
-S=${WORKDIR}
-
-src_unpack() {
-	# Unpack the tar.gz files manually since they need to be unpacked in special directories.
-
-	mkdir -p frameworks/base/core/proto || die
-
-	pushd . || die
-	cd frameworks/base/core/proto || die
-	unpack "aosp-frameworks-base-core-proto-${PV}.tar.gz"
-	popd || die
-}
-
-src_compile() {
-	# SRC_URI contains all .proto files from Android frameworks/base (~150 .proto files).
-	# For Tast, we only need a subset: Activity Manager,  Window Manager,
-	# and its dependencies.
-	# If there is a need to add more, add a new "protoc" or extend an
-	# existing one.
-
-	local core_path="frameworks/base/core/proto/android"
-	local cp="${WORKDIR}/${core_path}"
-	local out="${WORKDIR}/gen/go/src/android.com"
-
-	# protoc allow us to map a "protobuf import" with a "golang import".
-	# This is the list of protobuf import files that need to get remapped
-	# to use the "android.com" prefix. Basically all the generated golang
-	# files must use the "android.com" import prefix.
-	local imports_to_remap=(
-		"${core_path}/app/activitymanager.proto"
-		"${core_path}/app/enums.proto"
-		"${core_path}/app/notification.proto"
-		"${core_path}/app/profilerinfo.proto"
-		"${core_path}/app/statusbarmanager.proto"
-		"${core_path}/app/window_configuration.proto"
-		"${core_path}/content/activityinfo.proto"
-		"${core_path}/content/component_name.proto"
-		"${core_path}/content/configuration.proto"
-		"${core_path}/content/intent.proto"
-		"${core_path}/content/locale.proto"
-		"${core_path}/content/package_item_info.proto"
-		"${core_path}/graphics/pixelformat.proto"
-		"${core_path}/graphics/point.proto"
-		"${core_path}/graphics/rect.proto"
-		"${core_path}/internal/processstats.proto"
-		"${core_path}/os/bundle.proto"
-		"${core_path}/os/looper.proto"
-		"${core_path}/os/message.proto"
-		"${core_path}/os/messagequeue.proto"
-		"${core_path}/os/patternmatcher.proto"
-		"${core_path}/os/powermanager.proto"
-		"${core_path}/privacy.proto"
-		"${core_path}/server/animationadapter.proto"
-		"${core_path}/server/appwindowthumbnail.proto"
-		"${core_path}/server/intentresolver.proto"
-		"${core_path}/server/surfaceanimator.proto"
-		"${core_path}/server/windowmanagerservice.proto"
-		"${core_path}/util/common.proto"
-		"${core_path}/view/display.proto"
-		"${core_path}/view/displaycutout.proto"
-		"${core_path}/view/displayinfo.proto"
-		"${core_path}/view/enums.proto"
-		"${core_path}/view/remote_animation_target.proto"
-		"${core_path}/view/surface.proto"
-		"${core_path}/view/surfacecontrol.proto"
-		"${core_path}/view/windowlayoutparams.proto"
-	)
-
-	# Generates the mapping between protobuf import file to Go import. E.g:
-	# Mframeworks/core/display.proto=android.com/frameworks/core
-	local map=""
-	for fp in "${imports_to_remap[@]}"; do
-		map="${map},M${fp}=android.com/${fp%/*}"
-	done
-
-
-	mkdir -p "${out}" || die
-	# One "protoc" invocation per directory, otherwise it will create
-	# package conflicts.
-	# Use a different "import_path" per directory to avoid name conflict.
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/privacy.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/app:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/app/activitymanager.proto" \
-		"${cp}/app/enums.proto" \
-		"${cp}/app/notification.proto" \
-		"${cp}/app/profilerinfo.proto" \
-		"${cp}/app/statusbarmanager.proto" \
-		"${cp}/app/window_configuration.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/content:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/content/activityinfo.proto" \
-		"${cp}/content/component_name.proto" \
-		"${cp}/content/configuration.proto" \
-		"${cp}/content/intent.proto" \
-		"${cp}/content/locale.proto" \
-		"${cp}/content/package_item_info.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/graphics:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/graphics/pixelformat.proto" \
-		"${cp}/graphics/point.proto" \
-		"${cp}/graphics/rect.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/internal:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/internal/processstats.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/os:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/os/bundle.proto" \
-		"${cp}/os/looper.proto" \
-		"${cp}/os/message.proto" \
-		"${cp}/os/messagequeue.proto" \
-		"${cp}/os/patternmatcher.proto" \
-		"${cp}/os/powermanager.proto" \
-		"${cp}/os/worksource.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/server:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/server/activitymanagerservice.proto" \
-		"${cp}/server/animationadapter.proto" \
-		"${cp}/server/appwindowthumbnail.proto" \
-		"${cp}/server/intentresolver.proto" \
-		"${cp}/server/surfaceanimator.proto" \
-		"${cp}/server/windowmanagerservice.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/util:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/util/common.proto" \
-		|| die
-
-	protoc \
-		--go_out="${map},import_path=android.com/${core_path}/view:${out}" \
-		--proto_path="${WORKDIR}" \
-		"${cp}/view/display.proto" \
-		"${cp}/view/displaycutout.proto" \
-		"${cp}/view/displayinfo.proto" \
-		"${cp}/view/enums.proto" \
-		"${cp}/view/remote_animation_target.proto" \
-		"${cp}/view/surface.proto" \
-		"${cp}/view/surfacecontrol.proto" \
-		"${cp}/view/windowlayoutparams.proto" \
-		|| die
-
-	CROS_GO_WORKSPACE="${WORKDIR}/gen/go/"
-}
diff --git a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929-r1.ebuild b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929-r1.ebuild
new file mode 120000
index 0000000..3b92f95
--- /dev/null
+++ b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929-r1.ebuild
@@ -0,0 +1 @@
+aosp-frameworks-base-proto-20200929.ebuild
\ No newline at end of file
diff --git a/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929.ebuild b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929.ebuild
new file mode 100644
index 0000000..52d6542
--- /dev/null
+++ b/chromeos-base/aosp-frameworks-base-proto/aosp-frameworks-base-proto-20200929.ebuild
@@ -0,0 +1,199 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+# Honor the imports from the proto files + our own prefix.
+CROS_GO_PACKAGES=(
+	"android.com/frameworks/..."
+)
+
+inherit cros-go
+
+DESCRIPTION="AOSP frameworks/base protobuf files"
+HOMEPAGE="https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android11-dev/core/proto/"
+GIT_COMMIT="c29468777021f4970ab20b38601448fe81ecdcbb"
+SRC_URI="https://android.googlesource.com/platform/frameworks/base/+archive/${GIT_COMMIT}/core/proto.tar.gz -> aosp-frameworks-base-core-proto-${PV}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	dev-go/protobuf
+	dev-libs/protobuf:=
+"
+
+S=${WORKDIR}
+
+src_unpack() {
+	# Unpack the tar.gz files manually since they need to be unpacked in special directories.
+
+	mkdir -p frameworks/base/core/proto || die
+
+	pushd . || die
+	cd frameworks/base/core/proto || die
+	unpack "aosp-frameworks-base-core-proto-${PV}.tar.gz"
+	popd || die
+}
+
+src_compile() {
+	# SRC_URI contains all .proto files from Android frameworks/base (~150 .proto files).
+	# For Tast, we only need a subset: Activity Manager,  Window Manager,
+	# and its dependencies.
+	# If there is a need to add more, add a new "protoc" or extend an
+	# existing one.
+
+	local core_path="frameworks/base/core/proto/android"
+	local cp="${WORKDIR}/${core_path}"
+	local out="${WORKDIR}/gen/go/src/android.com"
+
+	# protoc allow us to map a "protobuf import" with a "golang import".
+	# This is the list of protobuf import files that need to get remapped
+	# to use the "android.com" prefix. Basically all the generated golang
+	# files must use the "android.com" import prefix.
+	local imports_to_remap=(
+		"${core_path}/app/activitymanager.proto"
+		"${core_path}/app/appexit_enums.proto"
+		"${core_path}/app/appexitinfo.proto"
+		"${core_path}/app/enums.proto"
+		"${core_path}/app/notification.proto"
+		"${core_path}/app/profilerinfo.proto"
+		"${core_path}/app/statusbarmanager.proto"
+		"${core_path}/app/window_configuration.proto"
+		"${core_path}/content/activityinfo.proto"
+		"${core_path}/content/component_name.proto"
+		"${core_path}/content/configuration.proto"
+		"${core_path}/content/intent.proto"
+		"${core_path}/content/locale.proto"
+		"${core_path}/content/package_item_info.proto"
+		"${core_path}/graphics/pixelformat.proto"
+		"${core_path}/graphics/point.proto"
+		"${core_path}/graphics/rect.proto"
+		"${core_path}/internal/processstats.proto"
+		"${core_path}/os/bundle.proto"
+		"${core_path}/os/looper.proto"
+		"${core_path}/os/message.proto"
+		"${core_path}/os/messagequeue.proto"
+		"${core_path}/os/patternmatcher.proto"
+		"${core_path}/os/powermanager.proto"
+		"${core_path}/privacy.proto"
+		"${core_path}/server/activitymanagerservice.proto"
+		"${core_path}/server/animationadapter.proto"
+		"${core_path}/server/intentresolver.proto"
+		"${core_path}/server/surfaceanimator.proto"
+		"${core_path}/server/windowcontainerthumbnail.proto"
+		"${core_path}/server/windowmanagerservice.proto"
+		"${core_path}/util/common.proto"
+		"${core_path}/view/display.proto"
+		"${core_path}/view/displaycutout.proto"
+		"${core_path}/view/displayinfo.proto"
+		"${core_path}/view/enums.proto"
+		"${core_path}/view/remote_animation_target.proto"
+		"${core_path}/view/surface.proto"
+		"${core_path}/view/surfacecontrol.proto"
+		"${core_path}/view/windowlayoutparams.proto"
+	)
+
+	# Generates the mapping between protobuf import file to Go import. E.g:
+	# Mframeworks/core/display.proto=android.com/frameworks/core
+	local map=""
+	for fp in "${imports_to_remap[@]}"; do
+		map="${map},M${fp}=android.com/${fp%/*}"
+	done
+
+
+	mkdir -p "${out}" || die
+	# One "protoc" invocation per directory, otherwise it will create
+	# package conflicts.
+	# Use a different "import_path" per directory to avoid name conflict.
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/privacy.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/app:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/app/activitymanager.proto" \
+		"${cp}/app/appexit_enums.proto" \
+		"${cp}/app/appexitinfo.proto" \
+		"${cp}/app/enums.proto" \
+		"${cp}/app/notification.proto" \
+		"${cp}/app/profilerinfo.proto" \
+		"${cp}/app/statusbarmanager.proto" \
+		"${cp}/app/window_configuration.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/content:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/content/activityinfo.proto" \
+		"${cp}/content/component_name.proto" \
+		"${cp}/content/configuration.proto" \
+		"${cp}/content/intent.proto" \
+		"${cp}/content/locale.proto" \
+		"${cp}/content/package_item_info.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/graphics:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/graphics/pixelformat.proto" \
+		"${cp}/graphics/point.proto" \
+		"${cp}/graphics/rect.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/internal:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/internal/processstats.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/os:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/os/bundle.proto" \
+		"${cp}/os/looper.proto" \
+		"${cp}/os/message.proto" \
+		"${cp}/os/messagequeue.proto" \
+		"${cp}/os/patternmatcher.proto" \
+		"${cp}/os/powermanager.proto" \
+		"${cp}/os/worksource.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/server:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/server/activitymanagerservice.proto" \
+		"${cp}/server/animationadapter.proto" \
+		"${cp}/server/intentresolver.proto" \
+		"${cp}/server/surfaceanimator.proto" \
+		"${cp}/server/windowcontainerthumbnail.proto" \
+		"${cp}/server/windowmanagerservice.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/util:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/util/common.proto" \
+		|| die
+
+	protoc \
+		--go_out="${map},import_path=android.com/${core_path}/view:${out}" \
+		--proto_path="${WORKDIR}" \
+		"${cp}/view/display.proto" \
+		"${cp}/view/displaycutout.proto" \
+		"${cp}/view/displayinfo.proto" \
+		"${cp}/view/enums.proto" \
+		"${cp}/view/remote_animation_target.proto" \
+		"${cp}/view/surface.proto" \
+		"${cp}/view/surfacecontrol.proto" \
+		"${cp}/view/windowlayoutparams.proto" \
+		|| die
+
+	CROS_GO_WORKSPACE="${WORKDIR}/gen/go/"
+}
diff --git a/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r132.ebuild b/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r132.ebuild
new file mode 100644
index 0000000..08db938
--- /dev/null
+++ b/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r132.ebuild
@@ -0,0 +1,192 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "ca937b5dd7fe354c288f354903654f85da548315" "e5c1dfc419bec2f682a9c17a4f8d75cabd69f848")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "b51e097c1127c4a9fa83ddbcc88b5d4d5f95a60f" "bbf597e1cd2e3f49a8a2aab9f85c903867311558")
+inherit cros-constants
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform2"
+	"aosp/platform/frameworks/ml"
+	"aosp/platform/hardware/interfaces/neuralnetworks"
+)
+CROS_WORKON_REPO=(
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform2"
+	"aosp/frameworks/ml"
+	"aosp/hardware/interfaces/neuralnetworks"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform2"
+	"${S}/platform2/aosp/frameworks/ml"
+	"${S}/platform2/aosp/hardware/interfaces/neuralnetworks"
+)
+CROS_WORKON_SUBTREE=(
+	"common-mk .gn"
+	"nn"
+	""
+)
+
+PLATFORM_SUBDIR="aosp/frameworks/ml/nn"
+
+inherit cros-workon platform flag-o-matic
+
+DESCRIPTION="Chrome OS port of the Android Neural Network API"
+HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks"
+
+LICENSE="BSD-Google Apache-2.0"
+KEYWORDS="*"
+IUSE="cpu_flags_x86_avx2 vendor-nnhal minimal-driver nnapi_driver_tests"
+
+RDEPEND="
+	chromeos-base/nnapi:=
+	dev-libs/openssl:=
+	sci-libs/tensorflow:=
+"
+
+DEPEND="
+	${RDEPEND}
+	dev-libs/libtextclassifier
+	>=dev-cpp/eigen-3
+"
+
+cros-debug-add-NDEBUG() {
+	# Don't set NDEBUG, overriding from cros-debug eclass.
+	# If this is set, tests will fail and is also explicitly checked in
+	# runtime/test/RequireDebug.cpp
+	use cros-debug || echo "Not doing append-cppflags -NDEBUG";
+}
+
+src_configure() {
+	if use x86 || use amd64; then
+		append-cppflags "-D_Float16=__fp16"
+		append-cxxflags "-Xclang -fnative-half-type"
+		append-cxxflags "-Xclang -fallow-half-arguments-and-returns"
+	fi
+	if use minimal-driver; then
+		append-cppflags "-DNNAPI_USE_MINIMAL_DRIVER"
+	fi
+	platform_src_configure
+}
+
+platform_pkg_test() {
+	local tests=(
+		chromeos common driver_cache runtime runtime_generated
+	)
+
+	# When running in qemu, these tests freeze the emulator when hitting
+	# EventFlag::wake from libfmq. The error printed is:
+	# Error in event flag wake attempt: Function not implemented
+	# This is a known issue, see:
+	# https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats
+	# TODO(http://crbug.com/1117470): tracking bug for qemu fix
+	local qemu_gtest_excl_filter="-"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest10.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest11.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest12.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest13.Wait/*:"
+	qemu_gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/*:"
+	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/12:"
+	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/15:"
+	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/18:"
+	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/21:"
+	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/24:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeBadCompilation:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeConcurrent:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeDifferentCompilations:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeNull:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.FreeBurstBeforeMemory:"
+	qemu_gtest_excl_filter+="ValidationTestBurst.FreeMemoryBeforeBurst:"
+	qemu_gtest_excl_filter+="ValidationTestCompilation.ExecutionUsability:"
+	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionTiming:"
+	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeout:"
+	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeoutMaximum:"
+
+
+	local gtest_excl_filter="-"
+	if use asan; then
+		# Some tests do not correctly clean up the Execution object and it is
+		# left 'in-flight', which gets ignored by ANeuralNetworksExecution_free.
+		# See b/161844605.
+		# Look for 'passed an in-flight ANeuralNetworksExecution' in log output
+		gtest_excl_filter+="Fenced/TimingTest.Test/2:"
+		gtest_excl_filter+="Fenced/TimingTest.Test/19:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/4:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/1:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/2:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/4:"
+
+		# TODO(b/163081732): Fix tests that freeze in asan (jmpollock)
+		# Now we have a situation where these tests are hanging in asan, but I can't
+		# reproduce this locally (Flavor/ExecutionTest13.Wait/0).
+		# The duplication to the above is intentional, as fixing this issue will not
+		# fix the one above.
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/*:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/*:"
+
+		# This is due to a leak caused when copying the memory pools
+		# into the request object in this test. lsan_suppressions doesn't
+		# work due to the lack of /usr/bin/llvm-symbolizer, so just exclude.
+		gtest_excl_filter+="ComplianceTest.DeviceMemory:"
+		gtest_excl_filter+="ValidateRequestTest.ScalarOutput:"
+		gtest_excl_filter+="ValidateRequestTest.UnknownOutputRank:"
+
+		# Disable asan container overflow checks that are coming from gtest,
+		# not our code. Strangely this only started happening once we made
+		# common a shared library.
+		# See: https://crbug.com/1067977, https://crbug.com/1069722
+		# https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow#false-positives
+		export ASAN_OPTIONS+=":detect_container_overflow=0:"
+	fi
+
+	local test_target
+	for test_target in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_target}_testrunner" "0" "${gtest_excl_filter}" "${qemu_gtest_excl_filter}"
+	done
+}
+
+src_install() {
+	einfo "Installing runtime & common Headers."
+	insinto /usr/include/aosp/frameworks/ml/nn/common
+	doins -r "${S}"/common/include
+	insinto /usr/include/aosp/frameworks/ml/nn/runtime
+	doins -r "${S}"/runtime/include
+
+	einfo "Installing libs."
+	dolib.so "${OUT}/lib/libneuralnetworks.so"
+	dolib.so "${OUT}/lib/libnn-common.so"
+
+	if ! use vendor-nnhal ; then
+		einfo "Installing reference vendor hal."
+		dolib.so "${OUT}/lib/libvendor-nn-hal.so"
+	fi
+
+	if use nnapi_driver_tests; then
+		einfo "Installing hal driver tests."
+		dobin "${OUT}/cros_nnapi_vts_1_0"
+		dobin "${OUT}/cros_nnapi_vts_1_1"
+		dobin "${OUT}/cros_nnapi_vts_1_2"
+		dobin "${OUT}/cros_nnapi_vts_1_3"
+		dobin "${OUT}/cros_nnapi_cts"
+	fi
+}
diff --git a/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r77.ebuild b/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r77.ebuild
deleted file mode 100644
index 5087574..0000000
--- a/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-0.0.1-r77.ebuild
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT=("89c1e8fed12123dd92697e3da4b51eb7a33c2ccc" "472f90bd48543f397a8635dd37aee76ebce64ae3")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "429fd9783b5c647054d49272a354d05ffcd7d9a1")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform2"
-	"aosp/platform/frameworks/ml"
-)
-CROS_WORKON_REPO=(
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform2"
-	"aosp/frameworks/ml"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform2"
-	"${S}/platform2/aosp/frameworks/ml"
-)
-CROS_WORKON_SUBTREE=(
-	"common-mk .gn"
-	"nn"
-)
-
-PLATFORM_SUBDIR="aosp/frameworks/ml/nn"
-
-inherit cros-workon platform flag-o-matic
-
-DESCRIPTION="Chrome OS port of the Android Neural Network API"
-HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks"
-
-LICENSE="BSD-Google Apache-2.0"
-KEYWORDS="*"
-IUSE="cpu_flags_x86_avx2 vendor-nnhal minimal-driver"
-
-RDEPEND="
-	chromeos-base/nnapi:=
-	dev-libs/openssl:=
-	sci-libs/tensorflow:=
-"
-
-DEPEND="
-	${RDEPEND}
-	dev-libs/libtextclassifier
-	>=dev-cpp/eigen-3
-"
-
-cros-debug-add-NDEBUG() {
-	# Don't set NDEBUG, overriding from cros-debug eclass.
-	# If this is set, tests will fail and is also explicitly checked in
-	# runtime/test/RequireDebug.cpp
-	use cros-debug || echo "Not doing append-cppflags -NDEBUG";
-}
-
-src_configure() {
-	if use x86 || use amd64; then
-		append-cppflags "-D_Float16=__fp16"
-		append-cxxflags "-Xclang -fnative-half-type"
-		append-cxxflags "-Xclang -fallow-half-arguments-and-returns"
-	fi
-	if use minimal-driver; then
-		append-cppflags "-DNNAPI_USE_MINIMAL_DRIVER"
-	fi
-	platform_src_configure
-}
-
-platform_pkg_test() {
-	local tests=(
-		chromeos common common_operations driver_cache runtime runtime_generated
-	)
-
-	# When running in qemu, these tests freeze the emulator when hitting
-	# EventFlag::wake from libfmq. The error printed is:
-	# Error in event flag wake attempt: Function not implemented
-	# This is a known issue, see:
-	# https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats
-	local qemu_gtest_excl_filter="-"
-	qemu_gtest_excl_filter+="Flavor/ExecutionTest12.Wait/0:"
-	qemu_gtest_excl_filter+="Flavor/ExecutionTest13.Wait/0:"
-	qemu_gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/0:"
-	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/12:"
-	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/15:"
-	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/18:"
-	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/21:"
-	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/24:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeBadCompilation:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeConcurrent:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeDifferentCompilations:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeNull:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.FreeBurstBeforeMemory:"
-	qemu_gtest_excl_filter+="ValidationTestBurst.FreeMemoryBeforeBurst:"
-	qemu_gtest_excl_filter+="ValidationTestCompilation.ExecutionUsability:"
-	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionTiming:"
-	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeout:"
-	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeoutMaximum:"
-
-	local test_target
-	for test_target in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_target}_testrunner" "0" "" "${qemu_gtest_excl_filter}"
-	done
-}
-
-src_install() {
-	dolib.so "${OUT}/lib/libneuralnetworks.so"
-
-	if ! use vendor-nnhal ; then
-		dolib.so "${OUT}/lib/libvendor-nn-hal.so"
-	fi
-}
diff --git a/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-9999.ebuild b/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-9999.ebuild
index d2d3b69..1734780 100644
--- a/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-9999.ebuild
+++ b/chromeos-base/aosp-frameworks-ml-nn/aosp-frameworks-ml-nn-9999.ebuild
@@ -2,25 +2,33 @@
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=7
+
+inherit cros-constants
+
 CROS_WORKON_PROJECT=(
 	"chromiumos/platform2"
 	"aosp/platform/frameworks/ml"
+	"aosp/platform/hardware/interfaces/neuralnetworks"
 )
 CROS_WORKON_REPO=(
 	"${CROS_GIT_HOST_URL}"
 	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
 )
 CROS_WORKON_LOCALNAME=(
 	"platform2"
 	"aosp/frameworks/ml"
+	"aosp/hardware/interfaces/neuralnetworks"
 )
 CROS_WORKON_DESTDIR=(
 	"${S}/platform2"
 	"${S}/platform2/aosp/frameworks/ml"
+	"${S}/platform2/aosp/hardware/interfaces/neuralnetworks"
 )
 CROS_WORKON_SUBTREE=(
 	"common-mk .gn"
 	"nn"
+	""
 )
 
 PLATFORM_SUBDIR="aosp/frameworks/ml/nn"
@@ -32,7 +40,7 @@
 
 LICENSE="BSD-Google Apache-2.0"
 KEYWORDS="~*"
-IUSE="cpu_flags_x86_avx2 vendor-nnhal minimal-driver"
+IUSE="cpu_flags_x86_avx2 vendor-nnhal minimal-driver nnapi_driver_tests"
 
 RDEPEND="
 	chromeos-base/nnapi:=
@@ -67,7 +75,7 @@
 
 platform_pkg_test() {
 	local tests=(
-		chromeos common common_operations driver_cache runtime runtime_generated
+		chromeos common driver_cache runtime runtime_generated
 	)
 
 	# When running in qemu, these tests freeze the emulator when hitting
@@ -75,10 +83,13 @@
 	# Error in event flag wake attempt: Function not implemented
 	# This is a known issue, see:
 	# https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats
+	# TODO(http://crbug.com/1117470): tracking bug for qemu fix
 	local qemu_gtest_excl_filter="-"
-	qemu_gtest_excl_filter+="Flavor/ExecutionTest12.Wait/0:"
-	qemu_gtest_excl_filter+="Flavor/ExecutionTest13.Wait/0:"
-	qemu_gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/0:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest10.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest11.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest12.Wait/*:"
+	qemu_gtest_excl_filter+="Flavor/ExecutionTest13.Wait/*:"
+	qemu_gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/*:"
 	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/12:"
 	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/15:"
 	qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/18:"
@@ -95,16 +106,85 @@
 	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeout:"
 	qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeoutMaximum:"
 
+
+	local gtest_excl_filter="-"
+	if use asan; then
+		# Some tests do not correctly clean up the Execution object and it is
+		# left 'in-flight', which gets ignored by ANeuralNetworksExecution_free.
+		# See b/161844605.
+		# Look for 'passed an in-flight ANeuralNetworksExecution' in log output
+		gtest_excl_filter+="Fenced/TimingTest.Test/2:"
+		gtest_excl_filter+="Fenced/TimingTest.Test/19:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/4:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/1:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/2:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/4:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/1:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/2:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/4:"
+
+		# TODO(b/163081732): Fix tests that freeze in asan (jmpollock)
+		# Now we have a situation where these tests are hanging in asan, but I can't
+		# reproduce this locally (Flavor/ExecutionTest13.Wait/0).
+		# The duplication to the above is intentional, as fixing this issue will not
+		# fix the one above.
+		gtest_excl_filter+="Flavor/ExecutionTest10.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest11.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest12.Wait/*:"
+		gtest_excl_filter+="Flavor/ExecutionTest13.Wait/*:"
+		gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/*:"
+
+		# This is due to a leak caused when copying the memory pools
+		# into the request object in this test. lsan_suppressions doesn't
+		# work due to the lack of /usr/bin/llvm-symbolizer, so just exclude.
+		gtest_excl_filter+="ComplianceTest.DeviceMemory:"
+		gtest_excl_filter+="ValidateRequestTest.ScalarOutput:"
+		gtest_excl_filter+="ValidateRequestTest.UnknownOutputRank:"
+
+		# Disable asan container overflow checks that are coming from gtest,
+		# not our code. Strangely this only started happening once we made
+		# common a shared library.
+		# See: https://crbug.com/1067977, https://crbug.com/1069722
+		# https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow#false-positives
+		export ASAN_OPTIONS+=":detect_container_overflow=0:"
+	fi
+
 	local test_target
 	for test_target in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_target}_testrunner" "0" "" "${qemu_gtest_excl_filter}"
+		platform_test "run" "${OUT}/${test_target}_testrunner" "0" "${gtest_excl_filter}" "${qemu_gtest_excl_filter}"
 	done
 }
 
 src_install() {
+	einfo "Installing runtime & common Headers."
+	insinto /usr/include/aosp/frameworks/ml/nn/common
+	doins -r "${S}"/common/include
+	insinto /usr/include/aosp/frameworks/ml/nn/runtime
+	doins -r "${S}"/runtime/include
+
+	einfo "Installing libs."
 	dolib.so "${OUT}/lib/libneuralnetworks.so"
+	dolib.so "${OUT}/lib/libnn-common.so"
 
 	if ! use vendor-nnhal ; then
+		einfo "Installing reference vendor hal."
 		dolib.so "${OUT}/lib/libvendor-nn-hal.so"
 	fi
+
+	if use nnapi_driver_tests; then
+		einfo "Installing hal driver tests."
+		dobin "${OUT}/cros_nnapi_vts_1_0"
+		dobin "${OUT}/cros_nnapi_vts_1_1"
+		dobin "${OUT}/cros_nnapi_vts_1_2"
+		dobin "${OUT}/cros_nnapi_vts_1_3"
+		dobin "${OUT}/cros_nnapi_cts"
+	fi
 }
diff --git a/chromeos-base/arc-adbd/arc-adbd-0.0.1-r242.ebuild b/chromeos-base/arc-adbd/arc-adbd-0.0.1-r242.ebuild
deleted file mode 100644
index b948970..0000000
--- a/chromeos-base/arc-adbd/arc-adbd-0.0.1-r242.ebuild
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="05b5852bbf00f85e097be08bf5344d2f735171d7"
-CROS_WORKON_TREE=("b0c81def68dd6bc09ac090754b216cc52c917de2" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "769e73d163dc671e97eeb278eefcf36cfdd1c94c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="arc/adbd common-mk patchpanel .gn"
-
-PLATFORM_SUBDIR="arc/adbd"
-
-inherit cros-workon platform
-
-DESCRIPTION="Container to run Android's adbd proxy."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/adbd"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+seccomp fuzzer arcvm"
-
-VM_DEPEND="
-	chromeos-base/patchpanel
-"
-
-VM_RDEPEND=${VM_DEPEND}
-
-DEPEND="
-	arcvm? ( ${VM_DEPEND} )
-"
-
-RDEPEND="
-	arcvm? ( ${VM_RDEPEND} )
-	chromeos-base/minijail
-"
-
-src_install() {
-	insinto /etc/init
-	doins init/arc-adbd.conf
-
-	insinto /usr/share/policy
-	use seccomp && newins "seccomp/arc-adbd-${ARCH}.policy" arc-adbd-seccomp.policy
-
-	dosbin "${OUT}/arc-adbd"
-
-	# Install fuzzers.
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-setup-config-fs-fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-setup-function-fs-fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-create-pipe-fuzzer
-}
diff --git a/chromeos-base/arc-adbd/arc-adbd-0.0.1-r310.ebuild b/chromeos-base/arc-adbd/arc-adbd-0.0.1-r310.ebuild
new file mode 100644
index 0000000..a7a17b0
--- /dev/null
+++ b/chromeos-base/arc-adbd/arc-adbd-0.0.1-r310.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="0a70acf40b774cf9c5d4f41cb5787d3862ca9348"
+CROS_WORKON_TREE=("0c865f852d3d0cb2847a8d8b2ea603dfd812447b" "aa81756947ecfdd38b22f42eed8eeafa40431079" "2c0fbdc6a39fdedb92ac536175e351099402b6ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="arc/adbd common-mk patchpanel .gn"
+
+PLATFORM_SUBDIR="arc/adbd"
+
+inherit cros-workon platform
+
+DESCRIPTION="Container to run Android's adbd proxy."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/adbd"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp fuzzer arcvm"
+
+VM_DEPEND="
+	chromeos-base/patchpanel
+"
+
+VM_RDEPEND=${VM_DEPEND}
+
+DEPEND="
+	arcvm? ( ${VM_DEPEND} )
+"
+
+RDEPEND="
+	arcvm? ( ${VM_RDEPEND} )
+	chromeos-base/minijail
+"
+
+src_install() {
+	insinto /etc/init
+	if use arcvm; then
+		doins init/arcvm-adbd.conf
+		insinto /etc/dbus-1/system.d
+		doins init/dbus-1/ArcVmAdbd.conf
+	else
+		doins init/arc-adbd.conf
+	fi
+
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/arc$(usex arcvm vm '')-adbd-${ARCH}.policy" "arc$(usex arcvm vm '')-adbd-seccomp.policy"
+
+	dosbin "${OUT}/arc-adbd"
+
+	# Install fuzzers.
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-setup-config-fs-fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-setup-function-fs-fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc-adbd-create-pipe-fuzzer
+}
diff --git a/chromeos-base/arc-adbd/arc-adbd-9999.ebuild b/chromeos-base/arc-adbd/arc-adbd-9999.ebuild
index f8ac608..f57c346 100644
--- a/chromeos-base/arc-adbd/arc-adbd-9999.ebuild
+++ b/chromeos-base/arc-adbd/arc-adbd-9999.ebuild
@@ -37,10 +37,16 @@
 
 src_install() {
 	insinto /etc/init
-	doins init/arc-adbd.conf
+	if use arcvm; then
+		doins init/arcvm-adbd.conf
+		insinto /etc/dbus-1/system.d
+		doins init/dbus-1/ArcVmAdbd.conf
+	else
+		doins init/arc-adbd.conf
+	fi
 
 	insinto /usr/share/policy
-	use seccomp && newins "seccomp/arc-adbd-${ARCH}.policy" arc-adbd-seccomp.policy
+	use seccomp && newins "seccomp/arc$(usex arcvm vm '')-adbd-${ARCH}.policy" "arc$(usex arcvm vm '')-adbd-seccomp.policy"
 
 	dosbin "${OUT}/arc-adbd"
 
diff --git a/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r298.ebuild b/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r298.ebuild
deleted file mode 100644
index cce6ee8..0000000
--- a/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r298.ebuild
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="bbaf80ffceb9be8c6a29286bca054e7a23974961"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "4ac2033b6d4876a06f56e8571ef008373961bbd1" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/apk-cache .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="arc/apk-cache"
-
-inherit cros-workon platform
-
-DESCRIPTION="Maintains APK cache in ARC."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/apk-cache"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+seccomp"
-
-RDEPEND="
-	chromeos-base/minijail
-	dev-db/sqlite:=
-"
-
-DEPEND="
-	dev-db/sqlite:=
-"
-
-src_install() {
-	insinto /etc/init
-	doins init/apk-cache-cleaner.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	use seccomp && newins \
-		"seccomp/apk-cache-cleaner-seccomp-${ARCH}.policy" \
-		apk-cache-cleaner-seccomp.policy
-
-	dosbin "${OUT}/apk-cache-cleaner"
-	dobin  "${OUT}/apk-cache-ctl"
-	dosbin apk-cache-cleaner-jailed
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/apk-cache-cleaner_testrunner"
-	platform_test "run" "${OUT}/apk-cache-ctl_testrunner"
-}
diff --git a/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r319.ebuild b/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r319.ebuild
new file mode 100644
index 0000000..ee5d697
--- /dev/null
+++ b/chromeos-base/arc-apk-cache/arc-apk-cache-0.0.1-r319.ebuild
@@ -0,0 +1,53 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1cd410cd154b1ff287a1424cdb3bfd4c0fe40952" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/apk-cache .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="arc/apk-cache"
+
+inherit cros-workon platform
+
+DESCRIPTION="Maintains APK cache in ARC."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/apk-cache"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/minijail
+	dev-db/sqlite:=
+"
+
+DEPEND="
+	dev-db/sqlite:=
+"
+
+src_install() {
+	insinto /etc/init
+	doins init/apk-cache-cleaner.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins \
+		"seccomp/apk-cache-cleaner-seccomp-${ARCH}.policy" \
+		apk-cache-cleaner-seccomp.policy
+
+	dosbin "${OUT}/apk-cache-cleaner"
+	dobin  "${OUT}/apk-cache-ctl"
+	dosbin apk-cache-cleaner-jailed
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/apk-cache-cleaner_testrunner"
+	platform_test "run" "${OUT}/apk-cache-ctl_testrunner"
+}
diff --git a/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r227.ebuild b/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r227.ebuild
deleted file mode 100644
index be642e3..0000000
--- a/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r227.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a0d2a8563c4f3a1aad7d4257726179ad3294f00a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/appfuse .gn"
-
-PLATFORM_SUBDIR="arc/appfuse"
-
-inherit cros-workon platform user
-
-DESCRIPTION="D-Bus service to provide ARC Appfuse"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/appfuse"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	sys-apps/dbus:=
-	sys-fs/fuse:=
-"
-
-DEPEND="${RDEPEND}
-	chromeos-base/system_api:=
-"
-
-BDEPEND="
-	virtual/pkgconfig
-"
-
-src_install() {
-	platform_install
-}
-
-pkg_preinst() {
-	enewuser "arc-appfuse-provider"
-	enewgroup "arc-appfuse-provider"
-}
-
-platform_pkg_test() {
-	platform test_all
-}
diff --git a/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r248.ebuild b/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r248.ebuild
new file mode 100644
index 0000000..bd3dea2
--- /dev/null
+++ b/chromeos-base/arc-appfuse/arc-appfuse-0.0.1-r248.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "c8c2c74c9c7c509d1151cf979a1a9127d566d04b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/appfuse .gn"
+
+PLATFORM_SUBDIR="arc/appfuse"
+
+inherit cros-workon platform user
+
+DESCRIPTION="D-Bus service to provide ARC Appfuse"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/appfuse"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	sys-apps/dbus:=
+	sys-fs/fuse:=
+"
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+BDEPEND="
+	virtual/pkgconfig
+"
+
+src_install() {
+	platform_install
+}
+
+pkg_preinst() {
+	enewuser "arc-appfuse-provider"
+	enewgroup "arc-appfuse-provider"
+}
+
+platform_pkg_test() {
+	platform test_all
+}
diff --git a/chromeos-base/arc-base/arc-base-0.0.1-r315.ebuild b/chromeos-base/arc-base/arc-base-0.0.1-r315.ebuild
deleted file mode 100644
index 0662067..0000000
--- a/chromeos-base/arc-base/arc-base-0.0.1-r315.ebuild
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="285c1e00d3948fa894fd211655d226d16fcc8a72"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "761a5c24652ef994b61896d217cfe1f0258f9887" "569dbe30775407ebff384419f65741554131d462" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/container-bundle arc/scripts .gn"
-
-inherit cros-workon user
-
-DESCRIPTION="Container to run Android."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/container-bundle"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-IUSE="
-	android-container-pi
-	arcpp
-	arcvm
-	"
-
-REQUIRED_USE="|| ( arcpp arcvm )"
-
-RDEPEND="!<chromeos-base/chromeos-cheets-scripts-0.0.3"
-DEPEND="${RDEPEND}"
-
-CONTAINER_ROOTFS="/opt/google/containers/android/rootfs"
-
-src_install() {
-	# Redirect ARC and ARCVM logs to arc.log.
-	insinto /etc/rsyslog.d
-	doins arc/scripts/rsyslog.arc.conf
-
-	if use arcpp; then
-		insinto /opt/google/containers/android
-		if use android-container-pi; then
-			doins arc/container-bundle/pi/config.json
-		else
-			echo "Unknown container version" >&2
-			exit 1
-		fi
-
-		# Install scripts.
-		insinto /etc/sysctl.d
-		doins arc/scripts/01-sysctl-arc.conf
-
-		# Install exception file for FIFO blocking policy on stateful partition.
-		insinto /usr/share/cros/startup/fifo_exceptions
-		doins arc/container-bundle/arc-fifo-exceptions.txt
-
-		# Install exception file for symlink blocking policy on stateful partition.
-		insinto /usr/share/cros/startup/symlink_exceptions
-		doins arc/container-bundle/arc-symlink-exceptions.txt
-	fi
-}
-
-pkg_preinst() {
-	# ARCVM also needs these users on the host side for proper ugid remapping.
-	enewuser "wayland"
-	enewgroup "wayland"
-	enewuser "arc-bridge"
-	enewgroup "arc-bridge"
-	enewuser "android-root"
-	enewgroup "android-root"
-	enewgroup "arc-sensor"
-	enewgroup "android-everybody"
-	enewgroup "android-reserved-disk"
-}
-
-pkg_postinst() {
-	if use arcpp; then
-		local root_uid=$(egetent passwd android-root | cut -d: -f3)
-		local root_gid=$(egetent group android-root | cut -d: -f3)
-
-		# Create a rootfs directory, and then a subdirectory mount point. We
-		# use 0500 for CONTAINER_ROOTFS instead of 0555 so that non-system
-		# processes running outside the container don't start depending on
-		# files in system.raw.img.
-		# These are created here rather than at
-		# install because some of them may already exist and have mounts.
-		install -d --mode=0500 "--owner=${root_uid}" "--group=${root_gid}" \
-			"${ROOT}${CONTAINER_ROOTFS}" \
-			|| true
-		# This CONTAINER_ROOTFS/root directory works as a mount point for
-		# system.raw.img, and once it's mounted, the image's root directory's
-		# permissions override the mode, owner, and group mkdir sets here.
-		mkdir -p "${ROOT}${CONTAINER_ROOTFS}/root" || true
-		install -d --mode=0500 "--owner=${root_uid}" "--group=${root_gid}" \
-			"${ROOT}${CONTAINER_ROOTFS}/android-data" \
-			|| true
-	fi
-}
diff --git a/chromeos-base/arc-base/arc-base-0.0.1-r340.ebuild b/chromeos-base/arc-base/arc-base-0.0.1-r340.ebuild
new file mode 100644
index 0000000..117efa2
--- /dev/null
+++ b/chromeos-base/arc-base/arc-base-0.0.1-r340.ebuild
@@ -0,0 +1,98 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "db01bef3f173c69a40670602345d43fe22b6e43a" "e854d2326138b30cc4e6f04570f2c8f50e2dfa80" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/container-bundle arc/scripts .gn"
+
+inherit cros-workon user
+
+DESCRIPTION="Container to run Android."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/container-bundle"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+IUSE="
+	android-container-pi
+	arcpp
+	arcvm
+	"
+
+REQUIRED_USE="|| ( arcpp arcvm )"
+
+RDEPEND="!<chromeos-base/chromeos-cheets-scripts-0.0.3"
+DEPEND="${RDEPEND}"
+
+CONTAINER_ROOTFS="/opt/google/containers/android/rootfs"
+
+src_install() {
+	# Redirect ARC and ARCVM logs to arc.log.
+	insinto /etc/rsyslog.d
+	doins arc/scripts/rsyslog.arc.conf
+
+	if use arcpp; then
+		insinto /opt/google/containers/android
+		if use android-container-pi; then
+			doins arc/container-bundle/pi/config.json
+		else
+			echo "Unknown container version" >&2
+			exit 1
+		fi
+
+		# Install scripts.
+		insinto /etc/sysctl.d
+		doins arc/scripts/01-sysctl-arc.conf
+
+		# Install exception file for FIFO blocking policy on stateful partition.
+		insinto /usr/share/cros/startup/fifo_exceptions
+		doins arc/container-bundle/arc-fifo-exceptions.txt
+
+		# Install exception file for symlink blocking policy on stateful partition.
+		insinto /usr/share/cros/startup/symlink_exceptions
+		doins arc/container-bundle/arc-symlink-exceptions.txt
+	fi
+}
+
+pkg_preinst() {
+	# ARCVM also needs these users on the host side for proper ugid remapping.
+	enewuser "wayland"
+	enewgroup "wayland"
+	enewuser "arc-bridge"
+	enewgroup "arc-bridge"
+	enewuser "android-root"
+	enewgroup "android-root"
+	enewgroup "arc-sensor"
+	enewgroup "android-everybody"
+	enewgroup "android-reserved-disk"
+}
+
+pkg_postinst() {
+	if use arcpp; then
+		local root_uid=$(egetent passwd android-root | cut -d: -f3)
+		local root_gid=$(egetent group android-root | cut -d: -f3)
+
+		# Create a rootfs directory, and then a subdirectory mount point. We
+		# use 0500 for CONTAINER_ROOTFS instead of 0555 so that non-system
+		# processes running outside the container don't start depending on
+		# files in system.raw.img.
+		# These are created here rather than at
+		# install because some of them may already exist and have mounts.
+		install -d --mode=0500 "--owner=${root_uid}" "--group=${root_gid}" \
+			"${ROOT}${CONTAINER_ROOTFS}" \
+			|| true
+		# This CONTAINER_ROOTFS/root directory works as a mount point for
+		# system.raw.img, and once it's mounted, the image's root directory's
+		# permissions override the mode, owner, and group mkdir sets here.
+		mkdir -p "${ROOT}${CONTAINER_ROOTFS}/root" || true
+		install -d --mode=0500 "--owner=${root_uid}" "--group=${root_gid}" \
+			"${ROOT}${CONTAINER_ROOTFS}/android-data" \
+			|| true
+	fi
+}
diff --git a/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r104.ebuild b/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r104.ebuild
deleted file mode 100644
index e923fa6..0000000
--- a/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r104.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "569dbe30775407ebff384419f65741554131d462" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/scripts .gn"
-
-inherit cros-workon
-
-DESCRIPTION="ARC++/ARCVM common scripts."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/scripts"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-IUSE="arcvm arcpp"
-RDEPEND="app-misc/jq"
-DEPEND=""
-
-src_install() {
-	if use arcpp; then
-		dosbin arc/scripts/android-sh
-	fi
-	if use arcvm; then
-		newsbin arc/scripts/android-sh-vm android-sh
-	fi
-
-	insinto /etc/init
-	doins arc/scripts/arc-remove-data.conf
-	doins arc/scripts/arc-stale-directory-remover.conf
-}
diff --git a/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r125.ebuild b/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r125.ebuild
new file mode 100644
index 0000000..abd86d9
--- /dev/null
+++ b/chromeos-base/arc-common-scripts/arc-common-scripts-0.0.1-r125.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e854d2326138b30cc4e6f04570f2c8f50e2dfa80" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/scripts .gn"
+
+inherit cros-workon
+
+DESCRIPTION="ARC++/ARCVM common scripts."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/scripts"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+IUSE="arcvm arcpp"
+RDEPEND="app-misc/jq"
+DEPEND=""
+
+src_install() {
+	if use arcpp; then
+		dosbin arc/scripts/android-sh
+	fi
+	if use arcvm; then
+		newsbin arc/scripts/android-sh-vm android-sh
+	fi
+
+	insinto /etc/init
+	doins arc/scripts/arc-remove-data.conf
+	doins arc/scripts/arc-stale-directory-remover.conf
+}
diff --git a/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-0.0.1-r7.ebuild b/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-0.0.1-r7.ebuild
new file mode 100644
index 0000000..42cd1e76
--- /dev/null
+++ b/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-0.0.1-r7.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "b5506183f669d3ac351bc7584751f332a238c6e8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+inherit cros-constants
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk arc/data-snapshotd .gn"
+
+PLATFORM_SUBDIR="arc/data-snapshotd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARC data snapshotd daemon in Chrome OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/data-snapshotd"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/minijail:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	insinto /etc/init
+	doins init/arc-data-snapshotd.conf
+
+	# Install DBUS configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.ArcDataSnapshotd.conf
+	doins dbus/ArcDataSnapshotdUpstart.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins \
+		"seccomp/arc-data-snapshotd-seccomp-${ARCH}.policy" \
+		arc-data-snapshotd-seccomp.policy
+
+	dobin "${OUT}/arc-data-snapshotd"
+}
+
+pkg_preinst() {
+	enewuser "arc-data-snapshotd"
+	enewgroup "arc-data-snapshotd"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/arc-data-snapshotd_test"
+}
diff --git a/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-9999.ebuild b/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-9999.ebuild
new file mode 100644
index 0000000..0decc52
--- /dev/null
+++ b/chromeos-base/arc-data-snapshotd/arc-data-snapshotd-9999.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit cros-constants
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk arc/data-snapshotd .gn"
+
+PLATFORM_SUBDIR="arc/data-snapshotd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARC data snapshotd daemon in Chrome OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/data-snapshotd"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/minijail:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	insinto /etc/init
+	doins init/arc-data-snapshotd.conf
+
+	# Install DBUS configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.ArcDataSnapshotd.conf
+	doins dbus/ArcDataSnapshotdUpstart.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins \
+		"seccomp/arc-data-snapshotd-seccomp-${ARCH}.policy" \
+		arc-data-snapshotd-seccomp.policy
+
+	dobin "${OUT}/arc-data-snapshotd"
+}
+
+pkg_preinst() {
+	enewuser "arc-data-snapshotd"
+	enewgroup "arc-data-snapshotd"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/arc-data-snapshotd_test"
+}
diff --git a/chromeos-base/arc-host-clock-service/arc-host-clock-service-0.0.1-r6.ebuild b/chromeos-base/arc-host-clock-service/arc-host-clock-service-0.0.1-r6.ebuild
new file mode 100644
index 0000000..ac1a479d
--- /dev/null
+++ b/chromeos-base/arc-host-clock-service/arc-host-clock-service-0.0.1-r6.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "16dee0336113553f488cfba1cd0cd13b84b8870f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/host_clock .gn"
+
+PLATFORM_SUBDIR="arc/vm/host_clock"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARC host clock service"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/vm/host_clock"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api
+"
+
+src_install() {
+	dobin "${OUT}"/arc-host-clock-service
+
+	insinto /etc/init
+	doins arc-host-clock-service.conf
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.ArcHostClockService.conf
+}
+
+pkg_preinst() {
+	enewuser "arc-host-clock"
+	enewgroup "arc-host-clock"
+}
diff --git a/chromeos-base/arc-host-clock-service/arc-host-clock-service-9999.ebuild b/chromeos-base/arc-host-clock-service/arc-host-clock-service-9999.ebuild
new file mode 100644
index 0000000..80fc509
--- /dev/null
+++ b/chromeos-base/arc-host-clock-service/arc-host-clock-service-9999.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/host_clock .gn"
+
+PLATFORM_SUBDIR="arc/vm/host_clock"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARC host clock service"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/vm/host_clock"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+
+RDEPEND="
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api
+"
+
+src_install() {
+	dobin "${OUT}"/arc-host-clock-service
+
+	insinto /etc/init
+	doins arc-host-clock-service.conf
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.ArcHostClockService.conf
+}
+
+pkg_preinst() {
+	enewuser "arc-host-clock"
+	enewgroup "arc-host-clock"
+}
\ No newline at end of file
diff --git a/chromeos-base/arc-keymaster/Manifest b/chromeos-base/arc-keymaster/Manifest
index c51b980..ee1d7ff 100644
--- a/chromeos-base/arc-keymaster/Manifest
+++ b/chromeos-base/arc-keymaster/Manifest
@@ -1 +1 @@
-DIST boringssl-3359.tar.gz 13600709 SHA256 b455f42162947361d8f5c88477c13ff2f3106cff3981553bf76e2de8f4fe265d SHA512 7113869a84af2cc2d2cc02fd1461fc3733fb3448a2857b385d4910e1975864eb52d3744c12f36b53d39add0f51829161991ee354317d0ea353b114217b8f2a43 WHIRLPOOL b4d78a6862ddfa2fd5fc86e5c30dcbc80e87cf2db637f4ab8abd625bbbd6f091c046bf5191f52eca689b230c36b2baca39022c5c3bb453d67eabebce7437ae73
+DIST boringssl-430a7423039682e4bbc7b522e3b57b2c8dca5e3b.tar.gz 26746751 BLAKE2B 301eb82d7f46612285b133ecde4ecdf75a15b25559c418585a36721b3d33beca51740dd6d3c9b869ebcc6311591a1d4123e345f92b3f33ac50fbf8dffdc67da1 SHA512 4ccde2f9ac6e1ae7d996cc2039babe359946fb9a490f5f186d1559d4592025edbcb19959e4c1258ed7e5519f49b471b0c7296316a6752f2875e0d70c71723164
diff --git a/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r155.ebuild b/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r155.ebuild
deleted file mode 100644
index 777a424..0000000
--- a/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r155.ebuild
+++ /dev/null
@@ -1,144 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("17849843254584b4fcdd31a7b3530ab37eb4d54c" "49dfc58d6c4c66f5d0b0d06f0161da4e602a1293")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a20e7828b56799e02ff03478691402713f90a094" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "6dbc19849752c206e135ab59349ebb1cc62bb435")
-inherit cros-constants
-
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT=("chromiumos/platform2" "platform/system/keymaster")
-CROS_WORKON_REPO=(
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_AOSP_URL}"
-)
-CROS_WORKON_EGIT_BRANCH=("master" "pie-release")
-CROS_WORKON_LOCALNAME=("platform2" "aosp/system/keymaster")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/aosp/system/keymaster")
-CROS_WORKON_SUBTREE=("common-mk arc/keymaster .gn" "")
-
-PLATFORM_SUBDIR="arc/keymaster"
-
-# This BoringSSL integration follows go/boringssl-cros.
-# DO NOT COPY TO OTHER PACKAGES WITHOUT CONSULTING SECURITY TEAM.
-BORINGSSL_PN="boringssl"
-BORINGSSL_PV="3359"
-BORINGSSL_P="${BORINGSSL_PN}-${BORINGSSL_PV}"
-BORINGSSL_OUTDIR="${WORKDIR}/boringssl_outputs/"
-
-CMAKE_USE_DIR="${WORKDIR}/${BORINGSSL_P}"
-BUILD_DIR="${WORKDIR}/${BORINGSSL_P}_build"
-
-inherit flag-o-matic cmake-utils cros-workon platform user
-
-DESCRIPTION="Android keymaster service in Chrome OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/keymaster"
-SRC_URI="https://github.com/google/${BORINGSSL_PN}/archive/${BORINGSSL_PV}.tar.gz -> ${BORINGSSL_P}.tar.gz"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+seccomp"
-
-RDEPEND="
-	chromeos-base/chaps:=
-	chromeos-base/cryptohome:=
-	chromeos-base/minijail:=
-	dev-libs/protobuf:=
-"
-
-DEPEND="
-	${RDEPEND}
-	chromeos-base/session_manager-client:=
-	chromeos-base/system_api:=
-"
-
-HEADER_TAINT="#ifdef CHROMEOS_OPENSSL_IS_OPENSSL
-#error \"Do not mix OpenSSL and BoringSSL headers.\"
-#endif
-#define CHROMEOS_OPENSSL_IS_BORINGSSL\n"
-
-src_unpack() {
-	platform_src_unpack
-	unpack "${BORINGSSL_P}.tar.gz"
-	# Taint BoringSSL headers so they don't silently mix with OpenSSL.
-	find "${BORINGSSL_P}/include/openssl" -type f -exec awk -i inplace -v \
-		"taint=${HEADER_TAINT}" 'NR == 1 {print taint} {print}' {} \;
-}
-
-src_prepare() {
-	cmake-utils_src_prepare
-
-	# Expose libhardware headers from arc-toolchain-p.
-	local arc_arch="${ARCH}"
-	# arm needs to use arm64 directory, which provides combined arm/arm64
-	# headers.
-	if [[ "${ARCH}" == "arm" ]]; then
-		arc_arch="arm64"
-	fi
-	mkdir -p "${WORKDIR}/libhardware/include" || die
-	cp -rfp "/opt/android-p/${arc_arch}/usr/include/hardware" "${WORKDIR}/libhardware/include" || die
-	append-cxxflags "-I${WORKDIR}/libhardware/include"
-
-	# Expose BoringSSL headers and outputs.
-	append-cxxflags "-I${WORKDIR}/${BORINGSSL_P}/include"
-	append-ldflags "-L${BORINGSSL_OUTDIR}"
-	# Backport clang fallthru patches to fix newer clang builds.
-	# https://boringssl-review.googlesource.com/c/boringssl/+/37244
-	# https://boringssl-review.googlesource.com/c/boringssl/+/37247
-	cd "${WORKDIR}/${BORINGSSL_P}" || die
-	epatch "${FILESDIR}"/boringssl-clang-fallthru.patch
-	# Verify upstream hasn't changed relevant context code.
-	cd "${WORKDIR}/${P}/aosp/system/keymaster" || die
-	EPATCH_OPTS="--dry-run" epatch "${FILESDIR}/keymaster-context-hooks.patch"
-}
-
-src_configure() {
-	local mycmakeargs=(
-		"-DCMAKE_BUILD_TYPE=Release"
-		"-DCMAKE_SYSTEM_PROCESSOR=${CHOST%%-*}"
-		"-DBUILD_SHARED_LIBS=OFF"
-	)
-	cmake-utils_src_configure
-	platform_src_configure
-}
-
-src_compile() {
-	# Compile BoringSSL and expose libcrypto.a.
-	cmake-utils_src_compile
-	mkdir -p "${BORINGSSL_OUTDIR}" || die
-	cp -p "${BUILD_DIR}/crypto/libcrypto.a" "${BORINGSSL_OUTDIR}/libboringcrypto.a" || die
-
-	platform_src_compile
-}
-
-src_install() {
-	insinto /etc/init
-	doins init/arc-keymasterd.conf
-
-	# Install DBUS configuration file.
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.ArcKeymaster.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	use seccomp && newins \
-		"seccomp/arc-keymasterd-seccomp-${ARCH}.policy" \
-		arc-keymasterd-seccomp.policy
-
-	# Install shared libs and binary.
-	dolib.so "${OUT}/lib/libarckeymaster_context.so"
-	dolib.so "${OUT}/lib/libkeymaster.so"
-	dosbin "${OUT}/arc-keymasterd"
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_keymasterd_fuzzer
-}
-
-pkg_preinst() {
-	enewuser "arc-keymasterd"
-	enewgroup "arc-keymasterd"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/arc-keymasterd_testrunner"
-}
diff --git a/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r179.ebuild b/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r179.ebuild
new file mode 100644
index 0000000..d4a000d
--- /dev/null
+++ b/chromeos-base/arc-keymaster/arc-keymaster-0.0.1-r179.ebuild
@@ -0,0 +1,145 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("e1d925928694859c658d78e230af08e834c174ab" "49dfc58d6c4c66f5d0b0d06f0161da4e602a1293")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "8e20bb2f75d932f889b631c1680e6e4b1887f23a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "6dbc19849752c206e135ab59349ebb1cc62bb435")
+inherit cros-constants
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT=("chromiumos/platform2" "platform/system/keymaster")
+CROS_WORKON_REPO=(
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_AOSP_URL}"
+)
+CROS_WORKON_EGIT_BRANCH=("master" "pie-release")
+CROS_WORKON_LOCALNAME=("platform2" "aosp/system/keymaster")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/aosp/system/keymaster")
+CROS_WORKON_SUBTREE=("common-mk arc/keymaster .gn" "")
+
+PLATFORM_SUBDIR="arc/keymaster"
+
+# This BoringSSL integration follows go/boringssl-cros.
+# DO NOT COPY TO OTHER PACKAGES WITHOUT CONSULTING SECURITY TEAM.
+BORINGSSL_PN="boringssl"
+BORINGSSL_PV="430a7423039682e4bbc7b522e3b57b2c8dca5e3b"
+BORINGSSL_P="${BORINGSSL_PN}-${BORINGSSL_PV}"
+BORINGSSL_OUTDIR="${WORKDIR}/boringssl_outputs/"
+
+CMAKE_USE_DIR="${WORKDIR}/${BORINGSSL_P}"
+BUILD_DIR="${WORKDIR}/${BORINGSSL_P}_build"
+
+inherit flag-o-matic cmake-utils cros-workon platform user
+
+DESCRIPTION="Android keymaster service in Chrome OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/keymaster"
+SRC_URI="https://github.com/google/${BORINGSSL_PN}/archive/${BORINGSSL_PV}.tar.gz -> ${BORINGSSL_P}.tar.gz"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/chaps:=
+	chromeos-base/cryptohome:=
+	chromeos-base/minijail:=
+	dev-libs/protobuf:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/session_manager-client:=
+	chromeos-base/system_api:=
+"
+
+HEADER_TAINT="#ifdef CHROMEOS_OPENSSL_IS_OPENSSL
+#error \"Do not mix OpenSSL and BoringSSL headers.\"
+#endif
+#define CHROMEOS_OPENSSL_IS_BORINGSSL\n"
+
+src_unpack() {
+	platform_src_unpack
+	unpack "${BORINGSSL_P}.tar.gz"
+	# Taint BoringSSL headers so they don't silently mix with OpenSSL.
+	find "${BORINGSSL_P}/include/openssl" -type f -exec awk -i inplace -v \
+		"taint=${HEADER_TAINT}" 'NR == 1 {print taint} {print}' {} \;
+}
+
+src_prepare() {
+	cmake-utils_src_prepare
+
+	# Expose libhardware headers from arc-toolchain-p.
+	local arc_arch="${ARCH}"
+	# arm needs to use arm64 directory, which provides combined arm/arm64
+	# headers.
+	if [[ "${ARCH}" == "arm" ]]; then
+		arc_arch="arm64"
+	fi
+	mkdir -p "${WORKDIR}/libhardware/include" || die
+	cp -rfp "/opt/android-p/${arc_arch}/usr/include/hardware" "${WORKDIR}/libhardware/include" || die
+	append-cxxflags "-I${WORKDIR}/libhardware/include"
+
+	# Expose BoringSSL headers and outputs.
+	append-cxxflags "-I${WORKDIR}/${BORINGSSL_P}/include"
+	append-ldflags "-L${BORINGSSL_OUTDIR}"
+	# Verify upstream hasn't changed relevant context code.
+	cd "${WORKDIR}/${P}/aosp/system/keymaster" || die
+	eapply --dry-run "${FILESDIR}/keymaster-context-hooks.patch"
+	# Fix C++17 compilation. Can be removed once we update to newer version of
+	# keymaster that contains https://r.android.com/1412947.
+	cd "${WORKDIR}/${P}/aosp/system/keymaster" || die
+	eapply "${FILESDIR}/0001-keymaster-fix-C-17-compilation.patch"
+	# Make P Keymaster compatible with latest BoringSSL.
+	eapply "${FILESDIR}/keymaster-boringssl-update.patch"
+}
+
+src_configure() {
+	local mycmakeargs=(
+		"-DCMAKE_BUILD_TYPE=Release"
+		"-DCMAKE_SYSTEM_PROCESSOR=${CHOST%%-*}"
+		"-DBUILD_SHARED_LIBS=OFF"
+	)
+	cmake-utils_src_configure
+	platform_src_configure
+}
+
+src_compile() {
+	# Compile BoringSSL and expose libcrypto.a.
+	cmake-utils_src_compile
+	mkdir -p "${BORINGSSL_OUTDIR}" || die
+	cp -p "${BUILD_DIR}/crypto/libcrypto.a" "${BORINGSSL_OUTDIR}/libboringcrypto.a" || die
+
+	platform_src_compile
+}
+
+src_install() {
+	insinto /etc/init
+	doins init/arc-keymasterd.conf
+
+	# Install DBUS configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.ArcKeymaster.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins \
+		"seccomp/arc-keymasterd-seccomp-${ARCH}.policy" \
+		arc-keymasterd-seccomp.policy
+
+	# Install shared libs and binary.
+	dolib.so "${OUT}/lib/libarckeymaster_context.so"
+	dolib.so "${OUT}/lib/libkeymaster.so"
+	dosbin "${OUT}/arc-keymasterd"
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_keymasterd_fuzzer
+}
+
+pkg_preinst() {
+	enewuser "arc-keymasterd"
+	enewgroup "arc-keymasterd"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/arc-keymasterd_testrunner"
+}
diff --git a/chromeos-base/arc-keymaster/arc-keymaster-9999.ebuild b/chromeos-base/arc-keymaster/arc-keymaster-9999.ebuild
index 89e01ef..31e847a 100644
--- a/chromeos-base/arc-keymaster/arc-keymaster-9999.ebuild
+++ b/chromeos-base/arc-keymaster/arc-keymaster-9999.ebuild
@@ -21,7 +21,7 @@
 # This BoringSSL integration follows go/boringssl-cros.
 # DO NOT COPY TO OTHER PACKAGES WITHOUT CONSULTING SECURITY TEAM.
 BORINGSSL_PN="boringssl"
-BORINGSSL_PV="3359"
+BORINGSSL_PV="430a7423039682e4bbc7b522e3b57b2c8dca5e3b"
 BORINGSSL_P="${BORINGSSL_PN}-${BORINGSSL_PV}"
 BORINGSSL_OUTDIR="${WORKDIR}/boringssl_outputs/"
 
@@ -81,14 +81,15 @@
 	# Expose BoringSSL headers and outputs.
 	append-cxxflags "-I${WORKDIR}/${BORINGSSL_P}/include"
 	append-ldflags "-L${BORINGSSL_OUTDIR}"
-	# Backport clang fallthru patches to fix newer clang builds.
-	# https://boringssl-review.googlesource.com/c/boringssl/+/37244
-	# https://boringssl-review.googlesource.com/c/boringssl/+/37247
-	cd "${WORKDIR}/${BORINGSSL_P}" || die
-	epatch "${FILESDIR}"/boringssl-clang-fallthru.patch
 	# Verify upstream hasn't changed relevant context code.
 	cd "${WORKDIR}/${P}/aosp/system/keymaster" || die
-	EPATCH_OPTS="--dry-run" epatch "${FILESDIR}/keymaster-context-hooks.patch"
+	eapply --dry-run "${FILESDIR}/keymaster-context-hooks.patch"
+	# Fix C++17 compilation. Can be removed once we update to newer version of
+	# keymaster that contains https://r.android.com/1412947.
+	cd "${WORKDIR}/${P}/aosp/system/keymaster" || die
+	eapply "${FILESDIR}/0001-keymaster-fix-C-17-compilation.patch"
+	# Make P Keymaster compatible with latest BoringSSL.
+	eapply "${FILESDIR}/keymaster-boringssl-update.patch"
 }
 
 src_configure() {
diff --git a/chromeos-base/arc-keymaster/files/0001-keymaster-fix-C-17-compilation.patch b/chromeos-base/arc-keymaster/files/0001-keymaster-fix-C-17-compilation.patch
new file mode 100644
index 0000000..5d88479
--- /dev/null
+++ b/chromeos-base/arc-keymaster/files/0001-keymaster-fix-C-17-compilation.patch
@@ -0,0 +1,53 @@
+From 126a0ce055a9e894b1a512954f0328f04e2ec314 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tomhughes@chromium.org>
+Date: Thu, 17 Sep 2020 16:28:48 +0000
+Subject: [PATCH] keymaster: fix C++17 compilation
+
+keymaster has been fixed upstream (https://r.android.com/1412947), but
+the pie-release branch that we're using is no longer accepting changes,
+so we need to manually patch for now.
+
+BUG=b:162949739
+TEST=emerge-volteer arc-keymaster
+
+Change-Id: I8ba9d6e4d986b3a5275cc85faee5f5576d5cb3d9
+---
+ android_keymaster/keymaster_stl.cpp | 4 ++--
+ include/keymaster/new               | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/android_keymaster/keymaster_stl.cpp b/android_keymaster/keymaster_stl.cpp
+index a18823c..0f9c50f 100644
+--- a/android_keymaster/keymaster_stl.cpp
++++ b/android_keymaster/keymaster_stl.cpp
+@@ -24,10 +24,10 @@ struct nothrow_t {};
+ 
+ const std::nothrow_t __attribute__((weak)) std::nothrow = {};
+ 
+-void* __attribute__((weak)) operator new(size_t __sz, const std::nothrow_t&) {
++void* __attribute__((weak)) operator new(size_t __sz, const std::nothrow_t&) noexcept {
+     return malloc(__sz);
+ }
+-void* __attribute__((weak)) operator new[](size_t __sz, const std::nothrow_t&) {
++void* __attribute__((weak)) operator new[](size_t __sz, const std::nothrow_t&) noexcept {
+     return malloc(__sz);
+ }
+ 
+diff --git a/include/keymaster/new b/include/keymaster/new
+index 7ffedee..4189ead 100644
+--- a/include/keymaster/new
++++ b/include/keymaster/new
+@@ -24,8 +24,8 @@ namespace std {
+ struct nothrow_t;
+ extern const nothrow_t nothrow;
+ }
+-void* operator new(size_t __sz, const std::nothrow_t&);
+-void* operator new[](size_t __sz, const std::nothrow_t&);
++void* operator new(size_t __sz, const std::nothrow_t&) noexcept;
++void* operator new[](size_t __sz, const std::nothrow_t&) noexcept;
+ void operator delete(void* ptr);
+ void operator delete[](void* ptr);
+ 
+-- 
+2.26.2
+
diff --git a/chromeos-base/arc-keymaster/files/boringssl-clang-fallthru.patch b/chromeos-base/arc-keymaster/files/boringssl-clang-fallthru.patch
deleted file mode 100644
index 46ec9ad..0000000
--- a/chromeos-base/arc-keymaster/files/boringssl-clang-fallthru.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-Backport boringssl patches to fix clang fall through warnings.
-https://boringssl-review.googlesource.com/c/boringssl/+/37244
-https://boringssl-review.googlesource.com/c/boringssl/+/37247
-
-Author: Manoj Gupta <manojgupta@google.com>
-Date:   Mon Aug 26 09:13:58 2019 -0700
-
-    Add Fallthru support for clang 10.
-    
-    clang has gained supoprted for __attribute__ ((fallthrough))
-    in https://reviews.llvm.org/rL369414.
-    Detect the support in clang and enable it as OPENSSL_FALLTHROUGH.
-    This is needed to fix ToT clang builds.
-    
-    Bug: chromium:997709
-    Test: CQ
-    Change-Id: Iefa17687f6b5e8c95f359f167e9049d9a69c5302
-
-diff --git a/crypto/internal.h b/crypto/internal.h
-index 52799e899..92f5313f1 100644
---- a/crypto/internal.h
-+++ b/crypto/internal.h
-@@ -187,6 +187,12 @@ typedef __uint128_t uint128_t;
- #define OPENSSL_FALLTHROUGH [[gnu::fallthrough]]
- #elif defined(__GNUC__) && __GNUC__ >= 7 // gcc 7
- #define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough))
-+#elif defined(__clang__)
-+#if __has_attribute(fallthrough)
-+#define OPENSSL_FALLTHROUGH __attribute__ ((fallthrough))
-+#else // clang versions that do not support fallthrough.
-+#define OPENSSL_FALLTHROUGH
-+#endif
- #else // C++11 on gcc 6, and all other cases
- #define OPENSSL_FALLTHROUGH
- #endif
-diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c
-index d89ec8a73..3722a5191 100644
---- a/crypto/asn1/tasn_enc.c
-+++ b/crypto/asn1/tasn_enc.c
-@@ -192,7 +192,7 @@ int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
-         /* Use indefinite length constructed if requested */
-         if (aclass & ASN1_TFLG_NDEF)
-             ndef = 2;
--        /* fall through */
-+        OPENSSL_FALLTHROUGH;
- 
-     case ASN1_ITYPE_SEQUENCE:
-         i = asn1_enc_restore(&seqcontlen, out, pval, it);
-diff --git a/crypto/fipsmodule/cipher/cipher.c b/crypto/fipsmodule/cipher/cipher.c
-index 39e038beb..d0682ab37 100644
---- a/crypto/fipsmodule/cipher/cipher.c
-+++ b/crypto/fipsmodule/cipher/cipher.c
-@@ -191,7 +191,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
- 
-       case EVP_CIPH_CFB_MODE:
-         ctx->num = 0;
--        // fall-through
-+        OPENSSL_FALLTHROUGH;
- 
-       case EVP_CIPH_CBC_MODE:
-         assert(EVP_CIPHER_CTX_iv_length(ctx) <= sizeof(ctx->iv));
- 
diff --git a/chromeos-base/arc-keymaster/files/keymaster-boringssl-update.patch b/chromeos-base/arc-keymaster/files/keymaster-boringssl-update.patch
new file mode 100644
index 0000000..4363989
--- /dev/null
+++ b/chromeos-base/arc-keymaster/files/keymaster-boringssl-update.patch
@@ -0,0 +1,33 @@
+Make Keymaster compatible with latest BoringSSL.
+
+https://r.android.com/1088109
+
+diff --git a/include/keymaster/km_openssl/openssl_utils.h b/include/keymaster/km_openssl/openssl_utils.h
+index 8586b35..4483045 100644
+--- a/include/keymaster/km_openssl/openssl_utils.h
++++ b/include/keymaster/km_openssl/openssl_utils.h
+@@ -42,12 +42,13 @@ class EvpMdCtxCleaner {
+     EVP_MD_CTX* ctx_;
+ };
+ 
+-template <typename T, void (*FreeFunc)(T*)> struct OpenSslObjectDeleter {
++template <typename T, typename FreeFuncRet, FreeFuncRet (*FreeFunc)(T*)>
++struct OpenSslObjectDeleter {
+     void operator()(T* p) { FreeFunc(p); }
+ };
+ 
+ #define DEFINE_OPENSSL_OBJECT_POINTER(name)                                                        \
+-    typedef OpenSslObjectDeleter<name, name##_free> name##_Delete;                                 \
++    typedef OpenSslObjectDeleter<name, decltype(name##_free(nullptr)), name##_free> name##_Delete; \
+     typedef UniquePtr<name, name##_Delete> name##_Ptr;
+ 
+ DEFINE_OPENSSL_OBJECT_POINTER(ASN1_BIT_STRING)
+@@ -67,7 +68,7 @@ DEFINE_OPENSSL_OBJECT_POINTER(X509)
+ DEFINE_OPENSSL_OBJECT_POINTER(X509_EXTENSION)
+ DEFINE_OPENSSL_OBJECT_POINTER(X509_NAME)
+ 
+-typedef OpenSslObjectDeleter<BIGNUM, BN_free> BIGNUM_Delete;
++typedef OpenSslObjectDeleter<BIGNUM, void, BN_free> BIGNUM_Delete;
+ typedef UniquePtr<BIGNUM, BIGNUM_Delete> BIGNUM_Ptr;
+ 
+ keymaster_error_t ec_get_group_size(const EC_GROUP* group, size_t* key_size_bits);
diff --git a/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r125.ebuild b/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r125.ebuild
deleted file mode 100644
index d47d1c6..0000000
--- a/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r125.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7cd3aa8e49fcb501797fc2d50cf36fe52964dcde" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/myfiles .gn"
-
-inherit cros-workon
-
-DESCRIPTION="Container to run Android's MyFiles daemon."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/myfiles"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="chromeos-base/mount-passthrough
-	!<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
-"
-
-src_install() {
-	insinto /etc/init
-	doins arc/myfiles/arc-myfiles.conf
-	doins arc/myfiles/arc-myfiles-default.conf
-	doins arc/myfiles/arc-myfiles-read.conf
-	doins arc/myfiles/arc-myfiles-write.conf
-}
diff --git a/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r148.ebuild b/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r148.ebuild
new file mode 100644
index 0000000..e1f0d79
--- /dev/null
+++ b/chromeos-base/arc-myfiles/arc-myfiles-0.0.1-r148.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ffb2f47956ef0968f7461744ad1e8098dbc6b37c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/myfiles .gn"
+
+inherit cros-workon
+
+DESCRIPTION="Container to run Android's MyFiles daemon."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/myfiles"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="chromeos-base/mount-passthrough
+	!<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
+"
+
+src_install() {
+	insinto /etc/init
+	doins arc/myfiles/arc-myfiles.conf
+	doins arc/myfiles/arc-myfiles-default.conf
+	doins arc/myfiles/arc-myfiles-read.conf
+	doins arc/myfiles/arc-myfiles-write.conf
+}
diff --git a/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r373.ebuild b/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r373.ebuild
deleted file mode 100644
index 34a219d..0000000
--- a/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r373.ebuild
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "eb321caa48fe66d57214d4c04fa9ca2b865155eb" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/obb-mounter .gn"
-
-PLATFORM_SUBDIR="arc/obb-mounter"
-
-inherit cros-workon platform
-
-DESCRIPTION="D-Bus service to mount OBB files"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/obb-mounter"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	sys-fs/fuse:=
-	sys-libs/libcap:=
-"
-
-DEPEND="${RDEPEND}"
-
-BDEPEND="
-	virtual/pkgconfig
-"
-
-
-CONTAINER_DIR="/opt/google/containers/arc-obb-mounter"
-
-src_install() {
-	dobin "${OUT}"/arc-obb-mounter
-	dobin "${OUT}"/mount-obb
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.ArcObbMounter.conf
-
-	insinto /etc/init
-	doins init/arc-obb-mounter.conf
-
-	insinto "${CONTAINER_DIR}"
-	doins "${OUT}"/rootfs.squashfs
-
-	# Keep the parent directory of mountpoints inaccessible from non-root
-	# users because mountpoints themselves are often world-readable but we
-	# do not want to expose them.
-	# container-root is where the root filesystem of the container in which
-	# arc-obb-mounter daemon runs is mounted.
-	diropts --mode=0700 --owner=root --group=root
-	keepdir "${CONTAINER_DIR}"/mountpoints/
-	keepdir "${CONTAINER_DIR}"/mountpoints/container-root
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/mount-obb_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/arc-obb-mounter_testrunner"
-}
diff --git a/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r397.ebuild b/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r397.ebuild
new file mode 100644
index 0000000..1e222d4
--- /dev/null
+++ b/chromeos-base/arc-obb-mounter/arc-obb-mounter-0.0.2-r397.ebuild
@@ -0,0 +1,65 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2b3a34a1269aa84a1014ce2ae0fe33d3fd498a97" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/obb-mounter .gn"
+
+PLATFORM_SUBDIR="arc/obb-mounter"
+
+inherit cros-workon platform
+
+DESCRIPTION="D-Bus service to mount OBB files"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/obb-mounter"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	sys-fs/fuse:=
+	sys-libs/libcap:=
+"
+
+DEPEND="${RDEPEND}"
+
+BDEPEND="
+	virtual/pkgconfig
+"
+
+
+CONTAINER_DIR="/opt/google/containers/arc-obb-mounter"
+
+src_install() {
+	dobin "${OUT}"/arc-obb-mounter
+	dobin "${OUT}"/mount-obb
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.ArcObbMounter.conf
+
+	insinto /etc/init
+	doins init/arc-obb-mounter.conf
+
+	insinto "${CONTAINER_DIR}"
+	doins "${OUT}"/rootfs.squashfs
+
+	# Keep the parent directory of mountpoints inaccessible from non-root
+	# users because mountpoints themselves are often world-readable but we
+	# do not want to expose them.
+	# container-root is where the root filesystem of the container in which
+	# arc-obb-mounter daemon runs is mounted.
+	diropts --mode=0700 --owner=root --group=root
+	keepdir "${CONTAINER_DIR}"/mountpoints/
+	keepdir "${CONTAINER_DIR}"/mountpoints/container-root
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/mount-obb_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/arc-obb-mounter_testrunner"
+}
diff --git a/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r219.ebuild b/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r219.ebuild
deleted file mode 100644
index 78b8f31..0000000
--- a/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r219.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "65a61cec20faf98439decb1e8c98bbebf9f119e7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/removable-media .gn"
-
-inherit cros-workon
-
-DESCRIPTION="Container to run Android's removable-media daemon."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/removable-media"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="chromeos-base/mount-passthrough
-	!<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
-"
-
-src_install() {
-	insinto /etc/init
-	doins arc/removable-media/arc-removable-media.conf
-	doins arc/removable-media/arc-removable-media-default.conf
-	doins arc/removable-media/arc-removable-media-read.conf
-	doins arc/removable-media/arc-removable-media-write.conf
-}
diff --git a/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r241.ebuild b/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r241.ebuild
new file mode 100644
index 0000000..75b5dfa
--- /dev/null
+++ b/chromeos-base/arc-removable-media/arc-removable-media-0.0.1-r241.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "65a61cec20faf98439decb1e8c98bbebf9f119e7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/removable-media .gn"
+
+inherit cros-workon
+
+DESCRIPTION="Container to run Android's removable-media daemon."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/removable-media"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="chromeos-base/mount-passthrough
+	!<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
+"
+
+src_install() {
+	insinto /etc/init
+	doins arc/removable-media/arc-removable-media.conf
+	doins arc/removable-media/arc-removable-media-default.conf
+	doins arc/removable-media/arc-removable-media-read.conf
+	doins arc/removable-media/arc-removable-media-write.conf
+}
diff --git a/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r220.ebuild b/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r220.ebuild
deleted file mode 100644
index a76e5a9..0000000
--- a/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r220.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "31316a4a1ac841d2bf0c6a247512ab33283a4797" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/sdcard .gn"
-
-PLATFORM_SUBDIR="arc/sdcard"
-
-inherit cros-workon platform
-
-DESCRIPTION="Container to run Android's sdcard daemon."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/sdcard"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="esdfs"
-
-CONTAINER_DIR="/opt/google/containers/arc-sdcard"
-
-RDEPEND="!esdfs? ( chromeos-base/arc-setup )"
-DEPEND="${DEPEND}"
-
-src_install() {
-	if ! use esdfs; then
-		insinto /etc/init
-		doins arc-sdcard.conf
-	fi
-
-	insinto "${CONTAINER_DIR}"
-	doins "${OUT}"/rootfs.squashfs
-
-	# Keep the parent directory of mountpoints inaccessible from non-root
-	# users because mountpoints themselves are often world-readable but we
-	# do not want to expose them.
-	# container-root is where the root filesystem of the container in which
-	# arc-obb-mounter daemon runs is mounted.
-	diropts --mode=0700 --owner=root --group=root
-	keepdir "${CONTAINER_DIR}"/mountpoints/
-	keepdir "${CONTAINER_DIR}"/mountpoints/container-root
-}
diff --git a/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r242.ebuild b/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r242.ebuild
new file mode 100644
index 0000000..2a5eb5a
--- /dev/null
+++ b/chromeos-base/arc-sdcard/arc-sdcard-0.0.1-r242.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "31316a4a1ac841d2bf0c6a247512ab33283a4797" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/sdcard .gn"
+
+PLATFORM_SUBDIR="arc/sdcard"
+
+inherit cros-workon platform
+
+DESCRIPTION="Container to run Android's sdcard daemon."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/sdcard"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="esdfs"
+
+CONTAINER_DIR="/opt/google/containers/arc-sdcard"
+
+RDEPEND="!esdfs? ( chromeos-base/arc-setup )"
+DEPEND="${DEPEND}"
+
+src_install() {
+	if ! use esdfs; then
+		insinto /etc/init
+		doins arc-sdcard.conf
+	fi
+
+	insinto "${CONTAINER_DIR}"
+	doins "${OUT}"/rootfs.squashfs
+
+	# Keep the parent directory of mountpoints inaccessible from non-root
+	# users because mountpoints themselves are often world-readable but we
+	# do not want to expose them.
+	# container-root is where the root filesystem of the container in which
+	# arc-obb-mounter daemon runs is mounted.
+	diropts --mode=0700 --owner=root --group=root
+	keepdir "${CONTAINER_DIR}"/mountpoints/
+	keepdir "${CONTAINER_DIR}"/mountpoints/container-root
+}
diff --git a/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r2.ebuild b/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r2.ebuild
deleted file mode 100644
index bd99949..0000000
--- a/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r2.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="a03737393b6e49061a1a348fc0ab8db344cacbf5"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "0adab83528ae576fefaed84291ea7b275b969bfe" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/sensor_service .gn"
-
-PLATFORM_SUBDIR="arc/vm/sensor_service"
-
-inherit cros-workon platform
-
-DESCRIPTION="ARC sensor service."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/sensor_service"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-"
-
-DEPEND="
-	${RDEPEND}
-"
-
-src_install() {
-	dobin "${OUT}"/arc_sensor_service
-
-	insinto /etc/init
-	doins init/arc-sensor-service.conf
-
-	insinto /etc/dbus-1/system.d
-	doins init/dbus-1/org.chromium.ArcSensorService.conf
-}
diff --git a/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r24.ebuild b/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r24.ebuild
new file mode 100644
index 0000000..5c84dfb
--- /dev/null
+++ b/chromeos-base/arc-sensor-service/arc-sensor-service-0.0.1-r24.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "92a9a97f67e8be63fb16a10b1bd601ed2ed31af3" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/sensor_service .gn"
+
+PLATFORM_SUBDIR="arc/vm/sensor_service"
+
+inherit cros-workon platform
+
+DESCRIPTION="ARC sensor service."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/sensor_service"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+"
+
+DEPEND="
+	${RDEPEND}
+"
+
+src_install() {
+	dobin "${OUT}"/arc_sensor_service
+
+	insinto /etc/init
+	doins init/arc-sensor-service.conf
+
+	insinto /etc/dbus-1/system.d
+	doins init/dbus-1/org.chromium.ArcSensorService.conf
+}
diff --git a/chromeos-base/arc-setup/arc-setup-0.0.1-r1065.ebuild b/chromeos-base/arc-setup/arc-setup-0.0.1-r1065.ebuild
new file mode 100644
index 0000000..30d720a
--- /dev/null
+++ b/chromeos-base/arc-setup/arc-setup-0.0.1-r1065.ebuild
@@ -0,0 +1,134 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "4844e0caa0ec6820875f1dc1b32bcf90b72c1eb3" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk arc/setup chromeos-config metrics .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="arc/setup"
+
+inherit cros-workon platform
+
+DESCRIPTION="Set up environment to run ARC."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/setup"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="
+	arcpp
+	arcvm
+	esdfs
+	fuzzer
+	generated_cros_config
+	houdini
+	houdini64
+	ndk_translation
+	unibuild"
+
+REQUIRED_USE="|| ( arcpp arcvm )"
+
+COMMON_DEPEND="
+	esdfs? ( chromeos-base/arc-sdcard )
+	chromeos-base/bootstat:=
+	chromeos-base/chromeos-config-tools:=
+	chromeos-base/cryptohome-client:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/patchpanel-client:=
+	dev-libs/dbus-glib:=
+	dev-libs/protobuf:=
+	sys-libs/libselinux:=
+	chromeos-base/minijail:=
+"
+
+RDEPEND="${COMMON_DEPEND}
+	chromeos-base/patchpanel
+	arcvm? ( chromeos-base/crosvm )
+	arcpp? (
+		chromeos-base/swap-init
+		esdfs? ( sys-apps/restorecon )
+	)
+"
+
+DEPEND="${COMMON_DEPEND}
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+
+enable_esdfs() {
+	[[ -f "$1" ]] || die
+	local data=$(jq ".USE_ESDFS=true" "$1")
+	echo "${data}" > "$1" || die
+}
+
+
+src_install() {
+	# Used for both ARCVM and ARC.
+	dosbin "${OUT}"/arc-remove-data
+	dosbin "${OUT}"/arc-remove-stale-data
+
+	# Some binaries are only for ARCVM
+	if use arcvm; then
+		dosbin "${OUT}"/arc-apply-per-board-config
+		dosbin "${OUT}"/arc-create-data
+		insinto /etc/init
+		doins etc/arc-create-data.conf
+	fi
+
+	# Other files are only for ARC.
+	if use arcpp; then
+		dosbin "${OUT}"/arc-setup
+		insinto /etc/init
+		doins etc/arc-boot-continue.conf
+		doins etc/arc-kmsg-logger.conf
+		doins etc/arc-lifetime.conf
+		doins etc/arc-sensor.conf
+		doins etc/arc-update-restorecon-last.conf
+		if use esdfs; then
+			doins etc/arc-sdcard.conf
+			doins etc/arc-sdcard-mount.conf
+		fi
+		doins etc/arc-sysctl.conf
+		doins etc/arc-system-mount.conf
+		doins etc/arc-ureadahead.conf
+
+		insinto /usr/share/arc-setup
+		doins etc/config.json
+
+		if use esdfs; then
+			enable_esdfs "${D}/usr/share/arc-setup/config.json"
+		fi
+
+		insinto /opt/google/containers/arc-art
+		doins "${OUT}/dev-rootfs.squashfs"
+
+		# container-root is where the root filesystem of the container in which
+		# patchoat and dex2oat runs is mounted. dev-rootfs is mount point
+		# for squashfs.
+		diropts --mode=0700 --owner=root --group=root
+		keepdir /opt/google/containers/arc-art/mountpoints/container-root
+		keepdir /opt/google/containers/arc-art/mountpoints/dev-rootfs
+		keepdir /opt/google/containers/arc-art/mountpoints/vendor
+
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_setup_util_find_all_properties_fuzzer
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_setup_util_find_fingerprint_and_sdk_version_fuzzer
+	fi
+
+	insinto /etc/dbus-1/system.d
+	doins etc/dbus-1/ArcUpstart.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/arc-setup_testrunner"
+}
diff --git a/chromeos-base/arc-setup/arc-setup-0.0.1-r987.ebuild b/chromeos-base/arc-setup/arc-setup-0.0.1-r987.ebuild
deleted file mode 100644
index 4fa3b7d..0000000
--- a/chromeos-base/arc-setup/arc-setup-0.0.1-r987.ebuild
+++ /dev/null
@@ -1,133 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d2c0ac996da72faaf09614316c1f41c0e859aec7" "6287b0913be5aaea79569d55d989b9b729396f10" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk arc/setup chromeos-config metrics .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="arc/setup"
-
-inherit cros-workon platform
-
-DESCRIPTION="Set up environment to run ARC."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/setup"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="
-	arcpp
-	arcvm
-	esdfs
-	fuzzer
-	generated_cros_config
-	houdini
-	houdini64
-	ndk_translation
-	unibuild"
-
-REQUIRED_USE="|| ( arcpp arcvm )"
-
-COMMON_DEPEND="
-	esdfs? ( chromeos-base/arc-sdcard )
-	chromeos-base/bootstat:=
-	chromeos-base/chromeos-config-tools:=
-	chromeos-base/cryptohome-client:=
-	chromeos-base/metrics:=
-	dev-libs/dbus-glib:=
-	dev-libs/protobuf:=
-	sys-libs/libselinux:=
-	chromeos-base/minijail:=
-"
-
-RDEPEND="${COMMON_DEPEND}
-	chromeos-base/patchpanel
-	arcvm? ( chromeos-base/crosvm )
-	arcpp? (
-		chromeos-base/swap-init
-		esdfs? ( sys-apps/restorecon )
-	)
-"
-
-DEPEND="${COMMON_DEPEND}
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-
-enable_esdfs() {
-	[[ -f "$1" ]] || die
-	local data=$(jq ".USE_ESDFS=true" "$1")
-	echo "${data}" > "$1" || die
-}
-
-
-src_install() {
-	# Used for both ARCVM and ARC.
-	dosbin "${OUT}"/arc-remove-data
-	dosbin "${OUT}"/arc-remove-stale-data
-
-	# Some binaries are only for ARCVM
-	if use arcvm; then
-		dosbin "${OUT}"/arc-apply-per-board-config
-		dosbin "${OUT}"/arc-create-data
-		insinto /etc/init
-		doins etc/arc-create-data.conf
-	fi
-
-	# Other files are only for ARC.
-	if use arcpp; then
-		dosbin "${OUT}"/arc-setup
-		insinto /etc/init
-		doins etc/arc-boot-continue.conf
-		doins etc/arc-kmsg-logger.conf
-		doins etc/arc-lifetime.conf
-		doins etc/arc-sensor.conf
-		doins etc/arc-update-restorecon-last.conf
-		if use esdfs; then
-			doins etc/arc-sdcard.conf
-			doins etc/arc-sdcard-mount.conf
-		fi
-		doins etc/arc-sysctl.conf
-		doins etc/arc-system-mount.conf
-		doins etc/arc-ureadahead.conf
-
-		insinto /usr/share/arc-setup
-		doins etc/config.json
-
-		if use esdfs; then
-			enable_esdfs "${D}/usr/share/arc-setup/config.json"
-		fi
-
-		insinto /opt/google/containers/arc-art
-		doins "${OUT}/dev-rootfs.squashfs"
-
-		# container-root is where the root filesystem of the container in which
-		# patchoat and dex2oat runs is mounted. dev-rootfs is mount point
-		# for squashfs.
-		diropts --mode=0700 --owner=root --group=root
-		keepdir /opt/google/containers/arc-art/mountpoints/container-root
-		keepdir /opt/google/containers/arc-art/mountpoints/dev-rootfs
-		keepdir /opt/google/containers/arc-art/mountpoints/vendor
-
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_setup_util_find_all_properties_fuzzer
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/arc_setup_util_find_fingerprint_and_sdk_version_fuzzer
-	fi
-
-	insinto /etc/dbus-1/system.d
-	doins etc/dbus-1/ArcUpstart.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/arc-setup_testrunner"
-}
diff --git a/chromeos-base/arc-setup/arc-setup-9999.ebuild b/chromeos-base/arc-setup/arc-setup-9999.ebuild
index a41278c..c0922f5 100644
--- a/chromeos-base/arc-setup/arc-setup-9999.ebuild
+++ b/chromeos-base/arc-setup/arc-setup-9999.ebuild
@@ -38,7 +38,8 @@
 	chromeos-base/bootstat:=
 	chromeos-base/chromeos-config-tools:=
 	chromeos-base/cryptohome-client:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/patchpanel-client:=
 	dev-libs/dbus-glib:=
 	dev-libs/protobuf:=
 	sys-libs/libselinux:=
diff --git a/chromeos-base/arc-sslh-init/arc-sslh-init-0.0.1-r14.ebuild b/chromeos-base/arc-sslh-init/arc-sslh-init-0.0.1-r15.ebuild
similarity index 100%
rename from chromeos-base/arc-sslh-init/arc-sslh-init-0.0.1-r14.ebuild
rename to chromeos-base/arc-sslh-init/arc-sslh-init-0.0.1-r15.ebuild
diff --git a/chromeos-base/arc-sslh-init/files/sslh.conf b/chromeos-base/arc-sslh-init/files/sslh.conf
index 452b7cc..460dd1d 100644
--- a/chromeos-base/arc-sslh-init/files/sslh.conf
+++ b/chromeos-base/arc-sslh-init/files/sslh.conf
@@ -21,5 +21,5 @@
 	# NOTE: Config files cannot override protocol verifiers for a hard-coded list
 	# of "name"s in sslh. The full list is defined in sslh's probe.c.
 	{ name: "ssh"; service: "ssh"; host: "localhost"; port: "2222"; probe: "builtin"; },
-	{ name: "adb"; service: "adb"; host: "localhost"; port: "5550"; probe: "builtin"; }
+	{ name: "adb"; service: "adb"; host: "localhost"; port: "5555"; probe: "builtin"; }
 );
diff --git a/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r25.ebuild b/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r25.ebuild
deleted file mode 100644
index c3a0d6f..0000000
--- a/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r25.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a168325216d22eca49bd5430736299e318967f42" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/boot_notification_server .gn"
-
-PLATFORM_SUBDIR="arc/vm/boot_notification_server"
-
-inherit cros-workon platform user
-
-DESCRIPTION="ARCVM boot notification server"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/boot_notification_server"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-SLOT="0/0"
-IUSE="+seccomp"
-
-src_install() {
-	newsbin "${OUT}/boot_notification_server" arcvm_boot_notification_server
-
-	insinto /etc/init
-	doins arcvm-boot-notification-server.conf
-
-	insinto /etc/dbus-1/system.d
-	doins dbus-1/ArcVmBootNotificationServer.conf
-
-	insinto /usr/share/policy
-	use seccomp && newins "arcvm_boot_notification_server-seccomp-${ARCH}.policy" arcvm_boot_notification_server-seccomp.policy
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/boot_notification_server_testrunner"
-}
-
-pkg_preinst() {
-	enewuser arcvm-boot-notification-server
-	enewgroup arcvm-boot-notification-server
-}
diff --git a/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r45.ebuild b/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r45.ebuild
new file mode 100644
index 0000000..e05444d
--- /dev/null
+++ b/chromeos-base/arcvm-boot-notification-server/arcvm-boot-notification-server-0.0.1-r45.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "a168325216d22eca49bd5430736299e318967f42" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/boot_notification_server .gn"
+
+PLATFORM_SUBDIR="arc/vm/boot_notification_server"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARCVM boot notification server"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/boot_notification_server"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+SLOT="0/0"
+IUSE="+seccomp"
+
+src_install() {
+	newsbin "${OUT}/boot_notification_server" arcvm_boot_notification_server
+
+	insinto /etc/init
+	doins arcvm-boot-notification-server.conf
+
+	insinto /etc/dbus-1/system.d
+	doins dbus-1/ArcVmBootNotificationServer.conf
+
+	insinto /usr/share/policy
+	use seccomp && newins "arcvm_boot_notification_server-seccomp-${ARCH}.policy" arcvm_boot_notification_server-seccomp.policy
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/boot_notification_server_testrunner"
+}
+
+pkg_preinst() {
+	enewuser arcvm-boot-notification-server
+	enewgroup arcvm-boot-notification-server
+}
diff --git a/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r48.ebuild b/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r48.ebuild
deleted file mode 100644
index b063198..0000000
--- a/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r48.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="fa2206712ef2681a1decdcf1a32f37a830f24327"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "09a61131ea1838e082971ed646ea21f1ee538934" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/scripts .gn"
-
-inherit cros-workon
-
-DESCRIPTION="ARCVM common scripts."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# Previously this ebuild was named "chromeos-base/arcvm-launch".
-# TODO(youkichihosoi): Remove this blocker after a while.
-RDEPEND="
-	${RDEPEND}
-	chromeos-base/arc-setup
-	!chromeos-base/arcvm-launch
-"
-
-src_install() {
-	insinto /etc/init
-	doins arc/vm/scripts/init/arcvm-host.conf
-	doins arc/vm/scripts/init/arcvm-per-board-features.conf
-	doins arc/vm/scripts/init/arcvm-ureadahead.conf
-
-	insinto /usr/share/arcvm
-	doins arc/vm/scripts/init/config.json
-
-	insinto /etc/dbus-1/system.d
-	doins arc/vm/scripts/init/dbus-1/ArcVmScripts.conf
-}
diff --git a/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r70.ebuild b/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r70.ebuild
new file mode 100644
index 0000000..448ec85
--- /dev/null
+++ b/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-0.0.1-r70.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "978d0f831d0c93f7e13fe8fdf8fb48ed88c2df31" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/scripts .gn"
+
+inherit cros-workon
+
+DESCRIPTION="ARCVM common scripts."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	${RDEPEND}
+	chromeos-base/arc-setup
+	chromeos-base/arcvm-mount-media-dirs
+"
+
+src_install() {
+	insinto /etc/init
+	doins arc/vm/scripts/init/arcvm-fsverity-certs.conf
+	doins arc/vm/scripts/init/arcvm-host.conf
+	doins arc/vm/scripts/init/arcvm-per-board-features.conf
+	doins arc/vm/scripts/init/arcvm-ureadahead.conf
+
+	insinto /usr/share/arcvm
+	doins arc/vm/scripts/init/config.json
+
+	insinto /usr/share/arcvm/fsverity-certs
+	doins arc/vm/scripts/init/certs/fsverity-release.x509.der
+	doins arc/vm/scripts/init/certs/play_store_fsi_cert.der
+
+	insinto /etc/dbus-1/system.d
+	doins arc/vm/scripts/init/dbus-1/ArcVmScripts.conf
+}
diff --git a/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-9999.ebuild b/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-9999.ebuild
index 2e763f8..ed5014d 100644
--- a/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-9999.ebuild
+++ b/chromeos-base/arcvm-common-scripts/arcvm-common-scripts-9999.ebuild
@@ -17,16 +17,15 @@
 LICENSE="BSD-Google"
 KEYWORDS="~*"
 
-# Previously this ebuild was named "chromeos-base/arcvm-launch".
-# TODO(youkichihosoi): Remove this blocker after a while.
 RDEPEND="
 	${RDEPEND}
 	chromeos-base/arc-setup
-	!chromeos-base/arcvm-launch
+	chromeos-base/arcvm-mount-media-dirs
 "
 
 src_install() {
 	insinto /etc/init
+	doins arc/vm/scripts/init/arcvm-fsverity-certs.conf
 	doins arc/vm/scripts/init/arcvm-host.conf
 	doins arc/vm/scripts/init/arcvm-per-board-features.conf
 	doins arc/vm/scripts/init/arcvm-ureadahead.conf
@@ -34,6 +33,10 @@
 	insinto /usr/share/arcvm
 	doins arc/vm/scripts/init/config.json
 
+	insinto /usr/share/arcvm/fsverity-certs
+	doins arc/vm/scripts/init/certs/fsverity-release.x509.der
+	doins arc/vm/scripts/init/certs/play_store_fsi_cert.der
+
 	insinto /etc/dbus-1/system.d
 	doins arc/vm/scripts/init/dbus-1/ArcVmScripts.conf
 }
diff --git a/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-0.0.1-r10.ebuild b/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-0.0.1-r10.ebuild
new file mode 100644
index 0000000..df63dc7
--- /dev/null
+++ b/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-0.0.1-r10.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e5fb965a42d43476ed5eca63c1e3a45e813b5ed7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/scripts/init/mount-media-dirs .gn"
+
+inherit cros-workon
+
+DESCRIPTION="Mount media directories on a mount point shared with ARCVM."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts/init/mount-media-dirs"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/mount-passthrough
+"
+
+src_install() {
+	insinto /etc/init
+	doins arc/vm/scripts/init/mount-media-dirs/arcvm-mount-myfiles.conf
+	doins arc/vm/scripts/init/mount-media-dirs/arcvm-mount-removable-media.conf
+
+	insinto /etc/dbus-1/system.d
+	doins arc/vm/scripts/init/mount-media-dirs/dbus-1/ArcVmMountMediaDirs.conf
+}
diff --git a/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-9999.ebuild b/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-9999.ebuild
new file mode 100644
index 0000000..befde1b
--- /dev/null
+++ b/chromeos-base/arcvm-mount-media-dirs/arcvm-mount-media-dirs-9999.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/scripts/init/mount-media-dirs .gn"
+
+inherit cros-workon
+
+DESCRIPTION="Mount media directories on a mount point shared with ARCVM."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts/init/mount-media-dirs"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+
+RDEPEND="
+	chromeos-base/mount-passthrough
+"
+
+src_install() {
+	insinto /etc/init
+	doins arc/vm/scripts/init/mount-media-dirs/arcvm-mount-myfiles.conf
+	doins arc/vm/scripts/init/mount-media-dirs/arcvm-mount-removable-media.conf
+
+	insinto /etc/dbus-1/system.d
+	doins arc/vm/scripts/init/mount-media-dirs/dbus-1/ArcVmMountMediaDirs.conf
+}
diff --git a/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r119.ebuild b/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r119.ebuild
deleted file mode 100644
index acb8316..0000000
--- a/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r119.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1421da02cd37a2de2db3e6ed1cc6265a6bb5250e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/vsock_proxy .gn"
-
-PLATFORM_SUBDIR="arc/vm/vsock_proxy"
-
-inherit cros-workon platform
-
-DESCRIPTION="ARCVM vsock proxy."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/vsock_proxy"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	dev-libs/protobuf:=
-	sys-fs/fuse
-"
-
-DEPEND="
-	${RDEPEND}
-"
-
-src_install() {
-	newbin "${OUT}"/server_proxy arcvm_server_proxy
-
-	insinto /etc/init
-	doins init/arcvm-server-proxy.conf
-
-	insinto /etc/dbus-1/system.d
-	doins init/dbus-1/ArcVmServerProxy.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/vsock_proxy_test"
-}
diff --git a/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r141.ebuild b/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r141.ebuild
new file mode 100644
index 0000000..600ed09
--- /dev/null
+++ b/chromeos-base/arcvm-vsock-proxy/arcvm-vsock-proxy-0.0.1-r141.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "be73fa8e4deddec2ff667a0fdce86587b25185ce" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/vsock_proxy .gn"
+
+PLATFORM_SUBDIR="arc/vm/vsock_proxy"
+
+inherit cros-workon platform
+
+DESCRIPTION="ARCVM vsock proxy."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/vsock_proxy"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	dev-libs/protobuf:=
+	sys-fs/fuse
+"
+
+DEPEND="
+	${RDEPEND}
+"
+
+src_install() {
+	newbin "${OUT}"/server_proxy arcvm_server_proxy
+
+	insinto /etc/init
+	doins init/arcvm-server-proxy.conf
+
+	insinto /etc/dbus-1/system.d
+	doins init/dbus-1/ArcVmServerProxy.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/vsock_proxy_test"
+}
diff --git a/chromeos-base/atrusctl/atrusctl-0.0.1-r902.ebuild b/chromeos-base/atrusctl/atrusctl-0.0.1-r902.ebuild
deleted file mode 100644
index a3d1e41..0000000
--- a/chromeos-base/atrusctl/atrusctl-0.0.1-r902.ebuild
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("c142078820d0707858873cedb290a78d36f531af" "253d94997802b60d5a05ec7f86095a6bc6c404fa")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "93173ba661d72e8a1f0ef822b38cce252deea172")
-CROS_WORKON_LOCALNAME=("platform2" "third_party/atrusctl")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/atrusctl")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/atrusctl")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="atrusctl"
-
-inherit cros-workon platform udev user
-
-DESCRIPTION="CrOS daemon for the Atrus speakerphone"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/atrusctl/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="
-	virtual/libusb:1
-	virtual/libudev:0=
-"
-RDEPEND="
-	${DEPEND}
-	!sys-apps/atrusctl
-"
-
-src_install() {
-	dosbin "${OUT}/atrusd"
-
-	insinto /etc/rsyslog.d
-	newins conf/rsyslog-atrus.conf atrus.conf
-
-	udev_newrules conf/udev-atrus.rules 99-atrus.rules
-
-	insinto /etc/init
-	doins init/atrusd.conf
-
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.Atrusctl.conf
-}
-
-pkg_preinst() {
-	enewuser atrus
-	enewgroup atrus
-}
diff --git a/chromeos-base/atrusctl/atrusctl-0.0.1-r922.ebuild b/chromeos-base/atrusctl/atrusctl-0.0.1-r922.ebuild
new file mode 100644
index 0000000..802dd06
--- /dev/null
+++ b/chromeos-base/atrusctl/atrusctl-0.0.1-r922.ebuild
@@ -0,0 +1,51 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "253d94997802b60d5a05ec7f86095a6bc6c404fa")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "93173ba661d72e8a1f0ef822b38cce252deea172")
+CROS_WORKON_LOCALNAME=("platform2" "third_party/atrusctl")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/atrusctl")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/atrusctl")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="atrusctl"
+
+inherit cros-workon platform udev user
+
+DESCRIPTION="CrOS daemon for the Atrus speakerphone"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/atrusctl/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="
+	virtual/libusb:1
+	virtual/libudev:0=
+"
+RDEPEND="
+	${DEPEND}
+	!sys-apps/atrusctl
+"
+
+src_install() {
+	dosbin "${OUT}/atrusd"
+
+	insinto /etc/rsyslog.d
+	newins conf/rsyslog-atrus.conf atrus.conf
+
+	udev_newrules conf/udev-atrus.rules 99-atrus.rules
+
+	insinto /etc/init
+	doins init/atrusd.conf
+
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.Atrusctl.conf
+}
+
+pkg_preinst() {
+	enewuser atrus
+	enewgroup atrus
+}
diff --git a/chromeos-base/attestation-client/attestation-client-0.0.1-r188.ebuild b/chromeos-base/attestation-client/attestation-client-0.0.1-r188.ebuild
deleted file mode 100644
index deb2fc5..0000000
--- a/chromeos-base/attestation-client/attestation-client-0.0.1-r188.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="c83368e10d90ee3fb9a4b49e1ef82757c21ce854"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "677b75140e4ae1b1d889f929c630579a8b13357e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk attestation .gn"
-
-PLATFORM_SUBDIR="attestation/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Attestation D-Bus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/client/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies. We require the particular
-# revision because libbrillo-0.0.1-r1 changed location of header files from
-# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
-# code using the new location.
-DEPEND="
-	cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 )
-	chromeos-base/libbrillo:=
-"
-
-# Note that for RDEPEND, we conflict with attestation package older than
-# 0.0.1 because this client is incompatible with daemon older than version
-# 0.0.1. We didn't RDEPEND on attestation version 0.0.1 or greater because
-# we don't want to create circular dependency in case the package attestation
-# depends on some package foo that also depend on this package.
-RDEPEND="
-	!<chromeos-base/attestation-0.0.1
-	chromeos-base/libbrillo:=
-"
-
-src_install() {
-	# Install D-Bus client library.
-	platform_install_dbus_client_lib "attestation"
-}
diff --git a/chromeos-base/attestation-client/attestation-client-0.0.1-r218.ebuild b/chromeos-base/attestation-client/attestation-client-0.0.1-r218.ebuild
new file mode 100644
index 0000000..a5f864d
--- /dev/null
+++ b/chromeos-base/attestation-client/attestation-client-0.0.1-r218.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "264bb1bf0f00bb187ac184fd6dedeffeba8be970" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk attestation .gn"
+
+PLATFORM_SUBDIR="attestation/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Attestation D-Bus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/client/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies. We require the particular
+# revision because libbrillo-0.0.1-r1 changed location of header files from
+# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
+# code using the new location.
+DEPEND="
+	cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 )
+	chromeos-base/libbrillo:=
+"
+
+# Note that for RDEPEND, we conflict with attestation package older than
+# 0.0.1 because this client is incompatible with daemon older than version
+# 0.0.1. We didn't RDEPEND on attestation version 0.0.1 or greater because
+# we don't want to create circular dependency in case the package attestation
+# depends on some package foo that also depend on this package.
+RDEPEND="
+	!<chromeos-base/attestation-0.0.1
+	chromeos-base/libbrillo:=
+"
+
+src_install() {
+	# Install D-Bus client library.
+	platform_install_dbus_client_lib "attestation"
+}
diff --git a/chromeos-base/attestation/attestation-0.0.1-r2893.ebuild b/chromeos-base/attestation/attestation-0.0.1-r2893.ebuild
deleted file mode 100644
index eb6fa19..0000000
--- a/chromeos-base/attestation/attestation-0.0.1-r2893.ebuild
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c83368e10d90ee3fb9a4b49e1ef82757c21ce854"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "677b75140e4ae1b1d889f929c630579a8b13357e" "a3f5ba63eea058fad5fcab6671f690a35328329d" "1bf01f1a340a50edee0e82b52621117c8388644c" "7e189936f29d145c4191ea147e48256c92fac75d" "dae00c69637e0e94b3ccfca22c7ecb62d4f63675" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk attestation chaps libhwsec metrics tpm_manager trunks .gn"
-
-PLATFORM_SUBDIR="attestation"
-
-inherit cros-workon libchrome platform user
-
-DESCRIPTION="Attestation service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/"
-
-LICENSE="Apache-2.0"
-KEYWORDS="*"
-IUSE="distributed_cryptohome test tpm tpm2"
-
-REQUIRED_USE="tpm2? ( !tpm )"
-
-RDEPEND="
-	tpm? (
-		app-crypt/trousers:=
-	)
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	chromeos-base/chaps:=
-	chromeos-base/metrics:=
-	chromeos-base/minijail:=
-	chromeos-base/tpm_manager:=
-	"
-
-DEPEND="
-	${RDEPEND}
-	test? ( chromeos-base/libhwsec:= )
-	chromeos-base/vboot_reference:=
-	tpm2? (
-		chromeos-base/trunks:=[test?]
-		chromeos-base/chromeos-ec-headers:=
-	)
-	"
-
-pkg_preinst() {
-	# Create user and group for attestation.
-	enewuser "attestation"
-	enewgroup "attestation"
-	# Create group for /mnt/stateful_partition/unencrypted/preserve.
-	enewgroup "preserve"
-}
-
-src_install() {
-	insinto /etc/dbus-1/system.d
-	doins server/org.chromium.Attestation.conf
-
-	insinto /etc/init
-	doins server/attestationd.conf
-	sed -i 's/started tcsd/started tpm_managerd/' \
-		"${D}/etc/init/attestationd.conf" ||
-		die "Can't replace tcsd with tpm_managerd in attestationd.conf"
-
-	dosbin "${OUT}"/attestationd
-	dobin "${OUT}"/attestation_client
-
-	insinto /usr/share/policy
-	newins server/attestationd-seccomp-${ARCH}.policy attestationd-seccomp.policy
-
-	insinto /etc/dbus-1/system.d
-	doins pca_agent/server/org.chromium.PcaAgent.conf
-	insinto /etc/init
-	doins pca_agent/server/pca_agentd.conf
-	dosbin "${OUT}"/pca_agentd
-	dobin "${OUT}"/pca_agent_client
-
-	dolib.so "${OUT}"/lib/libattestation.so
-
-
-	insinto /usr/include/attestation/client
-	doins client/dbus_proxy.h
-	insinto /usr/include/attestation/common
-	doins common/attestation_interface.h
-	doins common/print_attestation_ca_proto.h
-	doins common/print_interface_proto.h
-	doins common/print_keystore_proto.h
-
-	# Install the generated dbus-binding for fake pca agent.
-	# It does no harm to install the header even for non-test image build.
-	insinto /usr/include/attestation/pca-agent/dbus_adaptors
-	doins "${OUT}"/gen/include/attestation/pca-agent/dbus_adaptors/org.chromium.PcaAgent.h
-
-	insinto /usr/share/policy
-	newins "pca_agent/server/pca_agentd-seccomp-${ARCH}.policy" pca_agentd-seccomp.policy
-}
-
-platform_pkg_test() {
-	local tests=(
-		attestation_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/attestation/attestation-0.0.1-r2953.ebuild b/chromeos-base/attestation/attestation-0.0.1-r2953.ebuild
new file mode 100644
index 0000000..79455ea
--- /dev/null
+++ b/chromeos-base/attestation/attestation-0.0.1-r2953.ebuild
@@ -0,0 +1,108 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "264bb1bf0f00bb187ac184fd6dedeffeba8be970" "e62cbc37d070a3060cb35a6478a549702a115b7c" "59ded4c8a6ec924cce82ba942070e51132ca1161" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk attestation chaps libhwsec metrics tpm_manager trunks .gn"
+
+PLATFORM_SUBDIR="attestation"
+
+inherit cros-workon libchrome platform user
+
+DESCRIPTION="Attestation service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/"
+
+LICENSE="Apache-2.0"
+KEYWORDS="*"
+IUSE="test tpm tpm2"
+
+REQUIRED_USE="tpm2? ( !tpm )"
+
+RDEPEND="
+	tpm? (
+		app-crypt/trousers:=
+	)
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	chromeos-base/chaps:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/minijail:=
+	chromeos-base/tpm_manager:=
+	"
+
+DEPEND="
+	${RDEPEND}
+	test? ( chromeos-base/libhwsec:= )
+	chromeos-base/vboot_reference:=
+	tpm2? (
+		chromeos-base/trunks:=[test?]
+		chromeos-base/chromeos-ec-headers:=
+	)
+	"
+
+pkg_preinst() {
+	# Create user and group for attestation.
+	enewuser "attestation"
+	enewgroup "attestation"
+	# Create group for /mnt/stateful_partition/unencrypted/preserve.
+	enewgroup "preserve"
+}
+
+src_install() {
+	insinto /etc/dbus-1/system.d
+	doins server/org.chromium.Attestation.conf
+
+	insinto /etc/init
+	doins server/attestationd.conf
+
+	dosbin "${OUT}"/attestationd
+	dobin "${OUT}"/attestation_client
+
+	insinto /usr/share/policy
+	newins server/attestationd-seccomp-${ARCH}.policy attestationd-seccomp.policy
+
+	insinto /etc/dbus-1/system.d
+	doins pca_agent/server/org.chromium.PcaAgent.conf
+	insinto /etc/init
+	doins pca_agent/server/pca_agentd.conf
+	dosbin "${OUT}"/pca_agentd
+	dobin "${OUT}"/pca_agent_client
+
+	dolib.so "${OUT}"/lib/libattestation.so
+
+
+	insinto /usr/include/attestation/client
+	doins client/dbus_proxy.h
+	insinto /usr/include/attestation/common
+	doins common/attestation_interface.h
+	doins common/print_attestation_ca_proto.h
+	doins common/print_interface_proto.h
+	doins common/print_keystore_proto.h
+
+	# Install the generated dbus-binding for fake pca agent.
+	# It does no harm to install the header even for non-test image build.
+	insinto /usr/include/attestation/pca-agent/dbus_adaptors
+	doins "${OUT}"/gen/include/attestation/pca-agent/dbus_adaptors/org.chromium.PcaAgent.h
+
+	insinto /usr/share/policy
+	newins "pca_agent/server/pca_agentd-seccomp-${ARCH}.policy" pca_agentd-seccomp.policy
+}
+
+platform_pkg_test() {
+	local tests=(
+		attestation_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/attestation/attestation-9999.ebuild b/chromeos-base/attestation/attestation-9999.ebuild
index d361f3e..0ee6186 100644
--- a/chromeos-base/attestation/attestation-9999.ebuild
+++ b/chromeos-base/attestation/attestation-9999.ebuild
@@ -19,7 +19,7 @@
 
 LICENSE="Apache-2.0"
 KEYWORDS="~*"
-IUSE="distributed_cryptohome test tpm tpm2"
+IUSE="test tpm tpm2"
 
 REQUIRED_USE="tpm2? ( !tpm )"
 
@@ -31,7 +31,7 @@
 		chromeos-base/trunks:=
 	)
 	chromeos-base/chaps:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/minijail:=
 	chromeos-base/tpm_manager:=
 	"
@@ -60,9 +60,6 @@
 
 	insinto /etc/init
 	doins server/attestationd.conf
-	sed -i 's/started tcsd/started tpm_managerd/' \
-		"${D}/etc/init/attestationd.conf" ||
-		die "Can't replace tcsd with tpm_managerd in attestationd.conf"
 
 	dosbin "${OUT}"/attestationd
 	dobin "${OUT}"/attestation_client
diff --git a/chromeos-base/audiotest/audiotest-0.0.1-r86.ebuild b/chromeos-base/audiotest/audiotest-0.0.1-r86.ebuild
deleted file mode 100644
index b657ca3..0000000
--- a/chromeos-base/audiotest/audiotest-0.0.1-r86.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="ebf9b0418ed8a6bf873e6453d2876ab18b60542d"
-CROS_WORKON_TREE="94d7c33b250225b84506620a80116ef8a08e5309"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_PROJECT="chromiumos/platform/audiotest"
-CROS_WORKON_LOCALNAME="platform/audiotest"
-
-inherit cros-sanitizers cros-workon cros-common.mk
-
-DESCRIPTION="Audio test tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/audiotest"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND="media-libs/alsa-lib
-	media-sound/adhd"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
-
-src_install() {
-	# Install built tools
-	pushd "${OUT}" >/dev/null
-	dobin src/alsa_api_test
-	dobin alsa_conformance_test/alsa_conformance_test
-	dobin src/alsa_helpers
-	dobin src/audiofuntest
-	dobin src/cras_api_test
-	dobin src/loopback_latency
-	dobin script/alsa_conformance_test.py
-	popd >/dev/null
-}
diff --git a/chromeos-base/audiotest/audiotest-0.0.1-r87.ebuild b/chromeos-base/audiotest/audiotest-0.0.1-r87.ebuild
new file mode 100644
index 0000000..49ad32c
--- /dev/null
+++ b/chromeos-base/audiotest/audiotest-0.0.1-r87.ebuild
@@ -0,0 +1,42 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="dffe5443fd32a8dd17a089a4017dde3508cf17ec"
+CROS_WORKON_TREE="4c65ec62ee9747708372e195bc82934408b704b0"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform/audiotest"
+CROS_WORKON_LOCALNAME="platform/audiotest"
+
+inherit cros-sanitizers cros-workon cros-common.mk
+
+DESCRIPTION="Audio test tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/audiotest"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND="media-libs/alsa-lib
+	media-sound/adhd"
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
+
+src_install() {
+	# Install built tools
+	pushd "${OUT}" >/dev/null
+	dobin src/alsa_api_test
+	dobin alsa_conformance_test/alsa_conformance_test
+	dobin src/alsa_helpers
+	dobin src/audiofuntest
+	dobin src/cras_api_test
+	dobin src/loopback_latency
+	dobin script/alsa_conformance_test.py
+	popd >/dev/null
+}
diff --git a/chromeos-base/authpolicy/authpolicy-0.0.1-r1491.ebuild b/chromeos-base/authpolicy/authpolicy-0.0.1-r1491.ebuild
deleted file mode 100644
index f04de04..0000000
--- a/chromeos-base/authpolicy/authpolicy-0.0.1-r1491.ebuild
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="f893e46fb86e93ddd978c6545b58648ac0679195"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "23a48282e1fb642412f2831608580c645e077db2" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk authpolicy metrics .gn"
-
-PLATFORM_SUBDIR="authpolicy"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Provides authentication to LDAP and fetching device/user policies"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/authpolicy/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="+samba asan fuzzer"
-
-COMMMON_DEPEND="
-	app-crypt/mit-krb5:=
-	chromeos-base/libbrillo:=[asan?,fuzzer?]
-	chromeos-base/metrics:=
-	>=chromeos-base/minijail-0.0.1-r1477:=
-	dev-libs/protobuf:=
-	dev-libs/dbus-glib:=
-	samba? ( >=net-fs/samba-4.5.3-r6:= )
-	sys-apps/dbus:=
-	sys-libs/libcap:=
-"
-RDEPEND="${COMMMON_DEPEND}"
-DEPEND="
-	${COMMMON_DEPEND}
-	>=chromeos-base/protofiles-0.0.39:=
-	chromeos-base/session_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs authpolicyd.
-	enewuser "authpolicyd"
-	enewgroup "authpolicyd"
-	enewuser "authpolicyd-exec"
-	enewgroup "authpolicyd-exec"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dosbin "${OUT}"/authpolicyd
-	dosbin "${OUT}"/authpolicy_parser
-	insinto /etc/dbus-1/system.d
-	doins etc/dbus-1/org.chromium.AuthPolicy.conf
-	insinto /etc/init
-	doins etc/init/authpolicyd.conf
-	insinto /usr/share/policy
-	doins seccomp_filters/*.policy
-	insinto /usr/share/cros/startup/process_management_policies
-	doins setuid_restrictions/authpolicyd_whitelist.txt
-
-	# Create daemon store folder prototype, see
-	# https://chromium.googlesource.com/chromiumos/docs/+/master/sandboxing.md#securely-mounting-cryptohome-daemon-store-folders
-	local daemon_store="/etc/daemon-store/authpolicyd"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners authpolicyd:authpolicyd "${daemon_store}"
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/preg_parser_fuzzer \
-		--dict "${S}"/policy/testdata/preg_parser_fuzzer.dict
-}
-
-platform_pkg_test() {
-	local tests=(
-		authpolicy_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-
-	platform_fuzzer_test "${OUT}"/preg_parser_fuzzer
-}
diff --git a/chromeos-base/authpolicy/authpolicy-0.0.1-r1533.ebuild b/chromeos-base/authpolicy/authpolicy-0.0.1-r1533.ebuild
new file mode 100644
index 0000000..aafc3d9
--- /dev/null
+++ b/chromeos-base/authpolicy/authpolicy-0.0.1-r1533.ebuild
@@ -0,0 +1,89 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "48305cf895fbfc291c6d58b9b08c99cd28e22f8c" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk authpolicy metrics .gn"
+
+PLATFORM_SUBDIR="authpolicy"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Provides authentication to LDAP and fetching device/user policies"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/authpolicy/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="+samba asan fuzzer"
+
+COMMMON_DEPEND="
+	app-crypt/mit-krb5:=
+	chromeos-base/libbrillo:=[asan?,fuzzer?]
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	>=chromeos-base/minijail-0.0.1-r1477:=
+	dev-libs/protobuf:=
+	samba? ( >=net-fs/samba-4.5.3-r6:= )
+	sys-apps/dbus:=
+	sys-libs/libcap:=
+"
+RDEPEND="${COMMMON_DEPEND}"
+DEPEND="
+	${COMMMON_DEPEND}
+	>=chromeos-base/protofiles-0.0.39:=
+	chromeos-base/session_manager-client:=
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs authpolicyd.
+	enewuser "authpolicyd"
+	enewgroup "authpolicyd"
+	enewuser "authpolicyd-exec"
+	enewgroup "authpolicyd-exec"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dosbin "${OUT}"/authpolicyd
+	dosbin "${OUT}"/authpolicy_parser
+	insinto /etc/dbus-1/system.d
+	doins etc/dbus-1/org.chromium.AuthPolicy.conf
+	insinto /etc/init
+	doins etc/init/authpolicyd.conf
+	insinto /usr/share/policy
+	doins seccomp_filters/*.policy
+	insinto /usr/share/cros/startup/process_management_policies
+	doins setuid_restrictions/authpolicyd_whitelist.txt
+
+	# Create daemon store folder prototype, see
+	# https://chromium.googlesource.com/chromiumos/docs/+/master/sandboxing.md#securely-mounting-cryptohome-daemon-store-folders
+	local daemon_store="/etc/daemon-store/authpolicyd"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners authpolicyd:authpolicyd "${daemon_store}"
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/preg_parser_fuzzer \
+		--dict "${S}"/policy/testdata/preg_parser_fuzzer.dict
+}
+
+platform_pkg_test() {
+	local tests=(
+		authpolicy_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+
+	platform_fuzzer_test "${OUT}"/preg_parser_fuzzer
+}
diff --git a/chromeos-base/authpolicy/authpolicy-9999.ebuild b/chromeos-base/authpolicy/authpolicy-9999.ebuild
index f73ad2d..3cf0ecf 100644
--- a/chromeos-base/authpolicy/authpolicy-9999.ebuild
+++ b/chromeos-base/authpolicy/authpolicy-9999.ebuild
@@ -25,10 +25,9 @@
 COMMMON_DEPEND="
 	app-crypt/mit-krb5:=
 	chromeos-base/libbrillo:=[asan?,fuzzer?]
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	>=chromeos-base/minijail-0.0.1-r1477:=
 	dev-libs/protobuf:=
-	dev-libs/dbus-glib:=
 	samba? ( >=net-fs/samba-4.5.3-r6:= )
 	sys-apps/dbus:=
 	sys-libs/libcap:=
diff --git a/chromeos-base/autotest-all/autotest-all-0.0.1-r51.ebuild b/chromeos-base/autotest-all/autotest-all-0.0.1-r52.ebuild
similarity index 100%
rename from chromeos-base/autotest-all/autotest-all-0.0.1-r51.ebuild
rename to chromeos-base/autotest-all/autotest-all-0.0.1-r52.ebuild
diff --git a/chromeos-base/autotest-all/autotest-all-0.0.1.ebuild b/chromeos-base/autotest-all/autotest-all-0.0.1.ebuild
index 50b13aa..57d28b6 100644
--- a/chromeos-base/autotest-all/autotest-all-0.0.1.ebuild
+++ b/chromeos-base/autotest-all/autotest-all-0.0.1.ebuild
@@ -11,7 +11,7 @@
 LICENSE="GPL-2"
 SLOT=0
 KEYWORDS="*"
-IUSE="cheets -chromeless_tests +bluetooth buffet +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2"
+IUSE="cheets -chromeless_tests +bluetooth +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2"
 
 RDEPEND="
 	chromeos-base/autotest-client
@@ -22,7 +22,6 @@
 	chromeos-base/autotest-tests-security
 	chromeos-base/autotest-tests-toolchain
 	bluetooth? ( chromeos-base/autotest-server-tests-bluetooth )
-	buffet? ( chromeos-base/autotest-tests-cloud-services )
 	cellular? ( chromeos-base/autotest-tests-cellular )
 	cheets? ( chromeos-base/autotest-tests-arc-public )
 	!chromeless_tty? (
diff --git a/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7702.ebuild b/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7702.ebuild
deleted file mode 100644
index 37233c8..0000000
--- a/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7702.ebuild
+++ /dev/null
@@ -1,304 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="44895236bbbd1c6c963314eba0bf6991a9f81dbb"
-CROS_WORKON_TREE="0c04c6f35f8a964756856577c2900e4e4d975fcd"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest tests that require chrome_binary_test, or telemetry deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="
-	${IUSE}
-	+autotest
-	+cellular
-	+shill
-	+tpm
-	tpm2
-	vaapi
-"
-
-RDEPEND="
-	!chromeos-base/autotest-telemetry
-	!<chromeos-base/autotest-tests-0.0.4
-	!<chromeos-base/autotest-tests-cellular-0.0.1-r3203
-	chromeos-base/autotest-deps-graphics
-	chromeos-base/autotest-deps-policy
-	chromeos-base/autotest-deps-webgl-mpd
-	chromeos-base/chromeos-chrome
-	dev-python/mkvparse
-	shill? ( chromeos-base/shill-test-scripts )
-	chromeos-base/telemetry
-	sys-apps/ethtool
-	vaapi? ( x11-libs/libva )
-	tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked )
-	virtual/autotest-private-libs
-"
-
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS=(
-	# Tests that depend on telemetry.
-	+tests_accessibility_Sanity
-	+tests_accessibility_ChromeVoxSound
-	+tests_audio_ActiveStreamStress
-	+tests_audio_AudioCorruption
-	+tests_audio_CrasSanity
-	+tests_audio_PlaybackPower
-	+tests_audio_SeekAudioFeedback
-	+tests_autoupdate_CrashBrowserAfterUpdate
-	+tests_autoupdate_EOL
-	+tests_autoupdate_LoginStartUpdateLogout
-	+tests_autoupdate_StartOOBEUpdate
-	+tests_autoupdate_UpdateFromUI
-	+tests_autoupdate_UserData
-	+tests_bluetooth_AdapterReboot
-	+tests_bluetooth_AdapterSanity
-	+tests_bluetooth_IDCheck
-	+tests_bluetooth_RegressionClient
-	+tests_bluetooth_TurnOnOffUI
-	+tests_desktopui_AudioFeedback
-	+tests_desktopui_CheckRlzPingSent
-	+tests_desktopui_ChromeSanity
-	tests_desktopui_ConnectivityDiagnostics
-	+tests_desktopui_FlashSanityCheck
-	+tests_desktopui_MediaAudioFeedback
-	+tests_desktopui_ScreenLocker
-	+tests_desktopui_SimpleLogin
-	+tests_desktopui_UrlFetchWithChromeDriver
-	+tests_display_ClientChameleonConnection
-	+tests_display_DisplayContainEdid
-	+tests_dummy_IdleSuspend
-	+tests_enterprise_FakeEnrollment
-	+tests_enterprise_KioskEnrollment
-	+tests_enterprise_OnlineDemoModeEnrollment
-	+tests_enterprise_PowerManagement
-	+tests_enterprise_RemoraRequisition
-	+tests_graphics_Chrome
-	+tests_graphics_HwOverlays
-	+tests_graphics_Stress
-	+tests_graphics_VideoRenderingPower
-	+tests_graphics_VTSwitch
-	+tests_graphics_WebGLAquarium
-	+tests_graphics_WebGLManyPlanetsDeep
-	tests_logging_AsanCrash
-	+tests_logging_CrashServices
-	+tests_logging_FeedbackReport
-	+tests_login_ChromeProfileSanitary
-	+tests_login_CryptohomeDataLeak
-	+tests_login_CryptohomeIncognito
-	+tests_login_GaiaLogin
-	+tests_login_LoginSuccess
-	+tests_login_OobeLocalization
-	+tests_login_SavePassword
-	+tests_login_UnicornLogin
-	+tests_longevity_Tracker
-	+tests_network_CastTDLS
-	+tests_network_ChromeWifiConfigure
-	+tests_platform_ChromeCgroups
-	+tests_platform_InitLoginPerf
-	+tests_platform_InputBrightness
-	+tests_platform_InputBrowserNav
-	+tests_platform_InputNewTab
-	+tests_platform_InputScreenshot
-	+tests_platform_InputVolume
-	+tests_platform_LogoutPerf
-	+tests_platform_LowMemoryTest
-	+tests_platform_MouseScrollTest
-	+tests_platform_PrintJob
-	+tests_platform_SessionManagerBlockDevmodeSetting
-	+tests_platform_ScrollTest
-	+tests_policy_AccessibilityTest
-	+tests_policy_AllowDeletingBrowserHistory
-	+tests_policy_AllowScreenLock
-	+tests_policy_AlternateErrorPages
-	+tests_policy_ArcAudioCaptureAllowed
-	+tests_policy_ArcBackupRestoreServiceEnabled
-	+tests_policy_ArcExternalStorageDisabled
-	+tests_policy_ArcVideoCaptureAllowed
-	+tests_policy_ArcDisableScreenshots
-	+tests_policy_AudioOutputAllowed
-	+tests_policy_AutotestSanity
-	+tests_policy_BookmarkBarEnabled
-	+tests_policy_ChromeOsLockOnIdleSuspend
-	+tests_policy_CookiesAllowedForUrls
-	+tests_policy_CookiesBlockedForUrls
-	+tests_policy_CookiesSessionOnlyForUrls
-	+tests_policy_DefaultGeolocationSetting
-	+tests_policy_DefaultImagesSetting
-	+tests_policy_DefaultJavaScriptSetting
-	+tests_policy_DefaultNotificationsSetting
-	+tests_policy_DefaultSearchProvider
-	+tests_policy_DeveloperToolsAvailability
-	+tests_policy_DeviceAllowBluetooth
-	+tests_policy_DeviceAutoUpdateDisabled
-	+tests_policy_DeviceCharging
-	+tests_policy_DeviceDockMacAddressSource
-	+tests_policy_DeviceScheduledCharging
-	+tests_policy_DeviceTargetVersionPrefix
-	+tests_policy_DeviceWilcoDtcAllowed
-	+tests_policy_DisableScreenshots
-	+tests_policy_DownloadDirectory
-	+tests_policy_DriveDisabled
-	+tests_policy_EditBookmarksEnabled
-	+tests_policy_DeviceEphemeralUsersEnabled
-	+tests_policy_EnrollmentRetainment
-	+tests_policy_EnterpriseForceInstallCustom
-	+tests_policy_ExtensionAllowedTypes
-	+tests_policy_ExtensionControls
-	+tests_policy_ExtensionPolicy
-	+tests_policy_ExternalStorageDisabled
-	+tests_policy_ExternalStorageReadOnly
-	+tests_policy_ForceGoogleSafeSearch
-	+tests_policy_ForceYouTubeRestrict
-	+tests_policy_ForceYouTubeSafetyMode
-	+tests_policy_HomepageLocation
-	+tests_policy_ImagesAllowedForUrls
-	+tests_policy_ImagesBlockedForUrls
-	+tests_policy_JavaScriptAllowedForUrls
-	+tests_policy_JavaScriptBlockedForUrls
-	+tests_policy_KeyboardDefaultToFunctionKeys
-	+tests_policy_KeyPermissions
-	+tests_policy_KioskModeEnabled
-	+tests_policy_ManagedBookmarks
-	+tests_policy_NativePrintersBulkAccessMode
-	+tests_policy_NewTabPageLocation
-	+tests_policy_NotificationsAllowedForUrls
-	+tests_policy_NotificationsBlockedForUrls
-	+tests_policy_PasswordManager
-	+tests_policy_PinnedLauncherApps
-	+tests_policy_PlatformKeys
-	+tests_policy_PluginsAllowedForUrls
-	+tests_policy_PluginsBlockedForUrls
-	+tests_policy_PolicyRefreshRate
-	+tests_policy_PopupsAllowedForUrls
-	+tests_policy_PopupsBlockedForUrls
-	+tests_policy_PowerManagementIdleSettings
-	+tests_policy_PrintingEnabled
-	+tests_policy_PromptForDownloadLocation
-	+tests_policy_ProxySettings
-	+tests_policy_ReportUploadFrequency
-	+tests_policy_RestoreOnStartupURLs
-	+tests_policy_SafeBrowsingEnabled
-	+tests_policy_SavingBrowserHistoryDisabled
-	+tests_policy_ScreenBrightnessPercent
-	+tests_policy_SearchSuggestEnabled
-	+tests_policy_SecondaryGoogleAccountSigninAllowed
-	+tests_policy_ShowLogoutButtonInTray
-	+tests_policy_ShowHomeButton
-	+tests_policy_SystemTimezone
-	+tests_policy_TranslateEnabled
-	+tests_policy_UserNativePrintersAllowed
-	+tests_policy_VirtualMachinesAllowed
-	+tests_policy_WilcoOnNonWilcoDevice
-	+tests_policy_WilcoUSBPowershare
-	+tests_power_AudioDetector
-	+tests_power_BatteryDrain
-	+tests_power_Consumption
-	+tests_power_Display
-	+tests_power_FlashVideoSuspend
-	+tests_power_Idle
-	+tests_power_IdleSuspend
-	+tests_power_LoadTest
-	+tests_power_LowMemorySuspend
-	+tests_power_MeetClient
-	+tests_power_Speedometer2
-	+tests_power_ThermalLoad
-	+tests_power_UiResume
-	+tests_power_VideoCall
-	+tests_power_VideoDetector
-	+tests_power_VideoPlayback
-	+tests_power_VideoSuspend
-	+tests_power_WebGL
-	+tests_security_BundledExtensions
-	+tests_telemetry_AFDOGenerateClient
-	+tests_telemetry_Sanity
-	+tests_telemetry_UnitTests
-	+tests_telemetry_UnitTestsServer
-	+tests_touch_GestureNav
-	+tests_touch_MouseScroll
-	+tests_touch_ScrollDirection
-	+tests_touch_TapSettings
-	+tests_touch_TabSwitch
-	+tests_touch_TouchscreenScroll
-	+tests_touch_TouchscreenTaps
-	+tests_touch_TouchscreenZoom
-	+tests_touch_StylusTaps
-	+tests_video_AVAnalysis
-)
-
-IUSE_TESTS_CELLULAR="
-	cellular? (
-		+tests_cellular_ModemControl
-		+tests_cellular_SuspendResume
-		+tests_network_ChromeCellularEndToEnd
-		+tests_network_ChromeCellularNetworkPresent
-		+tests_network_ChromeCellularNetworkProperties
-		+tests_network_ChromeCellularSmokeTest
-	)
-"
-
-IUSE_TESTS_SHILL="
-	shill? (
-		+tests_network_ChromeWifiEndToEnd
-		+tests_network_FirewallHolePunch
-		+tests_network_RackWiFiConnect
-		+tests_network_RoamSuspendEndToEnd
-		+tests_network_RoamWifiEndToEnd
-		+tests_policy_GlobalNetworkSettings
-		+tests_policy_WiFiAutoconnect
-		+tests_policy_WiFiPrecedence
-		+tests_policy_WiFiTypes
-	)
-"
-
-# This is here instead of in autotest-tests-tpm because it would be far more
-# work and duplication to add telemetry dependencies there.
-IUSE_TESTS_TPM="
-	tpm? ( +tests_platform_Pkcs11InitOnLogin )
-	tpm2? ( +tests_platform_Pkcs11InitOnLogin )
-"
-
-IUSE_TESTS_ARC="
-	+tests_graphics_Idle
-"
-
-IUSE_TESTS="
-	${IUSE_TESTS[*]}
-	${IUSE_TESTS_CELLULAR}
-	${IUSE_TESTS_SHILL}
-	${IUSE_TESTS_TPM}
-	${IUSE_TESTS_ARC}
-"
-
-IUSE="
-	${IUSE}
-	${IUSE_TESTS}
-"
-
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-AUTOTEST_DEPS_LIST=""
-AUTOTEST_CONFIG_LIST=""
-AUTOTEST_PROFILERS_LIST=""
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-src_prepare() {
-	# Telemetry tests require the path to telemetry source to exist in order to
-	# build. Copy the telemetry source to a temporary directory that is writable,
-	# so that file removals in Telemetry source can be performed properly.
-	export TMP_DIR="$(mktemp -d)"
-	rsync -a --exclude=third_party/trace-viewer/test_data/ \
-		"${SYSROOT}"/usr/local/telemetry/src/ "${TMP_DIR}"
-	export PYTHONPATH="${TMP_DIR}/third_party/catapult/telemetry"
-	autotest_src_prepare
-}
diff --git a/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7738.ebuild b/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7738.ebuild
new file mode 100644
index 0000000..7d36b80
--- /dev/null
+++ b/chromeos-base/autotest-chrome/autotest-chrome-0.0.1-r7738.ebuild
@@ -0,0 +1,301 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="d1cf31c7c10b996c4c857d44ade1c61e26c55986"
+CROS_WORKON_TREE="9aa69630d79bff05bb1bd54c233962cd4ad62ed6"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest tests that require chrome_binary_test, or telemetry deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="
+	${IUSE}
+	+autotest
+	+cellular
+	+shill
+	+tpm
+	tpm2
+	vaapi
+"
+
+RDEPEND="
+	!chromeos-base/autotest-telemetry
+	!<chromeos-base/autotest-tests-0.0.4
+	!<chromeos-base/autotest-tests-cellular-0.0.1-r3203
+	chromeos-base/autotest-deps-graphics
+	chromeos-base/autotest-deps-policy
+	chromeos-base/autotest-deps-webgl-mpd
+	chromeos-base/chromeos-chrome
+	dev-python/mkvparse
+	shill? ( chromeos-base/shill-test-scripts )
+	chromeos-base/telemetry
+	sys-apps/ethtool
+	vaapi? ( x11-libs/libva )
+	tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked )
+	virtual/autotest-private-libs
+"
+
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS=(
+	# Tests that depend on telemetry.
+	+tests_accessibility_Sanity
+	+tests_accessibility_ChromeVoxSound
+	+tests_audio_ActiveStreamStress
+	+tests_audio_AudioCorruption
+	+tests_audio_CrasSanity
+	+tests_audio_PlaybackPower
+	+tests_audio_SeekAudioFeedback
+	+tests_autoupdate_EOL
+	+tests_autoupdate_LoginStartUpdateLogout
+	+tests_autoupdate_StartOOBEUpdate
+	+tests_autoupdate_UpdateFromUI
+	+tests_autoupdate_UserData
+	+tests_bluetooth_AdapterReboot
+	+tests_bluetooth_AdapterSanity
+	+tests_bluetooth_IDCheck
+	+tests_bluetooth_RegressionClient
+	+tests_bluetooth_TurnOnOffUI
+	+tests_desktopui_AudioFeedback
+	+tests_desktopui_CheckRlzPingSent
+	+tests_desktopui_ChromeSanity
+	tests_desktopui_ConnectivityDiagnostics
+	+tests_desktopui_MediaAudioFeedback
+	+tests_desktopui_ScreenLocker
+	+tests_desktopui_SimpleLogin
+	+tests_desktopui_UrlFetchWithChromeDriver
+	+tests_display_ClientChameleonConnection
+	+tests_display_DisplayContainEdid
+	+tests_dummy_IdleSuspend
+	+tests_enterprise_FakeEnrollment
+	+tests_enterprise_KioskEnrollment
+	+tests_enterprise_OnlineDemoModeEnrollment
+	+tests_enterprise_PowerManagement
+	+tests_enterprise_RemoraRequisition
+	+tests_graphics_Chrome
+	+tests_graphics_HwOverlays
+	+tests_graphics_Stress
+	+tests_graphics_VideoRenderingPower
+	+tests_graphics_VTSwitch
+	+tests_graphics_WebGLAquarium
+	+tests_graphics_WebGLManyPlanetsDeep
+	tests_logging_AsanCrash
+	+tests_logging_CrashServices
+	+tests_logging_FeedbackReport
+	+tests_login_ChromeProfileSanitary
+	+tests_login_CryptohomeDataLeak
+	+tests_login_CryptohomeIncognito
+	+tests_login_GaiaLogin
+	+tests_login_LoginSuccess
+	+tests_login_OobeLocalization
+	+tests_login_SavePassword
+	+tests_login_UnicornLogin
+	+tests_longevity_Tracker
+	+tests_network_CastTDLS
+	+tests_network_ChromeWifiConfigure
+	+tests_platform_ChromeCgroups
+	+tests_platform_InitLoginPerf
+	+tests_platform_InputBrightness
+	+tests_platform_InputBrowserNav
+	+tests_platform_InputNewTab
+	+tests_platform_InputScreenshot
+	+tests_platform_InputVolume
+	+tests_platform_LogoutPerf
+	+tests_platform_LowMemoryTest
+	+tests_platform_MouseScrollTest
+	+tests_platform_PrintJob
+	+tests_platform_SessionManagerBlockDevmodeSetting
+	+tests_platform_ScrollTest
+	+tests_policy_AccessibilityTest
+	+tests_policy_AlternateErrorPages
+	+tests_policy_ArcAudioCaptureAllowed
+	+tests_policy_ArcBackupRestoreServiceEnabled
+	+tests_policy_ArcExternalStorageDisabled
+	+tests_policy_ArcVideoCaptureAllowed
+	+tests_policy_ArcDisableScreenshots
+	+tests_policy_AudioOutputAllowed
+	+tests_policy_AutotestSanity
+	+tests_policy_BookmarkBarEnabled
+	+tests_policy_ChromeOsLockOnIdleSuspend
+	+tests_policy_CookiesAllowedForUrls
+	+tests_policy_CookiesBlockedForUrls
+	+tests_policy_CookiesSessionOnlyForUrls
+	+tests_policy_DefaultGeolocationSetting
+	+tests_policy_DefaultImagesSetting
+	+tests_policy_DefaultJavaScriptSetting
+	+tests_policy_DefaultNotificationsSetting
+	+tests_policy_DefaultSearchProvider
+	+tests_policy_DeveloperToolsAvailability
+	+tests_policy_DeviceAllowBluetooth
+	+tests_policy_DeviceAutoUpdateDisabled
+	+tests_policy_DeviceCharging
+	+tests_policy_DeviceDockMacAddressSource
+	+tests_policy_DeviceScheduledCharging
+	+tests_policy_DeviceTargetVersionPrefix
+	+tests_policy_DeviceWilcoDtcAllowed
+	+tests_policy_DisableScreenshots
+	+tests_policy_DownloadDirectory
+	+tests_policy_DriveDisabled
+	+tests_policy_EditBookmarksEnabled
+	+tests_policy_DeviceEphemeralUsersEnabled
+	+tests_policy_EnrollmentRetainment
+	+tests_policy_EnterpriseForceInstallCustom
+	+tests_policy_ExtensionAllowedTypes
+	+tests_policy_ExtensionControls
+	+tests_policy_ExtensionPolicy
+	+tests_policy_ExternalStorageDisabled
+	+tests_policy_ExternalStorageReadOnly
+	+tests_policy_ForceGoogleSafeSearch
+	+tests_policy_ForceYouTubeRestrict
+	+tests_policy_ForceYouTubeSafetyMode
+	+tests_policy_HomepageLocation
+	+tests_policy_ImagesAllowedForUrls
+	+tests_policy_ImagesBlockedForUrls
+	+tests_policy_JavaScriptAllowedForUrls
+	+tests_policy_JavaScriptBlockedForUrls
+	+tests_policy_KeyboardDefaultToFunctionKeys
+	+tests_policy_KeyPermissions
+	+tests_policy_KioskModeEnabled
+	+tests_policy_ManagedBookmarks
+	+tests_policy_NativePrintersBulkAccessMode
+	+tests_policy_NewTabPageLocation
+	+tests_policy_NotificationsAllowedForUrls
+	+tests_policy_NotificationsBlockedForUrls
+	+tests_policy_PinnedLauncherApps
+	+tests_policy_PlatformKeys
+	+tests_policy_PluginsAllowedForUrls
+	+tests_policy_PluginsBlockedForUrls
+	+tests_policy_PolicyRefreshRate
+	+tests_policy_PopupsAllowedForUrls
+	+tests_policy_PopupsBlockedForUrls
+	+tests_policy_PowerManagementIdleSettings
+	+tests_policy_PrintingEnabled
+	+tests_policy_PromptForDownloadLocation
+	+tests_policy_ProxySettings
+	+tests_policy_ReportUploadFrequency
+	+tests_policy_RestoreOnStartupURLs
+	+tests_policy_SafeBrowsingEnabled
+	+tests_policy_SavingBrowserHistoryDisabled
+	+tests_policy_ScreenBrightnessPercent
+	+tests_policy_SearchSuggestEnabled
+	+tests_policy_SecondaryGoogleAccountSigninAllowed
+	+tests_policy_ShowLogoutButtonInTray
+	+tests_policy_ShowHomeButton
+	+tests_policy_SystemTimezone
+	+tests_policy_TranslateEnabled
+	+tests_policy_UserNativePrintersAllowed
+	+tests_policy_VirtualMachinesAllowed
+	+tests_policy_WilcoOnNonWilcoDevice
+	+tests_policy_WilcoUSBPowershare
+	+tests_power_AudioDetector
+	+tests_power_BatteryDrain
+	+tests_power_Consumption
+	+tests_power_Display
+	+tests_power_FlashVideoSuspend
+	+tests_power_Idle
+	+tests_power_IdleSuspend
+	+tests_power_LoadTest
+	+tests_power_LowMemorySuspend
+	+tests_power_MeetClient
+	+tests_power_Speedometer2
+	+tests_power_ThermalLoad
+	+tests_power_UiResume
+	+tests_power_VideoCall
+	+tests_power_VideoDetector
+	+tests_power_VideoEncode
+	+tests_power_VideoPlayback
+	+tests_power_VideoSuspend
+	+tests_power_WebGL
+	+tests_power_WifiIdle
+	+tests_security_BundledExtensions
+	+tests_telemetry_AFDOGenerateClient
+	+tests_telemetry_Sanity
+	+tests_telemetry_UnitTests
+	+tests_telemetry_UnitTestsServer
+	+tests_touch_GestureNav
+	+tests_touch_MouseScroll
+	+tests_touch_ScrollDirection
+	+tests_touch_TapSettings
+	+tests_touch_TabSwitch
+	+tests_touch_TouchscreenScroll
+	+tests_touch_TouchscreenTaps
+	+tests_touch_TouchscreenZoom
+	+tests_touch_StylusTaps
+	+tests_video_AVAnalysis
+)
+
+IUSE_TESTS_CELLULAR="
+	cellular? (
+		+tests_cellular_ModemControl
+		+tests_cellular_SuspendResume
+		+tests_network_ChromeCellularEndToEnd
+		+tests_network_ChromeCellularNetworkPresent
+		+tests_network_ChromeCellularNetworkProperties
+		+tests_network_ChromeCellularSmokeTest
+	)
+"
+
+IUSE_TESTS_SHILL="
+	shill? (
+		+tests_network_ChromeWifiEndToEnd
+		+tests_network_FirewallHolePunch
+		+tests_network_RackWiFiConnect
+		+tests_network_RoamSuspendEndToEnd
+		+tests_network_RoamWifiEndToEnd
+		+tests_policy_GlobalNetworkSettings
+		+tests_policy_WiFiAutoconnect
+		+tests_policy_WiFiPrecedence
+		+tests_policy_WiFiTypes
+	)
+"
+
+# This is here instead of in autotest-tests-tpm because it would be far more
+# work and duplication to add telemetry dependencies there.
+IUSE_TESTS_TPM="
+	tpm? ( +tests_platform_Pkcs11InitOnLogin )
+	tpm2? ( +tests_platform_Pkcs11InitOnLogin )
+"
+
+IUSE_TESTS_ARC="
+	+tests_graphics_Idle
+"
+
+IUSE_TESTS="
+	${IUSE_TESTS[*]}
+	${IUSE_TESTS_CELLULAR}
+	${IUSE_TESTS_SHILL}
+	${IUSE_TESTS_TPM}
+	${IUSE_TESTS_ARC}
+"
+
+IUSE="
+	${IUSE}
+	${IUSE_TESTS}
+"
+
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+AUTOTEST_DEPS_LIST=""
+AUTOTEST_CONFIG_LIST=""
+AUTOTEST_PROFILERS_LIST=""
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+src_prepare() {
+	# Telemetry tests require the path to telemetry source to exist in order to
+	# build. Copy the telemetry source to a temporary directory that is writable,
+	# so that file removals in Telemetry source can be performed properly.
+	export TMP_DIR="$(mktemp -d)"
+	rsync -a --exclude=third_party/trace-viewer/test_data/ \
+		"${SYSROOT}"/usr/local/telemetry/src/ "${TMP_DIR}"
+	export PYTHONPATH="${TMP_DIR}/third_party/catapult/telemetry"
+	autotest_src_prepare
+}
diff --git a/chromeos-base/autotest-chrome/autotest-chrome-9999.ebuild b/chromeos-base/autotest-chrome/autotest-chrome-9999.ebuild
index de7d4f3..cce8724 100644
--- a/chromeos-base/autotest-chrome/autotest-chrome-9999.ebuild
+++ b/chromeos-base/autotest-chrome/autotest-chrome-9999.ebuild
@@ -52,7 +52,6 @@
 	+tests_audio_CrasSanity
 	+tests_audio_PlaybackPower
 	+tests_audio_SeekAudioFeedback
-	+tests_autoupdate_CrashBrowserAfterUpdate
 	+tests_autoupdate_EOL
 	+tests_autoupdate_LoginStartUpdateLogout
 	+tests_autoupdate_StartOOBEUpdate
@@ -67,7 +66,6 @@
 	+tests_desktopui_CheckRlzPingSent
 	+tests_desktopui_ChromeSanity
 	tests_desktopui_ConnectivityDiagnostics
-	+tests_desktopui_FlashSanityCheck
 	+tests_desktopui_MediaAudioFeedback
 	+tests_desktopui_ScreenLocker
 	+tests_desktopui_SimpleLogin
@@ -115,8 +113,6 @@
 	+tests_platform_SessionManagerBlockDevmodeSetting
 	+tests_platform_ScrollTest
 	+tests_policy_AccessibilityTest
-	+tests_policy_AllowDeletingBrowserHistory
-	+tests_policy_AllowScreenLock
 	+tests_policy_AlternateErrorPages
 	+tests_policy_ArcAudioCaptureAllowed
 	+tests_policy_ArcBackupRestoreServiceEnabled
@@ -171,7 +167,6 @@
 	+tests_policy_NewTabPageLocation
 	+tests_policy_NotificationsAllowedForUrls
 	+tests_policy_NotificationsBlockedForUrls
-	+tests_policy_PasswordManager
 	+tests_policy_PinnedLauncherApps
 	+tests_policy_PlatformKeys
 	+tests_policy_PluginsAllowedForUrls
@@ -213,9 +208,11 @@
 	+tests_power_UiResume
 	+tests_power_VideoCall
 	+tests_power_VideoDetector
+	+tests_power_VideoEncode
 	+tests_power_VideoPlayback
 	+tests_power_VideoSuspend
 	+tests_power_WebGL
+	+tests_power_WifiIdle
 	+tests_security_BundledExtensions
 	+tests_telemetry_AFDOGenerateClient
 	+tests_telemetry_Sanity
diff --git a/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4383.ebuild b/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4383.ebuild
deleted file mode 100644
index e3e8322..0000000
--- a/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4383.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Dependencies for camera_HAL3 autotest"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="camera_hal3"
-
-RDEPEND="
-	media-libs/cros-camera-test
-"
-
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4947.ebuild b/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4947.ebuild
new file mode 100644
index 0000000..3a6bbdf
--- /dev/null
+++ b/chromeos-base/autotest-deps-camera-hal3/autotest-deps-camera-hal3-0.0.1-r4947.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Dependencies for camera_HAL3 autotest"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="camera_hal3"
+
+RDEPEND="
+	media-libs/cros-camera-test
+"
+
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7172.ebuild b/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7172.ebuild
deleted file mode 100644
index 9b3376e..0000000
--- a/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7172.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Autotest cellular deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="fakegudev fakemodem"
-AUTOTEST_CONFIG_LIST=
-AUTOTEST_PROFILERS_LIST=
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-RDEPEND="!<chromeos-base/autotest-deps-0.0.3"
-
-# deps/fakegudev
-RDEPEND="${RDEPEND}
-	virtual/libgudev
-"
-
-# deps/fakemodem
-RDEPEND="${RDEPEND}
-	chromeos-base/autotest-fakemodem-conf
-	dev-libs/dbus-glib
-"
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7736.ebuild b/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7736.ebuild
new file mode 100644
index 0000000..b87d96d
--- /dev/null
+++ b/chromeos-base/autotest-deps-cellular/autotest-deps-cellular-0.0.1-r7736.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Autotest cellular deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="fakegudev fakemodem"
+AUTOTEST_CONFIG_LIST=
+AUTOTEST_PROFILERS_LIST=
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+RDEPEND="!<chromeos-base/autotest-deps-0.0.3"
+
+# deps/fakegudev
+RDEPEND="${RDEPEND}
+	virtual/libgudev
+"
+
+# deps/fakemodem
+RDEPEND="${RDEPEND}
+	chromeos-base/autotest-fakemodem-conf
+	dev-libs/dbus-glib
+"
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3056.ebuild b/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3056.ebuild
deleted file mode 100644
index ad9b13f..0000000
--- a/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3056.ebuild
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Autotest D-Bus deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="dbus_protos"
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-DEPEND="chromeos-base/system_api
-	dev-libs/protobuf:=
-"
-
-# Calling this here, so tests using this dep don't have to call setup_dep().
-src_prepare() {
-	autotest-deponly_src_prepare
-}
diff --git a/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3620.ebuild b/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3620.ebuild
new file mode 100644
index 0000000..b03051e
--- /dev/null
+++ b/chromeos-base/autotest-deps-dbus/autotest-deps-dbus-0.0.1-r3620.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Autotest D-Bus deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="dbus_protos"
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+DEPEND="chromeos-base/system_api
+	dev-libs/protobuf:=
+"
+
+# Calling this here, so tests using this dep don't have to call setup_dep().
+src_prepare() {
+	autotest-deponly_src_prepare
+}
diff --git a/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r7543.ebuild b/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r7543.ebuild
deleted file mode 100644
index 51e6b7e..0000000
--- a/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r7543.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-sanitizers cros-workon autotest-deponly
-
-DESCRIPTION="Autotest glmark2 dependency"
-HOMEPAGE="https://launchpad.net/glmark2"
-SRC_URI=""
-
-LICENSE="GPL-3"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="-asan +autotest"
-
-AUTOTEST_DEPS_LIST="glmark2"
-
-# deps/glmark2
-RDEPEND="
-	app-benchmarks/glmark2
-"
-
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	sanitizers-setup-env
-	default
-}
diff --git a/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r8107.ebuild b/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r8107.ebuild
new file mode 100644
index 0000000..0bda1df
--- /dev/null
+++ b/chromeos-base/autotest-deps-glmark2/autotest-deps-glmark2-0.0.1-r8107.ebuild
@@ -0,0 +1,35 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-sanitizers cros-workon autotest-deponly
+
+DESCRIPTION="Autotest glmark2 dependency"
+HOMEPAGE="https://launchpad.net/glmark2"
+SRC_URI=""
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="-asan +autotest"
+
+AUTOTEST_DEPS_LIST="glmark2"
+
+# deps/glmark2
+RDEPEND="
+	app-benchmarks/glmark2
+"
+
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
diff --git a/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r7523.ebuild b/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r7523.ebuild
deleted file mode 100644
index 990fedc..0000000
--- a/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r7523.ebuild
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Dependencies for graphics autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="graphics"
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-RDEPEND="!<chromeos-base/autotest-deps-0.0.4"
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r8087.ebuild b/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r8087.ebuild
new file mode 100644
index 0000000..b6a0d61
--- /dev/null
+++ b/chromeos-base/autotest-deps-graphics/autotest-deps-graphics-0.0.1-r8087.ebuild
@@ -0,0 +1,28 @@
+# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=4
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Dependencies for graphics autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="graphics"
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+RDEPEND="!<chromeos-base/autotest-deps-0.0.4"
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7135.ebuild b/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7135.ebuild
deleted file mode 100644
index 10173d4..0000000
--- a/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7135.ebuild
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-PYTHON_COMPAT=( python2_7 )
-inherit cros-workon autotest-deponly python-any-r1
-
-DESCRIPTION="Autotest p2p deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="lansim"
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-RDEPEND="!<chromeos-base/autotest-deps-0.0.4"
-
-# deps/lansim
-RDEPEND="${RDEPEND}
-	dev-python/dpkt
-"
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7699.ebuild b/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7699.ebuild
new file mode 100644
index 0000000..b5d5d28
--- /dev/null
+++ b/chromeos-base/autotest-deps-p2p/autotest-deps-p2p-0.0.1-r7699.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+PYTHON_COMPAT=( python2_7 )
+inherit cros-workon autotest-deponly python-any-r1
+
+DESCRIPTION="Autotest p2p deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="lansim"
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+RDEPEND="!<chromeos-base/autotest-deps-0.0.4"
+
+# deps/lansim
+RDEPEND="${RDEPEND}
+	dev-python/dpkt
+"
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r11786.ebuild b/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r11786.ebuild
deleted file mode 100644
index c1551dd..0000000
--- a/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r11786.ebuild
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="dependencies for Piglit (collection of automated tests for OpenGl based on glean and mesa)"
-HOMEPAGE="http://cgit.freedesktop.org/piglit"
-SRC_URI=""
-LICENSE="GPL-2 LGPL-3"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest opengl"
-
-AUTOTEST_DEPS_LIST="piglit"
-RDEPEND="
-	opengl? ( virtual/glut )
-	opengl? ( virtual/opengl )
-	dev-python/mako
-	dev-python/numpy
-	media-libs/tiff
-	media-libs/libpng
-	sys-libs/zlib
-	x11-libs/libICE
-	x11-libs/libSM
-	x11-libs/libX11
-	x11-libs/libXtst
-	x11-libs/libXau
-	x11-libs/libXdmcp
-	x11-libs/libXext
-	x11-libs/libXi
-	x11-libs/libXpm
-	x11-libs/libXrender
-	opengl? ( x11-proto/glproto )
-	"
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	# export a variable so that piglit knows where to find libglut.so
-	export GLUT_LIBDIR="/usr/$(get_libdir)"
-
-	default
-}
diff --git a/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r12350.ebuild b/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r12350.ebuild
new file mode 100644
index 0000000..84c3784
--- /dev/null
+++ b/chromeos-base/autotest-deps-piglit/autotest-deps-piglit-0.0.1-r12350.ebuild
@@ -0,0 +1,53 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="dependencies for Piglit (collection of automated tests for OpenGl based on glean and mesa)"
+HOMEPAGE="http://cgit.freedesktop.org/piglit"
+SRC_URI=""
+LICENSE="GPL-2 LGPL-3"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest opengl"
+
+AUTOTEST_DEPS_LIST="piglit"
+RDEPEND="
+	opengl? ( virtual/glut )
+	opengl? ( virtual/opengl )
+	dev-python/mako
+	dev-python/numpy
+	media-libs/tiff
+	media-libs/libpng
+	sys-libs/zlib
+	x11-libs/libICE
+	x11-libs/libSM
+	x11-libs/libX11
+	x11-libs/libXtst
+	x11-libs/libXau
+	x11-libs/libXdmcp
+	x11-libs/libXext
+	x11-libs/libXi
+	x11-libs/libXpm
+	x11-libs/libXrender
+	opengl? ( x11-proto/glproto )
+	"
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	# export a variable so that piglit knows where to find libglut.so
+	export GLUT_LIBDIR="/usr/$(get_libdir)"
+
+	default
+}
diff --git a/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3132.ebuild b/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3132.ebuild
deleted file mode 100644
index c507853..0000000
--- a/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3132.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Autotest policy deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="policy_protos"
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-DEPEND="
-	>=chromeos-base/protofiles-0.0.39:=
-	chromeos-base/system_api
-	dev-libs/protobuf:=
-"
-
-# Calling this here, so tests using this dep don't have to call setup_dep().
-src_prepare() {
-	autotest-deponly_src_prepare
-}
diff --git a/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3696.ebuild b/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3696.ebuild
new file mode 100644
index 0000000..dcad81e
--- /dev/null
+++ b/chromeos-base/autotest-deps-policy/autotest-deps-policy-0.0.1-r3696.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Autotest policy deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="policy_protos"
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+DEPEND="
+	>=chromeos-base/protofiles-0.0.39:=
+	chromeos-base/system_api
+	dev-libs/protobuf:=
+"
+
+# Calling this here, so tests using this dep don't have to call setup_dep().
+src_prepare() {
+	autotest-deponly_src_prepare
+}
diff --git a/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8145.ebuild b/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8145.ebuild
deleted file mode 100644
index ec62c5c..0000000
--- a/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8145.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Autotest touchpad deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="touchpad-tests"
-AUTOTEST_CONFIG_LIST=
-AUTOTEST_PROFILERS_LIST=
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-# deps/touchpad-tests
-RDEPEND="
-	x11-drivers/touchpad-tests
-	chromeos-base/touch_firmware_test
-	chromeos-base/mttools
-"
-
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8709.ebuild b/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8709.ebuild
new file mode 100644
index 0000000..ba62cf7
--- /dev/null
+++ b/chromeos-base/autotest-deps-touchpad/autotest-deps-touchpad-0.0.1-r8709.ebuild
@@ -0,0 +1,35 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Autotest touchpad deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="touchpad-tests"
+AUTOTEST_CONFIG_LIST=
+AUTOTEST_PROFILERS_LIST=
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+# deps/touchpad-tests
+RDEPEND="
+	x11-drivers/touchpad-tests
+	chromeos-base/touch_firmware_test
+	chromeos-base/mttools
+"
+
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r7695.ebuild b/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r7695.ebuild
deleted file mode 100644
index 4d7e8cf..0000000
--- a/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r7695.ebuild
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Dependencies for WebGL many planets deep test"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-AUTOTEST_DEPS_LIST="webgl_mpd"
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r8259.ebuild b/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r8259.ebuild
new file mode 100644
index 0000000..d010b52
--- /dev/null
+++ b/chromeos-base/autotest-deps-webgl-mpd/autotest-deps-webgl-mpd-0.0.1-r8259.ebuild
@@ -0,0 +1,25 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Dependencies for WebGL many planets deep test"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+AUTOTEST_DEPS_LIST="webgl_mpd"
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12362.ebuild b/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12362.ebuild
deleted file mode 100644
index 7c2570b..0000000
--- a/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12362.ebuild
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest-deponly
-
-DESCRIPTION="Autotest common deps"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Autotest enabled by default.
-IUSE="+autotest"
-
-# following deps don't compile: boottool, mysql, pgpool, pgsql, systemtap, # dejagnu, libcap, libnet
-# following deps are not deps: factory
-# following tests are going to be moved: chrome_test
-AUTOTEST_DEPS_LIST="gtest iwcap"
-AUTOTEST_CONFIG_LIST=*
-AUTOTEST_PROFILERS_LIST=*
-
-# NOTE: For deps, we need to keep *.a
-AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-# deps/gtest
-RDEPEND="
-	dev-cpp/gtest:=
-"
-
-# deps/iwcap
-RDEPEND="${RDEPEND}
-	dev-libs/libnl:0
-"
-
-# deps/grpcio
-RDEPEND="${RDEPEND}
-	>=dev-python/grpcio-1.19
-"
-
-RDEPEND="${RDEPEND}
-	sys-devel/binutils
-"
-DEPEND="${RDEPEND}"
-
-src_prepare() {
-	autotest-deponly_src_prepare
-
-	# To avoid a file collision with autotest.ebuild, remove
-	# one particular __init__.py file from working directory.
-	# See crbug.com/324963 for context.
-	rm "${AUTOTEST_WORKDIR}/client/profilers/__init__.py"
-}
diff --git a/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12926.ebuild b/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12926.ebuild
new file mode 100644
index 0000000..86f96f7
--- /dev/null
+++ b/chromeos-base/autotest-deps/autotest-deps-0.0.4-r12926.ebuild
@@ -0,0 +1,64 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest-deponly
+
+DESCRIPTION="Autotest common deps"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Autotest enabled by default.
+IUSE="+autotest"
+
+# following deps don't compile: boottool, mysql, pgpool, pgsql, systemtap, # dejagnu, libcap, libnet
+# following deps are not deps: factory
+# following tests are going to be moved: chrome_test
+AUTOTEST_DEPS_LIST="gtest iwcap"
+AUTOTEST_CONFIG_LIST=*
+AUTOTEST_PROFILERS_LIST=*
+
+# NOTE: For deps, we need to keep *.a
+AUTOTEST_FILE_MASK="*.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+# deps/gtest
+RDEPEND="
+	dev-cpp/gtest:=
+"
+
+# deps/iwcap
+RDEPEND="${RDEPEND}
+	dev-libs/libnl:0
+"
+
+# deps/grpcio
+RDEPEND="${RDEPEND}
+	>=dev-python/grpcio-1.19
+"
+
+# deps/psutil
+RDEPEND="${RDEPEND}
+	>=dev-python/psutil-5.5.0
+"
+
+RDEPEND="${RDEPEND}
+	sys-devel/binutils
+"
+DEPEND="${RDEPEND}"
+
+src_prepare() {
+	autotest-deponly_src_prepare
+
+	# To avoid a file collision with autotest.ebuild, remove
+	# one particular __init__.py file from working directory.
+	# See crbug.com/324963 for context.
+	rm "${AUTOTEST_WORKDIR}/client/profilers/__init__.py"
+}
diff --git a/chromeos-base/autotest-deps/autotest-deps-9999.ebuild b/chromeos-base/autotest-deps/autotest-deps-9999.ebuild
index b98ded3..173758d 100644
--- a/chromeos-base/autotest-deps/autotest-deps-9999.ebuild
+++ b/chromeos-base/autotest-deps/autotest-deps-9999.ebuild
@@ -42,6 +42,11 @@
 	>=dev-python/grpcio-1.19
 "
 
+# deps/psutil
+RDEPEND="${RDEPEND}
+	>=dev-python/psutil-5.5.0
+"
+
 RDEPEND="${RDEPEND}
 	sys-devel/binutils
 "
diff --git a/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3318.ebuild b/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3318.ebuild
deleted file mode 100644
index be56100..0000000
--- a/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3318.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="3a768c1331b84014a144dd79c25ed17ad0894850"
-CROS_WORKON_TREE="e07884563021f42ffacc26736bff982f037483b4"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest server tests for Bluetooth"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="+autotest"
-
-RDEPEND="
-	!<chromeos-base/autotest-server-tests-0.0.2-r4126
-"
-
-SERVER_IUSE_TESTS="
-	+tests_bluetooth_AdapterAdvSanity
-	+tests_bluetooth_AdapterAudioLink
-	+tests_bluetooth_AdapterAUSanity
-	+tests_bluetooth_AdapterCLSanity
-	+tests_bluetooth_AdapterLEAdvertising
-	+tests_bluetooth_AdapterLEBetterTogether
-	+tests_bluetooth_AdapterLEHIDSanity
-	+tests_bluetooth_AdapterLESanity
-	+tests_bluetooth_AdapterMDSanity
-	+tests_bluetooth_AdapterMTBF
-	+tests_bluetooth_AdapterPowerMeasure
-	+tests_bluetooth_AdapterQuickSanity
-	+tests_bluetooth_AdapterSASanity
-	+tests_bluetooth_PeerUpdate
-	+tests_bluetooth_AdapterSRSanity
-"
-
-IUSE_TESTS="${IUSE_TESTS}
-	${SERVER_IUSE_TESTS}
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3366.ebuild b/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3366.ebuild
new file mode 100644
index 0000000..33e2b63
--- /dev/null
+++ b/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-0.0.1-r3366.ebuild
@@ -0,0 +1,49 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="b2d0801b92153978911f6eb1010b4abd5f4448c6"
+CROS_WORKON_TREE="6e58ba458a13bf5c1b0262c0e00b5fc693215a51"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest server tests for Bluetooth"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="+autotest"
+
+RDEPEND="
+	!<chromeos-base/autotest-server-tests-0.0.2-r4126
+"
+
+SERVER_IUSE_TESTS="
+	+tests_bluetooth_AdapterAdvSanity
+	+tests_bluetooth_AdapterAUSanity
+	+tests_bluetooth_AdapterCLSanity
+	+tests_bluetooth_AdapterLEAdvertising
+	+tests_bluetooth_AdapterLEBetterTogether
+	+tests_bluetooth_AdapterLEHIDSanity
+	+tests_bluetooth_AdapterLESanity
+	+tests_bluetooth_AdapterMDSanity
+	+tests_bluetooth_AdapterMTBF
+	+tests_bluetooth_AdapterPowerMeasure
+	+tests_bluetooth_AdapterQuickSanity
+	+tests_bluetooth_AdapterSASanity
+	+tests_bluetooth_PeerUpdate
+	+tests_bluetooth_AdapterSRSanity
+"
+
+IUSE_TESTS="${IUSE_TESTS}
+	${SERVER_IUSE_TESTS}
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-9999.ebuild b/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-9999.ebuild
index 37d83d5..532a1b9 100644
--- a/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-9999.ebuild
+++ b/chromeos-base/autotest-server-tests-bluetooth/autotest-server-tests-bluetooth-9999.ebuild
@@ -23,7 +23,6 @@
 
 SERVER_IUSE_TESTS="
 	+tests_bluetooth_AdapterAdvSanity
-	+tests_bluetooth_AdapterAudioLink
 	+tests_bluetooth_AdapterAUSanity
 	+tests_bluetooth_AdapterCLSanity
 	+tests_bluetooth_AdapterLEAdvertising
diff --git a/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3314.ebuild b/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3314.ebuild
deleted file mode 100644
index e1237e0..0000000
--- a/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3314.ebuild
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="4"
-CROS_WORKON_COMMIT="b34a252cbce3f04bcdf31f034d9ace997ea925ce"
-CROS_WORKON_TREE="00366af8c63b650d8db7bcfb1970e3575ed29a15"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest server tests for shill"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="-chromeless_tests +autotest -chromeless_tty"
-
-SERVER_IUSE_TESTS="
-	+tests_network_WiFi_APSupportedRates
-	+tests_network_WiFi_AssocConfigPerformance
-	+tests_network_WiFi_AttenuatedPerf
-	+tests_network_WiFi_BeaconInterval
-	+tests_network_WiFi_BgscanBackoff
-	+tests_network_WiFi_BluetoothScanPerf
-	+tests_network_WiFi_BluetoothStreamPerf
-	+tests_network_WiFi_BSSTMReq
-	+tests_network_WiFi_BT_AntennaCoex
-	+tests_network_WiFi_ChannelHop
-	+tests_network_WiFi_ChannelScanDwellTime
-	+tests_network_WiFi_ChaosConfigFailure
-	+tests_network_WiFi_ChaosConnectDisconnect
-	+tests_network_WiFi_ChaosLongConnect
-	!chromeless_tty (
-		!chromeless_tests (
-			+tests_cellular_ChromeEndToEnd
-			+tests_network_WiFi_ChromeEndToEnd
-			+tests_network_WiFi_RoamEndToEnd
-			+tests_network_WiFi_RoamSuspendEndToEnd
-		)
-	)
-	+tests_network_WiFi_ConnectionIdentifier
-	+tests_network_WiFi_CSA
-	+tests_network_WiFi_CSADisconnect
-	+tests_network_WiFi_DarkResumeActiveScans
-	+tests_network_WiFi_DisableEnable
-	+tests_network_WiFi_DisableRandomMACAddress
-	+tests_network_WiFi_DisconnectClearsIP
-	+tests_network_WiFi_DisconnectReason
-	+tests_network_WiFi_DTIMPeriod
-	+tests_network_WiFi_FastReconnectInDarkResume
-	+tests_network_WiFi_GTK
-	+tests_network_WiFi_HiddenRemains
-	+tests_network_WiFi_HiddenScan
-	+tests_network_WiFi_LinkMonitorFailure
-	+tests_network_WiFi_MalformedProbeResp
-	+tests_network_WiFi_MaskedBSSID
-	+tests_network_WiFi_MissingBeacons
-	+tests_network_WiFi_MultiAuth
-	+tests_network_WiFi_OverlappingBSSScan
-	+tests_network_WiFi_Perf
-	+tests_network_WiFi_PMKSACaching
-	+tests_network_WiFi_Powersave
-	+tests_network_WiFi_Prefer5Ghz
-	+tests_network_WiFi_ProfileBasic
-	+tests_network_WiFi_ProfileGUID
-	+tests_network_WiFi_PTK
-	+tests_network_WiFi_RandomMACAddress
-	+tests_network_WiFi_RateControl
-	+tests_network_WiFi_Reassociate
-	+tests_network_WiFi_ReconnectInDarkResume
-	+tests_network_WiFi_Reset
-	+tests_network_WiFi_Roam
-	+tests_network_WiFi_RoamDbus
-	+tests_network_WiFi_RoamFT
-	+tests_network_WiFi_RoamSuspendTimeout
-	+tests_network_WiFi_ScanPerformance
-	+tests_network_WiFi_SecChange
-	+tests_network_WiFi_SetOptionalDhcpProperties
-	+tests_network_WiFi_SimpleConnect
-	+tests_network_WiFi_SSIDSwitchBack
-	+tests_network_WiFi_SuspendStress
-	+tests_network_WiFi_StressTest
-	+tests_network_WiFi_Throttle
-	+tests_network_WiFi_UpdateRouter
-	+tests_network_WiFi_VerifyRouter
-	+tests_network_WiFi_VisibleScan
-	+tests_network_WiFi_WakeOnDisconnect
-	+tests_network_WiFi_WakeOnSSID
-	+tests_network_WiFi_WakeOnWiFiThrottling
-	+tests_network_WiFi_WoWLAN
-	+tests_network_WiFi_WMM
-"
-
-IUSE_TESTS="${IUSE_TESTS}
-	${SERVER_IUSE_TESTS}
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3338.ebuild b/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3338.ebuild
new file mode 100644
index 0000000..b3961dd
--- /dev/null
+++ b/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-0.0.1-r3338.ebuild
@@ -0,0 +1,100 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="4"
+CROS_WORKON_COMMIT="91b23be02c04cee63b94354239062e83b4aa2319"
+CROS_WORKON_TREE="1339b5cf7943176aeba9de65fa5a5b8bf7326758"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest server tests for shill"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="-chromeless_tests +autotest -chromeless_tty"
+
+SERVER_IUSE_TESTS="
+	+tests_network_WiFi_APSupportedRates
+	+tests_network_WiFi_AssocConfigPerformance
+	+tests_network_WiFi_AttenuatedPerf
+	+tests_network_WiFi_BeaconInterval
+	+tests_network_WiFi_BgscanBackoff
+	+tests_network_WiFi_BluetoothScanPerf
+	+tests_network_WiFi_BluetoothStreamPerf
+	+tests_network_WiFi_BSSTMReq
+	+tests_network_WiFi_BT_AntennaCoex
+	+tests_network_WiFi_ChannelHop
+	+tests_network_WiFi_ChannelScanDwellTime
+	+tests_network_WiFi_ChaosConfigFailure
+	+tests_network_WiFi_ChaosConnectDisconnect
+	+tests_network_WiFi_ChaosLongConnect
+	!chromeless_tty (
+		!chromeless_tests (
+			+tests_cellular_ChromeEndToEnd
+			+tests_network_WiFi_ChromeEndToEnd
+			+tests_network_WiFi_RoamEndToEnd
+			+tests_network_WiFi_RoamSuspendEndToEnd
+		)
+	)
+	+tests_network_WiFi_ConnectionIdentifier
+	+tests_network_WiFi_CSA
+	+tests_network_WiFi_CSADisconnect
+	+tests_network_WiFi_DarkResumeActiveScans
+	+tests_network_WiFi_DisableEnable
+	+tests_network_WiFi_DisableRandomMACAddress
+	+tests_network_WiFi_DisconnectReason
+	+tests_network_WiFi_DTIMPeriod
+	+tests_network_WiFi_FastReconnectInDarkResume
+	+tests_network_WiFi_GTK
+	+tests_network_WiFi_HiddenRemains
+	+tests_network_WiFi_HiddenScan
+	+tests_network_WiFi_LinkMonitorFailure
+	+tests_network_WiFi_MalformedProbeResp
+	+tests_network_WiFi_MultiAuth
+	+tests_network_WiFi_OverlappingBSSScan
+	+tests_network_WiFi_Perf
+	+tests_network_WiFi_PMKSACaching
+	+tests_network_WiFi_Prefer5Ghz
+	+tests_network_WiFi_ProfileBasic
+	+tests_network_WiFi_ProfileGUID
+	+tests_network_WiFi_PTK
+	+tests_network_WiFi_RandomMACAddress
+	+tests_network_WiFi_RateControl
+	+tests_network_WiFi_Reassociate
+	+tests_network_WiFi_ReconnectInDarkResume
+	+tests_network_WiFi_Reset
+	+tests_network_WiFi_Roam
+	+tests_network_WiFi_RoamDbus
+	+tests_network_WiFi_RoamFT
+	+tests_network_WiFi_RoamSuspendTimeout
+	+tests_network_WiFi_ScanPerformance
+	+tests_network_WiFi_SecChange
+	+tests_network_WiFi_SetOptionalDhcpProperties
+	+tests_network_WiFi_SimpleConnect
+	+tests_network_WiFi_SSIDSwitchBack
+	+tests_network_WiFi_SuspendStress
+	+tests_network_WiFi_StressTest
+	+tests_network_WiFi_Throttle
+	+tests_network_WiFi_UpdateRouter
+	+tests_network_WiFi_VerifyRouter
+	+tests_network_WiFi_VisibleScan
+	+tests_network_WiFi_WakeOnDisconnect
+	+tests_network_WiFi_WakeOnSSID
+	+tests_network_WiFi_WakeOnWiFiThrottling
+	+tests_network_WiFi_WoWLAN
+	+tests_network_WiFi_WMM
+"
+
+IUSE_TESTS="${IUSE_TESTS}
+	${SERVER_IUSE_TESTS}
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-9999.ebuild b/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-9999.ebuild
index 3c5a23c..69a8a0c 100644
--- a/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-9999.ebuild
+++ b/chromeos-base/autotest-server-tests-shill/autotest-server-tests-shill-9999.ebuild
@@ -46,7 +46,6 @@
 	+tests_network_WiFi_DarkResumeActiveScans
 	+tests_network_WiFi_DisableEnable
 	+tests_network_WiFi_DisableRandomMACAddress
-	+tests_network_WiFi_DisconnectClearsIP
 	+tests_network_WiFi_DisconnectReason
 	+tests_network_WiFi_DTIMPeriod
 	+tests_network_WiFi_FastReconnectInDarkResume
@@ -55,13 +54,10 @@
 	+tests_network_WiFi_HiddenScan
 	+tests_network_WiFi_LinkMonitorFailure
 	+tests_network_WiFi_MalformedProbeResp
-	+tests_network_WiFi_MaskedBSSID
-	+tests_network_WiFi_MissingBeacons
 	+tests_network_WiFi_MultiAuth
 	+tests_network_WiFi_OverlappingBSSScan
 	+tests_network_WiFi_Perf
 	+tests_network_WiFi_PMKSACaching
-	+tests_network_WiFi_Powersave
 	+tests_network_WiFi_Prefer5Ghz
 	+tests_network_WiFi_ProfileBasic
 	+tests_network_WiFi_ProfileGUID
diff --git a/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r104.ebuild b/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r104.ebuild
deleted file mode 100644
index 9983af8..0000000
--- a/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r104.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="653532d22c196d77eebfc9a934b63b6bb64729f6"
-CROS_WORKON_TREE="2868716f83007fd99d02289fd2a0a7a20667ed8c"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest server tests for running Tast-based tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-IUSE="+autotest"
-
-RDEPEND=""
-DEPEND=""
-
-IUSE_TESTS="
-	+tests_tast
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r120.ebuild b/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r120.ebuild
new file mode 100644
index 0000000..10ddf02
--- /dev/null
+++ b/chromeos-base/autotest-server-tests-tast/autotest-server-tests-tast-0.0.1-r120.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="038e73e9e5d43eb894fb70d6502fbd6229b2b33a"
+CROS_WORKON_TREE="c830590e01847850fc31d3d2344ebb83a81d97db"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest server tests for running Tast-based tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+IUSE="+autotest"
+
+RDEPEND=""
+DEPEND=""
+
+IUSE_TESTS="
+	+tests_tast
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3233.ebuild b/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3233.ebuild
deleted file mode 100644
index c44fe54..0000000
--- a/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3233.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="4"
-CROS_WORKON_COMMIT="dc00b9e4be60f4eea6ce9ba30ffd6f380769aa49"
-CROS_WORKON_TREE="bc817163326c42ab8ae50f548186a35d78ee9670"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest server tests for shill"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="+autotest"
-
-RDEPEND=""
-DEPEND="${RDEPEND}
-	!<chromeos-base/autotest-server-tests-0.0.2
-"
-
-SERVER_IUSE_TESTS="
-	+tests_telemetry_AFDOGenerate
-	+tests_telemetry_Benchmarks
-	+tests_telemetry_Crosperf
-	+tests_telemetry_CrosTests
-	+tests_telemetry_GpuTests
-"
-
-IUSE_TESTS="${IUSE_TESTS}
-	${SERVER_IUSE_TESTS}
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3237.ebuild b/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3237.ebuild
new file mode 100644
index 0000000..f383a1f
--- /dev/null
+++ b/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-0.0.1-r3237.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="4"
+CROS_WORKON_COMMIT="fbc49f406c80967f486ed2f0e2d02eeaa38cad82"
+CROS_WORKON_TREE="7a1273a39123e82c06eb32db5941fb784023e773"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest server tests for shill"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="+autotest"
+
+RDEPEND=""
+DEPEND="${RDEPEND}
+	!<chromeos-base/autotest-server-tests-0.0.2
+"
+
+SERVER_IUSE_TESTS="
+	+tests_telemetry_AFDOGenerate
+	+tests_telemetry_Benchmarks
+	+tests_telemetry_Crosperf
+	+tests_telemetry_CrosTests
+"
+
+IUSE_TESTS="${IUSE_TESTS}
+	${SERVER_IUSE_TESTS}
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-9999.ebuild b/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-9999.ebuild
index 2faf257..35a1664 100644
--- a/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-9999.ebuild
+++ b/chromeos-base/autotest-server-tests-telemetry/autotest-server-tests-telemetry-9999.ebuild
@@ -27,7 +27,6 @@
 	+tests_telemetry_Benchmarks
 	+tests_telemetry_Crosperf
 	+tests_telemetry_CrosTests
-	+tests_telemetry_GpuTests
 "
 
 IUSE_TESTS="${IUSE_TESTS}
diff --git a/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4614.ebuild b/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4614.ebuild
deleted file mode 100644
index 0e74a8d..0000000
--- a/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4614.ebuild
+++ /dev/null
@@ -1,332 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="53f547dfe10396254bc22d4acf971cdb5f2f5b55"
-CROS_WORKON_TREE="86709f0035bdb7cbf6ce10941e69ed44014b66d4"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotest server tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="android-container android-container-pi +autotest biod +cellular -chromeless_tests -chromeless_tty cros_p2p debugd has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2"
-REQUIRED_USE="?? ( has-kernelnext is-kernelnext )"
-
-RDEPEND=""
-DEPEND="${RDEPEND}
-	!<chromeos-base/autotest-0.0.2
-"
-
-SERVER_IUSE_TESTS="
-	+tests_android_ACTS
-	+tests_android_EasySetup
-	+tests_audio_AudioAfterReboot
-	+tests_audio_AudioAfterSuspend
-	+tests_audio_AudioArtifacts
-	+tests_audio_AudioARCPlayback
-	+tests_audio_AudioARCRecord
-	+tests_audio_AudioBasicAssistant
-	+tests_audio_AudioBasicBluetoothPlayback
-	+tests_audio_AudioBasicBluetoothPlaybackRecord
-	+tests_audio_AudioBasicBluetoothRecord
-	+tests_audio_AudioBasicExternalMicrophone
-	+tests_audio_AudioBasicHDMI
-	+tests_audio_AudioBasicHeadphone
-	+tests_audio_AudioBasicHotwording
-	+tests_audio_AudioBasicInternalMicrophone
-	+tests_audio_AudioBasicInternalSpeaker
-	+tests_audio_AudioBasicUSBPlayback
-	+tests_audio_AudioBasicUSBPlaybackRecord
-	+tests_audio_AudioBasicUSBRecord
-	+tests_audio_AudioBluetoothConnectionStability
-	+tests_audio_AudioNodeSwitch
-	+tests_audio_AudioPinnedStream
-	+tests_audio_AudioQualityAfterSuspend
-	+tests_audio_AudioSanityCheck
-	+tests_audio_AudioVolume
-	+tests_audio_AudioWebRTCLoopback
-	+tests_audio_InternalCardNodes
-	+tests_audio_LeftRightInternalSpeaker
-	+tests_audio_MediaBasicVerification
-	+tests_audio_PowerConsumption
-	+tests_audiovideo_AVSync
-	+tests_autotest_SyncCount
-	+tests_autoupdate_CatchBadSignatures
-	+tests_autoupdate_Cellular
-	+tests_autoupdate_DataPreserved
-	+tests_autoupdate_ForcedOOBEUpdate
-	+tests_autoupdate_FromUI
-	+tests_autoupdate_Interruptions
-	+tests_autoupdate_NonBlockingOOBEUpdate
-	+tests_autoupdate_OmahaResponse
-	+tests_autoupdate_P2P
-	+tests_autoupdate_Rollback
-	has-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
-	is-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
-	+tests_brillo_gTests
-	cellular? ( +tests_cellular_StaleModemReboot )
-	android-container-pi? (
-		+tests_cheets_CTS_Instant
-		+tests_cheets_CTS_P
-		+tests_cheets_GTS
-		+tests_cheets_VTS
-	)
-	+tests_component_UpdateFlash
-	debugd? ( +tests_debugd_DevTools )
-	+tests_crosperf_Wrapper
-	+tests_display_EdidStress
-	+tests_display_HDCPScreen
-	+tests_display_HotPlugAtBoot
-	+tests_display_HotPlugAtSuspend
-	+tests_display_HotPlugNoisy
-	+tests_display_LidCloseOpen
-	+tests_display_NoEdid
-	+tests_display_Resolution
-	+tests_display_ResolutionList
-	+tests_display_ServerChameleonConnection
-	+tests_display_SuspendStress
-	+tests_display_SwitchMode
-	+tests_dummy_PassServer
-	+tests_dummy_FailServer
-	+tests_dummy_FlakyTestServer
-	+tests_dummy_SynchronousOffloadServer
-	+tests_enterprise_ClearTPM
-	+tests_enterprise_KioskEnrollmentServer
-	+tests_enterprise_LongevityTrackerServer
-	+tests_enterprise_OnlineDemoMode
-	+tests_factory_Basic
-	+tests_firmware_Bmpblk
-	+tests_firmware_CgptStress
-	+tests_firmware_ClearTPMOwnerAndReset
-	+tests_firmware_ConsecutiveBoot
-	+tests_firmware_ConsecutiveBootPowerButton
-	+tests_firmware_ConsecutiveLidSwitch
-	+tests_firmware_CorruptBothFwBodyAB
-	+tests_firmware_CorruptBothFwSigAB
-	+tests_firmware_CorruptBothKernelAB
-	+tests_firmware_CorruptFwBodyA
-	+tests_firmware_CorruptFwBodyB
-	+tests_firmware_CorruptFwSigA
-	+tests_firmware_CorruptFwSigB
-	+tests_firmware_CorruptKernelA
-	+tests_firmware_CorruptKernelB
-	+tests_firmware_CorruptRecoveryCache
-	+tests_firmware_Cr50BID
-	+tests_firmware_Cr50CCDServoCap
-	+tests_firmware_Cr50CCDUartStress
-	+tests_firmware_Cr50CheckCap
-	+tests_firmware_Cr50ConsoleCommands
-	+tests_firmware_Cr50DeepSleepStress
-	+tests_firmware_Cr50DeferredECReset
-	+tests_firmware_Cr50DeviceState
-	+tests_firmware_Cr50DevMode
-	+tests_firmware_Cr50ECReset
-	+tests_firmware_Cr50FactoryResetVC
-	+tests_firmware_Cr50CCDFirmwareUpdate
-	+tests_firmware_Cr50GetName
-	+tests_firmware_Cr50InvalidateRW
-	+tests_firmware_Cr50Open
-	+tests_firmware_Cr50OpenWhileAPOff
-	+tests_firmware_Cr50PartialBoardId
-	+tests_firmware_Cr50Password
-	+tests_firmware_Cr50PinWeaverServer
-	+tests_firmware_Cr50RddG3
-	+tests_firmware_Cr50RejectUpdate
-	+tests_firmware_Cr50RMAOpen
-	+tests_firmware_Cr50SetBoardId
-	+tests_firmware_Cr50ShortECC
-	+tests_firmware_Cr50Testlab
-	+tests_firmware_Cr50TpmManufactured
-	+tests_firmware_Cr50TpmMode
-	+tests_firmware_Cr50U2fCommands
-	+tests_firmware_Cr50Unlock
-	+tests_firmware_Cr50Update
-	+tests_firmware_Cr50UpdateScriptStress
-	+tests_firmware_Cr50USB
-	+tests_firmware_Cr50WilcoEcrst
-	+tests_firmware_Cr50WilcoRmaFactoryMode
-	+tests_firmware_Cr50WPG3
-	+tests_firmware_DevBootUSB
-	+tests_firmware_DevDefaultBoot
-	+tests_firmware_DevMode
-	+tests_firmware_DevModeStress
-	+tests_firmware_DevScreenTimeout
-	+tests_firmware_ECBattery
-	+tests_firmware_ECBootTime
-	+tests_firmware_ECCbiEeprom
-	+tests_firmware_ECCharging
-	+tests_firmware_ECChargingState
-	+tests_firmware_ECHash
-	+tests_firmware_ECKeyboard
-	+tests_firmware_ECKeyboardReboot
-	+tests_firmware_ECLidShutdown
-	+tests_firmware_ECLidSwitch
-	+tests_firmware_ECPeci
-	+tests_firmware_ECPowerButton
-	+tests_firmware_ECPowerG3
-	+tests_firmware_ECSharedMem
-	+tests_firmware_ECThermal
-	+tests_firmware_ECUpdateId
-	+tests_firmware_ECUsbPorts
-	+tests_firmware_ECWakeSource
-	+tests_firmware_ECWatchdog
-	+tests_firmware_EventLog
-	+tests_firmware_FAFTPrepare
-	+tests_firmware_FAFTModeTransitions
-	+tests_firmware_FAFTRPC
-	+tests_firmware_FAFTSetup
-	biod? ( +tests_firmware_Fingerprint )
-	+tests_firmware_FMap
-	+tests_firmware_FWMPDisableCCD
-	+tests_firmware_FwScreenCloseLid
-	+tests_firmware_FwScreenPressPower
-	+tests_firmware_FWupdateWP
-	+tests_firmware_FWtries
-	+tests_firmware_FWupdateThenSleep
-	+tests_firmware_FWupdateWP
-	+tests_firmware_IntegratedU2F
-	+tests_firmware_InvalidUSB
-	+tests_firmware_LegacyRecovery
-	+tests_firmware_MenuModeTransition
-	+tests_firmware_Mosys
-	+tests_firmware_PDConnect
-	+tests_firmware_PDDataSwap
-	+tests_firmware_PDPowerSwap
-	+tests_firmware_PDProtocol
-	+tests_firmware_PDResetHard
-	+tests_firmware_PDResetSoft
-	+tests_firmware_PDTrySrc
-	+tests_firmware_PDVbusRequest
-	+tests_firmware_RecoveryButton
-	+tests_firmware_RecoveryCacheBootKeys
-	+tests_firmware_RollbackFirmware
-	+tests_firmware_RollbackKernel
-	+tests_firmware_SelfSignedBoot
-	+tests_firmware_SetSerialNumber
-	+tests_firmware_SoftwareSync
-	+tests_firmware_StandbyPowerConsumption
-	+tests_firmware_SysfsVPD
-	+tests_firmware_TPMNotCorruptedDevMode
-	tpm? ( +tests_firmware_TPMExtend )
-	tpm? ( +tests_firmware_TPMVersionCheck )
-	tpm? ( +tests_firmware_TPMKernelVersion )
-	tpm2? ( +tests_firmware_TPMExtend )
-	tpm2? ( +tests_firmware_TPMVersionCheck )
-	tpm2? ( +tests_firmware_TPMKernelVersion )
-	+tests_firmware_TryFwB
-	+tests_firmware_TypeCCharging
-	+tests_firmware_TypeCProbeUSB3
-	+tests_firmware_UpdateFirmwareDataKeyVersion
-	+tests_firmware_UpdateFirmwareVersion
-	+tests_firmware_UpdateKernelDataKeyVersion
-	+tests_firmware_UpdateKernelSubkeyVersion
-	+tests_firmware_UpdateKernelVersion
-	+tests_firmware_UpdaterModes
-	+tests_firmware_UserRequestRecovery
-	+tests_firmware_WilcoDiagnosticsMode
-	+tests_firmware_WriteProtect
-	+tests_firmware_WriteProtectFunc
-	+tests_graphics_PowerConsumption
-	+tests_graphics_MultipleDisplays
-	+tests_hardware_DiskFirmwareUpgrade
-	+tests_hardware_MemoryIntegrity
-	+tests_hardware_StorageQual
-	+tests_hardware_StorageQualBase
-	+tests_hardware_StorageQualCheckSetup
-	+tests_hardware_StorageQualSuspendStress
-	+tests_hardware_StorageQualTrimStress
-	+tests_hardware_StorageStress
-	+tests_kernel_EmptyLines
-	+tests_kernel_ExternalUsbPeripheralsDetectionTest
-	+tests_kernel_IdlePerf
-	+tests_kernel_MemoryRamoop
-	+tests_logging_GenerateCrashFiles
-	moblab? (
-		+tests_moblab_RunSuite
-		+tests_moblab_StorageQual
-	)
-	+tests_moblab_Setup
-	cros_p2p? ( +tests_p2p_EndToEndTest )
-	+tests_network_FirewallHolePunchServer
-	+tests_platform_ActivateDate
-	+tests_platform_BootDevice
-	+tests_platform_BootLockboxServer
-	+tests_platform_BootPerfServer
-	+tests_platform_CompromisedStatefulPartition
-	+tests_platform_CorruptRootfs
-	+tests_platform_CrashStateful
-	+tests_platform_ExternalUsbPeripherals
-	+tests_platform_FlashErasers
-	+tests_platform_Flashrom
-	+tests_platform_HWwatchdog
-	+tests_platform_InitLoginPerfServer
-	+tests_platform_InstallTestImage
-	+tests_platform_InternalDisplay
-	+tests_platform_KernelErrorPaths
-	power_management? (
-		+tests_platform_PowerStatusStress
-		+tests_power_DeferForFlashrom
-		+tests_power_WakeSources
-	)
-	+tests_platform_Powerwash
-	+tests_platform_RotationFps
-	+tests_platform_ServoPowerStateController
-	+tests_platform_StageAndRecover
-	+tests_platform_SuspendResumeTiming
-	+tests_platform_SyncCrash
-	readahead? ( +tests_platform_UReadAheadServer )
-	+tests_platform_Vpd
-	+tests_policy_AUServer
-	+tests_policy_DeviceChargingServer
-	+tests_policy_DeviceServer
-	+tests_policy_ExternalStorageServer
-	+tests_policy_GlobalNetworkSettingsServer
-	+tests_policy_WiFiAutoconnectServer
-	+tests_policy_WiFiPrecedenceServer
-	+tests_policy_WiFiTypesServer
-	+tests_policy_WilcoServerDeviceDockMacAddressSource
-	+tests_policy_WilcoServerOnNonWilcoDevice
-	+tests_policy_WilcoServerUSBPowershare
-	+tests_power_BrightnessResetAfterReboot
-	+tests_power_ChargeControlWrapper
-	+tests_power_MeetCall
-	+tests_power_Monitoring
-	+tests_power_LW
-	+tests_power_PowerlogWrapper
-	+tests_power_RPMTest
-	+tests_power_ServoChargeStress
-	+tests_power_ServodWrapper
-	+tests_provision_AutoUpdate
-	+tests_provision_CheetsUpdate
-	+tests_provision_Cr50TOT
-	+tests_provision_Cr50Update
-	+tests_provision_FactoryImage
-	+tests_provision_FirmwareUpdate
-	+tests_rlz_CheckPing
-	+tests_security_kASLR
-	+tests_sequences
-	+tests_servo_LabControlVerification
-	+tests_servo_LabstationVerification
-	+tests_servo_USBMuxVerification
-	+tests_servo_LogGrab
-	+tests_servo_Verification
-	+tests_servohost_Reboot
-	+tests_stress_ClientTestReboot
-	+tests_stress_EnrollmentRetainment
-"
-
-IUSE_TESTS="${IUSE_TESTS}
-	${SERVER_IUSE_TESTS}
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4784.ebuild b/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4784.ebuild
new file mode 100644
index 0000000..7bbfadc
--- /dev/null
+++ b/chromeos-base/autotest-server-tests/autotest-server-tests-0.0.2-r4784.ebuild
@@ -0,0 +1,346 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="63345f3cd9cc4b4eac10f250a5b82e10aafa64d2"
+CROS_WORKON_TREE="767ab0f0f01a40e411096efa933787b60e4fc470"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotest server tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="android-container android-container-pi android-vm-rvc +autotest biod +cellular cheets_user_64 -chromeless_tests -chromeless_tty cros_p2p debugd dlc_test has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2"
+REQUIRED_USE="?? ( has-kernelnext is-kernelnext )"
+
+RDEPEND=""
+DEPEND="${RDEPEND}
+	!<chromeos-base/autotest-0.0.2
+"
+
+SERVER_IUSE_TESTS="
+	+tests_android_ACTS
+	+tests_android_EasySetup
+	+tests_audio_AudioAfterReboot
+	+tests_audio_AudioAfterSuspend
+	+tests_audio_AudioArtifacts
+	+tests_audio_AudioARCPlayback
+	+tests_audio_AudioARCRecord
+	+tests_audio_AudioBasicAssistant
+	+tests_audio_AudioBasicBluetoothPlayback
+	+tests_audio_AudioBasicBluetoothPlaybackRecord
+	+tests_audio_AudioBasicBluetoothRecord
+	+tests_audio_AudioBasicExternalMicrophone
+	+tests_audio_AudioBasicHDMI
+	+tests_audio_AudioBasicHeadphone
+	+tests_audio_AudioBasicHotwording
+	+tests_audio_AudioBasicInternalMicrophone
+	+tests_audio_AudioBasicInternalSpeaker
+	+tests_audio_AudioBasicUSBPlayback
+	+tests_audio_AudioBasicUSBPlaybackRecord
+	+tests_audio_AudioBasicUSBRecord
+	+tests_audio_AudioBluetoothConnectionStability
+	+tests_audio_AudioNodeSwitch
+	+tests_audio_AudioPinnedStream
+	+tests_audio_AudioQualityAfterSuspend
+	+tests_audio_AudioSanityCheck
+	+tests_audio_AudioVolume
+	+tests_audio_AudioWebRTCLoopback
+	+tests_audio_InternalCardNodes
+	+tests_audio_LeftRightInternalSpeaker
+	+tests_audio_MediaBasicVerification
+	+tests_audio_PowerConsumption
+	+tests_audiovideo_AVSync
+	+tests_autotest_SyncCount
+	+tests_autoupdate_Basic
+	+tests_autoupdate_CatchBadSignatures
+	+tests_autoupdate_Cellular
+	+tests_autoupdate_DataPreserved
+	+tests_autoupdate_ForcedOOBEUpdate
+	+tests_autoupdate_FromUI
+	+tests_autoupdate_Interruptions
+	+tests_autoupdate_NonBlockingOOBEUpdate
+	+tests_autoupdate_OmahaResponse
+	+tests_autoupdate_P2P
+	+tests_autoupdate_Periodic
+	+tests_autoupdate_Rollback
+	dlc_test? ( +tests_autoupdate_WithDLC )
+	has-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
+	is-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
+	cellular? ( +tests_cellular_StaleModemReboot )
+	android-container-pi? (
+		+tests_cheets_CTS_Instant
+		+tests_cheets_CTS_P
+		+tests_cheets_GTS
+	)
+	android-vm-rvc? (
+		cheets_user_64? (
+			+tests_cheets_CTS_R
+			+tests_cheets_GTS_R
+		)
+		!cheets_user_64? (
+			+tests_cheets_VTS_R
+		)
+	)
+	+tests_cheets_LabDependencies
+	debugd? ( +tests_debugd_DevTools )
+	+tests_crosperf_Wrapper
+	+tests_display_EdidStress
+	+tests_display_HDCPScreen
+	+tests_display_HotPlugAtBoot
+	+tests_display_HotPlugAtSuspend
+	+tests_display_HotPlugNoisy
+	+tests_display_LidCloseOpen
+	+tests_display_NoEdid
+	+tests_display_Resolution
+	+tests_display_ResolutionList
+	+tests_display_ServerChameleonConnection
+	+tests_display_SuspendStress
+	+tests_display_SwitchMode
+	+tests_dummy_PassServer
+	+tests_dummy_FailServer
+	+tests_dummy_FlakyTestServer
+	+tests_dummy_SynchronousOffloadServer
+	+tests_enterprise_ClearTPM
+	+tests_enterprise_KioskEnrollmentServer
+	+tests_enterprise_LongevityTrackerServer
+	+tests_enterprise_OnlineDemoMode
+	+tests_factory_Basic
+	+tests_firmware_Bmpblk
+	+tests_firmware_CgptStress
+	+tests_firmware_ClearTPMOwnerAndReset
+	+tests_firmware_ConsecutiveBoot
+	+tests_firmware_ConsecutiveBootPowerButton
+	+tests_firmware_ConsecutiveLidSwitch
+	+tests_firmware_CorruptBothFwBodyAB
+	+tests_firmware_CorruptBothFwSigAB
+	+tests_firmware_CorruptBothKernelAB
+	+tests_firmware_CorruptFwBodyA
+	+tests_firmware_CorruptFwBodyB
+	+tests_firmware_CorruptFwSigA
+	+tests_firmware_CorruptFwSigB
+	+tests_firmware_CorruptKernelA
+	+tests_firmware_CorruptKernelB
+	+tests_firmware_CorruptRecoveryCache
+	+tests_firmware_Cr50BID
+	+tests_firmware_Cr50CCDServoCap
+	+tests_firmware_Cr50CCDUartStress
+	+tests_firmware_Cr50CheckCap
+	+tests_firmware_Cr50ConsoleCommands
+	+tests_firmware_Cr50DeepSleepStress
+	+tests_firmware_Cr50DeferredECReset
+	+tests_firmware_Cr50DeviceState
+	+tests_firmware_Cr50DevMode
+	+tests_firmware_Cr50ECReset
+	+tests_firmware_Cr50FactoryResetVC
+	+tests_firmware_Cr50CCDFirmwareUpdate
+	+tests_firmware_Cr50GetName
+	+tests_firmware_Cr50InvalidateRW
+	+tests_firmware_Cr50Open
+	+tests_firmware_Cr50OpenWhileAPOff
+	+tests_firmware_Cr50PartialBoardId
+	+tests_firmware_Cr50Password
+	+tests_firmware_Cr50PinWeaverServer
+	+tests_firmware_Cr50RddG3
+	+tests_firmware_Cr50RejectUpdate
+	+tests_firmware_Cr50RMAOpen
+	+tests_firmware_Cr50SetBoardId
+	+tests_firmware_Cr50ShortECC
+	+tests_firmware_Cr50Testlab
+	+tests_firmware_Cr50TpmManufactured
+	+tests_firmware_Cr50TpmMode
+	+tests_firmware_Cr50U2fCommands
+	+tests_firmware_Cr50Unlock
+	+tests_firmware_Cr50Update
+	+tests_firmware_Cr50UpdateScriptStress
+	+tests_firmware_Cr50USB
+	+tests_firmware_Cr50WilcoEcrst
+	+tests_firmware_Cr50WilcoRmaFactoryMode
+	+tests_firmware_Cr50WPG3
+	+tests_firmware_DevBootUSB
+	+tests_firmware_DevDefaultBoot
+	+tests_firmware_DevMode
+	+tests_firmware_DevModeStress
+	+tests_firmware_DevScreenTimeout
+	+tests_firmware_ECBattery
+	+tests_firmware_ECBootTime
+	+tests_firmware_ECCbiEeprom
+	+tests_firmware_ECCharging
+	+tests_firmware_ECChargingState
+	+tests_firmware_ECHash
+	+tests_firmware_ECKeyboard
+	+tests_firmware_ECKeyboardReboot
+	+tests_firmware_ECLidShutdown
+	+tests_firmware_ECLidSwitch
+	+tests_firmware_ECPeci
+	+tests_firmware_ECPowerButton
+	+tests_firmware_ECPowerG3
+	+tests_firmware_ECSharedMem
+	+tests_firmware_ECThermal
+	+tests_firmware_ECUpdateId
+	+tests_firmware_ECUsbPorts
+	+tests_firmware_ECWakeSource
+	+tests_firmware_ECWatchdog
+	+tests_firmware_EventLog
+	+tests_firmware_FAFTPrepare
+	+tests_firmware_FAFTModeTransitions
+	+tests_firmware_FAFTRPC
+	+tests_firmware_FAFTSetup
+	biod? (
+		+tests_firmware_Fingerprint
+		+tests_firmware_FingerprintSigner
+	)
+	+tests_firmware_FMap
+	+tests_firmware_FWMPDisableCCD
+	+tests_firmware_FwScreenCloseLid
+	+tests_firmware_FwScreenPressPower
+	+tests_firmware_FWupdateWP
+	+tests_firmware_FWtries
+	+tests_firmware_FWupdateThenSleep
+	+tests_firmware_FWupdateWP
+	+tests_firmware_IntegratedU2F
+	+tests_firmware_InvalidUSB
+	+tests_firmware_LegacyRecovery
+	+tests_firmware_MenuModeTransition
+	+tests_firmware_Mosys
+	+tests_firmware_PDConnect
+	+tests_firmware_PDDataSwap
+	+tests_firmware_PDPowerSwap
+	+tests_firmware_PDProtocol
+	+tests_firmware_PDResetHard
+	+tests_firmware_PDResetSoft
+	+tests_firmware_PDTrySrc
+	+tests_firmware_PDVbusRequest
+	+tests_firmware_RecoveryButton
+	+tests_firmware_RecoveryCacheBootKeys
+	+tests_firmware_RollbackFirmware
+	+tests_firmware_RollbackKernel
+	+tests_firmware_SelfSignedBoot
+	+tests_firmware_SetSerialNumber
+	+tests_firmware_SoftwareSync
+	+tests_firmware_StandbyPowerConsumption
+	+tests_firmware_SysfsVPD
+	+tests_firmware_TPMNotCorruptedDevMode
+	tpm? ( +tests_firmware_TPMExtend )
+	tpm? ( +tests_firmware_TPMVersionCheck )
+	tpm? ( +tests_firmware_TPMKernelVersion )
+	tpm2? ( +tests_firmware_TPMExtend )
+	tpm2? ( +tests_firmware_TPMVersionCheck )
+	tpm2? ( +tests_firmware_TPMKernelVersion )
+	+tests_firmware_TryFwB
+	+tests_firmware_TypeCCharging
+	+tests_firmware_TypeCProbeUSB3
+	+tests_firmware_UpdateFirmwareDataKeyVersion
+	+tests_firmware_UpdateFirmwareVersion
+	+tests_firmware_UpdateKernelDataKeyVersion
+	+tests_firmware_UpdateKernelSubkeyVersion
+	+tests_firmware_UpdateKernelVersion
+	+tests_firmware_UpdaterModes
+	+tests_firmware_UserRequestRecovery
+	+tests_firmware_WilcoDiagnosticsMode
+	+tests_firmware_WriteProtect
+	+tests_firmware_WriteProtectFunc
+	+tests_graphics_PowerConsumption
+	+tests_graphics_MultipleDisplays
+	+tests_hardware_DiskFirmwareUpgrade
+	+tests_hardware_MemoryIntegrity
+	+tests_hardware_StorageQual
+	+tests_hardware_StorageQualBase
+	+tests_hardware_StorageQualCheckSetup
+	+tests_hardware_StorageQualSuspendStress
+	+tests_hardware_StorageQualTrimStress
+	+tests_hardware_StorageStress
+	+tests_infra_TLSExecDUTCommand
+	+tests_kernel_EmptyLines
+	+tests_kernel_ExternalUsbPeripheralsDetectionTest
+	+tests_kernel_IdlePerf
+	+tests_kernel_MemoryRamoop
+	+tests_logging_GenerateCrashFiles
+	moblab? (
+		+tests_moblab_RunSuite
+		+tests_moblab_StorageQual
+	)
+	+tests_moblab_Setup
+	cros_p2p? ( +tests_p2p_EndToEndTest )
+	+tests_network_FirewallHolePunchServer
+	+tests_platform_ActivateDate
+	+tests_platform_BootDevice
+	+tests_platform_BootLockboxServer
+	+tests_platform_BootPerfServer
+	+tests_platform_CompromisedStatefulPartition
+	+tests_platform_CorruptRootfs
+	+tests_platform_CrashStateful
+	+tests_platform_ExternalUsbPeripherals
+	+tests_platform_FlashErasers
+	+tests_platform_Flashrom
+	+tests_platform_HWwatchdog
+	+tests_platform_InitLoginPerfServer
+	+tests_platform_InstallTestImage
+	+tests_platform_InternalDisplay
+	+tests_platform_KernelErrorPaths
+	power_management? (
+		+tests_platform_PowerStatusStress
+		+tests_power_DeferForFlashrom
+		+tests_power_WakeSources
+	)
+	+tests_platform_Powerwash
+	+tests_platform_RotationFps
+	+tests_platform_ServoPowerStateController
+	+tests_platform_StageAndRecover
+	+tests_platform_SuspendResumeTiming
+	+tests_platform_SyncCrash
+	readahead? ( +tests_platform_UReadAheadServer )
+	+tests_platform_Vpd
+	+tests_policy_AUServer
+	+tests_policy_DeviceChargingServer
+	+tests_policy_DeviceServer
+	+tests_policy_ExternalStorageServer
+	+tests_policy_GlobalNetworkSettingsServer
+	+tests_policy_WiFiAutoconnectServer
+	+tests_policy_WiFiPrecedenceServer
+	+tests_policy_WiFiTypesServer
+	+tests_policy_WilcoServerDeviceDockMacAddressSource
+	+tests_policy_WilcoServerOnNonWilcoDevice
+	+tests_policy_WilcoServerUSBPowershare
+	+tests_power_BrightnessResetAfterReboot
+	+tests_power_ChargeControlWrapper
+	+tests_power_MeetCall
+	+tests_power_Monitoring
+	+tests_power_LW
+	+tests_power_PowerlogWrapper
+	+tests_power_RPMTest
+	+tests_power_ServoChargeStress
+	+tests_power_ServodWrapper
+	+tests_provision_CheetsUpdate
+	+tests_provision_Cr50TOT
+	+tests_provision_Cr50Update
+	+tests_provision_FactoryImage
+	+tests_provision_FirmwareUpdate
+	+tests_provision_QuickProvision
+	+tests_rlz_CheckPing
+	+tests_security_kASLR
+	+tests_sequences
+	+tests_servo_LabControlVerification
+	+tests_servo_LabstationVerification
+	+tests_servo_USBMuxVerification
+	+tests_servo_LogGrab
+	+tests_servo_Verification
+	+tests_servohost_Reboot
+	+tests_stress_ClientTestReboot
+	+tests_stress_EnrollmentRetainment
+"
+
+IUSE_TESTS="${IUSE_TESTS}
+	${SERVER_IUSE_TESTS}
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-server-tests/autotest-server-tests-9999.ebuild b/chromeos-base/autotest-server-tests/autotest-server-tests-9999.ebuild
index 9075b9e..3233e6c 100644
--- a/chromeos-base/autotest-server-tests/autotest-server-tests-9999.ebuild
+++ b/chromeos-base/autotest-server-tests/autotest-server-tests-9999.ebuild
@@ -15,7 +15,7 @@
 KEYWORDS="~*"
 
 # Enable autotest by default.
-IUSE="android-container android-container-pi +autotest biod +cellular -chromeless_tests -chromeless_tty cros_p2p debugd has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2"
+IUSE="android-container android-container-pi android-vm-rvc +autotest biod +cellular cheets_user_64 -chromeless_tests -chromeless_tty cros_p2p debugd dlc_test has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2"
 REQUIRED_USE="?? ( has-kernelnext is-kernelnext )"
 
 RDEPEND=""
@@ -57,6 +57,7 @@
 	+tests_audio_PowerConsumption
 	+tests_audiovideo_AVSync
 	+tests_autotest_SyncCount
+	+tests_autoupdate_Basic
 	+tests_autoupdate_CatchBadSignatures
 	+tests_autoupdate_Cellular
 	+tests_autoupdate_DataPreserved
@@ -66,18 +67,27 @@
 	+tests_autoupdate_NonBlockingOOBEUpdate
 	+tests_autoupdate_OmahaResponse
 	+tests_autoupdate_P2P
+	+tests_autoupdate_Periodic
 	+tests_autoupdate_Rollback
+	dlc_test? ( +tests_autoupdate_WithDLC )
 	has-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
 	is-kernelnext? ( +tests_autoupdate_StatefulCompatibility )
-	+tests_brillo_gTests
 	cellular? ( +tests_cellular_StaleModemReboot )
 	android-container-pi? (
 		+tests_cheets_CTS_Instant
 		+tests_cheets_CTS_P
 		+tests_cheets_GTS
-		+tests_cheets_VTS
 	)
-	+tests_component_UpdateFlash
+	android-vm-rvc? (
+		cheets_user_64? (
+			+tests_cheets_CTS_R
+			+tests_cheets_GTS_R
+		)
+		!cheets_user_64? (
+			+tests_cheets_VTS_R
+		)
+	)
+	+tests_cheets_LabDependencies
 	debugd? ( +tests_debugd_DevTools )
 	+tests_crosperf_Wrapper
 	+tests_display_EdidStress
@@ -181,7 +191,10 @@
 	+tests_firmware_FAFTModeTransitions
 	+tests_firmware_FAFTRPC
 	+tests_firmware_FAFTSetup
-	biod? ( +tests_firmware_Fingerprint )
+	biod? (
+		+tests_firmware_Fingerprint
+		+tests_firmware_FingerprintSigner
+	)
 	+tests_firmware_FMap
 	+tests_firmware_FWMPDisableCCD
 	+tests_firmware_FwScreenCloseLid
@@ -242,6 +255,7 @@
 	+tests_hardware_StorageQualSuspendStress
 	+tests_hardware_StorageQualTrimStress
 	+tests_hardware_StorageStress
+	+tests_infra_TLSExecDUTCommand
 	+tests_kernel_EmptyLines
 	+tests_kernel_ExternalUsbPeripheralsDetectionTest
 	+tests_kernel_IdlePerf
@@ -302,12 +316,12 @@
 	+tests_power_RPMTest
 	+tests_power_ServoChargeStress
 	+tests_power_ServodWrapper
-	+tests_provision_AutoUpdate
 	+tests_provision_CheetsUpdate
 	+tests_provision_Cr50TOT
 	+tests_provision_Cr50Update
 	+tests_provision_FactoryImage
 	+tests_provision_FirmwareUpdate
+	+tests_provision_QuickProvision
 	+tests_rlz_CheckPing
 	+tests_security_kASLR
 	+tests_sequences
diff --git a/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3204.ebuild b/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3204.ebuild
deleted file mode 100644
index c47c1f1..0000000
--- a/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3204.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_COMMIT="c8c63eb666a4d49fba31891ac6e8a5e4c316dcf6"
-CROS_WORKON_TREE="242ee15394971ce82ccce6138b23f63b9fffa635"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Audio autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-	chromeos-base/audiotest
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_audio_Aconnect
-	+tests_audio_AlsaLoopback
-	+tests_audio_Aplay
-	+tests_audio_CRASFormatConversion
-	+tests_audio_CrasDevSwitchStress
-	+tests_audio_CrasLoopback
-	+tests_audio_CrasPinnedStream
-	+tests_audio_CrasStress
-	+tests_audio_LoopbackLatency
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3215.ebuild b/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3215.ebuild
new file mode 100644
index 0000000..4bd4ee6
--- /dev/null
+++ b/chromeos-base/autotest-tests-audio/autotest-tests-audio-0.0.1-r3215.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="f87b49edd46ee81d6238c1aeac57b8cfe66482aa"
+CROS_WORKON_TREE="f93558b8a70c6080afd69871b0752fdf060d768c"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Audio autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest -chromeless_tty"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+	chromeos-base/audiotest
+	!chromeless_tty? ( chromeos-base/telemetry )
+"
+DEPEND="${RDEPEND}"
+
+# audio_AudioInputGain and audio_CrasGetNodes depend on telemetry.
+IUSE_TESTS="
+	+tests_audio_Aconnect
+	+tests_audio_Aplay
+	!chromeless_tty? (
+		+tests_audio_AudioInputGain
+		+tests_audio_CrasGetNodes
+	)
+	+tests_audio_CRASFormatConversion
+	+tests_audio_CrasDevSwitchStress
+	+tests_audio_CrasPinnedStream
+	+tests_audio_CrasStress
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+src_prepare() {
+	if ! use chromeless_tty; then
+		# Telemetry tests require the path to telemetry source to exist in order to
+		# build. Copy the telemetry source to a temporary directory that is writable,
+		# so that file removals in Telemetry source can be performed properly.
+		export TMP_DIR="$(mktemp -d)"
+		cp -r "${SYSROOT}/usr/local/telemetry" "${TMP_DIR}"
+		export PYTHONPATH="${TMP_DIR}/telemetry/src/third_party/catapult/telemetry"
+	fi
+	autotest_src_prepare
+}
diff --git a/chromeos-base/autotest-tests-audio/autotest-tests-audio-9999.ebuild b/chromeos-base/autotest-tests-audio/autotest-tests-audio-9999.ebuild
index ca830a0..296a9bf 100644
--- a/chromeos-base/autotest-tests-audio/autotest-tests-audio-9999.ebuild
+++ b/chromeos-base/autotest-tests-audio/autotest-tests-audio-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2014 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=4
+EAPI=7
 CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
 CROS_WORKON_LOCALNAME="third_party/autotest/files"
 
@@ -15,26 +15,41 @@
 SLOT="0"
 KEYWORDS="~*"
 # Enable autotest by default.
-IUSE="+autotest"
+IUSE="+autotest -chromeless_tty"
 
 RDEPEND="
 	!<chromeos-base/autotest-tests-0.0.3
 	chromeos-base/audiotest
+	!chromeless_tty? ( chromeos-base/telemetry )
 "
 DEPEND="${RDEPEND}"
 
+# audio_AudioInputGain and audio_CrasGetNodes depend on telemetry.
 IUSE_TESTS="
 	+tests_audio_Aconnect
-	+tests_audio_AlsaLoopback
 	+tests_audio_Aplay
+	!chromeless_tty? (
+		+tests_audio_AudioInputGain
+		+tests_audio_CrasGetNodes
+	)
 	+tests_audio_CRASFormatConversion
 	+tests_audio_CrasDevSwitchStress
-	+tests_audio_CrasLoopback
 	+tests_audio_CrasPinnedStream
 	+tests_audio_CrasStress
-	+tests_audio_LoopbackLatency
 "
 
 IUSE="${IUSE} ${IUSE_TESTS}"
 
 AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+src_prepare() {
+	if ! use chromeless_tty; then
+		# Telemetry tests require the path to telemetry source to exist in order to
+		# build. Copy the telemetry source to a temporary directory that is writable,
+		# so that file removals in Telemetry source can be performed properly.
+		export TMP_DIR="$(mktemp -d)"
+		cp -r "${SYSROOT}/usr/local/telemetry" "${TMP_DIR}"
+		export PYTHONPATH="${TMP_DIR}/telemetry/src/third_party/catapult/telemetry"
+	fi
+	autotest_src_prepare
+}
diff --git a/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3231.ebuild b/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3231.ebuild
deleted file mode 100644
index 5daaaf9..0000000
--- a/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3231.ebuild
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="ea37378c7db764f03a920310b211052004665222"
-CROS_WORKON_TREE="f32bcca367662af667f3f3bd9204618d002bb13a"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Cellular autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.2
-	chromeos-base/autotest-deps-cellular
-	chromeos-base/shill-test-scripts
-	dev-python/pygobject
-	dev-python/pyusb
-	sys-apps/ethtool
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_cellular_ActivateLTE
-	+tests_cellular_ConnectFailure
-	+tests_cellular_DeferredRegistration
-	+tests_cellular_DisableWhileConnecting
-	+tests_cellular_DisconnectFailure
-	+tests_cellular_Identifiers
-	+tests_cellular_OutOfCreditsSubscriptionState
-	+tests_cellular_SIMLocking
-	+tests_cellular_SafetyDance
-	+tests_cellular_ScanningProperty
-	+tests_cellular_ServiceName
-	+tests_cellular_Smoke
-	+tests_cellular_StressEnable
-"
-
-IUSE_MBIM_TESTS="
-	+tests_cellular_MbimComplianceControlCommand
-	+tests_cellular_MbimComplianceControlRequest
-	+tests_cellular_MbimComplianceDataTransfer
-	+tests_cellular_MbimComplianceDescriptor
-	+tests_cellular_MbimComplianceError
-"
-
-IUSE_TESTS="${IUSE_TESTS} ${IUSE_MBIM_TESTS}"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-AUTOTEST_DEPS_LIST=""
-AUTOTEST_CONFIG_LIST=""
-AUTOTEST_PROFILERS_LIST=""
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3232.ebuild b/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3232.ebuild
new file mode 100644
index 0000000..0417722
--- /dev/null
+++ b/chromeos-base/autotest-tests-cellular/autotest-tests-cellular-0.0.1-r3232.ebuild
@@ -0,0 +1,65 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5cda21d99c4467da245680825583a257456c611c"
+CROS_WORKON_TREE="e0520deac538428a08c61ba6accd41590595dd7a"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Cellular autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.2
+	chromeos-base/autotest-deps-cellular
+	chromeos-base/shill-test-scripts
+	dev-python/pygobject
+	dev-python/pyusb
+	sys-apps/ethtool
+"
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	+tests_cellular_ActivateLTE
+	+tests_cellular_ConnectFailure
+	+tests_cellular_DeferredRegistration
+	+tests_cellular_DisableWhileConnecting
+	+tests_cellular_DisconnectFailure
+	+tests_cellular_Identifiers
+	+tests_cellular_OutOfCreditsSubscriptionState
+	+tests_cellular_SIMLocking
+	+tests_cellular_SafetyDance
+	+tests_cellular_ScanningProperty
+	+tests_cellular_ServiceName
+	+tests_cellular_Smoke
+	+tests_cellular_StressEnable
+"
+
+IUSE_MBIM_TESTS="
+	+tests_cellular_MbimComplianceControlCommand
+	+tests_cellular_MbimComplianceControlRequest
+	+tests_cellular_MbimComplianceDataTransfer
+	+tests_cellular_MbimComplianceDescriptor
+	+tests_cellular_MbimComplianceError
+"
+
+IUSE_TESTS="${IUSE_TESTS} ${IUSE_MBIM_TESTS}"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+AUTOTEST_DEPS_LIST=""
+AUTOTEST_CONFIG_LIST=""
+AUTOTEST_PROFILERS_LIST=""
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-0.0.1-r2438.ebuild b/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-0.0.1-r2438.ebuild
deleted file mode 100644
index d002d2e..0000000
--- a/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-0.0.1-r2438.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_COMMIT="edf345c66d0eece43912c9c813a24825fdd338dd"
-CROS_WORKON_TREE="0403c48eb6c76d705968f240a92353631701a279"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="autotests for cloud services related functionality"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-IUSE_TESTS="
-	+tests_buffet_BasicDBusAPI
-	+tests_buffet_Registration
-	+tests_buffet_RestartWhenRegistered
-	+tests_buffet_RefreshAccessToken
-	+tests_buffet_InvalidCredentials
-	+tests_buffet_IntermittentConnectivity
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
diff --git a/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-9999.ebuild b/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-9999.ebuild
deleted file mode 100644
index 886fead..0000000
--- a/chromeos-base/autotest-tests-cloud-services/autotest-tests-cloud-services-9999.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="autotests for cloud services related functionality"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="~*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-IUSE_TESTS="
-	+tests_buffet_BasicDBusAPI
-	+tests_buffet_Registration
-	+tests_buffet_RestartWhenRegistered
-	+tests_buffet_RefreshAccessToken
-	+tests_buffet_InvalidCredentials
-	+tests_buffet_IntermittentConnectivity
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
diff --git a/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3185.ebuild b/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3185.ebuild
deleted file mode 100644
index efe600e..0000000
--- a/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3185.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="dce65808844ad64b3b23b392b544b573ab595e5f"
-CROS_WORKON_TREE="fdedfbe7ec1ca9fc1a826d793c1579084ff956f3"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="cros-disks autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_platform_CrosDisksArchive
-	+tests_platform_CrosDisksFilesystem
-	+tests_platform_CrosDisksFormat
-	+tests_platform_CrosDisksRename
-	+tests_platform_CrosDisksSshfs
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3196.ebuild b/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3196.ebuild
new file mode 100644
index 0000000..1a9ee0e
--- /dev/null
+++ b/chromeos-base/autotest-tests-cros-disks/autotest-tests-cros-disks-0.0.1-r3196.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="f87b49edd46ee81d6238c1aeac57b8cfe66482aa"
+CROS_WORKON_TREE="f93558b8a70c6080afd69871b0752fdf060d768c"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="cros-disks autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+"
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	+tests_platform_CrosDisksArchive
+	+tests_platform_CrosDisksFilesystem
+	+tests_platform_CrosDisksFormat
+	+tests_platform_CrosDisksRename
+	+tests_platform_CrosDisksSshfs
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3180.ebuild b/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3180.ebuild
deleted file mode 100644
index e158441..0000000
--- a/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3180.ebuild
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="edf345c66d0eece43912c9c813a24825fdd338dd"
-CROS_WORKON_TREE="0403c48eb6c76d705968f240a92353631701a279"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Cryptohome autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-COMMON_DEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/cryptohome-dev-utils
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-"
-
-IUSE_TESTS="
-	+tests_platform_BootLockbox
-	+tests_platform_CryptohomeBadPerms
-	+tests_platform_CryptohomeChangePassword
-	+tests_platform_CryptohomeFio
-	+tests_platform_CryptohomeGetEnrollmentId
-	+tests_platform_CryptohomeKeyEviction
-	+tests_platform_CryptohomeLECredentialManager
-	+tests_platform_CryptohomeLECredentialManagerServer
-	+tests_platform_CryptohomeMigrateChapsToken
-	+tests_platform_CryptohomeMigrateChapsTokenClient
-	+tests_platform_CryptohomeMigrateKey
-	+tests_platform_CryptohomeMount
-	+tests_platform_CryptohomeMultiple
-	+tests_platform_CryptohomeNonDirs
-	+tests_platform_CryptohomeStress
-	+tests_platform_CryptohomeTestAuth
-	+tests_platform_CryptohomeTpmLiveTest
-	+tests_platform_CryptohomeTpmLiveTestServer
-	+tests_platform_CryptohomeTPMReOwn
-	+tests_platform_CryptohomeTPMReOwnServer
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3181.ebuild b/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3181.ebuild
new file mode 100644
index 0000000..a13b461
--- /dev/null
+++ b/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-0.0.1-r3181.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="06c1777d76980be0d0f447324b8d063f53558fd2"
+CROS_WORKON_TREE="c34d264bfd49429b59f604ee48149e6d8c824b3d"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Cryptohome autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest"
+
+COMMON_DEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/cryptohome-dev-utils
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+"
+
+IUSE_TESTS="
+	+tests_platform_BootLockbox
+	+tests_platform_CryptohomeBadPerms
+	+tests_platform_CryptohomeChangePassword
+	+tests_platform_CryptohomeFio
+	+tests_platform_CryptohomeKeyEviction
+	+tests_platform_CryptohomeLECredentialManager
+	+tests_platform_CryptohomeLECredentialManagerServer
+	+tests_platform_CryptohomeMigrateChapsToken
+	+tests_platform_CryptohomeMigrateChapsTokenClient
+	+tests_platform_CryptohomeMigrateKey
+	+tests_platform_CryptohomeMount
+	+tests_platform_CryptohomeMultiple
+	+tests_platform_CryptohomeNonDirs
+	+tests_platform_CryptohomeStress
+	+tests_platform_CryptohomeTestAuth
+	+tests_platform_CryptohomeTpmLiveTest
+	+tests_platform_CryptohomeTpmLiveTestServer
+	+tests_platform_CryptohomeTPMReOwn
+	+tests_platform_CryptohomeTPMReOwnServer
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-9999.ebuild b/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-9999.ebuild
index ba5c1d0d..c6cfe3e 100644
--- a/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-9999.ebuild
+++ b/chromeos-base/autotest-tests-cryptohome/autotest-tests-cryptohome-9999.ebuild
@@ -35,7 +35,6 @@
 	+tests_platform_CryptohomeBadPerms
 	+tests_platform_CryptohomeChangePassword
 	+tests_platform_CryptohomeFio
-	+tests_platform_CryptohomeGetEnrollmentId
 	+tests_platform_CryptohomeKeyEviction
 	+tests_platform_CryptohomeLECredentialManager
 	+tests_platform_CryptohomeLECredentialManagerServer
diff --git a/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3238.ebuild b/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3238.ebuild
deleted file mode 100644
index 7bc9ec4..0000000
--- a/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3238.ebuild
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="edf345c66d0eece43912c9c813a24825fdd338dd"
-CROS_WORKON_TREE="0403c48eb6c76d705968f240a92353631701a279"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-sanitizers cros-workon autotest
-
-DESCRIPTION="Graphics autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-	chromeos-base/autotest-deps-graphics
-	tests_graphics_Gbm? ( media-libs/minigbm )
-	tests_graphics_GLBench? ( chromeos-base/glbench )
-	tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 )
-	tests_graphics_SanAngeles? ( media-libs/waffle )
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_graphics_dEQP
-	+tests_graphics_Gbm
-	+tests_graphics_GLAPICheck
-	+tests_graphics_GLBench
-	+tests_graphics_GLMark2
-	+tests_graphics_KernelConfig
-	+tests_graphics_KernelMemory
-	+tests_graphics_LibDRM
-	+tests_graphics_PerfControl
-	+tests_graphics_SanAngeles
-	+tests_graphics_SyncControlTest
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
-
-src_configure() {
-	sanitizers-setup-env
-	default
-}
diff --git a/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3240.ebuild b/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3240.ebuild
new file mode 100644
index 0000000..23acaa5
--- /dev/null
+++ b/chromeos-base/autotest-tests-graphics/autotest-tests-graphics-0.0.1-r3240.ebuild
@@ -0,0 +1,53 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="933e6468b8f213afe9feaca6c39bb7f58f330ded"
+CROS_WORKON_TREE="351b54172e899e93c98ef90a9420a356aefaeabc"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-sanitizers cros-workon autotest
+
+DESCRIPTION="Graphics autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+	chromeos-base/autotest-deps-graphics
+	tests_graphics_Gbm? ( media-libs/minigbm )
+	tests_graphics_GLBench? ( chromeos-base/glbench )
+	tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 )
+	tests_graphics_SanAngeles? ( media-libs/waffle )
+"
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	+tests_graphics_dEQP
+	+tests_graphics_Gbm
+	+tests_graphics_GLAPICheck
+	+tests_graphics_GLBench
+	+tests_graphics_GLMark2
+	+tests_graphics_KernelConfig
+	+tests_graphics_KernelMemory
+	+tests_graphics_LibDRM
+	+tests_graphics_PerfControl
+	+tests_graphics_SanAngeles
+	+tests_graphics_SyncControlTest
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
diff --git a/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3222.ebuild b/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3222.ebuild
deleted file mode 100644
index ae78e89..0000000
--- a/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3222.ebuild
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_COMMIT="f3a9b76b928161ce358235b43414a48e97868341"
-CROS_WORKON_TREE="e7896d2d7bdc3febf5f53fabc2c82a82fbc38131"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="power autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest +shill"
-
-RDEPEND="
-	shill? ( chromeos-base/shill-test-scripts )
-	!<chromeos-base/autotest-tests-0.0.3
-"
-DEPEND="${RDEPEND}"
-
-# cros/power_suspend depends on shill-test-scripts.
-IUSE_TESTS="
-	+tests_hardware_Backlight
-	+tests_power_ARMSettings
-	+tests_power_Backlight
-	+tests_power_BacklightControl
-	+tests_power_BacklightSuspend
-	+tests_power_BatteryCharge
-	+tests_power_CameraSuspend
-	+tests_power_CheckAC
-	+tests_power_CheckAfterSuspend
-	+tests_power_CPUFreq
-	+tests_power_CPUIdle
-	+tests_power_Draw
-	+tests_power_Dummy
-	+tests_power_HotCPUSuspend
-	+tests_power_KernelSuspend
-	+tests_power_MemorySuspend
-	+tests_power_NoConsoleSuspend
-	+tests_power_ProbeDriver
-	shill? ( +tests_power_Resume )
-	+tests_power_Standby
-	+tests_power_StatsCPUFreq
-	+tests_power_StatsCPUIdle
-	+tests_power_StatsUSB
-	+tests_power_Status
-	shill? (
-		+tests_power_SuspendStress
-		+tests_power_SuspendToIdle
-	)
-	+tests_power_WaitForCoolDown
-	+tests_power_WakeupRTC
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3226.ebuild b/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3226.ebuild
new file mode 100644
index 0000000..c989679
--- /dev/null
+++ b/chromeos-base/autotest-tests-power/autotest-tests-power-0.0.1-r3226.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=4
+CROS_WORKON_COMMIT="eaaa77b31fe518bffd76e0e0b6c4ed259aaf1b8a"
+CROS_WORKON_TREE="147762ef4e023969c0cb78aef2ad2560f762c90f"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="power autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest +shill"
+
+RDEPEND="
+	shill? ( chromeos-base/shill-test-scripts )
+	!<chromeos-base/autotest-tests-0.0.3
+"
+DEPEND="${RDEPEND}"
+
+# cros/power_suspend depends on shill-test-scripts.
+IUSE_TESTS="
+	+tests_hardware_Backlight
+	+tests_power_ARMSettings
+	+tests_power_Backlight
+	+tests_power_BacklightControl
+	+tests_power_BacklightSuspend
+	+tests_power_BatteryCharge
+	+tests_power_CheckAC
+	+tests_power_CheckAfterSuspend
+	+tests_power_CPUFreq
+	+tests_power_CPUIdle
+	+tests_power_Draw
+	+tests_power_Dummy
+	+tests_power_HotCPUSuspend
+	+tests_power_KernelSuspend
+	+tests_power_MemorySuspend
+	+tests_power_NoConsoleSuspend
+	+tests_power_ProbeDriver
+	shill? ( +tests_power_Resume )
+	+tests_power_Standby
+	+tests_power_StatsCPUFreq
+	+tests_power_StatsCPUIdle
+	+tests_power_StatsUSB
+	+tests_power_Status
+	shill? (
+		+tests_power_SuspendStress
+		+tests_power_SuspendToIdle
+	)
+	+tests_power_WaitForCoolDown
+	+tests_power_WakeupRTC
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-power/autotest-tests-power-9999.ebuild b/chromeos-base/autotest-tests-power/autotest-tests-power-9999.ebuild
index e17bc26..c92090e 100644
--- a/chromeos-base/autotest-tests-power/autotest-tests-power-9999.ebuild
+++ b/chromeos-base/autotest-tests-power/autotest-tests-power-9999.ebuild
@@ -31,7 +31,6 @@
 	+tests_power_BacklightControl
 	+tests_power_BacklightSuspend
 	+tests_power_BatteryCharge
-	+tests_power_CameraSuspend
 	+tests_power_CheckAC
 	+tests_power_CheckAfterSuspend
 	+tests_power_CPUFreq
diff --git a/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3299.ebuild b/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3299.ebuild
deleted file mode 100644
index 4257bde..0000000
--- a/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3299.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="4d9db8dacdde73d48612590c733504c057e879cb"
-CROS_WORKON_TREE="3dbede8d5e4384eb19daf7b80a82cbc312320791"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest libchrome
-
-DESCRIPTION="Security autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest -chromeless_tests -chromeless_tty containers +seccomp selinux"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-	containers? (
-		tests_security_Libcontainer? (
-			chromeos-base/minijail
-			chromeos-base/libcontainer
-		)
-	)
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	!chromeless_tty? (
-		!chromeless_tests? (
-			+tests_security_RendererSandbox
-			+tests_security_SessionManagerDbusEndpoints
-		)
-	)
-	seccomp? (
-		+tests_security_SeccompSyscallFilters
-	)
-	containers? ( +tests_security_Libcontainer )
-	+tests_security_NosymfollowMountOption
-	+tests_security_ProcessManagementPolicy
-	+tests_security_RootfsOwners
-	+tests_security_SysVIPC
-	x86? ( +tests_security_x86Registers )
-	amd64? ( +tests_security_x86Registers )
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3301.ebuild b/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3301.ebuild
new file mode 100644
index 0000000..f57f654
--- /dev/null
+++ b/chromeos-base/autotest-tests-security/autotest-tests-security-0.0.1-r3301.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="1201b78e4fc42507ced1b2710565854b78abf782"
+CROS_WORKON_TREE="88aeb70b515a41f329432d545d85f3b8a883666a"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest libchrome
+
+DESCRIPTION="Security autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest -chromeless_tests -chromeless_tty containers +seccomp selinux"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+	containers? (
+		tests_security_Libcontainer? (
+			chromeos-base/minijail
+			chromeos-base/libcontainer
+		)
+	)
+"
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	!chromeless_tty? (
+		!chromeless_tests? (
+			+tests_security_RendererSandbox
+			+tests_security_SessionManagerDbusEndpoints
+		)
+	)
+	seccomp? (
+		+tests_security_SeccompSyscallFilters
+	)
+	containers? ( +tests_security_Libcontainer )
+	+tests_security_NosymfollowMountOption
+	+tests_security_ProcessManagementPolicy
+	+tests_security_RootfsOwners
+	+tests_security_SysVIPC
+	x86? ( +tests_security_x86Registers )
+	amd64? ( +tests_security_x86Registers )
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3179.ebuild b/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3179.ebuild
deleted file mode 100644
index 64e3cda..0000000
--- a/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3179.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="33392eee6e2ab95632c5078b4e3f8637ad027aea"
-CROS_WORKON_TREE="eda22a9d32fc23478a0375ca2ee83c57fd3ea143"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="Autotests involving the tpm"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-# Enable autotest by default.
-IUSE="+autotest tpm2"
-
-RDEPEND="
-	!<chromeos-base/autotest-tests-0.0.3
-	tpm2? ( chromeos-base/g2f_tools )
-"
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_firmware_Cr50VirtualNVRam
-	+tests_firmware_Cr50VirtualNVRamServer
-	+tests_firmware_Cr50U2fPowerwash
-	+tests_hardware_TPMCheck
-	+tests_kernel_TPMStress
-	+tests_platform_Pkcs11InitUnderErrors
-	+tests_platform_Pkcs11ChangeAuthData
-	+tests_platform_Pkcs11Events
-	+tests_platform_Pkcs11LoadPerf
-	+tests_platform_TPMEvict
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3181.ebuild b/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3181.ebuild
new file mode 100644
index 0000000..211119fd
--- /dev/null
+++ b/chromeos-base/autotest-tests-tpm/autotest-tests-tpm-0.0.1-r3181.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="2faa973a03d19a65dff0f466372b5c9ee873de20"
+CROS_WORKON_TREE="6451cb30fa4cf9b6fddc40ecafa734b421239f7f"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="Autotests involving the tpm"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+# Enable autotest by default.
+IUSE="+autotest tpm2"
+
+RDEPEND="
+	!<chromeos-base/autotest-tests-0.0.3
+	tpm2? ( chromeos-base/g2f_tools )
+"
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	+tests_firmware_Cr50VirtualNVRam
+	+tests_firmware_Cr50VirtualNVRamServer
+	+tests_firmware_Cr50U2fPowerwash
+	+tests_hardware_TPMCheck
+	+tests_kernel_TPMStress
+	+tests_platform_Pkcs11InitUnderErrors
+	+tests_platform_Pkcs11ChangeAuthData
+	+tests_platform_Pkcs11Events
+	+tests_platform_Pkcs11LoadPerf
+	+tests_platform_TPMEvict
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r1282.ebuild b/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r1282.ebuild
new file mode 100644
index 0000000..77cb1e4
--- /dev/null
+++ b/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r1282.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon autotest
+
+DESCRIPTION="kvm host autotests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+autotest"
+
+RDEPEND=""
+DEPEND="${RDEPEND}"
+
+IUSE_TESTS="
+	+tests_vm_CrosVmStart
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r718.ebuild b/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r718.ebuild
deleted file mode 100644
index 315d63c..0000000
--- a/chromeos-base/autotest-tests-vm-host/autotest-tests-vm-host-0.0.1-r718.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon autotest
-
-DESCRIPTION="kvm host autotests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+autotest"
-
-RDEPEND=""
-DEPEND="${RDEPEND}"
-
-IUSE_TESTS="
-	+tests_vm_CrosVmStart
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8830.ebuild b/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8830.ebuild
deleted file mode 100644
index 640f97b..0000000
--- a/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8830.ebuild
+++ /dev/null
@@ -1,225 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-
-inherit libchrome cros-workon autotest
-
-DESCRIPTION="Autotest tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups +encrypted_stateful +network_time +passive_metrics +profile vaapi"
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-# pygobject is used in the following tests:
-#   platform_CrosDisks*
-RDEPEND="
-	>=chromeos-base/autotest-deps-0.0.3
-	!<=chromeos-base/autotest-factory-0.0.1-r4445
-	dev-python/numpy
-	dev-python/pygobject
-	dev-python/pytest
-	dev-python/python-uinput
-	media-sound/sox
-	sys-apps/ethtool
-	vaapi? ( x11-libs/libva )
-	virtual/autotest-tests
-"
-
-RDEPEND="${RDEPEND}
-	tests_dbench? ( dev-libs/libaio )
-	tests_platform_MetricsUploader? (
-		chromeos-base/metrics
-		dev-python/protobuf-python
-	)
-	tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file )
-	tests_hardware_MemoryLatency? ( app-benchmarks/lmbench )
-	tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench )
-	tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks )
-	tests_kernel_Lmbench? ( app-benchmarks/lmbench )
-	tests_security_SMMLocked? ( sys-apps/pciutils )
-	arc-camera3? (
-		tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 )
-		tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 )
-	)
-	tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 )
-	tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests )
-"
-
-DEPEND="${RDEPEND}"
-
-X86_IUSE_TESTS="
-	+tests_security_SMMLocked
-	+tests_xfsFilesystemTestSuite
-	+tests_hardware_UnsafeMemory
-"
-
-CLIENT_IUSE_TESTS="
-	x86? ( ${X86_IUSE_TESTS} )
-	amd64? ( ${X86_IUSE_TESTS} )
-	+tests_profiler_sync
-	+tests_compilebench
-	+tests_crashme
-	+tests_dbench
-	+tests_ddtest
-	+tests_disktest
-	+tests_fsx
-	+tests_hackbench
-	+tests_iperf
-	+tests_bonnie
-	+tests_iozone
-	+tests_netpipe
-	+tests_sleeptest
-	+tests_kernel_sysrq_info
-	+tests_unixbench
-	+tests_autoupdate_Backoff
-	+tests_autoupdate_BadMetadata
-	+tests_autoupdate_CannedOmahaUpdate
-	+tests_autoupdate_DisconnectReconnectNetwork
-	+tests_autoupdate_UrlSwitch
-	+tests_blktestsSuiteAll
-	+tests_blktestsSuiteLoopOverBlk
-	+tests_blktestsSuiteLoopOverFile
-	+tests_blktestsSuiteRealBlk
-	+tests_camera_V4L2
-	arc-camera3? (
-		+tests_camera_HAL3
-		+tests_camera_HAL3Perf
-	)
-	+tests_dummy_Fail
-	+tests_dummy_Pass
-	+tests_dummy_SynchronousOffload
-	tests_example_UnitTest
-	+tests_firmware_LockedME
-	+tests_firmware_RomSize
-	+tests_firmware_SetFWMP
-	+tests_firmware_VbootCrypto
-	+tests_flaky_test
-	+tests_hardware_Badblocks
-	+tests_hardware_DiskSize
-	+tests_hardware_EC
-	+tests_hardware_EepromWriteProtect
-	+tests_hardware_GobiGPS
-	+tests_hardware_GPIOSwitches
-	+tests_hardware_GPS
-	+tests_hardware_I2CProbe
-	+tests_hardware_Interrupt
-	+tests_hardware_Keyboard
-	+tests_hardware_LightSensor
-	+tests_hardware_MemoryLatency
-	+tests_hardware_MemoryThroughput
-	+tests_hardware_MemoryZRAMThroughput
-	+tests_hardware_Memtester
-	+tests_hardware_MultiReader
-	+tests_hardware_ProbeComponents
-	+tests_hardware_RamFio
-	+tests_hardware_RealtekCardReader
-	+tests_hardware_Resolution
-	+tests_hardware_SAT
-	+tests_hardware_Smartctl
-	+tests_hardware_SsdDetection
-	+tests_hardware_StorageFio
-	+tests_hardware_StorageFioOther
-	+tests_hardware_StorageTrim
-	+tests_hardware_StorageWearoutDetect
-	+tests_hardware_TouchScreenPowerCycles
-	tests_hardware_TouchScreenPresent
-	+tests_hardware_TrimIntegrity
-	+tests_infra_FirmwareAutoupdate
-	+tests_kernel_AsyncDriverProbe
-	+tests_kernel_FirmwareRequest
-	+tests_kernel_CrosECSysfsAccel
-	+tests_kernel_Delay
-	+tests_kernel_fs_Punybench
-	+tests_kernel_Ktime
-	+tests_kernel_Lmbench
-	+tests_kernel_Memory_Ramoop
-	+tests_kernel_SchedBandwith
-	crash_reporting? (
-		+tests_logging_CrashSender
-		+tests_logging_KernelCrash
-		+tests_logging_UdevCrash
-		+tests_logging_UserCrash
-		+tests_platform_AnomalyDetector
-	)
-	+tests_network_EthCaps
-	+tests_network_EthernetStressPlug
-	+tests_network_Ipv6SimpleNegotiation
-	+tests_network_NegotiatedLANSpeed
-	+tests_platform_AccurateTime
-	+tests_platform_AesThroughput
-	!chromeless_tty? (
-		+tests_platform_BootPerf
-	)
-	+tests_platform_CheckErrorsInLog
-	+tests_platform_CleanShutdown
-	+tests_platform_Crossystem
-	+tests_platform_Crouton
-	+tests_platform_DaemonsRespawn
-	+tests_platform_DBusMachineIdRotation
-	encrypted_stateful? ( +tests_platform_EncryptedStateful )
-	+tests_platform_ExternalUSBBootStress
-	+tests_platform_ExternalUSBStress
-	+tests_platform_FileNum
-	+tests_platform_FileSize
-	biod? ( +tests_platform_Fingerprint )
-	+tests_platform_Firewall
-	+tests_platform_FullyChargedPowerStatus
-	+tests_platform_HighResTimers
-	+tests_platform_ImageLoader
-	+tests_platform_ImageLoaderServer
-	+tests_platform_KernelVersion
-	+tests_platform_LibCBench
-	+tests_platform_LogDupSuppression
-	+tests_platform_LogNonKernelKmsg
-	+tests_platform_MemCheck
-	+tests_platform_MemoryMonitor
-	chromeless_tty? ( +tests_platform_MetricsUploader )
-	+tests_platform_NetParms
-	+tests_platform_OpenSSLActual
-	profile? (
-		+tests_platform_Perf
-		+tests_platform_Quipper
-	)
-	cups? ( +tests_platform_PrinterPpds )
-	+tests_platform_Rootdev
-	+tests_platform_SecureEraseFile
-	!chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration )
-	+tests_platform_TabletMode
-	+tests_platform_TempFS
-	network_time? (
-		+tests_platform_TLSDate
-		+tests_platform_TLSDateActual
-	)
-	+tests_platform_UdevVars
-	+tests_suite_HWConfig
-	+tests_suite_HWQual
-	+tests_system_ColdBoot
-	+tests_touch_HasInput
-	+tests_touch_UpdateErrors
-	+tests_touch_WakeupSource
-	+tests_usbpd_DisplayPortSink
-	+tests_vpd_ReadWrite
-"
-
-IUSE_TESTS="${IUSE_TESTS}
-	${CLIENT_IUSE_TESTS}
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-AUTOTEST_DEPS_LIST=""
-AUTOTEST_CONFIG_LIST=""
-AUTOTEST_PROFILERS_LIST=""
-
-AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8849.ebuild b/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8849.ebuild
new file mode 100644
index 0000000..8c66968
--- /dev/null
+++ b/chromeos-base/autotest-tests/autotest-tests-0.0.4-r8849.ebuild
@@ -0,0 +1,225 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="2fb9aa07c676ad30162758837e24b75e80f36f3d"
+CROS_WORKON_TREE="1bf135b0628ee85fd6385a99f35b5526644b7d77"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+
+inherit libchrome cros-workon autotest
+
+DESCRIPTION="Autotest tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups dlc_test +encrypted_stateful +network_time +passive_metrics +profile vaapi"
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+# pygobject is used in the following tests:
+#   platform_CrosDisks*
+RDEPEND="
+	>=chromeos-base/autotest-deps-0.0.3
+	!<=chromeos-base/autotest-factory-0.0.1-r4445
+	dev-python/numpy
+	dev-python/pygobject
+	dev-python/pytest
+	dev-python/python-uinput
+	media-sound/sox
+	sys-apps/ethtool
+	vaapi? ( x11-libs/libva )
+	virtual/autotest-tests
+"
+
+RDEPEND="${RDEPEND}
+	tests_dbench? ( dev-libs/libaio )
+	tests_platform_MetricsUploader? (
+		>=chromeos-base/metrics-0.0.1-r3152
+		dev-python/protobuf-python
+	)
+	tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file )
+	tests_hardware_MemoryLatency? ( app-benchmarks/lmbench )
+	tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench )
+	tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks )
+	tests_kernel_Lmbench? ( app-benchmarks/lmbench )
+	arc-camera3? (
+		tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 )
+		tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 )
+	)
+	tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 )
+	tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests )
+"
+
+DEPEND="${RDEPEND}"
+
+X86_IUSE_TESTS="
+	+tests_xfsFilesystemTestSuite
+	+tests_hardware_UnsafeMemory
+"
+
+CLIENT_IUSE_TESTS="
+	x86? ( ${X86_IUSE_TESTS} )
+	amd64? ( ${X86_IUSE_TESTS} )
+	+tests_profiler_sync
+	+tests_compilebench
+	+tests_crashme
+	+tests_dbench
+	+tests_ddtest
+	+tests_disktest
+	+tests_fsx
+	+tests_hackbench
+	+tests_iperf
+	+tests_bonnie
+	+tests_iozone
+	+tests_netpipe
+	+tests_sleeptest
+	+tests_kernel_sysrq_info
+	+tests_unixbench
+	+tests_autoupdate_Backoff
+	+tests_autoupdate_BadMetadata
+	+tests_autoupdate_CannedOmahaUpdate
+	+tests_autoupdate_DisconnectReconnectNetwork
+	dlc_test? ( +tests_autoupdate_InstallAndUpdateDLC )
+	+tests_autoupdate_PeriodicCheck
+	+tests_autoupdate_UrlSwitch
+	+tests_blktestsSuiteAll
+	+tests_blktestsSuiteLoopOverBlk
+	+tests_blktestsSuiteLoopOverFile
+	+tests_blktestsSuiteRealBlk
+	+tests_camera_V4L2
+	arc-camera3? (
+		+tests_camera_HAL3
+		+tests_camera_HAL3Perf
+	)
+	+tests_dummy_Fail
+	+tests_dummy_Pass
+	+tests_dummy_SynchronousOffload
+	tests_example_UnitTest
+	+tests_firmware_LockedME
+	+tests_firmware_RomSize
+	+tests_firmware_SetFWMP
+	+tests_firmware_VbootCrypto
+	+tests_flaky_test
+	+tests_hardware_Badblocks
+	+tests_hardware_DiskSize
+	+tests_hardware_EC
+	+tests_hardware_EepromWriteProtect
+	+tests_hardware_GobiGPS
+	+tests_hardware_GPIOSwitches
+	+tests_hardware_GPS
+	+tests_hardware_I2CProbe
+	+tests_hardware_Interrupt
+	+tests_hardware_Keyboard
+	+tests_hardware_LightSensor
+	+tests_hardware_MemoryLatency
+	+tests_hardware_MemoryThroughput
+	+tests_hardware_MemoryZRAMThroughput
+	+tests_hardware_Memtester
+	+tests_hardware_MultiReader
+	+tests_hardware_ProbeComponents
+	+tests_hardware_RamFio
+	+tests_hardware_RealtekCardReader
+	+tests_hardware_Resolution
+	+tests_hardware_SAT
+	+tests_hardware_Smartctl
+	+tests_hardware_SsdDetection
+	+tests_hardware_StorageFio
+	+tests_hardware_StorageFioOther
+	+tests_hardware_StorageTrim
+	+tests_hardware_StorageWearoutDetect
+	+tests_hardware_TouchScreenPowerCycles
+	tests_hardware_TouchScreenPresent
+	+tests_hardware_TrimIntegrity
+	+tests_infra_FirmwareAutoupdate
+	+tests_kernel_AsyncDriverProbe
+	+tests_kernel_FirmwareRequest
+	+tests_kernel_CrosECSysfsAccel
+	+tests_kernel_Delay
+	+tests_kernel_fs_Punybench
+	+tests_kernel_Ktime
+	+tests_kernel_Lmbench
+	+tests_kernel_Memory_Ramoop
+	+tests_kernel_SchedBandwith
+	crash_reporting? (
+		+tests_logging_CrashSender
+		+tests_logging_KernelCrash
+		+tests_logging_UdevCrash
+		+tests_logging_UserCrash
+		+tests_platform_AnomalyDetector
+	)
+	+tests_network_EthCaps
+	+tests_network_EthernetStressPlug
+	+tests_network_Ipv6SimpleNegotiation
+	+tests_network_NegotiatedLANSpeed
+	+tests_platform_AccurateTime
+	+tests_platform_AesThroughput
+	!chromeless_tty? (
+		+tests_platform_BootPerf
+	)
+	+tests_platform_CheckErrorsInLog
+	+tests_platform_CleanShutdown
+	+tests_platform_Crossystem
+	+tests_platform_Crouton
+	+tests_platform_DaemonsRespawn
+	+tests_platform_DBusMachineIdRotation
+	encrypted_stateful? ( +tests_platform_EncryptedStateful )
+	+tests_platform_ExternalUSBBootStress
+	+tests_platform_ExternalUSBStress
+	+tests_platform_FileNum
+	+tests_platform_FileSize
+	biod? ( +tests_platform_Fingerprint )
+	+tests_platform_Firewall
+	+tests_platform_FullyChargedPowerStatus
+	+tests_platform_HighResTimers
+	+tests_platform_ImageLoader
+	+tests_platform_ImageLoaderServer
+	+tests_platform_KernelVersion
+	+tests_platform_LibCBench
+	+tests_platform_LogDupSuppression
+	+tests_platform_LogNonKernelKmsg
+	+tests_platform_MemCheck
+	+tests_platform_MemoryMonitor
+	chromeless_tty? ( +tests_platform_MetricsUploader )
+	+tests_platform_NetParms
+	+tests_platform_OpenSSLActual
+	profile? (
+		+tests_platform_Perf
+		+tests_platform_Quipper
+	)
+	cups? ( +tests_platform_PrinterPpds )
+	+tests_platform_Rootdev
+	+tests_platform_SecureEraseFile
+	!chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration )
+	+tests_platform_TabletMode
+	+tests_platform_TempFS
+	network_time? (
+		+tests_platform_TLSDate
+		+tests_platform_TLSDateActual
+	)
+	+tests_platform_UdevVars
+	+tests_suite_HWConfig
+	+tests_suite_HWQual
+	+tests_system_ColdBoot
+	+tests_touch_HasInput
+	+tests_touch_UpdateErrors
+	+tests_touch_WakeupSource
+	+tests_usbpd_DisplayPortSink
+	+tests_vpd_ReadWrite
+"
+
+IUSE_TESTS="${IUSE_TESTS}
+	${CLIENT_IUSE_TESTS}
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+AUTOTEST_DEPS_LIST=""
+AUTOTEST_CONFIG_LIST=""
+AUTOTEST_PROFILERS_LIST=""
+
+AUTOTEST_FILE_MASK="*.a *.tar.bz2 *.tbz2 *.tgz *.tar.gz"
diff --git a/chromeos-base/autotest-tests/autotest-tests-9999.ebuild b/chromeos-base/autotest-tests/autotest-tests-9999.ebuild
index b5a09f1..9d24283 100644
--- a/chromeos-base/autotest-tests/autotest-tests-9999.ebuild
+++ b/chromeos-base/autotest-tests/autotest-tests-9999.ebuild
@@ -13,7 +13,7 @@
 LICENSE="GPL-2"
 SLOT="0"
 KEYWORDS="~*"
-IUSE="arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups +encrypted_stateful +network_time +passive_metrics +profile vaapi"
+IUSE="arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups dlc_test +encrypted_stateful +network_time +passive_metrics +profile vaapi"
 # Enable autotest by default.
 IUSE="${IUSE} +autotest"
 
@@ -35,7 +35,7 @@
 RDEPEND="${RDEPEND}
 	tests_dbench? ( dev-libs/libaio )
 	tests_platform_MetricsUploader? (
-		chromeos-base/metrics
+		>=chromeos-base/metrics-0.0.1-r3152
 		dev-python/protobuf-python
 	)
 	tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file )
@@ -43,7 +43,6 @@
 	tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench )
 	tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks )
 	tests_kernel_Lmbench? ( app-benchmarks/lmbench )
-	tests_security_SMMLocked? ( sys-apps/pciutils )
 	arc-camera3? (
 		tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 )
 		tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 )
@@ -55,7 +54,6 @@
 DEPEND="${RDEPEND}"
 
 X86_IUSE_TESTS="
-	+tests_security_SMMLocked
 	+tests_xfsFilesystemTestSuite
 	+tests_hardware_UnsafeMemory
 "
@@ -82,6 +80,8 @@
 	+tests_autoupdate_BadMetadata
 	+tests_autoupdate_CannedOmahaUpdate
 	+tests_autoupdate_DisconnectReconnectNetwork
+	dlc_test? ( +tests_autoupdate_InstallAndUpdateDLC )
+	+tests_autoupdate_PeriodicCheck
 	+tests_autoupdate_UrlSwitch
 	+tests_blktestsSuiteAll
 	+tests_blktestsSuiteLoopOverBlk
diff --git a/chromeos-base/autotest/autotest-0.0.2-r12367.ebuild b/chromeos-base/autotest/autotest-0.0.2-r12367.ebuild
deleted file mode 100644
index 7208c76..0000000
--- a/chromeos-base/autotest/autotest-0.0.2-r12367.ebuild
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("413cd25b3cef93d30e6bc889b7bb461101b15858" "c5889adab57bc6394a900a60d6f943f7918fef8d")
-CROS_WORKON_TREE=("161be89d8ab32e37d1bf37474953ae7a5ffaa3ec" "dd84017ea39c62ab8790679abd24e7d37367ac48")
-CROS_WORKON_PROJECT=(
-	"chromiumos/third_party/autotest"
-	"chromiumos/platform/fw-testing-configs"
-)
-CROS_WORKON_LOCALNAME=(
-	"third_party/autotest/files"
-	"third_party/autotest/files/server/cros/faft/fw-testing-configs"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/server/cros/faft/fw-testing-configs"
-)
-
-inherit cros-workon cros-constants
-
-DESCRIPTION="Autotest scripts and tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-SRC_URI=""
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!<chromeos-base/autotest-chrome-0.0.1-r1788
-	!<chromeos-base/autotest-tests-0.0.1-r3291
-	!<chromeos-base/autotest-deps-0.0.2
-	virtual/autotest-libs
-	virtual/autotest-assistant-libs
-"
-
-# We don't want Python on the base image, however, there're several base
-# chromeos dependent ebuilds that depend on this ebuild.
-DEPEND="${RDEPEND}"
-
-# Ensure the configures run by autotest pick up the right config.site
-export CONFIG_SITE=/usr/share/config.site
-
-AUTOTEST_WORK="${WORKDIR}/autotest-work"
-
-src_prepare() {
-	mkdir -p "${AUTOTEST_WORK}/client"
-	mkdir -p "${AUTOTEST_WORK}/server"
-	cp -fpu "${S}"/client/* "${AUTOTEST_WORK}/client" &>/dev/null
-	cp -fpru "${S}"/client/{bin,common_lib,tools} "${AUTOTEST_WORK}/client"
-	cp -fpu "${S}"/server/* "${AUTOTEST_WORK}/server" &>/dev/null
-	cp -fpru "${S}"/server/{bin,control_segments,hosts,lib} "${AUTOTEST_WORK}/server"
-	cp -fpru "${S}"/{tko,utils,site_utils,test_suites,frontend} "${AUTOTEST_WORK}"
-
-	# cros directory is not from autotest upstream but cros project specific.
-	cp -fpru "${S}"/client/cros "${AUTOTEST_WORK}/client"
-
-	cp -fpru "${S}"/server/cros "${AUTOTEST_WORK}/server"
-
-	# Pre-create test directories.
-	local test_dirs="
-		client/tests client/site_tests
-		client/config client/deps client/profilers
-		server/tests server/site_tests packages"
-	local dir
-	for dir in ${test_dirs}; do
-		mkdir "${AUTOTEST_WORK}/${dir}"
-		touch "${AUTOTEST_WORK}/${dir}"/.keep
-	done
-	touch "${AUTOTEST_WORK}/client/profilers/__init__.py"
-
-	sed "/^enable_server_prebuild/d" "${S}/global_config.ini" > \
-		"${AUTOTEST_WORK}/global_config.ini"
-	default
-}
-
-src_install() {
-	insinto ${AUTOTEST_BASE}
-	doins -r "${AUTOTEST_WORK}"/*
-
-	# base __init__.py
-	touch "${D}"${AUTOTEST_BASE}/__init__.py
-
-	# TODO: This should be more selective
-	chmod -R a+x "${D}"${AUTOTEST_BASE}
-
-	# setup stuff needed for read/write operation
-	chmod a+wx "${D}${AUTOTEST_BASE}/packages"
-
-	dodir "${AUTOTEST_BASE}/client/packages"
-	chmod a+wx "${D}${AUTOTEST_BASE}/client/packages"
-
-	dodir "${AUTOTEST_BASE}/server/tmp"
-	chmod a+wx "${D}${AUTOTEST_BASE}/server/tmp"
-
-	# Set up symlinks so that debug info works for autotests.
-	dodir /usr/lib/debug${AUTOTEST_BASE}/
-	dosym client/site_tests /usr/lib/debug${AUTOTEST_BASE}/tests
-}
-
-src_test() {
-	# Run the autotest unit tests.
-	./utils/unittest_suite.py --debug || die "Autotest unit tests failed."
-}
-
-# Packages client.
-pkg_postinst() {
-	local root_autotest_dir="${ROOT}${AUTOTEST_BASE}"
-	flock "${root_autotest_dir}/packages" \
-			-c "PYTHONDONTWRITEBYTECODE=1 ${root_autotest_dir}/utils/packager.py \
-				-r ${root_autotest_dir}/packages --client -a upload"
-}
diff --git a/chromeos-base/autotest/autotest-0.0.2-r12948.ebuild b/chromeos-base/autotest/autotest-0.0.2-r12948.ebuild
new file mode 100644
index 0000000..d7b93b7
--- /dev/null
+++ b/chromeos-base/autotest/autotest-0.0.2-r12948.ebuild
@@ -0,0 +1,116 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("a89875894d9002518772c0c8eb0a3f7353926ad6" "4e80173ac59e4cab9ae07b919c1c367642d4516d")
+CROS_WORKON_TREE=("240ecaf5bcf2ae26369706ee37bf83e47f681ba7" "0ae43237ada86ff051625b38e4bfb48ff0e7da45")
+CROS_WORKON_PROJECT=(
+	"chromiumos/third_party/autotest"
+	"chromiumos/platform/fw-testing-configs"
+)
+CROS_WORKON_LOCALNAME=(
+	"third_party/autotest/files"
+	"third_party/autotest/files/server/cros/faft/fw-testing-configs"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/server/cros/faft/fw-testing-configs"
+)
+
+inherit cros-workon cros-constants
+
+DESCRIPTION="Autotest scripts and tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+SRC_URI=""
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	!<chromeos-base/autotest-chrome-0.0.1-r1788
+	!<chromeos-base/autotest-tests-0.0.1-r3291
+	!<chromeos-base/autotest-deps-0.0.2
+	virtual/autotest-libs
+	virtual/autotest-assistant-libs
+"
+
+# We don't want Python on the base image, however, there're several base
+# chromeos dependent ebuilds that depend on this ebuild.
+DEPEND="${RDEPEND}"
+
+# Ensure the configures run by autotest pick up the right config.site
+export CONFIG_SITE=/usr/share/config.site
+
+AUTOTEST_WORK="${WORKDIR}/autotest-work"
+
+src_prepare() {
+	mkdir -p "${AUTOTEST_WORK}/client"
+	mkdir -p "${AUTOTEST_WORK}/server"
+	cp -fpu "${S}"/client/* "${AUTOTEST_WORK}/client" &>/dev/null
+	cp -fpru "${S}"/client/{bin,common_lib,tools} "${AUTOTEST_WORK}/client"
+	cp -fpu "${S}"/server/* "${AUTOTEST_WORK}/server" &>/dev/null
+	cp -fpru "${S}"/server/{bin,control_segments,hosts,lib} "${AUTOTEST_WORK}/server"
+	cp -fpru "${S}"/{tko,utils,site_utils,test_suites,frontend} "${AUTOTEST_WORK}"
+
+	# cros directory is not from autotest upstream but cros project specific.
+	cp -fpru "${S}"/client/cros "${AUTOTEST_WORK}/client"
+
+	cp -fpru "${S}"/server/cros "${AUTOTEST_WORK}/server"
+
+	# Pre-create test directories.
+	local test_dirs="
+		client/tests client/site_tests
+		client/config client/deps client/profilers
+		server/tests server/site_tests packages"
+	local dir
+	for dir in ${test_dirs}; do
+		mkdir "${AUTOTEST_WORK}/${dir}"
+		touch "${AUTOTEST_WORK}/${dir}"/.keep
+	done
+	touch "${AUTOTEST_WORK}/client/profilers/__init__.py"
+
+	sed "/^enable_server_prebuild/d" "${S}/global_config.ini" > \
+		"${AUTOTEST_WORK}/global_config.ini"
+	default
+}
+
+src_install() {
+	insinto ${AUTOTEST_BASE}
+	doins -r "${AUTOTEST_WORK}"/*
+
+	# base __init__.py
+	touch "${D}"${AUTOTEST_BASE}/__init__.py
+
+	# TODO: This should be more selective
+	chmod -R a+x "${D}"${AUTOTEST_BASE}
+
+	# setup stuff needed for read/write operation
+	chmod a+wx "${D}${AUTOTEST_BASE}/packages"
+
+	dodir "${AUTOTEST_BASE}/client/packages"
+	chmod a+wx "${D}${AUTOTEST_BASE}/client/packages"
+
+	dodir "${AUTOTEST_BASE}/server/tmp"
+	chmod a+wx "${D}${AUTOTEST_BASE}/server/tmp"
+
+	# Set up symlinks so that debug info works for autotests.
+	dodir /usr/lib/debug${AUTOTEST_BASE}/
+	dosym client/site_tests /usr/lib/debug${AUTOTEST_BASE}/tests
+
+	# Punt any nested .git dirs.
+	find "${D}" -name .git -exec rm -rf {} +
+}
+
+src_test() {
+	# Run the autotest unit tests.
+	./utils/unittest_suite.py --debug || die "Autotest unit tests failed."
+}
+
+# Packages client.
+pkg_postinst() {
+	local root_autotest_dir="${ROOT}${AUTOTEST_BASE}"
+	flock "${root_autotest_dir}/packages" \
+			-c "PYTHONDONTWRITEBYTECODE=1 ${root_autotest_dir}/utils/packager.py \
+				-r ${root_autotest_dir}/packages --client -a upload"
+}
diff --git a/chromeos-base/autotest/autotest-9999.ebuild b/chromeos-base/autotest/autotest-9999.ebuild
index f64da77..98f2f61 100644
--- a/chromeos-base/autotest/autotest-9999.ebuild
+++ b/chromeos-base/autotest/autotest-9999.ebuild
@@ -95,6 +95,9 @@
 	# Set up symlinks so that debug info works for autotests.
 	dodir /usr/lib/debug${AUTOTEST_BASE}/
 	dosym client/site_tests /usr/lib/debug${AUTOTEST_BASE}/tests
+
+	# Punt any nested .git dirs.
+	find "${D}" -name .git -exec rm -rf {} +
 }
 
 src_test() {
diff --git a/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r2996.ebuild b/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r2996.ebuild
deleted file mode 100644
index db499ff..0000000
--- a/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r2996.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "c11986ea7910ed5f894d61521de3c36440a2b812" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk avtest_label_detect .gn"
-
-inherit cros-sanitizers cros-workon cros-common.mk
-
-DESCRIPTION="Autotest label detector for audio/video/camera"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/avtest_label_detect"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan v4l2_codec vaapi"
-
-RDEPEND="vaapi? ( x11-libs/libva )"
-DEPEND="${RDEPEND}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/avtest_label_detect"
-}
-
-src_configure() {
-	export USE_VAAPI=$(usex vaapi)
-	export USE_V4L2_CODEC=$(usex v4l2_codec)
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
-
-src_install() {
-	# Install built tools
-	pushd "${OUT}" >/dev/null
-	dobin avtest_label_detect
-	popd >/dev/null
-
-	insinto /etc
-	doins "${S}"/avtest_label_detect.conf
-}
diff --git a/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r3017.ebuild b/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r3017.ebuild
new file mode 100644
index 0000000..0c50981
--- /dev/null
+++ b/chromeos-base/avtest_label_detect/avtest_label_detect-0.0.1-r3017.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "663c1accb23d479e49928219593b0f82d782ba9c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk avtest_label_detect .gn"
+
+inherit cros-sanitizers cros-workon cros-common.mk
+
+DESCRIPTION="Autotest label detector for audio/video/camera"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/avtest_label_detect"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan v4l2_codec vaapi"
+
+RDEPEND="vaapi? ( x11-libs/libva )"
+DEPEND="${RDEPEND}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/avtest_label_detect"
+}
+
+src_configure() {
+	export USE_VAAPI=$(usex vaapi)
+	export USE_V4L2_CODEC=$(usex v4l2_codec)
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
+
+src_install() {
+	# Install built tools
+	pushd "${OUT}" >/dev/null
+	dobin avtest_label_detect
+	popd >/dev/null
+
+	insinto /etc
+	doins "${S}"/avtest_label_detect.conf
+}
diff --git a/chromeos-base/biod/biod-0.0.1-r1755.ebuild b/chromeos-base/biod/biod-0.0.1-r1755.ebuild
deleted file mode 100644
index 26932632..0000000
--- a/chromeos-base/biod/biod-0.0.1-r1755.ebuild
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d976cad29494daaa43f5b4806faec13ac9684285" "6287b0913be5aaea79569d55d989b9b729396f10" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_USE_VCSID="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk biod chromeos-config metrics .gn"
-
-PLATFORM_SUBDIR="biod"
-
-inherit cros-fuzzer cros-sanitizers cros-workon platform udev user
-
-DESCRIPTION="Biometrics Daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="
-	fp_on_power_button
-	fpmcu_firmware_bloonchipper
-	fpmcu_firmware_dartmonkey
-	fpmcu_firmware_nami
-	fpmcu_firmware_nocturne
-	fuzzer
-	generated_cros_config
-	unibuild
-"
-
-COMMON_DEPEND="
-	chromeos-base/chromeos-config-tools:=
-	chromeos-base/metrics:=
-	sys-apps/flashmap:=
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-"
-
-# For biod_client_tool. The biod_proxy library will be built on all boards but
-# biod_client_tool will be built only on boards with biod.
-COMMON_DEPEND+="
-	chromeos-base/biod_proxy:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	sys-apps/flashrom
-	virtual/chromeos-firmware-fpmcu
-	"
-
-# Release branch firmware.
-# The USE flags below come from USE_EXPAND variables.
-# See third_party/chromiumos-overlay/profiles/base/make.defaults.
-RDEPEND+="
-	fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper )
-	fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey )
-	fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami )
-	fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne )
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/chromeos-ec-headers:=
-	chromeos-base/power_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	dev-libs/openssl:=
-"
-
-pkg_setup() {
-	enewuser biod
-	enewgroup biod
-}
-
-src_install() {
-	dobin "${OUT}"/biod
-
-	dobin "${OUT}"/bio_crypto_init
-	dobin "${OUT}"/bio_wash
-
-	dosbin "${OUT}"/bio_fw_updater
-
-	into /usr/local
-	dobin "${OUT}"/biod_client_tool
-
-	insinto /usr/share/policy
-	local seccomp_src_dir="init/seccomp"
-
-	newins "${seccomp_src_dir}/biod-seccomp-${ARCH}.policy" \
-		biod-seccomp.policy
-
-	newins "${seccomp_src_dir}/bio-crypto-init-seccomp-${ARCH}.policy" \
-		bio-crypto-init-seccomp.policy
-
-	insinto /etc/init
-	doins init/*.conf
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.BiometricsDaemon.conf
-
-	udev_dorules udev/99-biod.rules
-
-	# Set up cryptohome daemon mount store in daemon's mount
-	# namespace.
-	local daemon_store="/etc/daemon-store/biod"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners biod:biod "${daemon_store}"
-
-	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/biod_storage_fuzzer
-
-	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/biod_crypto_validation_value_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/biod_test_runner"
-}
diff --git a/chromeos-base/biod/biod-0.0.1-r1839.ebuild b/chromeos-base/biod/biod-0.0.1-r1839.ebuild
new file mode 100644
index 0000000..522ff3a
--- /dev/null
+++ b/chromeos-base/biod/biod-0.0.1-r1839.ebuild
@@ -0,0 +1,120 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fa757d388d71b4ff74cb86f5b347b35fc9b65e46" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_USE_VCSID="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk biod chromeos-config metrics .gn"
+
+PLATFORM_SUBDIR="biod"
+
+inherit cros-fuzzer cros-sanitizers cros-workon platform udev user
+
+DESCRIPTION="Biometrics Daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="
+	fp_on_power_button
+	fpmcu_firmware_bloonchipper
+	fpmcu_firmware_dartmonkey
+	fpmcu_firmware_nami
+	fpmcu_firmware_nocturne
+	fuzzer
+	generated_cros_config
+	unibuild
+"
+
+COMMON_DEPEND="
+	chromeos-base/chromeos-config-tools:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	sys-apps/flashmap:=
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+"
+
+# For biod_client_tool. The biod_proxy library will be built on all boards but
+# biod_client_tool will be built only on boards with biod.
+COMMON_DEPEND+="
+	chromeos-base/biod_proxy:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	sys-apps/flashrom
+	virtual/chromeos-firmware-fpmcu
+	"
+
+# Release branch firmware.
+# The USE flags below come from USE_EXPAND variables.
+# See third_party/chromiumos-overlay/profiles/base/make.defaults.
+RDEPEND+="
+	fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper )
+	fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey )
+	fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami )
+	fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne )
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/chromeos-ec-headers:=
+	chromeos-base/power_manager-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	dev-libs/openssl:=
+"
+
+pkg_setup() {
+	enewuser biod
+	enewgroup biod
+}
+
+src_install() {
+	dobin "${OUT}"/biod
+
+	dobin "${OUT}"/bio_crypto_init
+	dobin "${OUT}"/bio_wash
+
+	dosbin "${OUT}"/bio_fw_updater
+
+	into /usr/local
+	dobin "${OUT}"/biod_client_tool
+
+	insinto /usr/share/policy
+	local seccomp_src_dir="init/seccomp"
+
+	newins "${seccomp_src_dir}/biod-seccomp-${ARCH}.policy" \
+		biod-seccomp.policy
+
+	newins "${seccomp_src_dir}/bio-crypto-init-seccomp-${ARCH}.policy" \
+		bio-crypto-init-seccomp.policy
+
+	insinto /etc/init
+	doins init/*.conf
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.BiometricsDaemon.conf
+
+	udev_dorules udev/99-biod.rules
+
+	# Set up cryptohome daemon mount store in daemon's mount
+	# namespace.
+	local daemon_store="/etc/daemon-store/biod"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners biod:biod "${daemon_store}"
+
+	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/biod_storage_fuzzer
+
+	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/biod_crypto_validation_value_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/biod_test_runner"
+}
diff --git a/chromeos-base/biod/biod-9999.ebuild b/chromeos-base/biod/biod-9999.ebuild
index 8336430..6e6596d 100644
--- a/chromeos-base/biod/biod-9999.ebuild
+++ b/chromeos-base/biod/biod-9999.ebuild
@@ -30,7 +30,7 @@
 
 COMMON_DEPEND="
 	chromeos-base/chromeos-config-tools:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	sys-apps/flashmap:=
 	unibuild? (
 		!generated_cros_config? ( chromeos-base/chromeos-config )
diff --git a/chromeos-base/biod_proxy/biod_proxy-0.0.1-r47.ebuild b/chromeos-base/biod_proxy/biod_proxy-0.0.1-r47.ebuild
new file mode 100644
index 0000000..9ee3a47
--- /dev/null
+++ b/chromeos-base/biod_proxy/biod_proxy-0.0.1-r47.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fa757d388d71b4ff74cb86f5b347b35fc9b65e46" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_USE_VCSID="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk biod .gn"
+
+PLATFORM_SUBDIR="biod/biod_proxy"
+
+inherit cros-workon platform
+
+DESCRIPTION="DBus Proxy Library for Biometrics Daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="
+	chromeos-base/libbrillo:=
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	dolib.so "${OUT}"/lib/libbiod_proxy.so
+	insinto /usr/include/biod/biod_proxy/
+	doins ./*.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/biod_proxy_test_runner"
+}
diff --git a/chromeos-base/biod_proxy/biod_proxy-0.0.1-r7.ebuild b/chromeos-base/biod_proxy/biod_proxy-0.0.1-r7.ebuild
deleted file mode 100644
index 7b3c8a4..0000000
--- a/chromeos-base/biod_proxy/biod_proxy-0.0.1-r7.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="9b312dcccb792598be7f6848f54d469d0a452081"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d976cad29494daaa43f5b4806faec13ac9684285" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_USE_VCSID="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk biod .gn"
-
-PLATFORM_SUBDIR="biod/biod_proxy"
-
-inherit cros-workon platform
-
-DESCRIPTION="DBus Proxy Library for Biometrics Daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="
-	chromeos-base/libbrillo:=
-	chromeos-base/system_api:=
-"
-
-src_install() {
-	dolib.so "${OUT}"/lib/libbiod_proxy.so
-	insinto /usr/include/biod/biod_proxy/
-	doins ./*.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/biod_proxy_test_runner"
-}
diff --git a/chromeos-base/bluetooth/bluetooth-0.0.1-r535.ebuild b/chromeos-base/bluetooth/bluetooth-0.0.1-r535.ebuild
deleted file mode 100644
index f10e493..0000000
--- a/chromeos-base/bluetooth/bluetooth-0.0.1-r535.ebuild
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "933f0271b1e165dd2cf312b75f832c6d423a8e74" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk chromeos-config bluetooth .gn"
-
-PLATFORM_SUBDIR="bluetooth"
-
-inherit cros-workon platform
-
-DESCRIPTION="Bluetooth service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bluetooth"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+bluetooth_suspend_management fuzzer generated_cros_config seccomp unibuild"
-
-RDEPEND="
-	chromeos-base/chromeos-config-tools:=
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	net-wireless/bluez:=
-"
-
-DEPEND="${RDEPEND}
-	chromeos-base/system_api:=[fuzzer?]"
-
-src_install() {
-	dobin "${OUT}"/btdispatch
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.Bluetooth.conf
-
-	insinto /etc/init
-	doins init/upstart/btdispatch.conf
-
-	if use seccomp; then
-		# Install seccomp policy files.
-		insinto /usr/share/policy
-		newins "seccomp_filters/btdispatch-seccomp-${ARCH}.policy" btdispatch-seccomp.policy
-	else
-		# Remove seccomp flags from minijail parameters.
-		sed -i '/^env seccomp_flags=/s:=.*:="":' "${ED}"/etc/init/btdispatch.conf || die
-	fi
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/bluetooth_test"
-}
diff --git a/chromeos-base/bluetooth/bluetooth-0.0.1-r591.ebuild b/chromeos-base/bluetooth/bluetooth-0.0.1-r591.ebuild
new file mode 100644
index 0000000..a01c353
--- /dev/null
+++ b/chromeos-base/bluetooth/bluetooth-0.0.1-r591.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "5400381b0bd5ab89ecc95178a6d76a1520b57f96" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk chromeos-config bluetooth .gn"
+
+PLATFORM_SUBDIR="bluetooth"
+
+inherit cros-workon platform
+
+DESCRIPTION="Bluetooth service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bluetooth"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+bluetooth_suspend_management fuzzer generated_cros_config seccomp unibuild"
+
+RDEPEND="
+	chromeos-base/chromeos-config-tools:=
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	net-wireless/bluez:=
+"
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:=[fuzzer?]"
+
+src_install() {
+	dobin "${OUT}"/btdispatch
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.Bluetooth.conf
+
+	insinto /etc/init
+	doins init/upstart/btdispatch.conf
+
+	if use seccomp; then
+		# Install seccomp policy files.
+		insinto /usr/share/policy
+		newins "seccomp_filters/btdispatch-seccomp-${ARCH}.policy" btdispatch-seccomp.policy
+	else
+		# Remove seccomp flags from minijail parameters.
+		sed -i '/^env seccomp_flags=/s:=.*:="":' "${ED}"/etc/init/btdispatch.conf || die
+	fi
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/bluetooth_test"
+}
diff --git a/chromeos-base/bootid-logger/bootid-logger-0.0.1-r3.ebuild b/chromeos-base/bootid-logger/bootid-logger-0.0.1-r3.ebuild
new file mode 100644
index 0000000..35ebf96
--- /dev/null
+++ b/chromeos-base/bootid-logger/bootid-logger-0.0.1-r3.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+CROS_WORKON_COMMIT="99411f5cac7e38c2db86dfdd0128962322f2a36c"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "664fa34383cd9fe39960fcd4241965835a4e2bff" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk bootid-logger .gn"
+
+PLATFORM_SUBDIR="bootid-logger"
+
+inherit cros-workon platform
+
+DESCRIPTION="Log viewer for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bootid-logger"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="!<=chromeos-base/croslog-0.0.1-r44"
+
+src_install() {
+	platform_install
+
+	insinto /etc/init
+	doins log-bootid-on-boot.conf
+}
+
diff --git a/chromeos-base/bootid-logger/bootid-logger-9999.ebuild b/chromeos-base/bootid-logger/bootid-logger-9999.ebuild
new file mode 100644
index 0000000..5e16392
--- /dev/null
+++ b/chromeos-base/bootid-logger/bootid-logger-9999.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk bootid-logger .gn"
+
+PLATFORM_SUBDIR="bootid-logger"
+
+inherit cros-workon platform
+
+DESCRIPTION="Log viewer for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bootid-logger"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="~*"
+IUSE=""
+
+RDEPEND="!<=chromeos-base/croslog-0.0.1-r44"
+
+src_install() {
+	platform_install
+
+	insinto /etc/init
+	doins log-bootid-on-boot.conf
+}
+
diff --git a/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r708.ebuild b/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r708.ebuild
deleted file mode 100644
index ff4ad88f4..0000000
--- a/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r708.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="89c1e8fed12123dd92697e3da4b51eb7a33c2ccc"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a116bda3b891d74f8d71060d56a161ed465ffc4a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk cryptohome .gn"
-
-PLATFORM_SUBDIR="cryptohome/bootlockbox-client"
-
-inherit cros-workon platform
-
-DESCRIPTION="BootLockbox DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library.
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "bootlockbox"
-}
diff --git a/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r810.ebuild b/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r810.ebuild
new file mode 100644
index 0000000..bed6bcc
--- /dev/null
+++ b/chromeos-base/bootlockbox-client/bootlockbox-client-0.0.1-r810.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f4e87d8faed98e77dea8d99d1656da5c72178c9e"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ac2e4e99b6584995504d17d6a75fe01c195428a2" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk cryptohome .gn"
+
+PLATFORM_SUBDIR="cryptohome/bootlockbox-client"
+
+inherit cros-workon platform
+
+DESCRIPTION="BootLockbox DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library.
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "bootlockbox"
+}
diff --git a/chromeos-base/bootstat/OWNERS b/chromeos-base/bootstat/OWNERS
new file mode 100644
index 0000000..5d7215c
--- /dev/null
+++ b/chromeos-base/bootstat/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/bootstat/OWNERS
diff --git a/chromeos-base/bootstat/bootstat-0.0.2-r3038.ebuild b/chromeos-base/bootstat/bootstat-0.0.2-r3038.ebuild
deleted file mode 100644
index 511dcf7..0000000
--- a/chromeos-base/bootstat/bootstat-0.0.2-r3038.ebuild
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "fcce853ccd0311b4673d6a8f6b37e1faf9afc395" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk bootstat .gn"
-
-PLATFORM_SUBDIR="bootstat"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS Boot Time Statistics Utilities"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bootstat/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	sys-apps/rootdev:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-"
-
-src_install() {
-	dosbin "${OUT}"/bootstat
-	dosbin bootstat_archive
-	dosbin bootstat_get_last
-	dobin bootstat_summary
-
-	dolib.so "${OUT}"/lib/libbootstat.so
-
-	insinto /usr/include/metrics
-	doins bootstat.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/libbootstat_unittests"
-}
diff --git a/chromeos-base/bootstat/bootstat-0.0.2-r3059.ebuild b/chromeos-base/bootstat/bootstat-0.0.2-r3059.ebuild
new file mode 100644
index 0000000..085019d
--- /dev/null
+++ b/chromeos-base/bootstat/bootstat-0.0.2-r3059.ebuild
@@ -0,0 +1,51 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "b6ba3795ea221ecda3ba2d051d2b5f299bb768a6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk bootstat .gn"
+
+PLATFORM_SUBDIR="bootstat"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS Boot Time Statistics Utilities"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/bootstat/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	sys-apps/rootdev:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+"
+
+src_install() {
+	dosbin "${OUT}"/bootstat
+	dosbin bootstat_archive
+	dosbin bootstat_get_last
+	dobin bootstat_summary
+
+	dolib.so "${OUT}"/lib/libbootstat.so
+
+	insinto /usr/include/metrics
+	doins bootstat.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/libbootstat_unittests"
+}
diff --git a/chromeos-base/buffet/buffet-0.0.1-r2854.ebuild b/chromeos-base/buffet/buffet-0.0.1-r2854.ebuild
deleted file mode 100644
index ed6ec8f..0000000
--- a/chromeos-base/buffet/buffet-0.0.1-r2854.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "03aecfc1ac4d322587fe2a5efc6c3e3abf118627" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk buffet .gn"
-
-PLATFORM_SUBDIR="buffet"
-
-inherit cros-workon libchrome platform user
-
-DESCRIPTION="Local and cloud communication services for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/buffet/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	chromeos-base/libweave:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=
-"
-
-pkg_preinst() {
-	# Create user and group for buffet.
-	enewuser "buffet"
-	enewgroup "buffet"
-}
-
-src_install() {
-	insinto "/usr/$(get_libdir)/pkgconfig"
-
-	dobin "${OUT}"/buffet
-	dobin "${OUT}"/buffet_client
-
-	# DBus configuration.
-	insinto /etc/dbus-1/system.d
-	doins etc/dbus-1/org.chromium.Buffet.conf
-
-	# Upstart script.
-	insinto /etc/init
-	doins etc/init/buffet.conf
-	sed -i 's/\(BUFFET_DISABLE_PRIVET=\).*$/\1true/g' \
-		"${ED}"/etc/init/buffet.conf
-}
-
-platform_pkg_test() {
-	local tests=(
-		buffet_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/buffet/buffet-0.0.1-r2876.ebuild b/chromeos-base/buffet/buffet-0.0.1-r2876.ebuild
new file mode 100644
index 0000000..6ef6115
--- /dev/null
+++ b/chromeos-base/buffet/buffet-0.0.1-r2876.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "33ae40ab689f1eb6e4700c7bae6ba213d4da50d7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk buffet .gn"
+
+PLATFORM_SUBDIR="buffet"
+
+inherit cros-workon libchrome platform user
+
+DESCRIPTION="Local and cloud communication services for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/buffet/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	chromeos-base/libweave:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	# Create user and group for buffet.
+	enewuser "buffet"
+	enewgroup "buffet"
+}
+
+src_install() {
+	insinto "/usr/$(get_libdir)/pkgconfig"
+
+	dobin "${OUT}"/buffet
+	dobin "${OUT}"/buffet_client
+
+	# DBus configuration.
+	insinto /etc/dbus-1/system.d
+	doins etc/dbus-1/org.chromium.Buffet.conf
+
+	# Upstart script.
+	insinto /etc/init
+	doins etc/init/buffet.conf
+	sed -i 's/\(BUFFET_DISABLE_PRIVET=\).*$/\1true/g' \
+		"${ED}"/etc/init/buffet.conf
+}
+
+platform_pkg_test() {
+	local tests=(
+		buffet_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/cbor/cbor-0.0.1-r32.ebuild b/chromeos-base/cbor/cbor-0.0.1-r32.ebuild
deleted file mode 100644
index 5e7cb1f..0000000
--- a/chromeos-base/cbor/cbor-0.0.1-r32.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("60b8a10c6a4925d88abba0265632c52771dec20e" "2f808cae22b72aab029623efad3d9a71440ac6a1")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "64ddc93776d2e8ce9987bcce636e68a05565c96f")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform2"
-	"chromiumos/platform/cbor"
-)
-
-CROS_WORKON_LOCALNAME=(
-	"platform2"
-	"platform/cbor"
-)
-
-CROS_WORKON_DESTDIR=(
-	"${S}/platform2"
-	# This needs to be platform2/cbor instead of platform/cbor because we are
-	# using the platform2 build system.
-	"${S}/platform2/cbor"
-)
-
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="cbor"
-
-inherit cros-workon platform
-
-DESCRIPTION="Concise Binary Object Representation (CBOR) library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/cbor"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-src_install() {
-	dolib.so "${OUT}"/lib/libcbor.so
-	insinto /usr/include/chromeos/cbor/
-	doins ./*.h
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/obj/cbor/cbor.pc
-
-	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/reader_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/cbor_unittests"
-}
diff --git a/chromeos-base/cbor/cbor-0.0.1-r52.ebuild b/chromeos-base/cbor/cbor-0.0.1-r52.ebuild
new file mode 100644
index 0000000..5d8070a
--- /dev/null
+++ b/chromeos-base/cbor/cbor-0.0.1-r52.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "2f808cae22b72aab029623efad3d9a71440ac6a1")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "64ddc93776d2e8ce9987bcce636e68a05565c96f")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform2"
+	"chromiumos/platform/cbor"
+)
+
+CROS_WORKON_LOCALNAME=(
+	"platform2"
+	"platform/cbor"
+)
+
+CROS_WORKON_DESTDIR=(
+	"${S}/platform2"
+	# This needs to be platform2/cbor instead of platform/cbor because we are
+	# using the platform2 build system.
+	"${S}/platform2/cbor"
+)
+
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="cbor"
+
+inherit cros-workon platform
+
+DESCRIPTION="Concise Binary Object Representation (CBOR) library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/cbor"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+src_install() {
+	dolib.so "${OUT}"/lib/libcbor.so
+	insinto /usr/include/chromeos/cbor/
+	doins ./*.h
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/obj/cbor/cbor.pc
+
+	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/reader_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/cbor_unittests"
+}
diff --git a/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r33.ebuild b/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r33.ebuild
deleted file mode 100644
index 7e4d6f9..0000000
--- a/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r33.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "30d44bb1fc4101536954f9209992b13ce5f5a584" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="common-mk cfm-dfu-notification .gn"
-CROS_WORKON_DESTDIR="${S}/platform2"
-
-PLATFORM_SUBDIR="cfm-dfu-notification"
-
-inherit cros-workon platform
-
-DESCRIPTION="Library to send firmware update notifications to CFM"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-RDEPEND=""
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dolib.so "${OUT}"/lib/libcfm_dfu_notification.so
-
-	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/cfm-dfu-notification.pc
-
-	insinto "/usr/include/chromeos/cfm-dfu-notification"
-	doins ./*.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}"/cfm_dfu_notification_test
-}
diff --git a/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r53.ebuild b/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r53.ebuild
new file mode 100644
index 0000000..bf66d1f
--- /dev/null
+++ b/chromeos-base/cfm-dfu-notification/cfm-dfu-notification-0.0.1-r53.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7f5c0bd150cc92f57377305d0863d3a4b6af10e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="common-mk cfm-dfu-notification .gn"
+CROS_WORKON_DESTDIR="${S}/platform2"
+
+PLATFORM_SUBDIR="cfm-dfu-notification"
+
+inherit cros-workon platform
+
+DESCRIPTION="Library to send firmware update notifications to CFM"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+RDEPEND=""
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dolib.so "${OUT}"/lib/libcfm_dfu_notification.so
+
+	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/cfm-dfu-notification.pc
+
+	insinto "/usr/include/chromeos/cfm-dfu-notification"
+	doins ./*.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}"/cfm_dfu_notification_test
+}
diff --git a/chromeos-base/chameleon/chameleon-0.0.2-r363.ebuild b/chromeos-base/chameleon/chameleon-0.0.2-r363.ebuild
deleted file mode 100644
index b9b9233..0000000
--- a/chromeos-base/chameleon/chameleon-0.0.2-r363.ebuild
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=4
-CROS_WORKON_COMMIT="f2a27c6b24bd67d7ff93e864c0d3b58bcf041dd4"
-CROS_WORKON_TREE="717c22e200d9628017b0f18557d71a58d7161b6f"
-CROS_WORKON_PROJECT="chromiumos/platform/chameleon"
-
-inherit cros-workon
-
-DESCRIPTION="Chameleon bundle for Autotest lab deployment"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/chameleon/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="dev-lang/python"
-DEPEND="${RDEPEND}"
-
-src_install() {
-	local base_dir="/usr/share/chameleon-bundle"
-	insinto "${base_dir}"
-	newins dist/chameleond-*.tar.gz chameleond-${PVR}.tar.gz
-}
diff --git a/chromeos-base/chameleon/chameleon-0.0.2-r385.ebuild b/chromeos-base/chameleon/chameleon-0.0.2-r385.ebuild
new file mode 100644
index 0000000..9a2f9e6
--- /dev/null
+++ b/chromeos-base/chameleon/chameleon-0.0.2-r385.ebuild
@@ -0,0 +1,26 @@
+# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=4
+CROS_WORKON_COMMIT="b5c91cdd85d7f222e7fb9d53115525430ade578c"
+CROS_WORKON_TREE="9eb4cbcb01c9fc9f6d9aac4e71804dce37d32eea"
+CROS_WORKON_PROJECT="chromiumos/platform/chameleon"
+
+inherit cros-workon
+
+DESCRIPTION="Chameleon bundle for Autotest lab deployment"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/chameleon/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="dev-lang/python"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	local base_dir="/usr/share/chameleon-bundle"
+	insinto "${base_dir}"
+	newins dist/chameleond-*.tar.gz chameleond-${PVR}.tar.gz
+}
diff --git a/chromeos-base/chaps/chaps-0.0.1-r3160.ebuild b/chromeos-base/chaps/chaps-0.0.1-r3160.ebuild
deleted file mode 100644
index b6b02e7..0000000
--- a/chromeos-base/chaps/chaps-0.0.1-r3160.ebuild
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="4f2c42e3c962a67e999c231558cd1ebb0357ceca"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a3f5ba63eea058fad5fcab6671f690a35328329d" "7e189936f29d145c4191ea147e48256c92fac75d" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_USE_VCSID=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk chaps metrics trunks .gn"
-
-PLATFORM_SUBDIR="chaps"
-
-inherit cros-workon platform systemd user
-
-DESCRIPTION="PKCS #11 layer over TrouSerS"
-HOMEPAGE="http://www.chromium.org/developers/design-documents/chaps-technical-design"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="systemd test tpm tpm2 fuzzer"
-
-REQUIRED_USE="tpm2? ( !tpm )"
-
-RDEPEND="
-	!tpm2? (
-		app-crypt/trousers:=
-	)
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	chromeos-base/minijail:=
-	chromeos-base/metrics:=
-	!dev-db/leveldb
-	dev-libs/leveldb:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-"
-
-DEPEND="${RDEPEND}
-	test? ( app-arch/gzip )
-	chromeos-base/system_api:=[fuzzer?]
-	fuzzer? ( dev-libs/libprotobuf-mutator )
-	tpm2? ( chromeos-base/trunks:=[test?] )
-	"
-
-pkg_setup() {
-	enewgroup "chronos-access"
-	enewuser "chaps"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dosbin "${OUT}"/chapsd
-	dobin "${OUT}"/chaps_client
-	dobin "${OUT}"/p11_replay
-	dolib.so "${OUT}"/lib/libchaps.so
-
-	# Install D-Bus config file.
-	dodir /etc/dbus-1/system.d
-	sed 's,@POLICY_PERMISSIONS@,group="pkcs11",' \
-		"org.chromium.Chaps.conf.in" \
-		> "${D}/etc/dbus-1/system.d/org.chromium.Chaps.conf"
-
-	# Install init scripts.
-	if use systemd; then
-		if use tpm2; then
-			sed 's/tcsd.service/trunksd.service' \
-				init/chapsd.service \
-				> "${T}/chapsd.service"
-			systemd_dounit "${T}/chapsd.service"
-		else
-			systemd_dounit init/chapsd.service
-		fi
-		systemd_enable_service boot-services.target chapsd.service
-		systemd_dotmpfilesd init/chapsd_directories.conf
-	else
-		insinto /etc/init
-		doins init/chapsd.conf
-		if use tpm2; then
-			sed -i 's/started tcsd/started trunksd/' \
-				"${D}/etc/init/chapsd.conf" ||
-				die "Can't replace tcsd with trunksd in chapsd.conf"
-		fi
-	fi
-	exeinto /usr/share/cros/init
-
-	# Install headers for use by clients.
-	insinto /usr/include/chaps
-	doins token_manager_client.h
-	doins token_manager_client_mock.h
-	doins token_manager_interface.h
-	doins isolate.h
-	doins chaps_proxy_mock.h
-	doins chaps_interface.h
-	doins chaps.h
-	doins attributes.h
-
-	# Install live tests
-	if use test; then
-		dosbin "${OUT}"/chapsd_test
-		dosbin "${OUT}"/tpm_utility_test
-	fi
-
-	insinto /usr/include/chaps/pkcs11
-	doins pkcs11/*.h
-
-	# Chaps keeps database inside the user's cryptohome.
-	local daemon_store="/etc/daemon-store/chaps"
-	dodir "${daemon_store}"
-	fperms 0750 "${daemon_store}"
-	fowners chaps:chronos-access "${daemon_store}"
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/chaps_attributes_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/chaps_object_store_fuzzer
-}
-
-platform_pkg_test() {
-	local tests=(
-		chaps_test
-		chaps_service_test
-		dbus_test
-		slot_manager_test
-		session_test
-		object_test
-		object_policy_test
-		object_pool_test
-		object_store_test
-		opencryptoki_importer_test
-		isolate_login_client_test
-	)
-	use tpm2 && tests+=(
-		tpm2_utility_test
-	)
-
-	local gtest_filter_qemu=""
-	gtest_filter_qemu+="-*DeathTest*"
-	gtest_filter_qemu+=":*ImportSample*"
-	gtest_filter_qemu+=":TestSession.RSA*"
-	gtest_filter_qemu+=":TestSession.KeyTypeMismatch"
-	gtest_filter_qemu+=":TestSession.KeyFunctionPermission"
-	gtest_filter_qemu+=":TestSession.BadKeySize"
-	gtest_filter_qemu+=":TestSession.BadSignature.*"
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}" "" "" "${gtest_filter_qemu}"
-	done
-}
-
-pkg_preinst() {
-	local ug
-	for ug in attestation pkcs11 chaps; do
-		enewuser "${ug}"
-		enewgroup "${ug}"
-	done
-}
diff --git a/chromeos-base/chaps/chaps-0.0.1-r3203.ebuild b/chromeos-base/chaps/chaps-0.0.1-r3203.ebuild
new file mode 100644
index 0000000..85ed802
--- /dev/null
+++ b/chromeos-base/chaps/chaps-0.0.1-r3203.ebuild
@@ -0,0 +1,162 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e62cbc37d070a3060cb35a6478a549702a115b7c" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_USE_VCSID=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk chaps metrics trunks .gn"
+
+PLATFORM_SUBDIR="chaps"
+
+inherit cros-workon platform systemd user
+
+DESCRIPTION="PKCS #11 layer over TrouSerS"
+HOMEPAGE="http://www.chromium.org/developers/design-documents/chaps-technical-design"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="systemd test tpm tpm2 fuzzer"
+
+REQUIRED_USE="tpm2? ( !tpm )"
+
+RDEPEND="
+	!tpm2? (
+		app-crypt/trousers:=
+	)
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	chromeos-base/minijail:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	!dev-db/leveldb
+	dev-libs/leveldb:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+"
+
+DEPEND="${RDEPEND}
+	test? ( app-arch/gzip )
+	chromeos-base/system_api:=[fuzzer?]
+	fuzzer? ( dev-libs/libprotobuf-mutator )
+	tpm2? ( chromeos-base/trunks:=[test?] )
+	"
+
+pkg_setup() {
+	enewgroup "chronos-access"
+	enewuser "chaps"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dosbin "${OUT}"/chapsd
+	dobin "${OUT}"/chaps_client
+	dobin "${OUT}"/p11_replay
+	dolib.so "${OUT}"/lib/libchaps.so
+
+	# Install D-Bus config file.
+	dodir /etc/dbus-1/system.d
+	sed 's,@POLICY_PERMISSIONS@,group="pkcs11",' \
+		"org.chromium.Chaps.conf.in" \
+		> "${D}/etc/dbus-1/system.d/org.chromium.Chaps.conf"
+
+	# Install init scripts.
+	if use systemd; then
+		if use tpm2; then
+			sed 's/tcsd.service/trunksd.service' \
+				init/chapsd.service \
+				> "${T}/chapsd.service"
+			systemd_dounit "${T}/chapsd.service"
+		else
+			systemd_dounit init/chapsd.service
+		fi
+		systemd_enable_service boot-services.target chapsd.service
+		systemd_dotmpfilesd init/chapsd_directories.conf
+	else
+		insinto /etc/init
+		doins init/chapsd.conf
+		if use tpm2; then
+			sed -i 's/started tcsd/started trunksd/' \
+				"${D}/etc/init/chapsd.conf" ||
+				die "Can't replace tcsd with trunksd in chapsd.conf"
+		fi
+	fi
+	exeinto /usr/share/cros/init
+
+	# Install headers for use by clients.
+	insinto /usr/include/chaps
+	doins token_manager_client.h
+	doins token_manager_client_mock.h
+	doins token_manager_interface.h
+	doins isolate.h
+	doins chaps_proxy_mock.h
+	doins chaps_interface.h
+	doins chaps.h
+	doins attributes.h
+
+	# Install live tests
+	if use test; then
+		dosbin "${OUT}"/chapsd_test
+		dosbin "${OUT}"/tpm_utility_test
+	fi
+
+	insinto /usr/include/chaps/pkcs11
+	doins pkcs11/*.h
+
+	# Chaps keeps database inside the user's cryptohome.
+	local daemon_store="/etc/daemon-store/chaps"
+	dodir "${daemon_store}"
+	fperms 0750 "${daemon_store}"
+	fowners chaps:chronos-access "${daemon_store}"
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/chaps_attributes_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/chaps_object_store_fuzzer
+}
+
+platform_pkg_test() {
+	local tests=(
+		chaps_test
+		chaps_service_test
+		dbus_test
+		slot_manager_test
+		session_test
+		object_test
+		object_policy_test
+		object_pool_test
+		object_store_test
+		opencryptoki_importer_test
+		isolate_login_client_test
+	)
+	use tpm2 && tests+=(
+		tpm2_utility_test
+	)
+
+	local gtest_filter_qemu=""
+	gtest_filter_qemu+="-*DeathTest*"
+	gtest_filter_qemu+=":*ImportSample*"
+	gtest_filter_qemu+=":TestSession.RSA*"
+	gtest_filter_qemu+=":TestSession.KeyTypeMismatch"
+	gtest_filter_qemu+=":TestSession.KeyFunctionPermission"
+	gtest_filter_qemu+=":TestSession.BadKeySize"
+	gtest_filter_qemu+=":TestSession.BadSignature.*"
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}" "" "" "${gtest_filter_qemu}"
+	done
+}
+
+pkg_preinst() {
+	local ug
+	for ug in attestation pkcs11 chaps; do
+		enewuser "${ug}"
+		enewgroup "${ug}"
+	done
+}
diff --git a/chromeos-base/chaps/chaps-9999.ebuild b/chromeos-base/chaps/chaps-9999.ebuild
index d7962f6..ec26c80 100644
--- a/chromeos-base/chaps/chaps-9999.ebuild
+++ b/chromeos-base/chaps/chaps-9999.ebuild
@@ -33,7 +33,7 @@
 		chromeos-base/trunks:=
 	)
 	chromeos-base/minijail:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	!dev-db/leveldb
 	dev-libs/leveldb:=
 	dev-libs/openssl:=
diff --git a/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1-r12.ebuild b/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1-r15.ebuild
similarity index 100%
rename from chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1-r12.ebuild
rename to chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1-r15.ebuild
diff --git a/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1.ebuild b/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1.ebuild
index c1d9797..943c48d 100644
--- a/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1.ebuild
+++ b/chromeos-base/chrome-binary-tests/chrome-binary-tests-0.0.1.ebuild
@@ -36,6 +36,9 @@
 	doexe "${BINARY_DIR}/sandbox_linux_unittests"
 	doexe "${BINARY_DIR}/video_decode_accelerator_perf_tests"
 	doexe "${BINARY_DIR}/video_decode_accelerator_tests"
+	doexe "${BINARY_DIR}/video_encode_accelerator_perf_tests"
+	doexe "${BINARY_DIR}/video_encode_accelerator_tests"
+	# TODO(crbug.com/1045825): Remove video_encode_accelerator_unittest.
 	doexe "${BINARY_DIR}/video_encode_accelerator_unittest"
 	doexe "${BINARY_DIR}/wayland_client_perftests"
 
diff --git a/chromeos-base/chrome-icu/chrome-icu-86.0.4194.0_rc-r1.ebuild b/chromeos-base/chrome-icu/chrome-icu-86.0.4194.0_rc-r1.ebuild
deleted file mode 100644
index e6c05fd1..0000000
--- a/chromeos-base/chrome-icu/chrome-icu-86.0.4194.0_rc-r1.ebuild
+++ /dev/null
@@ -1,720 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This ebuild is based on "chromeos-chrome.ebuild" to compile the chrome/icu
-# package into shared libraries and install them. The essential difference is to
-# do "chrome_make icu" rather than "chrome_make chrome". Besides, some other
-# non-trivial modifications are:
-#   - "chromium-source.eclass" is used to download chrome source code. Because
-#     "chromeos-chrome.ebuild" and "chromium-source.eclass" download the chrome
-#     source into the same location, the variables of "chromeos-chrome.ebuild"
-#     are kept.
-#   - "Control-flow integrity" (|is_cfi=false| and |use_cfi_cast=false|) is
-#     turned off otherwise the generated .so will crash (Illegal instruction).
-#   - Unrelated resource downloads (like for telemetry) are removed.
-#   - Unrelated configuration (like ozone platforms) are removed.
-#   - Unrelated features (like nacl) are disabled.
-#   - Header folders and libraries are postfixed with "${CHROME_ICU_POSTFIX}".
-#
-# Significant changes from "chromeos-chrome.ebuild" are highlighted by "[Mod]".
-#
-# The GN output folder is named as "out_icu_${BOARD}".
-
-EAPI=5
-
-# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
-PYTHON_COMPAT=( python2_7 )
-inherit binutils-funcs chromium-source cros-constants cros-sanitizers flag-o-matic multilib toolchain-funcs python-any-r1
-
-DESCRIPTION="The ICU library copied from chrome/third_party"
-HOMEPAGE="https://cs.chromium.org/chromium/src/third_party/icu/"
-
-LICENSE="BSD"
-
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-# [Mod] Most of non-related IUSE flags are removed.
-IUSE="
-	asan
-	chrome_internal
-	component_build
-	cups
-	+libcxx
-	msan
-	neon
-	+runhooks
-	+thinlto
-	ubsan
-	verbose
-	"
-
-# [Mod] clear REQUIRED_USE.
-REQUIRED_USE=""
-
-# [Mod] Ozone platform variables are removed.
-
-# The gclient hooks that run in src_prepare hit the network.
-# https://crbug.com/731905
-RESTRICT="network-sandbox mirror"
-
-# Portage version without optional portage suffix.
-CHROME_VERSION="${PV/_*/}"
-
-# chrome destination directory
-CHROME_DIR=/opt/google/chrome
-
-# For compilation
-DEPOT_TOOLS=/mnt/host/depot_tools
-BUILDTYPE="${BUILDTYPE:-Release}"
-BOARD="${BOARD:-${SYSROOT##/build/}}"
-# [Mod] GN output dir is named as "out_icu_${BOARD}".
-BUILD_OUT="${BUILD_OUT:-out_icu_${BOARD}}"
-
-# [Mod] Change from "c" to avoid potential conflict with chromeos-chrome.ebuild.
-BUILD_OUT_SYM="c_icu"
-
-# [Mod] To differentiate with the standard ICU, we postfix the include headers
-# folder and library names by "chrome". (see crbug.com/1059133 and b/151439301)
-CHROME_ICU_POSTFIX="-chrome"
-
-# [Mod] Order file and AFDO file variables/functions declared here are removed.
-
-# [Mod] chrome/icu depends on nothing. Blocking the canonical icu package can
-# let us notice the potential repetitions.
-# [Mod] Old Chrome ebuilds installed icudtl.dat.
-RDEPEND="
-	!dev-libs/icu
-	!<chromeos-base/chromeos-chrome-83.0.4098.4
-"
-DEPEND="
-	net-print/cups
-"
-
-# [Mod] NaCl utilities are removed.
-
-usetf()  { usex $1 true false ; }
-
-set_build_args() {
-	# [Mod] 1. Add a new arg "icu_disable_thin_archive=true".
-	#       2. Set the values according to IUSE default value but disable
-	#          unnecessary feature
-	#       3. Set "is_cfi=false".
-	BUILD_ARGS=(
-		"icu_disable_thin_archive=true"
-
-		# is_official_build sometimes implies extra optimizations (e.g. it will allow
-		# ThinLTO to optimize more aggressively, if ThinLTO is enabled). Please note
-		# that, despite the name, it should be usable by external users.
-		#
-		# Sanitizers don't like official builds.
-		"is_official_build=$(use_sanitizers false true)"
-
-		"is_debug=false"
-		"${EXTRA_GN_ARGS}"
-		"use_ozone=true"
-		"use_evdev_gestures=false"
-		# Use the Chrome OS toolchain and not the one bundled with Chromium.
-		"linux_use_bundled_binutils=false"
-		"use_debug_fission=false"
-		"enable_remoting=false"
-		"enable_nacl=false"
-		"enable_nacl=false"
-		"icu_use_data_file=true"
-		# use_system_minigbm is set below.
-		# HarfBuzz and FreeType need to be built together in a specific way
-		# to get FreeType autohinting to work properly. Chromium bundles
-		# FreeType and HarfBuzz to meet that need.
-		# See crbug.com/694137 .
-		"use_system_harfbuzz=false"
-		"use_system_freetype=false"
-		"use_system_libsync=false"
-		"use_cups=$(usetf cups)"
-		"use_bundled_fontconfig=false"
-
-		# Clang features.
-		"is_asan=$(usetf asan)"
-		"is_msan=$(usetf msan)"
-		"is_ubsan=$(usetf ubsan)"
-		"is_clang=true"
-		"cros_host_is_clang=true"
-		"clang_use_chrome_plugins=false"
-		"use_thin_lto=$(usetf thinlto)"
-		"clang_use_chrome_plugins=false"
-		"is_cfi=false"
-		"use_cfi_cast=false"
-
-		# Disable some unnecessary dependencies to avoid some trybot failure.
-		"use_xkbcommon=false"
-	)
-
-	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
-	# add them to BUILD_ARGS at the end.
-	BUILD_STRING_ARGS=(
-		"target_sysroot=${SYSROOT}"
-		"system_libdir=$(get_libdir)"
-		"pkg_config=$(tc-getPKG_CONFIG)"
-		"target_os=chromeos"
-		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
-	)
-
-	# Disable tcmalloc on ARMv6 since it fails to build (crbug.com/181385)
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
-	# [Mod] Ozone platform configrations are removed.
-
-	# Set proper build args for the arch
-	case "${ARCH}" in
-	x86)
-		BUILD_STRING_ARGS+=( "target_cpu=x86" )
-		;;
-	arm)
-		BUILD_ARGS+=(
-			"arm_use_neon=$(usetf neon)"
-			# To workaround the 4GB debug limit. crbug.com/792999.
-			"blink_symbol_level=1"
-		)
-		BUILD_STRING_ARGS+=(
-			"target_cpu=arm"
-			"arm_float_abi=hard"
-		)
-		local arm_arch=$(get-flag march)
-		if [[ -n "${arm_arch}" ]]; then
-			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
-		fi
-		;;
-	arm64)
-		BUILD_STRING_ARGS+=(
-			"target_cpu=arm64"
-		)
-		local arm_arch=$(get-flag march)
-		if [[ -n "${arm_arch}" ]]; then
-			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
-		fi
-		;;
-	amd64)
-		BUILD_STRING_ARGS+=( "target_cpu=x64" )
-		;;
-	mips)
-		local mips_arch target_arch
-
-		mips_arch="$($(tc-getCPP) ${CFLAGS} ${CPPFLAGS} -E -P - <<<_MIPS_ARCH)"
-		# Strip away any enclosing quotes.
-		mips_arch="${mips_arch//\"}"
-		# TODO(benchan): Use tc-endian from toolchain-func to determine endianess
-		# when Chrome later cares about big-endian.
-		case "${mips_arch}" in
-		mips64*)
-			target_arch=mips64el
-			;;
-		*)
-			target_arch=mipsel
-			;;
-		esac
-
-		BUILD_STRING_ARGS+=(
-			"target_cpu=${target_arch}"
-			"mips_arch_variant=${mips_arch}"
-		)
-		;;
-	*)
-		die "Unsupported architecture: ${ARCH}"
-		;;
-	esac
-
-	# [Mod] chrome_media configurations are removed.
-	if use chrome_internal; then
-		# Adding chrome branding specific variables.
-		BUILD_ARGS+=( "is_chrome_branded=true" )
-		# This test can only be build from internal sources.
-		BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
-		export CHROMIUM_BUILD='_google_Chrome'
-		export OFFICIAL_BUILD='1'
-		export CHROME_BUILD_TYPE='_official'
-	fi
-
-	BUILD_ARGS+=(
-		"treat_warnings_as_errors=false"
-	)
-
-	if use component_build; then
-		BUILD_ARGS+=( "is_component_build=true" )
-	fi
-
-	# [Mod] goma is disabled.
-	BUILD_ARGS+=( "use_goma=false" )
-
-	# [Mod] chrome_debug and debug_fission configurations are removed.
-
-	# With ThinLTO, the linking landscape is very different than regular
-	# linking. Some links (e.g., Chrome) can be very heavy and require
-	# 40GB+ of RAM. Since we don't use ThinLTO's cache (crbug.com/964328),
-	# heavy links are always going to be heavy, so it's faster to give them
-	# ${ncpu} each and only have 1 happening at once.
-	if use thinlto; then
-		local thinlto_link_job_count
-
-		if thinlto_link_job_count="$(grep -c ^processor /proc/cpuinfo)"; then
-			BUILD_ARGS+=(
-				"max_jobs_per_link=${thinlto_link_job_count}"
-				"concurrent_links=1"
-			)
-		fi
-
-	fi
-}
-
-# [Mod] Main content of unpack_chrome() is replaced by the unpack function in
-# chromium-source.eclass.
-unpack_chrome() {
-	# Add depot_tools to PATH, local chroot builds fail otherwise.
-	export PATH=${PATH}:${DEPOT_TOOLS}
-
-	chromium-source_src_unpack
-}
-
-decide_chrome_origin() {
-	# [Mod] change "chromeos-chrome-9999" to "chrome-icu-9999".
-	local chrome_workon="=chromeos-base/chrome-icu-9999"
-	local cros_workon_file="${SYSROOT}/etc/portage/package.keywords/cros-workon"
-	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
-		# LOCAL_SOURCE is the default for cros_workon
-		# Warn the user if CHROME_ORIGIN is already set
-		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
-			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
-			ewarn "This will prevent you from building from your local checkout."
-			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
-			ewarn "to the default source location."
-		fi
-		: "${CHROME_ORIGIN:=LOCAL_SOURCE}"
-	else
-		# By default, pull from server
-		: "${CHROME_ORIGIN:=SERVER_SOURCE}"
-	fi
-}
-
-sandboxless_ensure_directory() {
-	local dir
-	for dir in "$@"; do
-		if [[ ! -d "${dir}" ]] ; then
-			# We need root access to create these directories, so we need to
-			# use sudo. This implicitly disables the sandbox.
-			sudo mkdir -p "${dir}" || die
-			sudo chown "${PORTAGE_USERNAME}:portage" "${dir}" || die
-			sudo chmod 0755 "${dir}" || die
-		fi
-	done
-}
-
-src_unpack() {
-	tc-export CC CXX
-	local WHOAMI=$(whoami)
-	export EGCLIENT="${EGCLIENT:-${DEPOT_TOOLS}/gclient}"
-	export ENINJA="${ENINJA:-${DEPOT_TOOLS}/ninja}"
-
-	# Prevents gclient from updating self.
-	export DEPOT_TOOLS_UPDATE=0
-
-	# Prevent gclient metrics collection.
-	export DEPOT_TOOLS_METRICS=0
-
-	CHROME_SRC="chrome-src"
-	if use chrome_internal; then
-		CHROME_SRC+="-internal"
-	fi
-
-	# CHROME_CACHE_DIR is used for storing output artifacts, and is always a
-	# regular directory inside the chroot (i.e. it's never mounted in, so it's
-	# always safe to use cp -al for these artifacts).
-	: "${CHROME_CACHE_DIR:="/var/cache/chromeos-chrome/${CHROME_SRC}"}"
-	addwrite "${CHROME_CACHE_DIR}"
-
-	# CHROME_DISTDIR is used for storing the source code, if any source code
-	# needs to be unpacked at build time (e.g. in the SERVER_SOURCE scenario.)
-	# It will be mounted into the chroot, so it is never safe to use cp -al
-	# for these files.
-	: "${CHROME_DISTDIR:="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/${CHROME_SRC}"}"
-	addwrite "${CHROME_DISTDIR}"
-
-	# Create storage directories.
-	sandboxless_ensure_directory "${CHROME_DISTDIR}" "${CHROME_CACHE_DIR}"
-
-	# [Mod] Calls of cros-credentials_setup is removed.
-
-	decide_chrome_origin
-
-	# [Mod] LOCAL_BINARY is not supported because chromium-source.eclass does not
-	# support it.
-	case "${CHROME_ORIGIN}" in
-	LOCAL_SOURCE|SERVER_SOURCE)
-		elog "CHROME_ORIGIN VALUE is ${CHROME_ORIGIN}"
-		;;
-	*)
-		die "CHROME_ORIGIN not one of LOCAL_SOURCE, SERVER_SOURCE"
-		;;
-	esac
-
-	# Prepare and set CHROME_ROOT based on CHROME_ORIGIN.
-	# CHROME_ROOT is the location where the source code is used for compilation.
-	# If we're in SERVER_SOURCE mode, CHROME_ROOT is CHROME_DISTDIR. In LOCAL_SOURCE
-	# mode, this directory may be set manually to any directory. It may be mounted
-	# into the chroot, so it is not safe to use cp -al for these files.
-	# These are set here because $(whoami) returns the proper user here,
-	# but 'root' at the root level of the file
-	case "${CHROME_ORIGIN}" in
-	(SERVER_SOURCE)
-		elog "Using CHROME_VERSION = ${CHROME_VERSION}"
-		if [[ ${WHOAMI} == "chrome-bot" ]]; then
-			# TODO: Should add a sanity check that the version checked out is
-			# what we actually want.  Not sure how to do that though.
-			elog "Skipping syncing as cbuildbot ran SyncChrome for us."
-		else
-			unpack_chrome
-		fi
-
-		elog "set the chrome source root to ${CHROME_DISTDIR}"
-		elog "From this point onwards there is no difference between \
-			SERVER_SOURCE and LOCAL_SOURCE, since the fetch is done"
-		CHROME_ROOT=${CHROME_DISTDIR}
-		;;
-	(LOCAL_SOURCE)
-		: "${CHROME_ROOT:=/home/${WHOAMI}/chrome_root}"
-		if [[ ! -d "${CHROME_ROOT}/src" ]]; then
-			die "${CHROME_ROOT} does not contain a valid chromium checkout!"
-		fi
-		addwrite "${CHROME_ROOT}"
-		;;
-	esac
-
-	# [Mod] Always call this because the case CHROME_ORIGIN=LOCAL_BINARY is
-	# excluded.
-	set_build_args
-
-	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
-
-	export EGN="${EGN:-${CHROME_ROOT}/src/buildtools/linux64/gn}"
-	einfo "Using GN from ${EGN}"
-
-	# [Mod] License file is required for installation.
-	cp "${CHROME_ROOT}/src/third_party/icu/LICENSE" "${WORKDIR}"
-
-	# [Mod] Use flags internal_gles_conform, afdo_use, afdo_verify,
-	# orderfile_verify and orderfile_use are all disabled.
-	BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
-}
-
-# [Mod] add_api_keys() is removed because we do not need to access Google
-# services.
-
-# [Mod] src_prepare() is simplied because 1) we do not need to access Google
-# services; 2) we exclude the case CHROME_ORIGIN=LOCAL_BINARY and 3) we do
-# not need patches.
-src_prepare() {
-	cd "${CHROME_ROOT}/src" || die "Cannot chdir to ${CHROME_ROOT}"
-	mkdir -p "${CHROME_CACHE_DIR}/src/${BUILD_OUT}"
-	if [[ -n "${BUILD_OUT_SYM}" ]]; then
-		rm -rf "${BUILD_OUT_SYM}" || die "Could not remove symlink"
-		ln -sfT "${CHROME_CACHE_DIR}/src/${BUILD_OUT}" "${BUILD_OUT_SYM}" ||
-			die "Could not create symlink for output directory"
-	fi
-}
-
-# [Mod] setup_test_lists() is removed.
-
-# Handle all CFLAGS/CXXFLAGS/etc... munging here.
-setup_compile_flags() {
-	# Chrome controls its own optimization settings, so this would be a nop
-	# if we were to run it. Leave it here anyway as a grep-friendly marker.
-	# cros_optimize_package_for_speed
-
-	# The chrome makefiles specify -O and -g flags already, so remove the
-	# portage flags.
-	filter-flags -g -O*
-
-	# Remove unsupported arm64 linker flag on arm32 builds.
-	# https://crbug.com/889079
-	use arm && filter-flags "-Wl,--fix-cortex-a53-843419"
-
-	# There are some flags we want to only use in the ebuild.
-	# The rest will be exported to the simple chrome workflow.
-	EBUILD_CFLAGS=()
-	EBUILD_CXXFLAGS=()
-	EBUILD_LDFLAGS=()
-
-	# LLVM needs this when parsing profiles.
-	# See README on https://github.com/google/autofdo
-	# For ARM, we do not need this flag because we don't get profiles
-	# from ARM machines. And it triggers an llvm assertion when thinlto
-	# and debug fission is used together.
-	# See https://bugs.llvm.org/show_bug.cgi?id=37255
-	use arm || append-flags -fdebug-info-for-profiling
-
-	if use thinlto; then
-		# We need to change the default value of import-instr-limit in
-		# LLVM to limit the text size increase. The default value is
-		# 100, and we change it to 30 to reduce the text size increase
-		# from 25% to 10%. The performance number of page_cycler is the
-		# same on two of the thinLTO configurations, we got 1% slowdown
-		# on speedometer when changing import-instr-limit from 100 to 30.
-		# We need to further reduce it to 20 for arm to limit the size
-		# increase to 10%.
-		local thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=30"
-		if use arm; then
-			thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=20"
-			EBUILD_LDFLAGS+=( -gsplit-dwarf )
-		fi
-		EBUILD_LDFLAGS+=( "${thinlto_ldflag}" )
-		# if using thinlto, we need to pass the equivalent of
-		# -fdebug-types-section to the backend, to prevent out-of-range
-		# relocations (see
-		# https://bugs.chromium.org/p/chromium/issues/detail?id=1032159).
-		append-ldflags -Wl,-mllvm
-		append-ldflags -Wl,-generate-type-units
-	fi
-
-	# [Mod] Configurations related to orderfile_generate USE flag are removed.
-
-	# Turn off call graph profile sort (C3), when new pass manager is enabled.
-	# Only allow it when we want to generate orderfile.
-	# This is a temporary option and will need to be removed once orderfile is on.
-	EBUILD_LDFLAGS+=( "-Wl,--no-call-graph-profile-sort" )
-
-	# Enable std::vector []-operator bounds checking.
-	append-cxxflags -D__google_stl_debug_vector=1
-
-	# Chrome and Chrome OS versions of the compiler may not be in
-	# sync. So, don't complain if Chrome uses a diagnostic
-	# option that is not yet implemented in the compiler version used
-	# by Chrome OS.
-	# Turns out this is only really supported by Clang. See crosbug.com/615466
-	# Add "-faddrsig" flag required to efficiently support "--icf=all".
-	append-flags -faddrsig
-	append-flags -Wno-unknown-warning-option
-	export CXXFLAGS_host+=" -Wno-unknown-warning-option"
-	export CFLAGS_host+=" -Wno-unknown-warning-option"
-	if use libcxx; then
-		append-cxxflags "-stdlib=libc++"
-		append-ldflags "-stdlib=libc++"
-	fi
-
-	# Workaround: Disable fatal linker warnings on arm64/lld.
-	# https://crbug.com/913071
-	# [mod] vtable_verify is disabled.
-	use arm64 && append-ldflags "-Wl,--no-fatal-warnings"
-
-	local flags
-	einfo "Building with the compiler settings:"
-	for flags in {C,CXX,CPP,LD}FLAGS; do
-		einfo "  ${flags} = ${!flags}"
-	done
-}
-
-src_configure() {
-	tc-export CXX CC AR AS NM RANLIB STRIP
-	export CC_host=$(tc-getBUILD_CC)
-	export CXX_host=$(tc-getBUILD_CXX)
-	export NM_host=$(tc-getBUILD_NM)
-	export READELF="llvm-readelf"
-	export READELF_host="llvm-readelf"
-
-	# Use C++ compiler as the linker driver.
-	export LD="${CXX}"
-	export LD_host=${CXX_host}
-
-	# We need below change when USE="thinlto" is set. We set this globally
-	# so that users can turn on the "use_thin_lto" in the simplechrome
-	# flow more easily.
-	# use nm from llvm, https://crbug.com/917193
-	export NM="llvm-nm"
-	export NM_host="llvm-nm"
-	export AR="llvm-ar"
-	# USE=thinlto affects host build, we need to set host AR to
-	# llvm-ar to make sure host package builds with thinlto.
-	# crbug.com/731335
-	export AR_host="llvm-ar"
-	export RANLIB="llvm-ranlib"
-
-	# Set binutils path for goma.
-	CC_host+=" -B$(get_binutils_path "${LD_host}")"
-	CXX_host+=" -B$(get_binutils_path "${LD_host}")"
-
-	setup_compile_flags
-
-	# We might set BOTO_CONFIG in the builder environment in case the
-	# existing file needs modifications (e.g. for working with older
-	# branches). So don't overwrite it if it's already set.
-	# See https://crbug.com/847676 for details.
-	export BOTO_CONFIG="${BOTO_CONFIG:-/home/$(whoami)/.boto}"
-	export PATH=${PATH}:${DEPOT_TOOLS}
-
-	export DEPOT_TOOLS_GSUTIL_BIN_DIR="${CHROME_CACHE_DIR}/gsutil_bin"
-	# The venv logic seems to misbehave when cross-compiling.  Since our SDK
-	# should include all the necessary modules, just disable it (for now).
-	# https://crbug.com/808434
-	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"
-
-	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
-	# useflag when chrome build switches to Ninja inside the chroot.
-	if use runhooks; then
-		[[ -f "${EGCLIENT}" ]] || die "EGCLIENT at '${EGCLIENT}' does not exist"
-		local cmd=( "${EGCLIENT}" runhooks --force )
-		echo "${cmd[@]}"
-		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
-		CXXFLAGS="${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}" \
-		LDFLAGS="${LDFLAGS} ${EBUILD_LDFLAGS[*]}" \
-		"${cmd[@]}" || die
-	fi
-
-	# [Mod] Unrelated V8 configurations are removed.
-	BUILD_STRING_ARGS+=(
-		"cros_target_ar=${AR}"
-		"cros_target_cc=${CC}"
-		"cros_target_cxx=${CXX}"
-		"host_toolchain=//build/toolchain/cros:host"
-		"custom_toolchain=//build/toolchain/cros:target"
-		"cros_target_ld=${LD}"
-		"cros_target_nm=${NM}"
-		"cros_target_readelf=${READELF}"
-		"cros_target_extra_cflags=${CFLAGS} ${EBUILD_CFLAGS[*]}"
-		"cros_target_extra_cppflags=${CPPFLAGS}"
-		"cros_target_extra_cxxflags=${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}"
-		"cros_target_extra_ldflags=${LDFLAGS} ${EBUILD_LDFLAGS[*]}"
-		"cros_host_cc=${CC_host}"
-		"cros_host_cxx=${CXX_host}"
-		"cros_host_ar=${AR_host}"
-		"cros_host_ld=${LD_host}"
-		"cros_host_nm=${NM_host}"
-		"cros_host_readelf=${READELF_host}"
-		"cros_host_extra_cflags=${CFLAGS_host}"
-		"cros_host_extra_cxxflags=${CXXFLAGS_host}"
-		"cros_host_extra_cppflags=${CPPFLAGS_host}"
-		"cros_host_extra_ldflags=${LDFLAGS_host}"
-	)
-
-	local arg
-	for arg in "${BUILD_STRING_ARGS[@]}"; do
-		BUILD_ARGS+=("${arg%%=*}=\"${arg#*=}\"")
-	done
-	export GN_ARGS="${BUILD_ARGS[*]}"
-	einfo "GN_ARGS = ${GN_ARGS}"
-
-	${EGN} gen "${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}" \
-		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src" || die
-
-	# [Mod] setup_test_lists and clang_tidy are removed.
-}
-
-chrome_make() {
-	local build_dir="${BUILD_OUT_SYM}/${BUILDTYPE}"
-
-	# If ThinLTO is enabled, we may have a cache from a previous link. Due
-	# to fears about lack of reproducibility, we don't allow cache reuse
-	# across rebuilds. The cache is still useful for artifacts shared
-	# between multiple links done by this build (e.g. tests).
-	use thinlto && rm -rf "${build_dir}/thinlto-cache"
-
-	local command=(
-		"${ENINJA}"
-		"${MAKEOPTS}"
-		-C "${build_dir}"
-		$(usex verbose -v "")
-		"$@"
-	)
-
-	PATH=${PATH}:${DEPOT_TOOLS} "${command[@]}"
-	local ret=$?
-	[[ "${ret}" -eq 0 ]] || die
-}
-
-# [Mod] src_compile() is simplied because 1) the case CHROME_LOCAL=LOCAL_BINARY
-# is excluded. 2) we do not need nacl or tests.
-src_compile() {
-	cd "${CHROME_ROOT}"/src || die "Cannot chdir to ${CHROME_ROOT}/src"
-
-	chrome_make "icu"
-}
-
-# [Mod] src_install() is greatly simplied and totally new.
-src_install() {
-	local build_dir="src/${BUILD_OUT_SYM}/${BUILDTYPE}"
-	local icu_lib_dir="${build_dir}/obj/third_party/icu/"
-	mv "${icu_lib_dir}/libicui18n.a" "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
-	mv "${icu_lib_dir}/libicuuc.a" "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
-	dolib.a "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
-	dolib.a "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
-	# Install to chrome folder to make chrome work.
-	insinto "${CHROME_DIR}"
-	doins "${build_dir}/icudtl.dat"
-
-	# Install icu header to /usr/include/icu/.
-	local icu_headers=(
-		"common/unicode/brkiter.h"
-		"common/unicode/bytestream.h"
-		"common/unicode/char16ptr.h"
-		"common/unicode/chariter.h"
-		"common/unicode/errorcode.h"
-		"common/unicode/localpointer.h"
-		"common/unicode/locid.h"
-		"common/unicode/parseerr.h"
-		"common/unicode/platform.h"
-		"common/unicode/ptypes.h"
-		"common/unicode/putil.h"
-		"common/unicode/putil.h"
-		"common/unicode/rep.h"
-		"common/unicode/std_string.h"
-		"common/unicode/strenum.h"
-		"common/unicode/stringoptions.h"
-		"common/unicode/stringpiece.h"
-		"common/unicode/ubrk.h"
-		"common/unicode/uchar.h"
-		"common/unicode/uchar.h"
-		"common/unicode/uconfig.h"
-		"common/unicode/ucpmap.h"
-		"common/unicode/ucurr.h"
-		"common/unicode/udata.h"
-		"common/unicode/udisplaycontext.h"
-		"common/unicode/uenum.h"
-		"common/unicode/uloc.h"
-		"common/unicode/umachine.h"
-		"common/unicode/umisc.h"
-		"common/unicode/unistr.h"
-		"common/unicode/uobject.h"
-		"common/unicode/urename.h"
-		"common/unicode/ures.h"
-		"common/unicode/utext.h"
-		"common/unicode/utf.h"
-		"common/unicode/utf.h"
-		"common/unicode/utf16.h"
-		"common/unicode/utf16.h"
-		"common/unicode/utf8.h"
-		"common/unicode/utf8.h"
-		"common/unicode/utf_old.h"
-		"common/unicode/utf_old.h"
-		"common/unicode/utypes.h"
-		"common/unicode/uvernum.h"
-		"common/unicode/uversion.h"
-		"i18n/unicode/calendar.h"
-		"i18n/unicode/gregocal.h"
-		"i18n/unicode/regex.h"
-		"i18n/unicode/timezone.h"
-		"i18n/unicode/ucal.h"
-		"i18n/unicode/ufieldpositer.h"
-		"i18n/unicode/uformattable.h"
-		"i18n/unicode/unum.h"
-		"i18n/unicode/uregex.h"
-	)
-	local f
-	for f in "${icu_headers[@]}"; do
-		insinto "/usr/include/icu${CHROME_ICU_POSTFIX}/${f%/*}"
-		doins "${CHROME_ROOT}/src/third_party/icu/source/${f}"
-	done
-}
diff --git a/chromeos-base/chrome-icu/chrome-icu-87.0.4280.0_rc-r1.ebuild b/chromeos-base/chrome-icu/chrome-icu-87.0.4280.0_rc-r1.ebuild
new file mode 100644
index 0000000..37915a7
--- /dev/null
+++ b/chromeos-base/chrome-icu/chrome-icu-87.0.4280.0_rc-r1.ebuild
@@ -0,0 +1,693 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This ebuild is based on "chromeos-chrome.ebuild" to compile the chrome/icu
+# package into shared libraries and install them. The essential difference is to
+# do "chrome_make icu" rather than "chrome_make chrome". Besides, some other
+# non-trivial modifications are:
+#   - "chromium-source.eclass" is used to download chrome source code. Because
+#     "chromeos-chrome.ebuild" and "chromium-source.eclass" download the chrome
+#     source into the same location, the variables of "chromeos-chrome.ebuild"
+#     are kept.
+#   - "Control-flow integrity" (|is_cfi=false| and |use_cfi_cast=false|) is
+#     turned off otherwise the generated .so will crash (Illegal instruction).
+#   - Unrelated resource downloads (like for telemetry) are removed.
+#   - Unrelated configuration (like ozone platforms) are removed.
+#   - Unrelated features (like nacl) are disabled.
+#   - Header folders and libraries are postfixed with "${CHROME_ICU_POSTFIX}".
+#
+# Significant changes from "chromeos-chrome.ebuild" are highlighted by "[Mod]".
+#
+# The GN output folder is named as "out_icu_${BOARD}".
+
+EAPI=5
+
+# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
+PYTHON_COMPAT=( python2_7 )
+inherit binutils-funcs chromium-source cros-constants cros-sanitizers flag-o-matic multilib toolchain-funcs python-any-r1
+
+DESCRIPTION="The ICU library copied from chrome/third_party"
+HOMEPAGE="https://cs.chromium.org/chromium/src/third_party/icu/"
+
+LICENSE="icu-58"
+
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+# [Mod] Most of non-related IUSE flags are removed.
+IUSE="
+	asan
+	chrome_internal
+	component_build
+	cups
+	+libcxx
+	msan
+	neon
+	+runhooks
+	+thinlto
+	ubsan
+	verbose
+	"
+
+# [Mod] clear REQUIRED_USE.
+REQUIRED_USE=""
+
+# [Mod] Ozone platform variables are removed.
+
+# The gclient hooks that run in src_prepare hit the network.
+# https://crbug.com/731905
+RESTRICT="network-sandbox mirror"
+
+# Portage version without optional portage suffix.
+CHROME_VERSION="${PV/_*/}"
+
+# chrome destination directory
+CHROME_DIR=/opt/google/chrome
+
+# For compilation
+BUILDTYPE="${BUILDTYPE:-Release}"
+BOARD="${BOARD:-${SYSROOT##/build/}}"
+# [Mod] GN output dir is named as "out_icu_${BOARD}".
+BUILD_OUT="${BUILD_OUT:-out_icu_${BOARD}}"
+
+# [Mod] Change from "c" to avoid potential conflict with chromeos-chrome.ebuild.
+BUILD_OUT_SYM="c_icu"
+
+# [Mod] To differentiate with the standard ICU, we postfix the include headers
+# folder and library names by "chrome". (see crbug.com/1059133 and b/151439301)
+CHROME_ICU_POSTFIX="-chrome"
+
+# [Mod] Order file and AFDO file variables/functions declared here are removed.
+
+# [Mod] chrome/icu depends on nothing. Blocking the canonical icu package can
+# let us notice the potential repetitions.
+# [Mod] Old Chrome ebuilds installed icudtl.dat.
+RDEPEND="
+	!dev-libs/icu
+	!<chromeos-base/chromeos-chrome-83.0.4098.4
+"
+DEPEND="
+	net-print/cups
+"
+
+# [Mod] NaCl utilities are removed.
+
+usetf()  { usex $1 true false ; }
+
+set_build_args() {
+	# [Mod] 1. Add a new arg "icu_disable_thin_archive=true".
+	#       2. Set the values according to IUSE default value but disable
+	#          unnecessary feature
+	#       3. Set "is_cfi=false".
+	BUILD_ARGS=(
+		"is_chromeos_device=true"
+		"icu_disable_thin_archive=true"
+
+		# is_official_build sometimes implies extra optimizations (e.g. it will allow
+		# ThinLTO to optimize more aggressively, if ThinLTO is enabled). Please note
+		# that, despite the name, it should be usable by external users.
+		#
+		# Sanitizers don't like official builds.
+		"is_official_build=$(use_sanitizers false true)"
+
+		"is_debug=false"
+		"${EXTRA_GN_ARGS}"
+		"use_ozone=true"
+		"use_evdev_gestures=false"
+		# Use the Chrome OS toolchain and not the one bundled with Chromium.
+		"linux_use_bundled_binutils=false"
+		"use_debug_fission=false"
+		"enable_remoting=false"
+		"enable_nacl=false"
+		"enable_nacl=false"
+		"icu_use_data_file=true"
+		# use_system_minigbm is set below.
+		# HarfBuzz and FreeType need to be built together in a specific way
+		# to get FreeType autohinting to work properly. Chromium bundles
+		# FreeType and HarfBuzz to meet that need.
+		# See crbug.com/694137 .
+		"use_system_harfbuzz=false"
+		"use_system_freetype=false"
+		"use_system_libsync=false"
+		"use_cups=$(usetf cups)"
+		"use_bundled_fontconfig=false"
+
+		# Clang features.
+		"is_asan=$(usetf asan)"
+		"is_msan=$(usetf msan)"
+		"is_ubsan=$(usetf ubsan)"
+		"is_clang=true"
+		"cros_host_is_clang=true"
+		"clang_use_chrome_plugins=false"
+		"use_thin_lto=$(usetf thinlto)"
+		"clang_use_chrome_plugins=false"
+		"is_cfi=false"
+		"use_cfi_cast=false"
+		"use_cras=false"
+	)
+
+	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
+	# add them to BUILD_ARGS at the end.
+	BUILD_STRING_ARGS=(
+		"target_sysroot=${SYSROOT}"
+		"system_libdir=$(get_libdir)"
+		"pkg_config=$(tc-getPKG_CONFIG)"
+		"target_os=chromeos"
+		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
+	)
+
+	# [Mod] Ozone platform configrations are removed.
+
+	# Set proper build args for the arch
+	case "${ARCH}" in
+	x86)
+		BUILD_STRING_ARGS+=( "target_cpu=x86" )
+		;;
+	arm)
+		BUILD_ARGS+=(
+			"arm_use_neon=$(usetf neon)"
+			# To workaround the 4GB debug limit. crbug.com/792999.
+			"blink_symbol_level=1"
+		)
+		BUILD_STRING_ARGS+=(
+			"target_cpu=arm"
+			"arm_float_abi=hard"
+		)
+		local arm_arch=$(get-flag march)
+		if [[ -n "${arm_arch}" ]]; then
+			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
+		fi
+		;;
+	arm64)
+		BUILD_STRING_ARGS+=(
+			"target_cpu=arm64"
+		)
+		local arm_arch=$(get-flag march)
+		if [[ -n "${arm_arch}" ]]; then
+			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
+		fi
+		;;
+	amd64)
+		BUILD_STRING_ARGS+=( "target_cpu=x64" )
+		;;
+	mips)
+		local mips_arch target_arch
+
+		mips_arch="$($(tc-getCPP) ${CFLAGS} ${CPPFLAGS} -E -P - <<<_MIPS_ARCH)"
+		# Strip away any enclosing quotes.
+		mips_arch="${mips_arch//\"}"
+		# TODO(benchan): Use tc-endian from toolchain-func to determine endianess
+		# when Chrome later cares about big-endian.
+		case "${mips_arch}" in
+		mips64*)
+			target_arch=mips64el
+			;;
+		*)
+			target_arch=mipsel
+			;;
+		esac
+
+		BUILD_STRING_ARGS+=(
+			"target_cpu=${target_arch}"
+			"mips_arch_variant=${mips_arch}"
+		)
+		;;
+	*)
+		die "Unsupported architecture: ${ARCH}"
+		;;
+	esac
+
+	# [Mod] chrome_media configurations are removed.
+	if use chrome_internal; then
+		# Adding chrome branding specific variables.
+		BUILD_ARGS+=( "is_chrome_branded=true" )
+		# This test can only be build from internal sources.
+		BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
+		export CHROMIUM_BUILD='_google_Chrome'
+		export OFFICIAL_BUILD='1'
+		export CHROME_BUILD_TYPE='_official'
+	fi
+
+	BUILD_ARGS+=(
+		"treat_warnings_as_errors=false"
+	)
+
+	if use component_build; then
+		BUILD_ARGS+=( "is_component_build=true" )
+	fi
+
+	# [Mod] goma is disabled.
+	BUILD_ARGS+=( "use_goma=false" )
+
+	# [Mod] chrome_debug and debug_fission configurations are removed.
+
+	# With ThinLTO, the linking landscape is very different than regular
+	# linking. Some links (e.g., Chrome) can be very heavy and require
+	# 40GB+ of RAM. Since we don't use ThinLTO's cache (crbug.com/964328),
+	# heavy links are always going to be heavy, so it's faster to give them
+	# ${ncpu} each and only have 1 happening at once.
+	if use thinlto; then
+		local thinlto_link_job_count
+
+		if thinlto_link_job_count="$(grep -c ^processor /proc/cpuinfo)"; then
+			BUILD_ARGS+=(
+				"max_jobs_per_link=${thinlto_link_job_count}"
+				"concurrent_links=1"
+			)
+		fi
+
+	fi
+}
+
+# [Mod] Main content of unpack_chrome() is replaced by the unpack function in
+# chromium-source.eclass.
+unpack_chrome() {
+	# Add depot_tools to PATH, local chroot builds fail otherwise.
+	export PATH=${PATH}:${DEPOT_TOOLS}
+
+	chromium-source_src_unpack
+}
+
+decide_chrome_origin() {
+	if [[ "${PV}" == "9999" ]]; then
+		# LOCAL_SOURCE is the default for cros_workon
+		# Warn the user if CHROME_ORIGIN is already set
+		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
+			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
+			ewarn "This will prevent you from building from your local checkout."
+			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
+			ewarn "to the default source location."
+		fi
+		: "${CHROME_ORIGIN:=LOCAL_SOURCE}"
+	else
+		# By default, pull from server
+		: "${CHROME_ORIGIN:=SERVER_SOURCE}"
+	fi
+}
+
+sandboxless_ensure_directory() {
+	local dir
+	for dir in "$@"; do
+		if [[ ! -d "${dir}" ]] ; then
+			# We need root access to create these directories, so we need to
+			# use sudo. This implicitly disables the sandbox.
+			sudo mkdir -p "${dir}" || die
+			sudo chown "${PORTAGE_USERNAME}:portage" "${dir}" || die
+			sudo chmod 0755 "${dir}" || die
+		fi
+	done
+}
+
+src_unpack() {
+	tc-export CC CXX
+	local WHOAMI=$(whoami)
+
+	CHROME_SRC="chrome-src"
+	if use chrome_internal; then
+		CHROME_SRC+="-internal"
+	fi
+
+	# CHROME_CACHE_DIR is used for storing output artifacts, and is always a
+	# regular directory inside the chroot (i.e. it's never mounted in, so it's
+	# always safe to use cp -al for these artifacts).
+	: "${CHROME_CACHE_DIR:="/var/cache/chromeos-chrome/${CHROME_SRC}"}"
+	addwrite "${CHROME_CACHE_DIR}"
+
+	# CHROME_DISTDIR is used for storing the source code, if any source code
+	# needs to be unpacked at build time (e.g. in the SERVER_SOURCE scenario.)
+	# It will be mounted into the chroot, so it is never safe to use cp -al
+	# for these files.
+	: "${CHROME_DISTDIR:="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/${CHROME_SRC}"}"
+	addwrite "${CHROME_DISTDIR}"
+
+	# Create storage directories.
+	sandboxless_ensure_directory "${CHROME_DISTDIR}" "${CHROME_CACHE_DIR}"
+
+	# [Mod] Calls of cros-credentials_setup is removed.
+
+	decide_chrome_origin
+
+	# [Mod] LOCAL_BINARY is not supported because chromium-source.eclass does not
+	# support it.
+	case "${CHROME_ORIGIN}" in
+	LOCAL_SOURCE|SERVER_SOURCE)
+		elog "CHROME_ORIGIN VALUE is ${CHROME_ORIGIN}"
+		;;
+	*)
+		die "CHROME_ORIGIN not one of LOCAL_SOURCE, SERVER_SOURCE"
+		;;
+	esac
+
+	# Prepare and set CHROME_ROOT based on CHROME_ORIGIN.
+	# CHROME_ROOT is the location where the source code is used for compilation.
+	# If we're in SERVER_SOURCE mode, CHROME_ROOT is CHROME_DISTDIR. In LOCAL_SOURCE
+	# mode, this directory may be set manually to any directory. It may be mounted
+	# into the chroot, so it is not safe to use cp -al for these files.
+	# These are set here because $(whoami) returns the proper user here,
+	# but 'root' at the root level of the file
+	case "${CHROME_ORIGIN}" in
+	(SERVER_SOURCE)
+		elog "Using CHROME_VERSION = ${CHROME_VERSION}"
+		if [[ ${WHOAMI} == "chrome-bot" ]]; then
+			# TODO: Should add a sanity check that the version checked out is
+			# what we actually want.  Not sure how to do that though.
+			elog "Skipping syncing as cbuildbot ran SyncChrome for us."
+		else
+			unpack_chrome
+		fi
+
+		elog "set the chrome source root to ${CHROME_DISTDIR}"
+		elog "From this point onwards there is no difference between \
+			SERVER_SOURCE and LOCAL_SOURCE, since the fetch is done"
+		CHROME_ROOT=${CHROME_DISTDIR}
+		;;
+	(LOCAL_SOURCE)
+		: "${CHROME_ROOT:=/home/${WHOAMI}/chrome_root}"
+		if [[ ! -d "${CHROME_ROOT}/src" ]]; then
+			die "${CHROME_ROOT} does not contain a valid chromium checkout!"
+		fi
+		addwrite "${CHROME_ROOT}"
+		;;
+	esac
+
+	# [Mod] Always call this because the case CHROME_ORIGIN=LOCAL_BINARY is
+	# excluded.
+	set_build_args
+
+	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
+
+	# [Mod] Use flags internal_gles_conform, afdo_use, afdo_verify,
+	# orderfile_verify and orderfile_use are all disabled.
+	BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
+}
+
+# [Mod] add_api_keys() is removed because we do not need to access Google
+# services.
+
+# [Mod] src_prepare() is simplied because 1) we do not need to access Google
+# services; 2) we exclude the case CHROME_ORIGIN=LOCAL_BINARY and 3) we do
+# not need patches.
+src_prepare() {
+	cd "${CHROME_ROOT}/src" || die "Cannot chdir to ${CHROME_ROOT}"
+	mkdir -p "${CHROME_CACHE_DIR}/src/${BUILD_OUT}"
+	if [[ -n "${BUILD_OUT_SYM}" ]]; then
+		rm -rf "${BUILD_OUT_SYM}" || die "Could not remove symlink"
+		ln -sfT "${CHROME_CACHE_DIR}/src/${BUILD_OUT}" "${BUILD_OUT_SYM}" ||
+			die "Could not create symlink for output directory"
+	fi
+}
+
+# [Mod] setup_test_lists() is removed.
+
+# Handle all CFLAGS/CXXFLAGS/etc... munging here.
+setup_compile_flags() {
+	# Chrome controls its own optimization settings, so this would be a nop
+	# if we were to run it. Leave it here anyway as a grep-friendly marker.
+	# cros_optimize_package_for_speed
+
+	# The chrome makefiles specify -O and -g flags already, so remove the
+	# portage flags.
+	filter-flags -g -O*
+
+	# Remove unsupported arm64 linker flag on arm32 builds.
+	# https://crbug.com/889079
+	use arm && filter-flags "-Wl,--fix-cortex-a53-843419"
+
+	# There are some flags we want to only use in the ebuild.
+	# The rest will be exported to the simple chrome workflow.
+	EBUILD_CFLAGS=()
+	EBUILD_CXXFLAGS=()
+	EBUILD_LDFLAGS=()
+
+	# LLVM needs this when parsing profiles.
+	# See README on https://github.com/google/autofdo
+	# For ARM, we do not need this flag because we don't get profiles
+	# from ARM machines. And it triggers an llvm assertion when thinlto
+	# and debug fission is used together.
+	# See https://bugs.llvm.org/show_bug.cgi?id=37255
+	use arm || append-flags -fdebug-info-for-profiling
+
+	if use thinlto; then
+		# We need to change the default value of import-instr-limit in
+		# LLVM to limit the text size increase. The default value is
+		# 100, and we change it to 30 to reduce the text size increase
+		# from 25% to 10%. The performance number of page_cycler is the
+		# same on two of the thinLTO configurations, we got 1% slowdown
+		# on speedometer when changing import-instr-limit from 100 to 30.
+		# We need to further reduce it to 20 for arm to limit the size
+		# increase to 10%.
+		local thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=30"
+		if use arm; then
+			thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=20"
+			EBUILD_LDFLAGS+=( -gsplit-dwarf )
+		fi
+		EBUILD_LDFLAGS+=( "${thinlto_ldflag}" )
+		# if using thinlto, we need to pass the equivalent of
+		# -fdebug-types-section to the backend, to prevent out-of-range
+		# relocations (see
+		# https://bugs.chromium.org/p/chromium/issues/detail?id=1032159).
+		append-ldflags -Wl,-mllvm
+		append-ldflags -Wl,-generate-type-units
+	fi
+
+	# [Mod] Configurations related to orderfile_generate USE flag are removed.
+
+	# Turn off call graph profile sort (C3), when new pass manager is enabled.
+	# Only allow it when we want to generate orderfile.
+	# This is a temporary option and will need to be removed once orderfile is on.
+	EBUILD_LDFLAGS+=( "-Wl,--no-call-graph-profile-sort" )
+
+	# Enable std::vector []-operator bounds checking.
+	append-cxxflags -D__google_stl_debug_vector=1
+
+	# Chrome and Chrome OS versions of the compiler may not be in
+	# sync. So, don't complain if Chrome uses a diagnostic
+	# option that is not yet implemented in the compiler version used
+	# by Chrome OS.
+	# Turns out this is only really supported by Clang. See crosbug.com/615466
+	# Add "-faddrsig" flag required to efficiently support "--icf=all".
+	append-flags -faddrsig
+	append-flags -Wno-unknown-warning-option
+	export CXXFLAGS_host+=" -Wno-unknown-warning-option"
+	export CFLAGS_host+=" -Wno-unknown-warning-option"
+	if use libcxx; then
+		append-cxxflags "-stdlib=libc++"
+		append-ldflags "-stdlib=libc++"
+	fi
+
+	# Workaround: Disable fatal linker warnings on arm64/lld.
+	# https://crbug.com/913071
+	# [mod] vtable_verify is disabled.
+	use arm64 && append-ldflags "-Wl,--no-fatal-warnings"
+
+	local flags
+	einfo "Building with the compiler settings:"
+	for flags in {C,CXX,CPP,LD}FLAGS; do
+		einfo "  ${flags} = ${!flags}"
+	done
+}
+
+src_configure() {
+	tc-export CXX CC AR AS NM RANLIB STRIP
+	export CC_host=$(tc-getBUILD_CC)
+	export CXX_host=$(tc-getBUILD_CXX)
+	export NM_host=$(tc-getBUILD_NM)
+	export READELF="llvm-readelf"
+	export READELF_host="llvm-readelf"
+
+	# Use C++ compiler as the linker driver.
+	export LD="${CXX}"
+	export LD_host=${CXX_host}
+
+	# We need below change when USE="thinlto" is set. We set this globally
+	# so that users can turn on the "use_thin_lto" in the simplechrome
+	# flow more easily.
+	# use nm from llvm, https://crbug.com/917193
+	export NM="llvm-nm"
+	export NM_host="llvm-nm"
+	export AR="llvm-ar"
+	# USE=thinlto affects host build, we need to set host AR to
+	# llvm-ar to make sure host package builds with thinlto.
+	# crbug.com/731335
+	export AR_host="llvm-ar"
+	export RANLIB="llvm-ranlib"
+
+	# Set binutils path for goma.
+	CC_host+=" -B$(get_binutils_path "${LD_host}")"
+	CXX_host+=" -B$(get_binutils_path "${LD_host}")"
+
+	setup_compile_flags
+
+	# We might set BOTO_CONFIG in the builder environment in case the
+	# existing file needs modifications (e.g. for working with older
+	# branches). So don't overwrite it if it's already set.
+	# See https://crbug.com/847676 for details.
+	export BOTO_CONFIG="${BOTO_CONFIG:-/home/$(whoami)/.boto}"
+	export PATH=${PATH}:${DEPOT_TOOLS}
+
+	export DEPOT_TOOLS_GSUTIL_BIN_DIR="${CHROME_CACHE_DIR}/gsutil_bin"
+	# The venv logic seems to misbehave when cross-compiling.  Since our SDK
+	# should include all the necessary modules, just disable it (for now).
+	# https://crbug.com/808434
+	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"
+
+	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
+	# useflag when chrome build switches to Ninja inside the chroot.
+	if use runhooks; then
+		local cmd=( "${EGCLIENT}" runhooks --force )
+		echo "${cmd[@]}"
+		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
+		CXXFLAGS="${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}" \
+		LDFLAGS="${LDFLAGS} ${EBUILD_LDFLAGS[*]}" \
+		"${cmd[@]}" || die
+	fi
+
+	# [Mod] Unrelated V8 configurations are removed.
+	BUILD_STRING_ARGS+=(
+		"cros_target_ar=${AR}"
+		"cros_target_cc=${CC}"
+		"cros_target_cxx=${CXX}"
+		"host_toolchain=//build/toolchain/cros:host"
+		"custom_toolchain=//build/toolchain/cros:target"
+		"cros_target_ld=${LD}"
+		"cros_target_nm=${NM}"
+		"cros_target_readelf=${READELF}"
+		"cros_target_extra_cflags=${CFLAGS} ${EBUILD_CFLAGS[*]}"
+		"cros_target_extra_cppflags=${CPPFLAGS}"
+		"cros_target_extra_cxxflags=${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}"
+		"cros_target_extra_ldflags=${LDFLAGS} ${EBUILD_LDFLAGS[*]}"
+		"cros_host_cc=${CC_host}"
+		"cros_host_cxx=${CXX_host}"
+		"cros_host_ar=${AR_host}"
+		"cros_host_ld=${LD_host}"
+		"cros_host_nm=${NM_host}"
+		"cros_host_readelf=${READELF_host}"
+		"cros_host_extra_cflags=${CFLAGS_host}"
+		"cros_host_extra_cxxflags=${CXXFLAGS_host}"
+		"cros_host_extra_cppflags=${CPPFLAGS_host}"
+		"cros_host_extra_ldflags=${LDFLAGS_host}"
+	)
+
+	local arg
+	for arg in "${BUILD_STRING_ARGS[@]}"; do
+		BUILD_ARGS+=("${arg%%=*}=\"${arg#*=}\"")
+	done
+	export GN_ARGS="${BUILD_ARGS[*]}"
+	einfo "GN_ARGS = ${GN_ARGS}"
+	local gn=(
+		"${CHROME_ROOT}/src/buildtools/linux64/gn" gen
+		"${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}"
+		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src"
+	)
+	echo "${gn[@]}"
+	"${gn[@]}" || die
+
+	# [Mod] setup_test_lists and clang_tidy are removed.
+}
+
+chrome_make() {
+	local build_dir="${BUILD_OUT_SYM}/${BUILDTYPE}"
+
+	# If ThinLTO is enabled, we may have a cache from a previous link. Due
+	# to fears about lack of reproducibility, we don't allow cache reuse
+	# across rebuilds. The cache is still useful for artifacts shared
+	# between multiple links done by this build (e.g. tests).
+	use thinlto && rm -rf "${build_dir}/thinlto-cache"
+
+	local command=(
+		"${ENINJA}"
+		"${MAKEOPTS}"
+		-C "${build_dir}"
+		$(usex verbose -v "")
+		"$@"
+	)
+
+	PATH=${PATH}:${DEPOT_TOOLS} "${command[@]}"
+	local ret=$?
+	[[ "${ret}" -eq 0 ]] || die
+}
+
+# [Mod] src_compile() is simplied because 1) the case CHROME_LOCAL=LOCAL_BINARY
+# is excluded. 2) we do not need nacl or tests.
+src_compile() {
+	cd "${CHROME_ROOT}"/src || die "Cannot chdir to ${CHROME_ROOT}/src"
+
+	chrome_make "icu"
+}
+
+# [Mod] src_install() is greatly simplied and totally new.
+src_install() {
+	local build_dir="src/${BUILD_OUT_SYM}/${BUILDTYPE}"
+	local icu_lib_dir="${build_dir}/obj/third_party/icu/"
+	mv "${icu_lib_dir}/libicui18n.a" "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
+	mv "${icu_lib_dir}/libicuuc.a" "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
+	dolib.a "${icu_lib_dir}/libicui18n${CHROME_ICU_POSTFIX}.a"
+	dolib.a "${icu_lib_dir}/libicuuc${CHROME_ICU_POSTFIX}.a"
+	# Install to chrome folder to make chrome work.
+	insinto "${CHROME_DIR}"
+	doins "${build_dir}/icudtl.dat"
+
+	# Install icu header to /usr/include/icu/.
+	local icu_headers=(
+		"common/unicode/brkiter.h"
+		"common/unicode/bytestream.h"
+		"common/unicode/char16ptr.h"
+		"common/unicode/chariter.h"
+		"common/unicode/errorcode.h"
+		"common/unicode/localpointer.h"
+		"common/unicode/locid.h"
+		"common/unicode/parseerr.h"
+		"common/unicode/platform.h"
+		"common/unicode/ptypes.h"
+		"common/unicode/putil.h"
+		"common/unicode/putil.h"
+		"common/unicode/rep.h"
+		"common/unicode/std_string.h"
+		"common/unicode/strenum.h"
+		"common/unicode/stringoptions.h"
+		"common/unicode/stringpiece.h"
+		"common/unicode/ubrk.h"
+		"common/unicode/uchar.h"
+		"common/unicode/uchar.h"
+		"common/unicode/uconfig.h"
+		"common/unicode/ucpmap.h"
+		"common/unicode/ucurr.h"
+		"common/unicode/udata.h"
+		"common/unicode/udisplaycontext.h"
+		"common/unicode/uenum.h"
+		"common/unicode/uloc.h"
+		"common/unicode/umachine.h"
+		"common/unicode/umisc.h"
+		"common/unicode/unistr.h"
+		"common/unicode/uobject.h"
+		"common/unicode/urename.h"
+		"common/unicode/ures.h"
+		"common/unicode/utext.h"
+		"common/unicode/utf.h"
+		"common/unicode/utf.h"
+		"common/unicode/utf16.h"
+		"common/unicode/utf16.h"
+		"common/unicode/utf8.h"
+		"common/unicode/utf8.h"
+		"common/unicode/utf_old.h"
+		"common/unicode/utf_old.h"
+		"common/unicode/utypes.h"
+		"common/unicode/uvernum.h"
+		"common/unicode/uversion.h"
+		"i18n/unicode/calendar.h"
+		"i18n/unicode/gregocal.h"
+		"i18n/unicode/regex.h"
+		"i18n/unicode/timezone.h"
+		"i18n/unicode/ucal.h"
+		"i18n/unicode/ufieldpositer.h"
+		"i18n/unicode/uformattable.h"
+		"i18n/unicode/unum.h"
+		"i18n/unicode/uregex.h"
+	)
+	local f
+	for f in "${icu_headers[@]}"; do
+		insinto "/usr/include/icu${CHROME_ICU_POSTFIX}/${f%/*}"
+		doins "${CHROME_ROOT}/src/third_party/icu/source/${f}"
+	done
+}
diff --git a/chromeos-base/chrome-icu/chrome-icu-9999.ebuild b/chromeos-base/chrome-icu/chrome-icu-9999.ebuild
index 91c5414..e85f7cc 100644
--- a/chromeos-base/chrome-icu/chrome-icu-9999.ebuild
+++ b/chromeos-base/chrome-icu/chrome-icu-9999.ebuild
@@ -30,7 +30,7 @@
 DESCRIPTION="The ICU library copied from chrome/third_party"
 HOMEPAGE="https://cs.chromium.org/chromium/src/third_party/icu/"
 
-LICENSE="BSD"
+LICENSE="icu-58"
 
 SLOT="0/${PVR}"
 KEYWORDS="~*"
@@ -48,6 +48,7 @@
 	+thinlto
 	ubsan
 	verbose
+	xkbcommon
 	"
 
 # [Mod] clear REQUIRED_USE.
@@ -66,7 +67,6 @@
 CHROME_DIR=/opt/google/chrome
 
 # For compilation
-DEPOT_TOOLS=/mnt/host/depot_tools
 BUILDTYPE="${BUILDTYPE:-Release}"
 BOARD="${BOARD:-${SYSROOT##/build/}}"
 # [Mod] GN output dir is named as "out_icu_${BOARD}".
@@ -84,9 +84,16 @@
 # [Mod] chrome/icu depends on nothing. Blocking the canonical icu package can
 # let us notice the potential repetitions.
 # [Mod] Old Chrome ebuilds installed icudtl.dat.
+# Add `xkbcommon` related libraries to make xkbcommon handling identical with
+# chromeos-chrome. This will make it more likely to catch potential xkbcommon
+# related chromeos-icu.ebuild failures by testing chromeos-chrome.ebuild.
 RDEPEND="
 	!dev-libs/icu
 	!<chromeos-base/chromeos-chrome-83.0.4098.4
+	xkbcommon? (
+		x11-libs/libxkbcommon
+		x11-misc/xkeyboard-config
+	)
 "
 DEPEND="
 	net-print/cups
@@ -102,6 +109,7 @@
 	#          unnecessary feature
 	#       3. Set "is_cfi=false".
 	BUILD_ARGS=(
+		"is_chromeos_device=true"
 		"icu_disable_thin_archive=true"
 
 		# is_official_build sometimes implies extra optimizations (e.g. it will allow
@@ -122,6 +130,10 @@
 		"enable_nacl=false"
 		"enable_nacl=false"
 		"icu_use_data_file=true"
+		# Add this to make xkbcommon handling identical with chromeos-chrome.
+		# This will make it more likely to catch potential xkbcommon related
+		# chromeos-icu.ebuild failures by testing chromeos-chrome.ebuild
+		"use_xkbcommon=$(usetf xkbcommon)"
 		# use_system_minigbm is set below.
 		# HarfBuzz and FreeType need to be built together in a specific way
 		# to get FreeType autohinting to work properly. Chromium bundles
@@ -144,9 +156,7 @@
 		"clang_use_chrome_plugins=false"
 		"is_cfi=false"
 		"use_cfi_cast=false"
-
-		# Disable some unnecessary dependencies to avoid some trybot failure.
-		"use_xkbcommon=false"
+		"use_cras=false"
 	)
 
 	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
@@ -159,17 +169,6 @@
 		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
 	)
 
-	# Disable tcmalloc on ARMv6 since it fails to build (crbug.com/181385)
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
 	# [Mod] Ozone platform configrations are removed.
 
 	# Set proper build args for the arch
@@ -283,10 +282,7 @@
 }
 
 decide_chrome_origin() {
-	# [Mod] change "chromeos-chrome-9999" to "chrome-icu-9999".
-	local chrome_workon="=chromeos-base/chrome-icu-9999"
-	local cros_workon_file="${SYSROOT}/etc/portage/package.keywords/cros-workon"
-	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
+	if [[ "${PV}" == "9999" ]]; then
 		# LOCAL_SOURCE is the default for cros_workon
 		# Warn the user if CHROME_ORIGIN is already set
 		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
@@ -318,14 +314,6 @@
 src_unpack() {
 	tc-export CC CXX
 	local WHOAMI=$(whoami)
-	export EGCLIENT="${EGCLIENT:-${DEPOT_TOOLS}/gclient}"
-	export ENINJA="${ENINJA:-${DEPOT_TOOLS}/ninja}"
-
-	# Prevents gclient from updating self.
-	export DEPOT_TOOLS_UPDATE=0
-
-	# Prevent gclient metrics collection.
-	export DEPOT_TOOLS_METRICS=0
 
 	CHROME_SRC="chrome-src"
 	if use chrome_internal; then
@@ -401,12 +389,6 @@
 
 	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
 
-	export EGN="${EGN:-${CHROME_ROOT}/src/buildtools/linux64/gn}"
-	einfo "Using GN from ${EGN}"
-
-	# [Mod] License file is required for installation.
-	cp "${CHROME_ROOT}/src/third_party/icu/LICENSE" "${WORKDIR}"
-
 	# [Mod] Use flags internal_gles_conform, afdo_use, afdo_verify,
 	# orderfile_verify and orderfile_use are all disabled.
 	BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
@@ -565,7 +547,6 @@
 	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
 	# useflag when chrome build switches to Ninja inside the chroot.
 	if use runhooks; then
-		[[ -f "${EGCLIENT}" ]] || die "EGCLIENT at '${EGCLIENT}' does not exist"
 		local cmd=( "${EGCLIENT}" runhooks --force )
 		echo "${cmd[@]}"
 		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
@@ -606,9 +587,13 @@
 	done
 	export GN_ARGS="${BUILD_ARGS[*]}"
 	einfo "GN_ARGS = ${GN_ARGS}"
-
-	${EGN} gen "${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}" \
-		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src" || die
+	local gn=(
+		"${CHROME_ROOT}/src/buildtools/linux64/gn" gen
+		"${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}"
+		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src"
+	)
+	echo "${gn[@]}"
+	"${gn[@]}" || die
 
 	# [Mod] setup_test_lists and clang_tidy are removed.
 }
diff --git a/chromeos-base/chromeos-accelerometer-init/chromeos-accelerometer-init-0.0.1-r22.ebuild b/chromeos-base/chromeos-accelerometer-init/chromeos-accelerometer-init-0.0.1-r23.ebuild
similarity index 100%
rename from chromeos-base/chromeos-accelerometer-init/chromeos-accelerometer-init-0.0.1-r22.ebuild
rename to chromeos-base/chromeos-accelerometer-init/chromeos-accelerometer-init-0.0.1-r23.ebuild
diff --git a/chromeos-base/chromeos-accelerometer-init/files/udev/99-cros-ec-accel.rules b/chromeos-base/chromeos-accelerometer-init/files/udev/99-cros-ec-accel.rules
index 916488a..12f5732 100644
--- a/chromeos-base/chromeos-accelerometer-init/files/udev/99-cros-ec-accel.rules
+++ b/chromeos-base/chromeos-accelerometer-init/files/udev/99-cros-ec-accel.rules
@@ -1,4 +1,7 @@
 ACTION=="add", ATTR{name}=="cros-ec-accel*", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=accel"
 ACTION=="add", ATTR{name}=="cros-ec-gyro", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=anglvel"
 ACTION=="add", ATTR{name}=="cros-ec-light", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=illuminance"
+ACTION=="add", ATTR{name}=="cros-ec-sync", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=count"
+ACTION=="add", ATTR{name}=="cros-ec-mag", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=magn"
+ACTION=="add", ATTR{name}=="cros-ec-baro", RUN+="/usr/sbin/mems_setup --device_id=%n --sensor_kind=baro"
 ACTION!="remove", ATTR{name}=="cros-ec-accel*", SYMLINK+="cros-ec-accel/%n", MODE="640", GROUP="chronos"
diff --git a/chromeos-base/chromeos-base/chromeos-base-0-r158.ebuild b/chromeos-base/chromeos-base/chromeos-base-0-r158.ebuild
deleted file mode 120000
index a3e55e062..0000000
--- a/chromeos-base/chromeos-base/chromeos-base-0-r158.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-chromeos-base-0.ebuild
\ No newline at end of file
diff --git a/chromeos-base/chromeos-base/chromeos-base-0.ebuild b/chromeos-base/chromeos-base/chromeos-base-0.ebuild
deleted file mode 100644
index 2812bde..0000000
--- a/chromeos-base/chromeos-base/chromeos-base-0.ebuild
+++ /dev/null
@@ -1,204 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-inherit user udev
-
-DESCRIPTION="ChromeOS specific system setup"
-HOMEPAGE="http://src.chromium.org/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="ac_only chromeless_tty cros_embedded cros_host pam vtconsole"
-
-# We need to make sure timezone-data is merged before us.
-# See pkg_setup below as well as http://crosbug.com/27413
-# and friends.
-# Similarly, we have to make sure bash is merged before us.
-# We don't need dash because only bash modifies ROOT duing
-# pkg_* stages, and depending on dash would disable a little
-# bit of possible parallelism.
-# See http://crosbug.com/38597 for more details.
-DEPEND=">=sys-apps/baselayout-2
-	!<sys-apps/baselayout-2.0.1-r227
-	!<sys-libs/timezone-data-2011d
-	!<=app-admin/sudo-1.8.2
-	!<sys-apps/mawk-1.3.4
-	!<app-shells/bash-4.1
-	!<app-shells/dash-0.5.5
-	!<net-misc/openssh-5.2_p1-r8
-	app-shells/bash
-	!cros_host? (
-		!pam? (
-			!app-admin/sudo
-		)
-		!app-misc/editor-wrapper
-		cros_embedded? (
-			app-shells/dash
-		)
-		sys-libs/timezone-data
-	)"
-RDEPEND="${DEPEND}"
-
-S="${WORKDIR}"
-
-# The user that all user-facing processes will run as.
-SHARED_USER_NAME="chronos"
-
-# Adds a "daemon"-type user/group pair.
-add_daemon_user() {
-       local username="$1"
-       local uid="$2"
-       enewuser "${username}" "${uid}"
-       enewgroup "${username}" "${uid}"
-}
-
-pkg_setup() {
-	if ! use cros_host ; then
-		# The sys-libs/timezone-data package installs a default /etc/localtime
-		# file automatically, so scrub that if it's a regular file.
-		local etc_tz="${ROOT}etc/localtime"
-		[[ -L ${etc_tz} ]] || rm -f "${etc_tz}"
-	fi
-
-	# Standard system users/groups. Allow them to get default IDs.
-	add_daemon_user "root"
-	add_daemon_user "bin"
-	add_daemon_user "daemon"
-	enewgroup "sys"
-	add_daemon_user "adm"
-	enewgroup "tty"
-	enewgroup "disk"
-	add_daemon_user "lp"
-	enewgroup "mem"
-	enewgroup "kmem"
-	enewgroup "wheel"
-	enewgroup "floppy"
-	add_daemon_user "news"
-	add_daemon_user "uucp"
-	enewgroup "console"
-	enewgroup "audio"
-	enewgroup "cdrom"
-	enewgroup "tape"
-	enewgroup "video"
-	enewgroup "cdrw"
-	enewgroup "usb"
-	enewgroup "users"
-	add_daemon_user "portage"
-	enewgroup "utmp"
-	enewgroup "nogroup"
-	add_daemon_user "nobody"
-	enewgroup "uinput"
-}
-
-pkg_preinst() {
-	# Create users and groups that are used by system daemons at runtime.
-	# Users and groups that are also needed at build time should be
-	# created in pkg_setup instead.
-	add_daemon_user "input"      # For /dev/input/event access
-	enewgroup "i2c"              # For I2C device node access.
-	enewgroup "hidraw"           # For hidraw device node access.
-	enewgroup "drm_dp_aux"       # For drm_dp_aux device node access.
-	enewgroup "password-viewers" # For access to the user's password
-	enewgroup "serial"           # For owning access to serial devices.
-	enewgroup "tun"              # For access to /dev/net/tun.
-
-	# The user that all user-facing processes will run as.
-	local system_user="${SHARED_USER_NAME}"
-	local system_id="1000"
-	local system_home="/home/${system_user}/user"
-	# Add a chronos-access group to provide non-chronos users,
-	# mostly system daemons running as a non-chronos user, group permissions
-	# to access files/directories owned by chronos.
-	local system_access_user="chronos-access"
-	local system_access_id="1001"
-
-	enewgroup "${system_user}" "${system_id}"
-	add_daemon_user "${system_user}"
-	add_daemon_user "${system_access_user}" "${system_access_id}"
-
-	# Some default directories. These are created here rather than at
-	# install because some of them may already exist and have mounts.
-	local x
-	for x in /dev /home /media /run /mnt/empty \
-		/mnt/stateful_partition /proc /root /sys /var/lock; do
-		[[ -d "${ROOT}/${x}" ]] && continue
-		install -d --mode=0755 --owner=root --group=root "${ROOT}/${x}"
-	done
-}
-
-src_install() {
-	insinto /etc
-	doins "${FILESDIR}"/issue
-
-	insinto /etc/sysctl.d
-	doins "${FILESDIR}"/00-sysctl.conf
-
-	if use ac_only ; then
-		doins "${FILESDIR}"/10-ac-only.conf
-	fi
-
-	insinto /etc/profile.d
-	doins "${FILESDIR}"/xauthority.sh
-
-	insinto /etc/avahi
-	doins "${FILESDIR}"/avahi-daemon.conf
-
-	# 01editor is currently using /usr/bin/vi, which is available on both
-	# cros_host and DUT. Please update this when default editor is changed.
-	insinto /etc/env.d
-	doins "${FILESDIR}/01editor"
-
-	# target-specific fun
-	if ! use cros_host ; then
-		dodir /bin /usr/bin
-
-		# Install all the udev rules.
-		udev_dorules "${FILESDIR}"/udev-rules/*.rules
-		use vtconsole && udev_dorules "${FILESDIR}"/60-X-tty1-tty2-group-rw.rules
-
-		# Symlink /etc/localtime to something on the stateful
-		# partition. At runtime, the system will take care of
-		# initializing the path in /var.
-		dosym /var/lib/timezone/localtime /etc/localtime
-		# We use mawk in the target boards, not gawk.
-		dosym mawk /usr/bin/awk
-
-		# We want dash as our main shell.
-		dosym dash /bin/sh
-
-		# Avoid the wrapper and just link to the only editor we have.
-		dodir /usr/libexec
-		dosym /usr/bin/$(usex cros_embedded vi vim) /usr/libexec/editor
-		dosym /bin/more /usr/libexec/pager
-
-		# Install our custom ssh config settings.
-		insinto /etc/ssh
-		doins "${FILESDIR}"/ssh{,d}_config
-		fperms 600 /etc/ssh/sshd_config
-
-		if ! use pam ; then
-			dobin "${FILESDIR}"/sudo
-			sed -i -e '/^UsePAM/d' "${D}"/etc/ssh/sshd_config || die
-		fi
-
-		# Custom login shell snippets.
-		insinto /etc/profile.d
-		doins "${FILESDIR}"/cursor.sh
-
-		# Custom kernel module configuration.
-		insinto /etc/modprobe.d
-		doins "${FILESDIR}"/modprobe.d/*.conf
-	fi
-
-	# Some daemons and utilities access the mounts through /etc/mtab.
-	dosym /proc/mounts /etc/mtab
-
-	insinto /etc/sudoers.d
-	echo "${SHARED_USER_NAME} ALL=(ALL) ALL" > 95_cros_base
-	insopts -m 440
-	doins 95_cros_base
-}
diff --git a/chromeos-base/chromeos-base/chromeos-base-1-r1.ebuild b/chromeos-base/chromeos-base/chromeos-base-1-r1.ebuild
new file mode 100644
index 0000000..878f515
--- /dev/null
+++ b/chromeos-base/chromeos-base/chromeos-base-1-r1.ebuild
@@ -0,0 +1,208 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon user udev
+
+DESCRIPTION="ChromeOS specific system setup"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="ac_only chromeless_tty cros_embedded cros_host pam vtconsole"
+
+# We need to make sure timezone-data is merged before us.
+# See pkg_setup below as well as http://crosbug.com/27413
+# and friends.
+# Similarly, we have to make sure bash is merged before us.
+# We don't need dash because only bash modifies ROOT duing
+# pkg_* stages, and depending on dash would disable a little
+# bit of possible parallelism.
+# See https://crbug.com/220728 for more details.
+DEPEND=">=sys-apps/baselayout-2
+	!<sys-apps/baselayout-2.0.1-r227
+	!<sys-libs/timezone-data-2011d
+	!<=app-admin/sudo-1.8.2
+	!<sys-apps/mawk-1.3.4
+	!<app-shells/bash-4.1
+	!<app-shells/dash-0.5.5
+	!<net-misc/openssh-5.2_p1-r8
+	app-shells/bash
+	!cros_host? (
+		!pam? (
+			!app-admin/sudo
+		)
+		!app-misc/editor-wrapper
+		cros_embedded? (
+			app-shells/dash
+		)
+		sys-libs/timezone-data
+	)"
+RDEPEND="${DEPEND}"
+
+# The user that all user-facing processes will run as.
+SHARED_USER_NAME="chronos"
+
+# Adds a "daemon"-type user/group pair.
+add_daemon_user() {
+	local username="$1"
+	local uid="$2"
+	enewuser "${username}" "${uid}"
+	enewgroup "${username}" "${uid}"
+}
+
+pkg_setup() {
+	if ! use cros_host ; then
+		# The sys-libs/timezone-data package installs a default /etc/localtime
+		# file automatically, so scrub that if it's a regular file.
+		local etc_tz="${ROOT}etc/localtime"
+		[[ -L ${etc_tz} ]] || rm -f "${etc_tz}"
+	fi
+
+	# Standard system users/groups. Allow them to get default IDs.
+	add_daemon_user "root"
+	add_daemon_user "bin"
+	add_daemon_user "daemon"
+	enewgroup "sys"
+	add_daemon_user "adm"
+	enewgroup "tty"
+	enewgroup "disk"
+	add_daemon_user "lp"
+	enewgroup "mem"
+	enewgroup "kmem"
+	enewgroup "wheel"
+	enewgroup "floppy"
+	add_daemon_user "news"
+	add_daemon_user "uucp"
+	enewgroup "console"
+	enewgroup "audio"
+	enewgroup "cdrom"
+	enewgroup "tape"
+	enewgroup "video"
+	enewgroup "cdrw"
+	enewgroup "usb"
+	enewgroup "users"
+	add_daemon_user "portage"
+	enewgroup "utmp"
+	enewgroup "nogroup"
+	add_daemon_user "nobody"
+	enewgroup "uinput"
+}
+
+pkg_preinst() {
+	# Create users and groups that are used by system daemons at runtime.
+	# Users and groups that are also needed at build time should be
+	# created in pkg_setup instead.
+	add_daemon_user "input"      # For /dev/input/event access
+	enewgroup "i2c"              # For I2C device node access.
+	enewgroup "hidraw"           # For hidraw device node access.
+	enewgroup "drm_dp_aux"       # For drm_dp_aux device node access.
+	enewgroup "password-viewers" # For access to the user's password
+	enewgroup "serial"           # For owning access to serial devices.
+	enewgroup "tun"              # For access to /dev/net/tun.
+
+	# The user that all user-facing processes will run as.
+	local system_user="${SHARED_USER_NAME}"
+	local system_id="1000"
+	local system_home="/home/${system_user}/user"
+	# Add a chronos-access group to provide non-chronos users,
+	# mostly system daemons running as a non-chronos user, group permissions
+	# to access files/directories owned by chronos.
+	local system_access_user="chronos-access"
+	local system_access_id="1001"
+
+	enewgroup "${system_user}" "${system_id}"
+	add_daemon_user "${system_user}"
+	add_daemon_user "${system_access_user}" "${system_access_id}"
+
+	# Some default directories. These are created here rather than at
+	# install because some of them may already exist and have mounts.
+	local x
+	for x in /dev /home /media /run /mnt/empty \
+		/mnt/stateful_partition /proc /root /sys /var/lock; do
+		[[ -d "${ROOT}/${x}" ]] && continue
+		install -d --mode=0755 --owner=root --group=root "${ROOT}/${x}"
+	done
+}
+
+src_install() {
+	insinto /etc
+	doins "${FILESDIR}"/issue
+
+	insinto /etc/sysctl.d
+	doins "${FILESDIR}"/00-sysctl.conf
+
+	if use ac_only ; then
+		doins "${FILESDIR}"/10-ac-only.conf
+	fi
+
+	insinto /etc/profile.d
+	doins "${FILESDIR}"/xauthority.sh
+
+	insinto /etc/avahi
+	doins "${FILESDIR}"/avahi-daemon.conf
+
+	# 01editor is currently using /usr/bin/vi, which is available on both
+	# cros_host and DUT. Please update this when default editor is changed.
+	insinto /etc/env.d
+	doins "${FILESDIR}/01editor"
+
+	# target-specific fun
+	if ! use cros_host ; then
+		dodir /bin /usr/bin
+
+		# Install all the udev rules.
+		udev_dorules "${FILESDIR}"/udev-rules/*.rules
+		use vtconsole && udev_dorules "${FILESDIR}"/60-X-tty1-tty2-group-rw.rules
+
+		# Symlink /etc/localtime to something on the stateful
+		# partition. At runtime, the system will take care of
+		# initializing the path in /var.
+		dosym /var/lib/timezone/localtime /etc/localtime
+		# We use mawk in the target boards, not gawk.
+		dosym mawk /usr/bin/awk
+
+		# We want dash as our main shell.
+		dosym dash /bin/sh
+
+		# Avoid the wrapper and just link to the only editor we have.
+		dodir /usr/libexec
+		dosym /usr/bin/$(usex cros_embedded vi vim) /usr/libexec/editor
+		dosym /bin/more /usr/libexec/pager
+
+		# Install our custom ssh config settings.
+		insinto /etc/ssh
+		doins "${FILESDIR}"/ssh{,d}_config
+		fperms 600 /etc/ssh/sshd_config
+
+		if ! use pam ; then
+			dobin "${FILESDIR}"/sudo
+			sed -i -e '/^UsePAM/d' "${D}"/etc/ssh/sshd_config || die
+		fi
+
+		# Custom login shell snippets.
+		insinto /etc/profile.d
+		doins "${FILESDIR}"/cursor.sh
+
+		# Custom kernel module configuration.
+		insinto /etc/modprobe.d
+		doins "${FILESDIR}"/modprobe.d/*.conf
+	fi
+
+	# Some daemons and utilities access the mounts through /etc/mtab.
+	dosym /proc/mounts /etc/mtab
+
+	insinto /etc/sudoers.d
+	echo "${SHARED_USER_NAME} ALL=(ALL) ALL" > 95_cros_base
+	insopts -m 440
+	doins 95_cros_base
+}
diff --git a/chromeos-base/chromeos-base/chromeos-base-9999.ebuild b/chromeos-base/chromeos-base/chromeos-base-9999.ebuild
new file mode 100644
index 0000000..346d8f9
--- /dev/null
+++ b/chromeos-base/chromeos-base/chromeos-base-9999.ebuild
@@ -0,0 +1,206 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon user udev
+
+DESCRIPTION="ChromeOS specific system setup"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="~*"
+IUSE="ac_only chromeless_tty cros_embedded cros_host pam vtconsole"
+
+# We need to make sure timezone-data is merged before us.
+# See pkg_setup below as well as http://crosbug.com/27413
+# and friends.
+# Similarly, we have to make sure bash is merged before us.
+# We don't need dash because only bash modifies ROOT duing
+# pkg_* stages, and depending on dash would disable a little
+# bit of possible parallelism.
+# See https://crbug.com/220728 for more details.
+DEPEND=">=sys-apps/baselayout-2
+	!<sys-apps/baselayout-2.0.1-r227
+	!<sys-libs/timezone-data-2011d
+	!<=app-admin/sudo-1.8.2
+	!<sys-apps/mawk-1.3.4
+	!<app-shells/bash-4.1
+	!<app-shells/dash-0.5.5
+	!<net-misc/openssh-5.2_p1-r8
+	app-shells/bash
+	!cros_host? (
+		!pam? (
+			!app-admin/sudo
+		)
+		!app-misc/editor-wrapper
+		cros_embedded? (
+			app-shells/dash
+		)
+		sys-libs/timezone-data
+	)"
+RDEPEND="${DEPEND}"
+
+# The user that all user-facing processes will run as.
+SHARED_USER_NAME="chronos"
+
+# Adds a "daemon"-type user/group pair.
+add_daemon_user() {
+	local username="$1"
+	local uid="$2"
+	enewuser "${username}" "${uid}"
+	enewgroup "${username}" "${uid}"
+}
+
+pkg_setup() {
+	if ! use cros_host ; then
+		# The sys-libs/timezone-data package installs a default /etc/localtime
+		# file automatically, so scrub that if it's a regular file.
+		local etc_tz="${ROOT}etc/localtime"
+		[[ -L ${etc_tz} ]] || rm -f "${etc_tz}"
+	fi
+
+	# Standard system users/groups. Allow them to get default IDs.
+	add_daemon_user "root"
+	add_daemon_user "bin"
+	add_daemon_user "daemon"
+	enewgroup "sys"
+	add_daemon_user "adm"
+	enewgroup "tty"
+	enewgroup "disk"
+	add_daemon_user "lp"
+	enewgroup "mem"
+	enewgroup "kmem"
+	enewgroup "wheel"
+	enewgroup "floppy"
+	add_daemon_user "news"
+	add_daemon_user "uucp"
+	enewgroup "console"
+	enewgroup "audio"
+	enewgroup "cdrom"
+	enewgroup "tape"
+	enewgroup "video"
+	enewgroup "cdrw"
+	enewgroup "usb"
+	enewgroup "users"
+	add_daemon_user "portage"
+	enewgroup "utmp"
+	enewgroup "nogroup"
+	add_daemon_user "nobody"
+	enewgroup "uinput"
+}
+
+pkg_preinst() {
+	# Create users and groups that are used by system daemons at runtime.
+	# Users and groups that are also needed at build time should be
+	# created in pkg_setup instead.
+	add_daemon_user "input"      # For /dev/input/event access
+	enewgroup "i2c"              # For I2C device node access.
+	enewgroup "hidraw"           # For hidraw device node access.
+	enewgroup "drm_dp_aux"       # For drm_dp_aux device node access.
+	enewgroup "password-viewers" # For access to the user's password
+	enewgroup "serial"           # For owning access to serial devices.
+	enewgroup "tun"              # For access to /dev/net/tun.
+
+	# The user that all user-facing processes will run as.
+	local system_user="${SHARED_USER_NAME}"
+	local system_id="1000"
+	local system_home="/home/${system_user}/user"
+	# Add a chronos-access group to provide non-chronos users,
+	# mostly system daemons running as a non-chronos user, group permissions
+	# to access files/directories owned by chronos.
+	local system_access_user="chronos-access"
+	local system_access_id="1001"
+
+	enewgroup "${system_user}" "${system_id}"
+	add_daemon_user "${system_user}"
+	add_daemon_user "${system_access_user}" "${system_access_id}"
+
+	# Some default directories. These are created here rather than at
+	# install because some of them may already exist and have mounts.
+	local x
+	for x in /dev /home /media /run /mnt/empty \
+		/mnt/stateful_partition /proc /root /sys /var/lock; do
+		[[ -d "${ROOT}/${x}" ]] && continue
+		install -d --mode=0755 --owner=root --group=root "${ROOT}/${x}"
+	done
+}
+
+src_install() {
+	insinto /etc
+	doins "${FILESDIR}"/issue
+
+	insinto /etc/sysctl.d
+	doins "${FILESDIR}"/00-sysctl.conf
+
+	if use ac_only ; then
+		doins "${FILESDIR}"/10-ac-only.conf
+	fi
+
+	insinto /etc/profile.d
+	doins "${FILESDIR}"/xauthority.sh
+
+	insinto /etc/avahi
+	doins "${FILESDIR}"/avahi-daemon.conf
+
+	# 01editor is currently using /usr/bin/vi, which is available on both
+	# cros_host and DUT. Please update this when default editor is changed.
+	insinto /etc/env.d
+	doins "${FILESDIR}/01editor"
+
+	# target-specific fun
+	if ! use cros_host ; then
+		dodir /bin /usr/bin
+
+		# Install all the udev rules.
+		udev_dorules "${FILESDIR}"/udev-rules/*.rules
+		use vtconsole && udev_dorules "${FILESDIR}"/60-X-tty1-tty2-group-rw.rules
+
+		# Symlink /etc/localtime to something on the stateful
+		# partition. At runtime, the system will take care of
+		# initializing the path in /var.
+		dosym /var/lib/timezone/localtime /etc/localtime
+		# We use mawk in the target boards, not gawk.
+		dosym mawk /usr/bin/awk
+
+		# We want dash as our main shell.
+		dosym dash /bin/sh
+
+		# Avoid the wrapper and just link to the only editor we have.
+		dodir /usr/libexec
+		dosym /usr/bin/$(usex cros_embedded vi vim) /usr/libexec/editor
+		dosym /bin/more /usr/libexec/pager
+
+		# Install our custom ssh config settings.
+		insinto /etc/ssh
+		doins "${FILESDIR}"/ssh{,d}_config
+		fperms 600 /etc/ssh/sshd_config
+
+		if ! use pam ; then
+			dobin "${FILESDIR}"/sudo
+			sed -i -e '/^UsePAM/d' "${D}"/etc/ssh/sshd_config || die
+		fi
+
+		# Custom login shell snippets.
+		insinto /etc/profile.d
+		doins "${FILESDIR}"/cursor.sh
+
+		# Custom kernel module configuration.
+		insinto /etc/modprobe.d
+		doins "${FILESDIR}"/modprobe.d/*.conf
+	fi
+
+	# Some daemons and utilities access the mounts through /etc/mtab.
+	dosym /proc/mounts /etc/mtab
+
+	insinto /etc/sudoers.d
+	echo "${SHARED_USER_NAME} ALL=(ALL) ALL" > 95_cros_base
+	insopts -m 440
+	doins 95_cros_base
+}
diff --git a/chromeos-base/chromeos-base/files/00-sysctl.conf b/chromeos-base/chromeos-base/files/00-sysctl.conf
index 27f9d6c..c2ae378 100644
--- a/chromeos-base/chromeos-base/files/00-sysctl.conf
+++ b/chromeos-base/chromeos-base/files/00-sysctl.conf
@@ -72,6 +72,13 @@
 # Set watchdog_thresh
 kernel.watchdog_thresh = 5
 
+# We don't want to burn through power by boosting all RT tasks to
+# the highest possible cpufreq like upstream does by default.  If
+# we need to boost a task then we'll boost it.
+#
+# Only present on newer kernels (backported to Chrome OS 5.4).
+kernel.sched_util_clamp_min_rt_default = 0
+
 # When the kernel panics, automatically reboot to preserve dump in ram
 # Reboot on oops as well
 # The values below are the correct ones, but we don't set these here
@@ -109,9 +116,20 @@
 # Enable crash reporting for setuid programs too.
 fs.suid_dumpable = 2
 
-# Limit realtime processes to 800ms of each 1 second.
-kernel.sched_rt_period_us = 1000000
-kernel.sched_rt_runtime_us = 800000
+# These values are (currently) the ones we're using, but we won't set
+# them here because they're already set elsewhere, specifically in
+# the file "/etc/init/rt-limits.conf".  We'll leave them setup in
+# the init script since that script is also setting up cgroups and
+# the values in the cgroups and sysctl need to match.  Leaving this
+# comment here because someone might come here looking for how this
+# sysctl value is being set and this will hopefully send them to
+# the right place.
+#
+# kernel.sched_rt_period_us = 1000000
+# kernel.sched_rt_runtime_us = 850000
 
 # For 3.16 and later, make sysctl writes more robust.
 kernel.sysctl_writes_strict = 1
+
+# Prevent queue overflow of rsyslogd (crbug.com/1090580).
+net.unix.max_dgram_qlen = 512
diff --git a/chromeos-base/chromeos-base/files/chromeos-version.sh b/chromeos-base/chromeos-base/files/chromeos-version.sh
new file mode 100755
index 0000000..174159d
--- /dev/null
+++ b/chromeos-base/chromeos-base/files/chromeos-version.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This echo statement sets the package base version (without its -r value).
+# If it is necessary to add a new blocker or version dependency on this ebuild
+# at the same time as revving the ebuild to a known version value, editing this
+# version can be useful.
+echo "1"
diff --git a/chromeos-base/chromeos-base/files/issue b/chromeos-base/chromeos-base/files/issue
index 7485701..b540402 100644
--- a/chromeos-base/chromeos-base/files/issue
+++ b/chromeos-base/chromeos-base/files/issue
@@ -4,7 +4,7 @@
 
   [ Ctrl ] and [ Alt ] and [ <- ]  (F1)
 
-To use this console, the developer mode switch must be engaged.
+To use this console, developer mode must be enabled.
 Doing so will destroy any saved data on the system.
 
 In developer mode, it is possible to
diff --git a/chromeos-base/chromeos-base/files/modprobe.d/rtw88.conf b/chromeos-base/chromeos-base/files/modprobe.d/rtw88.conf
index 0f9af1b..d8d9c87 100644
--- a/chromeos-base/chromeos-base/files/modprobe.d/rtw88.conf
+++ b/chromeos-base/chromeos-base/files/modprobe.d/rtw88.conf
@@ -2,3 +2,6 @@
 # Upstream Linux doesn't currently make an opinionated decision about how
 # aggressively to save power on WiFi modules.
 options rtw88 lps_deep_mode=1
+# rtw88 renamed to rtw88_core in Linux v5.8 and https://crrev.com/c/2355776
+# TODO(briannorris): remove rtw88 options when we phase it out.
+options rtw88_core lps_deep_mode=1
diff --git a/chromeos-base/chromeos-base/files/udev-rules/99-powerd-sx9310.rules b/chromeos-base/chromeos-base/files/udev-rules/99-powerd-sx9310.rules
new file mode 100644
index 0000000..909d5f7
--- /dev/null
+++ b/chromeos-base/chromeos-base/files/udev-rules/99-powerd-sx9310.rules
@@ -0,0 +1,5 @@
+ACTION=="add", SUBSYSTEM=="iio", ATTR{name}=="sx9310|sx9311", \
+ATTR{label}=="proximity-*" \
+  SYMLINK+="%s{label}" \
+  GROUP="power", \
+  ATTR{events/in_proximity1_thresh_either_en}="1"
diff --git a/chromeos-base/chromeos-chrome/chromeos-chrome-86.0.4194.0_rc-r1.ebuild b/chromeos-base/chromeos-chrome/chromeos-chrome-86.0.4194.0_rc-r1.ebuild
deleted file mode 100644
index 5d686d8..0000000
--- a/chromeos-base/chromeos-chrome/chromeos-chrome-86.0.4194.0_rc-r1.ebuild
+++ /dev/null
@@ -1,1407 +0,0 @@
-# Copyright 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Usage: by default, downloads chromium browser from the build server.
-# If CHROME_ORIGIN is set to one of {SERVER_SOURCE, LOCAL_SOURCE, LOCAL_BINARY},
-# the build comes from the chromimum source repository (gclient sync),
-# build server, locally provided source, or locally provided binary.
-# If you are using SERVER_SOURCE, a gclient template file that is in the files
-# directory which will be copied automatically during the build and used as
-# the .gclient for 'gclient sync'.
-# If building from LOCAL_SOURCE or LOCAL_BINARY specifying BUILDTYPE
-# will allow you to specify "Debug" or another build type; "Release" is
-# the default.
-# gclient is expected to be in ~/depot_tools if EGCLIENT is not set
-# to gclient path.
-
-EAPI=7
-
-# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
-PYTHON_COMPAT=( python2_7 )
-inherit autotest-deponly binutils-funcs cros-credentials cros-constants cros-sanitizers eutils flag-o-matic git-2 multilib toolchain-funcs user python-any-r1
-
-DESCRIPTION="Open-source version of Google Chrome web browser"
-HOMEPAGE="http://www.chromium.org/"
-SRC_URI=""
-
-LICENSE="BSD-Google chrome_internal? ( Google-TOS )"
-SLOT="0"
-KEYWORDS="*"
-IUSE="
-	+afdo_use
-	afdo_verify
-	+accessibility
-	app_shell
-	asan
-	+authpolicy
-	+build_tests
-	+chrome_debug
-	+cfi
-	chrome_debug_tests
-	chrome_internal
-	chrome_media
-	+chrome_remoting
-	clang_tidy
-	component_build
-	+debug_fission
-	+fonts
-	goma
-	+goma_thinlto
-	+highdpi
-	internal_gles_conform
-	+libcxx
-	mojo
-	msan
-	+nacl
-	neon
-	on_device_assistant
-	oobe_config
-	opengl
-	opengles
-	orderfile_generate
-	+orderfile_use
-	orderfile_verify
-	+runhooks
-	strict_toolchain_checks
-	+thinlto
-	touchview
-	tpm_fallback
-	ubsan
-	v4l2_codec
-	v4lplugin
-	vaapi
-	verbose
-	vtable_verify
-	xkbcommon
-	"
-REQUIRED_USE="
-	cfi? ( thinlto )
-	afdo_verify? ( !afdo_use )
-	orderfile_generate? ( !orderfile_use )
-	"
-
-OZONE_PLATFORM_PREFIX=ozone_platform_
-OZONE_PLATFORMS=(gbm cast test egltest caca)
-IUSE_OZONE_PLATFORMS="${OZONE_PLATFORMS[@]/#/${OZONE_PLATFORM_PREFIX}}"
-IUSE+=" ${IUSE_OZONE_PLATFORMS}"
-OZONE_PLATFORM_DEFAULT_PREFIX=ozone_platform_default_
-IUSE_OZONE_PLATFORM_DEFAULTS="${OZONE_PLATFORMS[@]/#/${OZONE_PLATFORM_DEFAULT_PREFIX}}"
-IUSE+=" ${IUSE_OZONE_PLATFORM_DEFAULTS}"
-REQUIRED_USE+=" ^^ ( ${IUSE_OZONE_PLATFORM_DEFAULTS} )"
-
-# The gclient hooks that run in src_prepare hit the network.
-# https://crbug.com/731905
-RESTRICT="network-sandbox mirror"
-
-# Do not strip the nacl_helper_bootstrap binary because the binutils
-# objcopy/strip mangles the ELF program headers.
-# TODO(mcgrathr,vapier): This should be removed after portage's prepstrip
-# script is changed to use eu-strip instead of objcopy and strip.
-STRIP_MASK+=" */nacl_helper_bootstrap"
-
-# Portage version without optional portage suffix.
-CHROME_VERSION="${PV/_*/}"
-
-# chrome destination directory
-CHROME_DIR=/opt/google/chrome
-D_CHROME_DIR="${D}/${CHROME_DIR}"
-
-# For compilation/local chrome
-DEPOT_TOOLS=/mnt/host/depot_tools
-BUILDTYPE="${BUILDTYPE:-Release}"
-BOARD="${BOARD:-${SYSROOT##/build/}}"
-BUILD_OUT="${BUILD_OUT:-out_${BOARD}}"
-# WARNING: We are using a symlink now for the build directory to work around
-# command line length limits. This will cause problems if you are doing
-# parallel builds of different boards/variants.
-# Unsetting BUILD_OUT_SYM will revert this behavior
-BUILD_OUT_SYM="c"
-
-UNVETTED_ORDERFILE_LOCATION=${AFDO_GS_DIRECTORY:-"gs://chromeos-prebuilt/afdo-job/orderfiles/unvetted"}
-
-# The following entry will be modified automatically for verifying orderfile or AFDO profile.
-UNVETTED_ORDERFILE=""
-UNVETTED_AFDO_FILE=""
-
-add_orderfiles() {
-	# For verify orderfile, only for a toolchain special build.
-	if [[ -n ${UNVETTED_ORDERFILE} ]]; then
-		SRC_URI+=" orderfile_verify? ( ${UNVETTED_ORDERFILE_LOCATION}/${UNVETTED_ORDERFILE}.xz )"
-	fi
-}
-
-add_orderfiles
-
-RDEPEND="${RDEPEND}
-	app-arch/bzip2
-	app-crypt/mit-krb5
-	app-misc/edid-decode
-	authpolicy? ( chromeos-base/authpolicy )
-	~chromeos-base/chrome-icu-${PV}
-	chromeos-base/gestures
-	chromeos-base/libevdev
-	fonts? ( chromeos-base/chromeos-fonts )
-	chrome_internal? ( chromeos-base/quickoffice )
-	dev-libs/nspr
-	>=dev-libs/nss-3.12.2
-	>=media-libs/alsa-lib-1.0.19
-	media-libs/fontconfig
-	media-libs/libsync
-	x11-libs/libdrm
-	ozone_platform_gbm? ( media-libs/minigbm )
-	v4lplugin? ( media-libs/libv4lplugins )
-	>=media-sound/adhd-0.0.1-r310
-	net-print/cups
-	opengl? ( virtual/opengl )
-	opengles? ( virtual/opengles )
-	sys-apps/dbus
-	sys-apps/pciutils
-	virtual/udev
-	sys-libs/libcap
-	chrome_remoting? ( sys-libs/pam )
-	vaapi? ( x11-libs/libva )
-	xkbcommon? (
-		x11-libs/libxkbcommon
-		x11-misc/xkeyboard-config
-	)
-	accessibility? (
-		app-accessibility/brltty
-		app-accessibility/espeak-ng
-		app-accessibility/googletts
-	)
-	libcxx? (
-		sys-libs/libcxxabi
-		sys-libs/libcxx
-	)
-	oobe_config? ( chromeos-base/oobe_config )
-	"
-
-DEPEND="${DEPEND}
-	${RDEPEND}
-	chromeos-base/protofiles
-	>=dev-util/gperf-3.0.3
-	>=dev-util/pkgconfig-0.23
-	arm? ( x11-libs/libdrm )
-"
-
-PATCHES=()
-
-AUTOTEST_COMMON="src/chrome/test/chromeos/autotest/files"
-AUTOTEST_DEPS="${AUTOTEST_COMMON}/client/deps"
-AUTOTEST_DEPS_LIST="chrome_test telemetry_dep"
-
-IUSE="${IUSE} +autotest"
-
-
-QA_TEXTRELS="*"
-QA_EXECSTACK="*"
-QA_PRESTRIPPED="*"
-
-use_nacl() {
-	# 32bit asan conflicts with nacl: crosbug.com/38980
-	! (use asan && [[ ${ARCH} == "x86" ]]) && \
-	! use component_build && use nacl
-}
-
-# Like the `usex` helper:
-# Usage: echox [int] [echo-if-true] [echo-if-false]
-# If [int] is 0, then echo the 2nd arg (default of yes), else
-# echo the 3rd arg (default of no).
-echox() {
-	# Like the `usex` helper.
-	[[ ${1:-$?} -eq 0 ]] && echo "${2:-yes}" || echo "${3:-no}"
-}
-echotf() { echox ${1:-$?} true false ; }
-usetf()  { usex $1 true false ; }
-
-use_goma() {
-	[[ "${USE_GOMA:-$(usetf goma)}" == "true" ]]
-}
-should_upload_build_logs() {
-	[[ -n "${GOMA_TMP_DIR}" && -n "${GLOG_log_dir}" && \
-		"${GLOG_log_dir}" == "${GOMA_TMP_DIR}"* ]]
-}
-
-set_build_args() {
-	# use goma_thinlto says that if we are using Goma and ThinLTO, use
-	# Goma for distributed code generation. So only set the corresponding
-	# gn arg to true if all three conditions are met.
-	use_goma_thin_lto=$(use goma_thinlto && use_goma && use thinlto; echotf)
-	BUILD_ARGS=(
-		"is_chromeos_device=true"
-		# is_official_build sometimes implies extra optimizations (e.g. it will allow
-		# ThinLTO to optimize more aggressively, if ThinLTO is enabled). Please note
-		# that, despite the name, it should be usable by external users.
-		#
-		# Sanitizers don't like official builds.
-		"is_official_build=$(use_sanitizers false true)"
-
-		"is_debug=false"
-		"${EXTRA_GN_ARGS}"
-		"use_v4l2_codec=$(usetf v4l2_codec)"
-		"use_v4lplugin=$(usetf v4lplugin)"
-		"use_vaapi=$(usetf vaapi)"
-		"use_xkbcommon=$(usetf xkbcommon)"
-		"enable_remoting=$(usetf chrome_remoting)"
-		"enable_nacl=$(use_nacl; echotf)"
-		# use_system_minigbm is set below.
-
-		# Clang features.
-		"is_asan=$(usetf asan)"
-		"is_msan=$(usetf msan)"
-		"is_ubsan=$(usetf ubsan)"
-		"is_clang=true"
-		"use_thin_lto=$(usetf thinlto)"
-		"use_goma_thin_lto=${use_goma_thin_lto}"
-		"is_cfi=$(usetf cfi)"
-
-		"enable_cros_on_device_assistant=$(usetf on_device_assistant)"
-
-		# Assistant integration tests are only run on the Chromium bots,
-		# but they increase the size of libassistant.so by 1.3MB so we
-		# disable them here.
-		"enable_assistant_integration_tests=false"
-	)
-
-	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
-	# add them to BUILD_ARGS at the end.
-	BUILD_STRING_ARGS=(
-		"target_sysroot=${SYSROOT}"
-		"system_libdir=$(get_libdir)"
-		"pkg_config=$(tc-getPKG_CONFIG)"
-		"target_os=chromeos"
-		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
-	)
-	use internal_gles_conform && BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
-
-	# Disable tcmalloc on ARMv6 since it fails to build (crbug.com/181385)
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
-	# Ozone platforms.
-	local platform
-	for platform in ${OZONE_PLATFORMS[@]}; do
-		local flag="${OZONE_PLATFORM_DEFAULT_PREFIX}${platform}"
-		if use "${flag}"; then
-			BUILD_STRING_ARGS+=( "ozone_platform=${platform}" )
-		fi
-	done
-	BUILD_ARGS+=(
-		"ozone_auto_platforms=false"
-	)
-	for platform in ${IUSE_OZONE_PLATFORMS}; do
-		if use "${platform}"; then
-			BUILD_ARGS+=( "${platform}=true" )
-		fi
-	done
-	if use "ozone_platform_gbm"; then
-		BUILD_ARGS+=( "use_system_minigbm=true" )
-		BUILD_ARGS+=( "use_system_libdrm=true" )
-	fi
-	if use "touchview"; then
-		BUILD_ARGS+=( "subpixel_font_rendering_disabled=true" )
-	fi
-
-	# Set proper build args for the arch
-	case "${ARCH}" in
-	x86)
-		BUILD_STRING_ARGS+=( "target_cpu=x86" )
-		;;
-	arm)
-		BUILD_ARGS+=(
-			"arm_use_neon=$(usetf neon)"
-			# To workaround the 4GB debug limit. crbug.com/792999.
-			"blink_symbol_level=1"
-		)
-		BUILD_STRING_ARGS+=(
-			"target_cpu=arm"
-			"arm_float_abi=hard"
-		)
-		local arm_arch=$(get-flag march)
-		if [[ -n "${arm_arch}" ]]; then
-			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
-		fi
-		;;
-	arm64)
-		BUILD_STRING_ARGS+=(
-			"target_cpu=arm64"
-		)
-		local arm_arch=$(get-flag march)
-		if [[ -n "${arm_arch}" ]]; then
-			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
-		fi
-		;;
-	amd64)
-		BUILD_STRING_ARGS+=( "target_cpu=x64" )
-		;;
-	mips)
-		local mips_arch target_arch
-
-		mips_arch="$($(tc-getCPP) ${CFLAGS} ${CPPFLAGS} -E -P - <<<_MIPS_ARCH)"
-		# Strip away any enclosing quotes.
-		mips_arch="${mips_arch//\"}"
-		# TODO(benchan): Use tc-endian from toolchain-func to determine endianess
-		# when Chrome later cares about big-endian.
-		case "${mips_arch}" in
-		mips64*)
-			target_arch=mips64el
-			;;
-		*)
-			target_arch=mipsel
-			;;
-		esac
-
-		BUILD_STRING_ARGS+=(
-			"target_cpu=${target_arch}"
-			"mips_arch_variant=${mips_arch}"
-		)
-		;;
-	*)
-		die "Unsupported architecture: ${ARCH}"
-		;;
-	esac
-
-	if use chrome_internal; then
-		# Adding chrome branding specific variables.
-		BUILD_ARGS+=( "is_chrome_branded=true" )
-		# This test can only be build from internal sources.
-		BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
-		export CHROMIUM_BUILD='_google_Chrome'
-		export OFFICIAL_BUILD='1'
-		export CHROME_BUILD_TYPE='_official'
-	elif use chrome_media; then
-		echo "Building Chromium with additional media codecs and containers."
-		BUILD_ARGS+=( "proprietary_codecs=true" )
-		BUILD_STRING_ARGS+=( "ffmpeg_branding=ChromeOS" )
-	fi
-
-	if use component_build; then
-		BUILD_ARGS+=( "is_component_build=true" )
-	fi
-	if use_goma; then
-		BUILD_ARGS+=( "use_goma=true" )
-		BUILD_STRING_ARGS+=( "goma_dir=${GOMA_DIR:-/home/${WHOAMI}/goma}" )
-
-		# Goma compiler proxy runs outside of portage build.
-		# Practically, because TMPDIR is set in portage, it is
-		# different from the directory used when the compiler proxy
-		# started.
-		# If GOMA_TMP_DIR is not set, the compiler proxy uses
-		# TMPDIR/goma_${WHOAMI} for its tmpdir as fallback, which
-		# causes unexpected behavior.
-		# Specifically, named socket used to communicate with compiler
-		# proxy is ${GOMA_TMP_DIR}/goma.ipc by default, so the compiler
-		# proxy cannot be reached.
-		# Thus, here set GOMA_TMP_DIR to /tmp/goma_${WHOAMI} if it is
-		# not yet set.
-		if [[ -z "${GOMA_TMP_DIR}" ]]; then
-			export GOMA_TMP_DIR="/tmp/goma_${WHOAMI}"
-		fi
-	fi
-
-	if use chrome_debug; then
-		# Use debug fission to avoid 4GB limit of ELF32 (see crbug.com/595763).
-		# Using -g1 causes problems with crash server (see crbug.com/601854).
-		# Set use_debug_fission=true to prevent slow link (see crbug.com/703468).
-		# Disable debug_fission for bots which generate Afdo profile. (see crbug.com/704602).
-		BUILD_ARGS+=(
-			"use_debug_fission=$(usetf debug_fission)"
-			"symbol_level=2"
-		)
-		if use debug_fission; then
-			# The breakpad cannot handle the debug files generated by
-			# llvm and debug fission properly. crosbug.com/710605
-			append-flags -fno-split-dwarf-inlining
-		fi
-	fi
-
-	# With ThinLTO, the linking landscape is very different than regular
-	# linking. Some links (e.g., Chrome) can be very heavy and require
-	# 40GB+ of RAM. Since we don't use ThinLTO's cache (crbug.com/964328),
-	# heavy links are always going to be heavy, so it's faster to give them
-	# ${ncpu} each and only have 1 happening at once.
-	if use thinlto; then
-		local thinlto_link_job_count
-
-		if thinlto_link_job_count="$(grep -c ^processor /proc/cpuinfo)"; then
-			BUILD_ARGS+=(
-				"max_jobs_per_link=${thinlto_link_job_count}"
-				"concurrent_links=1"
-			)
-		fi
-
-	fi
-
-	if use tpm_fallback; then
-		BUILD_ARGS+=( "tpm_fallback=true" )
-	fi
-}
-
-unpack_chrome() {
-	# Add depot_tools to PATH, local chroot builds fail otherwise.
-	export PATH=${PATH}:${DEPOT_TOOLS}
-
-	local cmd=( "${CHROMITE_BIN_DIR}"/sync_chrome )
-	use chrome_internal && cmd+=( --internal )
-	if [[ "${CHROME_VERSION}" != "9999" ]]; then
-		cmd+=( "--tag=${CHROME_VERSION}" )
-	fi
-	# --reset tells sync_chrome to blow away local changes and to feel
-	# free to delete any directories that get in the way of syncing. This
-	# is needed for unattended operation.
-	cmd+=( --reset "--gclient=${EGCLIENT}" "${CHROME_DISTDIR}" )
-	elog "${cmd[*]}"
-	"${cmd[@]}" || die
-}
-
-decide_chrome_origin() {
-	local chrome_workon="=chromeos-base/chromeos-chrome-9999"
-	local cros_workon_file="${SYSROOT}/etc/portage/package.keywords/cros-workon"
-	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
-		# LOCAL_SOURCE is the default for cros_workon
-		# Warn the user if CHROME_ORIGIN is already set
-		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
-			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
-			ewarn "This will prevent you from building from your local checkout."
-			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
-			ewarn "to the default source location."
-		fi
-		: ${CHROME_ORIGIN:=LOCAL_SOURCE}
-	else
-		# By default, pull from server
-		: ${CHROME_ORIGIN:=SERVER_SOURCE}
-	fi
-}
-
-sandboxless_ensure_directory() {
-	local dir
-	for dir in "$@"; do
-		if [[ ! -d "${dir}" ]] ; then
-			# We need root access to create these directories, so we need to
-			# use sudo. This implicitly disables the sandbox.
-			sudo mkdir -p "${dir}" || die
-			sudo chown "${PORTAGE_USERNAME}:portage" "${dir}" || die
-			sudo chmod 0755 "${dir}" || die
-		fi
-	done
-}
-
-src_unpack() {
-	echo
-	ewarn "If you want to develop or hack on the browser itself, you should follow the"
-	ewarn "simple chrome workflow instead of using emerge:"
-	ewarn "https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md"
-	echo
-
-	tc-export CC CXX
-	local WHOAMI=$(whoami)
-	export EGCLIENT="${EGCLIENT:-${DEPOT_TOOLS}/gclient}"
-	export ENINJA="${ENINJA:-${DEPOT_TOOLS}/ninja}"
-
-	# Prevents gclient from updating self.
-	export DEPOT_TOOLS_UPDATE=0
-
-	# Prevent gclient metrics collection.
-	export DEPOT_TOOLS_METRICS=0
-
-	CHROME_SRC="chrome-src"
-	if use chrome_internal; then
-		CHROME_SRC+="-internal"
-	fi
-
-	# CHROME_CACHE_DIR is used for storing output artifacts, and is always a
-	# regular directory inside the chroot (i.e. it's never mounted in, so it's
-	# always safe to use cp -al for these artifacts).
-	: "${CHROME_CACHE_DIR:="/var/cache/chromeos-chrome/${CHROME_SRC}"}"
-	addwrite "${CHROME_CACHE_DIR}"
-
-	# CHROME_DISTDIR is used for storing the source code, if any source code
-	# needs to be unpacked at build time (e.g. in the SERVER_SOURCE scenario.)
-	# It will be mounted into the chroot, so it is never safe to use cp -al
-	# for these files.
-	: "${CHROME_DISTDIR:="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/${CHROME_SRC}"}"
-	addwrite "${CHROME_DISTDIR}"
-
-	# Create storage directories.
-	sandboxless_ensure_directory "${CHROME_DISTDIR}" "${CHROME_CACHE_DIR}"
-
-	cros-credentials_setup
-
-	decide_chrome_origin
-
-	case "${CHROME_ORIGIN}" in
-	LOCAL_SOURCE|SERVER_SOURCE|LOCAL_BINARY)
-		elog "CHROME_ORIGIN VALUE is ${CHROME_ORIGIN}"
-		;;
-	*)
-		die "CHROME_ORIGIN not one of LOCAL_SOURCE, SERVER_SOURCE, LOCAL_BINARY"
-		;;
-	esac
-
-	# Prepare and set CHROME_ROOT based on CHROME_ORIGIN.
-	# CHROME_ROOT is the location where the source code is used for compilation.
-	# If we're in SERVER_SOURCE mode, CHROME_ROOT is CHROME_DISTDIR. In LOCAL_SOURCE
-	# mode, this directory may be set manually to any directory. It may be mounted
-	# into the chroot, so it is not safe to use cp -al for these files.
-	# These are set here because $(whoami) returns the proper user here,
-	# but 'root' at the root level of the file
-	case "${CHROME_ORIGIN}" in
-	(SERVER_SOURCE)
-		elog "Using CHROME_VERSION = ${CHROME_VERSION}"
-		if [[ ${WHOAMI} == "chrome-bot" ]]; then
-			# TODO: Should add a sanity check that the version checked out is
-			# what we actually want.  Not sure how to do that though.
-			elog "Skipping syncing as cbuildbot ran SyncChrome for us."
-		else
-			unpack_chrome
-		fi
-
-		elog "set the chrome source root to ${CHROME_DISTDIR}"
-		elog "From this point onwards there is no difference between \
-			SERVER_SOURCE and LOCAL_SOURCE, since the fetch is done"
-		CHROME_ROOT=${CHROME_DISTDIR}
-		;;
-	(LOCAL_SOURCE)
-		: ${CHROME_ROOT:=/home/${WHOAMI}/chrome_root}
-		if [[ ! -d "${CHROME_ROOT}/src" ]]; then
-			die "${CHROME_ROOT} does not contain a valid chromium checkout!"
-		fi
-		addwrite "${CHROME_ROOT}"
-		;;
-	esac
-
-	case "${CHROME_ORIGIN}" in
-	LOCAL_SOURCE|SERVER_SOURCE)
-		set_build_args
-		;;
-	esac
-
-	# FIXME: This is the normal path where ebuild stores its working data.
-	# Chrome builds inside distfiles because of speed, so we at least make
-	# a symlink here to add compatibility with autotest eclass which uses this.
-	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
-
-	export EGN="${EGN:-${CHROME_ROOT}/src/buildtools/linux64/gn}"
-	einfo "Using GN from ${EGN}"
-
-	if use internal_gles_conform; then
-		local CHROME_GLES2_CONFORM=${CHROME_ROOT}/src/third_party/gles2_conform
-		local CROS_GLES2_CONFORM=/home/${WHOAMI}/trunk/src/third_party/gles2_conform
-		if [[ ! -d "${CHROME_GLES2_CONFORM}" ]]; then
-			if [[ -d "${CROS_GLES2_CONFORM}" ]]; then
-				ln -s "${CROS_GLES2_CONFORM}" "${CHROME_GLES2_CONFORM}"
-				einfo "Using GLES2 conformance test suite from ${CROS_GLES2_CONFORM}"
-			else
-				die "Trying to build GLES2 conformance test suite without ${CHROME_GLES2_CONFORM} or ${CROS_GLES2_CONFORM}"
-			fi
-		fi
-	fi
-
-	if use afdo_use; then
-		# Use AFDO profile downloaded in Chromium source code
-		# If needed profiles other than "silvermont", please set the variable
-		# ${AFDO_PROFILE_SOURCE} accordingly.
-		local afdo_src="${AFDO_PROFILE_SOURCE:-silvermont}"
-		BUILD_ARGS+=( "clang_use_default_sample_profile=true" )
-		BUILD_STRING_ARGS+=( "chromeos_afdo_platform=${afdo_src}" )
-	fi
-
-	# Use to verify a local unvetted AFDO file.
-	if use afdo_verify; then
-		if [[ ! -e "${UNVETTED_AFDO_FILE}" ]]; then
-			die "Cannot find ${UNVETTED_AFDO_FILE} to build Chrome."
-		fi
-		BUILD_STRING_ARGS+=( "clang_sample_profile_path=${UNVETTED_AFDO_FILE}" )
-	fi
-
-	# Unpack unvetted orderfile.
-	if use orderfile_verify; then
-		local orderfile_dir="${WORKDIR}/orderfile"
-		mkdir "${orderfile_dir}"
-		local orderfile_file=${UNVETTED_ORDERFILE}
-		(cd "${orderfile_dir}" && unpack "${orderfile_file}.xz") || die
-
-		local orderfile_loc="${orderfile_dir}/${orderfile_file}"
-		einfo "Using ${orderfile_loc} as orderfile for ordering Chrome"
-
-		# Pass the path to orderfile to GN args.
-		BUILD_STRING_ARGS+=( "chrome_orderfile_path=${orderfile_loc}" )
-	fi
-
-	if ! use orderfile_use; then
-		# If not using orderfile, override the default orderfile path to empty.
-		BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
-	fi
-}
-
-add_api_keys() {
-	# awk script to extract the values out of the file.
-	local EXTRACT="{ gsub(/[',]/, \"\", \$2); print \$2 }"
-	local api_key=$(awk "/google_api_key/ ${EXTRACT}" "$1")
-	local client_id=$(awk "/google_default_client_id/ ${EXTRACT}" "$1")
-	local client_secret=$(awk "/google_default_client_secret/ ${EXTRACT}" "$1")
-
-	BUILD_STRING_ARGS+=(
-		"google_api_key=${api_key}"
-		"google_default_client_id=${client_id}"
-		"google_default_client_secret=${client_secret}"
-	)
-}
-
-src_prepare() {
-	# Must call eapply_user in EAPI 7, but this function is a no-op here.
-	eapply_user
-
-	if [[ "${CHROME_ORIGIN}" != "LOCAL_SOURCE" &&
-			"${CHROME_ORIGIN}" != "SERVER_SOURCE" ]]; then
-		return
-	fi
-
-	elog "${CHROME_ROOT} should be set here properly"
-	cd "${CHROME_ROOT}/src" || die "Cannot chdir to ${CHROME_ROOT}"
-
-	# We do symlink creation here if appropriate.
-	mkdir -p "${CHROME_CACHE_DIR}/src/${BUILD_OUT}"
-	if [[ ! -z "${BUILD_OUT_SYM}" ]]; then
-		rm -rf "${BUILD_OUT_SYM}" || die "Could not remove symlink"
-		ln -sfT "${CHROME_CACHE_DIR}/src/${BUILD_OUT}" "${BUILD_OUT_SYM}" ||
-			die "Could not create symlink for output directory"
-	fi
-
-
-	# Apply patches for non-localsource builds.
-	if [[ "${CHROME_ORIGIN}" == "SERVER_SOURCE" && ${#PATCHES[@]} -gt 0 ]]; then
-		epatch "${PATCHES[@]}"
-	fi
-
-	local WHOAMI=$(whoami)
-	# Get the credentials to fake home directory so that the version of chromium
-	# we build can access Google services. First, check for Chrome credentials.
-	if [[ ! -d google_apis/internal ]]; then
-		# Then look for Chrome OS supplied credentials.
-		local PRIVATE_OVERLAYS_DIR=/home/${WHOAMI}/trunk/src/private-overlays
-		local GAPI_CONFIG_FILE=${PRIVATE_OVERLAYS_DIR}/chromeos-overlay/googleapikeys
-		if [[ ! -f "${GAPI_CONFIG_FILE}" ]]; then
-			# Then developer credentials.
-			GAPI_CONFIG_FILE=/home/${WHOAMI}/.googleapikeys
-		fi
-		if [[ -f "${GAPI_CONFIG_FILE}" ]]; then
-			add_api_keys "${GAPI_CONFIG_FILE}"
-		fi
-	fi
-}
-
-setup_test_lists() {
-	TEST_FILES=(
-		capture_unittests
-		dawn_end2end_tests
-		dawn_unittests
-		gl_tests
-		jpeg_decode_accelerator_unittest
-		jpeg_encode_accelerator_unittest
-		ozone_gl_unittests
-		sandbox_linux_unittests
-		video_decode_accelerator_perf_tests
-		video_decode_accelerator_tests
-		video_encode_accelerator_unittest
-		wayland_client_perftests
-	)
-
-	TEST_FILES+=( ppapi/examples/video_decode )
-
-	if use vaapi; then
-		TEST_FILES+=( vaapi_unittest )
-	fi
-
-	# TODO(ihf): Figure out how to keep this in sync with telemetry.
-	TOOLS_TELEMETRY_BIN=(
-		bitmaptools
-		clear_system_cache
-		minidump_stackwalk
-	)
-
-	PPAPI_TEST_FILES=(
-		lib{32,64}
-		mock_nacl_gdb
-		ppapi_nacl_tests_{newlib,glibc}.nmf
-		ppapi_nacl_tests_{newlib,glibc}_{x32,x64,arm,arm64}.nexe
-		test_case.html
-		test_case.html.mock-http-headers
-		test_page.css
-		test_url_loader_data
-	)
-}
-
-# Handle all CFLAGS/CXXFLAGS/etc... munging here.
-setup_compile_flags() {
-	# Chrome controls its own optimization settings, so this would be a nop
-	# if we were to run it. Leave it here anyway as a grep-friendly marker.
-	# cros_optimize_package_for_speed
-
-	# The chrome makefiles specify -O and -g flags already, so remove the
-	# portage flags.
-	filter-flags -g -O*
-
-	# Remove unsupported arm64 linker flag on arm32 builds.
-	# https://crbug.com/889079
-	use arm && filter-flags "-Wl,--fix-cortex-a53-843419"
-
-	# There are some flags we want to only use in the ebuild.
-	# The rest will be exported to the simple chrome workflow.
-	EBUILD_CFLAGS=()
-	EBUILD_CXXFLAGS=()
-	EBUILD_LDFLAGS=()
-
-	# LLVM needs this when parsing profiles.
-	# See README on https://github.com/google/autofdo
-	# For ARM, we do not need this flag because we don't get profiles
-	# from ARM machines. And it triggers an llvm assertion when thinlto
-	# and debug fission is used together.
-	# See https://bugs.llvm.org/show_bug.cgi?id=37255
-	use arm || append-flags -fdebug-info-for-profiling
-
-	if use thinlto; then
-		# We need to change the default value of import-instr-limit in
-		# LLVM to limit the text size increase. The default value is
-		# 100, and we change it to 30 to reduce the text size increase
-		# from 25% to 10%. The performance number of page_cycler is the
-		# same on two of the thinLTO configurations, we got 1% slowdown
-		# on speedometer when changing import-instr-limit from 100 to 30.
-		# We need to further reduce it to 20 for arm to limit the size
-		# increase to 10%.
-		local thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=30"
-		if use arm; then
-			thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=20"
-			EBUILD_LDFLAGS+=( -gsplit-dwarf )
-		fi
-		EBUILD_LDFLAGS+=( ${thinlto_ldflag} )
-		# if using thinlto, we need to pass the equivalent of
-		# -fdebug-types-section to the backend, to prevent out-of-range
-		# relocations (see
-		# https://bugs.chromium.org/p/chromium/issues/detail?id=1032159).
-		append-ldflags -Wl,-mllvm
-		append-ldflags -Wl,-generate-type-units
-	else
-		# Non-ThinLTO builds with symbol_level=2 may have out-of-range
-		# relocations, too: crbug.com/1050819.
-		append-flags -fdebug-types-section
-	fi
-
-	if use orderfile_generate; then
-		local chrome_outdir="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
-		BUILD_STRING_ARGS+=( "dump_call_chain_clustering_order=${chrome_outdir}/chrome.orderfile.txt" )
-	fi
-
-	# Turn off call graph profile sort (C3), when new pass manager is enabled.
-	# Only allow it when we want to generate orderfile.
-	# This is a temporary option and will need to be removed once orderfile is on.
-	if ! use orderfile_generate; then
-		EBUILD_LDFLAGS+=( "-Wl,--no-call-graph-profile-sort" )
-	fi
-
-	# Enable std::vector []-operator bounds checking.
-	append-cxxflags -D__google_stl_debug_vector=1
-
-	# Chrome and Chrome OS versions of the compiler may not be in
-	# sync. So, don't complain if Chrome uses a diagnostic
-	# option that is not yet implemented in the compiler version used
-	# by Chrome OS.
-	# Turns out this is only really supported by Clang. See crosbug.com/615466
-	# Add "-faddrsig" flag required to efficiently support "--icf=all".
-	append-flags -faddrsig
-	append-flags -Wno-unknown-warning-option
-	export CXXFLAGS_host+=" -Wno-unknown-warning-option"
-	export CFLAGS_host+=" -Wno-unknown-warning-option"
-	if use libcxx; then
-		append-cxxflags "-stdlib=libc++"
-		append-ldflags "-stdlib=libc++"
-	fi
-
-	# Workaround: Disable fatal linker warnings on arm64/lld.
-	# https://crbug.com/913071
-	use arm64 && append-ldflags "-Wl,--no-fatal-warnings"
-	use vtable_verify && append-ldflags -fvtable-verify=preinit
-
-	local flags
-	einfo "Building with the compiler settings:"
-	for flags in {C,CXX,CPP,LD}FLAGS; do
-		einfo "  ${flags} = ${!flags}"
-	done
-}
-
-src_configure() {
-	tc-export CXX CC AR AS NM RANLIB STRIP
-	export CC_host=$(tc-getBUILD_CC)
-	export CXX_host=$(tc-getBUILD_CXX)
-	export NM_host=$(tc-getBUILD_NM)
-	export READELF="llvm-readelf"
-	export READELF_host="llvm-readelf"
-
-	# Use C++ compiler as the linker driver.
-	export LD="${CXX}"
-	export LD_host=${CXX_host}
-
-	# We need below change when USE="thinlto" is set. We set this globally
-	# so that users can turn on the "use_thin_lto" in the simplechrome
-	# flow more easily.
-	# use nm from llvm, https://crbug.com/917193
-	export NM="llvm-nm"
-	export NM_host="llvm-nm"
-	export AR="llvm-ar"
-	# USE=thinlto affects host build, we need to set host AR to
-	# llvm-ar to make sure host package builds with thinlto.
-	# crbug.com/731335
-	export AR_host="llvm-ar"
-	export RANLIB="llvm-ranlib"
-
-	# Set binutils path for goma.
-	CC_host+=" -B$(get_binutils_path "${LD_host}")"
-	CXX_host+=" -B$(get_binutils_path "${LD_host}")"
-
-	setup_compile_flags
-
-	# We might set BOTO_CONFIG in the builder environment in case the
-	# existing file needs modifications (e.g. for working with older
-	# branches). So don't overwrite it if it's already set.
-	# See https://crbug.com/847676 for details.
-	export BOTO_CONFIG="${BOTO_CONFIG:-/home/$(whoami)/.boto}"
-	export PATH=${PATH}:${DEPOT_TOOLS}
-
-	export DEPOT_TOOLS_GSUTIL_BIN_DIR="${CHROME_CACHE_DIR}/gsutil_bin"
-	# The venv logic seems to misbehave when cross-compiling.  Since our SDK
-	# should include all the necessary modules, just disable it (for now).
-	# https://crbug.com/808434
-	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"
-
-	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
-	# useflag when chrome build switches to Ninja inside the chroot.
-	if use runhooks; then
-		[[ -f "${EGCLIENT}" ]] || die "EGCLIENT at '${EGCLIENT}' does not exist"
-		local cmd=( "${EGCLIENT}" runhooks --force )
-		echo "${cmd[@]}"
-		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
-		CXXFLAGS="${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}" \
-		LDFLAGS="${LDFLAGS} ${EBUILD_LDFLAGS[*]}" \
-		"${cmd[@]}" || die
-	fi
-
-	BUILD_STRING_ARGS+=(
-		"cros_target_ar=${AR}"
-		"cros_target_cc=${CC}"
-		"cros_target_cxx=${CXX}"
-		"host_toolchain=//build/toolchain/cros:host"
-		"custom_toolchain=//build/toolchain/cros:target"
-		"v8_snapshot_toolchain=//build/toolchain/cros:v8_snapshot"
-		"cros_target_ld=${LD}"
-		"cros_target_nm=${NM}"
-		"cros_target_readelf=${READELF}"
-		"cros_target_extra_cflags=${CFLAGS} ${EBUILD_CFLAGS[*]}"
-		"cros_target_extra_cppflags=${CPPFLAGS}"
-		"cros_target_extra_cxxflags=${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}"
-		"cros_target_extra_ldflags=${LDFLAGS} ${EBUILD_LDFLAGS[*]}"
-		"cros_host_cc=${CC_host}"
-		"cros_host_cxx=${CXX_host}"
-		"cros_host_ar=${AR_host}"
-		"cros_host_ld=${LD_host}"
-		"cros_host_nm=${NM_host}"
-		"cros_host_readelf=${READELF_host}"
-		"cros_host_extra_cflags=${CFLAGS_host}"
-		"cros_host_extra_cxxflags=${CXXFLAGS_host}"
-		"cros_host_extra_cppflags=${CPPFLAGS_host}"
-		"cros_host_extra_ldflags=${LDFLAGS_host}"
-		"cros_v8_snapshot_cc=${CC_host}"
-		"cros_v8_snapshot_cxx=${CXX_host}"
-		"cros_v8_snapshot_ar=${AR_host}"
-		"cros_v8_snapshot_ld=${LD_host}"
-		"cros_v8_snapshot_nm=${NM_host}"
-		"cros_v8_snapshot_readelf=${READELF_host}"
-		"cros_v8_snapshot_extra_cflags=${CFLAGS_host}"
-		"cros_v8_snapshot_extra_cxxflags=${CXXFLAGS_host}"
-		"cros_v8_snapshot_extra_cppflags=${CPPFLAGS_host}"
-		"cros_v8_snapshot_extra_ldflags=${LDFLAGS_host}"
-	)
-
-	local arg
-	for arg in "${BUILD_STRING_ARGS[@]}"; do
-		BUILD_ARGS+=("${arg%%=*}=\"${arg#*=}\"")
-	done
-	export GN_ARGS="${BUILD_ARGS[*]}"
-	einfo "GN_ARGS = ${GN_ARGS}"
-	${EGN} gen "${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}" \
-		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src" || die
-
-	setup_test_lists
-
-	if use clang_tidy; then
-		export WITH_TIDY=1
-	fi
-}
-
-chrome_make() {
-	local build_dir="${BUILD_OUT_SYM}/${BUILDTYPE}"
-
-	# If ThinLTO is enabled, we may have a cache from a previous link. Due
-	# to fears about lack of reproducibility, we don't allow cache reuse
-	# across rebuilds. The cache is still useful for artifacts shared
-	# between multiple links done by this build (e.g. tests).
-	use thinlto && rm -rf "${build_dir}/thinlto-cache"
-
-	# If goma is enabled, increase the number of parallel run to
-	# 10 * {number of processors}. Though, if it is too large the
-	# performance gets slow down, so limit by 200 heuristically.
-	if use_goma; then
-		local num_parallel=$(($(nproc) * 10))
-		local j_limit=200
-		set -- -j $((num_parallel < j_limit ? num_parallel : j_limit)) "$@"
-	fi
-	local command=(
-		${ENINJA}
-		${MAKEOPTS}
-		-C "${build_dir}"
-		$(usex verbose -v "")
-		"$@"
-	)
-	# If goma is used, log the command, cwd and env vars, which will be
-	# uploaded to the logging server.
-	if should_upload_build_logs; then
-		env --null > "${GLOG_log_dir}/ninja_env"
-		pwd > "${GLOG_log_dir}/ninja_cwd"
-		echo "${command[@]}" > "${GLOG_log_dir}/ninja_command"
-	fi
-	PATH=${PATH}:${DEPOT_TOOLS} "${command[@]}"
-	local ret=$?
-	if should_upload_build_logs; then
-		echo "${ret}" > "${GLOG_log_dir}/ninja_exit"
-		cp -p "${BUILD_OUT_SYM}/${BUILDTYPE}/.ninja_log" "${GLOG_log_dir}/ninja_log"
-	fi
-	[[ "${ret}" -eq 0 ]] || die
-
-	# Still use a script to check if the orderfile is used properly, i.e.
-	# Builtin_ functions are placed between the markers, etc.
-	if use strict_toolchain_checks && (use orderfile_use || use orderfile_verify); then
-		"${FILESDIR}/check_orderfile.py" "${build_dir}/chrome" || die
-	fi
-}
-
-src_compile() {
-	if [[ "${CHROME_ORIGIN}" != "LOCAL_SOURCE" &&
-			"${CHROME_ORIGIN}" != "SERVER_SOURCE" ]]; then
-		return
-	fi
-
-	cd "${CHROME_ROOT}"/src || die "Cannot chdir to ${CHROME_ROOT}/src"
-
-	local chrome_targets=( $(usex mojo "mojo_shell" "") )
-	if use app_shell; then
-		chrome_targets+=( app_shell )
-	else
-		chrome_targets+=( chrome )
-	fi
-	if use build_tests; then
-		chrome_targets+=(
-			"${TEST_FILES[@]}"
-			"${TOOLS_TELEMETRY_BIN[@]}"
-			chromedriver
-		)
-		if use chrome_internal; then
-			chrome_targets+=( libassistant_debug.so )
-		fi
-	fi
-	use_nacl && chrome_targets+=( nacl_helper_bootstrap nacl_helper )
-
-	chrome_make "${chrome_targets[@]}"
-
-	if use build_tests; then
-		install_chrome_test_resources "${WORKDIR}/test_src"
-		install_telemetry_dep_resources "${WORKDIR}/telemetry_src"
-
-		# NOTE: Since chrome is built inside distfiles, we have to get
-		# rid of the previous instance first.
-		# We remove only what we will overwrite with the mv below.
-		local deps="${WORKDIR}/${P}/${AUTOTEST_DEPS}"
-
-		rm -rf "${deps}/chrome_test/test_src"
-		mv "${WORKDIR}/test_src" "${deps}/chrome_test/"
-
-		rm -rf "${deps}/telemetry_dep/test_src"
-		mv "${WORKDIR}/telemetry_src" "${deps}/telemetry_dep/test_src"
-
-		# The autotest eclass wants this for some reason.
-		get_paths() { :; }
-
-		# HACK: It would make more sense to call autotest_src_prepare in
-		# src_prepare, but we need to call install_chrome_test_resources first.
-		autotest-deponly_src_prepare
-
-		# Remove .git dirs
-		find "${AUTOTEST_WORKDIR}" -type d -name .git -prune -exec rm -rf {} +
-
-		autotest_src_compile
-	fi
-}
-
-install_test_resources() {
-	# Install test resources from chrome source directory to destination.
-	# We keep a cache of test resources inside the chroot to avoid copying
-	# multiple times.
-	local test_dir="${1}"
-	einfo "install_test_resources to ${test_dir}"
-	shift
-
-	# To speed things up, we write the list of files to a temporary file so
-	# we can use rsync with --files-from.
-	local tmp_list_file="${T}/${test_dir##*/}.files"
-	printf "%s\n" "$@" > "${tmp_list_file}"
-
-	# Copy the specific files to the cache from the source directory.
-	# Note: we need to specify -r when using --files-from and -a to get a
-	# recursive copy.
-	# TODO(ihf): Make failures here fatal.
-	rsync -r -a --delete --exclude=.git --exclude="*.pyc" \
-		--files-from="${tmp_list_file}" "${CHROME_ROOT}/src/" \
-		"${CHROME_CACHE_DIR}/src/"
-
-	# Create hard links in the destination based on the cache.
-	# Note: we need to specify -r when using --files-from and -a to get a
-	# recursive copy.
-	# TODO(ihf): Make failures here fatal.
-	rsync -r -a --link-dest="${CHROME_CACHE_DIR}/src" \
-		--files-from="${tmp_list_file}" "${CHROME_CACHE_DIR}/src/" "${test_dir}/"
-}
-
-test_strip_install() {
-	local from="${1}"
-	local dest="${2}"
-	shift 2
-	mkdir -p "${dest}"
-	local f
-	for f in "$@"; do
-		$(tc-getSTRIP) --strip-debug \
-			"${from}"/${f} -o "${dest}/$(basename ${f})"
-	done
-}
-
-install_chrome_test_resources() {
-	# NOTE: This is a duplicate from src_install, because it's required here.
-	local from="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
-	local test_dir="${1}"
-	local dest="${test_dir}/out/Release"
-
-	echo Copying Chrome tests into "${test_dir}"
-
-	# Even if chrome_debug_tests is enabled, we don't need to include detailed
-	# debug info for tests in the binary package, so save some time by stripping
-	# everything but the symbol names. Developers who need more detailed debug
-	# info on the tests can use the original unstripped tests from the ${from}
-	# directory.
-	TEST_INSTALL_TARGETS=(
-		"${TEST_FILES[@]}"
-		"libppapi_tests.so" )
-
-	einfo "Installing test targets: ${TEST_INSTALL_TARGETS[@]}"
-	test_strip_install "${from}" "${dest}" "${TEST_INSTALL_TARGETS[@]}"
-
-	# Copy Chrome test data.
-	mkdir -p "${dest}"/test_data
-	# WARNING: Only copy subdirectories of |test_data|.
-	# The full |test_data| directory is huge and kills our VMs.
-	# Example:
-	# cp -al "${from}"/test_data/<subdir> "${test_dir}"/out/Release/<subdir>
-
-	# Add the fake bidi locale.
-	mkdir -p "${dest}"/pseudo_locales
-	cp -al "${from}"/pseudo_locales/fake-bidi.pak \
-		"${dest}"/pseudo_locales
-
-	for f in "${PPAPI_TEST_FILES[@]}"; do
-		cp -al "${from}/${f}" "${dest}"
-	done
-
-	# Install Chrome test resources.
-	# WARNING: Only install subdirectories of |chrome/test|.
-	# The full |chrome/test| directory is huge and kills our VMs.
-	install_test_resources "${test_dir}" \
-		base/base_paths_posix.cc \
-		chrome/test/data/chromeos \
-		chrome/test/functional \
-		chrome/third_party/mock4js/mock4js.js  \
-		content/common/gpu/testdata \
-		media/test/data \
-		content/test/data \
-		net/data/ssl/certificates \
-		ppapi/tests/test_case.html \
-		ppapi/tests/test_url_loader_data \
-		third_party/bidichecker/bidichecker_packaged.js \
-		third_party/accessibility-developer-tools/gen/axs_testing.js
-
-	# Add the pdf test data if needed.
-	if use chrome_internal; then
-		install_test_resources "${test_dir}" pdf/test
-	fi
-	# Add the gles_conform test data if needed.
-	if use chrome_internal || use internal_gles_conform; then
-		install_test_resources "${test_dir}" gpu/gles2_conform_support/gles2_conform_test_expectations.txt
-	fi
-
-	cp -a "${CHROME_ROOT}"/"${AUTOTEST_DEPS}"/chrome_test/setup_test_links.sh \
-		"${dest}"
-}
-
-install_telemetry_dep_resources() {
-	local test_dir="${1}"
-
-	TELEMETRY=${CHROME_ROOT}/src/third_party/catapult/telemetry
-	if [[ -r "${TELEMETRY}" ]]; then
-		echo "Copying Telemetry Framework into ${test_dir}"
-		mkdir -p "${test_dir}"
-		# We are going to call chromium code but can't trust that it is clean
-		# of precompiled code. See crbug.com/590762.
-		find "${TELEMETRY}" -name "*.pyc" -type f -delete
-		# Get deps from Chrome.
-		FIND_DEPS=${CHROME_ROOT}/src/tools/perf/find_dependencies
-		PERF_DEPS=${CHROME_ROOT}/src/tools/perf/bootstrap_deps
-		CROS_DEPS=${CHROME_ROOT}/src/tools/cros/bootstrap_deps
-		# sed removes the leading path including src/ converting it to relative.
-		# To avoid silent failures assert the success.
-		DEPS_LIST=$(python ${FIND_DEPS} ${PERF_DEPS} ${CROS_DEPS} | \
-			sed -e 's|^'${CHROME_ROOT}/src/'||'; assert)
-		install_test_resources "${test_dir}" "${DEPS_LIST}"
-		# For crosperf, which uses some tests only available on internal builds.
-		if use chrome_internal; then
-			install_test_resources "${test_dir}" \
-				data/page_cycler/morejs \
-				data/page_cycler/moz
-		fi
-	fi
-
-	local from="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
-	local dest="${test_dir}/src/out/${BUILDTYPE}"
-	einfo "Installing telemetry binaries: ${TOOLS_TELEMETRY_BIN[@]}"
-	test_strip_install "${from}" "${dest}" "${TOOLS_TELEMETRY_BIN[@]}"
-
-	# When copying only a portion of the Chrome source that telemetry needs,
-	# some symlinks can end up broken. Thus clean these up before packaging.
-	find -L "${test_dir}" -type l -delete
-}
-
-# Add any new artifacts generated by the Chrome build targets to deploy_chrome.py.
-# We deal with miscellaneous artifacts here in the ebuild.
-src_install() {
-	FROM="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
-
-	# Override default strip flags and lose the '-R .comment'
-	# in order to play nice with the crash server.
-	if [[ -z "${KEEP_CHROME_DEBUG_SYMBOLS}" ]]; then
-		export PORTAGE_STRIP_FLAGS=""
-	else
-		export PORTAGE_STRIP_FLAGS="--strip-debug"
-	fi
-	einfo "PORTAGE_STRIP_FLAGS=${PORTAGE_STRIP_FLAGS}"
-	LS=$(ls -alhS ${FROM})
-	einfo "CHROME_DIR after build\n${LS}"
-
-	# Copy a D-Bus config file that includes other configs that are installed to
-	# /opt/google/chrome/dbus by deploy_chrome.
-	insinto /etc/dbus-1/system.d
-	doins "${FILESDIR}"/chrome.conf
-
-	# Copy Quickoffice resources for official build.
-	# Quickoffice is not yet available for arm64, https://crbug.com/881489
-	if use chrome_internal && [[ "${ARCH}" != "arm64" ]]; then
-		local qo_install_root="/usr/share/chromeos-assets/quickoffice"
-		insinto "${qo_install_root}"
-		QUICKOFFICE="${CHROME_ROOT}"/src/chrome/browser/resources/chromeos/quickoffice
-		doins -r "${QUICKOFFICE}"/_locales
-		doins -r "${QUICKOFFICE}"/css
-		doins -r "${QUICKOFFICE}"/img
-		doins -r "${QUICKOFFICE}"/plugin
-		doins -r "${QUICKOFFICE}"/scripts
-		doins -r "${QUICKOFFICE}"/views
-
-		local qo_path=""
-		case "${ARCH}" in
-		arm)
-			qo_path="${QUICKOFFICE}"/_platform_specific/arm
-			;;
-		amd64)
-			qo_path="${QUICKOFFICE}"/_platform_specific/x86_64
-			;;
-		*)
-			die "Unsupported architecture: ${ARCH}"
-			;;
-		esac
-
-		# Compress the platform-specific NaCl binaries with squashfs to
-		# save space on the rootfs.
-		# - compress with LZO and 1M blocks to optimize trade-off
-		# between compression ratio and decompression speed.
-		# - use "-keep-as-directory" option so the squash file will
-		# include the folder with the name of the CPU architecture,
-		# which is expected by the scripts on device.
-		# - use "-root-mode 0755" to ensure that the mountpoint has
-		# permissions 0755 instead of the default 0777.
-		# - use "-4k-align" option so individual files inside the squash
-		# file will be aligned to 4K blocks, which improves the
-		# efficiency of the delta updates.
-		mksquashfs "${qo_path}" "${WORKDIR}/quickoffice.squash" \
-			-all-root -noappend -no-recovery -no-exports \
-			-exit-on-error -comp lzo -b 1M -keep-as-directory \
-			-4k-align -root-mode 0755 -no-progress \
-			|| die "Failed to create Quickoffice squashfs"
-
-		# The squashfs will be mounted at boot time by an upstart script
-		# installed by chromeos-base/quickoffice.
-		doins "${WORKDIR}/quickoffice.squash"
-	fi
-
-	# Chrome test resources
-	# Test binaries are only available when building chrome from source
-	if use build_tests && [[ "${CHROME_ORIGIN}" == "LOCAL_SOURCE" ||
-		"${CHROME_ORIGIN}" == "SERVER_SOURCE" ]]; then
-		autotest-deponly_src_install
-		#env -uRESTRICT prepstrip "${D}${AUTOTEST_BASE}"
-	fi
-
-	# Copy input_methods.txt for XkbToKcmConverter & auto-test.
-	if [[ "${CHROME_ORIGIN}" == "LOCAL_SOURCE" ||
-			"${CHROME_ORIGIN}" == "SERVER_SOURCE" ]]; then
-		insinto /usr/share/chromeos-assets/input_methods
-		sed -E -e '/^#/d' -e '/^$/d' -e 's:  +: :g' \
-			"${CHROME_ROOT}"/src/chromeos/ime/input_methods.txt > "${T}/input_methods.txt" || die
-		doins "${T}/input_methods.txt"
-	fi
-
-	# Fix some perms.
-	# TODO(rcui): Remove this - shouldn't be needed, and is just covering up
-	# potential permissions bugs.
-	chmod -R a+r "${D}"
-	find "${D}" -perm /111 -print0 | xargs -0 chmod a+x
-
-	# The following symlinks are needed in order to run chrome.
-	# TODO(rcui): Remove this.  Not needed for running Chrome.
-	dosym libnss3.so /usr/lib/libnss3.so.1d
-	dosym libnssutil3.so.12 /usr/lib/libnssutil3.so.1d
-	dosym libsmime3.so.12 /usr/lib/libsmime3.so.1d
-	dosym libssl3.so.12 /usr/lib/libssl3.so.1d
-	dosym libplds4.so /usr/lib/libplds4.so.0d
-	dosym libplc4.so /usr/lib/libplc4.so.0d
-	dosym libnspr4.so /usr/lib/libnspr4.so.0d
-
-	# Create the main Chrome install directory.
-	dodir "${CHROME_DIR}"
-	insinto "${CHROME_DIR}"
-
-	# Install the orderfile into the chrome directory
-	if use orderfile_generate; then
-		[[ -f "${FROM}/chrome.orderfile.txt" ]] || die "No orderfile generated."
-		doins "${FROM}/chrome.orderfile.txt"
-	fi
-
-	# Install the unvetted orderfile into the chrome directory for upload.
-	if use orderfile_verify; then
-		[[ -f "${DISTDIR}/${UNVETTED_ORDERFILE}.xz" ]] || die "Lost the unvetted orderfile."
-		doins "${DISTDIR}/${UNVETTED_ORDERFILE}.xz"
-	fi
-
-	# Use the deploy_chrome from the *Chrome* checkout.  The benefit of
-	# doing this is if a new buildspec of Chrome requires a non-backwards
-	# compatible change to deploy_chrome, we can commit the fix to
-	# deploy_chrome without breaking existing Chrome OS release builds,
-	# and then roll the DEPS for chromite in the Chrome checkout.
-	#
-	# Another benefit is each version of Chrome will have the right
-	# corresponding version of deploy_chrome.
-	local cmd=( "${CHROME_ROOT}"/src/third_party/chromite/bin/deploy_chrome )
-	# Disable stripping for now, as deploy_chrome doesn't generate splitdebug files.
-	cmd+=(
-		"--board=${BOARD}"
-		"--build-dir=${FROM}"
-		"--gn-args=${GN_ARGS}"
-		# If this is enabled, we need to re-enable `prepstrip` above for autotests.
-		# You'll also have to re-add "strip" to the RESTRICT at the top of the file.
-		--nostrip
-		"--staging-dir=${D_CHROME_DIR}"
-		"--staging-flags=${USE}"
-		--staging-only
-		"--strip-bin=${STRIP}"
-		"--strip-flags=${PORTAGE_STRIP_FLAGS}"
-		--verbose
-	)
-	einfo "${cmd[*]}"
-	"${cmd[@]}" || die
-	LS=$(ls -alhS ${D}/${CHROME_DIR})
-	einfo "CHROME_DIR after deploy_chrome\n${LS}"
-
-	# Keep the .dwp file for debugging.  On AMD64 systems, dwo files aren't
-	# generated even when using debug fission.
-	if use arm && use chrome_debug && use debug_fission; then
-		mkdir -p "${D}/usr/lib/debug/${CHROME_DIR}"
-		DWP="${CHOST}"-dwp
-		cd "${D}/${CHROME_DIR}"
-		# Iterate over all ELF files in current directory
-		while read i; do
-			cd "${FROM}"
-			# There two files does not build with -gsplit-dwarf,
-			# so we do not need to get .dwp file from them.
-			if [[ "${i}" == "./nacl_helper_nonsfi" ]] ||
-				[[ "${i}" == "./nacl_irt_x86_32.nexe" ]] ; then
-				continue
-			fi
-			source="${i}"
-			${DWP} -e "${FROM}/${source}" -o "${D}/usr/lib/debug/${CHROME_DIR}/${i}.dwp" || die
-		done < <(scanelf -BRyF '%F' ".")
-	fi
-
-	if use build_tests; then
-		# Install Chrome Driver to test image.
-		local chromedriver_dir='/usr/local/chromedriver'
-		dodir "${chromedriver_dir}"
-		cp -pPR "${FROM}"/chromedriver "${D}/${chromedriver_dir}" || die
-
-		if use chrome_internal; then
-			# Install LibAssistant test library to test image.
-			into /usr/local/
-			dolib.so "${FROM}"/libassistant_debug.so
-		fi
-	fi
-	# The icu data is used by both chromeos-base/chrome-icu and this package.
-	# chromeos-base/chrome-icu is responsible for installing the icu
-	# data, so we remove it from ${D} here.
-	rm "${D_CHROME_DIR}/icudtl.dat" || die
-}
-
-pkg_preinst() {
-	enewuser "wayland"
-	enewgroup "wayland"
-	LS=$(ls -alhS ${ED}/${CHROME_DIR})
-	einfo "CHROME_DIR after installation\n${LS}"
-	CHROME_SIZE=$(stat --printf="%s" ${ED}/${CHROME_DIR}/chrome)
-	einfo "CHROME_SIZE = ${CHROME_SIZE}"
-
-	# Non-internal builds come with >10MB of unwinding info built-in. Size
-	# checks on those are less profitable.
-	if [[ ${CHROME_SIZE} -ge 250000000 && -z "${KEEP_CHROME_DEBUG_SYMBOLS}" ]] && use chrome_internal; then
-		die "Installed chrome binary got suspiciously large (size=${CHROME_SIZE})."
-	fi
-	if use arm; then
-		local files=$(find "${ED}/usr/lib/debug${CHROME_DIR}" -size +$((4 * 1024 * 1024 * 1024 - 1))c)
-		[[ -n ${files} ]] && die "Debug files exceed 4GiB: ${files}"
-	fi
-	# Verify that the elf program headers in splitdebug binary match the chrome
-	# binary, this is needed for correct symbolization in CWP.
-	# b/128861198, https://crbug.com/1007548 .
-	if [[ ${MERGE_TYPE} != binary ]] && use strict_toolchain_checks; then
-		local chrome_headers=$(${READELF} --program-headers --wide \
-			"${ED}/${CHROME_DIR}"/chrome | grep LOAD)
-		local chrome_debug_headers=$(${READELF} --program-headers --wide \
-			"${ED}/usr/lib/debug${CHROME_DIR}"/chrome.debug | grep LOAD)
-		[[ "${chrome_headers}" != "${chrome_debug_headers}" ]] && \
-			die "chrome program headers do not match chrome.debug"
-	fi
-}
-
-pkg_postinst() {
-	autotest_pkg_postinst
-}
diff --git a/chromeos-base/chromeos-chrome/chromeos-chrome-87.0.4280.0_rc-r1.ebuild b/chromeos-base/chromeos-chrome/chromeos-chrome-87.0.4280.0_rc-r1.ebuild
new file mode 100644
index 0000000..544e663
--- /dev/null
+++ b/chromeos-base/chromeos-chrome/chromeos-chrome-87.0.4280.0_rc-r1.ebuild
@@ -0,0 +1,1399 @@
+# Copyright 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Usage: by default, downloads chromium browser from the build server.
+# If CHROME_ORIGIN is set to one of {SERVER_SOURCE, LOCAL_SOURCE, LOCAL_BINARY},
+# the build comes from the chromimum source repository (gclient sync),
+# build server, locally provided source, or locally provided binary.
+# If you are using SERVER_SOURCE, a gclient template file that is in the files
+# directory which will be copied automatically during the build and used as
+# the .gclient for 'gclient sync'.
+# If building from LOCAL_SOURCE or LOCAL_BINARY specifying BUILDTYPE
+# will allow you to specify "Debug" or another build type; "Release" is
+# the default.
+
+EAPI=7
+
+# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
+PYTHON_COMPAT=( python2_7 )
+inherit autotest-deponly binutils-funcs chromium-source cros-credentials cros-constants cros-sanitizers eutils flag-o-matic git-2 multilib toolchain-funcs user python-any-r1
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="http://www.chromium.org/"
+SRC_URI=""
+
+LICENSE="BSD-Google chrome_internal? ( Google-TOS )"
+SLOT="0"
+KEYWORDS="*"
+IUSE="
+	+afdo_use
+	afdo_verify
+	+accessibility
+	app_shell
+	asan
+	+authpolicy
+	+build_tests
+	+chrome_debug
+	+cfi
+	cfm
+	chrome_debug_tests
+	chrome_internal
+	chrome_media
+	+chrome_remoting
+	clang_tidy
+	component_build
+	+debug_fission
+	+fonts
+	goma
+	goma_thinlto
+	+highdpi
+	internal_gles_conform
+	+libcxx
+	mojo
+	msan
+	+nacl
+	neon
+	on_device_assistant
+	oobe_config
+	opengl
+	opengles
+	orderfile_generate
+	+orderfile_use
+	orderfile_verify
+	+runhooks
+	strict_toolchain_checks
+	+thinlto
+	touchview
+	tpm_fallback
+	ubsan
+	v4l2_codec
+	v4lplugin
+	vaapi
+	verbose
+	vtable_verify
+	xkbcommon
+	"
+REQUIRED_USE="
+	cfi? ( thinlto )
+	afdo_verify? ( !afdo_use )
+	orderfile_generate? ( !orderfile_use )
+	"
+
+OZONE_PLATFORM_PREFIX=ozone_platform_
+OZONE_PLATFORMS=(gbm cast headless egltest caca)
+IUSE_OZONE_PLATFORMS="${OZONE_PLATFORMS[@]/#/${OZONE_PLATFORM_PREFIX}}"
+IUSE+=" ${IUSE_OZONE_PLATFORMS}"
+OZONE_PLATFORM_DEFAULT_PREFIX=ozone_platform_default_
+IUSE_OZONE_PLATFORM_DEFAULTS="${OZONE_PLATFORMS[@]/#/${OZONE_PLATFORM_DEFAULT_PREFIX}}"
+IUSE+=" ${IUSE_OZONE_PLATFORM_DEFAULTS}"
+REQUIRED_USE+=" ^^ ( ${IUSE_OZONE_PLATFORM_DEFAULTS} )"
+
+# The gclient hooks that run in src_prepare hit the network.
+# https://crbug.com/731905
+RESTRICT="network-sandbox mirror"
+
+# Do not strip the nacl_helper_bootstrap binary because the binutils
+# objcopy/strip mangles the ELF program headers.
+# TODO(mcgrathr,vapier): This should be removed after portage's prepstrip
+# script is changed to use eu-strip instead of objcopy and strip.
+STRIP_MASK+=" */nacl_helper_bootstrap"
+
+# Portage version without optional portage suffix.
+CHROME_VERSION="${PV/_*/}"
+
+# chrome destination directory
+CHROME_DIR=/opt/google/chrome
+D_CHROME_DIR="${D}/${CHROME_DIR}"
+
+# For compilation/local chrome
+BUILDTYPE="${BUILDTYPE:-Release}"
+BOARD="${BOARD:-${SYSROOT##/build/}}"
+BUILD_OUT="${BUILD_OUT:-out_${BOARD}}"
+# WARNING: We are using a symlink now for the build directory to work around
+# command line length limits. This will cause problems if you are doing
+# parallel builds of different boards/variants.
+# Unsetting BUILD_OUT_SYM will revert this behavior
+BUILD_OUT_SYM="c"
+
+UNVETTED_ORDERFILE_LOCATION=${AFDO_GS_DIRECTORY:-"gs://chromeos-toolchain-artifacts/orderfile/unvetted"}
+
+# The following entry will be modified automatically for verifying orderfile or AFDO profile.
+UNVETTED_ORDERFILE=""
+UNVETTED_AFDO_FILE=""
+
+add_orderfiles() {
+	# For verify orderfile, only for a toolchain special build.
+	if [[ -n ${UNVETTED_ORDERFILE} ]]; then
+		SRC_URI+=" orderfile_verify? ( ${UNVETTED_ORDERFILE_LOCATION}/${UNVETTED_ORDERFILE}.xz )"
+	fi
+}
+
+add_orderfiles
+
+RDEPEND="${RDEPEND}
+	app-arch/bzip2
+	app-crypt/mit-krb5
+	app-misc/edid-decode
+	authpolicy? ( chromeos-base/authpolicy )
+	~chromeos-base/chrome-icu-${PV}
+	chromeos-base/gestures
+	chromeos-base/libevdev
+	fonts? ( chromeos-base/chromeos-fonts )
+	chrome_internal? ( chromeos-base/quickoffice )
+	dev-libs/nspr
+	>=dev-libs/nss-3.12.2
+	>=media-libs/alsa-lib-1.0.19
+	media-libs/fontconfig
+	media-libs/libsync
+	x11-libs/libdrm
+	ozone_platform_gbm? ( media-libs/minigbm )
+	v4lplugin? ( media-libs/libv4lplugins )
+	>=media-sound/adhd-0.0.1-r310
+	net-print/cups
+	opengl? ( virtual/opengl )
+	opengles? ( virtual/opengles )
+	sys-apps/dbus
+	sys-apps/pciutils
+	virtual/udev
+	sys-libs/libcap
+	chrome_remoting? ( sys-libs/pam )
+	vaapi? ( x11-libs/libva )
+	xkbcommon? (
+		x11-libs/libxkbcommon
+		x11-misc/xkeyboard-config
+	)
+	accessibility? (
+		app-accessibility/brltty
+		app-accessibility/espeak-ng
+		app-accessibility/googletts
+	)
+	libcxx? (
+		sys-libs/libcxxabi
+		sys-libs/libcxx
+	)
+	oobe_config? ( chromeos-base/oobe_config )
+	"
+
+DEPEND="${DEPEND}
+	${RDEPEND}
+	chromeos-base/protofiles
+	>=dev-util/gperf-3.0.3
+	>=dev-util/pkgconfig-0.23
+	arm? ( x11-libs/libdrm )
+"
+
+PATCHES=()
+
+AUTOTEST_COMMON="src/chrome/test/chromeos/autotest/files"
+AUTOTEST_DEPS="${AUTOTEST_COMMON}/client/deps"
+AUTOTEST_DEPS_LIST="chrome_test telemetry_dep"
+
+IUSE="${IUSE} +autotest"
+
+
+QA_TEXTRELS="*"
+QA_EXECSTACK="*"
+QA_PRESTRIPPED="*"
+
+use_nacl() {
+	# 32bit asan conflicts with nacl: crosbug.com/38980
+	! (use asan && [[ ${ARCH} == "x86" ]]) && \
+	! use component_build && use nacl
+}
+
+# Like the `usex` helper:
+# Usage: echox [int] [echo-if-true] [echo-if-false]
+# If [int] is 0, then echo the 2nd arg (default of yes), else
+# echo the 3rd arg (default of no).
+echox() {
+	# Like the `usex` helper.
+	[[ ${1:-$?} -eq 0 ]] && echo "${2:-yes}" || echo "${3:-no}"
+}
+echotf() { echox ${1:-$?} true false ; }
+usetf()  { usex $1 true false ; }
+
+use_goma() {
+	[[ "${USE_GOMA:-$(usetf goma)}" == "true" ]]
+}
+should_upload_build_logs() {
+	[[ -n "${GOMA_TMP_DIR}" && -n "${GLOG_log_dir}" && \
+		"${GLOG_log_dir}" == "${GOMA_TMP_DIR}"* ]]
+}
+
+set_build_args() {
+	# use goma_thinlto says that if we are using Goma and ThinLTO, use
+	# Goma for distributed code generation. So only set the corresponding
+	# gn arg to true if all three conditions are met.
+	use_goma_thin_lto=$(use goma_thinlto && use_goma && use thinlto; echotf)
+	BUILD_ARGS=(
+		"is_chromeos_device=true"
+		# is_official_build sometimes implies extra optimizations (e.g. it will allow
+		# ThinLTO to optimize more aggressively, if ThinLTO is enabled). Please note
+		# that, despite the name, it should be usable by external users.
+		#
+		# Sanitizers don't like official builds.
+		"is_official_build=$(use_sanitizers false true)"
+
+		"is_debug=false"
+		"${EXTRA_GN_ARGS}"
+		"use_v4l2_codec=$(usetf v4l2_codec)"
+		"use_v4lplugin=$(usetf v4lplugin)"
+		"use_vaapi=$(usetf vaapi)"
+		"use_xkbcommon=$(usetf xkbcommon)"
+		"enable_remoting=$(usetf chrome_remoting)"
+		"enable_nacl=$(use_nacl; echotf)"
+		# use_system_minigbm is set below.
+
+		"is_cfm=$(usetf cfm)"
+
+		# Clang features.
+		"is_asan=$(usetf asan)"
+		"is_msan=$(usetf msan)"
+		"is_ubsan=$(usetf ubsan)"
+		"is_clang=true"
+		"use_thin_lto=$(usetf thinlto)"
+		"use_goma_thin_lto=${use_goma_thin_lto}"
+		"is_cfi=$(usetf cfi)"
+
+		"enable_cros_on_device_assistant=$(usetf on_device_assistant)"
+
+		# Assistant integration tests are only run on the Chromium bots,
+		# but they increase the size of libassistant.so by 1.3MB so we
+		# disable them here.
+		"enable_assistant_integration_tests=false"
+	)
+
+	# BUILD_STRING_ARGS needs appropriate quoting. So, we keep them separate and
+	# add them to BUILD_ARGS at the end.
+	BUILD_STRING_ARGS=(
+		"target_sysroot=${SYSROOT}"
+		"system_libdir=$(get_libdir)"
+		"pkg_config=$(tc-getPKG_CONFIG)"
+		"target_os=chromeos"
+		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
+		"clang_diagnostic_dir=/tmp/clang_crash_diagnostics"
+	)
+	use internal_gles_conform && BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
+
+	# Ozone platforms.
+	local platform
+	for platform in ${OZONE_PLATFORMS[@]}; do
+		local flag="${OZONE_PLATFORM_DEFAULT_PREFIX}${platform}"
+		if use "${flag}"; then
+			BUILD_STRING_ARGS+=( "ozone_platform=${platform}" )
+		fi
+	done
+	BUILD_ARGS+=(
+		"ozone_auto_platforms=false"
+	)
+	for platform in ${IUSE_OZONE_PLATFORMS}; do
+		if use "${platform}"; then
+			BUILD_ARGS+=( "${platform}=true" )
+		fi
+	done
+	if use "ozone_platform_gbm"; then
+		BUILD_ARGS+=( "use_system_minigbm=true" )
+		BUILD_ARGS+=( "use_system_libdrm=true" )
+	fi
+	if use "touchview"; then
+		BUILD_ARGS+=( "subpixel_font_rendering_disabled=true" )
+	fi
+
+	# Set proper build args for the arch
+	case "${ARCH}" in
+	x86)
+		BUILD_STRING_ARGS+=( "target_cpu=x86" )
+		;;
+	arm)
+		BUILD_ARGS+=(
+			"arm_use_neon=$(usetf neon)"
+			# To workaround the 4GB debug limit. crbug.com/792999.
+			"blink_symbol_level=1"
+		)
+		BUILD_STRING_ARGS+=(
+			"target_cpu=arm"
+			"arm_float_abi=hard"
+		)
+		local arm_arch=$(get-flag march)
+		if [[ -n "${arm_arch}" ]]; then
+			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
+		fi
+		;;
+	arm64)
+		BUILD_STRING_ARGS+=(
+			"target_cpu=arm64"
+		)
+		local arm_arch=$(get-flag march)
+		if [[ -n "${arm_arch}" ]]; then
+			BUILD_STRING_ARGS+=( "arm_arch=${arm_arch}" )
+		fi
+		;;
+	amd64)
+		BUILD_STRING_ARGS+=( "target_cpu=x64" )
+		;;
+	mips)
+		local mips_arch target_arch
+
+		mips_arch="$($(tc-getCPP) ${CFLAGS} ${CPPFLAGS} -E -P - <<<_MIPS_ARCH)"
+		# Strip away any enclosing quotes.
+		mips_arch="${mips_arch//\"}"
+		# TODO(benchan): Use tc-endian from toolchain-func to determine endianess
+		# when Chrome later cares about big-endian.
+		case "${mips_arch}" in
+		mips64*)
+			target_arch=mips64el
+			;;
+		*)
+			target_arch=mipsel
+			;;
+		esac
+
+		BUILD_STRING_ARGS+=(
+			"target_cpu=${target_arch}"
+			"mips_arch_variant=${mips_arch}"
+		)
+		;;
+	*)
+		die "Unsupported architecture: ${ARCH}"
+		;;
+	esac
+
+	if use chrome_internal; then
+		# Adding chrome branding specific variables.
+		BUILD_ARGS+=( "is_chrome_branded=true" )
+		# This test can only be build from internal sources.
+		BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
+		export CHROMIUM_BUILD='_google_Chrome'
+		export OFFICIAL_BUILD='1'
+		export CHROME_BUILD_TYPE='_official'
+	elif use chrome_media; then
+		echo "Building Chromium with additional media codecs and containers."
+		BUILD_ARGS+=( "proprietary_codecs=true" )
+		BUILD_STRING_ARGS+=( "ffmpeg_branding=ChromeOS" )
+	fi
+
+	if use component_build; then
+		BUILD_ARGS+=( "is_component_build=true" )
+	fi
+	if use_goma; then
+		BUILD_ARGS+=( "use_goma=true" )
+		BUILD_STRING_ARGS+=( "goma_dir=${GOMA_DIR:-/home/${WHOAMI}/goma}" )
+
+		# Goma compiler proxy runs outside of portage build.
+		# Practically, because TMPDIR is set in portage, it is
+		# different from the directory used when the compiler proxy
+		# started.
+		# If GOMA_TMP_DIR is not set, the compiler proxy uses
+		# TMPDIR/goma_${WHOAMI} for its tmpdir as fallback, which
+		# causes unexpected behavior.
+		# Specifically, named socket used to communicate with compiler
+		# proxy is ${GOMA_TMP_DIR}/goma.ipc by default, so the compiler
+		# proxy cannot be reached.
+		# Thus, here set GOMA_TMP_DIR to /tmp/goma_${WHOAMI} if it is
+		# not yet set.
+		if [[ -z "${GOMA_TMP_DIR}" ]]; then
+			export GOMA_TMP_DIR="/tmp/goma_${WHOAMI}"
+		fi
+	fi
+
+	if use chrome_debug; then
+		# Use debug fission to avoid 4GB limit of ELF32 (see crbug.com/595763).
+		# Using -g1 causes problems with crash server (see crbug.com/601854).
+		# Set use_debug_fission=true to prevent slow link (see crbug.com/703468).
+		# Disable debug_fission for bots which generate Afdo profile. (see crbug.com/704602).
+		BUILD_ARGS+=(
+			"use_debug_fission=$(usetf debug_fission)"
+			# The current toolchain can't successfully link chrome
+			# on recent versions of the browser with full symbols
+			# (i.e. symbol_level=2). So use symbol_level=1 for now.
+			# TODO(crbug.com/1129937): Bump to symbol_level=2 when
+			# it's safe to do so.
+			"symbol_level=1"
+		)
+		if use debug_fission; then
+			# The breakpad cannot handle the debug files generated by
+			# llvm and debug fission properly. crosbug.com/710605
+			append-flags -fno-split-dwarf-inlining
+		fi
+	fi
+
+	# With ThinLTO, the linking landscape is very different than regular
+	# linking. Some links (e.g., Chrome) can be very heavy and require
+	# 40GB+ of RAM. Since we don't use ThinLTO's cache (crbug.com/964328),
+	# heavy links are always going to be heavy, so it's faster to give them
+	# ${ncpu} each and only have 1 happening at once.
+	if use thinlto; then
+		local thinlto_link_job_count
+
+		if thinlto_link_job_count="$(grep -c ^processor /proc/cpuinfo)"; then
+			BUILD_ARGS+=(
+				"max_jobs_per_link=${thinlto_link_job_count}"
+				"concurrent_links=1"
+			)
+		fi
+
+	fi
+
+	if use tpm_fallback; then
+		BUILD_ARGS+=( "tpm_fallback=true" )
+	fi
+}
+
+unpack_chrome() {
+	# Add depot_tools to PATH, local chroot builds fail otherwise.
+	export PATH=${PATH}:${DEPOT_TOOLS}
+
+	local cmd=( "${CHROMITE_BIN_DIR}"/sync_chrome )
+	use chrome_internal && cmd+=( --internal )
+	if [[ "${CHROME_VERSION}" != "9999" ]]; then
+		cmd+=( "--tag=${CHROME_VERSION}" )
+	fi
+	# --reset tells sync_chrome to blow away local changes and to feel
+	# free to delete any directories that get in the way of syncing. This
+	# is needed for unattended operation.
+	cmd+=( --reset "--gclient=${EGCLIENT}" "${CHROME_DISTDIR}" )
+	elog "${cmd[*]}"
+	# TODO(crbug.com/1103048): Disable the sandbox when syncing the code.
+	# It seems to break gclient execution at random for unknown reasons.
+	# Children stop being tracked, or no git repos actually get cloned.
+	SANDBOX_ON=0 "${cmd[@]}" || die
+}
+
+decide_chrome_origin() {
+	if [[ "${PV}" == "9999" ]]; then
+		# LOCAL_SOURCE is the default for cros_workon.
+		# Warn the user if CHROME_ORIGIN is already set.
+		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
+			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
+			ewarn "This will prevent you from building from your local checkout."
+			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
+			ewarn "to the default source location."
+		fi
+		: "${CHROME_ORIGIN:=LOCAL_SOURCE}"
+	else
+		# By default, pull from server.
+		: "${CHROME_ORIGIN:=SERVER_SOURCE}"
+	fi
+}
+
+sandboxless_ensure_directory() {
+	local dir
+	for dir in "$@"; do
+		if [[ ! -d "${dir}" ]] ; then
+			# We need root access to create these directories, so we need to
+			# use sudo. This implicitly disables the sandbox.
+			sudo mkdir -p "${dir}" || die
+			sudo chown "${PORTAGE_USERNAME}:portage" "${dir}" || die
+			sudo chmod 0755 "${dir}" || die
+		fi
+	done
+}
+
+src_unpack() {
+	echo
+	ewarn "If you want to develop or hack on the browser itself, you should follow the"
+	ewarn "simple chrome workflow instead of using emerge:"
+	ewarn "https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md"
+	echo
+
+	tc-export CC CXX
+	local WHOAMI=$(whoami)
+
+	CHROME_SRC="chrome-src"
+	if use chrome_internal; then
+		CHROME_SRC+="-internal"
+	fi
+
+	# CHROME_CACHE_DIR is used for storing output artifacts, and is always a
+	# regular directory inside the chroot (i.e. it's never mounted in, so it's
+	# always safe to use cp -al for these artifacts).
+	: "${CHROME_CACHE_DIR:="/var/cache/chromeos-chrome/${CHROME_SRC}"}"
+	addwrite "${CHROME_CACHE_DIR}"
+
+	# CHROME_DISTDIR is used for storing the source code, if any source code
+	# needs to be unpacked at build time (e.g. in the SERVER_SOURCE scenario.)
+	# It will be mounted into the chroot, so it is never safe to use cp -al
+	# for these files.
+	: "${CHROME_DISTDIR:="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/${CHROME_SRC}"}"
+	addwrite "${CHROME_DISTDIR}"
+
+	# Create storage directories.
+	sandboxless_ensure_directory "${CHROME_DISTDIR}" "${CHROME_CACHE_DIR}"
+
+	cros-credentials_setup
+
+	decide_chrome_origin
+
+	case "${CHROME_ORIGIN}" in
+	LOCAL_SOURCE|SERVER_SOURCE|LOCAL_BINARY)
+		elog "CHROME_ORIGIN VALUE is ${CHROME_ORIGIN}"
+		;;
+	*)
+		die "CHROME_ORIGIN not one of LOCAL_SOURCE, SERVER_SOURCE, LOCAL_BINARY"
+		;;
+	esac
+
+	# Prepare and set CHROME_ROOT based on CHROME_ORIGIN.
+	# CHROME_ROOT is the location where the source code is used for compilation.
+	# If we're in SERVER_SOURCE mode, CHROME_ROOT is CHROME_DISTDIR. In LOCAL_SOURCE
+	# mode, this directory may be set manually to any directory. It may be mounted
+	# into the chroot, so it is not safe to use cp -al for these files.
+	# These are set here because $(whoami) returns the proper user here,
+	# but 'root' at the root level of the file
+	case "${CHROME_ORIGIN}" in
+	(SERVER_SOURCE)
+		elog "Using CHROME_VERSION = ${CHROME_VERSION}"
+		if [[ ${WHOAMI} == "chrome-bot" ]]; then
+			# TODO: Should add a sanity check that the version checked out is
+			# what we actually want.  Not sure how to do that though.
+			elog "Skipping syncing as cbuildbot ran SyncChrome for us."
+		else
+			unpack_chrome
+		fi
+
+		elog "set the chrome source root to ${CHROME_DISTDIR}"
+		elog "From this point onwards there is no difference between \
+			SERVER_SOURCE and LOCAL_SOURCE, since the fetch is done"
+		CHROME_ROOT=${CHROME_DISTDIR}
+		;;
+	(LOCAL_SOURCE)
+		: ${CHROME_ROOT:=/home/${WHOAMI}/chrome_root}
+		if [[ ! -d "${CHROME_ROOT}/src" ]]; then
+			die "${CHROME_ROOT} does not contain a valid chromium checkout!"
+		fi
+		addwrite "${CHROME_ROOT}"
+		;;
+	esac
+
+	case "${CHROME_ORIGIN}" in
+	LOCAL_SOURCE|SERVER_SOURCE)
+		set_build_args
+		;;
+	esac
+
+	# FIXME: This is the normal path where ebuild stores its working data.
+	# Chrome builds inside distfiles because of speed, so we at least make
+	# a symlink here to add compatibility with autotest eclass which uses this.
+	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
+
+	if use internal_gles_conform; then
+		local CHROME_GLES2_CONFORM=${CHROME_ROOT}/src/third_party/gles2_conform
+		local CROS_GLES2_CONFORM=/home/${WHOAMI}/trunk/src/third_party/gles2_conform
+		if [[ ! -d "${CHROME_GLES2_CONFORM}" ]]; then
+			if [[ -d "${CROS_GLES2_CONFORM}" ]]; then
+				ln -s "${CROS_GLES2_CONFORM}" "${CHROME_GLES2_CONFORM}"
+				einfo "Using GLES2 conformance test suite from ${CROS_GLES2_CONFORM}"
+			else
+				die "Trying to build GLES2 conformance test suite without ${CHROME_GLES2_CONFORM} or ${CROS_GLES2_CONFORM}"
+			fi
+		fi
+	fi
+
+	if use afdo_use; then
+		# Use AFDO profile downloaded in Chromium source code
+		# If needed profiles other than "silvermont", please set the variable
+		# ${AFDO_PROFILE_SOURCE} accordingly.
+		local afdo_src="${AFDO_PROFILE_SOURCE:-silvermont}"
+		BUILD_ARGS+=( "clang_use_default_sample_profile=true" )
+		BUILD_STRING_ARGS+=( "chromeos_afdo_platform=${afdo_src}" )
+	fi
+
+	# Use to verify a local unvetted AFDO file.
+	if use afdo_verify; then
+		if [[ ! -e "${UNVETTED_AFDO_FILE}" ]]; then
+			die "Cannot find ${UNVETTED_AFDO_FILE} to build Chrome."
+		fi
+		BUILD_STRING_ARGS+=( "clang_sample_profile_path=${UNVETTED_AFDO_FILE}" )
+	fi
+
+	# Unpack unvetted orderfile.
+	if use orderfile_verify; then
+		local orderfile_dir="${WORKDIR}/orderfile"
+		mkdir "${orderfile_dir}"
+		local orderfile_file=${UNVETTED_ORDERFILE}
+		(cd "${orderfile_dir}" && unpack "${orderfile_file}.xz") || die
+
+		local orderfile_loc="${orderfile_dir}/${orderfile_file}"
+		einfo "Using ${orderfile_loc} as orderfile for ordering Chrome"
+
+		# Pass the path to orderfile to GN args.
+		BUILD_STRING_ARGS+=( "chrome_orderfile_path=${orderfile_loc}" )
+	fi
+
+	if ! use orderfile_use; then
+		# If not using orderfile, override the default orderfile path to empty.
+		BUILD_STRING_ARGS+=( "chrome_orderfile_path=" )
+	fi
+}
+
+add_api_keys() {
+	# awk script to extract the values out of the file.
+	local EXTRACT="{ gsub(/[',]/, \"\", \$2); print \$2 }"
+	local api_key=$(awk "/google_api_key/ ${EXTRACT}" "$1")
+	local client_id=$(awk "/google_default_client_id/ ${EXTRACT}" "$1")
+	local client_secret=$(awk "/google_default_client_secret/ ${EXTRACT}" "$1")
+
+	BUILD_STRING_ARGS+=(
+		"google_api_key=${api_key}"
+		"google_default_client_id=${client_id}"
+		"google_default_client_secret=${client_secret}"
+	)
+}
+
+src_prepare() {
+	# Must call eapply_user in EAPI 7, but this function is a no-op here.
+	eapply_user
+
+	if [[ "${CHROME_ORIGIN}" != "LOCAL_SOURCE" &&
+			"${CHROME_ORIGIN}" != "SERVER_SOURCE" ]]; then
+		return
+	fi
+
+	elog "${CHROME_ROOT} should be set here properly"
+	cd "${CHROME_ROOT}/src" || die "Cannot chdir to ${CHROME_ROOT}"
+
+	# We do symlink creation here if appropriate.
+	mkdir -p "${CHROME_CACHE_DIR}/src/${BUILD_OUT}"
+	if [[ ! -z "${BUILD_OUT_SYM}" ]]; then
+		rm -rf "${BUILD_OUT_SYM}" || die "Could not remove symlink"
+		ln -sfT "${CHROME_CACHE_DIR}/src/${BUILD_OUT}" "${BUILD_OUT_SYM}" ||
+			die "Could not create symlink for output directory"
+	fi
+
+
+	# Apply patches for non-localsource builds.
+	if [[ "${CHROME_ORIGIN}" == "SERVER_SOURCE" && ${#PATCHES[@]} -gt 0 ]]; then
+		eapply "${PATCHES[@]}"
+	fi
+
+	local WHOAMI=$(whoami)
+	# Get the credentials to fake home directory so that the version of chromium
+	# we build can access Google services. First, check for Chrome credentials.
+	if [[ ! -d google_apis/internal ]]; then
+		# Then look for Chrome OS supplied credentials.
+		local PRIVATE_OVERLAYS_DIR=/home/${WHOAMI}/trunk/src/private-overlays
+		local GAPI_CONFIG_FILE=${PRIVATE_OVERLAYS_DIR}/chromeos-overlay/googleapikeys
+		if [[ ! -f "${GAPI_CONFIG_FILE}" ]]; then
+			# Then developer credentials.
+			GAPI_CONFIG_FILE=/home/${WHOAMI}/.googleapikeys
+		fi
+		if [[ -f "${GAPI_CONFIG_FILE}" ]]; then
+			add_api_keys "${GAPI_CONFIG_FILE}"
+		fi
+	fi
+}
+
+setup_test_lists() {
+	TEST_FILES=(
+		capture_unittests
+		dawn_end2end_tests
+		dawn_unittests
+		gl_tests
+		jpeg_decode_accelerator_unittest
+		jpeg_encode_accelerator_unittest
+		ozone_gl_unittests
+		sandbox_linux_unittests
+		video_decode_accelerator_perf_tests
+		video_decode_accelerator_tests
+		video_encode_accelerator_perf_tests
+		video_encode_accelerator_tests
+		# TODO(crbug.com/1045825): Remove video_encode_accelerator_unittest.
+		video_encode_accelerator_unittest
+		wayland_client_perftests
+	)
+
+	TEST_FILES+=( ppapi/examples/video_decode )
+
+	if use vaapi; then
+		TEST_FILES+=( vaapi_unittest )
+	fi
+
+	# TODO(ihf): Figure out how to keep this in sync with telemetry.
+	TOOLS_TELEMETRY_BIN=(
+		bitmaptools
+		clear_system_cache
+		minidump_stackwalk
+	)
+
+	PPAPI_TEST_FILES=(
+		lib{32,64}
+		mock_nacl_gdb
+		ppapi_nacl_tests_{newlib,glibc}.nmf
+		ppapi_nacl_tests_{newlib,glibc}_{x32,x64,arm,arm64}.nexe
+		test_case.html
+		test_case.html.mock-http-headers
+		test_page.css
+		test_url_loader_data
+	)
+}
+
+# Handle all CFLAGS/CXXFLAGS/etc... munging here.
+setup_compile_flags() {
+	# Chrome controls its own optimization settings, so this would be a nop
+	# if we were to run it. Leave it here anyway as a grep-friendly marker.
+	# cros_optimize_package_for_speed
+
+	# The chrome makefiles specify -O and -g flags already, so remove the
+	# portage flags.
+	filter-flags -g "-O*"
+
+	# Remove unsupported arm64 linker flag on arm32 builds.
+	# https://crbug.com/889079
+	use arm && filter-flags "-Wl,--fix-cortex-a53-843419"
+
+	# There are some flags we want to only use in the ebuild.
+	# The rest will be exported to the simple chrome workflow.
+	EBUILD_CFLAGS=()
+	EBUILD_CXXFLAGS=()
+	EBUILD_LDFLAGS=()
+
+	# LLVM needs this when parsing profiles.
+	# See README on https://github.com/google/autofdo
+	# For ARM, we do not need this flag because we don't get profiles
+	# from ARM machines. And it triggers an llvm assertion when thinlto
+	# and debug fission is used together.
+	# See https://bugs.llvm.org/show_bug.cgi?id=37255
+	use arm || append-flags -fdebug-info-for-profiling
+
+	if use thinlto; then
+		# We need to change the default value of import-instr-limit in
+		# LLVM to limit the text size increase. The default value is
+		# 100, and we change it to 30 to reduce the text size increase
+		# from 25% to 10%. The performance number of page_cycler is the
+		# same on two of the thinLTO configurations, we got 1% slowdown
+		# on speedometer when changing import-instr-limit from 100 to 30.
+		# We need to further reduce it to 20 for arm to limit the size
+		# increase to 10%.
+		local thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=30"
+		if use arm; then
+			thinlto_ldflag="-Wl,-plugin-opt,-import-instr-limit=20"
+			EBUILD_LDFLAGS+=( -gsplit-dwarf )
+		fi
+		EBUILD_LDFLAGS+=( ${thinlto_ldflag} )
+		# if using thinlto, we need to pass the equivalent of
+		# -fdebug-types-section to the backend, to prevent out-of-range
+		# relocations (see
+		# https://bugs.chromium.org/p/chromium/issues/detail?id=1032159).
+		append-ldflags -Wl,-mllvm
+		append-ldflags -Wl,-generate-type-units
+	else
+		# Non-ThinLTO builds with symbol_level=2 may have out-of-range
+		# relocations, too: crbug.com/1050819.
+		append-flags -fdebug-types-section
+	fi
+
+	if use orderfile_generate; then
+		local chrome_outdir="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
+		BUILD_STRING_ARGS+=( "dump_call_chain_clustering_order=${chrome_outdir}/chrome.orderfile.txt" )
+		# Enable call graph profile sort (C3) to generate orderfile.
+		BUILD_ARGS+=( "enable_call_graph_profile_sort=true" )
+	fi
+
+	# Enable std::vector []-operator bounds checking.
+	append-cxxflags -D__google_stl_debug_vector=1
+
+	# Chrome and Chrome OS versions of the compiler may not be in
+	# sync. So, don't complain if Chrome uses a diagnostic
+	# option that is not yet implemented in the compiler version used
+	# by Chrome OS.
+	# Turns out this is only really supported by Clang. See crosbug.com/615466
+	# Add "-faddrsig" flag required to efficiently support "--icf=all".
+	append-flags -faddrsig
+	append-flags -Wno-unknown-warning-option
+	export CXXFLAGS_host+=" -Wno-unknown-warning-option"
+	export CFLAGS_host+=" -Wno-unknown-warning-option"
+	if use libcxx; then
+		append-cxxflags "-stdlib=libc++"
+		append-ldflags "-stdlib=libc++"
+	fi
+
+	# Workaround: Disable fatal linker warnings on arm64/lld.
+	# https://crbug.com/913071
+	use arm64 && append-ldflags "-Wl,--no-fatal-warnings"
+	use vtable_verify && append-ldflags -fvtable-verify=preinit
+
+	local flags
+	einfo "Building with the compiler settings:"
+	for flags in {C,CXX,CPP,LD}FLAGS; do
+		einfo "  ${flags} = ${!flags}"
+	done
+}
+
+src_configure() {
+	tc-export CXX CC AR AS NM RANLIB STRIP
+	export CC_host=$(tc-getBUILD_CC)
+	export CXX_host=$(tc-getBUILD_CXX)
+	export NM_host=$(tc-getBUILD_NM)
+	export READELF="llvm-readelf"
+	export READELF_host="llvm-readelf"
+
+	# Use C++ compiler as the linker driver.
+	export LD="${CXX}"
+	export LD_host=${CXX_host}
+
+	# We need below change when USE="thinlto" is set. We set this globally
+	# so that users can turn on the "use_thin_lto" in the simplechrome
+	# flow more easily.
+	# use nm from llvm, https://crbug.com/917193
+	export NM="llvm-nm"
+	export NM_host="llvm-nm"
+	export AR="llvm-ar"
+	# USE=thinlto affects host build, we need to set host AR to
+	# llvm-ar to make sure host package builds with thinlto.
+	# crbug.com/731335
+	export AR_host="llvm-ar"
+	export RANLIB="llvm-ranlib"
+
+	# Set binutils path for goma.
+	CC_host+=" -B$(get_binutils_path "${LD_host}")"
+	CXX_host+=" -B$(get_binutils_path "${LD_host}")"
+
+	setup_compile_flags
+
+	# We might set BOTO_CONFIG in the builder environment in case the
+	# existing file needs modifications (e.g. for working with older
+	# branches). So don't overwrite it if it's already set.
+	# See https://crbug.com/847676 for details.
+	export BOTO_CONFIG="${BOTO_CONFIG:-/home/$(whoami)/.boto}"
+	export PATH=${PATH}:${DEPOT_TOOLS}
+
+	export DEPOT_TOOLS_GSUTIL_BIN_DIR="${CHROME_CACHE_DIR}/gsutil_bin"
+	# The venv logic seems to misbehave when cross-compiling.  Since our SDK
+	# should include all the necessary modules, just disable it (for now).
+	# https://crbug.com/808434
+	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"
+
+	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
+	# useflag when chrome build switches to Ninja inside the chroot.
+	if use runhooks; then
+		local cmd=( "${EGCLIENT}" runhooks --force )
+		echo "${cmd[@]}"
+		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
+		CXXFLAGS="${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}" \
+		LDFLAGS="${LDFLAGS} ${EBUILD_LDFLAGS[*]}" \
+		"${cmd[@]}" || die
+	fi
+
+	BUILD_STRING_ARGS+=(
+		"cros_target_ar=${AR}"
+		"cros_target_cc=${CC}"
+		"cros_target_cxx=${CXX}"
+		"host_toolchain=//build/toolchain/cros:host"
+		"custom_toolchain=//build/toolchain/cros:target"
+		"v8_snapshot_toolchain=//build/toolchain/cros:v8_snapshot"
+		"cros_target_ld=${LD}"
+		"cros_target_nm=${NM}"
+		"cros_target_readelf=${READELF}"
+		"cros_target_extra_cflags=${CFLAGS} ${EBUILD_CFLAGS[*]}"
+		"cros_target_extra_cppflags=${CPPFLAGS}"
+		"cros_target_extra_cxxflags=${CXXFLAGS} ${EBUILD_CXXFLAGS[*]}"
+		"cros_target_extra_ldflags=${LDFLAGS} ${EBUILD_LDFLAGS[*]}"
+		"cros_host_cc=${CC_host}"
+		"cros_host_cxx=${CXX_host}"
+		"cros_host_ar=${AR_host}"
+		"cros_host_ld=${LD_host}"
+		"cros_host_nm=${NM_host}"
+		"cros_host_readelf=${READELF_host}"
+		"cros_host_extra_cflags=${CFLAGS_host}"
+		"cros_host_extra_cxxflags=${CXXFLAGS_host}"
+		"cros_host_extra_cppflags=${CPPFLAGS_host}"
+		"cros_host_extra_ldflags=${LDFLAGS_host}"
+		"cros_v8_snapshot_cc=${CC_host}"
+		"cros_v8_snapshot_cxx=${CXX_host}"
+		"cros_v8_snapshot_ar=${AR_host}"
+		"cros_v8_snapshot_ld=${LD_host}"
+		"cros_v8_snapshot_nm=${NM_host}"
+		"cros_v8_snapshot_readelf=${READELF_host}"
+		"cros_v8_snapshot_extra_cflags=${CFLAGS_host}"
+		"cros_v8_snapshot_extra_cxxflags=${CXXFLAGS_host}"
+		"cros_v8_snapshot_extra_cppflags=${CPPFLAGS_host}"
+		"cros_v8_snapshot_extra_ldflags=${LDFLAGS_host}"
+	)
+
+	local arg
+	for arg in "${BUILD_STRING_ARGS[@]}"; do
+		BUILD_ARGS+=("${arg%%=*}=\"${arg#*=}\"")
+	done
+	export GN_ARGS="${BUILD_ARGS[*]}"
+	einfo "GN_ARGS = ${GN_ARGS}"
+	local gn=(
+		"${CHROME_ROOT}/src/buildtools/linux64/gn" gen
+		"${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}"
+		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src"
+	)
+	echo "${gn[@]}"
+	"${gn[@]}" || die
+
+	setup_test_lists
+
+	if use clang_tidy; then
+		export WITH_TIDY=1
+	fi
+}
+
+chrome_make() {
+	local build_dir="${BUILD_OUT_SYM}/${BUILDTYPE}"
+
+	# If ThinLTO is enabled, we may have a cache from a previous link. Due
+	# to fears about lack of reproducibility, we don't allow cache reuse
+	# across rebuilds. The cache is still useful for artifacts shared
+	# between multiple links done by this build (e.g. tests).
+	use thinlto && rm -rf "${build_dir}/thinlto-cache"
+
+	# If goma is enabled, increase the number of parallel run to
+	# 10 * {number of processors}. Though, if it is too large the
+	# performance gets slow down, so limit by 200 heuristically.
+	if use_goma; then
+		local num_parallel=$(($(nproc) * 10))
+		local j_limit=200
+		set -- -j $((num_parallel < j_limit ? num_parallel : j_limit)) "$@"
+	fi
+	local command=(
+		${ENINJA}
+		${MAKEOPTS}
+		-C "${build_dir}"
+		$(usex verbose -v "")
+		"$@"
+	)
+	# If goma is used, log the command, cwd and env vars, which will be
+	# uploaded to the logging server.
+	if should_upload_build_logs; then
+		env --null > "${GLOG_log_dir}/ninja_env"
+		pwd > "${GLOG_log_dir}/ninja_cwd"
+		echo "${command[@]}" > "${GLOG_log_dir}/ninja_command"
+	fi
+	PATH=${PATH}:${DEPOT_TOOLS} "${command[@]}"
+	local ret=$?
+	if should_upload_build_logs; then
+		echo "${ret}" > "${GLOG_log_dir}/ninja_exit"
+		cp -p "${BUILD_OUT_SYM}/${BUILDTYPE}/.ninja_log" "${GLOG_log_dir}/ninja_log"
+	fi
+	[[ "${ret}" -eq 0 ]] || die
+
+	# Still use a script to check if the orderfile is used properly, i.e.
+	# Builtin_ functions are placed between the markers, etc.
+	if use strict_toolchain_checks && (use orderfile_use || use orderfile_verify); then
+		"${FILESDIR}/check_orderfile.py" "${build_dir}/chrome" || die
+	fi
+}
+
+src_compile() {
+	if [[ "${CHROME_ORIGIN}" != "LOCAL_SOURCE" &&
+			"${CHROME_ORIGIN}" != "SERVER_SOURCE" ]]; then
+		return
+	fi
+
+	cd "${CHROME_ROOT}"/src || die "Cannot chdir to ${CHROME_ROOT}/src"
+
+	local chrome_targets=( $(usex mojo "mojo_shell" "") )
+	if use app_shell; then
+		chrome_targets+=( app_shell )
+	else
+		chrome_targets+=( chrome )
+	fi
+	if use build_tests; then
+		chrome_targets+=(
+			"${TEST_FILES[@]}"
+			"${TOOLS_TELEMETRY_BIN[@]}"
+			chromedriver
+		)
+		if use chrome_internal; then
+			chrome_targets+=( libassistant_debug.so )
+		fi
+	fi
+	use_nacl && chrome_targets+=( nacl_helper_bootstrap nacl_helper )
+
+	chrome_make "${chrome_targets[@]}"
+
+	if use build_tests; then
+		install_chrome_test_resources "${WORKDIR}/test_src"
+		install_telemetry_dep_resources "${WORKDIR}/telemetry_src"
+
+		# NOTE: Since chrome is built inside distfiles, we have to get
+		# rid of the previous instance first.
+		# We remove only what we will overwrite with the mv below.
+		local deps="${WORKDIR}/${P}/${AUTOTEST_DEPS}"
+
+		rm -rf "${deps}/chrome_test/test_src"
+		mv "${WORKDIR}/test_src" "${deps}/chrome_test/"
+
+		rm -rf "${deps}/telemetry_dep/test_src"
+		mv "${WORKDIR}/telemetry_src" "${deps}/telemetry_dep/test_src"
+
+		# The autotest eclass wants this for some reason.
+		get_paths() { :; }
+
+		# HACK: It would make more sense to call autotest_src_prepare in
+		# src_prepare, but we need to call install_chrome_test_resources first.
+		autotest-deponly_src_prepare
+
+		# Remove .git dirs
+		find "${AUTOTEST_WORKDIR}" -type d -name .git -prune -exec rm -rf {} +
+
+		autotest_src_compile
+	fi
+}
+
+install_test_resources() {
+	# Install test resources from chrome source directory to destination.
+	# We keep a cache of test resources inside the chroot to avoid copying
+	# multiple times.
+	local test_dir="${1}"
+	einfo "install_test_resources to ${test_dir}"
+	shift
+
+	# To speed things up, we write the list of files to a temporary file so
+	# we can use rsync with --files-from.
+	local tmp_list_file="${T}/${test_dir##*/}.files"
+	printf "%s\n" "$@" > "${tmp_list_file}"
+
+	# Copy the specific files to the cache from the source directory.
+	# Note: we need to specify -r when using --files-from and -a to get a
+	# recursive copy.
+	# TODO(ihf): Make failures here fatal.
+	rsync -r -a --delete --exclude=.git --exclude="*.pyc" \
+		--files-from="${tmp_list_file}" "${CHROME_ROOT}/src/" \
+		"${CHROME_CACHE_DIR}/src/"
+
+	# Create hard links in the destination based on the cache.
+	# Note: we need to specify -r when using --files-from and -a to get a
+	# recursive copy.
+	# TODO(ihf): Make failures here fatal.
+	rsync -r -a --link-dest="${CHROME_CACHE_DIR}/src" \
+		--files-from="${tmp_list_file}" "${CHROME_CACHE_DIR}/src/" "${test_dir}/"
+}
+
+test_strip_install() {
+	local from="${1}"
+	local dest="${2}"
+	shift 2
+	mkdir -p "${dest}"
+	local f
+	for f in "$@"; do
+		$(tc-getSTRIP) --strip-debug \
+			"${from}"/${f} -o "${dest}/$(basename ${f})"
+	done
+}
+
+install_chrome_test_resources() {
+	# NOTE: This is a duplicate from src_install, because it's required here.
+	local from="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
+	local test_dir="${1}"
+	local dest="${test_dir}/out/Release"
+
+	echo Copying Chrome tests into "${test_dir}"
+
+	# Even if chrome_debug_tests is enabled, we don't need to include detailed
+	# debug info for tests in the binary package, so save some time by stripping
+	# everything but the symbol names. Developers who need more detailed debug
+	# info on the tests can use the original unstripped tests from the ${from}
+	# directory.
+	TEST_INSTALL_TARGETS=(
+		"${TEST_FILES[@]}"
+		"libppapi_tests.so" )
+
+	einfo "Installing test targets: ${TEST_INSTALL_TARGETS[@]}"
+	test_strip_install "${from}" "${dest}" "${TEST_INSTALL_TARGETS[@]}"
+
+	# Copy Chrome test data.
+	mkdir -p "${dest}"/test_data
+	# WARNING: Only copy subdirectories of |test_data|.
+	# The full |test_data| directory is huge and kills our VMs.
+	# Example:
+	# cp -al "${from}"/test_data/<subdir> "${test_dir}"/out/Release/<subdir>
+
+	# Add the fake bidi locale.
+	mkdir -p "${dest}"/pseudo_locales
+	cp -al "${from}"/pseudo_locales/fake-bidi.pak \
+		"${dest}"/pseudo_locales
+
+	for f in "${PPAPI_TEST_FILES[@]}"; do
+		cp -al "${from}/${f}" "${dest}"
+	done
+
+	# Install Chrome test resources.
+	# WARNING: Only install subdirectories of |chrome/test|.
+	# The full |chrome/test| directory is huge and kills our VMs.
+	install_test_resources "${test_dir}" \
+		base/base_paths_posix.cc \
+		chrome/test/data/chromeos \
+		chrome/test/functional \
+		chrome/third_party/mock4js/mock4js.js  \
+		content/common/gpu/testdata \
+		media/test/data \
+		content/test/data \
+		net/data/ssl/certificates \
+		ppapi/tests/test_case.html \
+		ppapi/tests/test_url_loader_data \
+		third_party/bidichecker/bidichecker_packaged.js \
+		third_party/accessibility-developer-tools/gen/axs_testing.js
+
+	# Add the pdf test data if needed.
+	if use chrome_internal; then
+		install_test_resources "${test_dir}" pdf/test
+	fi
+	# Add the gles_conform test data if needed.
+	if use chrome_internal || use internal_gles_conform; then
+		install_test_resources "${test_dir}" gpu/gles2_conform_support/gles2_conform_test_expectations.txt
+	fi
+
+	cp -a "${CHROME_ROOT}"/"${AUTOTEST_DEPS}"/chrome_test/setup_test_links.sh \
+		"${dest}"
+}
+
+install_telemetry_dep_resources() {
+	local test_dir="${1}"
+
+	TELEMETRY=${CHROME_ROOT}/src/third_party/catapult/telemetry
+	if [[ -r "${TELEMETRY}" ]]; then
+		echo "Copying Telemetry Framework into ${test_dir}"
+		mkdir -p "${test_dir}"
+		# We are going to call chromium code but can't trust that it is clean
+		# of precompiled code. See crbug.com/590762.
+		find "${TELEMETRY}" -name "*.pyc" -type f -delete
+		# Get deps from Chrome.
+		FIND_DEPS=${CHROME_ROOT}/src/tools/perf/find_dependencies
+		PERF_DEPS=${CHROME_ROOT}/src/tools/perf/bootstrap_deps
+		CROS_DEPS=${CHROME_ROOT}/src/tools/cros/bootstrap_deps
+		# sed removes the leading path including src/ converting it to relative.
+		# To avoid silent failures assert the success.
+		DEPS_LIST=$(python ${FIND_DEPS} ${PERF_DEPS} ${CROS_DEPS} | \
+			sed -e 's|^'${CHROME_ROOT}/src/'||'; assert)
+		install_test_resources "${test_dir}" "${DEPS_LIST}"
+		# For crosperf, which uses some tests only available on internal builds.
+		if use chrome_internal; then
+			install_test_resources "${test_dir}" \
+				data/page_cycler/morejs \
+				data/page_cycler/moz
+		fi
+	fi
+
+	local from="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
+	local dest="${test_dir}/src/out/${BUILDTYPE}"
+	einfo "Installing telemetry binaries: ${TOOLS_TELEMETRY_BIN[@]}"
+	test_strip_install "${from}" "${dest}" "${TOOLS_TELEMETRY_BIN[@]}"
+
+	# When copying only a portion of the Chrome source that telemetry needs,
+	# some symlinks can end up broken. Thus clean these up before packaging.
+	find -L "${test_dir}" -type l -delete
+}
+
+# Add any new artifacts generated by the Chrome build targets to deploy_chrome.py.
+# We deal with miscellaneous artifacts here in the ebuild.
+src_install() {
+	FROM="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
+
+	# Override default strip flags and lose the '-R .comment'
+	# in order to play nice with the crash server.
+	if [[ -z "${KEEP_CHROME_DEBUG_SYMBOLS}" ]]; then
+		export PORTAGE_STRIP_FLAGS=""
+	else
+		export PORTAGE_STRIP_FLAGS="--strip-debug"
+	fi
+	einfo "PORTAGE_STRIP_FLAGS=${PORTAGE_STRIP_FLAGS}"
+	LS=$(ls -alhS ${FROM})
+	einfo "CHROME_DIR after build\n${LS}"
+
+	# Copy a D-Bus config file that includes other configs that are installed to
+	# /opt/google/chrome/dbus by deploy_chrome.
+	insinto /etc/dbus-1/system.d
+	doins "${FILESDIR}"/chrome.conf
+
+	# Copy Quickoffice resources for official build.
+	# Quickoffice is not yet available for arm64, https://crbug.com/881489
+	if use chrome_internal && [[ "${ARCH}" != "arm64" ]]; then
+		local qo_install_root="/usr/share/chromeos-assets/quickoffice"
+		insinto "${qo_install_root}"
+		QUICKOFFICE="${CHROME_ROOT}"/src/chrome/browser/resources/chromeos/quickoffice
+		doins -r "${QUICKOFFICE}"/_locales
+		doins -r "${QUICKOFFICE}"/css
+		doins -r "${QUICKOFFICE}"/img
+		doins -r "${QUICKOFFICE}"/plugin
+		doins -r "${QUICKOFFICE}"/scripts
+		doins -r "${QUICKOFFICE}"/views
+
+		local qo_path=""
+		case "${ARCH}" in
+		arm)
+			qo_path="${QUICKOFFICE}"/_platform_specific/arm
+			;;
+		amd64)
+			qo_path="${QUICKOFFICE}"/_platform_specific/x86_64
+			;;
+		*)
+			die "Unsupported architecture: ${ARCH}"
+			;;
+		esac
+
+		# Compress the platform-specific NaCl binaries with squashfs to
+		# save space on the rootfs.
+		# - compress with LZO and 1M blocks to optimize trade-off
+		# between compression ratio and decompression speed.
+		# - use "-keep-as-directory" option so the squash file will
+		# include the folder with the name of the CPU architecture,
+		# which is expected by the scripts on device.
+		# - use "-root-mode 0755" to ensure that the mountpoint has
+		# permissions 0755 instead of the default 0777.
+		# - use "-4k-align" option so individual files inside the squash
+		# file will be aligned to 4K blocks, which improves the
+		# efficiency of the delta updates.
+		mksquashfs "${qo_path}" "${WORKDIR}/quickoffice.squash" \
+			-all-root -noappend -no-recovery -no-exports \
+			-exit-on-error -comp lzo -b 1M -keep-as-directory \
+			-4k-align -root-mode 0755 -no-progress \
+			|| die "Failed to create Quickoffice squashfs"
+
+		# The squashfs will be mounted at boot time by an upstart script
+		# installed by chromeos-base/quickoffice.
+		doins "${WORKDIR}/quickoffice.squash"
+	fi
+
+	# Chrome test resources
+	# Test binaries are only available when building chrome from source
+	if use build_tests && [[ "${CHROME_ORIGIN}" == "LOCAL_SOURCE" ||
+		"${CHROME_ORIGIN}" == "SERVER_SOURCE" ]]; then
+		autotest-deponly_src_install
+		#env -uRESTRICT prepstrip "${D}${AUTOTEST_BASE}"
+	fi
+
+	# Copy input_methods.txt for XkbToKcmConverter & auto-test.
+	if [[ "${CHROME_ORIGIN}" == "LOCAL_SOURCE" ||
+			"${CHROME_ORIGIN}" == "SERVER_SOURCE" ]]; then
+		insinto /usr/share/chromeos-assets/input_methods
+		sed -E -e '/^#/d' -e '/^$/d' -e 's:  +: :g' \
+			"${CHROME_ROOT}"/src/chromeos/ime/input_methods.txt > "${T}/input_methods.txt" || die
+		doins "${T}/input_methods.txt"
+	fi
+
+	# Fix some perms.
+	# TODO(rcui): Remove this - shouldn't be needed, and is just covering up
+	# potential permissions bugs.
+	chmod -R a+r "${D}"
+	find "${D}" -perm /111 -print0 | xargs -0 chmod a+x
+
+	# The following symlinks are needed in order to run chrome.
+	# TODO(rcui): Remove this.  Not needed for running Chrome.
+	dosym libnss3.so /usr/lib/libnss3.so.1d
+	dosym libnssutil3.so.12 /usr/lib/libnssutil3.so.1d
+	dosym libsmime3.so.12 /usr/lib/libsmime3.so.1d
+	dosym libssl3.so.12 /usr/lib/libssl3.so.1d
+	dosym libplds4.so /usr/lib/libplds4.so.0d
+	dosym libplc4.so /usr/lib/libplc4.so.0d
+	dosym libnspr4.so /usr/lib/libnspr4.so.0d
+
+	# Create the main Chrome install directory.
+	dodir "${CHROME_DIR}"
+	insinto "${CHROME_DIR}"
+
+	# Install the orderfile into the chrome directory
+	if use orderfile_generate; then
+		[[ -f "${FROM}/chrome.orderfile.txt" ]] || die "No orderfile generated."
+		doins "${FROM}/chrome.orderfile.txt"
+	fi
+
+	# Install the unvetted orderfile into the chrome directory for upload.
+	if use orderfile_verify; then
+		[[ -f "${DISTDIR}/${UNVETTED_ORDERFILE}.xz" ]] || die "Lost the unvetted orderfile."
+		doins "${DISTDIR}/${UNVETTED_ORDERFILE}.xz"
+	fi
+
+	# Use the deploy_chrome from the *Chrome* checkout.  The benefit of
+	# doing this is if a new buildspec of Chrome requires a non-backwards
+	# compatible change to deploy_chrome, we can commit the fix to
+	# deploy_chrome without breaking existing Chrome OS release builds,
+	# and then roll the DEPS for chromite in the Chrome checkout.
+	#
+	# Another benefit is each version of Chrome will have the right
+	# corresponding version of deploy_chrome.
+	local cmd=( "${CHROME_ROOT}"/src/third_party/chromite/bin/deploy_chrome )
+	# Disable stripping for now, as deploy_chrome doesn't generate splitdebug files.
+	cmd+=(
+		"--board=${BOARD}"
+		"--build-dir=${FROM}"
+		"--gn-args=${GN_ARGS}"
+		# If this is enabled, we need to re-enable `prepstrip` above for autotests.
+		# You'll also have to re-add "strip" to the RESTRICT at the top of the file.
+		--nostrip
+		"--staging-dir=${D_CHROME_DIR}"
+		"--staging-flags=${USE}"
+		--staging-only
+		"--strip-bin=${STRIP}"
+		"--strip-flags=${PORTAGE_STRIP_FLAGS}"
+		--verbose
+	)
+	einfo "${cmd[*]}"
+	"${cmd[@]}" || die
+	LS=$(ls -alhS ${D}/${CHROME_DIR})
+	einfo "CHROME_DIR after deploy_chrome\n${LS}"
+
+	# Keep the .dwp file for debugging.  On AMD64 systems, dwo files aren't
+	# generated even when using debug fission.
+	if use arm && use chrome_debug && use debug_fission; then
+		mkdir -p "${D}/usr/lib/debug/${CHROME_DIR}"
+		DWP="${CHOST}"-dwp
+		cd "${D}/${CHROME_DIR}"
+		# Iterate over all ELF files in current directory
+		while read i; do
+			cd "${FROM}"
+			# There two files does not build with -gsplit-dwarf,
+			# so we do not need to get .dwp file from them.
+			if [[ "${i}" == "./nacl_helper_nonsfi" ]] ||
+				[[ "${i}" == "./nacl_irt_x86_32.nexe" ]] ; then
+				continue
+			fi
+			source="${i}"
+			${DWP} -e "${FROM}/${source}" -o "${D}/usr/lib/debug/${CHROME_DIR}/${i}.dwp" || die
+		done < <(scanelf -ByF '%F' ".")
+	fi
+
+	if use build_tests; then
+		# Install Chrome Driver to test image.
+		local chromedriver_dir='/usr/local/chromedriver'
+		dodir "${chromedriver_dir}"
+		cp -pPR "${FROM}"/chromedriver "${D}/${chromedriver_dir}" || die
+
+		if use chrome_internal; then
+			# Install LibAssistant test library to test image.
+			into /usr/local/
+			dolib.so "${FROM}"/libassistant_debug.so
+		fi
+	fi
+	# The icu data is used by both chromeos-base/chrome-icu and this package.
+	# chromeos-base/chrome-icu is responsible for installing the icu
+	# data, so we remove it from ${D} here.
+	rm "${D_CHROME_DIR}/icudtl.dat" || die
+}
+
+pkg_preinst() {
+	enewuser "wayland"
+	enewgroup "wayland"
+	LS=$(ls -alhS ${ED}/${CHROME_DIR})
+	einfo "CHROME_DIR after installation\n${LS}"
+	CHROME_SIZE=$(stat --printf="%s" ${ED}/${CHROME_DIR}/chrome)
+	einfo "CHROME_SIZE = ${CHROME_SIZE}"
+
+	# Non-internal builds come with >10MB of unwinding info built-in. Size
+	# checks on those are less profitable.
+	if [[ ${CHROME_SIZE} -ge 250000000 && -z "${KEEP_CHROME_DEBUG_SYMBOLS}" ]] && use chrome_internal; then
+		die "Installed chrome binary got suspiciously large (size=${CHROME_SIZE})."
+	fi
+	if use arm; then
+		local files=$(find "${ED}/usr/lib/debug${CHROME_DIR}" -size +$((4 * 1024 * 1024 * 1024 - 1))c)
+		[[ -n ${files} ]] && die "Debug files exceed 4GiB: ${files}"
+	fi
+	# Verify that the elf program headers in splitdebug binary match the chrome
+	# binary, this is needed for correct symbolization in CWP.
+	# b/128861198, https://crbug.com/1007548 .
+	if [[ ${MERGE_TYPE} != binary ]] && use strict_toolchain_checks; then
+		local chrome_headers=$(${READELF} --program-headers --wide \
+			"${ED}/${CHROME_DIR}"/chrome | grep LOAD)
+		local chrome_debug_headers=$(${READELF} --program-headers --wide \
+			"${ED}/usr/lib/debug${CHROME_DIR}"/chrome.debug | grep LOAD)
+		[[ "${chrome_headers}" != "${chrome_debug_headers}" ]] && \
+			die "chrome program headers do not match chrome.debug"
+	fi
+}
+
+pkg_postinst() {
+	autotest_pkg_postinst
+}
diff --git a/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild b/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild
index 902fc61..fed6d5b 100644
--- a/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild
+++ b/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild
@@ -11,14 +11,12 @@
 # If building from LOCAL_SOURCE or LOCAL_BINARY specifying BUILDTYPE
 # will allow you to specify "Debug" or another build type; "Release" is
 # the default.
-# gclient is expected to be in ~/depot_tools if EGCLIENT is not set
-# to gclient path.
 
 EAPI=7
 
 # TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
 PYTHON_COMPAT=( python2_7 )
-inherit autotest-deponly binutils-funcs cros-credentials cros-constants cros-sanitizers eutils flag-o-matic git-2 multilib toolchain-funcs user python-any-r1
+inherit autotest-deponly binutils-funcs chromium-source cros-credentials cros-constants cros-sanitizers eutils flag-o-matic git-2 multilib toolchain-funcs user python-any-r1
 
 DESCRIPTION="Open-source version of Google Chrome web browser"
 HOMEPAGE="http://www.chromium.org/"
@@ -82,7 +80,7 @@
 	"
 
 OZONE_PLATFORM_PREFIX=ozone_platform_
-OZONE_PLATFORMS=(gbm cast test egltest caca)
+OZONE_PLATFORMS=(gbm cast headless egltest caca)
 IUSE_OZONE_PLATFORMS="${OZONE_PLATFORMS[@]/#/${OZONE_PLATFORM_PREFIX}}"
 IUSE+=" ${IUSE_OZONE_PLATFORMS}"
 OZONE_PLATFORM_DEFAULT_PREFIX=ozone_platform_default_
@@ -108,7 +106,6 @@
 D_CHROME_DIR="${D}/${CHROME_DIR}"
 
 # For compilation/local chrome
-DEPOT_TOOLS=/mnt/host/depot_tools
 BUILDTYPE="${BUILDTYPE:-Release}"
 BOARD="${BOARD:-${SYSROOT##/build/}}"
 BUILD_OUT="${BUILD_OUT:-out_${BOARD}}"
@@ -118,7 +115,7 @@
 # Unsetting BUILD_OUT_SYM will revert this behavior
 BUILD_OUT_SYM="c"
 
-UNVETTED_ORDERFILE_LOCATION=${AFDO_GS_DIRECTORY:-"gs://chromeos-prebuilt/afdo-job/orderfiles/unvetted"}
+UNVETTED_ORDERFILE_LOCATION=${AFDO_GS_DIRECTORY:-"gs://chromeos-toolchain-artifacts/orderfile/unvetted"}
 
 # The following entry will be modified automatically for verifying orderfile or AFDO profile.
 UNVETTED_ORDERFILE=""
@@ -274,15 +271,10 @@
 		"pkg_config=$(tc-getPKG_CONFIG)"
 		"target_os=chromeos"
 		"host_pkg_config=$(tc-getBUILD_PKG_CONFIG)"
+		"clang_diagnostic_dir=/tmp/clang_crash_diagnostics"
 	)
 	use internal_gles_conform && BUILD_ARGS+=( "internal_gles2_conform_tests=true" )
 
-	# Disable tcmalloc on ARMv6 since it fails to build (crbug.com/181385)
-	if [[ ${CHOST} == armv6* ]]; then
-		BUILD_ARGS+=( "arm_version=6" )
-		BUILD_STRING_ARGS+=( "use_allocator=none" )
-	fi
-
 	# Ozone platforms.
 	local platform
 	for platform in ${OZONE_PLATFORMS[@]}; do
@@ -411,7 +403,12 @@
 		# Disable debug_fission for bots which generate Afdo profile. (see crbug.com/704602).
 		BUILD_ARGS+=(
 			"use_debug_fission=$(usetf debug_fission)"
-			"symbol_level=2"
+			# The current toolchain can't successfully link chrome
+			# on recent versions of the browser with full symbols
+			# (i.e. symbol_level=2). So use symbol_level=1 for now.
+			# TODO(crbug.com/1129937): Bump to symbol_level=2 when
+			# it's safe to do so.
+			"symbol_level=1"
 		)
 		if use debug_fission; then
 			# The breakpad cannot handle the debug files generated by
@@ -456,25 +453,26 @@
 	# is needed for unattended operation.
 	cmd+=( --reset "--gclient=${EGCLIENT}" "${CHROME_DISTDIR}" )
 	elog "${cmd[*]}"
-	"${cmd[@]}" || die
+	# TODO(crbug.com/1103048): Disable the sandbox when syncing the code.
+	# It seems to break gclient execution at random for unknown reasons.
+	# Children stop being tracked, or no git repos actually get cloned.
+	SANDBOX_ON=0 "${cmd[@]}" || die
 }
 
 decide_chrome_origin() {
-	local chrome_workon="=chromeos-base/chromeos-chrome-9999"
-	local cros_workon_file="${SYSROOT}/etc/portage/package.keywords/cros-workon"
-	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
-		# LOCAL_SOURCE is the default for cros_workon
-		# Warn the user if CHROME_ORIGIN is already set
+	if [[ "${PV}" == "9999" ]]; then
+		# LOCAL_SOURCE is the default for cros_workon.
+		# Warn the user if CHROME_ORIGIN is already set.
 		if [[ -n "${CHROME_ORIGIN}" && "${CHROME_ORIGIN}" != LOCAL_SOURCE ]]; then
 			ewarn "CHROME_ORIGIN is already set to ${CHROME_ORIGIN}."
 			ewarn "This will prevent you from building from your local checkout."
 			ewarn "Please run 'unset CHROME_ORIGIN' to reset Chrome"
 			ewarn "to the default source location."
 		fi
-		: ${CHROME_ORIGIN:=LOCAL_SOURCE}
+		: "${CHROME_ORIGIN:=LOCAL_SOURCE}"
 	else
-		# By default, pull from server
-		: ${CHROME_ORIGIN:=SERVER_SOURCE}
+		# By default, pull from server.
+		: "${CHROME_ORIGIN:=SERVER_SOURCE}"
 	fi
 }
 
@@ -500,14 +498,6 @@
 
 	tc-export CC CXX
 	local WHOAMI=$(whoami)
-	export EGCLIENT="${EGCLIENT:-${DEPOT_TOOLS}/gclient}"
-	export ENINJA="${ENINJA:-${DEPOT_TOOLS}/ninja}"
-
-	# Prevents gclient from updating self.
-	export DEPOT_TOOLS_UPDATE=0
-
-	# Prevent gclient metrics collection.
-	export DEPOT_TOOLS_METRICS=0
 
 	CHROME_SRC="chrome-src"
 	if use chrome_internal; then
@@ -586,9 +576,6 @@
 	# a symlink here to add compatibility with autotest eclass which uses this.
 	ln -sf "${CHROME_ROOT}" "${WORKDIR}/${P}"
 
-	export EGN="${EGN:-${CHROME_ROOT}/src/buildtools/linux64/gn}"
-	einfo "Using GN from ${EGN}"
-
 	if use internal_gles_conform; then
 		local CHROME_GLES2_CONFORM=${CHROME_ROOT}/src/third_party/gles2_conform
 		local CROS_GLES2_CONFORM=/home/${WHOAMI}/trunk/src/third_party/gles2_conform
@@ -676,7 +663,7 @@
 
 	# Apply patches for non-localsource builds.
 	if [[ "${CHROME_ORIGIN}" == "SERVER_SOURCE" && ${#PATCHES[@]} -gt 0 ]]; then
-		epatch "${PATCHES[@]}"
+		eapply "${PATCHES[@]}"
 	fi
 
 	local WHOAMI=$(whoami)
@@ -708,6 +695,9 @@
 		sandbox_linux_unittests
 		video_decode_accelerator_perf_tests
 		video_decode_accelerator_tests
+		video_encode_accelerator_perf_tests
+		video_encode_accelerator_tests
+		# TODO(crbug.com/1045825): Remove video_encode_accelerator_unittest.
 		video_encode_accelerator_unittest
 		wayland_client_perftests
 	)
@@ -745,7 +735,7 @@
 
 	# The chrome makefiles specify -O and -g flags already, so remove the
 	# portage flags.
-	filter-flags -g -O*
+	filter-flags -g "-O*"
 
 	# Remove unsupported arm64 linker flag on arm32 builds.
 	# https://crbug.com/889079
@@ -795,13 +785,8 @@
 	if use orderfile_generate; then
 		local chrome_outdir="${CHROME_CACHE_DIR}/src/${BUILD_OUT}/${BUILDTYPE}"
 		BUILD_STRING_ARGS+=( "dump_call_chain_clustering_order=${chrome_outdir}/chrome.orderfile.txt" )
-	fi
-
-	# Turn off call graph profile sort (C3), when new pass manager is enabled.
-	# Only allow it when we want to generate orderfile.
-	# This is a temporary option and will need to be removed once orderfile is on.
-	if ! use orderfile_generate; then
-		EBUILD_LDFLAGS+=( "-Wl,--no-call-graph-profile-sort" )
+		# Enable call graph profile sort (C3) to generate orderfile.
+		BUILD_ARGS+=( "enable_call_graph_profile_sort=true" )
 	fi
 
 	# Enable std::vector []-operator bounds checking.
@@ -881,7 +866,6 @@
 	# TODO(rcui): crosbug.com/20435. Investigate removal of runhooks
 	# useflag when chrome build switches to Ninja inside the chroot.
 	if use runhooks; then
-		[[ -f "${EGCLIENT}" ]] || die "EGCLIENT at '${EGCLIENT}' does not exist"
 		local cmd=( "${EGCLIENT}" runhooks --force )
 		echo "${cmd[@]}"
 		CFLAGS="${CFLAGS} ${EBUILD_CFLAGS[*]}" \
@@ -932,8 +916,13 @@
 	done
 	export GN_ARGS="${BUILD_ARGS[*]}"
 	einfo "GN_ARGS = ${GN_ARGS}"
-	${EGN} gen "${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}" \
-		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src" || die
+	local gn=(
+		"${CHROME_ROOT}/src/buildtools/linux64/gn" gen
+		"${CHROME_ROOT}/src/${BUILD_OUT_SYM}/${BUILDTYPE}"
+		--args="${GN_ARGS}" --root="${CHROME_ROOT}/src"
+	)
+	echo "${gn[@]}"
+	"${gn[@]}" || die
 
 	setup_test_lists
 
@@ -1354,7 +1343,7 @@
 			fi
 			source="${i}"
 			${DWP} -e "${FROM}/${source}" -o "${D}/usr/lib/debug/${CHROME_DIR}/${i}.dwp" || die
-		done < <(scanelf -BRyF '%F' ".")
+		done < <(scanelf -ByF '%F' ".")
 	fi
 
 	if use build_tests; then
diff --git a/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r205.ebuild b/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r205.ebuild
deleted file mode 100644
index 577f58d..0000000
--- a/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r205.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "0468cec41388f85dd89a5eb66bef35fcf7a5c524" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk chromeos-common-script .gn"
-
-PLATFORM_SUBDIR="chromeos-common-script"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS storage info tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-common-script/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="direncryption"
-
-DEPEND=""
-
-RDEPEND="!<chromeos-base/chromeos-installer-0.0.3"
-
-src_install() {
-	insinto /usr/share/misc
-	doins share/chromeos-common.sh
-	if use direncryption; then
-		sed -i '/local direncryption_enabled=/s/false/true/' \
-			"${D}/usr/share/misc/chromeos-common.sh" ||
-			die "Can not set directory encryption in common library"
-	fi
-}
diff --git a/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r228.ebuild b/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r228.ebuild
new file mode 100644
index 0000000..5d41556
--- /dev/null
+++ b/chromeos-base/chromeos-common-script/chromeos-common-script-0.0.1-r228.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e137dc0c7282c263da7b118003b16c4ef4a97ea3" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk chromeos-common-script .gn"
+
+PLATFORM_SUBDIR="chromeos-common-script"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS storage info tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-common-script/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="direncryption fsverity"
+
+DEPEND=""
+
+RDEPEND="!<chromeos-base/chromeos-installer-0.0.3"
+
+src_install() {
+	insinto /usr/share/misc
+	doins share/chromeos-common.sh
+	if use direncryption; then
+		sed -i '/local direncryption_enabled=/s/false/true/' \
+			"${D}/usr/share/misc/chromeos-common.sh" ||
+			die "Can not set directory encryption in common library"
+	fi
+	if use fsverity; then
+		sed -i '/local fsverity_enabled=/s/false/true/' \
+			"${D}/usr/share/misc/chromeos-common.sh" ||
+			die "Can not set fs-verity in common library"
+	fi
+}
diff --git a/chromeos-base/chromeos-common-script/chromeos-common-script-9999.ebuild b/chromeos-base/chromeos-common-script/chromeos-common-script-9999.ebuild
index f08b917..e9cc305 100644
--- a/chromeos-base/chromeos-common-script/chromeos-common-script-9999.ebuild
+++ b/chromeos-base/chromeos-common-script/chromeos-common-script-9999.ebuild
@@ -19,7 +19,7 @@
 LICENSE="BSD-Google"
 SLOT="0"
 KEYWORDS="~*"
-IUSE="direncryption"
+IUSE="direncryption fsverity"
 
 DEPEND=""
 
@@ -33,4 +33,9 @@
 			"${D}/usr/share/misc/chromeos-common.sh" ||
 			die "Can not set directory encryption in common library"
 	fi
+	if use fsverity; then
+		sed -i '/local fsverity_enabled=/s/false/true/' \
+			"${D}/usr/share/misc/chromeos-common.sh" ||
+			die "Can not set fs-verity in common library"
+	fi
 }
diff --git a/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r553.ebuild b/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r553.ebuild
deleted file mode 100644
index 2405494..0000000
--- a/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r553.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE="6287b0913be5aaea79569d55d989b9b729396f10"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="chromeos-config"
-
-PYTHON_COMPAT=( python{3_6,3_7} )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Chrome OS configuration host tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config"
-
-LICENSE="BSD-Google"
-SLOT=0
-KEYWORDS="*"
-
-RDEPEND="
-	>=sys-fs/squashfs-tools-4.3
-	dev-python/jinja[${PYTHON_USEDEP}]
-	!<chromeos-base/chromeos-config-tools-0.0.4
-"
-
-DEPEND="
-	${RDEPEND}
-	dev-python/setuptools[${PYTHON_USEDEP}]
-"
-
-REQUIRED_USE="${PYTHON_REQUIRED_USE}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/chromeos-config"
-}
diff --git a/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r587.ebuild b/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r587.ebuild
new file mode 100644
index 0000000..d24fd20
--- /dev/null
+++ b/chromeos-base/chromeos-config-host/chromeos-config-host-0.0.2-r587.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE="9b4a2274d7e288e816c42f93f44fb938f82038ff"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="chromeos-config"
+
+PYTHON_COMPAT=( python{3_6,3_7} )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Chrome OS configuration host tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config"
+
+LICENSE="BSD-Google"
+SLOT=0
+KEYWORDS="*"
+
+RDEPEND="
+	>=sys-fs/squashfs-tools-4.3
+	dev-python/jinja[${PYTHON_USEDEP}]
+	!<chromeos-base/chromeos-config-tools-0.0.4
+"
+
+DEPEND="
+	${RDEPEND}
+	dev-python/setuptools[${PYTHON_USEDEP}]
+"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/chromeos-config"
+}
diff --git a/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1535.ebuild b/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1535.ebuild
deleted file mode 100644
index ed0c178..0000000
--- a/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1535.ebuild
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6")
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform2"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform2"
-)
-CROS_WORKON_SUBTREE=(
-	"common-mk chromeos-config .gn power_manager"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform2"
-)
-PLATFORM_SUBDIR="chromeos-config"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS configuration tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config"
-
-LICENSE="BSD-Google"
-SLOT=0
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcros_config.so"
-
-	insinto "/usr/include/chromeos/chromeos-config/libcros_config"
-	doins "${S}"/libcros_config/*.h
-
-	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/libcros_config.pc
-
-	insinto "/usr/include/cros_config"
-	doins "libcros_config/cros_config_interface.h"
-	doins "libcros_config/cros_config.h"
-	doins "libcros_config/fake_cros_config.h"
-
-	dobin "${OUT}"/cros_config
-	newbin cros_config_mock.sh cros_config_mock
-	dosbin "${OUT}"/cros_configfs
-
-	# Install init scripts.
-	insinto /etc/init
-	doins init/*.conf
-}
-
-platform_pkg_test() {
-	# Run this here since we may not run cros_config_main_test.
-	./chromeos-config-test-setup.sh
-	local tests=(
-		fake_cros_config_test
-		cros_config_test
-		cros_config_main_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-	./run_tests.sh || die "cros_config unit tests have errors"
-}
diff --git a/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1607.ebuild b/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1607.ebuild
new file mode 100644
index 0000000..8730c8e
--- /dev/null
+++ b/chromeos-base/chromeos-config-tools/chromeos-config-tools-0.0.4-r1607.ebuild
@@ -0,0 +1,76 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="eb82187f0263886ba814e3d0bd0c3e9cbfb2cf70"
+CROS_WORKON_TREE=("4fdfdbe461ccedeaaf176391c0bbb0f74943be45" "aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "47494d35dcb27c2b0340dd8a7508845488139951")
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform2"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform2"
+)
+CROS_WORKON_SUBTREE=(
+	".clang-format common-mk chromeos-config .gn power_manager"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform2"
+)
+PLATFORM_SUBDIR="chromeos-config"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS configuration tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config"
+
+LICENSE="BSD-Google"
+SLOT=0
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dolib.so "${OUT}/lib/libcros_config.so"
+
+	insinto "/usr/include/chromeos/chromeos-config/libcros_config"
+	doins "${S}"/libcros_config/*.h
+
+	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/libcros_config.pc
+
+	insinto "/usr/include/cros_config"
+	doins "libcros_config/cros_config_interface.h"
+	doins "libcros_config/cros_config.h"
+	doins "libcros_config/fake_cros_config.h"
+
+	dobin "${OUT}"/cros_config
+	newbin cros_config_mock.sh cros_config_mock
+	dosbin "${OUT}"/cros_configfs
+
+	# Install init scripts.
+	insinto /etc/init
+	doins init/*.conf
+}
+
+platform_pkg_test() {
+	# Run this here since we may not run cros_config_main_test.
+	./chromeos-config-test-setup.sh
+	local tests=(
+		fake_cros_config_test
+		cros_config_test
+		cros_config_main_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+	./run_tests.sh || die "cros_config unit tests have errors"
+}
diff --git a/chromeos-base/chromeos-config-tools/chromeos-config-tools-9999.ebuild b/chromeos-base/chromeos-config-tools/chromeos-config-tools-9999.ebuild
index cbfc8a9..3af5b67 100644
--- a/chromeos-base/chromeos-config-tools/chromeos-config-tools-9999.ebuild
+++ b/chromeos-base/chromeos-config-tools/chromeos-config-tools-9999.ebuild
@@ -12,7 +12,7 @@
 	"platform2"
 )
 CROS_WORKON_SUBTREE=(
-	"common-mk chromeos-config .gn power_manager"
+	".clang-format common-mk chromeos-config .gn power_manager"
 )
 CROS_WORKON_DESTDIR=(
 	"${S}/platform2"
diff --git a/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r120.ebuild b/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r120.ebuild
deleted file mode 100644
index 94746aa..0000000
--- a/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r120.ebuild
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE.makefile file.
-
-EAPI="7"
-
-CROS_WORKON_COMMIT=("b1da01d568865aedf1d113cf81c678f605b3dc73" "872d8d0beabd9a81c08fc34ec83285c690228aa8" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("fdddca9d2fb4dd911a01bcdf1260cfd2a9ea2749" "f70af34770002df8ef3951dfdf5a6c18d42a5dda" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/tpm2"
-	"chromiumos/third_party/cryptoc"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform/cr50"
-	"third_party/tpm2"
-	"third_party/cryptoc"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/tpm2"
-	"${S}/third_party/cryptoc"
-)
-CROS_WORKON_EGIT_BRANCH=(
-	"cr50_stab"
-	"master"
-	"master"
-)
-
-inherit coreboot-sdk cros-ec-board cros-workon toolchain-funcs
-
-DESCRIPTION="Google Security Chip firmware code"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab"
-MIRROR_PATH="gs://chromeos-localmirror/distfiles/"
-CR50_ROS=(cr50.prod.ro.A.0.0.11 cr50.prod.ro.B.0.0.11)
-SRC_URI="${CR50_ROS[*]/#/${MIRROR_PATH}}"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="quiet verbose fuzzer asan msan ubsan"
-
-COMMON_DEPEND="
-	dev-libs/openssl:0=
-	virtual/libusb:1=
-	fuzzer? (
-		dev-libs/protobuf:=
-	)
-"
-
-RDEPEND="
-	!<chromeos-base/chromeos-ec-0.0.2
-	!<chromeos-base/ec-utils-0.0.2
-	${COMMON_DEPEND}
-"
-
-# Need to control versions of chromeos-ec and chromeos-config packages to
-# prevent file collision in /firmware/cr50.
-DEPEND="
-	${COMMON_DEPEND}
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-"
-
-# We don't want binchecks since we're cross-compiling firmware images using
-# non-standard layout.
-RESTRICT="binchecks"
-
-# Cr50 signer manifest converted into proper json format.
-CR50_JSON='prod.json'
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/platform/ec"
-}
-
-set_build_env() {
-	cros_use_gcc
-
-	export CROSS_COMPILE=${COREBOOT_SDK_PREFIX_arm}
-
-	tc-export CC BUILD_CC
-	export HOSTCC=${CC}
-	export BUILDCC=${BUILD_CC}
-
-	get_ec_boards
-
-	EC_OPTS=()
-	use quiet && EC_OPTS+=( -s 'V=0' )
-	use verbose && EC_OPTS+=( 'V=1' )
-}
-
-#
-# Convert internal representation of the signer manifest into conventional
-# json.
-#
-prepare_cr50_signer_aid () {
-	local signer_manifest="util/signer/ec_RW-manifest-prod.json"
-	local codesigner="cr50-codesigner"
-
-	elog "Converting prod manifest into json format"
-
-	if ! type -P "${codesigner}" >/dev/null; then
-		ewarn "${codesigner} not available, not preparing ${CR50_JSON}"
-		return
-	fi
-
-	"${codesigner}" --convert-json -i "${signer_manifest}" \
-			-o "${S}/${CR50_JSON}" || \
-		die "failed to convert signer manifest ${signer_manifest}"
-}
-
-src_compile() {
-	set_build_env
-
-	export BOARD=cr50
-	emake -C extra/usb_updater clean
-	emake -C extra/usb_updater gsctool
-
-	if use fuzzer ; then
-		local sanitizers=()
-		use asan && sanitizers+=( 'TEST_ASAN=y' )
-		use msan && sanitizers+=( 'TEST_MSAN=y' )
-		use ubsan && sanitizers+=( 'TEST_UBSAN=y' )
-		emake buildfuzztests "${sanitizers[@]}"
-	fi
-
-	if [[ "${EC_BOARDS[0]}" != "reef" ]]; then
-		elog "Not building Cr50 binaries"
-		return
-	fi
-
-	emake clean
-	emake "${EC_OPTS[@]}"
-	prepare_cr50_signer_aid
-}
-
-#
-# Install additional files, necessary for Cr50 signer inputs.
-#
-install_cr50_signer_aid () {
-	local blob
-
-	if [[ ! -f ${S}/${CR50_JSON} ]]; then
-		ewarn "Not installing Cr50 support files"
-		return
-	fi
-
-	elog "Installing Cr50 signer support files"
-
-	for blob in "${CR50_ROS[@]}"; do
-		local dest_name
-
-		# Carve out prod.ro.? from the RO blob file name. It is known
-		# to follow the pattern of "*prod.ro.[AB]*".
-		dest_name="${blob/*prod.ro/prod.ro}"
-		newins "${DISTDIR}/${blob}" "${dest_name::9}"
-	done
-
-	doins "${S}/board/cr50/rma_key_blob".*.{prod,test}
-	doins "${S}/${CR50_JSON}"
-	doins "${S}/util/signer/fuses.xml"
-}
-
-src_install() {
-	local build_dir
-	local dest_dir
-
-	dosbin "extra/usb_updater/gsctool"
-	dosbin "util/chargen"
-	dosym "gsctool" "/usr/sbin/usb_updater"
-
-	if use fuzzer ; then
-		local f
-
-		insinto /usr/libexec/fuzzers
-		exeinto /usr/libexec/fuzzers
-		for f in build/host/*_fuzz/*_fuzz.exe; do
-			local fuzzer="$(basename "${f}")"
-			local custom_owners="${S}/fuzz/${fuzzer%exe}owners"
-			fuzzer="ec_${fuzzer%_fuzz.exe}_fuzzer"
-			newexe "${f}" "${fuzzer}"
-			einfo "CUSTOM OWNERS = '${custom_owners}'"
-			if [[ -f "${custom_owners}" ]]; then
-				newins "${custom_owners}" "${fuzzer}.owners"
-			else
-				newins "${S}/OWNERS" "${fuzzer}.owners"
-			fi
-		done
-	fi
-
-	exeinto /usr/local/bin
-	doexe "util/ap_ro_hash.py"
-
-	if [[ "${EC_BOARDS[0]}" != "reef" ]]; then
-		elog "Not installing Cr50 binaries"
-		return
-	fi
-
-	build_dir="build/cr50"
-	dest_dir='/firmware/cr50'
-	einfo "Installing cr50 from ${build_dir} into ${dest_dir}"
-
-	insinto "${dest_dir}"
-	doins "${build_dir}/ec.bin"
-	doins "${build_dir}/RW/ec.RW.elf"
-	doins "${build_dir}/RW/ec.RW_B.elf"
-
-	install_cr50_signer_aid
-}
-
diff --git a/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r145.ebuild b/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r145.ebuild
new file mode 100644
index 0000000..42804a3
--- /dev/null
+++ b/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-0.0.1-r145.ebuild
@@ -0,0 +1,211 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE.makefile file.
+
+EAPI="7"
+
+CROS_WORKON_COMMIT=("79d75dccecc66b067b1c0d6ef0ff7d69d01c2b5d" "0217366d293dc71f7873d0a879384c0336ebdd7b" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("25df89506f0624f5ee267483a103c428c4607be4" "8e2ebe98fade4195aac74d52d0647b116b0165c5" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/tpm2"
+	"chromiumos/third_party/cryptoc"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/cr50"
+	"third_party/tpm2"
+	"third_party/cryptoc"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/tpm2"
+	"${S}/third_party/cryptoc"
+)
+CROS_WORKON_EGIT_BRANCH=(
+	"cr50_stab"
+	"master"
+	"master"
+)
+
+inherit coreboot-sdk cros-ec-board cros-workon toolchain-funcs
+
+DESCRIPTION="Google Security Chip firmware code"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab"
+MIRROR_PATH="gs://chromeos-localmirror/distfiles/"
+CR50_ROS=(cr50.prod.ro.A.0.0.11 cr50.prod.ro.B.0.0.11)
+SRC_URI="${CR50_ROS[*]/#/${MIRROR_PATH}}"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan cros_host fuzzer msan quiet ubsan verbose"
+
+COMMON_DEPEND="
+	dev-libs/openssl:0=
+	virtual/libusb:1=
+	fuzzer? (
+		dev-libs/protobuf:=
+	)
+"
+
+RDEPEND="
+	!<chromeos-base/chromeos-ec-0.0.2
+	!<chromeos-base/ec-utils-0.0.2
+	${COMMON_DEPEND}
+"
+
+# Need to control versions of chromeos-ec and chromeos-config packages to
+# prevent file collision in /firmware/cr50.
+DEPEND="
+	${COMMON_DEPEND}
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+"
+
+# We don't want binchecks since we're cross-compiling firmware images using
+# non-standard layout.
+RESTRICT="binchecks"
+
+# Cr50 signer manifest converted into proper json format.
+CR50_JSON='prod.json'
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/platform/ec"
+}
+
+set_build_env() {
+	cros_use_gcc
+
+	export CROSS_COMPILE=${COREBOOT_SDK_PREFIX_arm}
+
+	tc-export CC BUILD_CC PKG_CONFIG
+	export HOSTCC=${CC}
+	export BUILDCC=${BUILD_CC}
+
+	get_ec_boards
+
+	EC_OPTS=()
+	use quiet && EC_OPTS+=( -s 'V=0' )
+	use verbose && EC_OPTS+=( 'V=1' )
+}
+
+#
+# Convert internal representation of the signer manifest into conventional
+# json.
+#
+prepare_cr50_signer_aid () {
+	local signer_manifest="util/signer/ec_RW-manifest-prod.json"
+	local codesigner="cr50-codesigner"
+
+	elog "Converting prod manifest into json format"
+
+	if ! type -P "${codesigner}" >/dev/null; then
+		ewarn "${codesigner} not available, not preparing ${CR50_JSON}"
+		return
+	fi
+
+	"${codesigner}" --convert-json -i "${signer_manifest}" \
+			-o "${S}/${CR50_JSON}" || \
+		die "failed to convert signer manifest ${signer_manifest}"
+}
+
+src_compile() {
+	set_build_env
+
+	export BOARD=cr50
+	emake -C extra/usb_updater clean
+	emake -C extra/usb_updater gsctool
+
+	if use fuzzer ; then
+		local sanitizers=()
+		use asan && sanitizers+=( 'TEST_ASAN=y' )
+		use msan && sanitizers+=( 'TEST_MSAN=y' )
+		use ubsan && sanitizers+=( 'TEST_UBSAN=y' )
+		emake buildfuzztests "${sanitizers[@]}"
+	fi
+
+	if [[ "${EC_BOARDS[0]}" != "reef" ]]; then
+		elog "Not building Cr50 binaries"
+		return
+	fi
+
+	emake clean
+	emake "${EC_OPTS[@]}"
+	prepare_cr50_signer_aid
+}
+
+#
+# Install additional files, necessary for Cr50 signer inputs.
+#
+install_cr50_signer_aid () {
+	local blob
+
+	if [[ ! -f ${S}/${CR50_JSON} ]]; then
+		ewarn "Not installing Cr50 support files"
+		return
+	fi
+
+	elog "Installing Cr50 signer support files"
+
+	for blob in "${CR50_ROS[@]}"; do
+		local dest_name
+
+		# Carve out prod.ro.? from the RO blob file name. It is known
+		# to follow the pattern of "*prod.ro.[AB]*".
+		dest_name="${blob/*prod.ro/prod.ro}"
+		newins "${DISTDIR}/${blob}" "${dest_name::9}"
+	done
+
+	doins "${S}/board/cr50/rma_key_blob".*.{prod,test}
+	doins "${S}/${CR50_JSON}"
+	doins "${S}/util/signer/fuses.xml"
+}
+
+src_install() {
+	local build_dir
+	local dest_dir
+
+	dosbin "extra/usb_updater/gsctool"
+	dosbin "util/chargen"
+	dosym "gsctool" "/usr/sbin/usb_updater"
+
+	if use fuzzer ; then
+		local f
+
+		insinto /usr/libexec/fuzzers
+		exeinto /usr/libexec/fuzzers
+		for f in build/host/*_fuzz/*_fuzz.exe; do
+			local fuzzer="$(basename "${f}")"
+			local custom_owners="${S}/fuzz/${fuzzer%exe}owners"
+			fuzzer="ec_${fuzzer%_fuzz.exe}_fuzzer"
+			newexe "${f}" "${fuzzer}"
+			einfo "CUSTOM OWNERS = '${custom_owners}'"
+			if [[ -f "${custom_owners}" ]]; then
+				newins "${custom_owners}" "${fuzzer}.owners"
+			else
+				newins "${S}/OWNERS" "${fuzzer}.owners"
+			fi
+		done
+	fi
+
+	if ! use cros_host; then
+		exeinto /usr/local/bin
+		doexe "util/ap_ro_hash.py"
+	fi
+
+	if [[ "${EC_BOARDS[0]}" != "reef" ]]; then
+		elog "Not installing Cr50 binaries"
+		return
+	fi
+
+	build_dir="build/cr50"
+	dest_dir='/firmware/cr50'
+	einfo "Installing cr50 from ${build_dir} into ${dest_dir}"
+
+	insinto "${dest_dir}"
+	doins "${build_dir}/ec.bin"
+	doins "${build_dir}/RW/ec.RW.elf"
+	doins "${build_dir}/RW/ec.RW_B.elf"
+
+	install_cr50_signer_aid
+}
+
diff --git a/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-9999.ebuild b/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-9999.ebuild
index 34049cc..738a1a3 100644
--- a/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-9999.ebuild
+++ b/chromeos-base/chromeos-cr50-dev/chromeos-cr50-dev-9999.ebuild
@@ -35,7 +35,7 @@
 
 LICENSE="BSD-Google"
 KEYWORDS="~*"
-IUSE="quiet verbose fuzzer asan msan ubsan"
+IUSE="asan cros_host fuzzer msan quiet ubsan verbose"
 
 COMMON_DEPEND="
 	dev-libs/openssl:0=
@@ -75,7 +75,7 @@
 
 	export CROSS_COMPILE=${COREBOOT_SDK_PREFIX_arm}
 
-	tc-export CC BUILD_CC
+	tc-export CC BUILD_CC PKG_CONFIG
 	export HOSTCC=${CC}
 	export BUILDCC=${BUILD_CC}
 
@@ -185,8 +185,10 @@
 		done
 	fi
 
-	exeinto /usr/local/bin
-	doexe "util/ap_ro_hash.py"
+	if ! use cros_host; then
+		exeinto /usr/local/bin
+		doexe "util/ap_ro_hash.py"
+	fi
 
 	if [[ "${EC_BOARDS[0]}" != "reef" ]]; then
 		elog "Not installing Cr50 binaries"
diff --git a/chromeos-base/chromeos-cr50-scripts/chromeos-cr50-scripts-0.0.1-r66.ebuild b/chromeos-base/chromeos-cr50-scripts/chromeos-cr50-scripts-0.0.1-r67.ebuild
similarity index 100%
rename from chromeos-base/chromeos-cr50-scripts/chromeos-cr50-scripts-0.0.1-r66.ebuild
rename to chromeos-base/chromeos-cr50-scripts/chromeos-cr50-scripts-0.0.1-r67.ebuild
diff --git a/chromeos-base/chromeos-cr50-scripts/files/cr50-reset.sh b/chromeos-base/chromeos-cr50-scripts/files/cr50-reset.sh
index 50a115b..e3c3735 100755
--- a/chromeos-base/chromeos-cr50-scripts/files/cr50-reset.sh
+++ b/chromeos-base/chromeos-cr50-scripts/files/cr50-reset.sh
@@ -73,12 +73,14 @@
   # Remove whitespace and newline from challenge.
   ch="$(echo "${ch}" | tr -d '[:space:]')"
 
-  # Calculate challenge string.
+  # Calculate challenge URL and display it.
   local chstr="${RMA_SERVER}?challenge=${ch}&hwid=${hwid}"
+  echo
+  echo "URL: ${chstr}"
 
   # Create qrcode and display it.
-  qrencode -o "${chg_str_path}/chg.png" "${chstr}"
-  printf "\033]image:file=/chg.png;scale=2\033\\" > /run/frecon/vt0
+  qrencode -s 5 -o "${chg_str_path}/chg.png" "${chstr}"
+  printf "\033]image:file=/chg.png\033\\" > /run/frecon/vt0
 
   local n=0
   local ac
diff --git a/chromeos-base/chromeos-cr50/Manifest b/chromeos-base/chromeos-cr50/Manifest
index 9b241f1..4eb28f3 100644
--- a/chromeos-base/chromeos-cr50/Manifest
+++ b/chromeos-base/chromeos-cr50/Manifest
@@ -1,2 +1,2 @@
-DIST cr50.r0.0.11.w0.5.4.tbz2 202945 BLAKE2B 4ce7fd45b9e7ce87018fb838bc7c713e571a32b75e90083babe5d487ee34db54d05cdc9d217e9f7509593f58c99d9d01716e592f86f6ce2d0314c041162ecc60 SHA512 2f0372783f173be39ad454aff9e49d9c8b4b67ce6f9725b4db53102d6d7c0eea134b8379fe91bf850130dbbd197e7aecf9d7da3a99927e80aa3f501aed25ad0b
-DIST cr50.r0.0.11.w0.6.5_FFFF_00000000_00000010.tbz2 205212 BLAKE2B 71d4a9bd7a5d65be006c181bc5eb88cfdbf632043f7822906dc77d101323e17b5d7d2a0bdc17fce29bd74d52db775a7af439f7a419f746189622c9ab8f5ec786 SHA512 49c3148cae5fda511eb254c75305046d17b3a245581d16e8ed3b445a3f02e850860c27b964a79e860510f812592fac4c6f7c806026044f612c93f2ef849e51bc
+DIST cr50.r0.0.11.w0.5.6.tbz2 205816 BLAKE2B 19d43bbeb3c1dfffca16c789fa39c372e68d8f1e593931ff0e7e3667a5be529429e50d106efd55e78e30fc30f966ce7eb78e1643200b293e0ef900f438d3205f SHA512 fbc62f9ca2e1d85285267d804d8693ae2b313dba74b4b998547f1a4db173c3678bea27779d88aa04e04212d777414459970836ec815bfbfce6e2ec78fa464d4c
+DIST cr50.r0.0.11.w0.6.7_FFFF_00000000_00000010.tbz2 205728 BLAKE2B c479b5832511a4d3ecb87380d6519f4702f1385a83a767938ca263b511643540be983a747b1128394056296423333b4493ed844988809bb51b2a321d9bf3efca SHA512 79c86a44484b5f902913df21a3f34bc8e968e019e3b986ae19eff56ea51323a05da36e79f4ab6bc256ab6076ead75f079cf17f0e87a5a7ff374cc62c55cae0f3
diff --git a/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1-r90.ebuild b/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1-r94.ebuild
similarity index 100%
rename from chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1-r90.ebuild
rename to chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1-r94.ebuild
diff --git a/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1.ebuild b/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1.ebuild
index b495992..ee6633a 100644
--- a/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1.ebuild
+++ b/chromeos-base/chromeos-cr50/chromeos-cr50-0.0.1.ebuild
@@ -17,8 +17,8 @@
 #
 # Some boards can be using their custom Cr50 images, for those board the image
 # name is overridden in the board's overlay chromeos-cr50 ebuild.
-PROD_IMAGE="cr50.r0.0.11.w0.5.4"
-PRE_PVT_IMAGE="cr50.r0.0.11.w0.6.5_FFFF_00000000_00000010"
+PROD_IMAGE="cr50.r0.0.11.w0.5.6"
+PRE_PVT_IMAGE="cr50.r0.0.11.w0.6.7_FFFF_00000000_00000010"
 
 # Let's make sure that both are pulled in and included in the manifest.
 CR50_BASE_NAMES=( "${PROD_IMAGE}" "${PRE_PVT_IMAGE}" )
diff --git a/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r13.ebuild b/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r13.ebuild
deleted file mode 100644
index 5de1a99..0000000
--- a/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r13.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="2b1da0982a00db8f0f1f842a716b19a5ca247034"
-CROS_WORKON_TREE="7605f4da9f129a46d0c2b9c4cb06c3ddd1197fe8"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="chromeos-dbus-bindings"
-
-inherit cros-workon cros-rust
-
-CROS_RUST_CRATE_NAME="chromeos_dbus_bindings"
-DESCRIPTION="Chrome OS D-Bus bindings generator for Rust."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings/"
-
-LICENSE="BSD-Google"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/${CROS_WORKON_SUBTREE}"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
diff --git a/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r17.ebuild b/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r17.ebuild
new file mode 100644
index 0000000..f0adc6a
--- /dev/null
+++ b/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-0.24.52-r17.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE="af0686b23b50ef56914dbf3ab0f577f608b91f44"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="chromeos-dbus-bindings"
+
+inherit cros-workon cros-rust
+
+CROS_RUST_CRATE_NAME="chromeos_dbus_bindings"
+DESCRIPTION="Chrome OS D-Bus bindings generator for Rust."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings/"
+
+LICENSE="BSD-Google"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+BDEPEND=">=dev-rust/dbus-codegen-0.5.0"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/${CROS_WORKON_SUBTREE}"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
diff --git a/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-9999.ebuild b/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-9999.ebuild
index 244426b..6816dbe 100644
--- a/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-9999.ebuild
+++ b/chromeos-base/chromeos-dbus-bindings-rust/chromeos-dbus-bindings-rust-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2019 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="platform2"
@@ -17,6 +17,8 @@
 SLOT="0/${PVR}"
 KEYWORDS="~*"
 
+BDEPEND=">=dev-rust/dbus-codegen-0.5.0"
+
 src_unpack() {
 	cros-workon_src_unpack
 	S+="/${CROS_WORKON_SUBTREE}"
diff --git a/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2575.ebuild b/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2575.ebuild
deleted file mode 100644
index 5f75688..0000000
--- a/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2575.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7605f4da9f129a46d0c2b9c4cb06c3ddd1197fe8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk chromeos-dbus-bindings .gn"
-
-PLATFORM_SUBDIR="${PN}"
-PLATFORM_NATIVE_TEST="yes"
-
-inherit cros-workon platform
-
-DESCRIPTION="Utility for building Chrome D-Bus bindings from an XML description"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	dev-libs/expat
-	sys-apps/dbus"
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dobin "${OUT}"/generate-chromeos-dbus-bindings
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/chromeos_dbus_bindings_unittest"
-}
diff --git a/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2597.ebuild b/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2597.ebuild
new file mode 100644
index 0000000..ae56941
--- /dev/null
+++ b/chromeos-base/chromeos-dbus-bindings/chromeos-dbus-bindings-0.0.1-r2597.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "af0686b23b50ef56914dbf3ab0f577f608b91f44" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk chromeos-dbus-bindings .gn"
+
+PLATFORM_SUBDIR="${PN}"
+PLATFORM_NATIVE_TEST="yes"
+
+inherit cros-workon platform
+
+DESCRIPTION="Utility for building Chrome D-Bus bindings from an XML description"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	dev-libs/expat
+	sys-apps/dbus"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dobin "${OUT}"/generate-chromeos-dbus-bindings
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/chromeos_dbus_bindings_unittest"
+}
diff --git a/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r2945.ebuild b/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r2945.ebuild
deleted file mode 100644
index d20ed28..0000000
--- a/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r2945.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("478f28b630d531705c62fb681bfa273360cd623c" "b1da01d568865aedf1d113cf81c678f605b3dc73")
-CROS_WORKON_TREE=("deab483754cdb9e9af2f15f2631eca657f0e7d65" "fdddca9d2fb4dd911a01bcdf1260cfd2a9ea2749")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/platform/ec"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform/ec"
-	"platform/cr50"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/platform/cr50"
-)
-CROS_WORKON_EGIT_BRANCH=(
-	"master"
-	"cr50_stab"
-)
-
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cros-workon
-
-DESCRIPTION="Exported headers from the embedded controller codebase."
-HOMEPAGE="https://www.chromium.org/chromium-os/ec-development"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND=""
-DEPEND=""
-
-# No configuration or compilation necessary. This is a header only package.
-src_configure() { :; }
-src_compile() { :; }
-
-src_install() {
-	dir_ec=${CROS_WORKON_DESTDIR[0]}
-	dir_cr50=${CROS_WORKON_DESTDIR[1]}
-
-	insinto /usr/include/trunks/cr50_headers/
-	doins "${dir_cr50}"/include/pinweaver_types.h
-	doins "${dir_cr50}"/include/u2f.h
-	doins "${dir_cr50}"/board/cr50/tpm2/virtual_nvmem.h
-	insinto /usr/include/chromeos/ec/
-	doins "${dir_ec}"/include/ec_commands.h
-	doins "${dir_ec}"/util/cros_ec_dev.h
-}
diff --git a/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r3586.ebuild b/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r3586.ebuild
new file mode 100644
index 0000000..37f76ac
--- /dev/null
+++ b/chromeos-base/chromeos-ec-headers/chromeos-ec-headers-0.0.1-r3586.ebuild
@@ -0,0 +1,56 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("54a10bd3295c065c146931a51284252da606f945" "79d75dccecc66b067b1c0d6ef0ff7d69d01c2b5d")
+CROS_WORKON_TREE=("4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff" "25df89506f0624f5ee267483a103c428c4607be4")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/platform/ec"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/ec"
+	"platform/cr50"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/platform/cr50"
+)
+CROS_WORKON_EGIT_BRANCH=(
+	"master"
+	"cr50_stab"
+)
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+inherit cros-workon
+
+DESCRIPTION="Exported headers from the embedded controller codebase."
+HOMEPAGE="https://www.chromium.org/chromium-os/ec-development"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND=""
+DEPEND=""
+
+# No configuration or compilation necessary. This is a header only package.
+src_configure() { :; }
+src_compile() { :; }
+
+src_install() {
+	dir_ec=${CROS_WORKON_DESTDIR[0]}
+	dir_cr50=${CROS_WORKON_DESTDIR[1]}
+
+	insinto /usr/include/trunks/cr50_headers/
+	doins "${dir_cr50}"/include/pinweaver_types.h
+	doins "${dir_cr50}"/include/u2f.h
+	doins "${dir_cr50}"/board/cr50/tpm2/virtual_nvmem.h
+	insinto /usr/include/chromeos/ec/
+	doins "${dir_ec}"/include/ec_commands.h
+	doins "${dir_ec}"/util/cros_ec_dev.h
+}
diff --git a/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r7696.ebuild b/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r7696.ebuild
deleted file mode 100644
index bed4ce5..0000000
--- a/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r7696.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE.makefile file.
-
-# A note about this ebuild: this ebuild is Unified Build enabled but
-# not in the way in which most other ebuilds with Unified Build
-# knowledge are: the primary use for this ebuild is for engineer-local
-# work or firmware builder work. In both cases, the build might be
-# happening on a branch in which only one of many of the models are
-# available to build. The logic in this ebuild succeeds so long as one
-# of the many models successfully builds.
-
-# Increment the "eclass bug workaround count" below when you change
-# "cros-ec.eclass" to work around http://crbug.com/220902.
-#
-# eclass bug workaround count: 1
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("478f28b630d531705c62fb681bfa273360cd623c" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("deab483754cdb9e9af2f15f2631eca657f0e7d65" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/cryptoc"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform/ec"
-	"third_party/cryptoc"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/cryptoc"
-)
-
-inherit cros-ec cros-workon
-
-# Make sure config tools use the latest schema.
-BDEPEND=">=chromeos-base/chromeos-config-host-0.0.2"
-
-MIRROR_PATH="gs://chromeos-localmirror/distfiles/"
-DESCRIPTION="Embedded Controller firmware code"
-KEYWORDS="*"
diff --git a/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r8324.ebuild b/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r8324.ebuild
new file mode 100644
index 0000000..a450a57
--- /dev/null
+++ b/chromeos-base/chromeos-ec/chromeos-ec-0.0.2-r8324.ebuild
@@ -0,0 +1,42 @@
+# Copyright (C) 2012 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE.makefile file.
+
+# A note about this ebuild: this ebuild is Unified Build enabled but
+# not in the way in which most other ebuilds with Unified Build
+# knowledge are: the primary use for this ebuild is for engineer-local
+# work or firmware builder work. In both cases, the build might be
+# happening on a branch in which only one of many of the models are
+# available to build. The logic in this ebuild succeeds so long as one
+# of the many models successfully builds.
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 1
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("54a10bd3295c065c146931a51284252da606f945" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/cryptoc"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/ec"
+	"third_party/cryptoc"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/cryptoc"
+)
+
+inherit cros-ec cros-workon
+
+# Make sure config tools use the latest schema.
+BDEPEND=">=chromeos-base/chromeos-config-host-0.0.2"
+
+MIRROR_PATH="gs://chromeos-localmirror/distfiles/"
+DESCRIPTION="Embedded Controller firmware code"
+KEYWORDS="*"
diff --git a/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r156.ebuild b/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r156.ebuild
deleted file mode 100644
index bebc884..0000000
--- a/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r156.ebuild
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="f78bae2a9abee97c1b366197ef61c6fe51661d94"
-CROS_WORKON_TREE="bd5a0aab5cfa2cce33cd901716ef92d022d278a0"
-CROS_WORKON_LOCALNAME="platform/firmware"
-CROS_WORKON_PROJECT="chromiumos/platform/firmware"
-
-inherit cros-workon cros-firmware
-
-DESCRIPTION="Chrome OS Firmware (Template - change to board name)"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/firmware/"
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND=""
-
-### FIRMWARE IMAGES ###
-# Specify the firmware images to update. You can use file path or URLs (in
-# ebuild SRC_URI syntax). Most projects will use Binary Component Server (BCS)
-# links. To do that, archive only the image file as a tbz2 and upload to CPFE
-# web site (http://www.google.com/chromeos/partner/fe/) with relative path
-# chromeos-base/chromeos-firmware-${BOARD}. Then you can refer to the file as
-# "bcs://filename.tbz2".
-#
-# MAIN_IMAGE controls AP RO firmware (also RW if MAIN_RW_IMAGE is empty).
-# MAIN_RW_IMAGE controls AP RW firmware when you need different RO & RW.
-# EC_IMAGE controls EC RO firmware (RW will be synced from MAIN_[RW_]IMAGE).
-# For more details, read
-# https://chromium.googlesource.com/chromiumos/platform/firmware/+/master/README.md
-#
-# When you modify any image files below, please also update manifest file:
-#  (chroot) ebuild chromeos-firmware-${BOARD}-9999.ebuild manifest
-CROS_FIRMWARE_MAIN_IMAGE=""
-CROS_FIRMWARE_MAIN_RW_IMAGE=""
-CROS_FIRMWARE_EC_IMAGE=""
-
-### EXTRA FILES ###
-# ${FILESDIR}/extra will be automatically merged into updater package.
-# ${FILESDIR}/sbin will be automatically installed to /usr/sbin on rootfs.
-# Put board customization (updater_custom.sh) in ${FILESDIR}/extra.
-# If you need more files, define a CROS_FIRMWARE_EXTRA_LIST with the file names
-# and directory names to include, delimited by semicolon.
-
-cros-firmware_setup_source
-
-# Remove/Adapt script below here when using the template.
-src_unpack() {
-	einfo "Dummy implementation to replace cros-firmware.eclass"
-	cros-workon_src_unpack
-}
-
-src_compile() {
-	einfo "Dummy implementation to replace cros-firmware.eclass"
-}
-
-src_install() {
-	einfo "Dummy implementation to replace cros-firmware.eclass"
-}
diff --git a/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r159.ebuild b/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r159.ebuild
new file mode 100644
index 0000000..24fd2d1
--- /dev/null
+++ b/chromeos-base/chromeos-firmware-null/chromeos-firmware-null-0.0.3-r159.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="eb2fa0800cc6c98d3fc743f5d14601b09cfa0893"
+CROS_WORKON_TREE="9b119d2bf1a8adda71beea2e74ae3c59bc2f7e44"
+CROS_WORKON_LOCALNAME="platform/firmware"
+CROS_WORKON_PROJECT="chromiumos/platform/firmware"
+
+inherit cros-workon cros-firmware
+
+DESCRIPTION="Chrome OS Firmware (Template - change to board name)"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/firmware/"
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND=""
+
+### FIRMWARE IMAGES ###
+# Specify the firmware images to update. You can use file path or URLs (in
+# ebuild SRC_URI syntax). Most projects will use Binary Component Server (BCS)
+# links. To do that, archive only the image file as a tbz2 and upload to CPFE
+# web site (http://www.google.com/chromeos/partner/fe/) with relative path
+# chromeos-base/chromeos-firmware-${BOARD}. Then you can refer to the file as
+# "bcs://filename.tbz2".
+#
+# MAIN_IMAGE controls AP RO firmware (also RW if MAIN_RW_IMAGE is empty).
+# MAIN_RW_IMAGE controls AP RW firmware when you need different RO & RW.
+# EC_IMAGE controls EC RO firmware (RW will be synced from MAIN_[RW_]IMAGE).
+# For more details, read
+# https://chromium.googlesource.com/chromiumos/platform/firmware/+/master/README.md
+#
+# When you modify any image files below, please also update manifest file:
+#  (chroot) ebuild chromeos-firmware-${BOARD}-9999.ebuild manifest
+CROS_FIRMWARE_MAIN_IMAGE=""
+CROS_FIRMWARE_MAIN_RW_IMAGE=""
+CROS_FIRMWARE_EC_IMAGE=""
+
+### EXTRA FILES ###
+# ${FILESDIR}/extra will be automatically merged into updater package.
+# ${FILESDIR}/sbin will be automatically installed to /usr/sbin on rootfs.
+# Put board customization (updater_custom.sh) in ${FILESDIR}/extra.
+# If you need more files, define a CROS_FIRMWARE_EXTRA_LIST with the file names
+# and directory names to include, delimited by semicolon.
+
+cros-firmware_setup_source
+
+# Remove/Adapt script below here when using the template.
+src_unpack() {
+	einfo "Dummy implementation to replace cros-firmware.eclass"
+	cros-workon_src_unpack
+}
+
+src_compile() {
+	einfo "Dummy implementation to replace cros-firmware.eclass"
+}
+
+src_install() {
+	einfo "Dummy implementation to replace cros-firmware.eclass"
+}
diff --git a/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1-r45.ebuild b/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1-r48.ebuild
similarity index 100%
rename from chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1-r45.ebuild
rename to chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1-r48.ebuild
diff --git a/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1.ebuild b/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1.ebuild
index 0558395..90e83d0 100644
--- a/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1.ebuild
+++ b/chromeos-base/chromeos-fonts/chromeos-fonts-0.0.1.ebuild
@@ -1,7 +1,9 @@
 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
+
+inherit cros-constants
 
 DESCRIPTION="Chrome OS Fonts (meta package)"
 HOMEPAGE="http://src.chromium.org"
@@ -27,121 +29,89 @@
 # to fixing http://crbug.com/205424.
 DEPEND="
 	internal? (
-		chromeos-base/monotype-fonts
-		chromeos-base/google-sans-fonts
+		chromeos-base/monotype-fonts:=
+		chromeos-base/google-sans-fonts:=
 	)
-	media-fonts/croscorefonts
-	media-fonts/crosextrafonts
-	media-fonts/crosextrafonts-carlito
-	media-fonts/noto-cjk
-	media-fonts/notofonts
-	media-fonts/ko-nanumfonts
-	media-fonts/lohitfonts-cros
-	media-fonts/robotofonts
-	media-fonts/tibt-jomolhari
-	media-libs/fontconfig
-	!cros_host? ( sys-libs/gcc-libs )
-	cros_host? ( sys-libs/glibc )
+	media-fonts/croscorefonts:=
+	media-fonts/crosextrafonts:=
+	media-fonts/crosextrafonts-carlito:=
+	media-fonts/noto-cjk:=
+	media-fonts/notofonts:=
+	media-fonts/ko-nanumfonts:=
+	media-fonts/lohitfonts-cros:=
+	media-fonts/robotofonts:=
+	media-fonts/tibt-jomolhari:=
+	media-libs/fontconfig:=
+	!cros_host? ( sys-libs/gcc-libs:= )
+	cros_host? ( sys-libs/glibc:= )
 	"
 RDEPEND="${DEPEND}"
 
+BDEPEND="chromeos-base/minijail"
+
 S=${WORKDIR}
 
-# Don't 'die' in here, because our callers want to catch errors.
-qemu_run() {
-	# Run the emulator to execute command. It needs to be copied
-	# temporarily into the sysroot because we chroot to it.
-	local qemu=()
-	case "${ARCH}" in
-		amd64)
-			# Note that qemu is not actually run below in this case.
-			qemu=( qemu-x86_64 -cpu max )
-			;;
-		arm)
-			qemu=( qemu-arm )
-			;;
-		arm64)
-			qemu=( qemu-aarch64 )
-			;;
-		mips)
-			qemu=( qemu-mipsel )
-			;;
-		x86)
-			qemu=( qemu-i386 -cpu max )
-			;;
-		*)
-			eerror "Unable to determine QEMU from ARCH."
-			return 1
-	esac
-
-	# The following code uses sudo to generate the font-cache.  It is almost
-	# always not a good idea to use sudo in your ebuild.  This ebuild is an
-	# exception for the following reasons:
-	#
-	# - fc-cache was designed with the generic linux distribution use case
-	#   in mind where package maintainers have no idea what fonts are actually
-	#   installed on the system.  As a result fc-cache operates directly on
-	#   the target file system and needs permission to modify its cache
-	#   directory (/usr/share/cache/fontconfig), which is owned by root.
-	# - When cross-compiling, the generated font caches need to be compatible
-	#   with the architecture on which they will be used.  To properly do
-	#   this, we need to run the architecture appropriate copy of fc-cache,
-	#   which may link against other arch-specific libraries, which means
-	#   we need to chroot it in the board sysroot and chrooting requires
-	#   root permissions.
-	#
-	# By themselves the above two reasons are not sufficient to justify
-	# using sudo in the ebuild.  What makes this OK is that fc-cache takes
-	# a really long time when run under qemu for ARM (4 - 7 minutes), which
-	# is a very large percentage of the overall time spent in build_image.
-	# It doesn't make sense to force each developer to spend a bunch of time
-	# generating the exact same font cache on their machine every time they
-	# want to build an image.  And even then, we can only do this because
-	# chromeos-fonts is a specialized ebuild for chrome os only.
-	#
-	# All of which is to say: don't use sudo in your ebuild.  You have been
-	# warned.  -- chirantan
-
-	local chroot_dir="${WORKDIR#${SYSROOT}}"
-	if ! cp "/usr/bin/${qemu[0]}" "${WORKDIR}"; then
-		eerror "Failed to copy /usr/bin/${qemu[0]} -> ${WORKDIR}"
-		return 1
-	fi
-	if ! sudo chroot "${SYSROOT}" "${chroot_dir}/${qemu[0]}" "${qemu[@]:1}" "$@"; then
-		eerror "Failed to run QEMU (args $*)"
-		return 1
-	fi
-	if ! rm "${WORKDIR}/${qemu[0]}"; then
-		eerror "Failed to clean up QEMU"
-		return 1
-	fi
-}
-
+# The following code uses sudo to generate the font-cache.  It is almost
+# always not a good idea to use sudo in your ebuild.  This ebuild is an
+# exception for the following reasons:
+#
+# - fc-cache was designed with the generic linux distribution use case
+#   in mind where package maintainers have no idea what fonts are actually
+#   installed on the system.  As a result fc-cache operates directly on
+#   the target file system and needs permission to modify its cache
+#   directory (/usr/share/cache/fontconfig).
+# - /usr/share/cache/fontconfig normally is owned by root, but for various
+#   reasons, we bind mount our own work directory on top of it. The bind
+#   mounting requires root privileges.
+# - When cross-compiling, the generated font caches need to be compatible
+#   with the architecture on which they will be used.  To properly do
+#   this, we need to run the architecture appropriate copy of fc-cache,
+#   which may link against other arch-specific libraries, which means
+#   we need to chroot it in the board sysroot and chrooting requires
+#   root permissions.
+#
+# By themselves the above reasons are not sufficient to justify using sudo in
+# the ebuild.  What makes this OK is that fc-cache takes a really long time
+# when run under qemu for ARM (4 - 7 minutes), which is a very large percentage
+# of the overall time spent in build_image. It doesn't make sense to force each
+# developer to spend a bunch of time generating the exact same font cache on
+# their machine every time they want to build an image.  And even then, we can
+# only do this because chromeos-fonts is a specialized ebuild for Chrome OS
+# only.
+#
+# All of which is to say: don't use sudo in your ebuild.  You have been
+# warned.  -- chirantan
 generate_font_cache() {
-	# Bind mount over the cache directory so that we don't scribble over the
-	# $SYSROOT.  Same warning as above applies: don't use sudo in your ebuild.
-	mkdir -p "${WORKDIR}/out"
-	if grep -q "${SYSROOT%/}/usr/share/cache/fontconfig" /proc/mounts; then
-		sudo umount "${SYSROOT}/usr/share/cache/fontconfig" || die
-	fi
-	sudo mount --bind "${WORKDIR}/out" "${SYSROOT}/usr/share/cache/fontconfig" || die
+	mkdir -p "${WORKDIR}/out" || die
 
-	# If we're running directly on the target (e.g. gmerge), we don't need
-	# to chroot or use qemu. Don't 'die' on errors so we can clean up the
-	# bind mount even if fc-cache fails.
-	if [[ "${SYSROOT:-/}" == "/" ]]; then
-		sudo /usr/bin/fc-cache -f -v
-	elif [[ "${ARCH}" == "amd64" ]]; then
-		# Uses the host's fc-cache binary to build the font
-		# cache on the target.
-		sudo /usr/bin/fc-cache --sysroot="${SYSROOT}" -f -v
+	# Run fc-cache in a mount namespace, to handle isolation and graceful
+	# cleanup.
+	#
+	# platform2_test: helpful because it's a pain to open-code QEMU usage
+	#   (needed for ARCHes that don't match the build system).
+	# minijail0: helpful because platform2_test does not provide custom
+	#   bind-mounting facilities.
+	#   -v: mount namespace
+	#   -K: don't change root mount propagation (not possible in a chroot,
+	#     where chroot isn't a mount)
+	#   -k ... 0x5000: MS_BIND|MS_PRIVATE
+	local jail_args=(
+		-vK
+		-k "${WORKDIR}/out,${SYSROOT}/usr/share/cache/fontconfig,none,0x5000"
+	)
+	if [[ "${ARCH}" == "amd64" ]]; then
+		# Special-case for amd64: the target ISA may not match our
+		# build host (so we can't run natively;
+		# https://crbug.com/856686), and we may not have QEMU support
+		# for the full ISA either. Just run the SDK binary instead.
+		sudo minijail0 "${jail_args[@]}" \
+			/usr/bin/fc-cache -f -v --sysroot "${SYSROOT:-/}" || die
+
 	else
-		qemu_run /usr/bin/fc-cache -f -v
+		sudo minijail0 "${jail_args[@]}" \
+			"${CHROOT_SOURCE_ROOT}"/src/platform2/common-mk/platform2_test.py \
+			--sysroot "${SYSROOT}" -- /usr/bin/fc-cache -f -v || die
 	fi
-	local retval=$?
-
-	sudo umount "${SYSROOT}/usr/share/cache/fontconfig" || die
-	[[ ${retval} == 0 ]] || die "fc-cache failed"
 }
 
 # TODO(cjmcdonald): crbug/913317 These .uuid files need to exist when fc-cache
diff --git a/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-0.0.1-r181.ebuild b/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-0.0.1-r181.ebuild
new file mode 100644
index 0000000..81971d7
--- /dev/null
+++ b/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-0.0.1-r181.ebuild
@@ -0,0 +1,66 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE.makefile file.
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 1
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("54a10bd3295c065c146931a51284252da606f945" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/cryptoc"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/ec"
+	"third_party/cryptoc"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/cryptoc"
+)
+
+inherit coreboot-sdk cros-ec cros-workon
+
+DESCRIPTION="ChromeOS fingerprint MCU unittest binaries"
+KEYWORDS="*"
+
+# Make sure config tools use the latest schema.
+BDEPEND=">=chromeos-base/chromeos-config-host-0.0.2"
+
+get_target_boards() {
+	# TODO(yichengli): Add other FPMCUs once the test lab has them.
+	EC_BOARDS=("bloonchipper")
+}
+
+src_compile() {
+	cros-ec_set_build_env
+	get_target_boards
+
+	# TODO(yichengli): Add other FPMCU boards once the test lab has them.
+	local target
+	einfo "Building FPMCU unittest binary for targets: ${EC_BOARDS[*]}"
+	for target in "${EC_BOARDS[@]}"; do
+		emake CROSS_COMPILE="${COREBOOT_SDK_PREFIX_arm}" BOARD="${target}" \
+			"${EC_OPTS[@]}" clean
+		emake CROSS_COMPILE="${COREBOOT_SDK_PREFIX_arm}" BOARD="${target}" \
+			"${EC_OPTS[@]}" test-rsa
+	done
+}
+
+src_install() {
+	local target
+	for target in "${EC_BOARDS[@]}"; do
+		insinto /firmware/chromeos-fpmcu-unittests/"${target}"
+		doins build/"${target}"/*.bin
+	done
+}
+
+# Do not run cros-ec's tests.
+src_test() {
+	:
+}
diff --git a/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-9999.ebuild b/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-9999.ebuild
new file mode 100644
index 0000000..376fcc8
--- /dev/null
+++ b/chromeos-base/chromeos-fpmcu-unittests/chromeos-fpmcu-unittests-9999.ebuild
@@ -0,0 +1,64 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE.makefile file.
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 1
+
+EAPI=7
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/cryptoc"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/ec"
+	"third_party/cryptoc"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/cryptoc"
+)
+
+inherit coreboot-sdk cros-ec cros-workon
+
+DESCRIPTION="ChromeOS fingerprint MCU unittest binaries"
+KEYWORDS="~*"
+
+# Make sure config tools use the latest schema.
+BDEPEND=">=chromeos-base/chromeos-config-host-0.0.2"
+
+get_target_boards() {
+	# TODO(yichengli): Add other FPMCUs once the test lab has them.
+	EC_BOARDS=("bloonchipper")
+}
+
+src_compile() {
+	cros-ec_set_build_env
+	get_target_boards
+
+	# TODO(yichengli): Add other FPMCU boards once the test lab has them.
+	local target
+	einfo "Building FPMCU unittest binary for targets: ${EC_BOARDS[*]}"
+	for target in "${EC_BOARDS[@]}"; do
+		emake CROSS_COMPILE="${COREBOOT_SDK_PREFIX_arm}" BOARD="${target}" \
+			"${EC_OPTS[@]}" clean
+		emake CROSS_COMPILE="${COREBOOT_SDK_PREFIX_arm}" BOARD="${target}" \
+			"${EC_OPTS[@]}" test-rsa
+	done
+}
+
+src_install() {
+	local target
+	for target in "${EC_BOARDS[@]}"; do
+		insinto /firmware/chromeos-fpmcu-unittests/"${target}"
+		doins build/"${target}"/*.bin
+	done
+}
+
+# Do not run cros-ec's tests.
+src_test() {
+	:
+}
diff --git a/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3053.ebuild b/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3053.ebuild
deleted file mode 100644
index 9c295eb..0000000
--- a/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3053.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="8e30ee31d083e282a1068d5e79434439545ccea6"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "eb6a1368254e9a5e5f787ae6021b67abeddd3202" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk image-burner .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="image-burner"
-
-inherit cros-workon platform
-
-DESCRIPTION="Image-burning service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/image-burner/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	dev-libs/dbus-glib
-	dev-libs/glib
-	sys-apps/rootdev
-"
-DEPEND="${RDEPEND}
-	chromeos-base/system_api
-"
-
-src_install() {
-	dosbin "${OUT}"/image_burner
-
-	insinto /etc/dbus-1/system.d
-	doins ImageBurner.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins org.chromium.ImageBurner.service
-
-	insinto /etc/init
-	doins init/image-burner.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/unittest_runner"
-}
diff --git a/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3075.ebuild b/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3075.ebuild
new file mode 100644
index 0000000..176cc03
--- /dev/null
+++ b/chromeos-base/chromeos-imageburner/chromeos-imageburner-0.0.1-r3075.ebuild
@@ -0,0 +1,50 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "6d93bab895204ff24f1f087d6fd21737af87b549" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk image-burner .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="image-burner"
+
+inherit cros-workon platform
+
+DESCRIPTION="Image-burning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/image-burner/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	dev-libs/dbus-glib
+	dev-libs/glib
+	sys-apps/rootdev
+"
+DEPEND="${RDEPEND}
+	chromeos-base/system_api
+"
+
+src_install() {
+	dosbin "${OUT}"/image_burner
+
+	insinto /etc/dbus-1/system.d
+	doins ImageBurner.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins org.chromium.ImageBurner.service
+
+	insinto /etc/init
+	doins init/image-burner.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/unittest_runner"
+}
diff --git a/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4073.ebuild b/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4073.ebuild
deleted file mode 100644
index 890e455..0000000
--- a/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4073.ebuild
+++ /dev/null
@@ -1,216 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="a1b9a034138b73293749ad546a885d23ddba5f82"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d0d05330543de0caf86430a4fbe8a1ead43a14a0" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid #include-ing platform2 headers directly.
-CROS_WORKON_SUBTREE="common-mk init metrics .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="init"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Upstart init scripts for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/init/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="
-	arcpp arcvm cros_embedded +debugd +encrypted_stateful frecon
-	kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi
-	-s3halt +syslog systemd +udev vivid vtconsole"
-
-# secure-erase-file, vboot_reference, and rootdev are needed for clobber-state.
-COMMON_DEPEND="
-	chromeos-base/metrics:=
-	chromeos-base/secure-erase-file:=
-	chromeos-base/vboot_reference:=
-	sys-apps/rootdev:=
-"
-
-DEPEND="${COMMON_DEPEND}
-	test? (
-		sys-process/psmisc
-		dev-util/shunit2
-		sys-apps/diffutils
-	)
-"
-
-RDEPEND="${COMMON_DEPEND}
-	app-arch/tar
-	app-misc/jq
-	chromeos-base/bootstat
-	!chromeos-base/chromeos-disableecho
-	chromeos-base/chromeos-common-script
-	chromeos-base/tty
-	sys-apps/upstart
-	sys-process/lsof
-	virtual/chromeos-bootcomplete
-	!cros_embedded? (
-		chromeos-base/common-assets
-		chromeos-base/chromeos-storage-info
-		chromeos-base/swap-init
-		sys-fs/e2fsprogs
-	)
-	frecon? (
-		sys-apps/frecon
-	)
-"
-
-platform_pkg_test() {
-	local shell_tests=(
-		killers_unittest
-		tests/chromeos-disk-metrics-test.sh
-		tests/send-kernel-errors-test.sh
-	)
-
-	local test_bin
-	for test_bin in "${shell_tests[@]}"; do
-		platform_test "run" "./${test_bin}"
-	done
-
-	local cpp_tests=(
-		clobber_state_test
-		file_attrs_cleaner_test
-		periodic_scheduler_test
-		usermode-helper_test
-	)
-
-	for test_bin in "${cpp_tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
-src_install_upstart() {
-	insinto /etc/init
-
-	if use cros_embedded; then
-		doins upstart/startup.conf
-		doins upstart/embedded-init/boot-services.conf
-
-		doins upstart/report-boot-complete.conf
-		doins upstart/failsafe-delay.conf upstart/failsafe.conf
-		doins upstart/pre-shutdown.conf upstart/pre-startup.conf
-		doins upstart/pstore.conf upstart/reboot.conf
-		doins upstart/system-services.conf
-		doins upstart/uinput.conf
-		doins upstart/sysrq-init.conf
-
-		if use syslog; then
-			doins upstart/log-rotate.conf upstart/syslog.conf upstart/journald.conf
-		fi
-		if use !systemd; then
-			doins upstart/cgroups.conf
-			doins upstart/dbus.conf
-			if use udev; then
-				doins upstart/udev.conf upstart/udev-trigger.conf
-				doins upstart/udev-trigger-early.conf
-			fi
-		fi
-		if use frecon; then
-			doins upstart/boot-splash.conf
-		fi
-	else
-		doins upstart/*.conf
-
-		if ! use arcpp && use arcvm; then
-			sed -i '/^env IS_ARCVM=/s:=0:=1:' \
-				"${D}/etc/init/rt-limits.conf" || \
-				die "Failed to replace is_arcvm in rt-limits.conf"
-		fi
-
-		dosbin chromeos-disk-metrics
-		dosbin chromeos-send-kernel-errors
-		dosbin display_low_battery_alert
-	fi
-
-	if ! use debugd; then
-		sed -i '/^env PSTORE_GROUP=/s:=.*:=root:' \
-			"${D}/etc/init/pstore.conf" || \
-			die "Failed to replace PSTORE_GROUP in pstore.conf"
-	fi
-
-	if use midi; then
-		if use kernel-3_8 || use kernel-3_10 || use kernel-3_14 || use kernel-3_18; then
-			doins upstart/workaround-init/midi-workaround.conf
-		fi
-	fi
-
-	if use s3halt; then
-		newins upstart/halt/s3halt.conf halt.conf
-	else
-		doins upstart/halt/halt.conf
-	fi
-
-	if use vivid; then
-		doins upstart/vivid/vivid.conf
-	fi
-
-	use vtconsole && doins upstart/vtconsole/*.conf
-}
-
-src_install() {
-	# Install helper to run periodic tasks.
-	dobin "${OUT}"/periodic_scheduler
-
-	if use syslog; then
-		# Install log cleaning script and run it daily.
-		dosbin chromeos-cleanup-logs
-
-		insinto /etc
-		doins rsyslog.chromeos
-	fi
-
-	insinto /usr/share/cros
-	doins *_utils.sh
-
-	exeinto /usr/share/cros/init
-	doexe is_feature_enabled.sh
-
-	into /	# We want /sbin, not /usr/sbin, etc.
-
-	# Install various utility files.
-	dosbin killers
-
-	# Install various helper programs.
-	dosbin "${OUT}"/cros_sysrq_init
-	dosbin "${OUT}"/static_node_tool
-	dosbin "${OUT}"/net_poll_tool
-	dosbin "${OUT}"/file_attrs_cleaner_tool
-	dosbin "${OUT}"/usermode-helper
-
-	# Install startup/shutdown scripts.
-	dosbin chromeos_startup chromeos_shutdown
-
-	dosbin "${OUT}"/clobber-state
-
-	dosbin clobber-log
-	dosbin chromeos-boot-alert
-
-	# Install Upstart scripts.
-	src_install_upstart
-
-	insinto /usr/share/cros
-	doins $(usex encrypted_stateful encrypted_stateful \
-		unencrypted_stateful)/startup_utils.sh
-}
-
-pkg_preinst() {
-	# Add the syslog user
-	enewuser syslog
-	enewgroup syslog
-
-	# Create debugfs-access user and group, which is needed by the
-	# chromeos_startup script to mount /sys/kernel/debug.  This is needed
-	# by bootstat and ureadahead.
-	enewuser "debugfs-access"
-	enewgroup "debugfs-access"
-}
diff --git a/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4123.ebuild b/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4123.ebuild
new file mode 100644
index 0000000..77f2471
--- /dev/null
+++ b/chromeos-base/chromeos-init/chromeos-init-0.0.25-r4123.ebuild
@@ -0,0 +1,226 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "79d8199118fd10360cd65dcd53d67a89bb38dbe9" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid #include-ing platform2 headers directly.
+CROS_WORKON_SUBTREE="common-mk init metrics .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="init"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Upstart init scripts for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/init/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="
+	arcpp arcvm cros_embedded +debugd +encrypted_stateful +encrypted_reboot_vault
+	frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi
+	-s3halt +syslog systemd +udev vivid vtconsole"
+
+# secure-erase-file, vboot_reference, and rootdev are needed for clobber-state.
+COMMON_DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/secure-erase-file:=
+	chromeos-base/vboot_reference:=
+	sys-apps/rootdev:=
+"
+
+DEPEND="${COMMON_DEPEND}
+	test? (
+		sys-process/psmisc
+		dev-util/shunit2
+		sys-apps/diffutils
+	)
+"
+
+RDEPEND="${COMMON_DEPEND}
+	app-arch/tar
+	app-misc/jq
+	chromeos-base/bootstat
+	!chromeos-base/chromeos-disableecho
+	chromeos-base/chromeos-common-script
+	chromeos-base/tty
+	sys-apps/upstart
+	sys-process/lsof
+	virtual/chromeos-bootcomplete
+	!cros_embedded? (
+		chromeos-base/common-assets
+		chromeos-base/chromeos-storage-info
+		chromeos-base/swap-init
+		sys-fs/e2fsprogs
+	)
+	frecon? (
+		sys-apps/frecon
+	)
+"
+
+platform_pkg_test() {
+	local shell_tests=(
+		killers_unittest
+		tests/chromeos-disk-metrics-test.sh
+		tests/send-kernel-errors-test.sh
+	)
+
+	local test_bin
+	for test_bin in "${shell_tests[@]}"; do
+		platform_test "run" "./${test_bin}"
+	done
+
+	local cpp_tests=(
+		clobber_state_test
+		file_attrs_cleaner_test
+		periodic_scheduler_test
+		usermode-helper_test
+	)
+
+	for test_bin in "${cpp_tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
+src_install_upstart() {
+	insinto /etc/init
+
+	if use cros_embedded; then
+		doins upstart/startup.conf
+		doins upstart/embedded-init/boot-services.conf
+
+		doins upstart/report-boot-complete.conf
+		doins upstart/failsafe-delay.conf upstart/failsafe.conf
+		doins upstart/pre-shutdown.conf upstart/pre-startup.conf
+		doins upstart/pstore.conf upstart/reboot.conf
+		doins upstart/system-services.conf
+		doins upstart/uinput.conf
+		doins upstart/sysrq-init.conf
+		doins upstart/ext-pci-drivers-allowlist.conf
+
+		if use syslog; then
+			doins upstart/log-rotate.conf upstart/syslog.conf upstart/journald.conf
+		fi
+		if use !systemd; then
+			doins upstart/cgroups.conf
+			doins upstart/dbus.conf
+			if use udev; then
+				doins upstart/udev.conf upstart/udev-trigger.conf
+				doins upstart/udev-trigger-early.conf
+			fi
+		fi
+		if use frecon; then
+			doins upstart/boot-splash.conf
+		fi
+	else
+		doins upstart/*.conf
+
+		if ! use arcpp && use arcvm; then
+			sed -i '/^env IS_ARCVM=/s:=0:=1:' \
+				"${D}/etc/init/rt-limits.conf" || \
+				die "Failed to replace is_arcvm in rt-limits.conf"
+		fi
+
+		dosbin chromeos-disk-metrics
+		dosbin chromeos-send-kernel-errors
+		dosbin display_low_battery_alert
+	fi
+
+	if ! use debugd; then
+		sed -i '/^env PSTORE_GROUP=/s:=.*:=root:' \
+			"${D}/etc/init/pstore.conf" || \
+			die "Failed to replace PSTORE_GROUP in pstore.conf"
+	fi
+
+	if use midi; then
+		if use kernel-3_8 || use kernel-3_10 || use kernel-3_14 || use kernel-3_18; then
+			doins upstart/workaround-init/midi-workaround.conf
+		fi
+	fi
+
+	if use s3halt; then
+		newins upstart/halt/s3halt.conf halt.conf
+	else
+		doins upstart/halt/halt.conf
+	fi
+
+	if use vivid; then
+		doins upstart/vivid/vivid.conf
+	fi
+
+	use vtconsole && doins upstart/vtconsole/*.conf
+}
+
+src_install() {
+	# Install helper to run periodic tasks.
+	dobin "${OUT}"/periodic_scheduler
+
+	if use syslog; then
+		# Install log cleaning script and run it daily.
+		dosbin chromeos-cleanup-logs
+
+		insinto /etc
+		doins rsyslog.chromeos
+	fi
+
+	insinto /usr/share/cros
+	doins *_utils.sh
+
+	exeinto /usr/share/cros/init
+	doexe is_feature_enabled.sh
+
+	into /	# We want /sbin, not /usr/sbin, etc.
+
+	# Install various utility files.
+	dosbin killers
+
+	# Install various helper programs.
+	dosbin "${OUT}"/cros_sysrq_init
+	dosbin "${OUT}"/ext_pci_drivers_allowlist_init
+	dosbin "${OUT}"/static_node_tool
+	dosbin "${OUT}"/net_poll_tool
+	dosbin "${OUT}"/file_attrs_cleaner_tool
+	dosbin "${OUT}"/usermode-helper
+
+	# Install startup/shutdown scripts.
+	dosbin chromeos_startup chromeos_shutdown
+
+	# Disable encrypted reobot vault if it is not used.
+	if ! use encrypted_reboot_vault; then
+		sed -i '/USE_ENCRYPTED_REBOOT_VAULT=/s:=1:=0:' \
+			"${D}/sbin/chromeos_startup" ||
+			die "Failed to replace USE_ENCRYPTED_REBOOT_VAULT in chromeos_startup"
+	fi
+
+
+	dosbin "${OUT}"/clobber-state
+
+	dosbin clobber-log
+	dosbin chromeos-boot-alert
+
+	# Install Upstart scripts.
+	src_install_upstart
+
+	insinto /usr/share/cros
+	doins $(usex encrypted_stateful encrypted_stateful \
+		unencrypted_stateful)/startup_utils.sh
+}
+
+pkg_preinst() {
+	# Add the syslog user
+	enewuser syslog
+	enewgroup syslog
+
+	# Create debugfs-access user and group, which is needed by the
+	# chromeos_startup script to mount /sys/kernel/debug.  This is needed
+	# by bootstat and ureadahead.
+	enewuser "debugfs-access"
+	enewgroup "debugfs-access"
+}
diff --git a/chromeos-base/chromeos-init/chromeos-init-9999.ebuild b/chromeos-base/chromeos-init/chromeos-init-9999.ebuild
index 2c089cb..57d126c 100644
--- a/chromeos-base/chromeos-init/chromeos-init-9999.ebuild
+++ b/chromeos-base/chromeos-init/chromeos-init-9999.ebuild
@@ -22,13 +22,13 @@
 SLOT="0/0"
 KEYWORDS="~*"
 IUSE="
-	arcpp arcvm cros_embedded +debugd +encrypted_stateful frecon
-	kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi
+	arcpp arcvm cros_embedded +debugd +encrypted_stateful +encrypted_reboot_vault
+	frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi
 	-s3halt +syslog systemd +udev vivid vtconsole"
 
 # secure-erase-file, vboot_reference, and rootdev are needed for clobber-state.
 COMMON_DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/secure-erase-file:=
 	chromeos-base/vboot_reference:=
 	sys-apps/rootdev:=
@@ -101,6 +101,7 @@
 		doins upstart/system-services.conf
 		doins upstart/uinput.conf
 		doins upstart/sysrq-init.conf
+		doins upstart/ext-pci-drivers-allowlist.conf
 
 		if use syslog; then
 			doins upstart/log-rotate.conf upstart/syslog.conf upstart/journald.conf
@@ -180,6 +181,7 @@
 
 	# Install various helper programs.
 	dosbin "${OUT}"/cros_sysrq_init
+	dosbin "${OUT}"/ext_pci_drivers_allowlist_init
 	dosbin "${OUT}"/static_node_tool
 	dosbin "${OUT}"/net_poll_tool
 	dosbin "${OUT}"/file_attrs_cleaner_tool
@@ -188,6 +190,14 @@
 	# Install startup/shutdown scripts.
 	dosbin chromeos_startup chromeos_shutdown
 
+	# Disable encrypted reobot vault if it is not used.
+	if ! use encrypted_reboot_vault; then
+		sed -i '/USE_ENCRYPTED_REBOOT_VAULT=/s:=1:=0:' \
+			"${D}/sbin/chromeos_startup" ||
+			die "Failed to replace USE_ENCRYPTED_REBOOT_VAULT in chromeos_startup"
+	fi
+
+
 	dosbin "${OUT}"/clobber-state
 
 	dosbin clobber-log
diff --git a/chromeos-base/chromeos-initramfs/OWNERS b/chromeos-base/chromeos-initramfs/OWNERS
new file mode 100644
index 0000000..cbd6a79f
--- /dev/null
+++ b/chromeos-base/chromeos-initramfs/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform/initramfs:/OWNERS
diff --git a/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r357.ebuild b/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r357.ebuild
deleted file mode 100644
index 52f43d1..0000000
--- a/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r357.ebuild
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-CROS_WORKON_COMMIT="19afdd90cf661c89c2ece31dac83125a4d888239"
-CROS_WORKON_TREE="a1246866b542ce61b72b3a67c2ab4a1597d171c1"
-CROS_WORKON_PROJECT="chromiumos/platform/initramfs"
-CROS_WORKON_LOCALNAME="platform/initramfs"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-
-inherit cros-workon cros-board cros-constants
-
-DESCRIPTION="Create Chrome OS initramfs"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/initramfs/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+cros_ec_utils detachable device_tree +interactive_recovery"
-IUSE="${IUSE} menu_ui -mtd +power_management"
-IUSE="${IUSE} physical_presence_power physical_presence_recovery"
-IUSE="${IUSE} unibuild"
-
-# Build Targets
-TARGETS_IUSE="
-	factory_netboot_ramfs
-	factory_shim_ramfs
-	hypervisor_ramfs
-	recovery_ramfs
-"
-IUSE+=" ${TARGETS_IUSE}"
-REQUIRED_USE="|| ( ${TARGETS_IUSE} )"
-
-# Packages required for building recovery initramfs.
-RECOVERY_DEPENDS="
-	chromeos-base/chromeos-installer
-	chromeos-base/common-assets
-	chromeos-base/vboot_reference
-	chromeos-base/vpd
-	sys-apps/flashrom
-	sys-apps/pv
-	virtual/assets
-	virtual/chromeos-regions
-	"
-
-# Packages required for building factory installer shim initramfs.
-FACTORY_SHIM_DEPENDS="
-	chromeos-base/factory_installer
-	chromeos-base/vboot_reference
-	"
-
-# Packages required for building factory netboot installer initramfs.
-FACTORY_NETBOOT_DEPENDS="
-	app-arch/lbzip2
-	app-arch/pigz
-	app-arch/sharutils
-	app-misc/jq
-	app-shells/bash
-	chromeos-base/chromeos-base
-	chromeos-base/chromeos-installer
-	chromeos-base/chromeos-installshim
-	chromeos-base/chromeos-storage-info
-	chromeos-base/ec-utils
-	chromeos-base/factory_installer
-	chromeos-base/vboot_reference
-	chromeos-base/vpd
-	dev-libs/openssl:0=
-	dev-util/shflags
-	dev-util/xxd
-	net-misc/curl
-	net-misc/htpdate
-	net-misc/uftp
-	net-misc/wget
-	sys-apps/coreutils
-	sys-apps/flashrom
-	sys-apps/iproute2
-	sys-apps/mosys
-	sys-apps/util-linux
-	sys-block/parted
-	sys-fs/dosfstools
-	sys-fs/e2fsprogs
-	sys-libs/ncurses
-	virtual/udev
-	"
-
-# Packages required for building hypervisor initramfs.
-HYPERVISOR_DEPENDS="
-	app-emulation/qemu
-	virtual/linux-sources
-	"
-
-DEPEND="
-	factory_netboot_ramfs? ( ${FACTORY_NETBOOT_DEPENDS} )
-	factory_shim_ramfs? ( ${FACTORY_SHIM_DEPENDS} )
-	recovery_ramfs? ( ${RECOVERY_DEPENDS} )
-	hypervisor_ramfs? ( ${HYPERVISOR_DEPENDS} )
-	sys-apps/busybox[-make-symlinks]
-	sys-fs/lvm2
-	virtual/chromeos-bsp-initramfs
-	chromeos-base/chromeos-init
-	sys-apps/frecon-lite
-	power_management? ( chromeos-base/power_manager )
-	unibuild? ( chromeos-base/chromeos-config )
-	chromeos-base/chromeos-config-tools"
-
-RDEPEND=""
-
-src_prepare() {
-	export BUILD_LIBRARY_DIR="${CHROOT_SOURCE_ROOT}/src/scripts/build_library"
-	export INTERACTIVE_COMPLETE="$(usex interactive_recovery true false)"
-
-	# Need the lddtree from the chromite dir.
-	export PATH="${CHROMITE_BIN_DIR}:${PATH}"
-
-	eapply_user
-}
-
-src_compile() {
-	local deps=()
-	use mtd && deps+=(/usr/bin/cgpt)
-	if use factory_netboot_ramfs; then
-		use power_management && deps+=(/usr/bin/backlight_tool)
-	fi
-
-	local targets=()
-	for target in ${TARGETS_IUSE}; do
-		use "${target}" && targets+=("${target%_ramfs}")
-	done
-	einfo "Building targets: ${targets[*]}"
-
-	local physical_presence
-	if use physical_presence_power ; then
-		physical_presence="power"
-	elif use physical_presence_recovery ; then
-		physical_presence="recovery"
-	else
-		physical_presence="keyboard"
-	fi
-
-	emake SYSROOT="${SYSROOT}" BOARD="$(get_current_board_with_variant)" \
-		INCLUDE_FIT_PICKER="$(usex device_tree 1 0)" \
-		INCLUDE_ECTOOL="$(usex cros_ec_utils 1 0)" \
-		DETACHABLE="$(usex detachable 1 0)" \
-		MENU_UI="$(usex menu_ui 1 0)" \
-		UNIBUILD="$(usex unibuild 1 0)" \
-		PHYSICAL_PRESENCE="${physical_presence}" \
-		OUTPUT_DIR="${WORKDIR}" EXTRA_BIN_DEPS="${deps[*]}" \
-		LOCALE_LIST="${RECOVERY_LOCALES}" "${targets[@]}"
-}
-
-src_install() {
-	insinto /var/lib/initramfs
-	for target in ${TARGETS_IUSE}; do
-		use "${target}" &&
-			doins "${WORKDIR}/${target}.cpio.xz"
-	done
-}
diff --git a/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r373.ebuild b/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r373.ebuild
new file mode 100644
index 0000000..ae866f7
--- /dev/null
+++ b/chromeos-base/chromeos-initramfs/chromeos-initramfs-0.0.1-r373.ebuild
@@ -0,0 +1,158 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+CROS_WORKON_COMMIT="0eb486956503fe8a5adc4520c311e25a5bb37561"
+CROS_WORKON_TREE="45dfea0fe9ae5afd06db7dab5b638db52dd22ea0"
+CROS_WORKON_PROJECT="chromiumos/platform/initramfs"
+CROS_WORKON_LOCALNAME="platform/initramfs"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+
+inherit cros-workon cros-board cros-constants
+
+DESCRIPTION="Create Chrome OS initramfs"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/initramfs/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+cros_ec_utils detachable device_tree +interactive_recovery"
+IUSE="${IUSE} menu_ui -mtd +power_management"
+IUSE="${IUSE} physical_presence_power physical_presence_recovery"
+IUSE="${IUSE} unibuild"
+
+# Build Targets
+TARGETS_IUSE="
+	factory_netboot_ramfs
+	factory_shim_ramfs
+	hypervisor_ramfs
+	recovery_ramfs
+"
+IUSE+=" ${TARGETS_IUSE}"
+REQUIRED_USE="|| ( ${TARGETS_IUSE} )"
+
+# Packages required for building recovery initramfs.
+RECOVERY_DEPENDS="
+	chromeos-base/chromeos-installer
+	chromeos-base/common-assets
+	chromeos-base/vboot_reference
+	chromeos-base/vpd
+	sys-apps/flashrom
+	sys-apps/pv
+	virtual/assets
+	virtual/chromeos-regions
+	"
+
+# Packages required for building factory installer shim initramfs.
+FACTORY_SHIM_DEPENDS="
+	chromeos-base/factory_installer
+	chromeos-base/vboot_reference
+	"
+
+# Packages required for building factory netboot installer initramfs.
+FACTORY_NETBOOT_DEPENDS="
+	app-arch/lbzip2
+	app-arch/pigz
+	app-arch/sharutils
+	app-misc/jq
+	app-shells/bash
+	chromeos-base/chromeos-base
+	chromeos-base/chromeos-installer
+	chromeos-base/chromeos-installshim
+	chromeos-base/chromeos-storage-info
+	chromeos-base/ec-utils
+	chromeos-base/factory_installer
+	chromeos-base/vboot_reference
+	chromeos-base/vpd
+	dev-libs/openssl:0=
+	dev-util/shflags
+	dev-util/xxd
+	net-misc/curl
+	net-misc/htpdate
+	net-misc/uftp
+	net-misc/wget
+	sys-apps/coreutils
+	sys-apps/flashrom
+	sys-apps/iproute2
+	sys-apps/mosys
+	sys-apps/util-linux
+	sys-block/parted
+	sys-fs/dosfstools
+	sys-fs/e2fsprogs
+	sys-libs/ncurses
+	virtual/udev
+	"
+
+# Packages required for building hypervisor initramfs.
+HYPERVISOR_DEPENDS="
+	chromeos-base/crosvm
+	chromeos-base/sirenia
+	virtual/linux-sources
+	"
+
+DEPEND="
+	factory_netboot_ramfs? ( ${FACTORY_NETBOOT_DEPENDS} )
+	factory_shim_ramfs? ( ${FACTORY_SHIM_DEPENDS} )
+	recovery_ramfs? ( ${RECOVERY_DEPENDS} )
+	hypervisor_ramfs? ( ${HYPERVISOR_DEPENDS} )
+	sys-apps/busybox[-make-symlinks]
+	sys-fs/lvm2
+	virtual/chromeos-bsp-initramfs
+	chromeos-base/chromeos-init
+	sys-apps/frecon-lite
+	power_management? ( chromeos-base/power_manager )
+	unibuild? ( chromeos-base/chromeos-config )
+	chromeos-base/chromeos-config-tools"
+
+RDEPEND=""
+
+src_prepare() {
+	export BUILD_LIBRARY_DIR="${CHROOT_SOURCE_ROOT}/src/scripts/build_library"
+	export INTERACTIVE_COMPLETE="$(usex interactive_recovery true false)"
+
+	# Need the lddtree from the chromite dir.
+	export PATH="${CHROMITE_BIN_DIR}:${PATH}"
+
+	eapply_user
+}
+
+src_compile() {
+	local deps=()
+	use mtd && deps+=(/usr/bin/cgpt)
+	if use factory_netboot_ramfs; then
+		use power_management && deps+=(/usr/bin/backlight_tool)
+	fi
+
+	local targets=()
+	for target in ${TARGETS_IUSE}; do
+		use "${target}" && targets+=("${target%_ramfs}")
+	done
+	einfo "Building targets: ${targets[*]}"
+
+	local physical_presence
+	if use physical_presence_power ; then
+		physical_presence="power"
+	elif use physical_presence_recovery ; then
+		physical_presence="recovery"
+	else
+		physical_presence="keyboard"
+	fi
+
+	emake SYSROOT="${SYSROOT}" BOARD="$(get_current_board_with_variant)" \
+		INCLUDE_FIT_PICKER="$(usex device_tree 1 0)" \
+		INCLUDE_ECTOOL="$(usex cros_ec_utils 1 0)" \
+		DETACHABLE="$(usex detachable 1 0)" \
+		MENU_UI="$(usex menu_ui 1 0)" \
+		UNIBUILD="$(usex unibuild 1 0)" \
+		PHYSICAL_PRESENCE="${physical_presence}" \
+		OUTPUT_DIR="${WORKDIR}" EXTRA_BIN_DEPS="${deps[*]}" \
+		LOCALE_LIST="${RECOVERY_LOCALES}" "${targets[@]}"
+}
+
+src_install() {
+	insinto /var/lib/initramfs
+	for target in ${TARGETS_IUSE}; do
+		use "${target}" &&
+			doins "${WORKDIR}/${target}.cpio.xz"
+	done
+}
diff --git a/chromeos-base/chromeos-initramfs/chromeos-initramfs-9999.ebuild b/chromeos-base/chromeos-initramfs/chromeos-initramfs-9999.ebuild
index 40a3065..8dac695 100644
--- a/chromeos-base/chromeos-initramfs/chromeos-initramfs-9999.ebuild
+++ b/chromeos-base/chromeos-initramfs/chromeos-initramfs-9999.ebuild
@@ -83,7 +83,8 @@
 
 # Packages required for building hypervisor initramfs.
 HYPERVISOR_DEPENDS="
-	app-emulation/qemu
+	chromeos-base/crosvm
+	chromeos-base/sirenia
 	virtual/linux-sources
 	"
 
diff --git a/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3381.ebuild b/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3381.ebuild
deleted file mode 100644
index 6953a19..0000000
--- a/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3381.ebuild
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "3a608885c9d4dc5bc5fee48f1bac2c54e75363e1" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk installer .gn"
-
-PLATFORM_SUBDIR="installer"
-
-inherit cros-workon platform systemd
-
-DESCRIPTION="Chrome OS Installer"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/installer/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_embedded cros_host enable_slow_boot_notify -mtd pam systemd test +oobe_config"
-
-COMMON_DEPEND="
-	chromeos-base/libbrillo:=
-	chromeos-base/vboot_reference
-"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/verity
-	dev-libs/openssl:0=
-"
-
-RDEPEND="${COMMON_DEPEND}
-	pam? ( app-admin/sudo )
-	chromeos-base/chromeos-common-script
-	!cros_host? (
-		!cros_embedded? ( chromeos-base/chromeos-storage-info )
-		oobe_config? ( chromeos-base/oobe_config )
-		dev-libs/openssl:0=
-	)
-	dev-util/shflags
-	sys-apps/rootdev
-	sys-apps/util-linux
-	sys-apps/which
-	sys-fs/e2fsprogs"
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/cros_installer_test"
-}
-
-src_install() {
-	if use cros_host ; then
-		dosbin chromeos-install
-	else
-		dobin "${OUT}"/{cros_installer,cros_oobe_crypto}
-		if use mtd ; then
-			dobin "${OUT}"/nand_partition
-		fi
-		dosbin chromeos-* encrypted_import "${OUT}"/evwaitkey
-		dosym usr/sbin/chromeos-postinst /postinst
-
-		# Install init scripts.
-		if use systemd; then
-			systemd_dounit init/install-completed.service
-			systemd_enable_service boot-services.target install-completed.service
-			systemd_dounit init/crx-import.service
-			systemd_enable_service system-services.target crx-import.service
-		else
-			insinto /etc/init
-			doins init/*.conf
-		fi
-		exeinto /usr/share/cros/init
-		doexe init/crx-import.sh
-	fi
-}
diff --git a/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3412.ebuild b/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3412.ebuild
new file mode 100644
index 0000000..761a879
--- /dev/null
+++ b/chromeos-base/chromeos-installer/chromeos-installer-0.0.3-r3412.ebuild
@@ -0,0 +1,80 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e9e3cf94b89dd01fc63d895c603e52eb316c513f" "78f05413fa5932fd3644b2dc70442ba3f39fcbf0" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk installer verity .gn"
+
+PLATFORM_SUBDIR="installer"
+
+inherit cros-workon platform systemd
+
+DESCRIPTION="Chrome OS Installer"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/installer/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_embedded cros_host enable_slow_boot_notify -mtd pam systemd test +oobe_config"
+
+COMMON_DEPEND="
+	chromeos-base/libbrillo:=
+	chromeos-base/vboot_reference
+"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/verity
+	dev-libs/openssl:0=
+"
+
+RDEPEND="${COMMON_DEPEND}
+	pam? ( app-admin/sudo )
+	chromeos-base/chromeos-common-script
+	!cros_host? (
+		!cros_embedded? ( chromeos-base/chromeos-storage-info )
+		oobe_config? ( chromeos-base/oobe_config )
+		dev-libs/openssl:0=
+	)
+	dev-util/shflags
+	sys-apps/rootdev
+	sys-apps/util-linux
+	sys-apps/which
+	sys-fs/e2fsprogs"
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/cros_installer_test"
+}
+
+src_install() {
+	if use cros_host ; then
+		dosbin chromeos-install
+	else
+		dobin "${OUT}"/{cros_installer,cros_oobe_crypto}
+		if use mtd ; then
+			dobin "${OUT}"/nand_partition
+		fi
+		dosbin chromeos-* encrypted_import "${OUT}"/evwaitkey
+		dosym usr/sbin/chromeos-postinst /postinst
+
+		# Install init scripts.
+		if use systemd; then
+			systemd_dounit init/install-completed.service
+			systemd_enable_service boot-services.target install-completed.service
+			systemd_dounit init/crx-import.service
+			systemd_enable_service system-services.target crx-import.service
+		else
+			insinto /etc/init
+			doins init/*.conf
+		fi
+		exeinto /usr/share/cros/init
+		doexe init/crx-import.sh
+	fi
+}
diff --git a/chromeos-base/chromeos-installer/chromeos-installer-9999.ebuild b/chromeos-base/chromeos-installer/chromeos-installer-9999.ebuild
index 0d779b5..e813c7b 100644
--- a/chromeos-base/chromeos-installer/chromeos-installer-9999.ebuild
+++ b/chromeos-base/chromeos-installer/chromeos-installer-9999.ebuild
@@ -7,7 +7,8 @@
 CROS_WORKON_LOCALNAME="platform2"
 CROS_WORKON_INCREMENTAL_BUILD=1
 CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk installer .gn"
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk installer verity .gn"
 
 PLATFORM_SUBDIR="installer"
 
diff --git a/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4406.ebuild b/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4406.ebuild
deleted file mode 100644
index 5853b01..0000000
--- a/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4406.ebuild
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "c0b816f19570ba7f0f522c1ff7a29bae14b8be22" "98c0db7e92836fcb71403a83973a9b5018fe6177" "d65bd168c3204d7f72956d41372c6e5e4f6509ee" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk chromeos-config libcontainer libpasswordprovider login_manager metrics .gn"
-
-PLATFORM_SUBDIR="login_manager"
-
-inherit cros-workon platform systemd user
-
-DESCRIPTION="Login manager for Chromium OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-login/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="arc_adb_sideloading cheets fuzzer generated_cros_config systemd unibuild user_session_isolation"
-
-COMMON_DEPEND="chromeos-base/bootstat:=
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	chromeos-base/chromeos-config-tools:=
-	chromeos-base/minijail:=
-	chromeos-base/cryptohome:=
-	chromeos-base/libchromeos-ui:=
-	chromeos-base/libcontainer:=
-	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
-	dev-libs/nss:=
-	dev-libs/protobuf:=
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-	sys-apps/util-linux:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	>=chromeos-base/protofiles-0.0.39:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/vboot_reference:=
-"
-
-pkg_preinst() {
-	enewgroup policy-readers
-}
-
-platform_pkg_test() {
-	local tests=( session_manager_test )
-
-	# Qemu doesn't support signalfd currently, and it's not clear how
-	# feasible it is to implement :(.
-	# So, filter out the tests that rely on signalfd().
-	local gtest_qemu_filter=""
-	if ! use x86 && ! use amd64; then
-		gtest_qemu_filter+="-ChildExitHandlerTest.*"
-		gtest_qemu_filter+=":SessionManagerProcessTest.*"
-	fi
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}" "0" "" "${gtest_qemu_filter}"
-	done
-}
-
-src_install() {
-	into /
-	dosbin "${OUT}/keygen"
-	dosbin "${OUT}/session_manager"
-
-	# Install DBus configuration.
-	insinto /usr/share/dbus-1/interfaces
-	doins dbus_bindings/org.chromium.SessionManagerInterface.xml
-
-	insinto /etc/dbus-1/system.d
-	doins SessionManager.conf
-
-	# Adding init scripts.
-	if use systemd; then
-		systemd_dounit init/systemd/*
-		systemd_enable_service x-started.target
-		systemd_enable_service multi-user.target ui.target
-		systemd_enable_service ui.target ui.service
-		systemd_enable_service ui.service machine-info.service
-		systemd_enable_service login-prompt-visible.target send-uptime-metrics.service
-		systemd_enable_service login-prompt-visible.target ui-init-late.service
-		systemd_enable_service start-user-session.target login.service
-		systemd_enable_service system-services.target ui-collect-machine-info.service
-	else
-		insinto /etc/init
-		doins init/upstart/*.conf
-	fi
-	exeinto /usr/share/cros/init/
-	doexe init/scripts/*
-
-	# For user session processes.
-	dodir /etc/skel/log
-
-	# For user NSS database
-	diropts -m0700
-	# Need to dodir each directory in order to get the opts right.
-	dodir /etc/skel/.pki
-	dodir /etc/skel/.pki/nssdb
-	# Yes, the created (empty) DB does work on ARM, x86 and x86_64.
-	certutil -N -d "sql:${D}/etc/skel/.pki/nssdb" -f <(echo '') || die
-
-	insinto /etc
-	doins chrome_dev.conf
-
-	# Create daemon store directories.
-	local daemon_store="/etc/daemon-store/session_manager"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners root:root "${daemon_store}"
-
-	local fuzzers=(
-		login_manager_validator_utils_fuzzer
-		login_manager_validator_utils_policy_desc_fuzzer
-	)
-
-	local fuzzer
-	for fuzzer in "${fuzzers[@]}"; do
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}/${fuzzer}"
-	done
-}
diff --git a/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4501.ebuild b/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4501.ebuild
new file mode 100644
index 0000000..80c88e1
--- /dev/null
+++ b/chromeos-base/chromeos-login/chromeos-login-0.0.2-r4501.ebuild
@@ -0,0 +1,137 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "04a8a0274b23f4bbf01eb2645630f252331db474" "377caa22e8416ce2388b9c099e85be393001947f" "e806dcb7edc3d4f31afb9edf7056156cbbc63273" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk chromeos-config libcontainer libpasswordprovider login_manager metrics .gn"
+
+PLATFORM_SUBDIR="login_manager"
+
+inherit cros-workon platform systemd user
+
+DESCRIPTION="Login manager for Chromium OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-login/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="arc_adb_sideloading cheets fuzzer generated_cros_config systemd unibuild user_session_isolation"
+
+COMMON_DEPEND="chromeos-base/bootstat:=
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	chromeos-base/chromeos-config-tools:=
+	chromeos-base/minijail:=
+	chromeos-base/cryptohome:=
+	chromeos-base/libchromeos-ui:=
+	chromeos-base/libcontainer:=
+	chromeos-base/libpasswordprovider:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/nss:=
+	dev-libs/protobuf:=
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+	sys-apps/util-linux:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	>=chromeos-base/protofiles-0.0.39:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/vboot_reference:=
+"
+
+pkg_preinst() {
+	enewgroup policy-readers
+}
+
+platform_pkg_test() {
+	local tests=( session_manager_test )
+
+	# Qemu doesn't support signalfd currently, and it's not clear how
+	# feasible it is to implement :(.
+	# So, filter out the tests that rely on signalfd().
+	local gtest_qemu_filter=""
+	if ! use x86 && ! use amd64; then
+		gtest_qemu_filter+="-ChildExitHandlerTest.*"
+		gtest_qemu_filter+=":SessionManagerProcessTest.*"
+	fi
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}" "0" "" "${gtest_qemu_filter}"
+	done
+}
+
+src_install() {
+	into /
+	dosbin "${OUT}/keygen"
+	dosbin "${OUT}/session_manager"
+
+	# Install DBus configuration.
+	insinto /usr/share/dbus-1/interfaces
+	doins dbus_bindings/org.chromium.SessionManagerInterface.xml
+
+	insinto /etc/dbus-1/system.d
+	doins SessionManager.conf
+
+	# Adding init scripts.
+	if use systemd; then
+		systemd_dounit init/systemd/*
+		systemd_enable_service x-started.target
+		systemd_enable_service multi-user.target ui.target
+		systemd_enable_service ui.target ui.service
+		systemd_enable_service ui.service machine-info.service
+		systemd_enable_service login-prompt-visible.target send-uptime-metrics.service
+		systemd_enable_service login-prompt-visible.target ui-init-late.service
+		systemd_enable_service start-user-session.target login.service
+		systemd_enable_service system-services.target ui-collect-machine-info.service
+	else
+		insinto /etc/init
+		doins init/upstart/*.conf
+	fi
+	exeinto /usr/share/cros/init/
+	doexe init/scripts/*
+
+	# For user session processes.
+	dodir /etc/skel/log
+
+	# For user NSS database
+	diropts -m0700
+	# Need to dodir each directory in order to get the opts right.
+	dodir /etc/skel/.pki
+	dodir /etc/skel/.pki/nssdb
+	# Yes, the created (empty) DB does work on ARM, x86 and x86_64.
+	certutil -N -d "sql:${D}/etc/skel/.pki/nssdb" -f <(echo '') || die
+
+	insinto /etc
+	doins chrome_dev.conf
+
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_*
+
+	# Create daemon store directories.
+	local daemon_store="/etc/daemon-store/session_manager"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners root:root "${daemon_store}"
+
+	local fuzzers=(
+		login_manager_validator_utils_fuzzer
+		login_manager_validator_utils_policy_desc_fuzzer
+	)
+
+	local fuzzer
+	for fuzzer in "${fuzzers[@]}"; do
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}/${fuzzer}"
+	done
+}
diff --git a/chromeos-base/chromeos-login/chromeos-login-9999.ebuild b/chromeos-base/chromeos-login/chromeos-login-9999.ebuild
index eea732c..1f9126d 100644
--- a/chromeos-base/chromeos-login/chromeos-login-9999.ebuild
+++ b/chromeos-base/chromeos-login/chromeos-login-9999.ebuild
@@ -33,7 +33,7 @@
 	chromeos-base/libchromeos-ui:=
 	chromeos-base/libcontainer:=
 	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/nss:=
 	dev-libs/protobuf:=
 	fuzzer? ( dev-libs/libprotobuf-mutator:= )
@@ -114,6 +114,9 @@
 	insinto /etc
 	doins chrome_dev.conf
 
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_*
+
 	# Create daemon store directories.
 	local daemon_store="/etc/daemon-store/session_manager"
 	dodir "${daemon_store}"
diff --git a/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r1.ebuild b/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r1.ebuild
deleted file mode 100644
index 0b950a4..0000000
--- a/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r1.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the BSD license.
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="eb90a4df54f5837a9ba585b72858c5620a7364b2"
-CROS_WORKON_TREE="809788aa7ecc2503360f53644223a0b1398403e0"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="chromeos-nvt-tcon-updater"
-
-inherit cros-workon user
-
-DESCRIPTION="Shell library for integrating the Novatek TCON Firmware updater"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/chromeos-init
-	chromeos-base/common-assets
-	chromeos-base/minijail
-	sys-apps/novatek-tcon-fw-update-tool
-"
-
-pkg_preinst() {
-	enewgroup fwupdate-drm_dp_aux-i2c
-	enewuser fwupdate-drm_dp_aux-i2c
-}
-
-src_install() {
-	insinto "/opt/google/tcon/policies"
-	doins chromeos-nvt-tcon-updater/policies/"${ARCH}"/nvt-tcon-fw-updater.update.policy
-
-	insinto "/opt/google/tcon/scripts"
-	doins chromeos-nvt-tcon-updater/scripts/chromeos-nvt-tcon-firmware-update.sh
-}
diff --git a/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r2.ebuild b/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r2.ebuild
new file mode 100644
index 0000000..48d643d
--- /dev/null
+++ b/chromeos-base/chromeos-nvt-tcon-updater/chromeos-nvt-tcon-updater-0.0.1-r2.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the BSD license.
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="f031e2d6a1c23615e945435faf4861f3da233ea8"
+CROS_WORKON_TREE="b349f1dab647f2028f8451aef030805eb8a13e64"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="chromeos-nvt-tcon-updater"
+
+inherit cros-workon user
+
+DESCRIPTION="Shell library for integrating the Novatek TCON Firmware updater"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/chromeos-init
+	chromeos-base/common-assets
+	chromeos-base/minijail
+	sys-apps/novatek-tcon-fw-update-tool
+"
+
+pkg_preinst() {
+	enewgroup fwupdate-drm_dp_aux-i2c
+	enewuser fwupdate-drm_dp_aux-i2c
+}
+
+src_install() {
+	insinto "/opt/google/tcon/policies"
+	doins chromeos-nvt-tcon-updater/policies/"${ARCH}"/nvt-tcon-fw-updater.update.policy
+
+	insinto "/opt/google/tcon/scripts"
+	doins chromeos-nvt-tcon-updater/scripts/chromeos-nvt-tcon-firmware-update.sh
+}
diff --git a/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r200.ebuild b/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r200.ebuild
deleted file mode 100644
index 17b6472..0000000
--- a/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r200.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "8d5d5e575da16bb48f735ef93feedcfae4b1586e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk storage_info .gn"
-
-PLATFORM_SUBDIR="storage_info"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS storage info tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/storage_info/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="+mmc nvme +sata test"
-
-DEPEND=""
-
-RDEPEND="${DEPEND}
-	chromeos-base/chromeos-common-script
-	!<chromeos-base/chromeos-installer-0.0.3
-	sata? ( sys-apps/hdparm sys-apps/smartmontools )
-	nvme? ( sys-apps/smartmontools )
-	mmc? ( sys-apps/mmc-utils )"
-
-platform_pkg_test() {
-	platform_test "run" "test/storage_info_unit_test"
-}
-
-src_install() {
-	insinto /usr/share/misc
-	doins share/storage-info-common.sh
-}
diff --git a/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r220.ebuild b/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r220.ebuild
new file mode 100644
index 0000000..6f81918
--- /dev/null
+++ b/chromeos-base/chromeos-storage-info/chromeos-storage-info-0.0.1-r220.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "8d5d5e575da16bb48f735ef93feedcfae4b1586e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk storage_info .gn"
+
+PLATFORM_SUBDIR="storage_info"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS storage info tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/storage_info/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="+mmc nvme +sata test"
+
+DEPEND=""
+
+RDEPEND="${DEPEND}
+	chromeos-base/chromeos-common-script
+	!<chromeos-base/chromeos-installer-0.0.3
+	sata? ( sys-apps/hdparm sys-apps/smartmontools )
+	nvme? ( sys-apps/smartmontools )
+	mmc? ( sys-apps/mmc-utils )"
+
+platform_pkg_test() {
+	platform_test "run" "test/storage_info_unit_test"
+}
+
+src_install() {
+	insinto /usr/share/misc
+	doins share/storage-info-common.sh
+}
diff --git a/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3155.ebuild b/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3155.ebuild
deleted file mode 100644
index 609b9c8..0000000
--- a/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3155.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-CROS_WORKON_COMMIT="16fc4ef243ca343956a9ff287fde729592ae8750"
-CROS_WORKON_TREE="26e984b6205ab9684bc709846aa1ac4659fdd7c2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="init/upstart/test-init"
-
-inherit cros-workon
-
-DESCRIPTION="Additional upstart jobs that will be installed on test images"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/init/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+encrypted_stateful tpm2"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/init"
-}
-
-src_install() {
-	insinto /etc/init
-	doins upstart/test-init/*.conf
-
-	insinto /usr/share/cros
-	doins upstart/test-init/*_utils.sh
-
-	if use encrypted_stateful && use tpm2; then
-		insinto /etc/init
-		doins upstart/test-init/encrypted_stateful/create-system-key.conf
-
-		insinto /usr/share/cros
-		doins upstart/test-init/encrypted_stateful/system_key_utils.sh
-	fi
-}
diff --git a/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3159.ebuild b/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3159.ebuild
new file mode 100644
index 0000000..2109987
--- /dev/null
+++ b/chromeos-base/chromeos-test-init/chromeos-test-init-0.0.1-r3159.ebuild
@@ -0,0 +1,45 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+CROS_WORKON_COMMIT="ef321a50f8e06a7bfb3439c21b2c2a7e0e7225ef"
+CROS_WORKON_TREE="2f29d2fb07aded06a517b2c828c25133d679de2d"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="init/upstart/test-init"
+
+inherit cros-workon
+
+DESCRIPTION="Additional upstart jobs that will be installed on test images"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/init/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+encrypted_stateful tpm2"
+
+# File cryptohome-dbus-perf.conf moved from hwsec-test-utils.
+RDEPEND="!<chromeos-base/hwsec-test-utils-0.0.1-r83"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/init"
+}
+
+src_install() {
+	insinto /etc/init
+	doins upstart/test-init/*.conf
+
+	insinto /usr/share/cros
+	doins upstart/test-init/*_utils.sh
+
+	if use encrypted_stateful && use tpm2; then
+		insinto /etc/init
+		doins upstart/test-init/encrypted_stateful/create-system-key.conf
+
+		insinto /usr/share/cros
+		doins upstart/test-init/encrypted_stateful/system_key_utils.sh
+	fi
+}
diff --git a/chromeos-base/chromeos-test-init/chromeos-test-init-9999.ebuild b/chromeos-base/chromeos-test-init/chromeos-test-init-9999.ebuild
index b40b324..2a8bc88 100644
--- a/chromeos-base/chromeos-test-init/chromeos-test-init-9999.ebuild
+++ b/chromeos-base/chromeos-test-init/chromeos-test-init-9999.ebuild
@@ -18,6 +18,9 @@
 KEYWORDS="~*"
 IUSE="+encrypted_stateful tpm2"
 
+# File cryptohome-dbus-perf.conf moved from hwsec-test-utils.
+RDEPEND="!<chromeos-base/hwsec-test-utils-0.0.1-r83"
+
 src_unpack() {
 	cros-workon_src_unpack
 	S+="/init"
diff --git a/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1585.ebuild b/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1585.ebuild
deleted file mode 100644
index 6ee461f..0000000
--- a/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1585.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="bbaf80ffceb9be8c6a29286bca054e7a23974961"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "32889491ba02d445795d90f505ad4e9a07cfc0ed" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk trim .gn"
-
-PLATFORM_SUBDIR="trim"
-
-inherit cros-workon platform
-
-DESCRIPTION="Stateful partition periodic trimmer"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trim/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND=""
-
-RDEPEND="${DEPEND}
-	chromeos-base/chromeos-common-script
-	chromeos-base/chromeos-init
-	sys-apps/util-linux"
-
-platform_pkg_test() {
-	platform_test "run" "tests/chromeos-trim-test"
-	platform_test "run" "tests/chromeos-do_trim-test"
-}
-
-src_install() {
-	insinto "/etc/init"
-	doins "init/trim.conf"
-
-	insinto "/usr/share/cros"
-	doins "share/trim_utils.sh"
-
-	dosbin "scripts/chromeos-trim"
-}
diff --git a/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1606.ebuild b/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1606.ebuild
new file mode 100644
index 0000000..86797d6
--- /dev/null
+++ b/chromeos-base/chromeos-trim/chromeos-trim-0.0.1-r1606.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1e69ede3d074afd135fa6f2136ea5d99c425702b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk trim .gn"
+
+PLATFORM_SUBDIR="trim"
+
+inherit cros-workon platform
+
+DESCRIPTION="Stateful partition periodic trimmer"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trim/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND=""
+
+RDEPEND="${DEPEND}
+	chromeos-base/chromeos-common-script
+	chromeos-base/chromeos-init
+	sys-apps/util-linux"
+
+platform_pkg_test() {
+	platform_test "run" "tests/chromeos-trim-test"
+	platform_test "run" "tests/chromeos-do_trim-test"
+}
+
+src_install() {
+	insinto "/etc/init"
+	doins "init/trim.conf"
+
+	insinto "/usr/share/cros"
+	doins "share/trim_utils.sh"
+
+	dosbin "scripts/chromeos-trim"
+}
diff --git a/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-0.0.1-r12.ebuild b/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-0.0.1-r12.ebuild
new file mode 100644
index 0000000..5a4e0f3
--- /dev/null
+++ b/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-0.0.1-r12.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("7b3b7a12ba2f4c570916669cc99ed27efddead59" "3d45bbfa2d7a20159cc65eefe8be697f3c5ef4f2" "542b2296e6d515b265e25c6b7208e8fea3014f90" "d1bc80d021f4ebc31f6e8b36f14b738cc26c7b03")
+CROS_WORKON_TREE=("8ba3164cb59a3aab71c576b877561dd3f8fdac85" "c8b449c296158acf7ce11ac65e2ac577247560da" "c7037905e78a10c0920e0834700c2b5888c8d114" "cbfc2404c2e411908f5e8db083daf3041b408522")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/zephyr-chrome"
+	"chromiumos/third_party/zephyr"
+	"chromiumos/third_party/zephyr/cmsis"
+	"chromiumos/third_party/zephyr/hal_stm32"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/zephyr-chrome"
+	"third_party/zephyr/main/v2.3"
+	"third_party/zephyr/cmsis/v2.3"
+	"third_party/zephyr/hal_stm32/v2.3"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/zephyr-chrome"
+	"${S}/zephyr-base"
+	"${S}/modules/cmsis"
+	"${S}/modules/hal_stm32"
+)
+
+inherit cros-zephyr cros-workon
+
+DESCRIPTION="Zephyr v2.3 based embedded controller firmware"
+HOMEPAGE="http://src.chromium.org"
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
diff --git a/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-9999.ebuild b/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-9999.ebuild
new file mode 100644
index 0000000..4090bbb
--- /dev/null
+++ b/chromeos-base/chromeos-zephyr-2_3/chromeos-zephyr-2_3-9999.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/zephyr-chrome"
+	"chromiumos/third_party/zephyr"
+	"chromiumos/third_party/zephyr/cmsis"
+	"chromiumos/third_party/zephyr/hal_stm32"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/zephyr-chrome"
+	"third_party/zephyr/main/v2.3"
+	"third_party/zephyr/cmsis/v2.3"
+	"third_party/zephyr/hal_stm32/v2.3"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/zephyr-chrome"
+	"${S}/zephyr-base"
+	"${S}/modules/cmsis"
+	"${S}/modules/hal_stm32"
+)
+
+inherit cros-zephyr cros-workon
+
+DESCRIPTION="Zephyr v2.3 based embedded controller firmware"
+HOMEPAGE="http://src.chromium.org"
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="~*"
diff --git a/chromeos-base/chromite/chromite-0.0.2-r6963.ebuild b/chromeos-base/chromite/chromite-0.0.2-r6963.ebuild
deleted file mode 100644
index 9ba1791..0000000
--- a/chromeos-base/chromite/chromite-0.0.2-r6963.ebuild
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c3a81f99020dd6ffd637f40562a9840b8dadf840"
-CROS_WORKON_TREE="8193f8593a74fbd13c8e2dfd157f6eccd8c88a28"
-CROS_WORKON_PROJECT="chromiumos/chromite"
-CROS_WORKON_LOCALNAME="../chromite"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-PYTHON_COMPAT=( python{2_7,3_6,3_7} )
-
-inherit cros-constants cros-workon python-r1
-
-DESCRIPTION="Wrapper for running chromite unit tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/chromite/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-# We don't have unittests, so make sure the cros_run_unit_tests script
-# doesn't waste time rebuilding us all the time.
-RESTRICT="test"
-
-src_install() {
-	install_python() {
-		# TODO(crbug.com/771085): Figure out this SYSROOT business.
-		local dir="$(python_get_sitedir | sed "s:^${SYSROOT}::")/chromite"
-
-		insinto "${dir}"
-		doins -r "${S}"/*
-
-		# TODO (crbug.com/346859) Convert to using distutils and a setup.py
-		# to specify which files should be installed.
-		cd "${D}/${dir}"
-		rm -rf \
-			appengine \
-			contrib \
-			cidb \
-			infra \
-			lib/datafiles/ \
-			third_party/pyelftools/examples \
-			third_party/pyelftools/test \
-			mobmonitor \
-			venv
-		find '(' \
-			-name 'OWNERS*' -o \
-			-name '*.py[co]' -o \
-			-name '*unittest.py' -o \
-			-name '*unittest' -o \
-			-name '*.go' -o \
-			-name '*.md' \
-			')' -delete || die
-		find -name '.git' -exec rm -rf {} + || die
-	}
-	python_foreach_impl install_python
-}
diff --git a/chromeos-base/chromite/chromite-0.0.2-r7250.ebuild b/chromeos-base/chromite/chromite-0.0.2-r7250.ebuild
new file mode 100644
index 0000000..e3170b8
--- /dev/null
+++ b/chromeos-base/chromite/chromite-0.0.2-r7250.ebuild
@@ -0,0 +1,58 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="af5911446cd05354464bc60274f91c6a304d6ade"
+CROS_WORKON_TREE="4fb4c4e51179ff3ab16b44b5574cbb7cbb36f717"
+CROS_WORKON_PROJECT="chromiumos/chromite"
+CROS_WORKON_LOCALNAME="../chromite"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+PYTHON_COMPAT=( python{2_7,3_6,3_7} )
+
+inherit cros-constants cros-workon python-r1
+
+DESCRIPTION="Wrapper for running chromite unit tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/chromite/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+# We don't have unittests, so make sure the cros_run_unit_tests script
+# doesn't waste time rebuilding us all the time.
+RESTRICT="test"
+
+src_install() {
+	install_python() {
+		# TODO(crbug.com/771085): Figure out this SYSROOT business.
+		local dir="$(python_get_sitedir | sed "s:^${SYSROOT}::")/chromite"
+
+		insinto "${dir}"
+		doins -r "${S}"/*
+
+		# TODO (crbug.com/346859) Convert to using distutils and a setup.py
+		# to specify which files should be installed.
+		cd "${D}/${dir}"
+		rm -rf \
+			appengine \
+			contrib \
+			cidb \
+			infra \
+			lib/datafiles/ \
+			third_party/pyelftools/examples \
+			third_party/pyelftools/test \
+			mobmonitor \
+			venv
+		find '(' \
+			-name 'OWNERS*' -o \
+			-name '*.py[co]' -o \
+			-name '*unittest.py' -o \
+			-name '*unittest' -o \
+			-name '*.go' -o \
+			-name '*.md' \
+			')' -delete || die
+		find -name '.git' -exec rm -rf {} + || die
+	}
+	python_foreach_impl install_python
+}
diff --git a/chromeos-base/chromium-source/chromium-source-86.0.4194.0_rc-r1.ebuild b/chromeos-base/chromium-source/chromium-source-87.0.4280.0_rc-r1.ebuild
similarity index 100%
rename from chromeos-base/chromium-source/chromium-source-86.0.4194.0_rc-r1.ebuild
rename to chromeos-base/chromium-source/chromium-source-87.0.4280.0_rc-r1.ebuild
diff --git a/chromeos-base/chunnel/chunnel-0.1.0-r13.ebuild b/chromeos-base/chunnel/chunnel-0.1.0-r13.ebuild
new file mode 100644
index 0000000..2267a97
--- /dev/null
+++ b/chromeos-base/chunnel/chunnel-0.1.0-r13.ebuild
@@ -0,0 +1,83 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="36343094f3f39e388f66d7378fa14da8457df23b"
+CROS_WORKON_TREE="4e2937d79e5021b5b73aa61d0581ae72a7fc229d"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="vm_tools/chunnel"
+
+inherit cros-workon cros-rust user
+
+DESCRIPTION="Tunnel between localhost in different netns"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="kvm_host"
+
+DEPEND="
+	chromeos-base/system_api:=
+	dev-rust/libchromeos:=
+	dev-rust/sys_util:=
+	=dev-rust/dbus-0.6*:=
+	=dev-rust/getopts-0.2*:=
+	=dev-rust/libc-0.2*:=
+	=dev-rust/log-0.4*:=
+	>=dev-rust/protobuf-2.16.2:= <dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.16.2:= <dev-rust/protoc-rust-3
+	=dev-rust/tempfile-3*:=
+	=dev-rust/remain-0.2*:=
+	sys-apps/dbus:=
+"
+
+src_unpack() {
+	# Unpack both the project and dependency source code.
+	cros-workon_src_unpack
+
+	# The compilation happens in the vm_tools/chunnel subdirectory.
+	S+="/vm_tools/chunnel"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test --all
+	fi
+}
+
+src_install() {
+	local build_dir="$(cros-rust_get_build_dir)"
+
+	if use kvm_host; then
+		dobin "${build_dir}/chunneld"
+
+		insinto /etc/init
+		doins init/chunneld.conf
+
+		insinto /etc/dbus-1/system.d
+		doins dbus/org.chromium.Chunneld.conf
+
+		insinto /usr/share/policy
+		newins "seccomp/chunneld-seccomp-${ARCH}.policy" chunneld-seccomp.policy
+	else
+		dobin "${build_dir}/chunnel"
+	fi
+}
+
+pkg_preinst() {
+	if use kvm_host; then
+		enewuser chunneld
+		enewgroup chunneld
+	fi
+}
diff --git a/chromeos-base/chunnel/chunnel-0.1.0-r9.ebuild b/chromeos-base/chunnel/chunnel-0.1.0-r9.ebuild
deleted file mode 100644
index 6986c00..0000000
--- a/chromeos-base/chunnel/chunnel-0.1.0-r9.ebuild
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="2833bbeddcee2131c0051c409a19c3d51054e059"
-CROS_WORKON_TREE="e6a19d66642822ea81050746041409c324f84fde"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="vm_tools/chunnel"
-
-inherit cros-rust cros-workon user
-
-DESCRIPTION="Tunnel between localhost in different netns"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="kvm_host"
-
-DEPEND="
-	chromeos-base/system_api:=
-	dev-rust/libchromeos:=
-	dev-rust/sys_util:=
-	=dev-rust/dbus-0.6*:=
-	=dev-rust/getopts-0.2*:=
-	=dev-rust/libc-0.2*:=
-	=dev-rust/log-0.4*:=
-	=dev-rust/protobuf-2*:=
-	=dev-rust/protoc-rust-2*:=
-	=dev-rust/tempfile-3*:=
-	=dev-rust/remain-0.2*:=
-	sys-apps/dbus:=
-"
-
-src_unpack() {
-	# Unpack both the project and dependency source code.
-	cros-workon_src_unpack
-
-	# The compilation happens in the vm_tools/chunnel subdirectory.
-	S+="/vm_tools/chunnel"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test --all
-	fi
-}
-
-src_install() {
-	local build_dir="$(cros-rust_get_build_dir)"
-
-	if use kvm_host; then
-		dobin "${build_dir}/chunneld"
-
-		insinto /etc/init
-		doins init/chunneld.conf
-
-		insinto /etc/dbus-1/system.d
-		doins dbus/org.chromium.Chunneld.conf
-
-		insinto /usr/share/policy
-		newins "seccomp/chunneld-seccomp-${ARCH}.policy" chunneld-seccomp.policy
-	else
-		dobin "${build_dir}/chunnel"
-	fi
-}
-
-pkg_preinst() {
-	if use kvm_host; then
-		enewuser chunneld
-		enewgroup chunneld
-	fi
-}
diff --git a/chromeos-base/chunnel/chunnel-9999.ebuild b/chromeos-base/chunnel/chunnel-9999.ebuild
index a43df39..b9666be 100644
--- a/chromeos-base/chunnel/chunnel-9999.ebuild
+++ b/chromeos-base/chunnel/chunnel-9999.ebuild
@@ -6,7 +6,7 @@
 CROS_WORKON_LOCALNAME="platform2"
 CROS_WORKON_SUBTREE="vm_tools/chunnel"
 
-inherit cros-rust cros-workon user
+inherit cros-workon cros-rust user
 
 DESCRIPTION="Tunnel between localhost in different netns"
 HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel"
@@ -24,8 +24,8 @@
 	=dev-rust/getopts-0.2*:=
 	=dev-rust/libc-0.2*:=
 	=dev-rust/log-0.4*:=
-	=dev-rust/protobuf-2*:=
-	=dev-rust/protoc-rust-2*:=
+	>=dev-rust/protobuf-2.16.2:= <dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.16.2:= <dev-rust/protoc-rust-3
 	=dev-rust/tempfile-3*:=
 	=dev-rust/remain-0.2*:=
 	sys-apps/dbus:=
diff --git a/chromeos-base/codelab/codelab-0.0.1-r103.ebuild b/chromeos-base/codelab/codelab-0.0.1-r103.ebuild
new file mode 100644
index 0000000..958d00c0
--- /dev/null
+++ b/chromeos-base/codelab/codelab-0.0.1-r103.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "acb8671d02acc0370dcec2465461073d658a6a98" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk codelab .gn"
+
+PLATFORM_SUBDIR="codelab"
+
+inherit cros-workon platform
+
+DESCRIPTION="Developer codelab for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/codelab/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+src_install() {
+	dobin "${OUT}"/codelab
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/codelab_test"
+}
diff --git a/chromeos-base/codelab/codelab-0.0.1-r83.ebuild b/chromeos-base/codelab/codelab-0.0.1-r83.ebuild
deleted file mode 100644
index f1567f6..0000000
--- a/chromeos-base/codelab/codelab-0.0.1-r83.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "acb8671d02acc0370dcec2465461073d658a6a98" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk codelab .gn"
-
-PLATFORM_SUBDIR="codelab"
-
-inherit cros-workon platform
-
-DESCRIPTION="Developer codelab for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/codelab/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-src_install() {
-	dobin "${OUT}"/codelab
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/codelab_test"
-}
diff --git a/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3312.ebuild b/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3312.ebuild
deleted file mode 100644
index 742af3c..0000000
--- a/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3312.ebuild
+++ /dev/null
@@ -1,142 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="a1b9a034138b73293749ad546a885d23ddba5f82"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "197046ff3b04ce2b8d6a73c415ec3b924bccdc44" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk crash-reporter metrics .gn"
-
-PLATFORM_SUBDIR="crash-reporter"
-
-inherit cros-i686 cros-workon platform systemd udev user
-
-DESCRIPTION="Crash reporting service that uploads crash reports with debug information"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer"
-
-COMMON_DEPEND="
-	chromeos-base/minijail:=
-	chromeos-base/google-breakpad:=[cros_i686?]
-	chromeos-base/metrics:=
-	dev-libs/libpcre:=
-	dev-libs/protobuf:=
-	dev-libs/re2:=
-	kvm_guest? ( net-libs/grpc:= )
-	net-misc/curl:=
-	sys-libs/zlib:=
-"
-RDEPEND="${COMMON_DEPEND}
-	chromeos-base/chromeos-ca-certificates
-	|| ( sys-apps/journald:= sys-apps/systemd:= )
-	direncryption? ( sys-apps/keyutils:= )
-"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/debugd-client:=
-	chromeos-base/session_manager-client:=
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/vboot_reference:=
-	chromeos-base/vm_protos:=
-"
-
-src_configure() {
-	platform_src_configure
-	use cheets && use_i686 && platform_src_configure_i686
-}
-
-src_compile() {
-	platform_src_compile
-	use cheets && use_i686 && platform_src_compile_i686 "core_collector"
-}
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() will need the crash user and group.
-	enewuser "crash"
-	enewgroup "crash"
-	# A group to manage file permissions for files that crash reporter
-	# components need to access.
-	enewgroup "crash-access"
-	# A group to grant access to the user's crash directory (in /home)
-	enewgroup "crash-user-access"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	into /
-	dosbin "${OUT}"/crash_reporter
-	dosbin "${OUT}"/crash_sender
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.AnomalyEventService.conf
-
-	local daemon_store="/etc/daemon-store/crash"
-	dodir "${daemon_store}"
-	fperms 3770 "${daemon_store}"
-	fowners crash:crash-user-access "${daemon_store}"
-
-	into /usr
-	use cros_embedded || dobin "${OUT}"/anomaly_detector
-	dosbin kernel_log_collector.sh
-
-	if use cheets; then
-		dobin "${OUT}"/core_collector
-		use_i686 && newbin "$(platform_out_i686)"/core_collector "core_collector32"
-	fi
-
-	if use systemd; then
-		systemd_dounit init/crash-reporter.service
-		systemd_dounit init/crash-boot-collect.service
-		systemd_enable_service multi-user.target crash-reporter.service
-		systemd_enable_service multi-user.target crash-boot-collect.service
-		systemd_dounit init/crash-sender.service
-		systemd_enable_service multi-user.target crash-sender.service
-		systemd_dounit init/crash-sender.timer
-		systemd_enable_service timers.target crash-sender.timer
-		if ! use cros_embedded; then
-			systemd_dounit init/anomaly-detector.service
-			systemd_enable_service multi-user.target anomaly-detector.service
-		fi
-	else
-		insinto /etc/init
-		doins init/crash-reporter.conf
-		doins init/crash-reporter-early-init.conf
-		doins init/crash-boot-collect.conf
-		doins init/crash-sender.conf
-		use cros_embedded || doins init/anomaly-detector.conf
-	fi
-
-	insinto /etc
-	doins crash_reporter_logs.conf
-
-	udev_dorules 99-crash-reporter.rules
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/crash_sender_fuzzer \
-		--dict "${S}"/crash_sender_fuzzer.dict
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/anomaly_detector_fuzzer \
-		--dict "${S}"/anomaly_detector_fuzzer.dict
-}
-
-platform_pkg_test() {
-	local gtest_filter_user_tests="-*.RunAsRoot*:"
-	local gtest_filter_root_tests="*.RunAsRoot*-"
-
-	platform_test "run" "${OUT}/crash_reporter_test" "0" \
-		"${gtest_filter_user_tests}"
-	platform_test "run" "${OUT}/crash_reporter_test" "1" \
-		"${gtest_filter_root_tests}"
-	platform_test "run" "${OUT}/anomaly_detector_test"
-	platform_test "run" "${OUT}/anomaly_detector_text_file_reader_test"
-	platform_test "run" "${OUT}/anomaly_detector_log_reader_test"
-}
diff --git a/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3393.ebuild b/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3393.ebuild
new file mode 100644
index 0000000..ee22023
--- /dev/null
+++ b/chromeos-base/crash-reporter/crash-reporter-0.0.1-r3393.ebuild
@@ -0,0 +1,154 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fbe6bc7b181ff1a027ce19e501f24cc9552eff36" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk crash-reporter metrics .gn"
+
+PLATFORM_SUBDIR="crash-reporter"
+
+inherit cros-arm64 cros-i686 cros-workon platform systemd udev user
+
+DESCRIPTION="Crash reporting service that uploads crash reports with debug information"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer"
+
+COMMON_DEPEND="
+	chromeos-base/minijail:=
+	chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?]
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/libpcre:=
+	dev-libs/protobuf:=
+	dev-libs/re2:=
+	kvm_guest? ( net-libs/grpc:= )
+	net-misc/curl:=
+	sys-libs/zlib:=
+"
+RDEPEND="${COMMON_DEPEND}
+	chromeos-base/chromeos-ca-certificates
+	|| ( sys-apps/journald:= sys-apps/systemd:= )
+	direncryption? ( sys-apps/keyutils:= )
+"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/debugd-client:=
+	chromeos-base/session_manager-client:=
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/vboot_reference:=
+	chromeos-base/vm_protos:=
+"
+
+src_configure() {
+	platform_src_configure
+	use cheets && use_i686 && platform_src_configure_i686
+	use cheets && use_arm64 && platform_src_configure_arm64
+}
+
+src_compile() {
+	platform_src_compile
+	use cheets && use_i686 && platform_src_compile_i686 "core_collector"
+	use cheets && use_arm64 && platform_src_compile_arm64 "core_collector"
+}
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() will need the crash user and group.
+	enewuser "crash"
+	enewgroup "crash"
+	# A group to manage file permissions for files that crash reporter
+	# components need to access.
+	enewgroup "crash-access"
+	# A group to grant access to the user's crash directory (in /home)
+	enewgroup "crash-user-access"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	into /
+	dosbin "${OUT}"/crash_reporter
+	dosbin "${OUT}"/crash_sender
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.AnomalyEventService.conf
+
+	local daemon_store="/etc/daemon-store/crash"
+	dodir "${daemon_store}"
+	fperms 3770 "${daemon_store}"
+	fowners crash:crash-user-access "${daemon_store}"
+
+	into /usr
+	use cros_embedded || dobin "${OUT}"/anomaly_detector
+	dosbin kernel_log_collector.sh
+
+	if use cheets; then
+		dobin "${OUT}"/core_collector
+		use_i686 && newbin "$(platform_out_i686)"/core_collector "core_collector32"
+		use_arm64 && newbin "$(platform_out_arm64)"/core_collector "core_collector64"
+	fi
+
+	if use systemd; then
+		systemd_dounit init/crash-reporter.service
+		systemd_dounit init/crash-boot-collect.service
+		systemd_enable_service multi-user.target crash-reporter.service
+		systemd_enable_service multi-user.target crash-boot-collect.service
+		systemd_dounit init/crash-sender.service
+		systemd_enable_service multi-user.target crash-sender.service
+		systemd_dounit init/crash-sender.timer
+		systemd_enable_service timers.target crash-sender.timer
+		if ! use cros_embedded; then
+			systemd_dounit init/anomaly-detector.service
+			systemd_enable_service multi-user.target anomaly-detector.service
+		fi
+	else
+		insinto /etc/init
+		doins init/crash-reporter.conf
+		doins init/crash-reporter-early-init.conf
+		doins init/crash-boot-collect.conf
+		doins init/crash-sender.conf
+		use cros_embedded || doins init/anomaly-detector.conf
+	fi
+
+	insinto /etc
+	doins crash_reporter_logs.conf
+
+	udev_dorules 99-crash-reporter.rules
+
+	# Install metrics/OWNERS as the owners file for the fuzzers.
+	# The owners files need to have actual email addresses, not
+	# an include-link.
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/crash_sender_fuzzer \
+		--dict "${S}"/crash_sender_fuzzer.dict
+
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/chrome_collector_fuzzer \
+		--dict "${S}"/chrome_collector_fuzzer.dict
+
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/anomaly_detector_fuzzer \
+		--dict "${S}"/anomaly_detector_fuzzer.dict
+}
+
+platform_pkg_test() {
+	local gtest_filter_user_tests="-*.RunAsRoot*:"
+	local gtest_filter_root_tests="*.RunAsRoot*-"
+
+	platform_test "run" "${OUT}/crash_reporter_test" "0" \
+		"${gtest_filter_user_tests}"
+	platform_test "run" "${OUT}/crash_reporter_test" "1" \
+		"${gtest_filter_root_tests}"
+	platform_test "run" "${OUT}/anomaly_detector_test"
+	platform_test "run" "${OUT}/anomaly_detector_text_file_reader_test"
+	platform_test "run" "${OUT}/anomaly_detector_log_reader_test"
+}
diff --git a/chromeos-base/crash-reporter/crash-reporter-9999.ebuild b/chromeos-base/crash-reporter/crash-reporter-9999.ebuild
index 4744d5f..0816b60 100644
--- a/chromeos-base/crash-reporter/crash-reporter-9999.ebuild
+++ b/chromeos-base/crash-reporter/crash-reporter-9999.ebuild
@@ -12,7 +12,7 @@
 
 PLATFORM_SUBDIR="crash-reporter"
 
-inherit cros-i686 cros-workon platform systemd udev user
+inherit cros-arm64 cros-i686 cros-workon platform systemd udev user
 
 DESCRIPTION="Crash reporting service that uploads crash reports with debug information"
 HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/"
@@ -23,8 +23,8 @@
 
 COMMON_DEPEND="
 	chromeos-base/minijail:=
-	chromeos-base/google-breakpad:=[cros_i686?]
-	chromeos-base/metrics:=
+	chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?]
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/libpcre:=
 	dev-libs/protobuf:=
 	dev-libs/re2:=
@@ -50,11 +50,13 @@
 src_configure() {
 	platform_src_configure
 	use cheets && use_i686 && platform_src_configure_i686
+	use cheets && use_arm64 && platform_src_configure_arm64
 }
 
 src_compile() {
 	platform_src_compile
 	use cheets && use_i686 && platform_src_compile_i686 "core_collector"
+	use cheets && use_arm64 && platform_src_compile_arm64 "core_collector"
 }
 
 pkg_setup() {
@@ -90,6 +92,7 @@
 	if use cheets; then
 		dobin "${OUT}"/core_collector
 		use_i686 && newbin "$(platform_out_i686)"/core_collector "core_collector32"
+		use_arm64 && newbin "$(platform_out_arm64)"/core_collector "core_collector64"
 	fi
 
 	if use systemd; then
@@ -119,10 +122,19 @@
 
 	udev_dorules 99-crash-reporter.rules
 
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/crash_sender_fuzzer \
+	# Install metrics/OWNERS as the owners file for the fuzzers.
+	# The owners files need to have actual email addresses, not
+	# an include-link.
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/crash_sender_fuzzer \
 		--dict "${S}"/crash_sender_fuzzer.dict
 
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/anomaly_detector_fuzzer \
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/chrome_collector_fuzzer \
+		--dict "${S}"/chrome_collector_fuzzer.dict
+
+	platform_fuzzer_install "${S}"/../metrics/OWNERS \
+		"${OUT}"/anomaly_detector_fuzzer \
 		--dict "${S}"/anomaly_detector_fuzzer.dict
 }
 
diff --git a/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r257.ebuild b/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r257.ebuild
deleted file mode 100644
index 0422cfd..0000000
--- a/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r257.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "1ced2e0a68de537e63a5f90fc704bde11c4b2375" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/tools common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/tools/cros_camera_tool"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera test utility."
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-BDEPEND="virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/cros-camera-tool"
-}
diff --git a/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r279.ebuild b/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r279.ebuild
new file mode 100644
index 0000000..b7ffaa9
--- /dev/null
+++ b/chromeos-base/cros-camera-tool/cros-camera-tool-0.0.1-r279.ebuild
@@ -0,0 +1,28 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "871bb7e6654a823f1468a5857b4c74f12aaedbb5" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/tools common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/tools/cros_camera_tool"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera test utility."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+BDEPEND="virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros-camera-tool"
+}
diff --git a/chromeos-base/cros-camera-tool/cros-camera-tool-9999.ebuild b/chromeos-base/cros-camera-tool/cros-camera-tool-9999.ebuild
index 1db8e12..3c29efe 100644
--- a/chromeos-base/cros-camera-tool/cros-camera-tool-9999.ebuild
+++ b/chromeos-base/cros-camera-tool/cros-camera-tool-9999.ebuild
@@ -21,5 +21,6 @@
 BDEPEND="virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros-camera-tool"
 }
diff --git a/chromeos-base/cros-camera/cros-camera-0.0.1-r628.ebuild b/chromeos-base/cros-camera/cros-camera-0.0.1-r628.ebuild
deleted file mode 100644
index 1142282..0000000
--- a/chromeos-base/cros-camera/cros-camera-0.0.1-r628.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "38141fe7ee3de0f6566dcc97771686826333dcfb" "6a2b67fcc0394c08e3fe4dbddde59129bbd55899" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-# TODO(crbug.com/914263): camera/hal is unnecessary for this build but is
-# workaround for unexpected sandbox behavior.
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal camera/hal_adapter camera/include camera/mojo common-mk metrics"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/hal_adapter"
-
-inherit cros-camera cros-constants cros-workon platform user
-
-DESCRIPTION="Chrome OS camera service. The service is in charge of accessing
-camera device. It uses unix domain socket to build a synchronous channel."
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="arc-camera1 cheets +cros-camera-algo-sandbox -libcamera"
-
-BDEPEND="virtual/pkgconfig"
-
-COMMON_DEPEND="
-	!media-libs/arc-camera3
-	cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= )
-	media-libs/cros-camera-hal-usb:=
-	media-libs/cros-camera-libcamera_common:=
-	media-libs/cros-camera-libcamera_ipc:=
-	media-libs/cros-camera-libcamera_metadata:=
-	media-libs/libsync:=
-	virtual/cros-camera-effects
-	libcamera? ( media-libs/libcamera )
-	!libcamera? (
-		virtual/cros-camera-hal
-		virtual/cros-camera-hal-configs
-	)"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/metrics:=
-	media-libs/cros-camera-android-headers:=
-	media-libs/minigbm:=
-	x11-libs/libdrm:="
-
-src_install() {
-	dobin "${OUT}/cros_camera_service"
-
-	insinto /etc/init
-	doins init/cros-camera.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp_filter/cros-camera-${ARCH}.policy" cros-camera.policy
-
-	if use cheets && ! use arc-camera1; then
-		insinto "${ARC_VENDOR_DIR}/etc/init"
-		doins init/init.camera.rc
-	fi
-}
-
-pkg_preinst() {
-	enewuser "arc-camera"
-	enewgroup "arc-camera"
-}
diff --git a/chromeos-base/cros-camera/cros-camera-0.0.1-r716.ebuild b/chromeos-base/cros-camera/cros-camera-0.0.1-r716.ebuild
new file mode 100644
index 0000000..94ba613
--- /dev/null
+++ b/chromeos-base/cros-camera/cros-camera-0.0.1-r716.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "c1b99373c190d9f41fdd16811e20200d01f47f3f" "e885a36a16305efc80401bbc17d9a304c25e8b79" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+# TODO(crbug.com/914263): camera/hal is unnecessary for this build but is
+# workaround for unexpected sandbox behavior.
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal camera/hal_adapter camera/include camera/mojo common-mk metrics"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal_adapter"
+
+inherit cros-camera cros-constants cros-workon platform user
+
+DESCRIPTION="Chrome OS camera service. The service is in charge of accessing
+camera device. It uses unix domain socket to build a synchronous channel."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="arc-camera1 cheets +cros-camera-algo-sandbox -libcamera"
+
+BDEPEND="virtual/pkgconfig"
+
+COMMON_DEPEND="
+	!media-libs/arc-camera3
+	cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= )
+	media-libs/cros-camera-hal-usb:=
+	media-libs/cros-camera-libcamera_common:=
+	media-libs/cros-camera-libcamera_ipc:=
+	media-libs/cros-camera-libcamera_metadata:=
+	media-libs/libsync:=
+	libcamera? ( media-libs/libcamera )
+	!libcamera? (
+		virtual/cros-camera-hal
+		virtual/cros-camera-hal-configs
+	)"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	media-libs/cros-camera-android-headers:=
+	media-libs/minigbm:=
+	x11-libs/libdrm:="
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros_camera_service"
+
+	insinto /etc/init
+	doins init/cros-camera.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp_filter/cros-camera-${ARCH}.policy" cros-camera.policy
+
+	if use cheets && ! use arc-camera1; then
+		insinto "${ARC_VENDOR_DIR}/etc/init"
+		doins init/init.camera.rc
+	fi
+}
+
+pkg_preinst() {
+	enewuser "arc-camera"
+	enewgroup "arc-camera"
+}
diff --git a/chromeos-base/cros-camera/cros-camera-9999.ebuild b/chromeos-base/cros-camera/cros-camera-9999.ebuild
index 8d56629..d6ed57e 100644
--- a/chromeos-base/cros-camera/cros-camera-9999.ebuild
+++ b/chromeos-base/cros-camera/cros-camera-9999.ebuild
@@ -32,7 +32,6 @@
 	media-libs/cros-camera-libcamera_ipc:=
 	media-libs/cros-camera-libcamera_metadata:=
 	media-libs/libsync:=
-	virtual/cros-camera-effects
 	libcamera? ( media-libs/libcamera )
 	!libcamera? (
 		virtual/cros-camera-hal
@@ -42,12 +41,13 @@
 RDEPEND="${COMMON_DEPEND}"
 
 DEPEND="${COMMON_DEPEND}
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	media-libs/cros-camera-android-headers:=
 	media-libs/minigbm:=
 	x11-libs/libdrm:="
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros_camera_service"
 
 	insinto /etc/init
diff --git a/chromeos-base/cros-config-api/cros-config-api-0.0.1-r128.ebuild b/chromeos-base/cros-config-api/cros-config-api-0.0.1-r128.ebuild
new file mode 100644
index 0000000..ddeaacc
--- /dev/null
+++ b/chromeos-base/cros-config-api/cros-config-api-0.0.1-r128.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="ea6dda61d01fe49dcb4bb2a0598ab858af71fa4e"
+CROS_WORKON_TREE=("90e55c7e9a54e8f86edf9ae58fad267f298c4814" "e41089e531faee4a357ea7bc58c5caf4e09ed780")
+CROS_WORKON_PROJECT="chromiumos/config"
+CROS_WORKON_LOCALNAME="config"
+CROS_WORKON_SUBTREE="python go"
+
+PYTHON_COMPAT=( python{3_6,3_7} )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Provides python and go bindings to the config API"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/config/+/master/python/"
+
+LICENSE="BSD-Google"
+SLOT=0
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="
+	${RDEPEND}
+	dev-python/setuptools[${PYTHON_USEDEP}]
+"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	# distutils-r1 provides src_configure, src_install and src_test steps for
+	# python bindings, and they require S to be set to the Python source base
+	# directory.
+	S+="/python"
+}
+
+src_install() {
+	distutils-r1_src_install
+
+	# cros-go_src_install requires the directory names (which is also the go
+	# package name) match between the source and destination directories.
+	# However we want to add some prefix to the destination directory name.
+	# source: src/config/go/api...
+	# destination: src/go.chromium.org/chromiumos/config/go/api/...
+	# Therefore insinto/doins are directly called here, instead of using
+	# cros-go_src_install in cros-go.eclass.
+	insinto /usr/lib/gopath/src/go.chromium.org/chromiumos/config
+	# One directory up, because $S is modified in src_unpack in this file.
+	doins -r ../go
+}
diff --git a/chromeos-base/cros-config-api/cros-config-api-0.0.1-r84.ebuild b/chromeos-base/cros-config-api/cros-config-api-0.0.1-r84.ebuild
deleted file mode 100644
index 47b5e6ae..0000000
--- a/chromeos-base/cros-config-api/cros-config-api-0.0.1-r84.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="027a2671517fe0ae4dcd1bad2de8ae77850cb79d"
-CROS_WORKON_TREE=("b90b128a539b021e290702808a9335367ee63530" "62a72939f51a8467019183b7fc7006f0f3e39fad")
-CROS_WORKON_PROJECT="chromiumos/config"
-CROS_WORKON_LOCALNAME="config"
-CROS_WORKON_SUBTREE="python go"
-
-PYTHON_COMPAT=( python{3_6,3_7} )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Provides python and go bindings to the config API"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/config/+/master/python/"
-
-LICENSE="BSD-Google"
-SLOT=0
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="
-	${RDEPEND}
-	dev-python/setuptools[${PYTHON_USEDEP}]
-"
-
-REQUIRED_USE="${PYTHON_REQUIRED_USE}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	# distutils-r1 provides src_configure, src_install and src_test steps for
-	# python bindings, and they require S to be set to the Python source base
-	# directory.
-	S+="/python"
-}
-
-src_install() {
-	distutils-r1_src_install
-
-	# cros-go_src_install requires the directory names (which is also the go
-	# package name) match between the source and destination directories.
-	# However we want to add some prefix to the destination directory name.
-	# source: src/config/go/api...
-	# destination: src/go.chromium.org/chromiumos/config/go/api/...
-	# Therefore insinto/doins are directly called here, instead of using
-	# cros-go_src_install in cros-go.eclass.
-	insinto /usr/lib/gopath/src/go.chromium.org/chromiumos/config
-	# One directory up, because $S is modified in src_unpack in this file.
-	doins -r ../go
-}
diff --git a/chromeos-base/cros-disks/cros-disks-0.0.1-r2991.ebuild b/chromeos-base/cros-disks/cros-disks-0.0.1-r2991.ebuild
deleted file mode 100644
index e0a7b67..0000000
--- a/chromeos-base/cros-disks/cros-disks-0.0.1-r2991.ebuild
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="16c26db7383f68cfc3aff46ee599728f7e0e3383"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "9812fdfa7d98cce17d6ed40301ed50f131ac4df3" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk cros-disks metrics .gn"
-
-PLATFORM_SUBDIR="cros-disks"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Disk mounting daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-disks/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="chromeless_tty fuzzer +seccomp"
-
-COMMON_DEPEND="
-	chromeos-base/metrics:=
-	chromeos-base/minijail:=
-	chromeos-base/session_manager-client:=
-	sys-apps/rootdev:=
-	sys-apps/util-linux:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	net-fs/sshfs
-	sys-fs/dosfstools
-	sys-fs/exfat-utils
-	sys-fs/fuse-exfat
-	sys-fs/fuse-zip
-	sys-fs/ntfs3g
-	sys-fs/rar2fs
-	virtual/udev
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-pkg_preinst() {
-	enewuser "cros-disks"
-	enewgroup "cros-disks"
-
-	enewuser "ntfs-3g"
-	enewgroup "ntfs-3g"
-
-	enewuser "fuse-exfat"
-	enewgroup "fuse-exfat"
-
-	enewuser "fuse-rar2fs"
-	enewgroup "fuse-rar2fs"
-
-	enewuser "fuse-zip"
-	enewgroup "fuse-zip"
-
-	enewuser "fuse-sshfs"
-	enewgroup "fuse-sshfs"
-
-	enewuser "fuse-drivefs"
-	enewgroup "fuse-drivefs"
-}
-
-src_install() {
-	dobin "${OUT}"/cros-disks
-
-	# Install USB device IDs file.
-	insinto /usr/share/cros-disks
-	doins usb-device-info
-
-	# Install seccomp policy files.
-	insinto /usr/share/policy
-	use seccomp && newins fuse-zip-seccomp-${ARCH}.policy fuse-zip-seccomp.policy
-	use seccomp && newins rar2fs-seccomp-${ARCH}.policy rar2fs-seccomp.policy
-
-	# Install upstart config file.
-	insinto /etc/init
-	doins cros-disks.conf
-	# Insert the --no-session-manager flag if needed.
-	if use chromeless_tty; then
-		sed -i -E "s/(CROS_DISKS_OPTS=')/\1--no_session_manager /" "${D}"/etc/init/cros-disks.conf || die
-	fi
-
-	# Install D-Bus config file.
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.CrosDisks.conf
-
-	# Install setuid restrictions file.
-	insinto /usr/share/cros/startup/process_management_policies
-	doins setuid_restrictions/cros_disks_whitelist.txt
-
-	local fuzzers=(
-		mount_options_fuzzer
-		filesystem_label_fuzzer
-	)
-
-	local fuzzer
-	for fuzzer in "${fuzzers[@]}"; do
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}/${PN}_${fuzzer}"
-	done
-}
-
-platform_pkg_test() {
-	local gtest_filter_qemu_common=""
-	gtest_filter_qemu_common+="DiskManagerTest.*"
-	gtest_filter_qemu_common+=":ExternalMounterTest.*"
-	gtest_filter_qemu_common+=":UdevDeviceTest.*"
-	gtest_filter_qemu_common+=":MountInfoTest.RetrieveFromCurrentProcess"
-	gtest_filter_qemu_common+=":GlibProcessTest.*"
-
-	local gtest_filter_user_tests="-*RunAsRoot*:"
-	! use x86 && ! use amd64 && gtest_filter_user_tests+="${gtest_filter_qemu_common}"
-
-	local gtest_filter_root_tests="*RunAsRoot*-"
-	! use x86 && ! use amd64 && gtest_filter_root_tests+="${gtest_filter_qemu_common}"
-
-	platform_test "run" "${OUT}/disks_testrunner" "1" \
-		"${gtest_filter_root_tests}"
-	platform_test "run" "${OUT}/disks_testrunner" "0" \
-		"${gtest_filter_user_tests}"
-}
diff --git a/chromeos-base/cros-disks/cros-disks-0.0.1-r3054.ebuild b/chromeos-base/cros-disks/cros-disks-0.0.1-r3054.ebuild
new file mode 100644
index 0000000..77eb7b7
--- /dev/null
+++ b/chromeos-base/cros-disks/cros-disks-0.0.1-r3054.ebuild
@@ -0,0 +1,133 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "0badf0f17c329cb5b71cc455bcf9227936790f8f" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk cros-disks metrics .gn"
+
+PLATFORM_SUBDIR="cros-disks"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Disk mounting daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-disks/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="chromeless_tty fuzzer +seccomp"
+
+COMMON_DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/minijail:=
+	chromeos-base/session_manager-client:=
+	sys-apps/rootdev:=
+	sys-apps/util-linux:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	net-fs/sshfs
+	sys-fs/dosfstools
+	sys-fs/exfat-utils
+	sys-fs/fuse-exfat
+	sys-fs/fuse-zip
+	sys-fs/ntfs3g
+	sys-fs/rar2fs
+	virtual/udev
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+pkg_preinst() {
+	enewuser "cros-disks"
+	enewgroup "cros-disks"
+
+	enewuser "ntfs-3g"
+	enewgroup "ntfs-3g"
+
+	enewuser "fuse-exfat"
+	enewgroup "fuse-exfat"
+
+	enewuser "fuse-rar2fs"
+	enewgroup "fuse-rar2fs"
+
+	enewuser "fuse-zip"
+	enewgroup "fuse-zip"
+
+	enewuser "fuse-sshfs"
+	enewgroup "fuse-sshfs"
+
+	enewuser "fuse-drivefs"
+	enewgroup "fuse-drivefs"
+}
+
+src_install() {
+	dobin "${OUT}"/cros-disks
+
+	# Install USB device IDs file.
+	insinto /usr/share/cros-disks
+	doins usb-device-info
+
+	# Install seccomp policy files.
+	insinto /usr/share/policy
+	use seccomp && newins fuse-zip-seccomp-${ARCH}.policy fuse-zip-seccomp.policy
+	use seccomp && newins rar2fs-seccomp-${ARCH}.policy rar2fs-seccomp.policy
+
+	# Install upstart config file.
+	insinto /etc/init
+	doins cros-disks.conf
+	# Insert the --no-session-manager flag if needed.
+	if use chromeless_tty; then
+		sed -i -E "s/(CROS_DISKS_OPTS=')/\1--no_session_manager /" "${D}"/etc/init/cros-disks.conf || die
+	fi
+
+	# Install D-Bus config file.
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.CrosDisks.conf
+
+	# Install setuid restrictions file.
+	insinto /usr/share/cros/startup/process_management_policies
+	doins setuid_restrictions/cros_disks_whitelist.txt
+
+	# Install powerd prefs for FUSE freeze ordering.
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_*
+
+	local fuzzers=(
+		mount_options_fuzzer
+		filesystem_label_fuzzer
+	)
+
+	local fuzzer
+	for fuzzer in "${fuzzers[@]}"; do
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}/${PN}_${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	local gtest_filter_qemu_common=""
+	gtest_filter_qemu_common+="DiskManagerTest.*"
+	gtest_filter_qemu_common+=":ExternalMounterTest.*"
+	gtest_filter_qemu_common+=":UdevDeviceTest.*"
+	gtest_filter_qemu_common+=":MountInfoTest.RetrieveFromCurrentProcess"
+	gtest_filter_qemu_common+=":GlibProcessTest.*"
+
+	local gtest_filter_user_tests="-*RunAsRoot*:"
+	! use x86 && ! use amd64 && gtest_filter_user_tests+="${gtest_filter_qemu_common}"
+
+	local gtest_filter_root_tests="*RunAsRoot*-"
+	! use x86 && ! use amd64 && gtest_filter_root_tests+="${gtest_filter_qemu_common}"
+
+	platform_test "run" "${OUT}/disks_testrunner" "1" \
+		"${gtest_filter_root_tests}"
+	platform_test "run" "${OUT}/disks_testrunner" "0" \
+		"${gtest_filter_user_tests}"
+}
diff --git a/chromeos-base/cros-disks/cros-disks-9999.ebuild b/chromeos-base/cros-disks/cros-disks-9999.ebuild
index 09b69fc..cddf47b 100644
--- a/chromeos-base/cros-disks/cros-disks-9999.ebuild
+++ b/chromeos-base/cros-disks/cros-disks-9999.ebuild
@@ -20,7 +20,7 @@
 IUSE="chromeless_tty fuzzer +seccomp"
 
 COMMON_DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/minijail:=
 	chromeos-base/session_manager-client:=
 	sys-apps/rootdev:=
@@ -95,6 +95,10 @@
 	insinto /usr/share/cros/startup/process_management_policies
 	doins setuid_restrictions/cros_disks_whitelist.txt
 
+	# Install powerd prefs for FUSE freeze ordering.
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_*
+
 	local fuzzers=(
 		mount_options_fuzzer
 		filesystem_label_fuzzer
diff --git a/chromeos-base/cros-testutils/cros-testutils-0.0.1-r581.ebuild b/chromeos-base/cros-testutils/cros-testutils-0.0.1-r581.ebuild
deleted file mode 100644
index 6977be4..0000000
--- a/chromeos-base/cros-testutils/cros-testutils-0.0.1-r581.ebuild
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="4a382fb97c9d25d3406547c2ef182d25bea85718"
-CROS_WORKON_TREE="86c8cdb230be6edd6ac4510cc2b4c2193486647e"
-CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
-CROS_WORKON_LOCALNAME="platform/crostestutils"
-
-inherit cros-workon
-
-DESCRIPTION="Host test utilities for ChromiumOS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="app-emulation/qemu
-	app-portage/gentoolkit
-	app-shells/bash
-	chromeos-base/cros-devutils
-	dev-python/django
-	"
-
-# These are all either bash / python scripts.  No actual builds DEPS.
-DEPEND=""
-
-# Use default src_compile and src_install which use Makefile.
diff --git a/chromeos-base/cros-testutils/cros-testutils-0.0.1-r587.ebuild b/chromeos-base/cros-testutils/cros-testutils-0.0.1-r587.ebuild
new file mode 100644
index 0000000..c3e7cee
--- /dev/null
+++ b/chromeos-base/cros-testutils/cros-testutils-0.0.1-r587.ebuild
@@ -0,0 +1,28 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="110e8dfe269f7adef222713eba02dac64ecac7d8"
+CROS_WORKON_TREE="8146f648468b544a50e01b7ee01b268db5e744ea"
+CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
+CROS_WORKON_LOCALNAME="platform/crostestutils"
+
+inherit cros-workon
+
+DESCRIPTION="Host test utilities for ChromiumOS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="app-emulation/qemu
+	app-portage/gentoolkit
+	app-shells/bash
+	chromeos-base/cros-devutils
+	dev-python/django
+	"
+
+# These are all either bash / python scripts.  No actual builds DEPS.
+DEPEND=""
+
+# Use default src_compile and src_install which use Makefile.
diff --git a/chromeos-base/crosdns/crosdns-0.0.1-r216.ebuild b/chromeos-base/crosdns/crosdns-0.0.1-r216.ebuild
deleted file mode 100644
index 51a1691..0000000
--- a/chromeos-base/crosdns/crosdns-0.0.1-r216.ebuild
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "412eac584220652a95abba5231fef81bee97f5ea" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk crosdns .gn"
-
-PLATFORM_SUBDIR="crosdns"
-
-inherit cros-fuzzer cros-sanitizers cros-workon platform user
-
-DESCRIPTION="Local hostname modifier service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/crosdns"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="+seccomp asan fuzzer"
-
-COMMON_DEPEND="
-	chromeos-base/libbrillo:=[asan?,fuzzer?]
-	chromeos-base/minijail:="
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api:=[fuzzer?]"
-
-src_install() {
-	# Install our binary.
-	dosbin "${OUT}"/crosdns
-
-	# Install D-Bus configuration.
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.CrosDns.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	if use seccomp; then
-		newins "init/crosdns-seccomp-${ARCH}.policy" crosdns-seccomp.policy
-	fi
-
-	# Install the init script.
-	insinto /etc/init
-	doins init/crosdns.conf
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hosts_modifier_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/run_tests"
-}
-
-pkg_preinst() {
-	enewuser "crosdns"
-	enewgroup "crosdns"
-}
diff --git a/chromeos-base/crosdns/crosdns-0.0.1-r236.ebuild b/chromeos-base/crosdns/crosdns-0.0.1-r236.ebuild
new file mode 100644
index 0000000..99e95d7
--- /dev/null
+++ b/chromeos-base/crosdns/crosdns-0.0.1-r236.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "f6f4cb8ed85c814dc20afad7accc96ad40f79492" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk crosdns .gn"
+
+PLATFORM_SUBDIR="crosdns"
+
+inherit cros-fuzzer cros-sanitizers cros-workon platform user
+
+DESCRIPTION="Local hostname modifier service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/crosdns"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="+seccomp asan fuzzer"
+
+COMMON_DEPEND="
+	chromeos-base/libbrillo:=[asan?,fuzzer?]
+	chromeos-base/minijail:="
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=[fuzzer?]"
+
+src_install() {
+	# Install our binary.
+	dosbin "${OUT}"/crosdns
+
+	# Install D-Bus configuration.
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.CrosDns.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	if use seccomp; then
+		newins "init/crosdns-seccomp-${ARCH}.policy" crosdns-seccomp.policy
+	fi
+
+	# Install the init script.
+	insinto /etc/init
+	doins init/crosdns.conf
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hosts_modifier_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/run_tests"
+}
+
+pkg_preinst() {
+	enewuser "crosdns"
+	enewgroup "crosdns"
+}
diff --git a/chromeos-base/crosh-extension/crosh-extension-0.33-r941.ebuild b/chromeos-base/crosh-extension/crosh-extension-0.33-r941.ebuild
deleted file mode 100644
index 3a217fd..0000000
--- a/chromeos-base/crosh-extension/crosh-extension-0.33-r941.ebuild
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="1ae02f4811e88b2939ce09202ae09ade3b883aed"
-CROS_WORKON_TREE=("74d11a0c34e167a7100b2f11883d2596a94638d4" "090abcb44219aa354bb1e31ad85a1a4edebe75dc" "c157bced9e4904e57214c7109424d4533e211b29" "0d583ca6372b1327575c7ad8688a172d423aee27" "1436298f3f3cf9b3a9c7fba1617a6531c06b1c09")
-CROS_WORKON_PROJECT="apps/libapps"
-CROS_WORKON_LOCALNAME="third_party/libapps"
-CROS_WORKON_SUBTREE="libdot hterm nassh ssh_client terminal"
-
-inherit cros-workon
-
-DESCRIPTION="The Chromium OS Shell extension (the HTML/JS rendering part)"
-HOMEPAGE="https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/chromeos-crosh.md"
-# These are kept in sync with libdot.py settings.
-FONTS_HASHES=(
-	# Current one.
-	d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506
-	# Next one.
-	d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506
-)
-NPM_HASHES=(
-	# Current one.
-	bc482f2b229bd0797c104263dc60cb884a1c90f6e65f07050d0b94b165b3a255
-	# Next one.
-	2cd2dd365999ae139b6b0fb62a5a09e2a7fb5ab1c0926cf1968a1dec9b74fea5
-)
-SRC_URI="
-	https://storage.googleapis.com/chromium-nodejs/12.14.1/4572d3801500bcbebafadf203056d6263c840cda
-	$(printf 'https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-%s.tar.xz ' \
-		"${FONTS_HASHES[@]}")
-	$(printf 'https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-%s.tar.xz ' \
-		"${NPM_HASHES[@]}")
-"
-
-# The archives above live on Google maintained sites.
-RESTRICT="nomirror"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="!<chromeos-base/common-assets-0.0.2"
-
-e() {
-	echo "$@"
-	"$@" || die
-}
-
-src_compile() {
-	export VCSID="${CROS_WORKON_COMMIT:-${PF}}"
-	e ./nassh/bin/mkdist --crosh-only
-}
-
-src_install() {
-	local dir="/usr/share/chromeos-assets/crosh_builtin"
-	dodir "${dir}"
-	unzip -d "${D}${dir}" nassh/dist/crosh.zip || die
-}
diff --git a/chromeos-base/crosh-extension/crosh-extension-0.35-r992.ebuild b/chromeos-base/crosh-extension/crosh-extension-0.35-r992.ebuild
new file mode 100644
index 0000000..5b99c42
--- /dev/null
+++ b/chromeos-base/crosh-extension/crosh-extension-0.35-r992.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="e9ec826c7dccccdcad6c6e6723c22647f808ef16"
+CROS_WORKON_TREE=("eae03c8b860ceefb855b592d13e234f7711c91b8" "11c59c7f0689cf7603b747d550cc3ea94e69e90e" "ba93f18bb3d1cab0f8d600947de1055f73e45f6d" "0d583ca6372b1327575c7ad8688a172d423aee27" "098fc8e751872ecb63c13b33ebaa6ec7f19757da")
+CROS_WORKON_PROJECT="apps/libapps"
+CROS_WORKON_LOCALNAME="third_party/libapps"
+CROS_WORKON_SUBTREE="libdot hterm nassh ssh_client terminal"
+
+inherit cros-workon
+
+DESCRIPTION="The Chromium OS Shell extension (the HTML/JS rendering part)"
+HOMEPAGE="https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/chromeos-crosh.md"
+# These are kept in sync with libdot.py settings.
+FONTS_HASHES=(
+	# Current one.
+	d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506
+	# Next one.
+	d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506
+)
+NPM_HASHES=(
+	# Current one.
+	bc482f2b229bd0797c104263dc60cb884a1c90f6e65f07050d0b94b165b3a255
+	# Next one.
+	2cd2dd365999ae139b6b0fb62a5a09e2a7fb5ab1c0926cf1968a1dec9b74fea5
+)
+SRC_URI="
+	https://storage.googleapis.com/chromium-nodejs/12.14.1/4572d3801500bcbebafadf203056d6263c840cda
+	$(printf 'https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-%s.tar.xz ' \
+		"${FONTS_HASHES[@]}")
+	$(printf 'https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-%s.tar.xz ' \
+		"${NPM_HASHES[@]}")
+"
+
+# The archives above live on Google maintained sites.
+RESTRICT="nomirror"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="!<chromeos-base/common-assets-0.0.2"
+
+e() {
+	echo "$@"
+	"$@" || die
+}
+
+src_compile() {
+	export VCSID="${CROS_WORKON_COMMIT:-${PF}}"
+	e ./nassh/bin/mkdist --crosh-only
+}
+
+src_install() {
+	local dir="/usr/share/chromeos-assets/crosh_builtin"
+	dodir "${dir}"
+	unzip -d "${D}${dir}" nassh/dist/crosh.zip || die
+}
diff --git a/chromeos-base/crosh/crosh-0.24.52-r2995.ebuild b/chromeos-base/crosh/crosh-0.24.52-r2995.ebuild
deleted file mode 100644
index 9665113..0000000
--- a/chromeos-base/crosh/crosh-0.24.52-r2995.ebuild
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="06b968ac8625de66e62c7c1ff9137339f83c86e7"
-CROS_WORKON_TREE="8c03a2a5a0f1c22843551b011dc2cae529d54719"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_SUBTREE="crosh"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Chrome OS developer command-line shell"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="rust-crosh"
-
-DEPEND="chromeos-base/system_api-rust:=
-	>=dev-rust/dbus-0.6.1:= <dev-rust/dbus-0.7.0
-	>=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0
-	dev-rust/remain:=
-	>=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0
-	dev-rust/shell-words:=
-	dev-rust/sys_util:=
-	dev-rust/tempfile:=
-	dev-rust/tlsdate_dbus:=
-"
-RDEPEND="app-admin/sudo
-	chromeos-base/vboot_reference
-	net-misc/iputils
-	net-misc/openssh
-	net-wireless/iw
-	sys-apps/net-tools
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/crosh"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	# File order is important here.
-	sed \
-		-e '/^#/d' \
-		-e '/^$/d' \
-		inputrc.safe inputrc.extra \
-		> "${WORKDIR}"/inputrc.crosh || die
-	ecargo_build
-
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	./run_tests.sh || die
-
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	if use rust-crosh; then
-		dobin "$(cros-rust_get_build_dir)/crosh"
-		newbin crosh crosh.sh
-	else
-		dobin crosh
-	fi
-	dobin network_diag
-	local d="/usr/share/crosh"
-	insinto "${d}/dev.d"
-	doins dev.d/*.sh
-	insinto "${d}/removable.d"
-	doins removable.d/*.sh
-	insinto "${d}"
-	doins "${WORKDIR}"/inputrc.crosh
-}
diff --git a/chromeos-base/crosh/crosh-0.24.52-r3003.ebuild b/chromeos-base/crosh/crosh-0.24.52-r3003.ebuild
new file mode 100644
index 0000000..d0575d5
--- /dev/null
+++ b/chromeos-base/crosh/crosh-0.24.52-r3003.ebuild
@@ -0,0 +1,84 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE="0c2b1f89ba962ad28992e1a4ccdb364ec2b78aa6"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_SUBTREE="crosh"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Chrome OS developer command-line shell"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="+rust-crosh"
+
+DEPEND=">chromeos-base/system_api-rust-0.24.52-r261:=
+	=dev-rust/dbus-0.8*:=
+	>=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0
+	dev-rust/remain:=
+	>=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0
+	dev-rust/shell-words:=
+	dev-rust/sys_util:=
+	dev-rust/tempfile:=
+	>dev-rust/tlsdate_dbus-0.24.52-r8:=
+"
+RDEPEND="app-admin/sudo
+	chromeos-base/vboot_reference
+	net-misc/iputils
+	net-misc/openssh
+	net-wireless/iw
+	sys-apps/net-tools
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/crosh"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	# File order is important here.
+	sed \
+		-e '/^#/d' \
+		-e '/^$/d' \
+		inputrc.safe inputrc.extra \
+		> "${WORKDIR}"/inputrc.crosh || die
+	ecargo_build
+
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	./run_tests.sh || die
+
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	if use rust-crosh; then
+		dobin "$(cros-rust_get_build_dir)/crosh"
+		newbin crosh crosh.sh
+	else
+		dobin crosh
+	fi
+	dobin network_diag
+	local d="/usr/share/crosh"
+	insinto "${d}/dev.d"
+	doins dev.d/*.sh
+	insinto "${d}/removable.d"
+	doins removable.d/*.sh
+	insinto "${d}"
+	doins "${WORKDIR}"/inputrc.crosh
+}
diff --git a/chromeos-base/crosh/crosh-9999.ebuild b/chromeos-base/crosh/crosh-9999.ebuild
index d5a307d..aa0d515 100644
--- a/chromeos-base/crosh/crosh-9999.ebuild
+++ b/chromeos-base/crosh/crosh-9999.ebuild
@@ -15,17 +15,17 @@
 LICENSE="BSD-Google"
 SLOT="0/0"
 KEYWORDS="~*"
-IUSE="rust-crosh"
+IUSE="+rust-crosh"
 
-DEPEND="chromeos-base/system_api-rust:=
-	>=dev-rust/dbus-0.6.1:= <dev-rust/dbus-0.7.0
+DEPEND=">chromeos-base/system_api-rust-0.24.52-r261:=
+	=dev-rust/dbus-0.8*:=
 	>=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0
 	dev-rust/remain:=
 	>=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0
 	dev-rust/shell-words:=
 	dev-rust/sys_util:=
 	dev-rust/tempfile:=
-	dev-rust/tlsdate_dbus:=
+	>dev-rust/tlsdate_dbus-0.24.52-r8:=
 "
 RDEPEND="app-admin/sudo
 	chromeos-base/vboot_reference
diff --git a/chromeos-base/croslog/croslog-0.0.1-r12.ebuild b/chromeos-base/croslog/croslog-0.0.1-r12.ebuild
deleted file mode 100644
index bc006f5..0000000
--- a/chromeos-base/croslog/croslog-0.0.1-r12.ebuild
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-CROS_WORKON_COMMIT="3417bf876ad9c88f79c3ddfe569c3fbb32616896"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "8a76ff74f1164144fb0aed87bc778009ac4fb5ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk croslog .gn"
-
-PLATFORM_SUBDIR="croslog"
-
-inherit cros-workon platform
-
-DESCRIPTION="Log viewer for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/croslog"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-src_install() {
-	platform_install
-}
-
-platform_pkg_test() {
-	platform test_all
-}
-
diff --git a/chromeos-base/croslog/croslog-0.0.1-r46.ebuild b/chromeos-base/croslog/croslog-0.0.1-r46.ebuild
new file mode 100644
index 0000000..9b4f7cc
--- /dev/null
+++ b/chromeos-base/croslog/croslog-0.0.1-r46.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "0451459b5e75fb9c480ac45a1bc18c47ad9f07c6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk croslog .gn"
+
+PLATFORM_SUBDIR="croslog"
+
+inherit cros-workon platform
+
+DESCRIPTION="Log viewer for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/croslog"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="chromeos-base/bootid-logger"
+
+src_install() {
+	platform_install
+}
+
+platform_pkg_test() {
+	platform test_all
+}
+
diff --git a/chromeos-base/croslog/croslog-9999.ebuild b/chromeos-base/croslog/croslog-9999.ebuild
index 7484f38..1e041ca 100644
--- a/chromeos-base/croslog/croslog-9999.ebuild
+++ b/chromeos-base/croslog/croslog-9999.ebuild
@@ -21,6 +21,8 @@
 KEYWORDS="~*"
 IUSE=""
 
+RDEPEND="chromeos-base/bootid-logger"
+
 src_install() {
 	platform_install
 }
diff --git a/chromeos-base/crostini-pin/crostini-pin-85.20200616.23.06-r1.ebuild b/chromeos-base/crostini-pin/crostini-pin-87.20200820.01.16-r1.ebuild
similarity index 100%
rename from chromeos-base/crostini-pin/crostini-pin-85.20200616.23.06-r1.ebuild
rename to chromeos-base/crostini-pin/crostini-pin-87.20200820.01.16-r1.ebuild
diff --git a/chromeos-base/crostini_client/crostini_client-0.1.0-r54.ebuild b/chromeos-base/crostini_client/crostini_client-0.1.0-r54.ebuild
deleted file mode 100644
index 2667441..0000000
--- a/chromeos-base/crostini_client/crostini_client-0.1.0-r54.ebuild
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="2a1e4bf11126c6911f994f37cee6798b37a79cbd"
-CROS_WORKON_TREE="7b9b958444461dbad59569baa6017c9a78734413"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="vm_tools/crostini_client"
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Command-line client for controlling crostini"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/crostini_client/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-DEPEND="chromeos-base/system_api
-	=dev-rust/dbus-0.6*:=
-	=dev-rust/getopts-0.2*:=
-	=dev-rust/lazy_static-1*:=
-	>=dev-rust/libc-0.2.44:=
-	!>=dev-rust/libc-0.3
-	>=dev-rust/protobuf-2.8:=
-	!>=dev-rust/protobuf-3
-	>=dev-rust/protoc-rust-2.8:=
-	!>=dev-rust/protoc-rust-3
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	# The compilation happens in the crostini_client subdirectory.
-	S+="/vm_tools/crostini_client"
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test --all
-	fi
-}
-
-src_install() {
-	local build_dir="$(cros-rust_get_build_dir)"
-	dobin "${build_dir}/crostini_client"
-	dosym "crostini_client" "/usr/bin/vmc"
-}
diff --git a/chromeos-base/crostini_client/crostini_client-0.1.0-r65.ebuild b/chromeos-base/crostini_client/crostini_client-0.1.0-r65.ebuild
new file mode 100644
index 0000000..42c8c6c
--- /dev/null
+++ b/chromeos-base/crostini_client/crostini_client-0.1.0-r65.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+CROS_WORKON_COMMIT="82a9ae89ce2c3e5ea62f38105c55defd9acddf20"
+CROS_WORKON_TREE="f8509742b3ca30ee04be3f48c9d5377f802b34dc"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="vm_tools/crostini_client"
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Command-line client for controlling crostini"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/crostini_client/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+DEPEND="chromeos-base/system_api
+	=dev-rust/dbus-0.8*:=
+	=dev-rust/getopts-0.2*:=
+	=dev-rust/lazy_static-1*:=
+	>=dev-rust/libc-0.2.44:=
+	!>=dev-rust/libc-0.3
+	>=dev-rust/protobuf-2.16:= <dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.16:= <dev-rust/protoc-rust-3
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	# The compilation happens in the crostini_client subdirectory.
+	S+="/vm_tools/crostini_client"
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test --all
+	fi
+}
+
+src_install() {
+	local build_dir="$(cros-rust_get_build_dir)"
+	dobin "${build_dir}/crostini_client"
+	dosym "crostini_client" "/usr/bin/vmc"
+}
diff --git a/chromeos-base/crostini_client/crostini_client-9999.ebuild b/chromeos-base/crostini_client/crostini_client-9999.ebuild
index 5f73e0b..6f15bdf 100644
--- a/chromeos-base/crostini_client/crostini_client-9999.ebuild
+++ b/chromeos-base/crostini_client/crostini_client-9999.ebuild
@@ -17,15 +17,13 @@
 KEYWORDS="~*"
 
 DEPEND="chromeos-base/system_api
-	=dev-rust/dbus-0.6*:=
+	=dev-rust/dbus-0.8*:=
 	=dev-rust/getopts-0.2*:=
 	=dev-rust/lazy_static-1*:=
 	>=dev-rust/libc-0.2.44:=
 	!>=dev-rust/libc-0.3
-	>=dev-rust/protobuf-2.8:=
-	!>=dev-rust/protobuf-3
-	>=dev-rust/protoc-rust-2.8:=
-	!>=dev-rust/protoc-rust-3
+	>=dev-rust/protobuf-2.16:= <dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.16:= <dev-rust/protoc-rust-3
 "
 
 src_unpack() {
diff --git a/chromeos-base/crosvm/crosvm-0.1.0-r1017.ebuild b/chromeos-base/crosvm/crosvm-0.1.0-r1017.ebuild
new file mode 100644
index 0000000..8907c9c
--- /dev/null
+++ b/chromeos-base/crosvm/crosvm-0.1.0-r1017.ebuild
@@ -0,0 +1,276 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="b0e9842602b22484e7b12974110d23c46e49e18d"
+CROS_WORKON_TREE="ed256fe36e132de4358fbc54496a6c4476e00f2f"
+CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
+CROS_WORKON_LOCALNAME="platform/crosvm"
+CROS_WORKON_INCREMENTAL_BUILD=1
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since crosvm/Cargo.toml is
+# using "# ignored by ebuild" macro which supported by cros-rust.
+
+inherit cros-fuzzer cros-rust cros-workon user
+
+KERNEL_PREBUILT_DATE="2019_10_10_00_22"
+
+DESCRIPTION="Utility for running VMs on Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crosvm/"
+SRC_URI="test? ( https://storage.googleapis.com/crosvm-testing/x86_64/${KERNEL_PREBUILT_DATE}/bzImage -> crosvm-bzImage-${KERNEL_PREBUILT_DATE} )"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test cros-debug crosvm-gpu -crosvm-plugin +crosvm-video-decoder +crosvm-video-encoder +crosvm-wl-dmabuf fuzzer tpm2 arcvm_gce_l1"
+
+COMMON_DEPEND="
+	sys-apps/dtc:=
+	sys-libs/libcap:=
+	chromeos-base/libvda:=
+	chromeos-base/minijail:=
+	crosvm-gpu? (
+		dev-libs/wayland:=
+		media-libs/virglrenderer:=
+	)
+	crosvm-wl-dmabuf? ( media-libs/minigbm:= )
+	virtual/libusb:1=
+"
+
+RDEPEND="${COMMON_DEPEND}
+	!chromeos-base/crosvm-bin
+"
+
+DEPEND="${COMMON_DEPEND}
+	=dev-rust/android_log-sys-0.2*:=
+	>=dev-rust/anyhow-1.0.32:= <dev-rust/anyhow-2.0
+	=dev-rust/async-trait-0.1*:=
+	fuzzer? (
+		dev-rust/cros_fuzz:=
+		=dev-rust/rand-0.6*:=
+	)
+	=dev-rust/bitflags-1*:=
+	~dev-rust/cc-1.0.25:=
+	=dev-rust/futures-0.3*:=
+	~dev-rust/getopts-0.2.18:=
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
+	dev-rust/libvda:=
+	dev-rust/minijail:=
+	~dev-rust/num_cpus-1.9.0:=
+	dev-rust/p9:=
+	=dev-rust/paste-0.1*:=
+	=dev-rust/pin-utils-0.1*:=
+	~dev-rust/pkg-config-0.3.11:=
+	=dev-rust/proc-macro2-1*:=
+	>=dev-rust/protobuf-2.8:=
+	!>=dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.8:=
+	!>=dev-rust/protoc-rust-3
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+	>=dev-rust/thiserror-1.0.20:= <dev-rust/thiserror-2.0
+	dev-rust/trace_events:=
+	dev-rust/remain:=
+	tpm2? (
+		chromeos-base/tpm2:=
+		chromeos-base/trunks:=
+		=dev-rust/dbus-0.6*:=
+	)
+	media-sound/audio_streams:=
+	media-sound/libcras:=
+"
+
+get_seccomp_path() {
+	local seccomp_arch="unknown"
+	case ${ARCH} in
+		amd64) seccomp_arch=x86_64;;
+		arm) seccomp_arch=arm;;
+		arm64) seccomp_arch=aarch64;;
+	esac
+
+	echo "seccomp/${seccomp_arch}"
+}
+
+FUZZERS=(
+	crosvm_block_fuzzer
+	crosvm_fs_server_fuzzer
+	crosvm_qcow_fuzzer
+	crosvm_usb_descriptor_fuzzer
+	crosvm_virtqueue_fuzzer
+	crosvm_zimage_fuzzer
+)
+
+src_unpack() {
+	# Unpack both the project and dependency source code
+	cros-workon_src_unpack
+	cros-rust_src_unpack
+}
+
+src_prepare() {
+	cros-rust_src_prepare
+
+	if use arcvm_gce_l1; then
+		eapply "${FILESDIR}"/0001-betty-arcvm-Loose-mprotect-mmap-for-software-renderi.patch
+	fi
+
+	default
+}
+
+src_configure() {
+	cros-rust_src_configure
+
+	# Change the path used for the minijail pivot root from /var/empty.
+	# See: https://crbug.com/934513
+	export DEFAULT_PIVOT_ROOT="/mnt/empty"
+}
+
+src_compile() {
+	local features=(
+		$(usex crosvm-gpu gpu "")
+		$(usex crosvm-gpu virtio-gpu-next "")
+		$(usex crosvm-plugin plugin "")
+		$(usex crosvm-video-decoder video-decoder "")
+		$(usex crosvm-video-encoder video-encoder "")
+		$(usex crosvm-wl-dmabuf wl-dmabuf "")
+		$(usex tpm2 tpm "")
+		chromeos
+	)
+
+	local packages=(
+		qcow_utils
+		crosvm
+	)
+
+	for pkg in "${packages[@]}"; do
+		ecargo_build -v \
+			--features="${features[*]}" \
+			-p "${pkg}" \
+			|| die "cargo build failed"
+	done
+
+	if use fuzzer; then
+		cd fuzz
+		local f
+		for f in "${FUZZERS[@]}"; do
+			ecargo_build_fuzzer --bin "${f}"
+		done
+	fi
+}
+
+src_test() {
+	# Some of the tests will use /dev/kvm.
+	addwrite /dev/kvm
+	local test_opts=()
+	use tpm2 || test_opts+=( --exclude tpm2 --exclude tpm2-sys )
+
+	# io_jail tests fork the process, which cause memory leak errors when
+	# run under sanitizers.
+	cros-rust_use_sanitizers && test_opts+=( --exclude io_jail )
+
+	export CROSVM_CARGO_TEST_KERNEL_BINARY="${DISTDIR}/crosvm-bzImage-${KERNEL_PREBUILT_DATE}"
+	[[ -e "${CROSVM_CARGO_TEST_KERNEL_BINARY}" ]] || \
+		die "expected to find kernel binary at ${CROSVM_CARGO_TEST_KERNEL_BINARY}"
+
+	local skip_tests=()
+	# The memfd_create() system call first appeared in Linux 3.17.  Skip
+	# the boot test, which relies on this functionality, on older kernels.
+	local cut_version=$(ver_cut 1-2 "$(uname -r)")
+	if ver_test 3.17 -gt "${cut_version}"; then
+		skip_tests+=( --skip "boot" )
+	fi
+
+	if ! use x86 && ! use amd64; then
+		test_opts+=( --exclude "x86_64" )
+		test_opts+=( --no-run )
+	fi
+
+	if ! use arm64; then
+		test_opts+=( --exclude "aarch64" )
+	fi
+
+	if ! use crosvm-plugin; then
+		test_opts+=( --exclude "crosvm_plugin" )
+	fi
+
+	# Excluding tests that run on a different arch, use /dev/dri,
+	# /dev/net/tun, or wayland access because the bots don't support these.
+	# Also exclude sys_util since they already run as part of the
+	# dev-rust/sys_util package.
+	ecargo_test --all -v \
+		--exclude net_util \
+		--exclude gpu_buffer \
+		--exclude gpu_display \
+		--exclude gpu_renderer \
+		--exclude sys_util \
+		"${test_opts[@]}" \
+		-- --test-threads=1 \
+		"${skip_tests[@]}" \
+		|| die "cargo test failed"
+
+	# Plugin tests all require /dev/kvm, but we want to make sure they build
+	# at least.
+	if use crosvm-plugin; then
+		ecargo_test --no-run --features plugin \
+			|| die "cargo build with plugin feature failed"
+	fi
+}
+
+src_install() {
+	# cargo doesn't know how to install cross-compiled binaries.  It will
+	# always install native binaries for the host system.  Manually install
+	# crosvm instead.
+	local build_dir="$(cros-rust_get_build_dir)"
+	dobin "${build_dir}/crosvm"
+
+	# Install seccomp policy files.
+	local seccomp_path="${S}/$(get_seccomp_path)"
+	if [[ -d "${seccomp_path}" ]] ; then
+		local policy
+		for policy in "${seccomp_path}"/*.policy; do
+			sed -i "s:/usr/share/policy/crosvm:${seccomp_path}:g" "${policy}" \
+				|| die "failed to modify seccomp policy ${policy}"
+		done
+		for policy in "${seccomp_path}"/*.policy; do
+			local policy_output="${policy%.policy}.bpf"
+			compile_seccomp_policy \
+				--arch-json "${SYSROOT}/build/share/constants.json" \
+				--default-action trap "${policy}" "${policy_output}" \
+				|| die "failed to compile seccomp policy ${policy}"
+		done
+		rm "${seccomp_path}"/common_device.bpf
+		insinto /usr/share/policy/crosvm
+		doins "${seccomp_path}"/*.bpf
+	fi
+
+	# Install qcow utils library, header, and pkgconfig files.
+	dolib.so "${build_dir}/deps/libqcow_utils.so"
+
+	local include_dir="/usr/include/crosvm"
+
+	"${S}"/qcow_utils/platform2_preinstall.sh "${PV}" "${include_dir}" \
+		"${WORKDIR}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${WORKDIR}/libqcow_utils.pc"
+
+	insinto "${include_dir}"
+	doins "${S}"/qcow_utils/src/qcow_utils.h
+
+	# Install plugin library, when requested.
+	if use crosvm-plugin ; then
+		insinto "${include_dir}"
+		doins "${S}/crosvm_plugin/crosvm.h"
+		dolib.so "${build_dir}/deps/libcrosvm_plugin.so"
+	fi
+
+	if use fuzzer; then
+		cd fuzz
+		local f
+		for f in "${FUZZERS[@]}"; do
+			fuzzer_install "${S}/fuzz/OWNERS" \
+				"${build_dir}/${f}"
+		done
+	fi
+}
+
+pkg_preinst() {
+	enewuser "crosvm"
+	enewgroup "crosvm"
+}
diff --git a/chromeos-base/crosvm/crosvm-0.1.0-r893.ebuild b/chromeos-base/crosvm/crosvm-0.1.0-r893.ebuild
deleted file mode 100644
index de5c300..0000000
--- a/chromeos-base/crosvm/crosvm-0.1.0-r893.ebuild
+++ /dev/null
@@ -1,261 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="963e2ddcf205ba48dcae4a120a5f8599d0d20989"
-CROS_WORKON_TREE="f4a532bbbbf6aaeb48b896546f2e3ddad2ed0be4"
-CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
-CROS_WORKON_LOCALNAME="platform/crosvm"
-CROS_WORKON_INCREMENTAL_BUILD=1
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since crosvm/Cargo.toml is
-# using "# ignored by ebuild" macro which supported by cros-rust.
-
-inherit cros-fuzzer cros-rust cros-workon user
-
-KERNEL_PREBUILT_DATE="2019_10_10_00_22"
-
-DESCRIPTION="Utility for running VMs on Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crosvm/"
-SRC_URI="test? ( https://storage.googleapis.com/crosvm-testing/x86_64/${KERNEL_PREBUILT_DATE}/bzImage -> crosvm-bzImage-${KERNEL_PREBUILT_DATE} )"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test cros-debug crosvm-gpu -crosvm-plugin +crosvm-video-decoder +crosvm-video-encoder +crosvm-wl-dmabuf fuzzer tpm2 arcvm_gce_l1"
-
-COMMON_DEPEND="
-	sys-apps/dtc:=
-	sys-libs/libcap:=
-	chromeos-base/libvda:=
-	chromeos-base/minijail:=
-	crosvm-gpu? (
-		dev-libs/wayland:=
-		media-libs/virglrenderer:=
-	)
-	crosvm-wl-dmabuf? ( media-libs/minigbm:= )
-	virtual/libusb:1=
-"
-
-RDEPEND="${COMMON_DEPEND}
-	!chromeos-base/crosvm-bin
-"
-
-DEPEND="${COMMON_DEPEND}
-	fuzzer? (
-		dev-rust/cros_fuzz:=
-		=dev-rust/rand-0.6*:=
-	)
-	=dev-rust/bitflags-1*:=
-	~dev-rust/cc-1.0.25:=
-	=dev-rust/futures-0.3*:=
-	~dev-rust/getopts-0.2.18:=
-	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
-	dev-rust/libvda:=
-	dev-rust/minijail:=
-	~dev-rust/num_cpus-1.9.0:=
-	=dev-rust/paste-0.1*:=
-	=dev-rust/pin-utils-0.1*:=
-	~dev-rust/pkg-config-0.3.11:=
-	=dev-rust/proc-macro2-1*:=
-	>=dev-rust/protobuf-2.8:=
-	!>=dev-rust/protobuf-3
-	>=dev-rust/protoc-rust-2.8:=
-	!>=dev-rust/protoc-rust-3
-	=dev-rust/quote-1*:=
-	=dev-rust/syn-1*:=
-	dev-rust/trace_events:=
-	dev-rust/remain:=
-	tpm2? (
-		chromeos-base/tpm2:=
-		chromeos-base/trunks:=
-		=dev-rust/dbus-0.6*:=
-	)
-	media-sound/audio_streams:=
-	media-sound/libcras:=
-"
-
-get_seccomp_path() {
-	local seccomp_arch="unknown"
-	case ${ARCH} in
-		amd64) seccomp_arch=x86_64;;
-		arm) seccomp_arch=arm;;
-		arm64) seccomp_arch=aarch64;;
-	esac
-
-	echo "seccomp/${seccomp_arch}"
-}
-
-FUZZERS=(
-	crosvm_block_fuzzer
-	crosvm_fs_server_fuzzer
-	crosvm_qcow_fuzzer
-	crosvm_usb_descriptor_fuzzer
-	crosvm_virtqueue_fuzzer
-	crosvm_zimage_fuzzer
-)
-
-src_unpack() {
-	# Unpack both the project and dependency source code
-	cros-workon_src_unpack
-	cros-rust_src_unpack
-}
-
-src_prepare() {
-	cros-rust_src_prepare
-
-	if use arcvm_gce_l1; then
-		eapply "${FILESDIR}"/0001-betty-arcvm-Loose-mprotect-mmap-for-software-renderi.patch
-	fi
-
-	default
-}
-
-src_configure() {
-	cros-rust_src_configure
-
-	# Change the path used for the minijail pivot root from /var/empty.
-	# See: https://crbug.com/934513
-	export DEFAULT_PIVOT_ROOT="/mnt/empty"
-}
-
-src_compile() {
-	local features=(
-		$(usex crosvm-gpu gpu "")
-		$(usex crosvm-plugin plugin "")
-		$(usex crosvm-video-decoder video-decoder "")
-		$(usex crosvm-video-encoder video-encoder "")
-		$(usex crosvm-wl-dmabuf wl-dmabuf "")
-		$(usex tpm2 tpm "")
-	)
-
-	local packages=(
-		qcow_utils
-		crosvm
-	)
-
-	for pkg in "${packages[@]}"; do
-		ecargo_build -v \
-			--features="${features[*]}" \
-			-p "${pkg}" \
-			|| die "cargo build failed"
-	done
-
-	if use fuzzer; then
-		cd fuzz
-		local f
-		for f in "${FUZZERS[@]}"; do
-			ecargo_build_fuzzer --bin "${f}"
-		done
-	fi
-}
-
-src_test() {
-	# Some of the tests will use /dev/kvm.
-	addwrite /dev/kvm
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		local feature_excludes=()
-		use tpm2 || feature_excludes+=( --exclude tpm2 --exclude tpm2-sys )
-
-		# io_jail tests fork the process, which cause memory leak errors when
-		# run under sanitizers.
-		cros-rust_use_sanitizers && feature_excludes+=( --exclude io_jail )
-
-		export CROSVM_CARGO_TEST_KERNEL_BINARY="${DISTDIR}/crosvm-bzImage-${KERNEL_PREBUILT_DATE}"
-		[[ -e "${CROSVM_CARGO_TEST_KERNEL_BINARY}" ]] || \
-			die "expected to find kernel binary at ${CROSVM_CARGO_TEST_KERNEL_BINARY}"
-
-		local skip_tests=()
-		# The memfd_create() system call first appeared in Linux 3.17.  Skip
-		# the boot test, which relies on this functionality, on older kernels.
-		local cut_version=$(ver_cut 1-2 "$(uname -r)")
-		if ver_test 3.17 -gt "${cut_version}"; then
-			skip_tests+=( --skip "boot" )
-		fi
-
-		# Excluding tests that run on a different arch, use /dev/dri,
-		# /dev/net/tun, or wayland access because the bots don't support these.
-		# Also exclude sys_util since they already run as part of the
-		# dev-rust/sys_util package.
-		ecargo_test --all -v \
-			--exclude net_util \
-			--exclude aarch64 \
-			--exclude gpu_buffer \
-			--exclude gpu_display \
-			--exclude gpu_renderer \
-			--exclude sys_util \
-			"${feature_excludes[@]}" \
-			-- --test-threads=1 \
-			"${skip_tests[@]}" \
-			|| die "cargo test failed"
-
-		# Plugin tests all require /dev/kvm, but we want to make sure they build
-		# at least.
-		if use crosvm-plugin; then
-			ecargo_test --no-run --features plugin \
-				|| die "cargo build with plugin feature failed"
-		fi
-	fi
-}
-
-src_install() {
-	# cargo doesn't know how to install cross-compiled binaries.  It will
-	# always install native binaries for the host system.  Manually install
-	# crosvm instead.
-	local build_dir="$(cros-rust_get_build_dir)"
-	dobin "${build_dir}/crosvm"
-
-	# Install seccomp policy files.
-	local seccomp_path="${S}/$(get_seccomp_path)"
-	if [[ -d "${seccomp_path}" ]] ; then
-		local policy
-		for policy in "${seccomp_path}"/*.policy; do
-			sed -i "s:/usr/share/policy/crosvm:${seccomp_path}:g" "${policy}" \
-				|| die "failed to modify seccomp policy ${policy}"
-		done
-		for policy in "${seccomp_path}"/*.policy; do
-			local policy_output="${policy%.policy}.bpf"
-			compile_seccomp_policy \
-				--arch-json "${SYSROOT}/build/share/constants.json" \
-				--default-action trap "${policy}" "${policy_output}" \
-				|| die "failed to compile seccomp policy ${policy}"
-		done
-		rm "${seccomp_path}"/common_device.bpf
-		insinto /usr/share/policy/crosvm
-		doins "${seccomp_path}"/*.bpf
-	fi
-
-	# Install qcow utils library, header, and pkgconfig files.
-	dolib.so "${build_dir}/deps/libqcow_utils.so"
-
-	local include_dir="/usr/include/crosvm"
-
-	"${S}"/qcow_utils/platform2_preinstall.sh "${PV}" "${include_dir}" \
-		"${WORKDIR}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${WORKDIR}/libqcow_utils.pc"
-
-	insinto "${include_dir}"
-	doins "${S}"/qcow_utils/src/qcow_utils.h
-
-	# Install plugin library, when requested.
-	if use crosvm-plugin ; then
-		insinto "${include_dir}"
-		doins "${S}/crosvm_plugin/crosvm.h"
-		dolib.so "${build_dir}/deps/libcrosvm_plugin.so"
-	fi
-
-	if use fuzzer; then
-		cd fuzz
-		local f
-		for f in "${FUZZERS[@]}"; do
-			fuzzer_install "${S}/fuzz/OWNERS" \
-				"${build_dir}/${f}"
-		done
-	fi
-}
-
-pkg_preinst() {
-	enewuser "crosvm"
-	enewgroup "crosvm"
-}
diff --git a/chromeos-base/crosvm/crosvm-9999.ebuild b/chromeos-base/crosvm/crosvm-9999.ebuild
index 816b981..cdf1ae8 100644
--- a/chromeos-base/crosvm/crosvm-9999.ebuild
+++ b/chromeos-base/crosvm/crosvm-9999.ebuild
@@ -38,6 +38,9 @@
 "
 
 DEPEND="${COMMON_DEPEND}
+	=dev-rust/android_log-sys-0.2*:=
+	>=dev-rust/anyhow-1.0.32:= <dev-rust/anyhow-2.0
+	=dev-rust/async-trait-0.1*:=
 	fuzzer? (
 		dev-rust/cros_fuzz:=
 		=dev-rust/rand-0.6*:=
@@ -50,6 +53,7 @@
 	dev-rust/libvda:=
 	dev-rust/minijail:=
 	~dev-rust/num_cpus-1.9.0:=
+	dev-rust/p9:=
 	=dev-rust/paste-0.1*:=
 	=dev-rust/pin-utils-0.1*:=
 	~dev-rust/pkg-config-0.3.11:=
@@ -60,6 +64,7 @@
 	!>=dev-rust/protoc-rust-3
 	=dev-rust/quote-1*:=
 	=dev-rust/syn-1*:=
+	>=dev-rust/thiserror-1.0.20:= <dev-rust/thiserror-2.0
 	dev-rust/trace_events:=
 	dev-rust/remain:=
 	tpm2? (
@@ -118,11 +123,13 @@
 src_compile() {
 	local features=(
 		$(usex crosvm-gpu gpu "")
+		$(usex crosvm-gpu virtio-gpu-next "")
 		$(usex crosvm-plugin plugin "")
 		$(usex crosvm-video-decoder video-decoder "")
 		$(usex crosvm-video-encoder video-encoder "")
 		$(usex crosvm-wl-dmabuf wl-dmabuf "")
 		$(usex tpm2 tpm "")
+		chromeos
 	)
 
 	local packages=(
@@ -149,50 +156,58 @@
 src_test() {
 	# Some of the tests will use /dev/kvm.
 	addwrite /dev/kvm
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		local feature_excludes=()
-		use tpm2 || feature_excludes+=( --exclude tpm2 --exclude tpm2-sys )
+	local test_opts=()
+	use tpm2 || test_opts+=( --exclude tpm2 --exclude tpm2-sys )
 
-		# io_jail tests fork the process, which cause memory leak errors when
-		# run under sanitizers.
-		cros-rust_use_sanitizers && feature_excludes+=( --exclude io_jail )
+	# io_jail tests fork the process, which cause memory leak errors when
+	# run under sanitizers.
+	cros-rust_use_sanitizers && test_opts+=( --exclude io_jail )
 
-		export CROSVM_CARGO_TEST_KERNEL_BINARY="${DISTDIR}/crosvm-bzImage-${KERNEL_PREBUILT_DATE}"
-		[[ -e "${CROSVM_CARGO_TEST_KERNEL_BINARY}" ]] || \
-			die "expected to find kernel binary at ${CROSVM_CARGO_TEST_KERNEL_BINARY}"
+	export CROSVM_CARGO_TEST_KERNEL_BINARY="${DISTDIR}/crosvm-bzImage-${KERNEL_PREBUILT_DATE}"
+	[[ -e "${CROSVM_CARGO_TEST_KERNEL_BINARY}" ]] || \
+		die "expected to find kernel binary at ${CROSVM_CARGO_TEST_KERNEL_BINARY}"
 
-		local skip_tests=()
-		# The memfd_create() system call first appeared in Linux 3.17.  Skip
-		# the boot test, which relies on this functionality, on older kernels.
-		local cut_version=$(ver_cut 1-2 "$(uname -r)")
-		if ver_test 3.17 -gt "${cut_version}"; then
-			skip_tests+=( --skip "boot" )
-		fi
+	local skip_tests=()
+	# The memfd_create() system call first appeared in Linux 3.17.  Skip
+	# the boot test, which relies on this functionality, on older kernels.
+	local cut_version=$(ver_cut 1-2 "$(uname -r)")
+	if ver_test 3.17 -gt "${cut_version}"; then
+		skip_tests+=( --skip "boot" )
+	fi
 
-		# Excluding tests that run on a different arch, use /dev/dri,
-		# /dev/net/tun, or wayland access because the bots don't support these.
-		# Also exclude sys_util since they already run as part of the
-		# dev-rust/sys_util package.
-		ecargo_test --all -v \
-			--exclude net_util \
-			--exclude aarch64 \
-			--exclude gpu_buffer \
-			--exclude gpu_display \
-			--exclude gpu_renderer \
-			--exclude sys_util \
-			"${feature_excludes[@]}" \
-			-- --test-threads=1 \
-			"${skip_tests[@]}" \
-			|| die "cargo test failed"
+	if ! use x86 && ! use amd64; then
+		test_opts+=( --exclude "x86_64" )
+		test_opts+=( --no-run )
+	fi
 
-		# Plugin tests all require /dev/kvm, but we want to make sure they build
-		# at least.
-		if use crosvm-plugin; then
-			ecargo_test --no-run --features plugin \
-				|| die "cargo build with plugin feature failed"
-		fi
+	if ! use arm64; then
+		test_opts+=( --exclude "aarch64" )
+	fi
+
+	if ! use crosvm-plugin; then
+		test_opts+=( --exclude "crosvm_plugin" )
+	fi
+
+	# Excluding tests that run on a different arch, use /dev/dri,
+	# /dev/net/tun, or wayland access because the bots don't support these.
+	# Also exclude sys_util since they already run as part of the
+	# dev-rust/sys_util package.
+	ecargo_test --all -v \
+		--exclude net_util \
+		--exclude gpu_buffer \
+		--exclude gpu_display \
+		--exclude gpu_renderer \
+		--exclude sys_util \
+		"${test_opts[@]}" \
+		-- --test-threads=1 \
+		"${skip_tests[@]}" \
+		|| die "cargo test failed"
+
+	# Plugin tests all require /dev/kvm, but we want to make sure they build
+	# at least.
+	if use crosvm-plugin; then
+		ecargo_test --no-run --features plugin \
+			|| die "cargo build with plugin feature failed"
 	fi
 }
 
diff --git a/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r890.ebuild b/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r890.ebuild
deleted file mode 100644
index 7a98b87..0000000
--- a/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r890.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="89c1e8fed12123dd92697e3da4b51eb7a33c2ccc"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a116bda3b891d74f8d71060d56a161ed465ffc4a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk cryptohome .gn"
-
-PLATFORM_SUBDIR="cryptohome/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Cryptohome D-Bus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies.
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings
-"
-
-RDEPEND="
-	!<chromeos-base/cryptohome-0.0.1
-"
-
-src_install() {
-	# Install D-Bus client library.
-	platform_install_dbus_client_lib "cryptohome"
-}
diff --git a/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r992.ebuild b/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r992.ebuild
new file mode 100644
index 0000000..0c3a6a2
--- /dev/null
+++ b/chromeos-base/cryptohome-client/cryptohome-client-0.0.1-r992.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f4e87d8faed98e77dea8d99d1656da5c72178c9e"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ac2e4e99b6584995504d17d6a75fe01c195428a2" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk cryptohome .gn"
+
+PLATFORM_SUBDIR="cryptohome/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Cryptohome D-Bus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies.
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings
+"
+
+RDEPEND="
+	!<chromeos-base/cryptohome-0.0.1
+"
+
+src_install() {
+	# Install D-Bus client library.
+	platform_install_dbus_client_lib "cryptohome"
+}
diff --git a/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r721.ebuild b/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r721.ebuild
deleted file mode 100644
index c530d8d..0000000
--- a/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r721.ebuild
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="89c1e8fed12123dd92697e3da4b51eb7a33c2ccc"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a116bda3b891d74f8d71060d56a161ed465ffc4a" "e5d3b93967ab0491498bc90862f9bee73883fea8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk cryptohome secure_erase_file .gn"
-
-PLATFORM_SUBDIR="cryptohome/dev-utils"
-
-inherit cros-workon platform
-
-DESCRIPTION="Cryptohome developer and testing utilities for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="tpm tpm2"
-
-REQUIRED_USE="tpm2? ( !tpm )"
-
-COMMON_DEPEND="
-	tpm? (
-		app-crypt/trousers:=
-	)
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	chromeos-base/attestation:=
-	chromeos-base/biod_proxy:=
-	chromeos-base/chaps:=
-	chromeos-base/libscrypt:=
-	chromeos-base/metrics:=
-	chromeos-base/tpm_manager:=
-	chromeos-base/secure-erase-file:=
-	dev-libs/glib:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-	sys-apps/keyutils:=
-	sys-fs/e2fsprogs:=
-	sys-fs/ecryptfs-utils:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/vboot_reference:=
-"
-
-src_install() {
-	dosbin "${OUT}"/cryptohome-tpm-live-test
-}
diff --git a/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r825.ebuild b/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r825.ebuild
new file mode 100644
index 0000000..bb45002
--- /dev/null
+++ b/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-0.0.1-r825.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f4e87d8faed98e77dea8d99d1656da5c72178c9e"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ac2e4e99b6584995504d17d6a75fe01c195428a2" "6b6ef5508fa314869c1fa0c0847a11651143f224" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk cryptohome secure_erase_file .gn"
+
+PLATFORM_SUBDIR="cryptohome/dev-utils"
+
+inherit cros-workon platform
+
+DESCRIPTION="Cryptohome developer and testing utilities for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="tpm tpm2"
+
+REQUIRED_USE="tpm2? ( !tpm )"
+
+COMMON_DEPEND="
+	tpm? (
+		app-crypt/trousers:=
+	)
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	chromeos-base/attestation:=
+	chromeos-base/biod_proxy:=
+	chromeos-base/chaps:=
+	chromeos-base/libscrypt:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/tpm_manager:=
+	chromeos-base/secure-erase-file:=
+	dev-libs/glib:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+	sys-apps/keyutils:=
+	sys-fs/e2fsprogs:=
+	sys-fs/ecryptfs-utils:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/vboot_reference:=
+"
+
+src_install() {
+	dosbin "${OUT}"/cryptohome-tpm-live-test
+}
diff --git a/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-9999.ebuild b/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-9999.ebuild
index 3fd3656..dc46a36 100644
--- a/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-9999.ebuild
+++ b/chromeos-base/cryptohome-dev-utils/cryptohome-dev-utils-9999.ebuild
@@ -35,7 +35,7 @@
 	chromeos-base/biod_proxy:=
 	chromeos-base/chaps:=
 	chromeos-base/libscrypt:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/tpm_manager:=
 	chromeos-base/secure-erase-file:=
 	dev-libs/glib:=
diff --git a/chromeos-base/cryptohome/cryptohome-0.0.1-r3235.ebuild b/chromeos-base/cryptohome/cryptohome-0.0.1-r3235.ebuild
deleted file mode 100644
index 5213efb..0000000
--- a/chromeos-base/cryptohome/cryptohome-0.0.1-r3235.ebuild
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="89c1e8fed12123dd92697e3da4b51eb7a33c2ccc"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a116bda3b891d74f8d71060d56a161ed465ffc4a" "1bf01f1a340a50edee0e82b52621117c8388644c" "e5d3b93967ab0491498bc90862f9bee73883fea8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk cryptohome libhwsec secure_erase_file .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="cryptohome"
-
-inherit cros-workon platform systemd udev user
-
-DESCRIPTION="Encrypted home directories for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-# The flag distributed_cryptohome is for turning on tpm_manager and
-# attestation for 1.2 devices.
-IUSE="-cert_provision cryptohome_userdataauth_interface +device_mapper
-	-direncryption distributed_cryptohome double_extend_pcr_issue fuzzer
-	generated_cros_config pinweaver selinux systemd test tpm tpm2
-	unibuild user_session_isolation"
-
-REQUIRED_USE="
-	device_mapper
-	tpm2? ( !tpm )
-"
-
-COMMON_DEPEND="
-	!chromeos-base/chromeos-cryptohome
-	tpm? (
-		app-crypt/trousers:=
-	)
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	selinux? (
-		sys-libs/libselinux:=
-	)
-	chromeos-base/attestation:=
-	chromeos-base/biod_proxy:=
-	chromeos-base/cbor:=
-	chromeos-base/chaps:=
-	chromeos-base/chromeos-config-tools:=
-	chromeos-base/libhwsec:=
-	chromeos-base/libscrypt:=
-	chromeos-base/metrics:=
-	chromeos-base/secure-erase-file:=
-	chromeos-base/tpm_manager:=
-	dev-libs/dbus-glib:=
-	dev-libs/glib:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-	sys-apps/flashmap:=
-	sys-apps/keyutils:=
-	sys-fs/e2fsprogs:=
-	sys-fs/ecryptfs-utils:=
-	sys-fs/lvm2:=
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	tpm2? ( chromeos-base/trunks:=[test?] )
-	chromeos-base/attestation-client:=
-	chromeos-base/bootlockbox-client:=
-	chromeos-base/cryptohome-client:=
-	chromeos-base/power_manager-client:=
-	chromeos-base/protofiles:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/tpm_manager-client:=
-	chromeos-base/vboot_reference:=
-	chromeos-base/libhwsec:=
-"
-
-src_install() {
-	pushd "${OUT}" >/dev/null
-	dosbin cryptohomed cryptohome cryptohome-proxy cryptohome-path homedirs_initializer \
-		lockbox-cache tpm-manager
-	dosbin cryptohome-namespace-mounter
-	dosbin mount-encrypted
-	dosbin encrypted-reboot-vault
-	if use tpm2; then
-		dosbin bootlockboxd bootlockboxtool
-	fi
-	if use cert_provision; then
-		dolib.so lib/libcert_provision.so
-		dosbin cert_provision_client
-	fi
-	popd >/dev/null
-
-	insinto /etc/dbus-1/system.d
-	doins etc/Cryptohome.conf
-	doins etc/org.chromium.UserDataAuth.conf
-	if use tpm2; then
-		doins etc/BootLockbox.conf
-	fi
-
-	# Install init scripts
-	if use systemd; then
-		if use tpm2; then
-			sed 's/tcsd.service/attestationd.service/' \
-				init/cryptohomed.service \
-				> "${T}/cryptohomed.service"
-			systemd_dounit "${T}/cryptohomed.service"
-		else
-			systemd_dounit init/cryptohomed.service
-		fi
-		systemd_dounit init/mount-encrypted.service
-		systemd_dounit init/lockbox-cache.service
-		systemd_enable_service boot-services.target cryptohomed.service
-		systemd_enable_service system-services.target mount-encrypted.service
-		systemd_enable_service ui.target lockbox-cache.service
-	else
-		insinto /etc/init
-		doins init/*.conf
-		if use tpm2; then
-			sed -i 's/started tcsd/started attestationd/' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't replace tcsd with attestationd in cryptohomed.conf"
-			insinto /usr/share/policy
-			newins bootlockbox/seccomp/bootlockboxd-seccomp-${ARCH}.policy \
-				bootlockboxd-seccomp.policy
-			insinto /etc/init
-			doins bootlockbox/bootlockboxd.conf
-		else
-			sed -i 's/started tcsd/started attestationd/' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't replace tcsd with attestationd in cryptohomed.conf"
-			sed -i '/env DISTRIBUTED_MODE_FLAG=/s:=.*:="--attestation_mode=dbus":' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't activate distributed mode in cryptohomed.conf"
-		fi
-		if use direncryption; then
-			sed -i '/env DIRENCRYPTION_FLAG=/s:=.*:="--direncryption":' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't replace direncryption flag in cryptohomed.conf"
-		fi
-	fi
-	exeinto /usr/share/cros/init
-	doexe init/lockbox-cache.sh
-	if use cert_provision; then
-		insinto /usr/include/cryptohome
-		doins cert_provision.h
-	fi
-
-	# Install the configuration file and utility for detecting if the new
-	# (UserDataAuth) or old interface is used.
-	insinto /etc/
-	doins cryptohome_userdataauth_interface.conf
-	exeinto /usr/libexec/cryptohome
-	doexe shall-use-userdataauth.sh
-	doexe update_userdataauth_from_features.sh
-
-	# Disable the kill switch if the use flag is on.
-	if use cryptohome_userdataauth_interface; then
-		sed -i 's/killswitch=on/killswitch=off/' \
-			"${D}/usr/libexec/cryptohome/shall-use-userdataauth.sh" ||
-			die "Can't disable kill switch in shall-use-userdataauth.sh"
-	fi
-
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/cryptohome_cryptolib_rsa_oaep_decrypt_fuzzer \
-		fuzzers/data/*
-
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/cryptohome_cryptolib_blob_to_hex_fuzzer
-}
-
-pkg_preinst() {
-	enewuser "bootlockboxd"
-	enewgroup "bootlockboxd"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/cryptohome_testrunner"
-	platform_test "run" "${OUT}/mount_encrypted_unittests"
-	if use tpm2; then
-		platform_test "run" "${OUT}/boot_lockbox_unittests"
-	fi
-}
diff --git a/chromeos-base/cryptohome/cryptohome-0.0.1-r3344.ebuild b/chromeos-base/cryptohome/cryptohome-0.0.1-r3344.ebuild
new file mode 100644
index 0000000..39fd319
--- /dev/null
+++ b/chromeos-base/cryptohome/cryptohome-0.0.1-r3344.ebuild
@@ -0,0 +1,196 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f4e87d8faed98e77dea8d99d1656da5c72178c9e"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ac2e4e99b6584995504d17d6a75fe01c195428a2" "59ded4c8a6ec924cce82ba942070e51132ca1161" "6b6ef5508fa314869c1fa0c0847a11651143f224" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk cryptohome libhwsec secure_erase_file .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="cryptohome"
+
+inherit cros-workon platform systemd udev user
+
+DESCRIPTION="Encrypted home directories for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="-cert_provision cryptohome_userdataauth_interface +device_mapper
+	-direncryption double_extend_pcr_issue fuzzer
+	generated_cros_config mount_oop pinweaver selinux systemd test tpm tpm2
+	unibuild user_session_isolation"
+
+REQUIRED_USE="
+	device_mapper
+	tpm2? ( !tpm )
+"
+
+COMMON_DEPEND="
+	!chromeos-base/chromeos-cryptohome
+	tpm? (
+		app-crypt/trousers:=
+	)
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	selinux? (
+		sys-libs/libselinux:=
+	)
+	chromeos-base/attestation:=
+	chromeos-base/biod_proxy:=
+	chromeos-base/cbor:=
+	chromeos-base/chaps:=
+	chromeos-base/chromeos-config-tools:=
+	chromeos-base/libhwsec:=
+	chromeos-base/libscrypt:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/secure-erase-file:=
+	chromeos-base/tpm_manager:=
+	dev-libs/dbus-glib:=
+	dev-libs/glib:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+	sys-apps/flashmap:=
+	sys-apps/keyutils:=
+	sys-fs/e2fsprogs:=
+	sys-fs/ecryptfs-utils:=
+	sys-fs/lvm2:=
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	tpm2? ( chromeos-base/trunks:=[test?] )
+	chromeos-base/attestation-client:=
+	chromeos-base/bootlockbox-client:=
+	chromeos-base/cryptohome-client:=
+	chromeos-base/power_manager-client:=
+	chromeos-base/protofiles:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/tpm_manager-client:=
+	chromeos-base/vboot_reference:=
+	chromeos-base/libhwsec:=
+"
+
+src_install() {
+	pushd "${OUT}" >/dev/null
+	dosbin cryptohomed cryptohome cryptohome-proxy cryptohome-path homedirs_initializer \
+		lockbox-cache tpm-manager
+	dosbin cryptohome-namespace-mounter
+	dosbin mount-encrypted
+	dosbin encrypted-reboot-vault
+	if use tpm2; then
+		dosbin bootlockboxd bootlockboxtool
+	fi
+	if use cert_provision; then
+		dolib.so lib/libcert_provision.so
+		dosbin cert_provision_client
+	fi
+	popd >/dev/null
+
+	insinto /etc/dbus-1/system.d
+	doins etc/Cryptohome.conf
+	doins etc/org.chromium.UserDataAuth.conf
+	if use tpm2; then
+		doins etc/BootLockbox.conf
+	fi
+
+	# Install init scripts
+	if use systemd; then
+		if use tpm2; then
+			sed 's/tcsd.service/attestationd.service/' \
+				init/cryptohomed.service \
+				> "${T}/cryptohomed.service"
+			systemd_dounit "${T}/cryptohomed.service"
+		else
+			systemd_dounit init/cryptohomed.service
+		fi
+		systemd_dounit init/mount-encrypted.service
+		systemd_dounit init/lockbox-cache.service
+		systemd_enable_service boot-services.target cryptohomed.service
+		systemd_enable_service system-services.target mount-encrypted.service
+		systemd_enable_service ui.target lockbox-cache.service
+	else
+		insinto /etc/init
+		doins init/*.conf
+		if use tpm2; then
+			insinto /usr/share/policy
+			newins bootlockbox/seccomp/bootlockboxd-seccomp-${ARCH}.policy \
+				bootlockboxd-seccomp.policy
+			insinto /etc/init
+			doins bootlockbox/bootlockboxd.conf
+		else
+			sed -i '/env DISTRIBUTED_MODE_FLAG=/s:=.*:="--attestation_mode=dbus":' \
+				"${D}/etc/init/cryptohomed.conf" ||
+				die "Can't activate distributed mode in cryptohomed.conf"
+		fi
+		if use direncryption; then
+			sed -i '/env DIRENCRYPTION_FLAG=/s:=.*:="--direncryption":' \
+				"${D}/etc/init/cryptohomed.conf" ||
+				die "Can't replace direncryption flag in cryptohomed.conf"
+		fi
+	fi
+	exeinto /usr/share/cros/init
+	doexe init/lockbox-cache.sh
+	if use cert_provision; then
+		insinto /usr/include/cryptohome
+		doins cert_provision.h
+	fi
+
+	# Install the configuration file and utility for detecting if the new
+	# (UserDataAuth) or old interface is used.
+	insinto /etc/
+	doins cryptohome_userdataauth_interface.conf
+	exeinto /usr/libexec/cryptohome
+	doexe shall-use-userdataauth.sh
+	doexe update_userdataauth_from_features.sh
+
+	# Install seccomp policy for cryptohome-proxy
+	insinto /usr/share/policy
+	newins "seccomp/cryptohome-proxy-${ARCH}.policy" cryptohome-proxy.policy
+
+	# Disable the kill switch if the use flag is on.
+	if use cryptohome_userdataauth_interface; then
+		sed -i 's/killswitch=on/killswitch=off/' \
+			"${D}/usr/libexec/cryptohome/shall-use-userdataauth.sh" ||
+			die "Can't disable kill switch in shall-use-userdataauth.sh"
+	fi
+
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/cryptohome_cryptolib_rsa_oaep_decrypt_fuzzer \
+		fuzzers/data/*
+
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/cryptohome_cryptolib_blob_to_hex_fuzzer
+
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/cryptohome_tpm1_cmk_migration_parser_fuzzer \
+		fuzzers/data/*
+}
+
+pkg_preinst() {
+	enewuser "bootlockboxd"
+	enewgroup "bootlockboxd"
+	enewuser "cryptohome"
+	enewgroup "cryptohome"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/cryptohome_testrunner"
+	platform_test "run" "${OUT}/mount_encrypted_unittests"
+	if use tpm2; then
+		platform_test "run" "${OUT}/boot_lockbox_unittests"
+	fi
+}
diff --git a/chromeos-base/cryptohome/cryptohome-9999.ebuild b/chromeos-base/cryptohome/cryptohome-9999.ebuild
index 8d343ff..08d795f 100644
--- a/chromeos-base/cryptohome/cryptohome-9999.ebuild
+++ b/chromeos-base/cryptohome/cryptohome-9999.ebuild
@@ -22,11 +22,9 @@
 LICENSE="BSD-Google"
 SLOT="0/0"
 KEYWORDS="~*"
-# The flag distributed_cryptohome is for turning on tpm_manager and
-# attestation for 1.2 devices.
 IUSE="-cert_provision cryptohome_userdataauth_interface +device_mapper
-	-direncryption distributed_cryptohome double_extend_pcr_issue fuzzer
-	generated_cros_config pinweaver selinux systemd test tpm tpm2
+	-direncryption double_extend_pcr_issue fuzzer
+	generated_cros_config mount_oop pinweaver selinux systemd test tpm tpm2
 	unibuild user_session_isolation"
 
 REQUIRED_USE="
@@ -52,7 +50,7 @@
 	chromeos-base/chromeos-config-tools:=
 	chromeos-base/libhwsec:=
 	chromeos-base/libscrypt:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/secure-erase-file:=
 	chromeos-base/tpm_manager:=
 	dev-libs/dbus-glib:=
@@ -126,18 +124,12 @@
 		insinto /etc/init
 		doins init/*.conf
 		if use tpm2; then
-			sed -i 's/started tcsd/started attestationd/' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't replace tcsd with attestationd in cryptohomed.conf"
 			insinto /usr/share/policy
 			newins bootlockbox/seccomp/bootlockboxd-seccomp-${ARCH}.policy \
 				bootlockboxd-seccomp.policy
 			insinto /etc/init
 			doins bootlockbox/bootlockboxd.conf
 		else
-			sed -i 's/started tcsd/started attestationd/' \
-				"${D}/etc/init/cryptohomed.conf" ||
-				die "Can't replace tcsd with attestationd in cryptohomed.conf"
 			sed -i '/env DISTRIBUTED_MODE_FLAG=/s:=.*:="--attestation_mode=dbus":' \
 				"${D}/etc/init/cryptohomed.conf" ||
 				die "Can't activate distributed mode in cryptohomed.conf"
@@ -163,6 +155,10 @@
 	doexe shall-use-userdataauth.sh
 	doexe update_userdataauth_from_features.sh
 
+	# Install seccomp policy for cryptohome-proxy
+	insinto /usr/share/policy
+	newins "seccomp/cryptohome-proxy-${ARCH}.policy" cryptohome-proxy.policy
+
 	# Disable the kill switch if the use flag is on.
 	if use cryptohome_userdataauth_interface; then
 		sed -i 's/killswitch=on/killswitch=off/' \
@@ -176,11 +172,17 @@
 
 	platform_fuzzer_install "${S}"/OWNERS \
 		"${OUT}"/cryptohome_cryptolib_blob_to_hex_fuzzer
+
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/cryptohome_tpm1_cmk_migration_parser_fuzzer \
+		fuzzers/data/*
 }
 
 pkg_preinst() {
 	enewuser "bootlockboxd"
 	enewgroup "bootlockboxd"
+	enewuser "cryptohome"
+	enewgroup "cryptohome"
 }
 
 platform_pkg_test() {
diff --git a/chromeos-base/cups-fuzz/OWNERS b/chromeos-base/cups-fuzz/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/chromeos-base/cups-fuzz/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/chromeos-base/cups-fuzz/cups-fuzz-2.2.8-r6.ebuild b/chromeos-base/cups-fuzz/cups-fuzz-2.2.8-r6.ebuild
deleted file mode 100644
index 1199133..0000000
--- a/chromeos-base/cups-fuzz/cups-fuzz-2.2.8-r6.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="259f022bc0aea8c1258f8f28909de6e84d1775c2"
-CROS_WORKON_TREE="6c56a58a6808e59bd763896a3b4e5fc1228d1c94"
-CROS_WORKON_LOCALNAME="third_party/cups"
-CROS_WORKON_PROJECT="chromiumos/third_party/cups"
-CROS_WORKON_EGIT_BRANCH="cups-2-2-8"
-CROS_WORKON_SUBTREE="fuzzers"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-fuzzer cros-sanitizers cros-workon flag-o-matic libchrome toolchain-funcs
-
-DESCRIPTION="Fuzzer for PPD and IPP functions in CUPS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/cups/+/cups-2-2-8/fuzzers/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="asan fuzzer"
-
-COMMON_DEPEND="net-print/cups:=[fuzzer]"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-# We really don't want to be building this otherwise.
-REQUIRED_USE="fuzzer"
-
-src_unpack() {
-	cros-workon_src_unpack
-}
-
-src_configure() {
-	sanitizers-setup-env || die
-	fuzzer-setup-binary || die
-	append-ldflags "$(${CHOST}-cups-config --libs)"
-	local v="$(libchrome_ver)"
-	append-ldflags "$($(tc-getPKG_CONFIG) --libs libchrome-"${v}")"
-	append-cppflags "$($(tc-getPKG_CONFIG) --cflags libchrome-"${v}")"
-}
-
-src_compile() {
-	local build_dir="$(cros-workon_get_build_dir)"
-	VPATH="${S}"/fuzzers emake -C "${build_dir}" cups_ppdopen_fuzzer
-	VPATH="${S}"/fuzzers emake -C "${build_dir}" cups_ippreadio_fuzzer
-}
-
-src_install() {
-	local build_dir="$(cros-workon_get_build_dir)"
-	fuzzer_install "${S}"/fuzzers/OWNERS "${build_dir}"/cups_ppdopen_fuzzer
-	fuzzer_install "${S}"/fuzzers/OWNERS "${build_dir}"/cups_ippreadio_fuzzer
-}
diff --git a/chromeos-base/cups-fuzz/cups-fuzz-2.3.3-r10.ebuild b/chromeos-base/cups-fuzz/cups-fuzz-2.3.3-r10.ebuild
new file mode 100644
index 0000000..34122d3
--- /dev/null
+++ b/chromeos-base/cups-fuzz/cups-fuzz-2.3.3-r10.ebuild
@@ -0,0 +1,56 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="6b9d47e5b1e864d22df88844986933259a7d1482"
+CROS_WORKON_TREE="6c56a58a6808e59bd763896a3b4e5fc1228d1c94"
+CROS_WORKON_LOCALNAME="third_party/cups"
+CROS_WORKON_PROJECT="chromiumos/third_party/cups"
+CROS_WORKON_EGIT_BRANCH="v2.3"
+CROS_WORKON_SUBTREE="fuzzers"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-fuzzer cros-sanitizers cros-workon flag-o-matic libchrome toolchain-funcs
+
+DESCRIPTION="Fuzzer for PPD and IPP functions in CUPS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/cups/+/cups-2-2-8/fuzzers/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="asan fuzzer"
+
+COMMON_DEPEND="net-print/cups:=[fuzzer]"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+# We really don't want to be building this otherwise.
+REQUIRED_USE="fuzzer"
+
+src_unpack() {
+	cros-workon_src_unpack
+}
+
+src_configure() {
+	sanitizers-setup-env || die
+	fuzzer-setup-binary || die
+	append-ldflags "$(${CHOST}-cups-config --libs)"
+	local v="$(libchrome_ver)"
+	append-ldflags "$($(tc-getPKG_CONFIG) --libs libchrome-"${v}")"
+	append-cppflags "$($(tc-getPKG_CONFIG) --cflags libchrome-"${v}")"
+}
+
+src_compile() {
+	local build_dir="$(cros-workon_get_build_dir)"
+	VPATH="${S}"/fuzzers emake -C "${build_dir}" cups_ppdopen_fuzzer
+	VPATH="${S}"/fuzzers emake -C "${build_dir}" cups_ippreadio_fuzzer
+}
+
+src_install() {
+	local build_dir="$(cros-workon_get_build_dir)"
+	fuzzer_install "${S}"/fuzzers/OWNERS "${build_dir}"/cups_ppdopen_fuzzer
+	fuzzer_install "${S}"/fuzzers/OWNERS "${build_dir}"/cups_ippreadio_fuzzer
+}
diff --git a/chromeos-base/cups-fuzz/cups-fuzz-9999.ebuild b/chromeos-base/cups-fuzz/cups-fuzz-9999.ebuild
index 1306bdb..dae7cef 100644
--- a/chromeos-base/cups-fuzz/cups-fuzz-9999.ebuild
+++ b/chromeos-base/cups-fuzz/cups-fuzz-9999.ebuild
@@ -5,7 +5,7 @@
 
 CROS_WORKON_LOCALNAME="third_party/cups"
 CROS_WORKON_PROJECT="chromiumos/third_party/cups"
-CROS_WORKON_EGIT_BRANCH="cups-2-2-8"
+CROS_WORKON_EGIT_BRANCH="v2.3"
 CROS_WORKON_SUBTREE="fuzzers"
 CROS_WORKON_INCREMENTAL_BUILD=1
 CROS_WORKON_OUTOFTREE_BUILD=1
diff --git a/chromeos-base/debugd-client/debugd-client-0.0.1-r1871.ebuild b/chromeos-base/debugd-client/debugd-client-0.0.1-r1871.ebuild
deleted file mode 100644
index c6f0110b..0000000
--- a/chromeos-base/debugd-client/debugd-client-0.0.1-r1871.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="53aa6dbb69b3346f45ff99d944e46def3e8678de"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "2ebd132c9048fba8cef7b8bc96081be9377d72f5" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk debugd .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="debugd/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS debugd client library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies. We require the particular
-# revision because libbrillo-0.0.1-r1 changed location of header files from
-# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
-# code using the new location.
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings
-"
-
-src_install() {
-  # Install DBus client library.
-  platform_install_dbus_client_lib "debugd"
-}
diff --git a/chromeos-base/debugd-client/debugd-client-0.0.1-r1914.ebuild b/chromeos-base/debugd-client/debugd-client-0.0.1-r1914.ebuild
new file mode 100644
index 0000000..7cfdb6e
--- /dev/null
+++ b/chromeos-base/debugd-client/debugd-client-0.0.1-r1914.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="a109557dbcaa27e6ad00ab62c433afd03203c290"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "8a627edf629f2dda550722427ca0627c393dd207" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk debugd .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="debugd/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS debugd client library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies. We require the particular
+# revision because libbrillo-0.0.1-r1 changed location of header files from
+# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
+# code using the new location.
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings
+"
+
+src_install() {
+  # Install DBus client library.
+  platform_install_dbus_client_lib "debugd"
+}
diff --git a/chromeos-base/debugd/debugd-0.0.1-r2885.ebuild b/chromeos-base/debugd/debugd-0.0.1-r2885.ebuild
deleted file mode 100644
index caa7741..0000000
--- a/chromeos-base/debugd/debugd-0.0.1-r2885.ebuild
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="53aa6dbb69b3346f45ff99d944e46def3e8678de"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "2ebd132c9048fba8cef7b8bc96081be9377d72f5" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk debugd .gn"
-
-PLATFORM_SUBDIR="debugd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Chrome OS debugging service"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cellular iwlwifi_dump nvme sata tpm"
-
-COMMON_DEPEND="
-	chromeos-base/chromeos-login:=
-	chromeos-base/minijail:=
-	chromeos-base/shill-client:=
-	chromeos-base/vboot_reference:=
-	dev-libs/protobuf:=
-	net-libs/libpcap:=
-	net-wireless/iw:=
-	sys-apps/rootdev:=
-	sata? ( sys-apps/smartmontools:= )
-"
-RDEPEND="${COMMON_DEPEND}
-	iwlwifi_dump? ( chromeos-base/intel-wifi-fw-dump )
-	nvme? ( sys-apps/nvme-cli )
-	chromeos-base/chromeos-ssh-testkeys
-	chromeos-base/chromeos-sshd-init
-	!chromeos-base/workarounds
-	sys-apps/iproute2
-	sys-apps/memtester
-"
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/debugd-client:=
-	chromeos-base/system_api:=
-	sys-apps/dbus:="
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs debugd.
-	enewuser "debugd"
-	enewgroup "debugd"
-
-	cros-workon_pkg_setup
-}
-
-pkg_preinst() {
-	enewuser "debugd-logs"
-	enewgroup "debugd-logs"
-
-	enewgroup "daemon-store"
-	enewgroup "logs-access"
-}
-
-src_install() {
-	dobin "${OUT}"/generate_logs
-
-	into /
-	dosbin "${OUT}"/debugd
-
-	exeinto /usr/libexec/debugd/helpers
-	doexe "${OUT}"/capture_packets
-	doexe "${OUT}"/cups_uri_helper
-	doexe "${OUT}"/dev_features_chrome_remote_debugging
-	doexe "${OUT}"/dev_features_password
-	doexe "${OUT}"/dev_features_rootfs_verification
-	doexe "${OUT}"/dev_features_ssh
-	doexe "${OUT}"/dev_features_usb_boot
-	doexe "${OUT}"/icmp
-	doexe "${OUT}"/netif
-	doexe "${OUT}"/network_status
-
-	doexe src/helpers/{capture_utility,minijail-setuid-hack,systrace}.sh
-
-	local debugd_seccomp_dir="src/helpers/seccomp"
-
-	# Install scheduler configuration helper and seccomp policy.
-	if use amd64 ; then
-		exeinto /usr/libexec/debugd/helpers
-		doexe "${OUT}"/scheduler_configuration_helper
-
-		insinto /usr/share/policy
-		newins "${debugd_seccomp_dir}/scheduler-configuration-helper-${ARCH}.policy" scheduler-configuration-helper.policy
-	fi
-
-	# Install seccomp policy for the CUPS URI helper.
-	insinto /usr/share/policy
-	newins "${debugd_seccomp_dir}/cups-uri-helper-${ARCH}.policy" \
-		cups-uri-helper.policy
-
-
-	# Install DBus configuration.
-	insinto /etc/dbus-1/system.d
-	doins share/org.chromium.debugd.conf
-
-	insinto /etc/init
-	doins share/{debugd,trace_marker-test}.conf
-
-	insinto /etc/perf_commands
-	doins -r share/perf_commands/*
-
-	local daemon_store="/etc/daemon-store/debugd"
-	dodir "${daemon_store}"
-	fperms 0660 "${daemon_store}"
-	fowners debugd:debugd "${daemon_store}"
-}
-
-platform_pkg_test() {
-	pushd "${S}/src" >/dev/null
-	platform_test "run" "${OUT}/debugd_testrunner"
-	./helpers/capture_utility_test.sh || die
-	popd >/dev/null
-}
diff --git a/chromeos-base/debugd/debugd-0.0.1-r2928.ebuild b/chromeos-base/debugd/debugd-0.0.1-r2928.ebuild
new file mode 100644
index 0000000..9bc695d
--- /dev/null
+++ b/chromeos-base/debugd/debugd-0.0.1-r2928.ebuild
@@ -0,0 +1,123 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a109557dbcaa27e6ad00ab62c433afd03203c290"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "8a627edf629f2dda550722427ca0627c393dd207" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk debugd .gn"
+
+PLATFORM_SUBDIR="debugd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Chrome OS debugging service"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cellular iwlwifi_dump nvme sata tpm"
+
+COMMON_DEPEND="
+	chromeos-base/chromeos-login:=
+	chromeos-base/minijail:=
+	chromeos-base/shill-client:=
+	chromeos-base/vboot_reference:=
+	dev-libs/protobuf:=
+	net-libs/libpcap:=
+	net-wireless/iw:=
+	sys-apps/rootdev:=
+	sata? ( sys-apps/smartmontools:= )
+"
+RDEPEND="${COMMON_DEPEND}
+	iwlwifi_dump? ( chromeos-base/intel-wifi-fw-dump )
+	nvme? ( sys-apps/nvme-cli )
+	chromeos-base/chromeos-ssh-testkeys
+	chromeos-base/chromeos-sshd-init
+	!chromeos-base/workarounds
+	sys-apps/iproute2
+	sys-apps/memtester
+"
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/debugd-client:=
+	chromeos-base/system_api:=
+	sys-apps/dbus:="
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs debugd.
+	enewuser "debugd"
+	enewgroup "debugd"
+
+	cros-workon_pkg_setup
+}
+
+pkg_preinst() {
+	enewuser "debugd-logs"
+	enewgroup "debugd-logs"
+
+	enewgroup "daemon-store"
+	enewgroup "logs-access"
+}
+
+src_install() {
+	dobin "${OUT}"/generate_logs
+
+	into /
+	dosbin "${OUT}"/debugd
+
+	exeinto /usr/libexec/debugd/helpers
+	doexe "${OUT}"/capture_packets
+	doexe "${OUT}"/cups_uri_helper
+	doexe "${OUT}"/dev_features_chrome_remote_debugging
+	doexe "${OUT}"/dev_features_password
+	doexe "${OUT}"/dev_features_rootfs_verification
+	doexe "${OUT}"/dev_features_ssh
+	doexe "${OUT}"/dev_features_usb_boot
+	doexe "${OUT}"/icmp
+	doexe "${OUT}"/netif
+	doexe "${OUT}"/network_status
+
+	doexe src/helpers/{capture_utility,minijail-setuid-hack,systrace}.sh
+
+	local debugd_seccomp_dir="src/helpers/seccomp"
+
+	# Install scheduler configuration helper and seccomp policy.
+	if use amd64 ; then
+		exeinto /usr/libexec/debugd/helpers
+		doexe "${OUT}"/scheduler_configuration_helper
+
+		insinto /usr/share/policy
+		newins "${debugd_seccomp_dir}/scheduler-configuration-helper-${ARCH}.policy" scheduler-configuration-helper.policy
+	fi
+
+	# Install seccomp policy for the CUPS URI helper.
+	insinto /usr/share/policy
+	newins "${debugd_seccomp_dir}/cups-uri-helper-${ARCH}.policy" \
+		cups-uri-helper.policy
+
+
+	# Install DBus configuration.
+	insinto /etc/dbus-1/system.d
+	doins share/org.chromium.debugd.conf
+
+	insinto /etc/init
+	doins share/{debugd,trace_marker-test}.conf
+
+	insinto /etc/perf_commands
+	doins -r share/perf_commands/*
+
+	local daemon_store="/etc/daemon-store/debugd"
+	dodir "${daemon_store}"
+	fperms 0660 "${daemon_store}"
+	fowners debugd:debugd "${daemon_store}"
+}
+
+platform_pkg_test() {
+	pushd "${S}/src" >/dev/null
+	platform_test "run" "${OUT}/debugd_testrunner"
+	./helpers/capture_utility_test.sh || die
+	popd >/dev/null
+}
diff --git a/chromeos-base/dev-install/dev-install-0.0.1-r1154.ebuild b/chromeos-base/dev-install/dev-install-0.0.1-r1154.ebuild
deleted file mode 100644
index 0ffde76..0000000
--- a/chromeos-base/dev-install/dev-install-0.0.1-r1154.ebuild
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "bf82c5c4784fa1fb6445912f6704d23c150987c6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk dev-install .gn"
-
-PLATFORM_SUBDIR="dev-install"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chromium OS Developer Packages installer"
-HOMEPAGE="http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/install-software-on-base-images"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="chromeos-base/vboot_reference:="
-RDEPEND="${DEPEND}
-	app-arch/bzip2
-	app-arch/tar
-	net-misc/curl"
-
-fixup_make_defaults() {
-	local file=$1
-
-	sed -i \
-		-e "s/@IUSE_IMPLICIT@/${IUSE_IMPLICIT}/g" \
-		-e "s/@ARCH@/${ARCH}/g" \
-		-e "s/@ELIBC@/${ELIBC}/g" \
-		-e "s/@USERLAND@/${USERLAND}/g" \
-		-e "s/@KERNEL@/${KERNEL}/g" \
-		-e "s/@USE_EXPAND_IMPLICIT@/${USE_EXPAND_IMPLICIT}/g" \
-		${file} || die
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/dev_install_test"
-}
-
-src_install() {
-	dobin "${OUT}/dev_install"
-
-	cd "${S}/share" || die
-	insinto /usr/share/${PN}/portage/make.profile
-	doins make.defaults
-
-	fixup_make_defaults "${ED}"/usr/share/${PN}/portage/make.profile/make.defaults
-
-	insinto /etc/bash/bashrc.d/
-	newins bashrc ${PN}.sh
-
-	insinto /etc/env.d
-	doins 99devinstall
-	sed -i "s:@LIBDIR@:$(get_libdir):g" "${ED}"/etc/env.d/99devinstall
-}
-
-pkg_preinst() {
-	if [[ $(cros_target) == "target_image" ]]; then
-		# We don't want to install these files into the normal /build/
-		# dir because we need different settings at build time vs what
-		# we want at runtime in release images.  Thus, install the files
-		# into /usr/share but symlink them into /etc for the images.
-		dosym "/usr/share/${PN}/portage" /etc/portage
-
-		# The parent file content needs to be kept in sync with the
-		# dev_install code.
-		dodir /usr/local/etc/portage/make.profile
-		echo /etc/portage/make.profile \
-			>"${D}"/usr/local/etc/portage/make.profile/parent || die
-	fi
-}
diff --git a/chromeos-base/dev-install/dev-install-0.0.1-r1177.ebuild b/chromeos-base/dev-install/dev-install-0.0.1-r1177.ebuild
new file mode 100644
index 0000000..0caff1b
--- /dev/null
+++ b/chromeos-base/dev-install/dev-install-0.0.1-r1177.ebuild
@@ -0,0 +1,80 @@
+# Copyright 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fcdf07aa1b1652c2a2bb2a07f80ebd9e789589f5" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk dev-install .gn"
+
+PLATFORM_SUBDIR="dev-install"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chromium OS Developer Packages installer"
+HOMEPAGE="http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/install-software-on-base-images"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="chromeos-base/vboot_reference:="
+RDEPEND="${DEPEND}
+	app-arch/bzip2
+	app-arch/tar
+	net-misc/curl"
+
+fixup_make_defaults() {
+	local file=$1
+
+	sed -i \
+		-e "s/@IUSE_IMPLICIT@/${IUSE_IMPLICIT}/g" \
+		-e "s/@ARCH@/${ARCH}/g" \
+		-e "s/@ELIBC@/${ELIBC}/g" \
+		-e "s/@USERLAND@/${USERLAND}/g" \
+		-e "s/@KERNEL@/${KERNEL}/g" \
+		-e "s/@USE_EXPAND_IMPLICIT@/${USE_EXPAND_IMPLICIT}/g" \
+		${file} || die
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/dev_install_test"
+}
+
+src_install() {
+	dobin "${OUT}/dev_install"
+
+	cd "${S}/share" || die
+	insinto /usr/share/${PN}/portage/make.profile
+	doins make.defaults
+
+	fixup_make_defaults "${ED}"/usr/share/${PN}/portage/make.profile/make.defaults
+
+	insinto /etc/bash/bashrc.d/
+	newins bashrc ${PN}.sh
+
+	insinto /etc/env.d
+	doins 99devinstall
+	sed -i "s:@LIBDIR@:$(get_libdir):g" "${ED}"/etc/env.d/99devinstall
+}
+
+pkg_preinst() {
+	if [[ $(cros_target) == "target_image" ]]; then
+		# We don't want to install these files into the normal /build/
+		# dir because we need different settings at build time vs what
+		# we want at runtime in release images.  Thus, install the files
+		# into /usr/share but symlink them into /etc for the images.
+		dosym "/usr/share/${PN}/portage" /etc/portage
+
+		# The parent file content needs to be kept in sync with the
+		# dev_install code.
+		dodir /usr/local/etc/portage/make.profile
+		echo /etc/portage/make.profile \
+			>"${D}"/usr/local/etc/portage/make.profile/parent || die
+	fi
+}
diff --git a/chromeos-base/devserver/devserver-0.0.3-r708.ebuild b/chromeos-base/devserver/devserver-0.0.3-r708.ebuild
deleted file mode 100644
index 757fe4f..0000000
--- a/chromeos-base/devserver/devserver-0.0.3-r708.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="b898c1bfbc3f0a0fa38dd5911b283c408657dd36"
-CROS_WORKON_TREE="c8ec94a7f4394d8fb1f1fcfa32c1067aabdc3be3"
-CROS_WORKON_PROJECT="chromiumos/platform/dev-util"
-CROS_WORKON_LOCALNAME="platform/dev"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-
-inherit cros-workon
-
-DESCRIPTION="Server to cache Chromium OS build artifacts from Google Storage."
-HOMEPAGE="http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/using-the-dev-server"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	dev-lang/python
-	dev-python/protobuf-python
-	dev-python/cherrypy
-	net-misc/gsutil
-	dev-python/rtslib-fb
-"
-DEPEND="
-	dev-python/psutil
-"
-
-src_install() {
-	emake install DESTDIR="${D}"
-
-	dobin host/start_devserver
-
-	# Install Mob* Monitor checkfiles for the devserver.
-	insinto "/etc/mobmonitor/checkfiles/devserver/"
-	doins -r "${S}/checkfiles/devserver/"*
-}
-
-src_test() {
-	# Run the unit tests.
-	./run_unittests || die
-}
diff --git a/chromeos-base/devserver/devserver-0.0.3-r799.ebuild b/chromeos-base/devserver/devserver-0.0.3-r799.ebuild
new file mode 100644
index 0000000..97b5d04
--- /dev/null
+++ b/chromeos-base/devserver/devserver-0.0.3-r799.ebuild
@@ -0,0 +1,43 @@
+# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="feacb4c76e7b9346cd29092a1ebcdf13665b85a6"
+CROS_WORKON_TREE="21f5a11c83593a8519785ee99eb1ecece3309c73"
+CROS_WORKON_PROJECT="chromiumos/platform/dev-util"
+CROS_WORKON_LOCALNAME="platform/dev"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+
+inherit cros-workon
+
+DESCRIPTION="Server to cache Chromium OS build artifacts from Google Storage."
+HOMEPAGE="http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/using-the-dev-server"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	dev-lang/python
+	dev-python/protobuf-python
+	dev-python/cherrypy
+	net-misc/gsutil
+	dev-python/rtslib-fb
+"
+DEPEND="
+	dev-python/psutil
+"
+
+src_install() {
+	emake install DESTDIR="${D}"
+
+	dobin host/start_devserver
+
+	# Install Mob* Monitor checkfiles for the devserver.
+	insinto "/etc/mobmonitor/checkfiles/devserver/"
+	doins -r "${S}/checkfiles/devserver/"*
+}
+
+src_test() {
+	# Run the unit tests.
+	./run_unittests || die
+}
diff --git a/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r399.ebuild b/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r399.ebuild
deleted file mode 100644
index 21a21d2..0000000
--- a/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r399.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="17849843254584b4fcdd31a7b3530ab37eb4d54c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "be9c464a369cb4d1756f807753ca5b12b3ad16a6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="common-mk diagnostics .gn"
-
-PLATFORM_SUBDIR="diagnostics/dpsl"
-
-inherit cros-workon platform
-
-DESCRIPTION="Diagnostics DPSL test designed to be run inside VM"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/dpsl/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	chromeos-base/libbrillo:=
-"
-RDEPEND="
-	net-libs/grpc:=
-	dev-libs/protobuf:=
-"
-
-src_install() {
-	dobin "${OUT}/diagnostics_dpsl_test_listener"
-	dobin "${OUT}/diagnostics_dpsl_test_requester"
-}
-
-platform_pkg_test() {
-	local tests=(
-		libdpsl_test
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r491.ebuild b/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r491.ebuild
new file mode 100644
index 0000000..93e2b7d
--- /dev/null
+++ b/chromeos-base/diagnostics-dpsl-test/diagnostics-dpsl-test-0.0.1-r491.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="3c2dd28f478bdc8fe3a9761ddae3d92e8374716b"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2e9672eb4b4502a670a37cc31ede76da6afd8b44" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk diagnostics .gn"
+
+PLATFORM_SUBDIR="diagnostics/dpsl"
+
+inherit cros-workon platform
+
+DESCRIPTION="Diagnostics DPSL test designed to be run inside VM"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/dpsl/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	chromeos-base/libbrillo:=
+"
+RDEPEND="
+	net-libs/grpc:=
+	dev-libs/protobuf:=
+"
+
+src_install() {
+	dobin "${OUT}/diagnostics_dpsl_test_listener"
+	dobin "${OUT}/diagnostics_dpsl_test_requester"
+}
+
+platform_pkg_test() {
+	local tests=(
+		libdpsl_test
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/diagnostics/diagnostics-0.0.1-r672.ebuild b/chromeos-base/diagnostics/diagnostics-0.0.1-r672.ebuild
deleted file mode 100644
index 20796a9..0000000
--- a/chromeos-base/diagnostics/diagnostics-0.0.1-r672.ebuild
+++ /dev/null
@@ -1,151 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "be9c464a369cb4d1756f807753ca5b12b3ad16a6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_PROJECT="chromiumos/platform2"
-# TODO(crbug.com/1044813): Remove chromeos-config once its public headers are fixed.
-CROS_WORKON_SUBTREE="common-mk chromeos-config diagnostics .gn"
-
-PLATFORM_SUBDIR="diagnostics"
-
-inherit cros-workon platform udev user
-
-DESCRIPTION="Device telemetry and diagnostics for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer wilco generated_cros_config unibuild"
-
-COMMON_DEPEND="
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config:= )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	chromeos-base/chromeos-config-tools:=
-	dev-libs/protobuf:=
-	dev-libs/re2:=
-	net-libs/grpc:=
-	virtual/libudev:=
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/debugd-client:=
-	chromeos-base/system_api:=[fuzzer?]
-"
-RDEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/minijail
-	dev-util/stressapptest
-	sys-block/fio
-	wilco? (
-		chromeos-base/chromeos-dtc-vm
-		chromeos-base/vpd
-	)
-"
-
-pkg_preinst() {
-	enewgroup cros_ec-access
-	enewuser cros_healthd
-	enewgroup cros_healthd
-	enewuser healthd_ec
-	enewgroup healthd_ec
-
-	if use wilco; then
-		enewuser wilco_dtc
-		enewgroup wilco_dtc
-	fi
-}
-
-src_install() {
-	dobin "${OUT}/cros_healthd"
-	dobin "${OUT}/cros-health-tool"
-
-	if use wilco; then
-		dobin "${OUT}/wilco_dtc_supportd"
-
-		# Install seccomp policy files.
-		insinto /usr/share/policy
-		newins "init/wilco_dtc_supportd-seccomp-${ARCH}.policy" \
-			wilco_dtc_supportd-seccomp.policy
-		newins "init/wilco-dtc-e2fsck-seccomp-${ARCH}.policy" \
-			wilco-dtc-e2fsck-seccomp.policy
-		newins "init/wilco-dtc-resize2fs-seccomp-${ARCH}.policy" \
-			wilco-dtc-resize2fs-seccomp.policy
-
-		# Install D-Bus configuration file.
-		insinto /etc/dbus-1/system.d
-		doins dbus/org.chromium.WilcoDtcSupportd.conf
-		doins dbus/WilcoDtcUpstart.conf
-
-		# Install the init scripts.
-		insinto /etc/init
-		doins init/wilco_dtc_dispatcher.conf
-		doins init/wilco_dtc_supportd.conf
-		doins init/wilco_dtc.conf
-
-		# Install udev rules.
-		udev_dorules udev/99-ec_driver_files.rules
-	fi
-
-	# Install seccomp policy files.
-	insinto /usr/share/policy
-	newins "init/cros_healthd-seccomp-${ARCH}.policy" \
-		cros_healthd-seccomp.policy
-	newins "ectool/ectool_i2cread-seccomp-${ARCH}.policy" \
-		ectool_i2cread-seccomp.policy
-	newins "ectool/ectool_pwmgetfanrpm-seccomp-${ARCH}.policy" \
-		ectool_pwmgetfanrpm-seccomp.policy
-
-	# Install D-Bus configuration file.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.CrosHealthd.conf
-
-	# Install the init scripts.
-	insinto /etc/init
-	doins init/cros_healthd.conf
-
-	# Install the diagnostic routine executables.
-	exeinto /usr/libexec/diagnostics
-	doexe "${OUT}/floating-point-accuracy"
-	doexe "${OUT}/prime-search"
-	doexe "${OUT}/smartctl-check"
-	doexe "${OUT}/urandom"
-
-	# Install udev rules.
-	udev_dorules udev/99-chown_dmi_dir.rules
-
-	# Install fuzzers.
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_block_device_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_cached_vpd_fuzzer
-}
-
-platform_pkg_test() {
-	local tests=(
-		cros_healthd_mojo_adapter_test
-		cros_healthd_test
-		libcommon_test
-		libcros_healthd_events_test
-		libcros_healthd_fetchers_test
-		libcros_healthd_utils_test
-		routine_test
-		system_config_test
-	)
-	if use wilco; then
-		tests+=(
-			wilco_dtc_supportd_test
-		)
-	fi
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/diagnostics/diagnostics-0.0.1-r795.ebuild b/chromeos-base/diagnostics/diagnostics-0.0.1-r795.ebuild
new file mode 100644
index 0000000..ff881d6
--- /dev/null
+++ b/chromeos-base/diagnostics/diagnostics-0.0.1-r795.ebuild
@@ -0,0 +1,158 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "2e9672eb4b4502a670a37cc31ede76da6afd8b44" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform2"
+# TODO(crbug.com/1044813): Remove chromeos-config once its public headers are fixed.
+CROS_WORKON_SUBTREE="common-mk chromeos-config diagnostics .gn"
+
+PLATFORM_SUBDIR="diagnostics"
+
+inherit cros-workon platform udev user
+
+DESCRIPTION="Device telemetry and diagnostics for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer wilco generated_cros_config unibuild"
+
+COMMON_DEPEND="
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config:= )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	chromeos-base/chromeos-config-tools:=
+	dev-libs/protobuf:=
+	dev-libs/re2:=
+	net-libs/grpc:=
+	virtual/libudev:=
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/debugd-client:=
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+# TODO(crbug/1085169): Replace sys-block/fio dependency with an alternative as
+# it is very large. It is currently only a dependency of wilco as it is
+# currently the only client.
+RDEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/minijail
+	dev-util/stressapptest
+	wilco? (
+		sys-block/fio
+		chromeos-base/chromeos-dtc-vm
+		chromeos-base/vpd
+	)
+"
+
+pkg_preinst() {
+	enewgroup cros_ec-access
+	enewuser cros_healthd
+	enewgroup cros_healthd
+	enewuser healthd_ec
+	enewgroup healthd_ec
+
+	if use wilco; then
+		enewuser wilco_dtc
+		enewgroup wilco_dtc
+	fi
+}
+
+src_install() {
+	dobin "${OUT}/cros_healthd"
+	dobin "${OUT}/cros-health-tool"
+
+	if use wilco; then
+		dobin "${OUT}/wilco_dtc_supportd"
+
+		# Install seccomp policy files.
+		insinto /usr/share/policy
+		newins "init/wilco_dtc_supportd-seccomp-${ARCH}.policy" \
+			wilco_dtc_supportd-seccomp.policy
+		newins "init/wilco-dtc-e2fsck-seccomp-${ARCH}.policy" \
+			wilco-dtc-e2fsck-seccomp.policy
+		newins "init/wilco-dtc-resize2fs-seccomp-${ARCH}.policy" \
+			wilco-dtc-resize2fs-seccomp.policy
+
+		# Install D-Bus configuration file.
+		insinto /etc/dbus-1/system.d
+		doins dbus/org.chromium.WilcoDtcSupportd.conf
+		doins dbus/WilcoDtcUpstart.conf
+
+		# Install the init scripts.
+		insinto /etc/init
+		doins init/wilco_dtc_dispatcher.conf
+		doins init/wilco_dtc_supportd.conf
+		doins init/wilco_dtc.conf
+
+		# Install udev rules.
+		udev_dorules udev/99-ec_driver_files.rules
+	fi
+
+	# Install seccomp policy files.
+	insinto /usr/share/policy
+	newins "init/cros_healthd-seccomp-${ARCH}.policy" \
+		cros_healthd-seccomp.policy
+	newins "cros_healthd/seccomp/ectool_i2cread-seccomp-${ARCH}.policy" \
+		ectool_i2cread-seccomp.policy
+	newins "cros_healthd/seccomp/ectool_pwmgetfanrpm-seccomp-${ARCH}.policy" \
+		ectool_pwmgetfanrpm-seccomp.policy
+	newins "seccomp/memtester-seccomp-${ARCH}.policy" memtester-seccomp.policy
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.CrosHealthd.conf
+
+	# Install the init scripts.
+	insinto /etc/init
+	doins init/cros_healthd.conf
+
+	# Install the diagnostic routine executables.
+	exeinto /usr/libexec/diagnostics
+	doexe "${OUT}/floating-point-accuracy"
+	doexe "${OUT}/prime-search"
+	doexe "${OUT}/smartctl-check"
+	doexe "${OUT}/urandom"
+
+	# Install udev rules.
+	udev_dorules udev/99-chown_dmi_dir.rules
+
+	# Install fuzzers.
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_block_device_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_system_info_fuzzer
+}
+
+platform_pkg_test() {
+	local tests=(
+		cros_healthd_mojo_adapter_test
+		cros_healthd_test
+		libcommon_test
+		libcros_healthd_events_test
+		libcros_healthd_fetchers_test
+		libcros_healthd_utils_test
+		network_test
+		network_diagnostics_test
+		routine_test
+		system_config_test
+	)
+	if use wilco; then
+		tests+=(
+			wilco_dtc_supportd_test
+		)
+	fi
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/diagnostics/diagnostics-9999.ebuild b/chromeos-base/diagnostics/diagnostics-9999.ebuild
index 001d4d8..e9c9af35 100644
--- a/chromeos-base/diagnostics/diagnostics-9999.ebuild
+++ b/chromeos-base/diagnostics/diagnostics-9999.ebuild
@@ -38,12 +38,16 @@
 	chromeos-base/debugd-client:=
 	chromeos-base/system_api:=[fuzzer?]
 "
+
+# TODO(crbug/1085169): Replace sys-block/fio dependency with an alternative as
+# it is very large. It is currently only a dependency of wilco as it is
+# currently the only client.
 RDEPEND="
 	${COMMON_DEPEND}
 	chromeos-base/minijail
 	dev-util/stressapptest
-	sys-block/fio
 	wilco? (
+		sys-block/fio
 		chromeos-base/chromeos-dtc-vm
 		chromeos-base/vpd
 	)
@@ -97,10 +101,11 @@
 	insinto /usr/share/policy
 	newins "init/cros_healthd-seccomp-${ARCH}.policy" \
 		cros_healthd-seccomp.policy
-	newins "ectool/ectool_i2cread-seccomp-${ARCH}.policy" \
+	newins "cros_healthd/seccomp/ectool_i2cread-seccomp-${ARCH}.policy" \
 		ectool_i2cread-seccomp.policy
-	newins "ectool/ectool_pwmgetfanrpm-seccomp-${ARCH}.policy" \
+	newins "cros_healthd/seccomp/ectool_pwmgetfanrpm-seccomp-${ARCH}.policy" \
 		ectool_pwmgetfanrpm-seccomp.policy
+	newins "seccomp/memtester-seccomp-${ARCH}.policy" memtester-seccomp.policy
 
 	# Install D-Bus configuration file.
 	insinto /etc/dbus-1/system.d
@@ -122,7 +127,7 @@
 
 	# Install fuzzers.
 	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_block_device_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_cached_vpd_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/fetch_system_info_fuzzer
 }
 
 platform_pkg_test() {
@@ -133,6 +138,8 @@
 		libcros_healthd_events_test
 		libcros_healthd_fetchers_test
 		libcros_healthd_utils_test
+		network_test
+		network_diagnostics_test
 		routine_test
 		system_config_test
 	)
diff --git a/chromeos-base/disk_updater/disk_updater-0.0.1-r3013.ebuild b/chromeos-base/disk_updater/disk_updater-0.0.1-r3013.ebuild
deleted file mode 100644
index 1dc3457..0000000
--- a/chromeos-base/disk_updater/disk_updater-0.0.1-r3013.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a84edaa470edc69e27335f718e4784a8fcc883f9" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk disk_updater .gn"
-
-PLATFORM_SUBDIR="disk_updater"
-
-inherit cros-workon platform
-
-DESCRIPTION="Root disk firmware updater"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/disk_updater/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+sata mmc nvme"
-
-DEPEND=""
-
-RDEPEND="${DEPEND}
-	chromeos-base/chromeos-common-script
-	sata? ( sys-apps/hdparm )
-	mmc? ( sys-apps/mmc-utils )
-	nvme? ( sys-apps/nvme-cli )"
-
-platform_pkg_test() {
-	# We can test all, even if mmc or nvme are not installed.
-	local tests=( 'ata' 'mmc' 'nvme')
-
-	local test_type
-	for test_type in "${tests[@]}"; do
-		platform_test "run" "tests/chromeos-disk-firmware-${test_type}-test.sh"
-	done
-}
-
-src_install() {
-	insinto "/etc/init"
-	doins "scripts/chromeos-disk-firmware-update.conf"
-
-	dosbin "scripts/chromeos-disk-firmware-update.sh"
-}
diff --git a/chromeos-base/disk_updater/disk_updater-0.0.1-r3033.ebuild b/chromeos-base/disk_updater/disk_updater-0.0.1-r3033.ebuild
new file mode 100644
index 0000000..0ae7522
--- /dev/null
+++ b/chromeos-base/disk_updater/disk_updater-0.0.1-r3033.ebuild
@@ -0,0 +1,47 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "a84edaa470edc69e27335f718e4784a8fcc883f9" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk disk_updater .gn"
+
+PLATFORM_SUBDIR="disk_updater"
+
+inherit cros-workon platform
+
+DESCRIPTION="Root disk firmware updater"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/disk_updater/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+sata mmc nvme"
+
+DEPEND=""
+
+RDEPEND="${DEPEND}
+	chromeos-base/chromeos-common-script
+	sata? ( sys-apps/hdparm )
+	mmc? ( sys-apps/mmc-utils )
+	nvme? ( sys-apps/nvme-cli )"
+
+platform_pkg_test() {
+	# We can test all, even if mmc or nvme are not installed.
+	local tests=( 'ata' 'mmc' 'nvme')
+
+	local test_type
+	for test_type in "${tests[@]}"; do
+		platform_test "run" "tests/chromeos-disk-firmware-${test_type}-test.sh"
+	done
+}
+
+src_install() {
+	insinto "/etc/init"
+	doins "scripts/chromeos-disk-firmware-update.conf"
+
+	dosbin "scripts/chromeos-disk-firmware-update.sh"
+}
diff --git a/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r332.ebuild b/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r332.ebuild
deleted file mode 100644
index 78d7d16..0000000
--- a/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r332.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="79b34a48b1f0e24ce225221fe5ba2622e3b2bbd6"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6bb740c6e33228d12a0e39ba631088ef255e17dd" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk dlcservice .gn"
-
-PLATFORM_SUBDIR="dlcservice/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="DlcService D-Bus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/client"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library.
-DEPEND="
-	chromeos-base/chromeos-dbus-bindings
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "dlcservice"
-}
diff --git a/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r369.ebuild b/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r369.ebuild
new file mode 100644
index 0000000..2c84fee
--- /dev/null
+++ b/chromeos-base/dlcservice-client/dlcservice-client-0.0.1-r369.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "21194b64d3af73c31e49f08d67a5eb920eb0c8d1" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk dlcservice .gn"
+
+PLATFORM_SUBDIR="dlcservice/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="DlcService D-Bus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/client"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library.
+DEPEND="
+	chromeos-base/chromeos-dbus-bindings
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "dlcservice"
+}
diff --git a/chromeos-base/dlcservice/dlcservice-0.0.1-r397.ebuild b/chromeos-base/dlcservice/dlcservice-0.0.1-r397.ebuild
deleted file mode 100644
index a9e7f1c..0000000
--- a/chromeos-base/dlcservice/dlcservice-0.0.1-r397.ebuild
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="79b34a48b1f0e24ce225221fe5ba2622e3b2bbd6"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6bb740c6e33228d12a0e39ba631088ef255e17dd" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid #include-ing platform2 headers directly.
-CROS_WORKON_SUBTREE="common-mk dlcservice metrics .gn"
-
-PLATFORM_SUBDIR="dlcservice"
-
-inherit cros-workon platform user
-
-DESCRIPTION="A D-Bus service for Downloadable Content (DLC)"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-RDEPEND="
-	chromeos-base/imageloader:=
-	chromeos-base/metrics:=
-	dev-libs/protobuf:="
-
-DEPEND="${RDEPEND}
-	chromeos-base/dlcservice-client:=
-	chromeos-base/imageloader-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/session_manager-client:=
-	chromeos-base/update_engine-client:="
-
-src_install() {
-	dosbin "${OUT}/dlcservice"
-	# Technically we don't need the dlcservice_util in rootfs, but the QA team
-	# will need this to test with dummy-dlc.
-	dobin "${OUT}/dlcservice_util"
-
-	# Seccomp policy files.
-	insinto /usr/share/policy
-	newins seccomp/dlcservice-seccomp-${ARCH}.policy \
-		dlcservice-seccomp.policy
-
-	# Upstart configuration
-	insinto /etc/init
-	doins dlcservice.conf
-
-	# D-Bus configuration
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.DlcService.conf
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/dlcservice_boot_device_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/dlcservice_boot_slot_fuzzer
-
-	into /usr/local
-	dobin "${S}/tools/dlctool"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/dlcservice_tests"
-	platform_fuzzer_test "${OUT}"/dlcservice_boot_device_fuzzer
-	platform_fuzzer_test "${OUT}"/dlcservice_boot_slot_fuzzer
-}
-
-pkg_preinst() {
-	enewuser "dlcservice"
-	enewgroup "dlcservice"
-}
diff --git a/chromeos-base/dlcservice/dlcservice-0.0.1-r445.ebuild b/chromeos-base/dlcservice/dlcservice-0.0.1-r445.ebuild
new file mode 100644
index 0000000..5e221aa
--- /dev/null
+++ b/chromeos-base/dlcservice/dlcservice-0.0.1-r445.ebuild
@@ -0,0 +1,73 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "21194b64d3af73c31e49f08d67a5eb920eb0c8d1" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid #include-ing platform2 headers directly.
+CROS_WORKON_SUBTREE="common-mk dlcservice metrics .gn"
+
+PLATFORM_SUBDIR="dlcservice"
+
+inherit cros-workon platform user
+
+DESCRIPTION="A D-Bus service for Downloadable Content (DLC)"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+RDEPEND="
+	chromeos-base/imageloader:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/protobuf:="
+
+DEPEND="${RDEPEND}
+	chromeos-base/dlcservice-client:=
+	chromeos-base/imageloader-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/session_manager-client:=
+	chromeos-base/update_engine-client:="
+
+src_install() {
+	dosbin "${OUT}/dlcservice"
+	# Technically we don't need the dlcservice_util in rootfs, but the QA team
+	# will need this to test with dummy-dlc.
+	dobin "${OUT}/dlcservice_util"
+
+	# Seccomp policy files.
+	insinto /usr/share/policy
+	newins seccomp/dlcservice-seccomp-${ARCH}.policy \
+		dlcservice-seccomp.policy
+
+	# Upstart configuration
+	insinto /etc/init
+	doins dlcservice.conf
+
+	# D-Bus configuration
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.DlcService.conf
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/dlcservice_boot_device_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/dlcservice_boot_slot_fuzzer
+
+	into /usr/local
+	dobin "${S}/tools/dlctool"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/dlcservice_tests"
+	platform_fuzzer_test "${OUT}"/dlcservice_boot_device_fuzzer
+	platform_fuzzer_test "${OUT}"/dlcservice_boot_slot_fuzzer
+}
+
+pkg_preinst() {
+	enewuser "dlcservice"
+	enewgroup "dlcservice"
+}
diff --git a/chromeos-base/dlcservice/dlcservice-9999.ebuild b/chromeos-base/dlcservice/dlcservice-9999.ebuild
index e0430f6..69a02e6 100644
--- a/chromeos-base/dlcservice/dlcservice-9999.ebuild
+++ b/chromeos-base/dlcservice/dlcservice-9999.ebuild
@@ -23,7 +23,7 @@
 
 RDEPEND="
 	chromeos-base/imageloader:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/protobuf:="
 
 DEPEND="${RDEPEND}
diff --git a/chromeos-base/drm-tests/drm-tests-0.0.1-r171.ebuild b/chromeos-base/drm-tests/drm-tests-0.0.1-r171.ebuild
deleted file mode 100644
index 3aa845f..0000000
--- a/chromeos-base/drm-tests/drm-tests-0.0.1-r171.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="50cdc562c2653c9715825f9a164b7ff2bcf4faa2"
-CROS_WORKON_TREE="8338b99f85635cba6219924371ddd545fb4352bc"
-CROS_WORKON_PROJECT="chromiumos/platform/drm-tests"
-
-inherit cros-sanitizers cros-workon toolchain-funcs
-
-DESCRIPTION="Chrome OS DRM Tests"
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/drm-tests/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="vulkan"
-
-RDEPEND="virtual/opengles
-	|| ( media-libs/mesa[gbm] media-libs/minigbm )
-	media-libs/libsync
-	vulkan? (
-		media-libs/vulkan-loader
-		virtual/vulkan-icd
-	)"
-DEPEND="${RDEPEND}
-	x11-drivers/opengles-headers"
-
-src_configure() {
-	sanitizers-setup-env
-	default
-}
-
-src_compile() {
-	tc-export CC
-	emake USE_VULKAN="$(usex vulkan 1 0)"
-}
-
-src_install() {
-	cd build-opt-local || return
-	dobin atomictest drm_cursor_test gamma_test linear_bo_test \
-	mapped_texture_test mmap_test null_platform_test plane_test \
-	synctest swrast_test vgem_test udmabuf_create_test
-
-	if use vulkan; then
-		dobin vk_glow
-	fi
-}
diff --git a/chromeos-base/drm-tests/drm-tests-0.0.1-r174.ebuild b/chromeos-base/drm-tests/drm-tests-0.0.1-r174.ebuild
new file mode 100644
index 0000000..af6a8172
--- /dev/null
+++ b/chromeos-base/drm-tests/drm-tests-0.0.1-r174.ebuild
@@ -0,0 +1,50 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="ee5a557e89da3d4d3f119e50023d43e09b45122e"
+CROS_WORKON_TREE="ea862bf5db70dfe87a0f31ea07cd8bfb4e375326"
+CROS_WORKON_PROJECT="chromiumos/platform/drm-tests"
+
+inherit cros-sanitizers cros-workon toolchain-funcs
+
+DESCRIPTION="Chrome OS DRM Tests"
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/drm-tests/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="vulkan"
+
+RDEPEND="virtual/opengles
+	|| ( media-libs/mesa[gbm] media-libs/minigbm )
+	media-libs/libsync
+	vulkan? (
+		media-libs/vulkan-loader
+		virtual/vulkan-icd
+	)"
+DEPEND="${RDEPEND}
+	x11-drivers/opengles-headers"
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
+
+src_compile() {
+	tc-export CC
+	emake USE_VULKAN="$(usex vulkan 1 0)"
+}
+
+src_install() {
+	cd build-opt-local || return
+	dobin atomictest drm_cursor_test dmabuf_test gamma_test linear_bo_test \
+	mapped_texture_test mmap_test null_platform_test plane_test \
+	synctest swrast_test udmabuf_create_test
+
+	if use vulkan; then
+		dobin vk_glow
+	fi
+}
diff --git a/chromeos-base/drm-tests/drm-tests-9999.ebuild b/chromeos-base/drm-tests/drm-tests-9999.ebuild
index 3dcc5b4..8004ee2 100644
--- a/chromeos-base/drm-tests/drm-tests-9999.ebuild
+++ b/chromeos-base/drm-tests/drm-tests-9999.ebuild
@@ -38,9 +38,9 @@
 
 src_install() {
 	cd build-opt-local || return
-	dobin atomictest drm_cursor_test gamma_test linear_bo_test \
+	dobin atomictest drm_cursor_test dmabuf_test gamma_test linear_bo_test \
 	mapped_texture_test mmap_test null_platform_test plane_test \
-	synctest swrast_test vgem_test udmabuf_create_test
+	synctest swrast_test udmabuf_create_test
 
 	if use vulkan; then
 		dobin vk_glow
diff --git a/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2909.ebuild b/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2909.ebuild
deleted file mode 100644
index c1e7335..0000000
--- a/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2909.ebuild
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "ae1501a02c3893627432d1114e83009270cc821d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_USE_VCSID=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk easy-unlock .gn"
-
-PLATFORM_SUBDIR="easy-unlock"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Service for supporting Easy Unlock in Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/easy-unlock/"
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	chromeos-base/easy-unlock-crypto:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api:=
-"
-
-pkg_preinst() {
-	enewuser easy-unlock
-	enewgroup easy-unlock
-}
-
-src_install() {
-	exeinto /opt/google/easy_unlock
-	doexe "${OUT}/easy_unlock"
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.EasyUnlock.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins org.chromium.EasyUnlock.service
-
-	insinto /etc/init
-	doins init/easy-unlock.conf
-
-	insinto /usr/share/dbus-1/interfaces
-	doins dbus_bindings/org.chromium.EasyUnlockInterface.xml
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/easy_unlock_test_runner"
-}
diff --git a/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2931.ebuild b/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2931.ebuild
new file mode 100644
index 0000000..81730c6
--- /dev/null
+++ b/chromeos-base/easy-unlock/easy-unlock-0.0.1-r2931.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "3bc2155e1d48bbae4a00bdca72079a844346fb59" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_USE_VCSID=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk easy-unlock .gn"
+
+PLATFORM_SUBDIR="easy-unlock"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Service for supporting Easy Unlock in Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/easy-unlock/"
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	chromeos-base/easy-unlock-crypto:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser easy-unlock
+	enewgroup easy-unlock
+}
+
+src_install() {
+	exeinto /opt/google/easy_unlock
+	doexe "${OUT}/easy_unlock"
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.EasyUnlock.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins org.chromium.EasyUnlock.service
+
+	insinto /etc/init
+	doins init/easy-unlock.conf
+
+	insinto /usr/share/dbus-1/interfaces
+	doins dbus_bindings/org.chromium.EasyUnlockInterface.xml
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/easy_unlock_test_runner"
+}
diff --git a/chromeos-base/ec-devutils/ec-devutils-0.0.2-r5704.ebuild b/chromeos-base/ec-devutils/ec-devutils-0.0.2-r5704.ebuild
deleted file mode 100644
index c84b0c6..0000000
--- a/chromeos-base/ec-devutils/ec-devutils-0.0.2-r5704.ebuild
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-CROS_WORKON_COMMIT="478f28b630d531705c62fb681bfa273360cd623c"
-CROS_WORKON_TREE="deab483754cdb9e9af2f15f2631eca657f0e7d65"
-CROS_WORKON_PROJECT="chromiumos/platform/ec"
-CROS_WORKON_LOCALNAME="platform/ec"
-PYTHON_COMPAT=( python2_7 )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Host development utilities for Chromium OS EC"
-HOMEPAGE="https://www.chromium.org/chromium-os/ec-development"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="hammerd"
-
-DEPEND="virtual/libusb:1=
-	sys-apps/flashmap:=
-	"
-RDEPEND="
-	${DEPEND}
-	app-mobilephone/dfu-util
-	sys-firmware/servo-firmware
-	sys-apps/flashrom
-	!<chromeos-base/ec-utils-0.0.1-r6153
-	chromeos-base/ec-utils
-	>=dev-python/pyusb-1.0.2
-	"
-BDEPEND="
-	dev-python/setuptools[${PYTHON_USEDEP}]
-	virtual/pkgconfig
-	"
-
-set_board() {
-	# No need to be board specific, no tools below build code that is
-	# EC specific. bds works for forst side compilation.
-	export BOARD="bds"
-}
-
-src_configure() {
-	distutils-r1_src_configure
-}
-
-src_compile() {
-	tc-export AR CC PKG_CONFIG RANLIB
-	# In platform/ec Makefile, it uses "CC" to specify target chipset and
-	# "HOSTCC" to compile the utility program because it assumes developers
-	# want to run the utility from same host (build machine).
-	# In this ebuild file, we only build utility
-	# and we may want to build it so it can
-	# be executed on target devices (i.e., arm/x86/amd64), not the build
-	# host (BUILDCC, amd64). So we need to override HOSTCC by target "CC".
-	export HOSTCC="${CC}"
-	set_board
-	emake utils-host
-	# Add usb_updater2 for servo or hammer updates.
-	emake -C extra/usb_updater usb_updater2
-	if use hammerd; then
-		# Add touchpad_updater for TP update on hammer.
-		emake -C extra/touchpad_updater touchpad_updater
-	fi
-	distutils-r1_src_compile
-}
-
-src_install() {
-	set_board
-	dobin "build/${BOARD}/util/stm32mon"
-	dobin "build/${BOARD}/util/ec_parse_panicinfo"
-	dobin "build/${BOARD}/util/uartupdatetool"
-	dobin "build/${BOARD}/util/iteflash"
-
-	# Add usb_updater2 for servo or hammer updates.
-	dosbin "extra/usb_updater/usb_updater2"
-	if use hammerd; then
-		# Add touchpad_updater for TP update on hammer.
-		newsbin "extra/touchpad_updater/touchpad_updater" ec_touchpad_updater
-	fi
-
-	dobin "util/flash_ec"
-	dobin "util/uart_stress_tester.py"
-	insinto /usr/share/ec-devutils
-	doins util/openocd/*
-
-	distutils-r1_src_install
-}
diff --git a/chromeos-base/ec-devutils/ec-devutils-0.0.2-r6331.ebuild b/chromeos-base/ec-devutils/ec-devutils-0.0.2-r6331.ebuild
new file mode 100644
index 0000000..37c04515
--- /dev/null
+++ b/chromeos-base/ec-devutils/ec-devutils-0.0.2-r6331.ebuild
@@ -0,0 +1,89 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_COMMIT="54a10bd3295c065c146931a51284252da606f945"
+CROS_WORKON_TREE="4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff"
+CROS_WORKON_PROJECT="chromiumos/platform/ec"
+CROS_WORKON_LOCALNAME="platform/ec"
+PYTHON_COMPAT=( python2_7 python3_6 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Host development utilities for Chromium OS EC"
+HOMEPAGE="https://www.chromium.org/chromium-os/ec-development"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="hammerd"
+
+DEPEND="virtual/libusb:1=
+	sys-apps/flashmap:=
+	"
+RDEPEND="
+	${DEPEND}
+	app-mobilephone/dfu-util
+	sys-firmware/servo-firmware
+	sys-apps/flashrom
+	!<chromeos-base/ec-utils-0.0.1-r6153
+	chromeos-base/ec-utils
+	>=dev-python/pyusb-1.0.2
+	"
+BDEPEND="
+	dev-python/setuptools[${PYTHON_USEDEP}]
+	virtual/pkgconfig
+	"
+
+set_board() {
+	# No need to be board specific, no tools below build code that is
+	# EC specific. bds works for forst side compilation.
+	export BOARD="bds"
+}
+
+src_configure() {
+	distutils-r1_src_configure
+}
+
+src_compile() {
+	tc-export AR CC PKG_CONFIG RANLIB
+	# In platform/ec Makefile, it uses "CC" to specify target chipset and
+	# "HOSTCC" to compile the utility program because it assumes developers
+	# want to run the utility from same host (build machine).
+	# In this ebuild file, we only build utility
+	# and we may want to build it so it can
+	# be executed on target devices (i.e., arm/x86/amd64), not the build
+	# host (BUILDCC, amd64). So we need to override HOSTCC by target "CC".
+	export HOSTCC="${CC}"
+	set_board
+	emake utils-host
+	# Add usb_updater2 for servo or hammer updates.
+	emake -C extra/usb_updater usb_updater2
+	if use hammerd; then
+		# Add touchpad_updater for TP update on hammer.
+		emake -C extra/touchpad_updater touchpad_updater
+	fi
+	distutils-r1_src_compile
+}
+
+src_install() {
+	set_board
+	dobin "build/${BOARD}/util/stm32mon"
+	dobin "build/${BOARD}/util/ec_parse_panicinfo"
+	dobin "build/${BOARD}/util/uartupdatetool"
+	dobin "build/${BOARD}/util/iteflash"
+
+	# Add usb_updater2 for servo or hammer updates.
+	dosbin "extra/usb_updater/usb_updater2"
+	if use hammerd; then
+		# Add touchpad_updater for TP update on hammer.
+		newsbin "extra/touchpad_updater/touchpad_updater" ec_touchpad_updater
+	fi
+
+	dobin "util/flash_ec"
+	dobin "util/uart_stress_tester.py"
+	insinto /usr/share/ec-devutils
+	doins util/openocd/*
+
+	distutils-r1_src_install
+}
diff --git a/chromeos-base/ec-devutils/ec-devutils-9999.ebuild b/chromeos-base/ec-devutils/ec-devutils-9999.ebuild
index 1e401e7..e1a95b7 100644
--- a/chromeos-base/ec-devutils/ec-devutils-9999.ebuild
+++ b/chromeos-base/ec-devutils/ec-devutils-9999.ebuild
@@ -4,7 +4,7 @@
 EAPI="7"
 CROS_WORKON_PROJECT="chromiumos/platform/ec"
 CROS_WORKON_LOCALNAME="platform/ec"
-PYTHON_COMPAT=( python2_7 )
+PYTHON_COMPAT=( python2_7 python3_6 )
 
 inherit cros-workon distutils-r1
 
diff --git a/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r4808.ebuild b/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r4808.ebuild
deleted file mode 100644
index 1986b58..0000000
--- a/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r4808.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="478f28b630d531705c62fb681bfa273360cd623c"
-CROS_WORKON_TREE="deab483754cdb9e9af2f15f2631eca657f0e7d65"
-CROS_WORKON_PROJECT="chromiumos/platform/ec"
-CROS_WORKON_LOCALNAME="platform/ec"
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cros-workon
-
-DESCRIPTION="Chrome OS EC Utility Helper"
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="biod -cr50_onboard"
-
-RDEPEND="chromeos-base/ec-utils
-	biod? ( dev-util/shflags )"
-
-src_compile() {
-	tc-export CC
-
-	if use cr50_onboard; then
-		emake -C extra/rma_reset
-	fi
-}
-
-src_install() {
-	dobin "util/battery_temp"
-	dosbin "util/inject-keys.py"
-
-	if use cr50_onboard; then
-		dobin "extra/rma_reset/rma_reset"
-	fi
-
-	if use biod; then
-		einfo "Installing flash_fp_mcu"
-		dobin "util/flash_fp_mcu"
-	fi
-}
diff --git a/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r5435.ebuild b/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r5435.ebuild
new file mode 100644
index 0000000..9b5438fe
--- /dev/null
+++ b/chromeos-base/ec-utils-test/ec-utils-test-0.0.1-r5435.ebuild
@@ -0,0 +1,46 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="54a10bd3295c065c146931a51284252da606f945"
+CROS_WORKON_TREE="4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff"
+CROS_WORKON_PROJECT="chromiumos/platform/ec"
+CROS_WORKON_LOCALNAME="platform/ec"
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+inherit cros-workon
+
+DESCRIPTION="Chrome OS EC Utility Helper"
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="biod -cr50_onboard"
+
+RDEPEND="chromeos-base/ec-utils
+	biod? ( dev-util/shflags )"
+
+src_compile() {
+	tc-export CC
+
+	if use cr50_onboard; then
+		emake -C extra/rma_reset
+	fi
+}
+
+src_install() {
+	dobin "util/battery_temp"
+	dosbin "util/inject-keys.py"
+
+	if use cr50_onboard; then
+		dobin "extra/rma_reset/rma_reset"
+	fi
+
+	if use biod; then
+		einfo "Installing flash_fp_mcu"
+		dobin "util/flash_fp_mcu"
+	fi
+}
diff --git a/chromeos-base/ec-utils/ec-utils-0.0.2-r7636.ebuild b/chromeos-base/ec-utils/ec-utils-0.0.2-r7636.ebuild
deleted file mode 100644
index 354b3ff..0000000
--- a/chromeos-base/ec-utils/ec-utils-0.0.2-r7636.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="478f28b630d531705c62fb681bfa273360cd623c"
-CROS_WORKON_TREE="deab483754cdb9e9af2f15f2631eca657f0e7d65"
-CROS_WORKON_PROJECT="chromiumos/platform/ec"
-CROS_WORKON_LOCALNAME="platform/ec"
-
-inherit cros-workon user
-
-DESCRIPTION="Chrome OS EC Utility"
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="static -updater_utils"
-IUSE="${IUSE} cros_host +cros_ec_utils"
-
-COMMON_DEPEND="dev-embedded/libftdi:=
-	dev-libs/openssl:0=
-	virtual/libusb:1="
-DEPEND="${COMMON_DEPEND}"
-RDEPEND="${COMMON_DEPEND}"
-
-pkg_preinst() {
-	enewgroup "dialout"
-}
-
-src_compile_cros_ec_utils() {
-	BOARD=host emake utils-host
-}
-
-src_compile() {
-	tc-export AR CC PKG_CONFIG RANLIB
-	# In platform/ec Makefile, it uses "CC" to specify target chipset and
-	# "HOSTCC" to compile the utility program because it assumes developers
-	# want to run the utility from same host (build machine).
-	# In this ebuild file, we only build utility
-	# and we may want to build it so it can
-	# be executed on target devices (i.e., arm/x86/amd64), not the build
-	# host (BUILDCC, amd64). So we need to override HOSTCC by target "CC".
-	export HOSTCC="${CC} $(usex static '-static' '')"
-
-	# Build Chromium EC utilities.
-	use cros_ec_utils && src_compile_cros_ec_utils
-}
-
-src_install_cros_ec_utils() {
-	if use cros_host; then
-		dobin "build/host/util/cbi-util"
-	else
-		dosbin "build/host/util/ectool"
-		dosbin "build/host/util/ec_sb_firmware_update"
-	fi
-}
-
-src_install() {
-	# Install Chromium EC utilities.
-	use cros_ec_utils && src_install_cros_ec_utils
-}
-
-pkg_postinst() {
-	if ! $(id -Gn "$(logname)" | grep -qw "dialout") ; then
-		usermod -a -G "dialout" "$(logname)"
-		einfo "A new group, dialout is added." \
-			"Please re-login to apply this change."
-	fi
-}
diff --git a/chromeos-base/ec-utils/ec-utils-0.0.2-r8263.ebuild b/chromeos-base/ec-utils/ec-utils-0.0.2-r8263.ebuild
new file mode 100644
index 0000000..c1141a4
--- /dev/null
+++ b/chromeos-base/ec-utils/ec-utils-0.0.2-r8263.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="54a10bd3295c065c146931a51284252da606f945"
+CROS_WORKON_TREE="4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff"
+CROS_WORKON_PROJECT="chromiumos/platform/ec"
+CROS_WORKON_LOCALNAME="platform/ec"
+
+inherit cros-workon user
+
+DESCRIPTION="Chrome OS EC Utility"
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="static -updater_utils"
+IUSE="${IUSE} cros_host +cros_ec_utils"
+
+COMMON_DEPEND="dev-embedded/libftdi:=
+	dev-libs/openssl:0=
+	virtual/libusb:1="
+DEPEND="${COMMON_DEPEND}"
+RDEPEND="${COMMON_DEPEND}"
+
+pkg_preinst() {
+	enewgroup "dialout"
+}
+
+src_compile_cros_ec_utils() {
+	BOARD=host emake utils-host
+}
+
+src_compile() {
+	tc-export AR CC PKG_CONFIG RANLIB
+	# In platform/ec Makefile, it uses "CC" to specify target chipset and
+	# "HOSTCC" to compile the utility program because it assumes developers
+	# want to run the utility from same host (build machine).
+	# In this ebuild file, we only build utility
+	# and we may want to build it so it can
+	# be executed on target devices (i.e., arm/x86/amd64), not the build
+	# host (BUILDCC, amd64). So we need to override HOSTCC by target "CC".
+	export HOSTCC="${CC} $(usex static '-static' '')"
+
+	# Build Chromium EC utilities.
+	use cros_ec_utils && src_compile_cros_ec_utils
+}
+
+src_install_cros_ec_utils() {
+	if use cros_host; then
+		dobin "build/host/util/cbi-util"
+	else
+		dosbin "build/host/util/ectool"
+		dosbin "build/host/util/ec_sb_firmware_update"
+	fi
+}
+
+src_install() {
+	# Install Chromium EC utilities.
+	use cros_ec_utils && src_install_cros_ec_utils
+}
+
+pkg_postinst() {
+	if ! $(id -Gn "$(logname)" | grep -qw "dialout") ; then
+		usermod -a -G "dialout" "$(logname)"
+		einfo "A new group, dialout is added." \
+			"Please re-login to apply this change."
+	fi
+}
diff --git a/chromeos-base/elan_i2chid_tools/elan_i2chid_tools-1.12-r2.ebuild b/chromeos-base/elan_i2chid_tools/elan_i2chid_tools-1.12-r3.ebuild
similarity index 100%
rename from chromeos-base/elan_i2chid_tools/elan_i2chid_tools-1.12-r2.ebuild
rename to chromeos-base/elan_i2chid_tools/elan_i2chid_tools-1.12-r3.ebuild
diff --git a/chromeos-base/elan_i2chid_tools/files/fwid_mapping_table.txt b/chromeos-base/elan_i2chid_tools/files/fwid_mapping_table.txt
index 87490d8..451beb4 100644
--- a/chromeos-base/elan_i2chid_tools/files/fwid_mapping_table.txt
+++ b/chromeos-base/elan_i2chid_tools/files/fwid_mapping_table.txt
@@ -1,6 +1,7 @@
 manufacturer.product,chrome_fwid,windows_fwid,
 06af.3d24,32e0,2e38,
 06af.3d31,2fca,2e36,
+06af.3d40,1fa5,,
 06af.8b81,,,
 09e5.7e08,328f,328d,
 09e5.da08,,,
diff --git a/chromeos-base/epstps2iap/Manifest b/chromeos-base/epstps2iap/Manifest
new file mode 100644
index 0000000..f3760a5
--- /dev/null
+++ b/chromeos-base/epstps2iap/Manifest
@@ -0,0 +1 @@
+DIST epstps2iap-1.2.tar.gz 13512 BLAKE2B e4ab516e675e5db9e539f0f6260fb1d29f786c9793c0a7b5620e5595a2d87f5bcc865deb4197cdc2fd40e2dc82bf6b1f6f34a947d8c22cea0d1dfea0f086fc0c SHA512 8cc27597116dd6e647b2ab3c51e14e6784e7fddad66080dcebf8fc82b8d00b7ce73ff6623f692a21b6ca4378272a7da99d9e0a072e6af12b44afb0592c7a4b1b
diff --git a/chromeos-base/epstps2iap/epstps2iap-1.2.ebuild b/chromeos-base/epstps2iap/epstps2iap-1.2.ebuild
new file mode 100644
index 0000000..e070081
--- /dev/null
+++ b/chromeos-base/epstps2iap/epstps2iap-1.2.ebuild
@@ -0,0 +1,26 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit toolchain-funcs
+
+DESCRIPTION="ELAN Standalone Trackpoint Firmware Update"
+GIT_TAG="v${PV}"
+HOMEPAGE="https://github.com/jinglewu/epstps2iap/"
+MY_P="epstps2iap-${PV}"
+SRC_URI="https://github.com/jinglewu/epstps2iap/archive/${GIT_TAG}.tar.gz -> ${P}.tar.gz"
+S="${WORKDIR}/${MY_P}/epstps2_updater"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+src_configure() {
+	tc-export CC
+}
+
+src_install() {
+	dosbin epstps2_updater
+}
diff --git a/chromeos-base/factory-mini/factory-mini-0.0.1-r1809.ebuild b/chromeos-base/factory-mini/factory-mini-0.0.1-r1809.ebuild
deleted file mode 100644
index ec75edc..0000000
--- a/chromeos-base/factory-mini/factory-mini-0.0.1-r1809.ebuild
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# factory-mini is a subset of the factory software that can
-# be used to run utilities like gooftool, hwid, and regcode, which may
-# be useful in the CrOS test environment.  For instance, this would
-# allow "gooftool probe" to be used to probe hardware components in
-# Moblab.
-#
-# We don't want to install the entire chromeos-factory package in the
-# test image, since it is quite large, so this package comprises a
-# small ".par" file (/usr/local/factory-mini/factory-mini.par)
-# containing the necessary subset of factory Python code, and symlinks
-# from /usr/local/bin to that file.
-
-EAPI=7
-CROS_WORKON_COMMIT="a3f2e4767102b0a100e09475b486dfad9fd2fafa"
-CROS_WORKON_TREE="c3987abc053ccaf989c5b84d5d5767669eb55890"
-CROS_WORKON_PROJECT="chromiumos/platform/factory"
-CROS_WORKON_LOCALNAME="platform/factory"
-PYTHON_COMPAT=( python3_{4,5,6,7} )
-
-inherit cros-workon python-r1
-
-# TODO(b/155841952): Merge installer and factory-mini.par
-
-# External dependencies (sync with factory.ebuild)
-LOCAL_MIRROR_URL="http://commondatastorage.googleapis.com/chromeos-localmirror/"
-WEBGL_AQUARIUM_URI="${LOCAL_MIRROR_URL}/distfiles/webgl-aquarium-20130524.tar.bz2"
-SRC_URI="${WEBGL_AQUARIUM_URI}"
-
-DESCRIPTION="Subset of factory software to be installed in test images"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="${PYTHON_DEPS}
-	dev-python/jsonrpclib:=
-	dev-python/pyyaml:=
-	dev-python/protobuf-python:=
-	virtual/chromeos-bsp-factory:=
-	virtual/chromeos-regions:=
-"
-
-pkg_setup() {
-	cros-workon_pkg_setup
-	python_setup
-}
-
-src_unpack() {
-	cros-workon_src_unpack
-	default
-}
-
-src_configure() {
-	default
-
-	# Export build settings
-	export PYTHON="${EPYTHON}"
-	export PYTHON_SITEDIR="${ESYSROOT}$(python_get_sitedir)"
-	export SRCROOT="${CROS_WORKON_SRCROOT}"
-	export FROM_EBUILD=1
-
-	# Export factory toolkit build settings
-	export BOARD="${SYSROOT##*/}"
-	export TARGET_DIR=/usr/local/factory
-	export WEBGL_AQUARIUM_DIR="${WORKDIR}/webgl_aquarium_static"
-}
-
-src_compile() {
-	emake par MAKE_PAR_ARGS=--mini PAR_NAME=factory-mini.par
-
-	emake toolkit
-}
-
-src_install() {
-	exeinto /usr/local/factory-mini
-	doexe build/par/factory-mini.par
-
-	# Sanity check: make sure we can run gooftool --help with only
-	# the -mini.par file.
-	build/par/factory-mini.par gooftool --help |
-		grep -q "^usage: gooftool" || die
-
-	# Install only symlinks for binaries usable with factory-mini.par.
-	"${S}/bin/install_symlinks" \
-		--mode mini --target ../factory-mini/factory-mini.par \
-		"${D}"/usr/local/bin || die
-
-	exeinto /usr/local/factory-toolkit
-	doexe build/install_factory_toolkit.run
-}
diff --git a/chromeos-base/factory-mini/factory-mini-0.0.1-r1925.ebuild b/chromeos-base/factory-mini/factory-mini-0.0.1-r1925.ebuild
new file mode 100644
index 0000000..9467188
--- /dev/null
+++ b/chromeos-base/factory-mini/factory-mini-0.0.1-r1925.ebuild
@@ -0,0 +1,94 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# factory-mini is a subset of the factory software that can
+# be used to run utilities like gooftool, hwid, and regcode, which may
+# be useful in the CrOS test environment.  For instance, this would
+# allow "gooftool probe" to be used to probe hardware components in
+# Moblab.
+#
+# We don't want to install the entire chromeos-factory package in the
+# test image, since it is quite large, so this package comprises a
+# small ".par" file (/usr/local/factory-mini/factory-mini.par)
+# containing the necessary subset of factory Python code, and symlinks
+# from /usr/local/bin to that file.
+
+EAPI=7
+CROS_WORKON_COMMIT="4d485a69f55891ca64bce37db385c4cbae85a018"
+CROS_WORKON_TREE="b9a61b7f075247e06bb38ca273751021cc02f0b0"
+CROS_WORKON_PROJECT="chromiumos/platform/factory"
+CROS_WORKON_LOCALNAME="platform/factory"
+PYTHON_COMPAT=( python3_{4,5,6,7} )
+
+inherit cros-workon python-r1
+
+# TODO(b/155841952): Merge installer and factory-mini.par
+
+# External dependencies (sync with factory.ebuild)
+LOCAL_MIRROR_URL="http://commondatastorage.googleapis.com/chromeos-localmirror/"
+WEBGL_AQUARIUM_URI="${LOCAL_MIRROR_URL}/distfiles/webgl-aquarium-20130524.tar.bz2"
+SRC_URI="${WEBGL_AQUARIUM_URI}"
+
+DESCRIPTION="Subset of factory software to be installed in test images"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="${PYTHON_DEPS}
+	dev-python/jsonrpclib:=
+	dev-python/pyyaml:=
+	dev-python/protobuf-python:=
+	virtual/chromeos-bsp-factory:=
+	virtual/chromeos-regions:=
+"
+
+pkg_setup() {
+	cros-workon_pkg_setup
+	python_setup
+}
+
+src_unpack() {
+	cros-workon_src_unpack
+	default
+}
+
+src_configure() {
+	default
+
+	# Export build settings
+	export PYTHON="${EPYTHON}"
+	export PYTHON_SITEDIR="${ESYSROOT}$(python_get_sitedir)"
+	export SRCROOT="${CROS_WORKON_SRCROOT}"
+	export FROM_EBUILD=1
+
+	# Export factory toolkit build settings
+	export BOARD="${SYSROOT##*/}"
+	export TARGET_DIR=/usr/local/factory
+	export WEBGL_AQUARIUM_DIR="${WORKDIR}/webgl_aquarium_static"
+}
+
+src_compile() {
+	emake par MAKE_PAR_ARGS=--mini PAR_NAME=factory-mini.par
+
+	emake toolkit
+}
+
+src_install() {
+	exeinto /usr/local/factory-mini
+	doexe build/par/factory-mini.par
+
+	# Sanity check: make sure we can run gooftool --help with only
+	# the -mini.par file.
+	build/par/factory-mini.par gooftool --help |
+		grep -q "^usage: gooftool" || die
+
+	# Install only symlinks for binaries usable with factory-mini.par.
+	"${S}/bin/install_symlinks" \
+		--mode mini --target ../factory-mini/factory-mini.par \
+		"${D}"/usr/local/bin || die
+
+	exeinto /usr/local/factory-toolkit
+	doexe build/install_factory_toolkit.run
+}
diff --git a/chromeos-base/factory/factory-0.2.0-r1737.ebuild b/chromeos-base/factory/factory-0.2.0-r1737.ebuild
deleted file mode 100644
index 660d2d9..0000000
--- a/chromeos-base/factory/factory-0.2.0-r1737.ebuild
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="a3f2e4767102b0a100e09475b486dfad9fd2fafa"
-CROS_WORKON_TREE="c3987abc053ccaf989c5b84d5d5767669eb55890"
-CROS_WORKON_PROJECT="chromiumos/platform/factory"
-CROS_WORKON_LOCALNAME="platform/factory"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-# TODO(crbug.com/999876): Upgrade to Python 3 at some point.
-PYTHON_COMPAT=( python3_{4,5,6,7} )
-
-inherit cros-workon python-r1 cros-constants cros-factory
-
-# External dependencies
-LOCAL_MIRROR_URL=http://commondatastorage.googleapis.com/chromeos-localmirror/
-WEBGL_AQUARIUM_URI=${LOCAL_MIRROR_URL}/distfiles/webgl-aquarium-20130524.tar.bz2
-
-DESCRIPTION="Chrome OS Factory Software Platform"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/factory/"
-SRC_URI="${WEBGL_AQUARIUM_URI}"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="virtual/chromeos-bsp-factory:=
-	virtual/chromeos-regions:=
-	dev-python/enum34:=
-	dev-python/jsonrpclib:=
-	dev-python/pyyaml:=
-	dev-python/protobuf-python:=
-"
-
-BUILD_DIR="${WORKDIR}/build"
-
-pkg_setup() {
-	cros-workon_pkg_setup
-	python_setup
-}
-
-src_prepare() {
-	default
-	# Need the lddtree from the chromite dir.
-	export PATH="${CHROMITE_BIN_DIR}:${PATH}"
-}
-
-src_configure() {
-	default
-
-	# Export build settings
-	export BOARD="${SYSROOT##*/}"
-	export OUTOFTREE_BUILD="${CROS_WORKON_OUTOFTREE_BUILD}"
-	export PYTHON="${EPYTHON}"
-	export PYTHON_SITEDIR="${ESYSROOT}$(python_get_sitedir)"
-	export SRCROOT="${CROS_WORKON_SRCROOT}"
-	export TARGET_DIR=/usr/local/factory
-	export WEBGL_AQUARIUM_DIR="${WORKDIR}/webgl_aquarium_static"
-	export FROM_EBUILD=1
-
-	# Support out-of-tree build.
-	export BUILD_DIR="${WORKDIR}/build"
-
-	# The path of bundle is defined in chromite/cbuildbot/commands.py
-	export BUNDLE_DIR="${ED}/usr/local/factory/bundle"
-}
-
-src_unpack() {
-	cros-workon_src_unpack
-	default
-}
-
-src_install() {
-	emake bundle
-	insinto "${CROS_FACTORY_BOARD_RESOURCES_DIR}"
-	doins "${BUILD_DIR}/resource/installer.tar"
-}
diff --git a/chromeos-base/factory/factory-0.2.0-r1853.ebuild b/chromeos-base/factory/factory-0.2.0-r1853.ebuild
new file mode 100644
index 0000000..a829d2f
--- /dev/null
+++ b/chromeos-base/factory/factory-0.2.0-r1853.ebuild
@@ -0,0 +1,76 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="4d485a69f55891ca64bce37db385c4cbae85a018"
+CROS_WORKON_TREE="b9a61b7f075247e06bb38ca273751021cc02f0b0"
+CROS_WORKON_PROJECT="chromiumos/platform/factory"
+CROS_WORKON_LOCALNAME="platform/factory"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+# TODO(crbug.com/999876): Upgrade to Python 3 at some point.
+PYTHON_COMPAT=( python3_{4,5,6,7} )
+
+inherit cros-workon python-r1 cros-constants cros-factory
+
+# External dependencies
+LOCAL_MIRROR_URL=http://commondatastorage.googleapis.com/chromeos-localmirror/
+WEBGL_AQUARIUM_URI=${LOCAL_MIRROR_URL}/distfiles/webgl-aquarium-20130524.tar.bz2
+
+DESCRIPTION="Chrome OS Factory Software Platform"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/factory/"
+SRC_URI="${WEBGL_AQUARIUM_URI}"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="virtual/chromeos-bsp-factory:=
+	virtual/chromeos-regions:=
+	dev-python/enum34:=
+	dev-python/jsonrpclib:=
+	dev-python/pyyaml:=
+	dev-python/protobuf-python:=
+"
+
+BUILD_DIR="${WORKDIR}/build"
+
+pkg_setup() {
+	cros-workon_pkg_setup
+	python_setup
+}
+
+src_prepare() {
+	default
+	# Need the lddtree from the chromite dir.
+	export PATH="${CHROMITE_BIN_DIR}:${PATH}"
+}
+
+src_configure() {
+	default
+
+	# Export build settings
+	export BOARD="${SYSROOT##*/}"
+	export OUTOFTREE_BUILD="${CROS_WORKON_OUTOFTREE_BUILD}"
+	export PYTHON="${EPYTHON}"
+	export PYTHON_SITEDIR="${ESYSROOT}$(python_get_sitedir)"
+	export SRCROOT="${CROS_WORKON_SRCROOT}"
+	export TARGET_DIR=/usr/local/factory
+	export WEBGL_AQUARIUM_DIR="${WORKDIR}/webgl_aquarium_static"
+	export FROM_EBUILD=1
+
+	# Support out-of-tree build.
+	export BUILD_DIR="${WORKDIR}/build"
+
+	# The path of bundle is defined in chromite/cbuildbot/commands.py
+	export BUNDLE_DIR="${ED}/usr/local/factory/bundle"
+}
+
+src_unpack() {
+	cros-workon_src_unpack
+	default
+}
+
+src_install() {
+	emake bundle
+	insinto "${CROS_FACTORY_BOARD_RESOURCES_DIR}"
+	doins "${BUILD_DIR}/resource/installer.tar"
+}
diff --git a/chromeos-base/factory_installer/factory_installer-0.0.1-r138.ebuild b/chromeos-base/factory_installer/factory_installer-0.0.1-r138.ebuild
deleted file mode 100644
index a7299db..0000000
--- a/chromeos-base/factory_installer/factory_installer-0.0.1-r138.ebuild
+++ /dev/null
@@ -1,170 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="917e97c2ab91bd99998941fbe403f3b490aeadf6"
-CROS_WORKON_TREE="75357d26a67cb809e4496d8a9c95b03028e13dbe"
-CROS_WORKON_PROJECT="chromiumos/platform/factory_installer"
-CROS_WORKON_LOCALNAME="platform/factory_installer"
-
-inherit cros-sanitizers cros-workon toolchain-funcs cros-factory
-
-DESCRIPTION="Chrome OS Factory Installer"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/factory_installer/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-USE_PREFIX="tty_console_"
-ALL_PORTS=(
-	ttyAMA{0..5}
-	ttyHSL{0..5}
-	ttyMSM{0..5}
-	ttymxc{0..5}
-	ttyO{0..5}
-	ttyS{0..5}
-	ttySAC{0..5}
-	ttyUSB{0..5}
-	tty{0..5}
-)
-IUSE_PORTS="${ALL_PORTS[@]/#/${USE_PREFIX}}"
-IUSE="${IUSE_PORTS} -asan test"
-
-# Factory install images operate by downloading content from a
-# server.  In some cases, the downloaded content contains programs
-# to be executed.  The downloaded programs may not be complete;
-# they could have dependencies on shared libraries or commands
-# that must be present in the factory install image.
-#
-# PROVIDED_DEPEND captures a minimal set of packages promised to be
-# provided for use by any downloaded program.  The list must contain
-# any package depended on by any downloaded program.
-#
-# Currently, the only downloaded program is the firmware installer;
-# the dependencies below are gleaned from eclass/cros-firmware.eclass.
-# Changes in that eclass must be reflected here.
-PROVIDED_DEPEND="
-	app-arch/gzip
-	app-arch/sharutils
-	app-arch/tar
-	app-misc/figlet
-	chromeos-base/vboot_reference
-	sys-apps/mosys
-	sys-apps/util-linux"
-
-# COMMON_DEPEND tracks dependencies common to both DEPEND and
-# RDEPEND.
-#
-# For chromeos-init there's a runtime dependency because the factory
-# jobs depend on upstart jobs in that package.  There's a build-time
-# dependency because pkg_postinst in this ebuild edits specifc jobs
-# in that package.
-COMMON_DEPEND="
-	chromeos-base/chromeos-init:=
-	!chromeos-base/chromeos-factoryinstall
-	!chromeos-base/chromeos-factory"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/factory:=
-	test? ( chromeos-base/secure-wipe:= )
-	x86? ( sys-boot/syslinux:= )"
-
-RDEPEND="${COMMON_DEPEND}
-	${PROVIDED_DEPEND}
-	app-arch/lbzip2
-	app-arch/pigz
-	app-misc/jq
-	chromeos-base/chromeos-installer
-	chromeos-base/chromeos-storage-info
-	chromeos-base/ec-utils
-	chromeos-base/secure-wipe
-	chromeos-base/vpd
-	dev-util/stressapptest
-	net-misc/htpdate
-	net-wireless/iw
-	sys-apps/flashrom
-	sys-apps/net-tools
-	sys-apps/upstart
-	sys-apps/util-linux
-	sys-block/parted
-	sys-fs/e2fsprogs"
-
-
-src_configure() {
-	sanitizers-setup-env
-	default
-}
-
-src_compile() {
-	tc-export AR CC CXX RANLIB
-	emake
-}
-
-src_test() {
-	tests/secure-wipe.sh || die "integration test failed"
-}
-
-src_install() {
-	local service_file="factory_tty.sh"
-	local tmp_service_file="${T}/${service_file}"
-	local scripts=(*.sh)
-	scripts=(${scripts[@]#${service_file}})
-
-	if [[ -n "${TTY_CONSOLE}" ]]; then
-		local item ports=()
-		for item in ${IUSE_PORTS}; do
-			if use ${item}; then
-				ports+=("${item#${USE_PREFIX}}")
-			fi
-		done
-		sed -e "s/^TTY_CONSOLE=.*$/TTY_CONSOLE=\"${ports[*]}\"/" \
-			"${service_file}" >"${tmp_service_file}" || \
-			die "Failed to change TTY_CONSOLE"
-		service_file="${tmp_service_file}"
-		einfo "Changed TTY_CONSOLE to ${ports[*]}."
-	fi
-	dosbin "${scripts[@]}" "${service_file}"
-
-	insinto /etc/init
-	doins init/*.conf
-
-	insinto /root
-	newins $FILESDIR/dot.factory_installer .factory_installer
-	# install PMBR code
-	case "$(tc-arch)" in
-		"x86")
-		einfo "using x86 PMBR code from syslinux"
-		PMBR_SOURCE="${ROOT}/usr/share/syslinux/gptmbr.bin"
-		;;
-		*)
-		einfo "using default PMBR code"
-		PMBR_SOURCE=$FILESDIR/dot.pmbr_code
-		;;
-	esac
-	newins $PMBR_SOURCE .pmbr_code
-
-	einfo "Install resources from chromeos-base/factory."
-	factory_unpack_resource installer "${ED}/usr"
-
-	if [[ -f "$(factory_get_resource_archive_path installer-board)" ]]; then
-		einfo "Install resources from chromeos-base/factory-board."
-		factory_unpack_resource installer-board "${ED}"
-	fi
-}
-
-pkg_postinst() {
-	[[ "$(cros_target)" != "target_image" ]] && return 0
-
-	STATEFUL="${ROOT}/usr/local"
-	STATEFUL_LSB="${STATEFUL}/etc/lsb-factory"
-
-	: "${FACTORY_SERVER:=$(hostname -f)}"
-
-	mkdir -p "${STATEFUL}/etc"
-	sudo dd of="${STATEFUL_LSB}" <<EOF
-CHROMEOS_AUSERVER=http://${FACTORY_SERVER}:8080/update
-CHROMEOS_DEVSERVER=http://${FACTORY_SERVER}:8080/update
-FACTORY_INSTALL=1
-HTTP_SERVER_OVERRIDE=true
-EOF
-}
diff --git a/chromeos-base/factory_installer/factory_installer-0.0.1-r140.ebuild b/chromeos-base/factory_installer/factory_installer-0.0.1-r140.ebuild
new file mode 100644
index 0000000..cd41beb
--- /dev/null
+++ b/chromeos-base/factory_installer/factory_installer-0.0.1-r140.ebuild
@@ -0,0 +1,170 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="e6e1946dbebba75ed6d0fc48264f49f6e51f28e0"
+CROS_WORKON_TREE="59131c3942457a51b48fa6920e31300f71b76e90"
+CROS_WORKON_PROJECT="chromiumos/platform/factory_installer"
+CROS_WORKON_LOCALNAME="platform/factory_installer"
+
+inherit cros-sanitizers cros-workon toolchain-funcs cros-factory
+
+DESCRIPTION="Chrome OS Factory Installer"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/factory_installer/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+USE_PREFIX="tty_console_"
+ALL_PORTS=(
+	ttyAMA{0..5}
+	ttyHSL{0..5}
+	ttyMSM{0..5}
+	ttymxc{0..5}
+	ttyO{0..5}
+	ttyS{0..5}
+	ttySAC{0..5}
+	ttyUSB{0..5}
+	tty{0..5}
+)
+IUSE_PORTS="${ALL_PORTS[@]/#/${USE_PREFIX}}"
+IUSE="${IUSE_PORTS} -asan test"
+
+# Factory install images operate by downloading content from a
+# server.  In some cases, the downloaded content contains programs
+# to be executed.  The downloaded programs may not be complete;
+# they could have dependencies on shared libraries or commands
+# that must be present in the factory install image.
+#
+# PROVIDED_DEPEND captures a minimal set of packages promised to be
+# provided for use by any downloaded program.  The list must contain
+# any package depended on by any downloaded program.
+#
+# Currently, the only downloaded program is the firmware installer;
+# the dependencies below are gleaned from eclass/cros-firmware.eclass.
+# Changes in that eclass must be reflected here.
+PROVIDED_DEPEND="
+	app-arch/gzip
+	app-arch/sharutils
+	app-arch/tar
+	app-misc/figlet
+	chromeos-base/vboot_reference
+	sys-apps/mosys
+	sys-apps/util-linux"
+
+# COMMON_DEPEND tracks dependencies common to both DEPEND and
+# RDEPEND.
+#
+# For chromeos-init there's a runtime dependency because the factory
+# jobs depend on upstart jobs in that package.  There's a build-time
+# dependency because pkg_postinst in this ebuild edits specifc jobs
+# in that package.
+COMMON_DEPEND="
+	chromeos-base/chromeos-init:=
+	!chromeos-base/chromeos-factoryinstall
+	!chromeos-base/chromeos-factory"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/factory:=
+	test? ( chromeos-base/secure-wipe:= )
+	x86? ( sys-boot/syslinux:= )"
+
+RDEPEND="${COMMON_DEPEND}
+	${PROVIDED_DEPEND}
+	app-arch/lbzip2
+	app-arch/pigz
+	app-misc/jq
+	chromeos-base/chromeos-installer
+	chromeos-base/chromeos-storage-info
+	chromeos-base/ec-utils
+	chromeos-base/secure-wipe
+	chromeos-base/vpd
+	dev-util/stressapptest
+	net-misc/htpdate
+	net-wireless/iw
+	sys-apps/flashrom
+	sys-apps/net-tools
+	sys-apps/upstart
+	sys-apps/util-linux
+	sys-block/parted
+	sys-fs/e2fsprogs"
+
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
+
+src_compile() {
+	tc-export AR CC CXX RANLIB
+	emake
+}
+
+src_test() {
+	tests/secure-wipe.sh || die "integration test failed"
+}
+
+src_install() {
+	local service_file="factory_tty.sh"
+	local tmp_service_file="${T}/${service_file}"
+	local scripts=(*.sh)
+	scripts=(${scripts[@]#${service_file}})
+
+	if [[ -n "${TTY_CONSOLE}" ]]; then
+		local item ports=()
+		for item in ${IUSE_PORTS}; do
+			if use ${item}; then
+				ports+=("${item#${USE_PREFIX}}")
+			fi
+		done
+		sed -e "s/^TTY_CONSOLE=.*$/TTY_CONSOLE=\"${ports[*]}\"/" \
+			"${service_file}" >"${tmp_service_file}" || \
+			die "Failed to change TTY_CONSOLE"
+		service_file="${tmp_service_file}"
+		einfo "Changed TTY_CONSOLE to ${ports[*]}."
+	fi
+	dosbin "${scripts[@]}" "${service_file}"
+
+	insinto /etc/init
+	doins init/*.conf
+
+	insinto /root
+	newins $FILESDIR/dot.factory_installer .factory_installer
+	# install PMBR code
+	case "$(tc-arch)" in
+		"x86")
+		einfo "using x86 PMBR code from syslinux"
+		PMBR_SOURCE="${ROOT}/usr/share/syslinux/gptmbr.bin"
+		;;
+		*)
+		einfo "using default PMBR code"
+		PMBR_SOURCE=$FILESDIR/dot.pmbr_code
+		;;
+	esac
+	newins $PMBR_SOURCE .pmbr_code
+
+	einfo "Install resources from chromeos-base/factory."
+	factory_unpack_resource installer "${ED}/usr"
+
+	if [[ -f "$(factory_get_resource_archive_path installer-board)" ]]; then
+		einfo "Install resources from chromeos-base/factory-board."
+		factory_unpack_resource installer-board "${ED}"
+	fi
+}
+
+pkg_postinst() {
+	[[ "$(cros_target)" != "target_image" ]] && return 0
+
+	STATEFUL="${ROOT}/usr/local"
+	STATEFUL_LSB="${STATEFUL}/etc/lsb-factory"
+
+	: "${FACTORY_SERVER:=$(hostname -f)}"
+
+	mkdir -p "${STATEFUL}/etc"
+	sudo dd of="${STATEFUL_LSB}" <<EOF
+CHROMEOS_AUSERVER=http://${FACTORY_SERVER}:8080/update
+CHROMEOS_DEVSERVER=http://${FACTORY_SERVER}:8080/update
+FACTORY_INSTALL=1
+HTTP_SERVER_OVERRIDE=true
+EOF
+}
diff --git a/chromeos-base/feedback/feedback-0.0.1-r741.ebuild b/chromeos-base/feedback/feedback-0.0.1-r741.ebuild
deleted file mode 100644
index c1e7a86..0000000
--- a/chromeos-base/feedback/feedback-0.0.1-r741.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "97e8707008e2f9258cbdf887b73465f5d2332c0e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk feedback .gn"
-
-PLATFORM_SUBDIR="feedback"
-
-inherit cros-constants cros-workon git-2 platform
-
-DESCRIPTION="Feedback service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/feedback/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND=""
-DEPEND="chromeos-base/system_api:="
-
-src_install() {
-	dobin "${OUT}"/feedback_client
-	dobin "${OUT}"/feedback_daemon
-
-	insinto /etc/init
-	doins init/feedback_daemon.conf
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.feedback.conf
-
-	insinto /usr/include/feedback
-	doins components/feedback/feedback_common.h
-	doins feedback_service_interface.h
-}
-
-platform_pkg_test() {
-	local tests=(
-		feedback_daemon_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/feedback/feedback-0.0.1-r764.ebuild b/chromeos-base/feedback/feedback-0.0.1-r764.ebuild
new file mode 100644
index 0000000..3d14b6f
--- /dev/null
+++ b/chromeos-base/feedback/feedback-0.0.1-r764.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e1008c242e6e91192372de3ba2960c2102355c42" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk feedback .gn"
+
+PLATFORM_SUBDIR="feedback"
+
+inherit cros-constants cros-workon git-2 platform
+
+DESCRIPTION="Feedback service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/feedback/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND=""
+DEPEND="chromeos-base/system_api:="
+
+src_install() {
+	dobin "${OUT}"/feedback_client
+	dobin "${OUT}"/feedback_daemon
+
+	insinto /etc/init
+	doins init/feedback_daemon.conf
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.feedback.conf
+
+	insinto /usr/include/feedback
+	doins components/feedback/feedback_common.h
+	doins feedback_service_interface.h
+}
+
+platform_pkg_test() {
+	local tests=(
+		feedback_daemon_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/foomatic_shell/foomatic_shell-0.0.1-r6.ebuild b/chromeos-base/foomatic_shell/foomatic_shell-0.0.1-r6.ebuild
new file mode 100644
index 0000000..acdf171
--- /dev/null
+++ b/chromeos-base/foomatic_shell/foomatic_shell-0.0.1-r6.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "3f76f020569718d57c680d94f2164775b57da9cd" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk foomatic_shell .gn"
+
+PLATFORM_SUBDIR="foomatic_shell"
+
+inherit cros-workon platform
+
+DESCRIPTION="Mini shell used by foomatic-rip to execute scripts in PPD files."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/foomatic_shell/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+src_install() {
+	dobin "${OUT}/foomatic_shell"
+
+	# Install fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/foomatic_shell_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/foomatic_shell_test"
+}
diff --git a/chromeos-base/foomatic_shell/foomatic_shell-9999.ebuild b/chromeos-base/foomatic_shell/foomatic_shell-9999.ebuild
new file mode 100644
index 0000000..c840c2a
--- /dev/null
+++ b/chromeos-base/foomatic_shell/foomatic_shell-9999.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk foomatic_shell .gn"
+
+PLATFORM_SUBDIR="foomatic_shell"
+
+inherit cros-workon platform
+
+DESCRIPTION="Mini shell used by foomatic-rip to execute scripts in PPD files."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/foomatic_shell/"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+
+src_install() {
+	dobin "${OUT}/foomatic_shell"
+
+	# Install fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/foomatic_shell_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/foomatic_shell_test"
+}
diff --git a/chromeos-base/g2f_tools/g2f_tools-0.0.1-r309.ebuild b/chromeos-base/g2f_tools/g2f_tools-0.0.1-r309.ebuild
deleted file mode 100644
index 67f3cdd..0000000
--- a/chromeos-base/g2f_tools/g2f_tools-0.0.1-r309.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="44a9d4ca54a10cae2c8a35b4ba9fee89fb67d239"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1bf01f1a340a50edee0e82b52621117c8388644c" "7e189936f29d145c4191ea147e48256c92fac75d" "9fd99bf51279bfd5841cde5997f0379182410b03" "614157b36aa6196f7a410a5164c92b44cdd4e1ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libhwsec metrics trunks u2fd .gn"
-
-PLATFORM_SUBDIR="u2fd"
-
-inherit cros-workon platform
-
-DESCRIPTION="G2F gnubby (U2F+GCSE) development and testing tools"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fd"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	chromeos-base/libhwsec:=
-	dev-libs/hidapi:=
-	"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/chromeos-ec-headers:=
-	chromeos-base/u2fd:=
-	"
-
-src_install() {
-	dobin "${OUT}"/g2ftool
-	dobin "${OUT}"/webauthntool
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/g2f_client_test"
-}
diff --git a/chromeos-base/g2f_tools/g2f_tools-0.0.1-r367.ebuild b/chromeos-base/g2f_tools/g2f_tools-0.0.1-r367.ebuild
new file mode 100644
index 0000000..9d90051
--- /dev/null
+++ b/chromeos-base/g2f_tools/g2f_tools-0.0.1-r367.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "59ded4c8a6ec924cce82ba942070e51132ca1161" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e8a973464784e588992988988eb26cfa0cf5f67b" "455c68aebdef50de586de3bdbacfe923077cd697" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libhwsec metrics trunks u2fd .gn"
+
+PLATFORM_SUBDIR="u2fd"
+
+inherit cros-workon platform
+
+DESCRIPTION="G2F gnubby (U2F+GCSE) development and testing tools"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fd"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	chromeos-base/libhwsec:=
+	dev-libs/hidapi:=
+	"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/chromeos-ec-headers:=
+	chromeos-base/u2fd:=
+	"
+
+src_install() {
+	dobin "${OUT}"/g2ftool
+	dobin "${OUT}"/webauthntool
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/g2f_client_test"
+}
diff --git a/chromeos-base/gestures-conf/gestures-conf-0.0.1-r116.ebuild b/chromeos-base/gestures-conf/gestures-conf-0.0.1-r116.ebuild
deleted file mode 100644
index 19247cb..0000000
--- a/chromeos-base/gestures-conf/gestures-conf-0.0.1-r116.ebuild
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="78be8bbaf1b172fbd0cf3082cf5f9bd02b2c11ef"
-CROS_WORKON_TREE="981b96685ce1a814a6dfdfcf2033809bf4a168dc"
-CROS_WORKON_LOCALNAME="xorg-conf"
-CROS_WORKON_PROJECT="chromiumos/platform/xorg-conf"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-board cros-workon user
-
-DESCRIPTION="Board specific gestures library configuration file."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/xorg-conf/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="elan"
-
-RDEPEND="!chromeos-base/touchpad-linearity"
-DEPEND=""
-
-src_install() {
-	local board=$(get_current_board_no_variant)
-	local board_variant=$(get_current_board_with_variant)
-
-	insinto /etc/gesture
-
-	# Some boards have experimental variants, such as -cheets, -arcnext,
-	# -campfire, -kvm, -kernelnext or -arm64, which are running on the same
-	# hardware as their base boards. As opposed to board variants, which use
-	# underscore to separate from board name, they use a dash, so we can just
-	# strip anything matching.
-	board_variant=${board_variant%%-*}
-	board=${board%%-*}
-
-	# Enable exactly one evdev-compatible X input touchpad driver.
-	#
-	# Note: If possible, use the following xorg config names to allow
-	# this ebuild to install them automatically:
-	#    - 50-touchpad-cmt-$BOARD.conf
-	#    - 60-touchpad-cmt-$BOARD_VARIANT.conf
-	# e.g. daisy_skate will include the files:
-	#    - 50-touchpad-cmt-daisy.conf
-	#    - 60-touchpad-cmt-daisy_skate.conf
-	doins 40-touchpad-cmt.conf
-	if use elan; then
-		doins 50-touchpad-cmt-elan.conf
-	elif [[ "${board}" = "daisy" && "${board_variant}" = "${board}" ]]; then
-		doins 50-touchpad-cmt-daisy.conf
-		doins 50-touchpad-cmt-pit.conf # Some Lucas's use Pit Touchpad module
-	elif [ "${board_variant}" = "daisy_spring" ]; then
-		doins 50-touchpad-cmt-spring.conf
-	elif [ "${board_variant}" = "peach_pit" ]; then
-		doins 50-touchpad-cmt-pit.conf
-	elif [ "${board_variant}" = "peach_pi" ]; then
-		doins 50-touchpad-cmt-pi.conf
-	else
-		if [ -f "50-touchpad-cmt-${board}.conf" ]; then
-			doins "50-touchpad-cmt-${board}.conf"
-		fi
-		if [ -f "60-touchpad-cmt-${board_variant}.conf" ]; then
-			doins "60-touchpad-cmt-${board_variant}.conf"
-		fi
-	fi
-	doins 20-mouse.conf
-
-	insinto "/usr/share/gestures"
-	case ${board} in
-	daisy)
-		doins "files/daisy_linearity.dat" ;;
-	esac
-}
-
diff --git a/chromeos-base/gestures-conf/gestures-conf-0.0.1-r120.ebuild b/chromeos-base/gestures-conf/gestures-conf-0.0.1-r120.ebuild
new file mode 100644
index 0000000..9679a61
--- /dev/null
+++ b/chromeos-base/gestures-conf/gestures-conf-0.0.1-r120.ebuild
@@ -0,0 +1,75 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="0da777cab06228bc05f7efac8b2b15e6361f8168"
+CROS_WORKON_TREE="50f8e8dc03a93e5a4d0d65f37366345327617ff2"
+CROS_WORKON_LOCALNAME="xorg-conf"
+CROS_WORKON_PROJECT="chromiumos/platform/xorg-conf"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-board cros-workon user
+
+DESCRIPTION="Board specific gestures library configuration file."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/xorg-conf/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="elan"
+
+RDEPEND="!chromeos-base/touchpad-linearity"
+DEPEND=""
+
+src_install() {
+	local board=$(get_current_board_no_variant)
+	local board_variant=$(get_current_board_with_variant)
+
+	insinto /etc/gesture
+
+	# Some boards have experimental variants, such as -cheets, -arcnext,
+	# -campfire, -kvm, -kernelnext or -arm64, which are running on the same
+	# hardware as their base boards. As opposed to board variants, which use
+	# underscore to separate from board name, they use a dash, so we can just
+	# strip anything matching.
+	board_variant=${board_variant%%-*}
+	board=${board%%-*}
+
+	# Enable exactly one evdev-compatible X input touchpad driver.
+	#
+	# Note: If possible, use the following xorg config names to allow
+	# this ebuild to install them automatically:
+	#    - 50-touchpad-cmt-$BOARD.conf
+	#    - 60-touchpad-cmt-$BOARD_VARIANT.conf
+	# e.g. daisy_skate will include the files:
+	#    - 50-touchpad-cmt-daisy.conf
+	#    - 60-touchpad-cmt-daisy_skate.conf
+	doins 40-touchpad-cmt.conf
+	if use elan; then
+		doins 50-touchpad-cmt-elan.conf
+	elif [[ "${board}" = "daisy" && "${board_variant}" = "${board}" ]]; then
+		doins 50-touchpad-cmt-daisy.conf
+		doins 50-touchpad-cmt-pit.conf # Some Lucas's use Pit Touchpad module
+	elif [ "${board_variant}" = "daisy_spring" ]; then
+		doins 50-touchpad-cmt-spring.conf
+	elif [ "${board_variant}" = "peach_pit" ]; then
+		doins 50-touchpad-cmt-pit.conf
+	elif [ "${board_variant}" = "peach_pi" ]; then
+		doins 50-touchpad-cmt-pi.conf
+	else
+		if [ -f "50-touchpad-cmt-${board}.conf" ]; then
+			doins "50-touchpad-cmt-${board}.conf"
+		fi
+		if [ -f "60-touchpad-cmt-${board_variant}.conf" ]; then
+			doins "60-touchpad-cmt-${board_variant}.conf"
+		fi
+	fi
+	doins 20-mouse.conf
+
+	insinto "/usr/share/gestures"
+	case ${board} in
+	daisy)
+		doins "files/daisy_linearity.dat" ;;
+	esac
+}
+
diff --git a/chromeos-base/gestures/gestures-0.0.1-r593.ebuild b/chromeos-base/gestures/gestures-0.0.1-r593.ebuild
deleted file mode 100644
index a66f66e..0000000
--- a/chromeos-base/gestures/gestures-0.0.1-r593.ebuild
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="39649ae0f9e224d28242f25909c509662038f875"
-CROS_WORKON_TREE="2592515cac08f4661dc5bf1a0908d27e69c59b90"
-CROS_WORKON_PROJECT="chromiumos/platform/gestures"
-CROS_WORKON_LOCALNAME="platform/gestures"
-CROS_WORKON_USE_VCSID=1
-
-inherit toolchain-funcs cros-debug cros-sanitizers cros-workon
-
-DESCRIPTION="Gesture recognizer library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/gestures/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-asan +X"
-
-RDEPEND="chromeos-base/gestures-conf:=
-	chromeos-base/libevdev:=
-	dev-libs/jsoncpp:=
-	virtual/udev"
-DEPEND="dev-cpp/gtest:=
-	X? ( x11-libs/libXi:= )
-	${RDEPEND}"
-
-# The last dir must be named "gestures" for include path reasons.
-S="${WORKDIR}/gestures"
-
-src_configure() {
-	cros_optimize_package_for_speed
-	sanitizers-setup-env
-	export USE_X11=$(usex X 1 0)
-	tc-export CXX PKG_CONFIG
-	cros-debug-add-NDEBUG
-	default
-}
-
-src_compile() {
-	emake clean  # TODO(adlr): remove when a better solution exists
-	emake
-}
-
-src_test() {
-	emake test
-
-	if ! use x86 && ! use amd64 ; then
-		einfo "Skipping tests on non-x86 platform..."
-	else
-		# This is an ugly hack that happens to work, but should not be copied.
-		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
-		./test || die
-	fi
-}
-
-src_install() {
-	emake DESTDIR="${D}" LIBDIR="/usr/$(get_libdir)" install
-}
diff --git a/chromeos-base/gestures/gestures-0.0.1-r599.ebuild b/chromeos-base/gestures/gestures-0.0.1-r599.ebuild
new file mode 100644
index 0000000..45ce3f5
--- /dev/null
+++ b/chromeos-base/gestures/gestures-0.0.1-r599.ebuild
@@ -0,0 +1,60 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5b66535d7415365d7be616af9c5514a6a9cba253"
+CROS_WORKON_TREE="2ce7b4a63b39ac2076197506ea56603b4897af33"
+CROS_WORKON_PROJECT="chromiumos/platform/gestures"
+CROS_WORKON_LOCALNAME="platform/gestures"
+CROS_WORKON_USE_VCSID=1
+
+inherit toolchain-funcs cros-debug cros-sanitizers cros-workon
+
+DESCRIPTION="Gesture recognizer library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/gestures/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-asan +X"
+
+RDEPEND="chromeos-base/gestures-conf:=
+	chromeos-base/libevdev:=
+	dev-libs/jsoncpp:=
+	virtual/udev"
+DEPEND="dev-cpp/gtest:=
+	X? ( x11-libs/libXi:= )
+	${RDEPEND}"
+
+# The last dir must be named "gestures" for include path reasons.
+S="${WORKDIR}/gestures"
+
+src_configure() {
+	cros_optimize_package_for_speed
+	sanitizers-setup-env
+	export USE_X11=$(usex X 1 0)
+	tc-export CXX PKG_CONFIG
+	cros-debug-add-NDEBUG
+	default
+}
+
+src_compile() {
+	emake clean  # TODO(adlr): remove when a better solution exists
+	emake
+}
+
+src_test() {
+	emake test
+
+	if ! use x86 && ! use amd64 ; then
+		einfo "Skipping tests on non-x86 platform..."
+	else
+		# This is an ugly hack that happens to work, but should not be copied.
+		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
+		./test || die
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${D}" LIBDIR="/usr/$(get_libdir)" install
+}
diff --git a/chromeos-base/glbench/glbench-0.0.1-r12.ebuild b/chromeos-base/glbench/glbench-0.0.1-r12.ebuild
deleted file mode 100644
index de84b0b..0000000
--- a/chromeos-base/glbench/glbench-0.0.1-r12.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Chromium OS Authros. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="39629e191d0b45cc55418dc540623ae85aa77801"
-CROS_WORKON_TREE="7cdaa03d308c5a215d7e2006727a1910e63f93c2"
-CROS_WORKON_PROJECT="chromiumos/platform/glbench"
-
-inherit cros-workon
-
-DESCRIPTION="Microbenchmark for opengl/gles"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/glbench/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="opengl opengles"
-
-COMMON_DEPEND="
-	>=dev-cpp/gflags-2.0:=
-	media-libs/libpng:=
-	virtual/opengles:=
-	media-libs/waffle:="
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	x11-drivers/opengles-headers:="
-
-src_compile() {
-	emake -C src
-}
-
-src_install() {
-	local glbench_dir="/usr/local/${PN}"
-
-	# Install the executable.
-	exeinto "${glbench_dir}/bin"
-	doexe glbench windowmanagertest
-
-	# Install the list files.
-	insinto "${glbench_dir}/files"
-	doins glbench_fixedbad_images.txt
-	doins glbench_knownbad_images.txt
-	doins glbench_reference_images.txt
-}
diff --git a/chromeos-base/glbench/glbench-0.0.1-r13.ebuild b/chromeos-base/glbench/glbench-0.0.1-r13.ebuild
new file mode 100644
index 0000000..72f105b
--- /dev/null
+++ b/chromeos-base/glbench/glbench-0.0.1-r13.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2019 The Chromium OS Authros. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="b0623870610c17080f57cafe134443f57a5b8710"
+CROS_WORKON_TREE="8b416bec3755bfd7cd686208ed5ce0f032d9b14a"
+CROS_WORKON_PROJECT="chromiumos/platform/glbench"
+
+inherit cros-workon
+
+DESCRIPTION="Microbenchmark for opengl/gles"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/glbench/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="opengl opengles"
+
+COMMON_DEPEND="
+	>=dev-cpp/gflags-2.0:=
+	media-libs/libpng:=
+	virtual/opengles:=
+	media-libs/waffle:="
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	x11-drivers/opengles-headers:="
+
+src_compile() {
+	emake -C src
+}
+
+src_install() {
+	local glbench_dir="/usr/local/${PN}"
+
+	# Install the executable.
+	exeinto "${glbench_dir}/bin"
+	doexe glbench windowmanagertest
+
+	# Install the list files.
+	insinto "${glbench_dir}/files"
+	doins glbench_fixedbad_images.txt
+	doins glbench_knownbad_images.txt
+	doins glbench_reference_images.txt
+}
diff --git a/chromeos-base/glib-bridge/glib-bridge-0.0.1-r127.ebuild b/chromeos-base/glib-bridge/glib-bridge-0.0.1-r127.ebuild
deleted file mode 100644
index 6710187..0000000
--- a/chromeos-base/glib-bridge/glib-bridge-0.0.1-r127.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="32dfd4820ca2c13b6b1981877f01ac4fbac6b6ec"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7bd82a4c12dc3c1ec98642d14b50d3aba38d745e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk glib-bridge .gn"
-
-PLATFORM_SUBDIR="glib-bridge"
-
-inherit cros-workon platform
-
-DESCRIPTION="libchrome-glib message loop bridge"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/glib-bridge"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	dev-libs/glib:="
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dolib.a "${OUT}"/libglib_bridge.a
-
-	# Install headers.
-	insinto /usr/include/glib_bridge
-	doins *.h
-}
-
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/glib_bridge_test_runner"
-}
diff --git a/chromeos-base/glib-bridge/glib-bridge-0.0.1-r150.ebuild b/chromeos-base/glib-bridge/glib-bridge-0.0.1-r150.ebuild
new file mode 100644
index 0000000..a50e00e
--- /dev/null
+++ b/chromeos-base/glib-bridge/glib-bridge-0.0.1-r150.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "6f06912340fa4cedbee74d5e9114ceb124be5071" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk glib-bridge .gn"
+
+PLATFORM_SUBDIR="glib-bridge"
+
+inherit cros-workon platform
+
+DESCRIPTION="libchrome-glib message loop bridge"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/glib-bridge"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	dev-libs/glib:="
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dolib.a "${OUT}"/libglib_bridge.a
+
+	# Install headers.
+	insinto /usr/include/glib_bridge
+	doins *.h
+}
+
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/glib_bridge_test_runner"
+}
diff --git a/chromeos-base/goldfishd/goldfishd-0.0.1-r437.ebuild b/chromeos-base/goldfishd/goldfishd-0.0.1-r437.ebuild
deleted file mode 100644
index 378b4c9..0000000
--- a/chromeos-base/goldfishd/goldfishd-0.0.1-r437.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "b96275b377d51264ddbf1c56d9dc8d9be35259f8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk goldfishd .gn"
-
-PLATFORM_SUBDIR="goldfishd"
-
-inherit cros-workon platform
-
-DESCRIPTION="Android Emulator Daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/goldfishd/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/autotest-client
-	"
-
-src_install() {
-	dobin "${OUT}"/goldfishd
-
-	insinto /etc/init
-	doins init/*.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/goldfishd_test_runner"
-}
diff --git a/chromeos-base/goldfishd/goldfishd-0.0.1-r458.ebuild b/chromeos-base/goldfishd/goldfishd-0.0.1-r458.ebuild
new file mode 100644
index 0000000..ea810ad
--- /dev/null
+++ b/chromeos-base/goldfishd/goldfishd-0.0.1-r458.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "f72b5a85f1d9d8b53d2fc498018abb1eb59188b7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk goldfishd .gn"
+
+PLATFORM_SUBDIR="goldfishd"
+
+inherit cros-workon platform
+
+DESCRIPTION="Android Emulator Daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/goldfishd/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/autotest-client
+	"
+
+src_install() {
+	dobin "${OUT}"/goldfishd
+
+	insinto /etc/init
+	doins init/*.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/goldfishd_test_runner"
+}
diff --git a/chromeos-base/google-breakpad/google-breakpad-2020.06.05.013145-r187.ebuild b/chromeos-base/google-breakpad/google-breakpad-2020.06.05.013145-r187.ebuild
deleted file mode 100644
index f86920c..0000000
--- a/chromeos-base/google-breakpad/google-breakpad-2020.06.05.013145-r187.ebuild
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("2757a2c9c819fcae3784576aef0c8400c7ad06d7" "8048ece6c16c91acfe0d36d1d3cc0890ab6e945c")
-CROS_WORKON_TREE=("db3eb4400e3481586bfabec9075d3aebbfee8d1b" "84dd0fabdc4d0729885dc7ce3ac35903504ba5e6")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/google-breakpad"
-	"linux-syscall-support"
-)
-CROS_WORKON_LOCALNAME=(
-	"third_party/breakpad"
-	"third_party/breakpad/src/third_party/lss"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/src/third_party/lss"
-)
-
-inherit cros-i686 cros-workon flag-o-matic multiprocessing
-
-DESCRIPTION="Google crash reporting"
-HOMEPAGE="https://chromium.googlesource.com/breakpad/breakpad"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-alltests cros_host test"
-
-COMMON_DEPEND="net-misc/curl:="
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	test? (
-		dev-cpp/gtest:=
-	)
-"
-
-src_prepare() {
-	default
-	find "${S}" -type f -exec touch -r "${S}"/configure {} +
-}
-
-src_configure() {
-	append-flags -g
-
-	# Disable flaky tests by default.  Do it here because the CPPFLAGS
-	# are recorded at configure time and not read on the fly.
-	# http://crbug.com/359999
-	use alltests && append-cppflags -DENABLE_FLAKY_TESTS
-
-	multijob_init
-
-	mkdir build
-	pushd build >/dev/null || die
-	ECONF_SOURCE=${S} multijob_child_init econf --enable-system-test-libs
-	popd >/dev/null || die
-
-	if use cros_host || use_i686; then
-		# The mindump code is still wordsize specific.  Needs to be redone
-		# like https://code.google.com/p/google-breakpad/source/detail?r=987.
-		einfo "Configuring 32-bit build"
-		mkdir work32
-		pushd work32 >/dev/null
-		use cros_host && append-flags "-m32"
-		use_i686 && push_i686_env
-		# Can be dropped once this is merged upstream:
-		# https://breakpad.appspot.com/619002/
-		append-lfs-flags # crbug.com/266064
-		ECONF_SOURCE=${S} multijob_child_init econf
-		filter-lfs-flags
-		use_i686 && pop_i686_env
-		use cros_host && filter-flags "-m32"
-		popd >/dev/null
-	fi
-
-	multijob_finish
-}
-
-src_compile() {
-	emake -C build
-
-	if use cros_host; then
-		einfo "Building 32-bit tools"
-		emake -C work32 \
-			src/tools/linux/md2core/minidump-2-core
-	fi
-
-	if use_i686; then
-		einfo "Building 32-bit library"
-		push_i686_env
-		emake -C work32 src/client/linux/libbreakpad_client.a
-		pop_i686_env
-	fi
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		einfo Skipping unit tests on non-x86 platform
-		return
-	fi
-	emake -C build check
-}
-
-src_install() {
-	pushd build >/dev/null
-	emake DESTDIR="${D}" install
-	dobin src/tools/linux/core2md/core2md \
-	      src/tools/linux/md2core/minidump-2-core \
-	      src/tools/linux/dump_syms/dump_syms \
-	      src/tools/linux/symupload/sym_upload \
-	      src/tools/linux/symupload/minidump_upload
-	popd >/dev/null
-
-	insinto /usr/include/google-breakpad/client/linux/handler
-	doins src/client/linux/handler/*.h
-	insinto /usr/include/google-breakpad/client/linux/crash_generation
-	doins src/client/linux/crash_generation/*.h
-	insinto /usr/include/google-breakpad/common/linux
-	doins src/common/linux/*.h
-	insinto /usr/include/google-breakpad/processor
-	doins src/processor/*.h
-
-	if use cros_host; then
-		newbin work32/src/tools/linux/md2core/minidump-2-core \
-		       minidump-2-core.32
-	fi
-
-	if use_i686; then
-		push_i686_env
-		dolib.a work32/src/client/linux/libbreakpad_client.a
-		pop_i686_env
-	fi
-}
diff --git a/chromeos-base/google-breakpad/google-breakpad-2020.08.05.194238-r190.ebuild b/chromeos-base/google-breakpad/google-breakpad-2020.08.05.194238-r190.ebuild
new file mode 100644
index 0000000..0a2acb9
--- /dev/null
+++ b/chromeos-base/google-breakpad/google-breakpad-2020.08.05.194238-r190.ebuild
@@ -0,0 +1,163 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("3d8daa2c7458c8e411e691ac6f0d503418ef6231" "fd00dbbd0c06a309c657d89e9430143b179ff6db")
+CROS_WORKON_TREE=("527c1cc9cec5920ce709102e4be226381df00c1c" "5df994fdcdfab0b9b21d11fa25545442eae001e5")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/google-breakpad"
+	"linux-syscall-support"
+)
+CROS_WORKON_LOCALNAME=(
+	"third_party/breakpad"
+	"third_party/breakpad/src/third_party/lss"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/src/third_party/lss"
+)
+
+inherit cros-arm64 cros-i686 cros-workon flag-o-matic multiprocessing
+
+DESCRIPTION="Google crash reporting"
+HOMEPAGE="https://chromium.googlesource.com/breakpad/breakpad"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-alltests cros_host test"
+
+COMMON_DEPEND="net-misc/curl:="
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	test? (
+		dev-cpp/gtest:=
+	)
+"
+
+src_prepare() {
+	default
+	find "${S}" -type f -exec touch -r "${S}"/configure {} +
+}
+
+src_configure() {
+	append-flags -g
+
+	# Disable flaky tests by default.  Do it here because the CPPFLAGS
+	# are recorded at configure time and not read on the fly.
+	# http://crbug.com/359999
+	use alltests && append-cppflags -DENABLE_FLAKY_TESTS
+
+	multijob_init
+
+	mkdir build
+	pushd build >/dev/null || die
+	ECONF_SOURCE=${S} multijob_child_init econf --enable-system-test-libs
+	popd >/dev/null || die
+
+	if use cros_host || use_i686; then
+		# The mindump code is still wordsize specific.  Needs to be redone
+		# like https://chromium.googlesource.com/breakpad/breakpad/+/4116671cbff9e99fbd834a1b2cdd174226b78c7c
+		einfo "Configuring 32-bit build"
+		mkdir work32
+		pushd work32 >/dev/null
+		use cros_host && append-flags "-m32"
+		use_i686 && push_i686_env
+		# Can be dropped once this is merged upstream:
+		# https://breakpad.appspot.com/619002/
+		append-lfs-flags # crbug.com/266064
+		ECONF_SOURCE=${S} multijob_child_init econf
+		filter-lfs-flags
+		use_i686 && pop_i686_env
+		use cros_host && filter-flags "-m32"
+		popd >/dev/null
+	fi
+
+	if use_arm64; then
+		# The mindump code is still wordsize specific.  Needs to be redone
+		# like https://chromium.googlesource.com/breakpad/breakpad/+/4116671cbff9e99fbd834a1b2cdd174226b78c7c
+		einfo "Configuring 64-bit build"
+		mkdir work64
+		pushd work64 >/dev/null
+		use_arm64 && push_arm64_env
+		# Can be dropped once this is merged upstream:
+		# https://breakpad.appspot.com/619002/
+		append-lfs-flags # crbug.com/266064
+		ECONF_SOURCE=${S} multijob_child_init econf
+		filter-lfs-flags
+		use_arm64 && pop_arm64_env
+		popd >/dev/null
+	fi
+
+	multijob_finish
+}
+
+src_compile() {
+	emake -C build
+
+	if use cros_host; then
+		einfo "Building 32-bit tools"
+		emake -C work32 \
+			src/tools/linux/md2core/minidump-2-core
+	fi
+
+	if use_i686; then
+		einfo "Building 32-bit library"
+		push_i686_env
+		emake -C work32 src/client/linux/libbreakpad_client.a
+		pop_i686_env
+	fi
+
+	if use_arm64; then
+		einfo "Building 64-bit library"
+		push_arm64_env
+		emake -C work64 src/client/linux/libbreakpad_client.a
+		pop_arm64_env
+	fi
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		einfo Skipping unit tests on non-x86 platform
+		return
+	fi
+	emake -C build check
+}
+
+src_install() {
+	pushd build >/dev/null
+	emake DESTDIR="${D}" install
+	dobin src/tools/linux/core2md/core2md \
+	      src/tools/linux/md2core/minidump-2-core \
+	      src/tools/linux/dump_syms/dump_syms \
+	      src/tools/linux/symupload/sym_upload \
+	      src/tools/linux/symupload/minidump_upload
+	popd >/dev/null
+
+	insinto /usr/include/google-breakpad/client/linux/handler
+	doins src/client/linux/handler/*.h
+	insinto /usr/include/google-breakpad/client/linux/crash_generation
+	doins src/client/linux/crash_generation/*.h
+	insinto /usr/include/google-breakpad/common/linux
+	doins src/common/linux/*.h
+	insinto /usr/include/google-breakpad/processor
+	doins src/processor/*.h
+
+	if use cros_host; then
+		newbin work32/src/tools/linux/md2core/minidump-2-core \
+		       minidump-2-core.32
+	fi
+
+	if use_i686; then
+		push_i686_env
+		dolib.a work32/src/client/linux/libbreakpad_client.a
+		pop_i686_env
+	fi
+
+	if use_arm64; then
+		push_arm64_env
+		dolib.a work64/src/client/linux/libbreakpad_client.a
+		pop_arm64_env
+	fi
+}
diff --git a/chromeos-base/google-breakpad/google-breakpad-9999.ebuild b/chromeos-base/google-breakpad/google-breakpad-9999.ebuild
index 56e504e..6094d75 100644
--- a/chromeos-base/google-breakpad/google-breakpad-9999.ebuild
+++ b/chromeos-base/google-breakpad/google-breakpad-9999.ebuild
@@ -16,7 +16,7 @@
 	"${S}/src/third_party/lss"
 )
 
-inherit cros-i686 cros-workon flag-o-matic multiprocessing
+inherit cros-arm64 cros-i686 cros-workon flag-o-matic multiprocessing
 
 DESCRIPTION="Google crash reporting"
 HOMEPAGE="https://chromium.googlesource.com/breakpad/breakpad"
@@ -56,7 +56,7 @@
 
 	if use cros_host || use_i686; then
 		# The mindump code is still wordsize specific.  Needs to be redone
-		# like https://code.google.com/p/google-breakpad/source/detail?r=987.
+		# like https://chromium.googlesource.com/breakpad/breakpad/+/4116671cbff9e99fbd834a1b2cdd174226b78c7c
 		einfo "Configuring 32-bit build"
 		mkdir work32
 		pushd work32 >/dev/null
@@ -72,6 +72,22 @@
 		popd >/dev/null
 	fi
 
+	if use_arm64; then
+		# The mindump code is still wordsize specific.  Needs to be redone
+		# like https://chromium.googlesource.com/breakpad/breakpad/+/4116671cbff9e99fbd834a1b2cdd174226b78c7c
+		einfo "Configuring 64-bit build"
+		mkdir work64
+		pushd work64 >/dev/null
+		use_arm64 && push_arm64_env
+		# Can be dropped once this is merged upstream:
+		# https://breakpad.appspot.com/619002/
+		append-lfs-flags # crbug.com/266064
+		ECONF_SOURCE=${S} multijob_child_init econf
+		filter-lfs-flags
+		use_arm64 && pop_arm64_env
+		popd >/dev/null
+	fi
+
 	multijob_finish
 }
 
@@ -90,6 +106,13 @@
 		emake -C work32 src/client/linux/libbreakpad_client.a
 		pop_i686_env
 	fi
+
+	if use_arm64; then
+		einfo "Building 64-bit library"
+		push_arm64_env
+		emake -C work64 src/client/linux/libbreakpad_client.a
+		pop_arm64_env
+	fi
 }
 
 src_test() {
@@ -129,4 +152,10 @@
 		dolib.a work32/src/client/linux/libbreakpad_client.a
 		pop_i686_env
 	fi
+
+	if use_arm64; then
+		push_arm64_env
+		dolib.a work64/src/client/linux/libbreakpad_client.a
+		pop_arm64_env
+	fi
 }
diff --git a/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r44.ebuild b/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r44.ebuild
deleted file mode 100644
index 11c2e43..0000000
--- a/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r44.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="360e96bf0f6ee6b64186756301f03219aaf233d7"
-CROS_WORKON_TREE="1ea688fe3b42384995bab6253d2d194f2fc9de57"
-CROS_WORKON_PROJECT="chromiumos/platform/graphics"
-CROS_WORKON_LOCALNAME="platform/graphics"
-
-INSTALL_DIR="/usr/local/graphics"
-
-CROS_GO_BINARIES=(
-	# Add more apps here.
-	"sanity/cmd/pass:${INSTALL_DIR}/pass"
-	"trace_profiling/cmd/analyze:${INSTALL_DIR}/analyze"
-	"trace_profiling/cmd/gen_db_result:${INSTALL_DIR}/gen_db_result"
-	"trace_profiling/cmd/harvest:${INSTALL_DIR}/harvest"
-	"trace_profiling/cmd/merge:${INSTALL_DIR}/merge"
-	"trace_profiling/cmd/profile:${INSTALL_DIR}/profile"
-	"trace_replay/cmd/trace_replay:${INSTALL_DIR}/trace_replay"
-)
-
-CROS_GO_TEST=(
-	"sanity/cmd/pass"
-	"trace_profiling/cmd/analyze"
-	"trace_profiling/cmd/gen_db_result"
-	"trace_profiling/cmd/merge"
-	"trace_profiling/cmd/profile"
-	"trace_replay/cmd/trace_replay"
-)
-
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-go cros-workon
-SRC_URI="$(cros-go_src_uri)"
-
-DESCRIPTION="Portable graphics utils written in go"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/graphics/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	chromeos-base/cros-config-api
-	dev-go/crypto
-	dev-go/fogleman-gg
-	dev-go/go-image
-	dev-go/gofpdf
-	dev-go/golang-freetype
-	dev-go/gonum-plot
-	dev-go/protobuf
-	dev-go/readline
-	dev-go/svgo
-"
-
-RDEPEND="${DEPEND}"
-
-src_prepare() {
-	# Disable cgo and PIE on building Tast binaries. See:
-	# https://crbug.com/976196
-	# https://github.com/golang/go/issues/30986#issuecomment-475626018
-	export CGO_ENABLED=0
-	export GOPIE=0
-
-	default
-}
diff --git a/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r74.ebuild b/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r74.ebuild
new file mode 100644
index 0000000..e5543f76
--- /dev/null
+++ b/chromeos-base/graphics-utils-go/graphics-utils-go-0.0.1-r74.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="4e25b15fb95f4d6888a23f423cb504e3fd5b5d77"
+CROS_WORKON_TREE="dcf1575472604deef1400a83c673465422cf5cfe"
+CROS_WORKON_PROJECT="chromiumos/platform/graphics"
+CROS_WORKON_LOCALNAME="platform/graphics"
+
+INSTALL_DIR="/usr/local/graphics"
+
+CROS_GO_BINARIES=(
+	# Add more apps here.
+	"sanity/cmd/pass:${INSTALL_DIR}/pass"
+	"trace_profiling/cmd/analyze:${INSTALL_DIR}/analyze"
+	"trace_profiling/cmd/gen_db_result:${INSTALL_DIR}/get_device_info"
+	"trace_profiling/cmd/harvest:${INSTALL_DIR}/harvest"
+	"trace_profiling/cmd/merge:${INSTALL_DIR}/merge"
+	"trace_profiling/cmd/profile:${INSTALL_DIR}/profile"
+	"trace_replay/cmd/trace_replay:${INSTALL_DIR}/trace_replay"
+)
+
+CROS_GO_TEST=(
+	"sanity/cmd/pass"
+	"trace_profiling/cmd/analyze"
+	"trace_profiling/cmd/gen_db_result"
+	"trace_profiling/cmd/merge"
+	"trace_profiling/cmd/profile"
+	"trace_replay/cmd/trace_replay"
+)
+
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-go cros-workon
+SRC_URI="$(cros-go_src_uri)"
+
+DESCRIPTION="Portable graphics utils written in go"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/graphics/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	chromeos-base/cros-config-api
+	dev-go/crypto
+	dev-go/fogleman-gg
+	dev-go/go-image
+	dev-go/gofpdf
+	dev-go/golang-freetype
+	dev-go/gonum-plot
+	dev-go/protobuf
+	dev-go/readline
+	dev-go/svgo
+"
+
+RDEPEND="${DEPEND}"
+
+src_prepare() {
+	# Disable cgo and PIE on building Tast binaries. See:
+	# https://crbug.com/976196
+	# https://github.com/golang/go/issues/30986#issuecomment-475626018
+	export CGO_ENABLED=0
+	export GOPIE=0
+
+	default
+}
diff --git a/chromeos-base/graphics-utils-go/graphics-utils-go-9999.ebuild b/chromeos-base/graphics-utils-go/graphics-utils-go-9999.ebuild
index 497deae..769a2ed 100644
--- a/chromeos-base/graphics-utils-go/graphics-utils-go-9999.ebuild
+++ b/chromeos-base/graphics-utils-go/graphics-utils-go-9999.ebuild
@@ -11,7 +11,7 @@
 	# Add more apps here.
 	"sanity/cmd/pass:${INSTALL_DIR}/pass"
 	"trace_profiling/cmd/analyze:${INSTALL_DIR}/analyze"
-	"trace_profiling/cmd/gen_db_result:${INSTALL_DIR}/gen_db_result"
+	"trace_profiling/cmd/gen_db_result:${INSTALL_DIR}/get_device_info"
 	"trace_profiling/cmd/harvest:${INSTALL_DIR}/harvest"
 	"trace_profiling/cmd/merge:${INSTALL_DIR}/merge"
 	"trace_profiling/cmd/profile:${INSTALL_DIR}/profile"
diff --git a/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r2.ebuild b/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r2.ebuild
deleted file mode 100644
index b80f5a1..0000000
--- a/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r2.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="3892f09ec2f54d637da5d4fce0287ff8b0dc76c1"
-CROS_WORKON_TREE="a13ff18c48f84bb65b504c1dad2d61ab2d379f97"
-CROS_WORKON_PROJECT="chromiumos/platform/graphics"
-CROS_WORKON_LOCALNAME="platform/graphics"
-CROS_WORKON_SUBTREE="src/results_database"
-
-PYTHON_COMPAT=( python3_{6,7,8} )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Graphics utilities written in python"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/graphics/"
-
-LICENSE="BSD-Google"
-SLOT=0
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="chromeos-base/cros-config-api"
-
-DEPEND="
-	${RDEPEND}
-"
-
-BDEPEND="
-	dev-python/setuptools[${PYTHON_USEDEP}]
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/src/results_database"
-}
-
-src_install() {
-	dobin bq_insert_pb.py
-	dobin generate_trace_info.py
-	dobin record_machine_info.py
-	dobin record_package_override.py
-	dobin record_software_config.py
-	dobin summarize_apitrace_log.py
-
-	distutils-r1_src_install
-}
diff --git a/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r3.ebuild b/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r3.ebuild
new file mode 100644
index 0000000..f9d315f
--- /dev/null
+++ b/chromeos-base/graphics-utils-python/graphics-utils-python-0.0.1-r3.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="4e25b15fb95f4d6888a23f423cb504e3fd5b5d77"
+CROS_WORKON_TREE="d8aebe361996f4749ab69c066f501760993babef"
+CROS_WORKON_PROJECT="chromiumos/platform/graphics"
+CROS_WORKON_LOCALNAME="platform/graphics"
+CROS_WORKON_SUBTREE="src/results_database"
+
+PYTHON_COMPAT=( python3_{6,7,8} )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Graphics utilities written in python"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/graphics/"
+
+LICENSE="BSD-Google"
+SLOT=0
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="chromeos-base/cros-config-api"
+
+DEPEND="
+	${RDEPEND}
+"
+
+BDEPEND="
+	dev-python/setuptools[${PYTHON_USEDEP}]
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/src/results_database"
+}
+
+src_install() {
+	dobin bq_insert_pb.py
+	dobin generate_trace_info.py
+	dobin record_machine_info.py
+	dobin record_package_override.py
+	dobin record_software_config.py
+	dobin summarize_apitrace_log.py
+
+	distutils-r1_src_install
+}
diff --git a/chromeos-base/graphyte/graphyte-0.0.1-r37.ebuild b/chromeos-base/graphyte/graphyte-0.0.1-r37.ebuild
deleted file mode 100644
index 91cc75e..0000000
--- a/chromeos-base/graphyte/graphyte-0.0.1-r37.ebuild
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="dbaec98fc97ebbbf2aa3ac81ee3f4502a55a4038"
-CROS_WORKON_TREE="068a93a9d64357042300153808eb9309ee5fee5c"
-CROS_WORKON_PROJECT="chromiumos/graphyte"
-CROS_WORKON_LOCALNAME="platform/graphyte"
-PYTHON_COMPAT=( python2_7 python3_{6,7} )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Graphyte RF testing framework"
-HOMEPAGE="https://sites.google.com/a/google.com/graphyte/home"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND=""
-BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
diff --git a/chromeos-base/graphyte/graphyte-0.0.1-r39.ebuild b/chromeos-base/graphyte/graphyte-0.0.1-r39.ebuild
new file mode 100644
index 0000000..1340374
--- /dev/null
+++ b/chromeos-base/graphyte/graphyte-0.0.1-r39.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="f661990d0379f1030bdaa93c573ef4a50e9c6e66"
+CROS_WORKON_TREE="f05776e43faaedc4b58f8b38e20bdf050a59b264"
+CROS_WORKON_PROJECT="chromiumos/graphyte"
+CROS_WORKON_LOCALNAME="platform/graphyte"
+PYTHON_COMPAT=( python3_{6,7} )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Graphyte RF testing framework"
+HOMEPAGE="https://sites.google.com/a/google.com/graphyte/home"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND=""
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
diff --git a/chromeos-base/graphyte/graphyte-9999.ebuild b/chromeos-base/graphyte/graphyte-9999.ebuild
index bc6d1d0..cbe925b 100644
--- a/chromeos-base/graphyte/graphyte-9999.ebuild
+++ b/chromeos-base/graphyte/graphyte-9999.ebuild
@@ -4,7 +4,7 @@
 EAPI=7
 CROS_WORKON_PROJECT="chromiumos/graphyte"
 CROS_WORKON_LOCALNAME="platform/graphyte"
-PYTHON_COMPAT=( python2_7 python3_{6,7} )
+PYTHON_COMPAT=( python3_{6,7} )
 
 inherit cros-workon distutils-r1
 
diff --git a/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r483.ebuild b/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r483.ebuild
deleted file mode 100644
index 9e359ea..0000000
--- a/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r483.ebuild
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c6ce5ccf9c6310c03d4a4f957102b3a7629957d4"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f2bf6ae043b20c7e134a520985328b7bd10e6481" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk hammerd .gn"
-
-PLATFORM_SUBDIR="hammerd"
-
-PYTHON_COMPAT=( python3_{6..8} )
-
-inherit cros-workon platform distutils-r1
-
-DESCRIPTION="Python wrapper of hammerd API and some python utility scripts."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+hammerd_api"
-
-BDEPEND="
-	dev-python/setuptools[${PYTHON_USEDEP}]
-"
-RDEPEND="
-	chromeos-base/hammerd:=
-"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	platform_src_configure
-	distutils-r1_src_configure
-}
-
-src_compile() {
-	platform_src_compile
-	distutils-r1_src_compile
-}
-
-src_install() {
-	# Install exposed API.
-	dolib.so "${OUT}"/lib/libhammerd-api.so
-	insinto /usr/include/hammerd/
-	doins hammerd_api.h
-	distutils-r1_src_install
-
-	# Install hammer base tests on dut
-	dodir /usr/local/bin/hammertests
-	cp -R "${S}/hammertests" "${D}/usr/local/bin"
-}
diff --git a/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r507.ebuild b/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r507.ebuild
new file mode 100644
index 0000000..3366d8e
--- /dev/null
+++ b/chromeos-base/hammerd-test-utils/hammerd-test-utils-0.0.1-r507.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e53f86b0b2b55f741fd7d3d24b703fd84b17330e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk hammerd .gn"
+
+PLATFORM_SUBDIR="hammerd"
+
+PYTHON_COMPAT=( python3_{6..8} )
+
+inherit cros-workon platform distutils-r1
+
+DESCRIPTION="Python wrapper of hammerd API and some python utility scripts."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+hammerd_api"
+
+BDEPEND="
+	dev-python/setuptools[${PYTHON_USEDEP}]
+"
+RDEPEND="
+	chromeos-base/hammerd:=
+"
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	platform_src_configure
+	distutils-r1_src_configure
+}
+
+src_compile() {
+	platform_src_compile
+	distutils-r1_src_compile
+}
+
+src_install() {
+	# Install exposed API.
+	dolib.so "${OUT}"/lib/libhammerd-api.so
+	insinto /usr/include/hammerd/
+	doins hammerd_api.h
+	distutils-r1_src_install
+
+	# Install hammer base tests on dut
+	dodir /usr/local/bin/hammertests
+	cp -R "${S}/hammertests" "${D}/usr/local/bin"
+}
diff --git a/chromeos-base/hammerd/hammerd-0.0.1-r944.ebuild b/chromeos-base/hammerd/hammerd-0.0.1-r944.ebuild
deleted file mode 100644
index 11ae7c8..0000000
--- a/chromeos-base/hammerd/hammerd-0.0.1-r944.ebuild
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c6ce5ccf9c6310c03d4a4f957102b3a7629957d4"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f2bf6ae043b20c7e134a520985328b7bd10e6481" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk hammerd .gn"
-
-PLATFORM_SUBDIR="hammerd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="A daemon to update EC firmware of hammer, the base of the detachable."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-hammerd_api fuzzer"
-
-RDEPEND="
-	chromeos-base/ec-utils:=
-	chromeos-base/metrics:=
-	chromeos-base/vboot_reference:=
-	dev-libs/openssl:0=
-	sys-apps/flashmap:=
-"
-DEPEND="
-	${RDEPEND}
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-pkg_preinst() {
-	# Create user and group for hammerd
-	enewuser "hammerd"
-	enewgroup "hammerd"
-}
-
-src_install() {
-	dobin "${OUT}/hammerd"
-
-	# Install upstart configs and scripts.
-	insinto /etc/init
-	doins init/*.conf
-	exeinto /usr/share/cros/init
-	doexe init/*.sh
-
-	# Install DBus config.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.hammerd.conf
-
-	# Install rsyslog config.
-	insinto /etc/rsyslog.d
-	doins rsyslog/rsyslog.hammerd.conf
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hammerd_load_ec_image_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hammerd_update_fw_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/unittest_runner"
-}
diff --git a/chromeos-base/hammerd/hammerd-0.0.1-r969.ebuild b/chromeos-base/hammerd/hammerd-0.0.1-r969.ebuild
new file mode 100644
index 0000000..c4cc7f7
--- /dev/null
+++ b/chromeos-base/hammerd/hammerd-0.0.1-r969.ebuild
@@ -0,0 +1,66 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e53f86b0b2b55f741fd7d3d24b703fd84b17330e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk hammerd .gn"
+
+PLATFORM_SUBDIR="hammerd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="A daemon to update EC firmware of hammer, the base of the detachable."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-hammerd_api fuzzer"
+
+RDEPEND="
+	chromeos-base/ec-utils:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/vboot_reference:=
+	dev-libs/openssl:0=
+	sys-apps/flashmap:=
+"
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+pkg_preinst() {
+	# Create user and group for hammerd
+	enewuser "hammerd"
+	enewgroup "hammerd"
+}
+
+src_install() {
+	dobin "${OUT}/hammerd"
+
+	# Install upstart configs and scripts.
+	insinto /etc/init
+	doins init/*.conf
+	exeinto /usr/share/cros/init
+	doexe init/*.sh
+
+	# Install DBus config.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.hammerd.conf
+
+	# Install rsyslog config.
+	insinto /etc/rsyslog.d
+	doins rsyslog/rsyslog.hammerd.conf
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hammerd_load_ec_image_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/hammerd_update_fw_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/unittest_runner"
+}
diff --git a/chromeos-base/hammerd/hammerd-9999.ebuild b/chromeos-base/hammerd/hammerd-9999.ebuild
index 8bff0db..eadc3d4 100644
--- a/chromeos-base/hammerd/hammerd-9999.ebuild
+++ b/chromeos-base/hammerd/hammerd-9999.ebuild
@@ -22,7 +22,7 @@
 
 RDEPEND="
 	chromeos-base/ec-utils:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/vboot_reference:=
 	dev-libs/openssl:0=
 	sys-apps/flashmap:=
diff --git a/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r135.ebuild b/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r135.ebuild
deleted file mode 100644
index a54e9a9..0000000
--- a/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r135.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c82d6d8e321f68b056238f372405b10e17a5686d"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "145583dcf0814760ca300ce984891691f4f4bc11" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk hardware_verifier metrics .gn"
-
-PLATFORM_SUBDIR="hardware_verifier"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Hardware Verifier Tool/Lib for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="
-	chromeos-base/metrics:=
-	chromeos-base/system_api:=
-	chromeos-base/vboot_reference:=
-"
-
-pkg_preinst() {
-	# Create user and group for hardware_verifier
-	enewuser "hardware_verifier"
-	enewgroup "hardware_verifier"
-}
-
-src_install() {
-	dobin "${OUT}/hardware_verifier"
-
-	insinto /etc/init
-	doins init/hardware-verifier.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/unittest_runner"
-}
diff --git a/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r169.ebuild b/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r169.ebuild
new file mode 100644
index 0000000..6eedb0a
--- /dev/null
+++ b/chromeos-base/hardware_verifier/hardware_verifier-0.0.1-r169.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "676147ce581555ea71e4cd46c6e43c1d663f658a" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk hardware_verifier metrics .gn"
+
+PLATFORM_SUBDIR="hardware_verifier"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Hardware Verifier Tool/Lib for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/system_api:=
+	chromeos-base/vboot_reference:=
+"
+
+pkg_preinst() {
+	# Create user and group for hardware_verifier
+	enewuser "hardware_verifier"
+	enewgroup "hardware_verifier"
+}
+
+src_install() {
+	dobin "${OUT}/hardware_verifier"
+
+	insinto /etc/init
+	doins init/hardware-verifier.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/unittest_runner"
+}
diff --git a/chromeos-base/hardware_verifier/hardware_verifier-9999.ebuild b/chromeos-base/hardware_verifier/hardware_verifier-9999.ebuild
index e82f13a..811a6fc 100644
--- a/chromeos-base/hardware_verifier/hardware_verifier-9999.ebuild
+++ b/chromeos-base/hardware_verifier/hardware_verifier-9999.ebuild
@@ -20,7 +20,7 @@
 KEYWORDS="~*"
 
 DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/system_api:=
 	chromeos-base/vboot_reference:=
 "
diff --git a/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r36.ebuild b/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r36.ebuild
deleted file mode 100644
index d9cbcfa..0000000
--- a/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r36.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c82d6d8e321f68b056238f372405b10e17a5686d"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "145583dcf0814760ca300ce984891691f4f4bc11" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_GO_PACKAGES=(
-	"chromiumos/hardware_verifier/..."
-)
-
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk hardware_verifier metrics .gn"
-
-PLATFORM_SUBDIR="hardware_verifier/proto"
-
-inherit cros-workon cros-go platform
-
-DESCRIPTION="Hardware Verifier go proto for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/proto"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="
-	chromeos-base/metrics:=
-	chromeos-base/system_api:=
-	chromeos-base/vboot_reference:=
-	dev-go/protobuf
-"
-
-src_unpack() {
-	platform_src_unpack
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-}
-
-src_install() {
-	cros-go_src_install
-}
diff --git a/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r70.ebuild b/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r70.ebuild
new file mode 100644
index 0000000..2d4bfd3
--- /dev/null
+++ b/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-0.0.1-r70.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "676147ce581555ea71e4cd46c6e43c1d663f658a" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_GO_PACKAGES=(
+	"chromiumos/hardware_verifier/..."
+)
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk hardware_verifier metrics .gn"
+
+PLATFORM_SUBDIR="hardware_verifier/proto"
+
+inherit cros-workon cros-go platform
+
+DESCRIPTION="Hardware Verifier go proto for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/proto"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/system_api:=
+	chromeos-base/vboot_reference:=
+	dev-go/protobuf
+"
+
+src_unpack() {
+	platform_src_unpack
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+}
+
+src_install() {
+	cros-go_src_install
+}
diff --git a/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-9999.ebuild b/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-9999.ebuild
index a230cb7..0d301ee 100644
--- a/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-9999.ebuild
+++ b/chromeos-base/hardware_verifier_proto/hardware_verifier_proto-9999.ebuild
@@ -24,7 +24,7 @@
 KEYWORDS="~*"
 
 DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/system_api:=
 	chromeos-base/vboot_reference:=
 	dev-go/protobuf
diff --git a/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r46.ebuild b/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r46.ebuild
deleted file mode 100644
index 84e2235..0000000
--- a/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r46.ebuild
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c83368e10d90ee3fb9a4b49e1ef82757c21ce854"
-CROS_WORKON_TREE=("677b75140e4ae1b1d889f929c630579a8b13357e" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "076d90695122ec2235bc1b00ccc2da310da88372" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="attestation common-mk hwsec-test-utils trunks .gn"
-
-PLATFORM_SUBDIR="hwsec-test-utils"
-
-inherit cros-workon platform
-
-DESCRIPTION="Hwsec-related test-only features. This package resides in test images only."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hwsec-test-utils/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test tpm tpm2"
-REQUIRED_USE="tpm2? ( !tpm )"
-
-RDEPEND="
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	!tpm2? (
-		app-crypt/trousers:=
-	)
-"
-
-DEPEND="${RDEPEND}
-	tpm2? (
-		chromeos-base/trunks:=[test?]
-	)
-	chromeos-base/attestation:=
-	chromeos-base/system_api:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-"
-
-src_install() {
-
-	# Installs attestation-injected-keys
-	dobin "${OUT}/attestation-injected-keys"
-
-	# Installs hwsec-test-va
-	dobin "${OUT}/hwsec-test-va"
-
-	# Install fake pca agent
-	insinto /etc/init
-	doins fake_pca_agent/fake_pca_agentd.conf
-	dobin "${OUT}"/fake_pca_agentd
-
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/hwsec-test-utils_testrunner"
-}
diff --git a/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r87.ebuild b/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r87.ebuild
new file mode 100644
index 0000000..898b66e
--- /dev/null
+++ b/chromeos-base/hwsec-test-utils/hwsec-test-utils-0.0.1-r87.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("264bb1bf0f00bb187ac184fd6dedeffeba8be970" "aa81756947ecfdd38b22f42eed8eeafa40431079" "8bfca2f1ed038e0e416fc64153834ad974b30e7b" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="attestation common-mk hwsec-test-utils trunks .gn"
+
+PLATFORM_SUBDIR="hwsec-test-utils"
+
+inherit cros-workon platform
+
+DESCRIPTION="Hwsec-related test-only features. This package resides in test images only."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/hwsec-test-utils/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test tpm tpm2"
+REQUIRED_USE="tpm2? ( !tpm )"
+
+RDEPEND="
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	!tpm2? (
+		app-crypt/trousers:=
+	)
+"
+
+DEPEND="${RDEPEND}
+	tpm2? (
+		chromeos-base/trunks:=[test?]
+	)
+	chromeos-base/attestation:=
+	chromeos-base/system_api:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+"
+
+src_install() {
+
+	# Installs attestation-injected-keys
+	dobin "${OUT}/attestation-injected-keys"
+
+	# Installs hwsec-test-va
+	dobin "${OUT}/hwsec-test-va"
+
+	# Install fake pca agent
+	insinto /etc/init
+	doins fake_pca_agent/fake_pca_agentd.conf
+	dobin "${OUT}"/fake_pca_agentd
+
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/hwsec-test-utils_testrunner"
+}
diff --git a/chromeos-base/iioservice/iioservice-0.0.1-r33.ebuild b/chromeos-base/iioservice/iioservice-0.0.1-r33.ebuild
new file mode 100644
index 0000000..5a08772
--- /dev/null
+++ b/chromeos-base/iioservice/iioservice-0.0.1-r33.ebuild
@@ -0,0 +1,60 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "7065eafeda4efefbd047454930df0bd2a581bba7" "5868de62b85f7f824439fd5ba0fbee2418a2783c" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+# TODO(crbug.com/809389): Remove libmems from this list.
+CROS_WORKON_SUBTREE=".gn iioservice libmems common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="iioservice/daemon"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Chrome OS sensor HAL IPC util."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/libiioservice_ipc:=
+	chromeos-base/libmems:=
+"
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser "iioservice"
+	enewgroup "iioservice"
+}
+
+src_install() {
+	dosbin "${OUT}"/iioservice
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/iioservice.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/iioservice-${ARCH}.policy" iioservice-seccomp.policy
+}
+
+platform_pkg_test() {
+	local tests=(
+		iioservice_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/iioservice/iioservice-9999.ebuild b/chromeos-base/iioservice/iioservice-9999.ebuild
new file mode 100644
index 0000000..921ba6e
--- /dev/null
+++ b/chromeos-base/iioservice/iioservice-9999.ebuild
@@ -0,0 +1,58 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+# TODO(crbug.com/809389): Remove libmems from this list.
+CROS_WORKON_SUBTREE=".gn iioservice libmems common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="iioservice/daemon"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Chrome OS sensor HAL IPC util."
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE="+seccomp"
+
+RDEPEND="
+	chromeos-base/libiioservice_ipc:=
+	chromeos-base/libmems:=
+"
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser "iioservice"
+	enewgroup "iioservice"
+}
+
+src_install() {
+	dosbin "${OUT}"/iioservice
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/iioservice.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/iioservice-${ARCH}.policy" iioservice-seccomp.policy
+}
+
+platform_pkg_test() {
+	local tests=(
+		iioservice_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/imageloader-client/OWNERS b/chromeos-base/imageloader-client/OWNERS
new file mode 100644
index 0000000..792e8d9
--- /dev/null
+++ b/chromeos-base/imageloader-client/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/imageloader/OWNERS
diff --git a/chromeos-base/imageloader-client/imageloader-client-0.0.1-r545.ebuild b/chromeos-base/imageloader-client/imageloader-client-0.0.1-r545.ebuild
deleted file mode 100644
index fc3c6d9..0000000
--- a/chromeos-base/imageloader-client/imageloader-client-0.0.1-r545.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="bebebe6d1f7593aab3e74466b382c60afb5753e3"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "fd6b785806e5c30689307805b3f4210cbaf74efd" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk imageloader .gn"
-
-PLATFORM_SUBDIR="imageloader/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="ImageLoader DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library.
-DEPEND="
-	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
-"
-
-RDEPEND="chromeos-base/imageloader"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "imageloader"
-}
diff --git a/chromeos-base/imageloader-client/imageloader-client-0.0.1-r566.ebuild b/chromeos-base/imageloader-client/imageloader-client-0.0.1-r566.ebuild
new file mode 100644
index 0000000..8cae000
--- /dev/null
+++ b/chromeos-base/imageloader-client/imageloader-client-0.0.1-r566.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "a0a95501cf76d3e8517c9fea5e2b5ed9ab809401" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk imageloader .gn"
+
+PLATFORM_SUBDIR="imageloader/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="ImageLoader DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library.
+DEPEND="
+	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
+"
+
+RDEPEND="chromeos-base/imageloader"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "imageloader"
+}
diff --git a/chromeos-base/imageloader/OWNERS b/chromeos-base/imageloader/OWNERS
new file mode 100644
index 0000000..792e8d9
--- /dev/null
+++ b/chromeos-base/imageloader/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/imageloader/OWNERS
diff --git a/chromeos-base/imageloader/imageloader-0.0.1-r1501.ebuild b/chromeos-base/imageloader/imageloader-0.0.1-r1501.ebuild
deleted file mode 100644
index 3379818..0000000
--- a/chromeos-base/imageloader/imageloader-0.0.1-r1501.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="bebebe6d1f7593aab3e74466b382c60afb5753e3"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "fd6b785806e5c30689307805b3f4210cbaf74efd" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk imageloader .gn"
-
-PLATFORM_SUBDIR="imageloader"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Allow mounting verified utility images"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-RDEPEND="dev-libs/openssl:=
-	dev-libs/protobuf:=
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-	sys-fs/lvm2:="
-
-DEPEND="${RDEPEND}
-	chromeos-base/system_api:=[fuzzer?]"
-
-src_install() {
-	# Install manifest parsing libraries
-	dolib.so "${OUT}/lib/libimageloader-manifest.so"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libimageloader-manifest.pc
-
-	insinto "/usr/include/libimageloader"
-	doins manifest.h
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp/imageloader-seccomp-${ARCH}.policy" imageloader-seccomp.policy
-	newins "seccomp/imageloader-helper-seccomp-${ARCH}.policy" imageloader-helper-seccomp.policy
-	cd "${OUT}"
-	dosbin imageloader
-	cd "${S}"
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.ImageLoader.conf
-	insinto /usr/share/dbus-1/system-services
-	doins dbus_service/org.chromium.ImageLoader.service
-	insinto /etc/init
-	doins init/pepper-flash-player.conf
-	doins init/imageloader.conf
-	doins init/imageloader-shutdown.conf
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/imageloader_helper_process_receiver_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/imageloader_manifest_fuzzer \
-		--dict "${S}"/fuzz/manifest.dict
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/run_tests"
-}
-
-pkg_preinst() {
-	enewuser "imageloaderd"
-	enewgroup "imageloaderd"
-}
diff --git a/chromeos-base/imageloader/imageloader-0.0.1-r1522.ebuild b/chromeos-base/imageloader/imageloader-0.0.1-r1522.ebuild
new file mode 100644
index 0000000..8be76ec
--- /dev/null
+++ b/chromeos-base/imageloader/imageloader-0.0.1-r1522.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "a0a95501cf76d3e8517c9fea5e2b5ed9ab809401" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk imageloader .gn"
+
+PLATFORM_SUBDIR="imageloader"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Allow mounting verified utility images"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+RDEPEND="dev-libs/openssl:=
+	dev-libs/protobuf:=
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+	sys-fs/lvm2:="
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:=[fuzzer?]"
+
+src_install() {
+	# Install manifest parsing libraries
+	dolib.so "${OUT}/lib/libimageloader-manifest.so"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libimageloader-manifest.pc
+
+	insinto "/usr/include/libimageloader"
+	doins manifest.h
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/imageloader-seccomp-${ARCH}.policy" imageloader-seccomp.policy
+	newins "seccomp/imageloader-helper-seccomp-${ARCH}.policy" imageloader-helper-seccomp.policy
+	cd "${OUT}"
+	dosbin imageloader
+	cd "${S}"
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.ImageLoader.conf
+	insinto /usr/share/dbus-1/system-services
+	doins dbus_service/org.chromium.ImageLoader.service
+	insinto /etc/init
+	doins init/pepper-flash-player.conf
+	doins init/imageloader.conf
+	doins init/imageloader-shutdown.conf
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/imageloader_helper_process_receiver_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/imageloader_manifest_fuzzer \
+		--dict "${S}"/fuzz/manifest.dict
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/run_tests"
+}
+
+pkg_preinst() {
+	enewuser "imageloaderd"
+	enewgroup "imageloaderd"
+}
diff --git a/chromeos-base/infineon-firmware-updater/files/makefile-fixes.patch b/chromeos-base/infineon-firmware-updater/files/makefile-fixes.patch
index 9f6c4f5..a290523 100644
--- a/chromeos-base/infineon-firmware-updater/files/makefile-fixes.patch
+++ b/chromeos-base/infineon-firmware-updater/files/makefile-fixes.patch
@@ -3,6 +3,7 @@
 1. Add $(CPPFLAGS) to compiler invocations.
 2. Replace bare ar invocation with $(AR) for cross compilation.
 3. Add additional flags to silence warnings generated by clang.
+4. Remove emptry call to STRIP.
 
 --- a/Common/ConsoleIO/makefile
 +++ b/Common/ConsoleIO/makefile
@@ -133,12 +134,13 @@
  
  TPMFactoryUpd: $(OBJFILES)
  	# Call shared sub-makefiles to generate archives
-@@ -114,7 +117,7 @@
+@@ -114,8 +117,7 @@
  	$(MAKE) -C ../Common/TpmDeviceAccess
  	$(MAKE) -C ../Common/Crypt
  	# And run the actual makefile job
 -	$(CC) $^ -o $@ $(LDFLAGS)
+-	$(STRIP)
 +	$(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)
- 	$(STRIP)
  
  clean:
+ 	# Call shared sub-makefiles to cleanup archives
diff --git a/chromeos-base/infineon-firmware-updater/infineon-firmware-updater-1.1.2459.0-r30.ebuild b/chromeos-base/infineon-firmware-updater/infineon-firmware-updater-1.1.2459.0-r31.ebuild
similarity index 100%
rename from chromeos-base/infineon-firmware-updater/infineon-firmware-updater-1.1.2459.0-r30.ebuild
rename to chromeos-base/infineon-firmware-updater/infineon-firmware-updater-1.1.2459.0-r31.ebuild
diff --git a/chromeos-base/ippusb_bridge/ippusb_bridge-0.0.1-r9.ebuild b/chromeos-base/ippusb_bridge/ippusb_bridge-0.0.1-r9.ebuild
new file mode 100644
index 0000000..0d0e886
--- /dev/null
+++ b/chromeos-base/ippusb_bridge/ippusb_bridge-0.0.1-r9.ebuild
@@ -0,0 +1,67 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="dc3b92215bdfb7f7e4da396908f77257ff902f98"
+CROS_WORKON_TREE="d96a2e3ec092d6680d7cba7d16116b1e3f8ae31c"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="ippusb_bridge"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="A proxy for HTTP traffic over an IPP-USB printer connection"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	virtual/libusb:1=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	>=dev-rust/chunked_transfer-1:= <dev-rust/chunked_transfer-2
+	>=dev-rust/getopts-0.2.18:= <dev-rust/getopts-0.3
+	>=dev-rust/httparse-1.3.4:= <dev-rust/httparse-1.4
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3
+	>=dev-rust/rusb-0.6.2:= <dev-rust/rusb-0.7
+	dev-rust/sync:=
+	dev-rust/sys_util:=
+	>=dev-rust/tiny_http-0.7:= <dev-rust/tiny_http-0.8
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/ippusb_bridge"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)"/ippusb_bridge
+
+	# Install policy files.
+	insinto /usr/share/policy
+	newins "seccomp/ippusb-bridge-seccomp-${ARCH}.policy" \
+		ippusb-bridge-seccomp.policy
+}
diff --git a/chromeos-base/ippusb_bridge/ippusb_bridge-9999.ebuild b/chromeos-base/ippusb_bridge/ippusb_bridge-9999.ebuild
new file mode 100644
index 0000000..cfc05c9
--- /dev/null
+++ b/chromeos-base/ippusb_bridge/ippusb_bridge-9999.ebuild
@@ -0,0 +1,65 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="ippusb_bridge"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="A proxy for HTTP traffic over an IPP-USB printer connection"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="~*"
+IUSE=""
+
+COMMON_DEPEND="
+	virtual/libusb:1=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	>=dev-rust/chunked_transfer-1:= <dev-rust/chunked_transfer-2
+	>=dev-rust/getopts-0.2.18:= <dev-rust/getopts-0.3
+	>=dev-rust/httparse-1.3.4:= <dev-rust/httparse-1.4
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3
+	>=dev-rust/rusb-0.6.2:= <dev-rust/rusb-0.7
+	dev-rust/sync:=
+	dev-rust/sys_util:=
+	>=dev-rust/tiny_http-0.7:= <dev-rust/tiny_http-0.8
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/ippusb_bridge"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)"/ippusb_bridge
+
+	# Install policy files.
+	insinto /usr/share/policy
+	newins "seccomp/ippusb-bridge-seccomp-${ARCH}.policy" \
+		ippusb-bridge-seccomp.policy
+}
diff --git a/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r288.ebuild b/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r288.ebuild
deleted file mode 100644
index 9b9b6e2..0000000
--- a/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r288.ebuild
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="d152413b889208c27091a34068195ec00018e860"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "36ef0b76b04c29311ee4364701c3d934e0d60aa0" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk ippusb_manager .gn"
-
-PLATFORM_SUBDIR="ippusb_manager"
-
-inherit cros-workon platform udev user
-
-DESCRIPTION="Service which manages communication between ippusbxd and cups."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	chromeos-base/minijail:=
-	net-print/ippusbxd:=
-	virtual/libusb:1=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-pkg_preinst() {
-	enewgroup ippusb
-	enewuser ippusb
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/ippusb_manager_testrunner"
-}
-
-src_install() {
-	dobin "${OUT}"/ippusb_manager
-
-	# udev rules.
-	udev_dorules udev/*.rules
-
-	# Install policy files.
-	insinto /usr/share/policy
-	newins seccomp/ippusb-manager-seccomp-${ARCH}.policy \
-		ippusb-manager-seccomp.policy
-
-	# Upstart script.
-	insinto /etc/init
-	doins etc/init/*.conf
-
-	# Install fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/ippusb_manager_usb_fuzzer
-}
diff --git a/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r316.ebuild b/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r316.ebuild
new file mode 100644
index 0000000..023e90f
--- /dev/null
+++ b/chromeos-base/ippusb_manager/ippusb_manager-0.0.1-r316.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1d1ac851617adbce1de3aba9c9446f9ca5e4de48" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk ippusb_manager .gn"
+
+PLATFORM_SUBDIR="ippusb_manager"
+
+inherit cros-workon platform udev user
+
+DESCRIPTION="Service which manages communication between ippusb printers and cups."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	chromeos-base/minijail:=
+	virtual/libusb:1=
+"
+RDEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/ippusb_bridge
+"
+DEPEND="${COMMON_DEPEND}"
+
+pkg_preinst() {
+	enewgroup ippusb
+	enewuser ippusb
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/ippusb_manager_testrunner"
+}
+
+src_install() {
+	dobin "${OUT}"/ippusb_manager
+
+	# udev rules.
+	udev_dorules udev/*.rules
+
+	# Install policy files.
+	insinto /usr/share/policy
+	newins seccomp/ippusb-manager-seccomp-${ARCH}.policy \
+		ippusb-manager-seccomp.policy
+
+	# Upstart script.
+	insinto /etc/init
+	doins etc/init/*.conf
+
+	# Install fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/ippusb_manager_usb_fuzzer
+}
diff --git a/chromeos-base/ippusb_manager/ippusb_manager-9999.ebuild b/chromeos-base/ippusb_manager/ippusb_manager-9999.ebuild
index 1b3e97c..e280fd1 100644
--- a/chromeos-base/ippusb_manager/ippusb_manager-9999.ebuild
+++ b/chromeos-base/ippusb_manager/ippusb_manager-9999.ebuild
@@ -12,7 +12,7 @@
 
 inherit cros-workon platform udev user
 
-DESCRIPTION="Service which manages communication between ippusbxd and cups."
+DESCRIPTION="Service which manages communication between ippusb printers and cups."
 HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/"
 
 LICENSE="BSD-Google"
@@ -21,10 +21,12 @@
 
 COMMON_DEPEND="
 	chromeos-base/minijail:=
-	net-print/ippusbxd:=
 	virtual/libusb:1=
 "
-RDEPEND="${COMMON_DEPEND}"
+RDEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/ippusb_bridge
+"
 DEPEND="${COMMON_DEPEND}"
 
 pkg_preinst() {
diff --git a/chromeos-base/kerberos/kerberos-0.0.1-r205.ebuild b/chromeos-base/kerberos/kerberos-0.0.1-r205.ebuild
deleted file mode 100644
index dc09176..0000000
--- a/chromeos-base/kerberos/kerberos-0.0.1-r205.ebuild
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "3396e8649c92adf1b4b269e09b1208b6339e9574" "98c0db7e92836fcb71403a83973a9b5018fe6177" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk kerberos libpasswordprovider metrics .gn"
-
-PLATFORM_SUBDIR="kerberos"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Requests and manages Kerberos tickets to enable Kerberos SSO"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/kerberos/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="asan fuzzer"
-
-COMMON_DEPEND="
-	app-crypt/mit-krb5:=
-	chromeos-base/libbrillo:=[asan?,fuzzer?]
-	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
-	chromeos-base/minijail:=
-	dev-libs/protobuf:=
-	dev-libs/dbus-glib:=
-	sys-apps/dbus:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/protofiles:=
-	chromeos-base/session_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs kerberosd.
-	enewuser kerberosd
-	enewgroup kerberosd
-	enewuser kerberosd-exec
-	enewgroup kerberosd-exec
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dosbin "${OUT}"/kerberosd
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.Kerberos.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins dbus/org.chromium.Kerberos.service
-
-	insinto /etc/init
-	doins init/kerberosd.conf
-
-	insinto /usr/share/policy
-	newins seccomp/kerberosd-seccomp-"${ARCH}".policy kerberosd-seccomp.policy
-
-	insinto /usr/share/cros/startup/process_management_policies
-	doins setuid_restrictions/kerberosd_whitelist.txt
-
-	# Create daemon store folder prototype, see
-	# https://chromium.googlesource.com/chromiumos/docs/+/master/sandboxing.md#securely-mounting-cryptohome-daemon-store-folders
-	local daemon_store="/etc/daemon-store/kerberosd"
-	dodir "${daemon_store}"
-	fperms 0770 "${daemon_store}"
-	fowners kerberosd:kerberosd "${daemon_store}"
-
-	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/config_parser_fuzzer \
-		--dict "${S}"/config_parser_fuzzer.dict || die
-}
-
-platform_pkg_test() {
-	local tests=(
-		kerberos_test
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/kerberos/kerberos-0.0.1-r239.ebuild b/chromeos-base/kerberos/kerberos-0.0.1-r239.ebuild
new file mode 100644
index 0000000..c215abc
--- /dev/null
+++ b/chromeos-base/kerberos/kerberos-0.0.1-r239.ebuild
@@ -0,0 +1,90 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1ed938290dd08fbf20b6ad852236dd7c79fd09e1" "377caa22e8416ce2388b9c099e85be393001947f" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk kerberos libpasswordprovider metrics .gn"
+
+PLATFORM_SUBDIR="kerberos"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Requests and manages Kerberos tickets to enable Kerberos SSO"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/kerberos/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan fuzzer"
+
+COMMON_DEPEND="
+	app-crypt/mit-krb5:=
+	chromeos-base/libbrillo:=[asan?,fuzzer?]
+	chromeos-base/libpasswordprovider:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/minijail:=
+	dev-libs/protobuf:=
+	sys-apps/dbus:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/protofiles:=
+	chromeos-base/session_manager-client:=
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs kerberosd.
+	enewuser kerberosd
+	enewgroup kerberosd
+	enewuser kerberosd-exec
+	enewgroup kerberosd-exec
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dosbin "${OUT}"/kerberosd
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.Kerberos.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins dbus/org.chromium.Kerberos.service
+
+	insinto /etc/init
+	doins init/kerberosd.conf
+
+	insinto /usr/share/policy
+	newins seccomp/kerberosd-seccomp-"${ARCH}".policy kerberosd-seccomp.policy
+
+	insinto /usr/share/cros/startup/process_management_policies
+	doins setuid_restrictions/kerberosd_whitelist.txt
+
+	# Create daemon store folder prototype, see
+	# https://chromium.googlesource.com/chromiumos/docs/+/master/sandboxing.md#securely-mounting-cryptohome-daemon-store-folders
+	local daemon_store="/etc/daemon-store/kerberosd"
+	dodir "${daemon_store}"
+	fperms 0770 "${daemon_store}"
+	fowners kerberosd:kerberosd "${daemon_store}"
+
+	platform_fuzzer_install "${S}/OWNERS" "${OUT}"/config_parser_fuzzer \
+		--dict "${S}"/config_parser_fuzzer.dict || die
+}
+
+platform_pkg_test() {
+	local tests=(
+		kerberos_test
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/kerberos/kerberos-9999.ebuild b/chromeos-base/kerberos/kerberos-9999.ebuild
index 2f5fd88..b97bcac 100644
--- a/chromeos-base/kerberos/kerberos-9999.ebuild
+++ b/chromeos-base/kerberos/kerberos-9999.ebuild
@@ -25,10 +25,9 @@
 	app-crypt/mit-krb5:=
 	chromeos-base/libbrillo:=[asan?,fuzzer?]
 	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/minijail:=
 	dev-libs/protobuf:=
-	dev-libs/dbus-glib:=
 	sys-apps/dbus:=
 "
 RDEPEND="${COMMON_DEPEND}"
diff --git a/chromeos-base/lexmark-fax-pnh/files/chromeos-version.sh b/chromeos-base/lexmark-fax-pnh/files/chromeos-version.sh
new file mode 100644
index 0000000..fe2a375
--- /dev/null
+++ b/chromeos-base/lexmark-fax-pnh/files/chromeos-version.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+#
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+echo 0.0.1
\ No newline at end of file
diff --git a/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-0.0.1-r20.ebuild b/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-0.0.1-r20.ebuild
new file mode 100644
index 0000000..f806489
--- /dev/null
+++ b/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-0.0.1-r20.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "66286b08bab6dc1bd60aa0746badf554b9278339")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "c21e4f27dbf3f77743ca90efe4b116f6a95add73")
+CROS_WORKON_LOCALNAME=("platform2" "third_party/lexmark-fax-pnh")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/lexmark-fax-pnh")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/lexmark-fax-pnh")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="lexmark-fax-pnh"
+
+inherit cros-workon platform
+
+DESCRIPTION="ChromeOS implementation of the Lexmark fax-pnh-filter"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/lexmark-fax-pnh/"
+
+LICENSE="MPL-2.0"
+KEYWORDS="*"
+
+IUSE=""
+
+RDEPEND="
+	net-print/cups
+"
+DEPEND="${RDEPEND}"
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/token_replacer_testrunner"
+}
+
+src_install() {
+	exeinto /usr/libexec/cups/filter
+	doexe "${OUT}"/fax-pnh-filter
+}
diff --git a/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-9999.ebuild b/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-9999.ebuild
new file mode 100644
index 0000000..2b3e14e
--- /dev/null
+++ b/chromeos-base/lexmark-fax-pnh/lexmark-fax-pnh-9999.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_LOCALNAME=("platform2" "third_party/lexmark-fax-pnh")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/lexmark-fax-pnh")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/lexmark-fax-pnh")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="lexmark-fax-pnh"
+
+inherit cros-workon platform
+
+DESCRIPTION="ChromeOS implementation of the Lexmark fax-pnh-filter"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/lexmark-fax-pnh/"
+
+LICENSE="MPL-2.0"
+KEYWORDS="~*"
+
+IUSE=""
+
+RDEPEND="
+	net-print/cups
+"
+DEPEND="${RDEPEND}"
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/token_replacer_testrunner"
+}
+
+src_install() {
+	exeinto /usr/libexec/cups/filter
+	doexe "${OUT}"/fax-pnh-filter
+}
\ No newline at end of file
diff --git a/chromeos-base/libbrillo/libbrillo-0.0.1-r1668.ebuild b/chromeos-base/libbrillo/libbrillo-0.0.1-r1668.ebuild
deleted file mode 100644
index ea5cf07..0000000
--- a/chromeos-base/libbrillo/libbrillo-0.0.1-r1668.ebuild
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="aec2eaa3b24aa7fc9ec3c27a8675265cb67837c7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "9da9751f965ac8cdb8411a0766dad4f0676e1083" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libbrillo .gn"
-
-PLATFORM_SUBDIR="libbrillo"
-
-# platform.eclass automatically add dependency to libbrillo by default,
-# but this package should not have the dependency.
-WANT_LIBBRILLO="no"
-
-inherit cros-workon platform
-
-DESCRIPTION="Base library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libbrillo/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host +dbus +device_mapper fuzzer +udev"
-
-COMMON_DEPEND="
-	chromeos-base/minijail:=
-	dbus? ( dev-libs/dbus-glib:= )
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-	net-libs/grpc:=
-	net-misc/curl:=
-	sys-apps/rootdev:=
-	device_mapper? ( sys-fs/lvm2:= )
-	udev? ( virtual/libudev )
-"
-RDEPEND="
-	${COMMON_DEPEND}
-	!cros_host? ( chromeos-base/libchromeos-use-flags )
-	chromeos-base/chromeos-ca-certificates
-	!chromeos-base/libchromeos
-"
-DEPEND="
-	${COMMON_DEPEND}
-	>=chromeos-base/protofiles-0.0.39:=
-	dbus? ( chromeos-base/system_api:=[fuzzer?] )
-	dev-libs/modp_b64:=
-"
-
-src_install() {
-	insinto "/usr/$(get_libdir)/pkgconfig"
-
-	dolib.so "${OUT}"/lib/lib{brillo,installattributes,policy}*.so
-	dolib.a "${OUT}"/libbrillo*.a
-	# Install libbrillo with and without version number as a temporary
-	# measure.
-	doins "${OUT}"/obj/libbrillo/libbrillo*.pc
-
-	# Install all the header files from libbrillo/brillo/*.h into
-	# /usr/include/brillo (recursively, with sub-directories).
-	local dir
-	while read -d $'\0' -r dir; do
-		insinto "/usr/include/${dir}"
-		doins "${dir}"/*.h
-	done < <(find brillo -type d -print0)
-
-	insinto /usr/include/policy
-	doins policy/*.h
-	insinto /usr/include/install_attributes
-	doins install_attributes/libinstallattributes.h
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libbrillo_data_encoding_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/libbrillo_dbus_data_serialization_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libbrillo_http_form_data_fuzzer
-}
-
-platform_pkg_test() {
-	local gtest_filter_qemu="-*DeathTest*"
-	platform_test "run" "${OUT}/libbrillo_tests" "" "" "${gtest_filter_qemu}"
-	platform_test "run" "${OUT}/libinstallattributes_tests"
-	platform_test "run" "${OUT}/libpolicy_tests"
-	platform_test "run" "${OUT}/libbrillo-grpc_tests"
-}
diff --git a/chromeos-base/libbrillo/libbrillo-0.0.1-r1712.ebuild b/chromeos-base/libbrillo/libbrillo-0.0.1-r1712.ebuild
new file mode 100644
index 0000000..594b4c3
--- /dev/null
+++ b/chromeos-base/libbrillo/libbrillo-0.0.1-r1712.ebuild
@@ -0,0 +1,87 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f535f7b3f8216d366ebadd993828f9ecd957c7e9"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "55186d9bbf49265cd0ecd2b2eabb8a062ac2eb7d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libbrillo .gn"
+
+PLATFORM_SUBDIR="libbrillo"
+
+# platform.eclass automatically add dependency to libbrillo by default,
+# but this package should not have the dependency.
+WANT_LIBBRILLO="no"
+
+inherit cros-workon platform
+
+DESCRIPTION="Base library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libbrillo/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host +dbus +device_mapper fuzzer +udev"
+
+COMMON_DEPEND="
+	chromeos-base/minijail:=
+	dbus? ( dev-libs/dbus-glib:= )
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+	net-libs/grpc:=
+	net-misc/curl:=
+	sys-apps/rootdev:=
+	device_mapper? ( sys-fs/lvm2:= )
+	udev? ( virtual/libudev )
+"
+RDEPEND="
+	${COMMON_DEPEND}
+	!cros_host? ( chromeos-base/libchromeos-use-flags )
+	chromeos-base/chromeos-ca-certificates
+	!chromeos-base/libchromeos
+"
+DEPEND="
+	${COMMON_DEPEND}
+	>=chromeos-base/protofiles-0.0.41:=
+	dbus? ( chromeos-base/system_api:=[fuzzer?] )
+	dev-libs/modp_b64:=
+"
+
+src_install() {
+	insinto "/usr/$(get_libdir)/pkgconfig"
+
+	dolib.so "${OUT}"/lib/lib{brillo,installattributes,policy}*.so
+	dolib.a "${OUT}"/libbrillo*.a
+	# Install libbrillo with and without version number as a temporary
+	# measure.
+	doins "${OUT}"/obj/libbrillo/libbrillo*.pc
+
+	# Install all the header files from libbrillo/brillo/*.h into
+	# /usr/include/brillo (recursively, with sub-directories).
+	local dir
+	while read -d $'\0' -r dir; do
+		insinto "/usr/include/${dir}"
+		doins "${dir}"/*.h
+	done < <(find brillo -type d -print0)
+
+	insinto /usr/include/policy
+	doins policy/*.h
+	insinto /usr/include/install_attributes
+	doins install_attributes/libinstallattributes.h
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libbrillo_data_encoding_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/libbrillo_dbus_data_serialization_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libbrillo_http_form_data_fuzzer
+}
+
+platform_pkg_test() {
+	local gtest_filter_qemu="-*DeathTest*"
+	platform_test "run" "${OUT}/libbrillo_tests" "" "" "${gtest_filter_qemu}"
+	platform_test "run" "${OUT}/libinstallattributes_tests"
+	platform_test "run" "${OUT}/libpolicy_tests"
+	platform_test "run" "${OUT}/libbrillo-grpc_tests"
+}
diff --git a/chromeos-base/libbrillo/libbrillo-9999.ebuild b/chromeos-base/libbrillo/libbrillo-9999.ebuild
index 633d6c13..3824adb 100644
--- a/chromeos-base/libbrillo/libbrillo-9999.ebuild
+++ b/chromeos-base/libbrillo/libbrillo-9999.ebuild
@@ -43,7 +43,7 @@
 "
 DEPEND="
 	${COMMON_DEPEND}
-	>=chromeos-base/protofiles-0.0.39:=
+	>=chromeos-base/protofiles-0.0.41:=
 	dbus? ( chromeos-base/system_api:=[fuzzer?] )
 	dev-libs/modp_b64:=
 "
diff --git a/chromeos-base/libchrome/libchrome-0.0.1-r37.ebuild b/chromeos-base/libchrome/libchrome-0.0.1-r37.ebuild
deleted file mode 100644
index 85efe71..0000000
--- a/chromeos-base/libchrome/libchrome-0.0.1-r37.ebuild
+++ /dev/null
@@ -1,240 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT=("3c84ec7b4a00f71d4c24b04aeeb0533d9242150d" "58af3a81c74511678039bf6a17f21f4aae54eae3")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "debc0344fe932d71dd37515f6fd39ce72638529a")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/libchrome")
-CROS_WORKON_LOCALNAME=("platform2" "aosp/external/libchrome")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libchrome")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-WANT_LIBCHROME="no"
-IS_LIBCHROME="yes"
-inherit cros-workon libchrome-version platform
-
-DESCRIPTION="Chrome base/ and dbus/ libraries extracted for use on Chrome OS"
-HOMEPAGE="http://dev.chromium.org/chromium-os/packages/libchrome"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host +crypto +dbus fuzzer +mojo +timers"
-
-PLATFORM_SUBDIR="libchrome"
-
-# TODO(avakulenko): Put dev-libs/nss behind a USE flag to make sure NSS is
-# pulled only into the configurations that require it.
-# TODO(fqj): remove !chromeos-base/libchrome-${BASE_VER} on next uprev to r680000.
-RDEPEND="dev-libs/glib:2=
-	dev-libs/libevent:=
-	dev-libs/modp_b64:=
-	crypto? (
-		dev-libs/nss:=
-		dev-libs/openssl:=
-	)
-	dbus? (
-		sys-apps/dbus:=
-		dev-libs/protobuf:=
-	)
-	dev-libs/re2:=
-	!~chromeos-base/libchrome-576279
-	!chromeos-base/libchrome:576279
-	!chromeos-base/libchrome:462023
-	!chromeos-base/libchrome:456626
-	!chromeos-base/libchrome:395517
-"
-DEPEND="${RDEPEND}
-	dev-cpp/gtest:=
-"
-
-# libmojo used to be in a separate package, which now conflicts with libchrome.
-# Add softblocker here, to resolve the conflict, in case building the package
-# on the environment where old libmojo is installed.
-# TODO(hidehiko): Clean up the blocker after certain period.
-RDEPEND="${RDEPEND}
-	!chromeos-base/libmojo"
-
-# libmojo depends on libbase-crypto.
-REQUIRED_USE="mojo? ( crypto )"
-
-src_prepare() {
-	# epatch "${FILESDIR}"/${PN}-Replace-std-unordered_map-with-std-map-for-dbus-Prop.patch
-	# epatch "${FILESDIR}"/${PN}-dbus-Filter-signal-by-the-sender-we-are-interested-i.patch
-	# epatch "${FILESDIR}"/${PN}-dbus-Make-MockObjectManager-useful.patch
-	# epatch "${FILESDIR}"/${PN}-dbus-Don-t-DCHECK-unexpected-message-type-but-ignore.patch
-	# epatch "${FILESDIR}"/${PN}-Mock-more-methods-of-dbus-Bus-in-dbus-MockBus.patch
-
-	# Disable custom memory allocator when asan is used.
-	# https://crbug.com/807685
-	use_sanitizers && epatch "${FILESDIR}"/${PN}-Disable-memory-allocator.patch
-
-	# Disable object lifetime tracking since it cuases memory leaks in
-	# sanitizer builds, https://crbug.com/908138
-	# TODO
-	# epatch "${FILESDIR}"/${PN}-Disable-object-tracking.patch
-
-	# Apply patches
-	while read -r patch; do
-		epatch "${S}/libchrome_tools/patches/${patch}"
-	done < <(grep -E '^[^#]' "${S}/libchrome_tools/patches/patches")
-}
-
-src_install() {
-	export BASE_VER="$(cat BASE_VER)"
-	dolib.so "${OUT}"/lib/libbase*-"${BASE_VER}".so
-	dolib.a "${OUT}"/libbase*-"${BASE_VER}".a
-
-	local mojom_dirs=()
-	local header_dirs=(
-		base
-		base/allocator
-		base/containers
-		base/debug
-		base/files
-		base/hash
-		base/i18n
-		base/json
-		base/memory
-		base/message_loop
-		base/metrics
-		base/numerics
-		base/posix
-		base/process
-		base/strings
-		base/synchronization
-		base/system
-		base/task
-		base/task/common
-		base/task/sequence_manager
-		base/task/thread_pool
-		base/third_party/icu
-		base/third_party/nspr
-		base/third_party/valgrind
-		base/threading
-		base/time
-		base/timer
-		base/trace_event
-		base/trace_event/common
-		build
-		components/policy
-		components/policy/core/common
-		testing/gmock/include/gmock
-		testing/gtest/include/gtest
-	)
-	use dbus && header_dirs+=( dbus )
-	use timers && header_dirs+=( components/timers )
-
-	insinto /usr/include/base-"${BASE_VER}"/base/test
-	doins \
-		base/test/bind_test_util.h \
-		base/test/scoped_task_environment.h \
-		base/test/simple_test_clock.h \
-		base/test/simple_test_tick_clock.h \
-		base/test/task_environment.h \
-		base/test/test_mock_time_task_runner.h \
-		base/test/test_pending_task.h \
-		base/test/test_timeouts.h \
-
-	if use crypto; then
-		insinto /usr/include/base-${BASE_VER}/crypto
-		doins \
-			crypto/crypto_export.h \
-			crypto/hmac.h \
-			crypto/libcrypto-compat.h \
-			crypto/nss_key_util.h \
-			crypto/nss_util.h \
-			crypto/nss_util_internal.h \
-			crypto/openssl_util.h \
-			crypto/p224.h \
-			crypto/p224_spake.h \
-			crypto/random.h \
-			crypto/rsa_private_key.h \
-			crypto/scoped_nss_types.h \
-			crypto/scoped_openssl_types.h \
-			crypto/scoped_test_nss_db.h \
-			crypto/secure_hash.h \
-			crypto/secure_util.h \
-			crypto/sha2.h \
-			crypto/signature_creator.h \
-			crypto/signature_verifier.h
-	fi
-
-	insinto /usr/$(get_libdir)/pkgconfig
-	doins "${OUT}"/obj/libchrome/libchrome*-"${BASE_VER}".pc
-
-	# Install libmojo.
-	if use mojo; then
-		# Install binary.
-		dolib.a "${OUT}"/libmojo-"${BASE_VER}".a
-
-		# Install headers.
-		header_dirs+=(
-			ipc
-			mojo/core/
-			mojo/core/embedder
-			mojo/core/ports
-			mojo/public/c/system
-			mojo/public/cpp/base
-			mojo/public/cpp/bindings
-			mojo/public/cpp/bindings/lib
-			mojo/public/cpp/platform
-			mojo/public/cpp/system
-		)
-		mojom_dirs+=(
-			mojo/public/interfaces/bindings
-			mojo/public/mojom/base
-		)
-
-		# Install libmojo.pc.
-		insinto /usr/$(get_libdir)/pkgconfig
-		doins "${OUT}"/obj/libchrome/libmojo-"${BASE_VER}".pc
-
-		# Install generate_mojom_bindings.
-		# TODO(hidehiko): Clean up tools' install directory.
-		insinto /usr/src/libmojo-"${BASE_VER}"/mojo
-		doins -r mojo/public/tools/bindings/*
-		doins build/gn_helpers.py
-		doins -r build/android/gyp/util
-		doins -r build/android/pylib
-		exeinto /usr/src/libmojo-"${BASE_VER}"/mojo
-		doexe libchrome_tools/mojom_generate_type_mappings.py
-
-		insinto /usr/src/libmojo-"${BASE_VER}"/third_party
-		doins -r third_party/jinja2
-		doins -r third_party/markupsafe
-		doins -r third_party/ply
-
-		# Mark scripts executable.
-		fperms +x \
-			/usr/src/libmojo-"${BASE_VER}"/mojo/generate_type_mappings.py \
-			/usr/src/libmojo-"${BASE_VER}"/mojo/mojom_bindings_generator.py
-	fi
-
-	# Install header files.
-	local d
-	for d in "${header_dirs[@]}" ; do
-		insinto /usr/include/base-"${BASE_VER}"/"${d}"
-		doins "${d}"/*.h
-	done
-	for d in "${mojom_dirs[@]}"; do
-		insinto /usr/include/base-"${BASE_VER}"/"${d}"
-		doins "${OUT}"/gen/include/"${d}"/*.h
-		# Not to install mojom and pickle file to prevent misuse until Chromium IPC
-		# team is ready to have a stable mojo_base. see crbug.com/1055379
-		# insinto /usr/src/libchrome/mojom/"${d}"
-		# doins "${S}"/"${d}"/*.mojom
-		# insinto /usr/share/libchrome/pickle/"${d}"
-		# doins "${OUT}"/gen/include/"${d}"/*.p
-	done
-
-	# Install libchrome base type mojo mapping
-	if use mojo; then
-		insinto /usr/share/libchrome/mojom_type_mappings_typemapping
-		doins "${OUT}"/gen/libchrome/mojom_type_mappings_typemapping
-	fi
-
-	insinto /usr/share/libchrome
-	doins BASE_VER
-}
diff --git a/chromeos-base/libchrome/libchrome-0.0.1-r66.ebuild b/chromeos-base/libchrome/libchrome-0.0.1-r66.ebuild
new file mode 100644
index 0000000..fe676c2f
--- /dev/null
+++ b/chromeos-base/libchrome/libchrome-0.0.1-r66.ebuild
@@ -0,0 +1,240 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "12f09a66b365a8cfe5a350695b9fa85df6517aaa")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "f09bc1fc190d2b90b11a205b0250b030e4739bab")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/libchrome")
+CROS_WORKON_LOCALNAME=("platform2" "aosp/external/libchrome")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libchrome")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+WANT_LIBCHROME="no"
+IS_LIBCHROME="yes"
+inherit cros-workon libchrome-version platform
+
+DESCRIPTION="Chrome base/ and dbus/ libraries extracted for use on Chrome OS"
+HOMEPAGE="http://dev.chromium.org/chromium-os/packages/libchrome"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host +crypto +dbus fuzzer +mojo +timers"
+
+PLATFORM_SUBDIR="libchrome"
+
+# TODO(avakulenko): Put dev-libs/nss behind a USE flag to make sure NSS is
+# pulled only into the configurations that require it.
+# TODO(fqj): remove !chromeos-base/libchrome-${BASE_VER} on next uprev to r680000.
+RDEPEND="dev-libs/glib:2=
+	dev-libs/libevent:=
+	dev-libs/modp_b64:=
+	crypto? (
+		dev-libs/nss:=
+		dev-libs/openssl:=
+	)
+	dbus? (
+		sys-apps/dbus:=
+		dev-libs/protobuf:=
+	)
+	dev-libs/re2:=
+	!~chromeos-base/libchrome-576279
+	!chromeos-base/libchrome:576279
+	!chromeos-base/libchrome:462023
+	!chromeos-base/libchrome:456626
+	!chromeos-base/libchrome:395517
+"
+DEPEND="${RDEPEND}
+	dev-cpp/gtest:=
+"
+
+# libmojo used to be in a separate package, which now conflicts with libchrome.
+# Add softblocker here, to resolve the conflict, in case building the package
+# on the environment where old libmojo is installed.
+# TODO(hidehiko): Clean up the blocker after certain period.
+RDEPEND="${RDEPEND}
+	!chromeos-base/libmojo"
+
+# libmojo depends on libbase-crypto.
+REQUIRED_USE="mojo? ( crypto )"
+
+src_prepare() {
+	# epatch "${FILESDIR}"/${PN}-Replace-std-unordered_map-with-std-map-for-dbus-Prop.patch
+	# epatch "${FILESDIR}"/${PN}-dbus-Filter-signal-by-the-sender-we-are-interested-i.patch
+	# epatch "${FILESDIR}"/${PN}-dbus-Make-MockObjectManager-useful.patch
+	# epatch "${FILESDIR}"/${PN}-dbus-Don-t-DCHECK-unexpected-message-type-but-ignore.patch
+	# epatch "${FILESDIR}"/${PN}-Mock-more-methods-of-dbus-Bus-in-dbus-MockBus.patch
+
+	# Disable custom memory allocator when asan is used.
+	# https://crbug.com/807685
+	use_sanitizers && epatch "${FILESDIR}"/${PN}-Disable-memory-allocator.patch
+
+	# Disable object lifetime tracking since it cuases memory leaks in
+	# sanitizer builds, https://crbug.com/908138
+	# TODO
+	# epatch "${FILESDIR}"/${PN}-Disable-object-tracking.patch
+
+	# Apply patches
+	while read -r patch; do
+		epatch "${S}/libchrome_tools/patches/${patch}"
+	done < <(grep -E '^[^#]' "${S}/libchrome_tools/patches/patches")
+}
+
+src_install() {
+	export BASE_VER="$(cat BASE_VER)"
+	dolib.so "${OUT}"/lib/libbase*-"${BASE_VER}".so
+	dolib.a "${OUT}"/libbase*-"${BASE_VER}".a
+
+	local mojom_dirs=()
+	local header_dirs=(
+		base
+		base/allocator
+		base/containers
+		base/debug
+		base/files
+		base/hash
+		base/i18n
+		base/json
+		base/memory
+		base/message_loop
+		base/metrics
+		base/numerics
+		base/posix
+		base/process
+		base/strings
+		base/synchronization
+		base/system
+		base/task
+		base/task/common
+		base/task/sequence_manager
+		base/task/thread_pool
+		base/third_party/icu
+		base/third_party/nspr
+		base/third_party/valgrind
+		base/threading
+		base/time
+		base/timer
+		base/trace_event
+		base/trace_event/common
+		build
+		components/policy
+		components/policy/core/common
+		testing/gmock/include/gmock
+		testing/gtest/include/gtest
+	)
+	use dbus && header_dirs+=( dbus )
+	use timers && header_dirs+=( components/timers )
+
+	insinto /usr/include/base-"${BASE_VER}"/base/test
+	doins \
+		base/test/bind_test_util.h \
+		base/test/scoped_task_environment.h \
+		base/test/simple_test_clock.h \
+		base/test/simple_test_tick_clock.h \
+		base/test/task_environment.h \
+		base/test/test_mock_time_task_runner.h \
+		base/test/test_pending_task.h \
+		base/test/test_timeouts.h \
+
+	if use crypto; then
+		insinto /usr/include/base-${BASE_VER}/crypto
+		doins \
+			crypto/crypto_export.h \
+			crypto/hmac.h \
+			crypto/libcrypto-compat.h \
+			crypto/nss_key_util.h \
+			crypto/nss_util.h \
+			crypto/nss_util_internal.h \
+			crypto/openssl_util.h \
+			crypto/p224.h \
+			crypto/p224_spake.h \
+			crypto/random.h \
+			crypto/rsa_private_key.h \
+			crypto/scoped_nss_types.h \
+			crypto/scoped_openssl_types.h \
+			crypto/scoped_test_nss_db.h \
+			crypto/secure_hash.h \
+			crypto/secure_util.h \
+			crypto/sha2.h \
+			crypto/signature_creator.h \
+			crypto/signature_verifier.h
+	fi
+
+	insinto /usr/$(get_libdir)/pkgconfig
+	doins "${OUT}"/obj/libchrome/libchrome*-"${BASE_VER}".pc
+
+	# Install libmojo.
+	if use mojo; then
+		# Install binary.
+		dolib.a "${OUT}"/libmojo-"${BASE_VER}".a
+
+		# Install headers.
+		header_dirs+=(
+			ipc
+			mojo/core/
+			mojo/core/embedder
+			mojo/core/ports
+			mojo/public/c/system
+			mojo/public/cpp/base
+			mojo/public/cpp/bindings
+			mojo/public/cpp/bindings/lib
+			mojo/public/cpp/platform
+			mojo/public/cpp/system
+		)
+		mojom_dirs+=(
+			mojo/public/interfaces/bindings
+			mojo/public/mojom/base
+		)
+
+		# Install libmojo.pc.
+		insinto /usr/$(get_libdir)/pkgconfig
+		doins "${OUT}"/obj/libchrome/libmojo-"${BASE_VER}".pc
+
+		# Install generate_mojom_bindings.
+		# TODO(hidehiko): Clean up tools' install directory.
+		insinto /usr/src/libmojo-"${BASE_VER}"/mojo
+		doins -r mojo/public/tools/bindings/*
+		doins build/gn_helpers.py
+		doins -r build/android/gyp/util
+		doins -r build/android/pylib
+		exeinto /usr/src/libmojo-"${BASE_VER}"/mojo
+		doexe libchrome_tools/mojom_generate_type_mappings.py
+
+		insinto /usr/src/libmojo-"${BASE_VER}"/third_party
+		doins -r third_party/jinja2
+		doins -r third_party/markupsafe
+		doins -r third_party/ply
+
+		# Mark scripts executable.
+		fperms +x \
+			/usr/src/libmojo-"${BASE_VER}"/mojo/generate_type_mappings.py \
+			/usr/src/libmojo-"${BASE_VER}"/mojo/mojom_bindings_generator.py
+	fi
+
+	# Install header files.
+	local d
+	for d in "${header_dirs[@]}" ; do
+		insinto /usr/include/base-"${BASE_VER}"/"${d}"
+		doins "${d}"/*.h
+	done
+	for d in "${mojom_dirs[@]}"; do
+		insinto /usr/include/base-"${BASE_VER}"/"${d}"
+		doins "${OUT}"/gen/include/"${d}"/*.h
+		# Not to install mojom and pickle file to prevent misuse until Chromium IPC
+		# team is ready to have a stable mojo_base. see crbug.com/1055379
+		# insinto /usr/src/libchrome/mojom/"${d}"
+		# doins "${S}"/"${d}"/*.mojom
+		# insinto /usr/share/libchrome/pickle/"${d}"
+		# doins "${OUT}"/gen/include/"${d}"/*.p
+	done
+
+	# Install libchrome base type mojo mapping
+	if use mojo; then
+		insinto /usr/share/libchrome/mojom_type_mappings_typemapping
+		doins "${OUT}"/gen/libchrome/mojom_type_mappings_typemapping
+	fi
+
+	insinto /usr/share/libchrome
+	doins BASE_VER
+}
diff --git a/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1726.ebuild b/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1726.ebuild
deleted file mode 100644
index 173cb75..0000000
--- a/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1726.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="e120a38324e6a4f913141f6cf31bccdb4d17caa2"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "63b44e3686f0442c1912e91acfe36a7f40295f6b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk libchromeos-ui .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="libchromeos-ui"
-
-inherit cros-workon platform
-
-DESCRIPTION="Library used to start Chromium-based UIs"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-ui/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="chromeos-base/bootstat"
-DEPEND=""
-
-src_install() {
-	local v="$(libchrome_ver)"
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	./platform2_preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}"/lib/libchromeos-ui-"${v}".so
-	doins "${OUT}"/lib/libchromeos-ui-"${v}".pc
-
-	insinto /usr/include/chromeos/ui
-	doins "${S}"/chromeos/ui/*.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/libchromeos-ui-test"
-}
diff --git a/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1748.ebuild b/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1748.ebuild
new file mode 100644
index 0000000..958b492
--- /dev/null
+++ b/chromeos-base/libchromeos-ui/libchromeos-ui-0.0.1-r1748.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fa3969c8eba9dd2b27338d57f7a640843916bca6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk libchromeos-ui .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="libchromeos-ui"
+
+inherit cros-workon platform
+
+DESCRIPTION="Library used to start Chromium-based UIs"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-ui/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="chromeos-base/bootstat"
+DEPEND=""
+
+src_install() {
+	local v="$(libchrome_ver)"
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	./platform2_preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}"/lib/libchromeos-ui-"${v}".so
+	doins "${OUT}"/lib/libchromeos-ui-"${v}".pc
+
+	insinto /usr/include/chromeos/ui
+	doins "${S}"/chromeos/ui/*.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/libchromeos-ui-test"
+}
diff --git a/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r15.ebuild b/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r15.ebuild
new file mode 100644
index 0000000..6bd7e61
--- /dev/null
+++ b/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r15.ebuild
@@ -0,0 +1,119 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="Text file listing USE flags for chromeos-base/libchromeos"
+
+LICENSE="BSD-Google"
+# Nothing depends on this package for build info.  All the files are used at
+# runtime only by design.
+SLOT="0/0"
+KEYWORDS="*"
+
+# NB: Flags listed here are off by default unless prefixed with a '+'.
+# This list is lengthy since it determines the USE flags that will be written to
+# the /etc/ui_use_flags.txt file that's used to generate Chrome's command line.
+IUSE="
+	allow_consumer_kiosk
+	arc
+	arc_adb_sideloading
+	arc_force_2x_scaling
+	arc_native_bridge_64bit_support_experiment
+	arc_transition_m_to_n
+	arcpp
+	arcvm
+	asan
+	background_blur
+	big_little
+	biod
+	borealis_host
+	cfm_enabled_device
+	cheets
+	clear_fast_ink_buffer
+	compupdates
+	diagnostics
+	disable_background_blur
+	disable_cros_video_decoder
+	disable_explicit_dma_fences
+	disable_flash_hw_video_decode
+	disable_instant_tethering
+	disable_yuv420_biplanar
+	dlc
+	drm_atomic
+	edge_touch_filtering
+	enable_heuristic_palm_detection_filter
+	enable_neural_palm_detection_filter
+	force_breakpad
+	gpu_sandbox_allow_sysv_shm
+	gpu_sandbox_failures_not_fatal
+	gpu_sandbox_start_early
+	houdini
+	houdini64
+	kvm_guest
+	kvm_host
+	kvm_transition
+	lacros
+	legacy_keyboard
+	legacy_power_button
+	moblab
+	native_gpu_memory_buffers
+	natural_scroll_default
+	ndk_translation
+	ndk_translation64
+	neon
+	ondevice_handwriting
+	ondevice_handwriting_dlc
+	oobe_skip_postlogin
+	oobe_skip_to_login
+	opengles
+	passive_event_listeners
+	pita
+	pita-camera
+	pita-microphone
+	rialto
+	scheduler_configuration_performance
+	screenshare_sw_codec
+	shelf-hotseat
+	smartdim
+	tablet_form_factor
+	touch_centric_device
+	touchscreen_wakeup
+	touchview
+	tpm_fallback
+	video_capture_use_gpu_memory_buffer
+	virtio_gpu
+	webui-tab-strip
+	wilco
+	+X
+"
+
+src_install() {
+	# Install a file containing a list of currently-set USE flags that
+	# ChromiumCommandBuilder reads at runtime while constructing Chrome's
+	# command line.
+	local path="${WORKDIR}/ui_use_flags.txt"
+	cat <<EOF >"${path}"
+# This file is just for libchromeos's ChromiumCommandBuilder class.
+# Don't use it for anything else. Your code will break.
+EOF
+
+	# If you need to use a new flag, add it to $IUSE at the top of the file.
+	local flags=( ${IUSE} )
+	local flag
+	for flag in "${flags[@]/#[-+]}" ; do
+		usev ${flag}
+	done | sort -u >>"${path}"
+
+	insinto /etc
+	doins "${path}"
+}
diff --git a/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r8.ebuild b/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r8.ebuild
deleted file mode 100644
index 67ef8e0..0000000
--- a/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-1-r8.ebuild
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="Text file listing USE flags for chromeos-base/libchromeos"
-
-LICENSE="BSD-Google"
-# Nothing depends on this package for build info.  All the files are used at
-# runtime only by design.
-SLOT="0/0"
-KEYWORDS="*"
-
-# NB: Flags listed here are off by default unless prefixed with a '+'.
-# This list is lengthy since it determines the USE flags that will be written to
-# the /etc/ui_use_flags.txt file that's used to generate Chrome's command line.
-IUSE="
-	allow_consumer_kiosk
-	arc
-	arc_adb_sideloading
-	arc_force_2x_scaling
-	arc_native_bridge_64bit_support_experiment
-	arc_transition_m_to_n
-	arcpp
-	arcvm
-	asan
-	background_blur
-	big_little
-	biod
-	cfm_enabled_device
-	cheets
-	compupdates
-	disable_background_blur
-	disable_cros_video_decoder
-	disable_explicit_dma_fences
-	disable_flash_hw_video_decode
-	disable_instant_tethering
-	disable_yuv420_biplanar
-	drm_atomic
-	edge_touch_filtering
-	enable_heuristic_palm_detection_filter
-	enable_neural_palm_detection_filter
-	force_breakpad
-	force_crashpad
-	gpu_sandbox_allow_sysv_shm
-	gpu_sandbox_failures_not_fatal
-	gpu_sandbox_start_early
-	houdini
-	houdini64
-	kvm_guest
-	kvm_host
-	kvm_transition
-	lacros
-	legacy_keyboard
-	legacy_power_button
-	moblab
-	native_gpu_memory_buffers
-	natural_scroll_default
-	ndk_translation
-	ndk_translation64
-	neon
-	oobe_skip_postlogin
-	oobe_skip_to_login
-	opengles
-	passive_event_listeners
-	pita
-	pita-camera
-	pita-microphone
-	rialto
-	scheduler_configuration_performance
-	screenshare_sw_codec
-	shelf-hotseat
-	smartdim
-	tablet_form_factor
-	touch_centric_device
-	touchscreen_wakeup
-	touchview
-	tpm_fallback
-	video_capture_use_gpu_memory_buffer
-	virtio_gpu
-	webui-tab-strip
-	wilco
-	+X
-"
-
-src_install() {
-	# Install a file containing a list of currently-set USE flags that
-	# ChromiumCommandBuilder reads at runtime while constructing Chrome's
-	# command line.
-	local path="${WORKDIR}/ui_use_flags.txt"
-	cat <<EOF >"${path}"
-# This file is just for libchromeos's ChromiumCommandBuilder class.
-# Don't use it for anything else. Your code will break.
-EOF
-
-	# If you need to use a new flag, add it to $IUSE at the top of the file.
-	local flags=( ${IUSE} )
-	local flag
-	for flag in "${flags[@]/#[-+]}" ; do
-		usev ${flag}
-	done | sort -u >>"${path}"
-
-	insinto /etc
-	doins "${path}"
-}
diff --git a/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-9999.ebuild b/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-9999.ebuild
index 00aed7f..af386e3 100644
--- a/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-9999.ebuild
+++ b/chromeos-base/libchromeos-use-flags/libchromeos-use-flags-9999.ebuild
@@ -6,7 +6,7 @@
 # This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
 # the canonical empty project.
 CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
 
 inherit cros-workon
 
@@ -34,21 +34,24 @@
 	background_blur
 	big_little
 	biod
+	borealis_host
 	cfm_enabled_device
 	cheets
+	clear_fast_ink_buffer
 	compupdates
+	diagnostics
 	disable_background_blur
 	disable_cros_video_decoder
 	disable_explicit_dma_fences
 	disable_flash_hw_video_decode
 	disable_instant_tethering
 	disable_yuv420_biplanar
+	dlc
 	drm_atomic
 	edge_touch_filtering
 	enable_heuristic_palm_detection_filter
 	enable_neural_palm_detection_filter
 	force_breakpad
-	force_crashpad
 	gpu_sandbox_allow_sysv_shm
 	gpu_sandbox_failures_not_fatal
 	gpu_sandbox_start_early
@@ -66,6 +69,8 @@
 	ndk_translation
 	ndk_translation64
 	neon
+	ondevice_handwriting
+	ondevice_handwriting_dlc
 	oobe_skip_postlogin
 	oobe_skip_to_login
 	opengles
diff --git a/chromeos-base/libcontainer/libcontainer-0.0.1-r1496.ebuild b/chromeos-base/libcontainer/libcontainer-0.0.1-r1496.ebuild
deleted file mode 100644
index 0079e6e..0000000
--- a/chromeos-base/libcontainer/libcontainer-0.0.1-r1496.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "c0b816f19570ba7f0f522c1ff7a29bae14b8be22" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libcontainer .gn"
-
-PLATFORM_SUBDIR="libcontainer"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Library to run jailed containers on Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libcontainer/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+device-mapper"
-
-# Need lvm2 for devmapper.
-RDEPEND="chromeos-base/minijail:=
-	device-mapper? ( sys-fs/lvm2:= )"
-DEPEND="${RDEPEND}"
-
-src_install() {
-	into /
-	dolib.so "${OUT}"/lib/libcontainer.so
-
-	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/libcontainer.pc
-
-	insinto "/usr/include/chromeos"
-	doins libcontainer.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}"/libcontainer_test
-}
diff --git a/chromeos-base/libcontainer/libcontainer-0.0.1-r1518.ebuild b/chromeos-base/libcontainer/libcontainer-0.0.1-r1518.ebuild
new file mode 100644
index 0000000..dff400b
--- /dev/null
+++ b/chromeos-base/libcontainer/libcontainer-0.0.1-r1518.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "04a8a0274b23f4bbf01eb2645630f252331db474" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libcontainer .gn"
+
+PLATFORM_SUBDIR="libcontainer"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Library to run jailed containers on Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libcontainer/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+device-mapper"
+
+# Need lvm2 for devmapper.
+RDEPEND="chromeos-base/minijail:=
+	device-mapper? ( sys-fs/lvm2:= )"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	into /
+	dolib.so "${OUT}"/lib/libcontainer.so
+
+	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/libcontainer.pc
+
+	insinto "/usr/include/chromeos"
+	doins libcontainer.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}"/libcontainer_test
+}
diff --git a/chromeos-base/libhwsec/libhwsec-0.0.1-r102.ebuild b/chromeos-base/libhwsec/libhwsec-0.0.1-r102.ebuild
deleted file mode 100644
index 3ef7890..0000000
--- a/chromeos-base/libhwsec/libhwsec-0.0.1-r102.ebuild
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1bf01f1a340a50edee0e82b52621117c8388644c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libhwsec .gn"
-
-PLATFORM_SUBDIR="libhwsec"
-
-inherit cros-workon platform
-
-DESCRIPTION="Crypto and utility functions used in TPM related daemons."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libhwsec/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test tpm2"
-
-COMMON_DEPEND="
-	dev-libs/openssl:0=
-	!tpm2? ( app-crypt/trousers:= )
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_install() {
-	insinto /usr/include/chromeos/libhwsec
-	doins ./*.h
-
-	insinto /usr/include/chromeos/libhwsec/overalls
-	doins ./overalls/overalls.h
-	doins ./overalls/overalls_api.h
-
-	if ! use tpm2; then
-		insinto /usr/include/chromeos/libhwsec/test_utils/tpm1
-		doins ./test_utils/tpm1/*.h
-	fi
-
-	dolib.so "${OUT}"/lib/libhwsec.so
-	dolib.a "${OUT}"/libhwsec_test.a
-}
-
-
-platform_pkg_test() {
-	local tests=(
-		hwsec_testrunner
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/libhwsec/libhwsec-0.0.1-r125.ebuild b/chromeos-base/libhwsec/libhwsec-0.0.1-r125.ebuild
new file mode 100644
index 0000000..3c1826f
--- /dev/null
+++ b/chromeos-base/libhwsec/libhwsec-0.0.1-r125.ebuild
@@ -0,0 +1,60 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "59ded4c8a6ec924cce82ba942070e51132ca1161" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libhwsec .gn"
+
+PLATFORM_SUBDIR="libhwsec"
+
+inherit cros-workon platform
+
+DESCRIPTION="Crypto and utility functions used in TPM related daemons."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libhwsec/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test tpm2"
+
+COMMON_DEPEND="
+	dev-libs/openssl:0=
+	!tpm2? ( app-crypt/trousers:= )
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_install() {
+	insinto /usr/include/chromeos/libhwsec
+	doins ./*.h
+
+	insinto /usr/include/chromeos/libhwsec/overalls
+	doins ./overalls/overalls.h
+	doins ./overalls/overalls_api.h
+
+	if ! use tpm2; then
+		insinto /usr/include/chromeos/libhwsec/test_utils/tpm1
+		doins ./test_utils/tpm1/*.h
+	fi
+
+	dolib.so "${OUT}"/lib/libhwsec.so
+	dolib.a "${OUT}"/libhwsec_test.a
+}
+
+
+platform_pkg_test() {
+	local tests=(
+		hwsec_testrunner
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r1.ebuild b/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r1.ebuild
deleted file mode 100644
index 6f6f3a0..0000000
--- a/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r1.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="22529c13e487f1c5d6f5dc769820debed8e52e33"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "64455de380955ba3a69acb54454954dc3c000a97" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE=".gn iioservice common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="iioservice/libiioservice_ipc"
-
-inherit cros-workon platform
-
-DESCRIPTION="Chrome OS sensor HAL IPC util."
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig
-"
-
-src_install() {
-	dolib.so "${OUT}/lib/libiioservice_ipc.so"
-	dolib.a "${OUT}/libiioservice_ipc_mojom.a"
-}
diff --git a/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r37.ebuild b/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r37.ebuild
new file mode 100644
index 0000000..df61a91
--- /dev/null
+++ b/chromeos-base/libiioservice_ipc/libiioservice_ipc-0.0.1-r37.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "7065eafeda4efefbd047454930df0bd2a581bba7" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE=".gn iioservice common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="iioservice/libiioservice_ipc"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS sensor HAL IPC util."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig
+"
+
+src_install() {
+	dolib.so "${OUT}/lib/libiioservice_ipc.so"
+	dolib.a "${OUT}/libiioservice_ipc_mojom.a"
+}
diff --git a/chromeos-base/libipp/libipp-0.0.1-r104.ebuild b/chromeos-base/libipp/libipp-0.0.1-r104.ebuild
new file mode 100644
index 0000000..b3d26a5
--- /dev/null
+++ b/chromeos-base/libipp/libipp-0.0.1-r104.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "7578de769de579ec7f934e22698468366fdc76ea" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libipp .gn"
+
+PLATFORM_SUBDIR="libipp"
+
+inherit cros-workon platform
+
+DESCRIPTION="The library for building and parsing IPP (Internet Printing Protocol) frames."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libipp/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+src_install() {
+	dolib.so "${OUT}/lib/libipp.so"
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libipp.pc
+
+	insinto "/usr/include/chromeos/libipp"
+	doins ipp.h ipp_attribute.h ipp_base.h ipp_collections.h ipp_enums.h \
+			ipp_export.h ipp_operations.h ipp_package.h
+
+	# Install fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libipp_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/libipp_test"
+}
diff --git a/chromeos-base/libipp/libipp-0.0.1-r84.ebuild b/chromeos-base/libipp/libipp-0.0.1-r84.ebuild
deleted file mode 100644
index c15546d..0000000
--- a/chromeos-base/libipp/libipp-0.0.1-r84.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "b654a149fdaa0d4247aa8a7dd6432cfd4845a089" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libipp .gn"
-
-PLATFORM_SUBDIR="libipp"
-
-inherit cros-workon platform
-
-DESCRIPTION="The library for building and parsing IPP (Internet Printing Protocol) frames."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libipp/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-src_install() {
-	dolib.so "${OUT}/lib/libipp.so"
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libipp.pc
-
-	insinto "/usr/include/chromeos/libipp"
-	doins ipp.h ipp_attribute.h ipp_base.h ipp_collections.h ipp_enums.h \
-			ipp_export.h ipp_operations.h ipp_package.h
-
-	# Install fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libipp_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/libipp_test"
-}
diff --git a/chromeos-base/libmems/libmems-0.0.1-r104.ebuild b/chromeos-base/libmems/libmems-0.0.1-r104.ebuild
deleted file mode 100644
index 7a18b87..0000000
--- a/chromeos-base/libmems/libmems-0.0.1-r104.ebuild
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="08c058a591621090c489775caafba4713ba70153"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "35209d034fbd2e33442b08fbe02ec0d600922a35" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libmems .gn"
-
-PLATFORM_SUBDIR="libmems"
-
-inherit cros-workon platform
-
-DESCRIPTION="MEMS support library for Chromium OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libmems"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	net-libs/libiio:="
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/system_api:="
-
-src_install() {
-	dolib.so "${OUT}/lib/libmems.so"
-	dolib.so "${OUT}/lib/libmems_test_support.so"
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libmems.pc
-	doins libmems_test_support.pc
-
-	insinto "/usr/include/chromeos/libmems"
-	doins *.h
-}
-
-platform_pkg_test() {
-	local tests=(
-		libmems_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
diff --git a/chromeos-base/libmems/libmems-0.0.1-r127.ebuild b/chromeos-base/libmems/libmems-0.0.1-r127.ebuild
new file mode 100644
index 0000000..0e05715
--- /dev/null
+++ b/chromeos-base/libmems/libmems-0.0.1-r127.ebuild
@@ -0,0 +1,53 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "5868de62b85f7f824439fd5ba0fbee2418a2783c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libmems .gn"
+
+PLATFORM_SUBDIR="libmems"
+
+inherit cros-workon platform
+
+DESCRIPTION="MEMS support library for Chromium OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libmems"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	net-libs/libiio:="
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/system_api:="
+
+src_install() {
+	dolib.so "${OUT}/lib/libmems.so"
+	dolib.so "${OUT}/lib/libmems_test_support.so"
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libmems.pc
+	doins libmems_test_support.pc
+
+	insinto "/usr/include/chromeos/libmems"
+	doins *.h
+}
+
+platform_pkg_test() {
+	local tests=(
+		libmems_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
diff --git a/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r373.ebuild b/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r373.ebuild
deleted file mode 100644
index 6d6b23c..0000000
--- a/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r373.ebuild
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "98c0db7e92836fcb71403a83973a9b5018fe6177" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libpasswordprovider .gn"
-
-PLATFORM_SUBDIR="libpasswordprovider"
-
-inherit cros-workon platform
-
-DESCRIPTION="Library for storing and retrieving user password"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libpasswordprovider"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	sys-apps/keyutils:=
-"
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dolib.so "${OUT}/lib/libpasswordprovider.so"
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libpasswordprovider.pc
-
-	insinto "/usr/include/libpasswordprovider"
-	doins *.h
-}
-
-platform_pkg_test() {
-
-	platform_test "run" "${OUT}/${test_bin}" "0" "${gtest_filter}"
-}
-
-platform_pkg_test() {
-	local gtest_filter=""
-	if ! use x86 && ! use amd64 ; then
-		# PasswordProvider tests fail on qemu due to unsupported system calls to keyrings.
-		# Run only the Password unit tests on qemu since keyrings are not supported yet.
-		# https://crbug.com/792699
-		einfo "Skipping PasswordProvider unit tests on non-x86 platform"
-		gtest_filter+="Password.*"
-	fi
-
-	local tests=(
-		password_provider_test
-	)
-
-	local test_bin
-		for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}" 0 "${gtest_filter}"
-	done
-}
diff --git a/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r393.ebuild b/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r393.ebuild
new file mode 100644
index 0000000..eb0293d
--- /dev/null
+++ b/chromeos-base/libpasswordprovider/libpasswordprovider-0.0.1-r393.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "377caa22e8416ce2388b9c099e85be393001947f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libpasswordprovider .gn"
+
+PLATFORM_SUBDIR="libpasswordprovider"
+
+inherit cros-workon platform
+
+DESCRIPTION="Library for storing and retrieving user password"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libpasswordprovider"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	sys-apps/keyutils:=
+"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dolib.so "${OUT}/lib/libpasswordprovider.so"
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libpasswordprovider.pc
+
+	insinto "/usr/include/libpasswordprovider"
+	doins *.h
+}
+
+platform_pkg_test() {
+
+	platform_test "run" "${OUT}/${test_bin}" "0" "${gtest_filter}"
+}
+
+platform_pkg_test() {
+	local gtest_filter=""
+	if ! use x86 && ! use amd64 ; then
+		# PasswordProvider tests fail on qemu due to unsupported system calls to keyrings.
+		# Run only the Password unit tests on qemu since keyrings are not supported yet.
+		# https://crbug.com/792699
+		einfo "Skipping PasswordProvider unit tests on non-x86 platform"
+		gtest_filter+="Password.*"
+	fi
+
+	local tests=(
+		password_provider_test
+	)
+
+	local test_bin
+		for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}" 0 "${gtest_filter}"
+	done
+}
diff --git a/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r203.ebuild b/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r203.ebuild
deleted file mode 100644
index 20fdcdb..0000000
--- a/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r203.ebuild
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="082227e6b44404efcfd4d973480be711d175473c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libtpmcrypto trunks .gn"
-
-PLATFORM_SUBDIR="libtpmcrypto"
-
-inherit cros-workon platform
-
-DESCRIPTION="Encrypts/Decrypts data to a serialized proto with TPM sealed key."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libtpmcrypto/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="tpm tpm2"
-REQUIRED_USE="tpm2? ( !tpm )"
-
-# This depends on protobuf because it uses protoc and needs to be rebuilt
-# whenever the protobuf library is updated since generated source files may be
-# incompatible across different versions of the protobuf library.
-COMMON_DEPEND="
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	!tpm2? (
-		app-crypt/trousers:=
-	)
-	dev-libs/protobuf:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-"
-
-src_install() {
-	dolib.so "${OUT}/lib/libtpmcrypto.so"
-
-	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}/libtpmcrypto.pc"
-
-	insinto "/usr/include/libtpmcrypto"
-	doins *.h
-}
-
-platform_pkg_test() {
-	local tests=(
-		tpmcrypto_test
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r233.ebuild b/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r233.ebuild
new file mode 100644
index 0000000..14c9d38
--- /dev/null
+++ b/chromeos-base/libtpmcrypto/libtpmcrypto-0.0.1-r233.ebuild
@@ -0,0 +1,67 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "d8479ac4f3bc0cc18815ff1d440dc3abd761db42" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libtpmcrypto trunks .gn"
+
+PLATFORM_SUBDIR="libtpmcrypto"
+
+inherit cros-workon platform
+
+DESCRIPTION="Encrypts/Decrypts data to a serialized proto with TPM sealed key."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libtpmcrypto/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="tpm tpm2"
+REQUIRED_USE="tpm2? ( !tpm )"
+
+# This depends on protobuf because it uses protoc and needs to be rebuilt
+# whenever the protobuf library is updated since generated source files may be
+# incompatible across different versions of the protobuf library.
+COMMON_DEPEND="
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	!tpm2? (
+		app-crypt/trousers:=
+	)
+	dev-libs/protobuf:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+"
+
+src_install() {
+	dolib.so "${OUT}/lib/libtpmcrypto.so"
+
+	"${S}"/platform2_preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}/libtpmcrypto.pc"
+
+	insinto "/usr/include/libtpmcrypto"
+	doins *.h
+}
+
+platform_pkg_test() {
+	local tests=(
+		tpmcrypto_test
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r127.ebuild b/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r127.ebuild
deleted file mode 100644
index 9ad3694..0000000
--- a/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r127.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="ad3d5b827c93cdd7e4decafd06a2e40fdf57e183"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/libvda .gn"
-
-PLATFORM_SUBDIR="arc/vm/libvda"
-
-inherit cros-workon platform
-
-DESCRIPTION="libvda Chrome GPU tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/libbrillo:=
-	media-libs/minigbm:=
-"
-
-DEPEND="
-	${RDEPEND}
-	chromeos-base/system_api:=
-"
-
-src_compile() {
-	platform "compile" "libvda_gpu_unittest"
-}
-
-src_install() {
-	exeinto /usr/libexec/libvda-gpu-tests
-	doexe "${OUT}/libvda_gpu_unittest"
-}
diff --git a/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r159.ebuild b/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r159.ebuild
new file mode 100644
index 0000000..f4278f9
--- /dev/null
+++ b/chromeos-base/libvda-gpu-tests/libvda-gpu-tests-0.0.1-r159.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "433eef54293bcbe2988b454dec66c28c1f4e0729" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/libvda .gn"
+
+PLATFORM_SUBDIR="arc/vm/libvda"
+
+inherit cros-workon platform
+
+DESCRIPTION="libvda Chrome GPU tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	chromeos-base/libbrillo:=
+	media-libs/minigbm:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api:=
+"
+
+src_compile() {
+	platform "compile" "libvda_gpu_unittest"
+}
+
+src_install() {
+	exeinto /usr/libexec/libvda-gpu-tests
+	doexe "${OUT}/libvda_gpu_unittest"
+}
diff --git a/chromeos-base/libvda/libvda-0.0.1-r133.ebuild b/chromeos-base/libvda/libvda-0.0.1-r133.ebuild
deleted file mode 100644
index 923e3f8..0000000
--- a/chromeos-base/libvda/libvda-0.0.1-r133.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="ad3d5b827c93cdd7e4decafd06a2e40fdf57e183"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/vm/libvda .gn"
-
-PLATFORM_SUBDIR="arc/vm/libvda"
-
-inherit cros-workon platform
-
-DESCRIPTION="libvda CrOS video decoding library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="libvda_test"
-
-COMMON_DEPEND="
-	media-libs/minigbm:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api:=
-"
-
-src_install() {
-	dolib.so "${OUT}"/lib/libvda.so
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/obj/arc/vm/libvda/libvda.pc
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libvda_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/libvda_fake_unittest"
-
-	platform_fuzzer_test "${OUT}"/libvda_fuzzer
-}
diff --git a/chromeos-base/libvda/libvda-0.0.1-r165.ebuild b/chromeos-base/libvda/libvda-0.0.1-r165.ebuild
new file mode 100644
index 0000000..56e8cb0
--- /dev/null
+++ b/chromeos-base/libvda/libvda-0.0.1-r165.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "433eef54293bcbe2988b454dec66c28c1f4e0729" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/vm/libvda .gn"
+
+PLATFORM_SUBDIR="arc/vm/libvda"
+
+inherit cros-workon platform
+
+DESCRIPTION="libvda CrOS video decoding library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="libvda_test"
+
+COMMON_DEPEND="
+	media-libs/minigbm:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	dolib.so "${OUT}"/lib/libvda.so
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/obj/arc/vm/libvda/libvda.pc
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/libvda_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/libvda_fake_unittest"
+
+	platform_fuzzer_test "${OUT}"/libvda_fuzzer
+}
diff --git a/chromeos-base/libweave/libweave-0.0.1-r1221.ebuild b/chromeos-base/libweave/libweave-0.0.1-r1221.ebuild
deleted file mode 100644
index 6c7ee0c..0000000
--- a/chromeos-base/libweave/libweave-0.0.1-r1221.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("e120a38324e6a4f913141f6cf31bccdb4d17caa2" "c0efdc07edb6044fff866e2c4724229a951a4fbf")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "207a66b6ccdc5ba610c7117e3e6d9e4e405c9b6c")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME=("platform2" "weave/libweave")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "weave/libweave")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libweave")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="libweave"
-
-inherit cros-workon libchrome platform
-
-DESCRIPTION="Weave device library"
-HOMEPAGE="http://dev.chromium.org/chromium-os/platform"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# libweave-test, which depends on gmock, is built unconditionally, so the gmock
-# dependency is always needed.
-DEPEND="dev-cpp/gtest:="
-
-src_install() {
-	insinto "/usr/$(get_libdir)/pkgconfig"
-
-	# Install libraries.
-	local v="$(libchrome_ver)"
-	./preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}"/lib/libweave-"${v}".so
-	doins "${OUT}"/lib/libweave-*"${v}".pc
-	dolib.a "${OUT}"/libweave-test-"${v}".a
-
-	# Install header files.
-	insinto /usr/include/weave/
-	doins -r include/weave/*
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/libweave_testrunner"
-}
diff --git a/chromeos-base/libweave/libweave-0.0.1-r1242.ebuild b/chromeos-base/libweave/libweave-0.0.1-r1242.ebuild
new file mode 100644
index 0000000..d1e9b25
--- /dev/null
+++ b/chromeos-base/libweave/libweave-0.0.1-r1242.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "82802cc6ee4d5c5df32f5ab89e560cfcb0f5e2d6")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "8576934c3924df022fce02458202425281e907e5")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME=("platform2" "weave/libweave")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "weave/libweave")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libweave")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="libweave"
+
+inherit cros-workon libchrome platform
+
+DESCRIPTION="Weave device library"
+HOMEPAGE="http://dev.chromium.org/chromium-os/platform"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# libweave-test, which depends on gmock, is built unconditionally, so the gmock
+# dependency is always needed.
+DEPEND="dev-cpp/gtest:="
+
+src_install() {
+	insinto "/usr/$(get_libdir)/pkgconfig"
+
+	# Install libraries.
+	local v="$(libchrome_ver)"
+	./preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}"/lib/libweave-"${v}".so
+	doins "${OUT}"/lib/libweave-*"${v}".pc
+	dolib.a "${OUT}"/libweave-test-"${v}".a
+
+	# Install header files.
+	insinto /usr/include/weave/
+	doins -r include/weave/*
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/libweave_testrunner"
+}
diff --git a/chromeos-base/lorgnette/lorgnette-0.0.1-r2859.ebuild b/chromeos-base/lorgnette/lorgnette-0.0.1-r2859.ebuild
deleted file mode 100644
index 93b905c..0000000
--- a/chromeos-base/lorgnette/lorgnette-0.0.1-r2859.ebuild
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="98888c33e7e8fdad96bc4aa3d94137620e4eeb07"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "ab80a5a8747b83e4edf76534117751700f049a33" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk lorgnette metrics .gn"
-
-PLATFORM_SUBDIR="lorgnette"
-
-inherit cros-workon platform user udev
-
-DESCRIPTION="Document Scanning service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/lorgnette/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-COMMON_DEPEND="
-	chromeos-base/metrics:=
-	media-libs/libpng:=
-	media-gfx/sane-backends:=
-"
-
-RDEPEND="${COMMON_DEPEND}
-	chromeos-base/minijail
-	media-gfx/sane-airscan
-	test? (
-		media-gfx/perceptualdiff:=
-	)
-"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/permission_broker-client:=
-	chromeos-base/system_api:=
-"
-
-pkg_preinst() {
-	enewgroup ippusb
-	enewgroup usbprinter
-}
-
-src_install() {
-	dobin "${OUT}"/lorgnette
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.lorgnette.conf
-	insinto /usr/share/dbus-1/system-services
-	doins dbus_service/org.chromium.lorgnette.service
-	insinto /etc/init
-	doins init/lorgnette.conf
-	udev_dorules udev/*.rules
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/lorgnette_unittest"
-}
diff --git a/chromeos-base/lorgnette/lorgnette-0.0.1-r2922.ebuild b/chromeos-base/lorgnette/lorgnette-0.0.1-r2922.ebuild
new file mode 100644
index 0000000..1feca45
--- /dev/null
+++ b/chromeos-base/lorgnette/lorgnette-0.0.1-r2922.ebuild
@@ -0,0 +1,62 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="f8315f3a8efca56b3cddf02d16c11aac0ebf3cff"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "73984411d59b75ad6e62de0bc867406844e7bd67" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk lorgnette metrics .gn"
+
+PLATFORM_SUBDIR="lorgnette"
+
+inherit cros-workon platform user udev
+
+DESCRIPTION="Document Scanning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/lorgnette/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+COMMON_DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	media-libs/libpng:=
+	media-gfx/sane-backends:=
+	virtual/libusb:1
+"
+
+RDEPEND="${COMMON_DEPEND}
+	chromeos-base/minijail
+	media-gfx/sane-airscan
+	test? (
+		media-gfx/perceptualdiff:=
+	)
+"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/permission_broker-client:=
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewgroup ippusb
+	enewgroup usbprinter
+}
+
+src_install() {
+	dobin "${OUT}"/lorgnette
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.lorgnette.conf
+	insinto /usr/share/dbus-1/system-services
+	doins dbus_service/org.chromium.lorgnette.service
+	insinto /etc/init
+	doins init/lorgnette.conf
+	udev_dorules udev/*.rules
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/lorgnette_unittest"
+}
diff --git a/chromeos-base/lorgnette/lorgnette-9999.ebuild b/chromeos-base/lorgnette/lorgnette-9999.ebuild
index 3755655..be6e366 100644
--- a/chromeos-base/lorgnette/lorgnette-9999.ebuild
+++ b/chromeos-base/lorgnette/lorgnette-9999.ebuild
@@ -20,9 +20,10 @@
 IUSE="test"
 
 COMMON_DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	media-libs/libpng:=
 	media-gfx/sane-backends:=
+	virtual/libusb:1
 "
 
 RDEPEND="${COMMON_DEPEND}
diff --git a/chromeos-base/lorgnette_cli/lorgnette_cli-0.0.1-r51.ebuild b/chromeos-base/lorgnette_cli/lorgnette_cli-0.0.1-r51.ebuild
new file mode 100644
index 0000000..0076e50
--- /dev/null
+++ b/chromeos-base/lorgnette_cli/lorgnette_cli-0.0.1-r51.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="f8315f3a8efca56b3cddf02d16c11aac0ebf3cff"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "73984411d59b75ad6e62de0bc867406844e7bd67" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk lorgnette .gn"
+
+PLATFORM_SUBDIR="lorgnette"
+
+inherit cros-workon platform
+
+DESCRIPTION="Command line interface to scanning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/lorgnette"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+SLOT="0/0"
+
+RDEPEND="
+	chromeos-base/lorgnette
+"
+
+src_install() {
+	dobin "${OUT}"/lorgnette_cli
+}
diff --git a/chromeos-base/lorgnette_cli/lorgnette_cli-9999.ebuild b/chromeos-base/lorgnette_cli/lorgnette_cli-9999.ebuild
new file mode 100644
index 0000000..57810d2
--- /dev/null
+++ b/chromeos-base/lorgnette_cli/lorgnette_cli-9999.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk lorgnette .gn"
+
+PLATFORM_SUBDIR="lorgnette"
+
+inherit cros-workon platform
+
+DESCRIPTION="Command line interface to scanning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/lorgnette"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+SLOT="0/0"
+
+RDEPEND="
+	chromeos-base/lorgnette
+"
+
+src_install() {
+	dobin "${OUT}"/lorgnette_cli
+}
diff --git a/chromeos-base/mcastd/mcastd-0.0.1-r47.ebuild b/chromeos-base/mcastd/mcastd-0.0.1-r47.ebuild
deleted file mode 100644
index eaf0b6b..0000000
--- a/chromeos-base/mcastd/mcastd-0.0.1-r47.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="05b5852bbf00f85e097be08bf5344d2f735171d7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "769e73d163dc671e97eeb278eefcf36cfdd1c94c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
-
-PLATFORM_SUBDIR="patchpanel/mcastd"
-
-inherit cros-workon libchrome platform
-
-DESCRIPTION="Multicast forwarder daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	dev-libs/protobuf:=
-	chromeos-base/libbrillo:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	!chromeos-base/arc-networkd-mcastd
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-"
-
-src_install() {
-	dobin "${OUT}"/mcastd
-}
diff --git a/chromeos-base/mcastd/mcastd-0.0.1-r98.ebuild b/chromeos-base/mcastd/mcastd-0.0.1-r98.ebuild
new file mode 100644
index 0000000..43023e2
--- /dev/null
+++ b/chromeos-base/mcastd/mcastd-0.0.1-r98.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="0a70acf40b774cf9c5d4f41cb5787d3862ca9348"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2c0fbdc6a39fdedb92ac536175e351099402b6ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
+
+PLATFORM_SUBDIR="patchpanel/mcastd"
+
+inherit cros-workon libchrome platform
+
+DESCRIPTION="Multicast forwarder daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+	chromeos-base/libbrillo:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	!chromeos-base/arc-networkd-mcastd
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+"
+
+src_install() {
+	dobin "${OUT}"/mcastd
+}
diff --git a/chromeos-base/memd/memd-0.1.0-r55.ebuild b/chromeos-base/memd/memd-0.1.0-r55.ebuild
deleted file mode 100644
index b7d85ba..0000000
--- a/chromeos-base/memd/memd-0.1.0-r55.ebuild
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="f322b971b228d2977592f43d2d987bf093430fee"
-CROS_WORKON_TREE="9ecbfbf065afc0fe58e76896e9016295f97e36cb"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="metrics/memd"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-rust cros-workon
-
-DESCRIPTION="Fine-grain memory metrics collector"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+seccomp"
-
-DEPEND="chromeos-base/system_api:=
-	sys-apps/dbus:=
-	~dev-rust/chrono-0.4.2:=
-	~dev-rust/dbus-0.6.1:=
-	=dev-rust/env_logger-0.6*:=
-	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
-	~dev-rust/log-0.4.5:=
-	>=dev-rust/protobuf-2.8:=
-	!>=dev-rust/protobuf-3
-	>=dev-rust/protoc-rust-2.8:=
-	!>=dev-rust/protoc-rust-3
-	~dev-rust/syslog-4.0.0:=
-	~dev-rust/time-0.1.40:=
-	=dev-rust/tempfile-3*:=
-	"
-
-src_unpack() {
-	# Unpack both the project and dependency source code.
-	cros-workon_src_unpack
-
-	# The compilation happens in the memd subdirectory.
-	S+="/metrics/memd"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test --all || die "memd test failed"
-	fi
-}
-
-src_install() {
-	# cargo doesn't know how to install cross-compiled binaries.  It will
-	# always install native binaries for the host system.  Install manually
-	# instead.
-	local build_dir="$(cros-rust_get_build_dir)"
-	dobin "${build_dir}/memd"
-	insinto /etc/init
-	doins init/memd.conf
-	insinto /usr/share/policy
-	use seccomp && \
-		newins "init/memd-seccomp-${ARCH}.policy" memd-seccomp.policy
-}
diff --git a/chromeos-base/memd/memd-0.1.0-r57.ebuild b/chromeos-base/memd/memd-0.1.0-r57.ebuild
new file mode 100644
index 0000000..7e16909
--- /dev/null
+++ b/chromeos-base/memd/memd-0.1.0-r57.ebuild
@@ -0,0 +1,72 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="534f1445cef6c98a94fa17b0c9496a26edc12968"
+CROS_WORKON_TREE="9ecbfbf065afc0fe58e76896e9016295f97e36cb"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="metrics/memd"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Fine-grain memory metrics collector"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp"
+
+DEPEND="chromeos-base/system_api:=
+	sys-apps/dbus:=
+	~dev-rust/chrono-0.4.2:=
+	~dev-rust/dbus-0.6.1:=
+	=dev-rust/env_logger-0.6*:=
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
+	~dev-rust/log-0.4.5:=
+	>=dev-rust/protobuf-2.8:=
+	!>=dev-rust/protobuf-3
+	>=dev-rust/protoc-rust-2.8:=
+	!>=dev-rust/protoc-rust-3
+	~dev-rust/syslog-4.0.1:=
+	~dev-rust/time-0.1.40:=
+	=dev-rust/tempfile-3*:=
+	"
+
+src_unpack() {
+	# Unpack both the project and dependency source code.
+	cros-workon_src_unpack
+
+	# The compilation happens in the memd subdirectory.
+	S+="/metrics/memd"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test --all || die "memd test failed"
+	fi
+}
+
+src_install() {
+	# cargo doesn't know how to install cross-compiled binaries.  It will
+	# always install native binaries for the host system.  Install manually
+	# instead.
+	local build_dir="$(cros-rust_get_build_dir)"
+	dobin "${build_dir}/memd"
+	insinto /etc/init
+	doins init/memd.conf
+	insinto /usr/share/policy
+	use seccomp && \
+		newins "init/memd-seccomp-${ARCH}.policy" memd-seccomp.policy
+}
diff --git a/chromeos-base/memd/memd-9999.ebuild b/chromeos-base/memd/memd-9999.ebuild
index 65bbb96..232249b 100644
--- a/chromeos-base/memd/memd-9999.ebuild
+++ b/chromeos-base/memd/memd-9999.ebuild
@@ -8,7 +8,7 @@
 CROS_WORKON_INCREMENTAL_BUILD=1
 CROS_WORKON_OUTOFTREE_BUILD=1
 
-inherit cros-rust cros-workon
+inherit cros-workon cros-rust
 
 DESCRIPTION="Fine-grain memory metrics collector"
 HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/"
@@ -28,7 +28,7 @@
 	!>=dev-rust/protobuf-3
 	>=dev-rust/protoc-rust-2.8:=
 	!>=dev-rust/protoc-rust-3
-	~dev-rust/syslog-4.0.0:=
+	~dev-rust/syslog-4.0.1:=
 	~dev-rust/time-0.1.40:=
 	=dev-rust/tempfile-3*:=
 	"
diff --git a/chromeos-base/mems_setup/mems_setup-0.0.1-r123.ebuild b/chromeos-base/mems_setup/mems_setup-0.0.1-r123.ebuild
deleted file mode 100644
index c16e7ab..0000000
--- a/chromeos-base/mems_setup/mems_setup-0.0.1-r123.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="08c058a591621090c489775caafba4713ba70153"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "db49e6090983c78aaaea558e0aede1a93db976be" "35209d034fbd2e33442b08fbe02ec0d600922a35" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Remove libmems from this list.
-CROS_WORKON_SUBTREE="common-mk mems_setup libmems .gn"
-
-PLATFORM_SUBDIR="mems_setup"
-
-inherit cros-workon platform
-
-DESCRIPTION="MEMS Setup for Chromium OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mems_setup"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	chromeos-base/libmems:=
-	net-libs/libiio:="
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/system_api:="
-
-src_install() {
-	dosbin "${OUT}"/mems_setup
-}
-
-platform_pkg_test() {
-	local tests=(
-		mems_setup_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/mems_setup/mems_setup-0.0.1-r152.ebuild b/chromeos-base/mems_setup/mems_setup-0.0.1-r152.ebuild
new file mode 100644
index 0000000..617f958
--- /dev/null
+++ b/chromeos-base/mems_setup/mems_setup-0.0.1-r152.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f474de3cc716c8a2b1fa48b7bb20c2f142cddc17"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "7a3b0f33cf5f55b2fcc209bd97b1fc4ebee3bbb0" "5868de62b85f7f824439fd5ba0fbee2418a2783c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Remove libmems from this list.
+CROS_WORKON_SUBTREE="common-mk mems_setup libmems .gn"
+
+PLATFORM_SUBDIR="mems_setup"
+
+inherit cros-workon platform
+
+DESCRIPTION="MEMS Setup for Chromium OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mems_setup"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="iioservice"
+
+COMMON_DEPEND="
+	chromeos-base/libmems:=
+	net-libs/libiio:="
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/system_api:="
+
+src_install() {
+	dosbin "${OUT}"/mems_setup
+}
+
+platform_pkg_test() {
+	local tests=(
+		mems_setup_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/mems_setup/mems_setup-9999.ebuild b/chromeos-base/mems_setup/mems_setup-9999.ebuild
index a30fcb9..9649b8c 100644
--- a/chromeos-base/mems_setup/mems_setup-9999.ebuild
+++ b/chromeos-base/mems_setup/mems_setup-9999.ebuild
@@ -19,7 +19,7 @@
 
 LICENSE="BSD-Google"
 KEYWORDS="~*"
-IUSE=""
+IUSE="iioservice"
 
 COMMON_DEPEND="
 	chromeos-base/libmems:=
diff --git a/chromeos-base/metrics/metrics-0.0.1-r3136.ebuild b/chromeos-base/metrics/metrics-0.0.1-r3136.ebuild
deleted file mode 100644
index 12d7d20..0000000
--- a/chromeos-base/metrics/metrics-0.0.1-r3136.ebuild
+++ /dev/null
@@ -1,110 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="e120a38324e6a4f913141f6cf31bccdb4d17caa2"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk metrics .gn"
-
-PLATFORM_SUBDIR="metrics"
-
-inherit cros-constants cros-workon libchrome-version platform systemd user
-
-DESCRIPTION="Metrics aggregation service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/metrics/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer metrics_uploader +passive_metrics systemd"
-
-COMMON_DEPEND="
-	dev-libs/dbus-glib:=
-	dev-libs/libpcre:=
-	dev-libs/protobuf:=
-	sys-apps/rootdev:=
-	"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/session_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/vboot_reference:=
-	"
-
-src_install() {
-	dobin "${OUT}"/metrics_client
-	dobin "${OUT}"/chromeos-pgmem
-
-	if use passive_metrics; then
-		dobin "${OUT}"/metrics_daemon
-		if use systemd; then
-			systemd_dounit init/metrics-daemon.service
-			systemd_enable_service multi-user.target metrics-daemon.service
-			systemd_dotmpfilesd init/metrics.conf
-		else
-			insinto /etc/init
-			doins init/metrics_library.conf init/metrics_daemon.conf
-		fi
-
-		if use metrics_uploader; then
-			if use systemd; then
-				sed -i '/ExecStart=/s:metrics_daemon:metrics_daemon -uploader:' \
-					"${D}"/usr/lib/systemd/system/metrics-daemon.service || die
-			else
-				sed -i '/DAEMON_FLAGS=/s:=.*:="-uploader":' \
-					"${D}"/etc/init/metrics_daemon.conf || die
-			fi
-		fi
-	fi
-
-	insinto /usr/$(get_libdir)/pkgconfig
-	local v="$(libchrome_ver)"
-	./platform2_preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}/lib/libmetrics-${v}.so"
-	doins "${OUT}/lib/libmetrics-${v}.pc"
-
-	insinto /usr/include/metrics
-	doins c_metrics_library.h \
-		cumulative_metrics.h \
-		metrics_library{,_mock}.h \
-		persistent_integer.h \
-		timer{,_mock}.h
-
-	# Install the protobuf so that autotests can have access to it.
-	insinto /usr/include/metrics/proto
-	doins uploader/proto/*.proto
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/metrics_library_consent_id_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/metrics_serialization_utils_fuzzer
-}
-
-platform_pkg_test() {
-	# Disable asan container overflow checks that is coming from gtest,
-	# not metrics code, https://crbug.com/1067977 .
-	export ASAN_OPTIONS+=":detect_container_overflow=0:"
-	local tests=(
-		cumulative_metrics_test
-		metrics_library_test
-		$(usex passive_metrics 'metrics_daemon_test' '')
-		persistent_integer_test
-		process_meter_test
-		timer_test
-		upload_service_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
-pkg_preinst() {
-	enewuser metrics
-	enewgroup metrics
-}
diff --git a/chromeos-base/metrics/metrics-0.0.1-r3170.ebuild b/chromeos-base/metrics/metrics-0.0.1-r3170.ebuild
new file mode 100644
index 0000000..cdfece2
--- /dev/null
+++ b/chromeos-base/metrics/metrics-0.0.1-r3170.ebuild
@@ -0,0 +1,106 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk metrics .gn"
+
+PLATFORM_SUBDIR="metrics"
+
+inherit cros-constants cros-workon libchrome-version platform systemd user
+
+DESCRIPTION="Metrics aggregation service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/metrics/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer metrics_uploader +passive_metrics systemd"
+
+COMMON_DEPEND="
+	dev-libs/libpcre:=
+	dev-libs/protobuf:=
+	sys-apps/rootdev:=
+	"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/session_manager-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/vboot_reference:=
+	"
+
+src_install() {
+	dobin "${OUT}"/metrics_client
+	dobin "${OUT}"/chromeos-pgmem
+
+	if use passive_metrics; then
+		dobin "${OUT}"/metrics_daemon
+		if use systemd; then
+			systemd_dounit init/metrics-daemon.service
+			systemd_enable_service multi-user.target metrics-daemon.service
+			systemd_dotmpfilesd init/metrics.conf
+		else
+			insinto /etc/init
+			doins init/metrics_library.conf init/metrics_daemon.conf
+		fi
+
+		if use metrics_uploader; then
+			if use systemd; then
+				sed -i '/ExecStart=/s:metrics_daemon:metrics_daemon -uploader:' \
+					"${D}"/usr/lib/systemd/system/metrics-daemon.service || die
+			else
+				sed -i '/DAEMON_FLAGS=/s:=.*:="-uploader":' \
+					"${D}"/etc/init/metrics_daemon.conf || die
+			fi
+		fi
+	fi
+
+	insinto /usr/$(get_libdir)/pkgconfig
+	local v="$(libchrome_ver)"
+	./platform2_preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}/lib/libmetrics.so"
+	doins "${OUT}/lib/libmetrics.pc"
+
+	insinto /usr/include/metrics
+	doins c_metrics_library.h \
+		cumulative_metrics.h \
+		metrics_library{,_mock}.h \
+		persistent_integer.h \
+		timer{,_mock}.h
+
+	# Install the protobuf so that autotests can have access to it.
+	insinto /usr/include/metrics/proto
+	doins uploader/proto/*.proto
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/metrics_library_consent_id_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/metrics_serialization_utils_fuzzer
+}
+
+platform_pkg_test() {
+	local tests=(
+		cumulative_metrics_test
+		metrics_library_test
+		$(usex passive_metrics 'metrics_daemon_test' '')
+		persistent_integer_test
+		process_meter_test
+		timer_test
+		upload_service_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
+pkg_preinst() {
+	enewuser metrics
+	enewgroup metrics
+}
diff --git a/chromeos-base/metrics/metrics-9999.ebuild b/chromeos-base/metrics/metrics-9999.ebuild
index 7e0f741..46255ae 100644
--- a/chromeos-base/metrics/metrics-9999.ebuild
+++ b/chromeos-base/metrics/metrics-9999.ebuild
@@ -20,7 +20,6 @@
 IUSE="fuzzer metrics_uploader +passive_metrics systemd"
 
 COMMON_DEPEND="
-	dev-libs/dbus-glib:=
 	dev-libs/libpcre:=
 	dev-libs/protobuf:=
 	sys-apps/rootdev:=
@@ -63,8 +62,8 @@
 	insinto /usr/$(get_libdir)/pkgconfig
 	local v="$(libchrome_ver)"
 	./platform2_preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}/lib/libmetrics-${v}.so"
-	doins "${OUT}/lib/libmetrics-${v}.pc"
+	dolib.so "${OUT}/lib/libmetrics.so"
+	doins "${OUT}/lib/libmetrics.pc"
 
 	insinto /usr/include/metrics
 	doins c_metrics_library.h \
@@ -83,9 +82,6 @@
 }
 
 platform_pkg_test() {
-	# Disable asan container overflow checks that is coming from gtest,
-	# not metrics code, https://crbug.com/1067977 .
-	export ASAN_OPTIONS+=":detect_container_overflow=0:"
 	local tests=(
 		cumulative_metrics_test
 		metrics_library_test
diff --git a/chromeos-base/midis/midis-0.0.1-r1078.ebuild b/chromeos-base/midis/midis-0.0.1-r1078.ebuild
deleted file mode 100644
index 60efa2f..0000000
--- a/chromeos-base/midis/midis-0.0.1-r1078.ebuild
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "64d1d51038bce9e10952cbfcac9be688ead19e29" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk midis .gn"
-
-PLATFORM_SUBDIR="midis"
-
-inherit cros-workon git-2 platform user
-
-DESCRIPTION="MIDI Server for Chromium OS"
-HOMEPAGE=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="+seccomp asan fuzzer"
-
-COMMON_DEPEND="
-	media-libs/alsa-lib:=
-	chromeos-base/libbrillo:=[asan?,fuzzer?]
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_unpack() {
-	platform_src_unpack
-
-	EGIT_REPO_URI="${CROS_GIT_HOST_URL}/chromium/src/media/midi.git" \
-	# Since there are a few headers that are included by other headers
-	# in this directory, and these headers are referenced assuming the
-	# "media" directory is stored in the base directory, we install
-	# the Git checkout in platform2.
-	EGIT_SOURCEDIR="${S}/../media/midi" \
-	EGIT_COMMIT="294d224ae7a8a695bb71337be8781b29abb5dafc" \
-	git-2_src_unpack
-}
-
-src_install() {
-	dobin "${OUT}"/midis
-
-	insinto /etc/init
-	doins init/*.conf
-
-	# Install midis DBUS configuration file
-	insinto /etc/dbus-1/system.d
-	doins dbus_permissions/org.chromium.Midis.conf
-
-	# Install D-Bus service activation configuration.
-	insinto /usr/share/dbus-1/system-services
-	doins dbus_permissions/org.chromium.Midis.service
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	use seccomp && newins "seccomp/midis-seccomp-${ARCH}.policy" midis-seccomp.policy
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/midis_seq_handler_fuzzer
-}
-
-pkg_preinst() {
-	enewuser midis
-	enewgroup midis
-}
-
-platform_pkg_test() {
-	local tests=(
-		"midis_testrunner"
-	)
-
-	local test
-	for test in "${tests[@]}"; do
-		platform_test "run" "${OUT}"/${test}
-	done
-}
diff --git a/chromeos-base/midis/midis-0.0.1-r1101.ebuild b/chromeos-base/midis/midis-0.0.1-r1101.ebuild
new file mode 100644
index 0000000..968d51b
--- /dev/null
+++ b/chromeos-base/midis/midis-0.0.1-r1101.ebuild
@@ -0,0 +1,80 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "3a6f1fe5ddd1f4fef3328752754d6b3d0f3bde10" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk midis .gn"
+
+PLATFORM_SUBDIR="midis"
+
+inherit cros-workon git-2 platform user
+
+DESCRIPTION="MIDI Server for Chromium OS"
+HOMEPAGE=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="+seccomp asan fuzzer"
+
+COMMON_DEPEND="
+	media-libs/alsa-lib:=
+	chromeos-base/libbrillo:=[asan?,fuzzer?]
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_unpack() {
+	platform_src_unpack
+
+	EGIT_REPO_URI="${CROS_GIT_HOST_URL}/chromium/src/media/midi.git" \
+	# Since there are a few headers that are included by other headers
+	# in this directory, and these headers are referenced assuming the
+	# "media" directory is stored in the base directory, we install
+	# the Git checkout in platform2.
+	EGIT_SOURCEDIR="${S}/../media/midi" \
+	EGIT_COMMIT="294d224ae7a8a695bb71337be8781b29abb5dafc" \
+	git-2_src_unpack
+}
+
+src_install() {
+	dobin "${OUT}"/midis
+
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install midis DBUS configuration file
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.Midis.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus_permissions/org.chromium.Midis.service
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/midis-seccomp-${ARCH}.policy" midis-seccomp.policy
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/midis_seq_handler_fuzzer
+}
+
+pkg_preinst() {
+	enewuser midis
+	enewgroup midis
+}
+
+platform_pkg_test() {
+	local tests=(
+		"midis_testrunner"
+	)
+
+	local test
+	for test in "${tests[@]}"; do
+		platform_test "run" "${OUT}"/${test}
+	done
+}
diff --git a/chromeos-base/minijail/minijail-14-r8.ebuild b/chromeos-base/minijail/minijail-14-r8.ebuild
deleted file mode 100644
index 2c10c31..0000000
--- a/chromeos-base/minijail/minijail-14-r8.ebuild
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="a42182d5658f60679235e37a3cf6bdb8e598dda8"
-CROS_WORKON_TREE="52499e0eb2a6d3eaac83231e956caf2c68f564aa"
-CROS_WORKON_BLACKLIST=1
-CROS_WORKON_LOCALNAME="aosp/external/minijail"
-CROS_WORKON_PROJECT="platform/external/minijail"
-CROS_WORKON_REPO="https://android.googlesource.com"
-PYTHON_COMPAT=( python3_{6,7} )
-
-# TODO(crbug.com/689060): Re-enable on ARM.
-CROS_COMMON_MK_NATIVE_TEST="yes"
-
-DISTUTILS_OPTIONAL=1
-DISTUTILS_SINGLE_IMPL=1
-
-inherit cros-debug cros-sanitizers cros-workon cros-common.mk toolchain-funcs multilib distutils-r1
-
-DESCRIPTION="helper binary and library for sandboxing & restricting privs of services"
-HOMEPAGE="https://android.googlesource.com/platform/external/minijail"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="asan cros-debug +seccomp test"
-
-COMMON_DEPEND="sys-libs/libcap:=
-	!<chromeos-base/chromeos-minijail-1"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	cros_host? (
-		${PYTHON_DEPS}
-		dev-python/setuptools[${PYTHON_USEDEP}]
-	)
-	test? (
-		dev-cpp/gtest:=
-	)"
-
-src_configure() {
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-	export LIBDIR="/$(get_libdir)"
-	export USE_seccomp=$(usex seccomp)
-	export ALLOW_DEBUG_LOGGING=$(usex cros-debug)
-	export USE_SYSTEM_GTEST=yes
-	export DEFAULT_PIVOT_ROOT=/mnt/empty
-}
-
-# Use qemu-user to run the platform-specific dump_constants binary in order to
-# generate constants.json.
-generate_constants_json() {
-	local cmd
-	case "${ARCH}" in
-	x86)   cmd=( "${OUT}"/dump_constants ) ;;
-	amd64) cmd=( "${WORKDIR}"/sdk/dump_constants ) ;;
-	arm)   cmd=( qemu-arm "${OUT}"/dump_constants ) ;;
-	arm64) cmd=( qemu-aarch64 "${OUT}"/dump_constants ) ;;
-	*) die "Unsupported architecture in generate_constants_json(): ${ARCH}."
-	esac
-	echo "+" "${cmd[@]}" ">${OUT}/constants.json"
-	"${cmd[@]}" >"${OUT}"/constants.json || die
-}
-
-src_compile() {
-	# Avoid confusing people with our docs.
-	sed -i "s:/var/empty:${DEFAULT_PIVOT_ROOT}:g" minijail0.[15] || die
-
-	local minijail_targets=( all )
-
-	# We need to generate & run dump_constants.  Intel/AMD targets often use newer
-	# ISAs than our build systems & QEMU supports.  The constants care about kernel
-	# headers (for the most part), and our build keeps SDK & board headers in sync,
-	# so using the SDK compiler here should be safe for our needs.
-	if ! use cros_host; then
-		if use amd64; then
-			tc-env_build emake OUT="${WORKDIR}/sdk" dump_constants
-		else
-			minijail_targets+=( dump_constants )
-		fi
-	fi
-
-	cros-common.mk_src_compile "${minijail_targets[@]}"
-	if use cros_host ; then
-		BUILD_DIR="${OUT}" distutils-r1_python_compile
-	else
-		generate_constants_json
-	fi
-}
-
-src_install() {
-	into /
-	dosbin "${OUT}"/minijail0
-	dolib.so "${OUT}"/libminijail{,preload}.so
-
-	doman minijail0.[15]
-
-	if use cros_host ; then
-		distutils-r1_python_install
-	else
-		insinto /build/share
-		doins "${OUT}"/constants.json
-	fi
-
-	local include_dir="/usr/include/chromeos"
-
-	"${S}"/platform2_preinstall.sh "${PV}" "${include_dir}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libminijail.pc
-
-	insinto "${include_dir}"
-	doins libminijail.h
-	doins scoped_minijail.h
-}
diff --git a/chromeos-base/minijail/minijail-14-r9.ebuild b/chromeos-base/minijail/minijail-14-r9.ebuild
new file mode 100644
index 0000000..670f1f5
--- /dev/null
+++ b/chromeos-base/minijail/minijail-14-r9.ebuild
@@ -0,0 +1,115 @@
+# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="a42182d5658f60679235e37a3cf6bdb8e598dda8"
+CROS_WORKON_TREE="52499e0eb2a6d3eaac83231e956caf2c68f564aa"
+CROS_WORKON_BLACKLIST=1
+CROS_WORKON_LOCALNAME="aosp/external/minijail"
+CROS_WORKON_PROJECT="platform/external/minijail"
+CROS_WORKON_REPO="https://android.googlesource.com"
+PYTHON_COMPAT=( python3_{6,7} )
+
+# TODO(crbug.com/689060): Re-enable on ARM.
+CROS_COMMON_MK_NATIVE_TEST="yes"
+
+DISTUTILS_OPTIONAL=1
+DISTUTILS_SINGLE_IMPL=1
+
+inherit cros-debug cros-sanitizers cros-workon cros-common.mk toolchain-funcs multilib distutils-r1
+
+DESCRIPTION="helper binary and library for sandboxing & restricting privs of services"
+HOMEPAGE="https://android.googlesource.com/platform/external/minijail"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan cros-debug +seccomp test"
+
+COMMON_DEPEND="sys-libs/libcap:=
+	!<chromeos-base/chromeos-minijail-1"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	cros_host? (
+		${PYTHON_DEPS}
+		$(python_gen_cond_dep 'dev-python/setuptools[${PYTHON_USEDEP}]')
+	)
+	test? (
+		dev-cpp/gtest:=
+	)"
+
+src_configure() {
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+	export LIBDIR="/$(get_libdir)"
+	export USE_seccomp=$(usex seccomp)
+	export ALLOW_DEBUG_LOGGING=$(usex cros-debug)
+	export USE_SYSTEM_GTEST=yes
+	export DEFAULT_PIVOT_ROOT=/mnt/empty
+}
+
+# Use qemu-user to run the platform-specific dump_constants binary in order to
+# generate constants.json.
+generate_constants_json() {
+	local cmd
+	case "${ARCH}" in
+	x86)   cmd=( "${OUT}"/dump_constants ) ;;
+	amd64) cmd=( "${WORKDIR}"/sdk/dump_constants ) ;;
+	arm)   cmd=( qemu-arm "${OUT}"/dump_constants ) ;;
+	arm64) cmd=( qemu-aarch64 "${OUT}"/dump_constants ) ;;
+	*) die "Unsupported architecture in generate_constants_json(): ${ARCH}."
+	esac
+	echo "+" "${cmd[@]}" ">${OUT}/constants.json"
+	"${cmd[@]}" >"${OUT}"/constants.json || die
+}
+
+src_compile() {
+	# Avoid confusing people with our docs.
+	sed -i "s:/var/empty:${DEFAULT_PIVOT_ROOT}:g" minijail0.[15] || die
+
+	local minijail_targets=( all )
+
+	# We need to generate & run dump_constants.  Intel/AMD targets often use newer
+	# ISAs than our build systems & QEMU supports.  The constants care about kernel
+	# headers (for the most part), and our build keeps SDK & board headers in sync,
+	# so using the SDK compiler here should be safe for our needs.
+	if ! use cros_host; then
+		if use amd64; then
+			tc-env_build emake OUT="${WORKDIR}/sdk" dump_constants
+		else
+			minijail_targets+=( dump_constants )
+		fi
+	fi
+
+	cros-common.mk_src_compile "${minijail_targets[@]}"
+	if use cros_host ; then
+		BUILD_DIR="${OUT}" distutils-r1_python_compile
+	else
+		generate_constants_json
+	fi
+}
+
+src_install() {
+	into /
+	dosbin "${OUT}"/minijail0
+	dolib.so "${OUT}"/libminijail{,preload}.so
+
+	doman minijail0.[15]
+
+	if use cros_host ; then
+		distutils-r1_python_install
+	else
+		insinto /build/share
+		doins "${OUT}"/constants.json
+	fi
+
+	local include_dir="/usr/include/chromeos"
+
+	"${S}"/platform2_preinstall.sh "${PV}" "${include_dir}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libminijail.pc
+
+	insinto "${include_dir}"
+	doins libminijail.h
+	doins scoped_minijail.h
+}
diff --git a/chromeos-base/minijail/minijail-9999.ebuild b/chromeos-base/minijail/minijail-9999.ebuild
index d1b7da6..858d501 100644
--- a/chromeos-base/minijail/minijail-9999.ebuild
+++ b/chromeos-base/minijail/minijail-9999.ebuild
@@ -30,7 +30,7 @@
 DEPEND="${COMMON_DEPEND}
 	cros_host? (
 		${PYTHON_DEPS}
-		dev-python/setuptools[${PYTHON_USEDEP}]
+		$(python_gen_cond_dep 'dev-python/setuptools[${PYTHON_USEDEP}]')
 	)
 	test? (
 		dev-cpp/gtest:=
diff --git a/chromeos-base/mist/mist-0.0.1-r2972.ebuild b/chromeos-base/mist/mist-0.0.1-r2972.ebuild
deleted file mode 100644
index d906883..0000000
--- a/chromeos-base/mist/mist-0.0.1-r2972.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "9ef32eb58f117f5abf6270c6a7427e260d555040" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk metrics mist .gn"
-
-PLATFORM_SUBDIR="mist"
-
-inherit cros-workon platform udev
-
-DESCRIPTION="Chromium OS Modem Interface Switching Tool"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mist/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/libbrillo:=[udev]
-	chromeos-base/metrics
-	dev-libs/protobuf:=
-	net-dialup/ppp
-	virtual/libusb:1
-	virtual/udev
-"
-
-DEPEND="${RDEPEND}"
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/mist_testrunner"
-}
-
-src_install() {
-	dobin "${OUT}"/mist
-
-	insinto /usr/share/mist
-	doins default.conf
-
-	udev_dorules 51-mist.rules
-}
diff --git a/chromeos-base/mist/mist-0.0.1-r3007.ebuild b/chromeos-base/mist/mist-0.0.1-r3007.ebuild
new file mode 100644
index 0000000..c4f2e64
--- /dev/null
+++ b/chromeos-base/mist/mist-0.0.1-r3007.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "ccdaebbb41bf6e93cb1bba09429832ab22486732" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk metrics mist .gn"
+
+PLATFORM_SUBDIR="mist"
+
+inherit cros-workon platform udev
+
+DESCRIPTION="Chromium OS Modem Interface Switching Tool"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mist/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	chromeos-base/libbrillo:=[udev]
+	>=chromeos-base/metrics-0.0.1-r3152
+	dev-libs/protobuf:=
+	net-dialup/ppp
+	virtual/libusb:1
+	virtual/udev
+"
+
+DEPEND="${RDEPEND}"
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/mist_testrunner"
+}
+
+src_install() {
+	dobin "${OUT}"/mist
+
+	insinto /usr/share/mist
+	doins default.conf
+
+	udev_dorules 51-mist.rules
+}
diff --git a/chromeos-base/mist/mist-9999.ebuild b/chromeos-base/mist/mist-9999.ebuild
index 4e3ce249..327cfe0 100644
--- a/chromeos-base/mist/mist-9999.ebuild
+++ b/chromeos-base/mist/mist-9999.ebuild
@@ -23,7 +23,7 @@
 
 RDEPEND="
 	chromeos-base/libbrillo:=[udev]
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	dev-libs/protobuf:=
 	net-dialup/ppp
 	virtual/libusb:1
diff --git a/chromeos-base/ml-benchmark/ml-benchmark-0.0.1-r30.ebuild b/chromeos-base/ml-benchmark/ml-benchmark-0.0.1-r30.ebuild
new file mode 100644
index 0000000..005661d
--- /dev/null
+++ b/chromeos-base/ml-benchmark/ml-benchmark-0.0.1-r30.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1ffd1e25331328c023394a4a459ba08c7752af68" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk ml_benchmark .gn"
+
+DESCRIPTION="Chrome OS ML Benchmarking Suite"
+
+PLATFORM_SUBDIR="ml_benchmark"
+
+inherit cros-workon platform
+
+RDEPEND=""
+
+DEPEND="
+	${RDEPEND}
+"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+src_install() {
+	dobin "${OUT}"/ml_benchmark
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/ml_benchmark_test"
+}
diff --git a/chromeos-base/ml_benchmark/ml_benchmark-9999.ebuild b/chromeos-base/ml-benchmark/ml-benchmark-9999.ebuild
similarity index 100%
rename from chromeos-base/ml_benchmark/ml_benchmark-9999.ebuild
rename to chromeos-base/ml-benchmark/ml-benchmark-9999.ebuild
diff --git a/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r26.ebuild b/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r26.ebuild
deleted file mode 100644
index deb273b..0000000
--- a/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r26.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="79b34a48b1f0e24ce225221fe5ba2622e3b2bbd6"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "49804038485c0749f93e123372c4c10bc57db006" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk ml .gn"
-
-PLATFORM_SUBDIR="ml"
-
-inherit cros-workon platform
-
-DESCRIPTION="Command line interface to machine learning service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ml"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-SLOT="0/0"
-
-RDEPEND="
-	chromeos-base/chrome-icu:=
-	chromeos-base/metrics:=
-	chromeos-base/ml:=
-	sci-libs/tensorflow:=
-"
-
-DEPEND="
-	${RDEPEND}
-"
-
-src_install() {
-	dobin "${OUT}"/ml_cmdline
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/ml_cmdline_test"
-}
diff --git a/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r64.ebuild b/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r64.ebuild
new file mode 100644
index 0000000..982e95e
--- /dev/null
+++ b/chromeos-base/ml-cmdline/ml-cmdline-0.0.1-r64.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fbe2824c52ff947a4e8ddbb5f43955fec773daa3" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk ml .gn"
+
+PLATFORM_SUBDIR="ml"
+
+inherit cros-workon platform
+
+DESCRIPTION="Command line interface to machine learning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ml"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+SLOT="0/0"
+
+RDEPEND="
+	chromeos-base/chrome-icu:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/ml:=
+	sci-libs/tensorflow:=
+"
+
+DEPEND="
+	${RDEPEND}
+"
+
+src_install() {
+	dobin "${OUT}"/ml_cmdline
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/ml_cmdline_test"
+}
diff --git a/chromeos-base/ml-cmdline/ml-cmdline-9999.ebuild b/chromeos-base/ml-cmdline/ml-cmdline-9999.ebuild
index 412ffc3..48cc0f9 100644
--- a/chromeos-base/ml-cmdline/ml-cmdline-9999.ebuild
+++ b/chromeos-base/ml-cmdline/ml-cmdline-9999.ebuild
@@ -20,7 +20,7 @@
 
 RDEPEND="
 	chromeos-base/chrome-icu:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/ml:=
 	sci-libs/tensorflow:=
 "
diff --git a/chromeos-base/ml-test-assets/Manifest b/chromeos-base/ml-test-assets/Manifest
new file mode 100644
index 0000000..fa5efee
--- /dev/null
+++ b/chromeos-base/ml-test-assets/Manifest
@@ -0,0 +1,2 @@
+DIST aosp-mlts-models-7331369.tar.xz 265464352 BLAKE2B 3dfff60bb5374bf791a20592af5fb21545747a70edf12c499118edb5f6e03d3e1e990cf17fd70c84f5de7c183933070c2eefdf150d34e74955db3942329cad1a SHA512 1c7a64cbd7cc400536a7bbdd6adc821f681d34c40663515bcd7178fcc6c2f30e08cd2e58c1de5bbd531e27415f7fdeaa414b2705ceafcabee4bbf28b2ced7239
+DIST ml-test-assets-label-image-assets_20200721.tar.xz 16152608 BLAKE2B 49bb20e800f02d848bc5abc0ea39944cec8d40de3106c28dc8ae44f34e914a21fb1e65af42f4ac41621e1821d3431bf05b9f981c527a88a9a8b023d34b00e995 SHA512 049e19e36b43e2a9a90eaf02ab933aac2278dde9228a6c0e9fb3a6701e006823f271ff21b864bb736172fd3ae3ecb0689f57cb5c4c96bdfbd9bdae03673b248d
diff --git a/chromeos-base/ml-test-assets/ml-test-assets-0.0.1.ebuild b/chromeos-base/ml-test-assets/ml-test-assets-0.0.1.ebuild
new file mode 100644
index 0000000..3624a88
--- /dev/null
+++ b/chromeos-base/ml-test-assets/ml-test-assets-0.0.1.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="TFLite models and supporting assets used for testing ML & NNAPI."
+HOMEPAGE="https://chromium.googlesource.com/aosp/platform/test/mlts/models/"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE="label_image benchmark_model"
+
+# Basic test model (mobilenet.tflite, grace_hopper.bmp, labels.txt)
+LABEL_IMAGE_TARBALL="ml-test-assets-label-image-assets_20200721.tar.xz"
+
+# Models from https://android.googlesource.com/platform/test/mlts/models
+# tarball is from commit 73313692ee90e6d768cd086fbb7c94298ecaf1ac 2020-07-03
+AOSP_MLTS_MODELS_TARBALL="aosp-mlts-models-7331369.tar.xz"
+
+SRC_URI="
+	label_image? ( gs://chromeos-localmirror/distfiles/${LABEL_IMAGE_TARBALL} )
+	benchmark_model? ( gs://chromeos-localmirror/distfiles/${AOSP_MLTS_MODELS_TARBALL} )
+"
+
+S="${WORKDIR}"
+
+src_install() {
+	if use label_image || use benchmark_model; then
+		insinto /usr/share/ml-test-assets
+		doins -r ./*
+	fi
+}
diff --git a/chromeos-base/ml/Manifest b/chromeos-base/ml/Manifest
index 75549cc..b6792c0 100644
--- a/chromeos-base/ml/Manifest
+++ b/chromeos-base/ml/Manifest
@@ -1,3 +1,4 @@
+DIST mlservice-model-language_identification-20190924.smfb 372592 BLAKE2B 4cb5070c5e0bdef7c5a5f34c6e41f1e39173542e1c9e7cc2ec68631f1bdfb239229a07b95fc8e3cc68ab0d85b0aa5430ac8ce525a93e1b092862b51930d84629 SHA512 665f59a984910a6318b22873faec2e065c906bb514a8f0f447d18663975c8840b08d91e3ad09ef447c94d582ba302729772f39f252de08901ef1280c66d02db2
 DIST mlservice-model-search_ranker-20190923.tflite 4224 BLAKE2B cff618e356bedeba67648f499d549fc4cf9446565e17316e5ec159b2e7a8d1e2009eec6894a236b8445171a5606b3472abb749efcbab60427b232eef200e0d1c SHA512 d3f90d9bc3e560d251eb3124e58822c4e798b1b220899d0f7b045289d98f558cfc4cbf9d0ad6c4b50565f89c34b8aaa5f0b85a5873551c1f909bf904191046e5
 DIST mlservice-model-smart_dim-20181115.tflite 56252 BLAKE2B 6a5271f1f32615c8cb3c3a0a790442250a497caecd81f89c59e7893b4042a91788d34d84a38f5447c8c82426b4b482a27837e118287fbd82f2265d7d90536521 SHA512 f8a55663de6f023bd85a7235957b398558b1beb2be701fe65b86325dc455a77da657d635ca7c11f40d73df044bd51c0fdc2d4301c32935453cf501a1f60698c6
 DIST mlservice-model-smart_dim-20190221.tflite 197532 BLAKE2B 671c3740ec601ba43384f7fa342ec9f3a9c9b3e213fdfb1e2ca229e57c96f262f5ceabc5b89258ecd96fdf36fe51685408e0a6bbe9044e2580d506d9a152b3ec SHA512 44b5eabe32bf7e0ca5c1ecc72db8d292dbe9d6d9e2f8a973bacbd0aee77db484e2c4064be3f3b0a055c4309c340266128b8bf61f85b9f61f421b0fe66fd51f99
@@ -5,4 +6,5 @@
 DIST mlservice-model-smart_dim-20200206-downloadable.tflite 23336 BLAKE2B 46253c1186a87e1e793f67c7acdf288c89f6a094907a4013dd6008695be94360c2d7c5be70c017e2283e00aa6656a6380fe98c664b4fba03174db63a1791019a SHA512 3dadce228039787075ba85cf67e7f81fa765032d92fdeda2e91f65775656da22dadf59f1ffb33465405fabd96f27c306136906b04ace4c4c2fa4814e0538f98d
 DIST mlservice-model-test_add-20180914.tflite 456 BLAKE2B cefc03b4ecf5105ac695c29c0eafb56a6aac65ccea118e35ec88c89473fb1b83dc6b5e56886c5726b97e146c4168e5d5cd91a761e32fea9f7d374d20b154d2c3 SHA512 453b52b57706030476a555e0d48c8d3f54f590ffd3ee7064c33bc343adb37ab86a9342b84d786fb7dedc7c60c00dd78d63f38f35c07f7e7548cd3f052fcb2d6f
 DIST mlservice-model-text_classifier_en-v706.fb 565184 BLAKE2B f65e39491ca2500e0afd850435842ff85c0c00b95aeed6dd75595606a0076e91deb6e461ccf7ed64ff3b751081084f5aab175bed2f7450b69b5f11210a6912b0 SHA512 bf7f53b84b9627b035ec4a4b61be5b9ac380af7b2c7ff557a97e62a53a3a3f90abd2e1fc6d6d6e18e5b705299e3402cb35aefc109142360681f12720671caffb
+DIST mlservice-model-text_classifier_en-v711.fb 568384 BLAKE2B 7771cfe3b5b3dc7ad3269bff606877765d79e111d55eb124372a39260c9ba46507c457e70fa6250067e0869225ca48ddeda13914998cb835bd061b29d8d0847a SHA512 83414a5fa057c72769c89094147a81c4b383d8f73e3c1f9f6edbe4c45fed1a5c60a9fb338986f335ba863fef05eb8197c7f5dd96ccb2c1a2b336e1c206028f2c
 DIST mlservice-model-top_cat-20190722.tflite 14568 BLAKE2B f538a40d5c27d9f4d71cc236f681d60442b503a3b957906b8e514ae312052757a54d97b5d1df34e13e48a0303a254f6d3c864d0a9c3a0b4530faeacb534894bc SHA512 e85cacb57c79bc0494474dddc6615dff2f25758cb2f11c2cb6a04bc39190990aee31b3d511b399f85cbee31409f591f41bb52c340be4510ed76882ff68add3da
diff --git a/chromeos-base/ml/ml-0.0.1-r324.ebuild b/chromeos-base/ml/ml-0.0.1-r324.ebuild
deleted file mode 100644
index 3428ab1..0000000
--- a/chromeos-base/ml/ml-0.0.1-r324.ebuild
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="79b34a48b1f0e24ce225221fe5ba2622e3b2bbd6"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "49804038485c0749f93e123372c4c10bc57db006" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-# TODO(amoylan): Set CROS_WORKON_OUTOFTREE_BUILD=1 after crbug.com/833675.
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk ml .gn"
-
-PLATFORM_SUBDIR="ml"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Machine learning service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ml"
-
-# Clients of the ML service should place the URIs of their model files into
-# MODELS_TO_INSTALL if they are installed into rootfs (built-in models), or
-# DOWNLOADABLE_MODELS if they are downloaded via component updater (downloadable
-# models).
-MODELS_TO_INSTALL=(
-	"gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v706.fb"
-)
-
-DOWNLOADABLE_MODELS=(
-	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite"
-)
-
-SRC_URI="
-	${DOWNLOADABLE_MODELS[*]}
-	${MODELS_TO_INSTALL[*]}
-"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="
-	fuzzer
-	nnapi
-	ondevice_handwriting
-"
-
-RDEPEND="
-	chromeos-base/chrome-icu:=
-	chromeos-base/libbrillo:=
-	chromeos-base/metrics:=
-	nnapi? ( chromeos-base/aosp-frameworks-ml-nn )
-	dev-libs/libhandwriting:=[ondevice_handwriting=]
-	dev-libs/libtextclassifier:=
-	sci-libs/tensorflow:=
-"
-
-DEPEND="
-	${RDEPEND}
-	chromeos-base/system_api:=[fuzzer?]
-	dev-cpp/absl:=
-"
-
-src_install() {
-	dobin "${OUT}"/ml_service
-
-	# Install upstart configuration.
-	insinto /etc/init
-	doins init/*.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp/ml_service-seccomp-${ARCH}.policy" ml_service-seccomp.policy
-
-	# Install D-Bus configuration file.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.MachineLearning.conf
-
-	# Install D-Bus service activation configuration.
-	insinto /usr/share/dbus-1/system-services
-	doins dbus/org.chromium.MachineLearning.service
-
-	# Create distfile array of model filepaths.
-	local model_files=( "${MODELS_TO_INSTALL[@]##*/}" )
-	local distfile_array=( "${model_files[@]/#/${DISTDIR}/}" )
-
-	# Install system ML models.
-	insinto /opt/google/chrome/ml_models
-	doins "${distfile_array[@]}"
-
-	# Install system ML models to fuzzer dir.
-	insinto /usr/libexec/fuzzers
-	doins "${distfile_array[@]}"
-
-	# Install fuzzer targets.
-	for fuzzer in "${OUT}"/*_fuzzer; do
-		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
-	done
-}
-
-pkg_preinst() {
-	enewuser "ml-service"
-	enewgroup "ml-service"
-}
-
-platform_pkg_test() {
-	# Recreate model dir in the temp directory and copy both
-	# MODELS_TO_INSTALL and DOWNLOADABLE_MODELS into it for use in unit
-	# tests.
-	mkdir "${T}/ml_models" || die
-	local all_test_models=( "${DOWNLOADABLE_MODELS[@]}" "${MODELS_TO_INSTALL[@]}" )
-	local distfile_uri
-	for distfile_uri in "${all_test_models[@]}"; do
-		cp "${DISTDIR}/${distfile_uri##*/}" "${T}/ml_models" || die
-	done
-
-	platform_test "run" "${OUT}/ml_service_test"
-}
diff --git a/chromeos-base/ml/ml-0.0.1-r364.ebuild b/chromeos-base/ml/ml-0.0.1-r364.ebuild
new file mode 100644
index 0000000..b7a3b3b
--- /dev/null
+++ b/chromeos-base/ml/ml-0.0.1-r364.ebuild
@@ -0,0 +1,125 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "fbe2824c52ff947a4e8ddbb5f43955fec773daa3" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+# TODO(amoylan): Set CROS_WORKON_OUTOFTREE_BUILD=1 after crbug.com/833675.
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk ml .gn"
+
+PLATFORM_SUBDIR="ml"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Machine learning service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ml"
+
+# Clients of the ML service should place the URIs of their model files into
+# MODELS_TO_INSTALL if they are installed into rootfs (built-in models), or
+# DOWNLOADABLE_MODELS if they are downloaded via component updater (downloadable
+# models).
+MODELS_TO_INSTALL=(
+	"gs://chromeos-localmirror/distfiles/mlservice-model-language_identification-20190924.smfb"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v711.fb"
+)
+
+DOWNLOADABLE_MODELS=(
+	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite"
+)
+
+SRC_URI="
+	${DOWNLOADABLE_MODELS[*]}
+	${MODELS_TO_INSTALL[*]}
+"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="
+	fuzzer
+	nnapi
+	ondevice_handwriting
+	ondevice_handwriting_dlc
+	ondevice_speech
+"
+
+RDEPEND="
+	chromeos-base/chrome-icu:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	ondevice_speech? ( chromeos-base/libsoda:= )
+	nnapi? ( chromeos-base/aosp-frameworks-ml-nn )
+	dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=]
+	dev-libs/libtextclassifier:=
+	sci-libs/tensorflow:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+	dev-cpp/absl:=
+	dev-libs/libutf:=
+"
+
+src_install() {
+	dobin "${OUT}"/ml_service
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/ml_service-seccomp-${ARCH}.policy" ml_service-seccomp.policy
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.MachineLearning.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus/org.chromium.MachineLearning.service
+
+	# Create distfile array of model filepaths.
+	local model_files=( "${MODELS_TO_INSTALL[@]##*/}" )
+	local distfile_array=( "${model_files[@]/#/${DISTDIR}/}" )
+
+	# Install system ML models.
+	insinto /opt/google/chrome/ml_models
+	doins "${distfile_array[@]}"
+
+	# Install system ML models to fuzzer dir.
+	insinto /usr/libexec/fuzzers
+	doins "${distfile_array[@]}"
+
+	# Install fuzzer targets.
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+pkg_preinst() {
+	enewuser "ml-service"
+	enewgroup "ml-service"
+}
+
+platform_pkg_test() {
+	# Recreate model dir in the temp directory and copy both
+	# MODELS_TO_INSTALL and DOWNLOADABLE_MODELS into it for use in unit
+	# tests.
+	mkdir "${T}/ml_models" || die
+	local all_test_models=( "${DOWNLOADABLE_MODELS[@]}" "${MODELS_TO_INSTALL[@]}" )
+	local distfile_uri
+	for distfile_uri in "${all_test_models[@]}"; do
+		cp "${DISTDIR}/${distfile_uri##*/}" "${T}/ml_models" || die
+	done
+
+	platform_test "run" "${OUT}/ml_service_test"
+}
diff --git a/chromeos-base/ml/ml-9999.ebuild b/chromeos-base/ml/ml-9999.ebuild
index 05d35a0..3213487 100644
--- a/chromeos-base/ml/ml-9999.ebuild
+++ b/chromeos-base/ml/ml-9999.ebuild
@@ -20,13 +20,14 @@
 # DOWNLOADABLE_MODELS if they are downloaded via component updater (downloadable
 # models).
 MODELS_TO_INSTALL=(
+	"gs://chromeos-localmirror/distfiles/mlservice-model-language_identification-20190924.smfb"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite"
 	"gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite"
-	"gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v706.fb"
+	"gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v711.fb"
 )
 
 DOWNLOADABLE_MODELS=(
@@ -44,14 +45,16 @@
 	fuzzer
 	nnapi
 	ondevice_handwriting
+	ondevice_handwriting_dlc
+	ondevice_speech
 "
 
 RDEPEND="
 	chromeos-base/chrome-icu:=
-	chromeos-base/libbrillo:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	ondevice_speech? ( chromeos-base/libsoda:= )
 	nnapi? ( chromeos-base/aosp-frameworks-ml-nn )
-	dev-libs/libhandwriting:=[ondevice_handwriting=]
+	dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=]
 	dev-libs/libtextclassifier:=
 	sci-libs/tensorflow:=
 "
@@ -60,6 +63,7 @@
 	${RDEPEND}
 	chromeos-base/system_api:=[fuzzer?]
 	dev-cpp/absl:=
+	dev-libs/libutf:=
 "
 
 src_install() {
diff --git a/chromeos-base/ml_benchmark/ml_benchmark-0.0.1-r3.ebuild b/chromeos-base/ml_benchmark/ml_benchmark-0.0.1-r3.ebuild
deleted file mode 100644
index c218047..0000000
--- a/chromeos-base/ml_benchmark/ml_benchmark-0.0.1-r3.ebuild
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="862dd12ce178d5299cc8843332b86e0ef7e56189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a6b68647eba93cad8f83eaddc189a4958d4922c8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk ml_benchmark .gn"
-
-DESCRIPTION="Chrome OS ML Benchmarking Suite"
-
-PLATFORM_SUBDIR="ml_benchmark"
-
-inherit cros-workon platform
-
-RDEPEND=""
-
-DEPEND="
-	${RDEPEND}
-"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-src_install() {
-	dobin "${OUT}"/ml_benchmark
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/ml_benchmark_test"
-}
diff --git a/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2799.ebuild b/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2799.ebuild
deleted file mode 100644
index 61ca031..0000000
--- a/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2799.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="3595c910ca9da29952c7f20ac43900617aa92a94"
-CROS_WORKON_TREE="8b44809749b042602e4d50ebef022ce9d02360d7"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="modem-utilities"
-
-inherit cros-workon
-
-DESCRIPTION="Chromium OS modem utilities"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/modem-utilities/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	sys-apps/dbus:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/modem-utilities"
-}
diff --git a/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2804.ebuild b/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2804.ebuild
new file mode 100644
index 0000000..898e5ce
--- /dev/null
+++ b/chromeos-base/modem-utilities/modem-utilities-0.0.1-r2804.ebuild
@@ -0,0 +1,30 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="3c2dd28f478bdc8fe3a9761ddae3d92e8374716b"
+CROS_WORKON_TREE="ab52f957fb301718e36c0891fe21e2b6d3c0fc60"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="modem-utilities"
+
+inherit cros-workon
+
+DESCRIPTION="Chromium OS modem utilities"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/modem-utilities/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	sys-apps/dbus:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/modem-utilities"
+}
diff --git a/chromeos-base/modemfwd/modemfwd-0.0.1-r672.ebuild b/chromeos-base/modemfwd/modemfwd-0.0.1-r672.ebuild
deleted file mode 100644
index 2baa2ff..0000000
--- a/chromeos-base/modemfwd/modemfwd-0.0.1-r672.ebuild
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "a76919559e19831ca5286cc1fd0f9366be6fa3cb" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk chromeos-config modemfwd .gn"
-
-PLATFORM_SUBDIR="modemfwd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Modem firmware updater daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/modemfwd"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-COMMON_DEPEND="
-	app-arch/xz-utils:=
-	chromeos-base/chromeos-config:=
-	chromeos-base/chromeos-config-tools:=
-	dev-libs/protobuf:=
-	net-misc/modemmanager-next:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-"
-
-src_install() {
-	dobin "${OUT}/modemfwd"
-
-	# Upstart configuration
-	insinto /etc/init
-	doins modemfwd.conf
-
-	# DBus configuration
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.Modemfwd.conf
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firmware_manifest_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firmware_manifest_v2_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/modemfw_test"
-}
diff --git a/chromeos-base/modemfwd/modemfwd-0.0.1-r729.ebuild b/chromeos-base/modemfwd/modemfwd-0.0.1-r729.ebuild
new file mode 100644
index 0000000..cf5c961
--- /dev/null
+++ b/chromeos-base/modemfwd/modemfwd-0.0.1-r729.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "c261b7898d3629af497138c6357ba0bab49115b7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk chromeos-config modemfwd .gn"
+
+PLATFORM_SUBDIR="modemfwd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Modem firmware updater daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/modemfwd"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	app-arch/xz-utils:=
+	chromeos-base/chromeos-config:=
+	chromeos-base/chromeos-config-tools:=
+	dev-libs/protobuf:=
+	net-misc/modemmanager-next:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+"
+
+src_install() {
+	dobin "${OUT}/modemfwd"
+
+	# Upstart configuration
+	insinto /etc/init
+	doins modemfwd.conf
+
+	# DBus configuration
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.Modemfwd.conf
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firmware_manifest_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firmware_manifest_v2_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/modemfw_test"
+}
diff --git a/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r395.ebuild b/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r395.ebuild
deleted file mode 100644
index ca7c057..0000000
--- a/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r395.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "dc359f62190859acb79503bcc7661653dabb088f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk arc/mount-passthrough .gn"
-
-PLATFORM_SUBDIR="arc/mount-passthrough"
-
-inherit cros-workon platform
-
-DESCRIPTION="Mounts the specified directory with different owner UID and GID"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/mount-passthrough"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="sys-fs/fuse:=
-	sys-libs/libcap:="
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_install() {
-	dobin "${OUT}"/mount-passthrough
-	dobin mount-passthrough-jailed
-}
diff --git a/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r417.ebuild b/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r417.ebuild
new file mode 100644
index 0000000..272662c
--- /dev/null
+++ b/chromeos-base/mount-passthrough/mount-passthrough-0.0.2-r417.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "a55068ee019dfa1a7caf52bfe47345ab5c15bb61" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk arc/mount-passthrough .gn"
+
+PLATFORM_SUBDIR="arc/mount-passthrough"
+
+inherit cros-workon platform
+
+DESCRIPTION="Mounts the specified directory with different owner UID and GID"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/mount-passthrough"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="sys-fs/fuse:=
+	sys-libs/libcap:="
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_install() {
+	dobin "${OUT}"/mount-passthrough
+	dobin mount-passthrough-jailed
+}
diff --git a/chromeos-base/mri_package/mri_package-0.0.1-r205.ebuild b/chromeos-base/mri_package/mri_package-0.0.1-r205.ebuild
deleted file mode 100644
index e1397fc..0000000
--- a/chromeos-base/mri_package/mri_package-0.0.1-r205.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7c1fd86161f63c2f26e67281335e3fcce788f75b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="common-mk media_perception .gn"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-PLATFORM_SUBDIR="media_perception"
-
-inherit cros-workon platform udev user
-
-LIB_VERSION=72.0.0
-
-DESCRIPTION="Media perception service"
-SRC_URI="internal? ( gs://chromeos-localmirror-private/distfiles/${PN}-${LIB_VERSION}.tar.gz )"
-RESTRICT="mirror"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="internal"
-
-RDEPEND="
-	media-sound/adhd:=
-	>=sys-apps/dbus-1.0:=
-"
-DEPEND="${RDEPEND}"
-
-src_unpack() {
-	if use internal; then
-		unpack "${A}"
-	fi
-
-	platform_src_unpack
-}
-
-src_compile() {
-	if use internal; then
-		# Copy the library downloaded from chromeos-localmirror-private to the
-		# platform compile directory.
-		cp "${WORKDIR}"/librtanalytics.so "${OUT}" || die
-	fi
-
-	platform_src_compile
-}
-
-pkg_preinst() {
-	enewgroup rtanalytics
-	enewuser rtanalytics
-	enewgroup apex-access
-}
-
-src_install() {
-	insinto /etc/init/
-	doins "${FILESDIR}"/rtanalytics.conf
-
-	insinto /etc/dbus-1/system.d/
-	doins "${FILESDIR}"/org.chromium.MediaPerception.conf
-
-	insinto /usr/share/policy/
-	doins "${FILESDIR}"/rtanalytics.policy
-
-	udev_dorules "${FILESDIR}"/99-apex.rules
-}
diff --git a/chromeos-base/mri_package/mri_package-0.0.1-r229.ebuild b/chromeos-base/mri_package/mri_package-0.0.1-r229.ebuild
new file mode 100644
index 0000000..ccbdb9f
--- /dev/null
+++ b/chromeos-base/mri_package/mri_package-0.0.1-r229.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "3c23a870bdaa35b4af1c4760cd7d1129726712f4" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk media_perception .gn"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+PLATFORM_SUBDIR="media_perception"
+
+inherit cros-workon platform udev user
+
+LIB_VERSION=72.0.0
+
+DESCRIPTION="Media perception service"
+SRC_URI="internal? ( gs://chromeos-localmirror-private/distfiles/${PN}-${LIB_VERSION}.tar.gz )"
+RESTRICT="mirror"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="internal"
+
+RDEPEND="
+	media-sound/adhd:=
+	>=sys-apps/dbus-1.0:=
+"
+DEPEND="${RDEPEND}"
+
+src_unpack() {
+	if use internal; then
+		unpack "${A}"
+	fi
+
+	platform_src_unpack
+}
+
+src_compile() {
+	if use internal; then
+		# Copy the library downloaded from chromeos-localmirror-private to the
+		# platform compile directory.
+		cp "${WORKDIR}"/librtanalytics.so "${OUT}" || die
+	fi
+
+	platform_src_compile
+}
+
+pkg_preinst() {
+	enewgroup rtanalytics
+	enewuser rtanalytics
+	enewgroup apex-access
+}
+
+src_install() {
+	insinto /etc/init/
+	doins "${FILESDIR}"/rtanalytics.conf
+
+	insinto /etc/dbus-1/system.d/
+	doins "${FILESDIR}"/org.chromium.MediaPerception.conf
+
+	insinto /usr/share/policy/
+	doins "${FILESDIR}"/rtanalytics.policy
+
+	udev_dorules "${FILESDIR}"/99-apex.rules
+}
diff --git a/chromeos-base/mtpd/mtpd-0.0.1-r849.ebuild b/chromeos-base/mtpd/mtpd-0.0.1-r849.ebuild
deleted file mode 100644
index 26a07d79..0000000
--- a/chromeos-base/mtpd/mtpd-0.0.1-r849.ebuild
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "3689bf93ea5672dc8b5cf79396478051ecd7b4ff" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk mtpd .gn"
-PLATFORM_SUBDIR="mtpd"
-PLATFORM_NATIVE_TEST="yes"
-
-inherit cros-workon platform systemd user
-
-DESCRIPTION="MTP daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mtpd"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-asan +seccomp systemd test"
-
-COMMON_DEPEND="
-	dev-libs/protobuf:=
-	media-libs/libmtp:=
-	virtual/udev
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/system_api:="
-
-src_install() {
-	dosbin "${OUT}"/mtpd
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	use seccomp && newins "mtpd-seccomp-${ARCH}.policy" mtpd-seccomp.policy
-
-	# Install the init scripts.
-	if use systemd; then
-		systemd_dounit mtpd.service
-		systemd_enable_service system-services.target mtpd.service
-	else
-		insinto /etc/init
-		doins mtpd.conf
-	fi
-
-	# Install D-Bus config file.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.Mtpd.conf
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/mtpd_testrunner"
-}
-
-pkg_preinst() {
-	enewuser "mtp"
-	enewgroup "mtp"
-}
diff --git a/chromeos-base/mtpd/mtpd-0.0.1-r871.ebuild b/chromeos-base/mtpd/mtpd-0.0.1-r871.ebuild
new file mode 100644
index 0000000..fe0e1b9
--- /dev/null
+++ b/chromeos-base/mtpd/mtpd-0.0.1-r871.ebuild
@@ -0,0 +1,63 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aae1a9eda9e453186a2a1ec50a5fa0c175c45a57" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk mtpd .gn"
+PLATFORM_SUBDIR="mtpd"
+PLATFORM_NATIVE_TEST="yes"
+
+inherit cros-workon platform systemd user
+
+DESCRIPTION="MTP daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/mtpd"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-asan +seccomp systemd test"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+	media-libs/libmtp:=
+	virtual/udev
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/system_api:="
+
+src_install() {
+	dosbin "${OUT}"/mtpd
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "mtpd-seccomp-${ARCH}.policy" mtpd-seccomp.policy
+
+	# Install the init scripts.
+	if use systemd; then
+		systemd_dounit mtpd.service
+		systemd_enable_service system-services.target mtpd.service
+	else
+		insinto /etc/init
+		doins mtpd.conf
+	fi
+
+	# Install D-Bus config file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.Mtpd.conf
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/mtpd_testrunner"
+}
+
+pkg_preinst() {
+	enewuser "mtp"
+	enewgroup "mtp"
+}
diff --git a/chromeos-base/mttools/mttools-0.0.1-r159.ebuild b/chromeos-base/mttools/mttools-0.0.1-r159.ebuild
deleted file mode 100644
index a75c4db..0000000
--- a/chromeos-base/mttools/mttools-0.0.1-r159.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="abdbcfb13d2e4b0ea7e5fe7e59cefc0d67346d7e"
-CROS_WORKON_TREE="ab45970c875e95a415973835ccdd969dac820de5"
-CROS_WORKON_PROJECT="chromiumos/platform/mttools"
-CROS_WORKON_LOCALNAME="platform/mttools"
-
-inherit cros-sanitizers cros-workon cros-common.mk cros-constants cros-debug
-
-DESCRIPTION="Chromium OS multitouch utilities"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/mttools"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-# This package has no tests.
-RESTRICT="test"
-
-RDEPEND="chromeos-base/gestures
-	app-misc/utouch-evemu
-	chromeos-base/libevdev
-	chromeos-base/touch_firmware_test"
-
-DEPEND=${RDEPEND}
-
-src_configure() {
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
-
-src_install() {
-	# install to autotest deps directory for dependency
-	emake DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests/framework" install
-}
diff --git a/chromeos-base/mttools/mttools-0.0.1-r160.ebuild b/chromeos-base/mttools/mttools-0.0.1-r160.ebuild
new file mode 100644
index 0000000..8722575
--- /dev/null
+++ b/chromeos-base/mttools/mttools-0.0.1-r160.ebuild
@@ -0,0 +1,38 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="44b2e16939185c9a3ecca057eeccc2f4c47a6481"
+CROS_WORKON_TREE="2a249f0f3fca6ab3c82d86616802086874f5c901"
+CROS_WORKON_PROJECT="chromiumos/platform/mttools"
+CROS_WORKON_LOCALNAME="platform/mttools"
+
+inherit cros-sanitizers cros-workon cros-common.mk cros-constants cros-debug
+
+DESCRIPTION="Chromium OS multitouch utilities"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/mttools"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan"
+# This package has no tests.
+RESTRICT="test"
+
+RDEPEND="chromeos-base/gestures
+	app-misc/utouch-evemu
+	chromeos-base/libevdev
+	chromeos-base/touch_firmware_test"
+
+DEPEND=${RDEPEND}
+
+src_configure() {
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
+
+src_install() {
+	# install to autotest deps directory for dependency
+	emake DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests/framework" install
+}
diff --git a/chromeos-base/ndproxyd/ndproxyd-0.0.1-r47.ebuild b/chromeos-base/ndproxyd/ndproxyd-0.0.1-r47.ebuild
deleted file mode 100644
index 46da0ea..0000000
--- a/chromeos-base/ndproxyd/ndproxyd-0.0.1-r47.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="05b5852bbf00f85e097be08bf5344d2f735171d7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "769e73d163dc671e97eeb278eefcf36cfdd1c94c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
-
-PLATFORM_SUBDIR="patchpanel/ndproxyd"
-
-inherit cros-workon libchrome platform
-
-DESCRIPTION="NDProxy daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	dev-libs/protobuf:=
-	chromeos-base/libbrillo:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	!chromeos-base/arc-networkd-ndproxyd
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-"
-
-src_install() {
-	dobin "${OUT}"/ndproxyd
-}
-
diff --git a/chromeos-base/ndproxyd/ndproxyd-0.0.1-r98.ebuild b/chromeos-base/ndproxyd/ndproxyd-0.0.1-r98.ebuild
new file mode 100644
index 0000000..49d323c
--- /dev/null
+++ b/chromeos-base/ndproxyd/ndproxyd-0.0.1-r98.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="0a70acf40b774cf9c5d4f41cb5787d3862ca9348"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2c0fbdc6a39fdedb92ac536175e351099402b6ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
+
+PLATFORM_SUBDIR="patchpanel/ndproxyd"
+
+inherit cros-workon libchrome platform
+
+DESCRIPTION="NDProxy daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+	chromeos-base/libbrillo:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	!chromeos-base/arc-networkd-ndproxyd
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+"
+
+src_install() {
+	dobin "${OUT}"/ndproxyd
+}
+
diff --git a/chromeos-base/nnapi/files/00001-libbase-fix-stderr-logging.patch b/chromeos-base/nnapi/files/00001-libbase-fix-stderr-logging.patch
index 4726aed..6870f96 100644
--- a/chromeos-base/nnapi/files/00001-libbase-fix-stderr-logging.patch
+++ b/chromeos-base/nnapi/files/00001-libbase-fix-stderr-logging.patch
@@ -4,11 +4,11 @@
 This configures base logging to write to stderr by default, which is a good
 start for the logging we want for NNAPI.
 
-diff --git a/platform2/aosp/system/core/base/logging_test.cpp b/platform2/aosp/system/core/base/logging_test.cpp
-index 593e2c1..f1cbe41 100644
---- a/platform2/aosp/system/core/base/logging_test.cpp
-+++ b/platform2/aosp/system/core/base/logging_test.cpp
-@@ -88,18 +88,18 @@ TEST(logging, CHECK) {
+diff --git a/platform2/aosp/system/libbase/logging_test.cpp b/platform2/aosp/system/libbase/logging_test.cpp
+index be2e042..cbe6650 100644
+--- a/platform2/aosp/system/libbase/logging_test.cpp
++++ b/platform2/aosp/system/libbase/logging_test.cpp
+@@ -99,25 +99,25 @@ TEST(logging, CHECK) {
 
  TEST(logging, DCHECK) {
    if (android::base::kEnableDChecks) {
@@ -23,6 +23,14 @@
    }
    DCHECK_EQ(0, 0);
 
+   std::unique_ptr<int> p;
+   if (android::base::kEnableDChecks) {
+-    ASSERT_DEATH(DCHECK_NE(p, nullptr), "DCheck failed");
++    ASSERT_DEATH(DCHECK_NE(p, nullptr), "Check failed");
+   }
+   DCHECK_EQ(p, nullptr);
+   DCHECK_EQ(p, p);
+
    if (android::base::kEnableDChecks) {
      ASSERT_DEATH({SuppressAbortUI(); DCHECK_STREQ("foo", "bar");},
 -                 R"(DCheck failed: "foo" == "bar")");
@@ -30,7 +38,7 @@
    }
    DCHECK_STREQ("foo", "foo");
 
-@@ -190,6 +190,7 @@ TEST(logging, WOULD_LOG_VERBOSE_enabled) {
+@@ -208,6 +208,7 @@ TEST(logging, WOULD_LOG_VERBOSE_enabled) {
  #undef CHECK_WOULD_LOG_ENABLED
 
 
@@ -38,7 +46,7 @@
  #if !defined(_WIN32)
  static std::string make_log_pattern(android::base::LogSeverity severity,
                                      const char* message) {
-@@ -203,8 +204,9 @@ static std::string make_log_pattern(android::base::LogSeverity severity,
+@@ -221,8 +222,9 @@ static std::string make_log_pattern(android::base::LogSeverity severity,
        log_char, basename(&holder[0]), message);
  }
  #endif
@@ -49,7 +57,7 @@
                           const char* expected, const char* expected_tag = nullptr) {
    // We can't usefully check the output of any of these on Windows because we
    // don't have std::regex, but we can at least make sure we printed at least as
-@@ -215,6 +217,7 @@ static void CheckMessage(const std::string& output, android::base::LogSeverity s
+@@ -233,6 +235,7 @@ static void CheckMessage(const std::string& output, android::base::LogSeverity s
      ASSERT_NE(nullptr, strstr(output.c_str(), expected_tag)) << output;
    }
 
@@ -57,7 +65,7 @@
  #if !defined(_WIN32)
    std::string regex_str;
    if (expected_tag != nullptr) {
-@@ -225,6 +228,7 @@ static void CheckMessage(const std::string& output, android::base::LogSeverity s
+@@ -243,6 +246,7 @@ static void CheckMessage(const std::string& output, android::base::LogSeverity s
    std::regex message_regex(regex_str);
    ASSERT_TRUE(std::regex_search(output, message_regex)) << output;
  #endif
diff --git a/chromeos-base/nnapi/files/00007-libbase-get-property-from-envvar.patch b/chromeos-base/nnapi/files/00007-libbase-get-property-from-envvar.patch
index 9a7b578..be022e0 100644
--- a/chromeos-base/nnapi/files/00007-libbase-get-property-from-envvar.patch
+++ b/chromeos-base/nnapi/files/00007-libbase-get-property-from-envvar.patch
@@ -4,10 +4,10 @@
 - Replaces '.' with '-', as '.' is not supported in env variable names.
 
 
-diff --git a/platform2/aosp/system/core/base/properties.cpp b/platform2/aosp/system/core/base/properties.cpp
-index 5c9ec7e..b93da98 100644
---- a/platform2/aosp/system/core/base/properties.cpp
-+++ b/platform2/aosp/system/core/base/properties.cpp
+diff --git a/platform2/aosp/system/libbase/properties.cpp b/platform2/aosp/system/libbase/properties.cpp
+index 8190987..34bd3e4 100644
+--- a/platform2/aosp/system/libbase/properties.cpp
++++ b/platform2/aosp/system/libbase/properties.cpp
 @@ -20,6 +20,9 @@
  #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
  #include <sys/system_properties.h>
@@ -18,11 +18,10 @@
  #endif
 
  #include <algorithm>
-@@ -79,6 +82,24 @@ static int __system_property_set(const char* key, const char* value) {
-   g_properties[key] = value;
+@@ -53,6 +56,23 @@ int __system_property_set(const char* key, const char* value) {
    return 0;
  }
-+
+
 +// Convert a key name to a format acceptible for an envronment variable
 +std::string ConvertKeyToEnvVar(const std::string& key) {
 +  std::string result = key;
@@ -40,14 +39,14 @@
 +  return env_value ? std::string(env_value) : default_value;
 +}
 +
- #endif
-
- std::string GetProperty(const std::string& key, const std::string& default_value) {
-@@ -94,9 +115,13 @@ std::string GetProperty(const std::string& key, const std::string& default_value
+ int __system_property_get(const char* key, char* value) {
+   auto it = g_properties.find(key);
+   if (it == g_properties.end()) {
+@@ -119,10 +139,12 @@ std::string GetProperty(const std::string& key, const std::string& default_value
                                    },
                                    &property_value);
  #else
-+
+-  // TODO: implement host __system_property_find()/__system_property_read_callback()?
    auto it = g_properties.find(key);
 -  if (it == g_properties.end()) return default_value;
 -  property_value = it->second;
diff --git a/chromeos-base/nnapi/files/00008-libutils-memory-leak.patch b/chromeos-base/nnapi/files/00008-libutils-memory-leak.patch
new file mode 100644
index 0000000..e3389ee
--- /dev/null
+++ b/chromeos-base/nnapi/files/00008-libutils-memory-leak.patch
@@ -0,0 +1,16 @@
+WeakCopies test doesn't actually clean up the memory it allocates.
+
+diff --git a/platform2/aosp/system/core/libutils/RefBase_test.cpp b/platform2/aosp/system/core/libutils/RefBase_test.cpp
+index c9b4894..6f2bcc5 100644
+--- a/RefBase_test.cpp
++++ b/RefBase_test.cpp
+@@ -126,6 +126,9 @@ TEST(RefBase, WeakCopies) {
+     ASSERT_FALSE(isDeleted) << "deleted too early! still has a reference!";
+     wp1 = nullptr;
+     ASSERT_FALSE(isDeleted) << "Deletion on wp destruction should no longer occur";
++
++    // cleanup memory
++    sp<Foo> sp1(foo);
+ }
+
+ TEST(RefBase, Comparisons) {
diff --git a/chromeos-base/nnapi/nnapi-0.0.1-r46.ebuild b/chromeos-base/nnapi/nnapi-0.0.1-r46.ebuild
deleted file mode 100644
index 7d4553b..0000000
--- a/chromeos-base/nnapi/nnapi-0.0.1-r46.ebuild
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT=("e91e6abd0abc66801bd7b30fc00b26b8e9cbe224" "ed38697b9f8e4140802f13e3bb4e174bf7201eed" "a2753728d4f1bb7960b76d4cdd03a17afd4f5fd3" "8b529c2a6a966c93de4e89f08e746da4a4307e04" "357ba7427eb2b49467d39c09d57439fab3898467" "cce41c55319e81218ef5c6f1a322adcd249c5abb" "ba4dc98b0cd901b9a138a8941900753c3e4154e2" "ce343f293774d1d2f88fc4828a2dc45ff0981feb")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6ce5174303d011bac1b15ddf51c35f31899aee57" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d59698b9aacd42201a585bee90f33719caa6338b" "4256bcdd9e9435828bf8159d85af015450112aff" "b4147760c8f1da9f6749f61748d2cacf89237717" "dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7" "078088f837cd0a9b1c3123b5d93904f4ec2f2af6" "934fe42dbc7182e5775cb5717e7cb29644a6eae8" "3e10262144e64652e5c70fe978e1d6bae433ab27")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform2"
-	"aosp/platform/frameworks/native"
-	"aosp/platform/system/core/base"
-	"aosp/platform/system/core/libcutils"
-	"aosp/platform/system/core/liblog"
-	"aosp/platform/system/core/libutils"
-	"aosp/platform/system/libfmq"
-	"aosp/platform/system/libhidl"
-)
-CROS_WORKON_REPO=(
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-	"${CROS_GIT_HOST_URL}"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform2"
-	"aosp/frameworks/native"
-	"aosp/system/core/base"
-	"aosp/system/core/libcutils"
-	"aosp/system/core/liblog"
-	"aosp/system/core/libutils"
-	"aosp/system/libfmq"
-	"aosp/system/libhidl"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform2"
-	"${S}/platform2/aosp/frameworks/native"
-	"${S}/platform2/aosp/system/core/base"
-	"${S}/platform2/aosp/system/core/libcutils"
-	"${S}/platform2/aosp/system/core/liblog"
-	"${S}/platform2/aosp/system/core/libutils"
-	"${S}/platform2/aosp/system/libfmq"
-	"${S}/platform2/aosp/system/libhidl"
-)
-CROS_WORKON_SUBTREE=(
-	"common-mk nnapi .gn"
-	""
-	""
-	""
-	""
-	""
-	""
-	""
-)
-
-PLATFORM_SUBDIR="nnapi"
-
-inherit cros-workon platform epatch
-
-DESCRIPTION="Chrome OS support utils for Android Neural Network API"
-HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks"
-
-LICENSE="BSD-Google  Apache-2.0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-"
-
-DEPEND="
-	${RDEPEND}
-"
-
-PATCHES=(
-	"${FILESDIR}/00001-libbase-fix-stderr-logging.patch"
-	"${FILESDIR}/00002-libhidl-callstack.patch"
-	"${FILESDIR}/00003-libutils-callstack.patch"
-	"${FILESDIR}/00004-libfmq-page-size.patch"
-	"${FILESDIR}/00005-libcutils-ashmemtests.patch"
-	"${FILESDIR}/00006-libhidl-cast-interface.patch"
-	"${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
-)
-
-src_prepare() {
-	# The workdir is platform2/nnapi - we need to pop up one level in the stack
-	# to apply our patches.
-	pushd .. || exit
-	eapply -p2 "${FILESDIR}/00001-libbase-fix-stderr-logging.patch"
-	eapply -p2 "${FILESDIR}/00002-libhidl-callstack.patch"
-	eapply -p2 "${FILESDIR}/00003-libutils-callstack.patch"
-	eapply -p2 "${FILESDIR}/00004-libfmq-page-size.patch"
-	eapply -p2 "${FILESDIR}/00005-libcutils-ashmemtests.patch"
-	eapply -p2 "${FILESDIR}/00006-libhidl-cast-interface.patch"
-	eapply -p2 "${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
-	popd || exit
-
-	eapply_user
-}
-
-src_install() {
-	einfo "Installing Android headers."
-	insinto /usr/include/aosp
-	doins -r includes/*
-	doins -r ../aosp/frameworks/native/libs/arect/include/*
-	doins -r ../aosp/frameworks/native/libs/nativewindow/include/*
-	doins -r ../aosp/system/core/base/include/*
-	doins -r ../aosp/system/core/libcutils/include/*
-	doins -r ../aosp/system/core/liblog/include/*
-	doins -r ../aosp/system/core/libutils/include/*
-	doins -r ../aosp/system/libfmq/include/*
-	doins -r ../aosp/system/libhidl/base/include/*
-	doins -r ../aosp/system/libhidl/libhidlmemory/include/*
-	# Selectively install one off headers
-	insinto /usr/include/aosp/android
-	doins ../aosp/frameworks/native/include/android/sharedmem.h
-
-	einfo "Installing the shared library."
-	dolib.so "${OUT}/lib/libnnapi-support.so"
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}/obj/nnapi/libnnapi-support.pc"
-}
-
-platform_pkg_test() {
-	local tests=(
-		base cutils fmq hidl hwbuf log utils
-	)
-
-	# When running in qemu, these tests freeze the emulator when hitting
-	# EventFlag::wake from libfmq. The error printed is:
-	# Error in event flag wake attempt: Function not implemented
-	# This is a known issue, see:
-	# https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats
-	local qemu_gtest_excl_filter="-"
-	qemu_gtest_excl_filter+="BlockingReadWrites.SmallInputTest1:"
-
-	local test_target
-	for test_target in "${tests[@]}"; do
-		platform_test "run" "${OUT}/lib${test_target}_testrunner" "0" "" "${qemu_gtest_excl_filter}"
-	done
-}
diff --git a/chromeos-base/nnapi/nnapi-0.0.1-r78.ebuild b/chromeos-base/nnapi/nnapi-0.0.1-r78.ebuild
new file mode 100644
index 0000000..7e144c6
--- /dev/null
+++ b/chromeos-base/nnapi/nnapi-0.0.1-r78.ebuild
@@ -0,0 +1,168 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "e9ef20b988f629406f6a8d7fe22ae5f006abdbd2" "c1e30221aa92e7979cf0a0ee65914849db8b2dcb" "9cca7081cb7d158034bffec841f227af52cca401" "e2ccff249b3be3583ffb0e9be35db7be54715ec9" "08495901b78c7c3d9a1a81e541897c2ec114fe34" "ceff5e345ef65eccd261fdd940f3e4ca67a916ba" "ce343f293774d1d2f88fc4828a2dc45ff0981feb")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "799a18b3e192269829efc902ed9b430aa32cadb4" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "53a4656104a89df4072d3101327f51fcf6c9cbb2" "b4147760c8f1da9f6749f61748d2cacf89237717" "dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7" "078088f837cd0a9b1c3123b5d93904f4ec2f2af6" "cbb1596cd3157db5ffe44d03d24c30cc9ed53e38" "dcbde0bbddc02dde72a15bbf5b890da2cc032cc9" "3e10262144e64652e5c70fe978e1d6bae433ab27")
+inherit cros-constants
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform2"
+	"aosp/platform/frameworks/native"
+	"aosp/platform/system/core/libcutils"
+	"aosp/platform/system/core/liblog"
+	"aosp/platform/system/core/libutils"
+	"aosp/platform/system/libbase"
+	"aosp/platform/system/libfmq"
+	"aosp/platform/system/libhidl"
+)
+CROS_WORKON_REPO=(
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+	"${CROS_GIT_HOST_URL}"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform2"
+	"aosp/frameworks/native"
+	"aosp/system/core/libcutils"
+	"aosp/system/core/liblog"
+	"aosp/system/core/libutils"
+	"aosp/system/libbase"
+	"aosp/system/libfmq"
+	"aosp/system/libhidl"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform2"
+	"${S}/platform2/aosp/frameworks/native"
+	"${S}/platform2/aosp/system/core/libcutils"
+	"${S}/platform2/aosp/system/core/liblog"
+	"${S}/platform2/aosp/system/core/libutils"
+	"${S}/platform2/aosp/system/libbase"
+	"${S}/platform2/aosp/system/libfmq"
+	"${S}/platform2/aosp/system/libhidl"
+)
+CROS_WORKON_SUBTREE=(
+	"common-mk nnapi .gn"
+	""
+	""
+	""
+	""
+	""
+	""
+	""
+)
+
+PLATFORM_SUBDIR="nnapi"
+
+inherit cros-workon platform
+
+DESCRIPTION="Chrome OS support utils for Android Neural Network API"
+HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks"
+
+LICENSE="BSD-Google  Apache-2.0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+"
+
+DEPEND="
+	${RDEPEND}
+"
+
+PATCHES=(
+	"${FILESDIR}/00001-libbase-fix-stderr-logging.patch"
+	"${FILESDIR}/00002-libhidl-callstack.patch"
+	"${FILESDIR}/00003-libutils-callstack.patch"
+	"${FILESDIR}/00004-libfmq-page-size.patch"
+	"${FILESDIR}/00005-libcutils-ashmemtests.patch"
+	"${FILESDIR}/00006-libhidl-cast-interface.patch"
+	"${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
+	"${FILESDIR}/00008-libutils-memory-leak.patch"
+)
+
+src_prepare() {
+	# The workdir is platform2/nnapi - we need to pop up one level in the stack
+	# to apply our patches.
+	pushd .. || exit
+	eapply -p2 "${FILESDIR}/00001-libbase-fix-stderr-logging.patch"
+	eapply -p2 "${FILESDIR}/00002-libhidl-callstack.patch"
+	eapply -p2 "${FILESDIR}/00003-libutils-callstack.patch"
+	eapply -p2 "${FILESDIR}/00004-libfmq-page-size.patch"
+	eapply -p2 "${FILESDIR}/00005-libcutils-ashmemtests.patch"
+	eapply -p2 "${FILESDIR}/00006-libhidl-cast-interface.patch"
+	eapply -p2 "${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
+	eapply -p2 "${FILESDIR}/00008-libutils-memory-leak.patch"
+	popd || exit
+
+	eapply_user
+}
+
+src_install() {
+	einfo "Installing Android headers."
+	insinto /usr/include/aosp
+	doins -r includes/*
+	doins -r ../aosp/frameworks/native/libs/arect/include/*
+	doins -r ../aosp/frameworks/native/libs/nativewindow/include/*
+	doins -r ../aosp/system/core/libcutils/include/*
+	doins -r ../aosp/system/core/liblog/include/*
+	doins -r ../aosp/system/core/libutils/include/*
+	doins -r ../aosp/system/libbase/include/*
+	doins -r ../aosp/system/libfmq/include/*
+	doins -r ../aosp/system/libhidl/base/include/*
+	doins -r ../aosp/system/libhidl/libhidlmemory/include/*
+	# Selectively install one off headers
+	insinto /usr/include/aosp/android
+	doins ../aosp/frameworks/native/include/android/sharedmem.h
+
+	einfo "Installing the shared library."
+	dolib.so "${OUT}/lib/libnnapi-support.so"
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}/obj/nnapi/libnnapi-support.pc"
+}
+
+platform_pkg_test() {
+	local tests=(
+		base cutils fmq hidl hwbuf log utils
+	)
+
+	# When running in qemu, these tests freeze the emulator when hitting
+	# EventFlag::wake from libfmq. The error printed is:
+	# Error in event flag wake attempt: Function not implemented
+	# This is a known issue, see:
+	# https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats
+	local qemu_gtest_excl_filter="-"
+	qemu_gtest_excl_filter+="BlockingReadWrites.SmallInputTest1:"
+
+	local gtest_excl_filter="-"
+	if use asan; then
+		# The sharedbuffer tests deliberately allocate too much memory:
+		# AddressSanitizer: requested allocation size 0xfffffffffffffffe
+		# We can't use allocator_may_return_null=1 as it prints a warning that the
+		# toolchain considers an error.
+		gtest_excl_filter+="SharedBufferTest.TestAlloc:"
+		gtest_excl_filter+="SharedBufferTest.TestEditResize:"
+
+		# ForkSafe leaves some threads running which results in warning printed:
+		# ==26==Running thread 23 was not suspended. False leaks are possible.
+		# Toolchain considers anything in the asan output as an error.
+		gtest_excl_filter+="logging.ForkSafe:"
+
+		# The queue created in this test cannot be deleted without crashing in
+		# the hidl library. lsan_suppressions doesn't work due to the lack of
+		# /usr/bin/llvm-symbolizer, so just exclude the test.
+		gtest_excl_filter+="BadQueueConfig.QueueSizeTooLarge:"
+	fi
+
+	local test_target
+	for test_target in "${tests[@]}"; do
+		platform_test "run" "${OUT}/lib${test_target}_testrunner" "0" "${gtest_excl_filter}" "${qemu_gtest_excl_filter}"
+	done
+}
diff --git a/chromeos-base/nnapi/nnapi-9999.ebuild b/chromeos-base/nnapi/nnapi-9999.ebuild
index 5d58ec8..3dfe980 100644
--- a/chromeos-base/nnapi/nnapi-9999.ebuild
+++ b/chromeos-base/nnapi/nnapi-9999.ebuild
@@ -2,13 +2,16 @@
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=7
+
+inherit cros-constants
+
 CROS_WORKON_PROJECT=(
 	"chromiumos/platform2"
 	"aosp/platform/frameworks/native"
-	"aosp/platform/system/core/base"
 	"aosp/platform/system/core/libcutils"
 	"aosp/platform/system/core/liblog"
 	"aosp/platform/system/core/libutils"
+	"aosp/platform/system/libbase"
 	"aosp/platform/system/libfmq"
 	"aosp/platform/system/libhidl"
 )
@@ -25,20 +28,20 @@
 CROS_WORKON_LOCALNAME=(
 	"platform2"
 	"aosp/frameworks/native"
-	"aosp/system/core/base"
 	"aosp/system/core/libcutils"
 	"aosp/system/core/liblog"
 	"aosp/system/core/libutils"
+	"aosp/system/libbase"
 	"aosp/system/libfmq"
 	"aosp/system/libhidl"
 )
 CROS_WORKON_DESTDIR=(
 	"${S}/platform2"
 	"${S}/platform2/aosp/frameworks/native"
-	"${S}/platform2/aosp/system/core/base"
 	"${S}/platform2/aosp/system/core/libcutils"
 	"${S}/platform2/aosp/system/core/liblog"
 	"${S}/platform2/aosp/system/core/libutils"
+	"${S}/platform2/aosp/system/libbase"
 	"${S}/platform2/aosp/system/libfmq"
 	"${S}/platform2/aosp/system/libhidl"
 )
@@ -55,7 +58,7 @@
 
 PLATFORM_SUBDIR="nnapi"
 
-inherit cros-workon platform epatch
+inherit cros-workon platform
 
 DESCRIPTION="Chrome OS support utils for Android Neural Network API"
 HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks"
@@ -79,6 +82,7 @@
 	"${FILESDIR}/00005-libcutils-ashmemtests.patch"
 	"${FILESDIR}/00006-libhidl-cast-interface.patch"
 	"${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
+	"${FILESDIR}/00008-libutils-memory-leak.patch"
 )
 
 src_prepare() {
@@ -92,6 +96,7 @@
 	eapply -p2 "${FILESDIR}/00005-libcutils-ashmemtests.patch"
 	eapply -p2 "${FILESDIR}/00006-libhidl-cast-interface.patch"
 	eapply -p2 "${FILESDIR}/00007-libbase-get-property-from-envvar.patch"
+	eapply -p2 "${FILESDIR}/00008-libutils-memory-leak.patch"
 	popd || exit
 
 	eapply_user
@@ -103,10 +108,10 @@
 	doins -r includes/*
 	doins -r ../aosp/frameworks/native/libs/arect/include/*
 	doins -r ../aosp/frameworks/native/libs/nativewindow/include/*
-	doins -r ../aosp/system/core/base/include/*
 	doins -r ../aosp/system/core/libcutils/include/*
 	doins -r ../aosp/system/core/liblog/include/*
 	doins -r ../aosp/system/core/libutils/include/*
+	doins -r ../aosp/system/libbase/include/*
 	doins -r ../aosp/system/libfmq/include/*
 	doins -r ../aosp/system/libhidl/base/include/*
 	doins -r ../aosp/system/libhidl/libhidlmemory/include/*
@@ -134,8 +139,28 @@
 	local qemu_gtest_excl_filter="-"
 	qemu_gtest_excl_filter+="BlockingReadWrites.SmallInputTest1:"
 
+	local gtest_excl_filter="-"
+	if use asan; then
+		# The sharedbuffer tests deliberately allocate too much memory:
+		# AddressSanitizer: requested allocation size 0xfffffffffffffffe
+		# We can't use allocator_may_return_null=1 as it prints a warning that the
+		# toolchain considers an error.
+		gtest_excl_filter+="SharedBufferTest.TestAlloc:"
+		gtest_excl_filter+="SharedBufferTest.TestEditResize:"
+
+		# ForkSafe leaves some threads running which results in warning printed:
+		# ==26==Running thread 23 was not suspended. False leaks are possible.
+		# Toolchain considers anything in the asan output as an error.
+		gtest_excl_filter+="logging.ForkSafe:"
+
+		# The queue created in this test cannot be deleted without crashing in
+		# the hidl library. lsan_suppressions doesn't work due to the lack of
+		# /usr/bin/llvm-symbolizer, so just exclude the test.
+		gtest_excl_filter+="BadQueueConfig.QueueSizeTooLarge:"
+	fi
+
 	local test_target
 	for test_target in "${tests[@]}"; do
-		platform_test "run" "${OUT}/lib${test_target}_testrunner" "0" "" "${qemu_gtest_excl_filter}"
+		platform_test "run" "${OUT}/lib${test_target}_testrunner" "0" "${gtest_excl_filter}" "${qemu_gtest_excl_filter}"
 	done
 }
diff --git a/chromeos-base/ocr/ocr-0.0.1-r12.ebuild b/chromeos-base/ocr/ocr-0.0.1-r12.ebuild
new file mode 100644
index 0000000..c2ee489
--- /dev/null
+++ b/chromeos-base/ocr/ocr-0.0.1-r12.ebuild
@@ -0,0 +1,68 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "db360477504fad20e43d8a63e249e8470881562c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk ocr .gn"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+PLATFORM_SUBDIR="ocr"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Optical Character Recognition service for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ocr/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	app-text/tesseract:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser ocr_service
+	enewgroup ocr_service
+}
+
+src_install() {
+	dobin "${OUT}"/ocr_service
+
+	dobin "${OUT}"/ocr_tool
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/ocr_service.conf
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.OpticalCharacterRecognition.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus_permissions/org.chromium.OpticalCharacterRecognition.service
+}
+
+platform_pkg_test() {
+	local tests=(
+		"ocr_service_test"
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/ocr/ocr-9999.ebuild b/chromeos-base/ocr/ocr-9999.ebuild
new file mode 100644
index 0000000..a224c9de
--- /dev/null
+++ b/chromeos-base/ocr/ocr-9999.ebuild
@@ -0,0 +1,66 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk ocr .gn"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+PLATFORM_SUBDIR="ocr"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Optical Character Recognition service for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ocr/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="~*"
+IUSE=""
+
+COMMON_DEPEND="
+	app-text/tesseract:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser ocr_service
+	enewgroup ocr_service
+}
+
+src_install() {
+	dobin "${OUT}"/ocr_service
+
+	dobin "${OUT}"/ocr_tool
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/ocr_service.conf
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus_permissions/org.chromium.OpticalCharacterRecognition.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus_permissions/org.chromium.OpticalCharacterRecognition.service
+}
+
+platform_pkg_test() {
+	local tests=(
+		"ocr_service_test"
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/oobe_config/oobe_config-0.0.1-r301.ebuild b/chromeos-base/oobe_config/oobe_config-0.0.1-r301.ebuild
deleted file mode 100644
index f541838..0000000
--- a/chromeos-base/oobe_config/oobe_config-0.0.1-r301.ebuild
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1e54d20a57c3ddfa63a5a03e65500a8cf4569e0a" "c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4" "7e189936f29d145c4191ea147e48256c92fac75d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk oobe_config libtpmcrypto metrics .gn"
-
-PLATFORM_SUBDIR="oobe_config"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Provides utilities to save and restore OOBE config."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/oobe_config/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="tpm tpm2"
-REQUIRED_USE="?? ( tpm tpm2 )"
-
-COMMMON_DEPEND="
-	chromeos-base/libtpmcrypto:=
-	chromeos-base/metrics:=
-	dev-libs/openssl:0=
-	sys-apps/dbus:=
-"
-RDEPEND="${COMMMON_DEPEND}"
-DEPEND="
-	${COMMMON_DEPEND}
-	chromeos-base/power_manager-client:=
-	chromeos-base/system_api:=
-"
-
-pkg_preinst() {
-	enewuser "oobe_config_save"
-	enewuser "oobe_config_restore"
-	enewgroup "oobe_config_save"
-	enewgroup "oobe_config_restore"
-}
-
-src_install() {
-	dosbin "${OUT}"/rollback_prepare_save
-	dosbin "${OUT}"/oobe_config_save
-	dosbin "${OUT}"/oobe_config_restore
-	dosbin "${OUT}"/rollback_finish_restore
-	dosbin "${OUT}"/finish_oobe_auto_config
-	dosbin "${OUT}"/store_usb_oobe_config
-
-	insinto /etc/dbus-1/system.d
-	doins etc/dbus-1/org.chromium.OobeConfigRestore.conf
-
-	insinto /etc/init
-	doins etc/init/oobe_config_restore.conf
-	doins etc/init/oobe_config_save.conf
-	if use tpm2; then
-		sed -i 's/and started tcsd//' \
-			"${D}/etc/init/oobe_config_restore.conf" ||
-			die "Can't remove upstart dependency on tcsd"
-
-		sed -i 's/-b \/run\/tcsd//' \
-			"${D}/etc/init/oobe_config_restore.conf" ||
-			die "Can't remove /run/tcsd bind mount"
-
-		sed -i 's/-b \/run\/tcsd//' \
-			"${D}/etc/init/oobe_config_save.conf" ||
-			die "Can't remove /run/tcsd bind mount"
-	fi
-
-	insinto /usr/share/policy
-	newins seccomp_filters/oobe_config_restore-seccomp-"${ARCH}".policy \
-		oobe_config_restore-seccomp.policy
-	newins seccomp_filters/oobe_config_save-seccomp-"${ARCH}".policy \
-		oobe_config_save-seccomp.policy
-}
-
-platform_pkg_test() {
-	local tests=(
-		oobe_config_test
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/oobe_config/oobe_config-0.0.1-r336.ebuild b/chromeos-base/oobe_config/oobe_config-0.0.1-r336.ebuild
new file mode 100644
index 0000000..0614c33
--- /dev/null
+++ b/chromeos-base/oobe_config/oobe_config-0.0.1-r336.ebuild
@@ -0,0 +1,90 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "98b41b17eb228d92bc0c440e65608130f295b979" "d8479ac4f3bc0cc18815ff1d440dc3abd761db42" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk oobe_config libtpmcrypto metrics .gn"
+
+PLATFORM_SUBDIR="oobe_config"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Provides utilities to save and restore OOBE config."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/oobe_config/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="tpm tpm2"
+REQUIRED_USE="?? ( tpm tpm2 )"
+
+COMMMON_DEPEND="
+	chromeos-base/libtpmcrypto:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/openssl:0=
+	sys-apps/dbus:=
+"
+RDEPEND="${COMMMON_DEPEND}"
+DEPEND="
+	${COMMMON_DEPEND}
+	chromeos-base/power_manager-client:=
+	chromeos-base/system_api:=
+"
+
+pkg_preinst() {
+	enewuser "oobe_config_save"
+	enewuser "oobe_config_restore"
+	enewgroup "oobe_config_save"
+	enewgroup "oobe_config_restore"
+}
+
+src_install() {
+	dosbin "${OUT}"/rollback_prepare_save
+	dosbin "${OUT}"/oobe_config_save
+	dosbin "${OUT}"/oobe_config_restore
+	dosbin "${OUT}"/rollback_finish_restore
+	dosbin "${OUT}"/finish_oobe_auto_config
+	dosbin "${OUT}"/store_usb_oobe_config
+
+	insinto /etc/dbus-1/system.d
+	doins etc/dbus-1/org.chromium.OobeConfigRestore.conf
+
+	insinto /etc/init
+	doins etc/init/oobe_config_restore.conf
+	doins etc/init/oobe_config_save.conf
+	if use tpm2; then
+		sed -i 's/and started tcsd//' \
+			"${D}/etc/init/oobe_config_restore.conf" ||
+			die "Can't remove upstart dependency on tcsd"
+
+		sed -i 's/-b \/run\/tcsd//' \
+			"${D}/etc/init/oobe_config_restore.conf" ||
+			die "Can't remove /run/tcsd bind mount"
+
+		sed -i 's/-b \/run\/tcsd//' \
+			"${D}/etc/init/oobe_config_save.conf" ||
+			die "Can't remove /run/tcsd bind mount"
+	fi
+
+	insinto /usr/share/policy
+	newins seccomp_filters/oobe_config_restore-seccomp-"${ARCH}".policy \
+		oobe_config_restore-seccomp.policy
+	newins seccomp_filters/oobe_config_save-seccomp-"${ARCH}".policy \
+		oobe_config_save-seccomp.policy
+}
+
+platform_pkg_test() {
+	local tests=(
+		oobe_config_test
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/oobe_config/oobe_config-9999.ebuild b/chromeos-base/oobe_config/oobe_config-9999.ebuild
index 1604ebe..e2d9d81 100644
--- a/chromeos-base/oobe_config/oobe_config-9999.ebuild
+++ b/chromeos-base/oobe_config/oobe_config-9999.ebuild
@@ -24,7 +24,7 @@
 
 COMMMON_DEPEND="
 	chromeos-base/libtpmcrypto:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/openssl:0=
 	sys-apps/dbus:=
 "
diff --git a/chromeos-base/p2p/p2p-0.0.1-r3184.ebuild b/chromeos-base/p2p/p2p-0.0.1-r3184.ebuild
deleted file mode 100644
index bdef814..0000000
--- a/chromeos-base/p2p/p2p-0.0.1-r3184.ebuild
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "60696efa07bf1a4db8013abb83fcf73bb27af918" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk metrics p2p .gn"
-
-PLATFORM_SUBDIR="p2p"
-
-inherit cros-debug cros-workon platform user
-
-DESCRIPTION="Chromium OS P2P"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/p2p/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="chromeos-base/metrics:=
-	dev-libs/glib:=
-	net-dns/avahi-daemon:=
-	net-firewall/iptables:="
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-platform_pkg_test() {
-	local tests=(
-		p2p-client-unittests
-		p2p-server-unittests
-		p2p-http-server-unittests
-		p2p-common-unittests
-	)
-
-	local test_bin
-	cd "${OUT}"
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "./${test_bin}"
-	done
-}
-
-pkg_preinst() {
-	# Groups are managed in the central account database.
-	enewgroup p2p
-	enewuser p2p
-}
-
-src_install() {
-	dosbin "${OUT}"/p2p-client
-	dosbin "${OUT}"/p2p-server
-	dosbin "${OUT}"/p2p-http-server
-
-	insinto /etc/init
-	doins data/p2p.conf
-
-	# Install fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-			"${OUT}"/p2p_http_server_fuzzer
-}
diff --git a/chromeos-base/p2p/p2p-0.0.1-r3221.ebuild b/chromeos-base/p2p/p2p-0.0.1-r3221.ebuild
new file mode 100644
index 0000000..49b5e5b
--- /dev/null
+++ b/chromeos-base/p2p/p2p-0.0.1-r3221.ebuild
@@ -0,0 +1,68 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "e66e3361d73a6edd09ce21083f14932af5f098c4" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk metrics p2p .gn"
+
+PLATFORM_SUBDIR="p2p"
+
+inherit cros-debug cros-workon platform user
+
+DESCRIPTION="Chromium OS P2P"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/p2p/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND=">=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/glib:=
+	net-dns/avahi-daemon:=
+	net-firewall/iptables:="
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+platform_pkg_test() {
+	local tests=(
+		p2p-client-unittests
+		p2p-server-unittests
+		p2p-http-server-unittests
+		p2p-common-unittests
+	)
+
+	local test_bin
+	cd "${OUT}"
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "./${test_bin}"
+	done
+}
+
+pkg_preinst() {
+	# Groups are managed in the central account database.
+	enewgroup p2p
+	enewuser p2p
+}
+
+src_install() {
+	dosbin "${OUT}"/p2p-client
+	dosbin "${OUT}"/p2p-server
+	dosbin "${OUT}"/p2p-http-server
+
+	insinto /etc/init
+	doins data/p2p.conf
+
+	# Install fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+			"${OUT}"/p2p_http_server_fuzzer
+}
diff --git a/chromeos-base/p2p/p2p-9999.ebuild b/chromeos-base/p2p/p2p-9999.ebuild
index 33a1c1b..7dc85dc 100644
--- a/chromeos-base/p2p/p2p-9999.ebuild
+++ b/chromeos-base/p2p/p2p-9999.ebuild
@@ -23,7 +23,7 @@
 KEYWORDS="~*"
 IUSE=""
 
-COMMON_DEPEND="chromeos-base/metrics:=
+COMMON_DEPEND=">=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/glib:=
 	net-dns/avahi-daemon:=
 	net-firewall/iptables:="
diff --git a/chromeos-base/patchpanel-client/patchpanel-client-0.0.1-r14.ebuild b/chromeos-base/patchpanel-client/patchpanel-client-0.0.1-r14.ebuild
new file mode 100644
index 0000000..34e0761
--- /dev/null
+++ b/chromeos-base/patchpanel-client/patchpanel-client-0.0.1-r14.ebuild
@@ -0,0 +1,67 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="0a70acf40b774cf9c5d4f41cb5787d3862ca9348"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2c0fbdc6a39fdedb92ac536175e351099402b6ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
+
+PLATFORM_SUBDIR="patchpanel/dbus"
+
+inherit cros-workon platform
+
+DESCRIPTION="Patchpanel network connectivity management D-Bus client"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/patchpanel/dbus/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# These USE flags are used in patchpanel/dbus/BUILD.gn
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+"
+
+# libpatchpanel-client.so and libpatchpanel-client.pc moved from
+# chromeos-base/patchpanel.
+RDEPEND="
+	!<chromeos-base/patchpanel-0.0.2
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+patchpanel_client_header() {
+	doins "$1"
+	sed -i '/.pb.h/! s:patchpanel/:chromeos/patchpanel/dbus/:g' \
+		"${D}/usr/include/chromeos/patchpanel/dbus/$1" || die
+}
+
+src_install() {
+	# Libraries.
+	dolib.so "${OUT}"/lib/libpatchpanel-client.so
+
+	"${S}"/preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}" || die
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/libpatchpanel-client.pc
+
+	insinto /usr/include/chromeos/patchpanel/dbus
+	patchpanel_client_header client.h
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/patchpanel-client_testrunner"
+}
diff --git a/chromeos-base/patchpanel-client/patchpanel-client-9999.ebuild b/chromeos-base/patchpanel-client/patchpanel-client-9999.ebuild
new file mode 100644
index 0000000..1656ddb
--- /dev/null
+++ b/chromeos-base/patchpanel-client/patchpanel-client-9999.ebuild
@@ -0,0 +1,65 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk patchpanel .gn"
+
+PLATFORM_SUBDIR="patchpanel/dbus"
+
+inherit cros-workon platform
+
+DESCRIPTION="Patchpanel network connectivity management D-Bus client"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/patchpanel/dbus/"
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+
+# These USE flags are used in patchpanel/dbus/BUILD.gn
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+"
+
+# libpatchpanel-client.so and libpatchpanel-client.pc moved from
+# chromeos-base/patchpanel.
+RDEPEND="
+	!<chromeos-base/patchpanel-0.0.2
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+patchpanel_client_header() {
+	doins "$1"
+	sed -i '/.pb.h/! s:patchpanel/:chromeos/patchpanel/dbus/:g' \
+		"${D}/usr/include/chromeos/patchpanel/dbus/$1" || die
+}
+
+src_install() {
+	# Libraries.
+	dolib.so "${OUT}"/lib/libpatchpanel-client.so
+
+	"${S}"/preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}" || die
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/libpatchpanel-client.pc
+
+	insinto /usr/include/chromeos/patchpanel/dbus
+	patchpanel_client_header client.h
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/patchpanel-client_testrunner"
+}
diff --git a/chromeos-base/patchpanel/files/chromeos-version.sh b/chromeos-base/patchpanel/files/chromeos-version.sh
new file mode 100755
index 0000000..c3b0f3f
--- /dev/null
+++ b/chromeos-base/patchpanel/files/chromeos-version.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# This echo statement sets the package base version (without its -r value).
+# If it is necessary to add a new blocker or version dependency on this ebuild
+# at the same time as revving the ebuild to a known version value, editing this
+# version can be useful.
+echo 0.0.2
diff --git a/chromeos-base/patchpanel/patchpanel-0.0.1-r58.ebuild b/chromeos-base/patchpanel/patchpanel-0.0.1-r58.ebuild
deleted file mode 100644
index cf3f22c..0000000
--- a/chromeos-base/patchpanel/patchpanel-0.0.1-r58.ebuild
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="05b5852bbf00f85e097be08bf5344d2f735171d7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "769e73d163dc671e97eeb278eefcf36cfdd1c94c" "1dc8b59c15baa1c29106e0efdc754feaae0a351e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk patchpanel shill/net .gn"
-
-PLATFORM_SUBDIR="patchpanel"
-
-inherit cros-workon libchrome platform user
-
-DESCRIPTION="Patchpanel network connectivity management daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# These USE flags are used in patchpanel/BUILD.gn
-IUSE="fuzzer arcvm"
-
-COMMON_DEPEND="
-	dev-libs/protobuf:=
-	!chromeos-base/arc-networkd
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	net-firewall/iptables
-	net-misc/bridge-utils
-	sys-apps/iproute2
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/permission_broker-client:=
-	chromeos-base/session_manager-client:=
-	chromeos-base/shill:=
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-patchpanel_header() {
-	doins "$1"
-	sed -i '/.pb.h/! s/patchpanel\//chromeos\/patchpanel\//g' "${D}/usr/include/chromeos/patchpanel/$1" || die
-}
-
-src_install() {
-	# Main binary.
-	dobin "${OUT}"/patchpaneld
-
-	# Libraries.
-	dolib.so "${OUT}"/lib/libpatchpanel-util.so
-	dolib.so "${OUT}"/lib/libpatchpanel-client.so
-
-	"${S}"/preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/libpatchpanel-util.pc
-	doins "${OUT}"/libpatchpanel-client.pc
-
-	insinto /usr/include/chromeos/patchpanel/
-	patchpanel_header address_manager.h
-	patchpanel_header client.h
-	patchpanel_header mac_address_generator.h
-	patchpanel_header net_util.h
-	patchpanel_header socket.h
-	patchpanel_header socket_forwarder.h
-	patchpanel_header subnet.h
-	patchpanel_header subnet_pool.h
-
-	insinto /etc/init
-	doins "${S}"/init/patchpanel.conf
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/*.conf
-
-	local fuzzer
-	for fuzzer in "${OUT}"/*_fuzzer; do
-		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
-	done
-}
-
-pkg_preinst() {
-	# Service account used for privilege separation.
-	enewuser patchpaneld
-	enewgroup patchpaneld
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/patchpanel_testrunner"
-}
-
diff --git a/chromeos-base/patchpanel/patchpanel-0.0.2-r120.ebuild b/chromeos-base/patchpanel/patchpanel-0.0.2-r120.ebuild
new file mode 100644
index 0000000..648731b
--- /dev/null
+++ b/chromeos-base/patchpanel/patchpanel-0.0.2-r120.ebuild
@@ -0,0 +1,94 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="0a70acf40b774cf9c5d4f41cb5787d3862ca9348"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "2c0fbdc6a39fdedb92ac536175e351099402b6ae" "5d5e405eab09b29c43db777f61650b9187b8bce3" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk patchpanel shill/net .gn"
+
+PLATFORM_SUBDIR="patchpanel"
+
+inherit cros-workon libchrome platform user
+
+DESCRIPTION="Patchpanel network connectivity management daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# These USE flags are used in patchpanel/BUILD.gn
+IUSE="fuzzer arcvm jetstream_routing"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+	!chromeos-base/arc-networkd
+	chromeos-base/shill-net:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/shill
+	net-firewall/iptables
+	net-misc/bridge-utils
+	sys-apps/iproute2
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/session_manager-client:=
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+patchpanel_header() {
+	doins "$1"
+	sed -i '/.pb.h/! s:patchpanel/:chromeos/patchpanel/:g' \
+		"${D}/usr/include/chromeos/patchpanel/$1" || die
+}
+
+src_install() {
+	# Main binary.
+	dobin "${OUT}"/patchpaneld
+
+	# Libraries.
+	dolib.so "${OUT}"/lib/libpatchpanel-util.so
+
+	"${S}"/preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/libpatchpanel-util.pc
+
+	insinto /usr/include/chromeos/patchpanel/
+	patchpanel_header address_manager.h
+	patchpanel_header mac_address_generator.h
+	patchpanel_header net_util.h
+	patchpanel_header socket.h
+	patchpanel_header socket_forwarder.h
+	patchpanel_header subnet.h
+	patchpanel_header subnet_pool.h
+
+	insinto /etc/init
+	doins "${S}"/init/patchpanel.conf
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/*.conf
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+pkg_preinst() {
+	# Service account used for privilege separation.
+	enewuser patchpaneld
+	enewgroup patchpaneld
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/patchpanel_testrunner"
+}
+
diff --git a/chromeos-base/patchpanel/patchpanel-9999.ebuild b/chromeos-base/patchpanel/patchpanel-9999.ebuild
index b23a99f..6816d05 100644
--- a/chromeos-base/patchpanel/patchpanel-9999.ebuild
+++ b/chromeos-base/patchpanel/patchpanel-9999.ebuild
@@ -19,15 +19,17 @@
 KEYWORDS="~*"
 
 # These USE flags are used in patchpanel/BUILD.gn
-IUSE="fuzzer arcvm"
+IUSE="fuzzer arcvm jetstream_routing"
 
 COMMON_DEPEND="
 	dev-libs/protobuf:=
 	!chromeos-base/arc-networkd
+	chromeos-base/shill-net:=
 "
 
 RDEPEND="
 	${COMMON_DEPEND}
+	chromeos-base/shill
 	net-firewall/iptables
 	net-misc/bridge-utils
 	sys-apps/iproute2
@@ -35,16 +37,15 @@
 
 DEPEND="
 	${COMMON_DEPEND}
-	chromeos-base/permission_broker-client:=
 	chromeos-base/session_manager-client:=
-	chromeos-base/shill:=
 	chromeos-base/shill-client:=
 	chromeos-base/system_api:=[fuzzer?]
 "
 
 patchpanel_header() {
 	doins "$1"
-	sed -i '/.pb.h/! s/patchpanel\//chromeos\/patchpanel\//g' "${D}/usr/include/chromeos/patchpanel/$1" || die
+	sed -i '/.pb.h/! s:patchpanel/:chromeos/patchpanel/:g' \
+		"${D}/usr/include/chromeos/patchpanel/$1" || die
 }
 
 src_install() {
@@ -53,16 +54,13 @@
 
 	# Libraries.
 	dolib.so "${OUT}"/lib/libpatchpanel-util.so
-	dolib.so "${OUT}"/lib/libpatchpanel-client.so
 
 	"${S}"/preinstall.sh "${PV}" "/usr/include/chromeos" "${OUT}"
 	insinto "/usr/$(get_libdir)/pkgconfig"
 	doins "${OUT}"/libpatchpanel-util.pc
-	doins "${OUT}"/libpatchpanel-client.pc
 
 	insinto /usr/include/chromeos/patchpanel/
 	patchpanel_header address_manager.h
-	patchpanel_header client.h
 	patchpanel_header mac_address_generator.h
 	patchpanel_header net_util.h
 	patchpanel_header socket.h
diff --git a/chromeos-base/perfetto/Manifest b/chromeos-base/perfetto/Manifest
new file mode 100644
index 0000000..afc9667
--- /dev/null
+++ b/chromeos-base/perfetto/Manifest
@@ -0,0 +1 @@
+DIST perfetto-8.0_pre20200926.tar.gz 10234550 BLAKE2B b894a21efa6c24b7a0dcdcd7b92b9238b022b5eeb86ad95f2f63b4b6786970bd90eaa0f215d95d23703534164a5c0c4ba82e4a2f7c5d7f1c1fbad26934b22b48 SHA512 59b452107e6b9aaa6a5ba5ab0939c6bb71bd5834441356f50621963c4b64249f8799cf7a1f398b23c5af95a66cd82755a607de43833bf85c1425dd898d45a239
diff --git a/chromeos-base/perfetto/perfetto-8.0_pre20200926-r1.ebuild b/chromeos-base/perfetto/perfetto-8.0_pre20200926-r1.ebuild
new file mode 120000
index 0000000..397f9f4
--- /dev/null
+++ b/chromeos-base/perfetto/perfetto-8.0_pre20200926-r1.ebuild
@@ -0,0 +1 @@
+perfetto-8.0_pre20200926.ebuild
\ No newline at end of file
diff --git a/chromeos-base/perfetto/perfetto-8.0_pre20200926.ebuild b/chromeos-base/perfetto/perfetto-8.0_pre20200926.ebuild
new file mode 100644
index 0000000..db970cd
--- /dev/null
+++ b/chromeos-base/perfetto/perfetto-8.0_pre20200926.ebuild
@@ -0,0 +1,84 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+inherit ninja-utils toolchain-funcs
+
+DESCRIPTION="An open-source project for performance instrumentation and tracing."
+HOMEPAGE="https://perfetto.dev/"
+
+GIT_SHA1="df3ae5e6f975204d2f35aeed61cbbd0746151d8e"
+SRC_URI="https://github.com/google/perfetto/archive/${GIT_SHA1}.tar.gz -> ${P}.tar.gz"
+
+KEYWORDS="*"
+IUSE="cros-debug"
+LICENSE="Apache-2.0"
+SLOT="0"
+
+# protobuf dep is for using protoc at build-time to generate perfetto's headers.
+BDEPEND="
+	dev-util/gn
+	dev-util/ninja
+	dev-libs/protobuf
+"
+BUILD_OUTPUT="${WORKDIR}/out_cros/"
+
+S="${WORKDIR}/${PN}-${GIT_SHA1}"
+
+src_configure() {
+	tc-export CC CXX AR BUILD_CC BUILD_CXX BUILD_AR
+	local target_cpu="${ARCH}"
+	# Make the "amd64" -> "x64" conversion for the GN arg |target_cpu|.
+	if [[ "${target_cpu}" == "amd64" ]]; then
+		target_cpu="x64"
+	fi
+
+	local is_debug="false"
+	use cros-debug && is_debug="true"
+
+	local warn_flags=(
+		"-Wno-suggest-destructor-override"
+		"-Wno-suggest-override"
+	)
+	# Cross-compilation args.
+	GN_ARGS="
+is_system_compiler=true
+ar=\"${BUILD_AR}\"
+cc=\"${BUILD_CC}\"
+cxx=\"${BUILD_CXX}\"
+target_ar=\"${AR}\"
+target_cc=\"${CC}\"
+target_cxx=\"${CXX}\"
+target_cpu=\"${target_cpu}\"
+target_triplet=\"${CHOST}\"
+extra_target_cflags=\"${CFLAGS} ${warn_flags[*]}\"
+extra_target_cxxflags=\"${CXXFLAGS} ${warn_flags[*]}\"
+extra_target_ldflags=\"${LDFLAGS}\"
+"
+
+	# Extra args to make the targets build.
+	GN_ARGS+="
+is_debug=${is_debug}
+enable_perfetto_stderr_crash_dump=false
+enable_perfetto_trace_processor_json=false
+monolithic_binaries=true
+use_custom_libcxx=false
+is_hermetic_clang=false
+enable_perfetto_zlib=false
+skip_buildtools_check=true
+perfetto_use_system_protobuf=true
+enable_perfetto_version_gen=false
+"
+	einfo "GN_ARGS = ${GN_ARGS}"
+	gn gen "${BUILD_OUTPUT}" --args="${GN_ARGS}" || die
+}
+
+src_compile() {
+	eninja -C  "${BUILD_OUTPUT}" traced traced_probes perfetto
+}
+
+src_install() {
+	dobin "${BUILD_OUTPUT}/traced"
+	dobin "${BUILD_OUTPUT}/traced_probes"
+	dobin "${BUILD_OUTPUT}/perfetto"
+}
diff --git a/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1793.ebuild b/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1793.ebuild
deleted file mode 100644
index 406d44d..0000000
--- a/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1793.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="d48463e0e488481ef1e61965bbeddfdcc1aa61b0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "420573281f25e737e0f006ae23a329b3b1402457" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk permission_broker .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="permission_broker/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Permission Broker DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies.
-DEPEND="
-	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "permission_broker"
-}
diff --git a/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1819.ebuild b/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1819.ebuild
new file mode 100644
index 0000000..4480713
--- /dev/null
+++ b/chromeos-base/permission_broker-client/permission_broker-client-0.0.1-r1819.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk permission_broker .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="permission_broker/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Permission Broker DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies.
+DEPEND="
+	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "permission_broker"
+}
diff --git a/chromeos-base/permission_broker/permission_broker-0.0.1-r3044.ebuild b/chromeos-base/permission_broker/permission_broker-0.0.1-r3044.ebuild
deleted file mode 100644
index e0c8884..0000000
--- a/chromeos-base/permission_broker/permission_broker-0.0.1-r3044.ebuild
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="d48463e0e488481ef1e61965bbeddfdcc1aa61b0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "420573281f25e737e0f006ae23a329b3b1402457" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk permission_broker .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="${PN}"
-
-inherit cros-workon platform udev user
-
-DESCRIPTION="Permission Broker for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cfm_enabled_device fuzzer"
-
-COMMMON_DEPEND="
-	sys-apps/dbus:=
-	virtual/libusb:1
-	virtual/udev
-"
-
-RDEPEND="${COMMMON_DEPEND}"
-DEPEND="${COMMMON_DEPEND}
-	chromeos-base/session_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	sys-kernel/linux-headers:=
-"
-
-src_install() {
-	dobin "${OUT}"/permission_broker
-
-	# Install upstart configuration
-	insinto /etc/init
-	doins permission_broker.conf
-
-	# DBus configuration
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.PermissionBroker.conf
-
-	# Udev rules for hidraw nodes
-	udev_dorules "${FILESDIR}/99-hidraw.rules"
-
-	# Fuzzer.
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firewall_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/port_tracker_fuzzer
-}
-
-platform_pkg_test() {
-	local tests=(
-		permission_broker_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
-pkg_preinst() {
-	enewuser "devbroker"
-	enewgroup "devbroker"
-}
diff --git a/chromeos-base/permission_broker/permission_broker-0.0.1-r3071.ebuild b/chromeos-base/permission_broker/permission_broker-0.0.1-r3071.ebuild
new file mode 100644
index 0000000..e874731
--- /dev/null
+++ b/chromeos-base/permission_broker/permission_broker-0.0.1-r3071.ebuild
@@ -0,0 +1,71 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk permission_broker .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="${PN}"
+
+inherit cros-workon platform udev user
+
+DESCRIPTION="Permission Broker for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cfm_enabled_device fuzzer"
+
+COMMMON_DEPEND="
+	chromeos-base/patchpanel-client:=
+	sys-apps/dbus:=
+	virtual/libusb:1
+	virtual/udev
+"
+
+RDEPEND="${COMMMON_DEPEND}"
+DEPEND="${COMMMON_DEPEND}
+	chromeos-base/system_api:=[fuzzer?]
+	sys-kernel/linux-headers:=
+"
+
+src_install() {
+	dobin "${OUT}"/permission_broker
+
+	# Install upstart configuration
+	insinto /etc/init
+	doins permission_broker.conf
+
+	# DBus configuration
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.PermissionBroker.conf
+
+	# Udev rules for hidraw nodes
+	udev_dorules "${FILESDIR}/99-hidraw.rules"
+
+	# Fuzzer.
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/port_tracker_fuzzer
+}
+
+platform_pkg_test() {
+	local tests=(
+		permission_broker_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
+pkg_preinst() {
+	enewuser "devbroker"
+	enewgroup "devbroker"
+}
diff --git a/chromeos-base/permission_broker/permission_broker-9999.ebuild b/chromeos-base/permission_broker/permission_broker-9999.ebuild
index 3e604ab..dd8a538 100644
--- a/chromeos-base/permission_broker/permission_broker-9999.ebuild
+++ b/chromeos-base/permission_broker/permission_broker-9999.ebuild
@@ -22,6 +22,7 @@
 IUSE="cfm_enabled_device fuzzer"
 
 COMMMON_DEPEND="
+	chromeos-base/patchpanel-client:=
 	sys-apps/dbus:=
 	virtual/libusb:1
 	virtual/udev
@@ -29,7 +30,6 @@
 
 RDEPEND="${COMMMON_DEPEND}"
 DEPEND="${COMMMON_DEPEND}
-	chromeos-base/session_manager-client:=
 	chromeos-base/system_api:=[fuzzer?]
 	sys-kernel/linux-headers:=
 "
@@ -49,7 +49,6 @@
 	udev_dorules "${FILESDIR}/99-hidraw.rules"
 
 	# Fuzzer.
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/firewall_fuzzer
 	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/port_tracker_fuzzer
 }
 
diff --git a/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r140.ebuild b/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r140.ebuild
deleted file mode 100644
index e8d6df3f..0000000
--- a/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r140.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="f893e46fb86e93ddd978c6545b58648ac0679195"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f6e985347a838bbbdd2997e97c4b4940571f2dd2" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_GO_PACKAGES=(
-	"chromiumos/policy/..."
-)
-
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk policy_proto .gn"
-
-PLATFORM_SUBDIR="policy_proto"
-
-inherit cros-go cros-workon platform
-
-DESCRIPTION="Chrome OS policy protocol buffer binding for go"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_proto"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="
-	>=chromeos-base/protofiles-0.0.39:=
-	dev-go/protobuf:=
-	dev-libs/protobuf:=
-"
-
-src_unpack() {
-	platform_src_unpack
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-}
diff --git a/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r161.ebuild b/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r161.ebuild
new file mode 100644
index 0000000..ab0f381
--- /dev/null
+++ b/chromeos-base/policy-go-proto/policy-go-proto-0.0.1-r161.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "f6e985347a838bbbdd2997e97c4b4940571f2dd2" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_GO_PACKAGES=(
+	"chromiumos/policy/..."
+)
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk policy_proto .gn"
+
+PLATFORM_SUBDIR="policy_proto"
+
+inherit cros-go cros-workon platform
+
+DESCRIPTION="Chrome OS policy protocol buffer binding for go"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_proto"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="
+	>=chromeos-base/protofiles-0.0.39:=
+	dev-go/protobuf:=
+	dev-libs/protobuf:=
+"
+
+src_install() {
+	cros-go_src_install
+}
+
+src_unpack() {
+	platform_src_unpack
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+}
diff --git a/chromeos-base/policy-go-proto/policy-go-proto-9999.ebuild b/chromeos-base/policy-go-proto/policy-go-proto-9999.ebuild
index 6debb70..835a1e5 100644
--- a/chromeos-base/policy-go-proto/policy-go-proto-9999.ebuild
+++ b/chromeos-base/policy-go-proto/policy-go-proto-9999.ebuild
@@ -28,6 +28,10 @@
 	dev-libs/protobuf:=
 "
 
+src_install() {
+	cros-go_src_install
+}
+
 src_unpack() {
 	platform_src_unpack
 	CROS_GO_WORKSPACE="${OUT}/gen/go"
diff --git a/chromeos-base/policy-testserver/policy-testserver-0.0.1-r5.ebuild b/chromeos-base/policy-testserver/policy-testserver-0.0.1-r6.ebuild
similarity index 100%
rename from chromeos-base/policy-testserver/policy-testserver-0.0.1-r5.ebuild
rename to chromeos-base/policy-testserver/policy-testserver-0.0.1-r6.ebuild
diff --git a/chromeos-base/policy-testserver/policy-testserver-0.0.1.ebuild b/chromeos-base/policy-testserver/policy-testserver-0.0.1.ebuild
index a5316ca..210a5bf 100644
--- a/chromeos-base/policy-testserver/policy-testserver-0.0.1.ebuild
+++ b/chromeos-base/policy-testserver/policy-testserver-0.0.1.ebuild
@@ -21,7 +21,7 @@
 
 	"components/policy"
 	"${CROS_GIT_HOST_URL}/chromium/src/components/policy.git"
-	"6bed99ebb2035b0ad6cdc6ed841157e42e4b0a1f"
+	"80ecffd9093caa604b348bef86f6fb692d188e2c"
 )
 
 DESCRIPTION="Dependencies needed by the policy_testserver"
diff --git a/chromeos-base/policy_utils/policy_utils-0.0.1-r139.ebuild b/chromeos-base/policy_utils/policy_utils-0.0.1-r139.ebuild
deleted file mode 100644
index 90b6e18..0000000
--- a/chromeos-base/policy_utils/policy_utils-0.0.1-r139.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "bd13c84f484f05be0426fa99c88392099b9b64ee" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="common-mk policy_utils .gn"
-
-PLATFORM_SUBDIR="policy_utils"
-
-inherit cros-workon platform
-
-DESCRIPTION="Device-policy-management library and tool for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_utils/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-"
-
-src_install() {
-	dosbin "${OUT}/policy"
-}
-
-platform_pkg_test() {
-	local tests=(
-		libmgmt_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/policy_utils/policy_utils-0.0.1-r160.ebuild b/chromeos-base/policy_utils/policy_utils-0.0.1-r160.ebuild
new file mode 100644
index 0000000..93a6404
--- /dev/null
+++ b/chromeos-base/policy_utils/policy_utils-0.0.1-r160.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "28c2fe0289bb5ac5443a262b5cbbd38ab30763d5" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk policy_utils .gn"
+
+PLATFORM_SUBDIR="policy_utils"
+
+inherit cros-workon platform
+
+DESCRIPTION="Device-policy-management library and tool for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_utils/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+"
+
+src_install() {
+	dosbin "${OUT}/policy"
+}
+
+platform_pkg_test() {
+	local tests=(
+		libmgmt_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1951.ebuild b/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1951.ebuild
deleted file mode 100644
index 803dd0b..0000000
--- a/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1951.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="d442b271ff79d879553a52282c1ce279a9e402fb"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk power_manager .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="power_manager/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Power manager DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-DEPEND=""
-RDEPEND=""
-
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings:=
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "power_manager"
-}
diff --git a/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1991.ebuild b/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1991.ebuild
new file mode 100644
index 0000000..db32343
--- /dev/null
+++ b/chromeos-base/power_manager-client/power_manager-client-0.0.1-r1991.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="eb82187f0263886ba814e3d0bd0c3e9cbfb2cf70"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "47494d35dcb27c2b0340dd8a7508845488139951" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk power_manager .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="power_manager/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Power manager DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+DEPEND=""
+RDEPEND=""
+
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings:=
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "power_manager"
+}
diff --git a/chromeos-base/power_manager/power_manager-0.0.2-r3462.ebuild b/chromeos-base/power_manager/power_manager-0.0.2-r3462.ebuild
deleted file mode 100644
index f24bc67..0000000
--- a/chromeos-base/power_manager/power_manager-0.0.2-r3462.ebuild
+++ /dev/null
@@ -1,177 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "03aecfc1ac4d322587fe2a5efc6c3e3abf118627" "6287b0913be5aaea79569d55d989b9b729396f10" "7e189936f29d145c4191ea147e48256c92fac75d" "b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_USE_VCSID="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk buffet chromeos-config metrics power_manager .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="power_manager"
-
-inherit cros-workon platform systemd udev user
-
-DESCRIPTION="Power Manager for Chromium OS"
-HOMEPAGE="http://dev.chromium.org/chromium-os/packages/power_manager"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-als buffet +cras cros_embedded +display_backlight fuzzer generated_cros_config -has_keyboard_backlight -keyboard_includes_side_buttons keyboard_convertible_no_side_buttons -legacy_power_button -mosys_eventlog +powerknobs systemd +touchpad_wakeup -touchscreen_wakeup unibuild wilco"
-REQUIRED_USE="
-	?? ( keyboard_includes_side_buttons keyboard_convertible_no_side_buttons )"
-
-COMMON_DEPEND="
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	chromeos-base/chromeos-config-tools:=
-	chromeos-base/metrics:=
-	dev-libs/libnl:=
-	dev-libs/protobuf:=
-	cras? ( media-sound/adhd:= )
-	virtual/udev"
-
-RDEPEND="${COMMON_DEPEND}
-	chromeos-base/ec-utils
-	mosys_eventlog? ( sys-apps/mosys )
-"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/chromeos-ec-headers:=
-	chromeos-base/system_api:=[fuzzer?]"
-
-pkg_setup() {
-	# Create the 'power' user and group here in pkg_setup as src_install needs
-	# them to change the ownership of power manager files.
-	enewuser "power"
-	enewgroup "power"
-	# Ensure that this group exists so that power_manager can access
-	# /dev/cros_ec.
-	enewgroup "cros_ec-access"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	# Binaries for production
-	dobin "${OUT}"/backlight_tool  # boot-splash, chromeos-boot-alert
-	dobin "${OUT}"/dump_power_status  # crosh's battery_test command
-	dobin "${OUT}"/powerd
-	dobin "${OUT}"/powerd_setuid_helper
-	dobin "${OUT}"/power_supply_info  # feedback
-	dobin "${OUT}"/set_cellular_transmit_power
-	dobin "${OUT}"/set_wifi_transmit_power
-	fowners root:power /usr/bin/powerd_setuid_helper
-	fperms 4750 /usr/bin/powerd_setuid_helper
-
-	# Binaries for testing and debugging
-	dobin "${OUT}"/check_powerd_config
-	use amd64 && dobin "${OUT}"/dump_intel_rapl_consumption
-	dobin "${OUT}"/inject_powerd_input_event
-	dobin "${OUT}"/memory_suspend_test
-	dobin "${OUT}"/powerd_dbus_suspend
-	dobin "${OUT}"/send_debug_power_status
-	dobin "${OUT}"/set_power_policy
-	dobin "${OUT}"/suspend_delay_sample
-
-	# Scripts for production
-	dobin powerd/powerd_suspend
-	dobin tools/cpufreq_config
-	dobin tools/print_sysfs_power_supply_data  # feedback
-	dobin tools/send_metrics_on_resume
-
-	# Scripts for testing and debugging
-	dobin tools/activate_short_dark_resume
-	dobin tools/debug_sleep_quickly
-	dobin tools/set_short_powerd_timeouts
-	dobin tools/suspend_stress_test
-
-	# Preferences
-	insinto /usr/share/power_manager
-	doins default_prefs/*
-	use als && doins optional_prefs/has_ambient_light_sensor
-	use cras && doins optional_prefs/use_cras
-	use display_backlight || doins optional_prefs/external_display_only
-	use has_keyboard_backlight && doins optional_prefs/has_keyboard_backlight
-	use legacy_power_button && doins optional_prefs/legacy_power_button
-	use mosys_eventlog && doins optional_prefs/mosys_eventlog
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.PowerManager.conf
-
-	# udev scripts and rules.
-	exeinto "$(get_udevdir)"
-	doexe udev/*.sh
-	udev_dorules udev/*.rules
-
-	if use powerknobs; then
-		udev/gen_autosuspend_rules.py > "${T}"/98-autosuspend.rules || die
-		udev_dorules "${T}"/98-autosuspend.rules
-		udev_dorules udev/optional/98-powerknobs.rules
-		dobin udev/optional/set_blkdev_pm
-		dobin udev/optional/allow_sata_min_power
-	fi
-	if use keyboard_includes_side_buttons; then
-		udev_dorules udev/optional/93-powerd-tags-keyboard-side-buttons.rules
-	elif use keyboard_convertible_no_side_buttons; then
-		udev_dorules udev/optional/93-powerd-tags-keyboard-convertible.rules
-	fi
-
-	if ! use touchpad_wakeup; then
-		udev_dorules udev/optional/93-powerd-tags-no-touchpad-wakeup.rules
-	elif use unibuild; then
-		udev_dorules udev/optional/93-powerd-tags-unibuild-touchpad-wakeup.rules
-	fi
-
-	if use touchscreen_wakeup; then
-		udev_dorules udev/optional/93-powerd-tags-touchscreen-wakeup.rules
-	fi
-
-	if use wilco; then
-		udev_dorules udev/optional/93-powerd-wilco-ec-files.rules
-	fi
-
-	# Init scripts
-	if use systemd; then
-		systemd_dounit init/systemd/*.service
-		systemd_enable_service boot-services.target powerd.service
-		systemd_enable_service system-services.target report-power-metrics.service
-		systemd_dotmpfilesd init/systemd/powerd_directories.conf
-	else
-		insinto /etc/init
-		doins init/upstart/*.conf
-	fi
-	exeinto /usr/share/cros/init
-	doexe init/shared/powerd-pre-start.sh
-
-	if use buffet; then
-		# Buffet command handler definition
-		insinto /etc/buffet/commands
-		doins powerd/buffet/*.json
-	fi
-
-	# Install fuzz targets.
-	local fuzzer
-	for fuzzer in "${OUT}"/*_fuzzer; do
-		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
-	done
-}
-
-platform_pkg_test() {
-	local tests=(
-		power_manager_daemon_test
-		power_manager_policy_test
-		power_manager_system_test
-		power_manager_util_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/power_manager/power_manager-0.0.2-r3548.ebuild b/chromeos-base/power_manager/power_manager-0.0.2-r3548.ebuild
new file mode 100644
index 0000000..2b9f6f9
--- /dev/null
+++ b/chromeos-base/power_manager/power_manager-0.0.2-r3548.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="eb82187f0263886ba814e3d0bd0c3e9cbfb2cf70"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "33ae40ab689f1eb6e4700c7bae6ba213d4da50d7" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "47494d35dcb27c2b0340dd8a7508845488139951" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_USE_VCSID="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk buffet chromeos-config metrics power_manager .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="power_manager"
+
+inherit cros-workon platform systemd udev user
+
+DESCRIPTION="Power Manager for Chromium OS"
+HOMEPAGE="http://dev.chromium.org/chromium-os/packages/power_manager"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-als buffet +cras cros_embedded +display_backlight fuzzer generated_cros_config -has_keyboard_backlight -keyboard_includes_side_buttons keyboard_convertible_no_side_buttons -legacy_power_button -mosys_eventlog +powerknobs systemd +touchpad_wakeup -touchscreen_wakeup unibuild wilco"
+REQUIRED_USE="
+	?? ( keyboard_includes_side_buttons keyboard_convertible_no_side_buttons )"
+
+COMMON_DEPEND="
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	chromeos-base/chromeos-config-tools:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/libnl:=
+	dev-libs/protobuf:=
+	dev-libs/re2:=
+	cras? ( media-sound/adhd:= )
+	virtual/udev"
+
+RDEPEND="${COMMON_DEPEND}
+	chromeos-base/ec-utils
+	mosys_eventlog? ( sys-apps/mosys )
+"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/chromeos-ec-headers:=
+	chromeos-base/system_api:=[fuzzer?]"
+
+pkg_setup() {
+	# Create the 'power' user and group here in pkg_setup as src_install needs
+	# them to change the ownership of power manager files.
+	enewuser "power"
+	enewgroup "power"
+	# Ensure that this group exists so that power_manager can access
+	# /dev/cros_ec.
+	enewgroup "cros_ec-access"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	# Binaries for production
+	dobin "${OUT}"/backlight_tool  # boot-splash, chromeos-boot-alert
+	dobin "${OUT}"/dump_power_status  # crosh's battery_test command
+	dobin "${OUT}"/powerd
+	dobin "${OUT}"/powerd_setuid_helper
+	dobin "${OUT}"/power_supply_info  # feedback
+	dobin "${OUT}"/set_cellular_transmit_power
+	dobin "${OUT}"/set_wifi_transmit_power
+	fowners root:power /usr/bin/powerd_setuid_helper
+	fperms 4750 /usr/bin/powerd_setuid_helper
+
+	# Binaries for testing and debugging
+	dobin "${OUT}"/check_powerd_config
+	use amd64 && dobin "${OUT}"/dump_intel_rapl_consumption
+	dobin "${OUT}"/inject_powerd_input_event
+	dobin "${OUT}"/memory_suspend_test
+	dobin "${OUT}"/powerd_dbus_suspend
+	dobin "${OUT}"/send_debug_power_status
+	dobin "${OUT}"/set_power_policy
+	dobin "${OUT}"/suspend_delay_sample
+
+	# Scripts for production
+	dobin powerd/powerd_suspend
+	dobin tools/cpufreq_config
+	dobin tools/print_sysfs_power_supply_data  # feedback
+	dobin tools/send_metrics_on_resume
+
+	# Scripts for testing and debugging
+	dobin tools/activate_short_dark_resume
+	dobin tools/debug_sleep_quickly
+	dobin tools/set_short_powerd_timeouts
+	dobin tools/suspend_stress_test
+
+	# Preferences
+	insinto /usr/share/power_manager
+	doins default_prefs/*
+	use als && doins optional_prefs/has_ambient_light_sensor
+	use cras && doins optional_prefs/use_cras
+	use display_backlight || doins optional_prefs/external_display_only
+	use has_keyboard_backlight && doins optional_prefs/has_keyboard_backlight
+	use legacy_power_button && doins optional_prefs/legacy_power_button
+	use mosys_eventlog && doins optional_prefs/mosys_eventlog
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.PowerManager.conf
+
+	# udev scripts and rules.
+	exeinto "$(get_udevdir)"
+	doexe udev/*.sh
+	udev_dorules udev/*.rules
+
+	if use powerknobs; then
+		udev/gen_autosuspend_rules.py > "${T}"/98-autosuspend.rules || die
+		udev_dorules "${T}"/98-autosuspend.rules
+		udev_dorules udev/optional/98-powerknobs.rules
+		dobin udev/optional/set_blkdev_pm
+		dobin udev/optional/allow_sata_min_power
+	fi
+	if use keyboard_includes_side_buttons; then
+		udev_dorules udev/optional/93-powerd-tags-keyboard-side-buttons.rules
+	elif use keyboard_convertible_no_side_buttons; then
+		udev_dorules udev/optional/93-powerd-tags-keyboard-convertible.rules
+	fi
+
+	if ! use touchpad_wakeup; then
+		udev_dorules udev/optional/93-powerd-tags-no-touchpad-wakeup.rules
+	elif use unibuild; then
+		udev_dorules udev/optional/93-powerd-tags-unibuild-touchpad-wakeup.rules
+	fi
+
+	if use touchscreen_wakeup; then
+		udev_dorules udev/optional/93-powerd-tags-touchscreen-wakeup.rules
+	fi
+
+	if use wilco; then
+		udev_dorules udev/optional/93-powerd-wilco-ec-files.rules
+
+		exeinto /usr/share/cros/init/optional
+		doexe init/shared/optional/powerd-pre-start-wilco.sh
+	fi
+
+	# Init scripts
+	if use systemd; then
+		systemd_dounit init/systemd/*.service
+		systemd_enable_service boot-services.target powerd.service
+		systemd_enable_service system-services.target report-power-metrics.service
+		systemd_dotmpfilesd init/systemd/powerd_directories.conf
+	else
+		insinto /etc/init
+		doins init/upstart/*.conf
+	fi
+	exeinto /usr/share/cros/init
+	doexe init/shared/powerd-pre-start.sh
+
+	if use buffet; then
+		# Buffet command handler definition
+		insinto /etc/buffet/commands
+		doins powerd/buffet/*.json
+	fi
+
+	# Install fuzz targets.
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	local tests=(
+		power_manager_daemon_test
+		power_manager_policy_test
+		power_manager_system_test
+		power_manager_util_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/power_manager/power_manager-9999.ebuild b/chromeos-base/power_manager/power_manager-9999.ebuild
index d57898f..47a5916 100644
--- a/chromeos-base/power_manager/power_manager-9999.ebuild
+++ b/chromeos-base/power_manager/power_manager-9999.ebuild
@@ -29,9 +29,10 @@
 		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
 	)
 	chromeos-base/chromeos-config-tools:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/libnl:=
 	dev-libs/protobuf:=
+	dev-libs/re2:=
 	cras? ( media-sound/adhd:= )
 	virtual/udev"
 
@@ -132,6 +133,9 @@
 
 	if use wilco; then
 		udev_dorules udev/optional/93-powerd-wilco-ec-files.rules
+
+		exeinto /usr/share/cros/init/optional
+		doexe init/shared/optional/powerd-pre-start-wilco.sh
 	fi
 
 	# Init scripts
diff --git a/chromeos-base/print_tools/OWNERS b/chromeos-base/print_tools/OWNERS
index ab107a9..5d5325c 100644
--- a/chromeos-base/print_tools/OWNERS
+++ b/chromeos-base/print_tools/OWNERS
@@ -1,3 +1,2 @@
 set noparent
-pawliczek@chromium.org
-skau@chromium.org
+include chromiumos/platform2:/print_tools/OWNERS
diff --git a/chromeos-base/print_tools/print_tools-0.0.1-r68.ebuild b/chromeos-base/print_tools/print_tools-0.0.1-r68.ebuild
deleted file mode 100644
index 55fa83c..0000000
--- a/chromeos-base/print_tools/print_tools-0.0.1-r68.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e32b875ee8bdcd1ae46bae8619e4d00d4d03636c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk print_tools .gn"
-
-PLATFORM_SUBDIR="print_tools"
-
-inherit cros-workon platform
-
-DESCRIPTION="Various tools for the native printing system."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/print_tools/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	chromeos-base/libipp:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_install() {
-	dobin "${OUT}"/printer_diag
-}
diff --git a/chromeos-base/print_tools/print_tools-0.0.1-r88.ebuild b/chromeos-base/print_tools/print_tools-0.0.1-r88.ebuild
new file mode 100644
index 0000000..8a40504
--- /dev/null
+++ b/chromeos-base/print_tools/print_tools-0.0.1-r88.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "d82c217496d3cd9f51b48f13a0d308dfaeaf5981" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk print_tools .gn"
+
+PLATFORM_SUBDIR="print_tools"
+
+inherit cros-workon platform
+
+DESCRIPTION="Various tools for the native printing system."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/print_tools/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	chromeos-base/libipp:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_install() {
+	dobin "${OUT}"/printer_diag
+}
diff --git a/chromeos-base/protofiles/files/VERSION b/chromeos-base/protofiles/files/VERSION
index 22f840d..552f0e9 100644
--- a/chromeos-base/protofiles/files/VERSION
+++ b/chromeos-base/protofiles/files/VERSION
@@ -1,4 +1,4 @@
-MAJOR=85
+MAJOR=86
 MINOR=0
-BUILD=4162
+BUILD=4237
 PATCH=0
diff --git a/chromeos-base/protofiles/protofiles-0.0.39.ebuild b/chromeos-base/protofiles/protofiles-0.0.39.ebuild
deleted file mode 100644
index 6e37a70..0000000
--- a/chromeos-base/protofiles/protofiles-0.0.39.ebuild
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# This project checks out the proto files from the read only repositories
-# linked to the following directories of the Chromium project:
-
-#   - src/components/policy
-
-# This project is not cros-work-able: if changes to the protobufs are needed
-# then they should be done in the Chromium repository, and the commits below
-# should be updated.
-
-EAPI="5"
-
-# We don't need the history at all.
-EGIT_CLONE_TYPE="shallow"
-
-# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
-PYTHON_COMPAT=( python2_7 )
-
-inherit cros-constants eutils git-r3 python-any-r1
-
-# Every 3 strings in this array indicates a repository to checkout:
-#   - A unique name (to avoid checkout conflits)
-#   - The repository URL
-#   - The commit to checkout
-EGIT_REPO_URIS=(
-	"cloud/policy"
-	"${CROS_GIT_HOST_URL}/chromium/src/components/policy.git"
-	"f394e6aaf4cf13d166e84b6ed3671567c5e7a391"
-
-	# If you uprev these repos, please also:
-	# - Update files/VERSION to the corresponding revision of
-	#   chromium/src/chrome/VERSION in the Chromium code base.
-	#   Only the MAJOR version matters, really. This is necessary so policy
-	#   code builders have the right set of policies.
-	# - Update authpolicy/policy/device_policy_encoder[_unittest].cc to
-	#   include new device policies. The unit test tells you missing ones:
-	#     cros_run_unit_tests --board=$BOARD --packages authpolicy
-	#   If you see unrelated test failures, make sure to rebuild the
-	#   authpolicy package and its dependencies (in particular, libbrillo
-	#   which provides libpolicy for accessing device policy) against the
-	#   updated protofiles package.
-	#   User policy is generated and doesn't have to be updated manually.
-	# - Bump the package version:
-	#     git mv protofiles-0.0.N.ebuild protofiles-0.0.N+1.ebuild
-)
-
-DESCRIPTION="Protobuf installer for the device policy proto definitions."
-HOMEPAGE="https://chromium.googlesource.com/chromium/src/components/policy"
-
-LICENSE="BSD-Google"
-SLOT="0/${PV}"
-KEYWORDS="*"
-IUSE=""
-
-POLICY_DIR="${S}/cloud/policy"
-
-# A list of the static protobuf files that exist in Chromium.
-POLICY_DIR_PROTO_FILES=(
-	"chrome_device_policy.proto"
-	"chrome_extension_policy.proto"
-	"device_management_backend.proto"
-	"install_attributes.proto"
-	"policy_common_definitions.proto"
-	"policy_signing_key.proto"
-	"record_constants.proto"
-)
-
-RDEPEND="!<chromeos-base/chromeos-chrome-82.0.4056.0_rc-r1"
-
-src_unpack() {
-	set -- "${EGIT_REPO_URIS[@]}"
-	while [[ $# -gt 0 ]]; do
-		EGIT_CHECKOUT_DIR="${S}/$1" \
-		EGIT_REPO_URI=$2 \
-		EGIT_COMMIT=$3 \
-		git-r3_src_unpack
-		shift 3
-	done
-}
-
-src_compile() {
-	# Generate cloud_policy.proto.
-	"${POLICY_DIR}/tools/generate_policy_source.py" \
-		--cloud-policy-protobuf="${WORKDIR}/cloud_policy.proto" \
-		--chrome-version-file="${FILESDIR}/VERSION" \
-		--policy-templates-file="${POLICY_DIR}/resources/policy_templates.json" \
-		--target-platform="chrome_os" \
-		|| die "Failed to generate cloud_policy.proto"
-}
-
-src_install() {
-	insinto /usr/include/proto
-	doins "${POLICY_DIR}"/proto/chrome_device_policy.proto
-	doins "${POLICY_DIR}"/proto/chrome_extension_policy.proto
-	doins "${POLICY_DIR}"/proto/install_attributes.proto
-	doins "${POLICY_DIR}"/proto/policy_signing_key.proto
-	doins "${POLICY_DIR}"/proto/device_management_backend.proto
-	insinto /usr/share/protofiles
-	doins "${POLICY_DIR}"/proto/chrome_device_policy.proto
-	doins "${POLICY_DIR}"/proto/policy_common_definitions.proto
-	doins "${POLICY_DIR}"/proto/device_management_backend.proto
-	doins "${POLICY_DIR}"/proto/chrome_extension_policy.proto
-	doins "${WORKDIR}"/cloud_policy.proto
-	dobin "${FILESDIR}"/policy_reader
-	insinto /usr/share/policy_resources
-	doins "${POLICY_DIR}"/resources/policy_templates.json
-	doins "${FILESDIR}"/VERSION
-	exeinto /usr/share/policy_tools
-	doexe "${POLICY_DIR}"/tools/generate_policy_source.py
-	sed -i -E '1{ /^#!/ s:(env )?python$:python2: }' \
-		"${D}/usr/share/policy_tools/generate_policy_source.py" || die
-
-	# Retrieve the proto files which exist in that path, with their full paths.
-	local policy_dir_proto_files=( "${POLICY_DIR}"/proto/*.proto )
-
-	# Convert policy_dir_proto_files into an array, and retrieving the files names, instead of their full path.
-	policy_dir_proto_files=( "${policy_dir_proto_files[@]##*/}" )
-
-	# Check whether all protobuf files that exist in Chromium side has already been installed in protofiles package or
-	# not. And to verify that the list in autotests package, which is using these protobuf files are up-to-date.
-	sorter() {
-		printf '%s\n' "$@" | LC_ALL=C sort
-	}
-	if [[ "$(sorter "${policy_dir_proto_files[@]}")" != "$(sorter "${POLICY_DIR_PROTO_FILES[@]}")" ]]; then
-		die "Add all new protobuf files into the sorted list of chromium protobuf files, which exist in protofiles package.
-			Please update all the imported protobuf files in autotest package in policy_protos.py file."
-	fi
-}
diff --git a/chromeos-base/protofiles/protofiles-0.0.41.ebuild b/chromeos-base/protofiles/protofiles-0.0.41.ebuild
new file mode 100644
index 0000000..173a2be
--- /dev/null
+++ b/chromeos-base/protofiles/protofiles-0.0.41.ebuild
@@ -0,0 +1,131 @@
+# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# This project checks out the proto files from the read only repositories
+# linked to the following directories of the Chromium project:
+
+#   - src/components/policy
+
+# This project is not cros-work-able: if changes to the protobufs are needed
+# then they should be done in the Chromium repository, and the commits below
+# should be updated.
+
+EAPI="5"
+
+# We don't need the history at all.
+EGIT_CLONE_TYPE="shallow"
+
+# TODO(crbug.com/984182): We force Python 2 because depot_tools doesn't support Python 3.
+PYTHON_COMPAT=( python2_7 )
+
+inherit cros-constants eutils git-r3 python-any-r1
+
+# Every 3 strings in this array indicates a repository to checkout:
+#   - A unique name (to avoid checkout conflits)
+#   - The repository URL
+#   - The commit to checkout
+EGIT_REPO_URIS=(
+	"cloud/policy"
+	"${CROS_GIT_HOST_URL}/chromium/src/components/policy.git"
+	"cd0f3e50ec649b79e36b1a1594b3c32116eb1f33"
+
+	# If you uprev these repos, please also:
+	# - Update files/VERSION to the corresponding revision of
+	#   chromium/src/chrome/VERSION in the Chromium code base.
+	#   Only the MAJOR version matters, really. This is necessary so policy
+	#   code builders have the right set of policies.
+	# - Update authpolicy/policy/device_policy_encoder[_unittest].cc to
+	#   include new device policies. The unit test tells you missing ones:
+	#     cros_run_unit_tests --board=$BOARD --packages authpolicy
+	#   If you see unrelated test failures, make sure to rebuild the
+	#   authpolicy package and its dependencies (in particular, libbrillo
+	#   which provides libpolicy for accessing device policy) against the
+	#   updated protofiles package.
+	#   User policy is generated and doesn't have to be updated manually.
+	# - Bump the package version:
+	#     git mv protofiles-0.0.N.ebuild protofiles-0.0.N+1.ebuild
+)
+
+DESCRIPTION="Protobuf installer for the device policy proto definitions."
+HOMEPAGE="https://chromium.googlesource.com/chromium/src/components/policy"
+
+LICENSE="BSD-Google"
+SLOT="0/${PV}"
+KEYWORDS="*"
+IUSE=""
+
+POLICY_DIR="${S}/cloud/policy"
+
+# A list of the static protobuf files that exist in Chromium.
+POLICY_DIR_PROTO_FILES=(
+	"chrome_device_policy.proto"
+	"chrome_extension_policy.proto"
+	"device_management_backend.proto"
+	"install_attributes.proto"
+	"policy_common_definitions.proto"
+	"policy_signing_key.proto"
+	"record.proto"
+	"record_constants.proto"
+)
+
+RDEPEND="!<chromeos-base/chromeos-chrome-82.0.4056.0_rc-r1"
+
+src_unpack() {
+	set -- "${EGIT_REPO_URIS[@]}"
+	while [[ $# -gt 0 ]]; do
+		EGIT_CHECKOUT_DIR="${S}/$1" \
+		EGIT_REPO_URI=$2 \
+		EGIT_COMMIT=$3 \
+		git-r3_src_unpack
+		shift 3
+	done
+}
+
+src_compile() {
+	# Generate cloud_policy.proto.
+	"${POLICY_DIR}/tools/generate_policy_source.py" \
+		--cloud-policy-protobuf="${WORKDIR}/cloud_policy.proto" \
+		--chrome-version-file="${FILESDIR}/VERSION" \
+		--policy-templates-file="${POLICY_DIR}/resources/policy_templates.json" \
+		--target-platform="chrome_os" \
+		|| die "Failed to generate cloud_policy.proto"
+}
+
+src_install() {
+	insinto /usr/include/proto
+	doins "${POLICY_DIR}"/proto/chrome_device_policy.proto
+	doins "${POLICY_DIR}"/proto/chrome_extension_policy.proto
+	doins "${POLICY_DIR}"/proto/install_attributes.proto
+	doins "${POLICY_DIR}"/proto/policy_signing_key.proto
+	doins "${POLICY_DIR}"/proto/device_management_backend.proto
+	insinto /usr/share/protofiles
+	doins "${POLICY_DIR}"/proto/chrome_device_policy.proto
+	doins "${POLICY_DIR}"/proto/policy_common_definitions.proto
+	doins "${POLICY_DIR}"/proto/device_management_backend.proto
+	doins "${POLICY_DIR}"/proto/chrome_extension_policy.proto
+	doins "${WORKDIR}"/cloud_policy.proto
+	dobin "${FILESDIR}"/policy_reader
+	insinto /usr/share/policy_resources
+	doins "${POLICY_DIR}"/resources/policy_templates.json
+	doins "${FILESDIR}"/VERSION
+	exeinto /usr/share/policy_tools
+	doexe "${POLICY_DIR}"/tools/generate_policy_source.py
+	sed -i -E '1{ /^#!/ s:(env )?python$:python2: }' \
+		"${D}/usr/share/policy_tools/generate_policy_source.py" || die
+
+	# Retrieve the proto files which exist in that path, with their full paths.
+	local policy_dir_proto_files=( "${POLICY_DIR}"/proto/*.proto )
+
+	# Convert policy_dir_proto_files into an array, and retrieving the files names, instead of their full path.
+	policy_dir_proto_files=( "${policy_dir_proto_files[@]##*/}" )
+
+	# Check whether all protobuf files that exist in Chromium side has already been installed in protofiles package or
+	# not. And to verify that the list in autotests package, which is using these protobuf files are up-to-date.
+	sorter() {
+		printf '%s\n' "$@" | LC_ALL=C sort
+	}
+	if [[ "$(sorter "${policy_dir_proto_files[@]}")" != "$(sorter "${POLICY_DIR_PROTO_FILES[@]}")" ]]; then
+		die "Add all new protobuf files into the sorted list of chromium protobuf files, which exist in protofiles package.
+			Please update all the imported protobuf files in autotest package in policy_protos.py file."
+	fi
+}
diff --git a/chromeos-base/quipper/Manifest b/chromeos-base/quipper/Manifest
index efcf872..c25cb52 100644
--- a/chromeos-base/quipper/Manifest
+++ b/chromeos-base/quipper/Manifest
@@ -1 +1 @@
-DIST quipper-75564b225722d164aba99e0d628b4a9af6e0e063.tar.gz 75810390 BLAKE2B 1f5c00b36accffeea0f265a69b4f8ad1b39f2d8b42103abffbed73884f94d97bc2630694e4c081dc37ee687fdc0508d7169451f436836f5a3779a783f583ff46 SHA512 f0aa3032c623324cfb94bdbf1047d6f6336991b947b86d32a4b3af26f18e143cbfe533acfc55ef75854f1c99b0db79ac6ca9d7c10dc29303b400990ee52928d5
+DIST quipper-f2342a4ef58a99e70a82fa63bdfea539477a4a8a.tar.gz 75824727 BLAKE2B 8ee18e69b8b3aceff016fdafe066d8f11a646a4833d065a33388745838eef3ab89e468b9590ace814b41397535fdcce0ecacac5ac266b06d04d0ffac8a615138 SHA512 33a7ddb8d2343e5d3f90b129b44e652aae276d8df6bf472ab3293fe60f0998dc8ff154e3316aac51c686296cf3fe6fad094436b717327e786ca2c64e035e9934
diff --git a/chromeos-base/quipper/quipper-0.0.1-r2595.ebuild b/chromeos-base/quipper/quipper-0.0.1-r2595.ebuild
deleted file mode 100644
index 0e48edb..0000000
--- a/chromeos-base/quipper/quipper-0.0.1-r2595.ebuild
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Don't use Makefile.external here as it fetches from the network.
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-# chromiumos-wide-profiling directory is in $SRC_URI, not in platform2.
-CROS_WORKON_SUBTREE="common-mk .gn"
-
-PLATFORM_SUBDIR="chromiumos-wide-profiling"
-
-inherit cros-workon platform
-
-DESCRIPTION="quipper: chromiumos wide profiling"
-HOMEPAGE="http://www.chromium.org/chromium-os/profiling-in-chromeos"
-GIT_SHA1="75564b225722d164aba99e0d628b4a9af6e0e063"
-SRC="quipper-${GIT_SHA1}.tar.gz"
-SRC_URI="gs://chromeos-localmirror/distfiles/${SRC}"
-SRC_DIR="src/${PN}"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	>=dev-cpp/gflags-2.0:=
-	>=dev-libs/glib-2.30:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-	dev-libs/re2:=
-	dev-util/perf:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/protofiles:=
-	test? ( app-shells/dash )
-"
-
-src_unpack() {
-	platform_src_unpack
-	mkdir "${S}"
-
-	pushd "${S}" >/dev/null
-	unpack ${SRC}
-	mv "${SRC_DIR}"/{.[!.],}* ./ || die
-	epatch "${FILESDIR}"/quipper-disable-flaky-tests.patch
-	epatch "${FILESDIR}"/quipper-arraysize.patch
-	popd >/dev/null
-}
-
-src_compile() {
-	# ARM tests run on qemu which is much slower. Exclude some large test
-	# data files for non-x86 boards.
-	if use x86 || use amd64 ; then
-		append-cppflags -DTEST_LARGE_PERF_DATA
-	fi
-
-	platform_src_compile
-}
-
-src_install() {
-	dobin "${OUT}"/quipper
-}
-
-platform_pkg_test() {
-	local tests=(
-		integration_tests
-		perf_recorder_test
-		unit_tests
-	)
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}" "1"
-	done
-}
diff --git a/chromeos-base/quipper/quipper-0.0.1-r2617.ebuild b/chromeos-base/quipper/quipper-0.0.1-r2617.ebuild
new file mode 100644
index 0000000..2a27d55
--- /dev/null
+++ b/chromeos-base/quipper/quipper-0.0.1-r2617.ebuild
@@ -0,0 +1,83 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Don't use Makefile.external here as it fetches from the network.
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+# chromiumos-wide-profiling directory is in $SRC_URI, not in platform2.
+CROS_WORKON_SUBTREE="common-mk .gn"
+
+PLATFORM_SUBDIR="chromiumos-wide-profiling"
+
+inherit cros-workon platform
+
+DESCRIPTION="quipper: chromiumos wide profiling"
+HOMEPAGE="http://www.chromium.org/chromium-os/profiling-in-chromeos"
+GIT_SHA1="f2342a4ef58a99e70a82fa63bdfea539477a4a8a"
+SRC="quipper-${GIT_SHA1}.tar.gz"
+SRC_URI="gs://chromeos-localmirror/distfiles/${SRC}"
+SRC_DIR="src/${PN}"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	>=dev-cpp/gflags-2.0:=
+	>=dev-libs/glib-2.30:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+	dev-libs/re2:=
+	dev-util/perf:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/protofiles:=
+	test? ( app-shells/dash )
+"
+
+src_unpack() {
+	platform_src_unpack
+	mkdir "${S}"
+
+	pushd "${S}" >/dev/null
+	unpack ${SRC}
+	mv "${SRC_DIR}"/{.[!.],}* ./ || die
+	eapply "${FILESDIR}"/quipper-disable-flaky-tests.patch
+	eapply "${FILESDIR}"/quipper-arraysize.patch
+	popd >/dev/null
+}
+
+src_compile() {
+	# ARM tests run on qemu which is much slower. Exclude some large test
+	# data files for non-x86 boards.
+	if use x86 || use amd64 ; then
+		append-cppflags -DTEST_LARGE_PERF_DATA
+	fi
+
+	platform_src_compile
+}
+
+src_install() {
+	dobin "${OUT}"/quipper
+}
+
+platform_pkg_test() {
+	local tests=(
+		integration_tests
+		perf_recorder_test
+		unit_tests
+	)
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}" "1"
+	done
+}
diff --git a/chromeos-base/quipper/quipper-9999.ebuild b/chromeos-base/quipper/quipper-9999.ebuild
index b17f225..22691a2 100644
--- a/chromeos-base/quipper/quipper-9999.ebuild
+++ b/chromeos-base/quipper/quipper-9999.ebuild
@@ -18,7 +18,7 @@
 
 DESCRIPTION="quipper: chromiumos wide profiling"
 HOMEPAGE="http://www.chromium.org/chromium-os/profiling-in-chromeos"
-GIT_SHA1="75564b225722d164aba99e0d628b4a9af6e0e063"
+GIT_SHA1="f2342a4ef58a99e70a82fa63bdfea539477a4a8a"
 SRC="quipper-${GIT_SHA1}.tar.gz"
 SRC_URI="gs://chromeos-localmirror/distfiles/${SRC}"
 SRC_DIR="src/${PN}"
@@ -50,8 +50,8 @@
 	pushd "${S}" >/dev/null
 	unpack ${SRC}
 	mv "${SRC_DIR}"/{.[!.],}* ./ || die
-	epatch "${FILESDIR}"/quipper-disable-flaky-tests.patch
-	epatch "${FILESDIR}"/quipper-arraysize.patch
+	eapply "${FILESDIR}"/quipper-disable-flaky-tests.patch
+	eapply "${FILESDIR}"/quipper-arraysize.patch
 	popd >/dev/null
 }
 
diff --git a/chromeos-base/recover-duts/recover-duts-0.0.1-r419.ebuild b/chromeos-base/recover-duts/recover-duts-0.0.1-r419.ebuild
deleted file mode 100644
index 51d1ab0..0000000
--- a/chromeos-base/recover-duts/recover-duts-0.0.1-r419.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="eb7540005dc36527f3c800f20da876fc4602de71"
-CROS_WORKON_TREE="f36691b14ba37c189dc2391226bd8bc9c3592706"
-CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
-CROS_WORKON_LOCALNAME="crostestutils"
-CROS_WORKON_SUBTREE="recover_duts"
-
-inherit cros-workon
-
-DESCRIPTION="Test tool that recovers bricked Chromium OS test devices"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/master/recover_duts/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/chromeos-init
-"
-
-DEPEND=""
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/recover_duts"
-}
-
-src_install() {
-	dosbin reload_network_device
-
-	exeinto /usr/libexec/recover-duts
-	newexe recover_duts.sh recover_duts
-
-	exeinto /usr/libexec/recover-duts/hooks
-	doexe hooks/*
-}
diff --git a/chromeos-base/recover-duts/recover-duts-0.0.1-r421.ebuild b/chromeos-base/recover-duts/recover-duts-0.0.1-r421.ebuild
new file mode 100644
index 0000000..cd35e57
--- /dev/null
+++ b/chromeos-base/recover-duts/recover-duts-0.0.1-r421.ebuild
@@ -0,0 +1,39 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="6e511de8901a322f54054e0f2885f1654ec49972"
+CROS_WORKON_TREE="f4b9ec28863b19d383a13538b72050113cea51cc"
+CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
+CROS_WORKON_LOCALNAME="crostestutils"
+CROS_WORKON_SUBTREE="recover_duts"
+
+inherit cros-workon
+
+DESCRIPTION="Test tool that recovers bricked Chromium OS test devices"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/master/recover_duts/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/chromeos-init
+"
+
+DEPEND=""
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/recover_duts"
+}
+
+src_install() {
+	dosbin reload_network_device
+
+	exeinto /usr/libexec/recover-duts
+	newexe recover_duts.sh recover_duts
+
+	exeinto /usr/libexec/recover-duts/hooks
+	doexe hooks/*
+}
diff --git a/chromeos-base/regions/regions-0.0.1-r2013.ebuild b/chromeos-base/regions/regions-0.0.1-r2013.ebuild
deleted file mode 100644
index 9f801fd..0000000
--- a/chromeos-base/regions/regions-0.0.1-r2013.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="fd69c2f9787569b44f1b718593443662a30633b4"
-CROS_WORKON_TREE="dc342a511c5df3e803778f6cba03181b6bacf1b0"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="regions"
-
-PLATFORM_SUBDIR="regions"
-
-inherit cros-workon
-
-DESCRIPTION="Chromium OS Region Data"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/regions/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# 'jq' allows command line tools to access the JSON database.
-RDEPEND="app-misc/jq"
-DEPEND=""
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/regions"
-}
-
-src_compile() {
-	./regions.py --format=json --output "${WORKDIR}/cros-regions.json"
-}
-
-src_test() {
-	./regions_unittest.py
-}
-
-src_install() {
-	dobin cros_region_data
-
-	insinto /usr/share/misc
-	doins "${WORKDIR}/cros-regions.json"
-}
diff --git a/chromeos-base/regions/regions-0.0.1-r2014.ebuild b/chromeos-base/regions/regions-0.0.1-r2014.ebuild
new file mode 100644
index 0000000..df45431
--- /dev/null
+++ b/chromeos-base/regions/regions-0.0.1-r2014.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="3bedb01f0bbf8767db84c3dace0a1a126ce304b5"
+CROS_WORKON_TREE="12ecadcfcba75c471f435107bd2b19280be56af2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="regions"
+
+PLATFORM_SUBDIR="regions"
+
+inherit cros-workon
+
+DESCRIPTION="Chromium OS Region Data"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/regions/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# 'jq' allows command line tools to access the JSON database.
+RDEPEND="app-misc/jq"
+DEPEND=""
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/regions"
+}
+
+src_compile() {
+	./regions.py --format=json --output "${WORKDIR}/cros-regions.json"
+}
+
+src_test() {
+	./regions_unittest.py
+}
+
+src_install() {
+	dobin cros_region_data
+
+	insinto /usr/share/misc
+	doins "${WORKDIR}/cros-regions.json"
+}
diff --git a/chromeos-base/rendernodehost/rendernodehost-0.0.1-r118.ebuild b/chromeos-base/rendernodehost/rendernodehost-0.0.1-r118.ebuild
deleted file mode 100644
index 62ab703..0000000
--- a/chromeos-base/rendernodehost/rendernodehost-0.0.1-r118.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk rendernodehost .gn"
-
-PLATFORM_SUBDIR="rendernodehost"
-WANT_LIBCHROME="no"
-
-inherit cros-workon platform
-
-DESCRIPTION="host service for render node forwarding"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/rendernodehost/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="x11-libs/libdrm:="
-
-src_install() {
-	dolib.a "${OUT}"/librendernodehost.a
-}
diff --git a/chromeos-base/rendernodehost/rendernodehost-0.0.1-r138.ebuild b/chromeos-base/rendernodehost/rendernodehost-0.0.1-r138.ebuild
new file mode 100644
index 0000000..18edb52
--- /dev/null
+++ b/chromeos-base/rendernodehost/rendernodehost-0.0.1-r138.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk rendernodehost .gn"
+
+PLATFORM_SUBDIR="rendernodehost"
+WANT_LIBCHROME="no"
+
+inherit cros-workon platform
+
+DESCRIPTION="host service for render node forwarding"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/rendernodehost/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="x11-libs/libdrm:="
+
+src_install() {
+	dolib.a "${OUT}"/librendernodehost.a
+}
diff --git a/chromeos-base/run_oci/run_oci-0.0.1-r1027.ebuild b/chromeos-base/run_oci/run_oci-0.0.1-r1027.ebuild
deleted file mode 100644
index 0659a95..0000000
--- a/chromeos-base/run_oci/run_oci-0.0.1-r1027.ebuild
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="44828cd6c7c7c1acfb125e6e835b0836c6713883"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "c0b816f19570ba7f0f522c1ff7a29bae14b8be22" "fa7550200d48cd2a3d4d0d5b0b4d950d1b90e3e4" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libcontainer run_oci .gn"
-
-PLATFORM_SUBDIR="run_oci"
-
-inherit cros-workon libchrome platform
-
-DESCRIPTION="Utility for running OCI-compatible containers"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	chromeos-base/libcontainer:=
-	sys-apps/util-linux:=
-	sys-libs/libcap:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_install() {
-	cd "${OUT}"
-	dobin run_oci
-}
-
-platform_pkg_test() {
-	local tests=(
-		container_config_parser_test
-		run_oci_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		# platform_test takes care of setting up your test environment
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/run_oci/run_oci-0.0.1-r1050.ebuild b/chromeos-base/run_oci/run_oci-0.0.1-r1050.ebuild
new file mode 100644
index 0000000..5116ef8
--- /dev/null
+++ b/chromeos-base/run_oci/run_oci-0.0.1-r1050.ebuild
@@ -0,0 +1,49 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "04a8a0274b23f4bbf01eb2645630f252331db474" "90e579a5b3d7431645c6fa2b843c6cbd6225c3fe" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libcontainer run_oci .gn"
+
+PLATFORM_SUBDIR="run_oci"
+
+inherit cros-workon libchrome platform
+
+DESCRIPTION="Utility for running OCI-compatible containers"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	chromeos-base/libcontainer:=
+	sys-apps/util-linux:=
+	sys-libs/libcap:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_install() {
+	cd "${OUT}"
+	dobin run_oci
+}
+
+platform_pkg_test() {
+	local tests=(
+		container_config_parser_test
+		run_oci_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		# platform_test takes care of setting up your test environment
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/runtime_probe/runtime_probe-0.0.1-r388.ebuild b/chromeos-base/runtime_probe/runtime_probe-0.0.1-r388.ebuild
deleted file mode 100644
index 6bbf339..0000000
--- a/chromeos-base/runtime_probe/runtime_probe-0.0.1-r388.ebuild
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "6287b0913be5aaea79569d55d989b9b729396f10" "26765d77125b3857917f67977eb945600ff7670e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk chromeos-config runtime_probe .gn"
-
-PLATFORM_SUBDIR="runtime_probe"
-
-inherit cros-workon platform user udev
-
-DESCRIPTION="Runtime probing on device componenets."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/runtime_probe/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="generated_cros_config unibuild asan fuzzer"
-
-COMMON_DEPEND="
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config:= )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	chromeos-base/chromeos-config-tools:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-# Add vboot_reference as build time dependency to read cros_debug status
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/vboot_reference:=
-"
-
-pkg_preinst() {
-	# Create user and group for runtime_probe
-	enewuser "runtime_probe"
-	enewgroup "cros_ec-access"
-	enewgroup "runtime_probe"
-}
-
-src_install() {
-	dobin "${OUT}/runtime_probe"
-	dobin "${OUT}/runtime_probe_helper"
-
-	# Install upstart configs and scripts.
-	insinto /etc/init
-	doins init/*.conf
-
-	# Install D-Bus configuration file.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.RuntimeProbe.conf
-
-	# Install D-Bus service activation configuration.
-	insinto /usr/share/dbus-1/system-services
-	doins dbus/org.chromium.RuntimeProbe.service
-
-
-	# Install sandbox information.
-	insinto /etc/runtime_probe/sandbox
-	doins sandbox/*.args
-	doins sandbox/"${ARCH}"/*-seccomp.policy
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp/runtime_probe-seccomp-${ARCH}.policy" \
-	runtime_probe-seccomp.policy
-
-	# Install udev rules.
-	udev_dorules udev/*.rules
-
-	local fuzzer
-	for fuzzer in "${OUT}"/*_fuzzer; do
-		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
-	done
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/unittest_runner"
-}
diff --git a/chromeos-base/runtime_probe/runtime_probe-0.0.1-r450.ebuild b/chromeos-base/runtime_probe/runtime_probe-0.0.1-r450.ebuild
new file mode 100644
index 0000000..130561f
--- /dev/null
+++ b/chromeos-base/runtime_probe/runtime_probe-0.0.1-r450.ebuild
@@ -0,0 +1,87 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "7d09b1c137270e71951105724c912d0ff35b6fb1" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk chromeos-config runtime_probe .gn"
+
+PLATFORM_SUBDIR="runtime_probe"
+
+inherit cros-workon platform user udev
+
+DESCRIPTION="Runtime probing on device componenets."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/runtime_probe/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="generated_cros_config unibuild asan fuzzer"
+
+COMMON_DEPEND="
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config:= )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	chromeos-base/chromeos-config-tools:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+# Add vboot_reference as build time dependency to read cros_debug status
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/vboot_reference:=
+"
+
+pkg_preinst() {
+	# Create user and group for runtime_probe
+	enewuser "runtime_probe"
+	enewgroup "cros_ec-access"
+	enewgroup "runtime_probe"
+}
+
+src_install() {
+	dobin "${OUT}/runtime_probe"
+	dobin "${OUT}/runtime_probe_helper"
+
+	# Install upstart configs and scripts.
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.RuntimeProbe.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus/org.chromium.RuntimeProbe.service
+
+
+	# Install sandbox information.
+	insinto /etc/runtime_probe/sandbox
+	doins sandbox/*.args
+	doins sandbox/"${ARCH}"/*-seccomp.policy
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/runtime_probe-seccomp-${ARCH}.policy" \
+	runtime_probe-seccomp.policy
+
+	# Install udev rules.
+	udev_dorules udev/*.rules
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/unittest_runner"
+}
diff --git a/chromeos-base/sane-backends-test/sane-backends-test-0.0.1-r1.ebuild b/chromeos-base/sane-backends-test/sane-backends-test-0.0.1-r1.ebuild
new file mode 120000
index 0000000..2499e5f
--- /dev/null
+++ b/chromeos-base/sane-backends-test/sane-backends-test-0.0.1-r1.ebuild
@@ -0,0 +1 @@
+sane-backends-test-0.0.1.ebuild
\ No newline at end of file
diff --git a/chromeos-base/sane-backends-test/sane-backends-test-0.0.1.ebuild b/chromeos-base/sane-backends-test/sane-backends-test-0.0.1.ebuild
new file mode 100644
index 0000000..605901b
--- /dev/null
+++ b/chromeos-base/sane-backends-test/sane-backends-test-0.0.1.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="Package responsible for setting up the sane test backend"
+HOMEPAGE="http://www.sane-project.org/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+SLOT="0/0"
+S="${WORKDIR}"
+
+RDEPEND="
+	>=media-gfx/sane-backends-1.0.31-r2
+	<media-gfx/sane-backends-2
+"
+
+src_install() {
+	local sane_libdir="/usr/$(get_libdir)/sane"
+	dodir "${sane_libdir}"
+	local local_libdir="${ED}/usr/local/$(get_libdir)"
+	local lib_names="
+		libsane-test.so
+		libsane-test.so.1
+	"
+	for lib in ${lib_names}; do
+		# Don't use dosym since we'd need to explicitly specify the
+		# relative symlink
+		# (i.e. 'dosym "../../local/$(get_libdir)/${lib}" [...]').
+		ln -rs "${local_libdir}/${lib}" "${ED}/${sane_libdir}" || die
+	done
+}
diff --git a/chromeos-base/screenshot/screenshot-0.0.1-r200.ebuild b/chromeos-base/screenshot/screenshot-0.0.1-r200.ebuild
deleted file mode 100644
index bb79040..0000000
--- a/chromeos-base/screenshot/screenshot-0.0.1-r200.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d55943002ae06877156d158a78ac307a26dc25c2" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="common-mk screenshot .gn"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-PLATFORM_SUBDIR="screenshot"
-
-inherit cros-workon platform
-
-DESCRIPTION="Utility to take a screenshot"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/screenshot/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	media-libs/libpng:0=
-	media-libs/minigbm:=
-	x11-libs/libdrm:=
-	virtual/opengles"
-
-DEPEND="${RDEPEND}
-	x11-drivers/opengles-headers"
-
-src_install() {
-	dosbin "${OUT}/screenshot"
-}
diff --git a/chromeos-base/screenshot/screenshot-0.0.1-r221.ebuild b/chromeos-base/screenshot/screenshot-0.0.1-r221.ebuild
new file mode 100644
index 0000000..5975bbb
--- /dev/null
+++ b/chromeos-base/screenshot/screenshot-0.0.1-r221.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ee81aa021a8e2f8e763e000672a9b75559ec582e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk screenshot .gn"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+PLATFORM_SUBDIR="screenshot"
+
+inherit cros-workon platform
+
+DESCRIPTION="Utility to take a screenshot"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/screenshot/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	media-libs/libpng:0=
+	media-libs/minigbm:=
+	x11-libs/libdrm:=
+	virtual/opengles"
+
+DEPEND="${RDEPEND}
+	x11-drivers/opengles-headers"
+
+src_install() {
+	dosbin "${OUT}/screenshot"
+}
diff --git a/chromeos-base/sealed_storage/sealed_storage-0.0.1-r178.ebuild b/chromeos-base/sealed_storage/sealed_storage-0.0.1-r178.ebuild
deleted file mode 100644
index b8366ba..0000000
--- a/chromeos-base/sealed_storage/sealed_storage-0.0.1-r178.ebuild
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="082227e6b44404efcfd4d973480be711d175473c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "5ab7e2abb24bd89510d6cf906a61a581fb5f4475" "dae00c69637e0e94b3ccfca22c7ecb62d4f63675" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk sealed_storage tpm_manager trunks .gn"
-
-PLATFORM_SUBDIR="sealed_storage"
-
-inherit cros-workon platform
-
-DESCRIPTION="Library for sealing data to device identity and state"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/sealed_storage"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-IUSE="test tpm2"
-
-REQUIRED_USE="tpm2"
-COMMON_DEPEND="
-	chromeos-base/tpm_manager:=[test?]
-	chromeos-base/trunks:=[test?]
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/protofiles:=
-	chromeos-base/system_api:=
-"
-
-src_install() {
-	dosbin "${OUT}"/sealed_storage_tool
-	dolib.a "${OUT}"/libsealed_storage.a
-	dolib.so "${OUT}"/lib/libsealed_storage_wrapper.so
-
-	insinto /usr/include/chromeos/sealed_storage
-	doins sealed_storage.h
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/sealed_storage_testrunner"
-}
diff --git a/chromeos-base/sealed_storage/sealed_storage-0.0.1-r217.ebuild b/chromeos-base/sealed_storage/sealed_storage-0.0.1-r217.ebuild
new file mode 100644
index 0000000..09fff05
--- /dev/null
+++ b/chromeos-base/sealed_storage/sealed_storage-0.0.1-r217.ebuild
@@ -0,0 +1,49 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "6051938d56ea147e185701f53ddd1bc956e7e631" "edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk sealed_storage tpm_manager trunks .gn"
+
+PLATFORM_SUBDIR="sealed_storage"
+
+inherit cros-workon platform
+
+DESCRIPTION="Library for sealing data to device identity and state"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/sealed_storage"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+IUSE="test tpm2"
+
+REQUIRED_USE="tpm2"
+COMMON_DEPEND="
+	chromeos-base/tpm_manager:=[test?]
+	chromeos-base/trunks:=[test?]
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/protofiles:=
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	dosbin "${OUT}"/sealed_storage_tool
+	dolib.a "${OUT}"/libsealed_storage.a
+	dolib.so "${OUT}"/lib/libsealed_storage_wrapper.so
+
+	insinto /usr/include/chromeos/sealed_storage
+	doins sealed_storage.h
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/sealed_storage_testrunner"
+}
diff --git a/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r860.ebuild b/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r860.ebuild
deleted file mode 100644
index 5ab6d23..0000000
--- a/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r860.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e5d3b93967ab0491498bc90862f9bee73883fea8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk secure_erase_file .gn"
-
-PLATFORM_SUBDIR="secure_erase_file"
-
-inherit cros-workon platform
-
-DESCRIPTION="Secure file erasure for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/secure_erase_file/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-"
-
-RDEPEND="
-"
-
-src_install() {
-	dobin "${OUT}/secure_erase_file"
-	dolib.so "${OUT}/lib/libsecure_erase_file.so"
-
-	insinto /usr/include/chromeos/secure_erase_file
-	doins secure_erase_file.h
-}
diff --git a/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r881.ebuild b/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r881.ebuild
new file mode 100644
index 0000000..31cb1a2
--- /dev/null
+++ b/chromeos-base/secure-erase-file/secure-erase-file-0.0.1-r881.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "6b6ef5508fa314869c1fa0c0847a11651143f224" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk secure_erase_file .gn"
+
+PLATFORM_SUBDIR="secure_erase_file"
+
+inherit cros-workon platform
+
+DESCRIPTION="Secure file erasure for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/secure_erase_file/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+"
+
+RDEPEND="
+"
+
+src_install() {
+	dobin "${OUT}/secure_erase_file"
+	dolib.so "${OUT}/lib/libsecure_erase_file.so"
+
+	insinto /usr/include/chromeos/secure_erase_file
+	doins secure_erase_file.h
+}
diff --git a/chromeos-base/secure-wipe/secure-wipe-0.0.1-r102.ebuild b/chromeos-base/secure-wipe/secure-wipe-0.0.1-r102.ebuild
new file mode 100644
index 0000000..b7afeb5
--- /dev/null
+++ b/chromeos-base/secure-wipe/secure-wipe-0.0.1-r102.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "898687cfd878621b0aa42a27138c8a6c72210b16" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_SUBTREE="common-mk secure-wipe .gn"
+
+PLATFORM_SUBDIR="secure-wipe"
+
+inherit cros-workon platform
+
+DESCRIPTION="Secure wipe"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/secure-wipe/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="mmc nvme sata test"
+
+DEPEND=""
+
+RDEPEND="
+	app-misc/jq
+	sata? ( sys-apps/hdparm )
+	mmc? ( sys-apps/mmc-utils )
+	nvme? ( sys-apps/nvme-cli )
+	sys-apps/util-linux
+	sys-block/fio"
+
+src_test() {
+	tests/factory_verify_test.sh || die "unittest failed"
+}
+
+src_install() {
+	dosbin secure-wipe.sh
+	dosbin wipe_disk
+}
diff --git a/chromeos-base/secure-wipe/secure-wipe-0.0.1-r82.ebuild b/chromeos-base/secure-wipe/secure-wipe-0.0.1-r82.ebuild
deleted file mode 100644
index e4d4b5b..0000000
--- a/chromeos-base/secure-wipe/secure-wipe-0.0.1-r82.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "898687cfd878621b0aa42a27138c8a6c72210b16" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_SUBTREE="common-mk secure-wipe .gn"
-
-PLATFORM_SUBDIR="secure-wipe"
-
-inherit cros-workon platform
-
-DESCRIPTION="Secure wipe"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/secure-wipe/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="mmc nvme sata test"
-
-DEPEND=""
-
-RDEPEND="
-	app-misc/jq
-	sata? ( sys-apps/hdparm )
-	mmc? ( sys-apps/mmc-utils )
-	nvme? ( sys-apps/nvme-cli )
-	sys-apps/util-linux
-	sys-block/fio"
-
-src_test() {
-	tests/factory_verify_test.sh || die "unittest failed"
-}
-
-src_install() {
-	dosbin secure-wipe.sh
-	dosbin wipe_disk
-}
diff --git a/chromeos-base/selinux-policy/selinux-policy-0.0.1-r203.ebuild b/chromeos-base/selinux-policy/selinux-policy-0.0.1-r203.ebuild
deleted file mode 100644
index 454de5f..0000000
--- a/chromeos-base/selinux-policy/selinux-policy-0.0.1-r203.ebuild
+++ /dev/null
@@ -1,387 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="b381ff3d68a3415a15ef51ec8667567c03231926"
-CROS_WORKON_TREE="212e2495ec6d79d76cf9c82469f8acf05b19028b"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="sepolicy"
-
-inherit cros-workon udev
-
-DESCRIPTION="Chrome OS SELinux Policy Package"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="
-	android-container-pi
-	android-vm-rvc
-	selinux_audit_all selinux_develop selinux_experimental
-	arc_first_release_n
-	nocheck
-	cheets_user cheets_user_64
-"
-DEPEND="
-	android-container-pi? ( chromeos-base/android-container-pi:0= )
-	android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
-"
-
-RDEPEND="
-	${DEPEND}
-	sys-apps/restorecon
-	sys-process/audit
-"
-
-SELINUX_VERSION="30"
-SEPOLICY_FILENAME="policy.${SELINUX_VERSION}"
-
-MLS_NUM_SENS=1
-MLS_NUM_CATS=1024
-CHROME_POLICY_FILES_PATTERN=(
-	security_classes
-	initial_sids
-	access_vectors
-	global_macros
-	chromeos_macros
-	neverallow_macros
-	mls_macros
-	mls_decl
-	mls
-	policy_capabilities
-	te_macros
-	attributes
-	ioctl_defines
-	ioctl_macros
-	"*.te"
-	roles_decl
-	roles
-	users
-	initial_sid_contexts
-	fs_use
-	genfs_contexts
-)
-
-# Files under $SEPATH are built by android-container-* in DEPEND.
-SEPATH="${SYSROOT}/etc/selinux/intermediates/"
-
-# -M Build MLS policy.
-# -G expand and remove auto-generated attributes.
-# -N ignore neverallow rules (checked during Android build)
-# -m allow multiple declaration (combination of rules of multiple source)
-SECILC_ARGS=(
-	-M true -G -N -m
-	-c "${SELINUX_VERSION}"
-	-o "${SEPOLICY_FILENAME}"
-	-f /dev/null
-)
-
-SECILC_ARGS_CHECK_NEVERALLOW=(
-	-M true -G -m
-	-c "${SELINUX_VERSION}"
-	-o /dev/null
-	-f /dev/null
-)
-
-# Common flags for m4
-M4_COMMON_FLAGS=(
-)
-
-# Remove all lines existed in $1 from /dev/stdin.
-# and remove all lines begin with "^;" (cil comment)
-# remove cil comment is necessary for clearing unmatched line marker
-# after base policy definitions are removed.
-# Also preserve type definitions since secilc can handle duplicates on
-# definition of types.
-filter_file_line_by_line() {
-	perl -e '
-		my @reflines;
-		open(my $ref, "<", $ARGV[0]);
-		while(<$ref>) { push @reflines, $_; }
-		while(<STDIN>) {
-			if ( m/^\(type / ) { print; next; }
-			if ( m/^;/ ) { next; }
-			if ($_ ~~ @reflines) { next; }
-			print
-		}
-	' "$1"
-}
-
-# Quick hack for conflicting generated base_typeattr_XX with
-# non-versioned Android cil.
-# A better solution could be to use libsepol to parse and process
-# cil to modify it.
-version_cil() {
-	sed -e 's/base_typeattr_\([0-9]*\)/base_typeattr_cros_\1/g'
-}
-
-has_arc() {
-	use android-container-pi || use android-vm-rvc
-}
-
-gen_m4_flags() {
-	M4_COMMON_FLAGS=()
-	local arc_version="none"
-	if use android-container-pi; then
-		arc_version="p"
-	elif use android-vm-rvc; then
-		arc_version="r"
-	fi
-	M4_COMMON_FLAGS+=(
-		"-Darc_version=${arc_version}"
-		"-Duse_selinux_develop=$(usex selinux_develop y n)"
-		"-Duse_arc_first_release_n=$(usex arc_first_release_n y n)"
-	)
-	einfo "m4 flags: ${M4_COMMON_FLAGS[*]}"
-}
-
-# Build SELinux intermediate language files.
-# Look into SELinux policies in given directories, and
-# pre-compile with m4 macro preprocessor, and merge them into
-# a monothilic SELinux policy, and then compile it into
-# intermediate files using checkpolicy compiler.
-build_cil() {
-	local policy_files=()
-	local ciltype="$1"
-	shift
-	local output="$1"
-	shift
-	local pattern
-	for pattern in "${CHROME_POLICY_FILES_PATTERN[@]}"; do
-		local path
-		for path in "$@"; do
-			local file
-			while read -r -d $'\0' file; do
-				policy_files+=("${file}")
-			done < <(find "${path}" -xtype f -name "${pattern}" -print0)
-		done
-	done
-	m4 "-Dmls_num_sens=${MLS_NUM_SENS}" "-Dmls_num_cats=${MLS_NUM_CATS}" \
-		"${M4_COMMON_FLAGS[@]}" \
-		"-Dciltype=${ciltype}" \
-		-s "${policy_files[@]}" > "${output}.conf" \
-		|| die "failed to generate ${output}.conf"
-	checkpolicy -M -C -c "${SELINUX_VERSION}" "${output}.conf" \
-		-o "${output}" || die "failed to build $output"
-}
-
-build_android_reqd_cil() {
-	build_cil reqd "android_reqd.cil" "sepolicy/policy/base/" "sepolicy/policy/mask_only/"
-}
-
-build_chromeos_policy() {
-	build_android_reqd_cil
-
-	build_cil cros "chromeos.raw.cil" "sepolicy/policy/base/" "sepolicy/policy/chromeos_base" "sepolicy/policy/chromeos/"
-	version_cil < chromeos.raw.cil > chromeos.raw.versioned.cil
-	secilc "${SECILC_ARGS_CHECK_NEVERALLOW[@]}" chromeos.raw.cil ||
-		die "some Chrome OS neverallows are not satisfied"
-	filter_file_line_by_line android_reqd.cil < chromeos.raw.versioned.cil > chromeos.cil ||
-		die "failed to convert raw cil to filtered cil"
-}
-
-build_file_contexts() {
-	einfo "Compiling chromeos_file_contexts"
-	m4 "${M4_COMMON_FLAGS[@]}" "sepolicy/file_contexts/macros" \
-		"sepolicy/file_contexts/chromeos_file_contexts" > chromeos_file_contexts ||
-		die "failed to build chromeos file contexts"
-}
-
-check_filetrans_defined_in_file_contexts() {
-	einfo "Verifying policy and file_contexts for filetrans_pattern"
-	_is_empty() {
-		local err=0
-		while read line; do
-			if [[ "$err" -eq "0" ]]; then
-				ewarn "Expected to find these lines in file_contexts, but were not found:"
-				err=1
-			fi
-			ewarn "$line"
-		done
-		return $err
-	}
-	# filetrans is a kind of typetransition. Typetrasition is described like
-	# the following in a .cil file:
-	# (typetransition source target class new_type) or
-	# (typetransition source target class object_name new_type)
-	# We only want to verify where
-	#  - both source and target are not tmpfs-related.
-	#  - source is not unconfined domain: chromeos
-	#  - type is not process since we only care file typetransition.
-	cat chromeos.cil | awk '
-		/^\(typetransition/	{
-						context=substr($NF,0,length($NF)-1)
-						if ($4=="process"||$2=="chromeos") next;
-						if(context ~/cros_.*tmp_file/) next; # Created an cros_.*_tmp_file
-						if(context ~/(device|rootfs|tmpfs)/) next; # Created a file labeled as device, tmpfs, or rootfs.
-						if($3 ~/^(cros_run(_.*)?|cros_.*tmp_file|tmpfs|arc_dir)$/) next; # Create a file in tmpfs.
-						if(NF==6) { print substr($5,2,length($5)-2) ".*u:object_r:" context ":s0" }
-						else { print "u:object_r:" context ":s0" }
-					}
-	' | sort -u | xargs -d'\n' -n 1 sh -c 'grep $0 file_contexts >/dev/null || echo $0' | _is_empty
-}
-
-# cat cil-file | get_attributed_type(attribute) => types separated by spaces
-get_attributed_type() {
-	local attr="$1"
-	grep "(typeattributeset ${attr} (" | sed -e "s/^(typeattributeset ${attr} (//g" | sed -e 's/ ))$//g'
-}
-
-# check_attribute_include attr subattr1 subattr2 subattr3 ... excluded_type1 excluded_type2 ...
-check_attribute_include() {
-	local poolname="$1"
-	shift 1
-	einfo "Checking type set (attribute ${poolname}) equals to union of type sets of (attribute $@)"
-	local pool="$(cat chromeos.cil | get_attributed_type "${poolname}" | tr ' ' '\n')"
-	local remaining_types="$pool"
-	for attr in $@; do
-		remaining_types="$(echo "$remaining_types" | egrep -v "^$attr$")"
-		for t in `cat chromeos.cil | get_attributed_type "${attr}"`; do
-			if ! grep "$t" <(echo "$pool") >/dev/null; then
-				die "${t} type should have attribute ${poolname} to have attribute ${attr}"
-			fi
-			remaining_types="$(echo "$remaining_types" | egrep -v "^$t$")"
-		done
-	done
-	if ! [[ -z "$remaining_types" ]]; then
-		die "Types with attribute $poolname should have at least one of $@, but these doesn't: \n$(echo "${remaining_types}" | tr '\n' ' ')"
-	fi
-}
-
-check_file_type_and_attribute() {
-	einfo "Checking file types and their attributes"
-	check_attribute_include file_type cros_file_type unlabeled system_data_file media_data_file android_file_type
-	check_attribute_include cros_file_type cros_system_file_type cros_tmpfile_type cros_home_file_type cros_var_file_type cros_run_file_type cros_uncategorized_file_type
-}
-
-src_compile() {
-	gen_m4_flags
-
-	build_chromeos_policy
-	build_file_contexts
-
-	cp -r "${SEPATH}" intermediate_policy
-
-	if use selinux_audit_all; then
-		find intermediate_policy/ -xtype f -name '*.cil' -exec \
-			sed -i 's/^(dontaudit .*//g' {} \;
-		sed -i 's/^(dontaudit .*//g' chromeos.cil
-		sed -i 's/^(dontaudit .*//g' chromeos.raw.cil
-	fi
-
-	local cilpath="$(pwd)/intermediate_policy"
-
-	if has_arc; then
-		einfo "Removing duplicate nnp_nosuid_transition policycap from Android cil"
-		sed -i '/^(policycap nnp_nosuid_transition)$/d' "${cilpath}"/*.cil || die
-
-		einfo "Combining Chrome OS and Android SELinux policy"
-		secilc "${SECILC_ARGS[@]}" "${cilpath}/plat_sepolicy.cil" \
-			"${cilpath}/mapping.cil" \
-			"${cilpath}/plat_pub_versioned.cil" \
-			"${cilpath}/vendor_sepolicy.cil" \
-			chromeos.cil || die "fail to build sepolicy"
-
-		# Add header/footer around ARC++ contexts, so they can be
-		# correctly replaced when pushing new Android builds using
-		# push_to_device.py.
-		(
-			cat "chromeos_file_contexts" &&
-			echo -e "\n# BEGIN_ARC_FILE_CONTEXTS" &&
-			cat "${SYSROOT}/etc/selinux/intermediates/arc_file_contexts" &&
-			echo -e "\n# END_ARC_FILE_CONTEXTS"
-		) > file_contexts || die "failed to combine *_file_contexts files"
-
-	else
-		# Chrome OS without ARC++ only.
-		einfo "Use Chrome OS-only SELinux policy."
-
-		secilc "${SECILC_ARGS[@]}" chromeos.raw.cil || die "fail to build sepolicy"
-		cp "chromeos_file_contexts" file_contexts \
-			|| die "didn't find chromeos_file_contexts for file_contexts"
-	fi
-
-	check_filetrans_defined_in_file_contexts \
-		|| die "failed to check consistency between filetrans_pattern and file_contexts"
-
-	if use nocheck; then
-		ewarn "Some post-compile checks are skipped. Please remove nocheck from your USE flag"
-	else
-		einfo 'Use USE="$USE nocheck" emerge-$BOARD selinux-policy to speed up emerge for development purpose'.
-		check_file_type_and_attribute
-	fi
-}
-
-src_install() {
-	insinto /etc/selinux/arc/contexts/files
-	doins file_contexts
-
-	insinto /etc/selinux
-	if use selinux_experimental; then
-		newins "${FILESDIR}/selinux_config_experimental" config
-	else
-		newins "${FILESDIR}/selinux_config" config
-	fi
-
-	insinto /etc/selinux/arc/policy
-	doins "${SEPOLICY_FILENAME}"
-
-	if use selinux_develop; then
-		insinto /etc/init
-		doins "${FILESDIR}/selinux_debug.conf"
-		dobin "${FILESDIR}/audit_log_since_boot"
-	fi
-
-	if has_arc; then
-		# Install ChromeOS cil so push_to_device.py can compile a new
-		# version of SELinux policy.
-		insinto /etc/selinux/intermediates.raw/
-		doins chromeos.cil
-	fi
-
-	udev_dorules "${FILESDIR}/50-selinux.rules"
-}
-
-src_test() {
-	local neverallowjava="${SYSROOT}/etc/selinux/intermediates/SELinuxNeverallowRulesTest.java"
-	if [ ! -f "${SYSROOT}/etc/selinux/intermediates/SELinuxNeverallowRulesTest.java" ]; then
-		ewarn "No SELinuxNeverallowRulesTest.java found. CTS neverallow pre-test is skipped."
-		return
-	fi
-
-	# Extract 'String neverallowRule = "neverallow ...";' lines from the Java source code and
-	# write the extracted lines to ./neverallows. We have two scripts below as Android P and R+
-	# use slightly different code styles.
-	if use android-vm-rvc; then
-		(
-			grep "boolean compatiblePropertyOnly = false;" -B 3 |
-			grep "boolean launchingWithROnly = false;" -B 2 |
-			grep "boolean fullTrebleOnly = false;" -B 1 |
-			grep neverallowRule |
-			sed -E 's/.*"(neverallow.*)";/\1/g'
-		) < "${neverallowjava}" > neverallows
-	else
-		(
-			grep "boolean compatiblePropertyOnly = false;" -B 2 |
-			grep "boolean fullTrebleOnly = false;" -B 1 |
-			grep neverallowRule |
-			sed -E 's/.*"(neverallow.*)";/\1/g'
-		) < "${neverallowjava}" > neverallows
-	fi
-
-	local loc="$(wc -l neverallows | awk '{print $1;}')"
-	if [[ "${loc}" -lt "100" ]]; then
-		die "too few test cases. something is wrong."
-	fi
-	if use android-vm-rvc; then
-		# We only run SELinux CTS against the guest-side policy. Skipping the test.
-		return
-	fi
-	local cur=0
-	while read -r rule; do
-		cur=$((cur+1))
-		printf "Checking neverallow rules: %d/%d\r" "$cur" "$loc"
-		sepolicy-analyze "${SEPOLICY_FILENAME}" neverallow -n "$rule" || (echo failed for "$rule"; die)
-	done < neverallows
-}
diff --git a/chromeos-base/selinux-policy/selinux-policy-0.0.1-r222.ebuild b/chromeos-base/selinux-policy/selinux-policy-0.0.1-r222.ebuild
new file mode 100644
index 0000000..12a1287
--- /dev/null
+++ b/chromeos-base/selinux-policy/selinux-policy-0.0.1-r222.ebuild
@@ -0,0 +1,391 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="e9ae9fe3d28bd9c5bffd59761687948a7b571f87"
+CROS_WORKON_TREE="fd92718ac473fbdad43197219db030aec5e4f946"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="sepolicy"
+
+inherit cros-workon udev
+
+DESCRIPTION="Chrome OS SELinux Policy Package"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="
+	android-container-pi
+	android-vm-master
+	android-vm-rvc
+	selinux_audit_all selinux_develop selinux_experimental
+	arc_first_release_n
+	nocheck
+	cheets_user cheets_user_64
+"
+DEPEND="
+	android-container-pi? ( chromeos-base/android-container-pi:0= )
+	android-vm-master? ( chromeos-base/android-vm-master:0= )
+	android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
+"
+
+RDEPEND="
+	${DEPEND}
+	sys-apps/restorecon
+	sys-process/audit
+"
+
+SELINUX_VERSION="30"
+SEPOLICY_FILENAME="policy.${SELINUX_VERSION}"
+
+MLS_NUM_SENS=1
+MLS_NUM_CATS=1024
+CHROME_POLICY_FILES_PATTERN=(
+	security_classes
+	initial_sids
+	access_vectors
+	global_macros
+	chromeos_macros
+	neverallow_macros
+	mls_macros
+	mls_decl
+	mls
+	policy_capabilities
+	te_macros
+	attributes
+	ioctl_defines
+	ioctl_macros
+	"*.te"
+	roles_decl
+	roles
+	users
+	initial_sid_contexts
+	fs_use
+	genfs_contexts
+)
+
+# Files under $SEPATH are built by android-container-* in DEPEND.
+SEPATH="${SYSROOT}/etc/selinux/intermediates/"
+
+# -M Build MLS policy.
+# -G expand and remove auto-generated attributes.
+# -N ignore neverallow rules (checked during Android build)
+# -m allow multiple declaration (combination of rules of multiple source)
+SECILC_ARGS=(
+	-M true -G -N -m
+	-c "${SELINUX_VERSION}"
+	-o "${SEPOLICY_FILENAME}"
+	-f /dev/null
+)
+
+SECILC_ARGS_CHECK_NEVERALLOW=(
+	-M true -G -m
+	-c "${SELINUX_VERSION}"
+	-o /dev/null
+	-f /dev/null
+)
+
+# Common flags for m4
+M4_COMMON_FLAGS=(
+)
+
+# Remove all lines existed in $1 from /dev/stdin.
+# and remove all lines begin with "^;" (cil comment)
+# remove cil comment is necessary for clearing unmatched line marker
+# after base policy definitions are removed.
+# Also preserve type definitions since secilc can handle duplicates on
+# definition of types.
+filter_file_line_by_line() {
+	perl -e '
+		my @reflines;
+		open(my $ref, "<", $ARGV[0]);
+		while(<$ref>) { push @reflines, $_; }
+		while(<STDIN>) {
+			if ( m/^\(type / ) { print; next; }
+			if ( m/^;/ ) { next; }
+			if ($_ ~~ @reflines) { next; }
+			print
+		}
+	' "$1"
+}
+
+# Quick hack for conflicting generated base_typeattr_XX with
+# non-versioned Android cil.
+# A better solution could be to use libsepol to parse and process
+# cil to modify it.
+version_cil() {
+	sed -e 's/base_typeattr_\([0-9]*\)/base_typeattr_cros_\1/g'
+}
+
+has_arc() {
+	use android-container-pi || use android-vm-rvc || use android-vm-master
+}
+
+gen_m4_flags() {
+	M4_COMMON_FLAGS=()
+	local arc_version="none"
+	if use android-container-pi; then
+		arc_version="p"
+	elif use android-vm-rvc; then
+		arc_version="r"
+	elif use android-vm-master; then
+		arc_version="master"
+	fi
+	M4_COMMON_FLAGS+=(
+		"-Darc_version=${arc_version}"
+		"-Duse_selinux_develop=$(usex selinux_develop y n)"
+		"-Duse_arc_first_release_n=$(usex arc_first_release_n y n)"
+	)
+	einfo "m4 flags: ${M4_COMMON_FLAGS[*]}"
+}
+
+# Build SELinux intermediate language files.
+# Look into SELinux policies in given directories, and
+# pre-compile with m4 macro preprocessor, and merge them into
+# a monothilic SELinux policy, and then compile it into
+# intermediate files using checkpolicy compiler.
+build_cil() {
+	local policy_files=()
+	local ciltype="$1"
+	shift
+	local output="$1"
+	shift
+	local pattern
+	for pattern in "${CHROME_POLICY_FILES_PATTERN[@]}"; do
+		local path
+		for path in "$@"; do
+			local file
+			while read -r -d $'\0' file; do
+				policy_files+=("${file}")
+			done < <(find "${path}" -xtype f -name "${pattern}" -print0)
+		done
+	done
+	m4 "-Dmls_num_sens=${MLS_NUM_SENS}" "-Dmls_num_cats=${MLS_NUM_CATS}" \
+		"${M4_COMMON_FLAGS[@]}" \
+		"-Dciltype=${ciltype}" \
+		-s "${policy_files[@]}" > "${output}.conf" \
+		|| die "failed to generate ${output}.conf"
+	checkpolicy -M -C -c "${SELINUX_VERSION}" "${output}.conf" \
+		-o "${output}" || die "failed to build $output"
+}
+
+build_android_reqd_cil() {
+	build_cil reqd "android_reqd.cil" "sepolicy/policy/base/" "sepolicy/policy/mask_only/"
+}
+
+build_chromeos_policy() {
+	build_android_reqd_cil
+
+	build_cil cros "chromeos.raw.cil" "sepolicy/policy/base/" "sepolicy/policy/chromeos_base" "sepolicy/policy/chromeos/"
+	version_cil < chromeos.raw.cil > chromeos.raw.versioned.cil
+	secilc "${SECILC_ARGS_CHECK_NEVERALLOW[@]}" chromeos.raw.cil ||
+		die "some Chrome OS neverallows are not satisfied"
+	filter_file_line_by_line android_reqd.cil < chromeos.raw.versioned.cil > chromeos.cil ||
+		die "failed to convert raw cil to filtered cil"
+}
+
+build_file_contexts() {
+	einfo "Compiling chromeos_file_contexts"
+	m4 "${M4_COMMON_FLAGS[@]}" "sepolicy/file_contexts/macros" \
+		"sepolicy/file_contexts/chromeos_file_contexts" > chromeos_file_contexts ||
+		die "failed to build chromeos file contexts"
+}
+
+check_filetrans_defined_in_file_contexts() {
+	einfo "Verifying policy and file_contexts for filetrans_pattern"
+	_is_empty() {
+		local err=0
+		while read line; do
+			if [[ "$err" -eq "0" ]]; then
+				ewarn "Expected to find these lines in file_contexts, but were not found:"
+				err=1
+			fi
+			ewarn "$line"
+		done
+		return $err
+	}
+	# filetrans is a kind of typetransition. Typetrasition is described like
+	# the following in a .cil file:
+	# (typetransition source target class new_type) or
+	# (typetransition source target class object_name new_type)
+	# We only want to verify where
+	#  - both source and target are not tmpfs-related.
+	#  - source is not unconfined domain: chromeos
+	#  - type is not process since we only care file typetransition.
+	cat chromeos.cil | awk '
+		/^\(typetransition/	{
+						context=substr($NF,0,length($NF)-1)
+						if ($4=="process"||$2=="chromeos") next;
+						if(context ~/cros_.*tmp_file/) next; # Created an cros_.*_tmp_file
+						if(context ~/(device|rootfs|tmpfs)/) next; # Created a file labeled as device, tmpfs, or rootfs.
+						if($3 ~/^(cros_run(_.*)?|cros_.*tmp_file|tmpfs|arc_dir)$/) next; # Create a file in tmpfs.
+						if(NF==6) { print substr($5,2,length($5)-2) ".*u:object_r:" context ":s0" }
+						else { print "u:object_r:" context ":s0" }
+					}
+	' | sort -u | xargs -d'\n' -n 1 sh -c 'grep $0 file_contexts >/dev/null || echo $0' | _is_empty
+}
+
+# cat cil-file | get_attributed_type(attribute) => types separated by spaces
+get_attributed_type() {
+	local attr="$1"
+	grep "(typeattributeset ${attr} (" | sed -e "s/^(typeattributeset ${attr} (//g" | sed -e 's/ ))$//g'
+}
+
+# check_attribute_include attr subattr1 subattr2 subattr3 ... excluded_type1 excluded_type2 ...
+check_attribute_include() {
+	local poolname="$1"
+	shift 1
+	einfo "Checking type set (attribute ${poolname}) equals to union of type sets of (attribute $@)"
+	local pool="$(cat chromeos.cil | get_attributed_type "${poolname}" | tr ' ' '\n')"
+	local remaining_types="$pool"
+	for attr in $@; do
+		remaining_types="$(echo "$remaining_types" | egrep -v "^$attr$")"
+		for t in `cat chromeos.cil | get_attributed_type "${attr}"`; do
+			if ! grep "$t" <(echo "$pool") >/dev/null; then
+				die "${t} type should have attribute ${poolname} to have attribute ${attr}"
+			fi
+			remaining_types="$(echo "$remaining_types" | egrep -v "^$t$")"
+		done
+	done
+	if ! [[ -z "$remaining_types" ]]; then
+		die "Types with attribute $poolname should have at least one of $@, but these doesn't: \n$(echo "${remaining_types}" | tr '\n' ' ')"
+	fi
+}
+
+check_file_type_and_attribute() {
+	einfo "Checking file types and their attributes"
+	check_attribute_include file_type cros_file_type unlabeled system_data_file media_data_file android_file_type
+	check_attribute_include cros_file_type cros_system_file_type cros_tmpfile_type cros_home_file_type cros_var_file_type cros_run_file_type cros_uncategorized_file_type
+}
+
+src_compile() {
+	gen_m4_flags
+
+	build_chromeos_policy
+	build_file_contexts
+
+	cp -r "${SEPATH}" intermediate_policy
+
+	if use selinux_audit_all; then
+		find intermediate_policy/ -xtype f -name '*.cil' -exec \
+			sed -i 's/^(dontaudit .*//g' {} \;
+		sed -i 's/^(dontaudit .*//g' chromeos.cil
+		sed -i 's/^(dontaudit .*//g' chromeos.raw.cil
+	fi
+
+	local cilpath="$(pwd)/intermediate_policy"
+
+	if has_arc; then
+		einfo "Removing duplicate nnp_nosuid_transition policycap from Android cil"
+		sed -i '/^(policycap nnp_nosuid_transition)$/d' "${cilpath}"/*.cil || die
+
+		einfo "Combining Chrome OS and Android SELinux policy"
+		secilc "${SECILC_ARGS[@]}" "${cilpath}/plat_sepolicy.cil" \
+			"${cilpath}/mapping.cil" \
+			"${cilpath}/plat_pub_versioned.cil" \
+			"${cilpath}/vendor_sepolicy.cil" \
+			chromeos.cil || die "fail to build sepolicy"
+
+		# Add header/footer around ARC++ contexts, so they can be
+		# correctly replaced when pushing new Android builds using
+		# push_to_device.py.
+		(
+			cat "chromeos_file_contexts" &&
+			echo -e "\n# BEGIN_ARC_FILE_CONTEXTS" &&
+			cat "${SYSROOT}/etc/selinux/intermediates/arc_file_contexts" &&
+			echo -e "\n# END_ARC_FILE_CONTEXTS"
+		) > file_contexts || die "failed to combine *_file_contexts files"
+
+	else
+		# Chrome OS without ARC++ only.
+		einfo "Use Chrome OS-only SELinux policy."
+
+		secilc "${SECILC_ARGS[@]}" chromeos.raw.cil || die "fail to build sepolicy"
+		cp "chromeos_file_contexts" file_contexts \
+			|| die "didn't find chromeos_file_contexts for file_contexts"
+	fi
+
+	check_filetrans_defined_in_file_contexts \
+		|| die "failed to check consistency between filetrans_pattern and file_contexts"
+
+	if use nocheck; then
+		ewarn "Some post-compile checks are skipped. Please remove nocheck from your USE flag"
+	else
+		einfo 'Use USE="$USE nocheck" emerge-$BOARD selinux-policy to speed up emerge for development purpose'.
+		check_file_type_and_attribute
+	fi
+}
+
+src_install() {
+	insinto /etc/selinux/arc/contexts/files
+	doins file_contexts
+
+	insinto /etc/selinux
+	if use selinux_experimental; then
+		newins "${FILESDIR}/selinux_config_experimental" config
+	else
+		newins "${FILESDIR}/selinux_config" config
+	fi
+
+	insinto /etc/selinux/arc/policy
+	doins "${SEPOLICY_FILENAME}"
+
+	if use selinux_develop; then
+		insinto /etc/init
+		doins "${FILESDIR}/selinux_debug.conf"
+		dobin "${FILESDIR}/audit_log_since_boot"
+	fi
+
+	if has_arc; then
+		# Install ChromeOS cil so push_to_device.py can compile a new
+		# version of SELinux policy.
+		insinto /etc/selinux/intermediates.raw/
+		doins chromeos.cil
+	fi
+
+	udev_dorules "${FILESDIR}/50-selinux.rules"
+}
+
+src_test() {
+	local neverallowjava="${SYSROOT}/etc/selinux/intermediates/SELinuxNeverallowRulesTest.java"
+	if [ ! -f "${SYSROOT}/etc/selinux/intermediates/SELinuxNeverallowRulesTest.java" ]; then
+		ewarn "No SELinuxNeverallowRulesTest.java found. CTS neverallow pre-test is skipped."
+		return
+	fi
+
+	# Extract 'String neverallowRule = "neverallow ...";' lines from the Java source code and
+	# write the extracted lines to ./neverallows. We have two scripts below as Android P and R+
+	# use slightly different code styles.
+	if use android-vm-rvc || use android-vm-master; then
+		(
+			grep "boolean compatiblePropertyOnly = false;" -B 3 |
+			grep "boolean launchingWithROnly = false;" -B 2 |
+			grep "boolean fullTrebleOnly = false;" -B 1 |
+			grep neverallowRule |
+			sed -E 's/.*"(neverallow.*)";/\1/g'
+		) < "${neverallowjava}" > neverallows
+	else
+		(
+			grep "boolean compatiblePropertyOnly = false;" -B 2 |
+			grep "boolean fullTrebleOnly = false;" -B 1 |
+			grep neverallowRule |
+			sed -E 's/.*"(neverallow.*)";/\1/g'
+		) < "${neverallowjava}" > neverallows
+	fi
+
+	local loc="$(wc -l neverallows | awk '{print $1;}')"
+	if [[ "${loc}" -lt "100" ]]; then
+		die "too few test cases. something is wrong."
+	fi
+	if use android-vm-rvc || use android-vm-master; then
+		# We only run SELinux CTS against the guest-side policy. Skipping the test.
+		return
+	fi
+	local cur=0
+	while read -r rule; do
+		cur=$((cur+1))
+		printf "Checking neverallow rules: %d/%d\r" "$cur" "$loc"
+		sepolicy-analyze "${SEPOLICY_FILENAME}" neverallow -n "$rule" || (echo failed for "$rule"; die)
+	done < neverallows
+}
diff --git a/chromeos-base/selinux-policy/selinux-policy-9999.ebuild b/chromeos-base/selinux-policy/selinux-policy-9999.ebuild
index 1004964..21303b8 100644
--- a/chromeos-base/selinux-policy/selinux-policy-9999.ebuild
+++ b/chromeos-base/selinux-policy/selinux-policy-9999.ebuild
@@ -15,6 +15,7 @@
 KEYWORDS="~*"
 IUSE="
 	android-container-pi
+	android-vm-master
 	android-vm-rvc
 	selinux_audit_all selinux_develop selinux_experimental
 	arc_first_release_n
@@ -23,6 +24,7 @@
 "
 DEPEND="
 	android-container-pi? ( chromeos-base/android-container-pi:0= )
+	android-vm-master? ( chromeos-base/android-vm-master:0= )
 	android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
 "
 
@@ -115,7 +117,7 @@
 }
 
 has_arc() {
-	use android-container-pi || use android-vm-rvc
+	use android-container-pi || use android-vm-rvc || use android-vm-master
 }
 
 gen_m4_flags() {
@@ -125,6 +127,8 @@
 		arc_version="p"
 	elif use android-vm-rvc; then
 		arc_version="r"
+	elif use android-vm-master; then
+		arc_version="master"
 	fi
 	M4_COMMON_FLAGS+=(
 		"-Darc_version=${arc_version}"
@@ -351,7 +355,7 @@
 	# Extract 'String neverallowRule = "neverallow ...";' lines from the Java source code and
 	# write the extracted lines to ./neverallows. We have two scripts below as Android P and R+
 	# use slightly different code styles.
-	if use android-vm-rvc; then
+	if use android-vm-rvc || use android-vm-master; then
 		(
 			grep "boolean compatiblePropertyOnly = false;" -B 3 |
 			grep "boolean launchingWithROnly = false;" -B 2 |
@@ -372,7 +376,7 @@
 	if [[ "${loc}" -lt "100" ]]; then
 		die "too few test cases. something is wrong."
 	fi
-	if use android-vm-rvc; then
+	if use android-vm-rvc || use android-vm-master; then
 		# We only run SELinux CTS against the guest-side policy. Skipping the test.
 		return
 	fi
diff --git a/chromeos-base/session_manager-client/session_manager-client-0.0.1-r1971.ebuild b/chromeos-base/session_manager-client/session_manager-client-0.0.1-r1971.ebuild
deleted file mode 100644
index 9838c08..0000000
--- a/chromeos-base/session_manager-client/session_manager-client-0.0.1-r1971.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "d65bd168c3204d7f72956d41372c6e5e4f6509ee" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk login_manager .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="login_manager/session_manager-client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Session manager (chromeos-login) DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/login_manager/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies.
-DEPEND="
-	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
-"
-
-RDEPEND="
-	!<chromeos-base/chromeos-login-0.0.2
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "session_manager"
-}
diff --git a/chromeos-base/session_manager-client/session_manager-client-0.0.1-r2022.ebuild b/chromeos-base/session_manager-client/session_manager-client-0.0.1-r2022.ebuild
new file mode 100644
index 0000000..1cac34c
--- /dev/null
+++ b/chromeos-base/session_manager-client/session_manager-client-0.0.1-r2022.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e806dcb7edc3d4f31afb9edf7056156cbbc63273" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk login_manager .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="login_manager/session_manager-client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Session manager (chromeos-login) DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/login_manager/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies.
+DEPEND="
+	cros_host? ( chromeos-base/chromeos-dbus-bindings:= )
+"
+
+RDEPEND="
+	!<chromeos-base/chromeos-login-0.0.2
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "session_manager"
+}
diff --git a/chromeos-base/shill-cli/shill-cli-0.0.1-r25.ebuild b/chromeos-base/shill-cli/shill-cli-0.0.1-r25.ebuild
deleted file mode 100644
index 1c84853..0000000
--- a/chromeos-base/shill-cli/shill-cli-0.0.1-r25.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7b271150a571aef662c99ebc6d241d9cad66d766" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk shill/cli .gn"
-
-PLATFORM_SUBDIR="shill/cli"
-
-inherit cros-workon platform
-
-DESCRIPTION="Shill Command Line Interface"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/cli"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/shill
-"
-
-DEPEND="
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=
-"
-
-src_install() {
-	dobin "${OUT}"/shillcli
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/shillcli_test"
-}
diff --git a/chromeos-base/shill-cli/shill-cli-0.0.1-r47.ebuild b/chromeos-base/shill-cli/shill-cli-0.0.1-r47.ebuild
new file mode 100644
index 0000000..eab19d2
--- /dev/null
+++ b/chromeos-base/shill-cli/shill-cli-0.0.1-r47.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "cda0d8aecf41b95f6c4af7b6878468fddb3c26fe" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk shill/cli .gn"
+
+PLATFORM_SUBDIR="shill/cli"
+
+inherit cros-workon platform
+
+DESCRIPTION="Shill Command Line Interface"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/cli"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	>=chromeos-base/shill-0.0.1-r2205
+"
+
+DEPEND="
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=
+"
+
+src_install() {
+	dobin "${OUT}"/shillcli
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/shillcli_test"
+}
diff --git a/chromeos-base/shill-cli/shill-cli-9999.ebuild b/chromeos-base/shill-cli/shill-cli-9999.ebuild
index ef57a0a..3a65f48 100644
--- a/chromeos-base/shill-cli/shill-cli-9999.ebuild
+++ b/chromeos-base/shill-cli/shill-cli-9999.ebuild
@@ -22,7 +22,7 @@
 IUSE=""
 
 RDEPEND="
-	chromeos-base/shill
+	>=chromeos-base/shill-0.0.1-r2205
 "
 
 DEPEND="
diff --git a/chromeos-base/shill-client/shill-client-0.0.1-r2085.ebuild b/chromeos-base/shill-client/shill-client-0.0.1-r2085.ebuild
deleted file mode 100644
index 7987d9e..0000000
--- a/chromeos-base/shill-client/shill-client-0.0.1-r2085.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="3a94d7a766a2e0709028525c49851bed32c3ae1c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "c49fac65c00e90a9040891dc07e2b2e809cd5a30" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="common-mk shill .gn"
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="shill/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="Shill DBus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host"
-
-RDEPEND="
-	!<chromeos-base/shill-0.0.2
-"
-
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings:=
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "shill"
-}
diff --git a/chromeos-base/shill-client/shill-client-0.0.1-r2171.ebuild b/chromeos-base/shill-client/shill-client-0.0.1-r2171.ebuild
new file mode 100644
index 0000000..ece4bd2
--- /dev/null
+++ b/chromeos-base/shill-client/shill-client-0.0.1-r2171.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="ea08436d83146f029bedd71261d4f9c893deb0c3"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "0cd7233a357d826d46584d3f7ba9f2de99ed94a7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="common-mk shill .gn"
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="shill/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="Shill DBus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host"
+
+RDEPEND="
+	!<chromeos-base/shill-0.0.2
+"
+
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings:=
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "shill"
+}
diff --git a/chromeos-base/shill-net/shill-net-0.0.1-r17.ebuild b/chromeos-base/shill-net/shill-net-0.0.1-r17.ebuild
new file mode 100644
index 0000000..29394683
--- /dev/null
+++ b/chromeos-base/shill-net/shill-net-0.0.1-r17.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="ea08436d83146f029bedd71261d4f9c893deb0c3"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "0cd7233a357d826d46584d3f7ba9f2de99ed94a7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk shill .gn"
+
+PLATFORM_SUBDIR="shill/net"
+
+inherit cros-workon platform
+
+DESCRIPTION="Shill networking component interface library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/shill/net"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="fuzzer +wifi"
+
+DEPEND=""
+RDEPEND="
+	!<chromeos-base/shill-0.0.5
+"
+
+src_install() {
+	# Install libshill-net library.
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	local v="$(libchrome_ver)"
+	./preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}/lib/libshill-net.so"
+	doins "${OUT}/lib/libshill-net.pc"
+
+	# TODO(crbug/920513): Remove both.
+	# Backward compatibility before all usages of versioned libraries are
+	# removed.
+	doins "${OUT}/lib/libshill-net-${v}.pc"
+	# Backward compatibility before developers has built their software against
+	# new shill.
+	dosym libshill-net.so "/usr/$(get_libdir)/libshill-net-${v}.so"
+
+	# Install header files from libshill-net.
+	insinto /usr/include/shill/net
+	doins ./*.h
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/../OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/shill_net_test"
+}
diff --git a/chromeos-base/shill-net/shill-net-9999.ebuild b/chromeos-base/shill-net/shill-net-9999.ebuild
new file mode 100644
index 0000000..7f01aa0
--- /dev/null
+++ b/chromeos-base/shill-net/shill-net-9999.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk shill .gn"
+
+PLATFORM_SUBDIR="shill/net"
+
+inherit cros-workon platform
+
+DESCRIPTION="Shill networking component interface library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/shill/net"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="~*"
+IUSE="fuzzer +wifi"
+
+DEPEND=""
+RDEPEND="
+	!<chromeos-base/shill-0.0.5
+"
+
+src_install() {
+	# Install libshill-net library.
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	local v="$(libchrome_ver)"
+	./preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}/lib/libshill-net.so"
+	doins "${OUT}/lib/libshill-net.pc"
+
+	# TODO(crbug/920513): Remove both.
+	# Backward compatibility before all usages of versioned libraries are
+	# removed.
+	doins "${OUT}/lib/libshill-net-${v}.pc"
+	# Backward compatibility before developers has built their software against
+	# new shill.
+	dosym libshill-net.so "/usr/$(get_libdir)/libshill-net-${v}.so"
+
+	# Install header files from libshill-net.
+	insinto /usr/include/shill/net
+	doins ./*.h
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/../OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/shill_net_test"
+}
diff --git a/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3153.ebuild b/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3153.ebuild
deleted file mode 100644
index 756d451..0000000
--- a/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3153.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="2d5e7c9552e32e47063302789ec2c7382f37cc88"
-CROS_WORKON_TREE="2aeac53ba60c299115bae900809c074566d9228a"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_SUBTREE="shill/test-scripts"
-
-inherit cros-workon
-
-DESCRIPTION="shill's test scripts"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	dev-lang/python
-	dev-python/dbus-python
-	dev-python/pygobject"
-
-RDEPEND="${DEPEND}
-	chromeos-base/shill
-	net-dns/dnsmasq
-	sys-apps/iproute2"
-
-src_compile() {
-	# We only install scripts here, so no need to compile.
-	:
-}
-
-src_install() {
-	exeinto /usr/lib/flimflam/test
-	doexe shill/test-scripts/*
-}
diff --git a/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3154.ebuild b/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3154.ebuild
new file mode 100644
index 0000000..048112c
--- /dev/null
+++ b/chromeos-base/shill-test-scripts/shill-test-scripts-0.0.1-r3154.ebuild
@@ -0,0 +1,42 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="73d971357f5c6fbe3625febc5dc84a917d6b5506"
+CROS_WORKON_TREE="2aeac53ba60c299115bae900809c074566d9228a"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="shill/test-scripts"
+
+inherit cros-workon
+
+DESCRIPTION="shill's test scripts"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	dev-lang/python
+	dev-python/dbus-python
+	dev-python/pygobject"
+
+RDEPEND="${DEPEND}
+	>=chromeos-base/shill-0.0.1-r2205
+	net-dns/dnsmasq
+	sys-apps/iproute2"
+
+src_compile() {
+	# We only install scripts here, so no need to compile.
+	:
+}
+
+src_install() {
+	exeinto /usr/lib/flimflam/test
+	doexe shill/test-scripts/*
+}
diff --git a/chromeos-base/shill-test-scripts/shill-test-scripts-9999.ebuild b/chromeos-base/shill-test-scripts/shill-test-scripts-9999.ebuild
index 61265c0..aa83613 100644
--- a/chromeos-base/shill-test-scripts/shill-test-scripts-9999.ebuild
+++ b/chromeos-base/shill-test-scripts/shill-test-scripts-9999.ebuild
@@ -25,7 +25,7 @@
 	dev-python/pygobject"
 
 RDEPEND="${DEPEND}
-	chromeos-base/shill
+	>=chromeos-base/shill-0.0.1-r2205
 	net-dns/dnsmasq
 	sys-apps/iproute2"
 
diff --git a/chromeos-base/shill/files/chromeos-version.sh b/chromeos-base/shill/files/chromeos-version.sh
index 5f69318..8d21cba 100755
--- a/chromeos-base/shill/files/chromeos-version.sh
+++ b/chromeos-base/shill/files/chromeos-version.sh
@@ -8,4 +8,4 @@
 # If it is necessary to add a new blocker or version dependency on this ebuild
 # at the same time as revving the ebuild to a known version value, editing this
 # version can be useful.
-echo 0.0.4
+echo 0.0.5
diff --git a/chromeos-base/shill/shill-0.0.4-r2132.ebuild b/chromeos-base/shill/shill-0.0.4-r2132.ebuild
deleted file mode 100644
index c3d75e4..0000000
--- a/chromeos-base/shill/shill-0.0.4-r2132.ebuild
+++ /dev/null
@@ -1,235 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="3a94d7a766a2e0709028525c49851bed32c3ae1c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "98c0db7e92836fcb71403a83973a9b5018fe6177" "7e189936f29d145c4191ea147e48256c92fac75d" "c49fac65c00e90a9040891dc07e2b2e809cd5a30" "3beedc5f4dfdaee00a216accee58e807058e10fe" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libpasswordprovider metrics shill vpn-manager .gn"
-
-PLATFORM_SUBDIR="shill"
-
-inherit cros-workon platform systemd udev user
-
-DESCRIPTION="Shill Connection Manager for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cellular dhcpv6 fast_transition fuzzer kernel-3_8 kernel-3_10 pppoe +seccomp systemd +tpm +vpn wake_on_wifi +wifi +wired_8021x"
-
-# Sorted by the package we depend on. (Not by use flag!)
-COMMON_DEPEND="
-	chromeos-base/bootstat:=
-	tpm? ( chromeos-base/chaps:= )
-	chromeos-base/minijail:=
-	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
-	chromeos-base/nsswitch:=
-	dev-libs/re2:=
-	cellular? ( net-dialup/ppp:= )
-	pppoe? ( net-dialup/ppp:= )
-	vpn? ( net-dialup/ppp:= )
-	net-dns/c-ares:=
-	net-libs/libtirpc:=
-	net-firewall/iptables:=
-	net-libs/libnetfilter_queue:=
-	net-libs/libnfnetlink:=
-	wifi? ( virtual/wpa_supplicant )
-	wired_8021x? ( virtual/wpa_supplicant )
-	sys-apps/rootdev:=
-	cellular? ( net-misc/modemmanager-next:= )
-	!kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) )
-"
-
-RDEPEND="${COMMON_DEPEND}
-	net-misc/dhcpcd
-	dhcpv6? ( net-misc/dhcpcd[ipv6] )
-	vpn? ( net-vpn/openvpn )
-"
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/shill-client:=
-	chromeos-base/power_manager-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	vpn? ( chromeos-base/vpn-manager:= )"
-
-pkg_setup() {
-	enewgroup "shill"
-	enewuser "shill"
-	cros-workon_pkg_setup
-}
-
-pkg_preinst() {
-	enewgroup "shill-crypto"
-	enewuser "shill-crypto"
-	enewgroup "shill-scripts"
-	enewuser "shill-scripts"
-	enewgroup "nfqueue"
-	enewuser "nfqueue"
-}
-
-get_dependent_services() {
-	local dependent_services=()
-	if use wifi || use wired_8021x; then
-		dependent_services+=(wpasupplicant)
-	fi
-	if use systemd; then
-		echo "network-services.service ${dependent_services[*]/%/.service }"
-	else
-		echo "started network-services " \
-			"${dependent_services[*]/#/and started }"
-	fi
-}
-
-src_configure() {
-	cros_optimize_package_for_speed
-	platform_src_configure
-}
-
-src_install() {
-	# Install libshill-net library.
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	local v="$(libchrome_ver)"
-	./net/preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}/lib/libshill-net-${v}.so"
-	doins "${OUT}/lib/libshill-net-${v}.pc"
-
-	# Install header files from libshill-net.
-	insinto /usr/include/shill/net
-	doins net/*.h
-
-	dobin bin/ff_debug
-
-	if use cellular; then
-		dobin bin/set_apn
-		dobin bin/set_cellular_ppp
-	fi
-
-	dosbin bin/set_wifi_regulatory
-	dobin bin/set_arpgw
-	dobin bin/set_wake_on_lan
-	dobin bin/shill_login_user
-	dobin bin/shill_logout_user
-	if use wifi || use wired_8021x; then
-		dobin bin/wpa_debug
-	fi
-	dobin "${OUT}"/shill
-
-	# Deprecated.  On Linux 3.12+ conntrackd is used instead.
-	local netfilter_queue_helper=no
-	if use kernel-3_8 || use kernel-3_10; then
-		netfilter_queue_helper=yes
-	fi
-
-	if [[ "${netfilter_queue_helper}" == "yes" ]]; then
-		# Netfilter queue helper is run directly from init, so install
-		# in sbin.
-		dosbin "${OUT}"/netfilter-queue-helper
-		dosbin init/netfilter-common
-	fi
-
-	# Install Netfilter queue helper syscall filter policy file.
-	insinto /usr/share/policy
-	use seccomp && newins shims/nfqueue-seccomp-${ARCH}.policy nfqueue-seccomp.policy
-
-	local shims_dir=/usr/$(get_libdir)/shill/shims
-	exeinto "${shims_dir}"
-
-	use vpn && doexe "${OUT}"/openvpn-script
-	if use cellular || use pppoe || use vpn; then
-		newexe "${OUT}"/lib/libshill-pppd-plugin.so shill-pppd-plugin.so
-	fi
-
-	use cellular && doexe "${OUT}"/set-apn-helper
-
-	if use wifi || use wired_8021x; then
-		sed \
-			"s,@libdir@,/usr/$(get_libdir)", \
-			shims/wpa_supplicant.conf.in \
-			> "${D}/${shims_dir}/wpa_supplicant.conf"
-	fi
-
-	dosym /run/shill/resolv.conf /etc/resolv.conf
-	insinto /etc/dbus-1/system.d
-	doins shims/org.chromium.flimflam.conf
-
-	if use cellular; then
-		insinto /usr/share/shill
-		doins "${OUT}"/serviceproviders.pbf
-		insinto /usr/share/protofiles
-		doins "${S}/mobile_operator_db/mobile_operator_db.proto"
-	fi
-
-	# Install introspection XML
-	insinto /usr/share/dbus-1/interfaces
-	doins dbus_bindings/org.chromium.flimflam.*.dbus-xml
-	doins dbus_bindings/dbus-service-config.json
-
-	# Replace template parameters inside init scripts
-	local shill_name="shill.$(usex systemd service conf)"
-	sed \
-		"s,@expected_started_services@,$(get_dependent_services)," \
-		"init/${shill_name}.in" \
-		> "${T}/${shill_name}"
-
-	# Install init scripts
-	if use systemd; then
-		if [[ "${netfilter_queue_helper}" == "yes" ]]; then
-			systemd_dounit init/netfilter-queue.service
-			systemd_enable_service network.target \
-				netfilter-queue.service
-		fi
-		systemd_dounit init/shill-start-user-session.service
-		systemd_dounit init/shill-stop-user-session.service
-
-		local dependent_services=$(get_dependent_services)
-		systemd_dounit "${T}/shill.service"
-		for dependent_service in ${dependent_services}; do
-			systemd_enable_service "${dependent_service}" shill.service
-		done
-		systemd_enable_service shill.service network.target
-
-		systemd_dounit init/network-services.service
-		systemd_enable_service boot-services.target network-services.service
-	else
-		insinto /etc/init
-
-		doins "${T}"/*.conf
-		doins \
-			init/network-services.conf \
-			init/shill-event.conf \
-			init/shill-start-user-session.conf \
-			init/shill-stop-user-session.conf \
-			init/shill_respawn.conf
-		if [[ "${netfilter_queue_helper}" == "yes" ]]; then
-			doins init/netfilter-queue.conf
-		fi
-	fi
-	exeinto /usr/share/cros/init
-	doexe init/*.sh
-
-	insinto /usr/share/cros/startup/process_management_policies
-	doins setuid_restrictions/shill_allowed.txt
-
-	udev_dorules udev/*.rules
-
-	# Shill keeps profiles inside the user's cryptohome.
-	local daemon_store="/etc/daemon-store/shill"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners shill:shill "${daemon_store}"
-
-	local fuzzer
-	for fuzzer in "${OUT}"/*_fuzzer; do
-		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
-	done
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/shill_unittest"
-}
diff --git a/chromeos-base/shill/shill-0.0.5-r2231.ebuild b/chromeos-base/shill/shill-0.0.5-r2231.ebuild
new file mode 100644
index 0000000..7e2bca1
--- /dev/null
+++ b/chromeos-base/shill/shill-0.0.5-r2231.ebuild
@@ -0,0 +1,227 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="ea08436d83146f029bedd71261d4f9c893deb0c3"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "377caa22e8416ce2388b9c099e85be393001947f" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "0cd7233a357d826d46584d3f7ba9f2de99ed94a7" "963e076a0b7311a4a5e1c14646f9a5d50c209ef7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libpasswordprovider metrics shill vpn-manager .gn"
+
+PLATFORM_SUBDIR="shill"
+
+inherit cros-workon platform systemd udev user
+
+DESCRIPTION="Shill Connection Manager for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cellular dhcpv6 fast_transition fuzzer kernel-3_8 kernel-3_10 pppoe +seccomp systemd +tpm +vpn wake_on_wifi +wifi +wired_8021x"
+
+# Sorted by the package we depend on. (Not by use flag!)
+COMMON_DEPEND="
+	chromeos-base/bootstat:=
+	tpm? ( chromeos-base/chaps:= )
+	chromeos-base/minijail:=
+	chromeos-base/libpasswordprovider:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/nsswitch:=
+	chromeos-base/patchpanel-client:=
+	chromeos-base/shill-net:=
+	dev-libs/re2:=
+	cellular? ( net-dialup/ppp:= )
+	pppoe? ( net-dialup/ppp:= )
+	vpn? ( net-dialup/ppp:= )
+	net-dns/c-ares:=
+	net-libs/libtirpc:=
+	net-firewall/iptables:=
+	net-libs/libnetfilter_queue:=
+	net-libs/libnfnetlink:=
+	wifi? ( virtual/wpa_supplicant )
+	wired_8021x? ( virtual/wpa_supplicant )
+	sys-apps/rootdev:=
+	cellular? ( net-misc/modemmanager-next:= )
+	!kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) )
+"
+
+RDEPEND="${COMMON_DEPEND}
+	chromeos-base/patchpanel
+	net-misc/dhcpcd
+	dhcpv6? ( net-misc/dhcpcd[ipv6] )
+	vpn? ( net-vpn/openvpn )
+"
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/shill-client:=
+	chromeos-base/power_manager-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	vpn? ( chromeos-base/vpn-manager:= )"
+
+pkg_setup() {
+	enewgroup "shill"
+	enewuser "shill"
+	cros-workon_pkg_setup
+}
+
+pkg_preinst() {
+	enewgroup "shill-crypto"
+	enewuser "shill-crypto"
+	enewgroup "shill-scripts"
+	enewuser "shill-scripts"
+	enewgroup "nfqueue"
+	enewuser "nfqueue"
+}
+
+get_dependent_services() {
+	local dependent_services=()
+	if use wifi || use wired_8021x; then
+		dependent_services+=(wpasupplicant)
+	fi
+	if use systemd; then
+		echo "network-services.service ${dependent_services[*]/%/.service }"
+	else
+		echo "started network-services " \
+			"${dependent_services[*]/#/and started }"
+	fi
+}
+
+src_configure() {
+	cros_optimize_package_for_speed
+	platform_src_configure
+}
+
+src_install() {
+	dobin bin/ff_debug
+
+	if use cellular; then
+		dobin bin/set_apn
+		dobin bin/set_cellular_ppp
+	fi
+
+	dosbin bin/set_wifi_regulatory
+	dobin bin/set_arpgw
+	dobin bin/set_wake_on_lan
+	dobin bin/shill_login_user
+	dobin bin/shill_logout_user
+	if use wifi || use wired_8021x; then
+		dobin bin/wpa_debug
+	fi
+	dobin "${OUT}"/shill
+
+	# Deprecated.  On Linux 3.12+ conntrackd is used instead.
+	local netfilter_queue_helper=no
+	if use kernel-3_8 || use kernel-3_10; then
+		netfilter_queue_helper=yes
+	fi
+
+	if [[ "${netfilter_queue_helper}" == "yes" ]]; then
+		# Netfilter queue helper is run directly from init, so install
+		# in sbin.
+		dosbin "${OUT}"/netfilter-queue-helper
+		dosbin init/netfilter-common
+	fi
+
+	# Install Netfilter queue helper syscall filter policy file.
+	insinto /usr/share/policy
+	use seccomp && newins shims/nfqueue-seccomp-${ARCH}.policy nfqueue-seccomp.policy
+
+	local shims_dir=/usr/$(get_libdir)/shill/shims
+	exeinto "${shims_dir}"
+
+	use vpn && doexe "${OUT}"/openvpn-script
+	if use cellular || use pppoe || use vpn; then
+		newexe "${OUT}"/lib/libshill-pppd-plugin.so shill-pppd-plugin.so
+	fi
+
+	use cellular && doexe "${OUT}"/set-apn-helper
+
+	if use wifi || use wired_8021x; then
+		sed \
+			"s,@libdir@,/usr/$(get_libdir)", \
+			shims/wpa_supplicant.conf.in \
+			> "${D}/${shims_dir}/wpa_supplicant.conf"
+	fi
+
+	dosym /run/shill/resolv.conf /etc/resolv.conf
+	insinto /etc/dbus-1/system.d
+	doins shims/org.chromium.flimflam.conf
+
+	if use cellular; then
+		insinto /usr/share/shill
+		doins "${OUT}"/serviceproviders.pbf
+		insinto /usr/share/protofiles
+		doins "${S}/mobile_operator_db/mobile_operator_db.proto"
+	fi
+
+	# Install introspection XML
+	insinto /usr/share/dbus-1/interfaces
+	doins dbus_bindings/org.chromium.flimflam.*.dbus-xml
+	doins dbus_bindings/dbus-service-config.json
+
+	# Replace template parameters inside init scripts
+	local shill_name="shill.$(usex systemd service conf)"
+	sed \
+		"s,@expected_started_services@,$(get_dependent_services)," \
+		"init/${shill_name}.in" \
+		> "${T}/${shill_name}"
+
+	# Install init scripts
+	if use systemd; then
+		if [[ "${netfilter_queue_helper}" == "yes" ]]; then
+			systemd_dounit init/netfilter-queue.service
+			systemd_enable_service network.target \
+				netfilter-queue.service
+		fi
+		systemd_dounit init/shill-start-user-session.service
+		systemd_dounit init/shill-stop-user-session.service
+
+		local dependent_services=$(get_dependent_services)
+		systemd_dounit "${T}/shill.service"
+		for dependent_service in ${dependent_services}; do
+			systemd_enable_service "${dependent_service}" shill.service
+		done
+		systemd_enable_service shill.service network.target
+
+		systemd_dounit init/network-services.service
+		systemd_enable_service boot-services.target network-services.service
+	else
+		insinto /etc/init
+
+		doins "${T}"/*.conf
+		doins \
+			init/network-services.conf \
+			init/shill-event.conf \
+			init/shill-start-user-session.conf \
+			init/shill-stop-user-session.conf \
+			init/shill_respawn.conf
+		if [[ "${netfilter_queue_helper}" == "yes" ]]; then
+			doins init/netfilter-queue.conf
+		fi
+	fi
+	exeinto /usr/share/cros/init
+	doexe init/*.sh
+
+	insinto /usr/share/cros/startup/process_management_policies
+	doins setuid_restrictions/shill_allowed.txt
+
+	udev_dorules udev/*.rules
+
+	# Shill keeps profiles inside the user's cryptohome.
+	local daemon_store="/etc/daemon-store/shill"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners shill:shill "${daemon_store}"
+
+	local fuzzer
+	for fuzzer in "${OUT}"/*_fuzzer; do
+		platform_fuzzer_install "${S}"/OWNERS "${fuzzer}"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/shill_unittest"
+}
diff --git a/chromeos-base/shill/shill-9999.ebuild b/chromeos-base/shill/shill-9999.ebuild
index 129d9f2..878adfbd 100644
--- a/chromeos-base/shill/shill-9999.ebuild
+++ b/chromeos-base/shill/shill-9999.ebuild
@@ -27,8 +27,10 @@
 	tpm? ( chromeos-base/chaps:= )
 	chromeos-base/minijail:=
 	chromeos-base/libpasswordprovider:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/nsswitch:=
+	chromeos-base/patchpanel-client:=
+	chromeos-base/shill-net:=
 	dev-libs/re2:=
 	cellular? ( net-dialup/ppp:= )
 	pppoe? ( net-dialup/ppp:= )
@@ -46,6 +48,7 @@
 "
 
 RDEPEND="${COMMON_DEPEND}
+	chromeos-base/patchpanel
 	net-misc/dhcpcd
 	dhcpv6? ( net-misc/dhcpcd[ipv6] )
 	vpn? ( net-vpn/openvpn )
@@ -90,17 +93,6 @@
 }
 
 src_install() {
-	# Install libshill-net library.
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	local v="$(libchrome_ver)"
-	./net/preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}/lib/libshill-net-${v}.so"
-	doins "${OUT}/lib/libshill-net-${v}.pc"
-
-	# Install header files from libshill-net.
-	insinto /usr/include/shill/net
-	doins net/*.h
-
 	dobin bin/ff_debug
 
 	if use cellular; then
diff --git a/chromeos-base/sirenia/files/chromeos-version.sh b/chromeos-base/sirenia/files/chromeos-version.sh
new file mode 100644
index 0000000..81ddfce
--- /dev/null
+++ b/chromeos-base/sirenia/files/chromeos-version.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+#
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Assumes the first 'version =' line in the Cargo.toml is the version for the
+# crate.
+awk '/^version = / { gsub(/"/, "", $0); print $3; exit }' "$1/sirenia/Cargo.toml"
diff --git a/chromeos-base/sirenia/sirenia-0.24.52-r15.ebuild b/chromeos-base/sirenia/sirenia-0.24.52-r15.ebuild
new file mode 100644
index 0000000..5aafca5
--- /dev/null
+++ b/chromeos-base/sirenia/sirenia-0.24.52-r15.ebuild
@@ -0,0 +1,73 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE="9a063ea0ed0ea73f51180b3f4f69e481c034ca54"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="sirenia"
+
+START_DIR="sirenia"
+
+inherit cros-workon cros-rust
+
+CROS_RUST_CRATE_NAME="sirenia"
+DESCRIPTION="The runtime environment and middleware for ManaTEE."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/sirenia/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
+	=dev-rust/getopts-0.2*:=
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3
+	>=dev-rust/flexbuffers-0.1.1:= <dev-rust/flexbuffers-0.2
+	dev-rust/libchromeos:=
+	dev-rust/minijail:=
+	>=dev-rust/openssl-0.10.22:= <dev-rust/openssl-0.11
+	>=dev-rust/serde-1.0.114:= <dev-rust/serde-2
+	=dev-rust/serde_derive-1*:=
+	dev-rust/sys_util:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/${START_DIR}"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+# We skip the vsock test because it requires the vsock kernel modules to be
+# loaded.
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test -- --skip transport::tests::vsocktransport
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	local build_dir="$(cros-rust_get_build_dir)"
+	dobin "${build_dir}/dugong"
+
+	# Needed for initramfs, but not for the root-fs.
+	if use cros_host ; then
+		# /build is not allowed when installing to the host.
+		exeinto "/bin"
+	else
+		exeinto "/build/initramfs"
+	fi
+	doexe "${build_dir}/trichechus"
+}
diff --git a/chromeos-base/sirenia/sirenia-9999.ebuild b/chromeos-base/sirenia/sirenia-9999.ebuild
new file mode 100644
index 0000000..718c9a3
--- /dev/null
+++ b/chromeos-base/sirenia/sirenia-9999.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="sirenia"
+
+START_DIR="sirenia"
+
+inherit cros-workon cros-rust
+
+CROS_RUST_CRATE_NAME="sirenia"
+DESCRIPTION="The runtime environment and middleware for ManaTEE."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/sirenia/"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE="cros_host"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
+	=dev-rust/getopts-0.2*:=
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3
+	>=dev-rust/flexbuffers-0.1.1:= <dev-rust/flexbuffers-0.2
+	dev-rust/libchromeos:=
+	dev-rust/minijail:=
+	>=dev-rust/openssl-0.10.22:= <dev-rust/openssl-0.11
+	>=dev-rust/serde-1.0.114:= <dev-rust/serde-2
+	=dev-rust/serde_derive-1*:=
+	dev-rust/sys_util:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/${START_DIR}"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+# We skip the vsock test because it requires the vsock kernel modules to be
+# loaded.
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test -- --skip transport::tests::vsocktransport
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	local build_dir="$(cros-rust_get_build_dir)"
+	dobin "${build_dir}/dugong"
+
+	# Needed for initramfs, but not for the root-fs.
+	if use cros_host ; then
+		# /build is not allowed when installing to the host.
+		exeinto "/bin"
+	else
+		exeinto "/build/initramfs"
+	fi
+	doexe "${build_dir}/trichechus"
+}
diff --git a/chromeos-base/smbfs/smbfs-0.0.1-r123.ebuild b/chromeos-base/smbfs/smbfs-0.0.1-r123.ebuild
deleted file mode 100644
index 95dcdfd..0000000
--- a/chromeos-base/smbfs/smbfs-0.0.1-r123.ebuild
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "98c0db7e92836fcb71403a83973a9b5018fe6177" "f392eb20fe0eef352d0b9c1229956bc37210eadf" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libpasswordprovider smbfs .gn"
-
-PLATFORM_SUBDIR="smbfs"
-
-inherit cros-workon platform user
-
-DESCRIPTION="FUSE filesystem to mount SMB shares."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smbfs/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	=sys-fs/fuse-2.9*:=
-	net-fs/samba:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/system_api:=
-	chromeos-base/libpasswordprovider:=
-"
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs <daemon_user> and <daemon_group>.
-	enewuser "fuse-smbfs"
-	enewgroup "fuse-smbfs"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dosbin "${OUT}"/smbfs
-
-	insinto /usr/share/policy
-	newins seccomp_filters/smbfs-seccomp-"${ARCH}".policy smbfs-seccomp.policy
-
-	local daemon_store="/etc/daemon-store/smbfs"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners fuse-smbfs:fuse-smbfs "${daemon_store}"
-}
-
-platform_pkg_test() {
-	local tests=(
-		smbfs_test
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/smbfs/smbfs-0.0.1-r144.ebuild b/chromeos-base/smbfs/smbfs-0.0.1-r144.ebuild
new file mode 100644
index 0000000..192ae62
--- /dev/null
+++ b/chromeos-base/smbfs/smbfs-0.0.1-r144.ebuild
@@ -0,0 +1,67 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "377caa22e8416ce2388b9c099e85be393001947f" "0b4dd85d546449bcfe173091fc0577c0e4819734" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libpasswordprovider smbfs .gn"
+
+PLATFORM_SUBDIR="smbfs"
+
+inherit cros-workon platform user
+
+DESCRIPTION="FUSE filesystem to mount SMB shares."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smbfs/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	=sys-fs/fuse-2.9*:=
+	net-fs/samba:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/system_api:=
+	chromeos-base/libpasswordprovider:=
+"
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs <daemon_user> and <daemon_group>.
+	enewuser "fuse-smbfs"
+	enewgroup "fuse-smbfs"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dosbin "${OUT}"/smbfs
+
+	insinto /usr/share/policy
+	newins seccomp_filters/smbfs-seccomp-"${ARCH}".policy smbfs-seccomp.policy
+
+	local daemon_store="/etc/daemon-store/smbfs"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners fuse-smbfs:fuse-smbfs "${daemon_store}"
+}
+
+platform_pkg_test() {
+	local tests=(
+		smbfs_test
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/smbprovider/smbprovider-0.0.1-r634.ebuild b/chromeos-base/smbprovider/smbprovider-0.0.1-r634.ebuild
deleted file mode 100644
index 17c2eae1..0000000
--- a/chromeos-base/smbprovider/smbprovider-0.0.1-r634.ebuild
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "98c0db7e92836fcb71403a83973a9b5018fe6177" "84b254669dd770139cab5980338344b10736427d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(allenvic): Remove libpasswordprovider from here once crbug.com/833675 is resolved.
-CROS_WORKON_SUBTREE="common-mk libpasswordprovider smbprovider .gn"
-
-PLATFORM_SUBDIR="smbprovider"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Provides access to Samba file share"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smbprovider/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-COMMON_DEPEND="
-	dev-libs/protobuf:=
-	>=net-fs/samba-4.5.3-r6
-	sys-apps/dbus:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/protofiles:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/libpasswordprovider:=
-"
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs smbproviderd:smbproviderd.
-	enewuser "smbproviderd"
-	enewgroup "smbproviderd"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dosbin "${OUT}"/smbproviderd
-
-	insinto /etc/dbus-1/system.d
-	doins etc/dbus-1/org.chromium.SmbProvider.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins org.chromium.SmbProvider.service
-
-	insinto /etc/init
-	doins etc/init/smbproviderd.conf
-
-	insinto /usr/share/policy
-	newins seccomp_filters/smbprovider-seccomp-"${ARCH}".policy smbprovider-seccomp.policy
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/netbios_packet_fuzzer
-
-	local daemon_store="/etc/daemon-store/smbproviderd"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners smbproviderd:smbproviderd "${daemon_store}"
-}
-
-platform_pkg_test() {
-	local tests=(
-		smbprovider_test
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/smbprovider/smbprovider-0.0.1-r655.ebuild b/chromeos-base/smbprovider/smbprovider-0.0.1-r655.ebuild
new file mode 100644
index 0000000..55dc9f4
--- /dev/null
+++ b/chromeos-base/smbprovider/smbprovider-0.0.1-r655.ebuild
@@ -0,0 +1,81 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "377caa22e8416ce2388b9c099e85be393001947f" "4abec8ca0569f1dd350ba055bebc9111e18a2da7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(allenvic): Remove libpasswordprovider from here once crbug.com/833675 is resolved.
+CROS_WORKON_SUBTREE="common-mk libpasswordprovider smbprovider .gn"
+
+PLATFORM_SUBDIR="smbprovider"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Provides access to Samba file share"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smbprovider/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	dev-libs/protobuf:=
+	>=net-fs/samba-4.5.3-r6
+	sys-apps/dbus:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/protofiles:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/libpasswordprovider:=
+"
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs smbproviderd:smbproviderd.
+	enewuser "smbproviderd"
+	enewgroup "smbproviderd"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dosbin "${OUT}"/smbproviderd
+
+	insinto /etc/dbus-1/system.d
+	doins etc/dbus-1/org.chromium.SmbProvider.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins org.chromium.SmbProvider.service
+
+	insinto /etc/init
+	doins etc/init/smbproviderd.conf
+
+	insinto /usr/share/policy
+	newins seccomp_filters/smbprovider-seccomp-"${ARCH}".policy smbprovider-seccomp.policy
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/netbios_packet_fuzzer
+
+	local daemon_store="/etc/daemon-store/smbproviderd"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners smbproviderd:smbproviderd "${daemon_store}"
+}
+
+platform_pkg_test() {
+	local tests=(
+		smbprovider_test
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/smogcheck/smogcheck-0.0.1-r2998.ebuild b/chromeos-base/smogcheck/smogcheck-0.0.1-r2998.ebuild
deleted file mode 100644
index ceba223..0000000
--- a/chromeos-base/smogcheck/smogcheck-0.0.1-r2998.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f1a3a02a7d814963817ddfc289d86c25c19a4c87" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="common-mk smogcheck .gn"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-
-inherit cros-common.mk cros-sanitizers cros-workon cros-debug
-
-DESCRIPTION="TPM SmogCheck library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smogcheck/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-asan"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/smogcheck"
-}
-
-src_configure() {
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
-
-src_install() {
-	emake DESTDIR="${D}" LIBDIR="$(get_libdir)" install
-}
diff --git a/chromeos-base/smogcheck/smogcheck-0.0.1-r3019.ebuild b/chromeos-base/smogcheck/smogcheck-0.0.1-r3019.ebuild
new file mode 100644
index 0000000..0d61f7b
--- /dev/null
+++ b/chromeos-base/smogcheck/smogcheck-0.0.1-r3019.ebuild
@@ -0,0 +1,35 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "25b90cd13b01122d778a1d55d814c5b001b88d22" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="common-mk smogcheck .gn"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+
+inherit cros-common.mk cros-sanitizers cros-workon cros-debug
+
+DESCRIPTION="TPM SmogCheck library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/smogcheck/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-asan"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/smogcheck"
+}
+
+src_configure() {
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
+
+src_install() {
+	emake DESTDIR="${D}" LIBDIR="$(get_libdir)" install
+}
diff --git a/chromeos-base/sommelier/sommelier-0.0.1-r27.ebuild b/chromeos-base/sommelier/sommelier-0.0.1-r27.ebuild
deleted file mode 100644
index 619f2cfa..0000000
--- a/chromeos-base/sommelier/sommelier-0.0.1-r27.ebuild
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="bc7f92fabdbc9cb82f47911123a994b3e11a2cf5"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f18d9bae5a13fbc845fc67f82b5ed0573877a130" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk vm_tools/sommelier .gn"
-
-PLATFORM_SUBDIR="vm_tools/sommelier"
-
-inherit cros-workon platform
-
-DESCRIPTION="A Wayland compositor for use in CrOS VMs"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="kvm_guest"
-
-# This ebuild should only be used on VM guest boards.
-REQUIRED_USE="kvm_guest"
-
-COMMON_DEPEND="
-	media-libs/mesa:=[gbm]
-	x11-base/xwayland:=
-	x11-libs/libxkbcommon:=
-	x11-libs/pixman:=
-"
-
-RDEPEND="
-	!<chromeos-base/vm_guest_tools-0.0.2-r722
-	${COMMON_DEPEND}
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	dev-util/meson
-	dev-util/ninja
-"
-
-src_install() {
-	dobin "${OUT}"/sommelier
-}
-
-platform_pkg_test() {
-	# TODO(hollingum): maybe sommelier would break less if it had any tests...
-	local tests=(
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-
-	# Ensure the meson build script continues to work.
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping meson tests on non-x86 platform"
-	else
-		meson tmp_build_dir || die "Failed to configure meson build"
-		ninja -C tmp_build_dir || die "Failed to build sommelier with meson"
-		[ -f tmp_build_dir/sommelier ] || die "Target 'sommelier' was not built by meson"
-	fi
-}
diff --git a/chromeos-base/sommelier/sommelier-0.0.1-r54.ebuild b/chromeos-base/sommelier/sommelier-0.0.1-r54.ebuild
new file mode 100644
index 0000000..f128240
--- /dev/null
+++ b/chromeos-base/sommelier/sommelier-0.0.1-r54.ebuild
@@ -0,0 +1,68 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "f55d72bbb7edc43376b1b00fea2ca1b0edda404a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk vm_tools/sommelier .gn"
+
+PLATFORM_SUBDIR="vm_tools/sommelier"
+
+inherit cros-workon platform
+
+DESCRIPTION="A Wayland compositor for use in CrOS VMs"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="kvm_guest"
+
+# This ebuild should only be used on VM guest boards.
+REQUIRED_USE="kvm_guest"
+
+COMMON_DEPEND="
+	media-libs/mesa:=[gbm]
+	x11-base/xwayland:=
+	x11-libs/libxkbcommon:=
+	x11-libs/pixman:=
+"
+
+RDEPEND="
+	!<chromeos-base/vm_guest_tools-0.0.2-r722
+	${COMMON_DEPEND}
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	dev-util/meson
+	dev-util/ninja
+"
+
+src_install() {
+	dobin "${OUT}"/sommelier
+}
+
+platform_pkg_test() {
+	# TODO(hollingum): maybe sommelier would break less if it had any tests...
+	local tests=(
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+
+	# Ensure the meson build script continues to work.
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping meson tests on non-x86 platform"
+	else
+		meson tmp_build_dir || die "Failed to configure meson build"
+		ninja -C tmp_build_dir || die "Failed to build sommelier with meson"
+		[ -f tmp_build_dir/sommelier ] || die "Target 'sommelier' was not built by meson"
+	fi
+}
diff --git a/chromeos-base/st_flash/st_flash-0.0.1-r1185.ebuild b/chromeos-base/st_flash/st_flash-0.0.1-r1185.ebuild
deleted file mode 100644
index bce6fb3..0000000
--- a/chromeos-base/st_flash/st_flash-0.0.1-r1185.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "08e4ed1fd14e116ece76a1d493ace5b137f4c360" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_SUBTREE="common-mk st_flash .gn"
-
-PLATFORM_SUBDIR="st_flash"
-
-inherit cros-workon platform
-
-DESCRIPTION="STM32 IAP firmware updater for Chrome OS touchpads"
-HOMEPAGE=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-src_install() {
-	dobin "${OUT}"/st_flash
-}
diff --git a/chromeos-base/st_flash/st_flash-0.0.1-r1206.ebuild b/chromeos-base/st_flash/st_flash-0.0.1-r1206.ebuild
new file mode 100644
index 0000000..53599d7
--- /dev/null
+++ b/chromeos-base/st_flash/st_flash-0.0.1-r1206.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "ffebcde7bf67275f78bf7dcb24753a1cfacc3e30" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_SUBTREE="common-mk st_flash .gn"
+
+PLATFORM_SUBDIR="st_flash"
+
+inherit cros-workon platform
+
+DESCRIPTION="STM32 IAP firmware updater for Chrome OS touchpads"
+HOMEPAGE=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+src_install() {
+	dobin "${OUT}"/st_flash
+}
diff --git a/chromeos-base/system-proxy/system-proxy-0.0.1-r102.ebuild b/chromeos-base/system-proxy/system-proxy-0.0.1-r102.ebuild
deleted file mode 100644
index 2d4da56..0000000
--- a/chromeos-base/system-proxy/system-proxy-0.0.1-r102.ebuild
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="17849843254584b4fcdd31a7b3530ab37eb4d54c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7c61269c3fa27e04f2f4ac25a97357e28266ab2c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk system-proxy .gn"
-
-PLATFORM_SUBDIR="system-proxy"
-
-inherit cros-workon platform user
-
-DESCRIPTION="A daemon that provides authentication support for system services
-and ARC apps behind an authenticated web proxy."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system-proxy/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-COMMON_DEPEND="
-	chromeos-base/minijail:=
-	chromeos-base/patchpanel:=
-	dev-libs/protobuf:=
-	dev-libs/dbus-glib:=
-	sys-apps/dbus:=
-	net-misc/curl:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/permission_broker-client:=
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-"
-
-pkg_preinst() {
-	enewuser "system-proxy"
-	enewgroup "system-proxy"
-}
-
-src_install() {
-	dosbin "${OUT}"/system_proxy
-	dosbin "${OUT}"/system_proxy_worker
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.SystemProxy.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins dbus/org.chromium.SystemProxy.service
-
-	insinto /etc/init
-	doins init/system-proxy.conf
-
-	insinto /usr/share/policy
-	newins seccomp/system-proxy-seccomp-"${ARCH}".policy system-proxy-seccomp.policy
-	newins seccomp/system-proxy-worker-seccomp-"${ARCH}".policy system-proxy-worker-seccomp.policy
-
-	if use fuzzer; then
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/system_proxy_connect_headers_parser_fuzzer
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/system_proxy_worker_config_fuzzer
-	fi
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/system-proxy_test"
-}
diff --git a/chromeos-base/system-proxy/system-proxy-0.0.1-r136.ebuild b/chromeos-base/system-proxy/system-proxy-0.0.1-r136.ebuild
new file mode 100644
index 0000000..5ac1b5d
--- /dev/null
+++ b/chromeos-base/system-proxy/system-proxy-0.0.1-r136.ebuild
@@ -0,0 +1,73 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "b4416487148784babe3d901925f987a146fe0278" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk system-proxy .gn"
+
+PLATFORM_SUBDIR="system-proxy"
+
+inherit cros-workon platform user
+
+DESCRIPTION="A daemon that provides authentication support for system services
+and ARC apps behind an authenticated web proxy."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system-proxy/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	chromeos-base/minijail:=
+	chromeos-base/patchpanel:=
+	chromeos-base/patchpanel-client:=
+	dev-libs/protobuf:=
+	dev-libs/dbus-glib:=
+	sys-apps/dbus:=
+	net-misc/curl:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/permission_broker-client:=
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+"
+
+pkg_preinst() {
+	enewuser "system-proxy"
+	enewgroup "system-proxy"
+}
+
+src_install() {
+	dosbin "${OUT}"/system_proxy
+	dosbin "${OUT}"/system_proxy_worker
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.SystemProxy.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins dbus/org.chromium.SystemProxy.service
+
+	insinto /etc/init
+	doins init/system-proxy.conf
+
+	insinto /usr/share/policy
+	newins seccomp/system-proxy-seccomp-"${ARCH}".policy system-proxy-seccomp.policy
+	newins seccomp/system-proxy-worker-seccomp-"${ARCH}".policy system-proxy-worker-seccomp.policy
+
+	if use fuzzer; then
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/system_proxy_connect_headers_parser_fuzzer
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}"/system_proxy_worker_config_fuzzer
+	fi
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/system-proxy_test"
+}
diff --git a/chromeos-base/system-proxy/system-proxy-9999.ebuild b/chromeos-base/system-proxy/system-proxy-9999.ebuild
index a873fa6..8e4d43c 100644
--- a/chromeos-base/system-proxy/system-proxy-9999.ebuild
+++ b/chromeos-base/system-proxy/system-proxy-9999.ebuild
@@ -25,6 +25,7 @@
 COMMON_DEPEND="
 	chromeos-base/minijail:=
 	chromeos-base/patchpanel:=
+	chromeos-base/patchpanel-client:=
 	dev-libs/protobuf:=
 	dev-libs/dbus-glib:=
 	sys-apps/dbus:=
diff --git a/chromeos-base/system_api-rust/system_api-rust-0.24.52-r195.ebuild b/chromeos-base/system_api-rust/system_api-rust-0.24.52-r195.ebuild
deleted file mode 100644
index 4d4dc6e..0000000
--- a/chromeos-base/system_api-rust/system_api-rust-0.24.52-r195.ebuild
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE=("a0d8550678a1ed2a4ab62782049032a024bf40df" "0c25b69c1776f42439f6c28509e51d30da6f3f7a" "d289fda3c8ee1448b8cdf3425062327cde39dd8c" "5a7d5044149de82744dce9c319ac24c4e184d8d5")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_SUBTREE="authpolicy/dbus_bindings debugd/dbus_bindings login_manager/dbus_bindings system_api"
-
-START_DIR="system_api"
-
-inherit cros-workon cros-rust
-
-CROS_RUST_CRATE_NAME="system_api"
-DESCRIPTION="Chrome OS system API D-Bus bindings for Rust."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/"
-
-LICENSE="BSD-Google"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	chromeos-base/chromeos-dbus-bindings-rust:=
-	=dev-rust/dbus-0.6*:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/${START_DIR}"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
diff --git a/chromeos-base/system_api-rust/system_api-rust-0.24.52-r264.ebuild b/chromeos-base/system_api-rust/system_api-rust-0.24.52-r264.ebuild
new file mode 100644
index 0000000..d568323
--- /dev/null
+++ b/chromeos-base/system_api-rust/system_api-rust-0.24.52-r264.ebuild
@@ -0,0 +1,49 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE=("a0d8550678a1ed2a4ab62782049032a024bf40df" "135144614b37b7eff5e012dd90d7cbdefbba5d6a" "d289fda3c8ee1448b8cdf3425062327cde39dd8c" "5d69cddbb685554738be4c271a07e645e7281630")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_SUBTREE="authpolicy/dbus_bindings debugd/dbus_bindings login_manager/dbus_bindings system_api"
+
+START_DIR="system_api"
+
+inherit cros-workon cros-rust
+
+CROS_RUST_CRATE_NAME="system_api"
+DESCRIPTION="Chrome OS system API D-Bus bindings for Rust."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/"
+
+LICENSE="BSD-Google"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/${START_DIR}"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
diff --git a/chromeos-base/system_api-rust/system_api-rust-9999.ebuild b/chromeos-base/system_api-rust/system_api-rust-9999.ebuild
index 4d0d4de..4865c7f 100644
--- a/chromeos-base/system_api-rust/system_api-rust-9999.ebuild
+++ b/chromeos-base/system_api-rust/system_api-rust-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2019 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="platform2"
@@ -22,8 +22,8 @@
 RDEPEND=""
 
 DEPEND="${RDEPEND}
-	chromeos-base/chromeos-dbus-bindings-rust:=
-	=dev-rust/dbus-0.6*:=
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
 "
 
 src_unpack() {
diff --git a/chromeos-base/system_api/system_api-0.0.1-r3992.ebuild b/chromeos-base/system_api/system_api-0.0.1-r3992.ebuild
deleted file mode 100644
index a78b445..0000000
--- a/chromeos-base/system_api/system_api-0.0.1-r3992.ebuild
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "5a7d5044149de82744dce9c319ac24c4e184d8d5" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_GO_PACKAGES=(
-	"chromiumos/system_api/..."
-)
-
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk system_api .gn"
-
-PLATFORM_SUBDIR="system_api"
-WANT_LIBBRILLO="no"
-
-inherit cros-fuzzer cros-go cros-workon platform
-
-DESCRIPTION="Chrome OS system API (D-Bus service names, etc.)"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/"
-LICENSE="BSD-Google"
-# The subslot should be manually bumped any time protobuf is upgraded
-# to a newer version whose libraries are incompatible with the
-# generated sources of the previous version. As a rule of thumb if the
-# minor version of protobuf has changed, the subslot should be incremented.
-SLOT="0/1"
-KEYWORDS="*"
-IUSE="cros_host"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	dev-go/protobuf:=
-	dev-libs/protobuf:=
-	cros_host? ( net-libs/grpc:= )
-"
-
-src_unpack() {
-	platform_src_unpack
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-}
-
-src_install() {
-	insinto /usr/"$(get_libdir)"/pkgconfig
-	doins system_api.pc
-
-	insinto /usr/include/chromeos
-	doins -r dbus switches constants
-	find "${D}" -name OWNERS -delete || die
-
-	# Install the dbus-constants.h files in the respective daemons' client library
-	# include directory. Users will need to include the corresponding client
-	# library to access these files.
-	local dir dirs=(
-		anomaly_detector
-		attestation
-		biod
-		chunneld
-		cros-disks
-		cros_healthd
-		cryptohome
-		debugd
-		dlcservice
-		kerberos
-		login_manager
-		lorgnette
-		oobe_config
-		runtime_probe
-		permission_broker
-		power_manager
-		shill
-		smbprovider
-		tpm_manager
-		update_engine
-		wilco_dtc_supportd
-	)
-	for dir in "${dirs[@]}"; do
-		insinto /usr/include/"${dir}"-client/"${dir}"
-		doins dbus/"${dir}"/dbus-constants.h
-	done
-
-	# These are files/projects installed in the common dir.
-	dirs=( system_api )
-
-	# These are project-specific files.
-	dirs+=( $(
-		cd "${S}/dbus" || die
-		dirname */*.proto | sort -u
-	) )
-
-	for dir in "${dirs[@]}"; do
-		insinto /usr/include/"${dir}"/proto_bindings
-		doins "${OUT}"/gen/include/"${dir}"/proto_bindings/*.h
-
-		if [[ "${dir}" == "system_api" ]]; then
-			dolib.a "${OUT}/libsystem_api-protos.a"
-		else
-			dolib.a "${OUT}/libsystem_api-${dir}-protos.a"
-		fi
-	done
-
-	cros-go_src_install
-}
diff --git a/chromeos-base/system_api/system_api-0.0.1-r4077.ebuild b/chromeos-base/system_api/system_api-0.0.1-r4077.ebuild
new file mode 100644
index 0000000..7c303ca
--- /dev/null
+++ b/chromeos-base/system_api/system_api-0.0.1-r4077.ebuild
@@ -0,0 +1,107 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3fafe7ee134e9462d8c9d737ea15a9ae0be2e995"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "5d69cddbb685554738be4c271a07e645e7281630" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_GO_PACKAGES=(
+	"chromiumos/system_api/..."
+)
+
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk system_api .gn"
+
+PLATFORM_SUBDIR="system_api"
+WANT_LIBBRILLO="no"
+
+inherit cros-fuzzer cros-go cros-workon platform
+
+DESCRIPTION="Chrome OS system API (D-Bus service names, etc.)"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/"
+LICENSE="BSD-Google"
+# The subslot should be manually bumped any time protobuf is upgraded
+# to a newer version whose libraries are incompatible with the
+# generated sources of the previous version. As a rule of thumb if the
+# minor version of protobuf has changed, the subslot should be incremented.
+SLOT="0/1"
+KEYWORDS="*"
+IUSE="cros_host"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	dev-go/protobuf:=
+	dev-libs/protobuf:=
+	cros_host? ( net-libs/grpc:= )
+"
+
+src_unpack() {
+	platform_src_unpack
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+}
+
+src_install() {
+	insinto /usr/"$(get_libdir)"/pkgconfig
+	doins system_api.pc
+
+	insinto /usr/include/chromeos
+	doins -r dbus switches constants
+	find "${D}" -name OWNERS -delete || die
+
+	# Install the dbus-constants.h files in the respective daemons' client library
+	# include directory. Users will need to include the corresponding client
+	# library to access these files.
+	local dir dirs=(
+		arc-data-snapshotd
+		anomaly_detector
+		attestation
+		biod
+		chunneld
+		cros-disks
+		cros_healthd
+		cryptohome
+		debugd
+		dlcservice
+		kerberos
+		login_manager
+		lorgnette
+		oobe_config
+		runtime_probe
+		permission_broker
+		power_manager
+		shill
+		smbprovider
+		tpm_manager
+		update_engine
+		wilco_dtc_supportd
+	)
+	for dir in "${dirs[@]}"; do
+		insinto /usr/include/"${dir}"-client/"${dir}"
+		doins dbus/"${dir}"/dbus-constants.h
+	done
+
+	# These are files/projects installed in the common dir.
+	dirs=( system_api )
+
+	# These are project-specific files.
+	dirs+=( $(
+		cd "${S}/dbus" || die
+		dirname */*.proto | sort -u
+	) )
+
+	for dir in "${dirs[@]}"; do
+		insinto /usr/include/"${dir}"/proto_bindings
+		doins "${OUT}"/gen/include/"${dir}"/proto_bindings/*.h
+
+		if [[ "${dir}" == "system_api" ]]; then
+			dolib.a "${OUT}/libsystem_api-protos.a"
+		else
+			dolib.a "${OUT}/libsystem_api-${dir}-protos.a"
+		fi
+	done
+
+	cros-go_src_install
+}
diff --git a/chromeos-base/system_api/system_api-9999.ebuild b/chromeos-base/system_api/system_api-9999.ebuild
index 83a7dba..eb62695 100644
--- a/chromeos-base/system_api/system_api-9999.ebuild
+++ b/chromeos-base/system_api/system_api-9999.ebuild
@@ -53,6 +53,7 @@
 	# include directory. Users will need to include the corresponding client
 	# library to access these files.
 	local dir dirs=(
+		arc-data-snapshotd
 		anomaly_detector
 		attestation
 		biod
diff --git a/chromeos-base/tast-build-deps/files/chromeos-version.sh b/chromeos-base/tast-build-deps/files/chromeos-version.sh
new file mode 100755
index 0000000..6708d13
--- /dev/null
+++ b/chromeos-base/tast-build-deps/files/chromeos-version.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This echo statement sets the package base version (without its -r value).
+# If it is necessary to add a new blocker or version dependency on this ebuild
+# at the same time as revving the ebuild to a known version value, editing this
+# version can be useful.
+echo 2
diff --git a/chromeos-base/tast-build-deps/tast-build-deps-1-r16.ebuild b/chromeos-base/tast-build-deps/tast-build-deps-1-r16.ebuild
deleted file mode 120000
index e92c103..0000000
--- a/chromeos-base/tast-build-deps/tast-build-deps-1-r16.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-tast-build-deps-1.ebuild
\ No newline at end of file
diff --git a/chromeos-base/tast-build-deps/tast-build-deps-1.ebuild b/chromeos-base/tast-build-deps/tast-build-deps-1.ebuild
deleted file mode 100644
index 331adec..0000000
--- a/chromeos-base/tast-build-deps/tast-build-deps-1.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-DESCRIPTION="Build-time dependencies of Tast binaries"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	chromeos-base/aosp-frameworks-base-proto
-	chromeos-base/cros-config-api
-	chromeos-base/hardware_verifier_proto
-	chromeos-base/policy-go-proto
-	chromeos-base/system_api
-	chromeos-base/vm_protos
-	chromeos-base/wilco-dtc-grpc-protos
-	dev-go/boringssl-acvptool
-	dev-go/cdp
-	dev-go/cmp
-	dev-go/crypto
-	dev-go/dbus
-	dev-go/golint
-	dev-go/gopacket
-	dev-go/gopsutil
-	dev-go/go-matroska
-	dev-go/grpc
-	dev-go/mdns
-	dev-go/mp4
-	dev-go/oauth2
-	dev-go/perfetto-protos
-	dev-go/protobuf
-	dev-go/selinux
-	dev-go/subcommands
-	dev-go/sync
-	dev-go/uuid
-	dev-go/vsock
-	dev-go/yaml
-"
-
-RDEPEND="${DEPEND}"
diff --git a/chromeos-base/tast-build-deps/tast-build-deps-2-r3.ebuild b/chromeos-base/tast-build-deps/tast-build-deps-2-r3.ebuild
new file mode 100644
index 0000000..5ae3890
--- /dev/null
+++ b/chromeos-base/tast-build-deps/tast-build-deps-2-r3.ebuild
@@ -0,0 +1,60 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="Build-time dependencies of Tast binaries"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	chromeos-base/aosp-frameworks-base-proto
+	chromeos-base/cros-config-api
+	chromeos-base/hardware_verifier_proto
+	chromeos-base/policy-go-proto
+	chromeos-base/system_api
+	chromeos-base/vm_protos
+	chromeos-base/wilco-dtc-grpc-protos
+	dev-go/boringssl-acvptool
+	dev-go/cdp
+	dev-go/cmp
+	dev-go/crypto
+	dev-go/dbus
+	dev-go/dst
+	dev-go/fscrypt
+	dev-go/gapi-drive
+	dev-go/genproto
+	dev-go/godebug
+	dev-go/golang-evdev
+	dev-go/golint
+	dev-go/gopacket
+	dev-go/gopsutil
+	dev-go/go-matroska
+	dev-go/go-sys
+	dev-go/grpc
+	dev-go/mdns
+	dev-go/mp4
+	dev-go/oauth2
+	dev-go/perfetto-protos
+	dev-go/protobuf
+	dev-go/selinux
+	dev-go/subcommands
+	dev-go/sync
+	dev-go/uuid
+	dev-go/vsock
+	dev-go/yaml
+"
+
+RDEPEND="${DEPEND}"
diff --git a/chromeos-base/tast-build-deps/tast-build-deps-9999.ebuild b/chromeos-base/tast-build-deps/tast-build-deps-9999.ebuild
new file mode 100644
index 0000000..025b44a
--- /dev/null
+++ b/chromeos-base/tast-build-deps/tast-build-deps-9999.ebuild
@@ -0,0 +1,58 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="Build-time dependencies of Tast binaries"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE=""
+
+DEPEND="
+	chromeos-base/aosp-frameworks-base-proto
+	chromeos-base/cros-config-api
+	chromeos-base/hardware_verifier_proto
+	chromeos-base/policy-go-proto
+	chromeos-base/system_api
+	chromeos-base/vm_protos
+	chromeos-base/wilco-dtc-grpc-protos
+	dev-go/boringssl-acvptool
+	dev-go/cdp
+	dev-go/cmp
+	dev-go/crypto
+	dev-go/dbus
+	dev-go/dst
+	dev-go/fscrypt
+	dev-go/gapi-drive
+	dev-go/genproto
+	dev-go/godebug
+	dev-go/golang-evdev
+	dev-go/golint
+	dev-go/gopacket
+	dev-go/gopsutil
+	dev-go/go-matroska
+	dev-go/go-sys
+	dev-go/grpc
+	dev-go/mdns
+	dev-go/mp4
+	dev-go/oauth2
+	dev-go/perfetto-protos
+	dev-go/protobuf
+	dev-go/selinux
+	dev-go/subcommands
+	dev-go/sync
+	dev-go/uuid
+	dev-go/vsock
+	dev-go/yaml
+"
+
+RDEPEND="${DEPEND}"
diff --git a/chromeos-base/tast-cmd/tast-cmd-0.0.1-r722.ebuild b/chromeos-base/tast-cmd/tast-cmd-0.0.1-r722.ebuild
deleted file mode 100644
index 2b4ba41..0000000
--- a/chromeos-base/tast-cmd/tast-cmd-0.0.1-r722.ebuild
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7882f73dac265b4c5eb48a84c7c2201ff7012eed"
-CROS_WORKON_TREE="4a8db68dcd87e8909453f8880c06431869d2dbeb"
-CROS_WORKON_PROJECT="chromiumos/platform/tast"
-CROS_WORKON_LOCALNAME="platform/tast"
-
-CROS_GO_BINARIES=(
-	"chromiumos/tast/cmd/remote_test_runner"
-	"chromiumos/tast/cmd/tast"
-)
-
-CROS_GO_VERSION="${PF}"
-
-CROS_GO_TEST=(
-	"chromiumos/tast/cmd/remote_test_runner/..."
-	"chromiumos/tast/cmd/tast/..."
-	# Also test common code.
-	"chromiumos/tast/..."
-)
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-go cros-workon
-
-DESCRIPTION="Host executables for running integration tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-# Build-time dependencies should be added to tast-build-deps, not here.
-DEPEND="chromeos-base/tast-build-deps:="
-
-RDEPEND="
-	app-arch/tar
-	app-arch/xz-utils
-	chromeos-base/google-breakpad
-	chromeos-base/tast-build-deps
-	chromeos-base/tast-vars
-	net-misc/gsutil
-	!chromeos-base/tast-common
-"
-
-src_prepare() {
-	# Disable cgo and PIE on building Tast binaries. See:
-	# https://crbug.com/976196
-	# https://github.com/golang/go/issues/30986#issuecomment-475626018
-	export CGO_ENABLED=0
-	export GOPIE=0
-
-	default
-}
diff --git a/chromeos-base/tast-cmd/tast-cmd-0.0.1-r806.ebuild b/chromeos-base/tast-cmd/tast-cmd-0.0.1-r806.ebuild
new file mode 100644
index 0000000..2159b67
--- /dev/null
+++ b/chromeos-base/tast-cmd/tast-cmd-0.0.1-r806.ebuild
@@ -0,0 +1,58 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="bfa58941f4135385da3fa4eafcb220a691ce381d"
+CROS_WORKON_TREE="d365639c1ddda6f7d3537850ffb6818c226152df"
+CROS_WORKON_PROJECT="chromiumos/platform/tast"
+CROS_WORKON_LOCALNAME="platform/tast"
+
+CROS_GO_BINARIES=(
+	"chromiumos/tast/cmd/remote_test_runner"
+	"chromiumos/tast/cmd/tast"
+)
+
+CROS_GO_VERSION="${PF}"
+
+CROS_GO_TEST=(
+	"chromiumos/tast/cmd/remote_test_runner/..."
+	"chromiumos/tast/cmd/tast/..."
+	# Also test common code.
+	"chromiumos/tast/..."
+)
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-go cros-workon
+
+DESCRIPTION="Host executables for running integration tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+# Build-time dependencies should be added to tast-build-deps, not here.
+DEPEND="chromeos-base/tast-build-deps:="
+
+RDEPEND="
+	app-arch/tar
+	app-arch/xz-utils
+	chromeos-base/google-breakpad
+	chromeos-base/tast-build-deps
+	chromeos-base/tast-vars
+	net-misc/gsutil
+	!chromeos-base/tast-common
+"
+
+src_prepare() {
+	# Disable cgo and PIE on building Tast binaries. See:
+	# https://crbug.com/976196
+	# https://github.com/golang/go/issues/30986#issuecomment-475626018
+	export CGO_ENABLED=0
+	export GOPIE=0
+
+	default
+}
diff --git a/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r47.ebuild b/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r47.ebuild
deleted file mode 100644
index e1306b8..0000000
--- a/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r47.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="63f0137f5c47a73285f502b788b037c7234e69b0"
-CROS_WORKON_TREE="4c30ab9ef08ff4062a521aab9801d146a40cd9e4"
-CROS_WORKON_PROJECT="chromiumos/platform/tast-tests"
-CROS_WORKON_LOCALNAME="platform/tast-tests"
-CROS_WORKON_SUBTREE="android"
-
-inherit cros-workon
-
-DESCRIPTION="Compiled apks used by local Tast tests in the cros bundle"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/android"
-
-LICENSE="BSD-Google GPL-3"
-SLOT="0"
-KEYWORDS="*"
-
-BDEPEND="
-	chromeos-base/android-sdk
-	dev-util/gn
-"
-
-DEPEND="${RDEPEND}"
-OUT=$(cros-workon_get_build_dir)
-
-src_compile() {
-	gn gen "${OUT}" --root="${S}"/android || die "gn failed"
-	ninja -C "${OUT}" || die "build failed"
-}
-
-src_install() {
-	if [ ! -d "${OUT}/apks" ]; then
-		ewarn "There is no apk."
-		ewarn "If you want to add a helper APK, add it under tast-tests/android"
-		ewarn "and modify BUILD.gn."
-		return
-	fi
-	insinto /usr/libexec/tast/apks/local/cros
-	doins "${OUT}"/apks/*
-}
-
diff --git a/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r76.ebuild b/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r76.ebuild
new file mode 100644
index 0000000..dd2110f
--- /dev/null
+++ b/chromeos-base/tast-local-apks-cros/tast-local-apks-cros-0.0.1-r76.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="1b9f6a27ea4766a5b4d2d1446ff835b87d0da13e"
+CROS_WORKON_TREE="9c3c5ca2c534d6512f66fb3637b40429e09a85aa"
+CROS_WORKON_PROJECT="chromiumos/platform/tast-tests"
+CROS_WORKON_LOCALNAME="platform/tast-tests"
+CROS_WORKON_SUBTREE="android"
+
+inherit cros-workon
+
+DESCRIPTION="Compiled apks used by local Tast tests in the cros bundle"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/android"
+
+LICENSE="BSD-Google GPL-3"
+SLOT="0"
+KEYWORDS="*"
+
+BDEPEND="
+	chromeos-base/android-sdk
+	dev-util/gn
+"
+
+DEPEND="${RDEPEND}"
+OUT=$(cros-workon_get_build_dir)
+
+src_compile() {
+	gn gen "${OUT}" --root="${S}"/android || die "gn failed"
+	ninja -C "${OUT}" || die "build failed"
+}
+
+src_install() {
+	if [ ! -d "${OUT}/apks" ]; then
+		ewarn "There is no apk."
+		ewarn "If you want to add a helper APK, add it under tast-tests/android"
+		ewarn "and modify BUILD.gn."
+		return
+	fi
+	insinto /usr/libexec/tast/apks/local/cros
+	doins "${OUT}"/apks/*
+}
+
diff --git a/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r128.ebuild b/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r128.ebuild
deleted file mode 100644
index 34c1a41..0000000
--- a/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r128.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("c142078820d0707858873cedb290a78d36f531af" "52bb3b88cb2dcf59cdcf3612c73987ed685117b5")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "4dbd9e89c7ca47951c04bf59942d59cb083d1d0e")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/platform/tast-tests")
-CROS_WORKON_LOCALNAME=("platform2" "platform/tast-tests")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/tast-tests")
-CROS_WORKON_SUBTREE=("common-mk .gn" "helpers")
-
-PLATFORM_SUBDIR="tast-tests/helpers/local"
-
-inherit cros-workon platform
-
-DESCRIPTION="Compiled executables used by local Tast tests in the cros bundle"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/helpers"
-
-LICENSE="BSD-Google GPL-3"
-SLOT="0/0"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	dev-cpp/gtest:=
-	media-libs/minigbm:=
-	x11-libs/libdrm:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${RDEPEND}"
-
-src_install() {
-	# Executable files' names take the form <category>.<TestName>.<bin_name>.
-	exeinto /usr/libexec/tast/helpers/local/cros
-	doexe "${OUT}"/*.[A-Z]*.*
-	# Install symbol list file to the location required by minidump_stackwalk.
-	# See https://www.chromium.org/developers/decoding-crash-dumps for details.
-	local crasher_exec="${OUT}/platform.UserCrash.crasher"
-	local id=$(head -n1 "${crasher_exec}.sym" | cut -d' ' -f 4)
-	insinto "/usr/libexec/tast/helpers/local/cros/symbols/${crasher_exec##*/}/${id}"
-	doins "${crasher_exec}.sym"
-}
diff --git a/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r151.ebuild b/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r151.ebuild
new file mode 100644
index 0000000..e8d2b49
--- /dev/null
+++ b/chromeos-base/tast-local-helpers-cros/tast-local-helpers-cros-0.0.1-r151.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "76c3c0639c462007f2f3daef6b8779a8309757f1")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "f800a445e3b88b9fc7948151885eb5d61c4e23da")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/platform/tast-tests")
+CROS_WORKON_LOCALNAME=("platform2" "platform/tast-tests")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/tast-tests")
+CROS_WORKON_SUBTREE=("common-mk .gn" "helpers")
+
+PLATFORM_SUBDIR="tast-tests/helpers/local"
+
+inherit cros-workon platform
+
+DESCRIPTION="Compiled executables used by local Tast tests in the cros bundle"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/helpers"
+
+LICENSE="BSD-Google GPL-3"
+SLOT="0/0"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	dev-cpp/gtest:=
+	media-libs/minigbm:=
+	x11-libs/libdrm:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	# Executable files' names take the form <category>.<TestName>.<bin_name>.
+	exeinto /usr/libexec/tast/helpers/local/cros
+	doexe "${OUT}"/*.[A-Z]*.*
+	# Install symbol list file to the location required by minidump_stackwalk.
+	# See https://www.chromium.org/developers/decoding-crash-dumps for details.
+	local crasher_exec="${OUT}/platform.UserCrash.crasher"
+	local id=$(head -n1 "${crasher_exec}.sym" | cut -d' ' -f 4)
+	insinto "/usr/libexec/tast/helpers/local/cros/symbols/${crasher_exec##*/}/${id}"
+	doins "${crasher_exec}.sym"
+}
diff --git a/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r673.ebuild b/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r673.ebuild
deleted file mode 100644
index f77228e..0000000
--- a/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r673.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7882f73dac265b4c5eb48a84c7c2201ff7012eed"
-CROS_WORKON_TREE="4a8db68dcd87e8909453f8880c06431869d2dbeb"
-CROS_WORKON_PROJECT="chromiumos/platform/tast"
-CROS_WORKON_LOCALNAME="platform/tast"
-
-CROS_GO_BINARIES=(
-	"chromiumos/tast/cmd/local_test_runner"
-)
-
-CROS_GO_TEST=(
-	"chromiumos/tast/cmd/local_test_runner/..."
-)
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-go cros-workon
-
-DESCRIPTION="Runner for local integration tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-# Build-time dependencies should be added to tast-build-deps, not here.
-DEPEND="chromeos-base/tast-build-deps:="
-
-RDEPEND="
-	app-arch/tar
-	!chromeos-base/tast-common
-"
-
-src_prepare() {
-	# Disable cgo and PIE on building Tast binaries. See:
-	# https://crbug.com/976196
-	# https://github.com/golang/go/issues/30986#issuecomment-475626018
-	export CGO_ENABLED=0
-	export GOPIE=0
-
-	default
-}
diff --git a/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r757.ebuild b/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r757.ebuild
new file mode 100644
index 0000000..1feac84
--- /dev/null
+++ b/chromeos-base/tast-local-test-runner/tast-local-test-runner-0.0.1-r757.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="bfa58941f4135385da3fa4eafcb220a691ce381d"
+CROS_WORKON_TREE="d365639c1ddda6f7d3537850ffb6818c226152df"
+CROS_WORKON_PROJECT="chromiumos/platform/tast"
+CROS_WORKON_LOCALNAME="platform/tast"
+
+CROS_GO_BINARIES=(
+	"chromiumos/tast/cmd/local_test_runner"
+)
+
+CROS_GO_TEST=(
+	"chromiumos/tast/cmd/local_test_runner/..."
+)
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-go cros-workon
+
+DESCRIPTION="Runner for local integration tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+# Build-time dependencies should be added to tast-build-deps, not here.
+DEPEND="chromeos-base/tast-build-deps:="
+
+RDEPEND="
+	app-arch/tar
+	!chromeos-base/tast-common
+"
+
+src_prepare() {
+	# Disable cgo and PIE on building Tast binaries. See:
+	# https://crbug.com/976196
+	# https://github.com/golang/go/issues/30986#issuecomment-475626018
+	export CGO_ENABLED=0
+	export GOPIE=0
+
+	default
+}
diff --git a/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3187.ebuild b/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3187.ebuild
deleted file mode 100644
index 1b024ec..0000000
--- a/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3187.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT=("dc7ea9c4633a52ffa75fae107d9e3c3771960c56" "7882f73dac265b4c5eb48a84c7c2201ff7012eed")
-CROS_WORKON_TREE=("0328f2419439ed7693d905e59422e205aa0a31fc" "4a8db68dcd87e8909453f8880c06431869d2dbeb")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/tast-tests"
-	"chromiumos/platform/tast"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform/tast-tests"
-	"platform/tast"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/tast-base"
-)
-
-CROS_GO_WORKSPACE=(
-	"${CROS_WORKON_DESTDIR[@]}"
-)
-
-CROS_GO_TEST=(
-	# Also test support packages that live above local/bundles/.
-	"chromiumos/tast/..."
-)
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-workon tast-bundle
-
-DESCRIPTION="Bundle of local integration tests for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/"
-
-LICENSE="Apache-2.0 BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="arc chromeless_tty chromeless_tests kernel-3_8 kernel-3_10 kernel-3_14"
-
-# Build-time dependencies should be added to tast-build-deps, not here.
-DEPEND="chromeos-base/tast-build-deps:="
-
-RDEPEND="
-	chromeos-base/policy-testserver
-	chromeos-base/tast-local-helpers-cros
-	chromeos-base/wprgo
-	!chromeless_tty? (
-		!chromeless_tests? (
-			chromeos-base/drm-tests
-		)
-	)
-	dev-libs/openssl:0=
-	arc? (
-		chromeos-base/tast-local-apks-cros
-		dev-util/android-tools
-		dev-util/android-uiautomator-server
-	)
-	net-misc/curl
-	sys-apps/memtester
-	sys-apps/rootdev
-	virtual/udev
-	!kernel-3_14? (
-		!kernel-3_10? (
-			!kernel-3_8? (
-				chromeos-base/virtual-usb-printer
-			)
-		)
-	)
-"
diff --git a/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3925.ebuild b/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3925.ebuild
new file mode 100644
index 0000000..62c9102
--- /dev/null
+++ b/chromeos-base/tast-local-tests-cros/tast-local-tests-cros-0.0.1-r3925.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT=("66014d560b6953728a09f098ec4494ea299413e6" "bfa58941f4135385da3fa4eafcb220a691ce381d")
+CROS_WORKON_TREE=("044b0f7add2e6d4df592fcf342c83902bb0c7e93" "d365639c1ddda6f7d3537850ffb6818c226152df")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/tast-tests"
+	"chromiumos/platform/tast"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/tast-tests"
+	"platform/tast"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/tast-base"
+)
+
+CROS_GO_WORKSPACE=(
+	"${CROS_WORKON_DESTDIR[@]}"
+)
+
+CROS_GO_TEST=(
+	# Also test support packages that live above local/bundles/.
+	"chromiumos/tast/..."
+)
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-workon tast-bundle
+
+DESCRIPTION="Bundle of local integration tests for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/"
+
+LICENSE="Apache-2.0 BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="arc chromeless_tty chromeless_tests kernel-3_8 kernel-3_10 kernel-3_14"
+
+# Build-time dependencies should be added to tast-build-deps, not here.
+DEPEND="chromeos-base/tast-build-deps:="
+
+RDEPEND="
+	chromeos-base/policy-testserver
+	chromeos-base/tast-local-helpers-cros
+	chromeos-base/wprgo
+	!chromeless_tty? (
+		!chromeless_tests? (
+			chromeos-base/drm-tests
+		)
+	)
+	dev-libs/openssl:0=
+	arc? (
+		chromeos-base/tast-local-apks-cros
+		dev-util/android-tools
+		dev-util/android-uiautomator-server
+	)
+	net-misc/curl
+	sys-apps/memtester
+	sys-apps/rootdev
+	virtual/udev
+	!kernel-3_14? (
+		!kernel-3_10? (
+			!kernel-3_8? (
+				chromeos-base/virtual-usb-printer
+			)
+		)
+	)
+"
diff --git a/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3194.ebuild b/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3194.ebuild
deleted file mode 100644
index 1af9d55..0000000
--- a/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3194.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT=("dc7ea9c4633a52ffa75fae107d9e3c3771960c56" "7882f73dac265b4c5eb48a84c7c2201ff7012eed" "c5889adab57bc6394a900a60d6f943f7918fef8d")
-CROS_WORKON_TREE=("0328f2419439ed7693d905e59422e205aa0a31fc" "4a8db68dcd87e8909453f8880c06431869d2dbeb" "dd84017ea39c62ab8790679abd24e7d37367ac48")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/tast-tests"
-	"chromiumos/platform/tast"
-	"chromiumos/platform/fw-testing-configs"
-)
-CROS_WORKON_LOCALNAME=(
-	"platform/tast-tests"
-	"platform/tast"
-	"platform/tast-tests/src/chromiumos/tast/remote/firmware/data/fw-testing-configs"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/tast-base"
-	"${S}/src/chromiumos/tast/remote/firmware/data/fw-testing-configs"
-)
-
-CROS_GO_WORKSPACE=(
-	"${CROS_WORKON_DESTDIR[@]}"
-)
-
-CROS_GO_TEST=(
-	# Also test support packages that live above remote/bundles/.
-	"chromiumos/tast/..."
-)
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-workon tast-bundle
-
-DESCRIPTION="Bundle of remote integration tests for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-# Build-time dependencies should be added to tast-build-deps, not here.
-DEPEND="chromeos-base/tast-build-deps:="
-
-RDEPEND=""
diff --git a/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3945.ebuild b/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3945.ebuild
new file mode 100644
index 0000000..c3ceb15
--- /dev/null
+++ b/chromeos-base/tast-remote-tests-cros/tast-remote-tests-cros-0.0.1-r3945.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT=("66014d560b6953728a09f098ec4494ea299413e6" "bfa58941f4135385da3fa4eafcb220a691ce381d" "4e80173ac59e4cab9ae07b919c1c367642d4516d")
+CROS_WORKON_TREE=("044b0f7add2e6d4df592fcf342c83902bb0c7e93" "d365639c1ddda6f7d3537850ffb6818c226152df" "0ae43237ada86ff051625b38e4bfb48ff0e7da45")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/tast-tests"
+	"chromiumos/platform/tast"
+	"chromiumos/platform/fw-testing-configs"
+)
+CROS_WORKON_LOCALNAME=(
+	"platform/tast-tests"
+	"platform/tast"
+	"platform/tast-tests/src/chromiumos/tast/remote/firmware/data/fw-testing-configs"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/tast-base"
+	"${S}/src/chromiumos/tast/remote/firmware/data/fw-testing-configs"
+)
+
+CROS_GO_WORKSPACE=(
+	"${CROS_WORKON_DESTDIR[@]}"
+)
+
+CROS_GO_TEST=(
+	# Also test support packages that live above remote/bundles/.
+	"chromiumos/tast/..."
+)
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-workon tast-bundle
+
+DESCRIPTION="Bundle of remote integration tests for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tast-tests/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+# Build-time dependencies should be added to tast-build-deps, not here.
+DEPEND="chromeos-base/tast-build-deps:="
+
+RDEPEND=""
diff --git a/chromeos-base/tast-use-flags/tast-use-flags-1-r20.ebuild b/chromeos-base/tast-use-flags/tast-use-flags-1-r20.ebuild
new file mode 100644
index 0000000..dc2fbaf
--- /dev/null
+++ b/chromeos-base/tast-use-flags/tast-use-flags-1-r20.ebuild
@@ -0,0 +1,140 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="Text file listing USE flags for Tast test dependencies"
+
+LICENSE="BSD-Google"
+# Nothing depends on this package for build info.  All the files are used at
+# runtime only by design.
+SLOT="0/0"
+KEYWORDS="*"
+
+# NB: Flags listed here are off by default unless prefixed with a '+'.
+IUSE="
+	amd64
+	android-container-pi
+	android-vm-pi
+	android-vm-rvc
+	arc
+	arc-camera1
+	arc-camera3
+	arcpp
+	arcvm
+	arm
+	arm64
+	asan
+	betty
+	biod
+	borealis_host
+	chrome_internal
+	chrome_media
+	chromeless_tty
+	containers
+	cr50_onboard
+	crosvm-gpu
+	cups
+	diagnostics
+	disable_cros_video_decoder
+	dptf
+	elm-kernelnext
+	+display_backlight
+	dlc
+	dlc_test
+	+drivefs
+	drm_atomic
+	elm
+	fizz
+	force_breakpad
+	grunt
+	hana
+	hana-kernelnext
+	houdini
+	houdini64
+	internal
+	+internal_mic
+	+internal_speaker
+	iwlwifi_rescan
+	kernel-3_8
+	kernel-3_10
+	kernel-3_14
+	kernel-3_18
+	kernel-4_4
+	kernel-4_14
+	kernel-4_19
+	kernel-5_4
+	kukui
+	kvm_host
+	kvm_transition
+	lxc
+	memd
+	ml_benchmark_drivers
+	ml_service
+	moblab
+	mocktpm
+	msan
+	ndk_translation
+	ndk_translation64
+	nnapi
+	nyan_kitty
+	ocr
+	octopus
+	pita
+	rialto
+	rk3399
+	selinux
+	selinux_experimental
+	skate
+	smartdim
+	snow
+	spring
+	+storage_wearout_detect
+	touchview
+	tpm2
+	transparent_hugepage
+	ubsan
+	unibuild
+	usbguard
+	vaapi
+	veyron_mickey
+	veyron_rialto
+	video_cards_amdgpu
+	video_cards_intel
+	virtio_gpu
+	vulkan
+	watchdog
+	wifi_hostap_test
+	wilco
+	+wired_8021x
+	zork
+"
+
+src_install() {
+	# Install a file containing a list of currently-set USE flags.
+	local path="${WORKDIR}/tast_use_flags.txt"
+	cat <<EOF >"${path}"
+# This file is used by the Tast integration testing system to
+# determine which software features are present in the system image.
+# Don't use it for anything else. Your code will break.
+EOF
+
+	# If you need to inspect a new flag, add it to $IUSE at the top of the file.
+	local flags=( ${IUSE} )
+	local flag
+	for flag in "${flags[@]/#[-+]}" ; do
+		usev ${flag}
+	done | sort -u >>"${path}"
+
+	insinto /etc
+	doins "${path}"
+}
diff --git a/chromeos-base/tast-use-flags/tast-use-flags-1-r8.ebuild b/chromeos-base/tast-use-flags/tast-use-flags-1-r8.ebuild
deleted file mode 100644
index 7bc6f33..0000000
--- a/chromeos-base/tast-use-flags/tast-use-flags-1-r8.ebuild
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="Text file listing USE flags for Tast test dependencies"
-
-LICENSE="BSD-Google"
-# Nothing depends on this package for build info.  All the files are used at
-# runtime only by design.
-SLOT="0/0"
-KEYWORDS="*"
-
-# NB: Flags listed here are off by default unless prefixed with a '+'.
-IUSE="
-	amd64
-	android-container-pi
-	android-vm-pi
-	android-vm-rvc
-	arc
-	arc-camera1
-	arc-camera3
-	arcpp
-	arcvm
-	arm
-	arm64
-	asan
-	betty
-	biod
-	chrome_internal
-	chromeless_tty
-	containers
-	cr50_onboard
-	crosvm-gpu
-	cups
-	diagnostics
-	disable_cros_video_decoder
-	dptf
-	elm-kernelnext
-	+display_backlight
-	dlc
-	dlc_test
-	+drivefs
-	drm_atomic
-	fizz
-	force_breakpad
-	force_crashpad
-	grunt
-	hana-kernelnext
-	houdini
-	houdini64
-	internal
-	+internal_mic
-	+internal_speaker
-	iwlwifi_rescan
-	kernel-3_8
-	kernel-3_10
-	kernel-3_14
-	kernel-3_18
-	kernel-4_4
-	kernel-4_14
-	kernel-4_19
-	kernel-5_4
-	kernel-5_7
-	kukui
-	kvm_host
-	kvm_transition
-	lxc
-	memd
-	ml_service
-	moblab
-	mocktpm
-	msan
-	ndk_translation
-	ndk_translation64
-	nyan_kitty
-	octopus
-	pita
-	rialto
-	rk3399
-	selinux
-	selinux_experimental
-	skate
-	smartdim
-	snow
-	spring
-	+storage_wearout_detect
-	touchview
-	tpm2
-	transparent_hugepage
-	ubsan
-	unibuild
-	usbguard
-	vaapi
-	veyron_mickey
-	veyron_rialto
-	vulkan
-	watchdog
-	wifi_hostap_test
-	wilco
-	+wired_8021x
-"
-
-src_install() {
-	# Install a file containing a list of currently-set USE flags.
-	local path="${WORKDIR}/tast_use_flags.txt"
-	cat <<EOF >"${path}"
-# This file is used by the Tast integration testing system to
-# determine which software features are present in the system image.
-# Don't use it for anything else. Your code will break.
-EOF
-
-	# If you need to inspect a new flag, add it to $IUSE at the top of the file.
-	local flags=( ${IUSE} )
-	local flag
-	for flag in "${flags[@]/#[-+]}" ; do
-		usev ${flag}
-	done | sort -u >>"${path}"
-
-	insinto /etc
-	doins "${path}"
-}
diff --git a/chromeos-base/tast-use-flags/tast-use-flags-9999.ebuild b/chromeos-base/tast-use-flags/tast-use-flags-9999.ebuild
index 7a396ab..ecf8733 100644
--- a/chromeos-base/tast-use-flags/tast-use-flags-9999.ebuild
+++ b/chromeos-base/tast-use-flags/tast-use-flags-9999.ebuild
@@ -6,7 +6,7 @@
 # This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
 # the canonical empty project.
 CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
 
 inherit cros-workon
 
@@ -34,7 +34,9 @@
 	asan
 	betty
 	biod
+	borealis_host
 	chrome_internal
+	chrome_media
 	chromeless_tty
 	containers
 	cr50_onboard
@@ -49,10 +51,11 @@
 	dlc_test
 	+drivefs
 	drm_atomic
+	elm
 	fizz
 	force_breakpad
-	force_crashpad
 	grunt
+	hana
 	hana-kernelnext
 	houdini
 	houdini64
@@ -68,19 +71,21 @@
 	kernel-4_14
 	kernel-4_19
 	kernel-5_4
-	kernel-5_7
 	kukui
 	kvm_host
 	kvm_transition
 	lxc
 	memd
+	ml_benchmark_drivers
 	ml_service
 	moblab
 	mocktpm
 	msan
 	ndk_translation
 	ndk_translation64
+	nnapi
 	nyan_kitty
+	ocr
 	octopus
 	pita
 	rialto
@@ -101,11 +106,15 @@
 	vaapi
 	veyron_mickey
 	veyron_rialto
+	video_cards_amdgpu
+	video_cards_intel
+	virtio_gpu
 	vulkan
 	watchdog
 	wifi_hostap_test
 	wilco
 	+wired_8021x
+	zork
 "
 
 src_install() {
diff --git a/chromeos-base/tast-vars/tast-vars-0.0.1-r1.ebuild b/chromeos-base/tast-vars/tast-vars-0.0.1-r1.ebuild
new file mode 100644
index 0000000..98eab8f
--- /dev/null
+++ b/chromeos-base/tast-vars/tast-vars-0.0.1-r1.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="6ad2bf259420afb9c7caa793054f36d1200109aa"
+CROS_WORKON_TREE="4d6d8f07299def567532377e3caa17192b4bddfb"
+inherit cros-constants
+
+CROS_WORKON_REPO="${CROS_GIT_HOST_URL}"
+CROS_WORKON_PROJECT="chromiumos/platform/tast-tests"
+CROS_WORKON_LOCALNAME="platform/tast-tests"
+CROS_WORKON_SUBTREE="vars"
+inherit cros-workon
+
+DESCRIPTION="All Tast static variables"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="virtual/tast-vars"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	insinto /etc/tast/vars/public
+	doins -r vars/*
+}
diff --git a/chromeos-base/tast-vars/tast-vars-1-r1.ebuild b/chromeos-base/tast-vars/tast-vars-1-r1.ebuild
deleted file mode 120000
index da32750..0000000
--- a/chromeos-base/tast-vars/tast-vars-1-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-tast-vars-1.ebuild
\ No newline at end of file
diff --git a/chromeos-base/tast-vars/tast-vars-1.ebuild b/chromeos-base/tast-vars/tast-vars-1.ebuild
deleted file mode 100644
index 7b045bf..0000000
--- a/chromeos-base/tast-vars/tast-vars-1.ebuild
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-DESCRIPTION="All Tast static variables"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="virtual/tast-vars"
-DEPEND="${RDEPEND}"
diff --git a/chromeos-base/tast-vars/tast-vars-9999.ebuild b/chromeos-base/tast-vars/tast-vars-9999.ebuild
new file mode 100644
index 0000000..0faadff
--- /dev/null
+++ b/chromeos-base/tast-vars/tast-vars-9999.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit cros-constants
+
+CROS_WORKON_REPO="${CROS_GIT_HOST_URL}"
+CROS_WORKON_PROJECT="chromiumos/platform/tast-tests"
+CROS_WORKON_LOCALNAME="platform/tast-tests"
+CROS_WORKON_SUBTREE="vars"
+inherit cros-workon
+
+DESCRIPTION="All Tast static variables"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="~*"
+IUSE=""
+
+RDEPEND="virtual/tast-vars"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	insinto /etc/tast/vars/public
+	doins -r vars/*
+}
diff --git a/chromeos-base/termina-dlc/Manifest b/chromeos-base/termina-dlc/Manifest
index d402ac9..ee6d1bd 100644
--- a/chromeos-base/termina-dlc/Manifest
+++ b/chromeos-base/termina-dlc/Manifest
@@ -1,2 +1,2 @@
-DIST termina_amd64.tbz 82137040 BLAKE2B fa945d344e6e6a77d806df4d97d337a42852f21c41188e6f0c0d695c593bea9bd4f777d3a95c8d88a8558bfa474c601874ee261e2975f2bc0f4d5777634fcdd1 SHA512 93aefa1719d21b1495ec9ed7c920652c09eb5a838300edd234f5b39076997e37784f46207579e3ffb0d6fdc9d27e7b063b03b7baf6b4de21cfb1ef195b781ce9
-DIST termina_arm.tbz 77665775 BLAKE2B 6815c73e5171aa4062b533c3891c749657d078315f9176def2c03009685d131679cb0fe9536cc5f12ada3e5b70f3b1900540057d9744e75a01d9ac246942f6cd SHA512 22e24e58f46f7c733566cac969e002167862b12dfcf3b9c70eb788ac838d56ec01dcf5928ea5bb9739c060a4a9375647643d8d31caf9abe194eabb52ace0daab
+DIST termina_amd64.tbz 82849753 BLAKE2B 826fa0de301e5bb25e4f68a159745e9443d38bb453f757a6d3aaa29f5d03c68e8fefe4864f14c24c8df064a59ec0563255effda73ccbde58ae1f768134abd9a8 SHA512 642987fab5e3c0b44e11d157b5ccd0a4e0fb232319574a817707385ec94909114d9d4126b6995b01c0156b16c9142bb6a4eff2ce9b345bdcfcc23b69d279e689
+DIST termina_arm.tbz 78581400 BLAKE2B 2f3c3adae249c2351b912f2412939e639fb56094b93b3a9c6822de44e7a06fa6b9280f43f797fe1be84a1da6fff6368d4bdde4fc48eb62d3ac00ba9b72372409 SHA512 a09053af1c167b871b58401c53708e7cc57270cbc5201938b3fd91fc24d16ecb9180b0ae3de4bcb6728c3ad7490f2e778fcb57a28938eb05ae1fd7da9ace9656
diff --git a/chromeos-base/termina-dlc/VERSION-PIN b/chromeos-base/termina-dlc/VERSION-PIN
index 2146a25..506108e 100644
--- a/chromeos-base/termina-dlc/VERSION-PIN
+++ b/chromeos-base/termina-dlc/VERSION-PIN
@@ -1 +1 @@
-85.13301.0.0.34156
\ No newline at end of file
+87.13503.0.0.38787
\ No newline at end of file
diff --git a/chromeos-base/termina-dlc/termina-dlc-85.13301.0.0.34156.ebuild b/chromeos-base/termina-dlc/termina-dlc-85.13301.0.0.34156.ebuild
deleted file mode 100644
index 23be1dd..0000000
--- a/chromeos-base/termina-dlc/termina-dlc-85.13301.0.0.34156.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# A DLC package for distributing termina.
-
-EAPI=7
-
-inherit dlc
-
-DESCRIPTION="DLC package for termina."
-SRC_URI="
-	amd64? ( gs://termina-component-testing/uprev-test/amd64/${PV}/guest-vm-base.tbz -> termina_amd64.tbz )
-	arm? ( gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina_arm.tbz )
-"
-
-RESTRICT="nomirror"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-S="${WORKDIR}"
-
-IUSE="dlc amd64 arm"
-REQUIRED_USE="
-	dlc
-	kvm_host
-	^^ ( amd64 arm )
-"
-
-# Termina is ~350MB at present, so 1 GB is very conservative.
-# 1GB = 256 x 1024 x 4KB blocks
-DLC_PREALLOC_BLOCKS="$((256 * 1024))"
-
-# TODO(crbug/953544): When termina's DLC is working, make the test pre-load it.
-# DLC_PRELOAD=true
-
-src_install() {
-	# This is the subpath underneath the location that dlc mounts the image,
-	# so we dont need additional directories.
-	local install_dir="/"
-	into "$(dlc_add_path ${install_dir})"
-	insinto "$(dlc_add_path ${install_dir})"
-	exeinto "$(dlc_add_path ${install_dir})"
-	doins "${WORKDIR}"/*
-	dlc_src_install
-}
diff --git a/chromeos-base/termina-dlc/termina-dlc-87.13503.0.0.38787-r1.ebuild b/chromeos-base/termina-dlc/termina-dlc-87.13503.0.0.38787-r1.ebuild
new file mode 100644
index 0000000..907d0b3
--- /dev/null
+++ b/chromeos-base/termina-dlc/termina-dlc-87.13503.0.0.38787-r1.ebuild
@@ -0,0 +1,97 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# A DLC package for distributing termina.
+
+EAPI=7
+
+inherit dlc cros-workon
+
+# This ebuild is upreved via PuPR, so disable the normal uprev process for
+# cros-workon ebuilds.
+CROS_WORKON_BLACKLIST="1"
+
+# "cros_workon info" expects these variables to be set, but we don't have a git
+# repo, so use the standard empty project.
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+DESCRIPTION="DLC package for termina."
+
+if [[ ${PV} == 9999 ]]; then
+	SRC_URI=""
+else
+	SRC_URI="
+		amd64? ( gs://termina-component-testing/uprev-test/amd64/${PV}/guest-vm-base.tbz -> termina_amd64.tbz )
+		arm? ( gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina_arm.tbz )
+		arm64? ( gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina_arm.tbz )
+	"
+fi
+
+RESTRICT="nomirror"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+S="${WORKDIR}"
+
+IUSE="kvm_host dlc amd64 arm"
+REQUIRED_USE="
+	dlc
+	kvm_host
+	^^ ( amd64 arm arm64 )
+"
+
+# Termina is ~87MiB compressed at present, so 100 MiB should be plenty for
+# now. Double this for test builds so we can fit test utilities in.
+# 100MiB = 256 x 1024 x 4KB blocks
+if [[ ${PV} == 9999 ]]; then
+	DLC_PREALLOC_BLOCKS="$((200 * 256))"
+else
+	DLC_PREALLOC_BLOCKS="$((100 * 256))"
+fi
+
+# TODO(crbug/953544): When termina's DLC is working, make the test pre-load it.
+# DLC_PRELOAD=true
+
+# We need to inherit from cros-workon so people can do "cros-workon-${BOARD}
+# start termina-dlc", but we don't want to actually run any of the cros-workon
+# steps, so we override pkg_setup and src_unpack with the default
+# implementations.
+pkg_setup() {
+	return
+}
+
+src_unpack() {
+	if [[ -n ${A} ]]; then
+		# $A should be tokenised here as it may contain multiple files
+		# shellcheck disable=SC2086
+		unpack ${A}
+	fi
+}
+
+src_compile() {
+	if [[ ${PV} == 9999 ]]; then
+		if use amd64; then
+			vm_board="tatl"
+		else
+			vm_board="tael"
+		fi
+		image_path="/mnt/host/source/src/build/images/${vm_board}/latest/chromiumos_test_image.bin"
+		[[ ! -f "${image_path}" ]] && die "Couldn't find VM image, try building a test image for ${vm_board} first"
+
+		/mnt/host/source/src/platform/container-guest-tools/termina/termina_build_image.py "${image_path}" "${S}/vm"
+		mv "${S}/vm"/* "${WORKDIR}"
+	fi
+}
+
+src_install() {
+	# This is the subpath underneath the location that dlc mounts the image,
+	# so we dont need additional directories.
+	local install_dir="/"
+	into "$(dlc_add_path ${install_dir})"
+	insinto "$(dlc_add_path ${install_dir})"
+	exeinto "$(dlc_add_path ${install_dir})"
+	doins "${WORKDIR}"/*
+	dlc_src_install
+}
diff --git a/chromeos-base/termina-dlc/termina-dlc-9999.ebuild b/chromeos-base/termina-dlc/termina-dlc-9999.ebuild
new file mode 100644
index 0000000..d9f470f
--- /dev/null
+++ b/chromeos-base/termina-dlc/termina-dlc-9999.ebuild
@@ -0,0 +1,97 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# A DLC package for distributing termina.
+
+EAPI=7
+
+inherit dlc cros-workon
+
+# This ebuild is upreved via PuPR, so disable the normal uprev process for
+# cros-workon ebuilds.
+CROS_WORKON_BLACKLIST="1"
+
+# "cros_workon info" expects these variables to be set, but we don't have a git
+# repo, so use the standard empty project.
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="platform/empty-project"
+
+DESCRIPTION="DLC package for termina."
+
+if [[ ${PV} == 9999 ]]; then
+	SRC_URI=""
+else
+	SRC_URI="
+		amd64? ( gs://termina-component-testing/uprev-test/amd64/${PV}/guest-vm-base.tbz -> termina_amd64.tbz )
+		arm? ( gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina_arm.tbz )
+		arm64? ( gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina_arm.tbz )
+	"
+fi
+
+RESTRICT="nomirror"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="~*"
+S="${WORKDIR}"
+
+IUSE="kvm_host dlc amd64 arm"
+REQUIRED_USE="
+	dlc
+	kvm_host
+	^^ ( amd64 arm arm64 )
+"
+
+# Termina is ~87MiB compressed at present, so 100 MiB should be plenty for
+# now. Double this for test builds so we can fit test utilities in.
+# 100MiB = 256 x 1024 x 4KB blocks
+if [[ ${PV} == 9999 ]]; then
+	DLC_PREALLOC_BLOCKS="$((200 * 256))"
+else
+	DLC_PREALLOC_BLOCKS="$((100 * 256))"
+fi
+
+# TODO(crbug/953544): When termina's DLC is working, make the test pre-load it.
+# DLC_PRELOAD=true
+
+# We need to inherit from cros-workon so people can do "cros-workon-${BOARD}
+# start termina-dlc", but we don't want to actually run any of the cros-workon
+# steps, so we override pkg_setup and src_unpack with the default
+# implementations.
+pkg_setup() {
+	return
+}
+
+src_unpack() {
+	if [[ -n ${A} ]]; then
+		# $A should be tokenised here as it may contain multiple files
+		# shellcheck disable=SC2086
+		unpack ${A}
+	fi
+}
+
+src_compile() {
+	if [[ ${PV} == 9999 ]]; then
+		if use amd64; then
+			vm_board="tatl"
+		else
+			vm_board="tael"
+		fi
+		image_path="/mnt/host/source/src/build/images/${vm_board}/latest/chromiumos_test_image.bin"
+		[[ ! -f "${image_path}" ]] && die "Couldn't find VM image, try building a test image for ${vm_board} first"
+
+		/mnt/host/source/src/platform/container-guest-tools/termina/termina_build_image.py "${image_path}" "${S}/vm"
+		mv "${S}/vm"/* "${WORKDIR}"
+	fi
+}
+
+src_install() {
+	# This is the subpath underneath the location that dlc mounts the image,
+	# so we dont need additional directories.
+	local install_dir="/"
+	into "$(dlc_add_path ${install_dir})"
+	insinto "$(dlc_add_path ${install_dir})"
+	exeinto "$(dlc_add_path ${install_dir})"
+	doins "${WORKDIR}"/*
+	dlc_src_install
+}
diff --git a/chromeos-base/termina-image-amd64/Manifest b/chromeos-base/termina-image-amd64/Manifest
deleted file mode 100644
index 9bac39f..0000000
--- a/chromeos-base/termina-image-amd64/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST termina-vm-amd64-86.13331.0.0.34882.tbz 83151121 BLAKE2B f50a303197442a2601a52e67087a770c75b79dc7d846d55507374f6fb802dfb13f2f463e1df32ae883bb1149a3060d4de0d81bb4fec6ea2fc49676abc8de7751 SHA512 bb72e319fba1bc5a368c80526e7088598a48b913cff16461b4999f80dd6ec3ea2790a57f1d3a55dff8772fdbf523fdc9d8a3a850dd5c39830288c28cdc54f5f2
diff --git a/chromeos-base/termina-image-amd64/VERSION-PIN b/chromeos-base/termina-image-amd64/VERSION-PIN
deleted file mode 100644
index df79dc2..0000000
--- a/chromeos-base/termina-image-amd64/VERSION-PIN
+++ /dev/null
@@ -1 +0,0 @@
-86.13331.0.0.34882
\ No newline at end of file
diff --git a/chromeos-base/termina-image-amd64/termina-image-amd64-86.13331.0.0.34882-r1.ebuild b/chromeos-base/termina-image-amd64/termina-image-amd64-86.13331.0.0.34882-r1.ebuild
deleted file mode 100644
index ba7a6e6..0000000
--- a/chromeos-base/termina-image-amd64/termina-image-amd64-86.13331.0.0.34882-r1.ebuild
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="Add amd64 termina VM to system for testing"
-SRC_URI="gs://termina-component-testing/uprev-test/amd64/${PV}/guest-vm-base.tbz -> termina-vm-amd64-${PV}.tbz"
-
-RESTRICT="nomirror"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="-* amd64 x86"
-S="${WORKDIR}"
-
-RDEPEND="!!chromeos-base/termina-image-arm"
-
-src_install() {
-	# Install VM files.
-	insinto /opt/google/vms/termina-test/
-	doins "${WORKDIR}"/*
-}
diff --git a/chromeos-base/termina-image-arm/Manifest b/chromeos-base/termina-image-arm/Manifest
deleted file mode 100644
index d9d5bd3..0000000
--- a/chromeos-base/termina-image-arm/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST termina-vm-arm-86.13331.0.0.34882.tbz 78561823 BLAKE2B 0ab59fddd1a682726164ed586875f0c9a9b42b0648618462c8e2e03c4209b8f6c418ec4a7add683f5bb54dba116ff882cf3ef171d1b3dfd9b3edf40abe7cf65f SHA512 2354fdd19d467b15fba538f0d61fe11e14fc6a6bf79c4a80e9c49e6702153e76089a6431bc8bcef8ad96d178bf609c1c05f041c3516ce302e763386fe6a9ca33
diff --git a/chromeos-base/termina-image-arm/VERSION-PIN b/chromeos-base/termina-image-arm/VERSION-PIN
deleted file mode 100644
index df79dc2..0000000
--- a/chromeos-base/termina-image-arm/VERSION-PIN
+++ /dev/null
@@ -1 +0,0 @@
-86.13331.0.0.34882
\ No newline at end of file
diff --git a/chromeos-base/termina-image-arm/termina-image-arm-86.13331.0.0.34882-r1.ebuild b/chromeos-base/termina-image-arm/termina-image-arm-86.13331.0.0.34882-r1.ebuild
deleted file mode 100644
index d3092cf..0000000
--- a/chromeos-base/termina-image-arm/termina-image-arm-86.13331.0.0.34882-r1.ebuild
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="Add arm termina VM to system for testing"
-SRC_URI="gs://termina-component-testing/uprev-test/arm/${PV}/guest-vm-base.tbz -> termina-vm-arm-${PV}.tbz"
-
-RESTRICT="nomirror"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="-* arm arm64"
-S="${WORKDIR}"
-
-RDEPEND="!!chromeos-base/termina-image-amd64"
-
-src_install() {
-	# Install VM files.
-	insinto /opt/google/vms/termina-test/
-	doins "${WORKDIR}"/*
-}
diff --git a/chromeos-base/termina-pin/termina-pin-85.13308.0.0-r1.ebuild b/chromeos-base/termina-pin/termina-pin-87.13495.0.0-r1.ebuild
similarity index 100%
rename from chromeos-base/termina-pin/termina-pin-85.13308.0.0-r1.ebuild
rename to chromeos-base/termina-pin/termina-pin-87.13495.0.0-r1.ebuild
diff --git a/chromeos-base/termina_container_tools/termina_container_tools-0.0.1-r22.ebuild b/chromeos-base/termina_container_tools/termina_container_tools-0.0.1-r23.ebuild
similarity index 100%
rename from chromeos-base/termina_container_tools/termina_container_tools-0.0.1-r22.ebuild
rename to chromeos-base/termina_container_tools/termina_container_tools-0.0.1-r23.ebuild
diff --git a/chromeos-base/termina_container_tools/termina_container_tools-0.0.1.ebuild b/chromeos-base/termina_container_tools/termina_container_tools-0.0.1.ebuild
index e7c7d7c..499b649 100644
--- a/chromeos-base/termina_container_tools/termina_container_tools-0.0.1.ebuild
+++ b/chromeos-base/termina_container_tools/termina_container_tools-0.0.1.ebuild
@@ -42,7 +42,10 @@
 		"/usr/sbin/vshd"
 	)
 	if use vm_borealis; then
-		tools+=("/sbin/init")
+		tools+=(
+			"/sbin/init"
+			"/usr/bin/vm_syslog"
+		)
 	fi
 	"${CHROMITE_BIN_DIR}"/lddtree --root="${SYSROOT}" --bindir=/bin \
 			--libdir=/lib --generate-wrappers \
diff --git a/chromeos-base/thd/thd-0.0.1-r271.ebuild b/chromeos-base/thd/thd-0.0.1-r271.ebuild
deleted file mode 100644
index b32ccd9..0000000
--- a/chromeos-base/thd/thd-0.0.1-r271.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f8732f0b77bd53831c8f1f975b4cb5add2dd32aa" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk thd .gn"
-
-PLATFORM_SUBDIR="thd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Thermal Daemon for Chromium OS"
-HOMEPAGE="http://dev.chromium.org/chromium-os/packages/thd"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-pkg_preinst() {
-	enewuser thermal
-	enewgroup thermal
-}
-
-src_install() {
-	dobin "${OUT}"/thd
-
-	dodir /etc/thd/
-
-	insinto /etc/init
-	doins init/*.conf
-}
diff --git a/chromeos-base/thd/thd-0.0.1-r292.ebuild b/chromeos-base/thd/thd-0.0.1-r292.ebuild
new file mode 100644
index 0000000..ebaba8d
--- /dev/null
+++ b/chromeos-base/thd/thd-0.0.1-r292.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "42b288435f1e006a7605542a5ff661605993898c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk thd .gn"
+
+PLATFORM_SUBDIR="thd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Thermal Daemon for Chromium OS"
+HOMEPAGE="http://dev.chromium.org/chromium-os/packages/thd"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+pkg_preinst() {
+	enewuser thermal
+	enewgroup thermal
+}
+
+src_install() {
+	dobin "${OUT}"/thd
+
+	dodir /etc/thd/
+
+	insinto /etc/init
+	doins init/*.conf
+}
diff --git a/chromeos-base/timberslide/timberslide-0.0.1-r1421.ebuild b/chromeos-base/timberslide/timberslide-0.0.1-r1421.ebuild
deleted file mode 100644
index d228067..0000000
--- a/chromeos-base/timberslide/timberslide-0.0.1-r1421.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "641e48c8b5eebd8fca4c9c1a0c1f148f8af2d169" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(https://crbug.com/809389)
-CROS_WORKON_SUBTREE="common-mk metrics timberslide .gn"
-
-PLATFORM_SUBDIR="timberslide"
-
-inherit cros-workon platform
-
-DESCRIPTION="EC log concatenator for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/timberslide/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/metrics:=
-	dev-libs/re2:=
-"
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dobin "${OUT}/timberslide"
-
-	# Install upstart configs and scripts
-	insinto /etc/init
-	doins init/*.conf
-	exeinto /usr/share/cros/init
-	doexe init/*.sh
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/timberslide_test_runner"
-}
diff --git a/chromeos-base/timberslide/timberslide-0.0.1-r1454.ebuild b/chromeos-base/timberslide/timberslide-0.0.1-r1454.ebuild
new file mode 100644
index 0000000..28f9d79
--- /dev/null
+++ b/chromeos-base/timberslide/timberslide-0.0.1-r1454.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "30ab7670ea92af504dd44c373dd9162c40d2e97b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(https://crbug.com/809389)
+CROS_WORKON_SUBTREE="common-mk metrics timberslide .gn"
+
+PLATFORM_SUBDIR="timberslide"
+
+inherit cros-workon platform
+
+DESCRIPTION="EC log concatenator for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/timberslide/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/re2:=
+"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dobin "${OUT}/timberslide"
+
+	# Install upstart configs and scripts
+	insinto /etc/init
+	doins init/*.conf
+	exeinto /usr/share/cros/init
+	doexe init/*.sh
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/timberslide_test_runner"
+}
diff --git a/chromeos-base/timberslide/timberslide-9999.ebuild b/chromeos-base/timberslide/timberslide-9999.ebuild
index 15f121e..1a6d71c 100644
--- a/chromeos-base/timberslide/timberslide-9999.ebuild
+++ b/chromeos-base/timberslide/timberslide-9999.ebuild
@@ -22,7 +22,7 @@
 IUSE=""
 
 RDEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/re2:=
 "
 
diff --git a/chromeos-base/tnull/tnull-0.0.1-r11.ebuild b/chromeos-base/tnull/tnull-0.0.1-r11.ebuild
deleted file mode 100644
index 3d27a5e..0000000
--- a/chromeos-base/tnull/tnull-0.0.1-r11.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="436d156e722e894241b14d657cd70f849fca4d0c"
-CROS_WORKON_TREE="30a6c30a563ee2b37f6a535f21d0b14f1f6bb587"
-CROS_WORKON_PROJECT="chromiumos/infra/tnull"
-CROS_WORKON_LOCALNAME="../infra/tnull"
-
-CROS_GO_BINARIES=(
-	"tnull"
-)
-
-CROS_GO_VERSION="${PF}"
-
-inherit cros-go cros-workon
-
-DESCRIPTION="Remote Test Driver minimal/fake implementation"
-HOMEPAGE="https://chromium.googlesource.com/${CROS_WORKON_PROJECT}"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	chromeos-base/cros-config-api:=
-	dev-go/luci-common:=
-"
diff --git a/chromeos-base/tnull/tnull-0.0.1-r18.ebuild b/chromeos-base/tnull/tnull-0.0.1-r18.ebuild
new file mode 100644
index 0000000..22c5cf1
--- /dev/null
+++ b/chromeos-base/tnull/tnull-0.0.1-r18.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="442ae5ca1f028435e1c5432886f8243c1ba5960c"
+CROS_WORKON_TREE="5f371b7f3ba13ce37d9eecc725aa94bd0a719de8"
+CROS_WORKON_PROJECT="chromiumos/infra/tnull"
+CROS_WORKON_LOCALNAME="../infra/tnull"
+
+CROS_GO_BINARIES=(
+	"tnull"
+)
+
+CROS_GO_VERSION="${PF}"
+
+inherit cros-go cros-workon
+
+DESCRIPTION="Remote Test Driver minimal/fake implementation"
+HOMEPAGE="https://chromium.googlesource.com/${CROS_WORKON_PROJECT}"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	chromeos-base/cros-config-api:=
+	dev-go/luci-chromeinfra:=
+	dev-go/luci-auth:=
+	dev-go/luci-common:=
+"
+
+src_configure() {
+	$(cros-workon_get_build_dir)/generate_metadata.sh
+}
diff --git a/chromeos-base/tnull/tnull-9999.ebuild b/chromeos-base/tnull/tnull-9999.ebuild
index 71b2821..95ea204 100644
--- a/chromeos-base/tnull/tnull-9999.ebuild
+++ b/chromeos-base/tnull/tnull-9999.ebuild
@@ -23,5 +23,11 @@
 
 DEPEND="
 	chromeos-base/cros-config-api:=
+	dev-go/luci-chromeinfra:=
+	dev-go/luci-auth:=
 	dev-go/luci-common:=
 "
+
+src_configure() {
+	$(cros-workon_get_build_dir)/generate_metadata.sh
+}
diff --git a/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3215.ebuild b/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3215.ebuild
deleted file mode 100644
index 2604197..0000000
--- a/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3215.ebuild
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="413cd25b3cef93d30e6bc889b7bb461101b15858"
-CROS_WORKON_TREE="161be89d8ab32e37d1bf37474953ae7a5ffaa3ec"
-CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
-CROS_WORKON_LOCALNAME="third_party/autotest/files"
-
-inherit cros-workon
-
-DESCRIPTION="Compilation and runtime tests for toolchain"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/client/site_tests/platform_ToolchainTests/src"
-}
diff --git a/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3779.ebuild b/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3779.ebuild
new file mode 100644
index 0000000..4968bfa
--- /dev/null
+++ b/chromeos-base/toolchain-tests/toolchain-tests-0.0.1-r3779.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a89875894d9002518772c0c8eb0a3f7353926ad6"
+CROS_WORKON_TREE="240ecaf5bcf2ae26369706ee37bf83e47f681ba7"
+CROS_WORKON_PROJECT="chromiumos/third_party/autotest"
+CROS_WORKON_LOCALNAME="third_party/autotest/files"
+
+inherit cros-workon
+
+DESCRIPTION="Compilation and runtime tests for toolchain"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/autotest/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/client/site_tests/platform_ToolchainTests/src"
+}
diff --git a/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r822.ebuild b/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r822.ebuild
deleted file mode 100644
index e769a94..0000000
--- a/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r822.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "16773b61504bd9152bf1f2275505e48b8ed249ad" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk touch_firmware_calibration .gn"
-
-PLATFORM_SUBDIR="touch_firmware_calibration"
-
-inherit cros-workon platform user udev
-
-DESCRIPTION="Touch Firmware Calibration"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_firmware_calibration/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-pkg_preinst() {
-	# Set up touch_firmware_calibration user and group which will be used to
-	# run tools for calibration.
-	enewuser touch_firmware_calibration
-	enewgroup touch_firmware_calibration
-}
-
-src_install() {
-	# Install a tool to override max pressure.
-	exeinto "$(get_udevdir)"
-	doexe "${OUT}/override-max-pressure"
-
-	# Install the correct seccomp policy for this architecture.
-	insinto "/usr/share/policy"
-	newins "seccomp/override-max-pressure-seccomp-${ARCH}.policy" override-max-pressure-seccomp.policy
-}
diff --git a/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r843.ebuild b/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r843.ebuild
new file mode 100644
index 0000000..298d4f5
--- /dev/null
+++ b/chromeos-base/touch_firmware_calibration/touch_firmware_calibration-0.0.1-r843.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "35feb3e318967769cca1866dd8a39a2a134575f9" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk touch_firmware_calibration .gn"
+
+PLATFORM_SUBDIR="touch_firmware_calibration"
+
+inherit cros-workon platform user udev
+
+DESCRIPTION="Touch Firmware Calibration"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_firmware_calibration/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+pkg_preinst() {
+	# Set up touch_firmware_calibration user and group which will be used to
+	# run tools for calibration.
+	enewuser touch_firmware_calibration
+	enewgroup touch_firmware_calibration
+}
+
+src_install() {
+	# Install a tool to override max pressure.
+	exeinto "$(get_udevdir)"
+	doexe "${OUT}/override-max-pressure"
+
+	# Install the correct seccomp policy for this architecture.
+	insinto "/usr/share/policy"
+	newins "seccomp/override-max-pressure-seccomp-${ARCH}.policy" override-max-pressure-seccomp.policy
+}
diff --git a/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r115.ebuild b/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r115.ebuild
deleted file mode 100644
index 41ab7f0..0000000
--- a/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r115.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="98e307b54b2e732f704526b4f833d82575eb8b7a"
-CROS_WORKON_TREE="704507af350e04a2f10980fd26c2876d3b713759"
-CROS_WORKON_PROJECT="chromiumos/platform/touch_firmware_test"
-CROS_WORKON_LOCALNAME="platform/touch_firmware_test"
-
-PYTHON_COMPAT=( python2_7 )
-inherit cros-sanitizers cros-workon cros-constants cros-debug distutils-r1
-
-DESCRIPTION="Chromium OS multitouch utilities"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND=""
-
-DEPEND=${RDEPEND}
-
-src_configure() {
-	sanitizers-setup-env
-	cros-debug-add-NDEBUG
-	default
-}
-
-src_install() {
-	# install the remote package
-	distutils-r1_src_install
-
-	# install the webplot script
-	exeinto /usr/local/bin
-	newexe webplot/chromeos_wrapper.sh webplot
-
-	# install the heatmapplot script
-	newexe heatmap/chromeos_heatmapplot_wrapper.sh heatmapplot
-
-	# install to autotest deps directory for dependency
-	DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests/touch_firmware_test"
-	mkdir -p "${DESTDIR}"
-	echo "CMD:" cp -Rp "${S}"/* "${DESTDIR}"
-	cp -Rp "${S}"/* "${DESTDIR}"
-}
diff --git a/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r116.ebuild b/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r116.ebuild
new file mode 100644
index 0000000..3822c18
--- /dev/null
+++ b/chromeos-base/touch_firmware_test/touch_firmware_test-0.0.1-r116.ebuild
@@ -0,0 +1,46 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="10f4e5bb36af987a5280a4eb6db6dd51f0579842"
+CROS_WORKON_TREE="a1c442eb8d5fef00ef538745ac78a9787472995d"
+CROS_WORKON_PROJECT="chromiumos/platform/touch_firmware_test"
+CROS_WORKON_LOCALNAME="platform/touch_firmware_test"
+
+PYTHON_COMPAT=( python2_7 )
+inherit cros-sanitizers cros-workon cros-constants cros-debug distutils-r1
+
+DESCRIPTION="Chromium OS multitouch utilities"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND=""
+
+DEPEND=${RDEPEND}
+
+src_configure() {
+	sanitizers-setup-env
+	cros-debug-add-NDEBUG
+	default
+}
+
+src_install() {
+	# install the remote package
+	distutils-r1_src_install
+
+	# install the webplot script
+	exeinto /usr/local/bin
+	newexe webplot/chromeos_wrapper.sh webplot
+
+	# install the heatmapplot script
+	newexe heatmap/chromeos_heatmapplot_wrapper.sh heatmapplot
+
+	# install to autotest deps directory for dependency
+	DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests/touch_firmware_test"
+	mkdir -p "${DESTDIR}"
+	echo "CMD:" cp -Rp "${S}"/* "${DESTDIR}"
+	cp -Rp "${S}"/* "${DESTDIR}"
+}
diff --git a/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1103.ebuild b/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1103.ebuild
deleted file mode 100644
index 127907c..0000000
--- a/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1103.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "cee80cd0060ac7dec37ae39f39dc0206ebf06aaf" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk touch_keyboard .gn"
-
-PLATFORM_SUBDIR="touch_keyboard"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Touch Keyboard"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_keyboard/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-pkg_preinst() {
-	# Set up the touch_keyboard user and group, which will be used to run
-	# touch_keyboard_handler instead of root.
-	enewuser touch_keyboard
-	enewgroup touch_keyboard
-}
-
-src_install() {
-	# Install the actual binary that handles the touch keyboard.
-	dobin "${OUT}/touch_keyboard_handler"
-
-	# Install a tool for testing the haptic feedback in the factory.
-	dobin "${OUT}/touchkb_haptic_test"
-
-	# Install an upstart script to start the handler at boot time.
-	insinto "/etc/init"
-	doins "touch_keyboard.conf"
-
-	# Install the correct seccomp policy for this architecture.
-	insinto "/opt/google/touch/policies"
-	doins seccomp/${ARCH}/*.policy
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}"/eventkey_test
-	platform_test "run" "${OUT}"/slot_test
-	platform_test "run" "${OUT}"/statemachine_test
-	platform_test "run" "${OUT}"/evdevsource_test
-	platform_test "run" "${OUT}"/uinputdevice_test
-}
diff --git a/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1125.ebuild b/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1125.ebuild
new file mode 100644
index 0000000..820e355
--- /dev/null
+++ b/chromeos-base/touch_keyboard/touch_keyboard-0.0.1-r1125.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk touch_keyboard .gn"
+
+PLATFORM_SUBDIR="touch_keyboard"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Touch Keyboard"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_keyboard/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+pkg_preinst() {
+	# Set up the touch_keyboard user and group, which will be used to run
+	# touch_keyboard_handler instead of root.
+	enewuser touch_keyboard
+	enewgroup touch_keyboard
+}
+
+src_install() {
+	# Install the actual binary that handles the touch keyboard.
+	dobin "${OUT}/touch_keyboard_handler"
+
+	# Install a tool for testing the haptic feedback in the factory.
+	dobin "${OUT}/touchkb_haptic_test"
+
+	# Install an upstart script to start the handler at boot time.
+	insinto "/etc/init"
+	doins "touch_keyboard.conf"
+
+	# Install the correct seccomp policy for this architecture.
+	insinto "/opt/google/touch/policies"
+	doins seccomp/${ARCH}/*.policy
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}"/eventkey_test
+	platform_test "run" "${OUT}"/slot_test
+	platform_test "run" "${OUT}"/statemachine_test
+	platform_test "run" "${OUT}"/evdevsource_test
+	platform_test "run" "${OUT}"/uinputdevice_test
+}
diff --git a/chromeos-base/touch_updater/touch_updater-0.0.1-r185.ebuild b/chromeos-base/touch_updater/touch_updater-0.0.1-r185.ebuild
deleted file mode 100644
index d4d1db6..0000000
--- a/chromeos-base/touch_updater/touch_updater-0.0.1-r185.ebuild
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7ea972d20b95f875332c57d702342be5692d3954"
-CROS_WORKON_TREE=("9412f6490b0cc7b58bf14d34989090508b0c4252" "734aeea3130db597bd01c5b72f06a46d82c09771")
-CROS_WORKON_PROJECT="chromiumos/platform/touch_updater"
-CROS_WORKON_SUBTREE="policies scripts"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-workon user
-
-DESCRIPTION="Touch firmware and config updater"
-HOMEPAGE="https://www.chromium.org/chromium-os"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="
-	input_devices_synaptics
-	input_devices_wacom
-	input_devices_etphidiap
-	input_devices_st
-	input_devices_st_touchscreen
-	input_devices_weida
-	input_devices_goodix
-	input_devices_sis
-	input_devices_pixart
-	input_devices_g2touch
-	input_devices_cirque
-	input_devices_elan_i2chid
-	input_devices_melfas
-	input_devices_emright
-"
-
-# Third party firmware updaters usually belong in sys-apps/.  If you just
-# checked in a new one to chromeos-base/, please move it to sys-apps/ before
-# adding it as a dependency here.
-RDEPEND="
-	chromeos-base/chromeos-touch-common
-	input_devices_synaptics? ( chromeos-base/rmi4utils )
-	input_devices_wacom? ( chromeos-base/wacom_fw_flash )
-	input_devices_etphidiap? ( chromeos-base/chromeos-touch-etphidiap )
-	input_devices_st? ( chromeos-base/st_flash )
-	input_devices_st_touchscreen? ( chromeos-base/chromeos-touch-stupdate )
-	input_devices_weida? ( chromeos-base/weida_wdt_util )
-	input_devices_goodix? ( chromeos-base/gdix_hid_firmware_update )
-	input_devices_sis? ( chromeos-base/sisConsoletool )
-	input_devices_pixart? ( chromeos-base/pixart_tpfwup )
-	input_devices_g2touch? ( chromeos-base/g2update_tool )
-	input_devices_cirque? ( chromeos-base/cirque_fw_update )
-	input_devices_elan_i2chid? ( chromeos-base/elan_i2chid_tools )
-	input_devices_melfas? ( chromeos-base/mfs-console-tool )
-	input_devices_emright? ( chromeos-base/emright_fw_updater )
-"
-
-pkg_preinst() {
-	if use input_devices_elan_i2chid || use input_devices_melfas || use input_devices_emright; then
-		enewgroup fwupdate-hidraw
-		enewuser fwupdate-hidraw
-	fi
-	if use input_devices_sis; then
-		enewgroup sisfwupdate
-		enewuser sisfwupdate
-	fi
-	if use input_devices_pixart; then
-		enewgroup pixfwupdate
-		enewuser pixfwupdate
-	fi
-	if use input_devices_g2touch; then
-		enewgroup g2touch
-		enewuser g2touch
-	fi
-	if use input_devices_goodix; then
-		enewgroup goodixfwupdate
-		enewuser goodixfwupdate
-	fi
-	if use input_devices_cirque; then
-		enewgroup cirque
-		enewuser cirque
-	fi
-}
-
-src_install() {
-	exeinto "/opt/google/touch/scripts"
-	doexe scripts/*.sh
-
-	if [ -d "policies/${ARCH}" ]; then
-		insinto "/opt/google/touch/policies"
-		doins policies/${ARCH}/*.policy
-	fi
-}
diff --git a/chromeos-base/touch_updater/touch_updater-0.0.1-r189.ebuild b/chromeos-base/touch_updater/touch_updater-0.0.1-r189.ebuild
new file mode 100644
index 0000000..3c874a1
--- /dev/null
+++ b/chromeos-base/touch_updater/touch_updater-0.0.1-r189.ebuild
@@ -0,0 +1,93 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="cf983016a06ce987f78445d5fbbfe09cb1d988f6"
+CROS_WORKON_TREE=("9412f6490b0cc7b58bf14d34989090508b0c4252" "8ee6c587eca8fad957dcf50ac6b70c50d9037c61")
+CROS_WORKON_PROJECT="chromiumos/platform/touch_updater"
+CROS_WORKON_SUBTREE="policies scripts"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-workon user
+
+DESCRIPTION="Touch firmware and config updater"
+HOMEPAGE="https://www.chromium.org/chromium-os"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="
+	input_devices_synaptics
+	input_devices_wacom
+	input_devices_etphidiap
+	input_devices_st
+	input_devices_st_touchscreen
+	input_devices_weida
+	input_devices_goodix
+	input_devices_sis
+	input_devices_pixart
+	input_devices_g2touch
+	input_devices_cirque
+	input_devices_elan_i2chid
+	input_devices_melfas
+	input_devices_emright
+"
+
+# Third party firmware updaters usually belong in sys-apps/.  If you just
+# checked in a new one to chromeos-base/, please move it to sys-apps/ before
+# adding it as a dependency here.
+RDEPEND="
+	chromeos-base/chromeos-touch-common
+	input_devices_synaptics? ( chromeos-base/rmi4utils )
+	input_devices_wacom? ( chromeos-base/wacom_fw_flash )
+	input_devices_etphidiap? ( chromeos-base/chromeos-touch-etphidiap )
+	input_devices_st? ( chromeos-base/st_flash )
+	input_devices_st_touchscreen? ( chromeos-base/chromeos-touch-stupdate )
+	input_devices_weida? ( chromeos-base/weida_wdt_util )
+	input_devices_goodix? ( chromeos-base/gdix_hid_firmware_update )
+	input_devices_sis? ( chromeos-base/sisConsoletool )
+	input_devices_pixart? ( chromeos-base/pixart_tpfwup )
+	input_devices_g2touch? ( chromeos-base/g2update_tool )
+	input_devices_cirque? ( chromeos-base/cirque_fw_update )
+	input_devices_elan_i2chid? ( chromeos-base/elan_i2chid_tools )
+	input_devices_melfas? ( chromeos-base/mfs-console-tool )
+	input_devices_emright? ( chromeos-base/emright_fw_updater )
+"
+
+pkg_preinst() {
+	if use input_devices_elan_i2chid || use input_devices_melfas || use input_devices_emright; then
+		enewgroup fwupdate-hidraw
+		enewuser fwupdate-hidraw
+	fi
+	if use input_devices_sis; then
+		enewgroup sisfwupdate
+		enewuser sisfwupdate
+	fi
+	if use input_devices_pixart; then
+		enewgroup pixfwupdate
+		enewuser pixfwupdate
+	fi
+	if use input_devices_g2touch; then
+		enewgroup g2touch
+		enewuser g2touch
+	fi
+	if use input_devices_goodix; then
+		enewgroup goodixfwupdate
+		enewuser goodixfwupdate
+	fi
+	if use input_devices_cirque; then
+		enewgroup cirque
+		enewuser cirque
+	fi
+}
+
+src_install() {
+	exeinto "/opt/google/touch/scripts"
+	doexe scripts/*.sh
+
+	if [ -d "policies/${ARCH}" ]; then
+		insinto "/opt/google/touch/policies"
+		doins policies/${ARCH}/*.policy
+	fi
+}
diff --git a/chromeos-base/tpm-check/tpm-check-0.0.1-r1823.ebuild b/chromeos-base/tpm-check/tpm-check-0.0.1-r1823.ebuild
deleted file mode 100644
index cfc6da6..0000000
--- a/chromeos-base/tpm-check/tpm-check-0.0.1-r1823.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54"
-CROS_WORKON_TREE="82e77f6c98187361303fffeeba118a1a365e16d5"
-CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
-
-inherit cros-workon autotest
-
-DESCRIPTION="tpm check test"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-IUSE_TESTS="
-	+tests_hardware_TPMCheck
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME=platform/vboot_reference
-
-# path from root of repo
-AUTOTEST_CLIENT_SITE_TESTS=autotest/client
diff --git a/chromeos-base/tpm-check/tpm-check-0.0.1-r1872.ebuild b/chromeos-base/tpm-check/tpm-check-0.0.1-r1872.ebuild
new file mode 100644
index 0000000..9c517cc
--- /dev/null
+++ b/chromeos-base/tpm-check/tpm-check-0.0.1-r1872.ebuild
@@ -0,0 +1,29 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="524012c64c07f8673998428cca7f80e01a387f48"
+CROS_WORKON_TREE="d011d454951af2d6dbcf7d4dc7af53a31cc883db"
+CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
+
+inherit cros-workon autotest
+
+DESCRIPTION="tpm check test"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+IUSE_TESTS="
+	+tests_hardware_TPMCheck
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME=platform/vboot_reference
+
+# path from root of repo
+AUTOTEST_CLIENT_SITE_TESTS=autotest/client
diff --git a/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1843.ebuild b/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1843.ebuild
deleted file mode 100644
index 4458ea9..0000000
--- a/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1843.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54"
-CROS_WORKON_TREE="82e77f6c98187361303fffeeba118a1a365e16d5"
-CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
-
-inherit cros-workon autotest
-
-DESCRIPTION="TPM firmware tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
-SRC_URI=""
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-DEPEND="
-	app-crypt/trousers:=
-	chromeos-base/tpm:=
-"
-
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-IUSE_TESTS="
-	+tests_hardware_TPMFirmware
-	+tests_hardware_TPMFirmwareServer
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME=vboot_reference
-
-# path from root of repo
-AUTOTEST_CLIENT_SITE_TESTS=autotest/client
-AUTOTEST_SERVER_SITE_TESTS=autotest/server
-
-function src_compile {
-	# for Makefile
-	export VBOOT_DIR=${WORKDIR}/${P}
-	export MINIMAL=1  # Makefile requires this for cross-compiling
-	autotest_src_compile
-}
-
-
diff --git a/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1892.ebuild b/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1892.ebuild
new file mode 100644
index 0000000..c1a1e4f
--- /dev/null
+++ b/chromeos-base/tpm-firmware-tests/tpm-firmware-tests-0.0.1-r1892.ebuild
@@ -0,0 +1,45 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="524012c64c07f8673998428cca7f80e01a387f48"
+CROS_WORKON_TREE="d011d454951af2d6dbcf7d4dc7af53a31cc883db"
+CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
+
+inherit cros-workon autotest
+
+DESCRIPTION="TPM firmware tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
+SRC_URI=""
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+DEPEND="
+	app-crypt/trousers:=
+	chromeos-base/tpm:=
+"
+
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+IUSE_TESTS="
+	+tests_hardware_TPMFirmware
+	+tests_hardware_TPMFirmwareServer
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME=vboot_reference
+
+# path from root of repo
+AUTOTEST_CLIENT_SITE_TESTS=autotest/client
+AUTOTEST_SERVER_SITE_TESTS=autotest/server
+
+function src_compile {
+	# for Makefile
+	export VBOOT_DIR=${WORKDIR}/${P}
+	export MINIMAL=1  # Makefile requires this for cross-compiling
+	autotest_src_compile
+}
+
+
diff --git a/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1737.ebuild b/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1737.ebuild
deleted file mode 100644
index 391fa73..0000000
--- a/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1737.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f65df9ea12cf8d07e49d6bc7a84c89ff50a077b8" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk tpm2-simulator .gn"
-
-PLATFORM_SUBDIR="tpm2-simulator"
-
-inherit cros-workon platform user
-
-DESCRIPTION="TPM 2.0 Simulator"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm2-simulator/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	dev-libs/openssl:0=
-	"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="
-	chromeos-base/tpm2:=
-	${COMMON_DEPEND}
-	"
-
-src_install() {
-	dobin "${OUT}"/tpm2-simulator
-}
diff --git a/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1758.ebuild b/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1758.ebuild
new file mode 100644
index 0000000..15b2536
--- /dev/null
+++ b/chromeos-base/tpm2-simulator/tpm2-simulator-0.0.1-r1758.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "122dcf94739d2143609ba6ddc05a199e3fc3a713" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk tpm2-simulator .gn"
+
+PLATFORM_SUBDIR="tpm2-simulator"
+
+inherit cros-workon platform user
+
+DESCRIPTION="TPM 2.0 Simulator"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm2-simulator/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+COMMON_DEPEND="
+	dev-libs/openssl:0=
+	"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="
+	chromeos-base/tpm2:=
+	${COMMON_DEPEND}
+	"
+
+src_install() {
+	dobin "${OUT}"/tpm2-simulator
+}
diff --git a/chromeos-base/tpm2/tpm2-0.0.1-r125.ebuild b/chromeos-base/tpm2/tpm2-0.0.1-r125.ebuild
deleted file mode 100644
index 2830f9a..0000000
--- a/chromeos-base/tpm2/tpm2-0.0.1-r125.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="872d8d0beabd9a81c08fc34ec83285c690228aa8"
-CROS_WORKON_TREE="f70af34770002df8ef3951dfdf5a6c18d42a5dda"
-CROS_WORKON_PROJECT="chromiumos/third_party/tpm2"
-CROS_WORKON_LOCALNAME="third_party/tpm2"
-
-inherit cros-workon toolchain-funcs
-
-DESCRIPTION="TPM2.0 library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/tpm2/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="dev-libs/openssl:0="
-
-src_compile() {
-	tc-export CC AR RANLIB
-	emake
-}
-
-src_install() {
-	dolib.a build/libtpm2.a
-
-	"${S}"/thirdparty_preinstall.sh "${PV}" "$(cros-workon_get_build_dir)"
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "$(cros-workon_get_build_dir)/libtpm2.pc"
-
-	insinto /usr/include/tpm2
-	doins BaseTypes.h
-	doins Capabilities.h
-	doins ExecCommand_fp.h
-	doins GetCommandCodeString_fp.h
-	doins Implementation.h
-	doins Manufacture_fp.h
-	doins Platform.h
-	doins TPMB.h
-	doins TPM_Types.h
-	doins Tpm.h
-	doins TpmBuildSwitches.h
-	doins TpmError.h
-	doins _TPM_Init_fp.h
-	doins bool.h
-	doins swap.h
-	doins tpm_generated.h
-	doins tpm_types.h
-}
diff --git a/chromeos-base/tpm2/tpm2-0.0.1-r129.ebuild b/chromeos-base/tpm2/tpm2-0.0.1-r129.ebuild
new file mode 100644
index 0000000..91c5422
--- /dev/null
+++ b/chromeos-base/tpm2/tpm2-0.0.1-r129.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="0217366d293dc71f7873d0a879384c0336ebdd7b"
+CROS_WORKON_TREE="8e2ebe98fade4195aac74d52d0647b116b0165c5"
+CROS_WORKON_PROJECT="chromiumos/third_party/tpm2"
+CROS_WORKON_LOCALNAME="third_party/tpm2"
+
+inherit cros-workon toolchain-funcs
+
+DESCRIPTION="TPM2.0 library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/tpm2/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="tpm2_simulator tpm2_simulator_manufacturer"
+
+DEPEND="dev-libs/openssl:0="
+
+src_compile() {
+	if use tpm2_simulator_manufacturer ; then
+		export TPM2_SIMULATOR_MANUFACTURER=1
+	fi
+	tc-export CC AR RANLIB
+	emake
+}
+
+src_install() {
+	dolib.a build/libtpm2.a
+
+	"${S}"/thirdparty_preinstall.sh "${PV}" "$(cros-workon_get_build_dir)"
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "$(cros-workon_get_build_dir)/libtpm2.pc"
+
+	insinto /usr/include/tpm2
+	doins BaseTypes.h
+	doins Capabilities.h
+	doins ExecCommand_fp.h
+	doins GetCommandCodeString_fp.h
+	doins Implementation.h
+	doins Manufacture_fp.h
+	doins Platform.h
+	doins TPMB.h
+	doins TPM_Types.h
+	doins Tpm.h
+	doins TpmBuildSwitches.h
+	doins TpmError.h
+	doins _TPM_Init_fp.h
+	doins bool.h
+	doins swap.h
+	doins tpm_generated.h
+	doins tpm_types.h
+	if use tpm2_simulator; then
+		doins tpm_manufacture.h
+	fi
+}
diff --git a/chromeos-base/tpm2/tpm2-9999.ebuild b/chromeos-base/tpm2/tpm2-9999.ebuild
index a643a56..20078d21 100644
--- a/chromeos-base/tpm2/tpm2-9999.ebuild
+++ b/chromeos-base/tpm2/tpm2-9999.ebuild
@@ -12,10 +12,14 @@
 
 LICENSE="BSD-Google"
 KEYWORDS="~*"
+IUSE="tpm2_simulator tpm2_simulator_manufacturer"
 
 DEPEND="dev-libs/openssl:0="
 
 src_compile() {
+	if use tpm2_simulator_manufacturer ; then
+		export TPM2_SIMULATOR_MANUFACTURER=1
+	fi
 	tc-export CC AR RANLIB
 	emake
 }
@@ -45,4 +49,7 @@
 	doins swap.h
 	doins tpm_generated.h
 	doins tpm_types.h
+	if use tpm2_simulator; then
+		doins tpm_manufacture.h
+	fi
 }
diff --git a/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r140.ebuild b/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r140.ebuild
deleted file mode 100644
index d284978..0000000
--- a/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r140.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "dae00c69637e0e94b3ccfca22c7ecb62d4f63675" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk tpm_manager .gn"
-
-PLATFORM_SUBDIR="tpm_manager/client"
-
-inherit cros-workon platform
-
-DESCRIPTION="TPM Manager D-Bus client library for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/client/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host"
-
-# D-Bus proxies generated by this client library depend on the code generator
-# itself (chromeos-dbus-bindings) and produce header files that rely on
-# libbrillo library, hence both dependencies. We require the particular
-# revision because libbrillo-0.0.1-r1 changed location of header files from
-# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
-# code using the new location.
-DEPEND="
-	cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 )
-	chromeos-base/libbrillo:=
-"
-
-# Note that for RDEPEND, we conflict with tpm_manager package older than
-# 0.0.1 because this client is incompatible with daemon older than version
-# 0.0.1. We didn't RDEPEND on tpm_manager version 0.0.1 or greater because
-# we don't want to create circular dependency in case the package tpm_manager
-# depends on some package foo that also depend on this package.
-RDEPEND="
-	!<chromeos-base/tpm_manager-0.0.1
-	chromeos-base/libbrillo:=
-"
-
-src_install() {
-	# Install D-Bus client library.
-	platform_install_dbus_client_lib "tpm_manager"
-}
diff --git a/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r168.ebuild b/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r168.ebuild
new file mode 100644
index 0000000..2f0f300
--- /dev/null
+++ b/chromeos-base/tpm_manager-client/tpm_manager-client-0.0.1-r168.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk tpm_manager .gn"
+
+PLATFORM_SUBDIR="tpm_manager/client"
+
+inherit cros-workon platform
+
+DESCRIPTION="TPM Manager D-Bus client library for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/client/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host"
+
+# D-Bus proxies generated by this client library depend on the code generator
+# itself (chromeos-dbus-bindings) and produce header files that rely on
+# libbrillo library, hence both dependencies. We require the particular
+# revision because libbrillo-0.0.1-r1 changed location of header files from
+# chromeos/ to brillo/ and chromeos-dbus-bindings-0.0.1-r1058 generates the
+# code using the new location.
+DEPEND="
+	cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 )
+	chromeos-base/libbrillo:=
+"
+
+# Note that for RDEPEND, we conflict with tpm_manager package older than
+# 0.0.1 because this client is incompatible with daemon older than version
+# 0.0.1. We didn't RDEPEND on tpm_manager version 0.0.1 or greater because
+# we don't want to create circular dependency in case the package tpm_manager
+# depends on some package foo that also depend on this package.
+RDEPEND="
+	!<chromeos-base/tpm_manager-0.0.1
+	chromeos-base/libbrillo:=
+"
+
+src_install() {
+	# Install D-Bus client library.
+	platform_install_dbus_client_lib "tpm_manager"
+}
diff --git a/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2023.ebuild b/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2023.ebuild
deleted file mode 100644
index ac217d6..0000000
--- a/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2023.ebuild
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="082227e6b44404efcfd4d973480be711d175473c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1bf01f1a340a50edee0e82b52621117c8388644c" "c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4" "7e189936f29d145c4191ea147e48256c92fac75d" "dae00c69637e0e94b3ccfca22c7ecb62d4f63675" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk libhwsec libtpmcrypto metrics tpm_manager trunks .gn"
-
-PLATFORM_SUBDIR="tpm_manager"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Daemon to manage TPM ownership."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/"
-
-LICENSE="Apache-2.0"
-SLOT="0"
-KEYWORDS="*"
-IUSE="distributed_cryptohome test tpm tpm2"
-
-REQUIRED_USE="tpm2? ( !tpm )"
-
-RDEPEND="
-	!tpm2? ( app-crypt/trousers )
-	tpm2? (
-		chromeos-base/trunks
-	)
-	chromeos-base/metrics
-	chromeos-base/minijail
-	chromeos-base/libhwsec
-	chromeos-base/libtpmcrypto
-	"
-
-DEPEND="${RDEPEND}
-	tpm2? ( chromeos-base/trunks[test?] )
-	"
-
-pkg_preinst() {
-	enewuser tpm_manager
-	enewgroup tpm_manager
-}
-
-src_install() {
-	# Install D-Bus configuration file.
-	insinto /etc/dbus-1/system.d
-	doins server/org.chromium.TpmManager.conf
-
-	# Install upstart config file.
-	insinto /etc/init
-	doins server/tpm_managerd.conf
-	if use tpm2; then
-		sed -i 's/started tcsd/started trunksd/' \
-			"${D}/etc/init/tpm_managerd.conf" ||
-			die "Can't replace tcsd with trunksd in tpm_managerd.conf"
-	fi
-
-	# Install the executables provided by TpmManager
-	dosbin "${OUT}"/tpm_managerd
-	dosbin "${OUT}"/local_data_migration
-	dobin "${OUT}"/tpm_manager_client
-
-	# Install seccomp policy files.
-	insinto /usr/share/policy
-	newins server/tpm_managerd-seccomp-${ARCH}.policy tpm_managerd-seccomp.policy
-
-	dolib.so "${OUT}"/lib/libtpm_manager.so
-	dolib.a "${OUT}"/libtpm_manager_test.a
-
-
-	# Install header files.
-	insinto /usr/include/tpm_manager/client
-	doins client/*.h
-	insinto /usr/include/tpm_manager/common
-	doins common/*.h
-}
-
-platform_pkg_test() {
-	local tests=(
-		tpm_manager_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2076.ebuild b/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2076.ebuild
new file mode 100644
index 0000000..e2f03f36
--- /dev/null
+++ b/chromeos-base/tpm_manager/tpm_manager-0.0.1-r2076.ebuild
@@ -0,0 +1,92 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "59ded4c8a6ec924cce82ba942070e51132ca1161" "d8479ac4f3bc0cc18815ff1d440dc3abd761db42" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk libhwsec libtpmcrypto metrics tpm_manager trunks .gn"
+
+PLATFORM_SUBDIR="tpm_manager"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Daemon to manage TPM ownership."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE="test tpm tpm2"
+
+REQUIRED_USE="tpm2? ( !tpm )"
+
+RDEPEND="
+	!tpm2? ( app-crypt/trousers )
+	tpm2? (
+		chromeos-base/trunks
+	)
+	>=chromeos-base/metrics-0.0.1-r3152
+	chromeos-base/minijail
+	chromeos-base/libhwsec
+	chromeos-base/libtpmcrypto
+	"
+
+DEPEND="${RDEPEND}
+	tpm2? ( chromeos-base/trunks[test?] )
+	"
+
+pkg_preinst() {
+	enewuser tpm_manager
+	enewgroup tpm_manager
+}
+
+src_install() {
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins server/org.chromium.TpmManager.conf
+
+	# Install upstart config file.
+	insinto /etc/init
+	doins server/tpm_managerd.conf
+	if use tpm2; then
+		sed -i 's/started tcsd/started trunksd/' \
+			"${D}/etc/init/tpm_managerd.conf" ||
+			die "Can't replace tcsd with trunksd in tpm_managerd.conf"
+	fi
+
+	# Install the executables provided by TpmManager
+	dosbin "${OUT}"/tpm_managerd
+	dosbin "${OUT}"/local_data_migration
+	dobin "${OUT}"/tpm_manager_client
+
+	# Install seccomp policy files.
+	insinto /usr/share/policy
+	newins server/tpm_managerd-seccomp-${ARCH}.policy tpm_managerd-seccomp.policy
+
+	dolib.so "${OUT}"/lib/libtpm_manager.so
+	dolib.a "${OUT}"/libtpm_manager_test.a
+
+
+	# Install header files.
+	insinto /usr/include/tpm_manager/client
+	doins client/*.h
+	insinto /usr/include/tpm_manager/common
+	doins common/*.h
+}
+
+platform_pkg_test() {
+	local tests=(
+		tpm_manager_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/tpm_manager/tpm_manager-9999.ebuild b/chromeos-base/tpm_manager/tpm_manager-9999.ebuild
index 46f1cbd..e417cd3 100644
--- a/chromeos-base/tpm_manager/tpm_manager-9999.ebuild
+++ b/chromeos-base/tpm_manager/tpm_manager-9999.ebuild
@@ -20,7 +20,7 @@
 LICENSE="Apache-2.0"
 SLOT="0"
 KEYWORDS="~*"
-IUSE="distributed_cryptohome test tpm tpm2"
+IUSE="test tpm tpm2"
 
 REQUIRED_USE="tpm2? ( !tpm )"
 
@@ -29,7 +29,7 @@
 	tpm2? (
 		chromeos-base/trunks
 	)
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	chromeos-base/minijail
 	chromeos-base/libhwsec
 	chromeos-base/libtpmcrypto
diff --git a/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r125.ebuild b/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r125.ebuild
deleted file mode 100644
index 4729f81..0000000
--- a/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r125.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="082227e6b44404efcfd4d973480be711d175473c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "00290142c5b4f52d8b56f0ad856b3870dcf17fef" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk tpm_softclear_utils trunks .gn"
-
-PLATFORM_SUBDIR="tpm_softclear_utils"
-
-inherit cros-workon platform
-
-DESCRIPTION="Utilities for soft-clearing TPM. This package resides in test images only."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_softclear_utils/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test tpm tpm2"
-REQUIRED_USE="tpm2? ( !tpm )"
-
-RDEPEND="
-	tpm2? (
-		chromeos-base/trunks:=
-	)
-	!tpm2? (
-		app-crypt/trousers:=
-	)
-"
-
-DEPEND="${RDEPEND}
-	tpm2? (
-		chromeos-base/system_api:=
-		chromeos-base/trunks:=[test?]
-	)
-"
-
-src_install() {
-	# Installs the utilities executable.
-	insinto /usr/local/bin
-	doins "${OUT}/tpm_softclear"
-	chmod u+x "${D}/usr/local/bin/tpm_softclear"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/tpm_softclear_utils_testrunner"
-}
diff --git a/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r155.ebuild b/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r155.ebuild
new file mode 100644
index 0000000..3a2e16c
--- /dev/null
+++ b/chromeos-base/tpm_softclear_utils/tpm_softclear_utils-0.0.1-r155.ebuild
@@ -0,0 +1,52 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "19d0eae21d9d6d9902ab4b843257f1a54986088c" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk tpm_softclear_utils trunks .gn"
+
+PLATFORM_SUBDIR="tpm_softclear_utils"
+
+inherit cros-workon platform
+
+DESCRIPTION="Utilities for soft-clearing TPM. This package resides in test images only."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_softclear_utils/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test tpm tpm2"
+REQUIRED_USE="tpm2? ( !tpm )"
+
+RDEPEND="
+	tpm2? (
+		chromeos-base/trunks:=
+	)
+	!tpm2? (
+		app-crypt/trousers:=
+	)
+"
+
+DEPEND="${RDEPEND}
+	tpm2? (
+		chromeos-base/system_api:=
+		chromeos-base/trunks:=[test?]
+	)
+"
+
+src_install() {
+	# Installs the utilities executable.
+	insinto /usr/local/bin
+	doins "${OUT}/tpm_softclear"
+	chmod u+x "${D}/usr/local/bin/tpm_softclear"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/tpm_softclear_utils_testrunner"
+}
diff --git a/chromeos-base/tremplin/tremplin-0.0.1-r109.ebuild b/chromeos-base/tremplin/tremplin-0.0.1-r109.ebuild
deleted file mode 100644
index 2dc4a28..0000000
--- a/chromeos-base/tremplin/tremplin-0.0.1-r109.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="5c47da70a941316f5da870ffa049cf4d2e418175"
-CROS_WORKON_TREE="33b4ba2e11b02d9ac7dde37a416528aa957af46b"
-CROS_WORKON_PROJECT="chromiumos/platform/tremplin"
-CROS_WORKON_LOCALNAME="platform/tremplin"
-CROS_GO_BINARIES="chromiumos/tremplin"
-
-CROS_GO_TEST=(
-	"chromiumos/tremplin/..."
-)
-CROS_GO_VET=(
-	"${CROS_GO_TEST[@]}"
-)
-
-inherit cros-workon cros-go
-
-DESCRIPTION="Tremplin LXD client with gRPC support"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tremplin/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-COMMON_DEPEND="
-	app-emulation/lxd:=
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/vm_guest_tools:=
-	chromeos-base/vm_protos:=
-	dev-go/go-libaudit:=
-	dev-go/go-sys:=
-	dev-go/grpc:=
-	dev-go/kobject:=
-	dev-go/netlink:=
-	dev-go/vsock:=
-	dev-go/yaml:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
diff --git a/chromeos-base/tremplin/tremplin-0.0.1-r120.ebuild b/chromeos-base/tremplin/tremplin-0.0.1-r120.ebuild
new file mode 100644
index 0000000..0aec0d1
--- /dev/null
+++ b/chromeos-base/tremplin/tremplin-0.0.1-r120.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="2a72eef8dbefbf97e19c54658aa4cc3f1647a06a"
+CROS_WORKON_TREE="4a645c42ca3cfa90ceaa768402ec0fbf6cf43658"
+CROS_WORKON_PROJECT="chromiumos/platform/tremplin"
+CROS_WORKON_LOCALNAME="platform/tremplin"
+CROS_GO_BINARIES="chromiumos/tremplin"
+
+CROS_GO_TEST=(
+	"chromiumos/tremplin/..."
+)
+CROS_GO_VET=(
+	"${CROS_GO_TEST[@]}"
+)
+
+inherit cros-workon cros-go
+
+DESCRIPTION="Tremplin LXD client with gRPC support"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/tremplin/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+COMMON_DEPEND="
+	app-emulation/lxd:=
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/vm_guest_tools:=
+	chromeos-base/vm_protos:=
+	dev-go/go-libaudit:=
+	dev-go/go-sys:=
+	dev-go/grpc:=
+	dev-go/kobject:=
+	dev-go/netlink:=
+	dev-go/vsock:=
+	dev-go/yaml:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
diff --git a/chromeos-base/trunks/trunks-0.0.1-r2811.ebuild b/chromeos-base/trunks/trunks-0.0.1-r2811.ebuild
deleted file mode 100644
index ed55c6b..0000000
--- a/chromeos-base/trunks/trunks-0.0.1-r2811.ebuild
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="082227e6b44404efcfd4d973480be711d175473c"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1bf01f1a340a50edee0e82b52621117c8388644c" "9fd99bf51279bfd5841cde5997f0379182410b03" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk libhwsec trunks .gn"
-
-PLATFORM_SUBDIR="trunks"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Trunks service for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trunks/"
-
-LICENSE="Apache-2.0"
-KEYWORDS="*"
-IUSE="cr50_onboard fuzzer ftdi_tpm test tpm2_simulator"
-
-# This depends on protobuf because it uses protoc and needs to be rebuilt
-# whenever the protobuf library is updated since generated source files may be
-# incompatible across different versions of the protobuf library.
-COMMON_DEPEND="
-	chromeos-base/minijail:=
-	chromeos-base/power_manager-client:=
-	ftdi_tpm? ( dev-embedded/libftdi:= )
-	tpm2_simulator? ( chromeos-base/tpm2:= )
-	dev-libs/protobuf:=
-	fuzzer? (
-		dev-cpp/gtest:=
-	)
-	"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	cr50_onboard? ( chromeos-base/chromeos-cr50 )
-	!app-crypt/tpm-tools
-	chromeos-base/libhwsec
-	"
-
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/chromeos-ec-headers:=
-	"
-
-src_install() {
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.Trunks.conf
-
-	insinto /etc/init
-	if use tpm2_simulator; then
-		newins trunksd.conf.tpm2_simulator trunksd.conf
-	elif use cr50_onboard; then
-		newins trunksd.conf.cr50 trunksd.conf
-	else
-		doins trunksd.conf
-	fi
-
-	dosbin "${OUT}"/pinweaver_client
-	dosbin "${OUT}"/trunks_client
-	dosbin "${OUT}"/trunks_send
-	dosbin tpm_version
-	dosbin "${OUT}"/trunksd
-	dolib.so "${OUT}"/lib/libtrunks.so
-	# trunks_test library implements trunks mocks which
-	# are used by unittest and fuzzer.
-	if use test || use fuzzer; then
-		dolib.a "${OUT}"/libtrunks_test.a
-	fi
-
-	insinto /usr/share/policy
-	newins trunksd-seccomp-${ARCH}.policy trunksd-seccomp.policy
-
-	insinto /usr/include/trunks
-	doins *.h
-	doins "${OUT}"/gen/include/trunks/*.h
-
-	insinto /usr/include/proto
-	doins "${S}"/pinweaver.proto
-
-	insinto /usr/include/chromeos/dbus/trunks
-	doins "${S}"/interface.proto
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins "${OUT}"/obj/trunks/libtrunks.pc
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_creation_blob_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/trunks_hmac_authorization_delegate_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_key_blob_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS \
-		"${OUT}"/trunks_password_authorization_delegate_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_resource_manager_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_tpm_pinweaver_fuzzer
-}
-
-platform_pkg_test() {
-	"${S}/generator/generator_test.py" || die
-
-	local tests=(
-		trunks_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
-pkg_preinst() {
-	enewuser trunks
-	enewgroup trunks
-}
diff --git a/chromeos-base/trunks/trunks-0.0.1-r2843.ebuild b/chromeos-base/trunks/trunks-0.0.1-r2843.ebuild
new file mode 100644
index 0000000..a4e493a
--- /dev/null
+++ b/chromeos-base/trunks/trunks-0.0.1-r2843.ebuild
@@ -0,0 +1,117 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "59ded4c8a6ec924cce82ba942070e51132ca1161" "e8a973464784e588992988988eb26cfa0cf5f67b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk libhwsec trunks .gn"
+
+PLATFORM_SUBDIR="trunks"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Trunks service for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trunks/"
+
+LICENSE="Apache-2.0"
+KEYWORDS="*"
+IUSE="cr50_onboard fuzzer ftdi_tpm test tpm2_simulator"
+
+# This depends on protobuf because it uses protoc and needs to be rebuilt
+# whenever the protobuf library is updated since generated source files may be
+# incompatible across different versions of the protobuf library.
+COMMON_DEPEND="
+	chromeos-base/minijail:=
+	chromeos-base/power_manager-client:=
+	ftdi_tpm? ( dev-embedded/libftdi:= )
+	tpm2_simulator? ( chromeos-base/tpm2:= )
+	dev-libs/protobuf:=
+	fuzzer? (
+		dev-cpp/gtest:=
+	)
+	"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	cr50_onboard? ( chromeos-base/chromeos-cr50 )
+	!app-crypt/tpm-tools
+	chromeos-base/libhwsec
+	"
+
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/chromeos-ec-headers:=
+	"
+
+src_install() {
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.Trunks.conf
+
+	insinto /etc/init
+	if use tpm2_simulator; then
+		newins trunksd.conf.tpm2_simulator trunksd.conf
+	elif use cr50_onboard; then
+		newins trunksd.conf.cr50 trunksd.conf
+	else
+		doins trunksd.conf
+	fi
+
+	dosbin "${OUT}"/pinweaver_client
+	dosbin "${OUT}"/trunks_client
+	dosbin "${OUT}"/trunks_send
+	dosbin tpm_version
+	dosbin "${OUT}"/trunksd
+	dolib.so "${OUT}"/lib/libtrunks.so
+	# trunks_test library implements trunks mocks which
+	# are used by unittest and fuzzer.
+	if use test || use fuzzer; then
+		dolib.a "${OUT}"/libtrunks_test.a
+	fi
+
+	insinto /usr/share/policy
+	newins trunksd-seccomp-${ARCH}.policy trunksd-seccomp.policy
+
+	insinto /usr/include/trunks
+	doins *.h
+	doins "${OUT}"/gen/include/trunks/*.h
+
+	insinto /usr/include/proto
+	doins "${S}"/pinweaver.proto
+
+	insinto /usr/include/chromeos/dbus/trunks
+	doins "${S}"/interface.proto
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins "${OUT}"/obj/trunks/libtrunks.pc
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_creation_blob_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/trunks_hmac_authorization_delegate_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_key_blob_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS \
+		"${OUT}"/trunks_password_authorization_delegate_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_resource_manager_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/trunks_tpm_pinweaver_fuzzer
+}
+
+platform_pkg_test() {
+	"${S}/generator/generator_test.py" || die
+
+	local tests=(
+		trunks_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
+pkg_preinst() {
+	enewuser trunks
+	enewgroup trunks
+}
diff --git a/chromeos-base/typecd/typecd-0.0.1-r24.ebuild b/chromeos-base/typecd/typecd-0.0.1-r24.ebuild
deleted file mode 100644
index f1be5dc..0000000
--- a/chromeos-base/typecd/typecd-0.0.1-r24.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="05b5852bbf00f85e097be08bf5344d2f735171d7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "f3c3e81430aaee7361f2701b718ba3af9f201a7e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_SUBTREE="common-mk typecd .gn"
-
-PLATFORM_SUBDIR="typecd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="Chrome OS USB Type C daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/typecd/"
-
-LICENSE="BSD-Google"
-SLOT=0
-KEYWORDS="*"
-
-src_install() {
-	dobin "${OUT}"/typecd
-}
-
-pkg_preinst() {
-	enewuser typecd
-	enewgroup typecd
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/typecd_testrunner"
-}
diff --git a/chromeos-base/typecd/typecd-0.0.1-r57.ebuild b/chromeos-base/typecd/typecd-0.0.1-r57.ebuild
new file mode 100644
index 0000000..b4c56eb
--- /dev/null
+++ b/chromeos-base/typecd/typecd-0.0.1-r57.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "555469a5e41621f091ace429fc9819cc99bb1a37" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_SUBTREE="common-mk typecd .gn"
+
+PLATFORM_SUBDIR="typecd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="Chrome OS USB Type C daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/typecd/"
+
+LICENSE="BSD-Google"
+SLOT=0
+KEYWORDS="*"
+IUSE="+seccomp"
+
+src_install() {
+	dobin "${OUT}"/typecd
+
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/typecd-seccomp-${ARCH}.policy" typecd-seccomp.policy
+
+	# Install rsyslog config.
+	insinto /etc/rsyslog.d
+	doins rsyslog/rsyslog.typecd.conf
+}
+
+pkg_preinst() {
+	enewuser typecd
+	enewgroup typecd
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/typecd_testrunner"
+}
diff --git a/chromeos-base/typecd/typecd-9999.ebuild b/chromeos-base/typecd/typecd-9999.ebuild
index 4773362..05a66e1 100644
--- a/chromeos-base/typecd/typecd-9999.ebuild
+++ b/chromeos-base/typecd/typecd-9999.ebuild
@@ -19,9 +19,21 @@
 LICENSE="BSD-Google"
 SLOT=0
 KEYWORDS="~*"
+IUSE="+seccomp"
 
 src_install() {
 	dobin "${OUT}"/typecd
+
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	use seccomp && newins "seccomp/typecd-seccomp-${ARCH}.policy" typecd-seccomp.policy
+
+	# Install rsyslog config.
+	insinto /etc/rsyslog.d
+	doins rsyslog/rsyslog.typecd.conf
 }
 
 pkg_preinst() {
diff --git a/chromeos-base/u2fd/u2fd-0.0.1-r923.ebuild b/chromeos-base/u2fd/u2fd-0.0.1-r923.ebuild
deleted file mode 100644
index 840b528..0000000
--- a/chromeos-base/u2fd/u2fd-0.0.1-r923.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="44a9d4ca54a10cae2c8a35b4ba9fee89fb67d239"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "9fd99bf51279bfd5841cde5997f0379182410b03" "1bf01f1a340a50edee0e82b52621117c8388644c" "7e189936f29d145c4191ea147e48256c92fac75d" "614157b36aa6196f7a410a5164c92b44cdd4e1ae" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_USE_VCSID="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk trunks libhwsec metrics u2fd .gn"
-
-PLATFORM_SUBDIR="u2fd"
-
-inherit cros-workon platform user
-
-DESCRIPTION="U2FHID Emulation Daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fhid"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-COMMON_DEPEND="
-	chromeos-base/attestation:=
-	chromeos-base/attestation-client:=
-	chromeos-base/cbor:=
-	chromeos-base/libhwsec:=
-	chromeos-base/metrics:=
-	chromeos-base/power_manager-client:=
-	chromeos-base/trunks:=
-	dev-libs/hidapi:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/attestation-client:=
-	chromeos-base/system_api:=[fuzzer?]
-"
-
-pkg_setup() {
-	# Has to be done in pkg_setup() instead of pkg_preinst() since
-	# src_install() needs the u2f user and group.
-	enewuser "u2f"
-	enewgroup "u2f"
-	cros-workon_pkg_setup
-}
-
-src_install() {
-	dobin "${OUT}"/u2fd
-
-	insinto /etc/init
-	doins init/*.conf
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.U2F.conf
-
-	local daemon_store="/etc/daemon-store/u2f"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners u2f:u2f "${daemon_store}"
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/u2f_adpu_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/u2fd_test_runner"
-}
diff --git a/chromeos-base/u2fd/u2fd-0.0.1-r982.ebuild b/chromeos-base/u2fd/u2fd-0.0.1-r982.ebuild
new file mode 100644
index 0000000..0b18879
--- /dev/null
+++ b/chromeos-base/u2fd/u2fd-0.0.1-r982.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e8a973464784e588992988988eb26cfa0cf5f67b" "59ded4c8a6ec924cce82ba942070e51132ca1161" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "455c68aebdef50de586de3bdbacfe923077cd697" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_USE_VCSID="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk trunks libhwsec metrics u2fd .gn"
+
+PLATFORM_SUBDIR="u2fd"
+
+inherit cros-workon platform user
+
+DESCRIPTION="U2FHID Emulation Daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fhid"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	chromeos-base/attestation:=
+	chromeos-base/attestation-client:=
+	chromeos-base/cbor:=
+	chromeos-base/libhwsec:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/power_manager-client:=
+	chromeos-base/trunks:=
+	dev-libs/hidapi:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/attestation-client:=
+	chromeos-base/system_api:=[fuzzer?]
+"
+
+pkg_setup() {
+	# Has to be done in pkg_setup() instead of pkg_preinst() since
+	# src_install() needs the u2f user and group.
+	enewuser "u2f"
+	enewgroup "u2f"
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	dobin "${OUT}"/u2fd
+
+	insinto /etc/init
+	doins init/*.conf
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.U2F.conf
+
+	local daemon_store="/etc/daemon-store/u2f"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners u2f:u2f "${daemon_store}"
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/u2f_adpu_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/u2fd_test_runner"
+}
diff --git a/chromeos-base/u2fd/u2fd-9999.ebuild b/chromeos-base/u2fd/u2fd-9999.ebuild
index 543a7d0..62efb02c 100644
--- a/chromeos-base/u2fd/u2fd-9999.ebuild
+++ b/chromeos-base/u2fd/u2fd-9999.ebuild
@@ -26,7 +26,7 @@
 	chromeos-base/attestation-client:=
 	chromeos-base/cbor:=
 	chromeos-base/libhwsec:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/power_manager-client:=
 	chromeos-base/trunks:=
 	dev-libs/hidapi:=
diff --git a/chromeos-base/uboot-env/OWNERS b/chromeos-base/uboot-env/OWNERS
new file mode 100644
index 0000000..891015e
--- /dev/null
+++ b/chromeos-base/uboot-env/OWNERS
@@ -0,0 +1 @@
+include /sys-boot/u-boot/OWNERS
diff --git a/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1725.ebuild b/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1725.ebuild
deleted file mode 100644
index 2a6efd72..0000000
--- a/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1725.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("6b7a4a600d398a34ec63c5b9dec33b4048f9e19f" "cc6ab9f076694a816fa35f133e98e7737542ddd8")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "a9cad6253f307e9e129fa4dd846f45ebf5c1258e")
-CROS_WORKON_LOCALNAME=("platform2" "aosp/system/update_engine")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/system/update_engine")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/update_engine")
-CROS_WORKON_USE_VCSID=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_NATIVE_TEST="yes"
-PLATFORM_SUBDIR="update_engine/client-headers"
-
-inherit cros-debug cros-workon platform
-
-DESCRIPTION="Chrome OS Update Engine client library"
-HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host"
-
-RDEPEND="
-	!<chromeos-base/update_engine-0.0.3
-"
-
-BDEPEND="
-	chromeos-base/chromeos-dbus-bindings:=
-"
-
-src_install() {
-	# Install DBus client library.
-	platform_install_dbus_client_lib "update_engine"
-}
diff --git a/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1769.ebuild b/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1769.ebuild
new file mode 100644
index 0000000..87209d6
--- /dev/null
+++ b/chromeos-base/update_engine-client/update_engine-client-0.0.1-r1769.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("599a402643c3a97f9c8b9f055cd4051a154462ba" "7d192200b897a9d65912e270691e5a3c8a8ff1a7")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "f9324fe348633417d3004c17be2faf5e350d309a")
+CROS_WORKON_LOCALNAME=("platform2" "aosp/system/update_engine")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/system/update_engine")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/update_engine")
+CROS_WORKON_USE_VCSID=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_NATIVE_TEST="yes"
+PLATFORM_SUBDIR="update_engine/client-headers"
+
+inherit cros-debug cros-workon platform
+
+DESCRIPTION="Chrome OS Update Engine client library"
+HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host"
+
+RDEPEND="
+	!<chromeos-base/update_engine-0.0.3
+"
+
+BDEPEND="
+	chromeos-base/chromeos-dbus-bindings:=
+"
+
+src_install() {
+	# Install DBus client library.
+	platform_install_dbus_client_lib "update_engine"
+}
diff --git a/chromeos-base/update_engine/update_engine-0.0.3-r3572.ebuild b/chromeos-base/update_engine/update_engine-0.0.3-r3572.ebuild
deleted file mode 100644
index 02d4d97..0000000
--- a/chromeos-base/update_engine/update_engine-0.0.3-r3572.ebuild
+++ /dev/null
@@ -1,142 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("6b7a4a600d398a34ec63c5b9dec33b4048f9e19f" "cc6ab9f076694a816fa35f133e98e7737542ddd8")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "a9cad6253f307e9e129fa4dd846f45ebf5c1258e")
-CROS_WORKON_LOCALNAME=("platform2" "aosp/system/update_engine")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/system/update_engine")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/update_engine")
-CROS_WORKON_USE_VCSID=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="update_engine"
-# Some unittests crash when run through qemu/arm.  Should figure this out.
-PLATFORM_NATIVE_TEST="yes"
-
-inherit cros-debug cros-workon platform systemd
-
-DESCRIPTION="Chrome OS Update Engine"
-HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine/"
-SRC_URI=""
-
-LICENSE="Apache-2.0"
-KEYWORDS="*"
-IUSE="cfm cros_p2p +dbus dlc fuzzer -hwid_override +power_management systemd"
-
-COMMON_DEPEND="
-	app-arch/bzip2:=
-	chromeos-base/chromeos-ca-certificates:=
-	chromeos-base/metrics:=
-	chromeos-base/vboot_reference:=
-	cros_p2p? ( chromeos-base/p2p:= )
-	dev-libs/expat:=
-	dev-libs/openssl:=
-	dev-libs/protobuf:=
-	dev-libs/xz-embedded:=
-	dev-util/bsdiff:=
-	dev-util/puffin:=
-	net-misc/curl:=
-	sys-apps/rootdev:="
-
-DEPEND="
-	app-arch/xz-utils:=
-	chromeos-base/debugd-client:=
-	dlc? ( chromeos-base/dlcservice-client:= )
-	chromeos-base/power_manager-client:=
-	chromeos-base/session_manager-client:=
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/update_engine-client:=
-	sys-fs/e2fsprogs:=
-	test? ( sys-fs/squashfs-tools:= )
-	${COMMON_DEPEND}"
-
-DELTA_GENERATOR_RDEPEND="
-	app-arch/unzip
-	app-arch/xz-utils
-	app-shells/bash
-	dev-util/shflags
-	sys-fs/e2fsprogs
-	sys-fs/squashfs-tools
-"
-
-RDEPEND="
-	chromeos-base/chromeos-installer
-	${COMMON_DEPEND}
-	cros_host? ( ${DELTA_GENERATOR_RDEPEND} )
-	power_management? ( chromeos-base/power_manager )
-	virtual/update-policy
-"
-
-platform_pkg_test() {
-	local unittests_binary="${OUT}"/update_engine_unittests
-
-	# The unittests will try to exec `./helpers`, so make sure we're in
-	# the right dir to execute things.
-	cd "${OUT}"
-	# The tests also want keys to be in the current dir.
-	# .pub.pem files are generated on the "gen" directory.
-	for f in unittest_key.pub.pem unittest_key2.pub.pem; do
-		cp "${S}"/${f/.pub} ./ || die
-		ln -fs gen/include/update_engine/$f $f  \
-			|| die "Error creating the symlink for $f."
-	done
-
-	# The unit tests check to make sure the minor version value in
-	# update_engine.conf match the constants in update engine, so we need to be
-	# able to access this file.
-	cp "${S}/update_engine.conf" ./
-
-	# If GTEST_FILTER isn't provided, we run two subsets of tests
-	# separately: the set of non-privileged  tests (run normally)
-	# followed by the set of privileged tests (run as root).
-	# Otherwise, we pass the GTEST_FILTER environment variable as
-	# an argument and run all the tests as root; while this might
-	# lead to tests running with excess privileges, it is necessary
-	# in order to be able to run every test, including those that
-	# need to be run with root privileges.
-	if [[ -z "${GTEST_FILTER}" ]]; then
-		platform_test "run" "${unittests_binary}" 0 '-*.RunAsRoot*'
-		platform_test "run" "${unittests_binary}" 1 '*.RunAsRoot*'
-	else
-		platform_test "run" "${unittests_binary}" 1 "${GTEST_FILTER}"
-	fi
-
-	for f in "omaha_request_action" "delta_performer"; do
-		platform_fuzzer_test "${OUT}/update_engine_${f}_fuzzer"
-	done
-}
-
-src_install() {
-	dosbin "${OUT}"/update_engine
-	dobin "${OUT}"/update_engine_client
-
-	if use cros_host; then
-		dobin "${OUT}"/delta_generator
-	fi
-
-	insinto /etc
-	doins update_engine.conf
-
-	if use systemd; then
-		systemd_dounit "${FILESDIR}"/update-engine.service
-		systemd_enable_service multi-user.target update-engine.service
-	else
-		# Install upstart script
-		insinto /etc/init
-		doins init/update-engine.conf
-	fi
-
-	# Install DBus configuration
-	insinto /etc/dbus-1/system.d
-	doins UpdateEngine.conf
-
-	platform_fuzzer_install "${S}"/OWNERS \
-				"${OUT}"/update_engine_omaha_request_action_fuzzer \
-				--dict "${S}"/fuzz/xml.dict
-	platform_fuzzer_install "${S}"/OWNERS \
-				"${OUT}"/update_engine_delta_performer_fuzzer
-}
diff --git a/chromeos-base/update_engine/update_engine-0.0.3-r3621.ebuild b/chromeos-base/update_engine/update_engine-0.0.3-r3621.ebuild
new file mode 100644
index 0000000..ca2a49d
--- /dev/null
+++ b/chromeos-base/update_engine/update_engine-0.0.3-r3621.ebuild
@@ -0,0 +1,136 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("599a402643c3a97f9c8b9f055cd4051a154462ba" "7d192200b897a9d65912e270691e5a3c8a8ff1a7")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "f9324fe348633417d3004c17be2faf5e350d309a")
+CROS_WORKON_LOCALNAME=("platform2" "aosp/system/update_engine")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/system/update_engine")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/update_engine")
+CROS_WORKON_USE_VCSID=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="update_engine"
+# Some unittests crash when run through qemu/arm.  Should figure this out.
+PLATFORM_NATIVE_TEST="yes"
+
+inherit cros-debug cros-workon platform systemd
+
+DESCRIPTION="Chrome OS Update Engine"
+HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine/"
+SRC_URI=""
+
+LICENSE="Apache-2.0"
+KEYWORDS="*"
+IUSE="cfm cros_p2p +dbus dlc fuzzer -hwid_override +power_management systemd"
+
+COMMON_DEPEND="
+	app-arch/bzip2:=
+	chromeos-base/chromeos-ca-certificates:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/vboot_reference:=
+	cros_p2p? ( chromeos-base/p2p:= )
+	dev-libs/expat:=
+	dev-libs/openssl:=
+	dev-libs/protobuf:=
+	dev-libs/xz-embedded:=
+	dev-util/bsdiff:=
+	dev-util/puffin:=
+	net-misc/curl:=
+	sys-apps/rootdev:="
+
+DEPEND="
+	app-arch/xz-utils:=
+	chromeos-base/debugd-client:=
+	dlc? ( chromeos-base/dlcservice-client:= )
+	chromeos-base/power_manager-client:=
+	chromeos-base/session_manager-client:=
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/update_engine-client:=
+	test? ( sys-fs/squashfs-tools )
+	${COMMON_DEPEND}"
+
+DELTA_GENERATOR_RDEPEND="
+	app-arch/unzip:=
+	app-arch/xz-utils:=
+	sys-libs/e2fsprogs-libs:=
+	sys-fs/squashfs-tools
+"
+
+RDEPEND="
+	chromeos-base/chromeos-installer
+	${COMMON_DEPEND}
+	cros_host? ( ${DELTA_GENERATOR_RDEPEND} )
+	power_management? ( chromeos-base/power_manager:= )
+	virtual/update-policy:=
+"
+
+platform_pkg_test() {
+	local unittests_binary="${OUT}"/update_engine_unittests
+
+	# The unittests will try to exec `./helpers`, so make sure we're in
+	# the right dir to execute things.
+	cd "${OUT}"
+	# The tests also want keys to be in the current dir.
+	# .pub.pem files are generated on the "gen" directory.
+	cp "${S}"/unittest_key*.pem ./ || die
+	cp gen/include/update_engine/unittest_key*.pub.pem ./ || die
+
+	# The unit tests check to make sure the minor version value in
+	# update_engine.conf match the constants in update engine, so we need to be
+	# able to access this file.
+	cp "${S}/update_engine.conf" ./
+
+	# If GTEST_FILTER isn't provided, we run two subsets of tests
+	# separately: the set of non-privileged  tests (run normally)
+	# followed by the set of privileged tests (run as root).
+	# Otherwise, we pass the GTEST_FILTER environment variable as
+	# an argument and run all the tests as root; while this might
+	# lead to tests running with excess privileges, it is necessary
+	# in order to be able to run every test, including those that
+	# need to be run with root privileges.
+	if [[ -z "${GTEST_FILTER}" ]]; then
+		platform_test "run" "${unittests_binary}" 0 '-*.RunAsRoot*'
+		platform_test "run" "${unittests_binary}" 1 '*.RunAsRoot*'
+	else
+		platform_test "run" "${unittests_binary}" 1 "${GTEST_FILTER}"
+	fi
+
+	for f in "omaha_request_action" "delta_performer"; do
+		platform_fuzzer_test "${OUT}/update_engine_${f}_fuzzer"
+	done
+}
+
+src_install() {
+	dosbin "${OUT}"/update_engine
+	dobin "${OUT}"/update_engine_client
+
+	if use cros_host; then
+		dobin "${OUT}"/delta_generator
+	fi
+
+	insinto /etc
+	newins update_engine.conf.chromeos update_engine.conf
+
+	if use systemd; then
+		systemd_dounit "${FILESDIR}"/update-engine.service
+		systemd_enable_service multi-user.target update-engine.service
+	else
+		# Install upstart script
+		insinto /etc/init
+		doins init/update-engine.conf
+	fi
+
+	# Install DBus configuration
+	insinto /etc/dbus-1/system.d
+	doins UpdateEngine.conf
+
+	platform_fuzzer_install "${S}"/OWNERS \
+				"${OUT}"/update_engine_omaha_request_action_fuzzer \
+				--dict "${S}"/fuzz/xml.dict
+	platform_fuzzer_install "${S}"/OWNERS \
+				"${OUT}"/update_engine_delta_performer_fuzzer
+}
diff --git a/chromeos-base/update_engine/update_engine-9999.ebuild b/chromeos-base/update_engine/update_engine-9999.ebuild
index 1d4feed..b252d12 100644
--- a/chromeos-base/update_engine/update_engine-9999.ebuild
+++ b/chromeos-base/update_engine/update_engine-9999.ebuild
@@ -27,7 +27,7 @@
 COMMON_DEPEND="
 	app-arch/bzip2:=
 	chromeos-base/chromeos-ca-certificates:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/vboot_reference:=
 	cros_p2p? ( chromeos-base/p2p:= )
 	dev-libs/expat:=
@@ -48,16 +48,13 @@
 	chromeos-base/shill-client:=
 	chromeos-base/system_api:=[fuzzer?]
 	chromeos-base/update_engine-client:=
-	sys-fs/e2fsprogs:=
-	test? ( sys-fs/squashfs-tools:= )
+	test? ( sys-fs/squashfs-tools )
 	${COMMON_DEPEND}"
 
 DELTA_GENERATOR_RDEPEND="
-	app-arch/unzip
-	app-arch/xz-utils
-	app-shells/bash
-	dev-util/shflags
-	sys-fs/e2fsprogs
+	app-arch/unzip:=
+	app-arch/xz-utils:=
+	sys-libs/e2fsprogs-libs:=
 	sys-fs/squashfs-tools
 "
 
@@ -65,8 +62,8 @@
 	chromeos-base/chromeos-installer
 	${COMMON_DEPEND}
 	cros_host? ( ${DELTA_GENERATOR_RDEPEND} )
-	power_management? ( chromeos-base/power_manager )
-	virtual/update-policy
+	power_management? ( chromeos-base/power_manager:= )
+	virtual/update-policy:=
 "
 
 platform_pkg_test() {
@@ -77,11 +74,8 @@
 	cd "${OUT}"
 	# The tests also want keys to be in the current dir.
 	# .pub.pem files are generated on the "gen" directory.
-	for f in unittest_key.pub.pem unittest_key2.pub.pem; do
-		cp "${S}"/${f/.pub} ./ || die
-		ln -fs gen/include/update_engine/$f $f  \
-			|| die "Error creating the symlink for $f."
-	done
+	cp "${S}"/unittest_key*.pem ./ || die
+	cp gen/include/update_engine/unittest_key*.pub.pem ./ || die
 
 	# The unit tests check to make sure the minor version value in
 	# update_engine.conf match the constants in update engine, so we need to be
@@ -117,7 +111,7 @@
 	fi
 
 	insinto /etc
-	doins update_engine.conf
+	newins update_engine.conf.chromeos update_engine.conf
 
 	if use systemd; then
 		systemd_dounit "${FILESDIR}"/update-engine.service
diff --git a/chromeos-base/update_payload/update_payload-0.0.1-r273.ebuild b/chromeos-base/update_payload/update_payload-0.0.1-r273.ebuild
deleted file mode 100644
index fc124a4..0000000
--- a/chromeos-base/update_payload/update_payload-0.0.1-r273.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="cc6ab9f076694a816fa35f133e98e7737542ddd8"
-CROS_WORKON_TREE="a9cad6253f307e9e129fa4dd846f45ebf5c1258e"
-PYTHON_COMPAT=( python3_{6,7} )
-
-CROS_WORKON_LOCALNAME="aosp/system/update_engine"
-CROS_WORKON_PROJECT="aosp/platform/system/update_engine"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-
-inherit cros-workon python-r1
-
-DESCRIPTION="Chrome OS Update Engine Update Payload Scripts"
-HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine"
-
-LICENSE="Apache-2.0"
-KEYWORDS="*"
-
-RDEPEND="
-	dev-python/protobuf-python[${PYTHON_USEDEP}]
-	!<chromeos-base/devserver-0.0.3
-"
-DEPEND=""
-
-src_install() {
-	# Install update_payload scripts.
-	install_update_payload() {
-		# TODO(crbug.com/771085): Clear the SYSROOT var as python will use
-		# that to define the sitedir which means we end up installing into
-		# a path like /build/$BOARD/build/$BOARD/xxx.  This is a bug in the
-		# core python logic, but this is breaking moblab, so hack it for now.
-		insinto "$(python_get_sitedir | sed "s:^${SYSROOT}::")/update_payload"
-		doins $(printf '%s\n' scripts/update_payload/*.py | grep -v unittest)
-		doins scripts/update_payload/update-payload-key.pub.pem
-	}
-	python_foreach_impl install_update_payload
-
-	# Install paycheck.py script as check_update_payload.
-	newbin scripts/paycheck.py check_update_payload
-}
-
-src_test() {
-	# Run update_payload unittests.
-	cd scripts
-	python_test() {
-		./run_unittests || die
-	}
-	python_foreach_impl python_test
-}
diff --git a/chromeos-base/update_payload/update_payload-0.0.1-r297.ebuild b/chromeos-base/update_payload/update_payload-0.0.1-r297.ebuild
new file mode 100644
index 0000000..3be77b7
--- /dev/null
+++ b/chromeos-base/update_payload/update_payload-0.0.1-r297.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d192200b897a9d65912e270691e5a3c8a8ff1a7"
+CROS_WORKON_TREE="f9324fe348633417d3004c17be2faf5e350d309a"
+PYTHON_COMPAT=( python3_{6,7} )
+
+CROS_WORKON_LOCALNAME="aosp/system/update_engine"
+CROS_WORKON_PROJECT="aosp/platform/system/update_engine"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+
+inherit cros-workon python-r1
+
+DESCRIPTION="Chrome OS Update Engine Update Payload Scripts"
+HOMEPAGE="https://chromium.googlesource.com/aosp/platform/system/update_engine"
+
+LICENSE="Apache-2.0"
+KEYWORDS="*"
+
+RDEPEND="
+	dev-python/protobuf-python[${PYTHON_USEDEP}]
+	!<chromeos-base/devserver-0.0.3
+"
+DEPEND=""
+
+src_install() {
+	# Install update_payload scripts.
+	install_update_payload() {
+		# TODO(crbug.com/771085): Clear the SYSROOT var as python will use
+		# that to define the sitedir which means we end up installing into
+		# a path like /build/$BOARD/build/$BOARD/xxx.  This is a bug in the
+		# core python logic, but this is breaking moblab, so hack it for now.
+		insinto "$(python_get_sitedir | sed "s:^${SYSROOT}::")/update_payload"
+		doins $(printf '%s\n' scripts/update_payload/*.py | grep -v unittest)
+		doins scripts/update_payload/update-payload-key.pub.pem
+	}
+	python_foreach_impl install_update_payload
+
+	# Install paycheck.py script as check_update_payload.
+	newbin scripts/paycheck.py check_update_payload
+}
+
+src_test() {
+	# Run update_payload unittests.
+	cd "${T}" || die
+	unpack "${S}"/sample_images/{sample_payloads.tar.xz,sample_images.tar.bz2}
+	cd "${S}"/scripts || die
+	python_test() {
+		./run_unittests || die
+	}
+	python_foreach_impl python_test
+}
diff --git a/chromeos-base/update_payload/update_payload-9999.ebuild b/chromeos-base/update_payload/update_payload-9999.ebuild
index e71a165..093033d 100644
--- a/chromeos-base/update_payload/update_payload-9999.ebuild
+++ b/chromeos-base/update_payload/update_payload-9999.ebuild
@@ -42,7 +42,9 @@
 
 src_test() {
 	# Run update_payload unittests.
-	cd scripts
+	cd "${T}" || die
+	unpack "${S}"/sample_images/{sample_payloads.tar.xz,sample_images.tar.bz2}
+	cd "${S}"/scripts || die
 	python_test() {
 		./run_unittests || die
 	}
diff --git a/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r29.ebuild b/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r29.ebuild
deleted file mode 100644
index 3c529b3..0000000
--- a/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r29.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "8ef967d6ac3f68de68c966e7444fadf17031900d" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk ureadahead-diff .gn"
-
-PLATFORM_SUBDIR="ureadahead-diff"
-
-inherit cros-workon platform
-
-DESCRIPTION="Calculate common part and difference of two ureadahead packs"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ureadahead-diff"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-
-src_install() {
-	dobin "${OUT}"/ureadahead-diff
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/ureadahead-diff_testrunner"
-}
diff --git a/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r50.ebuild b/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r50.ebuild
new file mode 100644
index 0000000..95d76d5
--- /dev/null
+++ b/chromeos-base/ureadahead-diff/ureadahead-diff-0.0.1-r50.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "d8726112ed4bb883ce30b46d2c19edf480bd7acb" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk ureadahead-diff .gn"
+
+PLATFORM_SUBDIR="ureadahead-diff"
+
+inherit cros-workon platform
+
+DESCRIPTION="Calculate common part and difference of two ureadahead packs"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/ureadahead-diff"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+
+src_install() {
+	dobin "${OUT}"/ureadahead-diff
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/ureadahead-diff_testrunner"
+}
diff --git a/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r214.ebuild b/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r214.ebuild
deleted file mode 100644
index 3d98011..0000000
--- a/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r214.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="1260b774a9501a358b02ba2888bb7587d91a95ab"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "17a8f969c731702042176cf629f5dd324c906ff0" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk metrics usb_bouncer .gn"
-
-PLATFORM_SUBDIR="usb_bouncer"
-
-inherit cros-workon platform user cros-fuzzer cros-sanitizers
-
-DESCRIPTION="Manage the usbguard whitelist"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/usb_bouncer/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-COMMON_DEPEND="
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-	chromeos-base/metrics:=
-	chromeos-base/minijail:=
-	dev-libs/openssl:0=
-	sys-apps/usbguard:=
-"
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}
-	chromeos-base/session_manager-client:="
-
-src_install() {
-	insinto /lib/udev/rules.d
-	doins "${S}/40-usb-bouncer.rules"
-
-	cd "${OUT}"
-	dosbin usb_bouncer
-
-	insinto /etc/dbus-1/system.d
-	doins "${S}/UsbBouncer.conf"
-
-	insinto /usr/share/policy
-	newins "${S}/seccomp/usb_bouncer-seccomp-${ARCH}.policy" usb_bouncer-seccomp.policy
-
-	insinto /etc/init
-	doins "${S}"/init/usb_bouncer.conf
-
-	local daemon_store="/etc/daemon-store/usb_bouncer"
-	dodir "${daemon_store}"
-	fperms 0700 "${daemon_store}"
-	fowners usb_bouncer:usb_bouncer "${daemon_store}"
-
-	local f="${OUT}/usb_bouncer_fuzzer"
-	fuzzer_install "${S}/OWNERS" "${f}"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/run_tests"
-}
-
-pkg_setup() {
-	enewuser usb_bouncer
-	enewgroup usb_bouncer
-	cros-workon_pkg_setup
-}
diff --git a/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r247.ebuild b/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r247.ebuild
new file mode 100644
index 0000000..b7fed58
--- /dev/null
+++ b/chromeos-base/usb_bouncer/usb_bouncer-0.0.1-r247.ebuild
@@ -0,0 +1,71 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "da917b0bbacaf6c0a525a8f2b4dcd720cf338c7f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk metrics usb_bouncer .gn"
+
+PLATFORM_SUBDIR="usb_bouncer"
+
+inherit cros-workon platform user cros-fuzzer cros-sanitizers
+
+DESCRIPTION="Manage the usbguard whitelist"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/usb_bouncer/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+COMMON_DEPEND="
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/minijail:=
+	dev-libs/openssl:0=
+	sys-apps/usbguard:=
+"
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}
+	chromeos-base/session_manager-client:="
+
+src_install() {
+	insinto /lib/udev/rules.d
+	doins "${S}/40-usb-bouncer.rules"
+
+	cd "${OUT}"
+	dosbin usb_bouncer
+
+	insinto /etc/dbus-1/system.d
+	doins "${S}/UsbBouncer.conf"
+
+	insinto /usr/share/policy
+	newins "${S}/seccomp/usb_bouncer-seccomp-${ARCH}.policy" usb_bouncer-seccomp.policy
+
+	insinto /etc/init
+	doins "${S}"/init/usb_bouncer.conf
+
+	local daemon_store="/etc/daemon-store/usb_bouncer"
+	dodir "${daemon_store}"
+	fperms 0700 "${daemon_store}"
+	fowners usb_bouncer:usb_bouncer "${daemon_store}"
+
+	local f="${OUT}/usb_bouncer_fuzzer"
+	fuzzer_install "${S}/OWNERS" "${f}"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/run_tests"
+}
+
+pkg_setup() {
+	enewuser usb_bouncer
+	enewgroup usb_bouncer
+	cros-workon_pkg_setup
+}
diff --git a/chromeos-base/usb_bouncer/usb_bouncer-9999.ebuild b/chromeos-base/usb_bouncer/usb_bouncer-9999.ebuild
index da86113..5686c2d 100644
--- a/chromeos-base/usb_bouncer/usb_bouncer-9999.ebuild
+++ b/chromeos-base/usb_bouncer/usb_bouncer-9999.ebuild
@@ -24,7 +24,7 @@
 
 COMMON_DEPEND="
 	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/minijail:=
 	dev-libs/openssl:0=
 	sys-apps/usbguard:=
diff --git a/chromeos-base/userfeedback/userfeedback-0.0.1-r2897.ebuild b/chromeos-base/userfeedback/userfeedback-0.0.1-r2897.ebuild
deleted file mode 100644
index fd2bc25..0000000
--- a/chromeos-base/userfeedback/userfeedback-0.0.1-r2897.ebuild
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="57a1e237c5e4c2b6de1f36bccae4d556f5a13aa4"
-CROS_WORKON_TREE="c10c251002e6164cc1ae7cbe4b1934cc0902a6ec"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_SUBTREE="userfeedback"
-
-inherit cros-workon systemd
-
-DESCRIPTION="Log scripts used by userfeedback to report cros system information"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/userfeedback/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="systemd X"
-
-RDEPEND="chromeos-base/chromeos-init
-	chromeos-base/crash-reporter
-	chromeos-base/modem-utilities
-	chromeos-base/vboot_reference
-	media-libs/fontconfig
-	media-sound/alsa-utils
-	sys-apps/coreboot-utils
-	sys-apps/mosys
-	sys-apps/net-tools
-	sys-apps/pciutils
-	sys-apps/usbutils
-	X? ( x11-apps/setxkbmap )"
-
-DEPEND=""
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/userfeedback"
-}
-
-src_install() {
-	exeinto /usr/share/userfeedback/scripts
-	doexe scripts/*
-
-	# Install init scripts.
-	if use systemd; then
-		local units=("firmware-version.service")
-		systemd_dounit init/*.service
-		for unit in "${units[@]}"; do
-			systemd_enable_service system-services.target ${unit}
-		done
-	else
-		insinto /etc/init
-		doins init/*.conf
-	fi
-}
diff --git a/chromeos-base/userfeedback/userfeedback-0.0.1-r2898.ebuild b/chromeos-base/userfeedback/userfeedback-0.0.1-r2898.ebuild
new file mode 100644
index 0000000..ca23981
--- /dev/null
+++ b/chromeos-base/userfeedback/userfeedback-0.0.1-r2898.ebuild
@@ -0,0 +1,57 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="3bedb01f0bbf8767db84c3dace0a1a126ce304b5"
+CROS_WORKON_TREE="cf316d8f26c5d0d66cfb049d64c4283722a06059"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_SUBTREE="userfeedback"
+
+inherit cros-workon systemd
+
+DESCRIPTION="Log scripts used by userfeedback to report cros system information"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/userfeedback/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="systemd X"
+
+RDEPEND="chromeos-base/chromeos-init
+	chromeos-base/crash-reporter
+	chromeos-base/modem-utilities
+	chromeos-base/vboot_reference
+	media-libs/fontconfig
+	media-sound/alsa-utils
+	sys-apps/coreboot-utils
+	sys-apps/mosys
+	sys-apps/net-tools
+	sys-apps/pciutils
+	sys-apps/usbutils
+	X? ( x11-apps/setxkbmap )"
+
+DEPEND=""
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/userfeedback"
+}
+
+src_install() {
+	exeinto /usr/share/userfeedback/scripts
+	doexe scripts/*
+
+	# Install init scripts.
+	if use systemd; then
+		local units=("firmware-version.service")
+		systemd_dounit init/*.service
+		for unit in "${units[@]}"; do
+			systemd_enable_service system-services.target ${unit}
+		done
+	else
+		insinto /etc/init
+		doins init/*.conf
+	fi
+}
diff --git a/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1171.ebuild b/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1171.ebuild
deleted file mode 100644
index 4575b42..0000000
--- a/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1171.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1d3dc401e83a63048534f57a715e677fbea29d49" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk userspace_touchpad .gn"
-
-PLATFORM_SUBDIR="userspace_touchpad"
-
-inherit cros-workon platform
-
-DESCRIPTION="Userspace Touchpad"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/userspace_touchpad/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-IUSE=""
-KEYWORDS="*"
-
-src_install() {
-	dobin "${OUT}/userspace_touchpad"
-
-	insinto "/etc/init"
-	doins "userspace_touchpad.conf"
-}
diff --git a/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1193.ebuild b/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1193.ebuild
new file mode 100644
index 0000000..54c2a37
--- /dev/null
+++ b/chromeos-base/userspace_touchpad/userspace_touchpad-0.0.1-r1193.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk userspace_touchpad .gn"
+
+PLATFORM_SUBDIR="userspace_touchpad"
+
+inherit cros-workon platform
+
+DESCRIPTION="Userspace Touchpad"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/userspace_touchpad/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+IUSE=""
+KEYWORDS="*"
+
+src_install() {
+	dobin "${OUT}/userspace_touchpad"
+
+	insinto "/etc/init"
+	doins "userspace_touchpad.conf"
+}
diff --git a/chromeos-base/usi-test/usi-test-0.0.1-r1.ebuild b/chromeos-base/usi-test/usi-test-0.0.1-r1.ebuild
new file mode 100644
index 0000000..8ede7dd
--- /dev/null
+++ b/chromeos-base/usi-test/usi-test-0.0.1-r1.ebuild
@@ -0,0 +1,24 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="2c47301c21a3e4d4dfcfefdd3a576c18aa38c98b"
+CROS_WORKON_TREE="fe1c473b2a9fa0ac5caaee9ab1d472686620b7bc"
+PYTHON_COMPAT=( python3_{6..8} )
+
+CROS_WORKON_PROJECT="chromiumos/platform/usi-test"
+CROS_WORKON_LOCALNAME="platform/usi-test"
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Universal Stylus Initiative (USI) Certification Tool"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/usi-test/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-"
+
+RDEPEND="~dev-python/hid-tools-0.2[${PYTHON_USEDEP}]"
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/usi-test/usi-test-9999.ebuild b/chromeos-base/usi-test/usi-test-9999.ebuild
new file mode 100644
index 0000000..91f2cef
--- /dev/null
+++ b/chromeos-base/usi-test/usi-test-9999.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} )
+
+CROS_WORKON_PROJECT="chromiumos/platform/usi-test"
+CROS_WORKON_LOCALNAME="platform/usi-test"
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Universal Stylus Initiative (USI) Certification Tool"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/usi-test/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE="-"
+
+RDEPEND="~dev-python/hid-tools-0.2[${PYTHON_USEDEP}]"
+DEPEND="${RDEPEND}"
diff --git a/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1843.ebuild b/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1843.ebuild
deleted file mode 100644
index 7eeb442..0000000
--- a/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1843.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54"
-CROS_WORKON_TREE="82e77f6c98187361303fffeeba118a1a365e16d5"
-CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
-
-inherit cros-workon autotest
-
-DESCRIPTION="vboot tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-# Enable autotest by default.
-IUSE="${IUSE} +autotest"
-
-IUSE_TESTS="
-	+tests_firmware_VbootCrypto
-"
-
-IUSE="${IUSE} ${IUSE_TESTS}"
-
-CROS_WORKON_LOCALNAME=platform/vboot_reference
-
-# path from root of repo
-AUTOTEST_CLIENT_SITE_TESTS=autotest/client
-
-src_compile() {
-	# for Makefile
-	export VBOOT_SRC_DIR=${WORKDIR}/${P}
-	autotest_src_compile
-}
diff --git a/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1892.ebuild b/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1892.ebuild
new file mode 100644
index 0000000..64c12d1
--- /dev/null
+++ b/chromeos-base/vboot_reference-tests/vboot_reference-tests-0.0.1-r1892.ebuild
@@ -0,0 +1,35 @@
+# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="524012c64c07f8673998428cca7f80e01a387f48"
+CROS_WORKON_TREE="d011d454951af2d6dbcf7d4dc7af53a31cc883db"
+CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
+
+inherit cros-workon autotest
+
+DESCRIPTION="vboot tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vboot_reference/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+# Enable autotest by default.
+IUSE="${IUSE} +autotest"
+
+IUSE_TESTS="
+	+tests_firmware_VbootCrypto
+"
+
+IUSE="${IUSE} ${IUSE_TESTS}"
+
+CROS_WORKON_LOCALNAME=platform/vboot_reference
+
+# path from root of repo
+AUTOTEST_CLIENT_SITE_TESTS=autotest/client
+
+src_compile() {
+	# for Makefile
+	export VBOOT_SRC_DIR=${WORKDIR}/${P}
+	autotest_src_compile
+}
diff --git a/chromeos-base/vboot_reference/vboot_reference-1.0-r1980.ebuild b/chromeos-base/vboot_reference/vboot_reference-1.0-r1980.ebuild
deleted file mode 100644
index a70cee1..0000000
--- a/chromeos-base/vboot_reference/vboot_reference-1.0-r1980.ebuild
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54"
-CROS_WORKON_TREE="82e77f6c98187361303fffeeba118a1a365e16d5"
-CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
-CROS_WORKON_LOCALNAME="platform/vboot_reference"
-
-inherit cros-debug cros-fuzzer cros-sanitizers cros-workon
-
-DESCRIPTION="Chrome OS verified boot tools"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host dev_debug_force fuzzer pd_sync test tpmtests tpm tpm2"
-
-REQUIRED_USE="?? ( tpm2 tpm )"
-
-COMMON_DEPEND="dev-libs/libzip:=
-	dev-libs/openssl:=
-	sys-apps/util-linux:="
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-get_build_dir() {
-	echo "${S}/build-main"
-}
-
-src_configure() {
-	# Determine sanitizer flags. This is necessary because the Makefile
-	# purposely ignores CFLAGS from the environment. So we collect the
-	# sanitizer flags and pass just them to the Makefile explicitly.
-	SANITIZER_CFLAGS=$(
-		append-flags() {
-			printf "%s" "$* "
-		}
-		sanitizers-setup-env
-	)
-	if use_sanitizers; then
-		# Disable alignment sanitization, https://crbug.com/1015908 .
-		SANITIZER_CFLAGS+=" -fno-sanitize=alignment"
-
-		# Suppressions for unit tests.
-		if use test; then
-			# Do not check memory leaks or odr violations in address sanitizer.
-			# https://crbug.com/1015908 .
-			export ASAN_OPTIONS+=":detect_leaks=0:detect_odr_violation=0:"
-			# Suppress array bound checks, https://crbug.com/1082636 .
-			SANITIZER_CFLAGS+=" -fno-sanitize=array-bounds"
-		fi
-	fi
-	cros-debug-add-NDEBUG
-	default
-}
-
-vemake() {
-	emake \
-		SRCDIR="${S}" \
-		LIBDIR="$(get_libdir)" \
-		ARCH=$(tc-arch) \
-		SDK_BUILD=$(usev cros_host) \
-		TPM2_MODE=$(usev tpm2) \
-		PD_SYNC=$(usev pd_sync) \
-		DEV_DEBUG_FORCE=$(usev dev_debug_force) \
-		FUZZ_FLAGS="${SANITIZER_CFLAGS}" \
-		"$@"
-}
-
-src_compile() {
-	mkdir "$(get_build_dir)"
-	tc-export CC AR CXX PKG_CONFIG
-	# vboot_reference knows the flags to use
-	unset CFLAGS
-	vemake BUILD="$(get_build_dir)" all $(usex fuzzer fuzzers '')
-}
-
-src_test() {
-	! use amd64 && ! use x86 && ewarn "Skipping unittests for non-x86" && return 0
-	vemake BUILD="$(get_build_dir)" runtests
-}
-
-src_install() {
-	einfo "Installing programs"
-	vemake \
-		BUILD="$(get_build_dir)" \
-		DESTDIR="${D}" \
-		install install_dev
-
-	if use tpmtests; then
-		into /usr
-		# copy files starting with tpmtest, but skip .d files.
-		dobin "$(get_build_dir)"/tests/tpm_lite/tpmtest*[^.]?
-		dobin "$(get_build_dir)"/utility/tpm_set_readsrkpub
-	fi
-
-	if use fuzzer; then
-		einfo "Installing fuzzers"
-		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/cgpt_fuzzer
-		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/vb2_keyblock_fuzzer
-		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/vb2_preamble_fuzzer
-	fi
-}
diff --git a/chromeos-base/vboot_reference/vboot_reference-1.0-r2030.ebuild b/chromeos-base/vboot_reference/vboot_reference-1.0-r2030.ebuild
new file mode 100644
index 0000000..8db5834
--- /dev/null
+++ b/chromeos-base/vboot_reference/vboot_reference-1.0-r2030.ebuild
@@ -0,0 +1,103 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="524012c64c07f8673998428cca7f80e01a387f48"
+CROS_WORKON_TREE="d011d454951af2d6dbcf7d4dc7af53a31cc883db"
+CROS_WORKON_PROJECT="chromiumos/platform/vboot_reference"
+CROS_WORKON_LOCALNAME="platform/vboot_reference"
+
+inherit cros-debug cros-fuzzer cros-sanitizers cros-workon
+
+DESCRIPTION="Chrome OS verified boot tools"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host dev_debug_force fuzzer pd_sync test tpmtests tpm tpm2"
+
+REQUIRED_USE="?? ( tpm2 tpm )"
+
+COMMON_DEPEND="dev-libs/libzip:=
+	dev-libs/openssl:=
+	sys-apps/util-linux:="
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+get_build_dir() {
+	echo "${S}/build-main"
+}
+
+src_configure() {
+	# Determine sanitizer flags. This is necessary because the Makefile
+	# purposely ignores CFLAGS from the environment. So we collect the
+	# sanitizer flags and pass just them to the Makefile explicitly.
+	SANITIZER_CFLAGS=
+	append-flags() {
+		SANITIZER_CFLAGS+=" $*"
+	}
+	sanitizers-setup-env
+	if use_sanitizers; then
+		# Disable alignment sanitization, https://crbug.com/1015908 .
+		SANITIZER_CFLAGS+=" -fno-sanitize=alignment"
+
+		# Suppressions for unit tests.
+		if use test; then
+			# Do not check memory leaks or odr violations in address sanitizer.
+			# https://crbug.com/1015908 .
+			export ASAN_OPTIONS+=":detect_leaks=0:detect_odr_violation=0:"
+			# Suppress array bound checks, https://crbug.com/1082636 .
+			SANITIZER_CFLAGS+=" -fno-sanitize=array-bounds"
+		fi
+	fi
+	cros-debug-add-NDEBUG
+	default
+}
+
+vemake() {
+	emake \
+		SRCDIR="${S}" \
+		LIBDIR="$(get_libdir)" \
+		ARCH=$(tc-arch) \
+		SDK_BUILD=$(usev cros_host) \
+		TPM2_MODE=$(usev tpm2) \
+		PD_SYNC=$(usev pd_sync) \
+		DEV_DEBUG_FORCE=$(usev dev_debug_force) \
+		FUZZ_FLAGS="${SANITIZER_CFLAGS}" \
+		"$@"
+}
+
+src_compile() {
+	mkdir "$(get_build_dir)"
+	tc-export CC AR CXX PKG_CONFIG
+	# vboot_reference knows the flags to use
+	unset CFLAGS
+	vemake BUILD="$(get_build_dir)" all $(usex fuzzer fuzzers '')
+}
+
+src_test() {
+	! use amd64 && ! use x86 && ewarn "Skipping unittests for non-x86" && return 0
+	vemake BUILD="$(get_build_dir)" runtests
+}
+
+src_install() {
+	einfo "Installing programs"
+	vemake \
+		BUILD="$(get_build_dir)" \
+		DESTDIR="${D}" \
+		install install_dev
+
+	if use tpmtests; then
+		into /usr
+		# copy files starting with tpmtest, but skip .d files.
+		dobin "$(get_build_dir)"/tests/tpm_lite/tpmtest*[^.]?
+		dobin "$(get_build_dir)"/utility/tpm_set_readsrkpub
+	fi
+
+	if use fuzzer; then
+		einfo "Installing fuzzers"
+		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/cgpt_fuzzer
+		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/vb2_keyblock_fuzzer
+		fuzzer_install "${S}"/OWNERS "$(get_build_dir)"/tests/vb2_preamble_fuzzer
+	fi
+}
diff --git a/chromeos-base/vboot_reference/vboot_reference-9999.ebuild b/chromeos-base/vboot_reference/vboot_reference-9999.ebuild
index 7f6b933..55e7865 100644
--- a/chromeos-base/vboot_reference/vboot_reference-9999.ebuild
+++ b/chromeos-base/vboot_reference/vboot_reference-9999.ebuild
@@ -30,12 +30,11 @@
 	# Determine sanitizer flags. This is necessary because the Makefile
 	# purposely ignores CFLAGS from the environment. So we collect the
 	# sanitizer flags and pass just them to the Makefile explicitly.
-	SANITIZER_CFLAGS=$(
-		append-flags() {
-			printf "%s" "$* "
-		}
-		sanitizers-setup-env
-	)
+	SANITIZER_CFLAGS=
+	append-flags() {
+		SANITIZER_CFLAGS+=" $*"
+	}
+	sanitizers-setup-env
 	if use_sanitizers; then
 		# Disable alignment sanitization, https://crbug.com/1015908 .
 		SANITIZER_CFLAGS+=" -fno-sanitize=alignment"
diff --git a/chromeos-base/verity/verity-0.0.1-r117.ebuild b/chromeos-base/verity/verity-0.0.1-r117.ebuild
deleted file mode 100644
index 8062e70..0000000
--- a/chromeos-base/verity/verity-0.0.1-r117.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="393cd4d510256b0bb2bdd0acd9656105cfd28771"
-CROS_WORKON_TREE="1f77ce9d4bf7400f3d5f5a5f42698fee57abbd6d"
-CROS_WORKON_PROJECT="chromiumos/platform/dm-verity"
-CROS_WORKON_LOCALNAME="platform/verity"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-workon cros-common.mk
-
-DESCRIPTION="File system integrity image generator for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/dm-verity"
-
-# Override default S as verity source code must be compiled in a directory
-# where the last leaf is 'verity'.
-S="${WORKDIR}/${PN}"
-
-LICENSE="BSD-Google GPL-2"
-KEYWORDS="*"
-IUSE="test"
-
-RDEPEND=""
-DEPEND="${RDEPEND}
-	test? (
-		dev-cpp/gtest:=
-	)"
-
-src_install() {
-	dolib.a "${OUT}"/libdm-bht.a
-	insinto /usr/include/verity
-	doins dm-bht.h dm-bht-userspace.h
-	insinto /usr/include/verity
-	cd include
-	doins -r linux asm asm-generic crypto
-	cd ..
-	into /
-	dobin "${OUT}"/verity
-}
diff --git a/chromeos-base/verity/verity-0.0.1-r132.ebuild b/chromeos-base/verity/verity-0.0.1-r132.ebuild
new file mode 100644
index 0000000..56e8e8e
--- /dev/null
+++ b/chromeos-base/verity/verity-0.0.1-r132.ebuild
@@ -0,0 +1,38 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "78f05413fa5932fd3644b2dc70442ba3f39fcbf0" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk verity .gn"
+
+PLATFORM_SUBDIR="verity"
+
+inherit cros-workon platform
+
+DESCRIPTION="File system integrity image generator for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/verity/"
+
+LICENSE="BSD-Google GPL-2"
+KEYWORDS="*"
+
+src_install() {
+	dolib.a "${OUT}"/libdm-bht.a
+	insinto /usr/include/verity
+	doins dm-bht.h dm-bht-userspace.h
+	insinto /usr/include/verity
+	cd include
+	doins -r linux asm asm-generic crypto
+	cd ..
+	into /
+	dobin "${OUT}"/verity
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/verity_tests"
+}
diff --git a/chromeos-base/verity/verity-9999.ebuild b/chromeos-base/verity/verity-9999.ebuild
index d528202..c578548 100644
--- a/chromeos-base/verity/verity-9999.ebuild
+++ b/chromeos-base/verity/verity-9999.ebuild
@@ -3,28 +3,21 @@
 
 EAPI=7
 
-CROS_WORKON_PROJECT="chromiumos/platform/dm-verity"
-CROS_WORKON_LOCALNAME="platform/verity"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk verity .gn"
 
-inherit cros-workon cros-common.mk
+PLATFORM_SUBDIR="verity"
+
+inherit cros-workon platform
 
 DESCRIPTION="File system integrity image generator for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/dm-verity"
-
-# Override default S as verity source code must be compiled in a directory
-# where the last leaf is 'verity'.
-S="${WORKDIR}/${PN}"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/verity/"
 
 LICENSE="BSD-Google GPL-2"
 KEYWORDS="~*"
-IUSE="test"
-
-RDEPEND=""
-DEPEND="${RDEPEND}
-	test? (
-		dev-cpp/gtest:=
-	)"
 
 src_install() {
 	dolib.a "${OUT}"/libdm-bht.a
@@ -37,3 +30,7 @@
 	into /
 	dobin "${OUT}"/verity
 }
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/verity_tests"
+}
diff --git a/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r736.ebuild b/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r736.ebuild
deleted file mode 100644
index 0a4483e..0000000
--- a/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r736.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "5f87c6733a889c474220215717386858620b647a" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk virtual_file_provider .gn"
-
-PLATFORM_SUBDIR="virtual_file_provider"
-
-inherit cros-workon platform user
-
-DESCRIPTION="D-Bus service to provide virtual file"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/virtual_file_provider"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	sys-fs/fuse:=
-	sys-libs/libcap:=
-"
-
-DEPEND="${RDEPEND}
-	chromeos-base/system_api:="
-
-
-src_install() {
-	dobin "${OUT}"/virtual-file-provider
-	newbin virtual-file-provider-jailed.sh virtual-file-provider-jailed
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.VirtualFileProvider.conf
-
-	insinto /etc/init
-	doins init/virtual-file-provider.conf
-
-	insinto /usr/share/dbus-1/system-services
-	doins org.chromium.VirtualFileProvider.service
-}
-
-pkg_preinst() {
-	enewuser "virtual-file-provider"
-	enewgroup "virtual-file-provider"
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/virtual-file-provider_testrunner"
-}
diff --git a/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r761.ebuild b/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r761.ebuild
new file mode 100644
index 0000000..2101ffe
--- /dev/null
+++ b/chromeos-base/virtual-file-provider/virtual-file-provider-0.0.1-r761.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "1676adb843a617f979c3a8f01cae8370d550b0ab" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk virtual_file_provider .gn"
+
+PLATFORM_SUBDIR="virtual_file_provider"
+
+inherit cros-workon platform user
+
+DESCRIPTION="D-Bus service to provide virtual file"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/virtual_file_provider"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="arcvm"
+
+RDEPEND="
+	sys-fs/fuse:=
+	sys-libs/libcap:=
+"
+
+DEPEND="${RDEPEND}
+	chromeos-base/system_api:="
+
+
+src_install() {
+	dobin "${OUT}"/virtual-file-provider
+	if use arcvm; then
+		newbin virtual-file-provider-jailed-arcvm.sh virtual-file-provider-jailed
+	else
+		newbin virtual-file-provider-jailed.sh virtual-file-provider-jailed
+	fi
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.VirtualFileProvider.conf
+
+	insinto /etc/init
+	doins init/virtual-file-provider.conf
+	doins init/virtual-file-provider-cgroup.conf
+
+	insinto /usr/share/dbus-1/system-services
+	doins org.chromium.VirtualFileProvider.service
+
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_virtual-file-provider
+}
+
+pkg_preinst() {
+	enewuser "virtual-file-provider"
+	enewgroup "virtual-file-provider"
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/virtual-file-provider_testrunner"
+}
diff --git a/chromeos-base/virtual-file-provider/virtual-file-provider-9999.ebuild b/chromeos-base/virtual-file-provider/virtual-file-provider-9999.ebuild
index a01321a..253233f 100644
--- a/chromeos-base/virtual-file-provider/virtual-file-provider-9999.ebuild
+++ b/chromeos-base/virtual-file-provider/virtual-file-provider-9999.ebuild
@@ -18,6 +18,7 @@
 
 LICENSE="BSD-Google"
 KEYWORDS="~*"
+IUSE="arcvm"
 
 RDEPEND="
 	sys-fs/fuse:=
@@ -30,16 +31,24 @@
 
 src_install() {
 	dobin "${OUT}"/virtual-file-provider
-	newbin virtual-file-provider-jailed.sh virtual-file-provider-jailed
+	if use arcvm; then
+		newbin virtual-file-provider-jailed-arcvm.sh virtual-file-provider-jailed
+	else
+		newbin virtual-file-provider-jailed.sh virtual-file-provider-jailed
+	fi
 
 	insinto /etc/dbus-1/system.d
 	doins org.chromium.VirtualFileProvider.conf
 
 	insinto /etc/init
 	doins init/virtual-file-provider.conf
+	doins init/virtual-file-provider-cgroup.conf
 
 	insinto /usr/share/dbus-1/system-services
 	doins org.chromium.VirtualFileProvider.service
+
+	insinto /usr/share/power_manager
+	doins powerd_prefs/suspend_freezer_deps_virtual-file-provider
 }
 
 pkg_preinst() {
diff --git a/chromeos-base/virtual-usb-printer/OWNERS b/chromeos-base/virtual-usb-printer/OWNERS
new file mode 100644
index 0000000..30a10d5
--- /dev/null
+++ b/chromeos-base/virtual-usb-printer/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/virtual-usb-printer:/OWNERS
diff --git a/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r167.ebuild b/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r167.ebuild
deleted file mode 100644
index f10672b..0000000
--- a/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r167.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("795b81ff0fcf530f9b559d839078638addac7e83" "e9f0af485c9ca57565d8fa14b0ccf46123038183")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "47f0a6ede9490bb70f81b195dd50bc5a642618d4")
-CROS_WORKON_LOCALNAME=("platform2" "third_party/virtual-usb-printer")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/virtual-usb-printer")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/virtual-usb-printer")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="virtual-usb-printer"
-
-inherit cros-workon platform
-
-DESCRIPTION="Used with USBIP to provide a virtual USB printer for testing."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/virtual-usb-printer/"
-
-LICENSE="GPL-2"
-KEYWORDS="*"
-
-IUSE=""
-
-RDEPEND="
-	net-misc/usbip:=
-"
-
-DEPEND="${RDEPEND}"
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/escl-manager-testrunner"
-	platform_test "run" "${OUT}/http-util-testrunner"
-	platform_test "run" "${OUT}/ipp-manager-testrunner"
-	platform_test "run" "${OUT}/ipp-util-testrunner"
-	platform_test "run" "${OUT}/load-config-testrunner"
-	platform_test "run" "${OUT}/smart-buffer-testrunner"
-}
-
-src_install() {
-	dobin "${OUT}"/virtual-usb-printer
-	insinto /etc/virtual-usb-printer
-	doins config/escl_capabilities.json
-	doins config/ipp_attributes.json
-	doins config/ippusb_printer.json
-	doins config/usb_printer.json
-}
diff --git a/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r189.ebuild b/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r189.ebuild
new file mode 100644
index 0000000..c72e554
--- /dev/null
+++ b/chromeos-base/virtual-usb-printer/virtual-usb-printer-0.0.1-r189.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "ff6b097b697f8825aa9d921e31f3d074ad65d028")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "16fd1fded20cb204d240fac1532bd6650a3b6299")
+CROS_WORKON_LOCALNAME=("platform2" "third_party/virtual-usb-printer")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/virtual-usb-printer")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/virtual-usb-printer")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="virtual-usb-printer"
+
+inherit cros-workon platform
+
+DESCRIPTION="Used with USBIP to provide a virtual USB printer for testing."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/virtual-usb-printer/"
+
+LICENSE="GPL-2"
+KEYWORDS="*"
+
+IUSE=""
+
+RDEPEND="
+	net-misc/usbip:=
+"
+
+DEPEND="${RDEPEND}"
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/escl-manager-testrunner"
+	platform_test "run" "${OUT}/http-util-testrunner"
+	platform_test "run" "${OUT}/ipp-manager-testrunner"
+	platform_test "run" "${OUT}/ipp-util-testrunner"
+	platform_test "run" "${OUT}/load-config-testrunner"
+	platform_test "run" "${OUT}/smart-buffer-testrunner"
+}
+
+src_install() {
+	dobin "${OUT}"/virtual-usb-printer
+	insinto /etc/virtual-usb-printer
+	doins config/escl_capabilities.json
+	doins config/ipp_attributes.json
+	doins config/ippusb_printer.json
+	doins config/usb_printer.json
+}
diff --git a/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r792.ebuild b/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r792.ebuild
deleted file mode 100644
index ce77e9f..0000000
--- a/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r792.ebuild
+++ /dev/null
@@ -1,116 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="06b968ac8625de66e62c7c1ff9137339f83c86e7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "41567c5dcf798424281b437c0fc07fccbb3311b9" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk vm_tools .gn"
-
-PLATFORM_SUBDIR="vm_tools"
-
-inherit cros-go cros-workon platform user
-
-DESCRIPTION="VM guest tools for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="kvm_guest vm-containers fuzzer vm_borealis"
-
-# This ebuild should only be used on VM guest boards.
-REQUIRED_USE="kvm_guest"
-
-COMMON_DEPEND="
-	!!chromeos-base/vm_tools
-	chromeos-base/minijail:=
-	net-libs/grpc:=
-	dev-libs/protobuf:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	vm-containers? (
-		chromeos-base/crash-reporter
-	)
-	!fuzzer? (
-		chromeos-base/sommelier
-	)
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	dev-go/grpc:=
-	dev-go/protobuf:=
-	sys-kernel/linux-headers:=
-	chromeos-base/vm_protos:=
-"
-
-src_install() {
-	platform_install_compilation_database
-
-	dobin "${OUT}"/vm_syslog
-	dosbin "${OUT}"/vshd
-
-	if use vm-containers; then
-		dobin "${OUT}"/garcon
-		dobin "${OUT}"/guest_service_failure_notifier
-		dobin "${OUT}"/notificationd
-		dobin "${OUT}"/upgrade_container
-		dobin "${OUT}"/virtwl_guest_proxy
-		dobin "${OUT}"/wayland_demo
-		dobin "${OUT}"/x11_demo
-	fi
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_desktop_file_fuzzer \
-		--dict "${S}"/testdata/garcon_desktop_file_fuzzer.dict
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_icon_index_file_fuzzer \
-		--dict "${S}"/testdata/garcon_icon_index_file_fuzzer.dict
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_ini_parse_util_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_mime_types_parser_fuzzer
-
-	into /
-	newsbin "${OUT}"/maitred init
-
-	# Create a folder for process configs to be launched at VM startup.
-	dodir /etc/maitred/
-
-	use fuzzer || dosym /run/resolv.conf /etc/resolv.conf
-
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-	cros-go_src_install
-}
-
-platform_pkg_test() {
-	local tests=(
-		maitred_service_test
-		maitred_syslog_test
-	)
-
-	local container_tests=(
-		garcon_desktop_file_test
-		garcon_icon_index_file_test
-		garcon_icon_finder_test
-		garcon_mime_types_parser_test
-		notificationd_test
-	)
-
-	if use vm-containers; then
-		tests+=( "${container_tests[@]}" )
-	fi
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
-
-pkg_preinst() {
-	# We need the syslog user and group for both host and guest builds.
-	enewuser syslog
-	enewgroup syslog
-}
diff --git a/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r904.ebuild b/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r904.ebuild
new file mode 100644
index 0000000..73551ad
--- /dev/null
+++ b/chromeos-base/vm_guest_tools/vm_guest_tools-0.0.2-r904.ebuild
@@ -0,0 +1,118 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="82a9ae89ce2c3e5ea62f38105c55defd9acddf20"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "b8af0ded8f86dc96331e6fe7044480281dac517b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk vm_tools .gn"
+
+PLATFORM_SUBDIR="vm_tools"
+
+inherit cros-go cros-workon platform user
+
+DESCRIPTION="VM guest tools for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="kvm_guest vm-containers fuzzer vm_borealis"
+
+# This ebuild should only be used on VM guest boards.
+REQUIRED_USE="kvm_guest"
+
+COMMON_DEPEND="
+	!!chromeos-base/vm_tools
+	chromeos-base/minijail:=
+	net-libs/grpc:=
+	dev-libs/protobuf:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	vm-containers? (
+		chromeos-base/crash-reporter
+	)
+	!fuzzer? (
+		chromeos-base/sommelier
+	)
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	dev-go/grpc:=
+	dev-go/protobuf:=
+	sys-kernel/linux-headers:=
+	chromeos-base/vm_protos:=
+"
+
+src_install() {
+	platform_src_install
+
+	dobin "${OUT}"/vm_syslog
+	dosbin "${OUT}"/vshd
+
+	if use vm-containers || use vm_borealis; then
+		dobin "${OUT}"/garcon
+	fi
+	if use vm-containers; then
+		dobin "${OUT}"/guest_service_failure_notifier
+		dobin "${OUT}"/notificationd
+		dobin "${OUT}"/upgrade_container
+		dobin "${OUT}"/virtwl_guest_proxy
+		dobin "${OUT}"/wayland_demo
+		dobin "${OUT}"/x11_demo
+	fi
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_desktop_file_fuzzer \
+		--dict "${S}"/testdata/garcon_desktop_file_fuzzer.dict
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_icon_index_file_fuzzer \
+		--dict "${S}"/testdata/garcon_icon_index_file_fuzzer.dict
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_ini_parse_util_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/garcon_mime_types_parser_fuzzer
+
+	into /
+	newsbin "${OUT}"/maitred init
+
+	# Create a folder for process configs to be launched at VM startup.
+	dodir /etc/maitred/
+
+	use fuzzer || dosym /run/resolv.conf /etc/resolv.conf
+
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+	cros-go_src_install
+}
+
+platform_pkg_test() {
+	local tests=(
+		maitred_service_test
+		maitred_syslog_test
+	)
+
+	local container_tests=(
+		garcon_desktop_file_test
+		garcon_icon_index_file_test
+		garcon_icon_finder_test
+		garcon_mime_types_parser_test
+		notificationd_test
+	)
+
+	if use vm-containers; then
+		tests+=( "${container_tests[@]}" )
+	fi
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
+
+pkg_preinst() {
+	# We need the syslog user and group for both host and guest builds.
+	enewuser syslog
+	enewgroup syslog
+}
diff --git a/chromeos-base/vm_guest_tools/vm_guest_tools-9999.ebuild b/chromeos-base/vm_guest_tools/vm_guest_tools-9999.ebuild
index 4dbbe51..d69d793e 100644
--- a/chromeos-base/vm_guest_tools/vm_guest_tools-9999.ebuild
+++ b/chromeos-base/vm_guest_tools/vm_guest_tools-9999.ebuild
@@ -49,13 +49,15 @@
 "
 
 src_install() {
-	platform_install_compilation_database
+	platform_src_install
 
 	dobin "${OUT}"/vm_syslog
 	dosbin "${OUT}"/vshd
 
-	if use vm-containers; then
+	if use vm-containers || use vm_borealis; then
 		dobin "${OUT}"/garcon
+	fi
+	if use vm-containers; then
 		dobin "${OUT}"/guest_service_failure_notifier
 		dobin "${OUT}"/notificationd
 		dobin "${OUT}"/upgrade_container
diff --git a/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r1063.ebuild b/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r1063.ebuild
new file mode 100644
index 0000000..1071f41
--- /dev/null
+++ b/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r1063.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="82a9ae89ce2c3e5ea62f38105c55defd9acddf20"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515" "b8af0ded8f86dc96331e6fe7044480281dac517b" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="common-mk metrics vm_tools .gn"
+
+PLATFORM_SUBDIR="vm_tools"
+
+inherit cros-workon platform udev user arc-build-constants
+
+DESCRIPTION="VM host tools for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+# The crosvm-wl-dmabuf USE flag is used when preprocessing concierge source.
+IUSE="+kvm_host +seccomp +crosvm-wl-dmabuf fuzzer wilco"
+REQUIRED_USE="kvm_host"
+
+COMMON_DEPEND="
+	app-arch/libarchive:=
+	!!chromeos-base/vm_tools
+	chromeos-base/chunnel:=
+	chromeos-base/crosvm:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	chromeos-base/minijail:=
+	chromeos-base/patchpanel:=
+	chromeos-base/patchpanel-client:=
+	net-libs/grpc:=
+	dev-libs/protobuf:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	dev-rust/9s
+"
+DEPEND="
+	${COMMON_DEPEND}
+	chromeos-base/dlcservice-client:=
+	chromeos-base/shill-client:=
+	chromeos-base/system_api:=[fuzzer?]
+	chromeos-base/vm_protos:=
+	fuzzer? ( dev-libs/libprotobuf-mutator:= )
+"
+
+get_vmlog_forwarder_start_services() {
+	local start_services="starting vm_concierge"
+	if use wilco; then
+		start_services+=" or starting wilco_dtc_dispatcher"
+	fi
+	echo "${start_services}"
+}
+
+get_vmlog_forwarder_stop_services() {
+	local stop_services="stopped vm_concierge"
+	if use wilco; then
+		stop_services+=" and stopped wilco_dtc_dispatcher"
+	fi
+	echo "${stop_services}"
+}
+
+pkg_setup() {
+	# Duplicated from the crosvm ebuild. These are necessary here in order
+	# to create the daemon-store folder for concierge in src_install().
+	enewuser crosvm
+	enewgroup crosvm
+	enewuser pluginvm
+	cros-workon_pkg_setup
+}
+
+src_install() {
+	platform_src_install
+
+	dobin "${OUT}"/cicerone_client
+	dobin "${OUT}"/concierge_client
+	dobin "${OUT}"/maitred_client
+	dobin "${OUT}"/seneschal
+	dobin "${OUT}"/seneschal_client
+	dobin "${OUT}"/vm_cicerone
+	dobin "${OUT}"/vm_concierge
+	dobin "${OUT}"/vmlog_forwarder
+	dobin "${OUT}"/vsh
+
+	if use arcvm; then
+		arc-build-constants-configure
+		exeinto "${ARC_VM_VENDOR_DIR}/bin"
+		doexe "${OUT}"/vshd
+	fi
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/cicerone_container_listener_fuzzer
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/vsh_client_fuzzer
+
+	# Install header for passing USB devices to plugin VMs.
+	insinto /usr/include/vm_concierge
+	doins concierge/plugin_vm_usb.h
+
+	insinto /etc/init
+	doins init/seneschal.conf
+	doins init/vm_cicerone.conf
+	doins init/vm_concierge.conf
+
+	# Modify vmlog_forwarder starting and stopping conditions based on USE flags.
+	sed \
+		"-e s,@dependent_start_services@,$(get_vmlog_forwarder_start_services),"\
+		"-e s,@dependent_stop_services@,$(get_vmlog_forwarder_stop_services)," \
+		init/vmlog_forwarder.conf.in | newins - vmlog_forwarder.conf
+
+	insinto /etc/dbus-1/system.d
+	doins dbus/*.conf
+
+	insinto /usr/local/vms/etc
+	doins init/arcvm_dev.conf
+
+	# TODO(b/159953121): File and steps below should be removed later.
+	insinto /etc
+	newins init/arcvm_dev.conf_deprecated arcvm_dev.conf
+
+	insinto /usr/share/policy
+	if use seccomp; then
+		newins "init/vm_cicerone-seccomp-${ARCH}.policy" vm_cicerone-seccomp.policy
+	fi
+
+	udev_dorules udev/99-vm.rules
+
+	keepdir /opt/google/vms
+
+	# Create daemon store folder for crosvm and pvm
+	local crosvm_store="/etc/daemon-store/crosvm"
+	dodir "${crosvm_store}"
+	fperms 0700 "${crosvm_store}"
+	fowners crosvm:crosvm "${crosvm_store}"
+
+	local pvm_store="/etc/daemon-store/pvm"
+	dodir "${pvm_store}"
+	fperms 0770 "${pvm_store}"
+	fowners pluginvm:crosvm "${pvm_store}"
+}
+
+platform_pkg_test() {
+	local tests=(
+		cicerone_test
+		concierge_test
+		syslog_forwarder_test
+	)
+
+	# Running a gRPC server under qemu-user causes flake, at least with the
+	# combination of gRPC 1.16.1 and qemu 3.0.0. Disable TerminaVmTest.* while
+	# running under qemu to avoid triggering this flake.
+	# TODO(crbug.com/1066425): Reenable gRPC server tests under qemu-user.
+	local qemu_gtest_filter="-TerminaVmTest.*"
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}" "0" "" "${qemu_gtest_filter}"
+	done
+}
+
+pkg_preinst() {
+	# We need the syslog user and group for both host and guest builds.
+	enewuser syslog
+	enewgroup syslog
+
+	enewuser vm_cicerone
+	enewgroup vm_cicerone
+
+	enewuser seneschal
+	enewgroup seneschal
+	enewuser seneschal-dbus
+	enewgroup seneschal-dbus
+
+	enewuser pluginvm
+	enewgroup pluginvm
+
+	enewgroup virtaccess
+}
diff --git a/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r941.ebuild b/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r941.ebuild
deleted file mode 100644
index a970df9..0000000
--- a/chromeos-base/vm_host_tools/vm_host_tools-0.0.2-r941.ebuild
+++ /dev/null
@@ -1,155 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="06b968ac8625de66e62c7c1ff9137339f83c86e7"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d" "41567c5dcf798424281b437c0fc07fccbb3311b9" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="common-mk metrics vm_tools .gn"
-
-PLATFORM_SUBDIR="vm_tools"
-
-inherit cros-workon platform udev user arc-build-constants
-
-DESCRIPTION="VM host tools for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-# The crosvm-wl-dmabuf USE flag is used when preprocessing concierge source.
-IUSE="+kvm_host +seccomp +crosvm-wl-dmabuf fuzzer wilco"
-REQUIRED_USE="kvm_host"
-
-COMMON_DEPEND="
-	app-arch/libarchive:=
-	!!chromeos-base/vm_tools
-	chromeos-base/chunnel:=
-	chromeos-base/crosvm:=
-	chromeos-base/metrics:=
-	chromeos-base/minijail:=
-	chromeos-base/patchpanel:=
-	net-libs/grpc:=
-	dev-libs/protobuf:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	dev-rust/9s
-"
-DEPEND="
-	${COMMON_DEPEND}
-	chromeos-base/shill-client:=
-	chromeos-base/system_api:=[fuzzer?]
-	chromeos-base/vm_protos:=
-	fuzzer? ( dev-libs/libprotobuf-mutator:= )
-"
-
-get_vmlog_forwarder_start_services() {
-	local start_services="starting vm_concierge"
-	if use wilco; then
-		start_services+=" or starting wilco_dtc_dispatcher"
-	fi
-	echo "${start_services}"
-}
-
-get_vmlog_forwarder_stop_services() {
-	local stop_services="stopped vm_concierge"
-	if use wilco; then
-		stop_services+=" and stopped wilco_dtc_dispatcher"
-	fi
-	echo "${stop_services}"
-}
-
-src_install() {
-	platform_install_compilation_database
-
-	dobin "${OUT}"/cicerone_client
-	dobin "${OUT}"/concierge_client
-	dobin "${OUT}"/maitred_client
-	dobin "${OUT}"/seneschal
-	dobin "${OUT}"/seneschal_client
-	dobin "${OUT}"/vm_cicerone
-	dobin "${OUT}"/vm_concierge
-	dobin "${OUT}"/vmlog_forwarder
-	dobin "${OUT}"/vsh
-
-	if use arcvm; then
-		arc-build-constants-configure
-		exeinto "${ARC_VM_VENDOR_DIR}/bin"
-		doexe "${OUT}"/vshd
-	fi
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/cicerone_container_listener_fuzzer
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/vsh_client_fuzzer
-
-	# Install header for passing USB devices to plugin VMs.
-	insinto /usr/include/vm_concierge
-	doins concierge/plugin_vm_usb.h
-
-	insinto /etc/init
-	doins init/seneschal.conf
-	doins init/vm_cicerone.conf
-	doins init/vm_concierge.conf
-
-	# Modify vmlog_forwarder starting and stopping conditions based on USE flags.
-	sed \
-		"-e s,@dependent_start_services@,$(get_vmlog_forwarder_start_services),"\
-		"-e s,@dependent_stop_services@,$(get_vmlog_forwarder_stop_services)," \
-		init/vmlog_forwarder.conf.in | newins - vmlog_forwarder.conf
-
-	insinto /etc/dbus-1/system.d
-	doins dbus/*.conf
-
-	insinto /etc
-	doins init/arcvm_dev.conf
-
-	insinto /usr/share/policy
-	if use seccomp; then
-		newins "init/vm_cicerone-seccomp-${ARCH}.policy" vm_cicerone-seccomp.policy
-	fi
-
-	udev_dorules udev/99-vm.rules
-
-	keepdir /opt/google/vms
-}
-
-platform_pkg_test() {
-	local tests=(
-		cicerone_test
-		concierge_test
-		syslog_forwarder_test
-	)
-
-	# Running a gRPC server under qemu-user causes flake, at least with the
-	# combination of gRPC 1.16.1 and qemu 3.0.0. Disable TerminaVmTest.* while
-	# running under qemu to avoid triggering this flake.
-	# TODO(crbug.com/1066425): Reenable gRPC server tests under qemu-user.
-	local qemu_gtest_filter="-TerminaVmTest.*"
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}" "0" "" "${qemu_gtest_filter}"
-	done
-}
-
-pkg_preinst() {
-	# We need the syslog user and group for both host and guest builds.
-	enewuser syslog
-	enewgroup syslog
-
-	enewuser vm_cicerone
-	enewgroup vm_cicerone
-
-	enewuser seneschal
-	enewgroup seneschal
-	enewuser seneschal-dbus
-	enewgroup seneschal-dbus
-
-	enewuser pluginvm
-	enewgroup pluginvm
-
-	enewgroup virtaccess
-}
diff --git a/chromeos-base/vm_host_tools/vm_host_tools-9999.ebuild b/chromeos-base/vm_host_tools/vm_host_tools-9999.ebuild
index 4758b399..70aa329 100644
--- a/chromeos-base/vm_host_tools/vm_host_tools-9999.ebuild
+++ b/chromeos-base/vm_host_tools/vm_host_tools-9999.ebuild
@@ -27,9 +27,10 @@
 	!!chromeos-base/vm_tools
 	chromeos-base/chunnel:=
 	chromeos-base/crosvm:=
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	chromeos-base/minijail:=
 	chromeos-base/patchpanel:=
+	chromeos-base/patchpanel-client:=
 	net-libs/grpc:=
 	dev-libs/protobuf:=
 "
@@ -40,6 +41,7 @@
 "
 DEPEND="
 	${COMMON_DEPEND}
+	chromeos-base/dlcservice-client:=
 	chromeos-base/shill-client:=
 	chromeos-base/system_api:=[fuzzer?]
 	chromeos-base/vm_protos:=
@@ -62,8 +64,17 @@
 	echo "${stop_services}"
 }
 
+pkg_setup() {
+	# Duplicated from the crosvm ebuild. These are necessary here in order
+	# to create the daemon-store folder for concierge in src_install().
+	enewuser crosvm
+	enewgroup crosvm
+	enewuser pluginvm
+	cros-workon_pkg_setup
+}
+
 src_install() {
-	platform_install_compilation_database
+	platform_src_install
 
 	dobin "${OUT}"/cicerone_client
 	dobin "${OUT}"/concierge_client
@@ -102,9 +113,13 @@
 	insinto /etc/dbus-1/system.d
 	doins dbus/*.conf
 
-	insinto /etc
+	insinto /usr/local/vms/etc
 	doins init/arcvm_dev.conf
 
+	# TODO(b/159953121): File and steps below should be removed later.
+	insinto /etc
+	newins init/arcvm_dev.conf_deprecated arcvm_dev.conf
+
 	insinto /usr/share/policy
 	if use seccomp; then
 		newins "init/vm_cicerone-seccomp-${ARCH}.policy" vm_cicerone-seccomp.policy
@@ -113,6 +128,17 @@
 	udev_dorules udev/99-vm.rules
 
 	keepdir /opt/google/vms
+
+	# Create daemon store folder for crosvm and pvm
+	local crosvm_store="/etc/daemon-store/crosvm"
+	dodir "${crosvm_store}"
+	fperms 0700 "${crosvm_store}"
+	fowners crosvm:crosvm "${crosvm_store}"
+
+	local pvm_store="/etc/daemon-store/pvm"
+	dodir "${pvm_store}"
+	fperms 0770 "${pvm_store}"
+	fowners pluginvm:crosvm "${pvm_store}"
 }
 
 platform_pkg_test() {
diff --git a/chromeos-base/vm_protos/vm_protos-0.0.1-r116.ebuild b/chromeos-base/vm_protos/vm_protos-0.0.1-r116.ebuild
deleted file mode 100644
index bbbe153..0000000
--- a/chromeos-base/vm_protos/vm_protos-0.0.1-r116.ebuild
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="378a542fb56ab76c32481438dc38dc070d1da83f"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "1469d221842993bd1831bcd0c6e978819766a043" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_GO_PACKAGES=(
-	"chromiumos/vm_tools/..."
-)
-
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk vm_tools/proto .gn"
-
-PLATFORM_SUBDIR="vm_tools/proto"
-
-inherit cros-go cros-workon platform
-
-DESCRIPTION="Chrome OS VM protobuf API"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/proto"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-RDEPEND="
-	dev-libs/protobuf:=
-	net-libs/grpc:=
-	!<chromeos-base/vm_guest_tools-0.0.2
-	!<chromeos-base/vm_host_tools-0.0.2
-"
-DEPEND="
-	${RDEPEND}
-	dev-go/protobuf:=
-	dev-go/grpc:=
-"
-
-src_unpack() {
-	platform_src_unpack
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-}
-
-src_install() {
-	insinto /usr/"$(get_libdir)"/pkgconfig
-	doins vm_protos.pc
-
-	insinto /usr/include/vm_protos/proto_bindings
-	doins "${OUT}"/gen/include/vm_protos/proto_bindings/*.h
-
-	dolib.a "${OUT}"/*.a
-
-	cros-go_src_install
-}
diff --git a/chromeos-base/vm_protos/vm_protos-0.0.1-r147.ebuild b/chromeos-base/vm_protos/vm_protos-0.0.1-r147.ebuild
new file mode 100644
index 0000000..773edb0
--- /dev/null
+++ b/chromeos-base/vm_protos/vm_protos-0.0.1-r147.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "da350fc60de0552464dd2de9e1fd534b0901626c" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_GO_PACKAGES=(
+	"chromiumos/vm_tools/..."
+)
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk vm_tools/proto .gn"
+
+PLATFORM_SUBDIR="vm_tools/proto"
+
+inherit cros-go cros-workon platform
+
+DESCRIPTION="Chrome OS VM protobuf API"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/proto"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+RDEPEND="
+	dev-libs/protobuf:=
+	net-libs/grpc:=
+	!<chromeos-base/vm_guest_tools-0.0.2
+	!<chromeos-base/vm_host_tools-0.0.2
+"
+DEPEND="
+	${RDEPEND}
+	dev-go/protobuf:=
+	dev-go/grpc:=
+"
+
+src_unpack() {
+	platform_src_unpack
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+}
+
+src_install() {
+	insinto /usr/"$(get_libdir)"/pkgconfig
+	doins vm_protos.pc
+
+	insinto /usr/include/vm_protos/proto_bindings
+	doins "${OUT}"/gen/include/vm_protos/proto_bindings/*.h
+
+	dolib.a "${OUT}"/*.a
+
+	cros-go_src_install
+}
diff --git a/chromeos-base/vpd/vpd-0.0.1-r141.ebuild b/chromeos-base/vpd/vpd-0.0.1-r141.ebuild
deleted file mode 100644
index 8b87525..0000000
--- a/chromeos-base/vpd/vpd-0.0.1-r141.ebuild
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="ca383a5b979e1f1f065bc27b6e24faf2fa844513"
-CROS_WORKON_TREE="a6e5da158ddf7a1cf320330188ce4c112c23bbdc"
-CROS_WORKON_PROJECT="chromiumos/platform/vpd"
-CROS_WORKON_LOCALNAME="platform/vpd"
-
-inherit cros-workon systemd
-
-DESCRIPTION="ChromeOS vital product data utilities"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vpd/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="static systemd"
-
-# util-linux is for libuuid.
-DEPEND="sys-apps/util-linux:="
-# shflags for dump_vpd_log.
-# chromeos-activate-date for ActivateDate upstart and script.
-RDEPEND="
-	sys-apps/flashrom
-	dev-util/shflags
-	virtual/chromeos-activate-date
-	"
-
-src_compile() {
-	tc-export CC
-	use static && append-ldflags -static
-	emake all
-}
-
-src_install() {
-	# This target list should be architecture specific
-	# (no ACPI stuff on ARM for instance)
-	dosbin vpd vpd_s
-	dosbin util/check_rw_vpd util/dump_vpd_log util/update_rw_vpd
-	dosbin util/vpd_get_value
-
-	# install the init script
-	if use systemd; then
-		systemd_dounit init/vpd-log.service
-		systemd_enable_service boot-services.target vpd-log.service
-	else
-		insinto /etc/init
-		doins init/check-rw-vpd.conf
-		doins init/vpd-log.conf
-	fi
-}
-
-src_test() {
-	if ! use x86 && ! use amd64; then
-		ewarn "Skipping unittests for non-x86 arches"
-		return
-	fi
-	emake test
-}
diff --git a/chromeos-base/vpd/vpd-0.0.1-r142.ebuild b/chromeos-base/vpd/vpd-0.0.1-r142.ebuild
new file mode 100644
index 0000000..717eeff
--- /dev/null
+++ b/chromeos-base/vpd/vpd-0.0.1-r142.ebuild
@@ -0,0 +1,60 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="0ccc467d8a29eaab9e7d84de0a673a3e93fddb47"
+CROS_WORKON_TREE="d29b8b1ff2b87fdb3142e8d6eedff5059831728e"
+CROS_WORKON_PROJECT="chromiumos/platform/vpd"
+CROS_WORKON_LOCALNAME="platform/vpd"
+
+inherit cros-workon systemd
+
+DESCRIPTION="ChromeOS vital product data utilities"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/vpd/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="static systemd"
+
+# util-linux is for libuuid.
+DEPEND="sys-apps/util-linux:="
+# shflags for dump_vpd_log.
+# chromeos-activate-date for ActivateDate upstart and script.
+RDEPEND="
+	sys-apps/flashrom
+	dev-util/shflags
+	virtual/chromeos-activate-date
+	"
+
+src_compile() {
+	tc-export CC
+	use static && append-ldflags -static
+	emake all
+}
+
+src_install() {
+	# This target list should be architecture specific
+	# (no ACPI stuff on ARM for instance)
+	dosbin vpd vpd_s
+	dosbin util/check_rw_vpd util/dump_vpd_log util/update_rw_vpd
+	dosbin util/vpd_get_value util/vpd_icc
+
+	# install the init script
+	if use systemd; then
+		systemd_dounit init/vpd-log.service
+		systemd_enable_service boot-services.target vpd-log.service
+	else
+		insinto /etc/init
+		doins init/check-rw-vpd.conf
+		doins init/vpd-log.conf
+	fi
+}
+
+src_test() {
+	if ! use x86 && ! use amd64; then
+		ewarn "Skipping unittests for non-x86 arches"
+		return
+	fi
+	emake test
+}
diff --git a/chromeos-base/vpd/vpd-9999.ebuild b/chromeos-base/vpd/vpd-9999.ebuild
index b0edbfb..4c6eb7a 100644
--- a/chromeos-base/vpd/vpd-9999.ebuild
+++ b/chromeos-base/vpd/vpd-9999.ebuild
@@ -36,7 +36,7 @@
 	# (no ACPI stuff on ARM for instance)
 	dosbin vpd vpd_s
 	dosbin util/check_rw_vpd util/dump_vpd_log util/update_rw_vpd
-	dosbin util/vpd_get_value
+	dosbin util/vpd_get_value util/vpd_icc
 
 	# install the init script
 	if use systemd; then
diff --git a/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2723.ebuild b/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2723.ebuild
deleted file mode 100644
index bbcd143..0000000
--- a/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2723.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "3beedc5f4dfdaee00a216accee58e807058e10fe" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk vpn-manager .gn"
-
-PLATFORM_SUBDIR="vpn-manager"
-
-inherit cros-workon platform
-
-DESCRIPTION="L2TP/IPsec VPN manager for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vpn-manager/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	net-dialup/ppp:=
-	net-dialup/xl2tpd:=
-	net-vpn/strongswan:=
-"
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	insinto /usr/include/chromeos/vpn-manager
-	doins service_error.h
-	dosbin "${OUT}"/l2tpipsec_vpn
-	exeinto /usr/libexec/l2tpipsec_vpn
-	doexe bin/pluto_updown
-
-	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/vpn_manager_service_manager_fuzzer
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}"/vpn_manager_test
-}
diff --git a/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2744.ebuild b/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2744.ebuild
new file mode 100644
index 0000000..e93ccaf
--- /dev/null
+++ b/chromeos-base/vpn-manager/vpn-manager-0.0.1-r2744.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "963e076a0b7311a4a5e1c14646f9a5d50c209ef7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk vpn-manager .gn"
+
+PLATFORM_SUBDIR="vpn-manager"
+
+inherit cros-workon platform
+
+DESCRIPTION="L2TP/IPsec VPN manager for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vpn-manager/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	net-dialup/ppp:=
+	net-dialup/xl2tpd:=
+	net-vpn/strongswan:=
+"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	insinto /usr/include/chromeos/vpn-manager
+	doins service_error.h
+	dosbin "${OUT}"/l2tpipsec_vpn
+	exeinto /usr/libexec/l2tpipsec_vpn
+	doexe bin/pluto_updown
+
+	platform_fuzzer_install "${S}"/OWNERS "${OUT}"/vpn_manager_service_manager_fuzzer
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}"/vpn_manager_test
+}
diff --git a/chromeos-base/webserver/webserver-0.0.1-r2226.ebuild b/chromeos-base/webserver/webserver-0.0.1-r2226.ebuild
deleted file mode 100644
index 995666e..0000000
--- a/chromeos-base/webserver/webserver-0.0.1-r2226.ebuild
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="e120a38324e6a4f913141f6cf31bccdb4d17caa2"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "420573281f25e737e0f006ae23a329b3b1402457" "d497496b2f212c664da45d40ac141034d6d973e7" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE="common-mk permission_broker webserver .gn"
-
-PLATFORM_SUBDIR="webserver"
-
-inherit cros-workon platform user
-
-DESCRIPTION="HTTP sever interface library"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/webserver/"
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/permission_broker:=
-	net-libs/libmicrohttpd:=
-	!chromeos-base/libwebserv:=
-"
-
-DEPEND="
-	${RDEPEND}
-	chromeos-base/permission_broker-client:=
-"
-
-pkg_preinst() {
-	# Create user and group for webservd.
-	enewuser "webservd"
-	enewgroup "webservd"
-}
-
-src_install() {
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	local v="$(libchrome_ver)"
-	libwebserv/preinstall.sh "${OUT}" "${v}"
-	dolib.so "${OUT}/lib/libwebserv-${v}.so"
-	doins "${OUT}/lib/libwebserv-${v}.pc"
-
-	# Install header files from libwebserv
-	insinto /usr/include/libwebserv
-	doins libwebserv/*.h
-
-	# Install init scripts for webservd.
-	insinto /etc/init
-	doins webservd/etc/init/webservd.conf
-
-	# Install DBus configuration files.
-	insinto /etc/dbus-1/system.d
-	doins webservd/etc/dbus-1/org.chromium.WebServer.conf
-
-	# Install seccomp filter for webservd.
-	insinto /usr/share/filters
-	doins webservd/usr/share/filters/webservd-seccomp.policy
-
-	# Install web server daemon.
-	dobin "${OUT}"/webservd
-}
-
-platform_pkg_test() {
-	local tests=(
-		libwebserv_testrunner
-		webservd_testrunner
-	)
-
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" "${OUT}/${test_bin}"
-	done
-}
diff --git a/chromeos-base/webserver/webserver-0.0.1-r2253.ebuild b/chromeos-base/webserver/webserver-0.0.1-r2253.ebuild
new file mode 100644
index 0000000..f782ef8
--- /dev/null
+++ b/chromeos-base/webserver/webserver-0.0.1-r2253.ebuild
@@ -0,0 +1,78 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94" "50e9dc623218d8d83e7026964cd935e650879c96" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE="common-mk permission_broker webserver .gn"
+
+PLATFORM_SUBDIR="webserver"
+
+inherit cros-workon platform user
+
+DESCRIPTION="HTTP sever interface library"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/webserver/"
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/permission_broker:=
+	net-libs/libmicrohttpd:=
+	!chromeos-base/libwebserv:=
+"
+
+DEPEND="
+	${RDEPEND}
+	chromeos-base/permission_broker-client:=
+"
+
+pkg_preinst() {
+	# Create user and group for webservd.
+	enewuser "webservd"
+	enewgroup "webservd"
+}
+
+src_install() {
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	local v="$(libchrome_ver)"
+	libwebserv/preinstall.sh "${OUT}" "${v}"
+	dolib.so "${OUT}/lib/libwebserv-${v}.so"
+	doins "${OUT}/lib/libwebserv-${v}.pc"
+
+	# Install header files from libwebserv
+	insinto /usr/include/libwebserv
+	doins libwebserv/*.h
+
+	# Install init scripts for webservd.
+	insinto /etc/init
+	doins webservd/etc/init/webservd.conf
+
+	# Install DBus configuration files.
+	insinto /etc/dbus-1/system.d
+	doins webservd/etc/dbus-1/org.chromium.WebServer.conf
+
+	# Install seccomp filter for webservd.
+	insinto /usr/share/filters
+	doins webservd/usr/share/filters/webservd-seccomp.policy
+
+	# Install web server daemon.
+	dobin "${OUT}"/webservd
+}
+
+platform_pkg_test() {
+	local tests=(
+		libwebserv_testrunner
+		webservd_testrunner
+	)
+
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" "${OUT}/${test_bin}"
+	done
+}
diff --git a/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r104.ebuild b/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r104.ebuild
new file mode 100644
index 0000000..e932ea2
--- /dev/null
+++ b/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r104.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "bf3184eecb9926a81042768d016ede2399b2a52f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_GO_PACKAGES=(
+	"chromiumos/wilco_dtc/..."
+)
+
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk diagnostics/grpc .gn"
+
+PLATFORM_SUBDIR="diagnostics/grpc"
+
+WANT_LIBCHROME="no"
+WANT_LIBBRILLO="no"
+inherit cros-go cros-workon platform
+
+DESCRIPTION="Chrome OS Wilco DTC proto/gRPC API"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/grpc"
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	dev-libs/protobuf:=
+	net-libs/grpc:=
+"
+DEPEND="
+	${RDEPEND}
+	dev-go/protobuf
+	dev-go/grpc
+"
+
+src_unpack() {
+	platform_src_unpack
+	CROS_GO_WORKSPACE="${OUT}/gen/go"
+}
+
+src_install() {
+	insinto /usr/"$(get_libdir)"/pkgconfig
+	doins wilco_dtc_grpc_protos.pc
+
+	insinto /usr/include/wilco_dtc/proto_bindings
+	doins "${OUT}"/gen/include/*.h
+
+	dolib.a "${OUT}"/*.a
+
+	cros-go_src_install
+}
diff --git a/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r84.ebuild b/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r84.ebuild
deleted file mode 100644
index 25cf2b1..0000000
--- a/chromeos-base/wilco-dtc-grpc-protos/wilco-dtc-grpc-protos-0.0.1-r84.ebuild
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "bf3184eecb9926a81042768d016ede2399b2a52f" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_GO_PACKAGES=(
-	"chromiumos/wilco_dtc/..."
-)
-
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk diagnostics/grpc .gn"
-
-PLATFORM_SUBDIR="diagnostics/grpc"
-
-WANT_LIBCHROME="no"
-WANT_LIBBRILLO="no"
-inherit cros-go cros-workon platform
-
-DESCRIPTION="Chrome OS Wilco DTC proto/gRPC API"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/grpc"
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	dev-libs/protobuf:=
-	net-libs/grpc:=
-"
-DEPEND="
-	${RDEPEND}
-	dev-go/protobuf
-	dev-go/grpc
-"
-
-src_unpack() {
-	platform_src_unpack
-	CROS_GO_WORKSPACE="${OUT}/gen/go"
-}
-
-src_install() {
-	insinto /usr/"$(get_libdir)"/pkgconfig
-	doins wilco_dtc_grpc_protos.pc
-
-	insinto /usr/include/wilco_dtc/proto_bindings
-	doins "${OUT}"/gen/include/*.h
-
-	dolib.a "${OUT}"/*.a
-
-	cros-go_src_install
-}
diff --git a/chromeos/binhost/host/sdk_version.conf b/chromeos/binhost/host/sdk_version.conf
index 86f9c25..3fc41ee 100644
--- a/chromeos/binhost/host/sdk_version.conf
+++ b/chromeos/binhost/host/sdk_version.conf
@@ -1,8 +1,8 @@
 # The last version of the sdk that we built & tested.
-SDK_LATEST_VERSION="2020.07.06.180703"
+SDK_LATEST_VERSION="2020.10.01.074010"
 
 # How to find the standalone toolchains from the above sdk.
-TC_PATH="2020/07/%(target)s-2020.07.06.180703.tar.xz"
+TC_PATH="2020/10/%(target)s-2020.10.01.074010.tar.xz"
 
 # Frozen version of SDK used for bootstrapping.
 # If unset, SDK_LATEST_VERSION will be used for bootstrapping.
diff --git a/chromeos/binhost/target/amd64-generic-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/amd64-generic-POSTSUBMIT_BINHOST.conf
index 1544221..987f4f3 100644
--- a/chromeos/binhost/target/amd64-generic-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/amd64-generic-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/amd64-generic/postsubmit-R86-13332.0.0-34899-8875390338779361232/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/amd64-generic/postsubmit-R87-13505.0.0-38839-8867541388472859424/packages"
\ No newline at end of file
diff --git a/chromeos/binhost/target/arm-generic-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/arm-generic-POSTSUBMIT_BINHOST.conf
index 6b0d04c..e07b6b0 100644
--- a/chromeos/binhost/target/arm-generic-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/arm-generic-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/arm-generic/postsubmit-R86-13333.0.0-34918-8875354765860784208/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/arm-generic/postsubmit-R87-13505.0.0-38839-8867541318862372672/packages"
\ No newline at end of file
diff --git a/chromeos/binhost/target/arm64-generic-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/arm64-generic-POSTSUBMIT_BINHOST.conf
index 17ba03c..be0a3ca 100644
--- a/chromeos/binhost/target/arm64-generic-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/arm64-generic-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/arm64-generic/postsubmit-R86-13333.0.0-34918-8875354706445557328/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/arm64-generic/postsubmit-R87-13505.0.0-38839-8867541260276626816/packages"
\ No newline at end of file
diff --git a/chromeos/binhost/target/mistral-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/mistral-POSTSUBMIT_BINHOST.conf
index c377b9d..0d7e6d8 100644
--- a/chromeos/binhost/target/mistral-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/mistral-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/mistral/postsubmit-R86-13333.0.0-34918-8875354089386832240/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/mistral/postsubmit-R87-13505.0.0-38839-8867540551996778944/packages"
\ No newline at end of file
diff --git a/chromeos/binhost/target/tael-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/tael-POSTSUBMIT_BINHOST.conf
index 3ab6cc5..e7181d9 100644
--- a/chromeos/binhost/target/tael-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/tael-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/tael/postsubmit-R86-13333.0.0-34918-8875353847272549760/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/tael/postsubmit-R87-13505.0.0-38839-8867540299316961968/packages"
\ No newline at end of file
diff --git a/chromeos/binhost/target/tatl-POSTSUBMIT_BINHOST.conf b/chromeos/binhost/target/tatl-POSTSUBMIT_BINHOST.conf
index 047d307..c7a7a8a 100644
--- a/chromeos/binhost/target/tatl-POSTSUBMIT_BINHOST.conf
+++ b/chromeos/binhost/target/tatl-POSTSUBMIT_BINHOST.conf
@@ -1 +1 @@
-POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/tatl/postsubmit-R86-13333.0.0-34918-8875353838112597760/packages"
\ No newline at end of file
+POSTSUBMIT_BINHOST="gs://chromeos-prebuilt/board/tatl/postsubmit-R87-13505.0.0-38839-8867540292940086752/packages"
\ No newline at end of file
diff --git a/chromeos/config/chromeos_version.sh b/chromeos/config/chromeos_version.sh
index 2e932f8..40322ae 100755
--- a/chromeos/config/chromeos_version.sh
+++ b/chromeos/config/chromeos_version.sh
@@ -15,7 +15,7 @@
 if [ -z "${FLAGS_version}" ]; then
   # Release Build number.
   # Increment by 1 for every release build.
-  CHROMEOS_BUILD=13334
+  CHROMEOS_BUILD=13506
 
   # Release Branch number.
   # Increment by 1 for every release build on a branch.
@@ -45,7 +45,7 @@
 fi
 
 # Major version for Chrome.
-CHROME_BRANCH=86
+CHROME_BRANCH=88
 # Set CHROME values (Used for releases) to pass to chromeos-chrome-bin ebuild
 # URL to chrome archive
 CHROME_BASE=
diff --git a/chromeos/config/env/app-emulation/qemu b/chromeos/config/env/app-emulation/qemu
index 3a2806e..2a2edc5 100644
--- a/chromeos/config/env/app-emulation/qemu
+++ b/chromeos/config/env/app-emulation/qemu
@@ -2,9 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# Build qemu with bfd linker temporarily, http://crbug.com/1035694
-cros_pre_src_configure_use_bfd() {
-	append-ldflags "-fuse-ld=bfd" || die
-	# Disable ICF because BFD does not support it, https://crbug.com/1022226
-	filter-ldflags "-Wl,--icf=all"
+cros_pre_src_prepare_qemu_cflags() {
+	# TODO(crbug.com/1103492): Temporary disable new pass manager.
+	append-cflags "-fno-experimental-new-pass-manager" || die
 }
diff --git a/chromeos/config/env/chromeos-base/dummy-dlc b/chromeos/config/env/chromeos-base/dummy-dlc
deleted file mode 100644
index 34007a8..0000000
--- a/chromeos/config/env/chromeos-base/dummy-dlc
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Exclude build files from the tarball.
-PKG_INSTALL_MASK+=" /build/rootfs/dlc"
diff --git a/chromeos/config/env/dev-db/sqlite b/chromeos/config/env/dev-db/sqlite
index c06d5ed..fff5ab0 100644
--- a/chromeos/config/env/dev-db/sqlite
+++ b/chromeos/config/env/dev-db/sqlite
@@ -11,3 +11,8 @@
   INSTALL_MASK+=" ${sqlite_mask}"
   unset sqlite_mask
 fi
+
+# Sqlite is hot, so we should be optimizing it for speed.
+cros_pre_src_prepare_enable_optimizations() {
+  cros_optimize_package_for_speed
+}
diff --git a/chromeos/config/env/sys-block/thin-provisioning-tools b/chromeos/config/env/sys-block/thin-provisioning-tools
new file mode 100644
index 0000000..52cc67f
--- /dev/null
+++ b/chromeos/config/env/sys-block/thin-provisioning-tools
@@ -0,0 +1,7 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+cros_pre_src_prepare_enable_cxx_exceptions() {
+	cros_enable_cxx_exceptions
+}
diff --git a/chromeos/config/env/sys-libs/timezone-data b/chromeos/config/env/sys-libs/timezone-data
index 693fde7..4c6dc57 100644
--- a/chromeos/config/env/sys-libs/timezone-data
+++ b/chromeos/config/env/sys-libs/timezone-data
@@ -12,4 +12,8 @@
 	PKG_INSTALL_MASK+=" ${timezone_mask}"
 	INSTALL_MASK+=" ${timezone_mask}"
 	unset timezone_mask
+
+	# Disable default timezone selection.  The chromeos-base package will
+	# create a symlink at /etc/localtime instead.
+	get_TIMEZONE() { return 1; }
 fi
diff --git a/chromeos/config/make.conf.amd64-host b/chromeos/config/make.conf.amd64-host
index aed8423..b294e27 100644
--- a/chromeos/config/make.conf.amd64-host
+++ b/chromeos/config/make.conf.amd64-host
@@ -3,9 +3,6 @@
 # Common settings across all sdks.
 source /mnt/host/source/src/third_party/chromiumos-overlay/chromeos/config/make.conf.common
 
-# Since our portage comes from version control, we redirect distfiles
-DISTDIR="/var/lib/portage/distfiles"
-
 # We initialize PORTDIR_OVERLAY here to clobber any redefinitions elsewhere.
 # This has to be the first overlay so crossdev finds the correct gcc and 
 # glibc ebuilds.
@@ -21,7 +18,7 @@
 PORT_LOGDIR="/var/log/portage"
 
 source /usr/local/portage/chromiumos/chromeos/binhost/host/amd64-PREFLIGHT_BINHOST.conf
-FULL_BINHOST="gs://chromeos-prebuilt/host/amd64/amd64-host/chroot-2020.07.06.180703/packages/"
+FULL_BINHOST="gs://chromeos-prebuilt/host/amd64/amd64-host/chroot-2020.10.01.074010/packages/"
 PORTAGE_BINHOST="$PREFLIGHT_BINHOST $FULL_BINHOST"
 
 GENTOO_MIRRORS="https://commondatastorage.googleapis.com/chromeos-localmirror"
diff --git a/chromeos/config/make.conf.common b/chromeos/config/make.conf.common
index f060e82..4e14c69 100644
--- a/chromeos/config/make.conf.common
+++ b/chromeos/config/make.conf.common
@@ -29,6 +29,9 @@
 FETCHCOMMAND='curl -y 30 -f --retry 9 -L --output \${DISTDIR}/\${FILE} \${URI}'
 RESUMECOMMAND='curl -y 30 -f -C - --retry 9 -L --output \${DISTDIR}/\${FILE} \${URI}'
 
+FETCHCOMMAND_CIPD='/mnt/host/source/chromite/bin/fetch_cipd "\${URI}" "\${DISTDIR}/\${FILE}"'
+RESUMECOMMAND_CIPD="${FETCHCOMMAND_CIPD}"
+
 # Native language support is handled inside Chrome itself.
 # This needs to be in make.conf and not make.defaults to override IUSE defaults.
 LINGUAS="en"
diff --git a/chromeos/config/make.conf.generic-target b/chromeos/config/make.conf.generic-target
index 2bbbc99..10cbe78 100644
--- a/chromeos/config/make.conf.generic-target
+++ b/chromeos/config/make.conf.generic-target
@@ -37,9 +37,6 @@
 # Print a checkpoint message every 10MB while archiving.
 PORTAGE_BINPKG_TAR_OPTS="--checkpoint=1000"
 
-# Since our portage comes from version control, we redirect distfiles.
-DISTDIR="/var/lib/portage/distfiles-target"
-
 # Our chromium mirror should be more stable since we won't discard packages.
 GENTOO_MIRRORS="https://commondatastorage.googleapis.com/chromeos-localmirror"
 GENTOO_MIRRORS="$GENTOO_MIRRORS https://commondatastorage.googleapis.com/chromeos-mirror/gentoo"
diff --git a/dev-embedded/binman/binman-0.0.1-r1.ebuild b/dev-embedded/binman/binman-0.0.1-r1.ebuild
new file mode 100644
index 0000000..087c574
--- /dev/null
+++ b/dev-embedded/binman/binman-0.0.1-r1.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="bc1199918e73f3f810b2eeb5dc38e71a5914772a"
+CROS_WORKON_TREE="34c69bae738990ef8d7fc18553b02f41305d9e79"
+CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
+CROS_WORKON_LOCALNAME="u-boot/files"
+CROS_WORKON_SUBTREE="tools/binman"
+
+PYTHON_COMPAT=( python3_6 python3_7 python3_8 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Binman tool (from U-Boot) for creating / adjusting firmware images"
+HOMEPAGE="https://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+RDEPEND="
+	dev-embedded/dtoc
+	dev-vcs/patman
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+
+	S+=/tools/binman
+}
diff --git a/dev-embedded/binman/binman-9999.ebuild b/dev-embedded/binman/binman-9999.ebuild
new file mode 100644
index 0000000..0e5bd4e
--- /dev/null
+++ b/dev-embedded/binman/binman-9999.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
+CROS_WORKON_LOCALNAME="u-boot/files"
+CROS_WORKON_SUBTREE="tools/binman"
+
+PYTHON_COMPAT=( python3_6 python3_7 python3_8 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Binman tool (from U-Boot) for creating / adjusting firmware images"
+HOMEPAGE="https://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="~*"
+IUSE=""
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+RDEPEND="
+	dev-embedded/dtoc
+	dev-vcs/patman
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+
+	S+=/tools/binman
+}
diff --git a/dev-embedded/coreboot-sdk/Manifest b/dev-embedded/coreboot-sdk/Manifest
index a5b4188..9f72f62 100644
--- a/dev-embedded/coreboot-sdk/Manifest
+++ b/dev-embedded/coreboot-sdk/Manifest
@@ -1,9 +1,13 @@
-DIST acpica-unix2-20190703.tar.gz 1579998 BLAKE2B 56d243339bffbc696a2cd6de0c60b47d7ec6d287d991516ee4ac41c0a2f8aebcefe8ec7f2a5cec5154d54d1a08fbabb980047bc007e2c5e37fe8fe54acdd94c0 SHA512 8445a6d354ce3bcbfb5159f4ec0312b1e910c0b1b2033a2300f892e4ac580abab4e3f5b4ded379f0036299359d307330511ab7053678cfd9031d7df4c365f555
 DIST acpica-unix2-20200110.tar.gz 1594539 BLAKE2B ed50dcc34028a7e8458f9e8014e9d250c77c9287d80ae96638d431fb1032376b051207f91727403cc81dcba96475f31630d69356db44c3268b0510ba4174cea8 SHA512 5c7ab7d514a06dabbec75131bd6fc2fbcbc4e92b8a1fe63e45ccc90631556584b2dbbf96b3f945e8ab1eff40e5b0c9de96395aeed1cfd2bd03ec92d8442fed32
+DIST acpica-unix2-20200717.tar.gz 1578966 BLAKE2B 46a3f35990d9d12b9afe2b54f059fad6b0696ec5f34352613d95e5b0cc529095391aa92cb15704573640ad2f1c9fc0f6df690ed57ff29164b071793a7f0958cf SHA512 d477911d9dded34e887f77f396d84b85334b66983d3104ba8ee0ade09186abacfceec9ecec96fa6fce886da5fe0d187c2cdeed62cca467cdae049e2fe011391a
 DIST binutils-2.33.1.tar.xz 21490848 BLAKE2B c336a8412938dc8c224f40a763a8bea9937cca0462a8fb80e62f14aabe590107fc061a3f4b9327e1f4652cb026384d36a91b4766d4d469d2d0680932874b638c SHA512 b7a6767c6c7ca6b5cafa7080e6820b7bb3a53b7148348c438d99905defbdf0d30c9744a484ee01c9441a8153901808513366b15ba9533e20c9673c262ade36ac
+DIST binutils-2.35.tar.xz 22042160 BLAKE2B 72ea79edf3a77aa93dcf38274123abbae5ce8f800a95e6379b4c8807050b05c2dfec314f06c027b1343c5570f369324fa3e195d7e0db5f8a57c0579937c49d3f SHA512 9f222e4ab6720036402d03904fb11b73ab87714b85cd84997f7d357f405c7e10581d70202f9165a1ee0c70538632db27ecc9dfe627dddb1e6bc7edb1537cf786
 DIST gcc-8.3.0.tar.xz 63694700 BLAKE2B 71df2ff5bd6874d57519c2e9af6b22152c8c4d7fab906a5f427b41bc4e8e742127592a8684120d9d3c9ce6241439531850be08ec0a4f29dbfdee95435655fdca SHA512 1811337ae3add9680cec64968a2509d085b6dc5b6783fc1e8c295e3e47416196fd1a3ad8dfe7e10be2276b4f62c357659ce2902f239f60a8648548231b4b5802
 DIST gmp-6.1.2.tar.xz 1946336 BLAKE2B 2a864e80799471037a71c10d871f9782c37fe3a0a1734872e90f14a874ecd6551099d67b2ebd07f82a43b0522249a6b46e79952db11a278f87ca8013198f7604 SHA512 9f098281c0593b76ee174b722936952671fab1dae353ce3ed436a31fe2bc9d542eca752353f6645b7077c1f395ab4fdd355c58e08e2a801368f1375690eee2c6
+DIST gmp-6.2.0.tar.xz 2012444 BLAKE2B 928141cf7b0b70f78b66e7bc52aecd39a5fc30e8865b6de6effb5b061ade05a5a51b4680ef2f36ea0d682b319d54ceb1c6c8ef93bde6c2eef2e8b826a34602c3 SHA512 a066f0456f0314a1359f553c49fc2587e484ff8ac390ff88537266a146ea373f97a1c0ba24608bf6756f4eab11c9056f103c8deb99e5b57741b4f7f0ec44b90c
 DIST gnat-gpl-2017-x86_64-linux-bin.tar.gz 496338280 BLAKE2B b3eee6d311fb9c20bc8fa7217c0731ca1e91ced38700df1d63d91a16c3fa28dfd44c7c8e867c3a857b88e4f0c8b2a7200fb6a8a630b8403538c4784f8914d1a5 SHA512 01a8f3be9b7b7e83cc5bd4a45137b1d35c6448bc22a88bcaf5d312cd63e11081b6b2fe9f09ad2a27d8f0b6471fc5c1a99573bf3bcee1589329054074eaeef04f
 DIST make-4.2.1.tar.bz2 1407126 BLAKE2B fa6d43f5fd46182182a296c58dcd138a1a4568104eda760bbb3c241c023dee216789cf3128e5ac2b416cec76e1ba82d5b5e7852da12e86138a7d0865c85a42b4 SHA512 9cf00869a2f938492554f71d8cb288b5b009b3bd0489ef164f2c8f6532fc37db5c7e20af1dea288536e7c9710ee0bc6e1ddcdfc4928a8540e6e43661741825b8
 DIST mpc-1.1.0.tar.gz 701263 BLAKE2B afd9fefe687b7cd3c3a483e183f366348e34f58f5d713e2f6b38da16e2e382248b446d9da01ea89fe7202b795b08929b7c42c89c2c1e9a57482faf01ee697beb SHA512 72d657958b07c7812dc9c7cbae093118ce0e454c68a585bfb0e2fa559f1bf7c5f49b93906f580ab3f1073e5b595d23c6494d4d76b765d16dde857a18dd239628
+DIST mpc-1.2.0.tar.gz 840711 BLAKE2B 3609d299623a722ca90d4b04ff64becaaa399a5fa40fbc43a1d027692d8fbe6f4ebd24a3c8ea963963977952d130cd3993887da7b0b0c1613a27a24dd37e5831 SHA512 84fa3338f51d369111456a63ad040256a1beb70699e21e2a932c779aa1c3bd08b201412c1659ecbb58403ea0548faacc35996d94f88f0639549269b7563c61b7
 DIST mpfr-4.0.2.tar.xz 1441996 BLAKE2B 4c1a15208c2dc3dcc1424974de506198e9cc479c70255149876c7f541133499ada5c89f07393b120b7079e6bbaf8ea03e5e496e1350b295e687392a6e0341c1c SHA512 d583555d08863bf36c89b289ae26bae353d9a31f08ee3894520992d2c26e5683c4c9c193d7ad139632f71c0a476d85ea76182702a98bf08dde7b6f65a54f8b88
+DIST mpfr-4.1.0.tar.xz 1525476 BLAKE2B 41d1be0c4b557760f12a4525ad3a84b6e2cd6f0927c935fcfba577ac0490e582d1ae4b581dce58e21e705cf9d7c88373054d7fb7a94bb32c69b339f99a25dc68 SHA512 1bd1c349741a6529dfa53af4f0da8d49254b164ece8a46928cdb13a99460285622d57fe6f68cef19c6727b3f9daa25ddb3d7d65c201c8f387e421c7f7bee6273
diff --git a/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r95.ebuild b/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r95.ebuild
deleted file mode 100644
index 0930993..0000000
--- a/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r95.ebuild
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="4a9d1facd3cbeccde700fe057e7e04c4f972da53"
-CROS_WORKON_TREE="f494ad8e0135802146a66086bb018cd89ad4c005"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-CROS_WORKON_LOCALNAME="coreboot"
-CROS_WORKON_SUBTREE="util/crossgcc"
-
-inherit cros-workon flag-o-matic multiprocessing
-
-DESCRIPTION="upstream coreboot's compiler suite"
-HOMEPAGE="https://www.coreboot.org"
-LICENSE="GPL-3 LGPL-3"
-KEYWORDS="*"
-
-# URIs taken from buildgcc -u
-# Needs to be synced with changes in the coreboot repo,
-# then pruned to the minimum required set (eg. no gdb, python, expat, llvm)
-CROSSGCC_URIS="
-https://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.xz
-https://ftpmirror.gnu.org/mpfr/mpfr-4.0.2.tar.xz
-https://ftpmirror.gnu.org/mpc/mpc-1.1.0.tar.gz
-https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz
-https://ftpmirror.gnu.org/binutils/binutils-2.33.1.tar.xz
-https://acpica.org/sites/acpica/files/acpica-unix2-20200110.tar.gz
-https://ftpmirror.gnu.org/make/make-4.2.1.tar.bz2
-"
-
-SRC_URI="
-${CROSSGCC_URIS}
-http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
-"
-
-buildgcc_failed() {
-	local arch="$1"
-
-	cat $(ls */.failed | sed "s,\.failed,build.log,")
-	die "building the compiler for ${arch} failed"
-}
-
-src_prepare() {
-	eapply_user
-
-	mkdir util/crossgcc/tarballs
-	ln -s "${DISTDIR}"/* util/crossgcc/tarballs/
-	unpack gnat-gpl-2017-x86_64-linux-bin.tar.gz
-	# buildgcc uses 'cc' to find gnat1 so it needs to find the gnat-gpl
-	# compiler under that name
-	ln -s gcc gnat-gpl-2017-x86_64-linux-bin/bin/cc
-	# Add a gcc patch to make it builds with glibc 2.26.
-	cp "${FILESDIR}/${PN}-gcc-ucontext.patch" "${S}/util/crossgcc/patches/gcc-6.3.0_ucontext.patch"
-}
-
-src_compile() {
-	# We're bootstrapping with an old compiler whose
-	# linker isn't happy about this flag.
-	filter-ldflags "-Wl,--icf=all"
-
-	cd util/crossgcc || die "couldn't enter crossgcc tree"
-
-	./buildgcc -d /opt/coreboot-sdk -D "${S}/out" -P iasl -t -j "$(makeopts_jobs)" \
-	|| buildgcc_failed "ACPI"
-
-	# To bootstrap the Ada build, an Ada compiler needs to be available. To
-	# make sure it interacts well with the C/C++ parts of the compiler,
-	# buildgcc asks gcc for the Ada compiler's path using the compiler's
-	# -print-prog-name option which only deals with programs from the very
-	# same compiler distribution, so make sure we use the right one.
-	export PATH="${S}"/gnat-gpl-2017-x86_64-linux-bin/bin:"${PATH}"
-	export CC=gcc CXX=g++
-
-	local buildgcc_opts=(-j "$(makeopts_jobs)" -l "c,ada" -t)
-
-	# Build bootstrap compiler to get a reliable compiler base no matter how
-	# versions diverged, but keep it separately, since we only need it
-	# during this build and not in the chroot.
-	./buildgcc -B -d "${S}"/bootstrap "${buildgcc_opts[@]}" \
-		|| buildgcc_failed "cros_sdk (bootstrap)"
-
-	export PATH="${S}/bootstrap/bin:${PATH}"
-
-	local architectures=(
-		i386-elf
-		x86_64-elf
-		arm-eabi
-		aarch64-elf
-		nds32le-elf
-		riscv-elf
-	)
-
-	local arch
-	for arch in "${architectures[@]}"; do
-		./buildgcc -d /opt/coreboot-sdk -D "${S}/out" -p "${arch}" \
-			"${buildgcc_opts[@]}" \
-		|| buildgcc_failed "${arch}"
-	done
-
-	rm -f "${S}"/out/opt/coreboot-sdk/lib/lib*.{la,a}
-}
-
-src_install() {
-	local files
-
-	dodir /opt
-	cp -a out/opt/coreboot-sdk "${D}"/opt/coreboot-sdk || die
-
-	readarray -t files < <(find "${D}" -name '*.[ao]' -printf "/%P\n")
-	dostrip -x "${files[@]}"
-}
diff --git a/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r99.ebuild b/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r99.ebuild
new file mode 100644
index 0000000..8d15f1b
--- /dev/null
+++ b/dev-embedded/coreboot-sdk/coreboot-sdk-0.0.1-r99.ebuild
@@ -0,0 +1,110 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="816bf19a219e8a69b1fe846625eae7a91377863d"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+CROS_WORKON_LOCALNAME="coreboot"
+CROS_WORKON_SUBTREE="util/crossgcc"
+
+inherit cros-workon flag-o-matic multiprocessing
+
+DESCRIPTION="upstream coreboot's compiler suite"
+HOMEPAGE="https://www.coreboot.org"
+LICENSE="GPL-3 LGPL-3"
+KEYWORDS="*"
+
+# URIs taken from buildgcc -u
+# Needs to be synced with changes in the coreboot repo,
+# then pruned to the minimum required set (eg. no gdb, python, expat, llvm)
+CROSSGCC_URIS="
+https://ftpmirror.gnu.org/gmp/gmp-6.2.0.tar.xz
+https://ftpmirror.gnu.org/mpfr/mpfr-4.1.0.tar.xz
+https://ftpmirror.gnu.org/mpc/mpc-1.2.0.tar.gz
+https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz
+https://ftpmirror.gnu.org/binutils/binutils-2.35.tar.xz
+https://acpica.org/sites/acpica/files/acpica-unix2-20200717.tar.gz
+"
+
+SRC_URI="
+${CROSSGCC_URIS}
+http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
+"
+
+buildgcc_failed() {
+	local arch="$1"
+
+	cat $(ls */.failed | sed "s,\.failed,build.log,")
+	die "building the compiler for ${arch} failed"
+}
+
+src_prepare() {
+	eapply_user
+
+	mkdir util/crossgcc/tarballs
+	ln -s "${DISTDIR}"/* util/crossgcc/tarballs/
+	unpack gnat-gpl-2017-x86_64-linux-bin.tar.gz
+	# buildgcc uses 'cc' to find gnat1 so it needs to find the gnat-gpl
+	# compiler under that name
+	ln -s gcc gnat-gpl-2017-x86_64-linux-bin/bin/cc
+	# Add a gcc patch to make it builds with glibc 2.26.
+	cp "${FILESDIR}/${PN}-gcc-ucontext.patch" "${S}/util/crossgcc/patches/gcc-6.3.0_ucontext.patch"
+}
+
+src_compile() {
+	# We're bootstrapping with an old compiler whose
+	# linker isn't happy about this flag.
+	filter-ldflags "-Wl,--icf=all"
+
+	cd util/crossgcc || die "couldn't enter crossgcc tree"
+
+	./buildgcc -d /opt/coreboot-sdk -D "${S}/out" -P iasl -t -j "$(makeopts_jobs)" \
+	|| buildgcc_failed "ACPI"
+
+	# To bootstrap the Ada build, an Ada compiler needs to be available. To
+	# make sure it interacts well with the C/C++ parts of the compiler,
+	# buildgcc asks gcc for the Ada compiler's path using the compiler's
+	# -print-prog-name option which only deals with programs from the very
+	# same compiler distribution, so make sure we use the right one.
+	export PATH="${S}"/gnat-gpl-2017-x86_64-linux-bin/bin:"${PATH}"
+	export CC=gcc CXX=g++
+
+	local buildgcc_opts=(-j "$(makeopts_jobs)" -l "c,ada" -t)
+
+	# Build bootstrap compiler to get a reliable compiler base no matter how
+	# versions diverged, but keep it separately, since we only need it
+	# during this build and not in the chroot.
+	./buildgcc -B -d "${S}"/bootstrap "${buildgcc_opts[@]}" \
+		|| buildgcc_failed "cros_sdk (bootstrap)"
+
+	export PATH="${S}/bootstrap/bin:${PATH}"
+
+	local architectures=(
+		i386-elf
+		x86_64-elf
+		arm-eabi
+		aarch64-elf
+		nds32le-elf
+		riscv-elf
+	)
+
+	local arch
+	for arch in "${architectures[@]}"; do
+		./buildgcc -d /opt/coreboot-sdk -D "${S}/out" -p "${arch}" \
+			"${buildgcc_opts[@]}" \
+		|| buildgcc_failed "${arch}"
+	done
+
+	rm -f "${S}"/out/opt/coreboot-sdk/lib/lib*.{la,a}
+}
+
+src_install() {
+	local files
+
+	dodir /opt
+	cp -a out/opt/coreboot-sdk "${D}"/opt/coreboot-sdk || die
+
+	readarray -t files < <(find "${D}" -name '*.[ao]' -printf "/%P\n")
+	dostrip -x "${files[@]}"
+}
diff --git a/dev-embedded/coreboot-sdk/coreboot-sdk-9999.ebuild b/dev-embedded/coreboot-sdk/coreboot-sdk-9999.ebuild
index f94eb89..4a5bcf3 100644
--- a/dev-embedded/coreboot-sdk/coreboot-sdk-9999.ebuild
+++ b/dev-embedded/coreboot-sdk/coreboot-sdk-9999.ebuild
@@ -17,13 +17,12 @@
 # Needs to be synced with changes in the coreboot repo,
 # then pruned to the minimum required set (eg. no gdb, python, expat, llvm)
 CROSSGCC_URIS="
-https://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.xz
-https://ftpmirror.gnu.org/mpfr/mpfr-4.0.2.tar.xz
-https://ftpmirror.gnu.org/mpc/mpc-1.1.0.tar.gz
+https://ftpmirror.gnu.org/gmp/gmp-6.2.0.tar.xz
+https://ftpmirror.gnu.org/mpfr/mpfr-4.1.0.tar.xz
+https://ftpmirror.gnu.org/mpc/mpc-1.2.0.tar.gz
 https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz
-https://ftpmirror.gnu.org/binutils/binutils-2.33.1.tar.xz
-https://acpica.org/sites/acpica/files/acpica-unix2-20200110.tar.gz
-https://ftpmirror.gnu.org/make/make-4.2.1.tar.bz2
+https://ftpmirror.gnu.org/binutils/binutils-2.35.tar.xz
+https://acpica.org/sites/acpica/files/acpica-unix2-20200717.tar.gz
 "
 
 SRC_URI="
diff --git a/dev-embedded/dtoc/dtoc-0.0.1-r1.ebuild b/dev-embedded/dtoc/dtoc-0.0.1-r1.ebuild
new file mode 100644
index 0000000..d9dce77
--- /dev/null
+++ b/dev-embedded/dtoc/dtoc-0.0.1-r1.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="bc1199918e73f3f810b2eeb5dc38e71a5914772a"
+CROS_WORKON_TREE="056aa2ec54c99a4f1e14b29aa279ce4694bdddd0"
+CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
+CROS_WORKON_LOCALNAME="u-boot/files"
+CROS_WORKON_SUBTREE="tools/dtoc"
+
+PYTHON_COMPAT=( python3_6 python3_7 python3_8 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Dtoc tool (from U-Boot) for converting devicetree files to C"
+HOMEPAGE="https://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+RDEPEND="dev-vcs/patman"
+
+src_unpack() {
+	cros-workon_src_unpack
+
+	S+=/tools/dtoc
+}
diff --git a/dev-embedded/dtoc/dtoc-9999.ebuild b/dev-embedded/dtoc/dtoc-9999.ebuild
new file mode 100644
index 0000000..c76e041
--- /dev/null
+++ b/dev-embedded/dtoc/dtoc-9999.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
+CROS_WORKON_LOCALNAME="u-boot/files"
+CROS_WORKON_SUBTREE="tools/dtoc"
+
+PYTHON_COMPAT=( python3_6 python3_7 python3_8 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Dtoc tool (from U-Boot) for converting devicetree files to C"
+HOMEPAGE="https://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="~*"
+IUSE=""
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+RDEPEND="dev-vcs/patman"
+
+src_unpack() {
+	cros-workon_src_unpack
+
+	S+=/tools/dtoc
+}
diff --git a/dev-go/crypto/crypto-0.0.1-r4.ebuild b/dev-go/crypto/crypto-0.0.1-r5.ebuild
similarity index 100%
rename from dev-go/crypto/crypto-0.0.1-r4.ebuild
rename to dev-go/crypto/crypto-0.0.1-r5.ebuild
diff --git a/dev-go/crypto/crypto-0.0.1.ebuild b/dev-go/crypto/crypto-0.0.1.ebuild
index 38ca6ae..23f34a2 100644
--- a/dev-go/crypto/crypto-0.0.1.ebuild
+++ b/dev-go/crypto/crypto-0.0.1.ebuild
@@ -6,9 +6,12 @@
 CROS_GO_SOURCE="go.googlesource.com/crypto:golang.org/x/crypto 505ab145d0a99da450461ae2c1a9f6cd10d1f447"
 
 CROS_GO_PACKAGES=(
+	"golang.org/x/crypto/argon2"
+	"golang.org/x/crypto/blake2b"
 	"golang.org/x/crypto/ed25519"
 	"golang.org/x/crypto/ed25519/internal/edwards25519"
 	"golang.org/x/crypto/curve25519"
+	"golang.org/x/crypto/hkdf"
 	"golang.org/x/crypto/internal/chacha20"
 	"golang.org/x/crypto/internal/subtle"
 	"golang.org/x/crypto/nacl/box"
diff --git a/dev-go/dst/Manifest b/dev-go/dst/Manifest
new file mode 100644
index 0000000..c721d8c
--- /dev/null
+++ b/dev-go/dst/Manifest
@@ -0,0 +1 @@
+DIST github.com-dave-dst-v0.23.1.tar.gz 102786 BLAKE2B 801af3855f268e10d05cd22b3f5120a6982ea49711f1317380df786ee05844f7d6ab4bf62160e9c21c00f0473aa36bc7ae403072b3bdf4af86bc8483600e9413 SHA512 aebbb99a2c44a085d1ec09a5b2c98bba65f4b6c017aa1bb62d8b5caa847e0ce09a1f4f67e3c3be540c75bd40c839abaded545e19c6bf58061ad9db8b8c188db2
diff --git a/dev-go/dst/dst-0.23.1.ebuild b/dev-go/dst/dst-0.23.1.ebuild
new file mode 100644
index 0000000..bd51004
--- /dev/null
+++ b/dev-go/dst/dst-0.23.1.ebuild
@@ -0,0 +1,28 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+CROS_GO_SOURCE="github.com/dave/dst v${PV}"
+
+CROS_GO_PACKAGES=(
+	"github.com/dave/dst/..."
+)
+
+inherit cros-go
+
+DESCRIPTION="Decorated Syntax Tree"
+HOMEPAGE="https://github.com/dave/dst"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="MIT BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND="
+	dev-go/jennifer
+	>=dev-go/go-tools-0.0.1-r13
+"
+RDEPEND="${DEPEND}"
diff --git a/dev-go/fscrypt/Manifest b/dev-go/fscrypt/Manifest
new file mode 100644
index 0000000..e035493
--- /dev/null
+++ b/dev-go/fscrypt/Manifest
@@ -0,0 +1 @@
+DIST github.com-google-fscrypt-v0.2.9.tar.gz 144204 BLAKE2B 80f0028c10e8050874476dc491923c4cc06dcb95ec588b9b8c8b85dd9a0c6024bd7474396be72894b1abe05812b6447464bb8e35034322cf7a8f209e1b772bcf SHA512 203d61171bc83c558eef955dd4e3116540514faa058f28f65f904e8ac96036236ba26ca0cc6c7baf6d775405f88dbbbe2b85a61fa2f6c030797ba7672cededa4
diff --git a/dev-go/fscrypt/fscrypt-0.2.9-r1.ebuild b/dev-go/fscrypt/fscrypt-0.2.9-r1.ebuild
new file mode 120000
index 0000000..7de8e3a
--- /dev/null
+++ b/dev-go/fscrypt/fscrypt-0.2.9-r1.ebuild
@@ -0,0 +1 @@
+fscrypt-0.2.9.ebuild
\ No newline at end of file
diff --git a/dev-go/fscrypt/fscrypt-0.2.9.ebuild b/dev-go/fscrypt/fscrypt-0.2.9.ebuild
new file mode 100644
index 0000000..ca350dc
--- /dev/null
+++ b/dev-go/fscrypt/fscrypt-0.2.9.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_GO_SOURCE="github.com/google/fscrypt v${PV}"
+
+CROS_GO_PACKAGES=(
+	"github.com/google/fscrypt/metadata"
+	"github.com/google/fscrypt/util"
+)
+
+inherit cros-go
+
+DESCRIPTION="Go package for fscrypt utils "
+HOMEPAGE="https://github.com/google/fscrypt"
+SRC_URI="$(cros-go_src_uri)"
+
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND="
+	dev-go/crypto
+	dev-go/go-sys
+	sys-libs/pam:=
+"
+RDEPEND="${DEPEND}"
diff --git a/dev-go/gapi-drive/Manifest b/dev-go/gapi-drive/Manifest
new file mode 100644
index 0000000..3798d8c
--- /dev/null
+++ b/dev-go/gapi-drive/Manifest
@@ -0,0 +1 @@
+DIST github.com-google-google-api-go-client-068431dcab1a5817548dd244d9795788a98329f4.tar.gz 7357858 SHA256 156d1dcafcffbd44f6c80357571d7753c52431a6a7f588b392979425e531e45c SHA512 106b0d84ed39800e360400e831980b77de07595f833842cd2ae161c36b6a62bbdd750dfaba583da0c6b63a477022f15157314c2e20688138af0b06875046b0a5 WHIRLPOOL 82f1ef7f0bb91d00c304d2e515e8f00b4bf37067fcaecfb74c6b59394132b8d03726cc1d1d9edf9d480e6fc6ba34387bd884d6617199a9967a783ae708684dba
diff --git a/dev-go/gapi-drive/gapi-drive-0.0.1-r1.ebuild b/dev-go/gapi-drive/gapi-drive-0.0.1-r1.ebuild
new file mode 120000
index 0000000..40e4792
--- /dev/null
+++ b/dev-go/gapi-drive/gapi-drive-0.0.1-r1.ebuild
@@ -0,0 +1 @@
+gapi-drive-0.0.1.ebuild
\ No newline at end of file
diff --git a/dev-go/gapi-drive/gapi-drive-0.0.1.ebuild b/dev-go/gapi-drive/gapi-drive-0.0.1.ebuild
new file mode 100644
index 0000000..401e278
--- /dev/null
+++ b/dev-go/gapi-drive/gapi-drive-0.0.1.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=5
+
+# The dev-go/gapi* packages are all built from this repo.  They should
+# be updated together.
+CROS_GO_SOURCE="github.com/google/google-api-go-client:google.golang.org/api 068431dcab1a5817548dd244d9795788a98329f4"
+
+CROS_GO_PACKAGES=(
+	"google.golang.org/api/drive/v3"
+)
+
+CROS_GO_TEST=(
+	"${CROS_GO_PACKAGES[@]}"
+)
+
+inherit cros-go
+
+DESCRIPTION="Auto-generated Google APIs for Go"
+HOMEPAGE="https://github.com/google/google-api-go-client"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND="
+	dev-go/gapi-gensupport
+	dev-go/gapi-googleapi
+	dev-go/net
+"
+RDEPEND="${DEPEND}"
diff --git a/dev-go/go-sys/Manifest b/dev-go/go-sys/Manifest
index d55bd4c..7d8fff6 100644
--- a/dev-go/go-sys/Manifest
+++ b/dev-go/go-sys/Manifest
@@ -1 +1 @@
-DIST go.googlesource.com-sys-3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145.tar.gz 1412851 BLAKE2B cae133d3a4aeb09ad915fc6303cb34ed0e4adf503770abcc05ed22d422c45f47561274ce328f751de60de6c3d8f411bb5ef0157927ed899d37502a7535e07d02 SHA512 f50357abd9a4e96140780348e010f977d3b72eb7d8bbd9294ef605222b1cef46e498878accbe4a0a0ce2bebe14453346f5a8b865cb6ecca6d3319aa2c608c3a8
+DIST go.googlesource.com-sys-cb9d2d5c56667600bda8ad719c756f125ad55083.tar.gz 1049658 BLAKE2B 0e1db133bcb68a259014979d1f33a02395f69f1d62663986609e691637e797ebf54766d3d327fde7aeeb96a8d9132a691571b49676f379e355ae8a7cea7c6b5f SHA512 c356240dee87ac25a62d997994fbb60ba61e9695c95c1ff1b86a42cc83c1eec9585893b533f160076850c06d3ba55be105c5ff22c4119d047166eba28df986ce
diff --git a/dev-go/go-sys/go-sys-0.0.1-r4.ebuild b/dev-go/go-sys/go-sys-0.0.1-r5.ebuild
similarity index 100%
rename from dev-go/go-sys/go-sys-0.0.1-r4.ebuild
rename to dev-go/go-sys/go-sys-0.0.1-r5.ebuild
diff --git a/dev-go/go-sys/go-sys-0.0.1.ebuild b/dev-go/go-sys/go-sys-0.0.1.ebuild
index 7fe4876..331da9b 100644
--- a/dev-go/go-sys/go-sys-0.0.1.ebuild
+++ b/dev-go/go-sys/go-sys-0.0.1.ebuild
@@ -3,9 +3,11 @@
 
 EAPI=5
 
-CROS_GO_SOURCE="go.googlesource.com/sys:golang.org/x/sys 3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145"
+CROS_GO_SOURCE="go.googlesource.com/sys:golang.org/x/sys cb9d2d5c56667600bda8ad719c756f125ad55083"
 
 CROS_GO_PACKAGES=(
+	"golang.org/x/sys/cpu"
+	"golang.org/x/sys/internal/unsafeheader"
 	"golang.org/x/sys/unix"
 )
 
diff --git a/dev-go/go-tools/go-tools-0.0.1-r12.ebuild b/dev-go/go-tools/go-tools-0.0.1-r13.ebuild
similarity index 100%
rename from dev-go/go-tools/go-tools-0.0.1-r12.ebuild
rename to dev-go/go-tools/go-tools-0.0.1-r13.ebuild
diff --git a/dev-go/go-tools/go-tools-0.0.1.ebuild b/dev-go/go-tools/go-tools-0.0.1.ebuild
index aec28ea..5ea8dff 100644
--- a/dev-go/go-tools/go-tools-0.0.1.ebuild
+++ b/dev-go/go-tools/go-tools-0.0.1.ebuild
@@ -8,8 +8,16 @@
 
 CROS_GO_PACKAGES=(
 	"golang.org/x/tools/go/ast/astutil"
+	"golang.org/x/tools/go/buildutil"
 	"golang.org/x/tools/go/gcexportdata"
+	"golang.org/x/tools/go/internal/cgo"
 	"golang.org/x/tools/go/internal/gcimporter"
+	"golang.org/x/tools/go/internal/packagesdriver"
+	"golang.org/x/tools/go/loader"
+	"golang.org/x/tools/go/packages"
+	"golang.org/x/tools/internal/fastwalk"
+	"golang.org/x/tools/internal/gopathwalk"
+	"golang.org/x/tools/internal/semver"
 )
 
 CROS_GO_TEST=(
@@ -35,5 +43,8 @@
 IUSE=""
 RESTRICT="binchecks strip"
 
-DEPEND="dev-go/net"
-RDEPEND=""
+DEPEND="
+	dev-go/net
+	dev-go/xerrors
+"
+RDEPEND="${DEPEND}"
diff --git a/dev-go/godebug/Manifest b/dev-go/godebug/Manifest
new file mode 100644
index 0000000..472a62d
--- /dev/null
+++ b/dev-go/godebug/Manifest
@@ -0,0 +1 @@
+DIST github.com-kylelemons-godebug-v1.1.0.tar.gz 17637 BLAKE2B 904e8ca71ad480aa19211b002735cfb68222a2660849365dd163b840d0fb683d02388ca0c3ab8f04178c8e5448403c2b16ab3375ed5c0a6721d595a15d29220c SHA512 8b3fb00e5cf85982eba4d9afc5cb5f96ee43e582e5dce0f8ea408422b0086eeff91fc5df00fa9f7d4ba80183a75dddd3e99032da269fbc7c43614a8ebf97bb95
diff --git a/dev-go/godebug/godebug-1.1.0-r1.ebuild b/dev-go/godebug/godebug-1.1.0-r1.ebuild
new file mode 120000
index 0000000..3ed85a0
--- /dev/null
+++ b/dev-go/godebug/godebug-1.1.0-r1.ebuild
@@ -0,0 +1 @@
+godebug-1.1.0.ebuild
\ No newline at end of file
diff --git a/dev-go/godebug/godebug-1.1.0.ebuild b/dev-go/godebug/godebug-1.1.0.ebuild
new file mode 100644
index 0000000..95473de
--- /dev/null
+++ b/dev-go/godebug/godebug-1.1.0.ebuild
@@ -0,0 +1,25 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI="7"
+
+CROS_GO_SOURCE="github.com/kylelemons/godebug v${PV}"
+
+CROS_GO_PACKAGES=(
+	"github.com/kylelemons/godebug/..."
+)
+
+inherit cros-go
+
+DESCRIPTION="Debugging helper utilities for Go"
+HOMEPAGE="https://github.com/kylelemons/godebug"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND=""
+RDEPEND=""
diff --git a/dev-go/golang-evdev/Manifest b/dev-go/golang-evdev/Manifest
new file mode 100644
index 0000000..1eef96d
--- /dev/null
+++ b/dev-go/golang-evdev/Manifest
@@ -0,0 +1 @@
+DIST github.com-gvalkov-golang-evdev-287e62b94bcb850ab42e711bd74b2875da83af2c.tar.gz 20928 BLAKE2B 6117d77523c49f87c7b9f8b1707cc6a197fe60b97153330bfbf7e4c9921a0e97dfd3ae0a47aa41e5a1f40b429e441f0243340672d6c5202e908223ed479a613e SHA512 4d9bd71f14f0ec410b19fdfbdd16b7d23245ea505480db523ceb23a8fef0b4c20a5399893da1b95f37978407ac29c5fc560cb99f4fa16c1f694f6378292475c0
diff --git a/dev-go/golang-evdev/golang-evdev-0.0.1.ebuild b/dev-go/golang-evdev/golang-evdev-0.0.1.ebuild
new file mode 100644
index 0000000..9e34089
--- /dev/null
+++ b/dev-go/golang-evdev/golang-evdev-0.0.1.ebuild
@@ -0,0 +1,25 @@
+# Copyright 2020 The Chromium OS Authors.  All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_GO_SOURCE="github.com/gvalkov/golang-evdev 287e62b94bcb850ab42e711bd74b2875da83af2c"
+
+CROS_GO_PACKAGES=(
+	"github.com/gvalkov/golang-evdev"
+)
+
+inherit cros-go
+
+DESCRIPTION="Provides Go language bindings to the generic input event interface in Linux."
+HOMEPAGE="https://github.com/gvalkov/golang-evdev"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND="sys-kernel/linux-headers:="
+RDEPEND=""
diff --git a/dev-go/jennifer/Manifest b/dev-go/jennifer/Manifest
new file mode 100644
index 0000000..b699c9d
--- /dev/null
+++ b/dev-go/jennifer/Manifest
@@ -0,0 +1 @@
+DIST github.com-dave-jennifer-v1.2.0.tar.gz 41248 BLAKE2B 1501a57081a527f623f8ca006dd526268987abaa4250a8241518ffed1c7ec3531e8f2cd130e821a5be708d4d7cb622f63d004c346cb284d5d61f0404481a1ad3 SHA512 c7accb03077b976198f15487ff8a678b77788a258969a4312088bb2f9903681f753c2c8454c5516c3dfe2bcb8c4e0bd87c0acccd8f7d4e0b3910f3f38d7b5c2e
diff --git a/dev-go/jennifer/jennifer-1.2.0.ebuild b/dev-go/jennifer/jennifer-1.2.0.ebuild
new file mode 100644
index 0000000..85c87c8
--- /dev/null
+++ b/dev-go/jennifer/jennifer-1.2.0.ebuild
@@ -0,0 +1,25 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+CROS_GO_SOURCE="github.com/dave/jennifer v${PV}"
+
+CROS_GO_PACKAGES=(
+	"github.com/dave/jennifer/..."
+)
+
+inherit cros-go
+
+DESCRIPTION="Jennifer is a code generator for Go"
+HOMEPAGE="https://github.com/dave/jennifer"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND=""
+RDEPEND="${DEPEND}"
diff --git a/dev-go/levenshtein/Manifest b/dev-go/levenshtein/Manifest
new file mode 100644
index 0000000..8ec7b0f
--- /dev/null
+++ b/dev-go/levenshtein/Manifest
@@ -0,0 +1 @@
+DIST github.com-texttheater-golang-levenshtein-eb6844b05fc6f7e10932b0621c7f5f7e8890541d.tar.gz 4811 BLAKE2B dec3a8b39249ba2233383149fccf24079e4749721353a67c22898b5704c04aed1e1e149db07ecd0ed15309af377bd6f2e91068d8f6a329f7b80f1b48ffec1856 SHA512 f25f8e351baa659cee514d19cbf30cbb2ded67aececdedcf99be2d08c7fe0ce870d878a076bec3531bec349f4e295839f7131335190d135827f034c314ba37ef
diff --git a/dev-go/levenshtein/levenshtein-0.0.1.ebuild b/dev-go/levenshtein/levenshtein-0.0.1.ebuild
new file mode 100644
index 0000000..5d88a5e
--- /dev/null
+++ b/dev-go/levenshtein/levenshtein-0.0.1.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+CROS_GO_SOURCE=(
+	"github.com/texttheater/golang-levenshtein eb6844b05fc6f7e10932b0621c7f5f7e8890541d"
+)
+
+CROS_GO_PACKAGES=(
+	"github.com/texttheater/golang-levenshtein/levenshtein"
+)
+
+inherit cros-go
+
+DESCRIPTION="Go subcommand library"
+HOMEPAGE="https://github.com/texttheater/golang-levenshtein/levenshtein"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND=""
+RDEPEND="${DEPEND}"
diff --git a/dev-go/luci-auth/Manifest b/dev-go/luci-auth/Manifest
index 3ebad664..99be8de 100644
--- a/dev-go/luci-auth/Manifest
+++ b/dev-go/luci-auth/Manifest
@@ -1 +1 @@
-DIST chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz 6362566 SHA256 dc13cb6365918e3c29c7270c76e39d151f56efba4f75b61b9ea90f07a2f7c3e0 SHA512 f446a11de7d332134d3e4f0ddb75f6de4e7bc7387a4a9bb6c0377b75306dc02827ba6a4e6189fbff7476a5b51d5f3073431b4803e916b7d604a4dc02e45da30e WHIRLPOOL 8afe422581478e1e6f72dba80a68719df6c146a07449a28d54fc18caf7801271f4be87513d0a08b9f8016ced6ddcdbfc407493e3597a56655373e9187a71ee5b
+DIST chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz 6362566 BLAKE2B 4a79162ca5ae7f49d6e122f6051fe87ce14575a67d0c395c40ddbd038463e658b37ff7e2ca638da56113d6f4971f9d60f9698a166eb5b210420da23809144ac6 SHA512 f446a11de7d332134d3e4f0ddb75f6de4e7bc7387a4a9bb6c0377b75306dc02827ba6a4e6189fbff7476a5b51d5f3073431b4803e916b7d604a4dc02e45da30e
diff --git a/dev-go/luci-auth/luci-auth-0.0.1-r3.ebuild b/dev-go/luci-auth/luci-auth-0.0.1-r4.ebuild
similarity index 100%
rename from dev-go/luci-auth/luci-auth-0.0.1-r3.ebuild
rename to dev-go/luci-auth/luci-auth-0.0.1-r4.ebuild
diff --git a/dev-go/luci-auth/luci-auth-0.0.1.ebuild b/dev-go/luci-auth/luci-auth-0.0.1.ebuild
index 4a99e56..3f094f0 100644
--- a/dev-go/luci-auth/luci-auth-0.0.1.ebuild
+++ b/dev-go/luci-auth/luci-auth-0.0.1.ebuild
@@ -3,14 +3,15 @@
 
 EAPI=5
 
-# The dev-go/luci-* packages are all built from this repo.  They should
+# The dev-go/luci-* packages are all built from this repo. They should
 # be updated together.
 CROS_GO_SOURCE="chromium.googlesource.com/infra/luci/luci-go:go.chromium.org/luci 77b23ce4c9189484e14035690f439c97f7629c2e"
 
 CROS_GO_PACKAGES=(
 	"go.chromium.org/luci/auth"
+	"go.chromium.org/luci/auth/client/..."
 	"go.chromium.org/luci/auth/internal"
-	"go.chromium.org/luci/auth/integration/localauth/rpcs"
+	"go.chromium.org/luci/auth/integration/..."
 )
 
 inherit cros-go
@@ -30,6 +31,7 @@
 	dev-go/gcp-compute
 	dev-go/grpc
 	dev-go/luci-common
+	dev-go/maruel-subcommands
 	dev-go/net
 	dev-go/oauth2
 "
diff --git a/dev-go/luci-common/luci-common-0.0.1-r5.ebuild b/dev-go/luci-common/luci-common-0.0.1-r6.ebuild
similarity index 100%
rename from dev-go/luci-common/luci-common-0.0.1-r5.ebuild
rename to dev-go/luci-common/luci-common-0.0.1-r6.ebuild
diff --git a/dev-go/luci-common/luci-common-0.0.1.ebuild b/dev-go/luci-common/luci-common-0.0.1.ebuild
index be802d17..40716fd 100644
--- a/dev-go/luci-common/luci-common-0.0.1.ebuild
+++ b/dev-go/luci-common/luci-common-0.0.1.ebuild
@@ -3,11 +3,12 @@
 
 EAPI=5
 
-# The dev-go/luci-* packages are all built from this repo.  They should
+# The dev-go/luci-* packages are all built from this repo. They should
 # be updated together.
 CROS_GO_SOURCE="chromium.googlesource.com/infra/luci/luci-go:go.chromium.org/luci 77b23ce4c9189484e14035690f439c97f7629c2e"
 
 CROS_GO_PACKAGES=(
+	"go.chromium.org/luci/common/cli"
 	"go.chromium.org/luci/common/clock"
 	"go.chromium.org/luci/common/clock/clockflag"
 	"go.chromium.org/luci/common/data/chunkstream"
@@ -29,13 +30,14 @@
 	"go.chromium.org/luci/common/proto/git"
 	"go.chromium.org/luci/common/proto/google"
 	"go.chromium.org/luci/common/proto/milo"
-	"go.chromium.org/luci/common/runtime/goroutine"
-	"go.chromium.org/luci/common/runtime/paniccatcher"
 	"go.chromium.org/luci/common/retry"
 	"go.chromium.org/luci/common/retry/transient"
+	"go.chromium.org/luci/common/runtime/goroutine"
+	"go.chromium.org/luci/common/runtime/paniccatcher"
 	"go.chromium.org/luci/common/sync/cancelcond"
 	"go.chromium.org/luci/common/sync/parallel"
 	"go.chromium.org/luci/common/system/environ"
+	"go.chromium.org/luci/common/system/exitcode"
 	"go.chromium.org/luci/common/system/terminal"
 	"go.chromium.org/luci/lucictx"
 )
@@ -57,6 +59,7 @@
 	dev-go/crypto
 	dev-go/gapi-googleapi
 	dev-go/gcp-pubsub
+	dev-go/maruel-subcommands
 	dev-go/net
 	dev-go/oauth2
 	dev-go/op-logging
diff --git a/dev-go/maruel-subcommands/Manifest b/dev-go/maruel-subcommands/Manifest
new file mode 100644
index 0000000..ccf5bff
--- /dev/null
+++ b/dev-go/maruel-subcommands/Manifest
@@ -0,0 +1 @@
+DIST github.com-maruel-subcommands-de1d40e70d4b89b9c560a4d308e0bc9f5c9e18d7.tar.gz 14303 BLAKE2B e043f1a18b1e566f62e528e3aa8835de28ed1992215d70ce73366d9558c62f0e8d23a292e0359d59ddaf2a680bba9e4d0345cd6d2795c7c41cf931fd5e8eb8fd SHA512 ce040f09b77f141c6ac89ffca33f571459a47af742567b276c3c333fa89b125db954c14ac4f90e1e6edb531f735cbc85c7badb63de94f820d88c38d0b47e207a
diff --git a/dev-go/maruel-subcommands/maruel-subcommands-0.0.1.ebuild b/dev-go/maruel-subcommands/maruel-subcommands-0.0.1.ebuild
new file mode 100644
index 0000000..5cc4a12
--- /dev/null
+++ b/dev-go/maruel-subcommands/maruel-subcommands-0.0.1.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+CROS_GO_SOURCE=(
+	"github.com/texttheater/golang-levenshtein eb6844b05fc6f7e10932b0621c7f5f7e8890541d"
+	"github.com/maruel/subcommands de1d40e70d4b89b9c560a4d308e0bc9f5c9e18d7"
+)
+
+CROS_GO_PACKAGES=(
+	"github.com/texttheater/golang-levenshtein/levenshtein"
+	"github.com/maruel/subcommands"
+)
+
+inherit cros-go
+
+DESCRIPTION="Go subcommand library"
+HOMEPAGE="https://github.com/maruel/subcommands"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+RESTRICT="binchecks strip"
+
+DEPEND="dev-go/levenshtein"
+RDEPEND="${DEPEND}"
diff --git a/dev-go/syzkaller/Manifest b/dev-go/syzkaller/Manifest
index 060d703..b5a39df 100644
--- a/dev-go/syzkaller/Manifest
+++ b/dev-go/syzkaller/Manifest
@@ -1 +1 @@
-DIST github.com-google-syzkaller-7604bb0341ac55d2ee620fa09fd18f06a6c3c727.tar.gz 8088997 BLAKE2B 7f8973addd72dac830b0201b4b5d53cc33346133ed03eaf3a1d7f121d9c8f174415fb5ddd90723b03f4789d6d383fab2c62cc5eea683405ecf5747f7be9b011b SHA512 d159cfb6b1f862fcc15a71477497f05f0e50f2c3df4ee7a5904fe26cd7edb3f90d155045a693e2d8f2ae12e7c6ad7173918de597f233bcc02092e0d5f6c7c65b
+DIST github.com-google-syzkaller-9c8124727c791c492f98fceaebf7b74d9ab78878.tar.gz 10872025 BLAKE2B 7ad026e474a28e001fe7a3498ad27afff96c4ff1b2ee5a8cdfc61b04a6f004ab3d8807776d91421e565c400c24c6b7a1cdb8f1566979b7c9c17664365a16ce60 SHA512 d615596f5569e5c38d641009afd691055eab44eb78ef2426be32ba838e7ea685d104bf734b8f55d2db5f3739a30f06393e673562da271c12b312ca6f3014887b
diff --git a/dev-go/syzkaller/files/0001-cros-syzkaller-do-not-check-for-git-version.patch b/dev-go/syzkaller/files/0001-cros-syzkaller-do-not-check-for-git-version.patch
index 7de8f84..d24044d 100644
--- a/dev-go/syzkaller/files/0001-cros-syzkaller-do-not-check-for-git-version.patch
+++ b/dev-go/syzkaller/files/0001-cros-syzkaller-do-not-check-for-git-version.patch
@@ -1,7 +1,7 @@
-From a531b4d2916019ca6a8f507e893c79b2467c75b6 Mon Sep 17 00:00:00 2001
+From 66a44206e555deaf93b18e6a82e65dc88cc40960 Mon Sep 17 00:00:00 2001
 From: Zubin Mithra <zsm@chromium.org>
-Date: Fri, 12 Jun 2020 11:46:28 -0700
-Subject: [PATCH] cros-syzkaller: do not check for git version
+Date: Sat, 18 Jul 2020 21:14:13 -0700
+Subject: [PATCH 1/2] cros-syzkaller: do not check for git version
 
 ---
  syz-fuzzer/testing.go  | 3 ---
@@ -9,7 +9,7 @@
  2 files changed, 6 deletions(-)
 
 diff --git a/syz-fuzzer/testing.go b/syz-fuzzer/testing.go
-index 2ed615c8..849960b2 100644
+index 2ed615c80..849960b22 100644
 --- a/syz-fuzzer/testing.go
 +++ b/syz-fuzzer/testing.go
 @@ -121,9 +121,6 @@ func checkMachine(args *checkArgs) (*rpctype.CheckArgs, error) {
@@ -23,7 +23,7 @@
  	if err != nil {
  		return nil, err
 diff --git a/syz-manager/manager.go b/syz-manager/manager.go
-index 7c275e28..51f1dff7 100644
+index 9ed3ff0e0..4d485c861 100644
 --- a/syz-manager/manager.go
 +++ b/syz-manager/manager.go
 @@ -112,9 +112,6 @@ type Crash struct {
@@ -31,11 +31,11 @@
  
  func main() {
 -	if prog.GitRevision == "" {
--		log.Fatalf("Bad syz-manager build. Build with make, run bin/syz-manager.")
+-		log.Fatalf("bad syz-manager build: build with make, run bin/syz-manager")
 -	}
  	flag.Parse()
  	log.EnableLogCaching(1000, 1<<20)
  	cfg, err := mgrconfig.LoadFile(*flagConfig)
 -- 
-2.27.0.290.gba653c62da-goog
+2.28.0.rc0.105.gf9edc3c819-goog
 
diff --git a/dev-go/syzkaller/files/0002-cros-syzkaller-do-not-use-go.sum-and-go.mod.patch b/dev-go/syzkaller/files/0002-cros-syzkaller-do-not-use-go.sum-and-go.mod.patch
new file mode 100644
index 0000000..14223f0
--- /dev/null
+++ b/dev-go/syzkaller/files/0002-cros-syzkaller-do-not-use-go.sum-and-go.mod.patch
@@ -0,0 +1,757 @@
+From a4b898615b1414a3b7cd7418e9dbe99c231661b2 Mon Sep 17 00:00:00 2001
+From: Zubin Mithra <zsm@chromium.org>
+Date: Sat, 18 Jul 2020 22:28:04 -0700
+Subject: [PATCH 2/2] cros-syzkaller: do not use go.sum and go.mod
+
+---
+ Makefile |   2 +-
+ go.mod   |  24 --
+ go.sum   | 692 -------------------------------------------------------
+ 3 files changed, 1 insertion(+), 717 deletions(-)
+ delete mode 100644 go.mod
+ delete mode 100644 go.sum
+
+diff --git a/Makefile b/Makefile
+index 6bbeb3cf7..15433a91e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -50,7 +50,7 @@ CGO_ENABLED ?= 0
+ export CGO_ENABLED
+ TARGETGOOS := $(TARGETOS)
+ TARGETGOARCH := $(TARGETVMARCH)
+-export GO111MODULE=on
++export GO111MODULE=off
+ export GOBIN=$(shell pwd -P)/bin
+ 
+ GITREV=$(shell git rev-parse HEAD)
+diff --git a/go.mod b/go.mod
+deleted file mode 100644
+index 464663b1a..000000000
+--- a/go.mod
++++ /dev/null
+@@ -1,24 +0,0 @@
+-module github.com/google/syzkaller
+-
+-go 1.14
+-
+-require (
+-	cloud.google.com/go v0.60.0 // indirect
+-	cloud.google.com/go/storage v1.10.0
+-	github.com/BurntSushi/toml v0.3.1 // indirect
+-	github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813
+-	github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
+-	github.com/golang/protobuf v1.4.2 // indirect
+-	github.com/golangci/golangci-lint v1.27.0
+-	github.com/google/go-cmp v0.5.0
+-	github.com/googleapis/gax-go v1.0.4-0.20191018151119-b443e5a67ec8 // indirect
+-	github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6
+-	github.com/jstemmer/go-junit-report v0.9.2-0.20191008195320-984a47ca6b0a // indirect
+-	golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
+-	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
+-	golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae
+-	golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de // indirect
+-	golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f
+-	google.golang.org/api v0.28.0
+-	google.golang.org/appengine v1.6.6
+-)
+diff --git a/go.sum b/go.sum
+deleted file mode 100644
+index 37f41a874..000000000
+--- a/go.sum
++++ /dev/null
+@@ -1,692 +0,0 @@
+-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+-cloud.google.com/go v0.52.1-0.20200128230113-ad7cd32b39df h1:bLwk/IaPzJRhDU9Z5V2wdZk7KVBjKDEQOveiKQ7TQRQ=
+-cloud.google.com/go v0.52.1-0.20200128230113-ad7cd32b39df/go.mod h1:4C2PM9flKpuWUKWYaYZKr2oWvjGLvMkPGwA2Ky0gOVk=
+-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+-cloud.google.com/go v0.60.0 h1:R+tDlceO7Ss+zyvtsdhTxacDyZ1k99xwskQ4FT7ruoM=
+-cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU=
+-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+-cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4=
+-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+-cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA=
+-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+-github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157 h1:hY39LwQHh+1kaovmIjOrlqnXNX6tygSRfLkkK33IkZU=
+-github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
+-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+-github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us=
+-github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
+-github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+-github.com/bombsimon/wsl/v3 v3.0.0 h1:w9f49xQatuaeTJFaNP4SpiWSR5vfT6IstPtM62JjcqA=
+-github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
+-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+-github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+-github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+-github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813 h1:NgO45/5mBLRVfiXerEFzH6ikcZ7DNRPS639xFg3ENzU=
+-github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
+-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+-github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
+-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+-github.com/go-critic/go-critic v0.4.1 h1:4DTQfT1wWwLg/hzxwD9bkdhDQrdJtxe6DUTadPlrIeE=
+-github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g=
+-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+-github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0=
+-github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
+-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+-github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+-github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
+-github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
+-github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8=
+-github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
+-github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+-github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ=
+-github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+-github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+-github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
+-github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
+-github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
+-github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+-github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
+-github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
+-github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+-github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
+-github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
+-github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
+-github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA=
+-github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+-github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
+-github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+-github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+-github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b h1:ekuhfTjngPhisSjOJ0QWKpPQE8/rbknHaes6WVJj5Hw=
+-github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+-github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
+-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
+-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+-github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
+-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+-github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
+-github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
+-github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
+-github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
+-github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w=
+-github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
+-github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
+-github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
+-github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
+-github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
+-github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8=
+-github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+-github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks=
+-github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
+-github.com/golangci/golangci-lint v1.27.0 h1:VYLx63qb+XJsHdZ27PMS2w5JZacN0XG8ffUwe7yQomo=
+-github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng=
+-github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI=
+-github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
+-github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
+-github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
+-github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
+-github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
+-github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
+-github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
+-github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
+-github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
+-github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
+-github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+-github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
+-github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
+-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+-github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
+-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+-github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+-github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+-github.com/googleapis/gax-go v1.0.4-0.20191018151119-b443e5a67ec8 h1:DZttGJT+BxUyKpLY8flMttyfOCIqSZ2zxWH7ay+v+p4=
+-github.com/googleapis/gax-go v1.0.4-0.20191018151119-b443e5a67ec8/go.mod h1:C6wb7rkQZQPfbGXy5yoAQZSIF8knRzg9lnSD/OPY0x0=
+-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+-github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
+-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+-github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
+-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+-github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+-github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw=
+-github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+-github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c=
+-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+-github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk=
+-github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
+-github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4=
+-github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
+-github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+-github.com/jstemmer/go-junit-report v0.9.2-0.20191008195320-984a47ca6b0a h1:vQd3e1rv9toNsvB8kUX/aFeU+jYKC0+N1K/weBj/Deo=
+-github.com/jstemmer/go-junit-report v0.9.2-0.20191008195320-984a47ca6b0a/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+-github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
+-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+-github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+-github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+-github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+-github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+-github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+-github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+-github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+-github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
+-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+-github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ=
+-github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
+-github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE=
+-github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
+-github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
+-github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+-github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
+-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+-github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+-github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
+-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
+-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+-github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
+-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+-github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
+-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+-github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw=
+-github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
+-github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E=
+-github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
+-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+-github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+-github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
+-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+-github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+-github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
+-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+-github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
+-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+-github.com/ryancurrah/gomodguard v1.0.4 h1:oCreMAt9GuFXDe9jW4HBpc3GjdX3R/sUEcLAGh1zPx8=
+-github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE=
+-github.com/securego/gosec/v2 v2.3.0 h1:y/9mCF2WPDbSDpL3QDWZD3HHGrSYw0QSHnCqTfs4JPE=
+-github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME=
+-github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
+-github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+-github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
+-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+-github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs=
+-github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
+-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+-github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+-github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+-github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
+-github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+-github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+-github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk=
+-github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
+-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+-github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
+-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+-github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
+-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+-github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+-github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ=
+-github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
+-github.com/tetafro/godot v0.3.7 h1:+mecr7RKrUKB5UQ1gwqEMn13sDKTyDR8KNIquB9mm+8=
+-github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0=
+-github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q=
+-github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
+-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+-github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As=
+-github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
+-github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
+-github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+-github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo=
+-github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
+-github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg=
+-github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
+-github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs=
+-github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
+-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
+-github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
+-github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
+-github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+-go.opencensus.io v0.22.3-0.20200113180412-d851005f548f h1:O9epsUKZqqxvHwCxCrLwa18Rlfxqx90ARculDdp0F4k=
+-go.opencensus.io v0.22.3-0.20200113180412-d851005f548f/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+-go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
+-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+-golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+-golang.org/x/exp v0.0.0-20190221220918-438050ddec5e/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a h1:7Wlg8L54In96HTWOaI4sreLJ6qfyGuvSau5el3fK41Y=
+-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
+-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+-golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
+-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
+-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+-golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
+-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE=
+-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
+-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo=
+-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+-golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de h1:aYKJLPSrddB2N7/6OKyFqJ337SXpo61bBuvO5p1+7iY=
+-golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+-golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+-golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+-golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
+-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20191217033636-bbbf87ae2631/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200128002243-345141a36859 h1:xIszjAtlVeHg9hhv6Zhntvwqowji1k2rrgoOhj/aaKw=
+-golang.org/x/tools v0.0.0-20200128002243-345141a36859/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+-golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+-golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f h1:JcoF/bowzCDI+MXu1yLqQGNO3ibqWsWq+Sk7pOT218w=
+-golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+-google.golang.org/api v0.15.1-0.20200128000756-b6b5836d7694 h1:tqUqCnXx0MUli7nGhKvJXY4/hene+jZDm6SVzUwMDrQ=
+-google.golang.org/api v0.15.1-0.20200128000756-b6b5836d7694/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+-google.golang.org/api v0.28.0 h1:jMF5hhVfMkTZwHW1SDpKq5CkgWLXOb31Foaca9Zr3oM=
+-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+-google.golang.org/appengine v1.6.6-0.20191219230319-b6ce0843b556 h1:izbxt5CMPQJwWcbfn8akOXiX3MM2UeV7G2axbB7s5n8=
+-google.golang.org/appengine v1.6.6-0.20191219230319-b6ce0843b556/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+-google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
+-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20200128133413-58ce757ed39b h1:c8OBoXP3kTbDWWB/oVE3FkR851p4iZ3MPadz7zXEIPU=
+-google.golang.org/genproto v0.0.0-20200128133413-58ce757ed39b/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+-google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5 h1:a/Sqq5B3dGnmxhuJZIHFsIxhEkqElErr5TaU6IqBAj0=
+-google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+-google.golang.org/grpc v1.28.0-pre.0.20200128222427-f97821dd2fec h1:ESJ+euDw5M/qlHvTJTAQ/HGfOcs7beHwxKte8HsU8j4=
+-google.golang.org/grpc v1.28.0-pre.0.20200128222427-f97821dd2fec/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+-google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
+-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+-google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+-gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
+-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+-honnef.co/go/tools v0.0.0-20200121224137-2774002210e8/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+-honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
+-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+-honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
+-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+-mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
+-mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
+-mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
+-mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
+-mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4=
+-mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
+-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+-sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c=
+-sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
+-- 
+2.28.0.rc0.105.gf9edc3c819-goog
+
diff --git a/dev-go/syzkaller/syzkaller-0.0.1.ebuild b/dev-go/syzkaller/syzkaller-0.0.1.ebuild
deleted file mode 100644
index a27817e..0000000
--- a/dev-go/syzkaller/syzkaller-0.0.1.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_GO_SOURCE="github.com/google/syzkaller 7604bb0341ac55d2ee620fa09fd18f06a6c3c727"
-
-CROS_GO_PACKAGES=(
-	"github.com/google/syzkaller"
-)
-
-inherit cros-go
-
-DESCRIPTION="Syzkaller kernel fuzzer"
-HOMEPAGE="https://github.com/google/syzkaller"
-SRC_URI="$(cros-go_src_uri)"
-
-LICENSE="Apache-2.0"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-SYZKALLER_PATH="src/github.com/google/syzkaller"
-
-src_prepare() {
-	cd "${SYZKALLER_PATH}" || die "unable to cd to extracted syzkaller directory"
-	eapply "${FILESDIR}"/0001-cros-syzkaller-do-not-check-for-git-version.patch
-	eapply_user
-}
-
-src_compile() {
-	cd "${SYZKALLER_PATH}" || die "unable to cd to extracted syzkaller directory"
-	CFLAGS="" GOPATH="${GOPATH}:${S}" make TARGETOS=linux TARGETARCH=amd64 || die "syzkaller build failed"
-}
-
-src_install() {
-	local bin_path="${SYZKALLER_PATH}/bin"
-	dobin "${bin_path}"/syz-manager || die "failed to install syz-manager"
-	dobin "${bin_path}"/linux_amd64/syz-fuzzer || die "failed to install syz-fuzzer"
-	dobin "${bin_path}"/linux_amd64/syz-executor || die "failed to install syz-executor"
-	dobin "${bin_path}"/linux_amd64/syz-execprog || die "failed to install syz-execprog"
-}
-
-# Overriding postinst for package github.com/google/syzkaller
-# as no Go files are present in the repository root directory
-# and getting list of packages inside cros-go_pkg_postinst() fails.
-pkg_postinst() {
-	:;
-}
diff --git a/dev-go/syzkaller/syzkaller-0.0.2.ebuild b/dev-go/syzkaller/syzkaller-0.0.2.ebuild
new file mode 100644
index 0000000..3e6abd8
--- /dev/null
+++ b/dev-go/syzkaller/syzkaller-0.0.2.ebuild
@@ -0,0 +1,51 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_GO_SOURCE="github.com/google/syzkaller 9c8124727c791c492f98fceaebf7b74d9ab78878"
+
+CROS_GO_PACKAGES=(
+	"github.com/google/syzkaller"
+)
+
+inherit cros-go
+
+DESCRIPTION="Syzkaller kernel fuzzer"
+HOMEPAGE="https://github.com/google/syzkaller"
+SRC_URI="$(cros-go_src_uri)"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+SYZKALLER_PATH="src/github.com/google/syzkaller"
+
+src_prepare() {
+	cd "${SYZKALLER_PATH}" || die "unable to cd to extracted syzkaller directory"
+	eapply "${FILESDIR}"/0001-cros-syzkaller-do-not-check-for-git-version.patch
+	eapply "${FILESDIR}"/0002-cros-syzkaller-do-not-use-go.sum-and-go.mod.patch
+	eapply_user
+}
+
+src_compile() {
+	cd "${SYZKALLER_PATH}" || die "unable to cd to extracted syzkaller directory"
+	CFLAGS="" GOPATH="${GOPATH}:${S}" make TARGETOS=linux TARGETARCH=amd64 || die "syzkaller build failed"
+}
+
+src_install() {
+	local bin_path="${SYZKALLER_PATH}/bin"
+	dobin "${bin_path}"/syz-manager || die "failed to install syz-manager"
+	dobin "${bin_path}"/linux_amd64/syz-fuzzer || die "failed to install syz-fuzzer"
+	dobin "${bin_path}"/linux_amd64/syz-executor || die "failed to install syz-executor"
+	dobin "${bin_path}"/linux_amd64/syz-execprog || die "failed to install syz-execprog"
+}
+
+# Overriding postinst for package github.com/google/syzkaller
+# as no Go files are present in the repository root directory
+# and getting list of packages inside cros-go_pkg_postinst() fails.
+pkg_postinst() {
+	:;
+}
diff --git a/dev-lang/go/OWNERS b/dev-lang/go/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/dev-lang/go/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/dev-lang/rust-bootstrap/Manifest b/dev-lang/rust-bootstrap/Manifest
new file mode 100644
index 0000000..9c263e5
--- /dev/null
+++ b/dev-lang/rust-bootstrap/Manifest
@@ -0,0 +1,18 @@
+DIST mrustc-0.9.tar.gz 905308 BLAKE2B 4e8829bce1d6a26028a4d8fb8373988e41989aaef4bdd21b3fcca1aee6f72d301b510ae4458502fc1be06c35601362ac5e23aeedfd0c099dd0d5414015f55c2a SHA512 7cefc6c1a4a6757b1b6351332fa2a71ea1eda0060d2d884f9e821fb17856f3ac26bdba7bde13e2c18bba9e243e5a599316e148479c3384d7899bc5223e9d5589
+DIST rustc-1.29.0-src.tar.gz 106092915 BLAKE2B 520bbbc49b130229e24a130cb7626184c9c06dfa07b50366d602e76e0005db2f996e7fc0da23de19e67783286caffaf4cb4ef830179f8e42efda1fed1542b248 SHA512 3c6b79cce5a42553bc4360591c6e6b42b36f035243b8cb688a0d4b08c10793e59d257bf9e781c9345c92f765a63a9e161e3e3346f02ddc733e4b401cb5aeb302
+DIST rustc-1.30.0-src.tar.gz 149490609 BLAKE2B 7b9403e40573b7bef82b850ed63a80fb75fed8839761de6da3a518584d2175ec681fb22b47b9a4bcd6fb7069c75e21821fc8fe1e9458f9e5c25ed7a56a553517 SHA512 a4737727818397a26974449e9e7ddc09ae7430a08102ae05729317b19675fa89ad82a8f5bc5b7c913d894866a30dfe3c539c80e29c2b0ade6ecde06db8216981
+DIST rustc-1.31.1-src.tar.gz 151163848 BLAKE2B 4d5712a4c85b49167577ecf5191792d9f437780c2c5dfecdb2582c5e49cfec8f6e6a92664e96a7fd552003eec9c2d6a9042ca1d17d9ba7dd00c6f5bfd74098a0 SHA512 76ca238c40694abab4982f4b788a0da34bbb3d8a6e4adb50b0b9138876407ac2cb4fc39cde057b8fa32729c543c5977d392167e96b82f76a01af31eaafe463cf
+DIST rustc-1.32.0-src.tar.gz 158503827 BLAKE2B f4a6c84f695a954e43b52d834b63b4b9d0ac4c3ae5e10a6a84e236a3d85cb0d2a406e4bdf1b954f3f03679e639dca25101541bc9d2a22cb47752fe666590720e SHA512 9bca5702fe4ea515b4401cf200cf472d3b24dd6c93bd4a783a4cd6c473a2e9dc715b642672e1c940770d2bab860633ffe0b8cec6fbbfc737e23aa2a21d6cd00a
+DIST rustc-1.33.0-src.tar.gz 159251963 BLAKE2B 34e797550687ee5bd4d2a4ae9b8823e34f5da63131a2dbc364ea6159af5d484c73b81ee23923c111566a5fcbfb937af67938e96ae667d78fd8d25ea4d0e879e7 SHA512 65ae2615f4639ccea146fc431aca62e6f0793aa5e584e786e706eefb30588056080300fd5752ce9226067dc213f1a468f96c21b2334f22c5751fa90ddbd3a2b4
+DIST rustc-1.34.2-src.tar.gz 149925014 BLAKE2B 2dc5ead0ca43f99786c43033e8860dbbddaf1594ecae17a0657ae93c55c0731f04c7dc338d5a126314ac97d320552201c9e7d2f02df047f48bcba4c5a3f30b16 SHA512 a9483c937915c482c9bebb1c60769a43978456ee222f3ff1379790cebc18dc4140b8b4d0a077dd1a5051f3c07113388597731e01f82c2f2b5b709e21cde3ecb3
+DIST rustc-1.35.0-src.tar.gz 151564062 BLAKE2B 727ada63dfc0bebfd59aee6ede3b7573980152700934a31a9ed345607185db738b0c7f5009484e16df2c62d334a8382228f50bd283f54b9c9f9eb7dacf37597d SHA512 b23e6e221bf96e8621ea7aba2e8fc686c2ba1ae334072f13f1f0d4b0ae909632f511a9c62fdcc29c7467af931269020298f799064651b676e387dd3e6dfe6e8e
+DIST rustc-1.36.0-src.tar.gz 154643124 BLAKE2B 8d07bffc4a1cae88784e01df24290a2acd24cb5565aad6302bfbc14f705a61175764dc901ff1f4aae271ca3bf1b21cbd704a53b10bc921cec73f35e109ba73b5 SHA512 f0bd470a98d2b044c2af40d0c19838c3f7410c4acea5b2f8b5bcf0ca8294917986e7e5aed7d00ea5520e8b03d7130f993e75125576c693ba571feae0d0b961e9
+DIST rustc-1.37.0-src.tar.gz 154114925 BLAKE2B 2023cb8d3c76f23cbd214b2777412932b4eeb74fa04323ade3c1ea150a60ed569f0bc92886bdb377e9def24a05b29a6e8dbd3bd7527cd6e6bbf46acfa8224a18 SHA512 d75dd3b664f4467750b93786126051f8a1d33e24823951bbe2a56b2c1f6c829c35dcfb7dbce2f98c5de212d882ab8bccdd99bb57facdb4bc1870eb81de824d74
+DIST rustc-1.38.0-src.tar.gz 152008577 BLAKE2B 0db953e6b081878f8d290640be255a5986be7d8b91d8d3acf8c7bcf5e9d2fd51e364ef1e419399b81af8918e41acd6ef22d62ba08f3d515034a650468f9fed83 SHA512 eef16fcbd234ffe76158dd971fcc10ca129816c47f84ff2f2fe424c42509c8661ab45458f968cd88bb8eb6bab028d5d86920a4dee1f673f48270e1f446ffa882
+DIST rustc-1.39.0-src.tar.gz 152803201 BLAKE2B f256bbef87161d245c15c17f20a30d84ee78d677365bc33882a4c84bee5c8081034d8a4bec191a91016fb0c83370ea7917b3c5238e01f4528e493805bfb0391c SHA512 77be74410b9f7a2e9f78f7a9860964e122ab9518553acc2cc80d5abeecf3302e9b3ed1fd29e022cccff1f9ff4a568b4015c0d3ac0a524f06e38e9cb360a3341e
+DIST rustc-1.40.0-src.tar.gz 132841622 BLAKE2B 96b2cf201f59c44ac3aea8aaa2dc01c75edd8f14e743310789326040b9fdf0b714bb3b8e405fdb5c41508711ad00fd02545f6be415b20ff9fcf00a057b32941d SHA512 8afdb7fddbc5f2cec05fe962cd425ff8f3f41b056ffc983135d21d5c7d217084a1d73b4f9e4ff12faf7731ff1332d2889b71eed0a5216dd5eff5302d26b33d1e
+DIST rustc-1.41.1-src.tar.gz 135341149 BLAKE2B b3d80ec6ae7cf0d407ed589e7f0969efe77dae4ddf8f32c6212c2de0aa641d3055472582f26f53c5b57b75002afc1b61925ff0a0d2c9168e98ceb4be7091d398 SHA512 b5fba98a3e1b50ab91ad093cec4347ba85f46aa7e7a0da18d39f794e43eebb56699292832051f0efcd97a8651c35c11a7079146fb2c909ebeab2305b79bb4587
+DIST rustc-1.42.0-src.tar.gz 135735490 BLAKE2B 1b8aad99cf96cda60e67a29aebadf915bbae69c5dbde5a68e5e6949360b3143329d9f046ba12e18abd93e408bc953630366ae1d7cb933565b41546ca654696c1 SHA512 00359778ba886393e9792763ebd2754ee0b0db535a246ce9dcbbedd63b6eb414e321b552c88d4347ca355b8066492ef657aa3ceca2bcf00dfd80e1a92fac24b0
+DIST rustc-1.43.1-src.tar.gz 136095096 BLAKE2B 70c6d0ba81dc56351ed2aab826477333176a8ed1f2988c5b822e041fc0c699d26d312c006c2d8b5f630f12b965a6184070d999492cd7f1ee6cf511cf67b78eb4 SHA512 d432e908a29732516cb1784a24df9f82c20852bb0cf4d0120208b0ff542c4b0d7ad0d6d78f826dd47b1f04e07d46cf4a9ac9fe9cff89f763a7241a59288cef22
+DIST rustc-1.44.1-src.tar.gz 136760887 BLAKE2B 0aa9a7cccefc3283c8ee51d214390de01083d97daaaf218013c6f4bcfcdeb25157e6f6afa5365d3db4121022c5cc3bec98c26f656025697da390ba5151cf26e8 SHA512 f6b719a2a63aa96a192a098f58ff1042251cee96a1ff742ecb09d5b88fe5be79bc7023f118e0a6c0d46aa1c819ff77274ab669668f8e53efa4eb5e3041227928
+DIST rustc-1.45.2-src.tar.gz 141671717 BLAKE2B 703d8208fef22acfd232626ad2ea661408745e604a8844eb5a6971e34bf065cd8eb52da43f7a193ae1a4788e6617801f64884b3f0f6c2ca1e4ab1533b4c6d460 SHA512 5996f899d3677dd73487561d95b0bee6d6e33f7087f40806fa8176d685de9e6d42974344c855402a9fc634c0e91e0df6e33fcb3194b3e4296e1a1cb49defb98e
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-8ddb05-invalid-output-constraint.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-8ddb05-invalid-output-constraint.patch
new file mode 100644
index 0000000..53ede11
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-8ddb05-invalid-output-constraint.patch
@@ -0,0 +1,81 @@
+commit 8ddb05ad09a873375be6179d33a9bcd330112c43
+Author: John Hodge <tpg@mutabah.net>
+Date:   Sun Nov 10 20:39:40 2019 +0800
+
+    Codegen C - Fix errors from travis OSX
+
+diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
+index 85246749..20ff95cb 100644
+--- a/src/trans/codegen_c.cpp
++++ b/src/trans/codegen_c.cpp
+@@ -602,7 +602,12 @@ namespace {
+             }
+             else
+             {
+-                m_of << "static inline uint128_t __mrustc_bitrev128(uint128_t v) { if(v==0) return 0; uint128_t rv = ((uint128_t)__mrustc_bitrev64(v>>64))|((uint128_t)__mrustc_bitrev64(v)<<64); }\n";
++                m_of << "static inline uint128_t __mrustc_bitrev128(uint128_t v) {"
++                    << " if(v==0) return 0;"
++                    << " uint128_t rv = ((uint128_t)__mrustc_bitrev64(v>>64))|((uint128_t)__mrustc_bitrev64(v)<<64);"
++                    << " return rv;"
++                    << " }\n"
++                    ;
+             }
+             for(int sz = 8; sz <= 64; sz *= 2)
+             {
+@@ -3949,9 +3954,15 @@ namespace {
+                     if (::std::strcmp(r, "{eax}") == 0 || ::std::strcmp(r, "{rax}") == 0) {
+                         return "a";
+                     }
++                    else if (::std::strcmp(r, "{ebx}") == 0 || ::std::strcmp(r, "{rbx}") == 0) {
++                        return "b";
++                    }
+                     else if (::std::strcmp(r, "{ecx}") == 0 || ::std::strcmp(r, "{rcx}") == 0) {
+                         return "c";
+                     }
++                    else if (::std::strcmp(r, "{edx}") == 0 || ::std::strcmp(r, "{rdx}") == 0) {
++                        return "d";
++                    }
+                     else {
+                         return r;
+                     }
+@@ -4010,12 +4021,16 @@ namespace {
+             {
+                 const auto& v = e.inputs[i];
+                 if (i != 0)    m_of << ", ";
++                // TODO: If this is the same reg as an output, use the output index
+                 m_of << "\"" << H::convert_reg(v.first.c_str()) << "\" ("; emit_lvalue(v.second); m_of << ")";
+             }
+             m_of << ": ";
+             for (unsigned int i = 0; i < e.clobbers.size(); i++)
+             {
+                 if (i != 0)    m_of << ", ";
++                if( e.tpl == "cpuid\n" && e.clobbers[i] == "rbx" ) {
++                    continue;
++                }
+                 m_of << "\"" << e.clobbers[i] << "\"";
+             }
+             m_of << ");\n";
+@@ -5214,6 +5229,7 @@ namespace {
+                 auto ordering = get_atomic_ordering(name, 7+4+1);
+                 const auto& ty = params.m_types.at(0);
+                 emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "(";
++                    m_of << "(volatile "; emit_ctype(ty); m_of << "*)";
+                     emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1));
+                     if( m_compiler == Compiler::Gcc )
+                     {
+@@ -5236,6 +5252,7 @@ namespace {
+                 const auto& ty = params.m_types.at(0);
+                 const char* op = (name.c_str()[7+1] == 'a' ? "imax" : "imin");    // m'a'x vs m'i'n
+                 emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "(";
++                    m_of << "(volatile "; emit_ctype(ty); m_of << "*)";
+                     emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1));
+                     if( m_compiler == Compiler::Gcc )
+                     {
+@@ -5250,6 +5267,7 @@ namespace {
+                 const auto& ty = params.m_types.at(0);
+                 const char* op = (name.c_str()[7+2] == 'a' ? "umax" : "umin");    // m'a'x vs m'i'n
+                 emit_lvalue(e.ret_val); m_of << " = __mrustc_atomicloop" << get_prim_size(ty) << "(";
++                    m_of << "(volatile "; emit_ctype(ty); m_of << "*)";
+                     emit_param(e.args.at(0)); m_of << ", "; emit_param(e.args.at(1));
+                     if( m_compiler == Compiler::Gcc )
+                     {
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-cc.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-cc.patch
new file mode 100644
index 0000000..f5792b2
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-cc.patch
@@ -0,0 +1,25 @@
+Take the name of the linker from the CC environment variable, if set.
+This uses unwrap_or(...) rather than unwrap_or_else(|| ...) because
+the latter fails to compile with mrustc-0.9.
+
+diff --git a/rustc-1.29.0-src/src/librustc_codegen_llvm/back/link.rs b/rustc-1.29.0-src/src/librustc_codegen_llvm/back/link.rs
+index 845a66c..cd5b0bd 100644
+--- a/rustc-1.29.0-src/src/librustc_codegen_llvm/back/link.rs
++++ b/rustc-1.29.0-src/src/librustc_codegen_llvm/back/link.rs
+@@ -84,6 +84,7 @@ pub fn get_linker(sess: &Session) -> (PathBuf, Command) {
+ 
+     let msvc_tool = windows_registry::find_tool(&sess.opts.target_triple.triple(), "link.exe");
+ 
++    let cc = env::var("CC").unwrap_or("cc".into());
+     let linker_path = sess.opts.cg.linker.as_ref().map(|s| &**s)
+         .or(sess.target.target.options.linker.as_ref().map(|s| s.as_ref()))
+         .unwrap_or(match sess.linker_flavor() {
+@@ -92,7 +93,7 @@ pub fn get_linker(sess: &Session) -> (PathBuf, Command) {
+             }
+             LinkerFlavor::Em if cfg!(windows) => "emcc.bat".as_ref(),
+             LinkerFlavor::Em => "emcc".as_ref(),
+-            LinkerFlavor::Gcc => "cc".as_ref(),
++            LinkerFlavor::Gcc => cc.as_ref(),
+             LinkerFlavor::Ld => "ld".as_ref(),
+             LinkerFlavor::Lld(_) => "lld".as_ref(),
+         });
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-compilation-fixes.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-compilation-fixes.patch
new file mode 100644
index 0000000..7926f00
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-compilation-fixes.patch
@@ -0,0 +1,121 @@
+mrustc-0.9.0 fails to compile out of the box:
+src/common.hpp:268:28: error: cannot increment value of type
+      'std::__1::__wrap_iter<const AST::Attribute *>'
+
+This patch fixes the code so that it compiles.
+
+diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
+index 827ac2d..4cb0061 100644
+--- a/src/ast/ast.cpp
++++ b/src/ast/ast.cpp
+@@ -47,6 +47,13 @@ const Attribute* AttributeList::get(const char *name) const
+     return 0;
+ }
+ 
++::std::ostream& operator<<(::std::ostream& os, const AttributeList& x) {
++    for(const auto& i : x.m_items) {
++        os << "#[" << i << "]";
++    }
++    return os;
++}
++
+ Attribute Attribute::clone() const
+ {
+     TU_MATCHA( (m_data), (e),
+diff --git a/src/ast/attrs.hpp b/src/ast/attrs.hpp
+index 7a6ce86..452debb 100644
+--- a/src/ast/attrs.hpp
++++ b/src/ast/attrs.hpp
+@@ -12,48 +12,6 @@
+ 
+ //
+ class Attribute;
+-::std::ostream& operator<<(::std::ostream& os, const Attribute& x);
+-
+-/// A list of attributes on an item (searchable by the attribute name)
+-class AttributeList
+-{
+-public:
+-    ::std::vector<Attribute> m_items;
+-
+-    AttributeList() {}
+-    AttributeList(::std::vector<Attribute> items):
+-        m_items( mv$(items) )
+-    {
+-    }
+-
+-    // Move present
+-    AttributeList(AttributeList&&) = default;
+-    AttributeList& operator=(AttributeList&&) = default;
+-    // No copy assign, but explicit copy
+-    explicit AttributeList(const AttributeList&) = default;
+-    AttributeList& operator=(const AttributeList&) = delete;
+-    // Explicit clone
+-    AttributeList clone() const;
+-
+-    void push_back(Attribute i);
+-
+-    const Attribute* get(const char *name) const;
+-    Attribute* get(const char *name) {
+-        return const_cast<Attribute*>( const_cast<const AttributeList*>(this)->get(name));
+-    }
+-    bool has(const char *name) const {
+-        return get(name) != 0;
+-    }
+-
+-    friend ::std::ostream& operator<<(::std::ostream& os, const AttributeList& x) {
+-        for(const auto& i : x.m_items) {
+-            os << "#[" << i << "]";
+-        }
+-        return os;
+-    }
+-};
+-
+-
+ TAGGED_UNION(AttributeData, None,
+     (None, struct {}),
+     (String, struct {
+@@ -153,7 +99,42 @@ public:
+     }
+ };
+ 
++::std::ostream& operator<<(::std::ostream& os, const Attribute& x);
++
++/// A list of attributes on an item (searchable by the attribute name)
++class AttributeList
++{
++public:
++    ::std::vector<Attribute> m_items;
++
++    AttributeList() {}
++    AttributeList(::std::vector<Attribute> items):
++        m_items( mv$(items) )
++    {
++    }
++
++    // Move present
++    AttributeList(AttributeList&&) = default;
++    AttributeList& operator=(AttributeList&&) = default;
++    // No copy assign, but explicit copy
++    explicit AttributeList(const AttributeList&) = default;
++    AttributeList& operator=(const AttributeList&) = delete;
++    // Explicit clone
++    AttributeList clone() const;
++
++    void push_back(Attribute i);
++
++    const Attribute* get(const char *name) const;
++    Attribute* get(const char *name) {
++        return const_cast<Attribute*>( const_cast<const AttributeList*>(this)->get(name));
++    }
++    bool has(const char *name) const {
++        return get(name) != 0;
++    }
++};
++
++::std::ostream& operator<<(::std::ostream& os, const AttributeList& x);
++
+ }   // namespace AST
+ 
+ #endif
+-
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libc++.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libc++.patch
new file mode 100644
index 0000000..23e80c7
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libc++.patch
@@ -0,0 +1,15 @@
+Link with libc++ instead of libstdc++. This avoids undefined reference to std::__1 errors.
+
+diff --git a/rustc-1.29.0-src/src/librustc_llvm/build.rs b/rustc-1.29.0-src/src/librustc_llvm/build.rs
+index 1619637..6ec0f83 100644
+--- a/rustc-1.29.0-src/src/librustc_llvm/build.rs
++++ b/rustc-1.29.0-src/src/librustc_llvm/build.rs
+@@ -248,7 +248,7 @@ fn main() {
+         // NetBSD uses a separate library when relocation is required
+         "stdc++_pic"
+     } else {
+-        "stdc++"
++        "c++"
+     };
+ 
+     // C++ runtime library
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libgit2-sys-pkg-config.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libgit2-sys-pkg-config.patch
new file mode 100644
index 0000000..5f2219f8
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-libgit2-sys-pkg-config.patch
@@ -0,0 +1,15 @@
+diff --git a/rustc-1.29.0-src/src/vendor/libgit2-sys/build.rs b/rustc-1.29.0-src/src/vendor/libgit2-sys/build.rs
+index 1e92dbc..883a0e4 100644
+--- a/rustc-1.29.0-src/src/vendor/libgit2-sys/build.rs
++++ b/rustc-1.29.0-src/src/vendor/libgit2-sys/build.rs
+@@ -29,7 +29,9 @@ fn main() {
+     if curl {
+         register_dep("CURL");
+     }
+-    let has_pkgconfig = Command::new("pkg-config").output().is_ok();
++    let pkg_config = env::var_os("PKG_CONFIG")
++        .unwrap_or_else(|| "pkg-config".into());
++    let has_pkgconfig = Command::new(pkg_config).output().is_ok();
+ 
+     if env::var("LIBGIT2_SYS_USE_PKG_CONFIG").is_ok() {
+         if pkg_config::find_library("libgit2").is_ok() {
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-no-curl.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-no-curl.patch
new file mode 100644
index 0000000..d4fadf9
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-no-curl.patch
@@ -0,0 +1,30 @@
+Remove invocations of curl. Instead, we will provide the sources in the ebuild.
+
+diff --git a/Makefile.orig b/Makefile
+index 97c6500..65f7e83 100644
+--- a/Makefile.orig
++++ b/Makefile
+@@ -185,12 +185,6 @@ RUSTCSRC: $(RUSTC_SRC_DL)
+ #
+ # NIGHTLY:
+ ifeq ($(RUSTC_SRC_TY),nightly)
+-rustc-nightly-src.tar.gz: $(RUSTC_SRC_DES)
+-	@export DL_RUST_DATE=$$(cat rust-nightly-date); \
+-	export DISK_RUST_DATE=$$([ -f $(RUSTC_SRC_DL) ] && cat $(RUSTC_SRC_DL)); \
+-	echo "Rust version on disk is '$${DISK_RUST_DATE}'. Downloading $${DL_RUST_DATE}."; \
+-	rm -f rustc-nightly-src.tar.gz; \
+-	curl -sS https://static.rust-lang.org/dist/$${DL_RUST_DATE}/rustc-nightly-src.tar.gz -o rustc-nightly-src.tar.gz
+ 
+ $(RUSTC_SRC_DL): rust-nightly-date rustc-nightly-src.tar.gz rustc-nightly-src.patch
+ 	@export DL_RUST_DATE=$$(cat rust-nightly-date); \
+@@ -204,10 +198,6 @@ $(RUSTC_SRC_DL): rust-nightly-date rustc-nightly-src.tar.gz rustc-nightly-src.pa
+ else
+ # NAMED (Stable or beta)
+ RUSTC_SRC_TARBALL := rustc-$(RUSTC_VERSION)-src.tar.gz
+-$(RUSTC_SRC_TARBALL): $(RUSTC_SRC_DES)
+-	@echo [CURL] $@
+-	@rm -f $@
+-	@curl -sS https://static.rust-lang.org/dist/$@ -o $@
+ $(RUSTC_SRC_DL): $(RUSTC_SRC_TARBALL) rustc-$(RUSTC_VERSION)-src.patch
+ 	tar -xf $(RUSTC_SRC_TARBALL)
+ 	cd $(RUSTCSRC) && patch -p0 < ../rustc-$(RUSTC_VERSION)-src.patch;
diff --git a/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-printf.patch b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-printf.patch
new file mode 100644
index 0000000..369190d
--- /dev/null
+++ b/dev-lang/rust-bootstrap/files/rust-bootstrap-1.45.2-printf.patch
@@ -0,0 +1,16 @@
+Use printf instead of echo to write the rustc shell script. This causes the
+"\\n" sequences to be interpreted as newlines instead of writing them literally.
+
+diff --git a/run_rustc/Makefile b/run_rustc/Makefile
+index 8cd16ae..698d60b 100644
+--- a/run_rustc/Makefile
++++ b/run_rustc/Makefile
+@@ -103,7 +103,7 @@ ifeq ($(RUSTC_VERSION),1.19.0)
+ else
+ 	cp $(OUTDIR)build-rustc/release/rustc_binary $(BINDIR)rustc_binary
+ endif
+-	echo '#!/bin/sh\nd=$$(dirname $$0)\nLD_LIBRARY_PATH="$(abspath $(LIBDIR))" $$d/rustc_binary $$@' >$@
++	printf '#!/bin/sh\nd=$$(dirname $$0)\nLD_LIBRARY_PATH="%s" $$d/rustc_binary $$@\n' $(abspath $(LIBDIR)) >$@
+ 	chmod +x $@
+ 
+ $(BINDIR)hello_world: $(RUST_SRC)test/run-pass/hello.rs $(LIBDIR)libstd.rlib $(BINDIR)rustc
diff --git a/dev-lang/rust-bootstrap/rust-bootstrap-1.45.2.ebuild b/dev-lang/rust-bootstrap/rust-bootstrap-1.45.2.ebuild
new file mode 100644
index 0000000..09b87d2
--- /dev/null
+++ b/dev-lang/rust-bootstrap/rust-bootstrap-1.45.2.ebuild
@@ -0,0 +1,178 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Bootstraps rustc (the official Rust compiler) using mrustc (a Rust
+# compiler written in C++).
+#
+# The version of this ebuild reflects the version of rustc that will
+# ultimately be installed.
+
+EAPI=7
+
+inherit toolchain-funcs
+
+DESCRIPTION="Bootstraps the rustc Rust compiler using mrustc"
+HOMEPAGE="https://github.com/thepowersgang/mrustc"
+MRUSTC_VERSION="0.9"
+MRUSTC_NAME="mrustc-${MRUSTC_VERSION}"
+INITIAL_RUSTC_VERSION="1.29.0"
+# Versions of rustc to build after the initial one.
+RUSTC_VERSION_SEQUENCE=(
+	1.30.0
+	1.31.1
+	1.32.0
+	1.33.0
+	1.34.2
+	1.35.0
+	1.36.0
+	1.37.0
+	1.38.0
+	1.39.0
+	1.40.0
+	1.41.1
+	1.42.0
+	1.43.1
+	1.44.1
+	${PV}
+)
+SRC_URI="gs://chromeos-localmirror/distfiles/${MRUSTC_NAME}.tar.gz
+	gs://chromeos-localmirror/distfiles/rustc-${INITIAL_RUSTC_VERSION}-src.tar.gz"
+for version in "${RUSTC_VERSION_SEQUENCE[@]}"; do
+	SRC_URI+=" gs://chromeos-localmirror/distfiles/rustc-${version}-src.tar.gz"
+done
+LICENSE="MIT Apache-2.0 BSD-1 BSD-2 BSD-4 UoI-NCSA"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="dev-libs/openssl
+	net-libs/libssh2"
+RDEPEND="${DEPEND}"
+
+PATCHES=(
+	"${FILESDIR}/${P}-no-curl.patch"
+	"${FILESDIR}/${P}-compilation-fixes.patch"
+	"${FILESDIR}/${P}-8ddb05-invalid-output-constraint.patch"
+	"${FILESDIR}/${P}-libgit2-sys-pkg-config.patch"
+	"${FILESDIR}/${P}-cc.patch"
+	"${FILESDIR}/${P}-libc++.patch"
+	"${FILESDIR}/${P}-printf.patch"
+)
+
+# These tasks take a long time to run for not much benefit: Most of the files
+# they check are never installed. Those that are are only there to bootstrap
+# the rust ebuild, which has the same RESTRICT anyway.
+RESTRICT="binchecks strip"
+
+S="${WORKDIR}/${MRUSTC_NAME}"
+
+src_unpack() {
+	default
+	# Move rustc sources to where mrustc expects them.
+	mv "${WORKDIR}/rustc-${INITIAL_RUSTC_VERSION}-src" "${S}" || die
+}
+
+src_prepare() {
+	# Call the default implementation. This applies PATCHES.
+	default
+
+	# The next few steps mirror what mrustc's Makefile does to configure the
+	# build for a specific rustc version.
+	(cd "rustc-${INITIAL_RUSTC_VERSION}-src" || die; eapply -p0 "${S}/rustc-${INITIAL_RUSTC_VERSION}-src.patch")
+	cd "${S}" || die
+	echo "${INITIAL_RUSTC_VERSION}" > "rust-version" || die
+	cp "rust-version" "rustc-${INITIAL_RUSTC_VERSION}-src/dl-version" || die
+
+	# There are some patches that need to be applied to the rustc versions
+	# we build with rustc. Apply them here.
+	local version
+	for version in "${RUSTC_VERSION_SEQUENCE[@]}"; do
+		einfo "Patching rustc-${version}"
+		(cd "${WORKDIR}/rustc-${version}-src" || die; eapply -p2 "${FILESDIR}/${P}-libc++.patch")
+	done
+}
+
+src_compile() {
+	# 1. Build initial rustc using mrustc
+	# -----------------------------------
+	#
+	# All of these specify:
+	#  - CC and CXX so that we build with Clang instead of a GCC version that defaults to pre-C99 C.
+	#  - LLVM_TARGETS, else it will be empty and rustc will not work.
+	#  - RUSTC_VERSION because the Makefiles will otherwise set it to an incorrect value.
+	#  - OPENSSL_DIR so that cargo knows where to look for OpenSSL headers.
+	export CC=$(tc-getBUILD_CC)
+	export CXX=$(tc-getBUILD_CXX)
+	export PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG)
+	export OPENSSL_DIR="${ESYSROOT}/usr"
+	# Two separate commands, because invoking just the second command leads to race
+	# conditions.
+	emake LLVM_TARGETS=X86 RUSTC_VERSION=${INITIAL_RUSTC_VERSION} output/rustc output/cargo
+	emake LLVM_TARGETS=X86 RUSTC_VERSION=${INITIAL_RUSTC_VERSION} -C run_rustc
+
+	# 2. Build successive versions of rustc using previous rustc
+	# ----------------------------------------------------------
+	local prev_version=${INITIAL_RUSTC_VERSION}
+	local prev_cargo="${S}/run_rustc/output/prefix/bin/cargo"
+	local prev_rustc="${S}/run_rustc/output/prefix/bin/rustc"
+	local next_version rustc_dir
+	for next_version in "${RUSTC_VERSION_SEQUENCE[@]}"; do
+		einfo "Building rustc-${next_version} using rustc-${prev_version}"
+		rustc_dir="${WORKDIR}/rustc-${next_version}-src"
+		cd "${rustc_dir}" || die "Could not chdir to ${rustc_dir}"
+		cat > config.toml <<EOF
+[build]
+cargo = "${prev_cargo}"
+rustc = "${prev_rustc}"
+docs = false
+vendor = true
+# extended means we also build cargo and a few other commands.
+extended = true
+
+[install]
+prefix = "${ED}/opt/rust-bootstrap-${next_version}"
+
+[rust]
+default-linker = "${CC}"
+
+[target.x86_64-unknown-linux-gnu]
+cc = "${CC}"
+cxx = "${CXX}"
+linker = "${CC}"
+EOF
+
+		# --stage 2 causes this to use the previously-built compiler,
+		# instead of the default behavior of downloading one from
+		# upstream.
+		./x.py --stage 2 build || die
+		# For some rustc versions (e.g. 1.31.1), the build script will exit with
+		# a nonzero exit status because miri fails to build when it is not in a git
+		# repository. This does not affect the ability to build the next rustc.
+		# So instead of looking at the exit code, we check if rustc and cargo
+		# were built.
+		prev_version=${next_version}
+		prev_cargo="${rustc_dir}/build/x86_64-unknown-linux-gnu/stage2-tools/x86_64-unknown-linux-gnu/release/cargo"
+		prev_rustc="${rustc_dir}/build/x86_64-unknown-linux-gnu/stage2/bin/rustc"
+		[[ -x "${prev_rustc}" ]] || die "Failed to build ${prev_rustc}"
+		[[ -x "${prev_cargo}" ]] || die "Failed to build ${prev_cargo}"
+		einfo "Built rustc-${next_version}"
+	done
+
+	# Remove the src/rust symlink which will be dangling after sources are
+	# removed, and the containing src directory.
+	rm "${WORKDIR}/rustc-${PV}-src/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/src/rust" || die
+	rmdir "${WORKDIR}/rustc-${PV}-src/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/src" || die
+}
+
+src_install() {
+	local obj="${WORKDIR}/rustc-${PV}-src/build/x86_64-unknown-linux-gnu/stage2"
+	local tools="${obj}-tools/x86_64-unknown-linux-gnu/release/"
+	exeinto "/opt/${P}/bin"
+	# With rustc-1.45.2 at least, regardless of the value of install.libdir,
+	# the rpath seems to end up as $ORIGIN/../lib. So install the libraries there.
+	insinto "/opt/${P}/lib"
+	doexe "${obj}/bin/rustc"
+	doexe "${tools}/cargo"
+	doins -r "${obj}/lib/"*
+	find "${D}" -name '*.so' -exec chmod +x '{}' ';'
+}
diff --git a/dev-lang/rust/Manifest b/dev-lang/rust/Manifest
index f9ab622..993f054 100644
--- a/dev-lang/rust/Manifest
+++ b/dev-lang/rust/Manifest
@@ -1,8 +1,8 @@
-DIST cargo-0.43.0-x86_64-unknown-linux-gnu.tar.gz 6850877 BLAKE2B 64235d1aba0b06412ffb5c5f2bcd67d605ba0f0f76bcc2ceaaa18c4a9d4c1ac9e7b75bdf783eefe160a07f88169211e2260d506b27c03f9749d496762a9962cb SHA512 4fbe827576a0644fab07dc14fa8affde4e280a403be60e8a1f1e1e2df0227932dc4a2b602f0b7e310fd67a4fe747a50d6c21f183f8c9f8682c808202b24e3d4e
-DIST cargo-0.44.0-x86_64-unknown-linux-gnu.tar.gz 7130467 BLAKE2B 683217e004e9f9adc693dd21cc1e7722327ccebafc0b6c3868e1ff408d51e5dc378c86638216238965e16319559eb8ac5f29abfa6998a1265c51ec8ff9294aec SHA512 29f1c5d8a14879df0f8c933c97775f2df05c54fa1d87905a014d8f8f627a65b325428dc57c64267a731669a3a57b749e0dc8d424ab7c39c3c5d59f9323b197e2
-DIST rust-std-1.42.0-x86_64-unknown-linux-gnu.tar.gz 25490508 BLAKE2B 944c806219f237b2776b10bdb3a19bf9a6a9ac909ab6df7e545b7c0a92f520f1b47bba4442a34fe879e8584f0e65248e35ef65cfd12a6f50a97b8ce239e4661e SHA512 c4b4570c2f82ef350a92386e6b2bd830f2566953d419224a9c9fc0dd21708bf02d0b6bc7daee30fec6371a104666fd50409b3181495257b5e2c8b770f5e973e2
-DIST rust-std-1.43.1-x86_64-unknown-linux-gnu.tar.gz 25934117 BLAKE2B 15d7d2e0b2bf28b034ae109b20e0ddf0b0761931df567c7dfbf35fd8b8f78fd950297f78df689abbc50bbc4d49afd3208be0fb898a5df44ae55da8b11ff84a20 SHA512 f8dac5e8d7ba745545c555586b24c637845702d4d70e1e5ba2e6296f2674cba7034b4e23dd8b6c9033e9b44649e5227aa0abe297e0ac3ce18ea0587a35937d91
-DIST rustc-1.42.0-x86_64-unknown-linux-gnu.tar.gz 90602079 BLAKE2B aab0fdf8176c045a0ca6627de788fefd217c1bce78c9b53269de09ac78d29501ba30f947851a532f6e88edf1b47045196b817a70984ac6fadab253690695bf55 SHA512 f2d081157b130e9190f0b0913b29a02f9a7589a4e22e3c21ff78caff5d9ce0971c1899762e19caa918cb1c6e79b5e6cfc1e203538efa674a3fbdf518212f5f4c
-DIST rustc-1.43.0-src.tar.gz 136038757 BLAKE2B a247a326f264ab329f153b0ac6e624cd100372b1214707d4a8ac6bd1dc20448b9b5b8b4accf76396ab67a3ee0d7f10d84a8a4c07195239c4e53c32d3a222ebd1 SHA512 99c01719cdfc2e573d7d25472238c52e500467301e63e1ea70e2d5edf6bf879dedcde99f77c66ceb9d4d114cafaa3bd5bd125d11a9ccecdf81094312db65c9c1
-DIST rustc-1.43.1-x86_64-unknown-linux-gnu.tar.gz 93064850 BLAKE2B ff9a34532d02cecec62786b2fd465f543a56bfdb5b33846b4f0dd3e211b8265a6ebb5108f0bdb8b43402b04970489ab7887e7ade37cb8228d6efa5e1dd316ad5 SHA512 3c759111de9c1801573693e99f301929301c921f7d9f12a799fcff313ebefb3b86a233d54f7e10e5d9f924b47fbe51dbfab3204ddcff743be9f890a99010d9d1
-DIST rustc-1.44.0-src.tar.gz 136756700 BLAKE2B 7d3a30ccb08c66babe808e25b8ea5cab85d4f9b5aec2fe7ae21d5fbe3194473ee97d9589c8a146fbac15e7409610ad5070db0b0d5701b072c9203e8e09687acc SHA512 f0a63d5f568dd1eed9b073ae61f236cd8ec691562ae1b6f38d16b43485d0e2591f341bdebb5adedfe378c386360360340ed4782178c0b0368fea3a696e71b5a6
+DIST cargo-0.45.0-x86_64-unknown-linux-gnu.tar.gz 7179449 BLAKE2B 45160eb3dbeb201840cffad556c3ce459302ae466ec9ed63f060634b87ee3f61bd1345a24f908cbc435138486f272a052046056b3b6b39d9b65b7d4654b7c9bd SHA512 5d63f9feb2dc9d9675372f0cacabde4ca1236081a42b71488f9697eeeec92b1dba9bd37a33c9d3e2ddbd686d180a488e394139e9ccf8dafdcaaf41485637a028
+DIST cargo-0.46.1-x86_64-unknown-linux-gnu.tar.gz 7235571 BLAKE2B 6d0b64055dd7aa846b7581ab35f4071d30f2bf6e5be838bce4e31e9d42cf89c09ff118277eb6feadad5a168fe7b0460201ccc47fbc4f10bab272d761272bff83 SHA512 edddda8921e4bdcc7a27250f9e6f20f884ec6af9089f6b0f72d7793136d42e430b777e34b285e42d25b70c4374ec8b3db74baadba1283123c0a73a8b42c93e8d
+DIST rust-std-1.44.0-x86_64-unknown-linux-gnu.tar.gz 26283034 BLAKE2B 5115ee74802ca91c4190602633c374323937f29d3419422092abc87fb968fde6be5469120b415f1fb2f0359b09d70cc5101d74281a8d6dbf65ffbad03b177c6b SHA512 54fe33dc7c49082cfa7c7f0e0590d339095d5cae5e038ac97546962a96c02463592b041775c69612c7190dcd157c8292af8ca094377075f10ce2c47c68cbf631
+DIST rust-std-1.45.2-x86_64-unknown-linux-gnu.tar.gz 26069244 BLAKE2B ae1344ac16f8f9edf8a2e20cf5ea9187c4db79575b6f42b887bfb382f4f5a21e09874a4d322c69a533aff4cb25097e0e19b339d2e1059274d73564714c6e8a77 SHA512 2d0ad09a0c0d1052e59ba29bdc9c0e3e5de0ba38099ecb838923fc75ac124b36066e4c5b9e45f2f373678f38cdd8367eb41d6058186be0b2d8387806e3c1c293
+DIST rustc-1.44.0-x86_64-unknown-linux-gnu.tar.gz 93602946 BLAKE2B 5c9fe1f4e0f575619bbe2d39dc9842f78c87cce9b41985bc4b4234df2b1007ae7c093bb5dd2ff305deb1eeedecd2894ceac977d29f2b9df51885c3bbe56f89d3 SHA512 bcdce3cb71b7c6abbdad79b69f20f3d87621377d48eb07bace8b08a9bb117a0a2ea80c19ab5dc918f1cd5369e361def9cc5090dedaad2715a9c84bb3624ce495
+DIST rustc-1.45.2-src.tar.gz 141671717 BLAKE2B 703d8208fef22acfd232626ad2ea661408745e604a8844eb5a6971e34bf065cd8eb52da43f7a193ae1a4788e6617801f64884b3f0f6c2ca1e4ab1533b4c6d460 SHA512 5996f899d3677dd73487561d95b0bee6d6e33f7087f40806fa8176d685de9e6d42974344c855402a9fc634c0e91e0df6e33fcb3194b3e4296e1a1cb49defb98e
+DIST rustc-1.45.2-x86_64-unknown-linux-gnu.tar.gz 73910606 BLAKE2B 4214f11668aca46e4262e459bea75bd95c770c3188ef48e756af03ee6d7a9d0e711a4f0d63de766b9bc8ab3e9e503d75a13f119d28ea7d714c63bdf89d5a7808 SHA512 34e96e7da38e1eec503507a26d4d75d38ef4a6d9dad03afe771d9fd7a79c8dfe430a503101ca311476d2aa260dbd7e984c631fb55ecc6004422962593d57fea6
+DIST rustc-1.46.0-src.tar.gz 149449054 BLAKE2B de01c934b795c01955e665fb9be815bfd75471921c3839f89954e8e91c335dc988a943025cdedde26b988e898d944776848e3869c06de78e34da8f1cb825400e SHA512 5c50f449930473577b1ffb5791e6a688394821b368873f788a7d6c984055500a01897523930b763a454982f31d0a2fd4e87dfe5c416dd83ec9c844017e92b98e
diff --git a/dev-lang/rust/OWNERS b/dev-lang/rust/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/dev-lang/rust/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/dev-lang/rust/UPGRADE.md b/dev-lang/rust/UPGRADE.md
index 37ba384..adf812a 100644
--- a/dev-lang/rust/UPGRADE.md
+++ b/dev-lang/rust/UPGRADE.md
@@ -11,11 +11,37 @@
 OLD_VERSION=1.34.0 # Current version
 NEW_VERSION=1.35.0 # New version
 
+# Be sure cross-compilers have been emerged.
+target_triples=( $(awk '/^RUSTC_TARGET_TRIPLES=\(/ { emit=1; next } /^)/ { if (emit) exit } /-cros-/ { if (emit) { print $1 } }' "rust-${OLD_VERSION}.ebuild") )
+for x in "${target_triples[@]}"; do command -v "${x}-clang" >/dev/null || sudo emerge -G "cross-${x}/gcc"; done
+
 # Copy ebuild for the new version.
 cp rust-${OLD_VERSION}.ebuild rust-${NEW_VERSION}.ebuild
 git add rust-${NEW_VERSION}.ebuild
 git rm rust-${DEL_VERSION}.ebuild
 
+# Download Rust's source.
+rust_src="$(mktemp)"
+src_tarfile_name="rustc-${NEW_VERSION}-src.tar.gz"
+curl -f "https://static.rust-lang.org/dist/${src_tarfile_name}" -o "${rust_src}"
+
+# Verify the signature of the source
+sig_file="/tmp/rustc_sig.asc"
+curl -f "https://static.rust-lang.org/dist/${src_tarfile_name}.asc" -o "${sig_file}"
+gpg --verify "${sig_file}" "${rust_src}"
+
+# ^^ If the above fails with:
+# ```
+# gpg: Can't check signature: No public key
+# ```
+# then you need to import the rustc key:
+# curl https://keybase.io/rust/pgp_keys.asc | gpg --import
+#
+# Once you've done that, please try again.
+
+# Copy source to localmirror.
+gsutil cp -n -a public-read "${rust_src}" "gs://chromeos-localmirror/distfiles/${src_tarfile_name}"
+
 # Copy patches for the new version.
 for x in files/rust-${OLD_VERSION}-*.patch; do cp $x ${x//${OLD_VERSION}/${NEW_VERSION}}; done
 git add files/rust-${NEW_VERSION}-*.patch
@@ -66,17 +92,6 @@
 
 - Update this document with additional tips or any steps that have changed.
 - Upload change for review. CC reviewers from previous upgrade.
-
-> Before sending to CQ, ensure every file in the `Manifest` is in localmirror
-> or gentoo mirror. First check for the file in
-> `gs://chromeos-mirror/gentoo/distfiles/` and then check in
-> `gs://chromeos-localmirror/distfiles/`. If the file is not in either one,
-> upload it using:
-
-```shell
-gsutil cp -a public-read \
-    /var/cache/chromeos-cache/distfiles/host/<file from manifest> \
-    gs://chromeos-localmirror/distfiles/
-```
+- Remember to add `Cq-Include-Trybots: chromeos/cq:cq-llvm-orchestrator` to your commit message
 
 - Kick off try-job: `cros tryjob -g <cl number> chromiumos-sdk-tryjob`.
diff --git a/dev-lang/rust/files/rust-1.43.0-cpuid-preserve-rbx.patch b/dev-lang/rust/files/rust-1.43.0-cpuid-preserve-rbx.patch
deleted file mode 100644
index b6b3c54..0000000
--- a/dev-lang/rust/files/rust-1.43.0-cpuid-preserve-rbx.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/src/stdarch/crates/core_arch/src/x86/cpuid.rs b/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-index f313c428..222a72ae 100644
---- a/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-+++ b/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-@@ -65,10 +65,14 @@ pub unsafe fn __cpuid_count(leaf: u32, sub_leaf: u32) -> CpuidResult {
-     #[cfg(target_arch = "x86_64")]
-     {
-         // x86-64 uses %rbx as the base register, so preserve it.
--        asm!("cpuid"
--             : "={eax}"(eax), "={ebx}"(ebx), "={ecx}"(ecx), "={edx}"(edx)
-+        asm!(r#"
-+             mov %rbx, %rsi
-+             cpuid
-+             xchg %rbx, %rsi
-+             "#
-+             : "={eax}"(eax), "={esi}"(ebx), "={ecx}"(ecx), "={edx}"(edx)
-              : "{eax}"(leaf), "{ecx}"(sub_leaf)
--             : "rbx" :);
-+             : :);
-     }
-     CpuidResult { eax, ebx, ecx, edx }
- }
diff --git a/dev-lang/rust/files/rust-1.43.0-enable-sanitizers.patch b/dev-lang/rust/files/rust-1.43.0-enable-sanitizers.patch
deleted file mode 100644
index 9d166b1..0000000
--- a/dev-lang/rust/files/rust-1.43.0-enable-sanitizers.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-Sanitizer runtimes are currently behind the `-Z` flag, which is only available
-on nightly builds of the compiler.  We would like to enable fuzzing on chrome
-os anyway so move the sanitizer option under `-C` instead since we don't build
-the toolchain in nightly mode.
-
-diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
-index a9e4fdba030..df78eaa7a75 100644
---- a/src/librustc_codegen_llvm/attributes.rs
-+++ b/src/librustc_codegen_llvm/attributes.rs
-@@ -49,7 +49,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
- /// Apply LLVM sanitize attributes.
- #[inline]
- pub fn sanitize(cx: &CodegenCx<'ll, '_>, codegen_fn_flags: CodegenFnAttrFlags, llfn: &'ll Value) {
--    if let Some(ref sanitizer) = cx.tcx.sess.opts.debugging_opts.sanitizer {
-+    if let Some(ref sanitizer) = cx.tcx.sess.opts.cg.sanitizer {
-         match *sanitizer {
-             Sanitizer::Address => {
-                 if !codegen_fn_flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
-@@ -141,7 +141,7 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
-     // Currently stack probes seem somewhat incompatible with the address
-     // sanitizer and thread sanitizer. With asan we're already protected from
-     // stack overflow anyway so we don't really need stack probes regardless.
--    match cx.sess().opts.debugging_opts.sanitizer {
-+    match cx.sess().opts.cg.sanitizer {
-         Some(Sanitizer::Address) | Some(Sanitizer::Thread) => return,
-         _ => {}
-     }
-diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs
-index 32604d5601d..fd6176ed061 100644
---- a/src/librustc_codegen_llvm/builder.rs
-+++ b/src/librustc_codegen_llvm/builder.rs
-@@ -1244,7 +1244,7 @@ impl Builder<'a, 'll, 'tcx> {
-         }
- 
-         let opts = &self.cx.sess().opts;
--        let emit = match opts.debugging_opts.sanitizer {
-+        let emit = match opts.cg.sanitizer {
-             // Some sanitizer use lifetime intrinsics. When they are in use,
-             // emit lifetime intrinsics regardless of optimization level.
-             Some(Sanitizer::Address) | Some(Sanitizer::Memory) => true,
-diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
-index 0dd2f029e8d..2ada4518cc7 100644
---- a/src/librustc_codegen_ssa/back/link.rs
-+++ b/src/librustc_codegen_ssa/back/link.rs
-@@ -507,7 +507,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
-     cmd.args(&sess.opts.debugging_opts.pre_link_arg);
- 
-     if sess.target.target.options.is_like_fuchsia {
--        let prefix = match sess.opts.debugging_opts.sanitizer {
-+        let prefix = match sess.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => "asan/",
-             _ => "",
-         };
-@@ -746,7 +746,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
- }
- 
- fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker: &mut dyn Linker) {
--    let sanitizer = match &sess.opts.debugging_opts.sanitizer {
-+    let sanitizer = match &sess.opts.cg.sanitizer {
-         Some(s) => s,
-         None => return,
-     };
-@@ -780,7 +780,11 @@ fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker:
-             linker.args(&["-Wl,-rpath".into(), "-Xlinker".into(), rpath.into()]);
-             linker.link_dylib(Symbol::intern(&libname));
-         }
--        "x86_64-unknown-linux-gnu" | "x86_64-fuchsia" | "aarch64-fuchsia" => {
-+        "x86_64-unknown-linux-gnu"
-+        | "x86_64-fuchsia"
-+        | "aarch64-fuchsia"
-+        | "x86_64-cros-linux-gnu"
-+        | "x86_64-pc-linux-gnu" => {
-             let filename = format!("librustc{}_rt.{}.a", channel, name);
-             let path = default_tlib.join(&filename);
-             linker.link_whole_rlib(&path);
-diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
-index 3fe256ce25b..1604704ce6d 100644
---- a/src/librustc_codegen_ssa/back/symbol_export.rs
-+++ b/src/librustc_codegen_ssa/back/symbol_export.rs
-@@ -204,7 +204,7 @@ fn exported_symbols_provider_local(
-         }));
-     }
- 
--    if let Some(Sanitizer::Memory) = tcx.sess.opts.debugging_opts.sanitizer {
-+    if let Some(Sanitizer::Memory) = tcx.sess.opts.cg.sanitizer {
-         // Similar to profiling, preserve weak msan symbol during LTO.
-         const MSAN_WEAK_SYMBOLS: [&str; 2] = ["__msan_track_origins", "__msan_keep_going"];
- 
-diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
-index 3afa4758253..5d0f7435374 100644
---- a/src/librustc_codegen_ssa/back/write.rs
-+++ b/src/librustc_codegen_ssa/back/write.rs
-@@ -369,7 +369,7 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
- 
-     modules_config.pgo_gen = sess.opts.cg.profile_generate.clone();
-     modules_config.pgo_use = sess.opts.cg.profile_use.clone();
--    modules_config.sanitizer = sess.opts.debugging_opts.sanitizer.clone();
-+    modules_config.sanitizer = sess.opts.cg.sanitizer.clone();
-     modules_config.sanitizer_recover = sess.opts.debugging_opts.sanitizer_recover.clone();
-     modules_config.sanitizer_memory_track_origins =
-         sess.opts.debugging_opts.sanitizer_memory_track_origins;
-diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
-index b6802505df7..40608fd94ff 100644
---- a/src/librustc_mir/transform/inline.rs
-+++ b/src/librustc_mir/transform/inline.rs
-@@ -231,7 +231,7 @@ impl Inliner<'tcx> {
- 
-         // Avoid inlining functions marked as no_sanitize if sanitizer is enabled,
-         // since instrumentation might be enabled and performed on the caller.
--        match self.tcx.sess.opts.debugging_opts.sanitizer {
-+        match self.tcx.sess.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => {
-                 if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
-                     return false;
-diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs
-index c273e7fdbf9..1e0f80d9e83 100644
---- a/src/librustc_session/config.rs
-+++ b/src/librustc_session/config.rs
-@@ -716,7 +716,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
-             }
-         }
-     }
--    if let Some(s) = &sess.opts.debugging_opts.sanitizer {
-+    if let Some(s) = &sess.opts.cg.sanitizer {
-         let symbol = Symbol::intern(&s.to_string());
-         ret.insert((sym::sanitize, Some(symbol)));
-     }
-diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
-index a1ecf4e8528..9cfc99b8ae2 100644
---- a/src/librustc_session/options.rs
-+++ b/src/librustc_session/options.rs
-@@ -699,6 +699,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
-         "allow the linker to link its default libraries"),
-     linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
-                                            "linker flavor"),
-+    sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
-+                                    "use a sanitizer"),
-     linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
-         parse_linker_plugin_lto, [TRACKED],
-         "generate build artifacts that are compatible with linker-based LTO."),
-@@ -860,8 +862,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
-         "take the breaks off const evaluation. NOTE: this is unsound"),
-     osx_rpath_install_name: bool = (false, parse_bool, [TRACKED],
-         "pass `-install_name @rpath/...` to the macOS linker"),
--    sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
--                                    "use a sanitizer"),
-     sanitizer_recover: Vec<Sanitizer> = (vec![], parse_sanitizer_list, [TRACKED],
-         "Enable recovery for selected sanitizers"),
-     sanitizer_memory_track_origins: usize = (0, parse_sanitizer_memory_track_origins, [TRACKED],
-diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
-index 173b120e1f6..62a4389f167 100644
---- a/src/librustc_session/session.rs
-+++ b/src/librustc_session/session.rs
-@@ -520,7 +520,7 @@ impl Session {
-             || self.opts.output_types.contains_key(&OutputType::Bitcode);
- 
-         // Address sanitizer and memory sanitizer use alloca name when reporting an issue.
--        let more_names = match self.opts.debugging_opts.sanitizer {
-+        let more_names = match self.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => true,
-             Some(Sanitizer::Memory) => true,
-             _ => more_names,
-@@ -1136,18 +1136,32 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
-     }
- 
-     // Sanitizers can only be used on some tested platforms.
--    if let Some(ref sanitizer) = sess.opts.debugging_opts.sanitizer {
-+    if let Some(ref sanitizer) = sess.opts.cg.sanitizer {
-         const ASAN_SUPPORTED_TARGETS: &[&str] = &[
-             "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-             "x86_64-apple-darwin",
-             "x86_64-fuchsia",
-             "aarch64-fuchsia",
-         ];
--        const TSAN_SUPPORTED_TARGETS: &[&str] =
--            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
--        const LSAN_SUPPORTED_TARGETS: &[&str] =
--            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
--        const MSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"];
-+        const TSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+            "x86_64-apple-darwin",
-+        ];
-+        const LSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+            "x86_64-apple-darwin",
-+        ];
-+        const MSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+        ];
- 
-         let supported_targets = match *sanitizer {
-             Sanitizer::Address => ASAN_SUPPORTED_TARGETS,
diff --git a/dev-lang/rust/files/rust-1.44.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch b/dev-lang/rust/files/rust-1.44.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
deleted file mode 100644
index 5f6c3a5..0000000
--- a/dev-lang/rust/files/rust-1.44.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 0d2bca57088e9024760c5b0629e7b2df021a4020 Mon Sep 17 00:00:00 2001
-From: Zach Reizner <zachr@google.com>
-Date: Wed, 23 Jan 2019 14:48:27 -0800
-Subject: [PATCH] Revert "[CMake] Unconditionally add .h and .td files to
- target sources"
-
-This reverts commit 6fb010f388bb2cb2f00fe039123092308ac4865d.
-
-Reason for revert: LLVM includes /usr/include/demangle.h which is not installed.
-
-BUG=chromium:924647
-TEST=cros tryjob chromiumos-sdk-tryjob
----
- src/llvm/cmake/modules/LLVMProcessSources.cmake | 17 +++++++++--------
- 1 file changed, 9 insertions(+), 8 deletions(-)
-
-diff --git a/src/llvm/cmake/modules/LLVMProcessSources.cmake b/src/llvm/cmake/modules/LLVMProcessSources.cmake
-index 7cbd2863500..f65f31d797c 100644
---- a/src/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake
-+++ b/src/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake
-@@ -52,15 +52,16 @@ function(llvm_process_sources OUT_VAR)
-   cmake_parse_arguments(ARG "" "" "ADDITIONAL_HEADERS;ADDITIONAL_HEADER_DIRS" ${ARGN})
-   set(sources ${ARG_UNPARSED_ARGUMENTS})
-   llvm_check_source_file_list( ${sources} )
--  
--  # This adds .td and .h files to the Visual Studio solution:
--  add_td_sources(sources)
--  find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}")
--  if (hdrs)
--    set_source_files_properties(${hdrs} PROPERTIES HEADER_FILE_ONLY ON)
-+  if( LLVM_ENABLE_IDE )
-+    # This adds .td and .h files to the Visual Studio solution:
-+    add_td_sources(sources)
-+    find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}")
-+    if (hdrs)
-+      set_source_files_properties(${hdrs} PROPERTIES HEADER_FILE_ONLY ON)
-+    endif()
-+    set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
-+    list(APPEND sources ${ARG_ADDITIONAL_HEADERS} ${hdrs})
-   endif()
--  set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
--  list(APPEND sources ${ARG_ADDITIONAL_HEADERS} ${hdrs})
- 
-   set( ${OUT_VAR} ${sources} PARENT_SCOPE )
- endfunction(llvm_process_sources)
--- 
-2.20.1.321.g9e740568ce-goog
diff --git a/dev-lang/rust/files/rust-1.44.0-add-cros-targets.patch b/dev-lang/rust/files/rust-1.44.0-add-cros-targets.patch
deleted file mode 100644
index 49e67f4..0000000
--- a/dev-lang/rust/files/rust-1.44.0-add-cros-targets.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-Because of crbug.com/711369, armv7 target triple's arch and ABI parts differ
-between chromeos and the rust. Until that bug is fixed, we have to add our own
-triple for armv7.
-
-Additionally, the Rust compiler does not implement a fallback for unknown
-target triple vendors (e.g. "cros" or "pc") to the "unknown" variant, so we
-add copies of the relevant cros targets here as well.
-
-diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
-index 67f45d3d230..51e0eef6630 100644
---- a/src/librustc_target/spec/mod.rs
-+++ b/src/librustc_target/spec/mod.rs
-@@ -335,6 +335,8 @@ macro_rules! supported_targets {
- supported_targets! {
-     ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
-     ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
-+    ("x86_64-pc-linux-gnu", x86_64_pc_linux_gnu),
-+    ("x86_64-cros-linux-gnu", x86_64_cros_linux_gnu),
-     ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
-     ("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
-     ("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
-@@ -364,11 +366,13 @@ supported_targets! {
-     ("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
-     ("armv7-unknown-linux-gnueabi", armv7_unknown_linux_gnueabi),
-     ("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
-+    ("armv7a-cros-linux-gnueabihf", armv7a_cros_linux_gnueabihf),
-     ("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
-     ("thumbv7neon-unknown-linux-musleabihf", thumbv7neon_unknown_linux_musleabihf),
-     ("armv7-unknown-linux-musleabi", armv7_unknown_linux_musleabi),
-     ("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
-     ("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
-+    ("aarch64-cros-linux-gnu", aarch64_cros_linux_gnu),
-     ("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
-     ("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
-     ("i686-unknown-linux-musl", i686_unknown_linux_musl),
diff --git a/dev-lang/rust/files/rust-1.44.0-cpuid-preserve-rbx.patch b/dev-lang/rust/files/rust-1.44.0-cpuid-preserve-rbx.patch
deleted file mode 100644
index 81578d52..0000000
--- a/dev-lang/rust/files/rust-1.44.0-cpuid-preserve-rbx.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/src/stdarch/crates/core_arch/src/x86/cpuid.rs b/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-index f313c428..222a72ae 100644
---- a/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-+++ b/src/stdarch/crates/core_arch/src/x86/cpuid.rs
-@@ -65,10 +65,14 @@ pub unsafe fn __cpuid_count(leaf: u32, sub_leaf: u32) -> CpuidResult {
-     #[cfg(target_arch = "x86_64")]
-     {
-         // x86-64 uses %rbx as the base register, so preserve it.
--        llvm_asm!("cpuid"
--                  : "={eax}"(eax), "={ebx}"(ebx), "={ecx}"(ecx), "={edx}"(edx)
-+        llvm_asm!(r#"
-+                  mov %rbx, %rsi
-+                  cpuid
-+                  xchg %rbx, %rsi
-+                  "#
-+                  : "={eax}"(eax), "={esi}"(ebx), "={ecx}"(ecx), "={edx}"(edx)
-                   : "{eax}"(leaf), "{ecx}"(sub_leaf)
--                  : "rbx" :);
-+                  : :);
-     }
-     CpuidResult { eax, ebx, ecx, edx }
- }
diff --git a/dev-lang/rust/files/rust-1.44.0-enable-sanitizers.patch b/dev-lang/rust/files/rust-1.44.0-enable-sanitizers.patch
deleted file mode 100644
index 96ca497..0000000
--- a/dev-lang/rust/files/rust-1.44.0-enable-sanitizers.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-Sanitizer runtimes are currently behind the `-Z` flag, which is only available
-on nightly builds of the compiler.  We would like to enable fuzzing on chrome
-os anyway so move the sanitizer option under `-C` instead since we don't build
-the toolchain in nightly mode.
-
-diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
-index ba286e5f40d..a665c27a1c5 100644
---- a/src/librustc_codegen_llvm/attributes.rs
-+++ b/src/librustc_codegen_llvm/attributes.rs
-@@ -46,7 +46,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
- /// Apply LLVM sanitize attributes.
- #[inline]
- pub fn sanitize(cx: &CodegenCx<'ll, '_>, codegen_fn_flags: CodegenFnAttrFlags, llfn: &'ll Value) {
--    if let Some(ref sanitizer) = cx.tcx.sess.opts.debugging_opts.sanitizer {
-+    if let Some(ref sanitizer) = cx.tcx.sess.opts.cg.sanitizer {
-         match *sanitizer {
-             Sanitizer::Address => {
-                 if !codegen_fn_flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
-@@ -123,7 +123,7 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
-     // Currently stack probes seem somewhat incompatible with the address
-     // sanitizer and thread sanitizer. With asan we're already protected from
-     // stack overflow anyway so we don't really need stack probes regardless.
--    match cx.sess().opts.debugging_opts.sanitizer {
-+    match cx.sess().opts.cg.sanitizer {
-         Some(Sanitizer::Address | Sanitizer::Thread) => return,
-         _ => {}
-     }
-diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs
-index 89bd96c1fe2..c4dd022f533 100644
---- a/src/librustc_codegen_llvm/builder.rs
-+++ b/src/librustc_codegen_llvm/builder.rs
-@@ -1244,7 +1244,7 @@ impl Builder<'a, 'll, 'tcx> {
-         }
- 
-         let opts = &self.cx.sess().opts;
--        let emit = match opts.debugging_opts.sanitizer {
-+        let emit = match opts.cg.sanitizer {
-             // Some sanitizer use lifetime intrinsics. When they are in use,
-             // emit lifetime intrinsics regardless of optimization level.
-             Some(Sanitizer::Address | Sanitizer::Memory) => true,
-diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
-index 8725bfaa025..3a27b860d94 100644
---- a/src/librustc_codegen_ssa/back/link.rs
-+++ b/src/librustc_codegen_ssa/back/link.rs
-@@ -681,7 +681,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
- }
- 
- fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker: &mut dyn Linker) {
--    let sanitizer = match &sess.opts.debugging_opts.sanitizer {
-+    let sanitizer = match &sess.opts.cg.sanitizer {
-         Some(s) => s,
-         None => return,
-     };
-@@ -715,7 +715,11 @@ fn link_sanitizer_runtime(sess: &Session, crate_type: config::CrateType, linker:
-             linker.args(&["-Wl,-rpath", "-Xlinker", rpath]);
-             linker.link_dylib(Symbol::intern(&libname));
-         }
--        "x86_64-unknown-linux-gnu" | "x86_64-fuchsia" | "aarch64-fuchsia" => {
-+        "x86_64-unknown-linux-gnu"
-+        | "x86_64-fuchsia"
-+        | "aarch64-fuchsia"
-+        | "x86_64-cros-linux-gnu"
-+        | "x86_64-pc-linux-gnu" => {
-             let filename = format!("librustc{}_rt.{}.a", channel, name);
-             let path = default_tlib.join(&filename);
-             linker.link_whole_rlib(&path);
-@@ -1440,7 +1444,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
- 
-     // NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
-     if sess.target.target.options.is_like_fuchsia {
--        let prefix = match sess.opts.debugging_opts.sanitizer {
-+        let prefix = match sess.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => "asan/",
-             _ => "",
-         };
-diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
-index d5489ff9505..339dabfa008 100644
---- a/src/librustc_codegen_ssa/back/symbol_export.rs
-+++ b/src/librustc_codegen_ssa/back/symbol_export.rs
-@@ -206,7 +206,7 @@ fn exported_symbols_provider_local(
-         }));
-     }
- 
--    if let Some(Sanitizer::Memory) = tcx.sess.opts.debugging_opts.sanitizer {
-+    if let Some(Sanitizer::Memory) = tcx.sess.opts.cg.sanitizer {
-         // Similar to profiling, preserve weak msan symbol during LTO.
-         const MSAN_WEAK_SYMBOLS: [&str; 2] = ["__msan_track_origins", "__msan_keep_going"];
- 
-diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
-index d81a767abd4..695f1eac99a 100644
---- a/src/librustc_codegen_ssa/back/write.rs
-+++ b/src/librustc_codegen_ssa/back/write.rs
-@@ -177,7 +177,7 @@ impl ModuleConfig {
-             ),
-             pgo_use: if_regular!(sess.opts.cg.profile_use.clone(), None),
- 
--            sanitizer: if_regular!(sess.opts.debugging_opts.sanitizer.clone(), None),
-+            sanitizer: if_regular!(sess.opts.cg.sanitizer.clone(), None),
-             sanitizer_recover: if_regular!(
-                 sess.opts.debugging_opts.sanitizer_recover.clone(),
-                 vec![]
-diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
-index 173c2a3f1d8..aa08ea6d94f 100644
---- a/src/librustc_mir/transform/inline.rs
-+++ b/src/librustc_mir/transform/inline.rs
-@@ -221,7 +221,7 @@ impl Inliner<'tcx> {
- 
-         // Avoid inlining functions marked as no_sanitize if sanitizer is enabled,
-         // since instrumentation might be enabled and performed on the caller.
--        match self.tcx.sess.opts.debugging_opts.sanitizer {
-+        match self.tcx.sess.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => {
-                 if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
-                     return false;
-diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs
-index 2513cfa73e5..a50768c04c5 100644
---- a/src/librustc_session/config.rs
-+++ b/src/librustc_session/config.rs
-@@ -713,7 +713,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
-             }
-         }
-     }
--    if let Some(s) = &sess.opts.debugging_opts.sanitizer {
-+    if let Some(s) = &sess.opts.cg.sanitizer {
-         let symbol = Symbol::intern(&s.to_string());
-         ret.insert((sym::sanitize, Some(symbol)));
-     }
-diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
-index 5e17fc98985..a6bfd9b3e83 100644
---- a/src/librustc_session/options.rs
-+++ b/src/librustc_session/options.rs
-@@ -695,6 +695,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
-         "allow the linker to link its default libraries (default: no)"),
-     linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
-                                            "linker flavor"),
-+    sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
-+        "use a sanitizer"),
-     linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
-         parse_linker_plugin_lto, [TRACKED],
-         "generate build artifacts that are compatible with linker-based LTO"),
-@@ -854,8 +856,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
-         "take the brakes off const evaluation. NOTE: this is unsound (default: no)"),
-     osx_rpath_install_name: bool = (false, parse_bool, [TRACKED],
-         "pass `-install_name @rpath/...` to the macOS linker (default: no)"),
--    sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
--        "use a sanitizer"),
-     sanitizer_recover: Vec<Sanitizer> = (vec![], parse_sanitizer_list, [TRACKED],
-         "enable recovery for selected sanitizers"),
-     sanitizer_memory_track_origins: usize = (0, parse_sanitizer_memory_track_origins, [TRACKED],
-diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
-index f0bbe1d0a18..e3085e834e1 100644
---- a/src/librustc_session/session.rs
-+++ b/src/librustc_session/session.rs
-@@ -531,7 +531,7 @@ impl Session {
-             || self.opts.output_types.contains_key(&OutputType::Bitcode);
- 
-         // Address sanitizer and memory sanitizer use alloca name when reporting an issue.
--        let more_names = match self.opts.debugging_opts.sanitizer {
-+        let more_names = match self.opts.cg.sanitizer {
-             Some(Sanitizer::Address) => true,
-             Some(Sanitizer::Memory) => true,
-             _ => more_names,
-@@ -1193,18 +1193,32 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
-     }
- 
-     // Sanitizers can only be used on some tested platforms.
--    if let Some(ref sanitizer) = sess.opts.debugging_opts.sanitizer {
-+    if let Some(ref sanitizer) = sess.opts.cg.sanitizer {
-         const ASAN_SUPPORTED_TARGETS: &[&str] = &[
-             "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-             "x86_64-apple-darwin",
-             "x86_64-fuchsia",
-             "aarch64-fuchsia",
-         ];
--        const TSAN_SUPPORTED_TARGETS: &[&str] =
--            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
--        const LSAN_SUPPORTED_TARGETS: &[&str] =
--            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
--        const MSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"];
-+        const TSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+            "x86_64-apple-darwin",
-+        ];
-+        const LSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+            "x86_64-apple-darwin",
-+        ];
-+        const MSAN_SUPPORTED_TARGETS: &[&str] = &[
-+            "x86_64-unknown-linux-gnu",
-+            "x86_64-cros-linux-gnu",
-+            "x86_64-pc-linux-gnu",
-+        ];
- 
-         let supported_targets = match *sanitizer {
-             Sanitizer::Address => ASAN_SUPPORTED_TARGETS,
diff --git a/dev-lang/rust/files/rust-1.44.0-fix-rpath.patch b/dev-lang/rust/files/rust-1.44.0-fix-rpath.patch
deleted file mode 100644
index 93ecc66..0000000
--- a/dev-lang/rust/files/rust-1.44.0-fix-rpath.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-Around the line of code this patches there is a long explanation of the rpath
-but the gist of it was that better handling of the rpath would be done in the
-future. For now, we just add the proper rpath.
-
-diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
-index d0eed3f12d1..63c8c6ea0b0 100644
---- a/src/bootstrap/builder.rs
-+++ b/src/bootstrap/builder.rs
-@@ -943,7 +943,7 @@ impl<'a> Builder<'a> {
-                 rustflags.arg("-Zosx-rpath-install-name");
-                 Some("-Wl,-rpath,@loader_path/../lib")
-             } else if !target.contains("windows") {
--                Some("-Wl,-rpath,$ORIGIN/../lib")
-+                Some("-Wl,-rpath,$ORIGIN/../lib:/usr/lib64/rust/rustlib/x86_64-unknown-linux-gnu/lib")
-             } else {
-                 None
-             };
diff --git a/dev-lang/rust/files/rust-1.44.0-no-test-on-build.patch b/dev-lang/rust/files/rust-1.44.0-no-test-on-build.patch
deleted file mode 100644
index 3dc82da..0000000
--- a/dev-lang/rust/files/rust-1.44.0-no-test-on-build.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-The only kind of bootstrap used here is `build`, which will erroneously try to build the Rust unit
-test framework on all targets. On many targets, this is a harmless mistake, but on the bare metal
-targets, this leads to an error such as:
-
-    warning: dropping unsupported crate type `dylib` for target `thumbv6m-none-eabi`
-
-    error[E0463]: can't find crate for `std`
-
-    error: aborting due to previous error
-
-    For more information about this error, try `rustc --explain E0463`.
-    error: Could not compile `term`.
-
-The missing `std` crate is expected because building the `std` crate is not applicable on bare metal
-targets. A deeper analysis of the bootstrap code follows:
-
-In many instances in the bootstrap code, there appear lines such as:
-
-     builder.ensure(compile::Test { compiler, target });
-
-These "ensure" that a specific target will get a certain component built (`compile::Test` in the
-above line), if not already previously "ensured." Usually, there is a guard clause checking to see
-if `target` is a `no_std` target (i.e. bare metal). However, these guard clauses and "ensure" calls
-are moot because `compile::Test` is part of the initialzed list of ensured bootstrap components for
-`Kind::Build` meaning that even `no_std` targets will get the unit test framework built, which has
-already been established as an impossibility.
-
-Note that there is a ton of code motion as of this commit:
-https://github.com/rust-lang/rust/commit/b47c9690d2974ec0318f1e87bf38f8f7ee6cf202
-
-Seeing as the `Std` build step behaves properly on no_std builds (see the comment in
-'src/bootstrap/compile.rs': "for no-std targets we only compile a few no_std crates"), the merge the
-libtest build step with libstd may actually mean things work properly without this patch in future
-rust releases.
-
-diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
-index 4cd793adaf5..c9cd92b95f5 100644
---- a/src/bootstrap/compile.rs
-+++ b/src/bootstrap/compile.rs
-@@ -390,6 +390,10 @@ impl Step for Test {
-         let target = self.target;
-         let compiler = self.compiler;
- 
-+        if builder.no_std(target) == Some(true) {
-+            return;
-+        }
-+
-         builder.ensure(Std { compiler, target });
- 
-         if builder.config.keep_stage.contains(&compiler.stage) {
diff --git a/dev-lang/rust/files/rust-1.44.0-sanitizer-supported.patch b/dev-lang/rust/files/rust-1.44.0-sanitizer-supported.patch
deleted file mode 100644
index 8e0e7aa..0000000
--- a/dev-lang/rust/files/rust-1.44.0-sanitizer-supported.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-Ensure that sanitizer runtimes are built for all our supported x86_64
-platforms.
-
-Now that we patch in our own custom -cros and -pc targets instead
-of falling back to -unknown, we need to add builds for those
-targets as well to allow the linker to find the correct versions
-of the librustc_[almt]san static libraries.
-
-diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs
-index a796685f9dd..20a7f0d8e59 100644
---- a/src/bootstrap/native.rs
-+++ b/src/bootstrap/native.rs
-@@ -660,7 +660,7 @@ fn supported_sanitizers(out_dir: &Path, target: Interned<String>) -> Vec<Sanitiz
-                 });
-             }
-         }
--        "x86_64-unknown-linux-gnu" => {
-+        "x86_64-unknown-linux-gnu" | "x86_64-cros-linux-gnu" | "x86_64-pc-linux-gnu" => {
-             for s in &["asan", "lsan", "msan", "tsan"] {
-                 result.push(SanitizerRuntime {
-                     cmake_target: format!("clang_rt.{}-x86_64", s),
diff --git a/dev-lang/rust/files/rust-1.43.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch b/dev-lang/rust/files/rust-1.45.2-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
similarity index 100%
copy from dev-lang/rust/files/rust-1.43.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
copy to dev-lang/rust/files/rust-1.45.2-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-add-cros-targets.patch b/dev-lang/rust/files/rust-1.45.2-add-cros-targets.patch
similarity index 100%
copy from dev-lang/rust/files/rust-1.43.0-add-cros-targets.patch
copy to dev-lang/rust/files/rust-1.45.2-add-cros-targets.patch
diff --git a/dev-lang/rust/files/rust-1.45.2-cc.patch b/dev-lang/rust/files/rust-1.45.2-cc.patch
new file mode 100644
index 0000000..eae217a
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.45.2-cc.patch
@@ -0,0 +1,50 @@
+If the CC environment variable is set, use its value instead of hardcoding "cc".
+This fixes crbug.com/1090829.
+
+diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
+index dcce1d4..cf306a4 100644
+--- a/src/librustc_codegen_ssa/back/link.rs
++++ b/src/librustc_codegen_ssa/back/link.rs
+@@ -789,12 +789,12 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
+             (Some(linker), Some(flavor)) => Some((linker, flavor)),
+             // only the linker flavor is known; use the default linker for the selected flavor
+             (None, Some(flavor)) => Some((
+-                PathBuf::from(match flavor {
++                match flavor {
+                     LinkerFlavor::Em => {
+                         if cfg!(windows) {
+-                            "emcc.bat"
++                            "emcc.bat".into()
+                         } else {
+-                            "emcc"
++                            "emcc".into()
+                         }
+                     }
+                     LinkerFlavor::Gcc => {
+@@ -805,16 +805,19 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
+                             // and many modern illumos distributions today
+                             // ship GCC as "gcc" without also making it
+                             // available as "cc".
+-                            "gcc"
++                            "gcc".into()
+                         } else {
+-                            "cc"
++                            match env::var_os("CC") {
++                                Some(path) => path.into(),
++                                None => "cc".into()
++                            }
+                         }
+                     }
+-                    LinkerFlavor::Ld => "ld",
+-                    LinkerFlavor::Msvc => "link.exe",
+-                    LinkerFlavor::Lld(_) => "lld",
+-                    LinkerFlavor::PtxLinker => "rust-ptx-linker",
+-                }),
++                    LinkerFlavor::Ld => "ld".into(),
++                    LinkerFlavor::Msvc => "link.exe".into(),
++                    LinkerFlavor::Lld(_) => "lld".into(),
++                    LinkerFlavor::PtxLinker => "rust-ptx-linker".into(),
++                },
+                 flavor,
+             )),
+             (Some(linker), None) => {
diff --git a/dev-lang/rust/files/rust-1.45.2-enable-sanitizers.patch b/dev-lang/rust/files/rust-1.45.2-enable-sanitizers.patch
new file mode 100644
index 0000000..59204a9
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.45.2-enable-sanitizers.patch
@@ -0,0 +1,193 @@
+Sanitizer runtimes are currently behind the `-Z` flag, which is only available
+on nightly builds of the compiler.  We would like to enable fuzzing on chrome
+os anyway so move the sanitizer option under `-C` instead since we don't build
+the toolchain in nightly mode.
+
+The changes this patch makes are:
+ - changing debugging_opts.sanitizer to cg.sanitizer.
+ - add the appropriate options to options.rs.
+
+diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
+index a4e17a5f675..0b109d392bf 100644
+--- a/src/librustc_codegen_llvm/attributes.rs
++++ b/src/librustc_codegen_llvm/attributes.rs
+@@ -46,7 +46,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
+ /// Apply LLVM sanitize attributes.
+ #[inline]
+ pub fn sanitize(cx: &CodegenCx<'ll, '_>, codegen_fn_flags: CodegenFnAttrFlags, llfn: &'ll Value) {
+-    if let Some(ref sanitizer) = cx.tcx.sess.opts.debugging_opts.sanitizer {
++    if let Some(ref sanitizer) = cx.tcx.sess.opts.cg.sanitizer {
+         match *sanitizer {
+             Sanitizer::Address => {
+                 if !codegen_fn_flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
+@@ -123,7 +123,7 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
+     // Currently stack probes seem somewhat incompatible with the address
+     // sanitizer and thread sanitizer. With asan we're already protected from
+     // stack overflow anyway so we don't really need stack probes regardless.
+-    match cx.sess().opts.debugging_opts.sanitizer {
++    match cx.sess().opts.cg.sanitizer {
+         Some(Sanitizer::Address | Sanitizer::Thread) => return,
+         _ => {}
+     }
+diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
+index dcce1d45298..ef5e7d2a42a 100644
+--- a/src/librustc_codegen_ssa/back/link.rs
++++ b/src/librustc_codegen_ssa/back/link.rs
+@@ -718,7 +718,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
+ }
+ 
+ fn link_sanitizer_runtime(sess: &Session, crate_type: CrateType, linker: &mut dyn Linker) {
+-    let sanitizer = match &sess.opts.debugging_opts.sanitizer {
++    let sanitizer = match &sess.opts.cg.sanitizer {
+         Some(s) => s,
+         None => return,
+     };
+@@ -752,7 +752,11 @@ fn link_sanitizer_runtime(sess: &Session, crate_type: CrateType, linker: &mut dy
+             linker.args(&["-Wl,-rpath", "-Xlinker", rpath]);
+             linker.link_dylib(Symbol::intern(&libname));
+         }
+-        "x86_64-unknown-linux-gnu" | "x86_64-fuchsia" | "aarch64-fuchsia" => {
++        "x86_64-unknown-linux-gnu"
++        | "x86_64-fuchsia"
++        | "aarch64-fuchsia"
++        | "x86_64-cros-linux-gnu"
++        | "x86_64-pc-linux-gnu" => {
+             let filename = format!("librustc{}_rt.{}.a", channel, name);
+             let path = default_tlib.join(&filename);
+             linker.link_whole_rlib(&path);
+@@ -1509,7 +1513,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
+ 
+     // NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
+     if sess.target.target.options.is_like_fuchsia && crate_type == CrateType::Executable {
+-        let prefix = match sess.opts.debugging_opts.sanitizer {
++        let prefix = match sess.opts.cg.sanitizer {
+             Some(Sanitizer::Address) => "asan/",
+             _ => "",
+         };
+diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
+index 970d13b30c0..50a82461fef 100644
+--- a/src/librustc_codegen_ssa/back/symbol_export.rs
++++ b/src/librustc_codegen_ssa/back/symbol_export.rs
+@@ -202,7 +202,7 @@ fn exported_symbols_provider_local(
+         }));
+     }
+ 
+-    if let Some(Sanitizer::Memory) = tcx.sess.opts.debugging_opts.sanitizer {
++    if let Some(Sanitizer::Memory) = tcx.sess.opts.cg.sanitizer {
+         // Similar to profiling, preserve weak msan symbol during LTO.
+         const MSAN_WEAK_SYMBOLS: [&str; 2] = ["__msan_track_origins", "__msan_keep_going"];
+ 
+diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
+index cb5c95c11fa..a040013901a 100644
+--- a/src/librustc_codegen_ssa/back/write.rs
++++ b/src/librustc_codegen_ssa/back/write.rs
+@@ -189,7 +189,7 @@ impl ModuleConfig {
+             ),
+             pgo_use: if_regular!(sess.opts.cg.profile_use.clone(), None),
+ 
+-            sanitizer: if_regular!(sess.opts.debugging_opts.sanitizer.clone(), None),
++            sanitizer: if_regular!(sess.opts.cg.sanitizer.clone(), None),
+             sanitizer_recover: if_regular!(
+                 sess.opts.debugging_opts.sanitizer_recover.clone(),
+                 vec![]
+diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
+index 35d55c4cb9b..e167ca3da51 100644
+--- a/src/librustc_mir/transform/inline.rs
++++ b/src/librustc_mir/transform/inline.rs
+@@ -232,7 +232,7 @@ impl Inliner<'tcx> {
+ 
+         // Avoid inlining functions marked as no_sanitize if sanitizer is enabled,
+         // since instrumentation might be enabled and performed on the caller.
+-        match self.tcx.sess.opts.debugging_opts.sanitizer {
++        match self.tcx.sess.opts.cg.sanitizer {
+             Some(Sanitizer::Address) => {
+                 if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NO_SANITIZE_ADDRESS) {
+                     return false;
+diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs
+index 5bdd7b67723..41569753010 100644
+--- a/src/librustc_session/config.rs
++++ b/src/librustc_session/config.rs
+@@ -726,7 +726,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
+             }
+         }
+     }
+-    if let Some(s) = &sess.opts.debugging_opts.sanitizer {
++    if let Some(s) = &sess.opts.cg.sanitizer {
+         let symbol = Symbol::intern(&s.to_string());
+         ret.insert((sym::sanitize, Some(symbol)));
+     }
+diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
+index a38e7f063d7..838fd26700f 100644
+--- a/src/librustc_session/options.rs
++++ b/src/librustc_session/options.rs
+@@ -759,6 +759,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
+         "print remarks for these optimization passes (space separated, or \"all\")"),
+     rpath: bool = (false, parse_bool, [UNTRACKED],
+         "set rpath values in libs/exes (default: no)"),
++    sanitizer: Option<Sanitizer> = (None, parse_sanitizer, [TRACKED],
++        "use a sanitizer"),
+     save_temps: bool = (false, parse_bool, [UNTRACKED],
+         "save all temporary output files during compilation (default: no)"),
+     soft_float: bool = (false, parse_bool, [TRACKED],
+diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
+index 048033846a1..b09e6acb981 100644
+--- a/src/librustc_session/session.rs
++++ b/src/librustc_session/session.rs
+@@ -650,7 +650,7 @@ impl Session {
+             || self.opts.output_types.contains_key(&OutputType::Bitcode);
+ 
+         // Address sanitizer and memory sanitizer use alloca name when reporting an issue.
+-        let more_names = match self.opts.debugging_opts.sanitizer {
++        let more_names = match self.opts.cg.sanitizer {
+             Some(Sanitizer::Address) => true,
+             Some(Sanitizer::Memory) => true,
+             _ => more_names,
+@@ -1017,7 +1017,7 @@ impl Session {
+ 
+     /// Checks if LLVM lifetime markers should be emitted.
+     pub fn emit_lifetime_markers(&self) -> bool {
+-        match self.opts.debugging_opts.sanitizer {
++        match self.opts.cg.sanitizer {
+             // AddressSanitizer uses lifetimes to detect use after scope bugs.
+             // MemorySanitizer uses lifetimes to detect use of uninitialized stack variables.
+             Some(Sanitizer::Address | Sanitizer::Memory) => true,
+@@ -1354,18 +1354,32 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
+     }
+ 
+     // Sanitizers can only be used on some tested platforms.
+-    if let Some(ref sanitizer) = sess.opts.debugging_opts.sanitizer {
++    if let Some(ref sanitizer) = sess.opts.cg.sanitizer {
+         const ASAN_SUPPORTED_TARGETS: &[&str] = &[
+             "x86_64-unknown-linux-gnu",
++            "x86_64-cros-linux-gnu",
++            "x86_64-pc-linux-gnu",
+             "x86_64-apple-darwin",
+             "x86_64-fuchsia",
+             "aarch64-fuchsia",
+         ];
+-        const TSAN_SUPPORTED_TARGETS: &[&str] =
+-            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
+-        const LSAN_SUPPORTED_TARGETS: &[&str] =
+-            &["x86_64-unknown-linux-gnu", "x86_64-apple-darwin"];
+-        const MSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"];
++        const TSAN_SUPPORTED_TARGETS: &[&str] = &[
++            "x86_64-unknown-linux-gnu",
++            "x86_64-cros-linux-gnu",
++            "x86_64-pc-linux-gnu",
++            "x86_64-apple-darwin",
++        ];
++        const LSAN_SUPPORTED_TARGETS: &[&str] = &[
++            "x86_64-unknown-linux-gnu",
++            "x86_64-cros-linux-gnu",
++            "x86_64-pc-linux-gnu",
++            "x86_64-apple-darwin",
++        ];
++        const MSAN_SUPPORTED_TARGETS: &[&str] = &[
++            "x86_64-unknown-linux-gnu",
++            "x86_64-cros-linux-gnu",
++            "x86_64-pc-linux-gnu",
++        ];
+ 
+         let supported_targets = match *sanitizer {
+             Sanitizer::Address => ASAN_SUPPORTED_TARGETS,
+
diff --git a/dev-lang/rust/files/rust-1.43.0-fix-rpath.patch b/dev-lang/rust/files/rust-1.45.2-fix-rpath.patch
similarity index 100%
copy from dev-lang/rust/files/rust-1.43.0-fix-rpath.patch
copy to dev-lang/rust/files/rust-1.45.2-fix-rpath.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-no-test-on-build.patch b/dev-lang/rust/files/rust-1.45.2-no-test-on-build.patch
similarity index 100%
copy from dev-lang/rust/files/rust-1.43.0-no-test-on-build.patch
copy to dev-lang/rust/files/rust-1.45.2-no-test-on-build.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-sanitizer-supported.patch b/dev-lang/rust/files/rust-1.45.2-sanitizer-supported.patch
similarity index 100%
rename from dev-lang/rust/files/rust-1.43.0-sanitizer-supported.patch
rename to dev-lang/rust/files/rust-1.45.2-sanitizer-supported.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch b/dev-lang/rust/files/rust-1.46.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
similarity index 100%
rename from dev-lang/rust/files/rust-1.43.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
rename to dev-lang/rust/files/rust-1.46.0-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-add-cros-targets.patch b/dev-lang/rust/files/rust-1.46.0-add-cros-targets.patch
similarity index 100%
rename from dev-lang/rust/files/rust-1.43.0-add-cros-targets.patch
rename to dev-lang/rust/files/rust-1.46.0-add-cros-targets.patch
diff --git a/dev-lang/rust/files/rust-1.46.0-cc.patch b/dev-lang/rust/files/rust-1.46.0-cc.patch
new file mode 100644
index 0000000..b2651c1
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.46.0-cc.patch
@@ -0,0 +1,50 @@
+If the CC environment variable is set, use its value instead of hardcoding "cc".
+This fixes crbug.com/1090829.
+
+diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
+index 8725bfa..5984569 100644
+--- a/src/librustc_codegen_ssa/back/link.rs
++++ b/src/librustc_codegen_ssa/back/link.rs
+@@ -752,12 +752,12 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
+             (Some(linker), Some(flavor)) => Some((linker, flavor)),
+             // only the linker flavor is known; use the default linker for the selected flavor
+             (None, Some(flavor)) => Some((
+-                PathBuf::from(match flavor {
++                match flavor {
+                     LinkerFlavor::Em => {
+                         if cfg!(windows) {
+-                            "emcc.bat"
++                            "emcc.bat".into()
+                         } else {
+-                            "emcc"
++                            "emcc".into()
+                         }
+                     }
+                     LinkerFlavor::Gcc => {
+@@ -768,16 +768,19 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
+                             // and many modern illumos distributions today
+                             // ship GCC as "gcc" without also making it
+                             // available as "cc".
+-                            "gcc"
++                            "gcc".into()
+                         } else {
+-                            "cc"
++                            match env::var_os("CC") {
++                                Some(path) => path.into(),
++                                None => "cc".into()
++                            }
+                         }
+                     }
+-                    LinkerFlavor::Ld => "ld",
+-                    LinkerFlavor::Msvc => "link.exe",
+-                    LinkerFlavor::Lld(_) => "lld",
+-                    LinkerFlavor::PtxLinker => "rust-ptx-linker",
+-                }),
++                    LinkerFlavor::Ld => "ld".into(),
++                    LinkerFlavor::Msvc => "link.exe".into(),
++                    LinkerFlavor::Lld(_) => "lld".into(),
++                    LinkerFlavor::PtxLinker => "rust-ptx-linker".into(),
++                },
+                 flavor,
+             )),
+             (Some(linker), None) => {
diff --git a/dev-lang/rust/files/rust-1.46.0-enable-sanitizers.patch b/dev-lang/rust/files/rust-1.46.0-enable-sanitizers.patch
new file mode 100644
index 0000000..4cf9729
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.46.0-enable-sanitizers.patch
@@ -0,0 +1,215 @@
+diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
+index 89b548a9c5a..a0e9c2db7ef 100644
+--- a/src/librustc_codegen_llvm/attributes.rs
++++ b/src/librustc_codegen_llvm/attributes.rs
+@@ -46,7 +46,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
+ /// Apply LLVM sanitize attributes.
+ #[inline]
+ pub fn sanitize(cx: &CodegenCx<'ll, '_>, no_sanitize: SanitizerSet, llfn: &'ll Value) {
+-    let enabled = cx.tcx.sess.opts.debugging_opts.sanitizer - no_sanitize;
++    let enabled = cx.tcx.sess.opts.cg.sanitizer - no_sanitize;
+     if enabled.contains(SanitizerSet::ADDRESS) {
+         llvm::Attribute::SanitizeAddress.apply_llfn(Function, llfn);
+     }
+@@ -113,13 +113,7 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
+     // Currently stack probes seem somewhat incompatible with the address
+     // sanitizer and thread sanitizer. With asan we're already protected from
+     // stack overflow anyway so we don't really need stack probes regardless.
+-    if cx
+-        .sess()
+-        .opts
+-        .debugging_opts
+-        .sanitizer
+-        .intersects(SanitizerSet::ADDRESS | SanitizerSet::THREAD)
+-    {
++    if cx.sess().opts.cg.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::THREAD) {
+         return;
+     }
+ 
+diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
+index eed068e2933..3946be6ab57 100644
+--- a/src/librustc_codegen_ssa/back/link.rs
++++ b/src/librustc_codegen_ssa/back/link.rs
+@@ -781,7 +781,7 @@ fn link_sanitizers(sess: &Session, crate_type: CrateType, linker: &mut dyn Linke
+     if crate_type != CrateType::Executable {
+         return;
+     }
+-    let sanitizer = sess.opts.debugging_opts.sanitizer;
++    let sanitizer = sess.opts.cg.sanitizer;
+     if sanitizer.contains(SanitizerSet::ADDRESS) {
+         link_sanitizer_runtime(sess, linker, "asan");
+     }
+@@ -818,7 +818,9 @@ fn link_sanitizer_runtime(sess: &Session, linker: &mut dyn Linker, name: &str) {
+         "aarch64-fuchsia"
+         | "aarch64-unknown-linux-gnu"
+         | "x86_64-fuchsia"
+-        | "x86_64-unknown-linux-gnu" => {
++        | "x86_64-unknown-linux-gnu"
++        | "x86_64-cros-linux-gnu"
++        | "x86_64-pc-linux-gnu" => {
+             let filename = format!("librustc{}_rt.{}.a", channel, name);
+             let path = default_tlib.join(&filename);
+             linker.link_whole_rlib(&path);
+@@ -1589,11 +1591,8 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
+ 
+     // NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
+     if sess.target.target.options.is_like_fuchsia && crate_type == CrateType::Executable {
+-        let prefix = if sess.opts.debugging_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
+-            "asan/"
+-        } else {
+-            ""
+-        };
++        let prefix =
++            if sess.opts.cg.sanitizer.contains(SanitizerSet::ADDRESS) { "asan/" } else { "" };
+         cmd.arg(format!("--dynamic-linker={}ld.so.1", prefix));
+     }
+ 
+diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs
+index 2efbfcb9950..ea97a78b263 100644
+--- a/src/librustc_codegen_ssa/back/symbol_export.rs
++++ b/src/librustc_codegen_ssa/back/symbol_export.rs
+@@ -204,7 +204,7 @@ fn exported_symbols_provider_local(
+         }));
+     }
+ 
+-    if tcx.sess.opts.debugging_opts.sanitizer.contains(SanitizerSet::MEMORY) {
++    if tcx.sess.opts.cg.sanitizer.contains(SanitizerSet::MEMORY) {
+         // Similar to profiling, preserve weak msan symbol during LTO.
+         const MSAN_WEAK_SYMBOLS: [&str; 2] = ["__msan_track_origins", "__msan_keep_going"];
+ 
+diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
+index 23e0b9344ec..47a6dd0492f 100644
+--- a/src/librustc_codegen_ssa/back/write.rs
++++ b/src/librustc_codegen_ssa/back/write.rs
+@@ -195,7 +195,7 @@ impl ModuleConfig {
+             ),
+             pgo_use: if_regular!(sess.opts.cg.profile_use.clone(), None),
+ 
+-            sanitizer: if_regular!(sess.opts.debugging_opts.sanitizer, SanitizerSet::empty()),
++            sanitizer: if_regular!(sess.opts.cg.sanitizer, SanitizerSet::empty()),
+             sanitizer_recover: if_regular!(
+                 sess.opts.debugging_opts.sanitizer_recover,
+                 SanitizerSet::empty()
+diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
+index c03be2a8fcd..61041da1b2c 100644
+--- a/src/librustc_mir/transform/inline.rs
++++ b/src/librustc_mir/transform/inline.rs
+@@ -238,7 +238,7 @@ impl Inliner<'tcx> {
+ 
+         // Avoid inlining functions marked as no_sanitize if sanitizer is enabled,
+         // since instrumentation might be enabled and performed on the caller.
+-        if self.tcx.sess.opts.debugging_opts.sanitizer.intersects(codegen_fn_attrs.no_sanitize) {
++        if self.tcx.sess.opts.cg.sanitizer.intersects(codegen_fn_attrs.no_sanitize) {
+             return false;
+         }
+ 
+diff --git a/src/librustc_session/config.rs b/src/librustc_session/config.rs
+index c5a866817cb..a9f8c810be9 100644
+--- a/src/librustc_session/config.rs
++++ b/src/librustc_session/config.rs
+@@ -748,7 +748,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
+         }
+     }
+ 
+-    for s in sess.opts.debugging_opts.sanitizer {
++    for s in sess.opts.cg.sanitizer {
+         let symbol = Symbol::intern(&s.to_string());
+         ret.insert((sym::sanitize, Some(symbol)));
+     }
+diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs
+index 2ad7d09cbf4..9613a4bb8cd 100644
+--- a/src/librustc_session/options.rs
++++ b/src/librustc_session/options.rs
+@@ -762,6 +762,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
+         "print remarks for these optimization passes (space separated, or \"all\")"),
+     rpath: bool = (false, parse_bool, [UNTRACKED],
+         "set rpath values in libs/exes (default: no)"),
++    sanitizer: SanitizerSet = (SanitizerSet::empty(), parse_sanitizers, [TRACKED],
++        "use a sanitizer"),
+     save_temps: bool = (false, parse_bool, [UNTRACKED],
+         "save all temporary output files during compilation (default: no)"),
+     soft_float: bool = (false, parse_bool, [TRACKED],
+@@ -979,8 +981,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
+     // soon.
+     run_dsymutil: bool = (true, parse_bool, [TRACKED],
+         "if on Mac, run `dsymutil` and delete intermediate object files (default: yes)"),
+-    sanitizer: SanitizerSet = (SanitizerSet::empty(), parse_sanitizers, [TRACKED],
+-        "use a sanitizer"),
+     sanitizer_memory_track_origins: usize = (0, parse_sanitizer_memory_track_origins, [TRACKED],
+         "enable origins tracking in MemorySanitizer"),
+     sanitizer_recover: SanitizerSet = (SanitizerSet::empty(), parse_sanitizers, [TRACKED],
+diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs
+index fcd5dab94a6..f43b83b00b1 100644
+--- a/src/librustc_session/session.rs
++++ b/src/librustc_session/session.rs
+@@ -652,7 +652,7 @@ impl Session {
+         let more_names = self.opts.output_types.contains_key(&OutputType::LlvmAssembly)
+             || self.opts.output_types.contains_key(&OutputType::Bitcode)
+             // AddressSanitizer and MemorySanitizer use alloca name when reporting an issue.
+-            || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY);
++            || self.opts.cg.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY);
+ 
+         self.opts.debugging_opts.fewer_names || !more_names
+     }
+@@ -1018,7 +1018,7 @@ impl Session {
+         self.opts.optimize != config::OptLevel::No
+         // AddressSanitizer uses lifetimes to detect use after scope bugs.
+         // MemorySanitizer uses lifetimes to detect use of uninitialized stack variables.
+-        || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY)
++        || self.opts.cg.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY)
+     }
+ }
+ 
+@@ -1363,16 +1363,32 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
+         "x86_64-apple-darwin",
+         "x86_64-fuchsia",
+         "x86_64-unknown-linux-gnu",
++        "x86_64-cros-linux-gnu",
++        "x86_64-pc-linux-gnu",
++    ];
++    const LSAN_SUPPORTED_TARGETS: &[&str] = &[
++        "aarch64-unknown-linux-gnu",
++        "x86_64-apple-darwin",
++        "x86_64-unknown-linux-gnu",
++        "x86_64-cros-linux-gnu",
++        "x86_64-pc-linux-gnu",
++    ];
++    const MSAN_SUPPORTED_TARGETS: &[&str] = &[
++        "aarch64-unknown-linux-gnu",
++        "x86_64-unknown-linux-gnu",
++        "x86_64-cros-linux-gnu",
++        "x86_64-pc-linux-gnu",
++    ];
++    const TSAN_SUPPORTED_TARGETS: &[&str] = &[
++        "aarch64-unknown-linux-gnu",
++        "x86_64-apple-darwin",
++        "x86_64-unknown-linux-gnu",
++        "x86_64-cros-linux-gnu",
++        "x86_64-pc-linux-gnu",
+     ];
+-    const LSAN_SUPPORTED_TARGETS: &[&str] =
+-        &["aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];
+-    const MSAN_SUPPORTED_TARGETS: &[&str] =
+-        &["aarch64-unknown-linux-gnu", "x86_64-unknown-linux-gnu"];
+-    const TSAN_SUPPORTED_TARGETS: &[&str] =
+-        &["aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];
+ 
+     // Sanitizers can only be used on some tested platforms.
+-    for s in sess.opts.debugging_opts.sanitizer {
++    for s in sess.opts.cg.sanitizer {
+         let supported_targets = match s {
+             SanitizerSet::ADDRESS => ASAN_SUPPORTED_TARGETS,
+             SanitizerSet::LEAK => LSAN_SUPPORTED_TARGETS,
+@@ -1387,10 +1403,10 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
+                 supported_targets.join(", ")
+             ));
+         }
+-        let conflicting = sess.opts.debugging_opts.sanitizer - s;
++        let conflicting = sess.opts.cg.sanitizer - s;
+         if !conflicting.is_empty() {
+             sess.err(&format!(
+-                "`-Zsanitizer={}` is incompatible with `-Zsanitizer={}`",
++                "`-Csanitizer={}` is incompatible with `-Csanitizer={}`",
+                 s, conflicting,
+             ));
+             // Don't report additional errors.
diff --git a/dev-lang/rust/files/rust-1.43.0-fix-rpath.patch b/dev-lang/rust/files/rust-1.46.0-fix-rpath.patch
similarity index 100%
rename from dev-lang/rust/files/rust-1.43.0-fix-rpath.patch
rename to dev-lang/rust/files/rust-1.46.0-fix-rpath.patch
diff --git a/dev-lang/rust/files/rust-1.43.0-no-test-on-build.patch b/dev-lang/rust/files/rust-1.46.0-no-test-on-build.patch
similarity index 100%
rename from dev-lang/rust/files/rust-1.43.0-no-test-on-build.patch
rename to dev-lang/rust/files/rust-1.46.0-no-test-on-build.patch
diff --git a/dev-lang/rust/files/rust-1.46.0-revert-libunwind-build.patch b/dev-lang/rust/files/rust-1.46.0-revert-libunwind-build.patch
new file mode 100644
index 0000000..f6a9b6d
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.46.0-revert-libunwind-build.patch
@@ -0,0 +1,21 @@
+This reverts commit 21abc88.
+
+Fixes https://github.com/rust-lang/rust/issues/76020
+
+Quote the open upstream CL (https://github.com/rust-lang/rust/issues/76026):
+I'm not sure what exact problem #72746 is supposed to fix, but it's probably incomplete as it breaks the build of 1.46.0 with llvm-libunwind enabled
+
+
+diff --git a/src/libunwind/build.rs b/src/libunwind/build.rs
+index 31d235cf679..d4bcd2ed4e8 100644
+--- a/src/libunwind/build.rs
++++ b/src/libunwind/build.rs
+@@ -116,8 +116,6 @@ mod llvm_libunwind {
+             cfg.flag("-fstrict-aliasing");
+             cfg.flag("-funwind-tables");
+             cfg.flag("-fvisibility=hidden");
+-            cfg.flag_if_supported("-fvisibility-global-new-delete-hidden");
+-            cfg.define("_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS", None);
+         }
+ 
+         let mut unwind_sources = vec![
diff --git a/dev-lang/rust/files/rust-1.46.0-sanitizer-supported.patch b/dev-lang/rust/files/rust-1.46.0-sanitizer-supported.patch
new file mode 100644
index 0000000..72c11606
--- /dev/null
+++ b/dev-lang/rust/files/rust-1.46.0-sanitizer-supported.patch
@@ -0,0 +1,13 @@
+diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs
+index e8ec575ea37..94afa2349f7 100644
+--- a/src/bootstrap/native.rs
++++ b/src/bootstrap/native.rs
+@@ -760,7 +760,7 @@ fn supported_sanitizers(
+         }
+         "x86_64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]),
+         "x86_64-fuchsia" => common_libs("fuchsia", "x86_64", &["asan"]),
+-        "x86_64-unknown-linux-gnu" => {
++        "x86_64-unknown-linux-gnu" | "x86_64-cros-linux-gnu" | "x86_64-pc-linux-gnu" => {
+             common_libs("linux", "x86_64", &["asan", "lsan", "msan", "tsan"])
+         }
+         _ => Vec::new(),
diff --git a/dev-lang/rust/rust-1.43.0.ebuild b/dev-lang/rust/rust-1.43.0.ebuild
deleted file mode 100644
index 6dc72da..0000000
--- a/dev-lang/rust/rust-1.43.0.ebuild
+++ /dev/null
@@ -1,206 +0,0 @@
-# Copyright 1999-2018 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-PYTHON_COMPAT=( python2_7 )
-inherit python-any-r1 versionator toolchain-funcs
-
-if [[ ${PV} = *beta* ]]; then
-	betaver=${PV//*beta}
-	BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
-	MY_P="rustc-beta"
-	SLOT="beta/${PV}"
-	SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.gz"
-	KEYWORDS=""
-else
-	ABI_VER="$(get_version_component_range 1-2)"
-	SLOT="stable/${ABI_VER}"
-	MY_P="rustc-${PV}"
-	SRC="${MY_P}-src.tar.gz"
-	KEYWORDS="*"
-fi
-
-
-STAGE0_VERSION="1.$(($(get_version_component_range 2) - 1)).0"
-STAGE0_VERSION_CARGO="0.$(($(get_version_component_range 2))).0"
-STAGE0_DATE="2020-03-12"
-RUST_STAGE0_amd64="rustc-${STAGE0_VERSION}-x86_64-unknown-linux-gnu"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="http://www.rust-lang.org/"
-
-SRC_URI="https://static.rust-lang.org/dist/${SRC} -> rustc-${PV}-src.tar.gz
-	https://static.rust-lang.org/dist/${STAGE0_DATE}/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu.tar.gz
-	https://static.rust-lang.org/dist/${RUST_STAGE0_amd64}.tar.gz
-	https://static.rust-lang.org/dist/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu.tar.gz
-"
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-RESTRICT="binchecks strip"
-REQUIRED_USE="amd64"
-
-DEPEND="${PYTHON_DEPS}
-	>=dev-libs/libxml2-2.9.6
-	>=dev-lang/perl-5.0
-"
-
-RDEPEND="!dev-util/cargo"
-
-PATCHES=(
-	"${FILESDIR}/${P}-add-cros-targets.patch"
-	"${FILESDIR}/${P}-fix-rpath.patch"
-	"${FILESDIR}/${P}-enable-sanitizers.patch"
-	"${FILESDIR}/${P}-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch"
-	"${FILESDIR}/${P}-no-test-on-build.patch"
-	"${FILESDIR}/${P}-sanitizer-supported.patch"
-	"${FILESDIR}/${P}-cpuid-preserve-rbx.patch"
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-# This is the list of target triples as they appear in the cros_sdk. If this list gets changed,
-# ensure that each of these values has a corresponding librustc_target/spec file created below
-# and a line referring to it in 0001-add-cros-targets.patch.
-RUSTC_TARGET_TRIPLES=(
-	x86_64-pc-linux-gnu
-	x86_64-cros-linux-gnu
-	armv7a-cros-linux-gnueabihf
-	aarch64-cros-linux-gnu
-)
-
-# In this context BARE means the OS part of the triple is none and gcc is used for C/C++ and
-# linking.
-RUSTC_BARE_TARGET_TRIPLES=(
-	thumbv6m-none-eabi # Cortex-M0, M0+, M1
-	thumbv7m-none-eabi # Cortex-M3
-	thumbv7em-none-eabihf # Cortex-M4F, M7F, FPU, hardfloat
-)
-
-pkg_setup() {
-	python-any-r1_pkg_setup
-	# Skips the toolchain check if we are installing a binpkg.
-	if [[ "${MERGE_TYPE}" != "binary" ]]; then
-		local tt
-		for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
-			which "${tt}-clang" >/dev/null || die "missing toolchain ${tt}"
-		done
-		which "arm-none-eabi-gcc" >/dev/null || die "missing toolchain arm-none-eabi"
-	fi
-}
-
-src_prepare() {
-	local stagename="RUST_STAGE0_${ARCH}"
-	local stage0="${!stagename}"
-
-	cp -r "${WORKDIR}"/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu \
-		"${WORKDIR}"/${stage0}/rustc/lib/rustlib || die
-
-	# Copy "unknown" vendor targets to create cros_sdk target triple
-	# variants as referred to in 0001-add-cros-targets.patch and RUSTC_TARGET_TRIPLES.
-	# armv7a is treated specially because the cros toolchain differs in
-	# more than just the vendor part of the target triple. The arch is
-	# armv7a in cros versus armv7.
-	pushd src/librustc_target/spec || die
-	sed -e 's:"unknown":"pc":g' x86_64_unknown_linux_gnu.rs >x86_64_pc_linux_gnu.rs || die
-	sed -e 's:"unknown":"cros":g' x86_64_unknown_linux_gnu.rs >x86_64_cros_linux_gnu.rs || die
-	sed -e 's:"unknown":"cros":g' armv7_unknown_linux_gnueabihf.rs >armv7a_cros_linux_gnueabihf.rs || die
-	sed -e 's:"unknown":"cros":g' aarch64_unknown_linux_gnu.rs >aarch64_cros_linux_gnu.rs || die
-	popd
-
-	# The miri tool is built because of 'extended = true' in cros-config.toml,
-	# but the build is busted. See the upstream issue: [https://github.com/rust-
-	# lang/rust/issues/56576]. Because miri isn't installed or needed, this sed
-	# script eradicates the command that builds it during the bootstrap script.
-	pushd src/bootstrap || die
-	sed -i 's@tool::Miri,@@g' builder.rs
-	popd
-
-	# Tsk. Tsk. The rust makefile for LLVM's compiler-rt uses -ffreestanding
-	# but one of the files includes <stdlib.h> causing occasional problems
-	# with MB_LEN_MAX. See crbug.com/730845 for the thrilling details. This
-	# line patches over the problematic include.
-	sed -e 's:#include <stdlib.h>:void abort(void);:g' \
-		-i "${ECONF_SOURCE:-.}"/src/llvm-project/compiler-rt/lib/builtins/int_util.c || die
-
-	epatch "${PATCHES[@]}"
-
-	# For the librustc_llvm module, the build will link with -nodefaultlibs and manually choose the
-	# std C++ library. For x86_64 Linux, the build script always chooses libstdc++ which will not
-	# work if LLVM was built with USE="default-libcxx". This snippet changes that choice to libc++
-	# in the case that clang++ defaults to libc++.
-	if "${CXX}" -### -x c++ - < /dev/null 2>&1 | grep -q -e '-lc++'; then
-		sed -i 's:"stdc++":"c++":g' src/librustc_llvm/build.rs || die
-	fi
-
-	default
-}
-
-src_configure() {
-	local stagename="RUST_STAGE0_${ARCH}"
-	local stage0="${!stagename}"
-
-	local targets=""
-	local tt
-	for tt in "${RUSTC_TARGET_TRIPLES[@]}" "${RUSTC_BARE_TARGET_TRIPLES[@]}" ; do
-		targets+="\"${tt}\", "
-	done
-
-	local config=cros-config.toml
-	cat > "${config}" <<EOF
-[build]
-target = [${targets}]
-cargo = "${WORKDIR}/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu/cargo/bin/cargo"
-rustc = "${WORKDIR}/${stage0}/rustc/bin/rustc"
-docs = false
-submodules = false
-python = "${EPYTHON}"
-vendor = true
-extended = true
-tools = ["cargo", "rustfmt", "clippy", "cargofmt"]
-sanitizers = true
-
-[llvm]
-ninja = true
-
-[install]
-prefix = "${ED}usr"
-libdir = "$(get_libdir)"
-mandir = "share/man"
-
-[rust]
-default-linker = "${CBUILD}-clang"
-channel = "${SLOT%%/*}"
-codegen-units = 0
-llvm-libunwind = true
-codegen-tests = false
-
-EOF
-	for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
-		cat >> cros-config.toml <<EOF
-[target."${tt}"]
-cc = "${tt}-clang"
-cxx = "${tt}-clang++"
-linker = "${tt}-clang++"
-
-EOF
-	done
-}
-
-src_compile() {
-	${EPYTHON} x.py build --config cros-config.toml || die
-}
-
-src_install() {
-	local obj="build/x86_64-unknown-linux-gnu/stage2"
-	local tools="${obj}-tools/x86_64-unknown-linux-gnu/release/"
-	dobin "${obj}/bin/rustc" "${obj}/bin/rustdoc"
-	dobin "${tools}/cargo"
-	dobin "${tools}/rustfmt" "${tools}/cargo-fmt"
-	dobin "${tools}/clippy-driver" "${tools}/cargo-clippy"
-	dobin src/etc/rust-gdb src/etc/rust-lldb
-	insinto "/usr/$(get_libdir)"
-	doins -r "${obj}/lib/"*
-	doins -r "${obj}/lib64/"*
-}
diff --git a/dev-lang/rust/rust-1.44.0.ebuild b/dev-lang/rust/rust-1.44.0.ebuild
deleted file mode 100644
index bd809ed..0000000
--- a/dev-lang/rust/rust-1.44.0.ebuild
+++ /dev/null
@@ -1,206 +0,0 @@
-# Copyright 1999-2018 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-PYTHON_COMPAT=( python2_7 )
-inherit python-any-r1 versionator toolchain-funcs
-
-if [[ ${PV} = *beta* ]]; then
-	betaver=${PV//*beta}
-	BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
-	MY_P="rustc-beta"
-	SLOT="beta/${PV}"
-	SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.gz"
-	KEYWORDS=""
-else
-	ABI_VER="$(get_version_component_range 1-2)"
-	SLOT="stable/${ABI_VER}"
-	MY_P="rustc-${PV}"
-	SRC="${MY_P}-src.tar.gz"
-	KEYWORDS="*"
-fi
-
-
-STAGE0_VERSION="1.$(($(get_version_component_range 2) - 1)).1"
-STAGE0_VERSION_CARGO="0.$(($(get_version_component_range 2))).0"
-STAGE0_DATE="2020-05-07"
-RUST_STAGE0_amd64="rustc-${STAGE0_VERSION}-x86_64-unknown-linux-gnu"
-
-DESCRIPTION="Systems programming language from Mozilla"
-HOMEPAGE="http://www.rust-lang.org/"
-
-SRC_URI="https://static.rust-lang.org/dist/${SRC} -> rustc-${PV}-src.tar.gz
-	https://static.rust-lang.org/dist/${STAGE0_DATE}/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu.tar.gz
-	https://static.rust-lang.org/dist/${RUST_STAGE0_amd64}.tar.gz
-	https://static.rust-lang.org/dist/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu.tar.gz
-"
-
-LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA"
-
-RESTRICT="binchecks strip"
-REQUIRED_USE="amd64"
-
-DEPEND="${PYTHON_DEPS}
-	>=dev-libs/libxml2-2.9.6
-	>=dev-lang/perl-5.0
-"
-
-RDEPEND="!dev-util/cargo"
-
-PATCHES=(
-	"${FILESDIR}/${P}-add-cros-targets.patch"
-	"${FILESDIR}/${P}-fix-rpath.patch"
-	"${FILESDIR}/${P}-enable-sanitizers.patch"
-	"${FILESDIR}/${P}-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch"
-	"${FILESDIR}/${P}-no-test-on-build.patch"
-	"${FILESDIR}/${P}-sanitizer-supported.patch"
-	"${FILESDIR}/${P}-cpuid-preserve-rbx.patch"
-)
-
-S="${WORKDIR}/${MY_P}-src"
-
-# This is the list of target triples as they appear in the cros_sdk. If this list gets changed,
-# ensure that each of these values has a corresponding librustc_target/spec file created below
-# and a line referring to it in 0001-add-cros-targets.patch.
-RUSTC_TARGET_TRIPLES=(
-	x86_64-pc-linux-gnu
-	x86_64-cros-linux-gnu
-	armv7a-cros-linux-gnueabihf
-	aarch64-cros-linux-gnu
-)
-
-# In this context BARE means the OS part of the triple is none and gcc is used for C/C++ and
-# linking.
-RUSTC_BARE_TARGET_TRIPLES=(
-	thumbv6m-none-eabi # Cortex-M0, M0+, M1
-	thumbv7m-none-eabi # Cortex-M3
-	thumbv7em-none-eabihf # Cortex-M4F, M7F, FPU, hardfloat
-)
-
-pkg_setup() {
-	python-any-r1_pkg_setup
-	# Skips the toolchain check if we are installing a binpkg.
-	if [[ "${MERGE_TYPE}" != "binary" ]]; then
-		local tt
-		for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
-			which "${tt}-clang" >/dev/null || die "missing toolchain ${tt}"
-		done
-		which "arm-none-eabi-gcc" >/dev/null || die "missing toolchain arm-none-eabi"
-	fi
-}
-
-src_prepare() {
-	local stagename="RUST_STAGE0_${ARCH}"
-	local stage0="${!stagename}"
-
-	cp -r "${WORKDIR}"/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu \
-		"${WORKDIR}"/${stage0}/rustc/lib/rustlib || die
-
-	# Copy "unknown" vendor targets to create cros_sdk target triple
-	# variants as referred to in 0001-add-cros-targets.patch and RUSTC_TARGET_TRIPLES.
-	# armv7a is treated specially because the cros toolchain differs in
-	# more than just the vendor part of the target triple. The arch is
-	# armv7a in cros versus armv7.
-	pushd src/librustc_target/spec || die
-	sed -e 's:"unknown":"pc":g' x86_64_unknown_linux_gnu.rs >x86_64_pc_linux_gnu.rs || die
-	sed -e 's:"unknown":"cros":g' x86_64_unknown_linux_gnu.rs >x86_64_cros_linux_gnu.rs || die
-	sed -e 's:"unknown":"cros":g' armv7_unknown_linux_gnueabihf.rs >armv7a_cros_linux_gnueabihf.rs || die
-	sed -e 's:"unknown":"cros":g' aarch64_unknown_linux_gnu.rs >aarch64_cros_linux_gnu.rs || die
-	popd
-
-	# The miri tool is built because of 'extended = true' in cros-config.toml,
-	# but the build is busted. See the upstream issue: [https://github.com/rust-
-	# lang/rust/issues/56576]. Because miri isn't installed or needed, this sed
-	# script eradicates the command that builds it during the bootstrap script.
-	pushd src/bootstrap || die
-	sed -i 's@tool::Miri,@@g' builder.rs
-	popd
-
-	# Tsk. Tsk. The rust makefile for LLVM's compiler-rt uses -ffreestanding
-	# but one of the files includes <stdlib.h> causing occasional problems
-	# with MB_LEN_MAX. See crbug.com/730845 for the thrilling details. This
-	# line patches over the problematic include.
-	sed -e 's:#include <stdlib.h>:void abort(void);:g' \
-		-i "${ECONF_SOURCE:-.}"/src/llvm-project/compiler-rt/lib/builtins/int_util.c || die
-
-	epatch "${PATCHES[@]}"
-
-	# For the librustc_llvm module, the build will link with -nodefaultlibs and manually choose the
-	# std C++ library. For x86_64 Linux, the build script always chooses libstdc++ which will not
-	# work if LLVM was built with USE="default-libcxx". This snippet changes that choice to libc++
-	# in the case that clang++ defaults to libc++.
-	if "${CXX}" -### -x c++ - < /dev/null 2>&1 | grep -q -e '-lc++'; then
-		sed -i 's:"stdc++":"c++":g' src/librustc_llvm/build.rs || die
-	fi
-
-	default
-}
-
-src_configure() {
-	local stagename="RUST_STAGE0_${ARCH}"
-	local stage0="${!stagename}"
-
-	local targets=""
-	local tt
-	for tt in "${RUSTC_TARGET_TRIPLES[@]}" "${RUSTC_BARE_TARGET_TRIPLES[@]}" ; do
-		targets+="\"${tt}\", "
-	done
-
-	local config=cros-config.toml
-	cat > "${config}" <<EOF
-[build]
-target = [${targets}]
-cargo = "${WORKDIR}/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu/cargo/bin/cargo"
-rustc = "${WORKDIR}/${stage0}/rustc/bin/rustc"
-docs = false
-submodules = false
-python = "${EPYTHON}"
-vendor = true
-extended = true
-tools = ["cargo", "rustfmt", "clippy", "cargofmt"]
-sanitizers = true
-
-[llvm]
-ninja = true
-
-[install]
-prefix = "${ED}usr"
-libdir = "$(get_libdir)"
-mandir = "share/man"
-
-[rust]
-default-linker = "${CBUILD}-clang"
-channel = "${SLOT%%/*}"
-codegen-units = 0
-llvm-libunwind = true
-codegen-tests = false
-
-EOF
-	for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
-		cat >> cros-config.toml <<EOF
-[target."${tt}"]
-cc = "${tt}-clang"
-cxx = "${tt}-clang++"
-linker = "${tt}-clang++"
-
-EOF
-	done
-}
-
-src_compile() {
-	${EPYTHON} x.py build --config cros-config.toml || die
-}
-
-src_install() {
-	local obj="build/x86_64-unknown-linux-gnu/stage2"
-	local tools="${obj}-tools/x86_64-unknown-linux-gnu/release/"
-	dobin "${obj}/bin/rustc" "${obj}/bin/rustdoc"
-	dobin "${tools}/cargo"
-	dobin "${tools}/rustfmt" "${tools}/cargo-fmt"
-	dobin "${tools}/clippy-driver" "${tools}/cargo-clippy"
-	dobin src/etc/rust-gdb src/etc/rust-lldb
-	insinto "/usr/$(get_libdir)"
-	doins -r "${obj}/lib/"*
-	doins -r "${obj}/lib64/"*
-}
diff --git a/dev-lang/rust/rust-1.45.2-r1.ebuild b/dev-lang/rust/rust-1.45.2-r1.ebuild
new file mode 100644
index 0000000..705cd71
--- /dev/null
+++ b/dev-lang/rust/rust-1.45.2-r1.ebuild
@@ -0,0 +1,206 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 )
+inherit python-any-r1 versionator toolchain-funcs
+
+if [[ ${PV} = *beta* ]]; then
+	betaver=${PV//*beta}
+	BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
+	MY_P="rustc-beta"
+	SLOT="beta/${PV}"
+	SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.gz"
+	KEYWORDS=""
+else
+	ABI_VER="$(get_version_component_range 1-2)"
+	SLOT="stable/${ABI_VER}"
+	MY_P="rustc-${PV}"
+	SRC="${MY_P}-src.tar.gz"
+	KEYWORDS="*"
+fi
+
+
+STAGE0_VERSION="1.$(($(get_version_component_range 2) - 1)).0"
+STAGE0_VERSION_CARGO="0.$(($(get_version_component_range 2))).0"
+STAGE0_DATE="2020-06-04"
+RUST_STAGE0_amd64="rustc-${STAGE0_VERSION}-x86_64-unknown-linux-gnu"
+
+DESCRIPTION="Systems programming language from Mozilla"
+HOMEPAGE="http://www.rust-lang.org/"
+
+SRC_URI="https://static.rust-lang.org/dist/${SRC} -> rustc-${PV}-src.tar.gz
+	https://static.rust-lang.org/dist/${STAGE0_DATE}/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu.tar.gz
+	https://static.rust-lang.org/dist/${RUST_STAGE0_amd64}.tar.gz
+	https://static.rust-lang.org/dist/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu.tar.gz
+"
+
+LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA"
+
+RESTRICT="binchecks strip"
+REQUIRED_USE="amd64"
+
+DEPEND="${PYTHON_DEPS}
+	>=dev-libs/libxml2-2.9.6
+	>=dev-lang/perl-5.0
+"
+
+RDEPEND="!dev-util/cargo"
+
+PATCHES=(
+	"${FILESDIR}/${P}-add-cros-targets.patch"
+	"${FILESDIR}/${P}-fix-rpath.patch"
+	"${FILESDIR}/${P}-enable-sanitizers.patch"
+	"${FILESDIR}/${P}-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch"
+	"${FILESDIR}/${P}-no-test-on-build.patch"
+	"${FILESDIR}/${P}-sanitizer-supported.patch"
+	"${FILESDIR}/${P}-cc.patch"
+)
+
+S="${WORKDIR}/${MY_P}-src"
+
+# This is the list of target triples as they appear in the cros_sdk. If this list gets changed,
+# ensure that each of these values has a corresponding librustc_target/spec file created below
+# and a line referring to it in 0001-add-cros-targets.patch.
+RUSTC_TARGET_TRIPLES=(
+	x86_64-pc-linux-gnu
+	x86_64-cros-linux-gnu
+	armv7a-cros-linux-gnueabihf
+	aarch64-cros-linux-gnu
+)
+
+# In this context BARE means the OS part of the triple is none and gcc is used for C/C++ and
+# linking.
+RUSTC_BARE_TARGET_TRIPLES=(
+	thumbv6m-none-eabi # Cortex-M0, M0+, M1
+	thumbv7m-none-eabi # Cortex-M3
+	thumbv7em-none-eabihf # Cortex-M4F, M7F, FPU, hardfloat
+)
+
+pkg_setup() {
+	python-any-r1_pkg_setup
+	# Skips the toolchain check if we are installing a binpkg.
+	if [[ "${MERGE_TYPE}" != "binary" ]]; then
+		local tt
+		for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
+			which "${tt}-clang" >/dev/null || die "missing toolchain ${tt}"
+		done
+		which "arm-none-eabi-gcc" >/dev/null || die "missing toolchain arm-none-eabi"
+	fi
+}
+
+src_prepare() {
+	local stagename="RUST_STAGE0_${ARCH}"
+	local stage0="${!stagename}"
+
+	cp -r "${WORKDIR}"/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu \
+		"${WORKDIR}"/${stage0}/rustc/lib/rustlib || die
+
+	# Copy "unknown" vendor targets to create cros_sdk target triple
+	# variants as referred to in 0001-add-cros-targets.patch and RUSTC_TARGET_TRIPLES.
+	# armv7a is treated specially because the cros toolchain differs in
+	# more than just the vendor part of the target triple. The arch is
+	# armv7a in cros versus armv7.
+	pushd src/librustc_target/spec || die
+	sed -e 's:"unknown":"pc":g' x86_64_unknown_linux_gnu.rs >x86_64_pc_linux_gnu.rs || die
+	sed -e 's:"unknown":"cros":g' x86_64_unknown_linux_gnu.rs >x86_64_cros_linux_gnu.rs || die
+	sed -e 's:"unknown":"cros":g' armv7_unknown_linux_gnueabihf.rs >armv7a_cros_linux_gnueabihf.rs || die
+	sed -e 's:"unknown":"cros":g' aarch64_unknown_linux_gnu.rs >aarch64_cros_linux_gnu.rs || die
+	popd
+
+	# The miri tool is built because of 'extended = true' in cros-config.toml,
+	# but the build is busted. See the upstream issue: [https://github.com/rust-
+	# lang/rust/issues/56576]. Because miri isn't installed or needed, this sed
+	# script eradicates the command that builds it during the bootstrap script.
+	pushd src/bootstrap || die
+	sed -i 's@tool::Miri,@@g' builder.rs
+	popd
+
+	# Tsk. Tsk. The rust makefile for LLVM's compiler-rt uses -ffreestanding
+	# but one of the files includes <stdlib.h> causing occasional problems
+	# with MB_LEN_MAX. See crbug.com/730845 for the thrilling details. This
+	# line patches over the problematic include.
+	sed -e 's:#include <stdlib.h>:void abort(void);:g' \
+		-i "${ECONF_SOURCE:-.}"/src/llvm-project/compiler-rt/lib/builtins/int_util.c || die
+
+	epatch "${PATCHES[@]}"
+
+	# For the librustc_llvm module, the build will link with -nodefaultlibs and manually choose the
+	# std C++ library. For x86_64 Linux, the build script always chooses libstdc++ which will not
+	# work if LLVM was built with USE="default-libcxx". This snippet changes that choice to libc++
+	# in the case that clang++ defaults to libc++.
+	if "${CXX}" -### -x c++ - < /dev/null 2>&1 | grep -q -e '-lc++'; then
+		sed -i 's:"stdc++":"c++":g' src/librustc_llvm/build.rs || die
+	fi
+
+	default
+}
+
+src_configure() {
+	local stagename="RUST_STAGE0_${ARCH}"
+	local stage0="${!stagename}"
+
+	local targets=""
+	local tt
+	for tt in "${RUSTC_TARGET_TRIPLES[@]}" "${RUSTC_BARE_TARGET_TRIPLES[@]}" ; do
+		targets+="\"${tt}\", "
+	done
+
+	local config=cros-config.toml
+	cat > "${config}" <<EOF
+[build]
+target = [${targets}]
+cargo = "${WORKDIR}/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu/cargo/bin/cargo"
+rustc = "${WORKDIR}/${stage0}/rustc/bin/rustc"
+docs = false
+submodules = false
+python = "${EPYTHON}"
+vendor = true
+extended = true
+tools = ["cargo", "rustfmt", "clippy", "cargofmt"]
+sanitizers = true
+
+[llvm]
+ninja = true
+
+[install]
+prefix = "${ED}usr"
+libdir = "$(get_libdir)"
+mandir = "share/man"
+
+[rust]
+default-linker = "${CBUILD}-clang"
+channel = "${SLOT%%/*}"
+codegen-units = 0
+llvm-libunwind = true
+codegen-tests = false
+
+EOF
+	for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
+		cat >> cros-config.toml <<EOF
+[target."${tt}"]
+cc = "${tt}-clang"
+cxx = "${tt}-clang++"
+linker = "${tt}-clang++"
+
+EOF
+	done
+}
+
+src_compile() {
+	${EPYTHON} x.py build --config cros-config.toml || die
+}
+
+src_install() {
+	local obj="build/x86_64-unknown-linux-gnu/stage2"
+	local tools="${obj}-tools/x86_64-unknown-linux-gnu/release/"
+	dobin "${obj}/bin/rustc" "${obj}/bin/rustdoc"
+	dobin "${tools}/cargo"
+	dobin "${tools}/rustfmt" "${tools}/cargo-fmt"
+	dobin "${tools}/clippy-driver" "${tools}/cargo-clippy"
+	dobin src/etc/rust-gdb src/etc/rust-lldb
+	insinto "/usr/$(get_libdir)"
+	doins -r "${obj}/lib/"*
+	doins -r "${obj}/lib64/"*
+}
diff --git a/dev-lang/rust/rust-1.46.0.ebuild b/dev-lang/rust/rust-1.46.0.ebuild
new file mode 100644
index 0000000..d02e97e
--- /dev/null
+++ b/dev-lang/rust/rust-1.46.0.ebuild
@@ -0,0 +1,207 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 )
+inherit python-any-r1 versionator toolchain-funcs
+
+if [[ ${PV} = *beta* ]]; then
+	betaver=${PV//*beta}
+	BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}"
+	MY_P="rustc-beta"
+	SLOT="beta/${PV}"
+	SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.gz"
+	KEYWORDS=""
+else
+	ABI_VER="$(get_version_component_range 1-2)"
+	SLOT="stable/${ABI_VER}"
+	MY_P="rustc-${PV}"
+	SRC="${MY_P}-src.tar.gz"
+	KEYWORDS="*"
+fi
+
+
+STAGE0_VERSION="1.45.2"
+STAGE0_VERSION_CARGO="0.46.1"
+STAGE0_DATE="2020-08-03"
+RUST_STAGE0_amd64="rustc-${STAGE0_VERSION}-x86_64-unknown-linux-gnu"
+
+DESCRIPTION="Systems programming language from Mozilla"
+HOMEPAGE="http://www.rust-lang.org/"
+
+SRC_URI="https://static.rust-lang.org/dist/${SRC} -> rustc-${PV}-src.tar.gz
+	https://static.rust-lang.org/dist/${STAGE0_DATE}/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu.tar.gz
+	https://static.rust-lang.org/dist/${RUST_STAGE0_amd64}.tar.gz
+	https://static.rust-lang.org/dist/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu.tar.gz
+"
+
+LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA"
+
+RESTRICT="binchecks strip"
+REQUIRED_USE="amd64"
+
+DEPEND="${PYTHON_DEPS}
+	>=dev-libs/libxml2-2.9.6
+	>=dev-lang/perl-5.0
+"
+
+RDEPEND="!dev-util/cargo"
+
+PATCHES=(
+	"${FILESDIR}/${P}-add-cros-targets.patch"
+	"${FILESDIR}/${P}-fix-rpath.patch"
+	"${FILESDIR}/${P}-enable-sanitizers.patch"
+	"${FILESDIR}/${P}-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch"
+	"${FILESDIR}/${P}-no-test-on-build.patch"
+	"${FILESDIR}/${P}-sanitizer-supported.patch"
+	"${FILESDIR}/${P}-cc.patch"
+	"${FILESDIR}/${P}-revert-libunwind-build.patch"
+)
+
+S="${WORKDIR}/${MY_P}-src"
+
+# This is the list of target triples as they appear in the cros_sdk. If this list gets changed,
+# ensure that each of these values has a corresponding librustc_target/spec file created below
+# and a line referring to it in 0001-add-cros-targets.patch.
+RUSTC_TARGET_TRIPLES=(
+	x86_64-pc-linux-gnu
+	x86_64-cros-linux-gnu
+	armv7a-cros-linux-gnueabihf
+	aarch64-cros-linux-gnu
+)
+
+# In this context BARE means the OS part of the triple is none and gcc is used for C/C++ and
+# linking.
+RUSTC_BARE_TARGET_TRIPLES=(
+	thumbv6m-none-eabi # Cortex-M0, M0+, M1
+	thumbv7m-none-eabi # Cortex-M3
+	thumbv7em-none-eabihf # Cortex-M4F, M7F, FPU, hardfloat
+)
+
+pkg_setup() {
+	python-any-r1_pkg_setup
+	# Skips the toolchain check if we are installing a binpkg.
+	if [[ "${MERGE_TYPE}" != "binary" ]]; then
+		local tt
+		for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
+			which "${tt}-clang" >/dev/null || die "missing toolchain ${tt}"
+		done
+		which "arm-none-eabi-gcc" >/dev/null || die "missing toolchain arm-none-eabi"
+	fi
+}
+
+src_prepare() {
+	local stagename="RUST_STAGE0_${ARCH}"
+	local stage0="${!stagename}"
+
+	cp -r "${WORKDIR}"/rust-std-${STAGE0_VERSION}-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu \
+		"${WORKDIR}"/${stage0}/rustc/lib/rustlib || die
+
+	# Copy "unknown" vendor targets to create cros_sdk target triple
+	# variants as referred to in 0001-add-cros-targets.patch and RUSTC_TARGET_TRIPLES.
+	# armv7a is treated specially because the cros toolchain differs in
+	# more than just the vendor part of the target triple. The arch is
+	# armv7a in cros versus armv7.
+	pushd src/librustc_target/spec || die
+	sed -e 's:"unknown":"pc":g' x86_64_unknown_linux_gnu.rs >x86_64_pc_linux_gnu.rs || die
+	sed -e 's:"unknown":"cros":g' x86_64_unknown_linux_gnu.rs >x86_64_cros_linux_gnu.rs || die
+	sed -e 's:"unknown":"cros":g' armv7_unknown_linux_gnueabihf.rs >armv7a_cros_linux_gnueabihf.rs || die
+	sed -e 's:"unknown":"cros":g' aarch64_unknown_linux_gnu.rs >aarch64_cros_linux_gnu.rs || die
+	popd
+
+	# The miri tool is built because of 'extended = true' in cros-config.toml,
+	# but the build is busted. See the upstream issue: [https://github.com/rust-
+	# lang/rust/issues/56576]. Because miri isn't installed or needed, this sed
+	# script eradicates the command that builds it during the bootstrap script.
+	pushd src/bootstrap || die
+	sed -i 's@tool::Miri,@@g' builder.rs
+	popd
+
+	# Tsk. Tsk. The rust makefile for LLVM's compiler-rt uses -ffreestanding
+	# but one of the files includes <stdlib.h> causing occasional problems
+	# with MB_LEN_MAX. See crbug.com/730845 for the thrilling details. This
+	# line patches over the problematic include.
+	sed -e 's:#include <stdlib.h>:void abort(void);:g' \
+		-i "${ECONF_SOURCE:-.}"/src/llvm-project/compiler-rt/lib/builtins/int_util.c || die
+
+	epatch "${PATCHES[@]}"
+
+	# For the librustc_llvm module, the build will link with -nodefaultlibs and manually choose the
+	# std C++ library. For x86_64 Linux, the build script always chooses libstdc++ which will not
+	# work if LLVM was built with USE="default-libcxx". This snippet changes that choice to libc++
+	# in the case that clang++ defaults to libc++.
+	if "${CXX}" -### -x c++ - < /dev/null 2>&1 | grep -q -e '-lc++'; then
+		sed -i 's:"stdc++":"c++":g' src/librustc_llvm/build.rs || die
+	fi
+
+	default
+}
+
+src_configure() {
+	local stagename="RUST_STAGE0_${ARCH}"
+	local stage0="${!stagename}"
+
+	local targets=""
+	local tt
+	for tt in "${RUSTC_TARGET_TRIPLES[@]}" "${RUSTC_BARE_TARGET_TRIPLES[@]}" ; do
+		targets+="\"${tt}\", "
+	done
+
+	local config=cros-config.toml
+	cat > "${config}" <<EOF
+[build]
+target = [${targets}]
+cargo = "${WORKDIR}/cargo-${STAGE0_VERSION_CARGO}-x86_64-unknown-linux-gnu/cargo/bin/cargo"
+rustc = "${WORKDIR}/${stage0}/rustc/bin/rustc"
+docs = false
+submodules = false
+python = "${EPYTHON}"
+vendor = true
+extended = true
+tools = ["cargo", "rustfmt", "clippy", "cargofmt"]
+sanitizers = true
+
+[llvm]
+ninja = true
+
+[install]
+prefix = "${ED}usr"
+libdir = "$(get_libdir)"
+mandir = "share/man"
+
+[rust]
+default-linker = "${CBUILD}-clang"
+channel = "${SLOT%%/*}"
+codegen-units = 0
+llvm-libunwind = true
+codegen-tests = false
+
+EOF
+	for tt in "${RUSTC_TARGET_TRIPLES[@]}" ; do
+		cat >> cros-config.toml <<EOF
+[target."${tt}"]
+cc = "${tt}-clang"
+cxx = "${tt}-clang++"
+linker = "${tt}-clang++"
+
+EOF
+	done
+}
+
+src_compile() {
+	${EPYTHON} x.py build --config cros-config.toml || die
+}
+
+src_install() {
+	local obj="build/x86_64-unknown-linux-gnu/stage2"
+	local tools="${obj}-tools/x86_64-unknown-linux-gnu/release/"
+	dobin "${obj}/bin/rustc" "${obj}/bin/rustdoc"
+	dobin "${tools}/cargo"
+	dobin "${tools}/rustfmt" "${tools}/cargo-fmt"
+	dobin "${tools}/clippy-driver" "${tools}/cargo-clippy"
+	dobin src/etc/rust-gdb src/etc/rust-lldb
+	insinto "/usr/$(get_libdir)"
+	doins -r "${obj}/lib/"*
+	doins -r "${obj}/lib64/"*
+}
diff --git a/dev-libs/glib/Manifest b/dev-libs/glib/Manifest
index aa0ad83..f4bcefc 100644
--- a/dev-libs/glib/Manifest
+++ b/dev-libs/glib/Manifest
@@ -1,2 +1 @@
-DIST glib-2.58.3.tar.xz 4863648 BLAKE2B 4269bd6e80869f39d567917438f750561debb1b45d40ecea487d2e76e2468e07dc8d80a23678699f7b8f7778c2ed9d29e866ae5e33770f51ed00709dd5fe97eb SHA512 1e1cb5b607367dcbadb95563d463e81702cf396b28f1173f6d933707f4f3d5595a70225423e918807a05994a24f16fa3ac87d2ec67e4b670244ea99836634cce
-DIST pkg-config-0.28.tar.gz 1931203 BLAKE2B bafdd4e838623965c6bd454421ddd9051fc43fc29948e1615b49fef463c3c3a18807aabe6416f96cfdf58d6b1c9e114d77f97bd985facee7c14284a8a64a768b SHA512 6eafa5ca77c5d44cd15f48457a5e96fcea2555b66d8e35ada5ab59864a0aa03d441e15f54ab9c6343693867b3b490f392c75b7d9312f024c9b7ec6a0194d8320
+DIST glib-2.62.6.tar.xz 4703424 BLAKE2B 0a27245be2575c574dcc730dd051a8c284f421dbc46579aadc5fbbacb8f934af4374b61bb26085e5c9ab78a868c567818f3fb9d67adddce37f5c4fec00e0d276 SHA512 8e3972a371f3c1a50b7d245b30e4f740583ad72ba4ab325e0e15e0732be44dfb69b603fb39dcf4989255a23a181e9ea5dd25982dd94c386cd9f21952243ad6f5
diff --git a/dev-libs/glib/OWNERS b/dev-libs/glib/OWNERS
new file mode 100644
index 0000000..e891d9e
--- /dev/null
+++ b/dev-libs/glib/OWNERS
@@ -0,0 +1 @@
+llozano@chromium.org
diff --git a/dev-libs/glib/files/glib-2.58.2-external-gdbus-codegen.patch b/dev-libs/glib/files/glib-2.58.2-external-gdbus-codegen.patch
deleted file mode 100644
index 7615dbb..0000000
--- a/dev-libs/glib/files/glib-2.58.2-external-gdbus-codegen.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-From 69da419c33c24a05126d21fb3098139d30ba9093 Mon Sep 17 00:00:00 2001
-From: Mart Raudsepp <leio@gentoo.org>
-Date: Wed, 19 Dec 2018 14:01:43 +0200
-Subject: [PATCH] build: don't build gdbus-codegen and rely on external
- gdbus-codegen for tests
-
----
- configure.ac                                  |  1 -
- docs/reference/gio/Makefile.am                |  1 -
- gio/Makefile.am                               |  2 +-
- gio/tests/Makefile.am                         | 22 ++++++-------------
- .../gdbus-object-manager-example/Makefile.am  |  6 ++---
- 5 files changed, 10 insertions(+), 22 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 4b15b69b8..9187a12bb 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -3481,7 +3481,6 @@ gobject/glib-mkenums
- gobject/tests/Makefile
- gthread/Makefile
- gio/Makefile
--gio/gdbus-2.0/codegen/Makefile
- gio/gdbus-2.0/codegen/config.py
- gio/gnetworking.h
- gio/xdgmime/Makefile
-diff --git a/docs/reference/gio/Makefile.am b/docs/reference/gio/Makefile.am
-index 08093e8a0..9ce11f824 100644
---- a/docs/reference/gio/Makefile.am
-+++ b/docs/reference/gio/Makefile.am
-@@ -212,7 +212,6 @@ man_MANS +=				\
- 	gsettings.1			\
- 	gresource.1			\
- 	gdbus.1				\
--	gdbus-codegen.1			\
- 	gio.1				\
- 	$(NULL)
- 
-diff --git a/gio/Makefile.am b/gio/Makefile.am
-index 05b20cdef..ed5d7d4cb 100644
---- a/gio/Makefile.am
-+++ b/gio/Makefile.am
-@@ -1,6 +1,6 @@
- include $(top_srcdir)/glib.mk
- 
--SUBDIRS = gdbus-2.0/codegen
-+SUBDIRS = 
- 
- if OS_UNIX
- SUBDIRS += xdgmime
-diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am
-index c4e7a9257..4b538b1e9 100644
---- a/gio/tests/Makefile.am
-+++ b/gio/tests/Makefile.am
-@@ -253,9 +253,7 @@ gdbus-daemon-impl.c: $(top_srcdir)/gio/gdbusdaemon.c
- # These files are only generated on Windows builds inside GIO,
- # but we want them on non-Windows builds for the tests
- gdbus-daemon-generated.h gdbus-daemon-generated.c: $(top_srcdir)/gio/dbus-daemon.xml $(GDBUS_PYTHON_DEPS)
--	$(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \
--		UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \
--		$(PYTHON) $(top_srcdir)/gio/gdbus-2.0/codegen/gdbus-codegen.in \
-+	$(AM_V_GEN) gdbus-codegen \
- 		--interface-prefix org. \
- 		--generate-c-code gdbus-daemon-generated \
- 		--c-namespace _G \
-@@ -494,10 +492,8 @@ gnotification_SOURCES                    = $(gdbus_sessionbus_sources) gnotifica
- 
- BUILT_SOURCES += gdbus-test-codegen-generated.c gdbus-test-codegen-generated.h gdbus-test-codegen-generated-interface-info.c gdbus-test-codegen-generated-interface-info.h
- gdbus-test-codegen.o: gdbus-test-codegen-generated.h gdbus-test-codegen-generated-interface-info.h
--gdbus-test-codegen-generated.h: test-codegen.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen
--	$(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \
--		UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \
--		$(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \
-+gdbus-test-codegen-generated.h: test-codegen.xml Makefile
-+	$(AM_V_GEN) gdbus-codegen \
- 		--interface-prefix org.project. \
- 		--generate-c-code gdbus-test-codegen-generated \
- 		--c-generate-object-manager \
-@@ -516,10 +512,8 @@ gdbus-test-codegen-generated.h: test-codegen.xml Makefile $(top_builddir)/gio/gd
- 		$(NULL)
- gdbus-test-codegen-generated.c: gdbus-test-codegen-generated.h
- 	@: # Generated as side-effect of .h
--gdbus-test-codegen-generated-interface-info.h: test-codegen.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen
--	$(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \
--		UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \
--		$(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \
-+gdbus-test-codegen-generated-interface-info.h: test-codegen.xml Makefile
-+	$(AM_V_GEN) gdbus-codegen \
- 		--interface-info-header \
- 		--annotate "org.project.Bar" Key1 Value1 \
- 		--annotate "org.project.Bar" org.gtk.GDBus.Internal Value2 \
-@@ -532,10 +526,8 @@ gdbus-test-codegen-generated-interface-info.h: test-codegen.xml Makefile $(top_b
- 		--output $@ \
- 		$(srcdir)/test-codegen.xml \
- 		$(NULL)
--gdbus-test-codegen-generated-interface-info.c: test-codegen.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen
--	$(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \
--		UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \
--		$(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \
-+gdbus-test-codegen-generated-interface-info.c: test-codegen.xml Makefile
-+	$(AM_V_GEN) gdbus-codegen \
- 		--interface-info-body \
- 		--annotate "org.project.Bar" Key1 Value1 \
- 		--annotate "org.project.Bar" org.gtk.GDBus.Internal Value2 \
-diff --git a/gio/tests/gdbus-object-manager-example/Makefile.am b/gio/tests/gdbus-object-manager-example/Makefile.am
-index 1d0464c5c..0603d9b0a 100644
---- a/gio/tests/gdbus-object-manager-example/Makefile.am
-+++ b/gio/tests/gdbus-object-manager-example/Makefile.am
-@@ -11,10 +11,8 @@ GDBUS_GENERATED = \
- 	gdbus-example-objectmanager-generated-org.gtk.GDBus.Example.ObjectManager.Cat.xml	\
- 	$(NULL)
- 
--$(GDBUS_GENERATED) : gdbus-example-objectmanager.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen
--	$(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \
--		UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \
--		$(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \
-+$(GDBUS_GENERATED) : gdbus-example-objectmanager.xml Makefile
-+	$(AM_V_GEN) gdbus-codegen \
- 		--interface-prefix org.gtk.GDBus.Example.ObjectManager. \
- 		--c-namespace Example \
- 		--c-generate-object-manager \
--- 
-2.17.0
-
diff --git a/dev-libs/glib/files/glib-2.58.3-gdbus-tool-Fix-units-for-gdbus-tool-wait-timeout.patch b/dev-libs/glib/files/glib-2.58.3-gdbus-tool-Fix-units-for-gdbus-tool-wait-timeout.patch
deleted file mode 100644
index c6f787b..0000000
--- a/dev-libs/glib/files/glib-2.58.3-gdbus-tool-Fix-units-for-gdbus-tool-wait-timeout.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From d86146df3874aaffcad0765963e5e6516691f5ea Mon Sep 17 00:00:00 2001
-From: Philip Withnall <withnall@endlessm.com>
-Date: Wed, 27 Mar 2019 17:04:58 +0000
-Subject: [PATCH] gdbus-tool: Fix units for `gdbus-tool wait` timeout
-
-They were documented as being in seconds, but implemented as
-milliseconds.
-
-Signed-off-by: Philip Withnall <withnall@endlessm.com>
-
-Fixes: #1737
----
- gio/gdbus-tool.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/gio/gdbus-tool.c b/gio/gdbus-tool.c
-index c8e01ad99..3bef14c31 100644
---- a/gio/gdbus-tool.c
-+++ b/gio/gdbus-tool.c
-@@ -2051,7 +2051,7 @@ handle_monitor (gint        *argc,
- 
- static gboolean opt_wait_activate_set = FALSE;
- static gchar *opt_wait_activate_name = NULL;
--static gint64 opt_wait_timeout = 0;  /* no timeout */
-+static gint64 opt_wait_timeout_secs = 0;  /* no timeout */
- 
- typedef enum {
-   WAIT_STATE_RUNNING,  /* waiting to see the service */
-@@ -2078,7 +2078,7 @@ static const GOptionEntry wait_entries[] =
-     opt_wait_activate_cb,
-     N_("Service to activate before waiting for the other one (well-known name)"),
-     "[NAME]" },
--  { "timeout", 't', 0, G_OPTION_ARG_INT64, &opt_wait_timeout,
-+  { "timeout", 't', 0, G_OPTION_ARG_INT64, &opt_wait_timeout_secs,
-     N_("Timeout to wait for before exiting with an error (seconds); 0 for "
-        "no timeout (default)"), "SECS" },
-   { NULL }
-@@ -2255,8 +2255,8 @@ handle_wait (gint        *argc,
-                                              NULL, &wait_state, NULL);
- 
-   /* Safety timeout. */
--  if (opt_wait_timeout > 0)
--    timer_id = g_timeout_add (opt_wait_timeout, wait_timeout_cb, &wait_state);
-+  if (opt_wait_timeout_secs > 0)
-+    timer_id = g_timeout_add_seconds (opt_wait_timeout_secs, wait_timeout_cb, &wait_state);
- 
-   while (wait_state == WAIT_STATE_RUNNING)
-     g_main_context_iteration (NULL, TRUE);
--- 
-2.23.0.rc1.153.gdeed80330f-goog
-
diff --git a/dev-libs/glib/files/glib-2.58.3-gfile-Limit-access-to-files-when-copying.patch b/dev-libs/glib/files/glib-2.58.3-gfile-Limit-access-to-files-when-copying.patch
deleted file mode 100644
index 1e9e66b..0000000
--- a/dev-libs/glib/files/glib-2.58.3-gfile-Limit-access-to-files-when-copying.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Ondrej Holy <oholy@redhat.com>
-Date: Thu, 23 May 2019 10:41:53 +0200
-Subject: gfile: Limit access to files when copying
-
-file_copy_fallback creates new files with default permissions and
-set the correct permissions after the operation is finished. This
-might cause that the files can be accessible by more users during
-the operation than expected. Use G_FILE_CREATE_PRIVATE for the new
-files to limit access to those files.
-
-Bug: https://gitlab.gnome.org/GNOME/glib/merge_requests/876
-Bug-CVE: CVE-2019-12450
-Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=929753
-Origin: upstream, 2.61.1, commit:d8f8f4d637ce43f8699ba94c9b7648beda0ca174
----
- gio/gfile.c | 11 ++++++-----
- 1 file changed, 6 insertions(+), 5 deletions(-)
-
-diff --git a/gio/gfile.c b/gio/gfile.c
-index a5709a4..e017ee1 100644
---- a/gio/gfile.c
-+++ b/gio/gfile.c
-@@ -3284,12 +3284,12 @@ file_copy_fallback (GFile                  *source,
-         out = (GOutputStream*)_g_local_file_output_stream_replace (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
-                                                                    FALSE, NULL,
-                                                                    flags & G_FILE_COPY_BACKUP,
--                                                                   G_FILE_CREATE_REPLACE_DESTINATION,
--                                                                   info,
-+                                                                   G_FILE_CREATE_REPLACE_DESTINATION |
-+                                                                   G_FILE_CREATE_PRIVATE, info,
-                                                                    cancellable, error);
-       else
-         out = (GOutputStream*)_g_local_file_output_stream_create (_g_local_file_get_filename (G_LOCAL_FILE (destination)),
--                                                                  FALSE, 0, info,
-+                                                                  FALSE, G_FILE_CREATE_PRIVATE, info,
-                                                                   cancellable, error);
-     }
-   else if (flags & G_FILE_COPY_OVERWRITE)
-@@ -3297,12 +3297,13 @@ file_copy_fallback (GFile                  *source,
-       out = (GOutputStream *)g_file_replace (destination,
-                                              NULL,
-                                              flags & G_FILE_COPY_BACKUP,
--                                             G_FILE_CREATE_REPLACE_DESTINATION,
-+                                             G_FILE_CREATE_REPLACE_DESTINATION |
-+                                             G_FILE_CREATE_PRIVATE,
-                                              cancellable, error);
-     }
-   else
-     {
--      out = (GOutputStream *)g_file_create (destination, 0, cancellable, error);
-+      out = (GOutputStream *)g_file_create (destination, G_FILE_CREATE_PRIVATE, cancellable, error);
-     }
- 
-   if (!out)
diff --git a/dev-libs/glib/files/glib-2.58.3-keyfile-settings-Use-tighter-permissions.patch b/dev-libs/glib/files/glib-2.58.3-keyfile-settings-Use-tighter-permissions.patch
deleted file mode 100644
index 5f1c214..0000000
--- a/dev-libs/glib/files/glib-2.58.3-keyfile-settings-Use-tighter-permissions.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 5e4da714f00f6bfb2ccd6d73d61329c6f3a08429 Mon Sep 17 00:00:00 2001
-From: Matthias Clasen <mclasen@redhat.com>
-Date: Tue, 22 Jan 2019 13:26:31 -0500
-Subject: [PATCH] keyfile settings: Use tighter permissions
-
-When creating directories, create them with 700 permissions,
-instead of 777.
-
-Closes: #1658
----
- gio/gkeyfilesettingsbackend.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
-index 5ea632305..6ffb48217 100644
---- a/gio/gkeyfilesettingsbackend.c
-+++ b/gio/gkeyfilesettingsbackend.c
-@@ -113,7 +113,8 @@ g_keyfile_settings_backend_keyfile_write (GKeyfileSettingsBackend *kfsb)
- 
-   contents = g_key_file_to_data (kfsb->keyfile, &length, NULL);
-   g_file_replace_contents (kfsb->file, contents, length, NULL, FALSE,
--                           G_FILE_CREATE_REPLACE_DESTINATION,
-+                           G_FILE_CREATE_REPLACE_DESTINATION |
-+                           G_FILE_CREATE_PRIVATE,
-                            NULL, NULL, NULL);
- 
-   compute_checksum (kfsb->digest, contents, length);
-@@ -708,7 +709,7 @@ g_keyfile_settings_backend_constructed (GObject *object)
-   kfsb->permission = g_simple_permission_new (TRUE);
- 
-   kfsb->dir = g_file_get_parent (kfsb->file);
--  g_file_make_directory_with_parents (kfsb->dir, NULL, NULL);
-+  g_mkdir_with_parents (g_file_peek_path (kfsb->dir), 0700);
- 
-   kfsb->file_monitor = g_file_monitor (kfsb->file, G_FILE_MONITOR_NONE, NULL, NULL);
-   kfsb->dir_monitor = g_file_monitor (kfsb->dir, G_FILE_MONITOR_NONE, NULL, NULL);
--- 
-2.21.0
diff --git a/dev-libs/glib/files/glib-2.64.1-mark-gdbus-server-auth-test-flaky.patch b/dev-libs/glib/files/glib-2.64.1-mark-gdbus-server-auth-test-flaky.patch
new file mode 100644
index 0000000..d1a41ec
--- /dev/null
+++ b/dev-libs/glib/files/glib-2.64.1-mark-gdbus-server-auth-test-flaky.patch
@@ -0,0 +1,32 @@
+From 95b22035f6151ab465c37fe5e3e340713cb74e23 Mon Sep 17 00:00:00 2001
+From: Matt Turner <mattst88@gmail.com>
+Date: Tue, 24 Mar 2020 18:44:54 -0700
+Subject: [PATCH] Mark gdbus-server-auth test flaky
+
+See https://gitlab.gnome.org/GNOME/glib/-/issues/1954
+---
+ gio/tests/meson.build | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/gio/tests/meson.build b/gio/tests/meson.build
+index 788cf978b..7f45d0191 100644
+--- a/gio/tests/meson.build
++++ b/gio/tests/meson.build
+@@ -122,12 +122,13 @@ if dbus1_dep.found()
+     },
+     'gdbus-server-auth' : {
+       'dependencies' : [dbus1_dep],
++      'suite' : ['flaky'],
+     },
+   }
+ else
+   # We can build a cut-down version of this test without libdbus
+   gio_tests += {
+-    'gdbus-server-auth' : {},
++    'gdbus-server-auth' : {'suite' : ['flaky']},
+   }
+ endif
+ 
+-- 
+2.24.1
+
diff --git a/dev-libs/glib/glib-2.58.3-r5.ebuild b/dev-libs/glib/glib-2.58.3-r5.ebuild
deleted file mode 100644
index 74ac291..0000000
--- a/dev-libs/glib/glib-2.58.3-r5.ebuild
+++ /dev/null
@@ -1,326 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-PYTHON_COMPAT=( python{2_7,3_5,3_6,3_7} )
-GNOME2_EAUTORECONF=yes
-
-inherit autotools bash-completion-r1 epunt-cxx flag-o-matic gnome2 libtool linux-info \
-	multilib multilib-minimal pax-utils python-any-r1 toolchain-funcs virtualx
-
-# Until bug #537330 glib is a reverse dependency of pkgconfig and, then
-# adding new dependencies end up making stage3 to grow. Every addition needs
-# then to be think very closely.
-
-DESCRIPTION="The GLib library of C routines"
-HOMEPAGE="https://www.gtk.org/"
-SRC_URI="${SRC_URI}
-	https://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz" # pkg.m4 for eautoreconf
-
-LICENSE="LGPL-2.1+"
-SLOT="2"
-IUSE="dbus debug doc fam gtk-doc kernel_linux +mime selinux static-libs systemtap test utils xattr"
-
-KEYWORDS="*"
-
-# Added util-linux multilib dependency to have libmount support (which
-# is always turned on on linux systems, unless explicitly disabled, but
-# this ebuild does not do that anyway) (bug #599586)
-
-RDEPEND="
-	!<dev-util/gdbus-codegen-${PV}
-	>=dev-libs/libpcre-8.31:3[${MULTILIB_USEDEP},static-libs?]
-	>=virtual/libiconv-0-r1[${MULTILIB_USEDEP}]
-	>=virtual/libffi-3.0.13-r1:=[${MULTILIB_USEDEP}]
-	>=virtual/libintl-0-r2[${MULTILIB_USEDEP}]
-	>=sys-libs/zlib-1.2.8-r1[${MULTILIB_USEDEP}]
-	kernel_linux? ( >=sys-apps/util-linux-2.23[${MULTILIB_USEDEP}] )
-	selinux? ( >=sys-libs/libselinux-2.2.2-r5[${MULTILIB_USEDEP}] )
-	xattr? ( >=sys-apps/attr-2.4.47-r1[${MULTILIB_USEDEP}] )
-	fam? ( >=virtual/fam-0-r1[${MULTILIB_USEDEP}] )
-	utils? (
-		>=dev-util/gdbus-codegen-${PV}
-		virtual/libelf:0=
-	)
-"
-DEPEND="${RDEPEND}
-	app-text/docbook-xml-dtd:4.1.2
-	app-text/docbook-xsl-stylesheets
-	>=dev-libs/libxslt-1.0
-	>=sys-devel/gettext-0.11
-	gtk-doc? ( >=dev-util/gtk-doc-1.20 )
-	systemtap? ( >=dev-util/systemtap-1.3 )
-	${PYTHON_DEPS}
-	test? (
-		sys-devel/gdb
-		>=dev-util/gdbus-codegen-${PV}
-		>=sys-apps/dbus-1.2.14 )
-"
-# configure.ac has gtk-doc-am stuff behind m4_ifdef, so we don't need a gtk-doc-am build dep
-
-# Migration of glib-genmarshal, glib-mkenums and gtester-report to a separate
-# python depending package, which can be buildtime depended in packages that
-# need these tools, without pulling in python at runtime.
-DEPEND="${DEPEND}
-	>=dev-util/glib-utils-${PV}"
-PDEPEND="
-	dbus? ( gnome-base/dconf )
-	mime? ( x11-misc/shared-mime-info )
-"
-# shared-mime-info needed for gio/xdgmime, bug #409481
-# dconf is needed to be able to save settings, bug #498436
-
-MULTILIB_CHOST_TOOLS=(
-	/usr/bin/gio-querymodules$(get_exeext)
-)
-
-pkg_setup() {
-	if use kernel_linux ; then
-		CONFIG_CHECK="~INOTIFY_USER"
-		if use test ; then
-			CONFIG_CHECK="~IPV6"
-			WARNING_IPV6="Your kernel needs IPV6 support for running some tests, skipping them."
-		fi
-		linux-info_pkg_setup
-	fi
-	python-any-r1_pkg_setup
-}
-
-src_prepare() {
-	# Prevent build failure in stage3 where pkgconfig is not available, bug #481056
-	mv -f "${WORKDIR}"/pkg-config-*/pkg.m4 "${S}"/m4macros/ || die
-
-	if use test; then
-		# Disable tests requiring dev-util/desktop-file-utils when not installed, bug #286629, upstream bug #629163
-		if ! has_version dev-util/desktop-file-utils ; then
-			ewarn "Some tests will be skipped due dev-util/desktop-file-utils not being present on your system,"
-			ewarn "think on installing it to get these tests run."
-			sed -i -e "/appinfo\/associations/d" gio/tests/appinfo.c || die
-			sed -i -e "/g_test_add_func/d" gio/tests/desktop-app-info.c || die
-		fi
-
-		# gdesktopappinfo requires existing terminal (gnome-terminal or any
-		# other), falling back to xterm if one doesn't exist
-		#if ! has_version x11-terms/xterm && ! has_version x11-terms/gnome-terminal ; then
-		#	ewarn "Some tests will be skipped due to missing terminal program"
-		# These tests seem to sometimes fail even with a terminal; skip for now and reevulate with meson
-		# Also try https://gitlab.gnome.org/GNOME/glib/issues/1601 once ready for backport (or in a bump) and file new issue if still fails
-		sed -i -e "/appinfo\/launch/d" gio/tests/appinfo.c || die
-		# desktop-app-info/launch* might fail similarly
-		sed -i -e "/desktop-app-info\/launch-as-manager/d" gio/tests/desktop-app-info.c || die
-		#fi
-
-		# https://bugzilla.gnome.org/show_bug.cgi?id=722604
-		sed -i -e "/timer\/stop/d" glib/tests/timer.c || die
-		sed -i -e "/timer\/basic/d" glib/tests/timer.c || die
-
-		ewarn "Tests for search-utils have been skipped"
-		sed -i -e "/search-utils/d" glib/tests/Makefile.am || die
-	else
-		# Don't build tests, also prevents extra deps, bug #512022
-		sed -i -e 's/ tests//' {.,gio,glib}/Makefile.am || die
-	fi
-
-	# gdbus-codegen is a separate package
-	epatch "${FILESDIR}"/${PN}-2.58.2-external-gdbus-codegen.patch
-
-	# Fix for CVE-2019-12450, see also crbug.com/972030
-	epatch "${FILESDIR}"/${PN}-2.58.3-gfile-Limit-access-to-files-when-copying.patch
-	# Fix for CVE-2019-CVE-2019-13012, see also crbug.com/981618
-	epatch "${FILESDIR}"/${PN}-2.58.3-keyfile-settings-Use-tighter-permissions.patch
-
-	# Fix for https://gitlab.gnome.org/GNOME/glib/issues/1737, see also
-	# b/139313156
-	epatch "${FILESDIR}"/${PN}-2.58.3-gdbus-tool-Fix-units-for-gdbus-tool-wait-timeout.patch
-
-	# Tarball doesn't come with gtk-doc.make and we can't unconditionally depend on dev-util/gtk-doc due
-	# to circular deps during bootstramp. If actually not building gtk-doc, an almost empty file will do
-	# fine as well - this is also what upstream autogen.sh does if gtkdocize is not found. If gtk-doc is
-	# installed, eautoreconf will call gtkdocize, which overwrites the empty gtk-doc.make with a full copy.
-	cat > gtk-doc.make << EOF
-EXTRA_DIST =
-CLEANFILES =
-EOF
-
-	# Make sure we use /run directly instead of /var/run.  https://crbug.com/853158
-	sed -i \
-		-e '/unix:path=/s:/var/run:/run:' \
-		gio/gdbusaddress.c || die
-
-	gnome2_src_prepare
-	epunt_cxx
-}
-
-multilib_src_configure() {
-	# Avoid circular depend with dev-util/pkgconfig and
-	# native builds (cross-compiles won't need pkg-config
-	# in the target ROOT to work here)
-	if ! tc-is-cross-compiler && ! $(tc-getPKG_CONFIG) --version >& /dev/null; then
-		if has_version sys-apps/dbus; then
-			export DBUS1_CFLAGS="-I/usr/include/dbus-1.0 -I/usr/$(get_libdir)/dbus-1.0/include"
-			export DBUS1_LIBS="-ldbus-1"
-		fi
-		export LIBFFI_CFLAGS="-I$(echo /usr/$(get_libdir)/libffi-*/include)"
-		export LIBFFI_LIBS="-lffi"
-		export PCRE_CFLAGS=" " # test -n "$PCRE_CFLAGS" needs to pass
-		export PCRE_LIBS="-lpcre"
-	fi
-
-	# These configure tests don't work when cross-compiling.
-	if tc-is-cross-compiler ; then
-		# https://bugzilla.gnome.org/show_bug.cgi?id=756473
-		case ${CHOST} in
-		hppa*|metag*) export glib_cv_stack_grows=yes ;;
-		*)            export glib_cv_stack_grows=no ;;
-		esac
-		# https://bugzilla.gnome.org/show_bug.cgi?id=756474
-		export glib_cv_uscore=no
-		# https://bugzilla.gnome.org/show_bug.cgi?id=756475
-		export ac_cv_func_posix_get{pwuid,grgid}_r=yes
-	fi
-
-	local myconf
-
-	case "${CHOST}" in
-		*-mingw*) myconf="${myconf} --with-threads=win32" ;;
-		*)        myconf="${myconf} --with-threads=posix" ;;
-	esac
-
-	# libelf used only by the gresource bin
-	ECONF_SOURCE="${S}" gnome2_src_configure ${myconf} \
-		$(usex debug --enable-debug=yes ' ') \
-		$(use_enable xattr) \
-		$(use_enable fam) \
-		$(multilib_native_use_enable gtk-doc) \
-		$(use_enable kernel_linux libmount) \
-		$(use_enable selinux) \
-		$(use_enable static-libs static) \
-		$(use_enable systemtap dtrace) \
-		$(use_enable systemtap systemtap) \
-		$(multilib_native_use_enable utils libelf) \
-		--with-python=${EPYTHON} \
-		--disable-compile-warnings \
-		--enable-man \
-		--with-pcre=system \
-		--with-xml-catalog="${EPREFIX}/etc/xml/catalog"
-
-	if multilib_is_native_abi; then
-		local d
-		for d in glib gio gobject; do
-			ln -s "${S}"/docs/reference/${d}/html docs/reference/${d}/html || die
-		done
-	fi
-}
-
-multilib_src_test() {
-	export XDG_CONFIG_DIRS=/etc/xdg
-	export XDG_DATA_DIRS=/usr/local/share:/usr/share
-	export G_DBUS_COOKIE_SHA1_KEYRING_DIR="${T}/temp"
-	export LC_TIME=C # bug #411967
-	unset GSETTINGS_BACKEND # bug #596380
-	python_setup
-
-	# Related test is a bit nitpicking
-	mkdir "$G_DBUS_COOKIE_SHA1_KEYRING_DIR"
-	chmod 0700 "$G_DBUS_COOKIE_SHA1_KEYRING_DIR"
-
-	# Hardened: gdb needs this, bug #338891
-	if host-is-pax ; then
-		pax-mark -mr "${BUILD_DIR}"/tests/.libs/assert-msg-test \
-			|| die "Hardened adjustment failed"
-	fi
-
-	# Need X for dbus-launch session X11 initialization
-	virtx emake check
-}
-
-multilib_src_install() {
-	emake DESTDIR="${D}" completiondir="$(get_bashcompdir)" install
-	keepdir /usr/$(get_libdir)/gio/modules
-}
-
-multilib_src_install_all() {
-	if use doc ; then
-		einstalldocs
-	fi
-
-	# These are installed by dev-util/glib-utils
-	# TODO: With patching we might be able to get rid of the python-any deps and removals, and test depend on glib-utils instead; revisit with meson
-	rm "${ED}usr/bin/glib-genmarshal" || die
-	rm "${ED}usr/share/man/man1/glib-genmarshal.1" || die
-	rm "${ED}usr/bin/glib-mkenums" || die
-	rm "${ED}usr/share/man/man1/glib-mkenums.1" || die
-	rm "${ED}usr/bin/gtester-report" || die
-	rm "${ED}usr/share/man/man1/gtester-report.1" || die
-
-	# Do not install charset.alias even if generated, leave it to libiconv
-	rm -f "${ED}/usr/$(get_libdir)/charset.alias"
-
-	# Don't install gdb python macros, bug 291328
-	rm -rf "${ED}/usr/share/gdb/" "${ED}/usr/share/glib-2.0/gdb/"
-
-	# Completely useless with or without USE static-libs, people need to use pkg-config
-	find "${ED}" -name '*.la' -delete || die
-}
-
-pkg_preinst() {
-	gnome2_pkg_preinst
-
-	# Make gschemas.compiled belong to glib alone
-	local cache="usr/share/glib-2.0/schemas/gschemas.compiled"
-
-	if [[ -e ${EROOT}${cache} ]]; then
-		cp "${EROOT}"${cache} "${ED}"/${cache} || die
-	else
-		touch "${ED}"/${cache} || die
-	fi
-
-	multilib_pkg_preinst() {
-		# Make giomodule.cache belong to glib alone
-		local cache="usr/$(get_libdir)/gio/modules/giomodule.cache"
-
-		if [[ -e ${EROOT}${cache} ]]; then
-			cp "${EROOT}"${cache} "${ED}"/${cache} || die
-		else
-			touch "${ED}"/${cache} || die
-		fi
-	}
-
-	# Don't run the cache ownership when cross-compiling, as it would end up with an empty cache
-	# file due to inability to create it and GIO might not look at any of the modules there
-	if ! tc-is-cross-compiler ; then
-		multilib_foreach_abi multilib_pkg_preinst
-	fi
-}
-
-pkg_postinst() {
-	# force (re)generation of gschemas.compiled
-	GNOME2_ECLASS_GLIB_SCHEMAS="force"
-
-	gnome2_pkg_postinst
-
-#	multilib_pkg_postinst() {
-#		gnome2_giomodule_cache_update \
-#			|| die "Update GIO modules cache failed (for ${ABI})"
-#	}
-	if ! tc-is-cross-compiler ; then
-		multilib_foreach_abi multilib_pkg_postinst
-	else
-		ewarn "Updating of GIO modules cache skipped due to cross-compilation."
-		ewarn "You might want to run gio-querymodules manually on the target for"
-		ewarn "your final image for performance reasons and re-run it when packages"
-		ewarn "installing GIO modules get upgraded or added to the image."
-	fi
-}
-
-pkg_postrm() {
-	gnome2_pkg_postrm
-
-	if [[ -z ${REPLACED_BY_VERSION} ]]; then
-		multilib_pkg_postrm() {
-			rm -f "${EROOT}"usr/$(get_libdir)/gio/modules/giomodule.cache
-		}
-		multilib_foreach_abi multilib_pkg_postrm
-		rm -f "${EROOT}"usr/share/glib-2.0/schemas/gschemas.compiled
-	fi
-}
diff --git a/dev-libs/glib/glib-2.62.6-r1.ebuild b/dev-libs/glib/glib-2.62.6-r1.ebuild
new file mode 100644
index 0000000..2450f0d
--- /dev/null
+++ b/dev-libs/glib/glib-2.62.6-r1.ebuild
@@ -0,0 +1,280 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python{3_6,3_7} )
+
+inherit flag-o-matic gnome.org gnome2-utils linux-info meson multilib multilib-minimal python-any-r1 toolchain-funcs xdg
+
+DESCRIPTION="The GLib library of C routines"
+HOMEPAGE="https://www.gtk.org/"
+
+LICENSE="LGPL-2.1+"
+SLOT="2"
+IUSE="cros_host dbus debug doc elibc_glibc fam gtk-doc kernel_linux +mime selinux static-libs systemtap test utils xattr"
+RESTRICT="!test? ( test )"
+
+KEYWORDS="*"
+
+# * libelf isn't strictly necessary, but makes gresource tool more useful, and
+# the check is automagic in gio/meson.build. gresource is not a multilib tool
+# right now, thus it doesn't matter if non-native ABI libelf exists or not
+# (non-native binary is overwritten, it doesn't matter if libelf was linked to).
+# * Technically static-libs is needed on zlib, util-linux and perhaps more, but
+# these are used by GIO, which glib[static-libs] consumers don't really seem
+# to need at all, thus not imposing the deps for now and once some consumers
+# are actually found to static link libgio-2.0.a, we can revisit and either add
+# them or just put the (build) deps in that rare consumer instead of recursive
+# RDEPEND here (due to lack of recursive DEPEND).
+RDEPEND="
+	!<dev-util/gdbus-codegen-${PV}
+	>=virtual/libiconv-0-r1[${MULTILIB_USEDEP}]
+	>=dev-libs/libpcre-8.31:3[${MULTILIB_USEDEP},static-libs?]
+	>=virtual/libffi-3.0.13-r1:=[${MULTILIB_USEDEP}]
+	>=sys-libs/zlib-1.2.8-r1[${MULTILIB_USEDEP}]
+	>=virtual/libintl-0-r2[${MULTILIB_USEDEP}]
+	kernel_linux? ( >=sys-apps/util-linux-2.23[${MULTILIB_USEDEP}] )
+	selinux? ( >=sys-libs/libselinux-2.2.2-r5[${MULTILIB_USEDEP}] )
+	xattr? ( !elibc_glibc? ( >=sys-apps/attr-2.4.47-r1[${MULTILIB_USEDEP}] ) )
+	cros_host? ( virtual/libelf:0= )
+	fam? ( >=virtual/fam-0-r1[${MULTILIB_USEDEP}] )
+"
+DEPEND="${RDEPEND}"
+# libxml2 used for optional tests that get automatically skipped
+BDEPEND="
+	doc? (
+		app-text/docbook-xsl-stylesheets
+		dev-libs/libxslt
+	)
+	>=sys-devel/gettext-0.19.8
+	gtk-doc? ( >=dev-util/gtk-doc-1.20
+		app-text/docbook-xml-dtd:4.2
+		app-text/docbook-xml-dtd:4.5 )
+	systemtap? ( >=dev-util/systemtap-1.3 )
+	${PYTHON_DEPS}
+	test? ( >=sys-apps/dbus-1.2.14 )
+	virtual/pkgconfig
+"
+# TODO: >=dev-util/gdbus-codegen-${PV} test dep once we modify gio/tests/meson.build to use external gdbus-codegen
+
+PDEPEND="
+	dbus? ( gnome-base/dconf )
+	mime? ( x11-misc/shared-mime-info )
+"
+# shared-mime-info needed for gio/xdgmime, bug #409481
+# dconf is needed to be able to save settings, bug #498436
+
+MULTILIB_CHOST_TOOLS=(
+	/usr/bin/gio-querymodules$(get_exeext)
+)
+
+pkg_setup() {
+	if use kernel_linux ; then
+		CONFIG_CHECK="~INOTIFY_USER"
+		if use test ; then
+			CONFIG_CHECK="~IPV6"
+			WARNING_IPV6="Your kernel needs IPV6 support for running some tests, skipping them."
+		fi
+		linux-info_pkg_setup
+	fi
+	python-any-r1_pkg_setup
+}
+
+src_prepare() {
+	if use test; then
+		# TODO: Review the test exclusions, especially now with meson
+		# Disable tests requiring dev-util/desktop-file-utils when not installed, bug #286629, upstream bug #629163
+		if ! has_version dev-util/desktop-file-utils ; then
+			ewarn "Some tests will be skipped due dev-util/desktop-file-utils not being present on your system,"
+			ewarn "think on installing it to get these tests run."
+			sed -i -e "/appinfo\/associations/d" gio/tests/appinfo.c || die
+			sed -i -e "/g_test_add_func/d" gio/tests/desktop-app-info.c || die
+		fi
+
+		# gdesktopappinfo requires existing terminal (gnome-terminal or any
+		# other), falling back to xterm if one doesn't exist
+		#if ! has_version x11-terms/xterm && ! has_version x11-terms/gnome-terminal ; then
+		#	ewarn "Some tests will be skipped due to missing terminal program"
+		# These tests seem to sometimes fail even with a terminal; skip for now and reevulate with meson
+		# Also try https://gitlab.gnome.org/GNOME/glib/issues/1601 once ready for backport (or in a bump) and file new issue if still fails
+		sed -i -e "/appinfo\/launch/d" gio/tests/appinfo.c || die
+		# desktop-app-info/launch* might fail similarly
+		sed -i -e "/desktop-app-info\/launch-as-manager/d" gio/tests/desktop-app-info.c || die
+		#fi
+
+		# https://bugzilla.gnome.org/show_bug.cgi?id=722604
+		sed -i -e "/timer\/stop/d" glib/tests/timer.c || die
+		sed -i -e "/timer\/basic/d" glib/tests/timer.c || die
+
+		ewarn "Tests for search-utils have been skipped"
+		sed -i -e "/search-utils/d" glib/tests/meson.build || die
+
+		# Play nice with network-sandbox, but this approach would defeat the purpose of the test
+		#sed -i -e "s/localhost/127.0.0.1/g" gio/tests/gsocketclient-slow.c || die
+	else
+		# Don't build tests, also prevents extra deps, bug #512022
+		sed -i -e '/subdir.*tests/d' {.,gio,glib}/meson.build || die
+	fi
+
+	# Don't build fuzzing binaries - not used
+	sed -i -e '/subdir.*fuzzing/d' meson.build || die
+
+	# gdbus-codegen is a separate package
+	sed -i -e '/install_dir/d' gio/gdbus-2.0/codegen/meson.build || die
+
+	# Same kind of meson-0.50 issue with some installed-tests files; will likely be fixed upstream soon
+	sed -i -e '/install_dir/d' gio/tests/meson.build || die
+
+	cat > "${T}/glib-test-ld-wrapper" <<-EOF
+		#!/usr/bin/env sh
+		exec \${LD:-ld} "\$@"
+	EOF
+	chmod a+x "${T}/glib-test-ld-wrapper" || die
+	sed -i -e "s|'ld'|'${T}/glib-test-ld-wrapper'|g" gio/tests/meson.build || die
+
+	xdg_src_prepare
+	gnome2_environment_reset
+	# TODO: python_name sedding for correct python shebang? Might be relevant mainly for glib-utils only
+}
+
+multilib_src_configure() {
+	if use debug; then
+		append-cflags -DG_ENABLE_DEBUG
+	else
+		append-cflags -DG_DISABLE_CAST_CHECKS # https://gitlab.gnome.org/GNOME/glib/issues/1833
+	fi
+
+	# TODO: figure a way to pass appropriate values for all cross properties that glib uses (search for get_cross_property)
+	#if tc-is-cross-compiler ; then
+		# https://bugzilla.gnome.org/show_bug.cgi?id=756473
+		# TODO-meson: This should be in meson cross file as 'growing_stack' property; and more, look at get_cross_property
+		#case ${CHOST} in
+		#hppa*|metag*) export glib_cv_stack_grows=yes ;;
+		#*)            export glib_cv_stack_grows=no ;;
+		#esac
+	#fi
+
+	local emesonargs=(
+		-Ddefault_library=$(usex static-libs both shared)
+		$(meson_feature selinux)
+		$(meson_use xattr)
+		-Dlibmount=true # only used if host_system == 'linux'
+		-Dinternal_pcre=false
+		-Dman=$(multilib_native_usex doc true false)
+		$(meson_use systemtap dtrace)
+		$(meson_use systemtap)
+		-Dgtk_doc=$(multilib_native_usex gtk-doc true false)
+		$(meson_use fam)
+		-Dinstalled_tests=false
+		-Dnls=enabled
+		-Doss_fuzz=disabled
+	)
+	meson_src_configure
+}
+
+multilib_src_compile() {
+	meson_src_compile
+}
+
+multilib_src_test() {
+	export XDG_CONFIG_DIRS=/etc/xdg
+	export XDG_DATA_DIRS=/usr/local/share:/usr/share
+	export G_DBUS_COOKIE_SHA1_KEYRING_DIR="${T}/temp"
+	export LC_TIME=C # bug #411967
+	unset GSETTINGS_BACKEND # bug #596380
+	python_setup
+
+	# Related test is a bit nitpicking
+	mkdir "$G_DBUS_COOKIE_SHA1_KEYRING_DIR"
+	chmod 0700 "$G_DBUS_COOKIE_SHA1_KEYRING_DIR"
+
+	meson_src_test --timeout-multiplier 2 --no-suite flaky
+}
+
+multilib_src_install() {
+	meson_src_install
+	keepdir /usr/$(get_libdir)/gio/modules
+}
+
+multilib_src_install_all() {
+	if use doc ; then
+		einstalldocs
+	fi
+
+	# These are installed by dev-util/glib-utils
+	# TODO: With patching we might be able to get rid of the python-any deps and removals, and test depend on glib-utils instead; revisit now with meson
+	rm "${ED}/usr/bin/glib-genmarshal" || die
+	rm "${ED}/usr/bin/glib-mkenums" || die
+	rm "${ED}/usr/bin/gtester-report" || die
+	use doc && (
+		rm "${ED}/usr/share/man/man1/glib-genmarshal.1" || die
+		rm "${ED}/usr/share/man/man1/glib-mkenums.1" || die
+		rm "${ED}/usr/share/man/man1/gtester-report.1" || die
+		# gdbus-codegen manpage installed by dev-util/gdbus-codegen
+		rm "${ED}/usr/share/man/man1/gdbus-codegen.1" || die
+	)
+}
+
+pkg_preinst() {
+	xdg_pkg_preinst
+
+	# Make gschemas.compiled belong to glib alone
+	local cache="/usr/share/glib-2.0/schemas/gschemas.compiled"
+
+	if [[ -e ${EROOT}${cache} ]]; then
+		cp "${EROOT}"${cache} "${ED}"/${cache} || die
+	else
+		touch "${ED}"${cache} || die
+	fi
+
+	multilib_pkg_preinst() {
+		# Make giomodule.cache belong to glib alone
+		local cache="/usr/$(get_libdir)/gio/modules/giomodule.cache"
+
+		if [[ -e ${EROOT}${cache} ]]; then
+			cp "${EROOT}"${cache} "${ED}"${cache} || die
+		else
+			touch "${ED}"${cache} || die
+		fi
+	}
+
+	# Don't run the cache ownership when cross-compiling, as it would end up with an empty cache
+	# file due to inability to create it and GIO might not look at any of the modules there
+	if ! tc-is-cross-compiler ; then
+		multilib_foreach_abi multilib_pkg_preinst
+	fi
+}
+
+pkg_postinst() {
+	xdg_pkg_postinst
+	# glib installs no schemas itself, but we force update for fresh install in case
+	# something has dropped in a schemas file without direct glib dep; and for upgrades
+	# in case the compiled schema format could have changed
+	gnome2_schemas_update
+
+	multilib_pkg_postinst() {
+		gnome2_giomodule_cache_update \
+			|| die "Update GIO modules cache failed (for ${ABI})"
+	}
+	if ! tc-is-cross-compiler ; then
+		multilib_foreach_abi multilib_pkg_postinst
+	else
+		ewarn "Updating of GIO modules cache skipped due to cross-compilation."
+		ewarn "You might want to run gio-querymodules manually on the target for"
+		ewarn "your final image for performance reasons and re-run it when packages"
+		ewarn "installing GIO modules get upgraded or added to the image."
+	fi
+}
+
+pkg_postrm() {
+	xdg_pkg_postrm
+	gnome2_schemas_update
+
+	if [[ -z ${REPLACED_BY_VERSION} ]]; then
+		multilib_pkg_postrm() {
+			rm -f "${EROOT}"/usr/$(get_libdir)/gio/modules/giomodule.cache
+		}
+		multilib_foreach_abi multilib_pkg_postrm
+		rm -f "${EROOT}"/usr/share/glib-2.0/schemas/gschemas.compiled
+	fi
+}
diff --git a/dev-libs/libgit2/Manifest b/dev-libs/libgit2/Manifest
new file mode 100644
index 0000000..3ce1f5b
--- /dev/null
+++ b/dev-libs/libgit2/Manifest
@@ -0,0 +1 @@
+DIST libgit2-1.0.2_pre20200908.tar.gz 5321635 BLAKE2B 9b5e03c495f8e9444286995942c40eb5d6b09b0b58413cf95bc8c5dd14c4db1a26368224ec25a33a011181ff210dfec4bdd190483f1e99f501937f3cd4db6b02 SHA512 5c2e5e79d4a101ebe1f7bcb0ac3f94e9dc816fc828432ddbe8ddff2c979322881d32410078f93ce1e99e5b38c83cda146d9200e64396afe1305d8a63e1f8984d
diff --git a/dev-libs/libgit2/libgit2-1.0.2_pre20200908-r1.ebuild b/dev-libs/libgit2/libgit2-1.0.2_pre20200908-r1.ebuild
new file mode 100644
index 0000000..358e2e7
--- /dev/null
+++ b/dev-libs/libgit2/libgit2-1.0.2_pre20200908-r1.ebuild
@@ -0,0 +1,74 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8} )
+inherit cmake python-any-r1
+
+DESCRIPTION="A linkable library for Git"
+HOMEPAGE="https://libgit2.org"
+GIT_REV="1e987525b3bd86fc29e7ff67d973861efd22faf7"
+SRC_URI="https://github.com/${PN}/${PN}/archive/${GIT_REV}.tar.gz -> ${P}.tar.gz"
+S=${WORKDIR}/${P/_/-}
+
+LICENSE="GPL-2-with-linking-exception"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+IUSE="examples gssapi libressl +ssh test +threads trace"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	!libressl? ( dev-libs/openssl:0= )
+	libressl? ( dev-libs/libressl:0= )
+	sys-libs/zlib
+	net-libs/http-parser:=
+	gssapi? ( virtual/krb5 )
+	ssh? ( net-libs/libssh2 )
+"
+DEPEND="${RDEPEND}
+	${PYTHON_DEPS}
+	virtual/pkgconfig
+"
+
+S="${WORKDIR}/${PN}-${GIT_REV}/"
+
+src_prepare() {
+	cmake_src_prepare
+	# relying on forked http-parser to support some obscure URI form
+	sed -i -e '/empty_port/s:test:_&:' tests/network/urlparse.c || die
+}
+
+src_configure() {
+	local mycmakeargs=(
+		-DBUILD_CLAR=$(usex test)
+		-DENABLE_TRACE=$(usex trace ON OFF)
+		-DUSE_GSSAPI=$(usex gssapi ON OFF)
+		-DUSE_SSH=$(usex ssh)
+		-DTHREADSAFE=$(usex threads)
+		-DUSE_HTTP_PARSER=system
+	)
+	cmake_src_configure
+}
+
+src_test() {
+	if [[ ${EUID} -eq 0 ]] ; then
+		# repo::iterator::fs_preserves_error fails if run as root
+		# since root can still access dirs with 0000 perms
+		ewarn "Skipping tests: non-root privileges are required for all tests to pass"
+	else
+		local TEST_VERBOSE=1
+		cmake_src_test -R offline
+	fi
+}
+
+src_install() {
+	cmake_src_install
+	dodoc docs/*.{md,txt}
+
+	if use examples ; then
+		find examples -name '.gitignore' -delete || die
+		dodoc -r examples
+		docompress -x /usr/share/doc/${PF}/examples
+	fi
+}
diff --git a/dev-libs/libgit2/metadata.xml b/dev-libs/libgit2/metadata.xml
new file mode 100644
index 0000000..341b4d4
--- /dev/null
+++ b/dev-libs/libgit2/metadata.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>mgorny@gentoo.org</email>
+		<name>MichaÅ‚ Górny</name>
+	</maintainer>
+	<maintainer type="project">
+		<email>gnome@gentoo.org</email>
+		<name>Gentoo GNOME Desktop</name>
+	</maintainer>
+	<longdescription lang="en">
+		libgit2 is a portable, pure C implementation of the Git core methods provided
+		as a re-entrant linkable library with a solid API, allowing you to write native
+		speed custom Git applications in any language which supports C bindings.
+	</longdescription>
+	<use>
+		<flag name="gssapi">Enable GSSAPI support for SPNEGO auth</flag>
+		<flag name="ssh">Enable SSH transport support</flag>
+		<flag name="trace">Enable tracing support</flag>
+	</use>
+	<upstream>
+		<remote-id type="github">libgit2/libgit2</remote-id>
+	</upstream>
+</pkgmetadata>
diff --git a/dev-libs/libhandwriting/Manifest b/dev-libs/libhandwriting/Manifest
index 427b730..56c5e75 100644
--- a/dev-libs/libhandwriting/Manifest
+++ b/dev-libs/libhandwriting/Manifest
@@ -1 +1 @@
-DIST libhandwriting-0.0.9.tar.gz 22323713 BLAKE2B 83ac1f9e2b18d719b521585ffd5dee73be3626ecf2939efcea887fe8f1f7e66a2dd0093aeb07440f56d43aa685a87e3a885061ad50a45e3e0421fbf67f099568 SHA512 a63e45d57a0272d2d4a7aeea6ed3e29d20a9025054a7fc30f908c2b915b94a33d4ab8d14eafcf71ae7dc0f33551a354b7ba019d9946e542c9a2006eb4d76dd1f
+DIST libhandwriting-0.0.14.tar.gz 19666840 BLAKE2B 1c671a087359cd9568a90f25950f78f31c023cb45c4d688867c3f60f734f9c02a733c6b6f2d61bc62ded4a876acd84de2f280571f2717ac4d5c31dc8167dbe92 SHA512 f1ec7bb7ebe1bc39ec15bebd50b102bf18b56bfb2a6e380d74af79d27b2665df0bd0aa2fbcdaefb37141315360de3ac17d1a25e35864fe2f71d6ab125ea75cae
diff --git a/dev-libs/libhandwriting/libhandwriting-0.0.14-r1.ebuild b/dev-libs/libhandwriting/libhandwriting-0.0.14-r1.ebuild
new file mode 120000
index 0000000..b8433e2d
--- /dev/null
+++ b/dev-libs/libhandwriting/libhandwriting-0.0.14-r1.ebuild
@@ -0,0 +1 @@
+libhandwriting-0.0.14.ebuild
\ No newline at end of file
diff --git a/dev-libs/libhandwriting/libhandwriting-0.0.14.ebuild b/dev-libs/libhandwriting/libhandwriting-0.0.14.ebuild
new file mode 100644
index 0000000..f0c6733
--- /dev/null
+++ b/dev-libs/libhandwriting/libhandwriting-0.0.14.ebuild
@@ -0,0 +1,72 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit dlc
+
+DESCRIPTION="Google handwriting recognition library for Chrome OS"
+HOMEPAGE="https://www.chromium.org/chromium-os"
+SRC_URI="gs://chromeos-localmirror/distfiles/libhandwriting-${PV}.tar.gz"
+
+LICENSE="BSD-Google Apache-2.0 MPL-2.0 icu-58"
+SLOT="0"
+KEYWORDS="*"
+
+IUSE="ondevice_handwriting ondevice_handwriting_dlc dlc"
+
+# ondevice_handwriting and ondevice_handwriting_dlc should be enabled at most
+# one. And if ondevice_handwriting_dlc is enabled; dlc should also be enabled.
+REQUIRED_USE="
+	ondevice_handwriting_dlc? ( dlc )
+	?? ( ondevice_handwriting ondevice_handwriting_dlc )"
+
+S="${WORKDIR}"
+
+# The storage space for this dlc. This sets up the upper limit of this dlc to be
+# DLC_PREALLOC_BLOCKS * 4KB = 40MB for now.
+DLC_PREALLOC_BLOCKS="10240"
+
+src_install() {
+	insinto /usr/include/chromeos/libhandwriting/
+	doins handwriting_interface.h
+	insinto /usr/include/chromeos/libhandwriting/proto/
+	doins handwriting_interface.proto
+	sed -i 's!chrome/knowledge/handwriting/!!g' handwriting_validate.proto || die
+	doins handwriting_validate.proto
+
+	if ! use ondevice_handwriting && ! use ondevice_handwriting_dlc; then
+		return
+	fi
+
+	if use ondevice_handwriting; then
+		local handwritinglib_path="/opt/google/chrome/ml_models/handwriting/"
+	else
+		local handwritinglib_path="$(dlc_add_path /)"
+	fi
+
+	insinto "${handwritinglib_path}"
+	# Install the shared library.
+	insopts -m0755
+	newins "libhandwriting-${ARCH}.so" "libhandwriting.so"
+	insopts -m0644
+	# Install the model files for english.
+	doins latin_indy.compact.fst latin_indy.pb latin_indy.tflite
+	doins latin_indy_conf.tflite latin_indy_seg.tflite
+	# Install the model files for gesture recognition.
+	newins gic20190510.tflite gic.reco_model.tflite
+	newins gic20190510_cros.ondevice.recospec.pb gic.recospec.pb
+
+	# Run dlc_src_install.
+	if use ondevice_handwriting_dlc; then
+		dlc_src_install
+	fi
+
+	# Only enable the tests for ondevice_handwriting.
+	if use ondevice_handwriting; then
+		# Install the testing data.
+		insinto /build/share/libhandwriting/
+		doins handwriting_labeled_requests.pb
+		doins gesture_labeled_requests.pb
+	fi
+}
diff --git a/dev-libs/libhandwriting/libhandwriting-0.0.9-r0.ebuild b/dev-libs/libhandwriting/libhandwriting-0.0.9-r0.ebuild
deleted file mode 100644
index 591b51f..0000000
--- a/dev-libs/libhandwriting/libhandwriting-0.0.9-r0.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="Google handwriting recognition library for Chrome OS"
-HOMEPAGE="https://www.chromium.org/chromium-os"
-
-LICENSE="BSD-Google"
-SLOT="0"
-
-SRC_URI="gs://chromeos-localmirror/distfiles/libhandwriting-${PV}.tar.gz"
-
-KEYWORDS="*"
-
-IUSE="ondevice_handwriting"
-
-S="${WORKDIR}"
-
-src_install() {
-	insinto /usr/include/chromeos/libhandwriting/
-	doins interface.h
-	insinto /usr/include/chromeos/libhandwriting/proto/
-	doins interface.proto
-	sed -i 's!chrome/knowledge/handwriting/!!g' validate.proto || die
-	doins validate.proto
-
-	if use ondevice_handwriting; then
-		# Install the shared library.
-		mv "libhandwriting-${ARCH}.so" "libhandwriting.so" || die
-		dolib.so "libhandwriting.so"
-		# Install the model files for english recognition.
-		insinto /opt/google/chrome/ml_models/handwriting/
-		doins latin_indy.compact.fst latin_indy.pb latin_indy.tflite
-		doins latin_indy_conf.tflite latin_indy_seg.tflite
-		# Install the model files for gesture recognition.
-		mv gic20190510.tflite gic.reco_model.tflite || die
-		mv gic20190510_cros.ondevice.recospec.pb gic.recospec.pb || die
-		doins gic.reco_model.tflite gic.recospec.pb
-		# Install the testing data.
-		insinto /build/share/libhandwriting/
-		doins handwriting_labeled_requests.pb
-		doins gesture_labeled_requests.pb
-	fi
-}
\ No newline at end of file
diff --git a/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r40.ebuild b/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r40.ebuild
deleted file mode 100644
index bdfe8c7..0000000
--- a/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r40.ebuild
+++ /dev/null
@@ -1,147 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("e0111498f44234609ad36837d4395ddc7d112ddf" "ebcc1a86c23c8b9683fdd1ab4be337267ed89151")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "1c6667714fda46bb46d673a59092849eecd8434c")
-CROS_WORKON_LOCALNAME=("../platform2" "libtextclassifier")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/libtextclassifier")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libtextclassifier")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="libtextclassifier"
-
-inherit cros-workon platform
-
-DESCRIPTION="Library for classifying text"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/libtextclassifier/"
-
-LICENSE="Apache-2.0"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/chrome-icu:=
-	dev-libs/flatbuffers:=
-	dev-libs/libutf:=
-	sci-libs/tensorflow:=
-	sys-libs/zlib:=
-"
-
-DEPEND="
-	${RDEPEND}
-"
-
-src_install() {
-	dolib.a "${OUT}/libtextclassifier.a"
-
-	# Install the header files to /usr/include/libtextclassifier/.
-	local header_files=(
-		"annotator/annotator.h"
-		"annotator/cached-features.h"
-		"annotator/contact/contact-engine-dummy.h"
-		"annotator/contact/contact-engine.h"
-		"annotator/datetime/extractor.h"
-		"annotator/datetime/parser.h"
-		"annotator/duration/duration.h"
-		"annotator/entity-data_generated.h"
-		"annotator/experimental/experimental-dummy.h"
-		"annotator/experimental/experimental.h"
-		"annotator/experimental/experimental_generated.h"
-		"annotator/feature-processor.h"
-		"annotator/grammar/dates/annotations/annotation-options.h"
-		"annotator/grammar/dates/annotations/annotation.h"
-		"annotator/grammar/dates/cfg-datetime-annotator.h"
-		"annotator/grammar/dates/dates_generated.h"
-		"annotator/grammar/dates/parser.h"
-		"annotator/grammar/dates/timezone-code_generated.h"
-		"annotator/grammar/dates/utils/annotation-keys.h"
-		"annotator/grammar/dates/utils/date-match.h"
-		"annotator/grammar/grammar-annotator.h"
-		"annotator/installed_app/installed-app-engine-dummy.h"
-		"annotator/installed_app/installed-app-engine.h"
-		"annotator/knowledge/knowledge-engine-dummy.h"
-		"annotator/knowledge/knowledge-engine.h"
-		"annotator/model-executor.h"
-		"annotator/model_generated.h"
-		"annotator/number/number.h"
-		"annotator/person_name/person-name-engine-dummy.h"
-		"annotator/person_name/person-name-engine.h"
-		"annotator/person_name/person_name_model_generated.h"
-		"annotator/strip-unpaired-brackets.h"
-		"annotator/translate/translate.h"
-		"annotator/types.h"
-		"annotator/zlib-utils.h"
-		"lang_id/common/embedding-network-params.h"
-		"lang_id/common/fel/task-context.h"
-		"lang_id/common/lite_base/attributes.h"
-		"lang_id/common/lite_base/casts.h"
-		"lang_id/common/lite_base/compact-logging-levels.h"
-		"lang_id/common/lite_base/compact-logging.h"
-		"lang_id/common/lite_base/float16.h"
-		"lang_id/common/lite_base/integral-types.h"
-		"lang_id/common/lite_base/logging.h"
-		"lang_id/common/lite_base/macros.h"
-		"lang_id/common/lite_strings/stringpiece.h"
-		"lang_id/lang-id-wrapper.h"
-		"lang_id/lang-id.h"
-		"lang_id/model-provider.h"
-		"utils/base/arena.h"
-		"utils/base/config.h"
-		"utils/base/integral_types.h"
-		"utils/base/logging.h"
-		"utils/base/logging_levels.h"
-		"utils/base/macros.h"
-		"utils/base/port.h"
-		"utils/base/status.h"
-		"utils/base/statusor.h"
-		"utils/calendar/calendar-common.h"
-		"utils/calendar/calendar-icu.h"
-		"utils/calendar/calendar.h"
-		"utils/codepoint-range.h"
-		"utils/codepoint-range_generated.h"
-		"utils/container/sorted-strings-table.h"
-		"utils/container/string-set.h"
-		"utils/flatbuffers.h"
-		"utils/flatbuffers_generated.h"
-		"utils/grammar/callback-delegate.h"
-		"utils/grammar/lexer.h"
-		"utils/grammar/match.h"
-		"utils/grammar/matcher.h"
-		"utils/grammar/rules-utils.h"
-		"utils/grammar/rules_generated.h"
-		"utils/grammar/types.h"
-		"utils/hash/farmhash.h"
-		"utils/i18n/language-tag_generated.h"
-		"utils/i18n/locale.h"
-		"utils/intents/intent-config_generated.h"
-		"utils/memory/mmap.h"
-		"utils/normalization_generated.h"
-		"utils/optional.h"
-		"utils/resources_generated.h"
-		"utils/strings/stringpiece.h"
-		"utils/tensor-view.h"
-		"utils/tflite-model-executor.h"
-		"utils/token-feature-extractor.h"
-		"utils/tokenizer.h"
-		"utils/tokenizer_generated.h"
-		"utils/utf8/unicodetext.h"
-		"utils/utf8/unilib-common.h"
-		"utils/utf8/unilib-icu.h"
-		"utils/utf8/unilib.h"
-		"utils/variant.h"
-		"utils/zlib/buffer_generated.h"
-		"utils/zlib/tclib_zlib.h"
-	)
-	local f
-	for f in "${header_files[@]}"; do
-		insinto "/usr/include/libtextclassifier/${f%/*}"
-		if [[ "${f}" == *_generated.h ]]; then
-			doins "${OUT}/gen/libtextclassifier/${f}"
-		else
-			doins "${S}/${f}"
-		fi
-	done
-}
diff --git a/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r62.ebuild b/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r62.ebuild
new file mode 100644
index 0000000..416702d
--- /dev/null
+++ b/dev-libs/libtextclassifier/libtextclassifier-0.0.1-r62.ebuild
@@ -0,0 +1,147 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "adbbad2e0138453af45cc08cb3d04317ae2b8ba1")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "cf3b02ca5d761ceb01a6247d04a44c867aba06f2")
+CROS_WORKON_LOCALNAME=("../platform2" "libtextclassifier")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "chromiumos/third_party/libtextclassifier")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libtextclassifier")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="libtextclassifier"
+
+inherit cros-workon platform
+
+DESCRIPTION="Library for classifying text"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/libtextclassifier/"
+
+LICENSE="Apache-2.0"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	chromeos-base/chrome-icu:=
+	dev-libs/flatbuffers:=
+	dev-libs/libutf:=
+	sci-libs/tensorflow:=
+	sys-libs/zlib:=
+"
+
+DEPEND="
+	${RDEPEND}
+"
+
+src_install() {
+	dolib.a "${OUT}/libtextclassifier.a"
+
+	# Install the header files to /usr/include/libtextclassifier/.
+	local header_files=(
+		"annotator/annotator.h"
+		"annotator/cached-features.h"
+		"annotator/contact/contact-engine-dummy.h"
+		"annotator/contact/contact-engine.h"
+		"annotator/datetime/extractor.h"
+		"annotator/datetime/parser.h"
+		"annotator/duration/duration.h"
+		"annotator/entity-data_generated.h"
+		"annotator/experimental/experimental-dummy.h"
+		"annotator/experimental/experimental.h"
+		"annotator/experimental/experimental_generated.h"
+		"annotator/feature-processor.h"
+		"annotator/grammar/dates/annotations/annotation-options.h"
+		"annotator/grammar/dates/annotations/annotation.h"
+		"annotator/grammar/dates/cfg-datetime-annotator.h"
+		"annotator/grammar/dates/dates_generated.h"
+		"annotator/grammar/dates/parser.h"
+		"annotator/grammar/dates/timezone-code_generated.h"
+		"annotator/grammar/dates/utils/annotation-keys.h"
+		"annotator/grammar/dates/utils/date-match.h"
+		"annotator/grammar/grammar-annotator.h"
+		"annotator/installed_app/installed-app-engine-dummy.h"
+		"annotator/installed_app/installed-app-engine.h"
+		"annotator/knowledge/knowledge-engine-dummy.h"
+		"annotator/knowledge/knowledge-engine.h"
+		"annotator/model-executor.h"
+		"annotator/model_generated.h"
+		"annotator/number/number.h"
+		"annotator/person_name/person-name-engine-dummy.h"
+		"annotator/person_name/person-name-engine.h"
+		"annotator/person_name/person_name_model_generated.h"
+		"annotator/strip-unpaired-brackets.h"
+		"annotator/translate/translate.h"
+		"annotator/types.h"
+		"annotator/zlib-utils.h"
+		"lang_id/common/embedding-network-params.h"
+		"lang_id/common/fel/task-context.h"
+		"lang_id/common/lite_base/attributes.h"
+		"lang_id/common/lite_base/casts.h"
+		"lang_id/common/lite_base/compact-logging-levels.h"
+		"lang_id/common/lite_base/compact-logging.h"
+		"lang_id/common/lite_base/float16.h"
+		"lang_id/common/lite_base/integral-types.h"
+		"lang_id/common/lite_base/logging.h"
+		"lang_id/common/lite_base/macros.h"
+		"lang_id/common/lite_strings/stringpiece.h"
+		"lang_id/lang-id-wrapper.h"
+		"lang_id/lang-id.h"
+		"lang_id/model-provider.h"
+		"utils/base/arena.h"
+		"utils/base/config.h"
+		"utils/base/integral_types.h"
+		"utils/base/logging.h"
+		"utils/base/logging_levels.h"
+		"utils/base/macros.h"
+		"utils/base/port.h"
+		"utils/base/status.h"
+		"utils/base/statusor.h"
+		"utils/calendar/calendar-common.h"
+		"utils/calendar/calendar-icu.h"
+		"utils/calendar/calendar.h"
+		"utils/codepoint-range.h"
+		"utils/codepoint-range_generated.h"
+		"utils/container/sorted-strings-table.h"
+		"utils/container/string-set.h"
+		"utils/flatbuffers.h"
+		"utils/flatbuffers_generated.h"
+		"utils/grammar/callback-delegate.h"
+		"utils/grammar/lexer.h"
+		"utils/grammar/match.h"
+		"utils/grammar/matcher.h"
+		"utils/grammar/rules-utils.h"
+		"utils/grammar/rules_generated.h"
+		"utils/grammar/types.h"
+		"utils/hash/farmhash.h"
+		"utils/i18n/language-tag_generated.h"
+		"utils/i18n/locale.h"
+		"utils/intents/intent-config_generated.h"
+		"utils/memory/mmap.h"
+		"utils/normalization_generated.h"
+		"utils/optional.h"
+		"utils/resources_generated.h"
+		"utils/strings/stringpiece.h"
+		"utils/tensor-view.h"
+		"utils/tflite-model-executor.h"
+		"utils/token-feature-extractor.h"
+		"utils/tokenizer.h"
+		"utils/tokenizer_generated.h"
+		"utils/utf8/unicodetext.h"
+		"utils/utf8/unilib-common.h"
+		"utils/utf8/unilib-icu.h"
+		"utils/utf8/unilib.h"
+		"utils/variant.h"
+		"utils/zlib/buffer_generated.h"
+		"utils/zlib/tclib_zlib.h"
+	)
+	local f
+	for f in "${header_files[@]}"; do
+		insinto "/usr/include/libtextclassifier/${f%/*}"
+		if [[ "${f}" == *_generated.h ]]; then
+			doins "${OUT}/gen/libtextclassifier/${f}"
+		else
+			doins "${S}/${f}"
+		fi
+	done
+}
diff --git a/dev-libs/libutf/libutf-0.0.1-r1.ebuild b/dev-libs/libutf/libutf-0.0.1-r1.ebuild
deleted file mode 100644
index ef96dea..0000000
--- a/dev-libs/libutf/libutf-0.0.1-r1.ebuild
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("d6441bfc21d770bb2399bbd0ece88452bfcdf506" "c17bb435be940edf1aff81469215bb6a071f3c38")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "fc022abae9d52285526cb0dda697e2bea18696ca")
-CROS_WORKON_LOCALNAME=("../platform2" "../aosp/external/libutf")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/libutf")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libutf")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="libutf"
-
-inherit cros-workon platform
-
-DESCRIPTION="A UTF-8 library based on the AOSP version of libutf."
-HOMEPAGE="https://chromium.googlesource.com/aosp/platform/external/libutf/"
-
-LICENSE="MIT"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND=""
-DEPEND=""
-
-src_install() {
-	insinto "/usr/include/android/"
-	doins "${S}/utf.h"
-
-	dolib.a "${OUT}/libutf.a"
-}
diff --git a/dev-libs/libutf/libutf-0.0.1-r21.ebuild b/dev-libs/libutf/libutf-0.0.1-r21.ebuild
new file mode 100644
index 0000000..481b8c0
--- /dev/null
+++ b/dev-libs/libutf/libutf-0.0.1-r21.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "c17bb435be940edf1aff81469215bb6a071f3c38")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "fc022abae9d52285526cb0dda697e2bea18696ca")
+CROS_WORKON_LOCALNAME=("../platform2" "../aosp/external/libutf")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/libutf")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/libutf")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="libutf"
+
+inherit cros-workon platform
+
+DESCRIPTION="A UTF-8 library based on the AOSP version of libutf."
+HOMEPAGE="https://chromium.googlesource.com/aosp/platform/external/libutf/"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND=""
+DEPEND=""
+
+src_install() {
+	insinto "/usr/include/android/"
+	doins "${S}/utf.h"
+
+	dolib.a "${OUT}/libutf.a"
+}
diff --git a/dev-libs/libxmlb/files/libxmlb-0.1.15-xb_builder_source_ctx_guess_content.patch b/dev-libs/libxmlb/files/libxmlb-0.1.15-xb_builder_source_ctx_guess_content.patch
new file mode 100644
index 0000000..eb6618f
--- /dev/null
+++ b/dev-libs/libxmlb/files/libxmlb-0.1.15-xb_builder_source_ctx_guess_content.patch
@@ -0,0 +1,217 @@
+commit d051e01f8884619a1e79f34bda22e4dffc793d60
+Author: Richard Hughes <richard@hughsie.com>
+Date:   Tue Aug 18 10:02:37 2020 +0100
+
+    Do not assume g_content_type_guess() always returns valid results
+    
+    On Chrome OS the database of magic is either incomplete or missing and so
+    provide important fallbacks manually.
+
+diff --git a/src/meson.build b/src/meson.build
+index d32c761..0e0ca4e 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -45,6 +45,7 @@ libxmlb = library(
+     'xb-builder-node.c',
+     'xb-builder-source.c',
+     'xb-builder-source-ctx.c',
++    'xb-common.c',
+     'xb-machine.c',
+     'xb-opcode.c',
+     'xb-node.c',
+@@ -115,6 +116,7 @@ if get_option('introspection')
+       'xb-builder-source.h',
+       'xb-builder-source-ctx.c',
+       'xb-builder-source-ctx.h',
++      'xb-common.c',
+       'xb-machine.c',
+       'xb-machine.h',
+       'xb-node.c',
+@@ -195,6 +197,7 @@ if get_option('tests')
+       'xb-builder-node.c',
+       'xb-builder-source.c',
+       'xb-builder-source-ctx.c',
++      'xb-common.c',
+       'xb-machine.c',
+       'xb-node.c',
+       'xb-node-query.c',
+diff --git a/src/xb-builder-source-ctx.c b/src/xb-builder-source-ctx.c
+index 7fef6f7..4ab4840 100644
+--- a/src/xb-builder-source-ctx.c
++++ b/src/xb-builder-source-ctx.c
+@@ -11,6 +11,7 @@
+ #include <gio/gio.h>
+ 
+ #include "xb-builder-source-ctx-private.h"
++#include "xb-common-private.h"
+ 
+ typedef struct {
+ 	GInputStream		*istream;
+@@ -100,39 +101,22 @@ xb_builder_source_ctx_get_content_type (XbBuilderSourceCtx *self,
+ 					GError **error)
+ {
+ 	XbBuilderSourceCtxPrivate *priv = GET_PRIVATE (self);
+-	g_autofree gchar *content_type = NULL;
++	gsize bufsz = 0;
++	guchar buf[4096] = { 0x00 };
+ 
+ 	g_return_val_if_fail (XB_IS_BUILDER_SOURCE_CTX (self), NULL);
+ 
+ 	if (G_IS_SEEKABLE (priv->istream)) {
+-		gsize bufsz = 0;
+-		guchar buf[4096] = { 0x00 };
+ 		if (!g_input_stream_read_all (priv->istream, buf, sizeof(buf),
+ 					      &bufsz, cancellable, error))
+ 			return NULL;
+ 		if (!g_seekable_seek (G_SEEKABLE (priv->istream), 0, G_SEEK_SET,
+ 				      cancellable, error))
+ 			return NULL;
+-		if (bufsz > 0)
+-			content_type = g_content_type_guess (priv->filename, buf, bufsz, NULL);
+ 	}
+-
+-	/* either unseekable, or empty */
+-	if (content_type == NULL)
+-		content_type = g_content_type_guess (priv->filename, NULL, 0, NULL);
+-
+-#ifdef _WIN32
+-	/* map Windows "mime-type" to a content type */
+-	if (g_strcmp0 (content_type, ".gz") == 0)
+-		return g_strdup ("application/gzip");
+-	if (g_strcmp0 (content_type, ".txt") == 0 ||
+-	    g_strcmp0 (content_type, ".xml") == 0)
+-		return g_strdup ("application/xml");
+-	if (g_strcmp0 (content_type, ".desktop") == 0)
+-		return g_strdup ("application/x-desktop");
+-#endif
+-
+-	return g_steal_pointer (&content_type);
++	if (bufsz > 0)
++		return xb_content_type_guess (priv->filename, buf, bufsz);
++	return xb_content_type_guess (priv->filename, NULL, 0);
+ }
+ 
+ /* private */
+diff --git a/src/xb-common-private.h b/src/xb-common-private.h
+new file mode 100644
+index 0000000..1ecbbf5
+--- /dev/null
++++ b/src/xb-common-private.h
+@@ -0,0 +1,13 @@
++/*
++ * Copyright (C) 2020 Richard Hughes <richard@hughsie.com>
++ *
++ * SPDX-License-Identifier: LGPL-2.1+
++ */
++
++#pragma once
++
++#include <glib.h>
++
++gchar		*xb_content_type_guess			(const gchar	*filename,
++							 const guchar	*buf,
++							 gsize		 bufsz);
+diff --git a/src/xb-common.c b/src/xb-common.c
+new file mode 100644
+index 0000000..e322c7f
+--- /dev/null
++++ b/src/xb-common.c
+@@ -0,0 +1,98 @@
++/*
++ * Copyright (C) 2020 Richard Hughes <richard@hughsie.com>
++ *
++ * SPDX-License-Identifier: LGPL-2.1+
++ */
++
++#define G_LOG_DOMAIN				"XbCommon"
++
++#include "config.h"
++
++#include <string.h>
++#include <gio/gio.h>
++
++#include "xb-common-private.h"
++
++static const gchar *
++xb_content_type_guess_from_fn (const gchar *filename)
++{
++	gchar *ext; /* no ownership */
++
++	g_return_val_if_fail (filename != NULL, NULL);
++
++	/* get file extension with dot */
++	ext = g_strrstr (filename, ".");
++	if (ext == NULL)
++		return NULL;
++
++	/* map Windows "mime-type" to a content type */
++	if (g_strcmp0 (ext, ".gz") == 0)
++		return "application/gzip";
++	if (g_strcmp0 (ext, ".txt") == 0 ||
++	    g_strcmp0 (ext, ".xml") == 0)
++		return "application/xml";
++	if (g_strcmp0 (ext, ".desktop") == 0)
++		return "application/x-desktop";
++	return NULL;
++}
++
++static gboolean
++xb_content_type_match (const guchar *buf, gsize bufsz, gsize offset,
++		       const gchar *magic, gsize magic_size)
++{
++	/* document too small */
++	if (offset + magic_size > bufsz)
++		return FALSE;
++	return memcmp (buf + offset, magic, magic_size) == 0;
++}
++
++/**
++ * xb_content_type_guess: (skip)
++ * @filename: (nullable): filename
++ * @buf: (nullable): file data buffer
++ * @bufsz: size of file data buffer
++ *
++ * Guesses the content type based on example data. Either @filename or @buf may
++ * be %NULL, in which case the guess will be based solely on the other argument.
++ *
++ * Returns: a string indicating a guessed content type
++ **/
++gchar *
++xb_content_type_guess (const gchar *filename, const guchar *buf, gsize bufsz)
++{
++	g_autofree gchar *content_type = NULL;
++
++	/* check for bad results, e.g. from Chrome OS */
++	content_type = g_content_type_guess (filename, buf, bufsz, NULL);
++	if (g_strcmp0 (content_type, "application/octet-stream") == 0 ||
++	    g_strcmp0 (content_type, "text/plain") == 0) {
++
++		/* magic */
++		if (bufsz > 0) {
++			if (xb_content_type_match (buf, bufsz, 0x0, "\x1f\x8b", 2))
++				return g_strdup ("application/gzip");
++			if (xb_content_type_match (buf, bufsz, 0x0, "<?xml", 5))
++				return g_strdup ("application/xml");
++			if (xb_content_type_match (buf, bufsz, 0x0, "[Desktop Entry]", 15))
++				return g_strdup ("application/x-desktop");
++		}
++
++		/* file extensions */
++		if (filename != NULL) {
++			const gchar *tmp = xb_content_type_guess_from_fn (filename);
++			if (tmp != NULL)
++				return g_strdup (tmp);
++		}
++	}
++
++#ifdef _WIN32
++	/* fall back harder as there is no mime data at all */
++	if (filename != NULL) {
++		const gchar *tmp = xb_content_type_guess_from_fn (filename);
++		if (tmp != NULL)
++			return g_strdup (tmp);
++	}
++#endif
++
++	return g_steal_pointer (&content_type);
++}
diff --git a/dev-libs/libxmlb/libxmlb-0.1.15-r1.ebuild b/dev-libs/libxmlb/libxmlb-0.1.15-r1.ebuild
deleted file mode 100644
index a8b8d24..0000000
--- a/dev-libs/libxmlb/libxmlb-0.1.15-r1.ebuild
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-PYTHON_COMPAT=( python2_7 python3_{6,7,8} )
-
-inherit meson python-any-r1
-
-DESCRIPTION="Library to help create and query binary XML blobs"
-HOMEPAGE="https://github.com/hughsie/libxmlb"
-SRC_URI="https://github.com/hughsie/libxmlb/archive/${PV}.tar.gz -> ${P}.tar.gz"
-LICENSE="LGPL-2.1+"
-SLOT="0"
-
-KEYWORDS="*"
-IUSE="doc introspection stemmer test"
-
-RESTRICT="!test? ( test )"
-
-RDEPEND="
-	dev-libs/glib:2
-	sys-apps/util-linux
-	stemmer? ( dev-libs/snowball-stemmer )
-"
-
-DEPEND="
-	${RDEPEND}
-	doc? ( dev-util/gtk-doc )
-	introspection? ( dev-libs/gobject-introspection )
-"
-
-BDEPEND="
-	>=dev-util/meson-0.47.0
-	virtual/pkgconfig
-	introspection? (
-		$(python_gen_any_dep 'dev-python/setuptools[${PYTHON_USEDEP}]')
-		${PYTHON_DEPS}
-	)
-"
-
-python_check_deps() {
-	has_version -b "dev-python/setuptools[${PYTHON_USEDEP}]"
-}
-
-pkg_setup() {
-	use introspection && python-any-r1_pkg_setup
-}
-
-src_configure() {
-	local emesonargs=(
-		-Dgtkdoc="$(usex doc true false)"
-		-Dintrospection="$(usex introspection true false)"
-		-Dstemmer="$(usex stemmer true false)"
-		-Dtests="$(usex test true false)"
-	)
-	meson_src_configure
-}
diff --git a/dev-libs/libxmlb/libxmlb-0.1.15-r2.ebuild b/dev-libs/libxmlb/libxmlb-0.1.15-r2.ebuild
new file mode 100644
index 0000000..0696f98
--- /dev/null
+++ b/dev-libs/libxmlb/libxmlb-0.1.15-r2.ebuild
@@ -0,0 +1,62 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python2_7 python3_{6,7,8} )
+
+inherit meson python-any-r1
+
+DESCRIPTION="Library to help create and query binary XML blobs"
+HOMEPAGE="https://github.com/hughsie/libxmlb"
+SRC_URI="https://github.com/hughsie/libxmlb/archive/${PV}.tar.gz -> ${P}.tar.gz"
+LICENSE="LGPL-2.1+"
+SLOT="0"
+
+KEYWORDS="*"
+IUSE="doc introspection stemmer test"
+
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-libs/glib:2
+	sys-apps/util-linux
+	stemmer? ( dev-libs/snowball-stemmer )
+"
+
+DEPEND="
+	${RDEPEND}
+	doc? ( dev-util/gtk-doc )
+	introspection? ( dev-libs/gobject-introspection )
+"
+
+BDEPEND="
+	>=dev-util/meson-0.47.0
+	virtual/pkgconfig
+	introspection? (
+		$(python_gen_any_dep 'dev-python/setuptools[${PYTHON_USEDEP}]')
+		${PYTHON_DEPS}
+	)
+"
+
+PATCHES=(
+	"${FILESDIR}/${P}-xb_builder_source_ctx_guess_content.patch"
+)
+
+python_check_deps() {
+	has_version -b "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pkg_setup() {
+	use introspection && python-any-r1_pkg_setup
+}
+
+src_configure() {
+	local emesonargs=(
+		-Dgtkdoc="$(usex doc true false)"
+		-Dintrospection="$(usex introspection true false)"
+		-Dstemmer="$(usex stemmer true false)"
+		-Dtests="$(usex test true false)"
+	)
+	meson_src_configure
+}
diff --git a/dev-libs/modp_b64/modp_b64-0.0.1-r61.ebuild b/dev-libs/modp_b64/modp_b64-0.0.1-r61.ebuild
deleted file mode 100644
index a5758421..0000000
--- a/dev-libs/modp_b64/modp_b64-0.0.1-r61.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT=("c142078820d0707858873cedb290a78d36f531af" "467734f4870d3ab23968f5ebdd461f6112e4103b")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a")
-inherit cros-constants
-
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/modp_b64")
-CROS_WORKON_LOCALNAME=("../platform2" "../third_party/modp_b64")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/modp_b64")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-
-PLATFORM_SUBDIR="modp_b64"
-
-WANT_LIBCHROME=no
-
-inherit cros-fuzzer cros-sanitizers cros-workon platform
-
-DESCRIPTION="Base64 encoder/decoder library."
-HOMEPAGE="https://github.com/client9/stringencoders"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-IUSE="fuzzer"
-
-src_install() {
-	dolib.a "${OUT}"/libmodp_b64.a
-
-	insinto /usr/include
-	doins -r modp_b64
-
-	fuzzer_install "${S}/OWNERS.fuzzer" "${OUT}"/modp_b64_decode_fuzzer
-	fuzzer_install "${S}/OWNERS.fuzzer" "${OUT}"/modp_b64_encode_fuzzer
-}
diff --git a/dev-libs/modp_b64/modp_b64-0.0.1-r81.ebuild b/dev-libs/modp_b64/modp_b64-0.0.1-r81.ebuild
new file mode 100644
index 0000000..0017419d384
--- /dev/null
+++ b/dev-libs/modp_b64/modp_b64-0.0.1-r81.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT=("d290f731c4d623269bf6a259a351bf92eb5f4854" "467734f4870d3ab23968f5ebdd461f6112e4103b")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a")
+inherit cros-constants
+
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/modp_b64")
+CROS_WORKON_LOCALNAME=("../platform2" "../third_party/modp_b64")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "aosp/platform/external/modp_b64")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+
+PLATFORM_SUBDIR="modp_b64"
+
+WANT_LIBCHROME=no
+
+inherit cros-fuzzer cros-sanitizers cros-workon platform
+
+DESCRIPTION="Base64 encoder/decoder library."
+HOMEPAGE="https://github.com/client9/stringencoders"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="fuzzer"
+
+src_install() {
+	dolib.a "${OUT}"/libmodp_b64.a
+
+	insinto /usr/include
+	doins -r modp_b64
+
+	fuzzer_install "${S}/OWNERS.fuzzer" "${OUT}"/modp_b64_decode_fuzzer
+	fuzzer_install "${S}/OWNERS.fuzzer" "${OUT}"/modp_b64_encode_fuzzer
+}
diff --git a/dev-libs/openssl/OWNERS b/dev-libs/openssl/OWNERS
new file mode 100644
index 0000000..5a77185b8
--- /dev/null
+++ b/dev-libs/openssl/OWNERS
@@ -0,0 +1 @@
+include /OWNERS.security
diff --git a/dev-libs/protobuf/OWNERS b/dev-libs/protobuf/OWNERS
new file mode 100644
index 0000000..6ca25c6
--- /dev/null
+++ b/dev-libs/protobuf/OWNERS
@@ -0,0 +1,2 @@
+chirantan@chromium.org
+allenwebb@chromium.org
diff --git a/dev-python/btsocket/OWNERS b/dev-python/btsocket/OWNERS
index aa49306..125f6d7 100644
--- a/dev-python/btsocket/OWNERS
+++ b/dev-python/btsocket/OWNERS
@@ -1,4 +1 @@
-mcchou@chromium.org
-josephsih@chromium.org
-alainm@chromium.org
-yshavit@chromium.org
+include /net-wireless/bluez/OWNERS
diff --git a/dev-python/google-api-core/Manifest b/dev-python/google-api-core/Manifest
index cabcd01..61f0724 100644
--- a/dev-python/google-api-core/Manifest
+++ b/dev-python/google-api-core/Manifest
@@ -1 +1 @@
-DIST google-api-core-1.14.2.tar.gz 72467 BLAKE2B e6a5248f7d3ca617db6eb4fa7fa92b9b38ac2454d1ed7025e15cc209550a49b3d0a890deb62176f1b57968515f1546e9daa8515de368a0b22c40850b73f377e8 SHA512 65d9a65dafe94fa6fac114b8ba1f382353fb52701c932e5e1106b8da72dceef18d48a8dbe3cfcee2051352614c61f6e7c4543651fa59d22408b1806d35e7b342
+DIST google-api-core-1.19.0.tar.gz 91623 BLAKE2B a5ad73a966efd3cbd6ba05505e5b525bde2eb8b085b4a768f0c324c65c1d695afb1ee2f28dc9b1a8c83a0f94718973bdb77e3ff1e8bad5fa17aeafa71eb147f9 SHA512 92bd995dbbbd00ff97405b6991322832c8a1ba4c6b478056d9038a05b65e76ba525a9feec05cb338fcee8b9ad49e55c2103e82adb02d773fad4f0a4c4dcff69c
diff --git a/dev-python/google-api-core/google-api-core-1.14.2-r1.ebuild b/dev-python/google-api-core/google-api-core-1.14.2-r1.ebuild
deleted file mode 120000
index 2994e5a..0000000
--- a/dev-python/google-api-core/google-api-core-1.14.2-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-google-api-core-1.14.2.ebuild
\ No newline at end of file
diff --git a/dev-python/google-api-core/google-api-core-1.14.2.ebuild b/dev-python/google-api-core/google-api-core-1.19.0.ebuild
similarity index 100%
rename from dev-python/google-api-core/google-api-core-1.14.2.ebuild
rename to dev-python/google-api-core/google-api-core-1.19.0.ebuild
diff --git a/dev-python/google-cloud-core/Manifest b/dev-python/google-cloud-core/Manifest
index f94ebf6..b0b6938 100644
--- a/dev-python/google-cloud-core/Manifest
+++ b/dev-python/google-cloud-core/Manifest
@@ -1 +1 @@
-DIST google-cloud-core-1.0.3.tar.gz 30706 BLAKE2B 64ea871e40fc993f9efeba3c14f9520b5667c05e40cd3e1c7d313dbbdc94272af6d9f43fae0e40bf8463b007407a20c632bc616259ef1b2bed97e7e4446b7e70 SHA512 e8a7bb179dc8bd1a3127e56dd8130ed890e32ea3ccbcc40a2a167456c9e07893f0d9b8a3752f7f9b560b4831719a57a4fcf9644e15d125e86c2f12799057b8c3
+DIST google-cloud-core-1.4.1.tar.gz 33011 BLAKE2B fd2abc3b3087da221665b73f73d2742eb09b5e55faa40390b378a5754486ed5d220d4316deefd65056149eadef90ca7d0d803b8c7cb1eed53999cb0094c397e6 SHA512 6abd41b5fae0f6649ad228b9bd25df57f621327d496f7c83be3203e218448f5b87b7df091b7a516f8025ddcd574a684e00b803827b9a4880c9af15564f602fdd
diff --git a/dev-python/google-cloud-core/google-cloud-core-1.0.3-r1.ebuild b/dev-python/google-cloud-core/google-cloud-core-1.0.3-r1.ebuild
deleted file mode 120000
index c764e39..0000000
--- a/dev-python/google-cloud-core/google-cloud-core-1.0.3-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-google-cloud-core-1.0.3.ebuild
\ No newline at end of file
diff --git a/dev-python/google-cloud-core/google-cloud-core-1.0.3.ebuild b/dev-python/google-cloud-core/google-cloud-core-1.0.3.ebuild
deleted file mode 100644
index eb14e85..0000000
--- a/dev-python/google-cloud-core/google-cloud-core-1.0.3.ebuild
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2.
-
-EAPI=6
-
-PYTHON_COMPAT=( python{2_7,3_4,3_5,3_6} pypy )
-
-inherit distutils-r1
-
-DESCRIPTION="Google Cloud API client core library"
-SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
-LICENSE="Apache-2.0"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	>=dev-python/google-api-core-1.14.0[${PYTHON_USEDEP}]"
-DEPEND="${RDEPEND}
-	dev-python/setuptools[${PYTHON_USEDEP}]"
diff --git a/dev-python/google-cloud-core/google-cloud-core-1.4.1.ebuild b/dev-python/google-cloud-core/google-cloud-core-1.4.1.ebuild
new file mode 100644
index 0000000..51a96cf
--- /dev/null
+++ b/dev-python/google-cloud-core/google-cloud-core-1.4.1.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=6
+
+PYTHON_COMPAT=( python3_{6,7,8,9} pypy3 )
+
+inherit distutils-r1
+
+DESCRIPTION="Google Cloud API client core library"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	>=dev-python/google-api-core-1.19.0[${PYTHON_USEDEP}]
+	>=dev-python/grpcio-1.8.2[${PYTHON_USEDEP}]"
+DEPEND="${RDEPEND}"
diff --git a/dev-python/google-cloud-logging/Manifest b/dev-python/google-cloud-logging/Manifest
new file mode 100644
index 0000000..54663a6
--- /dev/null
+++ b/dev-python/google-cloud-logging/Manifest
@@ -0,0 +1 @@
+DIST google-cloud-logging-1.15.1.tar.gz 138886 BLAKE2B 29ec808c8abf63772b1e14729a15f5e623920622e12961ff9073bdf10caa3c496787a1555cee8e5efa2d0b872ecc515dedc0098eb6fffe7c8c8c4f2c0aa7e428 SHA512 7dff9cccef95e95237aebbcff29dba4438dede9dfa7b687406b00cde98de3b6cbc9cef6076e3cf28a7608bb8addbc4e95d88255f12d0f1215924d4987876d26c
diff --git a/dev-python/google-cloud-logging/google-cloud-logging-1.15.1.ebuild b/dev-python/google-cloud-logging/google-cloud-logging-1.15.1.ebuild
new file mode 100644
index 0000000..5df1352
--- /dev/null
+++ b/dev-python/google-cloud-logging/google-cloud-logging-1.15.1.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2.
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} pypy3 )
+
+inherit distutils-r1
+
+DESCRIPTION="Stackdriver Logging API client library"
+HOMEPAGE="https://pypi.org/project/google-cloud-logging/"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="dev-python/google-api-core[${PYTHON_USEDEP}]
+	dev-python/google-cloud-core[${PYTHON_USEDEP}]"
+DEPEND="${RDEPEND}"
diff --git a/dev-python/hid-tools/Manifest b/dev-python/hid-tools/Manifest
new file mode 100644
index 0000000..05ecef8
--- /dev/null
+++ b/dev-python/hid-tools/Manifest
@@ -0,0 +1 @@
+DIST hid-tools-0.2.tar.gz 93360 BLAKE2B 551aba74929d27fec4a763a6473463dfc057ef4f9d4074d50b7ee3b809dc6f5309f983db5cdc7a0e3449ddb049bc22dfc6dbfda84b9a66f4508297244904b8c2 SHA512 580635bc679b8b6dd396c72b9a5d6560a56a3c3fa4b1d83ebbe82508977e23ce3abf0892406605937e62cde6335d205eba283b6c67dfe65630a2a27d74747ffb
diff --git a/dev-python/hid-tools/files/hid-tools-0.2-utf-8.patch b/dev-python/hid-tools/files/hid-tools-0.2-utf-8.patch
new file mode 100644
index 0000000..45e219f
--- /dev/null
+++ b/dev-python/hid-tools/files/hid-tools-0.2-utf-8.patch
@@ -0,0 +1,16 @@
+Fix by Breno Leitao
+
+https://gitlab.freedesktop.org/libevdev/hid-tools/-/commit/7597776260547a9db89987ec7d339de8cc6b2cc2
+
+--- a/hidtools/hut.py
++++ b/hidtools/hut.py
+@@ -395,7 +395,8 @@ class HidUsageTable(object):
+         hut = HidUsageTable()
+         for filename in os.listdir(DATA_DIR):
+             if filename.endswith('.hut'):
+-                with open(os.path.join(DATA_DIR, filename), 'r') as f:
++                with open(os.path.join(DATA_DIR, filename), 'r',
++                          encoding="utf-8") as f:
+                     try:
+                         usage_page = cls._parse_usages(f)
+                         hut[usage_page.page_id] = usage_page
diff --git a/dev-python/hid-tools/hid-tools-0.2-r1.ebuild b/dev-python/hid-tools/hid-tools-0.2-r1.ebuild
new file mode 100644
index 0000000..272e144
--- /dev/null
+++ b/dev-python/hid-tools/hid-tools-0.2-r1.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} )
+inherit distutils-r1
+
+DESCRIPTION="Tools to interact with the kernel's HID subsystem"
+HOMEPAGE="https://gitlab.freedesktop.org/libevdev/hid-tools"
+SRC_URI="https://gitlab.freedesktop.org/libevdev/${PN}/-/archive/${PV}/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	dev-python/click[${PYTHON_USEDEP}]
+	dev-python/pyyaml[${PYTHON_USEDEP}]
+	dev-python/parse[${PYTHON_USEDEP}]
+"
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+	"${FILESDIR}/${P}-utf-8.patch"
+)
diff --git a/dev-python/parse/Manifest b/dev-python/parse/Manifest
new file mode 100644
index 0000000..a75e39e
--- /dev/null
+++ b/dev-python/parse/Manifest
@@ -0,0 +1 @@
+DIST parse-1.16.0.zip 34317 BLAKE2B 2537828c7be3e533a10ad731cbcdd4df45eb3b2ff11312f500bfa5bdb3add996084058b3dce2aacd1246a13a1819ae3b21f8c69d59d15a40b02d8c65d4739d21 SHA512 593f916e8e11c964639908ef45f4bcc8bace3dd9555ffb49207418e8ebc01b1c2e35dc06600190008c9690bac585829e373a6bf77faddb4b3c54c9f39498c122
diff --git a/dev-python/parse/parse-1.16.0-r1.ebuild b/dev-python/parse/parse-1.16.0-r1.ebuild
new file mode 100644
index 0000000..0eec6b6
--- /dev/null
+++ b/dev-python/parse/parse-1.16.0-r1.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{6..8} )
+
+inherit distutils-r1
+
+DESCRIPTION="Parse strings based on Python's format() syntax"
+HOMEPAGE="https://github.com/r1chardj0n3s/parse"
+GIT_SHA1="27db6b3498aeee80aa87c083dda76f2df2d87fa4"
+SRC_URI="https://github.com/r1chardj0n3s/parse/archive/${GIT_SHA1}.zip -> ${P}.zip"
+S="${WORKDIR}/${PN}-${GIT_SHA1}"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
diff --git a/dev-rust/9s/9s-0.1.0-r20.ebuild b/dev-rust/9s/9s-0.1.0-r20.ebuild
deleted file mode 100644
index e375da6..0000000
--- a/dev-rust/9s/9s-0.1.0-r20.ebuild
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="adaffd360f762687079da84bd054563ac9bf475e"
-CROS_WORKON_TREE="a77d3b508a990de2e8719aa84be0734535a1cbfb"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="vm_tools/9s"
-
-CROS_RUST_CRATE_NAME="p9s"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Server binary for the 9P file system protocol"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/9s/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="test"
-
-RDEPEND="
-	!<chromeos-base/crosvm-0.0.1-r260
-	!dev-rust/9s:0.1.0
-"
-DEPEND="
-	dev-rust/getopts:=
-	dev-rust/libc:=
-	dev-rust/libchromeos:=
-	dev-rust/log:=
-	dev-rust/p9:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/vm_tools/9s"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	newbin "$(cros-rust_get_build_dir)/p9s" 9s
-
-	insinto /usr/share/policy
-	newins "seccomp/9s-seccomp-${ARCH}.policy" 9s-seccomp.policy
-}
diff --git a/dev-rust/9s/9s-0.1.0-r23.ebuild b/dev-rust/9s/9s-0.1.0-r23.ebuild
new file mode 100644
index 0000000..d774acc
--- /dev/null
+++ b/dev-rust/9s/9s-0.1.0-r23.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="36343094f3f39e388f66d7378fa14da8457df23b"
+CROS_WORKON_TREE="5011a6570d961e61bad9165a158fc411e3bc64a8"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="vm_tools/9s"
+
+CROS_RUST_CRATE_NAME="p9s"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Server binary for the 9P file system protocol"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/9s/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="test"
+
+RDEPEND="
+	!<chromeos-base/crosvm-0.0.1-r260
+	!dev-rust/9s:0.1.0
+"
+DEPEND="
+	dev-rust/getopts:=
+	dev-rust/libc:=
+	dev-rust/libchromeos:=
+	dev-rust/log:=
+	dev-rust/p9:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/vm_tools/9s"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	newbin "$(cros-rust_get_build_dir)/p9s" 9s
+
+	insinto /usr/share/policy
+	newins "seccomp/9s-seccomp-${ARCH}.policy" 9s-seccomp.policy
+}
diff --git a/dev-rust/9s/9s-9999.ebuild b/dev-rust/9s/9s-9999.ebuild
index cc55da6..bebb8c9 100644
--- a/dev-rust/9s/9s-9999.ebuild
+++ b/dev-rust/9s/9s-9999.ebuild
@@ -5,7 +5,6 @@
 
 CROS_WORKON_LOCALNAME="../platform2"
 CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
 CROS_WORKON_INCREMENTAL_BUILD=1
 CROS_WORKON_SUBTREE="vm_tools/9s"
 
diff --git a/dev-rust/alsa-sys/Manifest b/dev-rust/alsa-sys/Manifest
new file mode 100644
index 0000000..521d8f6
--- /dev/null
+++ b/dev-rust/alsa-sys/Manifest
@@ -0,0 +1 @@
+DIST alsa-sys-0.2.0.crate 20638 BLAKE2B a1e2f4219dccb0645ce994736f5aea804cf0e930659e50471833d919a35ef3334881bcf1d23dece6ddb30df318ade2725dbbb0ceb0c46e794d936fcb9c511383 SHA512 9d7ddd73f986c39c2c73ab3de30b21de336571c37d69f950e159ea9d751fd571f8fc471423b898f561e74bf85f029cd0a98466a00367f751c0948845a889f6e1
diff --git a/dev-rust/alsa-sys/alsa-sys-0.2.0.ebuild b/dev-rust/alsa-sys/alsa-sys-0.2.0.ebuild
new file mode 100644
index 0000000..8ad4acc
--- /dev/null
+++ b/dev-rust/alsa-sys/alsa-sys-0.2.0.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+inherit cros-rust
+
+DESCRIPTION="FFI bindings for the ALSA project (Advanced Linux Sound Architecture)"
+HOMEPAGE="https://docs.rs/alsa-sys"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/libc-0.2.65:=
+	<dev-rust/libc-0.3
+	>=dev-rust/pkg-config-0.3.0:= <dev-rust/pkg-config-0.4.0
+	>=media-libs/alsa-lib-1.1.8-r3:= <media-libs/alsa-lib-2.0.0
+"
diff --git a/dev-rust/android_log-sys/android_log-sys-0.2.0.ebuild b/dev-rust/android_log-sys/android_log-sys-0.2.0.ebuild
new file mode 100644
index 0000000..072e90c
--- /dev/null
+++ b/dev-rust/android_log-sys/android_log-sys-0.2.0.ebuild
@@ -0,0 +1,15 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_RUST_EMPTY_CRATE=1
+
+inherit cros-rust
+
+DESCRIPTION="Empty ${PN} crate"
+HOMEPAGE=""
+
+LICENSE="BSD-Google"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/anyhow/Manifest b/dev-rust/anyhow/Manifest
new file mode 100644
index 0000000..38eca64
--- /dev/null
+++ b/dev-rust/anyhow/Manifest
@@ -0,0 +1 @@
+DIST anyhow-1.0.32.crate 28512 BLAKE2B c9c37e9bd70074d53b163a3077b7a5304d04b13ada50c020898ee2169ef4db2e26aeb283421f2e757c3d6e31c58ec1832162c1a01904a44b9fb4cf14ffe05d0c SHA512 4646a3b85459fefd826c11fcdf69e532467d2d6ec0711b8d26312483ba988fa8492fe2f727332c39479e25dd37ad04830ea4ab19034cdcdc639e226e2744dc90
diff --git a/dev-rust/anyhow/anyhow-1.0.32.ebuild b/dev-rust/anyhow/anyhow-1.0.32.ebuild
new file mode 100644
index 0000000..e3606ae
--- /dev/null
+++ b/dev-rust/anyhow/anyhow-1.0.32.ebuild
@@ -0,0 +1,16 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="A trait object based error type for easy idiomatic error handling."
+HOMEPAGE="https://github.com/thiserror/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/ascii/Manifest b/dev-rust/ascii/Manifest
new file mode 100644
index 0000000..6d6ecc9
--- /dev/null
+++ b/dev-rust/ascii/Manifest
@@ -0,0 +1 @@
+DIST ascii-1.0.0.crate 31727 BLAKE2B 9733e1aa9d41e3b170ac07e63708e7be0f15f9eda73ba371cd239d9c46e881d1e46c2e80b5c5440bf1a1f0b8f6e66199241a455db9a3a535672881bca4e0d13a SHA512 5696e14883d4946c4acbace84ee4c65af527a6b1725a7d16ab5d5b8cc671ff211324f15f3fb0755cb1c9dcd598a054b32cd51c69ad06391e7e147880f5c97a1b
diff --git a/dev-rust/ascii/ascii-1.0.0.ebuild b/dev-rust/ascii/ascii-1.0.0.ebuild
new file mode 100644
index 0000000..1acf368
--- /dev/null
+++ b/dev-rust/ascii/ascii-1.0.0.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="ASCII-only equivalents to 'char', 'str' and 'String'."
+HOMEPAGE="https://docs.rs/crate/ascii/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+# serde and serde_test are unused optional dependencies, but add them in anyways
+# so that we don't get errors from cargo later on.
+DEPEND="
+	>=dev-rust/serde-1.0.25:= <dev-rust/serde-2
+	>=dev-rust/serde_test-1:= <dev-rust/serde_test-2
+"
diff --git a/dev-rust/autocfg/Manifest b/dev-rust/autocfg/Manifest
index 5d0adfc..166a6f5 100644
--- a/dev-rust/autocfg/Manifest
+++ b/dev-rust/autocfg/Manifest
@@ -1 +1,2 @@
 DIST autocfg-0.1.2.crate 10444 BLAKE2B 1e37c97d6d309a5250552fc4c38066ba004674af6e6d091f08b24f47475c11b2db4b0967ce55d2208b9e2ba080e2bcb4b4226acd0da9d4c15dd844827ea6f0b4 SHA512 0f692f4062d22be01c32af2ceb6ed3887a7d65843e1a6ec696fbaa46517d02e62d573055efe5da3a63847f05bc37b254bf2dd750738b528774f63352eacdabe4
+DIST autocfg-1.0.0.crate 12870 BLAKE2B 79e495d53298574afd3b292da7c9c363dcb3ea434fd44258efaf3628e95ebfc731f03083f8a1060272a2a3478a6452cdc41539e2dac08465cc6e6283844bf260 SHA512 451fc63148792ba1952b884170e3481359b01bacca5ec0456f43ca58f8e092b8f81c9764f8b00d4104059ff608089be5858220ee868127c064cc890c767ec3a3
diff --git a/dev-rust/autocfg/autocfg-1.0.0.ebuild b/dev-rust/autocfg/autocfg-1.0.0.ebuild
new file mode 100644
index 0000000..386650b
--- /dev/null
+++ b/dev-rust/autocfg/autocfg-1.0.0.ebuild
@@ -0,0 +1,14 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="A Rust library for build scripts to automatically configure code based on compiler support"
+HOMEPAGE="https://github.com/cuviper/autocfg"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/bitflags/Manifest b/dev-rust/bitflags/Manifest
index a05aab3..38b2b58 100644
--- a/dev-rust/bitflags/Manifest
+++ b/dev-rust/bitflags/Manifest
@@ -1,2 +1,2 @@
 DIST bitflags-0.7.0.crate 10851 BLAKE2B 00a4e2b66275d6fc8a7374aeec275b5fdf0e2c197e7e90e56afe89ac45554d14ba2063aa26a486dd88d822939b6ea5a5b40936d45d8717e2a98e95ba1d3f501f SHA512 fdfe472c26e5486d1a3f1bfe5a27d26678781235c6e14b49bdb75388359cb78841f38d794fc4557548581a80a10b715d8840182c9ca3316049984a6b9f35b3c0
-DIST bitflags-1.1.0.crate 16322 BLAKE2B 01931976111840ca69b58e77e2c18b26ebabe4ef71ebdbe83565fbef42ffbb9512ad376192c085070485cd344b8614f260aafe0614fb20342cca5a15e9616385 SHA512 e3e611cf35a1ed4930727d530e6c78add895bd96636ca1354f1269b3d0e36e77fbb9ec850fe1f448a10f09ea2b2f89c2b16bb96b7da585851ce4c29a308968e3
+DIST bitflags-1.2.1.crate 16745 BLAKE2B 0fa6d3ce44aad7616d5cd02aad8c1d0b0fed4022650eb43067c4a72e6fc88da05442674fa51826e4858a47c9de233e1ba2229820af094197cd11bb416ceffb2b SHA512 ad89b3798845e23737a620bba581c2ff1ff3e15bac12555c765e201d2c0b90ecea0cdbc5b5b1a3fa9858c385e8e041f8226f5acfae5bbbe9925643fff2bf3f0b
diff --git a/dev-rust/bitflags/bitflags-1.1.0.ebuild b/dev-rust/bitflags/bitflags-1.1.0.ebuild
deleted file mode 100644
index 3febd89..0000000
--- a/dev-rust/bitflags/bitflags-1.1.0.ebuild
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="A Rust macro to generate structures which behave like a set of bitflags"
-HOMEPAGE="https://github.com/bitflags/bitflags"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
diff --git a/dev-rust/bitflags/bitflags-1.2.1.ebuild b/dev-rust/bitflags/bitflags-1.2.1.ebuild
new file mode 100644
index 0000000..ec29351
--- /dev/null
+++ b/dev-rust/bitflags/bitflags-1.2.1.ebuild
@@ -0,0 +1,14 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="A Rust macro to generate structures which behave like a set of bitflags"
+HOMEPAGE="https://github.com/bitflags/bitflags"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/byteorder/Manifest b/dev-rust/byteorder/Manifest
index 0bb4563..21d001e 100644
--- a/dev-rust/byteorder/Manifest
+++ b/dev-rust/byteorder/Manifest
@@ -1,2 +1,2 @@
 DIST byteorder-1.1.0.crate 18264 BLAKE2B 07166ea5c142b81c777f80706d7e3ae1535dbd1090b83edc47a3b0957d3c6af1f78eebe4415223c3b2ba4294aa5d177dc871ad87381df085cf254c1ade4c8da3 SHA512 610c77c91fa3c23699d28d78631b87e6d4c56ad9754dabfb640f9ac4a41a2925c1a44c34988654bdcd4b02a3474ddf374d98999f6d53bed68835360d288b9922
-DIST byteorder-1.3.1.crate 20959 BLAKE2B dcc5d3b97a0bd82272616599454673790d64d799b699b9e339feaf1d8a75b64b6f4cde19642d5359babf6c769b14325b89a51d29594f1e8ce48c2190348bd4cf SHA512 b8d8273293f776cf567dbb9357e73a65cfd352461963b2ba202959bb48338f5e14eaebb221f940c09dc0b3214924e40194f6952c32631f20a18030ad22258c25
+DIST byteorder-1.3.2.crate 21596 BLAKE2B 2ac70cff46af36e96b8b41c3adf9e09134af4d3d5b17c14233047fc3b70c829bffe6c129def84f529c1017ab2882c1bb66e86eab7b749a0d40daf2650da85d0a SHA512 2ef6b986926a4671dd945583730b0bfd4bd5e75b62a8a70c2875328157ba95f2c1b17c534d905e9b287457bd34363c1a33fd3dee9217c371032393ebbe206a8f
diff --git a/dev-rust/byteorder/byteorder-1.3.1.ebuild b/dev-rust/byteorder/byteorder-1.3.1.ebuild
deleted file mode 100644
index 5b8b129..0000000
--- a/dev-rust/byteorder/byteorder-1.3.1.ebuild
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Library for reading/writing numbers in big-endian and little-endian"
-HOMEPAGE="https://github.com/BurntSushi/byteorder"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Unlicense )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/quickcheck-0.8*:=
-	=dev-rust/rand-0.6*:=
-"
diff --git a/dev-rust/byteorder/byteorder-1.3.2.ebuild b/dev-rust/byteorder/byteorder-1.3.2.ebuild
new file mode 100644
index 0000000..03c1e4e
--- /dev/null
+++ b/dev-rust/byteorder/byteorder-1.3.2.ebuild
@@ -0,0 +1,16 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Library for reading/writing numbers in big-endian and little-endian"
+HOMEPAGE="https://github.com/BurntSushi/byteorder"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Unlicense )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/bytes/Manifest b/dev-rust/bytes/Manifest
index c4e3c27..7e9554e 100644
--- a/dev-rust/bytes/Manifest
+++ b/dev-rust/bytes/Manifest
@@ -1 +1,2 @@
 DIST bytes-0.4.11.crate 45988 BLAKE2B 617fa9bdd07bf22a6f0089e8acfc44cd1444af07174b7a02a00f21438405620cd2cafb9574d04811464316108a05c60e6066b8d87d6662a5791ecd17a7f8f8d5 SHA512 3a0354981488c354b2aaa664f320b18cfb09ed07a5f74a10f8fc120279d660dc7899306bd01b1b3405fc92eec5de3f6f8e9d6c1e5d4a2374da865d5a8a8405d3
+DIST bytes-0.5.6.crate 46291 BLAKE2B 6d33ab47d04f2e469db2add31db118f95cad53002be7969738923d62a4fe3605ccbe9fbcae6d8741310c543625e80d9adac7d9e9fed01b71cb3943ddd015d920 SHA512 a1caa1f58754f4d2e54b8df8d0ca0083ee5282f5e4d3bb5b1735022933dd2e66fb3f39c7a82216bf7a7e29591695c2e10c8b7144c83ac598e34193f2425a32cc
diff --git a/dev-rust/bytes/bytes-0.5.6.ebuild b/dev-rust/bytes/bytes-0.5.6.ebuild
new file mode 100644
index 0000000..8ffe089
--- /dev/null
+++ b/dev-rust/bytes/bytes-0.5.6.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="A utility library for working with bytes."
+HOMEPAGE="https://github.com/tokio-rs/bytes"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/serde-1.0.60:= <dev-rust/serde-2
+"
diff --git a/dev-rust/chunked_transfer/Manifest b/dev-rust/chunked_transfer/Manifest
new file mode 100644
index 0000000..dffaf51
--- /dev/null
+++ b/dev-rust/chunked_transfer/Manifest
@@ -0,0 +1 @@
+DIST chunked_transfer-1.2.0.crate 8341 BLAKE2B fbad74fdd7b541f8e46eb1de4240f981b5f138c9e9f7d739781184de1b09871de4ee1b51e364836d270a7a9ad9566730cf77bac3b43d40d40269cd9b06b37e11 SHA512 8e4d010c657f21a972ce7976c840f3f8e96150a0e138ec826e3a581b0f3c553ee5121dcbd8650c52dbe5a7ae45d904e9cb79947f39c5f35c2ca4469c93b59d5a
diff --git a/dev-rust/chunked_transfer/chunked_transfer-1.2.0.ebuild b/dev-rust/chunked_transfer/chunked_transfer-1.2.0.ebuild
new file mode 100644
index 0000000..dc3bf79
--- /dev/null
+++ b/dev-rust/chunked_transfer/chunked_transfer-1.2.0.ebuild
@@ -0,0 +1,14 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Encoder and decoder for HTTP chunked transfer coding (RFC 7230 § 4.1)"
+HOMEPAGE="https://docs.rs/crate/chunked_transfer/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="Apache-2.0"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r4.ebuild b/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r4.ebuild
deleted file mode 100644
index 32a195e..0000000
--- a/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r4.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="54f358abf659dc723d1fbc86a4002ded49a6f513"
-CROS_WORKON_TREE="ccf15d2c45fbf16c6e2d9db5bd0f750f71006f4d"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="cros-fuzz"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Support crate for running rust fuzzers on Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-fuzz"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer test"
-
-DEPEND="
-	=dev-rust/rand_core-0.4*:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/cros-fuzz"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r5.ebuild b/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r5.ebuild
new file mode 100644
index 0000000..8bda8fc
--- /dev/null
+++ b/dev-rust/cros_fuzz/cros_fuzz-0.1.0-r5.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="87eb95e94faeafcfe180ac27a5b6d641d38eece9"
+CROS_WORKON_TREE="90bf2838f56bffe127636b5ea4988485595819a8"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="cros-fuzz"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Support crate for running rust fuzzers on Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-fuzz"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer test"
+
+DEPEND="
+	=dev-rust/rand_core-0.4*:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cros-fuzz"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/data_model/data_model-0.1.0-r20.ebuild b/dev-rust/data_model/data_model-0.1.0-r20.ebuild
deleted file mode 100644
index 19418d1..0000000
--- a/dev-rust/data_model/data_model-0.1.0-r20.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="e7d1221c9d5a4e23b6142ef466892ccf38cfde9c"
-CROS_WORKON_TREE="6f435cc1c7d64531e0f424df5719a6c4e4932776"
-CROS_WORKON_LOCALNAME="../platform/crosvm"
-CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="data_model"
-CROS_WORKON_SUBDIRS_TO_COPY="data_model"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Crates includes traits and types for safe interaction with raw memory."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/data_model"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	dev-rust/assertions:=
-"
-
-RDEPEND="!!<=dev-rust/data_model-0.1.0-r13"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/data_model"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/data_model/data_model-0.1.0-r24.ebuild b/dev-rust/data_model/data_model-0.1.0-r24.ebuild
new file mode 100644
index 0000000..9681938
--- /dev/null
+++ b/dev-rust/data_model/data_model-0.1.0-r24.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="b0e9842602b22484e7b12974110d23c46e49e18d"
+CROS_WORKON_TREE="380b89d0a92abee58f780fe1e707430317fed32b"
+CROS_WORKON_LOCALNAME="../platform/crosvm"
+CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="data_model"
+CROS_WORKON_SUBDIRS_TO_COPY="data_model"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Crates includes traits and types for safe interaction with raw memory."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/data_model"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	dev-rust/assertions:=
+"
+
+RDEPEND="!!<=dev-rust/data_model-0.1.0-r13"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/data_model"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/dbus-codegen/Manifest b/dev-rust/dbus-codegen/Manifest
index d905d89..72e6c9a 100644
--- a/dev-rust/dbus-codegen/Manifest
+++ b/dev-rust/dbus-codegen/Manifest
@@ -1 +1,2 @@
 DIST dbus-codegen-0.3.0.crate 21769 BLAKE2B c5724be55ae744fb71324268853b164bd707af41f562edfaf380c7e865b9e86c36d06a03ecb6c26f14691ea2990238a9abc4a52f583a0f559b0a326d92f9ce43 SHA512 f580cc9e2985e82db894a56d928f5bb9681899720799fe9a84ebffbbfacb1172df63853545d7dbca5ce3039a854dbf396f9b644c64e2f6c300e047781c66a5e3
+DIST dbus-codegen-0.5.0.crate 21586 BLAKE2B 5a1f275a836dbc610d2c238e42efc9e318163a47faa41709c396ce8975cdb75a6a5ecc1ce247b2d3600838c5d603a989d5e1d3ec3079bc9687ff64f406b020c8 SHA512 464315853cfdd642eaffe408ea4e0a575f22afff9c1109a04b16f6228d5b1573b2b268dca81905245bf3925d5a91fd4272dea51f870a548bb62666889cad87aa
diff --git a/dev-rust/dbus-codegen/dbus-codegen-0.3.0-r1.ebuild b/dev-rust/dbus-codegen/dbus-codegen-0.3.0-r1.ebuild
new file mode 120000
index 0000000..b272a1a
--- /dev/null
+++ b/dev-rust/dbus-codegen/dbus-codegen-0.3.0-r1.ebuild
@@ -0,0 +1 @@
+dbus-codegen-0.3.0.ebuild
\ No newline at end of file
diff --git a/dev-rust/dbus-codegen/dbus-codegen-0.3.0.ebuild b/dev-rust/dbus-codegen/dbus-codegen-0.3.0.ebuild
index b1b1163..18688c5 100644
--- a/dev-rust/dbus-codegen/dbus-codegen-0.3.0.ebuild
+++ b/dev-rust/dbus-codegen/dbus-codegen-0.3.0.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2019 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI="6"
+EAPI="7"
 
 CROS_RUST_REMOVE_DEV_DEPS=1
 
@@ -12,7 +12,7 @@
 SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
 
 LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
+SLOT="0/${PVR}"
 KEYWORDS="*"
 
 # ansi_term-0.11.0-r0, strsim-0.8.0-r0, and vec_map-0.8.1-r0 were empty crates
@@ -26,6 +26,10 @@
 	>=dev-rust/xml-rs-0.3.0:= <dev-rust/xml-rs-0.4.0
 "
 
+RDEPEND="
+	!<dev-rust/dbus-codegen-0.3.0-r1
+"
+
 src_compile() {
 	ecargo_build
 }
diff --git a/dev-rust/dbus-codegen/dbus-codegen-0.5.0.ebuild b/dev-rust/dbus-codegen/dbus-codegen-0.5.0.ebuild
new file mode 100644
index 0000000..0343b10
--- /dev/null
+++ b/dev-rust/dbus-codegen/dbus-codegen-0.5.0.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Binary crate to generate Rust code from XML introspection data."
+HOMEPAGE="https://github.com/diwic/dbus-rs"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/clap-2.20.0:= <dev-rust/clap-3.0.0
+	>=dev-rust/dbus-0.8.0:= <dev-rust/dbus-0.9.0
+	>=dev-rust/xml-rs-0.3.0:= <dev-rust/xml-rs-0.4.0
+"
+
+# Block previous versions because 0.3.0-r0 had the incorrect slot.
+RDEPEND="
+	!<dev-rust/dbus-codegen-0.5.0
+"
+
+src_compile() {
+	ecargo_build
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)/dbus-codegen-rust"
+}
diff --git a/dev-rust/dbus/Manifest b/dev-rust/dbus/Manifest
index 9f045cb..e59ca70 100644
--- a/dev-rust/dbus/Manifest
+++ b/dev-rust/dbus/Manifest
@@ -1 +1,2 @@
 DIST dbus-0.6.1.crate 76381 BLAKE2B d17ceb16b8390dfee0df6e25adf47a749e141a4669e5a31497a5079ddb2bb15a3c75ec4bb7ecbe3bc3e44ade94493855780fdde59d367a09d26fa6c2aff06254 SHA512 0e7ceeb5578d64e7b0e57ae67667d848d185815110cd80c642a887e6b390db376e3a9b672e4b7a2b7e81d50e2883ab0370cf6d3730dabb38629a124782d601ed
+DIST dbus-0.8.4.crate 114517 BLAKE2B cc26708c7b7a76ee79c314de105ab2428500fbb531ac45b1b2c4fed62e4336c51e28505d3b084e4d8a96cd2cb30e2de9954bf79fd3c31e276cbaa360534489f2 SHA512 1e95fe75d5474ce745917eaa95d015d7706af4b37e010d265be265cc392bd3e0e8eaf03a4b9edefab575051a9af1eeb33d8e96d2c63c6f16c71ad9f6b6f7be8c
diff --git a/dev-rust/dbus/dbus-0.6.1.ebuild b/dev-rust/dbus/dbus-0.6.1.ebuild
index 5ed26f2..2e828cb 100644
--- a/dev-rust/dbus/dbus-0.6.1.ebuild
+++ b/dev-rust/dbus/dbus-0.6.1.ebuild
@@ -14,6 +14,6 @@
 KEYWORDS="*"
 
 DEPEND=">=dev-rust/libc-0.2.7:=
-	>=dev-rust/libdbus-sys-0.1.2:=
+	>=dev-rust/libdbus-sys-0.1.2:= <dev-rust/libdbus-sys-0.2
 	>=dev-rust/tempdir-0.3.0:=
 "
diff --git a/dev-rust/dbus/dbus-0.8.4-r1.ebuild b/dev-rust/dbus/dbus-0.8.4-r1.ebuild
new file mode 120000
index 0000000..d190d56
--- /dev/null
+++ b/dev-rust/dbus/dbus-0.8.4-r1.ebuild
@@ -0,0 +1 @@
+./dbus-0.8.4.ebuild
\ No newline at end of file
diff --git a/dev-rust/dbus/dbus-0.8.4.ebuild b/dev-rust/dbus/dbus-0.8.4.ebuild
new file mode 100644
index 0000000..00ffcff
--- /dev/null
+++ b/dev-rust/dbus/dbus-0.8.4.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Rust bindings to D-Bus."
+HOMEPAGE="https://github.com/diwic/dbus-rs"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND=">=dev-rust/libc-0.2.66:= <dev-rust/libc-0.3
+	=dev-rust/libdbus-sys-0.2*:=
+	=dev-rust/futures-0.3.1:=
+"
diff --git a/dev-rust/derivative/Manifest b/dev-rust/derivative/Manifest
new file mode 100644
index 0000000..48b2623
--- /dev/null
+++ b/dev-rust/derivative/Manifest
@@ -0,0 +1 @@
+DIST derivative-2.1.1.crate 45571 BLAKE2B 7da3a10e734522cc5df0d40a5da54d5de3c799b28e016442ac88038a18a8b3c8dc30c33077510a4fc3155be9b114a9314e9e5fc2c2eb7c3b35e3380570c41de9 SHA512 a9d2edbba6cdca7980445d8b00180cdbb377830acbf3be371ee9ceb5d8f3a937a02f346dd2a3a49bcd3b65d89ec1c71f78f4d125afe020f82789cafe4120f5b0
diff --git a/dev-rust/derivative/derivative-2.1.1.ebuild b/dev-rust/derivative/derivative-2.1.1.ebuild
new file mode 100644
index 0000000..be550bd
--- /dev/null
+++ b/dev-rust/derivative/derivative-2.1.1.ebuild
@@ -0,0 +1,28 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="A set of alternative 'derive' attributes for Rust."
+HOMEPAGE="https://github.com/mcarton/rust-derivative"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	>=dev-rust/syn-1.0.3:= <dev-rust/syn-2
+"
+src_unpack() {
+	cros-rust_src_unpack
+
+	# This consists of a recipe "publish_doc" which is unnecessary and requires node js.
+	mv "${S}"/Makefile "${S}"/ignore-docs-Makefile
+}
diff --git a/dev-rust/dtoa/Manifest b/dev-rust/dtoa/Manifest
new file mode 100644
index 0000000..f9abb7c
--- /dev/null
+++ b/dev-rust/dtoa/Manifest
@@ -0,0 +1 @@
+DIST dtoa-0.4.5.crate 14840 BLAKE2B d6e46d8d53baf565931d0796cdebd030a0f6fae8c6b88f738b7dd00db35bdb130a2b3778192e90fcf06183e706db7c30cc3e2b05909dabc04472e3f6ca9fca7a SHA512 7f9cd7d2e8f143c81896f8a242b09de3384d9dd6c375659a48b4e4f0506b2eb642c8aba6d500a989668760458861f2249bd82f5f3d6fa22d0ffb68e508d059c0
diff --git a/dev-rust/dtoa/dtoa-0.4.5.ebuild b/dev-rust/dtoa/dtoa-0.4.5.ebuild
new file mode 100644
index 0000000..9e24d53
--- /dev/null
+++ b/dev-rust/dtoa/dtoa-0.4.5.ebuild
@@ -0,0 +1,16 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Fast functions for printing floating-point primitives to an io::Write"
+HOMEPAGE="https://github.com/dtolnay/dtoa"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
diff --git a/dev-rust/enumn/enumn-0.1.0-r8.ebuild b/dev-rust/enumn/enumn-0.1.0-r8.ebuild
deleted file mode 100644
index dd710ec..0000000
--- a/dev-rust/enumn/enumn-0.1.0-r8.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="672559f91ae54664fc1f76326c0ecc4008da4c09"
-CROS_WORKON_TREE="25ba5cffdbb3a78a7956b5109fcef6206ca298e9"
-CROS_WORKON_LOCALNAME="../platform/crosvm"
-CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since project's Cargo.toml is
-# using "provided by ebuild" macro which supported by cros-rust.
-CROS_WORKON_SUBTREE="enumn"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Convert number to enum"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/enumn"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	=dev-rust/proc-macro2-1*:=
-	=dev-rust/quote-1*:=
-	=dev-rust/syn-1*:=
-"
-
-RDEPEND="!!<=dev-rust/enumn-0.0.1-r4"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/enumn"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/enumn/enumn-0.1.0-r9.ebuild b/dev-rust/enumn/enumn-0.1.0-r9.ebuild
new file mode 100644
index 0000000..64fb62a
--- /dev/null
+++ b/dev-rust/enumn/enumn-0.1.0-r9.ebuild
@@ -0,0 +1,52 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="36b2a0df713d82f1bf178941147c6fb76e2b4cc8"
+CROS_WORKON_TREE="c5170d4e4312bcef4a4e4e49403be6bc421c18aa"
+CROS_WORKON_LOCALNAME="../platform/crosvm"
+CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since project's Cargo.toml is
+# using "provided by ebuild" macro which supported by cros-rust.
+CROS_WORKON_SUBTREE="enumn"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Convert number to enum"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/enumn"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+"
+
+RDEPEND="!!<=dev-rust/enumn-0.0.1-r4"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/enumn"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/flexbuffers/Manifest b/dev-rust/flexbuffers/Manifest
new file mode 100644
index 0000000..d60a47fc
--- /dev/null
+++ b/dev-rust/flexbuffers/Manifest
@@ -0,0 +1 @@
+DIST flexbuffers-0.1.1.crate 24544 BLAKE2B 7d30e1354ff328d661bb8e766c3a308b58a5dea12742de4ca85ee59dfc68ae445b05f80e0de1c481429431f80dfdd74b3a6d19ee599a71b51314d8e1f3af0c6c SHA512 a92931e680d362089a1e47fd2c38756e41d916aede4790bda75c24fc0ce298fcd95f66dc01da53a5b280995df1f373a26a1fc207b31ae08ad7d643c47ff68f73
diff --git a/dev-rust/flexbuffers/flexbuffers-0.1.1.ebuild b/dev-rust/flexbuffers/flexbuffers-0.1.1.ebuild
new file mode 100644
index 0000000..9f6b37d
--- /dev/null
+++ b/dev-rust/flexbuffers/flexbuffers-0.1.1.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Official FlexBuffers Rust runtime library."
+HOMEPAGE="https://google.github.io/flatbuffers/flexbuffers"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="Apache-2.0"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/bitflags-1.2.1:= <dev-rust/bitflags-2
+	>=dev-rust/byteorder-1.3.2:= <dev-rust/byteorder-2
+	=dev-rust/num_enum-0.5*:=
+	>=dev-rust/serde-1.0.114:= <dev-rust/serde-2
+	=dev-rust/serde_derive-1*:=
+"
diff --git a/dev-rust/intrusive-collections/Manifest b/dev-rust/intrusive-collections/Manifest
new file mode 100644
index 0000000..6c269ca
--- /dev/null
+++ b/dev-rust/intrusive-collections/Manifest
@@ -0,0 +1 @@
+DIST intrusive-collections-0.9.0.crate 50599 BLAKE2B 9fc9acfb59038f44a9d98f2874fbf28ab006ec65c47097efb0998906d76f2bb23d4ed9be88d2dfbc4f4a6a6111289825134dd8fa978372b3395f0568d71b4590 SHA512 f276bb8167a44a5d72b6c79e4f95ec8168c0ee2f5efac197a439cc4d7e9aef7cc4dfa78cc4ae7d12a75d979a052195f36b685cb8dc1de3753cf1beef0bdf3b90
diff --git a/dev-rust/intrusive-collections/intrusive-collections-0.9.0.ebuild b/dev-rust/intrusive-collections/intrusive-collections-0.9.0.ebuild
new file mode 100644
index 0000000..0670ab8
--- /dev/null
+++ b/dev-rust/intrusive-collections/intrusive-collections-0.9.0.ebuild
@@ -0,0 +1,17 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+inherit cros-rust
+
+DESCRIPTION="A Rust library for creating intrusive collections"
+HOMEPAGE="https://github.com/Amanieu/intrusive-rs"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND=">=dev-rust/memoffset-0.5.4:= <dev-rust/memoffset-0.6"
diff --git a/dev-rust/libc/Manifest b/dev-rust/libc/Manifest
index be77322..3f5bf24 100644
--- a/dev-rust/libc/Manifest
+++ b/dev-rust/libc/Manifest
@@ -1 +1,2 @@
 DIST libc-0.2.65.crate 439610 BLAKE2B a6390172ac5a76bb13860ffe0793a40fd6a74c7947c164ab1a033401473caaf77cc85bd578a37411d5f40bdeb13358a4810ac358a76799b24f7b797b2bde9915 SHA512 a5df4f7efae9dfdedeb140e3fec545135c7533f665f4eec61f071d01f40a2079e104c6a837c2b385aac4b306e4ddde34aa857fabb4a7ea7d7780159bc0b83c40
+DIST libc-0.2.74.crate 503397 BLAKE2B b38c932a29de204e9cdbae39fcdbd1a054256e8c0f37227ba71bffbc133d80bb68d34f4011fc83db7300254c381fe0855e1df19db2dd75234a5ee029f1ea9e63 SHA512 6aa984cd325bfa37736d3afe4518093468927607daf7b12bd8a5a396d2ec3740876504ab4a2a622c5e7caa9872f31263a42ce53f10c15f61f9e45891eaf41df1
diff --git a/dev-rust/libc/libc-0.2.74.ebuild b/dev-rust/libc/libc-0.2.74.ebuild
new file mode 100644
index 0000000..2490e1f
--- /dev/null
+++ b/dev-rust/libc/libc-0.2.74.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+inherit cros-rust
+
+DESCRIPTION="A Rust library with native bindings to the types and functions commonly found on various systems, including libc"
+HOMEPAGE="https://github.com/rust-lang/libc"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/rustc-std-workspace-core-1.0.0:=
+"
diff --git a/dev-rust/libchromeos/libchromeos-0.1.0-r17.ebuild b/dev-rust/libchromeos/libchromeos-0.1.0-r17.ebuild
new file mode 100644
index 0000000..1cabf16
--- /dev/null
+++ b/dev-rust/libchromeos/libchromeos-0.1.0-r17.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="8739fdb7d25a53496536f328d2675824c7199e17"
+CROS_WORKON_TREE="6461ccb9a2a7e3a63e9995628c577ad539e266e4"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_SUBTREE="libchromeos-rs"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="A Rust utility library for Chrome OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-rs/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="chromeos-base/system_api:=
+	sys-apps/dbus:=
+	=dev-rust/futures-0.3*:=
+	=dev-rust/getopts-0.2*:=
+	=dev-rust/intrusive-collections-0.9*:=
+	=dev-rust/libc-0.2*:=
+	=dev-rust/log-0.4*:=
+	>=dev-rust/protobuf-2.1:=
+	!>=dev-rust/protobuf-3.0:=
+"
+
+RDEPEND="!!<=dev-rust/libchromeos-0.1.0-r2"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/libchromeos-rs"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/libchromeos/libchromeos-0.1.0-r5.ebuild b/dev-rust/libchromeos/libchromeos-0.1.0-r5.ebuild
deleted file mode 100644
index d2ee9ce..0000000
--- a/dev-rust/libchromeos/libchromeos-0.1.0-r5.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="26ec26c4ac3ba35bf59fa5acbbd26c59a3381adc"
-CROS_WORKON_TREE="0eda50c11ced2c3a523eb3371116b892d469fa9a"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="libchromeos-rs"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="A Rust utility library for Chrome OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-rs/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="chromeos-base/system_api:=
-	sys-apps/dbus:=
-	=dev-rust/dbus-0.6*:=
-	=dev-rust/libc-0.2*:=
-	=dev-rust/log-0.4*:=
-	>=dev-rust/protobuf-2.1:=
-	!>=dev-rust/protobuf-3.0:=
-"
-
-RDEPEND="!!<=dev-rust/libchromeos-0.1.0-r2"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/libchromeos-rs"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/libchromeos/libchromeos-9999.ebuild b/dev-rust/libchromeos/libchromeos-9999.ebuild
index b258656..ceeef08 100644
--- a/dev-rust/libchromeos/libchromeos-9999.ebuild
+++ b/dev-rust/libchromeos/libchromeos-9999.ebuild
@@ -5,7 +5,6 @@
 
 CROS_WORKON_LOCALNAME="../platform2"
 CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
 CROS_WORKON_SUBTREE="libchromeos-rs"
 
 inherit cros-workon cros-rust
@@ -19,7 +18,9 @@
 
 DEPEND="chromeos-base/system_api:=
 	sys-apps/dbus:=
-	=dev-rust/dbus-0.6*:=
+	=dev-rust/futures-0.3*:=
+	=dev-rust/getopts-0.2*:=
+	=dev-rust/intrusive-collections-0.9*:=
 	=dev-rust/libc-0.2*:=
 	=dev-rust/log-0.4*:=
 	>=dev-rust/protobuf-2.1:=
diff --git a/dev-rust/libdbus-sys/Manifest b/dev-rust/libdbus-sys/Manifest
index 68f13b8..24e9a62 100644
--- a/dev-rust/libdbus-sys/Manifest
+++ b/dev-rust/libdbus-sys/Manifest
@@ -1 +1,2 @@
 DIST libdbus-sys-0.1.3.crate 8136 BLAKE2B 1b49f66911beb4ea84a0238fee50476be77a650af94b1578f26743e20ca7eee0549480d08249e674c00c6b41d0e285e3ecc5fad6afe0f05d875d97f0a9bdd589 SHA512 56ea653d5e6d733236928c7afea8488a8aa701a9665e89aaca7a304237f9b2aec928a202536e62d879f6eec1b799a18f30ceff2d26c5f8c6aebb321b8a241d9a
+DIST libdbus-sys-0.2.1.crate 10196 BLAKE2B cc98abbb0bcb8453ef7c9d97ed9dbf1209183afb014f35adf18635705b014aa7d1ffdd5018c3248fa8c318ab2c1f51dc76b7478a130f7c2d31f1dafded9212a9 SHA512 03dddcaeb9cf1c5ff008a34d73d5d74b672449eeb6814f7aa9ec8c7f06c218f9975cb7a6d3f427cd01ee44c556fc80315cd58b486006e4fc8d06a5a8e81f5956
diff --git a/dev-rust/libdbus-sys/libdbus-sys-0.2.1.ebuild b/dev-rust/libdbus-sys/libdbus-sys-0.2.1.ebuild
new file mode 100644
index 0000000..e951ee7
--- /dev/null
+++ b/dev-rust/libdbus-sys/libdbus-sys-0.2.1.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Rust FFI bindings to libdbus."
+HOMEPAGE="https://github.com/diwic/dbus-rs"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="=dev-rust/pkg-config-0.3*:=
+	sys-apps/dbus:=
+"
diff --git a/dev-rust/libusb1-sys/Manifest b/dev-rust/libusb1-sys/Manifest
new file mode 100644
index 0000000..4639033
--- /dev/null
+++ b/dev-rust/libusb1-sys/Manifest
@@ -0,0 +1 @@
+DIST libusb1-sys-0.3.7.crate 398668 BLAKE2B dc9e013ffc99a581d9bef2e1d750fe35270a19150688f8d6b26c5069c23f6d46b26242a782aeadf2434e1fa9caf5bf7240d79caab5e0070362d3e76c5172e839 SHA512 1e16efc9d4f7c43a5446af30a16fc3916dbe388ea4ebced9e6fc3bf65ba78ce5edee65963ed740e4e3344bb74937eaef6df821896f537be0a08cb35eca8e91ac
diff --git a/dev-rust/libusb1-sys/files/libusb1-sys-0.3.7-0001-remove-build-dependencies.patch b/dev-rust/libusb1-sys/files/libusb1-sys-0.3.7-0001-remove-build-dependencies.patch
new file mode 100644
index 0000000..b1defbe
--- /dev/null
+++ b/dev-rust/libusb1-sys/files/libusb1-sys-0.3.7-0001-remove-build-dependencies.patch
@@ -0,0 +1,192 @@
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -26,21 +26,11 @@
+ repository = "https://github.com/a1ien/libusb1-sys.git"
+ [dependencies.libc]
+ version = "0.2"
+-[build-dependencies.cc]
+-version = "1.0"
+-
+-[build-dependencies.libflate]
+-version = "0.1"
+ 
+ [build-dependencies.pkg-config]
+ version = "0.3"
+ 
+-[build-dependencies.tar]
+-version = "0.4"
+-
+ [features]
+ vendored = []
+-[target."cfg(target_env = \"msvc\")".build-dependencies.vcpkg]
+-version = "0.2"
+ [badges.travis-ci]
+ repository = "a1ien/libusb1-sys"
+
+--- a/build.rs
++++ b/build.rs
+@@ -1,7 +1,6 @@
+ use std::env;
+ use std::io::Read;
+ use std::path::{Path, PathBuf};
+-use tar::Archive;
+ 
+ static VERSION: &'static str = "1.0.22";
+ 
+@@ -59,155 +58,10 @@
+     }
+ }
+ 
+-fn unpack<R: Read>(data: R, dst: &Path) -> std::io::Result<()> {
+-    let mut archive = Archive::new(data);
+-    let skip: PathBuf = "README".into();
+-    for entry in archive.entries()? {
+-        let mut entry = entry?;
+-        if entry.path()?.file_name().unwrap() == skip {
+-            continue;
+-        }
+-        entry.unpack_in(dst)?;
+-    }
+-    Ok(())
+-}
+-
+-fn extract_source() -> PathBuf {
+-    use libflate::gzip::Decoder;
+-    use std::{fs, io::Cursor};
+-
+-    let basename = format!("libusb-{}", VERSION);
+-    let filename = format!("libusb/{}.tar.gz", basename);
+-
+-    let mut source_dir = PathBuf::from(env::var("OUT_DIR").unwrap()).join("source");
+-    let data = Cursor::new(fs::read(&filename).unwrap());
+-    let gz_decoder = Decoder::new(data).unwrap();
+-    unpack(gz_decoder, &source_dir).unwrap();
+-    source_dir.push(basename);
+-    source_dir
+-}
+-
+-fn make_source() {
+-    let libusb_source = extract_source();
+-
+-    // Provide metadata and include directory for dependencies
+-    println!("cargo:vendored=1");
+-    println!("cargo:static=1");
+-    let include_dir = PathBuf::from(env::var("OUT_DIR").unwrap()).join("include");
+-    let _ = std::fs::create_dir(&include_dir);
+-    std::fs::copy(
+-        libusb_source.join("libusb/libusb.h"),
+-        include_dir.join("libusb.h"),
+-    )
+-    .unwrap();
+-    println!("cargo:include={}", include_dir.to_str().unwrap());
+-
+-    std::fs::File::create(format!("{}/{}", libusb_source.display(), "config.h")).unwrap();
+-    let mut base_config = cc::Build::new();
+-    base_config.include(&libusb_source);
+-    base_config.include(libusb_source.join("libusb"));
+-
+-    // When building libusb from source, allow use of its logging facilities to aid debugging.
+-    // FIXME: This does not link correctly under MinGW due to a rustc bug, so only do it on MSVC
+-    // Ref: https://github.com/rust-lang/rust/issues/47048
+-    if cfg!(target_env = "msvc") {
+-        base_config.define("ENABLE_LOGGING", Some("1"));
+-    }
+-
+-    if cfg!(target_os = "macos") {
+-        base_config.define("OS_DARWIN", Some("1"));
+-        base_config.file(libusb_source.join("libusb/os/darwin_usb.c"));
+-        link_framework("CoreFoundation");
+-        link_framework("IOKit");
+-        link("objc", false);
+-    }
+-    if cfg!(target_os = "linux") {
+-        base_config.define("OS_LINUX", Some("1"));
+-        base_config.define("HAVE_ASM_TYPES_H", Some("1"));
+-        base_config.define("HAVE_LINUX_NETLINK_H", Some("1"));
+-        base_config.define("HAVE_SYS_SOCKET_H", Some("1"));
+-        base_config.define("USBI_TIMERFD_AVAILABLE", Some("1"));
+-        base_config.file(libusb_source.join("libusb/os/linux_netlink.c"));
+-        base_config.file(libusb_source.join("libusb/os/linux_usbfs.c"));
+-        base_config.define("POLL_NFDS_TYPE", Some("nfds_t"));
+-        base_config.define("_GNU_SOURCE", Some("1"));
+-    }
+-
+-    if cfg!(unix) {
+-        base_config.define("HAVE_DLFCN_H", Some("1"));
+-        base_config.define("HAVE_GETTIMEOFDAY", Some("1"));
+-        base_config.define("HAVE_INTTYPES_H", Some("1"));
+-        base_config.define("HAVE_MEMORY_H", Some("1"));
+-        base_config.define("HAVE_POLL_H", Some("1"));
+-        base_config.define("HAVE_STDINT_H", Some("1"));
+-        base_config.define("HAVE_STDLIB_H", Some("1"));
+-        base_config.define("HAVE_STRINGS_H", Some("1"));
+-        base_config.define("HAVE_STRING_H", Some("1"));
+-        base_config.define("HAVE_STRUCT_TIMESPEC", Some("1"));
+-        base_config.define("HAVE_SYS_STAT_H", Some("1"));
+-        base_config.define("HAVE_SYS_TIME_H", Some("1"));
+-        base_config.define("HAVE_SYS_TYPES_H", Some("1"));
+-        base_config.define("HAVE_UNISTD_H", Some("1"));
+-        base_config.define("POLL_NFDS_TYPE", Some("nfds_t"));
+-        base_config.define("STDC_HEADERS", Some("1"));
+-        base_config.define("THREADS_POSIX", Some("1"));
+-        base_config.define(
+-            "DEFAULT_VISIBILITY",
+-            Some("__attribute__((visibility(\"default\")))"),
+-        );
+-
+-        match pkg_config::probe_library("libudev") {
+-            Ok(_lib) => {
+-                base_config.define("USE_UDEV", Some("1"));
+-                base_config.define("HAVE_LIBUDEV", Some("1"));
+-                base_config.define("HAVE_LIBUDEV_H", Some("1"));
+-                base_config.file(libusb_source.join("libusb/os/linux_udev.c"));
+-            }
+-            _ => {}
+-        };
+-
+-        base_config.file(libusb_source.join("libusb/os/poll_posix.c"));
+-        base_config.file(libusb_source.join("libusb/os/threads_posix.c"));
+-    }
+-
+-    if cfg!(windows) {
+-        #[cfg(target_env = "msvc")]
+-        base_config.define("_TIMESPEC_DEFINED", Some("1"));
+-        #[cfg(target_env = "msvc")]
+-        base_config.flag("/source-charset:utf-8");
+-
+-        base_config.warnings(false);
+-        base_config.define("OS_WINDOWS", Some("1"));
+-        base_config.file(libusb_source.join("libusb/os/poll_windows.c"));
+-        base_config.file(libusb_source.join("libusb/os/threads_windows.c"));
+-        base_config.file(libusb_source.join("libusb/os/windows_nt_common.c"));
+-        base_config.file(libusb_source.join("libusb/os/windows_usbdk.c"));
+-        base_config.file(libusb_source.join("libusb/os/windows_winusb.c"));
+-
+-        base_config.define("DEFAULT_VISIBILITY", Some(""));
+-        base_config.define("POLL_NFDS_TYPE", Some("unsigned int"));
+-        base_config.define("HAVE_SIGNAL_H", Some("1"));
+-        base_config.define("HAVE_SYS_TYPES_H", Some("1"));
+-        link("user32", false);
+-    }
+-
+-    base_config.file(libusb_source.join("libusb/core.c"));
+-    base_config.file(libusb_source.join("libusb/descriptor.c"));
+-    base_config.file(libusb_source.join("libusb/hotplug.c"));
+-    base_config.file(libusb_source.join("libusb/io.c"));
+-    base_config.file(libusb_source.join("libusb/strerror.c"));
+-    base_config.file(libusb_source.join("libusb/sync.c"));
+-
+-    base_config.compile("libusb.a");
+-}
+-
+ fn main() {
+     let statik = std::env::var("CARGO_CFG_TARGET_FEATURE")
+         .map(|s| s.contains("crt-static"))
+         .unwrap_or_default();
+ 
+-    if cfg!(feature = "vendored") || !find_libusb_pkg(statik) {
+-        extract_source();
+-        make_source();
+-    }
++    find_libusb_pkg(statik);
+ }
diff --git a/dev-rust/libusb1-sys/libusb1-sys-0.3.7-r1.ebuild b/dev-rust/libusb1-sys/libusb1-sys-0.3.7-r1.ebuild
new file mode 120000
index 0000000..4b66e3c
--- /dev/null
+++ b/dev-rust/libusb1-sys/libusb1-sys-0.3.7-r1.ebuild
@@ -0,0 +1 @@
+libusb1-sys-0.3.7.ebuild
\ No newline at end of file
diff --git a/dev-rust/libusb1-sys/libusb1-sys-0.3.7.ebuild b/dev-rust/libusb1-sys/libusb1-sys-0.3.7.ebuild
new file mode 100644
index 0000000..715c2c5
--- /dev/null
+++ b/dev-rust/libusb1-sys/libusb1-sys-0.3.7.ebuild
@@ -0,0 +1,24 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="FFI bindings for libusb"
+HOMEPAGE="https://docs.rs/crate/libusb1-sys/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+PATCHES=(
+	"${FILESDIR}/${P}-0001-remove-build-dependencies.patch"
+)
+
+DEPEND="
+	=dev-rust/pkg-config-0.3*:=
+"
diff --git a/dev-rust/libvda/libvda-0.1.0-r16.ebuild b/dev-rust/libvda/libvda-0.1.0-r16.ebuild
deleted file mode 100644
index 550641d..0000000
--- a/dev-rust/libvda/libvda-0.1.0-r16.ebuild
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="ad3d5b827c93cdd7e4decafd06a2e40fdf57e183"
-CROS_WORKON_TREE="551aaa53c982c20b42858549cdf3c5fab2cdd40b"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since project's Cargo.toml is
-# using "provided by ebuild" macro which supported by cros-rust.
-CROS_WORKON_SUBTREE="arc/vm/libvda/rust"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Rust wrapper for chromeos-base/libvda"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda/rust"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-RDEPEND="
-	chromeos-base/libvda:=
-	!!<=dev-rust/libvda-0.0.1-r5
-"
-
-DEPEND="
-	${RDEPEND}
-	dev-rust/pkg-config:=
-	dev-rust/enumn:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/arc/vm/libvda/rust"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		# TODO(alexlau, keiichiw): Remove LD_LIBRARY_PATH once we can run the
-		# test in a chroot for the build sysroot.
-		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/libvda/libvda-0.1.0-r20.ebuild b/dev-rust/libvda/libvda-0.1.0-r20.ebuild
new file mode 100644
index 0000000..99a1ddf
--- /dev/null
+++ b/dev-rust/libvda/libvda-0.1.0-r20.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="3a4f259095121a07903ce717e9b73967b45eb72b"
+CROS_WORKON_TREE="cb4a35c0e59b01ac8b0aca5afb3a04e833d57fd3"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since project's Cargo.toml is
+# using "provided by ebuild" macro which supported by cros-rust.
+CROS_WORKON_SUBTREE="arc/vm/libvda/rust"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust wrapper for chromeos-base/libvda"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda/rust"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+RDEPEND="
+	chromeos-base/libvda:=
+	!!<=dev-rust/libvda-0.0.1-r5
+"
+
+DEPEND="
+	${RDEPEND}
+	dev-rust/pkg-config:=
+	dev-rust/enumn:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/arc/vm/libvda/rust"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		# TODO(alexlau, keiichiw): Remove LD_LIBRARY_PATH once we can run the
+		# test in a chroot for the build sysroot.
+		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/memoffset/Manifest b/dev-rust/memoffset/Manifest
index 6de8c67..c1a26f5 100644
--- a/dev-rust/memoffset/Manifest
+++ b/dev-rust/memoffset/Manifest
@@ -1 +1,2 @@
 DIST memoffset-0.2.1.crate 4618 BLAKE2B f04c4e5e1747d5516dff26fb045d91f01a2eea6011974a342c1830ad2aa6b203d5c6cd4db464177797f799197656085f980c00e78d0257efe5d3377188a8b8ee SHA512 4901eca49eb20acc53d1120548925d691d5e0a0ee899f5c26f55f8b997549cea3b819b1f9b4f5495f4bc73fbcaa386cda50cefdc0036c097c4eeca8086568530
+DIST memoffset-0.5.5.crate 7318 BLAKE2B a13407077396b802a46c2875f25a19dfead7656e7a986542b489fa18fb4293d3681df23ebd17139a79ea4e0448f77658408d50f499a48846920c0769e22a8237 SHA512 3804bf0c8c29ce91d67b7a502ba17ba096b4c487df49eeb7ec11950ecd950b35c78b9ec30aeaacf38f79ed0ea9ee601c6d65e712f704753c7c06ff1382456965
diff --git a/dev-rust/memoffset/memoffset-0.5.5.ebuild b/dev-rust/memoffset/memoffset-0.5.5.ebuild
new file mode 100644
index 0000000..6a61fc1
--- /dev/null
+++ b/dev-rust/memoffset/memoffset-0.5.5.ebuild
@@ -0,0 +1,17 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+inherit cros-rust
+
+DESCRIPTION="C-Like offset_of functionality for Rust structs"
+HOMEPAGE="https://github.com/Gilnaa/memoffset"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="=dev-rust/autocfg-1*:="
diff --git a/dev-rust/minijail/minijail-0.1.0-r3.ebuild b/dev-rust/minijail/minijail-0.1.0-r3.ebuild
deleted file mode 100644
index ea38b0b..0000000
--- a/dev-rust/minijail/minijail-0.1.0-r3.ebuild
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# This lives separately from the main minijail ebuild since we don't have Rust
-# available in the SDK builder.
-# TODO: Consider moving back into main ebuild once crbug.com/1046088 is
-# resolved.
-
-EAPI=7
-
-inherit cros-constants
-
-CROS_WORKON_COMMIT="69e3fc6e858dfcac83c0d8ed43bcf62dae871319"
-CROS_WORKON_TREE="610c6ce909f9e1d024fafeee42d7d008fc6f22d2"
-CROS_WORKON_BLACKLIST=1
-CROS_WORKON_LOCALNAME="../aosp/external/minijail"
-CROS_WORKON_PROJECT="platform/external/minijail"
-CROS_WORKON_REPO="${CROS_GIT_AOSP_URL}"
-CROS_WORKON_SUBTREE="rust/minijail"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="rust bindings for minijail"
-HOMEPAGE="https://android.googlesource.com/platform/external/minijail"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="asan test"
-
-DEPEND="
-	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
-	dev-rust/minijail-sys:=
-"
-
-src_unpack() {
-	# Unpack both the minijail and Rust dependency source code.
-	cros-workon_src_unpack
-	S+="/rust/minijail"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	if use x86 || use amd64; then
-		use test && ecargo_test --no-run
-	fi
-}
-
-src_test() {
-	if cros-rust_use_sanitizers; then
-		# crbug.com/1097761 The unit tests for this package leak threads.
-		elog "Skipping rust unit tests for ASAN because fork leaks threads."
-	elif use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
diff --git a/dev-rust/minijail/minijail-0.2.1-r1.ebuild b/dev-rust/minijail/minijail-0.2.1-r1.ebuild
new file mode 100644
index 0000000..a00e611
--- /dev/null
+++ b/dev-rust/minijail/minijail-0.2.1-r1.ebuild
@@ -0,0 +1,59 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# This lives separately from the main minijail ebuild since we don't have Rust
+# available in the SDK builder.
+# TODO: Consider moving back into main ebuild once crbug.com/1046088 is
+# resolved.
+
+EAPI=7
+
+inherit cros-constants
+
+CROS_WORKON_COMMIT="85d797ecbfd7aefbb9486afeaed3cf5f74858562"
+CROS_WORKON_TREE="2ac2853d10ad0e5f4b451d75ea3590649b9ee241"
+CROS_WORKON_BLACKLIST=1
+CROS_WORKON_LOCALNAME="../aosp/external/minijail"
+CROS_WORKON_PROJECT="platform/external/minijail"
+CROS_WORKON_REPO="${CROS_GIT_AOSP_URL}"
+CROS_WORKON_SUBTREE="rust/minijail"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="rust bindings for minijail"
+HOMEPAGE="https://android.googlesource.com/platform/external/minijail"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan test"
+
+DEPEND="
+	>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0
+	dev-rust/minijail-sys:=
+"
+
+src_unpack() {
+	# Unpack both the minijail and Rust dependency source code.
+	cros-workon_src_unpack
+	S+="/rust/minijail"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	if use x86 || use amd64; then
+		use test && ecargo_test --no-run
+	fi
+}
+
+src_test() {
+	if cros-rust_use_sanitizers; then
+		# crbug.com/1097761 The unit tests for this package leak threads.
+		elog "Skipping rust unit tests for ASAN because fork leaks threads."
+	elif use x86 || use amd64; then
+		# TODO(crbug/1115287) Include the wait_* tests once they don't hang.
+		ecargo_test -- --skip tests::wait_
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
diff --git a/dev-rust/minijail/minijail-9999.ebuild b/dev-rust/minijail/minijail-9999.ebuild
index 04ba8ec..196341f 100644
--- a/dev-rust/minijail/minijail-9999.ebuild
+++ b/dev-rust/minijail/minijail-9999.ebuild
@@ -49,7 +49,8 @@
 		# crbug.com/1097761 The unit tests for this package leak threads.
 		elog "Skipping rust unit tests for ASAN because fork leaks threads."
 	elif use x86 || use amd64; then
-		ecargo_test
+		# TODO(crbug/1115287) Include the wait_* tests once they don't hang.
+		ecargo_test -- --skip tests::wait_
 	else
 		elog "Skipping rust unit tests on non-x86 platform"
 	fi
diff --git a/dev-rust/num_enum/Manifest b/dev-rust/num_enum/Manifest
new file mode 100644
index 0000000..208cb98
--- /dev/null
+++ b/dev-rust/num_enum/Manifest
@@ -0,0 +1 @@
+DIST num_enum-0.5.0.crate 4830 BLAKE2B 728c8e3db5e03abd9bf115ac30b60757f7f4b61c44d873a3502953b230694275292ed0efb996f20f862cfb5ab686a2882d621d76ffebf17b251f42763cddf042 SHA512 c88d86164591ae27e17c35321d05e11264542b505a6f682b62d59c81decd74b539fe5813ada7687b07de67c81e7b44b9a30973e868a6b24e207b30e6afd5b589
diff --git a/dev-rust/num_enum/num_enum-0.5.0.ebuild b/dev-rust/num_enum/num_enum-0.5.0.ebuild
new file mode 100644
index 0000000..4d5954e
--- /dev/null
+++ b/dev-rust/num_enum/num_enum-0.5.0.ebuild
@@ -0,0 +1,19 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Procedural macros to make inter-operation between primitives and enums easier."
+HOMEPAGE="https://github.com/illicitonion/num_enum"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="BSD"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/derivative-2*:=
+	=dev-rust/num_enum_derive-0.5*:=
+"
diff --git a/dev-rust/num_enum_derive/Manifest b/dev-rust/num_enum_derive/Manifest
new file mode 100644
index 0000000..c44c9c7
--- /dev/null
+++ b/dev-rust/num_enum_derive/Manifest
@@ -0,0 +1 @@
+DIST num_enum_derive-0.5.0.crate 4703 BLAKE2B 2e2f067615e05291d6eb3d49b3f3164aac3f473ae085ed2a2f38ce24f3a557604e782fef344d9c9dfb017d57d74f89fc7e6772c60762956964b071854cd64b68 SHA512 c5fe55e911c7e5dab9b94464ae779bfc58f70b068d4052252d1759966726961d7fd4aeb4f85630fed5f27256f3dc74791a12d3c14a17b80034061fecb9c9a91e
diff --git a/dev-rust/num_enum_derive/num_enum_derive-0.5.0.ebuild b/dev-rust/num_enum_derive/num_enum_derive-0.5.0.ebuild
new file mode 100644
index 0000000..d566945
--- /dev/null
+++ b/dev-rust/num_enum_derive/num_enum_derive-0.5.0.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)"
+HOMEPAGE="https://github.com/illicitonion/num_enum"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="BSD"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/proc-macro-crate-0.1.4:= <dev-rust/proc-macro-crate-0.2
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+"
diff --git a/dev-rust/p9/p9-0.1.0-r19.ebuild b/dev-rust/p9/p9-0.1.0-r19.ebuild
deleted file mode 100644
index c77e8fa..0000000
--- a/dev-rust/p9/p9-0.1.0-r19.ebuild
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="b09ea2ff65a11ec25611917e4b3e56d9d3891c5b"
-CROS_WORKON_TREE="e8f9fadf8cbdbb56a1ba7a761cdfbcee69ddf3b0"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="vm_tools/p9"
-
-inherit cros-fuzzer cros-workon cros-rust
-
-DESCRIPTION="Server implementation of the 9P file system protocol"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/p9/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="fuzzer test"
-
-DEPEND="
-	dev-rust/libc:=
-	=dev-rust/proc-macro2-1*:=
-	=dev-rust/quote-1*:=
-	=dev-rust/syn-1*:=
-	fuzzer? ( dev-rust/cros_fuzz:= )
-"
-
-RDEPEND="!!<=dev-rust/p9-0.1.0-r14"
-
-get_crate_version() {
-	local crate="$1"
-	awk '/^version = / { print $3 }' "$1/Cargo.toml" | head -n1 | tr -d '"'
-}
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/vm_tools/p9"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-
-	if use fuzzer; then
-		cd fuzz
-		ecargo_build_fuzzer
-	fi
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test
-	fi
-}
-
-src_install() {
-	pushd wire_format_derive > /dev/null
-	local version="$(get_crate_version .)"
-	cros-rust_publish wire_format_derive "${version}"
-	popd > /dev/null
-
-	version="$(get_crate_version .)"
-	cros-rust_publish p9 "${version}"
-
-	if use fuzzer; then
-		fuzzer_install "${S}/fuzz/OWNERS" \
-			"$(cros-rust_get_build_dir)/p9_tframe_decode_fuzzer"
-	fi
-}
-
-pkg_postinst() {
-	cros-rust_pkg_postinst wire_format_derive
-	cros-rust_pkg_postinst p9
-}
-
-pkg_prerm() {
-	cros-rust_pkg_prerm wire_format_derive
-	cros-rust_pkg_prerm p9
-}
diff --git a/dev-rust/p9/p9-0.1.0-r24.ebuild b/dev-rust/p9/p9-0.1.0-r24.ebuild
new file mode 100644
index 0000000..185a3af
--- /dev/null
+++ b/dev-rust/p9/p9-0.1.0-r24.ebuild
@@ -0,0 +1,95 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="a386d01923b4d03e939560c09b326e5f38ec2ecc"
+CROS_WORKON_TREE="bd9f3415406a689221fa329b5e367075c6579fae"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="vm_tools/p9"
+
+inherit cros-fuzzer cros-workon cros-rust
+
+DESCRIPTION="Server implementation of the 9P file system protocol"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/p9/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="fuzzer test"
+
+DEPEND="
+	dev-rust/libc:=
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+	fuzzer? ( dev-rust/cros_fuzz:= )
+"
+
+RDEPEND="!!<=dev-rust/p9-0.1.0-r14"
+
+get_crate_version() {
+	local crate="$1"
+	awk '/^version = / { print $3 }' "$1/Cargo.toml" | head -n1 | tr -d '"'
+}
+
+pkg_setup() {
+	cros-rust_pkg_setup wire_format_derive
+	cros-rust_pkg_setup p9
+}
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/vm_tools/p9"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	pushd wire_format_derive > /dev/null || die
+	ecargo_build
+	use test && ecargo_test --no-run
+	popd > /dev/null || die
+
+	ecargo_build
+	use test && ecargo_test --no-run
+
+	if use fuzzer; then
+		cd fuzz
+		ecargo_build_fuzzer
+	fi
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test
+	fi
+}
+
+src_install() {
+	pushd wire_format_derive > /dev/null || die
+	local version="$(get_crate_version .)"
+	cros-rust_publish wire_format_derive "${version}"
+	popd > /dev/null || die
+
+	version="$(get_crate_version .)"
+	cros-rust_publish p9 "${version}"
+
+	if use fuzzer; then
+		fuzzer_install "${S}/fuzz/OWNERS" \
+			"$(cros-rust_get_build_dir)/p9_tframe_decode_fuzzer"
+	fi
+}
+
+pkg_postinst() {
+	cros-rust_pkg_postinst wire_format_derive
+	cros-rust_pkg_postinst p9
+}
+
+pkg_prerm() {
+	cros-rust_pkg_prerm wire_format_derive
+	cros-rust_pkg_prerm p9
+}
diff --git a/dev-rust/p9/p9-9999.ebuild b/dev-rust/p9/p9-9999.ebuild
index 55b4247..0546653 100644
--- a/dev-rust/p9/p9-9999.ebuild
+++ b/dev-rust/p9/p9-9999.ebuild
@@ -5,7 +5,6 @@
 
 CROS_WORKON_LOCALNAME="../platform2"
 CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
 CROS_WORKON_INCREMENTAL_BUILD=1
 CROS_WORKON_SUBTREE="vm_tools/p9"
 
@@ -33,6 +32,11 @@
 	awk '/^version = / { print $3 }' "$1/Cargo.toml" | head -n1 | tr -d '"'
 }
 
+pkg_setup() {
+	cros-rust_pkg_setup wire_format_derive
+	cros-rust_pkg_setup p9
+}
+
 src_unpack() {
 	cros-workon_src_unpack
 	S+="/vm_tools/p9"
@@ -41,6 +45,12 @@
 }
 
 src_compile() {
+	pushd wire_format_derive > /dev/null || die
+	ecargo_build
+	use test && ecargo_test --no-run
+	popd > /dev/null || die
+
+	ecargo_build
 	use test && ecargo_test --no-run
 
 	if use fuzzer; then
@@ -58,10 +68,10 @@
 }
 
 src_install() {
-	pushd wire_format_derive > /dev/null
+	pushd wire_format_derive > /dev/null || die
 	local version="$(get_crate_version .)"
 	cros-rust_publish wire_format_derive "${version}"
-	popd > /dev/null
+	popd > /dev/null || die
 
 	version="$(get_crate_version .)"
 	cros-rust_publish p9 "${version}"
diff --git a/dev-rust/proc-macro-crate/Manifest b/dev-rust/proc-macro-crate/Manifest
new file mode 100644
index 0000000..5becdc6
--- /dev/null
+++ b/dev-rust/proc-macro-crate/Manifest
@@ -0,0 +1 @@
+DIST proc-macro-crate-0.1.5.crate 8096 BLAKE2B 0a992f7aecf05335008731adc40e8ce6c4ef5e114228b51ea856112f850a24e995e4682c8d2ffbc703b9b5cfddad68342cc9d0f7d13b13a96961287bdc22c4a0 SHA512 b2922ea8beb762f42f7646398eff9d03a5fe3d942f1d0cce564eff8af41ed14f175986d07ac5bab75e7634f964b8ad24a6f05f597c90b83761bb4c1d2b2fed59
diff --git a/dev-rust/proc-macro-crate/proc-macro-crate-0.1.5.ebuild b/dev-rust/proc-macro-crate/proc-macro-crate-0.1.5.ebuild
new file mode 100644
index 0000000..225127a
--- /dev/null
+++ b/dev-rust/proc-macro-crate/proc-macro-crate-0.1.5.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Replacement for crate (macro_rules keyword) in proc-macros."
+HOMEPAGE="https://github.com/bkchr/proc-macro-crate"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="=dev-rust/toml-0.5*:="
diff --git a/dev-rust/proc-macro2/Manifest b/dev-rust/proc-macro2/Manifest
index f2097c9..7334bb7 100644
--- a/dev-rust/proc-macro2/Manifest
+++ b/dev-rust/proc-macro2/Manifest
@@ -1,2 +1,2 @@
 DIST proc-macro2-0.4.21.crate 30813 BLAKE2B acf36197ae0bbd69e4b85c360831f9056dffa343165f665621c3e3b1aa29edd5d20d2b046a1dc8a401e758402d80096875c96915b15cb218a019169eab439df9 SHA512 9e0603d634d0748047dbc0e4c44dce54cba1026ed76945b09ed72224c015465cc8541d4045185f8b8cf6ff316daec50bc5a3ad7ddf5015aa971135497e5261ed
-DIST proc-macro2-1.0.8.crate 35657 BLAKE2B 6f53919e85028b6ca2f1d04feb7daf9bf9c2f76273ee8813d9b09807585a1da81687b880b2f23109998332bd7f5d3798d83094042a44de66413a2cebcd60a2c8 SHA512 0214a1268a733872ef1fa59ab80a1cb9ed8f160b9f3751cd70cb26c0919bb3858e63c994163c727f7c7486067ebc681017fb452d51fa314e7da90ca120892254
+DIST proc-macro2-1.0.19.crate 36390 BLAKE2B d21272e6bbe7bc5953ca388181a3875e6a3426e48ba3eb8808ec51fd2139093b60260998509b81ab1d67dceb4f9a0a255c234912d41739a7420537615ad3a4f0 SHA512 046f65ee0eefc1bfa39a405f46a7aa5ba83a11af057f150700412bc79a7a76d713f020377f38171086da58ee15e3db784c3e198cd18cc852add405e5e27eaeea
diff --git a/dev-rust/proc-macro2/proc-macro2-1.0.19.ebuild b/dev-rust/proc-macro2/proc-macro2-1.0.19.ebuild
new file mode 100644
index 0000000..5c9cd52
--- /dev/null
+++ b/dev-rust/proc-macro2/proc-macro2-1.0.19.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Stable implemntation of the upcoming 'proc_macro' API"
+HOMEPAGE="https://github.com/alexcrichton/proc-macro2"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/unicode-xid-0.2*:=
+"
diff --git a/dev-rust/proc-macro2/proc-macro2-1.0.8.ebuild b/dev-rust/proc-macro2/proc-macro2-1.0.8.ebuild
deleted file mode 100644
index 2e8bb97..0000000
--- a/dev-rust/proc-macro2/proc-macro2-1.0.8.ebuild
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Stable implemntation of the upcoming 'proc_macro' API"
-HOMEPAGE="https://github.com/alexcrichton/proc-macro2"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/unicode-xid-0.2*:=
-"
diff --git a/dev-rust/protobuf-codegen/Manifest b/dev-rust/protobuf-codegen/Manifest
index 22ce02f..d714190 100644
--- a/dev-rust/protobuf-codegen/Manifest
+++ b/dev-rust/protobuf-codegen/Manifest
@@ -1,2 +1 @@
-DIST protobuf-codegen-2.3.0.crate 28908 BLAKE2B 783c39da3875fce77141566f681150cab175a5c5f3ab5c5ef9740ada13b1434f5afe85d66b3836415441e083780f73f4fce364258f38b2f6e8cc75cc5233e6cc SHA512 b8c20205731d34ba9aa731cb958bc78330f75fa9206404241ed3a77dbbfef1a57f893b45f8e78f6e6cc1134b25def90047fa9a4d46b6f7790b99476f6ef87d25
-DIST protobuf-codegen-2.8.1.crate 34525 BLAKE2B f098bead11f0804c7475f2f5e8db65afa44d972513217aa674b45d2d0d31e3c96b9efaece173d097e8e3f034ca97003dd2c7192d55c07ab7db4cfa7d12bc1141 SHA512 a776486790268e1421029bf59af766be65f5f95e8df5348186b683e947d7d6fa708ff4417a548e1761ca2393334c6e23f93bc57b5189c7648cd828c4c1c9ec1c
+DIST protobuf-codegen-2.16.2.crate 38790 BLAKE2B 4831d8a196b2ee77ec5e7b8145e0ad12b3decc12aea4db1e41872edae3bcdbac9bc89887c16ea5b7e21d86b1ef6bbc858336d1cdf13e251c437cac504fad72b5 SHA512 3c0c8195eb46582b14deef786f941e2b83449dbe2e169e51c2a627859cfcf2f8360e27ce849186d585ecb8505abea73f35c690e885d87132273f2c6b4461b497
diff --git a/dev-rust/protobuf-codegen/protobuf-codegen-2.16.2.ebuild b/dev-rust/protobuf-codegen/protobuf-codegen-2.16.2.ebuild
new file mode 100644
index 0000000..fe42722
--- /dev/null
+++ b/dev-rust/protobuf-codegen/protobuf-codegen-2.16.2.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Protobuf code generator and a protoc-gen-rust protoc plugin"
+HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protobuf-codegen"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-rust/protobuf-${PV}:=
+"
+
+src_compile() {
+	ecargo_build
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+	dobin "$(cros-rust_get_build_dir)/protoc-gen-rust"
+}
diff --git a/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0-r1.ebuild b/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0-r1.ebuild
deleted file mode 120000
index 7d2b6ec..0000000
--- a/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-protobuf-codegen-2.3.0.ebuild
\ No newline at end of file
diff --git a/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0.ebuild b/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0.ebuild
deleted file mode 100644
index 904b749..0000000
--- a/dev-rust/protobuf-codegen/protobuf-codegen-2.3.0.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Protobuf code generator and a protoc-gen-rust protoc plugin"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protobuf-codegen"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/protobuf-2.3.0:=
-"
-
-src_compile() {
-	ecargo_build
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-	dobin "$(cros-rust_get_build_dir)/protoc-gen-rust"
-}
diff --git a/dev-rust/protobuf-codegen/protobuf-codegen-2.8.1.ebuild b/dev-rust/protobuf-codegen/protobuf-codegen-2.8.1.ebuild
deleted file mode 100644
index fe1ec25..0000000
--- a/dev-rust/protobuf-codegen/protobuf-codegen-2.8.1.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Protobuf code generator and a protoc-gen-rust protoc plugin"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protobuf-codegen"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/protobuf-${PV}:=
-"
-
-RDEPEND="
-	!dev-rust/protobuf-codegen:2.3.0
-"
-
-src_compile() {
-	ecargo_build
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-	dobin "$(cros-rust_get_build_dir)/protoc-gen-rust"
-}
diff --git a/dev-rust/protobuf/Manifest b/dev-rust/protobuf/Manifest
index 82dc281..51197f0 100644
--- a/dev-rust/protobuf/Manifest
+++ b/dev-rust/protobuf/Manifest
@@ -1,3 +1 @@
-DIST protobuf-1.4.3.crate 164458 BLAKE2B c4d3826e1f91372f67d6a40035420af8a2b99aec5de36e9f6a1625d703657da4515538167d8bad2f5ef66ad843e2dee05e4af554ee909965ffb8cfff8b9903f3 SHA512 14eff28fb6fce7857362fb8396b1c0ad47d47a0a07ac75e754a8426184475695e56c276d5771ab77384cff9497182567e262e665552c64477a0651eb3fbff48b
-DIST protobuf-2.3.0.crate 135786 BLAKE2B ace65ef65ceb16a7d65a1e19037293a05211250fc9ce56eb0c39a6ac52057c0ea0793c326d46b97075737727898f772c34e84d77cfd4d30c5433fa4370085533 SHA512 ca9229efbb0d7547ef750c9aeb9e952fac07d560b1ab8bd5aa811b4db9244d8bcd56b4a69ea2f3cc83998bbe29c4e2d3c77bd66e501b7451061a29ce3243fcca
-DIST protobuf-2.8.1.crate 143489 BLAKE2B 81a6ef464805f4a39346a32fd9f582e9bf3091beb009311a99f34fdc64fa26c46f0fa1a66506fa8a07dcb2aa765fefff5388e096b3a2637d675cd0277f7484e4 SHA512 ae72844258c4937c326694e907e7dd681f4c72f78db938a42d292da3642707d0fc62f1e2d98f1b5d8fdbe0be0db3123a247420352aa85d022dbaedf4bba92945
+DIST protobuf-2.16.2.crate 145854 BLAKE2B 528b0ca240c44d6487287f1e0eab68653fee438a804f26eaa5c8c1f8c511c9b423c1942188511ae482b1f86bde1ce57dcb3645c7f45610f8152b265216485805 SHA512 76943afb0889578dd89e275e247cf191f2344a25f008a68ae9fb04daba720093842510b5366c7df6c12c00ea50994c46cd256f18a0b1369a36e89c5e31a3bddb
diff --git a/dev-rust/protobuf/protobuf-1.4.3.ebuild b/dev-rust/protobuf/protobuf-1.4.3.ebuild
deleted file mode 100644
index 74be5e3..0000000
--- a/dev-rust/protobuf/protobuf-1.4.3.ebuild
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Rust implementation of Google protocol buffers"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/bytes-0.4.11:=
-"
diff --git a/dev-rust/protobuf/protobuf-2.16.2.ebuild b/dev-rust/protobuf/protobuf-2.16.2.ebuild
new file mode 100644
index 0000000..cfd8709
--- /dev/null
+++ b/dev-rust/protobuf/protobuf-2.16.2.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Rust implementation of Google protocol buffers"
+HOMEPAGE="https://github.com/stepancheg/rust-protobuf/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/bytes-0.5*:=
+	=dev-rust/serde-1*:=
+	=dev-rust/serde_derive-1*:=
+"
diff --git a/dev-rust/protobuf/protobuf-2.3.0.ebuild b/dev-rust/protobuf/protobuf-2.3.0.ebuild
deleted file mode 100644
index 26fbc0e..0000000
--- a/dev-rust/protobuf/protobuf-2.3.0.ebuild
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Rust implementation of Google protocol buffers"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/bytes-0.4*:=
-	=dev-rust/serde-1.0*:=
-	=dev-rust/serde_derive-1.0*:=
-"
diff --git a/dev-rust/protobuf/protobuf-2.8.1.ebuild b/dev-rust/protobuf/protobuf-2.8.1.ebuild
deleted file mode 100644
index a4f8976..0000000
--- a/dev-rust/protobuf/protobuf-2.8.1.ebuild
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Rust implementation of Google protocol buffers"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/bytes-0.4*:=
-	=dev-rust/serde-1.0*:=
-	=dev-rust/serde_derive-1.0*:=
-"
-
-RDEPEND="
-	!dev-rust/protobuf:2.3.0
-"
diff --git a/dev-rust/protoc-rust/Manifest b/dev-rust/protoc-rust/Manifest
index 0215947..94d0670 100644
--- a/dev-rust/protoc-rust/Manifest
+++ b/dev-rust/protoc-rust/Manifest
@@ -1,3 +1 @@
-DIST protoc-rust-1.4.3.crate 2379 BLAKE2B eee1015c890934ad9c8bb0972b66758df4c666131f64c3d637747f1b808910c55cd259316cd9834e3a36daa3b0106165e58251f478521e7826a140402de78350 SHA512 5651106c4ae45083d5038f1bc37c168690cb098fd96d079828c6f7f104e915c98fc630cb2ae1c36fedee8ebccac9985de80f9d8c8029559dbcdec6ddecd2bf0c
-DIST protoc-rust-2.3.0.crate 3007 BLAKE2B 965183b5418eefc159d5c6a678c161fa0e07a509f73ed89a8790da718badb2bb92e07b81e4842008b3d4b28f8c99c2133277682283da3cee616620a11ea3e62f SHA512 bd3d4082b27a182faf454e80855f4e0e6c1d1f728f4eb5456931253c5b4a362c0db90aa2b1ac6f73c64b09dc8e24fb1189d1cecf2db87449a0d562e977065bb7
-DIST protoc-rust-2.8.1.crate 3700 BLAKE2B 75c993387f06f83aa1ae0c19ced58b30723a0077ad41eefb373fd65a89a2ee95f946a4fa300a27b83c0bd0c580087b574645370ec086fda1c386b7049648df68 SHA512 9f5baabf883ea02e20be703dcf6e72ecd5db65376ca0bf2824a5b221db11c6b2f4f4eb2e3c2a2c25faa456c1bb224b390ad5c94cfbbbc3a432a3d9cc403bbf8f
+DIST protoc-rust-2.16.2.crate 4622 BLAKE2B 47c1ae2f96a4da593da59f007a7d56b61e69d45c4859101794200c829bb4870c5a4506d4c031abdc9d8a9e8cf4ac2a19aa8f09c2315bb513f4a2e5848029ab35 SHA512 05dbd83addb8bcce2dda6d5cf517463cd67dfd80c0a6815e32c7cfd5d1bcf3ccaa460da7f8eba6e449aa8204ff6a81f2a167ed214e7c72e2f03baad3a6ebc45a
diff --git a/dev-rust/protoc-rust/protoc-rust-1.4.3.ebuild b/dev-rust/protoc-rust/protoc-rust-1.4.3.ebuild
deleted file mode 100644
index 0cc331d..0000000
--- a/dev-rust/protoc-rust/protoc-rust-1.4.3.ebuild
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="protoc --rust_out=... available as API. protoc needs to be in $PATH, protoc-gen-run does not"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc-rust/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/protobuf-1.4.3:=
-	~dev-rust/protoc-1.4.3:=
-	~dev-rust/tempdir-0.3.7:=
-"
diff --git a/dev-rust/protoc-rust/protoc-rust-2.16.2.ebuild b/dev-rust/protoc-rust/protoc-rust-2.16.2.ebuild
new file mode 100644
index 0000000..8c22611
--- /dev/null
+++ b/dev-rust/protoc-rust/protoc-rust-2.16.2.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="protoc --rust_out=... available as API."
+HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc-rust/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-rust/protobuf-${PV}:=
+	~dev-rust/protobuf-codegen-${PV}:=
+	~dev-rust/protoc-${PV}:=
+	=dev-rust/tempfile-3*:=
+"
diff --git a/dev-rust/protoc-rust/protoc-rust-2.3.0-r1.ebuild b/dev-rust/protoc-rust/protoc-rust-2.3.0-r1.ebuild
deleted file mode 120000
index 8c16d1a..0000000
--- a/dev-rust/protoc-rust/protoc-rust-2.3.0-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-protoc-rust-2.3.0.ebuild
\ No newline at end of file
diff --git a/dev-rust/protoc-rust/protoc-rust-2.3.0.ebuild b/dev-rust/protoc-rust/protoc-rust-2.3.0.ebuild
deleted file mode 100644
index d823cf4..0000000
--- a/dev-rust/protoc-rust/protoc-rust-2.3.0.ebuild
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="protoc --rust_out=... available as API. protoc needs to be in $PATH, protoc-gen-run does not"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc-rust/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/protobuf-2.3.0:=
-	~dev-rust/protobuf-codegen-2.3.0:=
-	~dev-rust/protoc-2.3.0:=
-	dev-rust/tempfile:=
-"
diff --git a/dev-rust/protoc-rust/protoc-rust-2.8.1.ebuild b/dev-rust/protoc-rust/protoc-rust-2.8.1.ebuild
deleted file mode 100644
index d6b9339..0000000
--- a/dev-rust/protoc-rust/protoc-rust-2.8.1.ebuild
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="protoc --rust_out=... available as API."
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc-rust/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/protobuf-${PV}:=
-	~dev-rust/protobuf-codegen-${PV}:=
-	~dev-rust/protoc-${PV}:=
-	dev-rust/tempfile:=
-"
-
-RDEPEND="
-	!dev-rust/protoc-rust:2.3.0
-"
diff --git a/dev-rust/protoc/Manifest b/dev-rust/protoc/Manifest
index d0c8430..fcf8c8d 100644
--- a/dev-rust/protoc/Manifest
+++ b/dev-rust/protoc/Manifest
@@ -1,3 +1 @@
-DIST protoc-1.4.3.crate 2684 BLAKE2B 31f79e629da084e2c2ca77840573117a4adccae818c719364907ceb4a2ea13f839c9b4259b1ffa4fb8718c0e76135d33290bea61b87c26d2111d563e4a5e5dad SHA512 ce43bb44a73cd73dfad209facb99ad6a21444bc8bfaea6d98f856f499f5f9020912bfa2be9158bdc96238581daf89da71d81ab879b5f5dff73ad3d0984987303
-DIST protoc-2.3.0.crate 2888 BLAKE2B cacf88e0a4dffe0089d264ffcad07a63fc61e92d62dea653103c3fee355102f895c8bcf002eb363bc599164a33840a52693b0cf3d23d97d651b731c4b8aae39f SHA512 1efde2bac5cdfc2e829c4eae600e8edb1ef74a13845726411a1fbd01db8117f0e1781a829dff6f591703e91046c1a8ce3f0b85e41ebbd5e3252589c0f781d61b
-DIST protoc-2.8.1.crate 3625 BLAKE2B a32a81ad9e05442e4c458fa2ceba62854f7ca1286bda0e02c62d7c7fbe5ab31a0e5016d048f98c5c53fcae30e289c424b0327ad296ff24d446a50bf58f16b803 SHA512 590f2dff7fcf3439d7a451c69579c8fec20ac3092010d65ad0ad525ba1a2c03f8dee1376524170dc7e66f20cda5f64292eb6907dc0eeb12d2d9afd0f1bb18826
+DIST protoc-2.16.2.crate 4711 BLAKE2B 640c8bfc7cc94728a6450eeea6f4938c3386bcd1e7bea3da25df0760dc17eb05081f7cf4bc74bec1377818a84e0e7d0895f028f8d2906d2fa53b9ea7c0783846 SHA512 7c70d9a74300bff2c14ecffcb4d60961a3d38a4e7d70765d36864b566a1b307248bd2b53b8fe917f978f557de5ac5044ccddc37896aa9acf417a16698e5048b9
diff --git a/dev-rust/protoc/protoc-1.4.3.ebuild b/dev-rust/protoc/protoc-1.4.3.ebuild
deleted file mode 100644
index 0dac8aa..0000000
--- a/dev-rust/protoc/protoc-1.4.3.ebuild
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Protobuf protoc command as API"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-rust/log-0.4.5:=
-"
diff --git a/dev-rust/protoc/protoc-2.16.2.ebuild b/dev-rust/protoc/protoc-2.16.2.ebuild
new file mode 100644
index 0000000..693e320
--- /dev/null
+++ b/dev-rust/protoc/protoc-2.16.2.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Protobuf protoc command as API"
+HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+# This is required for the actual protoc binary.
+BDEPEND="dev-libs/protobuf"
+
+DEPEND="
+	=dev-rust/log-0*:=
+"
diff --git a/dev-rust/protoc/protoc-2.3.0.ebuild b/dev-rust/protoc/protoc-2.3.0.ebuild
deleted file mode 100644
index 955c1cb..0000000
--- a/dev-rust/protoc/protoc-2.3.0.ebuild
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Protobuf protoc command as API"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/log-0*:=
-"
diff --git a/dev-rust/protoc/protoc-2.8.1.ebuild b/dev-rust/protoc/protoc-2.8.1.ebuild
deleted file mode 100644
index 27dd3cf..0000000
--- a/dev-rust/protoc/protoc-2.8.1.ebuild
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Protobuf protoc command as API"
-HOMEPAGE="https://github.com/stepancheg/rust-protobuf/protoc/"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="MIT"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/log-0*:=
-"
-
-RDEPEND="
-	!dev-rust/protoc:2.3.0
-"
diff --git a/dev-rust/rusb/Manifest b/dev-rust/rusb/Manifest
new file mode 100644
index 0000000..1e5a334
--- /dev/null
+++ b/dev-rust/rusb/Manifest
@@ -0,0 +1 @@
+DIST rusb-0.6.2.crate 35836 BLAKE2B 142efd1399f7e426b353d23f621c7290ee8f3af7e1f73404527240746e03705bace3cfdf0a461033fd0cc71493c105681d92b4de4fe3b09008ed37767f5286e8 SHA512 ee1b57dd88d7c60b89731ddf2b3f5dfcdf41195e5056efecd9b16f1bc9902b478b9d7fe913eda13e299355550bca214d92c1bf82f464b18ded86e7e74f8203b4
diff --git a/dev-rust/rusb/rusb-0.6.2.ebuild b/dev-rust/rusb/rusb-0.6.2.ebuild
new file mode 100644
index 0000000..dd1f1ac
--- /dev/null
+++ b/dev-rust/rusb/rusb-0.6.2.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Rust library for accessing USB devices"
+HOMEPAGE="https://docs.rs/crate/rusb/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/libusb1-sys-0.3.5:= <dev-rust/libusb1-sys-0.4
+	=dev-rust/libc-0.2*:=
+"
diff --git a/dev-rust/serde/Manifest b/dev-rust/serde/Manifest
index 8709c3f..0552ecd 100644
--- a/dev-rust/serde/Manifest
+++ b/dev-rust/serde/Manifest
@@ -1,2 +1 @@
-DIST serde-0.8.23.crate 25824 BLAKE2B 96bc2e07504202ad51dc20cd972e7a3047c26f2dc892d6892466e92c8e9a58a65664d9a5f6f2d38ad2c9e0bfcffc0096b913b6c5ef1d3736d53114c13f00663a SHA512 537761d0fad243799c63b742b9ac020195ad5575e346080c2cf19b1792d2026bdab6f61550679b8883f7af5e16e98289aa749f0646a6d4b0cb24eec0f7d92edc
-DIST serde-1.0.89.crate 71395 BLAKE2B 6fc88c889a12ce4bee3dc96aefd80e18e21d52c11b840ec9f6562b300f386d3b6d83632006d5d70e52a3693c3ad4af5ee55f1b6869cb402305cd0c46ff565140 SHA512 e01f30208b7dce831890bfa37a38a6e2177c35f423fa02021d32c1209ae00a3e8f836deb12cc26c4343a4a10b87286d780ebb8eca83bd4191d1023318c15e745
+DIST serde-1.0.114.crate 74453 BLAKE2B d5cd4b23a0b6555f8efce963e833b0c293b53cf33a3846ddb189c8d8d8ef5f157c45e33833baa21683a336b60de4785509288c417243b43fc5395e5df6a4e7dc SHA512 9c8db28e52686bc0d428374f13e5a5f4ccb235ef17d8840aa676042321fc89adce4cef4dd00700bd25c2024f79a96d91eca8ec9122e899056116a890cb90300f
diff --git a/dev-rust/serde/serde-1.0.114.ebuild b/dev-rust/serde/serde-1.0.114.ebuild
new file mode 100644
index 0000000..a372bc3
--- /dev/null
+++ b/dev-rust/serde/serde-1.0.114.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Serde is a framework for serializing and deserializing Rust data structures efficiently and generically"
+HOMEPAGE="https://github.com/serde-rs/serde"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-rust/serde_derive-1.0.114:=
+"
diff --git a/dev-rust/serde/serde-1.0.89.ebuild b/dev-rust/serde/serde-1.0.89.ebuild
deleted file mode 100644
index bc3a1ee..0000000
--- a/dev-rust/serde/serde-1.0.89.ebuild
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Serde is a framework for serializing and deserializing Rust data structures efficiently and generically"
-HOMEPAGE="https://github.com/serde-rs/serde"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/serde_derive-1.0*:=
-"
diff --git a/dev-rust/serde_derive/Manifest b/dev-rust/serde_derive/Manifest
index b7c0f04..afcaa86 100644
--- a/dev-rust/serde_derive/Manifest
+++ b/dev-rust/serde_derive/Manifest
@@ -1 +1 @@
-DIST serde_derive-1.0.89.crate 48599 BLAKE2B 938134e97381bb4da5296a383a1bfb0fd9055c9e712a4121a39189849cf08f73b32eb5053c9f94b44ad4a62632d2b898d524013278c578ef569a862676daee0b SHA512 9c6e54b86eea33c8f4cfb27924f95e811b940ad0c9ba934c61691d728eaab3a31835a5c7ddf8b15d67786bd6b6d7f008079c453f89dc05b57f6412c9b1432d65
+DIST serde_derive-1.0.114.crate 50733 BLAKE2B f66ccfcbd8ccbdea4e3acc7fcb33fb1da516cf41e75c2993c2de79cd139fdf1b7c0ff6a95790df623eaf8b30fce4dec80f2a9c5332a8047dd0812fa65170737c SHA512 b3bea48a9ddd9c442a4ae6d0b76a116450e648976c02f07c2acf48459b15aef9c69d4843c2f04f387015c7f3ff5c3a1f4e5d1dc1e3a3ec3a114f6a651874aeb2
diff --git a/dev-rust/serde_derive/serde_derive-1.0.114.ebuild b/dev-rust/serde_derive/serde_derive-1.0.114.ebuild
new file mode 100644
index 0000000..74abf54
--- /dev/null
+++ b/dev-rust/serde_derive/serde_derive-1.0.114.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Serde is a framework for serializing and deserializing Rust data structures efficiently and generically"
+HOMEPAGE="https://github.com/serde-rs/serde"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	>=dev-rust/syn-1.0.33:= <dev-rust/syn-2
+"
diff --git a/dev-rust/serde_derive/serde_derive-1.0.89-r1.ebuild b/dev-rust/serde_derive/serde_derive-1.0.89-r1.ebuild
deleted file mode 120000
index 808575f..0000000
--- a/dev-rust/serde_derive/serde_derive-1.0.89-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-serde_derive-1.0.89.ebuild
\ No newline at end of file
diff --git a/dev-rust/serde_derive/serde_derive-1.0.89.ebuild b/dev-rust/serde_derive/serde_derive-1.0.89.ebuild
deleted file mode 100644
index 3da1b80..0000000
--- a/dev-rust/serde_derive/serde_derive-1.0.89.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Serde is a framework for serializing and deserializing Rust data structures efficiently and generically"
-HOMEPAGE="https://github.com/serde-rs/serde"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/proc-macro2-0.4*:=
-	>=dev-rust/quote-0.6.3:= <dev-rust/quote-0.7
-	>=dev-rust/syn-0.15.22:= <dev-rust/syn-0.16
-"
-
-src_prepare() {
-	cros-rust_src_prepare
-
-	# Delete the serde dev dependency. Allowing the dependency introduces a
-	# circular dependency, but serde has a legitimate dependency on
-	# serde_derive.
-	sed -i '/\[dev-dependencies.serde\]/{N;d;}' "${S}/Cargo.toml"
-}
diff --git a/dev-rust/serde_yaml/Manifest b/dev-rust/serde_yaml/Manifest
new file mode 100644
index 0000000..aa05b63
--- /dev/null
+++ b/dev-rust/serde_yaml/Manifest
@@ -0,0 +1 @@
+DIST serde_yaml-0.8.11.crate 35772 BLAKE2B 5b88c2df37c8e5f06847db307debc2e6800a25aebd8435c066c79f2a10b38a4b8f33499561511b6f70257aeb2f272a2c99294da1d1fbc77eb85d4b077a8ea027 SHA512 8baea9692990370e92415aadfb410c17e99f4d5b4bc09bdae13ffe438ba2be536152a68dd183e5c6a00e04a386472a7e081beb5fad6ba5231c39da794be2efa2
diff --git a/dev-rust/serde_yaml/serde_yaml-0.8.11.ebuild b/dev-rust/serde_yaml/serde_yaml-0.8.11.ebuild
new file mode 100644
index 0000000..dfcd38e
--- /dev/null
+++ b/dev-rust/serde_yaml/serde_yaml-0.8.11.ebuild
@@ -0,0 +1,24 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="YAML support for Serde"
+HOMEPAGE="https://docs.rs/crate/serde_yaml"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/dtoa-0.4*:=
+	=dev-rust/linked-hash-map-0.5*:=
+	>=dev-rust/serde-1.0.60:=
+	<dev-rust/serde-2.0
+	=dev-rust/yaml-rust-0.4*:=
+"
diff --git a/dev-rust/syn/Manifest b/dev-rust/syn/Manifest
index a53f3fe..853b671 100644
--- a/dev-rust/syn/Manifest
+++ b/dev-rust/syn/Manifest
@@ -1,4 +1,4 @@
 DIST syn-0.15.21.crate 146845 BLAKE2B 843c3d7a4853c50be188f7c67a329220cf8e65a467e9a63b3a28ad88fe89063bbde3873f10bbf81357cc5f192756c0c4b43162fe4412471edf914d7e5d0509e8 SHA512 606ffd4bcd74920e7023b2fc83a83087f4a559a9dec0a4a0d5fb6667b9887f98c413191a84b81ddba68e869dfc9fa7d31a3018f90eaed0ad96a039fc46074391
 DIST syn-0.15.26.crate 145493 BLAKE2B ede140e0184464e765413aa4875a07ab9329de60eba6aa46253d2880032b84a56348060396ffec8a5d81a2aa22c6a6eca73c425778ead21c1c55ffb657cf3718 SHA512 947d70dff83ffd33fda806597d54e572555b54c1600e357df919165fdc7141c6f9762b37f25f9b850e8a7775c33b6df3fc93f3eff12b36b059e696ad90619baa
-DIST syn-1.0.14.crate 195286 BLAKE2B 8311cdc0eb8ff69d65c250eb95706cd1e74a6ba899fac02ffc0a288e978c40a03fe5a7c18e3116a767eb6e5e08299d27f5ae04021b224d71d7b492a6b87d67a8 SHA512 7b2b7562ac89d719060b35bf89f21330c02a3c1f34270e864053feba9b0f7a16b5cfd11c57d57eab7c60df8663d8ae76709ca1c48ebab960db168d2836f57340
+DIST syn-1.0.38.crate 206263 BLAKE2B bb9a4f111f95190b9d1e61f5bdcac5e940112d5c6958a5d0edd852869e07f4de8c47cc4e069e0899c3a973e6aa2e858133d20eac897c1f5adbe80ff2748d2f31 SHA512 67e1d94e0efbf305d9bc2c5f42c57a17896f98a888ff7565912f7234cb2bd6f699b630c8687546d28569baa87442acff070eb0059314f5380b183469784aab12
 DIST syn-1.0.5.crate 190286 BLAKE2B 7d5c813bb4cebbc104978181532a050b0a7f79963a539d69a253ebdb15a83c275a5d5b04dfbb66a426afec2c90a450ed7be595619a2b5a31b0725d904f5adb92 SHA512 4cc18966040b1f86916876aa5ad8029a126f7ab8db55408b3f4bc343dd82dc357899dd4a7afc514c65fd269245f8850f8f2834b08bc2ee6cf6774282f75feadc
diff --git a/dev-rust/syn/syn-1.0.14.ebuild b/dev-rust/syn/syn-1.0.14.ebuild
deleted file mode 100644
index 4ed94c8..0000000
--- a/dev-rust/syn/syn-1.0.14.ebuild
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Parser for rust source code"
-HOMEPAGE="https://github.com/dtolnay/syn"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND="
-	=dev-rust/proc-macro2-1*:=
-	=dev-rust/quote-1*:=
-	=dev-rust/rayon-1*:=
-	=dev-rust/unicode-xid-0.2*:=
-	>=dev-rust/walkdir-2.1.0:= <dev-rust/walkdir-3
-	=dev-rust/regex-1*:=
-"
diff --git a/dev-rust/syn/syn-1.0.38.ebuild b/dev-rust/syn/syn-1.0.38.ebuild
new file mode 100644
index 0000000..6fbe92d
--- /dev/null
+++ b/dev-rust/syn/syn-1.0.38.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Parser for rust source code"
+HOMEPAGE="https://github.com/dtolnay/syn"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/proc-macro2-1.0.13:= <dev-rust/proc-macro2-2
+	=dev-rust/quote-1*:=
+	=dev-rust/unicode-xid-0.2*:=
+"
+
+src_prepare() {
+	cros-rust_src_prepare
+
+	# Delete the test dependency, syn-test-suite.
+	sed -i '/^test = \[/d' "${S}/Cargo.toml"
+}
diff --git a/dev-rust/sys_util/sys_util-0.1.0-r101.ebuild b/dev-rust/sys_util/sys_util-0.1.0-r101.ebuild
deleted file mode 100644
index 522bc4d..0000000
--- a/dev-rust/sys_util/sys_util-0.1.0-r101.ebuild
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="ce34d94b0e8c59105c1596ada65e282dafc0f541"
-CROS_WORKON_TREE="5b0406abafbaf80bef8ae572ff80725492f14989"
-CROS_WORKON_LOCALNAME="../platform/crosvm"
-CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="sys_util"
-CROS_WORKON_SUBDIRS_TO_COPY="sys_util"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Small system utility modules for usage by other modules."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/sys_util"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-RDEPEND="
-	sys-libs/libcap:=
-	!!<=dev-rust/sys_util-0.1.0-r60
-"
-DEPEND="
-	${RDEPEND}
-	>=dev-rust/libc-0.2.44:=
-	=dev-rust/quote-1*:=
-	=dev-rust/proc-macro2-1*:=
-	=dev-rust/syn-1*:=
-	dev-rust/data_model:=
-	dev-rust/sync:=
-	dev-rust/syscall_defines:=
-	dev-rust/tempfile:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/sys_util"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	local skip_tests=()
-
-	# These tests directly make a clone(2) syscall, which makes sanitizers very
-	# unhappy since they see memory allocated in the child process that is not
-	# freed (because it is owned by some other thread created by the test runner
-	# in the parent process).
-	cros-rust_use_sanitizers && skip_tests+=( --skip "fork::tests" )
-	# The memfd_create() system call first appeared in Linux 3.17.  Skip guest
-	# memory tests for builders with older kernels.
-	local cut_version=$(ver_cut 1-2 "$(uname -r)")
-	if ver_test 3.17 -gt "${cut_version}"; then
-		skip_tests+=( --skip "guest_memory::tests" )
-	fi
-
-	if use x86 || use amd64; then
-		# Some tests must be run single threaded to ensure correctness,
-		# since they rely on wait()ing on threads spawned by the test.
-		ecargo_test -- --test-threads=1 "${skip_tests[@]}"
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	pushd poll_token_derive > /dev/null
-	cros-rust_publish poll_token_derive "$(cros-rust_get_crate_version ${S}/poll_token_derive)"
-	popd > /dev/null
-
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
-
-pkg_postinst() {
-	cros-rust_pkg_postinst poll_token_derive
-	cros-rust_pkg_postinst
-}
-
-pkg_prerm() {
-	cros-rust_pkg_prerm poll_token_derive
-	cros-rust_pkg_prerm
-}
-
diff --git a/dev-rust/sys_util/sys_util-0.1.0-r117.ebuild b/dev-rust/sys_util/sys_util-0.1.0-r117.ebuild
new file mode 100644
index 0000000..92353d1
--- /dev/null
+++ b/dev-rust/sys_util/sys_util-0.1.0-r117.ebuild
@@ -0,0 +1,92 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="caf9ced94a9c6041d7cea3b4e9a1d5a69f3e6194"
+CROS_WORKON_TREE="391c412d21a72fefaa88abac05d8ba5fb46b0e4f"
+CROS_WORKON_LOCALNAME="../platform/crosvm"
+CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="sys_util"
+CROS_WORKON_SUBDIRS_TO_COPY="sys_util"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Small system utility modules for usage by other modules."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/sys_util"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+RDEPEND="
+	sys-libs/libcap:=
+	!!<=dev-rust/sys_util-0.1.0-r60
+"
+DEPEND="
+	${RDEPEND}
+	=dev-rust/android_log-sys-0.2*:=
+	>=dev-rust/libc-0.2.44:=
+	=dev-rust/quote-1*:=
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/syn-1*:=
+	dev-rust/data_model:=
+	dev-rust/sync:=
+	dev-rust/syscall_defines:=
+	dev-rust/tempfile:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/sys_util"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	local skip_tests=()
+
+	# These tests directly make a clone(2) syscall, which makes sanitizers very
+	# unhappy since they see memory allocated in the child process that is not
+	# freed (because it is owned by some other thread created by the test runner
+	# in the parent process).
+	cros-rust_use_sanitizers && skip_tests+=( --skip "fork::tests" )
+	# The memfd_create() system call first appeared in Linux 3.17.  Skip guest
+	# memory tests for builders with older kernels.
+	local cut_version=$(ver_cut 1-2 "$(uname -r)")
+	if ver_test 3.17 -gt "${cut_version}"; then
+		skip_tests+=( --skip "guest_memory::tests" )
+	fi
+
+	if use x86 || use amd64; then
+		# Some tests must be run single threaded to ensure correctness,
+		# since they rely on wait()ing on threads spawned by the test.
+		ecargo_test -- --test-threads=1 "${skip_tests[@]}"
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	pushd poll_token_derive > /dev/null
+	cros-rust_publish poll_token_derive "$(cros-rust_get_crate_version ${S}/poll_token_derive)"
+	popd > /dev/null
+
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
+
+pkg_postinst() {
+	cros-rust_pkg_postinst poll_token_derive
+	cros-rust_pkg_postinst
+}
+
+pkg_prerm() {
+	cros-rust_pkg_prerm poll_token_derive
+	cros-rust_pkg_prerm
+}
+
diff --git a/dev-rust/sys_util/sys_util-9999.ebuild b/dev-rust/sys_util/sys_util-9999.ebuild
index b17d3d3..6bd44ab 100644
--- a/dev-rust/sys_util/sys_util-9999.ebuild
+++ b/dev-rust/sys_util/sys_util-9999.ebuild
@@ -24,6 +24,7 @@
 "
 DEPEND="
 	${RDEPEND}
+	=dev-rust/android_log-sys-0.2*:=
 	>=dev-rust/libc-0.2.44:=
 	=dev-rust/quote-1*:=
 	=dev-rust/proc-macro2-1*:=
diff --git a/dev-rust/syslog/Manifest b/dev-rust/syslog/Manifest
index a1210ae..d626af1 100644
--- a/dev-rust/syslog/Manifest
+++ b/dev-rust/syslog/Manifest
@@ -1 +1 @@
-DIST syslog-4.0.0.crate 7187 BLAKE2B 8467d28b411f035a910755e734a23407a770416a3231de41c049ab1a2faa13f80f50aee8698d9c5a2ee3f5a97f0f134ddfa656f27b8fc3255fbeaed116403b4b SHA512 8760029a7918b84a2cf56cbcda8375b94d54139120e51a4d0d8da164213e74d8aa124d3f830df25b767f239588456d436efbb6c42cb5c2158717e00e1ec2e263
+DIST syslog-4.0.1.crate 7131 BLAKE2B a6555d6eed6a0701cca7d58554f2ee612a5d18975dc1979414ac536128e0e7d4a67dde0ad2e40b5ffec823f7edd55dc45d646097fcd457fa6124de95411b4c55 SHA512 faff2117fbf377343149e30a4b338fdd799fb7e4bf425962c2523423f8322aae75f180e4a4c42f1497239400cc60a49cfcf65c00c48433ac956ff17e52063341
diff --git a/dev-rust/syslog/syslog-4.0.0.ebuild b/dev-rust/syslog/syslog-4.0.0.ebuild
deleted file mode 100644
index b8add96..0000000
--- a/dev-rust/syslog/syslog-4.0.0.ebuild
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit cros-rust
-
-DESCRIPTION="Send log messages to syslog."
-HOMEPAGE="https://github.com/Geal/rust-syslog"
-SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
-
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="${PV}/${PR}"
-KEYWORDS="*"
-
-DEPEND=">=dev-rust/error-chain-0.11.0:=
-	>=dev-rust/libc-0.2.0:=
-	>=dev-rust/log-0.4.1:=
-	>=dev-rust/time-0.1.0:=
-	>=dev-rust/unix_socket-0.5.0:=
-"
diff --git a/dev-rust/syslog/syslog-4.0.1-r1.ebuild b/dev-rust/syslog/syslog-4.0.1-r1.ebuild
new file mode 100644
index 0000000..74710e8
--- /dev/null
+++ b/dev-rust/syslog/syslog-4.0.1-r1.ebuild
@@ -0,0 +1,21 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit cros-rust
+
+DESCRIPTION="Send log messages to syslog."
+HOMEPAGE="https://github.com/Geal/rust-syslog"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND=">=dev-rust/error-chain-0.11.0:=
+	>=dev-rust/libc-0.2.0:=
+	>=dev-rust/log-0.4.1:=
+	>=dev-rust/time-0.1.0:=
+	>=dev-rust/unix_socket-0.5.0:=
+"
diff --git a/dev-rust/tempfile/tempfile-3.0.7-r5.ebuild b/dev-rust/tempfile/tempfile-3.0.7-r5.ebuild
deleted file mode 100644
index 643a790..0000000
--- a/dev-rust/tempfile/tempfile-3.0.7-r5.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="1375c284b7adce6b19b4b2fe0c4b9ad7e5e987a6"
-CROS_WORKON_TREE="5b534e005508aab07c044f866ed002dcddb413ef"
-CROS_WORKON_LOCALNAME="../platform/crosvm"
-CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="tempfile"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="A library for managing temporary files and directories"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/tempfile"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	=dev-rust/cfg-if-0.1*:=
-	>=dev-rust/libc-0.2.27:=
-	=dev-rust/rand-0.6*:=
-	=dev-rust/redox_syscall-0.1*:=
-	=dev-rust/remove_dir_all-0.5*:=
-	=dev-rust/winapi-0.3*:=
-"
-
-RDEPEND="!!<=dev-rust/tempfile-3.0.7-r2"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/tempfile"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/tempfile/tempfile-3.0.7-r7.ebuild b/dev-rust/tempfile/tempfile-3.0.7-r7.ebuild
new file mode 100644
index 0000000..315e88a
--- /dev/null
+++ b/dev-rust/tempfile/tempfile-3.0.7-r7.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="f4a260d3dfea0bf9c0e5ac164b3d0ea96f5dadf0"
+CROS_WORKON_TREE="4d1019d4ba75c8d6c18310a8bce67bcda0eceab5"
+CROS_WORKON_LOCALNAME="../platform/crosvm"
+CROS_WORKON_PROJECT="chromiumos/platform/crosvm"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="tempfile"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="A library for managing temporary files and directories"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/tempfile"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	=dev-rust/cfg-if-0.1*:=
+	>=dev-rust/libc-0.2.27:=
+	=dev-rust/rand-0.6*:=
+	=dev-rust/redox_syscall-0.1*:=
+	=dev-rust/remove_dir_all-0.5*:=
+	=dev-rust/winapi-0.3*:=
+"
+
+RDEPEND="!!<=dev-rust/tempfile-3.0.7-r2"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/tempfile"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/thiserror-impl/Manifest b/dev-rust/thiserror-impl/Manifest
new file mode 100644
index 0000000..e73b239
--- /dev/null
+++ b/dev-rust/thiserror-impl/Manifest
@@ -0,0 +1 @@
+DIST thiserror-impl-1.0.20.crate 13197 BLAKE2B f7da61d0dea4864bc3fbccad178b67f85223ab9f9529c118b07229d55a2568f23888041f2cd813efe51dacf8e01de62397092f56c43c640ba97a32dae2b7cd6d SHA512 3ca4dbdeff76c12c5a716d811891ce14bb16013749a45b8d8fae9cdc599e304065665dab051713d7e8e5bd2d2485ff9fa0904ca3cb5bf9e19f2cf66b42f10209
diff --git a/dev-rust/thiserror-impl/thiserror-impl-1.0.20.ebuild b/dev-rust/thiserror-impl/thiserror-impl-1.0.20.ebuild
new file mode 100644
index 0000000..ef2cc70
--- /dev/null
+++ b/dev-rust/thiserror-impl/thiserror-impl-1.0.20.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Implementation detail of the thiserror crate"
+HOMEPAGE="https://github.com/thiserror/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	>=dev-rust/syn-1.0.11:= <dev-rust/syn-2.0
+"
diff --git a/dev-rust/thiserror/Manifest b/dev-rust/thiserror/Manifest
new file mode 100644
index 0000000..1c8891d
--- /dev/null
+++ b/dev-rust/thiserror/Manifest
@@ -0,0 +1 @@
+DIST thiserror-1.0.20.crate 15950 BLAKE2B 747ff4ccdaddbbcc80225164b203cacc8669796e3c1515db9011f053486ce8d77a4560ae58756641fde7465ae6c818ddbb5b60641d1e5ae288ddcc549eef1848 SHA512 7f8e201f8d173112c7009fffa79e6d2bda5614cfb0439b81a9a990b777261de792d7e7750d75f7638bd58e6d72d183cffbada902595f425f037d6df04c0528a9
diff --git a/dev-rust/thiserror/thiserror-1.0.20.ebuild b/dev-rust/thiserror/thiserror-1.0.20.ebuild
new file mode 100644
index 0000000..fbb8bf9
--- /dev/null
+++ b/dev-rust/thiserror/thiserror-1.0.20.ebuild
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="A convenient derive macro for the standard library's std::error::Error trait."
+HOMEPAGE="https://github.com/dtolnay/thiserror"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-rust/thiserror-impl-${PV}:=
+"
diff --git a/dev-rust/tiny_http/Manifest b/dev-rust/tiny_http/Manifest
new file mode 100644
index 0000000..6774c48
--- /dev/null
+++ b/dev-rust/tiny_http/Manifest
@@ -0,0 +1 @@
+DIST tiny_http-0.7.0.crate 40108 BLAKE2B 7080a75b5ac9520c945f2366317824bb2ebafee910ae6ea465eda98c27aac42413146fc0d47650487110685b98bde1831e7d5a267e30a728f0d5910e2340635f SHA512 bfc6a3d9671328aad370bbe6adeb56790e06492dc950aab0feeca6fb158ac65286fdbea07da896fa2bc99b9ea88fda60dafa1df5d94f39169ec1caf770550f51
diff --git a/dev-rust/tiny_http/files/tiny_http-0.7.0-0001-unix-socket-support.patch b/dev-rust/tiny_http/files/tiny_http-0.7.0-0001-unix-socket-support.patch
new file mode 100644
index 0000000..ab3663b
--- /dev/null
+++ b/dev-rust/tiny_http/files/tiny_http-0.7.0-0001-unix-socket-support.patch
@@ -0,0 +1,206 @@
+Add support for Unix Sockets
+
+* add support for Unix Sockets to Stream/RefinedTcpStream.
+* add a 'pub use' for ClientConnection and Stream
+* convert ClientConnection::new to take Into<Stream> instead of two
+  RefinedTcpStreams.
+* add a default SocketAddr value for if the stream returns an error.
+
+--- a/src/client.rs
++++ b/src/client.rs
+@@ -9,7 +9,7 @@ use std::str::FromStr;
+ 
+ use common::{HTTPVersion, Method};
+ use util::{SequentialReader, SequentialReaderBuilder, SequentialWriterBuilder};
+-use util::RefinedTcpStream;
++use util::{RefinedTcpStream, Stream};
+ 
+ use Request;
+ 
+@@ -17,7 +17,7 @@ use Request;
+ /// and return Request objects.
+ pub struct ClientConnection {
+     // address of the client
+-    remote_addr: IoResult<SocketAddr>,
++    remote_addr: SocketAddr,
+ 
+     // sequence of Readers to the stream, so that the data is not read in
+     //  the wrong order
+@@ -50,10 +50,11 @@ enum ReadError {
+ 
+ impl ClientConnection {
+     /// Creates a new ClientConnection that takes ownership of the TcpStream.
+-    pub fn new(write_socket: RefinedTcpStream, mut read_socket: RefinedTcpStream)
+-               -> ClientConnection
++    pub fn new<S>(stream: S) -> ClientConnection
++        where S: Into<Stream>
+     {
+-        let remote_addr = read_socket.peer_addr();
++        let (mut read_socket, write_socket) = RefinedTcpStream::new(stream);
++        let remote_addr = read_socket.peer_addr().unwrap_or(SocketAddr::from(([0,0,0,0], 0)));
+         let secure = read_socket.secure();
+ 
+         let mut source = SequentialReaderBuilder::new(BufReader::with_capacity(1024, read_socket));
+@@ -145,7 +146,7 @@ impl ClientConnection {
+ 
+         // building the next reader
+         let request = try!(::request::new_request(self.secure, method, path, version.clone(),
+-                headers, self.remote_addr.as_ref().unwrap().clone(), data_source, writer)
++                headers, self.remote_addr, data_source, writer)
+             .map_err(|e| {
+                 use request;
+                 match e {
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -116,8 +116,9 @@ use std::net::{ToSocketAddrs, TcpStream, Shutdown};
+ use std::time::Duration;
+ use std::sync::atomic::Ordering::Relaxed;
+ 
+-use client::ClientConnection;
++pub use client::ClientConnection;
+ use util::MessagesQueue;
++pub use util::Stream;
+ 
+ pub use common::{Header, HeaderField, HTTPVersion, Method, StatusCode};
+ pub use request::{Request, ReadWrite};
+@@ -282,28 +283,23 @@ impl Server {
+             while !inside_close_trigger.load(Relaxed) {
+                 let new_client = match server.accept() {
+                     Ok((sock, _)) => {
+-                        use util::RefinedTcpStream;
+-                        let (read_closable, write_closable) = match ssl {
+-                            None => {
+-                                RefinedTcpStream::new(sock)
+-                            },
++                        let stream = match ssl {
++                            None => sock,
+                             #[cfg(feature = "ssl")]
+                             Some(ref ssl) => {
+                                 let ssl = openssl::ssl::Ssl::new(ssl).expect("Couldn't create ssl");
+                                 // trying to apply SSL over the connection
+                                 // if an error occurs, we just close the socket and resume listening
+-                                let sock = match ssl.accept(sock) {
++                                match ssl.accept(sock) {
+                                     Ok(s) => s,
+                                     Err(_) => continue
+-                                };
+-
+-                                RefinedTcpStream::new(sock)
++                                }
+                             },
+                             #[cfg(not(feature = "ssl"))]
+                             Some(_) => unreachable!(),
+                         };
+ 
+-                        Ok(ClientConnection::new(write_closable, read_closable))
++                        Ok(ClientConnection::new(stream))
+                     },
+                     Err(e) => Err(e),
+                 };
+--- a/src/util/mod.rs
++++ b/src/util/mod.rs
+@@ -1,7 +1,7 @@
+ pub use self::custom_stream::CustomStream;
+ pub use self::equal_reader::EqualReader;
+ pub use self::messages_queue::MessagesQueue;
+-pub use self::refined_tcp_stream::RefinedTcpStream;
++pub use self::refined_tcp_stream::{RefinedTcpStream, Stream};
+ pub use self::sequential::{SequentialReaderBuilder, SequentialReader};
+ pub use self::sequential::{SequentialWriterBuilder, SequentialWriter};
+ pub use self::task_pool::TaskPool;
+--- a/src/util/refined_tcp_stream.rs
++++ b/src/util/refined_tcp_stream.rs
+@@ -1,6 +1,7 @@
+ use std::io::{Read, Write};
+ use std::io::Result as IoResult;
+ use std::net::{SocketAddr, TcpStream, Shutdown};
++use std::os::unix::net::UnixStream;
+ 
+ #[cfg(feature = "ssl")]
+ use std::sync::{Arc, Mutex};
+@@ -17,6 +18,7 @@ pub enum Stream {
+     Http(TcpStream),
+     #[cfg(feature = "ssl")]
+     Https(Arc<Mutex<SslStream<TcpStream>>>),
++    Unix(UnixStream),
+ }
+ 
+ impl From<TcpStream> for Stream {
+@@ -34,6 +36,13 @@ impl From<SslStream<TcpStream>> for Stream {
+     }
+ }
+ 
++impl From<UnixStream> for Stream {
++    #[inline]
++    fn from(stream: UnixStream) -> Stream {
++        Stream::Unix(stream)
++    }
++}
++
+ impl RefinedTcpStream {
+     pub fn new<S>(stream: S) -> (RefinedTcpStream, RefinedTcpStream)
+         where S: Into<Stream>
+@@ -44,6 +53,7 @@ impl RefinedTcpStream {
+             Stream::Http(ref stream) => Stream::Http(stream.try_clone().unwrap()),
+             #[cfg(feature = "ssl")]
+             Stream::Https(ref stream) => Stream::Https(stream.clone()),
++            Stream::Unix(ref stream) => Stream::Unix(stream.try_clone().unwrap()),
+         };
+ 
+         let read = RefinedTcpStream {
+@@ -68,6 +78,7 @@ impl RefinedTcpStream {
+             Stream::Http(_) => false,
+             #[cfg(feature = "ssl")]
+             Stream::Https(_) => true,
++            Stream::Unix(_) => false,
+         }
+     }
+ 
+@@ -76,6 +87,7 @@ impl RefinedTcpStream {
+             Stream::Http(ref mut stream) => stream.peer_addr(),
+             #[cfg(feature = "ssl")]
+             Stream::Https(ref mut stream) => stream.lock().unwrap().get_ref().peer_addr(),
++            Stream::Unix(_) => Err(std::io::Error::new(std::io::ErrorKind::Other, "Peer addresses are not supported for Unix sockets")),
+         }
+     }
+ }
+@@ -88,6 +100,7 @@ impl Drop for RefinedTcpStream {
+                 Stream::Http(ref mut stream) => stream.shutdown(Shutdown::Read).ok(),
+                 #[cfg(feature = "ssl")]
+                 Stream::Https(ref mut stream) => stream.lock().unwrap().get_mut().shutdown(Shutdown::Read).ok(),
++                Stream::Unix(ref mut stream) => stream.shutdown(Shutdown::Read).ok(),
+             };
+         }
+ 
+@@ -97,6 +110,7 @@ impl Drop for RefinedTcpStream {
+                 Stream::Http(ref mut stream) => stream.shutdown(Shutdown::Write).ok(),
+                 #[cfg(feature = "ssl")]
+                 Stream::Https(ref mut stream) => stream.lock().unwrap().get_mut().shutdown(Shutdown::Write).ok(),
++                Stream::Unix(ref mut stream) => stream.shutdown(Shutdown::Write).ok(),
+             };
+         }
+     }
+@@ -108,6 +122,7 @@ impl Read for RefinedTcpStream {
+             Stream::Http(ref mut stream) => stream.read(buf),
+             #[cfg(feature = "ssl")]
+             Stream::Https(ref mut stream) => stream.lock().unwrap().read(buf),
++            Stream::Unix(ref mut stream) => stream.read(buf),
+         }
+     }
+ }
+@@ -118,6 +133,7 @@ impl Write for RefinedTcpStream {
+             Stream::Http(ref mut stream) => stream.write(buf),
+             #[cfg(feature = "ssl")]
+             Stream::Https(ref mut stream) => stream.lock().unwrap().write(buf),
++            Stream::Unix(ref mut stream) => stream.write(buf),
+         }
+     }
+ 
+@@ -126,6 +142,7 @@ impl Write for RefinedTcpStream {
+             Stream::Http(ref mut stream) => stream.flush(),
+             #[cfg(feature = "ssl")]
+             Stream::Https(ref mut stream) => stream.lock().unwrap().flush(),
++            Stream::Unix(ref mut stream) => stream.flush(),
+         }
+     }
+ }
diff --git a/dev-rust/tiny_http/files/tiny_http-0.7.0-0002-remove-ssl-dependency.patch b/dev-rust/tiny_http/files/tiny_http-0.7.0-0002-remove-ssl-dependency.patch
new file mode 100644
index 0000000..5706b12
--- /dev/null
+++ b/dev-rust/tiny_http/files/tiny_http-0.7.0-0002-remove-ssl-dependency.patch
@@ -0,0 +1,18 @@
+--- a/Cargo.toml
++++ b/Cargo.toml 
+@@ -31,10 +31,6 @@
+ [dependencies.log]
+ version = "0.4"
+ 
+-[dependencies.openssl]
+-version = "0.10"
+-optional = true
+-
+ [dependencies.url]
+ version = "2"
+ [dev-dependencies.fdlimit]
+@@ -48,4 +44,3 @@
+ 
+ [features]
+ default = []
+-ssl = ["openssl"]
diff --git a/dev-rust/tiny_http/tiny_http-0.7.0.ebuild b/dev-rust/tiny_http/tiny_http-0.7.0.ebuild
new file mode 100644
index 0000000..15ed96f
--- /dev/null
+++ b/dev-rust/tiny_http/tiny_http-0.7.0.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="Low level HTTP server library"
+HOMEPAGE="https://docs.rs/crate/tiny_http/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	=dev-rust/ascii-1*:=
+	=dev-rust/chunked_transfer-1*:=
+	=dev-rust/url-2*:=
+	=dev-rust/chrono-0.4*:=
+	=dev-rust/log-0.4*:=
+"
+
+PATCHES=(
+	"${FILESDIR}/${P}-0001-unix-socket-support.patch"
+	"${FILESDIR}/${P}-0002-remove-ssl-dependency.patch"
+)
diff --git a/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r7.ebuild b/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r7.ebuild
deleted file mode 100644
index 9188cdf..0000000
--- a/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r7.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="1aba54c4e2b63e38e55eefb30316dc725326ea65"
-CROS_WORKON_TREE="d5bedf0d1e651c4e80acc3eec06dedbd31b3d05e"
-CROS_WORKON_PROJECT="chromiumos/third_party/tlsdate"
-CROS_WORKON_LOCALNAME="tlsdate"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Rust D-Bus bindings for tlsdate."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/tlsdate/+/master/"
-
-LICENSE="BSD-Google"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	chromeos-base/chromeos-dbus-bindings-rust:=
-	=dev-rust/dbus-0.6*:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r9.ebuild b/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r9.ebuild
new file mode 100644
index 0000000..43fb92e
--- /dev/null
+++ b/dev-rust/tlsdate_dbus/tlsdate_dbus-0.24.52-r9.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="bb662be7e5f24f0d2d61b8e655c4cd358356f06e"
+CROS_WORKON_TREE="cc72be195ede90b09a9ae394923ac01be3ce4081"
+CROS_WORKON_PROJECT="chromiumos/third_party/tlsdate"
+CROS_WORKON_LOCALNAME="tlsdate"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust D-Bus bindings for tlsdate."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/tlsdate/+/master/"
+
+LICENSE="BSD-Google"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/dev-rust/tlsdate_dbus/tlsdate_dbus-9999.ebuild b/dev-rust/tlsdate_dbus/tlsdate_dbus-9999.ebuild
index 995e62a..08e30af9 100644
--- a/dev-rust/tlsdate_dbus/tlsdate_dbus-9999.ebuild
+++ b/dev-rust/tlsdate_dbus/tlsdate_dbus-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2019 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 CROS_WORKON_PROJECT="chromiumos/third_party/tlsdate"
 CROS_WORKON_LOCALNAME="tlsdate"
@@ -18,8 +18,8 @@
 RDEPEND=""
 
 DEPEND="${RDEPEND}
-	chromeos-base/chromeos-dbus-bindings-rust:=
-	=dev-rust/dbus-0.6*:=
+	>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:=
+	=dev-rust/dbus-0.8*:=
 "
 
 src_unpack() {
diff --git a/dev-rust/trace_events/trace_events-0.1.0-r5.ebuild b/dev-rust/trace_events/trace_events-0.1.0-r5.ebuild
deleted file mode 100644
index bd2a05f..0000000
--- a/dev-rust/trace_events/trace_events-0.1.0-r5.ebuild
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="ef93e73ca16f1171431fcb19fb4fc74ff78d247f"
-CROS_WORKON_TREE="e509681943a4a652c4575e6da2260621c04c8500"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=0
-CROS_WORKON_SUBTREE="trace_events"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Infrastructure for clients to emit trace events."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trace_events/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="=dev-rust/libc-0.2*:=
-	=dev-rust/criterion-0.2*:=
-	>=dev-rust/serde_json-1:=
-"
-
-RDEPEND="!!<=dev-rust/trace_events-0.1.0-r2"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/trace_events"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		ecargo_test
-	fi
-}
-
-src_install() {
-	pushd trace_events > /dev/null || die
-	cros-rust_publish trace_events "$(cros-rust_get_crate_version .)"
-	popd > /dev/null || die
-	pushd json_tracer > /dev/null || die
-	cros-rust_publish json_tracer "$(cros-rust_get_crate_version .)"
-	popd > /dev/null || die
-	pushd trace_events_macros > /dev/null || die
-	cros-rust_publish trace_events_macros "$(cros-rust_get_crate_version .)"
-}
-
-pkg_postinst() {
-	cros-rust_pkg_postinst trace_events
-	cros-rust_pkg_postinst json_tracer
-	cros-rust_pkg_postinst trace_events_macros
-}
-
-pkg_prerm() {
-	cros-rust_pkg_prerm trace_events
-	cros-rust_pkg_prerm json_tracer
-	cros-rust_pkg_prerm trace_events_macros
-}
diff --git a/dev-rust/trace_events/trace_events-0.1.0-r6.ebuild b/dev-rust/trace_events/trace_events-0.1.0-r6.ebuild
new file mode 100644
index 0000000..7a5cbc1
--- /dev/null
+++ b/dev-rust/trace_events/trace_events-0.1.0-r6.ebuild
@@ -0,0 +1,75 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d565cc29fe7617433189357337f0010c560bf83c"
+CROS_WORKON_TREE="e509681943a4a652c4575e6da2260621c04c8500"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=0
+CROS_WORKON_SUBTREE="trace_events"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Infrastructure for clients to emit trace events."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/trace_events/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="=dev-rust/libc-0.2*:=
+	=dev-rust/criterion-0.2*:=
+	>=dev-rust/serde_json-1:=
+"
+
+RDEPEND="!!<=dev-rust/trace_events-0.1.0-r2"
+
+pkg_setup() {
+	cros-rust_pkg_setup trace_events
+	cros-rust_pkg_setup json_tracer
+	cros-rust_pkg_setup trace_events_macros
+}
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/trace_events"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		ecargo_test
+	fi
+}
+
+src_install() {
+	pushd trace_events > /dev/null || die
+	cros-rust_publish trace_events "$(cros-rust_get_crate_version .)"
+	popd > /dev/null || die
+	pushd json_tracer > /dev/null || die
+	cros-rust_publish json_tracer "$(cros-rust_get_crate_version .)"
+	popd > /dev/null || die
+	pushd trace_events_macros > /dev/null || die
+	cros-rust_publish trace_events_macros "$(cros-rust_get_crate_version .)"
+}
+
+pkg_postinst() {
+	cros-rust_pkg_postinst trace_events
+	cros-rust_pkg_postinst json_tracer
+	cros-rust_pkg_postinst trace_events_macros
+}
+
+pkg_prerm() {
+	cros-rust_pkg_prerm trace_events
+	cros-rust_pkg_prerm json_tracer
+	cros-rust_pkg_prerm trace_events_macros
+}
diff --git a/dev-rust/trace_events/trace_events-9999.ebuild b/dev-rust/trace_events/trace_events-9999.ebuild
index c7927ac..6a655c3 100644
--- a/dev-rust/trace_events/trace_events-9999.ebuild
+++ b/dev-rust/trace_events/trace_events-9999.ebuild
@@ -24,6 +24,12 @@
 
 RDEPEND="!!<=dev-rust/trace_events-0.1.0-r2"
 
+pkg_setup() {
+	cros-rust_pkg_setup trace_events
+	cros-rust_pkg_setup json_tracer
+	cros-rust_pkg_setup trace_events_macros
+}
+
 src_unpack() {
 	cros-workon_src_unpack
 	S+="/trace_events"
diff --git a/dev-rust/trust-dns-proto/files/trust-dns-proto-0.7.3-0002-Support-Pointer-Label-Compression.patch b/dev-rust/trust-dns-proto/files/trust-dns-proto-0.7.3-0002-Support-Pointer-Label-Compression.patch
new file mode 100644
index 0000000..6b4d95b
--- /dev/null
+++ b/dev-rust/trust-dns-proto/files/trust-dns-proto-0.7.3-0002-Support-Pointer-Label-Compression.patch
@@ -0,0 +1,95 @@
+Support pointer ending label compression. Pull request merged: https://github.com/bluejekyll/trust-dns/pull/1182
+--- a/src/rr/domain/name.rs
++++ b/src/rr/domain/name.rs
+@@ -1322,6 +1322,42 @@ mod tests {
+         assert_eq!(fourth, r_test);
+     }
+ 
++    #[test]
++    fn test_pointer_with_pointer_ending_labels() {
++        let mut bytes: Vec<u8> = Vec::with_capacity(512);
++
++        let first = Name::from_str("ra.rb.rc").unwrap();
++        let second = Name::from_str("ra.rc").unwrap();
++        let third = Name::from_str("ra.rc").unwrap();
++
++        {
++            let mut e = BinEncoder::new(&mut bytes);
++
++            first.emit(&mut e).unwrap();
++            assert_eq!(e.len(), 10);
++
++            second.emit(&mut e).unwrap();
++            // +5 with the first +3 being the text form of "ra" and +2 for the pointer to "rc".
++            assert_eq!(e.len(), 15);
++
++            // +2 with the pointer to "ra.rc" as previously seen.
++            third.emit(&mut e).unwrap();
++            assert_eq!(e.len(), 17);
++        }
++
++        // now read them back
++        let mut d = BinDecoder::new(&bytes);
++
++        let r_test = Name::read(&mut d).unwrap();
++        assert_eq!(first, r_test);
++
++        let r_test = Name::read(&mut d).unwrap();
++        assert_eq!(second, r_test);
++
++        let r_test = Name::read(&mut d).unwrap();
++        assert_eq!(third, r_test);
++    }
++
+     #[test]
+     fn test_recursive_pointer() {
+         // points to an invalid begining label marker
+--- a/src/serialize/binary/encoder.rs
++++ b/src/serialize/binary/encoder.rs
+@@ -91,8 +91,8 @@ mod private {
+ pub struct BinEncoder<'a> {
+     offset: usize,
+     buffer: private::MaximalBuf<'a>,
+-    /// start and end of label pointers, smallvec here?
+-    name_pointers: Vec<(usize, usize)>,
++    /// start of label pointers with their labels in fully decompressed form for easy comparison, smallvec here?
++    name_pointers: Vec<(usize, Vec<u8>)>,
+     mode: EncodeMode,
+     canonical_names: bool,
+ }
+@@ -211,8 +211,7 @@ impl<'a> BinEncoder<'a> {
+     pub fn trim(&mut self) {
+         let offset = self.offset;
+         self.buffer.truncate(offset);
+-        self.name_pointers
+-            .retain(|&(start, end)| start < offset && end <= offset);
++        self.name_pointers.retain(|&(start, _)| start < offset);
+     }
+ 
+     // /// returns an error if the maximum buffer size would be exceeded with the addition number of elements
+@@ -243,7 +242,8 @@ impl<'a> BinEncoder<'a> {
+         assert!(end <= (u16::max_value() as usize));
+         assert!(start <= end);
+         if self.offset < 0x3FFF_usize {
+-            self.name_pointers.push((start, end)); // the next char will be at the len() location
++            self.name_pointers
++                .push((start, self.slice_of(start, end).to_vec())); // the next char will be at the len() location
+         }
+     }
+ 
+@@ -251,11 +251,10 @@ impl<'a> BinEncoder<'a> {
+     pub fn get_label_pointer(&self, start: usize, end: usize) -> Option<u16> {
+         let search = self.slice_of(start, end);
+ 
+-        for &(match_start, match_end) in &self.name_pointers {
+-            let matcher = self.slice_of(match_start as usize, match_end as usize);
+-            if matcher == search {
+-                assert!(match_start <= (u16::max_value() as usize));
+-                return Some(match_start as u16);
++        for (match_start, matcher) in &self.name_pointers {
++            if matcher.as_slice() == search {
++                assert!(match_start <= &(u16::max_value() as usize));
++                return Some(*match_start as u16);
+             }
+         }
+ 
diff --git a/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3-r3.ebuild b/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3-r3.ebuild
new file mode 120000
index 0000000..557bfec
--- /dev/null
+++ b/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3-r3.ebuild
@@ -0,0 +1 @@
+trust-dns-proto-0.7.3.ebuild
\ No newline at end of file
diff --git a/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3.ebuild b/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3.ebuild
index 5cdd980..d27766b 100644
--- a/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3.ebuild
+++ b/dev-rust/trust-dns-proto/trust-dns-proto-0.7.3.ebuild
@@ -42,4 +42,5 @@
 
 PATCHES=(
 	"${FILESDIR}/${P}-0001-Remove-optional-features.patch"
+	"${FILESDIR}/${P}-0002-Support-Pointer-Label-Compression.patch"
 )
diff --git a/dev-rust/xml-rs/Manifest b/dev-rust/xml-rs/Manifest
index 4cd7676..8a95a9e 100644
--- a/dev-rust/xml-rs/Manifest
+++ b/dev-rust/xml-rs/Manifest
@@ -1 +1,2 @@
 DIST xml-rs-0.3.6.crate 48158 BLAKE2B 1f97a6950c16b9310c01eecde3474ae75d51071c49a214c5ed5ce3a9824c3add3bf88801dde559ce84066ff5d1bbffd1fc63cf7c27c9f0427fe3cbb9724d1bbf SHA512 fb7f702808c1ddba3b7ba5e27b68fd3a9d4e0c5d90e2e31f290b9387d994abad6ffeeef19eeeca5a111aa137d1aa125dcde9050c73439191746501758abfaba1
+DIST xml-rs-0.8.3.crate 52547 BLAKE2B cffdece0269b9c04c763481af3a3a25df53d7593552c0956a0efa30669aae497e7c4865c92bcf267f4d7684d0ab957fab3d62b76a241fbfd6497eae25bd9154f SHA512 e44048aa2a010c6242d79c8590bceb300d7056cfd1397c4e4e4411089a3c3686b49603fc2336ea69596b6775b729f1197ab6d9d7d8f83a758e2d962c07aec033
diff --git a/dev-rust/xml-rs/xml-rs-0.8.3.ebuild b/dev-rust/xml-rs/xml-rs-0.8.3.ebuild
new file mode 100644
index 0000000..54ac759
--- /dev/null
+++ b/dev-rust/xml-rs/xml-rs-0.8.3.ebuild
@@ -0,0 +1,18 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="An XML library in pure Rust."
+HOMEPAGE="http://netvl.github.io/xml-rs/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+LICENSE="MIT"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND=""
diff --git a/dev-rust/yaml-rust/Manifest b/dev-rust/yaml-rust/Manifest
new file mode 100644
index 0000000..364116e
--- /dev/null
+++ b/dev-rust/yaml-rust/Manifest
@@ -0,0 +1 @@
+DIST yaml-rust-0.4.3.crate 45768 BLAKE2B 6af7374439000dc5e8795b26fccb1bc691040846f844e10765fe5df06237f5cf52752b0f9d25ed7c6f62337f628ee7be2e024f8aeb6b55a7c76f0d3b2ad0489c SHA512 31b0236fe041706befa938cdeb9c74940daccd2f80bdbd4e0e890901c868ecffc39367a41914c8bb98373d1002904f18b18ff13a08bbecd19dec634c08b7a7a3
diff --git a/dev-rust/yaml-rust/yaml-rust-0.4.3.ebuild b/dev-rust/yaml-rust/yaml-rust-0.4.3.ebuild
new file mode 100644
index 0000000..55fe3bb
--- /dev/null
+++ b/dev-rust/yaml-rust/yaml-rust-0.4.3.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_RUST_REMOVE_DEV_DEPS=1
+
+inherit cros-rust
+
+DESCRIPTION="The missing YAML 1.2 parser for rust"
+HOMEPAGE="https://docs.rs/yaml-rust/"
+SRC_URI="https://crates.io/api/v1/crates/${PN}/${PV}/download -> ${P}.crate"
+
+
+LICENSE="|| ( MIT Apache-2.0 )"
+SLOT="${PV}/${PR}"
+KEYWORDS="*"
+
+DEPEND="
+	>=dev-rust/linked-hash-map-0.0.9:=
+	<dev-rust/linked-hash-map-0.6
+"
diff --git a/dev-util/cargo/Manifest b/dev-util/cargo/Manifest
deleted file mode 100644
index e3e68d3..0000000
--- a/dev-util/cargo/Manifest
+++ /dev/null
@@ -1,160 +0,0 @@
-DIST adler32-1.0.3.crate 5734 BLAKE2B 31cd43d1e13b5e854a195824084dc34a157ef59cccabaa335cfba2de532096046bbb66a9fce2430979b243509d608bfef752c46d80bdcc7e420e039269d575a3 SHA512 2128cc34abc74a363b18eec5abf414b95e4d84bfd99b6508ac807e13c026ad0e37e67b5a8c429212b85e78071f03e0df24ee70db5995772c4bc78acfb0234459
-DIST aho-corasick-0.6.10.crate 26122 BLAKE2B 752eccb2fbf36fbc73b8694033d2f80f6ab6d2a8c2ae023329b90bb252b537adb1e80a604b4266bfb1ccc2963fcaa6579be48ef011c9728734c7cb77fa3eab99 SHA512 4a21b0e68c416e5dcfe99ded917577abdbe7c92e50227b7906a2b3bd25105f8e7d03103514d388171a41090cc7bcb63bb5b4dc3c6847a9b4e09bb3856a1bbd9d
-DIST ansi_term-0.11.0.crate 17087 BLAKE2B 9bd35c045a01ce4c6c4a5db1b4f15e9412bb97426eec19d4421dffbec633de8d13452c13c1dc1b30998690b78d7ed38311aca700087f13a81f66bd1d5d7300c4 SHA512 a637466a380748f939b3af090b8c0333f35581925bc03f4dda9b3f95d338836403cf5487ae3af9ff68f8245a837f8ab061aabe57a126a6a2c20f2e972c77d1fa
-DIST atty-0.2.11.crate 5916 BLAKE2B e502c23faaa9dd27cc5865b68a721b0403071edb483fca0c745707f4c0ca1b1787b5677b2d8ad7f327b8f5588ba784126ce78496c1db54f7ca4ce0ccea669499 SHA512 9d6417dc1e8abdb4969418525b36c451274fd76769adb57bef9875ef62ef521c50d58626ebc4f96d2bea32cbadb6999fd67653b570293d7253b403b6d0736c79
-DIST autocfg-0.1.2.crate 10444 BLAKE2B 1e37c97d6d309a5250552fc4c38066ba004674af6e6d091f08b24f47475c11b2db4b0967ce55d2208b9e2ba080e2bcb4b4226acd0da9d4c15dd844827ea6f0b4 SHA512 0f692f4062d22be01c32af2ceb6ed3887a7d65843e1a6ec696fbaa46517d02e62d573055efe5da3a63847f05bc37b254bf2dd750738b528774f63352eacdabe4
-DIST backtrace-0.3.14.crate 33452 BLAKE2B a3177739d2d2877a5b0257636b6a14b1fdb7aee440fbbafb9602a199b09b73702132e99bd4826245371f9a9acf33739dcce9b15e7ab6be4c29e0c30ed2b6a9b5 SHA512 6ed74aaa996c30b7d97e2eee2aff72347ed3d26d6f5e9f5af4047dcf13170fcd9ea8edf7e44134faabfa34d41de0700f8c4b814f81e8f450729ef5db2d03a435
-DIST backtrace-sys-0.1.28.crate 522603 BLAKE2B 6150bee74264cf2383aa27cd33b28790b3c70da0c21c327dbc4af628b5f12afe941c1f3ecbb556f8dec5638b6be29f5db3867514417b267d7099202c5ea89f52 SHA512 4b16bc8500258d0e75db0c6cca3e2a68d9024106a0e8a4a46cf5865fe1e08304d9291a6723e4fd337b7d7f5bb14e9cec7b3aa2e40bbaa4642562764c803d345d
-DIST bit-set-0.5.1.crate 14125 BLAKE2B 570b78834400bd6d69b2ad4a3a77766941503fceee069f9b616eab00fe7aff40fb25fc44b1f6506997bd655511c3e941afb0f9bf220b414e4e8cb8a6de4e93da SHA512 1b58b9a1e6dc33483f302415e0a77544dab288c819ed5d899f6ef3969750a17227c5aeb1b563aef41e77e06e665cfa995e358a566f5783a2d3af0087d5fc65c1
-DIST bit-vec-0.5.1.crate 18765 BLAKE2B 17d08d7813893a02a588197f84d9c5bbce574f77150d018889f690902691d83bd42eed4ca9b968789915d09c84e32147b1631ca6323a9fbfd328f6734196c5dc SHA512 c0d57ec2c07ea660919ab7e17881b544496de0d6ee51cc8008b7da0bb39a2dd1ca680cc07051e007d6efaa91b25335e13a799e11a7a9d9a8084cc47525742cc7
-DIST bitflags-1.0.4.crate 15282 BLAKE2B 63f5feb47460c344983cef8822804b1c4ac2f3adfffcf206df2b05fafb9c7bfd73986721cde46705a3e4a0dc72a40683e4d369f2339adfc1b55208bad1766875 SHA512 81850d2be62eabb8486024ab263da67e6eb8ebfa732cac3a5d46a9186c564b2065cba15fa3da468bbd26eaf2b67038680e5de19d5dd99d78f60dae8a1776c8de
-DIST bufstream-0.1.4.crate 8741 BLAKE2B ee8913b2efc3b0b507d8abcfb86ada7924e4f30554907f9cd690b42616ddae7644dbf9f69d6d0ad599f6db1d4ce3ffecff1c8cdf5900fff110871f76a1417b0a SHA512 bc5029c826280e51231e2893474a964762fa6456a7fee043ba32ce262ea4f0240056e352267c5e66510e737217c8841061672336631b5eb763212a6e5df5ac9e
-DIST build_const-0.2.1.crate 4499 BLAKE2B da7f1040560862b76447426be8884bf0ac62d2f2faca0a572b8cf566fcbbaaf27dd1f260fb1333c3cf9410251433239616aaf0ca1a2be644fd4cbcc2b908eeb1 SHA512 4e210078ad781bd645381f469285f0e4d20cc8c416818c27d98c0033f070b708a6ab27933f9c3660c83e6cbfb3afcb7ec753f9c186b0c75b99db37dff1cde658
-DIST byteorder-1.3.1.crate 20959 BLAKE2B dcc5d3b97a0bd82272616599454673790d64d799b699b9e339feaf1d8a75b64b6f4cde19642d5359babf6c769b14325b89a51d29594f1e8ce48c2190348bd4cf SHA512 b8d8273293f776cf567dbb9357e73a65cfd352461963b2ba202959bb48338f5e14eaebb221f940c09dc0b3214924e40194f6952c32631f20a18030ad22258c25
-DIST bytes-0.4.12.crate 46361 BLAKE2B 991f1d9170e7d3438c7d74507e6274df551d483883b3be2d99f7bbc0611ee6bd3f8f45c0e086cfa5488e8fc00e36e9a549fc71a325ff62b9bb83bd8fd412b5df SHA512 5f603532ea2f04cbc53044422feed1667bf0486af398c9c8e2ce7b4601b37e1c47223201970fb0d17fed77fef7e89961e0ac05a30e6cc9bf13462d98bc587250
-DIST bytesize-1.0.0.crate 7522 BLAKE2B cd4f9687753ec1ea4e7435f34b64afdf6e5534d33515d00c413da37081dea57eb76b2f3b8e001e65ca40908efccddcfa458ce1e3b5974aa79232567d9df7faff SHA512 a8837bc05efbf6faf55ce76cffb0f8ef2f47baad2f65875da246f4a8f1052af0fcd8f156950deac0e57e015183d740e0d8ced1e6da1aaecf03244ad370d926b8
-DIST cargo-0.34.0-aarch64-unknown-linux-gnu.tar.xz 4064328 BLAKE2B 08e506d00ffc138d5b62e0a411653c8af6e6a187578b9cec4a3e9aa0b2af8a5f0fc91e5b5acaefc67f95210f41930d3c16e98eb6ba3220504ca66d077378e4cb SHA512 05bb38ed99eb489f5cab46bf859fa93538ffd88d8e509fcb3496b8398457b773ffd410201ef7d52c245a18c8d26d50307d1e573d2930562463bc7beda0e3a7ee
-DIST cargo-0.34.0-arm-unknown-linux-gnueabi.tar.xz 4101112 BLAKE2B c605a21626d25cee7a5153e1944d1ae149e3269f518fa2f69c235e4679ff96695a717d0e3eacd7c13a04388c7d6cc136c3082fe35ab62a1b24e24db266f68c83 SHA512 f74700ca4efec895a759ed9edae7520336cec7f9b8590238753c929ef451751947d4f70359d5e1634b40964208bd0fa7592249eff7d54f5b294af75c6cb4e971
-DIST cargo-0.34.0-arm-unknown-linux-gnueabihf.tar.xz 4136536 BLAKE2B df0a01983caf14cc856035c10902bea9b390f47bd373ba979cbd9b2950d08ef73c78549fc858440c12eda90d8d432d4c3a142efbafdb91bccca873d812dbda1c SHA512 f93f263fc4c767b394bc57e0f4941758ecba7cd83b334a31d941ec4a7f1e09aa1340625481b7c785a6dbe561c0a7a09f77d0bd352a856623c3fe5db699517b73
-DIST cargo-0.34.0-armv7-unknown-linux-gnueabihf.tar.xz 4173692 BLAKE2B ac33515b8c521d39a885084c8ae5df20d28bc0206caff9304cb85ac3970317b8dfb39e14c1b967340230997de8a551d5657c513526b4d848f1254badc07dc839 SHA512 e9eaabe6004d546b09801b155b2b705366949c1c037b98c7e714681e0122738ace0a4ad5b1bdc8c99a1a95561f9bbf476d76208807d8aeb5c311542bdccf2a2e
-DIST cargo-0.34.0-i686-unknown-linux-gnu.tar.xz 4732084 BLAKE2B 9d095d441fa5060cbe91ec2ad39d8d6098ec99f294e6d2cd847d469d8cf0a638129c91f7d5ac287f4aafca6d6e0d4d6b24991e87ecb03094cbf8bbeeaba51535 SHA512 3f603bad1830cbb0603ac31997eab4880223544e01978dd915b4e155130b56395a0086a124d8b9b720fa72f2111bec32e7c5fb4b58c4a05ffb61b1a64e2d0df3
-DIST cargo-0.34.0-x86_64-unknown-linux-gnu.tar.xz 4656620 BLAKE2B bdb35e44a182bd032b189966d3d1e08e4452b2f12a1e2cd1a6aa3647bc39e8c027fb15dedab338594381eefeba97c8d104cf6d4d447a3e279d45e288b86b8d9f SHA512 fe9b21b3d937c44fb6463d3fe7df11316b11289665a194fd3467e2a151ee3c0ce0841cd4c6fd9e52ddbc4e192c8578a760921247d7b0ddc9c3019d572c507fe1
-DIST cargo-0.35.0.tar.gz 942600 BLAKE2B 0cec3527e04386016efe73b8c46800c8573689a919fe0169f539f41064ac191461d6a7fd2857df9901f1f21426beacb323a1e5c0d770ef6756cfcf0618ed2566 SHA512 0ea4f91c54b2a54a68de920c469b2922cced4933db76150cf0688e96f3f72ba037119b5b27d0c519ccdde8e1d241caa310ec8d51a54ed509bd11d0004af14fa6
-DIST cc-1.0.31.crate 42956 BLAKE2B 87e79061397a0e12ad4f3a32ab0b4bba764260c7de11eea055163538c749e8da32b95ad5efcb69ab72d210e0e7aed68c79f9ece33352b4cdacc5c1ec6d11f3cb SHA512 d6efba4c53fc8f11fdd685efb2759dbbbe53e65ae7878a61805b110c5a6028debb89a3e6d740bf7fd71055613de4fe92daaa98f34f86473c5a410ce3f17052df
-DIST cfg-if-0.1.7.crate 7360 BLAKE2B 0f9a457501441c9d3408a40efb199eeee196490bc22f4c14565703ee09dacac2a0b4e1704c05853bd4662977d487c7723521cb733881a9bafad3ff46d775acd0 SHA512 30a1510f0a217e588e9a2c1ef51e6188d7437c63641284782262fa9a2ec78f04d0bbdac7ce32c0e8282e2e518d4b6c9d6ed0c2658baac412133ad1cc1f8d43a4
-DIST chrono-0.4.6.crate 133108 BLAKE2B ac9573577f4ea6516007df2f9948f9df4e8170e53119ba7cf1e55592bc594bd1cbf05759ce2baf9b6397b68a72aa9e0518ab0b7a9c63bd043ee4a7a8b81e36b4 SHA512 c869cab6da906d50531476c892510042eeccb3daf790ef13b3014121c805b3f8e23c7a6ffccb3bb11d15a1615e997df4180e41f0140a2c327cc816b94f28976d
-DIST clap-2.32.0.crate 196073 BLAKE2B c262241a3ad1d0f944467f4ea9884ca3dc05b5e05656fd7b73700e0daeec035c07a5d06316cc1273e37f74f2c00429b0ee99da298804dc4deff9a252ca56ce07 SHA512 ee2a66cec0d867d73fce35c055bcac77cc3ea9537b355be04be3ee17ddabefebfe3649cbdfc30ea356c54cf9f066369540eac4f5dc67e60cdadc9c66be014ef0
-DIST cloudabi-0.0.3.crate 22156 BLAKE2B e12054fd474754031f8f5038d5e2829e1586db974d38230cfd8774db591a58dfdcaea9fb61fc0b35366889d348b2c73ceaabbb462f1abeeffeaab167013c986f SHA512 691ed793e9b35ba382f03897f4c0efc31a528394862a27b814ba8993ad30bbe0ebc9808484baf580e8b69d9c13ad1612776a1efd0f6981545b420139ff83592c
-DIST commoncrypto-0.2.0.crate 3009 BLAKE2B 174f3099955d595040005ef201361bacc3084f5218efb0f20df8082b9bb683909a10ade64af7062edfafadb9674b27a06836f2333fdaa7d2926b207355f7a40c SHA512 61f567468221cc46b30b31ce96dba26e3dd3a9245a8d37f9f8a615b346d992c261db059bdc678882415c608a806bd45c7b38a5bfb562ad96a111cee8e1082e85
-DIST commoncrypto-sys-0.2.0.crate 4338 BLAKE2B 992a06d56adc97a9d02c547766c2be2f1973507fc0083e50c623dc4ac554681b802f3fb5ef61ef430e4a58bda000170636cf6e38430550e0c0506438901fae20 SHA512 06851fbe0b87224f6c8333964237badf57f32256acb7e647ac2da16561701b7572c12509e042d0d1032a54c94c1663bc2ff19ef5ba3a7daf84276f2544bfba8e
-DIST core-foundation-0.6.3.crate 24267 BLAKE2B 8e7ca9a19db4e51aed67df420ed50d4096d39be8485cdfc205185e3647791f27227773f466e50af3a734306880bb8f7f2236f6ef3281b5130c1fedd33f7069ed SHA512 7a21e003787738763c031934054d3105d8b573d0d52696a30c9c44e1d795b5c2e1ff0e3bd4607187004c176bd0e92461d9f037f062241b5ccbff151999179525
-DIST core-foundation-sys-0.6.2.crate 16204 BLAKE2B 32766d4b23a2b108777c57b2115cc718a0cdb42fcd2e3973a0adf944d326e0796a6953756c42140eb4e6e96a2609bfb41f84a54c59b4b840d7213f3c5dd4234e SHA512 bfbe4e77a5e2644952c66a2afd21058a07583d3a1776c34dbfc316d159289073d92b8672eaab2f39fa46c48cd7f22d88f0354f02b3208482d700473a807ebf07
-DIST crc-1.8.1.crate 9114 BLAKE2B cd96400652888e700c326a2842005c8bee699ccf3c61b87320c01196b455a55da511749241af75e903a76847beb8172598dc8f770779aefe945db7934976afbb SHA512 db0b3d0ca197cb2a2049720b753061f1532d1ba2c86c7befce36a18cb4e8008b061e39e26960b4d9dcf1e7ea55348f55c441da5d17cd0a424402a8489d52ed1a
-DIST crc32fast-1.2.0.crate 39161 BLAKE2B f71c85801f945602d53f93ce251c978c91f63fcd92fecba5083fff0f06738697e99d92c17a824605d5d56b3224db224ff32e4b147b6f6af47ae714dcd511e7cd SHA512 2ee73e0642f83e28034c1baca65156e65d751214e83f2a4ce94b6add5ba11f74ffc80832a3348ece1c099367be2b11e820dfb349fae89fbced1b68bd6b0466f0
-DIST crossbeam-channel-0.3.8.crate 79923 BLAKE2B dae78c49f0a2c425c20481a9ab1150fa8fc1c1bb8007747f3cfa9b9e763f72c8f440b62f7d6ccc6f5a92ad0545a2b0918d71fd3e7ce1bb4af95c583696d0cda1 SHA512 9b4c4b9345276b0227041a64f7ea4971dcd37ac5a2d404408d7e1875cd9a1318cbbee0cd91d4ba4b73201927ae61cf35382d2c8ef9461f21d71e802d01063583
-DIST crossbeam-utils-0.6.5.crate 31735 BLAKE2B adeec7df0627b73169e04b53883f44b9d4c54f0b97ef2e49cfadc565c5c3324bf3dfe39158a65ec4b6676a8fba2696d43b2ce1aea75fb8bf2120ff4ad9eb45f9 SHA512 5bcf3eed8f28d608b675aa4588b133393ced515e2f7fa37b413b34aa5ee550100899d957906dd04fcaee68cea57d2c8f230e06d6903f5ef117c9313d6cdbc2a8
-DIST crypto-hash-0.3.3.crate 8139 BLAKE2B f42f7879369c90ded8dab271d5f207a327722dc3a5e386a31c60ca78e71198d3f44d2583bedf23530eda4970f6bbbcb2f4dab3855dd9c0095a5cdcc1a89f887e SHA512 a4c48e543f45c0752c4057ffcf0d6d50f7238a0b43cc509ad8451412a46df7f45f917cf3df26a6e3aa6fa66d73eb459c43c24d23d0f5107bbe585e412bd27954
-DIST curl-0.4.20.crate 73228 BLAKE2B 79ef3f9b602baef5cbd94bc1c7d5892283b4b7d3c24e5bc5a5537db61421ff6056aa5b6fbe95c4423065e4fc722863c8193775a984bf7e5714c627516063f372 SHA512 0c6b00c184b6e5381740eee42f124b593beb3e35250794c4026779146b9560b71be9bdc7852c0ca35a4423f3e58e8cdbb9d2f1fcd0eb556424627a0bd9814c9e
-DIST curl-sys-0.4.17.crate 2855342 BLAKE2B b5fc6db08feb85ac9360b94ec5bfa7901c6efdaf08222b5d0c3774ed937cec1bd8377f492fc0ef2b39dac93c381b92f8d5018cd3d8cbd93dcf66d164ea20b05e SHA512 e0b1db564ac22d7d2bb09122393fcdf3cfc196490ad344d4c8023636fe8dc553ed6fe94c7bba3027cca3d707ea511e95294c31bd3ea676f094126677e934e8c8
-DIST env_logger-0.6.1.crate 28567 BLAKE2B a7302e44a807dcb1b523e1dde683a040837b1de2fbda5e8e7347478f77d4b7a39521aadd1d6d42dffbb6229e0dd6bd1b2b9fc47b860db45281a95612dd78faab SHA512 7e5142fa24e46aeb246515f42f9fc561364f266a693ec9f8c45dbe96d31174bf5663ef6233f41a5f96849dd19b61e2a97ab7ca1a7a55c51f741f4efa5af371c5
-DIST failure-0.1.5.crate 36749 BLAKE2B 97fb948770c3325862f449d5eafc07cfb170924b4a0efdf4e6d8902411eae6cade898c953a6b51a955838c359c670c1778b3a189c3e70152fe97e687df38a805 SHA512 8dcfff3b9f7ed03070cdd890e051bcd425535a4e18aec21d5a48383d2826528157ad51893cbaf320953d31752efb22f554ce974f8516706d87343537589433dc
-DIST failure_derive-0.1.5.crate 4884 BLAKE2B f09bc82f9fb489950d886ed1276ffefe06e916389d034aa3b82521445829e7fcee102e1c03030df9cc55e4b1f14c933ab83faee8be910037d33f15d15ef9c86e SHA512 c1a6896d986c126c35045c40a85b8cb8dd8842b9bd06918246205f2e79349e1df5dcdbe408024a0f9693d628e17bbd750a733a0a5cc24de4162b08790222729a
-DIST filetime-0.2.4.crate 12044 BLAKE2B 563df5750ef95e392f8458c0a23f106eb310d8e8e7253fba6b2b8245afb103a37b505fa41b915691b8f93ac9d6277e2940ee219a4993232781269c9876c5eb24 SHA512 a27ea45b6de09c93a818f56436e49ed358cd7cdab2a39913de159144da239bef14677b5b521633c68bb9a4f38e71d7e2404b6bf628348b3573e509c9440d0863
-DIST flate2-1.0.7.crate 65912 BLAKE2B ace7d04662b4880ca817d7d021d6cd06c09108548880b2eeb5f53329ac1ac482c83e046188a76895ef36d4c62bfeafc831119100c172c2b696f28793e580f751 SHA512 f45bc04ab7b82a2783734c9012eff7a2ca22ba871583229b6267e2798a1dab8e14cf273592e7e67da1e9b193149447419b64b5c4dd0e1b329d79b279c35b41d2
-DIST fnv-1.0.6.crate 11131 BLAKE2B 220cf5463749b21e1560419ab9b1f235de08dd548c4a9a7fa6190d9516ce7db884f877b67174ee50b66b22be80d3be73ccafca80e06e94e0fa6e96fbb94475f6 SHA512 f1356b3da25f76cb3ccb4336ff54d4967f1dc7523eae6cba21a4349b8ce563516f6a2aa10d626cd5bb6046b55ac2f246e61e4e526a03fad5e78d0ea174841844
-DIST foreign-types-0.3.2.crate 7504 BLAKE2B 520818b702d990d296ecd31a8646850202509ccfa18edd0e1b260289619a6c351e758f317ec0824bd76eccb209b6f087057c25f1bd01a47897715013dd834867 SHA512 bf27b8243ed482c202d120383374f19ff09422535e24b9c1aebccc66529bf300ca17b8bbc76d67f98ac092e614497afe3add9dc68aa69c93074df05762f91232
-DIST foreign-types-shared-0.1.1.crate 5672 BLAKE2B d2e42e04b6657e7a69fe0bd20c672176629c743e49a55fd007bb30e289710b70045d445ae9cae0eeaa747ee708c90e8abd9b5fc39bad8ec0666befe1b696d4f1 SHA512 bafdb2143e136fb0818e2ffd90b5c862b7181647d6568947d4e4531012bbf7a57b597221ec7056c1b562dfc0c3b5dead26d1a4111ebc15e7863737a873518a4a
-DIST fs2-0.4.3.crate 13138 BLAKE2B a8c53130014affc276544360425718c480fe6b6583675e15e8bf25dca0cd2752aeb0793135fce1bdc12bcfc0ef21fb7f6aa298981d61ac150300eb134c2014e0 SHA512 b83fefa9123f304e4813ec1dacbb1aee5dc0c94e1316cd7c8a434aa2a242c9c42523d2bd8232d78e6c84c4e172b5c46ef8605e93b54216a2d4496fdf885dcf50
-DIST fuchsia-cprng-0.1.1.crate 2950 BLAKE2B 8519407ab5d1f04d03cc946a07050db4dd7bc70e03894e35b9e66910a3be11224084a86ba45103fdec845e94b7ba4defbd7c5217b035a0796c0c4a94b9562cd7 SHA512 ea9f5beb0dfcb023c22cfc2b37ce52dfcf3a2cbbed0f79ffffc332878858386805c65dce8469a431002367562d857a6c064e075688540c27fcb4056a110059d2
-DIST fwdansi-1.0.1.crate 4658 BLAKE2B 9ff7630d03280a27d4c58e858391bb9fa0e51d4f8aab875e8b1ac6ceb5f97e0db27f46efeb8e380cefc0348cfc845a10c72cb97ab5ae8a287b84fcfca0773acd SHA512 171044bcb47a672f0d22014741e4509c571a20511ed8d9cbc26fd857b65979925e5f51affff1033c9899a6b5448a696f661e6ee617a349dc732edb02456b7098
-DIST git2-0.8.0.crate 151568 BLAKE2B b4bf47247e7add92f8c96e4e8c2b1ade9d7db8e79b799ebae9e07f11870b0c660b4355a0581eef627ebeec2167a501a498e4a4bcbfe9ffa1895ca123086d2e73 SHA512 06270d9f1284796d1c56c4bcac7de477b4665f6c32b5d8ea2fe816d4ff72d662f67f3482349d5d2b055232d9f1619f6fb7afcc7fe0a9053df7133efd9fd342d7
-DIST git2-curl-0.9.0.crate 9290 BLAKE2B b90729fb3de5781f7d1ee180658be92a94fcde5b61991493703e7b60c34c0a730054f36ba49f42b9bd5d64d7bf9471f3f1e6e7eb5224d7f13eb928d3f6a0f981 SHA512 f43b1a9e62f53f96c4108975225ed4c0b214cb86cfe969ec399bc2483ae1eeec409d163fbbbcb78386208bcefcd26971f7a29537a29d37fdfd1051e02f0128ea
-DIST glob-0.2.11.crate 18065 BLAKE2B 8531890ce378023f0119baccd5c556f297128d3f09c07d320d5cdc3c90032447f2e5a4f2fad0097bd3c6faf93b83256b387d232b3c9f9d3c40e54c48245321eb SHA512 91a1a751bc4ed3b13154aa056180f2b8123c33627cbe972bdd7986fb0b6f1ef90e59abd4128d6e4db5e69523d757440c7df9b9721a61f5ea5a091ffc9843e10e
-DIST globset-0.4.2.crate 22474 BLAKE2B 0ae4fb4dcb52822a7c46d8e078ecac18775c1125c905e0769c0b204c2aa606828d902f4c0996899114e57ca39c42b43fa892d68f6ae7cd25f1ae58b71af74d89 SHA512 53b8d9cce33258882b8ad2bff526b31a94322742553ac2d01e41693a333947e0ed9d8a3c98f3ca2131731eb50935eec8f1f7b161338cf3cd10cb1a9f722570a6
-DIST hex-0.3.2.crate 9053 BLAKE2B 3ac67d26ad367df7543967a8153a2ca7c082d5f56df16cf63a37f76157ce94c68f4cb11c14cc75621a9c45d19c38425acb92b552dd6f45b9052d90cde2ea6e5f SHA512 fbb5e86da5c7fd4b7ebc505d4c0da1258b06406d40a5c6c1626f559e1a91525fa747cbb6e35a687c63216158832ceb49dc61d68cd7d74f2df3630b36ac423852
-DIST home-0.3.4.crate 4167 BLAKE2B 8e71387f6063446aa565dcfc6f08f72e2e406681d413bae835393d31ce1f80d451928e3b434bdf569ba3ccde23e55be320f0081f2c2570c3e4e4069915dfc0a9 SHA512 0e6fa44f4464229e833f8ffa893fd84dcd0bff181c718adcbe5f202b76bd2e16044aa44e1828d4eb332fc71637a3e9ac432a048ad2c6e8f87c719e9e88d4a9b1
-DIST http-0.1.17.crate 98437 BLAKE2B 67a3e69d3e14d52df47cb4351bd210bc8748d5a270a906488b5526c1b897540c607d0ff18f434813109412d44c1e3ad2a141dc49ba5a50c58c0bfee6c5d527bb SHA512 4ec143aec78ca3c0834eed20926ade333c282fedb81aa482b75f25daffb2584756ab337de5fa0e9e8d5d24f39d5f9976d51a9b08e94c50d162ab23564924cf23
-DIST humantime-1.2.0.crate 16795 BLAKE2B cf3cbd2f89800994430b2634699eced4074d7fbc1ec53b8ebb145b8399bd2d5d05c86bc8d9adafc97d861b1133910ba67cf407b01815106e77ad5bdcdac60764 SHA512 718e5d3568305e09c359ffb8ca478b36ca3b829667029daf238517e2b88df198c33e29c93b7e2d02552a4ec746c121421128002d20c549400ecee1942c4be6cb
-DIST idna-0.1.5.crate 258735 BLAKE2B 31f2506f76e9bbab68c0da6222db214865dc37994851d91eab8c6e7f0220e6bcebe50ce3a571866bc03f3ad1b337f25c3a02c7e7f1494553d91e85c1bf042950 SHA512 217bc49f667242bd89eff708fef395fd46cfe3d24440bfb76869086fb93805c4f49d718251fb1c35ac40d5588ec98cf8b8b516fda53d6d7fd3da1ab04b0d173a
-DIST ignore-0.4.6.crate 45507 BLAKE2B 3ab9c229049683b9fb32942dff77f9d8c5977d1e4aa331244f9de76c5bdaa2b48c94d93ad953a6ff37021c14556ef2bf5b0306a3f8bd632a2b93b42deff29fef SHA512 7876a7572e89379a3480208632c9f34d99a9ca835bc19c543ccad1a835449ac2107444e3c65d2980444a78572f571b5c669ee4600bd02a67d864b341cab757df
-DIST im-rc-12.3.3.crate 123987 BLAKE2B 873c3cecfd9d318465ecf5bef4e5480a4995b5a2ad3aa047adfed7776041d659fffb8deee813026ec20b261c1600ad2ab123c8157531b8168300d48942100d18 SHA512 c6ffbdabd0a04275b02c6e4083aa5db4df8ba16ff1f9b48dd5968cc9351c9d2f53950bb3107c6559afd406bf5dbe2c0664a0eb31f77bef52bb70c0fb111981c8
-DIST iovec-0.1.2.crate 8565 BLAKE2B c1ff225d7e8cb8b7efc2be01763740c4f0c1188a5f1f27c5fd3fc34104b2280bee59915d71812756bfd36832fb807374d531792936ed8a7228d52ab98d622a50 SHA512 3e523bcb8b9891be66398f44c97933d246b7a7fbfc4f315bfda6cdb22ca2786ccc82139ee1b646b4c24f6f50f57fba38f9b1fb7c75e859722e9e9c789b458223
-DIST itoa-0.4.3.crate 11061 BLAKE2B 76ab02d37c62453ddfee00788ed83805c3c57a66120fcd266401806c005bb55c00b90e074a39a0cdf99d8018181c5bd3f7c3a4fffcefcdc762e19191f0a362e6 SHA512 da1d1c988c2c81f37de8d048ca8f8fb8787c48c34e815dc64616368cb787990ae0255cf1a3259f87ad02964c9b3e1e20c759072442c18c7d32db1deac11b52c1
-DIST jobserver-0.1.13.crate 19329 BLAKE2B 0c104f7807967ff738aa35a3876355bab8634cd474c9a7cf6d4586d8a22c20fa67a5d704a17b4206c138a5a0290ba0473014be115ebb6557d6848eeb3b349d3d SHA512 fd6c85c1fe3195305e3fa30f47a1971d2e9509161ad4c5e9b1c588e93dc093ac76e6d6830630fe6f182755715cbd1690c8beb5865df59c295d0496cc9f9047df
-DIST kernel32-sys-0.2.2.crate 24537 BLAKE2B dfc4a1e31d3ec9e2ac62b890839919fb7fed1444070c1dcd75bb75acfb53556d6cf2eddf5a6639e7852a3df2a0cc715c5ce1d3fc898ef16a1687020d98f715bc SHA512 682bc7c629aefd035966a2873518fd60719121cca7d63d89d6c97ff5306f24d8b5055a3c91b4eedaec22b1d5dd3fb8b48ff7341a05bbd72d86e06c422dab473b
-DIST lazy_static-1.3.0.crate 10616 BLAKE2B caa2af77f69c96b5f35dbb2aad7e73784544e6baa5e1fcc2272738fcd3d5f0576480c8169cdddc665a953eb9b6b7ddeb69e93cfa60401458afbe783fff82d1b1 SHA512 08288790139876765b6d4a5988f47fd2a4bfc77c2f2406ad44e64920a471b5655c7f54cb197e5a40c29ee8b42aecbbefaac2b6f4a7dd2b5e24dd92c46cb9b822
-DIST lazycell-1.2.1.crate 11691 BLAKE2B 9b1d6e9ced918aa94dd5dddcd3ffba59116dae922d264180ac36c288d8a6dd9244324a7c3050c5991b216a241e482ee17b2e6d27527b88339b606586128df1f5 SHA512 de74ccd6a3c32c360a12a51ba1d51d6530130396b37d63350a960956ae0ba13e9ac31e2bb70b61ddf055fdfbe7e559b20a38415cac3906839684905a01256ff2
-DIST libc-0.2.50.crate 392277 BLAKE2B 75a8fd5babba55fe59e3ecb49941c313dccc780f8f2d0c521e14e3bb63494090e919111b908b928c4048c0458095da5a48ebce90171831931a972c20b3de758c SHA512 36a51f7925a1a4e670ed8783f63d7f2ab85d1382d0be29ab4fbf0d66b24e7d68d88bb9e320e9dff35a1e275c07afe672dd164d12cc2af8ee1bb57ef6d2aa4a30
-DIST libgit2-sys-0.7.11.crate 1176919 BLAKE2B 9793a5131c805f8474c17d336514c480203938f51fcdb3d4e09bfc609e6599027a05436660077a526ddedbcab3c587a411fd9ec8d7dd921fb352ebb61e52eb1d SHA512 361aa7d75a029209f59c799e2f091f6ab8c0ba6a4677932537eea8e0198a36a2382327e8c5db98a2980f47b6a4baf07708720f128734081ac58e30d8721c3435
-DIST libnghttp2-sys-0.1.1.crate 2225580 BLAKE2B 05e0d61759122a98270a0da5a4d1bfd4ba740d6287ab75fd3491fb88f0e995209fd8718230364fe79d19d2129443fc23120d1904b12d5db832d4619ef4ee1e06 SHA512 68cbcef54c9b274050b1ef50b57b7256cc7dab36a89cd2a6bf698ecd27f02e644dcc8d2b16c61cf111dd35e09ad62c07c7069873e5cfc85273a661da34ffc989
-DIST libssh2-sys-0.2.11.crate 458377 BLAKE2B b9fa613a518ec21e5b90ef75ce0a4171406feb3be64accdc83b3d5924010d4b94eb95d1698addb44ca6756afd5663461506e3831035b745637741a35719b464f SHA512 4fee372cf5d546e6471177127041313291c7f1aa21777b1e9f0c6027052938fe4c6193b6925815b64248faf9086ea04014b6cdc0420135ca99403016700c15da
-DIST libz-sys-1.0.25.crate 650151 BLAKE2B dc11dc65c95f6c1f409ffbd0c9b12a809eaca5899da1073d8f302a752f9bb538b419cdf2f540b34b6f72c7ac36719e8fe21a1480533829cee305019304523520 SHA512 3c1d0754230c327876fadbaf3770f52282fedc6b373c92fba386a80261c577f6bea2983db7d3a40a231fbcfee40e560d8f738d25b634d270e2132b3162497547
-DIST log-0.4.6.crate 22303 BLAKE2B 3b1ad5e1cc1cf7bb223df569a6024b5749fdc973bb99a2a1f11772774cb384cc98214366e62d846b57c7d150f925cdf0e906f8113039204a82fbf001ae15133a SHA512 3844c771f97531ae7312c6bb0cf74ccaab94925f68bf1172419cc44fa4b5373f3ac6b42fb6d0ba636a970b295ea5d1b5abbe72b4da67a103e8dc4ed48a0cc5cb
-DIST matches-0.1.8.crate 2216 BLAKE2B f18176110921b1cf6e58d52d12f1d1a3455ce2dc04421fbf1b392f66cdd81a88e924571fa27e307a06301d83b04f3b8a0ca3ae40d2da6f2decb8aac4e2801fbb SHA512 98b58f6a2694b03a7dd1be69ebf7e3ad14483fc8e4cb6e6c26a4937e4e660e843efb4dd04a7312dd9659ca02acd3775678f73b8faac44a76ffafaf873c22f590
-DIST memchr-2.2.0.crate 20939 BLAKE2B 224963d641cf2bcad4b32699c9673c81d730f714f2df18878ce4ed78c816d38a2050dce11f9b3a529d45456e16027461bcfef9d5f0e08f7a70175a74e61b0131 SHA512 19bb5fe9c4ff471e2f8cba0e3be3ebb715f0eaf3d9c012c05833e78243d8baa6b98e14eb4c9a900caca48aa539483972f4ff8e5a47aec5141f96f3f23fc24088
-DIST miniz-sys-0.1.11.crate 78188 BLAKE2B ad37f662e5f7d5eb49a49d197fbb0abb1516a9c044ae3db12d93bbf41e70cc7bc55f78f354aa3f77626005ef9c6186db4008f32e198422daf5c97fc0d8302722 SHA512 58f8c9cf01f8a5819f53fce02246172acacf89becd05c8eea32a06fb4b3911ad3b595fbffdaad5d0ca4af4dbc4e2d41c83e2fe82bc12c33b035360e83d17e901
-DIST miniz_oxide-0.2.1.crate 49241 BLAKE2B 769137bf1f3dc38cf3103e3ffcac8f6d04b95223fc4e404283088a68c6a3e6373c7199445dd7e53c8f89d5716ddeccf64208913a06b8c8636740cfe1c964505f SHA512 8f3cc13b919c6dca6c4601ccc66e0102fce505ad4082e1eaaa6b132182b9cecd5e564752ba3c62b8e9db9c353f46623afbd6415119b342c746c3b72e214ed5d9
-DIST miniz_oxide_c_api-0.2.1.crate 163410 BLAKE2B 003013ab9bb9013f17577ff729aef09265384baa0d1e1521a11a7515c6f7dedac5963d5999f45538ab0bc1e065ae0c9d73ed63fa8b71286803e3380491fb00ee SHA512 2347504ac3a45e502ace4192dee292ac656771dd9dc6557f66648b94e97e77cf7ba763b99ab9b81de053cd33756a7dd5d3ed5d2741ec88c2164729071823a9cc
-DIST miow-0.3.3.crate 22850 BLAKE2B edfbbda60206d0e25eaa2d8972290feffe989bc2b6d98099fe3042bd0480d63a0cdb54df1abd55827790996bdbdb61f241b7fad8d325cdd64891513876ae913d SHA512 f2b8c5f31bfa2d831f1a6c0aaa9e526dde3ef8a2ac363da5180592cdf7a30e9e0898de680692db00406a48f4ee068ec97e3d42787c807335f7d47faac9c563aa
-DIST num-integer-0.1.39.crate 17881 BLAKE2B 1398b54766719f6fe298fb20489373ef774f1466349bcb96479610c00bb0f6f54b1a794def2841a0bf70558f6e5a080b528071ad5c64baa82bfac084354fa203 SHA512 1e00ef9fe5adcc312b4b8a59923015eb1387d90e6b3d7239b3aabcd83a9e67f2384b3a383d84ce8cdc82a470770f56373a89f0a679727a5fcc8f5bdb1f1209e3
-DIST num-traits-0.2.6.crate 39923 BLAKE2B 7bd781368c553622620f0d62a09f2c82fd26d4e6378ea8fc51b0e655dcf0561701881027f46f7a98da1bc25b777c62ab7338387c776a9e5e3463ea53a7efe922 SHA512 db638c662737972f07bc7ab82b923bece8a6c04719199ec0c7ca90140ac11e4fd1e4eb3748a69ddd3ad2791d4f5f5f69a00ce8aae92a647d9015d130f85b6b4c
-DIST num_cpus-1.10.0.crate 10669 BLAKE2B 96500421a82aafbacbcf982e3041ddba40dd8ab7fb967d1fb386c2d543b7f3efe12e35c386602a20377e7dfe09f31ecc9094ee0a06aea588149bda7866fabedb SHA512 a97b282da6323fa37b93caaaa262e699f0a219f08d32bc8531363daa57ae3ea397927d09c36d38615dcd372443aa65a43b91f4a7a59910273b581b5322946a02
-DIST opener-0.3.2.crate 14077 BLAKE2B 975f837863d54cd6a6c41c49d72e1b8225df60a25feca675a8fcd32e06f3a577ed0523b68ef37f6557d07aa355a72f91b136189ab269a0cadeee4cc9508408cb SHA512 21efe732971b929f46e343d54ad73f18a68bca95c941bd3be0a39a53f568872b9bebf41aab35ee4c9863595ac616ab3a305330279bf7d9a20ad9ccb13e6b01ee
-DIST openssl-0.10.20.crate 178977 BLAKE2B 6db17ff510662ef0a5e6d89b8b300b19f5b434bdeb1bc94260b926d8045345dd2019f3bbf7e29d0597e0c2de023b43a4b11498ff50408fb29a280bbccfcfd213 SHA512 958265ca7309cff11d67b08eb5400c3b0c296c9e6d96c4477b2b5bdcb7fe8f4fc8699594dfdb921952ee5c78e0bc25b64b4e218a27a03b3a63afb99bc8b1701c
-DIST openssl-probe-0.1.2.crate 6427 BLAKE2B 8df00c8ab6af7887a88dd1672bf2c40c6aed5867b0b8d07dacc94b80591814e2fee4ac5dc775ea0e98cc33641b9eeebb6d5979d34717ba400b907358ceb2a469 SHA512 4001eeea5c4f859559475b4b1df8248611bd44273116b31e7ef775e02918cc989825989868f331f0f0e387787680c1e4ba721ac0fd4695f7363005ccc0815d9a
-DIST openssl-src-111.2.1+1.1.1b.crate 5097526 BLAKE2B 58d6d9b235f9b4dc308f99ff429bd88f45079760cb38ac7885e0b414b472858fa20734de2fcd7d6e892e7f8bfad5c36df87cbedec2c2e1667cae7f153a2425f7 SHA512 92ed1473cc292a56da7a5f90eea0e653db8055c18d44ffa6cb6019f7242d93d5615aa411751ba7d7a1dbf93a1d7947195d90fff69938f61b93b2ec97a598f883
-DIST openssl-sys-0.9.43.crate 43849 BLAKE2B 51dd4664dbb174c5022df6f3ec811f6585a409c842a931f0d5713d0353dc19e82896798e590f50e7397ccf3847a48f6288d911907c9ae2807bf507d3006b7b12 SHA512 2b780a7b1078fc63a4ecfb8dbba117ee452da360ad472c171f2422018edd13eae12d18ba9a3f0c21dabec177b8ffff2abf7411f0d1848de478ca9ba497636100
-DIST percent-encoding-1.0.1.crate 10057 BLAKE2B 6dbfea557cb7a604a99b6fa694ed24b1555fec34bfed54503d98fa4b285a91aab1405b7156bd00be0001b10bf15706878b7bfb4f73cc34560166e0e8f004d944 SHA512 6e884d7172e8cadcf6e39056c9f92b70252f56a8062af0e792179dcf990344f47553c04e2fce84841f20f5c28557d7768727f60c862b9876d29cabffd4ad19e9
-DIST pkg-config-0.3.14.crate 13565 BLAKE2B bc457c2bee4034e7b5a5303bddf078e0b3e52018eb7513c5fa610ec9b272b95fab6cbbe35281e86bf0f97883526d91dcf8c156ea83e7dc23da0924a395b6c811 SHA512 bf120f0694f44d7b83b431eb28fe14ef3aca4d08ae0c2c9edbf8f184c145ba3faa479a6ab25e2d7e9f9d9f2d9a3fc21674fd4ddfe88bcc4fadad40bd8285656d
-DIST pretty_env_logger-0.3.0.crate 6774 BLAKE2B eef780564eedb5901d9b82667fd2836b1157dfb698ac8651120b6601ef62b5060b45a0defe28a06ff1e7144c38671658f16ec79ed667d76f4e23737c506bce10 SHA512 9aa7cda6b21a6367c1d7f5a038f10fb1c6e493551f4a741c3c80ce373e5b3500c3269a80721eaa814696e55b3018c89eeecdd4bbc0254068a85ac811bc21a3e4
-DIST proc-macro2-0.4.27.crate 34098 BLAKE2B ecec94ab4c79dbdfc77731054e3c370c2ae330baa3502efba34d2f900ba9ddcc5d89373adb06a465fa10c9bda061f7b3040c5f20fcf1b1accaba177632b6edb2 SHA512 b1ec1f59355c122022ac93f7ac03ddcc092b8712321f4ad74bf346a0dbea06c31cc695b1edfb735010620ab5eac5c62d3bde423c8458691edd0336127462359c
-DIST proptest-0.8.7.crate 191364 BLAKE2B efcf51f35c5b8af21c6ee8b5d117d2d67ed06034edbf769ff0f639f72bae34dd29cf241513848b1315c53b1a967725d16926cd673e322a010dc219eb78c7b6ba SHA512 7c53afdd80678cae5e862f58a61588670b81596e1fa6d0dfaec06611c9ee9e9c71dbe79b537295d8df757baa693bcc3943d268a42ebe26bf4af7c1c551d8e23c
-DIST quick-error-1.2.2.crate 15132 BLAKE2B 0c35f1d0145d4a3bc4b835f203cc4348e1d9e8f6f7c1ef887d923bf8a9a63f896929da67e27978f0d797a9455be5aa868078bccfb8eac480569d62ad64e0fee8 SHA512 f4ed283635e1fb72bd30929457ac04b1b79c36b4b08603af6266a3ea6e18f12c834cb88ac090e42bb869c8a608f7521812de81932a81073a34f16fc882c6148b
-DIST quote-0.6.11.crate 17283 BLAKE2B 04fa278094e505b806324d572154755d2696a6248ec6afb3aa5ea97ec2556e5b845cec3da1089ca321681591c0ca417caee1d51d7a2b57fc411c3f8270a0aea2 SHA512 5fd4936542eec530bbd33b1ee600746ed5c003eaf31c8aebf910fc1372d5ab91cfb10fbfe2a990a49e5eed88747f99d52cd430b34e0a5cce688094e55eeef4cd
-DIST rand-0.5.6.crate 137236 BLAKE2B 26ce5ac8fa86492fed467b68047a6a47f17af3720099410a3498c95531efe9d8329998df0ce693190c63d371c2efc67f07df9c1bed624ada18b5365f555b6c5c SHA512 0e2a643eadf6cd9f035eb720b540b838a00d6c790b1a99b36cec349c2e24dcaadcae6607f99fe86957e77b244d356dfba436a03c1d4d0756d6f8362c19087b64
-DIST rand-0.6.5.crate 104814 BLAKE2B 8d94c6f135ff4b07a2236cd7b0c2ff2b80f3d391e330590bf0ece15b08a8c8a5175ea32d9d12832eeb485822446515e14408171d5f1476a27e2b9ed97aa7986f SHA512 2eb84bed29708b8ba109f4329bf6f1cac6caed9d91b2aaf185d68dd2eda73d3fb7be2897d0596fb28352e799ccf92c161ee44599d5cb426ba9c3b8c747831904
-DIST rand_chacha-0.1.1.crate 11703 BLAKE2B 125fbb623b5d829c48e5b492c36585037e7fc6f12eb9090f946d05343fe867ce65db8eac913762dc20b6af2a4856e957ff43916897f3e385cc22eae64911b0a2 SHA512 200d39362ffd6d91cfe80634e951c7323a5df8a382c91e3afcef1ecb143a16dc47a17db7f1a746b18e4ea8bfd36bc31ceaeff6d0116e166f8b34e4a8530b3c1b
-DIST rand_core-0.3.1.crate 15483 BLAKE2B 2e09b3b3306514c29bd7588498e79be7353de656d8cdeeb4dfc6a1ad092f15a861c2ac20591ff71f7f60d986de9a09c860de4a9f06799f04e736b31bc70a5fbe SHA512 5a7ae601124502bede760fd3179c2b28059ebc3b5983bfcb6b8fa62fb58df95cedc1aeb2734e792d894dfa4620801c13c29702f9cbee64243121575d4b6b9114
-DIST rand_core-0.4.0.crate 20326 BLAKE2B ff85118d2b5c793e3da37bd4d75032e2d73a87bbba0b4c0c07057c47c67b7e919e5c4458b4c929e3b55f53cd3ae6579be5d434369d307e962c00fb3272862937 SHA512 f80e76dabd3308a12880a9aa8b7be83db39b02778c95bb63f862488789a2a67e2f08d4f2dd1ad803c61df0a9fc7f6620aa753b3bf394542ce27c89189a911845
-DIST rand_hc-0.1.0.crate 11644 BLAKE2B 24e9db27c6673ce657dd18e0bb5ac092c4340b818e79edf4a3ebfbd9a49759d3969c22f4357be5884192b6e6375528831683be54e1283112eb94097ff38d7d88 SHA512 808d8c167daa66a2608884d5d3f1444cdb21f8ca1c61e59fc9bdfb506a634ebb22c0143cfc0574e15313f82559fd2d117a46910eba3b4eb7e0052ec280f5cd2f
-DIST rand_isaac-0.1.1.crate 16020 BLAKE2B a720ac67770133f6051720afb6681623c1b3700be9ab8f663fa8ea852132a81c1404e34aed6829c197b92996007997cbc9105cea0e125e5ff3fc931306c55da4 SHA512 9e8f6c79abc53352c971f8182dcaa7979904d5649eec9008262bb0aaf0585b4c4817351cd80ffa8d07f172ff4c82d85a09ef2642a08f608fc6be3e246ed7f82e
-DIST rand_jitter-0.1.3.crate 18341 BLAKE2B 6bc99b148765ca0ad7ce1d457eaf4c039e825a7178fea200eded79a7897aa407ba39d9c8ab1693f28511fbf6def1bc9594e29ffe108555d3e1a3f709abb802e6 SHA512 a70bb59677bc82b4f0b6549d8907b1cde2e1529435866b9161cbbef28ae79f7edaa4067fc6498800267f944d853940670bdd093d437ca8cc84eb2b0ea6dcd551
-DIST rand_os-0.1.3.crate 18965 BLAKE2B 3cd93b10a46a70e0e3ccaf1fb8ee52230d74b7d790351652a8e39323bf0dcb446d14e9229e13c14a84e93394a22e0a127f50ded11db1df8ffc0a6bd564af63a7 SHA512 01e81a692b78df3b2bd65bc285e5052ccaf208c7d0ace414f251db4fcff7f9ae1502ee60ca5745c95e778d3d5efe15fa84153c17c422b6b6bfee829376c14575
-DIST rand_pcg-0.1.2.crate 10844 BLAKE2B 14150260cb41d57c59aa7251000acb1af9225b015ef8596527e1c313cb5943bc3e6c995e31b9db5a5bac41e30f36a6f7fce5a24b21d6413e74d0b3f9732cdad4 SHA512 6bc684778ba60c2e48793d4759b40cb0d35b0bc20ca0fc39fdff7c3f8fe9082dd7b5d5f26a7f17bafc6f3568924eac1bbe45820b1c2b09c91731ea5487d76d9c
-DIST rand_xorshift-0.1.1.crate 8997 BLAKE2B 314192d23072fba2ac66130604d92150bf946c6f6cf88a4b337314c51777af36d8cb6189b92284e451ea078e0ca66e6a5b91a90c0c2b0ad2353ecd3e08667f68 SHA512 3205499ed2584467dedb4641a48f3ca8fedc263b1d9431d36a251af0bc4701d99ce4b5219d515b9b24210dd3ef2faace6efa886aa50f361e07f53dd0fb0841e5
-DIST rdrand-0.4.0.crate 6456 BLAKE2B 330ee64d998a0358f95a3dce50b3e1bbda531a3b613db7e5ba4038a1cf7191b60be3a0f33416e05380c41040704ce52727928915e9d2f4565d39984d1c86fcd6 SHA512 6476275d124bee28747191471e8d8f321a3b1c148c1f2a7ece4175f5244a7de90afe5f99d2eba5244d886b92e38232398864bf90e6d434b09494533942c8d894
-DIST redox_syscall-0.1.51.crate 15646 BLAKE2B 5a033b0a20f50d66b3613cd0ef71a4a8f5a198ea3d9ad25752a4113ff1b54738ce820ace81f19b2f5de276509d52b6a69e709681fd006b132aa662e832e0f4df SHA512 cb84fc899f22b3c302654a959ce16a99518e8c39b8192634a0f3665dd052bbc6c4dd485ff66916dc20bbf8d494f59c1c761254bdbce6b184864c83325f6917e8
-DIST redox_termios-0.1.1.crate 3227 BLAKE2B 0b109d34e942735e804dd3da2a9639506e8bf6eb5b1f69ae021b115b0b75ae5159e8457abdf647dabfc19d5119cd3a44b8966635d7862cc66a8a997e4468e1ab SHA512 201d051900e919e2c6c6769ef252e51979d90133df16b6605e2a2f424cfb2e6e505e21add75ef5854fe5e0cab1ed1f1c1451010f072ae4bc8703c585a4323981
-DIST regex-1.1.2.crate 241143 BLAKE2B de5e00f4c23dbb00ffdad4548c7ecba6de24fba996034e966122b2d79142f0cab35d9a8edd5a9f6a6fa223bce36b07160492c11d844aa4582277d0d1b24de9d0 SHA512 84d4bc302daf92c71354c53565f55bc931b1a1d9f6a3ca11d1959ba9d6fc9a8cdb6d47ecad2e9edab451574a5159bbb4fe82f344513c56f63f42510cb76b1d16
-DIST regex-syntax-0.6.5.crate 272475 BLAKE2B b2ff299b4b87ab91c925a10faa8a09507272600a12558cade5b18ce615844223384e8420f2025dbd642bf80acb5f608a6c0f5ca59a4c391d4f417fdea15058b0 SHA512 37f2c69b425335a28b8945fcd58a3a39a9adde5588fdcd4b460da0fbd137e0727a7835d71b4e87ff29185c153379402891847d93047e40a578f778a62b324f5d
-DIST remove_dir_all-0.5.1.crate 8726 BLAKE2B b654deae9905c03b068f07d17b5fe3715393cf7c495ee017467fe1cdf955bf44781516d0e6aaa1dd738ace3b3bdd4fb38f7edaaab062eeba02baf50a1250ed0f SHA512 9ee9a11717d45aebd28cd2f50719a2183cc623bdb1af099701e4edbdb9c98bc14cf2278ba06aca4658bfeddaffff00d0d1464c82d175fba7d6fb272918dd6928
-DIST rustc-demangle-0.1.13.crate 11726 BLAKE2B cd97c38228174133532b0ddd31c0a57afc4a4061b5b40162a5ad222723862986a276a60a3917518420a125c7440c41b48a60f75497866c141e0c8787ae7a85a6 SHA512 3266d49f90301d814dde06ed9a2d0ed2a45e6f35cee0dcbb21aff213ba011f808d54ddd45c0f489ff3be06df1e6de0a0dec462a59ce2233edd1143d60b99314b
-DIST rustc-workspace-hack-1.0.0.crate 774 BLAKE2B 521f71467c95554c8a87ab3e10623ea3516932fe4bc9ca95c835c06b8e0bf526291dede3a5e08df8222f365f4d326c4054a99ef0d37aa6fb5210e2a35d7599be SHA512 48e4774a272e717ea571f4c22606ffca78245723ebc3f15ae5d0b28c5d767df9e772b7e2d6c5c3505bb09bf28097aa83a34b182856bb9d74b3a00b292da45315
-DIST rustc_version-0.2.3.crate 10210 BLAKE2B 1f707d1c66d907c9b1d2ef6d0bc6bc9c89990a7b922a6dfc2041865940ff3854c4d0e1daf558279fd5871af5818d4000457a32c949104f46538312fbf730443b SHA512 01fa7a758dcaa4f15c18628a0d5ee5adde5ade96a8b7dde0908e39e27b290d1e9adb20d44e2adcd379341d2d4a0c34a80dc12553a3bb4efa4758988f28989779
-DIST rustfix-0.4.4.crate 12698 BLAKE2B 06128ef65155657cc127e19bd6aea8e5a652f510ad0a290e7ab4578371f333f2bf4d53f5061b0273afb396e443887e43d65c4771ff53a32dcf234fecbeb7c05c SHA512 f20866fbc1f98095abd9c2a78d1b8580640eb59396806426b30271d376c3c0f3ead3d01880370d34065b0c6e5c3fbbcf1007d60139d8e5a55c6e7c78cef865e0
-DIST rusty-fork-0.2.1.crate 20069 BLAKE2B 91509698a588d5c0b45e8e384afdbf84971b910ba2a077d4b60ce8852a4db186be295644d5e6e51f3838f9c9fe738607b35ccc8613647139cc9e2273850eb046 SHA512 bf2d0dcde773fd3aac238a5e6d61a3955ba3e680ef0a08321b05b3923321a614e8a1fd44c756ead7debdc8a346605da87fe064f79a10cc6b9f3b79c0833f5090
-DIST ryu-0.2.7.crate 41382 BLAKE2B 267fc35f85a118384ff716f5e3d4045678f0addb74f1eb82e6d81bee2ecbb27472a8e31d9b279352496a622f040ad057ae2d132fba125be784d332d6bc818408 SHA512 94805952eabddc1c295b76e5b6d5b441748763b41d9371f3a2116c0bce6fa933767a3c1682a39d339d4430b86190c84e9421b5f3acd4d3274998d0d96bf229a4
-DIST same-file-1.0.4.crate 8678 BLAKE2B a46a2572f18a9adb3a23c8142c78d55757f04e10ddf68568f6af810a6e30a4b212bbf21c453ccd9b2e5ea7c42c6216505a4119fc6f19645c28e5434e3e8d7847 SHA512 bfb961dc7a31d5dd3be748d6ac609006ba71e0a6f61ec06c5f96a651e1ad1e768873b7cc2a10d9a52a6c670e7b56bf015df2974158001cb3138e2108d3160fea
-DIST schannel-0.1.15.crate 38901 BLAKE2B 23cbec1c786cca66e70cf3e238840258101a3f023edfcaef0cb66ad62a8d436e88e1f26a08d0eb544b5efec2b21e79ad9fcf84b521bbbfccfcca8fe040fe3ea2 SHA512 9c6f3cf370b76b8fd37cd26a5dfd686b532c30d47ef477548fa6994195dcfa053edcc2e8a395736768d5815b9f18db175be2e9d099767dd4ff4d9a8a3157675b
-DIST scopeguard-0.3.3.crate 9605 BLAKE2B 2379e45123c1c6ef456001cccbcec3298d6d32a5197ee9ac51e0233522cc24e8dff1900f1a70fe4d8a7889348b0c668e8e5c8956ec0add0898c719ae8e2a0a5d SHA512 57ce8e32dbe342040a63ec65fbef3680d66d439f0f704c5d485670041505905cfc602e7e3580748b4b4a55ce892d17a453e6d2f853cf0de4c6a2082f0fe95719
-DIST semver-0.9.0.crate 17344 BLAKE2B ae782bc78f29e45577de8574ee58959c70b54bb0b6f45a5a7b09cc4d358d9a0a80bbefc6e0f2a330e2b55adfbbe5c1f64f4ec9bb94c4adf7bb3e4fc9c142db6c SHA512 03a2ea563456f812c301721c3572370fe4934a22db60079da0dd6ffa33fa789e5e2436ef09e62fc35e0b742b06fabc290992c74eed80419a353c9de9449928dc
-DIST semver-parser-0.7.0.crate 10268 BLAKE2B e46b7cf9d292f8fc54561fca4df8534dc96f6be920a5c869c405ddb31b9d1a18eab0799207113cf4910a52cc0df5017ab1bc1883a7c3787ebf2d60f09ac0ab4f SHA512 17320468ec6b9862d595f358d70c09ac6e09db7885fe0ead7a1e596f79350a6306e8bfde5bbd6512008a7c5454da1c7ae55fe1e3bc1c1ff02ac9df54c0a6121f
-DIST serde-1.0.89.crate 71395 BLAKE2B 6fc88c889a12ce4bee3dc96aefd80e18e21d52c11b840ec9f6562b300f386d3b6d83632006d5d70e52a3693c3ad4af5ee55f1b6869cb402305cd0c46ff565140 SHA512 e01f30208b7dce831890bfa37a38a6e2177c35f423fa02021d32c1209ae00a3e8f836deb12cc26c4343a4a10b87286d780ebb8eca83bd4191d1023318c15e745
-DIST serde_derive-1.0.89.crate 48599 BLAKE2B 938134e97381bb4da5296a383a1bfb0fd9055c9e712a4121a39189849cf08f73b32eb5053c9f94b44ad4a62632d2b898d524013278c578ef569a862676daee0b SHA512 9c6e54b86eea33c8f4cfb27924f95e811b940ad0c9ba934c61691d728eaab3a31835a5c7ddf8b15d67786bd6b6d7f008079c453f89dc05b57f6412c9b1432d65
-DIST serde_ignored-0.0.4.crate 9533 BLAKE2B 07d08459a3333fb30a9413a882169b5c5b49f26f58128dc8f0458c3e7e668948f3a84d3e5c4dff78905f51604f4f317d76f96c3a900da85d669c0c9065e6191d SHA512 29911d05145b33ddfdcd5c86d57af331262393cd445eb5c464df07f8853032a156b0b1be7b90b66666748e0383831272cb53252cad7778fdd3ea20f2a04e23b4
-DIST serde_json-1.0.39.crate 69621 BLAKE2B 9eaa881f9a16d1895d2bc6f3aff3d6febd155d6ceff3c383968d0520d0f28dfa6fa57f2edd10c02eeb8448e2d87287d2cc04ee99f2c0bf96a60970c49aca14a9 SHA512 7180e5deb60e196f6b1ba3ac2a1bad6cea59d29f65fa7fb9258beb3d7012d6f3ea624e21fbb17868f5a21224f93b3f7b24875a94d50ba0d05e5b8d2aef632036
-DIST shell-escape-0.1.4.crate 6764 BLAKE2B cbfaabec7c6b81b802ced02a33e463c39b2f27f004e0e97087adf5712f1ccf4f4405ea9d010afb49153292741aa1d51d985caea5a3c48a601dc4f25b66012135 SHA512 19cd5e79b2b610dbb26098182c1ed3a8a2cb93a88fc623c0a9e3ff719998d6bb1de632f79519905441a4e38275178dd5aebca8b9994efc24e19bac4ebe5d6329
-DIST sized-chunks-0.1.2.crate 19577 BLAKE2B 5d34b536991f5d3508e6a1138e11bd060116d857e857f23450bc55daf3716e82f61b552e193878b0f2913fa6c7095d7a2177fa27a43bda6a324ee0d26a4fafcd SHA512 5cdba2c6966d3abb9d32da74f732f6ba9f86ca21b911a293cd293b1816efd3c3452e820224d8e056eb2152c864c396ad5fa08840f2969b1870a60ff0b7d7f773
-DIST smallvec-0.6.9.crate 21548 BLAKE2B 465f70349baa54a3b0ec1b21e732fc6b79362c866e24cb15acd09c753c4e4469a9f085859b5cc33c5a24849d64554dd64d6c66410c221c4c4bb6f3fae4b55dd9 SHA512 2bfd96b6c07a740b77c9d3221604e108bb730770970e7428a2a38d29711dff16eea08251e826d2d511d13a887c3256ec3a689e3c481ddb9029f47452fb2877e2
-DIST socket2-0.3.8.crate 30379 BLAKE2B ab805dbd3bf53e6ee59e117129b064e31a2bd92f3baf472af1975dd67fc97149fafc480fba4f29c0b7e2fe8d8f101c09d2cc5bc7c5d635418277ff7c3a883a42 SHA512 b543633e3acf6e8fe661f0162375619841346d5f1e51eb622e045712153e2d331bf32c90bd9a8c0cd7e84034f5d2827433788b54b3342f3eaacb537013f86a87
-DIST strsim-0.7.0.crate 8435 BLAKE2B 6869075bc3949fbdec1b74548b816560d1bf3759ba4c3e972a84f885e6732edd25596d75a4b6f6b85d93821f559757d096cb5f0b0eb04dabd8bb974d214f3188 SHA512 3f92df0f444129b16fbb15c533b7bc1d6f18970b487b57345f74747fb7f41e3dc0cb61255712e94d419a5777b8f6a9cdf1a716718698c479eb98dfb6464d1983
-DIST syn-0.15.29.crate 146203 BLAKE2B b9280bda7735dfc08f80816e5db9c22e27596e5bfcbc54accd37a9bc4899c2caf1bcef03155c653441365ed9fc8cad910fa47c58ba7a386b3fc9f40b4be59a27 SHA512 1a5f365a8239758c9a2e2cfac3bac1bc94995ea48eb087cc8a2dc62a33a2f22b2bbe2985e344fdd758021ab66e55ff17e76c0234e9ae342499d1ae1fc3294767
-DIST synstructure-0.10.1.crate 17836 BLAKE2B d80745963f581c02a3b9587d45586e2098632a4c21de22547ae97531bbc4f30a1b02989306999c67584c507a5b07978a48f65ad5e00ff55f39e8e0bb4fdbfa8e SHA512 5830eea0eab15c7ed737bfa14c7bbfc73f28af6964ce3148542066fb9760a80dbba82fd9a55078426346ba757e0aaba9addecadb1d0f75eac4f029a6e4c7cc19
-DIST tar-0.4.22.crate 46179 BLAKE2B 6b981ea7860318e638629473ef16ac2672d1faa6110b9dc913d19d953a6e8634b564afec4e21522a039db97a54e4b3cf995ad5c4d584b312a2b08e33e2bf9465 SHA512 e7eb38be29d728990eef7e08bc912b4b11d19568e30f12b809201c0ce1b4d2a94d04be23ab1d8026515134ad526a638151a4e49c445c8de45fb86f03b8e5bc02
-DIST tempfile-3.0.7.crate 23922 BLAKE2B ea7207d7a5c893751fedca320dc0b08c01de041eed2baf39c1e63f744b55ba3a823890d60fff504c1018950ff9e564eb17cc086f7c519279293570ef2e470751 SHA512 b6fb6a1f4f0f5483255f9672114fa6adf13edd4bfe8f7fbe6c4225a36ccab5b58fc5f5510c50e70746e2697f2cf503b20682e5b44cef0b65b7ffac4ee39529e8
-DIST termcolor-1.0.4.crate 14416 BLAKE2B 373701dd2b8a3d584a44d1429e5fd3a697eb7b9138ca6c76eadbf642976e73a701d565a93d77ead3f5cc542c204b3bdce9cc5101b2778b3e32272db9c419edd7 SHA512 cc2f90f453834666b3dcf96c48695cc1fc48c6aacf71437bab635678f486cf02ba6e1c040ff011be078a17b50f9f6d2c09fec771e362d8d2d07526b0f040df6b
-DIST termion-1.5.1.crate 20659 BLAKE2B 5b4291c2c26a074c16eac2e7bcb40467380181bac69c941e5c958059dc239cbbfd74872d9bd3da65245d010f9fc39804c43dc96f4caab2499b021cf35977a6b0 SHA512 1d1536f08600c7c1f414b4579a1a6e7eff91f4c105504125118d3cadf71c7886a352d1c5f7e07f3d7c28aa8b4752f07b51eddb4d9adc6a9286f7b6bade2bec76
-DIST textwrap-0.10.0.crate 15986 BLAKE2B bcbd40fe4c8322e459c505e0f175b5b088322c33ba56d8c4b294788950681c2407ba08fae2c15711f8f0d5e1f0afed38f82deaffe1c2b16a4f4ab14723b71bb4 SHA512 cb50cc73f3f5ab704ef9e6d526b751f7e66de213fa534206e5b4e9da829f19aedda9f23f262f865fdb3247c703aeaa87f38099f6c575d1961ec923d62a9b2293
-DIST thread_local-0.3.6.crate 12388 BLAKE2B 290c35e5327e80a5cdca5609252b1efd1b78a654fc9ab4ba68eeaa3c2769d844f725d17d91cbb15048dbaac84913c51edcb39bb402882c9e7b4d0c4e4811518d SHA512 cd783d3d9caec43868da1f6118d4c4d520e03b9f1049d8f15d2c12482989401d3aee748e04a149953d35e5d6487355c2891d44569ef688bc1d45f01b6461d253
-DIST time-0.1.42.crate 30005 BLAKE2B 6d85ae2e56612b5c6955921b671ac62ad10c174fa9fd382e2d76018fc2789253836397b980f8e6d0db4f1b19da244c64d3bffb4fa6c25ac0b66e7ba9876590d4 SHA512 4df662212377093b0fd8fcd88ddc30b20a8af7d989c2e100c0cf64f9741e88eea6e858e1aa4220be6b76b0cf8b62c8116b492010d74d1ebef197c66aa130aa83
-DIST toml-0.4.10.crate 47534 BLAKE2B 853aee7f7d9261d2d0daa755e6c158e2b3a173a6e9d8d96cd0d78d75f2ecb1eea341cb8be8b3df9ef1ec34129b77e4f45b4aa849e8c33e6a1f07a3f832993a4f SHA512 15bc40159478207d204e46ff2459dd3146d8f5508f07399f310ec8266190df8a1375e860fc8a7b3fb372b01e9d0f65eaecdc1b896ac2a921070ce76fde82f160
-DIST typenum-1.10.0.crate 30009 BLAKE2B ea68f463c2edd2cd7ace126571a88cead26ea37beb8a13ebc00eb033d9a6e9d7060bebcdb208830cea4944a2b2eae16e7ed7a60f0b9270868559292bf99df6c7 SHA512 9ff611df79e312b8ab32522007981220213f2beddd959118a855d08b94b7a7d35d38378694c8667c2d6aa324933307a47a4072a89cacf7e594537794385b9449
-DIST ucd-util-0.1.3.crate 25897 BLAKE2B d67d250603625d7fe55b1bd17a8bff03ddf2e48b531e8f754f51dcd49370a2b66d0915842fb2fce85a69df2c38f9c086ac3c36115d40c5a8138e5451f71a1cfe SHA512 50a796feb198012241d73001bb53c8e3d3168df379de91d7ecaccfd829b08a356afe3db736fb8cced8748141d7a9e4b157440442c425816c78c0615c08e20f2e
-DIST unicode-bidi-0.3.4.crate 32228 BLAKE2B 853a85b29d1ac2025b7a28af64ead9387e3b4b1e790ad719d4374e349c1853ddbb5959a2890d9d6c94a5c28e4523fc3324deb6b1ed1aeb5e917f21b0e2516f6c SHA512 170ce083fa82bed13ecc62d85cb882fdd6491ae721e1633d3c1a5d3cee69422153afcf6695765c0e8fc7035440d0370d34afac9e978cb27f7506c07cba300e1e
-DIST unicode-normalization-0.1.8.crate 71158 BLAKE2B c548a2bc537abc6d86bffb0828a366ff82b143dcb0ee01e2c21b3b7134fd5f818f3775db391d358f4ebcb906ff256e3d2228ab042066a3de9a6747be05b8effa SHA512 4e3245689d6162a21cedb42e07b179e3aad03728a37b005c2e6bff644a6efd06b6bd26a20a255861a01441a9d15c4318575db3016248b96a03436212aa414547
-DIST unicode-width-0.1.5.crate 15761 BLAKE2B 575e6bfe8b8b70cb0e5a167bf546df2964361a223b03a65bdc588c32d4cf9f01194daa8d6d1c90319f1f9981aa5b092dce67c9c97450be4ea630784d834cdbe2 SHA512 bd5ac5f0433953d79408074239edc7c43ce23d56659d467805d81ab01c576a3cf77ccedb3bba41d48bc4ad46a8905ac8a1927b99312053ef6295fd940a6766d2
-DIST unicode-xid-0.1.0.crate 16000 BLAKE2B 159004a7bbb7476b39e982b51dbf615717095fd5946536e757653aa941bbf1b774f331db744ecc33bb2ead4b0a6d254fde86cfd6cd8b83ab9983fa89928eddbe SHA512 cc5343e2166938322cfd7c73f1f918f2a9c46846ac0ef55933d1e44cdfaf6f7da2b7ff18b68e356c47b6d8ba5565eda0db42c347dcbde830683f341ac2b1849d
-DIST url-1.7.2.crate 68597 BLAKE2B d8d7a4b05e956a956c745dbb536ff94abbe81af22e53af3d7baccf01ed7e556cc4f1f8e0a0d97c258c1f1a23209e1ae494079948de9f0d402901c0b6cdafc373 SHA512 c53d7c397416cb1f3c9f7654a8a0653f350c28d41880859f29f681cd6269848890c1396b7ccdf571ec84212a8f3959138f47193ac0595a97bf98972b58e1ed04
-DIST url_serde-0.2.0.crate 3525 BLAKE2B 3beadf5f536b091ea54f8a1cf31553f2c9c51719a1d586ceed396363d26f1441c12a23bf8017cad4daca62a57b4f5b55b0b5d5577b4c61c1854f16a3d4554247 SHA512 9abf777f8ac1f369e8db826e35fd09a2a5f1685560027740a8388ce1c60de92da79b4d1b938f9bd082363396f5b7a742811feaf298b269b2f5e9465650ee827f
-DIST utf8-ranges-1.0.2.crate 8510 BLAKE2B 877ff38444aec99bf8e0d09c6880d4835eb453c8c7e38fa5e7f8fe3cadd5b34b11a030193e46fe97b19fd90e94de156c0eaf12c613aae7cee47f0f016a3fb96d SHA512 ac168b908a34c4814a682b77502d2e5aa3130acb01fa87e29c78b760a61ba61b01f9fa2d67202604ac9824e0b2fe92143b72c0d4100a62ff9f53e4b00a4a12fb
-DIST vcpkg-0.2.6.crate 9866 BLAKE2B c9c6e1a52e54d6d4103e0b833d77cdd4b2463123a5a12d7c15922bf782c7d56f0055ed5dc9d2bd236a14fb0ed6612c7b691d8a31a98e34b48f84228e6c10a567 SHA512 55678e3cbb7b1bf80e2589df3fc580bb595576a5f24e515819906082ed081e47a546d6825bb92fae56ed0157407244e1b77af1677f0380f2fdd15cc54853675e
-DIST vec_map-0.8.1.crate 14959 BLAKE2B f5c179ccb4349d543747d5e3bb3edfca4bc9f3f64ba3c2d40fb1d9cba98433b7a0641387aafda6347c9b3603592c64bd820b217b46fbfcd37f802f298e5793ab SHA512 026cf10dc7ba98ae51dd312fc847cbaea41c25f0da5db6e0e22c2ecf75584bbf876d7bd96035fbbcf6696d702d5a3f25977e02a2d77cf519aa21e3ed05710e40
-DIST wait-timeout-0.1.5.crate 12797 BLAKE2B 79b6cb53bb08668608bae2b8fccf55eb9687a6b0c7bd2fa5e982ad02a0eee7877eee430865fdd95f85dcdd7e249bd0b1affd31cb50603ada1891fed4cb703dca SHA512 afcd6cd150729c48d554471e6a0346925843e321fc4a04b01c7b9aeb123b2e98c5499c1c371a7a52469ebfacb73b5c706705be50e2d6043b7ae60dce595c1dd1
-DIST walkdir-2.2.7.crate 23507 BLAKE2B 8c26d7970724f7fe2fb6b38f2d25ee4ffeacf115466c019c7fe082e9be1a3c3a0e076f248b53fca5f82234350e5f3d0521d8f7eef5463a372796e2485309dec0 SHA512 bf7c06f982383f4ac7c513bfaf18350924d57dfacb1e9469c1600cf578a759714fd51d261b7fa8c49d29293f24ce4075dc84ee267f5559459622fc97939d338c
-DIST winapi-0.2.8.crate 455145 BLAKE2B 50f3c2a0cf4eeedd6891b11392e520c1cca139a71f8f736eabaf43aa7e4b1b5d57697918978220459572d373940edf971eb8302f292cbff832283e905076319a SHA512 115e6f027cdd4a56f77ca24f4ab249d2a6cac1e1f955c826a9b6ee05db4861790a533f5e674aebbb540370fff52ed41618c2cd7c906e73200e92df213109cebe
-DIST winapi-0.3.6.crate 1029391 BLAKE2B 9a52085c3cb74d84bc66cee575da0105eeca69f6abd3c8c601a4de013bafea795f044748be10ec9ab419a9ec82a304a0b65ba4d74f6cb39baff91228f83009f1 SHA512 991eb3d6ba08d59e7f7ec81ebf469cecc56b3723b636392972d2fdc1d6f13d88f8a244ad5cbb20f6058d12b44e060ed663c12aa3fbcd1235ab511fafa105cd3c
-DIST winapi-build-0.1.1.crate 669 BLAKE2B 6c8d8e0f81574c086f06fb3f234b0e6759d293d1d254857c3d491e4d43279e5c2f57f2fcfdc9d5d7b083280f4cc2a75a6ee9bc1541ec6ce8f8d904ded0567faf SHA512 8b0a239e205a5368892f41c870a8a7ea16e3468c364b03382bef7fa3a2e7159b09c07661e95b1227578f6d72c14879daa4444b28c51ae20ef15d985d59ca5a77
-DIST winapi-i686-pc-windows-gnu-0.4.0.crate 2918815 BLAKE2B 4d357e4d30f9552972170d65b9a5358b69c46a3e772fe05efc22f3d4ffc1caeeaad7aacdc7abd503a7ad0545f8bd7d22bf351dcb6df76f812fa4d45c34d65df0 SHA512 a672ccefd0730a8166fef1d4e39f9034d9ae426a3f5e28d1f4169fa5c5790767693f281d890e7804773b34acdb0ae1febac33cde8c50c0044a5a6152c7209ec2
-DIST winapi-util-0.1.2.crate 7810 BLAKE2B 511f14b606b591da19159f0f49665846e55ef8e22c7519fedaa5dd65cdc0c51134606c2a7ff0a6cbd7f24e75aaf3109959decaf2a5171fe01fbfc7ad7453fbc4 SHA512 54514420da9851f9657f888d8b198b3a97a6009b7e965d5a23ec471251f6548c2a58c716a5f48fb5d83a5775503d696da98eaed7b71fdd9ba7cd74ba6923b11a
-DIST winapi-x86_64-pc-windows-gnu-0.4.0.crate 2947998 BLAKE2B 2ad1ea8b5fa07d544e910ccba043ae925269b76b26c9da356305b34b86741dd8b9aff0b9ffe3d562db4fcd7d7c46a11ce9e3168b782b1d89ae6881742b7ede82 SHA512 4a654af6a5d649dc87e00497245096b35a2894ae66f155cb62389902c3b93ddcc5cf7d0d8b9dd97b291d2d80bc686af2298e80abef6ac69883f4a54e79712513
-DIST wincolor-1.0.1.crate 4737 BLAKE2B b1519327a69d71845bc4d7ebf34205d63883aacbeb9284260e5cc89178193aac15525641546582e32c00128ca4a7c1967ba8f076fbfa98bf9d79a5fe2801555e SHA512 f9914b8b416f3810f5199e85b8088c669bff3cbc0f5b86fdb5b600bbd0554465a559bae3ac918fb7197780663e94bf645ede8f35b60ab0e6a6cf2305b1eb99e1
diff --git a/dev-util/cargo/cargo-0.35.0-r1.ebuild b/dev-util/cargo/cargo-0.35.0-r1.ebuild
deleted file mode 100644
index 9e0cce1..0000000
--- a/dev-util/cargo/cargo-0.35.0-r1.ebuild
+++ /dev/null
@@ -1,248 +0,0 @@
-# Copyright 1999-2018 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CRATES="
-adler32-1.0.3
-aho-corasick-0.6.10
-ansi_term-0.11.0
-atty-0.2.11
-autocfg-0.1.2
-backtrace-0.3.14
-backtrace-sys-0.1.28
-bit-set-0.5.1
-bit-vec-0.5.1
-bitflags-1.0.4
-bufstream-0.1.4
-build_const-0.2.1
-byteorder-1.3.1
-bytes-0.4.12
-bytesize-1.0.0
-cc-1.0.31
-cfg-if-0.1.7
-chrono-0.4.6
-clap-2.32.0
-cloudabi-0.0.3
-commoncrypto-0.2.0
-commoncrypto-sys-0.2.0
-core-foundation-0.6.3
-core-foundation-sys-0.6.2
-crc-1.8.1
-crc32fast-1.2.0
-crossbeam-channel-0.3.8
-crossbeam-utils-0.6.5
-crypto-hash-0.3.3
-curl-0.4.20
-curl-sys-0.4.17
-env_logger-0.6.1
-failure-0.1.5
-failure_derive-0.1.5
-filetime-0.2.4
-flate2-1.0.7
-fnv-1.0.6
-foreign-types-0.3.2
-foreign-types-shared-0.1.1
-fs2-0.4.3
-fuchsia-cprng-0.1.1
-fwdansi-1.0.1
-git2-0.8.0
-git2-curl-0.9.0
-glob-0.2.11
-globset-0.4.2
-hex-0.3.2
-home-0.3.4
-http-0.1.17
-humantime-1.2.0
-idna-0.1.5
-ignore-0.4.6
-im-rc-12.3.3
-iovec-0.1.2
-itoa-0.4.3
-jobserver-0.1.13
-kernel32-sys-0.2.2
-lazy_static-1.3.0
-lazycell-1.2.1
-libc-0.2.50
-libgit2-sys-0.7.11
-libnghttp2-sys-0.1.1
-libssh2-sys-0.2.11
-libz-sys-1.0.25
-log-0.4.6
-matches-0.1.8
-memchr-2.2.0
-miniz-sys-0.1.11
-miniz_oxide-0.2.1
-miniz_oxide_c_api-0.2.1
-miow-0.3.3
-num-integer-0.1.39
-num-traits-0.2.6
-num_cpus-1.10.0
-opener-0.3.2
-openssl-0.10.20
-openssl-probe-0.1.2
-openssl-src-111.2.1+1.1.1b
-openssl-sys-0.9.43
-percent-encoding-1.0.1
-pkg-config-0.3.14
-pretty_env_logger-0.3.0
-proc-macro2-0.4.27
-proptest-0.8.7
-quick-error-1.2.2
-quote-0.6.11
-rand-0.5.6
-rand-0.6.5
-rand_chacha-0.1.1
-rand_core-0.3.1
-rand_core-0.4.0
-rand_hc-0.1.0
-rand_isaac-0.1.1
-rand_jitter-0.1.3
-rand_os-0.1.3
-rand_pcg-0.1.2
-rand_xorshift-0.1.1
-rdrand-0.4.0
-redox_syscall-0.1.51
-redox_termios-0.1.1
-regex-1.1.2
-regex-syntax-0.6.5
-remove_dir_all-0.5.1
-rustc-demangle-0.1.13
-rustc-workspace-hack-1.0.0
-rustc_version-0.2.3
-rustfix-0.4.4
-rusty-fork-0.2.1
-ryu-0.2.7
-same-file-1.0.4
-schannel-0.1.15
-scopeguard-0.3.3
-semver-0.9.0
-semver-parser-0.7.0
-serde-1.0.89
-serde_derive-1.0.89
-serde_ignored-0.0.4
-serde_json-1.0.39
-shell-escape-0.1.4
-sized-chunks-0.1.2
-smallvec-0.6.9
-socket2-0.3.8
-strsim-0.7.0
-syn-0.15.29
-synstructure-0.10.1
-tar-0.4.22
-tempfile-3.0.7
-termcolor-1.0.4
-termion-1.5.1
-textwrap-0.10.0
-thread_local-0.3.6
-time-0.1.42
-toml-0.4.10
-typenum-1.10.0
-ucd-util-0.1.3
-unicode-bidi-0.3.4
-unicode-normalization-0.1.8
-unicode-width-0.1.5
-unicode-xid-0.1.0
-url-1.7.2
-url_serde-0.2.0
-utf8-ranges-1.0.2
-vcpkg-0.2.6
-vec_map-0.8.1
-wait-timeout-0.1.5
-walkdir-2.2.7
-winapi-0.2.8
-winapi-0.3.6
-winapi-build-0.1.1
-winapi-i686-pc-windows-gnu-0.4.0
-winapi-util-0.1.2
-winapi-x86_64-pc-windows-gnu-0.4.0
-wincolor-1.0.1
-"
-
-inherit cargo bash-completion-r1 multiprocessing versionator
-
-BOOTSTRAP_VERSION="0.$(($(get_version_component_range 2) - 1)).0"
-
-DESCRIPTION="The Rust's package manager"
-HOMEPAGE="http://crates.io"
-SRC_URI="https://github.com/rust-lang/cargo/archive/${PV}.tar.gz -> ${P}.tar.gz
-	$(cargo_crate_uris ${CRATES})
-	x86?   (
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-i686-unknown-linux-gnu.tar.xz
-	)
-	amd64? (
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-x86_64-unknown-linux-gnu.tar.xz
-	)
-	arm? (
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-arm-unknown-linux-gnueabi.tar.xz
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-arm-unknown-linux-gnueabihf.tar.xz
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-armv7-unknown-linux-gnueabihf.tar.xz
-	)
-	arm64? (
-		https://static.rust-lang.org/dist/cargo-${BOOTSTRAP_VERSION}-aarch64-unknown-linux-gnu.tar.xz
-	)"
-
-RESTRICT="mirror"
-LICENSE="|| ( MIT Apache-2.0 )"
-SLOT="0"
-KEYWORDS="-* amd64"
-
-IUSE="doc libressl"
-
-if [[ ${ARCH} = "amd64" ]]; then
-	TRIPLE="x86_64-unknown-linux-gnu"
-elif [[ ${ARCH} = "x86" ]]; then
-	TRIPLE="i686-unknown-linux-gnu"
-elif [[ ${ARCH} = "arm64" ]]; then
-	TRIPLE="aarch64-unknown-linux-gnu"
-elif [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv6* ]]; then
-	TRIPLE="arm-unknown-linux-gnueabi"
-elif [[ ${CHOST} == armv6*h* ]]; then
-	TRIPLE="arm-unknown-linux-gnueabihf"
-elif [[ ${CHOST} == armv7*h* ]]; then
-	TRIPLE="armv7-unknown-linux-gnueabihf"
-fi
-
-# Hack: Unslotted OpenSSL dependency to allow cargo to continue using OpenSSL
-# 1.0.2 across the OpenSSL 1.1 uprev. To be switched back to slotted dependency
-# after the OpenSSL uprev is done.
-COMMON_DEPEND="sys-libs/zlib
-	dev-libs/openssl
-	net-libs/libssh2"
-RDEPEND="${COMMON_DEPEND}
-	!dev-util/cargo-bin
-	net-misc/curl[ssl]"
-DEPEND="${COMMON_DEPEND}
-	>=dev-lang/rust-1.27.0
-	dev-util/cmake
-	sys-apps/coreutils
-	sys-apps/diffutils
-	sys-apps/findutils
-	sys-apps/sed"
-
-src_configure() {
-	# Do nothing
-	echo "Configuring cargo..."
-}
-
-src_compile() {
-	export CARGO_HOME="${ECARGO_HOME}"
-	local cargo="${WORKDIR}/cargo-${BOOTSTRAP_VERSION}-${TRIPLE}/cargo/bin/cargo"
-	${cargo} build -j$(makeopts_jobs) --release || die
-
-	# Building HTML documentation
-	use doc && ${cargo} doc
-}
-
-src_install() {
-	dobin target/release/cargo
-
-	# Install HTML documentation
-	use doc && HTML_DOCS=("target/doc")
-	einstalldocs
-
-	newbashcomp src/etc/cargo.bashcomp.sh cargo
-	insinto /usr/share/zsh/site-functions
-	doins src/etc/_cargo
-	doman src/etc/man/*
-}
diff --git a/dev-util/gdbus-codegen/Manifest b/dev-util/gdbus-codegen/Manifest
deleted file mode 100644
index 02142f1..0000000
--- a/dev-util/gdbus-codegen/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST glib-2.58.3.tar.xz 4863648 BLAKE2B 4269bd6e80869f39d567917438f750561debb1b45d40ecea487d2e76e2468e07dc8d80a23678699f7b8f7778c2ed9d29e866ae5e33770f51ed00709dd5fe97eb SHA512 1e1cb5b607367dcbadb95563d463e81702cf396b28f1173f6d933707f4f3d5595a70225423e918807a05994a24f16fa3ac87d2ec67e4b670244ea99836634cce
diff --git a/dev-util/gdbus-codegen/files/gdbus-codegen-2.56.1-sitedir.patch b/dev-util/gdbus-codegen/files/gdbus-codegen-2.56.1-sitedir.patch
deleted file mode 100644
index 30f0d7d..0000000
--- a/dev-util/gdbus-codegen/files/gdbus-codegen-2.56.1-sitedir.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 9eaaa76e2e36e46a43dbd419724696fd7ff8ea64 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?R=C3=A9mi=20Cardona?= <remi@gentoo.org>
-Date: Sat, 14 Apr 2018 09:55:22 +0200
-Subject: [PATCH 1/2] gdbus-codegen-2.54.3-sitedir.patch
-
----
- gio/gdbus-2.0/codegen/gdbus-codegen.in | 28 --------------------------
- 1 file changed, 28 deletions(-)
-
-diff --git a/gio/gdbus-2.0/codegen/gdbus-codegen.in b/gio/gdbus-2.0/codegen/gdbus-codegen.in
-index 67d367543..190afa28f 100755
---- a/gdbus-codegen.in
-+++ b/gdbus-codegen.in
-@@ -20,36 +20,8 @@
- # Author: David Zeuthen <davidz@redhat.com>
- 
- 
--import os
- import sys
- 
--srcdir = os.getenv('UNINSTALLED_GLIB_SRCDIR', None)
--filedir = os.path.dirname(__file__)
--
--if srcdir is not None:
--    path = os.path.join(srcdir, 'gio', 'gdbus-2.0')
--elif os.path.basename(filedir) == 'bin':
--    # Make the prefix containing gdbus-codegen 'relocatable' at runtime by
--    # adding /some/prefix/bin/../share/glib-2.0 to the python path
--    path = os.path.join(filedir, '..', 'share', 'glib-2.0')
--else:
--    # Assume that the modules we need are in the current directory and add the
--    # parent directory to the python path.
--    path = os.path.join(filedir, '..')
--
--# Canonicalize, then do further testing
--path = os.path.abspath(path)
--
--# If the above path detection failed, use the hard-coded datadir. This can
--# happen when, for instance, bindir and datadir are not in the same prefix or
--# on Windows where we cannot make any guarantees about the directory structure.
--#
--# In these cases our installation cannot be relocatable, but at least we should
--# be able to find the codegen module.
--if not os.path.isfile(os.path.join(path, 'codegen', 'codegen_main.py')):
--    path = os.path.join('@DATADIR@', 'glib-2.0')
--
--sys.path.insert(0, path)
--from codegen import codegen_main
-+from gdbus_codegen import codegen_main
- 
- sys.exit(codegen_main.codegen_main())
--- 
-2.17.0
-
diff --git a/dev-util/gdbus-codegen/files/setup.py-2.32.4 b/dev-util/gdbus-codegen/files/setup.py-2.32.4
deleted file mode 100644
index c5318e3..0000000
--- a/dev-util/gdbus-codegen/files/setup.py-2.32.4
+++ /dev/null
@@ -1,6 +0,0 @@
-from distutils.core import setup
-setup(name="gdbus_codegen",
-      version="@PV@",
-      packages=["gdbus_codegen"],
-      package_dir={"gdbus_codegen" : ""},
-      scripts=["gdbus-codegen"])
diff --git a/dev-util/gdbus-codegen/gdbus-codegen-2.58.3.ebuild b/dev-util/gdbus-codegen/gdbus-codegen-2.58.3.ebuild
deleted file mode 100644
index dc44757..0000000
--- a/dev-util/gdbus-codegen/gdbus-codegen-2.58.3.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-GNOME_ORG_MODULE="glib"
-PYTHON_COMPAT=( python{2_7,3_5,3_6,3_7} )
-PYTHON_REQ_USE="xml"
-DISTUTILS_SINGLE_IMPL=1
-
-inherit gnome.org distutils-r1
-
-DESCRIPTION="GDBus code and documentation generator"
-HOMEPAGE="https://www.gtk.org/"
-
-LICENSE="LGPL-2+"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="${PYTHON_DEPS}"
-DEPEND="${RDEPEND}
-	dev-libs/libxslt
-	app-text/docbook-xsl-stylesheets
-"
-
-# To prevent circular dependencies with glib[test]
-PDEPEND=">=dev-libs/glib-${PV}:2"
-
-S="${WORKDIR}/glib-${PV}/gio/gdbus-2.0/codegen"
-
-python_prepare_all() {
-	PATCHES=(
-		"${FILESDIR}/${PN}-2.56.1-sitedir.patch"
-	)
-	distutils-r1_python_prepare_all
-
-	sed -e 's:@PYTHON@:python:' gdbus-codegen.in > gdbus-codegen || die
-	sed -e "s:@VERSION@:${PV}:" config.py.in > config.py || die
-	cp "${FILESDIR}/setup.py-2.32.4" setup.py || die "cp failed"
-	sed -e "s/@PV@/${PV}/" -i setup.py || die "sed setup.py failed"
-}
-
-do_xsltproc_command() {
-	# Taken from meson.build for manual manpage building - keep in sync (also copied to dev-util/glib-utils)
-	xsltproc \
-		--nonet \
-		--stringparam man.output.quietly 1 \
-		--stringparam funcsynopsis.style ansi \
-		--stringparam man.th.extra1.suppress 1 \
-		--stringparam man.authors.section.enabled 0 \
-		--stringparam man.copyright.section.enabled 0 \
-		-o "${2}" \
-		http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \
-		"${1}" || die "manpage generation failed"
-}
-
-src_compile() {
-	distutils-r1_src_compile
-	do_xsltproc_command "${WORKDIR}/glib-${PV}/docs/reference/gio/gdbus-codegen.xml" "${WORKDIR}/glib-${PV}/docs/reference/gio/gdbus-codegen.1"
-}
-
-src_test() {
-	einfo "Skipping tests. This package is tested by dev-libs/glib"
-	einfo "when merged with FEATURES=test"
-}
-
-python_install_all() {
-	distutils-r1_python_install_all # no-op, but prevents QA warning
-	doman "${WORKDIR}/glib-${PV}/docs/reference/gio/gdbus-codegen.1"
-}
diff --git a/dev-util/gdbus-codegen/metadata.xml b/dev-util/gdbus-codegen/metadata.xml
deleted file mode 100644
index 3998080..0000000
--- a/dev-util/gdbus-codegen/metadata.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
-<pkgmetadata>
-<maintainer type="project">
-	<email>gnome@gentoo.org</email>
-	<name>Gentoo GNOME Desktop</name>
-</maintainer>
-</pkgmetadata>
diff --git a/dev-util/hdctools/hdctools-0.0.1-r1230.ebuild b/dev-util/hdctools/hdctools-0.0.1-r1230.ebuild
deleted file mode 100644
index c7d92b3..0000000
--- a/dev-util/hdctools/hdctools-0.0.1-r1230.ebuild
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="bb03c555825221b71da4ef31b365feb7f5b3e560"
-CROS_WORKON_TREE="e9a3fac8a584e5b3983f3240310a9e8fe606d02f"
-CROS_WORKON_PROJECT="chromiumos/third_party/hdctools"
-PYTHON_COMPAT=( python2_7 )
-
-inherit cros-workon distutils-r1 toolchain-funcs udev
-
-DESCRIPTION="Software to communicate with servo/miniservo debug boards"
-HOMEPAGE="https://www.chromium.org/chromium-os/servo"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="cros_host test"
-
-COMMON_DEPEND=">=dev-embedded/libftdi-0.18:=
-	dev-python/numpy:=
-	>=dev-python/pexpect-3.0:=
-	dev-python/pyserial:=
-	>=dev-python/pyusb-1.0.2:=
-	sys-power/uhubctl
-	virtual/libusb:1
-	chromeos-base/ec-devutils:=
-"
-
-RDEPEND="${COMMON_DEPEND}
-"
-
-DEPEND="${COMMON_DEPEND}
-	app-text/htmltidy:=
-	test? ( dev-python/pytest:= )
-"
-
-src_test() {
-	python_test() {
-		py.test -v build/ || die
-	}
-	python_foreach_impl python_test
-}
-
-src_compile() {
-	tc-export CC PKG_CONFIG
-	local makeargs=( $(usex cros_host '' EXTRA_DIRS=chromeos) )
-	emake "${makeargs[@]}"
-	distutils-r1_src_compile
-}
-
-src_install() {
-	local makeargs=(
-		$(usex cros_host '' EXTRA_DIRS=chromeos)
-		DESTDIR="${D}"
-		LIBDIR=/usr/$(get_libdir)
-		UDEV_DEST="${D}$(get_udevdir)/rules.d"
-		install
-	)
-	emake "${makeargs[@]}"
-	distutils-r1_src_install
-}
diff --git a/dev-util/hdctools/hdctools-0.0.1-r1264.ebuild b/dev-util/hdctools/hdctools-0.0.1-r1264.ebuild
new file mode 100644
index 0000000..44b9bbf
--- /dev/null
+++ b/dev-util/hdctools/hdctools-0.0.1-r1264.ebuild
@@ -0,0 +1,64 @@
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5a2e8f9352a16f60dcf52bd4d00b50103ab0cf31"
+CROS_WORKON_TREE="99b84aace013a0b55a9a4b4c5b2f9b9286cda469"
+CROS_WORKON_PROJECT="chromiumos/third_party/hdctools"
+PYTHON_COMPAT=( python2_7 )
+
+inherit cros-workon distutils-r1 toolchain-funcs udev
+
+DESCRIPTION="Software to communicate with servo/miniservo debug boards"
+HOMEPAGE="https://www.chromium.org/chromium-os/servo"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="cros_host test"
+
+COMMON_DEPEND="
+	>=dev-embedded/libftdi-0.18:=
+	dev-python/numpy:=
+	>=dev-python/pexpect-3.0:=
+	dev-python/pyserial:=
+	>=dev-python/pyusb-1.0.2:=
+	sys-power/uhubctl
+	virtual/libusb:1
+	chromeos-base/ec-devutils:=
+	dev-python/retry-decorator:=
+"
+
+RDEPEND="${COMMON_DEPEND}
+	virtual/servo-config-dut-usb3:*
+"
+
+DEPEND="${COMMON_DEPEND}
+	app-text/htmltidy:=
+	test? ( dev-python/pytest:= )
+"
+
+src_test() {
+	python_test() {
+		py.test -v build/ || die
+	}
+	python_foreach_impl python_test
+}
+
+src_compile() {
+	tc-export CC PKG_CONFIG
+	local makeargs=( $(usex cros_host '' EXTRA_DIRS=chromeos) )
+	emake "${makeargs[@]}"
+	distutils-r1_src_compile
+}
+
+src_install() {
+	local makeargs=(
+		$(usex cros_host '' EXTRA_DIRS=chromeos)
+		DESTDIR="${D}"
+		LIBDIR=/usr/$(get_libdir)
+		UDEV_DEST="${D}$(get_udevdir)/rules.d"
+		install
+	)
+	emake "${makeargs[@]}"
+	distutils-r1_src_install
+}
diff --git a/dev-util/hdctools/hdctools-9999.ebuild b/dev-util/hdctools/hdctools-9999.ebuild
index 71669c5..0a819f4 100644
--- a/dev-util/hdctools/hdctools-9999.ebuild
+++ b/dev-util/hdctools/hdctools-9999.ebuild
@@ -14,7 +14,8 @@
 KEYWORDS="~*"
 IUSE="cros_host test"
 
-COMMON_DEPEND=">=dev-embedded/libftdi-0.18:=
+COMMON_DEPEND="
+	>=dev-embedded/libftdi-0.18:=
 	dev-python/numpy:=
 	>=dev-python/pexpect-3.0:=
 	dev-python/pyserial:=
@@ -22,9 +23,11 @@
 	sys-power/uhubctl
 	virtual/libusb:1
 	chromeos-base/ec-devutils:=
+	dev-python/retry-decorator:=
 "
 
 RDEPEND="${COMMON_DEPEND}
+	virtual/servo-config-dut-usb3:*
 "
 
 DEPEND="${COMMON_DEPEND}
diff --git a/dev-util/puffin/puffin-1.0.0-r434.ebuild b/dev-util/puffin/puffin-1.0.0-r434.ebuild
deleted file mode 100644
index dcb8aa5..0000000
--- a/dev-util/puffin/puffin-1.0.0-r434.ebuild
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("9edc1ccf0b71426a4e0945a82963e78ba9613958" "3b9a741dc7310d343585ed92667ad6bc8ab0d067")
-CROS_WORKON_TREE=("e2a3a6742f6acdc76df13145ab31b6471243d736" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "7af8a5581078de78894a5f59bbd5e179fc71a804")
-inherit cros-constants
-
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_LOCALNAME=("../platform2" "../aosp/external/puffin")
-CROS_WORKON_PROJECT=("chromiumos/platform2" "platform/external/puffin")
-CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/puffin")
-CROS_WORKON_REPO=("${CROS_GIT_HOST_URL}" "${CROS_GIT_AOSP_URL}")
-CROS_WORKON_SUBTREE=("common-mk .gn" "")
-CROS_WORKON_BLACKLIST=1
-
-PLATFORM_SUBDIR="puffin"
-
-inherit cros-workon platform
-
-DESCRIPTION="Puffin: Deterministic patching tool for deflate streams"
-HOMEPAGE="https://android.googlesource.com/platform/external/puffin/"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="asan fuzzer"
-
-COMMON_DEPEND="chromeos-base/libbrillo:=[asan?,fuzzer?]
-	dev-libs/protobuf:=
-	dev-util/bsdiff:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_install() {
-	if use cros_host; then
-		dobin "${OUT}"/puffin
-	fi
-	dolib.a "${OUT}"/libpuffpatch.a
-	dolib.a "${OUT}"/libpuffdiff.a
-
-	insinto /usr/include
-	doins -r src/include/puffin
-
-	insinto "/usr/$(get_libdir)/pkgconfig"
-	doins libpuffdiff.pc libpuffpatch.pc
-
-	for f in "huff" "puff" "puffpatch"; do
-		platform_fuzzer_install "${S}"/OWNERS "${OUT}/puffin_${f}_fuzzer"
-	done
-}
-
-platform_pkg_test() {
-	platform_test "run" "${OUT}/puffin_test"
-
-	# Run fuzzers.
-	for f in "huff" "puff" "puffpatch"; do
-		platform_fuzzer_test "${OUT}/puffin_${f}_fuzzer"
-	done
-}
diff --git a/dev-util/puffin/puffin-1.0.0-r435.ebuild b/dev-util/puffin/puffin-1.0.0-r435.ebuild
new file mode 100644
index 0000000..957412d
--- /dev/null
+++ b/dev-util/puffin/puffin-1.0.0-r435.ebuild
@@ -0,0 +1,63 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("9edc1ccf0b71426a4e0945a82963e78ba9613958" "e41898ff7ac51f174dba9d2fea092b7f169f3bd1")
+CROS_WORKON_TREE=("e2a3a6742f6acdc76df13145ab31b6471243d736" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "7af8a5581078de78894a5f59bbd5e179fc71a804")
+inherit cros-constants
+
+CROS_WORKON_INCREMENTAL_BUILD="1"
+CROS_WORKON_LOCALNAME=("../platform2" "../aosp/external/puffin")
+CROS_WORKON_PROJECT=("chromiumos/platform2" "platform/external/puffin")
+CROS_WORKON_DESTDIR=("${S}/platform2" "${S}/platform2/puffin")
+CROS_WORKON_REPO=("${CROS_GIT_HOST_URL}" "${CROS_GIT_AOSP_URL}")
+CROS_WORKON_SUBTREE=("common-mk .gn" "")
+CROS_WORKON_BLACKLIST=1
+
+PLATFORM_SUBDIR="puffin"
+
+inherit cros-workon platform
+
+DESCRIPTION="Puffin: Deterministic patching tool for deflate streams"
+HOMEPAGE="https://android.googlesource.com/platform/external/puffin/"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan fuzzer"
+
+COMMON_DEPEND="chromeos-base/libbrillo:=[asan?,fuzzer?]
+	dev-libs/protobuf:=
+	dev-util/bsdiff:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_install() {
+	if use cros_host; then
+		dobin "${OUT}"/puffin
+	fi
+	dolib.a "${OUT}"/libpuffpatch.a
+	dolib.a "${OUT}"/libpuffdiff.a
+
+	insinto /usr/include
+	doins -r src/include/puffin
+
+	insinto "/usr/$(get_libdir)/pkgconfig"
+	doins libpuffdiff.pc libpuffpatch.pc
+
+	for f in "huff" "puff" "puffpatch"; do
+		platform_fuzzer_install "${S}"/OWNERS "${OUT}/puffin_${f}_fuzzer"
+	done
+}
+
+platform_pkg_test() {
+	platform_test "run" "${OUT}/puffin_test"
+
+	# Run fuzzers.
+	for f in "huff" "puff" "puffpatch"; do
+		platform_fuzzer_test "${OUT}/puffin_${f}_fuzzer"
+	done
+}
diff --git a/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.no.public b/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.no.public
new file mode 100644
index 0000000..99575f4
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.no.public
@@ -0,0 +1,18 @@
+# List of Servo v4 with known problems affecting USB3-to-DUT.
+#
+# Format: One Servo v4 serial number per line.  Blank lines and lines starting
+# with # (pound sign) are ignored.
+#
+# Do NOT list Servos in Google's possession here.  Use the private overlay
+# package for that.
+#
+# When a Servo is listed in multiple dut_usb3.{no,yes} files, the highest file
+# in this list wins:
+#
+#   /etc/servos/dut_usb3.no
+#   /etc/servos/dut_usb3.yes
+#   /usr/share/servos/dut_usb3.no.*
+#   /usr/share/servos/dut_usb3.yes.*
+
+
+# TODO(b/163418494): Consider listing affected Servos that were distributed to Partners.
diff --git a/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.yes.public b/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.yes.public
new file mode 100644
index 0000000..df245e4
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/files/data/dut_usb3.yes.public
@@ -0,0 +1,23 @@
+# List of Servo v4 known to support USB3-to-DUT.
+#
+# Format: One Servo v4 serial number per line.  Blank lines and lines starting
+# with # (pound sign) are ignored.
+#
+# Do NOT list Servos in Google's possession here.  Use the private overlay
+# package for that.
+#
+# When a Servo is listed in multiple dut_usb3.{no,yes} files, the highest file
+# in this list wins:
+#
+#   /etc/servos/dut_usb3.no
+#   /etc/servos/dut_usb3.yes
+#   /usr/share/servos/dut_usb3.no.*
+#   /usr/share/servos/dut_usb3.yes.*
+#
+# There is generally no need to list any Servo v4 here, since Servod is changing
+# to enable USB3 to DUT by default.  See:
+# https://issuetracker.google.com/163418494
+#
+# This file remains available for listing known-good Servos in case the
+# known-bad Servo list is discovered to be incomplete, requiring flipping back
+# to USB2 by default.
diff --git a/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.no b/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.no
new file mode 100644
index 0000000..a6390fa
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.no
@@ -0,0 +1,16 @@
+# List of Servo v4 with known problems affecting USB3-to-DUT.
+#
+# Format: One Servo v4 serial number per line.  Blank lines and lines starting
+# with # (pound sign) are ignored.
+#
+# When a Servo is listed in multiple dut_usb3.{no,yes} files, the highest file
+# in this list wins:
+#
+#   /etc/servos/dut_usb3.no
+#   /etc/servos/dut_usb3.yes
+#   /usr/share/servos/dut_usb3.no.*
+#   /usr/share/servos/dut_usb3.yes.*
+#
+# This /etc file is for making local changes in your CrOS SDK chroot to
+# override the /usr/share files.  In CrOS source control all Servo listings
+# belong in the /usr/share files, and this file should remain empty.
diff --git a/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.yes b/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.yes
new file mode 100644
index 0000000..0a82ce8
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/files/sysconf/dut_usb3.yes
@@ -0,0 +1,16 @@
+# List of Servo v4 known to support USB3-to-DUT.
+#
+# Format: One Servo v4 serial number per line.  Blank lines and lines starting
+# with # (pound sign) are ignored.
+#
+# When a Servo is listed in multiple dut_usb3.{no,yes} files, the highest file
+# in this list wins:
+#
+#   /etc/servos/dut_usb3.no
+#   /etc/servos/dut_usb3.yes
+#   /usr/share/servos/dut_usb3.no.*
+#   /usr/share/servos/dut_usb3.yes.*
+#
+# This /etc file is for making local changes in your CrOS SDK chroot to
+# override the /usr/share files.  In CrOS source control all Servo listings
+# belong in the /usr/share files, and this file should remain empty.
diff --git a/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-0.0.1-r1.ebuild b/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-0.0.1-r1.ebuild
new file mode 100644
index 0000000..652bea2
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-0.0.1-r1.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the BSD license.
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List DUT USB 3 capability of Servo devices (public)."
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+src_install() {
+	insinto /usr/share/servo
+	doins "${FILESDIR}"/data/dut_usb3.no.public
+	doins "${FILESDIR}"/data/dut_usb3.yes.public
+
+	insinto /etc/servo
+	doins "${FILESDIR}"/sysconf/dut_usb3.no
+	doins "${FILESDIR}"/sysconf/dut_usb3.yes
+}
diff --git a/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-9999.ebuild b/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-9999.ebuild
new file mode 100644
index 0000000..948ae27
--- /dev/null
+++ b/dev-util/servo-config-dut-usb3-public/servo-config-dut-usb3-public-9999.ebuild
@@ -0,0 +1,25 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the BSD license.
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List DUT USB 3 capability of Servo devices (public)."
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+
+src_install() {
+	insinto /usr/share/servo
+	doins "${FILESDIR}"/data/dut_usb3.no.public
+	doins "${FILESDIR}"/data/dut_usb3.yes.public
+
+	insinto /etc/servo
+	doins "${FILESDIR}"/sysconf/dut_usb3.no
+	doins "${FILESDIR}"/sysconf/dut_usb3.yes
+}
diff --git a/dev-util/shellcheck/files/get_var_diff.py b/dev-util/shellcheck/files/get_var_diff.py
new file mode 100755
index 0000000..71ebc8b1
--- /dev/null
+++ b/dev-util/shellcheck/files/get_var_diff.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Generates diff of vars from get_vars.py and those existing in Data.hs."""
+
+import itertools
+from pathlib import Path
+import subprocess
+
+SCRIPT = Path(__file__).resolve()
+THIRD_PARTY = SCRIPT.parent.parent.parent.parent.parent
+
+# List of relative directories in which to find the eclasses.
+eclass_rel_dirs = (
+    THIRD_PARTY / 'chromiumos-overlay' / 'eclass',
+    THIRD_PARTY / 'portage-stable' / 'eclass',
+    THIRD_PARTY / 'eclass-overlay' / 'eclass',
+)
+
+# Runs get_vars.py with the eclass paths and store the output.
+cmd = [SCRIPT.with_name('get_vars.py')] + list(
+    itertools.chain(*(x.glob('*') for x in eclass_rel_dirs)))
+new_output = subprocess.check_output(cmd, encoding='utf-8').splitlines()
+new = []
+for line in new_output:
+  if '--' in line:
+    new.append(line.strip())
+  elif not line.strip():
+    continue
+  else:
+    new += (line.replace('"', '').replace('\n', '').split(','))
+
+# Reads the Data.hs relevant area and store the lines.
+data_hs = THIRD_PARTY / 'shellcheck' / 'src' / 'ShellCheck' / 'Data.hs'
+with data_hs.open('r', encoding='utf-8') as fp:
+  record = False
+  old = []
+  for line in fp:
+    if line.strip() == '-- autotest.eclass declared incorrectly':
+      break
+    if line.strip() == '-- generic ebuilds':
+      record = True
+    if record:
+      if '--' in line:
+        old.append(line.strip())
+      elif not line.strip():
+        continue
+      else:
+        old += line.replace('"', '').replace('\n', '').split(',')
+
+# Cleans up empty bits as a result of parsing difficulties.
+new = [x.strip() for x in new if x.strip()]
+old = [x.strip() for x in old if x.strip()]
+
+all_eclasses = set()
+
+old_vars = {}
+new_vars = {}
+
+current_eclass = ''
+for item in old:
+  if '--' in item:
+    # It's an eclass comment line.
+    current_eclass = item[3:]
+    all_eclasses.add(current_eclass)
+    continue
+  else:
+    # It's a var, so add it to the dict of the current eclass.
+    old_vars.setdefault(current_eclass, []).append(item)
+for item in new:
+  if '--' in item:
+    # It's an eclass comment line.
+    current_eclass = item[3:]
+    all_eclasses.add(current_eclass)
+    continue
+  else:
+    # It's a var, so add it to the dict of the current eclass.
+    new_vars.setdefault(current_eclass, []).append(item)
+
+for eclass in sorted(all_eclasses):
+  if eclass in old_vars:
+    if eclass not in new_vars:
+      # Checks if the entire eclass is removed.
+      print(f'{eclass} not present in new variables.')
+      for var in old_vars[eclass]:
+        print(f'\t-{var}')
+      print()
+    else:
+      # Eclass isn't removed, so check for added or removed vars.
+      toprint = '\n'.join(
+          [f'\t-{x}' for x in old_vars[eclass] if x not in new_vars[eclass]] +
+          [f'\t+{x}' for x in new_vars[eclass] if x not in old_vars[eclass]])
+      if toprint:
+        print(eclass)
+        print(toprint)
+  if eclass in new_vars:
+    if eclass not in old_vars:
+      # Checks if entire eclass is new.
+      print(f'{eclass} added in new variables.')
+      for var in new_vars[eclass]:
+        print(f'\t+{var}')
+      print()
diff --git a/dev-util/shellcheck/files/get_vars.py b/dev-util/shellcheck/files/get_vars.py
index fadf59f..de29993 100755
--- a/dev-util/shellcheck/files/get_vars.py
+++ b/dev-util/shellcheck/files/get_vars.py
@@ -23,15 +23,18 @@
 
 # Variables from portage instead of a specific eclass.
 GENERIC_VARS = (
-    'A', 'BDEPEND', 'BROOT', 'CATEGORY', 'D', 'DEPEND', 'DESCRIPTION',
-    'DISTDIR', 'DOCS', 'EAPI', 'ED', 'EPREFIX', 'EROOT', 'ESYSROOT', 'FILESDIR',
-    'HOME', 'HOMEPAGE', 'HTML_DOCS', 'IUSE', 'KEYWORDS', 'LICENSE', 'P',
-    'PATCHES', 'PDEPEND', 'PF', 'PN', 'PR', 'PROPERTIES', 'PV', 'PVR',
-    'QA_AM_MAINTAINER_MODE', 'QA_CONFIGURE_OPTIONS', 'QA_DESKTOP_FILE',
-    'QA_DT_NEEDED', 'QA_EXECSTACK', 'QA_FLAGS_IGNORED', 'QA_MULTILIB_PATHS',
-    'QA_PREBUILT', 'QA_PRESTRIPPED', 'QA_SONAME', 'QA_SONAME_NO_SYMLINK',
-    'QA_TEXTRELS', 'QA_WX_LOAD', 'RDEPEND', 'REQUIRED_USE', 'RESTRICT', 'ROOT',
-    'S', 'SLOT', 'SRC_TEST', 'SRC_URI', 'STRIP_MASK', 'SUBSLOT', 'SYSROOT', 'T',
+    'A', 'BDEPEND', 'BROOT', 'CATEGORY', 'D', 'DEFINED_PHASES', 'DEPEND',
+    'DESCRIPTION', 'DISTDIR', 'DOCS', 'EAPI', 'ECLASS', 'ED', 'EPREFIX',
+    'EROOT', 'ESYSROOT', 'EXTRA_ECONF', 'EXTRA_EINSTALL', 'EXTRA_MAKE',
+    'FEATURES', 'FILESDIR', 'HOME', 'HOMEPAGE', 'HTML_DOCS', 'INHERITED',
+    'IUSE', 'KEYWORDS', 'LICENSE', 'P', 'PATCHES', 'PDEPEND', 'PF',
+    'PKG_INSTALL_MASK', 'PKGUSE', 'PN', 'PR', 'PROPERTIES', 'PROVIDES_EXCLUDE',
+    'PV', 'PVR', 'QA_AM_MAINTAINER_MODE', 'QA_CONFIGURE_OPTIONS',
+    'QA_DESKTOP_FILE', 'QA_DT_NEEDED', 'QA_EXECSTACK', 'QA_FLAGS_IGNORED',
+    'QA_MULTILIB_PATHS', 'QA_PREBUILT', 'QA_PRESTRIPPED', 'QA_SONAME',
+    'QA_SONAME_NO_SYMLINK', 'QA_TEXTRELS', 'QA_WX_LOAD', 'RDEPEND',
+    'REPOSITORY', 'REQUIRED_USE', 'REQUIRES_EXCLUDE', 'RESTRICT', 'ROOT', 'S',
+    'SLOT', 'SRC_TEST', 'SRC_URI', 'STRIP_MASK', 'SUBSLOT', 'SYSROOT', 'T',
     'WORKDIR',
 )
 
diff --git a/dev-util/shellcheck/shellcheck-0.7.1-r20.ebuild b/dev-util/shellcheck/shellcheck-0.7.1-r20.ebuild
deleted file mode 100644
index 7cdea03..0000000
--- a/dev-util/shellcheck/shellcheck-0.7.1-r20.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 1999-2018 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="9ac14b5f1357e9feae47863c34e2a1188bed1731"
-CROS_WORKON_TREE="4c1ba53aad07d48d3fdb5b7b8f1893634b259431"
-CROS_WORKON_PROJECT="chromiumos/third_party/shellcheck"
-CROS_WORKON_LOCALNAME="shellcheck"
-CROS_WORKON_EGIT_BRANCH="chromeos-0.7"
-CROS_WORKON_DESTDIR="${S}"
-
-CABAL_FEATURES="lib profile haddock hoogle hscolour test-suite"
-CABAL_EXTRA_CONFIGURE_FLAGS="--disable-executable-dynamic
-	--disable-shared
-	--ghc-option=-optl-static
-"
-
-inherit cros-workon haskell-cabal
-
-DESCRIPTION="Shell script analysis tool"
-HOMEPAGE="https://www.shellcheck.net/"
-
-LICENSE="GPL-3"
-SLOT="0/${PV}"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="dev-haskell/aeson:=[profile?]
-	>=dev-haskell/diff-0.2.0:=[profile?]
-	>=dev-haskell/mtl-2.2.1:=[profile?]
-	>=dev-haskell/parsec-3.0:=[profile?]
-	>=dev-haskell/quickcheck-2.7.4:2=[template_haskell,profile?]
-	dev-haskell/regex-tdfa:=[profile?]
-	dev-haskell/semigroups:=[profile?]
-	>=dev-lang/ghc-7.8.2:=
-	>=dev-haskell/cabal-1.18.1.3 <dev-haskell/cabal-2.5
-	dev-libs/gmp[static-libs]
-	dev-libs/libffi[static-libs]
-"
-
-src_install() {
-	cabal_src_install
-	# TODO(crbug.com/1000756): Add support for manpage build process (requires pandoc)
-	doman "${FILESDIR}/${PN}.1"
-}
diff --git a/dev-util/shellcheck/shellcheck-0.7.1-r27.ebuild b/dev-util/shellcheck/shellcheck-0.7.1-r27.ebuild
new file mode 100644
index 0000000..2472d56
--- /dev/null
+++ b/dev-util/shellcheck/shellcheck-0.7.1-r27.ebuild
@@ -0,0 +1,46 @@
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="65524811b7c00736fef043bce7565c296966a322"
+CROS_WORKON_TREE="32478e4b289a55986860bb9bad70a32e999fb140"
+CROS_WORKON_PROJECT="chromiumos/third_party/shellcheck"
+CROS_WORKON_LOCALNAME="shellcheck"
+CROS_WORKON_EGIT_BRANCH="chromeos-0.7"
+CROS_WORKON_DESTDIR="${S}"
+
+CABAL_FEATURES="lib profile haddock hoogle hscolour test-suite"
+CABAL_EXTRA_CONFIGURE_FLAGS="--disable-executable-dynamic
+	--disable-shared
+	--ghc-option=-optl-static
+"
+
+inherit cros-workon haskell-cabal
+
+DESCRIPTION="Shell script analysis tool"
+HOMEPAGE="https://www.shellcheck.net/"
+
+LICENSE="GPL-3"
+SLOT="0/${PV}"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="dev-haskell/aeson:=[profile?]
+	>=dev-haskell/diff-0.2.0:=[profile?]
+	>=dev-haskell/mtl-2.2.1:=[profile?]
+	>=dev-haskell/parsec-3.0:=[profile?]
+	>=dev-haskell/quickcheck-2.7.4:2=[template_haskell,profile?]
+	dev-haskell/regex-tdfa:=[profile?]
+	dev-haskell/semigroups:=[profile?]
+	>=dev-lang/ghc-7.8.2:=
+	>=dev-haskell/cabal-1.18.1.3 <dev-haskell/cabal-2.5
+	dev-libs/gmp[static-libs]
+	dev-libs/libffi[static-libs]
+"
+
+src_install() {
+	cabal_src_install
+	# TODO(crbug.com/1000756): Add support for manpage build process (requires pandoc)
+	doman "${FILESDIR}/${PN}.1"
+}
diff --git a/dev-util/tclint/Manifest b/dev-util/tclint/Manifest
new file mode 100644
index 0000000..5c3e37825
--- /dev/null
+++ b/dev-util/tclint/Manifest
@@ -0,0 +1 @@
+DIST tclint-2.zip 10266375 BLAKE2B 0a835c3ab754132a4e3794819f4062a61625a3456f69cc28bb376486045d9cfb0baf85c2a33abe6c21843fa663f9b64c96ab344ac2e0d12a4412ddaac08dc3ee SHA512 90bac2460ce76b268b5a45c0df986913e1363dd1db89dea6e0f7da28c58b3999d014c56c31677adbaab1cdc5459c46c17734cdd2d78d05e727aa4982eb3f9bad
diff --git a/dev-util/tclint/tclint-2-r1.ebuild b/dev-util/tclint/tclint-2-r1.ebuild
new file mode 100644
index 0000000..412ca06
--- /dev/null
+++ b/dev-util/tclint/tclint-2-r1.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+# When the time comes to roll to a new version:
+# 1. Download the new binary by cipd command manually
+# 2. Replace the version in this script
+# 3. Zip the file
+# 4. Upload the zip as
+# gs://chromeos-localmirror/distfiles/linux-amd64:${version}.zip
+# 5. Set the ACL of the file to public-read
+# 6. Update manifest of the package by ebuild manifest command.
+
+# released-2020-08-07
+TCLINT_VERSION="JWbE1OOypcIR7PTWuJsDP_WMIoKE2jujjfCGBu_h9zsC"
+SRC_URI="cipd://chromiumos/infra/tclint/linux-amd64:${TCLINT_VERSION} -> ${P}.zip"
+
+DESCRIPTION="Linter for Chrome OS test configuration data"
+HOMEPAGE="https://chromium.googlesource.com/infra/infra/+/HEAD/go/src/infra/cros/cmd/tclint"
+RESTRICT="mirror"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="-* amd64"
+IUSE=""
+
+S="${WORKDIR}"
+
+src_install() {
+	dobin "${S}/tclint"
+}
diff --git a/dev-util/toolchain-utils/toolchain-utils-0.0.1-r578.ebuild b/dev-util/toolchain-utils/toolchain-utils-0.0.1-r578.ebuild
deleted file mode 100644
index ee4eb53..0000000
--- a/dev-util/toolchain-utils/toolchain-utils-0.0.1-r578.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="edc59f7812ca3aa1b5e304d2db7ee4cc44d26482"
-CROS_WORKON_TREE="fbf628de87ea86d3fba4071ef23d6e467d04e503"
-CROS_WORKON_PROJECT="chromiumos/third_party/toolchain-utils"
-CROS_WORKON_LOCALNAME="toolchain-utils"
-
-inherit cros-workon
-
-DESCRIPTION="Compilation and runtime tests for toolchain"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/toolchain-utils/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	app-misc/pax-utils
-	dev-lang/python
-	sys-devel/binutils
-"
-
-src_install() {
-	local tc_dir="/usr/$(get_libdir)/${PN}"
-	local dit_dir="${tc_dir}/debug_info_test"
-
-	insinto ${tc_dir}
-	doins -r debug_info_test
-
-	fperms a+x ${dit_dir}/debug_info_test.py
-
-	dosym ${dit_dir}/debug_info_test.py /usr/bin/debug_info_test
-
-	newbin afdo_redaction/redact_profile.py redact_textual_afdo_profile
-
-	newbin afdo_redaction/remove_indirect_calls.py remove_indirect_calls
-
-	newbin afdo_redaction/remove_cold_functions.py remove_cold_functions
-}
diff --git a/dev-util/toolchain-utils/toolchain-utils-0.0.1-r623.ebuild b/dev-util/toolchain-utils/toolchain-utils-0.0.1-r623.ebuild
new file mode 100644
index 0000000..ad1b2d5
--- /dev/null
+++ b/dev-util/toolchain-utils/toolchain-utils-0.0.1-r623.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="ab646e13303ebe9518e816f85c1e4a56db88ae13"
+CROS_WORKON_TREE="b27c6b2de101470684d4c17acc91d746ebc542ed"
+CROS_WORKON_PROJECT="chromiumos/third_party/toolchain-utils"
+CROS_WORKON_LOCALNAME="toolchain-utils"
+
+inherit cros-workon
+
+DESCRIPTION="Compilation and runtime tests for toolchain"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/toolchain-utils/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	app-misc/pax-utils
+	dev-lang/python
+	sys-devel/binutils
+"
+
+src_install() {
+	local tc_dir="/usr/$(get_libdir)/${PN}"
+	local dit_dir="${tc_dir}/debug_info_test"
+
+	insinto ${tc_dir}
+	doins -r debug_info_test
+
+	fperms a+x ${dit_dir}/debug_info_test.py
+
+	dosym ${dit_dir}/debug_info_test.py /usr/bin/debug_info_test
+
+	newbin afdo_redaction/redact_profile.py redact_textual_afdo_profile
+
+	newbin afdo_redaction/remove_indirect_calls.py remove_indirect_calls
+
+	newbin afdo_redaction/remove_cold_functions.py remove_cold_functions
+}
diff --git a/dev-util/turbostat/turbostat-5.4.50-r2179.ebuild b/dev-util/turbostat/turbostat-5.4.50-r2179.ebuild
deleted file mode 100644
index 4de129d..0000000
--- a/dev-util/turbostat/turbostat-5.4.50-r2179.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="0dc2876505851c2a448030fe88fbb351906f5f31"
-CROS_WORKON_TREE=("19c459c4803e83d8ee5a56601def950ee6fb6cec" "3c6f0a290b022c6c50aa16ec5ea8478413dbc97b" "271149b9f1e2617df41a5968210b918f9c716bd3")
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v5.4"
-CROS_WORKON_EGIT_BRANCH="chromeos-5.4"
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_OUTOFTREE_BUILD=1
-# Narrow the workon scope to just files referenced by the turbostat
-# Makefile:
-# https://chromium.googlesource.com/chromiumos/third_party/kernel/+/chromeos-4.14/tools/power/x86/turbostat/Makefile#12
-CROS_WORKON_SUBTREE="arch/x86/include/asm tools/include tools/power/x86/turbostat"
-
-inherit cros-sanitizers cros-workon toolchain-funcs
-
-HOMEPAGE="https://www.kernel.org/"
-DESCRIPTION="Intel processor C-state and P-state reporting tool"
-
-LICENSE="GPL-2"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND="sys-libs/libcap:="
-
-DEPEND="${RDEPEND}"
-
-domake() {
-	emake -C tools/power/x86/turbostat \
-		BUILD_OUTPUT="$(cros-workon_get_build_dir)" DESTDIR="${D}" \
-		CC="$(tc-getCC)" "$@"
-}
-
-src_configure() {
-	sanitizers-setup-env
-	default
-}
-
-src_compile() {
-	domake
-}
-
-src_install() {
-	domake install
-}
diff --git a/dev-util/turbostat/turbostat-5.4.68-r2199.ebuild b/dev-util/turbostat/turbostat-5.4.68-r2199.ebuild
new file mode 100644
index 0000000..dd0e13f
--- /dev/null
+++ b/dev-util/turbostat/turbostat-5.4.68-r2199.ebuild
@@ -0,0 +1,48 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="be5577853d024bea41db7261a8f2c1cba44e6957"
+CROS_WORKON_TREE=("355369d0b7cffd2ed82f98c4d5ad82dfff0dddca" "e35c93e0a822d1de9d68c0cf6e2665fff75edf8f" "271149b9f1e2617df41a5968210b918f9c716bd3")
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v5.4"
+CROS_WORKON_EGIT_BRANCH="chromeos-5.4"
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_OUTOFTREE_BUILD=1
+# Narrow the workon scope to just files referenced by the turbostat
+# Makefile:
+# https://chromium.googlesource.com/chromiumos/third_party/kernel/+/chromeos-4.14/tools/power/x86/turbostat/Makefile#12
+CROS_WORKON_SUBTREE="arch/x86/include/asm tools/include tools/power/x86/turbostat"
+
+inherit cros-sanitizers cros-workon toolchain-funcs
+
+HOMEPAGE="https://www.kernel.org/"
+DESCRIPTION="Intel processor C-state and P-state reporting tool"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND="sys-libs/libcap:="
+
+DEPEND="${RDEPEND}"
+
+domake() {
+	emake -C tools/power/x86/turbostat \
+		BUILD_OUTPUT="$(cros-workon_get_build_dir)" DESTDIR="${D}" \
+		CC="$(tc-getCC)" "$@"
+}
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
+
+src_compile() {
+	domake
+}
+
+src_install() {
+	domake install
+}
diff --git a/dev-vcs/git-deps/Manifest b/dev-vcs/git-deps/Manifest
new file mode 100644
index 0000000..a1efc00
--- /dev/null
+++ b/dev-vcs/git-deps/Manifest
@@ -0,0 +1 @@
+DIST git-deps-1.0.2.tar.gz 609539 BLAKE2B 104b47297f0f29e0203ec417dc1f3287a420de8b6890832edcc247806d781b6738b9688c8547be4669c6c664b391850db8d2cb861ff4319d9da0099ebc2cddaf SHA512 2d1c32f552ca02d678acaeb64935fa052a2ad3fcf5461dc1f4e3b25a03963ba84df892a25b31caf0d60cf480a31f28fd4d34984ba38407e970956dc73bafaeb3
diff --git a/dev-vcs/git-deps/files/git-deps b/dev-vcs/git-deps/files/git-deps
new file mode 100755
index 0000000..53cd8ad28
--- /dev/null
+++ b/dev-vcs/git-deps/files/git-deps
@@ -0,0 +1,8 @@
+#!/usr/bin/python3
+
+import sys
+
+from git_deps.cli import run
+
+if __name__ == '__main__':
+    sys.exit(run())
diff --git a/dev-vcs/git-deps/git-deps-1.0.2-r1.ebuild b/dev-vcs/git-deps/git-deps-1.0.2-r1.ebuild
new file mode 100644
index 0000000..4799268
--- /dev/null
+++ b/dev-vcs/git-deps/git-deps-1.0.2-r1.ebuild
@@ -0,0 +1,49 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+EGIT_REPO_URI="https://github.com/aspiers/git-deps"
+EGIT_BRANCH=master
+
+PYTHON_COMPAT=( python3_{6..8} )
+
+inherit eutils python-single-r1
+
+DESCRIPTION="git commit dependency analysis tool"
+HOMEPAGE="https://github.com/aspiers/git-deps"
+SRC_URI="https://github.com/aspiers/git-deps/archive/${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="GPL-2"
+KEYWORDS="*"
+SLOT="0/${PVR}"
+
+RDEPEND="
+	$(python_gen_cond_dep '
+		dev-python/flask[${PYTHON_MULTI_USEDEP}]
+		dev-python/pygit2[${PYTHON_MULTI_USEDEP}]
+	')
+	net-libs/nodejs
+	${PYTHON_DEPS}
+	"
+DEPEND="${RDEPEND}"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+pkg_setup() {
+	python-single-r1_pkg_setup
+}
+
+src_install() {
+	python_domodule git_deps
+	python_newscript "${FILESDIR}/git-deps" git-deps
+}
+
+pkg_postinst() {
+	elog "Notes regarding the '--serve' option:"
+	elog "Please run 'npm install browserify' once"
+	elog "Copy the html sources:"
+	elog "rsync -av ${EROOT}/usr/share/${PN}/html ~/git-deps-html"
+	elog "cd ~/git-deps-html"
+	elog "npm install"
+	elog "browserify -t coffeeify -d js/git-deps-graph.coffee -o js/bundle.js"
+}
diff --git a/dev-vcs/git-deps/metadata.xml b/dev-vcs/git-deps/metadata.xml
new file mode 100644
index 0000000..1a9f54b
--- /dev/null
+++ b/dev-vcs/git-deps/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>nicolasbock@gentoo.org</email>
+		<name>Nicolas Bock</name>
+	</maintainer>
+	<longdescription lang="en">
+		git-deps is a tool for performing automatic analysis of dependencies
+		between commits in a git repository.
+	</longdescription>
+	<upstream>
+		<remote-id type="github">aspiers/git-deps</remote-id>
+	</upstream>
+</pkgmetadata>
diff --git a/dev-vcs/patman/patman-0.0.1-r338.ebuild b/dev-vcs/patman/patman-0.0.1-r338.ebuild
deleted file mode 100644
index f3a45bc..0000000
--- a/dev-vcs/patman/patman-0.0.1-r338.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-
-CROS_WORKON_COMMIT="e31a605ff76afe49553508ff15796f9b0677a6fb"
-CROS_WORKON_TREE="0386b4da5d0b36ad084027b771b1045dfc38793b"
-CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
-CROS_WORKON_LOCALNAME="u-boot/files"
-CROS_WORKON_SUBTREE="tools/patman"
-
-PYTHON_COMPAT=( python3_6 )
-
-inherit cros-workon distutils-r1
-
-DESCRIPTION="Patman tool (from U-Boot) for sending patches upstream"
-HOMEPAGE="https://www.denx.de/wiki/U-Boot"
-
-LICENSE="GPL-2"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
-RDEPEND=""
-
-src_prepare() {
-	cd tools/patman
-	distutils-r1_src_prepare
-}
-
-src_compile() {
-	cd tools/patman
-	distutils-r1_src_compile
-}
-
-src_install() {
-	cd tools/patman
-	distutils-r1_src_install
-}
diff --git a/dev-vcs/patman/patman-0.0.1-r341.ebuild b/dev-vcs/patman/patman-0.0.1-r341.ebuild
new file mode 100644
index 0000000..879c899
--- /dev/null
+++ b/dev-vcs/patman/patman-0.0.1-r341.ebuild
@@ -0,0 +1,41 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+
+CROS_WORKON_COMMIT="89150a9314bd432ed8cca9a03034435346fb0b16"
+CROS_WORKON_TREE="8da6ef5b49d3307fea8b69f202dc39fc01c256bb"
+CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"
+CROS_WORKON_LOCALNAME="u-boot/files"
+CROS_WORKON_SUBTREE="tools/patman"
+
+PYTHON_COMPAT=( python3_6 )
+
+inherit cros-workon distutils-r1
+
+DESCRIPTION="Patman tool (from U-Boot) for sending patches upstream"
+HOMEPAGE="https://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
+RDEPEND=""
+
+src_prepare() {
+	cd tools/patman
+	distutils-r1_src_prepare
+}
+
+src_compile() {
+	cd tools/patman
+	distutils-r1_src_compile
+}
+
+src_install() {
+	cd tools/patman
+	distutils-r1_src_install
+}
diff --git a/eclass/OWNERS b/eclass/OWNERS
index 5e4b3a2..26fb302 100644
--- a/eclass/OWNERS
+++ b/eclass/OWNERS
@@ -1,4 +1,5 @@
 set noparent
 include chromiumos/overlays/portage-stable:/eclass/OWNERS
 
+per-file cros-kernel2.eclass = file:/OWNERS.kernel
 per-file libchrome-version.eclass = file:aosp/platform/external/libchrome:/OWNERS
diff --git a/eclass/arc-build.eclass b/eclass/arc-build.eclass
index 4e628e6..d4fb693 100644
--- a/eclass/arc-build.eclass
+++ b/eclass/arc-build.eclass
@@ -102,6 +102,12 @@
 		ARC_GCC_TUPLE=x86_64-linux-android
 		ARC_GCC_BASE="${ARC_BASE}/arc-gcc/x86_64/${ARC_GCC_TUPLE}-4.9"
 
+		# The clang version used by ARC is too old to recognize certain
+		# recent microarchitectures like tremont. Filter it out for now.
+		# TODO(b/161353194) If clang is uprevved, please remove this 
+		# filter and see if the build succeeds.
+		filter-flags -march=tremont
+
 		# multilib.eclass does not use CFLAGS_${DEFAULT_ABI}, but
 		# we need to add some flags valid only for amd64, so we trick
 		# it to think that neither x86 nor amd64 is the default.
diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index 971a064..ad90a0c 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2019 Gentoo Foundation
+# Copyright 1999-2020 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 # @ECLASS: cargo.eclass
@@ -6,50 +6,48 @@
 # rust@gentoo.org
 # @AUTHOR:
 # Doug Goldstein <cardoe@gentoo.org>
+# @SUPPORTED_EAPIS: 6 7
 # @BLURB: common functions and variables for cargo builds
 
 if [[ -z ${_CARGO_ECLASS} ]]; then
 _CARGO_ECLASS=1
 
+# we need this for 'cargo vendor' subcommand and net.offline config knob
+RUST_DEPEND=">=virtual/rust-1.37.0"
+
 case ${EAPI} in
-	6) : ;;
-	5) : ;; # addition to the upstream version because we don't have EAPI=6
+	6) DEPEND="${RUST_DEPEND}";;
+	7) BDEPEND="${RUST_DEPEND}";;
 	*) die "EAPI=${EAPI:-0} is not supported" ;;
 esac
 
-inherit toolchain-funcs
+inherit multiprocessing toolchain-funcs
 
-EXPORT_FUNCTIONS src_unpack src_compile src_install
+EXPORT_FUNCTIONS src_unpack src_compile src_install src_test
 
-IUSE="debug"
-
-CARGO_DEP=""
-[[ ${CATEGORY}/${PN} != dev-util/cargo ]] && CARGO_DEP=">=dev-lang/rust-1.39.0"
-
-RDEPEND="sys-libs/llvm-libunwind"
-DEPEND="
-	${RDEPEND}
-	${CARGO_DEP}
-"
+IUSE="${IUSE} debug"
 
 ECARGO_HOME="${WORKDIR}/cargo_home"
 ECARGO_VENDOR="${ECARGO_HOME}/gentoo"
 
+# @ECLASS-VARIABLE: CARGO_INSTALL_PATH
+# @DESCRIPTION:
+# Allows overriding the default cwd to run cargo install from
+: ${CARGO_INSTALL_PATH:=.}
+
 # @FUNCTION: cargo_crate_uris
 # @DESCRIPTION:
 # Generates the URIs to put in SRC_URI to help fetch dependencies.
 cargo_crate_uris() {
-	for crate in $*; do
-		local name version url pretag
-		name="${crate%-*}"
-		version="${crate##*-}"
-		pretag="^[a-zA-Z]+"
-		if [[ $version =~ $pretag ]]; then
-			version="${name##*-}-${version}"
-			name="${name%-*}"
-		fi
+	local -r regex='^([a-zA-Z0-9_\-]+)-([0-9]+\.[0-9]+\.[0-9]+.*)$'
+	local crate
+	for crate in "$@"; do
+		local name version url
+		[[ $crate =~ $regex ]] || die "Could not parse name and version from crate: $crate"
+		name="${BASH_REMATCH[1]}"
+		version="${BASH_REMATCH[2]}"
 		url="https://crates.io/api/v1/crates/${name}/${version}/download -> ${crate}.crate"
-		echo $url
+		echo "${url}"
 	done
 }
 
@@ -62,7 +60,7 @@
 	mkdir -p "${ECARGO_VENDOR}" || die
 	mkdir -p "${S}" || die
 
-	local archive
+	local archive shasum pkg
 	for archive in ${A}; do
 		case "${archive}" in
 			*.crate)
@@ -102,13 +100,40 @@
 	cargo_gen_config
 }
 
+# @FUNCTION: cargo_live_src_unpack
+# @DESCRIPTION:
+# Runs 'cargo fetch' and vendors downloaded crates for offline use, used in live ebuilds
+
+cargo_live_src_unpack() {
+	debug-print-function ${FUNCNAME} "$@"
+
+	[[ "${PV}" == *9999* ]] || die "${FUNCNAME} only allowed in live/9999 ebuilds"
+	[[ "${EBUILD_PHASE}" == unpack ]] || die "${FUNCNAME} only allowed in src_unpack"
+
+	mkdir -p "${S}" || die
+
+	pushd "${S}" > /dev/null || die
+	CARGO_HOME="${ECARGO_HOME}" cargo fetch || die
+	CARGO_HOME="${ECARGO_HOME}" cargo vendor "${ECARGO_VENDOR}" || die
+	popd > /dev/null || die
+
+	cargo_gen_config
+}
+
 # @FUNCTION: cargo_gen_config
 # @DESCRIPTION:
-# Generate the $CARGO_HOME/config necessary to use our local registry
+# Generate the $CARGO_HOME/config necessary to use our local registry and settings.
+# Cargo can also be configured through environment variables in addition to the TOML syntax below.
+# For each configuration key below of the form foo.bar the environment variable CARGO_FOO_BAR
+# can also be used to define the value.
+# Environment variables will take precedent over TOML configuration,
+# and currently only integer, boolean, and string keys are supported.
+# For example the build.jobs key can also be defined by CARGO_BUILD_JOBS.
+# Or setting CARGO_TERM_VERBOSE=false in make.conf will make build quieter.
 cargo_gen_config() {
 	debug-print-function ${FUNCNAME} "$@"
 
-	cat <<- EOF > ${ECARGO_HOME}/config
+	cat <<- EOF > "${ECARGO_HOME}/config"
 	[source.gentoo]
 	directory = "${ECARGO_VENDOR}"
 
@@ -116,9 +141,17 @@
 	replace-with = "gentoo"
 	local-registry = "/nonexistant"
 
-	[target.${CHOST}]
-	linker = "$(tc-getCC)"
+	[net]
+	offline = true
+
+	[build]
+	jobs = $(makeopts_jobs)
+
+	[term]
+	verbose = true
 	EOF
+	# honor NOCOLOR setting
+	[[ "${NOCOLOR}" = true || "${NOCOLOR}" = yes ]] && echo "color = 'never'" >> "${ECARGO_HOME}/config"
 }
 
 # @FUNCTION: cargo_src_compile
@@ -128,10 +161,10 @@
 	debug-print-function ${FUNCNAME} "$@"
 
 	export CARGO_HOME="${ECARGO_HOME}"
-	export TARGET_CC="$(tc-getCC)"
-	export CARGO_TARGET_DIR="${WORKDIR}"
 
-	cargo build -v $(usex debug "" --release) --target="${CHOST}" "$@" \
+	tc-export AR CC
+
+	cargo build $(usex debug "" --release) "$@" \
 		|| die "cargo build failed"
 }
 
@@ -141,12 +174,23 @@
 cargo_src_install() {
 	debug-print-function ${FUNCNAME} "$@"
 
-	cargo install --root="${D}/usr" --path . --target="${CHOST}" \
-		$(usex debug --debug "") "$@" \
+	cargo install --path ${CARGO_INSTALL_PATH} \
+		--root="${ED}/usr" $(usex debug --debug "") "$@" \
 		|| die "cargo install failed"
-	rm -f "${D}/usr/.crates.toml"
+	rm -f "${ED}/usr/.crates.toml"
+	rm -f "${ED}/usr/.crates2.json"
 
 	[ -d "${S}/man" ] && doman "${S}/man" || return 0
 }
 
+# @FUNCTION: cargo_src_test
+# @DESCRIPTION:
+# Test the package using cargo test
+cargo_src_test() {
+	debug-print-function ${FUNCNAME} "$@"
+
+	cargo test $(usex debug "" --release) "$@" \
+		|| die "cargo test failed"
+}
+
 fi
diff --git a/eclass/chromium-source.eclass b/eclass/chromium-source.eclass
index 3f63bb5..e116483 100644
--- a/eclass/chromium-source.eclass
+++ b/eclass/chromium-source.eclass
@@ -32,6 +32,28 @@
 # @DESCRIPTION: (Optional) Template gclient file passed to sync_chrome
 : ${CHROMIUM_GCLIENT_TEMPLATE:=}
 
+# @ECLASS-VARIABLE: DEPOT_TOOLS
+# @DESCRIPTION: Fixed path to the latest depot_tools code.  The build tools will
+# bind mount this from the outside env.  We do not use the pinned copy in our
+# manifest.
+DEPOT_TOOLS="/mnt/host/depot_tools"
+
+# @ECLASS-VARIABLE: EGCLIENT
+# @DESCRIPTION: Fixed path to the latest gclient tool.
+# TODO(crbug.com/1114821): We use .py to run directly & bypass vpython usage.
+EGCLIENT="${DEPOT_TOOLS}/gclient.py"
+
+# @ECLASS-VARIABLE: ENINJA
+# @DESCRIPTION: Fixed path to the latest ninja tool.  We use the bundled one to
+# avoid version skew between our copy & Chromium's copy.
+ENINJA="${DEPOT_TOOLS}/ninja"
+
+# Prevents gclient from updating self.
+export DEPOT_TOOLS_UPDATE=0
+
+# Prevent gclient metrics collection.
+export DEPOT_TOOLS_METRICS=0
+
 IUSE="chrome_internal"
 
 # If we're cros_workon'ing the ebuild, default to LOCAL_SOURCE,
@@ -43,21 +65,19 @@
 		CHROMIUM_SOURCE_ORIGIN=${CHROME_ORIGIN}
 	fi
 
-	local chrome_workon="=${CATEGORY}/${PN}-9999"
-	local cros_workon_file="${ROOT}etc/portage/package.keywords/cros-workon"
-	if [[ -e "${cros_workon_file}" ]] && grep -q "${chrome_workon}" "${cros_workon_file}"; then
-		# LOCAL_SOURCE is the default for cros_workon
-		# Warn the user if CHROMIUM_SOURCE_ORIGIN is already set
+	if [[ "${PV}" == "9999" ]]; then
+		# LOCAL_SOURCE is the default for cros_workon.
+		# Warn the user if CHROMIUM_SOURCE_ORIGIN is already set.
 		if [[ -n "${CHROMIUM_SOURCE_ORIGIN}" && "${CHROMIUM_SOURCE_ORIGIN}" != LOCAL_SOURCE ]]; then
 			ewarn "CHROMIUM_SOURCE_ORIGIN is already set to ${CHROMIUM_SOURCE_ORIGIN}."
 			ewarn "This will prevent you from building from your local checkout."
 			ewarn "Please run 'unset CHROMIUM_SOURCE_ORIGIN' to reset the build"
 			ewarn "to the default source location."
 		fi
-		: ${CHROMIUM_SOURCE_ORIGIN:=LOCAL_SOURCE}
+		: "${CHROMIUM_SOURCE_ORIGIN:=LOCAL_SOURCE}"
 	else
-		# By default, pull from server
-		: ${CHROMIUM_SOURCE_ORIGIN:=SERVER_SOURCE}
+		# By default, pull from server.
+		: "${CHROMIUM_SOURCE_ORIGIN:=SERVER_SOURCE}"
 	fi
 
 	case "${CHROMIUM_SOURCE_ORIGIN}" in
@@ -107,10 +127,6 @@
 chromium_source_check_out_source() {
 	[[ "${CHROMIUM_SOURCE_ORIGIN}" == LOCAL_SOURCE ]] && return
 
-	local WHOAMI=$(whoami)
-	export EGCLIENT="${EGCLIENT:-/home/${WHOAMI}/depot_tools/gclient}"
-	export DEPOT_TOOLS_UPDATE=0
-
 	# Portage version without optional portage suffix.
 	CHROMIUM_VERSION="${PV/_*/}"
 
@@ -130,32 +146,15 @@
 		cmd+=( --gclient_template="${CHROMIUM_GCLIENT_TEMPLATE}" )
 	fi
 
-	# TODO(engeg): Delete this logic once the git-cache locking is solved.
-	einfo "We're checking for stale locks in git-cache: crbug.com/1069842"
-	einfo "We'll heuristically ignore them based on their age and a short nap."
-	local locks="$(find_git_cache_locks "30")"
-	if [[ -n ${locks} ]]; then
-		ewarn "Running sync ignoring locks on git cache, may cause issues."
-		cmd+=( --ignore_locks )
-	else
-		locks="$(find_git_cache_locks "0")"
-		if [[ -n ${locks} ]]; then
-			ewarn "Found new locks on git cache, sleeping 15 min."
-			sleep 900
-			if [[ -n $(find_git_cache_locks "0") ]]; then
-				ewarn "Locks still present after 15 minute nap. ignoring them."
-				cmd+=( --ignore_locks )
-			fi
-		fi
-	fi
-	# // End engeg todo to delete.
-
 	# --reset tells sync_chrome to blow away local changes and to feel
 	# free to delete any directories that get in the way of syncing. This
 	# is needed for unattended operation.
 	cmd+=( --reset --gclient="${EGCLIENT}" "${CHROMIUM_SOURCE_DIR}" )
 	elog "Running: ${cmd[*]}"
-	"${cmd[@]}" || die
+	# TODO(crbug.com/1103048): Disable the sandbox when syncing the code.
+	# It seems to break gclient execution at random for unknown reasons.
+	# Children stop being tracked, or no git repos actually get cloned.
+	SANDBOX_ON=0 "${cmd[@]}" || die
 }
 
 chromium-source_src_unpack() {
diff --git a/eclass/cros-arm64.eclass b/eclass/cros-arm64.eclass
new file mode 100644
index 0000000..6bc6e30
--- /dev/null
+++ b/eclass/cros-arm64.eclass
@@ -0,0 +1,106 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: cros-arm64.eclass
+# @BLURB: eclass for building arm64 binaries on arm
+# @DESCRIPTION:
+# Multilib builds are not supported in Chrome OS. A simple workaround for arm64
+# builds on arm is to use the host toolchain. This eclass provides helper
+# functions for arm64 environment setup, as well as integration with platform2
+# packages. The "cros_arm64" USE flag determines whether a package should also
+# build arm64 binaries on arm.
+
+inherit cros-workon
+
+IUSE="cros_arm64"
+
+# Setup the build env to create 64bit objects.
+# Force use of stdlibc++ in 64 mode (crbug.com/747696).
+board_setup_64bit_au_env()
+{
+	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"
+
+	__AU_OLD_ARCH=${ARCH}
+	__AU_OLD_ABI=${ABI}
+	__AU_OLD_LIBDIR_arm64=${LIBDIR_arm64}
+	__AU_OLD_CC=${CC}
+	__AU_OLD_CXX=${CXX}
+	export ARCH=arm64 ABI=arm64 LIBDIR_arm64="lib64"
+	if [[ ${CC} == *"clang"* ]]; then
+		export CC=aarch64-cros-linux-gnu-clang
+		export CXX=aarch64-cros-linux-gnu-clang++
+		append-flags "-Xclang-only=-stdlib=libstdc++"
+		append-ldflags "-Xclang-only=-stdlib=libstdc++"
+	fi
+	__AU_OLD_SYSROOT=${SYSROOT}
+	export LIBCHROME_SYSROOT=${SYSROOT}
+	export SYSROOT=/usr/aarch64-cros-linux-gnu
+	append-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib64 -L"${SYSROOT}"/usr/lib64
+	append-cppflags -isystem "${SYSROOT}"/usr/include
+	# Link to libc and libstdc++ statically, because the arm64 shared
+	# libraries are not available on arm. In addition, disable sanitizers
+	# for 64-bit builds.
+	append-flags -static -fno-sanitize=all
+	append-ldflags -static -fno-sanitize=all
+}
+
+# undo what we did in the above function
+board_teardown_64bit_au_env()
+{
+	[[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments"
+	[ -z "${__AU_OLD_SYSROOT}" ] && \
+		die "board_setup_64bit_au_env must be called first"
+
+	filter-ldflags -L"${__AU_OLD_SYSROOT}"/usr/lib64 -L"${SYSROOT}"/usr/lib64
+	filter-flags -isystem "${SYSROOT}"/usr/include
+	filter-flags -static -fno-sanitize=all
+	export SYSROOT=${__AU_OLD_SYSROOT}
+	export LIBDIR_arm64=${__AU_OLD_LIBDIR_arm64}
+	export ABI=${__AU_OLD_ABI}
+	export ARCH=${__AU_OLD_ARCH}
+	if [[ ${CC} == *"clang"* ]]; then
+		export CC=${__AU_OLD_CC}
+		export CXX=${__AU_OLD_CXX}
+		filter-flags "-Xclang-only=-stdlib=libstdc++"
+	fi
+	unset LIBCHROME_SYSROOT
+}
+
+# An ebuild inheriting from "cros-arm64" should also build arm64 binaries if this
+# returns 0. The "arm" check allows the "cros_arm64" USE flag to be enabled for
+# an overlay inherited by non-arm boards.
+use_arm64() { use cros_arm64 && use arm; }
+
+push_arm64_env() {
+	board_setup_64bit_au_env
+}
+
+pop_arm64_env() {
+	export CXX=${__AU_OLD_CXX}
+	export CC=${__AU_OLD_CC}
+	board_teardown_64bit_au_env
+}
+
+_get_arm64_cache() {
+	echo "$(cros-workon_get_build_dir)/arm64"
+}
+
+platform_src_configure_arm64() {
+	local cache=$(_get_arm64_cache)
+	push_arm64_env
+	cros-debug-add-NDEBUG
+	append-lfs-flags
+	platform_configure "--cache_dir=${cache}" "$@"
+	pop_arm64_env
+}
+
+platform_src_compile_arm64() {
+	local cache=$(_get_arm64_cache)
+	push_arm64_env
+	platform "compile" "--cache_dir=${cache}" "$@"
+	pop_arm64_env
+}
+
+platform_out_arm64() {
+	echo "$(_get_arm64_cache)/out/Default"
+}
diff --git a/eclass/cros-bazel.eclass b/eclass/cros-bazel.eclass
index 59a5378..0c4e963 100644
--- a/eclass/cros-bazel.eclass
+++ b/eclass/cros-bazel.eclass
@@ -47,256 +47,307 @@
 # shellcheck disable=SC2016
 BAZEL_CC_BUILD='package(default_visibility = ["//visibility:public"])
 
+filegroup(name = "empty")
+
+# We should really be using @platforms//cpu:x86_64 and friends, but
+# to keep this compatible with Bazel 0.24.1, we need to use the legacy
+# definitions.
+# TODO(crbug/1102798): Once Bazel is uprevved, change these to the @platforms defs.
+amd64_constraints = [
+	"@bazel_tools//platforms:x86_64",
+	"@bazel_tools//platforms:linux",
+]
+
+k8_constraints = amd64_constraints
+
+arm_constraints = [
+	"@bazel_tools//platforms:arm",
+	"@bazel_tools//platforms:linux",
+]
+
+aarch64_constraints = [
+	"@bazel_tools//platforms:aarch64",
+	"@bazel_tools//platforms:linux",
+]
+
+platform(
+	name = "amd64_platform",
+	constraint_values = amd64_constraints,
+)
+
+platform(
+	name = "k8_platform",
+	constraint_values = k8_constraints,
+)
+
+platform(
+	name = "arm_platform",
+	constraint_values = arm_constraints,
+)
+
+platform(
+	name = "aarch64_platform",
+	constraint_values = aarch64_constraints,
+)
+
 cc_toolchain_suite(
 	name = "toolchain",
 	toolchains = {
-		"${cpu_str}|local": "portage_toolchain",
+		"amd64|local": "portage_toolchain",
+		"arm|local": "portage_toolchain",
+		"aarch64|local": "portage_toolchain",
+		"arm64|local": "portage_toolchain",
+		"k8|local": "portage_toolchain",
 	},
 )
 
-filegroup(name = "empty")
-
 cc_toolchain(
-		name = "portage_toolchain",
-		all_files = ":empty",
-		compiler_files = ":empty",
-		cpu = "${cpu_str}",
-		dwp_files = ":empty",
-		linker_files = ":empty",
-		objcopy_files = ":empty",
-		strip_files = ":empty",
-		supports_param_files = 0,
+	name = "portage_toolchain",
+	toolchain_identifier = "portage-toolchain",
+	toolchain_config = ":portage_toolchain_config",
+	all_files = ":empty",
+	compiler_files = ":empty",
+	dwp_files = ":empty",
+	linker_files = ":empty",
+	objcopy_files = ":empty",
+	strip_files = ":empty",
+	supports_param_files = 0,
 )
+
+toolchain(
+	name = "cc-toolchain-${cpu_str}",
+	# compilation execution is always on the host, hence amd64
+	exec_compatible_with = amd64_constraints,
+	target_compatible_with = ${cpu_str}_constraints,
+	toolchain = ":portage_toolchain",
+	toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
+)
+
+load(":cc_toolchain_config.bzl", "cc_toolchain_config")
+cc_toolchain_config(name = "portage_toolchain_config")
 '
 
-# @ECLASS-VARIABLE: BAZEL_CC_TOOLCHAIN
+# @ECLASS-VARIABLE: BAZEL_CC_TOOLCHAIN_CONFIG
 # @INTERNAL
 # @DESCRIPTION:
-# A template (with Bash-style variable placeholders) used to populate CROSSTOOL
-# files for both the "host" and "target" architectures. Specifies the details
-# of the compiler and default flags / settings to use when compiling C/C++
-# code.
-# shellcheck disable=SC2016
-BAZEL_CC_CROSSTOOL='major_version: "local"
-minor_version: ""
-default_target_cpu: "same_as_host"
+# Skylark implementation of the cc toolchain, using Bash-style variables
+# to populate the build file.
+BAZEL_CC_TOOLCHAIN_CONFIG='
+load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
+load(
+  "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
+  "feature",
+  "flag_group",
+  "flag_set",
+  "tool_path",
+)
 
-default_toolchain {
-	cpu: "${cpu_str}"
-	toolchain_identifier: "portage_toolchain"
-}
+features = [
+  feature(name="supports_pic", enabled=True),
+  feature(
+    name="determinism",
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [
+          flag_group(
+            flags = [
+              # Make C++ compilation deterministic. Use linkstamping instead of these
+              # compiler symbols.
+              "-Wno-builtin-macro-redefined",
+              "-D__DATE__=\"redacted\"",
+              "-D__TIMESTAMP__=\"redacted\"",
+              "-D__TIME__=\"redacted\"",
+            ]
+          )
+        ]
+      ),
+    ]
+  ),
+  feature(
+    name="hardening",
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [
+          flag_group(
+            flags = [
+              # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+              # We need to undef it before redefining it as some distributions now
+              # have it enabled by default.
+              "-U_FORTIFY_SOURCE",
+              "-D_FORTIFY_SOURCE=1",
+              "-fstack-protector",
+            ]
+          )
+        ]
+      ),
+      flag_set(
+        actions = [
+          ACTION_NAMES.cpp_link_dynamic_library,
+          ACTION_NAMES.cpp_link_nodeps_dynamic_library,
+        ],
+        flag_groups = [flag_group(flags = ["-Wl,-z,relro,-z,now"])]
+      ),
+      flag_set(
+        actions = [
+          ACTION_NAMES.cpp_link_executable,
+        ],
+        flag_groups = [flag_group(flags = ["-pie", "-Wl,-z,relro,-z,now"])]
+      ),
+    ]
+  ),
+  feature(
+    name="warnings",
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [
+          flag_group(
+            flags = [
+              # All warnings are enabled. Maybe enable -Werror as well?
+              "-Wall",
+              # Add another warning that is not part of -Wall.
+              "-Wunused-but-set-parameter",
+              # But disable some that are problematic.
+              "-Wno-free-nonheap-object" # has false positives
+            ]
+          )
+        ]
+      ),
+    ]
+  ),
+  feature(
+    name="no-canonical-prefixes",
+    flag_sets = [
+      flag_set(
+        actions = [
+          ACTION_NAMES.c_compile,
+          ACTION_NAMES.cpp_compile,
+          ACTION_NAMES.cpp_link_dynamic_library,
+          ACTION_NAMES.cpp_link_nodeps_dynamic_library,
+          ACTION_NAMES.cpp_link_executable,
+        ],
+        flag_groups = [flag_group(flags = ["-no-canonical-prefixes"])]
+      ),
+    ]
+  ),
+  feature(
+    name="linker-bin-path",
+    flag_sets = [
+      flag_set(
+        actions = [
+          ACTION_NAMES.cpp_link_dynamic_library,
+          ACTION_NAMES.cpp_link_nodeps_dynamic_library,
+          ACTION_NAMES.cpp_link_executable,
+        ],
+        flag_groups = [flag_group(flags = ["-B/usr/bin/"])]
+      ),
+    ]
+  ),
+  feature(
+    name="disable-assertions",
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [flag_group(flags = ["-DNDEBUG"])]
+      ),
+    ]
+  ),
+  feature(
+    name="common",
+    implies=[
+      "determinism",
+      "hardening",
+      "warnings",
+      "no-canonical-prefixes",
+      "linker-bin-path"
+    ],
+  ),
+  feature(
+    name="opt",
+    implies=["common", "disable-assertions"],
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [
+          flag_group(
+            flags = ["-g0", "-O2", "-ffunction-sections", "-fdata-sections"]
+          )
+        ]
+      ),
+      flag_set(
+        actions = [
+          ACTION_NAMES.cpp_link_dynamic_library,
+          ACTION_NAMES.cpp_link_nodeps_dynamic_library,
+          ACTION_NAMES.cpp_link_executable,
+        ],
+        flag_groups = [
+          flag_group(
+            flags = ["-Wl,--gc-sections"]
+          )
+        ]
+      )
+    ]
+  ),
+  feature(
+    name="fastbuild",
+    implies=["common"],
+  ),
+  feature(
+    name="dbg",
+    implies=["common"],
+    flag_sets = [
+      flag_set(
+        actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
+        flag_groups = [
+          flag_group(
+            flags = ["-g"]
+          )
+        ]
+      )
+    ]
+  ),
+]
 
-toolchain {
-	abi_version: "local"
-	abi_libc_version: "local"
-	compiler: "local"
-	host_system_name: "local"
-	needsPic: true
-	target_libc: "local"
-	target_cpu: "${cpu_str}"
-	target_system_name: "local"
-	toolchain_identifier: "portage_toolchain"
+def _impl(ctx):
+  tool_paths = [
+    tool_path(name = "gcc", path = "${env_cc}"),
+    tool_path(name = "ar", path = "${env_ar}"),
+    tool_path(name = "compat-ld", path = "${env_ld}"),
+    tool_path(name = "cpp", path = "${env_cpp}"),
+    tool_path(name = "dwp", path = "${env_dwp}"),
+    tool_path(name = "gcov", path = "${env_gcov}"),
+    tool_path(name = "ld", path = "${env_ld}"),
+    tool_path(name = "nm", path = "${env_nm}"),
+    tool_path(name = "objcopy", path = "${env_objcopy}"),
+    tool_path(name = "objdump", path = "${env_objdump}"),
+    tool_path(name = "strip", path = "${env_strip}"),
+  ]
 
-	feature {
-		name: "determinism"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				# Make C++ compilation deterministic. Use linkstamping instead of these
-				# compiler symbols.
-				flag: "-Wno-builtin-macro-redefined"
-				flag: "-D__DATE__=\"redacted\""
-				flag: "-D__TIMESTAMP__=\"redacted\""
-				flag: "-D__TIME__=\"redacted\""
-			}
-		}
-	}
+  return cc_common.create_cc_toolchain_config_info(
+    ctx = ctx,
+    features = features,
+    cxx_builtin_include_directories = [
+      ${builtin_include_dirs}
+    ],
+    builtin_sysroot="${env_sysroot}",
+    toolchain_identifier = "portage-toolchain",
+    host_system_name = "local",
+    target_system_name = "local",
+    target_cpu = "${cpu_str}",
+    target_libc = "local",
+    compiler = "local",
+    abi_version = "local",
+    abi_libc_version = "local",
+    tool_paths = tool_paths,
+  )
 
-	feature {
-		name: "pic"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				expand_if_all_available: "pic"
-				flag: "-fPIC"
-			}
-			flag_group {
-				expand_if_none_available: "pic"
-				flag: "-fPIE"
-			}
-		}
-	}
-
-	# Security hardening on by default.
-	feature {
-		name: "hardening"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				# Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-				# We need to undef it before redefining it as some distributions now
-				# have it enabled by default.
-				flag: "-U_FORTIFY_SOURCE"
-				flag: "-D_FORTIFY_SOURCE=1"
-				flag: "-fstack-protector"
-			}
-		}
-		flag_set {
-			action: "c++-link-dynamic-library"
-			action: "c++-link-nodeps-dynamic-library"
-			flag_group {
-				flag: "-Wl,-z,relro,-z,now"
-			}
-		}
-		flag_set {
-			action: "c++-link-executable"
-			flag_group {
-				flag: "-pie"
-				flag: "-Wl,-z,relro,-z,now"
-			}
-		}
-	}
-
-	feature {
-		name: "warnings"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				# All warnings are enabled. Maybe enable -Werror as well?
-				flag: "-Wall"
-				# Add another warning that is not part of -Wall.
-				flag: "-Wunused-but-set-parameter"
-				# But disable some that are problematic.
-				flag: "-Wno-free-nonheap-object" # has false positives
-			}
-		}
-	}
-
-	# Anticipated future default.
-	feature {
-		name: "no-canonical-prefixes"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			action: "c++-link-executable"
-			action: "c++-link-dynamic-library"
-			action: "c++-link-nodeps-dynamic-library"
-			flag_group {
-				flag: "-no-canonical-prefixes"
-			}
-		}
-	}
-
-	feature {
-		name: "disable-assertions"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				flag: "-DNDEBUG"
-			}
-		}
-	}
-
-	feature {
-		name: "linker-bin-path"
-
-		flag_set {
-			action: "c++-link-executable"
-			action: "c++-link-dynamic-library"
-			action: "c++-link-nodeps-dynamic-library"
-			flag_group {
-				flag: "-B/usr/bin/"
-			}
-		}
-	}
-
-	feature {
-		name: "common"
-		implies: "determinism"
-		implies: "pic"
-		implies: "hardening"
-		implies: "warnings"
-		implies: "no-canonical-prefixes"
-		implies: "linker-bin-path"
-	}
-
-	feature {
-		name: "opt"
-		implies: "common"
-		implies: "disable-assertions"
-
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				# No debug symbols.
-				# Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt
-				# or even generally? However, that cant happen here, as it requires
-				# special handling in Bazel.
-				flag: "-g0"
-
-				# Conservative choice for -O
-				# -O3 can increase binary size and even slow down the resulting binaries.
-				# Profile first and / or use FDO if you need better performance than this.
-				flag: "-O2"
-
-				# Removal of unused code and data at link time (can this increase binary size in some cases?).
-				flag: "-ffunction-sections"
-				flag: "-fdata-sections"
-			}
-		}
-		flag_set {
-			action: "c++-link-dynamic-library"
-			action: "c++-link-nodeps-dynamic-library"
-			action: "c++-link-executable"
-			flag_group {
-				flag: "-Wl,--gc-sections"
-			}
-		}
-	}
-
-	feature {
-		name: "fastbuild"
-		implies: "common"
-	}
-
-	feature {
-		name: "dbg"
-		implies: "common"
-		flag_set {
-			action: "c-compile"
-			action: "c++-compile"
-			flag_group {
-				flag: "-g"
-			}
-		}
-	}
-
-	tool_path { name: "gcc" path: "${env_cc}" }
-
-	tool_path { name: "ar" path: "${env_ar}" }
-	tool_path { name: "compat-ld" path: "${env_ld}" }
-	tool_path { name: "cpp" path: "${env_cpp}" }
-	tool_path { name: "dwp" path: "${env_dwp}" }
-	tool_path { name: "gcov" path: "${env_gcov}" }
-	tool_path { name: "ld" path: "${env_ld}" }
-	tool_path { name: "nm" path: "${env_nm}" }
-	tool_path { name: "objcopy" path: "${env_objcopy}" }
-	tool_path { name: "objdump" path: "${env_objdump}" }
-	tool_path { name: "strip" path: "${env_strip}" }
-
-	# Enabled dynamic linking.
-	linking_mode_flags { mode: DYNAMIC }
-
-${builtin_include_dirs}
-
-	builtin_sysroot: "${env_sysroot}"
-}
+cc_toolchain_config = rule(
+  implementation = _impl,
+  attrs = {},
+  provides = [CcToolchainConfigInfo],
+)
 '
 
 # @FUNCTION: bazel_get_builtin_include_dirs
@@ -304,8 +355,7 @@
 # @RETURN:
 # A list of the directories that are searched by default on invocation of the
 # given compiler's preprocessor. These directories are normalized (e.g.
-# parsing "..") and formatted as cxx_builtin_include_directory fields of the
-# CToolchain proto message.
+# parsing "..") and formatted as a python list of strings.
 # @MAINTAINER:
 # Michael Martis <martis@chromium.org>
 # @INTERNAL
@@ -332,7 +382,7 @@
 		norm_dir="$(cd "${include_dir}" && pwd || die)"
 
 		# Print the normalized path as a proto field.
-		echo "	cxx_builtin_include_directory: \"${norm_dir}\""
+		echo "\"${norm_dir}\","
 	done <<< "${include_dirs}"
 }
 
@@ -364,8 +414,7 @@
 	cpu_str="${cpu_str}" \
 	envsubst <<< "${BAZEL_CC_BUILD}" > "${output_dir}/BUILD" || die
 
-	# Write out the CROSSTOOL file for this configuration, including formatted
-	# include directories and compiler / linker flags from the environment.
+	# Write out the toolchain_config file for this configuration.
 	#
 	# We call tc-getPROG directly for cpp, since we require a program that directly
 	# performs preprocessing (i.e. takes no flags), whereas tc-getCPP returns an
@@ -383,7 +432,8 @@
 	env_objcopy="$(command -v "$("tc-get${env_prefix}OBJCOPY")" || die)" \
 	env_objdump="$(command -v "$("tc-get${env_prefix}OBJDUMP")" || die)" \
 	env_strip="$(command -v "$("tc-get${env_prefix}STRIP")" || die)" \
-	envsubst <<< "${BAZEL_CC_CROSSTOOL}" > "${output_dir}/CROSSTOOL" || die
+	envsubst <<< "${BAZEL_CC_TOOLCHAIN_CONFIG}" > \
+	"${output_dir}/cc_toolchain_config.bzl" || die
 }
 
 # @FUNCTION: bazel_get_stdlib_linkflag
@@ -445,6 +495,12 @@
 	build --package_path="%workspace%:${BAZEL_PORTAGE_PACKAGE_DIR}"
 	build --host_crosstool_top="//${BAZEL_CC_CONFIG_DIR}/host:toolchain" --crosstool_top="//${BAZEL_CC_CONFIG_DIR}/target:toolchain"
 	build --host_cpu="${host_cpu_str}" --cpu="${target_cpu_str}" --compiler=local --host_compiler=local
+	build --host_platform="//${BAZEL_CC_CONFIG_DIR}/host:${host_cpu_str}_platform"
+	build --platforms="//${BAZEL_CC_CONFIG_DIR}/target:${target_cpu_str}_platform"
+	build --extra_toolchains="//${BAZEL_CC_CONFIG_DIR}/target:cc-toolchain-${target_cpu_str}"
+
+	# This is super helpful for figuring out how the toolchain is determined
+	# build --toolchain_resolution_debug
 
 	# Add correct standard library link flags.
 	build --linkopt="$(bazel_get_stdlib_linkflag "$(tc-get-compiler-type)" || die)"
diff --git a/eclass/cros-board.eclass b/eclass/cros-board.eclass
index fe2bc78..1b46d63 100644
--- a/eclass/cros-board.eclass
+++ b/eclass/cros-board.eclass
@@ -28,6 +28,7 @@
 # they won't be accidentally recycled in the future.
 ALL_BOARDS=(
 	acorn
+	ambassador
 	amd64-corei7
 	#amd64-drm
 	amd64-generic
@@ -68,7 +69,7 @@
 	betty-arcmaster
 	betty-arcnext
 	betty-arcvm-master
-	betty-arcvm-pi
+	#betty-arcvm-pi
 	betty-pi-arc
 	#betty-qt-arc
 	#bettyvirgl
@@ -78,6 +79,7 @@
 	bolt
 	borealis
 	bruteus
+	brya
 	bubs
 	buddy
 	buddy-cfm
@@ -143,7 +145,7 @@
 	enguarde
 	#envoy-jerry
 	eve
-	eve-arcdual
+	#eve-arcdual
 	eve-arcnext
 	eve-arc-r
 	eve-arcvm
@@ -176,6 +178,7 @@
 	#fox_wtm2
 	gale
 	gandof
+	genesis
 	#gizmo
 	glados
 	glados-cheets
@@ -186,6 +189,7 @@
 	gonzo
 	gru
 	grunt
+	grunt-arc-r
 	grunt-kernelnext
 	guado
 	guado-accelerator
@@ -199,6 +203,7 @@
 	hatch
 	hatch-arc-r
 	hatch-arc-r-userdebug
+	hatch-blueznext
 	hatch-borealis
 	hatch-diskswap
 	hatch-kernelnext
@@ -323,6 +328,7 @@
 	ppcle-32-generic
 	ppcle-64-generic
 	puff
+	puff-macrophage
 	puppy
 	purin
 	pyro
@@ -331,6 +337,7 @@
 	rambi
 	rammus
 	rammus-arc-r
+	rammus-arc-r-userdebug
 	raspberrypi
 	reef
 	relm
@@ -357,6 +364,7 @@
 	#scarlet-arcnext
 	sentry
 	setzer
+	shadowkeep
 	shogun
 	sklrvp
 	#slippy
@@ -374,6 +382,7 @@
 	stout
 	#stout32
 	strago
+	strongbad
 	stumpy
 	stumpy_moblab
 	stumpy_pico
@@ -397,6 +406,8 @@
 	tidus
 	tricky
 	trogdor
+	trogdor-kernelnext
+	trogdor64
 	ultima
 	umaro
 	#urara
@@ -458,6 +469,7 @@
 	zako
 	zoombini
 	zork
+	zork-borealis
 	zork-kernelnext
 )
 
diff --git a/eclass/cros-ec-board.eclass b/eclass/cros-ec-board.eclass
index 56aed51..ad12ec8 100644
--- a/eclass/cros-ec-board.eclass
+++ b/eclass/cros-ec-board.eclass
@@ -41,74 +41,30 @@
 EC_BOARD_USE_PREFIX="ec_firmware_"
 EC_EXTRA_BOARD_USE_PREFIX="ec_firmware_extra_"
 
-# EC firmware board names for overlay with special configuration
+# Board names to check for based on USE flags.
+# This is used for **pre-unibuild legacy boards only**!  Unibuild developments
+# are configured in chromeos-config.  Adjust /firmware/build-targets in your
+# model.yaml or Boxster file instead of appending to the list below.
 EC_BOARD_NAMES=(
-	asurada
-	atlas
-	atlas_ish
 	bds
-	cheza
-	coral
 	cr50
 	cyan
-	dedede
 	dingdong
-	dragonegg
 	elm
-	endeavour
-	eve
-	eve_fp
-	fizz
-	flapjack
 	glkrvp
-	grunt
 	hadoken
 	hammer
-	hatch
-	hatch_fp
 	hoho
-	jacuzzi
 	jerry
-	kalista
-	kukui
-	llama
-	lux
-	meowth
-	meowth_fp
-	minimuffin
-	mushu
-	nami
-	nami_fp
-	nautilus
-	nefario
-	nocturne
-	nocturne_fp
 	oak
 	oak_pd
-	octopus
-	orchestra
-	palkia
 	plankton
 	poppy
-	rammus
-	reef
-	ryu
-	ryu_p4p5
-	ryu_sh
-	ryu_sh_loader
 	samus
 	samus_pd
-	scarlet
-	soraka
-	staff
 	strago
-	trogdor
-	twinkie
 	wand
-	whiskers
 	zinger
-	zoombini
-	zork
 )
 
 IUSE_FIRMWARES="${EC_BOARD_NAMES[@]/#/${EC_BOARD_USE_PREFIX}}"
diff --git a/eclass/cros-ec-merge-ro.eclass b/eclass/cros-ec-merge-ro.eclass
index c90f496..f556322 100644
--- a/eclass/cros-ec-merge-ro.eclass
+++ b/eclass/cros-ec-merge-ro.eclass
@@ -20,7 +20,7 @@
 
 # Check for EAPI 6+
 case "${EAPI:-0}" in
-0|1|2|3|4|5) die "unsupported EAPI (${EAPI}) in eclass (${ECLASS})" ;;
+0|1|2|3|4|5|6) die "unsupported EAPI (${EAPI}) in eclass (${ECLASS})" ;;
 *) ;;
 esac
 
@@ -28,14 +28,14 @@
 
 # Make sure that private files ebuild has run since it creates the symlink
 # used in the src_install step below.
-DEPEND="virtual/chromeos-ec-private-files"
-
-# @ECLASS-VARIABLE: FIRMWARE_EC_RELEASE_RO_VERSION
-# @DEFAULT_UNSET
-# @DESCRIPTION:
-# RO version of firmware to use. If unspecified, the default version will be
-# used.
-: "${FIRMWARE_EC_RELEASE_RO_VERSION:=}"
+# We also use cros_config_host below.
+DEPEND="
+	virtual/chromeos-ec-private-files
+	virtual/chromeos-config-bsp
+"
+BDEPEND="
+	chromeos-base/chromeos-config-host
+"
 
 # @FUNCTION: cros-ec-merge-ro_do_merge
 # @USAGE: <RO firmware path> <RW firmware path>
@@ -96,10 +96,15 @@
 		return 0
 	fi
 
-	# If FIRMWARE_EC_RELEASE_RO_VERSION is specified then use it.
-	# Otherwise, validate that there is exactly one RO binary.
-	local ro_version="${FIRMWARE_EC_RELEASE_RO_VERSION}"
+	# If cros_config provides RO firmware version, then use it. The RO firmware
+	# version does not have to be specified, in which case cros_config_host will
+	# exit with success and not print any firmware version.
+	# In that case, we want to use the "default" RO firmware, so validate
+	# that there is exactly one RO binary.
 	local fw_target="${target%%_fp}"
+	local ro_version
+	ro_version="$(cros_config_host \
+		get-fpmcu-firmware-ro-version "${fw_target}" || die)"
 
 	local ro_fw
 	if [[ -n ${ro_version} ]]; then
diff --git a/eclass/cros-ec.eclass b/eclass/cros-ec.eclass
index 96dc716..6f72770 100644
--- a/eclass/cros-ec.eclass
+++ b/eclass/cros-ec.eclass
@@ -141,8 +141,8 @@
 		extra_opts+=( "BOOTBLOCK=${bootblock}" )
 	fi
 
-	BOARD=${target} emake "${EC_OPTS[@]}" clean
-	BOARD=${target} emake "${EC_OPTS[@]}" "${extra_opts[@]}" all
+	BOARD=${board} emake "${EC_OPTS[@]}" clean
+	BOARD=${board} emake "${EC_OPTS[@]}" "${extra_opts[@]}" all
 	# Since the ec codebase does not allow specifying a target build
 	# directory, move its build directory to the requested location.
 	rm -rf "${build_dir}"
diff --git a/eclass/cros-ish.eclass b/eclass/cros-ish.eclass
index 74b68b5..5618b1b 100644
--- a/eclass/cros-ish.eclass
+++ b/eclass/cros-ish.eclass
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE.makefile file.
 
-# @ECLASS: cros-ec.eclass
+# @ECLASS: cros-ish.eclass
 # @MAINTAINER:
 # Chromium OS Firmware Team
 # @BUGREPORTS:
diff --git a/eclass/cros-kernel/OWNERS b/eclass/cros-kernel/OWNERS
index fe26da9..772bab4 100644
--- a/eclass/cros-kernel/OWNERS
+++ b/eclass/cros-kernel/OWNERS
@@ -1,3 +1,5 @@
+include /OWNERS.kernel
+
 # defconfig files should only be used as a fallback, not for official builds.
 per-file *defconfig=*
 # Docs aren't critical to the build.
diff --git a/eclass/cros-kernel/qualcomm_defconfig b/eclass/cros-kernel/qualcomm_defconfig
index 9fc7122..7f7bc89 100644
--- a/eclass/cros-kernel/qualcomm_defconfig
+++ b/eclass/cros-kernel/qualcomm_defconfig
@@ -462,6 +462,8 @@
 # CONFIG_SND_SPI is not set
 CONFIG_SND_USB_AUDIO=m
 CONFIG_SND_SOC=y
+CONFIG_SND_SOC_QCOM=y
+CONFIG_SND_SOC_SC7180=y
 CONFIG_SND_SOC_SSM4567=m
 CONFIG_SND_SOC_TS3A227E=y
 CONFIG_SND_SIMPLE_CARD=y
@@ -608,6 +610,7 @@
 CONFIG_IIO_HRTIMER_TRIGGER=y
 CONFIG_IIO_SYSFS_TRIGGER=y
 CONFIG_IIO_CROS_EC_BARO=y
+CONFIG_SX9310=y
 CONFIG_PWM=y
 CONFIG_PWM_CROS_EC=y
 CONFIG_QCOM_PDC=y
diff --git a/eclass/cros-kernel2.eclass b/eclass/cros-kernel2.eclass
index 98250f5..e319906 100644
--- a/eclass/cros-kernel2.eclass
+++ b/eclass/cros-kernel2.eclass
@@ -11,7 +11,7 @@
 # Since we use CHROMEOS_KERNEL_CONFIG and CHROMEOS_KERNEL_SPLITCONFIG here,
 # it is not safe to reuse the kernel prebuilts across different boards. Inherit
 # the cros-board eclass to make sure that doesn't happen.
-inherit binutils-funcs cros-board toolchain-funcs
+inherit binutils-funcs cros-board estack toolchain-funcs
 
 HOMEPAGE="http://www.chromium.org/"
 LICENSE="GPL-2"
@@ -52,6 +52,9 @@
 	fit_compression_kernel_lzma
 	firmware_install
 	-kernel_sources
+	kernel_warning_level_1
+	kernel_warning_level_2
+	kernel_warning_level_3
 	+lld
 	nfc
 	${WIRELESS_SUFFIXES[@]/#/-wireless}
@@ -65,7 +68,6 @@
 	tpm2
 	-kernel_afdo
 	-kernel_afdo_verify
-	test
 	+vdso32
 	-criu
 	-docker
@@ -110,7 +112,12 @@
 	eshopts_push -s nullglob
 	local patches=( "${FILESDIR}"/*.patch )
 	eshopts_pop
-	[[ ${#patches[@]} -gt 0 ]] && epatch "${patches[@]}"
+	if [[ ${#patches[@]} -gt 0 ]]; then
+		case "${EAPI}" in
+		[45]) epatch "${patches[@]}";;
+		*) eapply "${patches[@]}";;
+		esac
+	fi
 }
 
 # Ignore files under /lib/modules/ as we like to install vdso objects in there.
@@ -162,6 +169,7 @@
 	highmem
 	hypervisor_guest
 	i2cdev
+	irqsoff_tracer
 	iscsi
 	lockdown
 	kasan
@@ -185,11 +193,13 @@
 	pcserial
 	plan9
 	ppp
+	preempt_tracer
 	pvrdebug
 	qmi
 	realtekpstor
 	recovery_ramfs
 	samsung_serial
+	sched_tracer
 	selinux_develop
 	socketmon
 	systemtap
@@ -412,6 +422,11 @@
 CONFIG_I2C_CHARDEV=y
 "
 
+irqsoff_tracer_desc="irqsoff tracer"
+irqsoff_tracer_config="
+CONFIG_IRQSOFF_TRACER=y
+"
+
 iscsi_desc="iSCSI initiator and target drivers"
 iscsi_config="
 CONFIG_SCSI_LOWLEVEL=y
@@ -480,6 +495,7 @@
 kmemleak_config="
 CONFIG_DEBUG_KMEMLEAK=y
 CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=16384
+CONFIG_DEBUG_KMEMLEAK_TEST=m
 "
 
 lockdebug_desc="Additional lock debug settings"
@@ -723,16 +739,24 @@
 CONFIG_9P_FS_SECURITY=y
 "
 
+# NB: CONFIG_PPP must be built-in, because it provides the /dev/ppp alias
+# (MODULE_ALIAS_CHARDEV()), which otherwise doesn't play nicely with our udev
+# rules to change its permissions. See also: b/166388882 and crbug.com/864474.
 ppp_desc="PPPoE and ppp support"
 ppp_config="
 CONFIG_PPPOE=m
-CONFIG_PPP=m
+CONFIG_PPP=y
 CONFIG_PPP_BSDCOMP=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_MPPE=m
 CONFIG_PPP_SYNC_TTY=m
 "
 
+preempt_tracer_desc="preemption off tracer"
+preempt_tracer_config="
+CONFIG_PREEMPT_TRACER=y
+"
+
 qmi_desc="QMI WWAN driver"
 qmi_config="
 CONFIG_USB_NET_QMI_WWAN=m
@@ -749,6 +773,11 @@
 CONFIG_SERIAL_SAMSUNG_CONSOLE=y
 "
 
+sched_tracer_desc="scheduling latency tracer"
+sched_tracer_config="
+CONFIG_SCHED_TRACER=y
+"
+
 selinux_develop_desc="SELinux developer mode"
 selinux_develop_config="
 # CONFIG_SECURITY_SELINUX_PERMISSIVE_DONTAUDIT is not set
@@ -1237,7 +1266,7 @@
 
 builtin_fw_huc_tgl_desc="HuC Firmware for TGL"
 builtin_fw_huc_tgl_files=(
-	i915/tgl_huc_7.0.3.bin
+	i915/tgl_huc_7.0.12.bin
 )
 
 extra_fw_config="
@@ -1417,10 +1446,6 @@
 }
 
 cros-kernel2_pkg_setup() {
-	# This is needed for running src_test().  The kernel code will need to
-	# be rebuilt with `make check`.  If incremental build were enabled,
-	# `make check` would have nothing left to build.
-	use test && export CROS_WORKON_INCREMENTAL_BUILD=0
 	cros-workon_pkg_setup
 }
 
@@ -1730,6 +1755,20 @@
 	unset CFLAGS
 	unset LDFLAGS
 
+	local kernel_warning_level=""
+	if use kernel_warning_level_1; then
+		kernel_warning_level+=1
+	fi
+	if use kernel_warning_level_2; then
+		kernel_warning_level+=2
+	fi
+	if use kernel_warning_level_3; then
+		kernel_warning_level+=3
+	fi
+	if [[ -n "${kernel_warning_level}" ]]; then
+		kernel_warning_level="W=${kernel_warning_level}"
+	fi
+
 	ARCH=${kernel_arch} \
 		CROSS_COMPILE="${cross}-" \
 		CROSS_COMPILE_COMPAT="${cross_compat}" \
@@ -1737,6 +1776,7 @@
 		emake \
 		V="${VERBOSE:-0}" \
 		O="$(cros-workon_get_build_dir)" \
+		${kernel_warning_level} \
 		"$@"
 }
 
@@ -2026,9 +2066,6 @@
 			;;
 	esac
 
-	local src_dir="$(cros-workon_get_build_dir)/source"
-	SMATCH_ERROR_FILE="${src_dir}/chromeos/check/smatch_errors.log"
-
 	# If a .dts file is deleted from the source code it won't disappear
 	# from the output in the next incremental build.  Nuke all dtbs so we
 	# don't include stale files.  We use 'find' to handle old and new
@@ -2036,24 +2073,9 @@
 	local arch_dir="$(cros-workon_get_build_dir)/arch"
 	[[ -d "${arch_dir}" ]] && find "${arch_dir}" -name '*.dtb' -delete
 
-	if use test && [[ -e "${SMATCH_ERROR_FILE}" ]]; then
-		local make_check_cmd="smatch -p=kernel"
-		local test_options=(
-			CHECK="${make_check_cmd}"
-			C=1
-		)
-		SMATCH_LOG_FILE="$(cros-workon_get_build_dir)/make.log"
+	kmake -k ${build_targets[@]}
 
-		# The path names in the log file are build-dependent.  Strip out
-		# the part of the path before "kernel/files" and retains what
-		# comes after it: the file, line number, and error message.
-		kmake -k ${build_targets[@]} "${test_options[@]}" |& \
-			tee "${SMATCH_LOG_FILE}"
-	else
-		kmake -k ${build_targets[@]}
-	fi
-
-	if use compilation_database || ( use test && use clang ); then
+	if use compilation_database; then
 		gen_compilation_database
 	fi
 }
@@ -2116,50 +2138,10 @@
 	fi
 }
 
-cros-kernel2_src_test() {
-	if use buildtest ; then
-		ewarn "Skipping unit tests for buildtest"
-		return 0
-	fi
-
-	[[ -e ${SMATCH_ERROR_FILE} ]] || \
-		die "smatch whitelist file ${SMATCH_ERROR_FILE} not found!"
-	[[ -e ${SMATCH_LOG_FILE} ]] || \
-		die "Log file from src_compile() ${SMATCH_LOG_FILE} not found!"
-
-	local prefix="$(realpath "${S}")/"
-	grep -w error: "${SMATCH_LOG_FILE}" | grep -o "${prefix}.*" \
-		| sed s:"${prefix}"::g > "${SMATCH_LOG_FILE}.errors"
-	local num_errors=$(wc -l < "${SMATCH_LOG_FILE}.errors")
-	local num_warnings=$(egrep -wc "warn:|warning:" "${SMATCH_LOG_FILE}")
-	einfo "smatch found ${num_errors} errors and ${num_warnings} warnings."
-
-	# Create a version of the error database that doesn't have line numbers,
-	# since line numbers will shift as code is added or removed.
-	local build_dir="$(cros-workon_get_build_dir)"
-	local no_line_numbers_file="${build_dir}/no_line_numbers.log"
-	sed -r -e "s/(:[0-9]+){1,2}//" \
-			-e "s/\(see line [0-9]+\)//" \
-			"${SMATCH_ERROR_FILE}" > "${no_line_numbers_file}"
-
-	# For every smatch error that came up during the build, check if it is
-	# in the error database file.
-	local num_unknown_errors=0
-	local line=""
-	while read line; do
-		local no_line_num=$(echo "${line}" | \
-			sed -r -e "s/(:[0-9]+){1,2}//" \
-					-e "s/\(see line [0-9]+\)//")
-		if ! fgrep -q "${no_line_num}" "${no_line_numbers_file}"; then
-			eerror "Non-whitelisted error found: \"${line}\""
-			: $(( ++num_unknown_errors ))
-		fi
-	done < "${SMATCH_LOG_FILE}.errors"
-
-	[[ ${num_unknown_errors} -eq 0 ]] || \
-		die "smatch found ${num_unknown_errors} unknown errors."
-}
-
+# @FUNCTION: cros-kernel2_src_install
+# @USAGE: [install_prefix]
+# @DESCRIPTION:
+# install the kernel to the system at ${D}${install_prefix}.
 cros-kernel2_src_install() {
 	if use firmware_install; then
 		die "The firmware_install USE flag is dead."
@@ -2170,8 +2152,15 @@
 		return 0
 	fi
 
-	dodir /boot
-	kmake INSTALL_MOD_PATH="${D}" INSTALL_PATH="${D}/boot" install
+	local install_prefix=${1}
+	local install_dir="${D}${install_prefix}"
+
+	if use kernel_sources && [[ -n "${install_prefix}" ]]; then
+		die "The install_prefix option is not supported with USE kernel_sources flag."
+	fi
+
+	dodir "${install_prefix}/boot"
+	kmake INSTALL_MOD_PATH="${install_dir}" INSTALL_PATH="${install_dir}/boot" install
 
 	if use device_tree; then
 		_cros-kernel2_compress_fit_kernel \
@@ -2181,16 +2170,17 @@
 	local version=$(kernelrelease)
 
 	if cros_chkconfig_present MODULES; then
-		kmake INSTALL_MOD_PATH="${D}" INSTALL_MOD_STRIP="magic" \
+		kmake INSTALL_MOD_PATH="${install_dir}" INSTALL_MOD_STRIP="magic" \
 			STRIP="$(eclass_dir)/strip_splitdebug" \
 			modules_install
 		if ! has ${EAPI} {4..6}; then
-			dostrip -x "/lib/modules/${version}/kernel/" /usr/lib/debug/lib/modules/
+			dostrip -x "${install_prefix}/lib/modules/${version}/kernel/" \
+				"${install_prefix}/usr/lib/debug/lib/modules/"
 		fi
 	fi
 
 	local kernel_arch=${CHROMEOS_KERNEL_ARCH:-$(tc-arch-kernel)}
-	local kernel_bin="${D}/boot/vmlinuz-${version}"
+	local kernel_bin="${install_dir}/boot/vmlinuz-${version}"
 
 	# We might have compressed in background; wait for it now.
 	wait
@@ -2198,8 +2188,8 @@
 	if use arm || use arm64 || use mips; then
 		local kernel_dir="$(cros-workon_get_build_dir)"
 		local boot_dir="${kernel_dir}/arch/${kernel_arch}/boot"
-		local zimage_bin="${D}/boot/zImage-${version}"
-		local image_bin="${D}/boot/Image-${version}"
+		local zimage_bin="${install_dir}/boot/zImage-${version}"
+		local image_bin="${install_dir}/boot/Image-${version}"
 		local dtb_dir="${boot_dir}"
 
 		# Newer kernels (after linux-next 12/3/12) put dtbs in the dts
@@ -2230,7 +2220,7 @@
 				#
 				# TODO(jrbarnette):  Really, this should use a
 				# FIT image, same as other boards.
-				insinto /boot/dts
+				insinto "${install_prefix}/boot/dts"
 				doins "${dtb_dir}"/*.dtb
 			fi
 		fi
@@ -2256,50 +2246,31 @@
 		esac
 		popd > /dev/null
 	fi
-	if [ ! -e "${D}/boot/vmlinuz" ]; then
-		ln -sf "vmlinuz-${version}" "${D}/boot/vmlinuz" || die
+	if [ ! -e "${install_dir}/boot/vmlinuz" ]; then
+		ln -sf "vmlinuz-${version}" "${install_dir}/boot/vmlinuz" || die
 	fi
 
 	# Check the size of kernel image and issue warning when image size is near
 	# the limit. For netboot initramfs, we don't care about kernel
 	# size limit as the image is downloaded over network.
-	local kernel_image_size=$(stat -c '%s' -L "${D}"/boot/vmlinuz)
+	local kernel_image_size=$(stat -c '%s' -L "${install_dir}"/boot/vmlinuz)
 	einfo "Kernel image size is ${kernel_image_size} bytes."
-	if use factory_netboot_ramfs; then
-		# No need to check kernel image size.
-		true
-	else
-		local cut_version=$(ver_cut 1-2 "${version}")
-		if ver_test 3.18 -le "${cut_version}" ; then
-			kern_max=32
-			kern_warn=12
-		elif ver_test 3.10 -le "${cut_version}" ; then
-			kern_max=16
-			kern_warn=12
-		else
-			kern_max=8
-			kern_warn=7
-		fi
-
-		if [[ ${kernel_image_size} -gt $((kern_max * 1024 * 1024)) ]]; then
-			die "Kernel image is larger than ${kern_max} MB."
-		elif [[ ${kernel_image_size} -gt $((kern_warn * 1024 * 1024)) ]]; then
-			ewarn "Kernel image is larger than ${kern_warn} MB. Limit is ${kern_max} MB."
-		fi
-	fi
 
 	# Install uncompressed kernel for debugging purposes.
-	insinto /usr/lib/debug/boot
+	insinto "${install_prefix}/usr/lib/debug/boot"
 	doins "$(cros-workon_get_build_dir)/vmlinux"
 	if ! has ${EAPI} {4..6}; then
-		dostrip -x /usr/lib/debug/boot/vmlinux /usr/src/
+		dostrip -x "${install_prefix}/usr/lib/debug/boot/vmlinux" \
+			"${install_prefix}/usr/src/"
 	fi
 	if use kgdb && [[ -d "$(cros-workon_get_build_dir)/scripts/gdb" ]]; then
-		cp "$(cros-workon_get_build_dir)/vmlinux-gdb.py" "${D}"/usr/lib/debug/boot/ || die
-		mkdir "${D}"/usr/lib/debug/boot/scripts || die
-		rsync -rKL \
+		insinto "${install_prefix}/usr/lib/debug/boot/"
+		doins "$(cros-workon_get_build_dir)/vmlinux-gdb.py"
+		mkdir "${install_dir}"/usr/lib/debug/boot/scripts || die
+		rsync -rKLp --chmod=a+r \
 			--include='*/' --include='*.py' --exclude='*' \
-			"$(cros-workon_get_build_dir)/scripts/gdb/" "${D}"/usr/lib/debug/boot/scripts/gdb || die
+			"$(cros-workon_get_build_dir)/scripts/gdb/" \
+			"${install_dir}"/usr/lib/debug/boot/scripts/gdb || die
 	fi
 
 	# Also install the vdso shared ELFs for crash reporting.
@@ -2320,7 +2291,23 @@
 
 		# Use the debug versions (.so.dbg) so portage can run splitdebug on them.
 		for f in "${vdso_dir}"/vdso*.so.dbg; do
-			d="/lib/modules/${version}/vdso/${f##*/}"
+			d="${install_prefix}/lib/modules/${version}/vdso/${f##*/}"
+
+			exeinto "${d}"
+			newexe "${f}" "linux-gate.so"
+
+			soname=$(scanelf -qF'%S#f' "${f}")
+			dosym "linux-gate.so" "${d}/${soname}"
+		done
+	elif [[ "${kernel_arch}" == "arm64" ]]; then
+		local vdso_dir d f soname
+		vdso_dir="$(cros-workon_get_build_dir)/arch/arm64/kernel/vdso"
+		[[ -d ${vdso_dir} ]] || die "could not find arm64 vDSO dir"
+
+		# Use the debug versions (.so.dbg) so portage can run splitdebug on them.
+		for f in "${vdso_dir}"*/vdso*.so.dbg; do
+			d="${install_prefix}/lib/modules/${version}/vdso${f#*vdso}"
+			d="${d%/*}"
 
 			exeinto "${d}"
 			newexe "${f}" "linux-gate.so"
@@ -2333,11 +2320,11 @@
 	if use kernel_sources; then
 		install_kernel_sources
 	else
-		dosym "$(cros-workon_get_build_dir)" "/usr/src/linux"
+		dosym "$(cros-workon_get_build_dir)" "${install_prefix}/usr/src/linux"
 	fi
 
-	if use compilation_database || ( use test && use clang ); then
-		insinto /build/kernel
+	if use compilation_database; then
+		insinto "${install_prefix}/build/kernel"
 		einfo "Installing kernel compilation databases.
 To use the compilation database with an IDE or other tools outside of the
 chroot create a symlink named 'compile_commands.json' in the kernel source
@@ -2350,9 +2337,9 @@
 		# Deliver the profile we just verified.  The upload artifacts
 		# step in the builder will collect the (now verified) AFDO
 		# profile from here.
-		insinto /usr/lib/debug/boot
+		insinto "${install_prefix}/usr/lib/debug/boot"
 		doins "${DISTDIR}/${AFDO_GCOV}.xz"
 	fi
 }
 
-EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_test src_install
+EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_install
diff --git a/eclass/cros-racc.eclass b/eclass/cros-racc.eclass
new file mode 100644
index 0000000..cf496de
--- /dev/null
+++ b/eclass/cros-racc.eclass
@@ -0,0 +1,23 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: cros-racc.eclass
+# @BLURB: helper eclass for building Chromium packages of RACC
+# @DESCRIPTION:
+# Packages src/platform2/{hardware_verifier,runtime_probe} are in active
+# development.  We have to add board-specific rules manually.
+
+# @FUNCTION: cros-racc_install_config_files
+# @DESCRIPTION:
+# Install AVL runtime verification config files.
+# https://bugs.chromium.org/p/chromium/issues/detail?id=959178 for more details.
+cros-racc_install_config_files() {
+	einfo "cros-racc install_config_files"
+	for model in "$@"; do
+		insinto "/etc/runtime_probe/${model}"
+		doins "${FILESDIR}/runtime_probe/${model}/probe_config.json"
+	done
+
+	insinto /etc/hardware_verifier
+	doins "${FILESDIR}/hw_verification_spec.prototxt"
+}
diff --git a/eclass/cros-rust.eclass b/eclass/cros-rust.eclass
index 942bde8..cac1dc9 100644
--- a/eclass/cros-rust.eclass
+++ b/eclass/cros-rust.eclass
@@ -74,7 +74,7 @@
 IUSE="asan fuzzer lsan +lto msan test tsan ubsan"
 REQUIRED_USE="?? ( asan lsan msan tsan )"
 
-EXPORT_FUNCTIONS src_unpack src_prepare src_configure src_install pkg_postinst pkg_prerm
+EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_install pkg_postinst pkg_prerm
 
 DEPEND="
 	>=virtual/rust-1.39.0:=
@@ -95,7 +95,18 @@
 # function is required to support binary packages shared across boards by moving
 # the reference to PORTAGE_TMPDIR out of global scope.
 cros-rust_get_reg_lock() {
-	echo "${PORTAGE_TMPDIR}/cros-rust-registry.lock"
+	echo "${PORTAGE_TMPDIR}/cros-rust-registry/lock"
+}
+
+# @FUNCTION: cros-rust_pkg_setup
+# @DESCRIPTION:
+# Sets up the package. Particularly, makes sure the rust registry lock exits.
+cros-rust_pkg_setup() {
+	if [[ "${EBUILD_PHASE_FUNC}" != "pkg_setup" ]]; then
+		die "${FUNCNAME}() should only be used in pkg_setup() phase"
+	fi
+	_cros-rust_prepare_lock "$(cros-rust_get_reg_lock)"
+	_cleanup_registry_link "$@"
 }
 
 # @FUNCTION: cros-rust_src_unpack
@@ -290,7 +301,17 @@
 		-Copt-level=3
 	)
 
-	use lto && rustflags+=( -Clto )
+	if use lto
+	then
+		rustflags+=( -Clto )
+		# rustc versions >= 1.45 support -Cembed-bitcode, which Cargo sets to
+		# no because it does not know that we want to use LTO.
+		# Because -Clto requires -Cembed-bitcode=yes, set it explicitly.
+		if [[ $(rustc --version | awk '{ gsub(/\./, ""); print $2 }') -ge 1450 ]]
+		then
+			rustflags+=( -Cembed-bitcode=yes )
+		fi
+	fi
 
 	# We don't want to abort during tests.
 	use test || rustflags+=( -Cpanic=abort )
@@ -306,7 +327,7 @@
 	# https://crbug.com/1085546
 	use asan && rustflags+=( -Csanitizer=address -Clink-arg="-Wl,-export-dynamic" )
 	use lsan && rustflags+=( -Csanitizer=leak )
-	use msan && rustflags+=( -Csanitizer=memory )
+	use msan && rustflags+=( -Csanitizer=memory -Clink-arg="-Wl,--allow-shlib-undefined")
 	use tsan && rustflags+=( -Csanitizer=thread )
 	use ubsan && rustflags+=( -Clink-arg=-fsanitize=undefined )
 
@@ -487,6 +508,23 @@
 	cros-rust_publish
 }
 
+# @FUNCTION: _cros-rust_prepare_lock
+# @INTERNAL
+# @USAGE: <path to lock>
+# @DESCRIPTION:
+# Create the specified lock file. This should only be called inside pkg_*
+# functions to ensure the lock file is owned by root. The permissions are set to
+# 644 so that $PORTAGE_USERNAME:portage will be able to obtain a shared lock
+# inside src_* functions.
+_cros-rust_prepare_lock() {
+	if [ "$(id -u)" -ne 0 ]; then
+		die "_cros-rust_prepare_lock should only be called inside pkg_* functions."
+	fi
+	mkdir -m 755 -p "$(dirname "$1")" || die
+	touch "$1" || die
+	chmod 644 "$1" || die
+}
+
 # @FUNCTION: _cleanup_registry_link
 # @INTERNAL
 # @USAGE: [crate name] [crate version]
@@ -509,6 +547,7 @@
 	if [[ -L "${link}" ]]; then
 		einfo "Removing ${crate} from Cargo registry"
 		# Acquire a exclusive lock since this modifies the registry.
+		_cros-rust_prepare_lock "$(cros-rust_get_reg_lock)"
 		flock --no-fork --exclusive "$(cros-rust_get_reg_lock)" \
 			sh -c 'rm -f "$0"' "${link}" || die
 	fi
@@ -555,8 +594,8 @@
 		local dest="${registry_dir}/${crate}"
 		einfo "Linking ${crate} into Cargo registry at ${registry_dir}"
 		mkdir -p "${registry_dir}"
-		# This modifies the registry in a safe way so a lock isn't needed.
-		ln -srT "${crate_dir}" "${dest}" || die
+		flock --no-fork --exclusive "$(cros-rust_get_reg_lock)" \
+			ln -srT "${crate_dir}" "${dest}" || die
 	fi
 }
 
diff --git a/eclass/cros-unibuild.eclass b/eclass/cros-unibuild.eclass
index 6f8a6fa..e1d81c3 100644
--- a/eclass/cros-unibuild.eclass
+++ b/eclass/cros-unibuild.eclass
@@ -230,19 +230,6 @@
 	done
 }
 
-# @FUNCTION: unibuild_install_thermal_files
-# @USAGE: [config_file]
-# @DESCRIPTION:
-# Install files related to thermal operation. Currently this is only the DPTF
-# (Dynamic Platform and Thermal Framework) datavaults, typically called dptf.dv
-# Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_thermal_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
-
-	_unibuild_common_install get-thermal-files "$@"
-}
-
 # @FUNCTION: _unibuild_install_fw
 # @USAGE: [source] [dest] [symlink path]
 # @INTERNAL
@@ -317,57 +304,6 @@
 	_unibuild_install_fw_common "get-detachable-base-firmware-files" "$@"
 }
 
-# @FUNCTION: unibuild_install_audio_files
-# @USAGE: [config_file]
-# @DESCRIPTION:
-# Install files related to audio. This includes cras, alsa and hotwording
-# topology firmware.
-# Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_audio_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
-
-	_unibuild_common_install get-audio-files "$@"
-}
-
-# @FUNCTION: unibuild_install_arc_files
-# @USAGE: [config_file]
-# @DESCRIPTION: Install files related to arc.
-# Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_arc_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
-
-	_unibuild_common_install get-arc-files "$@"
-}
-
-# @FUNCTION: unibuild_install_bluetooth_files
-# @USAGE: [config_file]
-# @DESCRIPTION:
-# Install files related to bluetooth config.
-# Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_bluetooth_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
-
-	# Board-specific BlueZ config file is no longer required.
-	# Temporarily making this function a no-op until all references to this
-	# function are removed.
-	# TODO(b/152526402): Remove this function.
-}
-
-# @FUNCTION: unibuild_install_camera_files
-# @USAGE: [config_file]
-# @DESCRIPTION:
-# Install files related to camera config.
-# Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_camera_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
-
-	_unibuild_common_install get-camera-files "$@"
-}
-
 # @FUNCTION: unibuild_build_configfs_file
 # @USAGE:
 # @DESCRIPTION:
@@ -432,15 +368,20 @@
 	doins "${WORKDIR}/project-config.json"
 }
 
-# @FUNCTION: unibuild_install_autobrightness_files
+# @FUNCTION: unibuild_install_files
 # @USAGE: [config_file]
 # @DESCRIPTION:
-# Install files related to autobrightness. This installs model_params.json
-# which specifies autobrightness policy.
+# Install files as specified in project config.
 # Args:
-#   $1: (optional) Config file used by cros_config_host
-unibuild_install_autobrightness_files() {
-	[[ $# -lt 2 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
+#   $1: Which files to install, translates to a command to pass to
+#       cros_config_host to get the files
+#   $2: (optional) Config file used by cros_config_host
+unibuild_install_files() {
+	[[ $# -gt 0 ]] || die "${FUNCNAME}: files to install arg required"
+	[[ $# -lt 3 ]] || die "${FUNCNAME}: Only optional config file arg allowed"
 
-	_unibuild_common_install get-autobrightness-files "$@"
+	local file_set="$1"
+	shift
+
+	_unibuild_common_install "get-${file_set}" "$@"
 }
diff --git a/eclass/cros-workon.eclass b/eclass/cros-workon.eclass
index 0733e8c..1e64d78 100644
--- a/eclass/cros-workon.eclass
+++ b/eclass/cros-workon.eclass
@@ -118,7 +118,7 @@
 # can be found in the commit.
 # CROW_WORKON_COMMIT is updated only when CROS_WORKON_TREE below is updated,
 # so it does not necessarily point to HEAD in the source repository.
-: ${CROS_WORKON_COMMIT:=master}
+: "${CROS_WORKON_COMMIT:=}"
 
 # @ECLASS-VARIABLE: CROS_WORKON_TREE
 # @DESCRIPTION:
@@ -195,7 +195,7 @@
 # like normal.
 : ${CROS_WORKON_INCREMENTAL_BUILD:=}
 
-# @ECLASS-VARIABLE: CROS_WORKON_BLACKLIST
+# @ECLASS-VARIABLE: CROS_WORKON_MANUAL_UPREV
 # @DESCRIPTION:
 # If set to "1", the cros-workon uprev system on the bots will not automatically
 # revbump your package when changes are made.  This is useful if you want more
@@ -203,9 +203,10 @@
 # ebuild, or if the git repo you're using is not part of the official manifest.
 # e.g. If you set CROS_WORKON_REPO or EGIT_REPO_URI to an external (to Google)
 # site, set this to "1".
-# Note that you must specify the CROS_WORKON_BLACKLIST="1" line in both the
+# Note that you must specify the CROS_WORKON_MANUAL_UPREV="1" line in both the
 # unstable (i.e. 9999) and stable (e.g. 0.0.1-r) ebuild files.
-: ${CROS_WORKON_BLACKLIST:=}
+# TODO(crbug.com/1125947): Drop CROS_WORKON_BLACKLIST once all ebuilds migrate.
+: "${CROS_WORKON_MANUAL_UPREV:=${CROS_WORKON_BLACKLIST}}"
 
 # @ECLASS-VARIABLE: CROS_WORKON_MAKE_COMPILE_ARGS
 # @DESCRIPTION:
@@ -489,13 +490,6 @@
 		die "Sorry, but \$S cannot be set to \$WORKDIR"
 	fi
 
-	# Setting CROS_WORKON_COMMIT in 9999 ebuilds doesn't make sense nor is
-	# supported, so reject it up front.
-	# TODO(vapier): We allow "master" atm as that's the global default.
-	if [[ "${PV}" == "9999" ]] && [[ "${CROS_WORKON_COMMIT}" != "master" || -n "${CROS_WORKON_TREE}" ]]; then
-		die "9999 ebuilds must not set CROS_WORKON_COMMIT or CROS_WORKON_TREE"
-	fi
-
 	# Set the default of CROS_WORKON_DESTDIR. This is done here because S is
 	# sometimes overridden in ebuilds and we cannot rely on the global state
 	# (and therefore ordering of eclass inherits and local ebuild overrides).
@@ -514,6 +508,33 @@
 		fi
 	done
 
+	# Verify CROS_WORKON_COMMIT settings.
+	for (( i = 0; i < project_count; ++i )); do
+		r="${CROS_WORKON_COMMIT[i]}"
+		local tree="${CROS_WORKON_TREE[i]}"
+		if [[ "${PV}" == "9999" ]]; then
+			# Setting CROS_WORKON_COMMIT in 9999 ebuilds doesn't make sense nor is
+			# supported, so reject it up front.
+			if [[ -n "${tree}" ]]; then
+				die "9999 ebuilds must not set CROS_WORKON_COMMIT or CROS_WORKON_TREE"
+			fi
+		else
+			# Enforce that a full commit id is used to avoid possible collisions
+			# in the future.  This comes up with hand edited ebuilds sometimes.
+			if [[ "${r}" == refs/tags/* ]]; then
+				# Allow tags when the ebuild is not auto-uprevving.
+				if [[ "${CROS_WORKON_MANUAL_UPREV}" != "1" ]]; then
+					die "CROS_WORKON_COMMIT may use git tags only with CROS_WORKON_MANUAL_UPREV=1"
+				fi
+			elif ! echo "${r}" | grep -Eq '^[0-9a-f]{40}$'; then
+				die "CROS_WORKON_COMMIT must be a full commit id to avoid collisions, not '${r}'"
+			fi
+			if [[ -n "${tree}" ]] && ! echo "${tree}" | grep -Eq '^[0-9a-f]{40}$'; then
+				die "CROS_WORKON_TREE must be a full commit id to avoid collisions, not '${tree}'"
+			fi
+		fi
+	done
+
 	for (( i = 0; i < project_count; ++i )); do
 		p="${CROS_WORKON_PROJECT[$i]}"
 		r="${CROS_WORKON_REPO[$i]}"
@@ -669,6 +690,11 @@
 			EGIT_PROJECT="${project[i]}${CROS_WORKON_GIT_SUFFIX}"
 			EGIT_SOURCEDIR="${destdir[i]}"
 			EGIT_COMMIT="${CROS_WORKON_COMMIT[i]}"
+			# If the logic above checked out the repo (only one failed), then skip it.
+			if [[ -d "${EGIT_SOURCEDIR}/.git" ]]; then
+				einfo "Skipping existing checkout of ${EGIT_PROJECT} in ${EGIT_SOURCEDIR}"
+				continue
+			fi
 			# Clones to /var, copies src tree to the /build/<board>/tmp.
 			# Make sure git-2 does not run `unpack` for us automatically.
 			# The normal cros-workon flow above doesn't do it, so don't
diff --git a/eclass/cros-zephyr.eclass b/eclass/cros-zephyr.eclass
new file mode 100644
index 0000000..f5ef622
--- /dev/null
+++ b/eclass/cros-zephyr.eclass
@@ -0,0 +1,174 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE.makefile file.
+
+# @ECLASS: cros-zephyr.eclass
+# @MAINTAINER:
+# Chromium OS Firmware Team
+# @BUGREPORTS:
+# Please report bugs via http://crbug.com/new (with label Build)
+# @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/@ECLASS@
+# @BLURB: helper eclass for building Zephyr-based firmware
+# @DESCRIPTION:
+# Builds the Zephyr EC firmware and installs into /firmware/<project>/ec.bin
+
+# Check for EAPI 7+.
+case "${EAPI:-0}" in
+0|1|2|3|4|5|6) die "Unsupported EAPI=${EAPI:-0} for ${ECLASS} (7+ required)" ;;
+*) ;;
+esac
+
+inherit toolchain-funcs cros-workon ninja-utils
+
+IUSE="unibuild"
+REQUIRED_USE="unibuild"
+
+BDEPEND="
+	dev-python/docopt
+	dev-python/pykwalify
+	dev-util/ninja
+"
+
+DEPEND="chromeos-base/chromeos-config"
+
+# @ECLASS-VARIABLE: ZEPHYR_BASE
+# @DESCRIPTION: Path to the Zephyr OS repo
+# @INTERNAL
+
+# @ECLASS-VARIABLE: ZEPHYR_CHROME
+# @DESCRIPTION: Path to the ChromeOS Zephyr overlay repo
+# @INTERNAL
+
+# @ECLASS-VARIABLE: ZEPHYR_MODULES
+# @DESCRIPTION: Array of module repos used in Zephyr build
+# @INTERNAL
+
+# @ECLASS-VARIABLE: ZEPHYR_BUILD_TARGET_NAMES
+# @DESCRIPTION: List of names used for the build targets
+# @INTERNAL
+
+# @ECLASS-VARIABLE: ZEPHYR_BUILD_TARGET_PATHS
+# @DESCRIPTION: List of relative paths under ${ZEPHYR_CHROME}/projects
+# to the project directory for each build target.
+# @INTERNAL
+
+# @FUNCTION: cros-zephyr_gen_cmake
+# @DESCRIPTION: output auto-generated cmake source on stdout
+cros-zephyr_gen_cmake() {
+	echo "set(ZEPHYR_BASE ${ZEPHYR_BASE} CACHE PATH \"Zephyr base\")"
+	echo "set(ZEPHYR_MODULES ${ZEPHYR_MODULES[*]} CACHE STRING \"pre-cached modules\")"
+}
+
+# @FUNCTION: cros-zephyr_build_dir
+# @DESCRIPTION: convert a target name to the zephyr build path
+# @USAGE: <build_target_name>
+cros-zephyr_build_dir() {
+	echo "$(cros-workon_get_build_dir)/build-${1}"
+}
+
+# @FUNCTION: cros-zephyr_bin_name
+# @DESCRIPTION: convert a target name to the zephyr bin name
+# @USAGE: <build_target_name>
+cros-zephyr_bin_name() {
+	echo "$(cros-zephyr_build_dir "${1}")/zephyr/zephyr.bin"
+}
+
+# @FUNCTION: cros-zephyr_gen_makefile
+# @DESCRIPTION: generate a Makefile which builds all targets
+#
+# We generate a Makefile so we can take advantage of "emake" for
+# parallelism.  This is because a given unibuild board may have many
+# zephyr targets to produce, so we can produce them all in parallel
+# this way.
+cros-zephyr_gen_makefile() {
+	local name
+	echo ".PHONY: all"
+	echo -n "all:"
+	for name in "${ZEPHYR_BUILD_TARGET_NAMES[@]}"; do
+		echo -n " $(cros-zephyr_bin_name "${name}")"
+	done
+	echo
+	for name in "${ZEPHYR_BUILD_TARGET_NAMES[@]}"; do
+		cat <<EOF
+$(cros-zephyr_bin_name "${name}"):
+	ninja -C"$(cros-zephyr_build_dir "${name}")"
+EOF
+	done
+}
+
+# @FUNCTION: cros-zephyr_src_configure
+# @DESCRIPTION: Setup the build directories and export zephyr variables.
+cros-zephyr_src_configure() {
+	ZEPHYR_BASE=""
+	ZEPHYR_CHROME=""
+	ZEPHYR_MODULES=()
+
+	# We make assumptions about the purpose of each repo by the paths
+	# in CROS_WORKON_DESTDIR.
+	local destdir
+	for destdir in "${CROS_WORKON_DESTDIR[@]}"; do
+		case "${destdir}" in
+			*/zephyr-base )
+				ZEPHYR_BASE="${destdir}"
+				;;
+			*/zephyr-chrome )
+				ZEPHYR_CHROME="${destdir}"
+				;;
+			*/modules/* )
+				ZEPHYR_MODULES+=("${destdir}")
+				;;
+			* )
+				die "Unrecognized zephyr repo: ${destdir}"
+				;;
+		esac
+	done
+
+	local name path
+	ZEPHYR_BUILD_TARGET_NAMES=()
+	ZEPHYR_BUILD_TARGET_PATHS=()
+	while read -r name && read -r path; do
+		ZEPHYR_BUILD_TARGET_NAMES+=("${name}")
+		ZEPHYR_BUILD_TARGET_PATHS+=("${path}")
+	done < <(cros_config_host get-firmware-build-combinations zephyr-ec)
+
+	mkdir -p "$(cros-workon_get_build_dir)"
+	cros-zephyr_gen_cmake >"$(cros-workon_get_build_dir)/.cmake"
+	cros-zephyr_gen_makefile >"$(cros-workon_get_build_dir)/Makefile"
+
+	# Zephyr environment variables.
+	export ZEPHYR_BASE
+	export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
+
+	# We have to nuke all of the system environment variables, as
+	# these won't work with target (bare metal) architecture.
+	unset CC LD CFLAGS LDFLAGS CXX CXXFLAGS
+
+	# Run cmake for each build target.
+	for i in "${!ZEPHYR_BUILD_TARGET_NAMES[*]}"; do
+		name="${ZEPHYR_BUILD_TARGET_NAMES[${i}]}"
+		path="${ZEPHYR_BUILD_TARGET_PATHS[${i}]}"
+		cmake -GNinja -B"$(cros-zephyr_build_dir "${name}")" \
+			-S"${ZEPHYR_CHROME}/projects/${path}" \
+			-C"$(cros-workon_get_build_dir)/.cmake" \
+			|| die "cmake failed for ${name}"
+	done
+}
+
+# @FUNCTION: cros-zephyr_src_compile
+# @DESCRIPTION: compile all zephyr targets
+cros-zephyr_src_compile() {
+	emake -C"$(cros-workon_get_build_dir)" || die "compile failed"
+}
+
+# @FUNCTION: cros-ec_src_install
+# @DESCRIPTION: install all zephyr targets into /firmware
+cros-zephyr_src_install() {
+	local target
+	for target in "${ZEPHYR_BUILD_TARGET_NAMES[@]}"; do
+		einfo "Installing zephyr.bin for ${target}..."
+		insinto "/firmware/${target}"
+		newins "$(cros-zephyr_bin_name "${target}")" "ec.bin"
+	done
+}
+
+EXPORT_FUNCTIONS src_configure src_compile src_install
diff --git a/eclass/libchrome-version.eclass b/eclass/libchrome-version.eclass
index 4cab384..f0e5fec 100644
--- a/eclass/libchrome-version.eclass
+++ b/eclass/libchrome-version.eclass
@@ -11,10 +11,6 @@
 # @DESCRIPTION:
 # This eclass manages the libchrome version.
 
-# LIBCHROME_VERS and BASE_VER are deprecated. Use libchrome_ver instead.
-LIBCHROME_VERS=( 679961 )
-export BASE_VER="${LIBCHROME_VERS[0]}"
-
 # @FUNCTION: libchrome_ver
 # @DESCRIPTION:
 # Output current libchrome BASE_VER, from SYSROOT-installed BASE_VER file.
diff --git a/eclass/platform.eclass b/eclass/platform.eclass
index 6272bb2..9de7fbd 100644
--- a/eclass/platform.eclass
+++ b/eclass/platform.eclass
@@ -40,6 +40,12 @@
 # Set to yes if the package is built by ARC toolchain.
 : ${PLATFORM_ARC_BUILD:="no"}
 
+# @ECLASS-VARIABLE: OUT
+# @DESCRIPTION:
+# Path where build artifacts will end up.  Exported from this eclass when
+# platform_src_unpack is called; not intended to be set in ebuilds that inherit
+# this eclass.
+
 inherit cros-debug cros-fuzzer cros-sanitizers cros-workon flag-o-matic toolchain-funcs multiprocessing
 
 [[ "${WANT_LIBCHROME}" == "yes" ]] && inherit libchrome
@@ -277,6 +283,10 @@
 	platform_test "post_test"
 }
 
+platform_src_install() {
+	use compilation_database && platform_install_compilation_database
+}
+
 platform_install_dbus_client_lib() {
 	local libname=${1:-${PN}}
 
@@ -306,13 +316,11 @@
 # Installs compilation database files to
 # /build/compilation_database/${CATEGORY}/${PN}.
 platform_install_compilation_database() {
-	if use compilation_database; then
-		insinto "/build/compilation_database/${CATEGORY}/${PN}"
+	insinto "/build/compilation_database/${CATEGORY}/${PN}"
 
-		doins "${OUT}/compile_commands.txt"
-		doins "${OUT}/compile_commands_chroot.json"
-		doins "${OUT}/compile_commands_no_chroot.json"
-	fi
+	doins "${OUT}/compile_commands.txt"
+	doins "${OUT}/compile_commands_chroot.json"
+	doins "${OUT}/compile_commands_no_chroot.json"
 }
 
-EXPORT_FUNCTIONS src_compile src_test src_configure src_unpack
+EXPORT_FUNCTIONS src_compile src_test src_configure src_unpack src_install
diff --git a/licenses/BSD-Maxim b/licenses/BSD-Maxim
new file mode 100644
index 0000000..d4e4ca2
--- /dev/null
+++ b/licenses/BSD-Maxim
@@ -0,0 +1,24 @@
+Copyright (c) 2020, Maxim Integrated.

+

+Redistribution and use in source and binary forms, with or without

+modification, are permitted provided that the following conditions are met:

+

+    * Redistributions of source code must retain the above copyright notice,

+      this list of conditions and the following disclaimer.

+    * Redistributions in binary form must reproduce the above copyright

+      notice, this list of conditions and the following disclaimer in the

+      documentation and/or other materials provided with the distribution.

+    * Neither the name of Maxim Integrated nor the names of its contributors

+      may be used to endorse or promote products derived from this software

+      without specific prior written permission.

+

+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE

+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

diff --git a/licenses/LICENSE.corel b/licenses/LICENSE.corel
deleted file mode 100644
index 72ed19e..0000000
--- a/licenses/LICENSE.corel
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2020 Corel Corporation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-3. Neither the name of the copyright holder nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/LICENSE.fuji-xerox-ppds b/licenses/LICENSE.fuji-xerox-ppds
new file mode 100644
index 0000000..cd18cf4
--- /dev/null
+++ b/licenses/LICENSE.fuji-xerox-ppds
@@ -0,0 +1,57 @@
+Fuji Xerox PS PPD for Chrome OS

+

+===============================================================================

+License Agreement

+===============================================================================

+

+The license agreement for this PPD file (hereinafter referred to as the PPD

+FILE) is described as follows.

+

+1. Intellectual property rights in the PPD FILE shall remain in Fuji Xerox Co.,

+Ltd. (hereinafter referred to as Fuji Xerox) as well as the original copyright

+holders.

+

+2. The PPD FILE can only be used with compatible Fuji Xerox products

+(hereinafter referred to as the COMPATIBLE PRODUCTS) within the country of

+purchase of the COMPATIBLE PRODUCTS.

+

+3. You are required to abide by the cautions and limitations (hereinafter

+referred to as the CAUTIONS AND LIMITATIONS) declared by Fuji Xerox while using

+the PPD FILE.

+

+4. You are not permitted to alter or modify the whole or any part of the PPD

+FILE.

+

+5. You are not permitted to distribute the PPD FILE on a communication network,

+or transfer, sell, rent or license the PPD FILE to any third party.

+

+6. Fuji Xerox, Fuji Xerox's channel partners and authorized dealers, and the

+original copyright holders of the PPD FILE shall not be responsible for any

+warranty or liability with respect to the PPD FILE.

+

+

+---------------------------------------------------

+Cautions and Limitations

+---------------------------------------------------

+* Caution for printing odd-number pages with 2-Sided Printing If you are

+  printing documents with odd-number of pages, a blank page may be added to the

+  last page depending on the settings of the operating system  (referred to as

+  "OS" hereinafter). Some application software will automatically insert blank

+  sheet for page adjustment according to the condition for specifying print

+  quantities. As this behavior is a specification of the application software,

+  it is not possible to configure this software or the device to prevent blank

+  sheet from being inserted to the printout. The target device will print the

+  data as it is received after it is edited and printed from the client's side

+  according to the operating system or application software specification. If

+  the document data to be printed consist of blank-sheet data inserted by the

+  operating system or application software, this blank sheet will be counted as

+  part of the print data.

+

+* Caution for printing black and white document Depending on the application

+  program, black and white document may be printed in color as black can be

+  output in process black (C=M=Y). To prevent this, it is recommended to set

+  [Color] to [Black & White] when printing black and white documents.

+

+

+-------------------------------------------------------------------------------

+(C) Fuji Xerox Co., Ltd. 2020.02.06

diff --git a/licenses/LICENSE.parallels b/licenses/LICENSE.parallels
new file mode 100644
index 0000000..e5aaf90
--- /dev/null
+++ b/licenses/LICENSE.parallels
@@ -0,0 +1,26 @@
+Copyright (c) 2020 Parallels International GmbH. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/Qualcomm-FW-Blob b/licenses/Qualcomm-FW-Blob
new file mode 100644
index 0000000..0eb4e37
--- /dev/null
+++ b/licenses/Qualcomm-FW-Blob
@@ -0,0 +1,200 @@
+PLEASE READ THIS LICENSE AGREEMENT ("AGREEMENT") CAREFULLY.  THIS AGREEMENT IS
+A BINDING LEGAL AGREEMENT ENTERED INTO BY AND BETWEEN YOU (OR IF YOU ARE
+ENTERING INTO THIS AGREEMENT ON BEHALF OF AN ENTITY, THEN THE ENTITY THAT YOU
+REPRESENT) AND QUALCOMM TECHNOLOGIES, INC. ("QTI" "WE" "OUR" OR "US").  THIS IS
+THE AGREEMENT THAT APPLIES TO YOUR USE OF THE DESIGNATED AND/OR LINKED
+APPLICATIONS, THE ENCLOSED QUALCOMM TECHNOLOGIES' MATERIALS, INCLUDING RELATED
+DOCUMENTATION AND ANY UPDATES OR IMPROVEMENTS THEREOF
+(COLLECTIVELY, "MATERIALS").  BY USING OR COMPLETING THE INSTALLATION OF THE
+MATERIALS, YOU ARE ACCEPTING THIS AGREEMENT AND YOU AGREE TO BE BOUND BY ITS
+TERMS AND CONDITIONS.  IF YOU DO NOT AGREE TO THESE TERMS, QTI IS UNWILLING TO
+AND DOES NOT LICENSE THE MATERIALS TO YOU. IF YOU DO NOT AGREE TO THESE TERMS
+YOU MUST DISCONTINUE THE INSTALLATION PROCESS AND YOU MAY NOT USE THE MATERIALS
+OR RETAIN ANY COPIES OF THE MATERIALS. ANY USE OR POSSESSION OF THE MATERIALS
+BY YOU IS SUBJECT TO THE TERMS AND CONDITIONS SET FORTH IN THIS AGREEMENT.
+
+1. RIGHT TO USE DELIVERABLES; RESTRICTIONS.
+
+  1.1 License.  Subject to the terms and conditions of this Agreement,
+  including, without limitation, the restrictions, conditions, limitations and
+  exclusions set forth in this Agreement, QTI hereby grants to you a
+  nonexclusive, limited license under QTI's copyrights to:
+(i)  install and use the Materials; and 
+(ii) to reproduce and redistribute the binary code portions of the Materials (the "Redistributable Binary Code").
+     You may make and use a   reasonable number of copies of any documentation.
+
+  1.2 Redistribution Restrictions.  Distribution of the Redistributable Binary
+  Code is subject to the following restrictions: 
+(i) Redistributable Binary Code may only be distributed in binary format and may not be distributed in source code format; 
+(ii) the Redistributable Binary Code may only operate in conjunction with platforms incorporating Qualcomm Technologies, Inc. chipsets;
+(iii) redistribution of the Redistributable Binary Code must include the .txt file setting forth the terms and condition of this Agreement; 
+(iv) you may not use Qualcomm Technologies' or its affiliates or subsidiaries name, logo or trademarks; and 
+(v) copyright, trademark, patent and any other notices that appear on the Materials may not be removed or obscured.
+
+  1.3 Additional Restrictions.  Except as expressly permitted by this Agreement,
+  you shall have no right to sublicense, transfer or otherwise disclose the
+  Materials to any third party.  You shall not reverse engineer, reverse
+  assemble, reverse translate, decompile or reduce to source code form any
+  portion of the Materials provided in object code form or executable form.
+  Except for the purposes expressly permitted in this Agreement, You shall not
+  use the Materials for any other purpose.  QTI (or its licensors) shall retain
+  title and all ownership rights in and to the Materials and any alterations,
+  modifications (including all derivative works), translations or adaptations
+  made of the Materials, and all copies thereof, and nothing herein shall be
+  deemed to grant any right to You under any of QTI's or its affiliates'
+  patents.  You shall not subject the Materials to any third party license
+  terms (e.g., open source license terms).  You shall not use the Materials for
+  the purpose of identifying or providing evidence to support any potential
+  patent infringement claim against QTI, its affiliates, or any of QTI's or
+  QTI's affiliates' suppliers and/or direct or indirect customers.  QTI hereby
+  reserves all rights not expressly granted herein.
+
+  1.4 Third Party Software and Materials.  The Software may contain or link to
+  certain software and/or materials that are written or owned by third parties.
+  Such third party code and materials may be licensed under separate or
+  different terms and conditions and are not licensed to you under the terms of
+  this Agreement.  You agree to comply with all terms and conditions imposed on
+  you in the applicable third party licenses.  Such terms and conditions may
+  impose certain obligations on you as a condition to the permitted use of such
+  third party code and materials.  QTI does not represent or warrant that such
+  third party licensors have or will continue to license or make available their
+  code and materials to you.
+
+  1.5 Feedback.  QTI may from time to time receive suggestions, feedback or
+  other information from You regarding the Materials.  Any suggestions, feedback
+  or other disclosures received from You are and shall be entirely voluntary on
+  the part of You.  Notwithstanding any other term in this Agreement, QTI shall
+  be free to use suggestions, feedback or other information received from You,
+  without obligation of any kind to You.  The Parties agree that all inventions,
+  product improvements, and modifications conceived of or made by QTI that are
+  based, either in whole or in part, on ideas, feedback, suggestions, or
+  recommended improvements received from You are the exclusive property of QTI,
+  and all right, title and interest in and to any such inventions, product
+  improvements, and modifications will vest solely in QTI.
+
+  1.6 No Technical Support.  QTI is under no obligation to provide any form of
+  technical support for the Materials, and if QTI, in its sole discretion,
+  chooses to provide any form of support or information relating to the
+  Materials, such support and information shall be deemed confidential and
+  proprietary to QTI.
+
+2. WARRANTY DISCLAIMER.  YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT THE USE OF
+THE MATERIALS IS AT YOUR SOLE RISK.  THE MATERIALS AND TECHNICAL SUPPORT, IF
+ANY, ARE PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR
+IMPLIED.  QTI ITS LICENSORS AND AFFILIATES MAKE NO WARRANTIES, EXPRESS OR
+IMPLIED, WITH RESPECT TO THE MATERIALS OR ANY OTHER INFORMATION OR DOCUMENTATION
+PROVIDED UNDER THIS AGREEMENT, INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR AGAINST INFRINGEMENT, OR
+ANY EXPRESS OR IMPLIED WARRANTY ARISING OUT OF TRADE USAGE OR OUT OF A COURSE
+OF DEALING OR COURSE OF PERFORMANCE.  NOTHING CONTAINED IN THIS AGREEMENT SHALL
+BE CONSTRUED AS (I) A WARRANTY OR REPRESENTATION BY QTI, ITS LICENSORS OR
+AFFILIATES AS TO THE VALIDITY OR SCOPE OF ANY PATENT, COPYRIGHT OR OTHER
+INTELLECTUAL PROPERTY RIGHT OR (II) A WARRANTY OR REPRESENTATION BY QTI THAT
+ANY MANUFACTURE OR USE WILL BE FREE FROM INFRINGEMENT OF PATENTS, COPYRIGHTS OR
+OTHER INTELLECTUAL PROPERTY RIGHTS OF OTHERS, AND IT SHALL BE THE SOLE
+RESPONSIBILITY OF YOU TO MAKE SUCH DETERMINATION AS IS NECESSARY WITH RESPECT
+TO THE ACQUISITION OF LICENSES UNDER PATENTS AND OTHER INTELLECTUAL PROPERTY OF
+THIRD PARTIES.
+
+3. NO OTHER LICENSES OR INTELLECTUAL PROPERTY RIGHTS. Neither this Agreement,
+nor any act by QTI or any of its affiliates pursuant to this Agreement or
+relating to the Materials (including, without limitation, the provision by QTI
+or its affiliates of the Materials), shall provide to You any license or any
+other rights whatsoever under any patents, trademarks, trade secrets, copyrights
+or any other intellectual property of QTI or any of its affiliates, except for
+the copyright rights expressly licensed under this Agreement. You understand and agree that:
+
+(i) Neither this Agreement, nor delivery of the Materials, grants any right
+    to practice, or any other right at all with respect to, any patent of QTI
+    or any of its affiliates; and
+(ii) A separate license agreement from QUALCOMM Incorporated is needed to use
+     or practice any patent of QUALCOMM Incorporated. You agree not to contend
+     in any context that, as a result of the provision or use of the Materials,
+     either QTI or any of its affiliates has any obligation to extend, or You or
+     any other party has obtained any right to, any license, whether express or
+     implied, with respect to any patent of QTI or any of its affiliates for any purpose.
+
+4. TERMINATION.  This Agreement shall be effective upon acceptance, or access
+or use of the Materials (whichever occurs first) by You and shall continue until
+terminated. You may terminate the Agreement at any time by deleting and
+destroying all copies of the Materials and all related information in Your
+possession or control. This Agreement terminates immediately and automatically,
+with or without notice, if You fail to comply with any provision hereof.
+Upon termination You must, to the extent possible, delete or destroy all copies
+of the Materials in Your possession and the license granted to You in this Agreement
+shall terminate. Sections 1.2 through 10 shall survive the termination of this Agreement.
+In the event that any restrictions, conditions, limitations are found to be either
+invalid or unenforceable, the rights granted to You in Section 1 (License) shall be null,
+void and ineffective from the Effective Date, and QTI shall also have the right to
+terminate this Agreement immediately, and with retroactive effect to the effective date.
+
+5. LIMITATION OF LIABILITY.  IN NO EVENT SHALL QTI, QTI's AFFILIATES OR ITS
+LICENSORS BE LIABLE TO YOU FOR ANY INCIDENTAL, CONSEQUENTIAL OR SPECIAL DAMAGES,
+INCLUDING BUT NOT LIMITED TO ANY LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL
+DAMAGES, ARISING OUT OF THE USE OR INABILITY TO USE, OR THE DELIVERY OR FAILURE
+TO DELIVER, ANY OF THE DELIVERABLES, OR ANY BREACH OF ANY OBLIGATION UNDER THIS
+AGREEMENT, EVEN IF QTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+THE FOREGOING LIMITATION OF LIABILITY SHALL REMAIN IN FULL FORCE AND EFFECT
+REGARDLESS OF WHETHER YOUR REMEDIES HEREUNDER ARE DETERMINED TO HAVE FAILED OF
+THEIR ESSENTIAL PURPOSE.  THE ENTIRE LIABILITY OF QTI, QTI's AFFILIATES AND ITS
+LICENSORS, AND THE SOLE AND EXCLUSIVE REMEDY OF YOU, FOR ANY CLAIM OR CAUSE OF
+ACTION ARISING HEREUNDER (WHETHER IN CONTRACT, TORT, OR OTHERWISE) SHALL NOT
+EXCEED US$50.
+
+6. INDEMNIFICATION.  You agree to indemnify and hold harmless QTI and its
+officers, directors, employees and successors and assigns against any and all
+third party claims, demands, causes of action, losses, liabilities, damages,
+costs and expenses, incurred by QTI (including but not limited to costs of
+defense, investigation and reasonable attorney's fees) arising out of, resulting
+from or related to: 
+(i) any breach of this Agreement by You; and y
+(ii) our acts, omissions, products and services.  If requested by QTI, You agree
+ to defend QTI in connection with any third party claims, demands, or causes of
+ action resulting from, arising out of or in connection with any of the foregoing.
+
+7. ASSIGNMENT.  You shall not assign this Agreement or any right or interest
+under this Agreement, nor delegate any obligation to be performed under this
+Agreement, without QTI's prior written consent.  For purposes of this Section 7,
+an "assignment" by You under this Section shall be deemed to include, without
+limitation, any merger, consolidation, sale of all or substantially all of its
+assets, or any substantial change in the management or control of You.
+Any attempted assignment in contravention of this Section 9 shall be void.
+QTI may freely assign this Agreement or delegate any or all of its rights and
+obligations hereunder to any third party.
+
+8. COMPLIANCE WITH LAWS; APPLICABLE LAW.  You agree to comply with all
+applicable local, international and national laws and regulations and with U.S.
+Export Administration Regulations, as they apply to the subject matter of this
+Agreement.  This Agreement is governed by the laws of the State of California,
+excluding California's choice of law rules.
+
+9. CONTRACTING PARTIES.  If the Materials are downloaded on any computer owned
+by a corporation or other legal entity, then this Agreement is formed by and
+between QTI and such entity.  The individual accepting the terms of this
+Agreement represents and warrants to QTI that they have the authority to bind
+such entity to the terms and conditions of this Agreement.
+
+10. MISCELLANEOUS PROVISIONS.  This Agreement, together with all exhibits
+attached hereto, which are incorporated herein by this reference, constitutes
+the entire agreement between QTI and You and supersedes all prior negotiations,
+representations and agreements between the parties with respect to the subject
+matter hereof.  No addition or modification of this Agreement shall be effective
+unless made in writing and signed by the respective representatives of QTI and
+You.  The restrictions, limitations, exclusions and conditions set forth in this
+Agreement shall apply even if QTI or any of its affiliates becomes aware of or
+fails to act in a manner to address any violation or failure to comply
+therewith.  You hereby acknowledge and agree that the restrictions, limitations,
+conditions and exclusions imposed in this Agreement on the rights granted in
+this Agreement are not a derogation of the benefits of such rights.  You further
+acknowledges that, in the absence of such restrictions, limitations, conditions
+and exclusions, QTI would not have entered into this Agreement with You.  Each
+party shall be responsible for and shall bear its own expenses in connection
+with this Agreement.  If any of the provisions of this Agreement are determined
+to be invalid, illegal, or otherwise unenforceable, the remaining provisions
+shall remain in full force and effect.  This Agreement is entered into solely
+in the English language, and if for any reason any other language version is
+prepared by any party, it shall be solely for convenience and the English
+version shall govern and control all aspects.  If You are located in the
+province of Quebec, Canada, the following applies: The Parties hereby confirm
+they have requested this Agreement and all related documents be prepared
+in English.
diff --git a/licenses/copyright-attribution/app-misc/editor-wrapper b/licenses/copyright-attribution/app-misc/editor-wrapper
new file mode 100644
index 0000000..cf78944
--- /dev/null
+++ b/licenses/copyright-attribution/app-misc/editor-wrapper
@@ -0,0 +1,25 @@
+Copyright (c) 1999-2020 Gentoo Authors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+[Except as contained in this notice, the name of Gentoo Authors
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+from Gentoo Authors.]
diff --git a/licenses/copyright-attribution/app-misc/fdupes b/licenses/copyright-attribution/app-misc/fdupes
new file mode 100644
index 0000000..74552f0
--- /dev/null
+++ b/licenses/copyright-attribution/app-misc/fdupes
@@ -0,0 +1,20 @@
+FDUPES Copyright (c) 1999 Adrian Lopez
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/copyright-attribution/app-shells/push b/licenses/copyright-attribution/app-shells/push
new file mode 100644
index 0000000..595d217
--- /dev/null
+++ b/licenses/copyright-attribution/app-shells/push
@@ -0,0 +1,26 @@
+Copyright (c) 2018, Martin Väth <martin@mvath.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the <ORGANIZATION> nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/copyright-attribution/app-text/docbook-dsssl-stylesheets b/licenses/copyright-attribution/app-text/docbook-dsssl-stylesheets
new file mode 100644
index 0000000..cf12995
--- /dev/null
+++ b/licenses/copyright-attribution/app-text/docbook-dsssl-stylesheets
@@ -0,0 +1,43 @@
+Copyright (C) 1997-2001 Norman Walsh
+
+The original inspiration for these stylesheets came from the
+work of Jon Bosak, Anders Berglund, Tony Graham, Terry Allen,
+James Clark, and many others.  I am indebted to them and to the
+community of users on dssslist@mulberrytech.com for making
+substantial contributions to this work and for answering my many
+questions.
+
+This software may be distributed under the same terms as Jade:
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the ``Software''), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+Except as contained in this notice, the names of individuals
+credited with contribution to this software shall not be used in
+advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization
+from the individuals in question.
+
+Any stylesheet derived from this Software that is publically
+distributed will be identified with a different name and the
+version strings in any derived Software will be changed so that
+no possibility of confusion between the derived package and this
+Software will exist.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT.  IN NO EVENT SHALL NORMAN WALSH OR ANY OTHER
+CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/copyright-attribution/dev-ruby/minitest b/licenses/copyright-attribution/dev-ruby/minitest
new file mode 100644
index 0000000..35f7041
--- /dev/null
+++ b/licenses/copyright-attribution/dev-ruby/minitest
@@ -0,0 +1,20 @@
+Copyright (c) Ryan Davis, seattle.rb
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/icu-58 b/licenses/icu-58
new file mode 100644
index 0000000..e7f98ed
--- /dev/null
+++ b/licenses/icu-58
@@ -0,0 +1,414 @@
+COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
+
+Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+---------------------
+
+Third-Party Software Licenses
+
+This section contains third-party software notices and/or additional
+terms for licensed third-party software components included within ICU
+libraries.
+
+1. ICU License - ICU 1.8.1 to ICU 57.1
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2016 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
+ #     The Google Chrome software developed by Google is licensed under
+ # the BSD license. Other software included in this distribution is
+ # provided under other licenses, as set forth below.
+ #
+ #  The BSD License
+ #  http://opensource.org/licenses/bsd-license.php
+ #  Copyright (C) 2006-2008, Google Inc.
+ #
+ #  All rights reserved.
+ #
+ #  Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions are met:
+ #
+ #  Redistributions of source code must retain the above copyright notice,
+ # this list of conditions and the following disclaimer.
+ #  Redistributions in binary form must reproduce the above
+ # copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided with
+ # the distribution.
+ #  Neither the name of  Google Inc. nor the names of its
+ # contributors may be used to endorse or promote products derived from
+ # this software without specific prior written permission.
+ #
+ #
+ #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #
+ #
+ #  The word list in cjdict.txt are generated by combining three word lists
+ # listed below with further processing for compound word breaking. The
+ # frequency is generated with an iterative training against Google web
+ # corpora.
+ #
+ #  * Libtabe (Chinese)
+ #    - https://sourceforge.net/project/?group_id=1519
+ #    - Its license terms and conditions are shown below.
+ #
+ #  * IPADIC (Japanese)
+ #    - http://chasen.aist-nara.ac.jp/chasen/distribution.html
+ #    - Its license terms and conditions are shown below.
+ #
+ #  ---------COPYING.libtabe ---- BEGIN--------------------
+ #
+ #  /*
+ #   * Copyright (c) 1999 TaBE Project.
+ #   * Copyright (c) 1999 Pai-Hsiang Hsiao.
+ #   * All rights reserved.
+ #   *
+ #   * Redistribution and use in source and binary forms, with or without
+ #   * modification, are permitted provided that the following conditions
+ #   * are met:
+ #   *
+ #   * . Redistributions of source code must retain the above copyright
+ #   *   notice, this list of conditions and the following disclaimer.
+ #   * . Redistributions in binary form must reproduce the above copyright
+ #   *   notice, this list of conditions and the following disclaimer in
+ #   *   the documentation and/or other materials provided with the
+ #   *   distribution.
+ #   * . Neither the name of the TaBE Project nor the names of its
+ #   *   contributors may be used to endorse or promote products derived
+ #   *   from this software without specific prior written permission.
+ #   *
+ #   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ #   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ #   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ #   * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ #   * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ #   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ #   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ #   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ #   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ #   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ #   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ #   * OF THE POSSIBILITY OF SUCH DAMAGE.
+ #   */
+ #
+ #  /*
+ #   * Copyright (c) 1999 Computer Systems and Communication Lab,
+ #   *                    Institute of Information Science, Academia
+ #       *                    Sinica. All rights reserved.
+ #   *
+ #   * Redistribution and use in source and binary forms, with or without
+ #   * modification, are permitted provided that the following conditions
+ #   * are met:
+ #   *
+ #   * . Redistributions of source code must retain the above copyright
+ #   *   notice, this list of conditions and the following disclaimer.
+ #   * . Redistributions in binary form must reproduce the above copyright
+ #   *   notice, this list of conditions and the following disclaimer in
+ #   *   the documentation and/or other materials provided with the
+ #   *   distribution.
+ #   * . Neither the name of the Computer Systems and Communication Lab
+ #   *   nor the names of its contributors may be used to endorse or
+ #   *   promote products derived from this software without specific
+ #   *   prior written permission.
+ #   *
+ #   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ #   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ #   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ #   * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ #   * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ #   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ #   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ #   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ #   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ #   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ #   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ #   * OF THE POSSIBILITY OF SUCH DAMAGE.
+ #   */
+ #
+ #  Copyright 1996 Chih-Hao Tsai @ Beckman Institute,
+ #      University of Illinois
+ #  c-tsai4@uiuc.edu  http://casper.beckman.uiuc.edu/~c-tsai4
+ #
+ #  ---------------COPYING.libtabe-----END--------------------------------
+ #
+ #
+ #  ---------------COPYING.ipadic-----BEGIN-------------------------------
+ #
+ #  Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
+ #  and Technology.  All Rights Reserved.
+ #
+ #  Use, reproduction, and distribution of this software is permitted.
+ #  Any copy of this software, whether in its original form or modified,
+ #  must include both the above copyright notice and the following
+ #  paragraphs.
+ #
+ #  Nara Institute of Science and Technology (NAIST),
+ #  the copyright holders, disclaims all warranties with regard to this
+ #  software, including all implied warranties of merchantability and
+ #  fitness, in no event shall NAIST be liable for
+ #  any special, indirect or consequential damages or any damages
+ #  whatsoever resulting from loss of use, data or profits, whether in an
+ #  action of contract, negligence or other tortuous action, arising out
+ #  of or in connection with the use or performance of this software.
+ #
+ #  A large portion of the dictionary entries
+ #  originate from ICOT Free Software.  The following conditions for ICOT
+ #  Free Software applies to the current dictionary as well.
+ #
+ #  Each User may also freely distribute the Program, whether in its
+ #  original form or modified, to any third party or parties, PROVIDED
+ #  that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+ #  on, or be attached to, the Program, which is distributed substantially
+ #  in the same form as set out herein and that such intended
+ #  distribution, if actually made, will neither violate or otherwise
+ #  contravene any of the laws and regulations of the countries having
+ #  jurisdiction over the User or the intended distribution itself.
+ #
+ #  NO WARRANTY
+ #
+ #  The program was produced on an experimental basis in the course of the
+ #  research and development conducted during the project and is provided
+ #  to users as so produced on an experimental basis.  Accordingly, the
+ #  program is provided without any warranty whatsoever, whether express,
+ #  implied, statutory or otherwise.  The term "warranty" used herein
+ #  includes, but is not limited to, any warranty of the quality,
+ #  performance, merchantability and fitness for a particular purpose of
+ #  the program and the nonexistence of any infringement or violation of
+ #  any right of any third party.
+ #
+ #  Each user of the program will agree and understand, and be deemed to
+ #  have agreed and understood, that there is no warranty whatsoever for
+ #  the program and, accordingly, the entire risk arising from or
+ #  otherwise connected with the program is assumed by the user.
+ #
+ #  Therefore, neither ICOT, the copyright holder, or any other
+ #  organization that participated in or was otherwise related to the
+ #  development of the program and their respective officials, directors,
+ #  officers and other employees shall be held liable for any and all
+ #  damages, including, without limitation, general, special, incidental
+ #  and consequential damages, arising out of or otherwise in connection
+ #  with the use or inability to use the program or any product, material
+ #  or result produced or otherwise obtained by using the program,
+ #  regardless of whether they have been advised of, or otherwise had
+ #  knowledge of, the possibility of such damages at any time during the
+ #  project or thereafter.  Each user will be deemed to have agreed to the
+ #  foregoing by his or her commencement of use of the program.  The term
+ #  "use" as used herein includes, but is not limited to, the use,
+ #  modification, copying and distribution of the program and the
+ #  production of secondary products from the program.
+ #
+ #  In the case where the program, whether in its original form or
+ #  modified, was distributed or delivered to or received by a user from
+ #  any person, organization or entity other than ICOT, unless it makes or
+ #  grants independently of ICOT any specific warranty to the user in
+ #  writing, such person, organization or entity, will also be exempted
+ #  from and not be held liable to the user for any such damages as noted
+ #  above as far as the program is concerned.
+ #
+ #  ---------------COPYING.ipadic-----END----------------------------------
+
+3. Lao Word Break Dictionary Data (laodict.txt)
+
+ #  Copyright (c) 2013 International Business Machines Corporation
+ #  and others. All Rights Reserved.
+ #
+ # Project: http://code.google.com/p/lao-dictionary/
+ # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt
+ # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt
+ #              (copied below)
+ #
+ #  This file is derived from the above dictionary, with slight
+ #  modifications.
+ #  ----------------------------------------------------------------------
+ #  Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
+ #  All rights reserved.
+ #
+ #  Redistribution and use in source and binary forms, with or without
+ #  modification,
+ #  are permitted provided that the following conditions are met:
+ #
+ #
+ # Redistributions of source code must retain the above copyright notice, this
+ #  list of conditions and the following disclaimer. Redistributions in
+ #  binary form must reproduce the above copyright notice, this list of
+ #  conditions and the following disclaimer in the documentation and/or
+ #  other materials provided with the distribution.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
+ #  --------------------------------------------------------------------------
+
+4. Burmese Word Break Dictionary Data (burmesedict.txt)
+
+ #  Copyright (c) 2014 International Business Machines Corporation
+ #  and others. All Rights Reserved.
+ #
+ #  This list is part of a project hosted at:
+ #    github.com/kanyawtech/myanmar-karen-word-lists
+ #
+ #  --------------------------------------------------------------------------
+ #  Copyright (c) 2013, LeRoy Benjamin Sharon
+ #  All rights reserved.
+ #
+ #  Redistribution and use in source and binary forms, with or without
+ #  modification, are permitted provided that the following conditions
+ #  are met: Redistributions of source code must retain the above
+ #  copyright notice, this list of conditions and the following
+ #  disclaimer.  Redistributions in binary form must reproduce the
+ #  above copyright notice, this list of conditions and the following
+ #  disclaimer in the documentation and/or other materials provided
+ #  with the distribution.
+ #
+ #    Neither the name Myanmar Karen Word Lists, nor the names of its
+ #    contributors may be used to endorse or promote products derived
+ #    from this software without specific prior written permission.
+ #
+ #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ #  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ #  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ #  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+ #  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ #  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ #  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ #  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ #  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ #  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ #  THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ #  SUCH DAMAGE.
+ #  --------------------------------------------------------------------------
+
+5. Time Zone Database
+
+  ICU uses the public domain data and code derived from Time Zone
+Database for its time zone support. The ownership of the TZ database
+is explained in BCP 175: Procedure for Maintaining the Time Zone
+Database section 7.
+
+ # 7.  Database Ownership
+ #
+ #    The TZ database itself is not an IETF Contribution or an IETF
+ #    document.  Rather it is a pre-existing and regularly updated work
+ #    that is in the public domain, and is intended to remain in the
+ #    public domain.  Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do
+ #    not apply to the TZ Database or contributions that individuals make
+ #    to it.  Should any claims be made and substantiated against the TZ
+ #    Database, the organization that is providing the IANA
+ #    Considerations defined in this RFC, under the memorandum of
+ #    understanding with the IETF, currently ICANN, may act in accordance
+ #    with all competent court orders.  No ownership claims will be made
+ #    by ICANN or the IETF Trust on the database or the code.  Any person
+ #    making a contribution to the database or code waives all rights to
+ #    future claims in that contribution or in the TZ Database.
+
+6. Google double-conversion
+
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/media-fonts/notofonts/Manifest b/media-fonts/notofonts/Manifest
index 241b0a2..b5b9a46 100644
--- a/media-fonts/notofonts/Manifest
+++ b/media-fonts/notofonts/Manifest
@@ -1 +1 @@
-DIST notofonts-20200102.tar.xz 18350828 BLAKE2B 6f0e2dd6017872dae2cc23fb3f74eaf5e3d86663ec145956644450a948f79cc59b5ee0ed7b275d85c03a346e653e63f741afed8d9847668869d81a45cc7c03df SHA512 c90d47b56688341c8d962999a94b779378ad7d77f955e1617cf60d080d4b08a9fccf79f1f841de3a5178b0164976f373c2bae4016e31a82f0daf6ff05efa4536
+DIST notofonts-20200917.tar.xz 18476188 BLAKE2B 57fb6f6647346d2c6e2ed151a0e45082febfddb9ead12ca4df966d9e42927a0fe9bd963423fe7c87655fda7d01fa0f3b6f6b13aabb3fa6a10f0439d2eb6d4abf SHA512 324970725df6d6e0b3554bd412b79093760ce4b1d8ffd49721a95563cd4f010a056dc62db4ad61024c3ec2b66d6c6b003d53a094956b0cdfa361692e43d089b5
diff --git a/media-fonts/notofonts/notofonts-20200102-r1.ebuild b/media-fonts/notofonts/notofonts-20200102-r1.ebuild
deleted file mode 120000
index c12c733..0000000
--- a/media-fonts/notofonts/notofonts-20200102-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-notofonts-20200102.ebuild
\ No newline at end of file
diff --git a/media-fonts/notofonts/notofonts-20200917-r1.ebuild b/media-fonts/notofonts/notofonts-20200917-r1.ebuild
new file mode 120000
index 0000000..0da224f
--- /dev/null
+++ b/media-fonts/notofonts/notofonts-20200917-r1.ebuild
@@ -0,0 +1 @@
+notofonts-20200917.ebuild
\ No newline at end of file
diff --git a/media-fonts/notofonts/notofonts-20200102.ebuild b/media-fonts/notofonts/notofonts-20200917.ebuild
similarity index 100%
rename from media-fonts/notofonts/notofonts-20200102.ebuild
rename to media-fonts/notofonts/notofonts-20200917.ebuild
diff --git a/media-gfx/sane-airscan/Manifest b/media-gfx/sane-airscan/Manifest
index d1edb47..62d01d7 100644
--- a/media-gfx/sane-airscan/Manifest
+++ b/media-gfx/sane-airscan/Manifest
@@ -1 +1 @@
-DIST sane-airscan-0.99.5.tar.gz 127014 BLAKE2B 9875bb32f3a9dcd79105466bc91d23dc5cee9825bc0f0c0ffd180f4b631499fefbe30fd4e462f257a004fc3c858dce6a5aea3c96a67440e3550efea0b310f388 SHA512 003924bada54b87210f63b655e2d0d5416c3bdd29cd8cd28537f38a775d5b11d0d7d15bdcb9dde4ec55df60dc50d940c47d92c4c66b732e32be01336cf2feb3c
+DIST sane-airscan-447b930c908eae36df42d9aeb2e6c2d75cf37144.tar.gz 174851 BLAKE2B d53b67c8c080e1d2ab92d0d07bf47242ec7e0323da8849545867f3aa2494af32e366de663a545fb6ccf7a13a6c263023e1171e64124987203463afd72e6d906e SHA512 05087ea2bd7b7e28c373c5826b9df9899b35b9be963791cb16c626b613a15da54a3a5ab2b4ec4c2abb1b24316ffad3a78306cad24fd6a2e7044c5c3e68302a03
diff --git a/media-gfx/sane-airscan/files/airscan.conf b/media-gfx/sane-airscan/files/airscan.conf
index 237b762..d25188a 100644
--- a/media-gfx/sane-airscan/files/airscan.conf
+++ b/media-gfx/sane-airscan/files/airscan.conf
@@ -41,6 +41,7 @@
 #model = network
 #protocol = auto
 #ws-discovery = fast
+socket_dir = /run/ippusb
 
 # Configuration of debug facilities
 #   trace = path        ; enables protocol trace and configures output
diff --git a/media-gfx/sane-airscan/files/airscan_xml_fuzzer.cc b/media-gfx/sane-airscan/files/airscan_xml_fuzzer.cc
new file mode 100644
index 0000000..de13a25
--- /dev/null
+++ b/media-gfx/sane-airscan/files/airscan_xml_fuzzer.cc
@@ -0,0 +1,45 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <cstddef>
+#include <cstdint>
+#include <cstdio>
+
+#include <libxml/xmlerror.h>
+
+extern "C" {
+#include "airscan.h"
+}
+
+void noerrs(void *ctx, const char*msg, ...) {
+  // Ignore the libxml error messages.
+}
+
+constexpr int kMaxInputSize = 256 * 1024;
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Limit fuzzer input size to 256KB.  libxml can take a very long time to
+  // parse very large inputs, which causes the fuzzer to time out.
+  if (size > kMaxInputSize) {
+    return 0;
+  }
+
+  xmlSetGenericErrorFunc(NULL, noerrs);
+
+  xml_rd *xml = NULL;
+  if (xml_rd_begin(&xml, (const char*)data, size, NULL)) {
+    return 0;
+  }
+  if (xml == NULL) {
+    return 0;
+  }
+
+  while (!xml_rd_end(xml)) {
+    xml_rd_deep_next(xml, 0);
+  }
+
+  xml_rd_finish(&xml);
+
+  return 0;
+}
diff --git a/media-gfx/sane-airscan/files/fuzzers.owners b/media-gfx/sane-airscan/files/fuzzers.owners
new file mode 100644
index 0000000..b52280b
--- /dev/null
+++ b/media-gfx/sane-airscan/files/fuzzers.owners
@@ -0,0 +1,3 @@
+bmgordon@chromium.org
+fletcherw@chromium.org
+jschettler@chromium.org
diff --git a/media-gfx/sane-airscan/files/sane-airscan-0.99.10-fuzzer.patch b/media-gfx/sane-airscan/files/sane-airscan-0.99.10-fuzzer.patch
new file mode 100644
index 0000000..bc64fa6
--- /dev/null
+++ b/media-gfx/sane-airscan/files/sane-airscan-0.99.10-fuzzer.patch
@@ -0,0 +1,27 @@
+Add a fuzzer target to meson.build.
+
+http://b/160181793
+
+diff -ruN a/meson.build b/meson.build
+--- a/meson.build	2020-07-10 13:40:14.015406390 -0600
++++ b/meson.build	2020-07-10 13:48:30.282053752 -0600
+@@ -1,4 +1,4 @@
+-project('sane-airscan', 'c')
++project('sane-airscan', 'c', 'cpp')
+ 
+ sources = [
+   'airscan-array.c',
+@@ -65,6 +65,13 @@
+   install: true
+ )
+ 
++executable(
++  'airscan_xml_fuzzer',
++  sources + ['airscan_xml_fuzzer.cc'],
++  dependencies: shared_deps,
++  build_by_default: false
++)
++
+ install_man('sane-airscan.5')
+ install_man('airscan-discover.1')
+ install_data(['airscan.conf', 'dll.conf'], install_dir : 'etc/sane.d')
diff --git a/media-gfx/sane-airscan/files/sane-airscan-0.99.17-pointer-cast.patch b/media-gfx/sane-airscan/files/sane-airscan-0.99.17-pointer-cast.patch
new file mode 100644
index 0000000..8f185f3
--- /dev/null
+++ b/media-gfx/sane-airscan/files/sane-airscan-0.99.17-pointer-cast.patch
@@ -0,0 +1,100 @@
+commit 291ca30f185bdd47d744c1d616dd50857cd96f9c
+Author: Benjamin Gordon <bmgordon@chromium.org>
+Date:   Thu Sep 3 17:08:30 2020 -0600
+
+    Add explicit pointer casts
+    
+    mem_resize returns a void*, which needs to be explicitly cast to the
+    expected result type when compiler warnings are enabled.
+
+diff --git a/airscan-mdns.c b/airscan-mdns.c
+index 55cae5b..5ef4a46 100644
+--- a/airscan-mdns.c
++++ b/airscan-mdns.c
+@@ -621,7 +621,10 @@ mdns_avahi_browser_callback (AvahiServiceBrowser *b, AvahiIfIndex interface,
+         AvahiLookupResultFlags flags, void* userdata)
+ {
+     mdns_finding    *mdns;
++#pragma clang diagnostics push
+     MDNS_SERVICE    service = (MDNS_SERVICE) userdata;
++#pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast"
++#pragma clang diagnostics pop
+     ZEROCONF_METHOD method = mdns_service_to_method(service);
+     bool            initscan = mdns_initscan[service];
+ 
+diff --git a/airscan.h b/airscan.h
+index 75034ac..b196330 100644
+--- a/airscan.h
++++ b/airscan.h
+@@ -328,7 +328,7 @@ __mem_shrink (void *p, size_t len, size_t elsize);
+  */
+ static inline char*
+ str_new (void) {
+-    char *s = mem_resize((char*) NULL, 0, 1);
++    char *s = (char *)mem_resize((char*) NULL, 0, 1);
+     *s = '\0';
+     return s;
+ }
+@@ -339,7 +339,7 @@ static inline char*
+ str_dup (const char *s1)
+ {
+     size_t len = strlen(s1);
+-    char   *s = mem_resize((char*) NULL, len, 1);
++    char   *s = (char *)mem_resize((char*) NULL, len, 1);
+     memcpy(s, s1, len + 1);
+     return s;
+ }
+@@ -376,7 +376,7 @@ str_trunc (char *s)
+ static inline char*
+ str_resize (char *s, size_t len)
+ {
+-    s = mem_resize(s, len, 1);
++    s = (char *)mem_resize(s, len, 1);
+     s[len] = '\0';
+     return s;
+ }
+@@ -392,7 +392,7 @@ str_append_mem (char *s1, const char *s2, size_t l2)
+ {
+     size_t l1 = mem_len(s1);
+ 
+-    s1 = mem_resize(s1, l1 + l2, 1);
++    s1 = (char *)mem_resize(s1, l1 + l2, 1);
+     memcpy(s1 + l1, s2, l2);
+     s1[l1+l2] = '\0';
+ 
+@@ -524,7 +524,7 @@ static inline void**
+ __ptr_array_append (void **a, void *p)
+ {
+     size_t len = mem_len(a) + 1;
+-    a = mem_resize(a, len, 1);
++    a = (void **)mem_resize(a, len, 1);
+     a[len - 1] = p;
+     a[len] = NULL;
+     return a;
+@@ -1875,7 +1875,7 @@ static inline SANE_Word*
+ sane_word_array_append (SANE_Word *a, SANE_Word w)
+ {
+     size_t len = sane_word_array_len(a) + 1;
+-    a = mem_resize(a, len + 1, 0);
++    a = (SANE_Word *)mem_resize(a, len + 1, 0);
+     a[0] = len;
+     a[len] = w;
+     return a;
+@@ -1901,7 +1901,7 @@ sane_word_array_intersect_sorted ( const SANE_Word *a1, const SANE_Word *a2);
+ static inline SANE_String*
+ sane_string_array_new (void)
+ {
+-    return ptr_array_new(SANE_String);
++    return (SANE_String*)ptr_array_new(SANE_String);
+ }
+ 
+ /* Free array of SANE_String
+@@ -1946,7 +1946,7 @@ sane_string_array_max_strlen(const SANE_String *a);
+ static inline const SANE_Device**
+ sane_device_array_new (void)
+ {
+-    return ptr_array_new(SANE_Device*);
++    return (const SANE_Device**)ptr_array_new(SANE_Device*);
+ }
+ 
+ /* Free array of SANE_Device
diff --git a/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901-r3.ebuild b/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901-r3.ebuild
new file mode 120000
index 0000000..2815307
--- /dev/null
+++ b/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901-r3.ebuild
@@ -0,0 +1 @@
+sane-airscan-0.99.17_pre20200901.ebuild
\ No newline at end of file
diff --git a/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901.ebuild b/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901.ebuild
new file mode 100644
index 0000000..36b99e0
--- /dev/null
+++ b/media-gfx/sane-airscan/sane-airscan-0.99.17_pre20200901.ebuild
@@ -0,0 +1,74 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit meson cros-fuzzer cros-sanitizers
+
+DESCRIPTION="eSCL and WSD SANE backend"
+HOMEPAGE="https://github.com/alexpevzner/sane-airscan"
+LICENSE="GPL-2"
+SLOT="0/${PVR}"
+KEYWORDS="*"
+IUSE="asan fuzzer"
+
+COMMON_DEPEND="
+	dev-libs/libxml2:=
+	media-gfx/sane-backends:=
+	media-libs/libjpeg-turbo:=
+	media-libs/libpng:=
+	net-dns/avahi:=
+	net-libs/libsoup:=
+"
+DEPEND="${COMMON_DEPEND}"
+RDEPEND="${COMMON_DEPEND}"
+
+# SHA-1 or tag will both work.
+GIT_REF="447b930c908eae36df42d9aeb2e6c2d75cf37144"
+SRC_URI="https://github.com/alexpevzner/sane-airscan-unstable/archive/${GIT_REF}.tar.gz -> ${PN}-${GIT_REF}.tar.gz"
+S="${WORKDIR}/${PN}-unstable-${GIT_REF}"
+
+PATCHES=(
+	"${FILESDIR}/sane-airscan-0.99.10-fuzzer.patch"
+	"${FILESDIR}/sane-airscan-0.99.17-pointer-cast.patch"
+)
+
+src_prepare() {
+	default_src_prepare
+	cp "${FILESDIR}/airscan_xml_fuzzer.cc" "${S}" || die
+}
+
+src_configure() {
+	sanitizers-setup-env || die
+	fuzzer-setup-binary || die
+	meson_src_configure
+}
+
+src_compile() {
+	if use fuzzer; then
+		meson_src_compile airscan_xml_fuzzer
+	else
+		meson_src_compile
+	fi
+}
+
+src_install() {
+	if ! use fuzzer; then
+		dobin "${BUILD_DIR}/airscan-discover"
+
+		exeinto "/usr/$(get_libdir)/sane"
+		doexe "${BUILD_DIR}/libsane-airscan.so.1"
+
+		insinto "/etc/sane.d"
+		newins "${FILESDIR}/airscan.conf" "airscan.conf"
+
+		insinto "/etc/sane.d/dll.d"
+		newins "${S}/dll.conf" "airscan.conf"
+	fi
+
+	# Safe to call even if the fuzzer isn't built because this won't do
+	# anything unless we have USE=fuzzer.
+	fuzzer_install "${FILESDIR}/fuzzers.owners" \
+		"${BUILD_DIR}/airscan_xml_fuzzer"
+
+}
diff --git a/media-gfx/sane-airscan/sane-airscan-0.99.5-r1.ebuild b/media-gfx/sane-airscan/sane-airscan-0.99.5-r1.ebuild
deleted file mode 120000
index fdf4215..0000000
--- a/media-gfx/sane-airscan/sane-airscan-0.99.5-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-sane-airscan-0.99.5.ebuild
\ No newline at end of file
diff --git a/media-gfx/sane-airscan/sane-airscan-0.99.5.ebuild b/media-gfx/sane-airscan/sane-airscan-0.99.5.ebuild
deleted file mode 100644
index c1ce8b7..0000000
--- a/media-gfx/sane-airscan/sane-airscan-0.99.5.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-inherit meson cros-sanitizers
-
-DESCRIPTION="eSCL and WSD SANE backend"
-HOMEPAGE="https://github.com/alexpevzner/sane-airscan"
-LICENSE="GPL-2"
-SLOT="0/${PVR}"
-KEYWORDS="*"
-
-COMMON_DEPEND="
-	dev-libs/libxml2:=
-	media-gfx/sane-backends:=
-	media-libs/libjpeg-turbo:=
-	media-libs/libpng:=
-	net-dns/avahi:=
-	net-libs/libsoup:=
-"
-DEPEND="${COMMON_DEPEND}"
-RDEPEND="${COMMON_DEPEND}"
-
-# SHA-1 or tag will both work.
-GIT_REF="0.99.5"
-SRC_URI="https://github.com/alexpevzner/sane-airscan/archive/${GIT_REF}.tar.gz -> ${PN}-${GIT_REF}.tar.gz"
-S="${WORKDIR}/${PN}-${GIT_REF}"
-
-src_configure() {
-	sanitizers-setup-env
-	meson_src_configure
-}
-
-src_install() {
-	dobin "${BUILD_DIR}/airscan-discover"
-
-	exeinto "/usr/$(get_libdir)/sane"
-	doexe "${BUILD_DIR}/libsane-airscan.so.1"
-
-	insinto "/etc/sane.d"
-	newins "${FILESDIR}/airscan.conf" "airscan.conf"
-
-	insinto "/etc/sane.d/dll.d"
-	newins "${S}/dll.conf" "airscan.conf"
-}
diff --git a/media-gfx/sane-backends/Manifest b/media-gfx/sane-backends/Manifest
index a857bcc..b0fca2f 100644
--- a/media-gfx/sane-backends/Manifest
+++ b/media-gfx/sane-backends/Manifest
@@ -1 +1 @@
-DIST sane-backends-1.0.30.tar.gz 5721262 BLAKE2B 139d3ca908d54b94d14ef4145d44a89b939807c15870be03c3c028cf95351bf9a4abd3ea115b84396366bb054f37ade883f429467dceb0663c2855b92e0a4fa5 SHA512 19127c8109c1587d60d8cba713f73b1a24242df44fa49c3e59320f48022783f05d26d3242a3f87478e583a807d88b446ef7a51afb33b674be29656496c435d7b
+DIST sane-backends-1.0.31.tar.gz 5731445 BLAKE2B d70691acbd3f5788a26bab6b35eeb243801b435272b57e3fa568127562ff57797452e396e6e5f058c33d3bce0f99b672542fb89bc8eb4d36cbe82ccc20b8f298 SHA512 d8ef05cc3aa9c4fa42c9241e1e61fc93e7959df3746a3a2cfaa6e4fb26dfd0911b4d3227b2da28852f8630fa17ad3432a1230a6f4425340e79a3b82ec5eaa9eb
diff --git a/media-gfx/sane-backends/sane-backends-1.0.30-r1.ebuild b/media-gfx/sane-backends/sane-backends-1.0.30-r1.ebuild
deleted file mode 120000
index aa3a1ed..0000000
--- a/media-gfx/sane-backends/sane-backends-1.0.30-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-sane-backends-1.0.30.ebuild
\ No newline at end of file
diff --git a/media-gfx/sane-backends/sane-backends-1.0.30.ebuild b/media-gfx/sane-backends/sane-backends-1.0.30.ebuild
deleted file mode 100644
index 434892f..0000000
--- a/media-gfx/sane-backends/sane-backends-1.0.30.ebuild
+++ /dev/null
@@ -1,350 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-inherit flag-o-matic autotools multilib-minimal systemd toolchain-funcs udev user
-
-# gphoto and v4l are handled by their usual USE flags.
-# The pint backend was disabled because I could not get it to compile.
-IUSE_SANE_BACKENDS="
-	abaton
-	agfafocus
-	apple
-	artec
-	artec_eplus48u
-	as6e
-	avision
-	bh
-	canon
-	canon630u
-	canon_dr
-	canon_pp
-	cardscan
-	coolscan
-	coolscan2
-	coolscan3
-	dc210
-	dc240
-	dc25
-	dell1600n_net
-	dmc
-	epjitsu
-	epson
-	epson2
-	escl
-	fujitsu
-	genesys
-	gt68xx
-	hp
-	hp3500
-	hp3900
-	hp4200
-	hp5400
-	hp5590
-	hpljm1005
-	hpsj5s
-	hs2p
-	ibm
-	kodak
-	kodakaio
-	kvs1025
-	kvs20xx
-	kvs40xx
-	leo
-	lexmark
-	ma1509
-	magicolor
-	matsushita
-	microtek
-	microtek2
-	mustek
-	mustek_pp
-	mustek_usb
-	mustek_usb2
-	nec
-	net
-	niash
-	p5
-	pie
-	pixma
-	plustek
-	plustek_pp
-	pnm
-	qcam
-	ricoh
-	ricoh2
-	rts8891
-	s9036
-	sceptre
-	sharp
-	sm3600
-	sm3840
-	snapscan
-	sp15c
-	st400
-	stv680
-	tamarack
-	teco1
-	teco2
-	teco3
-	test
-	u12
-	umax
-	umax1220u
-	umax_pp
-	xerox_mfp"
-
-IUSE="gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf"
-
-for backend in ${IUSE_SANE_BACKENDS}; do
-	case ${backend} in
-	# Disable backends that require parallel ports as no one has those anymore.
-	canon_pp|hpsj5s|mustek_pp|\
-	pnm)
-		IUSE+=" -sane_backends_${backend}"
-		;;
-	mustek_usb2|kvs40xx)
-		IUSE+=" sane_backends_${backend}"
-		;;
-	escl)
-		IUSE+=" -sane_backends_${backend}"
-		;;
-	*)
-		IUSE+=" +sane_backends_${backend}"
-	esac
-done
-
-REQUIRED_USE="
-	sane_backends_mustek_usb2? ( threads )
-	sane_backends_kvs40xx? ( threads )
-"
-
-DESCRIPTION="Scanner Access Now Easy - Backends"
-HOMEPAGE="http://www.sane-project.org/"
-SRC_URI="https://gitlab.com/sane-project/backends/-/archive/${PV}/backends-${PV}.tar.gz -> ${P}.tar.gz"
-S="${WORKDIR}/backends-${PV}"
-
-LICENSE="GPL-2 public-domain"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}] )
-	sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}] )
-	sane_backends_dell1600n_net? (
-		>=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}]
-		>=media-libs/tiff-3.9.7-r1:0=[${MULTILIB_USEDEP}]
-	)
-	sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
-	sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
-	sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
-	usb? ( >=virtual/libusb-1-r1:1=[${MULTILIB_USEDEP}] )
-	gphoto2? (
-		>=media-libs/libgphoto2-2.5.3.1:=[${MULTILIB_USEDEP}]
-		>=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}]
-	)
-	v4l? ( >=media-libs/libv4l-0.9.5[${MULTILIB_USEDEP}] )
-	xinetd? ( sys-apps/xinetd )
-	snmp? ( net-analyzer/net-snmp:0= )
-	systemd? ( sys-apps/systemd:0= )
-	zeroconf? ( >=net-dns/avahi-0.6.31-r2[${MULTILIB_USEDEP}] )
-"
-
-DEPEND="${RDEPEND}
-	v4l? ( sys-kernel/linux-headers )
-	>=sys-devel/gettext-0.18.1
-	>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
-"
-
-MULTILIB_CHOST_TOOLS=(
-	/usr/bin/sane-config
-)
-
-pkg_setup() {
-	enewgroup scanner
-	enewuser saned -1 -1 -1 scanner
-}
-
-src_prepare() {
-	default
-
-	cat >> backend/dll.conf.in <<-EOF
-	# Add support for the HP-specific backend.  Needs net-print/hplip installed.
-	hpaio
-	# Add support for the Epson-specific backend.  Needs media-gfx/iscan installed.
-	epkowa
-	EOF
-
-	eapply "${FILESDIR}"/${PN}-1.0.24-saned_pidfile_location.patch
-	eapply "${FILESDIR}"/${PN}-1.0.29-genesys-test-headers.patch
-
-	# From Arch
-	eapply "${FILESDIR}"/${PN}-1.0.30-network.patch
-
-	# Upstream sometimes forgets to remove the "git describe" check
-	# in the version, which then fails because .git isn't included in the
-	# released tarball.  Replace it with the plain version number.
-	sed -i \
-		-e "s/^\(AC_INIT([^,]*,\)m4_esyscmd_s([^)]*),/\1${PV},/" \
-		configure.ac || die
-	eautoreconf
-
-	# Fix for "make check".  Upstream sometimes forgets to update this.
-	local ver=$(./configure --version | awk '{print $NF; exit 0}')
-	sed -i \
-		-e "/by sane-desc 3.5 from sane-backends/s:sane-backends .*:sane-backends ${ver}:" \
-		testsuite/tools/data/html* || die
-}
-
-src_configure() {
-	# genesys backend doesn't build without exceptions.
-	cros_enable_cxx_exceptions
-	append-flags -fno-strict-aliasing # From Fedora
-
-	# if LINGUAS is set, just use the listed and supported localizations.
-	# shellcheck disable=SC2154
-	if [[ "${LINGUAS+set}" == "set" ]]; then
-		mkdir -p po || die
-		strip-linguas -u po
-		printf '%s\n' "${LINGUAS}" > po/LINGUAS
-	fi
-
-	multilib-minimal_src_configure
-}
-
-multilib_src_configure() {
-	# the blank is intended - an empty string would result in building ALL backends.
-	local BACKENDS=" "
-
-	use gphoto2 && BACKENDS="gphoto2"
-	use v4l && BACKENDS="${BACKENDS} v4l"
-	for backend in ${IUSE_SANE_BACKENDS}; do
-		if use "sane_backends_${backend}" && [ "${backend}" != pnm ]; then
-			BACKENDS="${BACKENDS} ${backend}"
-		fi
-	done
-
-	local myconf=(
-		"$(use_with usb)"
-		"$(multilib_native_use_with snmp)"
-	)
-
-	# you can only enable this backend, not disable it...
-	if use sane_backends_pnm; then
-		myconf+=( --enable-pnm-backend )
-	fi
-	if use sane_backends_mustek_pp; then
-		myconf+=( --enable-parport-directio )
-	fi
-	if ! { use sane_backends_canon_pp || use sane_backends_hpsj5s || use sane_backends_mustek_pp; }; then
-		myconf+=( sane_cv_use_libieee1284=no )
-	fi
-
-	# relative path must be used for tests to work properly
-	# All distributions pass --disable-locking because /var/lock/sane/ would be a world-writable directory
-	# --without-api-spec to not automagically depend on tons of stuff
-	# that break in many ways, bug #636202, #668232, #668350
-	# People can refer to the "Programmer's Documentation" at http://www.sane-project.org/docs.html
-	ECONF_SOURCE=${S} \
-	SANEI_JPEG="sanei_jpeg.o" SANEI_JPEG_LO="sanei_jpeg.lo" \
-	BACKENDS="${BACKENDS}" \
-	econf \
-		--disable-locking \
-		--without-api-spec \
-		"$(use_with gphoto2)" \
-		"$(multilib_native_use_with systemd)" \
-		"$(use_with v4l)" \
-		"$(use_enable ipv6)" \
-		"$(use_enable threads pthread)" \
-		"$(use_enable zeroconf avahi)" \
-		"${myconf[@]}"
-}
-
-multilib_src_compile() {
-	emake VARTEXFONTS="${T}/fonts"
-
-	if tc-is-cross-compiler; then
-		pushd "${BUILD_DIR}"/tools >/dev/null || die
-
-		# The build system sucks and doesn't handle this properly.
-		# https://alioth.debian.org/tracker/index.php?func=detail&aid=314236&group_id=30186&atid=410366
-		tc-export_build_env BUILD_CC
-		# The *FLAGS variables were created above and may intentionally
-		# contain spaces, so don't lint them.
-		# shellcheck disable=2154 disable=2086
-		"${BUILD_CC}" ${BUILD_CPPFLAGS} ${BUILD_CFLAGS} ${BUILD_LDFLAGS} \
-			-I. -I../include -I"${S}"/include \
-			"${S}"/sanei/sanei_config.c "${S}"/sanei/sanei_constrain_value.c \
-			"${S}"/sanei/sanei_init_debug.c "${S}"/tools/sane-desc.c -o sane-desc || die
-		local dirs=( hal hotplug hotplug-ng udev )
-		local targets=(
-			hal/libsane.fdi
-			hotplug/libsane.usermap
-			hotplug-ng/libsane.db
-			udev/libsane.rules
-		)
-		mkdir -p "${dirs[@]}" || die
-		emake "${targets[@]}"
-
-		popd >/dev/null || die
-	fi
-
-	if use usb; then
-		sed -i -e '/^$/d' \
-			tools/hotplug/libsane.usermap || die
-	fi
-}
-
-multilib_src_install() {
-	emake INSTALL_LOCKPATH="" DESTDIR="${D}" install \
-		docdir="${EPREFIX}"/usr/share/doc/${PF}
-
-	if multilib_is_native_abi; then
-		if use usb; then
-			insinto /etc/hotplug/usb
-			doins tools/hotplug/libsane.usermap
-		fi
-
-		udev_newrules tools/udev/libsane.rules 41-libsane.rules
-		insinto "/usr/share/pkgconfig"
-		doins tools/sane-backends.pc
-	fi
-}
-
-multilib_src_install_all() {
-	keepdir /var/lib/lock/sane
-	fowners root:scanner /var/lib/lock/sane
-	fperms g+w /var/lib/lock/sane
-	dodir /etc/env.d
-
-	if use systemd; then
-		systemd_newunit "${FILESDIR}"/saned_at.service "saned@.service"
-		systemd_newunit "${FILESDIR}"/saned.socket saned.socket
-	fi
-
-	if use usb; then
-		exeinto /etc/hotplug/usb
-		doexe tools/hotplug/libusbscanner
-		newdoc tools/hotplug/README README.hotplug
-	fi
-
-	dodoc NEWS AUTHORS ChangeLog ChangeLogs/* PROBLEMS README README.linux
-	find "${D}" -name '*.la' -delete || die
-
-	if use xinetd; then
-		insinto /etc/xinetd.d
-		doins "${FILESDIR}"/saned
-	fi
-}
-
-pkg_postinst() {
-	if use xinetd; then
-		elog "If you want remote clients to connect, edit"
-		elog "/etc/sane.d/saned.conf and /etc/hosts.allow"
-	fi
-
-	if ! use systemd; then
-		elog "If you are using a USB scanner, add all users who want"
-		elog "to access your scanner to the \"scanner\" group."
-	fi
-}
diff --git a/media-gfx/sane-backends/sane-backends-1.0.31-r2.ebuild b/media-gfx/sane-backends/sane-backends-1.0.31-r2.ebuild
new file mode 120000
index 0000000..cf581b9
--- /dev/null
+++ b/media-gfx/sane-backends/sane-backends-1.0.31-r2.ebuild
@@ -0,0 +1 @@
+sane-backends-1.0.31.ebuild
\ No newline at end of file
diff --git a/media-gfx/sane-backends/sane-backends-1.0.31.ebuild b/media-gfx/sane-backends/sane-backends-1.0.31.ebuild
new file mode 100644
index 0000000..ceaa268
--- /dev/null
+++ b/media-gfx/sane-backends/sane-backends-1.0.31.ebuild
@@ -0,0 +1,374 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+inherit flag-o-matic autotools multilib-minimal systemd toolchain-funcs udev \
+	user cros-sanitizers
+
+# gphoto and v4l are handled by their usual USE flags.
+# The pint backend was disabled because I could not get it to compile.
+IUSE_SANE_BACKENDS="
+	abaton
+	agfafocus
+	apple
+	artec
+	artec_eplus48u
+	as6e
+	avision
+	bh
+	canon
+	canon630u
+	canon_dr
+	canon_lide70
+	canon_pp
+	cardscan
+	coolscan
+	coolscan2
+	coolscan3
+	dc210
+	dc240
+	dc25
+	dell1600n_net
+	dmc
+	epjitsu
+	epson
+	epson2
+	escl
+	fujitsu
+	genesys
+	gt68xx
+	hp
+	hp3500
+	hp3900
+	hp4200
+	hp5400
+	hp5590
+	hpljm1005
+	hpsj5s
+	hs2p
+	ibm
+	kodak
+	kodakaio
+	kvs1025
+	kvs20xx
+	kvs40xx
+	leo
+	lexmark
+	ma1509
+	magicolor
+	matsushita
+	microtek
+	microtek2
+	mustek
+	mustek_pp
+	mustek_usb
+	mustek_usb2
+	nec
+	net
+	niash
+	p5
+	pie
+	pixma
+	plustek
+	plustek_pp
+	pnm
+	qcam
+	ricoh
+	ricoh2
+	rts8891
+	s9036
+	sceptre
+	sharp
+	sm3600
+	sm3840
+	snapscan
+	sp15c
+	st400
+	stv680
+	tamarack
+	teco1
+	teco2
+	teco3
+	test
+	u12
+	umax
+	umax1220u
+	umax_pp
+	xerox_mfp"
+
+IUSE="gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf"
+
+for backend in ${IUSE_SANE_BACKENDS}; do
+	case ${backend} in
+	# Disable backends that require parallel ports as no one has those anymore.
+	canon_pp|hpsj5s|mustek_pp|\
+	pnm)
+		IUSE+=" -sane_backends_${backend}"
+		;;
+	mustek_usb2|kvs40xx)
+		IUSE+=" sane_backends_${backend}"
+		;;
+	escl)
+		IUSE+=" -sane_backends_${backend}"
+		;;
+	*)
+		IUSE+=" +sane_backends_${backend}"
+	esac
+done
+
+REQUIRED_USE="
+	sane_backends_mustek_usb2? ( threads )
+	sane_backends_kvs40xx? ( threads )
+"
+
+DESCRIPTION="Scanner Access Now Easy - Backends"
+HOMEPAGE="http://www.sane-project.org/"
+SRC_URI="https://gitlab.com/sane-project/backends/-/archive/${PV}/backends-${PV}.tar.gz -> ${P}.tar.gz"
+S="${WORKDIR}/backends-${PV}"
+
+LICENSE="GPL-2 public-domain"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}] )
+	sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}] )
+	sane_backends_dell1600n_net? (
+		>=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}]
+		>=media-libs/tiff-3.9.7-r1:0=[${MULTILIB_USEDEP}]
+	)
+	sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
+	sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
+	sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[${MULTILIB_USEDEP}] )
+	usb? ( >=virtual/libusb-1-r1:1=[${MULTILIB_USEDEP}] )
+	gphoto2? (
+		>=media-libs/libgphoto2-2.5.3.1:=[${MULTILIB_USEDEP}]
+		>=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}]
+	)
+	v4l? ( >=media-libs/libv4l-0.9.5[${MULTILIB_USEDEP}] )
+	xinetd? ( sys-apps/xinetd )
+	snmp? ( net-analyzer/net-snmp:0= )
+	systemd? ( sys-apps/systemd:0= )
+	zeroconf? ( >=net-dns/avahi-0.6.31-r2[${MULTILIB_USEDEP}] )
+"
+
+DEPEND="${RDEPEND}
+	v4l? ( sys-kernel/linux-headers )
+	>=sys-devel/gettext-0.18.1
+	>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
+"
+
+MULTILIB_CHOST_TOOLS=(
+	/usr/bin/sane-config
+)
+
+pkg_setup() {
+	enewgroup scanner
+	enewuser saned -1 -1 -1 scanner	
+}
+
+src_prepare() {
+	default
+
+	cat >> backend/dll.conf.in <<-EOF
+	# Add support for the HP-specific backend.  Needs net-print/hplip installed.
+	hpaio
+	# Add support for the Epson-specific backend.  Needs media-gfx/iscan installed.
+	epkowa
+	EOF
+
+	eapply "${FILESDIR}"/${PN}-1.0.24-saned_pidfile_location.patch
+	eapply "${FILESDIR}"/${PN}-1.0.29-genesys-test-headers.patch
+
+	# From Arch
+	eapply "${FILESDIR}"/${PN}-1.0.30-network.patch
+
+	# Upstream sometimes forgets to remove the "git describe" check
+	# in the version, which then fails because .git isn't included in the
+	# released tarball.  Replace it with the plain version number.
+	sed -i \
+		-e "s/^\(AC_INIT([^,]*,\)m4_esyscmd_s([^)]*),/\1${PV},/" \
+		configure.ac || die
+	eautoreconf
+
+	# Fix for "make check".  Upstream sometimes forgets to update this.
+	local ver=$(./configure --version | awk '{print $NF; exit 0}')
+	sed -i \
+		-e "/by sane-desc 3.5 from sane-backends/s:sane-backends .*:sane-backends ${ver}:" \
+		testsuite/tools/data/html* || die
+
+}
+
+src_configure() {
+	# Sanitizers don't link properly, but we want to fuzz dependent
+	# packages (b/160181793).
+	filter_sanitizers
+	# genesys backend doesn't build without exceptions.
+	cros_enable_cxx_exceptions
+	append-flags -fno-strict-aliasing # From Fedora
+
+	# if LINGUAS is set, just use the listed and supported localizations.
+	# shellcheck disable=SC2154
+	if [[ "${LINGUAS+set}" == "set" ]]; then
+		mkdir -p po || die
+		strip-linguas -u po
+		printf '%s\n' "${LINGUAS}" > po/LINGUAS
+	fi
+
+	multilib-minimal_src_configure
+}
+
+multilib_src_configure() {
+
+	# the blank is intended - an empty string would result in building ALL backends.
+	local BACKENDS=" "
+
+	use gphoto2 && BACKENDS="gphoto2"
+	use v4l && BACKENDS="${BACKENDS} v4l"
+	for backend in ${IUSE_SANE_BACKENDS}; do
+		if use "sane_backends_${backend}" && [ "${backend}" != pnm ]; then
+			BACKENDS="${BACKENDS} ${backend}"
+		fi
+	done
+
+	local myconf=(
+		"$(use_with usb)"
+		"$(multilib_native_use_with snmp)"
+	)
+
+	# you can only enable this backend, not disable it...
+	if use sane_backends_pnm; then
+		myconf+=( --enable-pnm-backend )
+	fi
+	if use sane_backends_mustek_pp; then
+		myconf+=( --enable-parport-directio )
+	fi
+	if ! { use sane_backends_canon_pp || use sane_backends_hpsj5s || use sane_backends_mustek_pp; }; then
+		myconf+=( sane_cv_use_libieee1284=no )
+	fi
+
+	# relative path must be used for tests to work properly
+	# All distributions pass --disable-locking because /var/lock/sane/ would be a world-writable directory
+	# --without-api-spec to not automagically depend on tons of stuff
+	# that break in many ways, bug #636202, #668232, #668350
+	# People can refer to the "Programmer's Documentation" at http://www.sane-project.org/docs.html
+	ECONF_SOURCE=${S} \
+	SANEI_JPEG="sanei_jpeg.o" SANEI_JPEG_LO="sanei_jpeg.lo" \
+	BACKENDS="${BACKENDS}" \
+	econf \
+		--disable-locking \
+		--without-api-spec \
+		"$(use_with gphoto2)" \
+		"$(multilib_native_use_with systemd)" \
+		"$(use_with v4l)" \
+		"$(use_enable ipv6)" \
+		"$(use_enable threads pthread)" \
+		"$(use_with zeroconf avahi)" \
+		"${myconf[@]}"
+
+}
+
+multilib_src_compile() {
+	emake VARTEXFONTS="${T}/fonts"
+
+	if tc-is-cross-compiler; then
+		pushd "${BUILD_DIR}"/tools >/dev/null || die
+
+		# The build system sucks and doesn't handle this properly.
+		# https://alioth.debian.org/tracker/index.php?func=detail&aid=314236&group_id=30186&atid=410366
+		tc-export_build_env BUILD_CC
+		# The *FLAGS variables were created above and may intentionally
+		# contain spaces, so don't lint them.
+		# shellcheck disable=2154 disable=2086
+		"${BUILD_CC}" ${BUILD_CPPFLAGS} ${BUILD_CFLAGS} ${BUILD_LDFLAGS} \
+			-I. -I../include -I"${S}"/include \
+			"${S}"/sanei/sanei_config.c "${S}"/sanei/sanei_constrain_value.c \
+			"${S}"/sanei/sanei_init_debug.c "${S}"/tools/sane-desc.c -o sane-desc || die
+		local dirs=( hal hotplug hotplug-ng udev )
+		local targets=(
+			hal/libsane.fdi
+			hotplug/libsane.usermap
+			hotplug-ng/libsane.db
+			udev/libsane.rules
+		)
+		mkdir -p "${dirs[@]}" || die
+		emake "${targets[@]}"
+
+		popd >/dev/null || die
+	fi
+
+	if use usb; then
+		sed -i -e '/^$/d' \
+			tools/hotplug/libsane.usermap || die
+	fi
+}
+
+multilib_src_install() {
+	emake INSTALL_LOCKPATH="" DESTDIR="${D}" install \
+		docdir="${EPREFIX}"/usr/share/doc/${PF}
+
+	if multilib_is_native_abi; then
+		if use usb; then
+			insinto /etc/hotplug/usb
+			doins tools/hotplug/libsane.usermap
+		fi
+
+		udev_newrules tools/udev/libsane.rules 41-libsane.rules
+		insinto "/usr/share/pkgconfig"
+		doins tools/sane-backends.pc
+	fi
+}
+
+multilib_src_install_all() {
+	keepdir /var/lib/lock/sane
+	fowners root:scanner /var/lib/lock/sane
+	fperms g+w /var/lib/lock/sane
+	dodir /etc/env.d
+
+	if use systemd; then
+		systemd_newunit "${FILESDIR}"/saned_at.service "saned@.service"
+		systemd_newunit "${FILESDIR}"/saned.socket saned.socket
+	fi
+
+	if use usb; then
+		exeinto /etc/hotplug/usb
+		doexe tools/hotplug/libusbscanner
+		newdoc tools/hotplug/README README.hotplug
+	fi
+
+	dodoc NEWS AUTHORS ChangeLog ChangeLogs/* PROBLEMS README README.linux
+	find "${D}" -name '*.la' -delete || die
+
+	if use xinetd; then
+		insinto /etc/xinetd.d
+		doins "${FILESDIR}"/saned
+	fi
+
+	# Move the test backend into /usr/local so that it won't be installed
+	# on non-test images. The sane-backends-test package will be
+	# responsible for creating the proper symlinks for the dll backend to
+	# find the test backend.
+	local sane_lib_dir="${ED}/usr/$(get_libdir)/sane"
+	local test_lib_names="
+		libsane-test.so
+		libsane-test.so.$(ver_cut 1 ${PV})
+		libsane-test.so.${PV}
+	"
+	into /usr/local
+	for lib in ${test_lib_names}; do
+		dolib.so "${sane_lib_dir}/${lib}" || die
+		rm "${sane_lib_dir}/${lib}" || die
+	done
+}
+
+pkg_postinst() {
+	if use xinetd; then
+		elog "If you want remote clients to connect, edit"
+		elog "/etc/sane.d/saned.conf and /etc/hosts.allow"
+	fi
+
+	if ! use systemd; then
+		elog "If you are using a USB scanner, add all users who want"
+		elog "to access your scanner to the \"scanner\" group."
+	fi
+}
diff --git a/media-gfx/vadumpcaps/vadumpcaps-20190304-r1.ebuild b/media-gfx/vadumpcaps/vadumpcaps-20190304-r1.ebuild
new file mode 120000
index 0000000..5a90aa8
--- /dev/null
+++ b/media-gfx/vadumpcaps/vadumpcaps-20190304-r1.ebuild
@@ -0,0 +1 @@
+vadumpcaps-20190304.ebuild
\ No newline at end of file
diff --git a/media-gfx/vadumpcaps/vadumpcaps-20190304.ebuild b/media-gfx/vadumpcaps/vadumpcaps-20190304.ebuild
index e4c0245..98d5e5e 100644
--- a/media-gfx/vadumpcaps/vadumpcaps-20190304.ebuild
+++ b/media-gfx/vadumpcaps/vadumpcaps-20190304.ebuild
@@ -16,23 +16,14 @@
 LICENSE="GPL-2"
 SLOT="0"
 KEYWORDS="*"
-IUSE="+drm test wayland X"
 
 RDEPEND="
-	>=x11-libs/libva-2.1.0[drm?,wayland?,X?]
-	drm? ( >=x11-libs/libdrm-2.4 )
-	X? (
-		>=x11-libs/libX11-1.6.2
-		>=x11-libs/libXext-1.3.2
-		>=x11-libs/libXfixes-5.0.1
-	)
-	wayland? ( >=dev-libs/wayland-1.0.6 )"
+	>=x11-libs/libva-2.1.0
+	>=x11-libs/libdrm-2.4"
 
 DEPEND="${RDEPEND}
 	virtual/pkgconfig"
 
-REQUIRED_USE="|| ( drm wayland X )"
-
 src_prepare() {
 	epatch "${FILESDIR}"/avoid_using_VAProcFilterHighDynamicRangeToneMapping.patch
 	epatch "${FILESDIR}"/do_not_use_shell_pkg-config.patch
diff --git a/media-libs/alsa-lib/alsa-lib-1.2.1.2-r1.ebuild b/media-libs/alsa-lib/alsa-lib-1.2.1.2-r2.ebuild
similarity index 100%
rename from media-libs/alsa-lib/alsa-lib-1.2.1.2-r1.ebuild
rename to media-libs/alsa-lib/alsa-lib-1.2.1.2-r2.ebuild
diff --git a/media-libs/alsa-lib/alsa-lib-1.2.1.2.ebuild b/media-libs/alsa-lib/alsa-lib-1.2.1.2.ebuild
index 6e91b65..d8abe5c 100644
--- a/media-libs/alsa-lib/alsa-lib-1.2.1.2.ebuild
+++ b/media-libs/alsa-lib/alsa-lib-1.2.1.2.ebuild
@@ -44,6 +44,8 @@
 }
 
 multilib_src_configure() {
+	cros_optimize_package_for_speed
+
 	local myeconfargs=(
 		--disable-maintainer-mode
 		--disable-resmgr
diff --git a/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r470.ebuild b/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r470.ebuild
deleted file mode 100644
index 929ce0f..0000000
--- a/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r470.ebuild
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "65e27114752b7ab8f4cede066f4a586059bd7e61" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "1ced2e0a68de537e63a5f90fc704bde11c4b2375" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/usb camera/include camera/tools common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/tools/generate_camera_profile"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Runtime detect the number of cameras on device to generate
-corresponding media_profiles.xml."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	media-libs/cros-camera-libcamera_timezone"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/generate_camera_profile"
-}
diff --git a/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r533.ebuild b/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r533.ebuild
new file mode 100644
index 0000000..1be066b
--- /dev/null
+++ b/media-libs/arc-camera-profile/arc-camera-profile-0.0.1-r533.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "3f2ee10a205c3f5536485cb276c251689e36c033" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "871bb7e6654a823f1468a5857b4c74f12aaedbb5" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/usb camera/include camera/tools common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/tools/generate_camera_profile"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Runtime detect the number of cameras on device to generate
+corresponding media_profiles.xml."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	media-libs/cros-camera-libcamera_timezone"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	dobin "${OUT}/generate_camera_profile"
+}
diff --git a/media-libs/arc-camera-service/arc-camera-service-0.0.1-r431.ebuild b/media-libs/arc-camera-service/arc-camera-service-0.0.1-r431.ebuild
deleted file mode 100644
index 2b85249..0000000
--- a/media-libs/arc-camera-service/arc-camera-service-0.0.1-r431.ebuild
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="f1856c6f39a5cacd367cfc24926d6773c97a7aec"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "65e27114752b7ab8f4cede066f4a586059bd7e61" "c8cf946e212b8355bc1f53f077004c814532e904" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-# TODO(crbug.com/914263): camera/hal/usb is unnecessary for this build but is
-# workaround for unexpected sandbox behavior.
-CROS_WORKON_SUBTREE=".gn camera/build camera/hal/usb camera/hal/usb_v1 camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/hal/usb_v1"
-
-inherit cros-workon platform user
-
-DESCRIPTION="ARC camera service. The service is in charge of accessing camera
-device. It uses linux domain socket (/run/camera/camera.sock) to build a
-synchronous channel."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND="
-	!chromeos-base/arc-camera-service
-	media-libs/cros-camera-libcamera_timezone"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/arc_camera_service"
-
-	insinto /etc/dbus-1/system.d
-	doins org.chromium.ArcCamera.conf
-
-	insinto /etc/init
-	doins init/arc-camera.conf
-}
-
-pkg_preinst() {
-	enewuser "arc-camera"
-	enewgroup "arc-camera"
-}
diff --git a/media-libs/arc-camera-service/arc-camera-service-0.0.1-r479.ebuild b/media-libs/arc-camera-service/arc-camera-service-0.0.1-r479.ebuild
new file mode 100644
index 0000000..ed978dd
--- /dev/null
+++ b/media-libs/arc-camera-service/arc-camera-service-0.0.1-r479.ebuild
@@ -0,0 +1,49 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "3f2ee10a205c3f5536485cb276c251689e36c033" "818ca8722bdd9b9d8291a6a4caa5e5475d4191fc" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+# TODO(crbug.com/914263): camera/hal/usb is unnecessary for this build but is
+# workaround for unexpected sandbox behavior.
+CROS_WORKON_SUBTREE=".gn camera/build camera/hal/usb camera/hal/usb_v1 camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal/usb_v1"
+
+inherit cros-workon platform user
+
+DESCRIPTION="ARC camera service. The service is in charge of accessing camera
+device. It uses linux domain socket (/run/camera/camera.sock) to build a
+synchronous channel."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND="
+	!chromeos-base/arc-camera-service
+	media-libs/cros-camera-libcamera_timezone"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	dobin "${OUT}/arc_camera_service"
+
+	insinto /etc/dbus-1/system.d
+	doins org.chromium.ArcCamera.conf
+
+	insinto /etc/init
+	doins init/arc-camera.conf
+}
+
+pkg_preinst() {
+	enewuser "arc-camera"
+	enewgroup "arc-camera"
+}
diff --git a/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r327.ebuild b/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r327.ebuild
deleted file mode 100644
index 158b9d7..0000000
--- a/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r327.ebuild
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-CROS_WORKON_COMMIT="1de7f6655d09095d28ba05abab8c6f6279671c65"
-CROS_WORKON_TREE="ace310f1a73abd463d2bffeb930f6a8ae3036fc0"
-CROS_WORKON_PROJECT="chromiumos/platform/minigbm"
-CROS_WORKON_LOCALNAME="../platform/minigbm"
-
-inherit multilib-minimal arc-build cros-workon
-
-DESCRIPTION="ChromeOS gralloc implementation"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/minigbm"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-VIDEO_CARDS="amdgpu exynos intel marvell mediatek msm rockchip tegra virgl"
-IUSE="kernel-3_8 kernel-3_14 kernel-3_18 $(printf 'video_cards_%s ' ${VIDEO_CARDS})"
-
-RDEPEND="
-	x11-libs/arc-libdrm[${MULTILIB_USEDEP}]
-"
-DEPEND="
-	${RDEPEND}
-	video_cards_amdgpu? ( virtual/arc-opengles )
-"
-
-src_configure() {
-	# Use arc-build base class to select the right compiler
-	arc-build-select-clang
-
-	# This packages uses -flto with gold, which doesn't support -Os
-	# or -Oz. This produces a 76KB .so, so optimizing for size is
-	# probably not a big deal.
-	cros_optimize_package_for_speed
-
-	BUILD_DIR="$(cros-workon_get_build_dir)"
-
-	append-lfs-flags
-
-	# TODO(gsingh): use pkgconfig
-	if use video_cards_intel; then
-		export DRV_I915=1
-		append-cppflags -DDRV_I915
-		if ! (use kernel-3_8 || use kernel-3_14 || use kernel-3_18); then
-			append-cppflags -DI915_SCANOUT_Y_TILED
-		fi
-	fi
-
-	if use video_cards_rockchip; then
-		export DRV_ROCKCHIP=1
-		append-cppflags -DDRV_ROCKCHIP
-	fi
-
-	if use video_cards_mediatek; then
-		if [[ "${MTK_MINIGBM_PLATFORM}" == "MT8183" ]] ; then
-			export MTK_MT8183=1
-			append-cppflags -DMTK_MT8183
-		fi
-		export DRV_MEDIATEK=1
-		append-cppflags -DDRV_MEDIATEK
-	fi
-
-	if use video_cards_msm; then
-		export DRV_MSM=1
-		append-cppflags -DDRV_MSM
-	fi
-
-	if use video_cards_amdgpu; then
-		export DRV_AMDGPU=1
-		append-cppflags -DDRV_AMDGPU -DHAVE_LIBDRM
-	fi
-
-	if use video_cards_virgl; then
-		export DRV_VIRGL=1
-		append-cppflags -DDRV_VIRGL
-	fi
-
-	multilib-minimal_src_configure
-}
-
-multilib_src_compile() {
-	filter-flags "-DDRI_DRIVER_DIR=*"
-	append-cppflags -DDRI_DRIVER_DIR="/vendor/$(get_libdir)/dri"
-	export TARGET_DIR="${BUILD_DIR}/"
-	emake -C "${S}/cros_gralloc"
-	emake -C "${S}/cros_gralloc/gralloc0/tests/"
-}
-
-multilib_src_install() {
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw/"
-	doexe "${BUILD_DIR}"/gralloc.cros.so
-	into "/usr/local/"
-	newbin "${BUILD_DIR}"/gralloctest "gralloctest_${ABI}"
-}
diff --git a/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r350.ebuild b/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r350.ebuild
new file mode 100644
index 0000000..9483a52
--- /dev/null
+++ b/media-libs/arc-cros-gralloc/arc-cros-gralloc-0.0.1-r350.ebuild
@@ -0,0 +1,97 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_COMMIT="ec9bbc28aadee94185feed9c3452e896c17ed929"
+CROS_WORKON_TREE="fc83b8e971487f9d9e09f6c05bbf637346542ce8"
+CROS_WORKON_PROJECT="chromiumos/platform/minigbm"
+CROS_WORKON_LOCALNAME="../platform/minigbm"
+
+inherit multilib-minimal arc-build cros-workon
+
+DESCRIPTION="ChromeOS gralloc implementation"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/minigbm"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+VIDEO_CARDS="amdgpu exynos intel marvell mediatek msm rockchip tegra virgl"
+IUSE="kernel-3_8 kernel-3_14 kernel-3_18 $(printf 'video_cards_%s ' ${VIDEO_CARDS})"
+
+RDEPEND="
+	x11-libs/arc-libdrm[${MULTILIB_USEDEP}]
+"
+DEPEND="
+	${RDEPEND}
+	video_cards_amdgpu? ( virtual/arc-opengles )
+"
+
+src_configure() {
+	# Use arc-build base class to select the right compiler
+	arc-build-select-clang
+
+	# This packages uses -flto with gold, which doesn't support -Os
+	# or -Oz. This produces a 76KB .so, so optimizing for size is
+	# probably not a big deal.
+	cros_optimize_package_for_speed
+
+	BUILD_DIR="$(cros-workon_get_build_dir)"
+
+	append-lfs-flags
+
+	# TODO(gsingh): use pkgconfig
+	if use video_cards_intel; then
+		export DRV_I915=1
+		append-cppflags -DDRV_I915
+		if ! (use kernel-3_8 || use kernel-3_14 || use kernel-3_18); then
+			append-cppflags -DI915_SCANOUT_Y_TILED
+		fi
+	fi
+
+	if use video_cards_rockchip; then
+		export DRV_ROCKCHIP=1
+		append-cppflags -DDRV_ROCKCHIP
+	fi
+
+	if use video_cards_mediatek; then
+		if [[ "${MTK_MINIGBM_PLATFORM}" == "MT8183" ]] ; then
+			export MTK_MT8183=1
+			append-cppflags -DMTK_MT8183
+		fi
+		export DRV_MEDIATEK=1
+		append-cppflags -DDRV_MEDIATEK
+	fi
+
+	if use video_cards_msm; then
+		export DRV_MSM=1
+		append-cppflags -DDRV_MSM
+	fi
+
+	if use video_cards_amdgpu; then
+		export DRV_AMDGPU=1
+		append-cppflags -DDRV_AMDGPU -DHAVE_LIBDRM
+	fi
+
+	if use video_cards_virgl; then
+		export DRV_VIRGL=1
+		append-cppflags -DDRV_VIRGL -DVIRTIO_GPU_NEXT
+	fi
+
+	multilib-minimal_src_configure
+}
+
+multilib_src_compile() {
+	filter-flags "-DDRI_DRIVER_DIR=*"
+	append-cppflags -DDRI_DRIVER_DIR="/vendor/$(get_libdir)/dri"
+	export TARGET_DIR="${BUILD_DIR}/"
+	emake -C "${S}/cros_gralloc"
+	emake -C "${S}/cros_gralloc/gralloc0/tests/"
+}
+
+multilib_src_install() {
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw/"
+	doexe "${BUILD_DIR}"/gralloc.cros.so
+	into "/usr/local/"
+	newbin "${BUILD_DIR}"/gralloctest "gralloctest_${ABI}"
+}
diff --git a/media-libs/arc-cros-gralloc/arc-cros-gralloc-9999.ebuild b/media-libs/arc-cros-gralloc/arc-cros-gralloc-9999.ebuild
index 5e48767..8f673c3 100644
--- a/media-libs/arc-cros-gralloc/arc-cros-gralloc-9999.ebuild
+++ b/media-libs/arc-cros-gralloc/arc-cros-gralloc-9999.ebuild
@@ -73,7 +73,7 @@
 
 	if use video_cards_virgl; then
 		export DRV_VIRGL=1
-		append-cppflags -DDRV_VIRGL
+		append-cppflags -DDRV_VIRGL -DVIRTIO_GPU_NEXT
 	fi
 
 	multilib-minimal_src_configure
diff --git a/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r15.ebuild b/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r15.ebuild
deleted file mode 100644
index c76c4ba..0000000
--- a/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r15.ebuild
+++ /dev/null
@@ -1,478 +0,0 @@
-# Copyright 1999-2010 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="dc4b2c12e2874e57992aa18f5d0da035839f611e"
-CROS_WORKON_TREE="4a72b0bf5559447300d73c7a1f4cf1ef2fb09b2b"
-MESON_AUTO_DEPEND=no
-
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-amd"
-
-inherit base meson multilib-minimal flag-o-matic toolchain-funcs cros-workon arc-build
-
-OPENGL_DIR="xorg-x11"
-
-DESCRIPTION="OpenGL-like graphic library for Linux"
-HOMEPAGE="http://mesa3d.sourceforge.net/"
-
-# Most of the code is MIT/X11.
-# ralloc is LGPL-3
-# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
-LICENSE="MIT LGPL-3 SGI-B-2.0"
-SLOT="0"
-KEYWORDS="*"
-
-INTEL_CARDS="intel"
-RADEON_CARDS="amdgpu radeon"
-VIDEO_CARDS="${INTEL_CARDS} ${RADEON_CARDS} llvmpipe mach64 mga nouveau powervr r128 savage sis vmware tdfx via freedreno virgl"
-for card in ${VIDEO_CARDS}; do
-	IUSE_VIDEO_CARDS+=" video_cards_${card}"
-done
-
-IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-pi -android_gles2
-	-android_gles30 -android_gles31 +android_gles32 -android_vulkan_compute_0
-	cheets +classic debug dri +egl +gallium
-	-gbm +gles1 +gles2 +llvm +nptl pic selinux +shared-glapi vulkan X xlib-glx
-	cheets_user cheets_user_64"
-
-# llvmpipe requires ARC++ _userdebug images, ARC++ _user images can't use it
-# (b/33072485, b/28802929).
-# Only allow one vulkan driver as they all write vulkan.cheets.so.
-REQUIRED_USE="
-	^^ ( android_gles2 android_gles30 android_gles31 android_gles32 )
-	android_aep? ( !android_gles2 !android_gles30 )
-	android_vulkan_compute_0? ( vulkan )
-	cheets? (
-		vulkan? ( || ( video_cards_amdgpu video_cards_intel ) )
-		video_cards_amdgpu? ( llvm )
-		video_cards_llvmpipe? ( !cheets_user !cheets_user_64 )
-	)"
-
-DEPEND="cheets? (
-		>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
-		llvm? ( sys-devel/arc-llvm:=[${MULTILIB_USEDEP}] )
-		video_cards_amdgpu? (
-			dev-libs/arc-libelf[${MULTILIB_USEDEP}]
-		)
-	)"
-
-RDEPEND="${DEPEND} !media-libs/arc-mesa"
-
-# It is slow without texrels, if someone wants slow
-# mesa without texrels +pic use is worth the shot
-QA_EXECSTACK="usr/lib*/opengl/xorg-x11/lib/libGL.so*"
-QA_WX_LOAD="usr/lib*/opengl/xorg-x11/lib/libGL.so*"
-
-# Think about: ggi, fbcon, no-X configs
-
-driver_list() {
-	local drivers="$(sort -u <<< "${1// /$'\n'}")"
-	echo "${drivers//$'\n'/,}"
-}
-
-pkg_setup() {
-	# workaround toc-issue wrt #386545
-	use ppc64 && append-flags -mminimal-toc
-
-	# Remove symlinks created by an earlier version so we don't have
-	# install conflicts.
-	# TODO: Delete this after June 2019, since everybody should have
-	# upgraded by then.
-	local d
-	for d in EGL GL GLES GLES2 GLES3 KHR; do
-		local replaced_link="${ROOT}${ARC_PREFIX}/vendor/include/${d}"
-		if [[ -L "${replaced_link}" ]]; then
-			rm -f "${replaced_link}"
-		fi
-	done
-}
-
-src_prepare() {
-	# workaround for cros-workon not preserving git metadata
-	if [[ ${PV} == 9999* && "${CROS_WORKON_INPLACE}" != "1" ]]; then
-		echo "#define MESA_GIT_SHA1 \"git-deadbeef\"" > src/git_sha1.h
-	fi
-
-	# apply patches
-	if [[ ${PV} != 9999* && -n ${SRC_PATCHES} ]]; then
-		EPATCH_FORCE="yes" \
-		EPATCH_SOURCE="${WORKDIR}/patches" \
-		EPATCH_SUFFIX="patch" \
-		epatch
-	fi
-	# FreeBSD 6.* doesn't have posix_memalign().
-	if [[ ${CHOST} == *-freebsd6.* ]]; then
-		sed -i \
-			-e "s/-DHAVE_POSIX_MEMALIGN//" \
-			configure.ac || die
-	fi
-
-	# Restrict gles version based on USE flag. (See crbug.com/30202361, b/30202371, b/31041422, b:68023287)
-	if use android_gles32; then
-		einfo "Limiting android to gles32."
-		epatch "${FILESDIR}/gles32/0001-limit-gles-version.patch"
-	elif use android_gles31; then
-		einfo "Limiting android to gles31."
-		epatch "${FILESDIR}/gles31/0001-limit-gles-version.patch"
-	elif use android_gles30; then
-		einfo "Limiting android to gles30."
-		epatch "${FILESDIR}/gles30/0001-limit-gles-version.patch"
-	elif use android_gles2; then
-		einfo "Limiting android to gles2."
-		epatch "${FILESDIR}/gles2/0001-limit-gles-version.patch"
-	fi
-
-	epatch "${FILESDIR}"/CHROMIUM-radv-Remove-extensions-not-supported-in-P.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-extensions-not-supported-by-nd.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-1.1-on-ANDROID.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-ycbcr-support.patch
-
-	default
-}
-
-src_configure() {
-	cros_optimize_package_for_speed
-
-	if use cheets; then
-		#
-		# cheets-specific overrides
-		#
-
-		arc-build-select-clang
-	fi
-
-	multilib-minimal_src_configure
-}
-
-multilib_src_configure() {
-	tc-getPROG PKG_CONFIG pkg-config
-
-	if use !gallium && use !classic; then
-		ewarn "You enabled neither classic nor gallium USE flags. No hardware"
-		ewarn "drivers will be built."
-	fi
-
-	if use classic; then
-	# Configurable DRI drivers
-		driver_enable swrast
-
-		# Intel code
-		driver_enable video_cards_intel i965
-
-		# Nouveau code
-		driver_enable video_cards_nouveau nouveau
-
-		# ATI code
-		driver_enable video_cards_radeon r100 r200
-	fi
-
-	if use gallium; then
-	# Configurable gallium drivers
-		gallium_enable video_cards_llvmpipe swrast
-
-		# Nouveau code
-		gallium_enable video_cards_nouveau nouveau
-
-		# ATI code
-		gallium_enable video_cards_radeon r300 r600
-		gallium_enable video_cards_amdgpu radeonsi
-
-		# Freedreno code
-		gallium_enable video_cards_freedreno freedreno
-
-		gallium_enable video_cards_virgl virgl
-	fi
-
-	if use vulkan; then
-		vulkan_enable video_cards_amdgpu amd
-		vulkan_enable video_cards_intel intel
-	fi
-
-	export LLVM_CONFIG=${SYSROOT}/usr/bin/llvm-config-host
-	EGL_PLATFORM="surfaceless"
-
-	if use cheets; then
-		#
-		# cheets-specific overrides
-		#
-
-		MESA_PLATFORM_SDK_VERSION=${ARC_PLATFORM_SDK_VERSION}
-
-		# Use llvm-config coming from ARC++ build.
-		export LLVM_CONFIG="${ARC_SYSROOT}/build/bin/llvm-config-host"
-
-		# FIXME(tfiga): Possibly use flag?
-		EGL_PLATFORM="android"
-
-		# The AOSP build system defines the Make variable
-		# PLATFORM_SDK_VERSION, and Mesa's Android.mk files use it to
-		# define the macro ANDROID_API_LEVEL. Arc emulates that here.
-		if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
-			CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
-		fi
-
-		#
-		# end of arc-mesa specific overrides
-		#
-	fi
-
-	if ! use llvm; then
-		export LLVM_CONFIG="no"
-	fi
-
-	arc-build-create-cross-file
-
-	emesonargs+=(
-		$(use cheets && echo "--prefix=${ARC_PREFIX}/vendor")
-		$(use cheets && echo "--sysconfdir=/system/vendor/etc")
-		$(use cheets && echo "-Ddri-search-path=/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri")
-		-Dgallium-va=false
-		-Dgallium-vdpau=false
-		-Dgallium-xvmc=false
-		-Dgallium-omx=disabled
-		-Dgallum-xa=false
-		-Dasm=false
-		-Dglx=disabled
-		-Ddri3=false
-		-Dgles-lib-suffix=_mesa
-		-Degl-lib-suffix=_mesa
-		$(meson_use llvm)
-		$(use egl && echo "-Dplatforms=${EGL_PLATFORM}")
-		$(meson_use egl)
-		$(meson_use gbm)
-		$(meson_use gles1)
-		$(meson_use gles2)
-		$(meson_use selinux)
-		$(meson_use shared-glapi)
-		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
-		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
-		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
-		--buildtype $(usex debug debug release)
-		$(use cheets && echo "--cross-file=${ARC_CROSS_FILE}")
-		$(use cheets && echo "-Dplatform-sdk-version=${ARC_PLATFORM_SDK_VERSION}")
-	)
-
-	meson_src_configure
-}
-
-# The meson eclass exports src_compile but not multilib_src_compile. src_compile
-# gets overridden by multilib-minimal
-multilib_src_compile() {
-	meson_src_compile
-}
-
-multilib_src_install_cheets() {
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
-	newexe ${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0 libglapi.so.0
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
-	newexe ${BUILD_DIR}/src/egl/libEGL_mesa.so libEGL_mesa.so
-	newexe ${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so libGLESv1_CM_mesa.so
-	newexe ${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so libGLESv2_mesa.so
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
-	if use classic && use video_cards_intel; then
-		newexe ${BUILD_DIR}/src/mesa/drivers/dri/libmesa_dri_drivers.so i965_dri.so
-	fi
-	if use gallium; then
-		if use video_cards_llvmpipe; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so kms_swrast_dri.so
-		fi
-		if use video_cards_amdgpu; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so radeonsi_dri.so
-		fi
-		if use video_cards_virgl; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so virtio_gpu_dri.so
-		fi
-	fi
-
-	if use vulkan; then
-		exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw"
-		if use video_cards_amdgpu; then
-			newexe ${BUILD_DIR}/src/amd/vulkan/libvulkan_radeon.so vulkan.cheets.so
-		fi
-		if use video_cards_intel; then
-			newexe ${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so vulkan.cheets.so
-		fi
-	fi
-}
-
-multilib_src_install() {
-	if use cheets; then
-		multilib_src_install_cheets
-		return
-	fi
-
-	meson_src_install
-
-	# Remove redundant headers
-	# GLU and GLUT
-	rm -f "${D}"/usr/include/GL/glu*.h || die "Removing GLU and GLUT headers failed."
-	# Glew includes
-	rm -f "${D}"/usr/include/GL/{glew,glxew,wglew}.h \
-		|| die "Removing glew includes failed."
-
-	# Move libGL and others from /usr/lib to /usr/lib/opengl/blah/lib
-	# because user can eselect desired GL provider.
-	ebegin "Moving libGL and friends for dynamic switching"
-		dodir /usr/$(get_libdir)/opengl/${OPENGL_DIR}/{lib,extensions,include}
-		local x
-		for x in "${D}"/usr/$(get_libdir)/libGL.{la,a,so*}; do
-			if [ -f ${x} -o -L ${x} ]; then
-				mv -f "${x}" "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/lib \
-					|| die "Failed to move ${x}"
-			fi
-		done
-		for x in "${D}"/usr/include/GL/{gl.h,glx.h,glext.h,glxext.h}; do
-			if [ -f ${x} -o -L ${x} ]; then
-				mv -f "${x}" "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/include \
-					|| die "Failed to move ${x}"
-			fi
-		done
-	eend $?
-
-	dodir /usr/$(get_libdir)/dri
-	insinto "/usr/$(get_libdir)/dri/"
-	insopts -m0755
-	# install the gallium drivers we use
-	local gallium_drivers_files=( i915_dri.so nouveau_dri.so r300_dri.so r600_dri.so msm_dri.so swrast_dri.so )
-	for x in ${gallium_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/gallium/${x}" ]; then
-			doins "${S}/$(get_libdir)/gallium/${x}"
-		fi
-	done
-
-	# install classic drivers we use
-	local classic_drivers_files=( i810_dri.so i965_dri.so nouveau_vieux_dri.so radeon_dri.so r200_dri.so )
-	for x in ${classic_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/${x}" ]; then
-			doins "${S}/$(get_libdir)/${x}"
-		fi
-	done
-}
-
-multilib_src_install_all_cheets() {
-	# For documentation on the feature set represented by each XML file
-	# installed into /vendor/etc/permissions, see
-	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
-	# For example XML files for each feature, see
-	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
-
-	# Install init files to advertise supported API versions.
-	insinto "${ARC_PREFIX}/vendor/etc/init"
-	if use android_gles32; then
-		doins "${FILESDIR}/gles32/init.gpu.rc"
-	elif use android_gles31; then
-		doins "${FILESDIR}/gles31/init.gpu.rc"
-	elif use android_gles30; then
-		doins "${FILESDIR}/gles30/init.gpu.rc"
-	elif use android_gles2; then
-		doins "${FILESDIR}/gles2/init.gpu.rc"
-	fi
-
-	# Install vulkan related files.
-	if use vulkan; then
-		einfo "Using android vulkan."
-		insinto "${ARC_PREFIX}/vendor/etc/init"
-		doins "${FILESDIR}/vulkan.rc"
-
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.vulkan.version-1_0_3.xml"
-		if use video_cards_intel; then
-			doins "${FILESDIR}/android.hardware.vulkan.level-1.xml"
-		else
-			doins "${FILESDIR}/android.hardware.vulkan.level-0.xml"
-		fi
-	fi
-
-	if use android_vulkan_compute_0; then
-		einfo "Using android vulkan_compute_0."
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.vulkan.compute-0.xml"
-	fi
-
-	# Install permission file to declare opengles aep support.
-	if use android_aep; then
-		einfo "Using android aep."
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.opengles.aep.xml"
-	fi
-
-	# Install the dri header for arc-cros-gralloc
-	insinto "${ARC_PREFIX}/vendor/include/"
-	doins -r "${S}/include/GL/"
-}
-
-multilib_src_install_all() {
-	if use cheets; then
-		multilib_src_install_all_cheets
-		return
-	fi
-}
-
-pkg_postinst() {
-	if use cheets; then
-		return
-	fi
-
-	# Switch to the xorg implementation.
-	echo
-	eselect opengl set --use-old ${OPENGL_DIR}
-}
-
-# $1 - VIDEO_CARDS flag
-# other args - names of DRI drivers to enable
-driver_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			DRI_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					DRI_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
-}
-
-gallium_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			GALLIUM_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					GALLIUM_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
-}
-
-vulkan_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			VULKAN_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					VULKAN_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
-}
diff --git a/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r22.ebuild b/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r22.ebuild
new file mode 100644
index 0000000..751c600
--- /dev/null
+++ b/media-libs/arc-mesa-amd/arc-mesa-amd-19.3.5-r22.ebuild
@@ -0,0 +1,224 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="b200b637f218841b45b15c52ed76f537b4fe5400"
+CROS_WORKON_TREE="cadd4bad01f90199f6d3f096b73343801c9d5680"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-amd"
+
+inherit base meson multilib-minimal flag-o-matic toolchain-funcs cros-workon arc-build
+
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+
+VIDEO_CARDS="intel amdgpu radeon freedreno llvmpipe"
+for card in ${VIDEO_CARDS}; do
+	IUSE_VIDEO_CARDS+=" video_cards_${card}"
+done
+
+IUSE="${IUSE_VIDEO_CARDS}
+	android-container-pi -android_vulkan_compute_0 cheets debug
+	vulkan cheets_user cheets_user_64"
+
+# Only allow one vulkan driver as they all write vulkan.cheets.so.
+REQUIRED_USE="
+	android_vulkan_compute_0? ( vulkan )
+	vulkan? ( || ( video_cards_amdgpu video_cards_intel ) )
+"
+
+DEPEND="
+		>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
+		sys-devel/arc-llvm:=[${MULTILIB_USEDEP}]
+		dev-libs/arc-libelf[${MULTILIB_USEDEP}]
+"
+
+RDEPEND="${DEPEND} !media-libs/arc-mesa"
+
+PATCHES=(
+	"${FILESDIR}"/CHROMIUM-radv-Remove-extensions-not-supported-in-P.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-extensions-not-supported-by-nd.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-1.1-on-ANDROID.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-ycbcr-support.patch
+)
+
+driver_list() {
+	local drivers="$(sort -u <<< "${1// /$'\n'}")"
+	echo "${drivers//$'\n'/,}"
+}
+
+src_configure() {
+	cros_optimize_package_for_speed
+	arc-build-select-clang
+	multilib-minimal_src_configure
+}
+
+multilib_src_configure() {
+	tc-getPROG PKG_CONFIG pkg-config
+
+	# Intel code
+	dri_driver_enable video_cards_intel i965
+
+	gallium_enable video_cards_llvmpipe swrast
+
+	# ATI code
+	gallium_enable video_cards_radeon r300 r600
+	gallium_enable video_cards_amdgpu radeonsi
+
+	# Freedreno code
+	gallium_enable video_cards_freedreno freedreno
+
+	if use vulkan; then
+		vulkan_enable video_cards_amdgpu amd
+		vulkan_enable video_cards_intel intel
+	fi
+
+	# Use llvm-config coming from ARC++ build.
+	export LLVM_CONFIG="${ARC_SYSROOT:?}/build/bin/llvm-config-host"
+
+	# The AOSP build system defines the Make variable
+	# PLATFORM_SDK_VERSION, and Mesa's Android.mk files use it to
+	# define the macro ANDROID_API_LEVEL. Arc emulates that here.
+	CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION:?}"
+
+	arc-build-create-cross-file
+
+	emesonargs+=(
+		--prefix="${ARC_PREFIX}/vendor"
+		--sysconfdir="/system/vendor/etc"
+		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
+		-Dgallium-va=false
+		-Dgallium-vdpau=false
+		-Dgallium-xvmc=false
+		-Dgallium-omx=disabled
+		-Dgallum-xa=false
+		-Dasm=false
+		-Dglx=disabled
+		-Ddri3=false
+		-Dgles-lib-suffix=_mesa
+		-Degl-lib-suffix=_mesa
+		-Dllvm=true
+		-Dplatforms=android
+		-Degl=true
+		-Dgbm=false
+		-Dgles1=true
+		-Dgles2=true
+		-Dshared-glapi=true
+		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
+		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
+		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
+		--buildtype $(usex debug debug release)
+		--cross-file="${ARC_CROSS_FILE}"
+		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION:?}"
+	)
+
+	meson_src_configure
+}
+
+# The meson eclass exports src_compile but not multilib_src_compile. src_compile
+# gets overridden by multilib-minimal
+multilib_src_compile() {
+	meson_src_compile
+}
+
+multilib_src_install() {
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
+	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
+	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
+	if use video_cards_intel; then
+		newexe "${BUILD_DIR}/src/mesa/drivers/dri/libmesa_dri_drivers.so" i965_dri.so
+	fi
+	if use video_cards_llvmpipe; then
+		newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" kms_swrast_dri.so
+	fi
+	if use video_cards_amdgpu; then
+		newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" radeonsi_dri.so
+	fi
+
+	if use vulkan; then
+		exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw"
+		if use video_cards_amdgpu; then
+			newexe "${BUILD_DIR}/src/amd/vulkan/libvulkan_radeon.so" vulkan.cheets.so
+		fi
+		if use video_cards_intel; then
+			newexe "${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so" vulkan.cheets.so
+		fi
+	fi
+}
+
+multilib_src_install_all() {
+	# For documentation on the feature set represented by each XML file
+	# installed into /vendor/etc/permissions, see
+	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
+	# For example XML files for each feature, see
+	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
+
+	# Install init files to advertise supported API versions.
+	insinto "${ARC_PREFIX}/vendor/etc/init"
+	doins "${FILESDIR}/init.gpu.rc"
+
+	# Install vulkan related files.
+	if use vulkan; then
+		einfo "Using android vulkan."
+		insinto "${ARC_PREFIX}/vendor/etc/init"
+		doins "${FILESDIR}/vulkan.rc"
+
+		insinto "${ARC_PREFIX}/vendor/etc/permissions"
+		doins "${FILESDIR}/android.hardware.vulkan.version-1_0_3.xml"
+		if use video_cards_intel; then
+			doins "${FILESDIR}/android.hardware.vulkan.level-1.xml"
+		else
+			doins "${FILESDIR}/android.hardware.vulkan.level-0.xml"
+		fi
+	fi
+
+	if use android_vulkan_compute_0; then
+		einfo "Using android vulkan_compute_0."
+		insinto "${ARC_PREFIX}/vendor/etc/permissions"
+		doins "${FILESDIR}/android.hardware.vulkan.compute-0.xml"
+	fi
+
+	# Install permission file to declare opengles aep support.
+	einfo "Using android aep."
+	insinto "${ARC_PREFIX}/vendor/etc/permissions"
+	doins "${FILESDIR}/android.hardware.opengles.aep.xml"
+
+	# Install the dri header for arc-cros-gralloc
+	insinto "${ARC_PREFIX}/vendor/include/"
+	doins -r "${S}/include/GL/"
+}
+
+# $1 - VIDEO_CARDS flag (check skipped for "--")
+# other args - names of DRI drivers to enable
+dri_driver_enable() {
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		DRI_DRIVERS+=("$@")
+	fi
+}
+
+gallium_enable() {
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		GALLIUM_DRIVERS+=("$@")
+	fi
+}
+
+vulkan_enable() {
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		VULKAN_DRIVERS+=("$@")
+	fi
+}
diff --git a/media-libs/arc-mesa-amd/arc-mesa-amd-9999.ebuild b/media-libs/arc-mesa-amd/arc-mesa-amd-9999.ebuild
index 3be79c4..ab04562 100644
--- a/media-libs/arc-mesa-amd/arc-mesa-amd-9999.ebuild
+++ b/media-libs/arc-mesa-amd/arc-mesa-amd-9999.ebuild
@@ -4,230 +4,93 @@
 
 EAPI="6"
 
-MESON_AUTO_DEPEND=no
-
 CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
 CROS_WORKON_LOCALNAME="mesa-amd"
 
 inherit base meson multilib-minimal flag-o-matic toolchain-funcs cros-workon arc-build
 
-OPENGL_DIR="xorg-x11"
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
 
-DESCRIPTION="OpenGL-like graphic library for Linux"
-HOMEPAGE="http://mesa3d.sourceforge.net/"
-
-# Most of the code is MIT/X11.
-# ralloc is LGPL-3
-# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
-LICENSE="MIT LGPL-3 SGI-B-2.0"
+LICENSE="MIT"
 SLOT="0"
 KEYWORDS="~*"
 
-INTEL_CARDS="intel"
-RADEON_CARDS="amdgpu radeon"
-VIDEO_CARDS="${INTEL_CARDS} ${RADEON_CARDS} llvmpipe mach64 mga nouveau powervr r128 savage sis vmware tdfx via freedreno virgl"
+VIDEO_CARDS="intel amdgpu radeon freedreno llvmpipe"
 for card in ${VIDEO_CARDS}; do
 	IUSE_VIDEO_CARDS+=" video_cards_${card}"
 done
 
 IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-pi -android_gles2
-	-android_gles30 -android_gles31 +android_gles32 -android_vulkan_compute_0
-	cheets +classic debug dri +egl +gallium
-	-gbm +gles1 +gles2 +llvm +nptl pic selinux +shared-glapi vulkan X xlib-glx
-	cheets_user cheets_user_64"
+	android-container-pi -android_vulkan_compute_0 cheets debug
+	vulkan cheets_user cheets_user_64"
 
-# llvmpipe requires ARC++ _userdebug images, ARC++ _user images can't use it
-# (b/33072485, b/28802929).
 # Only allow one vulkan driver as they all write vulkan.cheets.so.
 REQUIRED_USE="
-	^^ ( android_gles2 android_gles30 android_gles31 android_gles32 )
-	android_aep? ( !android_gles2 !android_gles30 )
 	android_vulkan_compute_0? ( vulkan )
-	cheets? (
-		vulkan? ( || ( video_cards_amdgpu video_cards_intel ) )
-		video_cards_amdgpu? ( llvm )
-		video_cards_llvmpipe? ( !cheets_user !cheets_user_64 )
-	)"
+	vulkan? ( || ( video_cards_amdgpu video_cards_intel ) )
+"
 
-DEPEND="cheets? (
+DEPEND="
 		>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
-		llvm? ( sys-devel/arc-llvm:=[${MULTILIB_USEDEP}] )
-		video_cards_amdgpu? (
-			dev-libs/arc-libelf[${MULTILIB_USEDEP}]
-		)
-	)"
+		sys-devel/arc-llvm:=[${MULTILIB_USEDEP}]
+		dev-libs/arc-libelf[${MULTILIB_USEDEP}]
+"
 
 RDEPEND="${DEPEND} !media-libs/arc-mesa"
 
-# It is slow without texrels, if someone wants slow
-# mesa without texrels +pic use is worth the shot
-QA_EXECSTACK="usr/lib*/opengl/xorg-x11/lib/libGL.so*"
-QA_WX_LOAD="usr/lib*/opengl/xorg-x11/lib/libGL.so*"
-
-# Think about: ggi, fbcon, no-X configs
+PATCHES=(
+	"${FILESDIR}"/CHROMIUM-radv-Remove-extensions-not-supported-in-P.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-extensions-not-supported-by-nd.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-1.1-on-ANDROID.patch
+	"${FILESDIR}"/CHROMIUM-radv-Disable-ycbcr-support.patch
+)
 
 driver_list() {
 	local drivers="$(sort -u <<< "${1// /$'\n'}")"
 	echo "${drivers//$'\n'/,}"
 }
 
-pkg_setup() {
-	# workaround toc-issue wrt #386545
-	use ppc64 && append-flags -mminimal-toc
-
-	# Remove symlinks created by an earlier version so we don't have
-	# install conflicts.
-	# TODO: Delete this after June 2019, since everybody should have
-	# upgraded by then.
-	local d
-	for d in EGL GL GLES GLES2 GLES3 KHR; do
-		local replaced_link="${ROOT}${ARC_PREFIX}/vendor/include/${d}"
-		if [[ -L "${replaced_link}" ]]; then
-			rm -f "${replaced_link}"
-		fi
-	done
-}
-
-src_prepare() {
-	# workaround for cros-workon not preserving git metadata
-	if [[ ${PV} == 9999* && "${CROS_WORKON_INPLACE}" != "1" ]]; then
-		echo "#define MESA_GIT_SHA1 \"git-deadbeef\"" > src/git_sha1.h
-	fi
-
-	# apply patches
-	if [[ ${PV} != 9999* && -n ${SRC_PATCHES} ]]; then
-		EPATCH_FORCE="yes" \
-		EPATCH_SOURCE="${WORKDIR}/patches" \
-		EPATCH_SUFFIX="patch" \
-		epatch
-	fi
-	# FreeBSD 6.* doesn't have posix_memalign().
-	if [[ ${CHOST} == *-freebsd6.* ]]; then
-		sed -i \
-			-e "s/-DHAVE_POSIX_MEMALIGN//" \
-			configure.ac || die
-	fi
-
-	# Restrict gles version based on USE flag. (See crbug.com/30202361, b/30202371, b/31041422, b:68023287)
-	if use android_gles32; then
-		einfo "Limiting android to gles32."
-		epatch "${FILESDIR}/gles32/0001-limit-gles-version.patch"
-	elif use android_gles31; then
-		einfo "Limiting android to gles31."
-		epatch "${FILESDIR}/gles31/0001-limit-gles-version.patch"
-	elif use android_gles30; then
-		einfo "Limiting android to gles30."
-		epatch "${FILESDIR}/gles30/0001-limit-gles-version.patch"
-	elif use android_gles2; then
-		einfo "Limiting android to gles2."
-		epatch "${FILESDIR}/gles2/0001-limit-gles-version.patch"
-	fi
-
-	epatch "${FILESDIR}"/CHROMIUM-radv-Remove-extensions-not-supported-in-P.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-extensions-not-supported-by-nd.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-1.1-on-ANDROID.patch
-	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-ycbcr-support.patch
-
-	default
-}
-
 src_configure() {
 	cros_optimize_package_for_speed
-
-	if use cheets; then
-		#
-		# cheets-specific overrides
-		#
-
-		arc-build-select-clang
-	fi
-
+	arc-build-select-clang
 	multilib-minimal_src_configure
 }
 
 multilib_src_configure() {
 	tc-getPROG PKG_CONFIG pkg-config
 
-	if use !gallium && use !classic; then
-		ewarn "You enabled neither classic nor gallium USE flags. No hardware"
-		ewarn "drivers will be built."
-	fi
+	# Intel code
+	dri_driver_enable video_cards_intel i965
 
-	if use classic; then
-	# Configurable DRI drivers
-		driver_enable swrast
+	gallium_enable video_cards_llvmpipe swrast
 
-		# Intel code
-		driver_enable video_cards_intel i965
+	# ATI code
+	gallium_enable video_cards_radeon r300 r600
+	gallium_enable video_cards_amdgpu radeonsi
 
-		# Nouveau code
-		driver_enable video_cards_nouveau nouveau
-
-		# ATI code
-		driver_enable video_cards_radeon r100 r200
-	fi
-
-	if use gallium; then
-	# Configurable gallium drivers
-		gallium_enable video_cards_llvmpipe swrast
-
-		# Nouveau code
-		gallium_enable video_cards_nouveau nouveau
-
-		# ATI code
-		gallium_enable video_cards_radeon r300 r600
-		gallium_enable video_cards_amdgpu radeonsi
-
-		# Freedreno code
-		gallium_enable video_cards_freedreno freedreno
-
-		gallium_enable video_cards_virgl virgl
-	fi
+	# Freedreno code
+	gallium_enable video_cards_freedreno freedreno
 
 	if use vulkan; then
 		vulkan_enable video_cards_amdgpu amd
 		vulkan_enable video_cards_intel intel
 	fi
 
-	export LLVM_CONFIG=${SYSROOT}/usr/bin/llvm-config-host
-	EGL_PLATFORM="surfaceless"
+	# Use llvm-config coming from ARC++ build.
+	export LLVM_CONFIG="${ARC_SYSROOT:?}/build/bin/llvm-config-host"
 
-	if use cheets; then
-		#
-		# cheets-specific overrides
-		#
-
-		MESA_PLATFORM_SDK_VERSION=${ARC_PLATFORM_SDK_VERSION}
-
-		# Use llvm-config coming from ARC++ build.
-		export LLVM_CONFIG="${ARC_SYSROOT}/build/bin/llvm-config-host"
-
-		# FIXME(tfiga): Possibly use flag?
-		EGL_PLATFORM="android"
-
-		# The AOSP build system defines the Make variable
-		# PLATFORM_SDK_VERSION, and Mesa's Android.mk files use it to
-		# define the macro ANDROID_API_LEVEL. Arc emulates that here.
-		if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
-			CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
-		fi
-
-		#
-		# end of arc-mesa specific overrides
-		#
-	fi
-
-	if ! use llvm; then
-		export LLVM_CONFIG="no"
-	fi
+	# The AOSP build system defines the Make variable
+	# PLATFORM_SDK_VERSION, and Mesa's Android.mk files use it to
+	# define the macro ANDROID_API_LEVEL. Arc emulates that here.
+	CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION:?}"
 
 	arc-build-create-cross-file
 
 	emesonargs+=(
-		$(use cheets && echo "--prefix=${ARC_PREFIX}/vendor")
-		$(use cheets && echo "--sysconfdir=/system/vendor/etc")
-		$(use cheets && echo "-Ddri-search-path=/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri")
+		--prefix="${ARC_PREFIX}/vendor"
+		--sysconfdir="/system/vendor/etc"
+		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
 		-Dgallium-va=false
 		-Dgallium-vdpau=false
 		-Dgallium-xvmc=false
@@ -238,20 +101,19 @@
 		-Ddri3=false
 		-Dgles-lib-suffix=_mesa
 		-Degl-lib-suffix=_mesa
-		$(meson_use llvm)
-		$(use egl && echo "-Dplatforms=${EGL_PLATFORM}")
-		$(meson_use egl)
-		$(meson_use gbm)
-		$(meson_use gles1)
-		$(meson_use gles2)
-		$(meson_use selinux)
-		$(meson_use shared-glapi)
+		-Dllvm=true
+		-Dplatforms=android
+		-Degl=true
+		-Dgbm=false
+		-Dgles1=true
+		-Dgles2=true
+		-Dshared-glapi=true
 		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
 		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
 		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
 		--buildtype $(usex debug debug release)
-		$(use cheets && echo "--cross-file=${ARC_CROSS_FILE}")
-		$(use cheets && echo "-Dplatform-sdk-version=${ARC_PLATFORM_SDK_VERSION}")
+		--cross-file="${ARC_CROSS_FILE}"
+		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION:?}"
 	)
 
 	meson_src_configure
@@ -263,97 +125,38 @@
 	meson_src_compile
 }
 
-multilib_src_install_cheets() {
+multilib_src_install() {
 	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
-	newexe ${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0 libglapi.so.0
+	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
 
 	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
-	newexe ${BUILD_DIR}/src/egl/libEGL_mesa.so libEGL_mesa.so
-	newexe ${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so libGLESv1_CM_mesa.so
-	newexe ${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so libGLESv2_mesa.so
+	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
 
 	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
-	if use classic && use video_cards_intel; then
-		newexe ${BUILD_DIR}/src/mesa/drivers/dri/libmesa_dri_drivers.so i965_dri.so
+	if use video_cards_intel; then
+		newexe "${BUILD_DIR}/src/mesa/drivers/dri/libmesa_dri_drivers.so" i965_dri.so
 	fi
-	if use gallium; then
-		if use video_cards_llvmpipe; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so kms_swrast_dri.so
-		fi
-		if use video_cards_amdgpu; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so radeonsi_dri.so
-		fi
-		if use video_cards_virgl; then
-			newexe ${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so virtio_gpu_dri.so
-		fi
+	if use video_cards_llvmpipe; then
+		newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" kms_swrast_dri.so
+	fi
+	if use video_cards_amdgpu; then
+		newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" radeonsi_dri.so
 	fi
 
 	if use vulkan; then
 		exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw"
 		if use video_cards_amdgpu; then
-			newexe ${BUILD_DIR}/src/amd/vulkan/libvulkan_radeon.so vulkan.cheets.so
+			newexe "${BUILD_DIR}/src/amd/vulkan/libvulkan_radeon.so" vulkan.cheets.so
 		fi
 		if use video_cards_intel; then
-			newexe ${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so vulkan.cheets.so
+			newexe "${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so" vulkan.cheets.so
 		fi
 	fi
 }
 
-multilib_src_install() {
-	if use cheets; then
-		multilib_src_install_cheets
-		return
-	fi
-
-	meson_src_install
-
-	# Remove redundant headers
-	# GLU and GLUT
-	rm -f "${D}"/usr/include/GL/glu*.h || die "Removing GLU and GLUT headers failed."
-	# Glew includes
-	rm -f "${D}"/usr/include/GL/{glew,glxew,wglew}.h \
-		|| die "Removing glew includes failed."
-
-	# Move libGL and others from /usr/lib to /usr/lib/opengl/blah/lib
-	# because user can eselect desired GL provider.
-	ebegin "Moving libGL and friends for dynamic switching"
-		dodir /usr/$(get_libdir)/opengl/${OPENGL_DIR}/{lib,extensions,include}
-		local x
-		for x in "${D}"/usr/$(get_libdir)/libGL.{la,a,so*}; do
-			if [ -f ${x} -o -L ${x} ]; then
-				mv -f "${x}" "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/lib \
-					|| die "Failed to move ${x}"
-			fi
-		done
-		for x in "${D}"/usr/include/GL/{gl.h,glx.h,glext.h,glxext.h}; do
-			if [ -f ${x} -o -L ${x} ]; then
-				mv -f "${x}" "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/include \
-					|| die "Failed to move ${x}"
-			fi
-		done
-	eend $?
-
-	dodir /usr/$(get_libdir)/dri
-	insinto "/usr/$(get_libdir)/dri/"
-	insopts -m0755
-	# install the gallium drivers we use
-	local gallium_drivers_files=( i915_dri.so nouveau_dri.so r300_dri.so r600_dri.so msm_dri.so swrast_dri.so )
-	for x in ${gallium_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/gallium/${x}" ]; then
-			doins "${S}/$(get_libdir)/gallium/${x}"
-		fi
-	done
-
-	# install classic drivers we use
-	local classic_drivers_files=( i810_dri.so i965_dri.so nouveau_vieux_dri.so radeon_dri.so r200_dri.so )
-	for x in ${classic_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/${x}" ]; then
-			doins "${S}/$(get_libdir)/${x}"
-		fi
-	done
-}
-
-multilib_src_install_all_cheets() {
+multilib_src_install_all() {
 	# For documentation on the feature set represented by each XML file
 	# installed into /vendor/etc/permissions, see
 	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
@@ -362,15 +165,7 @@
 
 	# Install init files to advertise supported API versions.
 	insinto "${ARC_PREFIX}/vendor/etc/init"
-	if use android_gles32; then
-		doins "${FILESDIR}/gles32/init.gpu.rc"
-	elif use android_gles31; then
-		doins "${FILESDIR}/gles31/init.gpu.rc"
-	elif use android_gles30; then
-		doins "${FILESDIR}/gles30/init.gpu.rc"
-	elif use android_gles2; then
-		doins "${FILESDIR}/gles2/init.gpu.rc"
-	fi
+	doins "${FILESDIR}/init.gpu.rc"
 
 	# Install vulkan related files.
 	if use vulkan; then
@@ -394,83 +189,34 @@
 	fi
 
 	# Install permission file to declare opengles aep support.
-	if use android_aep; then
-		einfo "Using android aep."
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.opengles.aep.xml"
-	fi
+	einfo "Using android aep."
+	insinto "${ARC_PREFIX}/vendor/etc/permissions"
+	doins "${FILESDIR}/android.hardware.opengles.aep.xml"
 
 	# Install the dri header for arc-cros-gralloc
 	insinto "${ARC_PREFIX}/vendor/include/"
 	doins -r "${S}/include/GL/"
 }
 
-multilib_src_install_all() {
-	if use cheets; then
-		multilib_src_install_all_cheets
-		return
-	fi
-}
-
-pkg_postinst() {
-	if use cheets; then
-		return
-	fi
-
-	# Switch to the xorg implementation.
-	echo
-	eselect opengl set --use-old ${OPENGL_DIR}
-}
-
-# $1 - VIDEO_CARDS flag
+# $1 - VIDEO_CARDS flag (check skipped for "--")
 # other args - names of DRI drivers to enable
-driver_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			DRI_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					DRI_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
+dri_driver_enable() {
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		DRI_DRIVERS+=("$@")
+	fi
 }
 
 gallium_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			GALLIUM_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					GALLIUM_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		GALLIUM_DRIVERS+=("$@")
+	fi
 }
 
 vulkan_enable() {
-	case $# in
-		# for enabling unconditionally
-		1)
-			VULKAN_DRIVERS+=",$1"
-			;;
-		*)
-			if use $1; then
-				shift
-				for i in $@; do
-					VULKAN_DRIVERS+=",${i}"
-				done
-			fi
-			;;
-	esac
+	if [[ $1 == -- ]] || use "$1"; then
+		shift
+		VULKAN_DRIVERS+=("$@")
+	fi
 }
diff --git a/media-libs/arc-mesa-amd/files/gles2/0001-limit-gles-version.patch b/media-libs/arc-mesa-amd/files/gles2/0001-limit-gles-version.patch
deleted file mode 100644
index 852ffe7..0000000
--- a/media-libs/arc-mesa-amd/files/gles2/0001-limit-gles-version.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-commit 37a49f3ae3bdfb2942b7145457fb456745b18bc5
-Author: Po-Hsien Wang <pwang@chromium.org>
-Date:   Wed Nov 1 17:19:26 2017 -0700
-
-    arc-mesa: Disable support for GLES > 2.0
-    
-    Disable support for GLES > 2.0
-    
-    Change-Id: I428a56e08b473a106093b71e01094f3db6875cfb
-
-diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
-index 1a8e9bda1a..d134f72348 100644
---- a/src/egl/main/eglcontext.c
-+++ b/src/egl/main/eglcontext.c
-@@ -467,12 +467,7 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
-             err = EGL_BAD_MATCH;
-          break;
- 
--      case 3:
--         /* Don't put additional version checks here.  We don't know that
--          * there won't be versions > 3.0.
--          */
--         break;
--
-+         // Hack: Disallow creation contexts newer than 2.0.
-       default:
-          err = EGL_BAD_MATCH;
-          break;
-diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
-index 34f8bbbcb1..f7d95b2d45 100644
---- a/src/mesa/main/version.c
-+++ b/src/mesa/main/version.c
-@@ -593,6 +593,9 @@ _mesa_compute_version(struct gl_context *ctx)
-       return;
- 
-    ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
-+   // HACK: Downgrade GLES2 version to 2.0.
-+   if (ctx->API == API_OPENGLES2 && ctx->Version > 20)
-+       ctx->Version = 20;
-    ctx->Extensions.Version = ctx->Version;
- 
-    /* Make sure that the GLSL version lines up with the GL version. In some
diff --git a/media-libs/arc-mesa-amd/files/gles2/init.gpu.rc b/media-libs/arc-mesa-amd/files/gles2/init.gpu.rc
deleted file mode 100644
index 673329f..0000000
--- a/media-libs/arc-mesa-amd/files/gles2/init.gpu.rc
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-on early-init
-    # Advertise opengles version 2.0.
-    setprop ro.opengles.version 131072
-    setprop ro.hardware.egl mesa
diff --git a/media-libs/arc-mesa-amd/files/gles30/0001-limit-gles-version.patch b/media-libs/arc-mesa-amd/files/gles30/0001-limit-gles-version.patch
deleted file mode 100644
index 913265a..0000000
--- a/media-libs/arc-mesa-amd/files/gles30/0001-limit-gles-version.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-commit 740eb587b8d13392132f7f33dc62695cf42bbd1d
-Author: Po-Hsien Wang <pwang@chromium.org>
-Date:   Tue Oct 31 21:02:59 2017 -0700
-
-    arc-mesa: Disable support for GLES > 3.0
-    
-    Disable support for GLES version > 3.0
-    
-    Change-Id: I3e846be10a1b81b2b4bc89b82d1cbeff1c4fbbb0
-
-diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
-index 1a8e9bda1a..09a150df4a 100644
---- a/src/egl/main/eglcontext.c
-+++ b/src/egl/main/eglcontext.c
-@@ -468,6 +468,9 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
-          break;
- 
-       case 3:
-+         // HACK: Disallow creating contexts newer than 3.0.
-+         if (ctx->ClientMinorVersion > 0)
-+            err = EGL_BAD_MATCH;
-          /* Don't put additional version checks here.  We don't know that
-           * there won't be versions > 3.0.
-           */
-diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
-index 34f8bbbcb1..c6841d5300 100644
---- a/src/mesa/main/version.c
-+++ b/src/mesa/main/version.c
-@@ -593,6 +593,9 @@ _mesa_compute_version(struct gl_context *ctx)
-       return;
- 
-    ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
-+   // HACK: Downgrade GLES2 version to 3.0
-+   if (ctx->API == API_OPENGLES2 && ctx->Version > 30)
-+      ctx->Version = 30;
-    ctx->Extensions.Version = ctx->Version;
- 
-    /* Make sure that the GLSL version lines up with the GL version. In some
diff --git a/media-libs/arc-mesa-amd/files/gles30/init.gpu.rc b/media-libs/arc-mesa-amd/files/gles30/init.gpu.rc
deleted file mode 100644
index 0dce6dd..0000000
--- a/media-libs/arc-mesa-amd/files/gles30/init.gpu.rc
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-on early-init
-    # Advertise opengles version 3.0.
-    setprop ro.opengles.version 196608
-    setprop ro.hardware.egl mesa
diff --git a/media-libs/arc-mesa-amd/files/gles31/0001-limit-gles-version.patch b/media-libs/arc-mesa-amd/files/gles31/0001-limit-gles-version.patch
deleted file mode 100644
index 8b5d14f..0000000
--- a/media-libs/arc-mesa-amd/files/gles31/0001-limit-gles-version.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-commit dfd09dd9a10caa035a906fda0b3b3872171544bf
-Author: Po-Hsien Wang <pwang@chromium.org>
-Date:   Tue Oct 31 21:06:51 2017 -0700
-
-    arc-mesa: Disable suuport for GLES > 3.1
-    
-    Disable support for GLES version > 3.1
-    
-    Change-Id: If911f071e193e52e88d288805d0dd94a8e0e1e2f
-
-diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
-index 1a8e9bda1a..88dee6c3e7 100644
---- a/src/egl/main/eglcontext.c
-+++ b/src/egl/main/eglcontext.c
-@@ -468,6 +468,9 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
-          break;
- 
-       case 3:
-+         // HACK: Disallow creating contexts newer than 3.1.
-+         if (ctx->ClientMinorVersion > 1)
-+            err = EGL_BAD_MATCH;
-          /* Don't put additional version checks here.  We don't know that
-           * there won't be versions > 3.0.
-           */
-diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
-index 34f8bbbcb1..9409cb8a22 100644
---- a/src/mesa/main/version.c
-+++ b/src/mesa/main/version.c
-@@ -593,6 +593,9 @@ _mesa_compute_version(struct gl_context *ctx)
-       return;
- 
-    ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
-+   // HACK: Downgrade GLES2 version to 3.1.
-+   if (ctx->API == API_OPENGLES2 && ctx->Version > 31)
-+      ctx->Version = 31;
-    ctx->Extensions.Version = ctx->Version;
- 
-    /* Make sure that the GLSL version lines up with the GL version. In some
diff --git a/media-libs/arc-mesa-amd/files/gles31/init.gpu.rc b/media-libs/arc-mesa-amd/files/gles31/init.gpu.rc
deleted file mode 100644
index 80952f5..0000000
--- a/media-libs/arc-mesa-amd/files/gles31/init.gpu.rc
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-on early-init
-    # Advertise opengles version 3.1.
-    setprop ro.opengles.version 196609
-    setprop ro.hardware.egl mesa
diff --git a/media-libs/arc-mesa-amd/files/gles32/0001-limit-gles-version.patch b/media-libs/arc-mesa-amd/files/gles32/0001-limit-gles-version.patch
deleted file mode 100644
index a025343..0000000
--- a/media-libs/arc-mesa-amd/files/gles32/0001-limit-gles-version.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-commit a6eb0ef950d399d5e2c75386a00aaa7d7faea45f
-Author: Po-Hsien Wang <pwang@chromium.org>
-Date:   Tue Oct 31 21:10:01 2017 -0700
-
-    arc-mesa: Disable support for GLES > 3.2
-    
-    Disable support for GLES version > 3.2
-    
-    Change-Id: Ifd4515d69638b15b48aafad410eb42c7df7d37de
-
-diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
-index 1a8e9bda1a..874e424eda 100644
---- a/src/egl/main/eglcontext.c
-+++ b/src/egl/main/eglcontext.c
-@@ -468,6 +468,10 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
-          break;
- 
-       case 3:
-+         // HACK: Disallow creating contexts newer than 3.2
-+         if (ctx->ClientMinorVersion > 2)
-+            err = EGL_BAD_MATCH;
-+
-          /* Don't put additional version checks here.  We don't know that
-           * there won't be versions > 3.0.
-           */
-diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
-index 34f8bbbcb1..f0330f1409 100644
---- a/src/mesa/main/version.c
-+++ b/src/mesa/main/version.c
-@@ -593,6 +593,9 @@ _mesa_compute_version(struct gl_context *ctx)
-       return;
- 
-    ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
-+   // HACK: Downgrade GLES2 version to 3.2
-+   if (ctx->API == API_OPENGLES2 && ctx->Version > 32)
-+      ctx->Version = 32;
-    ctx->Extensions.Version = ctx->Version;
- 
-    /* Make sure that the GLSL version lines up with the GL version. In some
diff --git a/media-libs/arc-mesa-amd/files/gles32/init.gpu.rc b/media-libs/arc-mesa-amd/files/init.gpu.rc
similarity index 100%
rename from media-libs/arc-mesa-amd/files/gles32/init.gpu.rc
rename to media-libs/arc-mesa-amd/files/init.gpu.rc
diff --git a/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.2.0_pre-r35.ebuild b/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.2.0_pre-r35.ebuild
deleted file mode 100644
index 2a84273..0000000
--- a/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.2.0_pre-r35.ebuild
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=6
-
-CROS_WORKON_COMMIT="254d32609070c25a67e354fcbdcf67074a8743b6"
-CROS_WORKON_TREE="8bb43c3865c00e0b9d17c8d2bebf941a4b570d26"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-freedreno"
-
-inherit base meson multilib-minimal flag-o-matic toolchain-funcs cros-workon arc-build
-
-DESCRIPTION="OpenGL-like graphic library for Linux"
-HOMEPAGE="http://mesa3d.sourceforge.net/"
-
-KEYWORDS="*"
-
-# Most files are MIT/X11.
-# Some files in src/glx are SGI-B-2.0.
-LICENSE="MIT SGI-B-2.0"
-SLOT="0"
-
-IUSE="
-	cheets
-	cheets_user
-	cheets_user_64
-	debug
-	-vulkan
-"
-
-REQUIRED_USE="
-	cheets
-"
-
-DEPEND="
-	>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
-	dev-libs/arc-libelf[${MULTILIB_USEDEP}]
-"
-
-RDEPEND="${DEPEND}"
-
-pkg_pretend() {
-	if use vulkan; then
-		die "${PN} does not yet support vulkan"
-	fi
-}
-
-src_configure() {
-	arc-build-select-clang
-
-	multilib-minimal_src_configure
-}
-
-multilib_src_configure() {
-	# The AOSP build system defines the Make variable PLATFORM_SDK_VERSION,
-	# and Mesa's Android.mk files use it to define the macro
-	# ANDROID_API_LEVEL. Arc emulates that here.
-	if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
-		CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
-	fi
-
-	tc-getPROG PKG_CONFIG pkg-config
-
-	# Need std=gnu++11 to build with libc++. crbug.com/750831
-	append-cxxflags "-std=gnu++11"
-
-	emesonargs+=(
-		--prefix="${ARC_PREFIX}/vendor"
-		--sysconfdir="/system/vendor/etc"
-		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=true
-		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=true
-		-Dgles2=true
-		-Dshared-glapi=true
-		-Ddri-drivers=
-		-Dgallium-drivers=freedreno
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
-		-Dplatforms=android
-		-Degl-lib-suffix=_mesa
-		-Dgles-lib-suffix=_mesa
-		--buildtype $(usex debug debug release)
-		-Dvulkan-drivers=$(usex vulkan freedreno '')
-	)
-
-	meson_src_configure
-}
-
-# The meson eclass exports src_compile but not multilib_src_compile. src_compile
-# gets overridden by multilib-minimal
-multilib_src_compile() {
-	meson_src_compile
-}
-
-multilib_src_install() {
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
-	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
-	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
-	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
-	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
-	newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" msm_dri.so
-}
-
-multilib_src_install_all() {
-	# For documentation on the feature set represented by each XML file
-	# installed into /vendor/etc/permissions, see
-	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
-	# For example XML files for each feature, see
-	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
-
-	# Install init files to advertise supported API versions.
-	insinto "${ARC_PREFIX}/vendor/etc/init"
-	doins "${FILESDIR}/gles31.rc"
-
-	# Install the dri header for arc-cros-gralloc
-	insinto "${ARC_PREFIX}/vendor/include/GL"
-	doins -r "${S}/include/GL/internal"
-}
diff --git a/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.3.0_pre-r42.ebuild b/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.3.0_pre-r42.ebuild
new file mode 100644
index 0000000..9ac7a05
--- /dev/null
+++ b/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-20.3.0_pre-r42.ebuild
@@ -0,0 +1,119 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=6
+
+CROS_WORKON_COMMIT="772f8052b3f83c30476a7e4211a0ec29c4a2e8c7"
+CROS_WORKON_TREE="709132dcdf35676fc5ef0aa29e20d043aa4a5dd6"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-freedreno"
+
+inherit base meson multilib-minimal flag-o-matic toolchain-funcs cros-workon arc-build
+
+DESCRIPTION="OpenGL-like graphic library for Linux"
+HOMEPAGE="http://mesa3d.sourceforge.net/"
+
+KEYWORDS="*"
+
+# Most files are MIT/X11.
+# Some files in src/glx are SGI-B-2.0.
+LICENSE="MIT SGI-B-2.0"
+SLOT="0"
+
+IUSE="
+	cheets
+	cheets_user
+	cheets_user_64
+	debug
+	-vulkan
+"
+
+REQUIRED_USE="
+	cheets
+"
+
+DEPEND="
+	>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
+	dev-libs/arc-libelf[${MULTILIB_USEDEP}]
+"
+
+RDEPEND="${DEPEND}"
+
+pkg_pretend() {
+	if use vulkan; then
+		die "${PN} does not yet support vulkan"
+	fi
+}
+
+src_configure() {
+	arc-build-select-clang
+
+	multilib-minimal_src_configure
+}
+
+multilib_src_configure() {
+	tc-getPROG PKG_CONFIG pkg-config
+
+	emesonargs+=(
+		--prefix="${ARC_PREFIX}/vendor"
+		--sysconfdir="/system/vendor/etc"
+		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
+		-Dllvm=disabled
+		-Ddri3=disabled
+		-Dshader-cache=enabled
+		-Dglx=disabled
+		-Degl=enabled
+		-Dgbm=disabled
+		-Dgles1=enabled
+		-Dgles2=enabled
+		-Dshared-glapi=enabled
+		-Ddri-drivers=
+		-Dgallium-drivers=freedreno
+		-Dgallium-vdpau=disabled
+		-Dgallium-xa=disabled
+		-Dplatforms=android
+		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION}"
+		-Degl-lib-suffix=_mesa
+		-Dgles-lib-suffix=_mesa
+		--buildtype $(usex debug debug release)
+		-Dvulkan-drivers=$(usex vulkan freedreno '')
+	)
+
+	meson_src_configure
+}
+
+# The meson eclass exports src_compile but not multilib_src_compile. src_compile
+# gets overridden by multilib-minimal
+multilib_src_compile() {
+	meson_src_compile
+}
+
+multilib_src_install() {
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
+	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
+	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
+	newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" msm_dri.so
+}
+
+multilib_src_install_all() {
+	# For documentation on the feature set represented by each XML file
+	# installed into /vendor/etc/permissions, see
+	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
+	# For example XML files for each feature, see
+	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
+
+	# Install init files to advertise supported API versions.
+	insinto "${ARC_PREFIX}/vendor/etc/init"
+	doins "${FILESDIR}/gles31.rc"
+
+	# Install the dri header for arc-cros-gralloc
+	insinto "${ARC_PREFIX}/vendor/include/GL"
+	doins -r "${S}/include/GL/internal"
+}
diff --git a/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-9999.ebuild b/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-9999.ebuild
index 572743a..cfe9fa9 100644
--- a/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-9999.ebuild
+++ b/media-libs/arc-mesa-freedreno/arc-mesa-freedreno-9999.ebuild
@@ -51,36 +51,27 @@
 }
 
 multilib_src_configure() {
-	# The AOSP build system defines the Make variable PLATFORM_SDK_VERSION,
-	# and Mesa's Android.mk files use it to define the macro
-	# ANDROID_API_LEVEL. Arc emulates that here.
-	if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
-		CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
-	fi
-
 	tc-getPROG PKG_CONFIG pkg-config
 
-	# Need std=gnu++11 to build with libc++. crbug.com/750831
-	append-cxxflags "-std=gnu++11"
-
 	emesonargs+=(
 		--prefix="${ARC_PREFIX}/vendor"
 		--sysconfdir="/system/vendor/etc"
 		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=true
+		-Dllvm=disabled
+		-Ddri3=disabled
+		-Dshader-cache=enabled
 		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=true
-		-Dgles2=true
-		-Dshared-glapi=true
+		-Degl=enabled
+		-Dgbm=disabled
+		-Dgles1=enabled
+		-Dgles2=enabled
+		-Dshared-glapi=enabled
 		-Ddri-drivers=
 		-Dgallium-drivers=freedreno
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
+		-Dgallium-vdpau=disabled
+		-Dgallium-xa=disabled
 		-Dplatforms=android
+		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION}"
 		-Degl-lib-suffix=_mesa
 		-Dgles-lib-suffix=_mesa
 		--buildtype $(usex debug debug release)
diff --git a/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1-r5.ebuild b/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1-r6.ebuild
similarity index 100%
rename from media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1-r5.ebuild
rename to media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1-r6.ebuild
diff --git a/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1.ebuild b/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1.ebuild
index 66ad57a..2af485a 100644
--- a/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1.ebuild
+++ b/media-libs/arc-mesa-img/arc-mesa-img-19.0_pre1.ebuild
@@ -34,7 +34,7 @@
 done
 
 IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-nyc -android_gles2 -android_gles30
+	android_aep -android_gles2 -android_gles30
 	+android_gles31 -android_gles32 -android_vulkan_compute_0
 	cheets +classic debug dri egl -gallium
 	-gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx
@@ -164,11 +164,6 @@
 	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-VK_KHR_create_renderpass2.patch
 	epatch "${FILESDIR}"/CHROMIUM-anv-Clamp-apiVersion-to-1.0.3-on-Android-Oreo.patch
 
-	if use android-container-nyc; then
-		epatch "${FILESDIR}"/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
-		epatch "${FILESDIR}"/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
-	fi
-
 	# IMG patches
 	epatch "${FILESDIR}"/0001-dri-pvr-Introduce-PowerVR-DRI-driver.patch
 	epatch "${FILESDIR}"/0003-dri-Add-some-new-DRI-formats-and-fourccs.patch
diff --git a/media-libs/arc-mesa-img/arc-mesa-img-9999.ebuild b/media-libs/arc-mesa-img/arc-mesa-img-9999.ebuild
index 7f7f066..2fd8c87 100644
--- a/media-libs/arc-mesa-img/arc-mesa-img-9999.ebuild
+++ b/media-libs/arc-mesa-img/arc-mesa-img-9999.ebuild
@@ -34,7 +34,7 @@
 done
 
 IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-nyc -android_gles2 -android_gles30
+	android_aep -android_gles2 -android_gles30
 	+android_gles31 -android_gles32 -android_vulkan_compute_0
 	cheets +classic debug dri egl -gallium
 	-gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx
@@ -164,11 +164,6 @@
 	epatch "${FILESDIR}"/CHROMIUM-radv-Disable-VK_KHR_create_renderpass2.patch
 	epatch "${FILESDIR}"/CHROMIUM-anv-Clamp-apiVersion-to-1.0.3-on-Android-Oreo.patch
 
-	if use android-container-nyc; then
-		epatch "${FILESDIR}"/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
-		epatch "${FILESDIR}"/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
-	fi
-
 	#
 	# No IMG patches in the *-9999.ebuild as pvr dri isn't upstream
 	#
diff --git a/media-libs/arc-mesa-img/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch b/media-libs/arc-mesa-img/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
deleted file mode 100644
index 6996b29..0000000
--- a/media-libs/arc-mesa-img/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From fab8ab0b272d728a1bb7c57e9f065c4bce41e8f7 Mon Sep 17 00:00:00 2001
-From: Gurchetan Singh <gurchetansingh@chromium.org>
-Date: Mon, 15 Apr 2019 09:57:08 -0700
-Subject: [PATCH 20/20] Revert "anv: Use absolute timeouts in
- wait_for_bo_fences"
-
-This fixes dEQP-VK.synchronization.events on Nami.  Note
-this test was removed from dEQP a while ago, and this
-revert is needed to satisfy N CTS.
-
-However, it's interesting to note the test still passes on
-a v4.13 Intel setup, while it fails on Nami/Fizz (v4.4 devices).
-Could be a real bug, but it's pretty easy to revert either
-way.
-
-BUG=b:130195490
-TEST=./deqp-vk --deqp-case=dEQP-VK.synchronization.events passes on Nami
-
-This reverts commit 1bd4f8fefc2728963fc37900fe75210ee24e09d1.
----
- src/intel/vulkan/anv_queue.c | 72 +++++++++++++++++++++---------------
- 1 file changed, 42 insertions(+), 30 deletions(-)
-
-diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
-index 55465c5ebe2b..30dccf4d4538 100644
---- a/src/intel/vulkan/anv_queue.c
-+++ b/src/intel/vulkan/anv_queue.c
-@@ -473,24 +473,9 @@ static int64_t anv_get_relative_timeout(uint64_t abs_timeout)
- {
-    uint64_t now = gettime_ns();
- 
--   /* We don't want negative timeouts.
--    *
--    * DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is
--    * supposed to block indefinitely timeouts < 0.  Unfortunately,
--    * this was broken for a couple of kernel releases.  Since there's
--    * no way to know whether or not the kernel we're using is one of
--    * the broken ones, the best we can do is to clamp the timeout to
--    * INT64_MAX.  This limits the maximum timeout from 584 years to
--    * 292 years - likely not a big deal.
--    */
-    if (abs_timeout < now)
-       return 0;
--
--   uint64_t rel_timeout = abs_timeout - now;
--   if (rel_timeout > (uint64_t) INT64_MAX)
--      rel_timeout = INT64_MAX;
--
--   return rel_timeout;
-+   return abs_timeout - now;
- }
- 
- static VkResult
-@@ -547,8 +532,17 @@ anv_wait_for_bo_fences(struct anv_device *device,
-                        uint32_t fenceCount,
-                        const VkFence *pFences,
-                        bool waitAll,
--                       uint64_t abs_timeout_ns)
-+                       uint64_t _timeout)
- {
-+   /* DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is supposed
-+    * to block indefinitely timeouts <= 0.  Unfortunately, this was broken
-+    * for a couple of kernel releases.  Since there's no way to know
-+    * whether or not the kernel we're using is one of the broken ones, the
-+    * best we can do is to clamp the timeout to INT64_MAX.  This limits the
-+    * maximum timeout from 584 years to 292 years - likely not a big deal.
-+    */
-+   int64_t timeout = MIN2(_timeout, (uint64_t) INT64_MAX);
-+
-    VkResult result = VK_SUCCESS;
-    uint32_t pending_fences = fenceCount;
-    while (pending_fences) {
-@@ -589,8 +583,7 @@ anv_wait_for_bo_fences(struct anv_device *device,
-             /* These are the fences we really care about.  Go ahead and wait
-              * on it until we hit a timeout.
-              */
--            result = anv_device_wait(device, &impl->bo.bo,
--                                     anv_get_relative_timeout(abs_timeout_ns));
-+            result = anv_device_wait(device, &impl->bo.bo, timeout);
-             switch (result) {
-             case VK_SUCCESS:
-                impl->bo.state = ANV_BO_FENCE_STATE_SIGNALED;
-@@ -629,20 +622,39 @@ anv_wait_for_bo_fences(struct anv_device *device,
-          assert(now_pending_fences <= pending_fences);
- 
-          if (now_pending_fences == pending_fences) {
--            struct timespec abstime = {
--               .tv_sec = abs_timeout_ns / NSEC_PER_SEC,
--               .tv_nsec = abs_timeout_ns % NSEC_PER_SEC,
--            };
-+            struct timespec before;
-+            clock_gettime(CLOCK_MONOTONIC, &before);
-+
-+            uint32_t abs_nsec = before.tv_nsec + timeout % NSEC_PER_SEC;
-+            uint64_t abs_sec = before.tv_sec + (abs_nsec / NSEC_PER_SEC) +
-+                               (timeout / NSEC_PER_SEC);
-+            abs_nsec %= NSEC_PER_SEC;
-+
-+            /* Avoid roll-over in tv_sec on 32-bit systems if the user
-+             * provided timeout is UINT64_MAX
-+             */
-+            struct timespec abstime;
-+            abstime.tv_nsec = abs_nsec;
-+            abstime.tv_sec = MIN2(abs_sec, INT_TYPE_MAX(abstime.tv_sec));
- 
-             MAYBE_UNUSED int ret;
-             ret = pthread_cond_timedwait(&device->queue_submit,
-                                          &device->mutex, &abstime);
-             assert(ret != EINVAL);
--            if (gettime_ns() >= abs_timeout_ns) {
-+
-+            struct timespec after;
-+            clock_gettime(CLOCK_MONOTONIC, &after);
-+            uint64_t time_elapsed =
-+               ((uint64_t)after.tv_sec * NSEC_PER_SEC + after.tv_nsec) -
-+               ((uint64_t)before.tv_sec * NSEC_PER_SEC + before.tv_nsec);
-+
-+            if (time_elapsed >= timeout) {
-                pthread_mutex_unlock(&device->mutex);
-                result = VK_TIMEOUT;
-                goto done;
-             }
-+
-+            timeout -= time_elapsed;
-          }
- 
-          pthread_mutex_unlock(&device->mutex);
-@@ -681,8 +693,9 @@ anv_wait_for_fences(struct anv_device *device,
-          ANV_FROM_HANDLE(anv_fence, fence, pFences[i]);
-          switch (fence->permanent.type) {
-          case ANV_FENCE_TYPE_BO:
--            result = anv_wait_for_bo_fences(device, 1, &pFences[i],
--                                            true, abs_timeout);
-+            result = anv_wait_for_bo_fences(
-+               device, 1, &pFences[i], true,
-+               anv_get_relative_timeout(abs_timeout));
-             break;
-          case ANV_FENCE_TYPE_SYNCOBJ:
-             result = anv_wait_for_syncobj_fences(device, 1, &pFences[i],
-@@ -742,16 +755,15 @@ VkResult anv_WaitForFences(
-    if (anv_device_is_lost(device))
-       return VK_ERROR_DEVICE_LOST;
- 
--   uint64_t abs_timeout = anv_get_absolute_timeout(timeout);
-    if (anv_all_fences_syncobj(fenceCount, pFences)) {
-       return anv_wait_for_syncobj_fences(device, fenceCount, pFences,
--                                         waitAll, abs_timeout);
-+                                         waitAll, anv_get_absolute_timeout(timeout));
-    } else if (anv_all_fences_bo(fenceCount, pFences)) {
-       return anv_wait_for_bo_fences(device, fenceCount, pFences,
--                                    waitAll, abs_timeout);
-+                                    waitAll, timeout);
-    } else {
-       return anv_wait_for_fences(device, fenceCount, pFences,
--                                 waitAll, abs_timeout);
-+                                 waitAll, anv_get_absolute_timeout(timeout));
-    }
- }
- 
--- 
-2.20.1
-
diff --git a/media-libs/arc-mesa-img/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch b/media-libs/arc-mesa-img/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
deleted file mode 100644
index 28b149b..0000000
--- a/media-libs/arc-mesa-img/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 5b2c1a3b2cd1ec2e732ad22cc4eddbe6f417d4e2 Mon Sep 17 00:00:00 2001
-From: Gurchetan Singh <gurchetansingh@chromium.org>
-Date: Tue, 2 Apr 2019 18:22:59 -0700
-Subject: [PATCH] HACK: disable intel_miptree_unmap_tiled_memcpy for gen 8
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-For some reason it causes glTexImage failures on auron_paine/auron_yuna
-(but not on Cyan/Samus, or CrOS).
-
-00 pc 00019636  /system/lib/libc.so (memcpy+742)
-01 pc 00adea05  /vendor/lib/dri/i965_dri.so (linear_to_ytiled_faster+2117)
-02 pc 00adceff  /vendor/lib/dri/i965_dri.so (intel_linear_to_tiled+1375)
-03 pc 00adc98a  /vendor/lib/dri/i965_dri.so (_isl_memcpy_linear_to_tiled+250)
-04 pc 00aa9b9e  /vendor/lib/dri/i965_dri.so (isl_memcpy_linear_to_tiled+414)
-05 pc 007f93eb  /vendor/lib/dri/i965_dri.so (intel_miptree_unmap_tiled_memcpy+459)
-06 pc 007f6494  /vendor/lib/dri/i965_dri.so (intel_miptree_unmap+420)
-07 pc 0080879d  /vendor/lib/dri/i965_dri.so (intel_unmap_texture_image+205)
-08 pc 002bf978  /vendor/lib/dri/i965_dri.so (store_texsubimage+2344)
-09 pc 002bfb3a  /vendor/lib/dri/i965_dri.so (_mesa_store_texsubimage+298)
-10 pc 0080b83b  /vendor/lib/dri/i965_dri.so (intel_upload_tex+1275)#11 pc 0080a53f  /vendor/lib/dri/i965_dri.so (intelTexSubImage+799)
-12 pc 002a3a78  /vendor/lib/dri/i965_dri.so (texture_sub_image+728)
-13 pc 00295c2b  /vendor/lib/dri/i965_dri.so (texsubimage_err+1147)
-14 pc 00295e9c  /vendor/lib/dri/i965_dri.so (_mesa_TexSubImage2D+300)
-15 pc 0000c9a4  /vendor/lib/egl/libGLESv2_mesa.so (glTexSubImage2D+212)
-
-Change-Id: Id3730483d9de6b7ede88fe9f31c6175f0a3c4bc3
----
- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-index b4e3524aa51f..feb8f1dbb94c 100644
---- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-@@ -3788,7 +3788,7 @@ intel_miptree_map(struct brw_context *brw,
-       intel_miptree_map_depthstencil(brw, mt, map, level, slice);
-    } else if (use_intel_mipree_map_blit(brw, mt, map)) {
-       intel_miptree_map_blit(brw, mt, map, level, slice);
--   } else if (mt->surf.tiling != ISL_TILING_LINEAR && devinfo->gen > 4) {
-+   } else if (mt->surf.tiling != ISL_TILING_LINEAR && devinfo->gen > 8) {
-       intel_miptree_map_tiled_memcpy(brw, mt, map, level, slice);
- #if defined(USE_SSE41)
-    } else if (!(mode & GL_MAP_WRITE_BIT) &&
--- 
-2.20.1
-
diff --git a/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_pre-r14.ebuild b/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_pre-r14.ebuild
deleted file mode 100644
index ea24208..0000000
--- a/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_pre-r14.ebuild
+++ /dev/null
@@ -1,152 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=6
-
-CROS_WORKON_COMMIT="a2539afdc3c0806884858c6dc753e63bdd8f9e74"
-CROS_WORKON_TREE="c74c7b6b64e5e219a9a2245a1ef2a8dfb98d8663"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-iris"
-
-inherit base meson multilib-minimal flag-o-matic cros-workon arc-build
-
-DESCRIPTION="The Mesa 3D Graphics Library"
-HOMEPAGE="http://mesa3d.org/"
-
-KEYWORDS="*"
-
-# Most files are MIT/X11.
-# Some files in src/glx are SGI-B-2.0.
-LICENSE="MIT SGI-B-2.0"
-SLOT="0"
-
-IUSE="
-	cheets
-	cheets_user
-	cheets_user_64
-	debug
-	vulkan
-	android_vulkan_compute_0
-	android_aep
-"
-
-REQUIRED_USE="
-	cheets
-	android_vulkan_compute_0? ( vulkan )
-"
-
-DEPEND="
-	>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
-	dev-libs/arc-libelf[${MULTILIB_USEDEP}]
-"
-
-RDEPEND="${DEPEND}"
-
-src_configure() {
-	arc-build-select-clang
-
-	multilib-minimal_src_configure
-}
-
-multilib_src_configure() {
-	# The AOSP build system defines the Make variable PLATFORM_SDK_VERSION,
-	# and Mesa's Android.mk files use it to define the macro
-	# ANDROID_API_LEVEL. Arc emulates that here.
-	if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
-		CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
-	fi
-
-	arc-build-create-cross-file
-
-	emesonargs+=(
-		--prefix="${ARC_PREFIX}/vendor"
-		--sysconfdir="/system/vendor/etc"
-		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=true
-		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=true
-		-Dgles2=true
-		-Dshared-glapi=true
-		-Ddri-drivers=
-		-Dgallium-drivers=iris
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
-		-Dplatforms=android
-		-Degl-lib-suffix=_mesa
-		-Dgles-lib-suffix=_mesa
-		-Dvulkan-drivers=$(usex vulkan intel '')
-		--buildtype $(usex debug debug release)
-		--cross-file="${ARC_CROSS_FILE}"
-		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION}"
-	)
-
-	meson_src_configure
-}
-
-# The meson eclass exports src_compile but not multilib_src_compile. src_compile
-# gets overridden by multilib-minimal
-multilib_src_compile() {
-	meson_src_compile
-}
-
-multilib_src_install() {
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
-	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
-	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
-	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
-	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
-
-	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
-	newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" iris_dri.so
-
-	if use vulkan; then
-		exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw"
-		newexe "${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so" vulkan.cheets.so
-	fi
-}
-
-multilib_src_install_all() {
-	# For documentation on the feature set represented by each XML file
-	# installed into /vendor/etc/permissions, see
-	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
-	# For example XML files for each feature, see
-	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
-
-	# Install init files to advertise supported API versions.
-	insinto "${ARC_PREFIX}/vendor/etc/init"
-	doins "${FILESDIR}/gles32.rc"
-
-	# Install vulkan files
-	if use vulkan; then
-		einfo "Using android vulkan."
-		insinto "${ARC_PREFIX}/vendor/etc/init"
-		doins "${FILESDIR}/vulkan.rc"
-
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.vulkan.level-1.xml"
-		doins "${FILESDIR}/android.hardware.vulkan.version-1_1.xml"
-
-		if use android_vulkan_compute_0; then
-			einfo "Using android vulkan_compute_0."
-			insinto "${ARC_PREFIX}/vendor/etc/permissions"
-			doins "${FILESDIR}/android.hardware.vulkan.compute-0.xml"
-		fi
-	fi
-
-	# Install permission file to declare opengles aep support.
-	if use android_aep; then
-		einfo "Using android aep."
-		insinto "${ARC_PREFIX}/vendor/etc/permissions"
-		doins "${FILESDIR}/android.hardware.opengles.aep.xml"
-	fi
-	# Install the dri header for arc-cros-gralloc
-	insinto "${ARC_PREFIX}/vendor/include/GL"
-	doins -r "${S}/include/GL/internal"
-}
diff --git a/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_rc1-r15.ebuild b/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_rc1-r15.ebuild
new file mode 100644
index 0000000..2dc8c8f
--- /dev/null
+++ b/media-libs/arc-mesa-iris/arc-mesa-iris-20.2.0_rc1-r15.ebuild
@@ -0,0 +1,152 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=6
+
+CROS_WORKON_COMMIT="cbe5934fd21d579a7bcffa6c7ae2567d361a6705"
+CROS_WORKON_TREE="bfd09ab3e5c477cdb942fd0291460e01d1d37182"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-iris"
+
+inherit base meson multilib-minimal flag-o-matic cros-workon arc-build
+
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
+
+KEYWORDS="*"
+
+# Most files are MIT/X11.
+# Some files in src/glx are SGI-B-2.0.
+LICENSE="MIT SGI-B-2.0"
+SLOT="0"
+
+IUSE="
+	cheets
+	cheets_user
+	cheets_user_64
+	debug
+	vulkan
+	android_vulkan_compute_0
+	android_aep
+"
+
+REQUIRED_USE="
+	cheets
+	android_vulkan_compute_0? ( vulkan )
+"
+
+DEPEND="
+	>=x11-libs/arc-libdrm-2.4.82[${MULTILIB_USEDEP}]
+	dev-libs/arc-libelf[${MULTILIB_USEDEP}]
+"
+
+RDEPEND="${DEPEND}"
+
+src_configure() {
+	arc-build-select-clang
+
+	multilib-minimal_src_configure
+}
+
+multilib_src_configure() {
+	# The AOSP build system defines the Make variable PLATFORM_SDK_VERSION,
+	# and Mesa's Android.mk files use it to define the macro
+	# ANDROID_API_LEVEL. Arc emulates that here.
+	if [[ -n "${ARC_PLATFORM_SDK_VERSION}" ]]; then
+		CPPFLAGS+=" -DANDROID_API_LEVEL=${ARC_PLATFORM_SDK_VERSION}"
+	fi
+
+	arc-build-create-cross-file
+
+	emesonargs+=(
+		--prefix="${ARC_PREFIX}/vendor"
+		--sysconfdir="/system/vendor/etc"
+		-Ddri-search-path="/system/$(get_libdir)/dri:/system/vendor/$(get_libdir)/dri"
+		-Dllvm=false
+		-Ddri3=false
+		-Dshader-cache=true
+		-Dglx=disabled
+		-Degl=true
+		-Dgbm=false
+		-Dgles1=true
+		-Dgles2=true
+		-Dshared-glapi=true
+		-Ddri-drivers=
+		-Dgallium-drivers=iris
+		-Dgallium-vdpau=false
+		-Dgallium-xa=false
+		-Dplatforms=android
+		-Degl-lib-suffix=_mesa
+		-Dgles-lib-suffix=_mesa
+		-Dvulkan-drivers=$(usex vulkan intel '')
+		--buildtype $(usex debug debug release)
+		--cross-file="${ARC_CROSS_FILE}"
+		-Dplatform-sdk-version="${ARC_PLATFORM_SDK_VERSION}"
+	)
+
+	meson_src_configure
+}
+
+# The meson eclass exports src_compile but not multilib_src_compile. src_compile
+# gets overridden by multilib-minimal
+multilib_src_compile() {
+	meson_src_compile
+}
+
+multilib_src_install() {
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)"
+	newexe "${BUILD_DIR}/src/mapi/shared-glapi/libglapi.so.0" libglapi.so.0
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/egl"
+	newexe "${BUILD_DIR}/src/egl/libEGL_mesa.so" libEGL_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es1api/libGLESv1_CM_mesa.so" libGLESv1_CM_mesa.so
+	newexe "${BUILD_DIR}/src/mapi/es2api/libGLESv2_mesa.so" libGLESv2_mesa.so
+
+	exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/dri"
+	newexe "${BUILD_DIR}/src/gallium/targets/dri/libgallium_dri.so" iris_dri.so
+
+	if use vulkan; then
+		exeinto "${ARC_PREFIX}/vendor/$(get_libdir)/hw"
+		newexe "${BUILD_DIR}/src/intel/vulkan/libvulkan_intel.so" vulkan.cheets.so
+	fi
+}
+
+multilib_src_install_all() {
+	# For documentation on the feature set represented by each XML file
+	# installed into /vendor/etc/permissions, see
+	# <https://developer.android.com/reference/android/content/pm/PackageManager.html>.
+	# For example XML files for each feature, see
+	# <https://android.googlesource.com/platform/frameworks/native/+/master/data/etc>.
+
+	# Install init files to advertise supported API versions.
+	insinto "${ARC_PREFIX}/vendor/etc/init"
+	doins "${FILESDIR}/gles32.rc"
+
+	# Install vulkan files
+	if use vulkan; then
+		einfo "Using android vulkan."
+		insinto "${ARC_PREFIX}/vendor/etc/init"
+		doins "${FILESDIR}/vulkan.rc"
+
+		insinto "${ARC_PREFIX}/vendor/etc/permissions"
+		doins "${FILESDIR}/android.hardware.vulkan.level-1.xml"
+		doins "${FILESDIR}/android.hardware.vulkan.version-1_1.xml"
+
+		if use android_vulkan_compute_0; then
+			einfo "Using android vulkan_compute_0."
+			insinto "${ARC_PREFIX}/vendor/etc/permissions"
+			doins "${FILESDIR}/android.hardware.vulkan.compute-0.xml"
+		fi
+	fi
+
+	# Install permission file to declare opengles aep support.
+	if use android_aep; then
+		einfo "Using android aep."
+		insinto "${ARC_PREFIX}/vendor/etc/permissions"
+		doins "${FILESDIR}/android.hardware.opengles.aep.xml"
+	fi
+	# Install the dri header for arc-cros-gralloc
+	insinto "${ARC_PREFIX}/vendor/include/GL"
+	doins -r "${S}/include/GL/internal"
+}
diff --git a/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.0.7-r4.ebuild b/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.0.7-r11.ebuild
similarity index 100%
rename from media-libs/arc-mesa-virgl/arc-mesa-virgl-20.0.7-r4.ebuild
rename to media-libs/arc-mesa-virgl/arc-mesa-virgl-20.0.7-r11.ebuild
diff --git a/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.ebuild b/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.ebuild
index c5da32e..d09a534 100644
--- a/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.ebuild
+++ b/media-libs/arc-mesa-virgl/arc-mesa-virgl-20.ebuild
@@ -35,11 +35,14 @@
 	IUSE_VIDEO_CARDS+=" video_cards_${card}"
 done
 
+# TODO(b/160748345): Remove hardcoded ARC_PLATFORM_SDK_VERSION when fixed.
+ARC_PLATFORM_SDK_VERSION=28
+
 IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-nyc -android_gles2 -android_gles30
+	android_aep -android_gles2 -android_gles30
 	+android_gles31 -android_gles32	-android_vulkan_compute_0
-	cheets +classic debug dri egl +gallium
-	-gbm gles1 gles2 +llvm +nptl pic selinux shared-glapi vulkan X xlib-glx
+	+cheets classic debug dri +egl +gallium
+	-gbm +gles1 +gles2 -llvm +nptl pic selinux +shared-glapi -vulkan -X xlib-glx
 	cheets_user cheets_user_64"
 
 # llvmpipe requires ARC++ _userdebug images, ARC++ _user images can't use it
@@ -136,12 +139,16 @@
 
 	epatch "${FILESDIR}"/FROMLIST-egl-android-Increase-preferred-buffer-count-to-4.patch
 
-	epatch "${FILESDIR}"/UPSTREAM-virgl-Use-ETC2-formats-directly-when-possible.patch 
+	epatch "${FILESDIR}"/UPSTREAM-virgl-Use-ETC2-formats-directly-when-possible.patch
 
-	epatch "${FILESDIR}"/FROMLIST-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
+	epatch "${FILESDIR}"/BACKPORT-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
 	# It's also fixed at Android master with http://ag/11992933. We can't
 	# merge it to R, so let' work around it at mesa side here.
-	epatch "${FILESDIR}"/CHROMIUM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
+	epatch "${FILESDIR}"/UPSTREAM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
+
+	epatch "${FILESDIR}"/UPSTREAM-util-add-a-alignof-macro.patch
+	epatch "${FILESDIR}"/UPSTREAM-util-ralloc-fix-ralloc-alignment.patch
+	epatch "${FILESDIR}"/UPSTREAM-st-mesa-Fix-EGLImageTargetTexture2D-for-GL_TEXTURE_2.patch
 
 	default
 }
@@ -388,6 +395,7 @@
 	fi
 
 	# Install vulkan related files.
+	# TODO(b/164152220): Enable vulkan for virtio gpu.
 	if use vulkan; then
 		einfo "Using android vulkan."
 		insinto "${ARC_VM_PREFIX}/vendor/etc/init"
@@ -401,11 +409,7 @@
 			doins "${FILESDIR}/android.hardware.vulkan.level-0.xml"
 		fi
 
-		# Limit the Vulkan version to 1.0 before Android Pie. The
-		# Nougat and Oreo CTS reject 1.1 in test
-		# android.graphics.cts.VulkanFeaturesTest#testVulkanHardwareFeatures.
-		# (See b/136215923).
-		if ! use android-container-nyc && use video_cards_intel; then
+		if use video_cards_intel; then
 			doins "${FILESDIR}/android.hardware.vulkan.version-1_1.xml"
 		else
 			doins "${FILESDIR}/android.hardware.vulkan.version-1_0_3.xml"
diff --git a/media-libs/arc-mesa-virgl/arc-mesa-virgl-9999.ebuild b/media-libs/arc-mesa-virgl/arc-mesa-virgl-9999.ebuild
index e4da457..0acefbb 100644
--- a/media-libs/arc-mesa-virgl/arc-mesa-virgl-9999.ebuild
+++ b/media-libs/arc-mesa-virgl/arc-mesa-virgl-9999.ebuild
@@ -32,11 +32,14 @@
 	IUSE_VIDEO_CARDS+=" video_cards_${card}"
 done
 
+# TODO(b/160748345): Remove hardcoded ARC_PLATFORM_SDK_VERSION when fixed.
+ARC_PLATFORM_SDK_VERSION=28
+
 IUSE="${IUSE_VIDEO_CARDS}
-	android_aep android-container-nyc -android_gles2 -android_gles30
+	android_aep -android_gles2 -android_gles30
 	+android_gles31 -android_gles32 -android_vulkan_compute_0
-	cheets +classic debug dri egl +gallium
-	-gbm gles1 gles2 +llvm +nptl pic selinux shared-glapi vulkan X xlib-glx
+	+cheets classic debug dri +egl +gallium
+	-gbm +gles1 +gles2 -llvm +nptl pic selinux +shared-glapi -vulkan -X xlib-glx
 	cheets_user cheets_user_64"
 
 # llvmpipe requires ARC++ _userdebug images, ARC++ _user images can't use it
@@ -389,7 +392,7 @@
 		fi
 	fi
 
-	if use android_vulkan_compute_0 && ! use android-container-nyc; then
+	if use android_vulkan_compute_0; then
 		einfo "Using android vulkan_compute_0."
 		insinto "${ARC_VM_PREFIX}/vendor/etc/permissions"
 		doins "${FILESDIR}/android.hardware.vulkan.compute-0.xml"
diff --git a/media-libs/arc-mesa-virgl/files/BACKPORT-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch b/media-libs/arc-mesa-virgl/files/BACKPORT-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
new file mode 100644
index 0000000..8a6b7b5
--- /dev/null
+++ b/media-libs/arc-mesa-virgl/files/BACKPORT-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
@@ -0,0 +1,127 @@
+From 66482303f6d19f1e498b31626c3cbae75e44e957 Mon Sep 17 00:00:00 2001
+From: Lepton Wu <lepton@chromium.org>
+Date: Mon, 22 Jun 2020 15:33:32 -0700
+Subject: [PATCH] mapi: x86: Fix dynamic entries in x86 tsd stubs.
+
+We need to update dynamic entries related code after updating
+asm stubs.
+
+Fixes: 45206d7673a ("mapi: Adapted libglvnd x86 tsd changes")
+Signed-off-by: Lepton Wu <lepton@chromium.org>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5598>
+---
+ src/mapi/entry_x86_tsd.h | 50 +++++++++++++++++++++++++++++++++-------
+ 1 file changed, 42 insertions(+), 8 deletions(-)
+
+diff --git a/src/mapi/entry_x86_tsd.h b/src/mapi/entry_x86_tsd.h
+index 1cf3ea2964e..f5d9c41253f 100644
+--- a/src/mapi/entry_x86_tsd.h
++++ b/src/mapi/entry_x86_tsd.h
+@@ -39,8 +39,16 @@
+ 
+ #define X86_ENTRY_SIZE 64
+ 
+-__asm__(".text\n"
+-        ".balign 32\n"
++__asm__(".text\n");
++
++__asm__("x86_got:\n\t"
++        "call 1f\n"
++        "1:\n\t"
++        "popl %eax\n\t"
++        "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t"
++        "ret");
++
++__asm__(".balign 32\n"
+         "x86_entry_start:");
+ 
+ #define STUB_ASM_ENTRY(func)        \
+@@ -49,11 +57,17 @@ __asm__(".text\n"
+    ".balign 32\n"                   \
+    func ":"
+ 
++#define LOC_BEGIN_SET_ECX
++#define LOC_END_SET_ECX
++#define LOC_END_JMP
++
+ #define STUB_ASM_CODE(slot)         \
++   LOC_BEGIN_SET_ECX	            \
+    "call 1f\n\t"                    \
+    "1:\n\t"                         \
+    "popl %ecx\n\t"                  \
+    "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx\n\t" \
++   LOC_END_SET_ECX                                \
+    "movl " ENTRY_CURRENT_TABLE "@GOT(%ecx), %eax\n\t" \
+    "mov (%eax), %eax\n\t"           \
+    "testl %eax, %eax\n\t"           \
+@@ -64,7 +78,8 @@ __asm__(".text\n"
+    "call " ENTRY_CURRENT_TABLE_GET "@PLT\n\t" \
+    "popl %ebx\n\t"                  \
+    "1:\n\t"                         \
+-   "jmp *(4 * " slot ")(%eax)"
++   "jmp *(4 * " slot ")(%eax)\n\t" \
++   LOC_END_JMP
+ 
+ #define MAPI_TMP_STUB_ASM_GCC
+ #include "mapi_tmp.h"
+@@ -74,9 +89,26 @@ __asm__(".text\n"
+ __asm__(".balign 32\n"
+         "x86_entry_end:");
+ 
++#undef LOC_BEGIN_SET_ECX
++#undef LOC_END_SET_ECX
++#undef LOC_END_JMP
++#define LOC_BEGIN_SET_ECX "jmp set_ecx\n\t"
++#define LOC_END_SET_ECX "set_ecx:movl $0x12345678, %ecx\n\tloc_end_set_ecx:\n\t"
++#define LOC_END_JMP "loc_end_jmp:"
++
++/* Any number big enough works. This is to make sure the final
++ * jmp is a long jmp */
++__asm__(STUB_ASM_CODE("10000"));
++
++extern const char loc_end_set_ecx[] HIDDEN;
++extern const char loc_end_jmp[] HIDDEN;
++
+ #include <string.h>
+ #include "u_execmem.h"
+ 
++extern unsigned long
++x86_got();
++
+ extern const char x86_entry_start[] HIDDEN;
+ extern const char x86_entry_end[] HIDDEN;
+ 
+@@ -95,16 +127,15 @@ void
+ entry_patch(mapi_func entry, int slot)
+ {
+    char *code = (char *) entry;
+-
+-   *((unsigned long *) (code + 11)) = slot * sizeof(mapi_func);
+-   *((unsigned long *) (code + 22)) = slot * sizeof(mapi_func);
++   int offset = loc_end_jmp - x86_entry_end - sizeof(unsigned long);
++   *((unsigned long *) (code + offset)) = slot * sizeof(mapi_func);
+ }
+ 
+ mapi_func
+ entry_generate(int slot)
+ {
+-   const char *code_templ = x86_entry_end - X86_ENTRY_SIZE;
+-   void *code;
++   const char *code_templ = x86_entry_end;
++   char *code;
+    mapi_func entry;
+ 
+    code = u_execmem_alloc(X86_ENTRY_SIZE);
+@@ -113,6 +144,9 @@ entry_generate(int slot)
+ 
+    memcpy(code, code_templ, X86_ENTRY_SIZE);
+    entry = (mapi_func) code;
++   int ecx_value_off = loc_end_set_ecx - x86_entry_end - sizeof(unsigned long);
++   *((unsigned long *) (code + ecx_value_off)) = x86_got();
++
+    entry_patch(entry, slot);
+ 
+    return entry;
+-- 
+2.28.0.163.g6104cc2f0b6-goog
+
diff --git a/media-libs/arc-mesa-virgl/files/CHROMIUM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch b/media-libs/arc-mesa-virgl/files/CHROMIUM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
deleted file mode 100644
index 0922231..0000000
--- a/media-libs/arc-mesa-virgl/files/CHROMIUM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From a6312fac4de6253c80a85b306262c4764e08c12d Mon Sep 17 00:00:00 2001
-From: Lepton Wu <lepton@chromium.org>
-Date: Thu, 25 Jun 2020 13:52:24 -0700
-Subject: [PATCH] mapi: Return NULL function pointers for GL_EXT_debug_marker
-
-Mesa returns a stub function pointer to glAnything for years.
-Android framework till API level 30 just uses function pointers
-returned from eglGetProcAddress without checking if the underlying
-extension is supported. If we return stub pointers for functions
-in GL_EXT_debug_marker, Android just uses our stub functions instead
-of its own stubs and then fail the dEQP. In the past, the issue
-didn't show up because mesa only has limited slots and run out of slots
-before Android calls eglGetProcAddress on functions inside
-GL_EXT_debug_marker.
----
- src/mapi/mapi_glapi.c | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
-diff --git a/src/mapi/mapi_glapi.c b/src/mapi/mapi_glapi.c
-index 1cee148c891..25b17c06a61 100644
---- a/src/mapi/mapi_glapi.c
-+++ b/src/mapi/mapi_glapi.c
-@@ -169,6 +169,13 @@ _glapi_add_dispatch( const char * const * function_names,
-    return (alias) ? stub_get_slot(alias) : -1;
- }
- 
-+static int is_debug_marker_func(const char *name)
-+{
-+   return (!strcmp(name, "InsertEventMarkerEXT") ||
-+           !strcmp(name, "PushGroupMarkerEXT") ||
-+           !strcmp(name, "PopGroupMarkerEXT"));
-+}
-+
- static const struct mapi_stub *
- _glapi_get_stub(const char *name, int generate)
- {
-@@ -179,7 +186,11 @@ _glapi_get_stub(const char *name, int generate)
-    name += 2;
- 
-    stub = stub_find_public(name);
--   if (!stub)
-+   /* Android framework till API Level 30 uses function pointers from
-+    * eglGetProcAddress without checking GL_EXT_debug_marker.
-+    * Make sure we don't return stub function pointers if we don't
-+    * support GL_EXT_debug_marker */
-+   if (!stub && !is_debug_marker_func(name))
-       stub = stub_find_dynamic(name, generate);
- 
-    return stub;
--- 
-2.26.2
-
diff --git a/media-libs/arc-mesa-virgl/files/FROMLIST-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch b/media-libs/arc-mesa-virgl/files/FROMLIST-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
deleted file mode 100644
index 7675d83..0000000
--- a/media-libs/arc-mesa-virgl/files/FROMLIST-mapi-x86-Fix-dynamic-entries-in-x86-tsd-stubs.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From 8ff7a1c957999d8e84d0b1ffd5b91e976754cc8b Mon Sep 17 00:00:00 2001
-From: Lepton Wu <lepton@chromium.org>
-Date: Mon, 22 Jun 2020 15:33:32 -0700
-Subject: [PATCH] mapi: x86: Fix dynamic entries in x86 tsd stubs.
-
-We need to update dynamic entries related code after updating
-asm stubs.
-
-Fixes: 45206d7673a ("mapi: Adapted libglvnd x86 tsd changes")
-Signed-off-by: Lepton Wu <lepton@chromium.org>
----
- src/mapi/entry_x86_tsd.h | 50 +++++++++++++++++++++++++++++++++-------
- 1 file changed, 42 insertions(+), 8 deletions(-)
-
-diff --git a/src/mapi/entry_x86_tsd.h b/src/mapi/entry_x86_tsd.h
-index 1cf3ea2964e..f5d9c41253f 100644
---- a/src/mapi/entry_x86_tsd.h
-+++ b/src/mapi/entry_x86_tsd.h
-@@ -39,8 +39,16 @@
- 
- #define X86_ENTRY_SIZE 64
- 
--__asm__(".text\n"
--        ".balign 32\n"
-+__asm__(".text\n");
-+
-+__asm__("x86_got:\n\t"
-+        "call 1f\n"
-+        "1:\n\t"
-+        "popl %eax\n\t"
-+        "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t"
-+        "ret");
-+
-+__asm__(".balign 32\n"
-         "x86_entry_start:");
- 
- #define STUB_ASM_ENTRY(func)        \
-@@ -49,11 +57,17 @@ __asm__(".text\n"
-    ".balign 32\n"                   \
-    func ":"
- 
-+#define LOC_BEGIN_SET_ECX
-+#define LOC_END_SET_ECX
-+#define LOC_END_JMP
-+
- #define STUB_ASM_CODE(slot)         \
-+   LOC_BEGIN_SET_ECX	            \
-    "call 1f\n\t"                    \
-    "1:\n\t"                         \
-    "popl %ecx\n\t"                  \
-    "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx\n\t" \
-+   LOC_END_SET_ECX                                \
-    "movl " ENTRY_CURRENT_TABLE "@GOT(%ecx), %eax\n\t" \
-    "mov (%eax), %eax\n\t"           \
-    "testl %eax, %eax\n\t"           \
-@@ -64,7 +78,8 @@ __asm__(".text\n"
-    "call " ENTRY_CURRENT_TABLE_GET "@PLT\n\t" \
-    "popl %ebx\n\t"                  \
-    "1:\n\t"                         \
--   "jmp *(4 * " slot ")(%eax)"
-+   "jmp *(4 * " slot ")(%eax)\n\t" \
-+   LOC_END_JMP
- 
- #define MAPI_TMP_STUB_ASM_GCC
- #include "mapi_tmp.h"
-@@ -74,9 +89,26 @@ __asm__(".text\n"
- __asm__(".balign 32\n"
-         "x86_entry_end:");
- 
-+#undef LOC_BEGIN_SET_ECX
-+#undef LOC_END_SET_ECX
-+#undef LOC_END_JMP
-+#define LOC_BEGIN_SET_ECX "jmp set_ecx\n\t"
-+#define LOC_END_SET_ECX "set_ecx:movl $0x12345678, %ecx\n\tloc_end_set_ecx:\n\t"
-+#define LOC_END_JMP "loc_end_jmp:"
-+
-+/* Any number big enough works. This is to make sure the final
-+ * jmp is a long jmp */
-+__asm__(STUB_ASM_CODE("10000"));
-+
-+extern const char loc_end_set_ecx[] HIDDEN;
-+extern const char loc_end_jmp[] HIDDEN;
-+
- #include <string.h>
- #include "u_execmem.h"
- 
-+extern unsigned long
-+x86_got();
-+
- extern const char x86_entry_start[] HIDDEN;
- extern const char x86_entry_end[] HIDDEN;
- 
-@@ -95,16 +127,15 @@ void
- entry_patch(mapi_func entry, int slot)
- {
-    char *code = (char *) entry;
--
--   *((unsigned long *) (code + 11)) = slot * sizeof(mapi_func);
--   *((unsigned long *) (code + 22)) = slot * sizeof(mapi_func);
-+   int offset = loc_end_jmp - x86_entry_end - sizeof(unsigned long);
-+   *((unsigned long *) (code + offset)) = slot * sizeof(mapi_func);
- }
- 
- mapi_func
- entry_generate(int slot)
- {
--   const char *code_templ = x86_entry_end - X86_ENTRY_SIZE;
--   void *code;
-+   const char *code_templ = x86_entry_end;
-+   char *code;
-    mapi_func entry;
- 
-    code = u_execmem_alloc(X86_ENTRY_SIZE);
-@@ -113,6 +144,9 @@ entry_generate(int slot)
- 
-    memcpy(code, code_templ, X86_ENTRY_SIZE);
-    entry = (mapi_func) code;
-+   int ecx_value_off = loc_end_set_ecx - x86_entry_end - sizeof(unsigned long);
-+   *((unsigned long *) (code + ecx_value_off)) = x86_got();
-+
-    entry_patch(entry, slot);
- 
-    return entry;
--- 
-2.26.2
-
diff --git a/media-libs/arc-mesa-virgl/files/UPSTREAM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch b/media-libs/arc-mesa-virgl/files/UPSTREAM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
new file mode 100644
index 0000000..bd90675
--- /dev/null
+++ b/media-libs/arc-mesa-virgl/files/UPSTREAM-mapi-Return-NULL-function-pointers-for-GL_EXT_debug_.patch
@@ -0,0 +1,60 @@
+From a2065917cc8f95f76c2926d8d7cb4bf3c9ff7de1 Mon Sep 17 00:00:00 2001
+From: Lepton Wu <lepton@chromium.org>
+Date: Thu, 25 Jun 2020 13:52:24 -0700
+Subject: [PATCH] mapi: Return NULL function pointers for GL_EXT_debug_marker
+
+Mesa returns a stub function pointer to glAnything for years.
+Android framework till API level 30 just uses function pointers
+returned from eglGetProcAddress without checking if the underlying
+extension is supported. If we return stub pointers for functions
+in GL_EXT_debug_marker, Android just uses our stub functions instead
+of its own stubs and then fail the dEQP. In the past, the issue
+didn't show up because mesa only has limited slots and run out of slots
+before Android calls eglGetProcAddress on functions inside
+GL_EXT_debug_marker.
+
+Signed-off-by: Lepton Wu <lepton@chromium.org>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5652>
+---
+ src/mapi/mapi_glapi.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/src/mapi/mapi_glapi.c b/src/mapi/mapi_glapi.c
+index 1cee148c891..21ca0a0902d 100644
+--- a/src/mapi/mapi_glapi.c
++++ b/src/mapi/mapi_glapi.c
+@@ -169,6 +169,15 @@ _glapi_add_dispatch( const char * const * function_names,
+    return (alias) ? stub_get_slot(alias) : -1;
+ }
+ 
++#if defined(ANDROID) && ANDROID_API_LEVEL <= 30
++static int is_debug_marker_func(const char *name)
++{
++   return (!strcmp(name, "InsertEventMarkerEXT") ||
++           !strcmp(name, "PushGroupMarkerEXT") ||
++           !strcmp(name, "PopGroupMarkerEXT"));
++}
++#endif
++
+ static const struct mapi_stub *
+ _glapi_get_stub(const char *name, int generate)
+ {
+@@ -179,7 +188,15 @@ _glapi_get_stub(const char *name, int generate)
+    name += 2;
+ 
+    stub = stub_find_public(name);
++#if defined(ANDROID) && ANDROID_API_LEVEL <= 30
++   /* Android framework till API Level 30 uses function pointers from
++    * eglGetProcAddress without checking GL_EXT_debug_marker.
++    * Make sure we don't return stub function pointers if we don't
++    * support GL_EXT_debug_marker */
++   if (!stub && !is_debug_marker_func(name))
++#else
+    if (!stub)
++#endif
+       stub = stub_find_dynamic(name, generate);
+ 
+    return stub;
+-- 
+2.28.0.163.g6104cc2f0b6-goog
+
diff --git a/media-libs/arc-mesa-virgl/files/UPSTREAM-st-mesa-Fix-EGLImageTargetTexture2D-for-GL_TEXTURE_2.patch b/media-libs/arc-mesa-virgl/files/UPSTREAM-st-mesa-Fix-EGLImageTargetTexture2D-for-GL_TEXTURE_2.patch
new file mode 100644
index 0000000..b036fc1
--- /dev/null
+++ b/media-libs/arc-mesa-virgl/files/UPSTREAM-st-mesa-Fix-EGLImageTargetTexture2D-for-GL_TEXTURE_2.patch
@@ -0,0 +1,45 @@
+From 5e4d69ec786e56794a995be869b5a9b80d050f2d Mon Sep 17 00:00:00 2001
+From: Woody Chow <woodychow@google.com>
+Date: Wed, 19 Aug 2020 14:19:12 +0900
+Subject: [PATCH] st/mesa: Fix EGLImageTargetTexture2D for GL_TEXTURE_2D
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Before this change, internalFormat was defaulted to GL_RGBA (
+unsized internal format). Therefore, subsequent glTexSubImage2D
+call with type != GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_4_4_4_4 or
+GL_UNSIGNED_SHORT_5_5_5_1 would give GL_INVALID_OPERATION.
+
+This fixes
+
+android.graphics.cts.BitmapColorSpaceTest#test16bitHardware
+android.graphics.cts.ImageDecoderTest#testDecodeBitmap*
+android.graphics.cts.BitmapTest#testNdkFormatsHardware
+
+in CtsGraphicsTestCases
+
+Reviewed-by: Marek Olšák <marek.olsak@amd.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6382>
+---
+ src/mesa/state_tracker/st_cb_eglimage.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
+index 5b03c5eb580..bf25e313091 100644
+--- a/src/mesa/state_tracker/st_cb_eglimage.c
++++ b/src/mesa/state_tracker/st_cb_eglimage.c
+@@ -327,7 +327,9 @@ st_egl_image_target_texture_2d(struct gl_context *ctx, GLenum target,
+                          &native_supported))
+       return;
+ 
+-   st_bind_egl_image(ctx, texObj, texImage, &stimg, false, native_supported);
++   st_bind_egl_image(ctx, texObj, texImage, &stimg,
++                     target != GL_TEXTURE_EXTERNAL_OES,
++                     native_supported);
+    pipe_resource_reference(&stimg.texture, NULL);
+ }
+ 
+-- 
+2.28.0.402.g5ffc5be6b7-goog
+
diff --git a/media-libs/arc-mesa-virgl/files/UPSTREAM-util-add-a-alignof-macro.patch b/media-libs/arc-mesa-virgl/files/UPSTREAM-util-add-a-alignof-macro.patch
new file mode 100644
index 0000000..cad2124
--- /dev/null
+++ b/media-libs/arc-mesa-virgl/files/UPSTREAM-util-add-a-alignof-macro.patch
@@ -0,0 +1,34 @@
+From 391eeb744356353e96ce34f23b8b16b718a02d61 Mon Sep 17 00:00:00 2001
+From: Rhys Perry <pendingchaos02@gmail.com>
+Date: Thu, 6 Aug 2020 14:53:36 +0100
+Subject: [PATCH] util: add a alignof() macro
+
+Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6206>
+---
+ src/util/macros.h | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/src/util/macros.h b/src/util/macros.h
+index 04aec96b546..f9aa478c994 100644
+--- a/src/util/macros.h
++++ b/src/util/macros.h
+@@ -351,4 +351,14 @@ enum pipe_debug_type
+    PIPE_DEBUG_TYPE_CONFORMANCE,
+ };
+ 
++#if !defined(alignof) && !defined(__cplusplus)
++#if __STDC_VERSION__ >= 201112L
++#define alignof(t) _Alignof(t)
++#elif defined(_MSC_VER)
++#define alignof(t) __alignof(t)
++#else
++#define alignof(t) __alignof__(t)
++#endif
++#endif
++
+ #endif /* UTIL_MACROS_H */
+-- 
+2.28.0.297.g1956fa8f8d-goog
+
diff --git a/media-libs/arc-mesa-virgl/files/UPSTREAM-util-ralloc-fix-ralloc-alignment.patch b/media-libs/arc-mesa-virgl/files/UPSTREAM-util-ralloc-fix-ralloc-alignment.patch
new file mode 100644
index 0000000..cf7ada9
--- /dev/null
+++ b/media-libs/arc-mesa-virgl/files/UPSTREAM-util-ralloc-fix-ralloc-alignment.patch
@@ -0,0 +1,65 @@
+From a4c708dd24e5ba8ac381973c14db8d23f4ac97bf Mon Sep 17 00:00:00 2001
+From: Lepton Wu <lepton@chromium.org>
+Date: Thu, 13 Aug 2020 19:14:13 -0700
+Subject: [PATCH] util/ralloc: fix ralloc alignment.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On some malloc implementation, malloc doesn't always align to 16
+bytes even on 64 bits system. To make sure ralloc_header always
+starts at the wanted alignment, just force the size to be aligned at
+the alignment of ralloc_header. This fixes crashed on instruction
+like "movaps %xmm0,0x10(%rax)" which requires aligned memory access.
+
+Signed-off-by: Lepton Wu <lepton@chromium.org>
+Reviewed-by: Marek Olšák <marek.olsak@amd.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6314>
+---
+ src/util/ralloc.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/src/util/ralloc.c b/src/util/ralloc.c
+index f36f8bf3654..4c2cf0772ce 100644
+--- a/src/util/ralloc.c
++++ b/src/util/ralloc.c
+@@ -28,6 +28,9 @@
+ #include <string.h>
+ #include <stdint.h>
+ 
++#include "util/macros.h"
++#include "util/u_math.h"
++
+ /* Some versions of MinGW are missing _vscprintf's declaration, although they
+  * still provide the symbol in the import library. */
+ #ifdef __MINGW32__
+@@ -120,7 +123,15 @@ ralloc_context(const void *ctx)
+ void *
+ ralloc_size(const void *ctx, size_t size)
+ {
+-   void *block = malloc(size + sizeof(ralloc_header));
++   /* Some malloc allocation doesn't always align to 16 bytes even on 64 bits
++    * system, from Android bionic/tests/malloc_test.cpp:
++    *  - Allocations of a size that rounds up to a multiple of 16 bytes
++    *    must have at least 16 byte alignment.
++    *  - Allocations of a size that rounds up to a multiple of 8 bytes and
++    *    not 16 bytes, are only required to have at least 8 byte alignment.
++    */
++   void *block = malloc(align64(size + sizeof(ralloc_header),
++                                alignof(ralloc_header)));
+    ralloc_header *info;
+    ralloc_header *parent;
+ 
+@@ -167,7 +178,8 @@ resize(void *ptr, size_t size)
+    ralloc_header *child, *old, *info;
+ 
+    old = get_header(ptr);
+-   info = realloc(old, size + sizeof(ralloc_header));
++   info = realloc(old, align64(size + sizeof(ralloc_header),
++                               alignof(ralloc_header)));
+ 
+    if (info == NULL)
+       return NULL;
+-- 
+GitLab
+
diff --git a/media-libs/arc-mesa/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch b/media-libs/arc-mesa/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
deleted file mode 100644
index 6996b29..0000000
--- a/media-libs/arc-mesa/files/CHROMIUM-Revert-anv-Use-absolute-timeouts-in-wait_for_bo_fenc.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From fab8ab0b272d728a1bb7c57e9f065c4bce41e8f7 Mon Sep 17 00:00:00 2001
-From: Gurchetan Singh <gurchetansingh@chromium.org>
-Date: Mon, 15 Apr 2019 09:57:08 -0700
-Subject: [PATCH 20/20] Revert "anv: Use absolute timeouts in
- wait_for_bo_fences"
-
-This fixes dEQP-VK.synchronization.events on Nami.  Note
-this test was removed from dEQP a while ago, and this
-revert is needed to satisfy N CTS.
-
-However, it's interesting to note the test still passes on
-a v4.13 Intel setup, while it fails on Nami/Fizz (v4.4 devices).
-Could be a real bug, but it's pretty easy to revert either
-way.
-
-BUG=b:130195490
-TEST=./deqp-vk --deqp-case=dEQP-VK.synchronization.events passes on Nami
-
-This reverts commit 1bd4f8fefc2728963fc37900fe75210ee24e09d1.
----
- src/intel/vulkan/anv_queue.c | 72 +++++++++++++++++++++---------------
- 1 file changed, 42 insertions(+), 30 deletions(-)
-
-diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
-index 55465c5ebe2b..30dccf4d4538 100644
---- a/src/intel/vulkan/anv_queue.c
-+++ b/src/intel/vulkan/anv_queue.c
-@@ -473,24 +473,9 @@ static int64_t anv_get_relative_timeout(uint64_t abs_timeout)
- {
-    uint64_t now = gettime_ns();
- 
--   /* We don't want negative timeouts.
--    *
--    * DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is
--    * supposed to block indefinitely timeouts < 0.  Unfortunately,
--    * this was broken for a couple of kernel releases.  Since there's
--    * no way to know whether or not the kernel we're using is one of
--    * the broken ones, the best we can do is to clamp the timeout to
--    * INT64_MAX.  This limits the maximum timeout from 584 years to
--    * 292 years - likely not a big deal.
--    */
-    if (abs_timeout < now)
-       return 0;
--
--   uint64_t rel_timeout = abs_timeout - now;
--   if (rel_timeout > (uint64_t) INT64_MAX)
--      rel_timeout = INT64_MAX;
--
--   return rel_timeout;
-+   return abs_timeout - now;
- }
- 
- static VkResult
-@@ -547,8 +532,17 @@ anv_wait_for_bo_fences(struct anv_device *device,
-                        uint32_t fenceCount,
-                        const VkFence *pFences,
-                        bool waitAll,
--                       uint64_t abs_timeout_ns)
-+                       uint64_t _timeout)
- {
-+   /* DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is supposed
-+    * to block indefinitely timeouts <= 0.  Unfortunately, this was broken
-+    * for a couple of kernel releases.  Since there's no way to know
-+    * whether or not the kernel we're using is one of the broken ones, the
-+    * best we can do is to clamp the timeout to INT64_MAX.  This limits the
-+    * maximum timeout from 584 years to 292 years - likely not a big deal.
-+    */
-+   int64_t timeout = MIN2(_timeout, (uint64_t) INT64_MAX);
-+
-    VkResult result = VK_SUCCESS;
-    uint32_t pending_fences = fenceCount;
-    while (pending_fences) {
-@@ -589,8 +583,7 @@ anv_wait_for_bo_fences(struct anv_device *device,
-             /* These are the fences we really care about.  Go ahead and wait
-              * on it until we hit a timeout.
-              */
--            result = anv_device_wait(device, &impl->bo.bo,
--                                     anv_get_relative_timeout(abs_timeout_ns));
-+            result = anv_device_wait(device, &impl->bo.bo, timeout);
-             switch (result) {
-             case VK_SUCCESS:
-                impl->bo.state = ANV_BO_FENCE_STATE_SIGNALED;
-@@ -629,20 +622,39 @@ anv_wait_for_bo_fences(struct anv_device *device,
-          assert(now_pending_fences <= pending_fences);
- 
-          if (now_pending_fences == pending_fences) {
--            struct timespec abstime = {
--               .tv_sec = abs_timeout_ns / NSEC_PER_SEC,
--               .tv_nsec = abs_timeout_ns % NSEC_PER_SEC,
--            };
-+            struct timespec before;
-+            clock_gettime(CLOCK_MONOTONIC, &before);
-+
-+            uint32_t abs_nsec = before.tv_nsec + timeout % NSEC_PER_SEC;
-+            uint64_t abs_sec = before.tv_sec + (abs_nsec / NSEC_PER_SEC) +
-+                               (timeout / NSEC_PER_SEC);
-+            abs_nsec %= NSEC_PER_SEC;
-+
-+            /* Avoid roll-over in tv_sec on 32-bit systems if the user
-+             * provided timeout is UINT64_MAX
-+             */
-+            struct timespec abstime;
-+            abstime.tv_nsec = abs_nsec;
-+            abstime.tv_sec = MIN2(abs_sec, INT_TYPE_MAX(abstime.tv_sec));
- 
-             MAYBE_UNUSED int ret;
-             ret = pthread_cond_timedwait(&device->queue_submit,
-                                          &device->mutex, &abstime);
-             assert(ret != EINVAL);
--            if (gettime_ns() >= abs_timeout_ns) {
-+
-+            struct timespec after;
-+            clock_gettime(CLOCK_MONOTONIC, &after);
-+            uint64_t time_elapsed =
-+               ((uint64_t)after.tv_sec * NSEC_PER_SEC + after.tv_nsec) -
-+               ((uint64_t)before.tv_sec * NSEC_PER_SEC + before.tv_nsec);
-+
-+            if (time_elapsed >= timeout) {
-                pthread_mutex_unlock(&device->mutex);
-                result = VK_TIMEOUT;
-                goto done;
-             }
-+
-+            timeout -= time_elapsed;
-          }
- 
-          pthread_mutex_unlock(&device->mutex);
-@@ -681,8 +693,9 @@ anv_wait_for_fences(struct anv_device *device,
-          ANV_FROM_HANDLE(anv_fence, fence, pFences[i]);
-          switch (fence->permanent.type) {
-          case ANV_FENCE_TYPE_BO:
--            result = anv_wait_for_bo_fences(device, 1, &pFences[i],
--                                            true, abs_timeout);
-+            result = anv_wait_for_bo_fences(
-+               device, 1, &pFences[i], true,
-+               anv_get_relative_timeout(abs_timeout));
-             break;
-          case ANV_FENCE_TYPE_SYNCOBJ:
-             result = anv_wait_for_syncobj_fences(device, 1, &pFences[i],
-@@ -742,16 +755,15 @@ VkResult anv_WaitForFences(
-    if (anv_device_is_lost(device))
-       return VK_ERROR_DEVICE_LOST;
- 
--   uint64_t abs_timeout = anv_get_absolute_timeout(timeout);
-    if (anv_all_fences_syncobj(fenceCount, pFences)) {
-       return anv_wait_for_syncobj_fences(device, fenceCount, pFences,
--                                         waitAll, abs_timeout);
-+                                         waitAll, anv_get_absolute_timeout(timeout));
-    } else if (anv_all_fences_bo(fenceCount, pFences)) {
-       return anv_wait_for_bo_fences(device, fenceCount, pFences,
--                                    waitAll, abs_timeout);
-+                                    waitAll, timeout);
-    } else {
-       return anv_wait_for_fences(device, fenceCount, pFences,
--                                 waitAll, abs_timeout);
-+                                 waitAll, anv_get_absolute_timeout(timeout));
-    }
- }
- 
--- 
-2.20.1
-
diff --git a/media-libs/arc-mesa/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch b/media-libs/arc-mesa/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
deleted file mode 100644
index 28b149b..0000000
--- a/media-libs/arc-mesa/files/CHROMIUM-disable-intel_miptree_unmap_tiled_memcpy-for-ge.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 5b2c1a3b2cd1ec2e732ad22cc4eddbe6f417d4e2 Mon Sep 17 00:00:00 2001
-From: Gurchetan Singh <gurchetansingh@chromium.org>
-Date: Tue, 2 Apr 2019 18:22:59 -0700
-Subject: [PATCH] HACK: disable intel_miptree_unmap_tiled_memcpy for gen 8
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-For some reason it causes glTexImage failures on auron_paine/auron_yuna
-(but not on Cyan/Samus, or CrOS).
-
-00 pc 00019636  /system/lib/libc.so (memcpy+742)
-01 pc 00adea05  /vendor/lib/dri/i965_dri.so (linear_to_ytiled_faster+2117)
-02 pc 00adceff  /vendor/lib/dri/i965_dri.so (intel_linear_to_tiled+1375)
-03 pc 00adc98a  /vendor/lib/dri/i965_dri.so (_isl_memcpy_linear_to_tiled+250)
-04 pc 00aa9b9e  /vendor/lib/dri/i965_dri.so (isl_memcpy_linear_to_tiled+414)
-05 pc 007f93eb  /vendor/lib/dri/i965_dri.so (intel_miptree_unmap_tiled_memcpy+459)
-06 pc 007f6494  /vendor/lib/dri/i965_dri.so (intel_miptree_unmap+420)
-07 pc 0080879d  /vendor/lib/dri/i965_dri.so (intel_unmap_texture_image+205)
-08 pc 002bf978  /vendor/lib/dri/i965_dri.so (store_texsubimage+2344)
-09 pc 002bfb3a  /vendor/lib/dri/i965_dri.so (_mesa_store_texsubimage+298)
-10 pc 0080b83b  /vendor/lib/dri/i965_dri.so (intel_upload_tex+1275)#11 pc 0080a53f  /vendor/lib/dri/i965_dri.so (intelTexSubImage+799)
-12 pc 002a3a78  /vendor/lib/dri/i965_dri.so (texture_sub_image+728)
-13 pc 00295c2b  /vendor/lib/dri/i965_dri.so (texsubimage_err+1147)
-14 pc 00295e9c  /vendor/lib/dri/i965_dri.so (_mesa_TexSubImage2D+300)
-15 pc 0000c9a4  /vendor/lib/egl/libGLESv2_mesa.so (glTexSubImage2D+212)
-
-Change-Id: Id3730483d9de6b7ede88fe9f31c6175f0a3c4bc3
----
- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-index b4e3524aa51f..feb8f1dbb94c 100644
---- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-+++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
-@@ -3788,7 +3788,7 @@ intel_miptree_map(struct brw_context *brw,
-       intel_miptree_map_depthstencil(brw, mt, map, level, slice);
-    } else if (use_intel_mipree_map_blit(brw, mt, map)) {
-       intel_miptree_map_blit(brw, mt, map, level, slice);
--   } else if (mt->surf.tiling != ISL_TILING_LINEAR && devinfo->gen > 4) {
-+   } else if (mt->surf.tiling != ISL_TILING_LINEAR && devinfo->gen > 8) {
-       intel_miptree_map_tiled_memcpy(brw, mt, map, level, slice);
- #if defined(USE_SSE41)
-    } else if (!(mode & GL_MAP_WRITE_BIT) &&
--- 
-2.20.1
-
diff --git a/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r114.ebuild b/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r114.ebuild
new file mode 100644
index 0000000..ed02ab9
--- /dev/null
+++ b/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r114.ebuild
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "82d90b383f9fe16cd8f88ecf297d788777842b22" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/tools/connector_client camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/tools/connector_client"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="A simple package that exercises cros-camera-libcamera_connector"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="media-libs/cros-camera-libcamera_connector"
+
+DEPEND="${RDEPEND}
+	x11-libs/libdrm"
+
+BDEPEND="virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros_camera_connector_client"
+}
diff --git a/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r70.ebuild b/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r70.ebuild
deleted file mode 100644
index aaa12b7..0000000
--- a/media-libs/cros-camera-connector-client/cros-camera-connector-client-0.0.1-r70.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "0a9e82e85ec545e7f4bbd7afc4e353a6185f25e8" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/tools/connector_client camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/tools/connector_client"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="A simple package that exercises cros-camera-libcamera_connector"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="media-libs/cros-camera-libcamera_connector"
-
-DEPEND="${RDEPEND}
-	x11-libs/libdrm"
-
-BDEPEND="virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/cros_camera_connector_client"
-}
diff --git a/media-libs/cros-camera-connector-client/cros-camera-connector-client-9999.ebuild b/media-libs/cros-camera-connector-client/cros-camera-connector-client-9999.ebuild
index 41afcca..f176190 100644
--- a/media-libs/cros-camera-connector-client/cros-camera-connector-client-9999.ebuild
+++ b/media-libs/cros-camera-connector-client/cros-camera-connector-client-9999.ebuild
@@ -26,5 +26,6 @@
 BDEPEND="virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros_camera_connector_client"
 }
diff --git a/media-libs/cros-camera-effect-portrait-mode/Manifest b/media-libs/cros-camera-effect-portrait-mode/Manifest
new file mode 100644
index 0000000..28fd510
--- /dev/null
+++ b/media-libs/cros-camera-effect-portrait-mode/Manifest
@@ -0,0 +1,2 @@
+DIST portrait-processor-lib-x86_64-2020.04.06.tbz2 27844293 BLAKE2B 17c338737ceceaf3851204e98c0edfe8d3ad0419894e3130ae7a0ad2bbd4f92d8722a2bf8547950ffa973780059428dae77e4c9f8dacd6c48ee62bf4d58c8568 SHA512 1ed2056c20827a419812dfdb0618dc8fd7f70664b61225984af22db8bc6d3b34d02e5cf11df6765c396807eec8f641be7ffe7acc0a2a3c2907709738249e44d7
+DIST portrait-processor-lib-armv7-2020.04.06.tbz2 24954408 BLAKE2B 499950c71321680c24815e2c34d2cec42160311d029f6e5153e7e283d9fde7df442e01b688cc68aa1b19559a1d0c9f6581f7020720dd2546627f183e2ce616d2 SHA512 1a6730d0a2ecdf227c8503c9036e2cc0480f9ee4c6f63fd6b9e7c8b36b898f66afa3651cbb497e63b0a85ad8b4208628340e08d16c3cbfbccaede6ecd3304a1e
diff --git a/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06-r1.ebuild b/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06-r1.ebuild
new file mode 120000
index 0000000..02b5d97
--- /dev/null
+++ b/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06-r1.ebuild
@@ -0,0 +1 @@
+cros-camera-effect-portrait-mode-2020.04.06.ebuild
\ No newline at end of file
diff --git a/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06.ebuild b/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06.ebuild
new file mode 100644
index 0000000..b5b0533
--- /dev/null
+++ b/media-libs/cros-camera-effect-portrait-mode/cros-camera-effect-portrait-mode-2020.04.06.ebuild
@@ -0,0 +1,24 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="Chrome OS camera portrait processor library"
+# Version 2020.04.06: built from cl/304948948
+SRC_URI="
+	amd64? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-x86_64-${PV}.tbz2 )
+	arm? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-armv7-${PV}.tbz2 )
+	"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+S="${WORKDIR}"
+
+src_install() {
+	dolib.so *.so
+
+	insinto /usr/include/cros-camera
+	doins *.h
+}
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r1166.ebuild b/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r1166.ebuild
deleted file mode 100644
index 3272446..0000000
--- a/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r1166.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="34c111af2f5931a49fd79757621c9b0a5b748ec0"
-CROS_WORKON_TREE="e8657f83cdc777c34ad2f3f9485260ba98482060"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_DESTDIR="${S}/platform2"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/hal/intel/ipu6"
-
-inherit cros-camera cros-workon platform udev
-
-DESCRIPTION="Intel IPU6 (Image Processing Unit) Chrome OS camera HAL"
-
-LICENSE="Apache-2.0"
-SLOT="0"
-KEYWORDS="*"
-IUSE="ipu6 ipu6se"
-
-RDEPEND="dev-libs/expat
-	media-libs/cros-camera-libcbm
-	media-libs/cros-camera-libcamera_client
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_exif
-	media-libs/cros-camera-libcamera_metadata
-	media-libs/cros-camera-libcamera_v4l2_device
-	media-libs/libyuv
-	media-libs/libsync"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-libcab
-	sys-kernel/linux-headers
-	media-libs/cros-camera-android-headers
-	virtual/jpeg:0
-	virtual/pkgconfig"
-
-src_unpack() {
-	platform_src_unpack
-	cd "${P}/platform2" || die
-	if [ "${PV}" != "9999" ]; then
-		# Generate the patch under platform2 by 'git format-patch HEAD^'
-		epatch -p1 "${FILESDIR}/0001-intel-ipu6-Add-initial-code.patch"
-	fi
-}
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamhal.so"
-	cros-camera_dohal "${OUT}/lib/libcamhal.so" intel-ipu6.so
-	dolib.so "${OUT}/lib/libcam_algo.so"
-
-	udev_dorules "${FILESDIR}/50-ipu-psys0.rules"
-}
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r2055.ebuild b/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r2055.ebuild
new file mode 100644
index 0000000..80861ed
--- /dev/null
+++ b/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-0.0.1-r2055.ebuild
@@ -0,0 +1,61 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="82a9ae89ce2c3e5ea62f38105c55defd9acddf20"
+CROS_WORKON_TREE="4397dc7913c7bcfed4ebf7ad82e425f6c20644d4"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_DESTDIR="${S}/platform2"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal/intel/ipu6"
+
+inherit cros-camera cros-workon platform udev
+
+DESCRIPTION="Intel IPU6 (Image Processing Unit) Chrome OS camera HAL"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE="ipu6 ipu6se"
+
+RDEPEND="dev-libs/expat
+	media-libs/cros-camera-libcbm
+	media-libs/cros-camera-libcamera_client
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_exif
+	media-libs/cros-camera-libcamera_metadata
+	media-libs/cros-camera-libcamera_v4l2_device
+	ipu6se? ( x11-libs/libva-intel-media-driver )
+	media-libs/libyuv
+	media-libs/libsync"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-libcab
+	sys-kernel/linux-headers
+	media-libs/cros-camera-android-headers
+	virtual/jpeg:0
+	virtual/pkgconfig"
+
+src_unpack() {
+	platform_src_unpack
+	cd "${P}/platform2" || die
+	# Generate the patches under platform2 by 'git format-patch <parent_commit>'
+	eapply "${FILESDIR}/0001-intel-ipu6-Add-initial-code-1st-part.patch"
+	eapply "${FILESDIR}/0002-intel-ipu6-Add-initial-code-2nd-part.patch"
+}
+
+src_install() {
+	dolib.so "${OUT}/lib/libcamhal.so"
+	cros-camera_dohal "${OUT}/lib/libcamhal.so" intel-ipu6.so
+	dolib.so "${OUT}/lib/libcam_algo.so"
+
+	if use ipu6se; then
+		dolib.so "${OUT}/lib/libcam_gpu_algo.so"
+	fi
+
+	udev_dorules "${FILESDIR}/50-ipu-psys0.rules"
+	udev_dorules "${FILESDIR}/99-mipicam.rules"
+}
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-9999.ebuild b/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-9999.ebuild
index fe9ac20..fda3002 100644
--- a/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-9999.ebuild
+++ b/media-libs/cros-camera-hal-intel-ipu6-squash/cros-camera-hal-intel-ipu6-squash-9999.ebuild
@@ -26,6 +26,7 @@
 	media-libs/cros-camera-libcamera_exif
 	media-libs/cros-camera-libcamera_metadata
 	media-libs/cros-camera-libcamera_v4l2_device
+	ipu6se? ( x11-libs/libva-intel-media-driver )
 	media-libs/libyuv
 	media-libs/libsync"
 
@@ -39,10 +40,9 @@
 src_unpack() {
 	platform_src_unpack
 	cd "${P}/platform2" || die
-	if [ "${PV}" != "9999" ]; then
-		# Generate the patch under platform2 by 'git format-patch HEAD^'
-		epatch -p1 "${FILESDIR}/0001-intel-ipu6-Add-initial-code.patch"
-	fi
+	# Generate the patches under platform2 by 'git format-patch <parent_commit>'
+	eapply "${FILESDIR}/0001-intel-ipu6-Add-initial-code-1st-part.patch"
+	eapply "${FILESDIR}/0002-intel-ipu6-Add-initial-code-2nd-part.patch"
 }
 
 src_install() {
@@ -50,5 +50,10 @@
 	cros-camera_dohal "${OUT}/lib/libcamhal.so" intel-ipu6.so
 	dolib.so "${OUT}/lib/libcam_algo.so"
 
+	if use ipu6se; then
+		dolib.so "${OUT}/lib/libcam_gpu_algo.so"
+	fi
+
 	udev_dorules "${FILESDIR}/50-ipu-psys0.rules"
+	udev_dorules "${FILESDIR}/99-mipicam.rules"
 }
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code-1st-part.patch b/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code-1st-part.patch
new file mode 100644
index 0000000..90fe2a5
--- /dev/null
+++ b/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code-1st-part.patch
@@ -0,0 +1,84982 @@
+From fe9b736c010223bfbaed42e4587d37f50a604a77 Mon Sep 17 00:00:00 2001
+From: Tianshu Qiu <tian.shu.qiu@intel.com>
+Date: Wed, 30 Oct 2019 10:03:39 +0800
+Subject: [PATCH] intel:ipu6: Add initial code (1st part)
+
+Add initial code in src/platform2/camera/hal/intel/ipu6
+1.HAL code
+2.3a header file
+3.ia_xxx files are not included in this patch.
+
+Change-Id: Ie8fbf5df647e72c2733a67c07d82f9d565b17d1a
+Signed-off-by: Tianshu Qiu <tian.shu.qiu@intel.com>
+---
+ camera/hal/intel/ipu6/BUILD.gn                |  475 +++
+ .../hal/intel/ipu6/aal/Camera3AMetadata.cpp   |  132 +
+ camera/hal/intel/ipu6/aal/Camera3AMetadata.h  |   51 +
+ camera/hal/intel/ipu6/aal/Camera3HAL.cpp      |  249 ++
+ camera/hal/intel/ipu6/aal/Camera3HAL.h        |   68 +
+ .../hal/intel/ipu6/aal/Camera3HALModule.cpp   |  299 ++
+ camera/hal/intel/ipu6/aal/Camera3Stream.cpp   |  653 ++++
+ camera/hal/intel/ipu6/aal/Camera3Stream.h     |  177 ++
+ camera/hal/intel/ipu6/aal/HALv3Interface.h    |   32 +
+ camera/hal/intel/ipu6/aal/HALv3Utils.cpp      |  161 +
+ camera/hal/intel/ipu6/aal/HALv3Utils.h        |   78 +
+ .../intel/ipu6/aal/IntelAEStateMachine.cpp    |  285 ++
+ .../hal/intel/ipu6/aal/IntelAEStateMachine.h  |  136 +
+ .../intel/ipu6/aal/IntelAFStateMachine.cpp    |  415 +++
+ .../hal/intel/ipu6/aal/IntelAFStateMachine.h  |  142 +
+ .../intel/ipu6/aal/IntelAWBStateMachine.cpp   |  214 ++
+ .../hal/intel/ipu6/aal/IntelAWBStateMachine.h |  134 +
+ camera/hal/intel/ipu6/aal/MetadataConvert.cpp | 2247 ++++++++++++++
+ camera/hal/intel/ipu6/aal/MetadataConvert.h   |  142 +
+ camera/hal/intel/ipu6/aal/PostProcessor.cpp   |  193 ++
+ camera/hal/intel/ipu6/aal/PostProcessor.h     |   60 +
+ camera/hal/intel/ipu6/aal/RequestManager.cpp  |  788 +++++
+ camera/hal/intel/ipu6/aal/RequestManager.h    |  115 +
+ camera/hal/intel/ipu6/aal/ResultProcessor.cpp |  512 ++++
+ camera/hal/intel/ipu6/aal/ResultProcessor.h   |  196 ++
+ .../hal/intel/ipu6/aal/chrome/HALv3Header.h   |   20 +
+ camera/hal/intel/ipu6/include/api/ICamera.h   |  578 ++++
+ .../hal/intel/ipu6/include/api/Parameters.h   | 2630 ++++++++++++++++
+ camera/hal/intel/ipu6/include/cameranvm.h     |  112 +
+ .../hal/intel/ipu6/include/linux/ipu-isys.h   |   51 +
+ .../intel/ipu6/include/utils/ScopedAtrace.h   |   73 +
+ .../ipu6/modules/algowrapper/IntelAiq.cpp     |  131 +
+ .../intel/ipu6/modules/algowrapper/IntelAiq.h |   49 +
+ .../ipu6/modules/algowrapper/IntelCmc.cpp     |   62 +
+ .../intel/ipu6/modules/algowrapper/IntelCmc.h |   38 +
+ .../ipu6/modules/algowrapper/IntelDvs.cpp     |  186 ++
+ .../intel/ipu6/modules/algowrapper/IntelDvs.h |   55 +
+ .../algowrapper/IntelFaceDetection.cpp        |  141 +
+ .../modules/algowrapper/IntelFaceDetection.h  |   44 +
+ .../algowrapper/IntelIspParamAdaptor.cpp      |  140 +
+ .../algowrapper/IntelIspParamAdaptor.h        |   44 +
+ .../ipu6/modules/algowrapper/IntelLard.cpp    |   71 +
+ .../ipu6/modules/algowrapper/IntelLard.h      |   34 +
+ .../ipu6/modules/algowrapper/IntelLtm.cpp     |   64 +
+ .../intel/ipu6/modules/algowrapper/IntelLtm.h |   32 +
+ .../ipu6/modules/algowrapper/IntelMkn.cpp     |   69 +
+ .../intel/ipu6/modules/algowrapper/IntelMkn.h |   35 +
+ .../ipu6/modules/algowrapper/IntelPGParam.cpp | 1196 ++++++++
+ .../ipu6/modules/algowrapper/IntelPGParam.h   |  237 ++
+ .../ipu6/modules/algowrapper/IntelTNR7US.cpp  |  190 ++
+ .../ipu6/modules/algowrapper/IntelTNR7US.h    |  108 +
+ .../ipu6/modules/algowrapper/StatsTypes.h     |   46 +
+ .../algowrapper/graph/GraphConfigImpl.cpp     |  859 ++++++
+ .../algowrapper/graph/GraphConfigImpl.h       |  183 ++
+ .../algowrapper/graph/GraphConfigPipe.cpp     | 2008 ++++++++++++
+ .../algowrapper/graph/GraphConfigPipe.h       |  313 ++
+ .../ipu6/modules/memory/Camera3BufferPool.cpp |  127 +
+ .../ipu6/modules/memory/Camera3BufferPool.h   |   53 +
+ .../modules/memory/chrome/Camera3Buffer.cpp   |  527 ++++
+ .../modules/memory/chrome/Camera3Buffer.h     |  159 +
+ .../ipu6/modules/sandboxing/IPCCommon.cpp     |  116 +
+ .../intel/ipu6/modules/sandboxing/IPCCommon.h |  125 +
+ .../modules/sandboxing/IPCGraphConfig.cpp     |  490 +++
+ .../ipu6/modules/sandboxing/IPCGraphConfig.h  |  171 ++
+ .../ipu6/modules/sandboxing/IPCIntelAiq.cpp   | 1121 +++++++
+ .../ipu6/modules/sandboxing/IPCIntelAiq.h     |  351 +++
+ .../ipu6/modules/sandboxing/IPCIntelCmc.cpp   |  258 ++
+ .../ipu6/modules/sandboxing/IPCIntelCmc.h     |   95 +
+ .../ipu6/modules/sandboxing/IPCIntelDvs.cpp   |  704 +++++
+ .../ipu6/modules/sandboxing/IPCIntelDvs.h     |  239 ++
+ .../ipu6/modules/sandboxing/IPCIntelFD.cpp    |   63 +
+ .../ipu6/modules/sandboxing/IPCIntelFD.h      |   32 +
+ .../ipu6/modules/sandboxing/IPCIntelLard.cpp  |  298 ++
+ .../ipu6/modules/sandboxing/IPCIntelLard.h    |  104 +
+ .../ipu6/modules/sandboxing/IPCIntelLtm.cpp   |  331 ++
+ .../ipu6/modules/sandboxing/IPCIntelLtm.h     |  117 +
+ .../ipu6/modules/sandboxing/IPCIntelMkn.cpp   |   79 +
+ .../ipu6/modules/sandboxing/IPCIntelMkn.h     |   62 +
+ .../modules/sandboxing/IPCIntelPGParam.cpp    |  543 ++++
+ .../ipu6/modules/sandboxing/IPCIntelPGParam.h |  180 ++
+ .../modules/sandboxing/IPCIspParamAdaptor.cpp |  554 ++++
+ .../modules/sandboxing/IPCIspParamAdaptor.h   |  170 ++
+ .../sandboxing/client/GraphConfigImpl.cpp     |  186 ++
+ .../sandboxing/client/GraphConfigImpl.h       |   75 +
+ .../modules/sandboxing/client/IntelAiq.cpp    |  319 ++
+ .../ipu6/modules/sandboxing/client/IntelAiq.h |   70 +
+ .../sandboxing/client/IntelAlgoClient.cpp     |  432 +++
+ .../sandboxing/client/IntelAlgoClient.h       |  134 +
+ .../sandboxing/client/IntelAlgoCommon.cpp     |  131 +
+ .../sandboxing/client/IntelAlgoCommon.h       |   63 +
+ .../modules/sandboxing/client/IntelCmc.cpp    |  107 +
+ .../ipu6/modules/sandboxing/client/IntelCmc.h |   58 +
+ .../modules/sandboxing/client/IntelDvs.cpp    |  336 ++
+ .../ipu6/modules/sandboxing/client/IntelDvs.h |   78 +
+ .../sandboxing/client/IntelFaceDetection.cpp  |  121 +
+ .../sandboxing/client/IntelFaceDetection.h    |   48 +
+ .../client/IntelIspParamAdaptor.cpp           |  196 ++
+ .../sandboxing/client/IntelIspParamAdaptor.h  |   59 +
+ .../modules/sandboxing/client/IntelLard.cpp   |  137 +
+ .../modules/sandboxing/client/IntelLard.h     |   52 +
+ .../modules/sandboxing/client/IntelLtm.cpp    |  133 +
+ .../ipu6/modules/sandboxing/client/IntelLtm.h |   53 +
+ .../modules/sandboxing/client/IntelMkn.cpp    |  119 +
+ .../ipu6/modules/sandboxing/client/IntelMkn.h |   54 +
+ .../sandboxing/client/IntelPGParam.cpp        |  294 ++
+ .../modules/sandboxing/client/IntelPGParam.h  |   71 +
+ .../modules/sandboxing/client/IntelTNR7US.cpp |  162 +
+ .../modules/sandboxing/client/IntelTNR7US.h   |   54 +
+ .../sandboxing/server/GraphConfigServer.cpp   |  164 +
+ .../sandboxing/server/GraphConfigServer.h     |   44 +
+ .../sandboxing/server/IntelAiqServer.cpp      |  327 ++
+ .../sandboxing/server/IntelAiqServer.h        |   49 +
+ .../sandboxing/server/IntelAlgoServer.cpp     |  241 ++
+ .../sandboxing/server/IntelAlgoServer.h       |  106 +
+ .../sandboxing/server/IntelCPUAlgoServer.cpp  |  307 ++
+ .../sandboxing/server/IntelCPUAlgoServer.h    |   63 +
+ .../sandboxing/server/IntelCmcServer.cpp      |   91 +
+ .../sandboxing/server/IntelCmcServer.h        |   40 +
+ .../sandboxing/server/IntelDvsServer.cpp      |  312 ++
+ .../sandboxing/server/IntelDvsServer.h        |   54 +
+ .../sandboxing/server/IntelFDServer.cpp       |   63 +
+ .../modules/sandboxing/server/IntelFDServer.h |   39 +
+ .../sandboxing/server/IntelGPUAlgoServer.cpp  |  110 +
+ .../sandboxing/server/IntelGPUAlgoServer.h    |   50 +
+ .../sandboxing/server/IntelLardServer.cpp     |  112 +
+ .../sandboxing/server/IntelLardServer.h       |   39 +
+ .../sandboxing/server/IntelLtmServer.cpp      |  105 +
+ .../sandboxing/server/IntelLtmServer.h        |   40 +
+ .../sandboxing/server/IntelMknServer.cpp      |  124 +
+ .../sandboxing/server/IntelMknServer.h        |   45 +
+ .../sandboxing/server/IntelPGParamServer.cpp  |  229 ++
+ .../sandboxing/server/IntelPGParamServer.h    |   56 +
+ .../sandboxing/server/IntelTNRServer.cpp      |   71 +
+ .../sandboxing/server/IntelTNRServer.h        |   41 +
+ .../server/IspParamAdaptorServer.cpp          |  155 +
+ .../sandboxing/server/IspParamAdaptorServer.h |   44 +
+ camera/hal/intel/ipu6/src/3a/AiqCore.cpp      |  961 ++++++
+ camera/hal/intel/ipu6/src/3a/AiqCore.h        |  214 ++
+ camera/hal/intel/ipu6/src/3a/AiqEngine.cpp    |  522 ++++
+ camera/hal/intel/ipu6/src/3a/AiqEngine.h      |  149 +
+ camera/hal/intel/ipu6/src/3a/AiqResult.cpp    |  182 ++
+ camera/hal/intel/ipu6/src/3a/AiqResult.h      |  109 +
+ .../intel/ipu6/src/3a/AiqResultStorage.cpp    |  286 ++
+ .../hal/intel/ipu6/src/3a/AiqResultStorage.h  |  246 ++
+ camera/hal/intel/ipu6/src/3a/AiqSetting.cpp   |  379 +++
+ camera/hal/intel/ipu6/src/3a/AiqSetting.h     |  155 +
+ .../hal/intel/ipu6/src/3a/AiqStatistics.cpp   |  147 +
+ camera/hal/intel/ipu6/src/3a/AiqStatistics.h  |   58 +
+ camera/hal/intel/ipu6/src/3a/AiqUnit.cpp      |  257 ++
+ camera/hal/intel/ipu6/src/3a/AiqUnit.h        |  155 +
+ camera/hal/intel/ipu6/src/3a/AiqUtils.cpp     |  660 ++++
+ camera/hal/intel/ipu6/src/3a/AiqUtils.h       |  185 ++
+ camera/hal/intel/ipu6/src/3a/Dvs.cpp          |  616 ++++
+ camera/hal/intel/ipu6/src/3a/Dvs.h            |  119 +
+ camera/hal/intel/ipu6/src/3a/DvsResult.cpp    |  105 +
+ camera/hal/intel/ipu6/src/3a/DvsResult.h      |   48 +
+ .../intel/ipu6/src/3a/I3AControlFactory.cpp   |   35 +
+ .../hal/intel/ipu6/src/3a/I3AControlFactory.h |   44 +
+ camera/hal/intel/ipu6/src/3a/ImagingControl.h |   46 +
+ camera/hal/intel/ipu6/src/3a/LensManager.cpp  |  101 +
+ camera/hal/intel/ipu6/src/3a/LensManager.h    |   77 +
+ camera/hal/intel/ipu6/src/3a/Ltm.cpp          |  545 ++++
+ camera/hal/intel/ipu6/src/3a/Ltm.h            |  185 ++
+ camera/hal/intel/ipu6/src/3a/MakerNote.cpp    |  126 +
+ camera/hal/intel/ipu6/src/3a/MakerNote.h      |  116 +
+ .../hal/intel/ipu6/src/3a/SensorManager.cpp   |  327 ++
+ camera/hal/intel/ipu6/src/3a/SensorManager.h  |  111 +
+ .../ipu6/src/3a/intel3a/Intel3AParameter.cpp  |  714 +++++
+ .../ipu6/src/3a/intel3a/Intel3AParameter.h    |  104 +
+ .../hal/intel/ipu6/src/core/BufferQueue.cpp   |  286 ++
+ camera/hal/intel/ipu6/src/core/BufferQueue.h  |  206 ++
+ .../hal/intel/ipu6/src/core/CameraBuffer.cpp  |  407 +++
+ camera/hal/intel/ipu6/src/core/CameraBuffer.h |  170 ++
+ .../hal/intel/ipu6/src/core/CameraDevice.cpp  | 1182 ++++++++
+ camera/hal/intel/ipu6/src/core/CameraDevice.h |  284 ++
+ .../hal/intel/ipu6/src/core/CameraEvent.cpp   |   84 +
+ camera/hal/intel/ipu6/src/core/CameraEvent.h  |   50 +
+ .../hal/intel/ipu6/src/core/CameraEventType.h |  111 +
+ .../hal/intel/ipu6/src/core/CameraStream.cpp  |  239 ++
+ camera/hal/intel/ipu6/src/core/CameraStream.h |  118 +
+ .../hal/intel/ipu6/src/core/CaptureUnit.cpp   |  477 +++
+ camera/hal/intel/ipu6/src/core/CaptureUnit.h  |  194 ++
+ camera/hal/intel/ipu6/src/core/DeviceBase.cpp |  442 +++
+ camera/hal/intel/ipu6/src/core/DeviceBase.h   |  171 ++
+ .../intel/ipu6/src/core/IspParamAdaptor.cpp   |  964 ++++++
+ .../hal/intel/ipu6/src/core/IspParamAdaptor.h |  153 +
+ camera/hal/intel/ipu6/src/core/IspSettings.h  |   46 +
+ camera/hal/intel/ipu6/src/core/LensHw.cpp     |  159 +
+ camera/hal/intel/ipu6/src/core/LensHw.h       |   63 +
+ .../hal/intel/ipu6/src/core/PSysProcessor.cpp |  903 ++++++
+ .../hal/intel/ipu6/src/core/PSysProcessor.h   |  133 +
+ .../intel/ipu6/src/core/ProcessorManager.cpp  |  125 +
+ .../intel/ipu6/src/core/ProcessorManager.h    |   71 +
+ .../hal/intel/ipu6/src/core/RequestThread.cpp |  542 ++++
+ .../hal/intel/ipu6/src/core/RequestThread.h   |  154 +
+ .../hal/intel/ipu6/src/core/SensorHwCtrl.cpp  |  331 ++
+ camera/hal/intel/ipu6/src/core/SensorHwCtrl.h |   99 +
+ camera/hal/intel/ipu6/src/core/SofSource.cpp  |  201 ++
+ camera/hal/intel/ipu6/src/core/SofSource.h    |   63 +
+ camera/hal/intel/ipu6/src/core/StreamSource.h |   48 +
+ .../intel/ipu6/src/core/SwImageProcessor.cpp  |  158 +
+ .../intel/ipu6/src/core/SwImageProcessor.h    |   46 +
+ .../hal/intel/ipu6/src/core/SyncManager.cpp   |  198 ++
+ camera/hal/intel/ipu6/src/core/SyncManager.h  |   58 +
+ camera/hal/intel/ipu6/src/core/TNRCommon.h    |   45 +
+ .../src/core/psysprocessor/GPUExecutor.cpp    |  482 +++
+ .../ipu6/src/core/psysprocessor/GPUExecutor.h |   60 +
+ .../ipu6/src/core/psysprocessor/PGCommon.cpp  | 1235 ++++++++
+ .../ipu6/src/core/psysprocessor/PGCommon.h    |  240 ++
+ .../ipu6/src/core/psysprocessor/PGUtils.cpp   |  194 ++
+ .../ipu6/src/core/psysprocessor/PGUtils.h     |   86 +
+ .../ipu6/src/core/psysprocessor/PSysDAG.cpp   |  759 +++++
+ .../ipu6/src/core/psysprocessor/PSysDAG.h     |  155 +
+ .../core/psysprocessor/PipeLiteExecutor.cpp   | 1127 +++++++
+ .../src/core/psysprocessor/PipeLiteExecutor.h |  191 ++
+ .../src/core/psysprocessor/PolicyManager.cpp  |  168 +
+ .../src/core/psysprocessor/PolicyManager.h    |   79 +
+ camera/hal/intel/ipu6/src/fd/FaceBase.h       |   81 +
+ .../hal/intel/ipu6/src/fd/FaceDetection.cpp   |  530 ++++
+ camera/hal/intel/ipu6/src/fd/FaceDetection.h  |  120 +
+ camera/hal/intel/ipu6/src/hal/CameraHal.cpp   |  268 ++
+ camera/hal/intel/ipu6/src/hal/CameraHal.h     |   85 +
+ camera/hal/intel/ipu6/src/hal/ICamera.cpp     |  371 +++
+ .../ipu6/src/image_process/IImageProcessor.h  |   46 +
+ .../ipu6/src/image_process/ImageConverter.cpp |  799 +++++
+ .../ipu6/src/image_process/ImageConverter.h   |   59 +
+ .../src/image_process/ImageScalerCore.cpp     |  959 ++++++
+ .../ipu6/src/image_process/ImageScalerCore.h  |   78 +
+ .../src/image_process/PostProcessorBase.cpp   |  318 ++
+ .../src/image_process/PostProcessorBase.h     |  118 +
+ .../src/image_process/PostProcessorCore.cpp   |  141 +
+ .../src/image_process/PostProcessorCore.h     |   68 +
+ .../ipu6/src/image_process/ProcessType.h      |   30 +
+ .../chrome/ImageProcessorCore.cpp             |  234 ++
+ .../image_process/chrome/ImageProcessorCore.h |   44 +
+ .../hal/intel/ipu6/src/iutils/CameraDump.cpp  |  409 +++
+ camera/hal/intel/ipu6/src/iutils/CameraDump.h |  170 ++
+ .../hal/intel/ipu6/src/iutils/CameraLog.cpp   |  270 ++
+ camera/hal/intel/ipu6/src/iutils/CameraLog.h  |  206 ++
+ camera/hal/intel/ipu6/src/iutils/Errors.h     |   65 +
+ camera/hal/intel/ipu6/src/iutils/RWLock.h     |   98 +
+ .../intel/ipu6/src/iutils/ScopedAtrace.cpp    |   63 +
+ .../ipu6/src/iutils/SwImageConverter.cpp      |  406 +++
+ .../intel/ipu6/src/iutils/SwImageConverter.h  |   42 +
+ camera/hal/intel/ipu6/src/iutils/Thread.cpp   |  222 ++
+ camera/hal/intel/ipu6/src/iutils/Thread.h     |  198 ++
+ camera/hal/intel/ipu6/src/iutils/Trace.cpp    |   54 +
+ camera/hal/intel/ipu6/src/iutils/Trace.h      |  241 ++
+ camera/hal/intel/ipu6/src/iutils/Utils.cpp    |  740 +++++
+ camera/hal/intel/ipu6/src/iutils/Utils.h      |  277 ++
+ camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp  |  620 ++++
+ camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h    |   72 +
+ .../hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp  |   57 +
+ camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h |   68 +
+ camera/hal/intel/ipu6/src/jpeg/Exif.h         |  343 +++
+ .../hal/intel/ipu6/src/jpeg/ExifCreater.cpp   |  542 ++++
+ camera/hal/intel/ipu6/src/jpeg/ExifCreater.h  |  114 +
+ camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h |   78 +
+ camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp  |  222 ++
+ camera/hal/intel/ipu6/src/jpeg/JpegMaker.h    |   56 +
+ .../ipu6/src/jpeg/chrome/JpegEncoderCore.cpp  |   74 +
+ .../ipu6/src/jpeg/chrome/JpegEncoderCore.h    |   41 +
+ .../intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp  |  740 +++++
+ .../intel/ipu6/src/jpeg/sw/SWJpegEncoder.h    |  186 ++
+ .../ipu6/src/metadata/CameraMetadata.cpp      |  435 +++
+ .../intel/ipu6/src/metadata/CameraMetadata.h  |  200 ++
+ .../ipu6/src/metadata/ParameterGenerator.cpp  |  381 +++
+ .../ipu6/src/metadata/ParameterGenerator.h    |  110 +
+ .../ipu6/src/metadata/ParameterHelper.cpp     |   84 +
+ .../intel/ipu6/src/metadata/ParameterHelper.h |  142 +
+ .../intel/ipu6/src/metadata/Parameters.cpp    | 2026 +++++++++++++
+ .../src/metadata/icamera_metadata_base.cpp    |  976 ++++++
+ .../ipu6/src/metadata/icamera_metadata_base.h |  445 +++
+ .../src/metadata/icamera_metadata_tag_info.c  | 2698 +++++++++++++++++
+ .../ipu6/src/metadata/icamera_metadata_tags.h | 1019 +++++++
+ .../ipu6/src/platformdata/AiqInitData.cpp     |  583 ++++
+ .../intel/ipu6/src/platformdata/AiqInitData.h |  235 ++
+ .../ipu6/src/platformdata/CameraParser.cpp    | 1903 ++++++++++++
+ .../ipu6/src/platformdata/CameraParser.h      |  127 +
+ .../intel/ipu6/src/platformdata/CameraTypes.h |  228 ++
+ .../ipu6/src/platformdata/ParserBase.cpp      |  165 +
+ .../intel/ipu6/src/platformdata/ParserBase.h  |  102 +
+ .../ipu6/src/platformdata/PlatformData.cpp    | 1369 +++++++++
+ .../ipu6/src/platformdata/PlatformData.h      | 1159 +++++++
+ .../ipu6/src/platformdata/PolicyParser.cpp    |  226 ++
+ .../ipu6/src/platformdata/PolicyParser.h      |   73 +
+ .../ipu6/src/platformdata/gc/FormatUtils.cpp  |  338 +++
+ .../ipu6/src/platformdata/gc/FormatUtils.h    |   34 +
+ .../ipu6/src/platformdata/gc/GraphConfig.cpp  |  199 ++
+ .../ipu6/src/platformdata/gc/GraphConfig.h    |   88 +
+ .../platformdata/gc/GraphConfigManager.cpp    |  179 ++
+ .../src/platformdata/gc/GraphConfigManager.h  |   85 +
+ .../ipu6/src/platformdata/gc/GraphUtils.cpp   |  112 +
+ .../ipu6/src/platformdata/gc/GraphUtils.h     |   27 +
+ .../ipu6/src/platformdata/gc/HalStream.h      |   74 +
+ .../ipu6/src/platformdata/gc/IGraphConfig.h   |  203 ++
+ .../src/platformdata/gc/IGraphConfigManager.h |   43 +
+ .../src/platformdata/gc/custom_gcss_keys.h    |   50 +
+ .../hal/intel/ipu6/src/v4l2/MediaControl.cpp  | 1155 +++++++
+ camera/hal/intel/ipu6/src/v4l2/MediaControl.h |  305 ++
+ camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp   |   53 +
+ camera/hal/intel/ipu6/src/v4l2/NodeInfo.h     |   50 +
+ camera/hal/intel/ipu6/src/v4l2/SysCall.cpp    |  212 ++
+ camera/hal/intel/ipu6/src/v4l2/SysCall.h      |   87 +
+ .../intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp |  126 +
+ .../intel/ipu6/src/v4l2/V4l2DeviceFactory.h   |   61 +
+ 306 files changed, 82516 insertions(+)
+ create mode 100644 camera/hal/intel/ipu6/BUILD.gn
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.h
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.h
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.h
+ create mode 100644 camera/hal/intel/ipu6/aal/HALv3Interface.h
+ create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.h
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
+ create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.h
+ create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.h
+ create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.h
+ create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.cpp
+ create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.h
+ create mode 100644 camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
+ create mode 100644 camera/hal/intel/ipu6/include/api/ICamera.h
+ create mode 100644 camera/hal/intel/ipu6/include/api/Parameters.h
+ create mode 100644 camera/hal/intel/ipu6/include/cameranvm.h
+ create mode 100644 camera/hal/intel/ipu6/include/linux/ipu-isys.h
+ create mode 100644 camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
+ create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
+ create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/ImagingControl.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraEventType.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/IspSettings.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/StreamSource.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/TNRCommon.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/fd/FaceBase.h
+ create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.h
+ create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.h
+ create mode 100644 camera/hal/intel/ipu6/src/hal/ICamera.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageScalerCore.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageScalerCore.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/ProcessType.h
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Errors.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/RWLock.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.h
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/Exif.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/Parameters.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
+ create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
+ create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.h
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.h
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
+ create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
+
+diff --git a/camera/hal/intel/ipu6/BUILD.gn b/camera/hal/intel/ipu6/BUILD.gn
+new file mode 100644
+index 000000000000..c63fdd8413d7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/BUILD.gn
+@@ -0,0 +1,475 @@
++#
++#  Copyright (C) 2019-2020 Intel Corporation
++#
++#  Licensed under the Apache License, Version 2.0 (the "License");
++#  you may not use this file except in compliance with the License.
++#  You may obtain a copy of the License at
++#
++#       http://www.apache.org/licenses/LICENSE-2.0
++#
++#  Unless required by applicable law or agreed to in writing, software
++#  distributed under the License is distributed on an "AS IS" BASIS,
++#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++#  See the License for the specific language governing permissions and
++#  limitations under the License.
++#
++
++group("all") {
++  deps = [
++    ":libcam_algo",
++    ":libcamhal",
++  ]
++  if (use.ipu6se) {
++    deps += [
++      ":libcam_gpu_algo",
++    ]
++  }
++}
++
++shared_library("libcamhal") {
++  sources = [
++    "aal/Camera3AMetadata.cpp",
++    "aal/Camera3HAL.cpp",
++    "aal/Camera3HALModule.cpp",
++    "aal/Camera3Stream.cpp",
++    "aal/HALv3Utils.cpp",
++    "aal/IntelAEStateMachine.cpp",
++    "aal/IntelAFStateMachine.cpp",
++    "aal/IntelAWBStateMachine.cpp",
++    "aal/MetadataConvert.cpp",
++    "aal/PostProcessor.cpp",
++    "aal/RequestManager.cpp",
++    "aal/ResultProcessor.cpp",
++    "modules/ia_cipr/src/Buffer.cpp",
++    "modules/ia_cipr/src/Command.cpp",
++    "modules/ia_cipr/src/Context.cpp",
++    "modules/ia_cipr/src/Event.cpp",
++    "modules/ia_cipr/src/Utils.cpp",
++    "modules/sandboxing/client/IntelAlgoClient.cpp",
++    "modules/sandboxing/client/IntelAlgoCommon.cpp",
++    "modules/sandboxing/client/IntelLard.cpp",
++    "modules/sandboxing/client/IntelFaceDetection.cpp",
++    "modules/sandboxing/client/GraphConfigImpl.cpp",
++    "modules/sandboxing/client/IntelCmc.cpp",
++    "modules/sandboxing/client/IntelMkn.cpp",
++    "modules/sandboxing/client/IntelLtm.cpp",
++    "modules/sandboxing/client/IntelAiq.cpp",
++    "modules/sandboxing/client/IntelDvs.cpp",
++    "modules/sandboxing/client/IntelIspParamAdaptor.cpp",
++    "modules/sandboxing/client/IntelPGParam.cpp",
++    "modules/sandboxing/IPCCommon.cpp",
++    "modules/sandboxing/IPCIntelLard.cpp",
++    "modules/sandboxing/IPCIntelFD.cpp",
++    "modules/sandboxing/IPCGraphConfig.cpp",
++    "modules/sandboxing/IPCIntelCmc.cpp",
++    "modules/sandboxing/IPCIntelMkn.cpp",
++    "modules/sandboxing/IPCIntelLtm.cpp",
++    "modules/sandboxing/IPCIntelAiq.cpp",
++    "modules/sandboxing/IPCIntelDvs.cpp",
++    "modules/sandboxing/IPCIspParamAdaptor.cpp",
++    "modules/sandboxing/IPCIntelPGParam.cpp",
++    "modules/memory/Camera3BufferPool.cpp",
++    "modules/memory/chrome/Camera3Buffer.cpp",
++    "src/3a/AiqCore.cpp",
++    "src/3a/AiqEngine.cpp",
++    "src/3a/AiqResult.cpp",
++    "src/3a/AiqResultStorage.cpp",
++    "src/3a/AiqSetting.cpp",
++    "src/3a/AiqStatistics.cpp",
++    "src/3a/AiqUnit.cpp",
++    "src/3a/AiqUtils.cpp",
++    "src/3a/I3AControlFactory.cpp",
++    "src/3a/DvsResult.cpp",
++    "src/3a/Dvs.cpp",
++    "src/3a/MakerNote.cpp",
++    "src/3a/LensManager.cpp",
++    "src/3a/Ltm.cpp",
++    "src/3a/SensorManager.cpp",
++    "src/3a/intel3a/Intel3AParameter.cpp",
++    "src/core/BufferQueue.cpp",
++    "src/core/CameraBuffer.cpp",
++    "src/core/CameraDevice.cpp",
++    "src/core/CameraEvent.cpp",
++    "src/core/CameraStream.cpp",
++    "src/core/CaptureUnit.cpp",
++    "src/core/DeviceBase.cpp",
++    "src/core/IspParamAdaptor.cpp",
++    "src/core/LensHw.cpp",
++    "src/core/PSysProcessor.cpp",
++    "src/core/ProcessorManager.cpp",
++    "src/core/RequestThread.cpp",
++    "src/core/SensorHwCtrl.cpp",
++    "src/core/SofSource.cpp",
++    "src/core/SwImageProcessor.cpp",
++    "src/core/SyncManager.cpp",
++    "src/core/psysprocessor/PGCommon.cpp",
++    "src/core/psysprocessor/PGUtils.cpp",
++    "src/core/psysprocessor/PSysDAG.cpp",
++    "src/core/psysprocessor/PipeLiteExecutor.cpp",
++    "src/core/psysprocessor/PolicyManager.cpp",
++    "src/fd/FaceDetection.cpp",
++    "src/hal/CameraHal.cpp",
++    "src/hal/ICamera.cpp",
++    "src/image_process/ImageConverter.cpp",
++    "src/image_process/ImageScalerCore.cpp",
++    "src/image_process/PostProcessorBase.cpp",
++    "src/image_process/PostProcessorCore.cpp",
++    "src/image_process/chrome/ImageProcessorCore.cpp",
++    "src/iutils/CameraDump.cpp",
++    "src/iutils/CameraLog.cpp",
++    "src/iutils/ScopedAtrace.cpp",
++    "src/iutils/SwImageConverter.cpp",
++    "src/iutils/Thread.cpp",
++    "src/iutils/Trace.cpp",
++    "src/iutils/Utils.cpp",
++    "src/jpeg/EXIFMaker.cpp",
++    "src/jpeg/EXIFMetaData.cpp",
++    "src/jpeg/ExifCreater.cpp",
++    "src/jpeg/JpegMaker.cpp",
++    "src/jpeg/sw/SWJpegEncoder.cpp",  # TODO: Migrate to hardware JPEG encoding later
++    "src/metadata/CameraMetadata.cpp",
++    "src/metadata/ParameterGenerator.cpp",
++    "src/metadata/ParameterHelper.cpp",
++    "src/metadata/Parameters.cpp",
++    "src/metadata/icamera_metadata_base.cpp",
++    "src/platformdata/AiqInitData.cpp",
++    "src/platformdata/CameraParser.cpp",
++    "src/platformdata/ParserBase.cpp",
++    "src/platformdata/PlatformData.cpp",
++    "src/platformdata/PolicyParser.cpp",
++    "src/platformdata/gc/FormatUtils.cpp",
++    "src/platformdata/gc/GraphConfig.cpp",
++    "src/platformdata/gc/GraphConfigManager.cpp",
++    "src/platformdata/gc/GraphUtils.cpp",
++    "src/v4l2/MediaControl.cpp",
++    "src/v4l2/SysCall.cpp",
++    "src/v4l2/V4l2DeviceFactory.cpp",
++    "src/v4l2/NodeInfo.cpp",
++  ]
++  cflags_cc = [
++    "-fvisibility=default",
++  ]
++  include_dirs = [
++    ".",
++    "include",
++    "include/api",
++    "include/utils",
++    "include/linux",
++    "src",
++    "src/fd",
++    "src/platformdata",
++    "src/platformdata/gc",
++    "src/v4l2",
++    "src/iutils",
++    "src/core",
++    "src/core/psysprocessor",
++    "src/metadata",
++    "src/3a/intel3a",
++    "src/3a/external",
++    "src/3a",
++    "src/image_process",
++    "src/image_process/chrome",
++    "src/jpeg/",
++    "src/jpeg/sw",
++    "aal",
++    "aal/chrome",
++    "modules/ia_cipr/include",
++    "modules/ia_cipr/src/common",
++    "modules/ia_cipr/src/linux/linux",
++    "modules/memory",
++    "modules/memory/chrome",
++    "include/ia_imaging",
++    "include",
++    "include/gcss",
++  ]
++  defines = [
++    "CAL_BUILD",
++    "IPU_SYSVER_IPU6",
++    "USE_PG_LITE_PIPE",
++    "HAVE_LINUX_OS",
++    "__STDC_FORMAT_MACROS",
++    "HAVE_PTHREADS",
++    "HAVE_IA_TYPES",
++    "HAVE_PRCTL",
++    "SW_JPEG_ENCODE",
++    "CAMERA_HAL_DEBUG",
++    "DUMP_IMAGE",
++    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
++    "ENABLE_SANDBOXING",
++    "FACE_DETECTION",
++  ]
++  libs = [
++    "camera_client",
++    "camera_metadata",
++    "camera_common",
++    "cbm",
++    "jpeg",
++    "dl",
++    "cros_config",
++  ]
++  pkg_deps = [
++    "cros-camera-android-headers",
++    "expat",
++    "libcab",
++    "libcamera_client",
++    "libcamera_common",
++    "libcamera_exif",
++    "libcamera_metadata",
++    "libcamera_v4l2_device",
++    "libcbm",
++    "libchrome-${libbase_ver}",
++    "libmojo-${libbase_ver}",
++    "libsync",
++    "libyuv",
++  ]
++  if (use.ipu6se) {
++    sources += [
++      "modules/ia_css/ipu6se/src/ia_css_program_group_param.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_process_group.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c",
++      "modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c",
++      "modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_process.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_terminal.c",
++      "modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c",
++      "modules/ia_css/ipu6se/src/vied_nci_psys_system.c",
++      "modules/ia_css/ipu6se/src/ia_css_terminal.c",
++      "modules/ia_css/ipu6se/src/ia_css_program_group_data.c",
++      "modules/ia_css/ipu6se/src/ia_css_rbm.c",
++      "src/core/psysprocessor/GPUExecutor.cpp",
++      "modules/sandboxing/client/IntelTNR7US.cpp",
++    ]
++    include_dirs += [
++      "modules/ia_css/ipu6se/include",
++    ]
++    libs += [
++      "broxton_ia_pal",
++    ]
++    defines += [
++      "IPU_SYSVER_ipu6v3",
++      "TNR7_CM",
++    ]
++  } else {
++    sources += [
++      "modules/ia_css/ipu6/src/ia_css_program_group_param.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_process_group.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c",
++      "modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c",
++      "modules/ia_css/ipu6/src/ia_css_terminal_manifest.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_process.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_terminal.c",
++      "modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c",
++      "modules/ia_css/ipu6/src/vied_nci_psys_system.c",
++      "modules/ia_css/ipu6/src/ia_css_terminal.c",
++      "modules/ia_css/ipu6/src/ia_css_program_group_data.c",
++      "modules/ia_css/ipu6/src/ia_css_rbm.c",
++    ]
++    include_dirs += [
++      "modules/ia_css/ipu6/include",
++    ]
++  }
++  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
++}
++
++shared_library("libcam_algo") {
++  sources = [
++    "src/3a/DvsResult.cpp",
++    "src/iutils/Utils.cpp",
++    "src/iutils/Trace.cpp",
++    "src/iutils/ScopedAtrace.cpp",
++    "src/iutils/Thread.cpp",
++    "src/iutils/CameraLog.cpp",
++    "src/platformdata/gc/FormatUtils.cpp",
++    "src/platformdata/gc/GraphUtils.cpp",
++    "src/core/psysprocessor/PGUtils.cpp",
++    "modules/ia_cipr/src/Utils.cpp",
++    "modules/sandboxing/IPCCommon.cpp",
++    "modules/sandboxing/IPCIntelLard.cpp",
++    "modules/sandboxing/IPCIntelFD.cpp",
++    "modules/sandboxing/IPCGraphConfig.cpp",
++    "modules/sandboxing/IPCIntelCmc.cpp",
++    "modules/sandboxing/IPCIntelMkn.cpp",
++    "modules/sandboxing/IPCIntelLtm.cpp",
++    "modules/sandboxing/IPCIntelAiq.cpp",
++    "modules/sandboxing/IPCIntelDvs.cpp",
++    "modules/sandboxing/IPCIspParamAdaptor.cpp",
++    "modules/sandboxing/IPCIntelPGParam.cpp",
++    "modules/sandboxing/server/IntelCPUAlgoServer.cpp",
++    "modules/sandboxing/server/IntelAlgoServer.cpp",
++    "modules/sandboxing/server/IntelLardServer.cpp",
++    "modules/sandboxing/server/IntelFDServer.cpp",
++    "modules/sandboxing/server/GraphConfigServer.cpp",
++    "modules/sandboxing/server/IntelCmcServer.cpp",
++    "modules/sandboxing/server/IntelMknServer.cpp",
++    "modules/sandboxing/server/IntelLtmServer.cpp",
++    "modules/sandboxing/server/IntelAiqServer.cpp",
++    "modules/sandboxing/server/IntelDvsServer.cpp",
++    "modules/sandboxing/server/IspParamAdaptorServer.cpp",
++    "modules/sandboxing/server/IntelPGParamServer.cpp",
++    "modules/algowrapper/IntelLard.cpp",
++    "modules/algowrapper/IntelFaceDetection.cpp",
++    "modules/algowrapper/graph/GraphConfigImpl.cpp",
++    "modules/algowrapper/graph/GraphConfigPipe.cpp",
++    "modules/algowrapper/IntelCmc.cpp",
++    "modules/algowrapper/IntelMkn.cpp",
++    "modules/algowrapper/IntelLtm.cpp",
++    "modules/algowrapper/IntelAiq.cpp",
++    "modules/algowrapper/IntelDvs.cpp",
++    "modules/algowrapper/IntelIspParamAdaptor.cpp",
++    "modules/algowrapper/IntelPGParam.cpp",
++    "src/3a/AiqUtils.cpp",
++  ]
++  cflags_cc = [
++    "-fvisibility=default",
++  ]
++  include_dirs = [
++    ".",
++    "include",
++    "include/api",
++    "include/utils",
++    "include/linux",
++    "src",
++    "src/fd",
++    "src/platformdata",
++    "src/platformdata/gc",
++    "src/v4l2",
++    "src/iutils",
++    "src/core",
++    "src/core/psysprocessor",
++    "src/metadata",
++    "src/3a/intel3a",
++    "src/3a/external",
++    "src/3a",
++    "src/image_process",
++    "src/image_process/chrome",
++    "src/jpeg/",
++    "src/jpeg/sw",
++    "aal",
++    "aal/chrome",
++    "modules/memory",
++    "modules/memory/chrome",
++    "include/ia_imaging",
++    "include",
++    "include/gcss",
++ ]
++  defines = [
++    "CAL_BUILD",
++    "IPU_SYSVER_IPU6",
++    "USE_PG_LITE_PIPE",
++    "HAVE_LINUX_OS",
++    "__STDC_FORMAT_MACROS",
++    "HAVE_PTHREADS",
++    "HAVE_IA_TYPES",
++    "HAVE_PRCTL",
++    "SW_JPEG_ENCODE",
++    "CAMERA_HAL_DEBUG",
++    "DUMP_IMAGE",
++    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
++    "ENABLE_SANDBOXING",
++    "FACE_DETECTION",
++  ]
++  libs = [
++    "ia_aiq",
++    "ia_cmc_parser",
++    "ia_exc",
++    "ia_log",
++    "ia_mkn",
++    "ia_ltm",
++    "ia_isp_bxt",
++    "ia_dvs",
++    "ia_lard",
++    "pvl_eye_detection",
++    "pvl_face_detection",
++    "pvl_mouth_detection",
++    "gcss",
++    "ia_aiqb_parser",
++  ]
++  pkg_deps = [
++    "cros-camera-android-headers",
++    "libcab",
++    "libmojo-${libbase_ver}",
++  ]
++  if (use.ipu6se) {
++    libs += [
++      "ipu6sepla",
++      "ia_p2p_ipu6sepla",
++    ]
++    defines += [
++      "IPU_SYSVER_ipu6v3",
++    ]
++    include_dirs += [
++      "modules/ia_css/ipu6se/include",
++    ]
++  } else {
++    libs += [
++      "ipu6",
++      "ia_p2p_ipu6",
++    ]
++    include_dirs += [
++      "modules/ia_css/ipu6/include",
++    ]
++  }
++  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
++}
++
++if (use.ipu6se) {
++  shared_library("libcam_gpu_algo") {
++    sources = [
++      "src/iutils/Utils.cpp",
++      "src/iutils/Trace.cpp",
++      "src/iutils/ScopedAtrace.cpp",
++      "src/iutils/Thread.cpp",
++      "src/iutils/CameraLog.cpp",
++      "modules/sandboxing/IPCCommon.cpp",
++      "modules/sandboxing/server/IntelAlgoServer.cpp",
++      "modules/sandboxing/server/IntelGPUAlgoServer.cpp",
++      "modules/sandboxing/server/IntelTNRServer.cpp",
++      "modules/algowrapper/IntelTNR7US.cpp",
++    ]
++    include_dirs = [
++      ".",
++      "include",
++      "include/api",
++      "include/utils",
++      "include/linux",
++      "src",
++      "src/core",
++      "src/platformdata",
++      "src/3a",
++      "src/platformdata/gc",
++      "src/iutils",
++      "src/metadata",
++      "src/v4l2",
++      "include",
++      "include/ia_imaging",
++      "include/gcss",
++    ]
++    defines = [
++      "CAL_BUILD",
++      "IPU_SYSVER_IPU6",
++      "HAVE_LINUX_OS",
++      "__STDC_FORMAT_MACROS",
++      "HAVE_PTHREADS",
++      "CAMERA_HAL_DEBUG",
++      "ENABLE_SANDBOXING",
++      "IPU_SYSVER_ipu6v3",
++      "GPU_ALGO_SERVER",
++      "TNR7_CM",
++    ]
++    libs = [
++      "ia_log",
++      "tnr7_cm",
++    ]
++    pkg_deps = [
++      "cros-camera-android-headers",
++      "libcab",
++      "igfxcmrt",
++      "libmojo-${libbase_ver}",
++    ]
++    deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
++  }
++}
+diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
+new file mode 100644
+index 000000000000..ba7dcc86ea5d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
+@@ -0,0 +1,132 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Camera3AMetadata"
++
++#include "Camera3AMetadata.h"
++
++#include "HALv3Header.h"
++#include "HALv3Utils.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++Camera3AMetadata::Camera3AMetadata(int cameraId) : mCameraId(cameraId) {
++    LOG1("@%s", __func__);
++
++    mIntelAFStateMachine = new IntelAFStateMachine(mCameraId);
++    mIntelAEStateMachine = new IntelAEStateMachine(mCameraId);
++    mIntelAWBStateMachine = new IntelAWBStateMachine(mCameraId);
++}
++
++Camera3AMetadata::~Camera3AMetadata() {
++    LOG1("@%s", __func__);
++
++    delete mIntelAFStateMachine;
++    delete mIntelAEStateMachine;
++    delete mIntelAWBStateMachine;
++}
++
++void Camera3AMetadata::process3Astate(const icamera::Parameters& parameter,
++                                      android::CameraMetadata* metadata) {
++    LOG2("@%s", __func__);
++    CheckError(!metadata, VOID_VALUE, "%s, metadata is nullptr", __func__);
++
++    // get 3a info from metadata
++    uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
++    camera_metadata_entry entry = metadata->find(ANDROID_CONTROL_AF_TRIGGER);
++    if (entry.count == 1) {
++        afTrigger = entry.data.u8[0];
++    }
++
++    uint8_t afMode = ANDROID_CONTROL_AF_MODE_AUTO;
++    entry = metadata->find(ANDROID_CONTROL_AF_MODE);
++    if (entry.count == 1) {
++        afMode = entry.data.u8[0];
++    }
++
++    mIntelAFStateMachine->processTriggers(afTrigger, afMode);
++
++    // get AF state
++    icamera::camera_af_state_t afState = icamera::AF_STATE_IDLE;
++    parameter.getAfState(afState);
++
++    bool lensMoving = false;
++    parameter.getLensState(lensMoving);
++    mIntelAFStateMachine->processResult(afState, lensMoving, metadata);
++
++    AeControls aeControls = {ANDROID_CONTROL_AE_MODE_ON, ANDROID_CONTROL_AE_LOCK_OFF,
++                             ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE,
++                             ANDROID_CONTROL_SCENE_MODE_DISABLED, 0};
++    uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
++    entry = metadata->find(ANDROID_CONTROL_MODE);
++    if (entry.count == 1) {
++        controlMode = entry.data.u8[0];
++    }
++
++    uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
++    entry = metadata->find(ANDROID_CONTROL_SCENE_MODE);
++    if (entry.count == 1) {
++        sceneMode = entry.data.u8[0];
++    }
++
++    entry = metadata->find(ANDROID_CONTROL_AE_MODE);
++    if (entry.count == 1) {
++        aeControls.aeMode = entry.data.u8[0];
++    }
++
++    entry = metadata->find(ANDROID_CONTROL_AE_LOCK);
++    if (entry.count == 1) {
++        aeControls.aeLock = entry.data.u8[0];
++    }
++
++    entry = metadata->find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
++    if (entry.count == 1) {
++        aeControls.aePreCaptureTrigger = entry.data.u8[0];
++    }
++
++    entry = metadata->find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION);
++    if (entry.count == 1) {
++        aeControls.evCompensation = entry.data.i32[0];
++    }
++
++    mIntelAEStateMachine->processState(controlMode, sceneMode, aeControls);
++
++    // get AE state
++    icamera::camera_ae_state_t aeState = icamera::AE_STATE_NOT_CONVERGED;
++    parameter.getAeState(aeState);
++    mIntelAEStateMachine->processResult(aeState == icamera::AE_STATE_CONVERGED, metadata);
++
++    AwbControls awbControls = {ANDROID_CONTROL_AWB_MODE_AUTO, ANDROID_CONTROL_AWB_LOCK_OFF, 0, 0};
++    entry = metadata->find(ANDROID_CONTROL_AWB_MODE);
++    if (entry.count == 1) {
++        awbControls.awbMode = entry.data.u8[0];
++    }
++
++    entry = metadata->find(ANDROID_CONTROL_AWB_LOCK);
++    if (entry.count == 1) {
++        awbControls.awbLock = entry.data.u8[0];
++    }
++
++    mIntelAWBStateMachine->processState(controlMode, sceneMode, awbControls);
++
++    // get AWB state
++    icamera::camera_awb_state_t awbState = icamera::AWB_STATE_NOT_CONVERGED;
++    parameter.getAwbState(awbState);
++    mIntelAWBStateMachine->processResult(awbState == icamera::AWB_STATE_CONVERGED, metadata);
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.h b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
+new file mode 100644
+index 000000000000..c85e5a768e16
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
+@@ -0,0 +1,51 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "IntelAEStateMachine.h"
++#include "IntelAFStateMachine.h"
++#include "IntelAWBStateMachine.h"
++#include "Utils.h"
++#include "Parameters.h"
++
++namespace camera3 {
++
++/**
++ * \class Camera3AMetadata
++ *
++ * This class is used to handle 3A related metadata. It also returns
++ * 3A state.
++ */
++class Camera3AMetadata {
++ public:
++    Camera3AMetadata(int cameraId);
++    ~Camera3AMetadata();
++
++    void process3Astate(const icamera::Parameters& parameter, android::CameraMetadata* metadata);
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(Camera3AMetadata);
++
++ private:
++    int mCameraId;
++
++    IntelAFStateMachine* mIntelAFStateMachine;
++    IntelAEStateMachine* mIntelAEStateMachine;
++    IntelAWBStateMachine* mIntelAWBStateMachine;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.cpp b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
+new file mode 100644
+index 000000000000..1ec9d2056bd2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
+@@ -0,0 +1,249 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Camera3HAL"
++
++#include "Camera3HAL.h"
++
++#include <memory>
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "ICamera.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++/******************************************************************************
++ *  C DEVICE INTERFACE IMPLEMENTATION WRAPPER
++ *****************************************************************************/
++
++// Common check before the function call
++#define FUNCTION_PREPARED_RETURN \
++    if (!dev) return -EINVAL;    \
++    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(dev->priv);
++
++static int hal_dev_initialize(const struct camera3_device* dev,
++                              const camera3_callback_ops_t* callback_ops) {
++    LOG1("@%s", __func__);
++
++    FUNCTION_PREPARED_RETURN
++
++    return camera_priv->initialize(callback_ops);
++}
++
++static int hal_dev_configure_streams(const struct camera3_device* dev,
++                                     camera3_stream_configuration_t* stream_list) {
++    LOG1("@%s", __func__);
++
++    FUNCTION_PREPARED_RETURN
++
++    return camera_priv->configure_streams(stream_list);
++}
++
++static const camera_metadata_t* hal_dev_construct_default_request_settings(
++    const struct camera3_device* dev, int type) {
++    LOG1("@%s", __func__);
++
++    if (!dev) return nullptr;
++    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
++
++    return camera_priv->construct_default_request_settings(type);
++}
++
++static int hal_dev_process_capture_request(const struct camera3_device* dev,
++                                           camera3_capture_request_t* request) {
++    LOG1("@%s", __func__);
++
++    FUNCTION_PREPARED_RETURN
++
++    return camera_priv->process_capture_request(request);
++}
++
++static void hal_dev_dump(const struct camera3_device* dev, int fd) {
++    LOG1("@%s", __func__);
++
++    if (!dev) return;
++
++    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
++
++    camera_priv->dump(fd);
++}
++
++static int hal_dev_flush(const struct camera3_device* dev) {
++    LOG1("@%s", __func__);
++
++    if (!dev) return -EINVAL;
++
++    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
++    return camera_priv->flush();
++}
++
++static camera3_device_ops hal_dev_ops = {
++    .initialize = hal_dev_initialize,
++    .configure_streams = hal_dev_configure_streams,
++    .register_stream_buffers = nullptr,
++    .construct_default_request_settings = hal_dev_construct_default_request_settings,
++    .process_capture_request = hal_dev_process_capture_request,
++    .get_metadata_vendor_tag_ops = nullptr,
++    .dump = hal_dev_dump,
++    .flush = hal_dev_flush,
++    .reserved = {0},
++};
++
++/******************************************************************************
++ *  C++ CLASS IMPLEMENTATION
++ *****************************************************************************/
++Camera3HAL::Camera3HAL(int cameraId, const hw_module_t* module)
++        : mCameraId(cameraId),
++          mInitialized(false) {
++    LOG1("@%s", __func__);
++
++    mDevice = {};
++    mDevice.common.tag = HARDWARE_DEVICE_TAG;
++    mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_3;
++    mDevice.common.module = const_cast<hw_module_t*>(module);
++    // hal_dev_close is kept in the module for symmetry with dev_open
++    // it will be set there
++    mDevice.common.close = nullptr;
++    mDevice.ops = &hal_dev_ops;
++    mDevice.priv = this;
++
++    int ret = icamera::camera_device_open(cameraId);
++    if (ret != icamera::OK) {
++        LOGE("@%s, camera_device_open fails, ret:%d", __func__, ret);
++        icamera::camera_device_close(cameraId);
++
++        return;
++    }
++
++    mRequestManager = std::unique_ptr<RequestManager>(new RequestManager(cameraId));
++
++    mInitialized = true;
++}
++
++Camera3HAL::~Camera3HAL() {
++    LOG1("@%s", __func__);
++
++    if (mRequestManager) {
++        mRequestManager->flush();
++        mRequestManager->deinit();
++
++        mRequestManager.reset();  // mRequestManager must be released before device deinit
++    }
++
++    icamera::camera_device_close(mCameraId);
++}
++
++/* *********************************************************************
++ * Camera3 device  APIs
++ * ********************************************************************/
++int Camera3HAL::initialize(const camera3_callback_ops_t* callback_ops) {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, -ENODEV, "@%s, mInitialized is false", __func__);
++    int status = icamera::OK;
++
++    if (callback_ops == nullptr) return -ENODEV;
++
++    status = mRequestManager->init(callback_ops);
++    if (status != icamera::OK) {
++        LOGE("Error register callback status = %d", status);
++        return -ENODEV;
++    }
++    return status;
++}
++
++int Camera3HAL::configure_streams(camera3_stream_configuration_t* stream_list) {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
++    CheckError(!stream_list, -EINVAL, "@%s, stream_list is nullptr", __func__);
++
++    if (!stream_list->streams || !stream_list->num_streams) {
++        LOGE("%s: Bad input! streams list ptr: %p, num %d", __func__, stream_list->streams,
++             stream_list->num_streams);
++        return -EINVAL;
++    }
++    int num = stream_list->num_streams;
++    LOG2("@%s, stream num:%d", __func__, num);
++    while (num--) {
++        if (!stream_list->streams[num]) {
++            LOGE("%s: Bad input! streams (%d) 's ptr: %p", __func__, num,
++                 stream_list->streams[num]);
++            return -EINVAL;
++        }
++    }
++
++    int status = mRequestManager->configureStreams(stream_list);
++    return (status == icamera::OK) ? 0 : -EINVAL;
++}
++
++const camera_metadata_t* Camera3HAL::construct_default_request_settings(int type) {
++    LOG1("@%s, type:%d", __func__, type);
++    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
++
++    if (type < CAMERA3_TEMPLATE_PREVIEW || type >= CAMERA3_TEMPLATE_COUNT) return nullptr;
++
++    const camera_metadata_t* meta = nullptr;
++    int status = mRequestManager->constructDefaultRequestSettings(type, &meta);
++    CheckError(status != icamera::OK, nullptr, "construct default request setting error");
++
++    return meta;
++}
++
++int Camera3HAL::process_capture_request(camera3_capture_request_t* request) {
++    LOG2("@%s", __func__);
++    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
++
++    if (request == nullptr) {
++        LOGE("%s: request is null!", __func__);
++        return -EINVAL;
++    } else if (!request->num_output_buffers || request->output_buffers == nullptr) {
++        LOGE("%s: num_output_buffers %d, output_buffers %p", __func__, request->num_output_buffers,
++             request->output_buffers);
++        return -EINVAL;
++    } else if (request->output_buffers->stream == nullptr) {
++        LOGE("%s: output_buffers->stream is null!", __func__);
++        return -EINVAL;
++    } else if (request->output_buffers->stream->priv == nullptr) {
++        LOGE("%s: output_buffers->stream->priv is null!", __func__);
++        return -EINVAL;
++    } else if (request->output_buffers->buffer == nullptr ||
++               *(request->output_buffers->buffer) == nullptr) {
++        LOGE("%s: output buffer is invalid", __func__);
++        return -EINVAL;
++    }
++
++    int status = mRequestManager->processCaptureRequest(request);
++    if (status == icamera::OK) return icamera::OK;
++
++    return (status == icamera::BAD_VALUE) ? -EINVAL : -ENODEV;
++}
++
++void Camera3HAL::dump(int fd) {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    mRequestManager->dump(fd);
++}
++
++int Camera3HAL::flush() {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, icamera::UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    return mRequestManager->flush();
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.h b/camera/hal/intel/ipu6/aal/Camera3HAL.h
+new file mode 100644
+index 000000000000..45c12f0af056
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3HAL.h
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include <memory>
++
++#include "RequestManager.h"
++
++namespace camera3 {
++
++/**
++ * \class Camera3HAL
++ *
++ * This class represents a single HAL device instance. It has the following
++ * roles:
++ * - It implements the camera3_device_ops_t  API  defined by Android.
++ * - It instantiates RequestManager.
++ */
++class Camera3HAL : public camera3_device_ops_t {
++ public:
++    Camera3HAL(int cameraId, const hw_module_t* module);
++    virtual ~Camera3HAL();
++    bool isInitialized() { return mInitialized; }
++    camera3_device_t* getDeviceStruct() { return &mDevice; }
++    int getCameraId() { return mCameraId; };
++
++    /**********************************************************************
++     * camera3_device_ops_t implementation
++     */
++    int initialize(const camera3_callback_ops_t* callback_ops);
++
++    int configure_streams(camera3_stream_configuration_t* stream_list);
++
++    const camera_metadata_t* construct_default_request_settings(int type);
++
++    int process_capture_request(camera3_capture_request_t* request);
++
++    void get_metadata_vendor_tag_ops(vendor_tag_query_ops_t* ops);
++
++    void dump(int fd);
++
++    int flush();
++
++ private:
++    int mCameraId;
++    std::unique_ptr<RequestManager> mRequestManager;
++    camera3_device_t mDevice;
++
++    bool mInitialized;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
+new file mode 100644
+index 000000000000..53612add6539
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
+@@ -0,0 +1,299 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "Camera3HALModule"
++
++#include <cros-camera/cros_camera_hal.h>
++
++#include <hardware/camera3.h>
++#include <hardware/hardware.h>
++
++#include <mutex>
++
++#include "Camera3HAL.h"
++#include "HALv3Utils.h"
++#include "ICamera.h"
++#include "MetadataConvert.h"
++#include "PlatformData.h"
++#include "Utils.h"
++#include "iutils/CameraDump.h"
++
++namespace camera3 {
++
++#define MAX_CAMERAS 2
++
++/**
++ * \macro VISIBILITY_PUBLIC
++ *
++ * Controls the visibility of symbols in the shared library.
++ * In production builds all symbols in the shared library are hidden
++ * except the ones using this linker attribute.
++ */
++#define VISIBILITY_PUBLIC __attribute__((visibility("default")))
++
++static int hal_dev_close(hw_device_t* device);
++
++/**********************************************************************
++ * Camera Module API (C API)
++ **********************************************************************/
++
++static bool sInstances[MAX_CAMERAS] = {false, false};
++static int sInstanceCount = 0;
++// sCameraMetadata buffer won't be free in CAL
++static android::CameraMetadata* sCameraMetadata[MAX_CAMERAS] = {nullptr};
++
++/**
++ * Global mutex used to protect sInstanceCount and sInstances
++ */
++static std::mutex sCameraHalMutex;
++
++int openCameraHardware(int id, const hw_module_t* module, hw_device_t** device) {
++    LOG1("@%s", __func__);
++
++    if (sInstances[id]) return 0;
++
++    Camera3HAL* halDev = new Camera3HAL(id, module);
++    if (!halDev->isInitialized()) {
++        LOGE("HAL initialization fail!");
++        delete halDev;
++        return -EINVAL;
++    }
++    camera3_device_t* cam3Device = halDev->getDeviceStruct();
++
++    cam3Device->common.close = hal_dev_close;
++    *device = &cam3Device->common;
++
++    sInstanceCount++;
++    sInstances[id] = true;
++
++    LOG1("@%s end", __func__);
++    return 0;
++}
++
++static int hal_get_number_of_cameras(void) {
++    LOG1("@%s", __func__);
++
++    return icamera::get_number_of_cameras();
++}
++
++static int hal_get_camera_info(int cameraId, struct camera_info* cameraInfo) {
++    LOG1("@%s", __func__);
++
++    if (cameraId < 0 || !cameraInfo || cameraId >= hal_get_number_of_cameras()) return -EINVAL;
++
++    icamera::camera_info_t info;
++    icamera::get_camera_info(cameraId, info);
++
++    if (sCameraMetadata[cameraId] == nullptr) {
++        sCameraMetadata[cameraId] = new android::CameraMetadata;
++        MetadataConvert::HALCapabilityToStaticMetadata(*(info.capability),
++                                                       sCameraMetadata[cameraId]);
++    }
++    int32_t tag = ANDROID_LENS_FACING;
++    camera_metadata_entry entry = sCameraMetadata[cameraId]->find(tag);
++    if (entry.count == 1) {
++        info.facing = entry.data.u8[0];
++    }
++    tag = ANDROID_SENSOR_ORIENTATION;
++    entry = sCameraMetadata[cameraId]->find(tag);
++    if (entry.count == 1) {
++        info.orientation = entry.data.u8[0];
++    }
++    memset(cameraInfo, 0, sizeof(camera_info));
++    cameraInfo->facing = info.facing ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT;
++    cameraInfo->device_version = CAMERA_DEVICE_API_VERSION_3_3;
++    cameraInfo->orientation = info.orientation;
++    const camera_metadata_t* settings = sCameraMetadata[cameraId]->getAndLock();
++    cameraInfo->static_camera_characteristics = settings;
++    sCameraMetadata[cameraId]->unlock(settings);
++
++    return 0;
++}
++
++static int hal_set_callbacks(const camera_module_callbacks_t* callbacks) {
++    LOG1("@%s", __func__);
++
++    UNUSED(callbacks);
++    return 0;
++}
++
++static int hal_dev_open(const hw_module_t* module, const char* name, hw_device_t** device) {
++    icamera::Log::setDebugLevel();
++    icamera::CameraDump::setDumpLevel();
++
++    LOG1("@%s", __func__);
++
++    int status = -EINVAL;
++    int camera_id;
++
++    if (!name || !module || !device) {
++        LOGE("Camera name is nullptr");
++        return status;
++    }
++
++    LOG1("%s, camera id: %s", __func__, name);
++    camera_id = atoi(name);
++    if (camera_id < 0 || camera_id >= hal_get_number_of_cameras()) {
++        LOGE("%s: Camera id %d is out of bounds, num. of cameras (%d)", __func__, camera_id,
++             hal_get_number_of_cameras());
++        return -ENODEV;
++    }
++
++    std::lock_guard<std::mutex> l(sCameraHalMutex);
++
++    if (sInstanceCount > 0 && sInstances[camera_id]) {
++        LOGW("Camera already has been opened!");
++        return -EUSERS;
++    }
++
++    return openCameraHardware(camera_id, module, device);
++}
++
++static int hal_dev_close(hw_device_t* device) {
++    LOG1("@%s", __func__);
++
++    if (!device || sInstanceCount == 0) {
++        LOGW("hal close, instance count %d", sInstanceCount);
++        return -EINVAL;
++    }
++
++    camera3_device_t* camera3_dev = (struct camera3_device*)device;
++    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(camera3_dev->priv);
++
++    if (camera_priv != nullptr) {
++        std::lock_guard<std::mutex> l(sCameraHalMutex);
++        int id = camera_priv->getCameraId();
++        delete camera_priv;
++        sInstanceCount--;
++        sInstances[id] = false;
++    }
++
++    LOG1("%s, instance count %d", __func__, sInstanceCount);
++
++    return 0;
++}
++
++static int hal_init(void) {
++    LOG1("@%s", __func__);
++
++    /*
++     * Check the connection status with algo service and the detected
++     * camera number. Then the service decides whether to restart or
++     * not based on the return value
++     */
++#ifdef ENABLE_SANDBOXING
++    CheckError(icamera::IntelAlgoClient::getInstance()->initialize() != icamera::OK, -EINVAL,
++               "%s, Connect to algo service fails", __func__);
++#endif
++
++    // Initialize PlatformData
++    int ret = icamera::camera_hal_init();
++    CheckError(ret != icamera::OK, -EINVAL, "@%s, camera_hal_init fails, ret:%d", __func__, ret);
++
++    int currentCameraNum = icamera::PlatformData::numberOfCameras();
++    CheckError(currentCameraNum == 0, -EINVAL, "@%s, camera is not ready", __func__);
++
++    int hwCameraNum = camera3::HalV3Utils::getHwCameraNumber();
++    int xmlCameraNum = icamera::PlatformData::getXmlCameraNumber();
++    if (xmlCameraNum != 0) {
++        CheckError(xmlCameraNum != currentCameraNum, -EINVAL,
++                   "@%s, expected %d cameras defined in XML, found %d", __func__, xmlCameraNum,
++                   currentCameraNum);
++    } else if (hwCameraNum != 0) {
++        CheckError(hwCameraNum != currentCameraNum, -EINVAL,
++                   "@%s, expected %d cameras defined in device config, found %d", __func__,
++                   hwCameraNum, currentCameraNum);
++    }
++
++    return 0;
++}
++
++static int hal_set_torch_mode(const char* camera_id, bool enabled) {
++    LOG1("@%s", __func__);
++
++    UNUSED(camera_id);
++    UNUSED(enabled);
++    return -ENOSYS;
++}
++
++/*
++ * The setup sequence for camera hal module
++ *  1. dlopen()
++ *  2. set_up() : for chrome camera service only
++ *  3. init()
++ *  4. get_number_of_cameras()
++ *  ......
++ */
++static void hal_set_up(cros::CameraMojoChannelManager* mojoManager) {
++    LOG1("@%s", __func__);
++
++    icamera::Log::setDebugLevel();
++    icamera::CameraDump::setDumpLevel();
++
++#ifdef ENABLE_SANDBOXING
++    // Create IntelAlgoClient and set the mojo manager
++    icamera::IntelAlgoClient::getInstance()->setMojoManager(mojoManager);
++#endif
++}
++
++/*
++ * The close sequence for camera hal module
++ *  ......
++ *  1. tear_down() : for chrome camera service only
++ *  2. dlclose()
++ */
++static void hal_tear_down() {
++    LOG1("@%s", __func__);
++
++    int ret = icamera::camera_hal_deinit();
++    CheckError(ret != icamera::OK, VOID_VALUE, "@%s, camera_hal_deinit fails, ret:%d", __func__,
++               ret);
++#ifdef ENABLE_SANDBOXING
++    icamera::IntelAlgoClient::releaseInstance();
++#endif
++}
++
++static struct hw_module_methods_t hal_module_methods = {.open = hal_dev_open};
++
++static hw_module_t camera_common = {.tag = HARDWARE_MODULE_TAG,
++                                    .module_api_version = CAMERA_MODULE_API_VERSION_2_3,
++                                    .hal_api_version = HARDWARE_HAL_API_VERSION,
++                                    .id = CAMERA_HARDWARE_MODULE_ID,
++                                    .name = "Intel Camera3HAL Module",
++                                    .author = "Intel",
++                                    .methods = &hal_module_methods,
++                                    .dso = nullptr,
++                                    .reserved = {0}};
++
++extern "C" {
++camera_module_t VISIBILITY_PUBLIC HAL_MODULE_INFO_SYM = {
++    .common = camera_common,
++    .get_number_of_cameras = hal_get_number_of_cameras,
++    .get_camera_info = hal_get_camera_info,
++    .set_callbacks = hal_set_callbacks,
++    .get_vendor_tag_ops = nullptr,
++    .open_legacy = nullptr,
++    .set_torch_mode = hal_set_torch_mode,
++    .init = hal_init,
++    .reserved = {0}};
++
++// For Chrome OS
++cros::cros_camera_hal_t VISIBILITY_PUBLIC CROS_CAMERA_HAL_INFO_SYM = {
++    .set_up = hal_set_up,
++    .tear_down = hal_tear_down,
++};
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.cpp b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
+new file mode 100644
+index 000000000000..a43ec5c2c635
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
+@@ -0,0 +1,653 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Camera3Stream"
++
++#include "Camera3Stream.h"
++
++#include <utility>
++#include <vector>
++
++#include "CameraDump.h"
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "ICamera.h"
++#include "MetadataConvert.h"
++#include "PlatformData.h"
++#include "Utils.h"
++#include "stdlib.h"
++
++namespace camera3 {
++Camera3Stream::Camera3Stream(int cameraId, CallbackEventInterface* callback,
++                             uint32_t maxNumReqInProc, const icamera::stream_t& halStream,
++                             const camera3_stream_t& stream, const camera3_stream_t* inputStream,
++                             bool isHALStream)
++        : mCameraId(cameraId),
++          mEventCallback(callback),
++          mPostProcessType(icamera::POST_PROCESS_NONE),
++          mStreamState(false),
++          mHALStream(halStream),
++          mMaxNumReqInProc(maxNumReqInProc),
++          mBufferPool(nullptr),
++          mStream(stream),
++          mFaceDetection(nullptr),
++          mFDRunDefaultInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
++          mFDRunIntervalNoFace(icamera::PlatformData::faceEngineRunningIntervalNoFace(cameraId)),
++          mFDRunInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
++          mFrameCnt(0),
++          mInputPostProcessType(icamera::POST_PROCESS_NONE),
++          mIsHALStream(isHALStream) {
++    LOG1("[%p]@%s, buf num:%d, inputStream:%p, stream:%dx%d, format:%d, type:%d", this,
++         __func__, mMaxNumReqInProc, inputStream, mHALStream.width, mHALStream.height,
++         mHALStream.format, mStream.stream_type);
++
++    mPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
++    mCaptureRequest.clear();
++    mQueuedBuffer.clear();
++    if (mIsHALStream) {
++        mBufferPool = std::unique_ptr<Camera3BufferPool>(new Camera3BufferPool());
++    }
++
++    if (inputStream) {
++        LOG2("@%s, inputStream: width:%d, height:%d, format:%d", __func__, inputStream->width,
++             inputStream->height, inputStream->format);
++
++        mInputPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
++        mInputStream = std::unique_ptr<camera3_stream_t>(new camera3_stream_t);
++        *mInputStream = *inputStream;
++    }
++
++    LOG2("@%s, mFaceDetection:%p, Interval:%d, IntervalNoFace:%d", __func__,
++         mFaceDetection, mFDRunDefaultInterval, mFDRunIntervalNoFace);
++}
++
++Camera3Stream::~Camera3Stream() {
++    LOG1("[%p]@%s", this, __func__);
++
++    setActive(false);
++
++    for (auto& buf : mBuffers) {
++        buf.second->unlock();
++    }
++
++    mBuffers.clear();
++    std::lock_guard<std::mutex> l(mLock);
++    mCaptureResultMap.clear();
++}
++
++void Camera3Stream::sendEvent(const icamera::camera_msg_data_t& data) {
++    LOG2("@%s receive sof event: %ld", __func__, data.data.buffer_ready.timestamp);
++
++    std::lock_guard<std::mutex> sofLock(mSofLock);
++    mSofCondition.notify_one();
++}
++
++void Camera3Stream::handleSofAlignment() {
++    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId)) return;
++
++    std::unique_lock<std::mutex> sofLock(mSofLock);
++    std::cv_status ret =
++        mSofCondition.wait_for(sofLock, std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
++
++    if (ret == std::cv_status::timeout) {
++        LOGW("%s, [%p] wait sof timeout, skip alignment this time", __func__, this);
++    }
++    LOG2("%s, [%p] running post processing align with sof event", __func__, this);
++}
++
++bool Camera3Stream::threadLoop() {
++    LOG1("[%p] isHALStream: %d @%s", this, mIsHALStream, __func__);
++
++    if (!waitCaptureResultReady()) {
++        return true;
++    }
++
++    auto captureResult = mCaptureResultMap.begin();
++    std::shared_ptr<CaptureResult> result = captureResult->second;
++    uint32_t frameNumber = captureResult->first;
++
++    // dequeue buffer from HAL
++    icamera::camera_buffer_t* buffer = nullptr;
++    icamera::Parameters parameter;
++    std::shared_ptr<Camera3Buffer> inputCam3Buf = result->inputCam3Buf;
++    std::shared_ptr<StreamComInfo> halOutput = nullptr;
++    long sequence = -1;
++
++    if (!inputCam3Buf && mIsHALStream) {
++        LOG1("[%p]@ dqbuf for frameNumber %d", this, frameNumber);
++        int ret = icamera::camera_stream_dqbuf(mCameraId, mHALStream.id, &buffer, &parameter);
++        CheckError(ret != icamera::OK || !buffer, true, "[%p]failed to dequeue buffer, ret %d",
++                   this, ret);
++        LOG2("[%p]@ %s, buffer->timestamp:%lld addr %p", this, __func__, buffer->timestamp,
++             buffer->addr);
++
++        sequence = buffer->sequence;
++        int32_t userRequestId = 0;
++        if (parameter.getUserRequestId(userRequestId) == icamera::OK) {
++            {
++                std::unique_lock<std::mutex> lock(mLock);
++                if (mCaptureResultMap.find(static_cast<uint32_t>(userRequestId)) !=
++                    mCaptureResultMap.end()) {
++                    frameNumber = static_cast<uint32_t>(userRequestId);
++                    result = mCaptureResultMap[frameNumber];
++                }
++            }
++        }
++
++        // sync before notify listeners
++        bool needAlignment = false;
++
++        if (mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW &&
++            mPostProcessType != icamera::POST_PROCESS_NONE) {
++            needAlignment = true;
++        } else {
++            for (auto& iter : mListeners) {
++                if (!iter->getCaptureRequest(frameNumber)) {
++                    continue;
++                }
++                needAlignment = true;
++            }
++        }
++        if (needAlignment) {
++            handleSofAlignment();
++        }
++
++        halOutput = std::make_shared<StreamComInfo>();
++        {
++            std::unique_lock<std::mutex> lock(mLock);
++
++            /* get the Camera3Buffer object of camera_buffer_t dqueued from HAL
++             * check the 3 sources: HAL stream, listener stream and buffer pool.
++             */
++            if (mQueuedBuffer.find(frameNumber) != mQueuedBuffer.end()) {
++                /* check buffer pool first, the HAL stream may use buffer from pool even
++                 * itself or it's listener has requested buffer.
++                 */
++                halOutput->cam3Buf = mQueuedBuffer[frameNumber];
++            } else if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
++                if (buffer->addr == mCaptureRequest[frameNumber]->cam3Buf->data()) {
++                    halOutput->cam3Buf = mCaptureRequest[frameNumber]->cam3Buf;
++                }
++            } else {
++                std::shared_ptr<StreamComInfo> request = nullptr;
++                for (auto& iter : mListeners) {
++                    request = iter->getCaptureRequest(frameNumber);
++                    if (request && request->cam3Buf->data() == buffer->addr) {
++                        halOutput->cam3Buf = request->cam3Buf;
++                        break;
++                    }
++                }
++            }
++
++            CheckError(!halOutput->cam3Buf, true, "can't identify the buffer source");
++            halOutput->parameter = parameter;
++            halOutput->cam3Buf->setTimeStamp(buffer->timestamp);
++        }
++
++        for (auto& iter : mListeners) {
++            iter->notifyListenerBufferReady(frameNumber, halOutput);
++        }
++
++        if (!getCaptureRequest(frameNumber)) {
++            // HAL stream is triggered by listener, itself not requested, start next
++            // loop
++            std::unique_lock<std::mutex> lock(mLock);
++            mCaptureResultMap.erase(frameNumber);
++            return true;
++        }
++    } else if (!inputCam3Buf) {
++        // listener stream get the buffer from HAL stream
++        std::unique_lock<std::mutex> lock(mLock);
++        if (mHALStreamOutput.find(frameNumber) == mHALStreamOutput.end()) {
++            LOGE("[%p] can't find HAL stream output", this);
++            return true;
++        }
++        halOutput = mHALStreamOutput[frameNumber];
++        mHALStreamOutput.erase(frameNumber);
++    }
++
++    {
++        std::unique_lock<std::mutex> lock(mLock);
++        mCaptureResultMap.erase(frameNumber);
++    }
++
++    icamera::camera_buffer_t outCamBuf = {};
++    shared_ptr<Camera3Buffer> outCam3Buf = nullptr;
++
++    // start process buffers, HAL stream and listeners will do the same process
++    if (!inputCam3Buf) {
++        outCam3Buf = halOutput->cam3Buf;
++        if (outCam3Buf) {
++            outCamBuf = outCam3Buf->getHalBuffer();
++        }
++        parameter = halOutput->parameter;
++    }
++
++    buffer_handle_t handle = result->handle;
++    std::shared_ptr<Camera3Buffer> ccBuf = nullptr;
++    {
++        std::unique_lock<std::mutex> lock(mLock);
++        CheckError(mBuffers.find(handle) == mBuffers.end(), false, "can't find handle %p", handle);
++
++        ccBuf = mBuffers[handle];
++        mBuffers.erase(handle);
++        CheckError(ccBuf == nullptr, false, "ccBuf is nullptr");
++    }
++
++    if (inputCam3Buf || mHALStream.usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
++        // notify shutter done
++        ShutterEvent shutterEvent = {frameNumber, inputCam3Buf ? 0 : outCamBuf.timestamp};
++        mEventCallback->shutterDone(shutterEvent);
++
++        // notify metadata done
++        MetadataEvent event = {frameNumber, &parameter};
++        mEventCallback->metadataDone(event);
++    }
++
++    int dumpOutputFmt = V4L2_PIX_FMT_NV12;
++    if (!inputCam3Buf && mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
++        LOG2("%s, hal buffer: %p, ccBuf address: %p", __func__, outCamBuf.addr, ccBuf->data());
++        if (mPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
++            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
++            icamera::PlatformData::acquireMakernoteData(mCameraId, outCamBuf.timestamp, &parameter);
++        }
++        // handle normal postprocess
++        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
++            LOG2("%s, do software postProcessing for sequence: %ld", __func__, outCamBuf.sequence);
++            icamera::status_t status =
++                mPostProcessor->doPostProcessing(outCam3Buf, parameter, ccBuf);
++            CheckError(status != icamera::OK, true,
++                       "@%s, doPostProcessing fails, mPostProcessType:%d", __func__,
++                       mPostProcessType);
++        } else if (outCam3Buf && outCam3Buf->data() != ccBuf->data()) {
++            MEMCPY_S(ccBuf->data(), ccBuf->size(), outCam3Buf->data(), outCam3Buf->size());
++        }
++    } else if (inputCam3Buf) {
++        parameter = result->param;
++        LOG1("[%p] @%s process input frameNumber: %d", this, __func__, frameNumber);
++        if (mInputPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
++            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
++            icamera::PlatformData::acquireMakernoteData(mCameraId, inputCam3Buf->getTimeStamp(),
++                                                        &parameter);
++        }
++
++        inputCam3Buf->dumpImage(frameNumber, icamera::DUMP_AAL_INPUT, V4L2_PIX_FMT_NV12);
++        if (mInputPostProcessType != icamera::POST_PROCESS_NONE) {
++            icamera::status_t status =
++                mInputPostProcessor->doPostProcessing(inputCam3Buf, parameter, ccBuf);
++            CheckError(status != icamera::OK, true,
++                       "@%s, doPostProcessing fails, mInputPostProcessType:%d", __func__,
++                       mInputPostProcessType);
++        } else {
++            MEMCPY_S(ccBuf->data(), ccBuf->size(), inputCam3Buf->data(), inputCam3Buf->size());
++        }
++    }
++
++    faceRunningByCondition(ccBuf->getHalBuffer());
++
++    ccBuf->dumpImage(frameNumber, icamera::DUMP_AAL_OUTPUT, dumpOutputFmt);
++    ccBuf->unlock();
++    ccBuf->deinit();
++    ccBuf->getFence(&result->outputBuffer);
++
++    // notify frame done
++    BufferEvent bufferEvent = {frameNumber, &result->outputBuffer, 0, -1};
++    if (mHALStream.usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
++        bufferEvent.sequence = sequence;
++        bufferEvent.timestamp = outCamBuf.timestamp;
++    }
++    mEventCallback->bufferDone(bufferEvent);
++
++    if (!inputCam3Buf) {
++        std::unique_lock<std::mutex> lock(mLock);
++        mCaptureRequest.erase(frameNumber);
++    }
++
++    return true;
++}
++
++void Camera3Stream::faceRunningByCondition(const icamera::camera_buffer_t& buffer) {
++    if (!mFaceDetection) return;
++
++    LOG2("[%p]@%s", this, __func__);
++
++    /*
++       FD runs 1 frame every mFDRunInterval frames.
++       And the default value of mFDRunInterval is mFDRunDefaultInterval
++    */
++    if (mFrameCnt % mFDRunInterval == 0) {
++        mFaceDetection->runFaceDetection(buffer);
++    }
++
++    /*
++       When face doesn't be detected during mFDRunIntervalNoFace's frame,
++       we may change FD running's interval frames.
++    */
++    if (mFDRunIntervalNoFace > mFDRunDefaultInterval) {
++        static unsigned int noFaceCnt = 0;
++        int faceNum = mFaceDetection->getFaceNum();
++
++        /*
++           The purpose of changing the value of the variable is to run FD
++           immediately when face is detected.
++        */
++        if (faceNum == 0) {
++            if (mFDRunInterval != mFDRunIntervalNoFace) {
++                noFaceCnt = ++noFaceCnt % mFDRunIntervalNoFace;
++                if (noFaceCnt == 0) {
++                    mFDRunInterval = mFDRunIntervalNoFace;
++                }
++            }
++        } else {
++            if (mFDRunInterval != mFDRunDefaultInterval) {
++                mFDRunInterval = mFDRunDefaultInterval;
++                mFrameCnt = mFDRunInterval - 1;
++                noFaceCnt = 0;
++            }
++        }
++        LOG2("%s, Currently running one time face detection every %d frames", __func__,
++             mFDRunInterval);
++    }
++
++    mFrameCnt = ++mFrameCnt % mFDRunInterval;
++}
++
++void Camera3Stream::requestExit() {
++    LOG1("[%p]@%s", this, __func__);
++
++    icamera::Thread::requestExit();
++    std::lock_guard<std::mutex> l(mLock);
++
++    mBufferDoneCondition.notify_one();
++
++    if (mFaceDetection) {
++        icamera::FaceDetection::destoryInstance(mCameraId);
++        mFaceDetection = nullptr;
++    }
++}
++
++int Camera3Stream::processRequest(const std::shared_ptr<Camera3Buffer>& inputCam3Buf,
++                                  const camera3_stream_buffer_t& outputBuffer,
++                                  uint32_t frame_number) {
++    LOG1("[%p] isHALStream: %d @%s", this, mIsHALStream, __func__);
++
++    std::shared_ptr<Camera3Buffer> ccBuf = std::make_shared<Camera3Buffer>();
++    buffer_handle_t handle = *outputBuffer.buffer;
++
++    {
++        std::unique_lock<std::mutex> lock(mLock);
++        CheckError(mBuffers.find(handle) != mBuffers.end(), icamera::BAD_VALUE,
++                   "handle %p is duplicated!", handle);
++
++        mBuffers[handle] = ccBuf;
++    }
++
++    icamera::status_t status = ccBuf->init(&outputBuffer, mCameraId);
++    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
++    status = ccBuf->waitOnAcquireFence();
++    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
++    status = ccBuf->lock();
++    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
++
++    std::shared_ptr<StreamComInfo> streamInfo = std::make_shared<StreamComInfo>();
++    streamInfo->cam3Buf = nullptr;
++    {
++        std::lock_guard<std::mutex> l(mLock);
++
++        if (inputCam3Buf) {
++            LOG1("[%p] frameNumber %d input buffer requested ", this, frame_number);
++            return icamera::OK;
++        }
++
++        if (mPostProcessType == icamera::POST_PROCESS_NONE) {
++            streamInfo->cam3Buf = ccBuf;
++        }
++        mCaptureRequest[frame_number] = streamInfo;
++    }
++
++    return icamera::OK;
++}
++
++void Camera3Stream::queueBufferDone(uint32_t frameNumber,
++                                    const std::shared_ptr<Camera3Buffer>& inputCam3Buf,
++                                    const camera3_stream_buffer_t& outputBuffer,
++                                    const icamera::Parameters& param) {
++    LOG1("[%p]@%s, frameNumber:%d", this, __func__, frameNumber);
++    std::lock_guard<std::mutex> l(mLock);
++
++    std::shared_ptr<CaptureResult> result = std::make_shared<CaptureResult>();
++
++    result->frameNumber = frameNumber;
++    result->outputBuffer = outputBuffer;
++    result->handle = *outputBuffer.buffer;
++    result->outputBuffer.buffer = &result->handle;
++    result->inputCam3Buf = inputCam3Buf;
++    result->param = param;
++
++    mCaptureResultMap[frameNumber] = result;
++    mBufferDoneCondition.notify_one();
++}
++
++int Camera3Stream::setActive(bool state) {
++    LOG1("[%p]@%s isHALStream: %d state %d", this, __func__, mIsHALStream, state);
++
++    if (!mStreamState && state) {
++        std::string threadName = "Cam3Stream-";
++        threadName += std::to_string(mHALStream.id);
++
++        // Run Camera3Stream thread
++        run(threadName);
++
++        if (mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
++            // configure the post processing.
++            // Note: the mHALStream may be changed after calling this function
++            mPostProcessor->configure(mStream, mHALStream);
++            mPostProcessType = mPostProcessor->getPostProcessType();
++            LOG2("@%s, mPostProcessType:%d", __func__, mPostProcessType);
++        }
++
++        if (mIsHALStream) {
++            mBufferPool->createBufferPool(mCameraId, mMaxNumReqInProc, mHALStream);
++            LOG2("@%s, HAL stream create BufferPool", __func__);
++        }
++
++        if (mInputPostProcessor) {
++            mInputPostProcessor->configure(mStream, *mInputStream.get());
++            mInputPostProcessType = mInputPostProcessor->getPostProcessType();
++        }
++    } else if (mStreamState && !state) {
++        mPostProcessType = icamera::POST_PROCESS_NONE;
++
++        if (mInputPostProcessor) {
++            mInputPostProcessType = icamera::POST_PROCESS_NONE;
++        }
++
++        if (mBufferPool) {
++            mBufferPool->destroyBufferPool();
++        }
++
++        // Exit Camera3Stream thread
++        requestExit();
++    }
++
++    mStreamState = state;
++
++    return icamera::OK;
++}
++
++void Camera3Stream::activateFaceDetection(unsigned int maxFaceNum) {
++    LOG1("[%p]@%s maxFaceNum %d, mCameraId %d", this, __func__, maxFaceNum, mCameraId);
++
++    mFaceDetection = icamera::FaceDetection::createInstance(mCameraId, maxFaceNum, mHALStream.id,
++                                                            mHALStream.width, mHALStream.height);
++}
++
++void Camera3Stream::addListener(Camera3Stream* listener) {
++    mListeners.push_back(listener);
++}
++
++/* fetch the buffers will be queued to Hal, the buffer has 3 sources:
++ * 1st using HAL stream's request, then the buffer->addr should equal
++ *     request->cam3Buf->addr()
++ * 2nd if using listener buffer directly
++ * 3rd using bufferpool, the buffer from pool is stored in mQueuedBuffer
++ */
++bool Camera3Stream::fetchRequestBuffers(icamera::camera_buffer_t* buffer, uint32_t frameNumber) {
++    if (!mIsHALStream) return false;
++    LOG1("[%p]@%s isHALStream: %d frameNumber %d", this, __func__, mIsHALStream, frameNumber);
++
++    int requestStreamCount = 0;
++    std::shared_ptr<StreamComInfo> request = nullptr;
++    std::shared_ptr<Camera3Buffer> buf = nullptr;
++
++    // check if any one provided a buffer in listeners
++    for (auto& iter : mListeners) {
++        request = iter->getCaptureRequest(frameNumber);
++        if (request) {
++            requestStreamCount++;
++            buf = request->cam3Buf ? request->cam3Buf : buf;
++        }
++    }
++
++    // if HAL stream has a buffer, use HAL stream's buffer to qbuf/dqbuf
++    request = getCaptureRequest(frameNumber);
++    if (request) {
++        requestStreamCount++;
++        buf = request->cam3Buf ? request->cam3Buf : buf;
++    }
++
++    if (!requestStreamCount) {
++        // no stream requested
++        return false;
++    }
++
++    /* Fix me... if has 2 or more streams, use the same buffer.
++     ** if >= 2 streams request in same frame, we use buffer pool temporary.
++     ** to do: prefer to use user buffer to avoid memcpy
++     */
++    if (!buf || requestStreamCount >= 2) {
++        LOG1("[%p]@%s get buffer from pool", this, __func__);
++        if (mBufferPool) {
++            buf = mBufferPool->acquireBuffer();
++            CheckError(buf == nullptr, false, "no available internal buffer");
++            // using buffer pool, store the buffer, then can return it when frame done
++            mQueuedBuffer[frameNumber] = buf;
++        } else {
++            return false;
++        }
++    }
++
++    *buffer = buf->getHalBuffer();
++    // Fill the specific setting
++    buffer->s.usage = mHALStream.usage;
++    buffer->s.id = mHALStream.id;
++
++    return true;
++}
++
++// to check if a HW stream is triggered by it's listener
++void Camera3Stream::checkListenerRequest(uint32_t frameNumber) {
++    if (!mIsHALStream) return;
++
++    LOG1("[%p]@%s, frameNumber:%d", this, __func__, frameNumber);
++
++    bool listenerRequested = false;
++    for (auto& iter : mListeners) {
++        listenerRequested |= iter->getCaptureRequest(frameNumber) != nullptr;
++    }
++
++    if (!getCaptureRequest(frameNumber) && listenerRequested) {
++        // HW stream is enabled by listener's request
++        std::shared_ptr<CaptureResult> result = std::make_shared<CaptureResult>();
++        LOG1("[%p]@%s, frameNumber:%d, only listener requested", this, __func__,
++             frameNumber);
++        if (result) {
++            std::lock_guard<std::mutex> l(mLock);
++            result->frameNumber = frameNumber;
++            result->inputCam3Buf = nullptr;
++            mCaptureResultMap[frameNumber] = result;
++        }
++        mBufferDoneCondition.notify_one();
++    }
++}
++
++void Camera3Stream::notifyListenerBufferReady(uint32_t frameNumber,
++                                              const std::shared_ptr<StreamComInfo>& halOutput) {
++    LOG1("[%p] @%s", this, __func__);
++    std::lock_guard<std::mutex> l(mLock);
++    if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
++        mHALStreamOutput[frameNumber] = halOutput;
++        mBufferDoneCondition.notify_one();
++    }
++}
++
++std::shared_ptr<StreamComInfo> Camera3Stream::getCaptureRequest(uint32_t frameNumber) {
++    std::lock_guard<std::mutex> l(mLock);
++    std::shared_ptr<StreamComInfo> request = nullptr;
++
++    if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
++        request = mCaptureRequest[frameNumber];
++    }
++    return request;
++}
++
++bool Camera3Stream::waitCaptureResultReady() {
++    std::unique_lock<std::mutex> lock(mLock);
++    /* 1st loop, the HAL and listener stream wait on the CaptureResult
++     * BufferDoneCondition if the CaptureResultVector not empty.
++     * 2nd loop, the CaptureResult is not empty, and the HAL stream will start to
++     * dqbuf the listener stream should wait HAL Stream send out buffer ready event
++     * if it doesn't have inputCam3Buf.
++     * 3rd loop, (listener stream only) both vecotr are not empty, return true.
++     */
++    // HAL stream and listener stream should wait RequestManager notification
++    bool needWaitBufferReady = mCaptureResultMap.empty();
++    // listeners stream should wait HAL output buffer if not has input buffer
++    if (!mIsHALStream && !mCaptureResultMap.empty()) {
++        auto captureResult = mCaptureResultMap.begin();
++        std::shared_ptr<CaptureResult> result = captureResult->second;
++        needWaitBufferReady = !result->inputCam3Buf && mHALStreamOutput.empty();
++    }
++    if (needWaitBufferReady) {
++        std::cv_status ret = mBufferDoneCondition.wait_for(
++            lock, std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
++        if (ret == std::cv_status::timeout) {
++            LOGW("[%p]%s, wait buffer ready time out", this, __func__);
++        }
++        // return false to make the threadLoop run again
++        return false;
++    }
++
++    return true;
++}
++
++void Camera3Stream::requestStreamDone(uint32_t frameNumber) {
++    if (!mIsHALStream) return;
++
++    LOG1("[%p] @%s frameNumber: %d", this, __func__, frameNumber);
++
++    /* release buffers. if the buffer used to qbuf/dqbuf is from listener or HAL
++     * stream, it will be released in its stream, because now we use buffer pool
++     * to sync buffer between frames.
++     */
++    std::unique_lock<std::mutex> lock(mLock);
++    if (mQueuedBuffer.find(frameNumber) != mQueuedBuffer.end()) {
++        // if HAL stream using buffer from pool to qbuf/dqbuf, return it
++        mBufferPool->returnBuffer(mQueuedBuffer[frameNumber]);
++        mQueuedBuffer.erase(frameNumber);
++    }
++}
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.h b/camera/hal/intel/ipu6/aal/Camera3Stream.h
+new file mode 100644
+index 000000000000..66cd05de56fb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/Camera3Stream.h
+@@ -0,0 +1,177 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include <map>
++#include <memory>
++#include <mutex>
++#include <unordered_map>
++#include <utility>
++#include <vector>
++
++#include "Camera3BufferPool.h"
++#include "FaceDetection.h"
++#include "PostProcessor.h"
++#include "ResultProcessor.h"
++#include "Thread.h"
++
++namespace camera3 {
++
++struct CaptureResult {
++    uint32_t frameNumber;
++    camera3_stream_buffer_t outputBuffer;
++    buffer_handle_t handle;
++    std::shared_ptr<Camera3Buffer> inputCam3Buf;
++    icamera::Parameters param;
++};
++
++struct StreamComInfo {
++    std::shared_ptr<Camera3Buffer> cam3Buf;
++    icamera::Parameters parameter;
++};
++
++/**
++ * \class InternalBufferPool
++ *
++ * This class is used to manage a local memory pool for still and post
++ * processing stream It needs to follow the calling sequence: allocBuffers ->
++ * acquireBuffer -> findBuffer -> returnBuffer
++ */
++class InternalBufferPool {
++ public:
++    InternalBufferPool();
++    ~InternalBufferPool();
++
++    icamera::status_t allocBuffers(const icamera::stream_t& stream, uint32_t numBuffers,
++                                   int cameraId);
++    void destroyBuffers();
++    std::shared_ptr<Camera3Buffer> acquireBuffer();
++    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
++    std::shared_ptr<Camera3Buffer> findBuffer(void* memAddr);
++
++ private:
++    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool>
++        mInterBuf;  // first: camera3Buffer, second: busy
++    std::mutex mLock;
++};
++
++/**
++ * \class Camera3Stream
++ *
++ * This class is used to handle requests. It has the following
++ * roles:
++ * - It instantiates PostProcessor.
++ */
++class Camera3Stream : public icamera::Thread {
++ public:
++    Camera3Stream(int cameraId, CallbackEventInterface* callback, uint32_t maxNumReqInProc,
++                  const icamera::stream_t& halStream, const camera3_stream_t& stream,
++                  const camera3_stream_t* inputStream = nullptr, bool isHWStream = false);
++    virtual ~Camera3Stream();
++
++    virtual bool threadLoop();
++    virtual void requestExit();
++
++    int processRequest(const std::shared_ptr<Camera3Buffer>& inputCam3Buf,
++                       const camera3_stream_buffer_t& outputBuffer, uint32_t frameNumber);
++
++    void queueBufferDone(uint32_t frameNumber, const std::shared_ptr<Camera3Buffer>& inputCam3Buf,
++                         const camera3_stream_buffer_t& outputBuffer,
++                         const icamera::Parameters& param);
++    int setActive(bool state);
++    bool isActive() { return mStreamState; }
++    void activateFaceDetection(unsigned int maxFaceNum);
++    int getPostProcessType() { return mPostProcessType; }
++    void sendEvent(const icamera::camera_msg_data_t& data);
++    void addListener(Camera3Stream* listener);
++    // fetch the buffers will be queued to Hal, HAL stream only
++    bool fetchRequestBuffers(icamera::camera_buffer_t* buffer, uint32_t frameNumber);
++    // check if the HW stream should be enabled by listener request
++    void checkListenerRequest(uint32_t frameNumber);
++    // called by RequestManager indicates the frame is done, release buffers
++    void requestStreamDone(uint32_t frameNumber);
++
++ private:
++    void handleSofAlignment();
++    /* get the request status anf Camera3Buf of this stream
++    ** return nullptr if stream not requested the frame
++    */
++    std::shared_ptr<StreamComInfo> getCaptureRequest(uint32_t frameNumber);
++    void notifyListenerBufferReady(uint32_t frameNumber,
++                                   const std::shared_ptr<StreamComInfo>& halOutput);
++
++    /* HAL stream or listener stream to wait capture buffer result ready,
++     ** called in ThreadLoop, return false if need to wait,
++     ** return true to continue the threadloop.
++     */
++    bool waitCaptureResultReady();
++
++ private:
++    const uint64_t kMaxDuration = 2000000000;  // 2000ms
++
++    int mCameraId;
++    std::condition_variable mBufferDoneCondition;
++    std::mutex mLock;
++
++    std::condition_variable mSofCondition;
++    std::mutex mSofLock;
++
++    CallbackEventInterface* mEventCallback;
++
++    int mPostProcessType;
++    std::unique_ptr<PostProcessor> mPostProcessor;
++
++    bool mStreamState;
++    icamera::stream_t mHALStream;
++    uint32_t mMaxNumReqInProc;
++    std::unique_ptr<Camera3BufferPool> mBufferPool;
++
++    camera3_stream_t mStream;
++
++    /* key is frame number, value is CaptureResult */
++    std::map<uint32_t, std::shared_ptr<CaptureResult>> mCaptureResultMap;
++    std::map<buffer_handle_t, std::shared_ptr<Camera3Buffer>> mBuffers;
++
++    icamera::FaceDetection* mFaceDetection;
++    unsigned int mFDRunDefaultInterval;  // FD running's interval frames.
++    unsigned int mFDRunIntervalNoFace;   // FD running's interval frames without face.
++    unsigned int mFDRunInterval;         // run 1 frame every mFDRunInterval frames.
++    unsigned int mFrameCnt;              // from 0 to (mFDRunInterval - 1).
++
++    int mInputPostProcessType;
++    std::unique_ptr<PostProcessor> mInputPostProcessor;
++    std::unique_ptr<camera3_stream_t> mInputStream;
++
++    bool mIsHALStream;
++
++    /* save output info, each stream can accept maxNumReqInProc
++     ** requests. used by HAL stream to get listener request status
++     */
++    std::unordered_map<uint32_t, std::shared_ptr<StreamComInfo>> mCaptureRequest;
++    std::vector<Camera3Stream*> mListeners;
++    // HAL streams output result, listener stream will wait on it before process
++    std::unordered_map<uint32_t, std::shared_ptr<StreamComInfo>> mHALStreamOutput;
++
++    // save buffer obj when HAL choose buffer from pool to do qbuf/dqbuf
++    std::unordered_map<uint32_t, std::shared_ptr<Camera3Buffer>> mQueuedBuffer;
++
++    void faceRunningByCondition(const icamera::camera_buffer_t& buffer);
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/HALv3Interface.h b/camera/hal/intel/ipu6/aal/HALv3Interface.h
+new file mode 100644
+index 000000000000..28276dc0f2ed
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/HALv3Interface.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++namespace camera3 {
++
++/**
++ * \brief An interface used to callback RequestManager.
++ */
++class RequestManagerCallback {
++ public:
++    RequestManagerCallback() {}
++    virtual ~RequestManagerCallback() {}
++
++    virtual void returnRequestDone(uint32_t frameNumber) = 0;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.cpp b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
+new file mode 100644
+index 000000000000..4dc094d6693d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
+@@ -0,0 +1,161 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "HalV3Utils"
++#include <chromeos-config/libcros_config/cros_config.h>
++#include <linux/videodev2.h>
++
++#include <memory>
++#include <string>
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "PlatformData.h"
++#include "Utils.h"
++
++namespace camera3 {
++namespace HalV3Utils {
++
++constexpr char kCrosConfigCameraPath[] = "/camera";
++constexpr char kCrosConfigCount[] = "count";
++
++static const char* Camera3StreamTypes[] = {"OUTPUT",         // CAMERA3_STREAM_OUTPUT
++                                           "INPUT",          // CAMERA3_STREAM_INPUT
++                                           "BIDIRECTIONAL",  // CAMERA3_STREAM_BIDIRECTIONAL
++                                           "INVALID"};
++
++const char* getCamera3StreamType(int type) {
++    int num = sizeof(Camera3StreamTypes) / sizeof(Camera3StreamTypes[0]);
++    return (type >= 0 && type < num) ? Camera3StreamTypes[type] : Camera3StreamTypes[num - 1];
++}
++
++int HALFormatToV4l2Format(int cameraId, int halFormat, int usage) {
++    LOG1("@%s", __func__);
++
++    int format = -1;
++    switch (halFormat) {
++        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
++            if (IS_ZSL_USAGE(usage)) {
++                format = icamera::PlatformData::getISysRawFormat(cameraId);
++            } else {
++                format = V4L2_PIX_FMT_NV12;
++            }
++            break;
++        case HAL_PIXEL_FORMAT_YCbCr_420_888:
++        case HAL_PIXEL_FORMAT_BLOB:
++            format = V4L2_PIX_FMT_NV12;
++            break;
++        case HAL_PIXEL_FORMAT_RAW_OPAQUE:
++            format = icamera::PlatformData::getISysRawFormat(cameraId);
++            break;
++        default:
++            LOGW("unsupport format %d", halFormat);
++            break;
++    }
++
++    return format;
++}
++
++int getRotationDegrees(const camera3_stream_t& stream) {
++    LOG1("@%s", __func__);
++    if (stream.stream_type != CAMERA3_STREAM_OUTPUT) {
++        LOG2("%s, no need rotation for stream type %d", __func__, stream.stream_type);
++        return 0;
++    }
++    switch (stream.crop_rotate_scale_degrees) {
++        case CAMERA3_STREAM_ROTATION_0:
++            return 0;
++        case CAMERA3_STREAM_ROTATION_90:
++            return 90;
++        case CAMERA3_STREAM_ROTATION_270:
++            return 270;
++        default:
++            LOGE("unsupport rotate degree: %d, the value must be (0,1,3)",
++                 stream.crop_rotate_scale_degrees);
++            return -1;
++    }
++}
++
++int fillHALStreams(int cameraId, const camera3_stream_t& camera3Stream, icamera::stream_t* stream) {
++    LOG1("@%s, cameraId:%d", __func__, cameraId);
++
++    stream->format = HALFormatToV4l2Format(cameraId, camera3Stream.format, camera3Stream.usage);
++    CheckError(stream->format == -1, icamera::BAD_VALUE, "unsupported format %x",
++               camera3Stream.format);
++
++    // For rotation cases, aal needs to get the psl output mapping to user requirement.
++    if (getRotationDegrees(camera3Stream) > 0) {
++        icamera::camera_resolution_t* psl = icamera::PlatformData::getPslOutputForRotation(
++            camera3Stream.width, camera3Stream.height, cameraId);
++
++        stream->width = psl ? psl->width : camera3Stream.height;
++        stream->height = psl ? psl->height : camera3Stream.width;
++        LOG1("%s, Use the psl output %dx%d to map user requirement: %dx%d", __func__, stream->width,
++             stream->height, camera3Stream.width, camera3Stream.height);
++    } else {
++        stream->width = camera3Stream.width;
++        stream->height = camera3Stream.height;
++    }
++
++    stream->field = 0;
++    stream->stride = icamera::CameraUtils::getStride(stream->format, stream->width);
++    stream->size =
++        icamera::CameraUtils::getFrameSize(stream->format, stream->width, stream->height);
++    stream->memType = V4L2_MEMORY_USERPTR;
++    stream->streamType = icamera::CAMERA_STREAM_OUTPUT;
++    if (camera3Stream.usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
++        stream->usage = icamera::CAMERA_STREAM_VIDEO_CAPTURE;
++    } else if (IS_ZSL_USAGE(camera3Stream.usage)) {
++        stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
++    } else {
++        if (camera3Stream.format == HAL_PIXEL_FORMAT_BLOB) {
++            stream->usage = icamera::CAMERA_STREAM_STILL_CAPTURE;
++        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
++            // Check if it is YUV capture
++            int size = stream->width * stream->height;
++            stream->usage = (size > RESOLUTION_1080P_WIDTH * RESOLUTION_1080P_HEIGHT)
++                                ? icamera::CAMERA_STREAM_STILL_CAPTURE
++                                : icamera::CAMERA_STREAM_PREVIEW;
++        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
++            stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
++        } else {
++            stream->usage = icamera::CAMERA_STREAM_PREVIEW;
++        }
++    }
++
++    LOG2("@%s, stream: width:%d, height:%d, usage %d", __func__, stream->width, stream->height,
++         stream->usage);
++    return icamera::OK;
++}
++
++// Only when /run/chromos-config/v1/camera/count exists on the board, it returns
++// the real camera number, otherwise it returns 0.
++int getHwCameraNumber() {
++    int cameraNumber = 0;
++    brillo::CrosConfig crosConfig;
++    bool status = crosConfig.Init();
++    CheckWarning(!status, 0, "@%s, Failed to initialize CrOS config", __func__);
++
++    std::string cameraCount;
++    status = crosConfig.GetString(kCrosConfigCameraPath, kCrosConfigCount, &cameraCount);
++    CheckWarning(!status, 0, "@%s, Failed to get camera number", __func__);
++    cameraNumber = atoi(cameraCount.c_str());
++
++    return cameraNumber;
++}
++
++}  // namespace HalV3Utils
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.h b/camera/hal/intel/ipu6/aal/HALv3Utils.h
+new file mode 100644
+index 000000000000..59b6b02311cf
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/HALv3Utils.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include "Parameters.h"
++#include "iutils/CameraLog.h"
++
++namespace camera3 {
++
++#undef LOG1
++#undef LOG2
++#undef LOGI
++#undef LOGW
++#undef LOGE
++#undef SLOWLY_MULTIPLIER
++
++#define SLOWLY_MULTIPLIER (icamera::gSlowlyRunRatio ? icamera::gSlowlyRunRatio : 1)
++#define IS_ZSL_USAGE(usage) (((usage)&GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL)
++
++#ifdef HAVE_LINUX_OS
++
++#define LOG1(format, args...)                                                              \
++    icamera::Log::print_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_LEVEL1, LOG_TAG, \
++                            icamera::CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
++#define LOG2(format, args...)                                                              \
++    icamera::Log::print_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_LEVEL2, LOG_TAG, \
++                            icamera::CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
++#define LOGFPS(format, args...)                                                         \
++    icamera::Log::print_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_FPS, LOG_TAG, \
++                            icamera::CAMERA_DEBUG_LOG_FPS, format, ##args)
++#define LOGI(format, args...) \
++    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_INFO, format, ##args)
++#define LOGW(format, args...) \
++    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_WARNING, format, ##args)
++#define LOGE(format, args...) \
++    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_ERR, format, ##args)
++
++#else
++
++#define LOG1(...)                                                                   \
++    icamera::__camera_hal_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_LEVEL1, \
++                              ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOG2(...)                                                                   \
++    icamera::__camera_hal_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_LEVEL2, \
++                              ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGFPS(...)                                                              \
++    icamera::__camera_hal_log(icamera::gLogLevel& icamera::CAMERA_DEBUG_LOG_FPS, \
++                              ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGI(...) icamera::__camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
++#define LOGW(...) icamera::__camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
++#define LOGE(...) icamera::__camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
++
++#endif
++namespace HalV3Utils {
++const char* getCamera3StreamType(int type);
++int HALFormatToV4l2Format(int cameraId, int halFormat, int usage);
++int getRotationDegrees(const camera3_stream_t& stream);
++int fillHALStreams(int cameraId, const camera3_stream_t& camera3Stream, icamera::stream_t* stream);
++int getHwCameraNumber();
++}  // namespace HalV3Utils
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
+new file mode 100644
+index 000000000000..1b79130ae2be
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
+@@ -0,0 +1,285 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAEStateMachine"
++
++#include "IntelAEStateMachine.h"
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++IntelAEStateMachine::IntelAEStateMachine(int cameraId)
++        : mCameraId(cameraId),
++          mLastControlMode(0),
++          mLastSceneMode(0),
++          mCurrentAeMode(NULL) {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++    mCurrentAeMode = &mAutoMode;
++    CLEAR(mLastAeControls);
++    mLastAeControls.aeMode = ANDROID_CONTROL_AE_MODE_ON;
++}
++
++IntelAEStateMachine::~IntelAEStateMachine() {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++}
++
++/**
++ * Process states in input stage before the AE is run.
++ * It is initializing the current state if input
++ * parameters have an influence.
++ *
++ * \param[IN] controlMode: control.controlMode
++ * \param[IN] sceneMode: control.sceneMode
++ * \param[IN] aeControls: set of control.<ae>
++ */
++int IntelAEStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
++                                      const AeControls& aeControls) {
++    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
++        LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d", __func__, controlMode,
++             aeControls.aeMode);
++        mCurrentAeMode = &mOffMode;
++    } else {
++        if (aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
++            mCurrentAeMode = &mOffMode;
++            LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d", __func__, controlMode,
++                 aeControls.aeMode);
++        } else {
++            LOG2("%s: Set AE AutoMode: controlMode = %d, aeMode = %d", __func__, controlMode,
++                 aeControls.aeMode);
++            mCurrentAeMode = &mAutoMode;
++        }
++    }
++
++    mLastAeControls = aeControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++
++    return mCurrentAeMode->processState(controlMode, sceneMode, aeControls);
++}
++
++/**
++ * Process results and define output state after the AE is run
++ *
++ * \param[IN] aeConverged: from the ae result
++ * \param[IN] results: cameraMetadata to write dynamic tags.
++ */
++int IntelAEStateMachine::processResult(bool aeConverged, android::CameraMetadata* result) {
++    CheckError(!mCurrentAeMode, icamera::UNKNOWN_ERROR, "Invalid AE mode");
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++
++    return mCurrentAeMode->processResult(aeConverged, result);
++}
++
++/******************************************************************************
++ * AE MODE   -  BASE
++ ******************************************************************************/
++IntelAEModeBase::IntelAEModeBase()
++        : mLastControlMode(0),
++          mLastSceneMode(0),
++          mEvChanged(false),
++          mLastAeConvergedFlag(false),
++          mAeRunCount(0),
++          mAeConvergedCount(0),
++          mCurrentAeState(ANDROID_CONTROL_AE_STATE_INACTIVE) {
++    LOG1("%s", __func__);
++    CLEAR(mLastAeControls);
++}
++
++void IntelAEModeBase::updateResult(android::CameraMetadata* results) {
++    CheckError(!results, VOID_VALUE, "%s, result is nullptr", __func__);
++    LOG2("%s: current AE state is: %d", __func__, mCurrentAeState);
++
++    //# METADATA_Dynamic control.aeMode done
++    results->update(ANDROID_CONTROL_AE_MODE, &mLastAeControls.aeMode, 1);
++    //# METADATA_Dynamic control.aeLock done
++    results->update(ANDROID_CONTROL_AE_LOCK, &mLastAeControls.aeLock, 1);
++    //# METADATA_Dynamic control.aePrecaptureTrigger done
++    results->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &mLastAeControls.aePreCaptureTrigger, 1);
++    //# METADATA_Dynamic control.aeState done
++    results->update(ANDROID_CONTROL_AE_STATE, &mCurrentAeState, 1);
++}
++
++void IntelAEModeBase::resetState() {
++    LOG2("%s", __func__);
++
++    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++    mLastAeConvergedFlag = false;
++    mAeRunCount = 0;
++    mAeConvergedCount = 0;
++}
++
++/******************************************************************************
++ * AE MODE   -  OFF
++ ******************************************************************************/
++
++IntelAEModeOff::IntelAEModeOff() : IntelAEModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAEModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
++                                 const AeControls& aeControls) {
++    LOG2("%s", __func__);
++
++    mLastAeControls = aeControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++
++    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
++        aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
++        resetState();
++    } else {
++        LOGE("AE State machine should not be OFF! - Fix bug");
++        return icamera::UNKNOWN_ERROR;
++    }
++
++    return icamera::OK;
++}
++
++int IntelAEModeOff::processResult(bool aeConverged, android::CameraMetadata* result) {
++    UNUSED(aeConverged);
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    LOG2("%s", __func__);
++
++    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++/******************************************************************************
++ * AE MODE   -  AUTO
++ ******************************************************************************/
++
++IntelAEModeAuto::IntelAEModeAuto() : IntelAEModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAEModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
++                                  const AeControls& aeControls) {
++    if (controlMode != mLastControlMode) {
++        LOG1("%s: control mode has changed %d -> %d, reset AE State", __func__, controlMode,
++             mLastControlMode);
++        resetState();
++    }
++
++    if (aeControls.aeLock == ANDROID_CONTROL_AE_LOCK_ON) {
++        // If ev compensation changes, we have to let the AE run until
++        // convergence. Thus we need to figure out changes in compensation and
++        // only change the state immediately to locked,
++        // IF the EV did not change.
++        if (mLastAeControls.evCompensation != aeControls.evCompensation) mEvChanged = true;
++
++        if (!mEvChanged) mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
++    } else if (aeControls.aeMode != mLastAeControls.aeMode ||
++               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
++                sceneMode != mLastSceneMode)) {
++        resetState();
++    } else {
++        switch (mCurrentAeState) {
++            case ANDROID_CONTROL_AE_STATE_LOCKED:
++                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++                break;
++            case ANDROID_CONTROL_AE_STATE_SEARCHING:
++            case ANDROID_CONTROL_AE_STATE_INACTIVE:
++            case ANDROID_CONTROL_AE_STATE_CONVERGED:
++            case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
++            case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
++                if (aeControls.aePreCaptureTrigger == ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START)
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE;
++
++                if (aeControls.aePreCaptureTrigger == ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL)
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++                break;
++            default:
++                LOGE("Invalid AE state!, State set to INACTIVE");
++                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++
++                break;
++        }
++    }
++    mLastAeControls = aeControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++    return icamera::OK;
++}
++
++int IntelAEModeAuto::processResult(bool aeConverged, android::CameraMetadata* result) {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    switch (mCurrentAeState) {
++        case ANDROID_CONTROL_AE_STATE_LOCKED:
++            // do nothing
++            break;
++        case ANDROID_CONTROL_AE_STATE_INACTIVE:
++        case ANDROID_CONTROL_AE_STATE_SEARCHING:
++        case ANDROID_CONTROL_AE_STATE_CONVERGED:
++        case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
++            if (aeConverged) {
++                mEvChanged = false;  // converged -> reset
++                if (mLastAeControls.aeLock) {
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
++                } else {
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
++                }
++            } else {
++                mCurrentAeState = ANDROID_CONTROL_AE_STATE_SEARCHING;
++            }
++            break;
++        case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
++            if (aeConverged) {
++                mEvChanged = false;  // converged -> reset
++                if (mLastAeControls.aeLock) {
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
++                } else {
++                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
++                }
++            }  // here the else is staying at the same state.
++            break;
++        default:
++            LOGE("Invalid AE state!, State set to INACTIVE");
++            mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
++            break;
++    }
++
++    if (aeConverged) {
++        if (mLastAeConvergedFlag == true) {
++            mAeConvergedCount++;
++            LOG2("%s: AE converged for %d frames", __func__, mAeConvergedCount);
++        } else {
++            mAeConvergedCount = 1;
++            LOG1("%s: AE converging -> converged, after running AE for %d times", __func__,
++                 mAeRunCount);
++        }
++    } else {
++        if (mLastAeConvergedFlag == true) {
++            LOG1("%s: AE Converged -> converging", __func__);
++            mAeRunCount = 1;
++            mAeConvergedCount = 0;
++        } else {
++            mAeRunCount++;
++            LOG2("%s: AE converging for %d frames", __func__, mAeRunCount);
++        }
++    }
++    mLastAeConvergedFlag = aeConverged;
++
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
+new file mode 100644
+index 000000000000..83de125b8937
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
+@@ -0,0 +1,136 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "HALv3Header.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++/**
++ * \struct AeControls
++ *
++ * Control Modes saved and passed back to control unit after reading
++ *
++ */
++struct AeControls {
++    uint8_t aeMode;              /**< AE_MODE */
++    uint8_t aeLock;              /**< AE_LOCK */
++    uint8_t aePreCaptureTrigger; /**< PRECAPTURE_TRIGGER */
++    uint8_t sceneMode;           /**< SCENE_MODE */
++    int32_t evCompensation;      /**< AE_EXPOSURE_COMPENSATION */
++};
++
++/**
++ * \class IntelAEModeBase
++ *
++ * Base class for all the Autoexposure modes as defined by the Android
++ * camera device V3.x API.
++ * Each mode will follow certain state transitions. See documentation for
++ * android.control.aeState
++ *
++ */
++class IntelAEModeBase {
++ public:
++    IntelAEModeBase();
++    virtual ~IntelAEModeBase(){};
++
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
++                             const AeControls& aeControls) = 0;
++
++    virtual int processResult(bool aeConverged, android::CameraMetadata* results) = 0;
++
++    void resetState(void);
++    uint8_t getState() const { return mCurrentAeState; }
++
++ protected:
++    void updateResult(android::CameraMetadata* results);
++
++ protected:
++    AeControls mLastAeControls;
++    uint8_t mLastControlMode;
++    uint8_t mLastSceneMode;
++    bool mEvChanged; /**< set and kept to true when ev changes until
++                          converged */
++
++    bool mLastAeConvergedFlag;
++    uint8_t mAeRunCount;
++    uint8_t mAeConvergedCount;
++    uint8_t mCurrentAeState;
++};
++
++/**
++ * \class IntelAEModeAuto
++ * Derived class from IntelAEModeBase for Auto mode
++ *
++ */
++class IntelAEModeAuto : public IntelAEModeBase {
++ public:
++    IntelAEModeAuto();
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode, const AeControls& aeControls);
++    virtual int processResult(bool aeConverged, android::CameraMetadata* result);
++};
++
++/**
++ * \class IntelAEModeOFF
++ * Derived class from IntelAEModeBase for OFF mode
++ *
++ */
++class IntelAEModeOff : public IntelAEModeBase {
++ public:
++    IntelAEModeOff();
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode, const AeControls& aeControls);
++    virtual int processResult(bool aeConverged, android::CameraMetadata* result);
++};
++
++/**
++ * \class IntelAEStateMachine
++ *
++ * This class adapts the Android V3 AE triggers and state transitions to
++ * the ones implemented by the Intel AIQ algorithm
++ * This class is platform independent. Platform specific behaviors should be
++ * implemented in derived classes from this one or from the IntelAEModeBase
++ *
++ */
++class IntelAEStateMachine {
++ public:
++    IntelAEStateMachine(int cameraId);
++    virtual ~IntelAEStateMachine();
++
++    int processState(uint8_t controlMode, uint8_t sceneMode, const AeControls& aeControls);
++
++    int processResult(bool aeConverged, android::CameraMetadata* results);
++
++    uint8_t getState() const { return mCurrentAeMode->getState(); }
++
++ private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(IntelAEStateMachine);
++
++ private: /* members*/
++    int mCameraId;
++    AeControls mLastAeControls;
++    uint8_t mLastControlMode;
++    uint8_t mLastSceneMode;
++
++    IntelAEModeBase* mCurrentAeMode;
++
++    IntelAEModeOff mOffMode;
++    IntelAEModeAuto mAutoMode;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
+new file mode 100644
+index 000000000000..c409afeb3378
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
+@@ -0,0 +1,415 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAFStateMachine"
++
++#include "IntelAFStateMachine.h"
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++/**
++ * AF timeouts. Together these will make:
++ * timeout if: [MIN_AF_TIMEOUT - MAX_AF_FRAME_COUNT_TIMEOUT - MAX_AF_TIMEOUT]
++ * which translates to 2-4 seconds with the current values. Actual timeout value
++ * will depend on the FPS. E.g. >30FPS = 2s, 20FPS = 3s, <15FPS = 4s.
++ */
++
++/**
++ * MAX_AF_TIMEOUT
++ * Maximum time we allow the AF to iterate without a result.
++ * This timeout is the last resort, for very low FPS operation.
++ * Units are in microseconds.
++ * 4 seconds is a compromise between CTS & ITS. ITS allows for 10 seconds for
++ * 3A convergence. CTS1 allows only 5, but it doesn't require convergence, just
++ * a conclusion. We reserve one second for latencies to be safe. This makes the
++ * timeout 5 (cts1) - 1 (latency safety) = 4 seconds = 4000000us.
++ */
++static const long int MAX_AF_TIMEOUT = 4000000;  // 4 seconds
++
++/**
++ * MIN_AF_TIMEOUT
++ * For very high FPS use cases, we want to anyway allow some time for moving the
++ * lens.
++ */
++static const long int MIN_AF_TIMEOUT = 2000000;  // 2 seconds
++
++/**
++ * MAX_AF_FRAME_COUNT_TIMEOUT
++ * Maximum time we allow the AF to iterate without a result.
++ * Based on frames, as the AF algorithm itself needs frames for its operation,
++ * not just time, and the FPS varies.
++ * This is the timeout for normal operation, and translates to 2 seconds
++ * if FPS is 30.
++ */
++static const int MAX_AF_FRAME_COUNT_TIMEOUT = 60;  // 2 seconds if 30fps
++
++IntelAFStateMachine::IntelAFStateMachine(int cameraId) : mCameraId(cameraId) {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++    mCurrentAfMode = &mAutoMode;
++    mLastAfControls = {ANDROID_CONTROL_AF_MODE_AUTO, ANDROID_CONTROL_AF_TRIGGER_IDLE};
++}
++
++IntelAFStateMachine::~IntelAFStateMachine() {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++}
++
++int IntelAFStateMachine::processTriggers(uint8_t afTrigger, uint8_t afMode) {
++    if (afMode != mLastAfControls.afMode) {
++        LOG1("Change of AF mode from %d to %d", mLastAfControls.afMode, afMode);
++
++        switch (afMode) {
++            case ANDROID_CONTROL_AF_MODE_AUTO:
++            case ANDROID_CONTROL_AF_MODE_MACRO:
++                mCurrentAfMode = &mAutoMode;
++                break;
++            case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
++            case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
++                mCurrentAfMode = &mContinuousPictureMode;
++                break;
++            case ANDROID_CONTROL_AF_MODE_OFF:
++                mCurrentAfMode = &mOffMode;
++                break;
++            default:
++                LOGE("INVALID AF mode requested defaulting to AUTO");
++                mCurrentAfMode = &mAutoMode;
++                break;
++        }
++        mCurrentAfMode->resetState();
++    }
++    mLastAfControls.afTrigger = afTrigger;
++    mLastAfControls.afMode = afMode;
++
++    LOG2("%s: afMode %d", __func__, mLastAfControls.afMode);
++    return mCurrentAfMode->processTriggers(afTrigger, afMode);
++}
++
++int IntelAFStateMachine::processResult(int afState, bool lensMoving,
++                                       android::CameraMetadata* result) {
++    CheckError(!mCurrentAfMode, icamera::UNKNOWN_ERROR, "Invalid AF mode");
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++
++    return mCurrentAfMode->processResult(afState, lensMoving, result);
++}
++
++/**
++ * updateDefaults
++ *
++ * Used in case of error in the algorithm or fixed focus sensor
++ * In case of fixed focus sensor we always report locked
++ */
++int IntelAFStateMachine::updateDefaults(android::CameraMetadata* result, bool fixedFocus) const {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    mCurrentAfMode->updateResult(result);
++    uint8_t defaultState = ANDROID_CONTROL_AF_STATE_INACTIVE;
++    if (fixedFocus) defaultState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
++
++    result->update(ANDROID_CONTROL_AF_STATE, &defaultState, 1);
++
++    return icamera::OK;
++}
++
++/******************************************************************************
++ * AF MODE   -  BASE
++ ******************************************************************************/
++IntelAfModeBase::IntelAfModeBase()
++        : mCurrentAfState(ANDROID_CONTROL_AF_STATE_INACTIVE),
++          mLensState(ANDROID_LENS_STATE_STATIONARY),
++          mLastActiveTriggerTime(0),
++          mFramesSinceTrigger(0) {
++    LOG1("%s", __func__);
++    mLastAfControls = {ANDROID_CONTROL_AF_MODE_AUTO, ANDROID_CONTROL_AF_TRIGGER_IDLE};
++}
++
++/**
++ * processTriggers
++ *
++ * This method is called BEFORE auto focus algorithm has RUN
++ * Input parameters are pre-filled by the Intel3APlus::fillAfInputParams()
++ * by parsing the request settings.
++ * Other parameters from the capture request settings not filled in the input
++ * params structure is passed as argument
++ */
++int IntelAfModeBase::processTriggers(uint8_t afTrigger, uint8_t afMode) {
++    LOG2("%s", __func__);
++
++    if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
++        resetTrigger(icamera::CameraUtils::systemTime() / 1000);
++        LOG1("AF TRIGGER START");
++    } else if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
++        LOG1("AF TRIGGER CANCEL");
++        resetTrigger(0);
++    }
++    mLastAfControls.afTrigger = afTrigger;
++    mLastAfControls.afMode = afMode;
++    return icamera::OK;
++}
++
++void IntelAfModeBase::updateResult(android::CameraMetadata* results) {
++    CheckError(!results, VOID_VALUE, "%s, result is nullptr", __func__);
++    LOG2("%s", __func__);
++
++    LOG2("%s afMode = %d state = %d", __func__, mLastAfControls.afMode, mCurrentAfState);
++
++    results->update(ANDROID_CONTROL_AF_MODE, &mLastAfControls.afMode, 1);
++    //# METADATA_Dynamic control.afTrigger done
++    results->update(ANDROID_CONTROL_AF_TRIGGER, &mLastAfControls.afTrigger, 1);
++    //# METADATA_Dynamic control.afState done
++    results->update(ANDROID_CONTROL_AF_STATE, &mCurrentAfState, 1);
++    /**
++     * LENS STATE update
++     */
++    //# METADATA_Dynamic lens.state Done
++    results->update(ANDROID_LENS_STATE, &mLensState, 1);
++}
++
++void IntelAfModeBase::resetTrigger(usecs_t triggerTime) {
++    mLastActiveTriggerTime = triggerTime;
++    mFramesSinceTrigger = 0;
++}
++
++void IntelAfModeBase::resetState() {
++    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
++}
++
++void IntelAfModeBase::checkIfFocusTimeout() {
++    // give up if AF was iterating for too long
++    if (mLastActiveTriggerTime != 0) {
++        mFramesSinceTrigger++;
++        usecs_t now = icamera::CameraUtils::systemTime() / 1000;
++        usecs_t timeSinceTriggered = now - mLastActiveTriggerTime;
++        if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) {
++            /**
++             * Timeout IF either time has passed beyond MAX_AF_TIMEOUT
++             *                         OR
++             * Enough frames have been processed and time has passed beyond
++             * MIN_AF_TIMEOUT
++             */
++            if (timeSinceTriggered > MAX_AF_TIMEOUT ||
++                (mFramesSinceTrigger > MAX_AF_FRAME_COUNT_TIMEOUT &&
++                 timeSinceTriggered > MIN_AF_TIMEOUT)) {
++                resetTrigger(0);
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
++            }
++        }
++    }
++}
++
++/******************************************************************************
++ * AF MODE   -  OFF
++ ******************************************************************************/
++
++IntelAFModeOff::IntelAFModeOff() : IntelAfModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAFModeOff::processTriggers(uint8_t afTrigger, uint8_t afMode) {
++    LOG2("%s", __func__);
++
++    mLastAfControls.afTrigger = afTrigger;
++    mLastAfControls.afMode = afMode;
++    return icamera::OK;
++}
++
++int IntelAFModeOff::processResult(int afState, bool lensMoving, android::CameraMetadata* result) {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    /**
++     * IN MANUAL and EDOF AF state never changes
++     */
++    LOG2("%s", __func__);
++
++    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
++    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++/******************************************************************************
++ * AF MODE   -  AUTO
++ ******************************************************************************/
++
++IntelAFModeAuto::IntelAFModeAuto() : IntelAfModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAFModeAuto::processTriggers(uint8_t afTrigger, uint8_t afMode) {
++    LOG2("%s", __func__);
++
++    IntelAfModeBase::processTriggers(afTrigger, afMode);
++
++    // Override AF state if we just got an AF TRIGGER Start
++    // This is only valid for the AUTO/MACRO state machine
++    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
++        mCurrentAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN;
++        LOG2("@%s AF state ACTIVE_SCAN (trigger start)", __PRETTY_FUNCTION__);
++    } else if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
++        mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
++        LOG2("@%s AF state INACTIVE (trigger cancel)", __PRETTY_FUNCTION__);
++    }
++
++    return icamera::OK;
++}
++
++int IntelAFModeAuto::processResult(int afState, bool lensMoving, android::CameraMetadata* result) {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    LOG2("%s", __func__);
++    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
++
++    if (mLastActiveTriggerTime != 0) {
++        switch (afState) {
++            case icamera::AF_STATE_LOCAL_SEARCH:
++            case icamera::AF_STATE_EXTENDED_SEARCH:
++                LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
++                break;
++            case icamera::AF_STATE_SUCCESS:
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
++                resetTrigger(0);
++                LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
++                break;
++            case icamera::AF_STATE_FAIL:
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
++                resetTrigger(0);
++                LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
++                break;
++            default:
++            case icamera::AF_STATE_IDLE:
++                LOG2("@%s AF state INACTIVE", __PRETTY_FUNCTION__);
++                break;
++        }
++    }
++
++    checkIfFocusTimeout();
++
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++/******************************************************************************
++ * AF MODE   -  CONTINUOUS PICTURE
++ ******************************************************************************/
++
++IntelAFModeContinuousPicture::IntelAFModeContinuousPicture() : IntelAfModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAFModeContinuousPicture::processTriggers(uint8_t afTrigger, uint8_t afMode) {
++    LOG2("%s", __func__);
++
++    IntelAfModeBase::processTriggers(afTrigger, afMode);
++
++    // Override AF state if we just got an AF TRIGGER CANCEL
++    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
++        /* Scan is supposed to be restarted, which we try by triggering a new
++         * scan. (see IntelAFStateMachine::processTriggers)
++         * This however, doesn't do anything at all, because AIQ does not
++         * want to play ball, at least yet.
++         *
++         * We can skip state transitions when allowed by the state
++         * machine documentation, so skip INACTIVE, also skip PASSIVE_SCAN if
++         * possible and go directly to either PASSIVE_FOCUSED or UNFOCUSED
++         *
++         * TODO: Remove this switch-statement, once triggering a scan starts to
++         * work. We could go directly to PASSIVE_SCAN always then, because a
++         * scan is really happening. Now it is not.
++         */
++        switch (mCurrentAfState) {
++            case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
++            case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
++                break;
++            case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
++                break;
++            default:
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
++                break;
++        }
++    }
++    /* Override AF state if we just got an AF TRIGGER START, this will stop
++     * the scan as intended in the state machine documentation (see
++     * IntelAFStateMachine::processTriggers)
++     */
++    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
++        if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
++            mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
++        else if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED ||
++                 mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
++            mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
++    }
++
++    return icamera::OK;
++}
++
++int IntelAFModeContinuousPicture::processResult(int afState, bool lensMoving,
++                                                android::CameraMetadata* result) {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    LOG2("%s", __func__);
++    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
++
++    // state transition from locked state are only allowed via triggers, which
++    // are handled in the currentAFMode processTriggers() and below in this
++    // function.
++    if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED &&
++        mCurrentAfState != ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
++        switch (afState) {
++            case icamera::AF_STATE_LOCAL_SEARCH:
++            case icamera::AF_STATE_EXTENDED_SEARCH:
++                LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
++                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
++                break;
++            case icamera::AF_STATE_SUCCESS:
++                if (mLastActiveTriggerTime == 0) {
++                    mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
++                    LOG2("@%s AF state PASSIVE_FOCUSED", __PRETTY_FUNCTION__);
++                } else {
++                    resetTrigger(0);
++                    mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
++                    LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
++                }
++                break;
++            case icamera::AF_STATE_FAIL:
++                if (mLastActiveTriggerTime == 0) {
++                    mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
++                    LOG2("@%s AF state PASSIVE_UNFOCUSED", __PRETTY_FUNCTION__);
++                } else {
++                    resetTrigger(0);
++                    mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
++                    LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
++                }
++                break;
++            default:
++            case icamera::AF_STATE_IDLE:
++                if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_INACTIVE) {
++                    mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
++                    LOG2("@%s AF state PASSIVE_UNFOCUSED (idle)", __PRETTY_FUNCTION__);
++                }
++                break;
++        }
++    }
++
++    checkIfFocusTimeout();
++
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
+new file mode 100644
+index 000000000000..a8eaac9a18d1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
+@@ -0,0 +1,142 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "HALv3Header.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++typedef int64_t usecs_t;
++
++/**
++ * \struct AfControls
++ *
++ * Control Modes saved and passed back to control unit after reading
++ *
++ */
++struct AfControls {
++    uint8_t afMode;    /**< AF_MODE */
++    uint8_t afTrigger; /**< AF_TRIGGER */
++};
++
++/**
++ * \class IntelAfModeBase
++ *
++ * Base class for all the AutoFocus modes as defined by the Android
++ * camera device V3.x API.
++ * Each mode will follow certain state transitions. See documentation for
++ * android.control.afState
++ *
++ */
++class IntelAfModeBase {
++ public:
++    IntelAfModeBase();
++    virtual ~IntelAfModeBase(){};
++
++    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode) = 0;
++    virtual int processResult(int afState, bool lensMoving, android::CameraMetadata* result) = 0;
++
++    void resetState(void);
++    void resetTrigger(usecs_t triggerTime);
++    int getState() { return mCurrentAfState; }
++    void updateResult(android::CameraMetadata* results);
++
++ protected:
++    void checkIfFocusTimeout();
++
++ protected:
++    AfControls mLastAfControls;
++    uint8_t mCurrentAfState;
++    uint8_t mLensState;
++    usecs_t mLastActiveTriggerTime; /**< in useconds */
++    uint32_t mFramesSinceTrigger;
++};
++
++/**
++ * \class IntelAFModeAuto
++ * Derived class from IntelAFModeBase for Auto mode
++ *
++ */
++class IntelAFModeAuto : public IntelAfModeBase {
++ public:
++    IntelAFModeAuto();
++    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
++    virtual int processResult(int afState, bool lensMoving, android::CameraMetadata* result);
++};
++
++/**
++ * \class IntelAFModeContinuousPicture
++ * Derived class from IntelAFModeBase for Continuous AF mode
++ *
++ */
++class IntelAFModeContinuousPicture : public IntelAfModeBase {
++ public:
++    IntelAFModeContinuousPicture();
++    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
++    virtual int processResult(int afState, bool lensMoving, android::CameraMetadata* result);
++};
++
++/**
++ * \class IntelAFModeOff
++ * Derived class from IntelAFModeBase for OFF mode
++ *
++ */
++class IntelAFModeOff : public IntelAfModeBase {
++ public:
++    IntelAFModeOff();
++    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
++    virtual int processResult(int afState, bool lensMoving, android::CameraMetadata* result);
++};
++
++/**
++ * \class IntelAFStateMachine
++ *
++ * This class adapts the Android V3 AF triggers and state transitions to
++ * the ones implemented by the Intel AIQ algorithm
++ * This class is platform independent. Platform specific behaviors should be
++ * implemented in derived classes from this one or from the IntelAFModeBase
++ *
++ */
++class IntelAFStateMachine {
++ public:
++    IntelAFStateMachine(int cameraId);
++    virtual ~IntelAFStateMachine();
++
++    int processTriggers(uint8_t afTrigger, uint8_t afMode);
++    int processResult(int afState, bool lensMoving, android::CameraMetadata* result);
++
++    int updateDefaults(android::CameraMetadata* result, bool fixedFocus = false) const;
++
++ private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(IntelAFStateMachine);
++
++ private: /* members*/
++    int mCameraId;
++    AfControls mLastAfControls;
++    IntelAfModeBase* mCurrentAfMode;
++
++    std::vector<uint8_t> mAvailableModes;
++
++    IntelAFModeOff mOffMode;
++    IntelAFModeAuto mAutoMode;
++
++    IntelAFModeContinuousPicture mContinuousPictureMode;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
+new file mode 100644
+index 000000000000..2f87680f5336
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
+@@ -0,0 +1,214 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAWBStateMachine"
++
++#include "IntelAWBStateMachine.h"
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++IntelAWBStateMachine::IntelAWBStateMachine(int aCameraId)
++        : mCameraId(aCameraId),
++          mLastControlMode(0),
++          mLastSceneMode(0),
++          mCurrentAwbMode(NULL) {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++    mCurrentAwbMode = &mAutoMode;
++    CLEAR(mLastAwbControls);
++    mLastAwbControls.awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
++}
++
++IntelAWBStateMachine::~IntelAWBStateMachine() {
++    LOG1("%s mCameraId %d", __func__, mCameraId);
++}
++
++int IntelAWBStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
++                                       const AwbControls& awbControls) {
++    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
++        mCurrentAwbMode = &mOffMode;
++
++        if (controlMode != mLastControlMode)
++            LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d", __func__, controlMode,
++                 awbControls.awbMode);
++    } else {
++        if (awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
++            mCurrentAwbMode = &mOffMode;
++            if (awbControls.awbMode != mLastAwbControls.awbMode)
++                LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d", __func__, controlMode,
++                     awbControls.awbMode);
++        } else {
++            mCurrentAwbMode = &mAutoMode;
++            if (awbControls.awbMode != mLastAwbControls.awbMode)
++                LOG1("%s: Set AWB autoMode: controlMode = %d, awbMode = %d", __func__, controlMode,
++                     awbControls.awbMode);
++        }
++    }
++
++    mLastAwbControls = awbControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++    return mCurrentAwbMode->processState(controlMode, sceneMode, awbControls);
++}
++
++int IntelAWBStateMachine::processResult(bool converged, android::CameraMetadata* result) {
++    CheckError(!mCurrentAwbMode, icamera::UNKNOWN_ERROR, "Invalid AWB mode");
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++
++    return mCurrentAwbMode->processResult(converged, result);
++}
++
++/******************************************************************************
++ * AWB MODE   -  BASE
++ ******************************************************************************/
++IntelAWBModeBase::IntelAWBModeBase()
++        : mLastControlMode(0),
++          mLastSceneMode(0),
++          mCurrentAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE) {
++    LOG1("%s", __func__);
++
++    CLEAR(mLastAwbControls);
++}
++
++void IntelAWBModeBase::updateResult(android::CameraMetadata* results) {
++    CheckError(!results, VOID_VALUE, "%s, result is nullptr", __func__);
++    LOG2("%s: current AWB state is: %d", __func__, mCurrentAwbState);
++
++    //# METADATA_Dynamic control.awbMode done
++    results->update(ANDROID_CONTROL_AWB_MODE, &mLastAwbControls.awbMode, 1);
++    //# METADATA_Dynamic control.awbLock done
++    results->update(ANDROID_CONTROL_AWB_LOCK, &mLastAwbControls.awbLock, 1);
++    //# METADATA_Dynamic control.awbState done
++    results->update(ANDROID_CONTROL_AWB_STATE, &mCurrentAwbState, 1);
++}
++
++void IntelAWBModeBase::resetState() {
++    LOG2("%s", __func__);
++
++    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++}
++
++/******************************************************************************
++ * AWB MODE   -  OFF
++ ******************************************************************************/
++
++IntelAWBModeOff::IntelAWBModeOff() : IntelAWBModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAWBModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
++                                  const AwbControls& awbControls) {
++    LOG2("%s", __func__);
++
++    int ret = icamera::OK;
++
++    mLastAwbControls = awbControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++
++    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
++        awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
++        resetState();
++    } else {
++        LOGE("AWB State machine should not be OFF! - Fix bug");
++        ret = icamera::UNKNOWN_ERROR;
++    }
++
++    return ret;
++}
++
++int IntelAWBModeOff::processResult(bool converged, android::CameraMetadata* result) {
++    UNUSED(converged);
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    LOG2("%s", __func__);
++
++    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++/******************************************************************************
++ * AWB MODE   -  AUTO
++ ******************************************************************************/
++
++IntelAWBModeAuto::IntelAWBModeAuto() : IntelAWBModeBase() {
++    LOG1("%s", __func__);
++}
++
++int IntelAWBModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
++                                   const AwbControls& awbControls) {
++    if (controlMode != mLastControlMode) {
++        LOG1("%s: control mode has changed %d -> %d, reset AWB State", __func__, mLastControlMode,
++             controlMode);
++        resetState();
++    }
++
++    if (awbControls.awbLock == ANDROID_CONTROL_AWB_LOCK_ON) {
++        mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_LOCKED;
++    } else if (awbControls.awbMode != mLastAwbControls.awbMode ||
++               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
++                sceneMode != mLastSceneMode)) {
++        resetState();
++    } else {
++        switch (mCurrentAwbState) {
++            case ANDROID_CONTROL_AWB_STATE_LOCKED:
++                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++                break;
++            case ANDROID_CONTROL_AWB_STATE_INACTIVE:
++            case ANDROID_CONTROL_AWB_STATE_SEARCHING:
++            case ANDROID_CONTROL_AWB_STATE_CONVERGED:
++                // do nothing
++                break;
++            default:
++                LOGE("Invalid AWB state!, State set to INACTIVE");
++                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++        }
++    }
++    mLastAwbControls = awbControls;
++    mLastSceneMode = sceneMode;
++    mLastControlMode = controlMode;
++    return icamera::OK;
++}
++
++int IntelAWBModeAuto::processResult(bool converged, android::CameraMetadata* result) {
++    CheckError(!result, icamera::UNKNOWN_ERROR, "%s, result is nullptr", __func__);
++    switch (mCurrentAwbState) {
++        case ANDROID_CONTROL_AWB_STATE_LOCKED:
++            // do nothing
++            break;
++        case ANDROID_CONTROL_AWB_STATE_INACTIVE:
++        case ANDROID_CONTROL_AWB_STATE_SEARCHING:
++        case ANDROID_CONTROL_AWB_STATE_CONVERGED:
++            if (converged)
++                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_CONVERGED;
++            else
++                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_SEARCHING;
++            break;
++        default:
++            LOGE("invalid AWB state!, State set to INACTIVE");
++            mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++    }
++
++    updateResult(result);
++
++    return icamera::OK;
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
+new file mode 100644
+index 000000000000..2f7cf7c3b5fe
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
+@@ -0,0 +1,134 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "HALv3Header.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++/**
++ * \struct AwbControls
++ *
++ * Control Modes saved and passed back to control unit after reading
++ *
++ */
++struct AwbControls {
++    uint8_t awbMode;                       /**< AWB_MODE */
++    uint8_t awbLock;                       /**< AWB_LOCK */
++    uint8_t colorCorrectionMode;           /**< COLOR_CORRECTION_MODE */
++    uint8_t colorCorrectionAberrationMode; /**< COLOR_CORRECTION_ABERRATION_MODE */
++};
++
++/**
++ * \class IntelAWBModeBase
++ *
++ * Base class for all the Auto white balance modes as defined by the Android
++ * camera device V3.x API.
++ * Each mode will follow certain state transitions. See documentation for
++ * android.control.awbState
++ *
++ */
++class IntelAWBModeBase {
++ public:
++    IntelAWBModeBase();
++    virtual ~IntelAWBModeBase(){};
++
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
++                             const AwbControls& awbControls) = 0;
++
++    virtual int processResult(bool converged, android::CameraMetadata* results) = 0;
++
++    void resetState(void);
++    uint8_t getState() const { return mCurrentAwbState; }
++
++ protected:
++    void updateResult(android::CameraMetadata* results);
++
++ protected:
++    AwbControls mLastAwbControls;
++    uint8_t mLastControlMode;
++    uint8_t mLastSceneMode;
++
++    uint8_t mCurrentAwbState;
++};
++
++/**
++ * \class IntelAWBModeAuto
++ * Derived class from IntelAWBModeBase for Auto mode
++ *
++ */
++class IntelAWBModeAuto : public IntelAWBModeBase {
++ public:
++    IntelAWBModeAuto();
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
++                             const AwbControls& awbControls);
++
++    virtual int processResult(bool converged, android::CameraMetadata* results);
++};
++
++/**
++ * \class IntelAWBModeOFF
++ * Derived class from IntelAWBModeBase for OFF mode
++ *
++ */
++class IntelAWBModeOff : public IntelAWBModeBase {
++ public:
++    IntelAWBModeOff();
++    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
++                             const AwbControls& awbControls);
++
++    virtual int processResult(bool converged, android::CameraMetadata* results);
++};
++
++/**
++ * \class IntelAWBStateMachine
++ *
++ * This class adapts the Android V3 AWB triggers and state transitions to
++ * the ones implemented by the Intel AIQ algorithm
++ * This class is platform independent. Platform specific behaviors should be
++ * implemented in derived classes from this one or from the IntelAWBModeBase
++ *
++ */
++class IntelAWBStateMachine {
++ public:
++    IntelAWBStateMachine(int CameraId);
++    virtual ~IntelAWBStateMachine();
++
++    int processState(uint8_t controlMode, uint8_t sceneMode, const AwbControls& awbControls);
++
++    int processResult(bool converged, android::CameraMetadata* results);
++
++    uint8_t getState() const { return mCurrentAwbMode->getState(); }
++
++ private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(IntelAWBStateMachine);
++
++ private: /* members*/
++    int mCameraId;
++    AwbControls mLastAwbControls;
++    uint8_t mLastControlMode;
++    uint8_t mLastSceneMode;
++
++    IntelAWBModeBase* mCurrentAwbMode;
++
++    IntelAWBModeOff mOffMode;
++    IntelAWBModeAuto mAutoMode;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.cpp b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
+new file mode 100644
+index 000000000000..192321348181
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
+@@ -0,0 +1,2247 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "MetadataConvert"
++
++#include "MetadataConvert.h"
++
++#include <cmath>
++#include <sstream>
++#include <unordered_map>
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "ICamera.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++#define NSEC_PER_SEC 1000000000LLU
++#define DEFAULT_FPS_RANGE_MIN 15
++#define DEFAULT_FPS_RANGE_MAX 30
++
++template <typename T>
++struct ValuePair {
++    int halValue;
++    T androidValue;
++};
++
++template <typename T>
++static int getAndroidValue(int halValue, const ValuePair<T>* table, int tableCount,
++                           T* androidValue) {
++    CheckError(!table, icamera::BAD_VALUE, "null table!");
++    CheckError(!androidValue, icamera::BAD_VALUE, "androidValue is nullptr!");
++
++    for (int i = 0; i < tableCount; i++) {
++        if (halValue == table[i].halValue) {
++            *androidValue = table[i].androidValue;
++            return icamera::OK;
++        }
++    }
++    return icamera::BAD_VALUE;
++}
++
++template <typename T>
++static int getHalValue(T androidValue, const ValuePair<T>* table, int tableCount, int* halValue) {
++    CheckError(!table, icamera::BAD_VALUE, "null table!");
++    CheckError(!halValue, icamera::BAD_VALUE, "halValue is nullptr!");
++
++    for (int i = 0; i < tableCount; i++) {
++        if (androidValue == table[i].androidValue) {
++            *halValue = table[i].halValue;
++            return icamera::OK;
++        }
++    }
++    return icamera::BAD_VALUE;
++}
++
++static const ValuePair<int32_t> testPatternTable[] = {
++    {icamera::TEST_PATTERN_OFF, ANDROID_SENSOR_TEST_PATTERN_MODE_OFF},
++    {icamera::SOLID_COLOR, ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR},
++    {icamera::COLOR_BARS, ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS},
++    {icamera::COLOR_BARS_FADE_TO_GRAY, ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY},
++    {icamera::PN9, ANDROID_SENSOR_TEST_PATTERN_MODE_PN9},
++    {icamera::TEST_PATTERN_CUSTOM1, ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1},
++};
++
++static const ValuePair<uint8_t> antibandingModesTable[] = {
++    {icamera::ANTIBANDING_MODE_AUTO, ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO},
++    {icamera::ANTIBANDING_MODE_50HZ, ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ},
++    {icamera::ANTIBANDING_MODE_60HZ, ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ},
++    {icamera::ANTIBANDING_MODE_OFF, ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF},
++};
++
++static const ValuePair<uint8_t> aeModesTable[] = {
++    {icamera::AE_MODE_AUTO, ANDROID_CONTROL_AE_MODE_ON},
++    {icamera::AE_MODE_MANUAL, ANDROID_CONTROL_AE_MODE_OFF},
++};
++
++static const ValuePair<uint8_t> awbModesTable[] = {
++    {icamera::AWB_MODE_AUTO, ANDROID_CONTROL_AWB_MODE_AUTO},
++    {icamera::AWB_MODE_INCANDESCENT, ANDROID_CONTROL_AWB_MODE_INCANDESCENT},
++    {icamera::AWB_MODE_FLUORESCENT, ANDROID_CONTROL_AWB_MODE_FLUORESCENT},
++    {icamera::AWB_MODE_DAYLIGHT, ANDROID_CONTROL_AWB_MODE_DAYLIGHT},
++    {icamera::AWB_MODE_FULL_OVERCAST, ANDROID_CONTROL_AWB_MODE_TWILIGHT},
++    {icamera::AWB_MODE_PARTLY_OVERCAST, ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT},
++    {icamera::AWB_MODE_MANUAL_COLOR_TRANSFORM, ANDROID_CONTROL_AWB_MODE_OFF},
++};
++
++static const ValuePair<uint8_t> afModesTable[] = {
++    {icamera::AF_MODE_OFF, ANDROID_CONTROL_AF_MODE_OFF},
++    {icamera::AF_MODE_AUTO, ANDROID_CONTROL_AF_MODE_AUTO},
++    {icamera::AF_MODE_MACRO, ANDROID_CONTROL_AF_MODE_MACRO},
++    {icamera::AF_MODE_CONTINUOUS_VIDEO, ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO},
++    {icamera::AF_MODE_CONTINUOUS_PICTURE, ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE},
++};
++
++static const ValuePair<uint8_t> afTriggerTable[] = {
++    {icamera::AF_TRIGGER_START, ANDROID_CONTROL_AF_TRIGGER_START},
++    {icamera::AF_TRIGGER_CANCEL, ANDROID_CONTROL_AF_TRIGGER_CANCEL},
++    {icamera::AF_TRIGGER_IDLE, ANDROID_CONTROL_AF_TRIGGER_IDLE},
++};
++
++static const ValuePair<uint8_t> dvsModesTable[] = {
++    {icamera::VIDEO_STABILIZATION_MODE_OFF, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF},
++    {icamera::VIDEO_STABILIZATION_MODE_ON, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON},
++};
++
++static const ValuePair<uint8_t> effectModesTable[] = {
++    {icamera::CAM_EFFECT_NONE, ANDROID_CONTROL_EFFECT_MODE_OFF},
++    {icamera::CAM_EFFECT_MONO, ANDROID_CONTROL_EFFECT_MODE_MONO},
++    {icamera::CAM_EFFECT_SEPIA, ANDROID_CONTROL_EFFECT_MODE_SEPIA},
++    {icamera::CAM_EFFECT_NEGATIVE, ANDROID_CONTROL_EFFECT_MODE_NEGATIVE},
++};
++
++static const ValuePair<uint8_t> shadingModeTable[] = {
++    {icamera::SHADING_MODE_OFF, ANDROID_SHADING_MODE_OFF},
++    {icamera::SHADING_MODE_FAST, ANDROID_SHADING_MODE_FAST},
++    {icamera::SHADING_MODE_HIGH_QUALITY, ANDROID_SHADING_MODE_HIGH_QUALITY},
++};
++
++static const ValuePair<uint8_t> lensShadingMapModeTable[] = {
++    {icamera::LENS_SHADING_MAP_MODE_OFF, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF},
++    {icamera::LENS_SHADING_MAP_MODE_ON, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON},
++};
++
++static const ValuePair<uint8_t> tonemapModesTable[] = {
++    {icamera::TONEMAP_MODE_FAST, ANDROID_TONEMAP_MODE_FAST},
++    {icamera::TONEMAP_MODE_HIGH_QUALITY, ANDROID_TONEMAP_MODE_HIGH_QUALITY},
++    {icamera::TONEMAP_MODE_GAMMA_VALUE, ANDROID_TONEMAP_MODE_GAMMA_VALUE},
++    {icamera::TONEMAP_MODE_PRESET_CURVE, ANDROID_TONEMAP_MODE_PRESET_CURVE},
++};
++
++static const ValuePair<uint8_t> tonemapPresetCurvesTable[] = {
++    {icamera::TONEMAP_PRESET_CURVE_SRGB, ANDROID_TONEMAP_PRESET_CURVE_SRGB},
++    {icamera::TONEMAP_PRESET_CURVE_REC709, ANDROID_TONEMAP_PRESET_CURVE_REC709},
++};
++
++static bool isValueSupported(uint8_t mode, const icamera::CameraMetadata* caps, uint32_t tag) {
++    icamera_metadata_ro_entry entry = caps->find(tag);
++    if (entry.count > 0) {
++        for (size_t i = 0; i < entry.count; i++) {
++            if (mode == entry.data.u8[i]) return true;
++        }
++    }
++    return false;
++}
++
++MetadataConvert::MetadataConvert(int cameraId) : mCameraId(cameraId) {
++    LOG1("@%s, mCameraId %d", __func__, mCameraId);
++}
++
++MetadataConvert::~MetadataConvert() {
++    LOG1("@%s", __func__);
++}
++
++int MetadataConvert::constructDefaultMetadata(int cameraId, android::CameraMetadata* settings) {
++    LOG1("@%s", __func__);
++    const icamera::CameraMetadata* meta = StaticCapability::getInstance(cameraId)->getCapability();
++
++    // CAMERA_CONTROL_MAX_REGIONS: [AE, AWB, AF]
++    uint32_t tag = CAMERA_CONTROL_MAX_REGIONS;
++    icamera_metadata_ro_entry roEntry = meta->find(tag);
++    int32_t maxRegionAf = 0, maxRegionAe = 0;
++    if (roEntry.count == 3) {
++        maxRegionAe = roEntry.data.i32[0];
++        maxRegionAf = roEntry.data.i32[2];
++    }
++
++    // AE, AF region (AWB region is not supported)
++    int meteringRegion[5] = {0, 0, 0, 0, 0};
++    if (maxRegionAe) {
++        settings->update(ANDROID_CONTROL_AE_REGIONS, meteringRegion, 5);
++    }
++    if (maxRegionAf) {
++        settings->update(ANDROID_CONTROL_AF_REGIONS, meteringRegion, 5);
++    }
++
++    // Control AE, AF, AWB
++    uint8_t mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
++    settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
++    int32_t ev = 0;
++    settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
++    uint8_t lock = ANDROID_CONTROL_AE_LOCK_OFF;
++    settings->update(ANDROID_CONTROL_AE_LOCK, &lock, 1);
++    mode = ANDROID_CONTROL_AE_MODE_ON;
++    settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
++    settings->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &mode, 1);
++    mode = ANDROID_CONTROL_AE_STATE_INACTIVE;
++    settings->update(ANDROID_CONTROL_AE_STATE, &mode, 1);
++
++    mode = ANDROID_CONTROL_AF_MODE_OFF;
++    settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_AF_TRIGGER_IDLE;
++    settings->update(ANDROID_CONTROL_AF_TRIGGER, &mode, 1);
++    mode = ANDROID_CONTROL_AF_STATE_INACTIVE;
++    settings->update(ANDROID_CONTROL_AF_STATE, &mode, 1);
++
++    lock = ANDROID_CONTROL_AWB_LOCK_OFF;
++    settings->update(ANDROID_CONTROL_AWB_LOCK, &lock, 1);
++    mode = ANDROID_CONTROL_AWB_MODE_AUTO;
++    settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_AWB_STATE_INACTIVE;
++    settings->update(ANDROID_CONTROL_AWB_STATE, &mode, 1);
++
++    // Control others
++    mode = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
++    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &mode, 1);
++    mode = ANDROID_CONTROL_EFFECT_MODE_OFF;
++    settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_MODE_AUTO;
++    settings->update(ANDROID_CONTROL_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
++    settings->update(ANDROID_CONTROL_SCENE_MODE, &mode, 1);
++    mode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
++    settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
++
++    // Flash
++    mode = ANDROID_FLASH_MODE_OFF;
++    settings->update(ANDROID_FLASH_MODE, &mode, 1);
++
++    mode = ANDROID_FLASH_STATE_UNAVAILABLE;
++    tag = CAMERA_FLASH_INFO_AVAILABLE;
++    roEntry = meta->find(tag);
++    if (roEntry.count == 1 && roEntry.data.u8[0] == CAMERA_FLASH_INFO_AVAILABLE_TRUE) {
++        mode = ANDROID_FLASH_STATE_READY;
++    }
++    settings->update(ANDROID_FLASH_STATE, &mode, 1);
++
++    // Black level
++    lock = ANDROID_BLACK_LEVEL_LOCK_OFF;
++    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lock, 1);
++
++    // Lens
++    camera_metadata_entry entry = settings->find(ANDROID_LENS_INFO_AVAILABLE_APERTURES);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_LENS_APERTURE, &entry.data.f[0], 1);
++    }
++    entry = settings->find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_LENS_FOCAL_LENGTH, &entry.data.f[0], 1);
++    }
++    entry = settings->find(CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
++    if (entry.count == 1) {
++        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &entry.data.f[0], 1);
++    }
++
++    float filterDensity = 0.0f;
++    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
++    mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
++    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
++
++    int64_t value_i64 = 0;
++    settings->update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &value_i64, 1);
++
++    // Sync
++    int64_t frameNumber = ANDROID_SYNC_FRAME_NUMBER_UNKNOWN;
++    settings->update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, 1);
++
++    // Request
++    mode = ANDROID_REQUEST_TYPE_CAPTURE;
++    settings->update(ANDROID_REQUEST_TYPE, &mode, 1);
++    mode = ANDROID_REQUEST_METADATA_MODE_NONE;
++    settings->update(ANDROID_REQUEST_METADATA_MODE, &mode, 1);
++
++    // Scale
++    int32_t region[] = {0, 0, 0, 0};
++    settings->update(ANDROID_SCALER_CROP_REGION, region, 4);
++
++    // Statistics
++    mode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
++    settings->update(ANDROID_STATISTICS_FACE_DETECT_MODE, &mode, 1);
++    mode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
++    settings->update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &mode, 1);
++    mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
++    settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &mode, 1);
++    mode = ANDROID_STATISTICS_SCENE_FLICKER_NONE;
++    settings->update(ANDROID_STATISTICS_SCENE_FLICKER, &mode, 1);
++
++    // Tonemap
++    mode = ANDROID_TONEMAP_MODE_FAST;
++    settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
++
++    // Sensor
++    value_i64 = 0;
++    settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &value_i64, 1);
++    int32_t sensitivity = 0;
++    settings->update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1);
++    int64_t frameDuration = 33000000;
++    settings->update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
++    int32_t testPattern = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
++    settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &testPattern, 1);
++
++    // Jpeg
++    uint8_t quality = 95;
++    settings->update(ANDROID_JPEG_QUALITY, &quality, 1);
++    quality = 90;
++    settings->update(ANDROID_JPEG_THUMBNAIL_QUALITY, &quality, 1);
++
++    entry = settings->find(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
++    int32_t thumbSize[] = {0, 0};
++    if (entry.count >= 4) {
++        thumbSize[0] = entry.data.i32[2];
++        thumbSize[1] = entry.data.i32[3];
++    } else {
++        LOGE("Thumbnail size should have more than 2 resolutions");
++    }
++    settings->update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbSize, 2);
++
++    entry = settings->find(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES);
++    if (entry.count > 0) {
++        mode = entry.data.u8[0];
++        for (uint32_t i = 0; i < entry.count; i++) {
++            if (entry.data.u8[i] == ANDROID_TONEMAP_MODE_HIGH_QUALITY) {
++                mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
++                break;
++            }
++        }
++        settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
++    }
++
++    // Color correction
++    mode = ANDROID_COLOR_CORRECTION_MODE_FAST;
++    settings->update(ANDROID_COLOR_CORRECTION_MODE, &mode, 1);
++
++    float colorTransform[9] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
++    camera_metadata_rational_t transformMatrix[9];
++    for (int i = 0; i < 9; i++) {
++        transformMatrix[i].numerator = colorTransform[i];
++        transformMatrix[i].denominator = 1.0;
++    }
++    settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, transformMatrix, 9);
++
++    float colorGains[4] = {1.0, 1.0, 1.0, 1.0};
++    settings->update(ANDROID_COLOR_CORRECTION_GAINS, colorGains, 4);
++
++    mode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
++    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &mode, 1);
++
++    return icamera::OK;
++}
++
++int MetadataConvert::updateDefaultRequestSettings(int32_t cameraId, int type,
++                                                  android::CameraMetadata* settings) {
++    const icamera::CameraMetadata* caps = StaticCapability::getInstance(cameraId)->getCapability();
++
++    uint8_t intent =
++        (type == CAMERA3_TEMPLATE_PREVIEW)          ? ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW
++        : (type == CAMERA3_TEMPLATE_STILL_CAPTURE)  ? ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE
++        : (type == CAMERA3_TEMPLATE_VIDEO_RECORD)   ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD
++        : (type == CAMERA3_TEMPLATE_VIDEO_SNAPSHOT) ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT
++        : (type == CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG)
++            ? ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG
++        : (type == CAMERA3_TEMPLATE_MANUAL) ? ANDROID_CONTROL_CAPTURE_INTENT_MANUAL
++                                            : ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
++    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &intent, 1);
++
++    uint8_t ctrlMode = ANDROID_CONTROL_MODE_AUTO;
++    uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
++    uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
++    uint8_t afMode = ANDROID_CONTROL_AF_MODE_OFF;
++    uint8_t edgeMode = ANDROID_EDGE_MODE_FAST;
++    uint8_t nrMode = ANDROID_NOISE_REDUCTION_MODE_FAST;
++    uint8_t sdMode = ANDROID_SHADING_MODE_FAST;
++    uint8_t hpMode = ANDROID_HOT_PIXEL_MODE_FAST;
++
++    switch (type) {
++        case CAMERA3_TEMPLATE_MANUAL:
++            ctrlMode = ANDROID_CONTROL_MODE_OFF;
++            aeMode = ANDROID_CONTROL_AE_MODE_OFF;
++            awbMode = ANDROID_CONTROL_AWB_MODE_OFF;
++            afMode = ANDROID_CONTROL_AF_MODE_OFF;
++            break;
++        case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
++            afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
++            edgeMode = ANDROID_EDGE_MODE_ZERO_SHUTTER_LAG;
++            nrMode = ANDROID_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG;
++            sdMode = ANDROID_SHADING_MODE_HIGH_QUALITY;
++            hpMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY;
++            break;
++        case CAMERA3_TEMPLATE_STILL_CAPTURE:
++            afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
++            edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY;
++            nrMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
++            sdMode = ANDROID_SHADING_MODE_HIGH_QUALITY;
++            hpMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY;
++            break;
++        case CAMERA3_TEMPLATE_PREVIEW:
++            afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
++            break;
++        case CAMERA3_TEMPLATE_VIDEO_RECORD:
++        case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
++            afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
++            break;
++        default:
++            break;
++    }
++
++    // Check if modes are supported or not.
++    if (!isValueSupported(afMode, caps, CAMERA_AF_AVAILABLE_MODES))
++        afMode = ANDROID_CONTROL_AF_MODE_OFF;
++    if (!isValueSupported(edgeMode, caps, CAMERA_EDGE_AVAILABLE_EDGE_MODES))
++        edgeMode = ANDROID_EDGE_MODE_FAST;
++    if (!isValueSupported(nrMode, caps, CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES))
++        nrMode = ANDROID_NOISE_REDUCTION_MODE_FAST;
++    if (!isValueSupported(sdMode, caps, CAMERA_SHADING_AVAILABLE_MODES))
++        sdMode = ANDROID_SHADING_MODE_FAST;
++    if (!isValueSupported(hpMode, caps, CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES))
++        hpMode = ANDROID_HOT_PIXEL_MODE_FAST;
++
++    LOG2("%s, type %d, ctrlMode %d, aeMode %d, awbMode %d, afMode %d", __func__, type, ctrlMode,
++         aeMode, awbMode, afMode);
++    settings->update(ANDROID_CONTROL_MODE, &ctrlMode, 1);
++    settings->update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
++    settings->update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
++    settings->update(ANDROID_CONTROL_AF_MODE, &afMode, 1);
++    settings->update(ANDROID_EDGE_MODE, &edgeMode, 1);
++    settings->update(ANDROID_NOISE_REDUCTION_MODE, &nrMode, 1);
++    settings->update(ANDROID_SHADING_MODE, &sdMode, 1);
++    settings->update(ANDROID_HOT_PIXEL_MODE, &hpMode, 1);
++
++    uint32_t tag = ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
++    camera_metadata_entry fpsRangesEntry = settings->find(tag);
++    if ((fpsRangesEntry.count >= 2) && (fpsRangesEntry.count % 2 == 0)) {
++        int32_t delta = INT32_MAX;
++        int fpsRange[] = {DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX};
++
++        // choose closest (DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX) range
++        for (size_t i = 0; i < fpsRangesEntry.count; i += 2) {
++            int32_t diff = abs(fpsRangesEntry.data.i32[i] - DEFAULT_FPS_RANGE_MIN) +
++                           abs(fpsRangesEntry.data.i32[i + 1] - DEFAULT_FPS_RANGE_MAX);
++
++            if (delta > diff) {
++                fpsRange[0] = fpsRangesEntry.data.i32[i];
++                fpsRange[1] = fpsRangesEntry.data.i32[i + 1];
++                delta = diff;
++            }
++        }
++
++        if (type == CAMERA3_TEMPLATE_VIDEO_RECORD) {
++            // Stable range requried for video recording
++            fpsRange[0] = fpsRange[1];
++        }
++        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fpsRange[0], 2);
++    } else {
++        LOGW("The fpsRanges isn't correct, please check the profiles file");
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::requestMetadataToHALMetadata(const android::CameraMetadata& settings,
++                                                  icamera::Parameters* parameter,
++                                                  bool forceConvert) {
++    LOG1("@%s: settings entry count %d", __func__, settings.entryCount());
++    CheckError(parameter == nullptr, icamera::BAD_VALUE, "%s, parameter is nullptr", __func__);
++
++    // ANDROID_COLOR_CORRECTION
++    convertColorCorrectionMetadata(settings, parameter);
++
++    // ANDROID_CONTROL
++    convertControlMetadata(settings, parameter);
++
++    // ANDROID_DEMOSAIC
++    // ANDROID_EDGE
++    // ANDROID_HOT_PIXEL
++    // ANDROID_NOISE_REDUCTION
++    // ANDROID_SHADING
++    // ANDROID_TONEMAP
++    convertTonemapMetadata(settings, parameter);
++    // ANDROID_BLACK_LEVEL
++    convertAdvancedFeatureMetadata(settings, parameter);
++    // ANDROID_FLASH
++
++    // ANDROID_JPEG
++    convertJpegMetadata(settings, parameter);
++
++    // ANDROID_LENS
++    convertLensMetadata(settings, parameter);
++
++    // ANDROID_SCALER
++
++    // ANDROID_SENSOR
++    convertSensorMetadata(settings, parameter, forceConvert);
++
++    // ANDROID_STATISTICS
++
++    // ANDROID_LED
++
++    // ANDROID_REPROCESS
++
++    return icamera::OK;
++}
++
++int MetadataConvert::HALMetadataToRequestMetadata(const icamera::Parameters& parameter,
++                                                  android::CameraMetadata* settings, int cameraId) {
++    LOG1("@%s", __func__);
++
++    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
++
++    // ANDROID_COLOR_CORRECTION
++    convertColorCorrectionParameter(parameter, settings);
++
++    // ANDROID_CONTROL
++    convertControlParameter(parameter, settings);
++
++    // ANDROID_FLASH
++    // ANDROID_FLASH_INFO
++    convertFlashParameter(parameter, settings);
++
++    // ANDROID_JPEG
++
++    // ANDROID_LENS
++    // ANDROID_LENS_INFO
++    convertLensParameter(parameter, settings);
++
++    // ANDROID_QUIRKS
++
++    // ANDROID_REQUEST
++    convertRequestParameter(parameter, settings, cameraId);
++
++    // ANDROID_SCALER
++
++    // ANDROID_SENSOR
++    // ANDROID_SENSOR_INFO
++    convertSensorParameter(parameter, settings);
++
++    // ANDROID_STATISTICS
++    // ANDROID_STATISTICS_INFO
++    convertStatisticsParameter(parameter, settings);
++
++    // ANDROID_TONEMAP
++    convertTonemapParameter(parameter, settings);
++
++    // ANDROID_DEMOSAIC, ANDROID_EDGE, ANDROID_HOT_PIXEL, ANDROID_NOISE_REDUCTION
++    // ANDROID_SHADING, ANDROID_INFO, ANDROID_BLACK_LEVEL, ANDROID_SYNC
++    convertAdvancedFeatureParameter(parameter, settings);
++
++    // ANDROID_LED
++
++    // ANDROID_REPROCESS
++
++    // ANDROID_DEPTH
++
++    LOG1("@%s: convert entry count %d", __func__, settings->entryCount());
++    return icamera::OK;
++}
++
++int MetadataConvert::HALCapabilityToStaticMetadata(const icamera::Parameters& parameter,
++                                                   android::CameraMetadata* settings) {
++    LOG1("@%s", __func__);
++
++    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
++
++    // ANDROID_COLOR_CORRECTION
++    uint8_t aberrationAvailable = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
++    settings->update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, &aberrationAvailable, 1);
++
++    // ANDROID_CONTROL
++    fillControlStaticMetadata(parameter, settings);
++
++    // ANDROID_FLASH
++    // ANDROID_FLASH_INFO
++    uint8_t flashInfoAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;
++    settings->update(ANDROID_FLASH_INFO_AVAILABLE, &flashInfoAvailable, 1);
++
++    // ANDROID_JPEG
++    fillJpegStaticMetadata(parameter, settings);
++
++    // ANDROID_LENS
++    // ANDROID_LENS_INFO
++    fillLensStaticMetadata(parameter, settings);
++
++    // ANDROID_QUIRKS
++
++    // ANDROID_REQUEST
++    fillRequestStaticMetadata(parameter, settings);
++
++    // ANDROID_SCALER
++    fillScalerStaticMetadata(parameter, settings);
++
++    // ANDROID_SENSOR
++    // ANDROID_SENSOR_INFO
++    fillSensorStaticMetadata(parameter, settings);
++
++    // ANDROID_STATISTICS
++    // ANDROID_STATISTICS_INFO
++    fillStatisticsStaticMetadata(parameter, settings);
++
++    // ANDROID_TONEMAP
++    fillTonemapStaticMetadata(parameter, settings);
++
++    // ANDROID_LED
++    uint8_t availLeds = ANDROID_LED_AVAILABLE_LEDS_TRANSMIT;
++    settings->update(ANDROID_LED_AVAILABLE_LEDS, &availLeds, 1);
++
++    // ANDROID_REPROCESS
++
++    // ANDROID_DEPTH
++
++    fillAdvancedFeatureStaticMetadata(parameter, settings);
++
++    return icamera::OK;
++}
++
++void MetadataConvert::convertFaceDetectionMetadata(
++    const icamera::CVFaceDetectionAbstractResult& fdResult, android::CameraMetadata* settings) {
++    CheckError(settings == nullptr, VOID_VALUE, "@%s, settings is nullptr", __func__);
++
++    camera_metadata_entry entry = settings->find(ANDROID_STATISTICS_FACE_DETECT_MODE);
++    CheckError(entry.count == 0, VOID_VALUE, "@%s: No face detection mode setting", __func__);
++
++    const uint8_t mode = entry.data.u8[0];
++    if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
++        LOG2("%s: Face mode is off", __func__);
++        int faceIds[1] = {0};
++        settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
++        return;
++    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE) {
++        LOG2("%s: Face mode is simple", __func__);
++        // Face id is expected to be -1 for SIMPLE mode
++        if (fdResult.faceNum > 0) {
++            int faceIds[MAX_FACES_DETECTABLE];
++            for (int i = 0; i < fdResult.faceNum; i++) {
++                faceIds[i] = -1;
++            }
++            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, fdResult.faceNum);
++        } else {
++            int faceIds[1] = {-1};
++            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
++        }
++    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
++        LOG2("%s: Face mode is full", __func__);
++        /*
++         * from the spec:
++         * SIMPLE mode must fill in android.statistics.faceRectangles and
++         * android.statistics.faceScores. FULL mode must also fill in
++         * android.statistics.faceIds, and android.statistics.faceLandmarks.
++         */
++        settings->update(ANDROID_STATISTICS_FACE_IDS, fdResult.faceIds, fdResult.faceNum);
++        settings->update(ANDROID_STATISTICS_FACE_LANDMARKS, fdResult.faceLandmarks,
++                         LM_SIZE * fdResult.faceNum);
++    }
++
++    settings->update(ANDROID_STATISTICS_FACE_RECTANGLES, fdResult.faceRect,
++                     RECT_SIZE * fdResult.faceNum);
++    settings->update(ANDROID_STATISTICS_FACE_SCORES, fdResult.faceScores, fdResult.faceNum);
++}
++
++int MetadataConvert::convertColorCorrectionMetadata(const android::CameraMetadata& settings,
++                                                    icamera::Parameters* parameter) {
++    uint32_t tag = ANDROID_COLOR_CORRECTION_TRANSFORM;
++    camera_metadata_ro_entry entry = settings.find(tag);
++    if (entry.count == 9) {
++        icamera::camera_color_transform_t transform;
++        for (size_t i = 0; i < entry.count; i++) {
++            transform.color_transform[i / 3][i % 3] =
++                static_cast<float>(entry.data.r[i].numerator) / entry.data.r[i].denominator;
++        }
++        parameter->setColorTransform(transform);
++    }
++
++    tag = ANDROID_COLOR_CORRECTION_GAINS;
++    entry = settings.find(tag);
++    if (entry.count == 4) {
++        icamera::camera_color_gains_t gains;
++        for (size_t i = 0; i < entry.count; i++) {
++            gains.color_gains_rggb[i] = entry.data.f[i];
++        }
++        parameter->setColorGains(gains);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertColorCorrectionParameter(const icamera::Parameters& parameter,
++                                                     android::CameraMetadata* settings) {
++    icamera::camera_color_transform_t transform;
++    if (parameter.getColorTransform(transform) == 0) {
++        camera_metadata_rational_t matrix[9];
++        for (int i = 0; i < 9; i++) {
++            matrix[i].numerator = round(transform.color_transform[i / 3][i % 3] * 1000);
++            matrix[i].denominator = 1000;
++        }
++        settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, &matrix[0], 9);
++    }
++
++    icamera::camera_color_gains_t colorGains;
++    if (parameter.getColorGains(colorGains) == 0) {
++        settings->update(ANDROID_COLOR_CORRECTION_GAINS, &colorGains.color_gains_rggb[0], 4);
++    }
++
++    uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
++    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &aberrationMode, 1);
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertControlMetadata(const android::CameraMetadata& settings,
++                                            icamera::Parameters* parameter) {
++    int ret = icamera::OK;
++    int mode = 0;
++    uint32_t tag = ANDROID_CONTROL_AE_MODE;
++    camera_metadata_ro_entry entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setAeMode((icamera::camera_ae_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_STATISTICS_FACE_DETECT_MODE;
++    entry = settings.find(tag);
++    uint8_t fdValue = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
++    if ((entry.count == 1) && (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF)) {
++        int faceIds[1] = {0};
++        parameter->setFaceIds(faceIds, 1);
++    } else {
++        fdValue = entry.data.u8[0];
++    }
++    parameter->setFaceDetectMode(fdValue);
++
++    tag = ANDROID_CONTROL_AE_LOCK;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        bool aeLock = (entry.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON);
++        parameter->setAeLock(aeLock);
++    }
++
++    tag = ANDROID_CONTROL_AE_REGIONS;
++    entry = settings.find(tag);
++    icamera::camera_window_list_t windows;
++    if (entry.count > 0) {
++        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
++            parameter->setAeRegions(windows);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AE_TARGET_FPS_RANGE;
++    entry = settings.find(tag);
++    if (entry.count == 2) {
++        icamera::camera_range_t range;
++        range.min = entry.data.i32[0];
++        range.max = entry.data.i32[1];
++        parameter->setFpsRange(range);
++    }
++
++    tag = ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setAeCompensation(entry.data.i32[0]);
++    }
++
++    tag = ANDROID_CONTROL_AE_ANTIBANDING_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], antibandingModesTable,
++                          ARRAY_SIZE(antibandingModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setAntiBandingMode((icamera::camera_antibanding_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AF_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], afModesTable, ARRAY_SIZE(afModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setAfMode((icamera::camera_af_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AF_TRIGGER;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], afTriggerTable, ARRAY_SIZE(afTriggerTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setAfTrigger((icamera::camera_af_trigger_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AF_REGIONS;
++    entry = settings.find(tag);
++    windows.clear();
++    if (entry.count > 0) {
++        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
++            parameter->setAfRegions(windows);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AWB_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setAwbMode((icamera::camera_awb_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_AWB_LOCK;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        bool awbLock = (entry.data.u8[0] == ANDROID_CONTROL_AWB_LOCK_ON);
++        parameter->setAwbLock(awbLock);
++    }
++
++    tag = ANDROID_CONTROL_AWB_REGIONS;
++    entry = settings.find(tag);
++    windows.clear();
++    if (entry.count > 0) {
++        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
++            parameter->setAwbRegions(windows);
++        }
++    }
++
++    tag = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setVideoStabilizationMode((icamera::camera_video_stabilization_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_EFFECT_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setImageEffect((icamera::camera_effect_mode_t)mode);
++        }
++    }
++
++    tag = ANDROID_CONTROL_CAPTURE_INTENT;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setCaptureIntent(entry.data.u8[0]);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertControlParameter(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings) {
++    int ret = icamera::OK;
++    uint8_t mode = 0;
++    icamera::camera_ae_mode_t aeMode;
++    if (parameter.getAeMode(aeMode) == 0) {
++        ret = getAndroidValue(aeMode, aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
++        }
++    }
++
++    bool aeLock;
++    if (parameter.getAeLock(aeLock) == 0) {
++        uint8_t mode = aeLock ? ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
++        settings->update(ANDROID_CONTROL_AE_LOCK, &mode, 1);
++    }
++
++    icamera::camera_window_list_t windows;
++    parameter.getAeRegions(windows);
++    int count = windows.size() * 5;
++    if (count > 0) {
++        int regions[count];
++        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AE_REGIONS, &regions[0], count);
++        }
++    }
++
++    icamera::camera_range_t range;
++    if (parameter.getFpsRange(range) == 0) {
++        int fps[2] = {(int)range.min, (int)range.max};
++        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fps[0], 2);
++    }
++
++    int ev;
++    if (parameter.getAeCompensation(ev) == 0) {
++        settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
++    }
++
++    icamera::camera_antibanding_mode_t antiMode;
++    if (parameter.getAntiBandingMode(antiMode) == 0) {
++        ret = getAndroidValue(antiMode, antibandingModesTable, ARRAY_SIZE(antibandingModesTable),
++                              &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
++        }
++    }
++
++    icamera::camera_af_mode_t afMode;
++    if (parameter.getAfMode(afMode) == 0) {
++        ret = getAndroidValue(afMode, afModesTable, ARRAY_SIZE(afModesTable), &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
++        }
++    }
++
++    windows.clear();
++    parameter.getAfRegions(windows);
++    count = windows.size() * 5;
++    if (count > 0) {
++        int regions[count];
++        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AF_REGIONS, &regions[0], count);
++        }
++    }
++
++    icamera::camera_awb_mode_t awbMode;
++    if (parameter.getAwbMode(awbMode) == 0) {
++        ret = getAndroidValue(awbMode, awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
++        }
++    }
++
++    bool awbLock;
++    if (parameter.getAwbLock(awbLock) == 0) {
++        uint8_t mode = awbLock ? ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
++        settings->update(ANDROID_CONTROL_AWB_LOCK, &mode, 1);
++    }
++
++    windows.clear();
++    parameter.getAwbRegions(windows);
++    count = windows.size() * 5;
++    if (count > 0) {
++        int regions[count];
++        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AWB_REGIONS, &regions[0], count);
++        }
++    }
++
++    icamera::camera_video_stabilization_mode_t dvsMode;
++    if (parameter.getVideoStabilizationMode(dvsMode) == 0) {
++        ret = getAndroidValue(dvsMode, dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
++        }
++    }
++
++    icamera::camera_effect_mode_t effectMode;
++    if (parameter.getImageEffect(effectMode) == 0) {
++        ret = getAndroidValue(effectMode, effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
++        }
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertJpegMetadata(const android::CameraMetadata& settings,
++                                         icamera::Parameters* parameter) {
++    uint32_t tag = ANDROID_JPEG_GPS_COORDINATES;
++    camera_metadata_ro_entry entry = settings.find(tag);
++    if (entry.count == 3) {
++        parameter->setJpegGpsCoordinates(entry.data.d);
++    }
++
++    tag = ANDROID_JPEG_GPS_PROCESSING_METHOD;
++    entry = settings.find(tag);
++    if (entry.count >= 1) {
++        char data[entry.count + 1];
++        MEMCPY_S(data, sizeof(data), entry.data.u8, entry.count);
++        data[entry.count] = 0;
++        parameter->setJpegGpsProcessingMethod(data);
++    }
++
++    tag = ANDROID_JPEG_GPS_TIMESTAMP;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setJpegGpsTimeStamp(entry.data.i64[0]);
++    }
++
++    tag = ANDROID_JPEG_ORIENTATION;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setJpegRotation(entry.data.i32[0]);
++    }
++
++    tag = ANDROID_JPEG_QUALITY;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        int quality = entry.data.u8[0];
++        parameter->setJpegQuality(quality);
++    }
++
++    tag = ANDROID_JPEG_THUMBNAIL_QUALITY;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        int quality = entry.data.u8[0];
++        parameter->setJpegThumbnailQuality(quality);
++    }
++
++    tag = ANDROID_JPEG_THUMBNAIL_SIZE;
++    entry = settings.find(tag);
++    if (entry.count == 2) {
++        icamera::camera_resolution_t size;
++        size.width = entry.data.i32[0];
++        size.height = entry.data.i32[1];
++        parameter->setJpegThumbnailSize(size);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertTonemapMetadata(const android::CameraMetadata& settings,
++                                            icamera::Parameters* parameter) {
++    int ret = icamera::OK;
++
++    camera_metadata_ro_entry entry = settings.find(ANDROID_TONEMAP_MODE);
++    if (entry.count == 1) {
++        int32_t mode = 0;
++        ret =
++            getHalValue(entry.data.u8[0], tonemapModesTable, ARRAY_SIZE(tonemapModesTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setTonemapMode((icamera::camera_tonemap_mode_t)mode);
++        }
++    }
++
++    entry = settings.find(ANDROID_TONEMAP_PRESET_CURVE);
++    if (entry.count == 1) {
++        int32_t curve = 0;
++        ret = getHalValue(entry.data.u8[0], tonemapPresetCurvesTable,
++                          ARRAY_SIZE(tonemapPresetCurvesTable), &curve);
++        if (ret == icamera::OK) {
++            parameter->setTonemapPresetCurve((icamera::camera_tonemap_preset_curve_t)curve);
++        }
++    }
++
++    entry = settings.find(ANDROID_TONEMAP_GAMMA);
++    if (entry.count == 1) {
++        parameter->setTonemapGamma(entry.data.f[0]);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertTonemapParameter(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings) {
++    icamera::camera_tonemap_curves_t curves;
++    if (parameter.getTonemapCurves(curves) == 0) {
++        settings->update(ANDROID_TONEMAP_CURVE_RED, curves.rCurve, curves.rSize);
++        settings->update(ANDROID_TONEMAP_CURVE_BLUE, curves.bCurve, curves.bSize);
++        settings->update(ANDROID_TONEMAP_CURVE_GREEN, curves.gCurve, curves.gSize);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertSensorMetadata(const android::CameraMetadata& settings,
++                                           icamera::Parameters* parameter, bool forceConvert) {
++    // get control ae mode
++    uint8_t manualAeMode = ANDROID_CONTROL_AE_MODE_ON;
++    uint32_t tag = ANDROID_CONTROL_AE_MODE;
++    camera_metadata_ro_entry entry = settings.find(tag);
++    if (entry.count == 1) {
++        manualAeMode = entry.data.u8[0];
++    }
++
++    // get control mode
++    uint8_t manualMode = ANDROID_CONTROL_MODE_AUTO;
++    tag = ANDROID_CONTROL_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        manualMode = entry.data.u8[0];
++    }
++
++    if (manualAeMode == ANDROID_CONTROL_AE_MODE_OFF || manualMode == ANDROID_CONTROL_MODE_OFF ||
++        forceConvert) {
++        // manual exposure control
++        tag = ANDROID_SENSOR_EXPOSURE_TIME;
++        entry = settings.find(tag);
++        if (entry.count == 1) {
++            parameter->setExposureTime(entry.data.i64[0] / 1000);  // ns -> us
++        }
++
++        // manual sensitivity control
++        tag = ANDROID_SENSOR_SENSITIVITY;
++        entry = settings.find(tag);
++        if (entry.count == 1) {
++            parameter->setSensitivityIso(entry.data.i32[0]);
++        }
++
++        // manual frame duration control
++        int64_t maxFrameDuration = 0;
++        entry = settings.find(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION);
++        if (entry.count == 1) {
++            maxFrameDuration = entry.data.i64[0];
++            LOG2("@%s, maxFrameDuration:%ld ns", __func__, maxFrameDuration);
++        }
++
++        tag = ANDROID_SENSOR_FRAME_DURATION;
++        entry = settings.find(tag);
++        if (entry.count == 1) {
++            int64_t frameDuration = entry.data.i64[0];
++            LOG2("@%s, frameDuration:%ld ns", __func__, frameDuration);
++            if (maxFrameDuration > 0 && frameDuration > maxFrameDuration) {
++                frameDuration = maxFrameDuration;
++            }
++
++            if (frameDuration != 0) {
++                float fps = NSEC_PER_SEC / frameDuration;
++                parameter->setFrameRate(fps);
++            }
++        }
++    } else {
++        // Clear manual settings then AE algorithm works
++        int64_t exposureTime = 0;
++        parameter->setExposureTime(exposureTime);
++        int32_t iso = 0;
++        parameter->setSensitivityIso(iso);
++        float fps = 0.0;
++        parameter->setFrameRate(fps);
++    }
++
++    // Test Pattern Mode
++    tag = ANDROID_SENSOR_TEST_PATTERN_MODE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        int halTestPatternMode = icamera::TEST_PATTERN_OFF;
++        int ret = getHalValue(entry.data.i32[0], testPatternTable, ARRAY_SIZE(testPatternTable),
++                              &halTestPatternMode);
++        if (ret == icamera::OK) {
++            parameter->setTestPatternMode(
++                static_cast<icamera::camera_test_pattern_mode_t>(halTestPatternMode));
++        }
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertRequestParameter(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings, int cameraId) {
++    const icamera::CameraMetadata* meta = StaticCapability::getInstance(cameraId)->getCapability();
++
++    uint32_t tag = CAMERA_REQUEST_PIPELINE_MAX_DEPTH;
++    icamera_metadata_ro_entry entry = meta->find(tag);
++    uint8_t depth = (entry.count == 1) ? *entry.data.u8 : 6;
++
++    settings->update(ANDROID_REQUEST_PIPELINE_DEPTH, &depth, 1);
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertSensorParameter(const icamera::Parameters& parameter,
++                                            android::CameraMetadata* settings) {
++    int64_t exposure;
++    if (parameter.getExposureTime(exposure) == 0) {
++        int64_t time = exposure * 1000;  // us -> ns
++        settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &time, 1);
++    }
++
++    int32_t iso;
++    if (parameter.getSensitivityIso(iso) == 0) {
++        settings->update(ANDROID_SENSOR_SENSITIVITY, &iso, 1);
++    }
++
++    icamera::camera_test_pattern_mode_t halTestPatternMode = icamera::TEST_PATTERN_OFF;
++    if (parameter.getTestPatternMode(halTestPatternMode) == icamera::OK) {
++        int32_t androidPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
++        int ret = getAndroidValue(halTestPatternMode, testPatternTable,
++                                  ARRAY_SIZE(testPatternTable), &androidPatternMode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &androidPatternMode, 1);
++        }
++    }
++
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_SENSOR_ROLLING_SHUTTER_SKEW;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count == 1) {
++        int64_t rollingShutter = entry.data.i64[0] * 1000;  // us -> ns
++        settings->update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &rollingShutter, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_FRAME_DURATION;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_SENSOR_FRAME_DURATION, entry.data.i64, entry.count);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertLensMetadata(const android::CameraMetadata& settings,
++                                         icamera::Parameters* parameter) {
++    uint32_t tag = ANDROID_LENS_FOCAL_LENGTH;
++    camera_metadata_ro_entry entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setFocalLength(entry.data.f[0]);
++    }
++
++    tag = ANDROID_LENS_APERTURE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setAperture(entry.data.f[0]);
++    }
++
++    tag = ANDROID_LENS_FOCUS_DISTANCE;
++    entry = settings.find(tag);
++    if (entry.count == 1) {
++        parameter->setFocusDistance(entry.data.f[0]);
++    }
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertLensParameter(const icamera::Parameters& parameter,
++                                          android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_APERTURES;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_LENS_APERTURE, entry.data.f, 1);
++    }
++
++    float focal = 0.0f;
++    parameter.getFocalLength(focal);
++    if (focal < EPSILON) {
++        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
++        if (entry.count >= 1) {
++            focal = entry.data.f[0];
++        }
++    }
++    settings->update(ANDROID_LENS_FOCAL_LENGTH, &focal, 1);
++
++    float focusDistanceDiopters = 0.0;
++    if (parameter.getFocusDistance(focusDistanceDiopters) == 0) {
++        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistanceDiopters, 1);
++    }
++
++    icamera::camera_range_t focusRange = {};
++    if (parameter.getFocusRange(focusRange) == 0) {
++        float range[] = {focusRange.min, focusRange.max};
++        settings->update(ANDROID_LENS_FOCUS_RANGE, range, 2);
++    }
++
++    uint8_t mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
++    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
++    float filterDensity = 0.0;
++    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertStatisticsParameter(const icamera::Parameters& /*parameter*/,
++                                                android::CameraMetadata* settings) {
++    camera_metadata_entry entry = settings->find(ANDROID_STATISTICS_FACE_DETECT_MODE);
++    if (entry.count == 1 && entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
++        LOG2("%s: Face mode is off", __func__);
++        int faceIds[1] = {0};
++        settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
++    }
++    return icamera::OK;
++}
++
++int MetadataConvert::convertFlashParameter(const icamera::Parameters& /*parameter*/,
++                                           android::CameraMetadata* settings) {
++    uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
++    settings->update(ANDROID_FLASH_MODE, &flashMode, 1);
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertAdvancedFeatureMetadata(const android::CameraMetadata& settings,
++                                                    icamera::Parameters* parameter) {
++    int ret = icamera::OK;
++    // ANDROID_DEMOSAIC
++    // ANDROID_EDGE
++    // ANDROID_HOT_PIXEL
++    // ANDROID_NOISE_REDUCTION
++
++    // ANDROID_SHADING
++    int mode;
++    camera_metadata_ro_entry entry = settings.find(ANDROID_SHADING_MODE);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], shadingModeTable, ARRAY_SIZE(shadingModeTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setShadingMode((icamera::camera_shading_mode_t)mode);
++        }
++    }
++
++    entry = settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE);
++    if (entry.count == 1) {
++        ret = getHalValue(entry.data.u8[0], lensShadingMapModeTable,
++                          ARRAY_SIZE(lensShadingMapModeTable), &mode);
++        if (ret == icamera::OK) {
++            parameter->setLensShadingMapMode((icamera::camera_lens_shading_map_mode_type_t)mode);
++        }
++    }
++
++    // ANDROID_TONEMAP
++    // ANDROID_INFO
++    // ANDROID_BLACK_LEVEL
++
++    return icamera::OK;
++}
++
++int MetadataConvert::convertAdvancedFeatureParameter(const icamera::Parameters& parameter,
++                                                     android::CameraMetadata* settings) {
++    int ret = icamera::OK;
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    // ANDROID_DEMOSAIC
++
++    // ANDROID_EDGE
++
++    // ANDROID_HOT_PIXEL
++
++    // ANDROID_NOISE_REDUCTION
++
++    // ANDROID_SHADING
++    icamera::camera_shading_mode_t shadingMode;
++    uint8_t saMode = ANDROID_SHADING_MODE_OFF;
++    if (parameter.getShadingMode(shadingMode) == icamera::OK) {
++        ret = getAndroidValue(shadingMode, shadingModeTable, ARRAY_SIZE(shadingModeTable), &saMode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_SHADING_MODE, &saMode, 1);
++        }
++    }
++
++    icamera::camera_lens_shading_map_mode_type_t lensShadingMapMode;
++    ret = parameter.getLensShadingMapMode(lensShadingMapMode);
++    if (ret == icamera::OK) {
++        uint8_t lensSMMode;
++        ret = getAndroidValue(lensShadingMapMode, shadingModeTable, ARRAY_SIZE(shadingModeTable),
++                              &lensSMMode);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lensSMMode, 1);
++        }
++    }
++
++    if (lensShadingMapMode == icamera::LENS_SHADING_MAP_MODE_ON) {
++        size_t lensShadingMapSize;
++        float* lensShadingMap = nullptr;
++        ret = parameter.getLensShadingMap(&lensShadingMap, lensShadingMapSize);
++        if (ret == icamera::OK) {
++            settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP, lensShadingMap,
++                             lensShadingMapSize);
++            if (saMode == ANDROID_SHADING_MODE_OFF) {
++                saMode = ANDROID_SHADING_MODE_FAST;
++                settings->update(ANDROID_SHADING_MODE, &saMode, 1);
++            }
++        }
++    }
++
++    // ANDROID_TONEMAP
++    // ANDROID_INFO
++    // ANDROID_BLACK_LEVEL
++    // ANDROID_SYNC
++
++    return icamera::OK;
++}
++
++void MetadataConvert::fillControlStaticMetadata(const icamera::Parameters& parameter,
++                                                android::CameraMetadata* settings) {
++    int ret = icamera::OK;
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    icamera_metadata_entry entry = meta.find(CAMERA_CONTROL_AVAILABLE_MODES);
++    if (entry.count != 0) {
++        settings->update(ANDROID_CONTROL_AVAILABLE_MODES, entry.data.u8, entry.count);
++    }
++
++    std::vector<icamera::camera_antibanding_mode_t> antibandingModes;
++    parameter.getSupportedAntibandingMode(antibandingModes);
++    if (antibandingModes.size() > 0) {
++        int size = antibandingModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(antibandingModes[i], antibandingModesTable,
++                                  ARRAY_SIZE(antibandingModesTable), &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, data, count);
++        }
++    } else {
++        LOGW("No antibanding modes provided!");
++    }
++
++    std::vector<icamera::camera_ae_mode_t> availAeModes;
++    parameter.getSupportedAeMode(availAeModes);
++    if (availAeModes.size() > 0) {
++        int size = availAeModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(availAeModes[i], aeModesTable, ARRAY_SIZE(aeModesTable),
++                                  &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AE_AVAILABLE_MODES, data, count);
++        }
++    } else {
++        LOGW("No ae modes provided!");
++    }
++
++    uint8_t aeLockAvailable = parameter.getAeLockAvailable()
++                                  ? ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE
++                                  : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
++    settings->update(ANDROID_CONTROL_AE_LOCK_AVAILABLE, &aeLockAvailable, 1);
++
++    icamera::camera_range_array_t fpsRanges;
++    if (parameter.getSupportedFpsRange(fpsRanges) == 0) {
++        int count = fpsRanges.size() * 2;
++        int32_t data[count];
++        for (size_t i = 0; i < fpsRanges.size(); i++) {
++            data[i * 2] = (int32_t)fpsRanges[i].min;
++            data[i * 2 + 1] = (int32_t)fpsRanges[i].max;
++        }
++        settings->update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, data, count);
++    } else {
++        LOGW("No fps ranges provided!");
++    }
++
++    icamera::camera_range_t aeCompensationRange;
++    if (parameter.getAeCompensationRange(aeCompensationRange) == 0) {
++        int32_t data[2];
++        data[0] = (int32_t)aeCompensationRange.min;
++        data[1] = (int32_t)aeCompensationRange.max;
++        settings->update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, data, 2);
++    } else {
++        LOGW("No ae compensation range provided!");
++    }
++
++    icamera::camera_rational_t aeCompensationStep;
++    if (parameter.getAeCompensationStep(aeCompensationStep) == 0) {
++        camera_metadata_rational rational;
++        rational.numerator = aeCompensationStep.numerator;
++        rational.denominator = aeCompensationStep.denominator;
++        settings->update(ANDROID_CONTROL_AE_COMPENSATION_STEP, &rational, 1);
++    } else {
++        LOGW("No ae compensation step provided!");
++    }
++
++    std::vector<icamera::camera_af_mode_t> availAfModes;
++    parameter.getSupportedAfMode(availAfModes);
++    if (availAfModes.size() > 0) {
++        int size = availAfModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(availAfModes[i], afModesTable, ARRAY_SIZE(afModesTable),
++                                  &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AF_AVAILABLE_MODES, data, count);
++        }
++    } else {
++        LOGW("No af modes provided!");
++    }
++
++    uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
++    settings->update(ANDROID_CONTROL_AVAILABLE_EFFECTS, &effectMode, 1);
++
++    entry = meta.find(CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
++    if (entry.count != 0) {
++        settings->update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, entry.data.u8, entry.count);
++    } else {
++        LOGW("No available scene modes");
++    }
++
++    icamera::camera_video_stabilization_list_t availDvsModes;
++    parameter.getSupportedVideoStabilizationMode(availDvsModes);
++    if (availDvsModes.size() > 0) {
++        int size = availDvsModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(availDvsModes[i], dvsModesTable, ARRAY_SIZE(dvsModesTable),
++                                  &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, data, count);
++        }
++    } else {
++        LOGW("No video stablization modes provided!");
++    }
++
++    std::vector<icamera::camera_awb_mode_t> availAwbModes;
++    parameter.getSupportedAwbMode(availAwbModes);
++    if (availAwbModes.size() > 0) {
++        int size = availAwbModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(availAwbModes[i], awbModesTable, ARRAY_SIZE(awbModesTable),
++                                  &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, data, count);
++        }
++    } else {
++        LOGW("No awb modes provided!");
++    }
++
++    uint8_t awbLockAvailable = parameter.getAwbLockAvailable()
++                                   ? ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE
++                                   : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
++    settings->update(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, &awbLockAvailable, 1);
++
++    int32_t rawSensitivity = 100;
++    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &rawSensitivity, 1);
++
++    int32_t rawSensitivityRange[2] = {100, 100};
++    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE, rawSensitivityRange, 2);
++
++    entry = meta.find(CAMERA_CONTROL_MAX_REGIONS);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_CONTROL_MAX_REGIONS, entry.data.i32, entry.count);
++    }
++}
++
++void MetadataConvert::fillScalerStaticMetadata(const icamera::Parameters& parameter,
++                                               android::CameraMetadata* settings) {
++// stream configuration: fmt, w, h, type
++#define STREAM_CFG_SIZE 4
++// duration: fmt, w, h, ns
++#define DURATION_SIZE 4
++
++    float maxDigitalZoom = 1.0;
++    settings->update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, &maxDigitalZoom, 1);
++
++    uint8_t type = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
++    settings->update(ANDROID_SCALER_CROPPING_TYPE, &type, 1);
++
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, entry.data.i32,
++                         entry.count);
++    }
++
++    tag = CAMERA_REPROCESS_MAX_CAPTURE_STALL;
++    entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_REPROCESS_MAX_CAPTURE_STALL, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS;
++    entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, entry.data.i32,
++                         entry.count);
++    }
++
++    tag = CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS;
++    entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, entry.data.i64, entry.count);
++    }
++
++    tag = CAMERA_SCALER_AVAILABLE_STALL_DURATIONS;
++    entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, entry.data.i64, entry.count);
++    }
++}
++
++void MetadataConvert::fillTonemapStaticMetadata(const icamera::Parameters& parameter,
++                                                android::CameraMetadata* settings) {
++    int ret = icamera::OK;
++
++    int32_t maxPoint = 0;
++    if (parameter.getTonemapMaxCurvePoints(maxPoint) == 0) {
++        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, &maxPoint, 1);
++    }
++
++    std::vector<icamera::camera_tonemap_mode_t> tonemapModes;
++    parameter.getSupportedTonemapMode(tonemapModes);
++    if (tonemapModes.size() > 0) {
++        int size = tonemapModes.size();
++        uint8_t data[size];
++        int count = 0;
++        for (int i = 0; i < size; i++) {
++            ret = getAndroidValue(tonemapModes[i], tonemapModesTable, ARRAY_SIZE(tonemapModesTable),
++                                  &data[count]);
++            if (ret == icamera::OK) {
++                count++;
++            }
++        }
++        if (count > 0) {
++            settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, data, count);
++        }
++    }
++}
++
++void MetadataConvert::fillSensorStaticMetadata(const icamera::Parameters& parameter,
++                                               android::CameraMetadata* settings) {
++    icamera::camera_range_t timeRange;
++    // Fill it if it is supported
++    if (parameter.getSupportedSensorExposureTimeRange(timeRange) == 0) {
++        int64_t range[2];
++        range[0] = timeRange.min * 1000LLU;  // us -> ns
++        range[1] = timeRange.max * 1000LLU;  // us -> ns
++        settings->update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, range, 2);
++        settings->update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, &(range[1]), 1);
++    } else {
++        LOGW("No SensorExposureTimeRange provided!");
++    }
++
++    icamera::camera_range_t sensitivityRange;
++    if (parameter.getSupportedSensorSensitivityRange(sensitivityRange) == 0) {
++        int32_t range[2];
++        range[0] = (int32_t)sensitivityRange.min;
++        range[1] = (int32_t)sensitivityRange.max;
++        settings->update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, range, 2);
++        settings->update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, &range[1], 1);
++    } else {
++        LOGW("No SensorSensitivityRange provided!");
++    }
++
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE;
++    icamera_metadata_entry entry = meta.find(tag);
++    // Check if the count is correct
++    if (entry.count == 4) {
++        settings->update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_OPAQUE_RAW_SIZE;
++    entry = meta.find(tag);
++    if (entry.count > 0) {
++        settings->update(ANDROID_SENSOR_OPAQUE_RAW_SIZE, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE;
++    entry = meta.find(tag);
++    if (entry.count == 2) {
++        settings->update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_INFO_PHYSICAL_SIZE;
++    entry = meta.find(tag);
++    if (entry.count == 2) {
++        settings->update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, entry.data.f, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, entry.data.u8, entry.count);
++    }
++
++    tag = CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES;
++    entry = meta.find(tag);
++    if (entry.count != 0) {
++        settings->update(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, entry.data.i32, entry.count);
++    }
++
++    int32_t whiteLevel = 0;
++    settings->update(ANDROID_SENSOR_INFO_WHITE_LEVEL, &whiteLevel, 1);
++
++    int32_t blackLevelPattern[4] = {0, 0, 0, 0};
++    settings->update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, blackLevelPattern, 4);
++
++    uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
++    settings->update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, &timestampSource, 1);
++
++    camera_metadata_rational_t baseGainFactor = {0, 1};
++    settings->update(ANDROID_SENSOR_BASE_GAIN_FACTOR, &baseGainFactor, 1);
++
++    int32_t orientation = 0;
++    tag = CAMERA_SENSOR_ORIENTATION;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        orientation = entry.data.u8[0];
++    }
++    settings->update(ANDROID_SENSOR_ORIENTATION, &orientation, 1);
++
++    int32_t profileHueSatMapDimensions[3] = {0, 0, 0};
++    settings->update(ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS, profileHueSatMapDimensions, 3);
++}
++
++void MetadataConvert::fillLensStaticMetadata(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    float aperture = 0.0;
++    if (icamera::OK == parameter.getLensAperture(aperture)) {
++        settings->update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, &aperture, 1);
++    }
++
++    float filterDensity = 0.0;
++    if (icamera::OK == parameter.getLensFilterDensity(filterDensity)) {
++        settings->update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, &filterDensity, 1);
++    }
++
++    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, entry.data.f, entry.count);
++    }
++
++    float hyperfocalDistance = 0.0;
++    if (icamera::OK == parameter.getLensHyperfocalDistance(hyperfocalDistance)) {
++        settings->update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, &hyperfocalDistance, 1);
++    }
++
++    float minFocusDistance = 0.0;
++    if (icamera::OK == parameter.getLensMinFocusDistance(minFocusDistance)) {
++        settings->update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, &minFocusDistance, 1);
++    }
++
++    tag = CAMERA_LENS_INFO_SHADING_MAP_SIZE;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, entry.data.u8, entry.count);
++    }
++
++    tag = CAMERA_LENS_FACING;
++    entry = meta.find(tag);
++    uint8_t lensFacing = ANDROID_LENS_FACING_BACK;
++    if (entry.count == 1) {
++        lensFacing = entry.data.u8[0];
++    }
++    settings->update(ANDROID_LENS_FACING, &lensFacing, 1);
++
++    uint8_t availableOpticalStabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
++    settings->update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
++                     &availableOpticalStabilization, 1);
++}
++
++void MetadataConvert::fillRequestStaticMetadata(const icamera::Parameters& parameter,
++                                                android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_REQUEST_PIPELINE_MAX_DEPTH;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, entry.data.u8, entry.count);
++    }
++
++    tag = CAMERA_REQUEST_AVAILABLE_CAPABILITIES;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, entry.data.u8, entry.count);
++    }
++
++    tag = CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, entry.data.i32, entry.count);
++    }
++
++    int32_t partialResultCount = 1;
++    settings->update(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, &partialResultCount, 1);
++
++    int32_t requestKeysBasic[] = {ANDROID_BLACK_LEVEL_LOCK,
++                                  ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
++                                  ANDROID_COLOR_CORRECTION_GAINS,
++                                  ANDROID_COLOR_CORRECTION_TRANSFORM,
++                                  ANDROID_CONTROL_AE_ANTIBANDING_MODE,
++                                  ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
++                                  ANDROID_CONTROL_AE_LOCK,
++                                  ANDROID_CONTROL_AE_MODE,
++                                  ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
++                                  ANDROID_CONTROL_AF_MODE,
++                                  ANDROID_CONTROL_AE_REGIONS,
++                                  ANDROID_CONTROL_AF_REGIONS,
++                                  ANDROID_CONTROL_AF_TRIGGER,
++                                  ANDROID_CONTROL_AWB_LOCK,
++                                  ANDROID_CONTROL_AWB_MODE,
++                                  ANDROID_CONTROL_CAPTURE_INTENT,
++                                  ANDROID_CONTROL_EFFECT_MODE,
++                                  ANDROID_CONTROL_MODE,
++                                  ANDROID_CONTROL_SCENE_MODE,
++                                  ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
++                                  ANDROID_EDGE_MODE,
++                                  ANDROID_FLASH_MODE,
++                                  ANDROID_JPEG_ORIENTATION,
++                                  ANDROID_JPEG_QUALITY,
++                                  ANDROID_JPEG_THUMBNAIL_QUALITY,
++                                  ANDROID_JPEG_THUMBNAIL_SIZE,
++                                  ANDROID_SCALER_CROP_REGION,
++                                  ANDROID_STATISTICS_FACE_DETECT_MODE,
++                                  ANDROID_SENSOR_FRAME_DURATION,
++                                  ANDROID_SENSOR_EXPOSURE_TIME,
++                                  ANDROID_SENSOR_SENSITIVITY,
++                                  ANDROID_HOT_PIXEL_MODE,
++                                  ANDROID_LENS_APERTURE,
++                                  ANDROID_LENS_FOCAL_LENGTH,
++                                  ANDROID_LENS_FOCUS_DISTANCE,
++                                  ANDROID_LENS_FILTER_DENSITY,
++                                  ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
++                                  ANDROID_NOISE_REDUCTION_MODE,
++                                  ANDROID_REQUEST_ID,
++                                  ANDROID_REQUEST_TYPE,
++                                  ANDROID_TONEMAP_MODE,
++                                  ANDROID_TONEMAP_PRESET_CURVE,
++                                  ANDROID_TONEMAP_GAMMA,
++                                  ANDROID_SHADING_MODE,
++                                  ANDROID_STATISTICS_LENS_SHADING_MAP_MODE};
++    size_t requestKeysCnt = sizeof(requestKeysBasic) / sizeof(requestKeysBasic[0]);
++    settings->update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, requestKeysBasic, requestKeysCnt);
++
++    int32_t resultKeysBasic[] = {ANDROID_REQUEST_ID,
++                                 ANDROID_REQUEST_TYPE,
++                                 ANDROID_COLOR_CORRECTION_MODE,
++                                 ANDROID_COLOR_CORRECTION_GAINS,
++                                 ANDROID_COLOR_CORRECTION_TRANSFORM,
++                                 ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
++                                 ANDROID_CONTROL_AE_ANTIBANDING_MODE,
++                                 ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
++                                 ANDROID_CONTROL_AE_LOCK,
++                                 ANDROID_CONTROL_AE_MODE,
++                                 ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
++                                 ANDROID_CONTROL_AF_MODE,
++                                 ANDROID_CONTROL_AE_REGIONS,
++                                 ANDROID_CONTROL_AF_REGIONS,
++                                 ANDROID_CONTROL_AF_TRIGGER,
++                                 ANDROID_CONTROL_AWB_LOCK,
++                                 ANDROID_CONTROL_AWB_MODE,
++                                 ANDROID_CONTROL_CAPTURE_INTENT,
++                                 ANDROID_CONTROL_EFFECT_MODE,
++                                 ANDROID_CONTROL_MODE,
++                                 ANDROID_CONTROL_SCENE_MODE,
++                                 ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
++                                 ANDROID_CONTROL_AE_STATE,
++                                 ANDROID_CONTROL_AF_STATE,
++                                 ANDROID_CONTROL_AWB_STATE,
++                                 ANDROID_SYNC_FRAME_NUMBER,
++                                 ANDROID_EDGE_MODE,
++                                 ANDROID_FLASH_MODE,
++                                 ANDROID_JPEG_ORIENTATION,
++                                 ANDROID_JPEG_QUALITY,
++                                 ANDROID_JPEG_THUMBNAIL_QUALITY,
++                                 ANDROID_JPEG_THUMBNAIL_SIZE,
++                                 ANDROID_LENS_APERTURE,
++                                 ANDROID_LENS_FOCAL_LENGTH,
++                                 ANDROID_LENS_FOCUS_DISTANCE,
++                                 ANDROID_LENS_FILTER_DENSITY,
++                                 ANDROID_LENS_FOCUS_RANGE,
++                                 ANDROID_LENS_STATE,
++                                 ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
++                                 ANDROID_SCALER_CROP_REGION,
++                                 ANDROID_SENSOR_FRAME_DURATION,
++                                 ANDROID_SENSOR_EXPOSURE_TIME,
++                                 ANDROID_SENSOR_SENSITIVITY,
++                                 ANDROID_HOT_PIXEL_MODE,
++                                 ANDROID_REQUEST_PIPELINE_DEPTH,
++                                 ANDROID_SHADING_MODE,
++                                 ANDROID_STATISTICS_FACE_DETECT_MODE,
++                                 ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE,
++                                 ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
++                                 ANDROID_STATISTICS_SCENE_FLICKER,
++                                 ANDROID_NOISE_REDUCTION_MODE,
++                                 ANDROID_TONEMAP_CURVE_RED,
++                                 ANDROID_TONEMAP_CURVE_BLUE,
++                                 ANDROID_TONEMAP_CURVE_GREEN};
++    size_t resultKeysCnt = sizeof(resultKeysBasic) / sizeof(resultKeysBasic[0]);
++    settings->update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, resultKeysBasic, resultKeysCnt);
++
++    int32_t characteristicsKeysBasic[] = {ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
++                                          ANDROID_CONTROL_AVAILABLE_MODES,
++                                          ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
++                                          ANDROID_CONTROL_AE_AVAILABLE_MODES,
++                                          ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
++                                          ANDROID_CONTROL_AE_COMPENSATION_RANGE,
++                                          ANDROID_CONTROL_AE_COMPENSATION_STEP,
++                                          ANDROID_CONTROL_AE_LOCK_AVAILABLE,
++                                          ANDROID_CONTROL_AF_AVAILABLE_MODES,
++                                          ANDROID_CONTROL_AVAILABLE_EFFECTS,
++                                          ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
++                                          ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
++                                          ANDROID_CONTROL_AWB_AVAILABLE_MODES,
++                                          ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
++                                          ANDROID_EDGE_AVAILABLE_EDGE_MODES,
++                                          ANDROID_FLASH_INFO_AVAILABLE,
++                                          ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,
++                                          ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
++                                          ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
++                                          ANDROID_LENS_FACING,
++                                          ANDROID_LENS_INFO_AVAILABLE_APERTURES,
++                                          ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
++                                          ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
++                                          ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
++                                          ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
++                                          ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
++                                          ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
++                                          ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
++                                          ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
++                                          ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
++                                          ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
++                                          ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
++                                          ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
++                                          ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
++                                          ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
++                                          ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
++                                          ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
++                                          ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
++                                          ANDROID_SCALER_CROPPING_TYPE,
++                                          ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
++                                          ANDROID_SENSOR_ORIENTATION,
++                                          ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
++                                          ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
++                                          ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
++                                          ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
++                                          ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
++                                          ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
++                                          ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
++                                          ANDROID_SENSOR_INFO_WHITE_LEVEL,
++                                          ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
++                                          ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,
++                                          ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
++                                          ANDROID_SHADING_AVAILABLE_MODES,
++                                          ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
++                                          ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
++                                          ANDROID_SYNC_MAX_LATENCY,
++                                          ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES,
++                                          ANDROID_TONEMAP_MAX_CURVE_POINTS};
++    settings->update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, characteristicsKeysBasic,
++                     sizeof(characteristicsKeysBasic) / sizeof(int32_t));
++}
++
++void MetadataConvert::fillStatisticsStaticMetadata(const icamera::Parameters& parameter,
++                                                   android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    icamera_metadata_entry entry;
++    entry = meta.find(CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
++    if (entry.count != 0) {
++        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, entry.data.u8,
++                         entry.count);
++    } else {
++        uint8_t availFaceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
++        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, &availFaceDetectMode,
++                         1);
++    }
++
++    entry = meta.find(CAMERA_STATISTICS_INFO_MAX_FACE_COUNT);
++    if (entry.count != 0) {
++        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, entry.data.i32, entry.count);
++    } else {
++        int32_t maxFaceCount = 0;
++        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, &maxFaceCount, 1);
++    }
++
++    int32_t histogramBucketCount = 0;
++    settings->update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, &histogramBucketCount, 1);
++
++    int32_t maxHistogramCount = 0;
++    settings->update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, &maxHistogramCount, 1);
++
++    int32_t maxSharpnessMapValue = 0;
++    settings->update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, &maxSharpnessMapValue, 1);
++
++    int32_t sharpnessMapSize[2] = {0, 0};
++    settings->update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, sharpnessMapSize, 2);
++
++    uint8_t availableHotPixelMapModes = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
++    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
++                     &availableHotPixelMapModes, 1);
++
++    uint8_t availableLensShadingMapModes = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
++    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES,
++                     &availableLensShadingMapModes, 1);
++}
++
++void MetadataConvert::fillJpegStaticMetadata(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    uint32_t tag = CAMERA_JPEG_MAX_SIZE;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_JPEG_MAX_SIZE, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES;
++    entry = meta.find(tag);
++    if (entry.count >= 2) {
++        settings->update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, entry.data.i32, entry.count);
++    }
++}
++
++void MetadataConvert::fillAdvancedFeatureStaticMetadata(const icamera::Parameters& parameter,
++                                                        android::CameraMetadata* settings) {
++    icamera::CameraMetadata meta;
++    icamera::ParameterHelper::copyMetadata(parameter, &meta);
++
++    // ANDROID_DEMOSAIC
++
++    // ANDROID_EDGE
++    uint32_t tag = CAMERA_EDGE_AVAILABLE_EDGE_MODES;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_EDGE_AVAILABLE_EDGE_MODES, entry.data.u8, entry.count);
++    }
++
++    // ANDROID_HOT_PIXEL
++    tag = CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, entry.data.u8, entry.count);
++    }
++
++    // ANDROID_NOISE_REDUCTION
++    tag = CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, entry.data.u8,
++                         entry.count);
++    }
++
++    // ANDROID_SHADING
++    tag = CAMERA_SHADING_AVAILABLE_MODES;
++    entry = meta.find(tag);
++    if (entry.count != 0) {
++        settings->update(ANDROID_SHADING_AVAILABLE_MODES, entry.data.u8, entry.count);
++    }
++
++    // ANDROID_TONEMAP
++    tag = CAMERA_TONEMAP_MAX_CURVE_POINTS;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, entry.data.i32, entry.count);
++    }
++
++    tag = CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES;
++    entry = meta.find(tag);
++    if (entry.count >= 1) {
++        settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, entry.data.u8, entry.count);
++    }
++
++    // ANDROID_INFO
++    tag = CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, entry.data.u8, entry.count);
++    }
++
++    // ANDROID_BLACK_LEVEL
++
++    // ANDROID_SYNC
++    tag = CAMERA_SYNC_MAX_LATENCY;
++    entry = meta.find(tag);
++    if (entry.count == 1) {
++        settings->update(ANDROID_SYNC_MAX_LATENCY, entry.data.i32, entry.count);
++    }
++}
++
++int MetadataConvert::convertToHalWindow(const int32_t* data, int dataCount,
++                                        icamera::camera_window_list_t* windows) {
++    windows->clear();
++    CheckError((!data), icamera::BAD_VALUE, "null data to convert hal window!");
++    CheckError((dataCount % 5 != 0), icamera::BAD_VALUE, "wrong data count %d!", dataCount);
++
++    icamera::camera_window_t window;
++    for (int i = 0; i < dataCount / 5; i += 5) {
++        window.left = data[i];
++        window.top = data[i + 1];
++        window.right = data[i + 2];
++        window.bottom = data[i + 3];
++        window.weight = data[i + 4];
++        windows->push_back(window);
++    }
++    return icamera::OK;
++}
++
++int MetadataConvert::convertToMetadataRegion(const icamera::camera_window_list_t& windows,
++                                             int dataCount, int32_t* data) {
++    size_t num = windows.size();
++    CheckError((!data), 0, "null data to convert Metadata region!");
++    CheckError(((unsigned int)dataCount < num * 5), 0, "small dataCount!");
++
++    for (size_t i = 0; i < windows.size(); i++) {
++        data[i * 5] = windows[i].left;
++        data[i * 5 + 1] = windows[i].top;
++        data[i * 5 + 2] = windows[i].right;
++        data[i * 5 + 3] = windows[i].bottom;
++        data[i * 5 + 4] = windows[i].weight;
++    }
++
++    return num * 5;
++}
++
++void MetadataConvert::dumpMetadata(const camera_metadata_t* meta) {
++    if (!meta || !icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_LEVEL2)) {
++        return;
++    }
++
++    LOG2("%s", __func__);
++    int entryCount = get_camera_metadata_entry_count(meta);
++
++    for (int i = 0; i < entryCount; i++) {
++        camera_metadata_entry_t entry;
++        if (get_camera_metadata_entry(const_cast<camera_metadata_t*>(meta), i, &entry)) {
++            continue;
++        }
++
++        // Print tag & type
++        const char *tagName, *tagSection;
++        tagSection = get_camera_metadata_section_name(entry.tag);
++        if (tagSection == nullptr) {
++            tagSection = "unknownSection";
++        }
++        tagName = get_camera_metadata_tag_name(entry.tag);
++        if (tagName == nullptr) {
++            tagName = "unknownTag";
++        }
++        const char* typeName;
++        if (entry.type >= NUM_TYPES) {
++            typeName = "unknown";
++        } else {
++            typeName = camera_metadata_type_names[entry.type];
++        }
++        LOG2("(%d)%s.%s (%05x): %s[%zu], type: %d", i, tagSection, tagName, entry.tag, typeName,
++             entry.count, entry.type);
++
++        // Print data
++        size_t j;
++        const uint8_t* u8;
++        const int32_t* i32;
++        const float* f;
++        const int64_t* i64;
++        const double* d;
++        const camera_metadata_rational_t* r;
++        std::ostringstream stringStream;
++        stringStream << "[";
++
++        switch (entry.type) {
++            case TYPE_BYTE:
++                u8 = entry.data.u8;
++                for (j = 0; j < entry.count; j++) stringStream << (int32_t)u8[j] << " ";
++                break;
++            case TYPE_INT32:
++                i32 = entry.data.i32;
++                for (j = 0; j < entry.count; j++) stringStream << " " << i32[j] << " ";
++                break;
++            case TYPE_FLOAT:
++                f = entry.data.f;
++                for (j = 0; j < entry.count; j++) stringStream << " " << f[j] << " ";
++                break;
++            case TYPE_INT64:
++                i64 = entry.data.i64;
++                for (j = 0; j < entry.count; j++) stringStream << " " << i64[j] << " ";
++                break;
++            case TYPE_DOUBLE:
++                d = entry.data.d;
++                for (j = 0; j < entry.count; j++) stringStream << " " << d[j] << " ";
++                break;
++            case TYPE_RATIONAL:
++                r = entry.data.r;
++                for (j = 0; j < entry.count; j++)
++                    stringStream << " (" << r[j].numerator << ", " << r[j].denominator << ") ";
++                break;
++        }
++        stringStream << "]";
++        std::string str = stringStream.str();
++        LOG2("%s", str.c_str());
++    }
++}
++
++StaticCapability::StaticCapability(int cameraId) : mCameraId(cameraId) {
++    LOG2("@%s, mCameraId %d", __func__, mCameraId);
++
++    icamera::camera_info_t cameraInfo = {};
++    icamera::get_camera_info(mCameraId, cameraInfo);
++    icamera::ParameterHelper::copyMetadata(*cameraInfo.capability, &mMetadata);
++}
++
++StaticCapability::~StaticCapability() {
++    LOG2("@%s, mCameraId: %d", __func__, mCameraId);
++}
++
++std::mutex StaticCapability::sLock;
++std::unordered_map<int, StaticCapability*> StaticCapability::sInstances;
++
++StaticCapability* StaticCapability::getInstance(int cameraId) {
++    std::lock_guard<std::mutex> lock(sLock);
++    if (sInstances.find(cameraId) == sInstances.end()) {
++        sInstances[cameraId] = new StaticCapability(cameraId);
++    }
++
++    return sInstances[cameraId];
++}
++
++void StaticCapability::releaseInstance(int cameraId) {
++    std::lock_guard<std::mutex> lock(sLock);
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        StaticCapability* capability = sInstances[cameraId];
++        sInstances.erase(cameraId);
++        delete capability;
++    }
++}
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.h b/camera/hal/intel/ipu6/aal/MetadataConvert.h
+new file mode 100644
+index 000000000000..ba4021af2af2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/MetadataConvert.h
+@@ -0,0 +1,142 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include <unordered_map>
++
++#include "FaceDetection.h"
++#include "HALv3Header.h"
++#include "ParameterHelper.h"
++#include "Parameters.h"
++
++namespace camera3 {
++
++/**
++ * \class MetadataConvert
++ *
++ * This class is used to convert application metadata to HAL metadata.
++ *
++ */
++class MetadataConvert {
++ public:
++    MetadataConvert(int cameraId);
++    virtual ~MetadataConvert();
++
++    static int constructDefaultMetadata(int cameraId, android::CameraMetadata* settings);
++    static int updateDefaultRequestSettings(int cameraId, int type,
++                                            android::CameraMetadata* settings);
++
++    static int requestMetadataToHALMetadata(const android::CameraMetadata& settings,
++                                            icamera::Parameters* parameter, bool forceConvert);
++    static int HALMetadataToRequestMetadata(const icamera::Parameters& parameter,
++                                            android::CameraMetadata* settings, int cameraId);
++    static int HALCapabilityToStaticMetadata(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings);
++    static void dumpMetadata(const camera_metadata_t* meta);
++    static void convertFaceDetectionMetadata(const icamera::CVFaceDetectionAbstractResult& fdResult,
++                                             android::CameraMetadata* settings);
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(MetadataConvert);
++
++    // Parameters -> Android dynamic metadata
++    static int convertColorCorrectionParameter(const icamera::Parameters& parameter,
++                                               android::CameraMetadata* settings);
++    static int convertControlParameter(const icamera::Parameters& parameter,
++                                       android::CameraMetadata* settings);
++    static int convertRequestParameter(const icamera::Parameters& parameter,
++                                       android::CameraMetadata* settings, int cameraId);
++    static int convertSensorParameter(const icamera::Parameters& parameter,
++                                      android::CameraMetadata* settings);
++    static int convertLensParameter(const icamera::Parameters& parameter,
++                                    android::CameraMetadata* settings);
++    static int convertStatisticsParameter(const icamera::Parameters& /*parameter*/,
++                                          android::CameraMetadata* settings);
++    static int convertTonemapParameter(const icamera::Parameters& parameter,
++                                       android::CameraMetadata* settings);
++    static int convertFlashParameter(const icamera::Parameters& /*parameter*/,
++                                     android::CameraMetadata* settings);
++    static int convertAdvancedFeatureMetadata(const android::CameraMetadata& settings,
++                                              icamera::Parameters* parameter);
++    static int convertAdvancedFeatureParameter(const icamera::Parameters& parameter,
++                                               android::CameraMetadata* settings);
++
++    // Android control metadata -> parameters
++    static int convertColorCorrectionMetadata(const android::CameraMetadata& settings,
++                                              icamera::Parameters* parameter);
++    static int convertControlMetadata(const android::CameraMetadata& settings,
++                                      icamera::Parameters* parameter);
++    static int convertTonemapMetadata(const android::CameraMetadata& settings,
++                                      icamera::Parameters* parameter);
++    static int convertJpegMetadata(const android::CameraMetadata& settings,
++                                   icamera::Parameters* parameter);
++    static int convertSensorMetadata(const android::CameraMetadata& settings,
++                                     icamera::Parameters* parameter, bool forceConvert);
++    static int convertLensMetadata(const android::CameraMetadata& settings,
++                                   icamera::Parameters* parameter);
++
++    // Capabilities -> Android static metadata
++    static void fillControlStaticMetadata(const icamera::Parameters& parameter,
++                                          android::CameraMetadata* settings);
++    static void fillScalerStaticMetadata(const icamera::Parameters& parameter,
++                                         android::CameraMetadata* settings);
++    static void fillSensorStaticMetadata(const icamera::Parameters& parameter,
++                                         android::CameraMetadata* settings);
++    static void fillLensStaticMetadata(const icamera::Parameters& parameter,
++                                       android::CameraMetadata* settings);
++    static void fillRequestStaticMetadata(const icamera::Parameters& parameter,
++                                          android::CameraMetadata* settings);
++    static void fillStatisticsStaticMetadata(const icamera::Parameters& parameter,
++                                             android::CameraMetadata* settings);
++    static void fillTonemapStaticMetadata(const icamera::Parameters& parameter,
++                                          android::CameraMetadata* settings);
++    static void fillJpegStaticMetadata(const icamera::Parameters& parameter,
++                                       android::CameraMetadata* settings);
++    static void fillAdvancedFeatureStaticMetadata(const icamera::Parameters& parameter,
++                                                  android::CameraMetadata* settings);
++
++    static int convertToHalWindow(const int32_t* data, int dataCount,
++                                  icamera::camera_window_list_t* windows);
++    static int convertToMetadataRegion(const icamera::camera_window_list_t& windows, int dataCount,
++                                       int32_t* data);
++
++ private:
++    int mCameraId;
++};
++
++class StaticCapability {
++ public:
++    const icamera::CameraMetadata* getCapability() { return &mMetadata; }
++    static StaticCapability* getInstance(int cameraId);
++    static void releaseInstance(int cameraId);
++
++ private:
++    StaticCapability(int cameraId);
++    virtual ~StaticCapability();
++
++ private:
++    // Guard for singleton instance creation.
++    static std::mutex sLock;
++    static std::unordered_map<int, StaticCapability*> sInstances;
++
++    icamera::CameraMetadata mMetadata;
++    int mCameraId;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.cpp b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
+new file mode 100644
+index 000000000000..962486a278dc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
+@@ -0,0 +1,193 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PostProcessor"
++
++#include "PostProcessor.h"
++
++#include "HALv3Utils.h"
++
++namespace camera3 {
++
++PostProcessor::PostProcessor(int cameraId, const camera3_stream_t& stream)
++        : mCameraId(cameraId),
++          mPostProcessType(icamera::POST_PROCESS_NONE),
++          mPostProcessorCore(std::unique_ptr<icamera::PostProcessorCore>(
++              new icamera::PostProcessorCore(cameraId))) {
++    LOG1("@%s", __func__);
++}
++
++PostProcessor::~PostProcessor() {
++    LOG1("@%s", __func__);
++}
++
++icamera::status_t PostProcessor::configure(const camera3_stream_t& stream,
++                                           const camera3_stream_t& srcStream) {
++    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
++    LOG1("@%s, srcStream: w:%d, h:%d, f:%d", __func__, srcStream.width, srcStream.height,
++         srcStream.format);
++
++    icamera::stream_t halStream;
++    int ret = camera3::HalV3Utils::fillHALStreams(mCameraId, srcStream, &halStream);
++    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d, ret:%d", __func__, halStream.width,
++         halStream.height, halStream.format, halStream.size, halStream.stride, ret);
++    CheckError(ret != icamera::OK, ret, "fillHALStreams fails, ret %d", ret);
++
++    return configure(stream, halStream);
++}
++
++/* configure
++ *
++ * Decide post-processing is needed based on user stream and hal stream.
++ * The default processing order is rotate -> crop -> scale -> convert -> encode.
++ */
++icamera::status_t PostProcessor::configure(const camera3_stream_t& stream,
++                                           const icamera::stream_t& halStream) {
++    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
++    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d", __func__, halStream.width,
++         halStream.height, halStream.format, halStream.size, halStream.stride);
++
++    icamera::PostProcessInfo info;
++    mPostProcessType = icamera::POST_PROCESS_NONE;
++    std::vector<icamera::PostProcessInfo> processingOrder;
++    int angle = HalV3Utils::getRotationDegrees(stream);
++
++    /* Fill the input/output information for the post processing unit.
++     * The input info of processing unit is the output info of last unit.
++     */
++    icamera::stream_t inputStreamInfo = halStream;
++    if (angle > 0 && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_ROTATE)) {
++        mPostProcessType |= icamera::POST_PROCESS_ROTATE;
++        info.angle = angle;
++        info.type = icamera::POST_PROCESS_ROTATE;
++        info.inputInfo = inputStreamInfo;
++        info.outputInfo = inputStreamInfo;
++        info.outputInfo.width = inputStreamInfo.height;
++        info.outputInfo.height = inputStreamInfo.width;
++        info.outputInfo.stride = inputStreamInfo.height;
++        info.outputInfo.format = inputStreamInfo.format;
++        info.outputInfo.size = icamera::CameraUtils::getFrameSize(
++            info.outputInfo.format, info.outputInfo.width, info.outputInfo.height);
++        LOG2("%s, Rotate: input %dx%d, output: %dx%d, angle: %d", __func__, inputStreamInfo.width,
++             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height, angle);
++
++        inputStreamInfo = info.outputInfo;
++        processingOrder.push_back(info);
++    }
++
++    // Crop
++    if (inputStreamInfo.width * stream.height != inputStreamInfo.height * stream.width &&
++        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CROP)) {
++        mPostProcessType |= icamera::POST_PROCESS_CROP;
++        info.type = icamera::POST_PROCESS_CROP;
++        info.inputInfo = inputStreamInfo;
++
++        // Caclulate the best crop size with same aspect ratio
++        if (inputStreamInfo.width * stream.height < inputStreamInfo.height * stream.width) {
++            info.outputInfo.width = info.inputInfo.width;
++            info.outputInfo.height = ALIGN(info.inputInfo.width * stream.height / stream.width, 2);
++        } else {
++            info.outputInfo.width = ALIGN(info.inputInfo.height * stream.width / stream.height, 2);
++            info.outputInfo.height = info.inputInfo.height;
++        }
++        info.outputInfo.format = inputStreamInfo.format;
++        info.outputInfo.stride = info.outputInfo.width;
++        info.outputInfo.size = icamera::CameraUtils::getFrameSize(
++            info.outputInfo.format, info.outputInfo.width, info.outputInfo.height);
++        LOG2("%s, Crop: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
++             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
++
++        inputStreamInfo = info.outputInfo;
++        processingOrder.push_back(info);
++    }
++
++    // Scale
++    if ((uint32_t)inputStreamInfo.width * inputStreamInfo.height != stream.width * stream.height &&
++        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_SCALING)) {
++        mPostProcessType |= icamera::POST_PROCESS_SCALING;
++        info.type = icamera::POST_PROCESS_SCALING;
++        info.inputInfo = inputStreamInfo;
++        info.outputInfo.width = stream.width;
++        info.outputInfo.height = stream.height;
++        info.outputInfo.stride = stream.width;
++        info.outputInfo.format = inputStreamInfo.format;
++        info.outputInfo.size = icamera::CameraUtils::getFrameSize(
++            info.outputInfo.format, info.outputInfo.width, info.outputInfo.height);
++        LOG2("%s, Scale: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
++             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
++
++        inputStreamInfo = info.outputInfo;
++        processingOrder.push_back(info);
++    }
++
++    // Convert
++    if (inputStreamInfo.format !=
++            HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format, stream.usage) &&
++        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CONVERT)) {
++        mPostProcessType |= icamera::POST_PROCESS_CONVERT;
++        info.type = icamera::POST_PROCESS_CONVERT;
++        info.inputInfo = inputStreamInfo;
++        info.outputInfo.width = stream.width;
++        info.outputInfo.height = stream.height;
++        info.outputInfo.stride = stream.width;
++        info.outputInfo.format =
++            HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format, stream.usage);
++        info.outputInfo.size = icamera::CameraUtils::getFrameSize(
++            info.outputInfo.format, info.outputInfo.width, info.outputInfo.height);
++        LOG2("%s, Convert: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
++             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
++
++        inputStreamInfo = info.outputInfo;
++        processingOrder.push_back(info);
++    }
++
++    // Encode
++    if (stream.format == HAL_PIXEL_FORMAT_BLOB &&
++        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_JPEG_ENCODING)) {
++        mPostProcessType |= icamera::POST_PROCESS_JPEG_ENCODING;
++        info.type = icamera::POST_PROCESS_JPEG_ENCODING;
++        info.inputInfo = inputStreamInfo;
++        info.outputInfo.width = stream.width;
++        info.outputInfo.height = stream.height;
++        info.outputInfo.stride = stream.width;
++        info.outputInfo.format =
++            HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format, stream.usage);
++        info.outputInfo.size = icamera::CameraUtils::getFrameSize(
++            info.outputInfo.format, info.outputInfo.width, info.outputInfo.height);
++        inputStreamInfo = info.outputInfo;
++        processingOrder.push_back(info);
++    }
++
++    if ((uint32_t)inputStreamInfo.width != stream.width ||
++        (uint32_t)inputStreamInfo.height != stream.height ||
++        inputStreamInfo.format !=
++            HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format, stream.usage)) {
++        LOGE("%s, stream info doesn't match between input and output stream.", __func__);
++        return icamera::UNKNOWN_ERROR;
++    }
++    LOG1("@%s, camera id %d, mPostProcessType %d, processing unit number: %zu", __func__, mCameraId,
++         mPostProcessType, processingOrder.size());
++    mPostProcessorCore->configure(processingOrder);
++
++    return icamera::OK;
++}
++
++icamera::status_t PostProcessor::doPostProcessing(const std::shared_ptr<Camera3Buffer>& inBuf,
++                                                  const icamera::Parameters& parameter,
++                                                  std::shared_ptr<Camera3Buffer> outBuf) {
++    return mPostProcessorCore->doPostProcessing(inBuf, parameter, outBuf);
++}
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.h b/camera/hal/intel/ipu6/aal/PostProcessor.h
+new file mode 100644
+index 000000000000..736e7104a970
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/PostProcessor.h
+@@ -0,0 +1,60 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include <memory>
++
++#include "Camera3Buffer.h"
++#include "Errors.h"
++#include "ICamera.h"
++#include "PostProcessorCore.h"
++#include "Utils.h"
++
++namespace camera3 {
++/**
++ * \class PostProcessor
++ *
++ * A wrapper based on PostProcessorCore for handling post-processing sequence,
++ * there are two main purposes of this class.
++ * 1. Provide the wrapper to implement post-processing feature.
++ * 2. Parsing the processing type and formulate the processing sequence
++ */
++class PostProcessor {
++ public:
++    PostProcessor(int cameraId, const camera3_stream_t& stream);
++    virtual ~PostProcessor();
++
++    // srcStream will convert to stream_t and call the other configure
++    icamera::status_t configure(const camera3_stream_t& stream, const camera3_stream_t& srcStream);
++    icamera::status_t configure(const camera3_stream_t& stream, const icamera::stream_t& halStream);
++    int getPostProcessType() { return mPostProcessType; }
++    icamera::status_t doPostProcessing(const std::shared_ptr<Camera3Buffer>& inBuf,
++                                       const icamera::Parameters& parameter,
++                                       std::shared_ptr<Camera3Buffer> outBuf);
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(PostProcessor);
++
++ private:
++    int mCameraId;
++    int mPostProcessType;
++    std::unique_ptr<icamera::PostProcessorCore> mPostProcessorCore;
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/RequestManager.cpp b/camera/hal/intel/ipu6/aal/RequestManager.cpp
+new file mode 100644
+index 000000000000..26785775d77e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/RequestManager.cpp
+@@ -0,0 +1,788 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "RequestManager"
++
++#include "RequestManager.h"
++
++#include <hardware/gralloc.h>
++#include <linux/videodev2.h>
++#include <math.h>
++
++#include <algorithm>
++#include <cstdlib>
++#include <list>
++#include <map>
++#include <unordered_map>
++#include <utility>
++#include <vector>
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "ICamera.h"
++#include "MetadataConvert.h"
++#include "Parameters.h"
++#include "PlatformData.h"
++#include "Utils.h"
++
++namespace camera3 {
++RequestManager::RequestManager(int cameraId)
++        : mCameraId(cameraId),
++          mCallbackOps(nullptr),
++          mCameraDeviceStarted(false),
++          mResultProcessor(nullptr),
++          mInputStreamConfigured(false),
++          mRequestInProgress(0) {
++    LOG1("@%s", __func__);
++
++    CLEAR(mCameraBufferInfo);
++}
++
++RequestManager::~RequestManager() {
++    LOG1("@%s", __func__);
++
++    deleteStreams(false);
++
++    delete mResultProcessor;
++}
++
++int RequestManager::init(const camera3_callback_ops_t* callback_ops) {
++    LOG1("@%s", __func__);
++
++    // Update the default settings from camera HAL
++    icamera::Parameters parameter;
++    int ret = icamera::camera_get_parameters(mCameraId, parameter);
++    CheckError(ret != icamera::OK, ret, "failed to get parameters, ret %d", ret);
++    StaticCapability::getInstance(mCameraId);
++
++    android::CameraMetadata defaultRequestSettings;
++    // Get static metadata
++    MetadataConvert::HALCapabilityToStaticMetadata(parameter, &defaultRequestSettings);
++
++    // Get defalut settings
++    MetadataConvert::constructDefaultMetadata(mCameraId, &defaultRequestSettings);
++    MetadataConvert::HALMetadataToRequestMetadata(parameter, &defaultRequestSettings, mCameraId);
++
++    mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW] = defaultRequestSettings;
++    MetadataConvert::updateDefaultRequestSettings(
++        mCameraId, CAMERA3_TEMPLATE_PREVIEW, &mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW]);
++
++    mResultProcessor = new ResultProcessor(mCameraId, callback_ops, this);
++    mCallbackOps = callback_ops;
++
++    // Register callback to icamera HAL
++    icamera::camera_callback_ops_t::notify = RequestManager::callbackNotify;
++    icamera::camera_callback_register(mCameraId,
++                                      static_cast<icamera::camera_callback_ops_t*>(this));
++
++    return icamera::OK;
++}
++
++int RequestManager::deinit() {
++    LOG1("@%s", __func__);
++
++    if (mCameraDeviceStarted) {
++        int ret = icamera::camera_device_stop(mCameraId);
++        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
++        mCameraDeviceStarted = false;
++    }
++
++    mRequestInProgress = 0;
++    StaticCapability::releaseInstance(mCameraId);
++    return icamera::OK;
++}
++
++void RequestManager::callbackNotify(const icamera::camera_callback_ops* cb,
++                                    const icamera::camera_msg_data_t& data) {
++    LOG2("@%s, type %d", __func__, data.type);
++    RequestManager* callback = const_cast<RequestManager*>(static_cast<const RequestManager*>(cb));
++
++    callback->mResultProcessor->callbackNotify(data);
++    callback->handleCallbackEvent(data);
++}
++
++void RequestManager::handleCallbackEvent(const icamera::camera_msg_data_t& data) {
++    LOG2("@%s, cameraId: %d", __func__, mCameraId);
++
++    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId)) return;
++
++    for (auto& stream : mCamera3StreamVector) {
++        if (stream->getPostProcessType() != icamera::POST_PROCESS_NONE) {
++            stream->sendEvent(data);
++        }
++    }
++}
++
++int RequestManager::configureStreams(camera3_stream_configuration_t* stream_list) {
++    LOG1("@%s", __func__);
++
++    int ret = checkStreamRotation(stream_list);
++
++    CheckError(ret != icamera::OK, icamera::BAD_VALUE, "Unsupport rotation degree!");
++
++    if (mCameraDeviceStarted) {
++        ret = icamera::camera_device_stop(mCameraId);
++        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
++        mCameraDeviceStarted = false;
++    }
++
++    icamera::stream_t requestStreams[kMaxStreamNum];  // not include CAMERA3_STREAM_INPUT stream
++    uint32_t streamsNum = stream_list->num_streams;
++    uint32_t operationMode = stream_list->operation_mode;
++    LOG1("@%s, streamsNum:%d, operationMode:%d", __func__, streamsNum, operationMode);
++    CheckError((operationMode != CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE &&
++                operationMode != CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE),
++               icamera::BAD_VALUE, "Unknown operation mode %d!", operationMode);
++
++    int inputStreamNum = 0;
++    int outStreamNum = 0;
++    camera3_stream_t* stream = nullptr;
++    for (uint32_t i = 0; i < streamsNum; i++) {
++        stream = stream_list->streams[i];
++        LOG1("@%s, Config stream (%s):%dx%d, f:%d, u:%d, buf num:%d, priv:%p", __func__,
++             HalV3Utils::getCamera3StreamType(stream->stream_type), stream->width,
++             stream->height, stream->format, stream->usage, stream->max_buffers, stream->priv);
++        if (stream->stream_type == CAMERA3_STREAM_OUTPUT) {
++            outStreamNum++;
++        } else if (stream->stream_type == CAMERA3_STREAM_INPUT) {
++            inputStreamNum++;
++            mInputStreamConfigured = true;
++        } else if (stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
++            inputStreamNum++;
++            outStreamNum++;
++            mInputStreamConfigured = true;
++        } else {
++            LOGE("@%s, Unknown stream type %d!", __func__, stream->stream_type);
++            return icamera::BAD_VALUE;
++        }
++        // In ZSL case, RAW input and YUV input will be configured together.
++        CheckError(inputStreamNum > 2, icamera::BAD_VALUE, "Too many input streams : %d !",
++                   inputStreamNum);
++    }
++    CheckError(outStreamNum == 0, icamera::BAD_VALUE, "No output streams!");
++
++    /*
++     * Configure stream
++     */
++    mResultProcessor->clearRawBufferInfoMap();
++    int requestStreamNum = 0;
++    camera3_stream_t* inputStream = nullptr;
++    // Enable video pipe if yuv stream exists (for 3A stats data)
++    bool needAssignPreviewStream = true;
++    icamera::stream_t* yuvStream = nullptr;
++    for (uint32_t i = 0; i < streamsNum; i++) {
++        /*
++         * 1, for CAMERA3_STREAM_INPUT stream, format YCbCr_420_888 is for YUV
++         * reprocessing, other formats (like IMPLEMENTATION_DEFINED, RAW_OPAQUE) are
++         * for RAW reprocessing.
++         * 2, for CAMERA3_STREAM_BIDIRECTIONAL stream, it is for RAW reprocessing.
++         * 3, for CAMERA3_STREAM_OUTPUT stream, if format is IMPLEMENTATION_DEFINED
++         * and usage doesn't include COMPOSE or TEXTURE, it is for RAW reprocessing.
++         * if format is RAW_OPAQUE, it is for RAW reprocessing.
++         */
++        if (stream_list->streams[i]->stream_type == CAMERA3_STREAM_INPUT) {
++            if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
++                inputStream = stream_list->streams[i];
++                LOG1("@%s, input stream: w:%d, h:%d, f:%d", __func__, inputStream->width,
++                     inputStream->height, inputStream->format);
++            } else {
++                stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
++            }
++            stream_list->streams[i]->max_buffers = 2;
++            continue;
++        } else if (stream_list->streams[i]->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
++            stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
++        } else {
++            if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
++                inputStreamNum > 0) {
++                if (!(stream_list->streams[i]->usage &
++                      (GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_TEXTURE))) {
++                    stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
++                }
++            } else if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
++                stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
++            }
++        }
++
++        ret = HalV3Utils::fillHALStreams(mCameraId, *stream_list->streams[i],
++                                         &requestStreams[requestStreamNum]);
++        CheckError(ret != icamera::OK, ret, "failed to fill requestStreams[%d], ret:%d", ret,
++                   requestStreamNum);
++
++        if (!yuvStream && stream_list->streams[i]->format != HAL_PIXEL_FORMAT_BLOB &&
++            !IS_ZSL_USAGE(stream_list->streams[i]->usage)) {
++            yuvStream = &requestStreams[requestStreamNum];
++        }
++        if (requestStreams[requestStreamNum].usage == icamera::CAMERA_STREAM_PREVIEW ||
++            requestStreams[requestStreamNum].usage == icamera::CAMERA_STREAM_VIDEO_CAPTURE)
++            needAssignPreviewStream = false;
++
++        requestStreamNum++;
++    }
++    if (needAssignPreviewStream && yuvStream) {
++        yuvStream->usage = icamera::CAMERA_STREAM_PREVIEW;
++    }
++
++    CLEAR(mHALStream);
++
++    int halStreamFlag[kMaxStreamNum];
++    int halStreamNum = chooseHALStreams(requestStreamNum, halStreamFlag, requestStreams);
++    // halStreamNum should not exceed videoNum + 2 (1 opaque raw and 1 still)
++    int maxSupportStreamNum = icamera::PlatformData::getVideoStreamNum(mCameraId) + 2;
++    CheckError(halStreamNum > maxSupportStreamNum || halStreamNum <= 0,
++        icamera::BAD_VALUE, "failed to find HAL stream");
++
++    // index of stream in mHALStream
++    int halStreamIndex = 0;
++    // first:stream index in requestStreams[], second:HAL stream index in mHALStream[]
++    std::map<int, int> streamToHALIndex;
++    for (int i = 0; i < requestStreamNum; i++) {
++        // fill HAL stream with right requestStreams object
++        if (halStreamFlag[i] == i) {
++            mHALStream[halStreamIndex] = requestStreams[i];
++            streamToHALIndex[i] = halStreamIndex;
++            halStreamIndex++;
++        }
++    }
++
++    icamera::stream_config_t streamCfg = {
++        halStreamNum, mHALStream,
++        icamera::camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_MODE_AUTO};
++
++    for (int i = 0; i < requestStreamNum; i++) {
++        const icamera::stream_t& s = requestStreams[i];
++        LOG1("@%s, requestStreams[%d]: w:%d, h:%d, f:%d, u:%d", __func__, i, s.width, s.height,
++             s.format, s.usage);
++    }
++
++    for (int i = 0; i < halStreamNum; i++) {
++        const icamera::stream_t& s = mHALStream[i];
++        LOG1("@%s, configured mHALStream[%d]: w:%d, h:%d, f:%d, u:%d", __func__, i, s.width,
++             s.height, s.format, s.usage);
++    }
++
++    // Mark all streams as NOT active
++    for (auto& stream : mCamera3StreamVector) {
++        stream->setActive(false);
++    }
++
++    int enableFDStreamNum = -1;
++    Camera3Stream* faceDetectionOwner = nullptr;
++    // Mark one camera3Stream run face detection
++    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
++        LOG1("Face detection is enable");
++        chooseStreamForFaceDetection(streamsNum, stream_list->streams, &enableFDStreamNum);
++    }
++
++    ret = icamera::camera_device_config_streams(mCameraId, &streamCfg);
++    CheckError(ret != icamera::OK, ret, "failed to configure stream, ret %d", ret);
++
++    // Create Stream for new streams
++    requestStreamNum = 0;
++    for (uint32_t i = 0; i < streamsNum; i++) {
++        camera3_stream_t* stream = stream_list->streams[i];
++        if (stream->stream_type == CAMERA3_STREAM_INPUT) {
++            continue;
++        }
++
++        /* use halStreamFlag[] to find it's HAL stream index in requestStreams
++        ** streamToHALIndex to find it's HAL Stream index in mHALStream[]*/
++        int halStreamIndex = streamToHALIndex[halStreamFlag[requestStreamNum]];
++        bool isHALStream = halStreamFlag[requestStreamNum] == requestStreamNum;
++        CheckError(halStreamIndex < 0 || halStreamIndex >= halStreamNum, icamera::BAD_VALUE,
++                   "failed to find hal stream %d", halStreamIndex);
++        Camera3Stream* s =
++            new Camera3Stream(mCameraId, mResultProcessor, mHALStream[halStreamIndex].max_buffers,
++                              mHALStream[halStreamIndex], *stream, inputStream, isHALStream);
++        s->setActive(true);
++        stream->priv = s;
++        stream->max_buffers = mHALStream[halStreamIndex].max_buffers;
++        stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE | GRALLOC_USAGE_SW_READ_OFTEN |
++                         GRALLOC_USAGE_SW_WRITE_NEVER;
++        mCamera3StreamVector.push_back(s);
++
++        requestStreamNum++;
++        LOGI("OUTPUT max buffer %d, usage %x, format %x", stream->max_buffers, stream->usage,
++             stream->format);
++
++        if (enableFDStreamNum == i) {
++            faceDetectionOwner = static_cast<Camera3Stream*>(stream->priv);
++        }
++    }
++
++    // Remove useless Camera3Stream
++    deleteStreams(true);
++
++    // bind streams to HAL streams
++    for (int i = 0; i < mCamera3StreamVector.size(); i++) {
++        if (halStreamFlag[i] != i)
++            mCamera3StreamVector[halStreamFlag[i]]->addListener(mCamera3StreamVector[i]);
++    }
++
++    if (faceDetectionOwner != nullptr) {
++        faceDetectionOwner->activateFaceDetection(MAX_FACES_DETECTABLE);
++    }
++
++    return icamera::OK;
++}
++
++void RequestManager::chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t** streams,
++                                                  int* enableFDStreamNum) {
++    LOG1("@%s", __func__);
++    camera3_stream_t* preStream = nullptr;
++    camera3_stream_t* yuvStream = nullptr;
++    int maxWidth = MAX_FACE_FRAME_WIDTH;
++    int maxHeight = MAX_FACE_FRAME_HEIGHT;
++    int preStreamNum = -1;
++    int yuvStreamNum = -1;
++
++    for (uint32_t i = 0; i < streamsNum; i++) {
++        camera3_stream_t* s = streams[i];
++        if (!s || s->stream_type != CAMERA3_STREAM_OUTPUT || s->width > maxWidth ||
++            s->height > maxHeight) {
++            continue;
++        }
++
++        LOG1("stream information:format=%d, width=%d, height=%d", s->format, s->width, s->height);
++        // We assume HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream is the
++        // preview stream and it's requested in every capture request.
++        // If there are two HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED streams,
++        // We pick the smaller stream due to performance concern.
++        if (s->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && !IS_ZSL_USAGE(s->usage)) {
++            if (preStream && preStream->width * preStream->height <= s->width * s->height) {
++                continue;
++            }
++            preStream = s;
++            preStreamNum = i;
++        }
++
++        if (s->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
++            if (yuvStream && yuvStream->width * yuvStream->height <= s->width * s->height) {
++                continue;
++            }
++            yuvStream = s;
++            yuvStreamNum = i;
++        }
++    }
++
++    *enableFDStreamNum = -1;
++    if (preStreamNum >= 0) {
++        *enableFDStreamNum = preStreamNum;
++    } else if (yuvStreamNum >= 0) {
++        *enableFDStreamNum = yuvStreamNum;
++    }
++    LOG1("enableFDStreamNum %d", *enableFDStreamNum);
++}
++
++int RequestManager::constructDefaultRequestSettings(int type, const camera_metadata_t** meta) {
++    LOG1("@%s, type %d", __func__, type);
++
++    if (mDefaultRequestSettings.count(type) == 0) {
++        mDefaultRequestSettings[type] = mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW];
++        MetadataConvert::updateDefaultRequestSettings(mCameraId, type,
++                                                      &mDefaultRequestSettings[type]);
++    }
++    const camera_metadata_t* setting = mDefaultRequestSettings[type].getAndLock();
++    *meta = setting;
++    mDefaultRequestSettings[type].unlock(setting);
++
++    return icamera::OK;
++}
++
++int RequestManager::processCaptureRequest(camera3_capture_request_t* request) {
++    CheckError(!request, icamera::UNKNOWN_ERROR, "@%s, request is nullptr", __func__);
++    LOG1("@%s, frame_number:%d, input_buffer:%d, num_output_buffers:%d", __func__,
++         request->frame_number, request->input_buffer ? 1 : 0, request->num_output_buffers);
++
++    TRACE_LOG_POINT("RequestManager", __func__, MAKE_COLOR(request->frame_number),
++                    request->frame_number);
++
++    // Valid buffer and request
++    CheckError(request->num_output_buffers > kMaxStreamNum, icamera::BAD_VALUE,
++               "@%s, num_output_buffers:%d", __func__, request->num_output_buffers);
++
++    int ret = icamera::OK;
++
++    waitProcessRequest();
++
++    int index = -1;
++    for (int i = 0; i < kMaxProcessRequestNum; i++) {
++        if (!mCameraBufferInfo[i].frameInProcessing) {
++            index = i;
++        }
++    }
++    CheckError(index < 0, icamera::UNKNOWN_ERROR, "no empty CameraBufferInfo!");
++    CLEAR(mCameraBufferInfo[index]);
++
++    if (request->settings) {
++        MetadataConvert::dumpMetadata(request->settings);
++        mLastSettings = request->settings;
++    } else if (mLastSettings.isEmpty()) {
++        LOGE("nullptr settings for the first reqeust!");
++        return icamera::BAD_VALUE;
++    }
++
++    std::shared_ptr<Camera3Buffer> inputCam3Buf = nullptr;
++    icamera::sensor_raw_info_t opaqueRawInfo = {-1, 0};
++    if (request->input_buffer) {
++        inputCam3Buf = std::make_shared<Camera3Buffer>();
++        icamera::status_t status = inputCam3Buf->init(request->input_buffer, mCameraId);
++        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
++        status = inputCam3Buf->waitOnAcquireFence();
++        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
++        status = inputCam3Buf->lock();
++        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
++
++        camera_metadata_entry entry = mLastSettings.find(ANDROID_SENSOR_TIMESTAMP);
++        if (entry.count == 1) {
++            inputCam3Buf->setTimeStamp(entry.data.i64[0]);
++        }
++
++        if (IS_ZSL_USAGE(request->input_buffer->stream->usage)) {
++            MEMCPY_S(&opaqueRawInfo, sizeof(opaqueRawInfo), inputCam3Buf->data(),
++                     inputCam3Buf->size());
++            mResultProcessor->checkAndChangeRawbufferInfo(&opaqueRawInfo.sequence,
++                                                          &opaqueRawInfo.timestamp);
++            LOG2("%s, sequence id %ld, timestamp %ld", __func__, opaqueRawInfo.sequence,
++                 opaqueRawInfo.timestamp);
++        }
++    }
++
++    icamera::Parameters param;
++    param.setMakernoteMode(icamera::MAKERNOTE_MODE_OFF);
++    param.setUserRequestId(static_cast<int32_t>(request->frame_number));
++
++    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
++        camera3_stream_t* aStream = request->output_buffers[i].stream;        // app stream
++        Camera3Stream* lStream = static_cast<Camera3Stream*>(aStream->priv);  // local stream
++        if (mInputStreamConfigured || aStream->format == HAL_PIXEL_FORMAT_BLOB) {
++            param.setMakernoteMode(icamera::MAKERNOTE_MODE_JPEG);
++        }
++
++        ret = lStream->processRequest(opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
++                                      request->output_buffers[i], request->frame_number);
++        CheckError(ret != icamera::OK, ret, "Failed to process request, ret:%d", ret);
++    }
++
++    // Convert metadata to Parameters
++    bool forceConvert = inputCam3Buf ? true : false;
++    MetadataConvert::requestMetadataToHALMetadata(mLastSettings, &param, forceConvert);
++
++    mResultProcessor->registerRequest(request, inputCam3Buf);
++
++    if (!inputCam3Buf || opaqueRawInfo.sequence >= 0) {
++        icamera::camera_buffer_t* buffer[kMaxStreamNum] = {nullptr};
++        int numBuffers = 0;
++        for (auto& stream : mCamera3StreamVector) {
++            if (stream->fetchRequestBuffers(&mCameraBufferInfo[index].halBuffer[numBuffers],
++                                            request->frame_number)) {
++                mCameraBufferInfo[index].halBuffer[numBuffers].sequence = opaqueRawInfo.sequence;
++                mCameraBufferInfo[index].halBuffer[numBuffers].timestamp = opaqueRawInfo.timestamp;
++                buffer[numBuffers] = &mCameraBufferInfo[index].halBuffer[numBuffers];
++                numBuffers++;
++            }
++        }
++        ret = icamera::camera_stream_qbuf(mCameraId, buffer, numBuffers, &param);
++        CheckError(ret != icamera::OK, ret, "@%s, camera_stream_qbuf fails,ret:%d", __func__, ret);
++    }
++
++    increaseRequestCount();
++
++    if (!mCameraDeviceStarted) {
++        ret = icamera::camera_device_start(mCameraId);
++        CheckError(ret != icamera::OK, ret, "failed to start device, ret %d", ret);
++
++        mCameraDeviceStarted = true;
++    }
++
++    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
++        Camera3Stream* s = static_cast<Camera3Stream*>(request->output_buffers[i].stream->priv);
++        s->queueBufferDone(request->frame_number,
++                           opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
++                           request->output_buffers[i], param);
++    }
++
++    for (auto& stream : mCamera3StreamVector) {
++        /* incase the HAL stream is not requested by user request, scan all the HAL
++        ** streams check if any one is triggered by listener
++        */
++        stream->checkListenerRequest(request->frame_number);
++    }
++
++    mCameraBufferInfo[index].frameInProcessing = true;
++    mCameraBufferInfo[index].frameNumber = request->frame_number;
++
++    return ret;
++}
++
++void RequestManager::dump(int fd) {
++    LOG1("@%s", __func__);
++}
++
++int RequestManager::flush() {
++    LOG1("@%s", __func__);
++
++    icamera::nsecs_t startTime = icamera::CameraUtils::systemTime();
++    icamera::nsecs_t interval = 0;
++    const icamera::nsecs_t ONE_SECOND = 1000000000;
++
++    // wait 1000ms at most while there are requests in the HAL
++    while (mRequestInProgress > 0 && interval <= ONE_SECOND) {
++        usleep(10000);  // wait 10ms
++        interval = icamera::CameraUtils::systemTime() - startTime;
++    }
++
++    LOG2("@%s, line:%d, mRequestInProgress:%d, time spend:%ld us", __func__, __LINE__,
++         mRequestInProgress, interval / 1000);
++
++    // based on API, -ENODEV (NO_INIT) error should be returned.
++    CheckError(interval > ONE_SECOND, icamera::NO_INIT, "flush() > 1s, timeout:%ld us",
++               interval / 1000);
++
++    return icamera::OK;
++}
++
++void RequestManager::deleteStreams(bool inactiveOnly) {
++    LOG1("@%s", __func__);
++
++    unsigned int i = 0;
++    while (i < mCamera3StreamVector.size()) {
++        Camera3Stream* s = mCamera3StreamVector.at(i);
++
++        if (!inactiveOnly || !s->isActive()) {
++            mCamera3StreamVector.erase(mCamera3StreamVector.begin() + i);
++            delete s;
++        } else {
++            ++i;
++        }
++    }
++}
++
++int RequestManager::waitProcessRequest() {
++    LOG1("@%s", __func__);
++    std::unique_lock<std::mutex> lock(mRequestLock);
++    // check if it is ready to process next request
++    while (mRequestInProgress >= mHALStream[0].max_buffers) {
++        std::cv_status ret = mRequestCondition.wait_for(
++            lock, std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
++        if (ret == std::cv_status::timeout) {
++            LOGW("%s, wait to process request time out", __func__);
++        }
++    }
++
++    return icamera::OK;
++}
++
++void RequestManager::increaseRequestCount() {
++    LOG1("@%s", __func__);
++
++    std::lock_guard<std::mutex> l(mRequestLock);
++    ++mRequestInProgress;
++}
++
++void RequestManager::returnRequestDone(uint32_t frameNumber) {
++    LOG1("@%s  frame %d", __func__, frameNumber);
++
++    std::lock_guard<std::mutex> l(mRequestLock);
++
++    // Update mCameraBufferInfo based on frameNumber
++    for (int i = 0; i < kMaxProcessRequestNum; i++) {
++        if (mCameraBufferInfo[i].frameNumber == frameNumber) {
++            mCameraBufferInfo[i].frameInProcessing = false;
++        }
++    }
++    mRequestInProgress--;
++    mRequestCondition.notify_one();
++
++    for (auto& stream : mCamera3StreamVector) {
++        stream->requestStreamDone(frameNumber);
++    }
++}
++
++int RequestManager::checkStreamRotation(camera3_stream_configuration_t* stream_list) {
++    int rotationDegree0 = -1, countOutputStream = 0;
++
++    for (size_t i = 0; i < stream_list->num_streams; i++) {
++        if (stream_list->streams[i]->stream_type != CAMERA3_STREAM_OUTPUT) {
++            continue;
++        }
++        countOutputStream++;
++
++        int rotationDegree = HalV3Utils::getRotationDegrees(*(stream_list->streams[i]));
++        CheckError(rotationDegree < 0, icamera::BAD_VALUE, "Unsupport rotation degree!");
++
++        if (countOutputStream == 1) {
++            rotationDegree0 = rotationDegree;
++        } else {
++            CheckError(rotationDegree0 != rotationDegree, icamera::BAD_VALUE,
++                       "rotationDegree0:%d, stream[%lu] rotationDegree:%d, not the same",
++                       rotationDegree0, i, rotationDegree);
++        }
++    }
++
++    return icamera::OK;
++}
++
++int RequestManager::chooseHALStreams(const uint32_t requestStreamNum, int* halStreamFlag,
++                                     icamera::stream_t* halStreamList) {
++    int activeHALNum = 0;
++    int avaVideoSlot = icamera::PlatformData::getVideoStreamNum(mCameraId);
++    vector<icamera::stream_t*> videoHALStream;
++    int videoMaxResStreamIndex = -1;
++    int stillHALStreamIndex = -1;
++
++    // HAL stream with configure index
++    std::unordered_map<icamera::stream_t*, int> videoHALStreamIndex;
++    /* save streams with their configure index, the index in this deque is
++    ** their priority to be HWStream, from low to high
++    */
++    std::list<std::pair<icamera::stream_t*, int>> videoHALStreamOrder;
++    // anchor where to insert next potential HAL stream in videoHALStreamOrder
++    auto anchor = videoHALStreamOrder.end();
++    // save sorted hal streams with their configure index
++    std::vector<std::pair<icamera::stream_t*, int>> requestStreams;
++
++    int opaqueCount = 0;
++    int stillCount = 0;
++    int videoCount = 0;
++    for (uint32_t i = 0; i < requestStreamNum; i++) {
++        // set flags to it's index, every stream is a HAL stream by default
++        halStreamFlag[i] = i;
++        if (halStreamList[i].usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
++            opaqueCount++;
++        } else if (halStreamList[i].usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
++            stillCount++;
++        } else {
++            videoCount++;
++        }
++    }
++    // if HAL stream slots are enough, make all streams as HAL stream
++    if (opaqueCount <= 1 && stillCount <= 1 && videoCount <= avaVideoSlot) {
++        return requestStreamNum;
++    }
++
++    for (uint32_t i = 0; i < requestStreamNum; i++) {
++        // clear the flags to invalid value
++        halStreamFlag[i] = -1;
++        requestStreams.push_back(std::make_pair(&halStreamList[i], i));
++    }
++
++    // sort stream by resolution, easy to find largest resolution stream
++    std::sort(requestStreams.begin(), requestStreams.end(),
++              [](std::pair<icamera::stream_t*, int>& s1, std::pair<icamera::stream_t*, int>& s2) {
++                  if (s1.first->width * s1.first->height > s2.first->width * s2.first->height)
++                      return true;
++                  else
++                      return false;
++              });
++
++    for (uint32_t i = 0; i < requestStreamNum; i++) {
++        icamera::stream_t* s = requestStreams[i].first;
++        int index = requestStreams[i].second;
++        if (s->usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
++            // choose hal stream for opaque stream, only 1 opaque stream
++            halStreamFlag[index] = index;
++            activeHALNum++;
++        } else if (s->usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
++            // choose hal stream for still streams, choose the MAX resolution
++            if (stillHALStreamIndex == -1) {
++                stillHALStreamIndex = index;
++                activeHALNum++;
++            }
++        } else {
++            // videoHALStream stores different resolution streams
++            if (videoMaxResStreamIndex == -1) {
++                // choose max resolution video stream
++                anchor = videoHALStreamOrder.insert(anchor, std::make_pair(s, index));
++                videoHALStream.push_back(s);
++            } else {
++                bool found = false;
++                // choose different resolution stream
++                for (auto& vs : videoHALStream) {
++                    if (s->width == vs->width && s->height == vs->height) {
++                        found = true;
++                        break;
++                    }
++                }
++                if (found) {
++                    /* same resolution stream put in the front of list, has low priority
++                    ** to be HALStream
++                    */
++                    videoHALStreamOrder.push_front(std::make_pair(s, index));
++                } else {
++                    /* different resolution stream has higher priority than same ones,
++                     * insert it in front of max resolution stream.
++                     */
++                    anchor = videoHALStreamOrder.insert(anchor, std::make_pair(s, index));
++                    videoHALStream.push_back(s);
++                }
++            }
++        }
++    }
++
++    if (stillHALStreamIndex >= 0) {
++        for (uint32_t i = 0; i < requestStreamNum; i++) {
++            // has only 1 Still HAL stream, other still stream should be listeners
++            if (halStreamList[i].usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
++                halStreamFlag[i] = stillHALStreamIndex;
++            }
++        }
++    }
++
++    // videoHALStream store selected HALStreams
++    videoHALStream.clear();
++    /* scan videoHALStreamOrder from back to front by the priority,
++    ** and put them into Video HAL stream slot
++    */
++    while (avaVideoSlot > 0 && !videoHALStreamOrder.empty()) {
++        auto stream = videoHALStreamOrder.back();
++        videoHALStream.push_back(stream.first);
++        videoHALStreamIndex[stream.first] = stream.second;
++        halStreamFlag[stream.second] = stream.second;
++        activeHALNum++;
++        avaVideoSlot--;
++        videoHALStreamOrder.pop_back();
++    }
++
++    // scan other streams not been put into HAL slot, bind to the HAL stream
++    while (!videoHALStreamOrder.empty()) {
++        auto stream = videoHALStreamOrder.back();
++        videoHALStreamOrder.pop_back();
++        int index = stream.second;
++        icamera::stream_t* s = stream.first;
++        // search same resolution in video HAL streams
++        int slot;
++        for (slot = 0; slot < videoHALStream.size(); slot++) {
++            if (s->width == videoHALStream.at(slot)->width &&
++                s->height == videoHALStream.at(slot)->height)
++                break;
++        }
++        if (slot != videoHALStream.size()) {
++            // bind to same resolution slot
++            halStreamFlag[index] = videoHALStreamIndex[videoHALStream.at(slot)];
++        } else {
++            // bind to max resolution slot
++            halStreamFlag[index] = videoHALStreamIndex[videoHALStream.at(0)];
++        }
++    }
++    LOG1("has %d HAL Streams", activeHALNum);
++    for (int i = 0; i < requestStreamNum; i++)
++        LOG1("user Stream %d bind to HAL Stream %d", i, halStreamFlag[i]);
++
++    return activeHALNum;
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/RequestManager.h b/camera/hal/intel/ipu6/aal/RequestManager.h
+new file mode 100644
+index 000000000000..c4a169b0cfe1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/RequestManager.h
+@@ -0,0 +1,115 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++
++#include <mutex>
++#include <vector>
++
++#include "Camera3Stream.h"
++#include "HALv3Header.h"
++#include "HALv3Interface.h"
++#include "PlatformData.h"
++#include "ResultProcessor.h"
++
++namespace camera3 {
++
++struct Camera3Request {
++    uint32_t frameNumber;
++    android::CameraMetadata settings;
++};
++
++/**
++ * \class RequestManager
++ *
++ * This class is used to handle requests. It has the following
++ * roles:
++ * - It instantiates ResultProcessor.
++ */
++class RequestManager : public RequestManagerCallback, public icamera::camera_callback_ops_t {
++ public:
++    RequestManager(int cameraId);
++    virtual ~RequestManager();
++
++    int init(const camera3_callback_ops_t* callback_ops);
++
++    int deinit();
++
++    int configureStreams(camera3_stream_configuration_t* stream_list);
++
++    int constructDefaultRequestSettings(int type, const camera_metadata_t** meta);
++
++    int processCaptureRequest(camera3_capture_request_t* request);
++
++    void dump(int fd);
++
++    int flush();
++
++    void returnRequestDone(uint32_t frameNumber);
++
++ private:
++    void deleteStreams(bool inactiveOnly);
++    void increaseRequestCount();
++    int waitProcessRequest();
++    void chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t** streams,
++                                      int* enableFDStreamNum);
++    int checkStreamRotation(camera3_stream_configuration_t* stream_list);
++
++    static void callbackNotify(const icamera::camera_callback_ops* cb,
++                               const icamera::camera_msg_data_t& data);
++    void handleCallbackEvent(const icamera::camera_msg_data_t& data);
++
++ private:
++    static const int kMaxStreamNum = 5;        // OPAQUE RAW, PREVIEW, VIDEO, STILL and POSTVIEW
++    const uint64_t kMaxDuration = 2000000000;  // 2000ms
++
++    static const int kMaxProcessRequestNum = 10;
++    struct CameraBufferInfo {
++        icamera::camera_buffer_t halBuffer[kMaxStreamNum];
++        uint32_t frameNumber;
++        bool frameInProcessing;
++    };
++    struct CameraBufferInfo mCameraBufferInfo[kMaxProcessRequestNum];
++
++    int mCameraId;
++    const camera3_callback_ops_t* mCallbackOps;
++    bool mCameraDeviceStarted;
++    ResultProcessor* mResultProcessor;
++
++    std::map<int, android::CameraMetadata> mDefaultRequestSettings;
++    std::vector<Camera3Stream*> mCamera3StreamVector;
++    bool mInputStreamConfigured;
++
++    std::condition_variable mRequestCondition;
++    // mRequestLock is used to protect mRequestInProgress
++    std::mutex mRequestLock;
++    uint32_t mRequestInProgress;
++    android::CameraMetadata mLastSettings;
++    icamera::stream_t mHALStream[kMaxStreamNum];
++
++    /* choose HAL stream to do qbuf/dqbuf from stream list.
++     * halStreamFlag: array keeps the result.
++     * halStreamFlag[i] = n means the halStreams[i] is the Listener of
++     * halStreams[n], if i==n, then the stream is HAL stream.
++     * return value is the total Number of HAL streams
++     */
++    int chooseHALStreams(const uint32_t requestStreamNum, int* halStreamFlag,
++                         icamera::stream_t* halStreams);
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.cpp b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
+new file mode 100644
+index 000000000000..26d70812ef53
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
+@@ -0,0 +1,512 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ResultProcessor"
++
++#include "ResultProcessor.h"
++
++#include <mutex>
++
++#include "Errors.h"
++#include "HALv3Utils.h"
++#include "MetadataConvert.h"
++#include "PlatformData.h"
++#include "Utils.h"
++
++namespace camera3 {
++
++#define META_ENTRY_COUNT 256
++#define META_DATA_COUNT 80000
++#define FPS_FRAME_COUNT 60  // the frame interval to print fps
++
++MetadataMemory::MetadataMemory() : mMeta(META_ENTRY_COUNT, META_DATA_COUNT), mMemory(nullptr) {}
++
++MetadataMemory::~MetadataMemory() {
++    // Return memory to metadata
++    getMetadata();
++}
++
++android::CameraMetadata* MetadataMemory::getMetadata() {
++    if (mMemory) {
++        mMeta.acquire(mMemory);
++        mMemory = nullptr;
++    }
++    return &mMeta;
++}
++
++camera_metadata_t* MetadataMemory::getMemory() {
++    if (!mMemory) {
++        mMemory = mMeta.release();
++    }
++    return mMemory;
++}
++
++void MetadataMemory::copyMetadata(const camera_metadata_t* src) {
++    getMemory();
++    // Clear old metadata
++    mMemory = place_camera_metadata(mMemory, get_camera_metadata_size(mMemory),
++                                    get_camera_metadata_entry_capacity(mMemory),
++                                    get_camera_metadata_data_capacity(mMemory));
++    getMetadata();
++    mMeta.append(src);
++}
++
++ResultProcessor::ResultProcessor(int cameraId, const camera3_callback_ops_t* callback,
++                                 RequestManagerCallback* requestManagerCallback)
++        : mCameraId(cameraId),
++          mCallbackOps(callback),
++          mLastSettings(nullptr),
++          mRequestManagerCallback(requestManagerCallback) {
++    UNUSED(mCameraId);
++    LOG1("@%s, mCameraId %d", __func__, mCameraId);
++
++    mLastSettings = acquireMetadataMemory();
++
++    mResultThread = std::unique_ptr<ResultThread>(new ResultThread(cameraId, this));
++
++    mCamera3AMetadata = new Camera3AMetadata(mCameraId);
++    gettimeofday(&mRequestTime, nullptr);
++
++    mLastParams.sensorExposure = -1;
++    mLastParams.sensorIso = -1;
++}
++
++ResultProcessor::~ResultProcessor() {
++    LOG1("@%s", __func__);
++
++    for (auto& item : mRequestStateVector) {
++        releaseMetadataMemory(item.metaResult);
++    }
++    mRequestStateVector.clear();
++
++    releaseMetadataMemory(mLastSettings);
++    while (mMetadataVector.size() > 0) {
++        LOG1("%s: release meta %p", __func__, mMetadataVector.back());
++        delete mMetadataVector.back();
++        mMetadataVector.pop_back();
++    }
++
++    delete mCamera3AMetadata;
++
++    mInputCam3Bufs.clear();
++}
++
++void ResultProcessor::callbackNotify(const icamera::camera_msg_data_t& data) {
++    LOG2("@%s, type %d", __func__, data.type);
++
++    mResultThread->sendEvent(data);
++}
++
++int ResultProcessor::registerRequest(const camera3_capture_request_t* request,
++                                     std::shared_ptr<Camera3Buffer> inputCam3Buf) {
++    LOG1("@%s frame_number:%u, inputCam3Buf:%p", __func__, request->frame_number,
++         inputCam3Buf.get());
++
++    RequestState req;
++    req.frameNumber = request->frame_number;
++    req.buffersToReturn = request->num_output_buffers;
++    req.partialResultCount = 1;
++
++    std::lock_guard<std::mutex> l(mLock);
++    // Copy settings
++    if (request->settings) {
++        mLastSettings->copyMetadata(request->settings);
++    }
++
++    req.metaResult = acquireMetadataMemory();
++    req.metaResult->copyMetadata(mLastSettings->getMemory());
++
++    if (inputCam3Buf) {
++        mInputCam3Bufs[req.frameNumber] = inputCam3Buf;
++    }
++    mRequestStateVector.push_back(req);
++
++    return icamera::OK;
++}
++
++int ResultProcessor::shutterDone(const ShutterEvent& event) {
++    std::lock_guard<std::mutex> l(mLock);
++    bool inputBuffer = mInputCam3Bufs.find(event.frameNumber) != mInputCam3Bufs.end();
++    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
++        if (mRequestStateVector.at(i).frameNumber != event.frameNumber ||
++            mRequestStateVector.at(i).isShutterDone) {
++            continue;
++        }
++
++        camera3_notify_msg_t notifyMsg;
++        notifyMsg.type = CAMERA3_MSG_SHUTTER;
++        notifyMsg.message.shutter.frame_number = mRequestStateVector.at(i).frameNumber;
++        notifyMsg.message.shutter.timestamp = event.timestamp;
++
++        MetadataMemory* metaResult = mRequestStateVector[i].metaResult;
++        android::CameraMetadata* meta = metaResult->getMetadata();
++        if (!inputBuffer) {
++            meta->update(ANDROID_SENSOR_TIMESTAMP,
++                         reinterpret_cast<const int64_t*>(&event.timestamp), 1);
++        } else {
++            // update shutter timestamp if there is input stream
++            camera_metadata_entry entry = meta->find(ANDROID_SENSOR_TIMESTAMP);
++            if (entry.count == 1) {
++                notifyMsg.message.shutter.timestamp = entry.data.i64[0];
++            }
++        }
++
++        mCallbackOps->notify(mCallbackOps, &notifyMsg);
++        mRequestStateVector.at(i).isShutterDone = true;
++        LOG2("@%s, frame_number:%u, shutter timestamp:%lld", __func__,
++             notifyMsg.message.shutter.frame_number, notifyMsg.message.shutter.timestamp);
++        if (checkRequestDone(mRequestStateVector.at(i))) {
++            returnRequestDone(notifyMsg.message.shutter.frame_number);
++            releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
++            mRequestStateVector.erase(mRequestStateVector.begin() + i);
++        }
++        return icamera::OK;
++    }
++
++    LOGW("@%s frame_number:%u wasn't found!", __func__, event.frameNumber);
++    return icamera::OK;
++}
++
++int ResultProcessor::metadataDone(const MetadataEvent& event) {
++    MetadataMemory* metaMem = nullptr;
++    {
++        std::lock_guard<std::mutex> l(mLock);
++        for (auto& reqStat : mRequestStateVector) {
++            if (reqStat.frameNumber == event.frameNumber &&
++                reqStat.partialResultReturned < reqStat.partialResultCount) {
++                reqStat.partialResultReturned = 1;
++                metaMem = reqStat.metaResult;
++            }
++        }
++    }
++
++    if (metaMem) {
++        camera3_capture_result_t result;
++        CLEAR(result);
++        result.frame_number = event.frameNumber;
++        result.output_buffers = nullptr;
++        result.num_output_buffers = 0;
++
++        if (mInputCam3Bufs.find(result.frame_number) == mInputCam3Bufs.end()) {
++            android::CameraMetadata* metaResult = metaMem->getMetadata();
++            MetadataConvert::HALMetadataToRequestMetadata(*(event.parameter), metaResult,
++                                                          mCameraId);
++            updateMetadata(*(event.parameter), metaResult);
++            mCamera3AMetadata->process3Astate(*(event.parameter), metaResult);
++        }
++
++        result.result = metaMem->getMemory();
++        result.partial_result = 1;
++        mCallbackOps->process_capture_result(mCallbackOps, &result);
++
++        LOG2("@%s frame_number:%u, metadataDone", __func__, event.frameNumber);
++    }
++
++    bool found = false;
++    std::lock_guard<std::mutex> l(mLock);
++    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
++        if (mRequestStateVector.at(i).frameNumber == event.frameNumber) {
++            if (checkRequestDone(mRequestStateVector.at(i))) {
++                returnInputBuffer(event.frameNumber);
++                returnRequestDone(event.frameNumber);
++                releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
++                mRequestStateVector.erase(mRequestStateVector.begin() + i);
++            }
++            found = true;
++        }
++    }
++    if (!found) {
++        LOGW("%s, event.frameNumber %u wasn't found!", __func__, event.frameNumber);
++    } else {
++        LOG2("%s, event.frameNumber %u was returned", __func__, event.frameNumber);
++    }
++
++    return icamera::OK;
++}
++
++int ResultProcessor::bufferDone(const BufferEvent& event) {
++    camera3_capture_result_t result;
++    CLEAR(result);
++
++    result.frame_number = event.frameNumber;
++    result.output_buffers = event.outputBuffer;
++    result.num_output_buffers = 1;
++    result.result = nullptr;
++    result.partial_result = 0;
++
++    mCallbackOps->process_capture_result(mCallbackOps, &result);
++
++    bool found = false;
++    {
++        std::lock_guard<std::mutex> l(mLock);
++        for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
++            if (mRequestStateVector.at(i).frameNumber == event.frameNumber) {
++                mRequestStateVector.at(i).buffersReturned++;
++                if (checkRequestDone(mRequestStateVector.at(i))) {
++                    returnInputBuffer(event.frameNumber);
++                    returnRequestDone(event.frameNumber);
++                    releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
++                    mRequestStateVector.erase(mRequestStateVector.begin() + i);
++                }
++                found = true;
++            }
++        }
++    }
++    if (!found) {
++        LOGW("%s, event.frameNumber %u wasn't found!", __func__, event.frameNumber);
++    } else {
++        LOG2("%s, event.frameNumber %u was returned", __func__, event.frameNumber);
++    }
++
++    if (event.timestamp != 0 && event.sequence != -1) {
++        std::lock_guard<std::mutex> lock(mmOpaqueRawInfoMapLock);
++        // Raw buffer cached in HAL
++        int savedRawBufNum = icamera::PlatformData::getMaxRawDataNum(mCameraId) -
++                             icamera::PlatformData::getMaxRequestsInflight(mCameraId);
++        // There are buffers processed in PSYS which may return to sensor, so the
++        // last max in fight buffers are not safe now.
++        int securityRawBufNum =
++            savedRawBufNum - icamera::PlatformData::getMaxRequestsInflight(mCameraId);
++        if (mOpaqueRawInfoMap.size() >= securityRawBufNum)
++            mOpaqueRawInfoMap.erase(mOpaqueRawInfoMap.begin());
++        // Only save Raw buffer info matching with saved Raw bufer Queue in PSYS
++        mOpaqueRawInfoMap[event.sequence] = event.timestamp;
++    }
++    return icamera::OK;
++}
++
++void ResultProcessor::clearRawBufferInfoMap() {
++    std::lock_guard<std::mutex> lock(mmOpaqueRawInfoMapLock);
++    mOpaqueRawInfoMap.clear();
++}
++
++void ResultProcessor::checkAndChangeRawbufferInfo(long* sequence, uint64_t* timestamp) {
++    CheckError(!sequence || !timestamp, VOID_VALUE, "invilid input parameter!");
++
++    std::lock_guard<std::mutex> lock(mmOpaqueRawInfoMapLock);
++    if (mOpaqueRawInfoMap.empty()) return;
++    if (mOpaqueRawInfoMap.find(*sequence) != mOpaqueRawInfoMap.end()) return;
++
++    // Raw buffer is too old and can't be handled, just use oldest buffer
++    auto it = mOpaqueRawInfoMap.cbegin();
++    *sequence = (*it).first;
++    *timestamp = (*it).second;
++    LOG2("%s, update raw info sequence %ld, timestamp %ld", __func__, *sequence, *timestamp);
++}
++
++void ResultProcessor::updateMetadata(const icamera::Parameters& parameter,
++                                     android::CameraMetadata* settings) {
++    /*
++     *  if we support face ae and the face detection mode is not off,
++     *  set face detect to request metadata, then the face area will be drawn.
++     */
++    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
++        uint8_t faceDetectMode;
++        int ret = parameter.getFaceDetectMode(faceDetectMode);
++        if (ret == icamera::OK && faceDetectMode != icamera::FD_MODE_OFF) {
++            icamera::CVFaceDetectionAbstractResult faceResult;
++            ret = icamera::FaceDetection::getResult(mCameraId, &faceResult);
++            if (ret == icamera::OK) {
++                MetadataConvert::convertFaceDetectionMetadata(faceResult, settings);
++                LOG2("@%s, set face detection metadata, face number:%d", __func__,
++                     faceResult.faceNum);
++            }
++        }
++    }
++
++    int64_t exposure = 0;
++    int32_t sensorIso = 0;
++    parameter.getExposureTime(exposure);
++    parameter.getSensitivityIso(sensorIso);
++
++    // If the state of black level lock is ON in the first request, the value must
++    // be set ON. Other request sets the black level lock value according sensor
++    // exposure time and iso.
++    uint8_t lockMode = ANDROID_BLACK_LEVEL_LOCK_OFF;
++    camera_metadata_entry entry = settings->find(ANDROID_BLACK_LEVEL_LOCK);
++    if (entry.count == 1 && (entry.data.u8[0] == ANDROID_BLACK_LEVEL_LOCK_ON)) {
++        lockMode =
++            ((exposure == mLastParams.sensorExposure && sensorIso == mLastParams.sensorIso) ||
++             (-1 == mLastParams.sensorExposure && -1 == mLastParams.sensorIso))
++                ? ANDROID_BLACK_LEVEL_LOCK_ON
++                : ANDROID_BLACK_LEVEL_LOCK_OFF;
++    }
++    LOG2("@%s, the black level lock metadata: %d", __func__, lockMode);
++    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lockMode, 1);
++
++    mLastParams.sensorExposure = exposure;
++    mLastParams.sensorIso = sensorIso;
++}
++
++// the input buffer must be returned as the last one buffer
++void ResultProcessor::returnInputBuffer(uint32_t frameNumber) {
++    if (mInputCam3Bufs.find(frameNumber) == mInputCam3Bufs.end()) {
++        return;
++    }
++
++    std::shared_ptr<Camera3Buffer> inBuf = mInputCam3Bufs[frameNumber];
++    if (!inBuf) {
++        return;
++    }
++
++    camera3_stream_t* s = inBuf->getStream();
++    if (s) {
++        LOG2("@%s, frame_number:%u, w:%d, h:%d, f:%d", __func__, frameNumber, s->width, s->height,
++             s->format);
++    }
++
++    camera3_stream_buffer_t buf = {};
++    buf.stream = s;
++    buf.buffer = inBuf->getBufferHandle();
++    buf.status = inBuf->status();
++
++    inBuf->getFence(&buf);
++    inBuf->unlock();
++    inBuf->deinit();
++
++    camera3_capture_result_t result = {};
++    result.frame_number = frameNumber;
++    result.result = nullptr;
++    result.input_buffer = &buf;
++
++    LOG1("@%s, frame_number:%u, return the input buffer", __func__, frameNumber);
++    mCallbackOps->process_capture_result(mCallbackOps, &result);
++
++    mInputCam3Bufs.erase(frameNumber);
++}
++
++bool ResultProcessor::checkRequestDone(const RequestState& requestState) {
++    LOG1("@%s", __func__);
++
++    return (requestState.isShutterDone &&
++            requestState.partialResultCount == requestState.partialResultReturned &&
++            requestState.buffersToReturn == requestState.buffersReturned);
++}
++
++void ResultProcessor::returnRequestDone(uint32_t frameNumber) {
++    LOG2("@%s frame_number:%d", __func__, frameNumber);
++    TRACE_LOG_POINT("ResultProcessor", __func__, MAKE_COLOR(frameNumber), frameNumber);
++
++    if ((frameNumber % FPS_FRAME_COUNT == 0) &&
++        icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_FPS)) {
++        struct timeval curTime;
++        gettimeofday(&curTime, nullptr);
++        int duration = static_cast<int>(curTime.tv_usec - mRequestTime.tv_usec +
++                                        ((curTime.tv_sec - mRequestTime.tv_sec) * 1000000));
++        if (frameNumber == 0) {
++            LOGFPS("%s, time of launch to preview: %dms", __func__, (duration / 1000));
++        } else {
++            float curFps =
++                static_cast<float>(1000000) / static_cast<float>(duration / FPS_FRAME_COUNT);
++            LOGFPS("@%s, fps: %02f", __func__, curFps);
++        }
++        gettimeofday(&mRequestTime, nullptr);
++    }
++
++    mRequestManagerCallback->returnRequestDone(frameNumber);
++}
++
++MetadataMemory* ResultProcessor::acquireMetadataMemory() {
++    MetadataMemory* metaMem = nullptr;
++    if (mMetadataVector.size() > 0) {
++        metaMem = mMetadataVector.back();
++        mMetadataVector.pop_back();
++    } else {
++        metaMem = new MetadataMemory();
++        LOG1("%s: allocate new one: %p", __func__, metaMem);
++    }
++
++    return metaMem;
++}
++
++void ResultProcessor::releaseMetadataMemory(MetadataMemory* metaMem) {
++    CheckError(metaMem == nullptr, VOID_VALUE, "%s: null metaMem!", __func__);
++    mMetadataVector.push_back(metaMem);
++}
++
++ResultProcessor::ResultThread::ResultThread(int cameraId, ResultProcessor* resultProcessor)
++        : mCameraId(cameraId),
++          mResultProcessor(resultProcessor) {
++    LOG1("@%s", __func__);
++
++    run("ResultThread");
++}
++
++ResultProcessor::ResultThread::~ResultThread() {
++    LOG1("@%s", __func__);
++
++    requestExit();
++    std::lock_guard<std::mutex> l(mEventQueueLock);
++    mEventCondition.notify_one();
++}
++
++void ResultProcessor::ResultThread::sendEvent(const icamera::camera_msg_data_t& data) {
++    LOG2("@%s", __func__);
++    std::lock_guard<std::mutex> l(mEventQueueLock);
++    mEventQueue.push(data);
++    mEventCondition.notify_one();
++}
++
++bool ResultProcessor::ResultThread::threadLoop() {
++    LOG2("@%s", __func__);
++
++    icamera::camera_msg_data_t data;
++    // mutex only protects mEventQueue
++    {
++        std::unique_lock<std::mutex> l(mEventQueueLock);
++        // check if there is event queued
++        if (mEventQueue.empty()) {
++            std::cv_status ret = mEventCondition.wait_for(
++                l, std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
++
++            if (ret == std::cv_status::timeout) {
++                LOGW("%s, wait event timeout", __func__);
++            }
++
++            return true;
++        }
++
++        // parse event
++        data = std::move(mEventQueue.front());
++        mEventQueue.pop();
++    }
++
++    // handle message
++    switch (data.type) {
++        // Regards isp buffer ready as shutter event
++        case icamera::CAMERA_ISP_BUF_READY: {
++            ShutterEvent event = {data.data.buffer_ready.frameNumber,
++                                  data.data.buffer_ready.timestamp};
++            LOG2("@%s, frameNumber %d, timestamp %ld, mResultProcessor:%p", __func__,
++                 event.frameNumber, event.timestamp, mResultProcessor);
++            mResultProcessor->shutterDone(event);
++
++            icamera::Parameters parameter;
++            icamera::camera_get_parameters(mCameraId, parameter, data.data.buffer_ready.sequence);
++            MetadataEvent metadataEvent = {data.data.buffer_ready.frameNumber, &parameter};
++            mResultProcessor->metadataDone(metadataEvent);
++            break;
++        }
++        default: {
++            LOGW("unknown message type %d", data.type);
++            break;
++        }
++    }
++
++    return true;
++}
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.h b/camera/hal/intel/ipu6/aal/ResultProcessor.h
+new file mode 100644
+index 000000000000..9d81a132bcf1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/ResultProcessor.h
+@@ -0,0 +1,196 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <hardware/camera3.h>
++#include <sys/time.h>
++
++#include <map>
++#include <mutex>
++#include <queue>
++#include <unordered_map>
++#include <vector>
++
++#include "Camera3AMetadata.h"
++#include "Camera3Buffer.h"
++#include "HALv3Header.h"
++#include "HALv3Interface.h"
++#include "Parameters.h"
++#include "Thread.h"
++
++namespace camera3 {
++
++// Store metadata that are created by the AAL
++// To avoid continuous allocation/de-allocation of metadata buffers
++class MetadataMemory {
++ public:
++    MetadataMemory();
++    ~MetadataMemory();
++
++    // Don't access to metadata and memory in parellel
++    // because metadata may reallocate memory when new entries are added.
++    android::CameraMetadata* getMetadata();  // For entries update
++    camera_metadata_t* getMemory();          // For metadata copy
++
++    // Helper function to avoid memory reallocation
++    void copyMetadata(const camera_metadata_t* src);
++
++ private:
++    android::CameraMetadata mMeta;  // May reallocate buffer if entries are added
++    camera_metadata_t* mMemory;
++};
++
++struct RequestState {
++    uint32_t frameNumber;
++
++    bool isShutterDone;
++
++    unsigned int partialResultReturned;
++    unsigned int partialResultCount;
++
++    unsigned int buffersReturned;
++    unsigned int buffersToReturn;
++
++    MetadataMemory* metaResult;
++
++    RequestState() {
++        frameNumber = 0;
++        isShutterDone = false;
++        partialResultReturned = 0;
++        partialResultCount = 0;
++        buffersReturned = 0;
++        buffersToReturn = 0;
++        metaResult = nullptr;
++    }
++};
++
++struct MetadataEvent {
++    uint32_t frameNumber;
++    const icamera::Parameters* parameter;
++};
++
++struct ShutterEvent {
++    uint32_t frameNumber;
++    uint64_t timestamp;
++};
++
++struct BufferEvent {
++    uint32_t frameNumber;
++    const camera3_stream_buffer_t* outputBuffer;
++    uint64_t timestamp;
++    long sequence;
++};
++
++struct ReferenceParam {
++    int64_t sensorExposure;
++    int32_t sensorIso;
++};
++
++/**
++ * \brief An interface used to callback buffer event.
++ */
++class CallbackEventInterface {
++ public:
++    CallbackEventInterface() {}
++    virtual ~CallbackEventInterface() {}
++
++    virtual int metadataDone(const MetadataEvent& event) = 0;
++    virtual int bufferDone(const BufferEvent& event) = 0;
++    virtual int shutterDone(const ShutterEvent& event) = 0;
++};
++
++/**
++ * \class ResultProcessor
++ *
++ * This class is used to handle shutter done, buffer done and metadata done
++ * event.
++ *
++ */
++class ResultProcessor : public CallbackEventInterface {
++ public:
++    ResultProcessor(int cameraId, const camera3_callback_ops_t* callback,
++                    RequestManagerCallback* requestManagerCallback);
++    virtual ~ResultProcessor();
++
++    int registerRequest(const camera3_capture_request_t* request,
++                        std::shared_ptr<Camera3Buffer> inputCam3Buf);
++
++    virtual int metadataDone(const MetadataEvent& event);
++    virtual int shutterDone(const ShutterEvent& event);
++    virtual int bufferDone(const BufferEvent& event);
++
++    void callbackNotify(const icamera::camera_msg_data_t& data);
++
++    // Used to handle Opaque raw reprocessing
++    void clearRawBufferInfoMap(void);
++    void checkAndChangeRawbufferInfo(long* sequence, uint64_t* timestamp);
++
++ private:
++    bool checkRequestDone(const RequestState& requestState);
++    void returnRequestDone(uint32_t frameNumber);
++
++    MetadataMemory* acquireMetadataMemory();
++    void releaseMetadataMemory(MetadataMemory* metaMem);
++
++    void returnInputBuffer(uint32_t frameNumber);
++    void updateMetadata(const icamera::Parameters& parameter, android::CameraMetadata* settings);
++
++ private:
++    class ResultThread : public icamera::Thread {
++     public:
++        ResultThread(int cameraId, ResultProcessor* resultProcessor);
++        ~ResultThread();
++
++        void sendEvent(const icamera::camera_msg_data_t& data);
++
++     private:
++        virtual bool threadLoop();
++
++     private:
++        const uint64_t kMaxDuration = 2000000000;  // 2000ms
++        int mCameraId;
++        ResultProcessor* mResultProcessor;
++
++        std::condition_variable mEventCondition;
++        std::mutex mEventQueueLock;
++        std::queue<icamera::camera_msg_data_t> mEventQueue;
++    };
++    std::unique_ptr<ResultThread> mResultThread;
++
++    int mCameraId;
++    const camera3_callback_ops_t* mCallbackOps;
++
++    // mLock is used to protect mRequestStateVector
++    std::mutex mLock;
++    std::vector<RequestState> mRequestStateVector;
++    std::vector<MetadataMemory*> mMetadataVector;
++    MetadataMemory* mLastSettings;
++
++    RequestManagerCallback* mRequestManagerCallback;
++
++    Camera3AMetadata* mCamera3AMetadata;
++
++    std::unordered_map<int, std::shared_ptr<Camera3Buffer>> mInputCam3Bufs;
++    timeval mRequestTime;
++    ReferenceParam mLastParams;
++
++    // first key is sequence from HAL, second key is timestamp of RAW buffer
++    std::map<int64_t, uint64_t> mOpaqueRawInfoMap;
++    std::mutex mmOpaqueRawInfoMapLock;  // used to protect mOpaqueRawInfoMap
++};
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
+new file mode 100644
+index 000000000000..3fc2deff906b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
+@@ -0,0 +1,20 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++// metadata related header file
++#include <camera/camera_metadata.h>
+diff --git a/camera/hal/intel/ipu6/include/api/ICamera.h b/camera/hal/intel/ipu6/include/api/ICamera.h
+new file mode 100644
+index 000000000000..6e75e1b0311a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/api/ICamera.h
+@@ -0,0 +1,578 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*
++ *
++ * Filename: ICamera.h
++ *
++ * ------------------------------------------------------------------------------
++ * REVISION HISTORY
++ *******************************************************************************
++ *     Version        0.10       Initialize camera HAL API
++ *******************************************************************************
++ *     Version        0.20       Update for the device handle and stream handle
++ *                               Update for the coding style of the type
++ *******************************************************************************
++ *     Version        0.21       Remove API camera_device_set_param and camera_device_get_param
++ *                               Remove type define camera_stream_t
++ *******************************************************************************
++ *     Version        0.30       Remove API camera_device_del_stream
++ *                               Rename API camera_device_add_stream -> camera_device_config_streams
++ *                                   * All the streams are added at the same time
++ *                               Rename camera_device_init -> camera_hal_init
++ *                               Rename camera_device_deinit -> camera_hal_deinit
++ *                               Remove the typedef for struct camera_buffer
++ *******************************************************************************
++ *     Version        0.31       Remove duplicated camera_frame_info_t
++ *                               Cleanup the camera_buffer_t structure
++ *******************************************************************************
++ *     Version        0.40       Delete redundant query_frame_info
++ *                               Add assist API: get_frame_size
++ *******************************************************************************
++ *     Version        0.41       Add API camera_device_allocate_memory to enable mmap memory mode
++ *******************************************************************************
++ *     Version        0.42       Merge all the common types to Parameters.h
++ *******************************************************************************
++  *    Version        0.43       Add sensor description in camera_info_t
++ *******************************************************************************
++ *     Version        0.44       Change output parameter of get_frame_size
++ *******************************************************************************
++ *     Version        0.45       Add two parameters(number of buffers, parameters) for camera_stream_qbuf
++                                 Add one parameter(parameters) for camera_stream_dqbuf
++*******************************************************************************
++ *     Version        0.46       Add virtual channel camera number for camera_device_open
++                                 Add virtual channel information in camera_info_t
++ *******************************************************************************
++ *     Version        0.50       Support specifying input format (aka ISYS output format).
++ *******************************************************************************
++ *     Version        0.51       Support specifying inputConfig inlucding inputformat/resolution
++                                 Params int inputFmt changed to stream_t *inputConfig
++ *******************************************************************************
++ *     Version        0.60       Overload interface camera_stream_qbuf() with refined parameters
++                                 old camera_stream_qbuf() will be removed soon
++ *******************************************************************************
++ *     Version        0.61       Add API camera_callback_register() to notify event to AAL
++ *******************************************************************************
++ *     Version        0.62       Add sequence in camera_get_parameters to fetch settings
++ * ------------------------------------------------------------------------------
++ *
++ */
++
++#pragma once
++
++#include "Parameters.h"
++
++#include <stdlib.h> // For including definition of NULL
++
++namespace icamera {
++
++/**
++ * \struct camera_info_t: Define each camera basic information
++ */
++typedef struct {
++    int facing;
++    int orientation;
++    int device_version;
++    const char* name; /**< Sensor name */
++    const char* description; /**< Sensor description */
++    const Parameters *capability; /**< camera capability */
++} camera_info_t;
++
++/**
++ * \brief
++ *   Get numbers of camera
++ *
++ * \note
++ *   This allows user to get the numbers of camera without init or open camera device.
++ *
++ * \return
++ *   >0 the numbers of camera
++ * \return
++ *   <= 0 failed to get camera numbers
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int num = get_number_of_cameras();
++ * \endcode
++ **/
++int get_number_of_cameras();
++
++/**
++ * \brief
++ *   Get camera info including camera capability.
++ *
++ * \note
++ *   It can be called before hal init
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[out]
++ *   camera_info_t info: Camera info filled by libcamhal
++ *
++ * \return
++ *   0 succeed to get camera info
++ * \return
++ *   <0 error code, failed to get camera info
++ *
++ * \par Sample code
++ *
++ * \code
++ *   int camera_id = 0;
++ *   camera_info_t info;
++ *   get_camera_info(camera_id, info);
++ *
++ * \endcode
++ *
++ **/
++int get_camera_info(int camera_id, camera_info_t& info);
++
++/**
++ * \brief
++ *   Initialize camera HAL
++ *
++ * \return
++ *   0 succeed to init camera HAL
++ * \return
++ *   <0 error code, failed to init camera HAL
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int ret = camera_hal_init();
++ * \endcode
++ **/
++int camera_hal_init();
++
++/**
++ * \brief
++ *   De-initialize camera HAL
++ *
++ * \return
++ *   0 succeed to deinit camera HAL
++ * \return
++ *   <0 error code, failed to deinit camera device
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int ret = camera_hal_deinit();
++ * \endcode
++ **/
++int camera_hal_deinit();
++
++/**
++ * \brief
++ *   Register callback function
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   camera_callback_ops_t *callback: callback handle
++ *
++ **/
++void camera_callback_register(int camera_id, const camera_callback_ops_t *callback);
++
++/**
++ * \brief
++ *   Open camera device by camera ID
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ *
++ * \return
++ *   0 succeed to open camera device
++ * \return
++ *   <0 error code, failed to open camera device
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int camera_id = 0;
++ *   int ret = camera_device_open(camera_id);
++ * \endcode
++ **/
++int camera_device_open(int camera_id);
++
++/**
++ * \brief
++ *   Close camera device by camera ID
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int camera_id = 0;
++ *   int ret = camera_device_open(camera_id);
++ *   camera_device_close(camera_id);
++ * \endcode
++ **/
++void camera_device_close(int camera_id);
++
++/**
++ * \brief
++ *   Configure sensor input of camera device, it is not allowed to call this when camera is started.
++ *   Optional call.
++ *
++ * \note
++ *   1. To re-configure sensor input, camera device must be stopped first.
++ *   2. The new sensor configuration will overwrite the previous config.
++ *   3. The new "inputConfig" will be used for all the future operation until the device is closed.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   int inputConfig: Specify which input format, resolution(the output of ISYS) should be used.
++ *
++ * \return
++ *   0 succeed to configure streams
++ * \return
++ *   <0 error code, failed to configure stream
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int camera_id = 0;
++ *   stream_t input_config;
++ *   CLEAR(input_config);
++ *   input_config.format = V4L2_PIX_FMT_SGRBG8V32;
++ *   ret = camera_device_config_sensor_input(camera_id, &input_config);
++ * \endcode
++ **/
++int camera_device_config_sensor_input(int camera_id, const stream_t *inputConfig);
++
++/**
++ * \brief
++ *   Configure streams to camera device, it is not allowed to call this when camera is started.
++ *
++ * \note
++ *   1. To re-configure streams, camera device must be stopped first.
++ *   2. The new streams configuration will overwrite the previous streams.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   stream_config_t stream_list: stream configuration list, if success, stream id is filled in streams[]
++ *
++ * \return
++ *   0 succeed to configure streams
++ * \return
++ *   <0 error code, failed to configure stream
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int camera_id = 0;
++ *   stream_config_t stream_list;
++ *   stream_t streams[1];
++ *   streams[0].format = V4L2_PIX_FMT_SGRBG8;
++ *   streams[0].width = 1920;
++ *   streams[0].height = 1080;
++ *   streams[0].memType = V4L2_MEMORY_USERPTR;
++ *   stream_list.num_streams = 1;
++ *   stream_list.streams = streams;
++ *   ret = camera_device_config_streams(camera_id, &stream_list);
++ * \endcode
++ **/
++int camera_device_config_streams(int camera_id, stream_config_t *stream_list);
++
++/**
++ * \brief
++ *   Start camera device
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ *
++ * \return
++ *   0 succeed to start device
++ * \return
++ *   <0 error code, failed to start device
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   int camera_id=0;
++ *   stream_config_t stream_list;
++ *   ...
++ *   ret = camera_device_config_streams(camera_id, &stream_list);
++ *   ret = camera_device_start(camera_id);
++ *   ... ...
++ *   ret = camera_device_stop(camera_id);
++ * \endcode
++ *
++ **/
++int camera_device_start(int camera_id);
++
++/**
++ * \brief
++ *   Stop camera device.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ *
++ * \return
++ *   0 succeed to stop device
++ * \return
++ *   <0 error code, failed to stop device
++ *
++ * \see camera_device_start()
++ **/
++int camera_device_stop(int camera_id);
++
++/**
++ * \brief
++ *   Allocate memory for mmap & dma export io-mode
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[out]
++ *   camera_buffer_t buffer: in Mmap mode, mmaped address is filled in addr;
++ *   in DMA export mode, the dma fd is flled in dmafd.
++ *
++ * \return
++ *   0 succeed to allocate memory
++ * \return
++ *   <0 error code, failed to allocate memory
++ *
++ * \par Sample code:
++ *
++ * \code
++ *   camera_buffer_t *buffers = (camera_buffer_t *)malloc(sizeof(camera_buffer_t)*buffer_count);
++ *   camera_buffer_t *buf = buffers;
++ *   buf.s = stream;
++ *   for (int i = 0; i < buffer_count; i++, buf++) {
++ *     camera_device_allocate_memory(camera_id, buf):
++ *   }
++ *
++ *   buf = buffers;
++ *   for (int i = 0; i < buffer_count; i++, buf++) {
++ *       camera_stream_qbuf(camera_id, stream_id, buf);
++ *   }
++ *
++ *   camera_device_start(camera_id);
++ * \endcode
++ *
++ */
++int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer);
++
++/**
++ * \brief
++ *   Queue a buffer to device (deprecated, will be removed soon.)
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   int stream_id: ID of stream
++ * \param[in]
++ *   camera_buffer_t buffer: buffer queued to device
++ * \param[in]
++ *   int num_buffers: indicates how many buffers need to be queued at the same time,
++                      and these buffers MUST be for different streams.
++                      And stream id in buffer MUST be filled correctly.
++ * \param[in]
++ *   Parameters settings: Settings used for this group of buffers.
++ *
++ * \return
++ *   0 succeed to queue buffers
++ * \return
++ *   <0 error code, failed to queue buffers
++ *
++ * \see camera_stream_dqbuf();
++ **/
++int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
++                       int num_buffers = 1, const Parameters* settings = NULL);
++
++/**
++ * \brief
++ *   Queue one or serveral buffers to the camera device
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   camera_buffer_t buffer: array of pointers to camera_buffer_t
++ *   buffer[i]->s MUST be filled before calling this API.
++ * \param[in]
++ *   int num_buffers: indicates how many buffers are in the buffer pointer array,
++ *                    and these buffers MUST be for different streams. Stream id is
++ *                    filled and give back to app when camera_device_config_streams()
++ *                    is called, HAL will do the mapping when parsing queued buffers
++ *                    according to num_buffers.
++ * \param[in]
++ *   Parameters settings: Settings used for this group of buffers.
++ *                        This is used for per-frame setting, which means the settings should be
++ *                        applied for the group of buffers.
++ *
++ * \return
++ *   0 succeed to queue buffers
++ * \return
++ *   <0 error code, failed to queue buffers
++ *
++ * \see camera_stream_qbuf();
++ **/
++int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
++                       int num_buffers = 1, const Parameters* settings = NULL);
++
++/**
++ * \brief
++ *   Dequeue a buffer from device per stream id.
++ *
++ * \note
++ *   It's a block function, that means the caller will be blocked until buffer is ready.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   int stream_id: ID of stream
++ * \param[out]
++ *   camera_buffer_t buffer: buffer dqueued from device
++ * \param[out]
++ *   Parameters settings: Settings used for this buffer.
++ *
++ * \return
++ *   0 succeed to dqueue buffer
++ * \return
++ *   <0 error code, failed to dqueue buffer
++ *
++ * \par Sample code
++ *
++ * \code
++ *   const int buffer_count = 8;
++ *   int bpp = 0;
++ *   int buffer_size = get_frame_size(camera_id, V4L2_PIX_FMT_SGRBG8, 1920, 1080, V4L2_FIELD_ANY, &bpp);
++ *   camera_buffer_t buffers[buffer_count];
++ *   camera_buffer_t *buf = nullptr;
++ *   for (int i = 0; i < buffer_count; i++) {
++ *     buf = &buffers[i];
++ *     posix_memalign(&buf->addr, getpagesize(), buffer_size);
++ *     buf->s = stream; // stream here comes from parameter and result of camera_device_config_streams.
++ *   }
++ *
++ *   for (int i = 0; i < buffer_count; i++) {
++ *       buf = &buffers[i];
++ *       camera_stream_qbuf(camera_id, stream_id, &buf);
++ *   }
++ *
++ *   camera_device_start(camera_id);
++ *
++ *   for (int i = 0; i < buffer_count; i++) {
++ *       camera_stream_dqbuf(camera_id, stream_id, &buf);
++ *       // processing data with buf
++ *   }
++ * \endcode
++ *
++ **/
++int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
++                        Parameters* settings = NULL);
++
++/**
++ * \brief
++ *   Set a set of parameters to the gaven camera device.
++ *
++ * \note
++ *   It MUST be called after device opened, otherwise error will be returned.
++ *   Which buffer the paramters takes effect in is not guaranteed.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[in]
++ *   Parameters param: A set of parameters.
++ *
++ * \return
++ *   0 succeed to set camera parameters
++ * \return
++ *   <0 error code, failed to set camera parameters
++ *
++ * \par Sample code
++ *
++ * \code
++ *   Parameters param;
++ *    camera_ae_mode_t aeMode = AE_MODE_MANUAL;
++ *    int64_t expTime = 10 * 1000;
++ *    param.setAeMode(aeMode);
++ *    param.setExposureTime(expTime);
++ *    param.setXXX(); // Set other parameters...
++ *
++ *   int ret = camera_set_parameters(camera_id, param);
++ *
++ * \endcode
++ *
++ **/
++int camera_set_parameters(int camera_id, const Parameters& param);
++
++/**
++ * \brief
++ *   Get parameter from the gaven camera device.
++ *
++ * \note
++ *   It MUST be called after device opened, otherwise error will be returned.
++ *
++ * \param[in]
++ *   int camera_id: ID of the camera
++ * \param[out]
++ *   Parameters param:  parameters need to be filled in
++ * \param[in]
++ *   long sequence: sequence used to find target parameter and results, default is -1
++ *
++ * \return
++ *   0 succeed to get camera parameters
++ * \return
++ *   <0 error code, failed to get camera parameters
++ *
++ * \par Sample code
++ *
++ * \code
++ *   Parameters param;
++ *   int ret = camera_get_parameters(camera_id, param);
++ *   camera_ae_mode_t aeMode = AE_MODE_MANUAL;
++ *   ret = param.getAeMode(aeMode);
++ *
++ * \endcode
++ *
++ **/
++int camera_get_parameters(int camera_id, Parameters& param, long sequence = -1);
++
++/**************************************Optional API ******************************
++ * The API defined in this section is optional.
++ */
++
++/**
++ * \brief
++ *   Return the size information of a frame.
++ *
++ * \note
++ *   It is used to assist the test cases to double confirm the final buffer size
++ *
++ * \param[in]
++ *   int camera_id: The camera device index
++ * \param[in]
++ *   int format: The v4l2 format of the frame
++ * \param[in]
++ *   int width: The width of the frame
++ * \param[in]
++ *   int height: The height of the frame
++ * \param[in]
++ *   int field: The interlace field of the frame
++ * \param[out]
++ *   int bpp: The bpp of the format
++ *
++ * \return
++ *   frame size.
++ **/
++int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp);
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/include/api/Parameters.h b/camera/hal/intel/ipu6/include/api/Parameters.h
+new file mode 100644
+index 000000000000..1cfce85b4c27
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/api/Parameters.h
+@@ -0,0 +1,2630 @@
++/*
++ * Copyright (C) 2013 The Android Open Source Project
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*
++ *
++ * Filename: Parameters.h
++ *
++ * ------------------------------------------------------------------------------
++ * REVISION HISTORY
++ *     Version        0.1        Initialize camera parameters API
++ *     Version        0.2        Merge all the types to this file
++ *     Version        0.3        Add AE compensation related APIs.
++ *     Version        0.31       Add manual color matrix APIs.
++ *     Version        0.32       Add manual AE/AWB converge speed APIs.
++ *     Version        0.33       Add timestamp variable in camera_buffer_t
++ *     Version        0.34       Add AE window weight grid API
++ *     Version        0.40       Add Data Structure for HAL 3.3
++ *     Version        0.41       Add API getSupportedAeExposureTimeRange
++ *                               Add API getSupportedAeGainRange
++ *     Version        0.42       Add API updateDebugLevel
++ *     Version        0.43       Add API set and get deinterlace mode
++ *     Version        0.44       Add API set and get gps processing method
++ *                               Add API set and get focal length
++ *     Version        0.45       Add get supported static metadata APIs
++ *     Version        0.50       Support low level ISP feature control
++ *     Version        0.51       Support getting supported ISP control feature list
++ *     Version        0.52       Add API set and get awb result
++ *     Version        0.53       Add API to get/set enabled ISP control feature list
++ *     Version        0.54       Add API to get/set fisheye dewarping mode
++ *     Version        0.55       Add API to get/set LTM tuning data
++ *     Version        0.56       Add API to get/set LDC/RSC/digital zoom ratio
++ *     Version        0.58       Add API to get/set 3A state, and lens state.
++ *     Version        0.59       Add API to get/set AE/AWB lock
++ *     Version        0.61       Add API to support vertical and horizontal flip.
++ *     Version        0.62       Add API to support 3A cadence.
++ *     Version        0.63       Add API to enable/disable MONO Downscale feature.
++ *     Version        0.64       Add callback message definition.
++ *     Version        0.65       Add API to support OUTPUT/INPUT streams.
++ *     Version        0.66       modifies callback message definition.
++ *     Version        0.67       Add API to support lens.focusDistance and lens.focalLength
++ *     Version        0.68       Add API to support shading map.
++ *     Version        0.69       Add API to support statistics lens shading map control.
++ *     Version        0.70       Add API to support tonemap.
++ *     Version        0.71       Add API to support OPAQUE RAW usage for RAW reprocessing.
++ *     Version        0.72       Add streamType into supported_stream_config_t.
++ *     Version        0.73       Remove supported_stream_config_t structure.
++ *     Version        0.74       Add API to support sensor iso.
++ *     Version        0.75       Add API to support lens static info about apertures,
++ *                               filter densities, min focus densities and hyperfocal distance.
++ *     Version        0.76       Remove the marco for lsc grid size
++ *     Version        0.77       Add API to support capture intent
++ *
++ *
++ * ------------------------------------------------------------------------------
++ */
++
++#pragma once
++
++#include <vector>
++#include <set>
++#include <stdint.h>
++
++namespace icamera {
++
++/***************Start of Camera Basic Data Structure ****************************/
++/**
++ * Basic definition will be inherited by more complicated structure.
++ * MUST be all "int" in this structure.
++ */
++typedef struct {
++    int width;
++    int height;
++} camera_resolution_t;
++
++/**
++ * \struct stream_t: stream basic info
++ *
++ * \note
++ *   MUST use int if new member added.
++ */
++typedef struct {
++    int format;    /**< stream format refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html */
++    int width;     /**< image width */
++    int height;    /**< image height */
++    int field;     /**< refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/field-order.html#v4l2-field */
++
++/*
++* The buffer geometry introduction.
++* The YUV image is formed with Y:Luma and UV:Chroma. And there are
++* two kinds of styles for YUV format: planar and packed.
++*
++*   YUV420:NV12
++*
++*            YUV420(720x480) sampling
++*
++*       |<----width+padding=alignedBpl----->|
++*     Y *-------*-------*-------*-------*....-----
++*       |                               |   :  ^
++*       |   # UV            #           |   :  |
++*       |                               |   :  |
++*       *-------*-------*-------*-------*....  |
++*       |                               |   :  |
++*       |   #               #           |   :  |
++*       |                               |   :  |
++*       *-------*-------*-------*-------*.... (height * 3 / 2)
++*       |                               |   :  |
++*       |   #               #           |   :  |
++*       |                               |   :  |
++*       *-------*-------*-------*-------*....  |
++*       |                               |   :  |
++*       |   #               #           |   :  |
++*       |                               |   :  v
++*       *-------*-------*-------*-------*....-----
++*
++*         The data stored in memory
++*          ____________w___________ .....
++*         |Y0|Y1                   |    :
++*         |                        |    :
++*         h                        h    :
++*         |                        |    :
++*         |                        |    :
++*         |________________________|....:
++*         |U|V|U|V                 |    :
++*        h/2                      h/2   :
++*         |____________w___________|....:
++*
++*       bpp = 12
++*       bpl = width;
++*       stride = align64(bpl):
++*
++*   YUV422:YUY2
++*
++*           YUV422(720x480) sampling
++*
++*       |<--(width*2)+padding=alignedBpl-->|
++*   YUV *#----*#-----*#-----*#-----*#....-----
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#.... (height)
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....  |
++*       *#----*#-----*#-----*#-----*#....-----
++*
++*         The data stored in memory
++*          ____________w___________ .....
++*         |Y0|Cb|Y1|Cr             |    :
++*         |                        |    :
++*         |                        |    :
++*         |                        |    :
++*         h                        h    :
++*         |                        |    :
++*         |                        |    :
++*         |                        |    :
++*         |____________w___________|....:
++*
++*       bpp = 16
++*       bpl = width * bpp / 8 = width * 2;
++*       stride = align64(bpl):
++*
++*       Note: The stride defined in HAL is same as aligned bytes per line.
++*/
++    int stride;    /**< stride = aligned bytes per line */
++    int size;      /**< real buffer size */
++
++    int id;        /**< Id that is filled by HAL. */
++    int memType;   /**< buffer memory type filled by app, refer to https://linuxtv.org/downloads/v4l-dvb-apis/io.html */
++
++    /**
++     * The maximum number of buffers the HAL device may need to have dequeued at
++     * the same time. The HAL device may not have more buffers in-flight from
++     * this stream than this value.
++     */
++    uint32_t max_buffers;
++
++    int usage; /**<The usage of this stream defined in camera_stream_usage_t. */
++    int streamType; /**<The stream type of this stream defined in camera_stream_type_t. */
++} stream_t;
++
++typedef std::vector<stream_t> stream_array_t;
++
++/**
++ * \struct stream_config_t: stream configuration info
++ *
++ * Contains all streams info in this configuration.
++ */
++typedef struct {
++    int num_streams; /**< number of streams in this configuration */
++    stream_t    *streams; /**< streams list */
++    /**
++     * The operation mode of the streams in this configuration. It should be one of the value
++     * defined in camera_stream_configuration_mode_t.
++     * The HAL uses this mode as an indicator to set the stream property (e.g.,
++     * camera_stream->max_buffers) appropriately. For example, if the configuration is
++     * CAMERA_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE, the HAL may want to set aside more
++     * buffers for batch mode operation (see camera.control.availableHighSpeedVideoConfigurations
++     * for batch mode definition).
++     */
++    uint32_t operation_mode;
++} stream_config_t;
++
++/**
++ * \struct camera_buffer_flags_t: Specify a buffer's properties.
++ *
++ * The buffer's properties can be one of them or combined with some of them.
++ */
++typedef enum {
++    BUFFER_FLAG_DMA_EXPORT = 1<<0,
++    BUFFER_FLAG_INTERNAL = 1<<1,
++    BUFFER_FLAG_SW_READ = 1<<2,
++    BUFFER_FLAG_SW_WRITE = 1<<3,
++} camera_buffer_flags_t;
++
++/**
++ * \struct camera_buffer_t: camera buffer info
++ *
++ * camera buffer is used to carry device frames. Application allocate buffer structure,
++ * according to memory type to allocate memory and queue to device.
++ */
++typedef struct {
++    stream_t s;   /**< stream info */
++    void *addr;   /**< buffer addr for userptr and mmap memory mode */
++    int index;    /**< buffer index, filled by HAL. it is used for qbuf and dqbuf in order */
++    long sequence; /**< buffer sequence, filled by HAL, to record buffer dqueue sequence from device */
++    int dmafd;    /**< buffer dmafd for DMA import and export mode */
++    int flags;    /**< buffer flags, its type is camera_buffer_flags_t, used to specify buffer properties */
++    uint64_t timestamp; /**< buffer timestamp, it's a time reference measured in nanosecond */
++    int reserved; /**< reserved for future */
++} camera_buffer_t;
++
++/**
++ * camera_stream_type_t:
++ *
++ * The type of the camera stream, which defines whether the camera HAL device
++ * is the producer or the consumer for that stream, and how the buffers of that
++ * stream relate to the other streams.
++ */
++typedef enum {
++    /**
++     * This stream is an output stream; the camera HAL device will be responsible to
++     * fill the buffers of this stream with newly captured or reprocessed image data.
++     */
++    CAMERA_STREAM_OUTPUT = 0,
++
++    /**
++     * This stream is an input stream; the camera HAL device will be responsible
++     * to read buffers from this stream and to send them through the camera
++     * processing pipeline, as if the buffer was a newly captured image from
++     * the imager.
++     *
++     * The pixel format for an input stream can be any format reported by
++     * camera.scaler.availableInputOutputFormatsMap. The pixel format of the
++     * output stream used to produce the reprocessing data may be any format
++     * reported by camera.scaler.availableStreamConfigurations. The supported
++     * inputoutput stream combinations depends on the camera device capabilities.
++     * See camera.scaler.availableInputOutputFormatsMap for stream map details.
++     *
++     * This kind of stream is generally used to reprocess data into higher
++     * quality images (that otherwise would cause a frame rate performance loss),
++     * or to do off-line reprocessing.
++     * The typical use cases are OPAQUE (typically ZSL) and YUV reprocessing.
++     */
++    CAMERA_STREAM_INPUT = 1,
++
++    /**
++     * This stream can be used for input and output. Typically, the stream is
++     * used as an output stream, but occasionally one already-filled buffer may
++     * be sent back to the HAL device for reprocessing.
++     *
++     * This kind of stream is generally meant for Zero Shutter Lag (ZSL)
++     * features, where copying the captured image from the output buffer to the
++     * reprocessing input buffer would be expensive.
++     *
++     * Note that the HAL will always be reprocessing data it produced.
++     *
++     */
++    CAMERA_STREAM_BIDIRECTIONAL = 2,
++
++    /**
++     * Total number of framework-defined stream types
++     */
++    CAMERA_NUM_STREAM_TYPES
++
++} camera_stream_type_t;
++
++/**
++ * camera_stream_usage_t:
++ *
++ * The type of the camera stream, which defines whether the camera HAL device
++ * is the producer or the consumer for that stream, and how the buffers of that
++ * stream relate to the other streams.
++ */
++typedef enum {
++    /**
++     * This stream is an output stream for preview;
++     */
++    CAMERA_STREAM_PREVIEW = 0,
++
++    /**
++     * This stream is an output stream for VIDEO CAPTURE;
++     */
++    CAMERA_STREAM_VIDEO_CAPTURE,
++
++    /**
++     * This stream is an output stream for STILL IMAGE CAPTURE;
++     */
++    CAMERA_STREAM_STILL_CAPTURE,
++
++    /**
++     * This stream is an output stream for Application processing which is accessed by CPU;
++     */
++    CAMERA_STREAM_APP,
++
++    /**
++     * This stream is an output stream for Opaque RAW reprocess.
++     */
++    CAMERA_STREAM_OPAQUE_RAW,
++} camera_stream_usage_t;
++
++/**
++ * camera_stream_configuration_mode_t:
++ *
++ * This defines the general operation mode for the HAL (for a given stream configuration), where
++ * modes besides NORMAL have different semantics, and usually the generality of the APIs are
++ * limited in exchange for higher performance in some particular area.
++ */
++typedef enum {
++    /**
++     * Normal stream configuration operation mode.
++     * This is the default camera operation mode, where all semantics of HAL APIs and metadata
++     * controls apply.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_NORMAL = 0,
++
++    /**
++     * CONSTRAINED_HIGH_SPEED is the special constrained high speed operation mode for devices
++     * that do not support high speed output in NORMAL mode.
++     * To support this configuration mode, camera.control.availableHighSpeedVideoConfigurations
++     * should be implemented and CONSTRAINED_HIGH_SPEED should be reported in
++     * camera.request.availableCapabilities.
++     * All streams in this configuration mode operate at high speed mode and have different
++     * characteristics and limitations to achieve high speed output. The NORMAL mode can also be
++     * used for high speed output, if the HAL supports high speed output while satisfying all the
++     * semantics of HAL APIs and metadata controls. It is recommended for the HAL to support high
++     * speed output in NORMAL mode (by advertising the high speed FPS ranges in
++     * camera.control.aeAvailableTargetFpsRanges) if possible.
++     *
++     * This mode has below limitations/requirements:
++     *
++     *   1. The HAL must support up to 2 streams with sizes reported by
++     *       camera.control.availableHighSpeedVideoConfigurations.
++     *   2. In this mode, the HAL is expected to output up to 120fps or higher. It must
++     *       support the targeted FPS range and resolution configurations reported by
++     *       camera.control.availableHighSpeedVideoConfigurations.
++     *   3. To achieve efficient high speed streaming, the HAL may have to aggregate multiple
++     *       frames together and send the batch to camera device for processing there the request
++     *       controls are same for all the frames in this batch (batch mode). The HAL must
++     *       support the max batch size. And the max batch size requirements are defined by
++     *       camera.control.availableHighSpeedVideoConfigurations.
++     *   4. The HAL will override {aeMode, awbMode, afMode} to {ON, ON, CONTINUOUS_VIDEO}.
++     *       All post-processing block mode controls must be overridden to be FAST. Therefore, no
++     *       manual control of capture and post-processing parameters is possible. All other
++     *       controls operate the same as when camera.control.mode == AUTO.
++     *       This means that all other camera.control.* fields must continue to work, such as
++     *           camera.control.aeTargetFpsRange
++     *           camera.control.aeExposureCompensation
++     *           camera.control.aeLock
++     *           camera.control.awbLock
++     *           camera.control.effectMode
++     *           camera.control.aeRegions
++     *           camera.control.afRegions
++     *           camera.control.awbRegions
++     *           camera.control.afTrigger
++     *           camera.control.aePrecaptureTrigger
++     *       Outside of camera.control.*, the following controls must work:
++     *           camera.flash.mode (TORCH mode only, automatic flash for still capture will not
++     *                                           work since aeMode is ON)
++     *           camera.lens.opticalStabilizationMode (if it is supported)
++     *           camera.scaler.cropRegion
++     *           camera.statistics.faceDetectMode (if it is supported)
++     *
++     * TODO: The high speed mode is not completely supported yet.
++     *       1) Now the HAL supports up to 60fps@1080p.
++     *       2) The static metadata camera.control.availableHighSpeedVideoConfigurations should be
++     *           implemented.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED = 1,
++
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_AUTO is a configurable mode, but not a real
++     * mode in HAL. The user uses this mode to allow the HAL selects appropriate config mode
++     * internally, so it should NOT be regarded as specific ConfigMode, but operation mode only.
++     *
++     * TuningModes used in AUTO mode depends on ConfigMode the HAL selects.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_AUTO,
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_HDR is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig HDR pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_HDR,
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_ULL is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig ULL pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_ULL,
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_HLC is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig HLC pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_HLC,
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig CUSTOM_AIC pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC,
++
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig Video LL pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL,
++
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE is used to select PSYS pipeline,
++     * Create only still pipe
++     * TuningMode and MediaCtlConfig still pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE,
++
++    /**
++     * CAMERA_STREAM_CONFIGURATION_MODE_HDR2 is used to select PSYS pipeline,
++     * TuningMode and MediaCtlConfig HDR2 pipe.
++     */
++    CAMERA_STREAM_CONFIGURATION_MODE_HDR2,
++
++    CAMERA_STREAM_CONFIGURATION_MODE_END
++} camera_stream_configuration_mode_t;
++
++/***************End of Camera Basic Data Structure ****************************/
++
++/*******************Start of Camera Parameters Definition**********************/
++/**
++ * \enum camera_features: camera supportted features.
++ */
++typedef enum {
++    MANUAL_EXPOSURE,       /**< Allow user to controll exposure time and ISO manually */
++    MANUAL_WHITE_BALANCE,  /**< Allow user to controll AWB mode, cct range, and gain */
++    IMAGE_ENHANCEMENT,     /**< Sharpness, Brightness, Contrast, Hue, Saturation */
++    NOISE_REDUCTION,       /**< Allow user to control NR mode and NR level */
++    SCENE_MODE,            /**< Allow user to control scene mode */
++    WEIGHT_GRID_MODE,      /**< Allow user to control custom weight grid mode */
++    PER_FRAME_CONTROL,     /**< Allow user to control most of parameters for each frame */
++    ISP_CONTROL,           /**< Allow user to control low level ISP features */
++    INVALID_FEATURE
++} camera_features;
++typedef std::vector<camera_features> camera_features_list_t;
++
++/**
++ * \struct camera_range_t: Used to specify the range info for something like FPS.
++ */
++typedef struct {
++    float min;
++    float max;
++} camera_range_t;
++typedef std::vector<camera_range_t> camera_range_array_t;
++
++/**
++ * \enum camera_ae_mode_t: Used to control how AE works.
++ */
++typedef enum {
++    AE_MODE_AUTO,   /**< */
++    AE_MODE_MANUAL, /**< */
++    AE_MODE_MAX     /**< Invalid AE mode, any new mode should be added before this */
++} camera_ae_mode_t;
++
++typedef enum {
++    AE_STATE_NOT_CONVERGED,
++    AE_STATE_CONVERGED
++} camera_ae_state_t;
++
++/**
++ * \enum camera_antibanding_mode_t: Used to control antibanding mode.
++ */
++typedef enum {
++    ANTIBANDING_MODE_AUTO, /**< Auto detect the flicker frequency. */
++    ANTIBANDING_MODE_50HZ, /**< Specify the flicker frequency to 50Hz. */
++    ANTIBANDING_MODE_60HZ, /**< Specify the flicker frequency to 60Hz. */
++    ANTIBANDING_MODE_OFF,  /**< Do not try to remove the flicker. */
++} camera_antibanding_mode_t;
++
++/**
++ * \enum camera_scene_mode_t: Used to control scene mode.
++ *
++ * Different scene mode may have different WB effects or different exposure behavior.
++ */
++typedef enum {
++    SCENE_MODE_AUTO,
++    SCENE_MODE_HDR,
++    SCENE_MODE_ULL,
++    SCENE_MODE_HLC,
++    SCENE_MODE_NORMAL,
++    SCENE_MODE_CUSTOM_AIC,
++    SCENE_MODE_VIDEO_LL,
++    SCENE_MODE_STILL_CAPTURE,
++    SCENE_MODE_HDR2,
++    SCENE_MODE_MAX
++} camera_scene_mode_t;
++
++/**
++ * \struct camera_ae_exposure_time_range_t: Provide supported exposure time range info per scene mode.
++ */
++typedef struct {
++    camera_scene_mode_t scene_mode;
++    camera_range_t et_range; /**< The exposure time range whose unit is us. */
++} camera_ae_exposure_time_range_t;
++
++/**
++ * \struct camera_ae_gain_range_t: Provide supported gain range info per scene mode.
++ */
++typedef struct {
++    camera_scene_mode_t scene_mode;
++    camera_range_t gain_range; /**< The available sensor gain range whose unit is db. */
++} camera_ae_gain_range_t;
++
++/*
++ * \enum camera_weight_grid_mode_t: Use to select which customized weight grid should be used.
++ */
++typedef enum {
++    WEIGHT_GRID_AUTO,
++    CUSTOM_WEIGHT_GRID_1,
++    CUSTOM_WEIGHT_GRID_2,
++    CUSTOM_WEIGHT_GRID_3,
++    CUSTOM_WEIGHT_GRID_4,
++    CUSTOM_WEIGHT_GRID_5,
++    CUSTOM_WEIGHT_GRID_6,
++    CUSTOM_WEIGHT_GRID_7,
++    CUSTOM_WEIGHT_GRID_8,
++    CUSTOM_WEIGHT_GRID_9,
++    CUSTOM_WEIGHT_GRID_10,
++    CUSTOM_WEIGHT_GRID_MAX
++} camera_weight_grid_mode_t;
++
++/**
++ * \enum camera_yuv_color_range_mode_t: Specify which YUV color range will be used.
++ */
++typedef enum {
++    CAMERA_FULL_MODE_YUV_COLOR_RANGE,       /*!< Full range (0 - 255) YUV data. */
++    CAMERA_REDUCED_MODE_YUV_COLOR_RANGE     /*!< Reduced range aka. BT.601 (16-235) YUV data range. */
++} camera_yuv_color_range_mode_t;
++
++/**
++ * \enum camera_awb_mode_t: Used to control AWB working mode.
++ */
++typedef enum {
++    AWB_MODE_AUTO,
++    AWB_MODE_INCANDESCENT,
++    AWB_MODE_FLUORESCENT,
++    AWB_MODE_DAYLIGHT,
++    AWB_MODE_FULL_OVERCAST,
++    AWB_MODE_PARTLY_OVERCAST,
++    AWB_MODE_SUNSET,
++    AWB_MODE_VIDEO_CONFERENCE,
++    AWB_MODE_MANUAL_CCT_RANGE,
++    AWB_MODE_MANUAL_WHITE_POINT,
++    AWB_MODE_MANUAL_GAIN,
++    AWB_MODE_MANUAL_COLOR_TRANSFORM,
++    AWB_MODE_MAX
++} camera_awb_mode_t;
++
++typedef enum {
++    AWB_STATE_NOT_CONVERGED,
++    AWB_STATE_CONVERGED
++} camera_awb_state_t;
++
++/**
++ * \enum camera_af_mode_t: Used to control af working mode.
++ *
++ * OFF:
++ * Af algo is disabled, len position is controlled by application if supported.
++ *
++ * AUTO:
++ * In this mode, the lens does not move unless the af trigger is activated.
++ * The af algo will update af state every frame, and lock lens position when action is
++ * completed.
++ * The af trigger can be activated repeatedly.
++ * Cancelling af trigger resets the lens position to default.
++ *
++ * MACRO:
++ * Similar to AUTO and focus on objects very close to the camera.
++ *
++ * CONTINUOUS_VIDEO:
++ * In this mode, the af algo modifies the lens position continually to
++ * attempt to provide a constantly-in-focus image stream.
++ * When the af trigger is activated,  af algo locks the lens position
++ * until a cancel AF trigger is received.
++ *
++ * CONTINUOUS_PICTURE:
++ * Similar to CONTINUOUS_VIDEO, except:
++ * When the af trigger is activated, af algo can finish the current scan
++ * before locking the lens position.
++ *
++ * Please refer to camera_af_trigger_t about how to trigger auto focus.
++ * Please refer to camera_af_state_t about how to get autofocus result.
++ */
++typedef enum {
++    AF_MODE_OFF,
++    AF_MODE_AUTO,
++    AF_MODE_MACRO,
++    AF_MODE_CONTINUOUS_VIDEO,
++    AF_MODE_CONTINUOUS_PICTURE,
++    AF_MODE_MAX,
++} camera_af_mode_t;
++
++/**
++ * \enum camera_af_trigger_t: Used trigger/cancel autofocus
++ *
++ * When af algo is enabled and it is changed to START, the HAL will
++ * trigger autofocus.
++ * When it is changed to CANCEL, the HAL will cancel any active trigger.
++ *
++ * Generally, applications should set it to START or CANCEL for only a
++ * single frame capture, and then return it to IDLE, to get ready for
++ * the next action.
++ */
++typedef enum {
++    AF_TRIGGER_IDLE,
++    AF_TRIGGER_START,
++    AF_TRIGGER_CANCEL,
++} camera_af_trigger_t;
++
++/**
++ * \enum camera_af_state_t: Used to return af state.
++ */
++typedef enum {
++    AF_STATE_IDLE,               /*!< Focus is idle */
++    AF_STATE_LOCAL_SEARCH,       /*!< Focus is in local search state */
++    AF_STATE_EXTENDED_SEARCH,    /*!< Focus is in extended search state */
++    AF_STATE_SUCCESS,            /*!< Focus has succeeded */
++    AF_STATE_FAIL                /*!< Focus has failed */
++} camera_af_state_t;
++
++/**
++ * \enum camera_awb_mode_t: Used to control which preset effect will be used.
++ */
++typedef enum {
++    CAM_EFFECT_NONE = 0,
++    CAM_EFFECT_MONO,
++    CAM_EFFECT_SEPIA,
++    CAM_EFFECT_NEGATIVE,
++    CAM_EFFECT_SKY_BLUE,
++    CAM_EFFECT_GRASS_GREEN,
++    CAM_EFFECT_SKIN_WHITEN_LOW,
++    CAM_EFFECT_SKIN_WHITEN,
++    CAM_EFFECT_SKIN_WHITEN_HIGH,
++    CAM_EFFECT_VIVID,
++} camera_effect_mode_t;
++
++/**
++ * \enum camera_test_pattern_mode_t: Use to control test pattern mode.
++ */
++typedef enum {
++    TEST_PATTERN_OFF = 0,
++    SOLID_COLOR,
++    COLOR_BARS,
++    COLOR_BARS_FADE_TO_GRAY,
++    PN9,
++    TEST_PATTERN_CUSTOM1,
++} camera_test_pattern_mode_t;
++
++/**
++ * \enum camera_tonemap_mode_t: Use to control tonemap mode.
++ */
++typedef enum {
++    TONEMAP_MODE_CONTRAST_CURVE,
++    TONEMAP_MODE_FAST,
++    TONEMAP_MODE_HIGH_QUALITY,
++    TONEMAP_MODE_GAMMA_VALUE,
++    TONEMAP_MODE_PRESET_CURVE,
++} camera_tonemap_mode_t;
++
++/**
++ * \enum camera_tonemap_preset_curve_t: Use to control preset curve type.
++ */
++typedef enum {
++    TONEMAP_PRESET_CURVE_SRGB,
++    TONEMAP_PRESET_CURVE_REC709,
++} camera_tonemap_preset_curve_t;
++
++typedef struct {
++    int32_t rSize;
++    int32_t bSize;
++    int32_t gSize;
++    const float* rCurve;
++    const float* bCurve;
++    const float* gCurve;
++} camera_tonemap_curves_t;
++
++/**
++ * \enum camera_msg_type_t: Use to indicate the type of message sent.
++ */
++typedef enum {
++    CAMERA_EVENT_NONE = 0,
++    CAMERA_ISP_BUF_READY,
++    CAMERA_DEVICE_ERROR,
++    CAMERA_IPC_ERROR,
++} camera_msg_type_t;
++
++/**
++ * \struct Sensor RAW data info for ZSL.
++ */
++typedef struct {
++    long sequence;
++    uint64_t timestamp;
++} sensor_raw_info_t;
++
++/**
++ * \struct isp_buffer_ready_t: Use to send isp buffer ready event data.
++ */
++typedef struct {
++    uint32_t frameNumber;
++    uint64_t timestamp;
++    long sequence;
++} isp_buffer_ready_t;
++
++/**
++ * \struct camera_msg_data_t: Use to specify msg data.
++ */
++typedef struct {
++    camera_msg_type_t type;
++    union {
++        isp_buffer_ready_t buffer_ready;
++    } data;
++} camera_msg_data_t;
++
++/**
++ * \struct camera_callback_ops_t
++ */
++typedef struct camera_callback_ops {
++    void (*notify)(const camera_callback_ops* cb, const camera_msg_data_t &data);
++} camera_callback_ops_t;
++
++/**
++ * \struct camera_awb_gains_t: Used to specify AWB gain and AWB gain shift.
++ */
++typedef struct {
++    int r_gain;
++    int g_gain;
++    int b_gain;
++} camera_awb_gains_t;
++
++/*!< camera_crop_region_t: Set crop region related parameters*/
++typedef struct {
++    int flag;
++    int x;
++    int y;
++} camera_crop_region_t;
++
++/**
++ * \struct camera_color_transform_t: Specify the color transform matrix.
++ */
++typedef struct {
++    float color_transform[3][3];
++} camera_color_transform_t;
++
++/**
++ * \struct camera_color_gains_t: Specify the color correction gains.
++ */
++typedef struct {
++    float color_gains_rggb[4];
++} camera_color_gains_t;
++
++/**
++ * \enum camera_nr_mode_t: Specify the noise reduction mode.
++ */
++typedef enum {
++    NR_MODE_OFF,
++    NR_MODE_AUTO,
++    NR_MODE_MANUAL_NORMAL,
++    NR_MODE_MANUAL_EXPERT,
++} camera_nr_mode_t;
++
++/**
++ * \struct camera_nr_level_t: Specify the noise reduction level.
++ */
++typedef struct {
++    int overall;
++    int spatial;
++    int temporal;
++} camera_nr_level_t;
++
++/**
++ * \enum camera_iris_mode_t: Specify the IRIS mode.
++ */
++typedef enum {
++    IRIS_MODE_AUTO,
++    IRIS_MODE_MANUAL,
++    IRIS_MODE_CUSTOMIZED,
++} camera_iris_mode_t;
++
++/**
++ * \enum camera_wdr_mode_t: Specify the WDR/HDR mode. (deprecated)
++ */
++typedef enum {
++    WDR_MODE_AUTO,
++    WDR_MODE_ON,
++    WDR_MODE_OFF,
++} camera_wdr_mode_t;
++
++/**
++ * \enum camera_blc_area_mode_t: Switch black area mode.
++ */
++typedef enum {
++    BLC_AREA_MODE_OFF,
++    BLC_AREA_MODE_ON,
++} camera_blc_area_mode_t;
++
++/**
++ * \struct camera_window_t: Used to specify AE/AWB weighted regions.
++ */
++typedef struct {
++    int left;
++    int top;
++    int right;
++    int bottom;
++    int weight;
++} camera_window_t;
++typedef std::vector<camera_window_t> camera_window_list_t;
++
++/**
++ * \struct camera_image_enhancement_t: Used to specify the image enhancement effect.
++ */
++typedef struct {
++    int sharpness;
++    int brightness;
++    int contrast;
++    int hue;
++    int saturation;
++} camera_image_enhancement_t;
++
++/**
++ * \struct camera_coordinate_t: The coordinate of a point in a specified coordinate system.
++ */
++typedef struct {
++    int x;
++    int y;
++} camera_coordinate_t;
++
++/**
++ * \struct camera_coordinate_system_t: Used to specify the coordinate system.
++ */
++typedef struct {
++    int left;   /*!< Left coordinate value in the coordinate system. */
++    int top;    /*!< Top coordinate value in the coordinate system. */
++    int right;  /*!< Right coordinate value in the coordinate system. */
++    int bottom; /*!< Bottom coordinate value in the coordinate system. */
++} camera_coordinate_system_t;
++
++/**
++ * \struct camera_rational_t: Used to present a rational.
++ */
++typedef struct {
++    int numerator;
++    int denominator;
++} camera_rational_t;
++
++/**
++ * \struct camera_awb_result_t: Present AWB result.
++ */
++typedef struct {
++    float r_per_g; /*!< Accurate White Point (R) for the image: relative value*/
++    float b_per_g; /*!< Accurate White Point (B) for the image. relative value*/
++} camera_awb_result_t;
++
++/**
++ * \enum camera_converge_speed_t: Used to control AE/AWB converge speed.
++ */
++typedef enum {
++    CONVERGE_NORMAL,
++    CONVERGE_MID,
++    CONVERGE_LOW,
++    CONVERGE_MAX
++} camera_converge_speed_t;
++
++/**
++ * \enum camera_converge_speed_mode_t: Used to control AE/AWB converge speed mode.
++ */
++typedef enum {
++    CONVERGE_SPEED_MODE_AIQ, /*!< Use AIQ Aglo to control converge speed. */
++    CONVERGE_SPEED_MODE_HAL  /*!< Implement converge speed control in HAL. */
++} camera_converge_speed_mode_t;
++
++/**
++ * \enum camera_ae_distribution_priority_t: Used to control exposure priority mode.
++ */
++typedef enum {
++    DISTRIBUTION_AUTO,    /*!< The AIQ Aglo decides completely */
++    DISTRIBUTION_SHUTTER, /*!< Shutter speed priority mode */
++    DISTRIBUTION_ISO,     /*!< ISO priority mode */
++    DISTRIBUTION_APERTURE /*!< Aperture priority mode */
++} camera_ae_distribution_priority_t;
++
++/**
++ * \enum camera_deinterlace_mode_t: Used to control the deinterlace mode.
++ */
++typedef enum {
++    DEINTERLACE_OFF,    /*!< Do not do any deinterlace */
++    DEINTERLACE_WEAVING /*!< Weave the two frame buffers into one. */
++} camera_deinterlace_mode_t;
++
++/**
++ * \enum camera_fisheye_dewarping_mode_t: Used to control the dewarping mode.
++ */
++typedef enum {
++    FISHEYE_DEWARPING_OFF,
++    FISHEYE_DEWARPING_REARVIEW,
++    FISHEYE_DEWARPING_HITCHVIEW
++} camera_fisheye_dewarping_mode_t;
++
++/**
++ * \enum camera_makernote_mode_t: Used to control makernote mode.
++ */
++typedef enum {
++    MAKERNOTE_MODE_OFF,
++    MAKERNOTE_MODE_JPEG,
++    MAKERNOTE_MODE_RAW
++} camera_makernote_mode_t;
++
++/**
++ * \enum camera_ldc_mode_t: Used to toggle lens distortion correction.
++ */
++typedef enum {
++    LDC_MODE_OFF,
++    LDC_MODE_ON
++} camera_ldc_mode_t;
++
++/**
++ * \enum camera_rsc_mode_t: Used to toggle rolling shutter correction.
++ */
++typedef enum {
++    RSC_MODE_OFF,
++    RSC_MODE_ON
++} camera_rsc_mode_t;
++
++/**
++ * \enum camera_flip_mode_t: Used to set output slip.
++ */
++typedef enum {
++    FLIP_MODE_NONE = 0,
++    FLIP_MODE_VFLIP,
++    FLIP_MODE_HFLIP,
++    FLIP_MODE_VHFLIP
++} camera_flip_mode_t;
++
++/**
++ * \enum camera_mono_downscale_mode_t: Used to enable/disable MONO Downscale.
++ */
++typedef enum {
++    MONO_DS_MODE_OFF,
++    MONO_DS_MODE_ON
++} camera_mono_downscale_mode_t;
++
++/**
++ * \enum camera_video_stabilization_mode_t: Used to control the video stabiliztion mode.
++ */
++typedef enum {
++    VIDEO_STABILIZATION_MODE_OFF,
++    VIDEO_STABILIZATION_MODE_ON
++} camera_video_stabilization_mode_t;
++typedef std::vector<camera_video_stabilization_mode_t> camera_video_stabilization_list_t;
++
++/**
++ * \enum camera_mount_type_t: camera mount type
++ */
++typedef enum {
++    WALL_MOUNTED,
++    CEILING_MOUNTED,
++} camera_mount_type_t;
++
++/**
++* \enum camera_shading_mode_t: camera shading mode type
++*/
++typedef enum {
++    SHADING_MODE_OFF,
++    SHADING_MODE_FAST,
++    SHADING_MODE_HIGH_QUALITY
++} camera_shading_mode_t;
++
++/**
++* \enum camera_lens_shading_map_mode_type_t: camera lens shading map mode type
++*/
++typedef enum {
++    LENS_SHADING_MAP_MODE_OFF,
++    LENS_SHADING_MAP_MODE_ON
++} camera_lens_shading_map_mode_type_t;
++
++/**
++ * \class Parameters
++ *
++ * \brief
++ *   Manage parameter's data structure, and provide set and get parameters
++ *
++ * This class provides a thread safe management to internal parameter's data
++ * structure, and helps client to easily set parameters to and get parameters
++ * from camera device.
++ *
++ * \version 0.1
++ *
++ */
++class Parameters {
++public:
++    Parameters();
++    Parameters(const Parameters& other);
++    Parameters& operator=(const Parameters& other);
++    ~Parameters();
++    /**
++     * \brief Merge and update current parameter with other
++     *
++     * \param[in] Parameters other: parameter source
++     *
++     * \return void
++     */
++    void merge(const Parameters& other);
++
++    // Belows are camera capability related parameters operations
++    /**
++     * \brief Get supported fps range list
++     *
++     * \param[out] camera_range_array_t& ranges
++     *
++     * \return 0 if fps range supported, otherwise non-0 value is returned.
++     */
++    int getSupportedFpsRange(camera_range_array_t& ranges) const;
++
++    /**
++     * \brief Get supported Stream Config list
++     *
++     * \param[out] stream_array_t& config
++     *
++     * \return 0 if Stream Configs supported, otherwise non-0 value is returned.
++     */
++    int getSupportedStreamConfig(stream_array_t& config) const;
++
++    // Belows are camera capability related parameters operations
++    /**
++     * \brief Get supported sensor exposure time range (microsecond)
++     *
++     * \param[out] camera_range_t& range
++     *
++     * \return 0 if it is supported, otherwise non-0 value is returned.
++     */
++    int getSupportedSensorExposureTimeRange(camera_range_t& range) const;
++
++    // Belows are camera capability related parameters operations
++    /**
++     * \brief Get supported sensor sensitivity time range
++     *
++     * \param[out] camera_range_t& range
++     *
++     * \return 0 if it is supported, otherwise non-0 value is returned.
++     */
++    int getSupportedSensorSensitivityRange(camera_range_t& range) const;
++
++    /**
++     * \brief Get supported feature list.
++     *
++     * Camera application MUST check if the feature is supported before trying to enable it.
++     * Otherwise the behavior is undefined currently, HAL may just ignore the request.
++     *
++     * \param[out] camera_features_list_t& features: All supported feature will be filled in "features"
++     *
++     * \return: If no feature supported, features will be empty
++     */
++    int getSupportedFeatures(camera_features_list_t& features) const;
++
++    /**
++     * \brief Get ae compensation range supported by camera device
++     *
++     * \param[out] camera_range_t& evRange
++     *
++     * \return 0 if ae compensation supported, non-0 or evRange equals [0, 0] means ae compensation not supported.
++     */
++    int getAeCompensationRange(camera_range_t& evRange) const;
++
++    /**
++     * \brief Get ae compensation step supported by camera device
++     *
++     * Smallest step by which the exposure compensation can be changed.
++     * This is the unit for setAeCompensation. For example, if this key has
++     * a value of `1/2`, then a setting of `-2` for setAeCompensation means
++     * that the target EV offset for the auto-exposure routine is -1 EV.
++     *
++     * One unit of EV compensation changes the brightness of the captured image by a factor
++     * of two. +1 EV doubles the image brightness, while -1 EV halves the image brightness.
++     *
++     * \param[out] camera_rational_t& evStep
++     *
++     * \return 0 if ae compensation supported, non-0 means ae compensation not supported.
++     */
++    int getAeCompensationStep(camera_rational_t& evStep) const;
++
++    /**
++     * \brief Get supported manual exposure time range
++     *
++     * Different sensors or same sensor in different settings may have different supported exposure
++     * time range, so camera application needs to use this API to check if the user's settings is
++     * in the supported range, if application pass an out of exposure time, HAL will clip it
++     * according to this supported range.
++     *
++     * \param[out] vector<camera_ae_exposure_time_range_t>& etRanges
++     *
++     * \return 0 if exposure time range is filled by HAL.
++     */
++    int getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t>& etRanges) const;
++
++    /**
++     * \brief Get supported manual sensor gain range
++     *
++     * Different sensors or same sensor in different settings may have different supported sensor
++     * gain range, so camera application needs to use this API to check if the user's settings is
++     * in the supported range, if application pass an out of range gain, HAL will clip it according
++     * to this supported range.
++     *
++     * \param[out] vector<camera_ae_gain_range_t>& gainRanges
++     *
++     * \return 0 if exposure time range is filled by HAL.
++     */
++    int getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const;
++
++    // Belows are AE related parameters operations
++    /**
++     * \brief Set exposure mode(auto/manual).
++     *
++     * "auto" means 3a algorithm will control exposure time and gain automatically.
++     * "manual" means user can control exposure time or gain, or both of them.
++     * Under manual mode, if user only set one of exposure time or gain, then 3a algorithm
++     * will help to calculate the other one.
++     *
++     * \param[in] camera_ae_mode_t aeMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeMode(camera_ae_mode_t aeMode);
++
++    /**
++     * \brief Get exposure mode
++     *
++     * \param[out] aeMode: Currently used ae mode will be set to aeMode if 0 is returned.
++     *
++     * \return 0 if exposure mode was set, otherwise non-0 value is returned.
++     */
++    int getAeMode(camera_ae_mode_t& aeMode) const;
++
++    /**
++     * \brief Set AE state.
++     *
++     * \param[in] camera_ae_state_t aeState
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeState(camera_ae_state_t aeState);
++
++    /**
++     * \brief Get AE state
++     *
++     * \param[out] aeState: Currently AE state will be set to aeState if 0 is returned.
++     *
++     * \return 0 if AE state was set, otherwise non-0 value is returned.
++     */
++    int getAeState(camera_ae_state_t& aeState) const;
++
++    /**
++     * \brief Set ae lock
++     *
++     * \param[in] bool lock
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeLock(bool lock);
++
++    /**
++     * \brief Get ae lock
++     *
++     * \param[out] bool lock
++     *
++     * \return 0 if lock was set, otherwise non-0 value is returned.
++     */
++    int getAeLock(bool& lock) const;
++
++    /**
++     * \brief Get supported video stabilization mode
++     *
++     * Camera application MUST check if the video stabilization mode is supported before trying
++     * to enable it. Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedModes: All supported video stabilization mode will be filled in "supportedModes"
++     *
++     * \return: If no mode supported, supportedModes will be empty
++     */
++    int getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const;
++
++    /**
++     * \brief Get supported ae mode
++     *
++     * Camera application MUST check if the ae mode is supported before trying to enable it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedAeModes: All supported ae mode will be filled in "supportedAeModes"
++     *
++     * \return: If no ae mode supported, supportedAeModes will be empty
++     */
++    int getSupportedAeMode(std::vector<camera_ae_mode_t> &supportedAeModes) const;
++
++    /**
++     * \brief Get supported awb mode
++     *
++     * Camera application MUST check if the awb mode is supported before trying to enable it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedAwbModes: All supported awb mode will be filled in "supportedAwbModes"
++     *
++     * \return: If no awb mode supported, supportedAwbModes will be empty
++     */
++    int getSupportedAwbMode(std::vector<camera_awb_mode_t> &supportedAwbModes) const;
++
++    /**
++     * \brief Get supported af mode
++     *
++     * Camera application MUST check if the af mode is supported before trying to enable it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedAfModes: All supported af mode will be filled in "supportedAfModes"
++     *
++     * \return: If no af mode supported, supportedAfModes will be empty
++     */
++    int getSupportedAfMode(std::vector<camera_af_mode_t> &supportedAfModes) const;
++
++    /**
++     * \brief Get supported scene mode
++     *
++     * Camera application MUST check if the scene mode is supported before trying to enable it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedSceneModes: All supported scene mode will be filled in "supportedSceneModes"
++     *
++     * \return: If no scene mode supported, supportedSceneModes will be empty
++     */
++    int getSupportedSceneMode(std::vector<camera_scene_mode_t> &supportedSceneModes) const;
++
++    /**
++     * \brief Get supported antibanding mode
++     *
++     * Camera application MUST check if the antibanding mode is supported before trying to enable it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \param[out] supportedAntibindingModes: All supported scene mode will be filled in "supportedAntibindingModes"
++     *
++     * \return: If no antibanding mode supported, supportedAntibindingModes will be empty
++     */
++    int getSupportedAntibandingMode(std::vector<camera_antibanding_mode_t> &supportedAntibindingModes) const;
++
++    /**
++     * \brief Get if ae lock is available
++     *
++     * Camera application MUST check if ae lock is supported before trying to lock it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \return: true if lock is supported, false if not
++     */
++    bool getAeLockAvailable() const;
++
++    /**
++     * \brief Get if awb lock is available
++     *
++     * Camera application MUST check if awb lock is supported before trying to lock it.
++     * Otherwise one error occuring, HAL may just ignore the request.
++     *
++     * \return: true if lock is supported, false if not
++     */
++    bool getAwbLockAvailable() const;
++
++    /**
++     * \brief Set AE region
++     *
++     * Current only fisrt region can take effect when BLC mode is BLC_AREA_MODE_ON;
++     * if BLC_AREA_MODE_OFF, AE region function will be diabled.
++     *
++     * \param[in] camera_window_list_t aeRegions
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeRegions(camera_window_list_t aeRegions);
++
++    /**
++     * \brief Get AE region
++     *
++     * \param[out] camera_window_list_t aeRegions
++     *
++     * \return 0 if aeRegions were set, otherwise non-0 value is returned.
++     */
++    int getAeRegions(camera_window_list_t& aeRegions) const;
++
++    /**
++     * \brief Set exposure time whose unit is microsecond(us).
++     *
++     * The exposure time only take effect when ae mode set to manual.
++     *
++     * \param[in] int64_t exposureTime
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setExposureTime(int64_t exposureTime);
++
++    /**
++     * \brief Get exposure time whose unit is microsecond(us).
++     *
++     * \param[out] int64_t& exposureTime: exposure time if be set in exposureTime if 0 is returned.
++     *
++     * \return 0 if exposure time was set, non-0 means no exposure time was set.
++     */
++    int getExposureTime(int64_t& exposureTime) const;
++
++    /**
++     * \brief Set sensor gain whose unit is db.
++     * The sensor gain only take effect when ae mode set to manual.
++     *
++     * \param[in] float gain
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setSensitivityGain(float gain);
++
++    /**
++     * \brief Get sensor gain whose unit is db.
++     *
++     * \param[out] float gain
++     *
++     * \return 0 if sensor gain was set, non-0 means no sensor gain was set.
++     */
++    int getSensitivityGain(float& gain) const;
++
++    /**
++     * \brief Set sensor ISO, will overwrite value of setSensitivityGain.
++     * The sensor ISO only take effect when ae mode set to manual.
++     *
++     * \param[in] int32 iso
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setSensitivityIso(int32_t iso);
++
++    /**
++     * \brief Get sensor iso.
++     *
++     * \param[out] int32 iso
++     *
++     * \return 0 if sensor iso was set, non-0 means no sensor iso was set.
++     */
++    int getSensitivityIso(int& iso) const;
++
++    /**
++     * \brief Set ae compensation whose unit is compensation step.
++     *
++     * The adjustment is measured as a count of steps, with the
++     * step size defined ae compensation step and the allowed range by ae compensation range.
++     *
++     * For example, if the exposure value (EV) step is 0.333, '6'
++     * will mean an exposure compensation of +2 EV; -3 will mean an
++     * exposure compensation of -1 EV. One EV represents a doubling of image brightness.
++     *
++     * In the event of exposure compensation value being changed, camera device
++     * may take several frames to reach the newly requested exposure target.
++     *
++     * \param[in] int ev
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeCompensation(int ev);
++
++    /**
++     * \brief Get ae compensation whose unit is compensation step.
++     *
++     * \param[out] int ev
++     *
++     * \return 0 if ae compensation was set, non-0 means no ae compensation was set.
++     */
++    int getAeCompensation(int& ev) const;
++
++    /**
++     * \brief Set frame rate
++     *
++     * \param[in] float fps
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setFrameRate(float fps);
++
++    /**
++     * \brief Get frame rate
++     *
++     * \param[out] float& fps
++     *
++     * \return 0 if frame rate was set, otherwise non-0 value is returned.
++     */
++    int getFrameRate(float& fps) const;
++
++    /**
++     * \brief Set antibanding mode
++     *
++     * \param[in] camera_antibanding_mode_t bandingMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAntiBandingMode(camera_antibanding_mode_t bandingMode);
++
++    /**
++     * \brief Get antibanding mode
++     *
++     * \param[out] camera_antibanding_mode_t& bandingMode
++     *
++     * \return 0 if antibanding mode was set, otherwise non-0 value is returned.
++     */
++    int getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const;
++
++    /**
++     * \brief Set AE distribution priority.
++     *
++     * \param[in] camera_ae_distribution_priority_t priority: the AE distribution priority to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeDistributionPriority(camera_ae_distribution_priority_t priority);
++
++    /**
++     * \brief Get AE distribution priority.
++     *
++     * \param[out] camera_ae_distribution_priority_t priority: the AE distribution priority.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const;
++
++    /**
++     * \brief set exposure time range
++     *
++     * \param[in] camera_range_t: the exposure time range to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setExposureTimeRange(camera_range_t exposureTimeRange);
++
++    /**
++     * \brief get exposure time range
++     *
++     * \param[out] camera_range_t: the exposure time had been set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getExposureTimeRange(camera_range_t& exposureTimeRange) const;
++
++    /**
++     * \brief set sensitivity gain range
++     *
++     * \param[in] camera_range_t: the sensitivity gain range(the unit is db) to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setSensitivityGainRange(camera_range_t sensitivityGainRange);
++
++    /**
++     * \brief get sensitivity gain range
++     *
++     * \param[out] camera_range_t: the sensitivity gain(the unit is db) had been set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getSensitivityGainRange(camera_range_t& sensitivityGainRange) const;
++
++    /**
++     * \brief Set weight grid mode
++     *
++     * \param[in] camera_weight_grid_mode_t weightGridMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setWeightGridMode(camera_weight_grid_mode_t weightGridMode);
++
++    /**
++     * \brief Get weight grid mode
++     *
++     * \param[out] camera_weight_grid_mode_t& weightGridMode
++     *
++     * \return 0 if weight grid mode was set, otherwise non-0 value is returned.
++     */
++    int getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const;
++
++    /**
++     * \brief Set BLC (backlight compensation) area mode
++     *
++     * \param[in] camera_blc_area_mode_t blcAreaMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setBlcAreaMode(camera_blc_area_mode_t blcAreaMode);
++
++    /**
++     * \brief Get BLC (backlight compensation) area mode
++     *
++     * \param[out] camera_blc_area_mode_t& blcAreaMode
++     *
++     * \return 0 if BLC area mode was set, otherwise non-0 value is returned.
++     */
++    int getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const;
++
++    int setFpsRange(camera_range_t fpsRange);
++    int getFpsRange(camera_range_t& fpsRange) const;
++
++    // Belows are AWB related parameters operations
++    /**
++     * \brief Set white balance mode
++     *
++     * White balance mode could be one of totally auto, preset cct range, customized cct range, customized
++     * white area, customize gains.
++     *
++     * \param[in] camera_awb_mode_t awbMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbMode(camera_awb_mode_t awbMode);
++
++    /**
++     * \brief Get white balance mode currently used.
++     *
++     * \param[out] camera_awb_mode_t& awbMode
++     *
++     * \return 0 if awb mode was set, non-0 means no awb mode was set.
++     */
++    int getAwbMode(camera_awb_mode_t& awbMode) const;
++
++    /**
++     * \brief Set AWB state.
++     *
++     * \param[in] camera_awb_state_t awbState
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbState(camera_awb_state_t awbState);
++
++    /**
++     * \brief Get AWB state
++     *
++     * \param[out] awbState: Currently AWB state will be set to awbState if 0 is returned.
++     *
++     * \return 0 if AWB state was set, otherwise non-0 value is returned.
++     */
++    int getAwbState(camera_awb_state_t& awbState) const;
++
++    /**
++     * \brief Set awb lock
++     *
++     * \param[in] bool lock
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbLock(bool lock);
++
++    /**
++     * \brief Get awb lock
++     *
++     * \param[out] bool lock
++     *
++     * \return 0 if lock was set, otherwise non-0 value is returned.
++     */
++    int getAwbLock(bool& lock) const;
++
++    /**
++     * \brief Set customized cct range.
++     *
++     * Customized cct range only take effect when awb mode is set to AWB_MODE_MANUAL_CCT_RANGE
++     *
++     * \param[in] camera_range_t cct range, which specify min and max cct for 3a algorithm to use.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbCctRange(camera_range_t cct);
++
++    /**
++     * \brief Get customized cct range currently used.
++     *
++     * \param[out] camera_range_t& cct range
++     *
++     * \return 0 if cct range was set, non-0 means no cct range was set.
++     */
++    int getAwbCctRange(camera_range_t& cct) const;
++
++    /**
++     * \brief Set customized awb gains.
++     *
++     * Customized awb gains only take effect when awb mode is set to AWB_MODE_MANUAL_GAIN
++     *
++     * The range of each gain is (0, 255).
++     *
++     * \param[in] camera_awb_gains_t awb gains, which specify r,g,b gains for overriding awb result.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbGains(camera_awb_gains_t awbGains);
++
++    /**
++     * \brief Get customized awb gains currently used.
++     *
++     * \param[out] camera_awb_gains_t& awb gains
++     *
++     * \return 0 if awb gain was set, non-0 means no awb gain was set.
++     */
++    int getAwbGains(camera_awb_gains_t& awbGains) const;
++
++    /**
++     * \brief Set awb gain shift.
++     *
++     * Customized awb gain shift only take effect when awb mode is NOT set to AWB_MODE_MANUAL_GAIN
++     *
++     * The range of each gain shift is (0, 255).
++     *
++     * \param[in] camera_awb_gains_t awb gain shift, which specify r,g,b gains for updating awb result.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbGainShift(camera_awb_gains_t awbGainShift);
++
++    /**
++     * \brief Get customized awb gains shift currently used.
++     *
++     * \param[out] camera_awb_gains_t& awb gain shift
++     *
++     * \return 0 if awb gain shift was set, non-0 means no awb gain shift was set.
++     */
++    int getAwbGainShift(camera_awb_gains_t& awbGainShift) const;
++
++    /**
++     * \brief Set awb result.
++     *
++     * \param[in] data: The data used to override awb result.
++     *
++     * Note: data is allocated by the caller and NULL is for erasing the param.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbResult(void *data);
++
++    /**
++     * \brief Get awb result currently used.
++     *
++     * \param[out] data: the awb result pointer to user
++     *
++     * Note: data is allocated by the caller and it must never be NULL.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAwbResult(void *data) const;
++
++    /**
++     * \brief Set manual white point coordinate.
++     *
++     * Only take effect when awb mode is set to AWB_MODE_MANUAL_WHITE_POINT.
++     * The coordinate system is based on frame which is currently displayed.
++     *
++     * \param[in] camera_coordinate_t white point
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbWhitePoint(camera_coordinate_t whitePoint);
++
++    /**
++     * \brief Get manual white point coordinate.
++     *
++     * \param[out] camera_coordinate_t& white point
++     *
++     * \return 0 if white point was set, non-0 means no white point was set.
++     */
++    int getAwbWhitePoint(camera_coordinate_t& whitePoint) const;
++
++    /**
++     * \brief Set customized color transform which is a 3x3 matrix.
++     *
++     *  Manual color transform only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
++     *
++     * \param[in] camera_color_transform_t colorTransform: a 3x3 matrix for color convertion.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setColorTransform(camera_color_transform_t colorTransform);
++
++    /**
++     * \brief Get color transform matrix currently used.
++     *
++     * \param[out] camera_color_transform_t& color transform matrix
++     *
++     * \return 0 if color transform matrix was set, non-0 means no color transform matrix was set.
++     */
++    int getColorTransform(camera_color_transform_t& colorTransform) const;
++
++    /**
++     * \brief Set customized color correction gains which is a 4 array.
++     *
++     *  Manual color correction gains only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
++     *
++     * \param[in] camera_color_gains_t colorGains: a 4 array for color correction gains.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setColorGains(camera_color_gains_t colorGains);
++    /**
++     * \brief Get color correction gains currently used.
++     *
++     * \param[out] camera_color_gains_t& color correction gains
++     *
++     * \return 0 if color correction gains was set, non-0 means no color correction gains was set.
++     */
++    int getColorGains(camera_color_gains_t& colorGains) const;
++
++    int setAwbRegions(camera_window_list_t awbRegions);
++    int getAwbRegions(camera_window_list_t& awbRegions) const;
++
++    // Belows are convergence speed related parameters operations
++    /**
++     * \brief Set customized Ae converge speed.
++     *
++     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeConvergeSpeed(camera_converge_speed_t speed);
++
++    /**
++     * \brief Get customized Ae converge speed.
++     *
++     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAeConvergeSpeed(camera_converge_speed_t& speed) const;
++
++    /**
++     * \brief Set customized Awb converge speed.
++     *
++     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbConvergeSpeed(camera_converge_speed_t speed);
++
++    /**
++     * \brief Get customized Awb converge speed.
++     *
++     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAwbConvergeSpeed(camera_converge_speed_t& speed) const;
++
++    /**
++     * \brief Set customized Ae converge speed mode.
++     *
++     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAeConvergeSpeedMode(camera_converge_speed_mode_t mode);
++
++    /**
++     * \brief Get customized Ae converge speed mode.
++     *
++     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
++
++    /**
++     * \brief Set customized Awb converge speed mode.
++     *
++     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode);
++
++    /**
++     * \brief Get customized Awb converge speed mode.
++     *
++     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
++
++    // Belows are ISP related parameters operations
++    int setNrMode(camera_nr_mode_t nrMode);
++    int getNrMode(camera_nr_mode_t& nrMode) const;
++
++    int setNrLevel(camera_nr_level_t level);
++    int getNrLevel(camera_nr_level_t& level) const;
++
++    /**
++     * \brief Set YUV color range mode
++     *
++     * \param[in] camera_yuv_color_range_mode_t colorRange: the YUV color range mode to be set.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange);
++
++    /**
++     * \brief Get YUV color range mode
++     *
++     * \param[out] camera_yuv_color_range_mode_t colorRange: the YUV color range mode.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getYuvColorRangeMode(camera_yuv_color_range_mode_t & colorRange) const;
++
++    /**
++     * \brief Set customized effects.
++     *
++     * One of sharpness, brightness, contrast, hue, saturation could be controlled by this API.
++     * Valid range should be [-128, 127]
++     *
++     * \param[in] camera_image_enhancement_t effects
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setImageEnhancement(camera_image_enhancement_t effects);
++
++    /**
++     * \brief Get customized effects.
++     *
++     * \param[out] effects
++     *
++     * \return 0 if effects was set, non-0 return value means no effects was set.
++     */
++    int getImageEnhancement(camera_image_enhancement_t& effects) const;
++
++    // Belows are other parameters operations
++    int setIrisMode(camera_iris_mode_t irisMode);
++    int getIrisMode(camera_iris_mode_t& irisMode);
++
++    int setIrisLevel(int level);
++    int getIrisLevel(int& level);
++
++    /**
++     * \brief Set WDR Level
++     *
++     * \param[in] uint8_t level
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setWdrLevel(uint8_t level);
++
++    /**
++     * \brief Get WDR level currently used.
++     *
++     * \param[out] uint8_t& level
++     *
++     * \return 0 if get WDR level, non-0 means error.
++     */
++    int getWdrLevel(uint8_t& level) const;
++
++    /**
++     * \brief Set effect scene mode
++     *
++     * \param[in] camera_scene_mode_t: scene mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setEffectSceneMode(camera_scene_mode_t sceneMode);
++
++    /**
++     * \brief Get effect scene mode based on runtime
++     *
++     * \param[out] camera_scene_mode_t&: scene mode
++     *
++     * \return 0 if get scene mode, non-0 means error.
++     */
++    int getEffectSceneMode(camera_scene_mode_t& sceneMode) const;
++
++    /**
++     * \brief Set scene mode
++     *
++     * \param[in] camera_scene_mode_t: scene mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setSceneMode(camera_scene_mode_t sceneMode);
++
++    /**
++     * \brief Get scene mode current set by user.
++     *
++     * \param[out] camera_scene_mode_t&: scene mode
++     *
++     * \return 0 if get scene mode, non-0 means error.
++     */
++    int getSceneMode(camera_scene_mode_t& sceneMode) const;
++
++    /**
++     * \brief Set deinterlace mode
++     *
++     * \param[in] camera_deinterlace_mode_t deinterlaceMode
++     *
++     * Setting deinterlace mode only takes effect before camera_device_config_streams called
++     * That's it cannot be changed after camera_device_config_streams.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode);
++
++    /**
++     * \brief Get deinterlace mode
++     *
++     * \param[out] camera_deinterlace_mode_t& deinterlaceMode
++     *
++     * \return 0 if deinterlace mode was set, non-0 means no deinterlace mode was set.
++     */
++    int getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const;
++
++    /**
++     * \brief Set Makernote Data
++     *
++     * \param[in] const void* data: the pointer of data.
++     * \param[in] unsigned int size: the size of the data.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setMakernoteData(const void* data, unsigned int size);
++
++    /**
++     * \brief Get Makernote Data
++     *
++     * \param[out] void* data: the pointer of destination buffer.
++     * \param[in/out] in: the buffer size; out: the buffer used size.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getMakernoteData(void* data, unsigned int* size) const;
++
++    /**
++     * \brief Set Custom Aic Param
++     *
++     * \param[in] const void* data: the pointer of data.
++     * \param[in] int length: the length of the data.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setCustomAicParam(const void* data, unsigned int length);
++
++    /**
++     * \brief Get Custom Aic Param
++     *
++     * \param[out] void* data: the pointer of destination buffer.
++     * \param[in/out] in: the buffer size; out: the buffer used size.
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int getCustomAicParam(void* data, unsigned int* length) const;
++
++    /**
++     * \brief Set makernote mode
++     *
++     * \param[in] camera_makernote_mode_t mode
++     *
++     * \return 0 if get successfully, otherwise non-0 value is returned.
++     */
++    int setMakernoteMode(camera_makernote_mode_t mode);
++
++    /**
++     * \brief get makernote mode
++     *
++     * \param[out] camera_makernote_mode_t &mode
++     *
++     * \return 0 if makernote mode was set, otherwise return non-0 value.
++     */
++    int getMakernoteMode(camera_makernote_mode_t &mode) const;
++
++    /**
++     * \brief Set digital zoom ratio
++     *
++     * \param[in] float ratio
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setDigitalZoomRatio(float ratio);
++
++    /**
++     * \brief Get digital zoom ratio
++     *
++     * \param[out] float& ratio
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getDigitalZoomRatio(float& ratio) const;
++
++    /**
++     * \brief Set lens distortion correction mode
++     *
++     * \param[in] camera_ldc_mode_t mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setLdcMode(camera_ldc_mode_t mode);
++
++    /**
++     * \brief Get lens distortion correction mode
++     *
++     * \param[out] camera_ldc_mode_t& mode
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getLdcMode(camera_ldc_mode_t &mode) const;
++
++    /**
++     * \brief Set rolling shutter correction mode
++     *
++     * \param[in] camera_rsc_mode_t mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setRscMode(camera_rsc_mode_t mode);
++
++    /**
++     * \brief Get rolling shutter correction mode
++     *
++     * \param[out] camera_rsc_mode_t& mode
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getRscMode(camera_rsc_mode_t &mode) const;
++
++    /**
++     * \brief flip mode
++     *
++     * \param[in] camera_flip_mode_t mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setFlipMode(camera_flip_mode_t mode);
++
++    /**
++     * \brief Get flip mode
++     *
++     * \param[out] camera_flip_mode_t& mode
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getFlipMode(camera_flip_mode_t &mode) const;
++
++    /**
++     * \brief set frame interval to run 3A
++     *
++     * \param[in] int cadence which is frame interval
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setRun3ACadence(int cadence);
++
++    /**
++     * \brief Get frame interval to run 3A
++     *
++     * \param[out] int& cadence which is frame interval
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getRun3ACadence(int &cadence) const;
++
++    /**
++     * \brief mono downscale mode
++     *
++     * \param[in] camera_mono_downscale_mode_t mode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setMonoDsMode(camera_mono_downscale_mode_t mode);
++
++    /**
++     * \brief Get mono downscale mode
++     *
++     * \param[out] camera_mono_downscale_mode_t& mode
++     *
++     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
++     */
++    int getMonoDsMode(camera_mono_downscale_mode_t &mode) const;
++
++    /**
++     * \brief Set Fisheye Dewarping Mode
++     *
++     * \param[in] camera_fisheye_dewarping_mode_t dewarpingMode
++     *
++     * Setting dewarping mode only takes effect before camera_device_config_streams called
++     * That's it cannot be changed after camera_device_config_streams.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t dewarpingMode);
++
++    /**
++     * \brief Get Fisheye Dewarping Mode
++     *
++     * \param[out] camera_fisheye_dewarping_mode_t &dewarpingMode
++     *
++     * \return 0 if dewarping mode was set, non-0 means no dewarping mode was set.
++     */
++    int getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &dewarpingMode) const;
++
++    // Belows are Jpeg related parameters operations
++    int getJpegQuality(uint8_t *quality) const;
++    int setJpegQuality(uint8_t quality);
++
++    int getJpegThumbnailQuality(uint8_t *quality) const;
++    int setJpegThumbnailQuality(uint8_t quality);
++
++    int setJpegThumbnailSize(const camera_resolution_t& res);
++    int getJpegThumbnailSize(camera_resolution_t& res) const;
++
++    int getJpegRotation(int &rotation) const;
++    int setJpegRotation(int  rotation);
++
++    int setJpegGpsCoordinates(const double *coordinates);
++    int getJpegGpsLatitude(double &latitude) const;
++    int getJpegGpsLongitude(double &longitude) const;
++    int getJpegGpsAltitude(double &altiude) const;
++
++    int getJpegGpsTimeStamp(int64_t &timestamp) const;
++    int setJpegGpsTimeStamp(int64_t  timestamp);
++
++    int getJpegGpsProcessingMethod(int &processMethod) const;
++    int setJpegGpsProcessingMethod(int  processMethod);
++
++    int getJpegGpsProcessingMethod(int size, char* processMethod) const;
++    int setJpegGpsProcessingMethod(const char* processMethod);
++
++    int getImageEffect(camera_effect_mode_t &effect) const;
++    int setImageEffect(camera_effect_mode_t  effect);
++
++    int getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const;
++    int setVideoStabilizationMode(camera_video_stabilization_mode_t mode);
++
++    int getFocalLength(float &focal) const;
++    int setFocalLength(float focal);
++
++    /**
++     * \brief Get aperture value currently used
++     *
++     * \param[in] float& aperture
++     *
++     * \return 0 if aperture was set, non=0 means no aperture was set
++     */
++    int getAperture(float &aperture) const;
++    /**
++     * \brief Set aperture value
++     *
++     * \param[in] float aperture
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAperture(float aperture);
++
++    /**
++     * \brief Get focus distance value currently used
++     *
++     * \param[in] float& distance
++     *
++     * \return 0 if distance was set, non-0 means no focus distance was set
++     */
++    int getFocusDistance(float &distance) const;
++    /**
++     * \brief Set focus distance value
++     *
++     * \param[in] float distance
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setFocusDistance(float distance);
++
++    /**
++     * \brief Get focus range value currently used
++     *
++     * \param[in] camera_range_t& focusRange
++     *
++     * \return 0 if focus range was set, non-0 means no focus range was set
++     */
++    int getFocusRange(camera_range_t& focusRange) const;
++    /**
++     * \brief Set focus range value
++     *
++     * \param[in] camera_range_t focusRange
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setFocusRange(const camera_range_t& focusRange);
++
++    /**
++     * \brief Set af mode
++     *
++     * \param[in] camera_af_mode_t afMode
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAfMode(camera_af_mode_t afMode);
++
++    /**
++     * \brief Get af mode currently used.
++     *
++     * \param[out] camera_af_mode_t& afMode
++     *
++     * \return 0 if af mode was set, non-0 means no af mode was set.
++     */
++    int getAfMode(camera_af_mode_t& afMode) const;
++
++    /**
++     * \brief Trigger or cancel auto focus
++     *
++     * \param[in] camera_af_trigger_t afTrigger
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAfTrigger(camera_af_trigger_t afTrigger);
++
++    /**
++     * \brief Get auto focus trigger value
++     *
++     * \param[out] camera_af_trigger_t afTrigger
++     *
++     * \return 0 if af trigger was set, otherwise non-0 value is returned.
++     */
++    int getAfTrigger(camera_af_trigger_t& afTrigger) const;
++
++    /**
++     * \brief Set AF state.
++     *
++     * \param[in] camera_af_state_t afState
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAfState(camera_af_state_t afState);
++
++    /**
++     * \brief Get AF state
++     *
++     * \param[out] afState: Currently AF state will be set to afState if 0 is returned.
++     *
++     * \return 0 if AF state was set, otherwise non-0 value is returned.
++     */
++    int getAfState(camera_af_state_t& afState) const;
++
++    /**
++     * \brief Set lens state.
++     *
++     * \param[in] if lens is moving
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setLensState(bool lensMoving);
++
++    /**
++     * \brief Get lens state
++     *
++     * \param[out] isMoving: if lens is moving currently
++     *
++     * \return 0 if lens state was set, otherwise non-0 value is returned.
++     */
++    int getLensState(bool& lensMoving) const;
++
++    /**
++     * \brief Get lens aperture.
++     *
++     * \param[out] aperture
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int getLensAperture(float &aperture) const;
++
++    /**
++     * \brief Get lens filter density.
++     *
++     * \param[out] filter density
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int getLensFilterDensity(float &filterDensity) const;
++
++    /**
++     * \brief Get lens min focus distance.
++     *
++     * \param[out] min focus distance
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int getLensMinFocusDistance(float &minFocusDistance) const;
++
++    /**
++     * \brief Get lens hyperfocal distance.
++     *
++     * \param[out] hyperfocal distance
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int getLensHyperfocalDistance(float &hyperfocalDistance) const;
++
++    /**
++     * \brief Set af region
++     *
++     * \param[in] camera_window_list_t afRegions
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setAfRegions(camera_window_list_t afRegions);
++
++    /**
++     * \brief Get af region
++     *
++     * \param[out] camera_window_list_t afRegions
++     *
++     * \return 0 if afRegions were set, otherwise non-0 value is returned.
++     */
++    int getAfRegions(camera_window_list_t& afRegions) const;
++
++    /**
++     * \brief Get camera sensor mount type
++     *
++     * \param[out] sensorMountType sensor mount type: WALL_MOUNT or CEILING_MOUNT
++     *
++     * \return 0 if sensorMountType was set, otherwise non-0 value is returned.
++     */
++    int getSensorMountType(camera_mount_type_t& sensorMountType) const;
++
++    int updateDebugLevel();
++
++    /**
++     * \brief Set camera test pattern mode
++     *
++     * \param[in] mode: the camera device test pattern mode.
++     *
++     * \return 0 if set successfully, otherwise non-0 value is returned.
++     */
++    int setTestPatternMode(camera_test_pattern_mode_t mode);
++
++    /**
++     * \brief Get camera test pattern mode
++     *
++     * \param[out] mode: the camera device test pattern mode.
++     *
++     * \return 0 if test pattern mode was set, otherwise non-0 value is returned.
++     */
++    int getTestPatternMode(camera_test_pattern_mode_t& mode) const;
++
++    /**
++     * \brief Set crop region
++     *
++     * \param[in] cropRegion  the crop region related parameters
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int setCropRegion(camera_crop_region_t cropRegion);
++
++    /**
++     * \brief Get crop region
++     *
++     * \param[out] cropRegion  the crop related parameters
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int getCropRegion(camera_crop_region_t& cropRegion) const;
++
++    /**
++    * \brief Set control scene mode
++    *
++    * \param[in] sceneModeValue the control scene mode related parameters
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setControlSceneMode(uint8_t sceneModeValue);
++
++    /**
++    * \brief Set face detect mode
++    *
++    * \param[in] faceDetectMode the face detect mode related parameters
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setFaceDetectMode(uint8_t faceDetectMode);
++
++    /**
++    * \brief Get face detect mode
++    *
++    * \param[out] faceDetectMode the face detect mode related parameters, 0:OFF 1:SIMPLE 2:FULL
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getFaceDetectMode(uint8_t& faceDetectMode) const;
++
++    /**
++    * \brief Set face id
++    *
++    * \param[in] int *faceIds, int faceNum
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setFaceIds(int *faceIds, int faceNum);
++
++    /**
++     * Get sensor active array size
++     *
++     * \param[out] camera_coordinate_system_t& arraySize
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const;
++
++    /**
++    * \brief Set shading  mode
++    *
++    * \param[in] shadingMode the shading mode related parameters
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setShadingMode(camera_shading_mode_t shadingMode);
++
++    /**
++    * \brief Get shading  mode
++    *
++    * \param[out] shadingMode the shading mode related parameters, 0:OFF 1:FAST 2:HIGH_QUALITY
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getShadingMode(camera_shading_mode_t& shadingMode) const;
++
++    /**
++    * \brief Set statistics lens shading map mode
++    *
++    * \param[in] lensShadingMapMode the lens shading map mode related parameters
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode);
++
++    /**
++    * \brief Get statistics lens shading map mode
++    *
++    * \param[out] lensShadingMapMode the lens shading map mode related parameters, 0:OFF 1:ON
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getLensShadingMapMode(camera_lens_shading_map_mode_type_t &lensShadingMapMode) const;
++
++    /**
++    * \brief Set lens shading map
++    *
++    * \param[in] lensShadingMap the lens shading map
++    * \param[in] lensShadingMapSize lensShadingMap's size
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize);
++
++    /**
++    * \brief Get lens shading map
++    *
++    * \param[out] lensShadingMap the lens shading map
++    * \param[out] lensShadingMapSize the lens shading map's size
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getLensShadingMap(float **lensShadingMap, size_t &lensShadingMapSize) const;
++
++    /**
++    * \brief Get lens shading map size
++    *
++    * \param[out] arraySize the lens shading map size related parameters
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const;
++
++    /*
++    * \brief Set tonemap mode
++    *
++    * \param[in] camera_tonemap_mode_t& mode
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setTonemapMode(camera_tonemap_mode_t mode);
++
++    /**
++    * \brief Get tonemap mode
++    *
++    * \param[out] camera_tonemap_mode_t& mode
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getTonemapMode(camera_tonemap_mode_t& mode) const;
++
++    /**
++    * \brief Get supported tonemap modes
++    *
++    * \param[out] vector<camera_tonemap_mode_t>& tonemapModes
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getSupportedTonemapMode(std::vector<camera_tonemap_mode_t>& tonemapModes) const;
++
++    /**
++    * \brief Set the type of tonemap preset curve
++    *
++    * \param[in] camera_tonemap_preset_curve_t type
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setTonemapPresetCurve(camera_tonemap_preset_curve_t type);
++
++    /**
++    * \brief Get tonemap gamma
++    *
++    * \param[out] camera_tonemap_preset_curve_t& type
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const;
++
++    /**
++    * \brief Set tonemap gamma
++    *
++    * \param[in] float gamma
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setTonemapGamma(float gamma);
++
++    /**
++    * \brief Get tonemap gamma
++    *
++    * \param[out] float& gamma
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getTonemapGamma(float& gamma) const;
++
++    /**
++    * \brief Get number of tonemap curve points
++    *
++    * \param[out] int32_t& number
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getTonemapMaxCurvePoints(int32_t& number) const;
++
++    /**
++    * \brief Set tonemap curves
++    *
++    * \param[in] const camera_tonemap_curves_t& curve
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int setTonemapCurves(const camera_tonemap_curves_t& curves);
++
++    /**
++    * \brief Get tonemap curves
++    *
++    * \param[out] camera_tonemap_curves_t& curve
++    *
++    * \return 0 if successfully, otherwise non-0 value is returned.
++    */
++    int getTonemapCurves(camera_tonemap_curves_t& curves) const;
++
++    /**
++     * \brief Set user request id
++     *
++     * \param[in] user request id
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int setUserRequestId(int32_t userRequestId);
++
++    /**
++     * \brief Get user request id
++     *
++     * \param[out] user request id
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int getUserRequestId(int32_t& userRequestId) const;
++
++    /**
++     * \brief Set capture intent
++     *
++     * \param[in] capture intent mode
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int setCaptureIntent(uint8_t captureIntent);
++
++    /**
++     * \brief Get capture intent
++     *
++     * \param[out] capture intent mode
++     *
++     * \return 0 if successfully, otherwise non-0 value is returned.
++     */
++    int getCaptureIntent(uint8_t& captureIntent) const;
++
++private:
++    friend class ParameterHelper;
++    void* mData; // The internal data to save the all of the parameters.
++}; // class Parameters
++/*******************End of Camera Parameters Definition**********************/
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/include/cameranvm.h b/camera/hal/intel/ipu6/include/cameranvm.h
+new file mode 100644
+index 000000000000..64cbbf2af24d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/cameranvm.h
+@@ -0,0 +1,112 @@
++/*
++ * Copyright 2012-2017 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file cameranvm.h
++ * \brief Definitions of NVM creator functions.
++*/
++
++#ifndef CAMERANVM_H_
++#define CAMERANVM_H_
++
++#include "ia_types.h"
++#include "ia_nvm.h"
++
++// macro for memcpy
++#ifndef MEMCPY_S
++#define NVM_MIN(a, b) ((a) < (b) ? (a) : (b))
++#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), NVM_MIN((size_t)(dmax), (size_t)(smax)))
++#endif
++
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief NVM parsing status codes.
++ */
++typedef enum
++{
++    nvm_error_none,            /*!< No error. */
++    nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
++    nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
++    nvm_error_af,              /*!< Error parsing AF parameters. */
++    nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
++    nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
++    nvm_error_crc,             /*!< CRC check error. */
++    nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
++    nvm_error_version,         /*!< invalid version. */
++    nvm_status_intel_format    /*!< The NVM data is in Intel default format. */
++} nvm_error;
++
++typedef struct
++{
++    int lsc_color_temperature;             /*!< color temperature of shading table calibrate. as ct/100 */
++    uint16_t *lsc_tables[IA_NVM_NUM_CHANNELS]; /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. */
++} nvm_lsc;
++
++typedef struct
++{
++    uint8_t lsc_width;                         /*!< Width of LSC tables */
++    uint8_t lsc_height;                        /*!< Height of LSC tables. */
++    nvm_lsc *lsc[2];                           /*!< LSC tables 1. */
++} nvm_data;
++
++/*!
++ * \brief Creates Intel specified NVM data from various NVM data.
++ * Detection of NVM data is done based on camera ID string. Created NVM
++ * data buffer must be deleted with function cameranvm_delete.
++ * \param[in]     camera_name           String identifying NVM format from various cameras.
++ * \param[in]     input_nvm_data        NVM data from camera module.
++ * \param[in]     input_nvm_motor_data  NVM data from camera lens motor EEPROM.
++ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
++ * \return                              Error code from NVM creation.
++ */
++nvm_error
++cameranvm_create(const char *camera_name,
++                 const ia_binary_data *input_nvm_data,
++                 const ia_binary_data *input_motor_nvm_data,
++                 ia_binary_data **output_nvm_data);
++
++
++/*!
++ * \brief Creates Intel specified NVM data from NVM data in google format.
++ * Detection of NVM data is done based on camera ID string. NVM data in
++ * google format should be converted into Intel format, and Created NVM
++ * data buffer must be deleted with function cameranvm_delete.
++ * \param[in]     lsc  lsc tables in google format.
++ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
++ * \return                              Error code from NVM creation.
++ */
++nvm_error
++cameranvm_convert(const nvm_data *input_nvm_data,
++                 ia_binary_data **output_nvm_data);
++
++/*!
++ * \brief Deletes NVM data buffer created with function cameranvm_create.
++ * This function only frees the allocated buffer and clears the parameters
++ * in the given structure.
++ * \param[in] nvm_data  Previously created NVM data buffer.
++ */
++void
++cameranvm_delete(ia_binary_data *nvm_data);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* CAMERANVM_H_ */
+diff --git a/camera/hal/intel/ipu6/include/linux/ipu-isys.h b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
+new file mode 100644
+index 000000000000..7ecf35c49040
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
+@@ -0,0 +1,51 @@
++/****************************************************************************
++ * Copyright (C) 2019 Intel Corporation.
++ ****************************************************************************
++ ***
++ ***   This header was automatically generated from a Linux kernel header
++ ***   of the same name, to make information necessary for userspace to
++ ***   call into the kernel available to libc.  It contains only constants,
++ ***   structures, and macros generated from the original header, and thus,
++ ***   contains no copyrightable information.
++ ***
++ ***   To edit the content of this header, modify the corresponding
++ ***   source file (e.g. under external/kernel-headers/original/) then
++ ***   run bionic/libc/kernel/tools/update_all.py
++ ***
++ ***   Any manual change here will be lost the next time this script will
++ ***   be run. You've been warned!
++ ***
++ ****************************************************************************
++ ****************************************************************************/
++#ifndef UAPI_LINUX_IPU_ISYS_H
++#define UAPI_LINUX_IPU_ISYS_H
++#define V4L2_CID_IPU_BASE (V4L2_CID_USER_BASE + 0x1080)
++#define V4L2_CID_IPU_ISA_EN (V4L2_CID_IPU_BASE + 1)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define V4L2_CID_IPU_STORE_CSI2_HEADER (V4L2_CID_IPU_BASE + 2)
++#define V4L2_CID_IPU_ISYS_COMPRESSION  (V4L2_CID_IPU_BASE + 3)
++#define V4L2_IPU_ISA_EN_BLC (1 << 0)
++#define V4L2_IPU_ISA_EN_LSC (1 << 1)
++#define V4L2_IPU_ISA_EN_DPC (1 << 2)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define V4L2_IPU_ISA_EN_SCALER (1 << 3)
++#define V4L2_IPU_ISA_EN_AWB (1 << 4)
++#define V4L2_IPU_ISA_EN_AF (1 << 5)
++#define V4L2_IPU_ISA_EN_AE (1 << 6)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define NR_OF_IPU_ISA_CFG 7
++#define V4L2_FMT_IPU_ISA_CFG v4l2_fourcc('i', 'p', '4', 'c')
++#define V4L2_FMT_IPU_ISYS_META v4l2_fourcc('i', 'p', '4', 'm')
++#ifdef IPU_OTF_SUPPORT
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++struct ipu_frame_counter {
++  uint32_t frame_counter;
++  uint32_t index;
++} __attribute__((packed));
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define VIDIOC_IPU_SET_LINK_ID _IOWR('v', BASE_VIDIOC_PRIVATE + 1, uint8_t)
++#define VIDIOC_IPU_SET_FRAME_COUNTER _IOWR('v', BASE_VIDIOC_PRIVATE + 2, struct ipu_frame_counter)
++#endif
++#define VIDIOC_IPU_GET_DRIVER_VERSION _IOWR('v', BASE_VIDIOC_PRIVATE + 3, uint32_t)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#endif
+diff --git a/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
+new file mode 100644
+index 000000000000..043f60f0743e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
+@@ -0,0 +1,73 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <unistd.h>
++
++namespace icamera {
++
++/**
++ * Following macros PERF_CAMERA_ATRACE_XXX() can be called in the function
++ * we are scoping. Environment variable "camPerf" is need to be set as "16"
++ * or "128", to enalbe atrace profiling:
++ * 1. When "16" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_OS is
++ * enalbed.
++ * 2. When "128" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_IMAGING
++ * is enabled.
++ */
++class ScopedAtrace {
++      public:
++          ScopedAtrace(const int level, const char* func, const char* tag,
++                       const char* note = NULL, long value = -1,
++                       const char* note2 = NULL, int value2 = -1,
++                       const char* note3 = NULL, int value3 = -1);
++          ~ScopedAtrace();
++          static void setTraceLevel(int);
++      private:
++          bool mEnableAtraceEnd;
++};
++
++#define CAMERA_DEBUG_LOG_ATRACE_OS (1<<4)
++#define CAMERA_DEBUG_LOG_ATRACE_IMAGING (1<<7)
++
++#define PERF_CAMERA_ATRACE() ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, \
++                                                 __func__, LOG_TAG);
++#define PERF_CAMERA_ATRACE_PARAM1(note, value) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, \
++                                LOG_TAG, note, value);
++#define PERF_CAMERA_ATRACE_PARAM2(note, value, note2, value2) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
++                                note, value, note2, value2);
++#define PERF_CAMERA_ATRACE_PARAM3(note, value, note2, value2, note3, value3) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
++                                note, value, note2, value2, note3, value3);
++
++#define PERF_CAMERA_ATRACE_IMAGING() \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
++                                LOG_TAG);
++#define PERF_CAMERA_ATRACE_PARAM1_IMAGING(note, value) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
++                                LOG_TAG, note, value);
++#define PERF_CAMERA_ATRACE_PARAM2_IMAGING(note, value, note2, value2) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
++                                LOG_TAG, note, value, note2, value2);
++#define PERF_CAMERA_ATRACE_PARAM3_IMAGING(note, value, note2, value2, note3, \
++                                          value3) \
++            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
++                                LOG_TAG, note, value, note2, value2, note3, \
++                                value3);
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
+new file mode 100644
+index 000000000000..9b4b900cac0b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
+@@ -0,0 +1,131 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAiq"
++
++#include "modules/algowrapper/IntelAiq.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelAiq::IntelAiq() : mAiq(nullptr) {
++    LOG2("@%s", __func__);
++}
++
++IntelAiq::~IntelAiq() {
++    LOG2("@%s", __func__);
++}
++
++ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                       const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                       unsigned int statsMaxHeight, unsigned int maxNumStatsIn, ia_cmc_t* cmc,
++                       ia_mkn* mkn) {
++    LOG2("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
++
++    mAiq = ia_aiq_init(aiqbData, nvmData, aiqdData, statsMaxWidth, statsMaxHeight, maxNumStatsIn,
++                       cmc, mkn);
++
++    return mAiq;
++}
++
++ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_ae_run(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_af_run(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_awb_run(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
++                         ia_aiq_gbce_results** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_gbce_run(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
++                         ia_aiq_pa_results_v1** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_pa_run_v1(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
++                         ia_aiq_sa_results_v1** results) {
++    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    return ia_aiq_sa_run_v2(mAiq, inputParams, results);
++}
++
++ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
++    LOG2("@%s, inputParams:%p", __func__, inputParams);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++
++    return ia_aiq_statistics_set_v4(mAiq, inputParams);
++}
++
++ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
++    LOG2("@%s, outData:%p", __func__, outData);
++    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
++    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
++
++    return ia_aiq_get_aiqd_data(mAiq, outData);
++}
++
++void IntelAiq::deinit() {
++    LOG2("@%s", __func__);
++    CheckError(!mAiq, VOID_VALUE, "@%s, mAiq is nullptr", __func__);
++
++    ia_aiq_deinit(mAiq);
++}
++
++void IntelAiq::getVersion(std::string* version) {
++    LOG2("@%s", __func__);
++
++    *version = std::string(ia_aiq_get_version());
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
+new file mode 100644
+index 000000000000..7fd89a30b214
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_aiq.h>
++#include <ia_types.h>
++
++#include <string>
++
++namespace icamera {
++class IntelAiq {
++ public:
++    IntelAiq();
++    virtual ~IntelAiq();
++
++    // the return pointer (ia_aiq*) is just valid in the sandboxing process.
++    ia_aiq* init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                 const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                 unsigned int statsMaxHeight, unsigned int maxNumStatsIn, ia_cmc_t* cmc,
++                 ia_mkn* mkn);
++    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
++    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
++    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
++    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
++    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
++    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
++    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
++    ia_err getAiqdData(ia_binary_data* outData);
++    void deinit();
++    void getVersion(std::string* version);
++
++ private:
++    ia_aiq* mAiq;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
+new file mode 100644
+index 000000000000..fa86fb1bb7ff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
+@@ -0,0 +1,62 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelCmc"
++
++#include "modules/algowrapper/IntelCmc.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelCmc::IntelCmc() : mHandle(nullptr) {
++    LOG1("@%s", __func__);
++}
++
++IntelCmc::~IntelCmc() {
++    LOG1("@%s", __func__);
++}
++
++bool IntelCmc::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData) {
++    LOG1("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
++    CheckError(!aiqbData, false, "aiqbData is nullptr");
++    CheckError(nvmData, false, "nvmData is not nullptr");  // it doesn't support nvmData currently.
++
++    mHandle = ia_cmc_parser_init_v1(aiqbData, nvmData);
++    LOG1("@%s, mHandle:%p", __func__, mHandle);
++
++    return true;
++}
++
++ia_cmc_t* IntelCmc::getCmc() const {
++    LOG1("@%s, mHandle:%p", __func__, mHandle);
++
++    return mHandle;
++}
++
++uintptr_t IntelCmc::getCmcHandle() const {
++    LOG1("@%s", __func__);
++
++    return reinterpret_cast<uintptr_t>(mHandle);
++}
++
++void IntelCmc::deinit() {
++    LOG1("@%s", __func__);
++    CheckError(!mHandle, VOID_VALUE, "mHandle is nullptr");
++
++    ia_cmc_parser_deinit(mHandle);
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
+new file mode 100644
+index 000000000000..3a338d1d1936
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
+@@ -0,0 +1,38 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_cmc_parser.h>
++#include <ia_cmc_types.h>
++
++namespace icamera {
++class IntelCmc {
++ public:
++    IntelCmc();
++    ~IntelCmc();
++
++    bool init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData);
++
++    ia_cmc_t* getCmc() const;
++    uintptr_t getCmcHandle() const;
++
++    void deinit();
++
++ private:
++    ia_cmc_t* mHandle;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
+new file mode 100644
+index 000000000000..4b066173d89e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
+@@ -0,0 +1,186 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelDvs"
++
++#include "modules/algowrapper/IntelDvs.h"
++
++#include "AiqUtils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelDvs::IntelDvs() {
++    LOG1("@%s", __func__);
++}
++
++IntelDvs::~IntelDvs() {
++    LOG1("@%s", __func__);
++}
++
++ia_err IntelDvs::init(const ia_binary_data& aiqTuningBinary, const ia_cmc_t* cmc,
++                      ia_dvs_state** dvsHandle) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_init(dvsHandle, &aiqTuningBinary, cmc);
++    CheckError(err != ia_err_none, ia_err_general, "@%s, Failed to init dvs lib", __func__);
++    return err;
++}
++
++void IntelDvs::deinit(ia_dvs_state* dvsHandle) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_dvs_deinit(dvsHandle);
++}
++
++ia_err IntelDvs::config(ia_dvs_state* dvsHandle, ia_dvs_configuration* config, float zoomRatio) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(!config, ia_err_general, "@%s, config is nullptr", __func__);
++
++    ia_err err = ia_dvs_config(dvsHandle, config, zoomRatio);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_config fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::setNonBlankRatio(ia_dvs_state* dvsHandle, float nonBlankingRatio) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_non_blank_ratio(dvsHandle, nonBlankingRatio);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_non_blank_ratio fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state* dvsHandle, ia_dvs_zoom_mode zoomMode) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_digital_zoom_mode(dvsHandle, zoomMode);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_mode fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state* dvsHandle, ia_rectangle* zoomRegion) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(!zoomRegion, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_digital_zoom_region(dvsHandle, zoomRegion);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_region fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state* dvsHandle, ia_coordinate* zoomCoordinate) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(!zoomCoordinate, ia_err_general, "@%s, zoomCoordinate is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_digital_zoom_coordinate(dvsHandle, zoomCoordinate);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_coordinate fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state* dvsHandle, float zoomRatio) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_digital_zoom_magnitude(dvsHandle, zoomRatio);
++    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_magnitude fails", __func__);
++    return err;
++}
++
++void IntelDvs::freeMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable) {
++    LOG1("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
++    CheckError(!morphTable, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
++
++    ia_dvs_free_morph_table(morphTable);
++}
++
++ia_dvs_morph_table* IntelDvs::allocateMorphTalbe(ia_dvs_state* dvsHandle) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, nullptr, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_dvs_morph_table* morphTable = nullptr;
++    ia_err err = ia_dvs_allocate_morph_table(dvsHandle, &morphTable);
++    CheckError((!morphTable || err != ia_err_none), nullptr,
++               "@%s, ia_dvs_allocate_morph_table fails", __func__);
++    return morphTable;
++}
++
++int IntelDvs::getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable) {
++    LOG2("@%s", __func__);
++    CheckError(!dvsHandle, UNKNOWN_ERROR, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(!morphTable, UNKNOWN_ERROR, "@%s, morphTable is nullptr", __func__);
++
++    ia_err err = ia_dvs_get_morph_table(dvsHandle, morphTable);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, ia_dvs_get_morph_table fails, err:%d",
++               __func__, err);
++
++    return OK;
++}
++
++int IntelDvs::getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable,
++                            DvsResult* result) {
++    LOG2("@%s", __func__);
++
++    int ret = getMorphTable(dvsHandle, morphTable);
++    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, getMorphTable fails", __func__);
++
++    ret = DvsResult::deepCopyDvsResults(*morphTable, &result->mMorphTable);
++    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails", __func__);
++
++    return OK;
++}
++
++ia_err IntelDvs::setStatistics(ia_dvs_state* dvsHandle, const ia_dvs_statistics* statistics,
++                               const ia_aiq_ae_results* aeResults,
++                               const ia_aiq_af_results* afResults,
++                               const ia_aiq_sensor_events* sensorEvents, uint64_t frameReadoutStart,
++                               uint64_t frameReadoutEnd) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_set_statistics(dvsHandle, statistics, aeResults, afResults, sensorEvents,
++                                       frameReadoutStart, frameReadoutEnd);
++    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_set_statistics fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::execute(ia_dvs_state* dvsHandle, uint16_t focusPosition) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    ia_err err = ia_dvs_execute(dvsHandle, focusPosition);
++    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_execute fails", __func__);
++    return err;
++}
++
++ia_err IntelDvs::getImageTransformation(ia_dvs_state* dvsHandle,
++                                        ia_dvs_image_transformation* imageTransformation) {
++    LOG1("@%s", __func__);
++    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(!imageTransformation, ia_err_general, "@%s, imageTransformation is nullptr",
++               __func__);
++
++    ia_err err = ia_dvs_get_image_transformation(dvsHandle, imageTransformation);
++    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_get_image_transformation fails",
++               __func__);
++    return err;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
+new file mode 100644
+index 000000000000..f31b391aa72b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_dvs.h>
++#include <ia_dvs_types.h>
++#include <ia_isp_bxt.h>
++
++#include "CameraEvent.h"
++#include "DvsResult.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++
++namespace icamera {
++class IntelDvs {
++ public:
++    IntelDvs();
++    ~IntelDvs();
++
++    ia_err init(const ia_binary_data& aiqTuningBinary, const ia_cmc_t* cmc,
++                ia_dvs_state** dvsHandle);
++    void deinit(ia_dvs_state* dvsHandle);
++    ia_err config(ia_dvs_state* dvsHandle, ia_dvs_configuration* config, float zoomRatio);
++    ia_err setNonBlankRatio(ia_dvs_state* dvsHandle, float nonBlankingRatio);
++    ia_err setDigitalZoomMode(ia_dvs_state* dvsHandle, ia_dvs_zoom_mode zoomMode);
++    ia_err setDigitalZoomRegion(ia_dvs_state* dvsHandle, ia_rectangle* zoomRegion);
++    ia_err setDigitalZoomCoordinate(ia_dvs_state* dvsHandle, ia_coordinate* zoomCoordinate);
++    ia_err setDigitalZoomMagnitude(ia_dvs_state* dvsHandle, float zoomRatio);
++    void freeMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable);
++    ia_dvs_morph_table* allocateMorphTalbe(ia_dvs_state* dvsHandle);
++    int getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable);
++    int getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable, DvsResult* result);
++    ia_err setStatistics(ia_dvs_state* dvsHandle, const ia_dvs_statistics* statistics,
++                         const ia_aiq_ae_results* aeResults, const ia_aiq_af_results* afResults,
++                         const ia_aiq_sensor_events* sensorEvents, uint64_t frameReadoutStart,
++                         uint64_t frameReadoutEnd);
++    ia_err execute(ia_dvs_state* dvsHandle, uint16_t focusPosition);
++    ia_err getImageTransformation(ia_dvs_state* dvsHandle,
++                                  ia_dvs_image_transformation* imageTransformation);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
+new file mode 100644
+index 000000000000..78fb986f4dae
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
+@@ -0,0 +1,141 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelFaceDetection"
++#include "modules/algowrapper/IntelFaceDetection.h"
++
++#include <string.h>
++
++#include <algorithm>
++
++#include "AiqUtils.h"
++#include "PlatformData.h"
++#include "iutils/CameraLog.h"
++
++namespace icamera {
++IntelFaceDetection::IntelFaceDetection() : mFDHandle(nullptr), mMaxFacesNum(0) {
++    LOG1("@%s", __func__);
++}
++
++IntelFaceDetection::~IntelFaceDetection() {
++    LOG1("@%s", __func__);
++}
++
++status_t IntelFaceDetection::init(FaceDetectionInitParams* pData, int dataSize) {
++    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "pData is nullptr");
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)), UNKNOWN_ERROR,
++               "buffer is small");
++
++    mMaxFacesNum = std::min(pData->max_face_num, static_cast<unsigned int>(MAX_FACES_DETECTABLE));
++    LOG2("@%s, mMaxFacesNum:%d", __func__, mMaxFacesNum);
++
++    pvl_err faceRet = pvl_face_detection_create(nullptr, &mFDHandle);
++    if (faceRet == pvl_success) {
++        return OK;
++    }
++
++    LOGE("@%s, faceRet:%d", __func__, faceRet);
++    return UNKNOWN_ERROR;
++}
++
++status_t IntelFaceDetection::deinit() {
++    LOG1("@%s", __func__);
++
++    if (mFDHandle) {
++        pvl_face_detection_destroy(mFDHandle);
++        mFDHandle = nullptr;
++    }
++    return OK;
++}
++
++void IntelFaceDetection::convertCoordinate(int faceId, int width, int height, const pvl_rect& src,
++                                           pvl_rect* dst) {
++    CheckError(!dst, VOID_VALUE, "dst is nullptr");
++
++    const camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
++                                                     IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
++    const camera_coordinate_system_t faceCoordinate = {0, 0, width, height};
++
++    camera_coordinate_t topLeft =
++        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.left, src.top});
++    camera_coordinate_t bottomRight =
++        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.right, src.bottom});
++
++    *dst = {topLeft.x, topLeft.y, bottomRight.x, bottomRight.y};
++    LOG2("@%s, face:%d, dst left:%d, top:%d, right:%d, bottom:%d", __func__, faceId, dst->left,
++         dst->top, dst->right, dst->bottom);
++}
++
++FaceDetectionRunParams* IntelFaceDetection::prepareRunBuffer(unsigned int index) {
++    LOG1("@%s", __func__);
++    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr, "@%s, index is error %d", __func__,
++               index);
++    CheckError(!mFDHandle, nullptr, "mFDHandle is nullptr");
++
++    return &mMemRunBufs[index];
++}
++
++status_t IntelFaceDetection::run(pvl_image* pImage, FaceDetectionResult* fdResults) {
++    LOG1("@%s, pImage:%p", __func__, pImage);
++    CheckError(!pImage, UNKNOWN_ERROR, "pData is nullptr");
++    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
++
++    int32_t fdRet =
++        pvl_face_detection_run_in_preview(mFDHandle, pImage, fdResults->faceResults, mMaxFacesNum);
++    fdResults->faceNum = (fdRet > 0) ? fdRet : 0;
++    LOG1("@%s, fdRet:%d, detected face number:%d, w:%d, h:%d", __func__, fdRet, fdResults->faceNum,
++         pImage->width, pImage->height);
++    for (int i = 0; i < fdResults->faceNum; i++) {
++        LOG2("@%s, face:%d rect, left:%d, top:%d, right:%d, bottom:%d", __func__, i,
++             fdResults->faceResults[i].rect.left, fdResults->faceResults[i].rect.top,
++             fdResults->faceResults[i].rect.right, fdResults->faceResults[i].rect.bottom);
++        LOG2("@%s, confidence:%d, rip_angle:%d, rop_angle:%d, tracking_id:%d", __func__,
++             fdResults->faceResults[i].confidence, fdResults->faceResults[i].rip_angle,
++             fdResults->faceResults[i].rop_angle, fdResults->faceResults[i].tracking_id);
++    }
++
++    for (int i = 0; i < fdResults->faceNum; i++) {
++        convertCoordinate(i, pImage->width, pImage->height, fdResults->faceResults[i].rect,
++                          &fdResults->faceResults[i].rect);
++    }
++
++    return OK;
++}
++
++status_t IntelFaceDetection::run(FaceDetectionRunParams* fdRunParams, int dataSize, void* addr) {
++    LOG1("@%s, fdRunParams:%p, dataSize:%d, addr:%p", __func__, fdRunParams, dataSize, addr);
++    CheckError(!fdRunParams, UNKNOWN_ERROR, "pData is nullptr");
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)), UNKNOWN_ERROR,
++               "buffer is small");
++    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
++
++    pvl_image image;
++    image.size = fdRunParams->size;
++    image.width = fdRunParams->width;
++    image.height = fdRunParams->height;
++    image.format = fdRunParams->format;
++    image.stride = fdRunParams->stride;
++    image.rotation = fdRunParams->rotation;
++    if (addr) {
++        image.data = const_cast<uint8_t*>(static_cast<uint8_t*>(addr));
++    } else {
++        image.data = const_cast<uint8_t*>(fdRunParams->data);
++    }
++
++    return run(&image, &fdRunParams->results);
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
+new file mode 100644
+index 000000000000..da738efa5a96
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++#include <memory>
++
++#include "FaceBase.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++class IntelFaceDetection {
++ public:
++    IntelFaceDetection();
++    ~IntelFaceDetection();
++
++    status_t init(FaceDetectionInitParams* initData, int dataSize);
++    status_t deinit();
++    status_t run(pvl_image* pImage, FaceDetectionResult* fdResults);
++    status_t run(FaceDetectionRunParams* fdRunParams, int dataSize, void* addr = nullptr);
++    FaceDetectionRunParams* prepareRunBuffer(unsigned int index);
++
++ private:
++    pvl_face_detection* mFDHandle;
++    unsigned int mMaxFacesNum;
++    FaceDetectionRunParams mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
++    void convertCoordinate(int faceId, int width, int height, const pvl_rect& src, pvl_rect* dst);
++
++    DISALLOW_COPY_AND_ASSIGN(IntelFaceDetection);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
+new file mode 100644
+index 000000000000..84c92ed9bf80
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
+@@ -0,0 +1,140 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelIspParamAdaptor"
++
++#include "modules/algowrapper/IntelIspParamAdaptor.h"
++
++#include "iutils/CameraLog.h"
++
++namespace icamera {
++
++IntelIspParamAdaptor::IntelIspParamAdaptor() {
++    LOG2("@%s", __func__);
++}
++
++IntelIspParamAdaptor::~IntelIspParamAdaptor() {
++    LOG2("@%s", __func__);
++}
++
++ia_isp_bxt* IntelIspParamAdaptor::init(const ia_binary_data* ispData, const ia_cmc_t* iaCmc,
++                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
++                                       unsigned int maxNumStatsIn, ia_mkn* iaMkn) {
++    LOG2("@%s", __func__);
++    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
++    LOG1("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u", __func__,
++         ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
++
++    return ia_isp_bxt_init(ispData, iaCmc, maxStatsWidth, maxStatsHeight, maxNumStatsIn, iaMkn);
++}
++
++void IntelIspParamAdaptor::deInit(ia_isp_bxt* ispBxtHandle) {
++    LOG2("@%s", __func__);
++    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
++
++    ia_isp_bxt_deinit(ispBxtHandle);
++}
++
++int IntelIspParamAdaptor::getPalDataSize(ia_isp_bxt_program_group* programGroup) {
++    LOG2("@%s", __func__);
++    CheckError(!programGroup, -1, "%s programGroup is nullptr", __func__);
++
++    return ia_isp_bxt_get_output_size(programGroup);
++}
++
++void IntelIspParamAdaptor::freePalBuffer(void* addr) {
++    LOG2("@%s addr: %p", __func__, addr);
++    free(addr);
++}
++
++void* IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
++    LOG2("@%s index: %d, streamId: %d, size: %d", __func__, index, streamId, palDataSize);
++
++    return calloc(1, palDataSize);
++}
++
++status_t IntelIspParamAdaptor::runPal(ia_isp_bxt* ispBxtHandle,
++                                      const ia_isp_bxt_input_params_v2* inputParams,
++                                      ia_binary_data* outputData) {
++    LOG2("@%s", __func__);
++    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
++               "%s, ispBxtHandle or inputParams is nullptr", __func__);
++    CheckError((!outputData || !outputData->data || outputData->size <= 0), UNKNOWN_ERROR,
++               "%s, Wrong pal data buffer", __func__);
++
++    ia_err ret = ia_isp_bxt_run_v2(ispBxtHandle, inputParams, outputData);
++    CheckError(ret != ia_err_none, UNKNOWN_ERROR, "%s, isp parameters adaptor run failed %d",
++               __func__, ret);
++    LOG1("%s, The pal result size: %d", __func__, outputData->size);
++
++    return OK;
++}
++
++status_t IntelIspParamAdaptor::queryAndConvertStats(ia_isp_bxt* ispBxtHandle,
++                                                    ConvertInputParam* inputParams,
++                                                    ConvertResult* result) {
++    LOG2("@%s", __func__);
++    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
++    CheckError(!inputParams || !result, UNKNOWN_ERROR, "%s, inputParams or result nullptr",
++               __func__);
++    CheckError(!inputParams->dvsReso || !inputParams->aeResults, UNKNOWN_ERROR,
++               "%s, inputParams or result nullptr", __func__);
++    CheckError((!inputParams->statsBuffer || !inputParams->statsBuffer->data ||
++                inputParams->statsBuffer->size <= 0),
++               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
++    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
++
++    ia_err ret =
++        ia_isp_bxt_statistics_query(ispBxtHandle, inputParams->statsBuffer, result->queryResults);
++    CheckError(ret != ia_err_none, UNKNOWN_ERROR, "%s, Query statistice failed %d", __func__, ret);
++
++    // Decode DVS statistics
++    if (result->queryResults->dvs_stats) {
++        if (inputParams->dvsReso->width == 0 || inputParams->dvsReso->height == 0) {
++            LOGW("%s, The gdc resolution for DVS isn't correct", __func__);
++        } else {
++            ret = ia_isp_bxt_statistics_convert_dvs_from_binary(
++                ispBxtHandle, inputParams->statsBuffer, inputParams->dvsReso->width,
++                inputParams->dvsReso->height, &(result->dvsStats));
++            CheckWarning((ret != ia_err_none || !result->dvsStats), UNKNOWN_ERROR,
++                         "%s, Failed to convert DVS statistics %d", __func__, ret);
++            LOG3A("%s, DVS stat vector_count: %u", __func__, result->dvsStats->vector_count);
++        }
++    }
++
++    // Decode psa rgbs and af statistics
++    if (result->queryResults->rgbs_grid && result->queryResults->af_grid &&
++        !inputParams->multiExpo) {
++        ret = ia_isp_bxt_statistics_convert_awb_from_binary_v3(
++            ispBxtHandle, inputParams->statsBuffer, nullptr, inputParams->aeResults,
++            inputParams->bcompResult, result->rgbsGrid, nullptr);
++
++        ia_aiq_rgbs_grid* rgbs = *(result->rgbsGrid);
++        CheckWarning((ret != ia_err_none || !rgbs), UNKNOWN_ERROR,
++                     "%s, Failed to convert psa RGBS statistics %d", __func__, ret);
++        LOG3A("%s, RGBS stat grid %dx%d", __func__, rgbs->grid_width, rgbs->grid_height);
++
++        ret = ia_isp_bxt_statistics_convert_af_from_binary(ispBxtHandle, inputParams->statsBuffer,
++                                                           &(result->afGrid));
++        CheckWarning((ret != ia_err_none || !result->afGrid), UNKNOWN_ERROR,
++                     "%s, Failed to convert psa AF statistics %d", __func__, ret);
++        LOG3A("%s, AF stat grid %dx%d", __func__, result->afGrid->grid_width,
++              result->afGrid->grid_height);
++    }
++
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
+new file mode 100644
+index 000000000000..564fe37a95fa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "modules/algowrapper/StatsTypes.h"
++
++namespace icamera {
++
++class IntelIspParamAdaptor {
++ public:
++    IntelIspParamAdaptor();
++    virtual ~IntelIspParamAdaptor();
++
++    ia_isp_bxt* init(const ia_binary_data* ispData, const ia_cmc_t* iaCmc,
++                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
++                     unsigned int maxNumStatsIn, ia_mkn* iaMkn);
++    void deInit(ia_isp_bxt* ispBxtHandle);
++    int getPalDataSize(ia_isp_bxt_program_group* programGroup);
++
++    void* allocatePalBuffer(int streamId, int index, int palDataSize);
++    void freePalBuffer(void* addr);
++    status_t runPal(ia_isp_bxt* ispBxtHandle, const ia_isp_bxt_input_params_v2* inputParams,
++                    ia_binary_data* outputData);
++    status_t queryAndConvertStats(ia_isp_bxt* ispBxtHandle, ConvertInputParam* inputParams,
++                                  ConvertResult* result);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
+new file mode 100644
+index 000000000000..084a6859fcee
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelLard"
++
++#include "modules/algowrapper/IntelLard.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLard::IntelLard() {
++    LOG1("@%s", __func__);
++}
++
++IntelLard::~IntelLard() {
++    LOG1("@%s", __func__);
++}
++
++ia_lard* IntelLard::init(const ia_binary_data* lard_data_ptr) {
++    LOG1("@%s", __func__);
++    CheckError(!lard_data_ptr, nullptr, "lard_data_ptr is nullptr");
++    LOG1("@%s, lard_data_ptr, data:%p, size:%d", __func__, lard_data_ptr->data,
++         lard_data_ptr->size);
++
++    ia_lard* lard = ia_lard_init(lard_data_ptr);
++    LOG1("@%s, lard:%p", __func__, lard);
++
++    return lard;
++}
++
++ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag, unsigned int* num_tags,
++                             const unsigned int** tags) {
++    LOG1("@%s", __func__);
++    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
++    CheckError(!num_tags, ia_err_general, "num_tags is nullptr");
++    CheckError(!tags, ia_err_general, "tags is nullptr");
++
++    return ia_lard_get_tag_list(ia_lard_ptr, mode_tag, num_tags, tags);
++}
++
++ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
++                      ia_lard_results** lard_results_ptr) {
++    LOG1("@%s", __func__);
++    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
++    CheckError(!lard_input_params_ptr, ia_err_general, "lard_input_params_ptr is nullptr");
++    CheckError(!lard_results_ptr, ia_err_general, "lard_results_ptr is nullptr");
++
++    return ia_lard_run(ia_lard_ptr, lard_input_params_ptr, lard_results_ptr);
++}
++
++void IntelLard::deinit(ia_lard* ia_lard_ptr) {
++    LOG1("@%s", __func__);
++    CheckError(!ia_lard_ptr, VOID_VALUE, "ia_lard_ptr is nullptr");
++
++    ia_lard_deinit(ia_lard_ptr);
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
+new file mode 100644
+index 000000000000..fa9d99d13098
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
+@@ -0,0 +1,34 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_lard.h>
++
++namespace icamera {
++class IntelLard {
++ public:
++    IntelLard();
++    ~IntelLard();
++
++    ia_lard* init(const ia_binary_data* lard_data_ptr);
++    ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag, unsigned int* num_tags,
++                      const unsigned int** tags);
++    ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
++               ia_lard_results** lard_results_ptr);
++    void deinit(ia_lard* ia_lard_ptr);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
+new file mode 100644
+index 000000000000..dc4102c36c2a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
+@@ -0,0 +1,64 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelLtm"
++
++#include "modules/algowrapper/IntelLtm.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLtm::IntelLtm() {
++    LOG1("@%s", __func__);
++}
++
++IntelLtm::~IntelLtm() {
++    LOG1("@%s", __func__);
++}
++
++ia_ltm* IntelLtm::init(const ia_binary_data* lard_data_ptr, ia_mkn* mkn) {
++    LOG1("%s", __func__);
++    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
++
++    ia_ltm* ltm = ia_ltm_init(lard_data_ptr, mkn);
++    CheckError(!ltm, nullptr, "@%s, ia_ltm_init fails", __func__);
++
++    return ltm;
++}
++
++void IntelLtm::deinit(ia_ltm* ltm) {
++    LOG1("%s", __func__);
++    CheckError(!ltm, VOID_VALUE, "@%s, ltm is null", __func__);
++
++    ia_ltm_deinit(ltm);
++}
++
++ia_err IntelLtm::run(ia_ltm* ltm, const ia_ltm_input_params* inputParams,
++                     ia_ltm_results** ltmResults, ia_ltm_drc_params** drcResults) {
++    LOG1("%s", __func__);
++    CheckError(!ltm, ia_err_general, "@%s, ltm is null", __func__);
++    CheckError(!inputParams, ia_err_general, "@%s, inputParams is null", __func__);
++    CheckError(!ltmResults, ia_err_general, "@%s, ltmResults is null", __func__);
++    CheckError(!drcResults, ia_err_general, "@%s, drcResults is null", __func__);
++
++    ia_err ret = ia_ltm_run(ltm, inputParams, ltmResults, drcResults);
++
++    return ret;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
+new file mode 100644
+index 000000000000..f6f280b93ed5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_ltm.h>
++
++namespace icamera {
++class IntelLtm {
++ public:
++    IntelLtm();
++    virtual ~IntelLtm();
++
++    ia_ltm* init(const ia_binary_data* lard_data_ptr, ia_mkn* mkn);
++    ia_err run(ia_ltm* ltm, const ia_ltm_input_params* inputParams, ia_ltm_results** ltmResults,
++               ia_ltm_drc_params** drcResults);
++    void deinit(ia_ltm* ltm);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
+new file mode 100644
+index 000000000000..041c277c0380
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
+@@ -0,0 +1,69 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelMkn"
++
++#include "modules/algowrapper/IntelMkn.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelMkn::IntelMkn() {
++    LOG1("%s", __func__);
++}
++
++IntelMkn::~IntelMkn() {
++    LOG1("%s", __func__);
++}
++
++ia_mkn* IntelMkn::init(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                       size_t mkn_section_2_size) {
++    LOG1("%s", __func__);
++
++    return ia_mkn_init(mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
++}
++
++int IntelMkn::enable(ia_mkn* pMkn, bool enable_data_collection) {
++    LOG1("%s", __func__);
++    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
++
++    ia_err err = ia_mkn_enable(pMkn, enable_data_collection);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, call ia_mkn_enable() fails", __func__);
++
++    return OK;
++}
++
++void IntelMkn::deinit(ia_mkn* pMkn) {
++    LOG1("%s", __func__);
++    CheckError(!pMkn, VOID_VALUE, "@%s, pMkn is null", __func__);
++
++    ia_mkn_uninit(pMkn);
++}
++
++int IntelMkn::prepare(ia_mkn* pMkn, ia_mkn_trg data_target, ia_binary_data* binaryData) {
++    LOG1("%s", __func__);
++    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
++
++    *binaryData = ia_mkn_prepare(pMkn, data_target);
++    CheckError(binaryData->size == 0 || binaryData->data == nullptr, NO_MEMORY,
++               "@%s, binaryData->size:%d, binaryData->data:%p, error!", __func__, binaryData->size,
++               binaryData->data);
++
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
+new file mode 100644
+index 000000000000..72133f4c1ffc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
+@@ -0,0 +1,35 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_mkn_encoder.h>
++#include <ia_mkn_types.h>
++
++namespace icamera {
++class IntelMkn {
++ public:
++    IntelMkn();
++    ~IntelMkn();
++
++    ia_mkn* init(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                 size_t mkn_section_2_size);
++    void deinit(ia_mkn* pMkn);
++    int prepare(ia_mkn* pMkn, ia_mkn_trg data_target, ia_binary_data* binaryData);
++    int enable(ia_mkn* pMkn, bool enable_data_collection);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
+new file mode 100644
+index 000000000000..ca254361cc32
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
+@@ -0,0 +1,1196 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelPGParam"
++
++#include "modules/algowrapper/IntelPGParam.h"
++
++#include <algorithm>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelPGParam::IntelPGParam(int pgId)
++        : mPgId(pgId),
++          mTerminalCount(0),
++          mFragmentCount(0),
++          mFragmentDesc(nullptr),
++          mFragmentConfig(nullptr),
++          mP2pHandle(nullptr),
++          mPgManifest(nullptr),
++          mProcessGroup(nullptr),
++          mProgramControlInitTerminalIndex(-1),
++          mProcessGroupMemory(nullptr) {
++    CLEAR(mP2pCacheBuffer);
++    CLEAR(mPgReqs);
++    CLEAR(mParamPayloads);
++}
++
++IntelPGParam::~IntelPGParam() {
++    if (mFragmentDesc) {
++        delete[] mFragmentDesc;
++    }
++    if (mFragmentConfig) {
++        delete mFragmentConfig;
++    }
++
++    for (int i = 0; i < mTerminalCount; i++) {
++        if (mPgReqs.terminals[i].kernelOrder) {
++            delete[] mPgReqs.terminals[i].kernelOrder;
++        }
++    }
++
++    destroyPayloads();
++    destroyPGBuffer();
++}
++
++int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
++    mP2pHandle = ia_p2p_init(platform);
++    CheckError(!mP2pHandle, UNKNOWN_ERROR, "ia_p2p_init has failed");
++
++    mP2pCacheBuffer.size = ia_p2p_get_cache_buffer_size(mP2pHandle);
++    mP2pCacheBuffer.data = CIPR::callocMemory(1, mP2pCacheBuffer.size);
++    LOG1("%s: mP2pCacheBuffer.size=%d", __func__, mP2pCacheBuffer.size);
++    CheckError(!mP2pCacheBuffer.data, UNKNOWN_ERROR, "Failed to allocate P2P cache buffer.");
++
++    mPgManifest = pgConfig.pgManifest;
++    mDisableDataTermials = pgConfig.disableDataTermials;
++    mTerminalCount = ia_css_program_group_manifest_get_terminal_count(mPgManifest);
++
++    mFragmentCount = pgConfig.fragmentCount;
++    mInputMainFrame = pgConfig.inputMainFrame;
++    mOutputMainFrame = pgConfig.outputMainFrame;
++
++    return OK;
++}
++
++int IntelPGParam::calcFragmentDescriptors(int fragmentCount, const PgFrameDesc& inputMainFrame,
++                                          const PgFrameDesc& outputMainFrame,
++                                          const ia_css_rbm_t* rbm) {
++    if (mFragmentDesc) {
++        delete[] mFragmentDesc;
++        mFragmentDesc = nullptr;
++    }
++
++    delete mFragmentConfig;
++    mFragmentConfig = nullptr;
++
++    mFragmentDesc = new ia_p2p_fragment_desc[FRAG_TERM_TYPE_COUNT * fragmentCount];
++    memset(mFragmentDesc, 0x0, sizeof(ia_p2p_fragment_desc) * FRAG_TERM_TYPE_COUNT * fragmentCount);
++    if (fragmentCount <= 1) {
++        ia_p2p_fragment_desc desc;
++        desc.fragment_width = inputMainFrame.width;
++        desc.fragment_height = inputMainFrame.height;
++        desc.fragment_start_x = 0;
++        desc.fragment_start_y = 0;
++        for (int i = 0; i < FRAG_TERM_TYPE_COUNT; i++) {
++            mFragmentDesc[i] = desc;
++        }
++    }
++
++    mFragmentConfig = new ia_p2p_fragment_configuration_t;
++    CLEAR(*mFragmentConfig);
++    int ret = ia_p2p_calculate_fragments_rbm(mP2pHandle, mPgId, (unsigned int)fragmentCount, rbm,
++                                             nullptr,  // only for IA_P2P_PLATFORM_IPU6 now
++                                             mFragmentConfig);
++
++    dumpFragmentDesc(fragmentCount);
++    return ret;
++}
++
++static int kernel_id_ffs(ia_css_kernel_bitmap_t bitmap) {
++    int n = 0;
++    if (ia_css_is_kernel_bitmap_empty(bitmap)) return -1;
++    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)n)) n++;
++    return n;
++}
++
++int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
++    CheckError(descCount < mTerminalCount * mFragmentCount, BAD_VALUE, "descCount is small",
++               descCount);
++
++    int descLen = sizeof(ia_p2p_fragment_desc) * mFragmentCount;
++    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    for (int i = 0; i < terminalCount; i++) {
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
++        CheckError(!terminal, BAD_VALUE, "terminal is nullptr");
++
++        int termIdx = terminal->tm_index;
++        if ((mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_OUT) &&
++            (mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_IN)) {
++            continue;
++        }
++
++        if (mFragmentConfig) {
++            int kernelId = kernel_id_ffs(mPgReqs.terminals[termIdx].kernelBitmap);
++            CheckError((kernelId < 0 || kernelId >= IA_CSS_KERNEL_BITMAP_BITS), -1,
++                       "error terminal %d", termIdx);
++            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
++                     mFragmentConfig->pixel_fragment_descs[kernelId], descLen);
++            LOG2("PG %d: Terminal %d: selected fragment desc (<%d,%d> %dx%d) with kernel id %d",
++                 mPgId, termIdx, descs[termIdx].fragment_start_x, descs[termIdx].fragment_start_y,
++                 descs[termIdx].fragment_width, descs[termIdx].fragment_height, kernelId);
++        } else {
++            /* PG uses legacy fragment calculation logic */
++            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
++                     mPgReqs.terminals[termIdx].fragment_descs, descLen);
++            LOG2("PG %d: Terminal %d: selected legacy fragment descriptor (<%d,%d> %dx%d)", mPgId,
++                 termIdx, descs[termIdx].fragment_start_x, descs[termIdx].fragment_start_y,
++                 descs[termIdx].fragment_width, descs[termIdx].fragment_height);
++        }
++    }
++    return mFragmentCount;
++}
++
++int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
++                          ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize) {
++    CheckError(ipuParameters == nullptr || bitmap == nullptr, BAD_VALUE,
++               "The input paramter is nullptr.");
++
++    ia_css_terminal_type_t terminalType;
++    int8_t termIndex;
++    int kernelId = 0;
++
++    ia_err err = ia_p2p_parse(mP2pHandle, ipuParameters, mP2pCacheBuffer.data);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
++
++    int ret = calcFragmentDescriptors(mFragmentCount, mInputMainFrame, mOutputMainFrame, rbm);
++    CheckError(ret != OK, ret, "Failed to calc fragment desc.");
++
++    int outputDataTerminalCount = FRAG_TERM_TYPE_OUTPUT_START;
++    for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
++        ia_css_terminal_manifest_t* terminalManifest =
++            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)termIndex);
++        CheckError(!terminalManifest, css_err_internal, "No terminal manifest for terminal %d",
++                   termIndex);
++
++        terminalType = ia_css_terminal_manifest_get_type(terminalManifest);
++        mPgReqs.terminals[termIndex].type = terminalType;
++        mPgReqs.terminals[termIndex].kernelOrder = nullptr;
++        size_t kernelInfoSize = PSYS_MAX_KERNELS_PER_PG * sizeof(IpuPgTerminalKernelInfo);
++
++        switch (terminalType) {
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
++                ia_css_param_terminal_manifest_t* paramMani =
++                    reinterpret_cast<ia_css_param_terminal_manifest_t*>(terminalManifest);
++                mPgReqs.terminals[termIndex].kernelOrder =
++                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
++                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
++                ret = getKernelOrderForParamCachedInTerm(paramMani,
++                                                         mPgReqs.terminals[termIndex].kernelOrder);
++                CheckError(ret != css_err_none, ret, "getKernelOrderForParamCachedInTerm failed");
++                break;
++            }
++            case IA_CSS_TERMINAL_TYPE_PROGRAM: {
++                ia_css_program_terminal_manifest_t* proMani =
++                    reinterpret_cast<ia_css_program_terminal_manifest_t*>(terminalManifest);
++                mPgReqs.terminals[termIndex].kernelOrder =
++                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
++                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
++                ret =
++                    getKernelOrderForProgramTerm(proMani, mPgReqs.terminals[termIndex].kernelOrder);
++                CheckError(ret != css_err_none, ret, "getKernelOrderForProgramTerm failed");
++                break;
++            }
++            case IA_CSS_TERMINAL_TYPE_DATA_IN: {
++                ia_css_data_terminal_manifest_t* dataMani =
++                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
++                /**
++                 *Save the kernel bitmaps so that it can later be determined
++                 * whether the terminals are disabled or not.
++                 */
++                mPgReqs.terminals[termIndex].kernelBitmap =
++                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
++                if (!mFragmentConfig) {
++                    mPgReqs.terminals[termIndex].fragment_descs =
++                        &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount];
++                }
++                break;
++            }
++            case IA_CSS_TERMINAL_TYPE_DATA_OUT: {
++                ia_css_data_terminal_manifest_t* dataMani =
++                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
++                /**
++                 * Save the kernel bitmaps so that it can later be determined
++                 * whether the terminals are disabled or not.
++                 */
++                mPgReqs.terminals[termIndex].kernelBitmap =
++                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
++                if (!mFragmentConfig) {
++                    mPgReqs.terminals[termIndex].fragment_descs =
++                        &mFragmentDesc[outputDataTerminalCount * mFragmentCount];
++                    outputDataTerminalCount++;
++                }
++                break;
++            }
++            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
++                ia_css_spatial_param_terminal_manifest_t* paramMani =
++                    reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>(terminalManifest);
++                kernelId = (int32_t)(paramMani->kernel_id);
++                mPgReqs.terminals[termIndex].kernelBitmap =
++                    ia_css_kernel_bit_mask((uint32_t)kernelId);
++                break;
++            }
++            case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++                /* Calculate the payload later when the final bitmask is known,
++                 * in imaging_pipe_ctrl_identify_property, where it is actually
++                 * needed. Just save here the index to the terminal. */
++                mProgramControlInitTerminalIndex = termIndex;
++                break;
++            default:
++                break;
++        }
++    }
++
++    mPgReqs.terminalCount = mTerminalCount;
++
++    ia_css_kernel_bitmap_t kernelBitmap = ia_p2p_get_kernel_bitmap(mP2pHandle, mPgId);
++    kernelBitmap = ia_css_kernel_bitmap_intersection(
++        kernelBitmap, ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest));
++
++    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
++        kernelId = getKernelIdByBitmap(kernelBitmap);
++        CheckError((kernelId < 0 || kernelId >= PSYS_MAX_KERNELS_PER_PG), ia_err_internal,
++                   "kernelId is out of range! %d", kernelId);
++
++        /* Get terminal requirements */
++        ret = ia_p2p_get_kernel_terminal_requirements(mP2pHandle, mPgId, (uint32_t)kernelId,
++                                                      &mKernel.mSections[kernelId]);
++        CheckError(ret != ia_err_none, ret, "%s: failed to get requirements for pg %d kernel %d",
++                   __func__, mPgId, kernelId);
++
++        /* Get payload descriptor */
++        ret = ia_p2p_get_kernel_payload_desc(
++            mP2pHandle, mPgId, (uint32_t)kernelId,
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++            1,
++#else
++            mFragmentCount,
++#endif
++            (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                             : &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount]),
++            &mKernel.mPayloads[kernelId]);
++        CheckError(ret != ia_err_none, ret, "%s: failed to get payload for pg %d kernel %d, ret %d",
++                   __func__, mPgId, kernelId, ret);
++
++        uint8_t kernelOrder = 0;
++        termIndex = -1;
++        if (mKernel.mSections[kernelId].param_in_section_count) {
++            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN;
++
++            /* P2P assumes single CACHED IN, cumulate to first */
++            termIndex = terminalEnumerateByType(&mPgReqs, terminalType, 0);
++            CheckError(termIndex < 0, ia_err_internal, "No PARAM_CACHED_IN according to manifest!");
++            if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
++                if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections !=
++                    mKernel.mSections[kernelId].param_in_section_count) {
++                    LOGW("%s: p2p cached in section count differs (kernel_id:%i p2p:%d vs pg:%d)",
++                         __func__, kernelId, mKernel.mSections[kernelId].param_in_section_count,
++                         mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
++                    /* Overwrite P2P requirements with manifest */
++                    mKernel.mSections[kernelId].param_in_section_count =
++                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
++                    mKernel.mPayloads[kernelId].param_in_payload_size =
++                        std::max(mKernel.mPayloads[kernelId].param_in_payload_size,
++                                 mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
++                    mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
++                }
++                processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
++            }
++        }
++
++        if (mKernel.mSections[kernelId].param_out_section_count_per_fragment) {
++            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
++            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
++                if (mPgReqs.terminals[termIndex].type != terminalType) {
++                    continue;
++                }
++
++                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
++                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
++                }
++            }
++        }
++
++        if (mKernel.mSections[kernelId].program_section_count_per_fragment) {
++            terminalType = IA_CSS_TERMINAL_TYPE_PROGRAM;
++            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
++                if (mPgReqs.terminals[termIndex].type != terminalType) {
++                    continue;
++                }
++                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
++                    if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections !=
++                        mKernel.mSections[kernelId].program_section_count_per_fragment) {
++                        LOGW("%s: p2p program section count differs (kernel_id:%i p2p:%d vs pg:%d)",
++                             __func__, kernelId,
++                             mKernel.mSections[kernelId].program_section_count_per_fragment,
++                             mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
++                        /* Overwrite P2P requirements with manifest */
++                        mKernel.mSections[kernelId].program_section_count_per_fragment =
++                            mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
++                        mKernel.mPayloads[kernelId].program_payload_size =
++                            std::max(mKernel.mPayloads[kernelId].program_payload_size,
++                                     mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
++                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
++                    }
++                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
++                }
++            }
++        }
++
++        /* P2P assumes each spatial kernel parameter has its own terminal */
++        if (mKernel.mSections[kernelId].spatial_param_in_section_count) {
++            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN;
++            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
++                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
++            if (termIndex < 0) {
++                LOG1("%s: No PARAM_SPATIAL_IN for kernel id %d according to manifest!", __func__,
++                     kernelId);
++            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
++                mPgReqs.terminals[termIndex].sectionCount +=
++                    mKernel.mSections[kernelId].spatial_param_in_section_count;
++                mPgReqs.terminals[termIndex].payloadSize +=
++                    mKernel.mPayloads[kernelId].spatial_param_in_payload_size;
++                mPgReqs.terminals[termIndex].kernelBitmap =
++                    ia_css_kernel_bit_mask((uint32_t)kernelId);
++            }
++        }
++
++        if (mKernel.mSections[kernelId].spatial_param_out_section_count) {
++            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
++            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
++                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
++            if (termIndex < 0) {
++                LOG1("%s: No PARAM_SPATIAL_OUT for kernel id %d according to manifest!", __func__,
++                     kernelId);
++            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
++                mPgReqs.terminals[termIndex].sectionCount +=
++                    mKernel.mSections[kernelId].spatial_param_out_section_count;
++                mPgReqs.terminals[termIndex].payloadSize +=
++                    mKernel.mPayloads[kernelId].spatial_param_out_payload_size;
++                mPgReqs.terminals[termIndex].kernelBitmap =
++                    ia_css_kernel_bit_mask((uint32_t)kernelId);
++            }
++        }
++
++        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, (uint32_t)kernelId);
++    }
++
++    /* get all kernel bits back */
++    kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest);
++
++    /* get disabled kernels from p2p and remove them */
++    kernelBitmap = ia_css_kernel_bitmap_intersection(
++        kernelBitmap,
++        ia_css_kernel_bitmap_complement(ia_p2p_get_kernel_disable_bitmap(mP2pHandle, mPgId)));
++
++    /* get disabled data terminal kernels and remove them */
++    for (auto& item : mDisableDataTermials) {
++        ia_css_terminal_manifest_t* terminalManifest =
++            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)item);
++        ia_css_kernel_bitmap_t dataTerminalKernelBitmap =
++            ia_css_data_terminal_manifest_get_kernel_bitmap(
++                reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest));
++        kernelBitmap = ia_css_kernel_bitmap_intersection(
++            kernelBitmap, ia_css_kernel_bitmap_complement(dataTerminalKernelBitmap));
++    }
++
++    /* disable params terminals which payload size are zero */
++    ret = disableZeroSizedTerminals(&kernelBitmap);
++    CheckError(ret != OK, ret, "%s: failed to disable zero size terminals", __func__);
++
++    *bitmap = kernelBitmap;
++
++    if (maxStatsSize) *maxStatsSize = ia_p2p_get_statistics_buffer_size(mP2pHandle);
++    return ret;
++}
++
++void* IntelPGParam::allocatePGBuffer(int pgSize) {
++    destroyPGBuffer();
++    void* memory = CIPR::mallocAlignedMemory(PAGE_ALIGN(pgSize), CIPR::getPageSize());
++    mProcessGroupMemory = reinterpret_cast<ia_css_process_group_t*>(memory);
++    return mProcessGroupMemory;
++}
++
++void IntelPGParam::destroyPGBuffer() {
++    if (mProcessGroupMemory) {
++        CIPR::freeMemory(mProcessGroupMemory);
++        mProcessGroupMemory = nullptr;
++    }
++}
++
++int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
++    CheckError(!pg, UNKNOWN_ERROR, "input pg nullptr!");
++    mProcessGroup = pg;
++
++    int ret = OK;
++    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    for (int i = 0; i < terminalCount; i++) {
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
++        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
++        int termIdx = terminal->tm_index;
++
++        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++            unsigned int payloadSize = 0;
++            ret = pg_control_init_get_payload_size(pg, &payloadSize);
++            CheckError(ret != OK, UNKNOWN_ERROR, "call pg_control_init_get_payload_size fail");
++            mPgReqs.terminals[termIdx].payloadSize = payloadSize;
++
++            ret = pg_control_init_terminal_init(
++                mProcessGroup, reinterpret_cast<ia_css_program_control_init_terminal_t*>(terminal));
++            CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_terminal_init.");
++        }
++
++        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
++            if (mFragmentConfig) {
++                ret = ia_p2p_program_terminal_init_v2(
++                    mP2pHandle, mPgId, mFragmentConfig,
++                    reinterpret_cast<ia_css_program_terminal_t*>(terminal));
++            } else {
++                ret = ia_p2p_program_terminal_init(
++                    mP2pHandle, mPgId, mFragmentCount, mFragmentDesc,
++                    reinterpret_cast<ia_css_program_terminal_t*>(terminal));
++            }
++            CheckError(ret != ia_err_none, ret, "Failed to init program terminal.");
++        }
++    }
++    return OK;
++}
++
++int IntelPGParam::getPayloadSizes(int payloadCount, ia_binary_data* payloads) {
++    CheckError(payloadCount < mTerminalCount || !payloads, BAD_VALUE, "Can't get payload sizes!");
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        payloads[termIdx].size = mPgReqs.terminals[termIdx].payloadSize;
++    }
++    return mTerminalCount;
++}
++
++int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
++    destroyPayloads();
++    int count = getPayloadSizes(mTerminalCount, mParamPayloads);
++    CheckError(payloadCount < count || !payloads, 0, "payloads error");
++
++    for (int idx = 0; idx < count; idx++) {
++        if (mParamPayloads[idx].size == 0) {
++            continue;
++        }
++        mParamPayloads[idx].data =
++            CIPR::mallocAlignedMemory(PAGE_ALIGN(mParamPayloads[idx].size), CIPR::getPageSize());
++    }
++    MEMCPY_S(payloads, count * sizeof(ia_binary_data), mParamPayloads,
++             count * sizeof(ia_binary_data));
++
++    return count;
++}
++
++void IntelPGParam::destroyPayloads() {
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        if (mParamPayloads[termIdx].data) {
++            CIPR::freeMemory(mParamPayloads[termIdx].data);
++            mParamPayloads[termIdx].data = nullptr;
++        }
++    }
++    CLEAR(mParamPayloads);
++}
++
++int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParams, int payloadCount,
++                                     ia_binary_data* payloads) {
++    ia_err err = ia_p2p_parse(mP2pHandle, ipuParams, mP2pCacheBuffer.data);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
++
++    CheckError(!payloads, UNKNOWN_ERROR, "no payloads for encode.");
++    CheckError(payloadCount < mTerminalCount, UNKNOWN_ERROR, "small payload count %d, should be %d",
++               payloadCount, mTerminalCount);
++    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't encode due to null pg.");
++
++    int ret = OK;
++    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    ia_css_terminal_t* programControlInitTerminal = nullptr;
++    for (int i = 0; i < terminalCount; i++) {
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
++        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
++        if (!payloads[terminal->tm_index].data) {
++            continue;
++        }
++
++        // Encode that terminal at last
++        if (terminal->tm_index == mProgramControlInitTerminalIndex) {
++            programControlInitTerminal = terminal;
++            continue;
++        }
++
++        ret = encodeTerminal(terminal, payloads[terminal->tm_index]);
++        CheckError(ret != OK, ret, "Failed to encode for terminal %d.", terminal->tm_index);
++    }
++    if (programControlInitTerminal) {
++        ret = encodeTerminal(programControlInitTerminal,
++                             payloads[programControlInitTerminal->tm_index]);
++        CheckError(ret != OK, ret, "Failed to encode for program control init terminal %d.",
++                   programControlInitTerminal->tm_index);
++    }
++
++    return ret;
++}
++
++int IntelPGParam::encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
++    int ret = OK;
++
++    int terminalIndex = terminal->tm_index;
++    if (mPgReqs.terminals[terminalIndex].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++        unsigned int kupSize = 0;
++        ret = ia_p2p_get_kernel_user_parameter_size(mP2pHandle, mPgId, mFragmentCount, &kupSize);
++        CheckError(ret != ia_err_none, ret,
++                   "Failed to call ia_p2p_get_kernel_user_parameter_size.");
++        if (kupSize != mPgReqs.terminals[terminalIndex].userParamSize) {
++            mPgReqs.terminals[terminalIndex].userParamSize = kupSize;
++            mPgReqs.terminals[terminalIndex].userParamAddress =
++                std::unique_ptr<uint8_t[]>(new uint8_t[kupSize]);
++        }
++
++        if (mFragmentConfig) {
++            ret = ia_p2p_get_kernel_user_parameters_v2(
++                mP2pHandle, mPgId, mFragmentCount, mFragmentConfig,
++                mPgReqs.terminals[terminalIndex].userParamAddress.get());
++            CheckError(ret != ia_err_none, ret,
++                       "Failed to call ia_p2p_get_kernel_user_parameters_v2.");
++        } else {
++            ret = ia_p2p_get_kernel_user_parameters(
++                mP2pHandle, mPgId, mFragmentCount, mFragmentDesc,
++                mPgReqs.terminals[terminalIndex].userParamAddress.get());
++            CheckError(ret != ia_err_none, ret,
++                       "Failed to call ia_p2p_get_kernel_user_parameters.");
++        }
++
++        ia_css_kernel_user_param_t* userParam = reinterpret_cast<ia_css_kernel_user_param_t*>(
++            mPgReqs.terminals[terminalIndex].userParamAddress.get());
++        ret = pg_control_init_fill_payload(mProcessGroup, userParam, payload.data);
++        CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_fill_payload.");
++        return ret;
++    }
++
++    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminalIndex].kernelBitmap;
++    uint16_t kernelId = 0;
++    uint8_t kernelIndex = 0;
++    unsigned int curSection = 0;
++    unsigned int curOffset = 0;
++    ia_p2p_payload_desc tmpPayloadDesc;
++    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
++        /* Use specific ordering of kernels when available */
++        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
++            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
++            if (kernelId >= PSYS_MAX_KERNELS_PER_PG) {
++                /* All the kernels have now been encoded. */
++                break;
++            }
++            /* Initialize parameter payload for current kernel with zeros in
++             * case P2P has reported less sections for the kernel */
++            if (mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex - 1].initialize) {
++                LOG2("%s: initializing kernel %d payload in terminal %d (offset:%d, size:%d)",
++                     __func__, kernelId, terminalIndex, curOffset,
++                     mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex - 1].size);
++                unsigned char* start = reinterpret_cast<unsigned char*>(payload.data);
++                memset(start + curOffset, 0,
++                       mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex - 1].size);
++            }
++        } else {
++            kernelId = getKernelIdByBitmap(kernelBitmap);
++        }
++
++        /* Sanity check sections sizes and return the size to be used */
++        css_err_t result = payloadSectionSizeSanityTest(&tmpPayloadDesc, kernelId, terminalIndex,
++                                                        curOffset, payload.size);
++        CheckError((result != css_err_none), UNKNOWN_ERROR,
++                   "Failed sanity check of terminal payload sizes");
++
++        switch (mPgReqs.terminals[terminalIndex].type) {
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++                ret = ia_p2p_param_in_terminal_encode(
++                    mP2pHandle, mPgId, kernelId,
++                    reinterpret_cast<ia_css_param_terminal_t*>(terminal), curSection,
++                    reinterpret_cast<uint8_t*>(payload.data), payload.size, curOffset);
++                CheckError(ret != ia_err_none, ret, "Failed to encode param in terminal.");
++
++                curSection += mKernel.mSections[kernelId].param_in_section_count;
++                curOffset += tmpPayloadDesc.param_in_payload_size;
++                break;
++
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++                ret = ia_p2p_param_out_terminal_prepare(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                                     : mFragmentDesc),
++                    reinterpret_cast<ia_css_param_terminal_t*>(terminal), curSection,
++                    mPgReqs.terminals[terminalIndex].sectionCount, payload.size, curOffset);
++                CheckError(ret != ia_err_none, ret, "Failed to prepare param out terminal.");
++
++                curSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
++                curOffset += tmpPayloadDesc.param_out_payload_size;
++                break;
++
++            case IA_CSS_TERMINAL_TYPE_PROGRAM:
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++                reinterpret_cast<ia_css_program_terminal_t*>(terminal)->payload_fragment_stride =
++                    mPgReqs.terminals[terminalIndex].payloadSize / mFragmentCount;
++#endif
++                ret = ia_p2p_program_terminal_encode(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                                     : mFragmentDesc),
++                    reinterpret_cast<ia_css_program_terminal_t*>(terminal), curSection,
++                    mPgReqs.terminals[terminalIndex].sectionCount,
++                    reinterpret_cast<uint8_t*>(payload.data), payload.size, curOffset);
++                CheckError(ret != ia_err_none, ret, "Failed to encode program terminal.");
++
++                curSection += mKernel.mSections[kernelId].program_section_count_per_fragment;
++                curOffset += tmpPayloadDesc.program_payload_size;
++                break;
++
++            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++                /* TODO: ensure program terminal gets encoded first */
++                ret = ia_p2p_spatial_param_in_terminal_encode(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                                     : mFragmentDesc),
++                    reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal), curSection,
++                    reinterpret_cast<uint8_t*>(payload.data), payload.size, curOffset);
++                CheckError(ret != ia_err_none, ret, "Failed to encode spatial in terminal.");
++
++                curOffset += tmpPayloadDesc.spatial_param_in_payload_size;
++                curSection += mKernel.mSections[kernelId].spatial_param_in_section_count;
++                break;
++
++            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++                ret = ia_p2p_spatial_param_out_terminal_prepare(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                                     : mFragmentDesc),
++                    reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal), curSection,
++                    payload.size, curOffset);
++                CheckError(ret != ia_err_none, ret, "Failed to prepare spatial out terminal.");
++
++                curOffset += tmpPayloadDesc.spatial_param_out_payload_size;
++                curSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
++                break;
++
++            case IA_CSS_TERMINAL_TYPE_DATA_IN:
++            case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++                /* No encode done for frame terminals */
++                break;
++
++            default:
++                LOGE("%s: terminal type %d encode not implemented", __func__,
++                     mPgReqs.terminals[terminalIndex].type);
++                return UNKNOWN_ERROR;
++        }
++
++        if (!mPgReqs.terminals[terminalIndex].kernelOrder) {
++            kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
++        }
++    }
++
++    return ret;
++}
++
++int IntelPGParam::decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics) {
++    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't decode due to null pg.");
++    CheckError(!payload, INVALID_OPERATION, "nullptr payload.");
++
++    if (statistics && statistics->data) {
++        ia_p2p_set_statistics_buffer(mP2pHandle, statistics->data);
++    }
++    int ret = OK;
++    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    for (int i = 0; i < terminalCount; i++) {
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
++        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
++        if ((terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) &&
++            (terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
++            continue;
++        }
++        CheckError(terminal->tm_index >= payloadCount, UNKNOWN_ERROR,
++                   "no payload for term %d decoding", terminal->tm_index);
++        ret = decodeTerminal(terminal, payload[terminal->tm_index]);
++        CheckError(ret != OK, ret, "%s, call p2p decode fail", __func__);
++    }
++
++    return serializeDecodeCache(statistics);
++}
++
++int IntelPGParam::decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
++    int ret = OK;
++    int terminalIndex = terminal->tm_index;
++    unsigned int currentSection = 0;
++    int kernelIndex = 0;
++    uint16_t kernelId;
++    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminal->tm_index].kernelBitmap;
++    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
++        /* Use specific ordering of kernels when available */
++        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
++            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
++            CheckError(kernelId >= PSYS_MAX_KERNELS_PER_PG, css_err_internal,
++                       "%s: Kernel bitmap for terminal %d covers more kernels than in manifest",
++                       __func__, terminalIndex);
++        } else {
++            kernelId = getKernelIdByBitmap(kernelBitmap);
++        }
++
++        switch (mPgReqs.terminals[terminalIndex].type) {
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++                ret = ia_p2p_param_out_terminal_decode(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    reinterpret_cast<ia_css_param_terminal_t*>(terminal), currentSection,
++                    mPgReqs.terminals[terminalIndex].sectionCount,
++                    reinterpret_cast<unsigned char*>(payload.data), payload.size);
++                currentSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
++                break;
++            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++                ret = ia_p2p_spatial_param_out_terminal_decode_v2(
++                    mP2pHandle, mPgId, kernelId, mFragmentCount,
++                    (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
++                                     : mFragmentDesc),
++                    reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal), currentSection,
++                    (unsigned char*)payload.data, payload.size, mP2pCacheBuffer.data);
++                currentSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
++                break;
++            default:
++                LOGE("%s: terminal type %d decode not implemented", __func__,
++                     mPgReqs.terminals[terminalIndex].type);
++                return UNKNOWN_ERROR;
++        }
++
++        CheckError(ret != ia_err_none, ret, "%s: failed to decode terminal %d", __func__,
++                   terminalIndex);
++        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
++    }
++
++    return ret;
++}
++
++int IntelPGParam::serializeDecodeCache(ia_binary_data* result) {
++    CheckError(!result, UNKNOWN_ERROR, "The statistics buffer is nullptr");
++
++    ia_err ia_ret = ia_p2p_serialize_statistics(mP2pHandle, result, nullptr);
++    CheckError(ia_ret != ia_err_none, UNKNOWN_ERROR, "Serializ statistics fail");
++
++    return OK;
++}
++
++void IntelPGParam::deinit() {
++    ia_p2p_deinit(mP2pHandle);
++    if (mP2pCacheBuffer.data) {
++        CIPR::freeMemory(mP2pCacheBuffer.data);
++    }
++}
++
++int IntelPGParam::getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap) {
++    int kernelId = 0;
++    CheckError(ia_css_is_kernel_bitmap_empty(bitmap), BAD_VALUE, "The bitmap is empty");
++    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)kernelId)) {
++        kernelId++;
++    }
++
++    return kernelId;
++}
++
++ia_css_kernel_bitmap_t IntelPGParam::getCachedTerminalKernelBitmap(
++    ia_css_param_terminal_manifest_t* manifest) {
++    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
++    unsigned int section, sectionCount;
++
++    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
++    sectionCount = manifest->param_manifest_section_desc_count;
++    for (section = 0; section < sectionCount; section++) {
++        ia_css_param_manifest_section_desc_t* desc =
++            ia_css_param_terminal_manifest_get_prm_sct_desc(manifest, section);
++        CheckError(!desc, kernelBitmap, "failed to get desc");
++        int index = ia_css_param_manifest_section_desc_get_kernel_id(desc);
++        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
++    }
++
++    return kernelBitmap;
++}
++
++ia_css_kernel_bitmap_t IntelPGParam::getProgramTerminalKernelBitmap(
++    ia_css_program_terminal_manifest_t* manifest) {
++    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
++    unsigned int section, sectionCount;
++
++    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
++    sectionCount = manifest->fragment_param_manifest_section_desc_count;
++    for (section = 0; section < sectionCount; section++) {
++        ia_css_fragment_param_manifest_section_desc_t* desc =
++            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(manifest, section);
++        CheckError(!desc, kernelBitmap, "failed to get desc");
++        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc);
++        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
++    }
++
++    return kernelBitmap;
++}
++
++int IntelPGParam::disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap) {
++    int ret = OK;
++    ia_css_terminal_type_t terminalType;
++    ia_css_kernel_bitmap_t terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
++    ia_css_kernel_bitmap_t disabledTerminalKernelsBitmap = ia_css_kernel_bitmap_clear();
++    for (int i = 0; i < mTerminalCount; i++) {
++        terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
++        unsigned int payloadSize = mPgReqs.terminals[i].payloadSize;
++        ia_css_terminal_manifest_t* manifest =
++            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, i);
++        terminalType = ia_css_terminal_manifest_get_type(manifest);
++
++        if (payloadSize == 0) {
++            switch (terminalType) {
++                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
++                    /* Spatial terminals are only associated to a single kernel. */
++                    ia_css_spatial_param_terminal_manifest_t* paramMani =
++                        reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>(manifest);
++                    terminalKernelsBitmap =
++                        ia_css_kernel_bitmap_set(terminalKernelsBitmap, paramMani->kernel_id);
++                    break;
++                }
++                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
++                    ia_css_param_terminal_manifest_t* paramMani =
++                        reinterpret_cast<ia_css_param_terminal_manifest_t*>(manifest);
++                    terminalKernelsBitmap = getCachedTerminalKernelBitmap(paramMani);
++                    break;
++                }
++                case IA_CSS_TERMINAL_TYPE_PROGRAM: {
++                    ia_css_program_terminal_manifest_t* proMani =
++                        reinterpret_cast<ia_css_program_terminal_manifest_t*>(manifest);
++                    terminalKernelsBitmap = getProgramTerminalKernelBitmap(proMani);
++                    break;
++                }
++                case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++                    LOG1("%s: program control init terminal is always enabled.", __func__);
++                    break;
++                default:
++                    break;
++            }
++            disabledTerminalKernelsBitmap =
++                ia_css_kernel_bitmap_union(disabledTerminalKernelsBitmap, terminalKernelsBitmap);
++        }
++    }
++
++    *kernelBitmap = ia_css_kernel_bitmap_intersection(
++        *kernelBitmap, ia_css_kernel_bitmap_complement(disabledTerminalKernelsBitmap));
++    return ret;
++}
++
++css_err_t IntelPGParam::getKernelOrderForParamCachedInTerm(
++    ia_css_param_terminal_manifest_t* terminalManifest, IpuPgTerminalKernelInfo* kernelOrder) {
++    CheckError((!terminalManifest || !kernelOrder), ia_err_argument, "No manifest or order info");
++
++    uint16_t sectionCount = terminalManifest->param_manifest_section_desc_count;
++    CheckError(sectionCount == 0, css_err_argument, "No static sections in manifest");
++    uint8_t kernelCount = 0;
++
++    for (uint16_t section = 0; section < sectionCount; section++) {
++        ia_css_param_manifest_section_desc_t* param =
++            ia_css_param_terminal_manifest_get_prm_sct_desc(terminalManifest, section);
++        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
++
++        /* there is agreement that sections of the same kernel are
++         * encoded in a row. Here, skipping sections of the same kernel
++         * based on this assumption.
++         */
++        /* info: Indication of the kernel this parameter belongs to,
++         * may stand for mem_type, region and kernel_id for ipu6
++         */
++        int index = ia_css_param_manifest_section_desc_get_kernel_id(param);
++        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
++            ++kernelOrder[kernelCount - 1].sections;
++            kernelOrder[kernelCount - 1].size += param->max_mem_size;
++            continue;
++        }
++        kernelOrder[kernelCount].id = (uint8_t)index;
++        kernelOrder[kernelCount].sections = 1;
++        kernelOrder[kernelCount].size = param->max_mem_size;
++        kernelOrder[kernelCount].initialize = false;
++        kernelCount++;
++    }
++
++    return css_err_none;
++}
++
++css_err_t IntelPGParam::getKernelOrderForProgramTerm(
++    ia_css_program_terminal_manifest_t* terminalManifest, IpuPgTerminalKernelInfo* kernelOrder) {
++    CheckError((!terminalManifest || !kernelOrder), css_err_argument, "No manifest or order info");
++    uint16_t sectionCount = terminalManifest->fragment_param_manifest_section_desc_count;
++    CheckError(sectionCount == 0, ia_err_internal, "No static sections in manifest");
++    uint8_t kernelCount = 0;
++
++    for (uint16_t section = 0; section < sectionCount; section++) {
++        ia_css_fragment_param_manifest_section_desc_t* param =
++            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(terminalManifest, section);
++        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
++
++        /* there is agreement that sections of the same kernel are
++         * encoded in a row. Here, skipping sections of the same kernel
++         * based on this assumption.
++         */
++        /* info: Indication of the kernel this parameter belongs to,
++         * may stand for mem_type, region and kernel_id for ipu6
++         */
++        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(param);
++        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
++            ++kernelOrder[kernelCount - 1].sections;
++            kernelOrder[kernelCount - 1].size += param->max_mem_size;
++            continue;
++        }
++        kernelOrder[kernelCount].id = (uint8_t)index;
++        kernelOrder[kernelCount].sections = 1;
++        kernelOrder[kernelCount].size = param->max_mem_size;
++        kernelOrder[kernelCount].initialize = false;
++        kernelCount++;
++    }
++
++    return css_err_none;
++}
++
++int8_t IntelPGParam::terminalEnumerateByType(IpuPgRequirements* reqs,
++                                             ia_css_terminal_type_t terminalType, uint8_t num) {
++    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
++
++    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
++        if (reqs->terminals[terminal].type == terminalType) {
++            if (num)
++                num--;
++            else
++                return (int8_t)terminal;
++        }
++    }
++
++    return -1;
++}
++
++int8_t IntelPGParam::terminalEnumerateByBitmap(IpuPgRequirements* reqs,
++                                               ia_css_terminal_type_t terminal_type,
++                                               ia_css_kernel_bitmap_t bitmap) {
++    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
++
++    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
++        if (reqs->terminals[terminal].type == terminal_type &&
++            ia_css_is_kernel_bitmap_equal(reqs->terminals[terminal].kernelBitmap, bitmap)) {
++            return (int8_t)terminal;
++        }
++    }
++
++    return -1;
++}
++
++bool IntelPGParam::isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId,
++                                           uint8_t* orderedIndex) {
++    /* No kernel order, return true always */
++    if (!reqs->terminals[termIndex].kernelOrder) return true;
++
++    /* Check if the kernel_id can be found from the kernelOrder */
++    for (uint8_t i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
++        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
++            if (orderedIndex) *orderedIndex = i;
++            return true;
++        }
++    }
++
++    return false;
++}
++
++uint32_t IntelPGParam::getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex,
++                                                     int kernelId) {
++    if (!reqs->terminals[termIndex].kernelOrder) {
++        /* If no kernel order is present, assuming kernel appears once. */
++        return 1;
++    }
++
++    uint32_t count = 0;
++    for (int i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
++        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
++            ++count;
++        }
++    }
++
++    return count;
++}
++
++void IntelPGParam::processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
++                                                     ia_css_terminal_type_t terminalType,
++                                                     int kernelId) {
++    uint32_t kernelCount = getKernelCountFromKernelOrder(reqs, termIndex, kernelId);
++    uint32_t sectionCount = 0, payloadSize = 0;
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++    uint32_t multiplier = 1;
++#endif
++    for (unsigned int i = 0; i < kernelCount; ++i) {
++        switch (terminalType) {
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++                sectionCount = mKernel.mSections[kernelId].param_in_section_count;
++                payloadSize = mKernel.mPayloads[kernelId].param_in_payload_size;
++                break;
++            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++                sectionCount = mKernel.mSections[kernelId].param_out_section_count_per_fragment;
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++                payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size * mFragmentCount;
++#else
++                payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size;
++#endif
++                break;
++            case IA_CSS_TERMINAL_TYPE_PROGRAM:
++                sectionCount = mKernel.mSections[kernelId].program_section_count_per_fragment;
++                payloadSize = mKernel.mPayloads[kernelId].program_payload_size;
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++                multiplier = mFragmentCount;
++#endif
++                break;
++            default:
++                LOG1("%s: terminal type %d encode not implemented", __func__, terminalType);
++                break;
++        }
++        reqs->terminals[termIndex].sectionCount += sectionCount;
++
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++        reqs->terminals[termIndex].payloadSize += multiplier * payloadSize;
++#else
++        reqs->terminals[termIndex].payloadSize += payloadSize;
++#endif
++
++        mKernel.mPayloadSize = reqs->terminals[termIndex].payloadSize;
++    }
++
++    reqs->terminals[termIndex].kernelBitmap =
++        ia_css_kernel_bitmap_set(reqs->terminals[termIndex].kernelBitmap, (unsigned int)kernelId);
++}
++
++css_err_t IntelPGParam::payloadSectionSizeSanityTest(ia_p2p_payload_desc* current,
++                                                     uint16_t kernelId, uint8_t terminalIndex,
++                                                     uint32_t currentOffset, size_t payloadSize) {
++    size_t nextPayloadSize = 0;
++    ia_p2p_payload_desc init = mKernel.mPayloads[kernelId];
++    /* calculate again the memory requirements for each kernel
++     * and compare it with what we stored at init time. */
++    ia_err ia_ret = ia_p2p_get_kernel_payload_desc(
++        mP2pHandle, mPgId, kernelId,
++#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
++        1,
++#else
++        mFragmentCount,
++#endif
++        (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId] : mFragmentDesc),
++        current);
++    CheckError(ia_ret != ia_err_none, css_err_internal,
++               "Failed to get payload description during sanity check (kernel %d)", kernelId);
++
++    switch (mPgReqs.terminals[terminalIndex].type) {
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++            if (current->param_in_payload_size > init.param_in_payload_size) {
++                LOGW(
++                    "%s: param-in section size mismatch in pg[%d] kernel[%d]"
++                    " p2p size %d pg_die size %d",
++                    __func__, mPgId, kernelId, current->param_in_payload_size,
++                    init.param_in_payload_size);
++            } else {
++                current->param_in_payload_size = init.param_in_payload_size;
++            }
++            nextPayloadSize = current->param_in_payload_size;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++            if (current->param_out_payload_size > init.param_out_payload_size) {
++                LOGW(
++                    "%s: param-out section size mismatch in pg[%d] kernel[%d]"
++                    " p2p size %d pg_die size %d",
++                    __func__, mPgId, kernelId, current->param_out_payload_size,
++                    init.param_out_payload_size);
++            } else {
++                current->param_out_payload_size = init.param_out_payload_size;
++            }
++            nextPayloadSize = current->param_out_payload_size;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PROGRAM:
++            if (current->program_payload_size > init.program_payload_size) {
++                LOG1(
++                    "%s: program section size mismatch in pg[%d] kernel[%d]"
++                    " p2p size %d pg_die size %d",
++                    __func__, mPgId, kernelId, current->program_payload_size,
++                    init.program_payload_size);
++            } else {
++                current->program_payload_size = init.program_payload_size;
++            }
++            nextPayloadSize = current->program_payload_size;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++            if (current->spatial_param_in_payload_size > init.spatial_param_in_payload_size) {
++                LOGW(
++                    "%s: spatial-in section size mismatch in pg[%d] kernel[%d]"
++                    " p2p size %d pg_die size %d",
++                    __func__, mPgId, kernelId, current->spatial_param_in_payload_size,
++                    init.spatial_param_in_payload_size);
++            } else {
++                current->spatial_param_in_payload_size = init.spatial_param_in_payload_size;
++            }
++            nextPayloadSize = current->spatial_param_in_payload_size;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++            if (current->spatial_param_out_payload_size > init.spatial_param_out_payload_size) {
++                LOGW(
++                    "%s: spatial-out section size mismatch in pg[%d] kernel[%d]"
++                    " p2p size %d pg_die size %d",
++                    __func__, mPgId, kernelId, current->spatial_param_out_payload_size,
++                    init.spatial_param_out_payload_size);
++            } else {
++                current->spatial_param_out_payload_size = init.spatial_param_out_payload_size;
++            }
++            nextPayloadSize = current->spatial_param_out_payload_size;
++            break;
++        case IA_CSS_TERMINAL_TYPE_DATA_IN:
++        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++            /* No check done for frame terminals */
++            break;
++        default:
++            LOGE("%s: terminal type %d payload check not implemented", __func__,
++                 mPgReqs.terminals[terminalIndex].type);
++            return css_err_argument;
++    }
++
++    CheckError(
++        (currentOffset + nextPayloadSize > payloadSize), css_err_nomemory,
++        "pg %d terminal %d payload size small, encoding for kernel %d will exceed size by %u bytes",
++        mPgId, terminalIndex, kernelId, currentOffset + nextPayloadSize - payloadSize);
++    return css_err_none;
++}
++
++void IntelPGParam::dumpFragmentDesc(int fragmentCount) {
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
++
++    LOG2("%s: pg %d get frag count %d (new api)", __func__, mPgId, fragmentCount);
++    for (int kernel = 0; kernel < IA_P2P_MAX_KERNELS_PER_PG; kernel++) {
++        for (int frag = 0; frag < fragmentCount; frag++) {
++            LOG2("   kernel %d, frag %d: [%d %d %d %d]", kernel, frag,
++                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_width,
++                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_height,
++                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_x,
++                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_y);
++        }
++    }
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
+new file mode 100644
+index 000000000000..154704d36c22
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
+@@ -0,0 +1,237 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++extern "C" {
++#include <ia_css_program_group_data.h>
++#include <ia_css_program_group_param.h>
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_terminal.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_terminal_manifest_types.h>
++#include <ia_css_terminal_types.h>
++#include <ia_isp_bxt.h>
++#include <ia_isp_types.h>
++#include <ia_p2p.h>
++#include <ia_p2p_types.h>
++#include <ia_pal_types_isp_ids_autogen.h>
++#include <pg_control_init_framework.h>
++}
++
++#include <map>
++#include <memory>
++#include <vector>
++
++#include "ia_tools/css_types.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "modules/ia_cipr/include/Utils.h"
++#include "src/core/psysprocessor/PGUtils.h"
++
++namespace icamera {
++
++#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
++
++/**
++ * \class IntelPGParam
++ *
++ * \brief This is a version P2P implementation which is used to encode parameter terminal
++ *        and decode statistic terminal for PSYS pipeline.
++ *
++ * The call sequence as follows:
++ * 1. init();
++ * 2. prepare();
++ * 3. allocatePGBuffer() (optional);
++ * 4. setPGAndPrepareProgram();
++ * 5. allocatePayloads();
++ * 6. getFragmentDescriptors();
++ * 7. loop frame {
++ *      updatePALAndEncode();
++ *      decode();
++ *    }
++ * 8. deinit();
++ */
++class IntelPGParam {
++ public:
++    explicit IntelPGParam(int pgId);
++    ~IntelPGParam();
++
++    /**
++     * Use to init and config P2P handle.
++     */
++    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
++
++    /**
++     * Query and save the requirement for each terminal, calculate the final kernel bitmap.
++     */
++    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
++                ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize = nullptr);
++
++    /**
++     * Allocate PG buffer for caller
++     */
++    void* allocatePGBuffer(int pgSize);
++
++    /**
++     * Accept pg outside and init program_control_init terminal.
++     */
++    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
++
++    /**
++     * Allocate payload memory for terminals, and return valid terminals count.
++     */
++    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
++
++    /**
++     * Update PAL and encode payload data for all terminals. Will skip inactive terminals.
++     */
++    int updatePALAndEncode(const ia_binary_data* ipuParams, int payloadCount,
++                           ia_binary_data* payloads);
++
++    /**
++     * Decode payload data for all related terminals.
++     */
++    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
++
++    /**
++     * Use to deinit P2P handle.
++     */
++    void deinit();
++
++    /**
++     * Get fragment descriptors calculated according to PAL data
++     * Called after prepare().
++     */
++    int getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs);
++
++    /**
++     * Get payload size for all terminals, and return valid payloads number.
++     */
++    int getPayloadSizes(int payloadCount, ia_binary_data* payloads);
++
++ private:
++    enum FragmentDataTerminalType {
++        FRAG_TERM_TYPE_INPUT = 0,
++        FRAG_TERM_TYPE_OUTPUT_START,  // Mapping to data out terminal in order for all postgdc pgs.
++        FRAG_TERM_TYPE_DISPALY_OUTPUT = FRAG_TERM_TYPE_OUTPUT_START,
++        FRAG_TERM_TYPE_MAIN_OUTPUT,
++        FRAG_TERM_TYPE_PP_OUTPUT,
++        FRAG_TERM_TYPE_COUNT,
++    };
++
++    int mPgId;
++    int mTerminalCount;
++    PgFrameDesc mInputMainFrame;
++    PgFrameDesc mOutputMainFrame;
++
++    uint8_t mFragmentCount;
++    ia_p2p_fragment_desc* mFragmentDesc;
++    ia_p2p_fragment_configuration_t* mFragmentConfig;
++    // for pg fragment with new api:
++    // ia_p2p_calculate_fragments_rbm
++    // Instead of mFragmentDesc
++    ia_p2p_handle mP2pHandle;
++    ia_binary_data mP2pCacheBuffer;
++
++    ia_css_program_group_manifest_t* mPgManifest;
++    std::vector<int> mDisableDataTermials;
++    ia_css_process_group_t* mProcessGroup;
++    int mProgramControlInitTerminalIndex;
++
++    struct IpuPgTerminalKernelInfo {
++        IpuPgTerminalKernelInfo() {}
++        uint8_t id = 0;
++        uint8_t sections = 0;
++        uint32_t size = 0;
++        bool initialize = false;
++    };
++
++    struct IpuPgTerminaRequirements {
++        IpuPgTerminaRequirements() { kernelBitmap = ia_css_kernel_bitmap_clear(); }
++        ia_css_terminal_type_t type = IA_CSS_N_TERMINAL_TYPES;
++        uint32_t payloadSize = 0;
++        ia_css_kernel_bitmap_t kernelBitmap;
++        uint32_t sectionCount = 0;
++        IpuPgTerminalKernelInfo* kernelOrder = nullptr;
++        ia_p2p_fragment_desc* fragment_descs = nullptr;
++
++        // Use for program_control_init
++        uint32_t userParamSize;
++        std::unique_ptr<uint8_t[]> userParamAddress;
++    };
++
++    struct IpuPgRequirements {
++        IpuPgRequirements() {}
++        uint32_t terminalCount = 0;
++        IpuPgTerminaRequirements terminals[IPU_MAX_TERMINAL_COUNT];
++    };
++
++    struct KernelRequirement {
++        KernelRequirement() { mKernelBitmap = ia_css_kernel_bitmap_clear(); }
++        ia_p2p_terminal_requirements_t mSections[PSYS_MAX_KERNELS_PER_PG];
++        ia_p2p_payload_desc mPayloads[PSYS_MAX_KERNELS_PER_PG];
++        int mPayloadSize = 0;
++        ia_css_kernel_bitmap_t mKernelBitmap;
++    };
++
++    KernelRequirement mKernel;
++    IpuPgRequirements mPgReqs;
++
++    // Allocate them here, for sandboxing case (shared memory)
++    ia_binary_data __attribute__((aligned(PG_PAGE_SIZE))) mParamPayloads[IPU_MAX_TERMINAL_COUNT];
++    void* mProcessGroupMemory;
++
++ private:
++    int getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap);
++    ia_css_kernel_bitmap_t getCachedTerminalKernelBitmap(
++        ia_css_param_terminal_manifest_t* manifest);
++    ia_css_kernel_bitmap_t getProgramTerminalKernelBitmap(
++        ia_css_program_terminal_manifest_t* manifest);
++    int disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap);
++    css_err_t getKernelOrderForProgramTerm(ia_css_program_terminal_manifest_t* terminalManifest,
++                                           IpuPgTerminalKernelInfo* kernelOrder);
++    css_err_t getKernelOrderForParamCachedInTerm(ia_css_param_terminal_manifest_t* terminalManifest,
++                                                 IpuPgTerminalKernelInfo* kernelOrder);
++    int8_t terminalEnumerateByType(IpuPgRequirements* reqs, ia_css_terminal_type_t terminalType,
++                                   uint8_t num);
++    int8_t terminalEnumerateByBitmap(IpuPgRequirements* reqs, ia_css_terminal_type_t terminal_type,
++                                     ia_css_kernel_bitmap_t bitmap);
++    bool isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId,
++                                 uint8_t* orderedIndex);
++    uint32_t getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId);
++    void processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
++                                           ia_css_terminal_type_t terminalType, int kernelId);
++    css_err_t payloadSectionSizeSanityTest(ia_p2p_payload_desc* current, uint16_t kernelId,
++                                           uint8_t terminalIndex, uint32_t currentOffset,
++                                           size_t payloadSize);
++
++    int calcFragmentDescriptors(int fragmentCount, const PgFrameDesc& inputMainFrame,
++                                const PgFrameDesc& outputMainFrame, const ia_css_rbm_t* rbm);
++
++    void dumpFragmentDesc(int fragmentCount);
++    int encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
++    int decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
++    int serializeDecodeCache(ia_binary_data* result);
++
++    void destroyPayloads();
++    void destroyPGBuffer();
++
++    DISALLOW_COPY_AND_ASSIGN(IntelPGParam);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.cpp
+new file mode 100644
+index 000000000000..fb23fc0b1cf0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.cpp
+@@ -0,0 +1,190 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelTNR7US"
++
++#include "modules/algowrapper/IntelTNR7US.h"
++
++#include <string>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#define CM_SURFACE_ALIGN_SIZE 0x1000
++
++namespace icamera {
++
++IntelTNR7US::IntelTNR7US()
++        : mWidth(0),
++          mHeight(0),
++          mRefBufferSize(0),
++          mRefBufIndex(0),
++          mTnrParam(nullptr) {
++    LOG1("%s ", __func__);
++    CLEAR(mRefBufAddr);
++    CLEAR(mRefSurface);
++    std::string threadName = "IntelTNR7US";
++    mThread = std::unique_ptr<base::Thread>(new base::Thread(threadName));
++    mThread->Start();
++}
++
++IntelTNR7US::~IntelTNR7US() {
++    LOG1("%s ", __func__);
++    for (auto surface : mCMSurfaceMap) {
++        destroyCMSurface(surface.second);
++    }
++    mCMSurfaceMap.clear();
++}
++
++int IntelTNR7US::init(int width, int height) {
++    LOG1("%s size %dx%d", __func__, width, height);
++    mWidth = width;
++    mHeight = height;
++    return OK;
++}
++
++Tnr7Param* IntelTNR7US::allocTnr7ParamBuf() {
++    LOG1("%s ", __func__);
++    mTnrParam = new Tnr7Param;
++    return mTnrParam;
++}
++
++void* IntelTNR7US::allocCamBuf(uint32_t bufSize, int id) {
++    LOG1("%s id: %d", __func__, id);
++    void* buffer = nullptr;
++    int ret = posix_memalign(&buffer, getpagesize(), bufSize);
++    CheckError(ret != 0, nullptr, "%s, posix_memalign fails, ret:%d", __func__, ret);
++    CmSurface2DUP* surface = createCMSurface(buffer);
++    if (!surface) {
++        ::free(buffer);
++        return nullptr;
++    }
++    mCMSurfaceMap[buffer] = surface;
++    return buffer;
++}
++
++int IntelTNR7US::allocRefBufs(uint32_t bufSize) {
++    mRefBufferSize = bufSize;
++    for (int i = 0; i < TnrRefBufCount; i++) {
++        mRefBufAddr[i] = allocCamBuf(bufSize, MAX_BUFFER_COUNT + i);
++        // will release all buffer in freeAllBufs
++        CheckError(!mRefBufAddr[i], UNKNOWN_ERROR, "@%s, alloc reference buffer fails", __func__);
++    }
++    return OK;
++}
++
++void IntelTNR7US::freeAllBufs() {
++    for (auto surface : mCMSurfaceMap) {
++        ::free(surface.first);
++    }
++    if (mTnrParam) {
++        delete mTnrParam;
++    }
++}
++
++int IntelTNR7US::prepareSurface(void* bufAddr, int size) {
++    CheckError(size < mWidth * mHeight * 3 / 2, UNKNOWN_ERROR, "%s, invalid buffer size:%d",
++               __func__, size);
++    CmSurface2DUP* surface = createCMSurface(bufAddr);
++    CheckError(!surface, UNKNOWN_ERROR, "Failed to create CMSurface");
++    mCMSurfaceMap[bufAddr] = surface;
++
++    return OK;
++}
++
++int IntelTNR7US::runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                             uint32_t outBufSize, Tnr7Param* tnrParam, bool isUsrPtr) {
++    CheckError(inBufAddr == nullptr || outBufAddr == nullptr || tnrParam == nullptr, UNKNOWN_ERROR,
++               "@%s, buffer is nullptr", __func__);
++    /* the outBufAddr can be the reference buffer ptr from client or usr data ptr
++     * isUsrPtr is used to identify the source */
++    if (tnrParam->bc.is_first_frame) {
++        if (isUsrPtr) {
++            // the first frame, tnr copy input buffer as reference buffer for next frame
++            MEMCPY_S(mRefBufAddr[mRefBufIndex], mRefBufferSize, inBufAddr, inBufSize);
++        } else {
++            /* when outBufAddr is from client, it is the reference buffer for next frame */
++            MEMCPY_S(outBufAddr, outBufSize, inBufAddr, inBufSize);
++        }
++    }
++
++    CmSurface2DUP* inSurface = getBufferCMSurface(const_cast<void*>(inBufAddr));
++    CheckError(!inSurface, UNKNOWN_ERROR, "Failed to get CMSurface for input buffer");
++
++    if (!isUsrPtr) {
++        // the outBuf is reference buffer ptr, get the it's surface
++        mRefSurface[mRefBufIndex] = getBufferCMSurface(outBufAddr);
++    } else {
++        mRefSurface[mRefBufIndex] = getBufferCMSurface(mRefBufAddr[mRefBufIndex]);
++    }
++    CheckError(mRefSurface[mRefBufIndex] == nullptr, UNKNOWN_ERROR,
++               "Failed to get CMSurface for output buffer");
++
++    /* call Tnr api, it will run tnr for the inSurface and store the result in refSurface[0]
++    ** in next frame, the refSurface[0] will be the reference buffer, the tnr keeps a pointer
++    ** to it, and refSurface[1] will used to store the tnr result.
++    */
++    int ret = run_tnr7us_frame(mWidth, mHeight, mWidth, inSurface, mRefSurface[mRefBufIndex],
++                               &tnrParam->scale, &tnrParam->ims, &tnrParam->bc, &tnrParam->blend,
++                               tnrParam->bc.is_first_frame);
++    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to run TNR", __func__);
++
++    if (isUsrPtr) {
++        /* when the outBufAddr is not from the client, then it is usr data,
++         * copy tnr result to it from reference buffer */
++        MEMCPY_S(outBufAddr, outBufSize, mRefBufAddr[mRefBufIndex], mRefBufferSize);
++    }
++    mRefBufIndex = (mRefBufIndex + 1) % TnrRefBufCount;
++
++    return OK;
++}
++
++int IntelTNR7US::asyncParamUpdate(int gain) {
++    LOG1("%s gain: %d", __func__, gain);
++    if (mThread->task_runner()) {
++        mThread->task_runner()->PostTask(
++            FROM_HERE, base::Bind(&IntelTNR7US::handleParamUpdate, base::Unretained(this), gain));
++    }
++    return OK;
++}
++
++void IntelTNR7US::handleParamUpdate(int gain) {
++    LOG1("%s gain: %d", __func__, gain);
++    // gain value is from AE expore digital_gain multi by 1000, to avoid lose accuracy
++    tnr7usParamUpdate(gain);
++}
++
++CmSurface2DUP* IntelTNR7US::getBufferCMSurface(void* bufAddr) {
++    if (mCMSurfaceMap.find(bufAddr) != mCMSurfaceMap.end()) {
++        return mCMSurfaceMap[bufAddr];
++    }
++
++    return nullptr;
++}
++
++CmSurface2DUP* IntelTNR7US::createCMSurface(void* bufAddr) {
++    LOG1("%s ", __func__);
++    CmSurface2DUP* cmSurface = nullptr;
++    int32_t ret = createCmSurface2DUP(mWidth, mHeight, CM_SURFACE_FORMAT_NV12, bufAddr, cmSurface);
++    CheckError(ret != 0, nullptr, "failed to create CmSurface2DUP object");
++    return cmSurface;
++}
++
++int32_t IntelTNR7US::destroyCMSurface(CmSurface2DUP* surface) {
++    LOG1("%s ", __func__);
++    return destroyCMSurface2DUP(surface);
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.h
+new file mode 100644
+index 000000000000..7bb7da7af9c1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelTNR7US.h
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <base/threading/thread.h>
++
++#include <memory>
++#include <unordered_map>
++extern "C" {
++#include "ia_pal_types_isp_parameters_autogen.h"
++#include "tnr7us_parameters_definition.h"
++}
++
++#include "PlatformData.h"
++#include "TNRCommon.h"
++
++/* the cm_rt.h has some build error with current clang build flags
++ * use the ignored setting to ignore these errors, and use
++ * push/pop to make the ignore only take effect on this file */
++#pragma clang diagnostic push
++#pragma clang diagnostic ignored "-Wbitfield-constant-conversion"
++#pragma clang diagnostic ignored "-Wunused-private-field"
++// HANDLE is redefined in cm_rt.h, avoid the redefinition build error
++#define HANDLE cancel_fw_pre_define
++#include "cm_rt.h"
++#pragma clang diagnostic pop
++
++extern int run_tnr7us_frame(int width, int height, int stride, CmSurface2DUP*& inputSurface,
++                            CmSurface2DUP*& outputSurface, tnr_scale_1_0_t* dsPtr,
++                            tnr7_ims_1_0_t* imsPtr, tnr7_bc_1_0_t* bcPtr,
++                            tnr7_blend_1_0_t* blendPtr, bool first_frame);
++
++extern int32_t createCmSurface2DUP(uint32_t width, uint32_t height, CM_SURFACE_FORMAT format,
++                                   void* sysMem, CmSurface2DUP*& surface);
++
++extern int32_t destroyCMSurface2DUP(CmSurface2DUP*& surface);
++// update parameters when gain changes
++extern int tnr7usParamUpdate(int gain, bool forceUpdate = true, int type = -1);
++
++namespace icamera {
++
++// IntelTNR7US object is for using Intel GPU tnr(tnr7ultraslim) feature.
++class IntelTNR7US {
++ public:
++    IntelTNR7US();
++    ~IntelTNR7US();
++    int init(int width, int height);
++    /**
++     * call tnr api to calc tnr result
++     *
++     * \param inBufAddr: input image buffer
++     * \param outBufAddr: tnr output
++     * \param isUsrPtr: source of outBufAddr
++     * \param tnrParam: tnr parameters from ISP
++     */
++    int runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                    uint32_t outBufSize, Tnr7Param* tnrParam, bool isUsrPtr = true);
++
++    Tnr7Param* allocTnr7ParamBuf();
++    void* allocCamBuf(uint32_t bufSize, int id);
++    int allocRefBufs(uint32_t bufSize);
++    void freeAllBufs();
++    int prepareSurface(void* bufAddr, int size);
++    int asyncParamUpdate(int gain);
++
++ private:
++    /* tnr api use CmSurface2DUP object as data buffer, call this api to create
++     * CmSurface2DUP object from user data buffer */
++    CmSurface2DUP* createCMSurface(void* bufAddr);
++    int32_t destroyCMSurface(CmSurface2DUP* surface);
++    // get the CmSurface object of the bufAddr in mCMSurfaceMap
++    CmSurface2DUP* getBufferCMSurface(void* bufAddr);
++    /* call tnr7us API to update params */
++    void handleParamUpdate(int gain);
++
++ private:
++    int mWidth;
++    int mHeight;
++    // Tnr will create CMSurface for input buffers and cache them in the map
++    std::unordered_map<void*, CmSurface2DUP*> mCMSurfaceMap;
++    static const int TnrRefBufCount = TNR7US_REFERENCE_BUFFER_COUNT;
++    static const int MaxCachedBufferCount = MAX_BUFFER_COUNT + TnrRefBufCount;
++    // use double buffer as tnr reference buffer
++    int mRefBufferSize;
++    // store the reference buffer address allocated by itself, only used in sandboxing mode
++    void* mRefBufAddr[TnrRefBufCount];
++    // CMSurface object of the reference buffer
++    CmSurface2DUP* mRefSurface[TnrRefBufCount];
++    int mRefBufIndex;
++    Tnr7Param* mTnrParam;
++    std::unique_ptr<base::Thread> mThread;
++    DISALLOW_COPY_AND_ASSIGN(IntelTNR7US);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
+new file mode 100644
+index 000000000000..4ea0e26d724e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_aiq_types.h>
++#include <ia_bcomp_types.h>
++#include <ia_dvs_types.h>
++#include <ia_isp_bxt.h>
++#include <ia_isp_bxt_statistics_types.h>
++#include <ia_isp_bxt_types.h>
++
++#include "Parameters.h"
++
++namespace icamera {
++
++#define MAX_EXPOSURES_COUNT 3
++
++struct ConvertInputParam {
++    bool multiExpo;
++    ia_binary_data* statsBuffer;
++    camera_resolution_t* dvsReso;
++    const ia_aiq_ae_results* aeResults;
++    ia_bcomp_results* bcompResult;
++};
++
++struct ConvertResult {
++    ia_isp_bxt_statistics_query_results_t* queryResults;
++    ia_aiq_rgbs_grid* rgbsGrid[MAX_EXPOSURES_COUNT];
++    ia_aiq_af_grid* afGrid;
++    ia_dvs_statistics* dvsStats;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
+new file mode 100644
+index 000000000000..c53cf662a4ae
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
+@@ -0,0 +1,859 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GraphConfigImpl"
++
++#include "modules/algowrapper/graph/GraphConfigImpl.h"
++
++#include <GCSSParser.h>
++#include <graph_query_manager.h>
++
++#include <algorithm>
++#include <unordered_map>
++
++#include "FormatUtils.h"
++#include "GraphUtils.h"
++#include "iutils/CameraLog.h"
++
++using GCSS::GCSSParser;
++using GCSS::GraphConfigNode;
++using GCSS::GraphQueryManager;
++using GCSS::ItemUID;
++using std::map;
++using std::shared_ptr;
++using std::string;
++using std::vector;
++
++namespace icamera {
++
++#define DISPERSED_MAX_OUTPUTS 2
++
++Mutex GraphConfigImpl::sLock;
++std::unordered_map<int32_t, GraphConfigNodes*> GraphConfigImpl::mGraphNode;
++
++GraphConfigNodes::GraphConfigNodes() : mDesc(nullptr), mSettings(nullptr) {}
++
++GraphConfigNodes::~GraphConfigNodes() {
++    delete mDesc;
++    delete mSettings;
++}
++
++GraphConfigImpl::GraphConfigImpl()
++        : mCameraId(-1),
++          mGraphQueryManager(nullptr),
++          mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
++          mType(COUPLED),
++          mMcId(-1) {}
++
++GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type)
++        : mCameraId(camId),
++          mGraphQueryManager(new GraphQueryManager()),
++          mConfigMode(mode),
++          mType(type),
++          mMcId(-1) {
++    AutoMutex lock(sLock);
++
++    GraphConfigNodes* nodes = nullptr;
++    if (mGraphNode.find(camId) != mGraphNode.end()) {
++        nodes = mGraphNode[camId];
++    }
++    CheckError(!nodes, VOID_VALUE, "Failed to allocate Graph Query Manager");
++    mGraphQueryManager->setGraphDescriptor(nodes->mDesc);
++    mGraphQueryManager->setGraphSettings(nodes->mSettings);
++}
++
++GraphConfigImpl::~GraphConfigImpl() {}
++
++/**
++ * Add predefined keys to the map used by the graph config parser.
++ *
++ * This method should only be called once.
++ *
++ * We do this so that the keys we will use in the queries are already defined
++ * and we can create the query objects in a more compact way, by using the
++ * ItemUID initializers.
++ */
++void GraphConfigImpl::addCustomKeyMap() {
++    /**
++     * Initialize the map with custom specific tags found in the
++     * Graph Config XML's
++     */
++#define GCSS_KEY(key, str) std::make_pair(#str, GCSS_KEY_##key),
++    map<string, ia_uid> CUSTOM_GRAPH_KEYS = {
++    #include "custom_gcss_keys.h"
++    };
++#undef GCSS_KEY
++
++    LOG1("Adding %zu custom specific keys to graph config parser", CUSTOM_GRAPH_KEYS.size());
++
++    /*
++     * add custom specific tags so parser can use them
++     */
++    ItemUID::addCustomKeyMap(CUSTOM_GRAPH_KEYS);
++}
++
++/**
++ * Method to parse the XML graph configurations and settings
++ *
++ * Provide the file name with absolute path to this method, and
++ * save the GraphConfigNodes pointer to static area.
++ * This method is currently called once per camera
++ *
++ * \param[in] graphDescFile: name of the graph descriptor file
++ * \param[in] settingsFile: name of the graph settings file
++ */
++status_t GraphConfigImpl::parse(int cameraId, const char* graphDescFile, const char* settingsFile) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++
++    GCSSParser parser;
++    GraphConfigNodes* nodes = new GraphConfigNodes;
++
++    parser.parseGCSSXmlFile(graphDescFile, &nodes->mDesc);
++    if (!nodes->mDesc) {
++        LOGE("Failed to parse graph descriptor from %s", graphDescFile);
++        delete nodes;
++        return UNKNOWN_ERROR;
++    }
++
++    parser.parseGCSSXmlFile(settingsFile, &nodes->mSettings);
++    if (!nodes->mSettings) {
++        LOGE("Failed to parse graph settings from %s", settingsFile);
++        delete nodes;
++        return UNKNOWN_ERROR;
++    }
++
++    AutoMutex lock(sLock);
++    // Destory the old item
++    auto it = mGraphNode.find(cameraId);
++    if (it != mGraphNode.end()) {
++        delete it->second;
++        mGraphNode.erase(it);
++    }
++    mGraphNode[cameraId] = nodes;
++
++    return OK;
++}
++
++/**
++ * Method to parse the XML graph configurations and settings
++ *
++ * Provide the memory address and size of files to this method,
++ * and save the GraphConfigNodes pointer to static area.
++ * This method is currently called once per camera
++ *
++ * \param[in] graphDescData: the memory address for graph descriptor
++ * \param[in] descDataSize: the memory size for graph descriptor
++ * \param[in] settingsData: the memory address for graph settings
++ * \param[in] settingsDataSize: the memory size for graph settings
++ */
++status_t GraphConfigImpl::parse(int cameraId, char* graphDescData, size_t descDataSize,
++                                char* settingsData, size_t settingsDataSize) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++
++    GCSSParser parser;
++    GraphConfigNodes* nodes = new GraphConfigNodes;
++
++    parser.parseGCSSXmlData(graphDescData, descDataSize, &nodes->mDesc);
++    if (!nodes->mDesc) {
++        LOGE("Failed to parse graph descriptor addr: %p, size: %zu", graphDescData, descDataSize);
++        delete nodes;
++        return UNKNOWN_ERROR;
++    }
++
++    parser.parseGCSSXmlData(settingsData, settingsDataSize, &nodes->mSettings);
++    if (!nodes->mSettings) {
++        LOGE("Failed to parse graph settings addr: %p, size: %zu", settingsData, settingsDataSize);
++        delete nodes;
++        return UNKNOWN_ERROR;
++    }
++
++    AutoMutex lock(sLock);
++    // Destory the old item
++    auto it = mGraphNode.find(cameraId);
++    if (it != mGraphNode.end()) {
++        delete it->second;
++        mGraphNode.erase(it);
++    }
++    mGraphNode[cameraId] = nodes;
++
++    return OK;
++}
++
++/*
++ * Release the graph config nodes of all cameras
++ */
++void GraphConfigImpl::releaseGraphNodes() {
++    AutoMutex lock(sLock);
++
++    for (auto& nodes : mGraphNode) {
++        delete nodes.second;
++    }
++    mGraphNode.clear();
++}
++
++/**
++ * Create the query rule for current stream configuration based
++ * on stream list and graph setting type.
++ */
++status_t GraphConfigImpl::createQueryRule(const vector<HalStream*>& activeStreams) {
++    mQuery.clear();
++    mStreamToSinkIdMap.clear();
++
++    int videoIndex = 0, stillIndex = 0;
++    map<GCSS::ItemUID, std::string> videoQuery;
++    map<GCSS::ItemUID, std::string> stillQuery;
++    map<HalStream*, uid_t> videoStreamToSinkIdMap;
++    map<HalStream*, uid_t> stillStreamToSinkIdMap;
++    vector<AndroidGraphConfigKey> videoStreamKeys = {GCSS_KEY_VIDEO0, GCSS_KEY_VIDEO1,
++                                                     GCSS_KEY_VIDEO2};
++    vector<AndroidGraphConfigKey> stillStreamKeys = {GCSS_KEY_STILL0, GCSS_KEY_STILL1,
++                                                     GCSS_KEY_STILL2};
++
++    // Depends on outputs numbers in GC settings
++    int vOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : videoStreamKeys.size();
++    int sOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : stillStreamKeys.size();
++    for (auto& stream : activeStreams) {
++        CheckError(stream->useCase() == USE_CASE_INPUT, UNKNOWN_ERROR,
++                   "Error: Re-processing not supported with graph config yet.");
++        /*
++         * According to the usage to create the query item
++         */
++        CheckError(videoIndex >= vOutputNum && stillIndex >= sOutputNum, UNKNOWN_ERROR,
++                   "%s: no output for new stream! video %d, still %d", __func__, videoIndex,
++                   stillIndex);
++        bool isVideo = isVideoStream(stream) ? true : false;
++        if (videoIndex < vOutputNum) {
++            isVideo = (isVideo || stillIndex >= sOutputNum);
++        } else {
++            isVideo = false;
++        }
++        AndroidGraphConfigKey key =
++            (isVideo) ? videoStreamKeys[videoIndex++] : stillStreamKeys[stillIndex++];
++        map<HalStream*, uid_t>& streamToSinkId =
++            isVideo ? videoStreamToSinkIdMap : stillStreamToSinkIdMap;
++        map<GCSS::ItemUID, std::string>& query = isVideo ? videoQuery : stillQuery;
++        ItemUID w = {key, GCSS_KEY_WIDTH};
++        ItemUID h = {key, GCSS_KEY_HEIGHT};
++
++        query[w] = std::to_string(stream->width());
++        query[h] = std::to_string(stream->height());
++        streamToSinkId[stream] = key;
++        LOG1("Adding stream %p to map %s", stream, ItemUID::key2str(key));
++    }
++
++    if (mType == COUPLED) {
++        LOG2("Merge the query rule if graph settings type is COUPLED");
++        /*
++         * In this case(graph settings type is COUPLED), we need to merge still and
++         * video together, so there is only one item in mQuery and mStreamToSinkIdMap
++         * and it is used for both still and video pipe
++         */
++
++        // Merge the query rule
++        for (auto& still : stillQuery) {
++            videoQuery.insert(still);
++        }
++
++        // Merge the stream to sink key map
++        for (auto& stillKey : stillStreamToSinkIdMap) {
++            videoStreamToSinkIdMap.insert(stillKey);
++        }
++
++        /*
++         * Add to the query the number of active outputs
++         * The number of active outputs is video + still
++         */
++        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
++        videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
++
++        int useCase = videoQuery.empty() ? 0 : USE_CASE_VIDEO;
++        useCase |= stillQuery.empty() ? 0 : USE_CASE_STILL_CAPTURE;
++        mQuery[useCase] = videoQuery;
++        dumpQuery(useCase, mQuery[useCase]);
++        mStreamToSinkIdMap[useCase] = videoStreamToSinkIdMap;
++    } else {
++        LOG2("Fill each query rule if graph settings type is DISPERSED");
++        /*
++         * In this case(graph settings type is DISPERSED), the query item for still
++         * and video is dispersed, so there are two items in mQuery and mStreamToSinkIdMap
++         * one is for still pipe and the other is for video pipe
++         */
++        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
++
++        // Add active outputs for video
++        if (!videoStreamToSinkIdMap.empty()) {
++            LOG2("The video output number: %zu", videoStreamToSinkIdMap.size());
++            videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
++            mQuery[USE_CASE_VIDEO] = videoQuery;
++            dumpQuery(USE_CASE_VIDEO, mQuery[USE_CASE_VIDEO]);
++            mStreamToSinkIdMap[USE_CASE_VIDEO] = videoStreamToSinkIdMap;
++        }
++
++        // Add active outputs for still
++        if (!stillStreamToSinkIdMap.empty()) {
++            LOG2("The still output number: %zu", stillStreamToSinkIdMap.size());
++            stillQuery[streamCount] = std::to_string(stillStreamToSinkIdMap.size());
++            mQuery[USE_CASE_STILL_CAPTURE] = stillQuery;
++            dumpQuery(USE_CASE_STILL_CAPTURE, mQuery[USE_CASE_STILL_CAPTURE]);
++            mStreamToSinkIdMap[USE_CASE_STILL_CAPTURE] = stillStreamToSinkIdMap;
++        }
++    }
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getRawInputSize(GCSS::IGraphConfig* query, camera_resolution_t* reso) {
++    CheckError(!reso, UNKNOWN_ERROR, "%s, The reso is nullptr", __func__);
++    GCSS::IGraphConfig* result = nullptr;
++    css_err_t ret = mGraphQueryManager->createGraph(query, &result);
++    if (ret != css_err_none) {
++        delete result;
++        return UNKNOWN_ERROR;
++    }
++    CheckError(!result, UNKNOWN_ERROR, "%s, Failed to create the graph", __func__);
++
++    vector<string> isysOutput = {"csi_be:output",
++                                 "csi_be_soc:output"};
++    for (auto& item : isysOutput) {
++        GCSS::IGraphConfig* isysNode = result->getDescendantByString(item.c_str());
++        if (isysNode != nullptr) {
++            GCSS::GraphCameraUtil::getDimensions(isysNode, &(reso->width), &(reso->height));
++            return OK;
++        }
++    }
++
++    LOGE("Error: Couldn't get the resolution in isys output");
++    return UNKNOWN_ERROR;
++}
++
++/*
++ * According to the stream list to query graph setting and create GraphConfigPipe
++ */
++status_t GraphConfigImpl::configStreams(const vector<HalStream*>& activeStreams) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++
++    status_t ret = createQueryRule(activeStreams);
++    CheckError(ret != OK, ret, "Failed to create the query rule");
++
++    mQueryResult.clear();
++    map<int, vector<GCSS::IGraphConfig*> > useCaseToQueryResults;
++
++    LOG2("The mQuery size: %zu", mQuery.size());
++    for (auto& query : mQuery) {
++        mFirstQueryResults.clear();
++        dumpQuery(query.first, query.second);
++        mGraphQueryManager->queryGraphs(query.second, mFirstQueryResults);
++        CheckError(mFirstQueryResults.empty(), BAD_VALUE,
++                   "Failed to query the result, please check the settings xml");
++
++        // select setting from multiple results
++        ret = selectSetting(query.first, &useCaseToQueryResults);
++        CheckError(ret != OK, BAD_VALUE,
++                   "Failed to select the settings for ConfigMode (0x%x)in results", mConfigMode);
++    }
++
++    CheckError(useCaseToQueryResults.empty(), UNKNOWN_ERROR,
++               "%s, There isn't matched result after filtering with first query rule", __func__);
++    // Filter the results with same isys output if there are
++    // multiple items in useCaseToQueryResults map
++    if (useCaseToQueryResults.size() > 1) {
++        ret = OK;
++        bool matchFound = false;
++
++        vector<GCSS::IGraphConfig*>& videoQueryResults = useCaseToQueryResults.at(USE_CASE_VIDEO);
++        vector<GCSS::IGraphConfig*>& stillQueryResults =
++            useCaseToQueryResults.at(USE_CASE_STILL_CAPTURE);
++        CheckError(videoQueryResults.empty() || stillQueryResults.empty(), UNKNOWN_ERROR,
++                   "%s, the still or video query results is empty", __func__);
++
++        // Filter the video and still query results with same isys ouput resolution.
++        for (auto& video : videoQueryResults) {
++            camera_resolution_t videoReso;
++            ret = getRawInputSize(video, &videoReso);
++            CheckError(ret != OK, UNKNOWN_ERROR,
++                       "%s, Failed to get csi ouput resolution for video pipe", __func__);
++            LOG2("Isys output resolution of video pipe: %dx%d", videoReso.width, videoReso.height);
++
++            for (auto& still : stillQueryResults) {
++                camera_resolution_t stillReso;
++                ret = getRawInputSize(still, &stillReso);
++                CheckError(ret != OK, UNKNOWN_ERROR,
++                           "%s, Failed to get csi ouput resolution for still pipe", __func__);
++                LOG2("Isys output resolution for still pipe: %dx%d", stillReso.width,
++                     stillReso.height);
++
++                if (videoReso.width == stillReso.width && videoReso.height == stillReso.height) {
++                    matchFound = true;
++                    mQueryResult[USE_CASE_VIDEO] = video;
++                    mQueryResult[USE_CASE_STILL_CAPTURE] = still;
++                    break;
++                }
++            }
++            if (matchFound) break;
++        }
++
++        CheckError(!matchFound, UNKNOWN_ERROR,
++                   "%s, Failed to find the isys ouput for video and still pipe", __func__);
++    } else {
++        // Use the query result with smallest isys output if there is only video pipe
++        int resultIdx = 0;
++        if (useCaseToQueryResults.begin()->first == USE_CASE_VIDEO) {
++            camera_resolution_t resultReso;
++            getRawInputSize((useCaseToQueryResults.begin()->second)[0], &resultReso);
++            for (size_t idx = 0; idx < (useCaseToQueryResults.begin()->second).size(); idx++) {
++                camera_resolution_t reso;
++                getRawInputSize((useCaseToQueryResults.begin()->second)[idx], &reso);
++                if (resultReso.width > reso.width && resultReso.height > reso.height) {
++                    resultIdx = idx;
++                    resultReso = reso;
++                }
++            }
++        }
++        mQueryResult[useCaseToQueryResults.begin()->first] =
++            useCaseToQueryResults.begin()->second[resultIdx];
++    }
++    CheckError(mQueryResult.empty(), UNKNOWN_ERROR, "%s, Failed to fill the map into mQueryResult",
++               __func__);
++
++    int key = -1;
++    string mcId, opMode;
++    mQueryResult.begin()->second->getValue(GCSS_KEY_KEY, key);
++    mQueryResult.begin()->second->getValue(GCSS_KEY_MC_ID, mcId);
++    mQueryResult.begin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
++    LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s", mCameraId,
++         mQueryResult.begin()->first, key, opMode.c_str());
++
++    if (mQueryResult.size() > 1) {
++        mQueryResult.rbegin()->second->getValue(GCSS_KEY_KEY, key);
++        mQueryResult.rbegin()->second->getValue(GCSS_KEY_MC_ID, mcId);
++        mQueryResult.rbegin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
++        LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s",
++             mCameraId, mQueryResult.rbegin()->first, key, opMode.c_str());
++    }
++    mMcId = mcId.empty() ? -1 : stoi(mcId);
++    ret = prepareGraphConfig();
++    CheckError(ret != OK, ret, "%s, Failed to prepare graph config: real ConfigMode: %x", __func__,
++               mConfigMode);
++
++    return OK;
++}
++
++/**
++ * Prepare graph config object
++ *
++ * Use graph query results as a parameter to getGraph. The result will be given
++ * to graph config object.
++ */
++status_t GraphConfigImpl::prepareGraphConfig() {
++    status_t status = OK;
++    mGraphConfigPipe.clear();
++
++    for (auto& query : mQueryResult) {
++        shared_ptr<GraphConfigPipe> graphConfigPipe =
++            std::make_shared<GraphConfigPipe>(query.first);
++        GCSS::IGraphConfig* result = nullptr;
++        css_err_t ret = mGraphQueryManager->createGraph(query.second, &result);
++        if (ret != css_err_none) {
++            delete result;
++            return UNKNOWN_ERROR;
++        }
++        status = graphConfigPipe->prepare(static_cast<GraphConfigNode*>(result),
++                                          mStreamToSinkIdMap[query.first]);
++        if (status != OK) {
++            delete result;
++            LOGE("Failed to prepare the GraphConfigPipe for pipe: %d", query.first);
++            return UNKNOWN_ERROR;
++        }
++        mGraphConfigPipe[query.first] = graphConfigPipe;
++        LOG1("Graph config object prepared");
++    }
++
++    return OK;
++}
++
++/*
++ * Do the secondary filter: configMode and stream format.
++ */
++status_t GraphConfigImpl::selectSetting(
++    int useCase, std::map<int, std::vector<GCSS::IGraphConfig*> >* queryResults) {
++    CheckError(!queryResults, UNKNOWN_ERROR, "%s, The queryResults is nullptr", __func__);
++    string opMode;
++    vector<GCSS::IGraphConfig*> internalQueryResults;
++
++    // Firstly, filter the config mode
++    for (auto& result : mFirstQueryResults) {
++        vector<ConfigMode> cfgModes;
++        result->getValue(GCSS_KEY_OP_MODE, opMode);
++        LOG1("The operation mode str in xml: %s", opMode.c_str());
++
++        CameraUtils::getConfigModeFromString(opMode, cfgModes);
++        LOG1("The query results supports configModes size: %zu", cfgModes.size());
++
++        for (const auto mode : cfgModes) {
++            if (mConfigMode == mode) {
++                internalQueryResults.push_back(result);
++                break;
++            }
++        }
++    }
++    CheckError(internalQueryResults.size() == 0, UNKNOWN_ERROR,
++               "Failed to query the results for configMode: %d", mConfigMode);
++
++    /*
++     * May still have multiple graphs after config mode parsing
++     * Those graphs have same resolution/configMode, but different output formats
++     * Do second graph query with format/bpp as query condition
++     */
++    map<HalStream*, uid_t>& streamToSinkIdMap = mStreamToSinkIdMap[useCase];
++    vector<GCSS::IGraphConfig*> secondQueryResults;
++    if (internalQueryResults.size() > 1) {
++        map<GCSS::ItemUID, std::string> queryItem;
++        for (auto const& item : streamToSinkIdMap) {
++            HalStream* s = item.first;
++            ItemUID formatKey = {(ia_uid)item.second, GCSS_KEY_FORMAT};
++            string fmt = graphconfig::utils::format2string(s->format());
++            queryItem[formatKey] = fmt;
++        }
++
++        LOG1("dumpQuery with format condition");
++        dumpQuery(useCase, queryItem);
++
++        /*
++         * Note: In some projects, there isn't format item in graph setting,
++         * So the result of this query may be empty, and ignore it.
++         */
++        mGraphQueryManager->queryGraphs(queryItem, internalQueryResults, secondQueryResults);
++        LOG2("The query results size: %zu after filtering format", secondQueryResults.size());
++    }
++
++    // Firstly, select the results with fully filtering
++    if (secondQueryResults.size() > 0) {
++        (*queryResults)[useCase] = secondQueryResults;
++    } else {
++        (*queryResults)[useCase] = internalQueryResults;
++    }
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData* data) {
++    // The graph id, csi output and sensor mode must be same if there are two graph config pipes
++    data->graphId = mGraphConfigPipe.begin()->second->getGraphId();
++    mGraphConfigPipe.begin()->second->getCSIOutputResolution(&(data->csiReso));
++
++    data->mcId = mMcId;
++    getGdcKernelSetting(&(data->gdcKernelId), &(data->gdcReso));
++
++    int ret = getPgNames(&(data->pgNames));
++    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get pg names", __func__);
++    for (auto& pgName : data->pgNames) {
++        IGraphType::PgInfo info;
++        info.pgName = pgName;
++        info.streamId = getStreamIdByPgName(pgName);
++        info.pgId = getPgIdByPgName(pgName);
++        getPgRbmValue(pgName, &info.rbmValue);
++        data->pgInfo.push_back(info);
++    }
++
++    ret = graphGetStreamIds(&(data->streamIds));
++    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get streamIds", __func__);
++    for (auto& streamId : data->streamIds) {
++        IGraphType::MbrInfo mBr;
++        mBr.streamId = streamId;
++        getMBRData(streamId, &mBr.data);
++        data->mbrInfo.push_back(mBr);
++
++        IGraphType::ProgramGroupInfo info;
++        info.streamId = streamId;
++        info.pgPtr = getProgramGroup(streamId);
++        data->programGroup.push_back(info);
++    }
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getGdcKernelSetting(uint32_t* kernelId,
++                                              ia_isp_bxt_resolution_info_t* resolution) {
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++    CheckError(!kernelId || !resolution, UNKNOWN_ERROR, "%s, the kernelId or resolution is nullptr",
++               __func__);
++
++    int ret = OK;
++    if (mGraphConfigPipe.size() == 1) {
++        ret = mGraphConfigPipe.begin()->second->getGdcKernelSetting(kernelId, resolution);
++    } else {
++        // Get the information from video pipe firstly
++        shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++        ret = videoGraphPipe->getGdcKernelSetting(kernelId, resolution);
++        if (ret != OK) {
++            shared_ptr<GraphConfigPipe>& stillGraphPipe =
++                mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++            ret = stillGraphPipe->getGdcKernelSetting(kernelId, resolution);
++        }
++    }
++    LOG2("%s, %s", __func__, ret != OK ? "No gdc resolution" : "Get gdc resolution successfully");
++
++    return OK;
++}
++
++status_t GraphConfigImpl::graphGetStreamIds(std::vector<int32_t>* streamIds) {
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        mGraphConfigPipe.begin()->second->graphGetStreamIds(streamIds);
++    } else {
++        vector<int32_t> stillStreamIds;
++        shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++        shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++
++        videoGraphPipe->graphGetStreamIds(streamIds);
++        stillGraphPipe->graphGetStreamIds(&stillStreamIds);
++
++        for (auto& id : stillStreamIds) {
++            if (std::find(streamIds->begin(), streamIds->end(), id) == streamIds->end())
++                streamIds->push_back(id);
++        }
++    }
++
++    CheckError(streamIds->empty(), UNKNOWN_ERROR, "%s, Failed to find any streamIds for all pipes",
++               __func__);
++
++    return OK;
++}
++
++int GraphConfigImpl::getStreamIdByPgName(std::string pgName) {
++    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
++
++    int streamId = -1;
++    for (auto& pipe : mGraphConfigPipe) {
++        streamId = pipe.second->getStreamIdByPgName(pgName);
++        if (streamId != -1) break;
++    }
++    return streamId;
++}
++
++int GraphConfigImpl::getPgIdByPgName(std::string pgName) {
++    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
++
++    int pgId = -1;
++    for (auto& pipe : mGraphConfigPipe) {
++        pgId = pipe.second->getPgIdByPgName(pgName);
++        if (pgId != -1) break;
++    }
++    return pgId;
++}
++
++ia_isp_bxt_program_group* GraphConfigImpl::getProgramGroup(int32_t streamId) {
++    CheckError(mGraphConfigPipe.empty(), nullptr, "%s, the mGraphConfigPipe is empty", __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        return mGraphConfigPipe.begin()->second->getProgramGroup(streamId);
++    }
++
++    // Find the streamd id from video graph pipe firstly
++    vector<int32_t> streamIds;
++    shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++    videoGraphPipe->graphGetStreamIds(&streamIds);
++    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
++        return videoGraphPipe->getProgramGroup(streamId);
++    }
++
++    shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++    return stillGraphPipe->getProgramGroup(streamId);
++}
++
++int GraphConfigImpl::getProgramGroup(std::string pgName,
++                                     ia_isp_bxt_program_group* programGroupForPG) {
++    for (auto& graph : mGraphConfigPipe) {
++        vector<string> pgNames;
++        graph.second->getPgNames(&pgNames);
++        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
++            return graph.second->getProgramGroup(pgName, programGroupForPG);
++        }
++    }
++
++    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
++    return UNKNOWN_ERROR;
++}
++
++status_t GraphConfigImpl::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits* data) {
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        return mGraphConfigPipe.begin()->second->getMBRData(streamId, data);
++    }
++
++    // Find the streamd id from video graph pipe firstly
++    vector<int32_t> streamIds;
++    shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++    videoGraphPipe->graphGetStreamIds(&streamIds);
++    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
++        return videoGraphPipe->getMBRData(streamId, data);
++    }
++
++    shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++    return stillGraphPipe->getMBRData(streamId, data);
++}
++
++status_t GraphConfigImpl::getPgNames(std::vector<std::string>* pgNames) {
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        mGraphConfigPipe.begin()->second->getPgNames(pgNames);
++    } else {
++        vector<string> stillPgNames;
++        shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++        shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++
++        videoGraphPipe->getPgNames(pgNames);
++        stillGraphPipe->getPgNames(&stillPgNames);
++
++        for (auto& pg : stillPgNames) {
++            if (std::find(pgNames->begin(), pgNames->end(), pg.c_str()) == pgNames->end())
++                pgNames->push_back(pg);
++        }
++    }
++
++    CheckError(pgNames->empty(), UNKNOWN_ERROR, "%s, Failed to get the PG's name for all pipes",
++               __func__);
++
++    return OK;
++}
++
++status_t GraphConfigImpl::pipelineGetConnections(
++    const std::vector<std::string>& pgList, std::vector<IGraphType::ScalerInfo>* scalerInfo,
++    std::vector<IGraphType::PipelineConnection>* confVector) {
++    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        return mGraphConfigPipe.begin()->second->pipelineGetConnections(pgList, scalerInfo,
++                                                                        confVector);
++    }
++
++    vector<IGraphType::PipelineConnection> stillConnVector, videoConnVector;
++    shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++    shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++
++    std::vector<IGraphType::ScalerInfo> stillScalerInfo, videoScalerInfo;
++    int ret = videoGraphPipe->pipelineGetConnections(pgList, &videoScalerInfo, &videoConnVector);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from video pipe");
++    ret = stillGraphPipe->pipelineGetConnections(pgList, &stillScalerInfo, &stillConnVector);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from still pipe");
++
++    LOG2("The connetction in video: %zu, in still: %zu; the scalera in video: %zu, in still: %uz",
++         videoConnVector.size(), stillConnVector.size(), videoScalerInfo.size(),
++         stillScalerInfo.size());
++
++    if (!stillScalerInfo.empty()) {
++        for (auto& stillScaler : stillScalerInfo) {
++            videoScalerInfo.push_back(stillScaler);
++        }
++    }
++    *scalerInfo = videoScalerInfo;
++
++    if (videoConnVector.empty()) {
++        videoConnVector = stillConnVector;
++    } else {
++        if (stillConnVector.size() > 0) {
++            LOG1("Need to merge the two connetction vector: %zu", stillConnVector.size());
++        }
++        for (auto& stillConn : stillConnVector) {
++            bool sameTerminalId = false;
++            for (auto& conn : videoConnVector) {
++                if (conn.portFormatSettings.terminalId == stillConn.portFormatSettings.terminalId) {
++                    sameTerminalId = true;
++                    if (conn.portFormatSettings.enabled == 0 &&
++                        stillConn.portFormatSettings.enabled == 1)
++                        conn = stillConn;
++                    break;
++                }
++            }
++            if (!sameTerminalId) videoConnVector.push_back(stillConn);
++        }
++    }
++    CheckError(videoConnVector.empty(), UNKNOWN_ERROR,
++               "%s, Failed to get connetctions from graph config pipe", __func__);
++
++    LOG2("dump the final connetction");
++    GraphUtils::dumpConnections(videoConnVector);
++    *confVector = videoConnVector;
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId,
++                                           int32_t* pgId) {
++    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
++    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty",
++               __func__);
++
++    if (mGraphConfigPipe.size() == 1) {
++        return mGraphConfigPipe.begin()->second->getPgIdForKernel(streamId, kernelId, pgId);
++    }
++
++    vector<int32_t> streamIds;
++    shared_ptr<GraphConfigPipe>& videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
++    videoGraphPipe->graphGetStreamIds(&streamIds);
++    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end())
++        return videoGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
++
++    shared_ptr<GraphConfigPipe>& stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
++    return stillGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
++}
++
++status_t GraphConfigImpl::getPgRbmValue(string pgName, IGraphType::StageAttr* stageAttr) {
++    for (auto& graph : mGraphConfigPipe) {
++        vector<string> pgNames;
++        graph.second->getPgNames(&pgNames);
++        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
++            return graph.second->getPgRbmValue(pgName, stageAttr);
++        }
++    }
++
++    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
++    return UNKNOWN_ERROR;
++}
++
++/******************************************************************************
++ *  HELPER METHODS
++ ******************************************************************************/
++/**
++ * Check the gralloc hint flags and decide whether this stream should be served
++ * by Video Pipe or Still Pipe
++ */
++bool GraphConfigImpl::isVideoStream(HalStream* stream) {
++    if (stream->useCase() == USE_CASE_PREVIEW || stream->useCase() == USE_CASE_VIDEO) return true;
++
++    return false;
++}
++
++void GraphConfigImpl::dumpQuery(int useCase, const map<GCSS::ItemUID, std::string>& query) {
++    map<GCSS::ItemUID, std::string>::const_iterator it;
++    it = query.begin();
++    LOG1("Query Dump --- %d --- Start", useCase);
++    for (; it != query.end(); ++it) {
++        LOG1("item: %s value %s", it->first.toString().c_str(), it->second.c_str());
++    }
++    LOG1("Query Dump --- %d --- End", useCase);
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
+new file mode 100644
+index 000000000000..9158172f20ec
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
+@@ -0,0 +1,183 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <gcss.h>
++
++#include <map>
++#include <memory>
++#include <string>
++#include <unordered_map>
++#include <utility>
++#include <vector>
++
++#include "HalStream.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "iutils/Utils.h"
++#include "modules/algowrapper/graph/GraphConfigPipe.h"
++
++namespace icamera {
++
++/**
++ * \enum AndroidGraphConfigKey
++ * List of keys that are Android Specific used in queries of settings by
++ * the GraphConfigImpl.
++ *
++ * The enum should not overlap with the enum of tags already predefined by the
++ * parser, hence the initial offset.
++ */
++#define GCSS_KEY(key, str) GCSS_KEY_##key,
++enum AndroidGraphConfigKey {
++    GCSS_ANDROID_KEY_START = GCSS_KEY_START_CUSTOM_KEYS,
++    #include "custom_gcss_keys.h"
++};
++#undef GCSS_KEY
++
++/**
++ * Static data for graph settings for given sensor. Used to initialize GraphConfigImpl.
++ */
++class GraphConfigNodes {
++ public:
++    GraphConfigNodes();
++    ~GraphConfigNodes();
++
++ public:
++    GCSS::IGraphConfig* mDesc;
++    GCSS::IGraphConfig* mSettings;
++
++ private:
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfigNodes);
++};
++
++/**
++ * \class GraphConfigImpl
++ *
++ * Class to wrap over parsing and executing queries on graph settings.
++ * It creates the query rule based on graph settings type and stream list
++ * from user. And filter the final result for current stream config.
++ * It supports COUPLED and DISPERSED
++ *
++ * GraphConfigImpl maintains a GraphConfigPipe map table, each item for one
++ * pipe. And it provides the public APIs to get the useful information which
++ * builds PSYS pipe.
++ *
++ * At camera open, GraphConfigImpl object is created.
++ * In stream config period, GraphConfigImpl creates the GraphConfigPipe map which is
++ * current stream configuration. And HAL can get all the necessary information to
++ * create PSYS pipe.
++ */
++class GraphConfigImpl {
++ public:
++    GraphConfigImpl();
++    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
++    virtual ~GraphConfigImpl();
++
++    /*
++     * Methods for XML parsing for XML parsing
++     */
++    void addCustomKeyMap();
++    status_t parse(int cameraId, const char* graphDescFile, const char* settingsFile);
++    status_t parse(int cameraId, char* graphDescData, size_t descDataSize, char* settingsData,
++                   size_t settingsDataSize);
++    void releaseGraphNodes();
++
++    // These public methods called by GraphConfig
++    status_t configStreams(const std::vector<HalStream*>& activeStreams);
++    status_t getGraphConfigData(IGraphType::GraphConfigData* data);
++
++    int getProgramGroup(std::string pgName, ia_isp_bxt_program_group* programGroupForPG);
++    status_t getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t* pgId);
++
++    status_t pipelineGetConnections(const std::vector<std::string>& pgList,
++                                    std::vector<IGraphType::ScalerInfo>* scalerInfo,
++                                    std::vector<IGraphType::PipelineConnection>* confVector);
++
++ private:
++    status_t prepareGraphConfig();
++    bool isVideoStream(HalStream* stream);
++    status_t selectSetting(int useCase,
++                           std::map<int, std::vector<GCSS::IGraphConfig*> >* queryResults);
++    status_t createQueryRule(const std::vector<HalStream*>& activeStreams);
++    status_t getRawInputSize(GCSS::IGraphConfig* query, camera_resolution_t* reso);
++
++    status_t getGdcKernelSetting(uint32_t* kernelId, ia_isp_bxt_resolution_info_t* resolution);
++    status_t graphGetStreamIds(std::vector<int32_t>* streamIds);
++    int getStreamIdByPgName(std::string pgName);
++    int getPgIdByPgName(std::string pgName);
++    ia_isp_bxt_program_group* getProgramGroup(int32_t streamId);
++    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr* stageAttr);
++    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits* data);
++    status_t getPgNames(std::vector<std::string>* pgNames);
++
++    // Debug helper
++    void dumpQuery(int useCase, const std::map<GCSS::ItemUID, std::string>& query);
++
++ private:
++    static Mutex sLock;
++    static std::unordered_map<int32_t, GraphConfigNodes*> mGraphNode;
++    /**
++     * Pair of ItemUIDs to store the width and height of a stream
++     * first item is for width, second for height
++     */
++    typedef std::pair<GCSS::ItemUID, GCSS::ItemUID> ResolutionItem;
++
++    int32_t mCameraId;
++    std::unique_ptr<GCSS::GraphQueryManager> mGraphQueryManager;
++    /*
++     * The query interface uses types that are actually STL maps and vectors
++     * to avoid the creation/deletion on the stack for every call we
++     * have them as member variables.
++     * - The first item of mQuery is stream useCase(VIDEO or STILL),
++     * - and the second is an query rule map(GCSS_KEY_, VALUE).
++     */
++    std::map<int, std::map<GCSS::ItemUID, std::string> > mQuery;
++
++    /**
++     * Map to get the virtual sink id from a client stream pointer.
++     * The uid is one of the GCSS keys defined for the virtual sinks, like
++     * GCSS_KEY_VIDEO0 or GCSS_KEY_STILL1
++     * From that we can derive the name using the id to string methods from
++     * ItemUID class
++     *  - The first item is streams useCase(VIDEO or STILL)
++     *  - and the second is the stream to virtual sink map
++     */
++    std::map<int, std::map<HalStream*, uid_t> > mStreamToSinkIdMap;
++
++    /*
++     * This vector is used to store the first query result.
++     * After that we also need to filter the results with configMode,
++     * stream format, and matched isys output resolution.
++     */
++    std::vector<GCSS::IGraphConfig*> mFirstQueryResults;
++
++    // The stream useCase to result map
++    std::map<int, GCSS::IGraphConfig*> mQueryResult;
++
++    // The stream useCase to GraphConfigPipe map
++    std::map<int, std::shared_ptr<GraphConfigPipe> > mGraphConfigPipe;
++
++    ConfigMode mConfigMode;
++    GraphSettingType mType;
++    int mMcId;
++
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
+new file mode 100644
+index 000000000000..6c0c064aaa36
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
+@@ -0,0 +1,2008 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GraphConfigPipe"
++
++#include "modules/algowrapper/graph/GraphConfigPipe.h"
++
++#include <GCSSParser.h>
++#include <gcss.h>
++#include <gcss_utils.h>
++#include <ia_pal_types_isp_ids_autogen.h>
++#include <v4l2_device.h>
++
++#include <algorithm>
++
++#include "FormatUtils.h"
++#include "GraphUtils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "linux/media-bus-format.h"
++
++using GCSS::GraphConfigNode;
++using std::string;
++using std::vector;
++namespace gcu = graphconfig::utils;
++
++namespace icamera {
++#define STRINGIFY1(x) #x
++#define STRINGIFY(x) STRINGIFY1(x)
++
++// TODO: Change the format attribute natively as integer attribute
++#ifndef VIDEO_RECORDING_FORMAT
++#define VIDEO_RECORDING_FORMAT TILE
++#endif
++
++const char* SENSOR_PORT_NAME = "sensor:port_0";
++const char* TPG_PORT_NAME = "tpg:port_0";
++
++#define DB_KERNEL_SIZE 2
++#define PPP_KERNEL_SIZE 2
++#define DS_KERNEL_SIZE 2
++uint32_t dpKernel[DB_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_dp,
++                                     ia_pal_uuid_isp_sc_outputscaler_dp_1_1};
++uint32_t pppKernel[PPP_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_ppp,
++                                       ia_pal_uuid_isp_sc_outputscaler_ppp_1_1};
++uint32_t dsKernel[DS_KERNEL_SIZE] = {ia_pal_uuid_isp_b2i_ds_1_0_0, ia_pal_uuid_isp_b2i_ds_1_0_1};
++
++GraphConfigPipe::GraphConfigPipe(int pipeUseCase)
++        : mSettings(nullptr),
++          mReqId(0),
++          mMetaEnabled(false),
++          mSourceType(SRC_NONE),
++          mPipeUseCase(pipeUseCase) {
++    mCsiOutput = {0, 0};
++}
++
++GraphConfigPipe::~GraphConfigPipe() {
++    fullReset();
++}
++/*
++ * Full reset
++ * This is called whenever we want to reset the whole object. Currently that
++ * is only, when GraphConfigPipe object is destroyed.
++ */
++void GraphConfigPipe::fullReset() {
++    mSourcePortName.clear();
++    mSinkPeerPort.clear();
++    mStreamToSinkIdMap.clear();
++    delete mSettings;
++    mSettings = nullptr;
++    mReqId = 0;
++    mStream2TuningMap.clear();
++    mProgramGroup.clear();
++}
++/*
++ * Reset
++ * This is called per frame
++ */
++void GraphConfigPipe::reset(GraphConfigPipe* me) {
++    if (me != nullptr) {
++        me->mReqId = 0;
++    } else {
++        LOGE("Trying to reset a null GraphConfigPipe - BUG!");
++    }
++}
++
++const GCSS::IGraphConfig* GraphConfigPipe::getInterface(Node* node) const {
++    if (!node) return nullptr;
++
++    return node;
++}
++
++const GCSS::IGraphConfig* GraphConfigPipe::getInterface() const {
++    return mSettings;
++}
++
++int GraphConfigPipe::getGraphId(void) {
++    int graphId = -1;
++    int ret = mSettings->getValue(GCSS_KEY_ID, graphId);
++    if (ret != css_err_none) {
++        LOGE("Failed to get graphId");
++        return BAD_VALUE;
++    }
++
++    LOGG("%s: graphId %d", __func__, graphId);
++    return graphId;
++}
++
++/**
++ * Per frame initialization of graph config.
++ * Updates request id
++ * \param[in] reqId
++ */
++void GraphConfigPipe::init(int32_t reqId) {
++    mReqId = reqId;
++}
++
++/**
++ * Prepare graph config once per stream config.
++ * \param[in] manager
++ * \param[in] settings
++ * \param[in] streamToSinkIdMap
++ * \param[in] active
++ */
++status_t GraphConfigPipe::prepare(Node* settings, const StreamToSinkMap& streamToSinkIdMap) {
++    mSettings = settings;
++    status_t ret = OK;
++
++    if (settings == nullptr) {
++        LOGW("Settings is NULL!! - BUG?");
++        return UNKNOWN_ERROR;
++    }
++
++    ret = analyzeSourceType();
++    if (ret != OK) {
++        LOGE("Failed to analyze source type");
++        return ret;
++    }
++
++    ret = getActiveOutputPorts(streamToSinkIdMap);
++    if (ret != OK) {
++        LOGE("Failed to get output ports");
++        return ret;
++    }
++    // Options should be updated before kernel list generation
++    ret = handleDynamicOptions();
++    if (ret != OK) {
++        LOGE("Failed to update options");
++        return ret;
++    }
++
++    const GCSS::IGraphConfig* gcHandle = getInterface(mSettings);
++    css_err_t status = mGCSSAicUtil.initAicUtils(gcHandle);
++    if (status != css_err_none) {
++        LOGE("Failed to generate kernel list");
++        return UNKNOWN_ERROR;
++    }
++
++    calculateSinkDependencies();
++    storeTuningModes();
++    analyzeCSIOutput();
++
++    return ret;
++}
++
++/**
++ * Store the tuning modes for each stream id into a map that can be used on a
++ * per frame basis.
++ * This method is executed once per stream configuration.
++ * The tuning mode is used by AIC to find the correct tuning tables in CPF.
++ *
++ */
++void GraphConfigPipe::storeTuningModes() {
++    GraphConfigNode::const_iterator it = mSettings->begin();
++    css_err_t ret = css_err_none;
++    GraphConfigNode* result = nullptr;
++    int32_t tuningMode = 0;
++    int32_t streamId = 0;
++    mStream2TuningMap.clear();
++
++    while (it != mSettings->end()) {
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
++        if (ret == css_err_none) {
++            ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
++            if (ret != css_err_none) {
++                string pgName;
++                // This should  not fail
++                ret = result->getValue(GCSS_KEY_NAME, pgName);
++                LOGW("Failed to find stream id for PG %s", pgName.c_str());
++                continue;
++            }
++            tuningMode = 0;  // default value in case it is not found
++            ret = result->getValue(GCSS_KEY_TUNING_MODE, tuningMode);
++            if (ret != css_err_none) {
++                string pgName;
++                // This should  not fail
++                ret = result->getValue(GCSS_KEY_NAME, pgName);
++                LOG2("There isn't tuning mode for PG %s, defaulting to %d", pgName.c_str(),
++                     tuningMode);
++            }
++            mStream2TuningMap[streamId] = tuningMode;
++        }
++    }
++}
++/**
++ * Retrieve the tuning mode associated with a given stream id.
++ *
++ * The tuning mode is defined by IQ-studio and represent and index to different
++ * set of tuning parameters in the AIQB (a.k.a CPF)
++ *
++ * The tuning mode is an input parameter for AIC.
++ * \param [in] streamId Identifier for the branch (video/still/isa)
++ * \return tuning mode, if stream id is not found defaults to 0
++ */
++int32_t GraphConfigPipe::getTuningMode(int32_t streamId) {
++    auto item = mStream2TuningMap.find(streamId);
++    if (item != mStream2TuningMap.end()) {
++        return item->second;
++    }
++    LOGW("Could not find tuning mode for requested stream id %d", streamId);
++    return 0;
++}
++
++/*
++ * According to the node, analyze the source type:
++ * TPG or sensor
++ */
++status_t GraphConfigPipe::analyzeSourceType() {
++    bool hasSensor = false, hasTPG = false;
++    Node* inputDevNode = nullptr;
++    css_err_t ret = mSettings->getDescendant(GCSS_KEY_SENSOR, &inputDevNode);
++    if (ret == css_err_none) {
++        mSourceType = SRC_SENSOR;
++        mSourcePortName = SENSOR_PORT_NAME;
++        hasSensor = true;
++    } else {
++        LOG1("No sensor node from the graph");
++    }
++
++    ret = mSettings->getDescendant(GCSS_KEY_TPG, &inputDevNode);
++    if (ret == css_err_none) {
++        mSourceType = SRC_TPG;
++        mSourcePortName = TPG_PORT_NAME;
++        hasTPG = true;
++    } else {
++        LOG1("No TPG node from the graph");
++    }
++
++    if (hasTPG == hasSensor) {
++        // failed to analyze source type, reset them
++        mSourceType = SRC_NONE;
++        mSourcePortName.clear();
++        LOGE("Error: Both TPG/Sensor exist or none of TPG/Sensor");
++        return UNKNOWN_ERROR;
++    }
++
++    return OK;
++}
++
++status_t GraphConfigPipe::analyzeCSIOutput() {
++    vector<string> csiBeOutput = {"csi_be:output",
++                                  "csi_be_soc:output"};
++    for (auto& item : csiBeOutput) {
++        GCSS::IGraphConfig* csiBeNode =
++            static_cast<GCSS::IGraphConfig*>(mSettings)->getDescendantByString(item.c_str());
++        if (csiBeNode != nullptr) {
++            GCSS::GraphCameraUtil::getDimensions(csiBeNode, &mCsiOutput.width, &mCsiOutput.height);
++            return OK;
++        }
++    }
++
++    LOGE("Error: Couldn't get CSI-BE node");
++    return UNKNOWN_ERROR;
++}
++
++status_t GraphConfigPipe::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits* data) {
++    css_err_t ret = mGCSSAicUtil.getMbrData(streamId, data);
++    if (ret == css_err_none) {
++        return OK;
++    } else {
++        LOG2("fail to getMBRData for stream id:%d", streamId);
++        return UNKNOWN_ERROR;
++    }
++}
++/**
++ * Finds the sink nodes and the output port peer. Use streamToSinkIdMap
++ * since we are intrested only in sinks that serve a stream. Takes an
++ * internal copy of streamToSinkIdMap to be used later.
++ *
++ * \param[in] streamToSinkIdMap to get the virtual sink id from a client stream pointer
++ * \return OK in case of success.
++ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
++ */
++status_t GraphConfigPipe::getActiveOutputPorts(const StreamToSinkMap& streamToSinkIdMap) {
++    status_t status = OK;
++    css_err_t ret = css_err_none;
++    std::vector<GCSS::IGraphConfig*> sinks;
++
++    mStreamToSinkIdMap.clear();
++    mStreamToSinkIdMap = streamToSinkIdMap;
++    mSinkPeerPort.clear();
++
++    StreamToSinkMap::const_iterator it;
++    it = streamToSinkIdMap.begin();
++
++    for (; it != streamToSinkIdMap.end(); ++it) {
++        sinks.clear();
++        status = GCSS::GraphCameraUtil::graphGetSinksByName(GCSS::ItemUID::key2str(it->second),
++                                                            mSettings, sinks);
++        if (status != OK || sinks.empty()) {
++            string sinkName = GCSS::ItemUID::key2str(it->second);
++            LOGE("Found %zu sinks, expecting 1 for sink %s", sinks.size(), sinkName.c_str());
++            return BAD_VALUE;
++        }
++
++        Node* sink = static_cast<GraphConfigNode*>(sinks[0]);
++        Node* outputPort = nullptr;
++
++        // Get the sinkname for getting the output port
++        string sinkName;
++        ret = sink->getValue(GCSS_KEY_NAME, sinkName);
++        if (ret != css_err_none) {
++            LOGE("Failed to get sink name");
++            return BAD_VALUE;
++        }
++        LOG2("sink name %s", sinkName.c_str());
++
++        int32_t streamId = -1;
++        ret = sink->getValue(GCSS_KEY_STREAM_ID, streamId);
++        if (ret != css_err_none) {
++            LOGE("Failed to get stream id");
++            return BAD_VALUE;
++        }
++        LOG2("stream id %d", streamId);
++
++        outputPort = getOutputPortForSink(sinkName);
++        if (outputPort == nullptr) {
++            LOGE("No output port found for sink");
++            return UNKNOWN_ERROR;
++        }
++
++        LOG2("output port name %s", NODE_NAME(outputPort));
++        mSinkPeerPort[sink] = outputPort;
++    }
++
++    return OK;
++}
++
++string GraphConfigPipe::getNodeName(Node* node) {
++    string nodeName("");
++    if (node == nullptr) {
++        LOGE("Node is NULL");
++        return nodeName;
++    }
++
++    node->getValue(GCSS_KEY_NAME, nodeName);
++    return nodeName;
++}
++
++/**
++ * Finds the output port which is the peer to the sink node.
++ *
++ * Gets root node, and finds the sink with the given name. Use portGetPeer()
++ * to find the output port.
++ * \return GraphConfigNode in case of success.
++ * \return nullptr in case of fail.
++ */
++Node* GraphConfigPipe::getOutputPortForSink(const string& sinkName) {
++    css_err_t ret = css_err_none;
++    status_t retErr = OK;
++    Node* rootNode = nullptr;
++    Node* portNode = nullptr;
++    Node* peerNode = nullptr;
++
++    rootNode = mSettings->getRootNode();
++    if (rootNode == nullptr) {
++        LOGE("Couldn't get root node, BUG!");
++        return nullptr;
++    }
++    ret = rootNode->getDescendantByString(sinkName, &portNode);
++    if (ret != css_err_none) {
++        LOGE("Error getting sink");
++        return nullptr;
++    }
++    retErr = portGetPeer(portNode, &peerNode);
++    if (retErr != OK) {
++        LOGE("Error getting peer");
++        return nullptr;
++    }
++    return peerNode;
++}
++
++/**
++ * Update the option-list to the graph tree.
++ * TODO: Add more options.
++ * \return OK in case of success
++ * \return UNKNOWN_ERROR if graph update failed.
++ */
++status_t GraphConfigPipe::handleDynamicOptions() {
++    status_t status = setPortFormats();
++    if (status != OK) {
++        LOGE("Failed to update metadata");
++        return UNKNOWN_ERROR;
++    }
++
++    // TODO add other options
++    return status;
++}
++
++/**
++ * Returns true if the given node is used to output a video record
++ * stream. The sink name is found and used to find client stream from the
++ * mStreamToSinkIdMap.
++ * Then the video encoder gralloc flag is checked from the stream flags of the
++ * client stream.
++ * \param[in] peer output port to find the sink node of.
++ * \return true if sink port serves a video record stream.
++ * \return false if sink port does not serve a video record stream.
++ */
++bool GraphConfigPipe::isVideoRecordPort(Node* sink) {
++    css_err_t ret = css_err_none;
++    string sinkName;
++    HalStream* clientStream = nullptr;
++
++    if (sink == nullptr) {
++        LOGE("No sink node provided");
++        return false;
++    }
++
++    ret = sink->getValue(GCSS_KEY_NAME, sinkName);
++    if (ret != css_err_none) {
++        LOGE("Failed to get sink name");
++        return false;
++    }
++
++    // Find the client stream for the sink port
++    StreamToSinkMap::iterator it1;
++    it1 = mStreamToSinkIdMap.begin();
++
++    for (; it1 != mStreamToSinkIdMap.end(); ++it1) {
++        if (GCSS::ItemUID::key2str(it1->second) == sinkName) {
++            clientStream = it1->first;
++            break;
++        }
++    }
++
++    if (clientStream == nullptr) {
++        LOGE("Failed to find client stream");
++        return false;
++    }
++
++    if (clientStream->useCase() == USE_CASE_VIDEO) {
++        LOG2("%s is video record port", NODE_NAME(sink));
++        return true;
++    }
++
++    return false;
++}
++
++/**
++ * Takes a stream id, and checks if it exists in the graph.
++ *
++ * \param[in] streamId
++ * \return true if found, false otherwise
++ */
++bool GraphConfigPipe::hasStreamInGraph(int streamId) {
++    status_t status;
++    StreamsVector streamsFound;
++
++    status = graphGetStreamIds(&streamsFound);
++    if (status != OK) return false;
++
++    for (auto id : streamsFound) {
++        if (id == streamId) return true;
++    }
++    return false;
++}
++
++/**
++ * Apply the video recording format for the video record stream handling
++ * output port.
++ * \return OK in case of success
++ * \return UNKNOWN_ERROR if option list apply failed.
++ */
++status_t GraphConfigPipe::setPortFormats() {
++    css_err_t ret = css_err_none;
++    std::map<Node*, Node*>::iterator it;
++    it = mSinkPeerPort.begin();
++
++    for (; it != mSinkPeerPort.end(); ++it) {
++        Node* sink = it->first;
++        Node* peer = it->second;
++        if (!isVideoRecordPort(sink)) continue;
++
++        ret = peer->setValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
++        if (ret != css_err_none) {
++            // If format attribute does not exist, create it.
++            ret = peer->addValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
++            if (ret != css_err_none) {
++                LOGE("Failed to update options for video record port");
++                return UNKNOWN_ERROR;
++            }
++        }
++    }
++
++    return OK;
++}
++
++/**
++ * Returns pointer to kernel list based on given stream id
++ * \param[in] streamId Return kernel list for this stream id
++ * \return ia_isp_bxt_program_group
++ */
++ia_isp_bxt_program_group* GraphConfigPipe::getProgramGroup(int32_t streamId) {
++    if (mProgramGroup.find(streamId) == mProgramGroup.end()) {
++        ia_isp_bxt_program_group programGroup;
++        CLEAR(programGroup);
++        mGCSSAicUtil.getProgramGroup(streamId, programGroup);
++        mProgramGroup[streamId] = programGroup;
++    }
++    LOGG("Dump kernel info for stream %d", streamId);
++    GraphUtils::dumpKernelInfo(mProgramGroup[streamId]);
++
++    return &(mProgramGroup[streamId]);
++}
++
++int GraphConfigPipe::getProgramGroup(string pgName, ia_isp_bxt_program_group* programGroupForPG) {
++    GCSS::NodeIterator iter(mSettings);
++    GCSS::IGraphConfig* pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
++    std::string name;
++    for (; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
++        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
++        CheckError(ret != css_err_none, BAD_VALUE,
++                   "Failed to get the name of an existing PG node, BUG");
++        if (name == pgName) {
++            break;
++        }
++    }
++    CheckError(pg == nullptr, UNKNOWN_ERROR, "Failed to get program groups, BUG");
++
++    mGCSSAicUtil.getProgramGroup(pg, *programGroupForPG);
++
++    LOGG("Dump kernel info for %s", pgName.c_str());
++    GraphUtils::dumpKernelInfo(*programGroupForPG);
++
++    return OK;
++}
++
++status_t GraphConfigPipe::getPgRbmValue(string pgName, IGraphType::StageAttr* stageAttr) {
++    std::string name;
++    GCSS::NodeIterator iter(mSettings);
++    GCSS::IGraphConfig* pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
++
++    for (; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
++        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
++        CheckError(ret != css_err_none, BAD_VALUE, "Failed to get the name of PG node");
++        if (name == pgName) {
++            break;
++        }
++    }
++    CheckError(pg == nullptr, UNKNOWN_ERROR, "Failed to get program groups for PG: %s",
++               pgName.c_str());
++
++    pg = pg->getDescendant(GCSS_KEY_CIPF);
++    if (pg == nullptr) return NAME_NOT_FOUND;
++
++    string rbmString;
++    css_err_t ret = pg->getValue(GCSS_KEY_RBM, rbmString);
++    if (ret != css_err_none) return NAME_NOT_FOUND;
++
++    GCSS::GraphCameraUtil mGCSSCameraUtil;
++    stageAttr->rbm = mGCSSCameraUtil.numString2binary(rbmString, &stageAttr->rbm_bytes);
++    CheckError(!stageAttr->rbm, NO_MEMORY, "%s get rbm value: %s", __func__, rbmString.c_str());
++
++    return OK;
++}
++
++status_t GraphConfigPipe::getScalerKernelResolutionRatio(uint32_t* kenerArray, uint32_t sizeArray,
++                                                         float* widthRatio, float* heightRatio) {
++    CheckError(!kenerArray, UNKNOWN_ERROR, "%s the array is null", __func__);
++    CheckError(!widthRatio || !heightRatio, UNKNOWN_ERROR, "%s widthRatio or heightRatio is null",
++               __func__);
++
++    const ia_isp_bxt_resolution_info_t* resolutionInfo;
++    resolutionInfo = getScalerKernelResolutionInfo(kenerArray, sizeArray);
++    CheckError(!resolutionInfo, UNKNOWN_ERROR, "%s getScalerKernelResolutionInfo fails", __func__);
++
++    *widthRatio = 1.0;
++    *heightRatio = 1.0;
++    const ia_rectangle* input_crop = &resolutionInfo->input_crop;
++    const ia_rectangle* output_crop = &resolutionInfo->output_crop;
++    if (((resolutionInfo->input_width != resolutionInfo->output_width) ||
++         (resolutionInfo->input_height != resolutionInfo->output_height)) &&
++        ((input_crop->left == 0) && (input_crop->top == 0) && (input_crop->right == 0) &&
++         (input_crop->bottom == 0)) &&
++        ((output_crop->left == 0) && (output_crop->top == 0) && (output_crop->right == 0) &&
++         (output_crop->bottom == 0))) {
++        *widthRatio = static_cast<float>(resolutionInfo->input_width) /
++                      static_cast<float>(resolutionInfo->output_width);
++        *heightRatio = static_cast<float>(resolutionInfo->input_height) /
++                       static_cast<float>(resolutionInfo->output_height);
++        LOG2("%s, width:%d-%d; height:%d-%d", __func__, resolutionInfo->input_width,
++             resolutionInfo->output_width, resolutionInfo->input_height,
++             resolutionInfo->output_height);
++    }
++    return OK;
++}
++
++const ia_isp_bxt_resolution_info_t* GraphConfigPipe::getScalerKernelResolutionInfo(
++    uint32_t* kenerArray, uint32_t sizeArray) {
++    CheckError(!kenerArray, nullptr, "%s the array is null", __func__);
++
++    std::vector<int32_t> streamIds;
++    // Get all stream IDs
++    status_t ret = graphGetStreamIds(&streamIds);
++    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
++
++    uint32_t kernelId = kenerArray[0];
++    int32_t streamIdTmp = VIDEO_STREAM_ID;
++
++    bool hasVideo = false;
++    for (auto streamId : streamIds) {
++        for (uint32_t i = 0; i < sizeArray; i++) {
++            if (isKernelInStream(streamId, kenerArray[i])) {
++                LOG2("%s, found outputscaler %u from stream %d", __func__, kenerArray[i], streamId);
++                streamIdTmp = streamId;
++                kernelId = kenerArray[i];
++                if (streamId == VIDEO_STREAM_ID) hasVideo = true;
++
++                break;
++            }
++        }
++        if (hasVideo) break;
++    }
++
++    // Get resolution as per above kernel and stream
++    return getKernelResolutionInfo(streamIdTmp, kernelId);
++}
++
++const ia_isp_bxt_resolution_info_t* GraphConfigPipe::getGdcKernelResolutionInfo(
++    uint32_t* kernelId) {
++    CheckError(!kernelId, nullptr, "%s the kernelId is nullptr", __func__);
++
++    std::vector<int32_t> streamIds;
++    // Get all stream IDs
++    status_t ret = graphGetStreamIds(&streamIds);
++    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
++
++    *kernelId = ia_pal_uuid_isp_gdc3;
++    LOG1("%s, initalize gdc version 3 as default", __func__);
++    int32_t gdcStreamId = VIDEO_STREAM_ID;
++    LOG1("%s, initalize gdc video stream as default", __func__);
++
++    // Check video stream for gdc version firstly,
++    // in case more than one stream contain gdc kernel.
++    bool hasVideoGdc = false;
++    for (auto streamId : streamIds) {
++        if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1)) {
++            LOG1("%s, found gdc3_1 from stream %d", __func__, streamId);
++            gdcStreamId = streamId;
++            *kernelId = ia_pal_uuid_isp_gdc3_1;
++            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
++        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3)) {
++            LOG1("%s, found gdc3 from stream %d", __func__, streamId);
++            gdcStreamId = streamId;
++            *kernelId = ia_pal_uuid_isp_gdc3;
++            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
++        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1_1)) {
++            LOG1("%s, found gdc3_1_1 from stream %d", __func__, streamId);
++            gdcStreamId = streamId;
++            *kernelId = ia_pal_uuid_isp_gdc3_1_1;
++            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
++        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc5)) {
++            LOG1("%s, found gdc5 from stream %d", __func__, streamId);
++            gdcStreamId = streamId;
++            *kernelId = ia_pal_uuid_isp_gdc5;
++            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
++        }
++        if (hasVideoGdc) break;
++    }
++
++    // Get resolution as per above kernel and stream
++    return getKernelResolutionInfo(gdcStreamId, *kernelId);
++}
++
++status_t GraphConfigPipe::getGdcKernelSetting(uint32_t* kernelId,
++                                              ia_isp_bxt_resolution_info_t* resolution) {
++    CheckError(!kernelId || !resolution, UNKNOWN_ERROR, "%s, the kernelId or resolution is nullptr",
++               __func__);
++
++    // Get resolution as per above kernel and stream
++    const ia_isp_bxt_resolution_info_t* gdcResolution = getGdcKernelResolutionInfo(kernelId);
++    CheckWarning(!gdcResolution, NO_ENTRY, "Couldn't get the GDC resolution in current pipe: %d",
++                 mPipeUseCase);
++
++    *resolution = *gdcResolution;
++
++    LOGG("%s: kernel %d, inResolution %dx%d, outResolution %dx%d", __func__, *kernelId,
++         resolution->input_width, resolution->input_height, resolution->output_width,
++         resolution->output_height);
++
++    LOGG("%s: kernel %d, inputCrop %d,%d,%d,%d; outputCrop %d,%d,%d,%d", __func__, *kernelId,
++         resolution->input_crop.left, resolution->input_crop.top, resolution->input_crop.right,
++         resolution->input_crop.bottom, resolution->output_crop.left, resolution->output_crop.top,
++         resolution->output_crop.right, resolution->output_crop.bottom);
++
++    return OK;
++}
++
++const ia_isp_bxt_resolution_info_t* GraphConfigPipe::getKernelResolutionInfo(uint32_t streamId,
++                                                                             uint32_t kernelId) {
++    ia_isp_bxt_program_group* programGroup = getProgramGroup(streamId);
++    if (programGroup == nullptr) {
++        return nullptr;
++    }
++
++    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
++        if (programGroup->run_kernels[i].stream_id == streamId &&
++            programGroup->run_kernels[i].kernel_uuid == kernelId) {
++            return programGroup->run_kernels[i].resolution_info;
++        }
++    }
++
++    return nullptr;
++}
++
++/**
++ * check whether the kernel is in this stream
++ *
++ * \param[in] streamId stream id.
++ * \param[in] kernelId kernel id.
++ * \param[out] whether the kernel in this stream
++ * \return true the kernel is in this stream
++ * \return false the kernel isn't in this stream.
++ *
++ */
++bool GraphConfigPipe::isKernelInStream(uint32_t streamId, uint32_t kernelId) {
++    ia_isp_bxt_program_group* programGroup = getProgramGroup(streamId);
++    if (programGroup == nullptr) {
++        return false;
++    }
++    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
++        if (programGroup->run_kernels[i].kernel_uuid == kernelId) {
++            return true;
++        }
++    }
++
++    return false;
++}
++
++/**
++ * get program group id for some kernel
++ *
++ * \param[in] streamId stream id.
++ * \param[in] kernelId kernel pal uuid.
++ * \param[out] program group id that contain this kernel with the same stream id
++ * \return error if can't find the kernel id in any ot the PGs in this stream
++ */
++status_t GraphConfigPipe::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId,
++                                           int32_t* pgId) {
++    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
++    css_err_t ret = css_err_none;
++    status_t retErr;
++    NodesPtrVector programGroups;
++
++    // Get all program groups with the stream id
++    retErr = streamGetProgramGroups(streamId, &programGroups);
++    if (retErr != OK) {
++        LOGE("ERROR: couldn't get program groups");
++        return retErr;
++    }
++
++    // Go through all the program groups with the selected streamID
++    for (auto& ndVec : programGroups) {
++        /* Iterate through program group nodes, find kernel and get the PG id */
++        GCSS::GraphConfigItem::const_iterator it = ndVec->begin();
++        while (it != ndVec->end()) {
++            Node* kernelNode = nullptr;
++            // Look for kernel with the requested uuid
++            ret = ndVec->getDescendant(GCSS_KEY_PAL_UUID, kernelId, it, &kernelNode);
++            if (ret != css_err_none) continue;
++
++            ret = ndVec->getValue(GCSS_KEY_PG_ID, *pgId);
++            if (ret == css_err_none) {
++                LOG2("got the pgid:%d for kernel id:%d in stream:%d", *pgId, kernelId, streamId);
++                return OK;
++            }
++            LOGE("ERROR: Couldn't get pg id for kernel %d", kernelId);
++            return BAD_VALUE;
++        }
++    }
++    LOG2("%s: kernel id %d is not found in stream %d", __func__, kernelId, streamId);
++    return BAD_VALUE;
++}
++
++/**
++ * This method creates SinkDependency structure for every active sink found in
++ * the graph. These structs allow quick access to information that is required
++ * by other methods.
++ * Active sinks are the ones that have a connection to an active port.
++ * This list of active sinks(mSinkPeerPort) has to be filled before this method
++ * is executed.
++ * For every virtual sink we store the name (as a key) and the terminal id of
++ * the input port of the stream associated with that stream. This input port
++ * will be the destination of the buffers from the capture unit.
++ *
++ * This method is used during init()
++ * If we would have different settings per frame then this would be enough
++ * to detect the active ISA nodes, but we are not there yet. we are still using
++ * the base graph settings every frame.
++ */
++void GraphConfigPipe::calculateSinkDependencies() {
++    status_t status = OK;
++    GCSS::IGraphConfig* streamInputPort = nullptr;
++    std::string sinkName;
++    SinkDependency aSinkDependency;
++    ia_uid stageId;  // not needed
++    mSinkDependencies.clear();
++    mIsaOutputPort2StreamId.clear();
++    std::map<Node*, Node*>::iterator sinkIter = mSinkPeerPort.begin();
++
++    for (; sinkIter != mSinkPeerPort.end(); ++sinkIter) {
++        sinkIter->first->getValue(GCSS_KEY_NAME, sinkName);
++        aSinkDependency.sinkGCKey = GCSS::ItemUID::str2key(sinkName);
++        sinkIter->first->getValue(GCSS_KEY_STREAM_ID, aSinkDependency.streamId);
++        status = GCSS::GraphCameraUtil::getInputPort(GCSS_KEY_STREAM_ID, aSinkDependency.streamId,
++                                                     mSettings, &streamInputPort);
++        if (status != OK) {
++            LOGE("Failed to get input port for stream %d associated to sink %s",
++                 aSinkDependency.streamId, sinkName.c_str());
++            continue;
++        }
++        status = GCSS::GraphCameraUtil::portGetFourCCInfo(streamInputPort, stageId,
++                                                          aSinkDependency.streamInputPortId);
++        if (status != OK) {
++            LOGE("Failed to get stream %d input port 4CC code", aSinkDependency.streamId);
++            continue;
++        }
++        GCSS::IGraphConfig* temp = nullptr;
++        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
++        if (status != OK) {
++            LOGE("fail to get peer for the port(%s)",
++                 GCSS::GraphCameraUtil::print(streamInputPort).c_str());
++            continue;
++        }
++        aSinkDependency.peer = static_cast<Node*>(temp);
++        LOG2("Adding dependency %s stream id %d", sinkName.c_str(), aSinkDependency.streamId);
++        mSinkDependencies.push_back(aSinkDependency);
++
++        // get the output port of capture unit
++        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
++        if (status != OK) {
++            LOGE("Fail to get isa output port for sink %s", sinkName.c_str());
++            continue;
++        }
++        Node* isaOutPutPort = static_cast<Node*>(temp);
++        std::string fullName;
++        status = portGetFullName(isaOutPutPort, &fullName);
++        if (status != OK) {
++            LOGE("Fail to get isa output port name");
++            continue;
++        }
++        int32_t streamId = portGetStreamId(isaOutPutPort);
++        if (streamId != -1 &&
++            mIsaOutputPort2StreamId.find(fullName) == mIsaOutputPort2StreamId.end())
++            mIsaOutputPort2StreamId[fullName] = streamId;
++    }
++}
++
++/**
++ * This method is used by the GC Manager that has access to the request
++ * to inform us of what are the active sinks.
++ * Using the sink dependency information we can then know which ISA ports
++ * are active for this GC.
++ *
++ * Once we have different settings per request then we can incorporate this
++ * method into calculateSinkDependencies.
++ *
++ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
++ *                        request
++ */
++void GraphConfigPipe::setActiveSinks(const std::vector<uid_t>& activeSinks) {
++    mIsaActiveDestinations.clear();
++    uid_t activeDest = 0;
++
++    for (auto sink : activeSinks) {
++        for (auto& dependency : mSinkDependencies) {
++            if (dependency.sinkGCKey == sink) {
++                activeDest = dependency.streamInputPortId;
++                mIsaActiveDestinations[activeDest] = activeDest;
++            }
++        }
++    }
++}
++
++/**
++ * This method is used by the GC Manager that has access to the request
++ * to inform us of what will the stream id be used.
++ * Using the sink dependency information we can then know which stream ids
++ * are active for this GC.
++ *
++ * Once we have different settings per request then we can incorporate this
++ * method into calculateSinkDependencies.
++ *
++ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
++ *                        request
++ */
++void GraphConfigPipe::setActiveStreamId(const std::vector<uid_t>& activeSinks) {
++    mActiveStreamId.clear();
++    int32_t activeStreamId = 0;
++
++    for (auto sink : activeSinks) {
++        for (auto& dependency : mSinkDependencies) {
++            if (dependency.sinkGCKey == sink) {
++                activeStreamId = dependency.streamId;
++                mActiveStreamId.insert(activeStreamId);
++
++                // get peer's stream Id
++                activeStreamId = portGetStreamId(dependency.peer);
++                if (activeStreamId == -1) {
++                    LOGE("fail to get the stream id for peer port");
++                    continue;
++                }
++                if (mActiveStreamId.find(activeStreamId) == mActiveStreamId.end())
++                    mActiveStreamId.insert(activeStreamId);
++            }
++        }
++    }
++}
++
++int GraphConfigPipe::getStreamIdByPgName(string pgName) {
++    css_err_t ret = ia_err_none;
++    string foundPgName = "invalid";
++    GraphConfigNode* programGroup = nullptr;
++    GraphConfigNode::const_iterator it = mSettings->begin();
++
++    while (it != mSettings->end()) {
++        programGroup = nullptr;
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
++        if (ret != ia_err_none || programGroup == nullptr) {
++            continue;
++        }
++
++        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
++        if (ret != ia_err_none) {
++            LOGW("%s, failed to get pg name in program group", __func__);
++            continue;
++        }
++
++        if (foundPgName == pgName) break;
++    }
++
++    if (foundPgName != pgName || !programGroup) {
++        LOG2("No matched PG found in pipeUseCase: %d", mPipeUseCase);
++        return -1;
++    }
++
++    int streamId = -1;
++    ret = programGroup->getValue(GCSS_KEY_STREAM_ID, streamId);
++    CheckError(ret != ia_err_none, -1, "Get streamId failed by name:%s, pipeUseCase: %d",
++               pgName.c_str(), mPipeUseCase);
++
++    LOGG("%s: streamId %d", __func__, streamId);
++    return streamId;
++}
++
++status_t GraphConfigPipe::getPgNames(std::vector<string>* pgNames) {
++    css_err_t ret = css_err_none;
++    GraphConfigNode::const_iterator it = mSettings->begin();
++    GraphConfigNode* programGroup = nullptr;
++
++    while (it != mSettings->end()) {
++        programGroup = nullptr;
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
++        if (ret != css_err_none || programGroup == nullptr) {
++            continue;
++        }
++
++        string foundPgName;
++        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
++        if (ret != css_err_none) {
++            LOGW("%s, failed to get pg name in program group", __func__);
++            continue;
++        }
++
++        pgNames->push_back(foundPgName);
++    }
++
++    return OK;
++}
++
++bool GraphConfigPipe::containPgs(std::vector<string> pgNames) {
++    std::vector<string> allPgNames;
++    getPgNames(&allPgNames);
++
++    for (auto& name : pgNames) {
++        if (std::find(allPgNames.begin(), allPgNames.end(), name.c_str()) == allPgNames.end())
++            return false;
++    }
++    return true;
++}
++
++int GraphConfigPipe::getPgIdByPgName(string pgName) {
++    css_err_t ret = css_err_none;
++    GraphConfigNode::const_iterator it = mSettings->begin();
++    GraphConfigNode* programGroup = nullptr;
++    bool foundMatchedPg = false;
++
++    while (it != mSettings->end()) {
++        programGroup = nullptr;
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
++        if (ret != css_err_none || programGroup == nullptr) {
++            continue;
++        }
++
++        string foundPgName;
++        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
++        if (ret != css_err_none) {
++            LOGW("%s, failed to get pg name in program group", __func__);
++            continue;
++        }
++
++        if (foundPgName == pgName) {
++            foundMatchedPg = true;
++            break;
++        }
++    }
++
++    if (!foundMatchedPg) {
++        LOG2("No matched PG found, pgName: %s, pipeUseCase: %d", pgName.c_str(), mPipeUseCase);
++        return -1;
++    }
++
++    const GCSS::IGraphConfig* gc = getInterface(programGroup);
++    CheckError(gc == nullptr, -1, "%s, Failed to get graph config interface", __func__);
++
++    int pgId = -1;
++    ret = gc->getValue(GCSS_KEY_PG_ID, pgId);
++    CheckError(ret != css_err_none, -1, "Get PG ID failed with:%d", ret);
++
++    LOGG("%s: pgName %s, pgId %d", __func__, pgName.c_str(), pgId);
++    return pgId;
++}
++
++status_t GraphConfigPipe::getProgramGroupsByName(const std::vector<std::string>& pgNames,
++                                                 NodesPtrVector* programGroups) {
++    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
++    css_err_t ret = css_err_none;
++    GraphConfigNode* result;
++    NodesPtrVector allProgramGroups;
++    string foundPgName;
++
++    GraphConfigNode::const_iterator it = mSettings->begin();
++
++    while (it != mSettings->end()) {
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
++        if (ret == css_err_none) allProgramGroups.push_back(result);
++    }
++
++    CheckError(allProgramGroups.empty(), UNKNOWN_ERROR,
++               "%s, doesn't find any PG in current pipe: %d", __func__, mPipeUseCase);
++    for (auto& ndVec : allProgramGroups) {
++        ret = ndVec->getValue(GCSS_KEY_NAME, foundPgName);
++        if (ret != css_err_none) {
++            LOGE("%s, failed to get pg name in program group", __func__);
++            continue;
++        }
++
++        for (auto& name : pgNames) {
++            if (foundPgName.find(name) != string::npos) {
++                programGroups->push_back(ndVec);
++            }
++        }
++    }
++    if (programGroups->empty()) {
++        LOG2("%s, doesn't find the matched pg in current pipe: %d", __func__, mPipeUseCase);
++    }
++
++    return OK;
++}
++
++status_t GraphConfigPipe::pipelineGetConnections(
++    const std::vector<std::string>& pgList, std::vector<IGraphType::ScalerInfo>* scalerInfo,
++    std::vector<IGraphType::PipelineConnection>* confVector) {
++    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
++
++    NodesPtrVector programGroups;
++    NodesPtrVector alreadyConnectedPorts;
++    Node* peerPort = nullptr;
++    Node* port = nullptr;
++    IGraphType::PipelineConnection aConnection;
++    std::map<Node*, IGraphType::PipelineConnection> edgePort2Connection;
++
++    status_t status = getProgramGroupsByName(pgList, &programGroups);
++    CheckError(status != OK, status, "%s, failed to get program groups, BUG", __func__);
++
++    for (size_t i = 0; i < programGroups.size(); i++) {
++        Node::const_iterator it = programGroups[i]->begin();
++
++        while (it != programGroups[i]->end()) {
++            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port", it, &port);
++            if (ret != css_err_none) continue;
++
++            // port for private terminal, no need to connect
++            int priv = 0;
++            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
++            if (ret == css_err_none && priv) continue;
++
++            /*
++             * Since we are iterating through the ports
++             * check if this port is already connected to avoid setting
++             * the connection twice
++             */
++            if (std::find(alreadyConnectedPorts.begin(), alreadyConnectedPorts.end(), port) !=
++                alreadyConnectedPorts.end()) {
++                continue;
++            }
++            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
++
++            string contentType;
++            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
++            if (ret == css_err_none && contentType != "pixel_data") {
++                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
++                continue;
++            }
++
++            status = portGetFormat(port, &(aConnection.portFormatSettings));
++            if (status != OK) {
++                LOGE("Failed to get port format info in port from PG[%zu]", i);
++                return BAD_VALUE;
++            }
++            if (aConnection.portFormatSettings.enabled == 0) {
++                LOG1("Port from PG[%zu] disabled", i);
++                status = portGetOwner(port, &(aConnection.connectionConfig));
++                CheckError((status != OK), BAD_VALUE, "Failed to get ownerfor port from PG[%zu]",
++                           i);
++                confVector->push_back(aConnection);
++                continue;
++            } else {
++                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
++                     aConnection.portFormatSettings.terminalId,
++                     aConnection.portFormatSettings.width, aConnection.portFormatSettings.height,
++                     CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
++                     aConnection.portFormatSettings.bpl, aConnection.portFormatSettings.bpp);
++            }
++
++            /*
++             * for each port get the connection info and pass it
++             * to the pipeline object
++             */
++            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
++            if (status != OK) {
++                LOGE("Failed to create connection info in port from PG[%zu]", i);
++                return BAD_VALUE;
++            }
++
++            aConnection.hasEdgePort = false;
++            if (isPipeEdgePort(port)) {
++                int32_t direction = portGetDirection(port);
++                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
++                    aConnection.connectionConfig.mConnectionType = IGraphType::connection_type_push;
++                } else {
++                    HalStream* clientStream = nullptr;
++                    status = portGetClientStream(peerPort, &clientStream);
++                    CheckError(status != OK, UNKNOWN_ERROR,
++                               "Failed to find client stream for v-sink");
++                    aConnection.stream = clientStream;
++                    if (clientStream != nullptr) {
++                        edgePort2Connection[port] = aConnection;
++                    }
++                }
++                aConnection.hasEdgePort = true;
++            }
++            confVector->push_back(aConnection);
++            alreadyConnectedPorts.push_back(port);
++            alreadyConnectedPorts.push_back(peerPort);
++        }
++    }
++
++    getScalerByStreamId(edgePort2Connection, scalerInfo);
++    GraphUtils::dumpConnections(*confVector);
++
++    return status;
++}
++
++status_t GraphConfigPipe::getScalerByStreamId(
++    std::map<Node*, IGraphType::PipelineConnection> edgePort2Connection,
++    std::vector<IGraphType::ScalerInfo>* scalerInfo) {
++    if (edgePort2Connection.empty()) {
++        return OK;
++    }
++    CheckError(!scalerInfo, UNKNOWN_ERROR, "%s, scalerInfo is nullptr", __func__);
++
++    for (auto it = edgePort2Connection.begin(); it != edgePort2Connection.end(); ++it) {
++        const char* portName;
++        bool mpFLag = false;
++        bool dpFlag = false;
++        bool pppFlag = false;
++        float scalerW = 1;
++        float scalerH = 1;
++
++        IGraphType::PipelineConnection connection = it->second;
++        portName = NODE_NAME(it->first);
++        CheckError(!connection.stream, UNKNOWN_ERROR, "%s, connection.stream is null.", __func__);
++        int32_t streamId = connection.stream->streamId();
++        LOG2("%s, streamId:%d, portName:%s", __func__, streamId, portName);
++
++        if (!strcmp("main", portName)) {
++            mpFLag = true;
++        } else if (!strcmp("display", portName)) {
++            dpFlag = true;
++        } else if (!strcmp("postproc", portName)) {
++            pppFlag = true;
++        }
++        if (!mpFLag && !dpFlag && !pppFlag) continue;
++
++        // if port name is main, the value of osW and osH are 1.
++        float osW = 1;
++        float osH = 1;
++        if (dpFlag) {
++            (void)getScalerKernelResolutionRatio(dpKernel, DB_KERNEL_SIZE, &osW, &osH);
++            LOG2("%s, dp ratio, osW:%f, osH:%f", __func__, osW, osH);
++        } else if (pppFlag) {
++            (void)getScalerKernelResolutionRatio(pppKernel, PPP_KERNEL_SIZE, &osW, &osH);
++            LOG2("%s, ppp ratio, osW:%f, osH:%f", __func__, osW, osH);
++        }
++
++        uint32_t kernelId;
++        float gdcScalerW = 1;
++        float gdcScalerH = 1;
++        const ia_isp_bxt_resolution_info_t* gdcResolution = getGdcKernelResolutionInfo(&kernelId);
++        if ((gdcResolution) && ((gdcResolution->input_width != gdcResolution->output_width) ||
++                                (gdcResolution->input_height != gdcResolution->output_height))) {
++            const ia_rectangle* input_crop = &gdcResolution->input_crop;
++            const ia_rectangle* output_crop = &gdcResolution->output_crop;
++            if (((input_crop->left == 0) && (input_crop->top == 0) && (input_crop->right == 0) &&
++                 (input_crop->bottom == 0)) &&
++                ((output_crop->left == 0) && (output_crop->top == 0) && (output_crop->right == 0) &&
++                 (output_crop->bottom == 0))) {
++                gdcScalerW = static_cast<float>(gdcResolution->input_width) /
++                             static_cast<float>(gdcResolution->output_width);
++                gdcScalerH = static_cast<float>(gdcResolution->input_height) /
++                             static_cast<float>(gdcResolution->output_height);
++            }
++        }
++        LOG2("%s, gdc ratio, gdcScalerW:%f, gdcScalerH:%f", __func__, gdcScalerW, gdcScalerH);
++
++        float b2iDsW = 1;
++        float b2iDsH = 1;
++        (void)getScalerKernelResolutionRatio(dsKernel, DS_KERNEL_SIZE, &b2iDsW, &b2iDsH);
++        LOG2("%s, b2iDs ratio, b2iDsW:%f, b2iDsH:%f", __func__, b2iDsW, b2iDsH);
++
++        scalerW = osW * gdcScalerW * b2iDsW;
++        scalerH = osH * gdcScalerH * b2iDsH;
++        scalerInfo->push_back({streamId, scalerW, scalerH});
++        LOG2("%s, streamId:%d, scalerW:%f, scalerH:%f", __func__, streamId, scalerW, scalerH);
++    }
++
++    return OK;
++}
++
++status_t GraphConfigPipe::portGetOwner(Node* port, IGraphType::ConnectionConfig* connectionInfo) {
++    int32_t direction = PORT_DIRECTION_INPUT;
++    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
++    CheckError((ret != css_err_none), BAD_VALUE, "Failed to get port direction");
++
++    /*
++     * Default to pull, it will be amended later,
++     * Iterations are not used
++     */
++    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
++    connectionInfo->mSinkIteration = 0;
++    connectionInfo->mSourceIteration = 0;
++
++    status_t status = OK;
++    if (direction == PORT_DIRECTION_INPUT) {
++        // input port is the sink in a connection
++        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port, connectionInfo->mSinkStage,
++                                                          connectionInfo->mSinkTerminal);
++        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for sink port");
++    } else {
++        // output port is the source in a connection
++        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port, connectionInfo->mSourceStage,
++                                                          connectionInfo->mSourceTerminal);
++        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for source port");
++    }
++    return status;
++}
++
++/**
++ * Query the connection info structs for a given pipeline defined by
++ * stream id.
++ *
++ * \param[in] sinkName to be used as key to get pipeline connections
++ * \param[out] stream id connect with sink
++ * \param[out] connections for pipeline configuation
++ * \return OK in case of success.
++ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
++ * \if sinkName is not supported, NAME_NOT_FOUND is returned.
++ * \sink name support list as below defined in graph_descriptor.xml
++ * \<sink name="video0"/>
++ * \<sink name="video1"/>
++ * \<sink name="video2"/>
++ * \<sink name="still0"/>
++ * \<sink name="still1"/>
++ * \<sink name="still2"/>
++ * \<sink name="raw"/>
++ */
++status_t GraphConfigPipe::pipelineGetConnections(
++    const std::string& sinkName, int* streamId,
++    std::vector<IGraphType::PipelineConnection>* confVector) {
++    CheckError(!streamId, UNKNOWN_ERROR, "the streamId is nullptr");
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++
++    std::vector<GCSS::IGraphConfig*> sinks;
++    NodesPtrVector programGroups;
++    NodesPtrVector alreadyConnectedPorts;
++    Node* peerPort = nullptr;
++    Node* port = nullptr;
++    IGraphType::PipelineConnection aConnection;
++
++    alreadyConnectedPorts.clear();
++    status_t status = GCSS::GraphCameraUtil::graphGetSinksByName(sinkName, mSettings, sinks);
++    if (status != OK || sinks.empty()) {
++        LOGD("No %s sinks in graph", sinkName.c_str());
++        return NAME_NOT_FOUND;
++    }
++
++    status = sinks[0]->getValue(GCSS_KEY_STREAM_ID, *streamId);
++    if (status != css_err_none) {
++        LOGE("Sink node lacks stream id attribute - fix your config");
++        return BAD_VALUE;
++    }
++
++    status = streamGetProgramGroups(*streamId, &programGroups);
++    if (status != OK || programGroups.empty()) {
++        LOGE("No Program groups associated with stream id %d", *streamId);
++        return BAD_VALUE;
++    }
++
++    for (size_t i = 0; i < programGroups.size(); i++) {
++        Node::const_iterator it = programGroups[i]->begin();
++
++        while (it != programGroups[i]->end()) {
++            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port", it, &port);
++            if (ret != css_err_none) continue;
++
++            // port for private terminal, no need to connect
++            int priv = 0;
++            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
++            if (ret == css_err_none && priv) continue;
++
++            /*
++             * Since we are iterating through the ports
++             * check if this port is already connected to avoid setting
++             * the connection twice
++             */
++            if (std::find(alreadyConnectedPorts.begin(), alreadyConnectedPorts.end(), port) !=
++                alreadyConnectedPorts.end()) {
++                continue;
++            }
++            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
++
++            string contentType;
++            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
++            if (ret == css_err_none && contentType != "pixel_data") {
++                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
++                continue;
++            }
++
++            status = portGetFormat(port, &(aConnection.portFormatSettings));
++            if (status != OK) {
++                LOGE(
++                    "Failed to get port format info in port from PG[%zu] "
++                    "from stream id %d",
++                    i, *streamId);
++                return BAD_VALUE;
++            }
++            if (aConnection.portFormatSettings.enabled == 0) {
++                LOG1("Port from PG[%zu] from stream id %d disabled", i, *streamId);
++                confVector->push_back(aConnection);
++                continue;
++            } else {
++                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
++                     aConnection.portFormatSettings.terminalId,
++                     aConnection.portFormatSettings.width, aConnection.portFormatSettings.height,
++                     CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
++                     aConnection.portFormatSettings.bpl, aConnection.portFormatSettings.bpp);
++            }
++
++            /*
++             * for each port get the connection info and pass it
++             * to the pipeline object
++             */
++            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
++            if (status != OK) {
++                LOGE(
++                    "Failed to create connection info in port from PG[%zu]"
++                    "from stream id %d",
++                    i, *streamId);
++                return BAD_VALUE;
++            }
++
++            aConnection.hasEdgePort = false;
++            if (isPipeEdgePort(port)) {
++                int32_t direction = portGetDirection(port);
++                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
++                    aConnection.connectionConfig.mConnectionType = IGraphType::connection_type_push;
++                } else {
++                    HalStream* clientStream = nullptr;
++                    status = portGetClientStream(peerPort, &clientStream);
++                    if (status != OK) {
++                        LOGE("Failed to find client stream for v-sink");
++                        return UNKNOWN_ERROR;
++                    }
++                    aConnection.stream = clientStream;
++                }
++                aConnection.hasEdgePort = true;
++            }
++            confVector->push_back(aConnection);
++            alreadyConnectedPorts.push_back(port);
++            alreadyConnectedPorts.push_back(peerPort);
++        }
++    }
++
++    return OK;
++}
++
++/**
++ * Find distinct stream ids from the graph and return them in a vector.
++ * \param streamIds Vector to be populated with stream ids.
++ */
++status_t GraphConfigPipe::graphGetStreamIds(StreamsVector* streamIds) {
++    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
++    GraphConfigNode* result;
++    int32_t streamId = -1;
++    css_err_t ret;
++
++    GraphConfigNode::const_iterator it = mSettings->begin();
++    while (it != mSettings->end()) {
++        bool found = false;
++        // Find all program groups
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
++        if (ret != css_err_none) continue;
++
++        ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
++        if (ret != css_err_none) continue;
++
++        // If stream id is not yet in vector, add it
++        StreamsVector::iterator ite = streamIds->begin();
++        for (; ite != streamIds->end(); ++ite) {
++            if (streamId == *ite) {
++                found = true;
++                break;
++            }
++        }
++        if (found) continue;
++
++        streamIds->push_back(streamId);
++    }
++
++    LOGG("%s: stream IDs size %d", __func__, streamIds->size());
++    return OK;
++}
++
++int32_t GraphConfigPipe::portGetStreamId(Node* port) {
++    css_err_t ret = css_err_none;
++    Node* ancestor = nullptr;
++    int32_t streamId = -1;
++
++    if (port == nullptr) {
++        LOGE("Invalid Node, cannot get the port stream id");
++        return -1;
++    }
++    ret = port->getAncestor(&ancestor);
++    if (ret != css_err_none) {
++        LOGE("Failed to get port's ancestor");
++        return -1;
++    }
++
++    ret = ancestor->getValue(GCSS_KEY_STREAM_ID, streamId);
++    if (ret != css_err_none) {
++        LOGE("Failed to get stream ID");
++        return -1;
++    }
++    return streamId;
++}
++
++/**
++ * Retrieve a list of program groups that belong to a  given stream id.
++ * Iterates through the graph configuration storing the program groups
++ * that match this stream id into the provided vector.
++ *
++ * \param[in] streamId Id of the stream to match.
++ * \param[out] programGroups Vector with the nodes that match the criteria.
++ */
++status_t GraphConfigPipe::streamGetProgramGroups(int32_t streamId, NodesPtrVector* programGroups) {
++    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
++    css_err_t ret = css_err_none;
++    GraphConfigNode* result;
++    NodesPtrVector allProgramGroups;
++    int32_t streamIdFound = -1;
++
++    GraphConfigNode::const_iterator it = mSettings->begin();
++
++    while (it != mSettings->end()) {
++        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
++        if (ret == css_err_none) allProgramGroups.push_back(result);
++    }
++
++    if (allProgramGroups.empty()) {
++        LOGE(
++            "Failed to find any PG's for stream id %d"
++            " BUG(check graph config file)",
++            streamId);
++        return UNKNOWN_ERROR;
++    }
++
++    for (auto& pg : allProgramGroups) {
++        ret = pg->getValue(GCSS_KEY_STREAM_ID, streamIdFound);
++        if ((ret == css_err_none) && (streamIdFound == streamId)) {
++            programGroups->push_back(pg);
++        }
++    }
++
++    return OK;
++}
++
++/**
++ * Retrieve the graph config node of the port that is connected to a given port.
++ *
++ * \param[in] port Node with the info of the port that we want to find its peer.
++ * \param[out] peer Pointer to a node where the peer node reference will be
++ *                  stored
++ * \return OK
++ * \return INVALID_OPERATION if the port is disabled.
++ * \return BAD_VALUE if any of the graph settings is incorrect.
++ * \return NO_ENTRY if including "private" attribute which is used for private
++ *         terminal.
++ */
++status_t GraphConfigPipe::portGetPeer(Node* port, Node** peer) {
++    css_err_t ret = css_err_none;
++    int32_t enabled = 1, priv = 0;
++    string peerName;
++
++    if (port == nullptr || peer == nullptr) {
++        LOGE("Invalid Node, cannot get the peer port");
++        return BAD_VALUE;
++    }
++    ret = port->getValue(GCSS_KEY_ENABLED, enabled);
++    if (ret == css_err_none && !enabled) {
++        LOG1("This port is disabled, keep on getting the connection");
++        return INVALID_OPERATION;
++    }
++
++    // port for private terminal, no connection needed
++    ret = port->getValue(GCSS_KEY_PRIVATE, priv);
++    if (ret == css_err_none && priv) {
++        LOG2("NO_ENTRY due to key PRIVATE:%d", priv);
++        return NO_ENTRY;
++    }
++
++    ret = port->getValue(GCSS_KEY_PEER, peerName);
++    if (ret != css_err_none) {
++        LOGE("Error getting peer attribute");
++        return BAD_VALUE;
++    }
++    ret = mSettings->getDescendantByString(peerName, peer);
++    if (ret != css_err_none) {
++        LOGE("Failed to find peer by name %s", peerName.c_str());
++        return BAD_VALUE;
++    }
++    return OK;
++}
++
++/**
++ * Generate the connection configuration information for a given port.
++ *
++ * This connection configuration  information is required by CIPF to build
++ * the pipeline
++ *
++ * \param[in] port Pointer to the port node
++ * \param[out] connectionInfo point to the connection info object
++ * \param[out] peerPort Reference to the peer port
++ * \return OK in case of success
++ * \return BAD_VALUE in case of error while retrieving the information.
++ * \return INVALID_OPERATION in case of the port being disabled.
++ */
++status_t GraphConfigPipe::portGetConnection(Node* port,
++                                            IGraphType::ConnectionConfig* connectionInfo,
++                                            Node** peerPort) {
++    int32_t direction = PORT_DIRECTION_INPUT;
++
++    status_t status = portGetPeer(port, peerPort);
++    if (status == NO_ENTRY) {
++        LOG2("port for private terminal, no peer");
++        *peerPort = nullptr;
++    } else if (status != OK) {
++        if (status == INVALID_OPERATION) {
++            LOGE("Port %s disabled, cannot get the connection", getNodeName(port).c_str());
++        } else {
++            LOGE("Failed to get the peer port for port %s", getNodeName(port).c_str());
++        }
++        return status;
++    }
++
++    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
++    if (ret != css_err_none) {
++        LOGE("Failed to get port direction");
++        return BAD_VALUE;
++    }
++
++    /*
++     * Default to pull, it will be amended later,
++     * Iterations are not used
++     */
++    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
++    connectionInfo->mSinkIteration = 0;
++    connectionInfo->mSourceIteration = 0;
++
++    if (direction == PORT_DIRECTION_INPUT) {
++        // input port is the sink in a connection
++        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port, connectionInfo->mSinkStage,
++                                                          connectionInfo->mSinkTerminal);
++        if (status != OK) {
++            LOGE("Failed to create fourcc info for sink port");
++            return BAD_VALUE;
++        }
++        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
++            status = GCSS::GraphCameraUtil::portGetFourCCInfo(
++                *peerPort, connectionInfo->mSourceStage, connectionInfo->mSourceTerminal);
++            if (status != OK) {
++                LOGE("Failed to create fourcc info for source port");
++                return BAD_VALUE;
++            }
++        } else {
++            connectionInfo->mSourceStage = 0;
++            connectionInfo->mSourceTerminal = 0;
++        }
++    } else {
++        // output port is the source in a connection
++        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port, connectionInfo->mSourceStage,
++                                                          connectionInfo->mSourceTerminal);
++        if (status != OK) {
++            LOGE("Failed to create fourcc info for source port");
++            return BAD_VALUE;
++        }
++
++        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
++            status = GCSS::GraphCameraUtil::portGetFourCCInfo(*peerPort, connectionInfo->mSinkStage,
++                                                              connectionInfo->mSinkTerminal);
++            if (status != OK) {
++                LOGE("Failed to create fourcc info for sink port");
++                return BAD_VALUE;
++            }
++            /**
++             * Because all the connections are used for frame flow , so
++             * create one implicit rule which sets the mSinkTerminal as
++             * same as mSourceTerminal to handle the parameter or
++             * hanging port. And then exclude this connection when binding
++             * the port of executor.
++             */
++        } else if (*peerPort != nullptr && portIsVirtual(*peerPort) &&
++                   getNodeName(*peerPort).find(getNodeName(port)) != string::npos) {
++            LOG2("%s, found one hanging port: %s, peer port: %s", __func__,
++                 getNodeName(port).c_str(), getNodeName(*peerPort).c_str());
++            connectionInfo->mSinkStage = 0;
++            connectionInfo->mSinkTerminal = connectionInfo->mSourceTerminal;
++        } else {
++            connectionInfo->mSinkStage = 0;
++            connectionInfo->mSinkTerminal = 0;
++        }
++    }
++
++    return status;
++}
++
++/**
++ * Retrieve the format information of a port
++ * if the port doesn't have any format set, it gets the format from the peer
++ * port (i.e. the port connected to this one)
++ *
++ * \param[in] port Port to query the format.
++ * \param[out] format Format settings for this port.
++ */
++status_t GraphConfigPipe::portGetFormat(Node* port, IGraphType::PortFormatSettings* format) {
++    GraphConfigNode* peerNode = nullptr;  // The peer port node
++    GraphConfigNode* tmpNode = port;      // The port node node we are interrogating
++    css_err_t ret = css_err_none;
++    ia_uid stageId;  // ignored
++
++    if (port == nullptr) {
++        LOGE("Invalid parameter, could not get port format");
++        return BAD_VALUE;
++    }
++
++    ret = port->getValue(GCSS_KEY_ENABLED, format->enabled);
++    if (ret != css_err_none) {
++        // if not present by default is enabled
++        format->enabled = 1;
++    }
++
++    status_t status =
++        GCSS::GraphCameraUtil::portGetFourCCInfo(tmpNode, stageId, format->terminalId);
++    if (status != OK) {
++        LOGE("Could not get port uid");
++        return INVALID_OPERATION;
++    }
++
++    // if disabled there is no need to query the format
++    if (format->enabled == 0) {
++        return OK;
++    }
++
++    format->width = 0;
++    format->height = 0;
++
++    ret = port->getValue(GCSS_KEY_WIDTH, format->width);
++    if (ret != css_err_none) {
++        /*
++         * It could be the port configuration is not in settings, that is normal
++         * it means that we need to ask the format from the peer.
++         */
++        status = portGetPeer(port, &peerNode);
++        if (status != OK) {
++            LOGE("Could not find peer port - Fix your graph");
++            return BAD_VALUE;
++        }
++
++        tmpNode = peerNode;
++
++        ret = tmpNode->getValue(GCSS_KEY_WIDTH, format->width);
++        if (ret != css_err_none) {
++            LOGE("Could not find port format info: width (from peer)");
++            return BAD_VALUE;
++        }
++    }
++
++    ret = tmpNode->getValue(GCSS_KEY_HEIGHT, format->height);
++    if (ret != css_err_none) {
++        LOGE("Could not find port format info: height");
++        return BAD_VALUE;
++    }
++
++    string fourccFormat;
++    ret = tmpNode->getValue(GCSS_KEY_FORMAT, fourccFormat);
++    if (ret != css_err_none) {
++        LOGE("Could not find port format info: fourcc");
++        return BAD_VALUE;
++    }
++
++    const char* pFormat = fourccFormat.c_str();
++    format->fourcc = CameraUtils::string2IaFourccCode(pFormat);
++    format->bpl = gcu::getBpl(format->fourcc, format->width);
++    LOG2("bpl set to %d for %s", format->bpl, fourccFormat.c_str());
++
++    // if settings are specifying bpl, owerwrite the calculated one
++    int bplFromSettings = 0;
++    ret = tmpNode->getValue(GCSS_KEY_BYTES_PER_LINE, bplFromSettings);
++    if (ret == css_err_none) {
++        LOG2("Overwriting bpl(%d) from settings %d", format->bpl, bplFromSettings);
++        format->bpl = bplFromSettings;
++    }
++
++    format->bpp = gcu::getBppFromCommon(format->fourcc);
++
++    return OK;
++}
++
++/**
++ * Return the port direction
++ *
++ * \param[in] port Reference to port Graph node
++ * \return 0 if it is an input port
++ * \return 1 if it is an output port
++ */
++int32_t GraphConfigPipe::portGetDirection(Node* port) {
++    int32_t direction = 0;
++    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
++    if (ret != css_err_none) {
++        LOGE("Failed to retrieve port direction, default to input");
++    }
++
++    return direction;
++}
++
++/**
++ * Return the port full name
++ * The port full name is made out from:
++ * - the name program group it belongs to
++ * - the name of the port
++ * separated by ":"
++ *
++ * \param[in] port Reference to port Graph node
++ * \param[out] fullName reference to a string to store the full name
++ *
++ * \return OK if everything went fine.
++ * \return BAD_VALUE if any of the graph queries failed.
++ */
++status_t GraphConfigPipe::portGetFullName(Node* port, string* fullName) {
++    CheckError(!fullName, UNKNOWN_ERROR, "%s, the fullName is nullptr", __func__);
++    string portName, ancestorName;
++    Node* ancestor;
++    css_err_t ret = css_err_none;
++
++    if (port == nullptr) {
++        LOGE("Invalid parameter, could not get port full name");
++        return BAD_VALUE;
++    }
++
++    ret = port->getAncestor(&ancestor);
++    if (ret != css_err_none) {
++        LOGE("Failed to retrieve port ancestor");
++        return BAD_VALUE;
++    }
++    ret = ancestor->getValue(GCSS_KEY_NAME, ancestorName);
++    if (ret != css_err_none) {
++        LOGE("Failed to get ancestor name for port");
++        port->dumpNodeTree(port, 1);
++        return BAD_VALUE;
++    }
++
++    ret = port->getValue(GCSS_KEY_NAME, portName);
++    if (ret != css_err_none) {
++        LOGE("Failed to retrieve port name");
++        return BAD_VALUE;
++    }
++
++    *fullName = ancestorName + ":" + portName;
++    return OK;
++}
++
++/**
++ * Perform a reverse lookup on the map that associates client streams to
++ * virtual sinks.
++ *
++ * This method is used during pipeline configuration to find a stream associated
++ * with the id (GCSS key) of the virtual sink
++ *
++ * \param[in] vPortId GCSS key representing one of the virtual sinks in the
++ *                    graph, like GCSS_KEY_VIDEO1
++ * \return nullptr if not found
++ * \return pointer to the client stream associated with that virtual sink.
++ */
++HalStream* GraphConfigPipe::getHalStreamByVirtualId(uid_t vPortId) {
++    for (auto& it : mStreamToSinkIdMap) {
++        if (it.second == vPortId) {
++            return it.first;
++        }
++    }
++
++    return nullptr;
++}
++
++/**
++ * Return true if the port is a virtual port, this is the end point
++ * of the graph.
++ * Virtual ports are the nodes of type sink.
++ *
++ * \param[in] port Reference to port Graph node
++ * \return true if it is a virtual port
++ * \return false if it is not a virtual port
++ */
++bool GraphConfigPipe::portIsVirtual(Node* port) {
++    string type;
++    css_err_t ret = port->getValue(GCSS_KEY_TYPE, type);
++    if (ret != css_err_none) {
++        LOGE("Failed to retrieve port type, default to input");
++    }
++
++    return (type == string("sink"));
++}
++
++/**
++ * retrieve the pointer to the client stream associated with a virtual sink
++ *
++ * I.e. access the mapping done at stream config time between the pointers
++ * to camera3_stream_t and the names video0, video1, still0 etc...
++ *
++ * \param[in] port Node to the virtual sink (with name videoX or stillX etc..)
++ * \param[out] stream Pointer to the client stream associated with that virtual
++ *                    sink.
++ * \return OK
++ * \return BAD_VALUE in case of invalid parameters (null pointers)
++ * \return INVALID_OPERATION in case the Node is not a virtual sink.
++ */
++status_t GraphConfigPipe::portGetClientStream(Node* port, HalStream** stream) {
++    if (!port || !stream) {
++        LOGE("Could not get client stream - bad parameters");
++        return BAD_VALUE;
++    }
++
++    if (!portIsVirtual(port)) {
++        LOGE("Trying to find the client stream from a non virtual port");
++        return INVALID_OPERATION;
++    }
++
++    string portName;
++    css_err_t ret = port->getValue(GCSS_KEY_NAME, portName);
++    if (ret != css_err_none) {
++        LOGE("Failed to get name for port");
++        port->dumpNodeTree(port, 1);
++        return BAD_VALUE;
++    }
++
++    uid_t vPortId = GCSS::ItemUID::str2key(portName);
++    *stream = getHalStreamByVirtualId(vPortId);
++
++    return OK;
++}
++
++/**
++ * A port is at the edge of the video stream (pipeline) if its peer's stream id is 0 or -1,
++ * or if its peer is a virtual sink.
++ *
++ * Here we check for both conditions and return true if this port is at either
++ * edge of a pipeline
++ */
++bool GraphConfigPipe::isPipeEdgePort(Node* port) {
++    CheckError(!port, false, "%s, the port is nullptr", __func__);
++    Node* peer = nullptr;
++    Node* peerAncestor = nullptr;
++    int32_t streamId = -1;
++    int32_t peerStreamId = -1;
++    string peerType;
++
++    int32_t portDirection = portGetDirection(port);
++
++    status_t status = portGetPeer(port, &peer);
++    if (status == INVALID_OPERATION) {
++        LOG1("port is disabled, so it is an edge port");
++        return true;
++    }
++    if (status != OK) {
++        LOGE("Failed to create fourcc info for source port");
++        return false;
++    }
++
++    streamId = portGetStreamId(port);
++    if (streamId < 0) return false;
++    /*
++     * get the stream id of the peer port
++     * we also check the ancestor for that. If the peer is a virtual sink then
++     * it does not have ancestor.
++     */
++    if (!portIsVirtual(peer)) {
++        css_err_t ret = peer->getAncestor(&peerAncestor);
++        if (ret != css_err_none) {
++            LOGE("Failed to get peer's ancestor");
++            return false;
++        }
++        ret = peerAncestor->getValue(GCSS_KEY_STREAM_ID, peerStreamId);
++        if (ret != css_err_none) {
++            LOGE("Failed to get stream ID of peer PG");
++            return false;
++        }
++        /*
++         * Retrieve the type of node the peer ancestor is. It could be is not a
++         * program group node but a sink or hw block
++         */
++        peerAncestor->getValue(GCSS_KEY_TYPE, peerType);
++    }
++
++    LOG1("%s port direction: %d, port stream id:%d, peer stream id:%d", __func__, portDirection,
++         streamId, peerStreamId);
++
++    bool isEdge = false;
++    if (portDirection == GraphConfigPipe::PORT_DIRECTION_INPUT) {
++        /*
++         *  input port,
++         *  if the peer is a source or hw block then it is on the edge,
++         *  or its stream id is 0 or -1.
++         */
++        isEdge = (peerType == string("hw") || peerStreamId == 0 || peerStreamId == -1);
++    } else {
++        /*
++         *  output port,
++         *  if the peer is a virtual port, or its stream id is 0 or -1,
++         *  then it is on the edge,
++         */
++        isEdge = (portIsVirtual(peer) || peerStreamId == 0 || peerStreamId == -1);
++    }
++
++    return isEdge;
++}
++
++void GraphConfigPipe::dumpSettings() {
++    mSettings->dumpNodeTree(mSettings, 2);
++}
++
++GraphConfigPipe::Rectangle::Rectangle() : w(0), h(0), t(0), l(0) {}
++GraphConfigPipe::SubdevPad::SubdevPad() : Rectangle(), mbusFormat(0) {}
++GraphConfigPipe::SourceNodeInfo::SourceNodeInfo() : metadataEnabled(false), interlaced(0) {}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
+new file mode 100644
+index 000000000000..b9a044713c94
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
+@@ -0,0 +1,313 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <gcss.h>
++#include <gcss_aic_utils.h>
++#include <ia_aiq.h>
++#include <ia_isp_bxt_types.h>
++
++#include <map>
++#include <memory>
++#include <set>
++#include <string>
++#include <vector>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "src/platformdata/gc/IGraphConfig.h"
++
++#define NODE_NAME(x) (getNodeName(x).c_str())
++
++namespace icamera {
++
++/**
++ * Stream id associated with the ISA PG that runs on Psys.
++ */
++static const int32_t PSYS_ISA_STREAM_ID = 60002;
++
++/**
++ * \class SinkDependency
++ *
++ * This class is a container for sink dependency information for each virtual sink.
++ * This information is useful to determine the connections that preceded the
++ * virtual sink.
++ * We do not go all the way up to the sensor (we could), we just store the
++ * terminal id of the input port of the pipeline that serves a particular sink
++ * (i.e. the input port of the video pipe or still pipe)
++ */
++class SinkDependency {
++ public:
++    SinkDependency() : sinkGCKey(0), streamId(-1), streamInputPortId(0), peer(nullptr) {}
++
++    uid_t sinkGCKey;             /**< GCSS_KEY that represents a sink, like GCSS_KEY_VIDEO1 */
++    int32_t streamId;            /**< (a.k.a pipeline id) linked to this sink (ex 60000) */
++    uid_t streamInputPortId;     /**< 4CC code of that terminal */
++    GCSS::GraphConfigNode* peer; /**< pointer to peer of this sink */
++};
++/**
++ * \class GraphConfigPipe
++ *
++ * Reference and accessor to pipe configuration for specific request.
++ *
++ * In general case, at sream-config time there are multiple possible graphs.
++ * Per each request there is additional intent that can narrow down the
++ * possibilities to single graph settings: the GraphConfigPipe object.
++ *
++ * This class is instantiated by \class GraphConfigManager for each request,
++ * and passed around HAL (control unit, capture unit, processing unit) via
++ * shared pointers. The objects are read-only and owned by GCM.
++ */
++class GraphConfigPipe {
++ public:
++    typedef std::vector<int32_t> StreamsVector;
++    typedef std::map<int32_t, int32_t> StreamsMap;
++    typedef std::map<HalStream*, uid_t> StreamToSinkMap;
++    static const int32_t PORT_DIRECTION_INPUT = 0;
++    static const int32_t PORT_DIRECTION_OUTPUT = 1;
++
++ public:
++    explicit GraphConfigPipe(int pipeUseCase);
++    ~GraphConfigPipe();
++
++    void init(int32_t reqId);
++    int getGraphId(void);
++    void setActiveSinks(const std::vector<uid_t>& activeSinks);
++    void setActiveStreamId(const std::vector<uid_t>& activeSinks);
++    /*
++     * Convert Node to GraphConfig interface
++     */
++    const GCSS::IGraphConfig* getInterface(Node* node) const;
++    const GCSS::IGraphConfig* getInterface() const;
++    ia_isp_bxt_program_group* getProgramGroup(int32_t streamId);
++    int getProgramGroup(std::string pgName, ia_isp_bxt_program_group* programGroupForPG);
++    status_t getGdcKernelSetting(uint32_t* kernelId, ia_isp_bxt_resolution_info_t* resolution);
++    const ia_isp_bxt_resolution_info_t* getKernelResolutionInfo(uint32_t streamId,
++                                                                uint32_t kernelId);
++    bool hasStreamInGraph(int streamId);
++    bool isKernelInStream(uint32_t streamId, uint32_t kernelId);
++    status_t getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t* pgId);
++    int32_t getTuningMode(int32_t streamId);
++    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits* data);
++    status_t prepare(Node* settings, const StreamToSinkMap& streamToSinkIdMap);
++    bool containPgs(std::vector<std::string> pgNames);
++
++    /*
++     * Find distinct stream ids from the graph
++     */
++    status_t graphGetStreamIds(std::vector<int32_t>* streamIds);
++    /*
++     * Sink Interrogation methods
++     */
++    int32_t portGetStreamId(Node* port);
++    /*
++     * Stream Interrogation methods
++     */
++    status_t streamGetProgramGroups(int32_t streamId, NodesPtrVector* programGroups);
++    /*
++     * Port Interrogation methods
++     */
++    status_t portGetFullName(Node* port, std::string* fullName);
++    status_t portGetPeer(Node* port, Node** peer);
++    status_t portGetFormat(Node* port, IGraphType::PortFormatSettings* format);
++    status_t portGetConnection(Node* port, IGraphType::ConnectionConfig* connectionInfo,
++                               Node** peerPort);
++    status_t portGetClientStream(Node* port, HalStream** stream);
++    int32_t portGetDirection(Node* port);
++    bool portIsVirtual(Node* port);
++    bool isPipeEdgePort(Node* port);  // TODO: should be renamed as portIsEdgePort
++
++    bool getSensorEmbeddedMetadataEnabled() const { return mMetaEnabled; }
++    /*
++     * Pipeline connection support
++     */
++    status_t pipelineGetConnections(const std::string& sinkName, int* streamId,
++                                    std::vector<IGraphType::PipelineConnection>* confVector);
++    status_t portGetOwner(Node* port, IGraphType::ConnectionConfig* connectionInfo);
++    status_t pipelineGetConnections(const std::vector<std::string>& pgList,
++                                    std::vector<IGraphType::ScalerInfo>* scalerInfo,
++                                    std::vector<IGraphType::PipelineConnection>* confVector);
++
++    status_t getPgNames(std::vector<std::string>* pgNames);
++    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr* stageAttr);
++
++    /**
++     * Get PG id by given PG name.
++     * -1 will be returned if cannot find the valid PG id.
++     */
++    int getPgIdByPgName(std::string pgName);
++
++    /**
++     * Get PG streamId by given PG name.
++     * -1 will be returned if cannot find the valid PG id.
++     */
++    int getStreamIdByPgName(std::string pgName);
++    /*
++     * re-cycler static method
++     */
++    static void reset(GraphConfigPipe* me);
++    void fullReset();
++    /*
++     * Debugging support
++     */
++    void dumpSettings();
++    void dumpKernels(int32_t streamId);
++    std::string getNodeName(Node* node);
++    void getCSIOutputResolution(camera_resolution_t* reso) { *reso = mCsiOutput; }
++
++ private:
++    struct ResolutionMemPool {
++        std::vector<ia_isp_bxt_resolution_info_t*> resHistorys;
++        std::vector<ia_isp_bxt_resolution_info_t*> resInfos;
++    };
++    /* Helper structures to access Sensor Node information easily */
++    class Rectangle {
++     public:
++        Rectangle();
++        int32_t w; /*<! width */
++        int32_t h; /*<! height */
++        int32_t t; /*<! top */
++        int32_t l; /*<! left */
++    };
++    class SubdevPad : public Rectangle {
++     public:
++        SubdevPad();
++        int32_t mbusFormat;
++    };
++    struct BinFactor {
++        int32_t h;
++        int32_t v;
++    };
++    struct ScaleFactor {
++        int32_t num;
++        int32_t denom;
++    };
++    union RcFactor {  // Resolution Changing factor
++        BinFactor bin;
++        ScaleFactor scale;
++    };
++    struct SubdevInfo {
++        std::string name;
++        SubdevPad in;
++        SubdevPad out;
++        RcFactor factor;
++        SubdevInfo() { CLEAR(factor); }
++    };
++    class SourceNodeInfo {
++     public:
++        SourceNodeInfo();
++        std::string name;
++        std::string i2cAddress;
++        std::string modeId;
++        bool metadataEnabled;
++        std::string csiPort;
++        std::string nativeBayer;
++        SubdevInfo tpg;
++        SubdevInfo pa;
++        SubdevInfo binner;
++        SubdevInfo scaler;
++        SubdevPad output;
++        int32_t interlaced;
++        std::string verticalFlip;
++        std::string horizontalFlip;
++        std::string link_freq;
++    };
++    status_t analyzeSourceType();
++    status_t analyzeCSIOutput();
++    void calculateSinkDependencies();
++    void storeTuningModes();
++    HalStream* getHalStreamByVirtualId(uid_t vPortId);
++
++    // Format options methods
++    status_t getActiveOutputPorts(const StreamToSinkMap& streamToSinkIdMap);
++    Node* getOutputPortForSink(const std::string& sinkName);
++    status_t getSinkFormatOptions();
++    status_t handleDynamicOptions();
++    status_t setPortFormats();
++    bool isVideoRecordPort(Node* sink);
++    status_t getProgramGroupsByName(const std::vector<std::string>& pgNames,
++                                    NodesPtrVector* programGroups);
++    const ia_isp_bxt_resolution_info_t* getGdcKernelResolutionInfo(uint32_t* kernelId);
++    const ia_isp_bxt_resolution_info_t* getScalerKernelResolutionInfo(uint32_t* kenerArray,
++                                                                      uint32_t sizeArray);
++    status_t getScalerKernelResolutionRatio(uint32_t* kenerArray, uint32_t sizeArray,
++                                            float* widthRatio, float* heightRatio);
++    status_t getScalerByStreamId(
++        std::map<Node*, IGraphType::PipelineConnection> edgePort2Connection,
++        std::vector<IGraphType::ScalerInfo>* scalerInfo);
++
++ private:
++    GCSS::GraphConfigNode* mSettings;
++    int32_t mReqId;
++    std::map<int32_t, ia_isp_bxt_program_group> mProgramGroup;
++    GCSS::BxtAicUtils mGCSSAicUtil;
++
++    bool mMetaEnabled;  // indicates if the specific sensor provides sensor
++                        // embedded metadata
++    enum SourceType {
++        SRC_NONE = 0,
++        SRC_SENSOR,
++        SRC_TPG,
++    };
++    SourceType mSourceType;
++    camera_resolution_t mCsiOutput;
++    std::string mSourcePortName;  // Sensor or TPG port name
++
++    /**
++     * pre-computed state done *per request*.
++     * This map holds the terminal id's of the ISA's peer ports (this is
++     * the terminal id's of the input port of the video or still pipe)
++     * that are required to fulfill a request.
++     * Ideally this gets initialized during init() call.
++     * But for now the GcManager will set it via a private method.
++     * we use a map so that we can handle the case when a request has 2 buffers
++     * that are generated from the same pipe.
++     */
++    std::map<uid_t, uid_t> mIsaActiveDestinations;
++    std::set<int32_t> mActiveStreamId;
++    /**
++     * vector holding one structure per virtual sink that stores the stream id
++     * (pipeline id) associated with it and the terminal id of the input port
++     * of that stream.
++     * This vector is updated once per stream config.
++     */
++    std::vector<SinkDependency> mSinkDependencies;
++    /**
++     * vector holding the peers to the sink nodes. Map contains pairs of
++     * {sink, peer}.
++     * This map is filled at stream config time.
++     */
++    std::map<Node*, Node*> mSinkPeerPort;
++    /**
++     *copy of the map provided from GraphConfigManager to be used internally.
++     */
++    StreamToSinkMap mStreamToSinkIdMap;
++    std::map<std::string, int32_t> mIsaOutputPort2StreamId;
++    /**
++     * Map of tuning modes per stream id
++     * Key: stream id
++     * Value: tuning mode
++     */
++    std::map<int32_t, int32_t> mStream2TuningMap;
++    int mPipeUseCase;
++
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfigPipe);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
+new file mode 100644
+index 000000000000..40b81822132b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
+@@ -0,0 +1,127 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Camera3BufferPool"
++
++#include "Camera3BufferPool.h"
++
++#include "HALv3Utils.h"
++#include "iutils/Utils.h"
++
++namespace camera3 {
++
++Camera3BufferPool::Camera3BufferPool() {
++    LOG1("@%s", __func__);
++}
++
++Camera3BufferPool::~Camera3BufferPool() {
++    LOG1("@%s", __func__);
++    destroyBufferPool();
++}
++
++// Create the buffer pool with HEAP buffer
++icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs,
++                                                      const icamera::stream_t& stream) {
++    LOG1("@%s number of buffers:%d", __func__, numBufs);
++    std::lock_guard<std::mutex> l(mLock);
++    mBuffers.clear();
++
++    for (uint32_t i = 0; i < numBufs; i++) {
++        std::shared_ptr<Camera3Buffer> buffer = MemoryUtils::allocateHeapBuffer(
++            stream.width, stream.height, stream.stride, stream.format, cameraId, stream.size);
++        if (!buffer) {
++            mBuffers.clear();
++            LOGE("failed to alloc %d internal buffers", i);
++            return icamera::NO_MEMORY;
++        }
++
++        // Initialize the buffer status to free
++        mBuffers[buffer] = false;
++    }
++
++    return icamera::OK;
++}
++
++// Create the buffer pool with GFX handle buffer
++icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs, int width,
++                                                      int height, int gfxFmt, int usage) {
++    LOG1("@%s number of buffers:%d", __func__, numBufs);
++    std::lock_guard<std::mutex> l(mLock);
++    mBuffers.clear();
++
++    for (uint32_t i = 0; i < numBufs; i++) {
++        std::shared_ptr<Camera3Buffer> buffer =
++            MemoryUtils::allocateHandleBuffer(width, height, gfxFmt, usage, cameraId);
++        if (!buffer || buffer->lock() != icamera::OK) {
++            mBuffers.clear();
++            LOGE("failed to alloc %d internal buffers", i);
++            return icamera::NO_MEMORY;
++        }
++
++        // Initialize the buffer status to free
++        mBuffers[buffer] = false;
++    }
++
++    return icamera::OK;
++}
++
++void Camera3BufferPool::destroyBufferPool() {
++    LOG1("@%s Internal buffers size:%zu", __func__, mBuffers.size());
++
++    std::lock_guard<std::mutex> l(mLock);
++    mBuffers.clear();
++}
++
++std::shared_ptr<Camera3Buffer> Camera3BufferPool::acquireBuffer() {
++    std::lock_guard<std::mutex> l(mLock);
++    for (auto& buf : mBuffers) {
++        if (!buf.second) {
++            buf.second = true;
++            LOG2("%s addr:%p", __func__, buf.first->data());
++            return buf.first;
++        }
++    }
++
++    LOGE("%s all the internal buffers are busy", __func__);
++    return nullptr;
++}
++
++void Camera3BufferPool::returnBuffer(std::shared_ptr<Camera3Buffer> buffer) {
++    std::lock_guard<std::mutex> l(mLock);
++    for (auto& buf : mBuffers) {
++        if (buf.second && buf.first == buffer) {
++            LOG2("%s addr:%p", __func__, buffer->data());
++            buf.second = false;
++            return;
++        }
++    }
++
++    LOGE("%s, the internal buffer addr:%p not found", __func__, buffer->data());
++}
++
++std::shared_ptr<Camera3Buffer> Camera3BufferPool::findBuffer(void* memAddr) {
++    std::lock_guard<std::mutex> l(mLock);
++    for (auto& buf : mBuffers) {
++        if (buf.second && buf.first->data() == memAddr) {
++            LOG2("%s addr:%p", __func__, memAddr);
++            return buf.first;
++        }
++    }
++
++    LOGE("%s, Failed to find the internal buffer addr: %p", __func__, memAddr);
++    return nullptr;
++}
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
+new file mode 100644
+index 000000000000..e08bdc9b7136
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <mutex>
++#include <unordered_map>
++
++#include "Camera3Buffer.h"
++
++namespace camera3 {
++
++/**
++ * \class Camera3BufferPool
++ *
++ * This class is used to manage a memory pool based on Camera3Buffer
++ * It needs to follow the calling sequence:
++ * createBufferPool -> acquireBuffer -> findBuffer -> returnBuffer
++ */
++class Camera3BufferPool {
++ public:
++    Camera3BufferPool();
++    ~Camera3BufferPool();
++
++    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs,
++                                       const icamera::stream_t& stream);
++    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs, int width, int height,
++                                       int gfxFmt, int usage);
++
++    void destroyBufferPool();
++    std::shared_ptr<Camera3Buffer> acquireBuffer();
++    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
++    std::shared_ptr<Camera3Buffer> findBuffer(void* memAddr);
++
++ private:
++    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool> mBuffers;
++    // first: camera3Buffer, second: true as buffer in used
++    std::mutex mLock;  // lock the mBuffers
++};
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
+new file mode 100644
+index 000000000000..7be88eb6d2ae
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
+@@ -0,0 +1,527 @@
++/*
++ * Copyright (C) 2013-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Camera3Buffer"
++
++#include "Camera3Buffer.h"
++
++#include <sync/sync.h>
++#include <sys/mman.h>
++#include <unistd.h>
++
++#include "Camera3Stream.h"
++#include "HALv3Utils.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++using namespace icamera;
++
++namespace camera3 {
++////////////////////////////////////////////////////////////////////
++// PUBLIC METHODS
++////////////////////////////////////////////////////////////////////
++
++/**
++ * Camera3Buffer
++ *
++ * Default constructor
++ * This constructor is used when we pre-allocate the Camera3Buffer object
++ * The initialization will be done as a second stage wit the method
++ * init(), where we initialize the wrapper with the gralloc buffer provided by
++ * the framework
++ */
++Camera3Buffer::Camera3Buffer()
++        : mFormat(0),
++          mInit(false),
++          mLocked(false),
++          mType(BUF_TYPE_HANDLE),
++          mHandlePtr(nullptr),
++          mCameraId(0),
++          mRegistered(false),
++          mGbmBufferManager(nullptr) {
++    CLEAR(mHalBuffer);
++    mHalBuffer.dmafd = -1;
++    LOG1("%s default constructor for buf %p", __func__, this);
++}
++
++/**
++ * Camera3Buffer
++ *
++ * Constructor for buffers allocated using MemoryUtils::allocateHeapBuffer
++ *
++ * \param w [IN] width
++ * \param h [IN] height
++ * \param s [IN] stride
++ * \param v4l2fmt [IN] V4l2 format
++ * \param usrPtr [IN] Data pointer
++ * \param cameraId [IN] id of camera being used
++ * \param dataSizeOverride [IN] buffer size input. Default is 0 and frameSize()
++                                is used in that case.
++ */
++Camera3Buffer::Camera3Buffer(int w, int h, int stride, int v4l2fmt, void* usrPtr, int cameraId,
++                             int dataSizeOverride)
++        : mFormat(0),
++          mInit(false),
++          mLocked(true),
++          mType(BUF_TYPE_MALLOC),
++          mHandlePtr(nullptr),
++          mCameraId(cameraId)
++
++{
++    LOG1("%s create malloc camera buffer %p", __func__, this);
++
++    CLEAR(mHalBuffer);
++    mHalBuffer.s.format = v4l2fmt;
++    mHalBuffer.s.width = w;
++    mHalBuffer.s.height = h;
++    mHalBuffer.s.stride = stride;
++    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
++    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
++    mHalBuffer.dmafd = -1;
++
++    if (usrPtr != nullptr) {
++        mHalBuffer.addr = usrPtr;
++        mInit = true;
++        mHalBuffer.s.size =
++            dataSizeOverride ? dataSizeOverride : CameraUtils::getFrameSize(v4l2fmt, stride, h);
++    } else {
++        LOGE("Tried to initialize a buffer with nullptr ptr!!");
++    }
++}
++
++Camera3Buffer::~Camera3Buffer() {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++
++    if (mInit) {
++        switch (mType) {
++            case BUF_TYPE_MALLOC:
++                free(mHalBuffer.addr);
++                mHalBuffer.addr = nullptr;
++                break;
++            case BUF_TYPE_MMAP:
++                if (mHalBuffer.addr != nullptr) munmap(mHalBuffer.addr, mHalBuffer.s.size);
++                mHalBuffer.addr = nullptr;
++                mHalBuffer.s.size = 0;
++                close(mHalBuffer.dmafd);
++                break;
++            case BUF_TYPE_HANDLE:
++                // Allocated by the HAL
++                if (!(mUserBuffer.stream)) {
++                    LOG1("release internal buffer");
++                    // For HAL buffer, need to unlock before free it
++                    unlock();
++                    mGbmBufferManager->Free(mHandle);
++                }
++                break;
++            default:
++                break;
++        }
++    }
++    LOG1("%s destroying buf %p", __func__, this);
++}
++
++/**
++ * init
++ *
++ * Construct to wrap a camera3_stream_buffer
++ *
++ * \param aBuffer [IN] camera3_stream_buffer buffer
++ */
++icamera::status_t Camera3Buffer::init(const camera3_stream_buffer* aBuffer, int cameraId) {
++    mType = BUF_TYPE_HANDLE;
++    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
++    mHandle = *aBuffer->buffer;
++    mHandlePtr = aBuffer->buffer;
++    mHalBuffer.s.width = aBuffer->stream->width;
++    mHalBuffer.s.height = aBuffer->stream->height;
++    mFormat = aBuffer->stream->format;
++    mHalBuffer.s.memType =
++        IS_ZSL_USAGE(aBuffer->stream->usage) ? V4L2_MEMORY_USERPTR : V4L2_MEMORY_DMABUF;
++    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
++    // Use actual width from platform native handle for stride
++    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(*aBuffer->buffer, 0);
++    mHalBuffer.s.size =
++        CameraUtils::getFrameSize(mHalBuffer.s.format, mHalBuffer.s.stride, mHalBuffer.s.height);
++    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
++    mLocked = false;
++    mInit = true;
++    mHalBuffer.addr = nullptr;
++    mUserBuffer = *aBuffer;
++    mUserBuffer.release_fence = -1;
++    mCameraId = cameraId;
++    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d, size: %d", __func__, mHandle,
++         mFormat, mHalBuffer.s.width, mHalBuffer.s.height, mHalBuffer.s.stride, mHalBuffer.s.size);
++
++    if (mHandle == nullptr) {
++        LOGE("@%s: invalid buffer handle", __func__);
++        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
++        return BAD_VALUE;
++    }
++
++    mHalBuffer.dmafd = mHandle->data[0];
++    int ret = registerBuffer();
++    if (ret) {
++        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
++        return UNKNOWN_ERROR;
++    }
++
++    /* TODO: add some consistency checks here and return an error */
++    return icamera::OK;
++}
++
++icamera::status_t Camera3Buffer::init(const camera3_stream_t* stream, buffer_handle_t handle,
++                                      int cameraId) {
++    mType = BUF_TYPE_HANDLE;
++    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
++    mHandle = handle;
++    mHalBuffer.s.width = stream->width;
++    mHalBuffer.s.height = stream->height;
++    mFormat = stream->format;
++    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
++    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
++    // Use actual width from platform native handle for stride
++    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(handle, 0);
++    mHalBuffer.s.size = 0;
++    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
++    mLocked = false;
++    mInit = true;
++    mHalBuffer.addr = nullptr;
++    mCameraId = cameraId;
++    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d", __func__, mHandle, mFormat,
++         mHalBuffer.s.width, mHalBuffer.s.height, mHalBuffer.s.stride);
++
++    return icamera::OK;
++}
++
++icamera::status_t Camera3Buffer::deinit() {
++    return deregisterBuffer();
++}
++
++icamera::status_t Camera3Buffer::waitOnAcquireFence() {
++    const int BUFFER_READY = -1;
++    if (mUserBuffer.acquire_fence != BUFFER_READY) {
++        LOG2("%s: Fence in HAL is %d", __func__, mUserBuffer.acquire_fence);
++        const int WAIT_TIME_OUT_MS = 300;
++        int ret = sync_wait(mUserBuffer.acquire_fence, WAIT_TIME_OUT_MS);
++        if (ret) {
++            mUserBuffer.release_fence = mUserBuffer.acquire_fence;
++            mUserBuffer.acquire_fence = -1;
++            mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
++            LOGE("Buffer sync_wait fail!");
++            return TIMED_OUT;
++        } else {
++            close(mUserBuffer.acquire_fence);
++        }
++        mUserBuffer.acquire_fence = BUFFER_READY;
++    }
++
++    return icamera::OK;
++}
++
++/**
++ * getFence
++ *
++ * return the fecne to request result
++ */
++icamera::status_t Camera3Buffer::getFence(camera3_stream_buffer* buf) {
++    if (!buf) return BAD_VALUE;
++
++    buf->acquire_fence = mUserBuffer.acquire_fence;
++    buf->release_fence = mUserBuffer.release_fence;
++
++    return icamera::OK;
++}
++
++icamera::status_t Camera3Buffer::registerBuffer() {
++    int ret = mGbmBufferManager->Register(mHandle);
++    if (ret) {
++        LOGE("@%s: call Register fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
++        return UNKNOWN_ERROR;
++    }
++
++    mRegistered = true;
++    return icamera::OK;
++}
++
++icamera::status_t Camera3Buffer::deregisterBuffer() {
++    if (mRegistered) {
++        int ret = mGbmBufferManager->Deregister(mHandle);
++        if (ret) {
++            LOGE("@%s: call Deregister fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
++            return UNKNOWN_ERROR;
++        }
++        mRegistered = false;
++    }
++
++    return icamera::OK;
++}
++
++/**
++ * lock
++ *
++ * lock the gralloc buffer with specified flags
++ *
++ * \param aBuffer [IN] int flags
++ */
++icamera::status_t Camera3Buffer::lock(int flags) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    mHalBuffer.addr = nullptr;
++    mHalBuffer.s.size = 0;
++    int ret = 0;
++    uint32_t planeNum = mGbmBufferManager->GetNumPlanes(mHandle);
++    LOG2("@%s, planeNum:%d, mHandle:%p, mFormat:%d", __func__, planeNum, mHandle, mFormat);
++
++    if (planeNum == 1) {
++        void* data = nullptr;
++        ret = (mFormat == HAL_PIXEL_FORMAT_BLOB)
++                  ? mGbmBufferManager->Lock(mHandle, 0, 0, 0, mHalBuffer.s.stride, 1, &data)
++                  : mGbmBufferManager->Lock(mHandle, 0, 0, 0, mHalBuffer.s.width,
++                                            mHalBuffer.s.height, &data);
++        mHalBuffer.addr = data;
++    } else if (planeNum > 1) {
++        struct android_ycbcr ycbrData;
++        ret = mGbmBufferManager->LockYCbCr(mHandle, 0, 0, 0, mHalBuffer.s.width,
++                                           mHalBuffer.s.height, &ycbrData);
++        mHalBuffer.addr = ycbrData.y;
++    } else {
++        LOGE("ERROR @%s: planeNum is 0", __func__);
++        return UNKNOWN_ERROR;
++    }
++
++    CheckError(ret, UNKNOWN_ERROR, "@%s: Failed to lock buffer, mHandle:%p planeNum: %d", __func__,
++               mHandle, planeNum);
++
++    for (uint32_t i = 0; i < planeNum; i++) {
++        mHalBuffer.s.size += mGbmBufferManager->GetPlaneSize(mHandle, i);
++    }
++
++    LOG2("@%s, addr:%p, size:%d", __func__, mHalBuffer.addr, mHalBuffer.s.size);
++    CheckError(!mHalBuffer.s.size, UNKNOWN_ERROR, "ERROR @%s: Failed to GetPlaneSize, it's 0",
++               __func__);
++
++    mLocked = true;
++
++    return icamera::OK;
++}
++
++icamera::status_t Camera3Buffer::lock() {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    icamera::status_t status;
++    int lockMode;
++
++    if (!mInit) {
++        LOGE("@%s: Error: Cannot lock now this buffer, not initialized", __func__);
++        return INVALID_OPERATION;
++    }
++
++    if (mType != BUF_TYPE_HANDLE) {
++        mLocked = true;
++        return icamera::OK;
++    }
++
++    if (mLocked) {
++        LOGE("@%s: Error: Cannot lock buffer, already locked", __func__);
++        return INVALID_OPERATION;
++    }
++
++    int usage = 0x20003;  // TODO: hard code the usage, fix to get the usage from stream later
++    lockMode = usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK |
++                        GRALLOC_USAGE_HW_CAMERA_MASK);
++    if (!lockMode) {
++        LOGW("@%s:trying to lock a buffer with no flags", __func__);
++        return INVALID_OPERATION;
++    }
++
++    status = lock(lockMode);
++    if (status != icamera::OK) {
++        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
++    }
++
++    return status;
++}
++
++icamera::status_t Camera3Buffer::unlock() {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    if (mLocked && mType != BUF_TYPE_HANDLE) {
++        mLocked = false;
++        return icamera::OK;
++    }
++
++    if (mLocked) {
++        LOG2("@%s, mHandle:%p, mFormat:%d", __func__, mHandle, mFormat);
++        int ret = mGbmBufferManager->Unlock(mHandle);
++        if (ret) {
++            LOGE("@%s: call Unlock fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
++            return UNKNOWN_ERROR;
++        }
++
++        mLocked = false;
++        return icamera::OK;
++    }
++    LOG1("@%s:trying to unlock a buffer that is not locked", __func__);
++    return INVALID_OPERATION;
++}
++
++void Camera3Buffer::dump() {
++    if (mInit) {
++        LOG1("Buffer dump: handle %p: locked :%d: dataPtr:%p", static_cast<void*>(&mHandle),
++             mLocked, mHalBuffer.addr);
++    } else {
++        LOG1("Buffer dump: Buffer not initialized");
++    }
++}
++
++void Camera3Buffer::dumpImage(int frameNumber, const int type, int format) {
++    if (!CameraDump::isDumpTypeEnable(type)) {
++        return;
++    }
++
++    dumpImage(mHalBuffer.addr, frameNumber, mHalBuffer.s.size, mHalBuffer.s.width,
++              mHalBuffer.s.height, format);
++}
++
++void Camera3Buffer::dumpImage(const void* data, int frameNumber, const int size, int width,
++                              int height, int format) const {
++#ifdef DUMP_IMAGE
++    static unsigned int count = 0;
++    count++;
++
++    std::string fileName(gDumpPath);
++    fileName += "dump_" + std::to_string(width) + "x" + std::to_string(height) + "_frame#" +
++                std::to_string(count) + "_req#" + std::to_string(frameNumber) + "." +
++                CameraUtils::format2string(format).c_str();
++    LOG2("%s filename is %s", __func__, fileName.data());
++
++    FILE* fp = fopen(fileName.data(), "w+");
++    if (fp == nullptr) {
++        LOGE("open file failed");
++        return;
++    }
++    LOG1("Begin write image %s", fileName.data());
++
++    if ((fwrite(data, size, 1, fp)) != 1)
++        LOGW("Error or short count writing %d bytes to %s", size, fileName.data());
++    fclose(fp);
++#endif
++}
++
++int Camera3Buffer::v4L2Fmt2GFXFmt(int v4l2Fmt) {
++    int gfxFmt = -1;
++
++    switch (v4l2Fmt) {
++        case V4L2_PIX_FMT_JPEG:
++            gfxFmt = HAL_PIXEL_FORMAT_BLOB;
++            break;
++        case V4L2_PIX_FMT_SBGGR8:
++        case V4L2_PIX_FMT_SRGGB8:
++        case V4L2_PIX_FMT_SGRBG8:
++        case V4L2_PIX_FMT_SRGGB10:
++        case V4L2_PIX_FMT_SGRBG10:
++        case V4L2_PIX_FMT_SGRBG12:
++        case V4L2_PIX_FMT_SBGGR10:
++        case V4L2_PIX_FMT_SBGGR10P:
++        case V4L2_PIX_FMT_SGBRG10P:
++        case V4L2_PIX_FMT_SGRBG10P:
++        case V4L2_PIX_FMT_SRGGB10P:
++        case V4L2_PIX_FMT_SBGGR12:
++        case V4L2_PIX_FMT_SGBRG12:
++        case V4L2_PIX_FMT_SRGGB12:
++            gfxFmt = HAL_PIXEL_FORMAT_RAW16;
++            break;
++        case V4L2_PIX_FMT_YVU420:
++            gfxFmt = HAL_PIXEL_FORMAT_YV12;
++            break;
++        case V4L2_PIX_FMT_NV21:
++            gfxFmt = HAL_PIXEL_FORMAT_YCrCb_420_SP;
++            break;
++        case V4L2_PIX_FMT_NV12:
++            LOGW("Current there is no gfx format for V4L2_PIX_FMT_NV12.");
++            break;
++        case V4L2_PIX_FMT_YUYV:
++            gfxFmt = HAL_PIXEL_FORMAT_YCbCr_422_I;
++            break;
++        default:
++            LOGE("%s: no gfx format for v4l2 0x%x, %s!", __func__, v4l2Fmt,
++                 CameraUtils::format2string(v4l2Fmt).c_str());
++            break;
++    }
++
++    return gfxFmt;
++}
++
++/**
++ * Utility methods to allocate Camera3Buffer from HEAP or Gfx memory
++ */
++namespace MemoryUtils {
++
++/**
++ * Allocates the memory needed to store the image described by the parameters
++ * passed during construction
++ */
++std::shared_ptr<Camera3Buffer> allocateHeapBuffer(int w, int h, int stride, int v4l2Fmt,
++                                                  int cameraId, int dataSizeOverride) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    void* dataPtr;
++
++    int dataSize = dataSizeOverride ? PAGE_ALIGN(dataSizeOverride)
++                                    : CameraUtils::getFrameSize(v4l2Fmt, stride, h);
++    LOG1("@%s, dataSize:%d", __func__, dataSize);
++
++    int ret = posix_memalign(&dataPtr, sysconf(_SC_PAGESIZE), dataSize);
++    if (dataPtr == nullptr || ret != 0) {
++        LOGE("Could not allocate heap camera buffer of size %d", dataSize);
++        return nullptr;
++    }
++
++    return std::shared_ptr<Camera3Buffer>(
++        new Camera3Buffer(w, h, stride, v4l2Fmt, dataPtr, cameraId, dataSize));
++}
++
++/**
++ * Allocates internal GBM buffer
++ */
++std::shared_ptr<Camera3Buffer> allocateHandleBuffer(int w, int h, int gfxFmt, int usage,
++                                                    int cameraId) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    cros::CameraBufferManager* bufManager = cros::CameraBufferManager::GetInstance();
++    buffer_handle_t handle;
++    uint32_t stride = 0;
++
++    LOG1("%s, [wxh] = [%dx%d], format 0x%x, usage 0x%x", __func__, w, h, gfxFmt, usage);
++    int ret = bufManager->Allocate(w, h, gfxFmt, usage, cros::GRALLOC, &handle, &stride);
++    if (ret != 0) {
++        LOGE("Allocate handle failed! %d", ret);
++        return nullptr;
++    }
++
++    std::shared_ptr<Camera3Buffer> buffer(new Camera3Buffer());
++    camera3_stream_t stream{};
++    stream.width = w;
++    stream.height = h;
++    stream.format = gfxFmt;
++    stream.usage = usage;
++    ret = buffer->init(&stream, handle, cameraId);
++    if (ret != icamera::OK) {
++        // buffer handle will free in Camera3Buffer destructure function
++        return nullptr;
++    }
++
++    return buffer;
++}
++
++}  // namespace MemoryUtils
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
+new file mode 100644
+index 000000000000..2fc59af592ff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
+@@ -0,0 +1,159 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <cros-camera/camera_buffer_manager.h>
++#include <hardware/camera3.h>
++
++#include <memory>
++
++#include "Parameters.h"
++#include "iutils/Errors.h"
++
++namespace camera3 {
++
++// Forward declaration to  avoid extra include
++class Camera3Stream;
++
++enum Camera3BufferType {
++    BUF_TYPE_HANDLE,
++    BUF_TYPE_MALLOC,
++    BUF_TYPE_MMAP,
++};
++
++/**
++ * \class Camera3Buffer
++ *
++ * This class is the buffer abstraction in the HAL. It can store buffers
++ * provided by the framework or buffers allocated by the HAL.
++ * Allocation in the HAL can be done via gralloc, malloc or mmap
++ * in case of mmap the memory cannot be freed
++ */
++class Camera3Buffer {
++ public:
++    /**
++     * default constructor
++     * Used for buffers coming from the framework. The wrapper is initialized
++     * using the method init
++     */
++    Camera3Buffer();
++
++    /**
++     * no need to delete a buffer since it is RefBase'd. Buffer will be deleted
++     * when no reference to it exist.
++     */
++    ~Camera3Buffer();
++
++    /**
++     * constructor for the HAL-allocated buffer
++     * These are used via the utility methods in the MemoryUtils namespace
++     */
++    Camera3Buffer(int w, int h, int stride, int v4l2fmt, void* usrPtr, int cameraId,
++                  int dataSizeOverride = 0);
++
++    /**
++     * initialization for the wrapper around the framework buffers
++     */
++    icamera::status_t init(const camera3_stream_buffer* aBuffer, int cameraId);
++
++    /**
++     * initialization for the fake framework buffer (allocated by the HAL)
++     */
++    icamera::status_t init(const camera3_stream_t* stream, buffer_handle_t buffer, int cameraId);
++    /**
++     * deinitialization for the wrapper around the framework buffers
++     */
++    icamera::status_t deinit();
++
++    /**
++     * dump functions
++     */
++    void dump();
++    void dumpImage(int frameNumber, const int type, int format);
++    void dumpImage(const void* data, int frameNumber, const int size, int width, int height,
++                   int format) const;
++
++    /**
++     * lock the buffer and get buffer addr from handle
++     */
++    icamera::status_t lock();
++    icamera::status_t unlock();
++
++    /**
++     * Fence
++     */
++    icamera::status_t waitOnAcquireFence();
++    icamera::status_t getFence(camera3_stream_buffer* buf);
++
++    /**
++     * Convert the GFX format to v4l2 format
++     */
++    int v4L2Fmt2GFXFmt(int v4l2Fmt);
++
++    /**
++     * APIs for getting private member
++     */
++    int width() { return mHalBuffer.s.width; }
++    int height() { return mHalBuffer.s.height; }
++    int stride() { return mHalBuffer.s.stride; }
++    unsigned int size() { return mHalBuffer.s.size; }
++    int v4l2Fmt() { return mHalBuffer.s.format; }
++    void* data() { return mHalBuffer.addr; }
++    uint64_t getTimeStamp() { return mHalBuffer.timestamp; }
++    void setTimeStamp(uint64_t timestamp) { mHalBuffer.timestamp = timestamp; }
++    int format() { return mFormat; }
++    buffer_handle_t* getBufferHandle() { return mHandlePtr; }
++    bool isLocked() const { return mLocked; }
++    int dmaBufFd() { return mType == BUF_TYPE_HANDLE ? mHandle->data[0] : mHalBuffer.dmafd; }
++    int status() { return mUserBuffer.status; }
++    camera3_stream_t* getStream() { return mUserBuffer.stream; }
++    icamera::camera_buffer_t getHalBuffer() { return mHalBuffer; }
++
++ private:
++    icamera::status_t lock(int flags);
++    icamera::status_t registerBuffer();
++    icamera::status_t deregisterBuffer();
++
++ private:
++    /*!< Original structure passed by request */
++    camera3_stream_buffer_t mUserBuffer = {0, 0, 0, -1, -1};
++    int mFormat;  /*!<  HAL PIXEL fmt */
++    bool mInit;   /*!< Boolean to check the integrity of the
++                       buffer when it is created*/
++    bool mLocked; /*!< Use to track the lock status */
++    Camera3BufferType mType;
++
++    buffer_handle_t mHandle = {};
++    buffer_handle_t* mHandlePtr;
++    int mCameraId;
++    icamera::camera_buffer_t mHalBuffer;
++
++ private:
++    bool mRegistered; /*!< Use to track the buffer register status */
++    cros::CameraBufferManager* mGbmBufferManager;
++};
++
++namespace MemoryUtils {
++
++std::shared_ptr<Camera3Buffer> allocateHeapBuffer(int w, int h, int stride, int v4l2Fmt,
++                                                  int cameraId, int dataSizeOverride = 0);
++
++std::shared_ptr<Camera3Buffer> allocateHandleBuffer(int w, int h, int gfxFmt, int usage,
++                                                    int cameraId);
++};  // namespace MemoryUtils
++
++}  // namespace camera3
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
+new file mode 100644
+index 000000000000..edbd5998cf93
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
+@@ -0,0 +1,116 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "modules/sandboxing/IPCCommon.h"
++
++#include <iostream>
++#include <string>
++
++namespace icamera {
++const char* IntelAlgoIpcCmdToString(IPC_CMD cmd) {
++    static const char* gIpcCmdMapping[] = {"unknown",
++                                           "IPC_LARD_INIT",
++                                           "IPC_LARD_GET_TAG_LIST",
++                                           "IPC_LARD_RUN",
++                                           "IPC_LARD_DEINIT",
++                                           "IPC_FD_INIT",
++                                           "IPC_FD_RUN",
++                                           "IPC_FD_DEINIT",
++                                           "IPC_GRAPH_ADD_KEY",
++                                           "IPC_GRAPH_PARSE",
++                                           "IPC_GRAPH_RELEASE_NODES",
++                                           "IPC_GRAPH_CONFIG_STREAMS",
++                                           "IPC_GRAPH_GET_CONFIG_DATA",
++                                           "IPC_GRAPH_GET_CONNECTION",
++                                           "IPC_GRAPH_GET_PG_ID",
++                                           "IPC_CMC_INIT",
++                                           "IPC_CMC_DEINIT",
++                                           "IPC_MKN_INIT",
++                                           "IPC_MKN_ENABLE",
++                                           "IPC_MKN_PREPARE",
++                                           "IPC_MKN_DEINIT",
++                                           "IPC_LTM_INIT",
++                                           "IPC_LTM_RUN",
++                                           "IPC_LTM_DEINIT",
++                                           "IPC_AIQ_INIT",
++                                           "IPC_AIQ_AE_RUN",
++                                           "IPC_AIQ_AF_RUN",
++                                           "IPC_AIQ_AWB_RUN",
++                                           "IPC_AIQ_GBCE_RUN",
++                                           "IPC_AIQ_PA_RUN_V1",
++                                           "IPC_AIQ_SA_RUN_V2",
++                                           "IPC_AIQ_STATISTICS_SET_V4",
++                                           "IPC_AIQ_GET_AIQD_DATA",
++                                           "IPC_AIQ_DEINIT",
++                                           "IPC_AIQ_GET_VERSION",
++                                           "IPC_DVS_INIT",
++                                           "IPC_DVS_CONFIG",
++                                           "IPC_DVS_SET_NONE_BLANK_RATION",
++                                           "IPC_DVS_SET_DIGITAL_ZOOM_MODE",
++                                           "IPC_DVS_SET_DIGITAL_ZOOM_REGION",
++                                           "IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE",
++                                           "IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE",
++                                           "IPC_DVS_FREE_MORPH_TABLE",
++                                           "IPC_DVS_ALLOCATE_MORPH_TABLE",
++                                           "IPC_DVS_GET_MORPH_TABLE",
++                                           "IPC_DVS_SET_STATISTICS",
++                                           "IPC_DVS_EXECUTE",
++                                           "IPC_DVS_GET_IMAGE_TRANSFORMATION",
++                                           "IPC_DVS_DEINIT",
++                                           "IPC_ISP_ADAPTOR_INIT",
++                                           "IPC_ISP_ADAPTOR_DEINIT",
++                                           "IPC_ISP_GET_PAL_SIZE",
++                                           "IPC_ISP_CONVERT_STATS",
++                                           "IPC_ISP_RUN_PAL",
++                                           "IPC_PG_PARAM_INIT",
++                                           "IPC_PG_PARAM_PREPARE",
++                                           "IPC_PG_PARAM_ALLOCATE_PG",
++                                           "IPC_PG_PARAM_GET_FRAG_DESCS",
++                                           "IPC_PG_PARAM_PREPARE_PROGRAM",
++                                           "IPC_PG_PARAM_ALLOCATE_PAYLOADS",
++                                           "IPC_PG_PARAM_ENCODE",
++                                           "IPC_PG_PARAM_DECODE",
++                                           "IPC_PG_PARAM_DEINIT",
++                                           "IPC_GPU_TNR_INIT",
++                                           "IPC_GPU_TNR_PREPARE_SURFACE",
++                                           "IPC_GPU_TNR_RUN_FRAME",
++                                           "IPC_GPU_TNR_PARAM_UPDATE",
++                                           "IPC_GPU_TNR_DEINIT"};
++
++    unsigned int num = sizeof(gIpcCmdMapping) / sizeof(gIpcCmdMapping[0]);
++    return cmd < num ? gIpcCmdMapping[cmd] : gIpcCmdMapping[0];
++}
++
++IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd) {
++    IPC_GROUP group = IPC_GROUP_CPU_OTHER;
++    if (cmd >= IPC_AIQ_INIT && cmd <= IPC_AIQ_GET_VERSION) {
++        group = IPC_GROUP_AIQ;
++    } else if (cmd >= IPC_ISP_ADAPTOR_INIT && cmd <= IPC_ISP_RUN_PAL) {
++        group = IPC_GROUP_PAL;
++    } else if (cmd >= IPC_PG_PARAM_INIT && cmd <= IPC_PG_PARAM_DEINIT) {
++        group = IPC_GROUP_PSYS;
++    } else if (cmd >= IPC_FD_INIT && cmd <= IPC_FD_DEINIT) {
++        group = IPC_GROUP_FD;
++    } else if (cmd < IPC_GPU_TNR_INIT) {
++        group = IPC_GROUP_CPU_OTHER;
++    } else {
++        group = IPC_GROUP_GPU;
++    }
++
++    return group;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
+new file mode 100644
+index 000000000000..72dc0158c6e8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
+@@ -0,0 +1,125 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_aiq_types.h>
++#include <ia_cmc_types.h>
++#include <ia_types.h>
++
++#include "iutils/Errors.h"
++
++namespace icamera {
++#define IPC_MATCHING_KEY 0x56  // the value is randomly chosen
++#define IPC_REQUEST_HEADER_USED_NUM 1
++#define SHM_NAME "shm"
++
++enum IPC_CMD {
++    // CPU IPC COMMANDS
++    IPC_LARD_INIT = 1,
++    IPC_LARD_GET_TAG_LIST,
++    IPC_LARD_RUN,
++    IPC_LARD_DEINIT,
++    IPC_FD_INIT,
++    IPC_FD_RUN,
++    IPC_FD_DEINIT,
++    IPC_GRAPH_ADD_KEY,
++    IPC_GRAPH_PARSE,
++    IPC_GRAPH_RELEASE_NODES,
++    IPC_GRAPH_CONFIG_STREAMS,
++    IPC_GRAPH_GET_CONFIG_DATA,
++    IPC_GRAPH_GET_CONNECTION,
++    IPC_GRAPH_GET_PG_ID,
++    IPC_CMC_INIT,
++    IPC_CMC_DEINIT,
++    IPC_MKN_INIT,
++    IPC_MKN_ENABLE,
++    IPC_MKN_PREPARE,
++    IPC_MKN_DEINIT,
++    IPC_LTM_INIT,
++    IPC_LTM_RUN,
++    IPC_LTM_DEINIT,
++    IPC_AIQ_INIT,
++    IPC_AIQ_AE_RUN,
++    IPC_AIQ_AF_RUN,
++    IPC_AIQ_AWB_RUN,
++    IPC_AIQ_GBCE_RUN,
++    IPC_AIQ_PA_RUN_V1,
++    IPC_AIQ_SA_RUN_V2,
++    IPC_AIQ_STATISTICS_SET_V4,
++    IPC_AIQ_GET_AIQD_DATA,
++    IPC_AIQ_DEINIT,
++    IPC_AIQ_GET_VERSION,
++    IPC_DVS_INIT,
++    IPC_DVS_CONFIG,
++    IPC_DVS_SET_NONE_BLANK_RATION,
++    IPC_DVS_SET_DIGITAL_ZOOM_MODE,
++    IPC_DVS_SET_DIGITAL_ZOOM_REGION,
++    IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE,
++    IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE,
++    IPC_DVS_FREE_MORPH_TABLE,
++    IPC_DVS_ALLOCATE_MORPH_TABLE,
++    IPC_DVS_GET_MORPH_TABLE,
++    IPC_DVS_SET_STATISTICS,
++    IPC_DVS_EXECUTE,
++    IPC_DVS_GET_IMAGE_TRANSFORMATION,
++    IPC_DVS_DEINIT,
++    IPC_ISP_ADAPTOR_INIT,
++    IPC_ISP_ADAPTOR_DEINIT,
++    IPC_ISP_GET_PAL_SIZE,
++    IPC_ISP_CONVERT_STATS,
++    IPC_ISP_RUN_PAL,
++    IPC_PG_PARAM_INIT,
++    IPC_PG_PARAM_PREPARE,
++    IPC_PG_PARAM_ALLOCATE_PG,
++    IPC_PG_PARAM_GET_FRAG_DESCS,
++    IPC_PG_PARAM_PREPARE_PROGRAM,
++    IPC_PG_PARAM_ALLOCATE_PAYLOADS,
++    IPC_PG_PARAM_ENCODE,
++    IPC_PG_PARAM_DECODE,
++    IPC_PG_PARAM_DEINIT,
++    // GPU IPC COMMANDS
++    IPC_GPU_TNR_INIT,
++    IPC_GPU_TNR_PREPARE_SURFACE,
++    IPC_GPU_TNR_RUN_FRAME,
++    IPC_GPU_TNR_PARAM_UPDATE,
++    IPC_GPU_TNR_DEINIT
++};
++
++#define MAX_IA_BINARY_DATA_SIZE 800000
++struct ia_binary_data_mod {
++    unsigned int size;
++    char data[MAX_IA_BINARY_DATA_SIZE];
++};
++
++const char* IntelAlgoIpcCmdToString(IPC_CMD cmd);
++
++enum IPC_GROUP {
++    // IPC command group for cpu
++    IPC_GROUP_AIQ,
++    IPC_GROUP_PAL,
++    IPC_GROUP_PSYS,
++    IPC_GROUP_FD,
++    IPC_GROUP_CPU_OTHER,
++    // IPU command group for gpu
++    IPC_GROUP_GPU,
++};
++#define IPC_GROUP_NUM (IPC_GROUP_GPU + 1)
++#define IPC_CPU_GROUP_NUM (IPC_GROUP_CPU_OTHER + 1)
++#define IPC_GPU_GROUP_NUM (IPC_GROUP_NUM - IPC_GROUP_GPU)
++
++IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd);
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
+new file mode 100644
+index 000000000000..3903ae6ab51d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
+@@ -0,0 +1,490 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_GRAPH_CONFIG"
++
++#include "modules/sandboxing/IPCGraphConfig.h"
++
++#include <sys/stat.h>
++
++#include <memory>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCGraphConfig::IPCGraphConfig() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCGraphConfig::~IPCGraphConfig() {
++    LOGIPC("@%s", __func__);
++}
++
++status_t IPCGraphConfig::readDataFromXml(const char* fileName, char* dataPtr, size_t* dataSize,
++                                         int maxSize) {
++    CheckError(!dataSize || !fileName || !dataPtr, UNKNOWN_ERROR, "%s, invalid argument", __func__);
++
++    struct stat statBuf;
++    int ret = stat(fileName, &statBuf);
++    CheckError((ret != 0), UNKNOWN_ERROR, "Failed to query the size of file: %s!", fileName);
++    CheckError(statBuf.st_size > maxSize, BAD_VALUE, "The memory size less than file size: %s",
++               fileName);
++
++    *dataSize = static_cast<size_t>(statBuf.st_size);
++    LOGIPC("%s, fileName: %s, size: %zu", __func__, fileName, *dataSize);
++
++    FILE* file = fopen(fileName, "rb");
++    CheckError(!file, NAME_NOT_FOUND, "%s, Failed to open file: %s", __func__, fileName);
++
++    size_t len = fread(dataPtr, 1, *dataSize, file);
++    fclose(file);
++
++    CheckError((len != *dataSize), UNKNOWN_ERROR, "%s, Failed to read data from file: %s", __func__,
++               fileName);
++
++    return OK;
++}
++
++bool IPCGraphConfig::clientFlattenParse(void* pData, uint32_t size, int cameraId,
++                                        const char* graphDescFile, const char* settingsFile) {
++    LOGIPC("@%s, pData:%p, size: %zu, cameraId: %d", __func__, pData, size, cameraId);
++
++    CheckError(!pData || !graphDescFile || !settingsFile, false,
++               "@%s, pData, graphDescFile or settingsFile is nullptr", __func__);
++    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
++
++    GraphParseParams* params = static_cast<GraphParseParams*>(pData);
++    CLEAR(*params);
++
++    params->cameraId = cameraId;
++    int ret =
++        readDataFromXml(graphDescFile, params->GD, &(params->gdSize), MAX_GRAPH_DESCRIPTOR_SIZE);
++    CheckError(ret != OK, false, "Failed to read the graph descriptor file: %s", graphDescFile);
++
++    ret = readDataFromXml(settingsFile, params->GS, &(params->gsSize), MAX_GRAPH_SETTINGS_SIZE);
++    CheckError(ret != OK, false, "Failed to read the graph settings file: %s", settingsFile);
++
++    return true;
++}
++
++bool IPCGraphConfig::serverUnflattenParse(void* pData, uint32_t size,
++                                          GraphParseParams** parseParam) {
++    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
++    CheckError(!parseParam, false, "@%s, parseParam is nullptr", __func__);
++
++    GraphParseParams* params = static_cast<GraphParseParams*>(pData);
++    *parseParam = params;
++
++    return true;
++}
++
++bool IPCGraphConfig::clientFlattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo info,
++                                                GraphSettingType type,
++                                                const std::vector<HalStream*>& streams) {
++    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d", __func__, pData, info.cameraId,
++           info.configMode);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphConfigStreamParams), false, "@%s, buffer is small", __func__);
++    CheckError(streams.empty(), false, "@%s, stream vector is empty", __func__);
++
++    GraphConfigStreamParams* params = static_cast<GraphConfigStreamParams*>(pData);
++    CLEAR(*params);
++
++    params->baseInfo = info;
++    params->type = type;
++    for (size_t i = 0; i < streams.size(); ++i) {
++        params->streamCfg[i] = *(streams[i]);
++        params->streamPriv[i] = *(static_cast<stream_t*>(streams[i]->mPrivate));
++        params->streamNum++;
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::serverUnflattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo* info,
++                                                  GraphSettingType* type,
++                                                  std::vector<HalStream*>* streams) {
++    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphConfigStreamParams), false, "@%s, buffer is small", __func__);
++    CheckError(!info || !type || !streams, false, "%s, the info, type or streams is nullptr",
++               __func__);
++
++    GraphConfigStreamParams* params = static_cast<GraphConfigStreamParams*>(pData);
++
++    *info = params->baseInfo;
++    *type = params->type;
++    for (uint32_t i = 0; i < params->streamNum; ++i) {
++        params->streamCfg[i].mPrivate = static_cast<void*>(&(params->streamPriv[i]));
++        streams->push_back(&(params->streamCfg[i]));
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::clientFlattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo info) {
++    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d", __func__, pData, info.cameraId,
++           info.configMode);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetDataParams* params = static_cast<GraphGetDataParams*>(pData);
++    CLEAR(*params);
++
++    params->baseInfo = info;
++
++    return true;
++}
++
++bool IPCGraphConfig::serverUnflattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo* info) {
++    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
++
++    CheckError(!pData || !info, false, "@%s, pData or info is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetDataParams* params = static_cast<GraphGetDataParams*>(pData);
++    *info = params->baseInfo;
++
++    return true;
++}
++
++bool IPCGraphConfig::serverFlattenGetGraphData(void* pData, uint32_t size,
++                                               IGraphType::GraphConfigData graphData) {
++    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetDataParams* params = static_cast<GraphGetDataParams*>(pData);
++
++    params->mcId = graphData.mcId;
++    params->graphId = graphData.graphId;
++    params->gdcKernelId = graphData.gdcKernelId;
++
++    params->csiReso = graphData.csiReso;
++    params->gdcReso = graphData.gdcReso;
++
++    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d", __func__, params->mcId, params->graphId,
++           params->gdcKernelId);
++
++    params->streamIdNum = graphData.streamIds.size();
++    for (size_t i = 0; i < graphData.streamIds.size(); ++i) {
++        params->streamIdData[i] = graphData.streamIds[i];
++    }
++
++    params->pgInfoNum = graphData.pgInfo.size();
++    for (size_t i = 0; i < graphData.pgInfo.size(); ++i) {
++        size_t len = graphData.pgInfo[i].pgName.copy(params->pgInfoData[i].pgName, MAX_NAME_LENGTH);
++        params->pgInfoData[i].pgName[len] = '\0';
++        params->pgInfoData[i].pgId = graphData.pgInfo[i].pgId;
++        params->pgInfoData[i].streamId = graphData.pgInfo[i].streamId;
++        params->pgInfoData[i].rbmByte = graphData.pgInfo[i].rbmValue.rbm_bytes;
++
++        if (params->pgInfoData[i].rbmByte > 0) {
++            MEMCPY_S(params->pgInfoData[i].rbmData, MAX_NAME_LENGTH,
++                     graphData.pgInfo[i].rbmValue.rbm, graphData.pgInfo[i].rbmValue.rbm_bytes);
++        }
++    }
++
++    params->mBrInfoNum = graphData.mbrInfo.size();
++    for (size_t i = 0; i < graphData.mbrInfo.size(); ++i) {
++        params->mBrInfoData[i].streamId = graphData.mbrInfo[i].streamId;
++        params->mBrInfoData[i].mBrData = graphData.mbrInfo[i].data;
++    }
++
++    params->pgNamesNum = graphData.pgNames.size();
++    for (size_t i = 0; i < params->pgNamesNum; ++i) {
++        size_t len = graphData.pgNames[i].copy(params->pgNames[i], MAX_NAME_LENGTH);
++        params->pgNames[i][len] = '\0';
++    }
++
++    params->kernelArrayNum = graphData.programGroup.size();
++    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
++        params->kernelArray[i].streamId = graphData.programGroup[i].streamId;
++        ia_isp_bxt_program_group* pgPtr = graphData.programGroup[i].pgPtr;
++        params->kernelArray[i].group = *pgPtr;
++
++        for (unsigned int j = 0; j < params->kernelArray[i].group.kernel_count; ++j) {
++            params->kernelArray[i].runKernels[j] = pgPtr->run_kernels[j];
++            if (pgPtr->run_kernels[j].resolution_info) {
++                params->kernelArray[i].resoInfo[j] = *(pgPtr->run_kernels[j].resolution_info);
++                params->kernelArray[i].runKernels[j].resolution_info =
++                    &(params->kernelArray[i].resoInfo[j]);
++            } else {
++                params->kernelArray[i].runKernels[j].resolution_info = nullptr;
++            }
++
++            if (pgPtr->run_kernels[j].resolution_history) {
++                params->kernelArray[i].resoHistory[j] = *(pgPtr->run_kernels[j].resolution_history);
++                params->kernelArray[i].runKernels[j].resolution_history =
++                    &(params->kernelArray[i].resoHistory[j]);
++            } else {
++                params->kernelArray[i].runKernels[j].resolution_history = nullptr;
++            }
++        }
++        params->kernelArray[i].group.run_kernels = params->kernelArray[i].runKernels;
++
++        if (pgPtr->pipe) {
++            params->kernelArray[i].pipeInfo = *(pgPtr->pipe);
++            params->kernelArray[i].group.pipe = &(params->kernelArray[i].pipeInfo);
++        } else {
++            params->kernelArray[i].group.pipe = nullptr;
++        }
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::clientUnflattenGetGraphData(void* pData, uint32_t size,
++                                                 IGraphType::GraphConfigData* graphData) {
++    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
++
++    CheckError(!pData || !graphData, false, "@%s, pData or graphData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetDataParams* params = static_cast<GraphGetDataParams*>(pData);
++
++    graphData->mcId = params->mcId;
++    graphData->graphId = params->graphId;
++    graphData->gdcKernelId = params->gdcKernelId;
++
++    graphData->csiReso = params->csiReso;
++    graphData->gdcReso = params->gdcReso;
++
++    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d", __func__, params->mcId, params->graphId,
++           params->gdcKernelId);
++
++    for (size_t i = 0; i < params->streamIdNum; ++i) {
++        graphData->streamIds.push_back(params->streamIdData[i]);
++    }
++
++    for (size_t i = 0; i < params->pgInfoNum; ++i) {
++        IGraphType::PgInfo info;
++        info.pgName = params->pgInfoData[i].pgName;
++        info.pgId = params->pgInfoData[i].pgId;
++        info.streamId = params->pgInfoData[i].streamId;
++        if (params->pgInfoData[i].rbmByte > 0) {
++            info.rbmValue.rbm_bytes = params->pgInfoData[i].rbmByte;
++            info.rbmValue.rbm = params->pgInfoData[i].rbmData;
++        } else {
++            info.rbmValue.rbm = nullptr;
++            info.rbmValue.rbm_bytes = 0;
++        }
++        graphData->pgInfo.push_back(info);
++    }
++
++    for (size_t i = 0; i < params->mBrInfoNum; ++i) {
++        IGraphType::MbrInfo info;
++        info.streamId = params->mBrInfoData[i].streamId;
++        info.data = params->mBrInfoData[i].mBrData;
++        graphData->mbrInfo.push_back(info);
++    }
++
++    for (size_t i = 0; i < params->pgNamesNum; ++i) {
++        graphData->pgNames.push_back(params->pgNames[i]);
++    }
++
++    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
++        IGraphType::ProgramGroupInfo info;
++
++        info.streamId = params->kernelArray[i].streamId;
++        info.pgPtr = &(params->kernelArray[i].group);
++
++        info.pgPtr->run_kernels = params->kernelArray[i].runKernels;
++        for (unsigned j = 0; j < info.pgPtr->kernel_count; ++j) {
++            if (params->kernelArray[i].runKernels[j].resolution_info) {
++                info.pgPtr->run_kernels[j].resolution_info = &(params->kernelArray[i].resoInfo[j]);
++            } else {
++                info.pgPtr->run_kernels[j].resolution_info = nullptr;
++            }
++
++            if (params->kernelArray[i].runKernels[j].resolution_history) {
++                info.pgPtr->run_kernels[j].resolution_history =
++                    &(params->kernelArray[i].resoHistory[j]);
++            } else {
++                info.pgPtr->run_kernels[j].resolution_history = nullptr;
++            }
++        }
++
++        if (params->kernelArray[i].group.pipe) {
++            info.pgPtr->pipe = &(params->kernelArray[i].pipeInfo);
++        } else {
++            info.pgPtr->pipe = nullptr;
++        }
++
++        graphData->programGroup.push_back(info);
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::clientFlattenGetPgId(void* pData, uint32_t size, GraphBaseInfo info,
++                                          const int streamId, const int kernelId) {
++    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, streamId: %d, kernelId: %d",
++           __func__, pData, size, info.cameraId, info.configMode, streamId, kernelId);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetPgIdParams* params = static_cast<GraphGetPgIdParams*>(pData);
++    CLEAR(*params);
++
++    params->baseInfo = info;
++    params->streamId = streamId;
++    params->kernelId = kernelId;
++
++    return true;
++}
++
++bool IPCGraphConfig::serverUnFlattenGetPgId(void* pData, uint32_t size, GraphBaseInfo* info,
++                                            uint32_t* streamId, int32_t* kernelId) {
++    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
++    CheckError(!info || !streamId || !kernelId, false, "@%s, info, streamId or kernelId is nullptr",
++               __func__);
++
++    GraphGetPgIdParams* params = static_cast<GraphGetPgIdParams*>(pData);
++
++    *info = params->baseInfo;
++    *streamId = params->streamId;
++    *kernelId = params->kernelId;
++
++    return true;
++}
++
++bool IPCGraphConfig::serverFlattenGetPgId(void* pData, uint32_t size, int32_t pgId) {
++    LOGIPC("@%s, pData:%p, size:%u, pgId: %d", __func__, pData, size, pgId);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetPgIdParams* params = static_cast<GraphGetPgIdParams*>(pData);
++    params->pgId = pgId;
++
++    return true;
++}
++
++bool IPCGraphConfig::clientUnFlattenGetPgId(void* pData, uint32_t size, int32_t* pgId) {
++    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
++
++    CheckError(!pData || !pgId, false, "@%s, pData or pgId is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetPgIdParams* params = static_cast<GraphGetPgIdParams*>(pData);
++    *pgId = params->pgId;
++
++    return true;
++}
++
++bool IPCGraphConfig::clientFlattenGetConnection(void* pData, uint32_t size, GraphBaseInfo info,
++                                                const std::vector<std::string>& pgList) {
++    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, pgName size: %zu", __func__,
++           pData, size, info.cameraId, info.configMode, pgList.size());
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetConnectionParams* params = static_cast<GraphGetConnectionParams*>(pData);
++    CLEAR(*params);
++
++    params->baseInfo = info;
++    params->pgListNum = pgList.size();
++    for (size_t i = 0; i < pgList.size(); ++i) {
++        size_t len = pgList[i].copy(params->pgList[i], MAX_NAME_LENGTH);
++        params->pgList[i][len] = '\0';
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::serverUnFlattenGetConnection(void* pData, uint32_t size, GraphBaseInfo* info,
++                                                  std::vector<std::string>* pgList) {
++    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
++
++    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
++    CheckError(!pData || !info || !pgList, false, "@%s, pData, info or pgList is nullptr",
++               __func__);
++
++    GraphGetConnectionParams* params = static_cast<GraphGetConnectionParams*>(pData);
++
++    *info = params->baseInfo;
++    for (size_t i = 0; i < params->pgListNum; ++i) {
++        pgList->push_back(params->pgList[i]);
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::serverFlattenGetConnection(
++    void* pData, uint32_t size, const std::vector<IGraphType::ScalerInfo>& scalerInfo,
++    const std::vector<IGraphType::PipelineConnection>& confVector) {
++    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
++
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetConnectionParams* params = static_cast<GraphGetConnectionParams*>(pData);
++
++    params->connectionArraySize = confVector.size();
++    for (size_t i = 0; i < confVector.size(); ++i) {
++        params->connectionArray[i].connection = confVector[i];
++        if (params->connectionArray[i].connection.stream) {
++            params->connectionArray[i].stream = *(confVector[i].stream);
++        }
++    }
++
++    params->scalerInfoNum = scalerInfo.size();
++    for (size_t i = 0; i < scalerInfo.size(); ++i) {
++        params->scalerInfoArray[i] = scalerInfo[i];
++    }
++
++    return true;
++}
++
++bool IPCGraphConfig::clientUnFlattenGetConnection(
++    void* pData, uint32_t size, std::vector<IGraphType::ScalerInfo>* scalerInfo,
++    std::vector<IGraphType::PipelineConnection>* confVector) {
++    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
++
++    CheckError(!pData || !confVector, false, "@%s, pData or confVector is nullptr", __func__);
++    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
++
++    GraphGetConnectionParams* params = static_cast<GraphGetConnectionParams*>(pData);
++
++    for (size_t i = 0; i < params->connectionArraySize; ++i) {
++        if (params->connectionArray[i].connection.stream) {
++            params->connectionArray[i].connection.stream = &(params->connectionArray[i].stream);
++        }
++        confVector->push_back(params->connectionArray[i].connection);
++    }
++
++    for (size_t i = 0; i < params->scalerInfoNum; ++i) {
++        scalerInfo->push_back(params->scalerInfoArray[i]);
++    }
++
++    return true;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
+new file mode 100644
+index 000000000000..08fdce465fd1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
+@@ -0,0 +1,171 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++#include <vector>
++
++#include "modules/sandboxing/IPCCommon.h"
++#include "src/platformdata/gc/IGraphConfig.h"
++
++namespace icamera {
++
++#define MAX_STREAM (4)                             // Max stream number
++#define MAX_GRAPH_SETTINGS_SIZE (2 * 1024 * 1024)  // Max graph settings file size
++#define MAX_GRAPH_DESCRIPTOR_SIZE (512 * 1024)     // Max graph descriptor file size
++#define MAX_PG_NUMBER (10)                         // Max pg number
++#define MAX_NAME_LENGTH (128)                      // Max length for name
++#define MAX_CONNECTION_COUNT (64)                  // Max connection count
++#define MAX_STREAM_KERNEL_COUNT (500)              // Max kernels info per one stream
++
++struct GraphBaseInfo {
++    int cameraId;
++    ConfigMode configMode;
++
++    bool operator<(const GraphBaseInfo& b) const {
++        return (cameraId < b.cameraId) ? true : (configMode < b.configMode ? true : false);
++    }
++};
++
++struct GraphPgInfo {
++    char pgName[MAX_NAME_LENGTH];
++    uint32_t pgId;
++    int streamId;
++    uint32_t rbmByte;
++    char rbmData[MAX_NAME_LENGTH];
++};
++
++struct GraphMbrInfo {
++    int32_t streamId;
++    ia_isp_bxt_gdc_limits mBrData;
++};
++
++struct GraphKernelArray {
++    int32_t streamId;
++    ia_isp_bxt_program_group group;
++    ia_isp_bxt_run_kernels_t runKernels[MAX_STREAM_KERNEL_COUNT];
++    ia_isp_bxt_resolution_info_t resoInfo[MAX_STREAM_KERNEL_COUNT];
++    ia_isp_bxt_resolution_info_t resoHistory[MAX_STREAM_KERNEL_COUNT];
++    ia_isp_bxt_pipe_t pipeInfo;
++};
++
++struct GraphParseParams {
++    int cameraId;
++    size_t gdSize;
++    char GD[MAX_GRAPH_DESCRIPTOR_SIZE];
++    size_t gsSize;
++    char GS[MAX_GRAPH_SETTINGS_SIZE];
++};
++
++struct GraphConfigStreamParams {
++    GraphBaseInfo baseInfo;
++    GraphSettingType type;
++    uint32_t streamNum;
++    HalStream streamCfg[MAX_STREAM];
++    stream_t streamPriv[MAX_STREAM];
++};
++
++struct GraphGetDataParams {
++    GraphBaseInfo baseInfo;
++
++    int mcId;
++    int graphId;
++    uint32_t gdcKernelId;
++
++    camera_resolution_t csiReso;
++    ia_isp_bxt_resolution_info_t gdcReso;
++
++    uint32_t streamIdNum;
++    int32_t streamIdData[MAX_STREAM];
++
++    uint32_t pgInfoNum;
++    GraphPgInfo pgInfoData[MAX_PG_NUMBER];
++
++    uint32_t mBrInfoNum;
++    GraphMbrInfo mBrInfoData[MAX_STREAM];
++
++    uint32_t pgNamesNum;
++    char pgNames[MAX_PG_NUMBER][MAX_NAME_LENGTH];
++
++    uint32_t kernelArrayNum;
++    GraphKernelArray kernelArray[MAX_STREAM];
++};
++
++struct GraphGetPgIdParams {
++    GraphBaseInfo baseInfo;
++    uint32_t streamId;
++    int32_t kernelId;
++    int32_t pgId;
++};
++
++struct GraphConnection {
++    IGraphType::PipelineConnection connection;
++    HalStream stream;
++};
++
++struct GraphGetConnectionParams {
++    GraphBaseInfo baseInfo;
++    uint32_t pgListNum;
++    char pgList[MAX_PG_NUMBER][MAX_NAME_LENGTH];
++    uint32_t connectionArraySize;
++    GraphConnection connectionArray[MAX_CONNECTION_COUNT];
++    uint32_t scalerInfoNum;
++    IGraphType::ScalerInfo scalerInfoArray[MAX_STREAM];
++};
++
++class IPCGraphConfig {
++ public:
++    IPCGraphConfig();
++    virtual ~IPCGraphConfig();
++
++    bool clientFlattenParse(void* pData, uint32_t size, int cameraId, const char* graphDescFile,
++                            const char* settingsFile);
++    bool serverUnflattenParse(void* pData, uint32_t size, GraphParseParams** parseParam);
++    bool clientFlattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo info,
++                                    GraphSettingType type, const std::vector<HalStream*>& streams);
++    bool serverUnflattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo* info,
++                                      GraphSettingType* type, std::vector<HalStream*>* streams);
++    bool clientFlattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo info);
++    bool serverUnflattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo* info);
++    bool serverFlattenGetGraphData(void* pData, uint32_t size,
++                                   IGraphType::GraphConfigData graphData);
++    bool clientUnflattenGetGraphData(void* pData, uint32_t size,
++                                     IGraphType::GraphConfigData* graphData);
++    bool clientFlattenGetPgId(void* pData, uint32_t size, GraphBaseInfo info, const int streamId,
++                              const int kernelId);
++    bool serverUnFlattenGetPgId(void* pData, uint32_t size, GraphBaseInfo* info, uint32_t* streamId,
++                                int32_t* kernelId);
++    bool serverFlattenGetPgId(void* pData, uint32_t size, int32_t pgId);
++    bool clientUnFlattenGetPgId(void* pData, uint32_t size, int32_t* pgId);
++    bool clientFlattenGetConnection(void* pData, uint32_t size, GraphBaseInfo info,
++                                    const std::vector<std::string>& pgList);
++    bool serverUnFlattenGetConnection(void* pData, uint32_t size, GraphBaseInfo* info,
++                                      std::vector<std::string>* pgList);
++    bool serverFlattenGetConnection(void* pData, uint32_t size,
++                                    const std::vector<IGraphType::ScalerInfo>& scalerInfo,
++                                    const std::vector<IGraphType::PipelineConnection>& confVector);
++    bool clientUnFlattenGetConnection(void* pData, uint32_t size,
++                                      std::vector<IGraphType::ScalerInfo>* scalerInfo,
++                                      std::vector<IGraphType::PipelineConnection>* confVector);
++
++ private:
++    status_t readDataFromXml(const char* fileName, char* dataPtr, size_t* dataSize, int maxSize);
++
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(IPCGraphConfig);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
+new file mode 100644
+index 000000000000..b532e3b90b28
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
+@@ -0,0 +1,1121 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPCIntelAiq"
++
++#include "modules/sandboxing/IPCIntelAiq.h"
++
++#include <ia_types.h>
++
++namespace icamera {
++IPCIntelAiq::IPCIntelAiq() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelAiq::~IPCIntelAiq() {
++    LOGIPC("@%s", __func__);
++}
++
++// init
++bool IPCIntelAiq::clientFlattenInit(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                                    const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                                    unsigned int statsMaxHeight, unsigned int maxNumStatsIn,
++                                    uintptr_t cmc, uintptr_t mkn, uint8_t* pData,
++                                    unsigned int size) {
++    LOGIPC("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++
++    uint8_t* ptr = pData;
++    memset(ptr, 0, size);
++
++    aiq_init_params* params = reinterpret_cast<aiq_init_params*>(ptr);
++    params->aiqb_size = aiqbData ? aiqbData->size : 0;
++    params->nvm_size = nvmData ? nvmData->size : 0;
++    params->aiqd_size = aiqdData ? aiqdData->size : 0;
++    params->stats_max_width = statsMaxWidth;
++    params->stats_max_height = statsMaxHeight;
++    params->max_num_stats_in = maxNumStatsIn;
++    params->ia_mkn = mkn;
++    params->cmcRemoteHandle = cmc;
++
++    ptr += sizeof(aiq_init_params);
++    if (aiqbData) {
++        MEMCPY_S(ptr, aiqbData->size, aiqbData->data, aiqbData->size);
++    }
++
++    ptr += params->aiqb_size;
++    if (nvmData) {
++        MEMCPY_S(ptr, nvmData->size, nvmData->data, nvmData->size);
++    }
++
++    ptr += params->nvm_size;
++    if (aiqdData) {
++        MEMCPY_S(ptr, aiqdData->size, aiqdData->data, aiqdData->size);
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenInit(const void* pData, int dataSize, ia_binary_data* aiqbData,
++                                      ia_binary_data* nvmData, ia_binary_data* aiqdData) {
++    LOGIPC("@%s, pData:%p, dataSize:%d, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, pData,
++           dataSize, aiqbData, nvmData, aiqdData);
++    CheckError(dataSize < sizeof(aiq_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
++    CheckError(!nvmData, false, "@%s, nvmData is nullptr", __func__);
++    CheckError(!aiqdData, false, "@%s, aiqdData is nullptr", __func__);
++
++    const aiq_init_params* params = static_cast<const aiq_init_params*>(pData);
++
++    LOGIPC("@%s, aiqb_size:%d, nvm_size:%d, aiqd_size:%d", __func__, params->aiqb_size,
++           params->nvm_size, params->aiqd_size);
++
++    int totalMemSize =
++        sizeof(aiq_init_params) + params->aiqb_size + params->nvm_size + params->aiqd_size;
++    CheckError(dataSize < totalMemSize, false, "@%s, dataSize:%d is too small", __func__, dataSize);
++
++    const aiq_init_params* p = static_cast<const aiq_init_params*>(pData) + 1;
++    uint8_t* ptr = reinterpret_cast<uint8_t*>(const_cast<aiq_init_params*>(p));
++    aiqbData->size = params->aiqb_size;
++    aiqbData->data = aiqbData->size > 0 ? ptr : nullptr;
++
++    ptr += params->aiqb_size;
++    nvmData->size = params->nvm_size;
++    nvmData->data = nvmData->size > 0 ? ptr : nullptr;
++
++    ptr += params->nvm_size;
++    aiqdData->size = params->aiqd_size;
++    aiqdData->data = aiqdData->size > 0 ? ptr : nullptr;
++
++    return true;
++}
++
++// ae
++bool IPCIntelAiq::clientFlattenAe(uintptr_t aiq, const ia_aiq_ae_input_params& inParams,
++                                  ae_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++
++    params->base = inParams;
++    const ia_aiq_ae_input_params* base = &params->base;
++
++    if (base->aec_features) {
++        params->aec_features = *inParams.aec_features;
++    }
++
++    if (base->exposure_coordinate) {
++        params->exposure_coordinate = *inParams.exposure_coordinate;
++    }
++
++    if (base->exposure_window) {
++        params->exposure_window = *inParams.exposure_window;
++    }
++
++    if (inParams.num_exposures > 1) {
++        LOGE("@%s, BUG: num_exposures:%d > 1. Copying only first.", __func__,
++             inParams.num_exposures);
++    }
++
++    if (base->sensor_descriptor) {
++        params->sensor_descriptor = *inParams.sensor_descriptor;
++    }
++
++    if (base->manual_exposure_time_us) {
++        params->manual_exposure_time_us = *inParams.manual_exposure_time_us;
++    }
++
++    if (base->manual_analog_gain) {
++        params->manual_analog_gain = *inParams.manual_analog_gain;
++    }
++
++    if (base->manual_iso) {
++        params->manual_iso = *inParams.manual_iso;
++    }
++
++    if (base->manual_limits) {
++        params->manual_limits = *inParams.manual_limits;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenAe(ae_run_params* inParams, ia_aiq_ae_input_params** params) {
++    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
++    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_ae_input_params* base = &inParams->base;
++    if (base->aec_features) {
++        base->aec_features = &inParams->aec_features;
++    }
++
++    if (base->exposure_coordinate) {
++        base->exposure_coordinate = &inParams->exposure_coordinate;
++    }
++
++    if (base->exposure_window) {
++        base->exposure_window = &inParams->exposure_window;
++    }
++
++    if (base->sensor_descriptor) {
++        base->sensor_descriptor = &inParams->sensor_descriptor;
++    }
++
++    if (base->manual_exposure_time_us) {
++        base->manual_exposure_time_us = &inParams->manual_exposure_time_us;
++    }
++
++    if (base->manual_analog_gain) {
++        base->manual_analog_gain = &inParams->manual_analog_gain;
++    }
++
++    if (base->manual_iso) {
++        base->manual_iso = &inParams->manual_iso;
++    }
++
++    if (base->manual_limits) {
++        base->manual_limits = &inParams->manual_limits;
++    }
++
++    *params = base;
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results) {
++    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    ae_run_params_results* res = &params->res;
++    bool ret = unflattenAeResults(res);
++    CheckError((ret == false), false, "@%s, unflattenAeResults fails", __func__);
++
++    *results = &res->base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    bool ret = flattenAeResults(aeResults, &params->res);
++    CheckError(ret == false, false, "@%s, flattenAeResults fails", __func__);
++
++    return true;
++}
++
++bool IPCIntelAiq::flattenAeResults(const ia_aiq_ae_results& aeResults, ae_run_params_results* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    res->base = aeResults;
++    const ia_aiq_ae_results* base = &res->base;
++
++    if (base->exposures && base->num_exposures > 0) {
++        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
++                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
++
++        for (unsigned int i = 0; i < base->num_exposures; i++) {
++            res->exposures[i] = aeResults.exposures[i];
++
++            if (res->exposures[i].exposure) {
++                res->exposure[i] = *aeResults.exposures[i].exposure;
++            }
++            if (res->exposures[i].sensor_exposure) {
++                res->sensor_exposure[i] = *aeResults.exposures[i].sensor_exposure;
++            }
++            if (res->exposures[i].exposure_plan_ids) {
++                CheckError(base->exposures->num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS, false,
++                           "@%s, base->exposures->num_exposure_plan:% is too big", __func__,
++                           base->exposures->num_exposure_plan);
++                MEMCPY_S(res->exposure_plan_ids[i],
++                         sizeof(unsigned int) * MAX_NUM_OF_EXPOSURE_PLANS,
++                         aeResults.exposures[i].exposure_plan_ids,
++                         sizeof(unsigned int) * aeResults.exposures[i].num_exposure_plan);
++            }
++        }
++    }
++
++    if (base->weight_grid) {
++        res->weight_grid = *aeResults.weight_grid;
++
++        if (res->weight_grid.weights) {
++            unsigned int gridElements =
++                aeResults.weight_grid->width * aeResults.weight_grid->height;
++            gridElements = CLIP(gridElements, MAX_SIZE_WEIGHT_GRID, 1);
++            MEMCPY_S(res->weights, sizeof(res->weights), aeResults.weight_grid->weights,
++                     gridElements * sizeof(unsigned char));
++        }
++    }
++
++    if (base->flashes) {
++        // Valgrind will give warning from here in the first round. It should be fine.
++        if (aeResults.num_flashes > 0) {
++            MEMCPY_S(res->flashes, sizeof(res->flashes), aeResults.flashes,
++                     MAX_NUM_FLASHES * sizeof(ia_aiq_flash_parameters));
++        }
++    }
++
++    if (base->aperture_control) {
++        res->aperture_control = *aeResults.aperture_control;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::unflattenAeResults(ae_run_params_results* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    ia_aiq_ae_results* base = &res->base;
++
++    if (base->exposures) {
++        base->exposures = res->exposures;
++
++        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
++                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
++
++        for (unsigned int i = 0; i < base->num_exposures; i++) {
++            if (base->exposures[i].exposure) {
++                base->exposures[i].exposure = &res->exposure[i];
++            }
++            if (base->exposures[i].sensor_exposure) {
++                base->exposures[i].sensor_exposure = &res->sensor_exposure[i];
++            }
++            if (base->exposures[i].exposure_plan_ids) {
++                base->exposures[i].exposure_plan_ids = res->exposure_plan_ids[i];
++            }
++        }
++    }
++
++    if (base->weight_grid) {
++        base->weight_grid = &res->weight_grid;
++        if (base->weight_grid->weights) {
++            base->weight_grid->weights = res->weights;
++        }
++    }
++
++    if (base->flashes) {
++        base->flashes = res->flashes;
++    }
++
++    if (base->aperture_control) {
++        base->aperture_control = &res->aperture_control;
++    }
++
++    return true;
++}
++
++// af
++bool IPCIntelAiq::clientFlattenAf(uintptr_t aiq, const ia_aiq_af_input_params& inParams,
++                                  af_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++
++    params->base = inParams;
++    ia_aiq_af_input_params* base = &params->base;
++    if (base->focus_rect) {
++        params->focus_rect = *inParams.focus_rect;
++    }
++    if (base->manual_focus_parameters) {
++        params->manual_focus_parameters = *inParams.manual_focus_parameters;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results) {
++    LOGIPC("@%s, results:%p", __func__, results);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    *results = const_cast<ia_aiq_af_results*>(&params.results);
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenAf(af_run_params* inParams, ia_aiq_af_input_params** params) {
++    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
++    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_af_input_params* base = &inParams->base;
++    if (base->focus_rect) {
++        base->focus_rect = &inParams->focus_rect;
++    }
++    if (base->manual_focus_parameters) {
++        base->manual_focus_parameters = &inParams->manual_focus_parameters;
++    }
++
++    *params = base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_af_results* results = &params->results;
++    *results = afResults;
++
++    LOGIPC("af results->status:%d", results->status);
++    LOGIPC("af results->current_focus_distance:%d", results->current_focus_distance);
++    LOGIPC("af results->next_lens_position:%d", results->next_lens_position);
++    LOGIPC("af results->lens_driver_action:%d", results->lens_driver_action);
++    LOGIPC("af results->use_af_assist:%d", results->use_af_assist);
++    LOGIPC("af results->final_lens_position_reached:%d", results->final_lens_position_reached);
++
++    return true;
++}
++
++// awb
++bool IPCIntelAiq::clientFlattenAwb(uintptr_t aiq, const ia_aiq_awb_input_params& inParams,
++                                   awb_run_params* params) {
++    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++
++    params->base = inParams;
++    const ia_aiq_awb_input_params* base = &params->base;
++
++    if (base->manual_cct_range) {
++        params->manual_cct_range = *inParams.manual_cct_range;
++    }
++
++    if (base->manual_white_coordinate) {
++        params->manual_white_coordinate = *inParams.manual_white_coordinate;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenAwb(const awb_run_params& inParams, ia_aiq_awb_results** results) {
++    LOGIPC("@%s, results:%p", __func__, results);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    *results = const_cast<ia_aiq_awb_results*>(&inParams.results);
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenAwb(awb_run_params* inParams, ia_aiq_awb_input_params** params) {
++    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
++    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_awb_input_params* base = &inParams->base;
++
++    if (base->manual_cct_range) {
++        base->manual_cct_range = &inParams->manual_cct_range;
++    }
++
++    if (base->manual_white_coordinate) {
++        base->manual_white_coordinate = &inParams->manual_white_coordinate;
++    }
++
++    LOGIPC("@%s, manual_cct_range:%p, manual_white_coordinate:%p", __func__, base->manual_cct_range,
++           base->manual_white_coordinate);
++
++    *params = base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_awb_results* results = &params->results;
++    *results = awbResults;
++
++    LOGIPC("awb results->accurate_r_per_g:%f", results->accurate_r_per_g);
++    LOGIPC("awb results->accurate_b_per_g:%f", results->accurate_b_per_g);
++    LOGIPC("awb results->final_r_per_g:%f", results->final_r_per_g);
++    LOGIPC("awb results->final_b_per_g:%f", results->final_b_per_g);
++    LOGIPC("awb results->cct_estimate:%d", results->cct_estimate);
++    LOGIPC("awb results->distance_from_convergence:%f", results->distance_from_convergence);
++
++    return true;
++}
++
++// gbce
++bool IPCIntelAiq::clientFlattenGbce(uintptr_t aiq, const ia_aiq_gbce_input_params& inParams,
++                                    gbce_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++    params->base = inParams;
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenGbce(gbce_run_params* params, ia_aiq_gbce_results** results) {
++    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    gbce_results_params* res = &params->res;
++    bool ret = unflattenGbceResults(res);
++    CheckError(!ret, false, "@%s, unflattenGbceResults fails", __func__);
++
++    *results = &res->base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenGbce(const ia_aiq_gbce_results& gbceResults,
++                                    gbce_run_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    return flattenGbceResults(gbceResults, &params->res);
++}
++
++bool IPCIntelAiq::flattenGbceResults(const ia_aiq_gbce_results& gbceResults,
++                                     gbce_results_params* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    size_t size = gbceResults.gamma_lut_size * sizeof(*gbceResults.g_gamma_lut);
++    LOGIPC("@%s, gamma_lut_size:%d, size:%zu, tone_map_lut_size:%d", __func__,
++           gbceResults.gamma_lut_size, size, gbceResults.tone_map_lut_size);
++
++    res->base = gbceResults;
++
++    const ia_aiq_gbce_results* base = &res->base;
++
++    if (base->r_gamma_lut) {
++        MEMCPY_S(res->r_gamma_lut, sizeof(res->r_gamma_lut), gbceResults.r_gamma_lut, size);
++    }
++
++    if (base->b_gamma_lut) {
++        MEMCPY_S(res->b_gamma_lut, sizeof(res->b_gamma_lut), gbceResults.b_gamma_lut, size);
++    }
++
++    if (base->g_gamma_lut) {
++        MEMCPY_S(res->g_gamma_lut, sizeof(res->g_gamma_lut), gbceResults.g_gamma_lut, size);
++    }
++
++    if (base->tone_map_lut) {
++        MEMCPY_S(res->tone_map_lut, sizeof(res->tone_map_lut), gbceResults.tone_map_lut,
++                 gbceResults.tone_map_lut_size * sizeof(*gbceResults.tone_map_lut));
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::unflattenGbceResults(gbce_results_params* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    ia_aiq_gbce_results* base = &res->base;
++
++    LOGIPC("@%s, gamma_lut_size:%d", __func__, base->gamma_lut_size);
++    LOGIPC("@%s, tone_map_lut_size:%d", __func__, base->tone_map_lut_size);
++    CheckError(base->gamma_lut_size > MAX_NUM_GAMMA_LUTS, false,
++               "@%s, gamma_lut_size:%d is too big", __func__, base->gamma_lut_size);
++    CheckError((base->tone_map_lut_size > MAX_NUM_TOME_MAP_LUTS), false,
++               "@%s, tone_map_lut_size:%d is too big", __func__, base->tone_map_lut_size);
++
++    if (base->r_gamma_lut) {
++        base->r_gamma_lut = res->r_gamma_lut;
++    }
++
++    if (base->b_gamma_lut) {
++        base->b_gamma_lut = res->b_gamma_lut;
++    }
++
++    if (base->g_gamma_lut) {
++        base->g_gamma_lut = res->g_gamma_lut;
++    }
++
++    if (base->tone_map_lut) {
++        base->tone_map_lut = res->tone_map_lut;
++    }
++
++    return true;
++}
++
++// pa
++bool IPCIntelAiq::clientFlattenPaV1(uintptr_t aiq, const ia_aiq_pa_input_params& inParams,
++                                    pa_run_v1_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++
++    params->base = inParams;
++    ia_aiq_pa_input_params* base = &params->base;
++
++    if (base->awb_results) {
++        params->awb_results = *base->awb_results;
++    }
++
++    if (base->exposure_params) {
++        params->exposure_params = *base->exposure_params;
++    }
++
++    if (base->color_gains) {
++        params->color_gains = *base->color_gains;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenPaV1(pa_run_v1_params* params, ia_aiq_pa_results_v1** results) {
++    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    pa_run_params_results_v1* res = &params->res;
++    bool ret = unflattenPaResultsV1(res);
++    CheckError((ret == false), false, "@%s, unflattenPaResultsV1 fails", __func__);
++
++    *results = &res->base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenPaV1(pa_run_v1_params* inParams, ia_aiq_pa_input_params** params) {
++    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
++    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_pa_input_params* base = &inParams->base;
++
++    if (base->awb_results) {
++        base->awb_results = &inParams->awb_results;
++    }
++
++    if (base->exposure_params) {
++        base->exposure_params = &inParams->exposure_params;
++    }
++
++    if (base->color_gains) {
++        base->color_gains = &inParams->color_gains;
++    }
++
++    *params = base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults,
++                                    pa_run_v1_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    bool ret = flattenPaResultsV1(paResults, &params->res);
++    CheckError(ret == false, false, "@%s, flattenPaResultsV1 fails", __func__);
++
++    return true;
++}
++
++bool IPCIntelAiq::flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults,
++                                     pa_run_params_results_v1* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    res->base = paResults;
++    ia_aiq_pa_results_v1* base = &res->base;
++
++    ia_aiq_color_channels_lut* linearization = &base->linearization;
++    CheckError((MAX_NUM_LUTS < linearization->size), false, "@%s, linearization:%d is too big",
++               __func__, linearization->size);
++    if (linearization->gr) {
++        MEMCPY_S(res->gr, sizeof(res->gr), linearization->gr,
++                 sizeof(*linearization->gr) * linearization->size);
++    }
++    if (linearization->r) {
++        MEMCPY_S(res->r, sizeof(res->r), linearization->r,
++                 sizeof(*linearization->r) * linearization->size);
++    }
++    if (linearization->b) {
++        MEMCPY_S(res->b, sizeof(res->b), linearization->b,
++                 sizeof(*linearization->b) * linearization->size);
++    }
++    if (linearization->gb) {
++        MEMCPY_S(res->gb, sizeof(res->gb), linearization->gb,
++                 sizeof(*linearization->gb) * linearization->size);
++    }
++
++    ia_aiq_advanced_ccm_t* preferred_acm = base->preferred_acm;
++    if (preferred_acm) {
++        CheckError((MAX_SECTOR_COUNT < preferred_acm->sector_count), false,
++                   "@%s, sector_count:%d is too big", __func__, preferred_acm->sector_count);
++
++        res->preferred_acm = *preferred_acm;
++
++        if (preferred_acm->hue_of_sectors) {
++            MEMCPY_S(res->hue_of_sectors, sizeof(res->hue_of_sectors),
++                     preferred_acm->hue_of_sectors,
++                     sizeof(*preferred_acm->hue_of_sectors) * preferred_acm->sector_count);
++        }
++
++        if (preferred_acm->advanced_color_conversion_matrices) {
++            MEMCPY_S(res->advanced_color_conversion_matrices,
++                     sizeof(res->advanced_color_conversion_matrices),
++                     preferred_acm->advanced_color_conversion_matrices,
++                     (sizeof(*preferred_acm->advanced_color_conversion_matrices) *
++                      preferred_acm->sector_count));
++        }
++    }
++
++    ia_aiq_ir_weight_t* ir_weight = base->ir_weight;
++    if (ir_weight) {
++        res->ir_weight = *ir_weight;
++
++        if (ir_weight->ir_weight_grid_R) {
++            MEMCPY_S(res->ir_weight_grid_R, sizeof(res->ir_weight_grid_R),
++                     ir_weight->ir_weight_grid_R,
++                     sizeof(*ir_weight->ir_weight_grid_R) * ir_weight->height * ir_weight->width);
++        }
++
++        if (ir_weight->ir_weight_grid_G) {
++            MEMCPY_S(res->ir_weight_grid_G, sizeof(res->ir_weight_grid_G),
++                     ir_weight->ir_weight_grid_G,
++                     sizeof(*ir_weight->ir_weight_grid_G) * ir_weight->height * ir_weight->width);
++        }
++
++        if (ir_weight->ir_weight_grid_B) {
++            MEMCPY_S(res->ir_weight_grid_B, sizeof(res->ir_weight_grid_B),
++                     ir_weight->ir_weight_grid_B,
++                     sizeof(*ir_weight->ir_weight_grid_B) * ir_weight->height * ir_weight->width);
++        }
++    }
++
++    ia_aiq_rgbir_t* rgbir = base->rgbir;
++    if (rgbir) {
++        res->rgbir = *rgbir;
++
++        CheckError(rgbir->n_models > MAX_NUM_IR_MODES, false, "@%s, rgbir->n_models:%d is too big",
++                   __func__, rgbir->n_models);
++
++        if (rgbir->models && rgbir->n_models > 0) {
++            for (unsigned int i = 0; i < rgbir->n_models; i++) {
++                res->models[i] = rgbir->models[i];
++            }
++        }
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::unflattenPaResultsV1(pa_run_params_results_v1* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    ia_aiq_pa_results_v1* base = &res->base;
++
++    if (base->linearization.gr) {
++        base->linearization.gr = res->gr;
++    }
++    if (base->linearization.r) {
++        base->linearization.r = res->r;
++    }
++    if (base->linearization.b) {
++        base->linearization.b = res->b;
++    }
++    if (base->linearization.gb) {
++        base->linearization.gb = res->gb;
++    }
++
++    if (base->preferred_acm) {
++        base->preferred_acm = &res->preferred_acm;
++
++        if (base->preferred_acm->hue_of_sectors) {
++            base->preferred_acm->hue_of_sectors = res->hue_of_sectors;
++        }
++
++        if (base->preferred_acm->advanced_color_conversion_matrices) {
++            base->preferred_acm->advanced_color_conversion_matrices =
++                static_cast<float(*)[3][3]>(res->advanced_color_conversion_matrices);
++        }
++    }
++
++    if (base->ir_weight) {
++        base->ir_weight = &res->ir_weight;
++
++        if (base->ir_weight->ir_weight_grid_R) {
++            base->ir_weight->ir_weight_grid_R = res->ir_weight_grid_R;
++        }
++        if (base->ir_weight->ir_weight_grid_G) {
++            base->ir_weight->ir_weight_grid_G = res->ir_weight_grid_G;
++        }
++        if (base->ir_weight->ir_weight_grid_B) {
++            base->ir_weight->ir_weight_grid_B = res->ir_weight_grid_B;
++        }
++    }
++
++    if (base->rgbir) {
++        base->rgbir = &res->rgbir;
++
++        ia_aiq_rgbir_t* resRgbir = &res->rgbir;
++        if (resRgbir->models && resRgbir->n_models > 0) {
++            resRgbir->models = res->models;
++        }
++    }
++
++    return true;
++}
++
++// sa
++bool IPCIntelAiq::clientFlattenSaV2(uintptr_t aiq, const ia_aiq_sa_input_params_v1& inParams,
++                                    sa_run_v2_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->aiq_handle = aiq;
++
++    params->base = inParams;
++    const ia_aiq_sa_input_params_v1* base = &params->base;
++
++    if (base->sensor_frame_params) {
++        params->sensor_frame_params = *inParams.sensor_frame_params;
++    }
++
++    if (base->awb_results) {
++        params->awb_results = *inParams.awb_results;
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::clientUnflattenSaV2(sa_run_v2_params* params, ia_aiq_sa_results_v1** results) {
++    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!results, false, "@%s, results is nullptr", __func__);
++
++    sa_run_v2_params_results* res = &params->res;
++    bool ret = unflattenSaResultsV2(res);
++    CheckError(ret == false, false, "@%s, unflattenSaResultsV2 fails", __func__);
++
++    *results = &res->base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenSaV2(const sa_run_v2_params& inParams,
++                                      ia_aiq_sa_input_params_v1** params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    ia_aiq_sa_input_params_v1* base = const_cast<ia_aiq_sa_input_params_v1*>(&inParams.base);
++
++    if (base->sensor_frame_params) {
++        base->sensor_frame_params = const_cast<ia_aiq_frame_params*>(&inParams.sensor_frame_params);
++    }
++
++    if (base->awb_results) {
++        base->awb_results = const_cast<ia_aiq_awb_results*>(&inParams.awb_results);
++    }
++
++    *params = base;
++
++    return true;
++}
++
++bool IPCIntelAiq::serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults,
++                                    sa_run_v2_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, results is nullptr", __func__);
++
++    bool ret = flattenSaResultsV2(saResults, &params->res);
++    CheckError(ret == false, false, "@%s, flattenSaResultsV2 fails", __func__);
++
++    return true;
++}
++
++bool IPCIntelAiq::flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults,
++                                     sa_run_v2_params_results* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    res->base = saResults;
++    ia_aiq_sa_results_v1* base = &res->base;
++
++    LOGIPC("sa_results: width:%d, height:%d, lsc_update:%d", base->width, base->height,
++           base->lsc_update);
++
++    if (base->width && base->height) {
++        size_t size = base->width * base->height * sizeof(unsigned short);
++        for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
++            for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
++                lsc_grid_content* lgc = &res->lsc_grid[i][j];
++                if (base->lsc_grid[i][j]) {
++                    MEMCPY_S(lgc->content, sizeof(lgc->content), base->lsc_grid[i][j], size);
++                }
++            }
++        }
++    } else if (base->lsc_update) {
++        LOGE("@%s, Error: LSC table size is 0", __func__);
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::unflattenSaResultsV2(sa_run_v2_params_results* res) {
++    LOGIPC("@%s, res:%p", __func__, res);
++    CheckError(!res, false, "@%s, res is nullptr", __func__);
++
++    ia_aiq_sa_results_v1* base = &res->base;
++
++    LOGIPC("sa_results_data:height:%d, width:%d", base->height, base->width);
++
++    for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
++        for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
++            lsc_grid_content* lgc = &res->lsc_grid[i][j];
++            base->lsc_grid[i][j] = lgc->content;
++        }
++    }
++
++    return true;
++}
++
++// statistics
++bool IPCIntelAiq::clientFlattenStatSetV4(uintptr_t aiq,
++                                         const ia_aiq_statistics_input_params_v4& inParams,
++                                         set_statistics_set_v4_params* params) {
++    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
++    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false, "@%s, aiq is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->ia_aiq = aiq;
++
++    set_statistics_params_data* input = &params->input;
++    input->base = inParams;
++    ia_aiq_statistics_input_params_v4* base = &input->base;
++
++    if (base->frame_ae_parameters) {
++        flattenAeResults(*base->frame_ae_parameters, &input->frame_ae_parameters);
++    }
++
++    if (base->frame_af_parameters) {
++        input->frame_af_parameters = *base->frame_af_parameters;
++    }
++
++    if (base->rgbs_grids) {
++        CheckError((base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS), false,
++                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d", __func__,
++                   base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
++
++        for (int i = 0; i < MAX_NUMBER_OF_GRIDS; i++) {
++            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
++            rgbs_grids->base = *base->rgbs_grids[i];
++
++            CheckError(rgbs_grids->base.grid_width * rgbs_grids->base.grid_height > MAX_NUM_BLOCKS,
++                       false, "@%s, grid_width:%d * grid_height:%d is too big", __func__,
++                       rgbs_grids->base.grid_width, rgbs_grids->base.grid_height);
++
++            MEMCPY_S(rgbs_grids->blocks_ptr, sizeof(rgbs_grids->blocks_ptr),
++                     rgbs_grids->base.blocks_ptr,
++                     rgbs_grids->base.grid_width * rgbs_grids->base.grid_height *
++                         sizeof(*rgbs_grids->base.blocks_ptr));
++        }
++    }
++
++    if (base->hdr_rgbs_grid) {
++        ia_aiq_hdr_rgbs_grid_data* hdr_rgbs_grid = &input->hdr_rgbs_grid;
++        hdr_rgbs_grid->base = *base->hdr_rgbs_grid;
++        MEMCPY_S(hdr_rgbs_grid->blocks_ptr, sizeof(hdr_rgbs_grid->blocks_ptr),
++                 hdr_rgbs_grid->base.blocks_ptr,
++                 hdr_rgbs_grid->base.grid_width * hdr_rgbs_grid->base.grid_height *
++                     sizeof(*hdr_rgbs_grid->base.blocks_ptr));
++    }
++
++    if (base->af_grids) {
++        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
++                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d", __func__, base->num_af_grids,
++                   MAX_NUMBER_OF_AF_GRIDS);
++
++        for (int i = 0; i < MAX_NUMBER_OF_AF_GRIDS; i++) {
++            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
++            af_grids->base = *base->af_grids[i];
++            MEMCPY_S(af_grids->filter_response_1, sizeof(af_grids->filter_response_1),
++                     af_grids->base.filter_response_1,
++                     af_grids->base.grid_width * af_grids->base.grid_height *
++                         sizeof(*af_grids->base.filter_response_1));
++            MEMCPY_S(af_grids->filter_response_2, sizeof(af_grids->filter_response_2),
++                     af_grids->base.filter_response_2,
++                     af_grids->base.grid_width * af_grids->base.grid_height *
++                         sizeof(*af_grids->base.filter_response_2));
++        }
++    }
++
++    if (base->frame_pa_parameters) {
++        flattenPaResultsV1(*base->frame_pa_parameters, &input->frame_pa_parameters);
++    }
++
++    if (base->faces) {
++        input->faces.base = *base->faces;
++        for (int i = 0; i < base->faces->num_faces; i++) {
++            input->faces.faces[i] = *(base->faces->faces + i);
++        }
++    }
++
++    if (base->awb_results) {
++        input->awb_results = *base->awb_results;
++    }
++
++    if (base->frame_sa_parameters) {
++        flattenSaResultsV2(*base->frame_sa_parameters, &input->frame_sa_parameters);
++    }
++
++    if (base->depth_grids) {
++        CheckError(base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS, false,
++                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d", __func__,
++                   base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
++
++        for (int i = 0; i < MAX_NUMBER_OF_DEPTH_GRIDS; i++) {
++            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
++            depth_grids->base = *base->depth_grids[i];
++            MEMCPY_S(depth_grids->grid_rect, sizeof(depth_grids->grid_rect),
++                     depth_grids->base.grid_rect,
++                     depth_grids->base.grid_height * depth_grids->base.grid_width *
++                         sizeof(*depth_grids->base.grid_rect));
++            MEMCPY_S(depth_grids->depth_data, sizeof(depth_grids->depth_data),
++                     depth_grids->base.depth_data,
++                     depth_grids->base.grid_height * depth_grids->base.grid_width *
++                         sizeof(*depth_grids->base.depth_data));
++            MEMCPY_S(depth_grids->confidence, sizeof(depth_grids->confidence),
++                     depth_grids->base.confidence,
++                     depth_grids->base.grid_height * depth_grids->base.grid_width *
++                         sizeof(*depth_grids->base.confidence));
++        }
++    }
++
++    if (base->ir_grid) {
++        input->ir_grid = *base->ir_grid;
++        MEMCPY_S(input->ir_grid_data, MAX_IR_WEIGHT_GRID_DATA_SIZE * sizeof(unsigned short),
++                 base->ir_grid->data,
++                 base->ir_grid->width * base->ir_grid->height * sizeof(unsigned short));
++    }
++
++    return true;
++}
++
++bool IPCIntelAiq::serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
++                                           ia_aiq_statistics_input_params_v4** params) {
++    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
++    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    set_statistics_params_data* input = &inParams->input;
++    ia_aiq_statistics_input_params_v4* base = &input->base;
++
++    if (base->frame_ae_parameters) {
++        unflattenAeResults(&input->frame_ae_parameters);
++        base->frame_ae_parameters = &input->frame_ae_parameters.base;
++    }
++
++    if (base->frame_af_parameters) {
++        base->frame_af_parameters = &input->frame_af_parameters;
++    }
++
++    if (base->rgbs_grids) {
++        CheckError(base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS, false,
++                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d", __func__,
++                   base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
++
++        for (int i = 0; i < base->num_rgbs_grids; i++) {
++            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
++            rgbs_grids->base.blocks_ptr = rgbs_grids->blocks_ptr;
++
++            input->rgbs_grids_array[i] = &rgbs_grids->base;
++        }
++        base->rgbs_grids = (input->rgbs_grids_array);
++    }
++
++    if (base->hdr_rgbs_grid) {
++        input->hdr_rgbs_grid.base.blocks_ptr = input->hdr_rgbs_grid.blocks_ptr;
++        base->hdr_rgbs_grid = &input->hdr_rgbs_grid.base;
++    }
++
++    if (base->af_grids) {
++        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
++                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d", __func__, base->num_af_grids,
++                   MAX_NUMBER_OF_AF_GRIDS);
++
++        for (int i = 0; i < base->num_af_grids; i++) {
++            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
++            af_grids->base.filter_response_1 = af_grids->filter_response_1;
++            af_grids->base.filter_response_2 = af_grids->filter_response_2;
++
++            input->af_grids_array[i] = &af_grids->base;
++        }
++        base->af_grids = input->af_grids_array;
++    }
++
++    if (base->frame_pa_parameters) {
++        unflattenPaResultsV1(&input->frame_pa_parameters);
++        base->frame_pa_parameters = &input->frame_pa_parameters.base;
++    }
++
++    if (base->faces) {
++        input->faces.base.faces = input->faces.faces;
++        base->faces = &input->faces.base;
++    }
++
++    if (base->awb_results) {
++        base->awb_results = &input->awb_results;
++    }
++
++    if (base->frame_sa_parameters) {
++        unflattenSaResultsV2(&input->frame_sa_parameters);
++        base->frame_sa_parameters = &input->frame_sa_parameters.base;
++    }
++
++    if (base->depth_grids) {
++        CheckError((base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS), false,
++                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d", __func__,
++                   base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
++
++        for (int i = 0; i < base->num_depth_grids; i++) {
++            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
++            depth_grids->base.grid_rect = depth_grids->grid_rect;
++            depth_grids->base.depth_data = depth_grids->depth_data;
++            depth_grids->base.confidence = depth_grids->confidence;
++
++            input->depth_grids_array[i] = &depth_grids->base;
++        }
++        base->depth_grids = input->depth_grids_array;
++    }
++
++    if (base->ir_grid) {
++        input->ir_grid.data = input->ir_grid_data;
++        base->ir_grid = &input->ir_grid;
++    }
++
++    *params = base;
++
++    return true;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
+new file mode 100644
+index 000000000000..4b911b7b4b00
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
+@@ -0,0 +1,351 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_aiq.h>
++
++#include "FaceBase.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++struct aiq_init_params {
++    unsigned int aiqb_size;
++    unsigned int nvm_size;
++    unsigned int aiqd_size;
++    unsigned int stats_max_width;
++    unsigned int stats_max_height;
++    unsigned int max_num_stats_in;
++    uintptr_t ia_mkn;
++    uintptr_t cmcRemoteHandle;
++    uintptr_t results;
++};
++
++struct aiq_deinit_params {
++    uintptr_t aiq_handle;
++};
++
++struct af_run_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_af_input_params base;
++    ia_rectangle focus_rect;
++    ia_aiq_manual_focus_parameters manual_focus_parameters;
++
++    ia_aiq_af_results results;
++};
++
++#define MAX_NUM_GAMMA_LUTS 2048
++#define MAX_NUM_TOME_MAP_LUTS 2048
++struct gbce_results_params {
++    ia_aiq_gbce_results base;
++
++    float r_gamma_lut[MAX_NUM_GAMMA_LUTS];
++    float b_gamma_lut[MAX_NUM_GAMMA_LUTS];
++    float g_gamma_lut[MAX_NUM_GAMMA_LUTS];
++    float tone_map_lut[MAX_NUM_TOME_MAP_LUTS];
++};
++struct gbce_run_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_gbce_input_params base;
++
++    gbce_results_params res;
++};
++
++#define MAX_NUM_EXPOSURES 3
++#define MAX_NUM_FLASHES 1
++#define MAX_NUM_OF_EXPOSURE_PLANS 4
++#define MAX_SIZE_WEIGHT_GRID (128 * 128)
++struct ae_run_params_results {
++    ia_aiq_ae_results base;
++
++    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
++    ia_aiq_hist_weight_grid weight_grid;
++    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES];
++    ia_aiq_aperture_control aperture_control;
++
++    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
++    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES];
++    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES];
++    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES][MAX_NUM_OF_EXPOSURE_PLANS];
++
++    // the below is in ia_aiq_hist_weight_grid weight_grid;
++    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
++};
++
++struct ae_run_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_ae_input_params base;
++    ia_aiq_exposure_sensor_descriptor sensor_descriptor;
++    ia_rectangle exposure_window;
++    ia_coordinate exposure_coordinate;
++    long manual_exposure_time_us;
++    float manual_analog_gain;
++    short manual_iso;
++    ia_aiq_ae_features aec_features;
++    ia_aiq_ae_manual_limits manual_limits;
++
++    ae_run_params_results res;
++};
++
++struct awb_run_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_awb_input_params base;
++    ia_aiq_awb_manual_cct_range manual_cct_range;
++    ia_coordinate manual_white_coordinate;
++
++    ia_aiq_awb_results results;
++};
++
++#define MAX_NUM_LUTS 128
++#define MAX_SECTOR_COUNT 128
++#define MAX_IR_WIDTH 128
++#define MAX_IR_HEIGHT 128
++#define MAX_NUM_IR_BLOCKS (MAX_IR_WIDTH * MAX_IR_HEIGHT)
++#define MAX_NUM_IR_MODES 5
++struct pa_run_params_results_v1 {
++    ia_aiq_pa_results_v1 base;
++
++    ia_aiq_advanced_ccm_t preferred_acm;
++    ia_aiq_ir_weight_t ir_weight;
++    ia_aiq_rgbir_t rgbir;
++
++    // for ia_aiq_color_channels_lut linearization
++    float gr[MAX_NUM_LUTS];
++    float r[MAX_NUM_LUTS];
++    float b[MAX_NUM_LUTS];
++    float gb[MAX_NUM_LUTS];
++
++    // for ia_aiq_advanced_ccm_t *preferred_acm
++    unsigned int hue_of_sectors[MAX_SECTOR_COUNT];
++    float advanced_color_conversion_matrices[MAX_SECTOR_COUNT][3][3];
++
++    // for ia_aiq_ir_weight_t *ir_weight
++    uint16_t ir_weight_grid_R[MAX_NUM_IR_BLOCKS];
++    uint16_t ir_weight_grid_G[MAX_NUM_IR_BLOCKS];
++    uint16_t ir_weight_grid_B[MAX_NUM_IR_BLOCKS];
++
++    // for ia_aiq_rgbir_t *rgbir
++    ia_aiq_rgbir_model_t models[MAX_NUM_IR_MODES];
++};
++
++struct ia_atbx_face_state_data {
++    ia_atbx_face_state base;
++
++    ia_atbx_face faces[MAX_FACES_DETECTABLE];
++};
++
++struct pa_run_v1_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_pa_input_params base;
++    ia_aiq_awb_results awb_results;
++    ia_aiq_exposure_parameters exposure_params;
++    ia_aiq_color_channels color_gains;
++
++    pa_run_params_results_v1 res;
++};
++
++#define LSC_MAX_BAYER_ORDER_NUM 4
++#define LSC_TABLE_MAX_WIDTH 100
++#define LSC_TABLE_MAX_HEIGHT 100
++#define LSC_TABLE_MAX_SIZE (LSC_TABLE_MAX_WIDTH * LSC_TABLE_MAX_HEIGHT)
++struct lsc_grid_content {
++    uint16_t content[LSC_TABLE_MAX_SIZE];
++};
++struct sa_run_v2_params_results {
++    ia_aiq_sa_results_v1 base;
++
++    lsc_grid_content lsc_grid[LSC_MAX_BAYER_ORDER_NUM][LSC_MAX_BAYER_ORDER_NUM];
++};
++
++struct sa_run_v2_params {
++    uintptr_t aiq_handle;
++
++    ia_aiq_sa_input_params_v1 base;
++    ia_aiq_frame_params sensor_frame_params;
++    ia_aiq_awb_results awb_results;
++
++    sa_run_v2_params_results res;
++};
++
++#define MAX_IA_BINARY_DATA_PARAMS_SIZE 500000
++struct ia_binary_data_params {
++    uintptr_t aiq_handle;
++    uint8_t data[MAX_IA_BINARY_DATA_PARAMS_SIZE];
++    unsigned int size;
++};
++
++#define MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE 100
++struct ia_aiq_version_params {
++    uintptr_t aiq_handle;
++    char data[MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE];
++    unsigned int size;
++};
++
++#define MAX_WIDTH 96
++#define MAX_HEIGHT 72
++#define MAX_NUM_BLOCKS (MAX_WIDTH * MAX_HEIGHT)
++struct ia_aiq_rgbs_grid_data {
++    ia_aiq_rgbs_grid base;
++
++    rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
++};
++
++struct ia_aiq_hdr_rgbs_grid_data {
++    ia_aiq_hdr_rgbs_grid base;
++
++    hdr_rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
++};
++
++#define MAX_AF_GRID_WIDTH 96
++#define MAX_AF_GRID_HEIGHT 72
++#define MAX_AF_GRID_SIZE (MAX_AF_GRID_HEIGHT * MAX_AF_GRID_WIDTH)
++struct ia_aiq_af_grid_data {
++    ia_aiq_af_grid base;
++
++    int filter_response_1[MAX_AF_GRID_SIZE];
++    int filter_response_2[MAX_AF_GRID_SIZE];
++};
++
++#define MAX_DEPTH_GRID_WIDHT 128
++#define MAX_DEPTH_GRID_HEIGHT 128
++#define MAX_DEPTH_GRID_SIZE (MAX_DEPTH_GRID_WIDHT * MAX_DEPTH_GRID_HEIGHT)
++struct ia_aiq_depth_grid_data {
++    ia_aiq_depth_grid base;
++
++    ia_rectangle grid_rect[MAX_DEPTH_GRID_SIZE];
++    int depth_data[MAX_DEPTH_GRID_SIZE];
++    unsigned char confidence[MAX_DEPTH_GRID_SIZE];
++};
++
++#define MAX_NUMBER_OF_GRIDS 1
++#define MAX_NUMBER_OF_AF_GRIDS 1
++#define MAX_NUMBER_OF_HISTROGRAMS 1
++#define MAX_NUMBER_OF_DEPTH_GRIDS 1
++#define MAX_IR_WEIGHT_GRID_DATA_SIZE 480
++struct set_statistics_params_data {
++    ia_aiq_statistics_input_params_v4 base;
++
++    ae_run_params_results frame_ae_parameters;
++
++    ia_aiq_af_results frame_af_parameters;
++
++    const ia_aiq_rgbs_grid* rgbs_grids_array[MAX_NUMBER_OF_GRIDS];
++    ia_aiq_rgbs_grid_data rgbs_grids[MAX_NUMBER_OF_GRIDS];
++
++    ia_aiq_hdr_rgbs_grid_data hdr_rgbs_grid;
++
++    const ia_aiq_af_grid* af_grids_array[MAX_NUMBER_OF_AF_GRIDS];
++    ia_aiq_af_grid_data af_grids[MAX_NUMBER_OF_AF_GRIDS];
++
++    pa_run_params_results_v1 frame_pa_parameters;
++
++    ia_atbx_face_state_data faces;
++
++    ia_aiq_awb_results awb_results;
++
++    sa_run_v2_params_results frame_sa_parameters;
++
++    const ia_aiq_depth_grid* depth_grids_array[MAX_NUMBER_OF_DEPTH_GRIDS];
++    ia_aiq_depth_grid_data depth_grids[MAX_NUMBER_OF_DEPTH_GRIDS];
++
++    ia_aiq_grid ir_grid;
++    unsigned short ir_grid_data[MAX_IR_WEIGHT_GRID_DATA_SIZE];
++};
++
++struct set_statistics_set_v4_params {
++    uintptr_t ia_aiq;
++    set_statistics_params_data input;
++};
++
++class IPCIntelAiq {
++ public:
++    IPCIntelAiq();
++    virtual ~IPCIntelAiq();
++
++    // for init
++    bool clientFlattenInit(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                           const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                           unsigned int statsMaxHeight, unsigned int maxNumStatsIn, uintptr_t cmc,
++                           uintptr_t mkn, uint8_t* pData, unsigned int size);
++    bool serverUnflattenInit(const void* pData, int dataSize, ia_binary_data* aiqbData,
++                             ia_binary_data* nvmData, ia_binary_data* aiqdData);
++
++    // for ae
++    bool clientFlattenAe(uintptr_t aiq, const ia_aiq_ae_input_params& inParams,
++                         ae_run_params* params);
++    bool clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results);
++    bool serverUnflattenAe(ae_run_params* inParams, ia_aiq_ae_input_params** params);
++    bool serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params);
++
++    bool flattenAeResults(const ia_aiq_ae_results& aeResults, ae_run_params_results* res);
++    bool unflattenAeResults(ae_run_params_results* res);
++
++    // for af
++    bool clientFlattenAf(uintptr_t aiq, const ia_aiq_af_input_params& inParams,
++                         af_run_params* params);
++    bool clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results);
++    bool serverUnflattenAf(af_run_params* inParams, ia_aiq_af_input_params** params);
++    bool serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params);
++
++    // for awb
++    bool clientFlattenAwb(uintptr_t aiq, const ia_aiq_awb_input_params& inParams,
++                          awb_run_params* params);
++    bool clientUnflattenAwb(const awb_run_params& inParams, ia_aiq_awb_results** results);
++    bool serverUnflattenAwb(awb_run_params* inParams, ia_aiq_awb_input_params** params);
++    bool serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params);
++
++    // for gbce
++    bool clientFlattenGbce(uintptr_t aiq, const ia_aiq_gbce_input_params& inParams,
++                           gbce_run_params* params);
++    bool clientUnflattenGbce(gbce_run_params* params, ia_aiq_gbce_results** results);
++    bool serverFlattenGbce(const ia_aiq_gbce_results& gbceResults, gbce_run_params* params);
++
++    bool flattenGbceResults(const ia_aiq_gbce_results& gbceResults, gbce_results_params* res);
++    bool unflattenGbceResults(gbce_results_params* res);
++
++    // for pa
++    bool clientFlattenPaV1(uintptr_t aiq, const ia_aiq_pa_input_params& inParams,
++                           pa_run_v1_params* params);
++    bool clientUnflattenPaV1(pa_run_v1_params* params, ia_aiq_pa_results_v1** results);
++    bool serverUnflattenPaV1(pa_run_v1_params* inParams, ia_aiq_pa_input_params** params);
++    bool serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults, pa_run_v1_params* params);
++
++    bool flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults, pa_run_params_results_v1* res);
++    bool unflattenPaResultsV1(pa_run_params_results_v1* res);
++
++    // for sa
++    bool clientFlattenSaV2(uintptr_t aiq, const ia_aiq_sa_input_params_v1& inParams,
++                           sa_run_v2_params* params);
++    bool clientUnflattenSaV2(sa_run_v2_params* params, ia_aiq_sa_results_v1** results);
++    bool serverUnflattenSaV2(const sa_run_v2_params& inParams, ia_aiq_sa_input_params_v1** params);
++    bool serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults, sa_run_v2_params* params);
++
++    bool flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults, sa_run_v2_params_results* res);
++    bool unflattenSaResultsV2(sa_run_v2_params_results* res);
++
++    // for statistics
++    bool clientFlattenStatSetV4(uintptr_t aiq, const ia_aiq_statistics_input_params_v4& inParams,
++                                set_statistics_set_v4_params* params);
++    bool serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
++                                  ia_aiq_statistics_input_params_v4** params);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
+new file mode 100644
+index 000000000000..ed0995a18a2b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
+@@ -0,0 +1,258 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_INTEL_CMC"
++
++#include "modules/sandboxing/IPCIntelCmc.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIntelCmc::IPCIntelCmc() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelCmc::~IPCIntelCmc() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIntelCmc::clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params) {
++    LOGIPC("@%s, aiqb: data:%p, size:%d, params:%p", __func__, aiqb.data, aiqb.size, params);
++
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!aiqb.data, false, "@%s, aiqb.data is nullptr", __func__);
++    CheckError(aiqb.size == 0, false, "@%s, aiqb.size is 0", __func__);
++    CheckError(aiqb.size > sizeof(params->input.data), false, "@%s, aiqb:%d is too big", __func__,
++               aiqb.size);
++
++    ia_binary_data_mod* input = &params->input;
++    MEMCPY_S(input->data, sizeof(input->data), aiqb.data, aiqb.size);
++    input->size = aiqb.size;
++
++    return true;
++}
++
++bool IPCIntelCmc::clientUnflattenInit(const cmc_init_params& params, ia_cmc_t** cmc,
++                                      uintptr_t* cmcRemoteHandle) {
++    LOGIPC("@%s, cmc:%p", __func__, cmc);
++    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
++
++    int ret = unflattenCmcData(const_cast<ia_cmc_data*>(&params.results));
++    CheckError(ret == false, false, "%s, unflattenCmcData fails", __func__);
++
++    *cmc = const_cast<ia_cmc_t*>(&params.results.base);
++    *cmcRemoteHandle = params.results.cmcRemoteHandle;
++
++    return true;
++}
++
++bool IPCIntelCmc::serverUnflattenInit(const cmc_init_params& params, ia_binary_data* aiqb) {
++    LOGIPC("@%s, aiqb:%p", __func__, aiqb);
++    CheckError(aiqb == nullptr, false, "@%s, aiqb is nullptr", __func__);
++
++    ia_binary_data_mod* input = const_cast<ia_binary_data_mod*>(&params.input);
++    aiqb->data = input->data;
++    aiqb->size = input->size;
++
++    return true;
++}
++
++bool IPCIntelCmc::serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    int ret = flattenCmcData(&cmc, &params->results);
++    CheckError(ret == false, false, "%s flattenCmcData fails", __func__);
++
++    return true;
++}
++
++bool IPCIntelCmc::flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results) {
++    CheckError(!cmc || !results, false, "%s, cmc or results is nullptr", __func__);
++
++    results->base = *cmc;
++    results->cmcRemoteHandle = reinterpret_cast<uintptr_t>(cmc);
++
++    ia_cmc_t* base = &results->base;
++    if (base->cmc_general_data) {
++        results->cmc_general_data = *base->cmc_general_data;
++    }
++
++    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
++    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
++    if (baseBL->cmc_black_level) {
++        retBL->cmc_black_level = *baseBL->cmc_black_level;
++    }
++    if (baseBL->cmc_black_level_luts) {
++        retBL->cmc_black_level_luts = *baseBL->cmc_black_level_luts;
++    }
++
++    if (base->cmc_saturation_level) {
++        results->cmc_saturation_level = *base->cmc_saturation_level;
++    }
++
++    if (base->cmc_sensitivity) {
++        results->cmc_sensitivity = *base->cmc_sensitivity;
++    }
++
++    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
++    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
++    if (baseLS->cmc_lens_shading) {
++        retLS->cmc_lens_shading = *baseLS->cmc_lens_shading;
++    }
++    if (baseLS->cmc_lsc_grids) {
++        retLS->cmc_lsc_grids = *baseLS->cmc_lsc_grids;
++    }
++    if (baseLS->lsc_grids) {
++        retLS->lsc_grids = *baseLS->lsc_grids;
++    }
++    if (baseLS->cmc_lsc_rg_bg_ratios) {
++        retLS->cmc_lsc_rg_bg_ratios = *baseLS->cmc_lsc_rg_bg_ratios;
++    }
++
++    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
++    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
++    if (baseOptics->cmc_optomechanics) {
++        retOptics->cmc_optomechanics = *baseOptics->cmc_optomechanics;
++    }
++    if (baseOptics->lut_apertures) {
++        retOptics->lut_apertures = *baseOptics->lut_apertures;
++    }
++
++    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
++    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
++    if (baseCM->cmc_color_matrices) {
++        retCM->cmc_color_matrices = *baseCM->cmc_color_matrices;
++    }
++    if (baseCM->cmc_color_matrix) {
++        // fix asan issue:base->cmc_parsed_color_matrices.cmc_color_matrix is not 4 aligned
++        // use memcpy instead of *
++        MEMCPY_S(&retCM->cmc_color_matrix, sizeof(retCM->cmc_color_matrix),
++                 baseCM->cmc_color_matrix, sizeof(cmc_color_matrix_t));
++    }
++    if (baseCM->ccm_estimate_method) {
++        retCM->ccm_estimate_method = *baseCM->ccm_estimate_method;
++    }
++
++    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
++    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
++    if (baseAGC->cmc_analog_gain_conversion) {
++        retAGC->cmc_analog_gain_conversion = *baseAGC->cmc_analog_gain_conversion;
++
++        CheckError(baseAGC->cmc_analog_gain_conversion->num_segments > MAX_NUM_SEGMENTS, false,
++                   "@%s, num_segments:%d is too big", __func__,
++                   baseAGC->cmc_analog_gain_conversion->num_segments);
++        CheckError(baseAGC->cmc_analog_gain_conversion->num_pairs > MAX_NUM_ANALOG_PAIRS, false,
++                   "@%s, num_pairs:%d is too big", __func__,
++                   baseAGC->cmc_analog_gain_conversion->num_pairs);
++
++        if (baseAGC->cmc_analog_gain_segments) {
++            MEMCPY_S(retAGC->cmc_analog_gain_segments, sizeof(retAGC->cmc_analog_gain_segments),
++                     baseAGC->cmc_analog_gain_segments,
++                     (sizeof(*baseAGC->cmc_analog_gain_segments) *
++                      baseAGC->cmc_analog_gain_conversion->num_segments));
++        }
++        if (baseAGC->cmc_analog_gain_pairs) {
++            MEMCPY_S(retAGC->cmc_analog_gain_pairs, sizeof(retAGC->cmc_analog_gain_pairs),
++                     baseAGC->cmc_analog_gain_pairs,
++                     (sizeof(*baseAGC->cmc_analog_gain_pairs) *
++                      baseAGC->cmc_analog_gain_conversion->num_pairs));
++        }
++    }
++
++    return true;
++}
++
++bool IPCIntelCmc::unflattenCmcData(ia_cmc_data* results) {
++    LOGIPC("@%s", __func__);
++    CheckError(!results, false, "%s, results is nullptr", __func__);
++
++    ia_cmc_t* base = &results->base;
++
++    if (base->cmc_general_data) {
++        base->cmc_general_data = &results->cmc_general_data;
++    }
++
++    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
++    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
++    if (baseBL->cmc_black_level) {
++        baseBL->cmc_black_level = &retBL->cmc_black_level;
++    }
++    if (baseBL->cmc_black_level_luts) {
++        baseBL->cmc_black_level_luts = &retBL->cmc_black_level_luts;
++    }
++
++    if (base->cmc_saturation_level) {
++        base->cmc_saturation_level = &results->cmc_saturation_level;
++    }
++
++    if (base->cmc_sensitivity) {
++        base->cmc_sensitivity = &results->cmc_sensitivity;
++    }
++
++    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
++    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
++    if (baseLS->cmc_lens_shading) {
++        baseLS->cmc_lens_shading = &retLS->cmc_lens_shading;
++    }
++    if (baseLS->cmc_lsc_grids) {
++        baseLS->cmc_lsc_grids = &retLS->cmc_lsc_grids;
++    }
++    if (baseLS->lsc_grids) {
++        baseLS->lsc_grids = &retLS->lsc_grids;
++    }
++    if (baseLS->cmc_lsc_rg_bg_ratios) {
++        baseLS->cmc_lsc_rg_bg_ratios = &retLS->cmc_lsc_rg_bg_ratios;
++    }
++
++    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
++    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
++    if (baseOptics->cmc_optomechanics) {
++        baseOptics->cmc_optomechanics = &retOptics->cmc_optomechanics;
++    }
++    if (baseOptics->lut_apertures) {
++        baseOptics->lut_apertures = &retOptics->lut_apertures;
++    }
++
++    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
++    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
++    if (baseCM->cmc_color_matrices) {
++        baseCM->cmc_color_matrices = &retCM->cmc_color_matrices;
++    }
++    if (baseCM->cmc_color_matrix) {
++        baseCM->cmc_color_matrix = &retCM->cmc_color_matrix;
++    }
++    if (baseCM->ccm_estimate_method) {
++        baseCM->ccm_estimate_method = &retCM->ccm_estimate_method;
++    }
++
++    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
++    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
++    if (baseAGC->cmc_analog_gain_conversion) {
++        baseAGC->cmc_analog_gain_conversion = &retAGC->cmc_analog_gain_conversion;
++
++        if (baseAGC->cmc_analog_gain_segments) {
++            baseAGC->cmc_analog_gain_segments = retAGC->cmc_analog_gain_segments;
++        }
++        if (baseAGC->cmc_analog_gain_pairs) {
++            baseAGC->cmc_analog_gain_pairs = retAGC->cmc_analog_gain_pairs;
++        }
++    }
++
++    return true;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
+new file mode 100644
+index 000000000000..4c296172f095
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
+@@ -0,0 +1,95 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_cmc_types.h>
++#include <ia_types.h>
++
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++typedef struct {
++    cmc_black_level_t cmc_black_level;
++    cmc_black_level_lut_t cmc_black_level_luts;
++} cmc_parsed_black_level_data;
++
++typedef struct {
++    cmc_lens_shading_t cmc_lens_shading;
++    cmc_lsc_grid_t cmc_lsc_grids;
++    uint16_t lsc_grids;
++    chromaticity_t cmc_lsc_rg_bg_ratios;
++} cmc_parsed_lens_shading_data;
++
++typedef struct {
++    cmc_optomechanics_t cmc_optomechanics;
++    uint16_t lut_apertures;
++} cmc_parsed_optics_data;
++
++typedef struct {
++    cmc_color_matrices_t cmc_color_matrices;
++    cmc_color_matrix_t cmc_color_matrix;
++    uint16_t ccm_estimate_method;
++} cmc_parsed_color_matrices_data;
++
++#define MAX_NUM_SEGMENTS 512
++#define MAX_NUM_ANALOG_PAIRS 1024
++typedef struct {
++    cmc_analog_gain_conversion_t cmc_analog_gain_conversion;
++    cmc_analog_gain_segment_t cmc_analog_gain_segments[MAX_NUM_SEGMENTS];
++    cmc_analog_gain_pair_t cmc_analog_gain_pairs[MAX_NUM_ANALOG_PAIRS];
++} cmc_parsed_analog_gain_conversion_data;
++
++struct ia_cmc_data {
++    ia_cmc_t base;
++
++    cmc_general_data_t cmc_general_data;
++    cmc_parsed_black_level_data cmc_parsed_black_level;
++    cmc_saturation_level_t cmc_saturation_level;
++    cmc_sensitivity_t cmc_sensitivity;
++    cmc_parsed_lens_shading_data cmc_parsed_lens_shading;
++    cmc_parsed_optics_data cmc_parsed_optics;
++    cmc_parsed_color_matrices_data cmc_parsed_color_matrices;
++    cmc_parsed_analog_gain_conversion_data cmc_parsed_analog_gain_conversion;
++
++    uintptr_t cmcRemoteHandle;  // it stores the remote cmc pointer.
++};
++
++struct cmc_init_params {
++    ia_binary_data_mod input;
++    ia_cmc_data results;
++};
++
++struct cmc_deinit_params {
++    uintptr_t cmc_handle;
++};
++
++class IPCIntelCmc {
++ public:
++    IPCIntelCmc();
++    virtual ~IPCIntelCmc();
++
++    // for init
++    bool clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params);
++    bool clientUnflattenInit(const cmc_init_params& params, ia_cmc_t** cmc,
++                             uintptr_t* cmcRemoteHandle);
++    bool serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params);
++    bool serverUnflattenInit(const cmc_init_params& pData, ia_binary_data* aiqb);
++
++    bool flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results);
++    bool unflattenCmcData(ia_cmc_data* results);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
+new file mode 100644
+index 000000000000..8ac131e8e42d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
+@@ -0,0 +1,704 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_INTEL_DVS"
++
++#include "modules/sandboxing/IPCIntelDvs.h"
++
++#include <ia_types.h>
++
++#include "CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIntelDvs::IPCIntelDvs() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelDvs::~IPCIntelDvs() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIntelDvs::clientFlattenInit(void* pData, unsigned int size,
++                                    const ia_binary_data* dvsDataPtr, const ia_cmc_t* cmc) {
++    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p", __func__, pData, size, dvsDataPtr, cmc);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
++    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
++    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
++    CheckError(dvsDataPtr->size > MAX_DVS_DATA_SIZE, false, "@%s, data:%d is too small", __func__,
++               dvsDataPtr->size);
++
++    DvsInitParams* params = static_cast<DvsInitParams*>(pData);
++    params->base.size = dvsDataPtr->size;
++    params->base.data = params->data;
++    MEMCPY_S(params->data, MAX_DVS_DATA_SIZE, dvsDataPtr->data, dvsDataPtr->size);
++
++    params->cmcHandle = reinterpret_cast<uintptr_t>(cmc);
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenInit(void* pData, int size, ia_binary_data** dvsDataPtr,
++                                      ia_cmc_t** cmc) {
++    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p", __func__, pData, size, dvsDataPtr, cmc);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
++    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
++
++    DvsInitParams* params = reinterpret_cast<DvsInitParams*>(pData);
++    params->base.data = params->data;
++
++    *dvsDataPtr = &params->base;
++    *cmc = reinterpret_cast<ia_cmc_t*>(params->cmcHandle);
++    return true;
++}
++
++bool IPCIntelDvs::serverFlattenInit(void* pData, unsigned int size, ia_dvs_state* dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
++
++    DvsInitParams* params = static_cast<DvsInitParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    return true;
++}
++
++bool IPCIntelDvs::clientUnflattenInit(const void* pData, unsigned int size, ia_dvs_state** dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    const DvsInitParams* params = static_cast<const DvsInitParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenDeinit(void* pData, unsigned int size, ia_dvs_state* dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsDeinitParams* params = static_cast<DvsDeinitParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenDeinit(const void* pData, unsigned int size, ia_dvs_state** dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    const DvsDeinitParams* params = static_cast<const DvsDeinitParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenConfig(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                      const ia_dvs_configuration* config, float zoomRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f", __func__, pData, size, dvs,
++           config, zoomRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!config, false, "@%s, config is nullptr", __func__);
++
++    DvsConfigParams* params = static_cast<DvsConfigParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    MEMCPY_S(&params->configData, sizeof(ia_dvs_configuration), config,
++             sizeof(ia_dvs_configuration));
++    params->zoomRatio = zoomRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenConfig(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                        ia_dvs_configuration** config, float* zoomRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f", __func__, pData, size, dvs,
++           config, zoomRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!config, false, "@%s, config is nullptr", __func__);
++    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
++
++    DvsConfigParams* params =
++        const_cast<DvsConfigParams*>(static_cast<const DvsConfigParams*>(pData));
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *config = &params->configData;
++    *zoomRatio = params->zoomRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenNoneBlanckRation(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                                float nonBlankingRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f", __func__, pData, size, dvs,
++           nonBlankingRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsNoneBlankRatioParams* params = static_cast<DvsNoneBlankRatioParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->nonBlankingRatio = nonBlankingRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenNoneBlanckRation(const void* pData, unsigned int size,
++                                                  ia_dvs_state** dvs, float* nonBlankingRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f", __func__, pData, size, dvs,
++           nonBlankingRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!nonBlankingRatio, false, "@%s, nonBlankingRatio is nullptr", __func__);
++
++    const DvsNoneBlankRatioParams* params = static_cast<const DvsNoneBlankRatioParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *nonBlankingRatio = params->nonBlankingRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenDigitalZoomMode(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                               ia_dvs_zoom_mode zoomMode) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsDigitalZoomMode* params = static_cast<DvsDigitalZoomMode*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->zoomMode = zoomMode;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenDigitalZoomMode(const void* pData, unsigned int size,
++                                                 ia_dvs_state** dvs, ia_dvs_zoom_mode* zoomMode) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomMode, false, "@%s, zoomMode is nullptr", __func__);
++
++    const DvsDigitalZoomMode* params = static_cast<const DvsDigitalZoomMode*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *zoomMode = params->zoomMode;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenDigitalZoomRegion(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                                 ia_rectangle* zoomRegion) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p", __func__, pData, size, dvs, zoomRegion);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
++
++    DvsDigitalZoomRegion* params = static_cast<DvsDigitalZoomRegion*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->zoomRegion = *zoomRegion;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenDigitalZoomRegion(const void* pData, unsigned int size,
++                                                   ia_dvs_state** dvs, ia_rectangle** zoomRegion) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p", __func__, pData, size, dvs, zoomRegion);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
++
++    DvsDigitalZoomRegion* params =
++        const_cast<DvsDigitalZoomRegion*>(static_cast<const DvsDigitalZoomRegion*>(pData));
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *zoomRegion = &params->zoomRegion;
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenDigitalZoomCoordinate(void* pData, unsigned int size,
++                                                     ia_dvs_state* dvs,
++                                                     ia_coordinate* zoomCoordinate) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p", __func__, pData, size, dvs,
++           zoomCoordinate);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
++
++    DvsDigitalZoomCoordinate* params = static_cast<DvsDigitalZoomCoordinate*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->zoomCoordinate = *zoomCoordinate;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenDigitalZoomCoordinate(const void* pData, unsigned int size,
++                                                       ia_dvs_state** dvs,
++                                                       ia_coordinate** zoomCoordinate) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p", __func__, pData, size, dvs,
++           zoomCoordinate);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
++
++    DvsDigitalZoomCoordinate* params =
++        const_cast<DvsDigitalZoomCoordinate*>(static_cast<const DvsDigitalZoomCoordinate*>(pData));
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *zoomCoordinate = &params->zoomCoordinate;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenDigitalZoomMagnitude(void* pData, unsigned int size,
++                                                    ia_dvs_state* dvs, float zoomRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f", __func__, pData, size, dvs, zoomRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsDigitalZoomMagnitude* params = static_cast<DvsDigitalZoomMagnitude*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->zoomRatio = zoomRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenDigitalZoomMagnitude(const void* pData, unsigned int size,
++                                                      ia_dvs_state** dvs, float* zoomRatio) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f", __func__, pData, size, dvs, zoomRatio);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
++
++    const DvsDigitalZoomMagnitude* params = static_cast<const DvsDigitalZoomMagnitude*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *zoomRatio = params->zoomRatio;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenFreeMorphTable(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                              ia_dvs_morph_table* morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    DvsFreeMorphParams* params = static_cast<DvsFreeMorphParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenFreeMorphTable(const void* pData, unsigned int size,
++                                                ia_dvs_state** dvs,
++                                                ia_dvs_morph_table** morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    const DvsFreeMorphParams* params = static_cast<const DvsFreeMorphParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenAllocateMorphTable(void* pData, unsigned int size,
++                                                  ia_dvs_state* dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsMorphParams* params = static_cast<DvsMorphParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenAllocateMorphTalbe(const void* pData, unsigned int size,
++                                                    ia_dvs_state** dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    const DvsMorphParams* params = static_cast<const DvsMorphParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverFlattenAllocateMorphTalbe(void* pData, unsigned int size,
++                                                  ia_dvs_morph_table* morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, morphRemote:%p", __func__, pData, size, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    DvsMorphParams* params = static_cast<DvsMorphParams*>(pData);
++    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
++
++    return true;
++}
++
++bool IPCIntelDvs::clientUnflattenAllocateMorphTalbe(const void* pData, unsigned int size,
++                                                    ia_dvs_morph_table** morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
++
++    const DvsMorphParams* params = static_cast<const DvsMorphParams*>(pData);
++    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenGetMorphTable(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                             ia_dvs_morph_table* morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    DvsMorphParams* params = static_cast<DvsMorphParams*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenGetMorphTalbe(const void* pData, unsigned int size,
++                                               ia_dvs_state** dvs,
++                                               ia_dvs_morph_table** morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, morphTable:%p", __func__, pData, size, dvs, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    const DvsMorphParams* params = static_cast<const DvsMorphParams*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::flattenMorphTable(const ia_dvs_morph_table* morphTable, DvsMorphParams* params) {
++    LOGIPC("@%s", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!morphTable->xcoords_y || !morphTable->ycoords_y, false, "@%s, y coords is nullptr",
++               __func__);
++    CheckError(!morphTable->xcoords_uv || !morphTable->ycoords_uv, false,
++               "@%s, uv coords is nullptr", __func__);
++    CheckError(!morphTable->xcoords_uv_float || !morphTable->ycoords_uv_float, false,
++               "@%s, uv coords float is nullptr", __func__);
++
++    unsigned int SizeY = morphTable->width_y * morphTable->height_y * sizeof(int32_t);
++    unsigned int SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(int32_t);
++    unsigned int SizeYLocal = MAX_DVS_COORDS_Y_SIZE * sizeof(int32_t);
++    unsigned int SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(int32_t);
++    CheckError(SizeY > SizeYLocal, false, "@%s, coords_y data is small", __func__);
++    CheckError(SizeUV > SizeUVLocal, false, "@%s, coords_uv data is small", __func__);
++    MEMCPY_S(params->xcoordsY, SizeYLocal, morphTable->xcoords_y, SizeY);
++    MEMCPY_S(params->ycoordsY, SizeYLocal, morphTable->ycoords_y, SizeY);
++    MEMCPY_S(params->xcoordsUV, SizeUVLocal, morphTable->xcoords_uv, SizeUV);
++    MEMCPY_S(params->ycoordsUV, SizeUVLocal, morphTable->ycoords_uv, SizeUV);
++
++    SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(float);
++    SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(float);
++    CheckError(SizeUV > SizeUVLocal, false, "@%s, coords_uv data of float type is small", __func__);
++    MEMCPY_S(params->xcoordsUVFloat, SizeUVLocal, morphTable->xcoords_uv_float, SizeUV);
++    MEMCPY_S(params->ycoordsUVFloat, SizeUVLocal, morphTable->ycoords_uv_float, SizeUV);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverFlattenGetMorphTalbe(void* pData, unsigned int size,
++                                             ia_dvs_morph_table* morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
++
++    DvsMorphParams* params = static_cast<DvsMorphParams*>(pData);
++    params->morphTable = *morphTable;
++
++    return flattenMorphTable(morphTable, params);
++}
++
++bool IPCIntelDvs::unflattenMorphTalbe(DvsMorphParams* params) {
++    LOGIPC("@%s", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    params->morphTable.xcoords_y = params->xcoordsY;
++    params->morphTable.ycoords_y = params->ycoordsY;
++    params->morphTable.xcoords_uv = params->xcoordsUV;
++    params->morphTable.ycoords_uv = params->ycoordsUV;
++    params->morphTable.xcoords_uv_float = params->xcoordsUVFloat;
++    params->morphTable.ycoords_uv_float = params->ycoordsUVFloat;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientUnflattenGetMorphTalbe(void* pData, unsigned int size,
++                                               ia_dvs_morph_table** morphTable) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
++    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
++
++    DvsMorphParams* params = static_cast<DvsMorphParams*>(pData);
++    bool ret = unflattenMorphTalbe(params);
++    CheckError(!ret, false, "@%s, unflattenMorphTalbe fails", __func__);
++    *morphTable = &params->morphTable;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenSetStatistics(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                             const ia_dvs_statistics* statistics,
++                                             const ia_aiq_ae_results* aeResults,
++                                             const ia_aiq_af_results* afResults,
++                                             const ia_aiq_sensor_events* sensorEvents,
++                                             uint64_t frameReadoutStart, uint64_t frameReadoutEnd) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsStatistcs), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsStatistcs* params = static_cast<DvsStatistcs*>(pData);
++    CLEAR(*params);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++
++    if (statistics) {
++        params->statisticsFlag = true;
++        CheckError(MV_ENTRIE_COUNT < statistics->vector_count, false, "statistics buffer is small");
++        params->statistics.vector_count = statistics->vector_count;
++        MEMCPY_S(params->motion_vectors, MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
++                 statistics->motion_vectors,
++                 statistics->vector_count * sizeof(ia_dvs_motion_vector));
++    }
++
++    if (aeResults) {
++        params->aeResultsFlag = true;
++        bool ret = mIpcAiq.flattenAeResults(*aeResults, &params->aeResultsBase);
++        CheckError(!ret, false, "failed to copy ae result");
++    }
++
++    if (afResults) {
++        params->afResultsFlag = true;
++        params->afResultsBase = *afResults;
++    }
++
++    if (sensorEvents) {
++        params->sensorEventsFlag = true;
++        size_t sensorDataLen = sizeof(ia_aiq_sensor_data);
++        size_t sensorEventLen = sensorDataLen * MAX_MOTION_SENSOR_COUNT_DVS;
++        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_accelerometer_events, false,
++                   "accelerometer_events buffer is small");
++        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gravity_events, false,
++                   "gravity_events buffer is small");
++        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gyroscope_events, false,
++                   "gyroscope_events buffer is small");
++        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_ambient_light_events, false,
++                   "ambient_light_events buffer is small");
++        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_dmd_events, false,
++                   "dmd_events buffer is small");
++        MEMCPY_S(params->sensorEvents.accelerometer_events, sensorEventLen,
++                 sensorEvents->accelerometer_events,
++                 sensorEvents->num_accelerometer_events * sensorDataLen);
++        MEMCPY_S(params->sensorEvents.gravity_events, sensorEventLen, sensorEvents->gravity_events,
++                 sensorEvents->num_gravity_events * sensorDataLen);
++        MEMCPY_S(params->sensorEvents.gyroscope_events, sensorEventLen,
++                 sensorEvents->gyroscope_events,
++                 sensorEvents->num_gyroscope_events * sensorDataLen);
++        MEMCPY_S(params->sensorEvents.ambient_light_events,
++                 sizeof(params->sensorEvents.ambient_light_events),
++                 sensorEvents->ambient_light_events,
++                 sensorEvents->num_ambient_light_events * sizeof(ia_aiq_ambient_light_events));
++        MEMCPY_S(params->sensorEvents.dmd_events, sizeof(params->sensorEvents.dmd_events),
++                 sensorEvents->dmd_events,
++                 sensorEvents->num_dmd_events * sizeof(ia_aiq_dmd_sensor_events));
++        params->sensorEventsBase = *sensorEvents;
++    }
++    params->frameReadoutStart = frameReadoutStart;
++    params->frameReadoutEnd = frameReadoutEnd;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenSetStatistics(
++    void* pData, unsigned int size, ia_dvs_state** dvs, ia_dvs_statistics** statistics,
++    ia_aiq_ae_results** aeResults, ia_aiq_af_results** afResults,
++    ia_aiq_sensor_events** sensorEvents, uint64_t* frameReadoutStart, uint64_t* frameReadoutEnd) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++
++    DvsStatistcs* params = static_cast<DvsStatistcs*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++
++    *statistics = nullptr;
++    if (params->statisticsFlag) {
++        params->statistics.motion_vectors = params->motion_vectors;
++        *statistics = &params->statistics;
++    }
++
++    *aeResults = nullptr;
++    if (params->aeResultsFlag) {
++        bool ret = mIpcAiq.unflattenAeResults(&params->aeResultsBase);
++        CheckError(!ret, false, "@%s, unflattenAeResults fails", __func__);
++        *aeResults = &params->aeResultsBase.base;
++    }
++
++    *afResults = nullptr;
++    if (params->afResultsFlag) {
++        *afResults = &params->afResultsBase;
++    }
++
++    *sensorEvents = nullptr;
++    if (params->sensorEventsFlag) {
++        if (params->sensorEventsBase.num_accelerometer_events != 0) {
++            params->sensorEventsBase.accelerometer_events =
++                params->sensorEvents.accelerometer_events;
++        }
++        if (params->sensorEventsBase.num_gravity_events != 0) {
++            params->sensorEventsBase.gravity_events = params->sensorEvents.gravity_events;
++        }
++        if (params->sensorEventsBase.num_gyroscope_events != 0) {
++            params->sensorEventsBase.gyroscope_events = params->sensorEvents.gyroscope_events;
++        }
++        if (params->sensorEventsBase.num_ambient_light_events != 0) {
++            params->sensorEventsBase.ambient_light_events =
++                params->sensorEvents.ambient_light_events;
++        }
++        if (params->sensorEventsBase.num_dmd_events != 0) {
++            params->sensorEventsBase.dmd_events = params->sensorEvents.dmd_events;
++        }
++        *sensorEvents = &params->sensorEventsBase;
++    }
++
++    *frameReadoutStart = params->frameReadoutStart;
++    *frameReadoutEnd = params->frameReadoutEnd;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenExecute(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                       uint16_t focusPosition) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%d", __func__, pData, size, dvs,
++           focusPosition);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsExecute* params = static_cast<DvsExecute*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++    params->focusPosition = focusPosition;
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenExecute(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                         uint16_t* focusPosition) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%p", __func__, pData, size, dvs,
++           focusPosition);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++    CheckError(!focusPosition, false, "@%s, focusPosition is nullptr", __func__);
++
++    const DvsExecute* params = static_cast<const DvsExecute*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++    *focusPosition = params->focusPosition;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientFlattenImageTransformation(void* pData, unsigned int size,
++                                                   ia_dvs_state* dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsImageTransformation* params = static_cast<DvsImageTransformation*>(pData);
++    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverUnflattenImageTransformation(void* pData, unsigned int size,
++                                                     ia_dvs_state** dvs) {
++    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
++    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
++
++    DvsImageTransformation* params = static_cast<DvsImageTransformation*>(pData);
++    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
++
++    return true;
++}
++
++bool IPCIntelDvs::serverFlattenImageTransformation(
++    void* pData, unsigned int size, ia_dvs_image_transformation* imageTransformation) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
++    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
++
++    DvsImageTransformation* params = static_cast<DvsImageTransformation*>(pData);
++    params->imageTransformation = *imageTransformation;
++
++    return true;
++}
++
++bool IPCIntelDvs::clientUnflattenImageTransformation(
++    const void* pData, unsigned int size, ia_dvs_image_transformation** imageTransformation) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
++    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
++
++    DvsImageTransformation* params =
++        const_cast<DvsImageTransformation*>(static_cast<const DvsImageTransformation*>(pData));
++    *imageTransformation = &params->imageTransformation;
++
++    return true;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
+new file mode 100644
+index 000000000000..6ce6ae6ba519
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
+@@ -0,0 +1,239 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_dvs.h>
++#include <ia_dvs_types.h>
++#include <ia_isp_bxt.h>
++
++#include "DvsResult.h"
++#include "modules/sandboxing/IPCCommon.h"
++#include "modules/sandboxing/IPCIntelAiq.h"
++
++namespace icamera {
++#define MAX_DVS_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
++
++struct DvsInitParams {
++    ia_binary_data base;
++    unsigned char data[MAX_DVS_DATA_SIZE];
++    uintptr_t cmcHandle;
++
++    // the below is returned
++    uintptr_t dvsHandle;
++};
++
++struct DvsDeinitParams {
++    uintptr_t dvsHandle;
++};
++
++struct DvsConfigParams {
++    uintptr_t dvsHandle;
++    ia_dvs_configuration configData;
++    float zoomRatio;
++};
++
++struct DvsNoneBlankRatioParams {
++    uintptr_t dvsHandle;
++    float nonBlankingRatio;
++};
++
++struct DvsDigitalZoomMode {
++    uintptr_t dvsHandle;
++    ia_dvs_zoom_mode zoomMode;
++};
++
++struct DvsDigitalZoomRegion {
++    uintptr_t dvsHandle;
++    ia_rectangle zoomRegion;
++};
++
++struct DvsDigitalZoomCoordinate {
++    uintptr_t dvsHandle;
++    ia_coordinate zoomCoordinate;
++};
++
++struct DvsDigitalZoomMagnitude {
++    uintptr_t dvsHandle;
++    float zoomRatio;
++};
++
++struct DvsFreeMorphParams {
++    uintptr_t dvsHandle;
++    uintptr_t morphHandle;
++};
++
++struct DvsMorphParams {
++    uintptr_t dvsHandle;
++    uintptr_t morphHandle;  // save remote morph table pointer
++
++    ia_dvs_morph_table morphTable;  // used by client
++    uint32_t xcoordsY[MAX_DVS_COORDS_Y_SIZE];
++    uint32_t ycoordsY[MAX_DVS_COORDS_Y_SIZE];
++    uint32_t xcoordsUV[MAX_DVS_COORDS_UV_SIZE];
++    uint32_t ycoordsUV[MAX_DVS_COORDS_UV_SIZE];
++    float xcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
++    float ycoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
++};
++
++struct DvsExecute {
++    uintptr_t dvsHandle;
++    uint16_t focusPosition;
++};
++
++struct DvsImageTransformation {
++    uintptr_t dvsHandle;
++    ia_dvs_image_transformation imageTransformation;
++};
++
++#define MAX_MOTION_SENSOR_COUNT_DVS 100
++struct DvsSensorEvents {
++    ia_aiq_sensor_data accelerometer_events[MAX_MOTION_SENSOR_COUNT_DVS];
++    ia_aiq_sensor_data gravity_events[MAX_MOTION_SENSOR_COUNT_DVS];
++    ia_aiq_sensor_data gyroscope_events[MAX_MOTION_SENSOR_COUNT_DVS];
++    ia_aiq_ambient_light_events ambient_light_events[MAX_MOTION_SENSOR_COUNT_DVS];
++    ia_aiq_dmd_sensor_events dmd_events[MAX_MOTION_SENSOR_COUNT_DVS];
++};
++
++#define MV_ENTRIE_COUNT 5000
++struct DvsStatistcs {
++    uintptr_t dvsHandle;
++
++    bool statisticsFlag;
++    ia_dvs_statistics statistics;
++    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
++
++    bool aeResultsFlag;
++    ae_run_params_results aeResultsBase;
++
++    bool afResultsFlag;
++    ia_aiq_af_results afResultsBase;
++
++    bool sensorEventsFlag;
++    ia_aiq_sensor_events sensorEventsBase;
++    DvsSensorEvents sensorEvents;
++
++    uint64_t frameReadoutStart;
++    uint64_t frameReadoutEnd;
++};
++
++class IPCIntelDvs {
++ public:
++    IPCIntelDvs();
++    ~IPCIntelDvs();
++
++    // for DvsInitParams
++    bool clientFlattenInit(void* pData, unsigned int size, const ia_binary_data* dvsDataPtr,
++                           const ia_cmc_t* cmc);
++    bool serverUnflattenInit(void* pData, int size, ia_binary_data** dvsDataPtr, ia_cmc_t** cmc);
++    bool serverFlattenInit(void* pData, unsigned int size, ia_dvs_state* dvs);
++    bool clientUnflattenInit(const void* pData, unsigned int size, ia_dvs_state** dvs);
++
++    // for DvsDeinitParams
++    bool clientFlattenDeinit(void* pData, unsigned int size, ia_dvs_state* dvs);
++    bool serverUnflattenDeinit(const void* pData, unsigned int size, ia_dvs_state** dvs);
++
++    // for DvsConfigParams
++    bool clientFlattenConfig(void* pData, unsigned int size, ia_dvs_state* dvs,
++                             const ia_dvs_configuration* config, float zoomRatio);
++    bool serverUnflattenConfig(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                               ia_dvs_configuration** config, float* zoomRatio);
++
++    // for DvsNoneBlankRatioParams
++    bool clientFlattenNoneBlanckRation(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                       float nonBlankingRatio);
++    bool serverUnflattenNoneBlanckRation(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                         float* nonBlankingRatio);
++
++    // for DvsDigitalZoomMode
++    bool clientFlattenDigitalZoomMode(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                      ia_dvs_zoom_mode zoomMode);
++    bool serverUnflattenDigitalZoomMode(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                        ia_dvs_zoom_mode* zoomMode);
++
++    // for DvsDigitalZoomRegion
++    bool clientFlattenDigitalZoomRegion(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                        ia_rectangle* zoomRegion);
++    bool serverUnflattenDigitalZoomRegion(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                          ia_rectangle** zoomRegion);
++
++    // for DvsDigitalZoomCoordinate
++    bool clientFlattenDigitalZoomCoordinate(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                            ia_coordinate* zoomCoordinate);
++    bool serverUnflattenDigitalZoomCoordinate(const void* pData, unsigned int size,
++                                              ia_dvs_state** dvs, ia_coordinate** zoomCoordinate);
++
++    // for DvsDigitalZoomMagnitude
++    bool clientFlattenDigitalZoomMagnitude(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                           float zoomRatio);
++    bool serverUnflattenDigitalZoomMagnitude(const void* pData, unsigned int size,
++                                             ia_dvs_state** dvs, float* zoomRatio);
++
++    // for DvsFreeMorphParams
++    bool clientFlattenFreeMorphTable(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                     ia_dvs_morph_table* morphTable);
++    bool serverUnflattenFreeMorphTable(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                       ia_dvs_morph_table** morphTable);
++
++    // for DvsMorphParams
++    bool clientFlattenAllocateMorphTable(void* pData, unsigned int size, ia_dvs_state* dvs);
++    bool serverUnflattenAllocateMorphTalbe(const void* pData, unsigned int size,
++                                           ia_dvs_state** dvs);
++    bool serverFlattenAllocateMorphTalbe(void* pData, unsigned int size,
++                                         ia_dvs_morph_table* morphTable);
++    bool clientUnflattenAllocateMorphTalbe(const void* pData, unsigned int size,
++                                           ia_dvs_morph_table** morphTable);
++    bool clientFlattenGetMorphTable(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                    ia_dvs_morph_table* morphTable);
++    bool serverUnflattenGetMorphTalbe(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                      ia_dvs_morph_table** morphTable);
++    bool serverFlattenGetMorphTalbe(void* pData, unsigned int size, ia_dvs_morph_table* morphTable);
++    bool clientUnflattenGetMorphTalbe(void* pData, unsigned int size,
++                                      ia_dvs_morph_table** morphTable);
++    bool unflattenMorphTalbe(DvsMorphParams* params);
++    bool flattenMorphTable(const ia_dvs_morph_table* morphTable, DvsMorphParams* params);
++
++    // for DvsStatistcs
++    bool clientFlattenSetStatistics(void* pData, unsigned int size, ia_dvs_state* dvs,
++                                    const ia_dvs_statistics* statistics,
++                                    const ia_aiq_ae_results* aeResults,
++                                    const ia_aiq_af_results* afResults,
++                                    const ia_aiq_sensor_events* sensorEvents,
++                                    uint64_t frameReadoutStart, uint64_t frameReadoutEnd);
++    bool serverUnflattenSetStatistics(void* pData, unsigned int size, ia_dvs_state** dvs,
++                                      ia_dvs_statistics** statistics, ia_aiq_ae_results** aeResults,
++                                      ia_aiq_af_results** afResults,
++                                      ia_aiq_sensor_events** sensorEvents,
++                                      uint64_t* frameReadoutStart, uint64_t* frameReadoutEnd);
++
++    // for DvsExecute
++    bool clientFlattenExecute(void* pData, unsigned int size, ia_dvs_state* dvs,
++                              uint16_t focusPosition);
++    bool serverUnflattenExecute(const void* pData, unsigned int size, ia_dvs_state** dvs,
++                                uint16_t* focusPosition);
++
++    // for DvsImageTransformation
++    bool clientFlattenImageTransformation(void* pData, unsigned int size, ia_dvs_state* dvs);
++    bool serverUnflattenImageTransformation(void* pData, unsigned int size, ia_dvs_state** dvs);
++    bool serverFlattenImageTransformation(void* pData, unsigned int size,
++                                          ia_dvs_image_transformation* imageTransformation);
++    bool clientUnflattenImageTransformation(const void* pData, unsigned int size,
++                                            ia_dvs_image_transformation** imageTransformation);
++
++ private:
++    IPCIntelAiq mIpcAiq;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
+new file mode 100644
+index 000000000000..825d07269d40
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_FACE_DETECTION"
++
++#include "modules/sandboxing/IPCIntelFD.h"
++
++#include "CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIntelFD::IPCIntelFD() {
++    LOG1("@%s", __func__);
++}
++
++IPCIntelFD::~IPCIntelFD() {
++    LOG1("@%s", __func__);
++}
++
++bool IPCIntelFD::clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams* params) {
++    LOG1("@%s, params:%p", __func__, params);
++    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
++
++    params->max_face_num = max_face_num;
++
++    return true;
++}
++
++bool IPCIntelFD::serverUnflattenRun(const FaceDetectionRunParams& inParams, void* imageData,
++                                    pvl_image* image) {
++    LOG1("@%s, image:%p", __func__, image);
++    CheckError(image == nullptr, false, "@%s, iamge is nullptr", __func__);
++
++    image->size = inParams.size;
++    image->width = inParams.width;
++    image->height = inParams.height;
++    image->format = inParams.format;
++    image->stride = inParams.stride;
++    image->rotation = inParams.rotation;
++
++    if (imageData) {
++        image->data = const_cast<uint8_t*>(static_cast<uint8_t*>(imageData));
++    } else {
++        image->data = const_cast<uint8_t*>(inParams.data);
++    }
++
++    return true;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
+new file mode 100644
+index 000000000000..ebfabfa07620
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "FaceBase.h"
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++class IPCIntelFD {
++ public:
++    IPCIntelFD();
++    virtual ~IPCIntelFD();
++
++    bool clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams* params);
++    bool serverUnflattenRun(const FaceDetectionRunParams& inParams, void* imageData,
++                            pvl_image* image);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
+new file mode 100644
+index 000000000000..f3b3e1c40bd4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
+@@ -0,0 +1,298 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_INTEL_LARD"
++
++#include "modules/sandboxing/IPCIntelLard.h"
++
++#include <ia_types.h>
++
++#include "CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIntelLard::IPCIntelLard() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelLard::~IPCIntelLard() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIntelLard::clientFlattenInit(void* pData, unsigned int size,
++                                     const ia_binary_data* lard_data_ptr) {
++    LOGIPC("@%s, pData:%p, size:%d, lard_data_ptr:%p", __func__, pData, size, lard_data_ptr);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard_data_ptr, false, "@%s, lard_data_ptr is nullptr", __func__);
++
++    lard_init_params* params = static_cast<lard_init_params*>(pData);
++    params->base = *lard_data_ptr;
++
++    CheckError(params->base.size > MAX_LARD_DATA_SIZE, false, "@%s, data:%d is too small", __func__,
++               params->base.size);
++    MEMCPY_S(params->data, MAX_LARD_DATA_SIZE, params->base.data, params->base.size);
++
++    return true;
++}
++
++bool IPCIntelLard::serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr) {
++    LOGIPC("@%s, pData:%p, size:%d, binaryData:%p", __func__, pData, size, lard_data_ptr);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard_data_ptr, false, "@%s, binaryData is nullptr", __func__);
++
++    lard_init_params* params = static_cast<lard_init_params*>(pData);
++    params->base.data = static_cast<void*>(params->data);
++    *lard_data_ptr = params->base;
++
++    return true;
++}
++
++bool IPCIntelLard::serverFlattenInit(void* pData, int size, ia_lard* lard) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++
++    lard_init_params* params = static_cast<lard_init_params*>(pData);
++
++    params->results = reinterpret_cast<uintptr_t>(lard);
++
++    return true;
++}
++
++bool IPCIntelLard::clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++
++    lard_init_params* params = static_cast<lard_init_params*>(pData);
++    *lard = reinterpret_cast<ia_lard*>(params->results);
++
++    return true;
++}
++
++bool IPCIntelLard::clientFlattenGetTagList(void* pData, unsigned int size, ia_lard* lard,
++                                           unsigned int mode_tag) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%d", __func__, pData, size, lard, mode_tag);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++
++    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
++    params->lard = reinterpret_cast<uintptr_t>(lard);
++    params->mode_tag = mode_tag;
++
++    return true;
++}
++
++bool IPCIntelLard::serverUnflattenGetTagList(void* pData, unsigned int size, ia_lard** lard,
++                                             unsigned int* mode_tag) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%p", __func__, pData, size, lard, mode_tag);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++    CheckError(!mode_tag, false, "@%s, mode_tag is nullptr", __func__);
++
++    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
++    *lard = reinterpret_cast<ia_lard*>(params->lard);
++    *mode_tag = params->mode_tag;
++
++    return true;
++}
++
++bool IPCIntelLard::serverFlattenGetTagList(void* pData, unsigned int size, unsigned int num_tags,
++                                           const unsigned int* tags) {
++    LOGIPC("@%s, pData:%p, size:%d, num_tags:%d, tags:%p", __func__, pData, size, num_tags, tags);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
++    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
++
++    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
++    int tagsSize = num_tags * sizeof(unsigned int);
++
++    CheckError(tagsSize > MAX_LARD_DATA_SIZE, false, "@%s, tags:%d is small", __func__, tagsSize);
++    switch (params->mode_tag) {
++        case LCMC_TAG:
++            params->num_cmc_tags = num_tags;
++            MEMCPY_S(params->cmc_tags_list, tagsSize, tags, tagsSize);
++            break;
++        case LAIQ_TAG:
++            params->num_aiq_tags = num_tags;
++            MEMCPY_S(params->aiq_tags_list, tagsSize, tags, tagsSize);
++            break;
++        case LISP_TAG:
++            params->num_isp_tags = num_tags;
++            MEMCPY_S(params->isp_tags_list, tagsSize, tags, tagsSize);
++            break;
++        case LTHR_TAG:
++            params->num_others_tags = num_tags;
++            MEMCPY_S(params->others_tags_list, tagsSize, tags, tagsSize);
++            break;
++        default:
++            return false;
++    }
++
++    return true;
++}
++
++bool IPCIntelLard::clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
++                                             unsigned int* num_tags, const unsigned int** tags) {
++    LOGIPC("@%s, pData:%p, size:%d, mode_tag:%d, num_tags:%p, tags:%p", __func__, pData, size,
++           mode_tag, num_tags, tags);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
++    CheckError(!num_tags, false, "@%s, num_tags is nullptr", __func__);
++    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
++
++    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
++
++    switch (mode_tag) {
++        case LCMC_TAG:
++            *num_tags = params->num_cmc_tags;
++            *tags = params->cmc_tags_list;
++            break;
++        case LAIQ_TAG:
++            *num_tags = params->num_aiq_tags;
++            *tags = params->aiq_tags_list;
++            break;
++        case LISP_TAG:
++            *num_tags = params->num_isp_tags;
++            *tags = params->isp_tags_list;
++            break;
++        case LTHR_TAG:
++            *num_tags = params->num_others_tags;
++            *tags = params->others_tags_list;
++            break;
++        default:
++            return false;
++    }
++
++    return true;
++}
++
++bool IPCIntelLard::clientFlattenRun(void* pData, unsigned int size, ia_lard* lard,
++                                    ia_lard_input_params* inputParams) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__, pData, size, lard,
++           inputParams);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
++
++    lard_run_params* params = static_cast<lard_run_params*>(pData);
++    params->lard = reinterpret_cast<uintptr_t>(lard);
++    params->inputParams = *inputParams;
++
++    return true;
++}
++
++bool IPCIntelLard::serverUnflattenRun(void* pData, unsigned int size, ia_lard** lard,
++                                      ia_lard_input_params** inputParams) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__, pData, size, lard,
++           inputParams);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
++
++    lard_run_params* params = static_cast<lard_run_params*>(pData);
++    *lard = reinterpret_cast<ia_lard*>(params->lard);
++    *inputParams = &params->inputParams;
++
++    return true;
++}
++
++bool IPCIntelLard::serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result) {
++    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
++    CheckError(!result, false, "@%s, result is nullptr", __func__);
++
++    lard_run_params* params = static_cast<lard_run_params*>(pData);
++
++    lard_run_params_results* results = &params->results;
++    ia_lard_results* base = &results->base;
++    *base = *result;
++
++    CheckError(base->aiqb_cmc_data.size > MAX_LARD_DATA_SIZE, false, "@%s, cmc:%d is too big",
++               __func__, base->aiqb_cmc_data.size);
++    CheckError(base->aiqb_aiq_data.size > MAX_LARD_DATA_SIZE, false, "@%s, aiq:%d is too big",
++               __func__, base->aiqb_aiq_data.size);
++    CheckError(base->aiqb_isp_data.size > MAX_LARD_DATA_SIZE, false, "@%s, isp:%d is too big",
++               __func__, base->aiqb_isp_data.size);
++    CheckError(base->aiqb_other_data.size > MAX_LARD_DATA_SIZE, false, "@%s, other:%d is too big",
++               __func__, base->aiqb_other_data.size);
++
++    MEMCPY_S(results->cmc_tags_list, MAX_LARD_DATA_SIZE, base->aiqb_cmc_data.data,
++             base->aiqb_cmc_data.size);
++    MEMCPY_S(results->aiq_tags_list, MAX_LARD_DATA_SIZE, base->aiqb_aiq_data.data,
++             base->aiqb_aiq_data.size);
++    MEMCPY_S(results->isp_tags_list, MAX_LARD_DATA_SIZE, base->aiqb_isp_data.data,
++             base->aiqb_isp_data.size);
++    MEMCPY_S(results->others_tags_list, MAX_LARD_DATA_SIZE, base->aiqb_other_data.data,
++             base->aiqb_other_data.size);
++
++    return true;
++}
++
++bool IPCIntelLard::clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result) {
++    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
++    CheckError(!result, false, "@%s, result is nullptr", __func__);
++
++    lard_run_params* params = static_cast<lard_run_params*>(pData);
++    lard_run_params_results* results = &params->results;
++    ia_lard_results* base = &results->base;
++
++    base->aiqb_cmc_data.data = results->cmc_tags_list;
++    base->aiqb_aiq_data.data = results->aiq_tags_list;
++    base->aiqb_isp_data.data = results->isp_tags_list;
++    base->aiqb_other_data.data = results->others_tags_list;
++
++    *result = base;
++
++    return true;
++}
++
++bool IPCIntelLard::clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++
++    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
++    params->lard = reinterpret_cast<uintptr_t>(lard);
++
++    return true;
++}
++
++bool IPCIntelLard::serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard) {
++    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
++    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
++
++    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
++    *lard = reinterpret_cast<ia_lard*>(params->lard);
++
++    return true;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
+new file mode 100644
+index 000000000000..eb6a94696906
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_lard.h>
++
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++
++#define MAX_LARD_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
++
++struct lard_init_params {
++    ia_binary_data base;
++    unsigned char data[MAX_LARD_DATA_SIZE];
++
++    // the below is returned
++    uintptr_t results;
++};
++
++struct lard_get_tag_list_params {
++    uintptr_t lard;
++    unsigned int mode_tag;
++
++    // the below is returned
++    unsigned int num_cmc_tags;
++    unsigned int num_aiq_tags;
++    unsigned int num_isp_tags;
++    unsigned int num_others_tags;
++    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
++};
++
++struct lard_run_params_results {
++    ia_lard_results base;
++
++    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
++    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
++};
++
++struct lard_run_params {
++    uintptr_t lard;
++    ia_lard_input_params inputParams;
++
++    // the below is returned
++    lard_run_params_results results;
++};
++
++struct lard_deinit_params {
++    uintptr_t lard;
++};
++
++class IPCIntelLard {
++ public:
++    IPCIntelLard();
++    virtual ~IPCIntelLard();
++
++    // for ia_lard_init
++    bool clientFlattenInit(void* pData, unsigned int size, const ia_binary_data* lard_data_ptr);
++    bool serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr);
++    bool serverFlattenInit(void* pData, int size, ia_lard* lard);
++    bool clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard);
++
++    // for ia_lard_get_tag_list
++    bool clientFlattenGetTagList(void* pData, unsigned int size, ia_lard* lard,
++                                 unsigned int mode_tag);
++    bool serverUnflattenGetTagList(void* pData, unsigned int size, ia_lard** lard,
++                                   unsigned int* mode_tag);
++    bool serverFlattenGetTagList(void* pData, unsigned int size, unsigned int num_tags,
++                                 const unsigned int* tags);
++    bool clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
++                                   unsigned int* num_tags, const unsigned int** tags);
++
++    // ia_lard_run
++    bool clientFlattenRun(void* pData, unsigned int size, ia_lard* lard,
++                          ia_lard_input_params* inputParams);
++    bool serverUnflattenRun(void* pData, unsigned int size, ia_lard** lard,
++                            ia_lard_input_params** inputParams);
++    bool serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result);
++    bool clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result);
++
++    // ia_lard_deinit
++    bool clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard);
++    bool serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
+new file mode 100644
+index 000000000000..6918c2b4e7d0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
+@@ -0,0 +1,331 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_INTEL_LTM"
++
++#include "modules/sandboxing/IPCIntelLtm.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIntelLtm::IPCIntelLtm() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelLtm::~IPCIntelLtm() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIntelLtm::clientFlattenInit(const ia_binary_data& inData, uintptr_t mkn_hanlde,
++                                    LtmInitParams* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
++    params->binary_data.data = params->data;
++    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
++    params->binary_data.size = inData.size;
++    params->mkn_handle = mkn_hanlde;
++
++    return true;
++}
++
++bool IPCIntelLtm::serverUnflattenInit(LtmInitParams* params, ia_binary_data* inData,
++                                      uintptr_t* mkn_hanlde) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!inData, false, "@%s, inData is nullptr", __func__);
++    CheckError(!mkn_hanlde, false, "@%s, mkn_hanlde is nullptr", __func__);
++
++    params->binary_data.data = params->data;
++    *inData = params->binary_data;
++    *mkn_hanlde = params->mkn_handle;
++
++    return true;
++}
++
++bool IPCIntelLtm::serverFlattenInit(LtmInitParams* params, ia_ltm* ltm_handle) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
++
++    params->results = reinterpret_cast<uintptr_t>(ltm_handle);
++
++    return true;
++}
++
++bool IPCIntelLtm::clientUnflattenInit(LtmInitParams* params, ia_ltm** ltm_handle) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
++
++    *ltm_handle = reinterpret_cast<ia_ltm*>(params->results);
++    return true;
++}
++
++int IPCIntelLtm::deepCopyAeResults(const ia_aiq_ae_results& src, LtmInputAeResult* params) {
++    LOGIPC("@%s", __func__);
++
++    params->aeResultsBase = src;
++
++    if (src.exposures) {
++        CheckError(src.num_exposures > MAX_NUM_EXPOSURES_LTM, BAD_VALUE,
++                   "exposure buffer is small");
++        for (unsigned int i = 0; i < src.num_exposures; i++) {
++            params->exposures[i].exposure_index = src.exposures[i].exposure_index;
++            params->exposures[i].distance_from_convergence =
++                src.exposures[i].distance_from_convergence;
++            params->exposures[i].converged = src.exposures[i].converged;
++            if (src.exposures[i].exposure) {
++                params->exposure[i] = *src.exposures[i].exposure;
++            }
++            if (src.exposures[i].sensor_exposure) {
++                params->sensor_exposure[i] = *src.exposures[i].sensor_exposure;
++            }
++            params->exposures[i].num_exposure_plan = src.exposures[i].num_exposure_plan;
++            if (src.exposures[i].exposure_plan_ids) {
++                CheckError(src.exposures[i].num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS_LTM,
++                           BAD_VALUE, "exposures[%d].exposure_plan_ids buffer is small", i);
++                MEMCPY_S(params->exposure_plan_ids[i],
++                         MAX_NUM_OF_EXPOSURE_PLANS_LTM * sizeof(unsigned int),
++                         src.exposures[i].exposure_plan_ids,
++                         src.exposures[i].num_exposure_plan * sizeof(unsigned int));
++            }
++        }
++    }
++
++    if (src.weight_grid) {
++        params->weightGrid = *src.weight_grid;
++        unsigned int gridElements = src.weight_grid->width * src.weight_grid->height;
++        CheckError(MAX_SIZE_WEIGHT_GRID_LTM < gridElements, false, "weight_grid buffer is small");
++        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID_LTM * sizeof(char), src.weight_grid->weights,
++                 gridElements * sizeof(char));
++    }
++
++    if (src.flashes) {
++        CheckError(src.num_flashes > MAX_NUM_FLASHES_LTM, BAD_VALUE, "flash buffer is small");
++        MEMCPY_S(params->flashes, MAX_NUM_FLASHES_LTM * sizeof(ia_aiq_flash_parameters),
++                 src.flashes, src.num_flashes * sizeof(ia_aiq_flash_parameters));
++    }
++
++    if (src.aperture_control) {
++        params->apertureControl = *src.aperture_control;
++    }
++    return OK;
++}
++
++int IPCIntelLtm::deepCopyRgbsGridData(const ia_aiq_rgbs_grid& src, ia_aiq_rgbs_grid* dst) {
++    LOGIPC("%s", __func__);
++
++    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0, BAD_VALUE,
++               "Failed to deep copy Rgbs grid data - invalid source");
++    CheckError(!dst || !dst->blocks_ptr, BAD_VALUE,
++               "Failed to deep copy Rgbs grid data - invalid destination");
++
++    size_t gridSize = src.grid_width * src.grid_height;
++    size_t gridSizeLocal = MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS;
++    CheckError(gridSizeLocal < gridSize, false, "rgbs_grid buffer is small");
++    dst->grid_width = src.grid_width;
++    dst->grid_height = src.grid_height;
++    dst->shading_correction = src.shading_correction;
++    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(rgbs_grid_block), src.blocks_ptr,
++             gridSize * sizeof(rgbs_grid_block));
++
++    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
++    return OK;
++}
++
++int IPCIntelLtm::deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid& src,
++                                         ia_aiq_hdr_rgbs_grid* dst) {
++    LOGIPC("%s", __func__);
++
++    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0, BAD_VALUE,
++               "Failed to deep copy HDR Rgbs grid data - invalid source");
++    CheckError(!dst || !dst->blocks_ptr, BAD_VALUE,
++               "Failed to deep copy HDR Rgbs grid data - invalid destination");
++
++    size_t gridSize = src.grid_width * src.grid_height;
++    size_t gridSizeLocal = BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT;
++    CheckError(gridSizeLocal < gridSize, false, "hdr_rgbs_grid buffer is small");
++
++    dst->grid_width = src.grid_width;
++    dst->grid_height = src.grid_height;
++    dst->grid_data_bit_depth = src.grid_data_bit_depth;
++    dst->shading_correction = src.shading_correction;
++    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(hdr_rgbs_grid_block), src.blocks_ptr,
++             gridSize * sizeof(hdr_rgbs_grid_block));
++
++    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
++    return OK;
++}
++
++bool IPCIntelLtm::clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params& ltmParams,
++                                   int imageDataSize, void* paramsAddr) {
++    LOGIPC("@%s, paramsAddr:%p", __func__, paramsAddr);
++    CheckError(!paramsAddr, false, "@%s, paramsAddr is nullptr", __func__);
++
++    LtmRunParams* params = static_cast<LtmRunParams*>(paramsAddr);
++    params->ltm_handle = ltm;
++    params->inputParamsBase = ltmParams;
++    LtmRunInputParams* inputParams = &params->inputParams;
++
++    int ret = UNKNOWN_ERROR;
++    if (ltmParams.ae_results) {
++        ret = deepCopyAeResults(*ltmParams.ae_results, &inputParams->aeResult);
++        CheckError(ret != OK, false, "@%s, Failed to deepCopyAeResult", __func__);
++    }
++
++    if (ltmParams.yv_grid) {
++        MEMCPY_S(&inputParams->yvGrid, sizeof(ia_isp_bxt_hdr_yv_grid_t), ltmParams.yv_grid,
++                 sizeof(ia_isp_bxt_hdr_yv_grid_t));
++    }
++
++    if (ltmParams.rgbs_grid_ptr) {
++        inputParams->rgbsGrid.rgbsGridbase.blocks_ptr = inputParams->rgbsGrid.blocks;
++        ret = deepCopyRgbsGridData(*ltmParams.rgbs_grid_ptr, &inputParams->rgbsGrid.rgbsGridbase);
++        CheckError(ret != OK, false, "@%s, Failed to deepCopyRgbsGridData", __func__);
++    }
++
++    if (ltmParams.hdr_rgbs_grid_ptr) {
++        inputParams->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = inputParams->hdrRgbsGrid.blocks;
++        ret = deepCopyHdrRgbsGridData(*ltmParams.hdr_rgbs_grid_ptr,
++                                      &inputParams->hdrRgbsGrid.hdrRgbsGridBase);
++        CheckError(ret != OK, false, "@%s, Failed to deepCopyHdrRgbsGridData", __func__);
++    }
++
++    if (ltmParams.input_image_ptr) {
++        inputParams->inputImage = *ltmParams.input_image_ptr;
++        if (ltmParams.input_image_ptr->image_data) {
++            CheckError(imageDataSize < ltmParams.input_image_ptr->image_data->size, false,
++                       "image_data buffer is small");
++            CheckError(ltmParams.input_image_ptr->image_data->size != 0 &&
++                           !ltmParams.input_image_ptr->image_data->data,
++                       false, "image_data error");
++            inputParams->imageData = *ltmParams.input_image_ptr->image_data;
++            void* imageData =
++                static_cast<void*>(static_cast<char*>(paramsAddr) + sizeof(LtmRunParams));
++            MEMCPY_S(imageData, imageDataSize, ltmParams.input_image_ptr->image_data->data,
++                     ltmParams.input_image_ptr->image_data->size);
++        }
++    }
++
++    if (ltmParams.gtm_input_params_ptr) {
++        MEMCPY_S(&inputParams->gtmInputParams, sizeof(ia_ltm_gtm_input_params),
++                 ltmParams.gtm_input_params_ptr, sizeof(ia_ltm_gtm_input_params));
++    }
++
++    return true;
++}
++
++bool IPCIntelLtm::serverUnflattenRun(void* pData, ia_ltm** ltm, ia_ltm_input_params** inputParams) {
++    LOGIPC("@%s, pData:%p", __func__, pData);
++    CheckError(!pData, false, "@%s, params is nullptr", __func__);
++    CheckError(!ltm, false, "@%s, ltm is nullptr", __func__);
++    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
++
++    LtmRunParams* params = static_cast<LtmRunParams*>(pData);
++    LtmRunInputParams* paramsTmp = &params->inputParams;
++    if (params->inputParamsBase.ae_results) {
++        LtmInputAeResult* aeResult = &paramsTmp->aeResult;
++        params->inputParamsBase.ae_results = &aeResult->aeResultsBase;
++        if (aeResult->aeResultsBase.exposures) {
++            aeResult->aeResultsBase.exposures = aeResult->exposures;
++            for (unsigned int i = 0; i < aeResult->aeResultsBase.num_exposures; i++) {
++                if (aeResult->exposures[i].exposure) {
++                    aeResult->exposures[i].exposure = &aeResult->exposure[i];
++                }
++                if (aeResult->exposures[i].sensor_exposure) {
++                    aeResult->exposures[i].sensor_exposure = &aeResult->sensor_exposure[i];
++                }
++                if (aeResult->exposures[i].exposure_plan_ids) {
++                    aeResult->exposures[i].exposure_plan_ids = aeResult->exposure_plan_ids[i];
++                }
++            }
++        }
++
++        if (aeResult->aeResultsBase.weight_grid) {
++            aeResult->aeResultsBase.weight_grid = &aeResult->weightGrid;
++            aeResult->weightGrid.weights = aeResult->weights;
++        }
++
++        if (aeResult->aeResultsBase.flashes) {
++            aeResult->aeResultsBase.flashes = aeResult->flashes;
++        }
++        if (aeResult->aeResultsBase.aperture_control) {
++            aeResult->aeResultsBase.aperture_control = &aeResult->apertureControl;
++        }
++    }
++
++    if (params->inputParamsBase.yv_grid) {
++        params->inputParamsBase.yv_grid = &paramsTmp->yvGrid;
++    }
++
++    if (params->inputParamsBase.rgbs_grid_ptr) {
++        paramsTmp->rgbsGrid.rgbsGridbase.blocks_ptr = paramsTmp->rgbsGrid.blocks;
++        params->inputParamsBase.rgbs_grid_ptr = &paramsTmp->rgbsGrid.rgbsGridbase;
++    }
++
++    if (params->inputParamsBase.hdr_rgbs_grid_ptr) {
++        paramsTmp->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = paramsTmp->hdrRgbsGrid.blocks;
++        params->inputParamsBase.hdr_rgbs_grid_ptr = &paramsTmp->hdrRgbsGrid.hdrRgbsGridBase;
++    }
++
++    if (params->inputParamsBase.input_image_ptr) {
++        params->inputParamsBase.input_image_ptr = &paramsTmp->inputImage;
++        if (paramsTmp->inputImage.image_data) {
++            paramsTmp->inputImage.image_data = &paramsTmp->imageData;
++            if (paramsTmp->imageData.size != 0) {
++                const_cast<ia_binary_data*>(paramsTmp->inputImage.image_data)->data =
++                    static_cast<void*>(static_cast<char*>(pData) + sizeof(LtmRunParams));
++            }
++        }
++    }
++
++    if (params->inputParamsBase.gtm_input_params_ptr) {
++        params->inputParamsBase.gtm_input_params_ptr = &paramsTmp->gtmInputParams;
++    }
++
++    *ltm = reinterpret_cast<ia_ltm*>(params->ltm_handle);
++    *inputParams = &params->inputParamsBase;
++
++    return true;
++}
++
++bool IPCIntelLtm::serverFlattenRun(const ia_ltm_results& ltmResults,
++                                   const ia_ltm_drc_params& drcResults, ia_ltm* ltm_handle,
++                                   LtmRunParams* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    MEMCPY_S(&params->ltmResult, sizeof(ia_ltm_results), &ltmResults, sizeof(ia_ltm_results));
++    MEMCPY_S(&params->drcResult, sizeof(ia_ltm_drc_params), &drcResults, sizeof(ia_ltm_results));
++
++    return true;
++}
++
++bool IPCIntelLtm::clientUnflattenRun(LtmRunParams* params, ia_ltm_results** ltmResults,
++                                     ia_ltm_drc_params** drcResults) {
++    LOGIPC("@%s", __func__);
++    CheckError(!params, false, "@%s, params is nullptr", __func__);
++
++    *ltmResults = &params->ltmResult;
++    *drcResults = &params->drcResult;
++    return true;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
+new file mode 100644
+index 000000000000..9d5d3c590fc4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
+@@ -0,0 +1,117 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_ltm.h>
++
++#include "IPCCommon.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++struct LtmInitParams {
++    ia_binary_data binary_data;
++    unsigned char data[MAX_IA_BINARY_DATA_SIZE];
++    uintptr_t mkn_handle;
++    uintptr_t results;
++};
++
++struct LtmDeinitParams {
++    uintptr_t ltm_handle;
++};
++
++#define MAX_NUM_EXPOSURES_LTM 10
++#define MAX_NUM_FLASHES_LTM 2
++#define MAX_NUM_OF_EXPOSURE_PLANS_LTM 4
++#define MAX_SIZE_WEIGHT_GRID_LTM 2048
++
++struct LtmInputAeResult {
++    ia_aiq_ae_results aeResultsBase;
++
++    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES_LTM];
++    ia_aiq_hist_weight_grid weightGrid;
++    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES_LTM];
++    ia_aiq_aperture_control apertureControl;
++
++    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
++    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES_LTM];
++    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES_LTM];
++    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES_LTM][MAX_NUM_OF_EXPOSURE_PLANS_LTM];
++
++    // the below is in ia_aiq_hist_weight_grid weight_grid;
++    unsigned char weights[MAX_SIZE_WEIGHT_GRID_LTM];
++};
++
++#define MAX_WIDTH_STATISTICS 24
++#define MAX_HEIGHT_STATISTICS 16
++struct LtmInputRgbSGrid {
++    ia_aiq_rgbs_grid rgbsGridbase;
++    rgbs_grid_block blocks[MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS];
++};
++
++#define BXT_RGBS_GRID_MAX_WIDTH 96
++#define BXT_RGBS_GRID_MAX_HEIGHT 72
++struct LtmInputHdrRgbsGrid {
++    ia_aiq_hdr_rgbs_grid hdrRgbsGridBase;
++    hdr_rgbs_grid_block blocks[BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT];
++};
++
++struct LtmRunInputParams {
++    LtmInputAeResult aeResult;
++    ia_isp_bxt_hdr_yv_grid_t yvGrid;
++    LtmInputRgbSGrid rgbsGrid;
++    LtmInputHdrRgbsGrid hdrRgbsGrid;
++    ia_ltm_input_image inputImage;
++    ia_binary_data imageData;
++    ia_ltm_gtm_input_params gtmInputParams;
++};
++
++struct LtmRunParams {
++    uintptr_t ltm_handle;
++    ia_ltm_input_params inputParamsBase;
++    LtmRunInputParams inputParams;
++
++    ia_ltm_results ltmResult;
++    ia_ltm_drc_params drcResult;
++};
++
++class IPCIntelLtm {
++ public:
++    IPCIntelLtm();
++    virtual ~IPCIntelLtm();
++
++    // for init
++    bool clientFlattenInit(const ia_binary_data& inData, uintptr_t mkn_hanlde,
++                           LtmInitParams* params);
++    bool serverUnflattenInit(LtmInitParams* params, ia_binary_data* inData, uintptr_t* mkn_hanlde);
++    bool serverFlattenInit(LtmInitParams* params, ia_ltm* ltm_handle);
++    bool clientUnflattenInit(LtmInitParams* params, ia_ltm** ltm_handle);
++
++    // for run
++    bool clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params& ltmParams, int imageDataSize,
++                          void* paramsAddr);
++    bool serverUnflattenRun(void* pData, ia_ltm** ltm, ia_ltm_input_params** inputParams);
++    bool serverFlattenRun(const ia_ltm_results& ltmResults, const ia_ltm_drc_params& drcResults,
++                          ia_ltm* ltm_handle, LtmRunParams* params);
++    bool clientUnflattenRun(LtmRunParams* params, ia_ltm_results** ltmResults,
++                            ia_ltm_drc_params** drcResults);
++
++ private:
++    int deepCopyAeResults(const ia_aiq_ae_results& src, LtmInputAeResult* params);
++    int deepCopyRgbsGridData(const ia_aiq_rgbs_grid& src, ia_aiq_rgbs_grid* dst);
++    int deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid& src, ia_aiq_hdr_rgbs_grid* dst);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
+new file mode 100644
+index 000000000000..f247fdec94bc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
+@@ -0,0 +1,79 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_INTEL_MKN"
++
++#include "modules/sandboxing/IPCIntelMkn.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++
++namespace icamera {
++IPCIntelMkn::IPCIntelMkn() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIntelMkn::~IPCIntelMkn() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIntelMkn::clientFlattenInit(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                                    size_t mkn_section_2_size, MknInitParams* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
++
++    params->mkn_config_bits = mkn_config_bits;
++    params->mkn_section_1_size = mkn_section_1_size;
++    params->mkn_section_2_size = mkn_section_2_size;
++
++    return true;
++}
++
++bool IPCIntelMkn::clientFlattenPrepare(uintptr_t mkn, ia_mkn_trg data_target,
++                                       MknPrepareParams* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
++
++    params->mkn_handle = mkn;
++    params->data_target = data_target;
++
++    return true;
++}
++
++bool IPCIntelMkn::clientUnflattenPrepare(MknPrepareParams* params, ia_binary_data* mknData) {
++    LOGIPC("@%s, mknData:%p", __func__, mknData);
++    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
++    CheckError(mknData == nullptr, false, "@%s, mknData is nullptr", __func__);
++
++    params->results.data = static_cast<void*>(params->data);
++    *mknData = params->results;
++
++    LOGIPC("@%s, mknData.size:%d", __func__, mknData->size);
++
++    return true;
++}
++
++bool IPCIntelMkn::serverFlattenPrepare(const ia_binary_data& inData, MknPrepareParams* params) {
++    LOGIPC("@%s, params:%p", __func__, params);
++    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
++    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
++
++    params->results.size = inData.size;
++    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
++
++    return true;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
+new file mode 100644
+index 000000000000..0e714a34afe7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
+@@ -0,0 +1,62 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_mkn_encoder.h>
++
++#include "IPCCommon.h"
++#include "iutils/Utils.h"
++
++struct MknInitParams {
++    ia_mkn_config_bits mkn_config_bits;
++    size_t mkn_section_1_size;
++    size_t mkn_section_2_size;
++    uintptr_t results;
++};
++
++struct MknPrepareParams {
++    uintptr_t mkn_handle;
++    ia_mkn_trg data_target;
++    ia_binary_data results;
++    char data[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
++};
++
++struct MknDeinitParams {
++    uintptr_t mkn_handle;
++};
++
++struct MknEnableParams {
++    uintptr_t mkn_handle;
++    bool enable_data_collection;
++};
++
++namespace icamera {
++class IPCIntelMkn {
++ public:
++    IPCIntelMkn();
++    virtual ~IPCIntelMkn();
++
++    // for init
++    bool clientFlattenInit(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                           size_t mkn_section_2_size, MknInitParams* params);
++
++    // for prepare
++    bool clientFlattenPrepare(uintptr_t mkn, ia_mkn_trg data_target, MknPrepareParams* params);
++    bool clientUnflattenPrepare(MknPrepareParams* params, ia_binary_data* mknData);
++    bool serverFlattenPrepare(const ia_binary_data& inData, MknPrepareParams* results);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
+new file mode 100644
+index 000000000000..68ebaf957f9a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
+@@ -0,0 +1,543 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPCIntelPGParam"
++
++#include "modules/sandboxing/IPCIntelPGParam.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++bool IPCIntelPGParam::clientFlattenInit(void* pData, int dataSize, int pgId, uintptr_t client,
++                                        ia_p2p_platform_t platform,
++                                        const PgConfiguration& pgConfig) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, dataSize is small", __func__);
++
++    pg_param_init_params* params = static_cast<pg_param_init_params*>(pData);
++    CheckError(pgConfig.pgManifestSize > sizeof(params->pgManifestData), false,
++               "@%s, manifest buffer is small", __func__);
++
++    params->pgId = pgId;
++    params->client = client;
++    params->platform = platform;
++
++    params->pgConfig.fragmentCount = pgConfig.fragmentCount;
++    params->pgConfig.inputMainFrame = pgConfig.inputMainFrame;
++    params->pgConfig.outputMainFrame = pgConfig.outputMainFrame;
++
++    params->pgConfig.pgManifestSize = pgConfig.pgManifestSize;
++    MEMCPY_S(params->pgManifestData, sizeof(params->pgManifestData), pgConfig.pgManifest,
++             pgConfig.pgManifestSize);
++
++    params->disableDataTermialsCount = pgConfig.disableDataTermials.size();
++    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
++               "@%s, disableDataTermials is big", __func__);
++    memset(params->disableDataTermialsData, -1, sizeof(params->disableDataTermialsData));
++    for (int i = 0; i < params->disableDataTermialsCount; i++) {
++        params->disableDataTermialsData[i] = pgConfig.disableDataTermials[i];
++    }
++
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenInit(void* pData, int dataSize, int* pgId, uintptr_t* client,
++                                          ia_p2p_platform_t* platform, PgConfiguration* pgConfig) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, buffer is small", __func__);
++    CheckError(!pgId || !client, false, "@%s, nullptr client", __func__);
++    CheckError(!platform || !pgConfig, false, "@%s, nullptr config", __func__);
++
++    pg_param_init_params* params = static_cast<pg_param_init_params*>(pData);
++    *pgId = params->pgId;
++    *client = params->client;
++    *platform = params->platform;
++
++    pgConfig->fragmentCount = params->pgConfig.fragmentCount;
++    pgConfig->inputMainFrame = params->pgConfig.inputMainFrame;
++    pgConfig->outputMainFrame = params->pgConfig.outputMainFrame;
++    pgConfig->pgManifestSize = params->pgConfig.pgManifestSize;
++    void* dataPtr = static_cast<void*>(params->pgManifestData);
++    pgConfig->pgManifest = static_cast<ia_css_program_group_manifest_t*>(dataPtr);
++
++    pgConfig->disableDataTermials.clear();
++    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
++               "@%s, disableDataTermials is big", __func__);
++    for (int i = 0; i < params->disableDataTermialsCount; i++) {
++        pgConfig->disableDataTermials.push_back(params->disableDataTermialsData[i]);
++    }
++
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
++                                           unsigned int ipuParamSize, int32_t ipuParamHandle,
++                                           const ia_css_rbm_t* rbm) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
++
++    pg_param_prepare_params* params = static_cast<pg_param_prepare_params*>(pData);
++    params->client = client;
++    params->ipuParamSize = ipuParamSize;
++    params->ipuParamHandle = ipuParamHandle;
++
++    if (rbm) {
++        params->rbm = &params->rbmData;
++        MEMCPY_S(&params->rbmData, sizeof(params->rbmData), rbm, sizeof(*rbm));
++    } else {
++        params->rbm = nullptr;
++    }
++
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client,
++                                             void* palDataAddr, ia_binary_data* ipuParameters,
++                                             ia_css_rbm_t** rbm, ia_css_kernel_bitmap_t** bitmap,
++                                             uint32_t** maxStatsSize) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++    CheckError(!ipuParameters || !rbm || !bitmap, false, "@%s, nullptr outputs", __func__);
++    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
++
++    pg_param_prepare_params* params = static_cast<pg_param_prepare_params*>(pData);
++    *client = params->client;
++    ipuParameters->size = params->ipuParamSize;
++    ipuParameters->data = palDataAddr;
++    *rbm = params->rbm ? &params->rbmData : nullptr;
++    *bitmap = &params->bitmapData;
++    if (maxStatsSize) *maxStatsSize = &params->maxStatsSize;
++    return true;
++}
++
++bool IPCIntelPGParam::clientUnflattenPrepare(const void* pData, int dataSize,
++                                             ia_css_kernel_bitmap_t* bitmap,
++                                             uint32_t* maxStatsSize) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
++    CheckError(!bitmap, false, "@%s, bitmap is nullptr", __func__);
++
++    const pg_param_prepare_params* params = static_cast<const pg_param_prepare_params*>(pData);
++    MEMCPY_S(bitmap, sizeof(*bitmap), &params->bitmapData, sizeof(params->bitmapData));
++
++    if (maxStatsSize) *maxStatsSize = params->maxStatsSize;
++    return true;
++}
++
++int IPCIntelPGParam::getTotalPGBufferSize(int pgSize) {
++    int size = sizeof(pg_param_allocate_pg_params);
++    size += PAGE_ALIGN(pgSize);
++    return size;
++}
++
++bool IPCIntelPGParam::assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < pgSize, false, "@%s, buffer is small", __func__);
++    CheckError(!pgBuffer, false, "@%s, payloads is nullptr", __func__);
++
++    uintptr_t pgAddr = reinterpret_cast<uintptr_t>(pData);
++    CheckError(pgAddr & ((getpagesize() - 1)), false, "@%s, pg addr is not aligned", __func__);
++    *pgBuffer = pData;
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenAllocatePGBuffer(void* pData, int dataSize, uintptr_t client,
++                                                    int pgSize) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    uintptr_t paramAddr =
++        reinterpret_cast<uintptr_t>(pData) + dataSize - sizeof(pg_param_allocate_pg_params);
++    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + pgSize, false,
++               "@%s, dataSize is small", __func__);
++
++    pg_param_allocate_pg_params* params = reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
++    params->client = client;
++    params->pgSize = pgSize;
++
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenAllocatePGBuffer(const void* pData, int dataSize,
++                                                      uintptr_t* client, int* pgSize) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_allocate_pg_params), false, "@%s, buffer is small",
++               __func__);
++    CheckError(!client || !pgSize, false, "@%s, nullptr input", __func__);
++
++    uintptr_t paramAddr =
++        reinterpret_cast<uintptr_t>(pData) + dataSize - sizeof(pg_param_allocate_pg_params);
++    pg_param_allocate_pg_params* params = reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
++    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + params->pgSize, false,
++               "@%s, dataSize is small", __func__);
++    *client = params->client;
++    *pgSize = params->pgSize;
++
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client,
++                                                int descCount) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
++               "@%s, dataSize is small", __func__);
++
++    pg_param_get_fragment_desc_params* params =
++        static_cast<pg_param_get_fragment_desc_params*>(pData);
++    CheckError(descCount > sizeof(params->descsData), false, "@%s, descCount is big", __func__);
++
++    params->client = client;
++    params->descCount = descCount;
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenGetFragDescs(void* pData, int dataSize, uintptr_t* client,
++                                                  int* descCount, ia_p2p_fragment_desc** descs) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
++               "@%s, dataSize is small", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++    CheckError(!descCount || !descs, false, "@%s, nullptr outputs", __func__);
++
++    pg_param_get_fragment_desc_params* params =
++        static_cast<pg_param_get_fragment_desc_params*>(pData);
++    *client = params->client;
++    *descCount = params->descCount;
++    *descs = params->descsData;
++    return true;
++}
++
++bool IPCIntelPGParam::serverFlattenGetFragDescs(void* pData, int dataSize, int count) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
++               "@%s, dataSize is small", __func__);
++
++    pg_param_get_fragment_desc_params* params =
++        static_cast<pg_param_get_fragment_desc_params*>(pData);
++    params->returnCount = count;
++    return true;
++}
++
++bool IPCIntelPGParam::clientUnflattenGetFragDescs(const void* pData, int dataSize, int* count,
++                                                  ia_p2p_fragment_desc* descs) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
++               "@%s, dataSize is small", __func__);
++    CheckError(!count || !descs, false, "@%s, nullptr outputs", __func__);
++
++    const pg_param_get_fragment_desc_params* params =
++        static_cast<const pg_param_get_fragment_desc_params*>(pData);
++    *count = params->returnCount;
++    MEMCPY_S(descs, sizeof(ia_p2p_fragment_desc) * params->descCount, params->descsData,
++             sizeof(params->descsData));
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false, "@%s, dataSize is small",
++               __func__);
++
++    pg_param_prepare_program_params* params = static_cast<pg_param_prepare_program_params*>(pData);
++    params->client = client;
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenPrepareProgram(const void* pData, int dataSize,
++                                                    uintptr_t* client) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false, "@%s, dataSize is small",
++               __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++
++    const pg_param_prepare_program_params* params =
++        static_cast<const pg_param_prepare_program_params*>(pData);
++    *client = params->client;
++    return true;
++}
++
++bool IPCIntelPGParam::serverFlattenPrepareProgram(void* pData, int dataSize, int payloadCount,
++                                                  const ia_binary_data* payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false, "@%s, dataSize is small",
++               __func__);
++    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, payloadCount is big", __func__);
++    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
++
++    pg_param_prepare_program_params* params = static_cast<pg_param_prepare_program_params*>(pData);
++    params->payloadCount = payloadCount;
++    MEMCPY_S(params->payloads, sizeof(ia_binary_data) * payloadCount, payloads,
++             sizeof(ia_binary_data) * payloadCount);
++    return true;
++}
++
++bool IPCIntelPGParam::clientUnflattenPrepareProgram(const void* pData, int dataSize,
++                                                    int* payloadCount, ia_binary_data* payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false, "@%s, dataSize is small",
++               __func__);
++    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
++
++    const pg_param_prepare_program_params* params =
++        static_cast<const pg_param_prepare_program_params*>(pData);
++
++    CheckError(*payloadCount < params->payloadCount, false, "@%s, payloadCount is small", __func__);
++    *payloadCount = params->payloadCount;
++    for (int i = 0; i < params->payloadCount; i++) {
++        payloads[i].size = params->payloads[i].size;
++        payloads[i].data = nullptr;
++    }
++    return true;
++}
++
++int IPCIntelPGParam::getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads) {
++    CheckError(!payloads, 0, "@%s, payloads is nullptr", __func__);
++    int size = sizeof(pg_param_allocate_payloads_params);
++    for (int i = 0; i < payloadCount; i++) {
++        if (payloads[i].size) {
++            size += PAGE_ALIGN(payloads[i].size);
++        }
++    }
++    return size;
++}
++
++bool IPCIntelPGParam::assignPayloads(void* pData, int dataSize, int payloadCount,
++                                     ia_binary_data* payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
++
++    uintptr_t payloadAddr = reinterpret_cast<uintptr_t>(pData);
++    CheckError(payloadAddr & ((getpagesize() - 1)), false, "@%s, payload addr is not aligned",
++               __func__);
++    for (int i = 0; i < payloadCount; i++) {
++        if (payloads[i].size > 0) {
++            CheckError(payloadAddr > reinterpret_cast<uintptr_t>(pData) + dataSize, false,
++                       "@%s, buffer is small", __func__);
++            payloads[i].data = reinterpret_cast<void*>(payloadAddr);
++            payloadAddr += PAGE_ALIGN(payloads[i].size);
++        }
++    }
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenAllocatePayloads(void* pData, int dataSize, uintptr_t client,
++                                                    int payloadCount,
++                                                    const ia_binary_data* payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
++               "@%s, dataSize is small", __func__);
++    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
++
++    uintptr_t paramAddr =
++        reinterpret_cast<uintptr_t>(pData) + dataSize - sizeof(pg_param_allocate_payloads_params);
++    pg_param_allocate_payloads_params* params =
++        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
++    params->client = client;
++    params->payloadCount = payloadCount;
++    for (int i = 0; i < payloadCount; i++) {
++        params->payloads[i].size = payloads[i].size;
++        params->payloads[i].data = payloads[i].data;
++        CheckError(reinterpret_cast<uintptr_t>(payloads[i].data) > paramAddr, false,
++                   "@%s, buffer is small", __func__);
++    }
++
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenAllocatePayloads(void* pData, int dataSize, uintptr_t* client,
++                                                      int* payloadCount,
++                                                      ia_binary_data** payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
++               "@%s, dataSize is small", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
++    CheckError(!payloadCount || !payloads, false, "@%s, nullptr outputs", __func__);
++
++    uintptr_t paramAddr =
++        reinterpret_cast<uintptr_t>(pData) + dataSize - sizeof(pg_param_allocate_payloads_params);
++    pg_param_allocate_payloads_params* params =
++        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
++    *client = params->client;
++    *payloadCount = params->payloadCount;
++    *payloads = params->payloads;  // Copy directly and ignore client pointers
++
++    return true;
++}
++
++bool IPCIntelPGParam::getPayloadOffsets(const void* pData, int dataSize, int payloadCount,
++                                        const ia_binary_data* payloads, int32_t* payloadOffsets) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
++    CheckError(!payloadOffsets, false, "@%s, nullptr payloadOffsets", __func__);
++
++    uintptr_t startAddr = reinterpret_cast<uintptr_t>(pData);
++    for (int i = 0; i < payloadCount; i++) {
++        if (payloads[i].size <= 0) continue;
++
++        int32_t offset = reinterpret_cast<uintptr_t>(payloads[i].data) - startAddr;
++        CheckError((offset > (dataSize - payloads[i].size) || offset < 0), false,
++                   "@%s, error offset %d", __func__, offset);
++        payloadOffsets[i] = offset;
++    }
++    return 0;
++}
++
++bool IPCIntelPGParam::getPayloadData(void* pData, int dataSize, int payloadCount,
++                                     const int32_t* payloadOffsets, ia_binary_data* payloads) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
++    CheckError(!payloadOffsets, false, "@%s, nullptr payloadOffsets", __func__);
++
++    unsigned char* startAddr = reinterpret_cast<unsigned char*>(pData);
++    for (int i = 0; i < payloadCount; i++) {
++        if (payloads[i].size <= 0) continue;
++
++        CheckError(payloadOffsets[i] > dataSize - payloads[i].size, false, "@%s, error offset %d",
++                   __func__, payloadOffsets[i]);
++        payloads[i].data = startAddr + payloadOffsets[i];
++    }
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
++                                          unsigned int ipuParamSize, int32_t ipuParamHandle,
++                                          int32_t payloadCount, const ia_binary_data* payloads,
++                                          void* payloadMemory, int payloadMemorySize) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, buffer is small", __func__);
++    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
++    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, wrong payloadCount", __func__);
++    CheckError(!payloadMemory, false, "@%s, wrong payloadMemory", __func__);
++
++    pg_param_encode_params* params = static_cast<pg_param_encode_params*>(pData);
++    params->client = client;
++    params->ipuParamSize = ipuParamSize;
++    params->ipuParamHandle = ipuParamHandle;
++    params->payloadCount = payloadCount;
++    MEMCPY_S(params->payloads, sizeof(params->payloads), payloads,
++             sizeof(ia_binary_data) * payloadCount);
++    getPayloadOffsets(payloadMemory, payloadMemorySize, payloadCount, payloads,
++                      params->payloadOffsets);
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
++                                            void* palDataAddr, ia_binary_data* ipuParameters,
++                                            int32_t* payloadCount, ia_binary_data** payloads,
++                                            int32_t** payloadOffsets) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, small dataSize", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++    CheckError(!ipuParameters, false, "@%s, nullptr output", __func__);
++    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
++    CheckError(!payloadCount, false, "%s, payloadCount is nullptr", __func__);
++    CheckError(!payloads, false, "%s, payloads is nullptr", __func__);
++    CheckError(!payloadOffsets, false, "%s, payloadOffsets is nullptr", __func__);
++
++    pg_param_encode_params* params = static_cast<pg_param_encode_params*>(pData);
++    *client = params->client;
++    ipuParameters->size = params->ipuParamSize;
++    ipuParameters->data = palDataAddr;
++    *payloadCount = params->payloadCount;
++    *payloads = params->payloads;
++    *payloadOffsets = params->payloadOffsets;
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenDecode(void* pData, int dataSize, uintptr_t client,
++                                          int32_t payloadCount, const ia_binary_data* payloads,
++                                          void* payloadMemory, int payloadMemorySize,
++                                          int32_t statsHandle) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
++    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
++    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, wrong payloadCount", __func__);
++    CheckError(!payloadMemory, false, "@%s, wrong payloadMemory", __func__);
++
++    pg_param_decode_params* params = static_cast<pg_param_decode_params*>(pData);
++    params->client = client;
++    params->payloadCount = payloadCount;
++    MEMCPY_S(params->payloads, sizeof(params->payloads), payloads,
++             sizeof(ia_binary_data) * payloadCount);
++    getPayloadOffsets(payloadMemory, payloadMemorySize, payloadCount, payloads,
++                      params->payloadOffsets);
++    params->clientStatsHandle = statsHandle;
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenDecode(void* pData, int dataSize, uintptr_t* client,
++                                            int32_t* payloadCount, ia_binary_data** payloads,
++                                            int32_t** payloadOffsets) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++    CheckError(!payloadCount, false, "%s, payloadCount is nullptr", __func__);
++    CheckError(!payloads, false, "%s, payloads is nullptr", __func__);
++    CheckError(!payloadOffsets, false, "%s, payloadOffsets is nullptr", __func__);
++
++    pg_param_decode_params* params = static_cast<pg_param_decode_params*>(pData);
++    *client = params->client;
++    *payloadCount = params->payloadCount;
++    *payloads = params->payloads;
++    *payloadOffsets = params->payloadOffsets;
++    return true;
++}
++
++bool IPCIntelPGParam::serverFlattenDecode(void* pData, int dataSize,
++                                          const ia_binary_data& statistics) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
++
++    pg_param_decode_params* params = static_cast<pg_param_decode_params*>(pData);
++    params->clientStatsSize = statistics.size;
++    return true;
++}
++
++bool IPCIntelPGParam::clientUnflattenDecode(void* pData, int dataSize, ia_binary_data* statistics) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
++    CheckError(!statistics, false, "@%s, statistics is nullptr", __func__);
++
++    pg_param_decode_params* params = static_cast<pg_param_decode_params*>(pData);
++    statistics->size = params->clientStatsSize;
++    return true;
++}
++
++bool IPCIntelPGParam::clientFlattenDeinit(void* pData, int dataSize, uintptr_t client) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, buffer is small", __func__);
++
++    pg_param_deinit_params* params = static_cast<pg_param_deinit_params*>(pData);
++    params->client = client;
++
++    return true;
++}
++
++bool IPCIntelPGParam::serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client) {
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, size is small", __func__);
++    CheckError(!client, false, "@%s, nullptr client", __func__);
++
++    const pg_param_deinit_params* params = static_cast<const pg_param_deinit_params*>(pData);
++    *client = params->client;
++
++    return true;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
+new file mode 100644
+index 000000000000..f69cd29d9df1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
+@@ -0,0 +1,180 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "modules/sandboxing/IPCCommon.h"
++#include "src/core/psysprocessor/PGUtils.h"
++
++namespace icamera {
++
++#define MAX_PROCESS_GROUP_SIZE 8192
++#define MAX_PAL_SIZE 0x800000  // 8M
++#define MAX_STATISTICS_SIZE MAX_IA_BINARY_DATA_SIZE
++
++struct pg_param_init_params {
++    int pgId;
++    uintptr_t client;
++    ia_p2p_platform_t platform;
++    PgConfiguration pgConfig;
++    unsigned char pgManifestData[MAX_PROCESS_GROUP_SIZE];
++    int disableDataTermialsData[IPU_MAX_TERMINAL_COUNT];
++    int disableDataTermialsCount;
++};
++
++struct pg_param_prepare_params {
++    uintptr_t client;
++    uint32_t ipuParamSize;
++    int32_t ipuParamHandle;
++    ia_css_rbm_t* rbm;
++    ia_css_rbm_t rbmData;
++
++    // Output
++    ia_css_kernel_bitmap_t bitmapData;
++    uint32_t maxStatsSize;
++};
++
++// Shared memory: pg + struct
++// as pg memory addr should be page size aligned
++struct pg_param_allocate_pg_params {
++    uintptr_t client;
++    int pgSize;
++};
++
++struct pg_param_get_fragment_desc_params {
++    uintptr_t client;
++    int descCount;
++
++    // Output
++    int returnCount;
++    ia_p2p_fragment_desc descsData[IPU_MAX_TERMINAL_COUNT * IA_P2P_MAX_FRAGMENTS];
++};
++
++struct pg_param_prepare_program_params {
++    uintptr_t client;
++
++    // Output
++    int payloadCount;
++    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
++};
++
++// Shared memory: payloads + struct
++// as payload memory addr should be page size aligned
++struct pg_param_allocate_payloads_params {
++    uintptr_t client;
++    int payloadCount;
++    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
++};
++
++struct pg_param_encode_params {
++    uintptr_t client;
++    uint32_t ipuParamSize;
++    int32_t ipuParamHandle;
++    int32_t payloadCount;
++    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];
++    int32_t payloadOffsets[IPU_MAX_TERMINAL_COUNT];
++};
++
++struct pg_param_decode_params {
++    uintptr_t client;
++    int32_t payloadCount;
++    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];
++    int32_t payloadOffsets[IPU_MAX_TERMINAL_COUNT];
++    uint32_t clientStatsSize;
++    int32_t clientStatsHandle;
++
++    // Output
++    uint32_t statsSize;
++};
++
++struct pg_param_deinit_params {
++    uintptr_t client;
++};
++
++class IPCIntelPGParam {
++ public:
++    IPCIntelPGParam() {}
++    virtual ~IPCIntelPGParam() {}
++
++    bool clientFlattenInit(void* pData, int dataSize, int pgId, uintptr_t client,
++                           ia_p2p_platform_t platform, const PgConfiguration& pgConfig);
++    bool serverUnflattenInit(void* pData, int dataSize, int* pgId, uintptr_t* client,
++                             ia_p2p_platform_t* platform, PgConfiguration* pgConfig);
++
++    bool clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
++                              unsigned int ipuParamSize, int32_t ipuParamHandle,
++                              const ia_css_rbm_t* rbm);
++    bool serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client, void* palDataAddr,
++                                ia_binary_data* ipuParameters, ia_css_rbm_t** rbm,
++                                ia_css_kernel_bitmap_t** bitmap, uint32_t** maxStatsSize);
++    bool clientUnflattenPrepare(const void* pData, int dataSize, ia_css_kernel_bitmap_t* bitmap,
++                                uint32_t* maxStatsSize = nullptr);
++
++    int getTotalPGBufferSize(int pgSize);
++    bool assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer);
++    bool clientFlattenAllocatePGBuffer(void* pData, int dataSize, uintptr_t client, int pgSize);
++    bool serverUnflattenAllocatePGBuffer(const void* pData, int dataSize, uintptr_t* client,
++                                         int* pgSize);
++
++    bool clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client, int descCount);
++    bool serverUnflattenGetFragDescs(void* pData, int dataSize, uintptr_t* client, int* descCount,
++                                     ia_p2p_fragment_desc** descs);
++    bool serverFlattenGetFragDescs(void* pData, int dataSize, int count);
++    bool clientUnflattenGetFragDescs(const void* pData, int dataSize, int* count,
++                                     ia_p2p_fragment_desc* descs);
++
++    bool clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client);
++    bool serverUnflattenPrepareProgram(const void* pData, int dataSize, uintptr_t* client);
++    bool serverFlattenPrepareProgram(void* pData, int dataSize, int payloadCount,
++                                     const ia_binary_data* payloads);
++    bool clientUnflattenPrepareProgram(const void* pData, int dataSize, int* payloadCount,
++                                       ia_binary_data* payloads);
++
++    int getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads);
++    bool assignPayloads(void* pData, int dataSize, int payloadCount, ia_binary_data* payloads);
++    bool clientFlattenAllocatePayloads(void* pData, int dataSize, uintptr_t client,
++                                       int payloadCount, const ia_binary_data* payloads);
++    bool serverUnflattenAllocatePayloads(void* pData, int dataSize, uintptr_t* client,
++                                         int* payloadCount, ia_binary_data** payloads);
++
++    bool getPayloadOffsets(const void* pData, int dataSize, int payloadCount,
++                           const ia_binary_data* payloads, int32_t* payloadOffsets);
++    bool getPayloadData(void* pData, int dataSize, int payloadCount, const int32_t* payloadOffsets,
++                        ia_binary_data* payloads);
++
++    bool clientFlattenEncode(void* pData, int dataSize, uintptr_t client, unsigned int ipuParamSize,
++                             int32_t ipuParamHandle, int32_t payloadCount,
++                             const ia_binary_data* payloads, void* payloadMemory,
++                             int payloadMemorySize);
++    bool serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client, void* palDataAddr,
++                               ia_binary_data* ipuParameters, int32_t* payloadCount,
++                               ia_binary_data** payloads, int32_t** payloadOffsets);
++
++    bool clientFlattenDecode(void* pData, int dataSize, uintptr_t client, int32_t payloadCount,
++                             const ia_binary_data* payloads, void* payloadMemory,
++                             int payloadMemorySize, int32_t statsHandle);
++    bool serverUnflattenDecode(void* pData, int dataSize, uintptr_t* client, int32_t* payloadCount,
++                               ia_binary_data** payloads, int32_t** payloadOffsets);
++    bool serverFlattenDecode(void* pData, int dataSize, const ia_binary_data& statistics);
++    bool clientUnflattenDecode(void* pData, int dataSize, ia_binary_data* statistics);
++
++    bool clientFlattenDeinit(void* pData, int dataSize, uintptr_t client);
++    bool serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client);
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
+new file mode 100644
+index 000000000000..29c487739fb7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
+@@ -0,0 +1,554 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IPC_ISP_PARAM_ADAPTOR"
++
++#include "modules/sandboxing/IPCIspParamAdaptor.h"
++
++#include <memory>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IPCIspParamAdaptor::IPCIspParamAdaptor() {
++    LOGIPC("@%s", __func__);
++}
++
++IPCIspParamAdaptor::~IPCIspParamAdaptor() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IPCIspParamAdaptor::clientFlattenInit(void* pData, uint32_t size,
++                                           const ia_binary_data* ispData, const ia_cmc_t* iaCmc,
++                                           uint32_t maxStatsWidth, uint32_t maxStatsHeight,
++                                           uint32_t maxNumStatsIn, ia_mkn* iaMkn) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData || !ispData || !iaCmc, false, "@%s, pData, ispData or iaCmc is nullptr",
++               __func__);
++    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
++    CheckError(ispData->size > MAX_IA_BINARY_DATA_SIZE, false,
++               "%s, the buffer of isp data is too small", __func__);
++
++    IspBxtInitParam* params = static_cast<IspBxtInitParam*>(pData);
++    params->iaIsp = *ispData;
++    if (params->iaIsp.data) {
++        MEMCPY_S(params->ispAiqbData, sizeof(params->ispAiqbData), ispData->data, ispData->size);
++    }
++
++    params->iaCmcHandle = reinterpret_cast<uintptr_t>(iaCmc);
++    params->maxStatsWidth = maxStatsWidth;
++    params->maxStatsHeight = maxStatsHeight;
++    params->maxStatsIn = maxNumStatsIn;
++    params->iaMkn = nullptr;  // Not used in current
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverUnflattenInit(IspBxtInitParam* pData, uint32_t size,
++                                             ia_binary_data** Isp, ia_cmc_t** Cmc) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
++    CheckError(!Isp || !Cmc, false, "@%s, Isp or Cmc is nullptr", __func__);
++
++    if (pData->iaIsp.data) {
++        CheckError(pData->iaIsp.size > MAX_IA_BINARY_DATA_SIZE, false,
++                   "%s, the buffer of isp data is too small", __func__);
++        pData->iaIsp.data = pData->ispAiqbData;
++    }
++    *Isp = &pData->iaIsp;
++    *Cmc = reinterpret_cast<ia_cmc_t*>(pData->iaCmcHandle);
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::clientFlattenDeInit(void* pData, uint32_t size,
++                                             const ia_isp_bxt* ispHandle) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
++    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
++
++    IspBxtDeInitParam* params = static_cast<IspBxtDeInitParam*>(pData);
++    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverUnflattenDeInit(const void* pData, uint32_t size,
++                                               ia_isp_bxt** ispHandle) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
++    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
++
++    const IspBxtDeInitParam* params = static_cast<const IspBxtDeInitParam*>(pData);
++    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::clientFlattenGetPalSize(void* pData, uint32_t size,
++                                                 const ia_isp_bxt_program_group* programGroup) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
++    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
++
++    PalDataSizeParam* params = static_cast<PalDataSizeParam*>(pData);
++
++    bool ret = flattenProgramGroup(programGroup, &params->programGroup);
++    CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverUnflattenGetPalSize(void* pData, uint32_t size,
++                                                   ia_isp_bxt_program_group** programGroup) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
++    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
++
++    PalDataSizeParam* params = static_cast<PalDataSizeParam*>(pData);
++
++    bool ret = unflattenProgramGroup(&params->programGroup);
++    CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
++
++    *programGroup = &params->programGroup.group;
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::clientFlattenConvertStats(void* pData, uint32_t size,
++                                                   const ia_isp_bxt* ispHandle,
++                                                   const ConvertInputParam* inputParams,
++                                                   int32_t statsHandle) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle || !inputParams, false, "@%s, ispHandle or inputParams is nullptr",
++               __func__);
++    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
++
++    ConvertStatsParam* params = static_cast<ConvertStatsParam*>(pData);
++    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
++    params->multiExpo = inputParams->multiExpo;
++
++    params->statsBuffer = *inputParams->statsBuffer;
++    params->statsHandle = statsHandle;
++
++    bool ret = mIpcAiq.flattenAeResults(*inputParams->aeResults, &params->aeResults);
++    CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
++
++    params->dvsReso = *inputParams->dvsReso;
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverUnflattenConvertStats(void* pData, uint32_t size,
++                                                     ia_isp_bxt** ispHandle,
++                                                     ConvertInputParam* inputParams,
++                                                     ConvertResult* result, void* statsAddr) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle || !inputParams || !result, false,
++               "@%s, ispHandle, inputParams or result is nullptr", __func__);
++    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
++    CheckError(!statsAddr, false, "@%s, statsAddr is nullptr", __func__);
++
++    ConvertStatsParam* params = static_cast<ConvertStatsParam*>(pData);
++    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
++    inputParams->multiExpo = params->multiExpo;
++
++    inputParams->statsBuffer = &params->statsBuffer;
++    if (params->statsBuffer.size > 0) {
++        params->statsBuffer.data = statsAddr;
++    }
++
++    inputParams->dvsReso = &params->dvsReso;
++    ae_run_params_results* res = &params->aeResults;
++
++    bool ret = mIpcAiq.unflattenAeResults(res);
++    CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
++    inputParams->aeResults = &res->base;
++
++    CLEAR(params->queryResults);
++    result->queryResults = &params->queryResults;
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverFlattenConvertStats(void* pData, uint32_t size,
++                                                   const ConvertResult& result) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
++
++    ConvertStatsParam* params = static_cast<ConvertStatsParam*>(pData);
++    // the queryResults uses SHM
++
++    // flatten rgbs grid
++    CLEAR(params->rgbsGridArray);
++    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
++        ia_aiq_rgbs_grid* rgbs = result.rgbsGrid[i];
++        if (rgbs) {
++            params->rgbsGrid[i].base = *rgbs;
++            size_t rgbsSize = rgbs->grid_width * rgbs->grid_height * sizeof(rgbs_grid_block);
++            size_t memSize = sizeof(params->rgbsGrid[i].blocks_ptr);
++            CheckError(memSize < rgbsSize, false, "%s, memory for rgbs is too small", __func__);
++            MEMCPY_S(params->rgbsGrid[i].blocks_ptr, memSize, rgbs->blocks_ptr, rgbsSize);
++            params->rgbsGridArray[i] = &params->rgbsGrid[i].base;
++        }
++    }
++
++    // flatten af grid
++    params->afGridPtr = nullptr;
++    if (result.afGrid) {
++        params->afGrid.base = *result.afGrid;
++        size_t afSize = result.afGrid->grid_width * result.afGrid->grid_height * sizeof(int);
++        size_t memSize = sizeof(params->afGrid.filter_response_1);
++        CheckError(memSize < afSize, false, "%s, memory for af grid is too small", __func__);
++        MEMCPY_S(params->afGrid.filter_response_1, memSize, result.afGrid->filter_response_1,
++                 afSize);
++        MEMCPY_S(params->afGrid.filter_response_2, memSize, result.afGrid->filter_response_2,
++                 afSize);
++        params->afGridPtr = &params->afGrid.base;
++    }
++
++    // flatten dvs grid
++    params->dvsStatsPtr = nullptr;
++    if (result.dvsStats) {
++        params->dvsStats.base = *result.dvsStats;
++        CheckError(MV_ENTRIE_COUNT < result.dvsStats->vector_count, false,
++                   "%s, memory for dvs statistics is too small", __func__);
++        MEMCPY_S(params->dvsStats.motion_vectors, MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
++                 result.dvsStats->motion_vectors,
++                 result.dvsStats->vector_count * sizeof(ia_dvs_motion_vector));
++        params->dvsStatsPtr = &params->dvsStats.base;
++    }
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::clientUnflattenConvertStats(void* pData, uint32_t size,
++                                                     ConvertResult* result) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData || !result, false, "@%s, pData or result is nullptr", __func__);
++    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
++
++    ConvertStatsParam* params = static_cast<ConvertStatsParam*>(pData);
++    *result->queryResults = params->queryResults;
++
++    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
++        if (params->rgbsGridArray[i]) {
++            params->rgbsGrid[i].base.blocks_ptr = params->rgbsGrid[i].blocks_ptr;
++            result->rgbsGrid[i] = &params->rgbsGrid[i].base;
++        }
++    }
++
++    if (params->afGridPtr) {
++        params->afGrid.base.filter_response_1 = params->afGrid.filter_response_1;
++        params->afGrid.base.filter_response_2 = params->afGrid.filter_response_2;
++        result->afGrid = &params->afGrid.base;
++    }
++
++    if (params->dvsStatsPtr) {
++        params->dvsStats.base.motion_vectors = params->dvsStats.motion_vectors;
++        result->dvsStats = &params->dvsStats.base;
++    }
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::clientFlattenRunPal(void* pData, uint32_t size,
++                                             const ia_isp_bxt* ispHandle,
++                                             const ia_isp_bxt_input_params_v2* inputParams,
++                                             const ia_binary_data* outputData,
++                                             const int32_t palDataHandle) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle || !inputParams || !outputData, false,
++               "@%s, ispHandle, inputParams or outputData is nullptr", __func__);
++    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
++
++    RunPalParam* params = static_cast<RunPalParam*>(pData);
++    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
++    params->inputParamsBase = *inputParams;
++    ia_isp_bxt_input_params_v2* base = &params->inputParamsBase;
++
++    if (base->sensor_frame_params) {
++        params->frameParam = *inputParams->sensor_frame_params;
++    }
++
++    if (base->awb_results) {
++        params->awbResult = *inputParams->awb_results;
++    }
++
++    bool ret = true;
++    if (base->gbce_results) {
++        ret = mIpcAiq.flattenGbceResults(*inputParams->gbce_results, &params->gbceResult);
++        CheckError(ret == false, false, "%s, flattenGbceResults fails", __func__);
++    }
++
++    if (base->ae_results) {
++        ret = mIpcAiq.flattenAeResults(*inputParams->ae_results, &params->aeResults);
++        CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
++    }
++
++    if (base->pa_results) {
++        ret = mIpcAiq.flattenPaResultsV1(*inputParams->pa_results, &params->paResult);
++        CheckError(ret == false, false, "%s, flattenPaResultsV1 fails", __func__);
++    }
++
++    if (base->sa_results) {
++        mIpcAiq.flattenSaResultsV2(*inputParams->sa_results, &params->saResult);
++        CheckError(ret == false, false, "%s, flattenSaResultsV2 fails", __func__);
++    }
++
++    if (base->weight_grid) {
++        params->weightGrid = *inputParams->weight_grid;
++        size_t weightSize = (inputParams->weight_grid->width * inputParams->weight_grid->height *
++                             sizeof(unsigned char));
++        CheckError(weightSize > MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char), false,
++                   "%s, the buffer for weight grid is too small", __func__);
++        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char),
++                 inputParams->weight_grid->weights, weightSize);
++        params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
++    }
++
++    if (base->program_group) {
++        CLEAR(params->programGroup);
++        ret = flattenProgramGroup(inputParams->program_group, &params->programGroup);
++        CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
++    }
++
++    if (base->dvs_morph_table) {
++        ret = mIpcDvs.flattenMorphTable(inputParams->dvs_morph_table, &params->dvsResult);
++        CheckError(ret == false, false, "%s, flattenMorphTable fails", __func__);
++    }
++
++    if (base->custom_controls) {
++        params->customControl = *inputParams->custom_controls;
++
++        size_t customCtlSize = inputParams->custom_controls->count * sizeof(float);
++        size_t maxCtlSize = MAX_CUSTOM_CONTROLS_SIZE * sizeof(float);
++        CheckError(customCtlSize > maxCtlSize, false,
++                   "%s, the buffer for custom controls is too small", __func__);
++        if (inputParams->custom_controls->parameters) {
++            MEMCPY_S(params->customCtlParams, maxCtlSize, inputParams->custom_controls->parameters,
++                     customCtlSize);
++            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
++        }
++    }
++
++    if (base->pal_override) {
++        params->palOverride = *inputParams->pal_override;
++        if (inputParams->pal_override->size > 0) {
++            MEMCPY_S(params->overrideData, sizeof(params->overrideData),
++                     inputParams->pal_override->data, inputParams->pal_override->size);
++            params->palOverride.data = static_cast<void*>(params->overrideData);
++        }
++    }
++
++    if (base->ltm_results) {
++        params->ltmResult = *inputParams->ltm_results;
++    }
++
++    if (base->ltm_drc_params) {
++        params->drcResult = *inputParams->ltm_drc_params;
++    }
++
++    if (base->gdc_transformation) {
++        params->gdcTransform = *inputParams->gdc_transformation;
++    }
++
++    if (base->view_params) {
++        MEMCPY_S(&params->viewConfig, sizeof(params->viewConfig), inputParams->view_params,
++                 sizeof(ia_view_config_t));
++    }
++
++    if (base->bcomp_results) {
++        params->bcompResult = *inputParams->bcomp_results;
++    }
++
++    if (base->gdc_mbr_limits) {
++        params->gdcLimit = *inputParams->gdc_mbr_limits;
++    }
++
++    if (outputData) {
++        params->palOutput = *outputData;
++        params->palDataHandle = palDataHandle;
++    }
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::serverUnflattenRunPal(void* pData, uint32_t size, ia_isp_bxt** ispHandle,
++                                               ia_isp_bxt_input_params_v2** paramsRes,
++                                               ia_binary_data** palOutput) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
++    CheckError(!ispHandle || !paramsRes || !palOutput, false,
++               "@%s, ispHandle paramsRes or palOutput is nullptr", __func__);
++    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
++
++    RunPalParam* params = static_cast<RunPalParam*>(pData);
++    ia_isp_bxt_input_params_v2* base = &params->inputParamsBase;
++
++    if (base->sensor_frame_params) {
++        base->sensor_frame_params = &params->frameParam;
++    }
++
++    if (base->awb_results) {
++        base->awb_results = &params->awbResult;
++    }
++
++    bool ret = true;
++    if (base->gbce_results) {
++        ret = mIpcAiq.unflattenGbceResults(&params->gbceResult);
++        CheckError(ret == false, false, "%s, unflattenGbceResults fails", __func__);
++        base->gbce_results = &params->gbceResult.base;
++    }
++
++    if (base->ae_results) {
++        ret = mIpcAiq.unflattenAeResults(&params->aeResults);
++        CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
++        base->ae_results = &params->aeResults.base;
++    }
++
++    if (base->pa_results) {
++        ret = mIpcAiq.unflattenPaResultsV1(&params->paResult);
++        CheckError(ret == false, false, "%s, unflattenPaResultsV1 fails", __func__);
++        base->pa_results = &params->paResult.base;
++    }
++
++    if (base->sa_results) {
++        ret = mIpcAiq.unflattenSaResultsV2(&params->saResult);
++        CheckError(ret == false, false, "%s, unflattenSaResultsV2 fails", __func__);
++        base->sa_results = &params->saResult.base;
++    }
++
++    if (base->weight_grid) {
++        if (params->weightGrid.weights) {
++            params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
++        }
++        base->weight_grid = &params->weightGrid;
++    }
++
++    if (base->program_group) {
++        ret = unflattenProgramGroup(&params->programGroup);
++        CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
++        base->program_group = &params->programGroup.group;
++    }
++
++    if (base->dvs_morph_table) {
++        ret = mIpcDvs.unflattenMorphTalbe(&params->dvsResult);
++        CheckError(ret == false, false, "%s, unflattenMorphTalbe fails", __func__);
++        base->dvs_morph_table = &params->dvsResult.morphTable;
++    }
++
++    if (base->custom_controls) {
++        if (params->customControl.parameters) {
++            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
++        }
++        base->custom_controls = &params->customControl;
++    }
++
++    if (base->pal_override) {
++        if (params->palOverride.data) {
++            params->palOverride.data = static_cast<void*>(params->overrideData);
++        }
++        base->pal_override = &params->palOverride;
++    }
++
++    if (base->ltm_results) {
++        base->ltm_results = &params->ltmResult;
++    }
++
++    if (base->ltm_drc_params) {
++        base->ltm_drc_params = &params->drcResult;
++    }
++
++    if (base->gdc_transformation) {
++        base->gdc_transformation = &params->gdcTransform;
++    }
++
++    if (base->view_params) {
++        base->view_params = reinterpret_cast<ia_isp_bxt_view_params_t*>(&params->viewConfig);
++    }
++
++    if (base->bcomp_results) {
++        base->bcomp_results = &params->bcompResult;
++    }
++
++    if (base->gdc_mbr_limits) {
++        base->gdc_mbr_limits = &params->gdcLimit;
++    }
++
++    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
++    *paramsRes = &params->inputParamsBase;
++    *palOutput = &params->palOutput;
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::flattenProgramGroup(const ia_isp_bxt_program_group* src,
++                                             GraphKernelArray* res) {
++    CheckError(!src || !res, false, "@%s, src or dst is nullptr", __func__);
++    CheckError(src->kernel_count > MAX_STREAM_KERNEL_COUNT, false,
++               "%s the buffer of kernel array is tool small", __func__);
++
++    res->group = *src;
++    for (unsigned int j = 0; j < res->group.kernel_count; ++j) {
++        res->runKernels[j] = src->run_kernels[j];
++        if (res->runKernels[j].resolution_info) {
++            res->resoInfo[j] = *src->run_kernels[j].resolution_info;
++        }
++        if (res->runKernels[j].resolution_history) {
++            res->resoHistory[j] = *src->run_kernels[j].resolution_history;
++        }
++    }
++    if (res->group.pipe) {
++        res->pipeInfo = *src->pipe;
++    }
++
++    return true;
++}
++
++bool IPCIspParamAdaptor::unflattenProgramGroup(GraphKernelArray* result) {
++    CheckError(!result, false, "@%s, result is nullptr", __func__);
++    CheckError(result->group.kernel_count > MAX_STREAM_KERNEL_COUNT, false,
++               "%s, the buffer of kernel array is too small", __func__);
++
++    result->group.run_kernels = result->runKernels;
++    for (unsigned j = 0; j < result->group.kernel_count; ++j) {
++        if (result->runKernels[j].resolution_info) {
++            result->runKernels[j].resolution_info = &result->resoInfo[j];
++        }
++
++        if (result->runKernels[j].resolution_history) {
++            result->runKernels[j].resolution_history = &result->resoHistory[j];
++        }
++    }
++    if (result->group.pipe) {
++        result->group.pipe = &result->pipeInfo;
++    }
++
++    return true;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
+new file mode 100644
+index 000000000000..25b3279963d2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
+@@ -0,0 +1,170 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "modules/algowrapper/StatsTypes.h"
++#include "modules/sandboxing/IPCCommon.h"
++#include "modules/sandboxing/IPCGraphConfig.h"
++#include "modules/sandboxing/IPCIntelAiq.h"
++#include "modules/sandboxing/IPCIntelDvs.h"
++
++namespace icamera {
++
++struct IspBxtInitParam {
++    ia_binary_data iaIsp;
++    int8_t ispAiqbData[MAX_IA_BINARY_DATA_SIZE];
++    uintptr_t iaCmcHandle;
++    uint32_t maxStatsWidth;
++    uint32_t maxStatsHeight;
++    uint32_t maxStatsIn;
++    ia_mkn* iaMkn;  // hal always passes nullptr to ia_bxt_isp
++
++    uintptr_t ispRemoteHandle;
++};
++
++struct IspBxtDeInitParam {
++    uintptr_t ispRemoteHandle;
++};
++
++struct PalDataSizeParam {
++    GraphKernelArray programGroup;
++    int palDataSize;
++};
++
++struct DvsStatsParam {
++    ia_dvs_statistics base;
++    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
++};
++
++struct ConvertStatsParam {
++    uintptr_t ispRemoteHandle;
++
++    // Input params
++    bool multiExpo;
++    ia_binary_data statsBuffer;
++    int32_t statsHandle;
++    camera_resolution_t dvsReso;
++    ae_run_params_results aeResults;
++
++    // Output result
++    ia_isp_bxt_statistics_query_results_t queryResults;
++
++    ia_aiq_rgbs_grid* rgbsGridArray[MAX_NUM_EXPOSURES];
++    ia_aiq_rgbs_grid_data rgbsGrid[MAX_NUM_EXPOSURES];
++
++    ia_aiq_af_grid* afGridPtr;
++    ia_aiq_af_grid_data afGrid;
++
++    ia_dvs_statistics* dvsStatsPtr;
++    DvsStatsParam dvsStats;
++};
++
++#define MAX_CUSTOM_CONTROLS_SIZE 1024
++struct RunPalParam {
++    ia_isp_bxt_input_params_v2 inputParamsBase;
++
++    // sensor frame parameters
++    ia_aiq_frame_params frameParam;
++
++    // for 3a result
++    ia_aiq_awb_results awbResult;
++    gbce_results_params gbceResult;
++
++    ae_run_params_results aeResults;
++    pa_run_params_results_v1 paResult;
++    sa_run_v2_params_results saResult;
++
++    ia_aiq_hist_weight_grid weightGrid;
++    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
++
++    GraphKernelArray programGroup;
++    DvsMorphParams dvsResult;
++
++    // for custom control
++    ia_isp_custom_controls customControl;
++    float customCtlParams[MAX_CUSTOM_CONTROLS_SIZE];
++
++    // for pal override
++    ia_binary_data palOverride;
++    int8_t overrideData[MAX_IA_BINARY_DATA_SIZE];
++
++    // for ltm result
++    ia_ltm_results ltmResult;
++    ia_ltm_drc_params drcResult;
++
++    ia_dvs_image_transformation gdcTransform;
++
++    ia_view_config_t viewConfig;
++    ia_bcomp_results bcompResult;
++    ia_isp_bxt_gdc_limits gdcLimit;
++
++    ia_binary_data palOutput;
++    int32_t palDataHandle;
++
++    uintptr_t ispRemoteHandle;
++};
++
++class IPCIspParamAdaptor {
++ public:
++    IPCIspParamAdaptor();
++    virtual ~IPCIspParamAdaptor();
++
++    // init
++    bool clientFlattenInit(void* pData, uint32_t size, const ia_binary_data* ispData,
++                           const ia_cmc_t* iaCmc, uint32_t maxStatsWidth, uint32_t maxStatsHeight,
++                           uint32_t maxNumStatsIn, ia_mkn* iaMkn);
++    bool serverUnflattenInit(IspBxtInitParam* pData, uint32_t size, ia_binary_data** Isp,
++                             ia_cmc_t** Cmc);
++
++    // deinit
++    bool clientFlattenDeInit(void* pData, uint32_t size, const ia_isp_bxt* ispHandle);
++    bool serverUnflattenDeInit(const void* pData, uint32_t size, ia_isp_bxt** ispHandle);
++
++    // get pal data size
++    bool clientFlattenGetPalSize(void* pData, uint32_t size,
++                                 const ia_isp_bxt_program_group* programGroup);
++    bool serverUnflattenGetPalSize(void* pData, uint32_t size,
++                                   ia_isp_bxt_program_group** programGroup);
++
++    // convert stats
++    bool clientFlattenConvertStats(void* pData, uint32_t size, const ia_isp_bxt* ispHandle,
++                                   const ConvertInputParam* inputParams, int32_t statsHandle);
++    bool serverUnflattenConvertStats(void* pData, uint32_t size, ia_isp_bxt** ispHandle,
++                                     ConvertInputParam* inputParams, ConvertResult* result,
++                                     void* statsAddr);
++    bool serverFlattenConvertStats(void* pData, uint32_t size, const ConvertResult& result);
++    bool clientUnflattenConvertStats(void* pData, uint32_t size, ConvertResult* result);
++
++    // run pal
++    bool clientFlattenRunPal(void* pData, uint32_t size, const ia_isp_bxt* ispHandle,
++                             const ia_isp_bxt_input_params_v2* inputParams,
++                             const ia_binary_data* outputData, const int32_t palDataHandle);
++    bool serverUnflattenRunPal(void* pData, uint32_t size, ia_isp_bxt** ispHandle,
++                               ia_isp_bxt_input_params_v2** paramsRes, ia_binary_data** palOutput);
++
++ private:
++    bool flattenProgramGroup(const ia_isp_bxt_program_group* src, GraphKernelArray* res);
++    bool unflattenProgramGroup(GraphKernelArray* result);
++
++ private:
++    IPCIntelAiq mIpcAiq;
++    IPCIntelDvs mIpcDvs;
++
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(IPCIspParamAdaptor);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
+new file mode 100644
+index 000000000000..0081ea574a8c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
+@@ -0,0 +1,186 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ClientGraphConfigImpl"
++
++#include "modules/sandboxing/client/GraphConfigImpl.h"
++
++#include "iutils/CameraLog.h"
++
++using std::map;
++using std::string;
++using std::vector;
++
++namespace icamera {
++
++GraphConfigImpl::GraphConfigImpl() : mCameraId(-1), mInitialized(false) {
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string parseName = "/graphParse" + std::to_string(personal) + "Shm";
++
++    mMems = {{parseName.c_str(), sizeof(GraphParseParams), &mMemParse, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done, cameraId: %d", __func__, mCameraId);
++    mInitialized = true;
++}
++
++GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type)
++        : mCameraId(camId),
++          mConfigMode(mode),
++          mType(type),
++          mInitialized(false) {
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string configStreamsName = "/graphConfigStreams" + std::to_string(personal) + "Shm";
++    std::string getGraphDataName = "/graphGetData" + std::to_string(personal) + "Shm";
++    std::string getPgIdName = "/graphGetPgId" + std::to_string(personal) + "Shm";
++    std::string getConnection = "/graphGetConnection" + std::to_string(personal) + "Shm";
++
++    mMems = {{configStreamsName.c_str(), sizeof(GraphConfigStreamParams), &mMemConfig, false},
++             {getGraphDataName.c_str(), sizeof(GraphGetDataParams), &mMemGetData, false},
++             {getPgIdName.c_str(), sizeof(GraphGetPgIdParams), &mMemGetPgId, false},
++             {getConnection.c_str(), sizeof(GraphGetConnectionParams), &mMemGetConnection, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    mInitialized = true;
++    LOGIPC("@%s, done, cameraId: %d, configMode: %d, type", __func__, mCameraId, mConfigMode,
++           mType);
++}
++
++GraphConfigImpl::~GraphConfigImpl() {
++    mInitialized = false;
++    mCommon.releaseAllShmMems(mMems);
++    mMems.clear();
++}
++
++void GraphConfigImpl::addCustomKeyMap() {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    bool ret = mCommon.requestSync(IPC_GRAPH_ADD_KEY);
++    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++status_t GraphConfigImpl::parse(int cameraId, const char* graphDescFile, const char* settingsFile) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    bool ret = mIpc.clientFlattenParse(mMemParse.mAddr, mMemParse.mSize, cameraId, graphDescFile,
++                                       settingsFile);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenParse fails", __func__);
++
++    status_t rt = mCommon.requestSync(IPC_GRAPH_PARSE, mMemParse.mHandle);
++    CheckError(!rt, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++void GraphConfigImpl::releaseGraphNodes() {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    bool ret = mCommon.requestSync(IPC_GRAPH_RELEASE_NODES);
++    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++status_t GraphConfigImpl::configStreams(const vector<HalStream*>& activeStreams) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    GraphBaseInfo info = {mCameraId, mConfigMode};
++    bool ret = mIpc.clientFlattenConfigStreams(mMemConfig.mAddr, mMemConfig.mSize, info, mType,
++                                               activeStreams);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenConfigStreams fails", __func__);
++
++    ret = mCommon.requestSync(IPC_GRAPH_CONFIG_STREAMS, mMemConfig.mHandle);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData* data) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    GraphBaseInfo info = {mCameraId, mConfigMode};
++    bool ret = mIpc.clientFlattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, info);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetGraphData fails", __func__);
++
++    ret = mCommon.requestSync(IPC_GRAPH_GET_CONFIG_DATA, mMemGetData.mHandle);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, data);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnflattenGetGraphData fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigImpl::pipelineGetConnections(
++    const std::vector<std::string>& pgList, std::vector<IGraphType::ScalerInfo>* scalerInfo,
++    std::vector<IGraphType::PipelineConnection>* confVector) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    GraphBaseInfo info = {mCameraId, mConfigMode};
++    bool ret = mIpc.clientFlattenGetConnection(mMemGetConnection.mAddr, mMemGetConnection.mSize,
++                                               info, pgList);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetConnection fails", __func__);
++
++    ret = mCommon.requestSync(IPC_GRAPH_GET_CONNECTION, mMemGetConnection.mHandle);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnFlattenGetConnection(mMemGetConnection.mAddr, mMemGetConnection.mSize,
++                                            scalerInfo, confVector);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetConnection fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId,
++                                           int32_t* pgId) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    GraphBaseInfo info = {mCameraId, mConfigMode};
++    bool ret =
++        mIpc.clientFlattenGetPgId(mMemGetPgId.mAddr, mMemGetPgId.mSize, info, streamId, kernelId);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetPgId fails", __func__);
++
++    ret = mCommon.requestSync(IPC_GRAPH_GET_PG_ID, mMemGetPgId.mHandle);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnFlattenGetPgId(mMemGetPgId.mAddr, mMemGetPgId.mSize, pgId);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetPgId fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigImpl::getProgramGroup(std::string pgName,
++                                          ia_isp_bxt_program_group* programGroup) {
++    // TODO: Add this API support in the future.
++    LOGIPC("@%s", __func__);
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
+new file mode 100644
+index 000000000000..77d928a3b256
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
+@@ -0,0 +1,75 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <string>
++#include <utility>
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "iutils/Utils.h"
++#include "modules/sandboxing/IPCGraphConfig.h"
++#include "src/platformdata/CameraTypes.h"
++#include "src/platformdata/gc/HalStream.h"
++#include "src/platformdata/gc/IGraphConfig.h"
++
++namespace icamera {
++
++class GraphConfigImpl {
++ public:
++    GraphConfigImpl();
++    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
++    virtual ~GraphConfigImpl();
++
++    void addCustomKeyMap();
++    status_t parse(int cameraId, const char* graphDescFile, const char* settingsFile);
++    void releaseGraphNodes();
++
++    status_t configStreams(const std::vector<HalStream*>& activeStreams);
++    status_t getGraphConfigData(IGraphType::GraphConfigData* data);
++
++    int getProgramGroup(std::string pgName, ia_isp_bxt_program_group* programGroupForPG);
++    status_t getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t* pgId);
++
++    status_t pipelineGetConnections(const std::vector<std::string>& pgList,
++                                    std::vector<IGraphType::ScalerInfo>* scalerInfo,
++                                    std::vector<IGraphType::PipelineConnection>* confVector);
++
++ private:
++    IPCGraphConfig mIpc;
++    IntelAlgoCommon mCommon;
++
++    ShmMemInfo mMemParse;
++    ShmMemInfo mMemConfig;
++    ShmMemInfo mMemGetData;
++    ShmMemInfo mMemGetPgId;
++    ShmMemInfo mMemGetConnection;
++
++    std::vector<ShmMem> mMems;
++
++    int mCameraId;
++    ConfigMode mConfigMode;
++    GraphSettingType mType;
++    bool mInitialized;
++
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
+new file mode 100644
+index 000000000000..9ab424756a89
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
+@@ -0,0 +1,319 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAiq"
++
++#include "modules/sandboxing/client/IntelAiq.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelAiq::IntelAiq() {
++    LOG1("@%s", __func__);
++
++    mAiq = reinterpret_cast<uintptr_t>(nullptr);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string deinitName = "/aiqDeinitShm" + std::to_string(personal) + "Shm";
++    std::string aeName = "/aiqAeShm" + std::to_string(personal) + "Shm";
++    std::string afName = "/aiqAfShm" + std::to_string(personal) + "Shm";
++    std::string awbName = "/aiqAwbShm" + std::to_string(personal) + "Shm";
++    std::string gbceName = "/aiqGbceShm" + std::to_string(personal) + "Shm";
++    std::string aiqdName = "/aiqAiqdShm" + std::to_string(personal) + "Shm";
++    std::string paName = "/aiqPaShm" + std::to_string(personal) + "Shm";
++    std::string saName = "/aiqSaShm" + std::to_string(personal) + "Shm";
++    std::string statName = "/aiqStatShm" + std::to_string(personal) + "Shm";
++    std::string versionName = "/aiqVersionShm" + std::to_string(personal) + "Shm";
++
++    mMems = {{deinitName.c_str(), sizeof(aiq_deinit_params), &mMemDeinit, false},
++             {aeName.c_str(), sizeof(ae_run_params), &mMemAe, false},
++             {afName.c_str(), sizeof(af_run_params), &mMemAf, false},
++             {awbName.c_str(), sizeof(awb_run_params), &mMemAwb, false},
++             {gbceName.c_str(), sizeof(gbce_run_params), &mMemGbce, false},
++             {aiqdName.c_str(), sizeof(ia_binary_data_params), &mMemAiqd, false},
++             {paName.c_str(), sizeof(pa_run_v1_params), &mMemPa, false},
++             {saName.c_str(), sizeof(sa_run_v2_params), &mMemSa, false},
++             {statName.c_str(), sizeof(set_statistics_set_v4_params), &mMemStat, false},
++             {versionName.c_str(), sizeof(ia_aiq_version_params), &mMemVersion, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOG1("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelAiq::~IntelAiq() {
++    LOG1("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                       const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                       unsigned int statsMaxHeight, unsigned int maxNumStatsIn, ia_cmc_t* cmc,
++                       ia_mkn* mkn) {
++    LOG1("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
++    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
++
++    unsigned int aiqbSize = aiqbData ? aiqbData->size : 0;
++    unsigned int nvmSize = nvmData ? nvmData->size : 0;
++    unsigned int aiqdSize = aiqdData ? aiqdData->size : 0;
++    unsigned int size = sizeof(aiq_init_params) + aiqbSize + nvmSize + aiqdSize;
++    LOG2("@%s, aiqbSize:%d, nvmSize:%d, aiqdSize:%d", __func__, aiqbSize, nvmSize, aiqdSize);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/aiqInitShm" + std::to_string(personal) + "Shm";
++    ShmMemInfo shm;
++    shm.mName = initName.c_str();
++    shm.mSize = size;
++    bool ret = mCommon.allocShmMem(shm.mName, shm.mSize, &shm);
++    CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
++
++    ret = mIpc.clientFlattenInit(aiqbData, nvmData, aiqdData, statsMaxWidth, statsMaxHeight,
++                                 maxNumStatsIn, reinterpret_cast<uintptr_t>(cmc),
++                                 reinterpret_cast<uintptr_t>(mkn), static_cast<uint8_t*>(shm.mAddr),
++                                 size);
++    if (!ret) {
++        mCommon.freeShmMem(shm);
++        LOGE("@%s, clientFlattenInit fails", __func__);
++        return nullptr;
++    }
++
++    ret = mCommon.requestSync(IPC_AIQ_INIT, shm.mHandle);
++    if (!ret) {
++        mCommon.freeShmMem(shm);
++        LOGE("@%s, requestSync fails", __func__);
++        return nullptr;
++    }
++
++    aiq_init_params* params = static_cast<aiq_init_params*>(shm.mAddr);
++    mAiq = params->results;
++    LOG2("@%s, success, aiq:%p\n", __func__, reinterpret_cast<ia_aiq*>(mAiq));
++
++    mCommon.freeShmMem(shm);
++
++    return reinterpret_cast<ia_aiq*>(mAiq);
++}
++
++ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    ae_run_params* params = static_cast<ae_run_params*>(mMemAe.mAddr);
++
++    bool ret = mIpc.clientFlattenAe(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenAe fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_AE_RUN, mMemAe.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenAe(params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAe fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    af_run_params* params = static_cast<af_run_params*>(mMemAf.mAddr);
++
++    bool ret = mIpc.clientFlattenAf(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenAf fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_AF_RUN, mMemAf.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenAf(*params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAf fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    awb_run_params* params = static_cast<awb_run_params*>(mMemAwb.mAddr);
++
++    bool ret = mIpc.clientFlattenAwb(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenAwb fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_AWB_RUN, mMemAwb.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenAwb(*params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAwb fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
++                         ia_aiq_gbce_results** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    gbce_run_params* params = static_cast<gbce_run_params*>(mMemGbce.mAddr);
++
++    bool ret = mIpc.clientFlattenGbce(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenGbce fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_GBCE_RUN, mMemGbce.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenGbce(params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenGbce fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
++                         ia_aiq_pa_results_v1** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(mMemPa.mAddr);
++
++    bool ret = mIpc.clientFlattenPaV1(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenPaV1 fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_PA_RUN_V1, mMemPa.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenPaV1(params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenPaV1 fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
++                         ia_aiq_sa_results_v1** results) {
++    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
++
++    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(mMemSa.mAddr);
++
++    bool ret = mIpc.clientFlattenSaV2(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenSaV2 fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_SA_RUN_V2, mMemSa.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenSaV2(params, results);
++    CheckError(!ret, ia_err_general, "@%s, clientUnflattenSaV2 fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
++    LOG1("@%s, inputParams:%p", __func__, inputParams);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
++
++    set_statistics_set_v4_params* params =
++        static_cast<set_statistics_set_v4_params*>(mMemStat.mAddr);
++
++    bool ret = mIpc.clientFlattenStatSetV4(mAiq, *inputParams, params);
++    CheckError(!ret, ia_err_general, "@%s, clientFlattenStatSetV4 fails", __func__);
++
++    ret = mCommon.requestSync(IPC_AIQ_STATISTICS_SET_V4, mMemStat.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
++    LOG1("@%s, outData:%p", __func__, outData);
++    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general, "@%s, mAiq is nullptr",
++               __func__);
++    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
++
++    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(mMemAiqd.mAddr);
++
++    params->aiq_handle = mAiq;
++
++    int ret = mCommon.requestSync(IPC_AIQ_GET_AIQD_DATA, mMemAiqd.mHandle);
++    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
++
++    outData->data = params->data;
++    outData->size = params->size;
++
++    return ia_err_none;
++}
++
++void IntelAiq::deinit() {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE, "@%s, mAiq is nullptr",
++               __func__);
++
++    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(mMemDeinit.mAddr);
++    params->aiq_handle = mAiq;
++
++    int ret = mCommon.requestSync(IPC_AIQ_DEINIT, mMemDeinit.mHandle);
++    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
++
++    mAiq = reinterpret_cast<uintptr_t>(nullptr);
++}
++
++void IntelAiq::getVersion(std::string* version) {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE, "@%s, mAiq is nullptr",
++               __func__);
++
++    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(mMemVersion.mAddr);
++    params->aiq_handle = mAiq;
++
++    int ret = mCommon.requestSync(IPC_AIQ_GET_VERSION, mMemVersion.mHandle);
++    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
++
++    *version = params->data;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
+new file mode 100644
+index 000000000000..109881543c00
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
+@@ -0,0 +1,70 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_aiq.h>
++#include <ia_types.h>
++
++#include <string>
++#include <vector>
++
++#include "modules/sandboxing/IPCIntelAiq.h"
++#include "modules/sandboxing/client/IntelAlgoCommon.h"
++
++namespace icamera {
++class IntelAiq {
++ public:
++    IntelAiq();
++    virtual ~IntelAiq();
++
++    ia_aiq* init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData,
++                 const ia_binary_data* aiqdData, unsigned int statsMaxWidth,
++                 unsigned int statsMaxHeight, unsigned int maxNumStatsIn, ia_cmc_t* cmc,
++                 ia_mkn* mkn);
++    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
++    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
++    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
++    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
++    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
++    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
++    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
++    ia_err getAiqdData(ia_binary_data* outData);
++    void deinit();
++    void getVersion(std::string* version);
++
++ private:
++    IPCIntelAiq mIpc;
++    IntelAlgoCommon mCommon;
++
++    uintptr_t mAiq;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemDeinit;
++    ShmMemInfo mMemAe;
++    ShmMemInfo mMemAf;
++    ShmMemInfo mMemAwb;
++    ShmMemInfo mMemGbce;
++    ShmMemInfo mMemAiqd;
++    ShmMemInfo mMemPa;
++    ShmMemInfo mMemSa;
++    ShmMemInfo mMemStat;
++    ShmMemInfo mMemVersion;
++
++    std::vector<ShmMem> mMems;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
+new file mode 100644
+index 000000000000..ae2de6332fa1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
+@@ -0,0 +1,432 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAlgoClient"
++
++#include "modules/sandboxing/client/IntelAlgoClient.h"
++
++#include <fcntl.h>
++#include <sys/mman.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "Parameters.h"
++#include "PlatformData.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelAlgoClient* IntelAlgoClient::sInstance = nullptr;
++Mutex IntelAlgoClient::sLock;
++
++IntelAlgoClient* IntelAlgoClient::getInstance() {
++    AutoMutex lock(sLock);
++
++    if (!sInstance) {
++        sInstance = new IntelAlgoClient;
++    }
++
++    return sInstance;
++}
++
++void IntelAlgoClient::releaseInstance() {
++    AutoMutex lock(sLock);
++
++    if (sInstance) {
++        delete sInstance;
++        sInstance = nullptr;
++    }
++}
++
++IntelAlgoClient::IntelAlgoClient()
++        : mErrCb(nullptr),
++          mGpuBridge(nullptr),
++          mIPCStatus(true),
++          mMojoManager(nullptr),
++          mInitialized(false) {
++    LOGIPC("@%s", __func__);
++}
++
++IntelAlgoClient::~IntelAlgoClient() {
++    LOGIPC("@%s", __func__);
++}
++
++int IntelAlgoClient::initialize() {
++    LOGIPC("@%s, mMojoManager: %p", __func__, mMojoManager);
++    CheckError(!mMojoManager, UNKNOWN_ERROR, "@%s, mMojoManager is nullptr", __func__);
++
++    mCallback = base::Bind(&IntelAlgoClient::callbackHandler, base::Unretained(this));
++    IntelAlgoClient::return_callback = returnCallback;
++
++    mNotifyCallback = base::Bind(&IntelAlgoClient::notifyHandler, base::Unretained(this));
++    IntelAlgoClient::notify = notifyCallback;
++
++    mBridge = cros::CameraAlgorithmBridge::CreateInstance(cros::CameraAlgorithmBackend::kVendorCpu,
++                                                          mMojoManager);
++    CheckError(!mBridge, UNKNOWN_ERROR, "@%s, mBridge is nullptr", __func__);
++    CheckError(mBridge->Initialize(this) != 0, UNKNOWN_ERROR, "@%s, mBridge init fails", __func__);
++
++    if (PlatformData::isUsingGpuAlgo()) {
++        LOGIPC("@%s GPU algo enabled", __func__);
++        mGpuBridge = cros::CameraAlgorithmBridge::CreateInstance(
++            cros::CameraAlgorithmBackend::kGoogleGpu, mMojoManager);
++        CheckError(!mGpuBridge, UNKNOWN_ERROR, "@%s, mGpuBridge is nullptr", __func__);
++        CheckError(mGpuBridge->Initialize(this) != 0, UNKNOWN_ERROR, "@%s, mGpuBridge init fails",
++                   __func__);
++    }
++
++    for (int i = 0; i < IPC_GROUP_NUM; i++) {
++        if (static_cast<IPC_GROUP>(i) != IPC_GROUP_GPU) {
++            mRunner[i] =
++                std::unique_ptr<Runner>(new Runner(static_cast<IPC_GROUP>(i), mBridge.get()));
++        } else if (mGpuBridge) {
++            mRunner[i] = std::unique_ptr<Runner>(new Runner(IPC_GROUP_GPU, mGpuBridge.get()));
++        }
++    }
++    mInitialized = true;
++
++    return OK;
++}
++
++bool IntelAlgoClient::isIPCFine() {
++    std::lock_guard<std::mutex> l(mIPCStatusMutex);
++    LOGIPC("@%s, mIPCStatus:%d", __func__, mIPCStatus);
++
++    return mIPCStatus;
++}
++
++void IntelAlgoClient::registerErrorCallback(const camera_callback_ops_t* errCb) {
++    LOGIPC("@%s, errCb:%p", __func__, errCb);
++
++    std::lock_guard<std::mutex> l(mIPCStatusMutex);
++    mErrCb = errCb;
++
++    if (!mIPCStatus && mErrCb) {
++        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
++        mErrCb->notify(mErrCb, data);
++    }
++}
++
++int IntelAlgoClient::allocateShmMem(const std::string& name, int size, int* fd, void** addr) {
++    LOGIPC("@%s, name:%s, size:%d", __func__, name.c_str(), size);
++
++    *fd = -1;
++    *addr = nullptr;
++    int shmFd = -1;
++    void* shmAddr = nullptr;
++
++    shmFd = shm_open(name.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
++    CheckError((shmFd == -1), UNKNOWN_ERROR, "@%s, call shm_open fail", __func__);
++
++    do {
++        int ret = fcntl(shmFd, F_GETFD);
++        if (ret == -1) {
++            LOGE("@%s, call fcntl fail, error %s", __func__, strerror(errno));
++            break;
++        }
++
++        ret = ftruncate(shmFd, size);
++        if (ret == -1) {
++            LOGE("@%s, call ftruncate fail, error %s", __func__, strerror(errno));
++            break;
++        }
++
++        struct stat sb;
++        ret = fstat(shmFd, &sb);
++        if (ret == -1) {
++            LOGE("@%s, call fstat fail, error %s", __func__, strerror(errno));
++            break;
++        }
++
++        shmAddr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, shmFd, 0);
++        if (!shmAddr) {
++            LOGE("@%s, call mmap fail, error %s", __func__, strerror(errno));
++            break;
++        }
++
++        *fd = shmFd;
++        *addr = shmAddr;
++
++        return OK;
++    } while (0);
++
++    close(shmFd);
++    return UNKNOWN_ERROR;
++}
++
++void IntelAlgoClient::releaseShmMem(const std::string& name, int size, int fd, void* addr) {
++    LOGIPC("@%s, name:%s, size:%d, fd:%d, addr:%p", __func__, name.c_str(), size, fd, addr);
++
++    munmap(addr, size);
++    close(fd);
++    shm_unlink(name.c_str());
++}
++
++int IntelAlgoClient::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
++    LOGIPC("@%s, cmd:%d:%s, bufferHandle:%d, mInitialized:%d", __func__, cmd,
++           IntelAlgoIpcCmdToString(cmd), bufferHandle, mInitialized);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++    CheckError(!isIPCFine(), UNKNOWN_ERROR, "@%s, IPC error happens", __func__);
++
++    IPC_GROUP group = IntelAlgoIpcCmdToGroup(cmd);
++
++    return mRunner[group]->requestSync(cmd, bufferHandle);
++}
++
++int IntelAlgoClient::requestSync(IPC_CMD cmd) {
++    return requestSync(cmd, -1);
++}
++
++int32_t IntelAlgoClient::registerBuffer(int bufferFd, void* addr, ShmMemUsage usage) {
++    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
++    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
++    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
++
++    int32_t handle = -1;
++    if (usage == CPU_ALGO_SHM) {
++        handle = mBridge->RegisterBuffer(bufferFd);
++    } else if (mGpuBridge) {
++        handle = mGpuBridge->RegisterBuffer(bufferFd);
++    }
++    if (handle >= 0) {
++        std::lock_guard<std::mutex> l(mShmMapMutex);
++        mShmMap[addr] = handle;
++    }
++    return handle;
++}
++
++void IntelAlgoClient::deregisterBuffer(int32_t bufferHandle, ShmMemUsage usage) {
++    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
++
++    {
++        std::lock_guard<std::mutex> l(mShmMapMutex);
++        for (auto& item : mShmMap) {
++            if (item.second == bufferHandle) {
++                mShmMap.erase(item.first);
++                break;
++            }
++        }
++    }
++    std::vector<int32_t> handles({bufferHandle});
++    if (usage == CPU_ALGO_SHM) {
++        mBridge->DeregisterBuffers(handles);
++    } else if (mGpuBridge) {
++        mGpuBridge->DeregisterBuffers(handles);
++    }
++}
++
++int32_t IntelAlgoClient::registerGbmBuffer(int bufferFd) {
++    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
++    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
++    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
++
++    return mBridge->RegisterBuffer(bufferFd);
++}
++
++void IntelAlgoClient::deregisterGbmBuffer(int32_t bufferHandle) {
++    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
++    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
++
++    std::vector<int32_t> handles({bufferHandle});
++    mBridge->DeregisterBuffers(handles);
++}
++
++int32_t IntelAlgoClient::getBufferHandle(void* addr) {
++    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
++    if (!addr) return -1;
++
++    std::lock_guard<std::mutex> l(mShmMapMutex);
++    CheckError(mShmMap.find(addr) == mShmMap.end(), -1, "%s, Invalid client addr", __func__);
++    return mShmMap[addr];
++}
++
++void IntelAlgoClient::callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle) {
++    LOGIPC("@%s, req_id:%d, status:%d, buffer_handle:%d", __func__, req_id, status, buffer_handle);
++
++    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
++    mRunner[group]->callbackHandler(status, buffer_handle);
++}
++
++void IntelAlgoClient::notifyHandler(uint32_t msg) {
++    LOGIPC("@%s, msg:%d", __func__, msg);
++
++    if (msg != CAMERA_ALGORITHM_MSG_IPC_ERROR) {
++        LOGE("@%s, receive msg:%d, not CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__, msg);
++        return;
++    }
++
++    std::lock_guard<std::mutex> l(mIPCStatusMutex);
++    mIPCStatus = false;
++
++    if (mErrCb) {
++        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
++        mErrCb->notify(mErrCb, data);
++    } else {
++        LOGE("@%s, mErrCb is nullptr, no device error is sent out", __func__);
++    }
++    LOGE("@%s, receive CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__);
++}
++
++void IntelAlgoClient::returnCallback(const camera_algorithm_callback_ops_t* callback_ops,
++                                     uint32_t req_id, uint32_t status, int32_t buffer_handle) {
++    LOGIPC("@%s", __func__);
++    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
++
++    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
++    s->callbackHandler(req_id, status, buffer_handle);
++}
++
++void IntelAlgoClient::notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
++                                     camera_algorithm_error_msg_code_t msg) {
++    LOGIPC("@%s", __func__);
++    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
++
++    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
++    s->notifyHandler((uint32_t)msg);
++}
++
++IntelAlgoClient::Runner::Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge)
++        : mGroup(group),
++          mBridge(bridge),
++          mIsCallbacked(false),
++          mCbResult(true),
++          mInitialized(false) {
++    LOGIPC("@%s, group:%d", __func__, mGroup);
++
++    pthread_condattr_t attr;
++    int ret = pthread_condattr_init(&attr);
++    if (ret != 0) {
++        LOGE("@%s, call pthread_condattr_init fails, ret:%d", __func__, ret);
++        pthread_condattr_destroy(&attr);
++        return;
++    }
++
++    ret = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
++    if (ret != 0) {
++        LOGE("@%s, call pthread_condattr_setclock fails, ret:%d", __func__, ret);
++        pthread_condattr_destroy(&attr);
++        return;
++    }
++
++    ret = pthread_cond_init(&mCbCond, &attr);
++    if (ret != 0) {
++        LOGE("@%s, call pthread_cond_init fails, ret:%d", __func__, ret);
++        pthread_condattr_destroy(&attr);
++        return;
++    }
++
++    pthread_condattr_destroy(&attr);
++
++    ret = pthread_mutex_init(&mCbLock, nullptr);
++    CheckError(ret != 0, VOID_VALUE, "@%s, call pthread_mutex_init fails, ret:%d", __func__, ret);
++
++    mInitialized = true;
++}
++
++IntelAlgoClient::Runner::~Runner() {
++    LOGIPC("@%s, group:%d", __func__, mGroup);
++
++    int ret = pthread_cond_destroy(&mCbCond);
++    if (ret != 0) {
++        LOGE("@%s, call pthread_cond_destroy fails, ret:%d", __func__, ret);
++    }
++
++    ret = pthread_mutex_destroy(&mCbLock);
++    if (ret != 0) {
++        LOGE("@%s, call pthread_mutex_destroy fails, ret:%d", __func__, ret);
++    }
++}
++
++int IntelAlgoClient::Runner::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
++    LOGIPC("@%s, cmd:%d:%s, group:%d, bufferHandle:%d, mInitialized:%d", __func__, cmd,
++           IntelAlgoIpcCmdToString(cmd), mGroup, bufferHandle, mInitialized);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    std::lock_guard<std::mutex> lck(mMutex);
++
++    std::vector<uint8_t> reqHeader(IPC_REQUEST_HEADER_USED_NUM);
++    reqHeader[0] = IPC_MATCHING_KEY;
++
++    // cmd is for request id, no duplicate command will be issued at any given time.
++    mBridge->Request(cmd, reqHeader, bufferHandle);
++    int ret = waitCallback();
++    CheckError((ret != OK), UNKNOWN_ERROR, "@%s, call waitCallback fail", __func__);
++
++    LOGIPC("@%s, cmd:%d:%s, group:%d, mCbResult:%d, done!", __func__, cmd,
++           IntelAlgoIpcCmdToString(cmd), mGroup, mCbResult);
++
++    // check callback result
++    CheckError((mCbResult != true), UNKNOWN_ERROR, "@%s, callback fail", __func__);
++
++    return OK;
++}
++
++void IntelAlgoClient::Runner::callbackHandler(uint32_t status, int32_t buffer_handle) {
++    LOGIPC("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
++    if (status != 0) {
++        LOGE("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
++    }
++    mCbResult = status != 0 ? false : true;
++
++    pthread_mutex_lock(&mCbLock);
++    mIsCallbacked = true;
++    int ret = pthread_cond_signal(&mCbCond);
++    pthread_mutex_unlock(&mCbLock);
++
++    CheckError(ret != 0, VOID_VALUE, "@%s, group:%d, call pthread_cond_signal fails, ret:%d",
++               __func__, mGroup, ret);
++}
++
++int IntelAlgoClient::Runner::waitCallback() {
++    LOGIPC("@%s, group:%d", __func__, mGroup);
++
++    nsecs_t startTime = CameraUtils::systemTime();
++
++    pthread_mutex_lock(&mCbLock);
++    if (!mIsCallbacked) {
++        int ret = 0;
++        struct timespec ts = {0, 0};
++        clock_gettime(CLOCK_MONOTONIC, &ts);
++        ts.tv_sec += 5;  // 5s timeout
++
++        while (!mIsCallbacked && !ret) {
++            ret = pthread_cond_timedwait(&mCbCond, &mCbLock, &ts);
++        }
++        if (ret != 0) {
++            LOGE("@%s, group:%d, call pthread_cond_timedwait fail, ret:%d, it takes %" PRId64 "ms",
++                 __func__, mGroup, ret, (CameraUtils::systemTime() - startTime) / 1000000);
++            pthread_mutex_unlock(&mCbLock);
++            return UNKNOWN_ERROR;
++        }
++    }
++    mIsCallbacked = false;
++    pthread_mutex_unlock(&mCbLock);
++
++    LOGIPC("@%s: group:%d, it takes %" PRId64 "ms", __func__, mGroup,
++           (CameraUtils::systemTime() - startTime) / 1000000);
++
++    return OK;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
+new file mode 100644
+index 000000000000..e076573acc8d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
+@@ -0,0 +1,134 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <pthread.h>
++
++#include <memory>
++#include <mutex>
++#include <string>
++#include <unordered_map>
++
++#include "CameraLog.h"
++#include "Parameters.h"
++#include "base/bind.h"
++#include "base/callback.h"
++#include "cros-camera/camera_algorithm_bridge.h"
++#include "iutils/Thread.h"
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++
++typedef enum ShmMemUsage { CPU_ALGO_SHM, GPU_ALGO_SHM } ShmMemUsage;
++
++class IntelAlgoClient : public camera_algorithm_callback_ops_t {
++ public:
++    static IntelAlgoClient* getInstance();
++    static void releaseInstance();
++
++    IntelAlgoClient();
++    virtual ~IntelAlgoClient();
++
++    void setMojoManager(cros::CameraMojoChannelManager* manager) { mMojoManager = manager; }
++
++    // Connect to the algo processes(cpu and gpu)
++    // It must be called after all preparation are ready in camera service
++    int initialize();
++
++    bool isIPCFine();
++
++    // when IPC error happens, device error
++    // will be sent out via the camera_callback_ops_t which belongs to CameraHal.
++    // before the CameraHal be terminated, set nullptr in the function.
++    void registerErrorCallback(const camera_callback_ops_t* errCb);
++
++    int allocateShmMem(const std::string& name, int size, int* fd, void** addr);
++    void releaseShmMem(const std::string& name, int size, int fd, void* addr);
++
++    int requestSync(IPC_CMD cmd, int32_t bufferHandle);
++    int requestSync(IPC_CMD cmd);
++
++    int32_t registerBuffer(int bufferFd, void* addr, ShmMemUsage usage = CPU_ALGO_SHM);
++    void deregisterBuffer(int32_t bufferHandle, ShmMemUsage usage = CPU_ALGO_SHM);
++    int32_t registerGbmBuffer(int bufferFd);
++    void deregisterGbmBuffer(int32_t bufferHandle);
++    int32_t getBufferHandle(void* addr);
++
++ private:
++    int waitCallback();
++
++    void callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle);
++    void notifyHandler(uint32_t msg);
++
++    // when the request is done, the callback will be received.
++    static void returnCallback(const camera_algorithm_callback_ops_t* callback_ops, uint32_t req_id,
++                               uint32_t status, int32_t buffer_handle);
++    // when IPC error happens in the bridge, notifyCallback will be called.
++    static void notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
++                               camera_algorithm_error_msg_code_t msg);
++
++ private:
++    /*
++     * Get access to the IntelAlgoClient singleton.
++     */
++    static IntelAlgoClient* sInstance;
++    static Mutex sLock;  // Guard for singleton creation.
++
++    const camera_callback_ops_t* mErrCb;
++
++    std::unique_ptr<cros::CameraAlgorithmBridge> mBridge;
++    std::unique_ptr<cros::CameraAlgorithmBridge> mGpuBridge;
++
++    base::Callback<void(uint32_t, uint32_t, int32_t)> mCallback;
++    base::Callback<void(uint32_t)> mNotifyCallback;
++    bool mIPCStatus;             // true: no error happens, false: error happens
++    std::mutex mIPCStatusMutex;  // the mutex for mIPCStatus
++
++    std::unordered_map<void*, int32_t> mShmMap;  // <addr in client, server handle in server>
++    std::mutex mShmMapMutex;                     // the mutex for mShmMap
++
++    cros::CameraMojoChannelManager* mMojoManager;
++    bool mInitialized;
++
++ private:
++    class Runner {
++     public:
++        Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge);
++        virtual ~Runner();
++        int requestSync(IPC_CMD cmd, int32_t bufferHandle);
++        void callbackHandler(uint32_t status, int32_t buffer_handle);
++
++     private:
++        int waitCallback();
++
++     private:
++        IPC_GROUP mGroup;
++        cros::CameraAlgorithmBridge* mBridge;
++        pthread_mutex_t mCbLock;
++        pthread_cond_t mCbCond;
++        bool mIsCallbacked;
++        bool mCbResult;  // true: success, false: fail
++
++        bool mInitialized;
++
++        std::mutex mMutex;  // the mutex for the public method
++    };
++
++    std::unique_ptr<Runner> mRunner[IPC_GROUP_NUM];
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
+new file mode 100644
+index 000000000000..6211a3d84e8e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
+@@ -0,0 +1,131 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAlgoCommon"
++
++#include "modules/sandboxing/client/IntelAlgoCommon.h"
++
++#include <string>
++#include <vector>
++
++#include "CameraLog.h"
++#include "PlatformData.h"
++
++namespace icamera {
++IntelAlgoCommon::IntelAlgoCommon() {
++    LOGIPC("@%s", __func__);
++
++    mClient = IntelAlgoClient::getInstance();
++    LOGIPC("@%s, mClient:%p", __func__, mClient);
++}
++
++IntelAlgoCommon::~IntelAlgoCommon() {
++    LOGIPC("@%s", __func__);
++}
++
++bool IntelAlgoCommon::allocShmMem(const std::string& name, int size, ShmMemInfo* shm,
++                                  ShmMemUsage usage) {
++    LOGIPC("@%s", __func__);
++    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
++
++    shm->mName = name;
++    shm->mSize = size;
++    int ret = mClient->allocateShmMem(shm->mName, shm->mSize, &shm->mFd, &shm->mAddr);
++    CheckError((ret != OK), false, "@%s, call allocateShmMem fail", __func__);
++
++    shm->mHandle = mClient->registerBuffer(shm->mFd, shm->mAddr, usage);
++    if (shm->mHandle < 0) {
++        LOGE("@%s, call mBridge->RegisterBuffer fail", __func__);
++        mClient->releaseShmMem(shm->mName, shm->mSize, shm->mFd, shm->mAddr);
++        return false;
++    }
++
++    return true;
++}
++
++int32_t IntelAlgoCommon::registerGbmBuffer(int bufferFd) {
++    LOGIPC("@%s, bufferFd:%d", __func__, bufferFd);
++    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
++
++    return mClient->registerGbmBuffer(bufferFd);
++}
++
++void IntelAlgoCommon::deregisterGbmBuffer(int32_t bufferHandle) {
++    LOGIPC("@%s, bufferHandle:%d", __func__, bufferHandle);
++    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
++
++    mClient->deregisterGbmBuffer(bufferHandle);
++}
++
++bool IntelAlgoCommon::requestSync(IPC_CMD cmd, int32_t handle) {
++    LOGIPC("@%s", __func__);
++    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
++
++    return mClient->requestSync(cmd, handle) == OK ? true : false;
++}
++
++bool IntelAlgoCommon::requestSync(IPC_CMD cmd) {
++    LOGIPC("@%s", __func__);
++    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
++
++    return mClient->requestSync(cmd) == OK ? true : false;
++}
++
++void IntelAlgoCommon::freeShmMem(const ShmMemInfo& shm, ShmMemUsage usage) {
++    LOGIPC("@%s, mHandle:%d, mFd:%d, mName:%s, mSize:%d, mAddr:%p", __func__, shm.mHandle, shm.mFd,
++           shm.mName.c_str(), shm.mSize, shm.mAddr);
++    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
++    if (shm.mHandle < 0 || shm.mFd < 0) {
++        LOGE("@%s, mHandle:%d, mFd:%d, one of them < 0", __func__, shm.mHandle, shm.mFd);
++        return;
++    }
++
++    mClient->deregisterBuffer(shm.mHandle, usage);
++    mClient->releaseShmMem(shm.mName, shm.mSize, shm.mFd, shm.mAddr);
++}
++
++bool IntelAlgoCommon::allocateAllShmMems(std::vector<ShmMem>* mems) {
++    LOGIPC("@%s", __func__);
++
++    for (auto& it : *mems) {
++        ShmMemInfo* mem = it.mem;
++        mem->mName = it.name;
++        mem->mSize = it.size;
++        bool ret = allocShmMem(mem->mName, mem->mSize, mem);
++        CheckError(!ret, false, "@%s, allocShmMem fails, name:%s, size:%d", __func__,
++                   mem->mName.c_str(), mem->mSize);
++        it.allocated = true;
++    }
++
++    return true;
++}
++
++void IntelAlgoCommon::releaseAllShmMems(const std::vector<ShmMem>& mems) {
++    LOGIPC("@%s", __func__);
++
++    for (auto& it : mems) {
++        if (it.allocated) {
++            freeShmMem(*it.mem);
++        }
++    }
++}
++
++int32_t IntelAlgoCommon::getShmMemHandle(void* addr) {
++    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
++    return mClient->getBufferHandle(addr);
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
+new file mode 100644
+index 000000000000..5634528dc929
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++#include <vector>
++
++#include "IntelAlgoClient.h"
++
++namespace icamera {
++typedef struct ShmMemInfo {
++    std::string mName;
++    int mSize;
++    int mFd;
++    void* mAddr;
++    int32_t mHandle;
++    ShmMemInfo() : mName(""), mSize(0), mFd(-1), mAddr(nullptr), mHandle(-1) {}
++} ShmMemInfo;
++
++typedef struct ShmMem {
++    std::string name;
++    int size;
++    ShmMemInfo* mem;
++    bool allocated;
++} ShmMem;
++
++class IntelAlgoCommon {
++ public:
++    IntelAlgoCommon();
++    virtual ~IntelAlgoCommon();
++
++    bool allocShmMem(const std::string& name, int size, ShmMemInfo* shm,
++                     ShmMemUsage usage = CPU_ALGO_SHM);
++    int32_t registerGbmBuffer(int bufferFd);
++    void deregisterGbmBuffer(int32_t bufferHandle);
++    bool requestSync(IPC_CMD cmd, int32_t handle);
++    bool requestSync(IPC_CMD cmd);
++    void freeShmMem(const ShmMemInfo& shm, ShmMemUsage usage = CPU_ALGO_SHM);
++
++    bool allocateAllShmMems(std::vector<ShmMem>* mems);
++    void releaseAllShmMems(const std::vector<ShmMem>& mems);
++
++    int32_t getShmMemHandle(void* addr);
++
++ private:
++    IntelAlgoClient* mClient;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
+new file mode 100644
+index 000000000000..94406539310a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
+@@ -0,0 +1,107 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelCmc"
++
++#include "modules/sandboxing/client/IntelCmc.h"
++
++#include <string>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelCmc::IntelCmc() : mInitialized(false) {
++    LOGIPC("@%s", __func__);
++
++    mHandle = nullptr;
++    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/cmcInit" + std::to_string(personal) + "Shm";
++    std::string deinitName = "/cmcDeinit" + std::to_string(personal) + "Shm";
++
++    mMems = {{initName.c_str(), sizeof(cmc_init_params), &mMemInit, false},
++             {deinitName.c_str(), sizeof(cmc_deinit_params), &mMemDeinit, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelCmc::~IntelCmc() {
++    LOGIPC("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++bool IntelCmc::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData) {
++    LOGIPC("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
++    CheckError(nvmData, false, "@%s, nvmData should be nullptr", __func__);
++
++    CheckError(mInitialized == false, false, "@%s, mInitialized is false", __func__);
++    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
++    CheckError(!aiqbData->data, false, "@%s, aiqbData->data is nullptr", __func__);
++    CheckError(aiqbData->size == 0, false, "@%s, aiqbData->size is 0", __func__);
++
++    cmc_init_params* params = static_cast<cmc_init_params*>(mMemInit.mAddr);
++
++    bool ret = mIpc.clientFlattenInit(*aiqbData, params);
++    CheckError(ret == false, false, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_CMC_INIT, mMemInit.mHandle);
++    CheckError(ret == false, false, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenInit(*params, &mHandle, &mCmcRemoteHandle);
++    CheckError(ret == false, false, "@%s, clientUnflattenInit fails", __func__);
++
++    return true;
++}
++
++ia_cmc_t* IntelCmc::getCmc() const {
++    LOGIPC("@%s, mHandle:%p", __func__, mHandle);
++
++    return mHandle;
++}
++
++uintptr_t IntelCmc::getCmcHandle() const {
++    LOGIPC("@%s", __func__);
++
++    return mCmcRemoteHandle;
++}
++
++void IntelCmc::deinit() {
++    LOGIPC("@%s, mCmc:%p", __func__, mHandle);
++
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(!mHandle, VOID_VALUE, "@%s, mHandle is nullptr", __func__);
++    CheckError(reinterpret_cast<ia_cmc_t*>(mCmcRemoteHandle) == nullptr, VOID_VALUE,
++               "@%s, mCmcRemoteHandle is nullptr", __func__);
++
++    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(mMemDeinit.mAddr);
++    params->cmc_handle = mCmcRemoteHandle;
++
++    bool ret = mCommon.requestSync(IPC_CMC_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++    mHandle = nullptr;
++    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
+new file mode 100644
+index 000000000000..be5544bfbacb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include <ia_cmc_parser.h>
++
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelCmc.h"
++
++namespace icamera {
++class IntelCmc {
++ public:
++    IntelCmc();
++    virtual ~IntelCmc();
++
++    // the nvmData must be nullptr currently
++    bool init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData);
++
++    ia_cmc_t* getCmc() const;
++    uintptr_t getCmcHandle() const;
++
++    void deinit();
++
++ private:
++    IPCIntelCmc mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemDeinit;
++
++    std::vector<ShmMem> mMems;
++
++    ia_cmc_t* mHandle;  // it points to the SHM
++
++    // the pointer is in another process.
++    // because the ia_aiq_init() needs the cmc pointer,
++    // so keep the pinter in the IntelCmc and pass it aiq when init aiq.
++    // at the same time, it will be used when deinit the cmc.
++    uintptr_t mCmcRemoteHandle;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
+new file mode 100644
+index 000000000000..ce5bd9a37e8d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
+@@ -0,0 +1,336 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ClientIntelDvs"
++
++#include "modules/sandboxing/client/IntelDvs.h"
++
++#include <string>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelDvs::IntelDvs() : mInitialized(false) {
++    LOGIPC("@%s", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/dvsInit" + std::to_string(personal) + SHM_NAME;
++    std::string deinitName = "/dvsDeinit" + std::to_string(personal) + SHM_NAME;
++    std::string configName = "/dvsConfig" + std::to_string(personal) + SHM_NAME;
++    std::string setNonBlankRatioName = "/dvsSetNonBlankRatio" + std::to_string(personal) + SHM_NAME;
++    std::string setDigitalZoomModeName =
++        "/dvsSetDigitalZoomModeName" + std::to_string(personal) + SHM_NAME;
++    std::string setDigitalZoomRegionName =
++        "/dvsSetDigitalZoomRegionName" + std::to_string(personal) + SHM_NAME;
++    std::string setDigitalZoomCoordinateName =
++        "/dvsSetDigitalZoomCoordinateName" + std::to_string(personal) + SHM_NAME;
++    std::string setDigitalZoomMagnitudeName =
++        "/dvsSetDigitalZoomMagnitudeName" + std::to_string(personal) + SHM_NAME;
++    std::string freeMorphTableName = "/dvsFreeMorphTableName" + std::to_string(personal) + SHM_NAME;
++    std::string allocateMorphTalbeName =
++        "/dvsAllocateMorphTalbeName" + std::to_string(personal) + SHM_NAME;
++    std::string getMorphTableName = "/dvsGetMorphTableName" + std::to_string(personal) + SHM_NAME;
++    std::string setStatisticsName = "/dvsSetStatisticsName" + std::to_string(personal) + SHM_NAME;
++    std::string executeName = "/dvsExecuteName" + std::to_string(personal) + SHM_NAME;
++    std::string getImageTransformationName =
++        "/dvsGetImageTransformationName" + std::to_string(personal) + SHM_NAME;
++
++    mMems = {
++        {initName.c_str(), sizeof(DvsInitParams), &mMemInit, false},
++        {deinitName.c_str(), sizeof(DvsDeinitParams), &mMemDeinit, false},
++        {configName.c_str(), sizeof(DvsConfigParams), &mMemConfig, false},
++        {setNonBlankRatioName.c_str(), sizeof(DvsNoneBlankRatioParams), &mMemNonBlankRatio, false},
++        {setDigitalZoomModeName.c_str(), sizeof(DvsDigitalZoomMode), &mMemZoomMode, false},
++        {setDigitalZoomRegionName.c_str(), sizeof(DvsDigitalZoomRegion), &mMemZoomRegion, false},
++        {setDigitalZoomCoordinateName.c_str(), sizeof(DvsDigitalZoomCoordinate),
++         &mMemZoomCoordinate, false},
++        {setDigitalZoomMagnitudeName.c_str(), sizeof(DvsDigitalZoomMagnitude), &mMemZoomMagnitude,
++         false},
++        {freeMorphTableName.c_str(), sizeof(DvsFreeMorphParams), &mMemFreeMorph, false},
++        {allocateMorphTalbeName.c_str(), sizeof(DvsMorphParams), &mMemAllocateMorph, false},
++        {getMorphTableName.c_str(), sizeof(DvsMorphParams), &mMemGetMorphTable, false},
++        {setStatisticsName.c_str(), sizeof(DvsStatistcs), &mMemStatistics, false},
++        {executeName.c_str(), sizeof(DvsExecute), &mMemExecute, false},
++        {getImageTransformationName.c_str(), sizeof(DvsImageTransformation), &mMemImageTransfor,
++         false},
++    };
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelDvs::~IntelDvs() {
++    LOGIPC("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++ia_err IntelDvs::init(const ia_binary_data& aiqTuningBinary, const ia_cmc_t* cmc,
++                      ia_dvs_state** dvsHandle) {
++    LOGIPC("@%s", __func__);
++    CheckError(mInitialized == false, ia_err_none, "@%s, mInitialized is false", __func__);
++    CheckError(aiqTuningBinary.data == nullptr, ia_err_none, "@%s, aiqTuningBinary.data is nullptr",
++               __func__);
++    CheckError(aiqTuningBinary.size == 0, ia_err_none, "@%s, aiqTuningBinary.size is 0", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, &aiqTuningBinary, cmc);
++    CheckError(ret == false, ia_err_none, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_INIT, mMemInit.mHandle);
++    CheckError(ret == false, ia_err_none, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, dvsHandle);
++    CheckError(ret == false, ia_err_none, "@%s, clientUnflattenInit fails", __func__);
++    return ia_err_none;
++}
++
++void IntelDvs::deinit(ia_dvs_state* dvsHandle) {
++    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, dvsHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++ia_err IntelDvs::config(ia_dvs_state* dvsHandle, ia_dvs_configuration* config, float zoomRatio) {
++    LOGIPC("@%s, dvsHandle:%p, config:%p, zoomRatio:%f", __func__, dvsHandle, config, zoomRatio);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(config == nullptr, ia_err_general, "@%s, config is nullptr", __func__);
++
++    bool ret =
++        mIpc.clientFlattenConfig(mMemConfig.mAddr, mMemConfig.mSize, dvsHandle, config, zoomRatio);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenConfig fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_CONFIG, mMemConfig.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::setNonBlankRatio(ia_dvs_state* dvsHandle, float nonBlankingRatio) {
++    LOGIPC("@%s, dvsHandle:%p, nonBlankingRatio:%f", __func__, dvsHandle, nonBlankingRatio);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenNoneBlanckRation(mMemNonBlankRatio.mAddr, mMemNonBlankRatio.mSize,
++                                                  dvsHandle, nonBlankingRatio);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenNoneBlanckRation fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_NONE_BLANK_RATION, mMemNonBlankRatio.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state* dvsHandle, ia_dvs_zoom_mode zoomMode) {
++    LOGIPC("@%s, dvsHandle:%p, zoomMode:%f", __func__, dvsHandle, zoomMode);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenDigitalZoomMode(mMemZoomMode.mAddr, mMemZoomMode.mSize, dvsHandle,
++                                                 zoomMode);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenDigitalZoomMode fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MODE, mMemZoomMode.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state* dvsHandle, ia_rectangle* zoomRegion) {
++    LOGIPC("@%s, dvsHandle:%p, zoomRegion:%p", __func__, dvsHandle, zoomRegion);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(zoomRegion == nullptr, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenDigitalZoomRegion(mMemZoomRegion.mAddr, mMemZoomRegion.mSize,
++                                                   dvsHandle, zoomRegion);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenDigitalZoomRegion fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_REGION, mMemZoomRegion.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state* dvsHandle, ia_coordinate* zoomCoordinate) {
++    LOGIPC("@%s, dvsHandle:%p, zoomCoordinate:%p", __func__, dvsHandle, zoomCoordinate);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(zoomCoordinate == nullptr, ia_err_general, "@%s, zoomCoordinate is nullptr",
++               __func__);
++
++    bool ret = mIpc.clientFlattenDigitalZoomCoordinate(
++        mMemZoomCoordinate.mAddr, mMemZoomCoordinate.mSize, dvsHandle, zoomCoordinate);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenDigitalZoomCoordinate fails",
++               __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE, mMemZoomCoordinate.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state* dvsHandle, float zoomRatio) {
++    LOGIPC("@%s, dvsHandle:%p, zoomRatio:%f", __func__, dvsHandle, zoomRatio);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenDigitalZoomMagnitude(
++        mMemZoomMagnitude.mAddr, mMemZoomMagnitude.mSize, dvsHandle, zoomRatio);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenDigitalZoomMagnitude fails",
++               __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE, mMemZoomMagnitude.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++void IntelDvs::freeMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable) {
++    LOGIPC("@%s, dvsHandle%p, morphTable:%p", __func__, dvsHandle, morphTable);
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(morphTable == nullptr, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenFreeMorphTable(mMemFreeMorph.mAddr, mMemFreeMorph.mSize, dvsHandle,
++                                                morphTable);
++    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenFreeMorphTable fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_FREE_MORPH_TABLE, mMemFreeMorph.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++ia_dvs_morph_table* IntelDvs::allocateMorphTalbe(ia_dvs_state* dvsHandle) {
++    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, nullptr, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenAllocateMorphTable(mMemAllocateMorph.mAddr,
++                                                    mMemAllocateMorph.mSize, dvsHandle);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocateMorphTable fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_ALLOCATE_MORPH_TABLE, mMemAllocateMorph.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    ia_dvs_morph_table* morphTable = nullptr;
++    ret = mIpc.clientUnflattenAllocateMorphTalbe(mMemAllocateMorph.mAddr, mMemAllocateMorph.mSize,
++                                                 &morphTable);
++    CheckError(ret == false, nullptr, "@%s, clientUnflattenAllocateMorphTalbe fails", __func__);
++
++    return morphTable;
++}
++
++int IntelDvs::getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable,
++                            DvsResult* result) {
++    LOGIPC("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, UNKNOWN_ERROR, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(morphTable == nullptr, UNKNOWN_ERROR, "@%s, morphTable is nullptr", __func__);
++    CheckError(result == nullptr, UNKNOWN_ERROR, "@%s, result is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenGetMorphTable(mMemGetMorphTable.mAddr, mMemGetMorphTable.mSize,
++                                               dvsHandle, morphTable);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetMorphTable fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_GET_MORPH_TABLE, mMemGetMorphTable.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ia_dvs_morph_table* morphTableTmp = nullptr;
++    ret = mIpc.clientUnflattenGetMorphTalbe(mMemGetMorphTable.mAddr, mMemGetMorphTable.mSize,
++                                            &morphTableTmp);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenGetMorphTalbe fails", __func__);
++
++    int err = DvsResult::deepCopyDvsResults(*morphTableTmp, &result->mMorphTable);
++    CheckError(err != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails", __func__);
++
++    return OK;
++}
++
++ia_err IntelDvs::setStatistics(ia_dvs_state* dvsHandle, const ia_dvs_statistics* statistics,
++                               const ia_aiq_ae_results* aeResults,
++                               const ia_aiq_af_results* afResults,
++                               const ia_aiq_sensor_events* sensorEvents, uint64_t frameReadoutStart,
++                               uint64_t frameReadoutEnd) {
++    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenSetStatistics(mMemStatistics.mAddr, mMemStatistics.mSize,
++                                               dvsHandle, statistics, aeResults, afResults,
++                                               sensorEvents, frameReadoutStart, frameReadoutEnd);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenSetStatistics fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_SET_STATISTICS, mMemStatistics.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::execute(ia_dvs_state* dvsHandle, uint16_t focusPosition) {
++    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++
++    bool ret =
++        mIpc.clientFlattenExecute(mMemExecute.mAddr, mMemExecute.mSize, dvsHandle, focusPosition);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetMorphTable fails", __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_EXECUTE, mMemExecute.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelDvs::getImageTransformation(ia_dvs_state* dvsHandle,
++                                        ia_dvs_image_transformation* imageTransformation) {
++    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
++    CheckError(imageTransformation == nullptr, ia_err_general,
++               "@%s, imageTransformation is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenImageTransformation(mMemImageTransfor.mAddr,
++                                                     mMemImageTransfor.mSize, dvsHandle);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenImageTransformation fails",
++               __func__);
++
++    ret = mCommon.requestSync(IPC_DVS_GET_IMAGE_TRANSFORMATION, mMemImageTransfor.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ia_dvs_image_transformation* info = nullptr;
++    ret = mIpc.clientUnflattenImageTransformation(mMemImageTransfor.mAddr, mMemImageTransfor.mSize,
++                                                  &info);
++    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenImageTransformation fails",
++               __func__);
++
++    MEMCPY_S(imageTransformation, sizeof(ia_dvs_image_transformation), info,
++             sizeof(ia_dvs_image_transformation));
++    return ia_err_none;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
+new file mode 100644
+index 000000000000..0b4354f9280f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_dvs.h>
++#include <ia_dvs_types.h>
++#include <ia_isp_bxt.h>
++
++#include <vector>
++
++#include "DvsResult.h"
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelDvs.h"
++
++namespace icamera {
++class IntelDvs {
++ public:
++    IntelDvs();
++    virtual ~IntelDvs();
++
++    ia_err init(const ia_binary_data& aiqTuningBinary, const ia_cmc_t* cmc,
++                ia_dvs_state** dvsHandle);
++    void deinit(ia_dvs_state* dvsHandle);
++    ia_err config(ia_dvs_state* dvsHandle, ia_dvs_configuration* config, float zoomRatio);
++    ia_err setNonBlankRatio(ia_dvs_state* dvsHandle, float nonBlankingRatio);
++    ia_err setDigitalZoomMode(ia_dvs_state* dvsHandle, ia_dvs_zoom_mode zoomMode);
++    ia_err setDigitalZoomRegion(ia_dvs_state* dvsHandle, ia_rectangle* zoomRegion);
++    ia_err setDigitalZoomCoordinate(ia_dvs_state* dvsHandle, ia_coordinate* zoomCoordinate);
++    ia_err setDigitalZoomMagnitude(ia_dvs_state* dvsHandle, float zoomRatio);
++    void freeMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable);
++    ia_dvs_morph_table* allocateMorphTalbe(ia_dvs_state* dvsHandle);
++    int getMorphTable(ia_dvs_state* dvsHandle, ia_dvs_morph_table* morphTable, DvsResult* result);
++    ia_err setStatistics(ia_dvs_state* dvsHandle, const ia_dvs_statistics* statistics,
++                         const ia_aiq_ae_results* aeResults, const ia_aiq_af_results* afResults,
++                         const ia_aiq_sensor_events* sensorEvents, uint64_t frameReadoutStart,
++                         uint64_t frameReadoutEnd);
++    ia_err execute(ia_dvs_state* dvsHandle, uint16_t focusPosition);
++    ia_err getImageTransformation(ia_dvs_state* dvsHandle,
++                                  ia_dvs_image_transformation* imageTransformation);
++
++ private:
++    IPCIntelDvs mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemDeinit;
++    ShmMemInfo mMemConfig;
++    ShmMemInfo mMemNonBlankRatio;
++    ShmMemInfo mMemZoomMode;
++    ShmMemInfo mMemZoomRegion;
++    ShmMemInfo mMemZoomCoordinate;
++    ShmMemInfo mMemZoomMagnitude;
++    ShmMemInfo mMemFreeMorph;
++    ShmMemInfo mMemAllocateMorph;
++    ShmMemInfo mMemGetMorphTable;
++    ShmMemInfo mMemStatistics;
++    ShmMemInfo mMemExecute;
++    ShmMemInfo mMemImageTransfor;
++
++    std::vector<ShmMem> mMems;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
+new file mode 100644
+index 000000000000..194be112bf6e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
+@@ -0,0 +1,121 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ClientIntelFaceDetection"
++
++#include "modules/sandboxing/client/IntelFaceDetection.h"
++
++#include <algorithm>
++
++#include "FaceBase.h"
++
++namespace icamera {
++IntelFaceDetection::IntelFaceDetection() : mInitialized(false) {
++    LOG1("@%s", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    mMems = {{("/faceDetectionInit" + std::to_string(personal) + "Shm"),
++              sizeof(FaceDetectionInitParams), &mMemInit, false}};
++
++    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
++        mMems.push_back(
++            {("/faceDetectionRun" + std::to_string(i) + std::to_string(personal) + "Shm"),
++             sizeof(FaceDetectionRunParams), &mMemRunBufs[i], false});
++    }
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        LOGE("@%s,Failed to call allocateAllShmMems", __func__);
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOG1("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelFaceDetection::~IntelFaceDetection() {
++    LOG1("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++status_t IntelFaceDetection::init(FaceDetectionInitParams* initParams, int dataSize) {
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    LOG1("@%s, initParams:%p, dataSize:%d", __func__, initParams, dataSize);
++    CheckError(initParams == nullptr, UNKNOWN_ERROR, "@%s, initParams is nullptr", __func__);
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)), UNKNOWN_ERROR,
++               "@%s, buffer is small", __func__);
++
++    unsigned int maxFacesNum =
++        std::min(initParams->max_face_num, static_cast<unsigned int>(MAX_FACES_DETECTABLE));
++    LOG2("@%s, maxFacesNum:%d", __func__, maxFacesNum);
++
++    FaceDetectionInitParams* params = static_cast<FaceDetectionInitParams*>(mMemInit.mAddr);
++
++    bool ret = mIpc.clientFlattenInit(maxFacesNum, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_FD_INIT, mMemInit.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++status_t IntelFaceDetection::deinit() {
++    LOG1("@%s", __func__);
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    bool ret = mCommon.requestSync(IPC_FD_DEINIT);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++FaceDetectionRunParams* IntelFaceDetection::prepareRunBuffer(unsigned int index) {
++    LOG1("@%s", __func__);
++    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr, "@%s, index is error %d", __func__,
++               index);
++    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
++
++    return static_cast<FaceDetectionRunParams*>(mMemRunBufs[index].mAddr);
++}
++
++status_t IntelFaceDetection::run(FaceDetectionRunParams* runParams, int dataSize, int dmafd) {
++    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++    CheckError(!runParams, UNKNOWN_ERROR, "@%s,runParams is nullptr", __func__);
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)), UNKNOWN_ERROR,
++               "@%s, buffer is small", __func__);
++
++    if (dmafd >= 0) {
++        runParams->bufferHandle = mCommon.registerGbmBuffer(dmafd);
++        CheckError((runParams->bufferHandle < 0), false, "@%s, call mCommon.registerGbmBuffer",
++                   __func__);
++    }
++
++    int32_t runBufHandle = mCommon.getShmMemHandle(static_cast<void*>(runParams));
++    CheckError(runBufHandle < 0, UNKNOWN_ERROR, "@%s, getShmMemHandle fails", __func__, runParams);
++
++    bool ret = mCommon.requestSync(IPC_FD_RUN, runBufHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    if (dmafd >= 0) {
++        mCommon.deregisterGbmBuffer(runParams->bufferHandle);
++    }
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
+new file mode 100644
+index 000000000000..4f6b567e0cdb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++
++#include "FaceBase.h"
++#include "IntelAlgoCommon.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "modules/sandboxing/IPCIntelFD.h"
++
++namespace icamera {
++class IntelFaceDetection {
++ public:
++    IntelFaceDetection();
++    virtual ~IntelFaceDetection();
++
++    status_t init(FaceDetectionInitParams* initData, int dataSize);
++    status_t deinit();
++    status_t run(FaceDetectionRunParams* runParams, int dataSize, int dmafd = -1);
++    FaceDetectionRunParams* prepareRunBuffer(unsigned int index);
++
++ private:
++    IPCIntelFD mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
++    std::vector<ShmMem> mMems;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
+new file mode 100644
+index 000000000000..8675432b67bf
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
+@@ -0,0 +1,196 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelIspParamAdaptor"
++
++#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
++
++#include <string>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelIspParamAdaptor::IntelIspParamAdaptor() : mInitialized(false) {
++    LOGIPC("@%s", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/adaptorInit" + std::to_string(personal) + SHM_NAME;
++    std::string deInitName = "/adaptorDeinit" + std::to_string(personal) + SHM_NAME;
++    std::string getSize = "/adaptorGetSize" + std::to_string(personal) + SHM_NAME;
++    std::string convertStats = "/adaptorConvertStats" + std::to_string(personal) + SHM_NAME;
++    std::string runPal = "/adaptorRunPal" + std::to_string(personal) + SHM_NAME;
++
++    mMems = {{initName.c_str(), sizeof(IspBxtInitParam), &mMemInit, false},
++             {deInitName.c_str(), sizeof(IspBxtDeInitParam), &mMemDeinit, false},
++             {getSize.c_str(), sizeof(PalDataSizeParam), &mMemGetSize, false},
++             {convertStats.c_str(), sizeof(ConvertStatsParam), &mMemStats, false},
++             {runPal.c_str(), sizeof(RunPalParam), &mMemRunPal, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelIspParamAdaptor::~IntelIspParamAdaptor() {
++    LOGIPC("@%s", __func__);
++    mPalDataMems.clear();
++    mCommon.releaseAllShmMems(mMems);
++}
++
++ia_isp_bxt* IntelIspParamAdaptor::init(const ia_binary_data* ispData, const ia_cmc_t* iaCmc,
++                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
++                                       unsigned int maxNumStatsIn, ia_mkn* iaMkn) {
++    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
++    LOGIPC("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u", __func__,
++           ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++
++    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, ispData, iaCmc, maxStatsWidth,
++                                      maxStatsHeight, maxNumStatsIn, iaMkn);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_INIT, mMemInit.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    IspBxtInitParam* params = static_cast<IspBxtInitParam*>(mMemInit.mAddr);
++    return reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
++}
++
++void IntelIspParamAdaptor::deInit(const ia_isp_bxt* ispBxtHandle) {
++    LOGIPC("@%s", __func__);
++    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    bool ret = mIpc.clientFlattenDeInit(mMemDeinit.mAddr, mMemDeinit.mSize, ispBxtHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++int IntelIspParamAdaptor::getPalDataSize(const ia_isp_bxt_program_group* programGroup) {
++    LOGIPC("@%s", __func__);
++    CheckError(mInitialized == false, -1, "@%s, mInitialized is false", __func__);
++    CheckError(!programGroup, -1, "%s, programGroup is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenGetPalSize(mMemGetSize.mAddr, mMemGetSize.mSize, programGroup);
++    CheckError(ret == false, -1, "@%s, clientFlattenGetPalSize fails", __func__);
++
++    ret = mCommon.requestSync(IPC_ISP_GET_PAL_SIZE, mMemGetSize.mHandle);
++    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
++
++    PalDataSizeParam* params = static_cast<PalDataSizeParam*>(mMemGetSize.mAddr);
++    LOGIPC("@%s, the pal data size is: %d", __func__, params->palDataSize);
++
++    return params->palDataSize;
++}
++
++status_t IntelIspParamAdaptor::queryAndConvertStats(const ia_isp_bxt* ispBxtHandle,
++                                                    const ConvertInputParam* inputParams,
++                                                    ConvertResult* result) {
++    LOGIPC("@%s", __func__);
++    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
++    CheckError(!inputParams || !result, UNKNOWN_ERROR, "%s, inputParams or result nullptr",
++               __func__);
++    CheckError(!inputParams->dvsReso || !inputParams->aeResults, UNKNOWN_ERROR,
++               "%s, inputParams or result nullptr", __func__);
++    CheckError((!inputParams->statsBuffer || !inputParams->statsBuffer->data ||
++                inputParams->statsBuffer->size <= 0),
++               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
++    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    int32_t statsHandle = mCommon.getShmMemHandle(inputParams->statsBuffer->data);
++    bool ret = mIpc.clientFlattenConvertStats(mMemStats.mAddr, mMemStats.mSize, ispBxtHandle,
++                                              inputParams, statsHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenConvertStats fails", __func__);
++
++    ret = mCommon.requestSync(IPC_ISP_CONVERT_STATS, mMemStats.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenConvertStats(mMemStats.mAddr, mMemStats.mSize, result);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenConvertStats fails", __func__);
++
++    return OK;
++}
++
++void* IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string palDataName = "/palData" + std::to_string(streamId) + std::to_string(index) +
++                              std::to_string(personal) + SHM_NAME;
++
++    ShmMemInfo memInfo;
++    CLEAR(memInfo);
++    bool success = mCommon.allocShmMem(palDataName, palDataSize, &memInfo);
++    CheckError(success == false, nullptr, "%s, failed to allocate share memory for pal", __func__);
++    LOGIPC("%s, the buffer handle: %d, address: %p", __func__, memInfo.mHandle, memInfo.mAddr);
++
++    mPalDataMems.push_back(memInfo);
++
++    return memInfo.mAddr;
++}
++
++void IntelIspParamAdaptor::freePalBuffer(void* addr) {
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    for (auto& mem : mPalDataMems) {
++        if (mem.mAddr == addr) {
++            mCommon.freeShmMem(mem);
++        }
++    }
++}
++
++status_t IntelIspParamAdaptor::runPal(ia_isp_bxt* ispBxtHandle,
++                                      const ia_isp_bxt_input_params_v2* inputParams,
++                                      ia_binary_data* outputData) {
++    LOGIPC("@%s", __func__);
++    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
++               "%s, ispBxtHandle or inputParams is nullptr", __func__);
++    CheckError((!outputData || !outputData->data || outputData->size <= 0), UNKNOWN_ERROR,
++               "%s, Wrong pal data buffer", __func__);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    int32_t palDataHandle = mCommon.getShmMemHandle(outputData->data);
++    CheckError(!palDataHandle, UNKNOWN_ERROR, "%s, the pal buffer(%p) doesn't exist in SHM list",
++               __func__, outputData->data);
++    LOGIPC("%s, pal buffer address: %p, buffer handle: %d", __func__, outputData->data,
++           palDataHandle);
++
++    bool ret = mIpc.clientFlattenRunPal(mMemRunPal.mAddr, mMemRunPal.mSize, ispBxtHandle,
++                                        inputParams, outputData, palDataHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenRunPal fails", __func__);
++
++    ret = mCommon.requestSync(IPC_ISP_RUN_PAL, mMemRunPal.mHandle);
++    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
++
++    RunPalParam* params = static_cast<RunPalParam*>(mMemRunPal.mAddr);
++    outputData->size = params->palOutput.size;
++    LOGIPC("%s, the buffer handle is: %d size: %d ptr: %p after running pal", __func__,
++           params->palDataHandle, outputData->size, outputData->data);
++
++    return OK;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
+new file mode 100644
+index 000000000000..164c256a3234
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
+@@ -0,0 +1,59 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "iutils/Errors.h"
++#include "modules/sandboxing/IPCIspParamAdaptor.h"
++
++namespace icamera {
++
++class IntelIspParamAdaptor {
++ public:
++    IntelIspParamAdaptor();
++    virtual ~IntelIspParamAdaptor();
++
++    ia_isp_bxt* init(const ia_binary_data* ispData, const ia_cmc_t* iaCmc,
++                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
++                     unsigned int maxNumStatsIn, ia_mkn* iaMkn);
++    void deInit(const ia_isp_bxt* ispBxtHandle);
++    int getPalDataSize(const ia_isp_bxt_program_group* programGroup);
++    status_t runPal(ia_isp_bxt* ispBxtHandle, const ia_isp_bxt_input_params_v2* inputParams,
++                    ia_binary_data* outputData);
++    status_t queryAndConvertStats(const ia_isp_bxt* ispBxtHandle,
++                                  const ConvertInputParam* inputParams, ConvertResult* result);
++    void* allocatePalBuffer(int streamId, int index, int palDataSize);
++    void freePalBuffer(void* addr);
++
++ private:
++    IPCIspParamAdaptor mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemDeinit;
++    ShmMemInfo mMemGetSize;
++    ShmMemInfo mMemStats;
++    ShmMemInfo mMemRunPal;
++    std::vector<ShmMemInfo> mPalDataMems;
++
++    std::vector<ShmMem> mMems;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
+new file mode 100644
+index 000000000000..3b12340b4bf0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
+@@ -0,0 +1,137 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelLard"
++
++#include "modules/sandboxing/client/IntelLard.h"
++
++#include <string>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLard::IntelLard() : mInitialized(false) {
++    LOGIPC("@%s", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/lardInit" + std::to_string(personal) + SHM_NAME;
++    std::string getTagListName = "/lardGetTagList" + std::to_string(personal) + SHM_NAME;
++    std::string runName = "/lardRun" + std::to_string(personal) + SHM_NAME;
++    std::string deinitName = "/lardDeinit" + std::to_string(personal) + SHM_NAME;
++
++    mMems = {{initName.c_str(), sizeof(lard_init_params), &mMemInit, false},
++             {getTagListName.c_str(), sizeof(lard_get_tag_list_params), &mMemGetTagList, false},
++             {runName.c_str(), sizeof(lard_run_params), &mMemRun, false},
++             {deinitName.c_str(), sizeof(lard_deinit_params), &mMemDeinit, false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelLard::~IntelLard() {
++    LOGIPC("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++ia_lard* IntelLard::init(const ia_binary_data* lard_data_ptr) {
++    LOGIPC("@%s, binaryData:%p", __func__, lard_data_ptr);
++
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is nullptr", __func__);
++    CheckError(!lard_data_ptr->data, nullptr, "@%s, lard_data_ptr->data is nullptr", __func__);
++    CheckError(lard_data_ptr->size == 0, nullptr, "@%s, lard_data_ptr->size is 0", __func__);
++
++    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, lard_data_ptr);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LARD_INIT, mMemInit.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    ia_lard* lard = nullptr;
++    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, &lard);
++    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
++
++    return lard;
++}
++
++ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag, unsigned int* num_tags,
++                             const unsigned int** tags) {
++    LOGIPC("@%s, ia_lard_ptr:%p, mode_tag:%d", __func__, ia_lard_ptr, mode_tag);
++
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
++    CheckError(num_tags == nullptr, ia_err_general, "@%s, num_tags is nullptr", __func__);
++    CheckError(tags == nullptr, ia_err_general, "@%s, tags is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize, ia_lard_ptr,
++                                            mode_tag);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetTagList fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LARD_GET_TAG_LIST, mMemGetTagList.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize, mode_tag,
++                                         num_tags, tags);
++    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenGetTagList fails", __func__);
++
++    return ia_err_none;
++}
++
++ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
++                      ia_lard_results** lard_results_ptr) {
++    LOGIPC("@%s, ia_lard_ptr:%p, lard_input_params_ptr:%p", __func__, ia_lard_ptr,
++           lard_input_params_ptr);
++
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
++    CheckError(lard_input_params_ptr == nullptr, ia_err_general,
++               "@%s, lard_input_params_ptr is nullptr", __func__);
++    CheckError(lard_results_ptr == nullptr, ia_err_general, "@%s, lard_results_ptr is nullptr",
++               __func__);
++
++    bool ret =
++        mIpc.clientFlattenRun(mMemRun.mAddr, mMemRun.mSize, ia_lard_ptr, lard_input_params_ptr);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenRun fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LARD_RUN, mMemRun.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenRun(mMemRun.mAddr, mMemRun.mSize, lard_results_ptr);
++    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenRun fails", __func__);
++
++    return ia_err_none;
++}
++
++void IntelLard::deinit(ia_lard* ia_lard_ptr) {
++    LOGIPC("@%s, ia_lard_ptr:%p", __func__, ia_lard_ptr);
++
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++    CheckError(ia_lard_ptr == nullptr, VOID_VALUE, "@%s, ia_lard_ptr is nullptr", __func__);
++
++    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, ia_lard_ptr);
++    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LARD_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
+new file mode 100644
+index 000000000000..3d2473ec4957
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
+@@ -0,0 +1,52 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_lard.h>
++
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelLard.h"
++
++namespace icamera {
++class IntelLard {
++ public:
++    IntelLard();
++    virtual ~IntelLard();
++
++    ia_lard* init(const ia_binary_data* lard_data_ptr);
++    ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag, unsigned int* num_tags,
++                      const unsigned int** tags);
++    ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
++               ia_lard_results** lard_results_ptr);
++    void deinit(ia_lard* ia_lard_ptr);
++
++ private:
++    IPCIntelLard mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemGetTagList;
++    ShmMemInfo mMemRun;
++    ShmMemInfo mMemDeinit;
++
++    std::vector<ShmMem> mMems;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
+new file mode 100644
+index 000000000000..c3a3bf0001c0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
+@@ -0,0 +1,133 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ClientIntelLtm"
++
++#include "modules/sandboxing/client/IntelLtm.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLtm::IntelLtm() : mInitialized(false), mRunParamsSize(0) {
++    LOGIPC("@%s", __func__);
++
++    mCaller = reinterpret_cast<uintptr_t>(this);
++    mMems = {
++        {("/ltmInit" + std::to_string(mCaller) + "Shm"), sizeof(LtmInitParams), &mMemInit, false},
++        {("/ltmDeinit" + std::to_string(mCaller) + "Shm"), sizeof(LtmDeinitParams), &mMemDeinit,
++         false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelLtm::~IntelLtm() {
++    LOGIPC("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++    mCommon.freeShmMem(mMemRun);
++}
++
++ia_ltm* IntelLtm::init(const ia_binary_data* lard_data_ptr, ia_mkn* mkn) {
++    LOGIPC("@%s", __func__);
++    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
++    CheckError(!mkn, nullptr, "@%s, mkn is null", __func__);
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++
++    LtmInitParams* params = static_cast<LtmInitParams*>(mMemInit.mAddr);
++
++    bool ret = mIpc.clientFlattenInit(*lard_data_ptr, reinterpret_cast<uintptr_t>(mkn), params);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LTM_INIT, mMemInit.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    ia_ltm* ltm = nullptr;
++    ret = mIpc.clientUnflattenInit(params, &ltm);
++    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
++
++    return ltm;
++}
++
++void IntelLtm::deinit(ia_ltm* ltm) {
++    LOGIPC("@%s", __func__);
++    CheckError(!ltm, VOID_VALUE, "@%s, ltm is nullptr", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    LtmDeinitParams* params = static_cast<LtmDeinitParams*>(mMemDeinit.mAddr);
++    params->ltm_handle = reinterpret_cast<uintptr_t>(ltm);
++
++    bool ret = mCommon.requestSync(IPC_LTM_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++int IntelLtm::allocaRunImage(int dataSize) {
++    mRunParamsSize = 0;
++    mCommon.freeShmMem(mMemRun);
++    mMemRun = {};
++
++    mMemRun.mName = "/ltmRun" + std::to_string(mCaller) + "Shm";
++    mMemRun.mSize = dataSize;
++    bool ret = mCommon.allocShmMem(mMemRun.mName, mMemRun.mSize, &mMemRun);
++    CheckError(!ret, mRunParamsSize, "@%s, allocShmMem fails", __func__);
++
++    mRunParamsSize = dataSize;
++    return mRunParamsSize;
++}
++
++ia_err IntelLtm::run(ia_ltm* ltm, const ia_ltm_input_params* inputParams,
++                     ia_ltm_results** ltmResults, ia_ltm_drc_params** drcResults) {
++    LOGIPC("@%s", __func__);
++
++    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
++    CheckError(!ltm, ia_err_general, "@%s, ltm is nullptr", __func__);
++    CheckError(!inputParams, ia_err_general, "@%s, inputParams is nullptr", __func__);
++    CheckError(!ltmResults, ia_err_general, "@%s, ltmResultsis is nullptr", __func__);
++    CheckError(!drcResults, ia_err_general, "@%s, drcResults is nullptr", __func__);
++
++    int runParamsSize = sizeof(LtmRunParams);
++    if (inputParams->input_image_ptr && inputParams->input_image_ptr->image_data) {
++        runParamsSize += inputParams->input_image_ptr->image_data->size;
++    }
++
++    if (mRunParamsSize < runParamsSize) {
++        LOGIPC("@%s, mRunParamsSize %d, runParamsSize %d", __func__, mRunParamsSize, runParamsSize);
++        int dataSize = allocaRunImage(runParamsSize);
++        CheckError(dataSize <= 0, ia_err_general, "@%s, Failed to allocaRunImage", __func__);
++    }
++
++    bool ret = mIpc.clientFlattenRun(reinterpret_cast<uintptr_t>(ltm), *inputParams, mMemRun.mSize,
++                                     mMemRun.mAddr);
++    CheckError(ret == false, ia_err_general, "@%s, clientFlattenPrepare fails", __func__);
++
++    ret = mCommon.requestSync(IPC_LTM_RUN, mMemRun.mHandle);
++    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
++
++    LtmRunParams* params = static_cast<LtmRunParams*>(mMemRun.mAddr);
++    ret = mIpc.clientUnflattenRun(params, ltmResults, drcResults);
++    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenPrepare fails", __func__);
++
++    return ia_err_none;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
+new file mode 100644
+index 000000000000..c394b201c703
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_ltm.h>
++
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelLtm.h"
++
++namespace icamera {
++class IntelLtm {
++ public:
++    IntelLtm();
++    virtual ~IntelLtm();
++
++    ia_ltm* init(const ia_binary_data* lard_data_ptr, ia_mkn* mkn);
++    void deinit(ia_ltm* ltm);
++    ia_err run(ia_ltm* ltm, const ia_ltm_input_params* inputParams, ia_ltm_results** ltmResults,
++               ia_ltm_drc_params** drcResults);
++
++ private:
++    int allocaRunImage(int dataSize);
++
++ private:
++    uintptr_t mCaller;
++    IPCIntelLtm mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++    int mRunParamsSize;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemRun;
++    ShmMemInfo mMemDeinit;
++    std::vector<ShmMem> mMems;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
+new file mode 100644
+index 000000000000..4b792af9f718
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
+@@ -0,0 +1,119 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ClientIntelMkn"
++
++#include "modules/sandboxing/client/IntelMkn.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelMkn::IntelMkn() : mInitialized(false) {
++    LOGIPC("@%s", __func__);
++
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    mMems = {
++        {("/mknInit" + std::to_string(personal) + "Shm"), sizeof(MknInitParams), &mMemInit, false},
++        {("/mknDeinit" + std::to_string(personal) + "Shm"), sizeof(MknDeinitParams), &mMemDeinit,
++         false},
++        {("/mknPrepare" + std::to_string(personal) + "Shm"), sizeof(MknPrepareParams), &mMemPrepare,
++         false},
++        {("/mknEnable" + std::to_string(personal) + "Shm"), sizeof(MknEnableParams), &mMemEnable,
++         false}};
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelMkn::~IntelMkn() {
++    LOGIPC("@%s", __func__);
++    mCommon.releaseAllShmMems(mMems);
++}
++
++ia_mkn* IntelMkn::init(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                       size_t mkn_section_2_size) {
++    LOGIPC("@%s, mkn_config_bits:%d, mkn_section_1_size:%zu, mkn_section_2_size:%zu", __func__,
++           mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++
++    MknInitParams* params = static_cast<MknInitParams*>(mMemInit.mAddr);
++
++    bool ret =
++        mIpc.clientFlattenInit(mkn_config_bits, mkn_section_1_size, mkn_section_2_size, params);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_MKN_INIT, mMemInit.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    return reinterpret_cast<ia_mkn*>(params->results);
++}
++
++void IntelMkn::deinit(ia_mkn* pMkn) {
++    LOGIPC("@%s", __func__);
++    CheckError(pMkn == nullptr, VOID_VALUE, "@%s, mkn is nullptr", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    MknDeinitParams* params = static_cast<MknDeinitParams*>(mMemDeinit.mAddr);
++    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
++
++    bool ret = mCommon.requestSync(IPC_MKN_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++int IntelMkn::prepare(ia_mkn* pMkn, ia_mkn_trg data_target, ia_binary_data* pBinaryData) {
++    LOGIPC("@%s", __func__);
++
++    *pBinaryData = {nullptr, 0};
++    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    MknPrepareParams* params = static_cast<MknPrepareParams*>(mMemPrepare.mAddr);
++    bool ret = mIpc.clientFlattenPrepare(reinterpret_cast<uintptr_t>(pMkn), data_target, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
++
++    ret = mCommon.requestSync(IPC_MKN_PREPARE, mMemPrepare.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenPrepare(params, pBinaryData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
++
++    return OK;
++}
++
++int IntelMkn::enable(ia_mkn* pMkn, bool enable_data_collection) {
++    LOGIPC("@%s, enable_data_collection:%d", __func__, enable_data_collection);
++
++    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
++
++    MknEnableParams* params = static_cast<MknEnableParams*>(mMemEnable.mAddr);
++    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
++    params->enable_data_collection = enable_data_collection;
++
++    bool ret = mCommon.requestSync(IPC_MKN_ENABLE, mMemEnable.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
+new file mode 100644
+index 000000000000..caf4a883caa6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_mkn_encoder.h>
++#include <ia_mkn_types.h>
++#include <ia_types.h>
++
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelMkn.h"
++
++namespace icamera {
++class IntelMkn {
++ public:
++    IntelMkn();
++    ~IntelMkn();
++
++    ia_mkn* init(ia_mkn_config_bits mkn_config_bits, size_t mkn_section_1_size,
++                 size_t mkn_section_2_size);
++    void deinit(ia_mkn* pMkn);
++
++    int prepare(ia_mkn* pMkn, ia_mkn_trg data_target, ia_binary_data* pBinaryData);
++    int enable(ia_mkn* pMkn, bool enable_data_collection);
++
++ private:
++    IPCIntelMkn mIpc;
++    IntelAlgoCommon mCommon;
++
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemDeinit;
++    ShmMemInfo mMemPrepare;
++    ShmMemInfo mMemEnable;
++
++    std::vector<ShmMem> mMems;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
+new file mode 100644
+index 000000000000..ac0fd0bdd9f9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
+@@ -0,0 +1,294 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelPGParamC"
++
++#include "modules/sandboxing/client/IntelPGParam.h"
++
++#include <string>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelPGParam::IntelPGParam(int pgId)
++        : mInitialized(false),
++          mPgId(pgId),
++          mClient(reinterpret_cast<uintptr_t>(this)),
++          mPayloadCount(0),
++          mPGBuffer(nullptr) {
++    std::string initName = "/pgParamInit" + std::to_string(mClient) + SHM_NAME;
++    std::string prepareName = "/pgParamPrepare" + std::to_string(mClient) + SHM_NAME;
++    std::string getFragDescsName = "/pgParamGetFragDescs" + std::to_string(mClient) + SHM_NAME;
++    std::string prepareProgramName = "/pgParamPrepareProgram" + std::to_string(mClient) + SHM_NAME;
++    std::string encodeName = "/pgParamEncode" + std::to_string(mClient) + SHM_NAME;
++    std::string decodeName = "/pgParamDecode" + std::to_string(mClient) + SHM_NAME;
++    std::string deinitName = "/pgParamDeinit" + std::to_string(mClient) + SHM_NAME;
++
++    mMems = {
++        {initName.c_str(), sizeof(pg_param_init_params), &mMemInit, false},
++        {prepareName.c_str(), sizeof(pg_param_prepare_params), &mMemPrepare, false},
++        {getFragDescsName.c_str(), sizeof(pg_param_get_fragment_desc_params), &mMemGetFragDescs,
++         false},
++        {prepareProgramName.c_str(), sizeof(pg_param_prepare_program_params), &mMemPrepareProgram,
++         false},
++        {encodeName.c_str(), sizeof(pg_param_encode_params), &mMemEncode, false},
++        {decodeName.c_str(), sizeof(pg_param_decode_params), &mMemDecode, false},
++        {deinitName.c_str(), sizeof(pg_param_deinit_params), &mMemDeinit, false},
++    };
++
++    bool success = mCommon.allocateAllShmMems(&mMems);
++    if (!success) {
++        mCommon.releaseAllShmMems(mMems);
++        return;
++    }
++
++    // Allocate when use
++    mMemAllocatePayloads.mName = "/pgParamAllocPayloads" + std::to_string(mClient) + SHM_NAME;
++    mMemAllocatePayloads.mSize = 0;
++    mMemAllocatePGBuffer.mName = "/pgParamAllocPG" + std::to_string(mClient) + SHM_NAME;
++    mMemAllocatePGBuffer.mSize = 0;
++    mMemStatistics.mName = "/pgParamStats" + std::to_string(mClient) + SHM_NAME;
++    mMemStatistics.mSize = 0;
++    mMaxStatsSize = 0;
++
++    LOGIPC("@%s, done", __func__);
++    mInitialized = true;
++}
++
++IntelPGParam::~IntelPGParam() {
++    mCommon.releaseAllShmMems(mMems);
++    if (mMemAllocatePayloads.mSize) {
++        mCommon.freeShmMem(mMemAllocatePayloads);
++    }
++    if (mMemAllocatePGBuffer.mSize) {
++        mCommon.freeShmMem(mMemAllocatePGBuffer);
++    }
++    if (mMemStatistics.mSize) {
++        mCommon.freeShmMem(mMemStatistics);
++    }
++}
++
++int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++
++    bool ret =
++        mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, mPgId, mClient, platform, pgConfig);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_INIT, mMemInit.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
++                          ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
++
++    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
++    bool ret = mIpc.clientFlattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize, mClient,
++                                         ipuParameters->size, palHandle, rbm);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE, mMemPrepare.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize, bitmap, &mMaxStatsSize);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
++
++    if (mMemStatistics.mAddr && mMemStatistics.mSize <= mMaxStatsSize) {
++        mCommon.freeShmMem(mMemStatistics);
++        mMemStatistics.mSize = 0;
++        mMemStatistics.mAddr = nullptr;
++    }
++    if (maxStatsSize) *maxStatsSize = mMaxStatsSize;
++    return OK;
++}
++
++int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++
++    bool ret = mIpc.clientFlattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize,
++                                              mClient, descCount);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetFragDescs fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_GET_FRAG_DESCS, mMemGetFragDescs.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    int count = 0;
++    ret = mIpc.clientUnflattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize, &count,
++                                           descs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenGetFragDescs fails", __func__);
++    return count;
++}
++
++void* IntelPGParam::allocatePGBuffer(int pgSize) {
++    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
++
++    mPGBuffer = nullptr;
++    int size = mIpc.getTotalPGBufferSize(pgSize);
++    if (mMemAllocatePGBuffer.mAddr && mMemAllocatePGBuffer.mSize < size) {
++        mCommon.freeShmMem(mMemAllocatePGBuffer);
++        mMemAllocatePGBuffer.mSize = 0;
++        mMemAllocatePGBuffer.mAddr = nullptr;
++    }
++    if (!mMemAllocatePGBuffer.mAddr) {
++        mMemAllocatePGBuffer.mSize = size;
++        bool ret = mCommon.allocShmMem(mMemAllocatePGBuffer.mName, mMemAllocatePGBuffer.mSize,
++                                       &mMemAllocatePGBuffer);
++        CheckError(ret == false, nullptr, "@%s, allocShmMem fails", __func__);
++    }
++
++    void* pgBuffer = nullptr;
++    bool ret = mIpc.assignPGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize, pgSize,
++                                   &pgBuffer);
++    CheckError(ret == false, nullptr, "@%s, assignPGBuffer fails", __func__);
++
++    ret = mIpc.clientFlattenAllocatePGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize,
++                                             mClient, pgSize);
++    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocatePGBuffer fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PG, mMemAllocatePGBuffer.mHandle);
++    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
++
++    mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
++    return mPGBuffer;
++}
++
++int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++    CheckError(mPGBuffer != pg, INVALID_OPERATION, "@%s, pg is not recognized", __func__);
++
++    bool ret = mIpc.clientFlattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
++                                                mClient);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepareProgram fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE_PROGRAM, mMemPrepareProgram.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    // Get size of payloads
++    mPayloadCount = ARRAY_SIZE(mPayloads);
++    ret = mIpc.clientUnflattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
++                                             &mPayloadCount, mPayloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnlattenPrepareProgram fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++    CheckError(payloadCount < mPayloadCount, UNKNOWN_ERROR, "@%s, payloadCount is small", __func__);
++    CheckError(!payloads, UNKNOWN_ERROR, "@%s, payloads is nullptr", __func__);
++    bool ret = false;
++
++    // Allocate memory
++    int size = mIpc.getTotalPayloadSize(mPayloadCount, mPayloads);
++    CheckError(size <= 0, UNKNOWN_ERROR, "@%s, payloads size error", __func__);
++    if (mMemAllocatePayloads.mAddr && mMemAllocatePayloads.mSize < size) {
++        mCommon.freeShmMem(mMemAllocatePayloads);
++        mMemAllocatePayloads.mSize = 0;
++        mMemAllocatePayloads.mAddr = nullptr;
++    }
++    if (!mMemAllocatePayloads.mAddr) {
++        mMemAllocatePayloads.mSize = size;
++        ret = mCommon.allocShmMem(mMemAllocatePayloads.mName, mMemAllocatePayloads.mSize,
++                                  &mMemAllocatePayloads);
++        CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocShmMem fails", __func__);
++    }
++
++    // Split memory of payloads in client side
++    ret = mIpc.assignPayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize, mPayloadCount,
++                              mPayloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocatePayloads fails", __func__);
++
++    ret = mIpc.clientFlattenAllocatePayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
++                                             mClient, mPayloadCount, mPayloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenAllocatePayloads fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PAYLOADS, mMemAllocatePayloads.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    MEMCPY_S(payloads, sizeof(ia_binary_data) * mPayloadCount, mPayloads,
++             sizeof(ia_binary_data) * mPayloadCount);
++    return mPayloadCount;
++}
++
++int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParameters, int payloadCount,
++                                     ia_binary_data* payloads) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
++    // Check shared memory of payloads
++    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
++
++    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
++    bool ret = mIpc.clientFlattenEncode(mMemEncode.mAddr, mMemEncode.mSize, mClient,
++                                        ipuParameters->size, palHandle, payloadCount, payloads,
++                                        mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenEncode fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_ENCODE, mMemEncode.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParam::decode(int payloadCount, ia_binary_data* payloads, ia_binary_data* statistics) {
++    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
++    // Check shared memory of payloads
++    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
++
++    // Check share memory of statistics
++    CheckError(!statistics, BAD_VALUE, "@%s, statistics nullptr", __func__);
++    CheckError(!mMaxStatsSize, BAD_VALUE, "@%s, bad max stats size", __func__);
++    bool ret = true;
++    int32_t statsHandle = -1;
++    // Prepare shared stats memory
++    if (!mMemStatistics.mAddr) {
++        mMemStatistics.mSize = mMaxStatsSize;
++        ret = mCommon.allocShmMem(mMemStatistics.mName, mMemStatistics.mSize, &mMemStatistics);
++        CheckError(ret == false, UNKNOWN_ERROR, "@%s, alloc statsData fails", __func__);
++    }
++    statsHandle = mCommon.getShmMemHandle(mMemStatistics.mAddr);
++
++    ret = mIpc.clientFlattenDecode(mMemDecode.mAddr, mMemDecode.mSize, mClient, payloadCount,
++                                   payloads, mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
++                                   statsHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenDecode fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_DECODE, mMemDecode.mHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
++
++    ret = mIpc.clientUnflattenDecode(mMemDecode.mAddr, mMemDecode.mSize, statistics);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenDecode fails", __func__);
++    statistics->data = mMemStatistics.mAddr;
++
++    return OK;
++}
++
++void IntelPGParam::deinit() {
++    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
++
++    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, mClient);
++    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
++
++    ret = mCommon.requestSync(IPC_PG_PARAM_DEINIT, mMemDeinit.mHandle);
++    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
+new file mode 100644
+index 000000000000..c26a52553224
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <vector>
++
++#include "IntelAlgoCommon.h"
++#include "modules/sandboxing/IPCIntelPGParam.h"
++
++namespace icamera {
++
++class IntelPGParam {
++ public:
++    explicit IntelPGParam(int pgId);
++    ~IntelPGParam();
++
++    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
++    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
++                ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize = nullptr);
++    void* allocatePGBuffer(int pgSize);
++    int getFragmentDescriptors(int terminalIdx, ia_p2p_fragment_desc* desc);
++    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
++    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
++    int updatePALAndEncode(const ia_binary_data* ipuParams, int payloadCount,
++                           ia_binary_data* payloads);
++    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
++    void deinit();
++
++ private:
++    IPCIntelPGParam mIpc;
++    IntelAlgoCommon mCommon;
++    bool mInitialized;
++
++    ShmMemInfo mMemInit;
++    ShmMemInfo mMemPrepare;
++    ShmMemInfo mMemGetFragDescs;
++    ShmMemInfo mMemAllocatePGBuffer;
++    ShmMemInfo mMemPrepareProgram;
++    ShmMemInfo mMemAllocatePayloads;
++    ShmMemInfo mMemEncode;
++    ShmMemInfo mMemDecode;
++    ShmMemInfo mMemDeinit;
++    ShmMemInfo mMemStatistics;
++    std::vector<ShmMem> mMems;
++
++    int mPgId;
++    uintptr_t mClient;
++
++    // Shared memory in client, to avoid memory copy
++    int mPayloadCount;
++    ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];  // save sizes
++    ia_css_process_group_t* mPGBuffer;
++    uint32_t mMaxStatsSize;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.cpp
+new file mode 100644
+index 000000000000..bb8e68e5c8c5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.cpp
+@@ -0,0 +1,162 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelTNRClient"
++
++#include "modules/sandboxing/client/IntelTNR7US.h"
++
++#include <string>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelTNR7US::IntelTNR7US() : mRefBufferSize(0), mRefBufIndex(0), mTnrRunInfo(nullptr) {
++    LOG1("%s ", __func__);
++    CLEAR(mRefBufAddr);
++}
++
++IntelTNR7US::~IntelTNR7US() {
++    LOG1("%s ", __func__);
++    mCommon.freeShmMem(mTnrRunInfoMem, GPU_ALGO_SHM);
++    int ret = mCommon.requestSync(IPC_GPU_TNR_DEINIT);
++    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
++}
++
++int IntelTNR7US::init(int width, int height) {
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/TnrRun" + std::to_string(personal) + "Shm";
++    mTnrRunInfoMem.mName = initName.c_str();
++    mTnrRunInfoMem.mSize = sizeof(TnrRunInfo);
++    bool ret = mCommon.allocShmMem(mTnrRunInfoMem.mName, mTnrRunInfoMem.mSize, &mTnrRunInfoMem,
++                                   GPU_ALGO_SHM);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, allocShmMem fails", __func__);
++    mTnrRunInfo = static_cast<TnrRunInfo*>(mTnrRunInfoMem.mAddr);
++
++    initName = "/TnrRes" + std::to_string(personal) + "Shm";
++    ShmMemInfo resolutionMems;
++    resolutionMems.mName = initName.c_str();
++    resolutionMems.mSize = sizeof(TnrResolution);
++    ret = mCommon.allocShmMem(resolutionMems.mName, resolutionMems.mSize, &resolutionMems,
++                              GPU_ALGO_SHM);
++    if (!ret) {
++        LOGE("@%s, alloc resolution allocShmMem fails", __func__);
++        mCommon.freeShmMem(mTnrRunInfoMem, GPU_ALGO_SHM);
++        return UNKNOWN_ERROR;
++    }
++
++    TnrResolution* res = static_cast<TnrResolution*>(resolutionMems.mAddr);
++    *res = {width, height};
++
++    ret = mCommon.requestSync(IPC_GPU_TNR_INIT, resolutionMems.mHandle);
++    if (!ret) {
++        LOGE("@%s, IPC %d failed", __func__, IPC_GPU_TNR_INIT);
++        mCommon.freeShmMem(mTnrRunInfoMem, GPU_ALGO_SHM);
++    }
++    mCommon.freeShmMem(resolutionMems, GPU_ALGO_SHM);
++
++    return ret ? OK : UNKNOWN_ERROR;
++}
++
++int IntelTNR7US::runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                             uint32_t outBufSize, Tnr7Param* tnrParam) {
++    CheckError(!inBufAddr || !outBufAddr || !tnrParam, UNKNOWN_ERROR,
++               "@%s, invalid data buffer or parameter buffer", __func__);
++    int32_t inHandle = mCommon.getShmMemHandle(const_cast<void*>(inBufAddr));
++    CheckError(inHandle < 0, UNKNOWN_ERROR, "@%s, can't find inBuf handle", __func__);
++    int32_t refHandle = mCommon.getShmMemHandle(static_cast<void*>(mRefBufAddr[mRefBufIndex]));
++    CheckError(refHandle < 0, UNKNOWN_ERROR, "@%s, can't find refBuf handle", __func__);
++    CheckError(mParamMems.mAddr != tnrParam, UNKNOWN_ERROR, "@%s, invalid tnr parameter", __func__);
++
++    mTnrRunInfo->inHandle = inHandle;
++    mTnrRunInfo->outHandle = refHandle;
++    mTnrRunInfo->paramHandle = mParamMems.mHandle;
++
++    int32_t runHandle = mCommon.getShmMemHandle(static_cast<void*>(mTnrRunInfo));
++    bool ret = mCommon.requestSync(IPC_GPU_TNR_RUN_FRAME, runHandle);
++    CheckError(!ret, OK, "@%s, run tnr fails", __func__);
++    MEMCPY_S(outBufAddr, outBufSize, mRefBufAddr[mRefBufIndex], mRefBufferSize);
++    mRefBufIndex = (mRefBufIndex + 1) % TnrRefBufCount;
++
++    return OK;
++}
++
++void* IntelTNR7US::allocCamBuf(uint32_t bufSize, int id) {
++    LOG1("Enter %s size %d", __func__, bufSize);
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/TnrCam" + std::to_string(personal) + std::to_string(id) + "Shm";
++    ShmMemInfo shm;
++    shm.mName = initName.c_str();
++    shm.mSize = bufSize;
++    bool ret = mCommon.allocShmMem(shm.mName, shm.mSize, &shm, GPU_ALGO_SHM);
++    CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
++    ret = mCommon.requestSync(IPC_GPU_TNR_PREPARE_SURFACE, shm.mHandle);
++    if (!ret) {
++        mCommon.freeShmMem(shm, GPU_ALGO_SHM);
++        return nullptr;
++    }
++    mCamBufMems.push_back(shm);
++    LOG1("Exit %s Fd: %d", __func__, shm.mFd);
++
++    return shm.mAddr;
++}
++
++int IntelTNR7US::allocRefBufs(uint32_t bufSize) {
++    mRefBufferSize = bufSize;
++    for (int i = 0; i < TnrRefBufCount; i++) {
++        mRefBufAddr[i] = allocCamBuf(bufSize, MAX_BUFFER_COUNT + i);
++        // will release all buffer in freeAllBufs
++        CheckError(!mRefBufAddr[i], UNKNOWN_ERROR, "@%s, alloc reference buffer fails", __func__);
++    }
++    return OK;
++}
++
++void IntelTNR7US::freeAllBufs() {
++    LOG1("%s ", __func__);
++    if (mParamMems.mAddr) {
++        mCommon.freeShmMem(mParamMems, GPU_ALGO_SHM);
++    }
++    for (auto& camBuf : mCamBufMems) {
++        if (camBuf.mAddr) {
++            mCommon.freeShmMem(camBuf, GPU_ALGO_SHM);
++        }
++    }
++}
++
++Tnr7Param* IntelTNR7US::allocTnr7ParamBuf() {
++    LOG1("%s ", __func__);
++    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
++    std::string initName = "/TnrParam" + std::to_string(personal) + "Shm";
++
++    mParamMems.mName = initName.c_str();
++    mParamMems.mSize = sizeof(Tnr7Param);
++    bool ret = mCommon.allocShmMem(mParamMems.mName, mParamMems.mSize, &mParamMems, GPU_ALGO_SHM);
++    CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
++
++    return reinterpret_cast<Tnr7Param*>(mParamMems.mAddr);
++}
++
++int IntelTNR7US::asyncParamUpdate(int gain) {
++    mTnrRunInfo->gain = gain;
++
++    int32_t runHandle = mCommon.getShmMemHandle(static_cast<void*>(mTnrRunInfo));
++    bool ret = mCommon.requestSync(IPC_GPU_TNR_PARAM_UPDATE, runHandle);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, IPC_GPU_TNR_PARAM_UPDATE requestSync fails", __func__);
++    return OK;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.h
+new file mode 100644
+index 000000000000..0630c7e5b9a8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelTNR7US.h
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++
++#include "BufferQueue.h"
++#include "CameraBuffer.h"
++#include "Parameters.h"
++#include "PlatformData.h"
++#include "TNRCommon.h"
++
++namespace icamera {
++
++class IntelTNR7US {
++ public:
++    IntelTNR7US();
++    ~IntelTNR7US();
++    int init(int width, int height);
++    int runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                    uint32_t outBufSize, Tnr7Param* tnrParam);
++    Tnr7Param* allocTnr7ParamBuf();
++    void* allocCamBuf(uint32_t bufSize, int id);
++    int allocRefBufs(uint32_t bufSize);
++    void freeAllBufs();
++    int asyncParamUpdate(int gain);
++
++ private:
++    static const int TnrRefBufCount = TNR7US_REFERENCE_BUFFER_COUNT;
++    IntelAlgoCommon mCommon;
++    int mRefBufferSize;
++    int mRefBufIndex;
++    void* mRefBufAddr[TnrRefBufCount];
++    TnrRunInfo* mTnrRunInfo;
++    std::vector<ShmMemInfo> mCamBufMems;
++    ShmMemInfo mParamMems;
++    ShmMemInfo mTnrRunInfoMem;
++    DISALLOW_COPY_AND_ASSIGN(IntelTNR7US);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
+new file mode 100644
+index 000000000000..c0b7f25c7632
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
+@@ -0,0 +1,164 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GraphConfigServer"
++
++#include "modules/sandboxing/server/GraphConfigServer.h"
++
++#include <string>
++#include <vector>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++GraphConfigServer::GraphConfigServer() {
++    LOGIPC("@%s", __func__);
++}
++
++GraphConfigServer::~GraphConfigServer() {
++    LOGIPC("@%s", __func__);
++}
++
++void GraphConfigServer::addCustomKeyMap() {
++    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
++    graphConfigImpl->addCustomKeyMap();
++}
++
++status_t GraphConfigServer::parse(void* pData, size_t dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    GraphParseParams* parseParam = nullptr;
++    bool ret = mIpc.serverUnflattenParse(pData, dataSize, &parseParam);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenParse fails", __func__);
++
++    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
++    status_t rt = graphConfigImpl->parse(parseParam->cameraId, parseParam->GD, parseParam->gdSize,
++                                         parseParam->GS, parseParam->gsSize);
++    CheckError(rt != OK, UNKNOWN_ERROR, "@%s, Failed to parse the graph xml data", __func__);
++
++    return OK;
++}
++
++void GraphConfigServer::releaseGraphNodes() {
++    if (mGraphConfigMap.empty()) return;
++    mGraphConfigMap.begin()->second->releaseGraphNodes();
++}
++
++status_t GraphConfigServer::configStreams(void* pData, size_t dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    GraphBaseInfo info;
++    GraphSettingType type;
++    std::vector<HalStream*> streams;
++    bool ret = mIpc.serverUnflattenConfigStreams(pData, dataSize, &info, &type, &streams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfigStreams fails", __func__);
++
++    // release the old item
++    auto it = mGraphConfigMap.find(info);
++    if (it != mGraphConfigMap.end()) {
++        mGraphConfigMap.erase(it);
++    }
++    std::shared_ptr<GraphConfigImpl> graphConfigImpl =
++        std::make_shared<GraphConfigImpl>(info.cameraId, info.configMode, type);
++    status_t rt = graphConfigImpl->configStreams(streams);
++    CheckError(rt != OK, ret, "@%s, Failed to configStreams, cameraId: %d, configMode: %d",
++               __func__, info.cameraId, info.configMode);
++
++    mGraphConfigMap[info] = graphConfigImpl;
++
++    return OK;
++}
++
++status_t GraphConfigServer::getGraphConfigData(void* pData, size_t dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    GraphBaseInfo info;
++    bool ret = mIpc.serverUnflattenGetGraphData(pData, dataSize, &info);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetGraphData fails", __func__);
++
++    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
++
++    auto it = mGraphConfigMap.find(info);
++    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
++               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
++
++    IGraphType::GraphConfigData graphData;
++    status_t rt = it->second->getGraphConfigData(&graphData);
++    CheckError(rt != OK, UNKNOWN_ERROR, "%s, Failed to getGraphConfigData: cameraId: %d", __func__,
++               info.cameraId);
++
++    ret = mIpc.serverFlattenGetGraphData(pData, dataSize, graphData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetGraphData fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigServer::getPgIdForKernel(void* pData, size_t dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    uint32_t streamId = -1;
++    int32_t kernelId = 0;
++    GraphBaseInfo info;
++    bool ret = mIpc.serverUnFlattenGetPgId(pData, dataSize, &info, &streamId, &kernelId);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
++
++    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
++
++    auto it = mGraphConfigMap.find(info);
++    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
++               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
++
++    int32_t pgId = -1;
++    it->second->getPgIdForKernel(streamId, kernelId, &pgId);
++
++    ret = mIpc.serverFlattenGetPgId(pData, dataSize, pgId);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
++
++    return OK;
++}
++
++status_t GraphConfigServer::pipelineGetConnections(void* pData, size_t dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    GraphBaseInfo info;
++    std::vector<std::string> pgList;
++    bool ret = mIpc.serverUnFlattenGetConnection(pData, dataSize, &info, &pgList);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
++
++    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
++
++    auto it = mGraphConfigMap.find(info);
++    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
++               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
++
++    std::vector<IGraphType::PipelineConnection> confVector;
++    std::vector<IGraphType::ScalerInfo> scalerInfo;
++    status_t rt = it->second->pipelineGetConnections(pgList, &scalerInfo, &confVector);
++    CheckError(rt != OK, UNKNOWN_ERROR, "%s, Failed to getConnection: cameraId: %d", __func__,
++               info.cameraId);
++
++    ret = mIpc.serverFlattenGetConnection(pData, dataSize, scalerInfo, confVector);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
++
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
+new file mode 100644
+index 000000000000..6a0996b03b42
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <memory>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/graph/GraphConfigImpl.h"
++#include "modules/sandboxing/IPCGraphConfig.h"
++
++namespace icamera {
++class GraphConfigServer {
++ public:
++    GraphConfigServer();
++    virtual ~GraphConfigServer();
++
++    void addCustomKeyMap();
++    status_t parse(void* pData, size_t dataSize);
++    void releaseGraphNodes();
++    status_t configStreams(void* pData, size_t dataSize);
++    status_t getGraphConfigData(void* pData, size_t dataSize);
++    status_t getPgIdForKernel(void* pData, size_t dataSize);
++    status_t pipelineGetConnections(void* pData, size_t dataSize);
++
++ private:
++    std::map<GraphBaseInfo, std::shared_ptr<GraphConfigImpl> > mGraphConfigMap;
++    IPCGraphConfig mIpc;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
+new file mode 100644
+index 000000000000..00484c2a5cc3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
+@@ -0,0 +1,327 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAiqServer"
++
++#include "modules/sandboxing/server/IntelAiqServer.h"
++
++#include <ia_aiq.h>
++#include <ia_cmc_parser.h>
++
++#include <algorithm>
++#include <memory>
++#include <string>
++#include <utility>
++
++namespace icamera {
++IntelAiqServer::IntelAiqServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IntelAiqServer::~IntelAiqServer() {
++    LOGIPC("@%s", __func__);
++}
++
++status_t IntelAiqServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(aiq_init_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    aiq_init_params* params = static_cast<aiq_init_params*>(pData);
++
++    ia_binary_data aiqbData = {nullptr, 0};
++    ia_binary_data nvmData = {nullptr, 0};
++    ia_binary_data aiqdData = {nullptr, 0};
++    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &aiqbData, &nvmData, &aiqdData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    std::unique_ptr<IntelAiq> intelAiq = std::make_unique<IntelAiq>();
++
++    ia_aiq* aiq = intelAiq->init(&aiqbData, &nvmData, &aiqdData, params->stats_max_width,
++                                 params->stats_max_height, params->max_num_stats_in,
++                                 reinterpret_cast<ia_cmc_t*>(params->cmcRemoteHandle),
++                                 reinterpret_cast<ia_mkn*>(params->ia_mkn));
++    CheckError(!aiq, UNKNOWN_ERROR, "@%s, intelAiq.init fails", __func__);
++
++    mIntelAiqs[aiq] = std::move(intelAiq);
++
++    params->results = reinterpret_cast<uintptr_t>(aiq);
++
++    return OK;
++}
++
++status_t IntelAiqServer::aeRun(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(ae_run_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    ae_run_params* params = static_cast<ae_run_params*>(pData);
++
++    ia_aiq_ae_input_params* aeParams = nullptr;
++    bool ret = mIpc.serverUnflattenAe(params, &aeParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAe fails", __func__);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_aiq_ae_results* aeResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->aeRun(aeParams, &aeResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, aeRun fails %d", __func__, err);
++
++    ret = mIpc.serverFlattenAe(*aeResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAe fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::afRun(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(af_run_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    af_run_params* params = static_cast<af_run_params*>(pData);
++
++    ia_aiq_af_input_params* afParams = nullptr;
++    bool ret = mIpc.serverUnflattenAf(params, &afParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflatten fails", __func__);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_aiq_af_results* afResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->afRun(afParams, &afResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, afRun fails %d", __func__, err);
++
++    ret = mIpc.serverFlattenAf(*afResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlatten fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::awbRun(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(awb_run_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    awb_run_params* params = static_cast<awb_run_params*>(pData);
++
++    ia_aiq_awb_input_params* awbParams = nullptr;
++    bool ret = mIpc.serverUnflattenAwb(params, &awbParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAwb fails", __func__);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_aiq_awb_results* awbResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->awbRun(awbParams, &awbResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, awbRun fails %d", __func__, err);
++
++    ret = mIpc.serverFlattenAwb(*awbResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAwb fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::gbceRun(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(gbce_run_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    gbce_run_params* params = static_cast<gbce_run_params*>(pData);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_aiq_gbce_results* gbceResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->gbceRun(&params->base, &gbceResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, gbceRun fails %d", __func__, err);
++
++    bool ret = mIpc.serverFlattenGbce(*gbceResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGbce fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::paRunV1(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(pa_run_v1_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(pData);
++
++    ia_aiq_pa_input_params* paParams = nullptr;
++    bool ret = mIpc.serverUnflattenPaV1(params, &paParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPa fails", __func__);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    //    ia_aiq_pa_results
++    ia_aiq_pa_results_v1* paResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->paRunV1(paParams, &paResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, paRunV1 fails %d", __func__, err);
++
++    ret = mIpc.serverFlattenPaV1(*paResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPa fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::saRunV2(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(sa_run_v2_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(pData);
++
++    ia_aiq_sa_input_params_v1* saParams = nullptr;
++    bool ret = mIpc.serverUnflattenSaV2(*params, &saParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSaV2 fails", __func__);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_aiq_sa_results_v1* saResults = nullptr;
++    ia_err err = mIntelAiqs[aiq]->saRunV2(saParams, &saResults);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, saRunV2 fails %d", __func__, err);
++
++    ret = mIpc.serverFlattenSaV2(*saResults, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenSaV2 fails", __func__);
++
++    return OK;
++}
++
++status_t IntelAiqServer::statisticsSetV4(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(set_statistics_set_v4_params), UNKNOWN_ERROR,
++               "@%s, buffer is small", __func__);
++
++    set_statistics_set_v4_params* params = static_cast<set_statistics_set_v4_params*>(pData);
++
++    ia_aiq_statistics_input_params_v4* stat = nullptr;
++    bool ret = mIpc.serverUnflattenStatSetV4(params, &stat);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenStatSetV4 fails", __func__);
++
++    if (stat->faces) {
++        LOGIPC("@%s, num_faces:%d", __func__, stat->faces->num_faces);
++        if (stat->faces->num_faces > 0) {
++            ia_rectangle& rect = stat->faces->faces[0].face_area;
++            LOGIPC("@%s, left:%d, top:%d, right:%d, bottom:%d", __func__, rect.left, rect.top,
++                   rect.right, rect.bottom);
++        }
++    }
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->ia_aiq);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_err err = mIntelAiqs[aiq]->statisticsSetV4(stat);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, statisticsSetV4 fails %d", __func__, err);
++
++    return OK;
++}
++
++status_t IntelAiqServer::getAiqdData(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(ia_binary_data_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    ia_binary_data binaryData = {nullptr, 0};
++
++    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(pData);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_err err = mIntelAiqs[aiq]->getAiqdData(&binaryData);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getAiqdData fails %d", __func__, err);
++    LOGIPC("@%s, binary_data, data:%p, size:%d", __func__, binaryData.data, binaryData.size);
++
++    MEMCPY_S(params->data, sizeof(params->data), binaryData.data, binaryData.size);
++    params->size = binaryData.size;
++
++    return OK;
++}
++
++status_t IntelAiqServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(aiq_deinit_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(pData);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    mIntelAiqs[aiq]->deinit();
++
++    return OK;
++}
++
++status_t IntelAiqServer::getVersion(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(ia_aiq_version_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(pData);
++
++    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
++    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
++        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
++        return UNKNOWN_ERROR;
++    }
++
++    std::string version;
++    mIntelAiqs[aiq]->getVersion(&version);
++    snprintf(params->data, sizeof(params->data), "%s", version.c_str());
++    params->size = std::min(version.size(), sizeof(params->data));
++    LOGIPC("@%s, aiq version:%s, size:%d", __func__, version.c_str(), params->size);
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
+new file mode 100644
+index 000000000000..4fe58770d237
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "modules/algowrapper/IntelAiq.h"
++#include "modules/sandboxing/IPCCommon.h"
++#include "modules/sandboxing/IPCIntelAiq.h"
++
++namespace icamera {
++class IntelAiqServer {
++ public:
++    IntelAiqServer();
++    virtual ~IntelAiqServer();
++
++    status_t init(void* pData, int dataSize);
++    status_t aeRun(void* pData, int dataSize);
++    status_t afRun(void* pData, int dataSize);
++    status_t awbRun(void* pData, int dataSize);
++    status_t gbceRun(void* pData, int dataSize);
++    status_t paRunV1(void* pData, int dataSize);
++    status_t saRunV2(void* pData, int dataSize);
++    status_t statisticsSetV4(void* pData, int dataSize);
++    status_t getAiqdData(void* pData, int dataSize);
++    status_t deinit(void* pData, int dataSize);
++    status_t getVersion(void* pData, int dataSize);
++
++ private:
++    IPCIntelAiq mIpc;
++    std::unordered_map<ia_aiq*, std::unique_ptr<IntelAiq>> mIntelAiqs;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
+new file mode 100644
+index 000000000000..6166b3125cba
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
+@@ -0,0 +1,241 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelAlgoServer"
++
++#include "modules/sandboxing/server/IntelAlgoServer.h"
++
++#include <base/logging.h>
++#include <ia_log.h>
++#include <stdlib.h>
++#include <sys/mman.h>
++#include <sys/stat.h>
++
++#include <memory>
++#include <string>
++
++#include "iutils/Utils.h"
++#ifndef GPU_ALGO_SERVER
++#include "modules/sandboxing/server/IntelCPUAlgoServer.h"
++#else
++#include "modules/sandboxing/server/IntelGPUAlgoServer.h"
++#endif
++
++namespace icamera {
++
++IntelAlgoServer* IntelAlgoServer::mInstance = nullptr;
++
++void IntelAlgoServer::init() {
++    LOGIPC("@%s", __func__);
++
++    if (mInstance == nullptr) {
++        mInstance = new IntelAlgoServer;
++    }
++}
++
++void IntelAlgoServer::deInit() {
++    LOGIPC("@%s", __func__);
++
++    delete mInstance;
++    mInstance = nullptr;
++}
++
++IntelAlgoServer::IntelAlgoServer() : mCallback(nullptr) {
++    LOGIPC("@%s", __func__);
++
++    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
++    ia_log_init(&env);
++
++    for (int i = 0; i < kThreadNum; i++) {
++        std::string name = kServerName + std::to_string(i) + std::string(" Thread");
++        mThreads[i] = std::unique_ptr<base::Thread>(new base::Thread(name));
++        mThreads[i]->Start();
++    }
++#ifndef GPU_ALGO_SERVER
++    mRequestHandler = std::unique_ptr<RequestHandler>(new IntelCPUAlgoServer(this));
++#else
++    mRequestHandler = std::unique_ptr<RequestHandler>(new IntelGPUAlgoServer(this));
++#endif
++
++    for (int32_t i = 1; i <= HANDLE_INDEX_MAX_VALUE; i++) {
++        mHandlesQueue.push(i);
++    }
++}
++
++IntelAlgoServer::~IntelAlgoServer() {
++    LOGIPC("@%s", __func__);
++    ia_log_deinit();
++}
++
++int32_t IntelAlgoServer::initialize(const camera_algorithm_callback_ops_t* callback_ops) {
++    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
++
++    CheckError((!callback_ops), -EINVAL, "@%s, the callback_ops is nullptr", __func__);
++
++    mCallback = callback_ops;
++
++    return 0;
++}
++
++int32_t IntelAlgoServer::registerBuffer(int buffer_fd) {
++    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
++
++    std::lock_guard<std::mutex> l(mRegisterBufMutex);
++    CheckError((mHandles.find(buffer_fd) != mHandles.end()), -EINVAL,
++               "@%s, Buffer already registered", __func__);
++    CheckError(mHandlesQueue.empty(), -EBADFD, "@%s, Failed to get buffer handle index", __func__);
++
++    struct stat sb;
++    int ret = fstat(buffer_fd, &sb);
++    CheckError((ret == -1), -EBADFD, "@%s, Failed to get buffer status", __func__);
++
++    void* addr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, buffer_fd, 0);
++    CheckError((!addr), -EBADFD, "@%s, Failed to map buffer", __func__);
++
++    int32_t handle = mHandlesQueue.front();
++    mHandlesQueue.pop();
++    mHandles[buffer_fd] = handle;
++
++    mShmInfoMap[handle].fd = buffer_fd;
++    mShmInfoMap[handle].addr = addr;
++    mShmInfoMap[handle].size = sb.st_size;
++
++    return handle;
++}
++
++int IntelAlgoServer::parseReqHeader(const uint8_t req_header[], uint32_t size) {
++    LOGIPC("@%s, size:%d", __func__, size);
++
++    CheckError(size < IPC_REQUEST_HEADER_USED_NUM || req_header[0] != IPC_MATCHING_KEY, -1,
++               "@%s, fails, req_header[0]:%d, size:%d", __func__, req_header[0], size);
++
++    return 0;
++}
++
++void IntelAlgoServer::returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle) {
++    LOGIPC("@%s, req_id:%d:%s, status:%d", __func__, req_id,
++           IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), status);
++    (*mCallback->return_callback)(mCallback, req_id, (status == OK ? 0 : 1), buffer_handle);
++}
++
++status_t IntelAlgoServer::getShmInfo(const int32_t buffer_handle, ShmInfo* memInfo) {
++    CheckError(!memInfo, UNKNOWN_ERROR, "%s, memInfo is nullptr", __func__);
++    if (buffer_handle == -1) return OK;
++
++    CheckError(mShmInfoMap.find(buffer_handle) == mShmInfoMap.end(), UNKNOWN_ERROR,
++               "%s, Invalid buffer handle", __func__);
++    *memInfo = mShmInfoMap[buffer_handle];
++
++    LOGIPC("@%s, fd:%d, size:%zu, addr: %p", __func__, memInfo->fd, memInfo->size, memInfo->addr);
++
++    return OK;
++}
++
++void IntelAlgoServer::handleRequest(const MsgReq& msg) {
++    LOGIPC("@%s", __func__);
++    CheckError(!mRequestHandler, VOID_VALUE, "@%s, handler is null", __func__);
++    mRequestHandler->handleRequest(msg);
++}
++
++void IntelAlgoServer::request(uint32_t req_id, const uint8_t req_header[], uint32_t size,
++                              int32_t buffer_handle) {
++    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
++    LOGIPC("@%s, req_id:%d:%s", __func__, req_id,
++           IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)));
++
++    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
++    LOGIPC("@%s, group:%d", __func__, group);
++
++    int ret = parseReqHeader(req_header, size);
++    if (ret != 0) {
++        returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
++        return;
++    }
++
++    MsgReq msg = {req_id, buffer_handle};
++
++#ifndef GPU_ALGO_SERVER
++    int threadId = group;
++#else
++    // GPU server thread id start from IPC_GROUP_GPU
++    int threadId = group - IPC_GROUP_GPU;
++#endif
++    if (threadId >= 0 && threadId < kThreadNum) {
++        if (mThreads[threadId] && mThreads[threadId]->task_runner()) {
++            mThreads[threadId]->task_runner()->PostTask(FROM_HERE,
++                base::Bind(&IntelAlgoServer::handleRequest, base::Unretained(this), msg));
++        }
++    }
++}
++
++void IntelAlgoServer::deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
++    LOGIPC("@%s, size:%d", __func__, size);
++
++    std::lock_guard<std::mutex> l(mRegisterBufMutex);
++    for (uint32_t i = 0; i < size; i++) {
++        int32_t handle = buffer_handles[i];
++        if (mShmInfoMap.find(handle) == mShmInfoMap.end()) {
++            continue;
++        }
++
++        mHandles.erase(mShmInfoMap[handle].fd);
++
++        munmap(mShmInfoMap[handle].addr, mShmInfoMap[handle].size);
++        close(mShmInfoMap[handle].fd);
++        mShmInfoMap.erase(handle);
++        mHandlesQueue.push(handle);
++    }
++}
++
++static int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops) {
++    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
++    return IntelAlgoServer::getInstance()->initialize(callback_ops);
++}
++
++static int32_t registerBuffer(int32_t buffer_fd) {
++    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
++    return IntelAlgoServer::getInstance()->registerBuffer(buffer_fd);
++}
++
++static void request(uint32_t req_id, const uint8_t req_header[], uint32_t size,
++                    int32_t buffer_handle) {
++    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
++    IntelAlgoServer::getInstance()->request(req_id, req_header, size, buffer_handle);
++}
++
++static void deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
++    LOGIPC("@%s, size:%d", __func__, size);
++    return IntelAlgoServer::getInstance()->deregisterBuffers(buffer_handles, size);
++}
++
++extern "C" {
++camera_algorithm_ops_t CAMERA_ALGORITHM_MODULE_INFO_SYM
++    __attribute__((__visibility__("default"))) = {.initialize = initialize,
++                                                  .register_buffer = registerBuffer,
++                                                  .request = request,
++                                                  .deregister_buffers = deregisterBuffers};
++}
++
++__attribute__((constructor)) void initIntelAlgoServer() {
++    icamera::Log::setDebugLevel();
++    IntelAlgoServer::init();
++}
++
++__attribute__((destructor)) void deinitIntelAlgoServer() {
++    IntelAlgoServer::deInit();
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
+new file mode 100644
+index 000000000000..50952801a7fe
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
+@@ -0,0 +1,106 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <base/bind.h>
++#include <base/threading/thread.h>
++
++#include <memory>
++#include <queue>
++#include <string>
++#include <unordered_map>
++
++#include "CameraLog.h"
++#include "cros-camera/camera_algorithm.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++
++#define HANDLE_INDEX_MAX_VALUE 1024
++struct MsgReq {
++    uint32_t req_id;
++    int32_t buffer_handle;
++};
++
++typedef struct {
++    int32_t fd;
++    void* addr;
++    size_t size;
++} ShmInfo;
++
++class IntelAlgoServer;
++class RequestHandler {
++ public:
++    explicit RequestHandler(IntelAlgoServer* server) { mIntelAlgoServer = server; }
++    virtual ~RequestHandler() {}
++    virtual void handleRequest(const MsgReq& msg) = 0;
++    IntelAlgoServer* getIntelAlgoServer() { return mIntelAlgoServer; }
++
++ private:
++    IntelAlgoServer* mIntelAlgoServer;
++};
++
++class IntelAlgoServer {
++ public:
++    static void init();
++    static void deInit();
++
++    static IntelAlgoServer* getInstance() { return mInstance; }
++
++    int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops);
++    int32_t registerBuffer(int buffer_fd);
++    void request(uint32_t req_id, const uint8_t req_header[], uint32_t size, int32_t buffer_handle);
++    void deregisterBuffers(const int32_t buffer_handles[], uint32_t size);
++
++    void handleRequest(const MsgReq& msg);
++    status_t getShmInfo(const int32_t buffer_handle, ShmInfo* memInfo);
++    void returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle);
++
++ private:
++    IntelAlgoServer();
++    ~IntelAlgoServer();
++    int parseReqHeader(const uint8_t req_header[], uint32_t size);
++
++ private:
++    static IntelAlgoServer* mInstance;
++#ifndef GPU_ALGO_SERVER
++    static const int kThreadNum = IPC_CPU_GROUP_NUM;
++    const std::string kServerName = "IntelCPUAlgoServer";
++#else
++    static const int kThreadNum = IPC_GPU_GROUP_NUM;
++    const std::string kServerName = "IntelGPUAlgoServer";
++#endif
++    std::unique_ptr<base::Thread> mThreads[kThreadNum];
++    std::unique_ptr<RequestHandler> mRequestHandler;
++
++    const camera_algorithm_callback_ops_t* mCallback;
++
++    // key: shared memory fd from client
++    // value: handle that returns from RegisterBuffer()
++    std::unordered_map<int32_t, int32_t> mHandles;
++
++    // key: handle that returns from RegisterBuffer()
++    // value: shared memory fd and mapped address
++    std::unordered_map<int32_t, ShmInfo> mShmInfoMap;
++    std::queue<int32_t> mHandlesQueue;
++    std::mutex mRegisterBufMutex;
++
++    DISALLOW_COPY_AND_ASSIGN(IntelAlgoServer);
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.cpp
+new file mode 100644
+index 000000000000..ab9354b62594
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.cpp
+@@ -0,0 +1,307 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelCPUAlgoServer"
++
++#include "modules/sandboxing/server/IntelCPUAlgoServer.h"
++
++#include <base/logging.h>
++#include <ia_log.h>
++#include <stdlib.h>
++#include <sys/mman.h>
++#include <sys/stat.h>
++
++#include <memory>
++#include <string>
++
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelCPUAlgoServer::IntelCPUAlgoServer(IntelAlgoServer* server) : RequestHandler(server) {
++    LOGIPC("@%s", __func__);
++}
++
++void IntelCPUAlgoServer::handleRequest(const MsgReq& msg) {
++    uint32_t req_id = msg.req_id;
++    int32_t buffer_handle = msg.buffer_handle;
++
++    ShmInfo info = {};
++    status_t status = getIntelAlgoServer()->getShmInfo(buffer_handle, &info);
++    if (status != OK) {
++        LOGE("@%s, Invalid buffer handle", __func__);
++        getIntelAlgoServer()->returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
++        return;
++    }
++
++    size_t requestSize = info.size;
++    void* addr = info.addr;
++    LOGIPC("@%s, req_id:%d:%s, requestSize:%zu, addr:%p, buffer_handle:%d", __func__, req_id,
++           IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), requestSize, addr, buffer_handle);
++
++    switch (req_id) {
++        case IPC_LARD_INIT:
++            status = mLard.init(addr, requestSize);
++            break;
++        case IPC_LARD_GET_TAG_LIST:
++            status = mLard.getTagList(addr, requestSize);
++            break;
++        case IPC_LARD_RUN:
++            status = mLard.run(addr, requestSize);
++            break;
++        case IPC_LARD_DEINIT:
++            status = mLard.deinit(addr, requestSize);
++            break;
++        case IPC_FD_INIT:
++            status = mFaceDetection.init(addr, requestSize);
++            break;
++        case IPC_FD_RUN: {
++            FaceDetectionRunParams* palParams = static_cast<FaceDetectionRunParams*>(addr);
++            void* addrImage = nullptr;
++            if (palParams->bufferHandle >= 0) {
++                ShmInfo imageDataInfo;
++                status = getIntelAlgoServer()->getShmInfo(palParams->bufferHandle, &imageDataInfo);
++                if (status != OK) {
++                    LOGE("%s, the buffer handle for image data is invalid", __func__);
++                    break;
++                }
++                addrImage = imageDataInfo.addr;
++            }
++            status = mFaceDetection.run(addr, requestSize, addrImage);
++            break;
++        }
++        case IPC_FD_DEINIT:
++            status = mFaceDetection.deinit();
++            break;
++        case IPC_GRAPH_ADD_KEY:
++            mGraph.addCustomKeyMap();
++            break;
++        case IPC_GRAPH_PARSE:
++            mGraph.parse(addr, requestSize);
++            break;
++        case IPC_GRAPH_RELEASE_NODES:
++            mGraph.releaseGraphNodes();
++            break;
++        case IPC_GRAPH_CONFIG_STREAMS:
++            mGraph.configStreams(addr, requestSize);
++            break;
++        case IPC_GRAPH_GET_CONFIG_DATA:
++            mGraph.getGraphConfigData(addr, requestSize);
++            break;
++        case IPC_GRAPH_GET_CONNECTION:
++            mGraph.pipelineGetConnections(addr, requestSize);
++            break;
++        case IPC_GRAPH_GET_PG_ID:
++            mGraph.getPgIdForKernel(addr, requestSize);
++            break;
++        case IPC_CMC_INIT:
++            status = mCmc.init(addr, requestSize);
++            break;
++        case IPC_CMC_DEINIT:
++            status = mCmc.deinit(addr, requestSize);
++            break;
++        case IPC_MKN_INIT:
++            status = mMkn.init(addr, requestSize);
++            break;
++        case IPC_MKN_ENABLE:
++            status = mMkn.enable(addr, requestSize);
++            break;
++        case IPC_MKN_PREPARE:
++            status = mMkn.prepare(addr, requestSize);
++            break;
++        case IPC_MKN_DEINIT:
++            status = mMkn.deinit(addr, requestSize);
++            break;
++        case IPC_LTM_INIT:
++            status = mLtm.init(addr, requestSize);
++            break;
++        case IPC_LTM_RUN:
++            status = mLtm.run(addr, requestSize);
++            break;
++        case IPC_LTM_DEINIT:
++            status = mLtm.deinit(addr, requestSize);
++            break;
++        case IPC_AIQ_INIT:
++            status = mAiq.init(addr, requestSize);
++            break;
++        case IPC_AIQ_AE_RUN:
++            status = mAiq.aeRun(addr, requestSize);
++            break;
++        case IPC_AIQ_AF_RUN:
++            status = mAiq.afRun(addr, requestSize);
++            break;
++        case IPC_AIQ_AWB_RUN:
++            status = mAiq.awbRun(addr, requestSize);
++            break;
++        case IPC_AIQ_GBCE_RUN:
++            status = mAiq.gbceRun(addr, requestSize);
++            break;
++        case IPC_AIQ_PA_RUN_V1:
++            status = mAiq.paRunV1(addr, requestSize);
++            break;
++        case IPC_AIQ_SA_RUN_V2:
++            status = mAiq.saRunV2(addr, requestSize);
++            break;
++        case IPC_AIQ_STATISTICS_SET_V4:
++            status = mAiq.statisticsSetV4(addr, requestSize);
++            break;
++        case IPC_AIQ_GET_AIQD_DATA:
++            status = mAiq.getAiqdData(addr, requestSize);
++            break;
++        case IPC_AIQ_DEINIT:
++            status = mAiq.deinit(addr, requestSize);
++            break;
++        case IPC_AIQ_GET_VERSION:
++            status = mAiq.getVersion(addr, requestSize);
++            break;
++        case IPC_DVS_INIT:
++            status = mDvs.init(addr, requestSize);
++            break;
++        case IPC_DVS_CONFIG:
++            status = mDvs.config(addr, requestSize);
++            break;
++        case IPC_DVS_SET_NONE_BLANK_RATION:
++            status = mDvs.setNonBlankRatio(addr, requestSize);
++            break;
++        case IPC_DVS_SET_DIGITAL_ZOOM_MODE:
++            status = mDvs.setDigitalZoomMode(addr, requestSize);
++            break;
++        case IPC_DVS_SET_DIGITAL_ZOOM_REGION:
++            status = mDvs.setDigitalZoomRegion(addr, requestSize);
++            break;
++        case IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE:
++            status = mDvs.setDigitalZoomCoordinate(addr, requestSize);
++            break;
++        case IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE:
++            status = mDvs.setDigitalZoomMagnitude(addr, requestSize);
++            break;
++        case IPC_DVS_FREE_MORPH_TABLE:
++            status = mDvs.freeMorphTable(addr, requestSize);
++            break;
++        case IPC_DVS_ALLOCATE_MORPH_TABLE:
++            status = mDvs.allocateMorphTalbe(addr, requestSize);
++            break;
++        case IPC_DVS_GET_MORPH_TABLE:
++            status = mDvs.getMorphTalbe(addr, requestSize);
++            break;
++        case IPC_DVS_SET_STATISTICS:
++            status = mDvs.setStatistics(addr, requestSize);
++            break;
++        case IPC_DVS_EXECUTE:
++            status = mDvs.execute(addr, requestSize);
++            break;
++        case IPC_DVS_GET_IMAGE_TRANSFORMATION:
++            status = mDvs.getImageTransformation(addr, requestSize);
++            break;
++        case IPC_DVS_DEINIT:
++            status = mDvs.deinit(addr, requestSize);
++            break;
++        case IPC_ISP_ADAPTOR_INIT:
++            status = mIspAdaptor.init(addr, requestSize);
++            break;
++        case IPC_ISP_ADAPTOR_DEINIT:
++            status = mIspAdaptor.deInit(addr, requestSize);
++            break;
++        case IPC_ISP_GET_PAL_SIZE:
++            status = mIspAdaptor.getPalDataSize(addr, requestSize);
++            break;
++        case IPC_ISP_CONVERT_STATS: {
++            ConvertStatsParam* params = static_cast<ConvertStatsParam*>(addr);
++            ShmInfo statsDataInfo = {};
++            status = getIntelAlgoServer()->getShmInfo(params->statsHandle, &statsDataInfo);
++            if (status == OK) {
++                status = mIspAdaptor.queryAndConvertStats(addr, requestSize, statsDataInfo.addr);
++            } else {
++                LOGE("%s, the buffer handle for stats data is invalid", __func__);
++            }
++            break;
++        }
++        case IPC_ISP_RUN_PAL: {
++            RunPalParam* palParams = static_cast<RunPalParam*>(addr);
++            ShmInfo palDataInfo;
++            status = getIntelAlgoServer()->getShmInfo(palParams->palDataHandle, &palDataInfo);
++            if (status != OK) {
++                LOGE("%s, the buffer handle for pal data is invalid", __func__);
++                break;
++            }
++            LOGIPC("@%s, pal data info: fd:%d, size:%zu, addr: %p", __func__, palDataInfo.fd,
++                   palDataInfo.size, palDataInfo.addr);
++
++            status = mIspAdaptor.runPal(addr, requestSize, palDataInfo.addr);
++            break;
++        }
++        case IPC_PG_PARAM_INIT:
++            status = mPGParam.init(addr, requestSize);
++            break;
++        case IPC_PG_PARAM_PREPARE: {
++            pg_param_prepare_params* prepareParams = static_cast<pg_param_prepare_params*>(addr);
++            ShmInfo palDataInfo = {};
++            status = getIntelAlgoServer()->getShmInfo(prepareParams->ipuParamHandle, &palDataInfo);
++            if (status != OK) {
++                LOGE("%s, the buffer handle for pal data is invalid", __func__);
++                break;
++            }
++            status = mPGParam.prepare(addr, requestSize, palDataInfo.addr);
++            break;
++        }
++        case IPC_PG_PARAM_ALLOCATE_PG:
++            status = mPGParam.allocatePGBuffer(addr, requestSize);
++            break;
++        case IPC_PG_PARAM_GET_FRAG_DESCS:
++            status = mPGParam.getFragmentDescriptors(addr, requestSize);
++            break;
++        case IPC_PG_PARAM_PREPARE_PROGRAM:
++            status = mPGParam.setPGAndPrepareProgram(addr, requestSize);
++            break;
++        case IPC_PG_PARAM_ALLOCATE_PAYLOADS:
++            status = mPGParam.allocatePayloads(addr, requestSize);
++            break;
++        case IPC_PG_PARAM_ENCODE: {
++            pg_param_encode_params* encodeParams = static_cast<pg_param_encode_params*>(addr);
++            ShmInfo palDataInfo = {};
++            status = getIntelAlgoServer()->getShmInfo(encodeParams->ipuParamHandle, &palDataInfo);
++            if (status != OK) {
++                LOGE("%s, the buffer handle for pal data is invalid", __func__);
++                break;
++            }
++            status = mPGParam.updatePALAndEncode(addr, requestSize, palDataInfo.addr);
++            break;
++        }
++        case IPC_PG_PARAM_DECODE: {
++            pg_param_decode_params* decodeParams = static_cast<pg_param_decode_params*>(addr);
++            ShmInfo decodeInfo = {};
++            status = getIntelAlgoServer()->getShmInfo(decodeParams->clientStatsHandle, &decodeInfo);
++            if (status == OK) {
++                status = mPGParam.decode(addr, requestSize, decodeInfo.addr);
++            } else {
++                LOGE("%s, the buffer handle for stats data is invalid", __func__);
++            }
++            break;
++        }
++        case IPC_PG_PARAM_DEINIT:
++            mPGParam.deinit(addr, requestSize);
++            break;
++        default:
++            LOGE("@%s, req_id:%d is not defined", __func__, req_id);
++            status = UNKNOWN_ERROR;
++            break;
++    }
++
++    LOGIPC("@%s, req_id:%d:%s, status:%d", __func__, req_id,
++           IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), status);
++    getIntelAlgoServer()->returnCallback(req_id, status, buffer_handle);
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.h
+new file mode 100644
+index 000000000000..f026af3f9f17
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCPUAlgoServer.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <base/bind.h>
++#include <base/threading/thread.h>
++
++#include <memory>
++#include <queue>
++#include <unordered_map>
++
++#include "CameraLog.h"
++#include "GraphConfigServer.h"
++#include "IntelAiqServer.h"
++#include "IntelAlgoServer.h"
++#include "IntelCmcServer.h"
++#include "IntelDvsServer.h"
++#include "IntelFDServer.h"
++#include "IntelLardServer.h"
++#include "IntelLtmServer.h"
++#include "IntelMknServer.h"
++#include "IntelPGParamServer.h"
++#include "IspParamAdaptorServer.h"
++#include "cros-camera/camera_algorithm.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "modules/sandboxing/IPCCommon.h"
++
++namespace icamera {
++
++class IntelCPUAlgoServer : public RequestHandler {
++ public:
++    explicit IntelCPUAlgoServer(IntelAlgoServer* server);
++    virtual ~IntelCPUAlgoServer() {}
++    void handleRequest(const MsgReq& msg);
++
++ private:
++    IntelLardServer mLard;
++    IntelFDServer mFaceDetection;
++    GraphConfigServer mGraph;
++    IntelCmcServer mCmc;
++    IntelMknServer mMkn;
++    IntelLtmServer mLtm;
++    IntelAiqServer mAiq;
++    IntelDvsServer mDvs;
++    IspParamAdaptorServer mIspAdaptor;
++    IntelPGParamServer mPGParam;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
+new file mode 100644
+index 000000000000..c0d64aa75eda
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
+@@ -0,0 +1,91 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelCmcServer"
++
++#include "modules/sandboxing/server/IntelCmcServer.h"
++
++#include <ia_cmc_parser.h>
++#include <string.h>
++
++#include <utility>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelCmcServer::IntelCmcServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IntelCmcServer::~IntelCmcServer() {
++    LOGIPC("@%s", __func__);
++
++    mIntelCmcs.clear();
++}
++
++status_t IntelCmcServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(cmc_init_params), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    cmc_init_params* params = static_cast<cmc_init_params*>(pData);
++    ia_binary_data aiqbData = {nullptr, 0};
++
++    bool ret = mIpc.serverUnflattenInit(*params, &aiqbData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    std::unique_ptr<IntelCmc> intelCmc = std::make_unique<IntelCmc>();
++
++    ret = intelCmc->init(&aiqbData, nullptr);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, intelCmc->init fails", __func__);
++
++    ia_cmc_t* cmc = intelCmc->getCmc();
++    CheckError(!cmc, UNKNOWN_ERROR, "@%s, cmc is nullptr", __func__);
++    LOGIPC("@%s, cmc:%p", __func__, cmc);
++
++    ret = mIpc.serverFlattenInit(*cmc, params);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
++
++    mIntelCmcs[cmc] = std::move(intelCmc);
++
++    return OK;
++}
++
++status_t IntelCmcServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(cmc_deinit_params), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(pData);
++
++    ia_cmc_t* cmc = reinterpret_cast<ia_cmc_t*>(params->cmc_handle);
++    LOGIPC("@%s, cmc:%p", __func__, cmc);
++
++    if (mIntelCmcs.find(cmc) == mIntelCmcs.end()) {
++        LOGE("@%s, cmc:%p doesn't exist", __func__, cmc);
++        return UNKNOWN_ERROR;
++    }
++
++    mIntelCmcs[cmc]->deinit();
++
++    mIntelCmcs.erase(cmc);
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
+new file mode 100644
+index 000000000000..5df41e6c5157
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "modules/algowrapper/IntelCmc.h"
++#include "modules/sandboxing/IPCCommon.h"
++#include "modules/sandboxing/IPCIntelCmc.h"
++
++namespace icamera {
++class IntelCmcServer {
++ public:
++    IntelCmcServer();
++    virtual ~IntelCmcServer();
++
++    status_t init(void* pData, int dataSize);
++    status_t deinit(void* pData, int dataSize);
++
++ private:
++    std::unordered_map<ia_cmc_t*, std::unique_ptr<IntelCmc>> mIntelCmcs;
++    IPCIntelCmc mIpc;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
+new file mode 100644
+index 000000000000..a32b5dd86bea
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
+@@ -0,0 +1,312 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelDvsServer"
++
++#include "modules/sandboxing/server/IntelDvsServer.h"
++
++#include <utility>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelDvsServer::IntelDvsServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IntelDvsServer::~IntelDvsServer() {
++    LOGIPC("@%s", __func__);
++
++    mIntelDvss.clear();
++}
++
++status_t IntelDvsServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_binary_data* dvsDataPtr = nullptr;
++    ia_cmc_t* cmc = nullptr;
++    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &dvsDataPtr, &cmc);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    std::unique_ptr<IntelDvs> intelDvs = std::make_unique<IntelDvs>();
++
++    ia_dvs_state* dvs = nullptr;
++    ia_err err = intelDvs->init(*dvsDataPtr, cmc, &dvs);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, intelDvs->init fails", __func__);
++
++    ret = mIpc.serverFlattenInit(pData, dataSize, dvs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
++
++    mIntelDvss[dvs] = std::move(intelDvs);
++
++    return OK;
++}
++
++status_t IntelDvsServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &dvs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    intelDvs->deinit(dvs);
++    return OK;
++}
++
++status_t IntelDvsServer::config(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_dvs_configuration* config = nullptr;
++    float zoomRatio = 0;
++    bool ret = mIpc.serverUnflattenConfig(pData, dataSize, &dvs, &config, &zoomRatio);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfig fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->config(dvs, config, zoomRatio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, config fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::setNonBlankRatio(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    float nonBlankingRatio = 0;
++    bool ret = mIpc.serverUnflattenNoneBlanckRation(pData, dataSize, &dvs, &nonBlankingRatio);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenNoneBlanckRation fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setNonBlankRatio(dvs, nonBlankingRatio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setNonBlankRatio fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::setDigitalZoomMode(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_dvs_zoom_mode zoomMode = ia_dvs_zoom_mode_center;
++    bool ret = mIpc.serverUnflattenDigitalZoomMode(pData, dataSize, &dvs, &zoomMode);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMode fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setDigitalZoomMode(dvs, zoomMode);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomMode fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::setDigitalZoomRegion(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_rectangle* zoomRegion = nullptr;
++    bool ret = mIpc.serverUnflattenDigitalZoomRegion(pData, dataSize, &dvs, &zoomRegion);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomRegion fails",
++               __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setDigitalZoomRegion(dvs, zoomRegion);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomRegion fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::setDigitalZoomCoordinate(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_coordinate* zoomCoordinate = nullptr;
++    bool ret = mIpc.serverUnflattenDigitalZoomCoordinate(pData, dataSize, &dvs, &zoomCoordinate);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomCoordinate fails",
++               __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setDigitalZoomCoordinate(dvs, zoomCoordinate);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomCoordinate fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::setDigitalZoomMagnitude(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    float zoomRatio = 0;
++    bool ret = mIpc.serverUnflattenDigitalZoomMagnitude(pData, dataSize, &dvs, &zoomRatio);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMagnitude fails",
++               __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setDigitalZoomMagnitude(dvs, zoomRatio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomMagnitude fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::freeMorphTable(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_morph_table* morph = nullptr;
++    ia_dvs_state* dvs = nullptr;
++    bool ret = mIpc.serverUnflattenFreeMorphTable(pData, dataSize, &dvs, &morph);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenFreeMorphTable fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    intelDvs->freeMorphTable(dvs, morph);
++    return OK;
++}
++
++status_t IntelDvsServer::allocateMorphTalbe(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    bool ret = mIpc.serverUnflattenAllocateMorphTalbe(pData, dataSize, &dvs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocateMorphTalbe fails",
++               __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_dvs_morph_table* morph = intelDvs->allocateMorphTalbe(dvs);
++
++    ret = mIpc.serverFlattenAllocateMorphTalbe(pData, dataSize, morph);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAllocateMorphTalbe fails", __func__);
++
++    return OK;
++}
++
++status_t IntelDvsServer::getMorphTalbe(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_dvs_morph_table* morph = nullptr;
++    bool ret = mIpc.serverUnflattenGetMorphTalbe(pData, dataSize, &dvs, &morph);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetMorphTalbe fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    int err = intelDvs->getMorphTable(dvs, morph);
++    CheckError(err != OK, UNKNOWN_ERROR, "@%s, getMorphTalbe fails", __func__);
++
++    ret = mIpc.serverFlattenGetMorphTalbe(pData, dataSize, morph);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetMorphTalbe fails", __func__);
++
++    return OK;
++}
++
++status_t IntelDvsServer::setStatistics(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_dvs_statistics* statistics = nullptr;
++    ia_aiq_ae_results* aeResults = nullptr;
++    ia_aiq_af_results* afResults = nullptr;
++    ia_aiq_sensor_events* sensorEvents = nullptr;
++    uint64_t frameReadoutStart = 0;
++    uint64_t frameReadoutEnd = 0;
++    bool ret = mIpc.serverUnflattenSetStatistics(pData, dataSize, &dvs, &statistics, &aeResults,
++                                                 &afResults, &sensorEvents, &frameReadoutStart,
++                                                 &frameReadoutEnd);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSetStatistics fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->setStatistics(dvs, statistics, aeResults, afResults, sensorEvents,
++                                         frameReadoutStart, frameReadoutEnd);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::execute(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    uint16_t focusPosition = 0;
++    bool ret = mIpc.serverUnflattenExecute(pData, dataSize, &dvs, &focusPosition);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenExecute fails", __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->execute(dvs, focusPosition);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
++    return OK;
++}
++
++status_t IntelDvsServer::getImageTransformation(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_dvs_state* dvs = nullptr;
++    ia_dvs_image_transformation imageTransformation = {0};
++    bool ret = mIpc.serverUnflattenImageTransformation(pData, dataSize, &dvs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenImageTransformation fails",
++               __func__);
++
++    IntelDvs* intelDvs = getIntelDvs(dvs);
++    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
++
++    ia_err err = intelDvs->getImageTransformation(dvs, &imageTransformation);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getImageTransformation fails", __func__);
++
++    ret = mIpc.serverFlattenImageTransformation(pData, dataSize, &imageTransformation);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenImageTransformation fails",
++               __func__);
++    return OK;
++}
++
++IntelDvs* IntelDvsServer::getIntelDvs(ia_dvs_state* dvs) {
++    LOGIPC("@%s, dvs:%p", __func__, dvs);
++
++    if (mIntelDvss.find(dvs) == mIntelDvss.end()) {
++        LOGE("@%s, dvs:%p doesn't exist", __func__, dvs);
++        return nullptr;
++    }
++
++    return mIntelDvss[dvs].get();
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
+new file mode 100644
+index 000000000000..4016cc5f8b0b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelDvs.h"
++#include "modules/sandboxing/IPCIntelDvs.h"
++
++namespace icamera {
++class IntelDvsServer {
++ public:
++    IntelDvsServer();
++    virtual ~IntelDvsServer();
++
++    status_t init(void* pData, int dataSize);
++    status_t deinit(void* pData, int dataSize);
++    status_t config(void* pData, int dataSize);
++    status_t setNonBlankRatio(void* pData, int dataSize);
++    status_t setDigitalZoomMode(void* pData, int dataSize);
++    status_t setDigitalZoomRegion(void* pData, int dataSize);
++    status_t setDigitalZoomCoordinate(void* pData, int dataSize);
++    status_t setDigitalZoomMagnitude(void* pData, int dataSize);
++    status_t freeMorphTable(void* pData, int dataSize);
++    status_t allocateMorphTalbe(void* pData, int dataSize);
++    status_t getMorphTalbe(void* pData, int dataSize);
++    status_t setStatistics(void* pData, int dataSize);
++    status_t execute(void* pData, int dataSize);
++    status_t getImageTransformation(void* pData, int dataSize);
++
++ private:
++    IntelDvs* getIntelDvs(ia_dvs_state* dvs);
++
++ private:
++    std::unordered_map<ia_dvs_state*, std::unique_ptr<IntelDvs>> mIntelDvss;
++    IPCIntelDvs mIpc;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
+new file mode 100644
+index 000000000000..73da85c48293
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelFDServer"
++
++#include "modules/sandboxing/server/IntelFDServer.h"
++
++#include <pvl_types.h>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelFDServer::IntelFDServer() {
++    mFaceDetection = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
++
++    LOG1("@%s", __func__);
++}
++
++IntelFDServer::~IntelFDServer() {
++    LOG1("@%s", __func__);
++}
++
++status_t IntelFDServer::init(void* pData, int dataSize) {
++    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)), UNKNOWN_ERROR,
++               "buffer is small");
++
++    return mFaceDetection->init(static_cast<FaceDetectionInitParams*>(pData), dataSize);
++}
++
++status_t IntelFDServer::run(void* pData, int dataSize, void* imageData) {
++    LOG1("@%s, pData:%p, dataSize:%d, imageData:%p", __func__, pData, dataSize, imageData);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)), UNKNOWN_ERROR,
++               "buffer is small");
++
++    pvl_image image;
++    FaceDetectionRunParams* pFdRunParams = static_cast<FaceDetectionRunParams*>(pData);
++    mIpcFD.serverUnflattenRun(*pFdRunParams, imageData, &image);
++
++    return mFaceDetection->run(&image, &pFdRunParams->results);
++}
++
++status_t IntelFDServer::deinit() {
++    LOG1("@%s", __func__);
++    return mFaceDetection->deinit();
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
+new file mode 100644
+index 000000000000..053f5bbbefc3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelFaceDetection.h"
++#include "modules/sandboxing/IPCIntelFD.h"
++
++namespace icamera {
++class IntelFDServer {
++ public:
++    IntelFDServer();
++    virtual ~IntelFDServer();
++
++    status_t init(void* pData, int dataSize);
++    status_t run(void* pData, int dataSize, void* imageData);
++    status_t deinit();
++
++ private:
++    std::unique_ptr<IntelFaceDetection> mFaceDetection;
++    IPCIntelFD mIpcFD;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.cpp
+new file mode 100644
+index 000000000000..c665f5e522c9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.cpp
+@@ -0,0 +1,110 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelGPUAlgoServer"
++
++#include "modules/sandboxing/server/IntelGPUAlgoServer.h"
++
++#include <base/logging.h>
++#include <ia_log.h>
++#include <stdlib.h>
++#include <sys/mman.h>
++#include <sys/stat.h>
++
++#include <memory>
++#include <string>
++
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelGPUAlgoServer::IntelGPUAlgoServer(IntelAlgoServer* server) : RequestHandler(server) {
++    LOGIPC("@%s", __func__);
++}
++
++void IntelGPUAlgoServer::handleRequest(const MsgReq& msg) {
++    uint32_t req_id = msg.req_id;
++    int32_t buffer_handle = msg.buffer_handle;
++
++    ShmInfo info = {};
++    status_t status = getIntelAlgoServer()->getShmInfo(buffer_handle, &info);
++    if (status != OK) {
++        LOGE("@%s, Invalid buffer handle", __func__);
++        getIntelAlgoServer()->returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
++        return;
++    }
++
++    size_t requestSize = info.size;
++    void* addr = info.addr;
++    LOGIPC("@%s, req_id:%d:%s, requestSize:%zu, buffer_handle:%d addr:%p", __func__, req_id,
++           IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), requestSize, buffer_handle, addr);
++    switch (req_id) {
++#ifdef TNR7_CM
++        case IPC_GPU_TNR_INIT:
++            status = mTNR.init(addr, requestSize);
++            break;
++        case IPC_GPU_TNR_PREPARE_SURFACE:
++            status = mTNR.prepareSurface(addr, requestSize);
++            break;
++        case IPC_GPU_TNR_RUN_FRAME: {
++            TnrRunInfo* runInfo = static_cast<TnrRunInfo*>(addr);
++            ShmInfo inBuffer = {};
++            ShmInfo outBuffer = {};
++            ShmInfo paramBuffer = {};
++            if (runInfo->inHandle >= 0) {
++                status = getIntelAlgoServer()->getShmInfo(runInfo->inHandle, &inBuffer);
++                if (status != OK) {
++                    LOGE("%s, the buffer handle for inBuffer data is invalid", __func__);
++                    break;
++                }
++            }
++            if (runInfo->outHandle >= 0) {
++                status = getIntelAlgoServer()->getShmInfo(runInfo->outHandle, &outBuffer);
++                if (status != OK) {
++                    LOGE("%s, the buffer handle for inBuffer data is invalid", __func__);
++                    break;
++                }
++            }
++            if (runInfo->paramHandle >= 0) {
++                status = getIntelAlgoServer()->getShmInfo(runInfo->paramHandle, &paramBuffer);
++                if (status != OK) {
++                    LOGE("%s, the buffer handle for inBuffer data is invalid", __func__);
++                    break;
++                }
++            }
++
++            status = mTNR.runTnrFrame(inBuffer.addr, outBuffer.addr, inBuffer.size, outBuffer.size,
++                                      paramBuffer.addr, false);
++            break;
++        }
++        case IPC_GPU_TNR_PARAM_UPDATE: {
++            TnrRunInfo* runInfo = static_cast<TnrRunInfo*>(addr);
++            status = mTNR.asyncParamUpdate(runInfo->gain);
++            break;
++        }
++        case IPC_GPU_TNR_DEINIT:
++            status = mTNR.deInit();
++            break;
++#endif
++        default:
++            LOGE("@%s, req_id:%d is not defined", __func__, req_id);
++            status = UNKNOWN_ERROR;
++            break;
++    }
++
++    getIntelAlgoServer()->returnCallback(req_id, status, buffer_handle);
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.h
+new file mode 100644
+index 000000000000..6447306cdcd3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelGPUAlgoServer.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <base/bind.h>
++#include <base/threading/thread.h>
++
++#include <memory>
++#include <queue>
++#include <unordered_map>
++
++#include "CameraLog.h"
++#include "IntelAlgoServer.h"
++#include "cros-camera/camera_algorithm.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "modules/sandboxing/IPCCommon.h"
++#ifdef TNR7_CM
++#include "modules/sandboxing/server/IntelTNRServer.h"
++#endif
++
++namespace icamera {
++
++class IntelGPUAlgoServer : public RequestHandler {
++ public:
++    explicit IntelGPUAlgoServer(IntelAlgoServer* server);
++    virtual ~IntelGPUAlgoServer() {}
++    void handleRequest(const MsgReq& msg);
++
++#ifdef TNR7_CM
++ private:
++    IntelTNRServer mTNR;
++#endif
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
+new file mode 100644
+index 000000000000..f462795152e5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelLardServer"
++
++#include "modules/sandboxing/server/IntelLardServer.h"
++
++#include <memory>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLardServer::IntelLardServer() {
++    mLard = std::unique_ptr<IntelLard>(new IntelLard());
++    LOGIPC("@%s", __func__);
++}
++
++IntelLardServer::~IntelLardServer() {
++    LOGIPC("@%s", __func__);
++}
++
++status_t IntelLardServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_binary_data binaryData = {nullptr, 0};
++    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &binaryData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    ia_lard* lard = mLard->init(&binaryData);
++    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, mLard.init fails", __func__);
++
++    ret = mIpc.serverFlattenInit(pData, dataSize, lard);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
++
++    return OK;
++}
++
++status_t IntelLardServer::getTagList(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_lard* lard = nullptr;
++    unsigned int mode_tag = LCMC_TAG;
++
++    bool ret = mIpc.serverUnflattenGetTagList(pData, dataSize, &lard, &mode_tag);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
++    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
++
++    unsigned int num_tags = 0;
++    const unsigned int* tags = nullptr;
++
++    ia_err ret1 = mLard->getTagList(lard, mode_tag, &num_tags, &tags);
++    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.getTagList fails", __func__);
++
++    mIpc.serverFlattenGetTagList(pData, dataSize, num_tags, tags);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
++    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
++
++    return OK;
++}
++
++status_t IntelLardServer::run(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_lard* lard = nullptr;
++    ia_lard_input_params* inputParams = nullptr;
++
++    bool ret = mIpc.serverUnflattenRun(pData, dataSize, &lard, &inputParams);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
++    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
++    CheckError(inputParams == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
++
++    ia_lard_results* result = nullptr;
++    ia_err ret1 = mLard->run(lard, inputParams, &result);
++    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.run fails", __func__);
++
++    ret = mIpc.serverFlattenRun(pData, dataSize, result);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
++
++    return OK;
++}
++
++status_t IntelLardServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++
++    ia_lard* lard = nullptr;
++    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &lard);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
++    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
++
++    mLard->deinit(lard);
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
+new file mode 100644
+index 000000000000..aca05cf9c241
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Errors.h"
++#include "memory"
++#include "modules/algowrapper/IntelLard.h"
++#include "modules/sandboxing/IPCIntelLard.h"
++
++namespace icamera {
++class IntelLardServer {
++ public:
++    IntelLardServer();
++    virtual ~IntelLardServer();
++
++    status_t init(void* pData, int dataSize);
++    status_t getTagList(void* pData, int dataSize);
++    status_t run(void* pData, int dataSize);
++    status_t deinit(void* pData, int dataSize);
++
++ private:
++    std::unique_ptr<IntelLard> mLard;
++    IPCIntelLard mIpc;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
+new file mode 100644
+index 000000000000..31310e12b69c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelLtmServer"
++
++#include "modules/sandboxing/server/IntelLtmServer.h"
++
++#include <utility>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelLtmServer::IntelLtmServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IntelLtmServer::~IntelLtmServer() {
++    LOGIPC("@%s", __func__);
++}
++
++int IntelLtmServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(LtmInitParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    LtmInitParams* params = static_cast<LtmInitParams*>(pData);
++    ia_binary_data inData;
++    uintptr_t mkn_hanlde;
++    bool ret = mIpc.serverUnflattenInit(params, &inData, &mkn_hanlde);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    std::unique_ptr<IntelLtm> intelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
++    ia_mkn* mkn = reinterpret_cast<ia_mkn*>(mkn_hanlde);
++    ia_ltm* ltm = intelLtm->init(&inData, mkn);
++
++    ret = mIpc.serverFlattenInit(params, ltm);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
++
++    mIntelLtms[ltm] = std::move(intelLtm);
++
++    return OK;
++}
++
++int IntelLtmServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(LtmDeinitParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    LtmDeinitParams* params = static_cast<LtmDeinitParams*>(pData);
++    ia_ltm* ltm = reinterpret_cast<ia_ltm*>(params->ltm_handle);
++    LOGIPC("@%s, params->ltm_handle:%p", __func__, ltm);
++
++    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
++        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
++        return UNKNOWN_ERROR;
++    }
++
++    mIntelLtms[ltm]->deinit(ltm);
++    mIntelLtms.erase(ltm);
++
++    return OK;
++}
++
++int IntelLtmServer::run(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(LtmRunParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    ia_ltm_input_params* inputParams = nullptr;
++    ia_ltm* ltm = nullptr;
++    bool ret = mIpc.serverUnflattenRun(pData, &ltm, &inputParams);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
++
++    ia_ltm_results* ltmResults = nullptr;
++    ia_ltm_drc_params* drcResults = nullptr;
++
++    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
++        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
++        return UNKNOWN_ERROR;
++    }
++
++    ia_err retErr = mIntelLtms[ltm]->run(ltm, inputParams, &ltmResults, &drcResults);
++    CheckError(retErr != ia_err_none, UNKNOWN_ERROR, "@%s, mIntelLtms->run fails", __func__);
++
++    LtmRunParams* params = static_cast<LtmRunParams*>(pData);
++    ret = mIpc.serverFlattenRun(*ltmResults, *drcResults, ltm, params);
++    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
+new file mode 100644
+index 000000000000..65a7e99b2576
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelLtm.h"
++#include "modules/sandboxing/IPCIntelLtm.h"
++
++namespace icamera {
++class IntelLtmServer {
++ public:
++    IntelLtmServer();
++    virtual ~IntelLtmServer();
++
++    int init(void* pData, int dataSize);
++    int deinit(void* pData, int dataSize);
++    int run(void* pData, int dataSize);
++
++ private:
++    std::unordered_map<ia_ltm*, std::unique_ptr<IntelLtm>> mIntelLtms;
++    IPCIntelLtm mIpc;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
+new file mode 100644
+index 000000000000..f34cb60b9c81
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
+@@ -0,0 +1,124 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelMknServer"
++
++#include "modules/sandboxing/server/IntelMknServer.h"
++
++#include <utility>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelMknServer::IntelMknServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IntelMknServer::~IntelMknServer() {
++    LOGIPC("@%s", __func__);
++
++    mIntelMkns.clear();
++}
++
++int IntelMknServer::init(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(MknInitParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    MknInitParams* params = static_cast<MknInitParams*>(pData);
++
++    std::unique_ptr<IntelMkn> intelMnk = std::make_unique<IntelMkn>();
++    ia_mkn* mkn = intelMnk->init(params->mkn_config_bits, params->mkn_section_1_size,
++                                 params->mkn_section_2_size);
++    CheckError(mkn == nullptr, UNKNOWN_ERROR, "@%s, mkn.init fails", __func__);
++
++    params->results = reinterpret_cast<uintptr_t>(mkn);
++    LOGIPC("@%s, mkn:%p, params->results:%", __func__, mkn, params->results);
++
++    mIntelMkns[mkn] = std::move(intelMnk);
++
++    return OK;
++}
++
++int IntelMknServer::deinit(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(MknDeinitParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    MknDeinitParams* params = static_cast<MknDeinitParams*>(pData);
++    ia_mkn* mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
++    LOGIPC("@%s, params->mkn_handle:%p", __func__, mkn);
++
++    IntelMkn* intelMnk = getIntelMkn(mkn);
++    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
++
++    intelMnk->deinit(mkn);
++    mIntelMkns.erase(mkn);
++
++    return OK;
++}
++
++int IntelMknServer::prepare(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(MknPrepareParams), UNKNOWN_ERROR, "@%s, buffer is small",
++               __func__);
++
++    MknPrepareParams* params = static_cast<MknPrepareParams*>(pData);
++
++    ia_mkn* mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
++    ia_binary_data data;
++
++    IntelMkn* intelMnk = getIntelMkn(mkn);
++    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
++
++    int ret = intelMnk->prepare(mkn, params->data_target, &data);
++    CheckError(ret != OK, NO_MEMORY, "Failed to prepare makernote");
++    LOGIPC("@%s, data.size:%d, data.data:%p", __func__, data.size, data.data);
++
++    bool retFlag = mIpc.serverFlattenPrepare(data, params);
++    CheckError(retFlag == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepare fails", __func__);
++
++    return OK;
++}
++
++int IntelMknServer::enable(void* pData, int dataSize) {
++    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < sizeof(MknEnableParams), UNKNOWN_ERROR, "@%s, buffer is small", __func__);
++
++    MknEnableParams* params = static_cast<MknEnableParams*>(pData);
++    ia_mkn* mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
++
++    IntelMkn* intelMnk = getIntelMkn(mkn);
++    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
++
++    return intelMnk->enable(mkn, params->enable_data_collection);
++}
++
++IntelMkn* IntelMknServer::getIntelMkn(ia_mkn* mkn) {
++    LOGIPC("@%s, mkn:%p", __func__, mkn);
++
++    if (mIntelMkns.find(mkn) == mIntelMkns.end()) {
++        LOGE("@%s, mkn:%p doesn't exist", __func__, mkn);
++        return nullptr;
++    }
++
++    return mIntelMkns[mkn].get();
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
+new file mode 100644
+index 000000000000..2f2947e34dcb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
+@@ -0,0 +1,45 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelMkn.h"
++#include "modules/sandboxing/IPCIntelMkn.h"
++
++namespace icamera {
++class IntelMknServer {
++ public:
++    IntelMknServer();
++    virtual ~IntelMknServer();
++
++    int init(void* pData, int dataSize);
++    int deinit(void* pData, int dataSize);
++
++    int enable(void* pData, int dataSize);
++    int prepare(void* pData, int dataSize);
++
++ private:
++    IntelMkn* getIntelMkn(ia_mkn* mkn);
++
++ private:
++    std::unordered_map<ia_mkn*, std::unique_ptr<IntelMkn>> mIntelMkns;
++    IPCIntelMkn mIpc;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
+new file mode 100644
+index 000000000000..5c1f3620d58e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
+@@ -0,0 +1,229 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelPGParamS"
++
++#include "modules/sandboxing/server/IntelPGParamServer.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IntelPGParamServer::IntelPGParamServer() {}
++
++IntelPGParamServer::~IntelPGParamServer() {}
++
++int IntelPGParamServer::init(void* pData, int dataSize) {
++    int pgId = 0;
++    uintptr_t client = 0;
++    ia_p2p_platform_t platform = IA_P2P_PLATFORM_IPU6;
++    PgConfiguration pgConfig;
++
++    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &pgId, &client, &platform, &pgConfig);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    PGParamPackage package;
++    package.pgId = pgId;
++    package.mPayloadCount = 0;
++    CLEAR(package.mPayloads);
++    package.mPGBuffer = nullptr;
++    mPGParamPackages[client] = package;
++    mPGParamPackages[client].mPGParamAdapt = std::shared_ptr<IntelPGParam>(new IntelPGParam(pgId));
++    int result = mPGParamPackages[client].mPGParamAdapt->init(platform, pgConfig);
++    CheckError(result != OK, result, "@%s, init fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParamServer::prepare(void* pData, int dataSize, void* palDataAddr) {
++    uintptr_t client = 0;
++    ia_binary_data ipuParameters = {nullptr, 0};
++    ia_css_rbm_t* rbm = nullptr;
++    ia_css_kernel_bitmap_t* bitmap = nullptr;
++    uint32_t* maxStatsSize = nullptr;
++    bool ret = mIpc.serverUnflattenPrepare(pData, dataSize, &client, palDataAddr, &ipuParameters,
++                                           &rbm, &bitmap, &maxStatsSize);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepare fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++
++    int result =
++        mPGParamPackages[client].mPGParamAdapt->prepare(&ipuParameters, rbm, bitmap, maxStatsSize);
++    CheckError(result != OK, result, "@%s, prepare fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParamServer::allocatePGBuffer(void* pData, int dataSize) {
++    uintptr_t client = 0;
++    int pgSize = 0;
++    bool ret = mIpc.serverUnflattenAllocatePGBuffer(pData, dataSize, &client, &pgSize);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePGBuffer fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++
++    // Get server data pointer of PGBuffer
++    void* pgBuffer = nullptr;
++    ret = mIpc.assignPGBuffer(pData, dataSize, pgSize, &pgBuffer);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, assignPGBuffer fails", __func__);
++
++    mPGParamPackages[client].mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
++    return OK;
++}
++
++int IntelPGParamServer::getFragmentDescriptors(void* pData, int dataSize) {
++    uintptr_t client = 0;
++    int descCount = 0;
++    ia_p2p_fragment_desc* descs = nullptr;
++    bool ret = mIpc.serverUnflattenGetFragDescs(pData, dataSize, &client, &descCount, &descs);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetFragDescs fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++
++    int count = mPGParamPackages[client].mPGParamAdapt->getFragmentDescriptors(descCount, descs);
++    CheckError(count <= 0, count, "@%s, getFragmentDescriptors fails", __func__);
++
++    ret = mIpc.serverFlattenGetFragDescs(pData, dataSize, count);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetFragDescs fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParamServer::setPGAndPrepareProgram(void* pData, int dataSize) {
++    uintptr_t client = 0;
++    bool ret = mIpc.serverUnflattenPrepareProgram(pData, dataSize, &client);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepareProgram fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++    PGParamPackage& package = mPGParamPackages[client];
++
++    int result = package.mPGParamAdapt->setPGAndPrepareProgram(package.mPGBuffer);
++    CheckError(result != OK, result, "@%s, setPGAndPrepareProgram fails", __func__);
++
++    // Get payload size here
++    package.mPayloadCount =
++        package.mPGParamAdapt->getPayloadSizes(ARRAY_SIZE(package.mPayloads), package.mPayloads);
++    CheckError(!package.mPayloadCount, UNKNOWN_ERROR, "@%s, getPayloadSizes fails", __func__);
++
++    ret =
++        mIpc.serverFlattenPrepareProgram(pData, dataSize, package.mPayloadCount, package.mPayloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepareProgram fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParamServer::allocatePayloads(void* pData, int dataSize) {
++    uintptr_t client = 0;
++    int clientPayloadCount = 0;
++    ia_binary_data* clientPayloads = nullptr;
++    bool ret = mIpc.serverUnflattenAllocatePayloads(pData, dataSize, &client, &clientPayloadCount,
++                                                    &clientPayloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePayloads fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++    PGParamPackage& package = mPGParamPackages[client];
++
++    // Check size here only because shared memory is allocated in client
++    CheckError(clientPayloadCount != package.mPayloadCount, UNKNOWN_ERROR,
++               "@%s, payloadCount errror", __func__);
++    for (int i = 0; i < clientPayloadCount; i++) {
++        CheckError(clientPayloads[i].size != package.mPayloads[i].size, UNKNOWN_ERROR,
++                   "@%s, payload size error for term %d", __func__, i);
++    }
++
++    // Get server data pointer of payloads
++    package.mPayloadMemory.size = dataSize;
++    package.mPayloadMemory.data = pData;
++
++    return OK;
++}
++
++int IntelPGParamServer::updatePALAndEncode(void* pData, int dataSize, void* palDataAddr) {
++    uintptr_t client = 0;
++    ia_binary_data ipuParameters = {nullptr, 0};
++    int32_t* payloadOffsets = nullptr;
++    ia_binary_data* payloads = nullptr;
++    int32_t payloadCount = 0;
++
++    bool ret = mIpc.serverUnflattenEncode(pData, dataSize, &client, palDataAddr, &ipuParameters,
++                                          &payloadCount, &payloads, &payloadOffsets);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenEncode fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++    PGParamPackage& package = mPGParamPackages[client];
++    CheckError(payloadCount != package.mPayloadCount, UNKNOWN_ERROR, "@%s, wrong payloadCount",
++               __func__);
++    ret = mIpc.getPayloadData(package.mPayloadMemory.data, package.mPayloadMemory.size,
++                              payloadCount, payloadOffsets, payloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, getPayloadData fails", __func__);
++
++    int result = package.mPGParamAdapt->updatePALAndEncode(&ipuParameters, payloadCount, payloads);
++    CheckError(result != OK, result, "@%s, updatePALAndEncode fails", __func__);
++
++    return OK;
++}
++
++int IntelPGParamServer::decode(void* pData, int dataSize, void* statsAddr) {
++    uintptr_t client = 0;
++    ia_binary_data statistics = {statsAddr, 0};
++    int32_t* payloadOffsets = nullptr;
++    ia_binary_data* payloads = nullptr;
++    int32_t payloadCount = 0;
++
++    bool ret = mIpc.serverUnflattenDecode(pData, dataSize, &client, &payloadCount, &payloads,
++                                          &payloadOffsets);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDecode fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), UNKNOWN_ERROR,
++               "%s, the pg doesn't exist in the table", __func__);
++    PGParamPackage& package = mPGParamPackages[client];
++    CheckError(payloadCount != package.mPayloadCount, UNKNOWN_ERROR, "@%s, wrong payloadCount",
++               __func__);
++    ret = mIpc.getPayloadData(package.mPayloadMemory.data, package.mPayloadMemory.size,
++                              payloadCount, payloadOffsets, payloads);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, getPayloadData fails", __func__);
++
++    int result = package.mPGParamAdapt->decode(payloadCount, payloads, &statistics);
++    CheckError(result != OK, result, "@%s, decode fails", __func__);
++
++    ret = mIpc.serverFlattenDecode(pData, dataSize, statistics);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenDecode fails", __func__);
++
++    return OK;
++}
++
++void IntelPGParamServer::deinit(void* pData, int dataSize) {
++    uintptr_t client = 0;
++
++    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &client);
++    CheckError(ret == false, VOID_VALUE, "@%s, serverUnflattenDeinit fails", __func__);
++
++    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()), VOID_VALUE,
++               "%s, the pg doesn't exist in the table", __func__);
++
++    mPGParamPackages[client].mPGParamAdapt->deinit();
++    mPGParamPackages.erase(client);
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
+new file mode 100644
+index 000000000000..fdd11337a0a2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
+@@ -0,0 +1,56 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "modules/algowrapper/IntelPGParam.h"
++#include "modules/sandboxing/IPCIntelPGParam.h"
++
++namespace icamera {
++
++class IntelPGParamServer {
++ public:
++    IntelPGParamServer();
++    ~IntelPGParamServer();
++
++    int init(void* pData, int dataSize);
++    int prepare(void* pData, int dataSize, void* palDataAddr);
++    int allocatePGBuffer(void* pData, int dataSize);
++    int getFragmentDescriptors(void* pData, int dataSize);
++    int setPGAndPrepareProgram(void* pData, int dataSize);
++    int allocatePayloads(void* pData, int dataSize);
++    int updatePALAndEncode(void* pData, int dataSize, void* palDataAddr);
++    int decode(void* pData, int dataSize, void* statsAddr);
++    void deinit(void* pData, int dataSize);
++
++ private:
++    struct PGParamPackage {
++        int pgId;
++        std::shared_ptr<IntelPGParam> mPGParamAdapt;
++        ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];
++        int mPayloadCount;
++        ia_binary_data mPayloadMemory;
++        ia_css_process_group_t* mPGBuffer;
++    };
++
++    IPCIntelPGParam mIpc;
++    std::unordered_map<uintptr_t, PGParamPackage> mPGParamPackages;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.cpp
+new file mode 100644
+index 000000000000..44ffee804f51
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.cpp
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IntelTNRServer"
++
++#include "modules/sandboxing/server/IntelTNRServer.h"
++
++#include <pvl_types.h>
++
++#include "CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++IntelTNRServer::IntelTNRServer() {
++    LOG1("@%s", __func__);
++}
++
++IntelTNRServer::~IntelTNRServer() {
++    LOG1("@%s", __func__);
++}
++
++int IntelTNRServer::init(void* pData, int dataSize) {
++    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(dataSize < static_cast<int>(sizeof(TnrResolution)), UNKNOWN_ERROR,
++               "buffer is small");
++    TnrResolution* res = static_cast<TnrResolution*>(pData);
++    if (!mIntelTNR) {
++        mIntelTNR = std::unique_ptr<IntelTNR7US>(new IntelTNR7US());
++    }
++    return mIntelTNR->init(res->width, res->height);
++}
++
++int IntelTNRServer::deInit() {
++    LOG1("@%s", __func__);
++    mIntelTNR = nullptr;
++    return OK;
++}
++
++int IntelTNRServer::prepareSurface(void* pData, int dataSize) {
++    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
++    CheckError(mIntelTNR == nullptr, UNKNOWN_ERROR, "@%s, invalid IntelTNR object", __func__);
++    return mIntelTNR->prepareSurface(pData, dataSize);
++}
++
++int IntelTNRServer::runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                                uint32_t outBufSize, void* tnrParam, bool isUsrPtr) {
++    CheckError(mIntelTNR == nullptr, UNKNOWN_ERROR, "@%s, mIntelTNR is nullptr", __func__);
++    return mIntelTNR->runTnrFrame(inBufAddr, outBufAddr, inBufSize, outBufSize,
++                                  static_cast<Tnr7Param*>(tnrParam), isUsrPtr);
++}
++
++int IntelTNRServer::asyncParamUpdate(int gain) {
++    CheckError(mIntelTNR == nullptr, UNKNOWN_ERROR, "@%s, mIntelTNR is nullptr", __func__);
++    return mIntelTNR->asyncParamUpdate(gain);
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.h
+new file mode 100644
+index 000000000000..33f129939e9b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelTNRServer.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelTNR7US.h"
++
++namespace icamera {
++
++class IntelTNRServer {
++ public:
++    IntelTNRServer();
++    virtual ~IntelTNRServer();
++
++    int init(void* pData, int dataSize);
++    int deInit();
++    int prepareSurface(void* pData, int dataSize);
++    int runTnrFrame(const void* inBufAddr, void* outBufAddr, uint32_t inBufSize,
++                    uint32_t outBufSize, void* tnrParam, bool isUsrPtr = true);
++    int asyncParamUpdate(int gain);
++
++ private:
++    std::unique_ptr<IntelTNR7US> mIntelTNR;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
+new file mode 100644
+index 000000000000..3e69120009e9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IspParamAdaptorServer"
++
++#include "modules/sandboxing/server/IspParamAdaptorServer.h"
++
++#include <utility>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++IspParamAdaptorServer::IspParamAdaptorServer() {
++    LOGIPC("@%s", __func__);
++}
++
++IspParamAdaptorServer::~IspParamAdaptorServer() {
++    LOGIPC("@%s", __func__);
++    mIspParamAdaptors.clear();
++}
++
++status_t IspParamAdaptorServer::init(void* pData, int size) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(IspBxtInitParam), UNKNOWN_ERROR, "%s, buffer is small", __func__);
++
++    IspBxtInitParam* params = static_cast<IspBxtInitParam*>(pData);
++
++    ia_binary_data* ispData = nullptr;
++    ia_cmc_t* cmcData = nullptr;
++    bool ret = mIpc.serverUnflattenInit(params, size, &ispData, &cmcData);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
++
++    std::unique_ptr<IntelIspParamAdaptor> adaptor = std::make_unique<IntelIspParamAdaptor>();
++    ia_isp_bxt* ispHandle =
++        adaptor->init(ispData, cmcData, params->maxStatsWidth, params->maxStatsHeight,
++                      params->maxStatsIn, params->iaMkn);
++    CheckError(!ispHandle, UNKNOWN_ERROR, "@%s, init isp param adaptor failed", __func__);
++
++    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
++    LOGIPC("@%s ispHandle %p: %d", __func__, ispHandle, params->ispRemoteHandle);
++
++    mIspParamAdaptors[ispHandle] = std::move(adaptor);
++
++    return OK;
++}
++
++status_t IspParamAdaptorServer::deInit(void* pData, int size) {
++    LOGIPC("@%s", __func__);
++    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(IspBxtDeInitParam), UNKNOWN_ERROR, "%s, buffer is small", __func__);
++
++    ia_isp_bxt* ispHandle = nullptr;
++    bool ret = mIpc.serverUnflattenDeInit(pData, size, &ispHandle);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeInit fails", __func__);
++
++    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()), UNKNOWN_ERROR,
++               "%s, the isp handle doesn't exist in the table", __func__);
++    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR, "%s, IntelIspParamAdaptor is nullptr",
++               __func__);
++
++    mIspParamAdaptors[ispHandle]->deInit(ispHandle);
++    mIspParamAdaptors.erase(ispHandle);
++
++    return OK;
++}
++
++int IspParamAdaptorServer::getPalDataSize(void* pData, int size) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(PalDataSizeParam), UNKNOWN_ERROR, "%s, buffer is small", __func__);
++
++    ia_isp_bxt_program_group* programGroup = nullptr;
++    bool ret = mIpc.serverUnflattenGetPalSize(pData, size, &programGroup);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetPalSize fails", __func__);
++
++    CheckError(mIspParamAdaptors.empty(), UNKNOWN_ERROR, "%s, mIspParamAdaptors is empty",
++               __func__);
++    int palSize = mIspParamAdaptors.begin()->second->getPalDataSize(programGroup);
++    LOGIPC("%s, The pal data size: %d", __func__, palSize);
++
++    PalDataSizeParam* params = static_cast<PalDataSizeParam*>(pData);
++    params->palDataSize = palSize;
++
++    return OK;
++}
++
++status_t IspParamAdaptorServer::queryAndConvertStats(void* pData, int size, void* statsAddr) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
++    CheckError(size < sizeof(ConvertStatsParam), UNKNOWN_ERROR, "%s, buffer is small", __func__);
++
++    ia_isp_bxt* ispHandle = nullptr;
++    ConvertInputParam inputParams = {};
++    ConvertResult result = {};
++
++    bool ret =
++        mIpc.serverUnflattenConvertStats(pData, size, &ispHandle, &inputParams, &result, statsAddr);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConvertStats fails", __func__);
++
++    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()), UNKNOWN_ERROR,
++               "%s, the isp handle doesn't exist in the table", __func__);
++    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR, "%s, IntelIspParamAdaptor is nullptr",
++               __func__);
++    int res = mIspParamAdaptors[ispHandle]->queryAndConvertStats(ispHandle, &inputParams, &result);
++    CheckError(res != OK, res, "%s, Failed to convert the status", __func__);
++
++    ret = mIpc.serverFlattenConvertStats(pData, size, result);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenConvertStats fails", __func__);
++
++    return OK;
++}
++
++status_t IspParamAdaptorServer::runPal(void* pData, int size, void* palDataAddr) {
++    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
++    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
++    CheckError(!palDataAddr, UNKNOWN_ERROR, "%s, palDataAddr is nullptr", __func__);
++
++    ia_isp_bxt* ispHandle = nullptr;
++    ia_isp_bxt_input_params_v2* inputParams = nullptr;
++    ia_binary_data* palOutput = nullptr;
++
++    bool ret = mIpc.serverUnflattenRunPal(pData, size, &ispHandle, &inputParams, &palOutput);
++    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRunPal fails", __func__);
++    palOutput->data = palDataAddr;
++    LOGIPC("%s, palDataAddr: %p, size: %d", __func__, palDataAddr, palOutput->size);
++
++    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()), UNKNOWN_ERROR,
++               "%s, the isp handle doesn't exist in the table", __func__);
++    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR, "%s, IntelIspParamAdaptor is nullptr",
++               __func__);
++
++    int res = mIspParamAdaptors[ispHandle]->runPal(ispHandle, inputParams, palOutput);
++    CheckError(res != OK, res, "%s, Failed to run pal", __func__);
++    LOGIPC("%s, the pal data size is: %d after running", __func__, palOutput->size);
++
++    return OK;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
+new file mode 100644
+index 000000000000..15fc4530ed83
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <unordered_map>
++
++#include "iutils/Errors.h"
++#include "modules/algowrapper/IntelIspParamAdaptor.h"
++#include "modules/sandboxing/IPCIspParamAdaptor.h"
++
++namespace icamera {
++
++class IspParamAdaptorServer {
++ public:
++    IspParamAdaptorServer();
++    virtual ~IspParamAdaptorServer();
++
++    status_t init(void* pData, int size);
++    status_t deInit(void* pData, int size);
++    status_t getPalDataSize(void* pData, int size);
++    status_t runPal(void* pData, int size, void* palDataAddr);
++    status_t queryAndConvertStats(void* pData, int size, void* statsAddr);
++
++ private:
++    IPCIspParamAdaptor mIpc;
++    std::unordered_map<ia_isp_bxt*, std::unique_ptr<IntelIspParamAdaptor> > mIspParamAdaptors;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.cpp b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
+new file mode 100644
+index 000000000000..5bc25fd3c4af
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
+@@ -0,0 +1,961 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqCore"
++
++#include <math.h>
++
++#include <memory>
++#include <string>
++
++#include "PlatformData.h"
++#include "AiqUtils.h"
++#include "Parameters.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++#include "AiqCore.h"
++
++namespace icamera {
++#define VALID_COLOR_GAINS(colorGains) (colorGains[0] > 0 && colorGains[1] > 0 && \
++                                       colorGains[2] > 0 && colorGains[3] > 0)
++AiqCore::AiqCore(int cameraId) :
++    mCameraId(cameraId),
++    mTimestamp(0),
++    mSensorPixelClock(0.0),
++    mAeForceLock(false),
++    mAwbForceLock(false),
++    mAfForceLock(false),
++    mLastAeResult(nullptr),
++    mLastAwbResult(nullptr),
++    mLastAfResult(nullptr),
++    mAeRunTime(0),
++    mAwbRunTime(0),
++    mAiqState(AIQ_NOT_INIT),
++    mUseManualColorMatrix(false),
++    mHyperFocalDistance(0.0f),
++    mTuningMode(TUNING_MODE_MAX),
++    mShadingMode(SHADING_MODE_FAST),
++    mLensShadingMapMode(LENS_SHADING_MAP_MODE_OFF),
++    mLastEvShift(0.0f) {
++    LOG3A("@%s", __func__);
++
++    mIntel3AParameter = std::unique_ptr<Intel3AParameter>(new Intel3AParameter(cameraId));
++
++    CLEAR(mFrameParams);
++    CLEAR(mGbceParams);
++    CLEAR(mPaParams);
++    CLEAR(mSaParams);
++    CLEAR(mColorMatrix);
++    CLEAR(mColorGains);
++    CLEAR(mIntelAiqHandle);
++    CLEAR(mIntelAiqHandleStatus);
++    CLEAR(mPaColorGains);
++
++    CLEAR(mResizeLscGridR);
++    CLEAR(mResizeLscGridGr);
++    CLEAR(mResizeLscGridGb);
++    CLEAR(mResizeLscGridB);
++
++    CLEAR(mLensShadingMapSize);
++
++    // init LscOffGrid to 1.0f
++    std::fill(std::begin(mLscOffGrid), std::end(mLscOffGrid), 1.0f);
++
++}
++
++AiqCore::~AiqCore() {
++    LOG3A("@%s", __func__);
++
++    for (int i = 0; i < TUNING_MODE_MAX; i++) {
++        if (mIntelAiqHandle[i]) {
++            delete mIntelAiqHandle[i];
++        }
++    }
++}
++
++int AiqCore::initAiqPlusParams() {
++    LOG3A("@%s", __func__);
++
++    CLEAR(mFrameParams);
++    CLEAR(mGbceParams);
++    CLEAR(mPaParams);
++    CLEAR(mPaColorGains);
++    CLEAR(mSaParams);
++    CLEAR(mColorMatrix);
++    CLEAR(mColorGains);
++
++    mUseManualColorMatrix = false;
++
++    mGbceParams.gbce_level = ia_aiq_gbce_level_use_tuning;
++    mGbceParams.frame_use = ia_aiq_frame_use_video;
++    mGbceParams.ev_shift = 0;
++    mGbceParams.tone_map_level = ia_aiq_tone_map_level_use_tuning;
++
++    mPaParams.color_gains = nullptr;
++
++    mSaParams.sensor_frame_params = &mFrameParams;
++    /* use convergence time from tunings */
++    mSaParams.manual_convergence_time = -1.0;
++
++    return OK;
++}
++
++int AiqCore::init() {
++    LOG3A("@%s", __func__);
++
++    initAiqPlusParams();
++
++#ifndef ENABLE_SANDBOXING
++    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
++    ia_log_init(&env);
++#endif
++
++    mAiqState = AIQ_INIT;
++
++    int ret = mIntel3AParameter->init();
++    CheckError(ret != OK, ret, "@%s, Init 3a parameter failed ret: %d", __func__, ret);
++
++    mLastAeResult = nullptr;
++    mLastAwbResult = nullptr;
++    mLastAfResult = nullptr;
++    mAeRunTime = 0;
++    mAwbRunTime = 0;
++
++    return OK;
++}
++
++void AiqCore::deinitIntelAiqHandle() {
++    LOG3A("@%s", __func__);
++
++    for (auto mode = 0; mode < TUNING_MODE_MAX; mode++) {
++        IntelAiq* aiq = mIntelAiqHandle[mode];
++        if (!aiq) continue;
++
++        if (PlatformData::isAiqdEnabled(mCameraId)) {
++            ia_binary_data data = {nullptr, 0};
++            ia_err iaErr = aiq->getAiqdData(&data);
++            if (AiqUtils::convertError(iaErr) == OK) {
++                PlatformData::saveAiqd(mCameraId, static_cast<TuningMode>(mode), data);
++            } else {
++                LOGW("@%s, failed to get aiqd data, iaErr %d", __func__, iaErr);
++            }
++        }
++        aiq->deinit();
++        delete aiq;
++        mIntelAiqHandle[mode] = nullptr;
++    }
++    CLEAR(mIntelAiqHandleStatus);
++}
++
++int AiqCore::deinit() {
++    LOG3A("@%s", __func__);
++
++#ifndef ENABLE_SANDBOXING
++    ia_log_deinit();
++#endif
++
++    deinitIntelAiqHandle();
++
++    mAiqState = AIQ_NOT_INIT;
++
++    return OK;
++}
++
++int AiqCore::initIntelAiqHandle(const std::vector<TuningMode>& tuningModes) {
++    LOG3A("@%s", __func__);
++
++    ia_mkn* mkn = static_cast<ia_mkn*>(PlatformData::getMknHandle(mCameraId));
++    ia_binary_data *nvmData = PlatformData::getNvm(mCameraId);
++    ia_binary_data aiqData = {nullptr, 0};
++    // Initialize mIntelAiqHandle array based on different cpf data
++    for (auto & mode : tuningModes) {
++        uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
++        int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, &aiqData, nullptr,
++                                             &cmcHandle, mode);
++        CheckError(ret != OK, BAD_VALUE, "@%s, getDataAndCmc fails", __func__);
++
++        ia_binary_data* aiqd = nullptr;
++        if (PlatformData::PlatformData::isAiqdEnabled(mCameraId)) {
++            aiqd = PlatformData::getAiqd(mCameraId, mode);
++        }
++
++        int statsNum = PlatformData::getExposureNum(mCameraId,
++                           CameraUtils::isMultiExposureCase(mode));
++        {
++            IntelAiq* intelAiq = new IntelAiq();
++            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->init", 1);
++            ia_aiq* aiq = intelAiq->init(&(aiqData),
++                                        nvmData,
++                                        aiqd,
++                                        MAX_STATISTICS_WIDTH,
++                                        MAX_STATISTICS_HEIGHT,
++                                        statsNum,
++                                        reinterpret_cast<ia_cmc_t*>(cmcHandle),
++                                        mkn);
++            if (aiq) {
++                mIntelAiqHandle[mode] = intelAiq;
++
++                std::string aiqVersion;
++                intelAiq->getVersion(&aiqVersion);
++                LOGI("@%s, AIQ VERSION: %s", __func__, aiqVersion.c_str());
++            } else {
++                mIntelAiqHandle[mode] = nullptr;
++                delete intelAiq;
++            }
++        }
++        CheckError(!mIntelAiqHandle[mode], NO_INIT, "@%s: init aiq failed!", __func__);
++        mIntelAiqHandleStatus[mode] = true;
++    }
++
++    return OK;
++}
++
++int AiqCore::configure(const std::vector<ConfigMode>& configModes) {
++    LOG3A("@%s", __func__);
++
++    int ret = OK;
++    bool allTuningModeConfiged = true;
++    std::vector<TuningMode> tuningModes;
++    for (auto cfg : configModes) {
++        TuningMode mode;
++        ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, mode);
++        CheckError(ret != OK, ret, "%s: getTuningModeByConfigMode fails, cfg:%d", __func__, cfg);
++        tuningModes.push_back(mode);
++
++        if (!mIntelAiqHandle[mode]) {
++            allTuningModeConfiged = false;
++        }
++    }
++
++    if (mAiqState == AIQ_CONFIGURED && allTuningModeConfiged) {
++        return OK;
++    }
++
++    deinitIntelAiqHandle();
++
++    ret = initIntelAiqHandle(tuningModes);
++    if (ret == OK) {
++        mAiqState = AIQ_CONFIGURED;
++    }
++
++    return OK;
++}
++
++int AiqCore::setSensorInfo(const ia_aiq_frame_params &frameParams,
++                           const ia_aiq_exposure_sensor_descriptor &descriptor) {
++    LOG3A("@%s", __func__);
++
++    mFrameParams = frameParams;
++    mSensorPixelClock = descriptor.pixel_clock_freq_mhz;
++    mIntel3AParameter->setSensorInfo(descriptor);
++
++    return OK;
++}
++
++/**
++ *  Hyperfocal distance is the closest distance at which a lens can be focused
++ *  while keeping objects at infinity acceptably sharp. When the lens is focused
++ *  at this distance, all objects at distances from half of the hyperfocal
++ *  distance out to infinity will be acceptably sharp.
++ *
++ *  The equation used for this is:
++ *        f*f
++ *  H = -------
++ *        N*c
++ *
++ *  where:
++ *   f is the focal length
++ *   N is the f-number (f/D for aperture diameter D)
++ *   c is the Circle Of Confusion (COC)
++ *
++ *   the COC is calculated as the pixel width of 2 pixels
++ *
++ *  The hyperfocal distance in mm. It is ensured it will never be 0 to
++ *  avoid division by 0. If any of the required CMC items is missing
++ *  it will return the default value 5m
++ */
++int AiqCore::calculateHyperfocalDistance(TuningMode mode) {
++    LOG3A("@%s, tuning mode: %d", __func__, mode);
++
++    ia_cmc_t *cmcData = nullptr;
++    int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, nullptr, nullptr,
++                                         nullptr, mode, &cmcData);
++    CheckError(ret != OK || !cmcData, BAD_VALUE, "@%s get cmc data failed", __func__);
++
++    mHyperFocalDistance = AiqUtils::calculateHyperfocalDistance(*cmcData);
++
++    return OK;
++}
++
++/**
++ *
++ * Calculate the Depth of field (DOF) for a given AF Result.
++ *
++ * The Formulas to calculate the near and afar DOF are:
++ *          H * s
++ * Dn = ---------------
++ *         H + (s-f)
++ *
++ *          H * s
++ * Df =  ------------
++ *         H - (s-f)
++ *
++ * Where:
++ * H is the hyperfocal distance (that we get from CPF) (it cannot be 0)
++ * s is the distance to focused object (current focus distance)
++ * f is the focal length
++ *
++ * \param[in] afResults with current focus distance in mm
++ * \param[out] dof info: DOF for near and far limit in diopters
++ */
++int AiqCore::calculateDepthOfField(const ia_aiq_af_results &afResults,
++                                   camera_range_t *focusRange) {
++    LOG3A("@%s, afResults:%p, focusRange:%p", __func__, afResults, focusRange);
++    CheckError(!focusRange, BAD_VALUE, "@%s, Bad input values", __func__);
++
++    const float DEFAULT_DOF = 5000.0f;
++    focusRange->min = 1000.0f / DEFAULT_DOF;
++    focusRange->max = 1000.0f / DEFAULT_DOF;
++
++    float focusDistance = 1.0f * afResults.current_focus_distance;
++    if (focusDistance == 0.0f) {
++        // Not reporting error since this may be normal in fixed focus sensors
++        return OK;
++    }
++
++    ia_cmc_t *cmcData = nullptr;
++    cmc_optomechanics_t *optoInfo = nullptr;
++    PlatformData::getCpfAndCmc(mCameraId, nullptr, nullptr, nullptr,
++                               nullptr, mTuningMode, &cmcData);
++    if (cmcData) {
++        optoInfo = cmcData->cmc_parsed_optics.cmc_optomechanics;
++    }
++
++    float focalLengthMillis = 2.3f;
++    if (optoInfo) {
++        // focal length is stored in CMC in hundreds of millimeters
++        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
++    }
++
++    float num = mHyperFocalDistance * focusDistance;
++    float denom = (mHyperFocalDistance + focusDistance - focalLengthMillis);
++    if (denom != 0.0f) {
++        focusRange->min = num / denom;
++    }
++
++    denom = (mHyperFocalDistance - focusDistance + focalLengthMillis);
++    if (denom != 0.0f) {
++        focusRange->max = num / denom;
++    }
++
++    focusRange->min = 1000.0f / focusRange->min;
++    focusRange->max = 1000.0f / focusRange->max;
++
++    return OK;
++}
++
++int AiqCore::updateParameter(const aiq_parameter_t &param) {
++    LOG3A("@%s", __func__);
++
++    mUseManualColorMatrix = (param.awbMode == AWB_MODE_MANUAL_COLOR_TRANSFORM);
++    mColorMatrix = param.manualColorMatrix;
++    mColorGains = param.manualColorGains;
++
++    if (mTuningMode != param.tuningMode) {
++        int ret = calculateHyperfocalDistance(param.tuningMode);
++        CheckError(ret != OK, ret, "%s calculateHyperfocalDistance fails", __func__);
++        mTuningMode = param.tuningMode;
++    }
++    mShadingMode = param.shadingMode;
++    mLensShadingMapMode = param.lensShadingMapMode;
++    mLensShadingMapSize = param.lensShadingMapSize;
++
++    mGbceParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
++    mGbceParams.ev_shift = param.evShift;
++
++    // In still frame use force update by setting convergence time to 0.
++    // in other cases use tunings.
++    mSaParams.manual_convergence_time = (param.frameUsage == FRAME_USAGE_STILL) ? 0.0 : -1.0;
++
++    mIntel3AParameter->updateParameter(param);
++    mAeForceLock = param.aeForceLock;
++    mAwbForceLock = param.awbForceLock;
++    mAfForceLock = mIntel3AParameter->mAfForceLock;
++
++    return OK;
++}
++
++int AiqCore::setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) {
++    LOG3A("@%s, ispStatistics:%p", __func__, ispStatistics);
++    CheckError(!ispStatistics, BAD_VALUE, "@%s, ispStatistics is nullptr", __func__);
++
++    int ret = OK;
++
++    CheckError(mTuningMode >= TUNING_MODE_MAX, UNKNOWN_ERROR, "mTuningMode overflow!");
++    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("statisticsSetV4", 1);
++        ia_err iaErr = intelAiq->statisticsSetV4(ispStatistics);
++        ret = AiqUtils::convertError(iaErr);
++        CheckError(ret != OK, ret, "Error setting statistics, ret = %d", ret);
++    }
++
++    mTimestamp = ispStatistics->frame_timestamp;
++    return ret;
++}
++
++int AiqCore::runAiq(AiqResult *aiqResult) {
++    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
++    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
++
++    int ret = run3A(aiqResult);
++    CheckError(ret != OK, ret, "run3A failed, ret: %d", ret);
++
++    ret = runAiqPlus(aiqResult);
++    CheckError(ret != OK, ret, "runAiqPlus failed, ret: %d", ret);
++
++    aiqResult->mTimestamp = mTimestamp;
++    return OK;
++}
++
++int AiqCore::run3A(AiqResult *aiqResult) {
++    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
++    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
++
++    int ret = OK;
++    int aaaType = IMAGING_ALGO_AE | IMAGING_ALGO_AWB;
++    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
++        aaaType |= IMAGING_ALGO_AF;
++    }
++
++    if (aaaType & IMAGING_ALGO_AE) {
++        ret |= runAe(&aiqResult->mAeResults);
++    }
++    if (aaaType & IMAGING_ALGO_AWB) {
++        ret |= runAwb(&aiqResult->mAwbResults);
++    }
++    if (aaaType & IMAGING_ALGO_AF) {
++        ret |= runAf(aiqResult);
++    }
++
++    uint16_t pixelInLine = aiqResult->mAeResults.exposures[0].sensor_exposure->line_length_pixels;
++    uint16_t lineInFrame = aiqResult->mAeResults.exposures[0].sensor_exposure->frame_length_lines;
++    aiqResult->mFrameDuration = pixelInLine * lineInFrame / mSensorPixelClock;
++    aiqResult->mRollingShutter = pixelInLine * (mFrameParams.cropped_image_height - 1)
++                                 / mSensorPixelClock;
++    return ret;
++}
++
++int AiqCore::runAiqPlus(AiqResult *aiqResult) {
++    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
++    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
++
++    int algoType = IMAGING_ALGO_GBCE | IMAGING_ALGO_PA | IMAGING_ALGO_SA;
++
++    int ret = OK;
++    if (algoType & IMAGING_ALGO_GBCE) {
++        ret |= runGbce(&aiqResult->mGbceResults);
++    }
++    if (algoType & IMAGING_ALGO_PA) {
++        ret |= runPa(&aiqResult->mPaResults, &aiqResult->mAwbResults,
++                     aiqResult->mAeResults.exposures[0].exposure,
++                     &aiqResult->mPreferredAcm);
++    }
++    if ((algoType & IMAGING_ALGO_SA) && (mShadingMode != SHADING_MODE_OFF)) {
++        ret |= runSa(&aiqResult->mSaResults, &aiqResult->mAwbResults,
++                     aiqResult->mAiqParam.lensShadingMap);
++    }
++
++    return ret;
++}
++
++int AiqCore::runAe(ia_aiq_ae_results* aeResults) {
++    LOG3A("@%s, aeResults:%p", __func__, aeResults);
++    CheckError(!aeResults, BAD_VALUE, "@%s, aeResults is nullptr", __func__);
++    PERF_CAMERA_ATRACE();
++
++    int ret = OK;
++    ia_aiq_ae_results *newAeResults = mLastAeResult;
++    bool aeForceRun = mIntel3AParameter->mAeParams.ev_shift != mLastEvShift ||
++                      (!mAeForceLock && (mAeRunTime % mIntel3AParameter->mAePerTicks == 0));
++
++    if (aeForceRun) {
++        LOG3A("AEC frame_use: %d", mIntel3AParameter->mAeParams.frame_use);
++
++        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++        {
++            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->aeRun", 1);
++            ia_err iaErr = intelAiq->aeRun(&mIntel3AParameter->mAeParams, &newAeResults);
++            ret = AiqUtils::convertError(iaErr);
++            CheckError(ret != OK || !newAeResults, ret, "Error running AE, ret: %d", ret);
++        }
++
++        if (newAeResults->exposures[0].converged) {
++            mLastEvShift = mIntel3AParameter->mAeParams.ev_shift;
++        }
++    }
++
++    mIntel3AParameter->updateAeResult(newAeResults);
++    if (newAeResults) {
++        ret = AiqUtils::deepCopyAeResults(*newAeResults, aeResults);
++    }
++    mLastAeResult = aeResults;
++    ++mAeRunTime;
++
++    return ret;
++}
++
++int AiqCore::runAf(AiqResult *aiqResult) {
++    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
++    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
++    PERF_CAMERA_ATRACE();
++
++    ia_aiq_af_results *afResults = &aiqResult->mAfResults;
++    ia_aiq_af_results *newAfResults = mLastAfResult;
++
++    int ret = OK;
++    if (!mAfForceLock) {
++        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++        CheckError(!intelAiq, UNKNOWN_ERROR, "@%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++        {
++            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->afRun", 1);
++            ia_err iaErr = intelAiq->afRun(&mIntel3AParameter->mAfParams, &newAfResults);
++            ret = AiqUtils::convertError(iaErr);
++            CheckError(ret != OK || !newAfResults, ret, "Error running AF, ret: %d", ret);
++        }
++    }
++
++    focusDistanceResult(newAfResults, &aiqResult->mAfDistanceDiopters, &aiqResult->mFocusRange);
++    ret = AiqUtils::deepCopyAfResults(*newAfResults, afResults);
++
++    mLastAfResult = afResults;
++    mIntel3AParameter->fillAfTriggerResult(newAfResults);
++    return ret;
++}
++
++void AiqCore::focusDistanceResult(const ia_aiq_af_results *afResults,
++                                  float *afDistanceDiopters,
++                                  camera_range_t *focusRange) {
++    LOG3A("@%s, afResults:%p, afDistanceDiopters:%p, focusRange:%p", __func__,
++          afResults, afDistanceDiopters, focusRange);
++    CheckError(!afResults || !afDistanceDiopters || !focusRange, VOID_VALUE,
++               "@%s, Bad input values", __func__);
++
++    *afDistanceDiopters = 1.2f;
++    if (mIntel3AParameter->mAfParams.focus_mode == ia_aiq_af_operation_mode_infinity) {
++        // infinity mode is special: we need to report 0.0f (1/inf = 0)
++        *afDistanceDiopters = 0.0f;
++    } else if (afResults->current_focus_distance != 0) {
++        // In AIQ, 'current_focus_distance' is in millimeters
++        // For rounding multiply by extra 100.
++        // This allows the diopters to have 2 decimal values
++        *afDistanceDiopters = 100 * 1000 * (1.0 / afResults->current_focus_distance);
++        *afDistanceDiopters = ceil(*afDistanceDiopters);
++        // Divide by 100 for final result.
++        *afDistanceDiopters = *afDistanceDiopters / 100;
++    }
++    LOG3A("%s, Zero focus distance in AF result, reporting %f", __func__, *afDistanceDiopters);
++
++    calculateDepthOfField(*afResults, focusRange);
++    LOG3A("%s, focus distance with diopters: %f %f", __func__, focusRange->min, focusRange->max);
++}
++
++int AiqCore::runAwb(ia_aiq_awb_results* awbResults) {
++    LOG3A("@%s, awbResults:%p", __func__, awbResults);
++    CheckError(!awbResults, BAD_VALUE, "@%s, awbResults is nullptr", __func__);
++    PERF_CAMERA_ATRACE();
++
++    int ret = OK;
++    ia_aiq_awb_results *newAwbResults = mLastAwbResult;
++
++    if (!mAwbForceLock && (mAwbRunTime % mIntel3AParameter->mAwbPerTicks == 0)) {
++        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++        {
++            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->awbRun", 1);
++            ia_err iaErr = intelAiq->awbRun(&mIntel3AParameter->mAwbParams, &newAwbResults);
++            ret = AiqUtils::convertError(iaErr);
++            CheckError(ret != OK || !newAwbResults, ret, "Error running AWB, ret: %d", ret);
++        }
++    }
++
++    CheckError(!newAwbResults, BAD_VALUE, "newAwbResults is nullptr");
++
++    if (!PlatformData::isIsysEnabled(mCameraId)) {
++        // Fix AWB gain to 1 for none-ISYS cases
++        newAwbResults->accurate_r_per_g = 1;
++        newAwbResults->accurate_b_per_g = 1;
++        newAwbResults->final_r_per_g = 1;
++        newAwbResults->final_b_per_g = 1;
++    }
++
++    mIntel3AParameter->updateAwbResult(newAwbResults);
++
++    ret = AiqUtils::deepCopyAwbResults(*newAwbResults, awbResults);
++
++    mLastAwbResult = awbResults;
++    ++mAwbRunTime;
++
++    return ret;
++}
++
++int AiqCore::runGbce(ia_aiq_gbce_results *gbceResults) {
++    LOG3A("%s, gbceResults:%p", __func__, gbceResults);
++    CheckError(!gbceResults, BAD_VALUE, "@%s, gbceResults is nullptr", __func__);
++
++    PERF_CAMERA_ATRACE();
++    ia_aiq_gbce_results *newGbceResults = nullptr;
++
++    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->gbceRun", 1);
++        ia_err iaErr = intelAiq->gbceRun(&mGbceParams, &newGbceResults);
++        int ret = AiqUtils::convertError(iaErr);
++        CheckError(ret != OK, ret, "@%s, gbceRun fails, ret: %d", __func__, ret);
++    }
++
++    return AiqUtils::deepCopyGbceResults(*newGbceResults, gbceResults);
++}
++
++int AiqCore::runPa(ia_aiq_pa_results_v1 *paResults,
++                   ia_aiq_awb_results *awbResults,
++                   ia_aiq_exposure_parameters *exposureParams,
++                   ia_aiq_advanced_ccm_t *preferredAcm) {
++    LOG3A("%s, paResults:%p, awbResults:%p, exposureParams:%p, preferredAcm:%p", __func__,
++          paResults, awbResults, exposureParams, preferredAcm);
++    CheckError(!paResults || !awbResults || !exposureParams || !preferredAcm, BAD_VALUE,
++               "@%s, Bad input values", __func__);
++
++    PERF_CAMERA_ATRACE();
++    ia_aiq_pa_results_v1 *newPaResults = nullptr;
++
++    mPaParams.awb_results = awbResults;
++    mPaParams.exposure_params = exposureParams;
++    mPaParams.color_gains = nullptr;
++
++    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->paRunV1", 1);
++        ia_err iaErr = intelAiq->paRunV1(&mPaParams, &newPaResults);
++        int ret = AiqUtils::convertError(iaErr);
++        CheckError(ret != OK || !newPaResults, ret, "Error running PA, ret: %d", ret);
++    }
++
++    dumpPaResult(newPaResults);
++
++    // Override color_conversion_matrix and color_gains
++    // when application requires manual color transform.
++    if (mUseManualColorMatrix) {
++        MEMCPY_S(&newPaResults->color_conversion_matrix,
++                 sizeof(newPaResults->color_conversion_matrix),
++                 &mColorMatrix.color_transform,
++                 sizeof(mColorMatrix.color_transform));
++
++        if (VALID_COLOR_GAINS(mColorGains.color_gains_rggb)) {
++            newPaResults->color_gains.r  = mColorGains.color_gains_rggb[0];
++            newPaResults->color_gains.gr = mColorGains.color_gains_rggb[1];
++            newPaResults->color_gains.gb = mColorGains.color_gains_rggb[2];
++            newPaResults->color_gains.b  = mColorGains.color_gains_rggb[3];
++        }
++
++        // Override advanced color conversion matrix also if it enabled
++        if (newPaResults->preferred_acm) {
++            for (unsigned int i = 0; i < newPaResults->preferred_acm->sector_count; i++) {
++                MEMCPY_S(&newPaResults->preferred_acm->advanced_color_conversion_matrices[i],
++                         sizeof(newPaResults->preferred_acm->advanced_color_conversion_matrices[0]),
++                         &mColorMatrix.color_transform,
++                         sizeof(mColorMatrix.color_transform));
++            }
++        }
++    }
++
++    return AiqUtils::deepCopyPaResults(*newPaResults, paResults, preferredAcm);
++}
++
++int AiqCore::checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder) {
++    LOG3A("@%s, bayerOrder = %d, colorOrder:%p", __func__, bayerOrder, colorOrder);
++    CheckError(!colorOrder, BAD_VALUE, "@%s, colorOrder is nullptr", __func__);
++
++    int ret = OK;
++    switch (bayerOrder) {
++    case cmc_bayer_order_grbg:
++    /* use gr r b gb constitute 2X2 array
++     * gr    r
++     * b     gb
++     * The four channel use x y coordinate to indicate
++     * gr(0, 0) r(1, 0) b(0, 1) gb(1, 1)
++    */
++        colorOrder->r[0] = 1;
++        colorOrder->r[1] = 0;
++        colorOrder->b[0] = 0;
++        colorOrder->b[1] = 1;
++        colorOrder->gr[0] = 0;
++        colorOrder->gr[1] = 0;
++        colorOrder->gb[0] = 1;
++        colorOrder->gb[1] = 1;
++        break;
++    case cmc_bayer_order_rggb:
++        colorOrder->r[0] = 0;
++        colorOrder->r[1] = 0;
++        colorOrder->b[0] = 1;
++        colorOrder->b[1] = 1;
++        colorOrder->gr[0] = 1;
++        colorOrder->gr[1] = 0;
++        colorOrder->gb[0] = 0;
++        colorOrder->gb[1] = 1;
++        break;
++    case cmc_bayer_order_bggr:
++        colorOrder->r[0] = 1;
++        colorOrder->r[1] = 1;
++        colorOrder->b[0] = 0;
++        colorOrder->b[1] = 0;
++        colorOrder->gr[0] = 0;
++        colorOrder->gr[1] = 1;
++        colorOrder->gb[0] = 1;
++        colorOrder->gb[1] = 0;
++        break;
++    case cmc_bayer_order_gbrg:
++        colorOrder->r[0] = 0;
++        colorOrder->r[1] = 1;
++        colorOrder->b[0] = 1;
++        colorOrder->b[1] = 0;
++        colorOrder->gr[0] = 1;
++        colorOrder->gr[1] = 1;
++        colorOrder->gb[0] = 0;
++        colorOrder->gb[1] = 0;
++        break;
++    default:
++        ret = BAD_VALUE;
++        break;
++    }
++    return ret;
++}
++
++int AiqCore::reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB) {
++    LOG3A("@%s, width %d, height %d", __func__, inputLscGrid.width, inputLscGrid.height);
++
++    CheckError(inputLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
++               "@%s, Bad input values for lens shading map reformatting", __func__);
++
++    // Metadata spec request order [R, Geven, Godd, B]
++    // the lensShading from ISP is 4 width * height block,
++    // for ia_aiq_bayer_order_grbg, the four block is G, R, B, G
++    size_t size = inputLscGrid.height * inputLscGrid.width;
++    for (size_t i = 0; i < size; i++) {
++        *dstLscGridRGGB++ = inputLscGrid.gridR[i];
++        *dstLscGridRGGB++ = inputLscGrid.gridGr[i];
++        *dstLscGridRGGB++ = inputLscGrid.gridGb[i];
++        *dstLscGridRGGB++ = inputLscGrid.gridB[i];
++    }
++
++    return OK;
++}
++
++int AiqCore::storeLensShadingMap(const LSCGrid &inputLscGrid,
++                                 const LSCGrid &resizeLscGrid, float *dstLscGridRGGB) {
++    LOG3A("@%s", __func__);
++    CheckError(inputLscGrid.isBad() || resizeLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
++               "@%s, Bad input values for lens shading map storing", __func__);
++
++    int destWidth = resizeLscGrid.width;
++    int destHeight = resizeLscGrid.height;
++    int width = inputLscGrid.width;
++    int height = inputLscGrid.height;
++
++    if (width != destWidth || height != destHeight) {
++        // requests lensShadingMapSize must be smaller than 64*64
++        // and it is a constant size.
++        // Our lensShadingMapSize is dynamic based on the resolution, so need
++        // to do resize for 4 channels separately
++
++        AiqUtils::resize2dArray(inputLscGrid.gridR,  width, height,
++                      resizeLscGrid.gridR,  destWidth, destHeight);
++        AiqUtils::resize2dArray(inputLscGrid.gridGr,  width, height,
++                      resizeLscGrid.gridGr,  destWidth, destHeight);
++        AiqUtils::resize2dArray(inputLscGrid.gridGb,  width, height,
++                      resizeLscGrid.gridGb,  destWidth, destHeight);
++        AiqUtils::resize2dArray(inputLscGrid.gridB,  width, height,
++                      resizeLscGrid.gridB,  destWidth, destHeight);
++
++        LOG3A("resize lens shading map from [%d,%d] to [%d,%d]",
++              width, height, destWidth, destHeight);
++    } else {
++        size_t size = destWidth * destHeight * sizeof(resizeLscGrid.gridR[0]);
++        STDCOPY((int8_t *) resizeLscGrid.gridR,  (int8_t *) inputLscGrid.gridR,  size);
++        STDCOPY((int8_t *) resizeLscGrid.gridGr, (int8_t *) inputLscGrid.gridGr, size);
++        STDCOPY((int8_t *) resizeLscGrid.gridGb, (int8_t *) inputLscGrid.gridGb, size);
++        STDCOPY((int8_t *) resizeLscGrid.gridB,  (int8_t *) inputLscGrid.gridB,  size);
++    }
++
++    return reFormatLensShadingMap(resizeLscGrid, dstLscGridRGGB);
++}
++
++int AiqCore::processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap) {
++    LOG3A("@%s, saResults:%p, lensShadingMap:%p", __func__, saResults, lensShadingMap);
++    CheckError(!saResults || !lensShadingMap, BAD_VALUE, "@%s, Bad input values", __func__);
++
++    if (!saResults->lsc_update || (mLensShadingMapMode == LENS_SHADING_MAP_MODE_OFF)) {
++        return OK;
++    }
++
++    ColorOrder co_ind = {};
++    int ret = checkColorOrder(saResults->color_order, &co_ind);
++    CheckError(ret != OK, BAD_VALUE, "Failed to checkColorOrder, ret: %d", ret);
++
++    LSCGrid inputGrid;
++    inputGrid.gridB = saResults->lsc_grid[co_ind.b[0]][co_ind.b[1]];
++    inputGrid.gridR = saResults->lsc_grid[co_ind.r[0]][co_ind.r[1]];
++    inputGrid.gridGr = saResults->lsc_grid[co_ind.gr[0]][co_ind.gr[1]];
++    inputGrid.gridGb = saResults->lsc_grid[co_ind.gb[0]][co_ind.gb[1]];
++    inputGrid.width = saResults->width;
++    inputGrid.height = saResults->height;
++
++    LSCGrid resizeGrid;
++    resizeGrid.gridB = mResizeLscGridB;
++    resizeGrid.gridR = mResizeLscGridR;
++    resizeGrid.gridGr = mResizeLscGridGr;
++    resizeGrid.gridGb = mResizeLscGridGb;
++    resizeGrid.width = mLensShadingMapSize.x;
++    resizeGrid.height = mLensShadingMapSize.y;
++
++    float lscGridRGGB[DEFAULT_LSC_GRID_SIZE * 4];
++    storeLensShadingMap(inputGrid, resizeGrid, lscGridRGGB);
++
++    size_t size = resizeGrid.width * resizeGrid.height * 4;
++    size_t errCount = 0;
++    for (size_t i = 0; i < size; i++) {
++        if (lscGridRGGB[i] < 1.0f) {
++            lscGridRGGB[i] = 1.0f;
++            errCount++;
++        }
++    }
++    if (errCount) {
++        LOGW("Error - SA produced too small values (%d/%d)!", errCount, size);
++    }
++
++    float *lsm = (mShadingMode != SHADING_MODE_OFF) ? lscGridRGGB : mLscOffGrid;
++    for (size_t i = 0; i < size; i++) {
++        lensShadingMap[i] = lsm[i];
++    }
++
++    return OK;
++}
++
++int AiqCore::runSa(ia_aiq_sa_results_v1 *saResults,
++                   ia_aiq_awb_results *awbResults,
++                   float *lensShadingMap) {
++    LOG3A("%s, saResults:%p, awbResults:%p, lensShadingMap:%p", __func__,
++          saResults, awbResults, lensShadingMap);
++    CheckError(!saResults || !awbResults || !lensShadingMap, BAD_VALUE,
++               "@%s, Bad input values", __func__);
++
++    PERF_CAMERA_ATRACE();
++    int ret = OK;
++    ia_aiq_sa_results_v1 *newSaResults = nullptr;
++
++    mSaParams.awb_results = awbResults;
++
++    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
++    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->saRunV2", 1);
++        ia_err iaErr = intelAiq->saRunV2(&mSaParams, &newSaResults);
++        ret = AiqUtils::convertError(iaErr);
++        CheckError(ret != OK || !newSaResults, ret, "intelAiq->saRunV2 fails, ret: %d", ret);
++    }
++
++    dumpSaResult(newSaResults);
++    ret = AiqUtils::deepCopySaResults(*newSaResults, saResults);
++    CheckError(ret != OK, ret, "Error deepCopySaResults, ret: %d", ret);
++
++    return processSAResults(saResults, lensShadingMap);
++}
++
++int AiqCore::dumpPaResult(const ia_aiq_pa_results_v1 *paResult) {
++    LOG3A("%s, paResult:%p", __func__, paResult);
++    CheckError(!paResult, BAD_VALUE, "@%s, paResult is nullptr", __func__);
++
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
++
++    LOG3A("   PA results brightness %f saturation %f",
++          paResult->brightness_level,
++          paResult->saturation_factor);
++    LOG3A("   PA results black level row 0: %f %f %f  %f ",
++          paResult->black_level_4x4[0][0],
++          paResult->black_level_4x4[0][1],
++          paResult->black_level_4x4[0][2],
++          paResult->black_level_4x4[0][3]);
++    LOG3A("   PA results black level row 1: %f %f %f  %f ",
++          paResult->black_level_4x4[1][0],
++          paResult->black_level_4x4[1][1],
++          paResult->black_level_4x4[1][2],
++          paResult->black_level_4x4[1][3]);
++    LOG3A("   PA results black level row 2: %f %f %f  %f ",
++          paResult->black_level_4x4[2][0],
++          paResult->black_level_4x4[2][1],
++          paResult->black_level_4x4[2][2],
++          paResult->black_level_4x4[2][3]);
++    LOG3A("   PA results black level row 3: %f %f %f  %f ",
++          paResult->black_level_4x4[3][0],
++          paResult->black_level_4x4[3][1],
++          paResult->black_level_4x4[3][2],
++          paResult->black_level_4x4[3][3]);
++    LOG3A("   PA results color gains %f %f %f  %f ",
++          paResult->color_gains.r,
++          paResult->color_gains.gr,
++          paResult->color_gains.gb,
++          paResult->color_gains.b);
++    LOG3A("   PA results linearization table size %d",
++          paResult->linearization.size);
++
++    for (int i = 0; i < 3; i++) {
++        LOG3A("   PA results color matrix  [%.3f %.3f %.3f] ",
++              paResult->color_conversion_matrix[i][0],
++              paResult->color_conversion_matrix[i][1],
++              paResult->color_conversion_matrix[i][2]);
++    }
++
++    if (paResult->preferred_acm) {
++        LOG3A("   PA results advanced ccm sector count %d ",
++              paResult->preferred_acm->sector_count);
++    }
++    if (paResult->ir_weight) {
++        LOG3A("   PA results ir weight grid [ %d x %d ] ",
++              paResult->ir_weight->width, paResult->ir_weight->height);
++    }
++
++    return OK;
++}
++
++int AiqCore::dumpSaResult(const ia_aiq_sa_results_v1 *saResult) {
++    LOG3A("%s, saResult:%p", __func__, saResult);
++    CheckError(!saResult, BAD_VALUE, "@%s, saResult is nullptr", __func__);
++
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
++
++    LOG3A("   SA results lsc Update %d size %dx%d",
++          saResult->lsc_update, saResult->width,  saResult->height);
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.h b/camera/hal/intel/ipu6/src/3a/AiqCore.h
+new file mode 100644
+index 000000000000..931c4f7e1b65
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqCore.h
+@@ -0,0 +1,214 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "ia_aiq.h"
++#include "ia_ltm.h"
++#include "ia_cmc_types.h"
++#ifndef ENABLE_SANDBOXING
++#include "ia_log.h"
++#endif
++
++#include "AiqSetting.h"
++#include "AiqResult.h"
++
++#include "Intel3AParameter.h"
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelAiq.h"
++#else
++#include "modules/algowrapper/IntelAiq.h"
++#endif
++
++namespace icamera {
++
++/*
++ * \class AiqCore
++ * This class is used to set parameter, statistics and run Ae,
++ * Af, Awb, Gbce, Pa, Sa.
++ */
++class AiqCore {
++
++public:
++    AiqCore(int cameraId);
++    ~AiqCore();
++
++    /**
++     * \brief AiqCore init
++     *
++     * Init AiqPlus and AAAObject
++     */
++    int init();
++
++    /**
++     * \brief AiqCore deinit
++     *
++     * Deinit AiqPlus and AAAObject
++     */
++    int deinit();
++
++    /**
++     * \brief AiqCore configure
++     *
++     * Configure AiqPlus ConfigMode
++     */
++    int configure(const std::vector<ConfigMode>& configModes);
++
++    /**
++     * \brief Set sensor and frame info
++     *
++     * \param frameParams: the frame info parameter
++     * \param descriptor: the sensor info parameter
++     */
++    int setSensorInfo(const ia_aiq_frame_params &frameParams,
++                      const ia_aiq_exposure_sensor_descriptor &descriptor);
++
++    /**
++     * \brief update param and set converge speed
++     *
++     * \param param: the parameter update to AiqPlus and Aiq3A or custom 3A
++     */
++    int updateParameter(const aiq_parameter_t &param);
++
++    /**
++     * \brief Set ispStatistics to AiqPlus and Aiq3A or custom 3A
++     */
++    int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics);
++
++    /**
++     * \brief run 3A and AiqPlus
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int runAiq(AiqResult *aiqResult);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(AiqCore);
++
++    // LSC data
++    typedef struct ColorOrder {
++        uint8_t r[2];
++        uint8_t gr[2];
++        uint8_t gb[2];
++        uint8_t b[2];
++    } ColorOrder;
++
++    class LSCGrid {
++     public: /* this was a struct: class just to satisfy a static code scanner */
++        uint16_t width;
++        uint16_t height;
++        uint16_t *gridR;
++        uint16_t *gridGr;
++        uint16_t *gridGb;
++        uint16_t *gridB;
++
++        bool isBad() const {
++            return (gridB == NULL || gridGb == NULL || gridR == NULL ||
++                    gridGr == NULL || width == 0 || height == 0);
++        }
++        LSCGrid(): width(0), height(0), gridR(NULL), gridGr(NULL),
++            gridGb(NULL), gridB(NULL) {}
++    };
++
++    int run3A(AiqResult *aiqResult);
++    int runAiqPlus(AiqResult *aiqResult);
++    int runAe(ia_aiq_ae_results* aeResults);
++    int runAf(AiqResult *aiqResult);
++    void focusDistanceResult(const ia_aiq_af_results *afResults,
++                             float *afDistanceDiopters,
++                             camera_range_t *focusRange);
++    int runAwb(ia_aiq_awb_results* awbResults);
++    int runGbce(ia_aiq_gbce_results *gbceResults);
++    int runPa(ia_aiq_pa_results_v1 *paResults,
++              ia_aiq_awb_results *awbResults,
++              ia_aiq_exposure_parameters *exposureParams,
++              ia_aiq_advanced_ccm_t *preferredAcm);
++    int runSa(ia_aiq_sa_results_v1 *saResults,
++              ia_aiq_awb_results *awbResults,
++              float *lensShadingMap);
++    int processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap);
++    int checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder);
++    int storeLensShadingMap(const LSCGrid &inputLscGrid,
++                            const LSCGrid &resizeLscGrid, float *dstLscGridRGGB);
++    int reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB);
++
++    int calculateHyperfocalDistance(TuningMode mode);
++    int calculateDepthOfField(const ia_aiq_af_results &afResults, camera_range_t *focusRange);
++    int initAiqPlusParams();
++    int initIntelAiqHandle(const std::vector<TuningMode>& tuningModes);
++    void deinitIntelAiqHandle(void);
++    // debug dumpers
++    int dumpPaResult(const ia_aiq_pa_results_v1* paResult);
++    int dumpSaResult(const ia_aiq_sa_results_v1* saResult);
++
++private:
++    int mCameraId;
++    unsigned long long mTimestamp;  // Latest statistics timestamp
++    float mSensorPixelClock;
++
++    bool mAeForceLock;
++    bool mAwbForceLock;
++    bool mAfForceLock;
++
++    std::unique_ptr<Intel3AParameter> mIntel3AParameter;
++
++    // Original AeResult class arrays are kept in 3a engine which is safely used here.
++    ia_aiq_ae_results *mLastAeResult;
++    ia_aiq_awb_results *mLastAwbResult;
++    ia_aiq_af_results *mLastAfResult;
++
++    int mAeRunTime;
++    int mAwbRunTime;
++
++    IntelAiq *mIntelAiqHandle[TUNING_MODE_MAX];
++    bool mIntelAiqHandleStatus[TUNING_MODE_MAX];
++
++    enum AiqState {
++        AIQ_NOT_INIT = 0,
++        AIQ_INIT,
++        AIQ_CONFIGURED,
++        AIQ_MAX
++    } mAiqState;
++
++    ia_aiq_frame_params mFrameParams;
++
++    ia_aiq_gbce_input_params mGbceParams;
++    ia_aiq_pa_input_params mPaParams;
++    ia_aiq_color_channels mPaColorGains;
++    ia_aiq_sa_input_params_v1 mSaParams;
++
++    bool mUseManualColorMatrix;
++    camera_color_transform_t mColorMatrix;
++    camera_color_gains_t mColorGains;
++    float mHyperFocalDistance;  // in millimeters
++
++    TuningMode mTuningMode;
++    camera_shading_mode_t mShadingMode;
++    camera_lens_shading_map_mode_type_t mLensShadingMapMode;
++    camera_coordinate_t mLensShadingMapSize;
++    uint16_t mResizeLscGridR[DEFAULT_LSC_GRID_SIZE];
++    uint16_t mResizeLscGridGr[DEFAULT_LSC_GRID_SIZE];
++    uint16_t mResizeLscGridGb[DEFAULT_LSC_GRID_SIZE];
++    uint16_t mResizeLscGridB[DEFAULT_LSC_GRID_SIZE];
++    float mLscOffGrid[DEFAULT_LSC_GRID_SIZE * 4];
++    float mLastEvShift;
++
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
+new file mode 100644
+index 000000000000..8fe8efcc4f71
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
+@@ -0,0 +1,522 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqEngine"
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++#include "PlatformData.h"
++#include "AiqEngine.h"
++#include "FaceDetection.h"
++
++namespace icamera {
++
++AiqEngine::AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting) :
++    mCameraId(cameraId),
++    mAiqSetting(setting),
++    mFirstAiqRunning(true),
++    mFirstExposureSetting(true),
++    mAiqRunningForPerframe(false),
++    m3ACadenceSequence(0),
++    mLastStatsSequence(-1)
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    CLEAR(mRgbsGridArray);
++    CLEAR(mAfGridArray);
++
++    mAiqCore = new AiqCore(mCameraId);
++
++    mSensorManager = new SensorManager(mCameraId, sensorHw);
++
++    mLensManager = new LensManager(mCameraId, lensHw);
++
++    // Should consider better place to maintain the life cycle of AiqResultStorage
++    mAiqResultStorage = AiqResultStorage::getInstance(mCameraId);
++    mCurrentStatsSequence = 0;
++}
++
++AiqEngine::~AiqEngine()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    delete mLensManager;
++
++    delete mSensorManager;
++
++    delete mAiqCore;
++
++    AiqResultStorage::releaseAiqResultStorage(mCameraId);
++}
++
++int AiqEngine::init()
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    if (mAiqCore->init() != OK) {
++        return UNKNOWN_ERROR;
++    }
++
++    mSensorManager->init();
++
++    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
++    return OK;
++}
++
++int AiqEngine::deinit()
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    mSensorManager->deinit();
++
++    mAiqCore->deinit();
++
++    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
++    return OK;
++}
++
++int AiqEngine::configure(const std::vector<ConfigMode>& configModes)
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    mAiqCore->configure(configModes);
++
++    return OK;
++}
++
++int AiqEngine::startEngine()
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    mFirstAiqRunning = true;
++    mFirstExposureSetting = true;
++
++    mSensorManager->reset();
++
++    mLensManager->start();
++
++    m3ACadenceSequence = 0;
++
++    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
++
++    return OK;
++}
++
++int AiqEngine::stopEngine()
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
++
++    mLensManager->stop();
++
++    return OK;
++}
++
++int AiqEngine::run3A(long *settingSequence)
++{
++    LOG3A("%s", __func__);
++    // Run 3A in call thread
++    AutoMutex l(mEngineLock);
++
++    // Handle 3A cadence logic
++    int run3ACadence = mAiqParam.run3ACadence;
++    if (run3ACadence < 1) {
++        LOGW("Invalid 3A cadence %d, use default 1.", run3ACadence);
++        run3ACadence = 1;
++    }
++    LOG2("%s: run3ACadence is %d", __func__, run3ACadence);
++
++    if (m3ACadenceSequence % run3ACadence != 0) {
++        // Skip 3A per cadence
++        m3ACadenceSequence ++;
++        return OK;
++    }
++    LOG2("%s: run 3A for cadence sequence %ld", __func__, m3ACadenceSequence);
++    m3ACadenceSequence ++;
++
++    mAiqRunningForPerframe = (settingSequence != nullptr);
++    AiqState state = prepareInputParam();
++
++    AiqResult *aiqResult = mAiqResultStorage->acquireAiqResult();
++    aiqResult->mTuningMode = mAiqParam.tuningMode;
++
++    if (state == AIQ_STATE_RUN) {
++        state = runAiq(aiqResult);
++    }
++    if (state == AIQ_STATE_RESULT_SET) {
++        state = handleAiqResult(aiqResult);
++    }
++    if (state == AIQ_STATE_DONE) {
++        done(aiqResult);
++    }
++
++    mAiqResultStorage->unLockAiqStatistics();
++
++    if (settingSequence) {
++        *settingSequence = mAiqResultStorage->getAiqResult()->mSequence;
++        LOG3A("%s, sequence %ld, mLastStatsSequence %ld", __func__, *settingSequence,
++               mLastStatsSequence);
++    }
++
++    PlatformData::saveMakernoteData(mCameraId, mAiqParam.makernoteMode,
++                                    mAiqResultStorage->getAiqResult()->mSequence);
++
++    return (state == AIQ_STATE_DONE || state == AIQ_STATE_WAIT) ? 0 : UNKNOWN_ERROR;
++}
++
++EventListener *AiqEngine::getSofEventListener()
++{
++    AutoMutex l(mEngineLock);
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++
++    return mSensorManager->getSofEventListener();
++}
++
++int AiqEngine::saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst)
++{
++    LOG3A("%s", __func__);
++    if (afGrid == nullptr
++        || afGrid->filter_response_1 == nullptr
++        || afGrid->filter_response_2 == nullptr
++        || afGrid->grid_width == 0
++        || afGrid->grid_height == 0) {
++        LOGE("%s, af grids are invalid", __func__);
++        return BAD_VALUE;
++    }
++
++    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
++    if (afGrid->grid_width != dst->grid_width || afGrid->grid_height != dst->grid_height) {
++        if (dst->filter_response_1 != nullptr) {
++            delete [] dst->filter_response_1;
++        }
++        dst->filter_response_1 = new int[gridSize];
++        if (dst->filter_response_2 != nullptr) {
++            delete [] dst->filter_response_2;
++        }
++        dst->filter_response_2 = new int[gridSize];
++    }
++
++    dst->grid_width = afGrid->grid_width;
++    dst->grid_height = afGrid->grid_height;
++    dst->block_width = afGrid->block_width;
++    dst->block_height = afGrid->block_height;
++    MEMCPY_S(dst->filter_response_1, gridSize * sizeof(int),
++             afGrid->filter_response_1, gridSize * sizeof(int));
++    MEMCPY_S(dst->filter_response_2, gridSize * sizeof(int),
++             afGrid->filter_response_2, gridSize * sizeof(int));
++
++    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
++    return OK;
++}
++
++int AiqEngine::saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst)
++{
++    LOG3A("%s", __func__);
++    if (rgbsGrid == nullptr
++        || rgbsGrid->blocks_ptr == nullptr
++        || rgbsGrid->grid_width == 0
++        || rgbsGrid->grid_height == 0) {
++        LOGE("%s, rgbs grids are invalid", __func__);
++        return BAD_VALUE;
++    }
++
++    size_t gridSize = rgbsGrid->grid_width * rgbsGrid->grid_height;
++    if (rgbsGrid->grid_width != dst->grid_width || rgbsGrid->grid_height != dst->grid_height) {
++        if (dst->blocks_ptr != nullptr) {
++            delete [] dst->blocks_ptr;
++        }
++        dst->blocks_ptr = new rgbs_grid_block[gridSize];
++    }
++
++    dst->grid_width = rgbsGrid->grid_width;
++    dst->grid_height = rgbsGrid->grid_height;
++    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
++             rgbsGrid->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
++
++    dst->shading_correction = rgbsGrid->shading_correction;
++
++    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
++    return OK;
++}
++
++int AiqEngine::prepareStats(ia_aiq_statistics_input_params_v4 *statsParam,
++                            ia_aiq_gbce_results *gbceResults,
++                            AiqStatistics *aiqStatistics)
++{
++    mLastStatsSequence = aiqStatistics->mSequence;
++    LOG3A("%s, sequence %ld", __func__, aiqStatistics->mSequence);
++
++    statsParam->rgbs_grids = mRgbsGridArray;
++    statsParam->af_grids = mAfGridArray;
++
++    int ret = OK;
++    do {
++
++        // The statistics timestamp is incorrect. If possible, use SOF timestamp instead.
++        unsigned long long timestamp = mSensorManager->getSofTimestamp(aiqStatistics->mSequence);
++        if (timestamp == 0) {
++            LOG2("The sof sequence was not found %ld", aiqStatistics->mSequence);
++            timestamp = aiqStatistics->mTimestamp;
++        }
++
++        statsParam->frame_id = aiqStatistics->mSequence;
++        statsParam->frame_timestamp = timestamp;
++        statsParam->num_rgbs_grids = PlatformData::getExposureNum(mCameraId,
++                                         CameraUtils::isMultiExposureCase(mAiqParam.tuningMode));
++
++        if (statsParam->num_rgbs_grids > 1) {
++            for (unsigned int i = 0; i < statsParam->num_rgbs_grids; i++) {
++                statsParam->rgbs_grids[i] = &(aiqStatistics->mRgbsGridArray[i]);
++            }
++        } else {
++            statsParam->rgbs_grids[0] = &(aiqStatistics->mRgbsGridArray[0]);
++        }
++        statsParam->af_grids[0] = &(aiqStatistics->mAfGridArray[0]);
++        statsParam->num_af_grids = 1;
++        statsParam->external_histograms = nullptr;
++        statsParam->num_external_histograms = 0;
++        statsParam->camera_orientation = ia_aiq_camera_orientation_unknown;
++
++        const AiqResult *feedback = mAiqResultStorage->getAiqResult(aiqStatistics->mSequence);
++        if (feedback == nullptr) {
++            LOGW("%s: no feed back result for sequence %ld! use the latest instead",
++                    __func__, aiqStatistics->mSequence);
++            feedback = mAiqResultStorage->getAiqResult();
++        }
++
++        statsParam->frame_ae_parameters = &feedback->mAeResults;
++        statsParam->frame_af_parameters = &feedback->mAfResults;
++        statsParam->frame_pa_parameters = &feedback->mPaResults;
++        statsParam->awb_results = &feedback->mAwbResults;
++        statsParam->frame_sa_parameters = &feedback->mSaResults;
++
++        *gbceResults = feedback->mGbceResults;
++    } while (0);
++    LOG3A("%s end", __func__);
++    return ret;
++}
++
++void AiqEngine::setAiqResult(AiqResult *aiqResult, bool skip)
++{
++    SensorExpGroup sensorExposures;
++    for (unsigned int i = 0; i < aiqResult->mAeResults.num_exposures; i++) {
++        SensorExposure exposure;
++        exposure.sensorParam = *aiqResult->mAeResults.exposures[i].sensor_exposure;
++        exposure.realDigitalGain = (aiqResult->mAeResults.exposures[i].exposure)->digital_gain;
++        sensorExposures.push_back(exposure);
++    }
++    bool useSof = !mFirstExposureSetting;
++    aiqResult->mSequence = mSensorManager->updateSensorExposure(sensorExposures, useSof);
++    if (mFirstExposureSetting) {
++        mFirstExposureSetting = false;
++    }
++    aiqResult->mSkip = skip;
++
++    if (skip) {
++        LOG3A("%s, skipping frame aiqResult->mSequence = %ld", __func__, aiqResult->mSequence);
++    }
++
++    mLensManager->setLensResult(aiqResult->mAeResults, aiqResult->mAfResults);
++
++    aiqResult->mAiqParam = mAiqParam;
++}
++
++int AiqEngine::getSkippingNum(AiqResult *aiqResult)
++{
++    LOG3A("%s", __func__);
++    int skipNum = 0;
++
++    if (!mFirstAiqRunning) {
++        const AiqResult *lastResult = mAiqResultStorage->getAiqResult();
++        if (lastResult->mTuningMode != aiqResult->mTuningMode) {
++            // Skip 3 frames when pipe switching
++            skipNum = 3;
++        }
++    } else if (mAiqRunningForPerframe) {
++        // The 1st result takes effect @ frame (initialSkip) (applied before stream on)
++        skipNum = PlatformData::getInitialSkipFrame(mCameraId);
++    }
++
++    return skipNum;
++}
++
++bool AiqEngine::needRun3A(AiqStatistics *aiqStatistics)
++{
++    LOG3A("%s", __func__);
++
++    // Force to run 3a for per-frame control case
++    if (mAiqRunningForPerframe) {
++        return true;
++    }
++
++    // Force to run 3a for the first time running
++    if (mFirstAiqRunning) {
++        return true;
++    }
++
++    if (aiqStatistics == nullptr) {
++        LOG3A("no stats and not need to re-run 3A");
++        return false;
++    }
++
++    if (mLastStatsSequence == aiqStatistics->mSequence) {
++        LOG3A("no new stats skip, mLastStatsSequence = %ld", mLastStatsSequence);
++        return false;
++    } else if (mSensorManager->getCurrentExposureAppliedDelay() > kMaxExposureAppliedDelay) {
++        LOG3A("exposure setting applied delay is too larger, skip it");
++        return false;
++    }
++
++    return true;
++}
++
++AiqEngine::AiqState AiqEngine::prepareInputParam(void)
++{
++    // set Aiq Params
++    int ret = mAiqSetting->getAiqParameter(mAiqParam);
++    if (ret != OK)
++        return AIQ_STATE_ERROR;
++
++    // Update sensor info for the first-run of AIQ
++    if (mFirstAiqRunning) {
++        mSensorManager->setFrameRate(mAiqParam.fps);
++        // set sensor info if needed
++        ia_aiq_exposure_sensor_descriptor sensorDescriptor;
++        ia_aiq_frame_params frameParams;
++        CLEAR(sensorDescriptor);
++        CLEAR(frameParams);
++        ret = mSensorManager->getSensorInfo(frameParams, sensorDescriptor);
++        CheckError((ret != OK), AIQ_STATE_ERROR, "Get sensor info failed:%d", ret);
++        mAiqCore->setSensorInfo(frameParams, sensorDescriptor);
++    }
++
++    // update lens related parameters
++    mLensManager->getLensInfo(mAiqParam);
++
++    mAiqCore->updateParameter(mAiqParam);
++    // set Stats
++    ia_aiq_statistics_input_params_v4 statsParam;
++    CLEAR(statsParam);
++    ia_aiq_gbce_results gbceResults;
++    CLEAR(gbceResults);
++
++    AiqStatistics *aiqStats =
++        const_cast<AiqStatistics*>(mAiqResultStorage->getAndLockAiqStatistics());
++
++    if (!needRun3A(aiqStats)) {
++        return AIQ_STATE_WAIT;
++    }
++
++    if (aiqStats == nullptr) {
++        LOG3A("%s: run aiq without stats data", __func__);
++        return AIQ_STATE_RUN;
++    }
++
++    // update face detection related parameters
++    ia_atbx_face faces[MAX_FACES_DETECTABLE];
++    ia_atbx_face_state facesState;
++    if (PlatformData::isFaceAeEnabled(mCameraId)) {
++        facesState.num_faces = 0;
++        facesState.faces = faces;
++        int ret = icamera::FaceDetection::getResult(mCameraId, &facesState);
++        if (ret == OK && facesState.num_faces > 0) {
++            ia_rectangle rect = facesState.faces[0].face_area;
++            LOG3A("@%s, face number:%d, left:%d, top:%d, right:%d, bottom:%d", __func__,
++                   facesState.num_faces, rect.left, rect.top, rect.right, rect.bottom);
++            statsParam.faces = &facesState;
++        }
++    }
++
++    ret = prepareStats(&statsParam, &gbceResults, aiqStats);
++
++    if (ret != OK) {
++        LOG3A("%s: no useful stats", __func__);
++        return AIQ_STATE_RUN;
++    }
++
++    mAiqCore->setStatistics(&statsParam);
++
++    return AIQ_STATE_RUN;
++}
++
++AiqEngine::AiqState AiqEngine::runAiq(AiqResult *aiqResult)
++{
++    int ret = mAiqCore->runAiq(aiqResult);
++    if (ret != OK) {
++        return AIQ_STATE_ERROR;
++    }
++
++    return AIQ_STATE_RESULT_SET;
++}
++
++AiqEngine::AiqState AiqEngine::handleAiqResult(AiqResult *aiqResult)
++{
++    LOG2("%s: aiqResult->mTuningMode = %d", __func__, aiqResult->mTuningMode);
++
++    applyManualTonemaps(aiqResult);
++
++    return AIQ_STATE_DONE;
++}
++
++int AiqEngine::applyManualTonemaps(AiqResult *aiqResult)
++{
++    /*
++     * Normal use-case is the automatic modes, and we need not do anything here
++     */
++    if (mAiqParam.tonemapMode == TONEMAP_MODE_FAST ||
++        mAiqParam.tonemapMode == TONEMAP_MODE_HIGH_QUALITY) {
++        return OK;
++    }
++
++    if (mAiqParam.tonemapMode == TONEMAP_MODE_GAMMA_VALUE) {
++        AiqUtils::applyTonemapGamma(mAiqParam.tonemapGamma, &aiqResult->mGbceResults);
++    } else if (mAiqParam.tonemapMode == TONEMAP_MODE_PRESET_CURVE) {
++        if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_SRGB) {
++            AiqUtils::applyTonemapSRGB(&aiqResult->mGbceResults);
++        } else if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_REC709) {
++            AiqUtils::applyTonemapREC709(&aiqResult->mGbceResults);
++        }
++    }
++    return OK;
++}
++
++AiqEngine::AiqState AiqEngine::done(AiqResult *aiqResult)
++{
++    int skipNum = getSkippingNum(aiqResult);
++    AiqResult *tmp = aiqResult;
++
++    for (int i = 0; i < skipNum; i++) {
++        // Increase the sensor settings sequence id, so for any frame that
++        // its sequence id is bigger than the user expected id will be discarded.
++        setAiqResult(tmp, true);
++        mAiqResultStorage->updateAiqResult(tmp->mSequence);
++        tmp = mAiqResultStorage->acquireAiqResult();
++        *tmp = *aiqResult;
++    }
++
++    setAiqResult(tmp, false);
++    mAiqResultStorage->updateAiqResult(tmp->mSequence);
++
++    mFirstAiqRunning = false;
++    return AIQ_STATE_WAIT;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.h b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
+new file mode 100644
+index 000000000000..d4ce931e337d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
+@@ -0,0 +1,149 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "AiqSetting.h"
++#include "AiqCore.h"
++#include "AiqResult.h"
++#include "AiqStatistics.h"
++#include "AiqResultStorage.h"
++#include "SensorManager.h"
++#include "LensManager.h"
++
++namespace icamera {
++
++/*
++ * \class AiqEngine
++ * This class is used to parse Stats, control \class AiqEngine
++ * This class is used to parse Stats, control running AIQ algorithms
++ * and set result to HW layer.
++ * This is sub thread class.
++ */
++class AiqEngine {
++
++public:
++    AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting);
++    ~AiqEngine();
++
++    /**
++     * \brief Init AiqResult, AiqCore and SensorManager
++     */
++    int init();
++
++    /**
++     * \brief Deinit AiqResult, AiqCore and SensorManager
++     */
++    int deinit();
++
++    /**
++     * \brief configure with ConfigMode
++     */
++    int configure(const std::vector<ConfigMode>& configModes);
++
++    /**
++     * \brief Calculate and set frame and sensor info, and run 3a with default setting.
++     */
++    int startEngine();
++
++    /**
++     * \brief Run 3a to get new 3a settings.
++     * Return 0 if the operation succeeds, and output settingSequence to
++     * indicate the frame that settings are applied.
++     * settingSequence -1 means uncertain frame for this settings.
++     */
++    int run3A(long *settingSequence);
++
++    /**
++     * \brief Stop 3a thrad and LensManager.
++     */
++    int stopEngine();
++
++    /**
++     * \brief Get software EventListener
++     */
++    EventListener *getSofEventListener();
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(AiqEngine);
++
++    int saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst);
++    int saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst);
++
++    int prepareStats(ia_aiq_statistics_input_params_v4 *statsParami,
++                     ia_aiq_gbce_results *gbceResults,
++                     AiqStatistics *aiqStatistics);
++
++    void setAiqResult(AiqResult *aiqResult, bool skip);
++
++    int getSkippingNum(AiqResult *aiqResult);
++
++    bool needRun3A(AiqStatistics *aiqStatistics);
++
++    enum AiqState {
++        AIQ_STATE_IDLE = 0,
++        AIQ_STATE_WAIT,
++        AIQ_STATE_INPUT_PREPARE,
++        AIQ_STATE_RUN,
++        AIQ_STATE_RESULT_SET,
++        AIQ_STATE_DONE,
++        AIQ_STATE_ERROR,
++        AIQ_STATE_MAX
++    };
++
++    AiqState prepareInputParam(void);
++    AiqState runAiq(AiqResult *aiqResult);
++    AiqState handleAiqResult(AiqResult *aiqResult);
++    AiqState done(AiqResult *aiqResult);
++
++    int run();
++
++    // For manual ISP settings
++    int applyManualTonemaps(AiqResult *aiqResult);
++
++private:
++    static const nsecs_t kWaitDuration = 1000000000; //1000ms
++    static const int kMaxStatisticsDataSize = 3;
++    static const int kMaxExposureAppliedDelay = 5;
++
++private:
++    int mCameraId;
++    AiqResultStorage* mAiqResultStorage;
++    AiqSetting *mAiqSetting;
++    AiqCore *mAiqCore;
++    SensorManager *mSensorManager;
++    LensManager *mLensManager;
++    bool mFirstAiqRunning;
++    bool mFirstExposureSetting;
++    bool mAiqRunningForPerframe;
++
++    // Guard for public API of AiqEngine.
++    Mutex mEngineLock;
++    Condition mStatsAvailableSignal;
++
++    uint32_t mCurrentStatsSequence;
++
++    const ia_aiq_rgbs_grid* mRgbsGridArray[MAX_EXPOSURES_NUM];
++    const ia_aiq_af_grid* mAfGridArray[MAX_EXPOSURES_NUM];
++
++    aiq_parameter_t mAiqParam;
++
++    long m3ACadenceSequence;
++    long mLastStatsSequence;
++};
++
++} /* namespace icamera */
++
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.cpp b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
+new file mode 100644
+index 000000000000..d67b1f1a54e1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
+@@ -0,0 +1,182 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqResult"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "AiqResult.h"
++
++namespace icamera {
++
++AiqResult::AiqResult(int cameraId) :
++    mCameraId(cameraId),
++    mTimestamp(0),
++    mSequence(-1),
++    mTuningMode(TUNING_MODE_VIDEO),
++    mAfDistanceDiopters(0.0f),
++    mSkip(false),
++    mFrameDuration(0),
++    mRollingShutter(0)
++{
++    LOG3A("@%s", __func__);
++
++    CLEAR(mGrid);
++    CLEAR(mFlashes);
++    CLEAR(mRGammaLut);
++    CLEAR(mGGammaLut);
++    CLEAR(mBGammaLut);
++    CLEAR(mToneMapLut);
++    CLEAR(mHueSectors);
++    CLEAR(mAdvancedCCM);
++    CLEAR(mIrWeightGridR);
++    CLEAR(mIrWeightGridG);
++    CLEAR(mIrWeightGridB);
++    CLEAR(mCustomControls);
++    CLEAR(mCustomControlsParams);
++    CLEAR(mSaResults);
++    CLEAR(mAwbResults);
++    CLEAR(mIrWeight);
++    CLEAR(mApertureControl);
++    CLEAR(mGbceResults);
++    CLEAR(mWeightGrid);
++    CLEAR(mPreferredAcm);
++    CLEAR(mPaResults);
++    CLEAR(mAeResults);
++    CLEAR(mAfResults);
++    CLEAR(mFocusRange);
++}
++
++AiqResult::~AiqResult()
++{
++    LOG3A("@%s", __func__);
++    deinit();
++}
++
++int AiqResult::init()
++{
++    LOG3A("@%s", __func__);
++
++    CLEAR(mAeResults);
++    CLEAR(mAfResults);
++    CLEAR(mAwbResults);
++    CLEAR(mGbceResults);
++    CLEAR(mSaResults);
++    CLEAR(mPaResults);
++
++    CLEAR(mExposureResults);
++    CLEAR(mWeightGrid);
++    CLEAR(mGrid);
++    CLEAR(mFlashes);
++    CLEAR(mGenericExposure);
++    CLEAR(mSensorExposure);
++    CLEAR(mApertureControl);
++    CLEAR(mPreferredAcm);
++    CLEAR(mIrWeight);
++
++    mAiqParam.reset();
++
++    /*AE results init */
++    mAeResults.num_exposures = 1;
++    mAeResults.exposures = mExposureResults;
++    mAeResults.aperture_control = &mApertureControl;
++    mAeResults.weight_grid = &mWeightGrid;
++    mAeResults.weight_grid->weights = mGrid;
++    mAeResults.flashes = mFlashes;
++    for (unsigned int i = 0; i< MAX_EXPOSURES_NUM; i++) {
++        mAeResults.exposures[i].exposure = &mGenericExposure[i];
++        mAeResults.exposures[i].sensor_exposure = &mSensorExposure[i];
++    }
++    /* GBCE results init */
++    mGbceResults.r_gamma_lut = mRGammaLut;
++    mGbceResults.g_gamma_lut = mGGammaLut;
++    mGbceResults.b_gamma_lut = mBGammaLut;
++    mGbceResults.tone_map_lut = mToneMapLut;
++
++    /* SA results init */
++    mSaResults.width = MAX_LSC_WIDTH;
++    mSaResults.height = MAX_LSC_HEIGHT;
++
++    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
++        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
++            mSaResults.lsc_grid[i][j] = new unsigned short[MAX_LSC_WIDTH * MAX_LSC_HEIGHT];
++            memset(mSaResults.lsc_grid[i][j], 0,
++                   sizeof(unsigned short) * MAX_LSC_WIDTH * MAX_LSC_HEIGHT);
++        }
++    }
++
++    /* PA results init */
++    mPaResults.ir_weight = &mIrWeight;
++
++    mPaResults.ir_weight->ir_weight_grid_R = mIrWeightGridR;
++    mPaResults.ir_weight->ir_weight_grid_G = mIrWeightGridG;
++    mPaResults.ir_weight->ir_weight_grid_B = mIrWeightGridB;
++
++    mPreferredAcm.hue_of_sectors = mHueSectors;
++    mPreferredAcm.advanced_color_conversion_matrices = mAdvancedCCM;
++
++    /* Custom Controls init */
++    mCustomControls.parameters = mCustomControlsParams;
++
++    return OK;
++}
++
++int AiqResult::deinit()
++{
++    LOG3A("@%s", __func__);
++
++    for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
++        for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
++            delete []  mSaResults.lsc_grid[i][j];
++            mSaResults.lsc_grid[i][j] = nullptr;
++        }
++    }
++
++    return OK;
++}
++
++AiqResult &AiqResult::operator=(const AiqResult &other)
++{
++    deepCopyAiqResult(other, this);
++    mSequence = other.mSequence;
++    mTimestamp = other.mTimestamp;
++    mTuningMode = other.mTuningMode;
++    mSkip = other.mSkip;
++    mCustomControls.count = other.mCustomControls.count;
++    for (int i = 0; i < mCustomControls.count; i++) {
++        mCustomControlsParams[i] = other.mCustomControlsParams[i];
++    }
++    mAiqParam = other.mAiqParam;
++    mFrameDuration = other.mFrameDuration;
++    mRollingShutter = other.mRollingShutter;
++
++    return *this;
++}
++
++int AiqResult::deepCopyAiqResult(const AiqResult &src, AiqResult *dst)
++{
++    int ret = AiqUtils::deepCopyAeResults(src.mAeResults, &dst->mAeResults);
++    ret |= AiqUtils::deepCopyAfResults(src.mAfResults, &dst->mAfResults);
++    ret |= AiqUtils::deepCopyAwbResults(src.mAwbResults, &dst->mAwbResults);
++    ret |= AiqUtils::deepCopyGbceResults(src.mGbceResults, &dst->mGbceResults);
++    ret |= AiqUtils::deepCopyPaResults(src.mPaResults, &dst->mPaResults, &dst->mPreferredAcm);
++    ret |= AiqUtils::deepCopySaResults(src.mSaResults, &dst->mSaResults);
++
++    return ret;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.h b/camera/hal/intel/ipu6/src/3a/AiqResult.h
+new file mode 100644
+index 000000000000..e9e117e89218
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqResult.h
+@@ -0,0 +1,109 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_aiq.h"
++#include "ia_ltm.h"
++#include "ia_isp_types.h"
++
++#include "AiqUtils.h"
++#include "AiqSetting.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++/**
++ * \class AiqResult
++ * The private structs are part of AE, AF, AWB, PA and SA results.
++ * They need to be separately introduced to store the contents of the results
++ * that the AIQ algorithms return as pointers.
++ * Then we can do deep copy of the results
++ */
++class AiqResult {
++
++public:
++    AiqResult(int cameraId);
++    ~AiqResult();
++
++    int init();
++    int deinit();
++
++    AiqResult& operator=(const AiqResult& other);
++
++private:
++    int deepCopyAiqResult(const AiqResult &src, AiqResult *dst);
++
++public:
++    int mCameraId;
++    unsigned long long mTimestamp;
++    long mSequence;
++    TuningMode mTuningMode;
++    float mAfDistanceDiopters;
++    bool mSkip;
++    camera_range_t mFocusRange;
++
++    ia_aiq_ae_results mAeResults;
++    ia_aiq_awb_results mAwbResults;
++    ia_aiq_af_results mAfResults;
++    ia_aiq_gbce_results mGbceResults;
++    ia_aiq_pa_results_v1 mPaResults;
++    ia_aiq_sa_results_v1 mSaResults;
++
++    ia_aiq_advanced_ccm_t mPreferredAcm;
++
++    ia_isp_custom_controls mCustomControls;
++
++    aiq_parameter_t mAiqParam;
++
++    int64_t mFrameDuration;   // us
++    int64_t mRollingShutter;  // us
++
++private:
++    /*!< ia_aiq_ae_results pointer contents */
++    ia_aiq_ae_exposure_result mExposureResults[MAX_EXPOSURES_NUM];
++    ia_aiq_aperture_control   mApertureControl;
++    ia_aiq_hist_weight_grid   mWeightGrid;
++    unsigned char mGrid[MAX_AE_GRID_SIZE];
++    ia_aiq_flash_parameters   mFlashes[NUM_FLASH_LEDS];
++
++    /*!< ia_aiq_ae_exposure_result pointer contents */
++    ia_aiq_exposure_parameters        mGenericExposure[MAX_EXPOSURES_NUM];
++    ia_aiq_exposure_sensor_parameters mSensorExposure[MAX_EXPOSURES_NUM];
++
++    /*!< ia_aiq_gbce results */
++    /* The actual size of this table can be calculated by running cold
++     * GBCE, it will provide those tables.
++     */
++    float mRGammaLut[MAX_GAMMA_LUT_SIZE];
++    float mGGammaLut[MAX_GAMMA_LUT_SIZE];
++    float mBGammaLut[MAX_GAMMA_LUT_SIZE];
++    float mToneMapLut[MAX_TONEMAP_LUT_SIZE];
++
++    /*!< ia_aiq_pa_results pointer content */
++    unsigned int mHueSectors[MAX_NUM_SECTORS];
++    float mAdvancedCCM[MAX_NUM_SECTORS][3][3];
++    ia_aiq_ir_weight_t mIrWeight;
++    unsigned short mIrWeightGridR[MAX_IR_WEIGHT_GRID_SIZE];
++    unsigned short mIrWeightGridG[MAX_IR_WEIGHT_GRID_SIZE];
++    unsigned short mIrWeightGridB[MAX_IR_WEIGHT_GRID_SIZE];
++
++    /*!< ia_isp_custom_controls pointer content */
++    float mCustomControlsParams[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
++
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
+new file mode 100644
+index 000000000000..5d98a639c3c4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
+@@ -0,0 +1,286 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqResultStorage"
++
++#include "AiqResultStorage.h"
++
++#include "iutils/CameraLog.h"
++
++namespace icamera {
++
++std::map<int, AiqResultStorage*> AiqResultStorage::sInstances;
++Mutex AiqResultStorage::sLock;
++
++AiqResultStorage* AiqResultStorage::getInstance(int cameraId)
++{
++    AutoMutex lock(sLock);
++    return getInstanceLocked(cameraId);
++}
++
++void AiqResultStorage::releaseAiqResultStorage(int cameraId)
++{
++    AutoMutex lock(sLock);
++    AiqResultStorage* storage = getInstanceLocked(cameraId);
++    sInstances.erase(cameraId);
++    delete storage;
++}
++
++AiqResultStorage::AiqResultStorage(int cameraId) :
++    mCameraId(cameraId)
++{
++    LOG1("AiqResultStorage created for id:%d", mCameraId);
++
++    for (int i = 0; i < kStorageSize; i++) {
++        mAiqResults[i] = new AiqResult(mCameraId);
++        mAiqResults[i]->init();
++    }
++    // INTEL_DVS_S
++    for (int i = 0; i < kDvsStorageSize; i++) {
++        mDvsResults[i] = new DvsResult();
++    }
++    // INTEL_DVS_E
++    // LOCAL_TONEMAP_S
++    for (int i = 0; i < kLtmStorageSize; i++) {
++        mLtmResults[i] = new ltm_result_t;
++    }
++    // LOCAL_TONEMAP_E
++}
++
++AiqResultStorage::~AiqResultStorage()
++{
++    LOG1("AiqResultStorage released for id:%d", mCameraId);
++
++    for (int i = 0; i < kStorageSize; i++) {
++        delete mAiqResults[i];
++    }
++    // INTEL_DVS_S
++    for (int i = 0; i < kDvsStorageSize; i++) {
++        delete mDvsResults[i];
++    }
++    // INTEL_DVS_E
++    // LOCAL_TONEMAP_S
++    for (int i = 0; i < kLtmStorageSize; i++) {
++        delete mLtmResults[i];
++    }
++    // LOCAL_TONEMAP_E
++}
++
++// LOCAL_TONEMAP_S
++ltm_result_t* AiqResultStorage::acquireLtmResult()
++{
++    AutoWMutex rlock(mDataLock);
++
++    int index = mCurrentLtmIndex + 1;
++    index %= kLtmStorageSize;
++
++    mLtmResults[index]->sequence = -1;
++
++    return mLtmResults[index];
++}
++
++void AiqResultStorage::updateLtmResult(long sequence)
++{
++    AutoWMutex wlock(mDataLock);
++
++    mCurrentLtmIndex++;
++    mCurrentLtmIndex %= kLtmStorageSize;
++
++    mLtmResults[mCurrentLtmIndex]->sequence = sequence;
++}
++
++const ltm_result_t* AiqResultStorage::getLtmResult(long sequence)
++{
++    AutoRMutex rlock(mDataLock);
++
++    if (mCurrentLtmIndex == -1)
++        return nullptr;
++
++    // Sequence is -1 means to get the latest result
++    if (sequence == -1) {
++        return mLtmResults[mCurrentLtmIndex];
++    }
++
++    // Try to find the matched result
++    for (int i = 0; i < kLtmStorageSize; i++) {
++        int tmpIdx = (mCurrentLtmIndex + kLtmStorageSize - i) % kLtmStorageSize;
++        if (mLtmResults[tmpIdx]->sequence >= 0 && sequence >= mLtmResults[tmpIdx]->sequence) {
++            LOG2("%s, find the ltm result (expect: %ld actual: %ld)",
++                    __func__, sequence, mLtmResults[tmpIdx]->sequence);
++            return mLtmResults[tmpIdx];
++        }
++    }
++
++    return nullptr;
++}
++// LOCAL_TONEMAP_E
++
++// INTEL_DVS_S
++DvsResult* AiqResultStorage::acquireDvsResult()
++{
++    AutoWMutex rlock(mDataLock);
++
++    int index = mCurrentDvsIndex + 1;
++    index %= kDvsStorageSize;
++
++    mDvsResults[index]->mSequence = -1;
++
++    return mDvsResults[index];
++}
++
++void AiqResultStorage::updateDvsResult(long sequence)
++{
++    AutoWMutex wlock(mDataLock);
++
++    mCurrentDvsIndex++;
++    mCurrentDvsIndex %= kDvsStorageSize;
++
++    mDvsResults[mCurrentDvsIndex]->mSequence = sequence;
++}
++
++const DvsResult* AiqResultStorage::getDvsResult(long sequence)
++{
++    AutoRMutex rlock(mDataLock);
++
++    if (mCurrentDvsIndex == -1)
++        return nullptr;
++
++    CheckError(mDvsResults[mCurrentDvsIndex]->mSequence == -1, nullptr, "invalid sequence id -1");
++
++    if (sequence == -1)
++        return mDvsResults[mCurrentDvsIndex];
++
++    // Try to find the matched result
++    for (int i = 0; i < kDvsStorageSize; i++) {
++        int tmpIdx = (mCurrentDvsIndex + kDvsStorageSize - i) % kDvsStorageSize;
++        if (mDvsResults[tmpIdx]->mSequence >= 0 && sequence >= mDvsResults[tmpIdx]->mSequence) {
++            LOG2("%s, find the DVS result (expect: %ld actual: %ld)",
++                    __func__, sequence, mDvsResults[tmpIdx]->mSequence);
++            return mDvsResults[tmpIdx];
++        }
++    }
++
++    return nullptr;
++}
++// INTEL_DVS_E
++
++AiqStatistics* AiqResultStorage::acquireAiqStatistics()
++{
++    AutoWMutex rlock(mDataLock);
++
++    int index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
++    if (mAiqStatistics[index].mInUse) {
++        // The "next" storage is still in use, skip it.
++        mCurrentAiqStatsIndex = index;
++        index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
++    }
++
++    mAiqStatistics[index].mSequence = -1;
++
++    return &mAiqStatistics[index];
++}
++
++void AiqResultStorage::updateAiqStatistics(long sequence)
++{
++    AutoWMutex wlock(mDataLock);
++
++    mCurrentAiqStatsIndex++;
++    mCurrentAiqStatsIndex %= kAiqStatsStorageSize;
++
++    mAiqStatistics[mCurrentAiqStatsIndex].mSequence = sequence;
++}
++
++const AiqStatistics* AiqResultStorage::getAndLockAiqStatistics()
++{
++    AutoRMutex rlock(mDataLock);
++
++    if (mCurrentAiqStatsIndex == -1)
++        return nullptr;
++
++    CheckError(mAiqStatistics[mCurrentAiqStatsIndex].mSequence == -1,
++          nullptr, "Invalid sequence id -1 of stored aiq statistics");
++
++    mAiqStatistics[mCurrentAiqStatsIndex].mInUse = true;
++    return &mAiqStatistics[mCurrentAiqStatsIndex];
++}
++
++void AiqResultStorage::unLockAiqStatistics()
++{
++    AutoRMutex rlock(mDataLock);
++    for (int i = 0; i < kAiqStatsStorageSize; i++) {
++        mAiqStatistics[i].mInUse = false;
++    }
++}
++
++AiqResult* AiqResultStorage::acquireAiqResult()
++{
++    AutoWMutex rlock(mDataLock);
++
++    int index = mCurrentIndex + 1;
++    index %= kStorageSize;
++
++    mAiqResults[index]->mSequence = -1;
++
++    return mAiqResults[index];
++}
++
++void AiqResultStorage::updateAiqResult(long sequence)
++{
++    AutoWMutex wlock(mDataLock);
++
++    mCurrentIndex++;
++    mCurrentIndex %= kStorageSize;
++
++    mAiqResults[mCurrentIndex]->mSequence = sequence;
++}
++
++const AiqResult* AiqResultStorage::getAiqResult(long sequence)
++{
++    AutoRMutex rlock(mDataLock);
++
++    // Sequence id is -1 means user wants get the latest result.
++    if (sequence == -1) {
++        // If mCurrentIndex is -1, that means no result is saved to the storage yet,
++        // just return the first one in this case.
++        return mAiqResults[(mCurrentIndex == -1) ? 0 : mCurrentIndex];
++    }
++
++    for (int i = 0; i < kStorageSize; i++) {
++        // Search from the newest result
++        int tmpIdx = (mCurrentIndex + kStorageSize - i) % kStorageSize;
++        if (mAiqResults[tmpIdx]->mSequence >= 0 && sequence >= mAiqResults[tmpIdx]->mSequence) {
++            return mAiqResults[tmpIdx];
++        }
++    }
++
++    return nullptr;
++}
++
++/**
++ * Private function with no lock in it, must be called with lock protection
++ */
++AiqResultStorage* AiqResultStorage::getInstanceLocked(int cameraId)
++{
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        return sInstances[cameraId];
++    }
++
++    sInstances[cameraId] = new AiqResultStorage(cameraId);
++    return sInstances[cameraId];
++}
++
++} //namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
+new file mode 100644
+index 000000000000..432ecc1632aa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
+@@ -0,0 +1,246 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++
++#include "AiqResult.h"
++
++// LOCAL_TONEMAP_S
++#include "Ltm.h"
++// LOCAL_TONEMAP_E
++// INTEL_DVS_S
++#include "Dvs.h"
++// INTEL_DVS_E
++#include "AiqStatistics.h"
++
++#include "iutils/Utils.h"
++#include "iutils/Thread.h"
++#include "iutils/RWLock.h"
++
++namespace icamera {
++
++/**
++ * \class AiqResultStorage
++ *
++ * This class provides interfaces for setting and getting AiqResult, and a storage space
++ * which is able to contain at most `kStorageSize` AiqResults at same time.
++ *
++ * It's a singleton based on camera id, and its life cycle can be maintained by
++ * its static methods getInstance and releaseAiqResultStorage.
++ */
++class AiqResultStorage {
++public:
++    /**
++     * \brief Get internal instance for cameraId.
++     *
++     * param[in] int camera id: only one instance for one particular camera id.
++     *
++     * return the instance of AiqResultStorage for cameraId
++     */
++    static AiqResultStorage* getInstance(int cameraId);
++
++    /**
++     * \brief Release the static instance of AiqResultStorage for cameraId.
++     */
++    static void releaseAiqResultStorage(int cameraId);
++
++    /**
++     * \brief Acquire Aiq result.
++     *
++     * The function will return one Aiq result pointer which is kept by Aiq algo.
++     * The sequence id is set to -1 which indicates the Aiq result is invalid.
++     *
++     * return Aiq result pointer to be kept by Aiq algo.
++     */
++    AiqResult* acquireAiqResult();
++
++    /**
++     * \brief Update mCurrentIndex and set sequence id into internal storage.
++     */
++    void updateAiqResult(long sequence);
++
++    /**
++     * \brief Get the pointer of aiq result to internal storage by given sequence id.
++     *
++     * The function will return the internal pointer of AiqResult, the caller MUST use this
++     * pointer quickly, let's say less than 10ms. For any time-consuming operations, it's
++     * the caller's responsibility to do a deep-copy, otherwise the data in returned AiqResult
++     * may not be consistent.
++     *
++     * param[in] long sequence: specify which aiq result is needed.
++     *
++     * return 1. when sequence id is -1 or not provided, the lastest result will be returned.
++     *        2. when sequence id is larger than -1, the result with gaven sequence id will be returned.
++     *        3. if cannot find in result storage, it means either sequence id is too old and its
++     *           result was overrided, or the sequence id is too new, and its result has not been
++     *           saved into storage yet. For both cases, nullptr will be returned.
++     */
++    const AiqResult* getAiqResult(long sequence = -1);
++
++    // LOCAL_TONEMAP_S
++    /**
++     * \brief Acquire Ltm result.
++     *
++     * The function will return one Ltm result pointer which is kept by LTM algo.
++     * The sequence id is set to -1 which indicates the Ltm result is invalid.
++     *
++     * return Ltm result pointer to be kept by LTM algo.
++     */
++    ltm_result_t* acquireLtmResult();
++
++    /**
++     * \brief Update mCurrentLtmIndex and set sequence id in internal storage.
++     */
++    void updateLtmResult(long sequence);
++
++    /**
++     * \brief Get the pointer of ltm_result_t.
++     *
++     * The function will return the latest Ltm result.
++     *
++     * return the latest Ltm result.
++     */
++    const ltm_result_t* getLtmResult(long sequence = -1);
++    // LOCAL_TONEMAP_E
++
++    // INTEL_DVS_S
++    /**
++     * \brief Acquire Dvs result.
++     *
++     * The function will return one Dvs result pointer which is kept by Dvs algo.
++     * The sequence id is set to -1 which indicates the Dvs result is invalid.
++     *
++     * return Dvs result pointer to be kept by Dvs algo.
++     */
++    DvsResult* acquireDvsResult();
++
++    /**
++     * \brief Update mCurrentDvsIndex and set sequence id in internal storage.
++     */
++    void updateDvsResult(long sequence);
++
++    /**
++     * \brief Get the pointer of DvsResult to internal storage.
++     *
++     * The function will return the latest DVS result.
++     *
++     * param[in] long sequence: specify which aiq result is needed.
++     *
++     * return the latest dvs result if sequence is -1, otherwise return the result of sequence.
++     */
++    const DvsResult* getDvsResult(long sequence = -1);
++    // INTEL_DVS_E
++
++    /**
++     * \brief Acquire AIQ statistics.
++     *
++     * The function will return one AIQ statistics pointer which is kept by AIQ statistics decoder.
++     * The sequence id is set to -1 which indicates the AIQ statistics is invalid.
++     *
++     * return AIQ statistics pointer to be kept by AIQ statistics decoder..
++     */
++    AiqStatistics* acquireAiqStatistics();
++
++    /**
++     * \brief Update mCurrentAiqStatsIndex and set sequence id in internal storage.
++     */
++    void updateAiqStatistics(long sequence);
++
++    /**
++     * \brief Get the pointer of AIQ statistics to internal storage.
++     *
++     * The function will return the latest AIQ statistics, and set the mInUse flag to true.
++     *
++     * return the latest AIQ statistics.
++     */
++    const AiqStatistics* getAndLockAiqStatistics();
++
++    /**
++     * \brief Clear the mInUse flag of all the AIQ statitics in internal storage.
++     */
++    void unLockAiqStatistics();
++
++    /**
++     * DVS statistics storage.
++     * A pair of {pointer to ia_dvs_statistics, sequence} is stored.
++     * The function updateDvsStatistics() is called by PipeExecutor, while getDvsStatistics()
++     * called by Dvs. They are called in the same thread on PSys statistics available.
++     */
++    /**
++     * \brief Update the dvs statistics in internal storage.
++     */
++    void updateDvsStatistics(const DvsStatistics &dvsStats) { mDvsStatistics = dvsStats; }
++    /**
++     * \brief Get the pointer of dvs statistics to internal storage.
++     */
++    DvsStatistics* getDvsStatistics() { return &mDvsStatistics; }
++
++    /**
++     * LTM statistics storage.
++     * A pair of {pointer to ia_isp_bxt_hdr_yv_grid_t, sequence} is stored.
++     * The function updateLtmStatistics() is called by PipeExecutor, while getLtmStatistics()
++     * called by Ltm. They are called in the same thread on PSys statistics available.
++     */
++    /**
++     * \brief Update the ltm statistics in internal storage.
++     */
++    void updateLtmStatistics(const LtmStatistics &ltmStats) { mLtmStatistics = ltmStats; }
++    /**
++     * \brief Get the pointer of ltm statistics to internal storage.
++     */
++    LtmStatistics* getLtmStatistics() { return &mLtmStatistics; }
++
++private:
++    AiqResultStorage(int cameraId);
++    ~AiqResultStorage();
++
++    static AiqResultStorage* getInstanceLocked(int cameraId);
++
++private:
++    static std::map<int, AiqResultStorage*> sInstances;
++    // Guard for singleton creation.
++    static Mutex sLock;
++
++    int mCameraId;
++    RWLock mDataLock;   // lock for all the data storage below
++
++    static const int kStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + sensorLag
++    int mCurrentIndex = -1;
++    AiqResult* mAiqResults[kStorageSize];
++
++    // LOCAL_TONEMAP_S
++    static const int kLtmStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + ltmLag
++    int mCurrentLtmIndex = -1;
++    ltm_result_t* mLtmResults[kLtmStorageSize];
++    // LOCAL_TONEMAP_E
++
++    // INTEL_DVS_S
++    static const int kDvsStorageSize = MAX_SETTING_COUNT;
++    int mCurrentDvsIndex = -1;
++    DvsResult* mDvsResults[kDvsStorageSize];
++    // INTEL_DVS_E
++
++    static const int kAiqStatsStorageSize = 3; // Always use the latest, but may hold for long time
++    int mCurrentAiqStatsIndex = -1;
++    AiqStatistics mAiqStatistics[kAiqStatsStorageSize];
++
++    DvsStatistics mDvsStatistics;
++    LtmStatistics mLtmStatistics;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
+new file mode 100644
+index 000000000000..35f793f27e31
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
+@@ -0,0 +1,379 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqSetting"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "AiqSetting.h"
++#include "PlatformData.h"
++#include "ParameterHelper.h"
++
++namespace icamera {
++
++AiqSetting::AiqSetting(int cameraId) :
++    mCameraId(cameraId),
++    mPipeSwitchFrameCount(0)
++{
++    LOG3A("@%s", __func__);
++}
++
++AiqSetting::~AiqSetting()
++{
++    LOG3A("@%s", __func__);
++}
++
++int AiqSetting::init(void)
++{
++    LOG3A("@%s", __func__);
++    AutoWMutex wlock(mParamLock);
++
++    mPipeSwitchFrameCount = 0;
++
++    mAiqParam.reset();
++
++    camera_info_t info = {};
++    PlatformData::getCameraInfo(mCameraId, info);
++    info.capability->getAeCompensationRange(mAiqParam.evRange);
++    info.capability->getAeCompensationStep(mAiqParam.evStep);
++
++    return OK;
++}
++
++int AiqSetting::deinit(void)
++{
++    LOG3A("@%s", __func__);
++    AutoWMutex wlock(mParamLock);
++
++    return OK;
++}
++
++int AiqSetting::configure(const stream_config_t *streamList)
++{
++    LOG3A("@%s", __func__);
++    AutoWMutex wlock(mParamLock);
++
++    camera_resolution_t resolution = {streamList->streams[0].width, streamList->streams[0].height};
++    for (int i = 0; i < streamList->num_streams; i++) {
++        if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW) {
++            resolution = {streamList->streams[i].width, streamList->streams[i].height};
++            break;
++        }
++    }
++
++    updateFrameUsage(streamList);
++
++    mAiqParam.tuningMode = TUNING_MODE_MAX;
++    mAiqParam.resolution = resolution;
++
++    mTuningModes.clear();
++    std::vector<ConfigMode> configModes;
++    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
++    for (auto cfg : configModes) {
++        TuningMode tuningMode;
++        if (PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tuningMode) == OK) {
++            mTuningModes.push_back(tuningMode);
++        }
++    }
++    if (!mTuningModes.empty()) {
++        mAiqParam.tuningMode = mTuningModes[0];
++    }
++    LOG3A("%s, tuningMode %d, configMode %x", __func__, mAiqParam.tuningMode, configModes[0]);
++
++    return OK;
++}
++
++void AiqSetting::updateFrameUsage(const stream_config_t *streamList)
++{
++    bool preview = false, still = false, video = false;
++    for (int i = 0; i < streamList->num_streams; i++) {
++        if (streamList->streams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
++            video = true;
++        } else if (streamList->streams[i].usage == CAMERA_STREAM_STILL_CAPTURE) {
++            still = true;
++        } else if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW
++                   || streamList->streams[i].usage == CAMERA_STREAM_APP) {
++            preview = true;
++        }
++    }
++
++    mAiqParam.frameUsage = FRAME_USAGE_PREVIEW;
++    if (video) {
++        mAiqParam.frameUsage = FRAME_USAGE_VIDEO;
++    } else if (preview && still) {
++        mAiqParam.frameUsage = FRAME_USAGE_CONTINUOUS;
++    } else if (still) {
++        mAiqParam.frameUsage = FRAME_USAGE_STILL;
++    }
++}
++
++int AiqSetting::setParameters(const Parameters& params)
++{
++    LOG3A("@%s", __func__);
++    AutoWMutex wlock(mParamLock);
++
++    // Update AE related parameters
++    params.getAeMode(mAiqParam.aeMode);
++    params.getAeLock(mAiqParam.aeForceLock);
++    params.getExposureTime(mAiqParam.manualExpTimeUs);
++    params.getSensitivityGain(mAiqParam.manualGain);
++    params.getSensitivityIso(mAiqParam.manualIso);
++    params.getBlcAreaMode(mAiqParam.blcAreaMode);
++    params.getAeRegions(mAiqParam.aeRegions);
++    params.getAeConvergeSpeedMode(mAiqParam.aeConvergeSpeedMode);
++    params.getAeConvergeSpeed(mAiqParam.aeConvergeSpeed);
++    params.getRun3ACadence(mAiqParam.run3ACadence);
++
++    int ev = 0;
++    params.getAeCompensation(ev);
++    if (mAiqParam.evStep.denominator == 0) {
++        mAiqParam.evShift = 0.0;
++    } else {
++        ev = CLIP(ev, mAiqParam.evRange.max, mAiqParam.evRange.min);
++        mAiqParam.evShift = static_cast<float>(ev) *
++            mAiqParam.evStep.numerator / mAiqParam.evStep.denominator;
++    }
++
++    params.getFrameRate(mAiqParam.fps);
++    params.getFpsRange(mAiqParam.aeFpsRange);
++    params.getAntiBandingMode(mAiqParam.antibandingMode);
++    // Update AWB related parameters
++    params.getAwbMode(mAiqParam.awbMode);
++    params.getAwbLock(mAiqParam.awbForceLock);
++    params.getAwbCctRange(mAiqParam.cctRange);
++    params.getAwbGains(mAiqParam.awbManualGain);
++    params.getAwbWhitePoint(mAiqParam.whitePoint);
++    params.getAwbGainShift(mAiqParam.awbGainShift);
++    params.getColorTransform(mAiqParam.manualColorMatrix);
++    params.getColorGains(mAiqParam.manualColorGains);
++    params.getAwbConvergeSpeedMode(mAiqParam.awbConvergeSpeedMode);
++    params.getAwbConvergeSpeed(mAiqParam.awbConvergeSpeed);
++
++    // Update AF related parameters
++    params.getAfMode(mAiqParam.afMode);
++    params.getAfRegions(mAiqParam.afRegions);
++    params.getAfTrigger(mAiqParam.afTrigger);
++
++    params.getWeightGridMode(mAiqParam.weightGridMode);
++    params.getSceneMode(mAiqParam.sceneMode);
++
++    params.getAeDistributionPriority(mAiqParam.aeDistributionPriority);
++
++    params.getWdrLevel(mAiqParam.ltmStrength);
++
++    unsigned int length = sizeof(mAiqParam.customAicParam.data);
++    if (params.getCustomAicParam(mAiqParam.customAicParam.data, &length) == OK) {
++        mAiqParam.customAicParam.length = length;
++    }
++
++    params.getYuvColorRangeMode(mAiqParam.yuvColorRangeMode);
++
++    params.getExposureTimeRange(mAiqParam.exposureTimeRange);
++    params.getSensitivityGainRange(mAiqParam.sensitivityGainRange);
++
++    params.getVideoStabilizationMode(mAiqParam.videoStabilizationMode);
++    params.getLdcMode(mAiqParam.ldcMode);
++    params.getRscMode(mAiqParam.rscMode);
++    params.getFlipMode(mAiqParam.flipMode);
++    params.getDigitalZoomRatio(mAiqParam.digitalZoomRatio);
++
++    int ret = params.getMakernoteMode(mAiqParam.makernoteMode);
++    if (ret == NAME_NOT_FOUND) mAiqParam.makernoteMode = MAKERNOTE_MODE_OFF;
++
++    CameraMetadata meta;
++    ParameterHelper::copyMetadata(params, &meta);
++
++    uint32_t tag = CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE;
++    icamera_metadata_entry entry = meta.find(tag);
++    if (entry.count == 1) {
++        mAiqParam.minFocusDistance = entry.data.f[0];
++    }
++
++    params.getFocusDistance(mAiqParam.focusDistance);
++    params.getShadingMode(mAiqParam.shadingMode);
++    params.getLensShadingMapMode(mAiqParam.lensShadingMapMode);
++    params.getLensInfoShadingMapSize(mAiqParam.lensShadingMapSize);
++
++    params.getTonemapMode(mAiqParam.tonemapMode);
++    params.getTonemapPresetCurve(mAiqParam.tonemapPresetCurve);
++    params.getTonemapGamma(mAiqParam.tonemapGamma);
++
++    uint8_t captureIntent = 0;
++    if (params.getCaptureIntent(captureIntent) == OK) {
++        switch (captureIntent) {
++        case CAMERA_CONTROL_CAPTUREINTENT_STILL_CAPTURE:
++            mAiqParam.frameUsage = FRAME_USAGE_STILL;
++            break;
++        case CAMERA_CONTROL_CAPTUREINTENT_VIDEO_RECORD:
++        case CAMERA_CONTROL_CAPTUREINTENT_VIDEO_SNAPSHOT:
++            mAiqParam.frameUsage = FRAME_USAGE_VIDEO;
++            break;
++        case CAMERA_CONTROL_CAPTUREINTENT_PREVIEW:
++            mAiqParam.frameUsage = FRAME_USAGE_PREVIEW;
++            break;
++        default:
++            mAiqParam.frameUsage = FRAME_USAGE_CONTINUOUS;
++            break;
++        }
++    }
++
++    mAiqParam.dump();
++
++    return OK;
++}
++
++int AiqSetting::getAiqParameter(aiq_parameter_t &param)
++{
++    LOG3A("@%s", __func__);
++    AutoRMutex rlock(mParamLock);
++
++    param = mAiqParam;
++    return OK;
++}
++
++void aiq_parameter_t::reset()
++{
++    frameUsage = FRAME_USAGE_VIDEO;
++    aeMode = AE_MODE_AUTO;
++    aeForceLock = false;
++    awbMode = AWB_MODE_AUTO;
++    awbForceLock = false;
++    afMode = AF_MODE_AUTO;
++    afTrigger = AF_TRIGGER_IDLE;
++    sceneMode = SCENE_MODE_AUTO;
++    manualExpTimeUs = -1;
++    manualGain = -1;
++    manualIso = 0;
++    evShift = 0;
++    evStep = {1, 3};
++    evRange = {-6, 6};
++    fps = 0;
++    aeFpsRange = { 0.0, 0.0 };
++    antibandingMode = ANTIBANDING_MODE_AUTO;
++    cctRange = { 0, 0 };
++    whitePoint = { 0, 0 };
++    awbManualGain = { 0, 0, 0 };
++    awbGainShift = { 0, 0, 0 };
++    CLEAR(manualColorMatrix);
++    CLEAR(manualColorGains);
++    aeRegions.clear();
++    blcAreaMode = BLC_AREA_MODE_OFF;
++    aeConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
++    awbConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
++    aeConvergeSpeed = CONVERGE_NORMAL;
++    awbConvergeSpeed = CONVERGE_NORMAL;
++    run3ACadence = 1;
++    ltmStrength = 0;
++    weightGridMode = WEIGHT_GRID_AUTO;
++    aeDistributionPriority = DISTRIBUTION_AUTO;
++    CLEAR(customAicParam);
++    yuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
++    exposureTimeRange.min = -1;
++    exposureTimeRange.max = -1;
++    sensitivityGainRange.min = -1;
++    sensitivityGainRange.max = -1;
++    videoStabilizationMode = VIDEO_STABILIZATION_MODE_OFF;
++    tuningMode = TUNING_MODE_MAX;
++    ldcMode = LDC_MODE_OFF;
++    rscMode = RSC_MODE_OFF;
++    flipMode = FLIP_MODE_NONE;
++    digitalZoomRatio = 1.0f;
++
++    lensPosition = 0;
++    lensMovementStartTimestamp = 0;
++    makernoteMode = MAKERNOTE_MODE_OFF;
++    minFocusDistance = 0.0f;
++    focusDistance = 0.0f;
++    shadingMode = SHADING_MODE_FAST;
++    lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
++    lensShadingMapSize = {0, 0};
++    CLEAR(lensShadingMap);
++
++    tonemapMode = TONEMAP_MODE_FAST;
++    tonemapPresetCurve = TONEMAP_PRESET_CURVE_SRGB;
++    tonemapGamma = 0.0f;
++
++    CLEAR(resolution);
++}
++
++void aiq_parameter_t::dump()
++{
++    // Log only printed when 3a log enabled.
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return;
++
++    LOG3A("Application parameters:");
++    LOG3A("frame usage mode %d", frameUsage);
++    LOG3A("ae mode:%d, awb mode:%d, af mode:%d, scene mode:%d", aeMode, awbMode, afMode, sceneMode);
++    LOG3A("ae lock:%d, awb lock:%d, af trigger:%d", aeForceLock, awbForceLock, afTrigger);
++    LOG3A("EV:%f, manualExpTimeUs:%ld, manualGain:%f, manualIso %d",
++          evShift, manualExpTimeUs, manualGain, manualIso);
++    LOG3A("FPS:%f", fps);
++    LOG3A("FPS range:(%f-%f)", aeFpsRange.min, aeFpsRange.max);
++    LOG3A("Antibanding mode:%d", antibandingMode);
++    LOG3A("cctRange:(%f-%f)", cctRange.min, cctRange.max);
++    LOG3A("manual white point:(%d,%d)", whitePoint.x, whitePoint.y);
++    LOG3A("manual awb gain:(%d,%d,%d)", awbManualGain.r_gain, awbManualGain.g_gain, awbManualGain.b_gain);
++    LOG3A("manual awb gain shift:(%d,%d,%d)", awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain);
++    for (int i = 0; i < 3; i++) {
++        LOG3A("manual color matrix:  [%.3f %.3f %.3f]",
++            manualColorMatrix.color_transform[i][0],
++            manualColorMatrix.color_transform[i][1],
++            manualColorMatrix.color_transform[i][2]);
++    }
++    LOG3A("manual color gains in rggb:(%.3f,%.3f,%.3f,%.3f)",
++        manualColorGains.color_gains_rggb[0], manualColorGains.color_gains_rggb[1],
++        manualColorGains.color_gains_rggb[2], manualColorGains.color_gains_rggb[3]);
++    LOG3A("ae region size:%zu, blc area mode:%d", aeRegions.size(), blcAreaMode);
++    for (auto &region : aeRegions) {
++        LOG3A("ae region (%d, %d, %d, %d, %d)",
++            region.left, region.top, region.right, region.bottom, region.weight);
++    }
++    LOG3A("af region size:%zu", aeRegions.size());
++    for (auto &region : afRegions) {
++        LOG3A("af region (%d, %d, %d, %d, %d)",
++            region.left, region.top, region.right, region.bottom, region.weight);
++    }
++    LOG3A("manual focus distance: %f, min focus distance: %f", focusDistance, minFocusDistance);
++
++    LOG3A("ae converge speed mode:(%d) awb converge speed mode:(%d)", aeConvergeSpeedMode, awbConvergeSpeedMode);
++    LOG3A("ae converge speed:(%d) awb converge speed:(%d)", aeConvergeSpeed, awbConvergeSpeed);
++    LOG3A("custom AIC parameter length:%d", customAicParam.length);
++    if (customAicParam.length > 0) {
++        LOG3A("custom AIC parameter data:%s", customAicParam.data);
++    }
++    if (tuningMode != TUNING_MODE_MAX) {
++        LOG3A("camera mode:%d", tuningMode);
++    }
++    LOG3A("ltm strength:(%d)", ltmStrength);
++    LOG3A("weight grid mode:%d", weightGridMode);
++    LOG3A("AE Distribution Priority:%d", aeDistributionPriority);
++    LOG3A("Yuv Color Range Mode:%d", yuvColorRangeMode);
++    LOG3A("AE exposure time range, min %f, max %f", exposureTimeRange.min, exposureTimeRange.max);
++    LOG3A("AE sensitivity gain range, min %.2f, max %.2f", sensitivityGainRange.min, sensitivityGainRange.max);
++    LOG3A("DVS mode %d", videoStabilizationMode);
++
++    LOG3A("Focus position %d, start timestamp %llu", lensPosition, lensMovementStartTimestamp);
++    LOG3A("makernoteMode %d", makernoteMode);
++    LOG3A("shadingMode %d", shadingMode);
++    LOG3A("lensShadingMapMode %d", lensShadingMapMode);
++    LOG3A("lensShadingMapSize x:%d, y:%d", lensShadingMapSize.x, lensShadingMapSize.y);
++
++    LOG3A("tonemap mode %d, preset curve %d, gamma %f",
++          tonemapMode, tonemapPresetCurve, tonemapGamma);
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.h b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
+new file mode 100644
+index 000000000000..3e6ddf2ef3d0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Utils.h"
++#include "iutils/RWLock.h"
++#include "Parameters.h"
++
++#include "AiqUtils.h"
++
++namespace icamera {
++
++#define DEFAULT_LSC_GRID_SIZE (64 * 64)
++
++// Imaging algorithms that are supported
++typedef enum {
++    IMAGING_ALGO_NONE = 0,
++    IMAGING_ALGO_AE   = 1,
++    IMAGING_ALGO_AWB  = 1 << 1,
++    IMAGING_ALGO_AF   = 1 << 2,
++    IMAGING_ALGO_GBCE = 1 << 3,
++    IMAGING_ALGO_PA   = 1 << 4,
++    IMAGING_ALGO_SA   = 1 << 5
++} imaging_algorithm_t;
++
++typedef struct {
++    char data[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
++    unsigned int length;
++} custom_aic_param_t;
++
++typedef enum {
++    FRAME_USAGE_PREVIEW,
++    FRAME_USAGE_VIDEO,
++    FRAME_USAGE_STILL,
++    FRAME_USAGE_CONTINUOUS,
++} frame_usage_mode_t;
++
++/*
++ * aiq related parameters
++ */
++struct aiq_parameter_t {
++    frame_usage_mode_t frameUsage;
++    camera_ae_mode_t aeMode;
++    bool aeForceLock;
++    camera_awb_mode_t awbMode;
++    bool awbForceLock;
++    camera_af_mode_t afMode;
++    camera_af_trigger_t afTrigger;
++    camera_scene_mode_t sceneMode;
++    int64_t manualExpTimeUs;
++    float manualGain;
++    int32_t manualIso;
++    float evShift;
++    float fps;
++    camera_range_t aeFpsRange;
++    camera_antibanding_mode_t antibandingMode;
++    camera_range_t cctRange;
++    camera_coordinate_t whitePoint;
++    camera_awb_gains_t awbManualGain;
++    camera_awb_gains_t awbGainShift;
++    camera_color_transform_t manualColorMatrix;
++    camera_color_gains_t manualColorGains;
++    camera_window_list_t aeRegions;
++    camera_window_list_t afRegions;
++    camera_blc_area_mode_t blcAreaMode;
++    camera_converge_speed_mode_t aeConvergeSpeedMode;
++    camera_converge_speed_mode_t awbConvergeSpeedMode;
++    camera_converge_speed_t aeConvergeSpeed;
++    camera_converge_speed_t awbConvergeSpeed;
++    int run3ACadence;
++    uint8_t ltmStrength;
++    camera_weight_grid_mode_t weightGridMode;
++    camera_ae_distribution_priority_t aeDistributionPriority;
++    custom_aic_param_t customAicParam;
++    camera_yuv_color_range_mode_t yuvColorRangeMode;
++    camera_range_t exposureTimeRange;
++    camera_range_t sensitivityGainRange;
++    camera_video_stabilization_mode_t videoStabilizationMode;
++    camera_resolution_t resolution;
++    camera_ldc_mode_t ldcMode;
++    camera_rsc_mode_t rscMode;
++    camera_flip_mode_t flipMode;
++    float digitalZoomRatio;
++    camera_range_t evRange;
++    camera_rational_t evStep;
++
++    TuningMode tuningMode;
++
++    int lensPosition;
++    unsigned long long lensMovementStartTimestamp;
++    camera_makernote_mode_t makernoteMode;
++    float minFocusDistance;
++    float focusDistance;
++    camera_shading_mode_t shadingMode;
++    camera_lens_shading_map_mode_type_t lensShadingMapMode;
++    camera_coordinate_t lensShadingMapSize;
++    float lensShadingMap[DEFAULT_LSC_GRID_SIZE * 4];
++
++    camera_tonemap_mode_t tonemapMode;
++    camera_tonemap_preset_curve_t tonemapPresetCurve;
++    float tonemapGamma;
++
++    aiq_parameter_t() { reset(); }
++    void reset();
++    void dump();
++};
++
++/*
++ * \class AiqSetting
++ * This class is used for setting parameters to other aiq class
++ * and return some useful status of aiq results
++ */
++class AiqSetting {
++
++public:
++    AiqSetting(int cameraId);
++    ~AiqSetting();
++
++    int init(void);
++    int deinit(void);
++    int configure(const stream_config_t *streamList);
++
++    int setParameters(const Parameters& params);
++
++    int getAiqParameter(aiq_parameter_t &param);
++
++private:
++    void updateFrameUsage(const stream_config_t *streamList);
++
++public:
++    int mCameraId;
++
++private:
++    std::vector<TuningMode> mTuningModes;
++    unsigned int mPipeSwitchFrameCount;
++    aiq_parameter_t mAiqParam;
++
++    RWLock mParamLock;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
+new file mode 100644
+index 000000000000..a5e55db45ed0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
+@@ -0,0 +1,147 @@
++/*
++ * Copyright (C) 2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqStatistics"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "AiqStatistics.h"
++
++namespace icamera {
++
++AiqStatistics::AiqStatistics()
++{
++    CLEAR(mRgbsGridArray);
++    CLEAR(mAfGridArray);
++}
++
++AiqStatistics::~AiqStatistics()
++{
++    for (unsigned int i = 0; i < MAX_EXPOSURES_NUM; i++) {
++        delete [] mRgbsGridArray[i].blocks_ptr;
++        mRgbsGridArray[i].blocks_ptr = nullptr;
++
++        delete [] mAfGridArray[i].filter_response_1;
++        mAfGridArray[i].filter_response_1 = nullptr;
++        delete [] mAfGridArray[i].filter_response_2;
++        mAfGridArray[i].filter_response_2 = nullptr;
++    }
++}
++
++AiqStatistics &AiqStatistics::operator=(const AiqStatistics &other)
++{
++    mSequence = other.mSequence;
++    mTimestamp = other.mTimestamp;
++    mTuningMode = other.mTuningMode;
++
++    const ia_aiq_rgbs_grid *rgbs_grid[MAX_EXPOSURES_NUM];
++    for (int i = 0; i < other.mExposureNum; i++) {
++        rgbs_grid[i] = &other.mRgbsGridArray[i];
++    }
++    saveRgbsGridData(rgbs_grid, other.mExposureNum);
++
++    saveAfGridData(&other.mAfGridArray[0]);
++
++    return *this;
++}
++
++#define GRID_SIZE_UNEQUAL(g1, g2) \
++        ((g1)->grid_width != (g2)->grid_width || (g1)->grid_height != (g2)->grid_height)
++
++int AiqStatistics::saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrids, int exposureNum)
++{
++    CheckError(rgbsGrids == nullptr, BAD_VALUE, "Rgbs grid is null");
++
++    for (int i = 0; i < exposureNum; i++) {
++        int ret = copyRgbsGridData(rgbsGrids[i], &mRgbsGridArray[i]);
++        CheckError(ret != OK, ret, "save Rgbs grid %d failed ret %d", i, ret);
++    }
++    mExposureNum = exposureNum;
++    return OK;
++}
++
++int AiqStatistics::copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst)
++{
++    LOG3A("%s", __func__);
++    CheckError(src == nullptr || dst == nullptr, BAD_VALUE, "src or dst rgbs grid is null");
++
++    // Release the old memory if size changes.
++    if (GRID_SIZE_UNEQUAL(src, dst)) {
++        if (dst->blocks_ptr) delete [] dst->blocks_ptr;
++        CLEAR(*dst);
++    }
++
++    if (src->blocks_ptr == nullptr || src->grid_width == 0 || src->grid_height == 0) {
++        return OK;
++    }
++
++    size_t gridSize = src->grid_width * src->grid_height;
++    if (dst->blocks_ptr == nullptr) {
++        dst->blocks_ptr = new rgbs_grid_block[gridSize];
++    }
++
++    dst->grid_width = src->grid_width;
++    dst->grid_height = src->grid_height;
++    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
++             src->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
++
++    dst->shading_correction = src->shading_correction;
++
++    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
++    return OK;
++}
++
++int AiqStatistics::saveAfGridData(const ia_aiq_af_grid *afGrid)
++{
++    LOG3A("%s", __func__);
++    CheckError(afGrid == nullptr, BAD_VALUE, "AF grid is null");
++
++    // Release the old memory if size changes.
++    if (GRID_SIZE_UNEQUAL(afGrid, &mAfGridArray[0])) {
++        if (mAfGridArray[0].filter_response_1) delete [] mAfGridArray[0].filter_response_1;
++        if (mAfGridArray[0].filter_response_2) delete [] mAfGridArray[0].filter_response_2;
++        CLEAR(mAfGridArray);
++    }
++
++    if (afGrid->filter_response_1 == nullptr || afGrid->filter_response_2 == nullptr
++        || afGrid->grid_width == 0 || afGrid->grid_height == 0) {
++        return OK;
++    }
++
++    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
++    if (mAfGridArray[0].filter_response_1 == nullptr) {
++        mAfGridArray[0].filter_response_1 = new int[gridSize];
++    }
++    if (mAfGridArray[0].filter_response_2 == nullptr) {
++        mAfGridArray[0].filter_response_2 = new int[gridSize];
++    }
++
++    mAfGridArray[0].grid_width = afGrid->grid_width;
++    mAfGridArray[0].grid_height = afGrid->grid_height;
++    mAfGridArray[0].block_width = afGrid->block_width;
++    mAfGridArray[0].block_height = afGrid->block_height;
++    MEMCPY_S(mAfGridArray[0].filter_response_1, gridSize * sizeof(int),
++             afGrid->filter_response_1, gridSize * sizeof(int));
++    MEMCPY_S(mAfGridArray[0].filter_response_2, gridSize * sizeof(int),
++             afGrid->filter_response_2, gridSize * sizeof(int));
++
++    LOG3A("%s, grid size=[%dx%d]", __func__, mAfGridArray[0].grid_width, mAfGridArray[0].grid_height);
++    return OK;
++}
++
++} /* namespace icamera */
++
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.h b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
+new file mode 100644
+index 000000000000..da4a2ec34ef3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (C) 2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_aiq_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_dvs_types.h"
++#include "ia_isp_bxt_statistics_types.h"
++
++#include "AiqUtils.h"
++
++namespace icamera {
++
++/*
++ * \class AiqStatistics
++ *
++ * This class is used to envelop AIQ statistics.
++ */
++class AiqStatistics {
++public:
++    AiqStatistics();
++    ~AiqStatistics();
++
++    AiqStatistics& operator=(const AiqStatistics& other);
++
++    int saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrid, int exposureNum);
++    int saveAfGridData(const ia_aiq_af_grid *afGrid);
++
++private:
++    int copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst);
++
++public:
++    long mSequence = -1;
++    unsigned long long mTimestamp = 0;
++    TuningMode mTuningMode = TUNING_MODE_MAX;
++    bool mInUse = false;
++
++    int mExposureNum = 0;
++    ia_aiq_rgbs_grid mRgbsGridArray[MAX_EXPOSURES_NUM];
++    ia_aiq_af_grid mAfGridArray[MAX_EXPOSURES_NUM];
++};
++
++} /* namespace icamera */
++
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
+new file mode 100644
+index 000000000000..9bc6cfe67c82
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
+@@ -0,0 +1,257 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqUnit"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "AiqUnit.h"
++
++namespace icamera {
++
++AiqUnit::AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw) :
++    mCameraId(cameraId),
++    // LOCAL_TONEMAP_S
++    mLtm(nullptr),
++    // LOCAL_TONEMAP_E
++    mAiqUnitState(AIQ_UNIT_NOT_INIT)
++{
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    mAiqSetting = new AiqSetting(cameraId);
++
++    mAiqEngine = new AiqEngine(cameraId, sensorHw, lensHw, mAiqSetting);
++
++    // INTEL_DVS_S
++    mDvs = new Dvs(cameraId, mAiqSetting);
++    // INTEL_DVS_E
++    // LOCAL_TONEMAP_S
++    if (PlatformData::isLtmEnabled(mCameraId)) {
++        mLtm = new Ltm(cameraId);
++    }
++    // LOCAL_TONEMAP_E
++}
++
++AiqUnit::~AiqUnit()
++{
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    if (mAiqUnitState == AIQ_UNIT_START) {
++        stop();
++    }
++
++    if (mAiqUnitState == AIQ_UNIT_INIT) {
++        deinit();
++    }
++
++    // LOCAL_TONEMAP_S
++    delete mLtm;
++    // LOCAL_TONEMAP_E
++    // INTEL_DVS_S
++    delete mDvs;
++    // INTEL_DVS_E
++    delete mAiqEngine;
++    delete mAiqSetting;
++}
++
++int AiqUnit::init()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    int ret = mAiqSetting->init();
++    if (ret != OK) {
++        mAiqSetting->deinit();
++        return ret;
++    }
++
++    if (mAiqUnitState == AIQ_UNIT_NOT_INIT) {
++        ret = mAiqEngine->init();
++        if (ret != OK) {
++            mAiqEngine->deinit();
++            return ret;
++        }
++
++        // INTEL_DVS_S
++        mDvs->init();
++        // INTEL_DVS_E
++        // LOCAL_TONEMAP_S
++        if (mLtm) {
++            mLtm->init();
++        }
++        // LOCAL_TONEMAP_E
++    }
++
++    mAiqUnitState = AIQ_UNIT_INIT;
++
++    return OK;
++}
++
++int AiqUnit::deinit()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    // LOCAL_TONEMAP_S
++    if (mLtm) {
++        mLtm->deinit();
++    }
++    // LOCAL_TONEMAP_E
++    // INTEL_DVS_S
++    mDvs->deinit();
++    // INTEL_DVS_E
++    mAiqEngine->deinit();
++
++    mAiqSetting->deinit();
++
++    mAiqUnitState = AIQ_UNIT_NOT_INIT;
++
++    return OK;
++}
++
++int AiqUnit::configure(const stream_config_t *streamList)
++{
++    CheckError(streamList == nullptr, BAD_VALUE, "streamList is nullptr");
++
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    if (mAiqUnitState != AIQ_UNIT_INIT && mAiqUnitState != AIQ_UNIT_STOP) {
++        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
++        return BAD_VALUE;
++    }
++
++    std::vector<ConfigMode> configModes;
++    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
++
++    int ret = mAiqSetting->configure(streamList);
++    CheckError(ret != OK, ret, "configure AIQ settings error: %d", ret);
++
++    ret = mAiqEngine->configure(configModes);
++    CheckError(ret != OK, ret, "configure AIQ engine error: %d", ret);
++    // INTEL_DVS_S
++    ret = mDvs->configure(configModes);
++    CheckError(ret != OK, ret, "configure DVS engine error: %d", ret);
++    // INTEL_DVS_E
++    // LOCAL_TONEMAP_S
++    if (mLtm) {
++        ret = mLtm->configure(configModes);
++        CheckError(ret != OK, ret, "configure LTM engine error: %d", ret);
++    }
++    // LOCAL_TONEMAP_E
++
++    mAiqUnitState = AIQ_UNIT_CONFIGURED;
++    return OK;
++}
++
++int AiqUnit::start()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    if (mAiqUnitState != AIQ_UNIT_CONFIGURED && mAiqUnitState != AIQ_UNIT_STOP) {
++        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
++        return BAD_VALUE;
++    }
++
++    // LOCAL_TONEMAP_S
++    if (mLtm) {
++        mLtm->start();
++    }
++    // LOCAL_TONEMAP_E
++    int ret = mAiqEngine->startEngine();
++    if (ret == OK) {
++        mAiqUnitState = AIQ_UNIT_START;
++    }
++
++    return OK;
++}
++
++int AiqUnit::stop()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    if (mAiqUnitState == AIQ_UNIT_START) {
++        mAiqEngine->stopEngine();
++        // LOCAL_TONEMAP_S
++        if (mLtm) {
++            mLtm->stop();
++        }
++        // LOCAL_TONEMAP_E
++    }
++
++    mAiqUnitState = AIQ_UNIT_STOP;
++
++    return OK;
++}
++
++int AiqUnit::run3A(long *settingSequence)
++{
++    AutoMutex l(mAiqUnitLock);
++    TRACE_LOG_PROCESS("AiqUnit", "run3A");
++
++    if (settingSequence)
++       *settingSequence = -1;
++
++    if (mAiqUnitState != AIQ_UNIT_START) {
++        LOGW("%s: AIQ is not started: %d", __func__, mAiqUnitState);
++        return BAD_VALUE;
++    }
++
++    int ret = mAiqEngine->run3A(settingSequence);
++    CheckError(ret != OK, ret, "run 3A failed.");
++
++    return OK;
++}
++
++std::vector<EventListener*> AiqUnit::getSofEventListener()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    std::vector<EventListener*> eventListenerList;
++    eventListenerList.push_back(mAiqEngine->getSofEventListener());
++    return eventListenerList;
++}
++
++std::vector<EventListener*> AiqUnit::getStatsEventListener()
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    std::vector<EventListener*> eventListenerList;
++    // LOCAL_TONEMAP_S
++    if (mLtm) {
++        eventListenerList.push_back(mLtm);
++    }
++    // LOCAL_TONEMAP_E
++    // INTEL_DVS_S
++    eventListenerList.push_back(mDvs);
++    // INTEL_DVS_E
++    return eventListenerList;
++}
++
++int AiqUnit::setParameters(const Parameters &params)
++{
++    AutoMutex l(mAiqUnitLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    return mAiqSetting->setParameters(params);
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.h b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
+new file mode 100644
+index 000000000000..7584e48581f0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "CameraEvent.h"
++
++#include "AiqSetting.h"
++#include "AiqEngine.h"
++// INTEL_DVS_S
++#include "Dvs.h"
++// INTEL_DVS_E
++// LOCAL_TONEMAP_S
++#include "Ltm.h"
++// LOCAL_TONEMAP_E
++
++namespace icamera {
++
++class SensorHwCtrl;
++class LensHw;
++
++/*
++ * \class AiqUnit
++ * This class is used for upper layer to control 3a engine.
++ */
++
++class AiqUnitBase{
++
++public:
++    AiqUnitBase() {}
++    virtual ~AiqUnitBase() {}
++
++    virtual int init() { return OK; }
++    virtual int deinit() { return OK; }
++    virtual int configure(const stream_config_t * /*streamList*/) { return OK; }
++    virtual int start() { return OK; }
++    virtual int stop() { return OK; }
++    virtual int run3A(long * /*settingSequence*/)  { return OK; }
++
++    virtual std::vector<EventListener*> getSofEventListener()
++    {
++        std::vector<EventListener*> eventListenerList;
++        return eventListenerList;
++    }
++    virtual std::vector<EventListener*> getStatsEventListener()
++    {
++        std::vector<EventListener*> eventListenerList;
++        return eventListenerList;
++    }
++
++    virtual int setParameters(const Parameters & /*params*/) { return OK; }
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(AiqUnitBase);
++
++};
++
++class AiqUnit : public AiqUnitBase {
++
++public:
++    AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
++    ~AiqUnit();
++
++    /**
++     * \brief Init 3a related objects
++     */
++    int init();
++
++    /**
++     * \brief Deinit 3a related objects
++     */
++    int deinit();
++
++    /**
++     * \brief configure 3a engine with stream configuration
++     */
++    int configure(const stream_config_t *streamList);
++
++    /**
++     * \brief Start 3a Engine
++     */
++    int start();
++
++    /**
++     * \brief Stop 3a Engine
++     */
++    int stop();
++
++    /**
++     * \brief Run 3a to get new 3a settings.
++     * Return 0 if the operation succeeds, and output settingSequence to
++     * indicate the frame that settings are applied.
++     * settingSequence -1 means uncertain frame for this settings.
++     */
++    int run3A(long *settingSequence);
++
++    /**
++     * \brief Get software EventListener
++     */
++    std::vector<EventListener*> getSofEventListener();
++
++    /**
++     * \brief Get stats EventListener
++     */
++    std::vector<EventListener*> getStatsEventListener();
++
++    /**
++     * \brief Set 3A Parameters
++     *
++     * \param params: the Parameters update to 3A
++     */
++    int setParameters(const Parameters &params);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(AiqUnit);
++
++private:
++    int mCameraId;
++    // LOCAL_TONEMAP_S
++    Ltm *mLtm;
++    // LOCAL_TONEMAP_E
++    enum AiqUnitState {
++        AIQ_UNIT_NOT_INIT = 0,
++        AIQ_UNIT_INIT,
++        AIQ_UNIT_CONFIGURED,
++        AIQ_UNIT_START,
++        AIQ_UNIT_STOP,
++        AIQ_UNIT_MAX
++    } mAiqUnitState;
++
++    // INTEL_DVS_S
++    Dvs *mDvs;
++    // INTEL_DVS_E
++    AiqEngine *mAiqEngine;
++    AiqSetting *mAiqSetting;
++
++    // Guard for AiqUnit public API.
++    Mutex mAiqUnitLock;
++};
++
++} /* namespace icamera */
++
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
+new file mode 100644
+index 000000000000..b55692db6723
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
+@@ -0,0 +1,660 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqUtils"
++
++#include <math.h>
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++#include "AiqUtils.h"
++#include "AiqSetting.h"
++
++namespace icamera {
++
++#define TONEMAP_MIN_POINTS 64
++
++int AiqUtils::dumpAeResults(const ia_aiq_ae_results &aeResult)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
++        return OK;
++    }
++
++    LOG3A("@%s", __func__);
++
++    if (aeResult.exposures) {
++        for (unsigned int i = 0; i < aeResult.num_exposures; i++) {
++            if (aeResult.exposures[i].exposure) {
++                LOG3A("AE exp[%d] ag %f dg %f Fn %f time %dus total %d filter[%s] iso %d", i,
++                      aeResult.exposures[i].exposure->analog_gain,
++                      aeResult.exposures[i].exposure->digital_gain,
++                      aeResult.exposures[i].exposure->aperture_fn,
++                      aeResult.exposures[i].exposure->exposure_time_us,
++                      aeResult.exposures[i].exposure->total_target_exposure,
++                      aeResult.exposures[i].exposure->nd_filter_enabled? "YES": "NO",
++                      aeResult.exposures[i].exposure->iso);
++            }
++            if (aeResult.exposures[i].sensor_exposure) {
++                LOG3A("AE sensor exp[%d] result ag %d dg %d coarse: %d fine: %d llp:%d fll:%d", i,
++                      aeResult.exposures[i].sensor_exposure->analog_gain_code_global,
++                      aeResult.exposures[i].sensor_exposure->digital_gain_global,
++                      aeResult.exposures[i].sensor_exposure->coarse_integration_time,
++                      aeResult.exposures[i].sensor_exposure->fine_integration_time,
++                      aeResult.exposures[i].sensor_exposure->line_length_pixels,
++                      aeResult.exposures[i].sensor_exposure->frame_length_lines);
++            }
++            LOG3A(" AE Converged : %s", aeResult.exposures[i].converged ? "YES" : "NO");
++        }
++    } else {
++        LOGE("nullptr in StatsInputParams->frame_ae_parameters->exposures");
++    }
++    LOG3A("AE bracket mode = %d %s", aeResult.multiframe,
++          aeResult.multiframe == ia_aiq_bracket_mode_ull ? "ULL" : "none-ULL");
++
++    if (aeResult.weight_grid &&
++        aeResult.weight_grid->width != 0 &&
++        aeResult.weight_grid->height != 0) {
++        LOG3A("AE weight grid [%dx%d]", aeResult.weight_grid->width, aeResult.weight_grid->height);
++        if (aeResult.weight_grid->weights) {
++            for (int i = 0; i < 5 && i < aeResult.weight_grid->height; i++) {
++                LOG3A("AE weight_grid[%d] = %d ", aeResult.weight_grid->width/2,
++                      aeResult.weight_grid->weights[aeResult.weight_grid->width/2]);
++            }
++        }
++    }
++
++    if (aeResult.aperture_control) {
++        LOG3A("AE aperture fn = %f, iris command = %d, code = %d",
++              aeResult.aperture_control->aperture_fn,
++              aeResult.aperture_control->dc_iris_command,
++              aeResult.aperture_control->code);
++    }
++
++    return OK;
++}
++
++int AiqUtils::dumpAfResults(const ia_aiq_af_results &afResult)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
++        return OK;
++    }
++
++    LOG3A("@%s", __func__);
++
++    LOG3A("AF results current_focus_distance %d final_position_reached %s",
++          afResult.current_focus_distance,
++          afResult.final_lens_position_reached ? "TRUE":"FALSE");
++    LOG3A("AF results driver_action %d, next_lens_position %d",
++          afResult.lens_driver_action,
++          afResult.next_lens_position);
++    LOG3A("AF results use_af_assist %s",
++          afResult.use_af_assist? "TRUE":"FALSE");
++
++    switch (afResult.status) {
++    case ia_aiq_af_status_local_search:
++        LOG3A("AF result state _local_search");
++        break;
++    case ia_aiq_af_status_extended_search:
++        LOG3A("AF result state extended_search");
++        break;
++    case ia_aiq_af_status_success:
++        LOG3A("AF state success");
++        break;
++    case ia_aiq_af_status_fail:
++        LOG3A("AF state fail");
++        break;
++    case ia_aiq_af_status_idle:
++    default:
++        LOG3A("AF state idle");
++    }
++
++    return OK;
++}
++
++int AiqUtils::dumpAwbResults(const ia_aiq_awb_results &awbResult)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
++        return OK;
++    }
++
++    LOG3A("@%s", __func__);
++
++    LOG3A("AWB result: accurate_r/g %f, accurate_b/g %f final_r/g %f final_b/g %f",
++          awbResult.accurate_r_per_g,
++          awbResult.accurate_b_per_g,
++          awbResult.final_r_per_g,
++          awbResult.final_b_per_g);
++    LOG3A("AWB result: cct_estimate %d, distance_from_convergence %f",
++          awbResult.cct_estimate,
++          awbResult.distance_from_convergence);
++
++    return OK;
++}
++
++int AiqUtils::deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst)
++{
++    LOG3A("@%s", __func__);
++    dumpAeResults(src);
++
++    /**
++     * lets check that all the pointers are there
++     * in the source and in the destination
++     */
++    CheckError(!dst||!dst->exposures||!dst->flashes||!dst->weight_grid||!dst->weight_grid->weights
++        ,BAD_VALUE ,"Failed to deep copy AE result- invalid destination");
++
++    CheckError(!src.exposures||!src.flashes||!src.weight_grid||!src.weight_grid->weights
++        ,BAD_VALUE ,"Failed to deep copy AE result- invalid source");
++
++    dst->lux_level_estimate = src.lux_level_estimate;
++    dst->flicker_reduction_mode = src.flicker_reduction_mode;
++    dst->multiframe = src.multiframe;
++    dst->num_flashes = src.num_flashes;
++    dst->num_exposures = src.num_exposures;
++    if (src.aperture_control) {
++        *dst->aperture_control = *src.aperture_control;
++    }
++    for (unsigned int i = 0; i < dst->num_exposures; i++)
++    {
++        dst->exposures[i].converged = src.exposures[i].converged;
++        dst->exposures[i].distance_from_convergence = src.exposures[i].distance_from_convergence;
++        dst->exposures[i].exposure_index = src.exposures[i].exposure_index;
++        if (src.exposures[i].exposure) {
++            *dst->exposures[i].exposure = *src.exposures[i].exposure;
++        }
++        if (src.exposures[i].sensor_exposure) {
++            *dst->exposures[i].sensor_exposure = *src.exposures[i].sensor_exposure;
++        }
++    }
++
++    // Copy weight grid
++    dst->weight_grid->width = src.weight_grid->width;
++    dst->weight_grid->height = src.weight_grid->height;
++
++    unsigned int gridElements  = src.weight_grid->width *
++                                 src.weight_grid->height;
++    gridElements = CLIP(gridElements, MAX_AE_GRID_SIZE, 1);
++    MEMCPY_S(dst->weight_grid->weights, gridElements*sizeof(char),
++             src.weight_grid->weights, gridElements*sizeof(char));
++
++    // Copy the flash info structure
++    MEMCPY_S(dst->flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters),
++             src.flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters));
++
++    return OK;
++}
++
++int AiqUtils::deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst)
++{
++    LOG3A("@%s", __func__);
++    dumpAfResults(src);
++
++    CheckError(!dst, BAD_VALUE, "Failed to deep copy Af result- invalid destination or Source");
++
++    MEMCPY_S(dst, sizeof(ia_aiq_af_results), &src, sizeof(ia_aiq_af_results));
++    return OK;
++}
++
++int AiqUtils::deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst)
++{
++    LOG3A("@%s", __func__);
++    dumpAwbResults(src);
++
++    CheckError(!dst, BAD_VALUE, "Failed to deep copy Awb result- invalid destination or Source");
++
++    MEMCPY_S(dst, sizeof(ia_aiq_awb_results), &src, sizeof(ia_aiq_awb_results));
++    return OK;
++}
++
++int AiqUtils::deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst||!dst->r_gamma_lut||!dst->g_gamma_lut||!dst->b_gamma_lut||!dst->tone_map_lut
++        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid destination");
++    CheckError(!src.r_gamma_lut||!src.g_gamma_lut||!src.b_gamma_lut
++        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid source");
++
++    MEMCPY_S(dst->r_gamma_lut, src.gamma_lut_size*sizeof(float),
++             src.r_gamma_lut, src.gamma_lut_size*sizeof(float));
++
++    MEMCPY_S(dst->g_gamma_lut, src.gamma_lut_size*sizeof(float),
++             src.g_gamma_lut, src.gamma_lut_size*sizeof(float));
++
++    MEMCPY_S(dst->b_gamma_lut, src.gamma_lut_size*sizeof(float),
++             src.b_gamma_lut, src.gamma_lut_size*sizeof(float));
++
++    dst->gamma_lut_size = src.gamma_lut_size;
++
++    // Copy tone mapping table
++    if (src.tone_map_lut != nullptr)
++    {
++        MEMCPY_S(dst->tone_map_lut, src.tone_map_lut_size * sizeof(float),
++                 src.tone_map_lut, src.tone_map_lut_size * sizeof(float));
++
++    }
++    dst->tone_map_lut_size = src.tone_map_lut_size; // zero indicates GBCE is ineffective.
++
++    return OK;
++}
++
++int AiqUtils::deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
++                                ia_aiq_advanced_ccm_t* preferredAcm)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst, BAD_VALUE ,"Failed to deep copy PA result- invalid destination");
++
++    MEMCPY_S(dst->color_conversion_matrix, sizeof(dst->color_conversion_matrix),
++             src.color_conversion_matrix, sizeof(src.color_conversion_matrix));
++    for (unsigned int i = 0; i < 4; i++)
++        for (unsigned int j = 0; j < 4; j++)
++            dst->black_level_4x4[i][j] = src.black_level_4x4[i][j];
++    dst->color_gains = src.color_gains;
++    dst->saturation_factor = src.saturation_factor;
++    dst->brightness_level = src.brightness_level;
++
++    if (src.ir_weight) {
++        unsigned long int irSize = src.ir_weight->width * src.ir_weight->height;
++        if (irSize) {
++            LOG3A("%s irSize = %ld", __func__, irSize);
++            MEMCPY_S(dst->ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short),
++                     src.ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short));
++            MEMCPY_S(dst->ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short),
++                     src.ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short));
++            MEMCPY_S(dst->ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short),
++                     src.ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short));
++            dst->ir_weight->width = src.ir_weight->width;
++            dst->ir_weight->height = src.ir_weight->height;
++        }
++    }
++
++    if (src.preferred_acm && src.preferred_acm->sector_count) {
++        dst->preferred_acm = preferredAcm;
++
++        LOG3A("%s advanced ccm sector count = %d", __func__, src.preferred_acm->sector_count);
++        MEMCPY_S(dst->preferred_acm->hue_of_sectors,
++                 src.preferred_acm->sector_count * sizeof(unsigned int),
++                 src.preferred_acm->hue_of_sectors,
++                 src.preferred_acm->sector_count * sizeof(unsigned int));
++        MEMCPY_S(dst->preferred_acm->advanced_color_conversion_matrices,
++                 src.preferred_acm->sector_count * sizeof(float[3][3]),
++                 src.preferred_acm->advanced_color_conversion_matrices,
++                 src.preferred_acm->sector_count  * sizeof(float[3][3]));
++        dst->preferred_acm->sector_count = src.preferred_acm->sector_count;
++    } else {
++        dst->preferred_acm = nullptr;
++    }
++
++    /* current linearization.size is zero, set related pointers to nullptr */
++    dst->linearization.r = nullptr;
++    dst->linearization.gr = nullptr;
++    dst->linearization.gb = nullptr;
++    dst->linearization.b = nullptr;
++    dst->linearization.size = 0;
++
++    return OK;
++}
++
++int AiqUtils::deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM result- invalid destination");
++
++    MEMCPY_S(dst, sizeof(ia_ltm_results), &src, sizeof(ia_ltm_results));
++
++    return OK;
++}
++
++int AiqUtils::deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM DRC params- invalid destination");
++
++    MEMCPY_S(dst, sizeof(ia_ltm_drc_params), &src, sizeof(ia_ltm_drc_params));
++
++    return OK;
++}
++
++int AiqUtils::deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst, BAD_VALUE, "Failed to deep copy SA result- invalid destination");
++
++    const size_t gridSize = src.width * src.height;
++    if ((size_t)(dst->width * dst->height) < gridSize) {
++        LOG3A("%s: increases the size of LSC table from %dx%d to %dx%d.",
++              __func__, dst->width, dst->height, src.width, src.height);
++
++        // allocated buffer is too small to accomodate what SA returns.
++        for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
++            for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
++                // re-allocate
++                delete [] dst->lsc_grid[i][j];
++                dst->lsc_grid[i][j] = new unsigned short[gridSize];
++
++                // copy a table
++                if (src.lsc_grid[i][j]) {
++                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
++                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
++                }
++            }
++        }
++    } else {
++        // copy tables
++        for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
++            for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
++                if (dst->lsc_grid[i][j] && src.lsc_grid[i][j]) {
++                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
++                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
++                }
++            }
++        }
++    }
++
++    dst->width = src.width;
++    dst->height = src.height;
++    dst->lsc_update = src.lsc_update;
++    dst->fraction_bits = src.fraction_bits;
++    dst->color_order = src.color_order;
++
++    MEMCPY_S(dst->light_source, sizeof(dst->light_source), src.light_source, sizeof(src.light_source));
++    MEMCPY_S(&dst->frame_params, sizeof(dst->frame_params), &src.frame_params, sizeof(src.frame_params));
++
++    return OK;
++}
++
++int AiqUtils::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
++          || !dst->xcoords_uv || !dst->ycoords_uv
++          || !dst->xcoords_uv_float || !dst->ycoords_uv_float
++          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
++
++    CheckError(!src.xcoords_y || !src.ycoords_y
++          || !src.xcoords_uv || !src.ycoords_uv
++          || !src.xcoords_uv_float || !src.ycoords_uv_float
++          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source");
++
++    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0
++          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
++          src.width_y, src.height_y, src.width_uv, src.height_uv);
++
++    dst->width_y = src.width_y;
++    dst->height_y = src.height_y;
++    dst->width_uv = src.width_uv;
++    dst->height_uv = src.height_uv;
++    dst->morph_table_changed = src.morph_table_changed;
++    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
++    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
++    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
++    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
++    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
++    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
++
++    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
++    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
++    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
++
++    return OK;
++}
++
++int AiqUtils::deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst)
++{
++    LOG3A("%s", __func__);
++
++    CheckError(!dst,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
++
++    dst->num_homography_matrices = src.num_homography_matrices;
++    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
++
++    return OK;
++}
++
++int AiqUtils::convertError(ia_err iaErr)
++{
++    LOG3A("%s, iaErr = %d", __func__, iaErr);
++    switch (iaErr) {
++    case ia_err_none:
++        return OK;
++    case ia_err_general:
++        return UNKNOWN_ERROR;
++    case ia_err_nomemory:
++        return NO_MEMORY;
++    case ia_err_data:
++        return BAD_VALUE;
++    case ia_err_internal:
++        return INVALID_OPERATION;
++    case ia_err_argument:
++        return BAD_VALUE;
++    default:
++        return UNKNOWN_ERROR;
++    }
++}
++
++/**
++ * Convert SensorFrameParams defined in PlatformData to ia_aiq_frame_params in aiq
++ */
++void AiqUtils::convertToAiqFrameParam(const SensorFrameParams &sensor, ia_aiq_frame_params &aiq)
++{
++    aiq.cropped_image_height = sensor.cropped_image_height;
++    aiq.cropped_image_width = sensor.cropped_image_width;
++    aiq.horizontal_crop_offset = sensor.horizontal_crop_offset;
++    aiq.horizontal_scaling_denominator = sensor.horizontal_scaling_denominator;
++    aiq.horizontal_scaling_numerator = sensor.horizontal_scaling_numerator;
++    aiq.vertical_crop_offset = sensor.vertical_crop_offset;
++    aiq.vertical_scaling_denominator = sensor.vertical_scaling_denominator;
++    aiq.vertical_scaling_numerator = sensor.vertical_scaling_numerator;
++}
++
++camera_coordinate_t AiqUtils::convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
++                                                      const camera_coordinate_system_t& dstSystem,
++                                                      const camera_coordinate_t& srcCoordinate)
++{
++    int dstWidth = dstSystem.right - dstSystem.left;
++    int dstHeight = dstSystem.bottom - dstSystem.top;
++    int srcWidth = srcSystem.right - srcSystem.left;
++    int srcHeight = srcSystem.bottom - srcSystem.top;
++
++    camera_coordinate_t result;
++    result.x = (srcCoordinate.x - srcSystem.left) * dstWidth / srcWidth + dstSystem.left;
++    result.y = (srcCoordinate.y - srcSystem.top) * dstHeight / srcHeight + dstSystem.top;
++
++    return result;
++}
++
++camera_coordinate_t AiqUtils::convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
++                                                    const camera_coordinate_t& srcCoordinate)
++{
++    camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
++                                               IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
++
++    return convertCoordinateSystem(srcSystem, iaCoordinate, srcCoordinate);
++}
++
++camera_window_t AiqUtils::convertToIaWindow(const camera_coordinate_system_t& srcSystem,
++                                            const camera_window_t& srcWindow)
++{
++    camera_coordinate_t leftTop;
++    camera_coordinate_t rightBottom;
++    leftTop.x     = srcWindow.left;
++    leftTop.y     = srcWindow.top;
++    rightBottom.x = srcWindow.right;
++    rightBottom.y = srcWindow.bottom;
++    leftTop       = convertToIaCoordinate(srcSystem, leftTop);
++    rightBottom   = convertToIaCoordinate(srcSystem, rightBottom);
++
++    camera_window_t result;
++    result.left   = leftTop.x;
++    result.top    = leftTop.y;
++    result.right  = rightBottom.x;
++    result.bottom = rightBottom.y;
++    result.weight = srcWindow.weight;
++    return result;
++}
++
++/**
++ * Map user input manual gain(0, 255) to (AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END)
++ */
++float AiqUtils::normalizeAwbGain(int gain)
++{
++    gain = CLIP(gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
++    return AWB_GAIN_NORMALIZED_START + (float)(gain - AWB_GAIN_MIN) * \
++                                       AWB_GAIN_RANGE_NORMALIZED / AWB_GAIN_RANGE_USER;
++}
++
++int AiqUtils::convertToUserAwbGain(float normalizedGain)
++{
++    normalizedGain = CLIP(normalizedGain, AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END);
++    return AWB_GAIN_MIN + (normalizedGain - AWB_GAIN_NORMALIZED_START) * \
++                          AWB_GAIN_RANGE_USER / AWB_GAIN_RANGE_NORMALIZED;
++}
++
++float AiqUtils::convertSpeedModeToTime(camera_converge_speed_t mode)
++{
++    float convergenceTime = -1;
++    /*
++     * The unit of manual_convergence_time is second, and 3.0 means 3 seconds.
++     * The default value can be changed based on customer requirement.
++     */
++    switch (mode) {
++        case CONVERGE_MID:
++            convergenceTime = 3.0;
++            break;
++        case CONVERGE_LOW:
++            convergenceTime = 5.0;
++            break;
++        case CONVERGE_NORMAL:
++        default:
++            convergenceTime = -1;
++            break;
++    }
++    return convergenceTime;
++}
++
++/*
++ * Get ia_aiq_frame_use
++ *
++ * Convert frame usage to ia_aiq_frame_use
++ */
++ia_aiq_frame_use AiqUtils::convertFrameUsageToIaFrameUsage(int frameUsage)
++{
++    switch (frameUsage) {
++        case FRAME_USAGE_VIDEO:
++            return ia_aiq_frame_use_video;
++        case FRAME_USAGE_STILL:
++            return ia_aiq_frame_use_still;
++        case FRAME_USAGE_CONTINUOUS:
++            return ia_aiq_frame_use_continuous;
++    }
++    return ia_aiq_frame_use_preview;
++}
++
++void AiqUtils::applyTonemapGamma(float gamma, ia_aiq_gbce_results* results) {
++    CheckError(gamma < EPSILON, VOID_VALUE, "Bad gamma %f", gamma);
++    CheckError(!results, VOID_VALUE, "gbce results nullptr");
++
++    int lutSize = results->gamma_lut_size;
++    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
++    for (int i = 0; i < lutSize; i++) {
++        results->g_gamma_lut[i] = pow(i / static_cast<float>(lutSize), 1 / gamma);
++    }
++
++    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++}
++
++void AiqUtils::applyTonemapSRGB(ia_aiq_gbce_results* results) {
++    CheckError(!results, VOID_VALUE, "gbce results nullptr");
++
++    int lutSize = results->gamma_lut_size;
++    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
++    for (int i = 0; i < lutSize; i++) {
++        if (i / (lutSize - 1)  < 0.0031308)
++            results->g_gamma_lut[i] = 12.92 * (i / (lutSize - 1));
++        else
++            results->g_gamma_lut[i] =
++                    1.055 * pow(i / static_cast<float>(lutSize - 1), 1 / 2.4) - 0.055;
++    }
++
++    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++}
++
++void AiqUtils::applyTonemapREC709(ia_aiq_gbce_results* results) {
++    CheckError(!results, VOID_VALUE, "gbce results nullptr");
++
++    int lutSize = results->gamma_lut_size;
++    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
++    for (int i = 0; i < lutSize; i++) {
++        if (i / (lutSize - 1) < 0.018)
++            results->g_gamma_lut[i] = 4.5 * (i / (lutSize - 1));
++        else
++            results->g_gamma_lut[i] =
++                    1.099 * pow(i / static_cast<float>(lutSize - 1), 0.45) - 0.099;
++    }
++
++    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
++             results->g_gamma_lut, lutSize * sizeof(float));
++}
++
++float AiqUtils::calculateHyperfocalDistance(const ia_cmc_t &cmcData) {
++    LOG2("@%s", __func__);
++
++    float pixelSizeMicro = 100.0f;  // size of pixels in um, default to avoid division by 0
++    float focalLengthMillis = 0.0f;
++    const float DEFAULT_HYPERFOCAL_DISTANCE = 5000.0f;
++
++    cmc_optomechanics_t *optoInfo = cmcData.cmc_parsed_optics.cmc_optomechanics;
++    if (optoInfo) {
++        // Pixel size is stored in CMC in hundreds of micrometers
++        pixelSizeMicro = optoInfo->sensor_pix_size_h / 100;
++        // focal length is stored in CMC in hundreds of millimeters
++        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
++    }
++
++    // fixed aperture, the fn should be divided 100 because the value
++    // is multiplied 100 in cmc avoid division by 0
++    if (!cmcData.cmc_parsed_optics.lut_apertures ||
++        cmcData.cmc_parsed_optics.lut_apertures[0] == 0) {
++        LOG2("lut apertures is not provided or zero in the cmc. Using default");
++        return DEFAULT_HYPERFOCAL_DISTANCE;
++    }
++
++    float fNumber = static_cast<float>(cmcData.cmc_parsed_optics.lut_apertures[0]) / 100;
++    // assuming square pixel
++    const int CIRCLE_OF_CONFUSION_IN_PIXELS = 2;
++    float cocMicros = pixelSizeMicro * CIRCLE_OF_CONFUSION_IN_PIXELS;
++    float hyperfocalDistanceMillis = 1000 * (focalLengthMillis * focalLengthMillis) /
++                                     (fNumber * cocMicros);
++
++    return (hyperfocalDistanceMillis == 0.0f) ? DEFAULT_HYPERFOCAL_DISTANCE :
++                                                hyperfocalDistanceMillis;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.h b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
+new file mode 100644
+index 000000000000..7def8de88ddb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
+@@ -0,0 +1,185 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "PlatformData.h"
++#include "Parameters.h"
++#include "ia_aiq.h"
++#include "ia_ltm_types.h"
++#include "ia_dvs_types.h"
++#include "ia_isp_bxt_statistics_types.h"
++
++namespace icamera {
++
++/*!> Top limit for the RGBS grid size */
++static const unsigned int MAX_AE_GRID_SIZE = 2048;
++/*!> Number of leds AEC algorithm provides output for */
++static const unsigned int MAX_EXPOSURES_NUM = 3;
++static const unsigned int NUM_FLASH_LEDS = 1;
++static const unsigned int MAX_GAMMA_LUT_SIZE = 2048;
++static const unsigned int MAX_TONEMAP_LUT_SIZE = 2048;
++
++static const unsigned int MAX_STATISTICS_WIDTH = BXT_RGBS_GRID_MAX_WIDTH;
++static const unsigned int MAX_STATISTICS_HEIGHT = BXT_RGBS_GRID_MAX_HEIGHT;
++
++static const unsigned int MAX_LSC_WIDTH = 100;
++static const unsigned int MAX_LSC_HEIGHT = 100;
++
++static const unsigned int MAX_IR_WEIGHT_GRID_SIZE = 480;
++static const unsigned int MAX_NUM_SECTORS = 36;
++
++static const int MAX_BAYER_ORDER_NUM = 4;
++
++/*! \brief Definitions of IA imaging coordinate system. */
++static const unsigned int IA_COORDINATE_TOP = 0;
++static const unsigned int IA_COORDINATE_LEFT = 0;
++static const unsigned int IA_COORDINATE_BOTTOM = 8192;
++static const unsigned int IA_COORDINATE_RIGHT = 8192;
++static const unsigned int IA_COORDINATE_WIDTH = (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
++static const unsigned int IA_COORDINATE_HEIGHT = (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
++
++/**
++ *  The normalized awb gain range is (4.0, 1.0) which is just experimental.
++ *  TODO: Maybe need put them in configuration file later.
++ */
++static const int AWB_GAIN_NORMALIZED_START = 4.0;
++static const int AWB_GAIN_NORMALIZED_END = 1.0;
++static const int AWB_GAIN_RANGE_NORMALIZED = AWB_GAIN_NORMALIZED_END - AWB_GAIN_NORMALIZED_START;
++
++static const float AWB_GAIN_MIN = 0;
++static const float AWB_GAIN_MAX = 255;
++static const float AWB_GAIN_RANGE_USER = AWB_GAIN_MAX - AWB_GAIN_MIN;
++
++static const int MAX_CUSTOM_CONTROLS_PARAM_SIZE = 1024;
++
++namespace AiqUtils {
++int dumpAeResults(const ia_aiq_ae_results &aeResult);
++int dumpAfResults(const ia_aiq_af_results &afResult);
++int dumpAwbResults(const ia_aiq_awb_results &awbResult);
++
++int deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst);
++int deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst);
++int deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst);
++int deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst);
++int deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
++                      ia_aiq_advanced_ccm_t* preferredAcm);
++int deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst);
++int deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst);
++int deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst);
++int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
++int deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst);
++
++int convertError(ia_err iaErr);
++
++void convertToAiqFrameParam(const SensorFrameParams& sensor, ia_aiq_frame_params& aiq);
++
++camera_coordinate_t convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
++                                            const camera_coordinate_system_t& dstSystem,
++                                            const camera_coordinate_t& srcCoordinate);
++camera_coordinate_t convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
++                                          const camera_coordinate_t& srcCoordinate);
++camera_window_t convertToIaWindow(const camera_coordinate_system_t& srcSystem,
++                                  const camera_window_t& srcWindow);
++float normalizeAwbGain(int gain);
++int convertToUserAwbGain(float normalizedGain);
++float convertSpeedModeToTime(camera_converge_speed_t mode);
++
++ia_aiq_frame_use convertFrameUsageToIaFrameUsage(int frameUsage);
++
++void applyTonemapGamma(float gamma, ia_aiq_gbce_results* results);
++void applyTonemapSRGB(ia_aiq_gbce_results* results);
++void applyTonemapREC709(ia_aiq_gbce_results* results);
++
++// Resize a 2D array with linear interpolation
++// For some cases, we need to upscale or downscale a 2D array.
++// For example, Android requests lensShadingMapSize must be smaller than 64*64,
++// but for some sensors, the lens shading map is bigger than this, so need to do resize.
++/* Value of 8 is maximum in order to avoid overflow with 16-bit inputs */
++#define FRAC_BITS_CURR_LOC 8
++#define FRAC_BASE (short)(1) << FRAC_BITS_CURR_LOC
++
++/*!
++ * \brief Resize a 2D array with linear interpolation.
++ *
++ * @param[in,out]
++ *  in a_src                pointer to input array (width-major)
++ *  in a_src_w              width of the input array
++ *  in a_src_h              height of the input array
++ *  in a_dst                pointer to output array (width-major)
++ *  in a_dst_w              width of the output array
++ *  in a_dst_h              height of the output array
++ */
++template <typename T> int resize2dArray(
++    const T* a_src, int a_src_w, int a_src_h,
++    T* a_dst, int a_dst_w, int a_dst_h) {
++    int i, j, step_size_w, step_size_h, rounding_term;
++
++    if (a_src_w < 2 || a_dst_w < 2 || a_src_h < 2 || a_dst_h < 2) {
++        return  -1;
++    }
++    nsecs_t startTime = CameraUtils::systemTime();
++    step_size_w = ((a_src_w - 1) << FRAC_BITS_CURR_LOC) / (a_dst_w - 1);
++    step_size_h = ((a_src_h - 1) << FRAC_BITS_CURR_LOC) / (a_dst_h - 1);
++    rounding_term = (1 << (2 * FRAC_BITS_CURR_LOC - 1));
++    for (j = 0; j < a_dst_h; ++j) {
++        unsigned int curr_loc_h, curr_loc_lower_h;
++        curr_loc_h = j * step_size_h;
++        curr_loc_lower_h = (curr_loc_h > 0) ? (curr_loc_h - 1) >> FRAC_BITS_CURR_LOC : 0;
++
++        for (i = 0; i < a_dst_w; ++i) {
++            unsigned int curr_loc_w, curr_loc_lower_w;
++
++            curr_loc_w = i * step_size_w;
++            curr_loc_lower_w = (curr_loc_w > 0) ? (curr_loc_w - 1) >> FRAC_BITS_CURR_LOC : 0;
++
++            a_dst[a_dst_w * j + i] =
++                (a_src[curr_loc_lower_w + curr_loc_lower_h * a_src_w]  *
++                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
++                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
++                a_src[curr_loc_lower_w + 1 + curr_loc_lower_h * a_src_w] *
++                        (curr_loc_w-((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
++                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
++                a_src[curr_loc_lower_w + (curr_loc_lower_h + 1) * a_src_w]  *
++                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
++                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC)) +
++                a_src[curr_loc_lower_w + 1 + (curr_loc_lower_h + 1) * a_src_w] *
++                        (curr_loc_w - ((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
++                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC))
++                + rounding_term) / (FRAC_BASE * FRAC_BASE);
++        }
++    }
++    LOG2("resize the 2D array cost %dus",
++         (unsigned)((CameraUtils::systemTime() - startTime) / 1000));
++
++    return 0;
++}
++
++template int resize2dArray<float>(
++    const float* a_src, int a_src_w, int a_src_h,
++    float* a_dst, int a_dst_w, int a_dst_h);
++template int resize2dArray<unsigned short>(
++    const unsigned short* a_src, int a_src_w, int a_src_h,
++    unsigned short* a_dst, int a_dst_w, int a_dst_h);
++template int resize2dArray<int>(
++    const int* a_src, int a_src_w, int a_src_h,
++    int* a_dst, int a_dst_w, int a_dst_h);
++
++float calculateHyperfocalDistance(const ia_cmc_t &cmcData);
++
++} // namespace AiqUtils
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.cpp b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
+new file mode 100644
+index 000000000000..2b881e526607
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
+@@ -0,0 +1,616 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Dvs"
++#include "src/3a/Dvs.h"
++
++#include <ia_cmc_parser.h>
++#include <ia_pal_types_isp_ids_autogen.h>
++
++#include <algorithm>
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Utils.h"
++#include "PlatformData.h"
++#include "AiqUtils.h"
++#include "AiqResultStorage.h"
++#include "IGraphConfigManager.h"
++#include "IGraphConfig.h"
++
++namespace icamera {
++
++const int DVS_MIN_ENVELOPE = 12;
++const float QUATERNION_CLIP_MAX_ANGLE = 3.5f;
++
++const int DVS_OXDIM_Y = 128;
++const int DVS_OYDIM_Y = 32;
++const int DVS_OXDIM_UV  = 64;
++const int DVS_OYDIM_UV  = 16;
++
++Dvs::Dvs(int cameraId, AiqSetting *setting) :
++    mDvsHandle(nullptr),
++    mDvsEnabled(false),
++    mLdcEnabled(false),
++    mRscEnabled(false),
++    mDigitalZoomRatio(1.0f),
++    mCameraId(cameraId),
++    mFps(30),
++    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
++    mTuningMode(TUNING_MODE_VIDEO),
++    mAiqSetting(setting),
++    mKernelId(0),
++    mMorphTable(nullptr),
++    mStatistics(nullptr),
++    mConfigured(false) {
++    LOG1("@%s", __func__);
++
++    CLEAR(mSrcResolution);
++    CLEAR(mDstResolution);
++    CLEAR(mEnvelopeResolution);
++    CLEAR(mImage_transformation);
++
++    mIntelDvs = new IntelDvs();
++}
++
++Dvs::~Dvs() {
++    LOG1("@%s", __func__);
++    delete mIntelDvs;
++}
++
++int Dvs::initDvsHandle(TuningMode tuningMode) {
++    ia_binary_data aiqData;
++    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
++    int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, &aiqData, nullptr,
++                                         &cmcHandle, tuningMode);
++    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
++
++    ia_err err = mIntelDvs->init(aiqData, reinterpret_cast<ia_cmc_t*>(cmcHandle), &mDvsHandle);
++    CheckError(err != ia_err_none, NO_INIT, "@%s, Failed to initilize IntelDvs", __func__);
++
++    return OK;
++}
++
++int Dvs::deinitDvsHandle() {
++    int status = deInitDVSTable();
++    if (mDvsHandle) {
++        mIntelDvs->deinit(mDvsHandle);
++        mDvsHandle = nullptr;
++    }
++
++    return status;
++}
++
++int Dvs::init() {
++    LOG1("@%s", __func__);
++
++    return OK;
++}
++
++int Dvs::deinit() {
++    LOG1("@%s", __func__);
++    AutoMutex l(mLock);
++
++    return deinitDvsHandle();
++}
++
++int Dvs::configure(const std::vector<ConfigMode>& configModes) {
++    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
++    AutoMutex l(mLock);
++    mConfigured = false;
++    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
++
++    if (configModes.empty()) {
++        return UNKNOWN_ERROR;
++    }
++    mConfigMode = configModes[0];
++
++    TuningMode tuningMode;
++    if (PlatformData::getTuningModeByConfigMode(mCameraId, mConfigMode, tuningMode) != OK) {
++        return UNKNOWN_ERROR;
++    }
++    mTuningMode = tuningMode;
++
++    mKernelId = 0;
++    CLEAR(mSrcResolution);
++    CLEAR(mDstResolution);
++
++    return reconfigure();
++}
++
++int Dvs::configure(TuningMode tuningMode, uint32_t kernelId,
++                   int srcWidth, int srcHeight, int dstWidth, int dstHeight) {
++    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
++    AutoMutex l(mLock);
++    mConfigured = false;
++    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
++
++    mTuningMode = tuningMode;
++    mKernelId = kernelId;
++    mSrcResolution.width = srcWidth;
++    mSrcResolution.height = srcHeight;
++    mDstResolution.width = dstWidth;
++    mDstResolution.height = dstHeight;
++
++    return reconfigure();
++}
++
++int Dvs::setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config) {
++    config->num_axis = mDvsEnabled ? ia_dvs_algorithm_6_axis : ia_dvs_algorithm_0_axis;
++
++    /* General setting for dvs */
++    config->source_bq.width_bq = mSrcResolution.width / 2;
++    config->source_bq.height_bq = mSrcResolution.height / 2;
++    config->output_bq.width_bq = mDstResolution.width / 2;
++    config->output_bq.height_bq = mDstResolution.height / 2;
++    // if the DstResolution is valid, the output_bq from dstResolution.
++    if (mDstResolution.width != 0 && mDstResolution.height != 0) {
++        config->output_bq.width_bq = mDstResolution.width / 2;
++        config->output_bq.height_bq = mDstResolution.height / 2;
++    }
++    config->ispfilter_bq.width_bq = DVS_MIN_ENVELOPE / 2;
++    config->ispfilter_bq.height_bq = DVS_MIN_ENVELOPE / 2;
++
++    // config->num_axis = ia_dvs_algorithm_0_axis;
++    config->gdc_shift_x = 0;
++    config->gdc_shift_y = 0;
++
++    if (kernelId == ia_pal_uuid_isp_gdc3_1) {
++        config->oxdim_y = DVS_OXDIM_Y;
++        config->oydim_y = DVS_OYDIM_Y;
++        config->oxdim_uv = DVS_OXDIM_UV;
++        config->oydim_uv = DVS_OYDIM_UV;
++    } else {
++        config->oxdim_y = DVS_OXDIM_Y / 2;
++        config->oydim_y = DVS_OYDIM_Y;
++        config->oxdim_uv = DVS_OXDIM_UV;
++        config->oydim_uv = DVS_OYDIM_UV;
++    }
++
++    config->hw_config.scan_mode = ia_dvs_gdc_scan_mode_stb;
++    config->hw_config.interpolation = ia_dvs_gdc_interpolation_bci;
++    config->hw_config.performance_point = ia_dvs_gdc_performance_point_1x1;
++
++    config->gdc_buffer_config.x_offset = 0;
++    config->gdc_buffer_config.y_offset = 0;
++    config->gdc_buffer_config.width = config->source_bq.width_bq;
++    config->gdc_buffer_config.height = config->source_bq.height_bq;
++    config->frame_rate = mFps;
++    config->validate_morph_table = false;
++
++    /*
++     * cropping from the active pixel array, needs to be coming from history
++     */
++    config->crop_params.horizontal_crop_offset = 0;
++    config->crop_params.vertical_crop_offset = 0;
++    config->crop_params.cropped_width = 0;
++    config->crop_params.cropped_height = 0;
++    config->quaternion_clip_max_angle = QUATERNION_CLIP_MAX_ANGLE;
++
++    const float Max_Ratio = 1.45f;
++    int bq_max_width = static_cast<int>(Max_Ratio * static_cast<float>(config->output_bq.width_bq));
++    int bq_max_height =
++                      static_cast<int>(Max_Ratio * static_cast<float>(config->output_bq.height_bq));
++
++    config->envelope_bq.width_bq = mEnvelopeResolution.width / 2 - config->ispfilter_bq.width_bq;
++    config->envelope_bq.height_bq = mEnvelopeResolution.height / 2 - config->ispfilter_bq.height_bq;
++    // envelope should be larger than 0
++    config->envelope_bq.width_bq = max(0, config->envelope_bq.width_bq);
++    config->envelope_bq.height_bq = max(0, config->envelope_bq.height_bq);
++
++    if (config->source_bq.width_bq - config->envelope_bq.width_bq -
++        config->ispfilter_bq.width_bq > bq_max_width)
++        config->envelope_bq.width_bq =
++            config->source_bq.width_bq - config->ispfilter_bq.width_bq - bq_max_width;
++
++    if (config->source_bq.height_bq - config->envelope_bq.height_bq -
++        config->ispfilter_bq.height_bq > bq_max_height)
++        config->envelope_bq.height_bq =
++            config->source_bq.height_bq - config->ispfilter_bq.height_bq - bq_max_height;
++
++    if (mLdcEnabled) {
++        // The crop must be set in LDC function, or there is config dvs fail
++        config->crop_params.cropped_width = mDstResolution.width / 2;
++        config->crop_params.cropped_height = mDstResolution.height / 2;
++        // envelope bq is only for stabilization and it has to be set as 0 when ldc enabled.
++        // TODO: clear define the envelope_bq when ldc & video stabilization enabled together
++        config->envelope_bq.width_bq = 0;
++        config->envelope_bq.height_bq = 0;
++        config->use_lens_distortion_correction = true;
++    }
++
++    if (mRscEnabled) {
++        // TODO: set config.nonblanking_ratio to inputReadoutTime/framePeriod.
++    }
++    return 0;
++}
++
++int Dvs::reconfigure() {
++    LOG1("@%s", __func__);
++
++    int status = OK;
++    uint32_t gdcKernelId = mKernelId;
++
++    // If parameters are not valid, try to query them in GC.
++    if (gdcKernelId == 0 || mSrcResolution.width == 0 || mSrcResolution.height == 0) {
++        // update GC
++        std::shared_ptr<IGraphConfig> gc = nullptr;
++
++        if (PlatformData::getGraphConfigNodes(mCameraId)) {
++            IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
++            if (GCM) {
++                gc = GCM->getGraphConfig(mConfigMode);
++            }
++        }
++        CheckWarning(gc == nullptr, OK, "Failed to get GC in DVS");
++
++        // update resolution infomation
++        ia_isp_bxt_resolution_info_t resolution;
++        status = gc->getGdcKernelSetting(&gdcKernelId, &resolution);
++        CheckWarning(status != OK, OK, "Failed to get GDC kernel setting, DVS disabled");
++        mSrcResolution.width = resolution.input_width;
++        mSrcResolution.height = resolution.input_height;
++        mDstResolution.width = resolution.output_width;
++        mDstResolution.height = resolution.output_height;
++        mEnvelopeResolution.width = resolution.input_crop.left + resolution.input_crop.right;
++        mEnvelopeResolution.height = resolution.input_crop.top + resolution.input_crop.bottom;
++    }
++    LOG1("%s, GDC kernel setting: id: %u, resolution:src: %dx%d, dst: %dx%d, envelope: %dx%d",
++         __func__, gdcKernelId, mSrcResolution.width, mSrcResolution.height, mDstResolution.width,
++         mDstResolution.height, mEnvelopeResolution.width, mEnvelopeResolution.height);
++
++    if (mDvsHandle) {
++        deinitDvsHandle();
++    }
++    status = initDvsHandle(mTuningMode);
++
++    if (!mDvsHandle)
++        return status;
++
++    ia_dvs_configuration config;
++    CLEAR(config);
++
++    setDVSConfiguration(gdcKernelId, &config);
++    dumpConfiguration(config);
++
++    CheckError(mSrcResolution.width <= (config.envelope_bq.width_bq * 2), UNKNOWN_ERROR,
++               "%s the mSrcResolution width: %d is too small", __func__, mSrcResolution.width);
++    CheckError(mSrcResolution.height <= (config.envelope_bq.height_bq * 2), UNKNOWN_ERROR,
++               "%s the mSrcResolution height: %d is too small", __func__, mSrcResolution.height);
++
++    float zoomHRatio = mSrcResolution.width /
++                       (mSrcResolution.width - config.envelope_bq.width_bq * 2);
++    float zoomVRatio = mSrcResolution.height /
++                       (mSrcResolution.height - config.envelope_bq.height_bq * 2);
++    ia_err err = mIntelDvs->config(mDvsHandle, &config,
++                                   (zoomHRatio > zoomVRatio) ? zoomHRatio : zoomVRatio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Configure DVS failed %d", err);
++
++    LOG2("Configure DVS success");
++    err = mIntelDvs->setNonBlankRatio(mDvsHandle, config.nonblanking_ratio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set non blank ratio failed %d", err);
++
++    status = initDVSTable();
++    CheckError(status != OK, UNKNOWN_ERROR, "Allocate dvs table failed");
++    mConfigured = true;
++
++    return status;
++}
++
++void Dvs::handleEvent(EventData eventData) {
++    if (eventData.type != EVENT_PSYS_STATS_BUF_READY) return;
++    if (!mConfigured) return;
++
++    LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
++    int64_t sequence = eventData.data.statsReady.sequence;
++
++    AiqResultStorage* aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
++    DvsStatistics *dvsStatistics = aiqResultStorage->getDvsStatistics();
++    if (dvsStatistics->sequence != sequence || dvsStatistics->dvsStats == nullptr) return;
++
++    // Set dvs statistics
++    {
++    AutoMutex l(mLock);
++    mStatistics = dvsStatistics->dvsStats;
++    }
++
++    // Run dvs
++    if (mAiqSetting) {
++        aiq_parameter_t aiqParam;
++        mAiqSetting->getAiqParameter(aiqParam);
++        updateParameter(aiqParam);
++    }
++
++    DvsResult *dvsResult = aiqResultStorage->acquireDvsResult();
++
++    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
++    if (feedback == nullptr) {
++        LOGW("%s: no aiq result for sequence %ld! use the latest instead", __func__, sequence);
++        feedback = aiqResultStorage->getAiqResult();
++    }
++
++    const ia_aiq_af_results *afResults = nullptr;
++    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
++        afResults = &feedback->mAfResults;
++    }
++    int ret = run(&feedback->mAeResults, afResults, dvsResult, sequence);
++    CheckError(ret != OK, VOID_VALUE, "Run DVS fail");
++
++    aiqResultStorage->updateDvsResult(sequence);
++}
++
++int Dvs::run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
++             DvsResult *result, int64_t sequence) {
++    LOG2("@%s", __func__);
++    if (!mConfigured) return OK;
++
++    PERF_CAMERA_ATRACE_IMAGING();
++    AutoMutex l(mLock);
++
++    runImpl(aeResults, afResults);
++
++    int dvsType = PlatformData::getDVSType(mCameraId);
++    switch (dvsType) {
++        case MORPH_TABLE: {
++            return getMorphTable(sequence, result);
++        }
++        case IMG_TRANS:
++            return getImageTrans(sequence, result);
++        default:
++            LOGE("not supportted dvs type");
++            return UNKNOWN_ERROR;
++    }
++}
++
++int Dvs::configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
++                              ia_coordinate *zoom_coordinate) {
++    LOG2("@%s zoom mode:%d", __func__, zoom_mode);
++    AutoMutex l(mLock);
++
++    ia_err err = mIntelDvs->setDigitalZoomMode(mDvsHandle, zoom_mode);
++    CheckError(err != ia_err_none, BAD_VALUE, "set zoom mode error: %d", err);
++
++    if (zoom_mode == ia_dvs_zoom_mode_region) {
++        err = mIntelDvs->setDigitalZoomRegion(mDvsHandle, zoom_region);
++    } else if (zoom_mode == ia_dvs_zoom_mode_coordinate) {
++        err = mIntelDvs->setDigitalZoomCoordinate(mDvsHandle, zoom_coordinate);
++    }
++
++    int ret = AiqUtils::convertError(err);
++    CheckError(ret != OK, ret, "Error config zoom: %d", ret);
++
++    return OK;
++}
++
++int Dvs::setZoomRatio(float zoomRatio) {
++    LOG2("@%s zoom:%4.2f", __func__, zoomRatio);
++    AutoMutex l(mLock);
++
++    ia_err err = mIntelDvs->setDigitalZoomMagnitude(mDvsHandle, zoomRatio);
++    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set digital zoom magnitude error: %d", err);
++
++    return OK;
++}
++
++/**
++ * Private function implementations. mLock is assumed to be held.
++ */
++
++int Dvs::initDVSTable() {
++    LOG1("@%s", __func__);
++
++    int dvsType = PlatformData::getDVSType(mCameraId);
++    switch (dvsType) {
++        case MORPH_TABLE:
++            if (mMorphTable) {
++                mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
++                mMorphTable = nullptr;
++            }
++            if (mDvsHandle) {
++                mMorphTable = mIntelDvs->allocateMorphTalbe(mDvsHandle);
++                CheckError(!mMorphTable, UNKNOWN_ERROR, "mMorphTable allocate failed");
++            }
++            break;
++        case IMG_TRANS:
++            LOG1("not need allocate MorphTable for image_transformation");
++            break;
++        default:
++            LOGE("not supportted dvs type");
++            return UNKNOWN_ERROR;
++    }
++    return OK;
++}
++
++int Dvs::deInitDVSTable() {
++    int status = OK;
++    if (mMorphTable) {
++        mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
++        mMorphTable = nullptr;
++    }
++
++    return status;
++}
++
++int Dvs::runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults) {
++    LOG2("@%s", __func__);
++    ia_err err = ia_err_none;
++    int ret = OK;
++
++    if (!mDvsHandle)
++        return UNKNOWN_ERROR;
++
++    if ((mDvsEnabled) && mStatistics && mStatistics->vector_count > 0) {
++        err = mIntelDvs->setStatistics(mDvsHandle, mStatistics,
++                                       aeResults, afResults, /*sensor events*/nullptr, 0, 0);
++        ret = AiqUtils::convertError(err);
++        CheckError(ret != OK, ret, "DVS set statistics failed: %d", ret);
++    } else if ((mDvsEnabled) && !mStatistics) {
++        return UNKNOWN_ERROR;
++    }
++
++    uint16_t focusPosition = 0;
++    if (afResults) {
++        focusPosition = static_cast<uint16_t>(afResults->next_lens_position);
++    }
++
++    err = mIntelDvs->execute(mDvsHandle, focusPosition);
++    ret = AiqUtils::convertError(err);
++    CheckError(ret != OK, ret, "DVS execution failed: %d", ret);
++
++    return OK;
++}
++
++int Dvs::getMorphTable(int64_t sequence, DvsResult *result) {
++    LOG2("@%s", __func__);
++    CheckError(!result, UNKNOWN_ERROR, "@%s, result is null", __func__);
++
++    int ret = mIntelDvs->getMorphTable(mDvsHandle, mMorphTable, result);
++    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
++    return dumpDVSTable(&result->mMorphTable, sequence);
++}
++
++int Dvs::getImageTrans(int64_t sequence, DvsResult *result) {
++    LOG2("@%s", __func__);
++
++    ia_err err = mIntelDvs->getImageTransformation(mDvsHandle, &mImage_transformation);
++    int ret = AiqUtils::convertError(err);
++    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
++    dumpDVSTable(&mImage_transformation, sequence);
++    return AiqUtils::deepCopyDvsResults(mImage_transformation, &result->mTransformation);
++}
++
++int Dvs::updateParameter(const aiq_parameter_t &param) {
++    LOG2("@%s", __func__);
++    if (!mConfigured) return OK;
++
++    bool dvsEnabled = (param.videoStabilizationMode == VIDEO_STABILIZATION_MODE_ON);
++    bool ldcEnabled = (param.ldcMode == LDC_MODE_ON);
++    bool rscEnabled = (param.rscMode == RSC_MODE_ON);
++    int digitalZoomRatio = param.digitalZoomRatio;
++
++    if ((param.fps > 0.01 && param.fps != mFps)
++        || param.tuningMode != mTuningMode
++        || dvsEnabled != mDvsEnabled || ldcEnabled != mLdcEnabled
++        || rscEnabled != mRscEnabled) {
++        mFps = param.fps > 0.01 ? param.fps : mFps;
++        mTuningMode = param.tuningMode;
++        mDvsEnabled = dvsEnabled;
++        mLdcEnabled = ldcEnabled;
++        mRscEnabled = rscEnabled;
++
++        LOG3A("%s: DVS fps = %f ", __func__, mFps);
++        LOG3A("%s: DVS tuning Mode = %d ", __func__, mTuningMode);
++        LOG3A("%s: DVS enabled = %d ", __func__, mDvsEnabled);
++        LOG3A("%s: LDC enabled = %d ", __func__, mLdcEnabled);
++        LOG3A("%s: RSC enabled = %d ", __func__, mRscEnabled);
++
++        return reconfigure();
++    }
++
++    if (param.digitalZoomRatio > 0 && param.digitalZoomRatio!= mDigitalZoomRatio) {
++        mDigitalZoomRatio = digitalZoomRatio;
++        setZoomRatio(mDigitalZoomRatio);
++        LOG3A("%s: digital zoom ratio = %f ", __func__, mDigitalZoomRatio);
++    }
++
++    return OK;
++}
++
++int Dvs::dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence) {
++    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
++
++    LOG3A("%s", __func__);
++
++    CheckError(!table, BAD_VALUE, "%s: morph table is nullptr, and nothing to dump.", __func__);
++
++    BinParam_t bParam;
++    bParam.bType = BIN_TYPE_GENERAL;
++    bParam.mType = M_PSYS;
++    bParam.sequence = sequence;
++    bParam.gParam.appendix = "dvs_morph_table_x_y";
++    CameraDump::dumpBinary(0, table->xcoords_y,
++                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
++    bParam.gParam.appendix = "dvs_morph_table_y_y";
++    CameraDump::dumpBinary(0, table->ycoords_y,
++                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
++    bParam.gParam.appendix = "dvs_morph_table_x_uv";
++    CameraDump::dumpBinary(0, table->xcoords_uv,
++                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
++    bParam.gParam.appendix = "dvs_morph_table_y_uv";
++    CameraDump::dumpBinary(0, table->ycoords_uv,
++                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
++
++    LOG3A("%s: DVS morph table y=[%d x %d], uv=[%d x %d] changed=%s", __func__,
++          table->width_y, table->height_y,
++          table->width_uv, table->height_uv,
++          table->morph_table_changed == true ? "TRUE" : "FALSE");
++    return OK;
++}
++
++int Dvs::dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence) {
++    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
++
++    LOG3A("%s", __func__);
++
++    CheckError(!trans, BAD_VALUE, "%s: trans table is nullptr, and nothing to dump.", __func__);
++
++    LOG3A("%s: DVS trans table num_homography_matrices=%d", __func__,
++            trans->num_homography_matrices);
++
++    BinParam_t bParam;
++    bParam.bType = BIN_TYPE_GENERAL;
++    bParam.mType = M_PSYS;
++    bParam.sequence = sequence;
++    for (int i = 0; i < DVS_HOMOGRAPHY_MATRIX_MAX_COUNT; i++) {
++        LOG3A("%s: DVS trans table %d start_row=%d", __func__,
++            i, trans->matrices[i].start_row);
++        bParam.gParam.appendix = "matrices";
++        CameraDump::dumpBinary(0, &trans->matrices[i].matrix, 3 * 3 * sizeof(float), &bParam);
++    }
++
++    return OK;
++}
++
++int Dvs::dumpConfiguration(ia_dvs_configuration config) {
++    LOG3A("%s", __func__);
++
++    LOG3A("config.num_axis %d", config.num_axis);
++    LOG3A("config.nonblanking_ratio %f", config.nonblanking_ratio);
++    LOG3A("config.source_bq.width_bq %d", config.source_bq.width_bq);
++    LOG3A("config.source_bq.height_bq %d", config.source_bq.height_bq);
++    LOG3A("config.output_bq.width_bq %d", config.output_bq.width_bq);
++    LOG3A("config.output_bq.height_bq %d", config.output_bq.height_bq);
++    LOG3A("config.envelope_bq.width_bq %d", config.envelope_bq.width_bq);
++    LOG3A("config.envelope_bq.height_bq %d", config.envelope_bq.height_bq);
++    LOG3A("config.ispfilter_bq.width_bq %d", config.ispfilter_bq.width_bq);
++    LOG3A("config.ispfilter_bq.height_bq %d", config.ispfilter_bq.height_bq);
++    LOG3A("config.gdc_shift_x %d", config.gdc_shift_x);
++    LOG3A("config.gdc_shift_y %d", config.gdc_shift_y);
++    LOG3A("config.oxdim_y %d", config.oxdim_y);
++    LOG3A("config.oydim_y %d", config.oydim_y);
++    LOG3A("config.oxdim_uv %d", config.oxdim_uv);
++    LOG3A("config.oydim_uv %d", config.oydim_uv);
++    LOG3A("config.hw_config.scan_mode %d", config.hw_config.scan_mode);
++    LOG3A("config.hw_config.interpolation %d", config.hw_config.interpolation);
++    LOG3A("config.hw_config.performance_point %d", config.hw_config.performance_point);
++    LOG3A("config.validate_morph_table = %s",
++          (config.validate_morph_table == true) ? "true" : "false");
++    LOG3A("config.use_lens_distortion_correction = %s",
++          (config.use_lens_distortion_correction == true) ? "true" : "false");
++
++    return OK;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.h b/camera/hal/intel/ipu6/src/3a/Dvs.h
+new file mode 100644
+index 000000000000..60901c4818ae
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/Dvs.h
+@@ -0,0 +1,119 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_dvs.h>
++#include <ia_dvs_types.h>
++#include <ia_isp_bxt.h>
++#include <memory>
++#include <vector>
++
++#include "iutils/Thread.h"
++#include "iutils/Errors.h"
++
++#include "AiqSetting.h"
++#include "CameraEvent.h"
++#include "DvsResult.h"
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelDvs.h"
++#else
++#include "modules/algowrapper/IntelDvs.h"
++#endif
++
++namespace icamera {
++struct DvsStatistics {
++    explicit DvsStatistics(ia_dvs_statistics *dvs = nullptr, int64_t seq = -1) {
++        dvsStats = dvs;
++        sequence = seq;
++    }
++    ia_dvs_statistics *dvsStats;
++    int64_t sequence;
++};
++
++/**
++ * \class Dvs
++ * Wrapper of the DVSx, provide 2 basic functionalities in video mode:
++ * 1. zoom (including center and freeform)
++ * 2. DVS
++ * The algorithm should generate the morph table to support the
++ * above functionalities.
++ */
++class Dvs : public EventListener {
++ public:
++    explicit Dvs(int cameraId, AiqSetting *setting = nullptr);
++    ~Dvs();
++
++    int init();
++    int deinit();
++    int configure(const std::vector<ConfigMode>& configMode);
++    int configure(TuningMode tuningMode, uint32_t kernelId,
++                  int srcWidth, int srcHeight, int dstWidth, int dstHeight);
++    int updateParameter(const aiq_parameter_t &param);
++    void handleEvent(EventData eventData);
++
++    int run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
++            DvsResult *result, int64_t sequence = 0);
++
++ private:
++    int configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
++                             ia_coordinate *zoom_coordinate);
++    int setZoomRatio(float zoom);
++
++    int initDvsHandle(TuningMode tuningMode);
++    int deinitDvsHandle();
++    int initDVSTable();
++    int deInitDVSTable();
++    int reconfigure();
++    int runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults);
++    int getMorphTable(int64_t sequence, DvsResult *result);
++    int getImageTrans(int64_t sequence, DvsResult *result);
++    int setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config);
++    int dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence);
++    int dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence);
++    int dumpConfiguration(ia_dvs_configuration config);
++
++ private:
++    // Guard for class Dvs public API
++    IntelDvs *mIntelDvs;
++    Mutex mLock;
++    ia_dvs_state *mDvsHandle;
++    bool mDvsEnabled;
++    bool mLdcEnabled;
++    bool mRscEnabled;
++    float mDigitalZoomRatio;
++    int mCameraId;
++    float mFps;
++    ConfigMode mConfigMode;
++    TuningMode mTuningMode;
++    AiqSetting *mAiqSetting;
++
++    uint32_t mKernelId;
++    camera_resolution_t mSrcResolution;
++    camera_resolution_t mDstResolution;
++    camera_resolution_t mEnvelopeResolution;
++
++    ia_dvs_morph_table *mMorphTable;
++    ia_dvs_image_transformation mImage_transformation;
++    ia_dvs_statistics *mStatistics;
++    bool mConfigured;
++
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(Dvs);
++};
++
++}  /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.cpp b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
+new file mode 100644
+index 000000000000..c9a80301621e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "DvsResult"
++
++#include "src/3a/DvsResult.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++
++namespace icamera {
++DvsResult::DvsResult() :
++    mSequence(-1) {
++    LOG3A("@%s", __func__);
++
++    CLEAR(mTransformation);
++    CLEAR(mMorphTable);
++    CLEAR(mDvsXcoordsY);
++    CLEAR(mDvsYcoordsY);
++    CLEAR(mDvsXcoordsUV);
++    CLEAR(mDvsYcoordsUV);
++    CLEAR(mDvsXcoordsUVFloat);
++    CLEAR(mDvsYcoordsUVFloat);
++    mMorphTable.xcoords_y = mDvsXcoordsY;
++    mMorphTable.ycoords_y = mDvsYcoordsY;
++    mMorphTable.xcoords_uv = mDvsXcoordsUV;
++    mMorphTable.ycoords_uv = mDvsYcoordsUV;
++    mMorphTable.xcoords_uv_float = mDvsXcoordsUVFloat;
++    mMorphTable.ycoords_uv_float = mDvsYcoordsUVFloat;
++}
++
++DvsResult::~DvsResult() {
++    LOG3A("@%s", __func__);
++}
++
++int DvsResult::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst) {
++    LOG3A("%s", __func__);
++
++    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
++               || !dst->xcoords_uv || !dst->ycoords_uv
++               || !dst->xcoords_uv_float || !dst->ycoords_uv_float,
++               BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
++
++    CheckError(!src.xcoords_y || !src.ycoords_y
++               || !src.xcoords_uv || !src.ycoords_uv
++               || !src.xcoords_uv_float || !src.ycoords_uv_float,
++               BAD_VALUE , "Failed to deep copy DVS result- invalid source");
++
++    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0,
++               BAD_VALUE , "Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
++               src.width_y, src.height_y, src.width_uv, src.height_uv);
++
++    dst->width_y = src.width_y;
++    dst->height_y = src.height_y;
++    dst->width_uv = src.width_uv;
++    dst->height_uv = src.height_uv;
++    dst->morph_table_changed = src.morph_table_changed;
++    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
++    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
++    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
++    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
++    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
++    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
++
++    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
++    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
++    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
++
++    return OK;
++}
++
++int DvsResult::deepCopyDvsResults(const ia_dvs_image_transformation& src,
++                                  ia_dvs_image_transformation* dst) {
++    LOG3A("%s", __func__);
++
++    CheckError(!dst, BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
++
++    dst->num_homography_matrices = src.num_homography_matrices;
++    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
++
++    return OK;
++}
++
++DvsResult &DvsResult::operator=(const DvsResult &other) {
++    deepCopyDvsResults(other.mMorphTable, &this->mMorphTable);
++    deepCopyDvsResults(other.mTransformation, &this->mTransformation);
++    mSequence = other.mSequence;
++
++    return *this;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.h b/camera/hal/intel/ipu6/src/3a/DvsResult.h
+new file mode 100644
+index 000000000000..1be7b5b3bec2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/DvsResult.h
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <ia_dvs_types.h>
++
++namespace icamera {
++static const int MAX_DVS_COORDS_Y_SIZE = 33 * 69;
++static const int MAX_DVS_COORDS_UV_SIZE = 33 * 69;
++
++class DvsResult {
++ public:
++    DvsResult();
++    ~DvsResult();
++
++    DvsResult& operator=(const DvsResult& other);
++
++    ia_dvs_morph_table mMorphTable;
++    ia_dvs_image_transformation mTransformation;
++    int64_t mSequence;
++
++    static int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
++    static int deepCopyDvsResults(const ia_dvs_image_transformation& src,
++                                  ia_dvs_image_transformation* dst);
++
++ private:
++    uint32_t mDvsXcoordsY[MAX_DVS_COORDS_Y_SIZE];
++    uint32_t mDvsYcoordsY[MAX_DVS_COORDS_Y_SIZE];
++    uint32_t mDvsXcoordsUV[MAX_DVS_COORDS_UV_SIZE];
++    uint32_t mDvsYcoordsUV[MAX_DVS_COORDS_UV_SIZE];
++    float mDvsXcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
++    float mDvsYcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
+new file mode 100644
+index 000000000000..8eaac4ab5145
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
+@@ -0,0 +1,35 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "I3AControlFactory"
++
++#include "iutils/CameraLog.h"
++#include "PlatformData.h"
++
++#include "I3AControlFactory.h"
++
++namespace icamera {
++
++AiqUnitBase *I3AControlFactory::createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw)
++{
++    LOG1("@%s cameraId = %d", __func__, cameraId);
++    if (PlatformData::isEnableAIQ(cameraId)) {
++        return new AiqUnit(cameraId, sensorHw, lensHw);
++    }
++    return new AiqUnitBase();
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
+new file mode 100644
+index 000000000000..93482cc2996c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "AiqUnit.h"
++#include "SensorHwCtrl.h"
++#include "LensHw.h"
++
++namespace icamera {
++
++/*
++ * \factory class I3AControlFactory
++ * This class is used to create the right instance of 3A unit
++ * automatically based on 3a enabled status
++ */
++class I3AControlFactory {
++public:
++    /**
++     * \brief Select the AIQ unit according to config file and compiling option
++     *
++     * \param cameraId: the camera id
++     * \param sensorHw: the hw sensor
++     * \param lensHw: the hw lens
++     *
++     * \return the AIQ unit base class
++     */
++    static AiqUnitBase *createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/ImagingControl.h b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
+new file mode 100644
+index 000000000000..74fa2289a34c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Errors.h"
++#include "AiqSetting.h"
++#include "AiqResult.h"
++
++namespace icamera {
++
++/*
++ * \interface class ImagingControl
++ * This is an interface class for imaging algorithm controllers.
++ */
++class ImagingControl {
++public:
++    virtual ~ImagingControl() {}
++
++    virtual int init() = 0;
++    virtual int deinit() = 0;
++    virtual int run(AiqResult *aiqResult, int algoType) = 0;
++
++    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
++    virtual int updateParameter(const aiq_parameter_t &param) { return OK; }
++    virtual int setFrameInfo(const ia_aiq_frame_params &frameParams) { return OK; }
++    virtual int setSensorInfo(const ia_aiq_exposure_sensor_descriptor &descriptor) { return OK; }
++    virtual int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) { return OK; }
++    virtual int getSupportedAlgoType() { return IMAGING_ALGO_NONE; }
++
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.cpp b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
+new file mode 100644
+index 000000000000..7bc95176543b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
+@@ -0,0 +1,101 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "LensManager"
++
++#include "LensManager.h"
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++#include "PlatformData.h"
++
++namespace icamera {
++
++LensManager::LensManager(int cameraId, LensHw *lensHw) :
++    mCameraId(cameraId),
++    mLensHw(lensHw),
++    mDcIrisCommand(ia_aiq_aperture_control_dc_iris_close),
++    mFocusPosition(-1)
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++}
++
++LensManager::~LensManager()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++}
++
++int LensManager::start()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++    AutoMutex l(mLock);
++
++    mDcIrisCommand = ia_aiq_aperture_control_dc_iris_close;
++    mFocusPosition = -1;
++
++    return OK;
++}
++
++int LensManager::stop()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++    AutoMutex l(mLock);
++
++    if (!mLensHw->isLensSubdevAvailable()) {
++        return OK;
++    }
++
++    return OK;
++}
++
++int LensManager::setLensResult(const ia_aiq_ae_results &aeResults,
++                               const ia_aiq_af_results &afResults)
++{
++    LOG3A("%s, mCameraId = %d", __func__, mCameraId);
++    AutoMutex l(mLock);
++
++    if (!mLensHw->isLensSubdevAvailable()) {
++        return OK;
++    }
++
++    int ret = OK;
++
++    int lensHwType = PlatformData::getLensHwType(mCameraId);
++    switch(lensHwType) {
++        case LENS_VCM_HW:
++            if (mFocusPosition != afResults.next_lens_position) {
++                ret = mLensHw->setFocusPosition(afResults.next_lens_position);
++                mFocusPosition = afResults.next_lens_position;
++                LOG3A("mFocusPosition = %d, camera id %d", mFocusPosition, mCameraId);
++                LOG2("SENSORCTRLINFO: vcm_step=%d", mFocusPosition);
++            }
++            break;
++        default:
++            LOGW("Not supported Lens HW type, lensHwType = %d", lensHwType);
++            break;
++    }
++
++    return ret;
++}
++
++void LensManager::getLensInfo(aiq_parameter_t &aiqParam) {
++
++    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
++        mLensHw->getLatestPosition(aiqParam.lensPosition, aiqParam.lensMovementStartTimestamp);
++    }
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.h b/camera/hal/intel/ipu6/src/3a/LensManager.h
+new file mode 100644
+index 000000000000..cbd1de401d28
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/LensManager.h
+@@ -0,0 +1,77 @@
++/*
++ * Copyright (C) 2016-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_aiq.h"
++
++#include "LensHw.h"
++#include "AiqSetting.h"
++
++namespace icamera {
++
++/*
++ * \class LensManager
++ * This class is used to control focus and aperture related controls.
++ */
++class LensManager {
++
++public:
++    LensManager(int cameraId, LensHw *lensHw);
++    ~LensManager();
++
++    /**
++     * \brief Called when AIQ engine is started
++     */
++    int start();
++
++    /**
++     * \brief Called when AIQ engine is stopped.
++     */
++    int stop();
++
++    /**
++     * \brief Set Lens results
++     *
++     * \param[in] ia_aiq_ae_results includes aperture result
++     *            and ia_aiq_af_results includes focus result.
++     *
++     * \return OK if set successfully.
++     */
++    int setLensResult(const ia_aiq_ae_results &aeResults,
++                      const ia_aiq_af_results &afResults);
++    /**
++     * \brief Get Lens info
++     *
++     * \param[out] aiqParam: updating lens related parameters.
++     *
++     */
++    void getLensInfo(aiq_parameter_t &aiqParam);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(LensManager);
++
++private:
++    int mCameraId;
++    LensHw *mLensHw;
++    ia_aiq_aperture_control_dc_iris_command mDcIrisCommand;
++    int mFocusPosition;
++
++    // Guard for LensManager public API.
++    Mutex mLock;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.cpp b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
+new file mode 100644
+index 000000000000..e3c0667581a9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
+@@ -0,0 +1,545 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Ltm"
++
++#include <cmath>
++#include <memory>
++
++#include "Ltm.h"
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "PlatformData.h"
++#include "AiqResultStorage.h"
++#include "AiqUtils.h"
++
++#include "ia_log.h"
++
++namespace icamera {
++
++Ltm::Ltm(int cameraId) :
++    mCameraId(cameraId),
++    mLtm(nullptr),
++    mTuningMode(TUNING_MODE_MAX),
++    mLtmState(LTM_NOT_INIT),
++    mThreadRunning(false),
++    mInputParamIndex(-1)
++{
++    CLEAR(mLtmParams);
++    CLEAR(mSisBuffer);
++    CLEAR(mLtmBinParam);
++
++    mIntelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
++    mLtmThread = new LtmThread(this);
++    LOG3A("%s", __func__);
++}
++
++Ltm::~Ltm()
++{
++    LOG3A("%s", __func__);
++    mLtmThread->join();
++    delete mLtmThread;
++}
++
++int Ltm::initLtmParams()
++{
++    for (int i = 0; i < kMaxLtmParamsNum; i++) {
++        mLtmParams[i]->ltmParams.ltm_level = ia_ltm_level_use_tuning;
++        mLtmParams[i]->ltmParams.frame_use = ia_aiq_frame_use_video;
++        mLtmParams[i]->ltmParams.ev_shift = 0;
++        mLtmParams[i]->ltmParams.ltm_strength_manual = 100;
++        mLtmParams[i]->ltmParams.gtm_input_params_ptr = &(mLtmParams[i]->gtmParams);
++
++        mLtmParams[i]->gtmParams.manual_convergence_time = -1;
++        mLtmParams[i]->gtmParams.manual_gain = -1;
++        mLtmParams[i]->gtmParams.frame_timestamp = 0;
++    }
++
++    return OK;
++}
++
++int Ltm::init()
++{
++    LOG3A("%s", __func__);
++
++    AutoMutex l(mLtmLock);
++
++    for (int i = 0; i < kMaxLtmParamsNum; i++) {
++        mLtmParams[i] = new LtmInputParams;
++        mSisBuffer[i] = new SisBuffer;
++    }
++
++    initLtmParams();
++
++    mLtmState = LTM_INIT;
++
++    return OK;
++}
++
++int Ltm::deinit()
++{
++    LOG3A("%s", __func__);
++
++    deinitIaLtmHandle();
++
++    AutoMutex l(mLtmLock);
++
++    for (int i = 0; i < kMaxLtmParamsNum; i++) {
++        if (mSisBuffer[i]->sisImage.data) {
++            free(mSisBuffer[i]->sisImage.data);
++            mSisBuffer[i]->sisImage.data = nullptr;
++        }
++
++        if (mLtmParams[i]->ltmParams.input_image_ptr) {
++            free(mLtmParams[i]->ltmParams.input_image_ptr);
++            mLtmParams[i]->ltmParams.input_image_ptr = nullptr;
++        }
++
++        delete mSisBuffer[i];
++        mSisBuffer[i] = nullptr;
++
++        delete mLtmParams[i];
++        mLtmParams[i] = nullptr;
++    }
++    mLtmState = LTM_NOT_INIT;
++
++    return OK;
++}
++
++int Ltm::initIaLtmHandle(TuningMode tuningMode)
++{
++    LOG3A("%s", __func__);
++
++    ia_mkn *mkn = static_cast<ia_mkn *>(PlatformData::getMknHandle(mCameraId));
++    ia_binary_data otherData;
++    int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, nullptr, &otherData,
++                                         nullptr, tuningMode);
++    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
++    {
++        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_init", 0);
++        mLtm = mIntelLtm->init(&otherData, mkn);
++    }
++    CheckError(mLtm == nullptr, NO_INIT, "Failed to init ltm");
++
++    return OK;
++}
++
++int Ltm::deinitIaLtmHandle()
++{
++    LOG3A("%s", __func__);
++
++    if (mLtm) {
++        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_deinit", 0);
++        mIntelLtm->deinit(mLtm);
++        mLtm = nullptr;
++    }
++
++    return OK;
++}
++
++int Ltm::configure(const std::vector<ConfigMode>& configModes)
++{
++    LOG3A("%s", __func__);
++
++    TuningMode tMode = TUNING_MODE_MAX;
++    for (auto cfg : configModes) {
++        // Only support the 1st tuning mode if multiple config mode is configured.
++        if (cfg == CAMERA_STREAM_CONFIGURATION_MODE_NORMAL) {
++            tMode = TUNING_MODE_VIDEO;
++            break;
++        }
++    }
++
++    if (tMode == TUNING_MODE_MAX) {
++        return OK;
++    }
++
++    if (mLtmState == LTM_CONFIGURED && mTuningMode == tMode) {
++        return OK;
++    }
++
++    deinitIaLtmHandle();
++
++    int ret = initIaLtmHandle(tMode);
++    CheckError((ret != OK), ret, "%s, configure LTM algo failed %d", __func__, ret);
++
++    mTuningMode = tMode;
++    mLtmState = LTM_CONFIGURED;
++
++    updateTuningData();
++
++    LOG3A("%s Ltm algo is Configured", __func__);
++    return OK;
++}
++
++int Ltm::start()
++{
++    LOG1("@%s", __func__);
++    AutoMutex l(mLtmLock);
++
++    if (PlatformData::isEnableLtmThread(mCameraId)) {
++        mThreadRunning = true;
++        mLtmThread->run("ltm_thread", PRIORITY_NORMAL);
++    }
++
++    return OK;
++}
++
++void Ltm::stop()
++{
++    LOG1("@%s", __func__);
++
++    if (PlatformData::isEnableLtmThread(mCameraId)) {
++        mLtmThread->requestExit();
++        {
++            AutoMutex l(mLtmLock);
++            mThreadRunning = false;
++            mParamAvailableSignal.signal();
++        }
++        mLtmThread->requestExitAndWait();
++    }
++
++    while (!mLtmParamsQ.empty()) {
++        mLtmParamsQ.pop();
++    }
++}
++
++void Ltm::handleEvent(EventData eventData)
++{
++    if (eventData.type == EVENT_PSYS_STATS_BUF_READY) {
++        LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
++        long sequence = eventData.data.statsReady.sequence;
++        unsigned long long timestamp = TIMEVAL2USECS(eventData.data.statsReady.timestamp);
++
++        LtmStatistics *ltmStatistics = AiqResultStorage::getInstance(mCameraId)->getLtmStatistics();
++        if (ltmStatistics->sequence != sequence || ltmStatistics->yvGrid == nullptr) return;
++
++        handleLtm(ltmStatistics->yvGrid, timestamp, sequence);
++    } else if (eventData.type == EVENT_PSYS_STATS_SIS_BUF_READY) {
++        LOG3A("%s: handle EVENT_PSYS_STATS_SIS_BUF_READY", __func__);
++        handleSisLtm(eventData.buffer);
++    }
++}
++
++AiqResult *Ltm::getAiqResult(long sequence)
++{
++    long ltmSequence = sequence;
++    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
++    if (ltmSequence > 0) {
++        ltmSequence += PlatformData::getLtmGainLag(mCameraId);
++    }
++
++    LOG3A("%s, ltmSequence %ld, sequence %ld", __func__, ltmSequence, sequence);
++    AiqResult* feedback = const_cast<AiqResult*>(resultStorage->getAiqResult(ltmSequence));
++    if (feedback == nullptr) {
++        LOGW("%s: no feed back result for sequence %ld! use the latest instead",
++                __func__, ltmSequence);
++        feedback = const_cast<AiqResult*>(resultStorage->getAiqResult());
++    }
++
++    return feedback;
++}
++
++int Ltm::handleLtm(ia_isp_bxt_hdr_yv_grid_t* inputYvGrid, unsigned long long timestamp, long sequence)
++{
++    LOG3A("@%s", __func__);
++    AutoMutex l(mLtmLock);
++
++    mInputParamIndex++;
++    mInputParamIndex %= kMaxLtmParamsNum;
++
++    if (inputYvGrid) {
++        mLtmParams[mInputParamIndex]->yvGrid = *inputYvGrid;
++        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = &(mLtmParams[mInputParamIndex]->yvGrid);
++    } else {
++        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = nullptr;
++    }
++
++    AiqResult* feedback = getAiqResult(sequence);
++    updateParameter(feedback->mAiqParam, timestamp);
++
++    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
++        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
++        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
++
++        runLtm(&(feedback->mAeResults), ltmResult);
++        resultStorage->updateLtmResult(sequence);
++        updateTuningData();
++    } else {
++        mLtmParams[mInputParamIndex]->sequence = sequence;
++        bool needSignal = mLtmParamsQ.empty();
++        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
++        if (needSignal) {
++            mParamAvailableSignal.signal();
++        }
++    }
++
++    return OK;
++}
++
++int Ltm::handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer)
++{
++    LOG3A("@%s", __func__);
++    AutoMutex l(mLtmLock);
++
++    ia_binary_data* sisFrame = (ia_binary_data*)cameraBuffer->getBufferAddr();
++    CheckError(sisFrame == nullptr, BAD_VALUE, "sis frame buffer is nullptr!");
++    int sisWidth = cameraBuffer->getWidth();
++    int sisHeight = cameraBuffer->getHeight();
++    int sequence = cameraBuffer->getSequence();
++
++    mInputParamIndex++;
++    mInputParamIndex %= kMaxLtmParamsNum;
++
++    AiqResult *feedback = getAiqResult(sequence);
++
++    int size = sisFrame->size;
++    CheckError((size <= 0), BAD_VALUE, "sis data size err!");
++
++    void *data = sisFrame->data;
++    CheckError((data == nullptr), BAD_VALUE, "sis data ptr err!");
++
++    ia_ltm_input_image *inputImagePtr = mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr;
++    if (!inputImagePtr) {
++        inputImagePtr = (ia_ltm_input_image *)malloc(sizeof(ia_ltm_input_image));
++        CheckError((inputImagePtr == nullptr), NO_INIT, "Error in initing image ptr");
++
++        memset(inputImagePtr, 0, sizeof(ia_ltm_input_image));
++        mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr = inputImagePtr;
++
++        inputImagePtr->image_info.raw_image.data_format = ia_image_data_format_rawplain16_interleaved;
++        inputImagePtr->image_info.raw_image.bayer_order = cmc_bayer_order_grbg;
++        inputImagePtr->image_info.raw_image.data_format_bpp = 16;
++        inputImagePtr->image_info.raw_image.data_bpp = 15;
++
++        mSisBuffer[mInputParamIndex]->sisPort = SIS_A;
++        mSisBuffer[mInputParamIndex]->sisImage.size = size;
++        mSisBuffer[mInputParamIndex]->sisImage.data = malloc(size);
++        CheckError((mSisBuffer[mInputParamIndex]->sisImage.data == nullptr),
++            NO_MEMORY, "sis buffer allocated failed!");
++
++        MEMCPY_S(mSisBuffer[mInputParamIndex]->sisImage.data, size, data, size);
++
++        inputImagePtr->image_data = &mSisBuffer[mInputParamIndex]->sisImage;
++        // width_cols and height_lines are quad count, need to divide 2 for them.
++        inputImagePtr->image_info.raw_image.width_cols = sisWidth / 2;
++        inputImagePtr->image_info.raw_image.height_lines = sisHeight / 2;
++
++        mLtmBinParam.sParam.gridWidth = sisWidth;
++        mLtmBinParam.sParam.gridHeight = sisHeight;
++    }
++
++    updateParameter(feedback->mAiqParam, 0);
++
++    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
++        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
++        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
++
++        runLtm(&(feedback->mAeResults), ltmResult);
++        resultStorage->updateLtmResult(sequence);
++        updateTuningData();
++    } else {
++        mLtmParams[mInputParamIndex]->sequence = sequence;
++        bool needSignal = mLtmParamsQ.empty();
++        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
++        if (needSignal) {
++            mParamAvailableSignal.signal();
++        }
++    }
++
++    return OK;
++}
++
++int Ltm::runLtm()
++{
++    LtmInputParams *inputParams = NULL;
++
++    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
++    ConditionLock lock(mLtmLock);
++
++    while(mLtmParamsQ.empty()) {
++        // To prevent possible dead lock during stop of ltm thread.
++        if (!mThreadRunning) {
++            LOG2("%s, ltm thread is not active, no need to wait ltm stat", __func__);
++            return OK;
++        }
++
++        mParamAvailableSignal.wait(lock);
++
++        if (!mThreadRunning) {
++            LOG2("%s, ltm thread is not active while waiting ltm stat", __func__);
++            return OK;
++        }
++    }
++
++    CheckError(mLtmParamsQ.empty(), UNKNOWN_ERROR, "Failed to get ltm input params buffers");
++    inputParams = mLtmParamsQ.front();
++    mLtmParamsQ.pop();
++    CheckError(!inputParams, OK, "%s, the inputParams is NULL", __func__);
++
++    ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
++    LOG1("@%s the sequence: %ld", __func__, inputParams->sequence);
++    AiqResult *feedback = getAiqResult(inputParams->sequence);
++
++    mLtmBinParam.sequence = inputParams->sequence;
++    runLtm(&(feedback->mAeResults), ltmResult, &(inputParams->ltmParams));
++    resultStorage->updateLtmResult(inputParams->sequence);
++
++    updateTuningData();
++
++    return OK;
++}
++
++int Ltm::runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams)
++{
++    LOG3A("%s", __func__);
++    PERF_CAMERA_ATRACE();
++
++    if (mLtmState != LTM_CONFIGURED) {
++        return OK;
++    }
++
++    ia_ltm_results *tmpLtmResults = nullptr;
++    ia_ltm_drc_params *tmpLtmDrcParams = nullptr;
++    ia_ltm_input_params *tmpLtmParams = ltmParams;
++
++    if (tmpLtmParams == NULL) {
++        tmpLtmParams = &(mLtmParams[mInputParamIndex]->ltmParams);
++    }
++
++    if (!tmpLtmParams->yv_grid) {
++        // ltm can run without Yv grid and default ltm params will be used.
++        LOGD("mYvGrid is Null.");
++    }
++    tmpLtmParams->ae_results = aeResult;
++
++    LOG3A("%s: begin running LTM", __func__);
++    ia_err iaErr;
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_ltm_run", 0);
++        iaErr = mIntelLtm->run(mLtm, tmpLtmParams, &tmpLtmResults, &tmpLtmDrcParams);
++    }
++
++    int ret = AiqUtils::convertError(iaErr);
++    CheckError(ret != OK, ret, "Error running LTM: %d", ret);
++
++    LOG3A("%s: LTM GAIN = %lf", __func__, tmpLtmResults->ltm_gain);
++
++    dumpLtmDrcParams(tmpLtmDrcParams);
++    dumpLtmResultsParams(tmpLtmResults);
++
++    {
++        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmResults", 0);
++        ret = AiqUtils::deepCopyLtmResults(*tmpLtmResults, &ltmResult->ltmResults);
++    }
++    CheckError(ret != OK, ret, "Error on copying LTM results: %d", ret);
++
++    {
++        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmDRCParams", 0);
++        ret = AiqUtils::deepCopyLtmDRCParams(*tmpLtmDrcParams, &ltmResult->ltmDrcParams);
++    }
++    CheckError(ret != OK, ret, "Error on copying DRC results: %d", ret);
++
++    ltmResult->yvGridInfo.width = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_width : 0;
++    ltmResult->yvGridInfo.height = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_height : 0;
++
++    return OK;
++}
++
++int Ltm::updateTuningData()
++{
++    LOG3A("%s", __func__);
++
++    if (mLtmState != LTM_CONFIGURED) {
++        return INVALID_OPERATION;
++    }
++
++    return OK;
++}
++
++int Ltm::updateParameter(const aiq_parameter_t &param, unsigned long long timestamp)
++{
++    LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
++
++    mLtmParams[mInputParamIndex]->ltmParams.ev_shift = param.evShift;
++    mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual = param.ltmStrength;
++    mLtmParams[mInputParamIndex]->ltmParams.frame_width = param.resolution.width;
++    mLtmParams[mInputParamIndex]->ltmParams.frame_height = param.resolution.height;
++
++    mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time = -1;
++
++    if (param.manualGain >= 0) {
++        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = pow(10, (param.manualGain / 20));
++    } else {
++        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = -1;
++    }
++    mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp = timestamp;
++
++    LOG3A("%s: Ltm EV shift %f strength %d", __func__,
++            mLtmParams[mInputParamIndex]->ltmParams.ev_shift,
++            mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual);
++    LOG3A("%s: Gtm manual gain %f, manual convergence time %f, frame timestamp %llu",
++            __func__, mLtmParams[mInputParamIndex]->gtmParams.manual_gain,
++            mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time,
++            mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp);
++
++    return OK;
++}
++
++int Ltm::dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
++
++    LOG3A("%s", __func__);
++
++    if (!ltmDrcParams){
++        LOG2("%s: ltmDrcParams is nullptr, and nothing to dump.", __func__);
++        return BAD_VALUE;
++    }
++
++    //Only dump first 10 values.
++    for (unsigned int i = 0; i < 10; i++) {
++       LOG3A("   LTM DRC params matrix gain %u weight %u",
++            ltmDrcParams->gain_map[i], ltmDrcParams->weight_map[i]);
++    }
++
++    return OK;
++}
++
++int Ltm::dumpLtmResultsParams(const ia_ltm_results *ltmResults)
++{
++    if (!CameraDump::isDumpTypeEnable(DUMP_LTM_OUTPUT)) return OK;
++
++    LOG3A("%s", __func__);
++
++    if (!ltmResults){
++        LOG2("%s: ltmResults is nullptr, and nothing to dump.", __func__);
++        return BAD_VALUE;
++    }
++
++    char fileName[MAX_NAME_LEN] = {'\0'};
++    snprintf(fileName, (MAX_NAME_LEN-1), "ia_ltm_luts_%ld_w_%d_h_%d.bin",
++        mLtmBinParam.sequence, mLtmBinParam.sParam.gridWidth, mLtmBinParam.sParam.gridHeight);
++
++    CameraDump::writeData(ltmResults->ltm_luts, sizeof(ltmResults->ltm_luts), fileName);
++
++    return OK;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.h b/camera/hal/intel/ipu6/src/3a/Ltm.h
+new file mode 100644
+index 000000000000..1f97e1975f96
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/Ltm.h
+@@ -0,0 +1,185 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <queue>
++#include <memory>
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelLtm.h"
++#else
++#include "modules/algowrapper/IntelLtm.h"
++#endif
++
++#include "CameraEvent.h"
++#include "AiqSetting.h"
++#include "AiqResult.h"
++#include "iutils/Thread.h"
++#include "iutils/CameraDump.h"
++
++namespace icamera {
++
++struct ltm_result_t {
++    ia_ltm_drc_params ltmDrcParams;
++    ia_ltm_results ltmResults;
++
++    camera_resolution_t yvGridInfo;
++
++    long sequence;
++
++    ltm_result_t() {
++        CLEAR(ltmDrcParams);
++        CLEAR(ltmResults);
++        yvGridInfo = {0, 0};
++        sequence = -1;
++    }
++};
++
++struct LtmInputParams {
++    ia_isp_bxt_hdr_yv_grid_t yvGrid;
++    ia_ltm_input_params ltmParams;
++    ia_ltm_gtm_input_params gtmParams;
++    long sequence;
++
++    LtmInputParams() {
++        CLEAR(yvGrid);
++        CLEAR(ltmParams);
++        CLEAR(gtmParams);
++        sequence = -1;
++    }
++};
++/**
++ * There are two SIS port, SIS_A is for preview.
++ * SIS_B is for still and capture.
++ */
++enum SisPort
++{
++    SIS_A = 0,
++    SIS_B,
++    MAX_SIS_NUM
++};
++
++struct SisBuffer
++{
++    SisPort sisPort;
++    ia_binary_data sisImage;
++
++    SisBuffer() {
++        sisPort = SIS_A;
++        CLEAR(sisImage);
++    }
++};
++
++struct LtmStatistics {
++    LtmStatistics(ia_isp_bxt_hdr_yv_grid_t *inputYvGrid = nullptr, long seq = -1) {
++        yvGrid = inputYvGrid;
++        sequence = seq;
++    }
++    ia_isp_bxt_hdr_yv_grid_t *yvGrid;
++    long sequence;
++};
++
++/**
++ * \class Ltm
++ * This class is used to run Local tone mapping (Ltm) algorithm.
++ */
++class Ltm : public EventListener {
++ public:
++    Ltm(int cameraId);
++    ~Ltm();
++
++    int init();
++    int deinit();
++    int start();
++    void stop();
++
++    int configure(const std::vector<ConfigMode>& configModes);
++
++    /**
++     * \brief handle statistics event
++     */
++    void handleEvent(EventData eventData);
++
++    int handleLtm(ia_isp_bxt_hdr_yv_grid_t* yvGrid,
++                  unsigned long long timestamp = 0,
++                  long sequence = 0);
++    int handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer);
++ private:
++    DISALLOW_COPY_AND_ASSIGN(Ltm);
++
++    int runLtm();
++    int initLtmParams();
++    int runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams = NULL);
++
++    int initIaLtmHandle(TuningMode tuningMode);
++    int deinitIaLtmHandle();
++
++    int updateTuningData();
++    AiqResult *getAiqResult(long sequence);
++    int updateParameter(const aiq_parameter_t &param, unsigned long long timestamp);
++
++    int dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams);
++    int dumpLtmResultsParams(const ia_ltm_results *ltmResults);
++
++ private:
++    /**
++     * \brief The ltm thread
++     */
++    class LtmThread: public Thread {
++        Ltm *mLtmHandle;
++        public:
++        LtmThread(Ltm *pThis)
++            : mLtmHandle(pThis) { }
++
++        virtual bool threadLoop() {
++            int ret = mLtmHandle->runLtm();
++            return (ret == 0);
++        }
++    };
++
++    int mCameraId;
++    ia_ltm *mLtm;
++    TuningMode mTuningMode;
++
++    enum LtmState {
++        LTM_NOT_INIT = 0,
++        LTM_INIT,
++        LTM_CONFIGURED,
++        LTM_MAX
++    } mLtmState;
++
++    // Use it to lock mInputParamIndex and mLtmParams
++    // And use it for thread condition lock
++    Mutex  mLtmLock;
++    LtmThread *mLtmThread;
++    bool mThreadRunning;
++    Condition mParamAvailableSignal;
++    static const nsecs_t kWaitDuration = 2000000000;  // 2000ms
++    static const int kMaxLtmParamsNum = 2;  // 2 ltm input params
++
++    int mInputParamIndex;
++    LtmInputParams *mLtmParams[kMaxLtmParamsNum];
++    std::queue<LtmInputParams *> mLtmParamsQ;
++
++    SisBuffer *mSisBuffer[kMaxLtmParamsNum];
++    BinParam_t mLtmBinParam;
++
++    std::unique_ptr<IntelLtm> mIntelLtm;
++};
++
++}  /* namespace icamera */
++
+diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.cpp b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
+new file mode 100644
+index 000000000000..cf93dd336345
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
+@@ -0,0 +1,126 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "MakerNote"
++
++#include <memory>
++
++#include "src/3a/MakerNote.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++namespace icamera {
++
++MakerNote::MakerNote() :
++    mMknState(UNINIT),
++    mMkn(nullptr) {
++    LOG1("@%s", __func__);
++
++    for (int i = 0; i < MAX_MAKER_NOTE_LIST_SIZE; i++) {
++        std::shared_ptr<MakernoteData> data = std::shared_ptr<MakernoteData>(new MakernoteData());
++        mMakernoteDataList.push_back(data);
++    }
++
++    mMkn = mIntelMkn.init(ia_mkn_cfg_compression,
++                          MAKERNOTE_SECTION1_SIZE, MAKERNOTE_SECTION2_SIZE);
++    CheckError(mMkn == nullptr, VOID_VALUE, "@%s, Failed to init mkn", __func__);
++
++    int ret = mIntelMkn.enable(mMkn, true);
++    CheckError(ret != ia_err_none, VOID_VALUE,
++               "@%s, Failed to enable mkn ret %d", __func__, ret);
++
++    mMknState = INIT;
++}
++
++MakerNote::~MakerNote() {
++    LOG1("@%s", __func__);
++
++    AutoMutex lock(mMknLock);
++    mIntelMkn.deinit(mMkn);
++
++    mMakernoteDataList.clear();
++}
++
++int MakerNote::saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence) {
++    LOG1("@%s", __func__);
++    if (makernoteMode == MAKERNOTE_MODE_OFF) return OK;
++
++    AutoMutex lock(mMknLock);
++    CheckError(mMknState != INIT, BAD_VALUE, "@%s, mkn isn't initialized", __func__);
++
++    ia_mkn_trg mknTrg = (makernoteMode == MAKERNOTE_MODE_JPEG ? ia_mkn_trg_section_1 :
++                                                                ia_mkn_trg_section_2);
++    ia_binary_data makerNote;
++    int ret = mIntelMkn.prepare(mMkn, mknTrg, &makerNote);
++    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, Failed to prepare makernote", __func__);
++    CheckError((makerNote.data == nullptr), UNKNOWN_ERROR,
++               "@%s, invalid makernote data pointer", __func__);
++    CheckError(makerNote.size == 0, UNKNOWN_ERROR, "@%s, 0 size makernote data saved", __func__);
++
++    std::shared_ptr<MakernoteData> data = mMakernoteDataList.front();
++    mMakernoteDataList.pop_front();
++
++    MEMCPY_S(data->section, sizeof(char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE),
++             makerNote.data, makerNote.size);
++
++    data->size = makerNote.size;
++    data->sequence = sequence;
++    data->timestamp = 0;
++    LOG2("@%s, saved makernote %d for sequence %ld", __func__, makernoteMode, sequence);
++
++    mMakernoteDataList.push_back(data);
++    return OK;
++}
++
++ia_mkn *MakerNote::getMknHandle() {
++    LOG1("@%s", __func__);
++    AutoMutex lock(mMknLock);
++    CheckError(mMknState != INIT, nullptr, "@%s, mkn isn't initialized", __func__);
++
++    return mMkn;
++}
++
++void MakerNote::updateTimestamp(int64_t sequence, uint64_t timestamp) {
++    LOG1("@%s", __func__);
++    AutoMutex lock(mMknLock);
++    CheckError(mMknState != INIT, VOID_VALUE, "@%s, mkn isn't initialized", __func__);
++
++    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
++        if ((*rit)->sequence == sequence) {
++            LOG2("@%s, found sequence %ld for request sequence %ld, timestamp %ld", __func__,
++                 (*rit)->sequence, sequence, timestamp);
++            (*rit)->timestamp = timestamp;
++            break;
++        }
++    }
++}
++
++void MakerNote::acquireMakernoteData(uint64_t timestamp, Parameters *param) {
++    LOG1("@%s", __func__);
++    AutoMutex lock(mMknLock);
++    CheckError(mMknState != INIT, VOID_VALUE, "@%s, mkn isn't initialized", __func__);
++
++    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
++        if ((*rit)->timestamp > 0 && timestamp >= (*rit)->timestamp) {
++            LOG2("@%s, found timestamp %ld for request timestamp %ld", __func__,
++                 (*rit)->timestamp, timestamp);
++            param->setMakernoteData((*rit)->section, (*rit)->size);
++            break;
++        }
++    }
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.h b/camera/hal/intel/ipu6/src/3a/MakerNote.h
+new file mode 100644
+index 000000000000..201d696222aa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/MakerNote.h
+@@ -0,0 +1,116 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <list>
++#include <memory>
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelMkn.h"
++#else
++#include "modules/algowrapper/IntelMkn.h"
++#endif
++
++#include "iutils/Utils.h"
++#include "iutils/Thread.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++struct MakernoteData {
++    int64_t sequence;
++    uint64_t timestamp;
++    unsigned int size;
++    char section[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
++
++    MakernoteData() {
++        sequence = -1;
++        timestamp = 0;
++        size = 0;
++        CLEAR(section);
++    }
++};
++
++/**
++ * \class MakerNote
++ *
++ * This class encapsulates Intel Makernotes function, and provides interface
++ * for enabling and acquiring Makenotes which is called by AiqEngine, Ltm
++ * and AiqPlus.
++ *
++ */
++class MakerNote {
++ public:
++    MakerNote();
++    ~MakerNote();
++
++    /**
++     * \brief Save Makernote by ia_mkn_trg mode
++     *
++     * param[in] camera_makernote_mode_t: MAKERNOTE_MODE_JPEG is corresponding
++     *           to ia_mkn_trg_section_1 for Normal Jpeg capture;
++     *           MAKERNOTE_MODE_RAW is corresponding to ia_mkn_trg_section_2
++     *           for Raw image capture.
++     * param[in] int64_t sequence: the sequence in latest AiqResult
++     *
++     * return OK if get Makernote successfully, otherwise return ERROR.
++     */
++    int saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence);
++
++    /**
++     * \brief Get ia_mkn (Makernote) handle.
++     */
++    ia_mkn *getMknHandle();
++
++    /**
++     * \brief Update timestamp of frame.
++     *
++     * param[in] sequence: the sequence in frame buffer;
++     * param[in] timestamp: the timestamp in frame buffer.
++     *
++     */
++    void updateTimestamp(int64_t sequence, uint64_t timestamp);
++
++    /**
++     * \brief Acquire MakerNote data.
++     *
++     * param[in] timestamp: the timestamp in frame buffer;
++     * param[out] param: Makernote data will be saved in parameters as metadata.
++     *
++     */
++    void acquireMakernoteData(uint64_t timestamp, Parameters *param);
++
++ private:
++    // Should > max request number in processing
++    static const int MAX_MAKER_NOTE_LIST_SIZE = 32;
++
++    enum MknState {
++        UNINIT,
++        INIT
++    } mMknState;
++
++    // Guard for MakerNote API
++    Mutex mMknLock;
++    ia_mkn *mMkn;
++
++    IntelMkn mIntelMkn;
++
++    std::list<std::shared_ptr<MakernoteData>> mMakernoteDataList;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.cpp b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
+new file mode 100644
+index 000000000000..1abd08dcdab7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
+@@ -0,0 +1,327 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SensorManager"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "AiqUtils.h"
++#include "SensorManager.h"
++#include "PlatformData.h"
++
++using std::vector;
++
++namespace icamera {
++
++SensorManager::SensorManager(int cameraId, SensorHwCtrl *sensorHw) :
++    mCameraId(cameraId),
++    mSensorHwCtrl(sensorHw),
++    mModeSwitched(false),
++    mPerframeControl(false),
++    mLastSofSequence(-1),
++    mGainDelay(0),
++    mSensorExposureHistoryIndex(-1)
++{
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    CLEAR(mWdrModeSetting);
++
++    if (PlatformData::getGainLag(mCameraId) > 0) {
++        mGainDelay = PlatformData::getExposureLag(mCameraId) - PlatformData::getGainLag(mCameraId);
++    }
++}
++
++SensorManager::~SensorManager()
++{
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++}
++
++int SensorManager::init()
++{
++    AutoMutex l(mLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    mSensorExposures.reserve(kMaxSensorExposures);
++    reset();
++    return OK;
++}
++
++int SensorManager::deinit()
++{
++    AutoMutex l(mLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    return OK;
++}
++
++void SensorManager::reset()
++{
++    mPerframeControl = false,
++    mLastSofSequence = -1;
++
++    mModeSwitched = false;
++
++    for (int i = 0; i < kMaxExposureHistory; i++) {
++        mSensorExposureHistory[i].clear();
++    }
++
++    mSensorExposureHistoryIndex = -1;
++
++    CLEAR(mWdrModeSetting);
++    mWdrModeSetting.tuningMode = TUNING_MODE_MAX;
++
++    mSofEventInfo.clear();
++}
++
++EventListener *SensorManager::getSofEventListener()
++{
++    AutoMutex l(mLock);
++    LOG1("@%s mCameraId = %d", __func__, mCameraId);
++
++    return this;
++}
++
++void SensorManager::handleEvent(EventData eventData)
++{
++    AutoMutex l(mLock);
++    LOG3A("@%s", __func__);
++
++    if (eventData.type == EVENT_ISYS_SOF) {
++        LOG3A("sequence = %ld, timestamp = %ld",
++                eventData.data.sync.sequence,
++                TIMEVAL2USECS(eventData.data.sync.timestamp));
++        handleSensorExposure();
++        mLastSofSequence = eventData.data.sync.sequence;
++
++        SofEventInfo info;
++        info.sequence = eventData.data.sync.sequence;
++        info.timestamp = ((long)eventData.data.sync.timestamp.tv_sec) * 1000000
++                         + eventData.data.sync.timestamp.tv_usec;
++        if (mSofEventInfo.size() >= kMaxSofEventInfo) {
++            mSofEventInfo.erase(mSofEventInfo.begin());
++        }
++        mSofEventInfo.push_back(info);
++    }
++}
++
++uint64_t SensorManager::getSofTimestamp(long sequence)
++{
++    AutoMutex l(mLock);
++
++    for (auto info : mSofEventInfo) {
++        if (info.sequence == sequence) {
++            return info.timestamp;
++        }
++    }
++    return 0;
++}
++
++void SensorManager::handleSensorExposure()
++{
++    if (!mSensorExposures.empty()) {
++        SensorExpGroup& exposures = mSensorExposures[0];
++        setFrameDuration(exposures[0].sensorParam.line_length_pixels, exposures[0].sensorParam.frame_length_lines);
++        setSensorExposureAndGains(exposures);
++        mSensorExposures.erase(mSensorExposures.begin());
++    } else {
++        if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
++            // If gain setting is postponed, set last gain setting to sensor driver
++            int index = mSensorExposureHistoryIndex % kMaxExposureHistory;
++            setSensorGains(index);
++        }
++        mPerframeControl = false;
++    }
++}
++
++int SensorManager::getCurrentExposureAppliedDelay()
++{
++    AutoMutex l(mLock);
++
++    return mSensorExposures.size() + PlatformData::getExposureLag(mCameraId);
++}
++
++uint32_t SensorManager::updateSensorExposure(SensorExpGroup sensorExposures, bool useSof)
++{
++    AutoMutex l(mLock);
++
++    long appliedSeq = mLastSofSequence < 0 ? 0 : \
++                      mLastSofSequence + PlatformData::getExposureLag(mCameraId);
++
++    if (sensorExposures.empty()) {
++        LOGW("%s: No exposure parameter", __func__);
++        return ((uint32_t)appliedSeq);
++    }
++
++    if (useSof) {
++        mSensorExposures.push_back(sensorExposures);
++        mPerframeControl = true;
++        appliedSeq += mSensorExposures.size();
++    } else if (PlatformData::isIsysEnabled(mCameraId)
++               && !mPerframeControl) {
++        setFrameDuration(sensorExposures[0].sensorParam.line_length_pixels, sensorExposures[0].sensorParam.frame_length_lines);
++        setSensorExposureAndGains(sensorExposures);
++    }
++
++    LOG3A("@%s, useSof:%d, mLastSofSequence:%ld, appliedSeq %ld", __func__, useSof,
++           mLastSofSequence, appliedSeq);
++    return ((uint32_t)appliedSeq);
++}
++
++void SensorManager::setSensorExposureAndGains(SensorExpGroup sensorExposures)
++{
++    mSensorExposureHistoryIndex++;
++    mSensorExposureHistory[mSensorExposureHistoryIndex % kMaxExposureHistory] = sensorExposures;
++
++    vector<int> coarseExposures;
++    vector<int> fineExposures;
++    for (auto exp : sensorExposures) {
++        coarseExposures.push_back(exp.sensorParam.coarse_integration_time);
++        fineExposures.push_back(exp.sensorParam.fine_integration_time);
++    }
++    mSensorHwCtrl->setExposure(coarseExposures, fineExposures);
++
++    int64_t index = mSensorExposureHistoryIndex % kMaxExposureHistory;
++
++    // If exposure and gain lag are different, gain setting need to be postponed.
++    if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
++        index = (mSensorExposureHistoryIndex - mGainDelay) % kMaxExposureHistory;
++    }
++
++    setSensorGains(index);
++}
++
++void SensorManager::setSensorGains(int index)
++{
++    vector<int> analogGains;
++    vector<int> digitalGains;
++    for (auto exp : mSensorExposureHistory[index]) {
++        analogGains.push_back(exp.sensorParam.analog_gain_code_global);
++
++        int digitalGain = exp.sensorParam.digital_gain_global;
++        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
++            digitalGain = PlatformData::getSensorDigitalGain(mCameraId, exp.realDigitalGain);
++        }
++        digitalGains.push_back(digitalGain);
++    }
++
++    mSensorHwCtrl->setGains(analogGains, digitalGains);
++}
++
++int SensorManager::setFrameDuration(int lineLengthPixels, int frameLengthLines)
++{
++    return mSensorHwCtrl->setFrameDuration(lineLengthPixels, frameLengthLines);
++}
++
++int SensorManager::setFrameRate(float fps)
++{
++    return mSensorHwCtrl->setFrameRate(fps);
++}
++
++int SensorManager::getSensorInfo(ia_aiq_frame_params &frameParams,
++                                 ia_aiq_exposure_sensor_descriptor &sensorDescriptor)
++{
++    LOG3A("@%s", __func__);
++    SensorFrameParams sensorFrameParams;
++    CLEAR(sensorFrameParams);
++
++    int ret = PlatformData::calculateFrameParams(mCameraId, sensorFrameParams);
++    if (ret == OK) {
++        AiqUtils::convertToAiqFrameParam(sensorFrameParams, frameParams);
++    }
++
++    if (!PlatformData::isIsysEnabled(mCameraId)) {
++        vector <camera_resolution_t> res;
++        PlatformData::getSupportedISysSizes(mCameraId, res);
++
++        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
++        // In none-ISYS cases, only take 30 fps into account.
++        int fps = 30;
++        float freq = res[0].width * res[0].height * fps / 1000000;
++        sensorDescriptor = {freq, static_cast<unsigned short>(res[0].width),
++                            static_cast<unsigned short>(res[0].height), 24, 0,
++                            static_cast<unsigned short>(res[0].width), 6, 0};
++        LOG3A("freq %f, width %d, height %d", freq, res[0].width, res[0].height);
++        return OK;
++    }
++
++    ret |= getSensorModeData(sensorDescriptor);
++
++    LOG3A("ia_aiq_frame_params=[%d, %d, %d, %d, %d, %d, %d, %d]",
++        frameParams.horizontal_crop_offset,
++        frameParams.vertical_crop_offset,
++        frameParams.cropped_image_height,
++        frameParams.cropped_image_width,
++        frameParams.horizontal_scaling_numerator,
++        frameParams.horizontal_scaling_denominator,
++        frameParams.vertical_scaling_numerator,
++        frameParams.vertical_scaling_denominator);
++
++    LOG3A("ia_aiq_exposure_sensor_descriptor=[%f, %d, %d, %d, %d, %d, %d, %d]",
++        sensorDescriptor.pixel_clock_freq_mhz,
++        sensorDescriptor.pixel_periods_per_line,
++        sensorDescriptor.line_periods_per_field,
++        sensorDescriptor.line_periods_vertical_blanking,
++        sensorDescriptor.coarse_integration_time_min,
++        sensorDescriptor.coarse_integration_time_max_margin,
++        sensorDescriptor.fine_integration_time_min,
++        sensorDescriptor.fine_integration_time_max_margin);
++
++    return ret;
++}
++
++/**
++ * get sensor mode data (sensor descriptor) from sensor driver
++ *
++ * \return OK if successfully.
++ */
++int SensorManager::getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData)
++{
++    int pixel = 0;
++    int status =  mSensorHwCtrl->getPixelRate(pixel);
++    CheckError(status != OK, status, "Failed to get pixel clock ret:%d", status);
++    sensorData.pixel_clock_freq_mhz = (float)pixel / 1000000;
++
++    int width = 0, height = 0, pixelCode = 0;
++    status = mSensorHwCtrl->getActivePixelArraySize(width, height, pixelCode);
++    CheckError(status != OK, status, "Failed to get active pixel array size ret:%d", status);
++
++    int pixel_periods_per_line, line_periods_per_field;
++    status = mSensorHwCtrl->getFrameDuration(pixel_periods_per_line, line_periods_per_field);
++    CheckError(status != OK, status, "Failed to get frame Durations ret:%d", status);
++
++    sensorData.pixel_periods_per_line = CLIP(pixel_periods_per_line, USHRT_MAX, 0);
++    sensorData.line_periods_per_field = CLIP(line_periods_per_field, USHRT_MAX, 0);
++
++    int coarse_int_time_min, integration_step = 0, integration_max = 0;
++    status = mSensorHwCtrl->getExposureRange(coarse_int_time_min, integration_max, integration_step);
++    CheckError(status != OK, status, "Failed to get Exposure Range ret:%d", status);
++
++    sensorData.coarse_integration_time_min = CLIP(coarse_int_time_min, USHRT_MAX, 0);
++    sensorData.coarse_integration_time_max_margin = PlatformData::getCITMaxMargin(mCameraId);
++
++    // fine integration is not supported by v4l2
++    sensorData.fine_integration_time_min = 0;
++    sensorData.fine_integration_time_max_margin = sensorData.pixel_periods_per_line;
++    int vblank;
++    status = mSensorHwCtrl->getVBlank(vblank);
++    CheckError(status != OK, status, "Failed to get vblank ret:%d", status);
++    sensorData.line_periods_vertical_blanking = CLIP(vblank, USHRT_MAX, 0);
++
++    return OK;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.h b/camera/hal/intel/ipu6/src/3a/SensorManager.h
+new file mode 100644
+index 000000000000..bb42a306ffd3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/SensorManager.h
+@@ -0,0 +1,111 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Thread.h"
++
++#include "ia_aiq.h"
++
++#include "CameraEvent.h"
++#include "SensorHwCtrl.h"
++
++namespace icamera {
++
++/*
++ * \struct WdrModeSetting
++ *
++ * This struct is used to control wdr mode switching.
++ */
++typedef struct {
++    long sequence;
++    TuningMode tuningMode;
++} WdrModeSetting;
++
++typedef struct {
++    unsigned short realDigitalGain;
++    ia_aiq_exposure_sensor_parameters sensorParam;
++} SensorExposure;
++
++typedef struct {
++    long sequence;
++    uint64_t timestamp;
++} SofEventInfo;
++
++typedef std::vector <SensorExposure> SensorExpGroup;
++/*
++ * \class SensorManager
++ *
++ * This class is used to control exposure and gain synchronization mechanism
++ * and get some sensor info.
++ */
++class SensorManager : public EventListener {
++
++public:
++    SensorManager(int cameraId, SensorHwCtrl *sensorHw);
++    ~SensorManager();
++
++    int init();
++    int deinit();
++    void reset();
++
++    // get EventListener
++    EventListener *getSofEventListener();
++
++    void handleEvent(EventData eventData);
++    uint32_t updateSensorExposure(SensorExpGroup sensorExposures, bool useSof = true);
++    int getSensorInfo(ia_aiq_frame_params &frameParams,
++                      ia_aiq_exposure_sensor_descriptor &sensorDescriptor);
++
++    int setFrameRate(float fps);
++    int getCurrentExposureAppliedDelay();
++    uint64_t getSofTimestamp(long sequence);
++private:
++    DISALLOW_COPY_AND_ASSIGN(SensorManager);
++
++    void handleSensorExposure();
++    int getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData);
++    void setSensorExposureAndGains(SensorExpGroup sensorExposures);
++    int setFrameDuration(int lineLengthPixels, int frameLengthLines);
++    void setSensorGains(int index);
++
++private:
++    static const int kMaxSensorExposures = 10;
++    static const int kMaxExposureHistory = 5;
++    static const int kMaxSofEventInfo = 10;
++
++    int mCameraId;
++    SensorHwCtrl *mSensorHwCtrl;
++
++    bool    mModeSwitched;         // Whether the TuningMode get updated
++    WdrModeSetting mWdrModeSetting;
++
++    bool mPerframeControl;
++    std::vector<SensorExpGroup> mSensorExposures;
++
++    long mLastSofSequence;
++
++    // Guard for SensorManager public API.
++    Mutex mLock;
++
++    int mGainDelay;
++    SensorExpGroup mSensorExposureHistory[kMaxExposureHistory];
++    int64_t mSensorExposureHistoryIndex;
++
++    std::vector<SofEventInfo> mSofEventInfo;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
+new file mode 100644
+index 000000000000..b76c3b6c7f12
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
+@@ -0,0 +1,714 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Intel3AParameter"
++
++#include <cmath>
++#include <climits>
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "Intel3AParameter.h"
++#include "AiqUtils.h"
++
++namespace icamera {
++
++Intel3AParameter::Intel3AParameter(int cameraId) :
++    mCameraId(cameraId),
++    mUseManualAwbGain(false),
++    mWeightGridMode(WEIGHT_GRID_AUTO),
++    mAePerTicks(1),
++    mAwbPerTicks(1),
++    mAfForceLock(false),
++    mDuringAfTriggerScan(false)
++{
++    LOG3A("%s", __func__);
++
++    CLEAR(mAeParams);
++    CLEAR(mAfParams);
++    CLEAR(mAwbParams);
++
++    CLEAR(mManualGains);
++    CLEAR(mAwbGainShift);
++
++    CLEAR(mSensorDescriptor);
++    CLEAR(mExposureWindow);
++    CLEAR(mExposureCoordinate);
++    CLEAR(mAeFeatures);
++    CLEAR(mAeManualLimits);
++    CLEAR(mManualFocusParams);
++    CLEAR(mFocusRect);
++    CLEAR(mManualCctRange);
++    CLEAR(mManualWhiteCoordinate);
++
++    CLEAR(mManualExposureTimeUs);
++    CLEAR(mManualAnalogGain);
++    CLEAR(mManualIso);
++    mAfTrigger = AF_TRIGGER_IDLE;
++    mAfMode = AF_MODE_OFF;
++}
++
++Intel3AParameter::~Intel3AParameter()
++{
++    LOG3A("%s", __func__);
++}
++
++int Intel3AParameter::init()
++{
++    LOG3A("%s", __func__);
++
++    mAeParams.sensor_descriptor = &mSensorDescriptor;
++    mAeParams.exposure_window = &mExposureWindow;
++    mAeParams.exposure_coordinate = &mExposureCoordinate;
++    mAeParams.aec_features = &mAeFeatures;
++    mAeParams.manual_limits = &mAeManualLimits;
++
++    mAfParams.focus_rect = &mFocusRect;
++    mAfParams.manual_focus_parameters = &mManualFocusParams;
++
++    mAwbParams.manual_cct_range = &mManualCctRange;
++    mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
++
++    // set default params
++    initAeParameter();
++    initAfParameter();
++    initAwbParameter();
++
++    mUseManualAwbGain = false;
++    mWeightGridMode = WEIGHT_GRID_AUTO;
++    mAePerTicks = 1;
++    mAwbPerTicks = 1;
++
++    mAfMode = AF_MODE_AUTO;
++    mAfForceLock = false;
++    mAfTrigger = AF_TRIGGER_IDLE;
++    mDuringAfTriggerScan = false;
++    return OK;
++}
++
++void Intel3AParameter::initAeParameter()
++{
++    mAeParams.num_exposures = 1;
++    mAeParams.frame_use = ia_aiq_frame_use_video;
++    mAeParams.flash_mode = ia_aiq_flash_mode_off;
++    mAeParams.operation_mode = ia_aiq_ae_operation_mode_automatic;
++    mAeParams.metering_mode = ia_aiq_ae_metering_mode_evaluative;
++    mAeParams.priority_mode = ia_aiq_ae_priority_mode_normal;
++    mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
++    mAeParams.ev_shift = 0.0f;
++    mAeParams.manual_exposure_time_us = nullptr;
++    mAeParams.manual_analog_gain = nullptr;
++    mAeParams.manual_iso = nullptr;
++
++    mAeParams.exposure_window = nullptr;
++    mAeParams.exposure_coordinate = nullptr;
++    mAeParams.aec_features = nullptr;
++    mAeParams.manual_convergence_time = -1;
++    mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
++}
++
++void Intel3AParameter::initAfParameter()
++{
++    mAfParams.frame_use = ia_aiq_frame_use_video;
++    mAfParams.lens_position = 0;
++    mAfParams.lens_movement_start_timestamp = 0;
++    mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
++    mAfParams.focus_range = ia_aiq_af_range_extended;
++    mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
++    mAfParams.flash_mode = ia_aiq_flash_mode_off;
++    mAfParams.focus_rect = &mFocusRect;
++    mAfParams.focus_rect->left = 0;
++    mAfParams.focus_rect->top = 0;
++    mAfParams.focus_rect->right = 0;
++    mAfParams.focus_rect->bottom = 0;
++    mAfParams.manual_focus_parameters = &mManualFocusParams;
++    mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
++    mAfParams.manual_focus_parameters->manual_focus_distance = MAX_FOCUS_DISTANCE;
++    mAfParams.manual_focus_parameters->manual_lens_position = 0;
++    mAfParams.trigger_new_search = false;
++}
++
++void Intel3AParameter::initAwbParameter()
++{
++    mAwbParams.frame_use = ia_aiq_frame_use_video;
++    mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
++    mAwbParams.manual_convergence_time = -1;
++
++    mUseManualAwbGain = false;
++    CLEAR(mManualGains);
++    CLEAR(mAwbGainShift);
++}
++
++int Intel3AParameter::setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor)
++{
++    LOG3A("%s", __func__);
++
++    mSensorDescriptor.pixel_clock_freq_mhz = descriptor.pixel_clock_freq_mhz;
++    mSensorDescriptor.pixel_periods_per_line = descriptor.pixel_periods_per_line;
++    mSensorDescriptor.line_periods_per_field = descriptor.line_periods_per_field;
++    mSensorDescriptor.line_periods_vertical_blanking = descriptor.line_periods_vertical_blanking;
++    mSensorDescriptor.fine_integration_time_min = descriptor.fine_integration_time_min;
++    mSensorDescriptor.fine_integration_time_max_margin = descriptor.fine_integration_time_max_margin;
++    mSensorDescriptor.coarse_integration_time_min = descriptor.coarse_integration_time_min;
++    mSensorDescriptor.coarse_integration_time_max_margin = descriptor.coarse_integration_time_max_margin;
++
++    return OK;
++}
++
++int Intel3AParameter::updateParameter(aiq_parameter_t param)
++{
++    LOG3A("%s", __func__);
++
++    updateAeParameter(param);
++    updateAwbParameter(param);
++    updateAfParameter(param);
++
++    return OK;
++}
++
++/**
++ * Override ae result by those settings provided by application
++ */
++void Intel3AParameter::updateAeResult(ia_aiq_ae_results* aeResult)
++{
++    CheckError(!aeResult || !aeResult->weight_grid, VOID_VALUE, "Invalid aeResult");
++
++}
++
++float Intel3AParameter::convertdBGainToISO(float sensitivityGain, int baseIso)
++{
++    // Convert db Gain to ISO
++    float manualGain = pow(10, (sensitivityGain / 20));
++    manualGain *= baseIso;
++    return manualGain;
++}
++
++void Intel3AParameter::setAeManualLimits(const aiq_parameter_t& param)
++{
++    mAeParams.manual_limits = &mAeManualLimits;
++
++    if (param.aeFpsRange.min > 0.01 && param.aeFpsRange.max >= param.aeFpsRange.min) {
++        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.aeFpsRange.min;
++        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.aeFpsRange.max;
++    } else if (param.fps > 0.01) {
++        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.fps;
++        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.fps;
++    }
++
++    camera_range_t etRange = {-1, -1};
++    int ret = PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange);
++    if (param.exposureTimeRange.min > 0 &&
++        param.exposureTimeRange.max >= param.exposureTimeRange.min) {
++        if (ret == OK) {
++            etRange.min = CLIP(param.exposureTimeRange.min, etRange.max, etRange.min);
++            etRange.max = CLIP(param.exposureTimeRange.max, etRange.max, etRange.min);
++        } else {
++            etRange.min = param.exposureTimeRange.min;
++            etRange.max = param.exposureTimeRange.max;
++        }
++    }
++    mAeManualLimits.manual_exposure_time_min = etRange.min;
++    mAeManualLimits.manual_exposure_time_max = etRange.max;
++
++    camera_range_t gainRange = {-1, -1};
++    ret = PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange);
++    if (param.sensitivityGainRange.min >= 0 &&
++        param.sensitivityGainRange.max >= param.sensitivityGainRange.min) {
++        if (ret == OK) {
++            gainRange.min = CLIP(param.sensitivityGainRange.min, gainRange.max, gainRange.min);
++            gainRange.max = CLIP(param.sensitivityGainRange.max, gainRange.max, gainRange.min);
++        } else {
++            gainRange.min = param.sensitivityGainRange.min;
++            gainRange.max = param.sensitivityGainRange.max;
++        }
++    }
++
++    mAeManualLimits.manual_iso_min = -1;
++    mAeManualLimits.manual_iso_max = -1;
++    if (gainRange.min >= 0 && gainRange.max >= gainRange.min) {
++        ia_binary_data aiqData;
++        ia_cmc_t *cmc = nullptr;
++
++        int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, &aiqData, nullptr,
++                                             nullptr, param.tuningMode, &cmc);
++        if (ret == OK) {
++            if (cmc != nullptr && cmc->cmc_sensitivity != nullptr) {
++                float isoMin = convertdBGainToISO(gainRange.min, cmc->cmc_sensitivity->base_iso);
++                float isoMax = convertdBGainToISO(gainRange.max, cmc->cmc_sensitivity->base_iso);
++                if (isoMin <= INT_MAX && isoMax <= INT_MAX) {
++                    mAeManualLimits.manual_iso_min = static_cast<int>(isoMin);
++                    mAeManualLimits.manual_iso_max = static_cast<int>(isoMax);
++                }
++            }
++        }
++    }
++
++    LOG3A("%s, manual limited ISO-[%d--%d], expo-[%d--%d], frame time-[%d--%d]", __func__,
++          mAeManualLimits.manual_iso_min, mAeManualLimits.manual_iso_max,
++          mAeManualLimits.manual_exposure_time_min, mAeManualLimits.manual_exposure_time_max,
++          mAeManualLimits.manual_frame_time_us_min, mAeManualLimits.manual_frame_time_us_max);
++}
++
++void Intel3AParameter::setManualExposure(const aiq_parameter_t& param)
++{
++    int64_t manualExpTimeUs = param.manualExpTimeUs;
++    if (manualExpTimeUs <= 0 || param.aeDistributionPriority == DISTRIBUTION_ISO) {
++        return;
++    }
++
++    camera_range_t etRange;
++    CLEAR(etRange);
++    if (PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange) == OK) {
++         manualExpTimeUs = CLIP(manualExpTimeUs, etRange.max, etRange.min);
++    }
++
++    mAeParams.manual_exposure_time_us = mManualExposureTimeUs;
++    for (unsigned int i = 0; i < mAeParams.num_exposures - 1; i++) {
++        mAeParams.manual_exposure_time_us[i] = -1;
++    }
++    mAeParams.manual_exposure_time_us[mAeParams.num_exposures - 1] = manualExpTimeUs;
++    LOG3A("%s, manual exposure %ld", __func__, manualExpTimeUs);
++}
++
++void Intel3AParameter::setManualGain(const aiq_parameter_t& param)
++{
++    float manualGain = param.manualGain;
++    if (manualGain < 0 || param.aeDistributionPriority == DISTRIBUTION_SHUTTER) {
++        return;
++    }
++
++    camera_range_t gainRange;
++    CLEAR(gainRange);
++    if (PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange) == OK) {
++        manualGain = CLIP(manualGain, gainRange.max, gainRange.min);
++    }
++
++    mAeParams.manual_analog_gain = mManualAnalogGain;
++    // Convert db to sensor analog gain.
++    for (unsigned int i = 0; i < mAeParams.num_exposures; i++) {
++        mAeParams.manual_analog_gain[i] = pow(10, (manualGain / 20));
++    }
++
++    LOG3A("%s, manual gain %f, AG %f", __func__, manualGain, mManualAnalogGain[0]);
++}
++
++void Intel3AParameter::setManualIso(const aiq_parameter_t& param)
++{
++    int32_t manualIso = param.manualIso;
++    if (manualIso <= 0 || param.aeDistributionPriority == DISTRIBUTION_SHUTTER) {
++        return;
++    }
++
++    if (mAeManualLimits.manual_iso_min >= 0
++        && mAeManualLimits.manual_iso_max >= mAeManualLimits.manual_iso_min) {
++        manualIso = CLIP(manualIso, mAeManualLimits.manual_iso_max, mAeManualLimits.manual_iso_min);
++    }
++
++    // Will overwrite manual_analog_gain
++    mAeParams.manual_iso = mManualIso;
++    for (unsigned int i = 0; i < mAeParams.num_exposures; i++) {
++        mAeParams.manual_iso[i] = manualIso;
++    }
++
++    LOG3A("%s, manual iso  %d", __func__, manualIso);
++}
++
++void Intel3AParameter::updateAeParameter(const aiq_parameter_t& param)
++{
++    mAeParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
++    mAeParams.num_exposures = PlatformData::getExposureNum(mCameraId,
++                                  CameraUtils::isMultiExposureCase(param.tuningMode));
++    setAeManualLimits(param);
++
++    switch(param.antibandingMode) {
++        case ANTIBANDING_MODE_AUTO:
++            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
++            break;
++        case ANTIBANDING_MODE_50HZ:
++            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_50hz;
++            break;
++        case ANTIBANDING_MODE_60HZ:
++            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_60hz;
++            break;
++        case ANTIBANDING_MODE_OFF:
++            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_off;
++            break;
++    }
++
++    switch (param.aeDistributionPriority) {
++        case DISTRIBUTION_AUTO:
++            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
++            break;
++        case DISTRIBUTION_SHUTTER:
++            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_shutter;
++            break;
++        case DISTRIBUTION_ISO:
++            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_iso;
++            break;
++        case DISTRIBUTION_APERTURE:
++            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_aperture;
++            break;
++        default:
++            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
++            break;
++    }
++
++    mAeParams.manual_exposure_time_us = nullptr;
++    mAeParams.manual_analog_gain = nullptr;
++    mAeParams.manual_iso = nullptr;
++
++    if (param.aeMode == AE_MODE_MANUAL) {
++        setManualGain(param);
++        setManualIso(param);
++        setManualExposure(param);
++    } else {
++        mAeParams.ev_shift = param.evShift;
++    }
++
++    if (param.aeConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
++        mAePerTicks = 1;
++
++        mAeParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.aeConvergeSpeed);
++    } else {
++        mAeParams.manual_convergence_time = -1;
++
++        /*
++         * The unit of mAePerTicks is frame count, 3 means 3 frames.
++         * The default value can be changed based on customer requirement.
++         */
++        switch (param.aeConvergeSpeed) {
++            case CONVERGE_MID:
++                mAePerTicks = 30;
++                break;
++            case CONVERGE_LOW:
++                mAePerTicks = 60;
++                break;
++            case CONVERGE_NORMAL:
++            default:
++                mAePerTicks = 1;
++                break;
++        }
++    }
++
++    mAeParams.exposure_coordinate = nullptr;
++    if (param.blcAreaMode == BLC_AREA_MODE_ON && !param.aeRegions.empty()) {
++        // Current only one AE metering window is supported, so use the latest one
++        camera_window_t window = param.aeRegions.back();
++
++        if (window.right > window.left && window.bottom > window.top) {
++            camera_coordinate_t coordinate;
++            CLEAR(coordinate);
++            coordinate.x = window.left + (window.right - window.left) / 2;
++            coordinate.y = window.top + (window.bottom - window.top) / 2;
++            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
++            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
++
++            coordinate = AiqUtils::convertToIaCoordinate(frameCoord, coordinate);
++            mExposureCoordinate.x = coordinate.x;
++            mExposureCoordinate.y = coordinate.y;
++            mAeParams.exposure_coordinate = &mExposureCoordinate;
++            LOG3A("%s, exposure coordinate = [%d,%d], region = [%d,%d,%d,%d]", __func__,
++                    mAeParams.exposure_coordinate->x, mAeParams.exposure_coordinate->y,
++                    window.left, window.top, window.right, window.bottom);
++        }
++    }
++}
++
++/**
++ * Override awb result by AWB gains or gain shift provided by application
++ */
++void Intel3AParameter::updateAwbResult(ia_aiq_awb_results* awbResult)
++{
++    CheckError((awbResult == nullptr), VOID_VALUE, "No Awb result provided.");
++
++    camera_awb_gains_t& gains = mUseManualAwbGain ? mManualGains : mAwbGainShift;
++    float normalizedR = AiqUtils::normalizeAwbGain(gains.r_gain);
++    float normalizedG = AiqUtils::normalizeAwbGain(gains.g_gain);
++    float normalizedB = AiqUtils::normalizeAwbGain(gains.b_gain);
++
++    const float MAX_PER_G = AWB_GAIN_NORMALIZED_START / AWB_GAIN_NORMALIZED_END;
++    const float MIN_PER_G = 1.0 / MAX_PER_G;
++
++    if (mUseManualAwbGain) {
++        awbResult->accurate_b_per_g = CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
++        awbResult->accurate_r_per_g = CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
++    } else {
++        awbResult->accurate_b_per_g *= CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
++        awbResult->accurate_r_per_g *= CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
++    }
++
++    //Only override final results when manual gain or gain shift applied.
++    if (mUseManualAwbGain || gains.r_gain != 0 || gains.g_gain != 0
++        || gains.b_gain != 0) {
++        LOG3A("%s: override final awb results", __func__);
++        awbResult->final_b_per_g = awbResult->accurate_b_per_g;
++        awbResult->final_r_per_g = awbResult->accurate_r_per_g;
++    }
++
++    LOG3A("%s (r,g,b): (%d,%d,%d) -> (b/g, r/g): (%f,%f)",
++          mUseManualAwbGain ? "Manual gain" : "Gain shift",
++          gains.r_gain, gains.g_gain, gains.b_gain,
++          awbResult->accurate_b_per_g, awbResult->accurate_r_per_g);
++}
++
++void Intel3AParameter::updateAwbParameter(const aiq_parameter_t& param)
++{
++    mAwbParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
++
++    switch (param.awbMode) {
++        case AWB_MODE_INCANDESCENT:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_incandescent;
++            break;
++
++        case AWB_MODE_FLUORESCENT:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fluorescent;
++            break;
++
++        case AWB_MODE_DAYLIGHT:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_daylight;
++            break;
++
++        case AWB_MODE_FULL_OVERCAST:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fully_overcast;
++            break;
++
++        case AWB_MODE_PARTLY_OVERCAST:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_partly_overcast;
++            break;
++
++        case AWB_MODE_SUNSET:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_sunset;
++            break;
++
++        case AWB_MODE_VIDEO_CONFERENCE:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_video_conference;
++            break;
++
++        case AWB_MODE_MANUAL_CCT_RANGE:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_cct_range;
++            mManualCctRange.min_cct = std::min(param.cctRange.min, param.cctRange.max);
++            mManualCctRange.max_cct = std::max(param.cctRange.min, param.cctRange.max);
++            mAwbParams.manual_cct_range = &mManualCctRange;
++            break;
++
++        case AWB_MODE_MANUAL_WHITE_POINT:
++        {
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_white;
++            mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
++            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
++            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
++            camera_coordinate_t iaCoord = AiqUtils::convertToIaCoordinate(frameCoord, param.whitePoint);
++
++            mManualWhiteCoordinate.x = iaCoord.x;
++            mManualWhiteCoordinate.y = iaCoord.y;
++            break;
++        }
++        case AWB_MODE_MANUAL_GAIN:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
++            mManualGains = param.awbManualGain;
++            break;
++
++        default:
++            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
++            break;
++    }
++
++    mUseManualAwbGain = (param.awbMode == AWB_MODE_MANUAL_GAIN);
++    mAwbGainShift = param.awbGainShift;
++
++    if (param.awbConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
++        mAwbPerTicks = 1;
++
++        mAwbParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.awbConvergeSpeed);
++    } else {
++        mAwbParams.manual_convergence_time = -1;
++
++        /*
++         * The unit of mAePerTicks is frame count, 3 means 3 frames.
++         * The default value can be changed based on customer requirement.
++         */
++        switch (param.aeConvergeSpeed) {
++            case CONVERGE_MID:
++                mAwbPerTicks = 30;
++                break;
++            case CONVERGE_LOW:
++                mAwbPerTicks = 60;
++                break;
++            case CONVERGE_NORMAL:
++            default:
++                mAwbPerTicks = 1;
++                break;
++        }
++    }
++}
++
++void Intel3AParameter::updateAfParameter(const aiq_parameter_t& param)
++{
++    mAfParams.lens_position = param.lensPosition;
++    mAfParams.lens_movement_start_timestamp = param.lensMovementStartTimestamp;
++
++    LOG3A("%s, Focus position %d, timestamp %llu, afMode %d", __func__, param.lensPosition,
++            param.lensMovementStartTimestamp, param.afMode);
++
++    // Mode
++    if (mAfMode != param.afMode) {
++        // Reset af parameter
++        initAfParameter();
++
++        mAfMode = param.afMode;
++        if (mAfMode == AF_MODE_CONTINUOUS_PICTURE
++            || mAfMode == AF_MODE_CONTINUOUS_VIDEO) {
++            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
++        }
++        mAfTrigger = AF_TRIGGER_IDLE;
++        mAfForceLock = false;
++        mDuringAfTriggerScan = false;
++    }
++    mAfParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
++
++    // Trigger
++    mAfParams.trigger_new_search = false;
++    if (mAfTrigger != AF_TRIGGER_START && param.afTrigger == AF_TRIGGER_START) {
++        LOG3A("%s: Trigger AF scan, mode %d", __func__, mAfMode);
++        updateAfParameterForAfTriggerStart();
++    } else if (mAfTrigger != AF_TRIGGER_CANCEL && param.afTrigger == AF_TRIGGER_CANCEL) {
++        LOG3A("%s: Cancel AF scan, mode %d", __func__, mAfMode);
++        updateAfParameterForAfTriggerCancel();
++    }
++    mAfTrigger = param.afTrigger;
++
++    // Region
++    mAfParams.focus_rect = nullptr;
++    if (!param.afRegions.empty()) {
++        // Current only one AF metering window is supported, so use the latest one
++        camera_window_t window = param.afRegions.back();
++        if (window.right > window.left && window.bottom > window.top) {
++            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
++            window = AiqUtils::convertToIaWindow(frameCoord, window);
++            mFocusRect.left   = window.left;
++            mFocusRect.top    = window.top;
++            mFocusRect.right  = window.right;
++            mFocusRect.bottom = window.bottom;
++            mAfParams.focus_rect = &mFocusRect;
++            LOG3A("%s, af region = [%d,%d, %d, %d], window = [%d,%d,%d,%d]", __func__,
++                    mFocusRect.left, mFocusRect.top, mFocusRect.right, mFocusRect.bottom,
++                    window.left, window.top, window.right, window.bottom);
++        }
++    }
++
++    // Manual lens position
++    if (mAfMode == AF_MODE_OFF) {
++        mAfParams.manual_focus_parameters = &mManualFocusParams;
++        mAfParams.focus_mode = ia_aiq_af_operation_mode_manual;
++        mAfParams.focus_range = ia_aiq_af_range_extended;
++        mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
++
++        // Set AIQ manual action to 'none' by default
++        mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
++
++        // The focusDistance value from app is diopters, so the focusInMm = 1 / focusDistance
++        // Clamp focus distance between [0.0, minFocusDistance].
++        float focusDistance = param.focusDistance;
++        if (focusDistance > param.minFocusDistance) {
++            focusDistance = param.minFocusDistance;
++        } else if (focusDistance < 0.0f) {
++            focusDistance = 0.0f;
++        }
++
++        unsigned focusInMm = 0;
++        if (focusDistance != 0.0f) {
++            focusInMm = 1000 * (1.0f / focusDistance);
++            mAfParams.manual_focus_parameters->manual_focus_action =
++                ia_aiq_manual_focus_action_set_distance;
++        } else {
++            // 0.0f focus distance means infinity
++            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
++        }
++
++        mAfParams.manual_focus_parameters->manual_focus_distance = focusInMm;
++    } else {
++        mAfParams.manual_focus_parameters = nullptr;
++    }
++
++    LOG3A("%s, afForceLock %d, duringAfTriggerScan %d", __func__, mAfForceLock, mDuringAfTriggerScan);
++}
++
++void Intel3AParameter::updateAfParameterForAfTriggerStart()
++{
++    mDuringAfTriggerScan = true;
++    mAfForceLock = false;
++
++    switch (mAfMode) {
++        case AF_MODE_AUTO:
++        case AF_MODE_MACRO:
++            // Start user af scan in this frame.
++            mAfParams.frame_use = ia_aiq_frame_use_still;
++            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
++            mAfParams.trigger_new_search = true;
++            break;
++        case AF_MODE_CONTINUOUS_VIDEO:
++            // Lock AF immediately
++            mAfForceLock = true;
++            break;
++        case AF_MODE_CONTINUOUS_PICTURE:
++            // Continue the current scan and check the af result later
++            break;
++        default:
++            break;
++    }
++}
++
++void Intel3AParameter::updateAfParameterForAfTriggerCancel()
++{
++    mDuringAfTriggerScan = false;
++    mAfForceLock = false;
++
++    switch (mAfMode) {
++        case AF_MODE_AUTO:
++        case AF_MODE_MACRO:
++            // Stop AF scan triggered by user.
++            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
++            break;
++        default:
++            break;
++    }
++}
++
++void Intel3AParameter::fillAfTriggerResult(ia_aiq_af_results *afResults)
++{
++    if (!afResults || !mAfForceLock) {
++        return;
++    }
++
++    // Check the result of autofocus triggered by user
++    switch (mAfMode) {
++        case AF_MODE_CONTINUOUS_PICTURE:
++        case AF_MODE_AUTO:
++        case AF_MODE_MACRO:
++            // Lock AF after current scan
++            mAfForceLock = (afResults->status != ia_aiq_af_status_local_search
++                          && afResults->status != ia_aiq_af_status_extended_search);
++            break;
++        default:
++            break;
++    }
++
++    LOG3A("%s, %d update afForceLock %d", __func__, afResults->status, mAfForceLock);
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
+new file mode 100644
+index 000000000000..a3675a490502
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_aiq.h"
++
++#include "AiqSetting.h"
++#include "AiqUtils.h"
++
++namespace icamera {
++
++/*
++ * \class Intel3AParameter
++ * This class is used to prepare those parameters for
++ * 3A running.
++ */
++class Intel3AParameter {
++
++public:
++    Intel3AParameter(int cameraId);
++    ~Intel3AParameter();
++
++    int init();
++    int setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor);
++    int updateParameter(aiq_parameter_t param);
++    void updateAeResult(ia_aiq_ae_results* aeResult);
++    void updateAwbResult(ia_aiq_awb_results* awbResult);
++
++    void fillAfTriggerResult(ia_aiq_af_results *afResults);
++
++private:
++    void initAeParameter();
++    void initAfParameter();
++    void initAwbParameter();
++
++    void updateAeParameter(const aiq_parameter_t& param);
++    void updateAwbParameter(const aiq_parameter_t& param);
++    void updateAfParameter(const aiq_parameter_t& param);
++    void updateAfParameterForAfTriggerStart();
++    void updateAfParameterForAfTriggerCancel();
++
++    float convertdBGainToISO(float sensitivityGain, int baseIso);
++    void setManualExposure(const aiq_parameter_t& param);
++    void setManualGain(const aiq_parameter_t& param);
++    void setManualIso(const aiq_parameter_t& param);
++    void setAeManualLimits(const aiq_parameter_t& param);
++public:
++    int mCameraId;
++    // aiq 3a parameters
++    ia_aiq_ae_input_params  mAeParams;
++    ia_aiq_af_input_params  mAfParams;
++    ia_aiq_awb_input_params mAwbParams;
++
++    bool mUseManualAwbGain;
++    camera_awb_gains_t mManualGains;
++    camera_awb_gains_t mAwbGainShift;
++    camera_weight_grid_mode_t mWeightGridMode;
++
++    int mAePerTicks;
++    int mAwbPerTicks;
++
++    bool mAfForceLock; // Lock AF to respond autofocus action triggered by user.
++private:
++    static const int MAX_FOCUS_DISTANCE = 5000; // unit is mm
++
++    /*!< ia_aiq_ae_input_params pointer contents */
++    ia_aiq_exposure_sensor_descriptor mSensorDescriptor;
++    ia_rectangle mExposureWindow;
++    ia_coordinate mExposureCoordinate;
++    ia_aiq_ae_features mAeFeatures;
++    ia_aiq_ae_manual_limits mAeManualLimits;
++
++    /*!< ia_aiq_af_input_params pointer contents */
++    ia_aiq_manual_focus_parameters mManualFocusParams;
++    ia_rectangle mFocusRect;
++
++    /*!< ia_aiq_awb_input_params pointer contents */
++    ia_aiq_awb_manual_cct_range mManualCctRange;
++    ia_coordinate mManualWhiteCoordinate;
++
++    long mManualExposureTimeUs[MAX_EXPOSURES_NUM];
++    float mManualAnalogGain[MAX_EXPOSURES_NUM];
++    short mManualIso[MAX_EXPOSURES_NUM];
++
++    camera_af_mode_t mAfMode;
++    camera_af_trigger_t mAfTrigger;
++    bool mDuringAfTriggerScan;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.cpp b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
+new file mode 100644
+index 000000000000..32c160e46074
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
+@@ -0,0 +1,286 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "BufferQueue"
++
++#include "iutils/CameraLog.h"
++
++#include "BufferQueue.h"
++#include "PlatformData.h"
++
++namespace icamera {
++
++BufferProducer::BufferProducer(int memType) : mMemType(memType)
++{
++    LOG1("@%s BufferProducer created mMemType: %d", __func__, mMemType);
++}
++
++BufferQueue::BufferQueue() : mBufferProducer(nullptr),
++                             mProcessThread(nullptr),
++                             mThreadRunning(false)
++{
++    LOG1("@%s BufferQueue created", __func__);
++}
++
++BufferQueue::~BufferQueue()
++{
++    LOG1("@%s BufferQueue destroyed", __func__);
++}
++
++int BufferQueue::queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    // If it's not in mInputQueue, then it's not for this processor.
++    if (mInputQueue.find(port) == mInputQueue.end()) {
++        return OK;
++    }
++
++    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
++
++    CameraBufQ &input = mInputQueue[port];
++    bool needSignal = input.empty();
++    input.push(camBuffer);
++    if (needSignal) {
++        mFrameAvailableSignal.signal();
++    }
++
++    LOG2("%s Exit", __func__);
++    return OK;
++}
++
++int BufferQueue::onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    AutoMutex l(mBufferQueueLock);
++
++    return queueInputBuffer(port, camBuffer);
++}
++
++void BufferQueue::setBufferProducer(BufferProducer *producer)
++{
++    LOG1("%s producer %p", __func__, producer);
++
++    AutoMutex l(mBufferQueueLock);
++    mBufferProducer = producer;
++
++    if (producer == nullptr)
++        return;
++
++    mBufferProducer->addFrameAvailableListener(this);
++}
++
++void BufferQueue::addFrameAvailableListener(BufferConsumer *listener)
++{
++    LOG1("%s listener %p", __func__, listener);
++    AutoMutex   l(mBufferQueueLock);
++    bool isAlreadyAdded = false;
++    for (auto& consumer : mBufferConsumerList) {
++        if (consumer == listener) {
++            isAlreadyAdded = true;
++            break;
++        }
++    }
++
++    // If the listener has been already added, then we don't register it again.
++    if (isAlreadyAdded) {
++        return;
++    }
++    mBufferConsumerList.push_back(listener);
++}
++
++void BufferQueue::removeFrameAvailableListener(BufferConsumer *listener)
++{
++    LOG1("%s listener %p", __func__, listener);
++    AutoMutex   l(mBufferQueueLock);
++
++    for (auto it = mBufferConsumerList.begin(); it != mBufferConsumerList.end(); ++it) {
++        if ((*it) == listener) {
++            mBufferConsumerList.erase(it);
++            break;
++        }
++    }
++}
++
++int BufferQueue::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
++
++    //Enqueue buffer to internal pool
++    AutoMutex   l(mBufferQueueLock);
++    if (camBuffer != nullptr && camBuffer->getStreamType() == CAMERA_STREAM_INPUT) {
++        return queueInputBuffer(port, camBuffer);
++    }
++
++    if (mOutputQueue.find(port) == mOutputQueue.end()) {
++        LOGE("Not supported port:%d", port);
++        return BAD_VALUE;
++    }
++
++    CameraBufQ &output = mOutputQueue[port];
++    bool needSignal = output.empty();
++    output.push(camBuffer);
++    if (needSignal) {
++        mOutputAvailableSignal.signal();
++    }
++
++    return OK;
++}
++
++void BufferQueue::clearBufferQueues()
++{
++    AutoMutex l(mBufferQueueLock);
++
++    mInputQueue.clear();
++    for (const auto& input : mInputFrameInfo) {
++        mInputQueue[input.first] = CameraBufQ();
++    }
++
++    mOutputQueue.clear();
++    for (const auto& output : mOutputFrameInfo) {
++        mOutputQueue[output.first] = CameraBufQ();
++    }
++}
++
++void BufferQueue::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
++                               const std::map<Port, stream_t>& outputInfo)
++{
++    mInputFrameInfo = inputInfo;
++    mOutputFrameInfo = outputInfo;
++
++    clearBufferQueues();
++}
++
++void BufferQueue::getFrameInfo(std::map<Port, stream_t>& inputInfo,
++                               std::map<Port, stream_t>& outputInfo) const
++{
++    inputInfo = mInputFrameInfo;
++    outputInfo = mOutputFrameInfo;
++}
++
++int BufferQueue::waitFreeBuffersInQueue(ConditionLock& lock,
++                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
++                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
++                                        int64_t timeout)
++{
++    LOG2("@%s start waiting the input and output buffers", __func__);
++
++    if (!mThreadRunning) {
++        LOG1("@%s: Processor is not active.", __func__);
++        return OK;
++    }
++
++    int ret = OK;
++    timeout = (timeout ? timeout : kWaitDuration) * SLOWLY_MULTIPLIER;
++
++    for (auto& input: mInputQueue) {
++        Port port = input.first;
++        CameraBufQ &inputQueue = input.second;
++        while (inputQueue.empty()) {
++            LOG2("%s: wait input port %d", __func__, port);
++            ret = mFrameAvailableSignal.waitRelative(lock, timeout);
++
++            // Thread was stopped during wait
++            if (!mThreadRunning) {
++                LOG1("@%s: Processor is not active while waiting for input buffers", __func__);
++                return OK;
++            }
++
++            if (ret == TIMED_OUT) {
++                return ret;
++            }
++        }
++        // Wake up from the buffer available
++        cInBuffer[port] = inputQueue.front();
++    }
++
++    for (auto& output: mOutputQueue) {
++        Port port = output.first;
++        CameraBufQ &outputQueue = output.second;
++        while (outputQueue.empty()) {
++            LOG2("%s: wait output port %d", __func__, port);
++            ret = mOutputAvailableSignal.waitRelative(lock, timeout);
++
++            // Thread was stopped during wait
++            if (!mThreadRunning) {
++                LOG1("@%s: Processor is not active while waiting for output buffers.", __func__);
++                return OK;
++            }
++
++            if (ret == TIMED_OUT) {
++                return ret;
++            }
++        }
++
++        cOutBuffer[port] = outputQueue.front();
++    }
++
++    return ret;
++}
++
++int BufferQueue::allocProducerBuffers(int camId, int bufNum)
++{
++    LOG1("%s: buffer queue size %d", __func__, bufNum);
++
++    mInternalBuffers.clear();
++
++    CheckError(!mBufferProducer, BAD_VALUE ,"@%s: Buffer Producer is nullptr", __func__);
++
++    for (const auto& item : mInputFrameInfo) {
++        Port port = item.first;
++        int srcFmt = item.second.format;
++        int srcWidth = item.second.width;
++        int srcHeight = item.second.height;
++
++        LOG1("%s fmt:%s (%dx%d)", __func__,
++             CameraUtils::format2string(srcFmt).c_str(), srcWidth, srcHeight);
++
++        int32_t size = 0;
++        bool isISYSCompression = PlatformData::getISYSCompression(camId);
++        if (isISYSCompression)
++            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight, false, true, true);
++        else
++            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight);
++        int memType = mBufferProducer->getMemoryType();
++
++        for (int i = 0; i < bufNum; i++) {
++            std::shared_ptr<CameraBuffer> camBuffer;
++            switch (memType) {
++            case V4L2_MEMORY_USERPTR:
++                camBuffer = CameraBuffer::create(camId, BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR,
++                                                 size, i, srcFmt, srcWidth, srcHeight);
++                CheckError(!camBuffer, NO_MEMORY, "Allocate producer userptr buffer failed");
++                break;
++
++            case V4L2_MEMORY_MMAP:
++                camBuffer = std::make_shared<CameraBuffer>(camId, BUFFER_USAGE_PSYS_INPUT,
++                                                      V4L2_MEMORY_MMAP, size, i, srcFmt);
++                CheckError(!camBuffer, NO_MEMORY, "Allocate producer mmap buffer failed");
++                camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
++                mBufferProducer->allocateMemory(port, camBuffer);
++                break;
++
++            default:
++                LOGE("Not supported v4l2 memory type:%d", memType);
++                return BAD_VALUE;
++            }
++
++            mInternalBuffers[port].push_back(camBuffer);
++            mBufferProducer->qbuf(port, camBuffer);
++        }
++    }
++
++    return OK;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.h b/camera/hal/intel/ipu6/src/core/BufferQueue.h
+new file mode 100644
+index 000000000000..a8ab5d337688
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/BufferQueue.h
+@@ -0,0 +1,206 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <vector>
++#include "iutils/Thread.h"
++#include "iutils/Errors.h"
++
++#include "CameraEvent.h"
++#include "CameraBuffer.h"
++
++/**
++ * These are the abstract Classes for buffer communication between different class of HAL
++ */
++namespace icamera {
++
++class BufferProducer;
++
++/**
++ * BufferConsumer listens on the onFrameAvailable event from the producer by
++ * calling setBufferProducer
++ */
++class BufferConsumer {
++public:
++    virtual ~BufferConsumer() {};
++    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
++    virtual void setBufferProducer(BufferProducer *producer) = 0;
++};
++
++/**
++ * BufferProcuder get the buffers from consumer by "qbuf".
++ * Notfiy the consumer by calling the onFramAvaible interface of consumer.
++ * The consumer must be registered by "addFrameAvailableListener" before getting
++ * any buffer done notification.
++ */
++class BufferProducer : public EventSource {
++public:
++    BufferProducer(int memType = V4L2_MEMORY_USERPTR);
++    virtual ~BufferProducer() {};
++    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
++    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
++    virtual void addFrameAvailableListener(BufferConsumer *listener) = 0;
++    virtual void removeFrameAvailableListener(BufferConsumer *listener) = 0;
++    int getMemoryType(void) const {return mMemType;}
++
++private:
++    int mMemType;
++};
++
++class BufferQueue: public BufferConsumer, public BufferProducer, public EventListener {
++public:
++    BufferQueue();
++    virtual ~BufferQueue();
++
++    /**
++     * \brief the notify when poll one frame buffer
++     *
++     * Push the CameraBuffer to InputQueue and send a signal if needed
++     */
++    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    /**
++     * \brief Register the BufferProducer
++     *
++     * Register the BufferProducer: Psys, software, or captureUnit
++     */
++    virtual void setBufferProducer(BufferProducer *producer);
++
++    /**
++     * \brief Queue one buffer to producer
++     *
++     * Push this buffer to output queue
++     */
++    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    /**
++     * \brief allocate memory
++     *
++     * Not support this function in Psys and SWProcessor
++     */
++    virtual int allocateMemory(Port port,
++                               const std::shared_ptr<CameraBuffer> &camBuffer) { return -1; }
++
++    /**
++     * \brief Add the get frame listener
++     */
++    virtual void addFrameAvailableListener(BufferConsumer *listener);
++
++    /**
++     * \brief Remove the get frame listener
++     */
++    virtual void removeFrameAvailableListener(BufferConsumer *listener);
++
++    /**
++     * \brief Set all frames configuration
++     *
++     * Must be called before configure which needs use frame configuration.
++     */
++    virtual void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
++                              const std::map<Port, stream_t>& outputInfo);
++
++    /*
++     * \brief Get all frames configuration
++     */
++    virtual void getFrameInfo(std::map<Port, stream_t>& inputInfo,
++                              std::map<Port, stream_t>& outputInfo) const;
++
++    /**
++     * \brief Register user buffers to processor(PSys)
++     */
++    virtual int registerUserOutputBufs(Port port,
++            const std::shared_ptr<CameraBuffer> &camBuffer) { return OK; }
++
++    /**
++     * \brief Common Interface
++     */
++    virtual int start() = 0;
++    virtual void stop() = 0;
++    virtual int setParameters(const Parameters& param) { return OK; }
++    virtual int getParameters(Parameters& param) { return OK; }
++    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
++
++protected:
++    virtual int processNewFrame() = 0;
++
++    /**
++     * \brief Clear and initialize input and output buffer queues.
++     */
++    void clearBufferQueues();
++    /**
++     * \brief Wait for available input and output buffers.
++     *
++     * Only fetch buffer from the buffer queue, need pop buffer from
++     * the queue after the buffer is used, and need to be protected by mBufferQueueLock.
++     */
++    int waitFreeBuffersInQueue(ConditionLock& lock,
++                               std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
++                               std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
++                               int64_t timeout = 0);
++    /**
++     * \brief Buffers allocation for producer
++     */
++    int allocProducerBuffers(int camId, int bufNum);
++
++protected:
++    /**
++     * \brief The process new frame buffer thread
++     *
++     * Use this thread listen to the input queue and output queue.
++     * And do process if these two queues are not empty
++     */
++    class ProcessThread: public Thread {
++        BufferQueue *mProcessor;
++        public:
++            ProcessThread(BufferQueue *p)
++                : mProcessor(p) { }
++
++            virtual bool threadLoop() {
++                int ret = mProcessor->processNewFrame();
++                return (ret == 0);
++            }
++    };
++    static const nsecs_t kWaitDuration = 10000000000; //10000ms
++
++    BufferProducer *mBufferProducer;
++    std::vector<BufferConsumer*> mBufferConsumerList;
++
++    std::map<Port, stream_t> mInputFrameInfo;
++    std::map<Port, stream_t> mOutputFrameInfo;
++
++    std::map<Port, CameraBufQ> mInputQueue;
++    std::map<Port, CameraBufQ> mOutputQueue;
++
++    // For internal buffers allocation for producer
++    std::map<Port, CameraBufVector> mInternalBuffers;
++
++    // Guard for BufferQueue public API
++    Mutex  mBufferQueueLock;
++    Condition mFrameAvailableSignal;
++    Condition mOutputAvailableSignal;
++
++    //for the thread loop
++    ProcessThread* mProcessThread;
++    bool mThreadRunning;   //state of the processor. true after start and false after stop
++
++private:
++    int queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
+new file mode 100644
+index 000000000000..596172263ee5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
+@@ -0,0 +1,407 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraBuffer"
++
++#include <sys/mman.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <string.h>
++#include <vector>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#include "PlatformData.h"
++#include "CameraBuffer.h"
++
++namespace icamera {
++CameraBuffer::CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format) :
++    mNumPlanes(1),
++    mAllocatedMemory(false),
++    mU(nullptr),
++    mBufferUsage(usage),
++    mSettingSequence(-1)
++
++{
++    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
++    int num_plane = 1;
++
++    LOG1("%s: construct CameraBuffer with cameraId:%d, usage:%d, memory:%d, size:%d, format:%d, index:%d",
++         __func__, cameraId, usage, memory, size, format, index);
++
++    mU = new camera_buffer_t;
++    CLEAR(*mU);
++    mU->flags = BUFFER_FLAG_INTERNAL;
++    mU->sequence = -1;
++
++    switch (usage) {
++        case BUFFER_USAGE_PSYS_INPUT:
++            //follow through
++        case BUFFER_USAGE_PSYS_INTERNAL:
++        case BUFFER_USAGE_GENERAL:
++            if (PlatformData::isIsysEnabled(cameraId)
++                && PlatformData::isCSIFrontEndCapture(cameraId)) {
++                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
++                num_plane = CameraUtils::getNumOfPlanes(format);
++            } else {
++                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
++            }
++            break;
++        case BUFFER_USAGE_PSYS_STATS:
++            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
++            break;
++        case BUFFER_USAGE_MIPI_CAPTURE:
++        case BUFFER_USAGE_METADATA:
++            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
++            num_plane = CameraUtils::getNumOfPlanes(format);
++            break;
++        default:
++            LOGE("Not supported Usage");
++    }
++
++    CLEAR(mMmapAddrs);
++    CLEAR(mDmaFd);
++
++    initBuffer(memory, type, size, index, num_plane);
++}
++
++CameraBuffer::~CameraBuffer()
++{
++    LOG1("Free CameraBuffer");
++
++    freeMemory();
++
++    if (mU->flags & BUFFER_FLAG_INTERNAL) {
++        delete mU;
++    }
++}
++
++void CameraBuffer::initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane)
++{
++    mV.SetMemory(memType);
++    mV.SetIndex(idx);
++
++    mV.SetType(bufType);
++
++    if (!V4L2_TYPE_IS_MULTIPLANAR(bufType)) {
++        mV.SetOffset(0, 0);
++        mV.SetLength(size, 0);
++        LOGE("SINGLE PLANE!");
++    } else {
++        mV.SetLength(num_plane, 0);
++        mNumPlanes = num_plane;
++        for (int i = 0; i < mNumPlanes; ++i) {
++            mV.SetLength(size, i);
++        }
++    }
++
++    mV.SetFlags(mV.Flags() | V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN);
++}
++
++//Helper function to construct a Internal CameraBuffer
++std::shared_ptr<CameraBuffer> CameraBuffer::create(int cameraId, int usage, int memory, unsigned int size, int index,
++                                              int srcFmt, int srcWidth, int srcHeight)
++{
++    std::shared_ptr<CameraBuffer> camBuffer = std::make_shared<CameraBuffer>(cameraId, usage, memory, size, index, srcFmt);
++
++    CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
++
++    camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
++
++    int ret = camBuffer->allocateMemory();
++
++    CheckError(ret != OK, nullptr, "Allocate memory failed ret %d", ret);
++
++    return camBuffer;
++}
++
++//Internal frame Buffer
++void CameraBuffer::setUserBufferInfo(int format, int width, int height)
++{
++    LOG1("%s: format:%d, width:%d, height:%d", __func__, format, width, height);
++    mU->s.width = width;
++    mU->s.height = height;
++    mU->s.format = format;
++    if (format != -1) {
++        mU->s.stride = CameraUtils::getStride(format, width);
++    }
++}
++
++void CameraBuffer::setUserBufferInfo(int format, int width, int height, void *usrPtr)
++{
++    setUserBufferInfo(format, width, height);
++    setAddr(usrPtr, 0);
++}
++
++//Called when a buffer is from the application
++void CameraBuffer::setUserBufferInfo(camera_buffer_t *ubuffer)
++{
++    CheckError(ubuffer == nullptr, VOID_VALUE, "%s: ubuffer is nullptr", __func__);
++
++    if (mU->flags & BUFFER_FLAG_INTERNAL) delete mU;
++    mU = ubuffer;
++
++    LOG1("%s: ubuffer->s.MemType: %d, addr: %p, fd: %d", __func__, ubuffer->s.memType,
++         ubuffer->addr, ubuffer->dmafd);
++    //update the v4l2 buffer memory with user infro
++    switch (ubuffer->s.memType) {
++        case V4L2_MEMORY_USERPTR:
++            setAddr(ubuffer->addr, 0);
++            break;
++        case V4L2_MEMORY_DMABUF:
++            setFd(ubuffer->dmafd, 0);
++            break;
++        case V4L2_MEMORY_MMAP:
++            /* do nothing */
++            break;
++        default:
++            LOGE("iomode %d is not supported yet.", mV.Memory());
++            break;
++    }
++
++    if (mU->s.streamType == CAMERA_STREAM_INPUT || ubuffer->sequence >= 0) {
++        mV.SetSequence(ubuffer->sequence);
++        LOG2("%s, input buffer sequence %lld", __func__, ubuffer->sequence);
++    }
++}
++
++void CameraBuffer::updateV4l2Buffer(const v4l2_buffer_t& v4l2buf)
++{
++    mV.SetField(v4l2buf.field);
++    mV.SetTimestamp(v4l2buf.timestamp);
++    mV.SetSequence(v4l2buf.sequence);
++    mV.SetRequestFd(v4l2buf.request_fd);
++}
++
++/*export mmap buffer as dma_buf fd stored in mV and mU*/
++int CameraBuffer::exportMmapDmabuf(V4L2VideoNode *vDevice)
++{
++    std::vector<int> fds;
++
++    int ret = vDevice->ExportFrame(mV.Index(), &fds);
++
++    CheckError(ret != OK, -1, "exportMmapDmabuf failed, ret %d", ret);
++
++    for (size_t i = 0; i < fds.size(); ++i) {
++        setFd(fds[i], i);
++    }
++
++    if (mU->flags & BUFFER_FLAG_DMA_EXPORT) {
++        mU->dmafd = getFd(0);
++    }
++
++    return OK;
++}
++
++int CameraBuffer::allocateMemory(V4L2VideoNode* vDevice)
++{
++    int ret = BAD_VALUE;
++    LOG1("%s", __func__);
++    switch(mV.Memory()) {
++        case V4L2_MEMORY_USERPTR:
++            ret = allocateUserPtr();
++            mAllocatedMemory = true;
++            mU->addr = getAddr();
++            break;
++        case V4L2_MEMORY_MMAP:
++            exportMmapDmabuf(vDevice);
++            ret = allocateMmap(vDevice);
++            mU->addr = getAddr();
++            mAllocatedMemory = true;
++            break;
++        default:
++            LOGE("memory type %d is incorrect for allocateMemory.", mV.Memory());
++            return BAD_VALUE;
++    }
++
++    return ret;
++}
++
++int CameraBuffer::allocateUserPtr()
++{
++    void* buffer = nullptr;
++    for (int i = 0; i < mNumPlanes; ++i) {
++        int ret = posix_memalign(&buffer, getpagesize(), mV.Length(i));
++        CheckError(ret != 0, -1, "%s, posix_memalign fails, ret:%d", __func__, ret);
++        mV.SetUserptr(reinterpret_cast<uintptr_t>(buffer), i);
++        mMmapAddrs[i] = buffer;
++    }
++    return OK;
++}
++
++void CameraBuffer::freeUserPtr()
++{
++    for (int i = 0; i < mNumPlanes; ++i) {
++        void* ptr = reinterpret_cast<void*>(mV.Userptr(i));
++        mMmapAddrs[i] = nullptr;
++        ::free(ptr);
++        mV.SetUserptr(reinterpret_cast<uintptr_t>(nullptr), i);
++    }
++}
++
++int CameraBuffer::allocateMmap(V4L2VideoNode* dev)
++{
++    std::vector<void*> addrs;
++    int ret = dev->MapMemory(mV.Index(), PROT_READ | PROT_WRITE,
++                            MAP_SHARED, &addrs);
++
++    CheckError(ret != OK, -1, "allocateMmap failed, ret %d", ret);
++
++    for (unsigned int i = 0; i < addrs.size(); ++i) {
++        if (addrs[i] == MAP_FAILED) {
++            mMmapAddrs[i] = nullptr;
++            continue ;
++        }
++        mMmapAddrs[i] = addrs[i];
++    }
++
++    return OK;
++}
++
++void* CameraBuffer::getAddr(int plane)
++{
++    CheckError(plane < 0 || plane >= mNumPlanes, nullptr, "Wrong plane number %d", plane);
++
++    switch (mV.Memory()) {
++        case V4L2_MEMORY_MMAP:
++            return mMmapAddrs[plane];
++        case V4L2_MEMORY_USERPTR:
++            return reinterpret_cast<void*>(mV.Userptr(plane));
++        default:
++            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
++    }
++    return nullptr;
++}
++
++void CameraBuffer::setAddr(void *addr, int plane)
++{
++    CheckError(plane < 0 || plane >= mNumPlanes, VOID_VALUE,
++               "Wrong plane number %d", plane);
++
++    switch (mV.Memory()) {
++        case V4L2_MEMORY_MMAP:
++            mMmapAddrs[plane] = addr;
++            return;
++        case V4L2_MEMORY_USERPTR:
++            mV.SetUserptr(reinterpret_cast<uintptr_t>(addr), plane);
++            mMmapAddrs[plane] = addr;
++            return;
++        default:
++            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
++    }
++}
++
++void CameraBuffer::freeMmap()
++{
++    int ret = OK;
++
++    for (int i = 0; i < mNumPlanes; i++) {
++        if (getFd(i) != -1) {
++            ::close(getFd(i));
++            setFd(-1, i);
++        }
++        if (mMmapAddrs[i]) {
++            ret = ::munmap(mMmapAddrs[i], mV.Length(i));
++            CheckError(ret != 0, VOID_VALUE, "failed to munmap buffer %d", i);
++            mMmapAddrs[i] = nullptr;
++        }
++    }
++}
++
++void* CameraBuffer::mapDmaBufferAddr(int fd, unsigned int bufferSize)
++{
++    if(fd < 0 || !bufferSize) {
++        LOGE("%s, fd:0x%x, bufferSize:%u", __func__, fd, bufferSize);
++        return nullptr;
++    }
++    return ::mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
++}
++
++void CameraBuffer::unmapDmaBufferAddr(void* addr, unsigned int bufferSize)
++{
++    if(addr == nullptr || !bufferSize) {
++        LOGE("%s, addr:%p, bufferSize:%u", __func__, addr, bufferSize);
++        return;
++    }
++    munmap(addr, bufferSize);
++}
++
++void CameraBuffer::freeMemory()
++{
++    if (!mAllocatedMemory) {
++        LOG2("@%s Memory(in %p) is not allocated by CameraBuffer class. Don't free it.", __func__, this);
++        return ;
++    }
++
++    switch(mV.Memory()) {
++        case V4L2_MEMORY_USERPTR:
++            freeUserPtr();
++            break;
++        case V4L2_MEMORY_MMAP:
++            freeMmap();
++            break;
++        default:
++            LOGE("Free camera buffer failed, due to memory %d type is not implemented yet.", mV.Memory());
++    }
++}
++
++void CameraBuffer::updateUserBuffer(void)
++{
++    mU->timestamp = TIMEVAL2NSECS(getTimestamp());
++    mU->s.field = getField();
++
++    // Use valid setting sequence to align shutter/parameter with buffer
++    mU->sequence = (mSettingSequence < 0) ? getSequence() : mSettingSequence;
++}
++
++void CameraBuffer::updateFlags(void)
++{
++    int flag = V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN;
++    bool set = true;
++
++    //clear the flags if the buffers is accessed by the SW
++    if ((mU->flags & BUFFER_FLAG_SW_READ) || (mU->flags & BUFFER_FLAG_SW_WRITE)) {
++        set = false;
++    }
++
++    mV.SetFlags(set ? (mV.Flags() | flag): (mV.Flags() & (~flag)));
++}
++
++bool CameraBuffer::isFlagsSet(int flag)
++{
++    return ((mU->flags & flag) ? true : false);
++}
++
++void CameraBuffer::setFd(int val, int plane)
++{
++    if (mV.Memory() == V4L2_MEMORY_MMAP) {
++        mDmaFd[plane] = val;
++    } else {
++        mV.SetFd(val, plane);
++    }
++}
++
++int CameraBuffer::getFd(int plane)
++{
++    if (mV.Memory() == V4L2_MEMORY_MMAP) {
++        return mDmaFd[plane];
++    }
++
++    return mV.Fd(plane);
++}
++
++}//namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.h b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
+new file mode 100644
+index 000000000000..c2361dfdd7cb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
+@@ -0,0 +1,170 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <queue>
++#include <vector>
++
++#include <linux/videodev2.h>
++#include <v4l2_device.h>
++
++#include "api/Parameters.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++typedef struct v4l2_buffer v4l2_buffer_t;
++
++/* CameraBuffer is the core buffers for HAL. The buffer usage is described by the
++ * BufferUsage. CameraBuffer are constructed based on usage */
++enum BufferUsage {
++    BUFFER_USAGE_GENERAL = 0,
++    BUFFER_USAGE_PSYS_STATS,
++    BUFFER_USAGE_PSYS_INPUT,
++    BUFFER_USAGE_MIPI_CAPTURE,
++    BUFFER_USAGE_METADATA,
++    BUFFER_USAGE_PSYS_INTERNAL,
++};
++
++class CameraBuffer {
++public:
++    //assist function to create frame buffers
++    static std::shared_ptr<CameraBuffer>
++    create(int cameraId, int usage, int memory, unsigned int size, int index,
++           int srcFmt = -1, int srcWidth=-1, int srcHeight=-1);
++
++public:
++    CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format = -1);
++    virtual ~CameraBuffer();
++
++public:
++    //user buffer information
++    int getWidth() const { return mU->s.width; }
++    int getHeight() const { return mU->s.height; }
++    int getStride() const { return mU->s.stride; }
++    int getFormat() const { return mU->s.format; }
++    int getStreamType() const { return mU->s.streamType; }
++    int getStreamUsage() const { return mU->s.usage; }
++    int getStreamId() const { return mU->s.id; }
++    int getFlags() const { return mU->flags; }
++
++    //v4l2 buffer information
++    uint32_t getIndex(void) const { return mV.Index(); }
++
++    uint32_t getSequence(void) const { return mV.Sequence(); }
++    void setSequence(uint32_t sequence) { mV.SetSequence(sequence); }
++
++    uint32_t getField() const { return mV.Field(); }
++    void setField(uint32_t field) { mV.SetField(field); }
++
++    struct timeval getTimestamp(void) const  { return mV.Timestamp(); }
++    void setTimestamp(struct timeval timestamp) { mV.SetTimestamp(timestamp); }
++
++    int getFd(int planeIndex = 0);
++
++    uint32_t getMemory(void) const { return mV.Memory(); }
++
++    int numPlanes() { return mNumPlanes; }
++
++     //For debug only v4l2 buffer information
++    int getCsi2Port(void) const { return (mV.RequestFd() >> 4) & 0xf; }
++    int getVirtualChannel(void) const { return mV.RequestFd() & 0xf; }
++
++    /* u buffer is used to attach user private structure pointer
++     * in CameraBuffer.
++     *
++     * Now, one of this usage is linking camera_buffer_t to CameraBuffer
++     * together, so that we can get each pointer by other.
++     * Notes: Please don't abuse this. It is only used in CameraDevice for user buffer
++     */
++    camera_buffer_t *getUserBuffer() { return mU; }
++    //update the user  buffer with latest v4l2 buffer info from driver
++    void    updateUserBuffer(void);
++    //Update the v4l2 flags according to user buffer flag
++    void    UpdateFlags(void);
++    void    updateFlags(void);
++
++    //Check if the specific flag in "mU->flags" is set or not
++    bool isFlagsSet(int flag);
++    //The ubuffer is from application
++    void setUserBufferInfo(camera_buffer_t *ubuffer);
++    void setUserBufferInfo(int format, int width, int height);
++    void setUserBufferInfo(int format, int width, int height, void *usrPtr);
++
++    uint32_t getBufferSize(int planeIndex = 0) { return mV.Length(planeIndex); }
++    void setBufferSize(unsigned int size, int planeIndex = 0) { mV.SetLength(size, planeIndex); }
++
++    unsigned int getBytesused(int planeIndex = 0) { return mV.BytesUsed(planeIndex); }
++    void setBytesused(unsigned int bytes, int planeIndex = 0) { mV.SetBytesUsed(bytes, planeIndex); }
++
++    void* getBufferAddr(int planeIndex = 0) { return getAddr(planeIndex); }
++    void  setBufferAddr(void *addr, int planeIndex = 0) { return setAddr(addr, planeIndex); }
++
++    void updateV4l2Buffer(const v4l2_buffer_t& v4l2buf);
++
++    V4L2Buffer& getV4L2Buffer() { return mV; }
++
++    int getUsage() const { return mBufferUsage; }
++
++    void setSettingSequence(long sequence) { mSettingSequence = sequence; }
++    long getSettingSequence() const { return mSettingSequence; }
++
++    //Buffers are allocated the buffers by Camera
++    int allocateMemory(V4L2VideoNode *vDevice = nullptr);
++
++public:
++    static void* mapDmaBufferAddr(int fd, unsigned int bufferSize);
++    static void unmapDmaBufferAddr(void* addr, unsigned int bufferSize);
++
++private:
++    CameraBuffer(const CameraBuffer&);
++    CameraBuffer& operator=(const CameraBuffer&);
++
++    void freeMemory();
++    int exportMmapDmabuf(V4L2VideoNode *vDevice);
++
++    int allocateMmap(V4L2VideoNode* dev);
++    int allocateUserPtr();
++    void freeUserPtr();
++    void freeMmap();
++    void* getAddr(int plane = 0);
++    void setAddr(void *userAddr, int plane = 0);
++    void initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane);
++
++    void setFd(int val, int plane);
++
++protected:
++    V4L2Buffer mV;
++    int mNumPlanes;
++
++private:
++    //To tag whether the memory is allocated by CameraBuffer class. We need to free them
++    bool mAllocatedMemory;
++
++    camera_buffer_t *mU;
++    int mBufferUsage;
++    long mSettingSequence;
++
++    void* mMmapAddrs[VIDEO_MAX_PLANES];
++    int mDmaFd[VIDEO_MAX_PLANES];
++};
++
++typedef std::vector<std::shared_ptr<CameraBuffer> > CameraBufVector;
++typedef std::queue<std::shared_ptr<CameraBuffer> > CameraBufQ;
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.cpp b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
+new file mode 100644
+index 000000000000..6133c2103f8e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
+@@ -0,0 +1,1182 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraDevice"
++
++#include <vector>
++
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++
++#include "IGraphConfig.h"
++#include "ICamera.h"
++#include "PlatformData.h"
++#include "CameraDevice.h"
++#include "V4l2DeviceFactory.h"
++#include "I3AControlFactory.h"
++#include "CaptureUnit.h"
++
++using std::vector;
++
++namespace icamera {
++
++CameraDevice::CameraDevice(int cameraId) :
++    mState(DEVICE_UNINIT),
++    mCameraId(cameraId),
++    mStreamNum(0),
++    mCallback(nullptr)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, cameraId:%d", __func__, mCameraId);
++
++    CLEAR(mStreams);
++
++    V4l2DeviceFactory::createDeviceFactory(mCameraId);
++    CLEAR(mInputConfig);
++    mInputConfig.format = -1;
++
++    mProducer = createBufferProducer();
++
++    mSofSource = new SofSource(mCameraId);
++
++    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
++    LOG2("%s: support perframe %d", __func__, mPerframeControlSupport);
++    mParamGenerator = new ParameterGenerator(mCameraId);
++
++    mLensCtrl = new LensHw(mCameraId);
++    mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
++
++    m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
++    mRequestThread = new RequestThread(mCameraId, m3AControl, mParamGenerator);
++    mRequestThread->registerListener(EVENT_PROCESS_REQUEST, this);
++    mRequestThread->registerListener(EVENT_DEVICE_RECONFIGURE, this);
++
++    mProcessorManager = new ProcessorManager(mCameraId);
++
++    if (PlatformData::getGraphConfigNodes(mCameraId)) {
++        mGCM = IGraphConfigManager::getInstance(mCameraId);
++    } else {
++        mGCM = nullptr;
++    }
++}
++
++CameraDevice::~CameraDevice()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++    AutoMutex   m(mDeviceLock);
++
++    // Clear the media control when close the device.
++    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
++    if (mc) {
++        MediaControl::getInstance()->mediaCtlClear(mCameraId, mc);
++    }
++
++    mRequestThread->removeListener(EVENT_PROCESS_REQUEST, this);
++    mRequestThread->removeListener(EVENT_DEVICE_RECONFIGURE, this);
++
++    delete mProcessorManager;
++
++    for (int i = 0; i < MAX_STREAM_NUMBER; i++)
++        delete mStreams[i];
++
++    delete mLensCtrl;
++    delete m3AControl;
++    delete mSensorCtrl;
++    delete mParamGenerator;
++    delete mSofSource;
++    delete mProducer;
++    delete mRequestThread;
++
++    V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
++    IGraphConfigManager::releaseInstance(mCameraId);
++}
++
++int CameraDevice::init()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
++    AutoMutex   m(mDeviceLock);
++
++    int ret = mProducer->init();
++    CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
++
++    ret = mSofSource->init();
++    CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
++
++    initDefaultParameters();
++
++    ret = m3AControl->init();
++    CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
++
++    ret = mLensCtrl->init();
++    CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
++
++    mRequestThread->run("RequestThread", PRIORITY_NORMAL);
++
++    mState = DEVICE_INIT;
++    return ret;
++}
++
++void CameraDevice::deinit()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
++    AutoMutex   m(mDeviceLock);
++
++    //deinit should not be call in UNINIT or START STATE
++    if (mState == DEVICE_UNINIT) {
++        //Do nothing
++        return;
++    }
++
++    m3AControl->stop();
++
++    if (mState == DEVICE_START) {
++        //stop first
++        stopLocked();
++    }
++
++    // stop request thread
++    mRequestThread->requestExit();
++    mRequestThread->join();
++
++    deleteStreams();
++
++    mProcessorManager->deleteProcessors();
++
++    m3AControl->deinit();
++
++    mSofSource->deinit();
++
++    mProducer->deinit();
++
++    mState = DEVICE_UNINIT;
++}
++
++void CameraDevice::callbackRegister(const camera_callback_ops_t* callback)
++{
++    mCallback = const_cast<camera_callback_ops_t*>(callback);
++}
++
++StreamSource* CameraDevice::createBufferProducer()
++{
++
++    return new CaptureUnit(mCameraId);
++}
++
++void CameraDevice::bindListeners()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
++    for (auto statsListener : statsListenerList) {
++
++        for (auto& item : mProcessors) {
++            // Subscribe PSys statistics.
++            item->registerListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
++            item->registerListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
++        }
++    }
++        for (auto& item : mProcessors) {
++            item->registerListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
++        }
++
++    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
++    for (auto sofListener : sofListenerList) {
++        mSofSource->registerListener(EVENT_ISYS_SOF, sofListener);
++    }
++
++    if (PlatformData::psysAlignWithSof(mCameraId)) {
++        for (auto& item : mProcessors) {
++            mSofSource->registerListener(EVENT_ISYS_SOF, item);
++        }
++    }
++
++    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
++        mProcessors.back()->registerListener(EVENT_PSYS_FRAME, mRequestThread);
++    } else {
++        mProducer->registerListener(EVENT_ISYS_FRAME, mRequestThread);
++    }
++
++    if (!mProcessors.empty()) {
++        mProcessors.front()->registerListener(EVENT_PSYS_REQUEST_BUF_READY, this);
++    }
++
++    mSofSource->registerListener(EVENT_ISYS_SOF, mRequestThread);
++}
++
++void CameraDevice::unbindListeners()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
++    for (auto statsListener : statsListenerList) {
++
++        for (auto& item : mProcessors) {
++            item->removeListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
++            item->removeListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
++        }
++    }
++        for (auto& item : mProcessors) {
++            item->removeListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
++        }
++
++    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
++    for (auto sofListener : sofListenerList) {
++        mSofSource->removeListener(EVENT_ISYS_SOF, sofListener);
++    }
++
++    if (PlatformData::psysAlignWithSof(mCameraId)) {
++        for (auto& item : mProcessors) {
++            mSofSource->removeListener(EVENT_ISYS_SOF, item);
++        }
++    }
++
++    if (!mProcessors.empty()) {
++        mProcessors.front()->removeListener(EVENT_PSYS_REQUEST_BUF_READY, this);
++    }
++
++    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
++        mProcessors.back()->removeListener(EVENT_PSYS_FRAME, mRequestThread);
++    } else {
++        mProducer->removeListener(EVENT_ISYS_FRAME, mRequestThread);
++    }
++
++    mSofSource->removeListener(EVENT_ISYS_SOF, mRequestThread);
++}
++
++int CameraDevice::configureInput(const stream_t *inputConfig)
++{
++    PERF_CAMERA_ATRACE();
++
++    AutoMutex lock(mDeviceLock);
++    mInputConfig = *inputConfig;
++
++    return OK;
++}
++
++int CameraDevice::configure(stream_config_t *streamList)
++{
++    PERF_CAMERA_ATRACE();
++
++    int numOfStreams = streamList->num_streams;
++    CheckError(!streamList->streams, BAD_VALUE, "%s: No valid stream config", __func__);
++    CheckError(numOfStreams > MAX_STREAM_NUMBER || numOfStreams <= 0, BAD_VALUE,
++          "%s: The requested stream number(%d) is invalid. Should be between [1-%d]",
++          __func__, numOfStreams, MAX_STREAM_NUMBER);
++
++    AutoMutex lock(mDeviceLock);
++
++    CheckError((mState != DEVICE_STOP) && (mState != DEVICE_INIT) && (mState != DEVICE_CONFIGURE),
++               INVALID_OPERATION, "%s: Add streams in wrong state %d", __func__, mState);
++
++    mRequestThread->configure(streamList);
++
++    // Use concrete ISP mode from request thread for full and auto switch
++    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
++        (ConfigMode)(streamList->operation_mode) == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
++        stream_config_t requestStreamList = mRequestThread->getStreamConfig();
++        LOG2("%s: for full and auto switch, use concrete config mode %u from request thread.",
++             __func__, requestStreamList.operation_mode);
++        return configureL(&requestStreamList);
++    }
++
++    return configureL(streamList);
++}
++
++int CameraDevice::configureL(stream_config_t *streamList, bool clean)
++{
++    LOG1("@%s, mCameraId:%d, operation_mode %x", __func__, mCameraId, (ConfigMode)streamList->operation_mode);
++
++    int ret = analyzeStream(streamList);
++    CheckError(ret != OK, ret, "@%s, analyzeStream failed", __func__);
++
++    // If configured before, destroy current streams first.
++    if (mStreamNum > 0 && clean) {
++        deleteStreams();
++    }
++    mProcessorManager->deleteProcessors();
++
++    // Clear all previous added listeners.
++    mProducer->removeAllFrameAvailableListener();
++    if (clean) {
++        ret = createStreams(streamList);
++        CheckError(ret < 0, ret, "@%s create stream failed with %d", __func__, ret);
++    }
++
++    int mcId = -1;
++    if (mGCM != nullptr) {
++        ret = mGCM->configStreams(streamList);
++        CheckError(ret != OK, INVALID_OPERATION, "No matching graph config found");
++
++        mcId = mGCM->getSelectedMcId();
++    }
++
++    std::map<Port, stream_t> producerConfigs = selectProducerConfig(streamList, mcId);
++    CheckError(producerConfigs.empty(), BAD_VALUE, "The config for producer is invalid.");
++
++    bool needProcessor = isProcessorNeeded(streamList, producerConfigs[MAIN_PORT]);
++    for (auto& item : producerConfigs) {
++        LOG1("Producer config for port:%d, fmt:%s (%dx%d), needProcessor=%d", item.first,
++             CameraUtils::format2string(item.second.format).c_str(),
++             item.second.width, item.second.height, needProcessor);
++        // Only V4L2_MEMORY_MMAP is supported when using post processor
++        if (needProcessor) {
++            item.second.memType = V4L2_MEMORY_MMAP;
++        }
++    }
++
++    vector<ConfigMode> configModes;
++    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
++
++    ret = mProducer->configure(producerConfigs, configModes);
++    CheckError(ret < 0, BAD_VALUE, "@%s Device Configure failed", __func__);
++
++    ret = mSofSource->configure();
++    CheckError(ret != OK, ret, "@%s failed to configure SOF source device", __func__);
++
++    m3AControl->configure(streamList);
++
++    if (needProcessor) {
++        mProcessors = mProcessorManager->createProcessors(mInputConfig.format, producerConfigs,
++                                                          mStreamIdToPortMap,
++                                                          streamList, mParameter, mParamGenerator);
++        ret = mProcessorManager->configureProcessors(configModes,
++                                                     mProducer, mParameter);
++        CheckError(ret != OK, ret, "@%s configure post processor failed with:%d", __func__, ret);
++    }
++
++    ret = bindStreams(streamList);
++    CheckError(ret < 0, ret, "@%s bind stream failed with %d", __func__, ret);
++
++    mState = DEVICE_CONFIGURE;
++    return OK;
++}
++
++/**
++ * Select the producer's config from the supported list.
++ *
++ * How to decide the producer's config?
++ * 1. The producer's config can only be one of the combination from ISYS supported format and
++ *    resolution list.
++ * 2. Try to use the same config as user's required.
++ * 3. If the ISYS supported format and resolution cannot satisfy user's requirement, then use
++ *    the closest one, and let post processor do the conversion.
++ */
++std::map<Port, stream_t> CameraDevice::selectProducerConfig(const stream_config_t *streamList, int mcId)
++{
++    // Use the biggest stream to configure the producer.
++    stream_t biggestStream = streamList->streams[mSortedStreamIds[0]];
++    std::map<Port, stream_t> producerConfigs;
++
++    if (!PlatformData::isIsysEnabled(mCameraId)) {
++        // Input stream id is the last one of mSortedStreamIds
++        const stream_t& tmp = streamList->streams[mSortedStreamIds.back()];
++        if (tmp.streamType == CAMERA_STREAM_INPUT) {
++            producerConfigs[MAIN_PORT] = tmp;
++            return producerConfigs;
++        }
++    }
++
++    /*
++     * According to the stream info and operation mode to select MediaCtlConf.
++     * and isys output format. If inputFmt is given and supported, we use it as isys output format.
++     */
++    int inputFmt = mInputConfig.format;
++    int iSysFmt = biggestStream.format;
++    if (inputFmt != -1) {
++        if (!PlatformData::isISysSupportedFormat(mCameraId, inputFmt)) {
++            LOGE("The given ISYS format %s is unsupported.", CameraUtils::pixelCode2String(inputFmt));
++            return producerConfigs;
++        }
++        iSysFmt = inputFmt;
++    }
++
++    // Use CSI output to select MC config
++    vector <ConfigMode> configModes;
++    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode,
++                                             configModes);
++    stream_t matchedStream = biggestStream;
++    if (!configModes.empty() && mGCM != nullptr) {
++        std::shared_ptr<IGraphConfig> gc = mGCM->getGraphConfig(configModes[0]);
++        if (gc) {
++            camera_resolution_t csiOutput = {0, 0};
++            gc->getCSIOutputResolution(csiOutput);
++            if (csiOutput.width > 0 && csiOutput.height > 0) {
++                matchedStream.width = csiOutput.width;
++                matchedStream.height = csiOutput.height;
++            }
++        }
++    }
++
++    camera_crop_region_t cropRegion;
++    int ret = mParameter.getCropRegion(cropRegion);
++    if ((ret == OK) && (cropRegion.flag == 1)) {
++        PlatformData::selectMcConf(mCameraId, mInputConfig,
++                                  (ConfigMode)streamList->operation_mode, mcId);
++    } else {
++        PlatformData::selectMcConf(mCameraId, matchedStream,
++                                  (ConfigMode)streamList->operation_mode, mcId);
++    }
++
++    PlatformData::selectISysFormat(mCameraId, iSysFmt);
++
++    // Use the ISYS output if it's provided in media config section of config file.
++    stream_t mainConfig = PlatformData::getISysOutputByPort(mCameraId, MAIN_PORT);
++    mainConfig.memType = biggestStream.memType;
++    mainConfig.field = biggestStream.field;
++
++    if (mainConfig.width != 0 && mainConfig.height != 0) {
++        producerConfigs[MAIN_PORT] = mainConfig;
++
++        return producerConfigs;
++    }
++
++    int inputWidth = mInputConfig.width;
++    int inputHeight = mInputConfig.height;
++
++    camera_resolution_t producerRes = {inputWidth, inputHeight};
++    if (inputWidth == 0 && inputHeight == 0) {
++        // Only get the ISYS resolution when input config is not specified.
++        producerRes = PlatformData::getISysBestResolution(mCameraId, biggestStream.width,
++                                                          biggestStream.height, biggestStream.field);
++    } else if (!PlatformData::isISysSupportedResolution(mCameraId, producerRes)) {
++        LOGE("The stream config: (%dx%d) is not supported.", inputWidth, inputHeight);
++        return producerConfigs;
++    }
++
++    mainConfig.format = PlatformData::getISysFormat(mCameraId);
++    mainConfig.width = producerRes.width;
++    // Update the height according to the field.
++    mainConfig.height = CameraUtils::getInterlaceHeight(mainConfig.field, producerRes.height);
++
++    // configuration with main port
++    producerConfigs[MAIN_PORT] = mainConfig;
++
++    return producerConfigs;
++}
++
++/**
++ * Check if post processor is needed.
++ * The processor is needed when:
++ * 1. At least one of the given streams does not match with the producer's output.
++ * 2. To support specific features such as HW weaving or dewarping.
++ */
++bool CameraDevice::isProcessorNeeded(const stream_config_t *streamList,
++                                     const stream_t &producerConfig)
++{
++    camera_crop_region_t cropRegion;
++    int ret = mParameter.getCropRegion(cropRegion);
++    if ((ret == OK) && (cropRegion.flag == 1)) return true;
++
++    camera_fisheye_dewarping_mode_t dewarping_mode = FISHEYE_DEWARPING_OFF;
++    mParameter.getFisheyeDewarpingMode(dewarping_mode);
++    if (dewarping_mode > FISHEYE_DEWARPING_OFF) {
++        return true;
++    }
++
++    if (producerConfig.field != V4L2_FIELD_ANY) {
++        camera_deinterlace_mode_t mode = DEINTERLACE_OFF;
++        mParameter.getDeinterlaceMode(mode);
++        if (mode == DEINTERLACE_WEAVING) {
++            return true;
++        }
++    }
++
++    if (producerConfig.field != V4L2_FIELD_ALTERNATE) {
++        int streamCounts = streamList->num_streams;
++        for (int streamId = 0; streamId < streamCounts; streamId++) {
++            if (producerConfig.width != streamList->streams[streamId].width ||
++                producerConfig.height != streamList->streams[streamId].height ||
++                producerConfig.format != streamList->streams[streamId].format) {
++                return true;
++            }
++        }
++    }
++
++    camera_mono_downscale_mode_t monoDsMode = MONO_DS_MODE_OFF;
++    mParameter.getMonoDsMode(monoDsMode);
++    if (monoDsMode != MONO_DS_MODE_OFF) {
++        return true;
++    }
++
++    return false;
++}
++
++/**
++ * Return true only if there are both still and video stream configured.
++ */
++bool CameraDevice::isStillDuringVideo(const stream_config_t *streamList)
++{
++    bool containStill = false;
++    bool containVideo = false;
++    for (int streamId = 0; streamId < streamList->num_streams; streamId++) {
++        switch (streamList->streams[streamId].usage) {
++        case CAMERA_STREAM_PREVIEW:
++        case CAMERA_STREAM_VIDEO_CAPTURE:
++            containVideo = true;
++            break;
++        case CAMERA_STREAM_STILL_CAPTURE:
++            containStill = true;
++            break;
++        default:
++            break;
++        }
++    }
++
++    return (containStill && containVideo);
++}
++
++int CameraDevice::createStreams(stream_config_t *streamList)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    int streamCounts = streamList->num_streams;
++    for (int streamId = 0; streamId < streamCounts; streamId++) {
++        stream_t& streamConf = streamList->streams[streamId];
++        LOG1("@%s, stream_number:%d, stream configure: format:%s (%dx%d)", __func__, streamCounts,
++             CameraUtils::pixelCode2String(streamConf.format), streamConf.width, streamConf.height);
++
++        streamConf.id = streamId;
++        streamConf.max_buffers = PlatformData::getMaxRequestsInflight(mCameraId);
++        CameraStream *stream = new CameraStream(mCameraId, streamId, streamConf);
++        stream->registerListener(EVENT_FRAME_AVAILABLE, mRequestThread);
++        mStreams[streamId] = stream;
++        mStreamNum++;
++
++        LOG2("@%s: automation checkpoint: interlaced: %d", __func__, streamConf.field);
++    }
++
++    return OK;
++}
++
++/**
++ * According resolution to store the streamId in descending order.
++ * Use this order to bind stream to port, and set output Port mapping
++ */
++int CameraDevice::analyzeStream(stream_config_t *streamList)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mSortedStreamIds.clear();
++    mStreamIdToPortMap.clear();
++
++    int inputStreamId = -1;
++    int opaqueRawStreamId = -1;
++    for (int i = 0; i < streamList->num_streams; i++) {
++        const stream_t& stream = streamList->streams[i];
++
++        if (stream.streamType == CAMERA_STREAM_INPUT) {
++            CheckError(inputStreamId >= 0, BAD_VALUE, "Don't support two input streams!");
++            inputStreamId = i;
++            continue;
++        }
++
++        if (stream.usage == CAMERA_STREAM_OPAQUE_RAW) {
++            CheckError(opaqueRawStreamId >= 0, BAD_VALUE, "Don't support two RAW streams!");
++            opaqueRawStreamId = i;
++            continue;
++        }
++
++        camera_crop_region_t cropRegion;
++        int ret = mParameter.getCropRegion(cropRegion);
++        if (ret != OK || cropRegion.flag == 0) {
++            bool valid = PlatformData::isSupportedStream(mCameraId, stream);
++            CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
++                       CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
++        }
++
++        bool saved = false;
++        // Store the streamId in descending order.
++        for (size_t j = 0; j < mSortedStreamIds.size(); j++) {
++            const stream_t& tmp = streamList->streams[mSortedStreamIds[j]];
++            if (stream.width * stream.height > tmp.width * tmp.height) {
++                mSortedStreamIds.insert((mSortedStreamIds.begin() + j), i);
++                saved = true;
++                break;
++            }
++        }
++        if (!saved)
++            mSortedStreamIds.push_back(i);
++    }
++
++    // Set opaque RAW stream as last one
++    if (opaqueRawStreamId >= 0) {
++        mSortedStreamIds.push_back(opaqueRawStreamId);
++        // Ignore input raw stream for ZSL case
++        inputStreamId = -1;
++    }
++
++    const Port kPorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
++    for (size_t i = 0; i < mSortedStreamIds.size(); i++) {
++        mStreamIdToPortMap[mSortedStreamIds[i]] = kPorts[i];
++
++        // Dump the stream info by descending order.
++        const stream_t& stream = streamList->streams[mSortedStreamIds[i]];
++        LOG1("%s  streamId: %d, %dx%d(%s)", __func__, mSortedStreamIds[i],
++                stream.width, stream.height, CameraUtils::format2string(stream.format).c_str());
++    }
++
++    bool checkInput = !PlatformData::isIsysEnabled(mCameraId);
++    if (checkInput) {
++        CheckError(inputStreamId < 0, BAD_VALUE, "Input stream was missing");
++    }
++    // Handle input stream
++    if (inputStreamId >= 0) {
++        CheckError(mSortedStreamIds.empty(), BAD_VALUE, "There is no output stream!");
++        // Check if input stream is supported or not
++        const stream_t& stream = streamList->streams[inputStreamId];
++        camera_resolution_t inputResolution = {stream.width, stream.height};
++        bool valid = PlatformData::isISysSupportedResolution(mCameraId, inputResolution);
++        CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
++                   CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
++        // Push input stream index to the end of vector mSortedStreamIds
++        mSortedStreamIds.push_back(inputStreamId);
++        // Use MAIN PORT for input stream
++        mStreamIdToPortMap[inputStreamId] = MAIN_PORT;
++    }
++
++    return OK;
++}
++
++/**
++ * Bind all streams to their producers and to the correct port.
++ *
++ * Bind the streams to Port in resolution descending order:
++ * Stream with max resolution            --> MAIN_PORT
++ * Stream with intermediate resolution   --> SECOND_PORT
++ * Stream with min resolution            --> THIRD_PORT
++ */
++int CameraDevice::bindStreams(stream_config_t *streamList)
++{
++    for (auto& iter : mStreamIdToPortMap) {
++        mStreams[iter.first]->setPort(iter.second);
++
++        // If no post processors, bind the stream to the producer.
++        if (mProcessors.empty()) {
++            mStreams[iter.first]->setBufferProducer(mProducer);
++        } else {
++            mStreams[iter.first]->setBufferProducer(mProcessors.back());
++        }
++    }
++
++    return OK;
++}
++
++int CameraDevice::start()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
++
++    // Not protected by mDeviceLock because it is required in qbufL()
++    mRequestThread->wait1stRequestDone();
++
++    AutoMutex   m(mDeviceLock);
++    CheckError(mState != DEVICE_BUFFER_READY, BAD_VALUE, "start camera in wrong status %d", mState);
++    CheckError(mStreamNum == 0, BAD_VALUE, "@%s: device doesn't add any stream yet.", __func__);
++
++    int ret = startLocked();
++    if (ret != OK) {
++        LOGE("Camera device starts failed.");
++        stopLocked();  // There is error happened, stop all related units.
++        return INVALID_OPERATION;
++    }
++
++    mState = DEVICE_START;
++    return OK;
++}
++
++int CameraDevice::stop()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
++    AutoMutex   m(mDeviceLock);
++
++    mRequestThread->clearRequests();
++
++    m3AControl->stop();
++
++    if (mState == DEVICE_START)
++        stopLocked();
++
++    mState = DEVICE_STOP;
++
++    return OK;
++}
++
++//No Lock for this fuction as it doesn't update any class member
++int CameraDevice::allocateMemory(camera_buffer_t *ubuffer)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE, "@%s: Wrong state id %d", __func__, mState);
++    CheckError(ubuffer->s.id < 0 || ubuffer->s.id >= mStreamNum, BAD_VALUE,
++          "@%s: Wrong stream id %d", __func__, ubuffer->s.id);
++
++    int ret = mStreams[ubuffer->s.id]->allocateMemory(ubuffer);
++    CheckError(ret < 0, ret, "@%s: failed, index: %d", __func__, ubuffer->index);
++
++    return ret;
++}
++
++/**
++ * Delegate it to RequestThread, make RequestThread manage all buffer related actions.
++ */
++int CameraDevice::dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings)
++{
++    CheckError(streamId < 0 || streamId > mStreamNum, BAD_VALUE,
++          "@%s: the given stream(%d) is invalid.", __func__, streamId);
++
++    LOG2("@%s, camera id:%d, stream id:%d", __func__, mCameraId, streamId);
++
++    int ret = mRequestThread->waitFrame(streamId, ubuffer);
++    while (ret == TIMED_OUT)
++        ret = mRequestThread->waitFrame(streamId, ubuffer);
++
++    CheckError(!*ubuffer || ret != OK, BAD_VALUE, "failed to get ubuffer from stream %d", streamId);
++
++    // Update and keep latest result, copy to settings when needed.
++    ret = mParamGenerator->getParameters((*ubuffer)->sequence, &mResultParameter);
++
++    if (settings) {
++        ret = mParamGenerator->getParameters((*ubuffer)->sequence, settings, false);
++    }
++
++    return ret;
++}
++
++int CameraDevice::handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence)
++{
++    LOG2("@%s, mCameraId:%d, sequence = %ld", __func__, mCameraId, sequence);
++    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
++
++    // All streams need to be queued with either a real buffer from user or an empty buffer.
++    for (int streamId = 0; streamId < mStreamNum; streamId++) {
++        bool isBufferQueued = false;
++        CheckError(mStreams[streamId] == nullptr, BAD_VALUE,
++              "@%s: stream %d is nullptr", __func__, streamId);
++
++        // Find if user has queued a buffer for mStreams[streamId].
++        for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
++            camera_buffer_t* buffer = ubuffer[bufferId];
++            int streamIdInBuf = buffer->s.id;
++            CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
++                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
++
++            if (streamIdInBuf == streamId) {
++                int ret = mStreams[streamId]->qbuf(buffer, sequence);
++                CheckError(ret < 0, ret, "@%s: queue buffer:%p failed:%d", __func__, buffer, ret);
++                isBufferQueued = true;
++                break;
++            }
++        }
++
++        // If streamId is not found in buffers queued by user, then we need to queue
++        // an empty buffer to keep the BufferQueue run.
++        if (!isBufferQueued) {
++            int ret = mStreams[streamId]->qbuf(nullptr, sequence);
++            CheckError(ret < 0, ret, "@%s: queue empty buffer failed:%d", __func__, ret);
++        }
++    }
++
++    return OK;
++}
++
++int CameraDevice::registerBuffer(camera_buffer_t **ubuffer, int bufferNum)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
++    if (mProcessors.empty()) return OK;
++
++    for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
++        camera_buffer_t *buffer = ubuffer[bufferId];
++        CheckError(buffer == nullptr, BAD_VALUE, "@%s, the queue ubuffer %d is NULL", __func__, bufferId);
++        int streamIdInBuf = buffer->s.id;
++        CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
++                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
++        std::shared_ptr<CameraBuffer> camBuffer =
++            mStreams[streamIdInBuf]->userBufferToCameraBuffer(buffer);
++        for (auto& iter : mStreamIdToPortMap) {
++            // Register buffers to the last processor
++            if (iter.first == streamIdInBuf) {
++                BufferQueue *processor = mProcessors.back();
++                processor->registerUserOutputBufs(iter.second, camBuffer);
++                break;
++            }
++        }
++    }
++
++    return OK;
++}
++
++int CameraDevice::qbuf(camera_buffer_t **ubuffer,
++                       int bufferNum, const Parameters *settings)
++{
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    {
++        AutoMutex   m(mDeviceLock);
++        if (mState == DEVICE_CONFIGURE || mState == DEVICE_STOP) {
++            // Start 3A here then the HAL can run 3A for request
++            int ret = m3AControl->start();
++            CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
++
++            mState = DEVICE_BUFFER_READY;
++        }
++    }
++
++    if (mState != DEVICE_START && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
++        registerBuffer(ubuffer, bufferNum);
++    }
++
++    // Make sure request's configure mode is updated by latest result param if no settings
++    if (!settings) {
++        mRequestThread->setConfigureModeByParam(mResultParameter);
++    }
++
++    return mRequestThread->processRequest(bufferNum, ubuffer, settings);
++}
++
++int CameraDevice::getParameters(Parameters& param, long sequence)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s mCameraId:%d", __func__, mCameraId);
++    AutoMutex   m(mDeviceLock);
++
++    if (sequence >= 0) {
++        // fetch target parameter and results
++        return mParamGenerator->getParameters(sequence, &param, false);
++    }
++
++    param = mParameter;
++
++    for (auto& item : mProcessors) {
++        item->getParameters(param);
++    }
++
++    return OK;
++}
++
++int CameraDevice::setParameters(const Parameters& param)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s mCameraId:%d", __func__, mCameraId);
++    AutoMutex   m(mDeviceLock);
++    return setParametersL(param);
++}
++
++int CameraDevice::setParametersL(const Parameters& param)
++{
++    // Merge given param into internal unique mParameter
++    mParameter.merge(param);
++
++    int ret = m3AControl->setParameters(param);
++    for (auto& item : mProcessors) {
++        item->setParameters(mParameter);
++    }
++
++    // Set test pattern mode
++    camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
++    if (PlatformData::isTestPatternSupported(mCameraId)
++            && param.getTestPatternMode(testPatternMode) == OK) {
++        int32_t sensorTestPattern = PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
++        if (sensorTestPattern >= 0) {
++            ret |= mSensorCtrl->setTestPatternMode(sensorTestPattern);
++        }
++    }
++
++    return ret;
++}
++
++//Private Functions, these functions are called with device lock hold
++
++//Destroy all the streams
++void CameraDevice::deleteStreams()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s mCameraId:%d, streams:%d", __func__, mCameraId, mStreamNum);
++
++    for (int streamId = 0; streamId < mStreamNum; streamId++) {
++        mStreams[streamId]->stop();
++        delete mStreams[streamId];
++        mStreams[streamId] = nullptr;
++    }
++    mStreamNum = 0;
++}
++
++// Internal start without lock hold
++int CameraDevice::startLocked()
++{
++    int ret = OK;
++
++    bindListeners();
++
++    //Start all the streams
++    for(int i = 0; i < mStreamNum; i++) {
++        ret = mStreams[i]->start();
++        CheckError(ret < 0, BAD_VALUE, "Start stream %d failed with ret:%d.", i, ret);
++    }
++
++    for (auto& item : mProcessors) {
++        ret = item->start();
++        CheckError((ret < 0), BAD_VALUE, "Start image processor failed with ret:%d.", ret);
++    }
++
++    //Start the CaptureUnit for streamon
++    ret = mProducer->start();
++    CheckError((ret < 0), BAD_VALUE, "Start capture unit failed with ret:%d.", ret);
++
++    ret = mSofSource->start();
++    CheckError((ret != OK), BAD_VALUE, "Start SOF event source failed with ret:%d.", ret);
++
++    return OK;
++}
++
++// Internal stop without lock hold
++int CameraDevice::stopLocked()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mSofSource->stop();
++
++    //Stop the CaptureUnit for streamon
++    mProducer->stop();
++
++    for (auto& item : mProcessors) {
++        item->stop();
++    }
++
++    unbindListeners();
++    mParamGenerator->reset();
++
++    return OK;
++}
++
++int CameraDevice::reconfigure(stream_config_t *streamList)
++{
++    AutoMutex   m(mDeviceLock);
++
++    int ret = OK;
++
++    LOG2("%s: switch type: %d, new mode:%d", __func__,
++        PlatformData::getAutoSwitchType(mCameraId), streamList->operation_mode);
++
++    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL) {
++        // Wait and return all user buffers in all streams firstly
++        for (int streamId = 0; streamId < mStreamNum; streamId++) {
++            mStreams[streamId]->waitToReturnAllUserBufffers();
++        }
++
++        LOG2("%s: all streams stopped", __func__);
++
++        // Stop and clean what needed.
++        m3AControl->stop();
++
++        if (mState == DEVICE_START)
++            stopLocked();
++
++        mState = DEVICE_STOP;
++
++        for (int streamId = 0; streamId < mStreamNum; streamId++) {
++            mStreams[streamId]->stop();
++        }
++
++        mProcessorManager->deleteProcessors();
++
++        m3AControl->deinit();
++
++        mSofSource->deinit();
++
++        mProducer->deinit();
++
++        /* TODO: Currently kernel have issue and need reopen subdevices
++         * when stream off and on. Remove below delete and recreate code
++         * when all kernel issues got fixed.
++         */
++        // Delete related components and v4l2 devices
++        delete mLensCtrl;
++        delete m3AControl;
++        delete mSensorCtrl;
++        delete mSofSource;
++        delete mProducer;
++
++        V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
++
++        // Re-create related components and v4l2 devices
++        mProducer = createBufferProducer();
++        mSofSource = new SofSource(mCameraId);
++        mLensCtrl = new LensHw(mCameraId);
++        mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
++        m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
++
++        // Init and config with new mode
++        int ret = mProducer->init();
++        CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
++
++        ret = mSofSource->init();
++        CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
++
++        initDefaultParameters();
++
++        ret = m3AControl->init();
++        CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
++
++        ret = mLensCtrl->init();
++        CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
++
++        mState = DEVICE_INIT;
++
++        // Auto switch do not recreate streams.
++        configureL(streamList, false);
++
++        ret = m3AControl->setParameters(mParameter);
++        for (auto& item : mProcessors) {
++            item->setParameters(mParameter);
++        }
++        CheckError((ret != OK), ret, "%s: set parameters falied", __func__);
++
++        ret = m3AControl->start();
++        CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
++
++        mState = DEVICE_BUFFER_READY;
++
++        ret = startLocked();
++        if (ret != OK) {
++            LOGE("Camera device starts failed.");
++            stopLocked();  // There is error happened, stop all related units.
++            return INVALID_OPERATION;
++        }
++
++        mState = DEVICE_START;
++
++        LOG2("%s: reconfigure CameraDevice done", __func__);
++    } else {
++
++        /* TODO: scene mode based psys-only auto switch here will be used to
++         * replace current auto-switch mechanism in AiqSetting:updateTuningMode,
++         * which is for non-DOL sensor auto-switch. The switch stabilization
++         * counting in AiqSetting:updateTuningMode will also be replaced by the
++         * same mechanism in RequestThread.
++         */
++        LOG2("%s: reconfigure CameraDevice to new mode %d with psys-only switch",
++             __func__, streamList->operation_mode);
++    }
++
++    return ret;
++}
++
++void CameraDevice::handleEvent(EventData eventData)
++{
++    LOG2("%s, event type:%d", __func__, eventData.type);
++
++    switch (eventData.type) {
++    case EVENT_PROCESS_REQUEST: {
++        const EventRequestData& request = eventData.data.request;
++        if (request.param) {
++            for (auto& item : mProcessors) {
++                 item->setParameters(*request.param);
++            }
++
++            // Set test pattern mode
++            camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
++            if (PlatformData::isTestPatternSupported(mCameraId)
++                    && request.param->getTestPatternMode(testPatternMode) == OK) {
++                int32_t sensorTestPattern =
++                            PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
++                if (sensorTestPattern >= 0) {
++                    if (mSensorCtrl->setTestPatternMode(sensorTestPattern) < 0) {
++                        LOGE("%s, set testPatternMode failed", __func__);
++                    }
++                }
++            }
++        }
++
++        handleQueueBuffer(request.bufferNum, request.buffer, request.settingSeq);
++        break;
++    }
++
++    case EVENT_DEVICE_RECONFIGURE: {
++        const EventConfigData& config = eventData.data.config;
++        reconfigure(config.streamList);
++        break;
++    }
++
++    case EVENT_PSYS_REQUEST_BUF_READY: {
++        if (mCallback) {
++            camera_msg_data_t data;
++            CLEAR(data);
++            data.type = CAMERA_ISP_BUF_READY;
++            int32_t userRequestId = 0;
++            int ret = mParamGenerator->getUserRequestId(eventData.data.requestReady.sequence,
++                                                        userRequestId);
++            CheckError(ret != OK, VOID_VALUE, "failed to find request id,  seq %ld",
++                       eventData.data.requestReady.sequence);
++            data.data.buffer_ready.sequence = eventData.data.requestReady.sequence;
++            data.data.buffer_ready.timestamp = eventData.data.requestReady.timestamp;
++            data.data.buffer_ready.frameNumber = static_cast<uint32_t>(userRequestId);
++            mCallback->notify(mCallback, data);
++            PlatformData::updateMakernoteTimeStamp(mCameraId, eventData.data.requestReady.sequence,
++                                                   data.data.buffer_ready.timestamp);
++        }
++        break;
++    }
++
++    default:
++        LOGE("Not supported event type:%d", eventData.type);
++        break;
++    }
++}
++
++int CameraDevice::initDefaultParameters()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s mCameraId:%d", __func__, mCameraId);
++
++    camera_info_t info;
++    CLEAR(info);
++    PlatformData::getCameraInfo(mCameraId, info);
++
++    // Init mParameter to camera's capability first and then add some others default settings
++    mParameter = *info.capability;
++
++    // TODO: Figure out a better place to set default parameters since they may be platform specified.
++    camera_range_t fps = {10, 60};
++    mParameter.setFpsRange(fps);
++    mParameter.setFrameRate(30);
++
++    camera_image_enhancement_t enhancement;
++    CLEAR(enhancement); // All use 0 as default
++    mParameter.setImageEnhancement(enhancement);
++
++    mParameter.setWeightGridMode(WEIGHT_GRID_AUTO);
++
++    mParameter.setWdrLevel(100);
++
++    mParameter.setFlipMode(FLIP_MODE_NONE);
++
++    mParameter.setRun3ACadence(1);
++
++    mParameter.setYuvColorRangeMode(PlatformData::getYuvColorRangeMode(mCameraId));
++
++    mParameter.setFocusDistance(0.0f);
++    mParameter.setTonemapMode(TONEMAP_MODE_FAST);
++
++    return OK;
++}
++
++} //namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.h b/camera/hal/intel/ipu6/src/core/CameraDevice.h
+new file mode 100644
+index 000000000000..43d28f31a5ff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraDevice.h
+@@ -0,0 +1,284 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "CameraStream.h"
++#include "RequestThread.h"
++#include "StreamSource.h"
++#include "AiqUnit.h"
++#include "Parameters.h"
++#include "ParameterGenerator.h"
++#include "SensorHwCtrl.h"
++#include "SofSource.h"
++#include "LensHw.h"
++
++#include "ProcessorManager.h"
++
++#include "gc/IGraphConfigManager.h"
++
++namespace icamera {
++
++class RequestThread;
++
++/**
++  * CameraDevice : Create elements to construct the streaming pipeline
++  * Each element must be a producer or a consumer or Both.
++  *
++  * These are the typical pipelines:
++  *
++  * For a single SOC YUV capture in by pass mode
++  * StreamSource -> CameraStream
++  *
++  * For a single NV12 capture of TPG/Sensor using SwImageProcess
++  * StreamSource -> SwImageProcessor -> CameraStream
++  *
++  * For a single NV12 capture of TPG/Sensor using PSYS processor
++  * StreamSource -> PsysProcessor -> CameraStream
++  *
++  * For a dual streams NV12 video capture of TPG/Sensor using PSYS processor
++  * StreamSource -> PsysProcessor | -> CameraStream (For video recording)
++  *                              | -> CameraStream (for Preview)
++  *
++  * For a SDV(Snapshot during video) capture of TPG/Sensor uinsg PSYS processor
++  * StreamSource | -> PsysProcessor | -> CameraStream (For video recording)
++  *             |                  | -> CameraStream (for Preview)
++  *             | -> PsysProcessor | -> CameraStream (For still YUV)
++  *
++  * The buffer notification between the Class is based on Interface defined
++  * in BufferQueue. The upstream element use "onFrameAvailable" message to notfiy
++  * downstream elements that the buffers are ready for further processing
++  *
++  * Following singleton instances are created and maintained by CameraDevice
++  * 1. IGraphConfigManager
++  * 2. AiqResultStorage
++  */
++class CameraDevice : public EventListener {
++
++public:
++    CameraDevice(int cameraId);
++    ~CameraDevice();
++
++    /**
++     * \brief Camera device class init
++     *
++     * 1.Related classes init: StreamSource, SofSource, 3AControl, lensCtrl
++     * 2.Register listener if enable AIQ
++     * 3.Set the defualt parameters
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int init();
++
++    /**
++     * \brief Camera device class deinit
++     *
++     * 1.Change the state
++     * 2.Destory the listeners
++     * 3.Delete the streams
++     * 4.Deinit the Related classes.
++     */
++    void deinit();
++
++    /**
++     * \brief Camera device start
++     *
++     * 1. Start all streams
++     * 2. Related classes start
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int start();
++
++    /**
++     * \brief Camera device stop
++     *
++     * 1. Stop all related class module.
++     * 2. Change the state
++     */
++    int stop();
++
++    /**
++     * \brief Allocate momery according to user buffer
++     *
++     * 1. Convert user buffer to CameraBuffer and push it into UserBufferQueue
++     * 2. Calling CameraStream class to allocateMemory.
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int allocateMemory(camera_buffer_t *ubuffer);
++
++    /**
++     * \brief dequeue buffer from cameraStream.
++     *
++     * 1. Dequeue one CameraBuffer from CameraStream
++     * 2. Fill the user buffer base on CameraBuffer
++     * 3. Fill the settings was used for this buffer if settings is not nullptr
++     *
++     * \return 0 if succeed, other value indicates failed
++     */
++    int dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings = nullptr);
++
++    /**
++     * \brief Queue one buffer to CameraStream
++     *
++     * 1. Get the CameraBuffer base on the ubuffer
++     * 2. Calling CameraStream to queue one CameraBuffer
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int qbuf(camera_buffer_t **ubuffer, int bufferNum = 1, const Parameters* settings = nullptr);
++
++    /**
++     * \brief Configure the device sensor input
++     *
++     *
++     * \param inputConfig: the Output format/resolution of the isys
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int configureInput(const stream_t *inputConfig);
++
++    /**
++     * \brief Configure the streams, devices and post processor.
++     *
++     * Configure the streams according to the streamList info
++     * Extra processor is needed if the format isn't supported in Psys output
++     *
++     * \param streamList: all the streams info
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int configure(stream_config_t *streamList);
++
++    /**
++     * \brief Set the parameters
++     *
++     * Merge the param to internal parameters and set them to 3A
++     * and processor.
++     *
++     * \param param: the parameters need to set
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int setParameters(const Parameters& param);
++
++    /**
++     * \brief Get the parameters
++     *
++     * Get the internal parameters list
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int getParameters(Parameters& param, long sequence);
++
++    void handleEvent(EventData eventData);
++
++    void callbackRegister(const camera_callback_ops_t* callback);
++private:
++    DISALLOW_COPY_AND_ASSIGN(CameraDevice);
++
++    /**
++     * \brief Reconfigure the streams, devices and post processor.
++     *
++     * \param streamList: all the streams info
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int reconfigure(stream_config_t *streamList);
++
++    int startLocked();
++    int stopLocked();
++    int initDefaultParameters();
++    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(Port port,
++                                                                camera_buffer_t *ubuffer);
++
++    StreamSource* createBufferProducer();
++    std::map<Port, stream_t> selectProducerConfig(const stream_config_t *streamList, int mcId);
++    bool isProcessorNeeded(const stream_config_t *streamList, const stream_t &producerConfig);
++    bool isStillDuringVideo(const stream_config_t *streamList);
++    int analyzeStream(stream_config_t *streamList);
++    int createStreams(stream_config_t *streamList);
++    int bindStreams(stream_config_t *streamList);
++    void deleteStreams();
++
++    /**
++     * Bind all event listeners with their source.
++     */
++    void bindListeners();
++
++    /**
++     * Unbind all event listeners from their source.
++     */
++    void unbindListeners();
++
++    long fetchCaptureSettings(const Parameters * params);
++
++    // The second phase of qbuf(), done in RequestThread
++    int handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence);
++
++    // No lock protect for internal usage, should be protected by mDeviceLock from outside
++    int configureL(stream_config_t *streamList, bool clean = true);
++    int setParametersL(const Parameters& param);
++
++    int registerBuffer(camera_buffer_t **ubuffer, int bufferNum);
++
++private:
++    enum {
++        DEVICE_UNINIT = 0,
++        DEVICE_INIT,
++        DEVICE_CONFIGURE, //means stream configured
++        DEVICE_START,
++        DEVICE_STOP,
++        DEVICE_BUFFER_READY, //At least one buffer is queued to ISP
++    } mState;
++
++    // Guard for CameraDevice public API
++    Mutex mDeviceLock;
++
++    static const nsecs_t kWaitDuration = 5000000000; //5000ms
++
++    // Pipeline elements
++    CameraStream* mStreams[MAX_STREAM_NUMBER];
++    std::map<int, Port> mStreamIdToPortMap;
++    std::vector<int> mSortedStreamIds; // Used to save sorted stream ids with descending order.
++    StreamSource *mProducer;
++
++    ProcessorManager* mProcessorManager;
++    std::vector<BufferQueue*> mProcessors;
++
++    ParameterGenerator *mParamGenerator;
++
++    LensHw *mLensCtrl;
++    SensorHwCtrl *mSensorCtrl;
++    SofSource* mSofSource;
++    AiqUnitBase *m3AControl;
++
++    //Internal used variable
++    int     mCameraId;
++    int     mStreamNum;
++    Parameters mParameter;
++    //The latest result parameters
++    Parameters mResultParameter;
++    bool mPerframeControlSupport;
++
++    RequestThread* mRequestThread;
++    IGraphConfigManager *mGCM;
++    stream_t mInputConfig;
++    camera_callback_ops_t *mCallback;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.cpp b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
+new file mode 100644
+index 000000000000..18317091e1e7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
+@@ -0,0 +1,84 @@
++/*
++ * Copyright (C) 2015-2017 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraEvent"
++
++#include "iutils/CameraLog.h"
++
++#include "CameraEvent.h"
++
++namespace icamera {
++
++EventSource::EventSource()
++{
++    LOG1("@%s EventSource created", __func__);
++}
++
++EventSource::~EventSource()
++{
++    LOG1("@%s EventSource destructed", __func__);
++}
++
++void EventSource::registerListener(EventType eventType, EventListener* eventListener)
++{
++    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
++
++    CheckError(eventListener == nullptr, VOID_VALUE,
++          "%s: event listener is nullptr, skip registration.", __func__);
++
++    AutoMutex l(mListenersLock);
++
++    std::set<EventListener*> listenersOfType;
++    if (mListeners.find(eventType) != mListeners.end()) {
++        listenersOfType = mListeners[eventType];
++    }
++
++    listenersOfType.insert(eventListener);
++    mListeners[eventType] = listenersOfType;
++}
++
++void EventSource::removeListener(EventType eventType, EventListener* eventListener)
++{
++    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
++    AutoMutex l(mListenersLock);
++
++    if (mListeners.find(eventType) == mListeners.end()) {
++        LOG1("%s: no listener found for event type %d", __func__, eventType);
++        return;
++    }
++
++    std::set<EventListener*> listenersOfType = mListeners[eventType];
++    listenersOfType.erase(eventListener);
++    mListeners[eventType] = listenersOfType;
++}
++
++void EventSource::notifyListeners(EventData eventData)
++{
++    LOG2("@%s eventType: %d", __func__, eventData.type);
++    AutoMutex l(mListenersLock);
++
++    if (mListeners.find(eventData.type) == mListeners.end()){
++        LOG2("%s: no listener found for event type %d", __func__, eventData.type);
++        return;
++    }
++
++    for (auto listener : mListeners[eventData.type]) {
++        LOG2("%s: send event data to listener %p for event type %d", __func__, listener, eventData.type);
++        listener->handleEvent(eventData);
++    }
++}
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.h b/camera/hal/intel/ipu6/src/core/CameraEvent.h
+new file mode 100644
+index 000000000000..4a15167cd799
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraEvent.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <set>
++
++#include "iutils/Thread.h"
++#include "CameraEventType.h"
++
++namespace icamera {
++
++class EventListener
++{
++public:
++    EventListener() {};
++    virtual ~EventListener() {};
++    virtual void handleEvent(EventData eventData) {};
++};
++
++class EventSource
++{
++private:
++    std::map<EventType, std::set<EventListener*>> mListeners;
++
++    // Guard for EventSource public API to protect mListeners.
++    Mutex mListenersLock;
++public:
++    EventSource();
++    virtual ~EventSource();
++    virtual void registerListener(EventType eventType, EventListener* eventListener);
++    virtual void removeListener(EventType eventType, EventListener* eventListener);
++    virtual void notifyListeners(EventData eventData);
++};
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/CameraEventType.h b/camera/hal/intel/ipu6/src/core/CameraEventType.h
+new file mode 100644
+index 000000000000..bb6a017a5cda
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraEventType.h
+@@ -0,0 +1,111 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "iutils/Utils.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++class CameraBuffer;
++
++enum EventType
++{
++    EVENT_ISYS_SOF = 0,
++    EVENT_PSYS_STATS_BUF_READY,
++    EVENT_PSYS_STATS_SIS_BUF_READY,
++    EVENT_ISYS_FRAME,
++    EVENT_PSYS_FRAME,
++    EVENT_PROCESS_REQUEST,
++    EVENT_DEVICE_RECONFIGURE,
++    EVENT_FRAME_AVAILABLE,
++    EVENT_PSYS_REQUEST_BUF_READY,
++};
++
++struct EventDataStatsReady
++{
++    timeval timestamp;
++    long sequence;
++};
++
++struct EventDataSync
++{
++    timeval timestamp;
++    long sequence;
++};
++
++struct EventDataFrame
++{
++    timeval timestamp;
++    long sequence;
++};
++
++struct EventDataMeta
++{
++    timeval timestamp;
++    long sequence;
++};
++
++struct EventRequestData
++{
++    int bufferNum;
++    camera_buffer_t** buffer;
++    Parameters* param;
++
++    long settingSeq;
++};
++
++struct EventConfigData
++{
++    stream_config_t *streamList;
++};
++
++struct EventFrameAvailable
++{
++    int streamId;
++};
++
++struct EventRequestBufferReady
++{
++    int64_t timestamp;
++    long sequence;
++};
++
++struct EventData
++{
++    EventData() : type(EVENT_ISYS_SOF) {
++        CLEAR(data);
++    }
++
++    EventType type;
++    std::shared_ptr<CameraBuffer> buffer;
++    union
++    {
++        EventDataStatsReady statsReady;
++        EventDataSync sync;
++        EventDataFrame frame;
++        EventDataMeta meta;
++        EventRequestData request;
++        EventConfigData config;
++        EventFrameAvailable frameDone;
++        EventRequestBufferReady requestReady;
++    } data;
++};
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.cpp b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
+new file mode 100644
+index 000000000000..70da89fdd0dd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
+@@ -0,0 +1,239 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraStream"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++#include "CameraStream.h"
++#include "PlatformData.h"
++
++using std::shared_ptr;
++
++namespace icamera {
++
++CameraStream::CameraStream(int cameraId, int streamId, const stream_t& stream)
++      : mCameraId(cameraId),
++        mStreamId(streamId),
++        mPort(MAIN_PORT),
++        mBufferProducer(nullptr),
++        mNumHoldingUserBuffers(0),
++        mIsWaitingBufferReturn(false)
++{
++    LOG1("@%s: mCameraId:%d, width:%d, height:%d, format:%s", __func__,
++          mCameraId, stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
++          CameraUtils::pixelCode2String(stream.format));
++    LOG2("@%s: automation checkpoint: WHF: %d,%d,%s", __func__,
++          stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
++          CameraUtils::pixelCode2String(stream.format));
++}
++
++CameraStream::~CameraStream()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++}
++
++int CameraStream::start()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    return OK;
++}
++
++int CameraStream::stop()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mIsWaitingBufferReturn = false;
++    mNumHoldingUserBuffers = 0;
++
++    if (mBufferProducer != nullptr)
++        mBufferProducer->removeFrameAvailableListener(this);
++
++    AutoMutex poolLock(mBufferPoolLock);
++    mUserBuffersPool.clear();
++
++    return OK;
++}
++
++/*
++ * Allocate memory to the stream processor which should be
++ * set by the CameraDevice
++ */
++int CameraStream::allocateMemory(camera_buffer_t *ubuffer)
++{
++    LOG1("@%s, mCameraId:%d, ubuffer %p", __func__, mCameraId, ubuffer);
++
++    int ret = BAD_VALUE;
++    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
++    CheckError(!camBuffer, ret, "@%s: fail to alloc CameraBuffer", __func__);
++
++    // mBufferProducer will not change after start
++    if (mBufferProducer)
++        ret = mBufferProducer->allocateMemory(mPort, camBuffer);
++
++    return ret;
++}
++
++shared_ptr<CameraBuffer> CameraStream::userBufferToCameraBuffer(camera_buffer_t *ubuffer)
++{
++    if (ubuffer == nullptr) return nullptr;
++
++    shared_ptr<CameraBuffer> camBuffer = nullptr;
++
++    AutoMutex l(mBufferPoolLock);
++    for (auto buffer = mUserBuffersPool.begin(); buffer != mUserBuffersPool.end(); buffer++) {
++        /* check if the buffer is already in the pool, when the userBuffer is same as ubuffer
++         * will continue to check the buffer, because the data addr in ubuffer may change */
++        if ((*buffer)->getUserBuffer() == ubuffer) {
++            /* when memType matches, the dmafd or the addr should match */
++            if (((*buffer)->getMemory() == static_cast<uint32_t>(ubuffer->s.memType)) &&
++                ((ubuffer->addr != nullptr && (*buffer)->getUserBuffer()->addr == ubuffer->addr) ||
++                (ubuffer->dmafd >= 0 && (*buffer)->getUserBuffer()->dmafd == ubuffer->dmafd))) {
++                camBuffer = *buffer;
++            } else {
++                mUserBuffersPool.erase(buffer);
++            }
++            break;
++        }
++    }
++
++    if (!camBuffer) { // Not found in the pool, so create a new CameraBuffer for it.
++        ubuffer->index = mUserBuffersPool.size();
++        camBuffer = std::make_shared<CameraBuffer>(mCameraId, BUFFER_USAGE_GENERAL,
++                ubuffer->s.memType, ubuffer->s.size, ubuffer->index, ubuffer->s.format);
++        CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
++        mUserBuffersPool.push_back(camBuffer);
++    }
++    camBuffer->setUserBufferInfo(ubuffer);
++
++    // Update the v4l2 flags
++    camBuffer->updateFlags();
++
++    return camBuffer;
++}
++
++void CameraStream::waitToReturnAllUserBufffers()
++{
++    LOG1("%s: wait for all user buffers to be returned to user", __func__);
++
++    ConditionLock lock(mBufferPoolLock);
++
++    if (mNumHoldingUserBuffers > 0){
++        // mIsWaitingBufferReturn flag is used to prevent situation that signal goes before wait
++        mIsWaitingBufferReturn = true;
++        int ret = mAllBuffersReturnedSignal.waitRelative(lock,
++                                                         kWaitDuration * SLOWLY_MULTIPLIER);
++
++        if (ret == TIMED_OUT) {
++            LOGW("@%s, mCameraId:%d, time out happens when waiting return user buffers",
++                 __func__, mCameraId);
++            return;
++        }
++        mIsWaitingBufferReturn = false;
++    }
++
++    LOG1("%s: all buffers have been returned to user", __func__);
++
++    return;
++}
++
++// Q buffers to the stream processor which should be set by the CameraDevice
++int CameraStream::qbuf(camera_buffer_t *ubuffer, long sequence)
++{
++    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
++    if (camBuffer) {
++        camBuffer->setSettingSequence(sequence);
++        LOG2("@%s, mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d, ubuffer:%p, addr:%p",
++             __func__, mCameraId, mStreamId, camBuffer.get(), mPort, ubuffer, ubuffer->addr);
++    }
++
++    int ret = BAD_VALUE;
++    // mBufferProducer will not change after start, no lock
++    if (mBufferProducer != nullptr) {
++        ret = mBufferProducer->qbuf(mPort, camBuffer);
++        if (ret == OK) {
++            mNumHoldingUserBuffers++;
++        }
++    }
++    return ret;
++}
++
++//This function is called in stop status, no lock
++void CameraStream::setBufferProducer(BufferProducer *producer)
++{
++    LOG1("@%s, mCameraId:%d, producer %p", __func__, mCameraId, producer);
++
++    mBufferProducer = producer;
++
++    if (producer != nullptr)
++        producer->addFrameAvailableListener(this);
++}
++
++int CameraStream::onFrameAvailable(Port port, const shared_ptr<CameraBuffer> &camBuffer)
++{
++    // Ignore if the buffer is not for this stream.
++    if (mPort != port) return OK;
++    if (camBuffer->getStreamId() != mStreamId) return OK;
++
++    LOG2("@%s: mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d",
++         __func__, mCameraId, mStreamId, camBuffer.get(), port);
++
++    // Update the user buffer info before return back
++    camBuffer->updateUserBuffer();
++
++    EventFrameAvailable frameData;
++    frameData.streamId = mStreamId;
++    EventData eventData;
++    eventData.type = EVENT_FRAME_AVAILABLE;
++    eventData.buffer = camBuffer;
++    eventData.data.frameDone = frameData;
++    notifyListeners(eventData);
++
++    camera_buffer_t* ubuffer = camBuffer->getUserBuffer();
++    LOG2("ubuffer:%p, addr:%p, timestamp:%lu, sequence:%ld",
++         ubuffer, ubuffer->addr, ubuffer->timestamp, ubuffer->sequence);
++
++    LOGVCSYNC("[onFrameDone], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%luus, endl",
++        CameraUtils::systemTime(),
++        ubuffer->sequence,
++        camBuffer->getVirtualChannel(),
++        ubuffer->timestamp);
++
++    PERF_CAMERA_ATRACE_PARAM3("sequence", camBuffer->getSequence(),
++                              "csi2_port", camBuffer->getCsi2Port(),
++                              "virtual_channel", camBuffer->getVirtualChannel());
++
++    AutoMutex l(mBufferPoolLock);
++
++    if (mNumHoldingUserBuffers > 0) {
++        mNumHoldingUserBuffers--;
++    }
++
++    LOG2("mNumHoldingUserBuffers has already been counted down to %d", mNumHoldingUserBuffers);
++
++    // mIsWaitingBufferReturn is used to prevent signal before wait
++    if (mIsWaitingBufferReturn && mNumHoldingUserBuffers == 0) {
++        LOG2("%s: all user buffer returned, trigger signal", __func__);
++        mAllBuffersReturnedSignal.signal();
++    }
++
++    return OK;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.h b/camera/hal/intel/ipu6/src/core/CameraStream.h
+new file mode 100644
+index 000000000000..5ac9472d4254
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CameraStream.h
+@@ -0,0 +1,118 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "Parameters.h"
++#include "CameraBuffer.h"
++#include "BufferQueue.h"
++
++#include "iutils/Thread.h"
++
++namespace icamera {
++
++/**
++  * CameraStream: The HAL represent of the application stream.
++  * CameraStream implement the BufferConsumer interface.
++  *
++  * CameraStream provide the buffer interface to application.
++  * It gets buffers from producers and returns to the app
++  *
++  * Application used the DQ buffer to get the buffers from Camera
++  * and Q buffer to return the buffers to camera.
++  */
++
++class CameraStream: public BufferConsumer, public EventSource {
++public:
++    CameraStream(int cameraId, int streamId, const stream_t& stream);
++    virtual ~CameraStream();
++
++    /**
++     * \brief Set which port this stream is linked to.
++     */
++    void setPort(Port port) { mPort = port; }
++
++    /**
++     * \brief get the port which the stream is linked to.
++     */
++    Port getPort() { return mPort; }
++
++    /**
++     * \brief Set the StreamActive state
++     */
++    int start();
++
++    /**
++     * \brief Clear streamActive state and clear up
++     * the buffer queue
++     */
++    int stop();
++
++    /**
++     * \brief Push one CameraBuffer to bufferProducer
++     */
++    int qbuf(camera_buffer_t *ubuffer, long sequence);
++
++    /**
++     * \brief Calling mBufferProducer to allocate memory
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int allocateMemory(camera_buffer_t *buffer);
++
++    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(camera_buffer_t *ubuffer);
++
++    /**
++     * \brief Wait all user buffers to be returned to user
++     */
++    void waitToReturnAllUserBufffers();
++
++    /**
++     * \brief Register the mBufferProducer
++     */
++    virtual void setBufferProducer(BufferProducer *producer);
++
++    /**
++     * \brief The notify when polled or processed one frame buffer
++     */
++    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++private:
++    static const nsecs_t kWaitDuration = 10000000000; //10000ms
++
++    int mCameraId;
++    int mStreamId;
++    Port mPort;
++
++    BufferProducer   *mBufferProducer;
++
++    CameraBufVector    mUserBuffersPool;
++
++    // Guard for member mUserBuffersPool, used in the qbuf which is critical for FPS
++    // Prevent qbuf and dqbuf to share the same lock
++    Mutex mBufferPoolLock;
++
++    // Siginal for the situation that all buffers returned to user
++    Condition mAllBuffersReturnedSignal;
++
++    // How many user buffers are currently processing underhood.
++    int mNumHoldingUserBuffers;
++
++    // Flag to indicate that currently waiting for all user buffers to be returned
++    bool mIsWaitingBufferReturn;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
+new file mode 100644
+index 000000000000..50301e6e0c05
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
+@@ -0,0 +1,477 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CaptureUnit"
++
++#include <poll.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Utils.h"
++
++#include "PlatformData.h"
++#include "MediaControl.h"
++#include "CaptureUnit.h"
++
++using std::vector;
++using std::map;
++
++namespace icamera {
++
++CaptureUnit::CaptureUnit(int cameraId, int memType) :
++    StreamSource(memType),
++    mCameraId(cameraId),
++    mDevice(nullptr),
++    mMaxBufferNum(PlatformData::getMaxRawDataNum(cameraId)),
++    mState(CAPTURE_UNINIT),
++    mExitPending(false)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    mPollThread = new PollThread(this);
++
++    mMaxBuffersInDevice = PlatformData::getExposureLag(mCameraId) + 1;
++    if (mMaxBuffersInDevice < 2) {
++        mMaxBuffersInDevice = 2;
++    }
++}
++
++CaptureUnit::~CaptureUnit()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    delete mPollThread;
++}
++
++int CaptureUnit::init()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    mState = CAPTURE_INIT;
++
++    return OK;
++}
++
++void CaptureUnit::deinit()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    if (mState == CAPTURE_UNINIT) {
++        LOG1("%s: deinit without init", __func__);
++        return;
++    }
++
++    destroyDevices();
++    mPollThread->join();
++
++    mState = CAPTURE_UNINIT;
++}
++
++int CaptureUnit::createDevices()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    destroyDevices();
++
++    // Default INVALID_PORT means the device isn't associated with any outside consumers.
++    const Port kDefaultPort = INVALID_PORT;
++    Port portOfMainDevice = findDefaultPort(mOutputFrameInfo);
++    // Use the config for main port as the default one.
++    const stream_t& kDefaultStream = mOutputFrameInfo.at(portOfMainDevice);
++
++    // Use VIDEO_GENERIC by default.
++    VideoNodeType nodeType = VIDEO_GENERIC;
++
++    mDevice = new MainDevice(mCameraId, nodeType, this);
++
++    // Open and configure the device. The stream and port that are used by the device is
++    // decided by whether consumer has provided such info, use the default one if not.
++    int ret = mDevice->openDevice();
++    CheckError(ret != OK, ret, "Open device(%s) failed:%d", mDevice->getName(), ret);
++
++    bool hasPort = mOutputFrameInfo.find(portOfMainDevice) != mOutputFrameInfo.end();
++    const stream_t& stream = hasPort ? mOutputFrameInfo.at(portOfMainDevice) : kDefaultStream;
++
++    ret = mDevice->configure(hasPort ? portOfMainDevice : kDefaultPort, stream, mMaxBufferNum);
++    CheckError(ret != OK, ret, "Configure device(%s) failed:%d", mDevice->getName(), ret);
++
++    return OK;
++}
++
++void CaptureUnit::destroyDevices()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    if (mDevice) {
++        mDevice->closeDevice();
++        delete mDevice;
++        mDevice = nullptr;
++    }
++
++}
++
++/**
++ * Find the device that can handle the given port.
++ */
++DeviceBase* CaptureUnit::findDeviceByPort(Port port)
++{
++    if (mDevice && mDevice->getPort() == port) {
++        return mDevice;
++    }
++
++    return nullptr;
++}
++
++int CaptureUnit::streamOn()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    if (mDevice) {
++        int ret = mDevice->streamOn();
++        CheckError(ret < 0, INVALID_OPERATION, "Device:%s stream on failed.", mDevice->getName());
++    }
++
++    return OK;
++}
++
++int CaptureUnit::start()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    AutoMutex l(mLock);
++    CheckWarning(mState == CAPTURE_START, OK, "@%s: device already started", __func__);
++
++    int ret = streamOn();
++    if (ret != OK) {
++        streamOff();
++        LOGE("Devices stream on failed:%d", ret);
++        return ret;
++    }
++
++    mPollThread->run("CaptureUnit", PRIORITY_URGENT_AUDIO);
++    mState = CAPTURE_START;
++    mExitPending = false;
++    LOG2("@%s: automation checkpoint: flag: poll_started", __func__);
++
++    return OK;
++}
++
++void CaptureUnit::streamOff()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    if (mDevice) {
++        mDevice->streamOff();
++    }
++}
++
++int CaptureUnit::stop()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s, mCameraId:%d", __func__, mCameraId);
++
++    if (mState != CAPTURE_START) {
++        LOGW("@%s: device not started", __func__);
++        return OK;
++    }
++
++    mExitPending = true;
++    mPollThread->requestExit();
++    streamOff();
++    mPollThread->requestExitAndWait();
++
++    AutoMutex   l(mLock);
++    mState = CAPTURE_STOP;
++
++    if (mDevice) {
++        mDevice->resetBuffers();
++    }
++    LOG2("@%s: automation checkpoint: flag: poll_stopped", __func__);
++
++    mExitPending = false; // It's already stopped.
++
++    return OK;
++}
++
++/**
++ * Check if the given outputFrames are different from the previous one.
++ * Only return false when the config for each port is exactly same.
++ */
++bool CaptureUnit::isNewConfiguration(const map<Port, stream_t>& outputFrames)
++{
++    for (const auto& item : outputFrames) {
++        if (mOutputFrameInfo.find(item.first) == mOutputFrameInfo.end()) {
++            return true;
++        }
++
++        const stream_t& oldStream = mOutputFrameInfo[item.first];
++        const stream_t& newStream = item.second;
++
++        bool isNewConfig = (oldStream.width != newStream.width || oldStream.height != newStream.height
++               || oldStream.format != newStream.format || oldStream.field != newStream.field
++               || oldStream.memType != newStream.memType);
++        if (isNewConfig) {
++            return true;
++        }
++    }
++
++    return false;
++}
++
++int CaptureUnit::configure(const map<Port, stream_t>& outputFrames,
++                           const vector<ConfigMode>& configModes)
++{
++    PERF_CAMERA_ATRACE();
++
++    CheckError(outputFrames.empty(), BAD_VALUE, "No frame info configured.");
++    CheckError(mState != CAPTURE_CONFIGURE && mState != CAPTURE_INIT && mState != CAPTURE_STOP,
++          INVALID_OPERATION, "@%s: Configure in wrong state %d", __func__, mState);
++
++    Port port = findDefaultPort(outputFrames);
++    const stream_t& mainStream = outputFrames.at(port);
++
++    for (const auto& item : outputFrames) {
++        LOG1("%s, mCameraId:%d, port:%d, w:%d, h:%d, f:%s", __func__, mCameraId, item.first,
++              item.second.width, item.second.height,
++              CameraUtils::format2string(item.second.format).c_str());
++    }
++
++    mConfigModes = configModes;
++    mOutputFrameInfo = outputFrames;
++
++    /* media ctl setup */
++    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
++    CheckError(!mc, BAD_VALUE, "get format configuration failed for %s (%dx%d)",
++               CameraUtils::format2string(mainStream.format).c_str(),
++               mainStream.width, mainStream.height);
++
++    int status = MediaControl::getInstance()->mediaCtlSetup(mCameraId, mc,
++            mainStream.width, mainStream.height, mainStream.field);
++    CheckError(status != OK, status, "set up mediaCtl failed");
++
++    // Create, open, and configure all of needed devices.
++    status = createDevices();
++    CheckError(status != OK, status, "Create devices failed:%d", status);
++
++    mState = CAPTURE_CONFIGURE;
++
++    // mExitPending should also be set false in configure to make buffers queued before start
++    mExitPending = false;
++
++    return OK;
++}
++
++Port CaptureUnit::findDefaultPort(const map<Port, stream_t>& frames) const
++{
++    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
++    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
++        if (frames.find(availablePorts[i]) != frames.end()) {
++            return availablePorts[i];
++        }
++    }
++    return INVALID_PORT;
++}
++
++int CaptureUnit::allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    const struct v4l2_buffer* v = camBuffer->getV4L2Buffer().Get();
++    CheckError(v->index >= mMaxBufferNum, -1
++        ,"index %d is larger than max count %d", v->index, mMaxBufferNum);
++    CheckError(v->memory != V4L2_MEMORY_MMAP, -1
++        ,"Allocating Memory Capture device only supports MMAP mode.");
++
++    DeviceBase* device = findDeviceByPort(port);
++    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
++
++    int ret = camBuffer->allocateMemory(device->getV4l2Device());
++    CheckError(ret < 0, ret, "Failed to allocate memory ret(%d) for port:%d", ret, port);
++
++    return OK;
++}
++
++int CaptureUnit::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    CheckError(camBuffer == nullptr, BAD_VALUE, "Camera buffer is null");
++    CheckError((mState == CAPTURE_INIT || mState == CAPTURE_UNINIT), INVALID_OPERATION,
++          "@%s: qbuf in wrong state %d", __func__, mState);
++
++    DeviceBase* device = findDeviceByPort(port);
++    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
++
++    LOG2("@%s, mCameraId:%d, queue CameraBuffer: %p to port:%d",
++         __func__, mCameraId, camBuffer.get(), port);
++
++    device->addPendingBuffer(camBuffer);
++
++    return processPendingBuffers();
++}
++
++int CaptureUnit::queueAllBuffers()
++{
++    PERF_CAMERA_ATRACE();
++
++    if (mExitPending) return OK;
++
++    if (mDevice) {
++        int ret = mDevice->queueBuffer(-1);
++        if (mExitPending) return OK;
++        CheckError(ret != OK, ret, "queueBuffer fails, dev:%s, ret:%d", mDevice->getName(), ret);
++        mDevice->getPredictSequence();
++    }
++
++    return OK;
++}
++
++void CaptureUnit::onDequeueBuffer()
++{
++    processPendingBuffers();
++}
++
++int CaptureUnit::processPendingBuffers()
++{
++    if (mDevice && mDevice->getBufferNumInDevice() < mMaxBuffersInDevice) {
++        LOG2("%s: buffers in device:%d", __func__, mDevice->getBufferNumInDevice());
++
++        if (!mDevice->hasPendingBuffer()) {
++            return OK;
++        }
++
++        int ret = queueAllBuffers();
++        if (mExitPending) return OK;
++        CheckError(ret != OK, ret, "Failed to queue buffers, ret=%d", ret);
++    }
++
++    return OK;
++}
++
++int CaptureUnit::poll()
++{
++    PERF_CAMERA_ATRACE();
++    int ret = 0;
++    const int poll_timeout_count = 10;
++    const int poll_timeout = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
++
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    CheckError((mState != CAPTURE_CONFIGURE && mState != CAPTURE_START), INVALID_OPERATION,
++          "@%s: poll buffer in wrong state %d", __func__, mState);
++
++    int timeOutCount = poll_timeout_count;
++
++    std::vector<V4L2Device*> pollDevs, readyDevices;
++    if (mDevice) {
++        pollDevs.push_back(mDevice->getV4l2Device());
++        LOG2("@%s: device:%s has %d buffers queued.", __func__,
++             mDevice->getName(), mDevice->getBufferNumInDevice());
++    }
++
++    while (timeOutCount-- && ret == 0) {
++        // If stream off, no poll needed.
++        if (mExitPending) {
++            LOG2("%s: mExitPending is true, exit", __func__);
++            //Exiting, no error
++            return -1;
++        }
++
++        V4L2DevicePoller poller {pollDevs, -1};
++        ret = poller.Poll(poll_timeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
++
++        LOG2("@%s: automation checkpoint: flag: poll_buffer, ret:%d", __func__, ret);
++    }
++
++    //In case poll error after stream off
++    if (mExitPending) {
++        LOG2("%s: mExitPending is true, exit", __func__);
++        //Exiting, no error
++        return -1;
++    }
++
++    CheckError(ret < 0, UNKNOWN_ERROR, "%s: Poll error, ret:%d", __func__, ret);
++
++    if (ret == 0) {
++        LOG1("%s, cameraId: %d: timeout happens, wait recovery", __func__, mCameraId);
++        return OK;
++    }
++
++    for (const auto& readyDevice : readyDevices) {
++        if (mDevice && mDevice->getV4l2Device() == readyDevice) {
++            int ret = mDevice->dequeueBuffer();
++            if (mExitPending) return -1;
++
++            if (ret != OK) {
++                LOGE("Device:%s grab frame failed:%d", mDevice->getName(), ret);
++            }
++            break;
++        }
++    }
++
++    return OK;
++}
++
++void CaptureUnit::addFrameAvailableListener(BufferConsumer *listener)
++{
++    LOG1("%s camera id:%d", __func__, mCameraId);
++
++    AutoMutex   l(mLock);
++    if (mDevice) {
++        mDevice->addFrameListener(listener);
++    }
++}
++
++void CaptureUnit::removeFrameAvailableListener(BufferConsumer *listener)
++{
++    LOG1("%s camera id:%d", __func__, mCameraId);
++
++    AutoMutex   l(mLock);
++    if (mDevice) {
++        mDevice->removeFrameListener(listener);
++    }
++}
++
++void CaptureUnit::removeAllFrameAvailableListener()
++{
++    LOG1("%s camera id:%d", __func__, mCameraId);
++
++    AutoMutex   l(mLock);
++    if (mDevice) {
++        mDevice->removeAllFrameListeners();
++    }
++}
++
++void CaptureUnit::registerListener(EventType eventType, EventListener* eventListener)
++{
++    if (mDevice) {
++        mDevice->registerListener(eventType, eventListener);
++    }
++}
++
++void CaptureUnit::removeListener(EventType eventType, EventListener* eventListener)
++{
++    if (mDevice) {
++        mDevice->removeListener(eventType, eventListener);
++    }
++}
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.h b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
+new file mode 100644
+index 000000000000..08062ec8bc51
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
+@@ -0,0 +1,194 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <vector>
++
++#include "iutils/Thread.h"
++
++#include "StreamSource.h"
++#include "CameraBuffer.h"
++#include "DeviceBase.h"
++#include "IspParamAdaptor.h"
++
++namespace icamera {
++
++/**
++  * CaptureUnit abstract the ISYS function.
++  * It implements the BufferProducer Interface and it is the source of any pipeline
++  * It hides the v4l2 and media controller to the upper layer.
++  */
++class CaptureUnit : public StreamSource, public DeviceCallback {
++
++public:
++    CaptureUnit(int cameraId, int memType = V4L2_MEMORY_MMAP);
++    virtual ~CaptureUnit();
++
++public:
++    /**
++     * \brief Queue on buffer to driver
++     *
++     * 1. Get the v4l2 buffer form the CameraBuffer
++     * 2. Queue this v4l2 buffer to driver and save it to one queue.
++     *
++     * \param[in] port: Indicates the camBuffer belongs to which port
++     * \param[in] camBuffer: the cameraBuffer queue to driver
++     *
++     * \return 0 if succeed, other value indicates failed
++     */
++    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    /**
++     * \brief allocate memory
++     *
++     * 1. Get the v4l2 buffer form the CameraBuffer
++     * 2. Query the v4l2 buffer to get the offset
++     * 3. Calling cameraBuffer class to allocate memory
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    /**
++     * \brief Add the frame buffer listener
++     *
++     * \param listener: the listener need to add
++     */
++    virtual void addFrameAvailableListener(BufferConsumer *listener);
++
++    /**
++     * \brief Remove the frame buffer listener
++     *
++     * \param listener: the listener need to remove
++     */
++    virtual void removeFrameAvailableListener(BufferConsumer *listener);
++
++    /**
++     * \brief Remove all the listeners
++     */
++    virtual void removeAllFrameAvailableListener();
++
++    /**
++     * \brief CaptureUnit initialze
++     */
++    virtual int init();
++
++    /**
++     * \brief CaptureUnit deinit
++     *
++     * 1. Destory all the buffer pool
++     * 2. Deinit the v4l2 device
++     * 3. Destory the poll thread
++     */
++    virtual void deinit();
++
++    /**
++     * \brief CaptureUnit start
++     *
++     * 1. Stream on
++     * 2. Running the pool Thread
++     */
++    virtual int start();
++
++    /**
++     * \brief CaptureUnit stop
++     *
++     * 1. Stream off
++     * 3. Release all the buffer queue
++     * 3. Stop the pool thread.
++     */
++    virtual int stop();
++
++    /**
++     * \brief configure the streams
++     *
++     * 1. Setup and reset the MediaControl links
++     * 2. Set format to Capture Device
++     *
++     * \param outputFrames: The output frames' configuration for ISYS.
++     * \param configModes: ConfigMode types
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    virtual int configure(const std::map<Port, stream_t>& outputFrames,
++                          const std::vector<ConfigMode>& configModes);
++
++    // Override EventSource API to delegate the listeners to DeviceBase.
++    virtual void registerListener(EventType eventType, EventListener* eventListener);
++    virtual void removeListener(EventType eventType, EventListener* eventListener);
++
++    // Overwrite DeviceCallback API
++    void onDequeueBuffer();
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(CaptureUnit);
++
++    int createDevices();
++    void destroyDevices();
++    DeviceBase* findDeviceByPort(Port port);
++    Port findDefaultPort(const std::map<Port, stream_t>& frames) const;
++
++    int streamOn();
++    void streamOff();
++
++    int poll();
++
++    bool isNewConfiguration(const std::map<Port, stream_t>& outputFrames);
++
++    int processPendingBuffers();
++    int queueAllBuffers();
++
++private:
++    /**
++     * \brief The pool frame buffer thread
++     */
++    class PollThread: public Thread {
++        CaptureUnit *mCaptureU;
++        public:
++            PollThread(CaptureUnit *hw) : mCaptureU(hw) { }
++
++            virtual bool threadLoop() {
++                return (mCaptureU->poll() == 0);
++            }
++    };
++
++    PollThread* mPollThread;
++
++    // Guard for mCaptureUnit public API except dqbuf and qbuf
++    Mutex mLock;
++
++    int mCameraId;
++    int mMaxBuffersInDevice;  // To control the number of buffers enqueued, for per-frame control.
++
++    std::vector<ConfigMode> mConfigModes;
++    std::map<Port, stream_t> mOutputFrameInfo;
++    DeviceBase* mDevice;
++    uint32_t mMaxBufferNum;
++
++    enum {
++        CAPTURE_UNINIT,
++        CAPTURE_INIT,
++        CAPTURE_CONFIGURE,
++        CAPTURE_START,
++        CAPTURE_STOP,
++    } mState;
++    bool mExitPending;
++};
++
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.cpp b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
+new file mode 100644
+index 000000000000..df5958a4a20f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
+@@ -0,0 +1,442 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <string>
++#include <vector>
++
++#define LOG_TAG "DeviceBase"
++
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Utils.h"
++#include "linux/ipu-isys.h"
++
++#include "SyncManager.h"
++#include "PlatformData.h"
++#include "DeviceBase.h"
++#include "CameraEventType.h"
++#include "V4l2DeviceFactory.h"
++
++using std::shared_ptr;
++
++namespace icamera {
++
++DeviceBase::DeviceBase(int cameraId, VideoNodeType nodeType, VideoNodeDirection nodeDirection,
++                       DeviceCallback* deviceCB) :
++        mCameraId(cameraId),
++        mPort(INVALID_PORT),
++        mNodeType(nodeType),
++        mNodeDirection(nodeDirection),
++        mName(GetNodeName(nodeType)),
++        mDevice(nullptr),
++        mLatestSequence(-1),
++        mNeedSkipFrame(false),
++        mDeviceCB(deviceCB),
++        mMaxBufferNumber(MAX_BUFFER_COUNT)
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
++
++    std::string devName;
++    int ret = PlatformData::getDevNameByType(cameraId, nodeType, devName);
++    CheckError(ret != OK, VOID_VALUE,
++               "Failed to get video device name for cameraId: %d, node type: %d",
++               cameraId, nodeType);
++
++    mDevice = new V4L2VideoNode(devName);
++}
++
++DeviceBase::~DeviceBase()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    delete mDevice;
++}
++
++int DeviceBase::openDevice()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    if (PlatformData::isEnableFrameSyncCheck(mCameraId))
++        SyncManager::getInstance()->updateSyncCamNum();
++
++    return mDevice->Open(O_RDWR);
++}
++
++void DeviceBase::closeDevice()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++    {
++        AutoMutex l(mBufferLock);
++
++        std::vector<V4L2Buffer> bufs;
++        mDevice->SetupBuffers(0, true, mDevice->GetMemoryType(), &bufs);
++
++        mPendingBuffers.clear();
++        mBuffersInDevice.clear();
++        mAllocatedBuffers.clear();
++    }
++
++    mDevice->Close();
++}
++
++int DeviceBase::configure(Port port, const stream_t& config, uint32_t bufferNum)
++{
++    LOG1("%s, camera id:%d device:%s, port:%d", __func__, mCameraId, mName, port);
++
++    mPort = port;
++    mMaxBufferNumber = bufferNum;
++
++    int ret = createBufferPool(config);
++    CheckError(ret != OK, NO_MEMORY, "Failed to create buffer pool:%d", ret);
++
++    resetBuffers();
++
++    return OK;
++}
++
++int DeviceBase::streamOn()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
++
++    return mDevice->Start();
++}
++
++int DeviceBase::streamOff()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    mDevice->Stop(false);
++
++    return OK;
++}
++
++int DeviceBase::queueBuffer(long sequence)
++{
++    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    shared_ptr<CameraBuffer> buffer;
++    AutoMutex l(mBufferLock);
++    if (mPendingBuffers.empty()) {
++        LOG2("Device:%s has no pending buffer to be queued.", mName);
++        return OK;
++    }
++    buffer = mPendingBuffers.front();
++
++    int ret = onQueueBuffer(sequence, buffer);
++    CheckError(ret != OK, ret, "Device:%s failed to preprocess the buffer with ret=%d", mName, ret);
++
++    ret = mDevice->PutFrame(&buffer->getV4L2Buffer());
++
++    if (ret >= 0) {
++        mPendingBuffers.pop_front();
++        mBuffersInDevice.push_back(buffer);
++    }
++
++    return ret;
++}
++
++int DeviceBase::dequeueBuffer()
++{
++    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++
++    shared_ptr<CameraBuffer> camBuffer = getFirstDeviceBuffer();
++    CheckError(!camBuffer, UNKNOWN_ERROR, "No buffer in device:%s.", mName);
++
++    int ret = OK;
++    int targetIndex = camBuffer->getIndex();
++
++    V4L2Buffer &vbuf = camBuffer->getV4L2Buffer();
++    int actualIndex = mDevice->GrabFrame(&vbuf);
++
++    CheckError(actualIndex < 0, BAD_VALUE, "Device grabFrame failed:%d", actualIndex);
++    if (actualIndex != targetIndex) {
++        LOGE("%s, CamBuf index isn't same with index used by kernel", __func__);
++        ret = BAD_VALUE;
++    }
++
++    mNeedSkipFrame = needQueueBack(camBuffer);
++    popBufferFromDevice();
++
++    // TODO: Will add device name info to distinguish different devices.
++    PERF_CAMERA_ATRACE_PARAM3("grabFrame SeqID", camBuffer->getSequence(),
++                              "csi2_port",       camBuffer->getCsi2Port(),
++                              "virtual_channel", camBuffer->getVirtualChannel());
++
++    ret |= onDequeueBuffer(camBuffer);
++
++    // Skip initial frames if needed.
++    if (mFrameSkipNum > 0) {
++        mFrameSkipNum--;
++    }
++    return ret;
++}
++
++int DeviceBase::getBufferNumInDevice()
++{
++    AutoMutex l(mBufferLock);
++
++    return mBuffersInDevice.size();
++}
++
++void DeviceBase::resetBuffers()
++{
++    AutoMutex l(mBufferLock);
++
++    mBuffersInDevice.clear();
++    mPendingBuffers.clear();
++
++    for (const auto& buffer : mAllocatedBuffers) {
++        mPendingBuffers.push_back(buffer);
++    }
++}
++
++bool DeviceBase::hasPendingBuffer()
++{
++    AutoMutex l(mBufferLock);
++
++    return !mPendingBuffers.empty();
++}
++
++void DeviceBase::addPendingBuffer(const shared_ptr<CameraBuffer>& buffer)
++{
++    AutoMutex l(mBufferLock);
++
++    mPendingBuffers.push_back(buffer);
++}
++
++long DeviceBase::getPredictSequence()
++{
++    AutoMutex l(mBufferLock);
++
++    return mLatestSequence + mFrameSkipNum + mBuffersInDevice.size();
++}
++
++shared_ptr<CameraBuffer> DeviceBase::getFirstDeviceBuffer()
++{
++    AutoMutex l(mBufferLock);
++
++    return mBuffersInDevice.empty() ? nullptr : mBuffersInDevice.front();
++}
++
++bool DeviceBase::skipFrameAfterSyncCheck(long sequence)
++{
++    //For multi-camera sensor, to check whether the frame synced or not
++    int count = 0;
++    const int timeoutDuration = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
++    const int maxCheckTimes = 10;  //10 times
++    while (!SyncManager::getInstance()->isSynced(mCameraId, sequence)) {
++        usleep(timeoutDuration);
++        count++;
++        if (count > maxCheckTimes) {
++            return true;
++        }
++    }
++    return false;
++}
++
++void DeviceBase::popBufferFromDevice()
++{
++    AutoMutex l(mBufferLock);
++    if (mBuffersInDevice.empty()) {
++        return;
++    }
++
++    shared_ptr<CameraBuffer> camBuffer = mBuffersInDevice.front();
++    mBuffersInDevice.pop_front();
++    mLatestSequence = camBuffer->getSequence();
++
++    if (mNeedSkipFrame) {
++        mPendingBuffers.push_back(camBuffer);
++    }
++}
++
++void DeviceBase::dumpFrame(const shared_ptr<CameraBuffer>& buffer)
++{
++    if (!CameraDump::isDumpTypeEnable(DUMP_ISYS_BUFFER)) return;
++
++    LOGD("@%s, ISYS: fmt:%s(%dx%d), stride:%d, len:%d", __func__,
++         CameraUtils::format2string(buffer->getFormat()).c_str(),
++         buffer->getWidth(), buffer->getHeight(), buffer->getStride(), buffer->getBufferSize());
++
++    CameraDump::dumpImage(mCameraId, buffer, M_ISYS, mPort);
++}
++
++MainDevice::MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB) :
++        DeviceBase(cameraId, nodeType, INPUT_VIDEO_NODE, deviceCB)
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++}
++
++MainDevice::~MainDevice()
++{
++    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
++}
++
++int MainDevice::createBufferPool(const stream_t& config)
++{
++    LOG1("%s, camera id:%d, fmt:%s(%dx%d) field:%d", __func__, mCameraId,
++         CameraUtils::pixelCode2String(config.format), config.width, config.height, config.field);
++
++    // Pass down ISYS compression flag to driver, which is CSI-BE output compression
++    bool isISYSCompression = PlatformData::getISYSCompression(mCameraId);
++    if (PlatformData::isCSIBackEndCapture(mCameraId)) {
++        std::string csiBEDeviceNodeName;
++        int ret = PlatformData::getDevNameByType(mCameraId, VIDEO_GENERIC, csiBEDeviceNodeName);
++        CheckError(ret != OK, ret, "failed to get CSI-BE device node name, ret=%d", ret);
++        LOG1("csiBEDeviceNodeName is %s", csiBEDeviceNodeName.c_str());
++
++        V4L2Subdevice* csiBESubDev = V4l2DeviceFactory::getSubDev(mCameraId, csiBEDeviceNodeName);
++        ret = csiBESubDev->SetControl(V4L2_CID_IPU_ISYS_COMPRESSION, isISYSCompression);
++        LOG2("@%s, set control compression for BE capture, node name: %s, ret:%d",
++                __func__, csiBEDeviceNodeName.c_str(), ret);
++    }
++
++    bool setWithHeaderCtl = true;
++    std::string subDeviceNodeName;
++
++    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
++        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
++        if (PlatformData::isTPGReceiver(mCameraId)) {
++            LOG1("%s: no need to set csi header ctrl for tpg", __func__);
++            setWithHeaderCtl = false;
++        }
++    } else {
++        setWithHeaderCtl = false;
++    }
++
++    int withHeader = 1;
++    struct v4l2_format v4l2fmt;
++    v4l2fmt.fmt.pix_mp.field = config.field;
++
++    if (PlatformData::isCSIFrontEndCapture(mCameraId)) {
++        int planesNum = CameraUtils::getNumOfPlanes(config.format);
++        LOG1("@%s Num of planes: %d, mCameraId:%d", __func__, planesNum, mCameraId);
++
++        v4l2fmt.fmt.pix_mp.width = config.width;
++        v4l2fmt.fmt.pix_mp.height = config.height;
++        v4l2fmt.fmt.pix_mp.num_planes = planesNum;
++        v4l2fmt.fmt.pix_mp.pixelformat = config.format;
++        for (int i = 0; i < v4l2fmt.fmt.pix_mp.num_planes; i++) {
++            v4l2fmt.fmt.pix_mp.plane_fmt[i].bytesperline = config.width;
++            v4l2fmt.fmt.pix_mp.plane_fmt[i].sizeimage = 0;
++        }
++        // The frame data is without header(MIPI STORE MODE) when
++        // format is YUV/RGB and frame output from CSI-Front-End entity.
++        if (!CameraUtils::isRaw(config.format)) {
++            LOG2("@%s, set frame without header for format: %s",
++                    __func__, CameraUtils::pixelCode2String(config.format));
++            withHeader = 0;
++        }
++    } else {
++        v4l2fmt.fmt.pix.width = config.width;
++        v4l2fmt.fmt.pix.height = config.height;
++        v4l2fmt.fmt.pix.pixelformat = config.format;
++        v4l2fmt.fmt.pix.bytesperline = config.width;
++        v4l2fmt.fmt.pix.sizeimage = 0;
++    }
++
++    if (setWithHeaderCtl) {
++        V4L2Subdevice* receiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
++        int ret = receiverSubDev->SetControl(V4L2_CID_IPU_STORE_CSI2_HEADER, withHeader);
++        CheckError(ret != OK, ret, "set v4l2 store csi2 header failed, ret=%d", ret);
++    }
++
++    v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++    V4L2Format tmpbuf {v4l2fmt};
++    int ret = mDevice->SetFormat(tmpbuf);
++    CheckError(ret != OK, ret, "set v4l2 format failed ret=%d", ret);
++    v4l2fmt = *tmpbuf.Get();
++
++    int realBufferSize = v4l2fmt.fmt.pix.sizeimage;
++    int calcBufferSize = 0;
++    if (isISYSCompression) {
++        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height, false, true, true);
++    } else {
++        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height);
++    }
++
++    CheckError(calcBufferSize < realBufferSize, BAD_VALUE,
++        "realBufferSize %d is larger than calcBufferSize %d.", realBufferSize, calcBufferSize);
++
++    LOG2("@%s: compression:%d, realBufSize:%d, calcBufSize:%d",
++                __func__, isISYSCompression, realBufferSize, calcBufferSize);
++
++    std::vector<V4L2Buffer> bufs;
++    int bufNum = mDevice->SetupBuffers(mMaxBufferNumber, true,
++                                       static_cast<enum v4l2_memory>(config.memType), &bufs);
++
++    CheckError(bufNum < 0, BAD_VALUE, "request buffers failed return=%d", bufNum);
++
++    return OK;
++}
++
++int MainDevice::onDequeueBuffer(shared_ptr<CameraBuffer> buffer)
++{
++    mDeviceCB->onDequeueBuffer();
++
++    if (mNeedSkipFrame) return OK;
++
++    LOG2("@%s, sequence:%ld, field:%d, timestamp: sec=%ld, usec=%ld",
++          __func__, buffer->getSequence(), buffer->getField(),
++          buffer->getTimestamp().tv_sec, buffer->getTimestamp().tv_usec);
++
++    for (auto& consumer : mConsumers) {
++        consumer->onFrameAvailable(mPort, buffer);
++    }
++
++    EventData frameData;
++    frameData.type = EVENT_ISYS_FRAME;
++    frameData.buffer = nullptr;
++    frameData.data.frame.sequence = buffer->getSequence();
++    frameData.data.frame.timestamp.tv_sec = buffer->getTimestamp().tv_sec;
++    frameData.data.frame.timestamp.tv_usec = buffer->getTimestamp().tv_usec;
++    notifyListeners(frameData);
++
++    dumpFrame(buffer);
++
++    return OK;
++}
++
++bool MainDevice::needQueueBack(shared_ptr<CameraBuffer> buffer)
++{
++    bool needSkipFrame = (mFrameSkipNum > 0);
++
++    const V4L2Buffer& vbuf = buffer->getV4L2Buffer();
++    // Check for STR2MMIO Error from kernel space
++    if((vbuf.Flags() & V4L2_BUF_FLAG_ERROR) && PlatformData::isSkipFrameOnSTR2MMIOErr(mCameraId)) {
++        // On STR2MMIO error, enqueue this buffer back to V4L2 before notifying the
++        // listener/consumer and return
++        needSkipFrame = true;
++    }
++    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
++        struct camera_buf_info sharedCamBufInfo;
++        sharedCamBufInfo.sequence = buffer->getSequence();
++        sharedCamBufInfo.sof_ts = buffer->getTimestamp();
++        SyncManager::getInstance()->updateCameraBufInfo(mCameraId, &sharedCamBufInfo);
++        if (skipFrameAfterSyncCheck(buffer->getSequence())) {
++            LOG1("@%s: CameraID:%d sequence %ld been dropped due to frame not sync",
++                  __func__, mCameraId, buffer->getSequence());
++            needSkipFrame = true;
++        }
++    }
++    return needSkipFrame;
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.h b/camera/hal/intel/ipu6/src/core/DeviceBase.h
+new file mode 100644
+index 000000000000..753604c7550d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/DeviceBase.h
+@@ -0,0 +1,171 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <set>
++#include <list>
++#include <atomic>
++
++#include "iutils/Thread.h"
++#include "v4l2/NodeInfo.h"
++#include "BufferQueue.h"
++#include "CameraBuffer.h"
++#include "IspParamAdaptor.h"
++
++namespace icamera {
++
++enum VideoNodeDirection {
++    INPUT_VIDEO_NODE,   /*!< input video devices like cameras or capture cards */
++    OUTPUT_VIDEO_NODE  /*!< output video devices like displays */
++};
++
++class DeviceCallback {
++public:
++    DeviceCallback() {};
++    virtual ~DeviceCallback() {};
++    virtual void onDequeueBuffer() {};
++};
++
++/**
++ * DeviceBase is a base class of other devices which are for a particular purpose.
++ * It provides: general operation of V4l2 devices, and secured buffer management.
++ *
++ * There are several virtual functions for subclass to override. The subclass should
++ * base on what its implementation is to override one or several of them.
++ */
++class DeviceBase : public EventSource {
++public:
++    DeviceBase(int cameraId, VideoNodeType nodeType,
++               VideoNodeDirection nodeDirection, DeviceCallback* deviceCB = nullptr);
++    virtual ~DeviceBase();
++
++    int configure(Port port, const stream_t& config, uint32_t bufferNum);
++
++    int openDevice();
++    void closeDevice();
++
++    int streamOn();
++    int streamOff();
++
++    int queueBuffer(long sequence);
++    int dequeueBuffer();
++
++    void addFrameListener(BufferConsumer *listener) { mConsumers.insert(listener); }
++    void removeFrameListener(BufferConsumer *listener) { mConsumers.erase(listener); }
++    void removeAllFrameListeners() { mConsumers.clear(); }
++
++    bool hasPendingBuffer();
++    void addPendingBuffer(const std::shared_ptr<CameraBuffer>& buffer);
++    long getPredictSequence();
++    int getBufferNumInDevice();
++    void resetBuffers();
++    bool skipFrameAfterSyncCheck(long sequence);
++
++    V4L2VideoNode* getV4l2Device() { return mDevice; }
++    const char* getName() { return mName; }
++    Port getPort() { return mPort; }
++
++protected:
++    /**
++     * Configure the device and request or create(if needed) the buffer pool.
++     */
++    virtual int createBufferPool(const stream_t& config) { return OK; }
++
++    /**
++     * Pre-process the buffer which to be queued to the device.
++     */
++    virtual int onQueueBuffer(long sequence, std::shared_ptr<CameraBuffer>& buffer) { return OK; }
++
++    /**
++     * Post-process the buffer after it's dequeued from the device.
++     */
++    virtual int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer) { return OK; }
++
++    /**
++     * Return whether the buffer needs to be queued back to mPendingBuffers.
++     */
++    virtual bool needQueueBack(std::shared_ptr<CameraBuffer> buffer) { return false; }
++
++    void dumpFrame(const std::shared_ptr<CameraBuffer>& buffer);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(DeviceBase);
++
++    /**
++     * Get one available buffer from mBuffersInDevice
++     *
++     * Return the front buffer of mBuffersInDevice if available, otherwise return nullptr.
++     */
++    std::shared_ptr<CameraBuffer> getFirstDeviceBuffer();
++
++    /**
++     * Pop the first buffer in mBuffersInDevice.
++     * Add the buffer back to mPendingBuffers if needed.
++     */
++    void popBufferFromDevice();
++
++protected:
++    int mCameraId;
++    Port mPort;
++    VideoNodeType mNodeType;
++    VideoNodeDirection mNodeDirection;
++    const char* mName;
++    V4L2VideoNode* mDevice; // The device used to queue/dequeue buffers.
++    long mLatestSequence; // Track the latest bufffer sequence from driver.
++    bool mNeedSkipFrame; // True if the frame/buffer needs to be skipped.
++    int mFrameSkipNum; // How many frames need to be skipped after stream on.
++    DeviceCallback* mDeviceCB;
++    std::set<BufferConsumer*> mConsumers;
++
++    /**
++     * Each device has below three structures to manager its buffers.
++     * And please note that:
++     * 1. If the buffer is not allocated inside CaptureUnit, mAllocatedBuffers will be empty.
++     * 2. Buffer to be queued into drive comes from mPendingBuffers.
++     * 3. Buffer to be dequeued from driver comes from mBuffersInDevice.
++     * 4. To make code clean, no null CameraBuffer is allowed to be put into these structures.
++     * 5. The buffer cannot be in both mPendingBuffers and mBuffersInDevice.
++     *    We must make the data consistent.
++     */
++    std::vector<std::shared_ptr<CameraBuffer>> mAllocatedBuffers;
++            // Save all buffers allocated internally.
++    std::list<std::shared_ptr<CameraBuffer>> mPendingBuffers;
++            // The buffers that are going to be queued.
++    std::list<std::shared_ptr<CameraBuffer>> mBuffersInDevice; // The buffers that have been queued
++    Mutex mBufferLock; // The lock for protecting the internal buffers.
++
++    uint32_t mMaxBufferNumber;
++};
++
++/**
++ * MainDevice is a most commonly used device.
++ * It's usually for producing video frames.
++ */
++class MainDevice : public DeviceBase {
++public:
++    MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB);
++    ~MainDevice();
++
++private:
++    int createBufferPool(const stream_t& config);
++    int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer);
++    bool needQueueBack(std::shared_ptr<CameraBuffer> buffer);
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
+new file mode 100644
+index 000000000000..0a766200b8d8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
+@@ -0,0 +1,964 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "IspParamAdaptor"
++
++#include <stdio.h>
++
++#include "IspParamAdaptor.h"
++
++#include "3a/AiqResult.h"
++#include "3a/AiqResultStorage.h"
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Errors.h"
++#include "PlatformData.h"
++#include "IGraphConfig.h"
++
++#include "ia_pal_types_isp_ids_autogen.h"
++#include "ia_pal_types_isp.h"
++
++namespace icamera {
++
++IspParamAdaptor::IspParamAdaptor(int cameraId, PgParamType type) :
++        mIspAdaptorState(ISP_ADAPTOR_NOT_INIT),
++        mCameraId(cameraId),
++        mPgParamType(type),
++        mTuningMode(TUNING_MODE_VIDEO),
++        mIspAdaptHandle(nullptr),
++        mBCompResults(nullptr),
++        mCurIspParamIndex(-1),
++        mCallInfoOffset(-1),
++        mBNLM32Offset(-1),
++        mGCM(nullptr),
++        mAdaptor(nullptr)
++{
++    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
++    CLEAR(mFrameParam);
++    CLEAR(mLastPalDataForVideoPipe);
++
++    if (PlatformData::getGraphConfigNodes(cameraId)) {
++        mGCM = IGraphConfigManager::getInstance(cameraId);
++    }
++
++    mAdaptor = std::unique_ptr<IntelIspParamAdaptor>(new IntelIspParamAdaptor());
++}
++
++IspParamAdaptor::~IspParamAdaptor()
++{
++    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
++}
++
++int IspParamAdaptor::init()
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    AutoMutex l(mIspAdaptorLock);
++
++    mIspAdaptorState = ISP_ADAPTOR_INIT;
++    return OK;
++}
++
++int IspParamAdaptor::deinit()
++{
++    LOG1("ISP HW param adaptor de-initialized for camera id:%d type:%d", mCameraId, mPgParamType);
++    AutoMutex l(mIspAdaptorLock);
++
++    deinitIspAdaptHandle();
++
++    {
++        AutoMutex l(mIpuParamLock);
++
++        // Release the memory and clear the mapping
++        for (auto& pgMap: mStreamIdToProgramGroupMap) {
++            delete[] pgMap.second.run_kernels;
++        }
++        mStreamIdToProgramGroupMap.clear();
++        mStreamIdToPGOutSizeMap.clear();
++        releaseIspParamBuffers();
++    }
++
++    CLEAR(mFrameParam);
++    CLEAR(mLastPalDataForVideoPipe);
++    mCallInfoOffset = -1;
++    mBNLM32Offset = -1;
++
++    mIspAdaptorState = ISP_ADAPTOR_NOT_INIT;
++    return OK;
++}
++
++int IspParamAdaptor::initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode)
++{
++    int ret = OK;
++
++    if (!PlatformData::isEnableAIQ(mCameraId)) {
++        return ret;
++    }
++
++    ia_binary_data ispData;
++    ia_cmc_t *cmcData = nullptr;
++    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
++
++    ret = PlatformData::getCpfAndCmc(mCameraId, &ispData, nullptr, nullptr,
++                                     &cmcHandle, tuningMode, &cmcData);
++    CheckError(ret != OK, NO_INIT, "get cpf and cmc data failed");
++
++    int statsNum = PlatformData::getExposureNum(mCameraId,
++                                                CameraUtils::isMultiExposureCase(tuningMode));
++    mIspAdaptHandle = mAdaptor->init(&ispData, reinterpret_cast<ia_cmc_t*>(cmcHandle),
++                                     MAX_STATISTICS_WIDTH, MAX_STATISTICS_HEIGHT,
++                                     statsNum, nullptr);
++    CheckError(!mIspAdaptHandle, NO_INIT, "ISP adaptor failed to initialize");
++
++    /*
++     * The number of streamId is identified in configure stream,
++     * fill the mStreamIdToProgramGroupMap and allocate the IspParameter memory
++     */
++    if (mGCM != nullptr && mGCM->isGcConfigured()) {
++        AutoMutex l(mIpuParamLock);
++
++        ret = initProgramGroupForAllStreams(configMode);
++        CheckError(ret != OK, ret, "%s, Failed to init programGroup for all streams", __func__);
++        ret = allocateIspParamBuffers();
++        CheckError(ret != OK, ret, "%s, Failed to allocate isp parameter buffers", __func__);
++    }
++
++    LOG1("ISP HW param adaptor initialized successfully camera id:%d", mCameraId);
++
++    return ret;
++}
++
++void IspParamAdaptor::deinitIspAdaptHandle()
++{
++    if (mIspAdaptHandle) {
++        mAdaptor->deInit(mIspAdaptHandle);
++        mIspAdaptHandle = nullptr;
++    }
++
++}
++
++int IspParamAdaptor::initProgramGroupForAllStreams(ConfigMode configMode)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++
++    std::vector<int32_t> streamIds;
++
++    //Release the memory and clear the mapping
++    for (auto& pgMap: mStreamIdToProgramGroupMap) {
++        delete[] pgMap.second.run_kernels;
++    }
++    mStreamIdToProgramGroupMap.clear();
++    mStreamIdToPGOutSizeMap.clear();
++    mStreamIdToMbrDataMap.clear();
++
++    std::shared_ptr<IGraphConfig> graphConfig = mGCM->getGraphConfig(configMode);
++    if(graphConfig == nullptr) {
++        LOGW("There isn't GraphConfig for camera configMode: %d", configMode);
++        return UNKNOWN_ERROR;
++    }
++
++    if (mPgParamType == PG_PARAM_ISYS) {
++        int streamId = 0; // 0 is for PG_PARAM_ISYS
++        streamIds.push_back(streamId);
++    } else {
++        status_t ret = graphConfig->graphGetStreamIds(streamIds);
++        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the PG streamIds");
++    }
++
++    for (auto id : streamIds) {
++        ia_isp_bxt_program_group *pgPtr = graphConfig->getProgramGroup(id);
++        if (pgPtr != nullptr) {
++            ia_isp_bxt_program_group programGroup;
++            CLEAR(programGroup);
++            programGroup.run_kernels = new ia_isp_bxt_run_kernels_t[pgPtr->kernel_count];
++
++            // Skip those kernels with 0 uuid which isn't PAL uuid
++            for (unsigned int i = 0; i < pgPtr->kernel_count; i++) {
++                if (pgPtr->run_kernels[i].kernel_uuid != 0) {
++                    MEMCPY_S(&programGroup.run_kernels[programGroup.kernel_count],
++                             sizeof(ia_isp_bxt_run_kernels_t),
++                             &pgPtr->run_kernels[i],
++                             sizeof(ia_isp_bxt_run_kernels_t));
++                    programGroup.kernel_count++;
++                } else {
++                    LOG1("There is 0 uuid found, stream id %d", id);
++                }
++            }
++
++            // Override the stream id in kernel list with the one in sensor's config file.
++            // Remove this after the sensor's tuning file uses correct stream id.
++            int streamId = PlatformData::getStreamIdByConfigMode(mCameraId, configMode);
++            if (streamId != -1) {
++                programGroup.run_kernels->stream_id = streamId;
++            }
++
++            mStreamIdToProgramGroupMap[id] = programGroup;
++            mStreamIdToPGOutSizeMap[id] = mAdaptor->getPalDataSize(&programGroup);
++            ia_isp_bxt_gdc_limits mbrData;
++            status_t ret  = graphConfig->getMBRData(id, &mbrData);
++            if (ret == OK) {
++                mStreamIdToMbrDataMap[id] = mbrData;
++                LOG2("get mbr data for stream:%d:%f,%f,%f,%f",
++                     id, mbrData.rectilinear.zoom, mbrData.rectilinear.pitch,
++                     mbrData.rectilinear.yaw, mbrData.rectilinear.roll);
++            }
++        }
++    }
++
++    return OK;
++}
++
++void IspParamAdaptor::initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type)
++{
++    CheckError(params == nullptr, VOID_VALUE, "NULL input parameter");
++
++    if (type == PG_PARAM_PSYS_ISA) {
++        params->ee_setting.feature_level = ia_isp_feature_level_low;
++        params->ee_setting.strength = 0;
++        LOG2("%s: set initial default edge enhancement setting: level: %d, strengh: %d",
++            __func__, params->ee_setting.feature_level, params->ee_setting.strength);
++
++        params->nr_setting.feature_level = ia_isp_feature_level_high;
++        params->nr_setting.strength = 0;
++        LOG2("%s: set initial default noise setting: level: %d, strengh: %d",
++            __func__, params->nr_setting.feature_level, params->nr_setting.strength);
++    }
++}
++
++int IspParamAdaptor::postConfigure(int width, int height, ia_binary_data *ipuParam)
++{
++    // The PG wrapper init is done by the imaging controller.
++    if(mPgParamType == PG_PARAM_PSYS_ISA) {
++        mIspAdaptorState = ISP_ADAPTOR_CONFIGURED;
++        return OK; //No need to do anything for P2P. It id done by libiacss
++    }
++
++    return OK;
++}
++
++/**
++ * configure
++ *
++ * (graph config version)
++ * This is the method used when the spatial parameters change, usually during
++ * stream configuration.
++ *
++ * We initialize the ISP adaptor to produce worst case scenario for memory
++ * allocation.
++ *
++ * At this state we initialize the wrapper code that helps encoding the PG
++ * descriptor and terminal payloads (i.e. the parameters for the PG).
++ *
++ * \param configMode[IN]: The real configure mode.
++ * \param tuningMode[IN]:  The tuning mode.
++ * \param stream[IN]: frame info.
++ * \return OK: everything went ok.
++ * \return UNKNOWN_ERROR: First run of ISP adaptation failed.
++ * \return NO_INIT: Initialization of P2P or PG_DIE wrapper failed.
++ */
++int IspParamAdaptor::configure(const stream_t &stream,
++        ConfigMode configMode, TuningMode tuningMode)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    AutoMutex l(mIspAdaptorLock);
++
++    mTuningMode = tuningMode;
++    CLEAR(mLastPalDataForVideoPipe);
++    mCallInfoOffset = -1;
++    mBNLM32Offset = -1;
++
++    ia_isp_bxt_input_params_v2 inputParams;
++    CLEAR(inputParams);
++    ia_aiq_sa_results_v1 fakeSaResults;
++    CLEAR(fakeSaResults);
++
++    deinitIspAdaptHandle();
++    int ret = initIspAdaptHandle(configMode, tuningMode);
++    CheckError(ret != OK, ret, "%s, init Isp Adapt Handle failed %d", __func__, ret);
++
++    SensorFrameParams param;
++    int status = PlatformData::calculateFrameParams(mCameraId, param);
++    CheckError(status != OK, status, "%s: Failed to calculate frame params", __func__);
++    AiqUtils::convertToAiqFrameParam(param, mFrameParam);
++
++    LOG1("horizontal_crop_offset:%d", mFrameParam.horizontal_crop_offset);
++    LOG1("vertical_crop_offset:%d", mFrameParam.vertical_crop_offset);
++    LOG1("cropped_image_width:%d", mFrameParam.cropped_image_width);
++    LOG1("cropped_image_height:%d", mFrameParam.cropped_image_height);
++    LOG1("horizontal_scaling_numerator:%d", mFrameParam.horizontal_scaling_numerator);
++    LOG1("horizontal_scaling_denominator:%d", mFrameParam.horizontal_scaling_denominator);
++    LOG1("vertical_scaling_numerator:%d", mFrameParam.vertical_scaling_numerator);
++    LOG1("vertical_scaling_denominator:%d", mFrameParam.vertical_scaling_denominator);
++
++    /*
++     * Construct the dummy Shading Adaptor  results to force the creation of
++     * the LSC table.
++     * Assign them to the AIC input parameter structure.
++     */
++    unsigned short fakeLscTable[4] = {1,1,1,1};
++    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
++        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
++            fakeSaResults.lsc_grid[i][j] = fakeLscTable;
++        }
++    }
++    fakeSaResults.fraction_bits = 0;
++    fakeSaResults.color_order = cmc_bayer_order_grbg;
++    fakeSaResults.lsc_update = true;
++    fakeSaResults.width = 2;
++    fakeSaResults.height = 2;
++    inputParams.sa_results = &fakeSaResults;
++
++    initInputParams(&inputParams, mPgParamType);
++
++    /*
++     *  IA_ISP_BXT can run without 3A results to produce the defaults for a
++     *  given sensor configuration.
++     */
++    IspParameter *ipuParam = nullptr;
++    {
++        AutoMutex l(mIpuParamLock);
++        mCurIspParamIndex = 0;
++        ipuParam = &(mIspParameters[mCurIspParamIndex]);
++    }
++    CheckError(!ipuParam, UNKNOWN_ERROR, "%s, Failed to get memory for ipuParam", __func__);
++
++    ia_binary_data curIpuParam = {};
++    for (auto& binaryMap : ipuParam->streamIdToDataMap) {
++        inputParams.program_group = &(mStreamIdToProgramGroupMap[binaryMap.first]);
++        inputParams.sensor_frame_params = &mFrameParam;
++        curIpuParam = binaryMap.second;
++        curIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
++
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
++
++        int ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &curIpuParam);
++        CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
++
++        {
++            AutoMutex l(mIpuParamLock);
++            binaryMap.second.size = curIpuParam.size;
++            ipuParam->dataAvailableMap[binaryMap.first] = true;
++            ipuParam->sequence = -1;
++        }
++    }
++
++    dumpIspParameter(0, curIpuParam);
++
++    return postConfigure(stream.width, stream.height, &curIpuParam);
++}
++
++int IspParamAdaptor::getParameters(Parameters& param)
++{
++    AutoMutex l(mIspAdaptorLock);
++
++    return OK;
++}
++
++int IspParamAdaptor::decodeStatsData(TuningMode tuningMode,
++                                     std::shared_ptr<CameraBuffer> statsBuffer,
++                                     std::shared_ptr<IGraphConfig> graphConfig)
++{
++    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED,
++               INVALID_OPERATION, "%s, wrong state %d", __func__, mIspAdaptorState);
++
++    long sequence = statsBuffer->getSequence();
++    AiqResultStorage *aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
++
++    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
++    if (feedback == nullptr) {
++        LOGW("No aiq result of sequence %ld! Use the latest instead", sequence);
++        feedback = aiqResultStorage->getAiqResult();
++    }
++
++    camera_resolution_t dvsInReso = {};
++    if (graphConfig) {
++        ia_isp_bxt_resolution_info_t resolution = {};
++        uint32_t gdcKernelId;
++        graphConfig->getGdcKernelSetting(&gdcKernelId, &resolution);
++        dvsInReso.width = resolution.input_width;
++        dvsInReso.height = resolution.input_height;
++    }
++
++    ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuffer->getBufferAddr());
++    ConvertInputParam inputParams = {CameraUtils::isMultiExposureCase(tuningMode),
++                                     hwStatsData, &dvsInReso, &feedback->mAeResults, mBCompResults};
++
++    ConvertResult result;
++    ia_isp_bxt_statistics_query_results_t queryResults;
++    CLEAR(result);
++    CLEAR(queryResults);
++    result.queryResults = &queryResults;
++
++    int ret = mAdaptor->queryAndConvertStats(mIspAdaptHandle, &inputParams, &result);
++    CheckError(ret != OK, ret, "%s, Faield to query and convert statistics", __func__);
++
++    // Decode DVS statistics
++    if (queryResults.dvs_stats) {
++        if (CameraDump::isDumpTypeEnable(DUMP_PSYS_DECODED_STAT) && hwStatsData != nullptr) {
++            BinParam_t bParam;
++            bParam.bType = BIN_TYPE_GENERAL;
++            bParam.mType = M_PSYS;
++            bParam.sequence = statsBuffer->getSequence();
++            bParam.gParam.appendix = "dvs_p2p_decoded_stats";
++            CameraDump::dumpBinary(mCameraId, hwStatsData->data, hwStatsData->size, &bParam);
++        }
++
++        if (result.dvsStats) {
++            DvsStatistics dvsStatsStorage(result.dvsStats, statsBuffer->getSequence());
++            aiqResultStorage->updateDvsStatistics(dvsStatsStorage);
++        } else {
++            LOGW("Failed to get GDC kernel setting, DVS stats not decoded");
++        }
++    }
++
++    if (queryResults.rgbs_grid && queryResults.af_grid) {
++        int exposureNum = PlatformData::getExposureNum(mCameraId, false);
++        AiqStatistics *aiqStatistics = aiqResultStorage->acquireAiqStatistics();
++
++        if (*(result.rgbsGrid)) {
++            dumpRgbsStats(*(result.rgbsGrid),
++                          statsBuffer->getSequence(), feedback->mAeResults.num_exposures);
++        }
++        if (result.afGrid) {
++            dumpAfStats(result.afGrid, statsBuffer->getSequence());
++        }
++
++        aiqStatistics->saveRgbsGridData(result.rgbsGrid, exposureNum);
++        aiqStatistics->saveAfGridData(result.afGrid);
++        aiqStatistics->mSequence = sequence;
++        aiqStatistics->mTimestamp = TIMEVAL2USECS(statsBuffer->getTimestamp());
++        aiqStatistics->mTuningMode = tuningMode;
++        aiqResultStorage->updateAiqStatistics(sequence);
++    }
++
++    return OK;
++}
++
++void IspParamAdaptor::updateKernelToggles(ia_isp_bxt_program_group programGroup) {
++
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_KERNEL_TOGGLE)) return;
++
++    const char* ENABLED_KERNELS = "/tmp/enabledKernels";
++    const char* DISABLED_KERNELS = "/tmp/disabledKernels";
++    const int FLIE_CONT_MAX_LENGTH = 1024;
++    ia_isp_bxt_run_kernels_t* curKernel = programGroup.run_kernels;
++    char enabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
++    char disabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
++
++    int enLen = CameraUtils::getFileContent(ENABLED_KERNELS, enabledKernels, FLIE_CONT_MAX_LENGTH - 1);
++    int disLen = CameraUtils::getFileContent(DISABLED_KERNELS, disabledKernels, FLIE_CONT_MAX_LENGTH - 1);
++
++    if (enLen == 0 && disLen == 0) {
++        LOG2("%s: no explicit kernel toggle.", __func__);
++        return;
++    }
++
++    LOG2("%s: enabled kernels: %s, disabled kernels %s", __func__,
++        enabledKernels, disabledKernels);
++
++    for (unsigned int i = 0; i < programGroup.kernel_count; i++) {
++
++        std::string curKernelUUID = std::to_string(curKernel->kernel_uuid);
++
++        LOG2("%s: checking kernel %s", __func__, curKernelUUID.c_str());
++
++        if (strstr(enabledKernels, curKernelUUID.c_str()) != nullptr) {
++            curKernel->enable = 1;
++            LOG2("%s: kernel %d is explicitly enabled", __func__,
++                curKernel->kernel_uuid);
++        }
++
++        if (strstr(disabledKernels, curKernelUUID.c_str()) != nullptr) {
++            curKernel->enable = 0;
++            LOG2("%s: kernel %d is explicitly disabled", __func__,
++                curKernel->kernel_uuid);
++        }
++
++        curKernel ++;
++    }
++}
++
++/*
++ * PAL output buffer is a reference data for next output buffer,
++ * but currently a ring buffer is used in HAL, which caused logic mismatching issue.
++ * So temporarily copy lastest call info and BNLM_3_2 into PAL output buffer.
++ */
++void IspParamAdaptor::updatePalDataForVideoPipe(ia_binary_data dest)
++{
++    if (mLastPalDataForVideoPipe.data == nullptr || mLastPalDataForVideoPipe.size == 0)
++        return;
++
++    char* src = static_cast<char*>(mLastPalDataForVideoPipe.data);
++    ia_pal_record_header *header_call_info = nullptr;
++    ia_pal_record_header *header_bnlm_3_2 = nullptr;
++    ia_pal_record_header *header = nullptr;
++    if (mBNLM32Offset >= 0 && mCallInfoOffset >= 0) {
++        header = reinterpret_cast<ia_pal_record_header*>(src + mCallInfoOffset);
++        if (header->uuid == ia_pal_uuid_isp_call_info) {
++            header_call_info = header;
++        }
++        header = reinterpret_cast<ia_pal_record_header*>(src + mBNLM32Offset);
++        if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
++            header_bnlm_3_2 = header;
++        }
++    } else {
++        uint32_t offset = 0;
++        // find call_info and bnlm_3_2 data in saved PAL buffer
++        while (offset < mLastPalDataForVideoPipe.size) {
++            ia_pal_record_header *header = reinterpret_cast<ia_pal_record_header*>(src + offset);
++            // check if header is valid or not
++            if (header->uuid == 0 || header->size == 0) {
++                LOGW("%s, source header info isn't correct", __func__);
++                return;
++            }
++
++            if (header->uuid == ia_pal_uuid_isp_call_info) {
++                header_call_info = header;
++                mCallInfoOffset = offset;
++            } else if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
++                header_bnlm_3_2 = header;
++                mBNLM32Offset = offset;
++            }
++            offset += header->size;
++        }
++        LOG2("call info offset %d, bnlm_3_2 offset %d", mCallInfoOffset, mBNLM32Offset);
++    }
++
++    // return if not all data is found
++    if (header_call_info == nullptr || header_bnlm_3_2 == nullptr) {
++        LOG2("%s, call info or bnlm_3_2 isn't found", __func__);
++        return;
++    }
++
++    char* destData = static_cast<char*>(dest.data);
++    // update call_info and bnlm_3_2 data
++    if (mBNLM32Offset >= 0 && mCallInfoOffset >= 0) {
++        header = reinterpret_cast<ia_pal_record_header*>(destData + mCallInfoOffset);
++        if (header->uuid == ia_pal_uuid_isp_call_info) {
++            MEMCPY_S(header, header->size, header_call_info, header_call_info->size);
++        }
++        header = reinterpret_cast<ia_pal_record_header*>(destData + mBNLM32Offset);
++        if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
++            MEMCPY_S(header, header->size, header_bnlm_3_2, header_bnlm_3_2->size);
++        }
++    }
++
++    LOG2("%s, call info and bnlm_3_2 kernels have been updated", __func__);
++}
++
++/**
++ * runIspAdapt
++ * Convert the results of the 3A algorithms and parse with P2P.
++ */
++int IspParamAdaptor::runIspAdapt(const IspSettings* ispSettings, long settingSequence, int32_t streamId)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    AutoMutex l(mIspAdaptorLock);
++    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED, INVALID_OPERATION, "%s, wrong state %d",
++          __func__, mIspAdaptorState);
++
++    bool forceUpdate = false;
++    IspParameter *ipuParam = nullptr;
++    {
++        AutoMutex l(mIpuParamLock);
++
++        int updateIndex = -1;
++        // Check if the given sequence is already there, if so we need update it instead of
++        // updating mCurIspParamIndex and using next buffer.
++        for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
++            if (mIspParameters[i].sequence == settingSequence) {
++                updateIndex = i;
++                break;
++            }
++        }
++
++        if (updateIndex == -1) {
++            mCurIspParamIndex++;
++            mCurIspParamIndex = mCurIspParamIndex % ISP_PARAM_QUEUE_SIZE;
++            updateIndex = mCurIspParamIndex;
++            forceUpdate = true;
++            // Only Store the new sequence
++            LOG2("%s, the sequence list size: %zu", __func__, mSequenceList.size());
++            if (mSequenceList.size() >= PlatformData::getMaxRawDataNum(mCameraId)) {
++                mSequenceList.pop_front();
++            }
++            mSequenceList.push_back(settingSequence);
++            mIspParameters[updateIndex].dataAvailableMap.clear();
++        }
++
++        ipuParam = &(mIspParameters[updateIndex]);
++        ipuParam->sequence = -1;
++        LOG2("%s, current isp parameter index:%d, update index:%d, for sequence: %ld, stream %d",
++              __func__, mCurIspParamIndex, updateIndex, settingSequence, streamId);
++    }
++    CheckError(!ipuParam, UNKNOWN_ERROR, "%s, Failed to get memory for ipuParam", __func__);
++
++    ia_isp_bxt_gdc_limits* mbrData = nullptr;
++    ia_binary_data curIpuParam = {};
++    for (auto& binaryMap : ipuParam->streamIdToDataMap) {
++        if (!(streamId == -1 || binaryMap.first == streamId))
++            continue;
++        curIpuParam = binaryMap.second;
++        curIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
++        if (mStreamIdToMbrDataMap.find(binaryMap.first) != mStreamIdToMbrDataMap.end())
++            mbrData = &(mStreamIdToMbrDataMap[binaryMap.first]);
++
++        // Update some PAL data to lastest PAL result
++        if (binaryMap.first == VIDEO_STREAM_ID) {
++            updatePalDataForVideoPipe(binaryMap.second);
++        }
++        int ret = runIspAdaptL(mStreamIdToProgramGroupMap[binaryMap.first], mbrData,
++                               ispSettings, settingSequence, &curIpuParam, forceUpdate);
++
++        CheckError(ret != OK, ret, "run isp adaptor error for streamId %d, sequence: %ld",
++                               binaryMap.first, settingSequence);
++        {
++            AutoMutex l(mIpuParamLock);
++            binaryMap.second.size = curIpuParam.size;
++            ipuParam->dataAvailableMap[binaryMap.first] = true;
++            ipuParam->sequence = settingSequence;
++
++            if (binaryMap.first == VIDEO_STREAM_ID) {
++                mLastPalDataForVideoPipe = binaryMap.second;
++            }
++        }
++    }
++
++    return OK;
++}
++
++ia_binary_data* IspParamAdaptor::getIpuParameter(long sequence, int streamId)
++{
++    AutoMutex l(mIpuParamLock);
++
++    /* For old version.
++     * We should get the ipu param according to streamId and
++     * sequenceId when there are multi-streams in one pipe.
++     *
++     * This is only for getting the default ipu parameter
++     */
++    if (sequence == -1 && streamId == -1) {
++        return &(mIspParameters[mCurIspParamIndex].streamIdToDataMap.begin()->second);
++    }
++
++    ia_binary_data* ipuParam = nullptr;
++    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
++        IspParameter& param = mIspParameters[i];
++        if (param.sequence == sequence &&
++            param.streamIdToDataMap.find(streamId) != param.streamIdToDataMap.end() &&
++            param.dataAvailableMap.find(streamId) != param.dataAvailableMap.end()) {
++            ipuParam = &param.streamIdToDataMap[streamId];
++            break;
++        }
++    }
++
++    if (!ipuParam) {
++        LOG1("Failed to find ISP parameter for stream id %d, sequence: %ld", streamId, sequence);
++    }
++
++    return ipuParam;
++}
++
++int IspParamAdaptor::getPalOutputDataSize(const ia_isp_bxt_program_group* programGroup)
++{
++    CheckError(programGroup == nullptr, 0, "Request programGroup is nullptr");
++    return mAdaptor->getPalDataSize(const_cast<ia_isp_bxt_program_group*>(programGroup));
++}
++
++/*
++ * Allocate memory for mIspParameters
++ * TODO: Let PAL to expose the max ia_binary_data buffer size which
++ * come from mIspAdaptHandle->ia_pal.m_output_isp_parameters_size
++ */
++int IspParamAdaptor::allocateIspParamBuffers()
++{
++    releaseIspParamBuffers();
++
++    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
++        for (auto & pgMap : mStreamIdToProgramGroupMap) {
++            ia_binary_data ispParam;
++            int size = mStreamIdToPGOutSizeMap[pgMap.first];
++            CLEAR(ispParam);
++            ispParam.size = size;
++            ispParam.data = mAdaptor->allocatePalBuffer(pgMap.first, i, size);
++            CheckError(ispParam.data == nullptr, NO_MEMORY, "Faile to calloc the memory for isp parameter");
++            mIspParameters[i].streamIdToDataMap[pgMap.first] = ispParam;
++        }
++        mIspParameters[i].sequence = -1;
++        mIspParameters[i].dataAvailableMap.clear();
++    }
++
++    return OK;
++}
++
++void IspParamAdaptor::releaseIspParamBuffers()
++{
++    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
++        for (auto& binaryMap : mIspParameters[i].streamIdToDataMap)
++            mAdaptor->freePalBuffer(binaryMap.second.data);
++
++        mIspParameters[i].sequence = -1;
++        mIspParameters[i].streamIdToDataMap.clear();
++        mIspParameters[i].dataAvailableMap.clear();
++    }
++}
++
++int IspParamAdaptor::runIspAdaptL(ia_isp_bxt_program_group programGroup,
++                                  ia_isp_bxt_gdc_limits *mbrData,
++                                  const IspSettings* ispSettings, long settingSequence,
++                                  ia_binary_data *ipuParam, bool forceUpdate)
++{
++    PERF_CAMERA_ATRACE_IMAGING();
++    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult(settingSequence));
++    if (aiqResults == nullptr) {
++        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, settingSequence);
++        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult());
++        CheckError((aiqResults == nullptr), INVALID_OPERATION, "Cannot find available aiq result.");
++    }
++    CheckError((aiqResults->mSaResults.width * aiqResults->mSaResults.height == 0),
++            INVALID_OPERATION, "No invalid aiq result needed to run Generic AIC");
++
++    LOG2("%s: device type: %d", __func__, mPgParamType);
++
++    ia_isp_bxt_input_params_v2 inputParams;
++    ia_view_config_t viewConfig;
++    CLEAR(inputParams);
++    CLEAR(viewConfig);
++
++    // LOCAL_TONEMAP_S
++    bool hasLtm = PlatformData::isLtmEnabled(mCameraId);
++
++    if (hasLtm) {
++        size_t ltmLag = PlatformData::getLtmGainLag(mCameraId);
++        long ltmSequence = settingSequence;
++
++        // Consider there may be skipped frames, so according to the gain lag and current
++        // sequence to find the actual ltm sequence in history list.
++        if (mSequenceList.size() > ltmLag) {
++            size_t index = 0;
++            for(auto iter = mSequenceList.begin(); iter != mSequenceList.end(); iter++) {
++                if (*iter == settingSequence && index >= ltmLag) {
++                    ltmSequence = *(std::prev(iter, ltmLag));
++                    break;
++                }
++                index++;
++            }
++        }
++        ltm_result_t* ltmResult = const_cast<ltm_result_t*>(AiqResultStorage::getInstance(mCameraId)->getLtmResult(ltmSequence));
++        if (ltmResult != nullptr) {
++            LOG2("%s: frame sequence %ld, ltm sequence %ld, actual sequence: %ld",
++                    __func__, settingSequence, ltmSequence, ltmResult->sequence);
++            inputParams.ltm_results = &ltmResult->ltmResults;
++            inputParams.ltm_drc_params = &ltmResult->ltmDrcParams;
++        }
++    }
++    // LOCAL_TONEMAP_E
++
++    // update metadata of runnning kernels
++    if (mPgParamType == PG_PARAM_PSYS_ISA) {
++        for (unsigned int i=0; i<programGroup.kernel_count; i++) {
++            switch (programGroup.run_kernels[i].kernel_uuid) {
++            case ia_pal_uuid_isp_tnr5_21:
++            case ia_pal_uuid_isp_tnr5_22:
++            case ia_pal_uuid_isp_tnr5_25:
++                programGroup.run_kernels[i].metadata[0] = aiqResults->mSequence;
++                LOG2("ia_pal_uuid_isp_tnr5_2x frame count = %d", programGroup.run_kernels[i].metadata[0]);
++                break;
++            case ia_pal_uuid_isp_bxt_ofa_dp:
++            case ia_pal_uuid_isp_bxt_ofa_mp:
++            case ia_pal_uuid_isp_bxt_ofa_ppp:
++                programGroup.run_kernels[i].metadata[2] = aiqResults->mAiqParam.flipMode;
++                LOG2("%s: flip mode set to %d", __func__, programGroup.run_kernels[i].metadata[2]);
++
++                programGroup.run_kernels[i].metadata[3] = aiqResults->mAiqParam.yuvColorRangeMode;
++                LOG2("ofa yuv color range mode %d", programGroup.run_kernels[i].metadata[3]);
++                break;
++            }
++        }
++    }
++
++    // Enable or disable kernels according to environment variables for debug purpose.
++    updateKernelToggles(programGroup);
++
++    inputParams.timestamp = aiqResults->mTimestamp;
++    inputParams.program_group = &programGroup;
++    inputParams.sensor_frame_params = &mFrameParam;
++
++    inputParams.ae_results = &aiqResults->mAeResults;
++    inputParams.gbce_results = &aiqResults->mGbceResults;
++    inputParams.awb_results = &aiqResults->mAwbResults;
++    inputParams.pa_results = &aiqResults->mPaResults;
++    inputParams.sa_results = &aiqResults->mSaResults;
++    inputParams.weight_grid = aiqResults->mAeResults.weight_grid;
++
++    if (aiqResults->mCustomControls.count > 0) {
++        inputParams.custom_controls = &aiqResults->mCustomControls;
++    }
++
++    if (ispSettings) {
++        inputParams.nr_setting = ispSettings->nrSetting;
++        inputParams.ee_setting = ispSettings->eeSetting;
++        LOG2("%s: ISP NR setting, level: %d, strength: %d",
++                __func__, (int)ispSettings->nrSetting.feature_level,
++                (int)ispSettings->nrSetting.strength);
++        inputParams.effects = ispSettings->effects;
++        inputParams.manual_brightness = ispSettings->manualSettings.manualBrightness;
++        inputParams.manual_contrast = ispSettings->manualSettings.manualContrast;
++        inputParams.manual_hue = ispSettings->manualSettings.manualHue;
++        inputParams.manual_saturation = ispSettings->manualSettings.manualSaturation;
++        LOG2("%s: ISP EE setting, level: %d, strength: %d",
++                __func__, ispSettings->eeSetting.feature_level,
++                ispSettings->eeSetting.strength);
++        // INTEL_DVS_S
++        if (ispSettings->videoStabilization) {
++            int dvsType = PlatformData::getDVSType(mCameraId);
++            LOG2("%s: ISP Video Stabilization Mode Enable, dvs type %d", __func__, dvsType);
++            DvsResult* dvsResult = const_cast<DvsResult*>(AiqResultStorage::getInstance(mCameraId)->getDvsResult());
++            if (dvsType == MORPH_TABLE) {
++                inputParams.dvs_morph_table = (dvsResult == nullptr) ? nullptr : &dvsResult->mMorphTable;
++            } else if (dvsType == IMG_TRANS) {
++                inputParams.gdc_transformation = (dvsResult == nullptr) ? nullptr : &dvsResult->mTransformation;
++            }
++        }
++        // INTEL_DVS_E
++
++        inputParams.pal_override = ispSettings->palOverride;
++    }
++
++    if (CameraUtils::isUllPsysPipe(mTuningMode)) {
++        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
++        // The situation that all DG passed to ISP, not sensor.
++        if (!PlatformData::isUsingSensorDigitalGain(mCameraId)) {
++            inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
++        }
++        // Fine-tune DG passed to ISP if partial ISP DG is needed.
++        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
++            inputParams.manual_digital_gain = PlatformData::getIspDigitalGain(mCameraId,
++                                aiqResults->mAeResults.exposures[0].exposure->digital_gain);
++        }
++
++        LOG3A("%s: set digital gain for ULL pipe: %f", __func__, inputParams.manual_digital_gain);
++    } else if (CameraUtils::isMultiExposureCase(mTuningMode) &&
++               PlatformData::getSensorGainType(mCameraId) == ISP_DG_AND_SENSOR_DIRECT_AG) {
++        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
++
++        LOG3A("%s: all digital gain is passed to ISP, DG(%ld): %f",
++              __func__, aiqResults->mSequence, aiqResults->mAeResults.exposures[0].exposure->digital_gain);
++        inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
++    }
++
++    if (forceUpdate) {
++        inputParams.sa_results->lsc_update = true;
++    }
++
++    int ret = OK;
++    {
++        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
++        ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, ipuParam);
++    }
++    CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
++
++    dumpIspParameter(aiqResults->mSequence, *ipuParam);
++
++    return OK;
++}
++
++void IspParamAdaptor::dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence)
++{
++    if (!afGrid) return;
++
++    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT))
++        return;
++    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))
++        return;
++
++    BinParam_t bParam;
++    bParam.bType = BIN_TYPE_STATISTIC;
++    bParam.mType = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
++    bParam.sequence = sequence;
++    bParam.sParam.gridWidth = afGrid->grid_width;
++    bParam.sParam.gridHeight = afGrid->grid_height;
++    bParam.sParam.appendix = "af_stats_filter_response_1";
++    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_1,
++                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
++    bParam.sParam.appendix = "af_stats_filter_response_2";
++    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_2,
++                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
++}
++
++void IspParamAdaptor::dumpRgbsStats(ia_aiq_rgbs_grid *rgbsGrid, long sequence, unsigned int num)
++{
++    if (rgbsGrid == nullptr) return;
++
++    if (Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
++        for (unsigned int i = 0; i < num; i++ ) {
++            rgbs_grid_block *rgbsPtr = rgbsGrid[i].blocks_ptr;
++            int size = rgbsGrid[i].grid_width * rgbsGrid[i].grid_height;
++            // Print out some value to check if it's reasonable
++            for (int j = 100; j < 105 && j < size; j++) {
++                LOG3A("RGBS: [%d]:%d, %d, %d, %d, %d", j, rgbsPtr[j].avg_b, rgbsPtr[j].avg_gb,
++                            rgbsPtr[j].avg_gr, rgbsPtr[j].avg_r, rgbsPtr[j].sat);
++            }
++
++            // Only print last Rgbs Stats's y_mean for validation purpose
++            if (i < num - 1) continue;
++
++            int sumLuma = 0;
++            for (int j = 0; j < size; j++) {
++                sumLuma += (rgbsPtr[j].avg_b + rgbsPtr[j].avg_r + (rgbsPtr[j].avg_gb + rgbsPtr[j].avg_gr) / 2) / 3;
++            }
++            LOG3A("RGB stat grid[%d] %dx%d, y_mean %d", i, rgbsGrid[i].grid_width, rgbsGrid[i].grid_height, sumLuma/size);
++        }
++    }
++
++    if ((mPgParamType == PG_PARAM_PSYS_ISA && CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT)) ||
++        (mPgParamType == PG_PARAM_ISYS && CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))) {
++        char name[30];
++        BinParam_t bParam;
++        bParam.bType    = BIN_TYPE_STATISTIC;
++        bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
++        bParam.sequence = sequence;
++        for (unsigned int i = 0; i < num; i++ ) {
++            CLEAR(name);
++            snprintf(name, sizeof(name), "%s_stats_%u_%u",
++                    mPgParamType == PG_PARAM_PSYS_ISA ? "hdr_rgbs" : "rgbs", num, i);
++            bParam.sParam.gridWidth  = rgbsGrid[i].grid_width;
++            bParam.sParam.gridHeight = rgbsGrid[i].grid_height;
++            bParam.sParam.appendix   = name;
++            if (rgbsGrid[i].grid_width != 0 && rgbsGrid[i].grid_height != 0) {
++                CameraDump::dumpBinary(mCameraId, rgbsGrid[i].blocks_ptr,
++                                       rgbsGrid[i].grid_width * rgbsGrid[i].grid_height * sizeof(rgbs_grid_block),
++                                       &bParam);
++            }
++        }
++    }
++}
++
++void IspParamAdaptor::dumpIspParameter(long sequence, ia_binary_data ipuParam) {
++    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_PAL)) return;
++    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_PAL)) return;
++
++    BinParam_t bParam;
++    bParam.bType    = BIN_TYPE_GENERAL;
++    bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
++    bParam.sequence = sequence;
++    bParam.gParam.appendix = "pal";
++    CameraDump::dumpBinary(mCameraId, ipuParam.data, ipuParam.size, &bParam);
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
+new file mode 100644
+index 000000000000..f621cea2d798
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
+@@ -0,0 +1,153 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <memory>
++#include <vector>
++#include <list>
++#include <unordered_map>
++
++#include "iutils/Errors.h"
++#include "CameraBuffer.h"
++#include "CameraTypes.h"
++
++#include "NodeInfo.h"
++
++extern "C" {
++#ifndef CAL_BUILD
++#include "ia_camera/ipu_process_group_wrapper.h"
++#endif
++}
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
++#else
++#include "modules/algowrapper/IntelIspParamAdaptor.h"
++#endif
++
++#include "ia_aiq_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_isp_bxt_statistics_types.h"
++#include "ia_isp_bxt.h"
++#include "ia_bcomp_types.h"
++#include "gc/IGraphConfigManager.h"
++#include "IspSettings.h"
++
++namespace icamera {
++
++enum PgParamType {
++    PG_PARAM_VIDEO = 0,
++    PG_PARAM_PSYS_ISA,
++    PG_PARAM_ISYS,
++    PG_PARAM_STILL_4k,
++    PG_PARAM_STILL_8m
++};
++
++/**
++ * This class is for isp parameter converting including:
++ * 1. Convert hw statistics to aiq statistics
++ * 2. Convert aiq result to isa config
++ * 3. Run isp config
++ * 4. Provide p2p handle
++ */
++class IspParamAdaptor {
++public:
++    IspParamAdaptor(int cameraId, PgParamType type);
++    virtual ~IspParamAdaptor();
++
++    int init();
++    int deinit();
++    int configure(const stream_t &stream, ConfigMode configMode, TuningMode tuningMode);
++
++    int getParameters(Parameters& param);
++    int decodeStatsData(TuningMode tuningMode,
++                        std::shared_ptr<CameraBuffer> statsBuffer,
++                        std::shared_ptr<IGraphConfig> graphConfig = nullptr);
++
++    int runIspAdapt(const IspSettings* ispSettings, long settingSequence = -1, int32_t streamId = -1);
++    //Get ISP param from mult-stream ISP param adaptation
++    ia_binary_data* getIpuParameter(long sequence = -1, int streamId = -1);
++    int getPalOutputDataSize(const ia_isp_bxt_program_group* programGroup);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(IspParamAdaptor);
++
++    int initProgramGroupForAllStreams(ConfigMode configMode);
++    int postConfigure(int width, int height, ia_binary_data *ipuParam);
++    void initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type);
++
++    int initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode);
++    void deinitIspAdaptHandle();
++
++    void updatePalDataForVideoPipe(ia_binary_data dest);
++    int runIspAdaptL(ia_isp_bxt_program_group programGroup, ia_isp_bxt_gdc_limits* mbrData,
++                     const IspSettings* ispSettings, long settingSequence,
++                     ia_binary_data *ipuParam, bool forceUpdate = false);
++
++    //Allocate memory for mIspParameters
++    int allocateIspParamBuffers();
++    //Release memory for mIspParameters
++    void releaseIspParamBuffers();
++
++    // Dumping methods for debugging purposes.
++    void dumpRgbsStats(ia_aiq_rgbs_grid *rgbs_grid, long sequence, unsigned int num = 1);
++    void dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence);
++    void dumpIspParameter(long sequence, ia_binary_data ipuParam);
++    // Enable or disable kernels according to environment variables for debug purpose.
++    void updateKernelToggles(ia_isp_bxt_program_group programGroup);
++
++ private:
++    enum IspAdaptorState {
++        ISP_ADAPTOR_NOT_INIT,
++        ISP_ADAPTOR_INIT,
++        ISP_ADAPTOR_CONFIGURED
++    } mIspAdaptorState;
++
++    int mCameraId;
++    PgParamType mPgParamType;
++    TuningMode mTuningMode;
++
++    ia_isp_bxt   *mIspAdaptHandle;
++    ia_bcomp_results *mBCompResults;
++
++    //Guard for IspParamAdaptor public API
++    Mutex mIspAdaptorLock;
++    std::map<int, ia_isp_bxt_program_group> mStreamIdToProgramGroupMap;
++    std::map<int, int> mStreamIdToPGOutSizeMap;
++    std::map<int, ia_isp_bxt_gdc_limits> mStreamIdToMbrDataMap;
++    ia_aiq_frame_params mFrameParam;
++    static const int ISP_PARAM_QUEUE_SIZE = 10;
++    int mCurIspParamIndex;
++    struct IspParameter {
++        long sequence; // frame sequence id
++        std::map<int, ia_binary_data> streamIdToDataMap; // map from stream id to ia_binary_data
++        std::unordered_map<int32_t, bool> dataAvailableMap;
++    } mIspParameters[ISP_PARAM_QUEUE_SIZE];
++    ia_binary_data mLastPalDataForVideoPipe;
++    int mCallInfoOffset;
++    int mBNLM32Offset;
++    //Guard lock for ipu parameter
++    Mutex mIpuParamLock;
++
++    IGraphConfigManager *mGCM;
++    std::list<long> mSequenceList;  // Store the sequence history in IspParamAdaptor
++    std::unique_ptr<IntelIspParamAdaptor> mAdaptor;
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/IspSettings.h b/camera/hal/intel/ipu6/src/core/IspSettings.h
+new file mode 100644
+index 000000000000..803c5bc17c86
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/IspSettings.h
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2018-2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_isp_types.h"
++#include "iutils/Utils.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++struct IspImageEnhancement{
++    char manualSharpness;
++    char manualBrightness;
++    char manualContrast;
++    char manualHue;
++    char manualSaturation;
++};
++
++struct IspSettings {
++    ia_isp_feature_setting nrSetting;
++    ia_isp_feature_setting eeSetting;
++    ia_isp_effect effects;
++    bool videoStabilization;
++    IspImageEnhancement manualSettings;
++    ia_binary_data* palOverride;
++    float zoom;
++    camera_mount_type_t sensorMountType;
++    IspSettings() { CLEAR(*this); zoom = 1.0f; }
++};
++
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/LensHw.cpp b/camera/hal/intel/ipu6/src/core/LensHw.cpp
+new file mode 100644
+index 000000000000..a2588e25a5f2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/LensHw.cpp
+@@ -0,0 +1,159 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "LensHw"
++
++#include "LensHw.h"
++#include "iutils/CameraLog.h"
++#include "V4l2DeviceFactory.h"
++#include "PlatformData.h"
++
++namespace icamera {
++
++LensHw::LensHw(int cameraId):
++    mCameraId(cameraId),
++    mLensSubdev(nullptr),
++    mLastLensPosition(0),
++    mLensMovementStartTime(0)
++{
++    LOG1("@%s", __func__);
++}
++
++LensHw::~LensHw() {
++    LOG1("@%s", __func__);
++}
++
++int LensHw::init()
++{
++    LOG1("@%s", __func__);
++    std::string lensName = PlatformData::getLensName(mCameraId);
++    if (lensName.empty()) {
++        LOG1("%s No Lens for camera id:%d ", __func__, mCameraId);
++        return OK;
++    }
++
++    LOG1("%s camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
++    std::string subDevName;
++    CameraUtils::getSubDeviceName(lensName.c_str(), subDevName);
++    if (!subDevName.empty()) {
++        mLensSubdev = V4l2DeviceFactory::getSubDev(mCameraId, subDevName);
++        mLensName=lensName;
++        return OK;
++    }
++
++    LOGW("%s Fail to init lens for camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
++    return OK;
++}
++
++/**
++ * focus with absolute value
++ */
++int LensHw::setFocusPosition(int position)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    mLastLensPosition = position;
++
++    struct timespec t = {};
++    clock_gettime(CLOCK_MONOTONIC, &t);
++
++    mLensMovementStartTime = ((long)t.tv_sec) * 1000000 + (long)t.tv_nsec / 1000;
++
++    LOG2("@%s: %d, time %lld", __func__, position, mLensMovementStartTime);
++    return mLensSubdev->SetControl(V4L2_CID_FOCUS_ABSOLUTE, position);
++}
++
++/**
++ * focus with  relative value
++ */
++int LensHw::setFocusStep(int steps)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->SetControl(V4L2_CID_FOCUS_RELATIVE, steps);
++}
++
++int LensHw::getFocusPosition(int &position)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->GetControl(V4L2_CID_FOCUS_ABSOLUTE, &position);
++}
++
++int LensHw::getFocusStatus(int & /*status*/)
++{
++    LOG2("@%s", __func__);
++    return OK;
++}
++
++int LensHw::startAutoFocus(void)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_START, 1);
++}
++
++int LensHw::stopAutoFocus(void)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_STOP, 0);
++}
++
++int LensHw::getAutoFocusStatus(int &status)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_STATUS,
++                                    reinterpret_cast<int*>(&status));
++}
++
++int LensHw::setAutoFocusRange(int value)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_RANGE, value);
++}
++
++int LensHw::getAutoFocusRange(int &value)
++{
++    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
++    LOG2("@%s", __func__);
++    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_RANGE, &value);
++}
++
++const char* LensHw::getLensName(void)
++{
++    return mLensName.c_str();
++}
++
++/**
++ * getLatestPosition
++ *
++ * returns the latest position commanded to the lens actuator and when this
++ * was issued.
++ * This method does not query the driver.
++ *
++ * \param: lensPosition[OUT]: lens position last applied
++ * \param: time[OUT]: time in micro seconds when the lens move command was sent.
++ */
++int LensHw::getLatestPosition(int& lensPosition, unsigned long long& time)
++{
++    lensPosition = mLastLensPosition;
++    time = mLensMovementStartTime;
++    return OK;
++}
++
++}   // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/LensHw.h b/camera/hal/intel/ipu6/src/core/LensHw.h
+new file mode 100644
+index 000000000000..997cc13dcf76
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/LensHw.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <string>
++
++namespace icamera {
++
++typedef ::cros::V4L2Subdevice V4L2Subdevice;
++
++/**
++ * \class LensHw
++ * This class adds the methods that are needed
++ * to drive the camera lens using v4l2 commands and custom ioctl.
++ *
++ */
++class LensHw {
++
++public:
++    LensHw(int cameraId);
++    ~LensHw();
++
++    int init();
++
++    const char* getLensName(void);
++
++    int setFocusPosition(int position);
++    int setFocusStep(int steps);
++    int getFocusPosition(int &position);
++    int getFocusStatus(int &status);
++    int startAutoFocus(void);
++    int stopAutoFocus(void);
++    int getAutoFocusStatus(int &status);
++    int setAutoFocusRange(int value);
++    int getAutoFocusRange(int &value);
++    int getLatestPosition(int& lensPosition, unsigned long long& time);
++    bool isLensSubdevAvailable() { return (mLensSubdev != nullptr); }
++
++private:
++    int mCameraId;
++    V4L2Subdevice* mLensSubdev;
++    std::string mLensName;
++    int mLastLensPosition;
++    unsigned long long mLensMovementStartTime; /*!< In microseconds */
++};  // class LensHW
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
+new file mode 100644
+index 000000000000..7640f9a041ea
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
+@@ -0,0 +1,903 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PSysProcessor"
++
++#include <utility>
++
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/SwImageConverter.h"
++
++#include "PlatformData.h"
++#include "3a/AiqResultStorage.h"
++#include "ParameterGenerator.h"
++
++#include "PSysProcessor.h"
++
++/*
++ * The sof event time margin is a tunning value
++ * it's based on sensor vblank, psys iterating time
++ * and thread scheduling
++ */
++#define SOF_EVENT_MARGIN (5000000)  // 5ms
++#define SOF_EVENT_MAX_MARGIN (60000000)  // 60ms
++
++using std::shared_ptr;
++using std::unique_ptr;
++
++namespace icamera {
++PSysProcessor::PSysProcessor(int cameraId, ParameterGenerator *pGenerator) :
++        mCameraId(cameraId),
++        mParameterGenerator(pGenerator),
++        mCurConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
++        mTuningMode(TUNING_MODE_MAX),
++        mRawPort(INVALID_PORT),
++        mSofSequence(-1),
++        mOpaqueRawPort(INVALID_PORT),
++        mStatus(PIPELINE_UNCREATED)
++{
++    LOG1("@%s camera id:%d", __func__, mCameraId);
++
++    mProcessThread = new ProcessThread(this);
++    CLEAR(mSofTimestamp);
++}
++
++PSysProcessor::~PSysProcessor()
++{
++    LOG1("@%s ", __func__);
++
++    mProcessThread->join();
++    delete mProcessThread;
++}
++
++int PSysProcessor::configure(const std::vector<ConfigMode>& configModes)
++{
++    //Create PSysDAGs actually
++    LOG1("@%s ", __func__);
++    CheckError(mStatus == PIPELINE_CREATED, -1, "@%s mStatus is in wrong status: PIPELINE_CREATED", __func__);
++    mConfigModes = configModes;
++    mSofSequence = -1;
++
++    std::map<Port, stream_t> outputFrameInfo;
++    // Check if it's required to output raw image from ISYS
++    for (auto &outFrameInfo : mOutputFrameInfo) {
++        if (outFrameInfo.second.format == V4L2_PIX_FMT_SGRBG12) {
++            mRawPort = outFrameInfo.first;
++        } else if (outFrameInfo.second.usage == CAMERA_STREAM_OPAQUE_RAW) {
++            mOpaqueRawPort = outFrameInfo.first;
++        } else {
++            outputFrameInfo[outFrameInfo.first] = outFrameInfo.second;
++        }
++    }
++
++    int ret = OK;
++    //Create PSysDAG according to real configure mode
++    for (auto &cfg : mConfigModes) {
++        if (mPSysDAGs.find(cfg) != mPSysDAGs.end()) {
++            continue;
++        }
++
++        TuningConfig tuningConfig;
++        ret = PlatformData::getTuningConfigByConfigMode(mCameraId, cfg, tuningConfig);
++        CheckError(ret != OK, ret, "%s: can't get config for mode %d", __func__, cfg);
++
++        LOG1("Create PSysDAG for ConfigMode %d", cfg);
++        unique_ptr<PSysDAG> pSysDAG = unique_ptr<PSysDAG>(new PSysDAG(mCameraId, this));
++
++        pSysDAG->setFrameInfo(mInputFrameInfo, outputFrameInfo);
++        ret = pSysDAG->configure(tuningConfig.configMode, tuningConfig.tuningMode);
++        CheckError(ret != OK, ret, "@%s configure psys dag failed:%d", __func__, ret);
++
++        mPSysDAGs[tuningConfig.configMode] = std::move(pSysDAG);
++
++        //Update default active config mode
++        mCurConfigMode = tuningConfig.configMode;
++        mTuningMode = tuningConfig.tuningMode;
++    }
++
++    if (ret == OK) mStatus = PIPELINE_CREATED;
++    return ret;
++
++}
++
++int PSysProcessor::registerUserOutputBufs(Port port, const shared_ptr<CameraBuffer> &camBuffer)
++{
++    for (auto &psysDAGPair : mPSysDAGs) {
++        if (!psysDAGPair.second) continue;
++        int ret = psysDAGPair.second->registerUserOutputBufs(port, camBuffer);
++        CheckError(ret != OK, BAD_VALUE, "%s, register user buffer failed, ret: %d", __func__, ret);
++    }
++
++    return OK;
++}
++
++int PSysProcessor::start()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s", __func__);
++    AutoMutex   l(mBufferQueueLock);
++    int rawBufferNum = mOpaqueRawPort != INVALID_PORT ? PlatformData::getMaxRawDataNum(mCameraId) :
++                       PlatformData::getPreferredBufQSize(mCameraId);
++
++    /* Should use MIN_BUFFER_COUNT to optimize frame latency when PSYS processing
++     * time is slower than ISYS
++     */
++    bool needProducerBuffer = PlatformData::isIsysEnabled(mCameraId);
++
++    if (needProducerBuffer) {
++        int ret = allocProducerBuffers(mCameraId, rawBufferNum);
++        CheckError(ret != OK, NO_MEMORY, "Allocating producer buffer failed:%d", ret);
++    }
++
++    mThreadRunning = true;
++    mProcessThread->run("PsysProcessor", PRIORITY_NORMAL);
++    for (auto &psysDAGPair : mPSysDAGs) {
++        if (!psysDAGPair.second) continue;
++        psysDAGPair.second->start();
++        if (needProducerBuffer && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
++            psysDAGPair.second->registerInternalBufs(mInternalBuffers);
++        }
++    }
++
++    return OK;
++}
++
++void PSysProcessor::stop()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s", __func__);
++
++    for (auto &psysDAGPair : mPSysDAGs) {
++        if (!psysDAGPair.second) continue;
++        psysDAGPair.second->stop();
++    }
++
++    mProcessThread->requestExit();
++    {
++        AutoMutex l(mBufferQueueLock);
++        mThreadRunning = false;
++        //Wakeup the thread to exit
++        mFrameAvailableSignal.signal();
++        mOutputAvailableSignal.signal();
++        mFrameDoneSignal.signal();
++        AutoMutex lMeta(mMetaQueueLock);
++        mMetaAvailableSignal.signal();
++    }
++    {
++        AutoMutex l(mSofLock);
++        mSofCondition.signal();
++    }
++
++    mProcessThread->requestExitAndWait();
++
++    // Thread is not running. It is safe to clear the Queue
++    clearBufferQueues();
++}
++
++int PSysProcessor::setParameters(const Parameters& param)
++{
++    LOG1("%s camera id:%d", __func__, mCameraId);
++    // Process image enhancement related settings.
++    camera_image_enhancement_t enhancement;
++    int ret = param.getImageEnhancement(enhancement);
++    AutoWMutex wl(mIspSettingsLock);
++    if (ret == OK) {
++        mIspSettings.manualSettings.manualSharpness = (char)enhancement.sharpness;
++        mIspSettings.manualSettings.manualBrightness = (char)enhancement.brightness;
++        mIspSettings.manualSettings.manualContrast = (char)enhancement.contrast;
++        mIspSettings.manualSettings.manualHue = (char)enhancement.hue;
++        mIspSettings.manualSettings.manualSaturation = (char)enhancement.saturation;
++
++        // TODO: need to consider how to add feature level from user setting.
++        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_low;
++        mIspSettings.eeSetting.strength = enhancement.sharpness;
++    } else {
++        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_high;
++        mIspSettings.eeSetting.strength = 0;
++    }
++
++    camera_nr_mode_t manualNrMode;
++    camera_nr_level_t manualNrLevel;
++
++    int manualNrModeSet = param.getNrMode(manualNrMode);
++    int manualNrLevelSet = param.getNrLevel(manualNrLevel);
++
++    if (manualNrModeSet == OK) {
++        LOG2("%s: manual NR mode set: %d", __func__, manualNrMode);
++        switch (manualNrMode) {
++            case NR_MODE_OFF:
++                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_off;
++                break;
++            case NR_MODE_AUTO:
++                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
++                break;
++            case NR_MODE_MANUAL_NORMAL:
++                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
++                break;
++            case NR_MODE_MANUAL_EXPERT:
++                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
++                break;
++            default:
++                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
++        }
++
++    } else {
++        LOG2("%s: manual NR mode not set, default enabled", __func__);
++        mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
++    }
++
++    if (manualNrLevelSet == OK) {
++        LOG2("%s: manual NR level set: %d", __func__, manualNrLevel.overall);
++        mIspSettings.nrSetting.strength = (char)manualNrLevel.overall;
++    } else {
++        LOG2("%s: manual NR level not set, default used", __func__);
++        mIspSettings.nrSetting.strength = (char)0;
++    }
++
++    LOG2("%s: ISP NR setting, level: %d, strength: %d",
++            __func__, (int)mIspSettings.nrSetting.feature_level,
++            (int)mIspSettings.nrSetting.strength);
++
++    camera_video_stabilization_mode_t stabilizationMode;
++    ret = param.getVideoStabilizationMode(stabilizationMode);
++    if (ret == OK) {
++         mIspSettings.videoStabilization = (stabilizationMode == VIDEO_STABILIZATION_MODE_ON);
++    } else {
++         mIspSettings.videoStabilization = false;
++    }
++    LOG2("%s: Video stablilization enabled:%d", __func__, mIspSettings.videoStabilization);
++
++    return ret;
++}
++
++int PSysProcessor::getParameters(Parameters& param)
++{
++    LOG1("@%s ", __func__);
++    AutoRMutex rl(mIspSettingsLock);
++    camera_image_enhancement_t enhancement = { mIspSettings.manualSettings.manualSharpness,
++                                               mIspSettings.manualSettings.manualBrightness,
++                                               mIspSettings.manualSettings.manualContrast,
++                                               mIspSettings.manualSettings.manualHue,
++                                               mIspSettings.manualSettings.manualSaturation };
++    int ret = param.setImageEnhancement(enhancement);
++
++    ret |= mPSysDAGs[mCurConfigMode]->getParameters(param);
++
++    return ret;
++}
++
++/**
++ * Get available setting sequence from outBuf
++ */
++long PSysProcessor::getSettingSequence(const CameraBufferPortMap &outBuf)
++{
++    long settingSequence = -1;
++    for (auto& output: outBuf) {
++        if (output.second) {
++            settingSequence = output.second->getSettingSequence();
++            break;
++        }
++    }
++    return settingSequence;
++}
++
++/**
++ * Check if the input frame should be skipped
++ *
++ * If the corresponding mSkip of AiqResult gotten from sequence is true,
++ * return true; otherwise return false.
++ */
++bool PSysProcessor::needSkipOutputFrame(long sequence)
++{
++    // Check if need to skip output frame
++    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
++    if (aiqResults != nullptr && aiqResults->mSkip) {
++        LOG1("%s, sequence %ld", __func__, sequence);
++        return true;
++    }
++    return false;
++}
++
++/**
++ * Check if 'inBuffer' can be used for 'settingSequence' to run PSys pipe.
++ *
++ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
++ * input buffer, so it can run the pipe.
++ * If 'inputSequence' larger than 'settingSequence', the pipeline needs to
++ * run as well, otherwise the pipe doesn't need to run and this input buffer needs to
++ * be skipped.
++ */
++bool PSysProcessor::needExecutePipe(long settingSequence, long inputSequence)
++{
++    if (settingSequence == -1 || inputSequence >= settingSequence) {
++        return true;
++    }
++
++    return false;
++}
++
++/**
++ * Check if the input buffer need to be reused
++ *
++ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
++ * input buffer, so the input buffer doesn't need to be reused.
++ * If 'inputSequence' larger than 'settingSequence', means the input buffer
++ * may be required by following output buffer, so it may be reused later.
++ */
++bool PSysProcessor::needHoldOnInputFrame(long settingSequence, long inputSequence)
++{
++    if (settingSequence == -1 || inputSequence <= settingSequence) {
++        return false;
++    }
++
++    return true;
++}
++
++/**
++ * Check if pipe needs to be switched according to AIQ result.
++ */
++bool PSysProcessor::needSwitchPipe(long sequence)
++{
++    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
++    if (aiqResults == nullptr) {
++        LOG2("%s: not found sequence %ld in AiqResultStorage, no update for active modes",
++            __func__, sequence);
++        return false;
++    }
++
++    TuningMode curTuningMode = aiqResults->mTuningMode;
++    LOG2("%s: aiqResults->mTuningMode = %d", __func__, curTuningMode);
++
++    if (mTuningMode == curTuningMode) {
++        return false;
++    }
++
++    for (auto cfg : mConfigModes) {
++        TuningMode tMode;
++        int ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tMode);
++        if (ret == OK && tMode == curTuningMode) {
++            mCurConfigMode = cfg;
++            mTuningMode = curTuningMode;
++            return true;
++        }
++    }
++    return false;
++}
++
++void PSysProcessor::handleEvent(EventData eventData)
++{
++    LOG2("%s: got event type %d", __func__, eventData.type);
++    // Process registered events
++    switch (eventData.type) {
++        case EVENT_ISYS_SOF:
++            {
++                AutoMutex l(mSofLock);
++
++                mSofSequence = eventData.data.sync.sequence;
++                gettimeofday(&mSofTimestamp, nullptr);
++                LOG2("%s, received SOF event sequence: %ld, timestamp: %ld",
++                     __func__, eventData.data.sync.sequence, TIMEVAL2USECS(mSofTimestamp));
++                mSofCondition.signal();
++            }
++            break;
++        default:
++            LOGW("Unexpected event: %d", eventData.type);
++            break;
++    }
++}
++
++// PSysProcessor ThreadLoop
++int PSysProcessor::processNewFrame() {
++    PERF_CAMERA_ATRACE();
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    CheckError(!mBufferProducer, INVALID_OPERATION, "No available producer");
++
++    int ret = OK;
++    CameraBufferPortMap srcBuffers, dstBuffers;
++
++    if (!PlatformData::psysAlignWithSof(mCameraId)) {
++        {
++            ConditionLock lock(mBufferQueueLock);
++            ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
++            // Already stopped
++            if (!mThreadRunning) return -1;
++
++            // Wait frame buffer time out should not involve thread exit.
++            if (ret != OK) {
++                LOG1("%s, cameraId: %d timeout happen, wait recovery", __func__, mCameraId);
++                return OK;
++            }
++        }
++
++        ret = prepareTask(&srcBuffers, &dstBuffers);
++        CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
++    } else {
++        {
++            ConditionLock lock(mSofLock);
++
++            timeval curTime;
++            gettimeofday(&curTime, nullptr);
++            int64_t sofInterval = TIMEVAL2NSECS(curTime) - TIMEVAL2NSECS(mSofTimestamp);
++
++            // Wait next sof event when missing last one for a long time
++            if (sofInterval > SOF_EVENT_MARGIN && sofInterval < SOF_EVENT_MAX_MARGIN) {
++                LOG2("%s, need to wait next sof event. sofInterval: %ld", __func__, sofInterval);
++                ret = mSofCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
++
++                // Already stopped
++                if (!mThreadRunning) return -1;
++
++                // Wait sof event time out should not involve thread exit.
++                if (ret != OK) {
++                    LOG1("%s, cameraId: %d wait sof event timeout, recovery", __func__, mCameraId);
++                    return OK;
++                }
++            }
++        }
++
++        // push all the pending buffers to task
++        while (true) {
++            {
++                ConditionLock lock(mBufferQueueLock);
++                ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers, SOF_EVENT_MARGIN);
++
++                // Return to wait next sof event if there isn't pending buffer.
++                if (ret != OK) {
++                    LOG1("%s, cameraId: %d, there isn't pending buffer, recovery",
++                         __func__, mCameraId);
++                    return OK;
++                }
++            }
++
++            {
++                AutoMutex l(mSofLock);
++                if (srcBuffers.begin()->second->getSequence() >= mSofSequence) {
++                    LOG2("%s, run the frame in next sof: buffer sequence: %ld, sof sequence: %ld",
++                         __func__, srcBuffers.begin()->second->getSequence(), mSofSequence);
++                    return OK;
++                }
++            }
++
++            ret = prepareTask(&srcBuffers, &dstBuffers);
++            CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
++        }
++    }
++
++    return OK;
++}
++
++void PSysProcessor::handleRawReprocessing(CameraBufferPortMap *srcBuffers,
++                                          CameraBufferPortMap *dstBuffers, bool *hasYuv,
++                                          bool *hasRawOutput, bool *hasRawInput)
++{
++    std::shared_ptr<CameraBuffer> rawOutputBuffer = nullptr;
++    long settingSequence = -1;
++
++    for (const auto& item : *dstBuffers) {
++        if (item.second) {
++            if (item.second->getStreamUsage() == CAMERA_STREAM_OPAQUE_RAW) {
++                rawOutputBuffer = item.second;
++            } else {
++                *hasYuv = true;
++            }
++            if (item.second->getSettingSequence() >= 0) {
++                settingSequence = item.second->getSettingSequence();
++            }
++        }
++    }
++
++    Port defaultPort = srcBuffers->begin()->first;
++    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
++    long inputSequence = mainBuf->getSequence();
++
++    if (rawOutputBuffer) {
++        if (!needExecutePipe(settingSequence, inputSequence)) {
++            LOG2("%s, inputSequence %ld is smaller than settingSequence %ld, skip sensor frame.",
++                 __func__, inputSequence, settingSequence);
++            return;
++        }
++        // Return opaque RAW data
++        uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
++        sensor_raw_info_t opaqueRawInfo = { inputSequence, timestamp };
++
++        rawOutputBuffer->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
++
++        MEMCPY_S(rawOutputBuffer->getBufferAddr(), rawOutputBuffer->getBufferSize(),
++                 &opaqueRawInfo, sizeof(opaqueRawInfo));
++        LOG2("%s, timestamp %ld, inputSequence %ld, dstBufferSize %d, addr %p", __func__,
++              timestamp, inputSequence, rawOutputBuffer->getBufferSize(),
++              rawOutputBuffer->getBufferAddr());
++
++        // Return opaque RAW buffer
++        for (auto &it : mBufferConsumerList) {
++            it->onFrameAvailable(mOpaqueRawPort, rawOutputBuffer);
++        }
++        *hasRawOutput = true;
++
++        PlatformData::updateMakernoteTimeStamp(mCameraId, settingSequence, timestamp);
++
++        if (!(*hasYuv)) {
++            EventData frameData;
++            frameData.type = EVENT_PSYS_FRAME;
++            frameData.buffer = nullptr;
++            frameData.data.frame.sequence = rawOutputBuffer->getSequence();
++            frameData.data.frame.timestamp.tv_sec = rawOutputBuffer->getTimestamp().tv_sec;
++            frameData.data.frame.timestamp.tv_usec = rawOutputBuffer->getTimestamp().tv_usec;;
++            notifyListeners(frameData);
++            LOG2("%s, frame done for sequence: %ld", __func__, frameData.data.frame.sequence);
++        }
++
++        // Remove from dstBuffers map
++        dstBuffers->erase(mOpaqueRawPort);
++
++        // Save buffer into mRawQueue
++        CameraBufferPortMap mapBuf;
++        for (const auto& src : *srcBuffers) {
++            mapBuf[src.first] = src.second;
++        }
++
++        AutoMutex lock(mRawBufferMapLock);
++        mRawBufferMap[inputSequence] = mapBuf;
++    } else if (settingSequence != -1 && inputSequence > settingSequence) {
++        AutoMutex lock(mRawBufferMapLock);
++        // Find Raw buffer in mRawBufferMap
++        if (mRawBufferMap.find(settingSequence) != mRawBufferMap.end()) {
++            CameraBufferPortMap &mapBuf = mRawBufferMap[settingSequence];
++            // Update source buffers
++            for (const auto& bufPortMap : mapBuf) {
++                (*srcBuffers)[bufPortMap.first] = bufPortMap.second;
++            }
++            *hasRawInput = true;
++        }
++    }
++
++    LOG2("%s, hasRawInput %d, hasRawOutput %d, hasYuv %d, settingSequence %ld, inputSequence %ld",
++          __func__, *hasRawInput, *hasRawOutput, *hasYuv, settingSequence, inputSequence);
++}
++
++bool PSysProcessor::isBufferHoldForRawReprocess(long sequence)
++{
++    if (mOpaqueRawPort == INVALID_PORT) return false;
++
++    AutoMutex lock(mRawBufferMapLock);
++    if (mRawBufferMap.find(sequence) == mRawBufferMap.end()) return false;
++
++    // If too many buffers are holden in mRawQueue, return back to producer
++    if (mRawBufferMap.size() > (PlatformData::getMaxRawDataNum(mCameraId) -
++                                PlatformData::getMaxRequestsInflight(mCameraId))) {
++        std::map<long, CameraBufferPortMap>::iterator it = mRawBufferMap.begin();
++        CameraBufferPortMap &bufferPortMap = it->second;
++        for (auto &item : bufferPortMap) {
++            mBufferProducer->qbuf(item.first, item.second);
++        }
++        mRawBufferMap.erase(mRawBufferMap.begin());
++    }
++    return true;
++}
++
++status_t PSysProcessor::prepareTask(CameraBufferPortMap *srcBuffers,
++                                    CameraBufferPortMap *dstBuffers) {
++    CheckError(srcBuffers->empty() || dstBuffers->empty(),
++               UNKNOWN_ERROR, "%s, the input or output buffer is empty", __func__);
++
++    bool hasYuv = false;
++    bool hasRawOutput = false;
++    bool hasRawInput = false;
++    if (mOpaqueRawPort != INVALID_PORT) {
++        handleRawReprocessing(srcBuffers, dstBuffers, &hasYuv, &hasRawOutput, &hasRawInput);
++        if (hasRawOutput && !hasYuv) {
++            // If no YUV is needed, only RAW output requests
++            AutoMutex l(mBufferQueueLock);
++            for (auto& input: mInputQueue) {
++                input.second.pop();
++            }
++            for (auto& output: mOutputQueue) {
++                output.second.pop();
++            }
++            return OK;
++        }
++    }
++
++    Port defaultPort = srcBuffers->begin()->first;
++    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
++    long inputSequence = mainBuf->getSequence();
++    TRACE_LOG_POINT("PSysProcessor", "input output buffer ready", MAKE_COLOR(inputSequence),
++                    inputSequence);
++    uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
++    LOG2("%s: input buffer sequence %ld timestamp %ld", __func__, inputSequence, timestamp);
++
++    // Output raw image
++    if (mRawPort != INVALID_PORT) {
++        shared_ptr<CameraBuffer> dstBuf = nullptr;
++
++        // Get output buffer and remove it from dstBuffers
++        for (auto &buffer : *dstBuffers) {
++            if (buffer.first == mRawPort) {
++                dstBuf = buffer.second;
++                CheckError(!dstBuf, UNKNOWN_ERROR, "%s, dstBuf for output raw is null", __func__);
++                dstBuf->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
++                dstBuffers->erase(mRawPort);
++                break;
++            }
++        }
++        outputRawImage(mainBuf, dstBuf);
++    }
++
++    long settingSequence = getSettingSequence(*dstBuffers);
++    bool needRunPipe = needExecutePipe(settingSequence, inputSequence);
++    bool holdOnInput = needHoldOnInputFrame(settingSequence, inputSequence);
++    LOG2("%s: dst sequence = %ld, src sequence = %ld, needRunPipe = %d, needReuseInput = %d",
++         __func__, settingSequence, inputSequence, needRunPipe, holdOnInput);
++
++    {
++        AutoMutex l(mBufferQueueLock);
++        if (needRunPipe && !needSkipOutputFrame(inputSequence)) {
++            for (auto& output: mOutputQueue) {
++                output.second.pop();
++            }
++        }
++
++        // If input buffer will be used later, don't pop it from the queue.
++        if (!holdOnInput && !hasRawInput) {
++            for (auto& input: mInputQueue) {
++                input.second.pop();
++            }
++        }
++    }
++
++    if (needRunPipe) {
++        // Raw output already has been returned back, and don't need to handle again.
++        if (!hasRawOutput) {
++            for (const auto& output : *dstBuffers) {
++                if (output.second && output.second->getUsage() != BUFFER_USAGE_PSYS_INTERNAL) {
++                    EventData event;
++                    event.type = EVENT_PSYS_REQUEST_BUF_READY;
++                    event.buffer = nullptr;
++                    event.data.requestReady.timestamp = timestamp;
++                    event.data.requestReady.sequence = settingSequence;
++                    notifyListeners(event);
++                    break;
++                }
++            }
++        }
++        dispatchTask(*srcBuffers, *dstBuffers);
++    } else if (!holdOnInput && !hasRawOutput) {
++        for (const auto& src : *srcBuffers) {
++            mBufferProducer->qbuf(src.first, src.second);
++        }
++    }
++
++    return OK;
++}
++
++void PSysProcessor::dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf)
++{
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    long currentSequence = inBuf.begin()->second->getSequence();
++    TRACE_LOG_POINT("PSysProcessor", "start run PSYS", MAKE_COLOR(currentSequence),
++                    currentSequence);
++
++    {
++        ConditionLock lock(mBufferQueueLock);
++
++        ConfigMode previousMode = mCurConfigMode;
++        bool needSwitch = needSwitchPipe(currentSequence);
++
++        if (needSwitch) {
++            LOG1("Switch pipe for sequence:%ld, unprocessed buffer number:%zu",
++                  currentSequence, mSequenceInflight.size());
++
++            // Deactive the PSysDag which is no longer used.
++            mPSysDAGs[previousMode]->pause();
++
++            // Before switching, need to wait all buffers in current pipe being processed.
++            while (!mSequenceInflight.empty()) {
++                int ret = mFrameDoneSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
++                if (!mThreadRunning) {
++                    LOG1("@%s: Processor is not active while waiting for frame done.", __func__);
++                    return;
++                }
++
++                if (ret == TIMED_OUT) {
++                    LOGE("Waiting for frame done event timeout");
++                    return;
++                }
++            }
++
++            // Activate the current used PSysDag.
++            mPSysDAGs[mCurConfigMode]->resume();
++        }
++        mSequenceInflight.push(currentSequence);
++    } // End of lock mBufferQueueLock
++
++    // Prepare the task input paramerters including input and output buffers, settings etc.
++    PSysTaskData taskParam;
++    taskParam.mTuningMode = mTuningMode;
++    taskParam.mInputBuffers = inBuf;
++    taskParam.mOutputBuffers = outBuf;
++
++    long settingSequence = getSettingSequence(outBuf);
++    // Handle per-frame settings if output buffer requires
++    if (settingSequence > -1 && mParameterGenerator) {
++        Parameters params;
++        if (mParameterGenerator->getParameters(currentSequence, &params) == OK) {
++            setParameters(params);
++        }
++    }
++    {
++        AutoRMutex rl(mIspSettingsLock);
++        mIspSettings.palOverride = nullptr;
++        taskParam.mIspSettings = mIspSettings;
++    }
++
++    if (!mThreadRunning) return;
++
++    mPSysDAGs[mCurConfigMode]->addTask(taskParam);
++}
++
++void PSysProcessor::registerListener(EventType eventType, EventListener* eventListener)
++{
++    // Only delegate stats event registration to deeper layer DAG and PipeExecutor
++    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
++        BufferQueue::registerListener(eventType, eventListener);
++        return;
++    }
++
++    for (auto const& realModeDAGPair: mPSysDAGs) {
++        realModeDAGPair.second->registerListener(eventType, eventListener);
++    }
++}
++
++void PSysProcessor::removeListener(EventType eventType, EventListener* eventListener)
++{
++    // Only delegate stats event unregistration to deeper layer DAG and PipeExecutor
++    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
++        BufferQueue::removeListener(eventType, eventListener);
++        return;
++    }
++
++    for (auto const& realModeDAGPair: mPSysDAGs) {
++        realModeDAGPair.second->removeListener(eventType, eventListener);
++    }
++}
++
++void PSysProcessor::onBufferDone(int64_t sequence, Port port,
++                                 const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    LOG2("@%s, mCameraId:%d, sequence %ld, port %d", __func__, mCameraId, sequence, port);
++
++    if (CameraDump::isDumpTypeEnable(DUMP_PSYS_OUTPUT_BUFFER)) {
++        CameraDump::dumpImage(mCameraId, camBuffer, M_PSYS, port);
++    }
++
++    if (!needSkipOutputFrame(sequence)) {
++        for (auto &it : mBufferConsumerList) {
++            it->onFrameAvailable(port, camBuffer);
++        }
++    }
++}
++
++void PSysProcessor::onFrameDone(const PSysTaskData& result)
++{
++    PERF_CAMERA_ATRACE();
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    EventDataFrame eventDataFrame;
++    CLEAR(eventDataFrame);
++    eventDataFrame.sequence = -1;
++
++    long sequence = result.mInputBuffers.begin()->second->getSequence();
++    TRACE_LOG_POINT("PSysProcessor", __func__, MAKE_COLOR(sequence), sequence);
++
++    for (auto& dst : result.mOutputBuffers) {
++        shared_ptr<CameraBuffer> outBuf = dst.second;
++        // If the output buffer is nullptr, that means user doesn't request that buffer,
++        // so it doesn't need to be handled here.
++        if (!outBuf) {
++            continue;
++        }
++
++        if (!needSkipOutputFrame(sequence)) {
++            eventDataFrame.sequence = outBuf->getSequence();
++            eventDataFrame.timestamp.tv_sec = outBuf->getTimestamp().tv_sec;
++            eventDataFrame.timestamp.tv_usec = outBuf->getTimestamp().tv_usec;
++            break;
++        } else {
++            LOG1("Frame %ld is being skipped.", sequence);
++        }
++    }
++
++    if (eventDataFrame.sequence >= 0) {
++        EventData frameData;
++        frameData.type = EVENT_PSYS_FRAME;
++        frameData.buffer = nullptr;
++        frameData.data.frame.sequence = eventDataFrame.sequence;
++        frameData.data.frame.timestamp.tv_sec = eventDataFrame.timestamp.tv_sec;
++        frameData.data.frame.timestamp.tv_usec = eventDataFrame.timestamp.tv_usec;
++        notifyListeners(frameData);
++        LOG2("%s, frame done for sequence: %ld", __func__, sequence);
++    }
++
++    long settingSequence = getSettingSequence(result.mOutputBuffers);
++    bool holdOnInput = needHoldOnInputFrame(settingSequence, sequence);
++    bool hasRawOutput = isBufferHoldForRawReprocess(sequence);
++
++    // Return buffer only if the buffer is not used in the future.
++    if (!holdOnInput && mBufferProducer && !hasRawOutput) {
++        for (const auto& src : result.mInputBuffers) {
++            mBufferProducer->qbuf(src.first, src.second);
++
++            if (src.second->getStreamType() == CAMERA_STREAM_INPUT) {
++                for (auto &it : mBufferConsumerList) {
++                    it->onFrameAvailable(src.first, src.second);
++                }
++            }
++        }
++    }
++
++    AutoMutex l(mBufferQueueLock);
++    long oldest = mSequenceInflight.front();
++    if (sequence != oldest) {
++        // The output buffer should always be FIFO.
++        LOGW("The sequence should be %ld, but it's %ld", oldest, sequence);
++    }
++
++    mSequenceInflight.pop();
++    if (mSequenceInflight.empty()) {
++        mFrameDoneSignal.signal();
++    }
++}
++
++void PSysProcessor::outputRawImage(shared_ptr<CameraBuffer> &srcBuf, shared_ptr<CameraBuffer> &dstBuf)
++{
++    if ((srcBuf == nullptr) || (dstBuf == nullptr)) {
++        return;
++    }
++
++    // Copy from source buffer
++    int srcBufferSize = srcBuf->getBufferSize();
++    int srcMemoryType = srcBuf->getMemory();
++    void* pSrcBuf = (srcMemoryType == V4L2_MEMORY_DMABUF)
++                    ? CameraBuffer::mapDmaBufferAddr(srcBuf->getFd(), srcBufferSize)
++                    : srcBuf->getBufferAddr();
++
++    int dstBufferSize = dstBuf->getBufferSize();
++    int dstMemoryType = dstBuf->getMemory();
++    void* pDstBuf = (dstMemoryType == V4L2_MEMORY_DMABUF)
++                    ? CameraBuffer::mapDmaBufferAddr(dstBuf->getFd(), dstBufferSize)
++                    : dstBuf->getBufferAddr();
++
++    MEMCPY_S(pDstBuf, dstBufferSize, pSrcBuf, srcBufferSize);
++
++    if (srcMemoryType == V4L2_MEMORY_DMABUF) {
++        CameraBuffer::unmapDmaBufferAddr(pSrcBuf, srcBufferSize);
++    }
++
++    if (dstMemoryType == V4L2_MEMORY_DMABUF) {
++        CameraBuffer::unmapDmaBufferAddr(pDstBuf, dstBufferSize);
++    }
++
++    // Send output buffer to its consumer
++    for (auto &it : mBufferConsumerList) {
++        it->onFrameAvailable(mRawPort, dstBuf);
++    }
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.h b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
+new file mode 100644
+index 000000000000..7f52b31284e0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
+@@ -0,0 +1,133 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <queue>
++
++#include "BufferQueue.h"
++#include "iutils/RWLock.h"
++
++#include "IspSettings.h"
++#include "psysprocessor/PSysDAG.h"
++
++namespace icamera {
++
++class ParameterGenerator;
++class PSysDAG;
++
++typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
++typedef std::map<ConfigMode, std::unique_ptr<PSysDAG>> PSysDAGConfigModeMap;
++
++/**
++  * PSysProcessor runs the Image Process Algorithm in the PSYS.
++  * It implements the BufferConsumer and BufferProducer Interface
++  */
++class PSysProcessor: public BufferQueue, public PSysDagCallback {
++
++public:
++    PSysProcessor(int cameraId, ParameterGenerator *pGenerator);
++    virtual ~PSysProcessor();
++    virtual int configure(const std::vector<ConfigMode>& configModes);
++    virtual int setParameters(const Parameters& param);
++    virtual int getParameters(Parameters& param);
++
++    virtual int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    //Overwrite event source API to delegate related functions
++    void registerListener(EventType eventType, EventListener* eventListener);
++    void removeListener(EventType eventType, EventListener* eventListener);
++
++    virtual int start();
++    virtual void stop();
++
++    // Overwrite PSysDagCallback API, used for returning back buffers from PSysDAG.
++    void onFrameDone(const PSysTaskData& result);
++    void onBufferDone(int64_t sequence, Port port,
++                      const std::shared_ptr<CameraBuffer> &camBuffer);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(PSysProcessor);
++
++private:
++    int processNewFrame();
++    std::shared_ptr<CameraBuffer> allocStatsBuffer(int index);
++
++    status_t prepareTask(CameraBufferPortMap *srcBuffers, CameraBufferPortMap *dstBuffers);
++    void dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf);
++
++    void handleEvent(EventData eventData);
++
++    long getSettingSequence(const CameraBufferPortMap &outBuf);
++    bool needSkipOutputFrame(long sequence);
++    bool needExecutePipe(long settingSequence, long inputSequence);
++    bool needHoldOnInputFrame(long settingSequence, long inputSequence);
++    bool needSwitchPipe(long sequence);
++
++    void outputRawImage(std::shared_ptr<CameraBuffer> &srcBuf,
++                        std::shared_ptr<CameraBuffer> &dstBuf);
++
++    void handleRawReprocessing(CameraBufferPortMap *srcBuffers,
++                               CameraBufferPortMap *dstBuffers, bool *hasYuv,
++                               bool *hasRawOutput, bool *hasRawInput);
++    bool isBufferHoldForRawReprocess(long sequence);
++
++private:
++    int mCameraId;
++    static const nsecs_t kWaitDuration = 1000000000; //1000ms
++    ParameterGenerator *mParameterGenerator;
++
++    IspSettings mIspSettings;
++    RWLock mIspSettingsLock;
++
++    //Since the isp settings may be re-used in all modes, so the buffer size of
++    //isp settings should be equal to frame buffer size.
++    static const int IA_PAL_CONTROL_BUFFER_SIZE = 10;
++
++    Condition mFrameDoneSignal;
++    std::queue<long> mSequenceInflight; // Save the sequences which are being processed.
++
++    std::vector<ConfigMode> mConfigModes;
++    PSysDAGConfigModeMap mPSysDAGs;
++    // Active config mode and tuning mode
++    ConfigMode mCurConfigMode;
++    TuningMode mTuningMode;
++
++    std::queue<EventDataMeta> mMetaQueue;
++    //Guard for the metadata queue
++    Mutex  mMetaQueueLock;
++    Condition mMetaAvailableSignal;
++
++    Port mRawPort;
++
++    // variables for sof alignment
++    timeval mSofTimestamp;
++    Mutex mSofLock;
++    Condition mSofCondition;
++    long mSofSequence;
++
++    // variables for opaque raw
++    Port mOpaqueRawPort;
++    std::mutex mRawBufferMapLock;
++    std::map<long, CameraBufferPortMap> mRawBufferMap;
++
++    enum {
++        PIPELINE_UNCREATED = 0,
++        PIPELINE_CREATED
++    } mStatus;
++}; // End of class PSysProcessor
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
+new file mode 100644
+index 000000000000..ccb204dbc8b9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
+@@ -0,0 +1,125 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ProcessorManager"
++
++#include "ProcessorManager.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#include "SwImageProcessor.h"
++#include "PSysProcessor.h"
++
++namespace icamera {
++
++ProcessorManager::ProcessorManager(int cameraId) :
++        mCameraId(cameraId),
++        mPsysUsage(PSYS_NOT_USED)
++{
++    LOG1("@%s, cameraId:%d", __func__, mCameraId);
++}
++
++ProcessorManager::~ProcessorManager()
++{
++    LOG1("@%s, cameraId:%d", __func__, mCameraId);
++
++    deleteProcessors();
++}
++
++std::vector<BufferQueue*> ProcessorManager::createProcessors(int inputFmt,
++        const std::map<Port, stream_t>& producerConfigs,
++        const std::map<int, Port>& streamIdToPortMap,
++        stream_config_t *streamList, const Parameters& param, ParameterGenerator* paramGenerator)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    ProcessorConfig processorItem;
++    processorItem.mInputConfigs = producerConfigs;
++    for (const auto& item : streamIdToPortMap) {
++        if (streamList->streams[item.first].streamType == CAMERA_STREAM_INPUT) continue;
++        processorItem.mOutputConfigs[item.second] = streamList->streams[item.first];
++    }
++
++    // Check if PSysProcessor can be used.
++    mPsysUsage = PSYS_NORMAL;
++    for (int i = 0; i < streamList->num_streams; i++) {
++        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
++            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
++
++        if (!PlatformData::usePsys(mCameraId, streamList->streams[i].format)) {
++            mPsysUsage = PSYS_NOT_USED;
++            break;
++        }
++    }
++
++    if (mPsysUsage == PSYS_NORMAL) {
++        LOG1("Using normal Psys to do image processing.");
++        processorItem.mProcessor = new PSysProcessor(mCameraId, paramGenerator);
++        mProcessors.push_back(processorItem);
++    }
++
++    if (mPsysUsage == PSYS_NOT_USED) {
++        LOG1("Using software to do color conversion.");
++        processorItem.mProcessor = new SwImageProcessor(mCameraId);
++        mProcessors.push_back(processorItem);
++    }
++
++    std::vector<BufferQueue*> processors;
++    for (auto& p : mProcessors) {
++        processors.push_back(p.mProcessor);
++    }
++
++    return processors;
++}
++
++int ProcessorManager::deleteProcessors()
++{
++    for (auto& item : mProcessors) {
++        delete item.mProcessor;
++    }
++    mProcessors.clear();
++
++    mPsysUsage = PSYS_NOT_USED;
++
++    return OK;
++}
++
++/**
++ * Configure processor with input and output streams
++ */
++int ProcessorManager::configureProcessors(const std::vector<ConfigMode>& configModes,
++                                          BufferProducer* producer,
++                                          const Parameters& param)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    BufferProducer* preProcess =  nullptr;
++    for (auto& item : mProcessors) {
++        BufferQueue* processor = item.mProcessor;
++        processor->setFrameInfo(item.mInputConfigs, item.mOutputConfigs);
++        processor->setParameters(param);
++        int ret = processor->configure(configModes);
++        CheckError(ret < 0, ret, "Configure processor failed with:%d", ret);
++
++        processor->setBufferProducer(preProcess ? preProcess : producer);
++        preProcess = processor;
++    }
++
++    return OK;
++}
++
++} // end of namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.h b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
+new file mode 100644
+index 000000000000..d11cb14877a4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "BufferQueue.h"
++
++namespace icamera {
++
++class ParameterGenerator;
++
++/**
++ * \class ProcessorManager
++ *
++ * \brief ProcessorManager helps to create and maintain the post processors.
++ */
++class ProcessorManager {
++public:
++    ProcessorManager(int cameraId);
++    ~ProcessorManager();
++
++    std::vector<BufferQueue*> createProcessors(int inputFmt,
++                                               const std::map<Port, stream_t>& producerConfigs,
++                                               const std::map<int, Port>& streamIdToPortMap,
++                                               stream_config_t *streamList, const Parameters& param,
++                                               ParameterGenerator* paramGenerator);
++    int configureProcessors(const std::vector<ConfigMode>& configModes, BufferProducer* producer,
++                            const Parameters& param);
++    int deleteProcessors();
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(ProcessorManager);
++private:
++    int mCameraId;
++
++    enum PSysUsage {
++        PSYS_NOT_USED = 0,
++        PSYS_NORMAL,
++        PSYS_WEAVING,
++        PSYS_SCALE,
++        PSYS_CSC,
++        PSYS_SCALE_CSC,
++        PSYS_WEAVING_SCALE,
++        PSYS_WEAVING_SCALE_CSC,
++        PSYS_FISHEYE,
++        PSYS_MONO_DS,
++    } mPsysUsage;
++
++    struct ProcessorConfig {
++        BufferQueue* mProcessor;
++        std::map<Port, stream_t> mInputConfigs;
++        std::map<Port, stream_t> mOutputConfigs;
++    };
++
++    std::vector<ProcessorConfig> mProcessors;
++};
++
++} // end of namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.cpp b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
+new file mode 100644
+index 000000000000..fbbef98ba252
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
+@@ -0,0 +1,542 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "RequestThread"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++#include "RequestThread.h"
++
++using std::vector;
++using std::shared_ptr;
++
++namespace icamera {
++
++RequestThread::RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen) :
++    mCameraId(cameraId),
++    m3AControl(a3AControl),
++    mParamGenerator(aParamGen),
++    mPerframeControlSupport(false),
++    mGet3AStatWithFakeRequest(false),
++    mRequestsInProcessing(0),
++    mFirstRequest(true),
++    mRequestConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
++    mUserConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
++    mNeedReconfigPipe(false),
++    mReconfigPipeScore(0),
++    mActive(false),
++    mLastRequestId(-1),
++    mLastPredictSeq(-1),
++    mLastEofSeq(-1),
++    mBlockRequest(true)
++{
++    CLEAR(mStreamConfig);
++    CLEAR(mConfiguredStreams);
++    CLEAR(mFakeReqBuf);
++
++    mStreamConfig.operation_mode = CAMERA_STREAM_CONFIGURATION_MODE_END;
++    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
++}
++
++RequestThread::~RequestThread()
++{
++    while (!mReqParamsPool.empty()) {
++        mReqParamsPool.pop();
++    }
++}
++
++void RequestThread::requestExit()
++{
++    clearRequests();
++
++    Thread::requestExit();
++    AutoMutex l(mPendingReqLock);
++    mRequestSignal.signal();
++}
++
++void RequestThread::clearRequests()
++{
++    LOG1("%s", __func__);
++
++    mActive = false;
++    for (int streamId = 0; streamId < MAX_STREAM_NUMBER; streamId++) {
++        FrameQueue& frameQueue = mOutputFrames[streamId];
++        AutoMutex lock(frameQueue.mFrameMutex);
++        while (!frameQueue.mFrameQueue.empty()) {
++            frameQueue.mFrameQueue.pop();
++        }
++        frameQueue.mFrameAvailableSignal.broadcast();
++    }
++
++    AutoMutex l(mPendingReqLock);
++    mRequestsInProcessing = 0;
++    while (!mPendingRequests.empty()) {
++        mPendingRequests.pop_back();
++    }
++
++    mLastRequestId = -1;
++    mLastPredictSeq = -1;
++    mLastEofSeq = -1;
++    mFirstRequest = true;
++    mBlockRequest = true;
++}
++
++void RequestThread::setConfigureModeByParam(const Parameters& param)
++{
++    camera_scene_mode_t sceneMode = SCENE_MODE_MAX;
++    if (param.getSceneMode(sceneMode) != OK) {
++        return;
++    }
++
++    ConfigMode configMode = CameraUtils::getConfigModeBySceneMode(sceneMode);
++    LOG2("@%s, sceneMode %d, configMode %d", __func__, sceneMode, configMode);
++
++    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
++        LOG2("%s: no valid config mode, skip setting", __func__);
++        return;
++    }
++
++    /* Reset internal mode related settings if requested mode is same as
++     * the mode currently running for better stability.
++     */
++    if (mStreamConfig.operation_mode == configMode) {
++        LOG2("%s: config mode %d keep unchanged.", __func__, configMode);
++        mNeedReconfigPipe = false;
++        mReconfigPipeScore = 0;
++        mRequestConfigMode = configMode;
++        return;
++    }
++
++    if (mRequestConfigMode != configMode) {
++        if (mRequestConfigMode != CAMERA_STREAM_CONFIGURATION_MODE_END) {
++            mNeedReconfigPipe = true;
++            mReconfigPipeScore = 0;
++            LOG2("%s: request configure mode changed, reset score %d", __func__, mReconfigPipeScore);
++        }
++        LOG2("%s: mRequestConfigMode updated from %d to %d", __func__, mRequestConfigMode, configMode);
++        mRequestConfigMode = configMode;
++    } else if (mReconfigPipeScore < PlatformData::getPipeSwitchDelayFrame(mCameraId)) {
++        mReconfigPipeScore ++;
++        LOG2("%s: request configure mode unchanged, current score %d", __func__, mReconfigPipeScore);
++    }
++}
++
++int RequestThread::configure(const stream_config_t *streamList)
++{
++    mGet3AStatWithFakeRequest = mPerframeControlSupport ? PlatformData::isPsysContinueStats(mCameraId) : false;
++    CLEAR(mFakeReqBuf);
++    bool hasVideoStream = false;
++
++    mStreamConfig.num_streams = streamList->num_streams;
++    mStreamConfig.operation_mode = streamList->operation_mode;
++    mUserConfigMode = (ConfigMode)streamList->operation_mode;
++    int previewStreamIndex = -1;
++    for (int i = 0; i < streamList->num_streams; i++) {
++        mConfiguredStreams[i] = streamList->streams[i];
++        if (previewStreamIndex < 0 && mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW) {
++            previewStreamIndex = i;
++        }
++        if (mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW ||
++            mConfiguredStreams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
++            hasVideoStream = true;
++        }
++    }
++
++    LOG1("%s: user specified Configmode: %d, hasVideoStream %d", __func__, mUserConfigMode, hasVideoStream);
++    if (mGet3AStatWithFakeRequest) {
++        if (previewStreamIndex < 0) {
++            LOGW("Can't get 3a stats event due to no preview stream");
++            mGet3AStatWithFakeRequest = false;
++        } else {
++            stream_t &stream = mConfiguredStreams[previewStreamIndex];
++            LOG1("%s: create fake request with stream index %d", __func__, previewStreamIndex);
++            mFakeBuffer = CameraBuffer::create(mCameraId, BUFFER_USAGE_PSYS_INTERNAL, V4L2_MEMORY_USERPTR,
++                                               stream.size, 0, stream.format,
++                                               stream.width, stream.height);
++
++            mFakeReqBuf.s = stream;
++            mFakeReqBuf.s.memType = V4L2_MEMORY_USERPTR;
++            mFakeReqBuf.addr = mFakeBuffer->getUserBuffer()->addr;
++        }
++    }
++    mStreamConfig.streams = mConfiguredStreams;
++
++    // Use concrete mode in RequestThread
++    if ((ConfigMode)mStreamConfig.operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
++        vector <ConfigMode> configModes;
++        int ret = PlatformData::getConfigModesByOperationMode(mCameraId, mStreamConfig.operation_mode, configModes);
++        CheckError((ret != OK || configModes.empty()), ret, "%s, get real ConfigMode failed %d", __func__, ret);
++        mRequestConfigMode = configModes[0];
++        LOG2("%s: use concrete mode %d as default initial mode for auto op mode", __func__, mRequestConfigMode);
++        mStreamConfig.operation_mode = mRequestConfigMode;
++    }
++
++    // Don't block request handling if no 3A stats (from video pipe)
++    mBlockRequest = PlatformData::isEnableAIQ(mCameraId) && hasVideoStream;
++
++    LOG2("%s: mRequestConfigMode initial value: %d", __func__, mRequestConfigMode);
++    return OK;
++}
++
++bool RequestThread::blockRequest() {
++    /**
++     * Block request processing if:
++     * 1. mBlockRequest is true (except the 1st request), or
++     * 2. Too many requests in flight.
++     */
++    return ((mBlockRequest && (mLastRequestId >= 0)) ||
++            mRequestsInProcessing >= PlatformData::getMaxRequestsInflight(mCameraId));
++}
++
++int RequestThread::processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters* params)
++{
++    AutoMutex l(mPendingReqLock);
++    CameraRequest request;
++    request.mBufferNum = bufferNum;
++    bool hasVideoBuffer = false;
++
++    for (int id = 0; id < bufferNum; id++) {
++        request.mBuffer[id] = ubuffer[id];
++        if (ubuffer[id]->s.usage == CAMERA_STREAM_PREVIEW ||
++            ubuffer[id]->s.usage == CAMERA_STREAM_VIDEO_CAPTURE) {
++            hasVideoBuffer = true;
++        }
++    }
++
++    if (mFirstRequest && !hasVideoBuffer) {
++        LOG2("there is no video buffer in first request, so don't block request processing.");
++        mBlockRequest = false;
++    }
++
++    request.mParams = copyRequestParams(params);
++    mPendingRequests.push_back(request);
++
++    if (!mActive) {
++        mActive = true;
++    }
++
++    mRequestSignal.signal();
++    return OK;
++}
++
++shared_ptr<Parameters>
++RequestThread::copyRequestParams(const Parameters *srcParams)
++{
++    if (srcParams == nullptr)
++        return nullptr;
++
++    if (mReqParamsPool.empty()) {
++        shared_ptr<Parameters> sParams = std::make_shared<Parameters>();
++        CheckError(!sParams, nullptr, "%s: no memory!", __func__);
++        mReqParamsPool.push(sParams);
++    }
++
++    shared_ptr<Parameters> sParams = mReqParamsPool.front();
++    mReqParamsPool.pop();
++    *sParams = *srcParams;
++    return sParams;
++}
++
++int RequestThread::waitFrame(int streamId, camera_buffer_t **ubuffer)
++{
++    FrameQueue& frameQueue = mOutputFrames[streamId];
++    ConditionLock lock(frameQueue.mFrameMutex);
++
++    while (frameQueue.mFrameQueue.empty()) {
++        int ret = frameQueue.mFrameAvailableSignal.waitRelative(
++                      lock,
++                      kWaitFrameDuration * SLOWLY_MULTIPLIER);
++        if (!mActive) return INVALID_OPERATION;
++
++        if (ret == TIMED_OUT) {
++            LOGW("@%s, mCameraId:%d, time out happens, wait recovery", __func__, mCameraId);
++            return ret;
++        }
++    }
++
++    shared_ptr<CameraBuffer> camBuffer = frameQueue.mFrameQueue.front();
++    frameQueue.mFrameQueue.pop();
++    *ubuffer = camBuffer->getUserBuffer();
++
++    LOG2("@%s, frame returned. camera id:%d, stream id:%d", __func__, mCameraId, streamId);
++
++    return OK;
++}
++
++int RequestThread::wait1stRequestDone()
++{
++    LOG1("%s", __func__);
++    int ret = OK;
++    ConditionLock lock(mFirstRequestLock);
++    if (mFirstRequest) {
++        LOG1("%s, waiting the first request done", __func__);
++        ret = mFirstRequestSignal.waitRelative(
++                  lock,
++                  kWaitFirstRequestDoneDuration * SLOWLY_MULTIPLIER);
++        if (ret == TIMED_OUT)
++            LOGE("@%s: Wait 1st request timed out", __func__);
++    }
++
++    return ret;
++}
++
++void RequestThread::handleEvent(EventData eventData)
++{
++    if (!mActive) return;
++
++    /* Notes:
++      * There should be only one of EVENT_ISYS_FRAME
++      * and EVENT_PSYS_FRAME registered.
++      * There should be only one of EVENT_xx_STATS_BUF_READY
++      * registered.
++      */
++    switch (eventData.type) {
++        case EVENT_ISYS_FRAME:
++        case EVENT_PSYS_FRAME:
++            {
++                AutoMutex l(mPendingReqLock);
++                if (mRequestsInProcessing > 0) {
++                    mRequestsInProcessing--;
++                }
++                // Continue process(that maight be blocked due to many requests in flight).
++                if (!mPendingRequests.empty()) {
++                    mRequestSignal.signal();
++                }
++            }
++            break;
++        case EVENT_PSYS_STATS_BUF_READY:
++            {
++                TRACE_LOG_POINT("RequestThread", "receive the stat event");
++                AutoMutex l(mPendingReqLock);
++                if (mBlockRequest) {
++                    mBlockRequest = false;
++                    mRequestSignal.signal();
++                }
++            }
++            break;
++        case EVENT_ISYS_SOF: {
++            AutoMutex l(mPendingReqLock);
++            mLastEofSeq = eventData.data.sync.sequence - 1;
++            break;
++        }
++        case EVENT_FRAME_AVAILABLE:
++            {
++                if (eventData.buffer->getUserBuffer() != &mFakeReqBuf) {
++                    int streamId = eventData.data.frameDone.streamId;
++                    FrameQueue& frameQueue = mOutputFrames[streamId];
++
++                    AutoMutex lock(frameQueue.mFrameMutex);
++                    bool needSignal = frameQueue.mFrameQueue.empty();
++                    frameQueue.mFrameQueue.push(eventData.buffer);
++                    if (needSignal) {
++                        frameQueue.mFrameAvailableSignal.signal();
++                    }
++                } else {
++                    LOG2("%s: fake request return %ld", __func__, eventData.buffer->getSequence());
++                }
++
++                AutoMutex l(mPendingReqLock);
++                // Insert fake request if no any request in the HAL to keep 3A running
++                if (mGet3AStatWithFakeRequest &&
++                    eventData.buffer->getSequence() >= mLastPredictSeq &&
++                    mPendingRequests.empty()) {
++                    LOGW("No request, insert fake req after req %d to keep 3A stats update",
++                         mLastRequestId);
++                    CameraRequest fakeRequest;
++                    fakeRequest.mBufferNum = 1;
++                    fakeRequest.mBuffer[0] = &mFakeReqBuf;
++                    mFakeReqBuf.sequence = -1;
++                    mPendingRequests.push_back(fakeRequest);
++                    mRequestSignal.signal();
++                }
++            }
++            break;
++        default:
++            {
++                LOGW("Unknown event type %d", eventData.type);
++            }
++            break;
++    }
++}
++
++/**
++ * Get the next request for processing.
++ * Return false if no pending requests or it is not ready for reconfiguration.
++ */
++bool RequestThread::fetchNextRequest(CameraRequest& request)
++{
++    ConditionLock lock(mPendingReqLock);
++    if (isReconfigurationNeeded() && !isReadyForReconfigure()) {
++        return false;
++    }
++
++    if (mPendingRequests.empty()) {
++        return false;
++    }
++
++    request = mPendingRequests.front();
++    mRequestsInProcessing++;
++    mPendingRequests.pop_front();
++    LOG2("@%s, mRequestsInProcessing %d", __func__, mRequestsInProcessing);
++    return true;
++}
++
++/**
++ * Check if ConfigMode is changed or not.
++ * If new ConfigMode is different with previous configured ConfigMode,
++ * return true.
++ */
++bool RequestThread::isReconfigurationNeeded()
++{
++    bool needReconfig = (mUserConfigMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO &&
++                         PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
++                         mNeedReconfigPipe &&
++                         (mReconfigPipeScore >= PlatformData::getPipeSwitchDelayFrame(mCameraId)));
++    LOG2("%s: need reconfigure %d, score %d, decision %d",
++         __func__, mNeedReconfigPipe, mReconfigPipeScore, needReconfig);
++    return needReconfig;
++}
++
++/**
++ * If reconfiguration is needed, there are 2 extra conditions for reconfiguration:
++ * 1, there is no buffer in processing; 2, there is buffer in mPendingRequests.
++ * Return true if reconfiguration is ready.
++ */
++bool RequestThread::isReadyForReconfigure()
++{
++    return (!mPendingRequests.empty() && mRequestsInProcessing == 0);
++}
++
++bool RequestThread::threadLoop()
++{
++    bool restart = false;
++    {
++         ConditionLock lock(mPendingReqLock);
++
++         bool waitProcessing = blockRequest() || mPendingRequests.empty();
++         if (waitProcessing) {
++            int ret = mRequestSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
++            waitProcessing = blockRequest() || mPendingRequests.empty();
++            if (ret == TIMED_OUT || waitProcessing) {
++                LOGW("%s: wait event time out", __func__);
++                return true;
++            }
++        }
++
++        restart = isReconfigurationNeeded();
++    }
++
++    if (!mActive) {
++        return false;
++    }
++
++    CameraRequest request;
++    if (fetchNextRequest(request)) {
++        // Update for reconfiguration
++        if (request.mParams.get()) {
++            setConfigureModeByParam(*(request.mParams.get()));
++        }
++        // Re-check
++        if (restart && isReconfigurationNeeded()) {
++            handleReconfig();
++        }
++
++        handleRequest(request);
++    }
++    return true;
++}
++
++void RequestThread::handleReconfig()
++{
++    LOG1("%s, ConfigMode change from %x to %x", __func__,
++            mStreamConfig.operation_mode, mRequestConfigMode);
++    mStreamConfig.operation_mode = mRequestConfigMode;
++    EventConfigData configData;
++    configData.streamList = &mStreamConfig;
++    EventData eventData;
++    eventData.type = EVENT_DEVICE_RECONFIGURE;
++    eventData.data.config = configData;
++    notifyListeners(eventData);
++    mNeedReconfigPipe = false;
++    mReconfigPipeScore = 0;
++    return;
++}
++
++void RequestThread::handleRequest(CameraRequest& request)
++{
++    long predictSequence = mLastPredictSeq + 1;
++    if (mLastPredictSeq < 0) {
++        predictSequence = PlatformData::getInitialSkipFrame(mCameraId);
++    } else if (predictSequence < mLastEofSeq) {
++        // Drop early frames
++        predictSequence = mLastEofSeq;
++    }
++
++    // Raw reprocessing case, don't run 3A.
++    if (request.mBuffer[0]->sequence >= 0 && request.mBuffer[0]->timestamp > 0) {
++        predictSequence = request.mBuffer[0]->sequence;
++        if (request.mParams.get()) {
++            mParamGenerator->updateParameters(predictSequence, request.mParams.get());
++        }
++    } else {
++        if (request.mParams.get()) {
++            m3AControl->setParameters(*request.mParams);
++        }
++        m3AControl->run3A(mPerframeControlSupport? &predictSequence : nullptr);
++
++        // Check the final prediction value
++        if (predictSequence <= mLastPredictSeq) {
++            LOGW("predict %ld error! should > %ld", predictSequence, mLastPredictSeq);
++            predictSequence = mLastPredictSeq + 1;
++        }
++
++        mLastPredictSeq = predictSequence;
++        mLastRequestId++;
++        mParamGenerator->saveParameters(mLastPredictSeq, mLastRequestId, request.mParams.get());
++    }
++    LOG2("%s: Process request: %ld:%ld, out buffer %d, param? %s", __func__,
++          mLastRequestId, predictSequence, request.mBufferNum,
++          request.mParams.get() ? "true" : "false");
++
++    // Sent event to handle request buffers
++    EventRequestData requestData;
++    requestData.bufferNum = request.mBufferNum;
++    requestData.buffer = request.mBuffer;
++    requestData.param = request.mParams.get();
++    requestData.settingSeq = predictSequence;
++    EventData eventData;
++    eventData.type = EVENT_PROCESS_REQUEST;
++    eventData.data.request = requestData;
++    notifyListeners(eventData);
++
++    // Recycle params ptr for re-using
++    if (request.mParams) {
++        AutoMutex l(mPendingReqLock);
++        mReqParamsPool.push(request.mParams);
++    }
++
++    {
++        AutoMutex l(mFirstRequestLock);
++        if (mFirstRequest) {
++            LOG1("%s: first request done", __func__);
++            mFirstRequest = false;
++            mFirstRequestSignal.signal();
++        }
++    }
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.h b/camera/hal/intel/ipu6/src/core/RequestThread.h
+new file mode 100644
+index 000000000000..dba2fd19c90a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/RequestThread.h
+@@ -0,0 +1,154 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <deque>
++
++#include "iutils/Thread.h"
++#include "PlatformData.h"
++#include "Parameters.h"
++#include "AiqUnit.h"
++#include "Parameters.h"
++#include "ParameterGenerator.h"
++
++namespace icamera {
++
++/*
++ * The RequestThread is used to assist CameraDevice to handle request(qbuf/dqbuf).
++ */
++class RequestThread : public Thread, public EventSource, public EventListener {
++public:
++    RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen);
++    ~RequestThread();
++
++    bool threadLoop();
++    void requestExit();
++
++    void handleEvent(EventData eventData);
++
++    /**
++     * \Clear pending requests.
++     */
++    void clearRequests();
++
++    /**
++     * \Accept requests from user.
++     */
++    int processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters * params);
++
++    int waitFrame(int streamId, camera_buffer_t **ubuffer);
++
++    /**
++     * \Block the caller until the first request is processed.
++     */
++    int wait1stRequestDone();
++
++    /**
++     * \brief configure the streams, devices and post processor.
++     *
++     * \param streamList: all the streams info
++     *
++     * \return OK if succeed and BAD_VALUE if failed
++     */
++    int configure(const stream_config_t *streamList);
++
++    /**
++     * \brief get stream config in request thread.
++     */
++    stream_config_t getStreamConfig() { return mStreamConfig; };
++
++    /**
++     * \brief set request configure mode by parameters.
++     */
++    void setConfigureModeByParam(const Parameters& param);
++
++private:
++    int mCameraId;
++    AiqUnitBase *m3AControl;
++    ParameterGenerator *mParamGenerator;
++    bool mPerframeControlSupport;
++    bool mGet3AStatWithFakeRequest;
++    camera_buffer_t mFakeReqBuf;
++    std::shared_ptr<CameraBuffer> mFakeBuffer;
++
++    struct CameraRequest {
++        CameraRequest() : mBufferNum(0), mParams(nullptr) {
++            CLEAR(mBuffer);
++        }
++
++        int mBufferNum;
++        camera_buffer_t *mBuffer[MAX_STREAM_NUMBER];
++        std::shared_ptr<Parameters> mParams;
++    };
++
++    std::shared_ptr<Parameters> copyRequestParams(const Parameters *params);
++
++    /**
++     * \Fetch one request from pending request Q for processing.
++     */
++    bool fetchNextRequest(CameraRequest& request);
++    bool isReadyForReconfigure();
++    bool isReconfigurationNeeded();
++    std::shared_ptr<Parameters> acquireParam();
++
++    void handleReconfig();
++    void handleRequest(CameraRequest& request);
++    bool blockRequest();
++
++    static const int kMaxRequests = MAX_BUFFER_COUNT;
++    static const nsecs_t kWaitFrameDuration = 5000000000; // 5s
++    static const nsecs_t kWaitDuration = 2000000000; // 2s
++    static const nsecs_t kWaitFirstRequestDoneDuration = 1000000000; // 1s
++
++    //Guard for all the pending requests
++    Mutex mPendingReqLock;
++    Condition mRequestSignal;
++    std::deque <CameraRequest> mPendingRequests;
++    std::queue <std::shared_ptr<Parameters> > mReqParamsPool;
++    int mRequestsInProcessing;
++
++    // Guard for the first request.
++    Mutex mFirstRequestLock;
++    Condition mFirstRequestSignal;
++    bool mFirstRequest;
++
++    // Internal used for restart function
++    ConfigMode mRequestConfigMode; // the ConfigMode is gotten from parameters set from user or AE result
++    ConfigMode mUserConfigMode; // user specified ConfigMode during initial configure
++    // Whether pipe need to reconfigure
++    bool mNeedReconfigPipe;
++    // Score indicate the num of consecutive configure mode settings, to make switch stable.
++    unsigned int  mReconfigPipeScore;
++    stream_config_t mStreamConfig;
++    stream_t mConfiguredStreams[MAX_STREAM_NUMBER];
++
++    struct FrameQueue {
++        Mutex mFrameMutex;
++        Condition mFrameAvailableSignal;
++        CameraBufQ mFrameQueue;
++    };
++    FrameQueue mOutputFrames[MAX_STREAM_NUMBER];
++    bool mActive;
++
++    long mLastRequestId;
++    long mLastPredictSeq;
++    long mLastEofSeq;
++    bool mBlockRequest;  // Process the 2nd or 3th request after the 1st 3A event
++                         // to avoid unstable AWB at the beginning of stream on
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
+new file mode 100644
+index 000000000000..7af50e24b747
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
+@@ -0,0 +1,331 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SensorHwCtrl"
++
++#include <limits.h>
++
++#include <linux/types.h>
++#include <linux/v4l2-controls.h>
++
++#include "iutils/CameraLog.h"
++
++#include "SensorHwCtrl.h"
++#include "V4l2DeviceFactory.h"
++#include "PlatformData.h"
++
++using std::vector;
++
++namespace icamera {
++
++SensorHwCtrl::SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev):
++        mPixelArraySubdev(pixelArraySubdev),
++        mSensorOutputSubdev(sensorOutputSubdev),
++        mCameraId(cameraId),
++        mHorzBlank(0),
++        mVertBlank(0),
++        mCropWidth(0),
++        mCropHeight(0),
++        mCurFll(0),
++        mCalculatingFrameDuration(true)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++}
++
++SensorHwCtrl::~SensorHwCtrl()
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++}
++
++SensorHwCtrl* SensorHwCtrl::createSensorCtrl(int cameraId)
++{
++    if (!PlatformData::isIsysEnabled(cameraId)) {
++        return new DummySensor(cameraId);
++    }
++
++    std::string subDevName;
++    SensorHwCtrl* sensorCtrl = nullptr;
++    int ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_ARRAY, subDevName);
++    if (ret == OK) {
++        LOG1("%s ArraySubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
++        V4L2Subdevice* pixelArraySubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
++
++        V4L2Subdevice* pixelOutputSubdev = nullptr;
++        // Binner and Scaler subdev only exits in CrlModule driver
++        if (PlatformData::isUsingCrlModule(cameraId)) {
++            subDevName.clear();
++            ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_SCALER, subDevName);
++            if (ret == OK) {
++                LOG1("%s ScalerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
++                pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
++            } else {
++                subDevName.clear();
++                ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_BINNER, subDevName);
++                if (ret == OK) {
++                    LOG1("%s BinnerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
++                    pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
++                }
++            }
++        }
++
++        sensorCtrl = new SensorHwCtrl(cameraId, pixelArraySubdev, pixelOutputSubdev);
++    } else {
++        LOG1("%s create a dummy sensor ctrl for camera id:%d", __func__, cameraId);
++        sensorCtrl = new DummySensor(cameraId);
++    }
++    return sensorCtrl;
++}
++
++int SensorHwCtrl::getActivePixelArraySize(int &width, int &height, int &pixelCode)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    int status = mPixelArraySubdev->GetPadFormat(0, &width, &height, &pixelCode);
++    mCropWidth = width;
++    mCropHeight = height;
++
++    LOG2("@%s, width:%d, height:%d, status:%d", __func__, width, height, status);
++    return status;
++}
++
++int SensorHwCtrl::getPixelRate(int &pixelRate)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    int ret = mPixelArraySubdev->GetControl(V4L2_CID_PIXEL_RATE, &pixelRate);
++
++    LOG2("@%s, pixelRate:%d, ret:%d", __func__, pixelRate, ret);
++
++    return ret;
++}
++
++int SensorHwCtrl::setTestPatternMode(int32_t testPatternMode)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    LOG2("@%s, testPatternMode: %d", __func__, testPatternMode);
++    return mPixelArraySubdev->SetControl(V4L2_CID_TEST_PATTERN, testPatternMode);
++}
++
++int SensorHwCtrl::setExposure(const vector<int>& coarseExposures, const vector<int>& fineExposures)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++    CheckError((coarseExposures.empty() || fineExposures.empty()), BAD_VALUE, "No exposure data!");
++
++    LOG2("%s coarseExposure=%d fineExposure=%d", __func__, coarseExposures[0], fineExposures[0]);
++    LOG2("SENSORCTRLINFO: exposure_value=%d", coarseExposures[0]);
++    return mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, coarseExposures[0]);
++}
++
++int SensorHwCtrl::setGains(const vector<int>& analogGains, const vector<int>& digitalGains)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++    CheckError((analogGains.empty() || digitalGains.empty()), BAD_VALUE, "No gain data!");
++
++	int ret = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, analogGains[0]);
++	ret |= mPixelArraySubdev->SetControl(V4L2_CID_DIGITAL_GAIN, digitalGains[0]);
++    return ret;
++}
++
++int SensorHwCtrl::setLineLengthPixels(int llp)
++{
++    int status = OK;
++    LOG2("@%s, llp:%d", __func__, llp);
++
++    if (mCalculatingFrameDuration) {
++        int horzBlank = llp - mCropWidth;
++        if (mHorzBlank != horzBlank) {
++            status = mPixelArraySubdev->SetControl(V4L2_CID_HBLANK, horzBlank);
++        }
++    }
++
++    CheckError(status != OK, status, "failed to set llp.");
++
++    mHorzBlank = llp - mCropWidth;
++    return status;
++}
++
++int SensorHwCtrl::setFrameLengthLines(int fll)
++{
++    int status = OK;
++    LOG2("@%s, fll:%d", __func__, fll);
++
++    if (mCalculatingFrameDuration) {
++        int vertBlank = fll - mCropHeight;
++        if (mVertBlank != vertBlank) {
++            status = mPixelArraySubdev->SetControl(V4L2_CID_VBLANK, vertBlank);
++        }
++    }
++
++    mCurFll = fll;
++
++    CheckError(status != OK, status, "failed to set fll.");
++
++    mVertBlank = fll - mCropHeight;
++    return status;
++}
++
++int SensorHwCtrl::setFrameDuration(int llp, int fll)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    int status = OK;
++    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
++
++    /* only set them to driver when llp or fll is not 0 */
++    if (llp) {
++        status = setLineLengthPixels(llp);
++    }
++
++    if (fll) {
++        status |= setFrameLengthLines(fll);
++    }
++
++    return status;
++}
++
++int SensorHwCtrl::getLineLengthPixels(int &llp)
++{
++    int status = OK;
++
++    if (mCalculatingFrameDuration) {
++        int horzBlank = 0;
++        status = mPixelArraySubdev->GetControl(V4L2_CID_HBLANK, &horzBlank);
++        if (status == OK) {
++            mHorzBlank = horzBlank;
++            llp = horzBlank + mCropWidth;
++        }
++    }
++
++    LOG2("@%s, llp:%d", __func__, llp);
++    CheckError(status != OK, status, "failed to get llp.");
++
++    return status;
++}
++
++int SensorHwCtrl::getFrameLengthLines(int &fll)
++{
++    int status = OK;
++
++    if (mCalculatingFrameDuration) {
++        int vertBlank = 0;
++        status = mPixelArraySubdev->GetControl(V4L2_CID_VBLANK, &vertBlank);
++        if (status == OK) {
++            mVertBlank = vertBlank;
++            fll = vertBlank + mCropHeight;
++        }
++    }
++
++    LOG2("@%s, fll:%d", __func__, fll);
++    CheckError(status != OK, status, "failed to get fll.");
++
++    return status;
++}
++
++int SensorHwCtrl::getFrameDuration(int &llp, int &fll)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    int status = getLineLengthPixels(llp);
++
++    status |= getFrameLengthLines(fll);
++    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
++
++    return status;
++}
++
++int SensorHwCtrl::getVBlank(int &vblank)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    vblank = mVertBlank;
++    LOG2("@%s, vblank:%d", __func__, vblank);
++
++    return OK;
++}
++
++/**
++ * get exposure range value from sensor driver
++ *
++ * \param[OUT] coarse_exposure: exposure min value
++ * \param[OUT] fine_exposure: exposure max value
++ * \param[OUT] exposure_step: step of exposure
++ * V4L2 does not support FINE_EXPOSURE setting
++ *
++ * \return OK if successfully.
++ */
++int SensorHwCtrl::getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
++
++    v4l2_queryctrl exposure = {};
++    exposure.id = V4L2_CID_EXPOSURE;
++    int status = mPixelArraySubdev->QueryControl(&exposure);
++    CheckError(status != OK, status, "Couldn't get exposure Range status:%d", status);
++
++    exposureMin = exposure.minimum;
++    exposureMax = exposure.maximum;
++    exposureStep = exposure.step;
++    LOG2("@%s, exposureMin:%d, exposureMax:%d, exposureStep:%d",
++        __func__, exposureMin, exposureMax, exposureStep);
++
++    return status;
++}
++
++int SensorHwCtrl::setFrameRate(float fps)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
++    CheckError(!mSensorOutputSubdev, NO_INIT, "sensor output sub device is not set");
++
++    LOG2("%s FPS is: %f", __func__, fps);
++
++    struct v4l2_queryctrl query;
++    CLEAR(query);
++    query.id = V4L2_CID_LINK_FREQ;
++    int status = mSensorOutputSubdev->QueryControl(&query);
++    CheckError(status != OK, status, "Couldn't get V4L2_CID_LINK_FREQ, status:%d", status);
++
++    LOG2("@%s, query V4L2_CID_LINK_FREQ:, default_value:%d, maximum:%d, minimum:%d, step:%d",
++        __func__, query.default_value, query.maximum, query.minimum, query.step);
++
++    int mode = 0;
++    if (query.maximum == query.minimum) {
++        mode = query.default_value;
++    } else {
++        /***********************************************************************************
++         * WA: This heavily depends on sensor driver implementation, need to find a graceful
++         * solution.
++         * imx185:
++         * When fps larger than 30, should switch to high speed mode, currently only
++         * 0, 1, 2 are available. 0 means 720p 30fps, 1 means 2M 30fps, and 2 means 2M 60fps.
++         * imx290:
++         * 0 and 1 available, for 30 and higher FPS.
++         ***********************************************************************************/
++        mode = (fps > 30) ? query.maximum : (query.maximum - 1);
++    }
++    LOG2("@%s, set V4L2_CID_LINK_FREQ to %d", __func__, mode);
++    return mSensorOutputSubdev->SetControl(V4L2_CID_LINK_FREQ, mode);
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
+new file mode 100644
+index 000000000000..c05f5329eff7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
+@@ -0,0 +1,99 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <vector>
++
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++/**
++ * Base class for sensor control might be inherited by ones have different sensor driver
++ */
++class SensorHwCtrl {
++
++public:
++    static SensorHwCtrl* createSensorCtrl(int cameraId);
++    SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev);
++    virtual ~SensorHwCtrl();
++
++    virtual int setTestPatternMode(int32_t testPatternMode);
++    virtual int getPixelRate(int &pixelRate);
++    virtual int setExposure(const std::vector<int>& coarseExposures,
++                            const std::vector<int>& fineExposures);
++    virtual int setGains(const std::vector<int>& analogGains, const std::vector<int>& digitalGains);
++    virtual int setFrameDuration(int llp, int fll);
++    virtual int getFrameDuration(int &llp, int &fll);
++    virtual int getVBlank(int &vblank);
++    virtual int getActivePixelArraySize(int &width, int &height, int &pixelCode);
++    virtual int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep);
++
++    virtual int setFrameRate(float fps);
++private:
++    int setLineLengthPixels(int llp);
++    int getLineLengthPixels(int &llp);
++    int setFrameLengthLines(int fll);
++    int getFrameLengthLines(int &fll);
++
++private:
++
++    V4L2Subdevice* mPixelArraySubdev;
++    V4L2Subdevice* mSensorOutputSubdev;
++    int mCameraId;
++    int mHorzBlank;
++    int mVertBlank;
++    int mCropWidth;
++    int mCropHeight;
++
++    // Current frame length lines
++    int mCurFll;
++
++    /**
++     * if mCalculatingFrameDuration is true, it means sensor can't set/get llp/fll directly,
++     * use HBlank/VBlank to calculate it.
++     */
++    bool mCalculatingFrameDuration;
++}; //class SensorHwCtrl
++
++/**
++ * Dummy sensor hardware ctrl interface for those sensors cannot be controlled.
++ */
++class DummySensor : public SensorHwCtrl {
++public:
++    DummySensor(int cameraId) : SensorHwCtrl(cameraId, nullptr, nullptr) {}
++    ~DummySensor() {}
++
++    int setTestPatternMode(int32_t testPatternMode) { return OK; }
++    int setDevice(V4L2Subdevice* pixelArraySubdev) { return OK; }
++    int getPixelRate(int &pixelRate) { return OK; }
++    int setExposure(const std::vector<int>& coarseExposures,
++                    const std::vector<int>& fineExposures) { return OK; }
++    int setGains(const std::vector<int>& analogGains,
++                 const std::vector<int>& digitalGains) { return OK; }
++    int setFrameDuration(int llp, int fll) { return OK; }
++    int getFrameDuration(int &llp, int &fll) { return OK; }
++    int getVBlank(int &vblank) { return OK; }
++    int getActivePixelArraySize(int &width, int &height, int &code) { return OK; }
++    int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep) { return OK; }
++    int setFrameRate(float fps) { return OK; }
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SofSource.cpp b/camera/hal/intel/ipu6/src/core/SofSource.cpp
+new file mode 100644
+index 000000000000..58d1f42c2b88
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SofSource.cpp
+@@ -0,0 +1,201 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "SofSource"
++
++#include <poll.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "V4l2DeviceFactory.h"
++#include "PlatformData.h"
++
++#include "SofSource.h"
++
++namespace icamera {
++
++SofSource::SofSource(int cameraId) :
++    mPollThread(nullptr),
++    mCameraId(cameraId),
++    mIsysReceiverSubDev(nullptr),
++    mExitPending(false)
++{
++    LOG1("%s: SofSource is constructed", __func__);
++
++    mSofDisabled = !PlatformData::isEnableAIQ(mCameraId);
++
++    mSofDisabled = mSofDisabled || !PlatformData::isIsysEnabled(cameraId);
++}
++
++SofSource::~SofSource()
++{
++    LOG1("%s: SofSource is distructed.", __func__);
++}
++
++int SofSource::init()
++{
++    if (mSofDisabled) {
++        return OK;
++    }
++
++    mPollThread = new PollThread(this);
++
++    return OK;
++}
++
++int SofSource::deinit()
++{
++    if (mSofDisabled) {
++        return OK;
++    }
++
++    int status = deinitDev();
++    mPollThread->join();
++    delete mPollThread;
++    return status;
++}
++
++int SofSource::initDev()
++{
++    //Create and open receiver subdevice.
++    std::string subDeviceNodeName;
++
++    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
++        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
++    }
++
++    deinitDev();
++
++    mIsysReceiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
++
++    int status = mIsysReceiverSubDev->SubscribeEvent(V4L2_EVENT_FRAME_SYNC);
++    CheckError(status != OK, status, "%s: Failed to subscribe sync event 0", __func__);
++    LOG1("%s: Using SOF event id 0 for sync", __func__);
++
++    return OK;
++}
++
++int SofSource::deinitDev()
++{
++    if (mIsysReceiverSubDev == nullptr) return OK;
++
++    int status = 0;
++    status = mIsysReceiverSubDev->UnsubscribeEvent(V4L2_EVENT_FRAME_SYNC);
++    if (status == OK) {
++        LOG1("%s: Unsubscribe SOF event id 0 done", __func__);
++    } else {
++        LOGE("%s: Failed to unsubscribe SOF event 0, status: %d", __func__, status);
++    }
++
++    return status;
++}
++
++int SofSource::configure()
++{
++    if (mSofDisabled) {
++        return OK;
++    }
++
++    return initDev();
++}
++
++int SofSource::start()
++{
++    LOG1("%s", __func__);
++    if (mSofDisabled) {
++        return OK;
++    }
++
++    int status = mPollThread->run("SofSource", PRIORITY_URGENT_AUDIO);
++    mExitPending = false;
++    return status;
++
++}
++
++int SofSource::stop()
++{
++    LOG1("%s", __func__);
++    if (mSofDisabled) {
++        return OK;
++    }
++
++    mExitPending = true;
++    int status = mPollThread->requestExitAndWait();
++    return status;
++
++}
++
++int SofSource::poll()
++{
++    int ret = 0;
++    const int pollTimeoutCount = 10;
++    const int pollTimeout = 1000;
++
++    std::vector<V4L2Device*> pollDevs;
++    pollDevs.push_back(mIsysReceiverSubDev);
++    V4L2DevicePoller poller {pollDevs, -1};
++
++    vector<V4L2Device*> readyDevices;
++
++    LOG2("@%s", __func__);
++
++    int timeOutCount = pollTimeoutCount;
++
++    while (timeOutCount-- && ret == 0) {
++
++        ret = poller.Poll(pollTimeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
++
++        if (ret == 0 && mExitPending) {
++            //timed out
++            LOGD("@%s: Timedout or thread is not running, ret = %d", __func__, ret);
++            return BAD_VALUE;
++        }
++    }
++
++    //handle the poll error
++    if (ret < 0) {
++        if (mExitPending) {
++            //Exiting, no error
++            return 0;
++        }
++
++        LOGE("%s: Poll error", __func__);
++        return ret;
++    } else if (ret == 0) {
++        LOGD("@%s, Sof poll timeout.", __func__);
++        return 0;
++    }
++
++    struct v4l2_event event;
++    CLEAR(event);
++    mIsysReceiverSubDev->DequeueEvent(&event);
++
++    EventDataSync syncData;
++    syncData.sequence = event.u.frame_sync.frame_sequence;
++    syncData.timestamp.tv_sec = event.timestamp.tv_sec;
++    syncData.timestamp.tv_usec = (event.timestamp.tv_nsec / 1000);
++    LOG2("%s:sof event sequence %ld, event.id %u", __func__, syncData.sequence, event.id);
++    TRACE_LOG_POINT("SofSource", "receive sof event", MAKE_COLOR(syncData.sequence),
++                    syncData.sequence);
++    EventData eventData;
++    eventData.type = EVENT_ISYS_SOF;
++    eventData.buffer = nullptr;
++    eventData.data.sync = syncData;
++    notifyListeners(eventData);
++
++    return 0;
++}
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/SofSource.h b/camera/hal/intel/ipu6/src/core/SofSource.h
+new file mode 100644
+index 000000000000..3b7ddf02556a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SofSource.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <vector>
++
++#include "CameraEvent.h"
++
++#include "iutils/Thread.h"
++
++namespace icamera {
++
++//Event source for SOF event polled from subdevice.
++class SofSource : public EventSource {
++public:
++    SofSource(int cameraId);
++    ~SofSource();
++    int init();
++    int deinit();
++    int configure();
++    int start();
++    int stop();
++private:
++    int initDev();
++    int deinitDev();
++
++private:
++    class PollThread : public Thread {
++        SofSource *mSofSource;
++        public:
++            PollThread(SofSource *sofSource)
++                    : mSofSource(sofSource) { }
++
++            virtual bool threadLoop() {
++                int ret = mSofSource->poll();
++                return (ret == 0) ? true : false;
++            }
++    };
++    PollThread* mPollThread;
++    int mCameraId;
++    V4L2Subdevice* mIsysReceiverSubDev;
++    bool mExitPending;
++    bool mSofDisabled;
++
++    int poll();
++};
++}
+diff --git a/camera/hal/intel/ipu6/src/core/StreamSource.h b/camera/hal/intel/ipu6/src/core/StreamSource.h
+new file mode 100644
+index 000000000000..1fff90dacdb7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/StreamSource.h
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "BufferQueue.h"
++#include "iutils/Errors.h"
++
++namespace icamera {
++
++/**
++ * \interface StreamSource
++ * It's an abstract interface for buffer producers, like CaptureUnit, FileSource
++ * or external source producer.
++ */
++class StreamSource : public BufferProducer {
++public:
++    StreamSource(int memType) : BufferProducer(memType) {}
++    virtual ~StreamSource() {}
++    /* Initialize stream source */
++    virtual int init() = 0;
++    /* Deinitialize stream source */
++    virtual void deinit() = 0;
++    /* Configure stream source */
++    virtual int configure(const std::map<Port, stream_t>& outputFrames,
++                          const std::vector<ConfigMode>& configModes) = 0;
++    /* Start stream source */
++    virtual int start() = 0;
++    /* Stop stream source */
++    virtual int stop() = 0;
++    /* Remove all liateners */
++    virtual void removeAllFrameAvailableListener() = 0;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
+new file mode 100644
+index 000000000000..9652d6558405
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
+@@ -0,0 +1,158 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SwImageProcessor"
++
++#include "iutils/Utils.h"
++#include "iutils/SwImageConverter.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++
++#include "PlatformData.h"
++#include "CameraBuffer.h"
++
++#include "SwImageProcessor.h"
++
++namespace icamera {
++
++SwImageProcessor::SwImageProcessor(int cameraId) : mCameraId(cameraId)
++{
++    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
++    LOG1("@%s camera id:%d", __func__, mCameraId);
++
++    mProcessThread = new ProcessThread(this);
++}
++
++SwImageProcessor::~SwImageProcessor()
++{
++    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
++
++    mProcessThread->join();
++    delete mProcessThread;
++}
++
++int SwImageProcessor::start()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s", __func__);
++    AutoMutex   l(mBufferQueueLock);
++
++    int memType = mOutputFrameInfo.begin()->second.memType;
++    CheckError(memType == V4L2_MEMORY_DMABUF, BAD_VALUE,
++          "@%s: DMABUF is not supported in SwProcessor as output", __func__);
++
++    int ret = allocProducerBuffers(mCameraId, MAX_BUFFER_COUNT);
++    CheckError(ret != OK, ret, "@%s: Allocate Buffer failed", __func__);
++    mThreadRunning = true;
++    mProcessThread->run("SwImageProcessor", PRIORITY_NORMAL);
++
++    return 0;
++}
++
++void SwImageProcessor::stop()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("%s", __func__);
++
++    mProcessThread->requestExit();
++    {
++        AutoMutex l(mBufferQueueLock);
++        mThreadRunning = false;
++        //Wakeup the thread to exit
++        mFrameAvailableSignal.signal();
++        mOutputAvailableSignal.signal();
++    }
++
++    mProcessThread->requestExitAndWait();
++
++    // Thread is not running. It is safe to clear the Queue
++    clearBufferQueues();
++}
++
++int SwImageProcessor::processNewFrame()
++{
++    PERF_CAMERA_ATRACE();
++    LOG2("%s", __func__);
++
++    int ret = OK;
++    std::map<Port, std::shared_ptr<CameraBuffer> > srcBuffers, dstBuffers;
++    std::shared_ptr<CameraBuffer> cInBuffer;
++    Port inputPort = INVALID_PORT;
++
++    { // Auto lock mBufferQueueLock scope
++    ConditionLock lock(mBufferQueueLock);
++    ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
++
++    if (!mThreadRunning) return -1;
++
++    CheckError((ret < 0), -1, "@%s: wake up from the wait abnomal such as stop", __func__);
++
++    inputPort = srcBuffers.begin()->first;
++    cInBuffer = srcBuffers[inputPort];
++
++    for (auto& output: mOutputQueue) {
++        output.second.pop();
++    }
++
++    for (auto& input: mInputQueue) {
++        input.second.pop();
++    }
++    } // End of auto lock mBufferQueueLock scope
++
++    CheckError(!cInBuffer, BAD_VALUE, "Invalid input buffer.");
++
++    for (auto& dst : dstBuffers) {
++        Port port = dst.first;
++        std::shared_ptr<CameraBuffer> cOutBuffer = dst.second;
++        // If the output buffer is nullptr, that means user doesn't request that buffer,
++        // so it doesn't need to be handled here.
++        if (!cOutBuffer) {
++            continue;
++        }
++
++        //No Lock for this function make sure buffers are not freed before the stop
++        ret = SwImageConverter::convertFormat(cInBuffer->getWidth(), cInBuffer->getHeight(),
++                (unsigned char *)cInBuffer->getBufferAddr(), cInBuffer->getBufferSize(), cInBuffer->getFormat(),
++                (unsigned char *)cOutBuffer->getBufferAddr(), cOutBuffer->getBufferSize(), cOutBuffer->getFormat());
++        CheckError((ret < 0), ret, "format convertion failed with %d", ret);
++
++        if (CameraDump::isDumpTypeEnable(DUMP_SW_IMG_PROC_OUTPUT)) {
++            CameraDump::dumpImage(mCameraId, cOutBuffer, M_SWIPOP);
++        }
++
++        //update the interlaced field, sequence, and timestamp  from the src buf to dst buf
++        cOutBuffer->updateV4l2Buffer(*cInBuffer->getV4L2Buffer().Get());
++
++        //Notify listener: No lock here: mBufferConsumerList will not updated in this state
++        for (auto &it : mBufferConsumerList) {
++            it->onFrameAvailable(port, cOutBuffer);
++        }
++    }
++
++    {
++        PERF_CAMERA_ATRACE_PARAM3("sof.sequence", cInBuffer->getSequence(), "csi2_port", cInBuffer->getCsi2Port(), \
++                                    "virtual_channel", cInBuffer->getVirtualChannel());
++    }
++
++    // Return the buffers to the producer
++    if (mBufferProducer) {
++        mBufferProducer->qbuf(inputPort, cInBuffer);
++    }
++
++    return OK;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.h b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
+new file mode 100644
+index 000000000000..caf832608a73
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "BufferQueue.h"
++
++namespace icamera {
++
++/**
++  * SwImageProcessor runs the Image Process Alogirhtm in the CPU.
++  * It implements the BufferConsumer and BufferProducer Interface
++  * This class is for debug purpose when the PsysProcess is not ready.
++  */
++class SwImageProcessor: public BufferQueue {
++public:
++    SwImageProcessor(int cameraId);
++    virtual ~SwImageProcessor();
++
++    /**
++     * \brief Buffer producer Interface
++     */
++    virtual int     start();
++    virtual void    stop();
++
++private:
++    int processNewFrame();
++
++private:
++    int mCameraId;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.cpp b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
+new file mode 100644
+index 000000000000..0ebf7d52b471
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
+@@ -0,0 +1,198 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SyncManager"
++
++#include <sys/sysinfo.h>
++#include <math.h>
++#include "iutils/CameraLog.h"
++#include "SyncManager.h"
++
++namespace icamera {
++SyncManager *SyncManager::sInstance = nullptr;
++Mutex  SyncManager::sLock;
++
++#define SEC_TO_MS(sec) ((sec) * (1000))
++#define USEC_TO_MS(usec) ((usec) / (1000))
++
++const int max_vc_sync_count = 128;
++
++SyncManager* SyncManager::getInstance()
++{
++    AutoMutex lock(sLock);
++    if (sInstance == nullptr) {
++        sInstance = new SyncManager();
++    }
++
++    return sInstance;
++}
++
++void SyncManager::releaseInstance()
++{
++    AutoMutex lock(sLock);
++    LOG1("@%s", __func__);
++
++    if (sInstance) {
++        delete sInstance;
++        sInstance = nullptr;
++    }
++}
++
++SyncManager::SyncManager()
++{
++    LOG1("@%s", __func__);
++    AutoMutex lock(mLock);
++    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
++       for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
++           mCameraBufInfo[i][j].sequence = -1;
++           CLEAR(mCameraBufInfo[i][j].sof_ts);
++       }
++    }
++
++    mTotalSyncCamNum = 0;
++    for (int i = 0; i < MAX_CAMERA_NUMBER; i++)
++        mVcSyncCount[i] = 0;
++}
++
++SyncManager::~SyncManager()
++{
++    LOG1("@%s", __func__);
++}
++
++bool SyncManager::isSynced(int cameraId, long sequence)
++{
++    LOG1("@%s", __func__);
++    const int TIME_DIFF_MS = 2;
++    bool sync = true;
++    int index = sequence % MAX_BUFFER_COUNT;
++
++    AutoMutex lock(mLock);
++    camera_buf_info bufInfo = mCameraBufInfo[cameraId][index];
++
++    int  syncNum = 0;
++    bool isSync[MAX_CAMERA_NUMBER];
++    long frameSyncedMs[MAX_CAMERA_NUMBER];
++    long curFrameMs = USEC_TO_MS(bufInfo.sof_ts.tv_usec) + SEC_TO_MS(bufInfo.sof_ts.tv_sec);
++
++    //first step: To check whether the current frame is synced with others camera channel
++    //            if timestamp difference <= 2ms, then think the frame is synced
++    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
++        isSync[i] = false;
++        frameSyncedMs[i] = 0;
++        if (mCameraBufInfo[i][0].sequence == -1 || i == cameraId) {
++            continue;
++        }
++        for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
++            if (mCameraBufInfo[i][j].sequence >= 0) {
++                camera_buf_info &temp = mCameraBufInfo[i][j];
++                long tempFrameMs = USEC_TO_MS(temp.sof_ts.tv_usec) + SEC_TO_MS(temp.sof_ts.tv_sec);
++                if (abs(tempFrameMs - curFrameMs ) <= TIME_DIFF_MS) {
++                    isSync[syncNum] = true;
++                    frameSyncedMs[syncNum] = tempFrameMs;
++                    syncNum++;
++                    break;
++                }
++            }
++        }
++    }
++    //second step: if current frame is synced with frames from other cameraID,
++    //             to check whether other 3 channel frames synced or not
++    if (syncNum >= mTotalSyncCamNum - 1) {
++        for (int i = 0; i < mTotalSyncCamNum - 1; i++) {
++            if (isSync[i]) {
++                if ((i + 1 < mTotalSyncCamNum - 1) &&
++                        abs(frameSyncedMs[i]-frameSyncedMs[i+1]) <= TIME_DIFF_MS) {
++                    sync &= true;
++                } else if ((i + 1 == mTotalSyncCamNum - 1) &&
++                        abs(frameSyncedMs[i]-frameSyncedMs[0]) <= TIME_DIFF_MS) {
++                    sync &= true;
++                } else {
++                    sync &= false;
++                }
++            }
++        }
++    } else {
++        sync = false;
++    }
++    LOG1("Id:%d, sof_ts:%ldms, sequence:%ld sync %d", cameraId, curFrameMs, sequence, sync);
++    return sync;
++}
++
++void SyncManager::updateCameraBufInfo(int cameraId, camera_buf_info* info)
++{
++    LOG1("@%s", __func__);
++    int index = info->sequence % MAX_BUFFER_COUNT;
++    AutoMutex lock(mLock);
++    mCameraBufInfo[cameraId][index] = *info;
++}
++
++void SyncManager::updateSyncCamNum()
++{
++    AutoMutex l(mLock);
++    CheckError(mTotalSyncCamNum >= MAX_CAMERA_NUMBER, VOID_VALUE,
++               "%s: sync cameras enough!", __func__);
++    mTotalSyncCamNum++;
++}
++
++bool SyncManager::vcSynced(int vc)
++{
++    CheckError(vc >= MAX_CAMERA_NUMBER, false, "%s: vc %d error!", __func__, vc);
++
++    AutoMutex l(mVcSyncLock);
++    int count = mVcSyncCount[vc];
++    int minCount = INT_MAX;
++    int maxCount = 0;
++
++    for (int i = 0; i < mTotalSyncCamNum; i++) {
++        minCount = std::min(minCount, mVcSyncCount[i]);
++        maxCount = std::max(maxCount, mVcSyncCount[i]);
++    }
++
++    // Check again if status is circling back to 0.
++    // Most of time handling code won't be executed because condition is false.
++    if (maxCount - minCount > max_vc_sync_count / 2) {
++        minCount = max_vc_sync_count;
++        maxCount = 0;
++        for (int i = 0; i < mTotalSyncCamNum; i++) {
++            count = (mVcSyncCount[i] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
++            minCount = std::min(minCount, count);
++            maxCount = std::max(maxCount, count);
++        }
++        count = (mVcSyncCount[vc] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
++    }
++
++    if (count > minCount) {
++        LOGVCSYNC("vc %d ready: false", vc);
++        return false;
++    } else
++        return true;
++};
++
++void SyncManager::updateVcSyncCount(int vc)
++{
++    CheckError(vc >= MAX_CAMERA_NUMBER, VOID_VALUE, "%s: vc %d error!", __func__, vc);
++    AutoMutex l(mVcSyncLock);
++    mVcSyncCount[vc] = (mVcSyncCount[vc] + 1) % (max_vc_sync_count + 1);
++};
++
++void SyncManager::printVcSyncCount(void)
++{
++    AutoMutex l(mVcSyncLock);
++    for (int i = 0; i < mTotalSyncCamNum; i++)
++        LOGVCSYNC("[%d]", mVcSyncCount[i]);
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.h b/camera/hal/intel/ipu6/src/core/SyncManager.h
+new file mode 100644
+index 000000000000..c0a6af883817
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/SyncManager.h
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (C) 2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "PlatformData.h"
++
++namespace icamera {
++
++struct camera_buf_info {
++    long sequence;
++    struct timeval sof_ts;
++};
++class SyncManager {
++private:
++    //Prevent to create multiple instances
++    SyncManager();
++    ~SyncManager();
++public:
++     /**
++      * releaseInstance
++      * This function must be called when the hal is destroyed.
++      */
++    static void releaseInstance();
++    static SyncManager* getInstance();
++
++    bool isSynced(int cameraId, long sequence);
++    void updateCameraBufInfo(int cameraId, camera_buf_info* info);
++
++    void updateSyncCamNum();
++
++    bool vcSynced(int vc);
++    void updateVcSyncCount(int vc);
++    void printVcSyncCount();
++private:
++    static SyncManager* sInstance;
++    static Mutex sLock;
++    Mutex mLock;
++    struct camera_buf_info mCameraBufInfo[MAX_CAMERA_NUMBER][MAX_BUFFER_COUNT];
++
++    int mVcSyncCount[MAX_CAMERA_NUMBER];
++    Mutex mVcSyncLock;
++    int mTotalSyncCamNum;
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/core/TNRCommon.h b/camera/hal/intel/ipu6/src/core/TNRCommon.h
+new file mode 100644
+index 000000000000..9032c4539f53
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/TNRCommon.h
+@@ -0,0 +1,45 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_pal_types_isp_parameters_autogen.h"
++#include "tnr7us_parameters_definition.h"
++
++#define TNR7US_REFERENCE_BUFFER_COUNT 2
++#define TNR7US_RESTART_THRESHOLD 3
++
++namespace icamera {
++
++typedef struct Tnr7Param {
++    tnr_scale_1_0_t scale;
++    tnr7_ims_1_0_t ims;
++    tnr7_bc_1_0_t bc;
++    tnr7_blend_1_0_t blend;
++} Tnr7Param;
++
++typedef struct TnrResolution {
++    int width;
++    int height;
++} TnrResolution;
++
++typedef struct TnrRunInfo {
++    int32_t inHandle;
++    int32_t outHandle;
++    int32_t paramHandle;
++    int gain;
++} TnrRunInfo;
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
+new file mode 100644
+index 000000000000..a2ef2034514c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
+@@ -0,0 +1,482 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GPUExecutor"
++
++#include "GPUExecutor.h"
++
++extern "C" {
++#include <ia_cipf_css/ia_cipf_css.h>
++#include <ia_pal_types_isp_ids_autogen.h>
++}
++
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "3a/AiqResult.h"
++#include "3a/AiqResultStorage.h"
++#include "FormatUtils.h"
++#include "PSysDAG.h"
++#include "SyncManager.h"
++#include "ia_pal_output_data.h"
++#include "iutils/CameraDump.h"
++
++using std::map;
++using std::shared_ptr;
++using std::string;
++using std::vector;
++
++#define external_gpu_stage_uid(id) ia_fourcc(((id & 0xFF00) >> 8), id, 'E', 'X')
++
++namespace icamera {
++
++GPUExecutor::GPUExecutor(int cameraId, const ExecutorPolicy& policy, vector<string> exclusivePGs,
++                         PSysDAG* psysDag, shared_ptr<IGraphConfig> gc)
++        : PipeExecutor(cameraId, policy, exclusivePGs, psysDag, gc),
++          mTnr7usParam(nullptr),
++          mIntelTNR(nullptr),
++          mLastSequence(UINT32_MAX) {
++    LOG1("@%s %s", __func__, mName.c_str());
++}
++
++GPUExecutor::~GPUExecutor() {
++    LOG1("@%s %s", __func__, mName.c_str());
++    mPGExecutors.clear();
++}
++
++int GPUExecutor::initPipe() {
++    LOG1("@%s:%s", __func__, getName());
++    CheckError(mGraphConfig == nullptr, BAD_VALUE, "%s, the graph config is NULL, BUG!", __func__);
++
++    vector<IGraphType::PipelineConnection> connVector;
++
++    int ret = mGraphConfig->pipelineGetConnections(mPGNames, &connVector);
++    CheckError(ret != OK || connVector.empty(), ret, "Failed to get connections for executor:%s",
++               mName.c_str());
++
++    ret = createPGs();
++    CheckError(ret != OK, ret, "Failed to create PGs for executor: %s", mName.c_str());
++
++    ret = analyzeConnections(connVector);
++    CheckError(ret != OK, ret, "Failed to analyze connections for executor: %s", mName.c_str());
++
++    assignDefaultPortsForTerminals();
++    return OK;
++}
++
++// GPU executor doesn't have HW pg, create pg according to graph settings
++int GPUExecutor::createPGs() {
++    LOG1("@%s:%s", __func__, getName());
++
++    for (auto const& pgName : mPGNames) {
++        int pgId = mGraphConfig->getPgIdByPgName(pgName);
++        CheckError(pgId == -1, BAD_VALUE, "Cannot get PG ID for %s", pgName.c_str());
++        ExecutorUnit pgUnit;
++        pgUnit.pgId = pgId;
++        // GPU Executor doesn't have pg
++        pgUnit.pg = nullptr;
++        pgUnit.stageId = external_gpu_stage_uid(pgId);
++        mPGExecutors.push_back(pgUnit);
++    }
++    return OK;
++}
++
++int GPUExecutor::start() {
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    mProcessThread = new ProcessThread(this);
++
++    CheckError(mPGExecutors.empty(), UNKNOWN_ERROR, "PGExecutors couldn't be empty");
++    ExecutorUnit* tnrUnit = &mPGExecutors[0];
++    int ret = OK;
++    if (!tnrUnit->inputTerminals.empty()) {
++        ia_uid term = tnrUnit->inputTerminals.at(0);
++        CheckError(mTerminalsDesc.find(term) == mTerminalsDesc.end(), NO_INIT,
++                   "Can't find TerminalDescriptor");
++
++        const FrameInfo& frameInfo = mTerminalsDesc[term].frameDesc;
++        mIntelTNR = std::unique_ptr<IntelTNR7US>(new IntelTNR7US());
++        ret = mIntelTNR->init(frameInfo.mWidth, frameInfo.mHeight);
++        CheckError(ret, UNKNOWN_ERROR, "@%s: init tnr failed", __func__);
++    }
++    AutoMutex l(mBufferQueueLock);
++    ret = allocBuffers();
++    CheckError(ret, UNKNOWN_ERROR, "@%s: allocBuffers failed", __func__);
++    dumpPGs();
++
++    mThreadRunning = true;
++    mProcessThread->run(mName.c_str(), PRIORITY_NORMAL);
++
++    return ret;
++}
++
++void GPUExecutor::stop() {
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    mProcessThread->requestExitAndWait();
++
++    // Thread is not running. It is safe to clear the Queue
++    releaseBuffers();
++    clearBufferQueues();
++
++    delete mProcessThread;
++    mIntelTNR = nullptr;
++}
++
++int GPUExecutor::allocBuffers() {
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    releaseBuffers();
++
++    // Allocate buffers for producer executor (external)
++    // don't need to check mPGExecutors and inputTerminals, already check before
++    ia_uid term = mPGExecutors[0].inputTerminals.at(0);
++    Port inputPort = mTerminalsDesc[term].assignedPort;
++
++    int srcFmt = mTerminalsDesc[term].frameDesc.mFormat;
++    int srcWidth = mTerminalsDesc[term].frameDesc.mWidth;
++    int srcHeight = mTerminalsDesc[term].frameDesc.mHeight;
++    int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
++
++    for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++        shared_ptr<CameraBuffer> buf = std::make_shared<CameraBuffer>(
++            mCameraId, BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, i, srcFmt);
++        CheckError(!buf, NO_MEMORY, "@%s: fail to alloc CameraBuffer", __func__);
++
++        void* buffer = mIntelTNR->allocCamBuf(size, i);
++        CheckError(!buffer, NO_MEMORY, "@%s: fail to alloc shared memory", __func__);
++        buf->setUserBufferInfo(srcFmt, srcWidth, srcHeight, buffer);
++
++        mInternalBuffers[inputPort].push_back(buf);
++        mBufferProducer->qbuf(inputPort, buf);
++    }
++    int ret = mIntelTNR->allocRefBufs(size);
++    CheckError(ret, UNKNOWN_ERROR, "@%s: alloc tnr reference buffer failed", __func__);
++
++    mTnr7usParam = mIntelTNR->allocTnr7ParamBuf();
++    CheckError(!mTnr7usParam, NO_MEMORY, "@%s: Allocate Param buffer failed", __func__);
++    CLEAR(*mTnr7usParam);
++
++    // Allocate internal output buffers to support pipe execution without user output buffer
++    for (auto const& item : mOutputFrameInfo) {
++        int fmt = item.second.format;
++        int width = item.second.width;
++        int height = item.second.height;
++        int size = CameraUtils::getFrameSize(fmt, width, height, true);
++        shared_ptr<CameraBuffer> buf = CameraBuffer::create(
++            mCameraId, BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, fmt, width, height);
++        CheckError(!buf, NO_MEMORY, "@%s: Allocate internal output buffer failed", __func__);
++        mInternalOutputBuffers[item.first] = buf;
++    }
++
++    return OK;
++}
++
++void GPUExecutor::releaseBuffers() {
++    if (mIntelTNR) {
++        mIntelTNR->freeAllBufs();
++    }
++    // Release internel frame buffers
++    mInternalOutputBuffers.clear();
++    mInternalBuffers.clear();
++}
++
++int GPUExecutor::processNewFrame() {
++    PERF_CAMERA_ATRACE();
++
++    int ret = OK;
++    CameraBufferPortMap inBuffers, outBuffers;
++    // Wait frame buffers.
++    {
++        ConditionLock lock(mBufferQueueLock);
++        ret = waitFreeBuffersInQueue(lock, inBuffers, outBuffers);
++        // Already stopped
++        if (!mThreadRunning) return -1;
++
++        if (ret != OK) return OK;  // Wait frame buffer error should not involve thread exit.
++
++        CheckError(inBuffers.empty() || outBuffers.empty(), UNKNOWN_ERROR,
++                   "Failed to get input or output buffers.");
++
++        for (auto& output : mOutputQueue) {
++            output.second.pop();
++        }
++
++        for (auto& input : mInputQueue) {
++            input.second.pop();
++        }
++    }
++
++    // Check if the executor needs to run the actual pipeline.
++    // It only needs to run when there is at least one valid output buffer.
++    if (!hasValidBuffers(outBuffers)) {
++        // As an output edge, return the inBuffer when has no outBuffer,
++        for (const auto& item : inBuffers) {
++            mBufferProducer->qbuf(item.first, item.second);
++        }
++        return OK;
++    }
++
++    // Should find first not none input buffer instead of always use the first one.
++    shared_ptr<CameraBuffer> inBuf = inBuffers.begin()->second;
++    CheckError(!inBuf, UNKNOWN_ERROR, "@%s: no valid input buffer", __func__);
++    v4l2_buffer_t inV4l2Buf = *inBuf->getV4L2Buffer().Get();
++
++    // Fill real buffer to run pipe
++    for (auto& item : outBuffers) {
++        if (item.second.get() == nullptr) {
++            item.second = mInternalOutputBuffers[item.first];
++        }
++    }
++
++    std::shared_ptr<CameraBuffer> outBuf = outBuffers.begin()->second;
++    CheckError(!outBuf, UNKNOWN_ERROR, "@%s: no valid output buffer", __func__);
++
++    ret = runTnrFrame(inBuf, outBuf);
++    CheckError(ret != OK, ret, "@%s: run tnr failed", __func__);
++
++    // Remove internal output buffers
++    for (auto& item : outBuffers) {
++        if (item.second.get() == mInternalOutputBuffers[item.first].get()) {
++            item.second = nullptr;
++        }
++    }
++
++    notifyFrameDone(inV4l2Buf, outBuffers);
++
++    // Return buffers for the executor which is NOT an input edge
++    for (auto const& portBufferPair : inBuffers) {
++        // Queue buffer to producer
++        mBufferProducer->qbuf(portBufferPair.first, portBufferPair.second);
++    }
++
++    return OK;
++}
++
++/* get the tnr7 tuning data from ISP. PalOutput can help decode IPU tnr parameters from IPU result
++** The GPU tnr7 parameters struct is different from IPU tnr parameters struct, so here we copy
++** the useful parameter to tnr7 parameters object
++*/
++int GPUExecutor::updateTnrISPConfig(Tnr7Param* pbuffer, uint32_t sequence) {
++    int ret = ia_err_none;
++    if (mAdaptor) {
++        CLEAR(*pbuffer);
++        ia_isp_bxt_program_group* pg = mGraphConfig->getProgramGroup(mStreamId);
++        CheckError(pg == nullptr, UNKNOWN_ERROR, "Can't get IPU program group");
++
++        // Get ISP parameters
++        LOG1(" %s update tnr parameters for sequence %d", __func__, sequence);
++        ia_binary_data* ipuParameters = mAdaptor->getIpuParameter(sequence, mStreamId);
++        CheckError(ipuParameters == nullptr, UNKNOWN_ERROR, "Failed to find ISP parameter");
++
++        ia_isp_bxt_program_group tmpPg = *pg;
++        tmpPg.kernel_count = 0;
++        int blankKernelSize = mAdaptor->getPalOutputDataSize(&tmpPg);
++
++        PalOutputData PalOutput(pg);
++        ia_binary_data tmpTnr7BinData = {0};
++        tmpTnr7BinData.size = ipuParameters->size - blankKernelSize;
++        tmpTnr7BinData.data = reinterpret_cast<char*>(ipuParameters->data) + blankKernelSize;
++
++        PalOutput.setPublicOutput(&tmpTnr7BinData);
++        ia_pal_isp_tnr7_bc_1_0_t* pBc;
++        ia_pal_isp_tnr7_blend_1_0_t* pBlend;
++        ia_pal_isp_tnr7_ims_1_0_t* pIms;
++        ret |= PalOutput.getKernelPublicOutput(ia_pal_uuid_isp_tnr7_bc_1_0, (void*&)pBc);
++        ret |= PalOutput.getKernelPublicOutput(ia_pal_uuid_isp_tnr7_blend_1_0, (void*&)pBlend);
++        ret |= PalOutput.getKernelPublicOutput(ia_pal_uuid_isp_tnr7_ims_1_0, (void*&)pIms);
++        CheckError(ret != ia_err_none, UNKNOWN_ERROR, "Can't read isp tnr7 parameters");
++
++        tnr7_bc_1_0_t* tnr7_bc = &(pbuffer->bc);
++        tnr7_blend_1_0_t* tnr7_blend = &(pbuffer->blend);
++        tnr7_ims_1_0_t* tnr7_ims = &(pbuffer->ims);
++
++        // tnr7 ims params
++        tnr7_ims->enable = pIms->enable;
++        tnr7_ims->update_limit = pIms->update_limit;
++        tnr7_ims->update_coeff = pIms->update_coeff;
++        tnr7_ims->gpu_mode = pIms->gpu_mode;
++        for (int i = 0; i < sizeof(pIms->d_ml) / sizeof(int32_t); i++) {
++            tnr7_ims->d_ml[i] = pIms->d_ml[i];
++            tnr7_ims->d_slopes[i] = pIms->d_slopes[i];
++            tnr7_ims->d_top[i] = pIms->d_top[i];
++            tnr7_ims->outofbounds[i] = pIms->outofbounds[i];
++        }
++
++        // tnr7 bc params
++        tnr7_bc->enable = pBc->enable;
++        tnr7_bc->is_first_frame = pBc->is_first_frame;
++        tnr7_bc->do_update = pBc->do_update;
++        tnr7_bc->gpu_mode = pBc->gpu_mode;
++        tnr7_bc->tune_sensitivity = pBc->tune_sensitivity;
++        for (int i = 0; i < sizeof(pBc->coeffs) / sizeof(int32_t); i++) {
++            tnr7_bc->coeffs[i] = pBc->coeffs[i];
++        }
++
++        tnr7_bc->global_protection = pBc->global_protection;
++        tnr7_bc->global_protection_motion_level = pBc->global_protection_motion_level;
++        for (int i = 0; i < sizeof(pBc->global_protection_sensitivity_lut_values) / sizeof(int32_t);
++             i++) {
++            tnr7_bc->global_protection_sensitivity_lut_values[i] =
++                pBc->global_protection_sensitivity_lut_values[i];
++        }
++        for (int i = 0; i < sizeof(pBc->global_protection_sensitivity_lut_slopes) / sizeof(int32_t);
++             i++) {
++            tnr7_bc->global_protection_sensitivity_lut_slopes[i] =
++                pBc->global_protection_sensitivity_lut_slopes[i];
++        }
++
++        // tnr7 blend params
++        tnr7_blend->enable = pBlend->enable;
++        tnr7_blend->enable_main_output = pBlend->enable_main_output;
++        tnr7_blend->enable_vision_output = pBlend->enable_vision_output;
++        tnr7_blend->single_output_mode = pBlend->single_output_mode;
++        tnr7_blend->spatial_weight_coeff = pBlend->spatial_weight_coeff;
++        tnr7_blend->max_recursive_similarity = pBlend->max_recursive_similarity;
++        tnr7_blend->spatial_alpha = pBlend->spatial_alpha;
++        tnr7_blend->max_recursive_similarity_vsn = pBlend->max_recursive_similarity_vsn;
++        for (int i = 0; i < sizeof(pBlend->w_out_prev_LUT) / sizeof(int32_t); i++) {
++            tnr7_blend->w_out_prev_LUT[i] = pBlend->w_out_prev_LUT[i];
++            tnr7_blend->w_out_spl_LUT[i] = pBlend->w_out_spl_LUT[i];
++            tnr7_blend->w_vsn_out_prev_LUT[i] = pBlend->w_vsn_out_prev_LUT[i];
++            tnr7_blend->w_vsn_out_spl_LUT[i] = pBlend->w_vsn_out_spl_LUT[i];
++        }
++
++        for (int i = 0; i < sizeof(pBlend->output_cu_a) / sizeof(int32_t); i++) {
++            tnr7_blend->output_cu_a[i] = pBlend->output_cu_a[i];
++            tnr7_blend->output_cu_b[i] = pBlend->output_cu_b[i];
++        }
++
++        for (int i = 0; i < sizeof(pBlend->output_cu_x) / sizeof(int32_t); i++) {
++            tnr7_blend->output_cu_x[i] = pBlend->output_cu_x[i];
++        }
++    }
++
++    return ret;
++}
++
++int GPUExecutor::runTnrFrame(const std::shared_ptr<CameraBuffer>& inBuf,
++                             std::shared_ptr<CameraBuffer> outBuf) {
++    PERF_CAMERA_ATRACE();
++    CheckError(!inBuf->getBufferAddr(), UNKNOWN_ERROR, "%s invalid input buffer", __func__);
++
++    if (mPolicyManager) {
++        // Check if need to wait other executors.
++        mPolicyManager->wait(mName);
++    }
++    LOG2("Enter %s executor name:%s, sequence: %ld", __func__, mName.c_str(), inBuf->getSequence());
++    TRACE_LOG_PROCESS(mName.c_str(), __func__, MAKE_COLOR(inBuf->getSequence()),
++                      inBuf->getSequence());
++
++    int fd = outBuf->getFd();
++    int memoryType = outBuf->getMemory();
++    int bufferSize = outBuf->getBufferSize();
++    void* outPtr = (memoryType == V4L2_MEMORY_DMABUF)
++                       ? CameraBuffer::mapDmaBufferAddr(fd, bufferSize)
++                       : outBuf->getBufferAddr();
++    if (!outPtr) return UNKNOWN_ERROR;
++
++    uint32_t sequence = inBuf->getSequence();
++    int ret = updateTnrISPConfig(mTnr7usParam, sequence);
++
++    if (ret) {
++        // if no ISP parameter, copy input to user buffer directly
++        MEMCPY_S(outPtr, bufferSize, inBuf->getBufferAddr(), inBuf->getBufferSize());
++        if (memoryType == V4L2_MEMORY_DMABUF) {
++            CameraBuffer::unmapDmaBufferAddr(outPtr, bufferSize);
++        }
++        return OK;
++    }
++
++    if (mLastSequence == UINT32_MAX || sequence - mLastSequence >= TNR7US_RESTART_THRESHOLD) {
++        mTnr7usParam->bc.is_first_frame = 1;
++    } else {
++        mTnr7usParam->bc.is_first_frame = 0;
++    }
++    mLastSequence = sequence;
++
++    ret = mIntelTNR->runTnrFrame(inBuf->getBufferAddr(), outPtr, inBuf->getBufferSize(), bufferSize,
++                                 mTnr7usParam);
++
++    if (memoryType == V4L2_MEMORY_DMABUF) {
++        CameraBuffer::unmapDmaBufferAddr(outPtr, bufferSize);
++    }
++
++    AiqResult* aiqResults =
++        const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence));
++    if (aiqResults == nullptr) {
++        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, sequence);
++        aiqResults =
++            const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult());
++        CheckError((aiqResults == nullptr), UNKNOWN_ERROR, "Cannot find available aiq result.");
++    }
++
++    ia_aiq_exposure_parameters* exposure = aiqResults->mAeResults.exposures[0].exposure;
++
++    /* update tnr param when gain changes. gain is float,
++     * multi by 1000 to avoid lose accuracy when cast to int */
++    ret = mIntelTNR->asyncParamUpdate(static_cast<int>(exposure->digital_gain * 1000));
++
++    LOG2("Exit %s executor name:%s, sequence: %ld", __func__, mName.c_str(), inBuf->getSequence());
++    return ret;
++}
++
++int GPUExecutor::dumpTnrParameters(uint32_t sequence) {
++    const int DUMP_FILE_SIZE = 0x1000;
++    std::string dumpFileName = std::string("/home/tnr7-") + to_string(sequence) + string(".txt");
++
++    LOG1("%s save tnr7 parameters to file %s", __func__, dumpFileName.c_str());
++    tnr7_bc_1_0_t* tnr7_bc = &(mTnr7usParam->bc);
++    tnr7_blend_1_0_t* tnr7_blend = &(mTnr7usParam->blend);
++    tnr7_ims_1_0_t* tnr7_ims = &(mTnr7usParam->ims);
++    char* dumpData = reinterpret_cast<char*>(malloc(DUMP_FILE_SIZE));
++    CheckError(dumpData == nullptr, NO_MEMORY, "failed to allocate memory for dump tnr7");
++
++    FILE* parFile = fopen(dumpFileName.c_str(), "wb");
++    if (parFile) {
++        int shift = 0;
++        size_t length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%s\n", "tnr7_bc");
++        shift += length;
++        for (int i = 0; i < sizeof(tnr7_bc_1_0_t) / sizeof(int32_t); i++) {
++            length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%u\n",
++                              *(reinterpret_cast<int32_t*>(tnr7_bc) + i));
++            shift += length;
++        }
++        length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%s\n", "tnr7_blend");
++        shift += length;
++        for (int i = 0; i < sizeof(tnr7_blend_1_0_t) / sizeof(int32_t); i++) {
++            length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%u\n",
++                              *(reinterpret_cast<int32_t*>(tnr7_blend) + i));
++            shift += length;
++        }
++        length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%s\n", "tnr7_ims");
++        shift += length;
++        for (int i = 0; i < sizeof(tnr7_ims_1_0_t) / sizeof(int32_t); i++) {
++            length = snprintf(dumpData + shift, DUMP_FILE_SIZE - shift, "%u\n",
++                              *(reinterpret_cast<int32_t*>(tnr7_ims) + i));
++            shift += length;
++        }
++
++        fwrite(dumpData, shift, 1, parFile);
++        fclose(parFile);
++    } else {
++        LOGW("tnr7 failed to open dump file %s", (dumpFileName + to_string(sequence)).c_str());
++    }
++    free(dumpData);
++    return OK;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
+new file mode 100644
+index 000000000000..e6851d26235d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
+@@ -0,0 +1,60 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "PipeLiteExecutor.h"
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelTNR7US.h"
++#else
++#include "modules/algowrapper/IntelTNR7US.h"
++#endif
++
++namespace icamera {
++
++class PSysDAG;
++
++class GPUExecutor : public PipeLiteExecutor {
++ public:
++    GPUExecutor(int cameraId, const ExecutorPolicy& policy, std::vector<std::string> exclusivePGs,
++                PSysDAG* psysDag, std::shared_ptr<IGraphConfig> gc);
++    virtual ~GPUExecutor();
++    virtual int start();
++    virtual int initPipe();
++    virtual void stop();
++
++ private:
++    int createPGs();
++    int allocBuffers();
++    void releaseBuffers();
++    int processNewFrame();
++    int updateTnrISPConfig(Tnr7Param* pbuffer, uint32_t sequence);
++    int dumpTnrParameters(uint32_t sequence);
++    int runTnrFrame(const std::shared_ptr<CameraBuffer>& inBuf,
++                    std::shared_ptr<CameraBuffer> outbuf);
++
++ private:
++    Tnr7Param* mTnr7usParam;
++    std::unique_ptr<IntelTNR7US> mIntelTNR;
++    uint32_t mLastSequence;
++
++    DISALLOW_COPY_AND_ASSIGN(GPUExecutor);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
+new file mode 100644
+index 000000000000..03b841e7d149
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
+@@ -0,0 +1,1235 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PGCommon"
++
++#include "PGCommon.h"
++
++#include <stdint.h>
++#include <math.h>
++#include <utility>
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++
++namespace icamera {
++
++#define IS_VALID_TERMINAL(terminal) (terminal >=0 && terminal < mTerminalCount)
++
++int PGCommon::getFrameSize(int format, int width, int height,
++                           bool needAlignedHeight, bool needExtraSize, bool needCompression)
++{
++    int size = 0;
++    int cssFormat = PGUtils::getCssFmt(format);
++    int stride = PGUtils::getCssStride(format, width);
++    switch (cssFormat) {
++    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:  // CSL6
++        if (needAlignedHeight) {
++            height = ALIGN_64(height);
++        }
++        size = stride * height * 3 / 2;
++        break;
++    default:
++        break;
++    }
++
++    if (!size) {
++        size = CameraUtils::getFrameSize(format, width, height,
++                                         needAlignedHeight, needExtraSize, needCompression);
++    }
++    return size;
++}
++
++PGCommon::PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid):
++    mCtx(nullptr),
++    mManifestBuffer(nullptr),
++    mPGParamsBuffer(nullptr),
++    mPGParamAdapt(nullptr),
++    mPGId(pgId),
++    mName(pgName),
++    mTerminalBaseUid(terminalBaseUid),
++    mPGCount(0),
++    mPlatform(IA_P2P_PLATFORM_BXT_B0),
++    mProgramCount(0),
++    mTerminalCount(0),
++    mManifestSize(0),
++    mKernelBitmap(ia_css_kernel_bitmap_clear()),
++    mRoutingBitmap(nullptr),
++    mFragmentCount(1),
++    mPGBuffer(nullptr),
++    mProcessGroup(nullptr),
++    mCmdExtBuffer(nullptr),
++    mPPG(false),
++    mPPGStarted(false),
++    mPPGBuffer(nullptr),
++    mPPGProcessGroup(nullptr),
++    mToken(0),
++    mEvent(nullptr),
++    mTerminalBuffers(nullptr),
++    mInputMainTerminal(-1),
++    mOutputMainTerminal(-1)
++{
++    mTnrTerminalPair.inId = -1;
++    mTnrTerminalPair.outId = -1;
++    CLEAR(mTnrBuffers);
++    CLEAR(mParamPayload);
++}
++
++PGCommon::~PGCommon()
++{
++}
++
++int PGCommon::init()
++{
++    mDisableDataTermials.clear();
++    mPGParamAdapt = std::unique_ptr<IntelPGParam>(new IntelPGParam(mPGId));
++
++    mCtx = new CIPR::Context();
++    int ret = getCapability();
++    if (ret != OK) return ret;
++
++    // create mManifestBuffer
++    ret = getManifest(mPGId);
++    if (ret != OK) return ret;
++
++    mTerminalBuffers = (CIPR::Buffer**)CIPR::callocMemory(mTerminalCount, sizeof(CIPR::Buffer*));
++    CheckError(!mTerminalBuffers, NO_MEMORY, "Allocate terminal buffers fail");
++    memset(mTerminalBuffers, 0, (mTerminalCount * sizeof(CIPR::Buffer*)));
++
++    mFrameFormatType = std::unique_ptr<ia_css_frame_format_type[]>(new ia_css_frame_format_type[mTerminalCount]);
++    for (int i = 0; i < mTerminalCount; i++) {
++        mFrameFormatType[i] = IA_CSS_N_FRAME_FORMAT_TYPES;
++    }
++
++    mPgTerminals = std::unique_ptr<uint8_t[]>(new uint8_t[mTerminalCount]);
++    for (int i = 0; i < mTerminalCount; i++) {
++        mPgTerminals[i] = IPU_MAX_TERMINAL_COUNT;
++    }
++
++    std::vector<TerminalPair> tnrTerminalPairs;
++    if (PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_TNR, &tnrTerminalPairs)) {
++        mTnrTerminalPair = tnrTerminalPairs[0];
++    }
++    PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_DVS, &mDvsTerminalPairs);
++
++    return ret;
++}
++
++void PGCommon::deInit()
++{
++    if (mPPGStarted) {
++        stopPPG();
++        mPPGStarted = false;
++    }
++
++    destoryCommands();
++
++    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
++        if (mTnrBuffers[i]) {
++            free(mTnrBuffers[i]);
++            mTnrBuffers[i] = nullptr;
++        }
++    }
++
++    mDvsTerminalPairs.clear();
++
++    mDisableDataTermials.clear();
++    if (mTerminalBuffers) {
++        CIPR::freeMemory(mTerminalBuffers);
++    }
++
++    delete mManifestBuffer;
++    delete mPGParamsBuffer;
++    delete mPGBuffer;
++    if (mPPGBuffer) {
++        delete mPPGBuffer;
++    }
++    for (auto& item : mBuffers) {
++        delete item.ciprBuf;
++    }
++
++    delete mCtx;
++
++    mPGParamAdapt->deinit();
++    mRoutingBitmap.reset();
++}
++
++void PGCommon::setInputInfo(const TerminalFrameInfoMap& inputInfos)
++{
++    mInputMainTerminal = -1;
++    int maxFrameSize = 0;
++    for (const auto& item : inputInfos) {
++        int terminal = item.first - mTerminalBaseUid;
++        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error input terminal %d", item.first);
++
++        FrameInfo frameInfo;
++        frameInfo.mWidth = item.second.mWidth;
++        frameInfo.mHeight = item.second.mHeight;
++        frameInfo.mFormat = item.second.mFormat;
++        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
++        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
++        mTerminalFrameInfos[terminal] = frameInfo;
++        int size = frameInfo.mWidth * frameInfo.mHeight;
++        if (maxFrameSize < size) {
++            maxFrameSize = size;
++            mInputMainTerminal = terminal;
++        }
++    }
++
++    // Create frame info for tnr terminals (i.e. data terminals)
++    FrameInfo config = mTerminalFrameInfos[mInputMainTerminal];
++    if (config.mHeight % 32) {
++        LOG1("%s: height %d not multiple of 32, rounding up!", __func__, config.mHeight);
++        config.mHeight = ((config.mHeight / 32) + 1) * 32;
++    }
++
++    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
++        int tnrId = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
++        if (tnrId < 0) continue;
++
++        mFrameFormatType[tnrId] = IA_CSS_DATA_FORMAT_NV12; // for IPU6
++        mTerminalFrameInfos[tnrId] = config;
++    }
++
++    LOG1("%s:%d use input terminal %d as main", __func__, mPGId, mInputMainTerminal);
++}
++
++void PGCommon::setOutputInfo(const TerminalFrameInfoMap& outputInfos)
++{
++    mOutputMainTerminal = -1;
++    int maxFrameSize = 0;
++    for (const auto& item : outputInfos) {
++        int terminal = item.first - mTerminalBaseUid;
++        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error output terminal %d", item.first);
++
++        FrameInfo frameInfo;
++        frameInfo.mWidth = item.second.mWidth;
++        frameInfo.mHeight = item.second.mHeight;
++        frameInfo.mFormat = item.second.mFormat;
++        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
++        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
++        mTerminalFrameInfos[terminal] = frameInfo;
++        int size = frameInfo.mWidth * frameInfo.mHeight;
++        if (maxFrameSize < size) {
++            maxFrameSize = size;
++            mOutputMainTerminal = terminal;
++        }
++    }
++}
++
++void PGCommon::setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals)
++{
++    for (auto const terminalUid : disabledTerminals) {
++        int terminal = terminalUid - mTerminalBaseUid;
++        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error disabled terminal %d", terminalUid);
++        mDisableDataTermials.push_back(terminal);
++    }
++}
++
++void PGCommon::setRoutingBitmap(const void* rbm, uint32_t bytes)
++{
++    if (!rbm || !bytes) {
++        return;
++    }
++    const unsigned char* rbmData = (const unsigned char*)rbm;
++
++    if (mRoutingBitmap.get() == nullptr) {
++        mRoutingBitmap = std::unique_ptr<ia_css_rbm_t>(new ia_css_rbm_t);
++    }
++
++    ia_css_rbm_t* rbmPtr = mRoutingBitmap.get();
++    *rbmPtr = ia_css_rbm_clear();
++    for (uint32_t bit = 0; bit < bytes * 8; bit++) {
++        if (rbmData[bit / 8] & (1 << (bit %8))) {
++            *rbmPtr = ia_css_rbm_set(*rbmPtr, bit);
++        }
++    }
++}
++
++int PGCommon::prepare(IspParamAdaptor* adaptor, int streamId)
++{
++    // Set the data terminal frame format
++    int ret = configTerminalFormat();
++    CheckError((ret != OK), ret, "%s, call configTerminal fail", __func__);
++
++    // Init and config p2p handle
++    ret = initParamAdapt();
++    CheckError((ret != OK), ret, "%s, init p2p fail", __func__);
++
++    // Query and save the requirement for each terminal, get the final kernel bitmap
++    ret = mPGParamAdapt->prepare(adaptor->getIpuParameter(-1, streamId), mRoutingBitmap.get(), &mKernelBitmap);
++    CheckError((ret != OK), ret, "%s, prepare p2p fail", __func__);
++
++    // Init PG parameters
++    ret = handlePGParams(mFrameFormatType.get());
++    CheckError((ret != OK), ret, "%s, call handlePGParams fail", __func__);
++
++    ret = setKernelBitMap();
++    CheckError((ret != OK), ret, "%s, call setKernelBitMap fail", __func__);
++
++    ret = setTerminalParams(mFrameFormatType.get());
++    CheckError((ret != OK), ret, "%s, call setTerminalParams fail", __func__);
++
++   // Create process group
++    mProcessGroup = createPG(&mPGBuffer);
++    CheckError(!mProcessGroup, UNKNOWN_ERROR, "%s, create pg fail", __func__);
++    uint8_t pgTerminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    for (uint8_t termNum = 0 ; termNum < pgTerminalCount; termNum++) {
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, termNum);
++        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
++        uint16_t termIdx = ia_css_terminal_get_terminal_manifest_index(terminal);
++        CheckError((termIdx >= IPU_MAX_TERMINAL_COUNT), UNKNOWN_ERROR, "wrong term index for terminal num %d", termNum);
++        mPgTerminals[termIdx] = termNum;
++    }
++
++    mPGParamAdapt->setPGAndPrepareProgram(mProcessGroup);
++    int count = mPGParamAdapt->allocatePayloads(mTerminalCount, mParamPayload);
++    CheckError(count != mTerminalCount, NO_MEMORY, "%s, allocatePayloads fails", __func__);
++    preparePayloadBuffers();
++
++    ret = configureFragmentDesc();
++    CheckError((ret != OK), ret, "%s, call configureFragmentDesc fail", __func__);
++
++    return OK;
++}
++
++ia_css_process_group_t* PGCommon::createPG(CIPR::Buffer** pgBuffer)
++{
++    CheckError(*pgBuffer, nullptr, "pg has already created");
++
++   // Create process group
++    ia_css_program_group_param_t* pgParamsBuf =
++        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
++    ia_css_program_group_manifest_t* manifestBuf =
++        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
++
++    size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
++    LOG1("%s process group size is %zu", __func__, pgSize);
++
++    void* pgMemory = mPGParamAdapt->allocatePGBuffer(pgSize);
++    CheckError(!pgMemory, nullptr, "allocate PG error");
++    *pgBuffer = createUserPtrCiprBuffer(pgSize, pgMemory);
++    CheckError(!*pgBuffer, nullptr, "%s, call createUserPtrCiprBuffer fail", __func__);
++
++    ia_css_process_group_t* pg = ia_css_process_group_create(getCiprBufferPtr(*pgBuffer),
++                   (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer),
++                   (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer));
++    CheckError(!pg, nullptr, "Create process group failed.");
++
++    if (mPPG) {
++        ia_css_process_group_set_num_queues(pg, 1);
++    }
++
++    if (mRoutingBitmap.get()) {
++        ia_css_process_group_set_routing_bitmap(pg, *mRoutingBitmap.get());
++    }
++    return pg;
++}
++
++int PGCommon::createCommands()
++{
++    int bufCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    int ret = createCommand(mPGBuffer, &mCmd, &mCmdExtBuffer, bufCount);
++    CheckError(ret, NO_MEMORY, "create cmd fail!");
++    if (mPPG) {
++        ret = createCommand(mPPGBuffer, &mPPGCmd[PPG_CMD_TYPE_START], &mPPGCmdExtBuffer[PPG_CMD_TYPE_START], bufCount);
++        CheckError(ret, NO_MEMORY, "create ppg start buffer %d fail");
++        ret = createCommand(mPPGBuffer, &mPPGCmd[PPG_CMD_TYPE_STOP], &mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP], 0);
++        CheckError(ret, NO_MEMORY, "create ppg stop %d fail");
++    }
++
++    CIPR::PSysEventConfig eventCfg = {};
++    eventCfg.timeout = kEventTimeout;
++    mEvent = new CIPR::Event(eventCfg);
++
++    return OK;
++}
++
++int PGCommon::createCommand(CIPR::Buffer* pg, CIPR::Command** cmd, CIPR::Buffer** extBuffer, int bufCount)
++{
++    CIPR::PSysCommandConfig cmdCfg;
++    CIPR::ProcessGroupCommand *pgCommand;
++    CIPR::Result ret;
++
++    // Create command with basic setting
++    cmdCfg.buffers.resize(bufCount);
++    std::fill(cmdCfg.buffers.begin(), cmdCfg.buffers.end(), nullptr);
++
++    *cmd = new CIPR::Command(cmdCfg);
++    ret = (*cmd)->getConfig(&cmdCfg);
++    CheckError(ret != CIPR::Result::OK, UNKNOWN_ERROR, "%s, call get_command_config fail", __func__);
++
++    // Create ext buffer
++    *extBuffer = new CIPR::Buffer(sizeof(CIPR::ProcessGroupCommand),
++                                  CIPR::MemoryFlag::AllocateCpuPtr
++                                  | CIPR::MemoryFlag::PSysAPI,
++                                  nullptr);
++
++    ret = (*extBuffer)->attatchDevice(mCtx);
++    CheckError(ret != CIPR::Result::OK, NO_MEMORY, "unable to access extBuffer");
++
++    void* p = nullptr;
++    ret = (*extBuffer)->getMemoryCpuPtr(&p);
++    CheckError(ret != CIPR::Result::OK, NO_MEMORY, "unable to access extBuffer memory");
++    pgCommand = reinterpret_cast<CIPR::ProcessGroupCommand*>(p);
++    CheckError(!pgCommand, NO_MEMORY, "unable to access memory.cpu_ptr");
++
++    pgCommand->header.size = sizeof(CIPR::ProcessGroupCommand);
++    pgCommand->header.offset = sizeof(pgCommand->header);
++    pgCommand->header.version = psys_command_ext_ppg_1; // for ipu6
++    if (pgCommand->header.version == psys_command_ext_ppg_1) {
++        CIPR::memoryCopy(pgCommand->dynamicKernelBitmap, sizeof(ia_css_kernel_bitmap_t),
++                        &mKernelBitmap, sizeof(ia_css_kernel_bitmap_t));
++    }
++
++    // Update setting and set back to command
++    cmdCfg.id = mPGId;
++    cmdCfg.priority = 1;
++    cmdCfg.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
++    cmdCfg.pgManifestBuf = mManifestBuffer;
++    cmdCfg.pg = pg;
++    cmdCfg.extBuf = *extBuffer;
++    ret = (*cmd)->setConfig(cmdCfg);
++    CheckError(ret != CIPR::Result::OK, UNKNOWN_ERROR, "%s, call set_command_config fail", __func__);
++
++    return OK;
++}
++
++void PGCommon::destoryCommands()
++{
++    delete mCmd;
++    delete mCmdExtBuffer;
++
++    for (int i = 0; i < PPG_CMD_TYPE_COUNT; i++) {
++        delete mPPGCmd[i];
++        delete mPPGCmdExtBuffer[i];
++    }
++
++    if (mEvent) {
++        delete mEvent;
++    }
++}
++
++int PGCommon::configTerminalFormat()
++{
++    for (int i = 0; i < mTerminalCount; i++) {
++        if (mTerminalFrameInfos.find(i) != mTerminalFrameInfos.end()) {
++            mFrameFormatType[i] = PGUtils::getCssFmt(mTerminalFrameInfos[i].mFormat);
++        }
++    }
++    return OK;
++}
++
++int PGCommon::initParamAdapt()
++{
++    mFragmentCount = calcFragmentCount();
++
++    ia_css_program_group_manifest_t* manifestBuf =
++        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
++
++    PgConfiguration config;
++    config.pgManifest = manifestBuf;
++    config.pgManifestSize = getCiprBufferSize(mManifestBuffer);
++    config.disableDataTermials = mDisableDataTermials;
++    config.fragmentCount = mFragmentCount;
++
++    FrameInfo* pgInFrame = nullptr;
++    FrameInfo* pgOutFrame = nullptr;
++    if (mInputMainTerminal >= 0) {
++        pgInFrame = &mTerminalFrameInfos[mInputMainTerminal];
++    }
++    if (mOutputMainTerminal >= 0) {
++        pgOutFrame = &mTerminalFrameInfos[mOutputMainTerminal];
++    }
++    if (pgInFrame) {
++        config.inputMainFrame.width = pgInFrame->mWidth;
++        config.inputMainFrame.height = pgInFrame->mHeight;
++        config.inputMainFrame.bpe = pgInFrame->mBpp; //TODO: use bpe
++    }
++
++    if (pgOutFrame) {
++        config.outputMainFrame.width = pgOutFrame->mWidth;
++        config.outputMainFrame.height = pgOutFrame->mHeight;
++        config.outputMainFrame.bpe = pgOutFrame->mBpp; //TODO: use bpe
++    }
++
++    // init and config p2p handle
++    int ret = mPGParamAdapt->init(mPlatform, config);
++    return ret;
++}
++
++// Support horizontal fragment only now
++int PGCommon::calcFragmentCount(int overlap)
++{
++    int finalFragmentCount = 0;
++    ia_css_data_terminal_manifest_t * data_terminal_manifest = nullptr;
++
++    const ia_css_program_group_manifest_t *manifest =
++            (const ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
++    CheckError(!manifest, 1, "%s, can't get manifest ptr", __func__);
++
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        // Get max fragement size from manifest (align with 64)
++        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(manifest, termIdx);
++        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
++
++        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
++            continue;
++        }
++
++        data_terminal_manifest = ia_css_program_group_manifest_get_data_terminal_manifest(manifest, termIdx);
++        CheckError(!data_terminal_manifest, -1, "%s, can't get data terminal manifest for term %d", __func__, termIdx);
++
++        uint16_t size[IA_CSS_N_DATA_DIMENSION] = {0};
++        int ret = ia_css_data_terminal_manifest_get_max_size(data_terminal_manifest, size);
++        CheckError(ret < 0, 1, "%s: get max fragment size error for term %d", __func__, termIdx);
++
++        size[IA_CSS_COL_DIMENSION] = ALIGN_64(size[IA_CSS_COL_DIMENSION]);
++        // Overwrite the max value if need
++
++        // Calc fragment count for terminal (only for horizontal direction)
++        int maxFragmentWidth = size[IA_CSS_COL_DIMENSION];
++        FrameInfo config;
++        CLEAR(config);
++        if (mTerminalFrameInfos.find(termIdx) != mTerminalFrameInfos.end()) {
++            config = mTerminalFrameInfos[termIdx];
++        }
++        int fragmentCovered = maxFragmentWidth;
++        int fragmentCount = 1;
++        /*
++         * Calculate how many fragment frames can cover the whole frame.
++         * Consider overlap between two fragment frames.
++         * Example: frame width = 300, max fragment width = 100, overlap = 10
++         *       0|------------------------------|300
++         *  f1   0|----------|100
++         *  f2           90|----------|190
++         *  f3                   180|----------|280
++         *  f4                            270|---|300
++         */
++        while (fragmentCovered < config.mWidth) {
++            fragmentCovered += (maxFragmentWidth - overlap);
++            fragmentCount++;
++        }
++
++        if (finalFragmentCount < fragmentCount) {
++            finalFragmentCount = fragmentCount;
++        }
++    }
++
++    LOG2("%s: final fragment count %d for pg %d", __func__, finalFragmentCount, mPGId);
++    return finalFragmentCount;
++}
++
++int PGCommon::handlePGParams(const ia_css_frame_format_type* frameFormatTypes)
++{
++    int pgParamsSize = ia_css_sizeof_program_group_param(mProgramCount, mTerminalCount, mFragmentCount);
++
++    mPGParamsBuffer = createUserPtrCiprBuffer(pgParamsSize);
++    CheckError(!mPGParamsBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
++
++    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
++    int ret = ia_css_program_group_param_init(pgParamsBuf, mProgramCount, mTerminalCount, mFragmentCount, frameFormatTypes);
++    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_init fail", __func__);
++
++    if (mPPG) {
++        ret = ia_css_program_group_param_set_protocol_version(
++                pgParamsBuf,
++                IA_CSS_PROCESS_GROUP_PROTOCOL_PPG);
++        CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_protocol_version fail", __func__);
++    }
++    return ret;
++}
++
++int PGCommon::setKernelBitMap()
++{
++    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
++    LOG1("%s: mKernelBitmap: %#018lx", __func__, mKernelBitmap);
++    int ret = ia_css_program_group_param_set_kernel_enable_bitmap(pgParamsBuf, mKernelBitmap);
++    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_kernel_enable_bitmap fail", __func__);
++
++    return ret;
++}
++
++int PGCommon::setTerminalParams(const ia_css_frame_format_type* frameFormatTypes)
++{
++    ia_css_program_group_param_t* pgParamsBuf =
++        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
++    ia_css_program_group_manifest_t* pg_manifest =
++        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
++
++    for (int i = 0; i < mTerminalCount; i++) {
++        ia_css_terminal_param_t *terminalParam =
++            ia_css_program_group_param_get_terminal_param(pgParamsBuf, i);
++        CheckError(!terminalParam, UNKNOWN_ERROR, "%s, call ia_css_program_group_param_get_terminal_param fail", __func__);
++        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, i);
++        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
++        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
++            continue;
++        }
++
++        FrameInfo config = mTerminalFrameInfos[i];
++        terminalParam->frame_format_type = frameFormatTypes[i];
++        terminalParam->dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
++        terminalParam->dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
++        terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
++        terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
++
++        terminalParam->bpp = PGUtils::getCssBpp(config.mFormat);
++        terminalParam->bpe = terminalParam->bpp;
++        terminalParam->stride = PGUtils::getCssStride(config.mFormat, config.mWidth);
++
++        terminalParam->offset = 0;
++        terminalParam->index[IA_CSS_COL_DIMENSION] = 0;
++        terminalParam->index[IA_CSS_ROW_DIMENSION] = 0;
++
++        LOG2("%s: setTerminalParams: index=%d, format=%d, w=%d, h=%d, fw=%d, fh=%d, bpp=%d, bpe=%d, stride=%d, offset=%d, col=%d, row=%d",
++             getName(), i,
++             terminalParam->frame_format_type,
++             terminalParam->dimensions[IA_CSS_COL_DIMENSION],
++             terminalParam->dimensions[IA_CSS_ROW_DIMENSION],
++             terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION],
++             terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION],
++             terminalParam->bpp,
++             terminalParam->bpe,
++             terminalParam->stride,
++             terminalParam->offset,
++             terminalParam->index[IA_CSS_COL_DIMENSION],
++             terminalParam->index[IA_CSS_ROW_DIMENSION]);
++    }
++
++    return OK;
++}
++
++int PGCommon::configureFragmentDesc()
++{
++    int num = mTerminalCount * mFragmentCount;
++    std::unique_ptr<ia_p2p_fragment_desc[]> srcFragDesc =
++                    std::unique_ptr<ia_p2p_fragment_desc[]>(new ia_p2p_fragment_desc[num]);
++    int count = mPGParamAdapt->getFragmentDescriptors(num, srcFragDesc.get());
++    CheckError(!count, UNKNOWN_ERROR, "getFragmentDescriptors fails");
++
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        if (mPgTerminals[termIdx] >= IPU_MAX_TERMINAL_COUNT) {
++            continue;
++        }
++
++        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
++        ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
++        if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
++            continue;
++        }
++        configureTerminalFragmentDesc(termIdx, &srcFragDesc[termIdx]);
++    }
++    return OK;
++}
++
++int PGCommon::configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc)
++{
++#define DDR_WORD_BYTES 64
++    ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
++    ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
++    if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
++        return OK;
++    }
++
++    bool vectorized = false;
++    int packed_multiplier = 1;
++    int packed_divider = 1;
++    int dimension_bpp = PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat);
++
++    switch(mFrameFormatType[termIdx]) {
++    case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
++    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:
++        vectorized = true;
++        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
++        break;
++    case IA_CSS_DATA_FORMAT_RAW:
++        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
++        break;
++    case IA_CSS_DATA_FORMAT_BAYER_GRBG:
++    case IA_CSS_DATA_FORMAT_BAYER_RGGB:
++    case IA_CSS_DATA_FORMAT_BAYER_BGGR:
++    case IA_CSS_DATA_FORMAT_BAYER_GBRG:
++        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
++        break;
++    case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
++        dimension_bpp = (uint8_t) (PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat) * 3 / 2);
++        packed_multiplier = 3;
++        packed_divider = 2;
++        vectorized = true;
++        break;
++    default:
++        break;
++    }
++
++    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
++        ia_css_fragment_descriptor_t* dstFragDesc =
++                ia_css_data_terminal_get_fragment_descriptor((ia_css_data_terminal_t*)terminal, fragIdx);
++        CheckError(!dstFragDesc, -1, "%s: Can't get frag desc from terminal", __func__);
++
++        dstFragDesc->dimension[IA_CSS_COL_DIMENSION] = srcDesc[fragIdx].fragment_width;
++        dstFragDesc->dimension[IA_CSS_ROW_DIMENSION] = srcDesc[fragIdx].fragment_height;
++        dstFragDesc->index[IA_CSS_COL_DIMENSION] = (uint16_t)
++                (((srcDesc[fragIdx].fragment_start_x * packed_multiplier)
++                 / packed_divider) * (vectorized ? 2 : 1));
++        dstFragDesc->index[IA_CSS_ROW_DIMENSION] = (uint16_t)
++                (srcDesc[fragIdx].fragment_start_y / (vectorized ? 2 : 1));
++
++        int colOffset = 0;
++        int pixels_per_word = 0;
++        switch (mFrameFormatType[termIdx]) {
++        case IA_CSS_DATA_FORMAT_YUV420:
++        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
++        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
++            /** \todo Fragmentation with DMA packed formats is still open, need to
++             * check this again when it is more clear (see #H1804344344).
++             */
++            pixels_per_word = (uint16_t) floor(DDR_WORD_BYTES * 8 / dimension_bpp);
++            colOffset = (uint16_t) (floor(dstFragDesc->index[IA_CSS_COL_DIMENSION] / pixels_per_word) * DDR_WORD_BYTES);
++            colOffset = (uint16_t) (colOffset + (((dstFragDesc->index[IA_CSS_COL_DIMENSION] % pixels_per_word) * dimension_bpp) / 8));
++            break;
++        default:
++            colOffset = (uint16_t) (dstFragDesc->index[IA_CSS_COL_DIMENSION] * dimension_bpp / 8);
++            break;
++        }
++
++        dstFragDesc->offset[IA_CSS_COL_DIMENSION] = (uint16_t)colOffset;
++        dstFragDesc->offset[IA_CSS_ROW_DIMENSION] = dstFragDesc->index[IA_CSS_ROW_DIMENSION];
++
++        LOG2("%s: %d:%d: get frag desc %d (%d, %d, %d, %d)", __func__, mPGId, termIdx, fragIdx,
++             srcDesc[fragIdx].fragment_width, srcDesc[fragIdx].fragment_height,
++             srcDesc[fragIdx].fragment_start_x, srcDesc[fragIdx].fragment_start_y);
++        LOG2("%s: %d:%d:       frag %d: size(%d, %d) index(%d, %d), offset(%d, %d)", __func__, mPGId, termIdx,fragIdx,
++             dstFragDesc->dimension[IA_CSS_COL_DIMENSION],
++             dstFragDesc->dimension[IA_CSS_ROW_DIMENSION],
++             dstFragDesc->index[IA_CSS_COL_DIMENSION],
++             dstFragDesc->index[IA_CSS_ROW_DIMENSION],
++             dstFragDesc->offset[IA_CSS_COL_DIMENSION],
++             dstFragDesc->offset[IA_CSS_ROW_DIMENSION]);
++    }
++    return OK;
++}
++
++int PGCommon::iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
++                      ia_binary_data *statistics, const ia_binary_data *ipuParameters)
++{
++    LOG2("%s:%s ++", getName(), __func__);
++
++    int ret = prepareTerminalBuffers(ipuParameters, inBufs, outBufs);
++    CheckError((ret != OK), ret, "%s, prepareTerminalBuffers fail with %d", getName(), ret);
++
++    // Create PPG & PPG start/stop commands at the beginning
++    if (mPPG && !mPPGBuffer) {
++        ia_css_program_group_param_t* pgParamsBuf =
++            (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
++        ia_css_program_group_manifest_t* manifestBuf =
++            (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
++
++        size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
++
++        mPPGBuffer = createUserPtrCiprBuffer(pgSize);
++        CheckError(!mPPGBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
++        mPPGProcessGroup = (ia_css_process_group_t*)getCiprBufferPtr(mPPGBuffer);
++        MEMCPY_S(mPPGProcessGroup, pgSize, mProcessGroup, ia_css_process_group_get_size(mProcessGroup));
++
++    }
++    if (!mCmd) {
++        ret = createCommands();
++       CheckError((ret != OK), ret, "%s, call createCommands fail", __func__);
++    }
++
++    if (mPPG && !mPPGStarted) {
++        ret = startPPG();
++        CheckError((ret != OK), ret, "%s, startPPG fail", getName());
++        mPPGStarted = true;
++    }
++
++    ret = executePG();
++    CheckError((ret != OK), ret, "%s, executePG fail", getName());
++
++    if (statistics) {
++        ret = mPGParamAdapt->decode(mTerminalCount, mParamPayload, statistics);
++        CheckError((ret != OK), ret, "%s, decode fail", getName());
++    }
++
++    LOG2("%s:%s -- ", getName(), __func__);
++    return ret;
++}
++
++int PGCommon::preparePayloadBuffers()
++{
++    CIPR::Buffer* ciprBuf = nullptr;
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        if (mParamPayload[termIdx].size && mParamPayload[termIdx].data) {
++            ciprBuf = registerUserBuffer(mParamPayload[termIdx].size, mParamPayload[termIdx].data);
++            CheckError(!ciprBuf, NO_MEMORY, "%s, register payload buffer %p for term %d fail",
++                       __func__, mParamPayload[termIdx].data, termIdx);
++            memset(mParamPayload[termIdx].data, 0, PAGE_ALIGN(mParamPayload[termIdx].size));
++            mTerminalBuffers[termIdx] = ciprBuf;
++        }
++    }
++
++    if (mTnrTerminalPair.inId >= 0 && !mTnrBuffers[TNR_BUFFER_IN_INDEX]) {
++        LOG1("%s:%s allocate the TNR input and output buffers", __func__, getName());
++        int size = CameraUtils::getFrameSize(mTerminalFrameInfos[mInputMainTerminal].mFormat,
++                                             mTerminalFrameInfos[mInputMainTerminal].mWidth,
++                                             mTerminalFrameInfos[mInputMainTerminal].mHeight);
++
++        for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
++            int idx = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
++
++            int ret = posix_memalign((void**)&mTnrBuffers[i], PAGE_SIZE_U, PAGE_ALIGN(size));
++            CheckError(ret, NO_MEMORY, "%s, alloc tnr %d buf for term %d fails", __func__, i, idx);
++
++            ciprBuf = registerUserBuffer(size, mTnrBuffers[i]);
++            CheckError(!ciprBuf, NO_MEMORY, "%s, register tnr %d buf %p fails", __func__, i,
++                       mTnrBuffers[i]);
++            mTerminalBuffers[idx] = ciprBuf;
++        }
++    }
++    return OK;
++}
++
++int PGCommon::prepareTerminalBuffers(const ia_binary_data *ipuParameters,
++                                     const CameraBufferMap& inBufs, const CameraBufferMap& outBufs)
++{
++    CIPR::Buffer* ciprBuf = nullptr;
++    // Prepare payload
++    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
++        // Payload for data terminals
++        std::shared_ptr<CameraBuffer> buffer;
++        ia_uid terminalUid = mTerminalBaseUid + termIdx;
++        if (inBufs.find(terminalUid) != inBufs.end()) {
++             buffer = inBufs.at(terminalUid);
++        } else if (outBufs.find(terminalUid) != outBufs.end()) {
++             buffer = outBufs.at(terminalUid);
++        }
++
++        if (buffer) {
++            ciprBuf = (buffer->getMemory() == V4L2_MEMORY_DMABUF) \
++                     ? registerUserBuffer(buffer->getBufferSize(), buffer->getFd()) \
++                     : registerUserBuffer(buffer->getBufferSize(), buffer->getBufferAddr());
++            CheckError(!ciprBuf, NO_MEMORY, "%s, register buffer size %d for terminal %d fail",
++                       __func__, buffer->getBufferSize(), termIdx);
++            mTerminalBuffers[termIdx] = ciprBuf;
++        }
++    }
++
++    if (mTnrBuffers[TNR_BUFFER_IN_INDEX] && mTnrBuffers[TNR_BUFFER_OUT_INDEX]) {
++        std::swap(mTerminalBuffers[mTnrTerminalPair.inId],
++                  mTerminalBuffers[mTnrTerminalPair.outId]);
++    }
++
++    for (auto& pair : mDvsTerminalPairs) {
++        std::swap(mTerminalBuffers[pair.inId], mTerminalBuffers[pair.outId]);
++    }
++
++    return mPGParamAdapt->updatePALAndEncode(ipuParameters, mTerminalCount, mParamPayload);
++}
++
++int PGCommon::executePG()
++{
++    TRACE_LOG_PROCESS(mName.c_str(), __func__);
++    CheckError((!mCmd), INVALID_OPERATION, "%s, Command is invalid.", __func__);
++    CheckError((!mProcessGroup), INVALID_OPERATION, "%s, process group is invalid.", __func__);
++
++    mCmd->getConfig(&mCmdCfg);
++    int bufferCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    mCmdCfg.id = mPGId;
++    mCmdCfg.priority = 1;
++    mCmdCfg.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
++    mCmdCfg.pgManifestBuf = mManifestBuffer;
++    mCmdCfg.pg = mPGBuffer;
++    mCmdCfg.extBuf = mCmdExtBuffer;
++    mCmdCfg.buffers.resize(bufferCount);
++
++    for (int i = 0; i < bufferCount; i++) {
++        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
++        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
++        mCmdCfg.buffers[i] = mTerminalBuffers[terminal->tm_index];
++    }
++    if (mPPG) {
++         ia_css_process_group_set_token(mProcessGroup, mToken);
++    }
++
++    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
++        int ret = ia_css_process_group_set_fragment_state(mProcessGroup, (uint16_t)fragIdx);
++        CheckError((ret != OK), ret, "%s, set fragment count %d fail %p", getName(), fragIdx, mProcessGroup);
++        ret = ia_css_process_group_set_fragment_limit(mProcessGroup, (uint16_t)(fragIdx + 1));
++        CheckError((ret != OK), ret, "%s, set fragment limit %d fail", getName(), fragIdx);
++
++        ret = handleCmd(&mCmd, &mCmdCfg);
++        CheckError((ret != OK), ret, "%s, call handleCmd fail", getName());
++    }
++
++    return OK;
++}
++
++int PGCommon::startPPG()
++{
++    // Get basic command config
++    CIPR::PSysCommandConfig cmdCfg;
++    mPPGCmd[PPG_CMD_TYPE_START]->getConfig(&cmdCfg);
++
++    // Update config
++    cmdCfg.id = mPGId;
++    cmdCfg.priority = 1;
++    cmdCfg.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
++    cmdCfg.pgManifestBuf = mManifestBuffer;
++    cmdCfg.pg = mPPGBuffer;
++    cmdCfg.extBuf = mPPGCmdExtBuffer[PPG_CMD_TYPE_START];
++    const int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
++    cmdCfg.buffers.resize(terminalCount);
++    std::fill(cmdCfg.buffers.begin(), cmdCfg.buffers.end(), nullptr);
++
++    ia_css_process_group_set_fragment_state(mPPGProcessGroup, 0);
++    ia_css_process_group_set_fragment_limit(mPPGProcessGroup, 1);
++
++    int ret = handleCmd(&mPPGCmd[PPG_CMD_TYPE_START], &cmdCfg);
++    mToken = ia_css_process_group_get_token(mPPGProcessGroup);
++    return ret;
++}
++
++int PGCommon::stopPPG()
++{
++    CIPR::PSysCommandConfig cmdCfg;
++
++    mPPGCmd[PPG_CMD_TYPE_STOP]->getConfig(&cmdCfg);
++
++    cmdCfg.id = mCmdCfg.id;
++    cmdCfg.priority = mCmdCfg.priority;
++    cmdCfg.pgParamsBuf = mCmdCfg.pgParamsBuf;
++    cmdCfg.pgManifestBuf = mCmdCfg.pgManifestBuf;
++    cmdCfg.pg = mPPGBuffer;
++    cmdCfg.extBuf = mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP];
++    cmdCfg.buffers.resize(0);
++
++    int ret =  handleCmd(&mPPGCmd[PPG_CMD_TYPE_STOP], &cmdCfg);
++    return ret;
++}
++
++int PGCommon::handleCmd(CIPR::Command** cmd, CIPR::PSysCommandConfig* cmdCfg)
++{
++    CIPR::PSysEventConfig eventCfg = {};
++    mEvent->getConfig(&eventCfg);
++    cmdCfg->issueID = reinterpret_cast<uint64_t>(cmd);
++    eventCfg.commandIssueID = cmdCfg->issueID;
++
++    CIPR::Result ret = (*cmd)->setConfig(*cmdCfg);
++    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call CIPR::Command::setConfig fail", __func__);
++
++    ret = (*cmd)->getConfig(cmdCfg);
++    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call CIPR::Command::getConfig fail", __func__);
++
++    ret = (*cmd)->enqueue(mCtx);
++    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Context::enqueueCommand() fail %d", __func__, ret);
++
++    // Wait event
++    ret = mEvent->wait(mCtx);
++    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Context::waitForEvent fail, ret: %d", __func__, ret);
++
++    ret = mEvent->getConfig(&eventCfg);
++    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Event::getConfig() fail, ret: %d", __func__, ret);
++    // Ignore the error in event config since it's not a fatal error.
++    if (eventCfg.error) {
++        LOGW("%s, event config error: %d", __func__, eventCfg.error);
++    }
++
++    return (eventCfg.error == 0) ? OK : UNKNOWN_ERROR;
++}
++
++int PGCommon::getCapability()
++{
++    CIPR::PSYSCapability cap;
++    int ret = OK;
++    CIPR::Result err = mCtx->getCapabilities(&cap);
++    CheckError((err != CIPR::Result::OK), UNKNOWN_ERROR, "Call Context::getCapabilities() fail, ret:%d", ret);
++
++    LOG1("%s: capability.version:%d", __func__, cap.version);
++    LOG1("%s: capability.driver:%s", __func__, cap.driver);
++    LOG1("%s: capability.devModel:%s", __func__, cap.devModel);
++    LOG1("%s: capability.programGroupCount:%d", __func__, cap.programGroupCount);
++    mPGCount = cap.programGroupCount;
++
++    if (strncmp((char *)cap.devModel, "ipu4p", 5) == 0) {
++        mPlatform = IA_P2P_PLATFORM_CNL_B0;
++        LOG1("%s: cnl/icl/ksl shared the same p2p platform id", __func__);
++    } else if (strncmp((char *)cap.devModel, "ipu4", 4) == 0) {
++        switch (cap.devModel[13]) {
++            case 'B':
++                 mPlatform = IA_P2P_PLATFORM_BXT_B0;
++                 break;
++            default:
++                 LOGE("%s: unsupported psys device model :%s", __func__, cap.devModel);
++                 ret = BAD_VALUE;
++                 break;
++        }
++    } else if (strncmp((char *)cap.devModel, "ipu6", 4) == 0) {
++        mPlatform = IA_P2P_PLATFORM_IPU6;
++        mPPG = true;
++    } else {
++        LOGE("%s: unsupported psys device model : %s", __func__, cap.devModel);
++        ret = BAD_VALUE;
++    }
++
++    return ret;
++}
++
++int PGCommon::getManifest(int pgId)
++{
++    int i = 0;
++
++    for (; i < mPGCount; i++) {
++        CIPR::Buffer* manifestBuffer = nullptr;
++        int programCount = 0;
++        int terminalCount = 0;
++        int programGroupId = 0;
++        int manifestSize = 0;
++        ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
++        uint32_t size = 0;
++
++        CIPR::Result ret = mCtx->getManifest(i, &size, nullptr);
++        if (ret != CIPR::Result::OK) continue;
++        CheckError((size == 0), UNKNOWN_ERROR, "%s, the manifest size is 0", __func__);
++
++        manifestBuffer = createUserPtrCiprBuffer(size);
++        CheckError(!manifestBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
++
++        void* manifest = getCiprBufferPtr(manifestBuffer);
++
++        ret = mCtx->getManifest(i, &size, manifest);
++        if (ret != CIPR::Result::OK) {
++            LOGE("%s, call Context::getManifest() fail", __func__);
++            delete manifestBuffer;
++            return UNKNOWN_ERROR;
++        }
++
++        LOG1("%s: pg index: %d, manifest size: %u", __func__, i, size);
++        const ia_css_program_group_manifest_t *mf = (const ia_css_program_group_manifest_t*)manifest;
++        programCount = ia_css_program_group_manifest_get_program_count(mf);
++        terminalCount = ia_css_program_group_manifest_get_terminal_count(mf);
++        programGroupId = ia_css_program_group_manifest_get_program_group_ID(mf);
++        manifestSize = ia_css_program_group_manifest_get_size(mf);
++        kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mf);
++
++        LOG1("%s: pgIndex: %d, programGroupId: %d, manifestSize: %d, programCount: %d, terminalCount: %d",
++             __func__, i, programGroupId, manifestSize, programCount, terminalCount);
++
++        if (pgId == programGroupId) {
++            mProgramCount = programCount;
++            mTerminalCount = terminalCount;
++            mManifestSize = manifestSize;
++            mKernelBitmap = kernelBitmap;
++            mManifestBuffer = manifestBuffer;
++            break;
++        }
++
++        delete manifestBuffer;
++    }
++
++    CheckError((i == mPGCount), BAD_VALUE, "%s, Can't found available pg: %d", __func__, pgId);
++
++    return OK;
++}
++
++CIPR::Buffer* PGCommon::createDMACiprBuffer(int size, int fd)
++{
++    CIPR::MemoryFlag deviceFlags = CIPR::MemoryFlag::MemoryHandle | CIPR::MemoryFlag::NoFlush;
++
++    CIPR::MemoryDesc mem;
++    mem.size = size;
++    mem.flags = CIPR::MemoryFlag::MemoryHandle | CIPR::MemoryFlag::HardwareOnly;
++    mem.handle = fd;
++    mem.cpuPtr = nullptr;
++    mem.anchor = nullptr;
++
++    CIPR::Buffer* buf = new CIPR::Buffer(size, mem.flags | deviceFlags, &mem);
++
++    CIPR::Result ret = buf->attatchDevice(mCtx);
++    if (ret != CIPR::Result::OK) {
++        LOGE("%s, call Buffer::attatchDevice() fail", __func__);
++        delete buf;
++        return nullptr;
++    }
++
++    return buf;
++}
++
++CIPR::Buffer* PGCommon::createUserPtrCiprBuffer(int size, void* ptr)
++{
++    CIPR::Buffer* buf = nullptr;
++    if (ptr == nullptr) {
++        buf = new CIPR::Buffer(size, CIPR::MemoryFlag::AllocateCpuPtr, nullptr);
++    } else {
++        CIPR::MemoryDesc mem;
++        mem.size = size;
++        mem.flags = CIPR::MemoryFlag::CpuPtr;
++        mem.handle = 0;
++        mem.cpuPtr = ptr;
++        mem.anchor = nullptr;
++        buf = new CIPR::Buffer(size, CIPR::MemoryFlag::CpuPtr, &mem);
++    }
++
++    CIPR::Result ret = buf->attatchDevice(mCtx);
++    if (ret != CIPR::Result::OK) {
++        LOGE("%s, call Buffer::attatchDevice() fail", __func__);
++        delete buf;
++        return nullptr;
++    }
++
++    return buf;
++}
++
++void* PGCommon::getCiprBufferPtr(CIPR::Buffer* buffer)
++{
++    CheckError(!buffer, nullptr, "%s, invalid cipr buffer", __func__);
++
++    void* ptr = nullptr;
++    CIPR::Result ret = buffer->getMemoryCpuPtr(&ptr);
++    CheckError((ret != CIPR::Result::OK), nullptr, "%s, call Buffer::getMemoryCpuPtr() fail", __func__);
++
++    return ptr;
++}
++
++int PGCommon::getCiprBufferSize(CIPR::Buffer* buffer)
++{
++    CheckError(!buffer, BAD_VALUE, "%s, invalid cipr buffer", __func__);
++
++    int size = 0;
++    CIPR::Result ret = buffer->getMemorySize(&size);
++    CheckError((ret != CIPR::Result::OK), NO_MEMORY, "%s, call Buffer::getMemorySize() fail", __func__);
++
++    return size;
++}
++
++CIPR::Buffer* PGCommon::registerUserBuffer(int size, void* ptr)
++{
++    CheckError((size <= 0 || ptr == nullptr), nullptr, "Invalid parameter: size=%d, ptr=%p", size, ptr);
++
++    for (auto it = mBuffers.begin(); it != mBuffers.end(); ++it) {
++        if (ptr == it->userPtr) {
++            if (size == getCiprBufferSize(it->ciprBuf)) {
++                return it->ciprBuf;
++            }
++
++            LOG2("%s, the buffer size is changed: old(%d), new(%d) addr(%p)",
++                 __func__, getCiprBufferSize(it->ciprBuf), size, it->userPtr);
++            delete it->ciprBuf;
++            it->ciprBuf = nullptr;
++            it->userPtr = nullptr;
++            mBuffers.erase(it);
++            break;
++        }
++    }
++
++    CIPR::Buffer* ciprBuf = createUserPtrCiprBuffer(size, ptr);
++    CheckError(!ciprBuf, nullptr, "Create cipr buffer for %p failed", ptr);
++
++    CiprBufferMapping bufMap;
++    bufMap.userPtr = ptr;
++    bufMap.ciprBuf = ciprBuf;
++    mBuffers.push_back(bufMap);
++
++    return ciprBuf;
++}
++
++CIPR::Buffer* PGCommon::registerUserBuffer(int size, int fd)
++{
++    CheckError((size <= 0 || fd < 0), nullptr, "Invalid parameter: size: %d, fd: %d", size, fd);
++
++    for (auto it = mBuffers.begin(); it != mBuffers.end(); ++it) {
++        if (fd == it->userFd) {
++            if (size == getCiprBufferSize(it->ciprBuf)) {
++                return it->ciprBuf;
++            }
++
++            LOG2("%s, the buffer size is changed: old(%d), new(%d) fd(%d)",
++                 __func__, getCiprBufferSize(it->ciprBuf), size, it->userFd);
++            delete it->ciprBuf;
++            it->ciprBuf = nullptr;
++            it->userFd = -1;
++            mBuffers.erase(it);
++            break;
++        }
++    }
++
++    CIPR::Buffer* ciprBuf = createDMACiprBuffer(size, fd);
++    CheckError(!ciprBuf, nullptr, "Create cipr buffer for fd %d failed", fd);
++
++    CiprBufferMapping bufMap;
++    bufMap.userFd = fd;
++    bufMap.ciprBuf = ciprBuf;
++    mBuffers.push_back(bufMap);
++
++    return ciprBuf;
++}
++
++void PGCommon::dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup)
++{
++    if (!CameraDump::isDumpTypeEnable(DUMP_PSYS_PG)) return;
++
++    char fileName[MAX_NAME_LEN] = {'\0'};
++    uint32_t pgSize = ia_css_process_group_get_size(pgGroup);
++    snprintf(fileName, (MAX_NAME_LEN - 1), "hal_pg_%d_%ld.bin", pgId, sequence);
++
++    FILE *fp = fopen (fileName, "w+");
++    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
++    const unsigned int* printPtr = (const unsigned int*)pgGroup;
++    fprintf(fp, "::pg dump size %d(0x%x)\n", pgSize, pgSize);
++    for (unsigned int i = 0; i < pgSize / sizeof(*printPtr); i++) {
++        fprintf(fp, "%08x\n", printPtr[i]);
++    }
++
++    int terminalCount = ia_css_process_group_get_terminal_count(pgGroup);
++    for (int i = 0; i < terminalCount; i++) {
++        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(pgGroup, i);
++        if (!terminal) {
++            LOGE("failed to get terminal");
++            fclose(fp);
++            return;
++        }
++        if (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN
++            || terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
++            continue;
++        }
++
++        void* ptr = getCiprBufferPtr(mTerminalBuffers[terminal->tm_index]);
++        int size = getCiprBufferSize(mTerminalBuffers[terminal->tm_index]);
++        const char* typeStr = (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ? "DATA_IN"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ? "DATA_OUT"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_STREAM) ? "PARAM_STREAM"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) ? "CACHED_IN"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ? "CACHED_OUT"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ? "SPATIAL_IN"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ? "SPATIAL_OUT"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ? "SLICED_IN"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ? "SLICED_OU"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_IN) ? "STATE_IN"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT) ? "STATE_OUT"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) ? "PROGRAM"
++                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) ? "PROGRAM_CONTROL_INIT"
++                            :                                                             "UNKNOWN";
++        printPtr = (const unsigned int*)ptr;
++        fprintf(fp, "::terminal %d dump size %d(0x%x), line %d, type %s\n", terminal->tm_index, size, size, PAGE_ALIGN(size)/4, typeStr);
++        for (unsigned int i = 0; i < PAGE_ALIGN(size) / sizeof(*printPtr); i++) {
++            fprintf(fp, "%08x\n", printPtr[i]);
++        }
++    }
++
++    fclose (fp);
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
+new file mode 100644
+index 000000000000..92f86012254f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
+@@ -0,0 +1,240 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++extern "C" {
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_program_group_data.h>
++#include <ia_css_program_group_param.h>
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_terminal.h>
++#include <ia_css_terminal_types.h>
++#include <ia_css_terminal_manifest_types.h>
++#include <ia_css_psysapi_fw_version.h>
++}
++
++#include <vector>
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelPGParam.h"
++#else
++#include "modules/algowrapper/IntelPGParam.h"
++#endif
++#include "IspParamAdaptor.h"
++#include "BufferQueue.h"
++#include "PGUtils.h"
++
++#include "modules/ia_cipr/include/Buffer.h"
++#include "modules/ia_cipr/include/Context.h"
++#include "modules/ia_cipr/include/Event.h"
++#include "modules/ia_cipr/include/Command.h"
++
++namespace icamera {
++
++typedef std::map<ia_uid, FrameInfo> TerminalFrameInfoMap;
++typedef std::map<ia_uid, std::shared_ptr<CameraBuffer>> CameraBufferMap;
++
++#define FRAGMENT_OVERLAP 64
++
++/**
++ * \class PGCommon
++ *
++ * \brief This is a version PG implementation which is used to config and run PG.
++ *
++ * The call sequence as follows:
++ * 1. init();
++ * 2. setInputInfo();setOutputInfo();
++ * 3. setDisabledTerminals();
++ * 4. prepare():
++ *          configTerminalFormat();
++ *          calcFragmentCount();
++ *          handlePGParams();
++ *          setKernelBitMap();
++ *          setTerminalParams();
++ *          allocatePGBuffer();
++ *          setPGAndPrepareProgram();
++ *          configureFragmentDesc();
++ * 5. loop frame: iterate():
++ *          encodeTerminals();
++ *          handleCmd();
++ *          handleEvent();
++ *          decode();
++ * 6. deInit();
++ */
++class PGCommon {
++public:
++    static int getFrameSize(int format, int width, int height,
++                            bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
++
++    PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid = 0);
++    virtual ~PGCommon();
++
++    /**
++     * allocate memory for some variables.
++     */
++    int init();
++
++    /**
++     * recycle memory.
++     */
++    void deInit();
++
++    /**
++     * set the input buffers info for terminals.
++     * use ia_fourcc
++     */
++    virtual void setInputInfo(const TerminalFrameInfoMap& inputInfos);
++
++    /**
++     * set the output buffers info for terminals.
++     * use ia_fourcc
++     */
++    virtual void setOutputInfo(const TerminalFrameInfoMap& outputInfos);
++
++    /**
++     * set the disabled terminals. Called before prepare()
++     */
++    virtual void setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals);
++
++    /**
++     * set routing bitmap. Called before prepare()
++     */
++    virtual void setRoutingBitmap(const void* rbm, uint32_t bytes);
++
++    /**
++     * config the data terminals, init, config and prepare p2p, create process group.
++     */
++    virtual int prepare(IspParamAdaptor* adaptor, int streamId = -1);
++
++    /**
++     * run p2p to encode the params terminals, execute the PG and run p2p to decode the statistic terminals.
++     */
++    virtual int iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
++                        ia_binary_data *statistics, const ia_binary_data *ipuParameters);
++
++    const char* getName() { return mName.c_str(); }
++private:
++    DISALLOW_COPY_AND_ASSIGN(PGCommon);
++
++protected:
++    int getCapability();
++    int getManifest(int pgId);
++
++    // PG parameters intialization, for prepare()
++    virtual int configTerminalFormat();
++    int initParamAdapt();
++    virtual int calcFragmentCount(int overlap = FRAGMENT_OVERLAP);
++    int handlePGParams(const ia_css_frame_format_type* frameFormatTypes);
++    int setKernelBitMap();
++    virtual int setTerminalParams(const ia_css_frame_format_type* frameFormatTypes);
++    virtual int configureFragmentDesc();
++    int configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc);
++    ia_css_process_group_t* createPG(CIPR::Buffer** pgBuffer);
++    int createCommands();
++    int createCommand(CIPR::Buffer* pg, CIPR::Command** cmd, CIPR::Buffer** extBuffer, int bufCount);
++    void destoryCommands();
++    int preparePayloadBuffers();
++
++    // For iteration
++    virtual int prepareTerminalBuffers(const ia_binary_data *ipuParameters,
++                                       const CameraBufferMap& inBufs,
++                                       const CameraBufferMap& outBufs);
++    int executePG();
++    int startPPG();
++    int stopPPG();
++    int handleCmd(CIPR::Command** cmd, CIPR::PSysCommandConfig* cmdCfg);
++
++    // Memory helper
++    CIPR::Buffer* createDMACiprBuffer(int size, int fd);
++    CIPR::Buffer* createUserPtrCiprBuffer(int size, void* ptr = nullptr);
++    void* getCiprBufferPtr(CIPR::Buffer* buffer);
++    CIPR::Buffer* registerUserBuffer(int size, void* ptr);
++    CIPR::Buffer* registerUserBuffer(int size, int fd);
++    int getCiprBufferSize(CIPR::Buffer* buffer);
++
++    void dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup);
++
++protected:
++    enum PPGCommandType {
++        PPG_CMD_TYPE_START = 0,
++        PPG_CMD_TYPE_STOP,
++        PPG_CMD_TYPE_COUNT
++    };
++
++    struct CiprBufferMapping {
++        CiprBufferMapping() {}
++        void* userPtr = nullptr;
++        int userFd = -1;
++        CIPR::Buffer* baseCiprBuf = nullptr;
++        CIPR::Buffer* ciprBuf = nullptr;
++    };
++
++    static const int kEventTimeout = 8000;
++
++    CIPR::Context* mCtx = nullptr;
++    CIPR::Buffer* mManifestBuffer = nullptr;
++    CIPR::Buffer* mPGParamsBuffer = nullptr;
++    std::unique_ptr<IntelPGParam> mPGParamAdapt;
++
++    int mPGId;
++    std::string mName;  // For debug
++    ia_uid mTerminalBaseUid;
++    int mPGCount;
++    ia_p2p_platform_t mPlatform;
++    int mProgramCount;
++    int mTerminalCount;
++    int mManifestSize;
++    ia_css_kernel_bitmap_t mKernelBitmap;
++    std::unique_ptr<ia_css_rbm_t> mRoutingBitmap;
++    int mFragmentCount;
++    std::unique_ptr<uint8_t[]> mPgTerminals; // save terminal num in PG for each terminal
++    std::unique_ptr<ia_css_frame_format_type[]> mFrameFormatType;
++    std::vector<int> mDisableDataTermials;
++
++    ia_binary_data __attribute__ ((aligned (PG_PAGE_SIZE))) mParamPayload[IPU_MAX_TERMINAL_COUNT];
++
++    CIPR::Buffer* mPGBuffer = nullptr;
++    ia_css_process_group_t* mProcessGroup;
++    CIPR::Command* mCmd = nullptr;
++    CIPR::Buffer* mCmdExtBuffer = nullptr;
++
++    bool mPPG;
++    bool mPPGStarted;
++    CIPR::Buffer* mPPGBuffer = nullptr;
++    ia_css_process_group_t* mPPGProcessGroup;
++    CIPR::Command* mPPGCmd[PPG_CMD_TYPE_COUNT] = {nullptr, };
++    CIPR::Buffer* mPPGCmdExtBuffer[PPG_CMD_TYPE_COUNT] = {nullptr, };
++    uint64_t mToken;
++
++    CIPR::PSysCommandConfig mCmdCfg;
++    CIPR::Event* mEvent = nullptr;
++
++    CIPR::Buffer** mTerminalBuffers;;
++    std::map<int, FrameInfo> mTerminalFrameInfos; // valid for data terminals only
++    int mInputMainTerminal;
++    int mOutputMainTerminal;
++
++    std::vector<CiprBufferMapping> mBuffers;
++
++    TerminalPair mTnrTerminalPair;
++    uint8_t* mTnrBuffers[TNR_BUFFER_COUNT];
++
++    std::vector<TerminalPair> mDvsTerminalPairs;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
+new file mode 100644
+index 000000000000..e79d01a9948d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
+@@ -0,0 +1,194 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PGUtils"
++
++#include <stdint.h>
++
++#include <vector>
++
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++
++#include "PGUtils.h"
++
++namespace icamera {
++
++namespace PGUtils {
++
++/* ************************************************************
++ * Common definitions
++ * ***********************************************************/
++
++#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
++                                 | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
++
++struct FormatMap {
++    int v4l2Fmt;
++    ia_css_frame_format_type cssFmt;
++
++    int cssBpp;
++};
++
++static const FormatMap sFormatMapping[] = {
++    { V4L2_PIX_FMT_YUYV,   IA_CSS_DATA_FORMAT_YUYV, 12 },
++    { V4L2_PIX_FMT_UYVY,   IA_CSS_DATA_FORMAT_UYVY, 12 },
++    { V4L2_PIX_FMT_YUV420, IA_CSS_DATA_FORMAT_YUV420, 16 },
++    { V4L2_PIX_FMT_NV12,   IA_CSS_DATA_FORMAT_NV12, 8 },
++    { V4L2_PIX_FMT_NV16,   IA_CSS_DATA_FORMAT_NV16, 12 },
++    { V4L2_PIX_FMT_RGB565, IA_CSS_DATA_FORMAT_RGB565, 16 },
++    { V4L2_PIX_FMT_RGB24,  IA_CSS_DATA_FORMAT_RGB888, 24 },
++    { V4L2_PIX_FMT_RGB32,  IA_CSS_DATA_FORMAT_RGBA888, 24 },
++    { V4L2_PIX_FMT_SGRBG12, IA_CSS_DATA_FORMAT_RAW, 16 },
++    { V4L2_PIX_FMT_SGRBG10, IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
++
++    { GET_FOURCC_FMT('Y', 'U', 'Y', 'V'), IA_CSS_DATA_FORMAT_YUYV, 12 },
++    { GET_FOURCC_FMT('U', 'Y', 'V', 'Y'), IA_CSS_DATA_FORMAT_UYVY, 12 },
++    { GET_FOURCC_FMT('Y', 'U', '1', '2'), IA_CSS_DATA_FORMAT_YUV420, 16 },
++    { GET_FOURCC_FMT('N', 'V', '1', '2'), IA_CSS_DATA_FORMAT_NV12, 8 },
++    { GET_FOURCC_FMT('N', 'V', '1', '6'), IA_CSS_DATA_FORMAT_NV16, 12 },
++    { GET_FOURCC_FMT('R', 'G', 'B', 'P'), IA_CSS_DATA_FORMAT_RGB565, 16 },
++    { GET_FOURCC_FMT('R', 'G', 'B', '3'), IA_CSS_DATA_FORMAT_RGB888, 24 },
++    { GET_FOURCC_FMT('R', 'G', 'B', '4'), IA_CSS_DATA_FORMAT_RGBA888, 24 },
++    { GET_FOURCC_FMT('B', 'A', '1', '2'), IA_CSS_DATA_FORMAT_RAW, 16 },
++    { GET_FOURCC_FMT('B', 'A', '1', '0'), IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
++    { GET_FOURCC_FMT('y', '0', '3', '2'), IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED, 16 },
++    { GET_FOURCC_FMT('V', '4', '2', '0'), IA_CSS_DATA_FORMAT_YUV420, 16 },
++    { GET_FOURCC_FMT('b','V','0','K'),    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED, 16 },
++    { GET_FOURCC_FMT('C','S','L','6'),    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED, 16},
++    { GET_FOURCC_FMT('G','R','1','0'),    IA_CSS_DATA_FORMAT_BAYER_GRBG, 16 },
++    { GET_FOURCC_FMT('I','Y','U','V'),    IA_CSS_DATA_FORMAT_YUV420, 12 },
++};
++
++static int getStride(int cssFmt, int width);
++
++ia_css_frame_format_type getCssFmt(int v4l2Fmt) {
++    int size = ARRAY_SIZE(sFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
++            return sFormatMapping[i].cssFmt;
++        }
++    }
++
++    LOG2("%s: unsupported v4l2 pixel format: %s", __func__,
++         CameraUtils::format2string(v4l2Fmt).c_str());
++    return IA_CSS_N_FRAME_FORMAT_TYPES;
++}
++
++int getCssStride(int v4l2Fmt, int width) {
++    int stride = width;
++    ia_css_frame_format_type cssFmt = getCssFmt(v4l2Fmt);
++    switch (v4l2Fmt) {
++        case GET_FOURCC_FMT('I','Y','U','V'):
++            stride = width;
++            break;
++        default:
++            stride = getStride(cssFmt, width);
++            break;
++    }
++    return stride;
++}
++
++int getCssBpp(int v4l2Fmt) {
++    int size = ARRAY_SIZE(sFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
++            return sFormatMapping[i].cssBpp;
++        }
++    }
++
++    LOG2("%s: unsupported v4l2 pixel format: 0x%x", __func__, v4l2Fmt);
++    return 8;
++}
++
++int getStride(int cssFmt, int width) {
++    int stride = width;
++    switch (cssFmt) {
++        case IA_CSS_DATA_FORMAT_BAYER_GRBG: // GR10
++        case IA_CSS_DATA_FORMAT_RAW:        // BA10
++            stride = ALIGN_64(width * 2);
++            break;
++        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED: // y032
++            stride = width * 6;
++            break;
++        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED: // bv0k
++        case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED: // css_fourcc_grbg_12_li
++            stride = width * 4;
++            stride = ALIGN_64(stride);
++            break;
++        case IA_CSS_DATA_FORMAT_YUV420:
++            stride = width * 2;
++            stride = ALIGN_64(stride);
++            break;
++        case IA_CSS_DATA_FORMAT_NV12:
++            stride = width;
++            break;
++        default:
++            LOG2("TODO for format: %d", cssFmt);
++            break;
++    }
++    return stride;
++}
++
++/* ************************************************************
++ * Difference between PGs
++ * ***********************************************************/
++#define PG_PSYS_IPU6_ISA_LB 187
++#define PG_PSYS_IPU6_BB 189
++#define PG_PSYS_IPU6_ISL 198
++
++// the below terminals belong to PG_PSYS_IPU6_BB
++#define PG_BB_TERMINAL_ID_TNR_REF_IN 4 // data_terminal
++#define PG_BB_TERMINAL_ID_TNR_REF_OUT 6 // data_terminal
++
++// the below terminals belong to PG_PSYS_IPU6_ISA_LB
++#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L0 21 // program_terminal
++#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L1 22 // program_terminal
++#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L2 23 // program_terminal
++#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0 24 // param_terminal
++#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1 25 // param_terminal
++#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2 26 // param_terminal
++
++bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs) {
++    LOG2("@%s, pgId:%d, type:%d, pairs:%p", __func__, pgId, type, pairs);
++    CheckError(!pairs, false, "@%s, pairs is nullptr", __func__);
++
++    struct TerminalPairs {
++        int pgId;
++        TERMINAL_PAIR_TYPE type;
++        std::vector<TerminalPair> pairs;
++    };
++    static const TerminalPairs tps[] = {
++        {PG_PSYS_IPU6_BB, TERMINAL_PAIR_TNR,
++         {{PG_BB_TERMINAL_ID_TNR_REF_IN, PG_BB_TERMINAL_ID_TNR_REF_OUT}}},
++        {PG_PSYS_IPU6_ISA_LB, TERMINAL_PAIR_DVS,
++         {{ISA_LB_TERMINAL_ID_DVS_FE_IN_L0, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0},
++          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L1, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1},
++          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L2, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2}}}
++    };
++
++    for (unsigned int i = 0; i < ARRAY_SIZE(tps); i++) {
++        if (tps[i].pgId == pgId && tps[i].type == type) {
++            *pairs = tps[i].pairs;
++            return true;
++        }
++    }
++
++    return false;
++}
++
++} // name space PGUtils
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
+new file mode 100644
+index 000000000000..7e8ccfce6b99
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++extern "C" {
++#include <ia_css_program_group_data.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_process_group.h>
++
++#include <ia_p2p.h>
++}
++
++#include <vector>
++
++namespace icamera {
++#define PG_PAGE_SIZE 4096
++#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
++#define IPU_MAX_TERMINAL_COUNT 40
++
++struct PgFrameDesc {
++    PgFrameDesc() {
++        width = 0;
++        height = 0;
++        bpe = 0;
++    }
++    int width;
++    int height;
++    int bpe;
++};
++
++struct PgConfiguration {
++    ia_css_program_group_manifest_t* pgManifest;
++    int pgManifestSize;
++    std::vector<int> disableDataTermials;
++    uint8_t fragmentCount;
++
++    // New API, for desc calculation by itself, instead of fragmentDesc
++    PgFrameDesc inputMainFrame;
++    PgFrameDesc outputMainFrame;
++};
++
++enum {
++    TNR_BUFFER_IN_INDEX = 0,
++    TNR_BUFFER_OUT_INDEX
++};
++#define TNR_BUFFER_COUNT (TNR_BUFFER_OUT_INDEX + 1)
++
++struct TerminalPair {
++    int inId;
++    int outId;
++};
++
++namespace PGUtils {
++/* ************************************************************
++ * Common definitions
++ * ***********************************************************/
++
++ia_css_frame_format_type getCssFmt(int v4l2Fmt);
++int getCssBpp(int v4l2Fmt);
++int getCssStride(int v4l2Fmt, int width);
++
++/* ************************************************************
++ * Difference between PGs
++ * ***********************************************************/
++enum TERMINAL_PAIR_TYPE {
++    TERMINAL_PAIR_TNR,
++    TERMINAL_PAIR_DVS
++};
++
++bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs);
++} // name space PGUtils
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
+new file mode 100644
+index 000000000000..9eca3f8b1924
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
+@@ -0,0 +1,759 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PSysDAG"
++
++#include <algorithm>
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "PSysDAG.h"
++#ifdef TNR7_CM
++#include "GPUExecutor.h"
++#endif
++
++namespace icamera {
++PSysDAG::PSysDAG(int cameraId, PSysDagCallback* psysDagCB) :
++    mCameraId(cameraId),
++    mPSysDagCB(psysDagCB),
++    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_AUTO),
++    mTuningMode(TUNING_MODE_MAX),
++    mDefaultMainInputPort(MAIN_PORT),
++    mRunAicAfterQbuf(false),
++    mLastTaskSequence(-1)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    CLEAR(mOngoingSequence);
++    mPolicyManager = new PolicyManager(mCameraId);
++    mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
++}
++
++PSysDAG::~PSysDAG()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    releasePipeExecutors();
++
++    mIspParamAdaptor->deinit();
++    delete mIspParamAdaptor;
++    delete mPolicyManager;
++}
++
++void PSysDAG::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
++                           const std::map<Port, stream_t>& outputInfo) {
++    mInputFrameInfo = inputInfo;
++    mOutputFrameInfo = outputInfo;
++
++    mDefaultMainInputPort = inputInfo.begin()->first;
++    // Select default main input port in priority
++    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
++    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
++        if (mInputFrameInfo.find(availablePorts[i]) != mInputFrameInfo.end()) {
++            mDefaultMainInputPort = availablePorts[i];
++            break;
++        }
++    }
++}
++
++void PSysDAG::releasePipeExecutors()
++{
++    for (auto &executor : mExecutorsPool) {
++        delete executor;
++    }
++    mExecutorsPool.clear();
++    mExecutorStreamId.clear();
++}
++
++/*
++ * According to the policy config to create the executors,
++ * and use the graph config data to configure the executors.
++ */
++int PSysDAG::createPipeExecutors()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    releasePipeExecutors();
++
++    // initialize the sequence list to -1
++    for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++        mOngoingSequence[i] = -1;
++    }
++
++    IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
++    CheckError(!GCM, UNKNOWN_ERROR, "Failed to get GC manager in PSysDAG!");
++
++    std::shared_ptr<IGraphConfig> gc = GCM->getGraphConfig(mConfigMode);
++    CheckError(!gc, UNKNOWN_ERROR, "Failed to get GraphConfig in PSysDAG!");
++
++    int graphId = gc->getGraphId();
++    PolicyConfig* cfg = PlatformData::getExecutorPolicyConfig(graphId);
++    CheckError(!cfg, UNKNOWN_ERROR, "Failed to get PolicyConfig in PSysDAG!");
++
++    std::vector<std::string> pgNames;
++    gc->getPgNames(&pgNames);
++    bool hasVideoPipe = false, hasStillPipe = false;
++
++    for (auto &item : cfg->pipeExecutorVec) {
++        int streamId = -1;
++        bool pgFound = true;
++
++        // Not support multiple streamId in one executor,
++        // so need to the check the streamId of pgList.
++        for (auto &pgName : item.pgList) {
++            if (std::find(pgNames.begin(), pgNames.end(), pgName) == pgNames.end()) {
++                pgFound = false;
++                break;
++            }
++            int tmpId = gc->getStreamIdByPgName(pgName);
++            CheckError(tmpId == -1, BAD_VALUE, "Cannot get streamId for %s", pgName.c_str());
++            CheckError(((streamId != -1) && (tmpId != streamId)), BAD_VALUE,
++                    "the streamId: %d for pgName(%s) is different with previous: %d",
++                    tmpId, pgName.c_str(), streamId);
++            streamId = tmpId;
++            LOG1("%s executor:%s pg name:%s streamId: %d",
++                  __func__, item.exeName.c_str(), pgName.c_str(), streamId);
++        }
++        if (!pgFound)
++            continue;
++
++        if (!hasVideoPipe)
++            hasVideoPipe = (streamId == VIDEO_STREAM_ID);
++        if (!hasStillPipe)
++            hasStillPipe = (streamId == STILL_STREAM_ID);
++#ifdef TNR7_CM
++        PipeExecutor *executor;
++        if (strstr(item.exeName.c_str(), "gputnr") != nullptr) {
++            executor = new GPUExecutor(mCameraId, item, cfg->exclusivePgs, this, gc);
++        } else {
++            executor = new PipeExecutor(mCameraId, item, cfg->exclusivePgs, this, gc);
++        }
++#else
++        PipeExecutor *executor = new PipeExecutor(mCameraId, item, cfg->exclusivePgs, this, gc);
++#endif
++        executor->setIspParamAdaptor(mIspParamAdaptor);
++        executor->setStreamId(streamId);
++        executor->setPolicyManager(mPolicyManager);
++        executor->setNotifyPolicy(item.notifyPolicy);
++
++        int ret = executor->initPipe();
++        if (ret != OK) {
++            LOGE("Failed to create pipe for executor:%s", executor->getName());
++            delete executor;
++            return ret;
++        }
++
++        mExecutorsPool.push_back(executor);
++        mExecutorStreamId[executor] = streamId;
++    }
++    LOG2("%s, hasVideoPipe: %d, hasStillPipe: %d, enableBundleInSdv: %d",
++         __func__, hasVideoPipe, hasStillPipe, cfg->enableBundleInSdv);
++
++    // Only enable psys bundle with aic when has video pipe only
++    if (!hasStillPipe && PlatformData::psysBundleWithAic(mCameraId)) {
++        mRunAicAfterQbuf = true;
++    }
++
++    if (hasStillPipe && hasVideoPipe && !cfg->enableBundleInSdv) return OK;
++
++    for (auto &bundle : cfg->bundledExecutorDepths) {
++        bool foundExecutor = true;
++        for (auto &executor : bundle.bundledExecutors) {
++            std::vector<PipeExecutor*>::iterator it = std::find_if(mExecutorsPool.begin(),
++                    mExecutorsPool.end(), [executor](PipeExecutor* exec) {
++                        return exec->getName() == executor;
++                    });
++            if (it == mExecutorsPool.end()) {
++                foundExecutor = false;
++                break;
++            }
++        }
++
++        if (foundExecutor)
++            mPolicyManager->addExecutorBundle(bundle.bundledExecutors, bundle.depths);
++    }
++
++    return OK;
++}
++
++int PSysDAG::linkAndConfigExecutors()
++{
++    for (auto& consumer : mExecutorsPool) {
++        std::map<ia_uid, Port> input;
++
++        if (consumer->isInputEdge()) {
++            // Use its own input info due to no executor as producer
++            consumer->getInputTerminalPorts(input);
++        } else {
++            PipeExecutor* producer = findExecutorProducer(consumer);
++            CheckError(producer == nullptr, BAD_VALUE, "no producer for executor %s!", consumer->getName());
++            producer->getOutputTerminalPorts(input);
++
++            consumer->setBufferProducer(producer);
++            LOG1("%s: link consumer %s to %s", __func__, consumer->getName(), producer->getName());
++        }
++
++        // Link producer (output) to consumer (input) by terminal
++        consumer->setInputTerminals(input);
++
++        std::vector<ConfigMode> configModes;
++        configModes.push_back(mConfigMode);
++        consumer->configure(configModes);
++    }
++
++    return OK;
++}
++
++PipeExecutor* PSysDAG::findExecutorProducer(PipeExecutor* consumer)
++{
++    std::map<ia_uid, Port> inputTerminals;
++    consumer->getInputTerminalPorts(inputTerminals);
++
++    for (auto& executor : mExecutorsPool) {
++        if (executor == consumer) {
++            continue;
++        }
++
++        for (auto& inputTerminal : inputTerminals) {
++            // Return if one is matched, because only one producer is supported now.
++            if (executor->hasOutputTerminal(inputTerminal.first)) {
++                return executor;
++            }
++        }
++    }
++
++    return nullptr;
++}
++
++/*
++ * Search all the stream Ids in one pipe which provides frame buffer to the output port
++ * mOutputPortToStreamIds: store all the different stream Ids to output port mapping table
++ */
++status_t PSysDAG::searchStreamIdsForOutputPort(PipeExecutor *executor, Port port) {
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    CheckError(!executor || !executor->isOutputEdge(), BAD_VALUE,
++               "%s, the executor is nullptr or is not output edge", __func__);
++
++    if (mOutputPortToStreamIds.find(port) != mOutputPortToStreamIds.end()) {
++        return OK;
++    }
++
++    std::vector<int32_t> streamIds;
++    PipeExecutor *tmpExecutor = executor;
++    // Loop to find the producer executor's stream id
++    do {
++        int32_t streamId = mExecutorStreamId[tmpExecutor];
++        if (std::find(streamIds.begin(), streamIds.end(), streamId) == streamIds.end()) {
++            streamIds.push_back(streamId);
++            LOG2("%s, store the streamId: %d for output port: %d", __func__, streamId, port);
++        }
++
++        tmpExecutor = findExecutorProducer(tmpExecutor);
++    } while (tmpExecutor);
++
++    mOutputPortToStreamIds[port] = streamIds;
++
++    return OK;
++}
++
++/**
++ * Bind the port between DAG and its edge executors.
++ * After the binding we'll know where the task buffer should be queued to.
++ */
++int PSysDAG::bindExternalPortsToExecutor()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mInputMaps.clear();
++    mOutputMaps.clear();
++    mOutputPortToStreamIds.clear();
++
++    std::map<Port, stream_t> outputInfo;
++    std::map<Port, stream_t> inputInfo;
++
++    // Bind the input ports first.
++    LOG2("%s, start to bind the input port", __func__);
++    for (auto& executor : mExecutorsPool) {
++        if (!executor->isInputEdge()) {
++            continue;
++        }
++        executor->getFrameInfo(inputInfo, outputInfo);
++
++        for (auto& frameInfo : mInputFrameInfo) {
++            for (auto& portInfo : inputInfo) {
++                // Check if it has been cleared (bound already).
++                if (!portInfo.second.format) {
++                    continue;
++                }
++                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, false)) {
++                    PortMapping portMap;
++                    portMap.mExecutor = executor;
++                    portMap.mDagPort = frameInfo.first;
++                    portMap.mExecutorPort = portInfo.first;
++                    mInputMaps.push_back(portMap);
++                    // Clear the stream of executor to avoid binding it again.
++                    CLEAR(portInfo.second);
++                    LOG2("%s, inputMap executor %p, dagPort %d, execPort %d", __func__,
++                        executor, frameInfo.first, portInfo.first);
++                    break;
++                }
++            }
++        }
++    }
++
++    // Then bind the output ports.
++    LOG2("%s, start to bind the output port", __func__);
++    for (auto& executor : mExecutorsPool) {
++        if (!executor->isOutputEdge()) {
++            continue;
++        }
++
++        executor->getFrameInfo(inputInfo, outputInfo);
++        for (auto& frameInfo : mOutputFrameInfo) {
++            for (auto& portInfo : outputInfo) {
++                // Check if it has been cleared (bound already).
++                if (!portInfo.second.format) {
++                    continue;
++                }
++                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, true)) {
++                    PortMapping portMap;
++                    portMap.mExecutor = executor;
++                    portMap.mDagPort = frameInfo.first;
++                    portMap.mExecutorPort = portInfo.first;
++                    mOutputMaps.push_back(portMap);
++                    searchStreamIdsForOutputPort(executor, frameInfo.first);
++                    // Clear the stream of executor to avoid binding it again.
++                    CLEAR(portInfo.second);
++                    break;
++                }
++            }
++        }
++    }
++
++    // Each required port must be mapped to one of (edge) executor's port.
++    // One input port may be mapped to more of (edge) executor's ports.
++    CheckError(mInputMaps.size() < mInputFrameInfo.size(), BAD_VALUE, "Failed to bind input ports");
++    CheckError(mOutputMaps.size() != mOutputFrameInfo.size(), BAD_VALUE, "Failed to bind output ports");
++
++    return OK;
++}
++
++int PSysDAG::registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
++{
++    for (auto& outputMap : mOutputMaps) {
++        if (port == outputMap.mDagPort) {
++            outputMap.mExecutor->registerOutBuffers(outputMap.mExecutorPort, camBuffer);
++            break;
++        }
++    }
++
++    return OK;
++}
++
++int PSysDAG::registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs)
++{
++    for (auto& portToBuffers : internalBufs) {
++        for (auto& inputMap : mInputMaps) {
++            if (inputMap.mDagPort == portToBuffers.first) {
++                for (auto& inputBuf : portToBuffers.second) {
++                    inputMap.mExecutor->registerInBuffers(inputMap.mExecutorPort, inputBuf);
++                }
++                break;
++            }
++        }
++    }
++
++    return OK;
++}
++
++/**
++ * Queue the buffers in PSysTaskData to the cooresponding executors.
++ */
++int PSysDAG::queueBuffers(const PSysTaskData& task)
++{
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    // Provide the input buffers for the input edge executor.
++    for (auto& inputFrame : task.mInputBuffers) {
++        for (auto& inputMap : mInputMaps) {
++            if (inputMap.mDagPort == inputFrame.first) {
++                inputMap.mExecutor->onFrameAvailable(inputMap.mExecutorPort, inputFrame.second);
++                LOG2("%s, queue input buffer: dagPort: %d, executorPort: %d, name: %s", __func__,
++                     inputMap.mDagPort, inputMap.mExecutorPort, inputMap.mExecutor->getName());
++            }
++        }
++    }
++
++    // Provide the output buffers for the output edge executor.
++    for (auto& outputFrame : task.mOutputBuffers) {
++        for (auto& outputMap : mOutputMaps) {
++            if (outputMap.mDagPort == outputFrame.first) {
++                outputMap.mExecutor->qbuf(outputMap.mExecutorPort, outputFrame.second);
++                LOG2("%s, queue output buffer, dagPort: %d, executorPort: %d, name: %s", __func__,
++                     outputMap.mDagPort, outputMap.mExecutorPort, outputMap.mExecutor->getName());
++                break;
++            }
++        }
++    }
++
++    return OK;
++}
++
++int PSysDAG::configure(ConfigMode configMode, TuningMode tuningMode)
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mConfigMode = configMode;
++    mTuningMode = tuningMode;
++    mRunAicAfterQbuf = false;
++    mLastTaskSequence = -1;
++
++    // Configure IspParamAdaptor
++    int ret = mIspParamAdaptor->init();
++    CheckError(ret != OK, ret, "Init isp Adaptor failed, tuningMode %d", mTuningMode);
++
++    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, mTuningMode);
++    CheckError(ret != OK, ret, "Configure isp Adaptor failed, tuningMode %d", mTuningMode);
++
++    ret = createPipeExecutors();
++    CheckError(ret != OK, ret, "@%s, create psys executors failed", __func__);
++
++    ret = linkAndConfigExecutors();
++    CheckError(ret != OK, ret, "Link executors failed");
++
++    ret = bindExternalPortsToExecutor();
++    CheckError(ret != OK, ret, "Bind ports failed");
++
++    return OK;
++}
++
++int PSysDAG::start()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mPolicyManager->setActive(true);
++
++    for (auto& executors : mExecutorsPool) {
++        executors->start();
++    }
++    return OK;
++}
++
++int PSysDAG::stop()
++{
++    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
++
++    mPolicyManager->setActive(false);
++
++    for (auto& executors : mExecutorsPool) {
++        executors->notifyStop();
++    }
++
++    for (auto& executors : mExecutorsPool) {
++        executors->stop();
++    }
++    return OK;
++}
++
++int PSysDAG::resume()
++{
++    mPolicyManager->setActive(true);
++    return OK;
++}
++
++int PSysDAG::pause()
++{
++    mPolicyManager->setActive(false);
++    return OK;
++}
++
++void PSysDAG::addTask(PSysTaskData taskParam)
++{
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    if (taskParam.mTuningMode != mTuningMode) {
++        tuningReconfig(taskParam.mTuningMode);
++    }
++
++    TaskInfo task = {};
++    {
++        // Save the task data into mOngoingTasks
++        task.mTaskData = taskParam;
++        // Count how many valid output buffers need to be returned.
++        for (auto& outBuf : taskParam.mOutputBuffers) {
++            if (outBuf.second) {
++                task.mNumOfValidBuffers++;
++            }
++        }
++        LOG2("%s:Id:%d push task with %d output buffers, sequence: %ld",
++                __func__, mCameraId, task.mNumOfValidBuffers,
++                taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence());
++        AutoMutex taskLock(mTaskLock);
++        mOngoingTasks.push_back(task);
++    }
++
++    // It's too early to runIspAdapt here, and the ipu parameters
++    // may be incorrect when runPipe.
++    bool runIspAdaptor = true;
++
++    // Run aic before queue psys buffer:
++    //  1. disable psys bundle with aic or has still pipe configured
++    //  2. for the first task
++    //  3. need to run aic for current task if drop frame happens
++    long sequence = taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence();
++    if (runIspAdaptor && (!mRunAicAfterQbuf ||
++        (mLastTaskSequence == -1) || (sequence > mLastTaskSequence + 1))) {
++        LOG2("%s, run AIC before execute psys for sequence: %ld", __func__, sequence);
++        prepareIpuParams(sequence, false, &task);
++    }
++
++    queueBuffers(taskParam);
++
++    if (runIspAdaptor && mRunAicAfterQbuf) {
++        LOG2("%s, run AIC bundle with execute psys for sequence: %ld", __func__, sequence);
++        // if running psys bundle with aic, current aic result is for next sequence
++        prepareIpuParams((sequence + 1), false, &task);
++    }
++
++    mLastTaskSequence = sequence;
++}
++
++int PSysDAG::getParameters(Parameters& param)
++{
++    return mIspParamAdaptor->getParameters(param);
++}
++
++TuningMode PSysDAG::getTuningMode(long sequence)
++{
++    AutoMutex taskLock(mTaskLock);
++
++    TuningMode taskTuningMode = mTuningMode;
++    bool taskTuningModeFound = false;
++
++    for (auto const& task : mOngoingTasks) {
++        if (sequence == task.mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
++            taskTuningMode = task.mTaskData.mTuningMode;
++            taskTuningModeFound = true;
++            break;
++        }
++    }
++
++    if (!taskTuningModeFound) {
++        LOGW("No task tuning mode found for sequence:%ld, use current DAG tuning mode.", sequence);
++    }
++
++    return taskTuningMode;
++}
++
++/**
++ * Use to handle the frame done event from the executors.
++ *
++ * This is for returning output buffers to PSysDAG. And it'll check if all the valid
++ * output buffer returned, if so, then it'll return the whole corresponding task data to
++ * PSysProcessor.
++ */
++int PSysDAG::onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer)
++{
++    LOG2("@%s, mCameraId:%d buffer=%p", __func__, mCameraId, buffer.get());
++
++    if (!buffer) return OK; // No need to handle if the buffer is nullptr.
++
++    long sequence = buffer->getSequence();
++    bool needReturn = false;
++    Port outputPort = INVALID_PORT;
++    PSysTaskData result;
++    {
++        AutoMutex taskLock(mTaskLock);
++        for (auto it = mOngoingTasks.begin(); it != mOngoingTasks.end(); it++) {
++            // Check if the returned buffer belong to the task.
++            if (sequence != it->mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
++                continue;
++            }
++
++            for (auto& buf : it->mTaskData.mOutputBuffers) {
++                if (buf.second && (buffer->getUserBuffer() == buf.second->getUserBuffer())) {
++                    outputPort = buf.first;
++                }
++            }
++            it->mNumOfReturnedBuffers++;
++            if (it->mNumOfReturnedBuffers >= it->mNumOfValidBuffers) {
++                result = it->mTaskData;
++                needReturn = true;
++                LOG2("%s:Id:%d finish task with %d returned output buffers, sequence: %ld",
++                     __func__, mCameraId, it->mNumOfReturnedBuffers, sequence);
++                // Remove the task data from mOngoingTasks since it's already processed.
++                mOngoingTasks.erase(it);
++
++                // Remove the sequence when finish to process the task
++                AutoMutex l(mSequenceLock);
++                for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++                    if (mOngoingSequence[i] == sequence) {
++                        mOngoingSequence[i] = -1;
++                        break;
++                    }
++                }
++            }
++            // No need check other if other tasks are matched with the returned buffer since
++            // we already found one.
++            break;
++        }
++    }
++
++    CheckError(outputPort == INVALID_PORT, INVALID_OPERATION, "outputPort is invalid");
++    // Return buffer
++    mPSysDagCB->onBufferDone(sequence, outputPort, buffer);
++
++    if (needReturn) {
++        returnBuffers(result);
++    }
++
++    return OK;
++}
++
++int PSysDAG::prepareIpuParams(long sequence, bool forceUpdate, TaskInfo *task)
++{
++    TRACE_LOG_PROCESS("PSysDAG", __func__, MAKE_COLOR(sequence), sequence);
++    // Make sure the AIC is executed once.
++    if (!forceUpdate) {
++        AutoMutex l(mSequenceLock);
++
++        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++            // This means aic for the sequence has been executed.
++            if (mOngoingSequence[i] == sequence) {
++                return OK;
++            }
++        }
++
++        // Store the new sequence.
++        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++            if (mOngoingSequence[i] == -1) {
++                mOngoingSequence[i] = sequence;
++                break;
++            }
++        }
++    }
++
++    if (task == nullptr) {
++        AutoMutex taskLock(mTaskLock);
++        for (size_t i = 0; i < mOngoingTasks.size(); i++) {
++            if (sequence ==
++                mOngoingTasks[i].mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
++                task = &mOngoingTasks[i];
++                break;
++            }
++        }
++    }
++    CheckError(!task, UNKNOWN_ERROR,
++               "%s, Failed to find the task for sequence: %ld", __func__, sequence);
++
++    // According to the output port to filter the valid executor stream Ids, and then run AIC
++    std::vector<int32_t> activeStreamIds;
++    for (auto& outputFrame : task->mTaskData.mOutputBuffers) {
++        if (outputFrame.second.get() == nullptr)
++            continue;
++
++        std::map<Port, std::vector<int32_t> >::iterator
++            it = mOutputPortToStreamIds.find(outputFrame.first);
++        CheckError(it == mOutputPortToStreamIds.end(), UNKNOWN_ERROR,
++                   "%s, failed to find streamIds for output port: %d",
++                   __func__, outputFrame.first);
++
++        for (auto& streamId : it->second) {
++            if (std::find(activeStreamIds.begin(), activeStreamIds.end(), streamId)
++                    == activeStreamIds.end()) {
++                activeStreamIds.push_back(streamId);
++            }
++        }
++    }
++    LOG2("%s, the active streamId size for aic(sequence: %ld) is %zu",
++         __func__, sequence, activeStreamIds.size());
++
++    int ret = OK;
++    for (auto& id : activeStreamIds) {
++        ret = mIspParamAdaptor->runIspAdapt(&task->mTaskData.mIspSettings, sequence, id);
++        CheckError(ret != OK, UNKNOWN_ERROR,
++                   "%s, Failed to run AIC: sequence: %ld streamId: %d", __func__, sequence, id);
++    }
++
++    return OK;
++}
++
++int PSysDAG::returnBuffers(PSysTaskData& result)
++{
++    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
++
++    CheckError(!mPSysDagCB, INVALID_OPERATION, "Invalid PSysProcessor");
++
++    mPSysDagCB->onFrameDone(result);
++    return OK;
++}
++
++void PSysDAG::registerListener(EventType eventType, EventListener* eventListener)
++{
++    //Pass through event registration to PipeExecutor
++    for (auto const& executor : mExecutorsPool) {
++        executor->registerListener(eventType, eventListener);
++    }
++}
++
++void PSysDAG::removeListener(EventType eventType, EventListener* eventListener)
++{
++    //Pass through event unregistration to PipeExecutor
++    for (auto const& executor : mExecutorsPool) {
++        executor->removeListener(eventType, eventListener);
++    }
++}
++
++void PSysDAG::tuningReconfig(TuningMode newTuningMode)
++{
++    LOG1("@%s ", __func__);
++
++    if (mIspParamAdaptor) {
++        mIspParamAdaptor->deinit();
++    } else {
++        mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
++    }
++
++    int ret = mIspParamAdaptor->init();
++    CheckError(ret != OK, VOID_VALUE, "Init isp Adaptor failed, tuningMode %d", newTuningMode);
++
++    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, newTuningMode);
++    CheckError(ret != OK, VOID_VALUE, "Failed to reconfig isp Adaptor.");
++
++    mTuningMode = newTuningMode;
++}
++
++void PSysDAG::dumpExternalPortMap()
++{
++    for (auto& inputMap : mInputMaps) {
++        if (inputMap.mExecutor) {
++            LOG2("@%s: Input port %d, executor: %s:%d", __func__, inputMap.mDagPort,
++                 inputMap.mExecutor->getName(), inputMap.mExecutorPort);
++        } else {
++            LOGE("%s: no executro for input port %d!", __func__, inputMap.mDagPort);
++        }
++    }
++    for (auto& outputMap : mOutputMaps) {
++        if (outputMap.mExecutor) {
++            LOG2("@%s: Output port %d, executor: %s:%d", __func__, outputMap.mDagPort,
++                 outputMap.mExecutor->getName(), outputMap.mExecutorPort);
++        } else {
++            LOGE("%s: no executro for output port %d!", __func__, outputMap.mDagPort);
++        }
++    }
++}
++
++}
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
+new file mode 100644
+index 000000000000..399535159a5b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <unordered_map>
++
++#include "Parameters.h"
++#include "PlatformData.h"
++#include "CameraBuffer.h"
++#include "IspParamAdaptor.h"
++#ifdef USE_PG_LITE_PIPE
++#include "PipeLiteExecutor.h"
++#else
++#include "PipeExecutor.h"
++#endif
++#include "PolicyManager.h"
++
++/*************************************************
++ * TODO: currently only consider video stream,
++ *       will also consider still stream later.
++ *************************************************/
++
++namespace icamera {
++
++/**
++ * Encapsulation of all parameters needed by PSysExecutor to run PSYS pipeline.
++ */
++struct PSysTaskData {
++    IspSettings mIspSettings;
++    TuningMode mTuningMode;
++
++    CameraBufferPortMap mInputBuffers;
++    CameraBufferPortMap mOutputBuffers;
++    PSysTaskData() { mTuningMode = TUNING_MODE_MAX; }
++};
++
++// Used to save all on-processing tasks.
++struct TaskInfo {
++    TaskInfo() : mNumOfValidBuffers(0), mNumOfReturnedBuffers(0) {}
++    PSysTaskData mTaskData;
++    int mNumOfValidBuffers;
++    int mNumOfReturnedBuffers;
++};
++
++class PSysDagCallback {
++public:
++    PSysDagCallback() {}
++    virtual ~PSysDagCallback() {}
++    virtual void onFrameDone(const PSysTaskData& result) {}
++    virtual void onBufferDone(int64_t sequence, Port port,
++                              const std::shared_ptr<CameraBuffer> &camBuffer) {}
++};
++
++class PSysDAG {
++
++public:
++    PSysDAG(int cameraId, PSysDagCallback* psysDagCB);
++    virtual ~PSysDAG();
++    void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
++                      const std::map<Port, stream_t>& outputInfo);
++    int configure(ConfigMode configMode, TuningMode tuningMode);
++    int start();
++    int stop();
++
++    int resume();
++    int pause();
++
++    int registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs);
++    int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++
++    void addTask(PSysTaskData taskParam);
++    int getParameters(Parameters& param);
++
++    void registerListener(EventType eventType, EventListener* eventListener);
++    void removeListener(EventType eventType, EventListener* eventListener);
++
++    TuningMode getTuningMode(long sequence);
++    int prepareIpuParams(long sequence, bool forceUpdate = false, TaskInfo *task = nullptr);
++
++    /**
++     * Use to handle the frame done event from the executors.
++     */
++    int onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(PSysDAG);
++
++    void tuningReconfig(TuningMode newTuningMode);
++
++    int createPipeExecutors();
++    int linkAndConfigExecutors();
++    int bindExternalPortsToExecutor();
++    void releasePipeExecutors();
++
++    PipeExecutor* findExecutorProducer(PipeExecutor* consumer);
++    status_t searchStreamIdsForOutputPort(PipeExecutor *executor, Port port);
++
++    int queueBuffers(const PSysTaskData& task);
++    int returnBuffers(PSysTaskData& result);
++
++    void dumpExternalPortMap();
++
++private:
++    int mCameraId;
++    PSysDagCallback* mPSysDagCB; //Used to callback notify frame done handling
++    PolicyManager* mPolicyManager;
++    ConfigMode mConfigMode; //It is actually real config mode.
++    TuningMode mTuningMode;
++    IspParamAdaptor* mIspParamAdaptor;
++
++    std::map<Port, stream_t> mInputFrameInfo;
++    std::map<Port, stream_t> mOutputFrameInfo;
++    Port mDefaultMainInputPort;
++
++    std::vector<PipeExecutor*> mExecutorsPool;
++    std::unordered_map<PipeExecutor*, int32_t> mExecutorStreamId;
++    std::map<Port, std::vector<int32_t> > mOutputPortToStreamIds;
++
++    // A lock for protecting task data from being accessed by different threads.
++    Mutex mTaskLock;
++    std::vector<TaskInfo> mOngoingTasks;
++
++    long mOngoingSequence[MAX_BUFFER_COUNT];
++    Mutex mSequenceLock;
++    bool mRunAicAfterQbuf;
++    long mLastTaskSequence;
++
++    /**
++     * The relationship mapping between DAG's port and executors port.
++     */
++    struct PortMapping {
++        PortMapping() : mExecutor(nullptr), mDagPort(INVALID_PORT), mExecutorPort(INVALID_PORT) {}
++        PipeExecutor* mExecutor;
++        Port mDagPort;
++        Port mExecutorPort;
++    };
++
++    std::vector<PortMapping> mInputMaps;
++    std::vector<PortMapping> mOutputMaps;
++};
++}
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
+new file mode 100644
+index 000000000000..a4b7f3eb10de
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
+@@ -0,0 +1,1127 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PipeLiteExecutor"
++
++#include <algorithm>
++
++#include "PipeLiteExecutor.h"
++#include "PSysDAG.h"
++
++#include "FormatUtils.h"
++#include "iutils/CameraDump.h"
++#include "SyncManager.h"
++
++// CIPF backends
++extern "C" {
++#include <ia_cipf_css/ia_cipf_css.h>
++#include <ia_pal_types_isp_ids_autogen.h>
++}
++
++using std::vector;
++using std::string;
++using std::map;
++using std::shared_ptr;
++
++namespace icamera {
++
++static const int32_t sStatKernels[] = {
++    ia_pal_uuid_isp_bxt_awbstatistics,
++    ia_pal_uuid_isp_awbstatistics_2_0,
++    ia_pal_uuid_isp_bxt_dvsstatistics
++};
++
++static const int32_t sSisKernels[] = {
++    ia_pal_uuid_isp_sis_1_0_a
++};
++
++PipeLiteExecutor::PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
++                                   vector<string> exclusivePGs, PSysDAG *psysDag,
++                                   shared_ptr<IGraphConfig> gc)
++      : mCameraId(cameraId),
++        mStreamId(-1),
++        mName(policy.exeName),
++        mPGNames(policy.pgList),
++        mOpModes(policy.opModeList),
++        mGraphConfig(gc),
++        mIsInputEdge(false),
++        mIsOutputEdge(false),
++        mNotifyPolicy(POLICY_FRAME_FIRST),
++        mAdaptor(nullptr),
++        mPolicyManager(nullptr),
++        mLastStatsSequence(-1),
++        mExclusivePGs(exclusivePGs),
++        mPSysDag(psysDag),
++        mkernelsCountWithStats(0)
++{
++}
++
++PipeLiteExecutor::~PipeLiteExecutor()
++{
++    while (!mPGExecutors.empty()) {
++        ExecutorUnit& unit = mPGExecutors.back();
++        if (unit.pg.get()) {
++            unit.pg->deInit();
++        }
++        mPGExecutors.pop_back();
++    }
++
++    releaseBuffers();
++}
++
++int PipeLiteExecutor::initPipe()
++{
++    LOG1("@%s:%s", __func__, getName());
++    CheckError(mGraphConfig == nullptr, BAD_VALUE, "%s, the graph config is NULL, BUG!", __func__);
++
++    NodesPtrVector programGroups;
++    vector<IGraphType::PipelineConnection> connVector;
++
++    int ret = mGraphConfig->pipelineGetConnections(mPGNames, &connVector);
++    CheckError(connVector.empty(), ret, "Failed to get connections for executor:%s", mName.c_str());
++
++    ret = createPGs();
++    CheckError(ret != OK, ret, "Failed to create PGs for executor: %s", ret, mName.c_str());
++
++    ret = analyzeConnections(connVector);
++    CheckError(ret != OK, ret, "Failed to analyze connections for executor: %s", ret, mName.c_str());
++
++    ret = configurePGs();
++    CheckError(ret != OK, ret, "Failed to configure connections for executor: %s", ret, mName.c_str());
++
++    assignDefaultPortsForTerminals();
++    return OK;
++}
++
++int PipeLiteExecutor::analyzeConnections(const vector<IGraphType::PipelineConnection>& connVector)
++{
++    ia_uid firstStageId = mPGExecutors.front().stageId;
++    ia_uid lastStageId = mPGExecutors.back().stageId;
++
++    for (auto const& connection : connVector) {
++        LOG2("%s: terminal %d (%d): %dx%d, 0x%x", getName(),
++             connection.portFormatSettings.terminalId, connection.portFormatSettings.enabled,
++             connection.portFormatSettings.width, connection.portFormatSettings.height,
++             connection.portFormatSettings.fourcc);
++        LOG2("%s:     connection source %d, %d, %d, has edge %d", getName(),
++             connection.connectionConfig.mSourceStage, connection.connectionConfig.mSourceTerminal,
++             connection.connectionConfig.mSourceIteration, connection.hasEdgePort);
++        LOG2("%s:     connection sink %d, %d, %d, type %d", getName(),
++             connection.connectionConfig.mSinkStage, connection.connectionConfig.mSinkTerminal,
++             connection.connectionConfig.mSinkIteration, connection.connectionConfig.mConnectionType);
++
++        storeTerminalInfo(connection);
++
++        if (connection.portFormatSettings.enabled == 0) {
++            // No actions are needed for the disabled connections.
++            continue;
++        }
++
++        // If the connection's sink stage is same as the first stage/pg id in this executor,
++        // then it means the connection belongs to input terminal pairs.
++        if (connection.connectionConfig.mSinkStage == firstStageId && connection.hasEdgePort) {
++            mIsInputEdge = true;
++        }
++
++        // If the connection's source stage is same as the last stage/pg id in this executor,
++        // then it means the connection belongs to output terminal pairs.
++        // SIS is output terminal but it doesn't belong to any stream, so it is not real edge output.
++        if (connection.connectionConfig.mSourceStage == lastStageId
++            && connection.hasEdgePort
++            && connection.connectionConfig.mSourceTerminal != connection.connectionConfig.mSinkTerminal) {
++            mIsOutputEdge = true;
++        }
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::storeTerminalInfo(const IGraphType::PipelineConnection& connection)
++{
++    FrameInfo info;
++    info.mWidth = connection.portFormatSettings.width;
++    info.mHeight = connection.portFormatSettings.height;
++    info.mFormat = connection.portFormatSettings.fourcc;
++
++    ia_uid curTerminal    = connection.portFormatSettings.terminalId;
++    ia_uid sinkTerminal   = connection.connectionConfig.mSinkTerminal;
++    ia_uid sourceTerminal = connection.connectionConfig.mSourceTerminal;
++    ia_uid sinkStage      = connection.connectionConfig.mSinkStage;
++    ia_uid sourceStage    = connection.connectionConfig.mSourceStage;
++
++    TerminalDescriptor desc;
++    desc.terminal       = 0;
++    desc.stageId        = 0;
++    desc.sinkTerminal   = sinkTerminal;
++    desc.sourceTerminal = sourceTerminal;
++    desc.sinkStage      = sinkStage;
++    desc.sourceStage    = sourceStage;
++    desc.frameDesc      = info;
++    desc.enabled        = true;
++    desc.hasConnection  = true;
++    desc.assignedPort   = INVALID_PORT;
++    desc.usrStreamId   = connection.stream ? connection.stream->streamId() : -1;
++
++    if (connection.portFormatSettings.enabled) {
++        mConnectionMap[sinkTerminal]= sourceTerminal;
++    }
++
++    // Check if there is new input terminal
++    if (sinkStage && mTerminalsDesc.find(sinkTerminal) == mTerminalsDesc.end()) {
++        ExecutorUnit* unit = findPGExecutor(sinkStage);
++        if (unit) {
++            desc.terminal = sinkTerminal;
++            desc.stageId = sinkStage;
++            mTerminalsDesc[desc.terminal] = desc;
++            unit->inputTerminals.push_back(desc.terminal);
++        }
++    }
++    // Check if there is new output terminal
++    if (sourceStage && mTerminalsDesc.find(sourceTerminal) == mTerminalsDesc.end()) {
++        ExecutorUnit* unit = findPGExecutor(sourceStage);
++        if (unit) {
++            desc.terminal = sourceTerminal;
++            desc.stageId = sourceStage;
++            desc.hasConnection = (sinkTerminal != sourceTerminal);
++            mTerminalsDesc[desc.terminal] = desc;
++            unit->outputTerminals.push_back(desc.terminal);
++        }
++    }
++
++    if (mTerminalsDesc.find(curTerminal) != mTerminalsDesc.end()) {
++        mTerminalsDesc[curTerminal].enabled = connection.portFormatSettings.enabled;
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::createPGs()
++{
++    for (auto const& pgName : mPGNames) {
++        int pgId = mGraphConfig->getPgIdByPgName(pgName);
++        CheckError(pgId == -1, BAD_VALUE, "Cannot get PG ID for %s", pgName.c_str());
++
++        ExecutorUnit pgUnit;
++        pgUnit.pgId = pgId;
++        pgUnit.stageId = psys_2600_pg_uid(pgId);
++        pgUnit.pg = std::shared_ptr<PGCommon>(new PGCommon(pgId, pgName, pgUnit.stageId + 1));
++        // Please refer to ia_cipf_css.h for terminalBaseUid
++        mPGExecutors.push_back(pgUnit);
++        int ret = pgUnit.pg->init();
++        CheckError(ret != OK, UNKNOWN_ERROR, "create PG %d error", pgId);
++    }
++    return OK;
++}
++
++int PipeLiteExecutor::configurePGs()
++{
++    mkernelsCountWithStats = 0;
++    for (auto &unit : mPGExecutors) {
++        map<ia_uid, FrameInfo> inputInfos;
++        map<ia_uid, FrameInfo> outputInfos;
++        vector<ia_uid> disabledTerminals;
++
++        getTerminalFrameInfos(unit.inputTerminals, inputInfos);
++        getTerminalFrameInfos(unit.outputTerminals, outputInfos);
++        getDisabledTerminalsForPG(unit.stageId, disabledTerminals);
++
++        unit.pg->setInputInfo(inputInfos);
++        unit.pg->setOutputInfo(outputInfos);
++        unit.pg->setDisabledTerminals(disabledTerminals);
++
++        IGraphType::StageAttr stageAttr;
++        if (mGraphConfig->getPgRbmValue(unit.pg->getName(), &stageAttr) == OK) {
++            LOG1("%s: Set rbm for pgId %d, pgName: %s bytes %d",
++                 __func__, unit.pgId, unit.pg->getName(), stageAttr.rbm_bytes);
++            unit.pg->setRoutingBitmap(stageAttr.rbm, stageAttr.rbm_bytes);
++        }
++        unit.pg->prepare(mAdaptor, mStreamId);
++
++        int statsCount = getStatKernels(unit.pgId, unit.statKernelUids);
++        mkernelsCountWithStats += statsCount;
++
++        statsCount = getSisKernels(unit.pgId, unit.sisKernelUids);
++        mkernelsCountWithStats += statsCount;
++    }
++
++    return OK;
++}
++
++/**
++ * Assign ports for terminals as internal default value
++ * Input ports may be overwritten with output ports of producer in setInputTerminals()
++ */
++int PipeLiteExecutor::assignDefaultPortsForTerminals()
++{
++    Port portTable[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
++    for (auto &unit : mPGExecutors) {
++        int outPortIndex = 0;
++        for (auto terminal : unit.outputTerminals) {
++            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
++            if (termDesc.enabled && termDesc.hasConnection) {
++                CheckError(portTable[outPortIndex] == INVALID_PORT, BAD_VALUE,
++                    "Port unavailable for output term %d:%d", unit.pgId, terminal);
++                termDesc.assignedPort = portTable[outPortIndex];
++                outPortIndex++;
++            }
++        }
++
++        int inPortIndex = 0;
++        for (auto terminal : unit.inputTerminals) {
++            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
++            if (termDesc.enabled && termDesc.hasConnection) {
++                CheckError(portTable[inPortIndex] == INVALID_PORT, BAD_VALUE,
++                    "Port unavailable for input term %d", terminal);
++                termDesc.assignedPort = portTable[inPortIndex];
++                inPortIndex++;
++            }
++        }
++    }
++
++    return OK;
++}
++
++void PipeLiteExecutor::getOutputTerminalPorts(std::map<ia_uid, Port>& terminals) const
++{
++    getTerminalPorts(mPGExecutors.back().outputTerminals, terminals);
++}
++
++void PipeLiteExecutor::getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const
++{
++    getTerminalPorts(mPGExecutors.front().inputTerminals, terminals);
++}
++
++int PipeLiteExecutor::setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals)
++{
++    // In edge PGs accepts input ports arrangement from external
++    ExecutorUnit& inUnit = mPGExecutors.front();
++    for (auto sinkTerminal : inUnit.inputTerminals) {
++        if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
++            continue;
++        }
++
++        ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
++        if (sourceTerminals.find(sourceTerminal) != sourceTerminals.end()) {
++            mTerminalsDesc[sinkTerminal].assignedPort = sourceTerminals.at(sourceTerminal);
++            LOG2("pg %s get external %d -> input %d, port %d", getName(),
++                 sourceTerminal, sinkTerminal, mTerminalsDesc[sinkTerminal].assignedPort);
++        }
++    }
++
++    // Link internal PGs (sink PG accepts input ports arrangement from source PG (output ports)
++    // source PG(output ports) -> (input ports)sink PG
++    for (unsigned int i = 1; i < mPGExecutors.size(); i++) {
++        for (auto sinkTerminal : mPGExecutors[i].inputTerminals) {
++            if (!mTerminalsDesc[sinkTerminal].enabled) {
++                continue;
++            }
++            if (mConnectionMap.find(sinkTerminal) != mConnectionMap.end()) {
++                ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
++                mTerminalsDesc[sinkTerminal].assignedPort = mTerminalsDesc[sourceTerminal].assignedPort;
++            }
++        }
++    }
++
++    // Set frame info to BufferQueue
++    map<Port, stream_t> inputInfo;
++    map<Port, stream_t> outputInfo;
++    ExecutorUnit& outUnit = mPGExecutors.back();
++    for (auto terminal : inUnit.inputTerminals) {
++        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
++            continue;
++        }
++
++        stream_t inputConfig;
++        CLEAR(inputConfig);
++        inputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
++        inputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
++        inputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
++        inputConfig.id = mTerminalsDesc[terminal].usrStreamId;
++        inputInfo[mTerminalsDesc[terminal].assignedPort] = inputConfig;
++    }
++    for (auto terminal : outUnit.outputTerminals) {
++        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
++            continue;
++        }
++
++        stream_t outputConfig;
++        CLEAR(outputConfig);
++        outputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
++        outputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
++        outputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
++        outputConfig.id = mTerminalsDesc[terminal].usrStreamId;
++        outputInfo[mTerminalsDesc[terminal].assignedPort] = outputConfig;
++    }
++    BufferQueue::setFrameInfo(inputInfo, outputInfo);
++
++    return OK;
++}
++
++int PipeLiteExecutor::start()
++{
++    LOG1("%s executor:%s", __func__, mName.c_str());
++    mProcessThread = new ProcessThread(this);
++    AutoMutex   l(mBufferQueueLock);
++
++    allocBuffers();
++    dumpPGs();
++
++    mLastStatsSequence = -1;
++
++    mThreadRunning = true;
++    mProcessThread->run(mName.c_str(), PRIORITY_NORMAL);
++
++    return OK;
++}
++
++void PipeLiteExecutor::stop()
++{
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    mProcessThread->requestExitAndWait();
++
++    // Thread is not running. It is safe to clear the Queue
++    clearBufferQueues();
++    delete mProcessThread;
++}
++
++void PipeLiteExecutor::notifyStop()
++{
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    mProcessThread->requestExit();
++    {
++        AutoMutex l(mBufferQueueLock);
++        mThreadRunning = false;
++        // Wakeup the thread to exit
++        mFrameAvailableSignal.signal();
++        mOutputAvailableSignal.signal();
++    }
++}
++
++int PipeLiteExecutor::releaseStatsBuffer(const shared_ptr<CameraBuffer> &statsBuf)
++{
++    LOG3A("%s executor:%s", __func__, mName.c_str());
++    AutoMutex lock(mStatsBuffersLock);
++
++    mStatsBuffers.push(statsBuf);
++
++    return OK;
++}
++
++bool PipeLiteExecutor::hasOutputTerminal(ia_uid sinkTerminal)
++{
++    if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
++        return false;
++    }
++
++    ExecutorUnit& unit = mPGExecutors.back();
++    for (auto sourceTerminal : unit.outputTerminals) {
++        if (mConnectionMap[sinkTerminal] == sourceTerminal) {
++            return true;
++        }
++    }
++    return false;
++}
++
++int PipeLiteExecutor::getStatKernels(int pgId, vector<ia_uid>& kernels)
++{
++    kernels.clear();
++    for (unsigned int i = 0; i < ARRAY_SIZE(sStatKernels); i++) {
++        int pgIdOfKernel = -1;
++        int status = mGraphConfig->getPgIdForKernel(mStreamId, sStatKernels[i], &pgIdOfKernel);
++        if (status == OK && pgIdOfKernel == pgId) {
++             kernels.push_back(sStatKernels[i]);
++        }
++    }
++
++    LOG1("pg %d has %d stat kernels", pgId, kernels.size());
++    return kernels.size();
++}
++
++int PipeLiteExecutor::getSisKernels(int pgId, vector<ia_uid>& kernels)
++{
++    kernels.clear();
++    for (unsigned int i = 0; i < ARRAY_SIZE(sSisKernels); i++) {
++        int pgIdOfKernel = -1;
++        int status = mGraphConfig->getPgIdForKernel(mStreamId, sSisKernels[i], &pgIdOfKernel);
++        if (status == OK && pgIdOfKernel == pgId) {
++             kernels.push_back(sSisKernels[i]);
++        }
++    }
++
++    LOG1("pg %d has %d sis kernels", pgId, kernels.size());
++    return kernels.size();
++}
++
++bool PipeLiteExecutor::isSameStreamConfig(const stream_t& internal, const stream_t& external,
++                                          ConfigMode configMode, bool checkStreamId) const
++{
++    // The internal format is ia_fourcc based format, so need to convert it to V4L2 format.
++    int internalFormat = graphconfig::utils::getV4L2Format(internal.format);
++    int internalStride = CameraUtils::getStride(internalFormat, internal.width);
++    int externalStride = CameraUtils::getStride(external.format, external.width);
++
++    LOG1("%s: %s, id:%d, internal: %s(%dx%d: %d)(id %d), external: %s(%dx%d: %d) (id %d) usage:%d",
++          __func__, mName.c_str(), mStreamId,
++          CameraUtils::format2string(internalFormat).c_str(),
++          internal.width, internal.height, internalStride, internal.id,
++          CameraUtils::format2string(external.format).c_str(),
++          external.width, external.height, externalStride, external.id, external.usage);
++
++    if (checkStreamId && internal.id >= 0) {
++        return internal.id == external.id;
++    }
++
++    /*
++     * WA: PG accept GRBG format but actual input data is of RGGB format,
++     *     PG use its kernel to crop to GRBG
++     */
++    if ((internalFormat == V4L2_PIX_FMT_SGRBG10 || internalFormat == V4L2_PIX_FMT_SGRBG12)
++         && (external.format == V4L2_PIX_FMT_SRGGB10 || external.format == V4L2_PIX_FMT_SRGGB12)) {
++         return true;
++    }
++
++    bool sameHeight = internal.height == external.height ||
++                      internal.height == ALIGN_32(external.height);
++    if (internalFormat == external.format && sameHeight &&
++        (internal.width == external.width || internalStride == externalStride)) {
++        return true;
++    }
++
++    return false;
++}
++
++/**
++ * Check if there is any valid buffer(not null) in the given port/buffer pairs.
++ *
++ * return true if there is at least one not null buffer.
++ */
++bool PipeLiteExecutor::hasValidBuffers(const CameraBufferPortMap& buffers)
++{
++    for (const auto& item : buffers) {
++        if (item.second) return true;
++    }
++
++    return false;
++}
++
++int PipeLiteExecutor::processNewFrame()
++{
++    PERF_CAMERA_ATRACE();
++
++    int ret = OK;
++    CameraBufferPortMap inBuffers, outBuffers;
++    // Wait frame buffers.
++    {
++        ConditionLock lock(mBufferQueueLock);
++        ret = waitFreeBuffersInQueue(lock, inBuffers, outBuffers);
++        // Already stopped
++        if (!mThreadRunning) return -1;
++
++        if (ret != OK) return OK; // Wait frame buffer error should not involve thread exit.
++
++        CheckError(inBuffers.empty() || outBuffers.empty(),
++              UNKNOWN_ERROR, "Failed to get input or output buffers.");
++
++        for (auto& output: mOutputQueue) {
++            output.second.pop();
++        }
++
++        for (auto& input: mInputQueue) {
++            input.second.pop();
++        }
++    }
++
++    // Check if the executor needs to run the actual pipeline.
++    // It only needs to run when there is at least one valid output buffer.
++    if (!hasValidBuffers(outBuffers)) {
++        // Return buffers if the executor is NOT an input edge.
++        if (!mIsInputEdge) {
++            for (const auto& item : inBuffers) {
++                mBufferProducer->qbuf(item.first, item.second);
++            }
++        }
++        return OK;
++    }
++
++    // Fill real buffer to run pipe
++    for (auto &item : outBuffers) {
++        if (item.second.get() == nullptr) {
++            item.second = mInternalOutputBuffers[item.first];
++        }
++    }
++
++    vector<shared_ptr<CameraBuffer>> outStatsBuffers;
++    vector<EventType> eventType;
++    // Should find first not none input buffer instead of always use the first one.
++    shared_ptr<CameraBuffer> inBuf = inBuffers.begin()->second;
++    CheckError(!inBuf, UNKNOWN_ERROR, "@%s: no valid input buffer", __func__);
++    long inBufSequence = inBuf->getSequence();
++    v4l2_buffer_t inV4l2Buf = *inBuf->getV4L2Buffer().Get();
++    TuningMode tuningMode = mPSysDag->getTuningMode(inBufSequence);
++
++    // Enable RAW DUMP to get the MakerNote from jpeg
++    if (CameraDump::isDumpTypeEnable(DUMP_JPEG_BUFFER)) {
++        if (mName.find("still") != std::string::npos) {
++            CameraDump::dumpImage(mCameraId, inBuffers[MAIN_PORT], M_PSYS, MAIN_PORT);
++        }
++    }
++
++    LOG2("%s:Id:%d run pipe start for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
++
++    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
++        shared_ptr<CameraBuffer> cInBuffer = inBuffers[MAIN_PORT];
++        int vc = cInBuffer->getVirtualChannel();
++
++        while ((!SyncManager::getInstance()->vcSynced(vc)) && mThreadRunning)
++            usleep(1);
++
++        if (gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC) {
++            int seq = cInBuffer->getSequence();
++            SyncManager::getInstance()->printVcSyncCount();
++            LOGVCSYNC("[start runPipe], CPU-timestamp:%lu, sequence:%d, vc:%d, kernel-timestamp:%.3lfms, endl",
++                      CameraUtils::systemTime(),
++                      seq,
++                      cInBuffer->getVirtualChannel(),
++                      cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
++        }
++
++        SyncManager::getInstance()->updateVcSyncCount(vc);
++
++        // Run pipe with buffers
++        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
++        LOGVCSYNC("[done runPipe], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%.3lfms, endl",
++                  CameraUtils::systemTime(),
++                  cInBuffer->getSequence(),
++                  cInBuffer->getVirtualChannel(),
++                  cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
++    } else {
++        // Run pipe with buffers
++        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
++    }
++    CheckError((ret != OK), UNKNOWN_ERROR, "@%s: failed to run pipe", __func__);
++    LOG2("%s:Id:%d run pipe end for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
++
++    // Remove internal output buffers
++    for (auto &item : outBuffers) {
++        if (item.second.get() == mInternalOutputBuffers[item.first].get()) {
++            item.second = nullptr;
++        }
++    }
++
++    if (mNotifyPolicy == POLICY_FRAME_FIRST) {
++        // For general case, notify frame prior to stats to make sure its consumers can get
++        // the frame buffers as early as possible.
++        notifyFrameDone(inV4l2Buf, outBuffers);
++        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
++    } else if (mNotifyPolicy == POLICY_STATS_FIRST) {
++        // Notify stats first and then handle frame buffers to make sure the next executor
++        // can get this executor's IQ result.
++        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
++
++        // After the stats notified, we need to update the IPU parameters as well to get the
++        // latest AIQ result.
++        mPSysDag->prepareIpuParams(inBufSequence, true);
++
++        notifyFrameDone(inV4l2Buf, outBuffers);
++    } else {
++        LOGW("Invalid notify policy:%d, should never happen.", mNotifyPolicy);
++    }
++
++    // Return buffers for the executor which is NOT an input edge
++    if (!mIsInputEdge) {
++        for (auto const& portBufferPair : inBuffers) {
++            // Queue buffer to producer
++            mBufferProducer->qbuf(portBufferPair.first, portBufferPair.second);
++        }
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::registerInBuffers(Port port, const shared_ptr<CameraBuffer> &inBuf)
++{
++    return OK;
++}
++
++int PipeLiteExecutor::registerOutBuffers(Port port, const shared_ptr<CameraBuffer> &camBuffer)
++{
++    return OK;
++}
++
++int PipeLiteExecutor::runPipe(map<Port, shared_ptr<CameraBuffer> > &inBuffers,
++                              map<Port, shared_ptr<CameraBuffer> > &outBuffers,
++                              vector<shared_ptr<CameraBuffer> > &outStatsBuffers,
++                              vector<EventType> &eventType)
++{
++    PERF_CAMERA_ATRACE();
++
++    CheckError((inBuffers.empty() || outBuffers.empty()), BAD_VALUE,
++        "Error in pipe iteration input/output bufs");
++
++    int ret = OK;
++    if (mPolicyManager) {
++        // Check if need to wait other executors.
++        ret = mPolicyManager->wait(mName);
++    }
++
++    // Accept external buffers for in/out edge PGs
++    getTerminalBuffersFromExternal(mPGExecutors.front().inputTerminals, inBuffers,
++                                   mPGExecutors.front().inputBuffers);
++    getTerminalBuffersFromExternal(mPGExecutors.back().outputTerminals, outBuffers,
++                                   mPGExecutors.back().outputBuffers);
++
++    // Get ISP parameters
++    const ia_binary_data *ipuParameters = nullptr;
++    long sequence = inBuffers.begin()->second ? inBuffers.begin()->second->getSequence() : -1;
++    TRACE_LOG_PROCESS(mName.c_str(), "runPipe", MAKE_COLOR(sequence), sequence);
++    if (mAdaptor) {
++        ipuParameters = mAdaptor->getIpuParameter(sequence, mStreamId);
++        if (!ipuParameters) {
++            LOG1("%s: executor %s doesn't run for sequence %ld due to no pal",
++                 __func__, mName.c_str(), sequence);
++            return OK;
++        }
++    }
++
++    LOG2("%s: Executor %s run with input: %zu, output: %zu, sequence: %ld",
++         __func__, mName.c_str(), inBuffers.size(), outBuffers.size(), sequence);
++
++    outStatsBuffers.clear();
++    eventType.clear();
++    int statTotalNum = 0;
++    for (unsigned int pgIndex = 0; pgIndex < mPGExecutors.size(); pgIndex++) {
++        ExecutorUnit& unit = mPGExecutors[pgIndex];
++
++        // Prepare stats buffers for 3A/sis
++        vector<ia_binary_data*> pgStatsDatas;
++        // For 3A stats
++        unsigned int statsCount = unit.statKernelUids.size();
++        for (unsigned int counter = 0; counter < statsCount; counter++) {
++            if (mStatsBuffers.empty()) {
++                LOGW("No available stats buffer.");
++                break;
++            }
++            outStatsBuffers.push_back(mStatsBuffers.front());
++            eventType.push_back(EVENT_PSYS_STATS_BUF_READY);
++            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
++            CheckError(buffer == nullptr, BAD_VALUE, "buffer is null pointer.");
++            buffer->size = 0; // Clear it, then the stats memory is from p2p
++            buffer->data = 0;
++            pgStatsDatas.push_back(buffer);
++            mStatsBuffers.pop();
++        }
++        unsigned int sisCount = unit.sisKernelUids.size();
++        for (unsigned int counter = 0; counter < sisCount; counter++) {
++            if (mStatsBuffers.empty()) {
++                LOGW("No available stats buffer.");
++                break;
++            }
++            outStatsBuffers.push_back(mStatsBuffers.front());
++            eventType.push_back(EVENT_PSYS_STATS_SIS_BUF_READY);
++            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
++            pgStatsDatas.push_back(buffer);
++            mStatsBuffers.pop();
++        }
++
++        // Run PGs
++        ret = unit.pg->iterate(unit.inputBuffers,
++                               unit.outputBuffers,
++                               (statsCount > 0) ? pgStatsDatas[0] : nullptr, // Currently PG handles one stats buffer only
++                               ipuParameters);
++        CheckError((ret != OK), ret, "%s: error in pipe iteration with %d", mName.c_str(), ret);
++
++        statTotalNum += statsCount;
++        if (sisCount > 0) {
++            handleSisStats(unit.outputBuffers, outStatsBuffers[statTotalNum]); // Currently handle one sis output only
++        }
++        statTotalNum += sisCount;
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::handleSisStats(map<ia_uid, shared_ptr<CameraBuffer>>& frameBuffers, const shared_ptr<CameraBuffer> &outStatsBuffers)
++{
++    LOG2("%s:", __func__);
++    ia_binary_data* statBuf = (ia_binary_data*)outStatsBuffers->getBufferAddr();
++    CheckError((statBuf == nullptr), BAD_VALUE, "Error getting buffer for sis a stats");
++    statBuf->data = nullptr;
++    statBuf->size = 0;
++
++    for (auto iterm : frameBuffers) {
++        ia_uid uid = iterm.first;
++        if (uid == psys_ipu6_isa_lb_output_sis_a_uid) {
++            statBuf->data = iterm.second->getBufferAddr();
++            statBuf->size = iterm.second->getBufferSize();
++            outStatsBuffers->setUserBufferInfo(-1, iterm.second->getWidth(), iterm.second->getHeight());
++            return OK;
++        }
++    }
++
++    return UNKNOWN_ERROR;
++}
++
++int PipeLiteExecutor::notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf)
++{
++    PERF_CAMERA_ATRACE();
++    for (auto const& portBufferPair : outBuf) {
++        shared_ptr<CameraBuffer> outBuf = portBufferPair.second;
++        Port port = portBufferPair.first;
++        // If the output buffer is nullptr, that means user doesn't request that buffer,
++        // so it doesn't need to be handled here.
++        if (!outBuf) continue;
++
++        outBuf->updateV4l2Buffer(inV4l2Buf);
++
++        // If it's output edge, the buffer should be returned to PSysDag,
++        // otherwise they should be returned to its consumer.
++        if (mIsOutputEdge) {
++            mPSysDag->onFrameDone(port, outBuf);
++        } else {
++            for (auto &it : mBufferConsumerList) {
++                it->onFrameAvailable(port, outBuf);
++            }
++        }
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::notifyStatsDone(TuningMode tuningMode,
++                                      const v4l2_buffer_t& inV4l2Buf,
++                                      const vector<shared_ptr<CameraBuffer>> &outStatsBuffers,
++                                      const vector<EventType> &eventType)
++{
++    PERF_CAMERA_ATRACE();
++
++    // The executor does not produce stats, so no need to notify.
++    if (outStatsBuffers.empty()) return OK;
++
++    /**
++     * Notice for EVENT_PSYS_STATS_BUF_READY:
++     * dvs stat & 3a stat come from different PG, and they are decoded separately
++     * in decodeStatsData().
++     * Fortunately stats data are stored in aiqResultStorage separately,
++     * and user will get them from storage instead of EventData.
++     * So here we can send one event after all stat buffers are decoded/stored/released.
++     */
++    int psysStatBufferCount = 0;
++    for (auto type : eventType) {
++        if (type == EVENT_PSYS_STATS_BUF_READY) {
++            psysStatBufferCount++;
++        }
++    }
++
++    int statsIndex = 0;
++    for (auto statsBuf : outStatsBuffers) {
++        if (!statsBuf) continue;
++
++        if (mStreamId == STILL_STREAM_ID) {
++            LOG2("%s: No statistics data for still pipe in buffer", __func__);
++            releaseStatsBuffer(statsBuf);
++            continue;
++        } else if (inV4l2Buf.sequence <= mLastStatsSequence) {
++            // Ignore old statistics for Raw reprocessing
++            LOG2("%s: new sequence %d is less than last sequence %ld", __func__,
++                 inV4l2Buf.sequence, mLastStatsSequence);
++            releaseStatsBuffer(statsBuf);
++            continue;
++        }
++
++        ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuf->getBufferAddr());
++        if (hwStatsData->data == nullptr || hwStatsData->size == 0) {
++            LOGW("%s: No statistics data in buffer", __func__);
++            releaseStatsBuffer(statsBuf);
++            continue;
++        }
++
++        statsBuf->updateV4l2Buffer(inV4l2Buf);
++
++        // Decode the statistics data
++        if (eventType[statsIndex] == EVENT_PSYS_STATS_BUF_READY) {
++            mAdaptor->decodeStatsData(tuningMode, statsBuf, mGraphConfig);
++            psysStatBufferCount--;
++        }
++
++        // Notify listeners after all buffers done for type STATS_BUF_READY
++        // Notify immediately for other types
++        if (eventType[statsIndex] != EVENT_PSYS_STATS_BUF_READY
++            || !psysStatBufferCount) {
++            EventDataStatsReady statsReadyData;
++            statsReadyData.sequence = statsBuf->getSequence();
++            statsReadyData.timestamp.tv_sec = statsBuf->getTimestamp().tv_sec;
++            statsReadyData.timestamp.tv_usec = statsBuf->getTimestamp().tv_usec;
++            EventData eventData;
++            eventData.type = eventType[statsIndex];
++            eventData.buffer = statsBuf;
++            eventData.data.statsReady = statsReadyData;
++            notifyListeners(eventData);
++        }
++
++        releaseStatsBuffer(statsBuf);
++        statsIndex++;
++    }
++
++    if (mStreamId == VIDEO_STREAM_ID && inV4l2Buf.sequence > mLastStatsSequence) {
++        mLastStatsSequence = inV4l2Buf.sequence;
++    }
++
++    return OK;
++}
++
++int PipeLiteExecutor::allocBuffers()
++{
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    releaseBuffers();
++
++    // Allocate buffer between PGs (internal)
++    for (auto const& item : mTerminalsDesc) {
++        const TerminalDescriptor& termDesc = item.second;
++        if (!termDesc.enabled) {
++            continue;
++        }
++
++        if (termDesc.assignedPort != INVALID_PORT
++            && !(findPGExecutor(termDesc.sinkStage) && findPGExecutor(termDesc.sourceStage))) {
++            // Don't allocate buffer here for external connection (has valid port)
++            continue;
++        }
++
++        // Allocated already
++        if (mPGBuffers.find(termDesc.terminal) != mPGBuffers.end()) {
++            continue;
++        }
++
++        int srcFmt = termDesc.frameDesc.mFormat;
++        int srcWidth = termDesc.frameDesc.mWidth;
++        int srcHeight = termDesc.frameDesc.mHeight;
++        int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
++        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
++                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, srcFmt, srcWidth, srcHeight);
++        CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
++        mPGBuffers[termDesc.sinkTerminal] = buf;
++        mPGBuffers[termDesc.sourceTerminal] = buf;
++    }
++
++    for (auto &unit : mPGExecutors) {
++        // Assign internal buffers for terminals of PGs according to connection
++        for (auto &terminal : unit.inputTerminals) {
++            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
++                unit.inputBuffers[terminal] = mPGBuffers[terminal];
++            }
++        }
++        for (auto &terminal : unit.outputTerminals) {
++            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
++                unit.outputBuffers[terminal] = mPGBuffers[terminal];
++            }
++        }
++
++        // Allocate stats buffers if needed.
++        unsigned int statsBufferCount = unit.statKernelUids.size();
++        if (!statsBufferCount) {
++            continue;
++        }
++        for (unsigned int i = 0; i < MAX_BUFFER_COUNT * statsBufferCount; i++) {
++            shared_ptr<CameraBuffer> statsBuf = CameraBuffer::create(mCameraId,
++                         BUFFER_USAGE_PSYS_STATS, V4L2_MEMORY_USERPTR, sizeof(ia_binary_data), i);
++            CheckError(!statsBuf, NO_MEMORY, "Executor %s: Allocate stats buffer failed", mName.c_str());
++
++            AutoMutex lock(mStatsBuffersLock);
++            mStatsBuffers.push(statsBuf);
++        }
++    }
++
++    // Allocate buffers for producer executor (external)
++    // Ignore input edge due to no producer
++    if (!mIsInputEdge) {
++        for (auto const& terminal : mPGExecutors.front().inputTerminals) {
++            Port inputPort = mTerminalsDesc[terminal].assignedPort;
++
++            int srcFmt = mTerminalsDesc[terminal].frameDesc.mFormat;
++            int srcWidth = mTerminalsDesc[terminal].frameDesc.mWidth;
++            int srcHeight = mTerminalsDesc[terminal].frameDesc.mHeight;
++            // Get frame size with aligned height taking in count for internal buffers.
++            // To garantee PSYS kernel like GDC always get enough buffer size to process.
++            int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
++            for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
++                // Prepare internal frame buffer for its producer.
++                shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
++                             BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, i, srcFmt, srcWidth, srcHeight);
++                CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
++                mInternalBuffers[inputPort].push_back(buf);
++
++                mBufferProducer->qbuf(inputPort, buf);
++            }
++        }
++    }
++
++    // Allocate internal output buffers to support pipe execution without user output buffer
++    for (auto const &item : mOutputFrameInfo) {
++        int fmt = item.second.format;
++        int width = item.second.width;
++        int height = item.second.height;
++        int size = CameraUtils::getFrameSize(fmt, width, height, true);
++        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
++                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, fmt, width, height);
++        CheckError(!buf, NO_MEMORY, "@%s: Allocate internal output buffer failed", __func__);
++        mInternalOutputBuffers[item.first]= buf;
++    }
++
++    return OK;
++}
++
++void PipeLiteExecutor::releaseBuffers()
++{
++    LOG1("%s executor:%s", __func__, mName.c_str());
++
++    // Release internel frame buffers
++    mInternalOutputBuffers.clear();
++    mInternalBuffers.clear();
++    mPGBuffers.clear();
++
++    // Release stats buffers
++    {
++        AutoMutex lock(mStatsBuffersLock);
++        while (!mStatsBuffers.empty()) mStatsBuffers.pop();
++    }
++}
++
++PipeLiteExecutor::ExecutorUnit* PipeLiteExecutor::findPGExecutor(ia_uid stageId)
++{
++    for (unsigned int i = 0; i < mPGExecutors.size(); i++) {
++        if (mPGExecutors[i].stageId == stageId) {
++            return &mPGExecutors[i];
++        }
++    }
++    return nullptr;
++}
++
++void PipeLiteExecutor::getTerminalPorts(const vector<ia_uid>& terminals,
++                                        map<ia_uid, Port>& terminalPortMap) const
++{
++    terminalPortMap.clear();
++    for (auto terminal : terminals) {
++        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
++        if (termDesc.enabled && termDesc.assignedPort != INVALID_PORT) {
++            terminalPortMap[terminal] = termDesc.assignedPort;
++        }
++    }
++}
++
++void PipeLiteExecutor::getTerminalFrameInfos(const vector<ia_uid>& terminals,
++                                             map<ia_uid, FrameInfo>& infoMap) const
++{
++    infoMap.clear();
++    for (auto terminal : terminals) {
++        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
++        if (termDesc.enabled) {
++            infoMap[terminal] = termDesc.frameDesc;
++        }
++    }
++}
++
++void PipeLiteExecutor::getDisabledTerminalsForPG(ia_uid stageId, vector<ia_uid>& terminals) const
++{
++    terminals.clear();
++    for (auto const item : mTerminalsDesc) {
++        const TerminalDescriptor& termDesc = item.second;
++        if (termDesc.stageId == stageId && !termDesc.enabled) {
++            terminals.push_back(termDesc.terminal);
++        }
++    }
++}
++
++void PipeLiteExecutor::getTerminalBuffersFromExternal(
++        const vector<ia_uid>& terminals,
++        const map<Port, shared_ptr<CameraBuffer> >& externals,
++        map<ia_uid, shared_ptr<CameraBuffer> >& internals) const
++{
++    for (auto &terminal : terminals) {
++        Port port = mTerminalsDesc.at(terminal).assignedPort;
++        if (externals.find(port) != externals.end()) {
++            internals[terminal] = externals.at(port);
++        }
++    }
++}
++
++void PipeLiteExecutor::dumpPGs() const
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
++
++    LOG2("============= dump PGs for executor %s =================", getName());
++    if (mIsInputEdge) {
++        LOG2("This is input edge");
++    }
++    if (mIsOutputEdge) {
++        LOG2("This is output edge");
++    }
++    for (auto const &unit : mPGExecutors) {
++        ia_uid stageId = unit.stageId;
++        LOG2("    PG: %d: %s, stageId %d",
++             unit.pgId, unit.pg ? unit.pg->getName() : "GPU-TNR", stageId);
++
++        LOG2("        InTerms: %zu", unit.inputTerminals.size());
++        for (auto const &term : unit.inputTerminals) {
++            shared_ptr<CameraBuffer> buffer= nullptr;
++            if (mPGBuffers.find(term) != mPGBuffers.end()) {
++                buffer = mPGBuffers.at(term);
++            }
++
++            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
++            if (termDesc.enabled) {
++                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
++                     termDesc.terminal - termDesc.stageId - 1,
++                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
++                     termDesc.frameDesc.mFormat,
++                     termDesc.assignedPort, buffer.get());
++            } else {
++                LOG2("            %d: %dx%d, 0x%x, disabled",
++                     termDesc.terminal - termDesc.stageId - 1,
++                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
++                     termDesc.frameDesc.mFormat);
++            }
++        }
++
++        LOG2("        OutTerms: %zu", unit.outputTerminals.size());
++        for (auto const &term : unit.outputTerminals) {
++            shared_ptr<CameraBuffer> buffer= nullptr;
++            if (mPGBuffers.find(term) != mPGBuffers.end()) {
++                buffer = mPGBuffers.at(term);
++            }
++
++            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
++            if (termDesc.enabled) {
++                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
++                     termDesc.terminal - termDesc.stageId - 1,
++                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
++                     termDesc.frameDesc.mFormat,
++                     termDesc.assignedPort, buffer.get());
++            } else {
++                LOG2("            %d: %dx%d, 0x%x, disabled",
++                     termDesc.terminal - termDesc.stageId - 1,
++                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
++                     termDesc.frameDesc.mFormat);
++            }
++        }
++    }
++    LOG2("============= dump done for %s =================", getName());
++}
++
++}
++
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
+new file mode 100644
+index 000000000000..3fbce9a9607b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
+@@ -0,0 +1,191 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <vector>
++#include <memory>
++#include <string>
++#include <utility> // For std::pair, std::make_pair
++
++#include "Parameters.h"
++#include "CameraBuffer.h"
++#include "BufferQueue.h"
++#include "psysprocessor/PGCommon.h"
++#include "PolicyManager.h"
++#include "IspParamAdaptor.h"
++#include "GraphConfig.h"
++
++namespace icamera {
++
++class PSysDAG;
++
++typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
++
++class PipeLiteExecutor : public BufferQueue {
++public:
++    PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
++                     std::vector<std::string> exclusivePGs,
++                     PSysDAG *psysDag, std::shared_ptr<IGraphConfig> gc);
++    virtual ~PipeLiteExecutor();
++    virtual int start();
++    virtual void stop();
++    virtual int initPipe();
++    void notifyStop();
++
++    int releaseStatsBuffer(const std::shared_ptr<CameraBuffer> &statsBuf);
++
++    void setStreamId(int streamId) { mStreamId = streamId; }
++    void setIspParamAdaptor(IspParamAdaptor* adaptor) { mAdaptor = adaptor; }
++    void setPolicyManager(PolicyManager* policyManager) { mPolicyManager = policyManager; }
++    void setNotifyPolicy(ExecutorNotifyPolicy notifyPolicy) { mNotifyPolicy = notifyPolicy; }
++
++    void getOutputTerminalPorts(std::map<ia_uid, Port>& outputTerminals) const;
++    void getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const;
++    bool hasOutputTerminal(ia_uid sinkTerminal);
++
++    // Link output terminals of producer to its input terminals
++    int setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals);
++    int registerOutBuffers(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
++    int registerInBuffers(Port port, const std::shared_ptr<CameraBuffer> &inBuf);
++
++    /**
++     * Check if the two given stream configs are the same.
++     */
++    bool isSameStreamConfig(const stream_t& internal, const stream_t& external,
++                            ConfigMode configMode, bool checkStreamId) const;
++
++    bool isInputEdge() { return mIsInputEdge; }
++    bool isOutputEdge() { return mIsOutputEdge; }
++
++    const char* getName() const { return mName.c_str(); }
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(PipeLiteExecutor);
++
++ protected:
++    struct TerminalDescriptor{
++        ia_uid terminal;
++        ia_uid stageId;
++
++        ia_uid sourceTerminal;
++        ia_uid sinkTerminal;
++        ia_uid sourceStage;
++        ia_uid sinkStage;
++
++        FrameInfo frameDesc;
++
++        bool enabled;
++        bool hasConnection; // has related sink or source
++                            // expection: sis output, sink = source
++        Port assignedPort;  // INVALID_PORT for terminal without connection
++        int usrStreamId;
++    };
++
++    struct ExecutorUnit {
++        // Initialized during creation/configuration
++        int pgId;
++        ia_uid stageId;
++        std::shared_ptr<PGCommon> pg;
++        std::vector<ia_uid> statKernelUids;
++        std::vector<ia_uid> sisKernelUids;
++
++        // Initialized during connection analysis
++        std::vector<ia_uid> inputTerminals; // including disabled terminals
++        std::vector<ia_uid> outputTerminals;
++
++        // Initialized during buffer allocation
++        std::map<ia_uid, std::shared_ptr<CameraBuffer>> inputBuffers;
++        std::map<ia_uid, std::shared_ptr<CameraBuffer>> outputBuffers;
++    };
++
++ protected:
++    int analyzeConnections(const std::vector<IGraphType::PipelineConnection>& connVector);
++    int assignDefaultPortsForTerminals();
++    int notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf);
++
++    /**
++     * Check if there is any valid buffer(not null) in the given port/buffer pairs.
++     */
++    bool hasValidBuffers(const CameraBufferPortMap& buffers);
++    void dumpPGs() const;
++
++ private:
++    int processNewFrame();
++    int runPipe(std::map<Port, std::shared_ptr<CameraBuffer>> &inBuffers,
++                std::map<Port, std::shared_ptr<CameraBuffer>> &outBuffers,
++                std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
++                std::vector<EventType> &eventType);
++
++    int notifyStatsDone(TuningMode tuningMode, const v4l2_buffer_t& inV4l2Buf,
++                        const std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
++                        const std::vector<EventType> &eventType);
++
++    int createPGs();
++    int configurePGs();
++    int allocBuffers();
++    void releaseBuffers();
++    int storeTerminalInfo(const IGraphType::PipelineConnection& connection);
++    int getStatKernels(int pgId, std::vector<ia_uid>& kernels);
++    int getSisKernels(int pgId, std::vector<ia_uid>& kernels);
++    ExecutorUnit* findPGExecutor(ia_uid stageId);
++    void getDisabledTerminalsForPG(ia_uid stageId, std::vector<ia_uid>& terminals) const;
++    void getTerminalFrameInfos(const std::vector<ia_uid>& terminals,
++                               std::map<ia_uid, FrameInfo>& infos) const;
++    void getTerminalPorts(const std::vector<ia_uid>& terminals,
++                          std:: map<ia_uid, Port>& terminalPortMap) const;
++    void getTerminalBuffersFromExternal(
++                        const std::vector<ia_uid>& terminals,
++                        const std::map<Port, std::shared_ptr<CameraBuffer> >& externals,
++                        std::map<ia_uid, std::shared_ptr<CameraBuffer> >& internals) const;
++
++    int handleSisStats(std::map<ia_uid, std::shared_ptr<CameraBuffer>>& frameBuffers,
++                       const std::shared_ptr<CameraBuffer> &outStatsBuffers);
++
++ protected:
++    int mCameraId;
++    int mStreamId;
++    std::string mName;
++    std::vector<std::string> mPGNames;
++    std::vector<int> mOpModes;
++    std::shared_ptr<IGraphConfig> mGraphConfig;
++    bool mIsInputEdge;
++    bool mIsOutputEdge;
++    ExecutorNotifyPolicy mNotifyPolicy;
++
++    std::vector<ExecutorUnit> mPGExecutors;
++    IspParamAdaptor* mAdaptor;
++
++    PolicyManager* mPolicyManager;
++
++    // For internal connections (between PGs)
++    std::map<ia_uid, std::shared_ptr<CameraBuffer> > mPGBuffers; // Buffers between PGs
++    std::map<ia_uid, ia_uid> mConnectionMap; // <sink, source>
++    std::map<ia_uid, TerminalDescriptor> mTerminalsDesc;
++
++    int64_t mLastStatsSequence;
++    CameraBufQ mStatsBuffers;
++    Mutex mStatsBuffersLock;
++    std::vector<std::string> mExclusivePGs;
++    PSysDAG *mPSysDag;
++
++    CameraBufferPortMap mInternalOutputBuffers;
++    int mkernelsCountWithStats;
++};
++
++typedef PipeLiteExecutor PipeExecutor;
++}
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
+new file mode 100644
+index 000000000000..e51d012daa76
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
+@@ -0,0 +1,168 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "Camera_PolicyManager"
++
++#include "PolicyManager.h"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++
++using namespace std;
++
++namespace icamera {
++
++PolicyManager::PolicyManager(int cameraId) : mCameraId(cameraId), mIsActive(false)
++{
++    LOG1("@%s: camera id:%d", __func__, mCameraId);
++}
++
++PolicyManager::~PolicyManager()
++{
++    LOG1("@%s: camera id:%d", __func__, mCameraId);
++
++    releaseBundles();
++}
++
++void PolicyManager::releaseBundles()
++{
++    LOG1("@%s: camera id:%d", __func__, mCameraId);
++
++    for (const auto& bundle : mBundles) {
++        delete bundle;
++    }
++
++    mBundles.clear();
++}
++
++void PolicyManager::setActive(bool isActive)
++{
++    AutoMutex lock(mPolicyLock);
++
++    LOG1("@%s: camera id:%d update active mode from %d to %d",
++          __func__, mCameraId, mIsActive, isActive);
++
++    if (mIsActive == isActive) return; // No action is needed if the mode unchanged.
++
++    for (auto& bundle : mBundles) {
++        AutoMutex lock(bundle->mLock);
++
++        bundle->mWaitingCount = 0;
++        bundle->mIsActive = isActive;
++        for (auto& executorData : bundle->mExecutorData) {
++            executorData.second.mRunCount = 0;
++        }
++
++        // Wake up the executors who are waiting for other executors.
++        if (!bundle->mIsActive) {
++            bundle->mCondition.broadcast();
++        }
++    }
++
++    mIsActive = isActive;
++}
++
++int PolicyManager::addExecutorBundle(const vector<string>& executors, const vector<int>& depths)
++{
++    LOG1("@%s: camera id:%d", __func__, mCameraId);
++
++    AutoMutex lock(mPolicyLock);
++
++    uint8_t size = executors.size();
++    CheckError(size != depths.size(),
++          BAD_VALUE, "The size for executor and its depth not match");
++
++    int maxDepth = 0;
++    map<string, ExecutorData> executorData;
++
++    for (uint8_t i = 0; i < size; i++) {
++        executorData[executors[i]] = ExecutorData(depths[i]);
++        if (depths[i] > maxDepth) {
++            maxDepth = depths[i];
++        }
++        LOG1("%s, bundled executor name:%s, depth:%d)", __func__, executors[i].c_str(), depths[i]);
++    }
++
++    ExecutorBundle* bundle = new ExecutorBundle();
++    bundle->mExecutorData = executorData;
++    bundle->mExecutorNum = size;
++    bundle->mMaxDepth = maxDepth;
++    bundle->mWaitingCount = 0;
++    bundle->mIsActive = true;
++
++    mBundles.push_back(bundle);
++
++    return OK;
++}
++
++int PolicyManager::wait(string executorName)
++{
++    ExecutorBundle* bundle = nullptr;
++    {
++        AutoMutex lock(mPolicyLock);
++
++        // No need to wait when it's already inactive.
++        if (!mIsActive) return OK;
++
++        for (const auto& item : mBundles) {
++            if (item->mExecutorData.find(executorName) != item->mExecutorData.end()) {
++                bundle = item;
++                break;
++            }
++        }
++        // If the executor not in mBundles, it means it doesn't need to wait for others.
++        if (bundle == nullptr) return OK;
++    }
++
++    ConditionLock lock(bundle->mLock);
++
++    // If it's already inactive, there is no need to align the executors anymore.
++    if (!bundle->mIsActive) return OK;
++
++    ExecutorData& executorData = bundle->mExecutorData[executorName];
++    executorData.mRunCount++;
++
++    /**
++     * If an executor's run count plus its depth less than the max depth of all executors,
++     * it means the executor can run without checking other executors' status, since other
++     * may wait on this executor's output to reach the precondition of running together.
++     */
++    if (executorData.mRunCount + executorData.mDepth <= bundle->mMaxDepth) {
++        return OK;
++    }
++
++    bundle->mWaitingCount++;
++
++    /**
++     * If waiting count less than total executor number in the bundle, it means
++     * we need to wait for other executors to run with them together.
++     */
++    if (bundle->mWaitingCount < bundle->mExecutorNum) {
++        LOG2("%s: need wait for other executors.", executorName.c_str());
++        // the timeout value is 100ms * executor count
++        int64_t kWaitDuration = 100000000;
++        kWaitDuration *= bundle->mExecutorNum;
++        int ret = bundle->mCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
++        CheckWarning(ret == TIMED_OUT, ret, "%s: wait executors timeout", executorName.c_str());
++    } else {
++        bundle->mWaitingCount = 0;
++        bundle->mCondition.broadcast();
++    }
++
++    return OK;
++}
++
++} // end of namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
+new file mode 100644
+index 000000000000..3bef4a8421c3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
+@@ -0,0 +1,79 @@
++/*
++ * Copyright (C) 2017-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <vector>
++#include <string>
++
++#include "iutils/Utils.h"
++#include "iutils/Thread.h"
++
++namespace icamera {
++
++class PolicyManager {
++public:
++    PolicyManager(int cameraId);
++    ~PolicyManager();
++
++    /**
++     * Create a bundle for the given set of executors, and add the bundle into mBundles.
++     * These executors are guaranteed running at the same time.
++     */
++    int addExecutorBundle(const std::vector<std::string>& executors, const std::vector<int>& depths);
++
++    void setActive(bool isActive);
++
++    /**
++     * Check whether the given executor can run or not.
++     * If the executor cannot run then it'll wait for other executors in the same bundle.
++     * Once all executors are ready to run, then a broadcast will be sent out to wake all
++     * executors up and then run together.
++     */
++    int wait(std::string executorName);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(PolicyManager);
++
++    void releaseBundles();
++
++private:
++    struct ExecutorData {
++        ExecutorData(int depth = 0) : mRunCount(0), mDepth(depth) {}
++        long mRunCount; // How many times the executor has run.
++        int mDepth;     // Indicates how many direct dependencies the executor has.
++    };
++
++    struct ExecutorBundle {
++        std::map<std::string, ExecutorData> mExecutorData; // The index of the map is executor name.
++        int mMaxDepth;     // The max depth among all executors.
++        int mExecutorNum;  // Indicates how many executors the bundle has.
++        int mWaitingCount; // How many executors have already waited.
++        bool mIsActive;
++        //Guard for the Bundle data
++        Mutex mLock;
++        Condition mCondition;
++    };
++
++    int mCameraId;
++    //Guard for the PolicyManager public API
++    Mutex mPolicyLock;
++    std::vector<ExecutorBundle*> mBundles;
++    bool mIsActive;
++};
++
++}
+diff --git a/camera/hal/intel/ipu6/src/fd/FaceBase.h b/camera/hal/intel/ipu6/src/fd/FaceBase.h
+new file mode 100644
+index 000000000000..1405e9ccac93
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/fd/FaceBase.h
+@@ -0,0 +1,81 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#ifdef FACE_DETECTION
++#include <pvl_config.h>
++#include <pvl_eye_detection.h>
++#include <pvl_face_detection.h>
++#include <pvl_mouth_detection.h>
++#include <pvl_types.h>
++#endif
++
++namespace icamera {
++
++#define RECT_SIZE 4
++#define LM_SIZE 6
++#define MAX_STORE_FACE_DATA_BUF_NUM 3
++
++#define MAX_FACES_DETECTABLE 10
++#define MAX_FACE_FRAME_WIDTH 1920
++#define MAX_FACE_FRAME_HEIGHT 1280
++
++#define MAX_FACE_FRAME_SIZE_ASYNC (MAX_FACE_FRAME_WIDTH * MAX_FACE_FRAME_HEIGHT)  // only using Y
++#define MAX_FACE_FRAME_SIZE_SYNC (MAX_FACE_FRAME_WIDTH * MAX_FACE_FRAME_HEIGHT * 3 / 2)
++
++typedef enum {
++    FD_MODE_OFF,
++    FD_MODE_SIMPLE,  /**< Provide face area */
++    FD_MODE_FULL,    /**< Provide face area, eye and mouth coordinates */
++} face_detection_mode;
++
++/* Face Detection results */
++typedef struct CVFaceDetectionAbstractResult {
++    int faceNum;
++    int faceIds[MAX_FACES_DETECTABLE];
++    int faceLandmarks[LM_SIZE * MAX_FACES_DETECTABLE];
++    int faceRect[RECT_SIZE * MAX_FACES_DETECTABLE];
++    uint8_t faceScores[MAX_FACES_DETECTABLE];
++} CVFaceDetectionAbstractResult;
++
++struct FaceDetectionInitParams {
++    unsigned int max_face_num;
++};
++
++#ifdef FACE_DETECTION
++struct FaceDetectionResult {
++    int faceNum;
++    pvl_face_detection_result faceResults[MAX_FACES_DETECTABLE];
++    pvl_eye_detection_result eyeResults[MAX_FACES_DETECTABLE];
++    pvl_mouth_detection_result mouthResults[MAX_FACES_DETECTABLE];
++};
++
++struct FaceDetectionRunParams {
++    uint8_t data[MAX_FACE_FRAME_SIZE_ASYNC];
++    int32_t bufferHandle;
++    uint32_t size;
++    int32_t width;
++    int32_t height;
++    pvl_image_format format;
++    int32_t stride;
++    int32_t rotation;
++
++    FaceDetectionResult results;
++};
++#endif
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
+new file mode 100644
+index 000000000000..d75a6664d42e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
+@@ -0,0 +1,530 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "FaceDetection"
++#include "src/fd/FaceDetection.h"
++
++#include <algorithm>
++#include <fstream>
++
++#include "AiqUtils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "PlatformData.h"
++
++namespace icamera {
++std::unordered_map<int, FaceDetection*> FaceDetection::sInstances;
++Mutex FaceDetection::sLock;
++FaceDetection *FaceDetection::getInstance(int cameraId) {
++    LOG1("@%s, cameraId:%d", __func__, cameraId);
++    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
++               nullptr, "cameraId %d is error", cameraId);
++
++    if (sInstances.find(cameraId) == sInstances.end()) {
++        return nullptr;
++    }
++
++    return sInstances[cameraId];
++}
++
++FaceDetection *FaceDetection::createInstance(int cameraId,
++                                             unsigned int maxFaceNum, int32_t halStreamId,
++                                             int width, int height) {
++    LOG1("@%s, cameraId:%d, maxFaceNum:%u, halStreamId:%u, width:%d, height:%d",
++         __func__, cameraId, maxFaceNum, halStreamId, width, height);
++    CheckError(maxFaceNum > MAX_FACES_DETECTABLE, nullptr,
++               "maxFaceNum %d is error", maxFaceNum);
++    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
++               nullptr, "cameraId %d is error", cameraId);
++
++    AutoMutex lock(sLock);
++    if (sInstances.find(cameraId) == sInstances.end()) {
++        sInstances[cameraId] = new FaceDetection(cameraId, maxFaceNum,
++                                                 halStreamId, width, height);
++    }
++
++    return sInstances[cameraId];
++}
++
++void FaceDetection::destoryInstance(int cameraId) {
++    LOG1("@%s, cameraId:%d", __func__, cameraId);
++    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
++               VOID_VALUE, "cameraId is error");
++
++    AutoMutex lock(sLock);
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        delete sInstances[cameraId];
++        sInstances.erase(cameraId);
++    }
++}
++
++FaceDetection::FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId,
++                             int width, int height) :
++    mCameraId(cameraId),
++    mInitialized(false),
++    mHalStreamId(halStreamId),
++    mWidth(width),
++    mHeight(height) {
++    LOG1("@%s, cameraId:%d, maxFaceNum:%d", __func__, cameraId, maxFaceNum);
++    CLEAR(mResult);
++
++    /* TODO: we should add CameraOrientationDetector to change the camera orientation */
++    camera_info_t info;
++    PlatformData::getCameraInfo(mCameraId, info);
++    mSensorOrientation = info.orientation;
++
++    /* start face engine pthread */
++    int ret = run("FaceDetection" + std::to_string(cameraId), PRIORITY_NORMAL);
++    CheckError(ret != OK, VOID_VALUE, "Camera thread failed to start, ret %d", ret);
++
++    /* init IntelFaceDetection */
++    FaceDetectionInitParams params;
++    params.max_face_num = maxFaceNum;
++    mFace = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
++    ret = mFace->init(&params, sizeof(FaceDetectionInitParams));
++    CheckError(ret != OK, VOID_VALUE, "mFace.init fails, ret %d", ret);
++
++    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
++        FaceDetectionRunParams *memRunBuf = mFace->prepareRunBuffer(i);
++        CheckError(!memRunBuf, VOID_VALUE, "prepareRunBuffer fails");
++        mMemRunPool.push(memRunBuf);
++    }
++
++    mInitialized = true;
++}
++
++FaceDetection::~FaceDetection() {
++    LOG1("@%s", __func__);
++    mFace->deinit();
++    requestExit();
++
++    AutoMutex l(mRunBufQueueLock);
++    mRunCondition.notify_one();
++}
++
++FaceDetectionRunParams *FaceDetection::acquireRunBuf() {
++    AutoMutex l(mMemRunPoolLock);
++    LOG2("@%s, mRunPool.size is %zu", __func__, mMemRunPool.size());
++
++    FaceDetectionRunParams *runBuffer = nullptr;
++    if (!mMemRunPool.empty()) {
++        runBuffer = mMemRunPool.front();
++        mMemRunPool.pop();
++        CLEAR(*runBuffer);
++    }
++    return runBuffer;
++}
++
++void FaceDetection::returnRunBuf(FaceDetectionRunParams *memRunBuf) {
++    LOG2("@%s, Push back run face engine buffer", __func__);
++
++    AutoMutex l(mMemRunPoolLock);
++    mMemRunPool.push(memRunBuf);
++}
++
++void FaceDetection::runFaceDetection(const camera_buffer_t &buffer) {
++    LOG1("@%s", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
++
++    if (PlatformData::isFaceEngineSyncRunning(mCameraId)) {
++        runFaceDetectionBySync(buffer);
++    } else {
++        runFaceDetectionByAsync(buffer);
++    }
++}
++
++void FaceDetection::runFaceDetectionBySync(const camera_buffer_t &buffer) {
++    LOG1("@%s", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
++
++    int size = buffer.s.size;
++    CheckError(size > MAX_FACE_FRAME_SIZE_SYNC, VOID_VALUE,
++               "face frame buffer is too small!, w:%d,h:%d,size:%d",
++               buffer.s.width, buffer.s.height, size);
++
++    FaceDetectionRunParams *params = acquireRunBuf();
++    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
++
++    params->size = size;
++    params->width = buffer.s.width;
++    params->height = buffer.s.height;
++    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
++    params->rotation = mSensorOrientation % 360;
++    params->format = pvl_image_format_nv12;
++    params->stride = buffer.s.stride;
++    params->bufferHandle = -1;
++
++    nsecs_t startTime = CameraUtils::systemTime();
++
++#ifdef ENABLE_SANDBOXING
++    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.dmafd);
++#else
++    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.addr);
++#endif
++
++    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
++         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
++
++    {
++        AutoMutex l(mFaceResultLock);
++        if (ret == OK) {
++            mResult = params->results;
++        } else {
++            CLEAR(mResult);
++        }
++    }
++
++    returnRunBuf(params);
++}
++
++void FaceDetection::runFaceDetectionByAsync(const camera_buffer_t &buffer) {
++    LOG1("@%s", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
++
++    int size = buffer.s.stride * buffer.s.height;
++    CheckError(size > MAX_FACE_FRAME_SIZE_ASYNC, VOID_VALUE,
++               "face frame buffer is too small!, w:%d,h:%d,size:%d",
++               buffer.s.width, buffer.s.height, size);
++
++    FaceDetectionRunParams *params = acquireRunBuf();
++    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
++
++    params->size = size;
++    MEMCPY_S(params->data, MAX_FACE_FRAME_SIZE_ASYNC, buffer.addr, size);
++    params->width = buffer.s.width;
++    params->height = buffer.s.height;
++    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
++    params->rotation = mSensorOrientation % 360;
++    params->format = pvl_image_format_gray;
++    params->stride = buffer.s.stride;
++    params->bufferHandle = -1;
++
++    AutoMutex l(mRunBufQueueLock);
++    mRunBufQueue.push(params);
++    mRunCondition.notify_one();
++}
++
++bool FaceDetection::threadLoop() {
++    LOG1("@%s", __func__);
++
++    FaceDetectionRunParams *faceParams = nullptr;
++
++    {
++        ConditionLock lock(mRunBufQueueLock);
++        if (mRunBufQueue.empty()) {
++            std::cv_status ret = mRunCondition.wait_for(
++                                     lock,
++                                     std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
++            if (ret == std::cv_status::timeout) {
++                LOGW("@%s, wait request time out", __func__);
++            }
++
++            return true;
++        }
++        faceParams = mRunBufQueue.front();
++        mRunBufQueue.pop();
++    }
++
++    nsecs_t startTime = CameraUtils::systemTime();
++
++    int ret = mFace->run(faceParams, sizeof(FaceDetectionRunParams));
++    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
++         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
++
++    {
++        AutoMutex l(mFaceResultLock);
++        if (ret == OK) {
++            mResult = faceParams->results;
++        } else {
++            CLEAR(mResult);
++        }
++    }
++
++    returnRunBuf(faceParams);
++    return true;
++}
++
++int FaceDetection::getFaceNum() {
++    LOG2("@%s", __func__);
++    CheckError(mInitialized == false, 0, "mInitialized is false");
++
++    AutoMutex l(mFaceResultLock);
++    return mResult.faceNum;
++}
++
++/* The result is pvl's original reuslt */
++int FaceDetection::getFaceDetectionResult(FaceDetectionResult *result) {
++    LOG1("@%s", __func__);
++    CheckError(mInitialized == false, UNKNOWN_ERROR, "mInitialized is false");
++    CheckError(!result, UNKNOWN_ERROR, "mResult is nullptr");
++
++    AutoMutex l(mFaceResultLock);
++    MEMCPY_S(result, sizeof(FaceDetectionResult), &mResult, sizeof(FaceDetectionResult));
++    return OK;
++}
++
++/* Get current frame width and hight */
++void FaceDetection::getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth) {
++    LOG2("@%s", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
++    CheckError(!frameWidth || !frameHigth, VOID_VALUE, "input paramter is error");
++
++    *frameWidth = mWidth;
++    *frameHigth = mHeight;
++}
++
++/* Get current hal stream id */
++void FaceDetection::getHalStreamId(int32_t *halStreamId) {
++    LOG2("@%s", __func__);
++    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
++    CheckError(!halStreamId, VOID_VALUE, "halStreamId is nullptr");
++
++    *halStreamId = mHalStreamId;
++}
++
++/* The result for 3A AE */
++int FaceDetection::getResult(int cameraId, ia_atbx_face_state *faceState) {
++    LOG1("@%s", __func__);
++    CheckError(!faceState, UNKNOWN_ERROR, "faceState is nullptr");
++    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
++               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
++
++    int width = 0;
++    int height = 0;
++    int32_t halStreamId = 0;
++
++    FaceDetectionResult faceDetectionResult;
++    {
++        AutoMutex lock(sLock);
++        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
++        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
++
++        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
++        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result, ret %d", ret);
++        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
++        fdInstance->getHalStreamId(&halStreamId);
++    }
++
++    /*
++    face rectangle from face lib: (Ln, Tn, Rn, Bn)
++    3A statistics Surface: ((IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT) *
++                            (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP))
++    target coordinate of face rectangle to the 3A lib: (LL, TT, RR, BB)
++    FOV ratio (which is <= 1): (fovRatioW * fovRatioH)
++
++    formular:
++    LL = Ln * fovRatioW + (1 - fovRatioW) / 2 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT)
++    TT = Tn * fovRatioH + (1 - fovRatioH) / 2 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP)
++    RR and BB are the similar.
++    */
++
++    float fovRatioW = 1;
++    float fovRatioH = 1;
++    int ret = PlatformData::getScalerInfo(cameraId, halStreamId, &fovRatioW, &fovRatioH);
++    LOG2("@%s, getScalerInfo ret:%d, fovRatioW:%f, fovRatioH:%f",
++         __func__, ret, fovRatioW, fovRatioH);
++
++    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
++    float fovRatioWTmp = fovRatioW * width / (activePixelArray.right - activePixelArray.left);
++    float fovRatioHTmp = fovRatioH * height / (activePixelArray.bottom - activePixelArray.top);
++    float offsetW = (1.0 - fovRatioWTmp) / 2.0 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
++    float offsetH = (1.0 - fovRatioHTmp) / 2.0 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
++
++    LOG1("@%s, faceNum:%d, mHeight:%d, mWidth:%d", __func__,
++         faceDetectionResult.faceNum, height, width);
++
++    faceState->num_faces = faceDetectionResult.faceNum;
++
++    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
++        CLEAR(faceState->faces[i]);
++        faceState->faces[i].face_area.left =
++         static_cast<int>(faceDetectionResult.faceResults[i].rect.left * fovRatioWTmp + offsetW);
++        faceState->faces[i].face_area.top =
++         static_cast<int>(faceDetectionResult.faceResults[i].rect.top * fovRatioHTmp + offsetH);
++        faceState->faces[i].face_area.bottom =
++         static_cast<int>(
++                         faceDetectionResult.faceResults[i].rect.bottom * fovRatioHTmp + offsetH);
++        faceState->faces[i].face_area.right =
++         static_cast<int>(
++                          faceDetectionResult.faceResults[i].rect.right * fovRatioWTmp + offsetW);
++        faceState->faces[i].rip_angle = faceDetectionResult.faceResults[i].rip_angle;
++        faceState->faces[i].rop_angle = faceDetectionResult.faceResults[i].rop_angle;
++        faceState->faces[i].tracking_id = faceDetectionResult.faceResults[i].tracking_id;
++        faceState->faces[i].confidence = faceDetectionResult.faceResults[i].confidence;
++        faceState->faces[i].person_id = -1;
++        faceState->faces[i].similarity = 0;
++        faceState->faces[i].best_ratio = 0;
++        faceState->faces[i].face_condition = 0;
++
++        faceState->faces[i].smile_state = 0;
++        faceState->faces[i].smile_score = 0;
++        faceState->faces[i].mouth.x =
++          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.x * fovRatioWTmp + offsetW);
++         faceState->faces[i].mouth.y =
++          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.y * fovRatioHTmp + offsetH);
++
++        faceState->faces[i].eye_validity = 0;
++    }
++
++    return OK;
++}
++
++/* The result for android statistics metadata */
++int FaceDetection::getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
++    LOG1("@%s", __func__);
++    CheckError(!result, UNKNOWN_ERROR, "result is nullptr");
++    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
++               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
++
++    int width = 0;
++    int height = 0;
++    FaceDetectionResult faceDetectionResult;
++    {
++        AutoMutex lock(sLock);
++        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
++        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
++
++        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
++        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result");
++        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
++    }
++
++    const camera_coordinate_system_t iaCoord = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
++                                                IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
++
++    // construct android coordinate based on active pixel array
++    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
++
++    int activeHeight = activePixelArray.bottom - activePixelArray.top;
++    int activeWidth = activePixelArray.right - activePixelArray.left;
++    const camera_coordinate_system_t sysCoord = {0, 0,  activeWidth, activeHeight};
++    camera_coordinate_t srcCoord = {0, 0};
++    camera_coordinate_t destCoord = {0, 0};
++
++    int verticalCrop = 0, horizontalCrop = 0;
++    bool imageRotationUnchanged = true;
++
++    // do extra conversion if the image ratio is not the same ratio with the android coordinate.
++    if (height * activeWidth != width * activeHeight) {
++        imageRotationUnchanged = false;
++        int gap = (width * activeHeight / activeWidth) - height;
++
++        if (gap > 0) {
++            // vertical crop pixel
++            verticalCrop = gap;
++        } else if (gap < 0) {
++            // horizontal crop pixel
++            horizontalCrop = height * activeWidth / activeHeight - width;
++        }
++    }
++
++    const camera_coordinate_system_t fillFrameCoord = {0, 0,
++                                                       width + horizontalCrop,
++                                                       height + verticalCrop};
++    const camera_coordinate_system_t frameCoord = {0, 0, width, height};
++
++    CLEAR(*result);
++    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
++        if (i == MAX_FACES_DETECTABLE)
++            break;
++
++        camera_coordinate_t pointCoord = {0, 0};
++        result->faceScores[i] = faceDetectionResult.faceResults[i].confidence;
++        result->faceIds[i] = faceDetectionResult.faceResults[i].tracking_id;
++
++        if (imageRotationUnchanged) {
++            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
++                        faceDetectionResult.faceResults[i].rect.top};
++            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
++            result->faceRect[i * 4] = destCoord.x;  // rect.left
++            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
++
++            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
++                        faceDetectionResult.faceResults[i].rect.bottom};
++            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
++            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
++            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
++
++            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
++                        faceDetectionResult.eyeResults[i].left_eye.y};
++            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
++            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
++            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
++
++            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
++                        faceDetectionResult.eyeResults[i].right_eye.y};
++            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
++            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
++            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
++
++            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
++                        faceDetectionResult.mouthResults[i].mouth.y};
++            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
++            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
++            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
++        } else {
++            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
++                        faceDetectionResult.faceResults[i].rect.top};
++            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
++            pointCoord.x += horizontalCrop / 2;
++            pointCoord.y += verticalCrop / 2;
++            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
++            result->faceRect[i * 4] = destCoord.x;  // rect.left
++            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
++
++            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
++                        faceDetectionResult.faceResults[i].rect.bottom};
++            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
++            pointCoord.x += horizontalCrop / 2;
++            pointCoord.y += verticalCrop / 2;
++            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
++            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
++            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
++
++            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
++                        faceDetectionResult.eyeResults[i].left_eye.y};
++            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
++            pointCoord.x += horizontalCrop / 2;
++            pointCoord.y += verticalCrop / 2;
++            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
++            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
++            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
++
++            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
++                        faceDetectionResult.eyeResults[i].right_eye.y};
++            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
++            pointCoord.x += horizontalCrop / 2;
++            pointCoord.y += verticalCrop / 2;
++            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
++            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
++            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
++
++            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
++                        faceDetectionResult.mouthResults[i].mouth.y};
++            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
++            pointCoord.x += horizontalCrop / 2;
++            pointCoord.y += verticalCrop / 2;
++            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
++            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
++            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
++        }
++    }
++    result->faceNum = (faceDetectionResult.faceNum < MAX_FACES_DETECTABLE ?
++                       faceDetectionResult.faceNum : MAX_FACES_DETECTABLE);
++    return OK;
++}
++}  // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.h b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
+new file mode 100644
+index 000000000000..9cc2433b05d3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
+@@ -0,0 +1,120 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#ifdef FACE_DETECTION
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelFaceDetection.h"
++#else
++#include "modules/algowrapper/IntelFaceDetection.h"
++#endif
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#endif
++
++#include <ia_types.h>
++#include <unordered_map>
++#include <memory>
++#include <queue>
++
++#include "iutils/Utils.h"
++#include "Parameters.h"
++#include "FaceBase.h"
++
++namespace icamera {
++
++#ifdef FACE_DETECTION
++class FaceDetection : public Thread {
++ public:
++    FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId,
++                  int width, int height);
++    ~FaceDetection();
++
++    static FaceDetection *createInstance(int cameraId, unsigned int maxFaceNum,
++                                         int32_t halStreamId, int width, int height);
++    static void destoryInstance(int cameraId);
++    static FaceDetection *getInstance(int cameraId);
++
++    void runFaceDetection(const camera_buffer_t &buffer);
++    void runFaceDetectionBySync(const camera_buffer_t &buffer);
++    void runFaceDetectionByAsync(const camera_buffer_t &buffer);
++    int getFaceNum();
++    virtual bool threadLoop();
++    static int getResult(int cameraId, ia_atbx_face_state *faceState);
++    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result);
++
++ private:
++    int getFaceDetectionResult(FaceDetectionResult *mResult);
++    FaceDetectionRunParams *acquireRunBuf();
++    void returnRunBuf(FaceDetectionRunParams *memRunBuf);
++    void getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth);
++    void getHalStreamId(int32_t *halStreamId);
++
++    // Guard for face engine instance
++    static Mutex sLock;
++    static std::unordered_map<int, FaceDetection*> sInstances;
++
++    int mCameraId;
++    bool mInitialized;
++
++    // Guard for face detection result
++    std::mutex mFaceResultLock;
++    FaceDetectionResult mResult;
++
++    std::unique_ptr<IntelFaceDetection> mFace;
++
++    std::condition_variable mRunCondition;
++    // Guard for running buffer queue of thread
++    std::mutex mRunBufQueueLock;
++    std::queue<FaceDetectionRunParams *> mRunBufQueue;
++    const uint64_t kMaxDuration = 2000000000;  // 2000ms
++
++    // Guard for running buffer pool of face engine
++    std::mutex mMemRunPoolLock;
++    std::queue<FaceDetectionRunParams *> mMemRunPool;
++
++    int mSensorOrientation;
++
++    int32_t mHalStreamId;
++    int mWidth;
++    int mHeight;
++
++    DISALLOW_COPY_AND_ASSIGN(FaceDetection);
++};
++#else
++class FaceDetection {
++ public:
++    static int getResult(int cameraId, ia_atbx_face_state *faceState) {
++        faceState->num_faces = 0;
++        return 0;
++    }
++    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
++        CLEAR(*result);
++        return 0;
++    }
++    static FaceDetection *createInstance(int cameraId,
++                                         unsigned int maxFaceNum, int32_t halStreamId,
++                                         int width, int height) {
++        return nullptr;
++    }
++    static void destoryInstance(int cameraId) {}
++    void runFaceDetection(const camera_buffer_t &buffer) {}
++    int getFaceNum() {return 0;}
++};
++#endif
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.cpp b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
+new file mode 100644
+index 000000000000..53dd2c1e6ec8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
+@@ -0,0 +1,268 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraHal"
++
++#include <vector>
++
++#include "iutils/CameraLog.h"
++
++#include "ICamera.h"
++#include "PlatformData.h"
++#include "SyncManager.h"
++#include "CameraHal.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++#define checkCameraDevice(device, err_code) \
++    do { \
++        if (mState == HAL_UNINIT) { \
++            LOGE("HAL is not init."); \
++            return err_code; \
++        } \
++        if (!(device)) { \
++            LOGE("device is not open."); \
++            return err_code; \
++        } \
++    } while (0)
++
++CameraHal::CameraHal() :
++    mInitTimes(0),
++    mState(HAL_UNINIT)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s", __func__);
++
++    CLEAR(mCameraDevices);
++}
++
++CameraHal::~CameraHal()
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s", __func__);
++}
++
++int CameraHal::init()
++{
++    LOG1("@%s", __func__);
++    AutoMutex lock(mLock);
++
++    if (mInitTimes++ > 0) {
++        LOGD("@%s, mInitTimes:%d, return without running", __func__, mInitTimes);
++        return OK;
++    }
++
++    int ret = PlatformData::init();
++    CheckError(ret != OK, NO_INIT, "PlatformData init failed");
++
++    mState = HAL_INIT;
++
++    return OK;
++}
++
++int CameraHal::deinit()
++{
++    LOG1("@%s", __func__);
++    AutoMutex l(mLock);
++
++    if (--mInitTimes > 0) {
++        LOGD("@%s, mInitTimes:%d, return without set state", __func__, mInitTimes);
++        return OK;
++    }
++
++    // SyncManager is used to do synchronization with multi-devices.
++    // Release it when the last device exit
++    SyncManager::releaseInstance();
++    // Release the PlatformData instance here due to it was
++    // created in init() period
++    PlatformData::releaseInstance();
++
++    mState = HAL_UNINIT;
++
++    return OK;
++}
++
++int CameraHal::deviceOpen(int cameraId)
++{
++    LOG1("@%s, camera id:%d", __func__, cameraId);
++    PERF_CAMERA_ATRACE();
++
++    AutoMutex l(mLock);
++    CheckError(mState == HAL_UNINIT, NO_INIT,"HAL is not initialized");
++
++    //Create the camera device that will be freed in close
++    if (mCameraDevices[cameraId]) {
++        LOGD("@%s: open multi times", __func__);
++        return INVALID_OPERATION;
++    }
++
++    mCameraOpenNum++;
++    mCameraDevices[cameraId] = new CameraDevice(cameraId);
++
++    if (mCameraOpenNum == 1) {
++        MediaControl::getInstance()->resetAllLinks();
++    }
++
++    return mCameraDevices[cameraId]->init();
++}
++
++void CameraHal::deviceClose(int cameraId)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, camera id:%d", __func__, cameraId);
++    AutoMutex l(mLock);
++
++    if (mCameraDevices[cameraId]) {
++        mCameraDevices[cameraId]->deinit();
++        delete mCameraDevices[cameraId];
++        mCameraDevices[cameraId] = nullptr;
++
++        mCameraOpenNum--;
++    }
++}
++
++void CameraHal::deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback)
++{
++    LOG1("@%s", __func__);
++    AutoMutex l(mLock);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, VOID_VALUE);
++#ifdef ENABLE_SANDBOXING
++    IntelAlgoClient::getInstance()->registerErrorCallback(callback);
++#endif
++    device->callbackRegister(callback);
++}
++
++// Assume the inputConfig is already checked in upper layer
++int CameraHal::deviceConfigInput(int cameraId, const stream_t *inputConfig)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, camera id:%d", __func__, cameraId);
++    AutoMutex lock(mLock);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    device->configureInput(inputConfig);
++
++    return OK;
++}
++
++// Assume the streamList is already checked in upper layer
++int CameraHal::deviceConfigStreams(int cameraId, stream_config_t *streamList)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, camera id:%d", __func__, cameraId);
++    AutoMutex lock(mLock);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    int ret = device->configure(streamList);
++    if (ret != OK) {
++        LOGE("failed to config streams.");
++        return INVALID_OPERATION;
++    }
++
++    return ret;
++}
++
++int CameraHal::deviceStart(int cameraId)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, cameraId is %d", __func__, cameraId);
++
++    ConditionLock lock(mLock);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->start();
++}
++
++int CameraHal::deviceStop(int cameraId)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, cameraId is %d", __func__, cameraId);
++
++    AutoMutex lock(mLock);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->stop();
++}
++
++int CameraHal::deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer)
++{
++    PERF_CAMERA_ATRACE();
++    LOG1("@%s, cameraId is %d", __func__, cameraId);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->allocateMemory(ubuffer);
++}
++
++int CameraHal::streamQbuf(int cameraId, camera_buffer_t **ubuffer,
++                          int bufferNum, const Parameters* settings)
++{
++    PERF_CAMERA_ATRACE();
++    LOG2("@%s, cameraId is %d, fd:%d", __func__, cameraId, (*ubuffer)->dmafd);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->qbuf(ubuffer, bufferNum, settings);
++}
++
++int CameraHal::streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
++                           Parameters* settings)
++{
++    PERF_CAMERA_ATRACE();
++    LOG2("@%s, cameraId is %d, streamId is %d", __func__, cameraId, streamId);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->dqbuf(streamId, ubuffer, settings);
++}
++
++int CameraHal::getParameters(int cameraId, Parameters& param, long sequence)
++{
++    LOG1("@%s, cameraId is %d", __func__, cameraId);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->getParameters(param, sequence);
++}
++
++int CameraHal::setParameters(int cameraId, const Parameters& param)
++{
++    LOG1("@%s, cameraId is %d", __func__, cameraId);
++
++    CameraDevice *device = mCameraDevices[cameraId];
++    checkCameraDevice(device, BAD_VALUE);
++
++    return device->setParameters(param);
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.h b/camera/hal/intel/ipu6/src/hal/CameraHal.h
+new file mode 100644
+index 000000000000..1d46319862dd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/hal/CameraHal.h
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "CameraDevice.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++/**
++ * CameraHal class is the real HAL API.
++ * There is only one instance of CameraHal which is created when HAL loading
++ * It creates the CameraDevice based on the camera ID to support multi-cameras.
++ *
++ * The main job of the Class is
++ * 1. Maintain a list of CameraDevice
++ * 2. Pass the Camera HAL API to the correct CameraDevice based on CameraId
++ *
++ * If open dual cameras in different process, the shared memory must be used to
++ * keep the account of the open times.
++ *
++ * The CameraHal create and maintains followings singleton instancs
++ * 1. MediaControl Instance
++ * 2. PlatformData Instance
++ */
++
++class CameraHal {
++//HAL API
++public:
++    CameraHal();
++    ~CameraHal();
++    int init();
++    int deinit();
++
++//Device API
++public:
++    int deviceOpen(int cameraId);
++    void deviceClose(int cameraId);
++
++    void deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback);
++    int deviceConfigInput(int cameraId, const stream_t *inputConfig);
++    int deviceConfigStreams(int cameraId, stream_config_t *streamList);
++    int deviceStart(int cameraId);
++    int deviceStop(int cameraId);
++    int deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer);
++//Stream API
++    int streamQbuf(int cameraId, camera_buffer_t **ubuffer,
++                   int bufferNum = 1, const Parameters* settings = nullptr);
++    int streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
++                    Parameters* settings = nullptr);
++    int setParameters(int cameraId, const Parameters& param);
++    int getParameters(int cameraId, Parameters& param, long sequence);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(CameraHal);
++
++private:
++    CameraDevice* mCameraDevices[MAX_CAMERA_NUMBER];
++    int mInitTimes;
++    // Guard for CameraHal public API.
++    Mutex mLock;
++
++    enum {
++        HAL_UNINIT,
++        HAL_INIT
++    } mState;
++
++    int mCameraOpenNum = 0;
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/hal/ICamera.cpp b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
+new file mode 100644
+index 000000000000..4fdad9b8a940
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
+@@ -0,0 +1,371 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ICamera"
++
++#include "iutils/CameraDump.h"
++#include "iutils/CameraLog.h"
++
++#include "ICamera.h"
++#include "CameraHal.h"
++#include "PlatformData.h"
++
++/**
++ * This is the wrapper to the CameraHal Class to provide the HAL interface
++ * Main job of this file
++ * 1. Check the argument from user
++ * 2. Transfer HAL API to CameraHal class
++ * 3. Implement the HAL static function: get_number_of_cameras and get_camera_info
++ */
++namespace icamera {
++
++static CameraHal * gCameraHal = nullptr;
++
++#define CheckCameraId(camera_id, err_code) \
++    do { \
++        int max_cam = PlatformData::numberOfCameras(); \
++        if (((camera_id) < 0) || (camera_id) >= max_cam) { \
++            LOGE("camera index(%d) is invaild., max_cam:%d", camera_id, max_cam); \
++            return err_code; \
++        } \
++    } while (0)
++
++/**
++ * Return the numbers of camera
++ * This should be called before any other calls
++ *
++ * \return > 0  return camera numbers
++ * \return == 0 failed to get camera numbers
++ **/
++int get_number_of_cameras()
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    return PlatformData::numberOfCameras();
++}
++
++/**
++ * Get capability related camera info.
++ * Should be called after get_number_of_cameras
++ *
++ * \return error code
++ */
++int get_camera_info(int camera_id, camera_info_t& info)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    int ret = PlatformData::getCameraInfo(camera_id, info);
++
++    return ret;
++}
++
++/**
++ * Initialize camera hal
++ *
++ * \return error code
++ **/
++int camera_hal_init()
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    if (gCameraHal) {
++        LOGW("camera hal is initialized multiple times.");
++        return 0;
++    }
++    gCameraHal = new CameraHal;
++
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    return gCameraHal->init();
++}
++
++/**
++ * De-initialize camera hal
++ *
++ * \return error code
++ **/
++int camera_hal_deinit()
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    int ret = gCameraHal->deinit();
++
++    delete gCameraHal;
++    gCameraHal = nullptr;
++
++    return ret;
++}
++
++/**
++ * Register callback function
++ **/
++void camera_callback_register(int camera_id, const camera_callback_ops_t* callback)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
++    gCameraHal->deviceCallbackRegister(camera_id, callback);
++}
++
++/**
++ * Open one camera device
++ *
++ * \param camera_id camera index
++ *
++ * \return error code
++ **/
++int camera_device_open(int camera_id)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    return gCameraHal->deviceOpen(camera_id);
++}
++
++/**
++ * Close camera device
++ *
++ * \param camera_id The ID that opened before
++ **/
++void camera_device_close(int camera_id)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
++    CheckCameraId(camera_id,);
++
++    gCameraHal->deviceClose(camera_id);
++}
++
++/**
++ * Configure the sensor input of the device
++ *
++ * \param camera_id The camera ID that was opened
++ * \param input_config  sensor input configuration
++ *
++ * \return 0 succeed <0 error
++ **/
++int camera_device_config_sensor_input(int camera_id, const stream_t *input_config)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckError(!input_config, BAD_VALUE, "camera input_config is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    return gCameraHal->deviceConfigInput(camera_id, input_config);
++}
++
++/**
++ * Add stream to device
++ *
++ * \param camera_id The camera ID that was opened
++ * \param stream_id
++ * \param stream_conf stream configuration
++ *
++ * \return 0 succeed <0 error
++ **/
++int camera_device_config_streams(int camera_id, stream_config_t *stream_list)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckError(!stream_list, BAD_VALUE, "camera stream is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    if (stream_list->operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE) {
++        for (int i = 0; i < stream_list->num_streams; i++) {
++            stream_list->streams[i].usage = CAMERA_STREAM_STILL_CAPTURE;
++        }
++    }
++
++    return gCameraHal->deviceConfigStreams(camera_id, stream_list);
++}
++
++/**
++ * Start device
++ *
++ * Start all streams in device.
++ *
++ * \param camera_id The Caemra ID that opened before
++ *
++ * \return error code
++ **/
++int camera_device_start(int camera_id)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++    CheckError(!gCameraHal, INVALID_OPERATION ,"camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    return gCameraHal->deviceStart(camera_id);
++}
++
++/**
++ * Stop device
++ *
++ * Stop all streams in device.
++ *
++ * \param camera_id The Caemra ID that opened before
++ *
++ * \return error code
++ **/
++int camera_device_stop(int camera_id)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(1);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    return gCameraHal->deviceStop(camera_id);
++}
++
++/**
++ * Allocate memory for mmap & dma export io-mode
++ *
++ * \param camera_id The camera ID that opened before
++ * \param camera_buff stream buff
++ *
++ * \return error code
++ **/
++int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(2);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++    CheckError(!buffer, BAD_VALUE, "buffer is NULL.");
++    CheckError(buffer->s.memType != V4L2_MEMORY_MMAP, BAD_VALUE, "memory type %d is not supported.", buffer->s.memType);
++
++    return gCameraHal->deviceAllocateMemory(camera_id, buffer);
++}
++
++/**
++ * Queue a buffer to a stream (deprecated)
++ *
++ * \param camera_id The camera ID that opened before
++ * \param stream_id the stream ID that add to device before
++ * \param camera_buff stream buff
++ *
++ * \return error code
++ **/
++int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
++                       int num_buffers, const Parameters* settings)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(2);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    LOGW("camera_stream_qbuf(cam_id, stream_id, *buffer, num_buffers, *settings) is deprecated and will be removed soon.");
++    LOGW("Please start to use camera_stream_qbuf(cam_id, **buffer, num_buffers, *settings)");
++
++    return gCameraHal->streamQbuf(camera_id, &buffer, num_buffers, settings);
++}
++
++/**
++ * Queue a buffer(or more buffers) to a stream
++ *
++ * \param camera_id The camera ID that opened before
++ * \param buffer The array of pointers to the camera_buffer_t
++ * \param num_buffers The number of buffers in the array
++ *
++ * \return error code
++ **/
++int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
++                       int num_buffers, const Parameters* settings)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(2);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++
++    return gCameraHal->streamQbuf(camera_id, buffer, num_buffers, settings);
++}
++
++/**
++ * Dequeue a buffer from a stream
++ *
++ * \param camera_id The camera ID that opened before
++ * \param stream_id the stream ID that add to device before
++ * \param camera_buff stream buff
++ *
++ * \return error code
++ **/
++int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
++                        Parameters* settings)
++{
++    PERF_CAMERA_ATRACE();
++    HAL_TRACE_CALL(2);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
++    CheckCameraId(camera_id, BAD_VALUE);
++    CheckError(!buffer, BAD_VALUE, "camera stream buffer is null.");
++
++    return gCameraHal->streamDqbuf(camera_id, stream_id, buffer, settings);
++}
++
++int camera_set_parameters(int camera_id, const Parameters& param)
++{
++    HAL_TRACE_CALL(2);
++    CheckCameraId(camera_id, BAD_VALUE);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before setting parameters.");
++
++    return gCameraHal->setParameters(camera_id, param);
++}
++
++int camera_get_parameters(int camera_id, Parameters& param, long sequence)
++{
++    HAL_TRACE_CALL(2);
++    CheckCameraId(camera_id, BAD_VALUE);
++    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before getting parameters.");
++
++    return gCameraHal->getParameters(camera_id, param, sequence);
++}
++
++int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp)
++{
++    CheckError(width <= 0, BAD_VALUE, "width <=0");
++    CheckError(height <= 0, BAD_VALUE, "height <=0");
++    CheckError(field < 0, BAD_VALUE, "field <0");
++
++    int frameSize = 0;
++    bool isOFSCompression = PlatformData::getOFSCompression(camera_id);
++
++   *bpp = CameraUtils::getBpp(format);
++    if(isOFSCompression) {
++        frameSize = CameraUtils::getFrameSize(format, width, height, false, true, true);
++    } else {
++        frameSize = CameraUtils::getFrameSize(format, width, height);
++    }
++    LOG2("@%s: output compression frame: %d, frame size from HAL:%d\n",
++               __func__, isOFSCompression, frameSize);
++
++    return frameSize;
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
+new file mode 100644
+index 000000000000..c4b2d2fb8603
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "Camera3Buffer.h"
++#include "ProcessType.h"
++
++namespace icamera {
++
++class IImageProcessor {
++public:
++    IImageProcessor() {};
++    virtual ~IImageProcessor() {};
++
++    static std::unique_ptr<IImageProcessor> createImageProcessor();
++    static bool isProcessingTypeSupported(PostProcessType type);
++
++    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                               std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
++    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
++    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                 std::shared_ptr<camera3::Camera3Buffer> &output,
++                                 int angle, std::vector<uint8_t> &rotateBuf) = 0;
++    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                  std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
++private:
++    DISALLOW_COPY_AND_ASSIGN(IImageProcessor);
++};
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
+new file mode 100644
+index 000000000000..8e600ba937de
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
+@@ -0,0 +1,799 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ColorConverter"
++
++#include <sys/types.h>
++#include <linux/videodev2.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "ImageConverter.h"
++
++namespace icamera {
++namespace ImageConverter {
++
++void YUV420ToRGB565(int width, int height, void *src, void *dst)
++{
++    int line, col, linewidth;
++    int y, u, v, yy, vr, ug, vg, ub;
++    int r, g, b;
++    const unsigned char *py, *pu, *pv;
++    unsigned short *rgbs = (unsigned short *) dst;
++
++    linewidth = width >> 1;
++    py = (unsigned char *) src;
++    pu = py + (width * height);
++    pv = pu + (width * height) / 4;
++
++    y = *py++;
++    yy = y << 8;
++    u = *pu - 128;
++    ug = 88 * u;
++    ub = 454 * u;
++    v = *pv - 128;
++    vg = 183 * v;
++    vr = 359 * v;
++
++    for (line = 0; line < height; line++) {
++        for (col = 0; col < width; col++) {
++            r = (yy + vr) >> 8;
++            g = (yy - ug - vg) >> 8;
++            b = (yy + ub ) >> 8;
++            if (r < 0) r = 0;
++            if (r > 255) r = 255;
++            if (g < 0) g = 0;
++            if (g > 255) g = 255;
++            if (b < 0) b = 0;
++            if (b > 255) b = 255;
++            *rgbs++ = (((unsigned short)r>>3)<<11) | (((unsigned short)g>>2)<<5)
++                   | (((unsigned short)b>>3)<<0);
++
++            y = *py++;
++            yy = y << 8;
++            if (col & 1) {
++                pu++;
++                pv++;
++                u = *pu - 128;
++                ug = 88 * u;
++                ub = 454 * u;
++                v = *pv - 128;
++                vg = 183 * v;
++                vr = 359 * v;
++            }
++        }
++        if ((line & 1) == 0) {
++            pu -= linewidth;
++            pv -= linewidth;
++        }
++    }
++}
++
++void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst)
++{
++
++    unsigned char *yuvs = (unsigned char *) src;
++    unsigned char *rgbs = (unsigned char *) dst;
++
++    //the end of the luminance data
++    int lumEnd = srcStride * height;
++    int i = 0, j = 0;
++    for( i=0; i < height; i++) {
++        //points to the next luminance value pair
++        int lumPtr = i * srcStride;
++        //points to the next chromiance value pair
++        int chrPtr = i / 2 * srcStride + lumEnd;
++        for ( j=0; j < width; j+=2 ) {
++            //read the luminance and chromiance values
++            int Y1 = yuvs[lumPtr++] & 0xff;
++            int Y2 = yuvs[lumPtr++] & 0xff;
++            int Cb = (yuvs[chrPtr++] & 0xff) - 128;
++            int Cr = (yuvs[chrPtr++] & 0xff) - 128;
++            int R, G, B;
++
++            //generate first RGB components
++            B = Y1 + ((454 * Cb) >> 8);
++            if(B < 0) B = 0; else if(B > 255) B = 255;
++            G = Y1 - ((88 * Cb + 183 * Cr) >> 8);
++            if(G < 0) G = 0; else if(G > 255) G = 255;
++            R = Y1 + ((359 * Cr) >> 8);
++            if(R < 0) R = 0; else if(R > 255) R = 255;
++            //NOTE: this assume little-endian encoding
++            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
++            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
++
++            //generate second RGB components
++            B = Y2 + ((454 * Cb) >> 8);
++            if(B < 0) B = 0; else if(B > 255) B = 255;
++            G = Y2 - ((88 * Cb + 183 * Cr) >> 8);
++            if(G < 0) G = 0; else if(G > 255) G = 255;
++            R = Y2 + ((359 * Cr) >> 8);
++            if(R < 0) R = 0; else if(R > 255) R = 255;
++            //NOTE: this assume little-endian encoding
++            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
++            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
++        }
++    }
++}
++
++// covert YV12 (Y plane, V plane, U plane) to NV21 (Y plane, interlaced VU bytes)
++void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst)
++{
++    const int cStride = srcStride>>1;
++    const int vuStride = dstStride;
++    const int hhalf = height>>1;
++    const int whalf = width>>1;
++
++    // copy the entire Y plane
++    unsigned char *srcPtr = (unsigned char *)src;
++    unsigned char *dstPtr = (unsigned char *)dst;
++    if (srcStride == dstStride) {
++        MEMCPY_S(dstPtr, dstStride*height, srcPtr, dstStride*height);
++    } else {
++        for (int i = 0; i < height; i++) {
++            MEMCPY_S(dstPtr, width, srcPtr, width);
++            srcPtr += srcStride;
++            dstPtr += dstStride;
++        }
++    }
++
++    // interlace the VU data
++    unsigned char *srcPtrV = (unsigned char *)src + height*srcStride;
++    unsigned char *srcPtrU = srcPtrV + cStride*hhalf;
++    dstPtr = (unsigned char *)dst + dstStride*height;
++    for (int i = 0; i < hhalf; ++i) {
++        unsigned char *pDstVU = dstPtr;
++        unsigned char *pSrcV = srcPtrV;
++        unsigned char *pSrcU = srcPtrU;
++        for (int j = 0; j < whalf; ++j) {
++            *pDstVU ++ = *pSrcV ++;
++            *pDstVU ++ = *pSrcU ++;
++        }
++        dstPtr += vuStride;
++        srcPtrV += cStride;
++        srcPtrU += cStride;
++    }
++}
++
++// copy YV12 to YV12 (Y plane, V plan, U plan) in case of different stride length
++void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
++{
++    // copy the entire Y plane
++    if (srcStride == dstStride) {
++        MEMCPY_S(dst, dstStride * height, src, dstStride * height);
++    } else {
++        unsigned char *srcPtrY = (unsigned char *)src;
++        unsigned char *dstPtrY = (unsigned char *)dst;
++        for (int i = 0; i < height; i ++) {
++            MEMCPY_S(dstPtrY, width, srcPtrY, width);
++            srcPtrY += srcStride;
++            dstPtrY += dstStride;
++        }
++    }
++
++    // copy VU plane
++    const int scStride = srcStride >> 1;
++    const int dcStride = ALIGN_16(dstStride >> 1); // Android CTS required: U/V plane needs 16 bytes aligned!
++    if (dcStride == scStride) {
++        unsigned char *srcPtrVU = (unsigned char *)src + height * srcStride;
++        unsigned char *dstPtrVU = (unsigned char *)dst + height * dstStride;
++        MEMCPY_S(dstPtrVU, height * dcStride, srcPtrVU, height * dcStride);
++    } else {
++        const int wHalf = width >> 1;
++        const int hHalf = height >> 1;
++        unsigned char *srcPtrV = (unsigned char *)src + height * srcStride;
++        unsigned char *srcPtrU = srcPtrV + scStride * hHalf;
++        unsigned char *dstPtrV = (unsigned char *)dst + height * dstStride;
++        unsigned char *dstPtrU = dstPtrV + dcStride * hHalf;
++        for (int i = 0; i < hHalf; i ++) {
++            MEMCPY_S(dstPtrU, wHalf, srcPtrU, wHalf);
++            MEMCPY_S(dstPtrV, wHalf, srcPtrV, wHalf);
++            dstPtrU += dcStride, srcPtrU += scStride;
++            dstPtrV += dcStride, srcPtrV += scStride;
++        }
++    }
++}
++
++// covert NV12 (Y plane, interlaced UV bytes) to
++// NV21 (Y plane, interlaced VU bytes) and trim stride width to real width
++void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst)
++{
++    const int ysize = width * height;
++    unsigned const char *pSrc = (unsigned char *)src;
++    unsigned char *pDst = (unsigned char *)dst;
++
++    // Copy Y component
++    if (srcStride == width) {
++        MEMCPY_S(pDst, ysize, pSrc, ysize);
++    } else if (srcStride > width) {
++        int j = height;
++        while(j--) {
++            MEMCPY_S(pDst, width, pSrc, width);
++            pSrc += srcStride;
++            pDst += width;
++        }
++    } else {
++        ALOGE("bad stride value");
++        return;
++    }
++
++    // Convert UV to VU
++    pSrc = (unsigned char *)src + srcStride * height;
++    pDst = (unsigned char *)dst + width * height;
++    for (int j = 0; j < height / 2; j++) {
++        if (width >= 16) {
++            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
++            uint32_t *ptr1 = (uint32_t *)(pDst);
++            int bNotLastLine = ((j+1) == (height/2)) ? 0 : 1;
++            int width_16 = (width + 15 * bNotLastLine) & ~0xf;
++            if ((((uint64_t)(pSrc)) & 0xf) == 0 && (((uint64_t)(pDst)) & 0xf) == 0) { // 16 bytes aligned for both src and dest
++                __asm__ volatile(\
++                                 "movl       %0,  %%eax      \n\t"
++                                 "movl       %1,  %%edx      \n\t"
++                                 "movl       %2,  %%ecx      \n\t"
++                                 "1:     \n\t"
++                                 "movdqa (%%eax), %%xmm1     \n\t"
++                                 "movdqa  %%xmm1, %%xmm0     \n\t"
++                                 "psllw       $8, %%xmm1     \n\t"
++                                 "psrlw       $8, %%xmm0     \n\t"
++                                 "por     %%xmm0, %%xmm1     \n\t"
++                                 "movdqa  %%xmm1, (%%edx)    \n\t"
++                                 "add        $16, %%eax      \n\t"
++                                 "add        $16, %%edx      \n\t"
++                                 "sub        $16, %%ecx      \n\t"
++                                 "jnz   1b \n\t"
++                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
++                                 :
++                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
++                                );
++            }
++            else { // either src or dest is not 16-bytes aligned
++                __asm__ volatile(\
++                                 "movl       %0,  %%eax      \n\t"
++                                 "movl       %1,  %%edx      \n\t"
++                                 "movl       %2,  %%ecx      \n\t"
++                                 "1:     \n\t"
++                                 "lddqu  (%%eax), %%xmm1     \n\t"
++                                 "movdqa  %%xmm1, %%xmm0     \n\t"
++                                 "psllw       $8, %%xmm1     \n\t"
++                                 "psrlw       $8, %%xmm0     \n\t"
++                                 "por     %%xmm0, %%xmm1     \n\t"
++                                 "movdqu  %%xmm1, (%%edx)    \n\t"
++                                 "add        $16, %%eax      \n\t"
++                                 "add        $16, %%edx      \n\t"
++                                 "sub        $16, %%ecx      \n\t"
++                                 "jnz   1b \n\t"
++                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
++                                 :
++                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
++                                );
++            }
++
++            // process remaining data of less than 16 bytes of last row
++            for (int i = width_16; i < width; i += 2) {
++                pDst[i] = pSrc[i + 1];
++                pDst[i + 1] = pSrc[i];
++            }
++        }
++        else if ((((uint64_t)(pSrc)) & 0x3) == 0 && (((uint64_t)(pDst)) & 0x3) == 0){  // 4 bytes aligned for both src and dest
++            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
++            uint32_t *ptr1 = (uint32_t *)(pDst);
++            int width_4 = width & ~3;
++            for (int i = 0; i < width_4; i += 4) {
++                uint32_t data0 = *ptr0++;
++                uint32_t data1 = (data0 >> 8) & 0x00ff00ff;
++                uint32_t data2 = (data0 << 8) & 0xff00ff00;
++                *ptr1++ = data1 | data2;
++            }
++            // process remaining data of less than 4 bytes at end of each row
++            for (int i = width_4; i < width; i += 2) {
++                pDst[i] = pSrc[i + 1];
++                pDst[i + 1] = pSrc[i];
++            }
++        }
++        else {
++            unsigned const char *ptr0 = pSrc;
++            unsigned char *ptr1 = pDst;
++            for (int i = 0; i < width; i += 2) {
++                *ptr1++ = ptr0[1];
++                *ptr1++ = ptr0[0];
++                ptr0 += 2;
++            }
++        }
++        pDst += width;
++        pSrc += srcStride;
++    }
++}
++
++// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
++// without Y and C 16 bytes aligned
++void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
++{
++    int yStride = width;
++    size_t ySize = yStride * height;
++    int cStride = yStride/2;
++    size_t cSize = cStride * height/2;
++
++    unsigned char *srcPtr = (unsigned char *) src;
++    unsigned char *dstPtr = (unsigned char *) dst;
++    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
++    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
++
++    // copy the entire Y plane
++    if (srcStride == yStride) {
++        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
++        srcPtr += ySize;
++    } else if (srcStride > width) {
++        for (int i = 0; i < height; i++) {
++            MEMCPY_S(dstPtr, width, srcPtr, width);
++            srcPtr += srcStride;
++            dstPtr += yStride;
++        }
++    } else {
++        ALOGE("bad src stride value");
++        return;
++    }
++
++    // deinterlace the UV data
++    int halfHeight = height / 2;
++    int halfWidth = width / 2;
++    for ( int i = 0; i < halfHeight; ++i) {
++        for ( int j = 0; j < halfWidth; ++j) {
++            dstPtrV[j] = srcPtr[j * 2 + 1];
++            dstPtrU[j] = srcPtr[j * 2];
++        }
++        srcPtr += srcStride;
++        dstPtrV += cStride;
++        dstPtrU += cStride;
++    }
++}
++
++// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
++// with Y and C 16 bytes aligned
++void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
++{
++    int yStride = ALIGN_16(width);
++    size_t ySize = yStride * height;
++    int cStride = ALIGN_16(yStride/2);
++    size_t cSize = cStride * height/2;
++
++    unsigned char *srcPtr = (unsigned char *) src;
++    unsigned char *dstPtr = (unsigned char *) dst;
++    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
++    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
++
++    // copy the entire Y plane
++    if (srcStride == yStride) {
++        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
++        srcPtr += ySize;
++    } else if (srcStride > width) {
++        for (int i = 0; i < height; i++) {
++            MEMCPY_S(dstPtr, width, srcPtr, width);
++            srcPtr += srcStride;
++            dstPtr += yStride;
++        }
++    } else {
++        ALOGE("bad src stride value");
++        return;
++    }
++
++    // deinterlace the UV data
++    for ( int i = 0; i < height / 2; ++i) {
++        for ( int j = 0; j < width / 2; ++j) {
++            dstPtrV[j] = srcPtr[j * 2 + 1];
++            dstPtrU[j] = srcPtr[j * 2];
++        }
++        srcPtr += srcStride;
++        dstPtrV += cStride;
++        dstPtrU += cStride;
++    }
++}
++
++// P411's Y, U, V are seperated. But the YUY2's Y, U and V are interleaved.
++void YUY2ToP411(int width, int height, int stride, void *src, void *dst)
++{
++    int ySize = width * height;
++    int cSize = width * height / 4;
++    int wHalf = width >> 1;
++
++    unsigned char *srcPtr = (unsigned char *) src;
++    unsigned char *dstPtr = (unsigned char *) dst;
++    unsigned char *dstPtrU = (unsigned char *) dst + ySize;
++    unsigned char *dstPtrV = (unsigned char *) dst + ySize + cSize;
++
++    for (int i = 0; i < height; i++) {
++        //The first line of the source
++        //Copy first Y Plane first
++        for (int j=0; j < width; j++) {
++            dstPtr[j] = srcPtr[j*2];
++        }
++
++        if (i & 1) {
++            //Copy the V plane
++            for (int k = 0; k < wHalf; k++) {
++                dstPtrV[k] = srcPtr[k * 4 + 3];
++            }
++            dstPtrV = dstPtrV + wHalf;
++        } else {
++            //Copy the U plane
++            for (int k = 0; k< wHalf; k++) {
++                dstPtrU[k] = srcPtr[k * 4 + 1];
++            }
++            dstPtrU = dstPtrU + wHalf;
++        }
++
++        srcPtr = srcPtr + stride * 2;
++        dstPtr = dstPtr + width;
++    }
++}
++
++// P411's Y, U, V are separated. But the NV12's U and V are interleaved.
++void NV12ToP411Separate(int width, int height, int stride,
++                                void *srcY, void *srcUV, void *dst)
++{
++    int i, j, p, q;
++    unsigned char *psrcY = (unsigned char *) srcY;
++    unsigned char *pdstY = (unsigned char *) dst;
++    unsigned char *pdstU, *pdstV;
++    unsigned char *psrcUV;
++
++    // copy Y data
++    for (i = 0; i < height; i++) {
++        MEMCPY_S(pdstY, width, psrcY, width);
++        pdstY += width;
++        psrcY += stride;
++    }
++
++    // copy U data and V data
++    psrcUV = (unsigned char *)srcUV;
++    pdstU = (unsigned char *)dst + width * height;
++    pdstV = pdstU + width * height / 4;
++    p = q = 0;
++    for (i = 0; i < height / 2; i++) {
++        for (j = 0; j < width; j++) {
++            if (j % 2 == 0) {
++                pdstU[p] = (psrcUV[i * stride + j] & 0xFF);
++                p++;
++           } else {
++                pdstV[q] = (psrcUV[i * stride + j] & 0xFF);
++                q++;
++            }
++        }
++    }
++}
++
++// P411's Y, U, V are seperated. But the NV12's U and V are interleaved.
++void NV12ToP411(int width, int height, int stride, void *src, void *dst)
++{
++    NV12ToP411Separate(width, height, stride,
++                    src, (void *)((unsigned char *)src + width * height), dst);
++}
++
++// P411's Y, U, V are separated. But the NV21's U and V are interleaved.
++void NV21ToP411Separate(int width, int height, int stride,
++                        void *srcY, void *srcUV, void *dst)
++{
++    int i, j, p, q;
++    unsigned char *psrcY = (unsigned char *) srcY;
++    unsigned char *pdstY = (unsigned char *) dst;
++    unsigned char *pdstU, *pdstV;
++    unsigned char *psrcUV;
++
++    // copy Y data
++    for (i = 0; i < height; i++) {
++        MEMCPY_S(pdstY, width, psrcY, width);
++        pdstY += width;
++        psrcY += stride;
++    }
++
++    // copy U data and V data
++    psrcUV = (unsigned char *)srcUV;
++    pdstU = (unsigned char *)dst + width * height;
++    pdstV = pdstU + width * height / 4;
++    p = q = 0;
++    for (i = 0; i < height / 2; i++) {
++        for (j = 0; j < width; j++) {
++            if ((j & 1) == 0) {
++                pdstV[p] = (psrcUV[i * stride + j] & 0xFF);
++                p++;
++           } else {
++                pdstU[q] = (psrcUV[i * stride + j] & 0xFF);
++                q++;
++            }
++        }
++    }
++}
++
++// P411's Y, U, V are seperated. But the NV21's U and V are interleaved.
++void NV21ToP411(int width, int height, int stride, void *src, void *dst)
++{
++    NV21ToP411Separate(width, height, stride,
++                       src, (void *)((unsigned char *)src + width * height), dst);
++}
++
++// IMC3 Y, U, V are separated,the stride for U/V is the same as Y.
++// about IMC3 detail, please refer to http://www.fourcc.org/yuv.php
++// But the NV12's U and V are interleaved.
++void NV12ToIMC3(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
++{
++    int i, j, p, q;
++    unsigned char *pdstU, *pdstV;
++    unsigned char *psrcUV;
++
++    // copy Y data even with stride
++    MEMCPY_S(dst, stride * height, srcY, stride * height);
++    // copy U data and V data
++    psrcUV = (unsigned char *)srcUV;
++    pdstU = (unsigned char *)dst + stride * height;
++    pdstV = pdstU + stride * height / 2;
++    p = q = 0;
++    for (i = 0; i < height / 2; i++) {
++        for (j = 0; j < width; j++) {
++            if (j % 2 == 0) {
++                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
++                p++;
++           } else {
++                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
++                q++;
++            }
++        }
++        p += stride - width/2;
++        q += stride - width/2;
++    }
++}
++
++// IMC1 Y, V,U are separated,the stride for U/V is the same as Y.
++// IMC's V is before U
++// But the NV12's U and V are interleaved.
++void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
++{
++    int i, j, p, q;
++    unsigned char *pdstU, *pdstV;
++    unsigned char *psrcUV;
++
++    // copy Y data even with stride
++    MEMCPY_S(dst, stride * height, srcY, stride * height);
++    // copy U data and V data
++    psrcUV = (unsigned char *)srcUV;
++    pdstV = (unsigned char *)dst + stride * height;
++    pdstU = pdstV + stride * height / 2;
++    p = q = 0;
++    for (i = 0; i < height / 2; i++) {
++        for (j = 0; j < width; j++) {
++            if (j % 2 == 0) {
++                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
++                p++;
++           } else {
++                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
++                q++;
++            }
++        }
++        p += stride - width/2;
++        q += stride - width/2;
++    }
++}
++
++// Re-pad YUV420 format image, the format can be YV12, YU12 or YUV420 planar.
++// If buffer size: (height*dstStride*1.5) > (height*srcStride*1.5), src and dst
++// buffer start addresses are same, the re-padding can be done inplace.
++void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst)
++{
++    unsigned char *dptr;
++    unsigned char *sptr;
++    void * (*myCopy)(void *dst, const void *src, size_t n);
++
++    const int whalf = width >> 1;
++    const int hhalf = height >> 1;
++    const int scStride = srcStride >> 1;
++    const int dcStride = dstStride >> 1;
++    const int sySize = height * srcStride;
++    const int dySize = height * dstStride;
++    const int scSize = hhalf * scStride;
++    const int dcSize = hhalf * dcStride;
++
++    // directly copy, if (srcStride == dstStride)
++    if (srcStride == dstStride) {
++        MEMCPY_S(dst, dySize + 2*dcSize, src, dySize + 2*dcSize);
++        return;
++    }
++
++    // copy V(YV12 case) or U(YU12 case) plane line by line
++    sptr = (unsigned char *)src + sySize + 2*scSize - scStride;
++    dptr = (unsigned char *)dst + dySize + 2*dcSize - dcStride;
++
++    // try to avoid overlapped memcpy()
++    myCopy = (abs(sptr -dptr) > dstStride) ? memcpy : memmove;
++
++    for (int i = 0; i < hhalf; i ++) {
++        myCopy(dptr, sptr, whalf);
++        sptr -= scStride;
++        dptr -= dcStride;
++    }
++
++    // copy  V(YV12 case) or U(YU12 case) U/V plane line by line
++    sptr = (unsigned char *)src + sySize + scSize - scStride;
++    dptr = (unsigned char *)dst + dySize + dcSize - dcStride;
++    for (int i = 0; i < hhalf; i ++) {
++        myCopy(dptr, sptr, whalf);
++        sptr -= scStride;
++        dptr -= dcStride;
++    }
++
++    // copy Y plane line by line
++    sptr = (unsigned char *)src + sySize - srcStride;
++    dptr = (unsigned char *)dst + dySize - dstStride;
++    for (int i = 0; i < height; i ++) {
++        myCopy(dptr, sptr, width);
++        sptr -= srcStride;
++        dptr -= dstStride;
++    }
++}
++
++// covert YUYV(YUY2, YUV422 format) to YV12 (Y plane, V plane, U plane)
++void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
++{
++    int ySize = width * height;
++    int cSize = ALIGN_16(dstStride/2) * height / 2;
++    int wHalf = width >> 1;
++
++    unsigned char *srcPtr = (unsigned char *) src;
++    unsigned char *dstPtr = (unsigned char *) dst;
++    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
++    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
++
++    for (int i = 0; i < height; i++) {
++        //The first line of the source
++        //Copy first Y Plane first
++        for (int j=0; j < width; j++) {
++            dstPtr[j] = srcPtr[j*2];
++        }
++
++        if (i & 1) {
++            //Copy the V plane
++            for (int k = 0; k< wHalf; k++) {
++                dstPtrV[k] = srcPtr[k * 4 + 3];
++            }
++            dstPtrV = dstPtrV + ALIGN_16(dstStride>>1);
++        } else {
++            //Copy the U plane
++            for (int k = 0; k< wHalf; k++) {
++                dstPtrU[k] = srcPtr[k * 4 + 1];
++            }
++            dstPtrU = dstPtrU + ALIGN_16(dstStride>>1);
++        }
++
++        srcPtr = srcPtr + srcStride * 2;
++        dstPtr = dstPtr + width;
++    }
++}
++
++// covert YUYV(YUY2, YUV422 format) to NV21 (Y plane, interlaced VU bytes)
++void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst)
++{
++    int ySize = width * height;
++    int u_counter=1, v_counter=0;
++
++    unsigned char *srcPtr = (unsigned char *) src;
++    unsigned char *dstPtr = (unsigned char *) dst;
++    unsigned char *dstPtrUV = (unsigned char *) dst + ySize;
++
++    for (int i=0; i < height; i++) {
++        //The first line of the source
++        //Copy first Y Plane first
++        for (int j=0; j < width * 2; j++) {
++            if (j % 2 == 0)
++                dstPtr[j/2] = srcPtr[j];
++            if (i%2) {
++                if (( j % 4 ) == 3) {
++                    dstPtrUV[v_counter] = srcPtr[j]; //V plane
++                    v_counter += 2;
++                }
++                if (( j % 4 ) == 1) {
++                    dstPtrUV[u_counter] = srcPtr[j]; //U plane
++                    u_counter += 2;
++                }
++            }
++        }
++
++        srcPtr = srcPtr + srcStride * 2;
++        dstPtr = dstPtr + width;
++    }
++}
++
++void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst)
++{
++    int y_counter = 0, u_counter = 1, v_counter = 3, uv_counter = 0;
++    unsigned char *srcYPtr = (unsigned char *) src;
++    unsigned char *srcUVPtr = (unsigned char *)src + srcWidth * srcHeight;
++    unsigned char *dstPtr = (unsigned char *) dst;
++
++    for (int i = 0; i < srcHeight; i++) {
++        for (int k = 0; k < srcWidth; k++) {
++                dstPtr[y_counter] = srcYPtr[k];
++                y_counter += 2;
++                dstPtr[u_counter] = srcUVPtr[uv_counter];
++                u_counter += 4;
++                dstPtr[v_counter] = srcUVPtr[uv_counter + 1];
++                v_counter += 4;
++                uv_counter += 2;
++        }
++        if ((i % 2) == 0) {
++            srcUVPtr = srcUVPtr + srcStride;
++        }
++
++        dstPtr = dstPtr + 2 * dstStride;
++        srcYPtr = srcYPtr + srcStride;
++        u_counter = 1;
++        v_counter = 3;
++        y_counter = 0;
++        uv_counter = 0;
++    }
++}
++
++void convertBuftoYV12(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst, bool align16)
++{
++    switch (format) {
++    case V4L2_PIX_FMT_NV12:
++        align16 ? align16ConvertNV12ToYV12(width, height, srcStride, src, dst)
++            : convertNV12ToYV12(width, height, srcStride, src, dst);
++        break;
++    case V4L2_PIX_FMT_YVU420:
++        copyYV12ToYV12(width, height, srcStride, dstStride, src, dst);
++        break;
++    case V4L2_PIX_FMT_YUYV:
++        convertYUYVToYV12(width, height, srcStride, dstStride, src, dst);
++        break;
++    default:
++        ALOGE("%s: unsupported format %d", __func__, format);
++        break;
++    }
++}
++
++void convertBuftoNV21(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst)
++{
++    switch (format) {
++    case V4L2_PIX_FMT_NV12:
++        trimConvertNV12ToNV21(width, height, srcStride, src, dst);
++        break;
++    case V4L2_PIX_FMT_YVU420:
++        convertYV12ToNV21(width, height, srcStride, dstStride, src, dst);
++        break;
++    case V4L2_PIX_FMT_YUYV:
++        convertYUYVToNV21(width, height, srcStride, src, dst);
++        break;
++    default:
++        ALOGE("%s: unsupported format %d", __func__, format);
++        break;
++    }
++}
++
++void convertBuftoYUYV(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst)
++{
++    switch (format) {
++    case V4L2_PIX_FMT_NV12:
++        convertNV12ToYUYV(width, height, srcStride, dstStride, src, dst);
++        break;
++    default:
++        LOGE("%s: unsupported format %d", __func__, format);
++        break;
++    }
++}
++} // namespace ImageConverter
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.h b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
+new file mode 100644
+index 000000000000..f55479a57b63
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
+@@ -0,0 +1,59 @@
++/*
++ * Copyright (C) 2016-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++namespace icamera {
++namespace ImageConverter {
++
++void YUV420ToRGB565(int width, int height, void *src, void *dst);
++
++void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst);
++
++void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst);
++void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
++
++void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst);
++
++void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
++void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
++
++void NV12ToP411(int width, int height, int stride, void *src, void *dst);
++void NV21ToP411(int width, int height, int stride, void *src, void *dst);
++void NV12ToP411Separate(int width, int height, int stride,
++                                    void *srcY, void *srcUV, void *dst);
++void NV21ToP411Separate(int width, int height, int stride,
++                                    void *srcY, void *srcUV, void *dst);
++
++void YUY2ToP411(int width, int height, int stride, void *src, void *dst);
++void NV12ToIMC3(int width, int height, int stride,void *srcY, void *srcUV, void *dst);
++void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst);
++void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
++
++void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst);
++void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst);
++
++void convertBuftoYV12(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst, bool align16 = true);
++void convertBuftoNV21(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst);
++void convertBuftoYUYV(int format, int width, int height, int srcStride,
++                      int dstStride, void *src, void *dst);
++
++void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst);
++
++} // namespace ImageConverter
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.cpp b/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.cpp
+new file mode 100644
+index 000000000000..1ea6f7104266
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.cpp
+@@ -0,0 +1,959 @@
++/*
++ * Copyright (C) 2012-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ImageScalerCore"
++
++#include <memory>
++#include <linux/videodev2.h>
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "ImageScalerCore.h"
++
++#define RESOLUTION_VGA_WIDTH    640
++#define RESOLUTION_VGA_HEIGHT   480
++#define RESOLUTION_QVGA_WIDTH   320
++#define RESOLUTION_QVGA_HEIGHT  240
++#define RESOLUTION_QCIF_WIDTH   176
++#define RESOLUTION_QCIF_HEIGHT  144
++#define MIN(a,b) ((a)<(b)?(a):(b))
++
++namespace icamera {
++
++void ImageScalerCore::downScaleImage(void *src, void *dest,
++    int dest_w, int dest_h, int dest_stride,
++    int src_w, int src_h, int src_stride,
++    int format, int src_skip_lines_top, // number of lines that are skipped from src image start pointer
++    int src_skip_lines_bottom) // number of lines that are skipped after reading src_h (should be set always to reach full image height)
++{
++    unsigned char *m_dest = (unsigned char *)dest;
++    const unsigned char * m_src = (const unsigned char *)src;
++    switch (format) {
++        case V4L2_PIX_FMT_NV21:
++        case V4L2_PIX_FMT_NV12: {
++            if ((dest_w == src_w && dest_h <= src_h) || (dest_w <= src_w && dest_h == src_h)) {
++                // trim only if only src_h is larger than dest_h or src_w is larger than dest_w
++                ImageScalerCore::trimNv12Image(m_dest, m_src,
++                                               dest_w, dest_h, dest_stride,
++                                               src_w, src_h, src_stride,
++                                               src_skip_lines_top, src_skip_lines_bottom);
++            } else {
++                // downscale & crop
++                ImageScalerCore::downScaleAndCropNv12Image(m_dest, m_src,
++                                                           dest_w, dest_h, dest_stride,
++                                                           src_w, src_h, src_stride,
++                                                           src_skip_lines_top, src_skip_lines_bottom);
++            }
++            break;
++        }
++        case V4L2_PIX_FMT_YUYV: {
++            ImageScalerCore::downScaleYUY2Image(m_dest, m_src,
++                                                dest_w, dest_h, dest_stride,
++                                                src_w, src_h, src_stride);
++            break;
++        }
++        default: {
++            LOGE("no downscale support for format = %d", format);
++            break;
++        }
++    }
++}
++
++void ImageScalerCore::downScaleYUY2Image(unsigned char *dest, const unsigned char *src,
++                                         const int dest_w, const int dest_h, const int dest_stride,
++                                         const int src_w, const int src_h, const int src_stride)
++{
++    if (dest==NULL || dest_w <=0 || dest_h <=0 || src==NULL || src_w <=0 || src_h <= 0 )
++        return;
++
++    if (dest_w%2 != 0) // if the dest_w is not an even number, exit
++        return;
++
++    const int scale_w = (src_w<<8) / dest_w; // scale factors
++    const int scale_h = (src_h<<8) / dest_h;
++    int macro_pixel_width = dest_w >> 1;
++    unsigned int val_1, val_2; // for bi-linear-interpolation
++    int i,j,k;
++
++    for(i=0; i < dest_h; ++i) {
++        int src_i = i * scale_h;
++        int dy = src_i & 0xff;
++        src_i >>= 8;
++        for(j=0; j < macro_pixel_width; ++j) {
++            int src_j = j * scale_w;
++            int dx = src_j & 0xff;
++            src_j = src_j >> 8;
++            for(k = 0; k < 4; ++k) {
++                // bi-linear-interpolation
++                if(dx == 0 && dy == 0) {
++                    dest[i * 2 * dest_stride + 4 * j + k] = src[src_i * 2 * src_stride + src_j * 4 + k];
++                } else if(dx == 0 && dy != 0){
++                    val_1 = (unsigned int)src[src_i * 2 * src_stride + src_j * 4 + k];
++                    val_2 = (unsigned int)src[(src_i + 1) * 2 * src_stride + src_j * 4 + k];
++                    val_1 = (val_1 * (256 - dy) + val_2 * dy) >> 8;
++                    dest[i * 2 * dest_stride + 4 * j + k] = ((val_1 <= 255) ? val_1: 255);
++                } else if(dx != 0 && dy == 0) {
++                    val_1 = ((unsigned int)src[src_i * 2 * src_stride + src_j * 4 + k] * (256 - dx)
++                        + (unsigned int)src[src_i * 2 * src_stride + (src_j +1) * 4 + k] * dx) >> 8;
++                    dest[i * 2 * dest_stride + 4 * j + k] = ((val_1 <= 255) ? val_1: 255);
++                } else {
++                    val_1 = ((unsigned int)src[src_i * 2 * src_stride + src_j * 4 + k] * (256 - dx)
++                        + (unsigned int)src[src_i * 2 * src_stride + (src_j +1) * 4 + k] * dx) >> 8;
++                    val_2 = ((unsigned int)src[(src_i + 1) * 2 * src_stride + src_j * 4 + k] * (256 - dx)
++                        + (unsigned int)src[(src_i + 1) * 2 * src_stride + (src_j+1) * 4 + k] * dx) >> 8;
++                    val_1 = (val_1 * (256 - dy) + val_2 * dy) >> 8;
++                    dest[i * 2 * dest_stride + 4 * j + k] = ((val_1 <= 255) ? val_1: 255);
++                }
++            }
++        }
++    }
++}
++
++void ImageScalerCore::trimNv12Image(unsigned char *dest, const unsigned char *src,
++                                    const int dest_w, const int dest_h, const int dest_stride,
++                                    const int src_w, const int src_h, const int src_stride,
++                                    const int src_skip_lines_top, // number of lines that are skipped from src image start pointer
++                                    const int src_skip_lines_bottom) // number of lines that are skipped after reading src_h (should be set always to reach full image height)
++{
++    LOG1("@%s: dest_w: %d, dest_h: %d, dest_stride:%d, src_w: %d, src_h: %d, src_stride: %d, skip_top: %d, skip_bottom: %d",
++         __func__, dest_w,dest_h,dest_stride,src_w,src_h,src_stride,src_skip_lines_top,src_skip_lines_bottom);
++
++    const unsigned char *y = src;
++    const unsigned char *uv = src + src_h * src_stride;
++    if (dest_w < src_w) {
++        /*
++         *                     src_w
++         *  y    ---------------------------------
++         *       -    -        dest_w       -    -
++         *       -    -                     -    -
++         *       -    -                     -    -
++         * src_h -    - dest_h              -    -
++         *       -    -                     -    -
++         *       -    -                     -    -
++         *       -    -                     -    -
++         *       ---------------------------------
++         *
++         *                     src_w
++         *  uv   ---------------------------------
++         *       -    -        dest_w       -    -
++         * src_h -    - dest_h              -    -
++         *       -    -                     -    -
++         *       ---------------------------------
++         */
++        y += (src_w - dest_w) / 2;
++        uv += (src_w - dest_w) / 2;
++    } else if (dest_h < src_h) {
++        /*
++         *                     src_w
++         *  y    ---------------------------------
++         *       -             dest_w            -
++         *       ---------------------------------
++         *       -                               -
++         * src_h - dest_h                        -
++         *       -                               -
++         *       ---------------------------------
++         *       -                               -
++         *       ---------------------------------
++         *
++         *                     src_w
++         *  uv   ---------------------------------
++         *       ---------------------------------
++         * src_h - dest_h      dest_w            -
++         *       ---------------------------------
++         *       ---------------------------------
++         */
++        y += (src_h - dest_h) * src_stride / 2;
++        uv += (src_h - dest_h) * src_stride / 4;
++    }
++
++    // Y
++    for (int i = 0; i < dest_h; i++) {
++        MEMCPY_S(dest, src_stride, y, dest_stride);
++        dest += dest_stride;
++        y += src_stride;
++    }
++
++    // UV
++    for (int i = 0; i < dest_h / 2; i++) {
++        MEMCPY_S(dest, src_stride, uv, dest_stride);
++        dest += dest_stride;
++        uv += src_stride;
++    }
++}
++
++// VGA-QCIF begin (Enzo specific)
++void ImageScalerCore::downScaleAndCropNv12Image(unsigned char *dest, const unsigned char *src,
++                                                const int dest_w, const int dest_h, const int dest_stride,
++                                                const int src_w, const int src_h, const int src_stride,
++                                                const int src_skip_lines_top, // number of lines that are skipped from src image start pointer
++                                                const int src_skip_lines_bottom) // number of lines that are skipped after reading src_h (should be set always to reach full image height)
++{
++    LOG1("@%s: dest_w: %d, dest_h: %d, dest_stride: %d, src_w: %d, src_h: %d, src_stride: %d, skip_top: %d, skip_bottom: %d, dest: %p, src: %p",
++         __func__, dest_w, dest_h, dest_stride, src_w, src_h, src_stride, src_skip_lines_top, src_skip_lines_bottom, dest, src);
++
++    if (src_w == 800 && src_h == 600 && src_skip_lines_top == 0 && src_skip_lines_bottom == 0
++        && dest_w == RESOLUTION_QVGA_WIDTH && dest_h == RESOLUTION_QVGA_HEIGHT) {
++        downScaleNv12ImageFrom800x600ToQvga(dest, src, dest_stride, src_stride);
++        return;
++    }
++    if (src_w == RESOLUTION_VGA_WIDTH && src_h == RESOLUTION_VGA_HEIGHT
++        && src_skip_lines_top == 0 && src_skip_lines_bottom == 0
++        && dest_w == RESOLUTION_QVGA_WIDTH && dest_h == RESOLUTION_QVGA_HEIGHT) {
++        downScaleAndCropNv12ImageQvga(dest, src, dest_stride, src_stride);
++        return;
++    }
++    if (src_w == RESOLUTION_VGA_WIDTH && src_h == RESOLUTION_VGA_HEIGHT
++        && src_skip_lines_top == 0 && src_skip_lines_bottom == 0
++        && dest_w == RESOLUTION_QCIF_WIDTH && dest_h == RESOLUTION_QCIF_WIDTH) {
++        downScaleAndCropNv12ImageQcif(dest, src, dest_stride, src_stride);
++        return;
++    }
++
++    // skip lines from top
++    if (src_skip_lines_top > 0)
++        src += src_skip_lines_top * src_stride;
++
++    // Correct aspect ratio is defined by destination buffer
++    long int aspect_ratio = (dest_w << 16) / dest_h;
++    // Then, we calculate what should be the width of source image
++    // (should be multiple by four)
++    int proper_source_width = (aspect_ratio * (long int)(src_h) + 0x8000L) >> 16;
++    proper_source_width = (proper_source_width + 2) & ~0x3;
++    // Now, the source image should have some surplus width
++    if (src_w < proper_source_width) {
++        LOGE("%s: source image too narrow", __func__);
++    }
++    // Let's divide the surplus to both sides
++    int l_skip = src_w < proper_source_width ? 0 : ((src_w - proper_source_width) >> 1);
++    int r_skip = src_w < proper_source_width ? 0 : (src_w - proper_source_width - l_skip);
++    int skip = l_skip + r_skip;
++
++    int i, j, x1, y1, x2, y2;
++    unsigned int val_1, val_2;
++    int dx, dy;
++    int src_Y_data = src_stride * (src_h + src_skip_lines_bottom + (src_skip_lines_top >> 1));
++    int dest_Y_data = dest_stride * dest_h;
++    int width, height;
++    if (0 == dest_w || 0 == dest_h) {
++        LOGE("%s,dest_w or dest_h should not be 0", __func__);
++        return;
++    }
++    const int scaling_w = ((src_w - skip) << 8) / dest_w;
++    const int scaling_h = (src_h << 8) / dest_h;
++    dx = 0;
++    dy = 0;
++    // get Y data
++    for (i = 0; i < dest_h; i++) {
++        y1 = i * scaling_h;
++        dy = y1 & 0xff;
++        y2 = y1 >> 8;
++        for (j = 0; j < dest_w; j++) {
++            x1 = j * scaling_w;
++            dx = x1 & 0xff;
++            x2 = (x1 >> 8) + l_skip;
++            val_1 = ((unsigned int)src[y2 * src_stride + x2] * (256 - dx)
++                    + (unsigned int)src[y2 * src_stride + x2 + 1] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_stride + x2] * (256 - dx)
++                    + (unsigned int)src[(y2 + 1) * src_stride + x2 + 1] * dx) >> 8;
++            dest[i * dest_stride + j] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++        }
++    }
++    i = 0;
++    j = 0;
++    width = dest_w >> 1;
++    height = dest_h >> 1;
++    //get UV data
++    for (i = 0; i < height; i++) {
++        y1 = i * scaling_h;
++        dy = y1 & 0xff;
++        y2 = y1 >> 8;
++        for (j = 0; j < width; j++) {
++            x1 = j * scaling_w;
++            dx = x1 & 0xff;
++            x2 = (x1 >> 8) + l_skip / 2;
++            //fill U data
++            val_1 = ((unsigned int)src[y2 * src_stride + (x2 << 1) + src_Y_data] * (256 - dx)
++                     + (unsigned int)src[y2 * src_stride + ((x2 + 1) << 1) + src_Y_data] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_stride + (x2 << 1) + src_Y_data] * (256 -dx)
++                     + (unsigned int)src[(y2 +1) * src_stride + ((x2 + 1) << 1) + src_Y_data] * dx) >> 8;
++            dest[i * dest_stride + (j << 1) + dest_Y_data] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++            //fill V data
++            val_1 = ((unsigned int)src[y2 * src_stride + (x2 << 1) + 1 + src_Y_data] * (256 - dx)
++                     + (unsigned int)src[y2 * src_stride + ((x2 + 1) << 1) + 1 + src_Y_data] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_stride + (x2 << 1) + 1 + src_Y_data] * (256 -dx)
++                     + (unsigned int)src[(y2 +1) * src_stride + ((x2 + 1) << 1) + 1 + src_Y_data] * dx) >> 8;
++            dest[i * dest_stride + (j << 1) + 1 + dest_Y_data] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++        }
++    }
++}
++
++void ImageScalerCore::downScaleAndCropNv12ImageQvga(unsigned char *dest, const unsigned char *src,
++                                                    const int dest_stride, const int src_stride)
++{
++    LOG1("@%s", __func__);
++    const int dest_w = RESOLUTION_QVGA_WIDTH;
++    const int dest_h = RESOLUTION_QVGA_HEIGHT;
++    const int src_h = RESOLUTION_VGA_HEIGHT;
++    const int scale = 2;
++
++    // Y component
++    for (int i = 0; i < dest_h; i++) {
++        u_int32_t *s1 = (u_int32_t *)(&src[(i * scale + 0) * src_stride]);
++        u_int32_t *s2 = (u_int32_t *)(&src[(i * scale + 1) * src_stride]);
++        u_int32_t  *d = (u_int32_t *)(&dest[i * dest_stride]);
++        // This processes 4 dest pixels at a time
++        for (int j = 0; j < dest_w; j+=4) {
++            u_int32_t a1; // Input data upper row
++            u_int32_t a2; // Input data lower row
++            u_int32_t b;  // Output data
++            a1 = *s1++;
++            a2 = *s2++;
++            b  = ((a1 & 0xff) + ((a1 >> 8) & 0xff) + (a2 & 0xff) + ((a2 >> 8) & 0xff) + 2) / 4;
++            b |= ((((a1 >> 16) & 0xff) + ((a1 >> 24) & 0xff) + ((a2 >> 16) & 0xff) + ((a2 >> 24) & 0xff) + 2) / 4) << 8;
++            a1 = *s1++;
++            a2 = *s2++;
++            b |= (((a1 & 0xff) + ((a1 >> 8) & 0xff) + (a2 & 0xff) + ((a2 >> 8) & 0xff) + 2) / 4) << 16;
++            b |= ((((a1 >> 16) & 0xff) + ((a1 >> 24) & 0xff) + ((a2 >> 16) & 0xff) + ((a2 >> 24) & 0xff) + 2) / 4) << 24;
++            *d++ = b;
++        }
++    }
++
++    // UV components
++    src = &src[src_stride * src_h];
++    dest = &dest[dest_stride * dest_h];
++
++    for (int i = 0; i < dest_h/2; i++) {
++        u_int32_t *s1 = (u_int32_t *)(&src[(i * scale + 0) * src_stride]);
++        u_int32_t *s2 = (u_int32_t *)(&src[(i * scale + 1) * src_stride]);
++        u_int32_t  *d = (u_int32_t *)(&dest[i * dest_stride]);
++        // This processes 2 dest UV pairs at a time
++        for (int j = 0; j < dest_w/2; j+=2) {
++            u_int32_t a1; // Input data upper row
++            u_int32_t a2; // Input data lower row
++            u_int32_t b;  // Output data
++            a1 = *s1++;
++            a2 = *s2++;
++            b  = ((a1 & 0xff) + ((a1 >> 16) & 0xff) + (a2 & 0xff) + ((a2 >> 16) & 0xff) + 2) / 4;
++            b |= ((((a1 >> 8) & 0xff) + ((a1 >> 24) & 0xff) + ((a2 >> 8) & 0xff) + ((a2 >> 24) & 0xff) + 2) / 4) << 8;
++            a1 = *s1++;
++            a2 = *s2++;
++            b |= (((a1 & 0xff) + ((a1 >> 16) & 0xff) + (a2 & 0xff) + ((a2 >> 16) & 0xff) + 2) / 4) << 16;
++            b |= ((((a1 >> 8) & 0xff) + ((a1 >> 24) & 0xff) + ((a2 >> 8) & 0xff) + ((a2 >> 24) & 0xff) + 2) / 4) << 24;
++            *d++ = b;
++        }
++    }
++}
++
++void ImageScalerCore::downScaleAndCropNv12ImageQcif(unsigned char *dest, const unsigned char *src,
++                                                    const int dest_stride, const int src_stride)
++{
++    LOG1("@%s", __func__);
++    const int dest_w = RESOLUTION_QCIF_WIDTH;
++    const int dest_h = RESOLUTION_QCIF_HEIGHT;
++    const int src_w = RESOLUTION_VGA_WIDTH;
++    const int src_h = RESOLUTION_VGA_HEIGHT;
++
++    // Correct aspect ratio is defined by destination buffer
++    long int aspect_ratio = (dest_w << 16) / dest_h;
++    // Then, we calculate what should be the width of source image
++    // (should be multiple by four)
++    int proper_source_width = (aspect_ratio * (long int)(src_h) + 0x8000L) >> 16;
++    proper_source_width = (proper_source_width + 2) & ~0x3;
++    // Now, the source image should have some surplus width
++    if (src_w < proper_source_width) {
++        LOGE("%s: source image too narrow", __func__);
++        return;
++    }
++    // Let's divide the surplus to both sides
++    int l_skip = (src_w - proper_source_width) >> 1;
++    int r_skip = src_w - proper_source_width - l_skip;
++    int skip = l_skip + r_skip;
++
++    int i, j, x1, y1, x2, y2;
++    unsigned int val_1, val_2;
++    int dx, dy;
++    int src_Y_data = src_stride * src_h;
++    int dest_Y_data = dest_stride * dest_h;
++    int width, height;
++    const int scaling_w = ((src_w - skip) << 8) / dest_w;
++    const int scaling_h = (src_h << 8) / dest_h;
++    dx = 0;
++    dy = 0;
++    // get Y data
++    for (i = 0; i < dest_h; i++) {
++        y1 = i * scaling_h;
++        dy = y1 & 0xff;
++        y2 = y1 >> 8;
++        for (j = 0; j < dest_w; j++) {
++            x1 = j * scaling_w;
++            dx = x1 & 0xff;
++            x2 = (x1 >> 8) + l_skip;
++            val_1 = ((unsigned int)src[y2 * src_stride + x2] * (256 - dx)
++                    + (unsigned int)src[y2 * src_stride + x2 + 1] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_stride + x2] * (256 - dx)
++                    + (unsigned int)src[(y2 + 1) * src_stride + x2 + 1] * dx) >> 8;
++            dest[i * dest_stride + j] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++        }
++    }
++    i = 0;
++    j = 0;
++    width = dest_w >> 1;
++    height = dest_h >> 1;
++    //get UV data
++    for (i = 0; i < height; i++) {
++        y1 = i * scaling_h;
++        dy = y1 & 0xff;
++        y2 = y1 >> 8;
++        for (j = 0; j < width; j++) {
++            x1 = j * scaling_w;
++            dx = x1 & 0xff;
++            x2 = (x1 >> 8) + l_skip / 2;
++            //fill U data
++            val_1 = ((unsigned int)src[y2 * src_stride + (x2 << 1) + src_Y_data] * (256 - dx)
++                     + (unsigned int)src[y2 * src_stride + ((x2 + 1) << 1) + src_Y_data] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_stride + (x2 << 1) + src_Y_data] * (256 -dx)
++                     + (unsigned int)src[(y2 +1) * src_stride + ((x2 + 1) << 1) + src_Y_data] * dx) >> 8;
++            dest[i * dest_stride + (j << 1) + dest_Y_data] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++            //fill V data
++            val_1 = ((unsigned int)src[y2 * src_w + (x2 << 1) + 1 + src_Y_data] * (256 - dx)
++                     + (unsigned int)src[y2 * src_w + ((x2 + 1) << 1) + 1 + src_Y_data] * dx) >> 8;
++            val_2 = ((unsigned int)src[(y2 + 1) * src_w + (x2 << 1) + 1 + src_Y_data] * (256 -dx)
++                     + (unsigned int)src[(y2 +1) * src_w + ((x2 + 1) << 1) + 1 + src_Y_data] * dx) >> 8;
++            dest[i * dest_stride + (j << 1) + 1 + dest_Y_data] = MIN(((val_1 * (256 - dy) + val_2 * dy) >> 8), 0xff);
++        }
++    }
++}
++
++void ImageScalerCore::downScaleNv12ImageFrom800x600ToQvga(unsigned char *dest, const unsigned char *src,
++                                                          const int dest_stride, const int src_stride)
++{
++    LOG1("@%s", __func__);
++    const int dest_w = RESOLUTION_QVGA_WIDTH;
++    const int dest_h = RESOLUTION_QVGA_HEIGHT;
++    const int src_h = 600;
++
++    // Y component
++
++    // Processing 2 dest rows and 5 src rows at a time
++    for (int i = 0; i < dest_h / 2; i++) {
++        u_int32_t *s1 = (u_int32_t *)(&src[(i * 5 + 0) * src_stride]);
++        u_int32_t *s2 = (u_int32_t *)(&src[(i * 5 + 1) * src_stride]);
++        u_int32_t *s3 = (u_int32_t *)(&src[(i * 5 + 2) * src_stride]);
++        u_int32_t *d = (u_int32_t *)(&dest[(i * 2 + 0) * dest_stride]);
++        // This processes 8 dest pixels at a time
++        for (int j = 0; j < dest_w; j+=8) {
++            u_int32_t a1; // Input data upper row
++            u_int32_t a2; // Input data middle row
++            u_int32_t a3; // Input data lower row
++            u_int32_t t;  // Temp data (for constructing the output)
++            u_int32_t b;  // Output data
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b = t; // First pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 8; // Second pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 1 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 16; // Third pixel
++            t = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 24; // Fourth pixel
++            *d++ = b;
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b = t; // Fifth pixel
++            t = (2 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 8; // Sixth pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 16; // Seventh pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 24; // Eigth pixel
++            *d++ = b;
++        }
++        s1 = (u_int32_t *)(&src[(i * 5 + 4) * src_stride]);
++        s2 = (u_int32_t *)(&src[(i * 5 + 3) * src_stride]);
++        s3 = (u_int32_t *)(&src[(i * 5 + 2) * src_stride]);
++        d = (u_int32_t *)(&dest[(i * 2 + 1) * dest_stride]);
++        // This processes 8 dest pixels at a time
++        for (int j = 0; j < dest_w; j+=8) {
++            u_int32_t a1; // Input data lower row
++            u_int32_t a2; // Input data middle row
++            u_int32_t a3; // Input data upper row
++            u_int32_t t;  // Temp data (for constructing the output)
++            u_int32_t b;  // Output data
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b = t; // First pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 8; // Second pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 1 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 16; // Third pixel
++            t = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 24; // Fourth pixel
++            *d++ = b;
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b = t; // Fifth pixel
++            t = (2 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 8; // Sixth pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            t = (4 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 16) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 16) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 16) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ t;
++            t = (t + 12) / 25;
++            b |= t << 16; // Seventh pixel
++            t = (0 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 16) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 16) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 16) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            t = (t + 12) / 25;
++            b |= t << 24; // Eigth pixel
++            *d++ = b;
++        }
++    }
++
++    // UV components
++    src = &src[src_stride * src_h];
++    dest = &dest[dest_stride * dest_h];
++
++    // Processing 2 dest rows and 5 src rows at a time
++    for (int i = 0; i < (dest_h/2) / 2; i++) {
++        u_int32_t *s1 = (u_int32_t *)(&src[(i * 5 + 0) * src_stride]);
++        u_int32_t *s2 = (u_int32_t *)(&src[(i * 5 + 1) * src_stride]);
++        u_int32_t *s3 = (u_int32_t *)(&src[(i * 5 + 2) * src_stride]);
++        u_int16_t *d = (u_int16_t *)(&dest[(i * 2 + 0) * dest_stride]);
++        // This processes 4 dest UV pairs at a time
++        for (int j = 0; j < dest_w/2; j+=4) {
++            u_int32_t a1; // Input data upper row
++            u_int32_t a2; // Input data middle row
++            u_int32_t a3; // Input data lower row
++            u_int32_t u;  // Temp data (for constructing the output)
++            u_int32_t v;  // Temp data (for constructing the output)
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 16) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 16) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 16) & 0xff))+ u;
++            v = (2 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // First uv pair;
++            u = (2 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (2 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Second uv pair;
++            u = (0 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (0 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Third uv pair;
++            u = (0 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 16) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 16) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 16) & 0xff));
++            v = (0 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Fourth uv pair;
++        }
++        s1 = (u_int32_t *)(&src[(i * 5 + 4) * src_stride]);
++        s2 = (u_int32_t *)(&src[(i * 5 + 3) * src_stride]);
++        s3 = (u_int32_t *)(&src[(i * 5 + 2) * src_stride]);
++        d = (u_int16_t *)(&dest[(i * 2 + 1) * dest_stride]);
++        // This processes 4 dest UV pairs at a time
++        for (int j = 0; j < dest_w/2; j+=4) {
++            u_int32_t a1; // Input data lower row
++            u_int32_t a2; // Input data middle row
++            u_int32_t a3; // Input data upper row
++            u_int32_t u;  // Temp data (for constructing the output)
++            u_int32_t v;  // Temp data (for constructing the output)
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (2 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 16) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 16) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 16) & 0xff))+ u;
++            v = (2 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // First uv pair;
++            u = (2 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 2 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 1 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (2 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 2 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 1 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 0 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 0 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 0 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 0 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 0 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 0 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Second uv pair;
++            u = (0 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff));
++            v = (0 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Third uv pair;
++            u = (0 * ((a1 >> 0) & 0xff) + 2 * ((a1 >> 16) & 0xff) +
++                 0 * ((a2 >> 0) & 0xff) + 2 * ((a2 >> 16) & 0xff) +
++                 0 * ((a3 >> 0) & 0xff) + 1 * ((a3 >> 16) & 0xff));
++            v = (0 * ((a1 >> 8) & 0xff) + 2 * ((a1 >> 24) & 0xff) +
++                 0 * ((a2 >> 8) & 0xff) + 2 * ((a2 >> 24) & 0xff) +
++                 0 * ((a3 >> 8) & 0xff) + 1 * ((a3 >> 24) & 0xff));
++            a1 = *s1++;
++            a2 = *s2++;
++            a3 = *s3++;
++            u = (4 * ((a1 >> 0) & 0xff) + 4 * ((a1 >> 16) & 0xff) +
++                 4 * ((a2 >> 0) & 0xff) + 4 * ((a2 >> 16) & 0xff) +
++                 2 * ((a3 >> 0) & 0xff) + 2 * ((a3 >> 16) & 0xff))+ u;
++            v = (4 * ((a1 >> 8) & 0xff) + 4 * ((a1 >> 24) & 0xff) +
++                 4 * ((a2 >> 8) & 0xff) + 4 * ((a2 >> 24) & 0xff) +
++                 2 * ((a3 >> 8) & 0xff) + 2 * ((a3 >> 24) & 0xff))+ v;
++            u = (u + 12) / 25;
++            v = (v + 12) / 25;
++            *d++ = u | (v << 8); // Fourth uv pair;
++        }
++    }
++
++}
++// VGA-QCIF end
++
++int ImageScalerCore::cropCompose(
++    void *src, unsigned int srcW, unsigned int srcH, unsigned int srcStride, int srcFormat,
++    void *dst, unsigned int dstW, unsigned int dstH, unsigned int dstStride, int dstFormat,
++    unsigned int srcCropW, unsigned int srcCropH, unsigned int srcCropLeft, unsigned int srcCropTop,
++    unsigned int dstCropW, unsigned int dstCropH, unsigned int dstCropLeft, unsigned int dstCropTop)
++{
++    static const unsigned int MAXVAL = 65536;
++    static const int ALLOW_DOWNSCALING = 1;
++
++    // Check that we support the formats
++    if ((srcFormat != V4L2_PIX_FMT_NV12 &&
++         srcFormat != V4L2_PIX_FMT_NV21) ||
++        srcFormat != dstFormat) {
++        LOGE("Format conversion is not yet supported");
++        return UNKNOWN_ERROR;
++    }
++
++    if (srcW >= MAXVAL || srcH >= MAXVAL || srcCropLeft >= MAXVAL || srcCropH >= MAXVAL ||
++        dstW >= MAXVAL || dstH >= MAXVAL || dstCropLeft >= MAXVAL || dstCropH >= MAXVAL) {
++        LOGE("Values out of range");
++        return UNKNOWN_ERROR;
++    }
++
++    // Check that the windows are within limits
++    if (srcCropLeft + srcCropW > srcW || srcCropTop + srcCropH > srcH ||
++        dstCropLeft + dstCropW > dstW || dstCropTop + dstCropH > dstH) {
++        LOGE("Crop region is outside of the image");
++        return UNKNOWN_ERROR;
++    }
++
++    // Check that widths are even
++    if ((srcW & 1) || (dstW & 1)) {
++        LOGE("Image width must be even");
++        return UNKNOWN_ERROR;
++    }
++
++    if (srcStride == dstStride && srcCropW == srcW && srcW == dstW &&
++        srcCropH == srcH && srcH == dstH &&
++        dstCropW == dstW && dstCropH == dstH) {
++        // If no cropping/scaling is requested, just copy data
++        cropComposeCopy(src, dst, srcStride * srcH * 3 / 2);
++        return 0;
++    }
++
++    if (!ALLOW_DOWNSCALING &&
++        (dstCropH < srcCropH || dstCropW < srcCropW)) {
++        LOGE("Trying to downscale when it is disabled");
++        return UNKNOWN_ERROR;
++    }
++
++    if (srcStride == srcW && dstStride == dstW) {
++        // Upscaling both horizontally and vertically
++        cropComposeUpscaleNV12_bl(
++            src, srcH, srcStride, srcCropLeft, srcCropTop, srcCropW, srcCropH,
++            dst, dstH, dstStride, dstCropLeft, dstCropTop, dstCropW, dstCropH);
++        return 0;
++    }
++
++    LOGE("Unsupported scaling parameters");
++    return UNKNOWN_ERROR;
++}
++
++/**
++ * CropComposeZoom
++ *
++ * Crop and compose algorithm is need to perform digital zooming.
++ * Both source and destination images are in same format and resolution,
++ * the crop rectangle in the source image is scaled to fill whole image
++ * in the destination image.
++ */
++int ImageScalerCore::cropComposeZoom(void *src, void *dst,
++                                     unsigned int width, unsigned int height, unsigned int stride, int format,
++                                     unsigned int srcCropW, unsigned int srcCropH, unsigned int srcCropLeft, unsigned int srcCropTop)
++{
++    return cropCompose(src, width, height, stride, format,
++                       dst, width, height, stride, format,
++                       srcCropW, srcCropH, srcCropLeft, srcCropTop,
++                       width, height, 0, 0);
++}
++
++void ImageScalerCore::cropComposeCopy(void *src, void *dst, unsigned int size)
++{
++    MEMCPY_S((int8_t *) dst, size, (int8_t *) src, size);
++}
++
++// Bilinear scaling, chrominance with nearest neighbor
++void ImageScalerCore::cropComposeUpscaleNV12_bl(
++    void *src, unsigned int srcH, unsigned int srcStride,
++    unsigned int srcCropLeft, unsigned int srcCropTop,
++    unsigned int srcCropW, unsigned int srcCropH,
++    void *dst, unsigned int dstH, unsigned int dstStride,
++    unsigned int dstCropLeft, unsigned int dstCropTop,
++    unsigned int dstCropW, unsigned int dstCropH)
++{
++    static const int BILINEAR = 1;
++    static const unsigned int FP_1  = 1 << MFP;       // Fixed point 1.0
++    static const unsigned int FRACT = (1 << MFP) - 1; // Fractional part mask
++    unsigned int dx, dy, sx, sy;
++    unsigned char *s = (unsigned char *)src;
++    unsigned char *d = (unsigned char *)dst;
++    unsigned int sx0, sy0, dx0, dy0, dx1, dy1;
++
++    unsigned int sxd = ((srcCropW<<MFP) + (dstCropW>>1)) / dstCropW;
++    unsigned int syd = ((srcCropH<<MFP) + (dstCropH>>1)) / dstCropH;
++
++    if (!src || !dst) {
++        LOGE("buffer pointer is NULL");
++        return;
++    }
++
++    // Upscale luminance
++    sx0 = srcCropLeft << MFP;
++    sy0 = srcCropTop << MFP;
++    dx0 = dstCropLeft;
++    dy0 = dstCropTop;
++    dx1 = dstCropLeft + dstCropW;
++    dy1 = dstCropTop + dstCropH;
++    for (dy = dy0, sy = sy0; dy < dy1; dy++, sy += syd) {
++        for (dx = dx0, sx = sx0; dx < dx1; dx++, sx += sxd) {
++            unsigned int sxi = sx >> MFP;
++            unsigned int syi = sy >> MFP;
++            unsigned int s0 = s[srcStride*syi+sxi];
++            if (BILINEAR) {
++                unsigned int fx = sx & FRACT;             // Fractional part
++                unsigned int fy = sy & FRACT;
++                unsigned int fx1 = FP_1 - fx;               // 1 - fractional part
++                unsigned int fy1 = FP_1 - fy;
++                unsigned int s1 = s[srcStride*syi+sxi+1];
++                unsigned int s2 = s[srcStride*(syi+1)+sxi];
++                unsigned int s3 = s[srcStride*(syi+1)+sxi+1];
++                unsigned int s4 = (s0 * fx1 + s1 * fx) >> MFP;
++                unsigned int s5 = (s2 * fx1 + s3 * fx) >> MFP;
++                s0 = (s4 * fy1 + s5 * fy) >> MFP;
++            }
++            d[dstStride*dy+dx] = s0;
++        }
++    }
++
++    // Upscale chrominance
++    s = (unsigned char *)src + srcStride*srcH;
++    d = (unsigned char *)dst + dstStride*dstH;
++    sx0 = srcCropLeft << (MFP - 1);
++    sy0 = srcCropTop << (MFP - 1);
++    dx0 = dstCropLeft >> 1;
++    dy0 = dstCropTop >> 1;
++    dx1 = (dstCropLeft + dstCropW) >> 1;
++    dy1 = (dstCropTop + dstCropH) >> 1;
++    for (dy = dy0, sy = sy0; dy < dy1; dy++, sy += syd) {
++        for (dx = dx0, sx = sx0; dx < dx1; dx++, sx += sxd) {
++            unsigned int sxi = sx >> MFP;
++            unsigned int syi = sy >> MFP;
++            d[dstStride*dy+dx*2+0] = s[srcStride*syi+sxi*2+0];
++            d[dstStride*dy+dx*2+1] = s[srcStride*syi+sxi*2+1];
++        }
++    }
++}
++
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.h b/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.h
+new file mode 100644
+index 000000000000..eaeb536e4430
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/ImageScalerCore.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2012-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++namespace icamera {
++/**
++ * \class ImageScalerCore
++ *
++ */
++class ImageScalerCore {
++public:
++    static void downScaleImage(void *src, void *dest,
++                               int dest_w, int dest_h, int dest_stride,
++                               int src_w, int src_h, int src_stride,
++                               int format, int src_skip_lines_top = 0,
++                               int src_skip_lines_bottom = 0);
++    static int cropCompose(void *src, unsigned int srcW, unsigned int srcH, unsigned int srcStride, int srcFormat,
++                           void *dst, unsigned int dstW, unsigned int dstH, unsigned int dstStride, int dstFormat,
++                           unsigned int srcCropW, unsigned int srcCropH, unsigned int srcCropLeft, unsigned int srcCropTop,
++                           unsigned int dstCropW, unsigned int dstCropH, unsigned int dstCropLeft, unsigned int dstCropTop);
++    static int cropComposeZoom(void *src, void *dst,
++                               unsigned int width, unsigned int height, unsigned int stride, int format,
++                               unsigned int srcCropW, unsigned int srcCropH, unsigned int srcCropLeft, unsigned int srcCropTop);
++
++protected:
++    static void downScaleYUY2Image(unsigned char *dest, const unsigned char *src,
++                                   const int dest_w, const int dest_h, const int dest_stride,
++                                   const int src_w, const int src_h, const int src_stride);
++
++    static void downScaleAndCropNv12Image(unsigned char *dest, const unsigned char *src,
++                                          const int dest_w, const int dest_h, const int dest_stride,
++                                          const int src_w, const int src_h, const int src_stride,
++                                          const int src_skip_lines_top = 0,
++                                          const int src_skip_lines_bottom = 0);
++
++    static void trimNv12Image(unsigned char *dest, const unsigned char *src,
++                              const int dest_w, const int dest_h, const int dest_stride,
++                              const int src_w, const int src_h, const int src_stride,
++                              const int src_skip_lines_top = 0,
++                              const int src_skip_lines_bottom = 0);
++
++    static void downScaleAndCropNv12ImageQvga(unsigned char *dest, const unsigned char *src,
++                                              const int dest_stride, const int src_stride);
++
++    static void downScaleAndCropNv12ImageQcif(unsigned char *dest, const unsigned char *src,
++                                              const int dest_stride, const int src_stride);
++
++    static void downScaleNv12ImageFrom800x600ToQvga(unsigned char *dest, const unsigned char *src,
++                                                    const int dest_stride, const int src_stride);
++
++private:
++    static const int MFP = 16;            // Fractional bits for fixed point calculations
++
++private:
++    static void cropComposeCopy(void *src, void *dst, unsigned int size);
++    static void cropComposeUpscaleNV12_bl(
++        void *src, unsigned int srcH, unsigned int srcStride,
++        unsigned int srcCropLeft, unsigned int srcCropTop,
++        unsigned int srcCropW, unsigned int srcCropH,
++        void *dst, unsigned int dstH, unsigned int dstStride,
++        unsigned int dstCropLeft, unsigned int dstCropTop,
++        unsigned int dstCropW, unsigned int dstCropH);
++
++};
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
+new file mode 100644
+index 000000000000..3c3777bbdfe7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
+@@ -0,0 +1,318 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "PostProcessorBase"
++
++#include <vector>
++#include <hardware/camera3.h>
++#include "stdlib.h"
++#include "PostProcessorBase.h"
++#include "iutils/CameraLog.h"
++
++using std::shared_ptr;
++
++namespace icamera {
++
++PostProcessorBase::PostProcessorBase(std::string processName) :
++    mName(processName),
++    mProcessor(nullptr)
++{
++    LOG1("@%s PostProcessorBase created", __func__);
++}
++
++PostProcessorBase::~PostProcessorBase()
++{
++    LOG1("@%s PostProcessorBase destory", __func__);
++}
++
++ScaleProcess::ScaleProcess() :
++    PostProcessorBase("Scaler")
++{
++    LOG1("@%s create scaler processor", __func__);
++    mProcessor = IImageProcessor::createImageProcessor();
++}
++
++status_t ScaleProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                        shared_ptr<camera3::Camera3Buffer> &outBuf)
++{
++    LOG1("@%s processor name: %s", __func__, mName.c_str());
++    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
++    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
++
++    int ret = mProcessor->scaleFrame(inBuf, outBuf);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
++
++    return OK;
++}
++
++RotateProcess::RotateProcess(int angle) :
++    PostProcessorBase("Rotate"),
++    mAngle(angle)
++{
++    LOG1("@%s create rotate processor, degree: %d", __func__, mAngle);
++    mProcessor = IImageProcessor::createImageProcessor();
++};
++
++status_t RotateProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                         shared_ptr<camera3::Camera3Buffer> &outBuf)
++{
++    LOG1("@%s processor name: %s", __func__, mName.c_str());
++    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
++    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
++    std::vector<uint8_t> rotateBuf;
++
++    int ret = mProcessor->rotateFrame(inBuf, outBuf, mAngle, rotateBuf);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
++
++    return OK;
++}
++
++CropProcess::CropProcess() :
++    PostProcessorBase("Crop")
++{
++    LOG1("@%s create crop processor", __func__);
++    mProcessor = IImageProcessor::createImageProcessor();
++};
++
++status_t CropProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
++{
++    LOG1("@%s processor name: %s", __func__, mName.c_str());
++    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
++    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
++
++    int ret = mProcessor->cropFrame(inBuf, outBuf);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
++
++    return OK;
++}
++
++ConvertProcess::ConvertProcess() :
++    PostProcessorBase("Convert")
++{
++    LOG1("@%s create convert processor", __func__);
++    mProcessor = IImageProcessor::createImageProcessor();
++};
++
++status_t ConvertProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                          shared_ptr<camera3::Camera3Buffer> &outBuf)
++{
++    LOG1("@%s processor name: %s", __func__, mName.c_str());
++    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
++    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
++
++    int ret = mProcessor->convertFrame(inBuf, outBuf);
++    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
++
++    return OK;
++}
++
++JpegProcess::JpegProcess(int cameraId) :
++    PostProcessorBase("JpegEncode"),
++    mCameraId(cameraId),
++    mCropBuffer(nullptr),
++    mScaleBuffer(nullptr),
++    mThumbOutput(nullptr),
++    mExifData(nullptr)
++{
++    LOG1("@%s create jpeg encode processor", __func__);
++
++    mProcessor = IImageProcessor::createImageProcessor();
++    mJpegEncoder = IJpegEncoder::createJpegEncoder();
++    mJpegMaker = std::unique_ptr<JpegMaker>(new JpegMaker());
++};
++
++JpegProcess::~JpegProcess()
++{
++}
++
++void JpegProcess::attachJpegBlob(const EncodePackage &package)
++{
++    LOG2("@%s, encoded data size: %d, exif data size: %d",
++         __func__, package.encodedDataSize, package.exifDataSize);
++    uint8_t *resultPtr = static_cast<uint8_t*>(package.outputData) +
++                         package.outputSize - sizeof(struct camera3_jpeg_blob);
++
++    // save jpeg size at the end of file
++    auto *blob = reinterpret_cast<struct camera3_jpeg_blob*>(resultPtr);
++    blob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
++    blob->jpeg_size = package.encodedDataSize + package.exifDataSize;
++}
++
++std::shared_ptr<camera3::Camera3Buffer> JpegProcess::cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
++                                                                               const shared_ptr<camera3::Camera3Buffer> &inBuf)
++{
++    LOG1("@%s, input size: %dx%d, thumbnail info: %dx%d",
++         __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
++
++    if (thumbWidth <= 0 || thumbHeight <= 0) {
++        LOGW("@%s, skip, thumbWidth:%d, thumbHeight:%d", __func__, thumbWidth, thumbHeight);
++        return nullptr;
++    }
++
++    int ret = OK;
++    shared_ptr<camera3::Camera3Buffer> tempBuffer = inBuf;
++
++    // Do crop first if needed
++    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_CROP) &&
++        inBuf->width() * thumbHeight != inBuf->height() * thumbWidth) {
++        int width = 0, height = 0;
++        if (inBuf->width() * thumbHeight < inBuf->height() * thumbWidth) {
++            width = inBuf->width();
++            height = inBuf->width() * thumbHeight / thumbWidth;
++        } else {
++            width = inBuf->height() * thumbWidth / thumbHeight;
++            height = inBuf->height();
++        }
++
++        if (mCropBuffer && (mCropBuffer->width() != width || mCropBuffer->height() != height))
++            mCropBuffer.reset();
++        if (!mCropBuffer) {
++            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), width, height);
++            mCropBuffer = camera3::MemoryUtils::allocateHeapBuffer(width, height,
++                                                                   width, inBuf->v4l2Fmt(),
++                                                                   mCameraId, size);
++            CheckError(!mCropBuffer, nullptr, "%s, Failed to allocate the internal crop buffer", __func__);
++        }
++
++        LOG2("@%s, Crop the main buffer from %dx%d to %dx%d",
++             __func__, inBuf->width(), inBuf->height(), width, height);
++        ret = mProcessor->cropFrame(inBuf, mCropBuffer);
++        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
++        tempBuffer = mCropBuffer;
++    }
++
++    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_SCALING)) {
++        if (mScaleBuffer && (mScaleBuffer->width() != thumbWidth
++            || mScaleBuffer->height() != thumbHeight))
++            mScaleBuffer.reset();
++        if (!mScaleBuffer) {
++            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), thumbWidth, thumbHeight);
++            mScaleBuffer = camera3::MemoryUtils::allocateHeapBuffer(thumbWidth, thumbHeight,
++                                                                    thumbWidth, inBuf->v4l2Fmt(),
++                                                                    mCameraId, size);
++            CheckError(!mScaleBuffer, nullptr, "%s, Failed to allocate the internal scale buffer", __func__);
++        }
++
++        LOG2("@%s, Scale the buffer from %dx%d to %dx%d",
++              __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
++        ret = mProcessor->scaleFrame(tempBuffer, mScaleBuffer);
++        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
++        tempBuffer = mScaleBuffer;
++    }
++
++    if (tempBuffer->width() != thumbWidth || tempBuffer->height() != thumbHeight) {
++        LOGE("%s, Failed to crop & downscale the main buffer to thumbnail buffer", __func__);
++        return nullptr;
++    }
++
++    return tempBuffer;
++}
++
++void JpegProcess::fillEncodeInfo(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                 const shared_ptr<camera3::Camera3Buffer> &outBuf,
++                                 EncodePackage &package)
++{
++    package.inputWidth = inBuf->width();
++    package.inputHeight = inBuf->height();
++    package.inputStride = inBuf->stride();
++    package.inputFormat = inBuf->v4l2Fmt();
++    package.inputSize = inBuf->size();
++    package.inputBufferHandle = static_cast<void*>(inBuf->getBufferHandle());
++    package.inputData = inBuf->data();
++
++    package.outputWidth = outBuf->width();
++    package.outputHeight = outBuf->height();
++    package.outputSize = outBuf->size();
++    package.outputBufferHandle = static_cast<void*>(outBuf->getBufferHandle());
++    package.outputData = outBuf->data();
++}
++
++status_t JpegProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                       const icamera::Parameters &parameter,
++                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
++{
++    LOG1("@%s", __func__);
++    bool isEncoded = false;
++
++    icamera::ExifMetaData exifMetadata;
++    status_t status = mJpegMaker->setupExifWithMetaData(inBuf->width(), inBuf->height(), parameter, &exifMetadata);
++    CheckError(status != OK, UNKNOWN_ERROR, "@%s, Setup exif metadata failed.", __func__);
++    LOG2("@%s: setting exif metadata done!", __func__);
++
++    std::shared_ptr<camera3::Camera3Buffer> thumbInput =
++        cropAndDownscaleThumbnail(exifMetadata.mJpegSetting.thumbWidth,
++                                  exifMetadata.mJpegSetting.thumbHeight,
++                                  inBuf);
++
++    EncodePackage thumbnailPackage;
++    if (thumbInput) {
++        if (mThumbOutput == nullptr ||
++            mThumbOutput->width() != exifMetadata.mJpegSetting.thumbWidth ||
++            mThumbOutput->height() != exifMetadata.mJpegSetting.thumbHeight ||
++            mThumbOutput->v4l2Fmt() != outBuf->v4l2Fmt()) {
++            mThumbOutput = camera3::MemoryUtils::allocateHeapBuffer(
++                               exifMetadata.mJpegSetting.thumbWidth, exifMetadata.mJpegSetting.thumbHeight,
++                               exifMetadata.mJpegSetting.thumbWidth, outBuf->v4l2Fmt(),
++                               mCameraId,
++                               exifMetadata.mJpegSetting.thumbWidth * exifMetadata.mJpegSetting.thumbHeight * 3 / 2);
++            CheckError(!mThumbOutput, NO_MEMORY, "%s, Failed to allocate the mThumbOutput", __func__);
++        }
++
++        // encode thumbnail image
++        fillEncodeInfo(thumbInput, mThumbOutput, thumbnailPackage);
++        thumbnailPackage.quality = exifMetadata.mJpegSetting.jpegThumbnailQuality;
++        // the exifDataSize should be 0 for encoding thumbnail
++        thumbnailPackage.exifData = nullptr;
++        thumbnailPackage.exifDataSize = 0;
++
++        do {
++            isEncoded = mJpegEncoder->doJpegEncode(&thumbnailPackage);
++            thumbnailPackage.quality -= 5;
++        } while (thumbnailPackage.encodedDataSize > THUMBNAIL_SIZE_LIMITATION &&
++            thumbnailPackage.quality > 0);
++
++        if (!isEncoded || thumbnailPackage.quality < 0) {
++            LOGW("Failed to generate thumbnail, isEncoded: %d, encoded thumbnail size: %d, quality:%d",
++                 isEncoded, thumbnailPackage.encodedDataSize, thumbnailPackage.quality);
++        }
++    }
++
++    // save exif data
++    uint32_t exifBufSize = ENABLE_APP2_MARKER ? EXIF_SIZE_LIMITATION * 2 : EXIF_SIZE_LIMITATION;
++    if (mExifData == nullptr) {
++        mExifData = std::unique_ptr<unsigned char[]>(new unsigned char[exifBufSize]);
++    }
++    uint8_t* finalExifDataPtr = static_cast<uint8_t*>(mExifData.get());
++    uint32_t finalExifDataSize = 0;
++    status = mJpegMaker->getExif(thumbnailPackage, finalExifDataPtr, &finalExifDataSize);
++    CheckError(status != OK, status, "@%s, Failed to get Exif", __func__);
++    LOG2("%s, exifBufSize %d, finalExifDataSize %d", __func__, exifBufSize, finalExifDataSize);
++
++    // encode main image
++    EncodePackage finalEncodePackage;
++    fillEncodeInfo(inBuf, outBuf, finalEncodePackage);
++    finalEncodePackage.quality = exifMetadata.mJpegSetting.jpegQuality;
++    finalEncodePackage.exifData = finalExifDataPtr;
++    finalEncodePackage.exifDataSize = finalExifDataSize;
++    isEncoded = mJpegEncoder->doJpegEncode(&finalEncodePackage);
++    CheckError(!isEncoded, UNKNOWN_ERROR, "@%s, Failed to encode main image", __func__);
++    mJpegMaker->writeExifData(&finalEncodePackage);
++
++    attachJpegBlob(finalEncodePackage);
++
++    return OK;
++}
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
+new file mode 100644
+index 000000000000..2039e38a0080
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
+@@ -0,0 +1,118 @@
++/*
++ * Copyright (C) 2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "Parameters.h"
++#include "Camera3Buffer.h"
++#include "IImageProcessor.h"
++#include "EXIFMetaData.h"
++#include "IJpegEncoder.h"
++#include "JpegMaker.h"
++
++namespace icamera {
++
++class PostProcessorBase {
++public:
++    PostProcessorBase(std::string processName);
++    virtual ~PostProcessorBase();
++
++    std::string getName() { return mName; }
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      const Parameters &parameter,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
++private:
++    DISALLOW_COPY_AND_ASSIGN(PostProcessorBase);
++
++protected:
++    std::string mName;
++    std::unique_ptr<IImageProcessor> mProcessor;
++};
++
++class ScaleProcess : public PostProcessorBase {
++public:
++    ScaleProcess();
++    ~ScaleProcess() {};
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
++};
++
++class RotateProcess : public PostProcessorBase {
++public:
++    RotateProcess(int angle);
++    ~RotateProcess() {};
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
++private:
++    int mAngle;
++};
++
++class CropProcess : public PostProcessorBase {
++public:
++    CropProcess();
++    ~CropProcess() {};
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
++};
++
++class ConvertProcess : public PostProcessorBase {
++public:
++    ConvertProcess();
++    ~ConvertProcess() {};
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
++};
++
++class JpegProcess : public PostProcessorBase {
++public:
++    JpegProcess(int cameraId);
++    ~JpegProcess();
++
++    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                      const Parameters &parameter,
++                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
++private:
++    void attachJpegBlob(const EncodePackage &package);
++    std::shared_ptr<camera3::Camera3Buffer>
++    cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
++                              const std::shared_ptr<camera3::Camera3Buffer> &inBuf);
++    void fillEncodeInfo(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
++                        const std::shared_ptr<camera3::Camera3Buffer> &outBuf,
++                        EncodePackage &package);
++
++private:
++    int mCameraId;
++
++    std::shared_ptr<camera3::Camera3Buffer> mCropBuffer;
++    std::shared_ptr<camera3::Camera3Buffer> mScaleBuffer;
++    std::shared_ptr<camera3::Camera3Buffer> mThumbOutput;
++
++    std::unique_ptr<JpegMaker> mJpegMaker;
++    std::unique_ptr<IJpegEncoder> mJpegEncoder;
++    std::unique_ptr<unsigned char[]> mExifData;
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
+new file mode 100644
+index 000000000000..f25e37f634c9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
+@@ -0,0 +1,141 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PostProcessorCore"
++
++#include "iutils/CameraLog.h"
++#include "PostProcessorCore.h"
++
++using std::shared_ptr;
++
++namespace icamera {
++
++PostProcessorCore::PostProcessorCore(int cameraId) :
++    mCameraId(cameraId)
++{
++    LOG1("@%s, cameraId: %d", __func__, mCameraId);
++}
++
++PostProcessorCore::~PostProcessorCore()
++{
++    LOG1("@%s", __func__);
++}
++
++bool PostProcessorCore::isPostProcessTypeSupported(PostProcessType type)
++{
++    return IImageProcessor::isProcessingTypeSupported(type);
++}
++
++status_t PostProcessorCore::createProcessor()
++{
++    LOG2("@%s, cameraId: %d", __func__, mCameraId);
++
++    mProcessorVector.clear();
++    for (const auto &order : mProcessorsInfo) {
++        shared_ptr<PostProcessorBase> processor = nullptr;
++        switch (order.type) {
++        case POST_PROCESS_SCALING :
++            processor = std::make_shared<ScaleProcess>();
++            break;
++        case POST_PROCESS_ROTATE :
++            processor = std::make_shared<RotateProcess>(order.angle);
++            break;
++        case POST_PROCESS_CROP :
++            processor = std::make_shared<CropProcess>();
++            break;
++        case POST_PROCESS_CONVERT :
++            processor = std::make_shared<ConvertProcess>();
++            break;
++        case POST_PROCESS_JPEG_ENCODING :
++            processor = std::make_shared<JpegProcess>(mCameraId);
++            break;
++        case POST_PROCESS_NONE:
++            break;
++        default:
++            LOGE("%s, Doesn't support this kind of post-processor");
++            return UNKNOWN_ERROR;
++        }
++
++        CheckError(!processor, UNKNOWN_ERROR, "%s, Failed to create the post processor: 0x%x", __func__, order.type);
++        mProcessorVector.push_back(processor);
++    }
++
++    LOG2("%s, the number of post processor unit is %zu", __func__, mProcessorVector.size());
++    return OK;
++}
++
++status_t PostProcessorCore::allocateBuffers()
++{
++    LOG2("@%s,mProcessorVector.size: %zu cameraId: %d", __func__, mProcessorVector.size(), mCameraId);
++
++    mInterBuffers.clear();
++    for (size_t i = 0; i < mProcessorsInfo.size() - 1; i++) {
++        const stream_t &info = mProcessorsInfo[i].outputInfo;
++        shared_ptr<camera3::Camera3Buffer> buf = camera3::MemoryUtils::allocateHeapBuffer(info.width, info.height,
++                                                                                          info.stride, info.format,
++                                                                                          mCameraId, info.size);
++        CheckError(!buf, NO_MEMORY, "@%s: Failed to allocate internal buffer: processor: %s",
++              __func__, mProcessorVector[i]->getName().c_str());
++        mInterBuffers[mProcessorVector[i]] = buf;
++    }
++
++    return OK;
++}
++
++status_t PostProcessorCore::configure(const std::vector<PostProcessInfo> &processorOrder)
++{
++    if (processorOrder.empty())
++        return OK;
++
++    mProcessorsInfo = processorOrder;
++    int ret = createProcessor();
++    CheckError(ret != OK, ret, "%s, Failed to create the post processor", __func__);
++
++    ret = allocateBuffers();
++    CheckError(ret != OK, ret, "%s, Failed allocate the internal buffers", __func__);
++
++    return OK;
++}
++
++status_t PostProcessorCore::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
++                                             const Parameters &parameter,
++                                             shared_ptr<camera3::Camera3Buffer> outBuf)
++{
++    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
++    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
++
++    shared_ptr<camera3::Camera3Buffer> input = inBuf;
++    shared_ptr<camera3::Camera3Buffer> output = nullptr;
++    for (size_t i = 0; i < mProcessorVector.size(); i++) {
++        if (i == (mProcessorVector.size() - 1)) {
++            output = outBuf;
++        } else {
++            output = mInterBuffers[mProcessorVector[i]];
++        }
++
++        int ret = OK;
++        if (mProcessorsInfo[i].type == POST_PROCESS_JPEG_ENCODING)
++            ret = mProcessorVector[i]->doPostProcessing(input, parameter, output);
++        else
++            ret = mProcessorVector[i]->doPostProcessing(input, output);
++        CheckError(ret != OK, ret, "%s, Failed to do post processing: %s", __func__, mProcessorVector[i]->getName().c_str());
++
++        input = output;
++    }
++
++    return OK;
++}
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
+new file mode 100644
+index 000000000000..6871a1705750
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++#include <map>
++
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++#include "PostProcessorBase.h"
++#include "ProcessType.h"
++
++namespace icamera {
++
++struct PostProcessInfo {
++    stream_t inputInfo;
++    stream_t outputInfo;
++    PostProcessType type;
++    int angle;
++    PostProcessInfo() : type(POST_PROCESS_NONE),angle(0) { CLEAR(inputInfo); CLEAR(outputInfo); }
++};
++
++/**
++ * \class PostProcessorCore
++ *
++ * This class is used to encode JPEG and rotate image.
++ *
++ */
++class PostProcessorCore {
++
++public:
++    PostProcessorCore(int cameraId);
++    virtual ~PostProcessorCore();
++
++    bool isPostProcessTypeSupported(PostProcessType type);
++    status_t configure(const std::vector<PostProcessInfo> &processorOrder);
++    status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &mainBuf,
++                              const Parameters &parameter,
++                              std::shared_ptr<camera3::Camera3Buffer> outBuf);
++private:
++    status_t createProcessor();
++    status_t allocateBuffers();
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(PostProcessorCore);
++
++private:
++    int mCameraId;
++    std::map<std::shared_ptr<PostProcessorBase>, std::shared_ptr<camera3::Camera3Buffer>>
++            mInterBuffers;
++    std::vector<PostProcessInfo> mProcessorsInfo;
++    std::vector<std::shared_ptr<PostProcessorBase>> mProcessorVector;
++};
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/ProcessType.h b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
+new file mode 100644
+index 000000000000..d7354ddd1268
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++namespace icamera {
++
++enum PostProcessType {
++    POST_PROCESS_NONE = 0,
++    POST_PROCESS_ROTATE = 1 << 0,
++    POST_PROCESS_SCALING = 1 << 1,
++    POST_PROCESS_CROP = 1 << 2,
++    POST_PROCESS_CONVERT = 1 << 3,
++    POST_PROCESS_JPEG_ENCODING = 1 << 4
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
+new file mode 100644
+index 000000000000..c3156ddca111
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
+@@ -0,0 +1,234 @@
++/*
++ * Copyright (C) 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ImageProcessorCore"
++
++#include <libyuv.h>
++#include "iutils/CameraLog.h"
++#include "ImageProcessorCore.h"
++#include "ImageConverter.h"
++
++namespace icamera {
++
++ImageProcessorCore::ImageProcessorCore()
++{
++    LOG2("enter %s", __func__);
++    mRotationMode = {
++        {0, libyuv::RotationMode::kRotate0},
++        {90, libyuv::RotationMode::kRotate90},
++        {180, libyuv::RotationMode::kRotate180},
++        {270, libyuv::RotationMode::kRotate270}
++    };
++}
++
++ImageProcessorCore::~ImageProcessorCore()
++{
++    LOG2("enter %s", __func__);
++}
++
++std::unique_ptr<IImageProcessor> IImageProcessor::createImageProcessor()
++{
++    return std::unique_ptr<ImageProcessorCore>(new ImageProcessorCore());
++}
++
++//If support this kind of post process type in current OS
++bool IImageProcessor::isProcessingTypeSupported(PostProcessType type)
++{
++    int supportedType = POST_PROCESS_ROTATE |
++                        POST_PROCESS_SCALING |
++                        POST_PROCESS_CROP |
++                        POST_PROCESS_CONVERT |
++                        POST_PROCESS_JPEG_ENCODING;
++
++    return supportedType & type;
++}
++
++status_t ImageProcessorCore::cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                       std::shared_ptr<camera3::Camera3Buffer> &output)
++{
++    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
++         __func__, input->width(), input->height(), input->v4l2Fmt(),
++         output->width(), output->height(), output->v4l2Fmt());
++
++    int srcW = input->stride();
++    int srcH = input->height();
++    int dstW = output->stride();
++    int dstH = output->height();
++
++    std::unique_ptr<uint8_t[]> srcI420Buf;
++    unsigned int srcI420BufSize = srcW * srcH * 3 / 2;
++    srcI420Buf.reset(new uint8_t[srcI420BufSize]);
++
++    const uint8_t* srcBufY = static_cast<uint8_t*>(input->data());
++    const uint8_t* srcBufUV = srcBufY + srcW * srcH;
++    uint8_t* srcI420BufY = static_cast<uint8_t*>(srcI420Buf.get());
++    uint8_t* srcI420BufU = srcI420BufY + srcW * srcH;
++    uint8_t* srcI420BufV = srcI420BufU + srcW * srcH / 4;
++    int ret = libyuv::NV12ToI420(srcBufY, srcW,
++                                 srcBufUV, srcW,
++                                 srcI420BufY, srcW,
++                                 srcI420BufU, srcW / 2,
++                                 srcI420BufV, srcW / 2,
++                                 srcW, srcH);
++    CheckError((ret != 0), UNKNOWN_ERROR, "@%s, NV12ToI420 fails", __func__);
++
++    std::unique_ptr<uint8_t[]> dstI420BufUV;
++    unsigned int dstI420BufUVSize = dstW * dstH / 2;
++    dstI420BufUV.reset(new uint8_t[dstI420BufUVSize]);
++
++    uint8_t* dstI420BufU = static_cast<uint8_t*>(dstI420BufUV.get());
++    uint8_t* dstI420BufV = dstI420BufU + dstW * dstH / 4;
++    ret = libyuv::ConvertToI420(static_cast<uint8_t*>(srcI420Buf.get()), srcI420BufSize,
++                                static_cast<uint8_t*>(output->data()), dstW,
++                                dstI420BufU, (dstW + 1) / 2,
++                                dstI420BufV, (dstW + 1) / 2,
++                                (srcW - dstW) / 2, (srcH - dstH) / 2,
++                                srcW, srcH, dstW, dstH,
++                                libyuv::RotationMode::kRotate0, libyuv::FourCC::FOURCC_I420);
++    CheckError(ret != 0, UNKNOWN_ERROR, "@%s, ConvertToI420 fails", __func__);
++
++    uint8_t* dstBufUV = static_cast<uint8_t*>(output->data()) + dstW * dstH;
++    libyuv::MergeUVPlane(dstI420BufU, (dstW + 1) / 2,
++                         dstI420BufV, (dstW + 1) / 2,
++                         dstBufUV, dstW,
++                         (dstW + 1) / 2, (dstH + 1) / 2);
++
++    return OK;
++}
++
++status_t ImageProcessorCore::scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                        std::shared_ptr<camera3::Camera3Buffer> &output)
++{
++    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
++         __func__, input->width(), input->height(), input->v4l2Fmt(),
++         output->width(), output->height(), output->v4l2Fmt());
++
++    // Y plane
++    libyuv::ScalePlane(static_cast<uint8_t*>(input->data()),
++                       input->stride(),
++                       input->width(),
++                       input->height(),
++                       static_cast<uint8_t*>(output->data()),
++                       output->stride(),
++                       output->width(),
++                       output->height(),
++                       libyuv::kFilterNone);
++
++    // UV plane
++    int inUVOffsetByte = input->stride() * input->height();
++    int outUVOffsetByte = output->stride() * output->height();
++    libyuv::ScalePlane_16(static_cast<uint16_t*>(input->data()) + inUVOffsetByte / sizeof(uint16_t),
++                          input->stride() / 2,
++                          input->width() / 2,
++                          input->height() / 2,
++                          static_cast<uint16_t*>(output->data()) + outUVOffsetByte / sizeof(uint16_t),
++                          output->stride() / 2,
++                          output->width() / 2,
++                          output->height() / 2,
++                          libyuv::kFilterNone);
++
++    return OK;
++}
++
++status_t ImageProcessorCore::rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                         std::shared_ptr<camera3::Camera3Buffer> &output,
++                                         int angle, std::vector<uint8_t> &rotateBuf)
++{
++    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
++         __func__, input->width(), input->height(), input->v4l2Fmt(),
++         output->width(), output->height(), output->v4l2Fmt());
++
++    CheckError(output->width() != input->height() || output->height() != input->width(),
++          BAD_VALUE, "output resolution mis-match [%d x %d] -> [%d x %d]",
++          input->width(), input->height(), output->width(), output->height());
++    CheckError((angle != 90 && angle != 270), BAD_VALUE, "angle value:%d is wrong", angle);
++
++    const uint8_t* inBuffer = static_cast<uint8_t*>(input->data());
++    uint8_t* outBuffer = static_cast<uint8_t*>(output->data());
++    int outW = output->width();
++    int outH = output->height();
++    int outStride = output->stride();
++    int inW = input->width();
++    int inH = input->height();
++    int inStride = input->stride();
++    if (rotateBuf.size() < input->size()) {
++        rotateBuf.resize(input->size());
++    }
++
++    // TODO: find a way to rotate NV12 directly.
++    uint8_t* I420Buffer = rotateBuf.data();
++
++    if (mRotationMode[angle] == libyuv::RotationMode::kRotate0) {
++        libyuv::CopyPlane(inBuffer, inStride, outBuffer, outStride, inW, inH);
++        libyuv::CopyPlane(inBuffer + inH * inStride, inStride,
++                          outBuffer + outH * outStride, outStride,
++                          inW, inH / 2);
++    } else {
++        int ret = libyuv::NV12ToI420Rotate(
++                      inBuffer, inStride, inBuffer + inH * inStride, inStride,
++                      I420Buffer, outW,
++                      I420Buffer + outW * outH, outW / 2,
++                      I420Buffer + outW * outH * 5 / 4, outW / 2,
++                      inW, inH, mRotationMode[angle]);
++        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, rotate fail [%d]!", __func__, ret);
++
++        ret = libyuv::I420ToNV12(I420Buffer, outW,
++                                 I420Buffer + outW * outH, outW / 2,
++                                 I420Buffer + outW * outH * 5 / 4, outW / 2,
++                                 outBuffer, outStride,
++                                 outBuffer +  outStride * outH, outStride,
++                                 outW, outH);
++        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, convert fail [%d]!", __func__, ret);
++    }
++
++    return OK;
++}
++
++status_t ImageProcessorCore::convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                          std::shared_ptr<camera3::Camera3Buffer> &output)
++{
++    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
++         __func__, input->width(), input->height(), input->v4l2Fmt(),
++         output->width(), output->height(), output->v4l2Fmt());
++
++    switch (output->v4l2Fmt()) {
++        case V4L2_PIX_FMT_YVU420:
++            // XXX -> YV12
++            ImageConverter::convertBuftoYV12(input->v4l2Fmt(), input->width(),
++                                             input->height(), input->stride(),
++                                             output->stride(), input->data(), output->data());
++            break;
++        case V4L2_PIX_FMT_NV21:
++            // XXX -> NV21
++            ImageConverter::convertBuftoNV21(input->v4l2Fmt(), input->width(),
++                                             input->height(), input->stride(),
++                                             output->stride(), input->data(), output->data());
++            break;
++        case V4L2_PIX_FMT_YUYV:
++            // XXX -> YUYV
++            ImageConverter::convertBuftoYUYV(input->v4l2Fmt(), input->width(),
++                                             input->height(), input->stride(),
++                                             output->stride(), input->data(), output->data());
++            break;
++        default:
++            LOGE("%s: not implement for color conversion 0x%x -> 0x%x!",
++                 __func__, input->v4l2Fmt(), output->v4l2Fmt());
++            return UNKNOWN_ERROR;
++    }
++
++    return OK;
++}
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
+new file mode 100644
+index 000000000000..d874f371a696
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include <unordered_map>
++#include "IImageProcessor.h"
++
++namespace icamera {
++
++class ImageProcessorCore : public IImageProcessor {
++public:
++    ImageProcessorCore();
++    ~ImageProcessorCore();
++
++    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                               std::shared_ptr<camera3::Camera3Buffer> &output);
++    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                std::shared_ptr<camera3::Camera3Buffer> &output);
++    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                 std::shared_ptr<camera3::Camera3Buffer> &output,
++                                 int angle, std::vector<uint8_t> &rotateBuf);
++    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
++                                  std::shared_ptr<camera3::Camera3Buffer> &output);
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(ImageProcessorCore);
++
++    std::unordered_map<int, libyuv::RotationMode> mRotationMode;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
+new file mode 100644
+index 000000000000..58676a31f0a7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
+@@ -0,0 +1,409 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraDump"
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <dirent.h>
++#include <iostream>
++#include <fstream>
++#include <sstream>
++#include <math.h>
++
++#include "PlatformData.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++
++#include "3a/AiqResult.h"
++#include "3a/AiqResultStorage.h"
++
++using std::string;
++using std::shared_ptr;
++
++namespace icamera {
++
++int  gDumpType = 0;
++int  gDumpFormat = 0;
++uint32_t gDumpSkipNum = 0;
++uint32_t gDumpRangeMin = 0;
++uint32_t gDumpRangeMax = 0;
++int  gDumpFrequency = 1;
++char gDumpPath[50];
++bool gDumpRangeEnabled = false;
++static const char *ModuleName[] = {
++    "na",     // not available
++    "sensor",
++    "isys",
++    "psys",
++    "de-inter",
++    "swip-op"
++}; // map to the ModuleType
++
++static const char *StreamUsage[] = {
++    "preview",
++    "video",
++    "still",
++    "app",
++}; // map to the StreamUsage
++
++void CameraDump::setDumpLevel(void)
++{
++    const char* PROP_CAMERA_HAL_DUMP      = "cameraDump";
++    const char* PROP_CAMERA_HAL_DUMP_FORMAT = "cameraDumpFormat";
++    const char* PROP_CAMERA_HAL_DUMP_PATH = "cameraDumpPath";
++    const char* PROP_CAMERA_HAL_DUMP_SKIP_NUM = "cameraDumpSkipNum";
++    const char* PROP_CAMERA_HAL_DUMP_RANGE = "cameraDumpRange";
++    const char* PROP_CAMERA_HAL_DUMP_FREQUENCY = "cameraDumpFrequency";
++
++    // dump, it's used to dump images or some parameters to a file.
++    char *dumpType = getenv(PROP_CAMERA_HAL_DUMP);
++    if (dumpType) {
++        gDumpType = strtoul(dumpType, nullptr, 0);
++        LOGD("Dump type is 0x%x", gDumpType);
++    }
++
++    char *dumpFormat = getenv(PROP_CAMERA_HAL_DUMP_FORMAT);
++    if (dumpFormat) {
++        gDumpFormat = strtoul(dumpFormat, nullptr, 0);
++        LOGD("Dump format is 0x%x", gDumpFormat);
++    }
++
++    char* cameraDumpPath = getenv(PROP_CAMERA_HAL_DUMP_PATH);
++    snprintf(gDumpPath, sizeof(gDumpPath), "%s", "./");
++    if (cameraDumpPath) {
++        snprintf(gDumpPath, sizeof(gDumpPath), "%s", cameraDumpPath);
++    }
++
++    char* cameraDumpSkipNum = getenv(PROP_CAMERA_HAL_DUMP_SKIP_NUM);
++    if (cameraDumpSkipNum) {
++        gDumpSkipNum = strtoul(cameraDumpSkipNum, nullptr, 0);
++        LOGD("Dump skip num is %d", gDumpSkipNum);
++    }
++
++    char* cameraDumpRange = getenv(PROP_CAMERA_HAL_DUMP_RANGE);
++    if (cameraDumpRange) {
++        int sz = strlen(cameraDumpRange);
++        char dumpRange[sz + 1];
++        char *savePtr = nullptr, *tablePtr = nullptr;
++        MEMCPY_S(dumpRange, sz, cameraDumpRange, sz);
++        dumpRange[sz] = '\0';
++
++        tablePtr = strtok_r(dumpRange, ",~-", &savePtr);
++        if (tablePtr)
++            gDumpRangeMin = strtoul(tablePtr, nullptr, 0);
++
++        tablePtr = strtok_r(nullptr, ",~-", &savePtr);
++        if (tablePtr)
++            gDumpRangeMax = strtoul(tablePtr, nullptr, 0);
++
++        gDumpRangeEnabled = true;
++        LOGD("Dump range is %d-%d", gDumpRangeMin, gDumpRangeMax);
++    }
++
++    char* cameraDumpFrequency = getenv(PROP_CAMERA_HAL_DUMP_FREQUENCY);
++    if (cameraDumpFrequency) {
++        gDumpFrequency = strtoul(cameraDumpFrequency, nullptr, 0);
++        if (gDumpFrequency == 0)
++            gDumpFrequency = 1;
++        LOGD("Dump frequency is %d", gDumpFrequency);
++    }
++
++    // the PG dump is implemented in libiacss
++    if (gDumpType & DUMP_PSYS_PG) {
++        const char* PROP_CAMERA_CSS_DEBUG     = "camera_css_debug";
++        const char* PROP_CAMERA_CSS_DUMP_PATH = "camera_css_debug_dump_path";
++
++        char newCssDebugEnv[16];
++        char *cssDebugEnv = getenv(PROP_CAMERA_CSS_DEBUG);
++        int  cssDebugType = cssDebugEnv ? strtoul(cssDebugEnv, nullptr, 0) : 0;
++        // defined in ia_log.h IA_CSS_LOG_LEVEL_DUMP = 64
++        const int IA_CSS_LOG_LEVEL_DUMP = 64;
++        snprintf(newCssDebugEnv, sizeof(newCssDebugEnv), "%d",
++                (cssDebugType | IA_CSS_LOG_LEVEL_DUMP));
++        // enable dump env in libiacss
++        if (setenv(PROP_CAMERA_CSS_DEBUG, newCssDebugEnv, 1)) {
++            LOGE("setenv error for %s, current value:%d\n", PROP_CAMERA_CSS_DEBUG,
++                    cssDebugType);
++        }
++
++        const char* cssDumpPath = getenv(PROP_CAMERA_CSS_DUMP_PATH);
++        // set dump path to hal dump path
++        if (setenv(PROP_CAMERA_CSS_DUMP_PATH, gDumpPath, 1)) {
++            LOGE("setenv error for %s, current path:%s\n", PROP_CAMERA_CSS_DUMP_PATH,
++                    cssDumpPath ? cssDumpPath : "null");
++        }
++    }
++}
++
++bool CameraDump::isDumpTypeEnable(int dumpType)
++{
++    return gDumpType & dumpType;
++}
++
++bool CameraDump::isDumpFormatEnable(int dumpFormat)
++{
++    return gDumpFormat & dumpFormat;
++}
++
++const char* CameraDump::getDumpPath(void)
++{
++    return gDumpPath;
++}
++
++void CameraDump::writeData(const void* data, int size, const char* fileName) {
++    CheckError((data == nullptr || size == 0 || fileName == nullptr), VOID_VALUE, "Nothing needs to be dumped");
++
++    FILE *fp = fopen (fileName, "w+");
++    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
++
++    LOG1("Write data to file:%s", fileName);
++    if ((fwrite(data, size, 1, fp)) != 1)
++        LOGW("Error or short count writing %d bytes to %s", size, fileName);
++    fclose (fp);
++}
++
++static string getNamePrefix(int cameraId, ModuleType_t type, Port port, int sUsage = 0)
++{
++    const char* dumpPath   = CameraDump::getDumpPath();
++    const char* sensorName = PlatformData::getSensorName(cameraId);
++    char prefix[MAX_NAME_LEN] = {'\0'};
++
++    if ((sUsage >= static_cast<int>(ARRAY_SIZE(StreamUsage))) || (sUsage < 0)) {
++        sUsage = 0;
++    }
++
++    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
++        snprintf(prefix, (MAX_NAME_LEN - 1), "%s/name#%s_%s", dumpPath, sensorName, StreamUsage[sUsage]);
++    } else {
++        if (port == INVALID_PORT) {
++            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_%s", dumpPath, cameraId,
++                 sensorName, ModuleName[type], StreamUsage[sUsage]);
++        } else {
++            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_port%d_%s", dumpPath, cameraId,
++                 sensorName, ModuleName[type], port, StreamUsage[sUsage]);
++        }
++    }
++
++    return string(prefix);
++}
++
++static string getAiqSettingAppendix(int cameraId, long sequence)
++{
++    char settingAppendix[MAX_NAME_LEN] = {'\0'};
++
++    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult(sequence));
++    if (aiqResults == nullptr) {
++        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, sequence);
++        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult());
++        CheckError((aiqResults == nullptr), string(settingAppendix), "Cannot find available aiq result.");
++    }
++
++    ia_aiq_exposure_sensor_parameters *sensorExposure =
++                                       aiqResults->mAeResults.exposures[0].sensor_exposure;
++    ia_aiq_exposure_parameters *exposure =
++                                       aiqResults->mAeResults.exposures[0].exposure;
++
++    CheckError((sensorExposure == nullptr || exposure == nullptr), string(settingAppendix), "Cannot find aiq exposures");
++
++    double ag = sensorExposure->analog_gain_code_global;
++    double dg = sensorExposure->digital_gain_global;
++    float ispDg = 1.0f;
++
++    LOG2("%s: original sensorExposure AG: %f, DG: %f, exposure: AG: %f, DG: %f",
++           __func__, ag, dg, exposure->analog_gain, exposure->digital_gain);
++
++    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
++
++        // Convert AG and DG per sensor for IQ Studio input.
++        const int nSteps = 256;
++        const char* sensorName = PlatformData::getSensorName(cameraId);
++        ispDg = sensorExposure->digital_gain_global;
++
++        if (strstr(sensorName, "imx185") != nullptr) {
++            LOG2("%s: AG and DG conversion made for %s.", __func__, sensorName);
++            if ((double)sensorExposure->analog_gain_code_global * 0.3 > 24) {
++                ag = 16.0 * nSteps;
++                // real gain should be  pwd(10, (db value / 20))
++                dg = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3 - 24) / 20);
++            } else {
++                ag = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3) / 20);
++                dg = 1.0 * nSteps;
++            }
++            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
++        } else if (strstr(sensorName, "imx274") != nullptr) {
++            ag = nSteps * exposure->analog_gain;
++            dg = nSteps * PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
++            ispDg = nSteps * PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
++            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
++        }
++
++        if (aiqResults->mAeResults.num_exposures == 2) {
++            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d,%d",
++                ag, dg, ispDg, exposure->exposure_time_us,
++                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
++        } else {
++            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d",
++                ag, dg, ispDg, exposure->exposure_time_us);
++        }
++    } else {
++
++        if (PlatformData::isUsingIspDigitalGain(cameraId)) {
++            dg = PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
++            ispDg = PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
++        }
++
++        if (aiqResults->mAeResults.num_exposures == 2) {
++            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d,%d",
++                ag, dg, ispDg, exposure->exposure_time_us,
++                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
++        } else {
++            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d",
++                ag, dg, ispDg, exposure->exposure_time_us);
++        }
++    }
++
++    return string(settingAppendix);
++}
++
++static string formatFrameFileName(const char *prefix,
++                                  const char *appendix,
++                                  const char *suffix,
++                                  long sequence,
++                                  int width, int height)
++{
++    char fileName[MAX_NAME_LEN] = {'\0'};
++
++    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
++
++        if (strstr(suffix, "GRBG") || strstr(suffix, "RGGB")
++            || strstr(suffix, "GBRG") || strstr(suffix, "BGGR")) {
++            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.raw",
++                prefix, appendix, sequence);
++        } else {
++            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.%s",
++                prefix, appendix, sequence, suffix);
++        }
++    } else {
++
++        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_frame_%04ld_%dx%d%s.%s",
++             prefix, sequence, width, height, appendix, suffix);
++    }
++    return string(fileName);
++}
++
++static string formatBinFileName(int cameraId, const char *prefix, BinParam_t *binParam)
++{
++    char fileName[MAX_NAME_LEN] = {'\0'};
++    string appendix;
++
++    switch(binParam->bType) {
++    case BIN_TYPE_GENERAL:
++        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_bin_%04ld_%s.bin",
++                 prefix, binParam->sequence, binParam->gParam.appendix);
++        break;
++    case BIN_TYPE_STATISTIC:
++        snprintf(fileName, (MAX_NAME_LEN - 1),
++                 "%s_stat_%04ld_grid%dx%d_%s.bin",
++                 prefix, binParam->sequence,
++                 binParam->sParam.gridWidth, binParam->sParam.gridHeight,
++                 binParam->sParam.appendix);
++        break;
++    case BIN_TYPE_SENSOR_METADATA:
++        snprintf(fileName, (MAX_NAME_LEN - 1),
++                 "%s_metadata_%04ld_%dx%d_plane%d.%s",
++                 prefix, binParam->sequence,
++                 binParam->mParam.width, binParam->mParam.height,
++                 binParam->mParam.planeIdx,
++                 CameraUtils::format2string(binParam->mParam.metaFormat).c_str());
++        break;
++    case BIN_TYPE_BUFFER:
++        appendix = getAiqSettingAppendix(cameraId, binParam->sequence);
++        return formatFrameFileName(prefix, appendix.c_str(),
++                                   CameraUtils::format2string(binParam->bParam.format).c_str(),
++                                   binParam->sequence,
++                                   binParam->bParam.width, binParam->bParam.height);
++
++    default:
++        LOGW("Unknow binary type:%d", binParam->bType);
++        break;
++    }
++
++    return string(fileName);
++}
++
++void CameraDump::dumpImage(int cameraId, const shared_ptr<CameraBuffer> &camBuffer,
++                           ModuleType_t type, Port port)
++{
++    CheckError(camBuffer == nullptr, VOID_VALUE, "invalid param");
++
++    if (camBuffer->getSequence() < gDumpSkipNum) return;
++
++    if (gDumpRangeEnabled &&
++        (camBuffer->getSequence() < gDumpRangeMin
++         || camBuffer->getSequence() > gDumpRangeMax)) {
++        return;
++    }
++
++    if (camBuffer->getSequence() % gDumpFrequency != 0) return;
++
++    string prefix   = getNamePrefix(cameraId, type, port, camBuffer->getUserBuffer()->s.usage);
++    string appendix = getAiqSettingAppendix(cameraId, camBuffer->getSequence());
++
++    string fileName = formatFrameFileName(prefix.c_str(), appendix.c_str(),
++                                          CameraUtils::format2string(camBuffer->getFormat()).c_str(),
++                                          camBuffer->getSequence(),
++                                          camBuffer->getWidth(), camBuffer->getHeight());
++
++    int fd = camBuffer->getFd();
++    int bufferSize = camBuffer->getBufferSize();
++    int memoryType = camBuffer->getMemory();
++    void* pBuf = (memoryType == V4L2_MEMORY_DMABUF)
++                    ? CameraBuffer::mapDmaBufferAddr(fd, bufferSize)
++                    : camBuffer->getBufferAddr();
++    LOGD("@%s, fd:%d, buffersize:%d, buf:%p, memoryType:%d, fileName:%s",
++            __func__, fd, bufferSize, pBuf, memoryType, fileName.c_str());
++    writeData(pBuf, bufferSize, fileName.c_str());
++    if (memoryType == V4L2_MEMORY_DMABUF) {
++        CameraBuffer::unmapDmaBufferAddr(pBuf, bufferSize);
++    }
++}
++
++void CameraDump::dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam)
++{
++    CheckError(binParam == nullptr, VOID_VALUE, "invalid param");
++
++    if (binParam->sequence < gDumpSkipNum) return;
++
++    if (gDumpRangeEnabled &&
++        (binParam->sequence < gDumpRangeMin
++         || binParam->sequence > gDumpRangeMax)) {
++        return;
++    }
++
++    if (binParam->sequence % gDumpFrequency != 0) return;
++
++    string prefix   = getNamePrefix(cameraId, binParam->mType, INVALID_PORT, binParam->sUsage);
++    string fileName = formatBinFileName(cameraId, prefix.c_str(), binParam);
++    LOG2("@%s, fileName:%s", __func__, fileName.c_str());
++    writeData(data, size, fileName.c_str());
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.h b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
+new file mode 100644
+index 000000000000..3b51c84468b9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
+@@ -0,0 +1,170 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string.h>
++#include <vector>
++#include <string>
++#include <linux/v4l2-subdev.h>
++
++#include "CameraTypes.h"
++#include "CameraBuffer.h"
++
++namespace icamera {
++
++/**
++ * global dump level
++ * This global variable is set from system properties
++ * It is used to control the type of frame dump
++ */
++extern int gDumpType;
++extern char gDumpPath[50];
++
++// Dump bit mask definition
++enum {
++    // ISYS Buffer dump (bit[0-3])
++    DUMP_ISYS_BUFFER =          1 << 0,
++    // Reserve bit[1-3] for detailed buffer dump control
++
++    DUMP_JPEG_BUFFER =          1 << 3, // JPEG buffer
++    // ISYS PG/PAL/Stats dump (bit[4-7])
++    DUMP_ISYS_PAL =             1 << 4, // ISP param binary
++    DUMP_ISYS_PG =              1 << 5, // ISYS whole PG dump assisted by libiacss
++    DUMP_ISYS_ENCODED_STAT =    1 << 6, // p2p encoded statistics
++    DUMP_ISYS_AIQ_STAT =        1 << 7, // rgbs_grid format stats for AIQ use
++
++    // PSYS dump (bit[8-11])
++    DUMP_PSYS_OUTPUT_BUFFER =   1 << 8,
++    DUMP_PSYS_INTERM_BUFFER =   1 << 9, // dump Psys intermediate buffers like PreGDC output
++    // Reserve bit[10-11] for detailed buffer dump control
++
++    DUMP_AIQ_DVS_RESULT =       1 << 10, // dump dvs result
++
++    // PSYS PG/PAL/Stats dump (bit[12-15])
++    DUMP_PSYS_PAL =             1 << 12, // ISP param binary
++    DUMP_PSYS_PG =              1 << 13, // PSYS whole PG dump assisted by libiacss
++    DUMP_PSYS_AIQ_STAT =        1 << 14, // rgbs_grid format stats for AIQ use
++    DUMP_PSYS_DECODED_STAT =    1 << 15, // p2p decoded statistics
++
++    // Other dump
++    DUMP_MIPI_BUFFER =          1 << 16, // e.g. export cameraDump=0x10000
++    DUMP_UT_BUFFER =            1 << 17, // e.g. export cameraDump=0x20000
++    DUMP_EMBEDDED_METADATA =    1 << 18,
++    DUMP_DEINTERLACED_BUFFER =  1 << 19, // 0x80000  Decimal val 524288
++    DUMP_SW_IMG_PROC_OUTPUT =   1 << 20, // 0x100000 Decimal val 1048576
++
++    // Pipe executors' dump
++    DUMP_EXECUTOR_OUTPUT =   1 << 21, // 0x200000 Decimal val 2097152
++
++    // LTM output's dump
++    DUMP_LTM_OUTPUT = 1 << 22, // 0x400000 Decimal val 4194304
++
++    DUMP_AAL_OUTPUT = 1 << 23, // 0x800000 Decimal val 8388608
++    DUMP_AAL_INPUT = 1 << 24, // 0x1000000 Decimal val 16777216
++};
++
++enum {
++    DUMP_FORMAT_NORMAL =          1 << 0,  // Normal format
++    DUMP_FORMAT_IQSTUDIO =        1 << 1,  // IQStudio format
++};
++
++const int MAX_NAME_LEN = 256;
++
++typedef enum {
++    M_NA,
++    M_SENSOR, // MIPI frame dump
++    M_ISYS,   // ISYS param, payload, frame dump
++    M_PSYS,   // PSYS param, payload, frame dump
++    M_DEINTR, // De-interlaced frame dump
++    M_SWIPOP, // Sw Image processor frame dump
++} ModuleType_t;
++
++typedef enum {
++    BIN_TYPE_GENERAL,
++    BIN_TYPE_STATISTIC,
++    BIN_TYPE_SENSOR_METADATA,
++    BIN_TYPE_BUFFER,
++} BinType_t;
++
++typedef struct {
++    const char* appendix;
++} GeneralParam_t;
++
++typedef struct {
++    int gridWidth;
++    int gridHeight;
++    const char* appendix;
++} StatParam_t;
++
++typedef struct {
++    int width;
++    int height;
++    int planeIdx;
++    int metaFormat;
++} SensorMetadataParam_t;
++
++typedef struct {
++    int width;
++    int height;
++    int format;
++} BufferParam_t;
++
++typedef struct {
++    BinType_t       bType;
++    ModuleType_t    mType;
++    long sequence;
++    union {
++        GeneralParam_t        gParam;
++        StatParam_t           sParam;
++        SensorMetadataParam_t mParam;
++        BufferParam_t         bParam;
++    };
++    int sUsage;
++} BinParam_t;
++
++/**
++ * Dump files with formated file name, put under getDumpPath()
++ * Supported dump type:
++ *   Image(RAW/YUV/RGB)
++ *   PAL bin
++ *   Decoded statistics
++ *   Sensor Metadata
++ * File name format example:
++ * Path/cameraId_sensorName_isys(psys)_
++ *      frame(pal/stats/)_sequence_resolution_appendix.suffix
++ */
++namespace CameraDump {
++    /**
++     * File dump control functions.
++     */
++    void setDumpLevel(void);
++    bool isDumpTypeEnable(int dumpType);
++    bool isDumpFormatEnable(int dumpFormat);
++    void writeData(const void* data, int size, const char* fileName);
++    const char* getDumpPath(void);
++    /**
++     * Dump image according to CameraBuffer properties
++     */
++    void dumpImage(int cameraId, const std::shared_ptr<CameraBuffer> &camBuffer,
++                   ModuleType_t mType = M_NA, Port port = INVALID_PORT);
++    /**
++     * Dump any buffer to binary file
++     */
++    void dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam);
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
+new file mode 100644
+index 000000000000..01f7d29c3e11
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
+@@ -0,0 +1,270 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraLog"
++
++#include <sys/time.h>
++#include <time.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <stdarg.h>
++
++#include "iutils/Utils.h"
++
++#include "CameraLog.h"
++#include "Trace.h"
++
++namespace icamera {
++int gLogLevel = 0;
++char *gLogModules = nullptr;
++int gPerfLevel = 0;
++int gEnforceDvs = 0;
++int gSlowlyRunRatio = 0;
++bool gIsDumpMediaTopo = false;
++bool gIsDumpMediaInfo = false;
++
++static void getLogTime(char *timeBuf, int bufLen)
++{
++    // The format of time is: 01-22 15:24:53.071
++    struct timeval tv;
++    gettimeofday(&tv, nullptr);
++    time_t nowtime = tv.tv_sec;
++    struct tm* nowtm = localtime(&nowtime);
++    if (nowtm) { // If nowtm is nullptr, simply print nothing for time info
++        char tmbuf[bufLen];
++        CLEAR(tmbuf);
++        strftime(tmbuf, bufLen, "%m-%d %H:%M:%S", nowtm);
++        snprintf(timeBuf, bufLen, "%s.%03ld", tmbuf, tv.tv_usec/1000);
++    }
++}
++
++__attribute__((__format__ (__printf__, 3, 0)))
++static void printLog(const char *module, const char *level, const char *fmt, va_list ap)
++{
++    // Add time into beginning of the log.
++    const int BUF_LEN = 64;
++    char timeBuf[BUF_LEN] = {'\0'};
++
++    getLogTime(timeBuf, BUF_LEN);
++
++    fprintf(stdout, "%s: [%s]: CamHAL_%s:", timeBuf, level, module);
++    vfprintf(stdout, fmt, ap);
++    fprintf(stdout, "\n");
++}
++
++namespace Log {
++
++void setDebugLevel(void)
++{
++    const char* PROP_CAMERA_HAL_DEBUG = "cameraDebug";
++    const char* PROP_CAMERA_HAL_MODULES = "cameraModules";
++    const char* PROP_CAMERA_HAL_PERF  = "cameraPerf";
++    const char* PROP_CAMERA_HAL_DVS = "cameraDvs";
++    const char* PROP_CAMERA_RUN_RATIO = "cameraRunRatio";
++
++    // debug
++    char *dbgLevel = getenv(PROP_CAMERA_HAL_DEBUG);
++    if (dbgLevel) {
++        gLogLevel = strtoul(dbgLevel, nullptr, 0);
++        LOG1("Debug level is 0x%x", gLogLevel);
++
++        // to enable both LOG1 and LOG2 traces
++        if (gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
++            gLogLevel |= CAMERA_DEBUG_LOG_LEVEL1;
++    }
++
++    char *slowlyRunRatio = getenv(PROP_CAMERA_RUN_RATIO);
++    if (slowlyRunRatio) {
++        gSlowlyRunRatio = strtoul(slowlyRunRatio, nullptr, 0);
++        LOG1("Slow run ratio is 0x%x", gSlowlyRunRatio);
++    }
++
++    //modules
++    gLogModules = getenv(PROP_CAMERA_HAL_MODULES);
++
++    // performance
++    char *perfLevel = getenv(PROP_CAMERA_HAL_PERF);
++    if (perfLevel) {
++        gPerfLevel = strtoul(perfLevel, nullptr, 0);
++        LOGD("Performance level is 0x%x", gPerfLevel);
++
++        // bitmask of tracing categories
++        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES) {
++            LOGD("Perf KPI start/end trace is not yet supported");
++        }
++        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN) {
++            LOGD("Perf KPI breakdown trace is not yet supported");
++        }
++        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN) {
++            LOGD("Perf IOCTL breakdown trace is not yet supported");
++        }
++        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_MEMORY) {
++            LOGD("Perf memory breakdown trace is not yet supported");
++        }
++        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL) {
++            gIsDumpMediaTopo = true;
++        }
++        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL) {
++            gIsDumpMediaInfo = true;
++        }
++        ScopedAtrace::setTraceLevel(gPerfLevel);
++    }
++
++    // Enforce DVS for debugging
++    char *dvs = getenv(PROP_CAMERA_HAL_DVS);
++    if (dvs) {
++        gEnforceDvs = strtoul(dvs, nullptr, 0);
++        LOGD("EnforceDvs level is 0x%x", gEnforceDvs);
++    }
++}
++
++bool isDebugLevelEnable(int level)
++{
++    return gLogLevel & level;
++}
++
++bool isModulePrintAble(const char *module)
++{
++    if (gLogModules == nullptr) {
++        return true;
++    } else if (strstr(gLogModules, module) != nullptr) {
++        return true;
++    } else {
++        return false;
++    }
++}
++
++bool isDumpMediaTopo(void)
++{
++    return gIsDumpMediaTopo;
++}
++
++bool isDumpMediaInfo(void)
++{
++    return gIsDumpMediaInfo;
++}
++
++__attribute__((__format__ (__printf__, 4, 0)))
++void print_log(bool enable, const char *module, const int level, const char *format, ...)
++{
++    if (!enable && (level != CAMERA_DEBUG_LOG_ERR))
++        return;
++
++    if (!isModulePrintAble(module)) {
++        return;
++    }
++
++    const char *levelStr = nullptr;
++    va_list arg;
++    va_start(arg, format);
++
++    switch(level) {
++        case CAMERA_DEBUG_LOG_LEVEL1:
++            levelStr = "LV1";
++        break;
++        case CAMERA_DEBUG_LOG_LEVEL2:
++            levelStr = "LV2";
++        break;
++        case CAMERA_DEBUG_LOG_REQ_STATE:
++            levelStr = "REQ";
++        break;
++        case CAMERA_DEBUG_LOG_AIQ:
++            levelStr = "AIQ";
++        break;
++        case CAMERA_DEBUG_LOG_XML:
++            levelStr = "XML";
++        break;
++        case CAMERA_DEBUG_LOG_DBG:
++            levelStr = "DBG";
++        break;
++        case CAMERA_DEBUG_LOG_INFO:
++            levelStr = "INF";
++        break;
++        case CAMERA_DEBUG_LOG_ERR:
++            levelStr = "ERR";
++        break;
++        case CAMERA_DEBUG_LOG_WARNING:
++            levelStr = "WAR";
++        break;
++        case CAMERA_DEBUG_LOG_VERBOSE:
++            levelStr = "VER";
++        break;
++        case CAMERA_DEBUG_LOG_VC_SYNC:
++            levelStr = "VCSYNC";
++        break;
++        case CAMERA_DEBUG_LOG_GRAPH:
++            levelStr = "GRAPH";
++        break;
++        default:
++            levelStr = "UKN";
++        break;
++    }
++
++    printLog(module, levelStr, format, arg);
++
++    va_end(arg);
++}
++
++__attribute__((__format__ (__printf__, 1, 0)))
++void ccaPrintError(const char *fmt, va_list ap)
++{
++    printLog("CCA_DEBUG", "ERROR", fmt, ap);
++}
++
++__attribute__((__format__ (__printf__, 1, 0)))
++void ccaPrintInfo(const char *fmt, va_list ap)
++{
++    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
++        printLog("CCA_DEBUG", "INFO", fmt, ap);
++    }
++}
++
++__attribute__((__format__ (__printf__, 1, 0)))
++void ccaPrintDebug(const char *fmt, va_list ap)
++{
++    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
++        printLog("CCA_DEBUG", "DBG", fmt, ap);
++    }
++}
++
++} // namespace Log
++
++#ifdef HAVE_ANDROID_OS
++
++void __camera_hal_log(bool condition, int prio, const char *tag,
++                      const char *fmt, ...)
++{
++    if (condition) {
++        va_list ap;
++        va_start(ap, fmt);
++        if (gLogLevel & CAMERA_DEBUG_LOG_PERSISTENT) {
++            int errnoCopy;
++            unsigned int maxTries = 20;
++            do {
++                errno = 0;
++                __android_log_vprint(prio, tag, fmt, ap);
++                errnoCopy = errno;
++                if (errnoCopy == EAGAIN)
++                    usleep(2000); /* sleep 2ms */
++            } while(errnoCopy == EAGAIN && maxTries--);
++        } else {
++            __android_log_vprint(prio, tag, fmt, ap);
++        }
++    }
++}
++
++#endif //HAVE_ANDROID_OS
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.h b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
+new file mode 100644
+index 000000000000..c105cd0bbd6a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
+@@ -0,0 +1,206 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <stdarg.h>
++
++#include "utils/ScopedAtrace.h"
++#ifdef HAVE_ANDROID_OS
++#include <log/log.h>
++#endif
++
++namespace icamera {
++/**
++ * global log level
++ * This global variable is set from system properties
++ * It is used to control the level of verbosity of the traces in logcat
++ * It is also used to store the status of certain RD features
++ */
++extern int gLogLevel;
++extern int gPerfLevel;
++extern int gEnforceDvs;
++extern int gSlowlyRunRatio;
++
++/**
++ * LOG levels
++ *
++ * LEVEL 1 is used to track events in the HAL that are relevant during
++ * the operation of the camera, but are not happening on a per frame basis.
++ * this ensures that the level of logging is not too verbose
++ *
++ * LEVEL 2 is used to track information on a per request basis
++ *
++ * REQ_STATE is used to track the state of each request. By state we mean a one
++ * of the following request properties:
++ *  - metadata result
++ *  - buffer
++ *  - shutter
++ *  - error
++ *
++ * PERF TRACES enable only traces that provide performance metrics on the opera
++ * tion of the HAL
++ *
++ * PERF TRACES BREAKDOWN provides further level of detail on the performance
++ * metrics
++ */
++enum  {
++    /* verbosity level of general traces */
++    CAMERA_DEBUG_LOG_LEVEL1 = 1,
++    CAMERA_DEBUG_LOG_LEVEL2 = 1 << 1,
++
++    /* Bitmask to enable a concrete set of traces */
++    CAMERA_DEBUG_LOG_REQ_STATE = 1 << 2,
++    CAMERA_DEBUG_LOG_AIQ = 1 << 3,
++    CAMERA_DEBUG_LOG_XML = 1 << 4,
++    CAMERA_DEBUG_LOG_VC_SYNC = 1 << 5,
++    CAMERA_DEBUG_LOG_FPS = 1 << 6,
++    CAMERA_DEBUG_LOG_KERNEL_TOGGLE = 1 << 8,
++    CAMERA_DEBUG_LOG_SANDBOXING = 1 << 9,
++
++    /* Make logs persistent, retrying if logcat is busy */
++    CAMERA_DEBUG_LOG_PERSISTENT = 1 << 12, /* 4096 */
++
++    /* reserved for any components */
++    CAMERA_DEBUG_LOG_GRAPH = 1 << 13,
++
++    CAMERA_DEBUG_LOG_DBG = 1 <<16,
++    CAMERA_DEBUG_LOG_INFO = 1 <<17,
++    CAMERA_DEBUG_LOG_ERR = 1 <<18,
++    CAMERA_DEBUG_LOG_WARNING = 1 <<19,
++    CAMERA_DEBUG_LOG_VERBOSE = 1 <<20
++};
++
++enum  {
++    /* Emit well-formed performance traces */
++    CAMERA_DEBUG_LOG_PERF_TRACES = 1,
++
++    /* Print out detailed timing analysis */
++    CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN = 2,
++
++    /* Print out detailed timing analysis for IOCTL */
++    CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN = 1<<2,
++
++    /* Print out detailed memory information analysis for IOCTL */
++    CAMERA_DEBUG_LOG_PERF_MEMORY = 1<<3,
++
++    /*enable camera atrace level 0 for camtune-record*/
++    CAMERA_DEBUG_LOG_ATRACE_LEVEL0 = 1<<4,
++
++    /*enable media topology dump*/
++    CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL = 1<<5,
++
++    /*enable media controller info dump*/
++    CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL = 1<<6,
++
++    /*enable camera imaging atrace level 1 for camtune-record*/
++    CAMERA_DEBUG_LOG_ATRACE_LEVEL1 = 1<<7,
++};
++
++enum {
++    CAMERA_POWERBREAKDOWN_DISABLE_PREVIEW = 1<<0,
++    CAMERA_POWERBREAKDOWN_DISABLE_FDFR = 1<<1,
++    CAMERA_POWERBREAKDOWN_DISABLE_3A = 1<<2,
++};
++
++namespace Log {
++void setDebugLevel(void);
++void print_log(bool enable, const char *module, const int level, const char *format, ...);
++bool isDebugLevelEnable(int level);
++bool isModulePrintAble(const char *module);
++bool isDumpMediaTopo(void);
++bool isDumpMediaInfo(void);
++void ccaPrintError(const char *fmt, va_list ap);
++void ccaPrintInfo(const char *fmt, va_list ap);
++void ccaPrintDebug(const char *fmt, va_list ap);
++};
++
++#define SLOWLY_MULTIPLIER (gSlowlyRunRatio ? gSlowlyRunRatio : 1)
++
++#ifdef HAVE_LINUX_OS //Linux OS
++#define LOG1(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
++#define LOG2(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
++#define LOGR(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, LOG_TAG, CAMERA_DEBUG_LOG_REQ_STATE, format, ##args)
++#define LOG3A(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, LOG_TAG, CAMERA_DEBUG_LOG_AIQ, format, ##args)
++#define LOGXML(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_XML, LOG_TAG, CAMERA_DEBUG_LOG_XML, format, ##args)
++#define LOGVCSYNC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, LOG_TAG, CAMERA_DEBUG_LOG_VC_SYNC, format, ##args)
++#define LOGG(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, LOG_TAG, CAMERA_DEBUG_LOG_GRAPH, format, ##args)
++#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
++
++#define LOGD(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_DBG, format, ##args)
++#define LOGI(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_INFO, format, ##args)
++#define LOGE(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_ERR, format, ##args)
++#define LOGW(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_WARNING, format, ##args)
++#define LOGV(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_VERBOSE, format, ##args)
++
++#define ALOGE LOGE
++#define ALOGD LOGD
++#define ALOGI LOGI
++#define ALOGW LOGW
++#define ALOGV LOGV
++#define ALOGW_IF
++#define LOG_ALWAYS_FATAL_IF
++#define LOG_FATAL_IF
++
++#else //Android OS
++
++void __camera_hal_log(bool condition, int prio, const char *tag, const char *fmt, ...);
++
++#define LOG1(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOG2(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGR(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOG3A(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGXML(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_XML, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGVCSYNC(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGG(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
++
++#define LOGE(...) __camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
++#define LOGI(...) __camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
++#define LOGD(...) __camera_hal_log(true, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
++#define LOGW(...) __camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
++#define LOGV(...) __camera_hal_log(true, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
++
++#endif
++#define HAL_TRACE_NAME(level, name) ScopedTrace ___tracer(level, name )
++#define HAL_TRACE_CALL(level) HAL_TRACE_NAME(level, __PRETTY_FUNCTION__)
++
++#define MAKE_COLOR(data) (data)
++#define TRACE_LOG_PROCESS(...)
++#define TRACE_STRUCT_PROCESS(name, struct_name, ...)
++#define TRACE_LOG_POINT(...)
++#define TRACE_STRUCT_POINT(name, struct_name, ...)
++
++class ScopedTrace {
++    public:
++        inline ScopedTrace(int level, const char* name) :
++            mLevel(level),
++            mName(name) {
++                if ((mLevel <= gLogLevel) && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
++                    LOGD("ENTER-%s",name);
++            }
++
++        inline ~ScopedTrace() {
++                if ((mLevel <= gLogLevel)  && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
++                    LOGD("EXIT-%s", mName);
++        }
++
++    private:
++        int mLevel;
++        const char* mName;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/Errors.h b/camera/hal/intel/ipu6/src/iutils/Errors.h
+new file mode 100644
+index 000000000000..8ef824f04fcc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Errors.h
+@@ -0,0 +1,65 @@
++/*
++ * Copyright (C) 2007 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <sys/types.h>
++#include <errno.h>
++
++namespace icamera {
++
++typedef int         status_t;
++
++/*
++ * Error codes.
++ * All error codes are negative values.
++ */
++
++enum {
++    OK                  = 0,    // Everything's swell.
++
++    UNKNOWN_ERROR       = (-2147483647-1), // INT32_MIN value
++
++    NO_MEMORY           = -ENOMEM,
++    INVALID_OPERATION   = -ENOSYS,
++    BAD_VALUE           = -EINVAL,
++    BAD_TYPE            = (UNKNOWN_ERROR + 1),
++    NAME_NOT_FOUND      = -ENOENT,
++    PERMISSION_DENIED   = -EPERM,
++    NO_INIT             = -ENODEV,
++    ALREADY_EXISTS      = -EEXIST,
++    DEAD_OBJECT         = -EPIPE,
++    FAILED_TRANSACTION  = (UNKNOWN_ERROR + 2),
++    JPARKS_BROKE_IT     = -EPIPE,
++#if !defined(HAVE_MS_C_RUNTIME)
++    BAD_INDEX           = -EOVERFLOW,
++    NOT_ENOUGH_DATA     = -ENODATA,
++    WOULD_BLOCK         = -EWOULDBLOCK,
++    TIMED_OUT           = -ETIMEDOUT,
++    UNKNOWN_TRANSACTION = -EBADMSG,
++#else
++    BAD_INDEX           = -E2BIG,
++    NOT_ENOUGH_DATA     = (UNKNOWN_ERROR + 3),
++    WOULD_BLOCK         = (UNKNOWN_ERROR + 4),
++    TIMED_OUT           = (UNKNOWN_ERROR + 5),
++    UNKNOWN_TRANSACTION = (UNKNOWN_ERROR + 6),
++#endif
++    FDS_NOT_ALLOWED     = (UNKNOWN_ERROR + 7),
++    NO_ENTRY            = (UNKNOWN_ERROR + 8),
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/RWLock.h b/camera/hal/intel/ipu6/src/iutils/RWLock.h
+new file mode 100644
+index 000000000000..2082811ec9be
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/RWLock.h
+@@ -0,0 +1,98 @@
++/*
++ * Copyright (C) 2007 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "Errors.h"
++
++#if defined(HAVE_PTHREADS)
++#include <pthread.h>
++#endif
++
++// ---------------------------------------------------------------------------
++namespace icamera {
++// ---------------------------------------------------------------------------
++
++#if defined(HAVE_PTHREADS)
++
++/*
++ * Simple mutex class.  The implementation is system-dependent.
++ *
++ * The mutex must be unlocked by the thread that locked it.  They are not
++ * recursive, i.e. the same thread can't lock it multiple times.
++ */
++class RWLock {
++public:
++                RWLock() {};
++                ~RWLock();
++
++    status_t    readLock();
++    status_t    tryReadLock();
++    status_t    writeLock();
++    status_t    tryWriteLock();
++    void        unlock();
++
++    class AutoRLock {
++    public:
++        inline AutoRLock(RWLock& rwlock) : mLock(rwlock)  { mLock.readLock(); }
++        inline ~AutoRLock() { mLock.unlock(); }
++    private:
++        RWLock& mLock;
++    };
++
++    class AutoWLock {
++    public:
++        inline AutoWLock(RWLock& rwlock) : mLock(rwlock)  { mLock.writeLock(); }
++        inline ~AutoWLock() { mLock.unlock(); }
++    private:
++        RWLock& mLock;
++    };
++
++private:
++    // A RWLock cannot be copied
++                RWLock(const RWLock&);
++   RWLock&      operator = (const RWLock&);
++
++   pthread_rwlock_t mRWLock = PTHREAD_RWLOCK_INITIALIZER;
++};
++
++inline RWLock::~RWLock() {
++    pthread_rwlock_destroy(&mRWLock);
++}
++inline status_t RWLock::readLock() {
++    return -pthread_rwlock_rdlock(&mRWLock);
++}
++inline status_t RWLock::tryReadLock() {
++    return -pthread_rwlock_tryrdlock(&mRWLock);
++}
++inline status_t RWLock::writeLock() {
++    return -pthread_rwlock_wrlock(&mRWLock);
++}
++inline status_t RWLock::tryWriteLock() {
++    return -pthread_rwlock_trywrlock(&mRWLock);
++}
++inline void RWLock::unlock() {
++    pthread_rwlock_unlock(&mRWLock);
++}
++
++#endif // HAVE_PTHREADS
++typedef RWLock::AutoRLock AutoRMutex;
++typedef RWLock::AutoWLock AutoWMutex;
++
++// ---------------------------------------------------------------------------
++} // namespace icamera
++// ---------------------------------------------------------------------------
+diff --git a/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
+new file mode 100644
+index 000000000000..13533c7bc43d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "utils/ScopedAtrace.h"
++#include "Trace.h"
++
++namespace icamera {
++
++const int ATRACE_LEN = 128;
++int gScopedAtraceLevel = 0;
++
++ScopedAtrace::ScopedAtrace(const int level, const char* func, const char* tag,
++                           const char* note, long value, const char* note2,
++                           int value2, const char* note3, int value3)
++{
++    mEnableAtraceEnd = false;
++    if(gScopedAtraceLevel & level) {
++        char buf[ATRACE_LEN];
++        if (value < 0 || note == nullptr) {
++            snprintf(buf, ATRACE_LEN, "<%s,%s>", func, tag);
++            atrace_begin(ATRACE_TAG, buf);
++        } else if (value2 < 0 || note2 == nullptr) {
++            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld)", func, tag, note, value);
++            atrace_begin(ATRACE_TAG, buf);
++        } else if (value3 < 0 || note3 == nullptr) {
++            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d)", func, tag, note,
++                     value, note2, value2);
++            atrace_begin(ATRACE_TAG, buf);
++        } else {
++            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d) %s(%d)", func, tag,
++                     note, value, note2, value2, note3, value3);
++            atrace_begin(ATRACE_TAG, buf);
++        }
++        mEnableAtraceEnd = true;
++    }
++}
++
++ScopedAtrace::~ScopedAtrace()
++{
++    if(mEnableAtraceEnd) {
++        atrace_end(ATRACE_TAG);
++    }
++}
++
++void ScopedAtrace::setTraceLevel(int level)
++{
++    gScopedAtraceLevel = level;
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
+new file mode 100644
+index 000000000000..a6e63c6beffd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
+@@ -0,0 +1,406 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SwImageConverter"
++
++#include "Errors.h"
++#include "Utils.h"
++#include "CameraLog.h"
++#include "SwImageConverter.h"
++
++namespace icamera {
++
++void SwImageConverter::RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
++     unsigned char *Y, unsigned char *U, unsigned char *V)
++{
++    int Rp, Gp, Bp;
++    int oY, oU, oV;
++    Rp = R; Gp = G; Bp = B;
++    oY = (257 * Rp + 504 * Gp + 98 * Bp) / 4000 + 16;
++    oU = (-148 * Rp - 291 * Gp + 439 * Bp) / 4000 + 128;
++    oV = (439 * Rp - 368 * Gp - 71 * Bp) / 4000 + 128;
++    if (oY > 255) oY = 255;
++    if (oY < 0) oY = 0;
++    if (oU > 255) oU = 255;
++    if (oU < 0) oU = 0;
++    if (oV > 255) oV = 255;
++    if (oV < 0) oV = 0;
++    *Y = (unsigned char)oY;
++    *U = (unsigned char)oU;
++    *V = (unsigned char)oV;
++}
++
++void SwImageConverter::YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
++    unsigned short *R, unsigned short *G, unsigned short *B)
++{
++    int Yp, Up, Vp, Ypp;
++    int oR, oG, oB;
++    Yp = Y - 16;
++    Up = (U - 128);
++    Vp = (V - 128);
++    Ypp = 9535 * Yp;
++
++    oB = (Ypp + 16531 * Up) >> 11;
++    oG = (Ypp - 6660 * Vp - 3203 * Up) >> 11;
++    oR = (Ypp + 13074 * Vp) >> 11;
++    if (oR > 1023) oR = 1023;
++    if (oR < 0) oR = 0;
++    if (oG > 1023) oG = 1023;
++    if (oG < 0) oG = 0;
++    if (oB > 1023) oB = 1023;
++    if (oB < 0) oB = 0;
++    *R = (unsigned short)oR;
++    *G = (unsigned short)oG;
++    *B = (unsigned short)oB;
++}
++
++void SwImageConverter::convertBayerBlock(unsigned int x, unsigned int y,
++    unsigned int width, unsigned int height,
++    unsigned short bayer_data[4], unsigned char *out_buf,
++    unsigned int src_fmt, unsigned int dst_fmt)
++{
++    unsigned char *Ybase;
++    unsigned char *UVbase;
++    unsigned char Y, U, V;
++    unsigned short R, Gr, Gb, B;
++    switch (src_fmt) {
++        case V4L2_PIX_FMT_SRGGB8: R = bayer_data[0] << 2; Gr = bayer_data[1] << 2; Gb = bayer_data[2] << 2; B = bayer_data[3] << 2; break;
++        case V4L2_PIX_FMT_SGRBG8: Gr = bayer_data[0] << 2; R = bayer_data[1] << 2; B = bayer_data[2] << 2; Gb = bayer_data[3] << 2; break;
++        case V4L2_PIX_FMT_SGBRG8: Gb = bayer_data[0] << 2; B = bayer_data[1] << 2; R = bayer_data[2] << 2; Gr = bayer_data[3] << 2; break;
++        case V4L2_PIX_FMT_SBGGR8: B = bayer_data[0] << 2; Gb = bayer_data[1] << 2; Gr = bayer_data[2] << 2; R = bayer_data[3] << 2; break;
++        case V4L2_PIX_FMT_SRGGB10: R = bayer_data[0]; Gr = bayer_data[1]; Gb = bayer_data[2]; B = bayer_data[3]; break;
++        case V4L2_PIX_FMT_SGRBG10: Gr = bayer_data[0]; R = bayer_data[1]; B = bayer_data[2]; Gb = bayer_data[3]; break;
++        case V4L2_PIX_FMT_SGBRG10: Gb = bayer_data[0]; B = bayer_data[1]; R = bayer_data[2]; Gr = bayer_data[3]; break;
++        case V4L2_PIX_FMT_SBGGR10: B = bayer_data[0]; Gb = bayer_data[1]; Gr = bayer_data[2]; R = bayer_data[3]; break;
++        case V4L2_PIX_FMT_SRGGB12: R = bayer_data[0] >> 2; Gr = bayer_data[1] >> 2; Gb = bayer_data[2] >> 2; B = bayer_data[3] >> 2; break;
++        case V4L2_PIX_FMT_SGRBG12: Gr = bayer_data[0] >> 2; R = bayer_data[1] >> 2; B = bayer_data[2] >> 2; Gb = bayer_data[3] >> 2; break;
++        case V4L2_PIX_FMT_SGBRG12: Gb = bayer_data[0] >> 2; B = bayer_data[1] >> 2; R = bayer_data[2] >> 2; Gr = bayer_data[3] >> 2; break;
++        case V4L2_PIX_FMT_SBGGR12: B = bayer_data[0] >> 2; Gb = bayer_data[1] >> 2; Gr = bayer_data[2] >> 2; R = bayer_data[3] >> 2; break;
++        default: return;
++    }
++
++    int dstStride = CameraUtils::getStride(dst_fmt, width);
++    switch(dst_fmt) {
++        case V4L2_PIX_FMT_SRGGB8:
++            out_buf[y * dstStride + x] = (R >> 2);
++            out_buf[y * dstStride + x + 1] = (Gr >> 2);
++            out_buf[(y + 1) * dstStride + x] = (Gb >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
++            break;
++        case V4L2_PIX_FMT_SGRBG8:
++            out_buf[y * dstStride + x] = (Gr >> 2);
++            out_buf[y * dstStride + x + 1] = (R >> 2);
++            out_buf[(y + 1) * dstStride + x] = (B >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (Gb >> 2);
++            break;
++        case V4L2_PIX_FMT_SGBRG8:
++            out_buf[y * dstStride + x] = (Gb >> 2);
++            out_buf[y * dstStride + x + 1] = (B >> 2);
++            out_buf[(y + 1) * dstStride + x] = (R >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (Gr >> 2);
++            break;
++        case V4L2_PIX_FMT_SBGGR8:
++            out_buf[y * dstStride + x] = (B >> 2);
++            out_buf[y * dstStride + x + 1] = (Gb >> 2);
++            out_buf[(y + 1) * dstStride + x] = (Gr >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
++            break;
++        case V4L2_PIX_FMT_SRGGB10:
++            *((unsigned short *) out_buf + y * dstStride + x) = R;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gr;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gb;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
++            break;
++        case V4L2_PIX_FMT_SGRBG10:
++            *((unsigned short *) out_buf + y * dstStride + x) = Gr;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gb;
++            break;
++        case V4L2_PIX_FMT_SGBRG10:
++            *((unsigned short *) out_buf + y * dstStride + x) = Gb;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gr;
++            break;
++        case V4L2_PIX_FMT_SBGGR10:
++            *((unsigned short *) out_buf + y * dstStride + x) = B;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gb;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gr;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
++            break;
++        case V4L2_PIX_FMT_NV12:
++            Ybase = out_buf;
++            UVbase = Ybase + dstStride * height;
++            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
++            Ybase[y * dstStride + x] = Ybase[y * dstStride + x + 1] =
++                Ybase[(y + 1) * dstStride + x] = Ybase[(y + 1) * dstStride + x + 1] = Y;
++            UVbase[y / 2 * dstStride + x / 2 * 2] = U;
++            UVbase[y / 2 * dstStride + x / 2 * 2 + 1] = V;
++            break;
++        case V4L2_PIX_FMT_UYVY:
++            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
++            out_buf[y * dstStride + x * 2] = U;
++            out_buf[y * dstStride + x * 2 + 1] = Y;
++            out_buf[y * dstStride + x * 2 + 2] = V;
++            out_buf[y * dstStride + x * 2 + 3] = Y;
++            out_buf[(y + 1) * dstStride + x * 2] = U;
++            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y;
++            out_buf[(y + 1) * dstStride + x * 2 + 2] = V;
++            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y;
++            break;
++        case V4L2_PIX_FMT_YUYV:
++            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
++            out_buf[y * dstStride + x * 2] = Y;
++            out_buf[y * dstStride + x * 2 + 1] = U;
++            out_buf[y * dstStride + x * 2 + 2] = Y;
++            out_buf[y * dstStride + x * 2 + 3] = V;
++            out_buf[(y + 1) * dstStride + x * 2] = Y;
++            out_buf[(y + 1) * dstStride + x * 2 + 1] = U;
++            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y;
++            out_buf[(y + 1) * dstStride + x * 2 + 3] = V;
++            break;
++        case V4L2_PIX_FMT_YUV420:
++        {
++            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
++            Ybase = out_buf;
++            uint8_t* UBase = out_buf + dstStride * height;
++            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
++            Ybase[y * dstStride + x] = Y;
++            Ybase[y * dstStride + x + 1] = Y;
++            Ybase[(y + 1) * dstStride + x] = Y;
++            Ybase[(y + 1) * dstStride + x + 1] = Y;
++            if (y % 4 == 0) {
++                UBase[y / 4 * dstStride + x / 2] = U;
++                VBase[y / 4 * dstStride + x / 2] = V;
++            } else {
++                UBase[y / 4 * dstStride + width / 2 + x / 2] = U;
++                VBase[y / 4 * dstStride + width / 2 + x / 2] = V;
++            }
++            break;
++        }
++        default:
++            break;
++    }
++}
++
++void SwImageConverter::convertYuvBlock(unsigned int x, unsigned int y,
++    unsigned int width, unsigned int height,
++    unsigned char *in_buf, unsigned char *out_buf,
++    unsigned int src_fmt, unsigned int dst_fmt)
++{
++    unsigned char *YBase;
++    unsigned char *UVBase;
++    unsigned char Y[4];
++    unsigned char U[4];
++    unsigned char V[4];
++    unsigned short R, G, B;
++    int srcStride = CameraUtils::getStride(src_fmt, width);
++
++    switch(src_fmt) {
++        case V4L2_PIX_FMT_NV12:
++            YBase = in_buf;
++            UVBase = in_buf + srcStride * height;
++            Y[0] = YBase[y * srcStride + x];
++            Y[1] = YBase[y * srcStride + x + 1];
++            Y[2] = YBase[(y + 1) * srcStride + x];
++            Y[3] = YBase[(y + 1) * srcStride + x + 1];
++            U[0] = U[1] = U[2] = U[3] = UVBase[y / 2 * srcStride + x / 2 * 2];
++            V[0] = V[1] = V[2] = V[3] = UVBase[y / 2 * srcStride + x / 2 * 2 + 1];
++            break;
++        case V4L2_PIX_FMT_UYVY:
++            Y[0] = in_buf[y * srcStride + x * 2 + 1];
++            Y[1] = in_buf[y * srcStride + x * 2 + 3];
++            Y[2] = in_buf[(y + 1) * srcStride + x * 2 + 1];
++            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
++            U[0] = U[1] = in_buf[y * srcStride + x * 2];
++            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2];
++            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 2];
++            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
++            break;
++        case V4L2_PIX_FMT_YUYV:
++            Y[0] = in_buf[y * srcStride + x * 2];
++            Y[1] = in_buf[y * srcStride + x * 2 + 2];
++            Y[2] = in_buf[(y + 1) * srcStride + x * 2];
++            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
++            U[0] = U[1] = in_buf[y * srcStride + x * 2 + 1];
++            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2 + 1];
++            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 3];
++            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
++            break;
++        default:
++            return;
++    }
++
++    int dstStride = CameraUtils::getStride(dst_fmt, width);
++    switch(dst_fmt) {
++        case V4L2_PIX_FMT_NV12:
++            YBase = out_buf;
++            UVBase = out_buf + dstStride * height;
++            YBase[y * dstStride + x] = Y[0];
++            YBase[y * dstStride + x + 1] = Y[1];
++            YBase[(y + 1) * dstStride + x] = Y[2];
++            YBase[(y + 1) * dstStride + x + 1] = Y[3];
++            UVBase[y / 2 * dstStride + x / 2 * 2] = U[0];
++            UVBase[y / 2 * dstStride + x / 2 * 2 + 1] = V[0];
++            break;
++        case V4L2_PIX_FMT_UYVY:
++            out_buf[y * dstStride + x * 2 + 1] = Y[0];
++            out_buf[y * dstStride + x * 2 + 3] = Y[1];
++            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y[2];
++            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y[3];
++            out_buf[y * dstStride + x * 2] = U[0];
++            out_buf[(y + 1) * dstStride + x * 2] = U[2];
++            out_buf[y * dstStride + x * 2 + 2] = V[0];
++            out_buf[(y + 1) * dstStride + x * 2 + 2] = V[2];
++            break;
++        case V4L2_PIX_FMT_YUYV:
++            out_buf[y * dstStride + x * 2] = Y[0];
++            out_buf[y * dstStride + x * 2 + 2] = Y[1];
++            out_buf[(y + 1) * dstStride + x * 2] = Y[2];
++            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y[3];
++            out_buf[y * dstStride + x * 2 + 1] = U[0];
++            out_buf[(y + 1) * dstStride + x * 2 + 1] = U[2];
++            out_buf[y * dstStride + x * 2 + 3] = V[0];
++            out_buf[(y + 1) * dstStride + x * 2 + 3] = V[2];
++            break;
++        case V4L2_PIX_FMT_YUV420:
++        {
++            YBase = out_buf;
++            uint8_t* UBase = out_buf + dstStride * height;
++            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
++            YBase[y * dstStride + x] = Y[0];
++            YBase[y * dstStride + x + 1] = Y[1];
++            YBase[(y + 1) * dstStride + x] = Y[2];
++            YBase[(y + 1) * dstStride + x + 1] = Y[3];
++            if (y % 4 == 0) {
++                UBase[y / 4 * dstStride + x / 2] = (U[0] + U[2]) / 2;
++                VBase[y / 4 * dstStride + x / 2] = (V[0] + V[2]) / 2;
++            } else {
++                UBase[y / 4 * dstStride + width / 2 + x / 2] = (U[0] + U[2]) / 2;
++                VBase[y / 4 * dstStride + width / 2 + x / 2] = (V[0] + V[2]) / 2;
++            }
++            break;
++        }
++        case V4L2_PIX_FMT_SRGGB8:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            out_buf[y * dstStride + x] = (R >> 2);
++            out_buf[y * dstStride + x + 1] = (G >> 2);
++            out_buf[(y + 1) * dstStride + x] = (G >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
++            break;
++        case V4L2_PIX_FMT_SGRBG8:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            out_buf[y * dstStride + x] = (G >> 2);
++            out_buf[y * dstStride + x + 1] = (R >> 2);
++            out_buf[(y + 1) * dstStride + x] = (B >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
++            break;
++        case V4L2_PIX_FMT_SGBRG8:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            out_buf[y * dstStride + x] = (G >> 2);
++            out_buf[y * dstStride + x + 1] = (B >> 2);
++            out_buf[(y + 1) * dstStride + x] = (R >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
++            break;
++        case V4L2_PIX_FMT_SBGGR8:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            out_buf[y * dstStride + x] = (B >> 2);
++            out_buf[y * dstStride + x + 1] = (G >> 2);
++            out_buf[(y + 1) * dstStride + x] = (G >> 2);
++            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
++            break;
++        case V4L2_PIX_FMT_SRGGB10:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            *((unsigned short *) out_buf + y * dstStride + x) = R;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
++            break;
++        case V4L2_PIX_FMT_SGRBG10:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            *((unsigned short *) out_buf + y * dstStride + x) = G;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
++            break;
++        case V4L2_PIX_FMT_SGBRG10:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            *((unsigned short *) out_buf + y * dstStride + x) = G;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
++            break;
++        case V4L2_PIX_FMT_SBGGR10:
++            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
++            *((unsigned short *) out_buf + y * dstStride + x) = B;
++            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
++            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
++            break;
++        default:
++            return;
++    }
++}
++
++int SwImageConverter::convertFormat(unsigned int width, unsigned int height,
++                        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
++                        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt)
++{
++    CheckError((inBuf == nullptr || outBuf == nullptr), BAD_VALUE, "Invalid input(%p) or output buffer(%p)", inBuf, outBuf);
++
++    unsigned int x, y;
++    unsigned short bayer_data[4];
++
++    LOG2("%s srcFmt %s => dstFmt %s %dx%d", __func__,
++         CameraUtils::format2string(srcFmt).c_str(),
++         CameraUtils::format2string(dstFmt).c_str(), width, height);
++
++    if (dstFmt == srcFmt) {
++        // No need do format convertion.
++        LOG2("No conversion needed");
++        MEMCPY_S(outBuf, outLength, inBuf, inLength);
++        return 0;
++    }
++
++    // for not vector raw
++    int srcStride = CameraUtils::getStride(srcFmt, width);
++    for(y = 0; y < height; y += 2) {
++        for(x = 0; x < width; x += 2) {
++            if(CameraUtils::isRaw(srcFmt)) {
++                if(CameraUtils::getBpp(srcFmt) == 8) {
++                    bayer_data[0] = inBuf[y * srcStride + x];
++                    bayer_data[1] = inBuf[y * srcStride + x + 1];
++                    bayer_data[2] = inBuf[(y + 1) * srcStride + x];
++                    bayer_data[3] = inBuf[(y + 1) * srcStride + x + 1];
++                } else {
++                    int offset = srcStride / (CameraUtils::getBpp(srcFmt) / 8);
++                    bayer_data[0] = *((unsigned short *) inBuf + y * offset + x);
++                    bayer_data[1] = *((unsigned short *) inBuf + y * offset + x + 1);
++                    bayer_data[2] = *((unsigned short *) inBuf + (y + 1) * offset + x);
++                    bayer_data[3] =
++                        *((unsigned short *) inBuf + (y + 1) * offset + x + 1);
++                }
++                convertBayerBlock(x, y, width, height, bayer_data, outBuf, srcFmt, dstFmt);
++            } else {
++                convertYuvBlock(x, y, width, height, inBuf, outBuf, srcFmt, dstFmt);
++            }
++        }
++    }
++    return 0;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
+new file mode 100644
+index 000000000000..591f5b4029a8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
+@@ -0,0 +1,42 @@
++/*
++ * Copyright (C) 2016-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++namespace icamera {
++
++namespace SwImageConverter {
++    void RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
++         unsigned char *Y, unsigned char *U, unsigned char *V);
++
++    void YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
++        unsigned short *R, unsigned short *G, unsigned short *B);
++
++    void convertBayerBlock(unsigned int x, unsigned int y,
++        unsigned int width, unsigned int height, unsigned short bayer_data[4],
++        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
++
++    void convertYuvBlock(unsigned int x, unsigned int y,
++        unsigned int width, unsigned int height, unsigned char *in_buf,
++        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
++
++    //convert the buffer from the src_fmt to the dst_fmt
++    int convertFormat(unsigned int width, unsigned int height,
++        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
++        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt);
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.cpp b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
+new file mode 100644
+index 000000000000..919f5a1cf6e0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
+@@ -0,0 +1,222 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Thread"
++
++#include "Errors.h"
++#include "Thread.h"
++#include "CameraLog.h"
++
++namespace icamera {
++
++int Condition::waitRelative(ConditionLock& lock, int64_t reltime) {
++    std::cv_status ret = mCondition.wait_for(lock, std::chrono::nanoseconds(reltime));
++    return ret == std::cv_status::timeout ? TIMED_OUT : OK;
++}
++
++Thread::Thread() : mState(NOT_STARTED), mThread(nullptr), mPriority(PRIORITY_DEFAULT)
++{
++    LOG1("%s", __func__);
++}
++
++Thread::~Thread()
++{
++    LOG1("%s", __func__);
++
++    requestExitAndWait();
++
++    delete mThread;
++}
++
++int Thread::run(std::string name, int priority)
++{
++    LOG1("%s", __func__);
++
++    AutoMutex lock(mLock);
++
++    if (mState != NOT_STARTED && mState != EXITED) {
++        LOGW("Cannot start thread(%s) in state(%d).", name.c_str(), mState);
++        return INVALID_OPERATION;
++    }
++
++    // Thread can be restarted only if the previous one has exited.
++    // Release the previous thread first if it's created already.
++    delete mThread;
++
++    mThread = new std::thread(_threadLoop, this);
++    mThread->detach();
++    mId = mThread->get_id();
++    mName = name;
++    mPriority = priority;
++    mState = RUNNING;
++
++    mStartCondition.signal();
++
++    return OK;
++}
++
++void Thread::requestExit()
++{
++    LOG1("%s", __func__);
++
++    AutoMutex lock(mLock);
++
++    if (mState == RUNNING) {
++        mState = EXITING;
++    }
++}
++
++int Thread::requestExitAndWait()
++{
++    LOG1("%s", __func__);
++
++    ConditionLock lock(mLock);
++
++    // No need exit if it's not started.
++    if (mState == NOT_STARTED) {
++        return NO_INIT;
++    }
++
++    // The function cannot be called by same thread.
++    if (std::this_thread::get_id() == mId) {
++        LOGE("The thread itself cannot call its own requestExitAndWait function.");
++        return WOULD_BLOCK;
++    }
++
++    while (mState != EXITED) {
++        mState = EXITING;
++        mExitedCondition.wait(lock);
++    }
++
++    return OK;
++}
++
++int Thread::join()
++{
++    LOG1("%s", __func__);
++
++    ConditionLock lock(mLock);
++
++    // No need join if it's not started.
++    if (mState == NOT_STARTED) {
++        return NO_INIT;
++    }
++
++    // The function cannot be called by same thread.
++    if (std::this_thread::get_id() == mId) {
++        LOGE("The thread itself cannot call its own join function.");
++        return WOULD_BLOCK;
++    }
++
++    while (mState != EXITED) {
++        mExitedCondition.wait(lock);
++    }
++
++    return OK;
++}
++
++bool Thread::isRunning() const
++{
++    AutoMutex lock(mLock);
++    // A thread in EXITING also means it's still running, but it's going to exit.
++    return mState == RUNNING || mState == EXITING;
++}
++
++bool Thread::isExiting() const
++{
++    AutoMutex lock(mLock);
++    return mState == EXITING;
++}
++
++bool Thread::isExited() const
++{
++    AutoMutex lock(mLock);
++    return mState == EXITED;
++}
++
++void Thread::_threadLoop(Thread* self)
++{
++    {
++        // Wait for function "run" to finish.
++        // If the thread is going to exit, then no need to wait anymore.
++        ConditionLock lock(self->mLock);
++        while (self->mState != RUNNING && self->mState != EXITING) {
++            self->mStartCondition.wait(lock);
++        }
++
++        if (self->mState == EXITING) {
++            self->mState = EXITED;
++            self->mExitedCondition.broadcast();
++            return;
++        }
++
++        self->setProperty();
++    }
++
++    while (true) {
++        bool loopAgain = self->threadLoop();
++
++        AutoMutex lock(self->mLock);
++        if (!loopAgain || self->mState == EXITING) {
++            self->mState = EXITED;
++            self->mExitedCondition.broadcast();
++            return;
++        }
++    }
++}
++
++// Platform specific implementation.
++#ifdef HAVE_PTHREADS
++#include <pthread.h>
++#include <sys/resource.h>
++
++void Thread::setProperty()
++{
++    LOG1("%s, name:%s, priority:%d", __func__, mName.c_str(), mPriority);
++
++#if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12
++    // Set thread's name
++    std::string threadName = mName.empty() ? "NO_NAME" : mName;
++    if (mName.size() > MAX_THREAD_NAME_LEN) {
++        threadName = mName.substr(0, MAX_THREAD_NAME_LEN);
++        LOG2("The thread name(%s) is too long, modify it to %s", mName.c_str(), threadName.c_str());
++    }
++    pthread_setname_np(pthread_self(), threadName.c_str());
++#endif
++
++    // Set thread's priority
++    setpriority(PRIO_PROCESS, 0, mPriority);
++
++    const int policy = SCHED_OTHER;
++    int min = sched_get_priority_min(policy);
++    int max = sched_get_priority_max(policy);
++    LOG1("Priority range:(%d-%d)", min, max);
++
++    if (mPriority < min) mPriority = min;
++    if (mPriority > max) mPriority = max;
++
++    sched_param param;
++    param.sched_priority = mPriority;
++
++    int ret = pthread_setschedparam(pthread_self(), policy, &param);
++    LOG1("pthread_setschedparam ret:%d", ret);
++}
++#else
++#warning "Setting thread's property is not implemented yet on this platform."
++#endif
++
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.h b/camera/hal/intel/ipu6/src/iutils/Thread.h
+new file mode 100644
+index 000000000000..91623dca8b21
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Thread.h
+@@ -0,0 +1,198 @@
++/*
++ * Copyright (C) 2017-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++#include <thread>
++#include <mutex>
++#include <condition_variable>
++
++namespace icamera {
++
++typedef std::mutex Mutex;
++typedef std::lock_guard<std::mutex> AutoMutex;
++typedef std::unique_lock<std::mutex> ConditionLock;
++
++enum {
++    PRIORITY_LOWEST = 19,
++    PRIORITY_BACKGROUND = 10,
++    PRIORITY_NORMAL = 0,
++    PRIORITY_FOREGROUND = -2,
++    PRIORITY_DISPLAY = -4,
++    PRIORITY_URGENT_DISPLAY = -8,
++    PRIORITY_AUDIO = -16,
++    PRIORITY_URGENT_AUDIO = -19,
++    PRIORITY_HIGHEST = -20,
++    PRIORITY_DEFAULT = 0,
++    PRIORITY_MORE_FAVORABLE = -1,
++    PRIORITY_LESS_FAVORABLE = 1,
++};
++
++class Condition {
++public:
++    Condition() {}
++    ~Condition() {}
++
++    /**
++     * Wait on the condition variable. MUST be locked with ConditionLock before being called.
++     *
++     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
++     */
++    void wait(ConditionLock& lock) {
++        mCondition.wait(lock);
++    }
++
++    /**
++     * Wait on the condition variable with a period of time.
++     *
++     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
++     * \param[in] reltime: The maximum time to spend waiting.
++     *
++     * \return TIMED_OUT if it's not notified to wake up within reltime, otherwise return OK.
++     */
++    int waitRelative(ConditionLock& lock, int64_t reltime);
++
++    /**
++     * Wake up one thread that is waiting on the condition variable.
++     */
++    void signal() { mCondition.notify_one(); }
++
++    /**
++     * Wake up all threads that are waiting on the condition variable.
++     */
++    void broadcast() { mCondition.notify_all(); }
++
++private:
++    Condition(const Condition& other) = delete;
++    Condition& operator=(const Condition&) = delete;
++
++    std::condition_variable mCondition;
++};
++
++/**
++ * Thread is a wrapper class to std::thread
++ *
++ * Thread helps manager the thread's state and make the std::thread is easier to used.
++ * Thread also hides the platform specific implementation details.
++ */
++class Thread {
++public:
++    Thread();
++    virtual ~Thread();
++
++    /**
++     * Start the thread.
++     */
++    virtual int run(std::string name = ("nameless"), int priority = PRIORITY_DEFAULT);
++
++    /**
++     * Ask this object's thread to exit. This function is asynchronous, so when it
++     * returns the thread might still be running.
++     */
++    virtual void requestExit();
++
++    /**
++     * Wait until this object's thread exits. Returns immediately if not yet running.
++     *
++     * join will not trigger the thread to exit, it just wait for the thread exits.
++     * Do not call it from this object's thread, will return WOULD_BLOCK in that case.
++     */
++    int join();
++
++    /**
++     * Ask this object's thread to exit. This function is synchronous, so when it
++     * returns the thread must exit already.
++     * It has same effect with calling requestExit and join combined.
++     *
++     * Do not call from this object's thread, will return WOULD_BLOCK in that case.
++     */
++    int requestExitAndWait();
++
++    /**
++     * Indicates whether this thread is running or not.
++     */
++    bool isRunning() const;
++
++    /**
++     * Indicates whether this thread is going to exit or not.
++     */
++    bool isExiting() const;
++
++    /**
++     * Indicates whether this thread exited or not.
++     */
++    bool isExited() const;
++
++private:
++
++    /**
++     * threadLoop is the function which is called by the thread.
++     * The derived class MUST override this function. The thread starts its life here.
++     *
++     * There are two ways of using the thread object:
++     * 1. loop: threadLoop will be called again as long as it returns true,
++     *          and requestExit() wasn't called.
++     * 2. once: If threadLoop() returns false, the thread will exit upon return.
++     *
++     * There are three ways of exiting the thread.
++     * 1. threadLoop return false.
++     * 2. requestExit is called.
++     * 3. requestExitAndWait is called.
++     */
++    virtual bool threadLoop() { return false; }
++
++private:
++    Thread(const Thread& other) = delete;
++    Thread& operator=(const Thread&) = delete;
++
++    /**
++     * The function which is used to create the std::thread.
++     */
++    static void _threadLoop(Thread* self);
++
++    /**
++     * Set thread's property such as thread's name or priority.
++     */
++    void setProperty();
++
++private:
++    enum {
++        NOT_STARTED,
++        RUNNING,
++        EXITING,
++        EXITED,
++    } mState;
++
++    // The max length for thread name is 15.
++    static const int MAX_THREAD_NAME_LEN = 15;
++    std::thread* mThread;
++    std::string mName;
++    std::thread::id mId;
++    int mPriority;
++
++    // A lock used to protect internal data and API accessing.
++    mutable Mutex mLock;
++
++    // To make sure the thread not dead before "run" not finish.
++    Condition mStartCondition;
++
++    // To make sure API like join be able to wait until thread exits.
++    Condition mExitedCondition;
++};
++
++} // namespace icamera
++
+diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.cpp b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
+new file mode 100644
+index 000000000000..d50ab513eb2e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2014-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Trace"
++
++#include <errno.h>
++#include <fcntl.h>
++#include <limits.h>
++#include <pthread.h>
++#include <stdbool.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/types.h>
++
++#include "Trace.h"
++#include "iutils/CameraLog.h"
++
++namespace icamera {
++
++std::atomic<int>        atrace_is_ready(0);
++uint64_t                atrace_enabled_tags  = ATRACE_TAG_NOT_READY;
++int                     atrace_marker_fd     = -1;
++static pthread_once_t   atrace_once_control  = PTHREAD_ONCE_INIT;
++
++static void atrace_init_once()
++{
++    atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY);
++    if (atrace_marker_fd == -1) {
++        ATRACE_LOGE("atrace %s open error: %s!\n", __func__, strerror(errno));
++        return;
++    }
++    atrace_enabled_tags = ATRACE_TAG_ALWAYS;
++    atrace_is_ready = 1;
++}
++
++void atrace_setup()
++{
++    pthread_once(&atrace_once_control, atrace_init_once);
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.h b/camera/hal/intel/ipu6/src/iutils/Trace.h
+new file mode 100644
+index 000000000000..849a6f19106b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Trace.h
+@@ -0,0 +1,241 @@
++/*
++ * Copyright (C) 2014-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <atomic>
++
++#include <inttypes.h>
++#include <stdbool.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <sys/cdefs.h>
++#include <sys/types.h>
++#include <unistd.h>
++#include <errno.h>
++#include <string.h>
++
++namespace icamera {
++
++#ifndef ATRACE_NO_LOG
++#define ATRACE_LOGE(format, args...) printf(format, ##args)
++#else
++#define ATRACE_LOGE()
++#endif
++
++#define CAMERA_PRId32 "d"
++#define CAMERA_PRId64 "I64d"
++
++#define ATRACE_MESSAGE_LENGTH 1024
++#define PROPERTY_VALUE_MAX 1024
++/**
++ * The ATRACE_TAG macro can be defined before including this header to trace
++ * using one of the tags defined below.  It must be defined to one of the
++ * following ATRACE_TAG_* macros.  The trace tag is used to filter tracing in
++ * userland to avoid some of the runtime cost of tracing when it is not desired.
++ *
++ * Defining ATRACE_TAG to be ATRACE_TAG_ALWAYS will result in the tracing always
++ * being enabled - this should ONLY be done for debug code, as userland tracing
++ * has a performance cost even when the trace is not being recorded.  Defining
++ * ATRACE_TAG to be ATRACE_TAG_NEVER or leaving ATRACE_TAG undefined will result
++ * in the tracing always being disabled.
++ */
++#define ATRACE_TAG_NEVER            0       // This tag is never enabled.
++#define ATRACE_TAG_ALWAYS           (1<<0)  // This tag is always enabled.
++#define ATRACE_TAG_LAST             ATRACE_TAG_ALWAYS
++
++// Reserved for initialization.
++#define ATRACE_TAG_NOT_READY        (1LL<<63)
++
++#define ATRACE_TAG_VALID_MASK ((ATRACE_TAG_LAST - 1) | ATRACE_TAG_LAST)
++
++// define the ATRACE_TAG to ALWAYS for nestdemo.
++#define ATRACE_TAG ATRACE_TAG_ALWAYS
++
++/**
++ * Opens the trace file for writing and reads the property for initial tags.
++ * The atrace.tags.enableflags property sets the tags to trace.
++ * This function should not be explicitly called, the first call to any normal
++ * trace function will cause it to be run safely.
++ */
++void atrace_setup();
++
++/**
++ * Flag indicating whether setup has been completed, initialized to 0.
++ * Nonzero indicates setup has completed.
++ * Note: This does NOT indicate whether or not setup was successful.
++ */
++extern std::atomic<int> atrace_is_ready;
++
++/**
++ * Set of ATRACE_TAG flags to trace for, initialized to ATRACE_TAG_NOT_READY.
++ * A value of zero indicates setup has failed.
++ * Any other nonzero value indicates setup has succeeded, and tracing is on.
++ */
++extern uint64_t atrace_enabled_tags;
++
++/**
++ * Handle to the kernel's trace buffer, initialized to -1.
++ * Any other value indicates setup has succeeded, and is a valid fd for tracing.
++ */
++extern int atrace_marker_fd;
++
++/**
++ * atrace_init readies the process for tracing by opening the trace_marker file.
++ * Calling any trace function causes this to be run, so calling it is optional.
++ * This can be explicitly run to avoid setup delay on first trace function.
++ */
++#define ATRACE_INIT() atrace_init()
++static inline void atrace_init()
++{
++    if (!atrace_is_ready.load()) {
++        atrace_setup();
++    }
++}
++
++/**
++ * Get the mask of all tags currently enabled.
++ * It can be used as a guard condition around more expensive trace calculations.
++ * Every trace function calls this, which ensures atrace_init is run.
++ */
++#define ATRACE_GET_ENABLED_TAGS() atrace_get_enabled_tags()
++static inline uint64_t atrace_get_enabled_tags()
++{
++    atrace_init();
++    return atrace_enabled_tags;
++}
++
++/**
++ * Test if a given tag is currently enabled.
++ * Returns nonzero if the tag is enabled, otherwise zero.
++ * It can be used as a guard condition around more expensive trace calculations.
++ */
++#define ATRACE_ENABLED() atrace_is_tag_enabled(ATRACE_TAG)
++static inline uint64_t atrace_is_tag_enabled(uint64_t tag)
++{
++    return atrace_get_enabled_tags() & tag;
++}
++
++/**
++ * Trace the beginning of a context.  name is used to identify the context.
++ * This is often used to time function execution.
++ */
++#define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name)
++static inline void atrace_begin(uint64_t tag, const char* name)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char buf[ATRACE_MESSAGE_LENGTH];
++        ssize_t len;
++
++        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "B|%d|%s", static_cast<int>(getpid()), name);
++        if (write(atrace_marker_fd, buf, len) != len)
++            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
++    }
++}
++
++/**
++ * Trace the end of a context.
++ * This should match up (and occur after) a corresponding ATRACE_BEGIN.
++ */
++#define ATRACE_END() atrace_end(ATRACE_TAG)
++static inline void atrace_end(uint64_t tag)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char c = 'E';
++        if (write(atrace_marker_fd, &c, 1) !=1)
++            ATRACE_LOGE("atrace %s write error: %s!\n", __func__, strerror(errno));
++    }
++}
++
++/**
++ * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END
++ * contexts, asynchronous events do not need to be nested. The name describes
++ * the event, and the cookie provides a unique identifier for distinguishing
++ * simultaneous events. The name and cookie used to begin an event must be
++ * used to end it.
++ */
++#define ATRACE_ASYNC_BEGIN(name, cookie) \
++    atrace_async_begin(ATRACE_TAG, name, cookie)
++static inline void atrace_async_begin(uint64_t tag, const char* name,
++        int32_t cookie)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char buf[ATRACE_MESSAGE_LENGTH];
++        ssize_t len;
++
++        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "S|%d|%s|%" CAMERA_PRId32,
++                       static_cast<int>(getpid()), name, cookie);
++        if (write(atrace_marker_fd, buf, len) != len)
++            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
++    }
++}
++
++/**
++ * Trace the end of an asynchronous event.
++ * This should have a corresponding ATRACE_ASYNC_BEGIN.
++ */
++#define ATRACE_ASYNC_END(name, cookie) atrace_async_end(ATRACE_TAG, name, cookie)
++static inline void atrace_async_end(uint64_t tag, const char* name,
++        int32_t cookie)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char buf[ATRACE_MESSAGE_LENGTH];
++        ssize_t len;
++
++        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "F|%d|%s|%" CAMERA_PRId32,
++                       static_cast<int>(getpid()), name, cookie);
++        if (write(atrace_marker_fd, buf, len) != len)
++            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
++    }
++}
++
++/**
++ * Traces an integer counter value.  name is used to identify the counter.
++ * This can be used to track how a value changes over time.
++ */
++#define ATRACE_INT(name, value) atrace_int(ATRACE_TAG, name, value)
++static inline void atrace_int(uint64_t tag, const char* name, int32_t value)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char buf[ATRACE_MESSAGE_LENGTH];
++        ssize_t len;
++
++        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" CAMERA_PRId32,
++                       static_cast<int>(getpid()), name, value);
++        if (write(atrace_marker_fd, buf, len) != len)
++            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
++    }
++}
++
++/**
++ * Traces a 64-bit integer counter value.  name is used to identify the
++ * counter. This can be used to track how a value changes over time.
++ */
++#define ATRACE_INT64(name, value) atrace_int64(ATRACE_TAG, name, value)
++static inline void atrace_int64(uint64_t tag, const char* name, int64_t value)
++{
++    if (atrace_is_tag_enabled(tag)) {
++        char buf[ATRACE_MESSAGE_LENGTH];
++        ssize_t len;
++
++        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" PRId64 " " CAMERA_PRId64,
++                       static_cast<int>(getpid()), name, value);
++        if (write(atrace_marker_fd, buf, len) != len)
++            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
++    }
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.cpp b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
+new file mode 100644
+index 000000000000..d6d61f2c7c43
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
+@@ -0,0 +1,740 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Utils"
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <dlfcn.h>
++#include <dirent.h>
++#include <iostream>
++#include <fstream>
++#include <sstream>
++
++#include "PlatformData.h"
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "linux/media-bus-format.h"
++#include "linux/ipu-isys.h"
++
++using std::string;
++
++namespace icamera {
++
++int CameraUtils::getFileContent(const char* filename, char* buffer, int maxSize) {
++
++    std::ifstream stream(filename);
++
++    stream.seekg(0, std::ios::end);
++    long copyLength = stream.tellg();
++    stream.seekg(0, std::ios::beg);
++
++    if (copyLength > maxSize) {
++        copyLength = maxSize;
++    }
++
++    stream.read(buffer, copyLength);
++    return copyLength;
++}
++
++#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
++                                   | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
++
++enum FormatType {
++    FORMAT_RAW,
++    FORMAT_RAW_VEC,
++    FORMAT_YUV,
++    FORMAT_YUV_VEC,
++    FORMAT_RGB,
++    FORMAT_MBUS,
++    FORMAT_JPEG,
++    FORMAT_FOURCC,
++};
++
++struct FormatInfo {
++    int pixelCode;
++    const char* fullName;
++    const char* shortName;
++    int bpp;
++    FormatType type;
++};
++
++static const FormatInfo gFormatMapping[] = {
++    { V4L2_PIX_FMT_GREY, "V4L2_PIX_FMT_GREY", "GREY", 8, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SBGGR8, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG8, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG8, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB8, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SBGGR10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SBGGR12, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG12, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB12, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SBGGR10P, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG10P, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG10P, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB10P, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_NV12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_NV21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_NV16, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
++    { V4L2_PIX_FMT_YUYV, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
++    { V4L2_PIX_FMT_UYVY, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
++
++    { V4L2_PIX_FMT_YUV420, "V4L2_PIX_FMT_YUV420", "YUV420", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_YVU420, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_YUV422P, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
++
++    { V4L2_PIX_FMT_BGR24, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
++    { V4L2_PIX_FMT_BGR32, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_RGB24, "V4L2_PIX_FMT_RGB24", "RGB24", 24, FORMAT_RGB },
++    { V4L2_PIX_FMT_RGB32, "V4L2_PIX_FMT_RGB32", "RGB32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_XBGR32, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_XRGB32, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_RGB565, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
++
++    { V4L2_PIX_FMT_JPEG, "V4L2_PIX_FMT_JPEG", "JPG", 0, FORMAT_JPEG },
++
++    { V4L2_MBUS_FMT_SBGGR12_1X12, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGBRG12_1X12, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGRBG12_1X12, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SRGGB12_1X12, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS },
++
++    { V4L2_MBUS_FMT_SBGGR10_1X10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGBRG10_1X10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGRBG10_1X10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SRGGB10_1X10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS },
++
++    { V4L2_MBUS_FMT_SBGGR8_1X8, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGBRG8_1X8, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SGRBG8_1X8, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_SRGGB8_1X8, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS },
++
++    { V4L2_MBUS_FMT_UYVY8_1X16, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_YUYV8_1X16, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS },
++    { V4L2_MBUS_FMT_UYVY8_2X8, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS},
++
++    { MEDIA_BUS_FMT_RGB888_1X24, "MEDIA_BUS_FMT_RGB888_1X24", "RGB888_1X24", 0, FORMAT_MBUS },
++    { MEDIA_BUS_FMT_RGB565_1X16, "MEDIA_BUS_FMT_RGB565_1X16", "RGB565_1X16", 0, FORMAT_MBUS },
++    { MEDIA_BUS_FMT_YUYV12_1X24, "MEDIA_BUS_FMT_YUYV12_1X24", "YUYV12_1X24", 0, FORMAT_MBUS },
++    { MEDIA_BUS_FMT_SGRBG10_1X10, "MEDIA_BUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 0, FORMAT_MBUS },
++
++    { MEDIA_BUS_FMT_RGB888_1X32_PADHI, "MEDIA_BUS_FMT_RGB888_1X32_PADHI", "RGB888_1X32_PADHI", 0, FORMAT_MBUS },
++
++    { V4L2_FMT_IPU_ISYS_META, "V4L2_FMT_IPU_ISYS_META", "META_DATA", 0, FORMAT_MBUS },
++
++    { GET_FOURCC_FMT('y','0','3','2'), "y032", "y032", 24, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('N','V','1','2'), "YUV420_8_SP", "NV12", 12, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('I','Y','U','V'), "YUV420_8_PL", "IYUV", 12, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('b','V','0','K'), "bV0K", "bV0K", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('b','V','0','G'), "bV0G", "bV0G", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('V','4','2','0'), "YUV420_10_PL", "V420", 24, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('B','A','1','0'), "BA10", "BA10", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('B','A','1','2'), "BA12", "BA12", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('G','R','1','0'), "GR10", "GR10", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('C','S','L','6'), "GRBG_12_LI", "CSL6", 15, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('P','0','1','0'), "P010", "P010", 24, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('Y','U','Y','2'), "YUY2", "YUY2", 16, FORMAT_FOURCC },
++    { GET_FOURCC_FMT('G','R','B','G'), "GRBG", "GRBG", 8, FORMAT_FOURCC },
++};
++
++struct TuningModeStringInfo {
++    TuningMode mode;
++    const char *str;
++};
++
++static const TuningModeStringInfo TuningModeStringInfoTable[] = {
++    { TUNING_MODE_VIDEO,               "VIDEO" },
++    { TUNING_MODE_VIDEO_ULL,           "VIDEO-ULL" },
++    { TUNING_MODE_VIDEO_CUSTOM_AIC,    "VIDEO-CUSTOM_AIC" },
++    { TUNING_MODE_VIDEO_LL,            "VIDEO-LL" },
++    { TUNING_MODE_VIDEO_REAR_VIEW,     "VIDEO-REAR-VIEW" },
++    { TUNING_MODE_VIDEO_HITCH_VIEW,    "VIDEO-HITCH-VIEW" },
++    { TUNING_MODE_STILL_CAPTURE,       "STILL_CAPTURE" },
++};
++
++const char *CameraUtils::tuningMode2String(TuningMode mode)
++{
++    int size = ARRAY_SIZE(TuningModeStringInfoTable);
++    for (int i = 0; i < size; i++) {
++        if (TuningModeStringInfoTable[i].mode == mode) {
++            return TuningModeStringInfoTable[i].str;
++        }
++    }
++    LOGW("Invalid TuningMode %d, use string VIDEO as default", mode);
++    return TuningModeStringInfoTable[0].str;
++}
++
++TuningMode CameraUtils::string2TuningMode(const char *str)
++{
++    int size = ARRAY_SIZE(TuningModeStringInfoTable);
++    for (int i = 0; i < size; i++) {
++        if (strcmp(TuningModeStringInfoTable[i].str, str) == 0) {
++            return TuningModeStringInfoTable[i].mode;
++        }
++    }
++    LOGW("Invalid TuningMode string %s, use TUNING_MODE_VIDEO as default", str);
++    return TuningModeStringInfoTable[0].mode;
++}
++
++const char *CameraUtils::pixelCode2String(int code)
++{
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (gFormatMapping[i].pixelCode == code) {
++            return gFormatMapping[i].fullName;
++        }
++    }
++
++    LOGE("Invalid Pixel Format: %d", code);
++    return "INVALID FORMAT";
++}
++
++int CameraUtils::string2PixelCode(const char *code)
++{
++    CheckError(code == nullptr, -1, "Invalid null pixel format.");
++
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (strcmp(gFormatMapping[i].fullName, code) == 0) {
++            return gFormatMapping[i].pixelCode;
++        }
++    }
++
++    LOGE("Invalid Pixel Format: %s", code);
++    return -1;
++}
++
++int CameraUtils::string2IaFourccCode(const char *code)
++{
++    CheckError(code == nullptr, -1, "Invalid null pixel format.");
++
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (gFormatMapping[i].type == FORMAT_FOURCC){
++            if (!strcmp(gFormatMapping[i].fullName, code) ||
++                 !strcmp(gFormatMapping[i].shortName, code)) {
++                return gFormatMapping[i].pixelCode;
++            }
++        }
++    }
++
++    LOGE("Invalid Pixel Format: %s", code);
++    return -1;
++}
++
++const string CameraUtils::fourcc2String(int format4cc)
++{
++    char fourccBuf[5];
++    CLEAR(fourccBuf);
++    snprintf(fourccBuf, sizeof(fourccBuf), "%c%c%c%c", (format4cc >> 24) & 0xff,
++            (format4cc >> 16) & 0xff, (format4cc >> 8) & 0xff, format4cc & 0xff);
++
++    return string(fourccBuf);
++}
++
++std::string CameraUtils::format2string(int format)
++{
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            return std::string(gFormatMapping[i].shortName);
++        }
++    }
++
++    LOG2("%s, Not in our format list :%x", __func__, format);
++    return fourcc2String(format);
++}
++
++unsigned int CameraUtils::fourcc2UL(char *str4cc)
++{
++    CheckError(str4cc == nullptr, 0, "Invalid null string.");
++    CheckError(strlen(str4cc) != 4, 0, "Invalid string %s, should be 4cc.", str4cc);
++
++    return FOURCC_TO_UL(str4cc[0], str4cc[1], str4cc[2], str4cc[3]);
++}
++
++bool CameraUtils::isPlanarFormat(int format)
++{
++    return (format == V4L2_PIX_FMT_NV12 || format == V4L2_PIX_FMT_NV21
++         || format == V4L2_PIX_FMT_YUV420 || format == V4L2_PIX_FMT_YVU420
++         || format == V4L2_PIX_FMT_YUV422P || format == V4L2_PIX_FMT_NV16);
++}
++
++bool CameraUtils::isRaw(int format)
++{
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            // Both normal raw and vector raw treated as raw here.
++            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
++        }
++    }
++
++    return false;
++}
++
++int CameraUtils::getBpp(int format)
++{
++    int size = ARRAY_SIZE(gFormatMapping);
++    for (int i = 0; i < size; i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            return gFormatMapping[i].bpp;
++        }
++    }
++
++    LOGE("There is no bpp supplied for format %s", pixelCode2String(format));
++    return -1;
++}
++
++/**
++ * Get the stride which is also known as aligned bype per line in some context.
++ * Mainly used for locate the start of next line.
++ */
++int CameraUtils::getStride(int format, int width)
++{
++    int bpl = width * getBpp(format) / 8;
++    if (isPlanarFormat(format)) {
++        bpl = width;
++    }
++    return ALIGN_64(bpl);
++}
++
++/*
++ * Calc frame size for compression
++ */
++int CameraUtils::getCompressedFrameSize(int format, int width, int height)
++{
++   int alignedBpl = getStride(format, width);
++   int alignedHeight, imageBufferSize, frameSize;
++
++   switch (format) {
++       case V4L2_PIX_FMT_SBGGR8:
++       case V4L2_PIX_FMT_SGBRG8:
++       case V4L2_PIX_FMT_SGRBG8:
++       case V4L2_PIX_FMT_SRGGB8:
++       case V4L2_PIX_FMT_SBGGR10:
++       case V4L2_PIX_FMT_SGBRG10:
++       case V4L2_PIX_FMT_SGRBG10:
++       case V4L2_PIX_FMT_SRGGB10:
++       {
++           alignedBpl = ALIGN(alignedBpl, ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES);
++           alignedHeight = ALIGN(height, ISYS_COMPRESSION_HEIGHT_ALIGNMENT);
++           imageBufferSize = ALIGN(alignedBpl * alignedHeight, ISYS_COMPRESSION_PAGE_SIZE);
++           int singlePlanarTileStatusSize = CAMHAL_CEIL_DIV(((alignedBpl * alignedHeight / ISYS_COMPRESSION_TILE_SIZE_BYTES) *
++                                                                                               ISYS_COMPRESSION_TILE_STATUS_BITS), 8);
++           int singleTileStatusSize = ALIGN(singlePlanarTileStatusSize, ISYS_COMPRESSION_PAGE_SIZE);
++           LOG1("@%s: format:%s, aligned stride:%d, buffer height:%d, pixel buffer size:%d, single planner TS size:%d",
++                __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, singleTileStatusSize);
++           frameSize = imageBufferSize + singleTileStatusSize;
++           break;
++       }
++       case GET_FOURCC_FMT('V','4','2','0'):
++       case GET_FOURCC_FMT('I','Y','U','V'):
++       {
++           //alignedBpl needs accurate stride, not equivalent value from getStride()
++           alignedBpl = (format == GET_FOURCC_FMT('V','4','2','0')) ? width * 2 : width;
++           alignedBpl = ALIGN(alignedBpl, PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT);
++           alignedHeight = ALIGN(height, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
++           int alignBplUV = ALIGN(alignedBpl / UV_STRIDE_DIVIDER, PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT);
++           int alignHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
++           imageBufferSize = ALIGN((alignedBpl * alignedHeight + alignBplUV * alignHeightUV * 2), PSYS_COMPRESSION_PAGE_SIZE);
++
++           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeight / TILE_SIZE_YUV420_Y) *
++                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
++           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
++           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignBplUV * alignHeightUV / TILE_SIZE_YUV420_Y) *
++                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
++           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
++
++           LOG1("@%s: format:%s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, two tile_status_UV:%d",
++                       __func__, pixelCode2String(format), alignedBpl, alignedHeight,
++                       imageBufferSize, planarYTileStatus, planarUVTileStatus*2);
++           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus * 2;
++           break;
++       }
++       case V4L2_PIX_FMT_NV12:
++       {
++           int bpl = width;
++           alignedBpl = ALIGN(bpl, PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT);
++           alignedHeight = ALIGN(height, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
++           int alignedHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
++           int imageBufferSize = ALIGN(alignedBpl * (alignedHeight + alignedHeightUV), PSYS_COMPRESSION_PAGE_SIZE);
++
++           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl *  alignedHeight / TILE_SIZE_OFS8_10_LINEAR) *
++                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
++           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
++           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeightUV / TILE_SIZE_OFS8_10_LINEAR) *
++                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
++           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
++
++           LOG1("@%s: format: %s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, tile_status_UV:%d",
++                    __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, planarYTileStatus, planarUVTileStatus);
++           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus;
++           break;
++       }
++       default:
++           LOGE("@%s: unexpected format 0x%x in string %s, unsupported compression format", __func__, format, pixelCode2String(format));
++           frameSize = 0;
++           break;
++    }
++
++    return frameSize;
++}
++
++/*
++ * Calc frame buffer size.
++ *
++ *  Why alignment is 64?
++ *  The IPU DMA unit must transimit at leat 64 bytes one time.
++ *
++ *  Why need extra size? It's due to a hardware issue: the DMA unit is a power of
++ *  two, and a line should be transferred as few units as possible.
++ *  The result is that up to line length more data than the image size
++ *  may be transferred to memory after the image.
++ *
++ *  Another limition is the GDA(Global Dynamic Allocator) allocation unit size(1024). For low
++ *  resolution it gives a bigger number. Use larger one to avoid
++ *  memory corruption.
++ *  for example: 320x480 UVVY, which bpl is 640, less than 1024, in this case, driver will
++ *  allocate 1024 bytes for the last line.
++ */
++int CameraUtils::getFrameSize(int format, int width, int height, bool needAlignedHeight, bool needExtraSize, bool needCompression)
++{
++    LOG1("@%s get buffer size for %s %dx%d", __func__, pixelCode2String(format), width, height);
++    LOG1("@%s needAlignedHeight:%d, needExtraSize:%d, needCompression: %d", __func__,
++              needAlignedHeight, needExtraSize, needCompression);
++
++    int alignedBpl = getStride(format, width);
++
++    // Get frame size with aligned height taking in count for internal buffers.
++    // To garantee PSYS kernel like GDC always get enough buffer size to process.
++    // This is to satisfy the PSYS kernel, like GDC, input alignment requirement.
++    if (needAlignedHeight) {
++        height = ALIGN_64(height);
++        LOG1("@%s buffer aligned height %d", __func__, height);
++    }
++    int bufferHeight = isPlanarFormat(format) ? (height * getBpp(format) / 8) : height;
++
++    if (!needExtraSize) {
++        LOG1("%s: no need extra size, frame size is %d", __func__, alignedBpl * bufferHeight);
++        return alignedBpl * bufferHeight;
++    }
++
++    if (needCompression) {
++        int compressedFrameSize = getCompressedFrameSize(format, width, height);
++        LOG1("%s: Compressed frame size %d for original format: %s",
++                   __func__, compressedFrameSize, pixelCode2String(format));
++        return compressedFrameSize;
++    }
++
++    // Extra size should be at least one alignedBpl
++    int extraSize = isPlanarFormat(format) ? alignedBpl * getBpp(format) / 8 : alignedBpl;
++    extraSize = std::max(extraSize , 1024);
++
++    return alignedBpl * bufferHeight + extraSize;
++}
++
++int CameraUtils::getNumOfPlanes(int format)
++{
++    switch(format) {
++        case V4L2_PIX_FMT_NV12:
++        case V4L2_PIX_FMT_SGRBG8:
++        case V4L2_FMT_IPU_ISYS_META:
++            return 1;
++        //Add more when needed...
++        default:
++            return 1;
++    }
++}
++
++void CameraUtils::getDeviceName(const char* entityName, string& deviceNodeName, bool isSubDev)
++{
++
++    const char *filePrefix = "video";
++    const char *dirPath = "/sys/class/video4linux/";
++    if (isSubDev)
++        filePrefix = "v4l-subdev";
++
++    DIR *dp = opendir(dirPath);
++    CheckError((dp == nullptr), VOID_VALUE, "@%s, Fail open : %s", __func__, dirPath);
++
++    struct dirent *dirp = nullptr;
++    while ((dirp = readdir(dp)) != nullptr) {
++        if ((dirp->d_type == DT_LNK) && (strncmp(dirp->d_name, filePrefix, strlen(filePrefix)) == 0)) {
++            string subDeviceName = dirPath;
++            subDeviceName += dirp->d_name;
++            subDeviceName += "/name";
++            int fd = open(subDeviceName.c_str(), O_RDONLY);
++            CheckError((fd < 0), VOID_VALUE, "@%s, open file %s failed. err: %s",
++                  __func__, subDeviceName.c_str(), strerror(errno));
++
++            char buf[128] = {'\0'};
++            int len = read(fd, buf, sizeof(buf));
++            close(fd);
++            len--; // remove "\n"
++            if (len == (int)strlen(entityName) && memcmp(buf, entityName, len) == 0) {
++                deviceNodeName = "/dev/";
++                deviceNodeName += dirp->d_name;
++                break;
++            }
++        }
++    }
++    closedir(dp);
++}
++
++void CameraUtils::getSubDeviceName(const char* entityName, string& deviceNodeName)
++{
++     getDeviceName(entityName, deviceNodeName, true);
++}
++
++int CameraUtils::getInterlaceHeight(int field, int height)
++{
++    if (SINGLE_FIELD(field))
++        return height/2;
++    else
++        return height;
++}
++
++bool CameraUtils::isMultiExposureCase(TuningMode tuningMode)
++{
++    LOG2("%s, tuningMode %d", __func__, tuningMode);
++
++    return false;
++}
++
++bool CameraUtils::isUllPsysPipe(TuningMode tuningMode)
++{
++    return (tuningMode == TUNING_MODE_VIDEO_ULL ||
++            tuningMode == TUNING_MODE_VIDEO_CUSTOM_AIC);
++}
++
++ConfigMode CameraUtils::getConfigModeByName(const char* ConfigName)
++{
++    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
++
++    if (ConfigName == nullptr) {
++        LOGE("%s, the ConfigName is nullptr", __func__);
++    } else if (strcmp(ConfigName, "AUTO") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_AUTO;
++    } else if (strcmp(ConfigName, "ULL") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
++    } else if (strcmp(ConfigName, "NORMAL") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
++    } else if (strcmp(ConfigName, "HIGH_SPEED") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED;
++    } else if (strcmp(ConfigName, "CUSTOM_AIC") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
++    } else if (strcmp(ConfigName, "VIDEO_LL") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
++    } else if (strcmp(ConfigName, "STILL_CAPTURE") == 0) {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE;
++    } else if (strcmp(ConfigName, "NONE") == 0) {
++        LOG1("%s, the detected internal 'NONE' ConfigName", __func__);
++    } else {
++        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
++        LOG2("%s, the ConfigName %s is not supported, use normal as default", __func__, ConfigName);
++    }
++
++    LOG2("%s, configMode = %d", __func__, configMode);
++    return configMode;
++}
++
++void CameraUtils::getConfigModeFromString(string str, std::vector<ConfigMode> &cfgModes)
++{
++    bool split = true;
++    ConfigMode mode;
++    string resultStr, modeStr = str;
++
++    while(split) {
++        size_t pos = 0;
++        if ((pos = modeStr.find(",")) == string::npos) {
++            mode = getConfigModeByName(modeStr.c_str());
++            split = false;
++        } else {
++            resultStr = modeStr.substr(0, pos);
++            modeStr = modeStr.substr(pos + 1);
++            mode = getConfigModeByName(resultStr.c_str());
++        }
++        cfgModes.push_back(mode);
++    }
++}
++
++ConfigMode CameraUtils::getConfigModeBySceneMode(camera_scene_mode_t sceneMode)
++{
++    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
++
++    switch(sceneMode) {
++        case SCENE_MODE_NORMAL:
++            configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
++            break;
++        case SCENE_MODE_ULL:
++            configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
++            break;
++        case SCENE_MODE_CUSTOM_AIC:
++            configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
++            break;
++        case SCENE_MODE_VIDEO_LL:
++            configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
++            break;
++        default:
++            // There is no corresponding ConfigMode for some scene.
++            LOG2("there is no corresponding ConfigMode for scene %d", sceneMode);
++            break;
++    }
++    return configMode;
++}
++
++camera_scene_mode_t CameraUtils::getSceneModeByName(const char* sceneName)
++{
++    if (sceneName == nullptr) return SCENE_MODE_MAX;
++    else if (strcmp(sceneName, "AUTO") == 0) return SCENE_MODE_AUTO;
++    else if (strcmp(sceneName, "ULL") == 0) return SCENE_MODE_ULL;
++    else if (strcmp(sceneName, "VIDEO_LL") == 0) return SCENE_MODE_VIDEO_LL;
++    else if (strcmp(sceneName, "NORMAL") == 0) return SCENE_MODE_NORMAL;
++    else if (strcmp(sceneName, "CUSTOM_AIC") == 0) return SCENE_MODE_CUSTOM_AIC;
++
++    return SCENE_MODE_MAX;
++}
++
++camera_awb_mode_t CameraUtils::getAwbModeByName(const char* awbName)
++{
++    if (awbName == nullptr) return AWB_MODE_MAX;
++    else if (strcmp(awbName, "AUTO") == 0) return AWB_MODE_AUTO;
++    else if (strcmp(awbName, "INCANDESCENT") == 0) return AWB_MODE_INCANDESCENT;
++    else if (strcmp(awbName, "FLUORESCENT") == 0) return AWB_MODE_FLUORESCENT;
++    else if (strcmp(awbName, "DAYLIGHT") == 0) return AWB_MODE_DAYLIGHT;
++    else if (strcmp(awbName, "FULL_OVERCAST") == 0) return AWB_MODE_FULL_OVERCAST;
++    else if (strcmp(awbName, "PARTLY_OVERCAST") == 0) return AWB_MODE_PARTLY_OVERCAST;
++    else if (strcmp(awbName, "SUNSET") == 0) return AWB_MODE_SUNSET;
++    else if (strcmp(awbName, "VIDEO_CONFERENCE") == 0) return AWB_MODE_VIDEO_CONFERENCE;
++    else if (strcmp(awbName, "MANUAL_CCT_RANGE") == 0) return AWB_MODE_MANUAL_CCT_RANGE;
++    else if (strcmp(awbName, "MANUAL_WHITE_POINT") == 0) return AWB_MODE_MANUAL_WHITE_POINT;
++    else if (strcmp(awbName, "MANUAL_GAIN") == 0) return AWB_MODE_MANUAL_GAIN;
++    else if (strcmp(awbName, "MANUAL_COLOR_TRANSFORM") == 0) return AWB_MODE_MANUAL_COLOR_TRANSFORM;
++
++    return AWB_MODE_MAX;
++}
++
++unsigned int CameraUtils::getMBusFormat(int cameraId, unsigned int isysFmt)
++{
++    unsigned int pixelCode = 0;
++
++    switch (isysFmt) {
++    case V4L2_PIX_FMT_UYVY:
++    case V4L2_PIX_FMT_NV16:
++        pixelCode = V4L2_MBUS_FMT_UYVY8_1X16;
++        break;
++    case V4L2_PIX_FMT_YUYV:
++        pixelCode = V4L2_MBUS_FMT_YUYV8_1X16;
++        break;
++    case V4L2_PIX_FMT_BGR24:
++    case V4L2_PIX_FMT_XBGR32:
++        pixelCode = MEDIA_BUS_FMT_RGB888_1X24;
++        break;
++    case V4L2_PIX_FMT_RGB565:
++    case V4L2_PIX_FMT_XRGB32:
++        pixelCode = MEDIA_BUS_FMT_RGB565_1X16;
++        break;
++    case V4L2_PIX_FMT_SGRBG8:
++        pixelCode = V4L2_MBUS_FMT_SGRBG8_1X8;
++        break;
++    default:
++        LOGE("No input format to match the output: %s", pixelCode2String(isysFmt));
++        break;
++    }
++
++    return pixelCode;
++}
++
++void* CameraUtils::dlopenLibrary(const char* name, int flags)
++{
++    CheckError((name == nullptr), nullptr, "%s, invalid parameters", __func__);
++
++    void* handle = dlopen(name, flags);
++
++    const char* lError = dlerror();
++    if (lError) {
++        if (handle == nullptr) {
++            LOGW("%s, handle is NULL", __func__);
++        }
++        LOGW("%s, dlopen Error: %s", __func__, lError);
++        return nullptr;
++    }
++
++    LOG1("%s, handle %p, name %s has been opened", __func__, handle, name);
++    return handle;
++}
++
++void* CameraUtils::dlsymLibrary(void* handle, const char* str)
++{
++    CheckError((handle == nullptr || str == nullptr), nullptr, "%s, invalid parameters", __func__);
++
++    void* sym = dlsym(handle, str);
++
++    const char* lError = dlerror();
++    if (lError) {
++        if (sym == nullptr) {
++            LOGW("%s, symbol is nullptr", __func__);
++        }
++        LOGW("%s, dlopen Error: %s", __func__, lError);
++        return nullptr;
++    }
++
++    LOG1("%s, handle %p, str %s has been found", __func__, handle, str);
++    return sym;
++}
++
++int CameraUtils::dlcloseLibrary(void* handle)
++{
++    CheckError((handle == nullptr), BAD_VALUE, "%s, invalid parameters", __func__);
++
++    dlclose(handle);
++    LOG1("%s, handle %p has been closed", __func__, handle);
++    return OK;
++}
++
++std::vector<string> CameraUtils::splitString(const char* srcStr, char delim)
++{
++    std::vector<string> tokens;
++    std::stringstream ss(srcStr);
++    string item;
++
++    for (size_t i = 0; std::getline(ss, item, delim); i++) {
++        tokens.push_back(item);
++    }
++
++    return tokens;
++}
++
++nsecs_t CameraUtils::systemTime()
++{
++    struct timespec t;
++    t.tv_sec = t.tv_nsec = 0;
++    clock_gettime(CLOCK_MONOTONIC, &t);
++    return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.h b/camera/hal/intel/ipu6/src/iutils/Utils.h
+new file mode 100644
+index 000000000000..0bae788fa802
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/iutils/Utils.h
+@@ -0,0 +1,277 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <linux/videodev2.h>
++#include <v4l2_device.h>
++
++#include <string.h>
++#include <vector>
++#include <string>
++
++#include "CameraTypes.h"
++
++namespace icamera {
++
++typedef int64_t nsecs_t;
++
++typedef ::cros::V4L2DevicePoller V4L2DevicePoller;
++typedef ::cros::V4L2Device V4L2Device;
++typedef ::cros::V4L2VideoNode V4L2VideoNode;
++typedef ::cros::V4L2Subdevice V4L2Subdevice;
++typedef ::cros::V4L2Buffer V4L2Buffer;
++typedef ::cros::V4L2Format V4L2Format;
++
++#define ALIGN(val, alignment) (((val)+(alignment)-1) & ~((alignment)-1))
++#define ALIGN_64(val) ALIGN(val, 64)
++#define ALIGN_32(val) ALIGN(val, 32)
++#define ALIGN_16(val) ALIGN(val, 16)
++#define ALIGN_8(val)  ALIGN(val, 8)
++
++#define ARRAY_SIZE(array)    (sizeof(array) / sizeof((array)[0]))
++
++#define CLEAR(x) memset (&(x), 0, sizeof (x))
++
++// macro CLIP is used to clip the Number value to between the Min and Max
++#define CLIP(Number, Max, Min)    ((Number) > (Max) ? (Max) : ((Number) < (Min) ? (Min) : (Number)))
++
++#ifndef UNUSED
++#define UNUSED(param) (void)(param)
++#endif
++
++/**
++ * Align to page boundary
++ * \ingroup ia_tools
++ */
++#ifndef PAGE_ALIGN
++#define PAGE_SIZE_U (getpagesize())
++#define PAGE_ALIGN(x)  ALIGN(x, PAGE_SIZE_U)
++#endif
++
++/* Integer round-up division of a with b */
++#define CEIL_DIV(a, b)  ((b) ? (((a) + (b) - 1) / (b)) : 0)
++/* Align a to the upper multiple of b */
++#define CEIL_MUL(a, b)  CEIL_DIV(a, b) * (b)
++
++#define SINGLE_FIELD(field) ((field == V4L2_FIELD_TOP) || (field == V4L2_FIELD_BOTTOM) || \
++                             (field == V4L2_FIELD_ALTERNATE))
++/**
++ * Use to check input parameter and if failed, return err_code and print error message
++ */
++#define VOID_VALUE
++#define CheckError(condition, err_code, err_msg, args...) \
++            do { \
++                if (condition) { \
++                    LOGE(err_msg, ##args);\
++                    return err_code;\
++                }\
++            } while (0)
++
++#define CheckAndClean(condition, err_code, clean, err_msg, args...) \
++            do { \
++                if (condition) { \
++                    LOGE(err_msg, ##args);\
++                    clean;\
++                    return err_code;\
++                }\
++            } while (0)
++
++/**
++ * Use to check input parameter and if failed, return err_code and print warning message,
++ * this should be used for non-vital error checking.
++ */
++#define CheckWarning(condition, err_code, err_msg, args...) \
++            do { \
++                if (condition) { \
++                    LOGW(err_msg, ##args);\
++                    return err_code;\
++                }\
++            } while (0)
++
++// As above but no return.
++#define CheckWarningNoReturn(condition, err_msg, args...) \
++                            do { \
++                                if (condition) { \
++                                    LOGW(err_msg, ##args);\
++                                }\
++                            } while (0)
++
++// macro delete array and set it to null
++#define DELETE_ARRAY_AND_NULLIFY(var) \
++    do { \
++        delete[] (var); \
++        var = nullptr; \
++    } while(0)
++
++/**
++ *  \macro TIMEVAL2NSECS
++ *  Convert timeval struct to value in nanoseconds
++ *  Helper macro to convert timeval struct to nanosecond values stored in a
++ *  long long signed value (equivalent to int64_t)
++ */
++#define TIMEVAL2NSECS(x) (int64_t)((x).tv_sec*1000000000LL + (x).tv_usec*1000LL)
++
++/**
++ *  \macro TIMEVAL2USECS
++ *  Convert timeval struct to value in microseconds
++ *  Helper macro to convert timeval struct to microsecond values stored in a
++ *  long long signed value (equivalent to int64_t)
++ */
++#define TIMEVAL2USECS(x) (int64_t)(((x).tv_sec*1000000000LL + \
++                                    (x).tv_usec*1000LL)/1000LL)
++
++// macro for float comparaion with 0
++#define EPSILON 0.00001
++
++// macro for the MAX FILENAME
++#define MAX_SYS_NAME 64
++#define MAX_TARGET_NAME 256
++
++// A macro to disallow the copy constructor and operator= functions
++// This should be used in the private:declarations for a class
++#ifndef DISALLOW_COPY_AND_ASSIGN
++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
++    TypeName(const TypeName&) = delete; \
++    TypeName& operator=(const TypeName&) = delete
++#endif
++
++/**
++ *  Maker note maximum sizes
++ *  Section 1 is used for Normal capture
++ *  Section 2 is used for RAW captures
++ */
++#define MAKERNOTE_SECTION1_SIZE 56000
++#define MAKERNOTE_SECTION2_SIZE 110592
++
++// macro for memcpy
++#ifndef MEMCPY_S
++#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), std::min((size_t)(dmax), (size_t)(smax)))
++#endif
++
++#define STDCOPY(dst, src, size) std::copy((src), ((src) + (size)), (dst))
++
++// macro for isys compression width/height calculation
++#define ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES 512
++#define ISYS_COMPRESSION_HEIGHT_ALIGNMENT 1
++#define ISYS_COMPRESSION_PAGE_SIZE 0x1000
++// macro for psys compression width/height calculation
++#define PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT 256
++#define PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT 256
++#define PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT 2
++#define PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT 128
++#define PSYS_COMPRESSION_OFS_TILE_HEIGHT_ALIGNMENT 32
++#define PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT 2
++#define PSYS_COMPRESSION_PAGE_SIZE 0x1000
++#define UV_STRIDE_DIVIDER 2
++#define UV_HEIGHT_DIVIDER 2
++// tile size definition
++#define ISYS_COMPRESSION_TILE_SIZE_BYTES 512
++#define TILE_SIZE_YUV420_Y 256
++#define TILE_SIZE_YUV420_UV 128
++#define TILE_SIZE_OFS10_12_TILEY 256
++#define TILE_SIZE_OFS8_TILEY 256
++#define TILE_SIZE_OFS8_10_LINEAR 128
++
++//tile status bits definition
++#define ISYS_COMPRESSION_TILE_STATUS_BITS 4
++#define TILE_STATUS_BITS_YUV420_Y 2
++#define TILE_STATUS_BITS_YUV420_UV 1
++#define TILE_STATUS_BITS_OFS_NV12_TILE_Y	 8
++#define TILE_STATUS_BITS_OFS_P010_TILE_Y 8
++#define TILE_STATUS_BITS_OFS8_10_LINEAR 1
++#define TILE_STATUS_BITS_TNR_NV12_LINEAR 4
++
++#define CAMHAL_CEIL_DIV(a,b)   (((a) + (b) - 1) / (b))
++
++#define FOURCC_TO_UL(a,b,c,d) \
++    ((uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24))
++
++#define DEFAULT_JPEG_QUALITY   95
++#define DEFAULT_THUMBNAIL_QUALITY 0
++
++//Internal useful tool for format
++namespace CameraUtils {
++
++    int getFileContent(const char* filename, char* buffer, int maxSize);
++
++    const char *tuningMode2String(TuningMode mode);
++
++    TuningMode string2TuningMode(const char *str);
++
++    const char *pixelCode2String(int code);
++
++    int string2PixelCode(const char *code);
++
++    int string2IaFourccCode(const char *code);
++
++    std::string format2string (int format);
++
++    int string2format(const char *str);
++
++    const std::string fourcc2String(int format4cc);
++
++    unsigned int fourcc2UL(char *str4cc);
++
++    bool isPlanarFormat(int format);
++
++    bool isRaw(int format);
++
++    int getBpp(int format);
++
++    int getStride (int format, int width);
++
++    int getCompressedFrameSize(int format, int width, int height);
++
++    int getFrameSize(int format, int width, int height, bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
++
++    int getNumOfPlanes(int format);
++
++    void getDeviceName(const char* entityName, std::string& deviceNodeName, bool isSubDev = false);
++
++    void getSubDeviceName(const char* entityName, std::string& deviceNodeName);
++
++    int getInterlaceHeight(int field, int height);
++
++    bool isMultiExposureCase(TuningMode tuningMode);
++
++    bool isUllPsysPipe(TuningMode tuningMode);
++
++    ConfigMode getConfigModeByName(const char* ConfigName);
++
++    ConfigMode getConfigModeBySceneMode(camera_scene_mode_t sceneMode);
++
++    void getConfigModeFromString(std::string str, std::vector<ConfigMode> &cfgModes);
++
++    camera_scene_mode_t getSceneModeByName(const char* sceneName);
++
++    camera_awb_mode_t getAwbModeByName(const char* awbName);
++
++    unsigned int getMBusFormat(int cameraId, unsigned int isysFmt);
++
++    void* dlopenLibrary(const char* name, int flags);
++    void* dlsymLibrary(void* handle, const char* str);
++    int dlcloseLibrary(void* handle);
++
++    /**
++     * Spit the given srcStr by delim into a vector of sub strings.
++     */
++    std::vector<std::string> splitString(const char* srcStr, char delim);
++
++    nsecs_t systemTime();
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
+new file mode 100644
+index 000000000000..0cd7f6712fd0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
+@@ -0,0 +1,620 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "EXIFMaker"
++
++#include "EXIFMaker.h"
++
++#include <limits.h>
++
++#include <fstream>
++#include <string>
++#include <unordered_map>
++
++#include "ParameterHelper.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++#define DEFAULT_ISO_SPEED 100
++
++// The property file directory
++static const char* CAMERA_CACHE_DIR = "/var/cache/camera/";
++/*
++ * Property file defines product name and manufactory info
++ * Used for EXIF header of JPEG. Format: key=value in each line
++ */
++static const char* CAMERA_PROPERTY_FILE = "camera.prop";
++
++EXIFMaker::EXIFMaker()
++        : mExifSize(-1),
++          mInitialized(false),
++          mProductName("<not_set>"),
++          mManufacturerName("<not set>") {
++    LOG2("@%s", __func__);
++
++    CLEAR(mExifAttributes);
++    mMakernoteSection = new unsigned char[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
++    readProperty();
++}
++
++EXIFMaker::~EXIFMaker() {
++    LOG2("@%s", __func__);
++    delete[] mMakernoteSection;
++}
++
++void EXIFMaker::readProperty() {
++    LOG2("@%s", __func__);
++    std::string cameraPropertyPath =
++        std::string(CAMERA_CACHE_DIR) + std::string(CAMERA_PROPERTY_FILE);
++    std::fstream props(cameraPropertyPath.c_str(), std::ios::in);
++
++    if (!props.is_open()) {
++        LOG2("There isn't camera property file.");
++        return;
++    }
++
++    const std::string kModel = "ro.product.model";
++    const std::string kManufacturer = "ro.product.manufacturer";
++    const std::string kDelimiter = "=";
++    std::unordered_map<std::string, std::string> properties;
++
++    while (!props.eof()) {
++        size_t pos;
++        std::string line, key, value;
++
++        std::getline(props, line);
++        pos = line.find(kDelimiter);
++        if (pos != std::string::npos) {
++            key = line.substr(0, pos);
++            value = line.substr(pos + 1);
++            properties[key] = value;
++            LOG2("%s, new key,value: %s,%s", __func__, key.c_str(), value.c_str());
++        }
++    }
++
++    if (properties.find(kManufacturer) != properties.end()) {
++        mManufacturerName = properties[kManufacturer];
++    }
++    if (properties.find(kModel) != properties.end()) {
++        mProductName = properties[kModel];
++    }
++}
++
++/**
++ * Fills EXIF data after a picture has been taken to
++ * record the active sensor, 3A and ISP state to EXIF metadata.
++ *
++ * This function is intented to set EXIF tags belonging
++ * to the EXIF "Per Picture Camera Setting" group.
++ *
++ * @arg params active Android HAL parameters
++ */
++void EXIFMaker::pictureTaken(ExifMetaData* exifmetadata) {
++    LOG2("@%s", __func__);
++
++    // brightness, -99.99 to 99.99. FFFFFFFF.H means unknown.
++    float brightness;
++    // TODO: The check for getAeManualBrightness of 3A should be moved
++    //       to MetaData class, because the metadata collection happen
++    //       at capture time
++    brightness = 99;
++    mExifAttributes.brightness.num = static_cast<int>(brightness * 100);
++    mExifAttributes.brightness.den = 100;
++    LOG2("EXIF: brightness = %.2f", brightness);
++
++    mExifAttributes.contrast = 0;
++    mExifAttributes.saturation = 0;
++    mExifAttributes.sharpness = 0;
++    LOG2("EXIF: contrast=%d, saturation=%d, sharpness=%d (0:normal 1:low 2:high)",
++         mExifAttributes.contrast, mExifAttributes.saturation, mExifAttributes.sharpness);
++
++    // set the exposure program mode
++    icamera::camera_ae_mode_t aeMode = exifmetadata->aeMode;
++    switch (aeMode) {
++        case AE_MODE_MANUAL:
++            mExifAttributes.exposure_program = EXIF_EXPOSURE_PROGRAM_MANUAL;
++            mExifAttributes.exposure_mode = EXIF_EXPOSURE_MANUAL;
++            LOG2("EXIF: Exposure Program = Manual, Exposure Mode = Manual");
++            break;
++        case AE_MODE_AUTO:
++        default:
++            mExifAttributes.exposure_program = EXIF_EXPOSURE_PROGRAM_NORMAL;
++            mExifAttributes.exposure_mode = EXIF_EXPOSURE_AUTO;
++            LOG2("EXIF: Exposure Program = Normal, Exposure Mode = Auto");
++            break;
++    }
++
++    mExifAttributes.metering_mode = EXIF_METERING_AVERAGE;
++
++    // white balance mode. 0: auto; 1: manual
++    icamera::camera_awb_mode_t awbMode = exifmetadata->awbMode;
++    LOG2("EXIF: awbMode = %d", awbMode);
++    switch (awbMode) {
++        case AWB_MODE_AUTO:
++        case AWB_MODE_MAX:
++            mExifAttributes.white_balance = EXIF_WB_AUTO;
++            break;
++        default:
++            mExifAttributes.white_balance = EXIF_WB_MANUAL;
++            break;
++    }
++
++    // light source type. Refer to EXIF V2.2
++    // TBD. Now light source is only set to UNKNOWN, when WB is auto mode.
++    std::unordered_map<icamera::camera_awb_mode_t, CamExifLightSourceType> awbModeLightMap = {
++        {AWB_MODE_AUTO, EXIF_LIGHT_SOURCE_UNKNOWN},
++        {AWB_MODE_SUNSET, EXIF_LIGHT_SOURCE_TUNGSTEN},
++        {AWB_MODE_DAYLIGHT, EXIF_LIGHT_SOURCE_FINE_WEATHER},
++        {AWB_MODE_PARTLY_OVERCAST, EXIF_LIGHT_SOURCE_CLOUDY_WEATHER},
++        {AWB_MODE_FLUORESCENT, EXIF_LIGHT_SOURCE_FLUORESCENT},
++        {AWB_MODE_INCANDESCENT, EXIF_LIGHT_SOURCE_TUNGSTEN},
++        {AWB_MODE_MAX, EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE},
++    };
++    if (awbModeLightMap.find(awbMode) != awbModeLightMap.end()) {
++        mExifAttributes.light_source = awbModeLightMap[awbMode];
++    } else {
++        mExifAttributes.light_source = EXIF_LIGHT_SOURCE_UNKNOWN;
++    }
++
++    mExifAttributes.scene_capture_type = EXIF_SCENE_STANDARD;
++
++    int rotation = exifmetadata->mJpegSetting.orientation;
++    mExifAttributes.orientation = EXIF_ORIENTATION_UP;
++    if (0 == rotation)
++        mExifAttributes.orientation = EXIF_ORIENTATION_UP;
++    else if (90 == rotation)
++        mExifAttributes.orientation = EXIF_ORIENTATION_90;
++    else if (180 == rotation)
++        mExifAttributes.orientation = EXIF_ORIENTATION_180;
++    else if (270 == rotation)
++        mExifAttributes.orientation = EXIF_ORIENTATION_270;
++
++    // Platform has no HW rotation. No swap here
++    // if (rotation % 180 == 90)
++    //    swap(mExifAttributes.width, mExifAttributes.height);
++
++    mExifAttributes.zoom_ratio.num = exifmetadata->zoomRatio;
++    mExifAttributes.zoom_ratio.den = 100;
++    // the unit of subjectDistance is meter, focus distance from 3A is mm.
++    mExifAttributes.subject_distance.num =
++        static_cast<uint32_t>(exifmetadata->currentFocusDistance);
++    mExifAttributes.subject_distance.den = 1000;
++    mExifAttributes.custom_rendered =
++        exifmetadata->hdr ? EXIF_CUSTOM_RENDERED_HDR : EXIF_DEF_CUSTOM_RENDERED;
++    LOG2("subject_distance is %d", mExifAttributes.subject_distance.num);
++}
++
++/**
++ * Called when the the camera static configuration is known.
++ *
++ * @arg width: width of the main JPEG picture.
++ * @arg height: height of the main JPEG picture.
++ */
++void EXIFMaker::initialize(int width, int height) {
++    /* We clear the exif attributes, so we won't be using some old values
++     * from a previous EXIF generation.
++     */
++    clear();
++
++    // Initialize the mExifAttributes with specific values
++    // time information
++    time_t rawtime;
++    struct tm* timeinfo;
++    time(&rawtime);
++    timeinfo = localtime(&rawtime);
++    if (timeinfo) {
++        strftime(reinterpret_cast<char*>(mExifAttributes.date_time),
++                 sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", timeinfo);
++        // fields: tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday, tm_yday, tm_isdst,
++        // tm_gmtoff, tm_zone
++    } else {
++        LOGW("nullptr timeinfo from localtime(), using defaults...");
++        struct tm tmpTime = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "UTC"};
++        strftime(reinterpret_cast<char*>(mExifAttributes.date_time),
++                 sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", &tmpTime);
++    }
++
++    // set default subsec time to 1000
++    const char subsecTime[] = "1000";
++    MEMCPY_S(reinterpret_cast<char*>(mExifAttributes.subsec_time),
++             sizeof(mExifAttributes.subsec_time), subsecTime, sizeof(subsecTime));
++
++    // conponents configuration.
++    // Default = 4 5 6 0(if RGB uncompressed), 1 2 3 0(other cases)
++    // 0 = does not exist; 1 = Y; 2 = Cb; 3 = Cr; 4 = R; 5 = G; 6 = B; other = reserved
++    mExifAttributes.components_configuration[0] = 1;
++    mExifAttributes.components_configuration[1] = 2;
++    mExifAttributes.components_configuration[2] = 3;
++    mExifAttributes.components_configuration[3] = 0;
++
++    // set default values for fnumber and focal length
++    // (see EXIFMaker::setDriverData() how to override these)
++    mExifAttributes.fnumber.num = EXIF_DEF_FNUMBER_NUM;
++    mExifAttributes.fnumber.den = EXIF_DEF_FNUMBER_DEN;
++    mExifAttributes.focal_length.num = EXIF_DEF_FOCAL_LEN_NUM;
++    mExifAttributes.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
++
++    // TODO: should ISO be omitted if the value cannot be trusted?
++    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
++
++    mExifAttributes.aperture.den = EXIF_DEF_APEX_DEN;
++    mExifAttributes.aperture.num = EXIF_DEF_APEX_NUM;
++    // max aperture. the smallest F number of the lens. unit is APEX value.
++    mExifAttributes.max_aperture.num = mExifAttributes.aperture.num;
++    mExifAttributes.max_aperture.den = mExifAttributes.aperture.den;
++
++    // subject distance,    0 means distance unknown; (~0) means infinity.
++    mExifAttributes.subject_distance.num = EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN;
++    mExifAttributes.subject_distance.den = 1;
++
++    // light source, 0 means light source unknown
++    mExifAttributes.light_source = 0;
++    // TODO: for awb mode
++
++    // gain control, 0 = none;
++    // 1 = low gain up; 2 = high gain up; 3 = low gain down; 4 = high gain down
++    mExifAttributes.gain_control = 0;
++
++    // contrast, 0 = normal; 1 = soft; 2 = hard; other = reserved
++    mExifAttributes.contrast = EXIF_CONTRAST_NORMAL;
++
++    // saturation, 0 = normal; 1 = Low saturation; 2 = High saturation; other = reserved
++    mExifAttributes.saturation = EXIF_SATURATION_NORMAL;
++
++    // sharpness, 0 = normal; 1 = soft; 2 = hard; other = reserved
++    mExifAttributes.sharpness = EXIF_SHARPNESS_NORMAL;
++
++    // the picture's width and height
++    mExifAttributes.width = width;
++    mExifAttributes.height = height;
++
++    mExifAttributes.orientation = 1;
++
++    mExifAttributes.custom_rendered = EXIF_DEF_CUSTOM_RENDERED;
++
++    // metering mode, 0 = normal; 1 = soft; 2 = hard; other = reserved
++    mExifAttributes.metering_mode = EXIF_METERING_UNKNOWN;
++    mInitialized = true;
++}
++
++void EXIFMaker::initializeLocation(ExifMetaData* metadata) {
++    LOG1("@%s", __func__);
++    // GIS information
++    bool gpsEnabled = false;
++    double latitude = metadata->mGpsSetting.latitude;
++    double longitude = metadata->mGpsSetting.longitude;
++    double altitude = metadata->mGpsSetting.altitude;
++    long timestamp = metadata->mGpsSetting.gpsTimeStamp;
++    char* pprocmethod = metadata->mGpsSetting.gpsProcessingMethod;
++
++    // check whether the GIS Information is valid
++    if (!(latitude >= -EPSILON && latitude <= EPSILON) ||
++        !(longitude >= -EPSILON && longitude <= EPSILON) ||
++        !(altitude >= -EPSILON && altitude <= EPSILON) || (timestamp != 0) ||
++        (strlen(pprocmethod) != 0))
++        gpsEnabled = true;
++
++    mExifAttributes.enableGps = 0;
++    LOG1("EXIF: gpsEnabled: %d", gpsEnabled);
++
++    // the version is given as 2.2.0.0, it is mandatory when GPSInfo tag is present
++    if (gpsEnabled) {
++        const unsigned char gpsversion[4] = {0x02, 0x02, 0x00, 0x00};
++        MEMCPY_S(mExifAttributes.gps_version_id, sizeof(mExifAttributes.gps_version_id), gpsversion,
++                 sizeof(gpsversion));
++    } else {
++        return;
++    }
++
++    // latitude, for example, 39.904214 degrees, N
++    if (latitude > 0)
++        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref), "N",
++                 sizeof(mExifAttributes.gps_latitude_ref));
++    else
++        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref), "S",
++                 sizeof(mExifAttributes.gps_latitude_ref));
++
++    latitude = fabs(latitude);
++    mExifAttributes.gps_latitude[0].num = (uint32_t)latitude;
++    mExifAttributes.gps_latitude[0].den = 1;
++    mExifAttributes.gps_latitude[1].num =
++        (uint32_t)((latitude - mExifAttributes.gps_latitude[0].num) * 60);
++    mExifAttributes.gps_latitude[1].den = 1;
++    mExifAttributes.gps_latitude[2].num =
++        (uint32_t)(((latitude - mExifAttributes.gps_latitude[0].num) * 60 -
++                    mExifAttributes.gps_latitude[1].num) *
++                   60 * 100);
++    mExifAttributes.gps_latitude[2].den = 100;
++    mExifAttributes.enableGps |= EXIF_GPS_LATITUDE;
++    LOG1("EXIF: latitude, ref:%s, dd:%d, mm:%d, ss:%d", mExifAttributes.gps_latitude_ref,
++         mExifAttributes.gps_latitude[0].num, mExifAttributes.gps_latitude[1].num,
++         mExifAttributes.gps_latitude[2].num);
++
++    // longitude, for example, 116.407413 degrees, E
++    if (longitude > 0)
++        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref), "E",
++                 sizeof(mExifAttributes.gps_longitude_ref));
++    else
++        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref), "W",
++                 sizeof(mExifAttributes.gps_longitude_ref));
++    longitude = fabs(longitude);
++    mExifAttributes.gps_longitude[0].num = (uint32_t)longitude;
++    mExifAttributes.gps_longitude[0].den = 1;
++    mExifAttributes.gps_longitude[1].num =
++        (uint32_t)((longitude - mExifAttributes.gps_longitude[0].num) * 60);
++    mExifAttributes.gps_longitude[1].den = 1;
++    mExifAttributes.gps_longitude[2].num =
++        (uint32_t)(((longitude - mExifAttributes.gps_longitude[0].num) * 60 -
++                    mExifAttributes.gps_longitude[1].num) *
++                   60 * 100);
++    mExifAttributes.gps_longitude[2].den = 100;
++    mExifAttributes.enableGps |= EXIF_GPS_LONGITUDE;
++    LOG1("EXIF: longitude, ref:%s, dd:%d, mm:%d, ss:%d", mExifAttributes.gps_longitude_ref,
++         mExifAttributes.gps_longitude[0].num, mExifAttributes.gps_longitude[1].num,
++         mExifAttributes.gps_longitude[2].num);
++
++    // altitude
++    // altitude, sea level or above sea level, set it to 0; below sea level, set it to 1
++    mExifAttributes.gps_altitude_ref = ((altitude > 0) ? 0 : 1);
++    altitude = fabs(altitude);
++    mExifAttributes.gps_altitude.num = (uint32_t)altitude;
++    mExifAttributes.gps_altitude.den = 1;
++    mExifAttributes.enableGps |= EXIF_GPS_ALTITUDE;
++    LOG1("EXIF: altitude, ref:%d, height:%d", mExifAttributes.gps_altitude_ref,
++         mExifAttributes.gps_altitude.num);
++
++    // timestamp
++    if (timestamp >= LONG_MAX || timestamp <= LONG_MIN) {
++        timestamp = 0;
++        LOGW("invalid timestamp was provided, defaulting to 0 (i.e. 1970)");
++    }
++    struct tm time;
++    gmtime_r(&timestamp, &time);
++    time.tm_year += 1900;
++    time.tm_mon += 1;
++    mExifAttributes.gps_timestamp[0].num = time.tm_hour;
++    mExifAttributes.gps_timestamp[0].den = 1;
++    mExifAttributes.gps_timestamp[1].num = time.tm_min;
++    mExifAttributes.gps_timestamp[1].den = 1;
++    mExifAttributes.gps_timestamp[2].num = time.tm_sec;
++    mExifAttributes.gps_timestamp[2].den = 1;
++    mExifAttributes.enableGps |= EXIF_GPS_TIMESTAMP;
++
++    snprintf(reinterpret_cast<char*>(mExifAttributes.gps_datestamp),
++             sizeof(mExifAttributes.gps_datestamp), "%04d:%02d:%02d", time.tm_year, time.tm_mon,
++             time.tm_mday);
++
++    LOG1("EXIF: timestamp, year:%d,mon:%d,day:%d,hour:%d,min:%d,sec:%d", time.tm_year, time.tm_mon,
++         time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec);
++
++    // processing method
++    MEMCPY_S(mExifAttributes.gps_processing_method, sizeof(mExifAttributes.gps_processing_method),
++             metadata->mGpsSetting.gpsProcessingMethod,
++             sizeof(metadata->mGpsSetting.gpsProcessingMethod));
++    mExifAttributes.gps_processing_method[sizeof(mExifAttributes.gps_processing_method) - 1] = 0;
++
++    mExifAttributes.enableGps |= EXIF_GPS_PROCMETHOD;
++    LOG1("EXIF: GPS processing method:%s", mExifAttributes.gps_processing_method);
++}
++
++void EXIFMaker::setSensorAeConfig(const Parameters& params) {
++    LOG1("@%s", __func__);
++
++    int64_t expTime = 0;
++    params.getExposureTime(expTime);
++
++    if (expTime > 0) {
++        // EXIF exposure rational value is in seconds and the unit of exposure time in 3A is usecs
++        mExifAttributes.exposure_time.num = expTime;
++        mExifAttributes.exposure_time.den = 1000000;
++        uint32_t tv = APEX_EXPOSURE_TO_SHUTTER(static_cast<double>(expTime) /
++                                               mExifAttributes.exposure_time.den);
++        mExifAttributes.shutter_speed.num = tv * 65536;
++        mExifAttributes.shutter_speed.den = 65536;
++    } else {
++        mExifAttributes.exposure_time.num = 0;
++        mExifAttributes.exposure_time.den = 1;
++        mExifAttributes.shutter_speed.num = 0;
++        mExifAttributes.shutter_speed.den = 1;
++    }
++
++    float stepEv = 1 / 3.0f;
++    icamera::camera_rational_t aeCompensationStep;
++    if (params.getAeCompensationStep(aeCompensationStep) == 0) {
++        stepEv = static_cast<float>(aeCompensationStep.numerator) / aeCompensationStep.denominator;
++    }
++
++    int32_t ev = 0;
++    float evBias = 0;
++    if (params.getAeCompensation(ev) == 0) {
++        evBias = static_cast<float>(ev) * stepEv;
++    }
++
++    // exposure bias. unit is APEX value. -99.99 to 99.99
++    const int evLowerBound = -100, evUpperBound = 100;
++    if (evBias > evLowerBound && evBias < evUpperBound) {
++        mExifAttributes.exposure_bias.num = static_cast<int>(evBias) * 100;
++        mExifAttributes.exposure_bias.den = 100;
++        LOG2("EXIF: Ev = %.2f", evBias);
++    } else {
++        mExifAttributes.exposure_bias.num = 0;
++        mExifAttributes.exposure_bias.den = 100;
++        LOG2("EXIF: Invalid Ev!");
++    }
++
++    int32_t iso;
++    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
++    if (params.getSensitivityIso(iso) == 0) {
++        mExifAttributes.iso_speed_rating = iso;
++    }
++
++    LOG2("EXIF: ISO=%d", mExifAttributes.iso_speed_rating);
++    LOG2("EXIF: shutter speed=%u/%u", mExifAttributes.shutter_speed.num,
++         mExifAttributes.shutter_speed.den);
++    LOG2("EXIF: exposure time=%u/%u", mExifAttributes.exposure_time.num,
++         mExifAttributes.exposure_time.den);
++}
++
++/*
++ * more secure attribute copy routine.
++ * \param dst pointer to dst buffer
++ * \param dstSize dst buffer size
++ * \param src pointer to src character buffer
++ * \param srcLength src buffer length in characters, not including null byte
++ */
++void EXIFMaker::copyAttribute(uint8_t* dst, size_t dstSize, const char* src, size_t srcLength) {
++    size_t dstMaxLength = dstSize - 1;            // leave space for null
++    MEMCPY_S(dst, dstMaxLength, src, srcLength);  // copy chars (not null)
++    // add null termination
++    size_t len = std::min(dstMaxLength, srcLength);
++    dst[len] = '\0';
++}
++
++void EXIFMaker::clear() {
++    LOG1("@%s", __func__);
++    // Reset all the attributes
++    CLEAR(mExifAttributes);
++    // Initialize the common values
++    mExifAttributes.enableThumb = false;
++    copyAttribute(mExifAttributes.image_description, sizeof(mExifAttributes.image_description),
++                  EXIF_DEF_IMAGE_DESCRIPTION, strlen(EXIF_DEF_IMAGE_DESCRIPTION));
++
++    copyAttribute(mExifAttributes.maker, sizeof(mExifAttributes.maker), mManufacturerName.c_str(),
++                  strlen(mManufacturerName.c_str()));
++
++    copyAttribute(mExifAttributes.model, sizeof(mExifAttributes.model), mProductName.c_str(),
++                  strlen(mProductName.c_str()));
++
++    copyAttribute(mExifAttributes.software, sizeof(mExifAttributes.software), EXIF_DEF_SOFTWARE,
++                  strlen(EXIF_DEF_SOFTWARE));
++
++    copyAttribute(mExifAttributes.exif_version, sizeof(mExifAttributes.exif_version),
++                  EXIF_DEF_EXIF_VERSION, strlen(EXIF_DEF_EXIF_VERSION));
++
++    copyAttribute(mExifAttributes.flashpix_version, sizeof(mExifAttributes.flashpix_version),
++                  EXIF_DEF_FLASHPIXVERSION, strlen(EXIF_DEF_FLASHPIXVERSION));
++
++    // initially, set default flash
++    mExifAttributes.flash = EXIF_DEF_FLASH;
++
++    // normally it is sRGB, 1 means sRGB. FFFF.H means uncalibrated
++    mExifAttributes.color_space = EXIF_DEF_COLOR_SPACE;
++
++    // the number of pixels per ResolutionUnit in the w or h direction
++    // 72 means the image resolution is unknown
++    mExifAttributes.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
++    mExifAttributes.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
++    mExifAttributes.y_resolution.num = mExifAttributes.x_resolution.num;
++    mExifAttributes.y_resolution.den = mExifAttributes.x_resolution.den;
++    // resolution unit, 2 means inch
++    mExifAttributes.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
++    // when thumbnail uses JPEG compression, this tag 103H's value is set to 6
++    mExifAttributes.compression_scheme = EXIF_DEF_COMPRESSION;
++
++    // the TIFF default is 1 (centered)
++    mExifAttributes.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
++
++    // Clear the Intel 3A Makernote information
++    mExifAttributes.makerNoteData = mMakernoteSection;
++    mExifAttributes.makerNoteDataSize = 0;
++    mExifAttributes.makernoteToApp2 = ENABLE_APP2_MARKER;
++
++    mInitialized = false;
++}
++
++void EXIFMaker::enableFlash(bool enable, int8_t aeMode, int8_t flashMode) {
++    mExifAttributes.flash = EXIF_DEF_FLASH;
++}
++
++void EXIFMaker::setThumbnail(unsigned char* data, size_t size, int width, int height) {
++    LOG1("@%s: data = %p, size = %zu", __func__, data, size);
++    mExifAttributes.enableThumb = true;
++    mExifAttributes.widthThumb = width;
++    mExifAttributes.heightThumb = height;
++    if (mEncoder.setThumbData(data, size) != EXIF_SUCCESS) {
++        LOGE("Error in setting EXIF thumbnail");
++    }
++}
++
++bool EXIFMaker::isThumbnailSet() const {
++    LOG1("@%s", __func__);
++    return mEncoder.isThumbDataSet();
++}
++
++size_t EXIFMaker::makeExif(unsigned char* data) {
++    LOG1("@%s", __func__);
++    CheckError(!data, 0, "nullptr passed for EXIF. Cannot generate EXIF!");
++
++    if (mEncoder.makeExif(data, &mExifAttributes, &mExifSize) == EXIF_SUCCESS) {
++        LOG1("Generated EXIF (@%p) of size: %zu", data, mExifSize);
++        return mExifSize;
++    }
++    return 0;
++}
++
++void EXIFMaker::setMaker(const char* data) {
++    LOG1("@%s: data = %s", __func__, data);
++
++    snprintf((char*)mExifAttributes.maker, sizeof(mExifAttributes.maker), "%s", data);
++}
++
++void EXIFMaker::setModel(const char* data) {
++    LOG1("@%s: data = %s", __func__, data);
++
++    snprintf((char*)mExifAttributes.model, sizeof(mExifAttributes.model), "%s", data);
++}
++
++void EXIFMaker::setSoftware(const char* data) {
++    LOG1("@%s: data = %s", __func__, data);
++
++    snprintf((char*)mExifAttributes.software, sizeof(mExifAttributes.software), "%s", data);
++}
++
++void EXIFMaker::saveMakernote(const Parameters& params) {
++    unsigned int size = sizeof(unsigned char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE);
++    if (params.getMakernoteData(mMakernoteSection, &size) == OK) {
++        mExifAttributes.makerNoteDataSize = size;
++    }
++}
++
++void EXIFMaker::updateSensorInfo(const Parameters& params) {
++    float focal = 0.0;
++    params.getFocalLength(focal);
++
++    if (focal < EPSILON) {
++        // Focal length is not supported, set to default value
++        icamera::CameraMetadata meta;
++        icamera::ParameterHelper::copyMetadata(params, &meta);
++
++        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
++        if (entry.count >= 1) {
++            focal = entry.data.f[0];
++        }
++    }
++
++    LOG2("focal length is %f", focal);
++    mExifAttributes.focal_length.num = focal * mExifAttributes.focal_length.den;
++    float aperture = 0.0;
++    params.getAperture(aperture);
++    mExifAttributes.aperture.num = aperture * mExifAttributes.aperture.den;
++
++    mExifAttributes.fnumber.num = aperture * mExifAttributes.aperture.den;
++    mExifAttributes.fnumber.den = mExifAttributes.aperture.den;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
+new file mode 100644
+index 000000000000..adad8d072710
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
+@@ -0,0 +1,72 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++
++#include "EXIFMetaData.h"
++#include "ExifCreater.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++/**
++ * \class EXIFMaker
++ *
++ */
++class EXIFMaker {
++ public:
++    EXIFMaker();
++    ~EXIFMaker();
++
++    void readProperty();
++    void initialize(int width, int height);
++    bool isInitialized() { return mInitialized; }
++    void initializeLocation(ExifMetaData* metadata);
++    uint32_t getMakerNoteDataSize() const;
++    void pictureTaken(ExifMetaData* exifmetadata);
++    void enableFlash(bool enable, int8_t aeMode, int8_t flashMode);
++    void setThumbnail(unsigned char* data, size_t size, int width, int height);
++    bool isThumbnailSet() const;
++    size_t makeExif(unsigned char* data);
++    void setMaker(const char* data);
++    void setModel(const char* data);
++    void setSoftware(const char* data);
++    void updateSensorInfo(const Parameters& params);
++    void saveMakernote(const Parameters& params);
++    void setSensorAeConfig(const Parameters& params);
++
++ private:  // member variables
++    ExifCreater mEncoder;
++    exif_attribute_t mExifAttributes;
++    size_t mExifSize;
++    bool mInitialized;
++    unsigned char* mMakernoteSection;
++    std::string mProductName;
++    std::string mManufacturerName;
++
++ private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(EXIFMaker);
++
++ private:  // Methods
++    void copyAttribute(uint8_t* dst, size_t dstSize, const char* src, size_t srcLength);
++
++    void clear();
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
+new file mode 100644
+index 000000000000..6c1bd04ffe86
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
+@@ -0,0 +1,57 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "EXIFMetaData"
++
++#include "EXIFMetaData.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++#define DEFAULT_ISO_SPEED 100
++
++ExifMetaData::ExifMetaData()
++        : effectMode(CAM_EFFECT_NONE),
++          software(nullptr),
++          hdr(false),
++          flashFired(false),
++          v3AeMode(BAD_VALUE),
++          flashMode(BAD_VALUE),
++          saveMirrored(false),
++          cameraOrientation(0),
++          currentOrientation(0),
++          zoomRatio(1),
++          aeMode(AE_MODE_AUTO),
++          awbMode(AWB_MODE_AUTO),
++          currentFocusDistance(0.0) {
++    ALOGI("@%s", __func__);
++    mJpegSetting.jpegQuality = 90;
++    mJpegSetting.jpegThumbnailQuality = 90;
++    mJpegSetting.orientation = 0;
++    mJpegSetting.thumbWidth = 320;
++    mJpegSetting.thumbHeight = 240;
++    mGpsSetting.latitude = 0.0;
++    mGpsSetting.longitude = 0.0;
++    mGpsSetting.altitude = 0.0;
++    CLEAR(mGpsSetting.gpsProcessingMethod);
++    mGpsSetting.gpsTimeStamp = 0;
++}
++
++ExifMetaData::~ExifMetaData() {}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
+new file mode 100644
+index 000000000000..7cd37f319ebc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "Parameters.h"
++#include "iutils/Errors.h"
++namespace icamera {
++
++#define MAX_NUM_GPS_PROCESSING_METHOD 64
++
++/**
++ * \class ExifMetaData
++ *
++ */
++class ExifMetaData {
++ public:
++    ExifMetaData();
++    virtual ~ExifMetaData();
++
++    // jpeg info
++    struct JpegSetting {
++        uint8_t jpegQuality;
++        uint8_t jpegThumbnailQuality;
++        int thumbWidth;
++        int thumbHeight;
++        int orientation;
++    };
++    // GPS info
++    struct GpsSetting {
++        double latitude;
++        double longitude;
++        double altitude;
++        char gpsProcessingMethod[MAX_NUM_GPS_PROCESSING_METHOD];
++        long gpsTimeStamp;
++    };
++    // exif info
++    JpegSetting mJpegSetting;
++    GpsSetting mGpsSetting;
++    camera_effect_mode_t effectMode;
++    char* software;         /*!< software string from HAL */
++    bool hdr;               /*!< whether hdr was used */
++    bool flashFired;        /*!< whether flash was fired */
++    int8_t v3AeMode;        /*!< v3 ae mode (e.g. for flash) */
++    int8_t flashMode;       /*!< flash mode (e.g. TORCH,SINGLE,OFF) */
++    bool saveMirrored;      /*!< whether to do mirroring */
++    int cameraOrientation;  /*!< camera sensor orientation */
++    int currentOrientation; /*!< Current orientation of the device */
++    int zoomRatio;
++    icamera::camera_ae_mode_t aeMode;
++    icamera::camera_awb_mode_t awbMode;
++    float currentFocusDistance;
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/Exif.h b/camera/hal/intel/ipu6/src/jpeg/Exif.h
+new file mode 100644
+index 000000000000..4ccca42545c1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/Exif.h
+@@ -0,0 +1,343 @@
++/*
++ * Copyright Samsung Electronics Co.,LTD.
++ * Copyright (C) 2010 The Android Open Source Project
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <math.h>
++
++#define EXIF_LOG2(x) (log((double)(x)) / log(2.0))
++#define APEX_FNUM_TO_APERTURE(x) (2 * (EXIF_LOG2((double)(x))))
++#define APEX_EXPOSURE_TO_SHUTTER(x) (-1.0 * (EXIF_LOG2((double)(x))))
++#define APEX_ISO_TO_FILMSENSITIVITY(x) ((int)(EXIF_LOG2((x) / 3.125) + 0.5))
++
++#define NUM_SIZE 2
++#define IFD_SIZE 12
++#define OFFSET_SIZE 4
++
++#define NUM_0TH_IFD_TIFF 14
++#define NUM_0TH_IFD_EXIF 36
++#define NUM_0TH_IFD_GPS 12
++#define NUM_1TH_IFD_TIFF 9
++// For QVGA: 320 * 240 * 1.5
++#define EXIF_SIZE_LIMITATION 0x10000
++// Limite the thumbnail size to 32k, to make sure the whole exif size does
++// not exceed the exif size limitation. We guess the total size of all the
++// other fields is smaller than 32k. (Currently the size is about 26k.)
++#define THUMBNAIL_SIZE_LIMITATION 0x8000
++
++/* Type */
++#define EXIF_TYPE_BYTE 1
++#define EXIF_TYPE_ASCII 2
++#define EXIF_TYPE_SHORT 3
++#define EXIF_TYPE_LONG 4
++#define EXIF_TYPE_RATIONAL 5
++#define EXIF_TYPE_UNDEFINED 7
++#define EXIF_TYPE_SLONG 9
++#define EXIF_TYPE_SRATIONAL 10
++
++#define EXIF_FILE_SIZE 28800
++
++/* 0th IFD TIFF Tags */
++#define EXIF_TAG_IMAGE_WIDTH 0x0100
++#define EXIF_TAG_IMAGE_HEIGHT 0x0101
++#define EXIF_TAG_IMAGE_DESCRIPTION 0x010e
++#define EXIF_TAG_MAKE 0x010f
++#define EXIF_TAG_MODEL 0x0110
++#define EXIF_TAG_ORIENTATION 0x0112
++#define EXIF_TAG_X_RESOLUTION 0x011A
++#define EXIF_TAG_Y_RESOLUTION 0x011B
++#define EXIF_TAG_RESOLUTION_UNIT 0x0128
++#define EXIF_TAG_SOFTWARE 0x0131
++#define EXIF_TAG_DATE_TIME 0x0132
++#define EXIF_TAG_YCBCR_POSITIONING 0x0213
++#define EXIF_TAG_EXIF_IFD_POINTER 0x8769
++#define EXIF_TAG_GPS_IFD_POINTER 0x8825
++
++/* 0th IFD Exif Private Tags */
++#define EXIF_TAG_EXPOSURE_TIME 0x829A
++#define EXIF_TAG_FNUMBER 0x829D
++#define EXIF_TAG_EXPOSURE_PROGRAM 0x8822
++#define EXIF_TAG_ISO_SPEED_RATING 0x8827
++#define EXIF_TAG_EXIF_VERSION 0x9000
++#define EXIF_TAG_DATE_TIME_ORG 0x9003
++#define EXIF_TAG_DATE_TIME_DIGITIZE 0x9004
++#define EXIF_TAG_COMPONENTS_CONFIGURATION 0x9101
++#define EXIF_TAG_SHUTTER_SPEED 0x9201
++#define EXIF_TAG_APERTURE 0x9202
++#define EXIF_TAG_BRIGHTNESS 0x9203
++#define EXIF_TAG_EXPOSURE_BIAS 0x9204
++#define EXIF_TAG_MAX_APERTURE 0x9205
++#define EXIF_TAG_SUBJECT_DISTANCE 0x9206
++#define EXIF_TAG_METERING_MODE 0x9207
++#define EXIF_TAG_LIGHT_SOURCE 0x9208
++#define EXIF_TAG_FLASH 0x9209
++#define EXIF_TAG_FOCAL_LENGTH 0x920A
++#define EXIF_TAG_MAKER_NOTE 0x927C
++#define EXIF_TAG_USER_COMMENT 0x9286
++#define EXIF_TAG_SUBSEC_TIME 0x9290
++#define EXIF_TAG_SUBSEC_TIME_ORIG 0x9291
++#define EXIF_TAG_SUBSEC_TIME_DIG 0x9292
++#define EXIF_TAG_FLASH_PIX_VERSION 0xA000
++#define EXIF_TAG_COLOR_SPACE 0xA001
++#define EXIF_TAG_PIXEL_X_DIMENSION 0xA002
++#define EXIF_TAG_PIXEL_Y_DIMENSION 0xA003
++#define EXIF_TAG_CUSTOM_RENDERED 0xA401
++#define EXIF_TAG_EXPOSURE_MODE 0xA402
++#define EXIF_TAG_WHITE_BALANCE 0xA403
++#define EXIF_TAG_JPEG_ZOOM_RATIO 0XA404
++#define EXIF_TAG_SCENCE_CAPTURE_TYPE 0xA406
++#define EXIF_TAG_GAIN_CONTROL 0xA407
++#define EXIF_TAG_CONTRAST 0xA408
++#define EXIF_TAG_SATURATION 0xA409
++#define EXIF_TAG_SHARPNESS 0xA40A
++
++/* 0th IFD GPS Info Tags */
++#define EXIF_TAG_GPS_VERSION_ID 0x0000
++#define EXIF_TAG_GPS_LATITUDE_REF 0x0001
++#define EXIF_TAG_GPS_LATITUDE 0x0002
++#define EXIF_TAG_GPS_LONGITUDE_REF 0x0003
++#define EXIF_TAG_GPS_LONGITUDE 0x0004
++#define EXIF_TAG_GPS_ALTITUDE_REF 0x0005
++#define EXIF_TAG_GPS_ALTITUDE 0x0006
++#define EXIF_TAG_GPS_TIMESTAMP 0x0007
++#define EXIF_TAG_GPS_IMG_DIRECTION_REF 0x0010
++#define EXIF_TAG_GPS_IMG_DIRECTION 0x0011
++#define EXIF_TAG_GPS_PROCESSING_METHOD 0x001B
++#define EXIF_TAG_GPS_DATESTAMP 0x001D
++
++/* 1th IFD TIFF Tags */
++#define EXIF_TAG_COMPRESSION_SCHEME 0x0103
++/*
++#define EXIF_TAG_X_RESOLUTION                   0x011A
++#define EXIF_TAG_Y_RESOLUTION                   0x011B
++#define EXIF_TAG_RESOLUTION_UNIT                0x0128
++*/
++#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT 0x0201
++#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN 0x0202
++
++typedef enum {
++    EXIF_ORIENTATION_UP = 1,
++    EXIF_ORIENTATION_90 = 6,
++    EXIF_ORIENTATION_180 = 3,
++    EXIF_ORIENTATION_270 = 8,
++} ExifOrientationType;
++
++typedef enum {
++    EXIF_SCENE_STANDARD,
++    EXIF_SCENE_LANDSCAPE,
++    EXIF_SCENE_PORTRAIT,
++    EXIF_SCENE_NIGHT,
++} CamExifSceneCaptureType;
++
++typedef enum {
++    EXIF_METERING_UNKNOWN,
++    EXIF_METERING_AVERAGE,
++    EXIF_METERING_CENTER,
++    EXIF_METERING_SPOT,
++    EXIF_METERING_MULTISPOT,
++    EXIF_METERING_PATTERN,
++    EXIF_METERING_PARTIAL,
++    EXIF_METERING_OTHER = 255,
++} CamExifMeteringModeType;
++
++typedef enum {
++    EXIF_EXPOSURE_AUTO,
++    EXIF_EXPOSURE_MANUAL,
++    EXIF_EXPOSURE_AUTO_BRACKET,
++} CamExifExposureModeType;
++
++typedef enum {
++    EXIF_WB_AUTO,
++    EXIF_WB_MANUAL,
++} CamExifWhiteBalanceType;
++
++typedef enum {
++    EXIF_LIGHT_SOURCE_UNKNOWN,
++    EXIF_LIGHT_SOURCE_DAYLIGHT,
++    EXIF_LIGHT_SOURCE_FLUORESCENT,
++    EXIF_LIGHT_SOURCE_TUNGSTEN,
++    EXIF_LIGHT_SOURCE_FLASH,
++    EXIF_LIGHT_SOURCE_FINE_WEATHER = 9,
++    EXIF_LIGHT_SOURCE_CLOUDY_WEATHER,
++    EXIF_LIGHT_SOURCE_SHADE,
++    EXIF_LIGHT_SOURCE_DAYLIGHT_FLUORESCENT,
++    EXIF_LIGHT_SOURCE_DAY_WHITE_FLUORESCENT,
++    EXIF_LIGHT_SOURCE_COOL_WHITE_FLUORESCENT,
++    EXIF_LIGHT_SOURCE_WHITE_FLUORESCENT,
++    EXIF_LIGHT_SOURCE_WARM_WHITE_FLUORESCENT,  // value 16 is used in EXIF V2.3, not for EXIF V2.2
++    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_A,
++    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_B,
++    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_C,
++    EXIF_LIGHT_SOURCE_D55,
++    EXIF_LIGHT_SOURCE_D65,
++    EXIF_LIGHT_SOURCE_D75,
++    EXIF_LIGHT_SOURCE_D50,
++    EXIF_LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN,
++    EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE = 255,
++} CamExifLightSourceType;
++
++typedef enum {
++    EXIF_EXPOSURE_PROGRAM_MANUAL = 1,
++    EXIF_EXPOSURE_PROGRAM_NORMAL = 2,
++    EXIF_EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3,
++    EXIF_EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4
++} CamExifExposureProgramType;
++
++typedef enum {
++    EXIF_CONTRAST_NORMAL = 0,
++    EXIF_CONTRAST_SOFT = 1,
++    EXIF_CONTRAST_HARD = 2,
++} CamExifContrastType;
++
++typedef enum {
++    EXIF_SATURATION_NORMAL = 0,
++    EXIF_SATURATION_LOW = 1,
++    EXIF_SATURATION_HIGH = 2,
++} CamExifSaturationType;
++
++typedef enum {
++    EXIF_SHARPNESS_NORMAL = 0,
++    EXIF_SHARPNESS_SOFT = 1,
++    EXIF_SHARPNESS_HARD = 2,
++} CamExifSharpnessType;
++
++/* define the flag of enable gps info */
++const uint8_t EXIF_GPS_LATITUDE = 0x01;
++const uint8_t EXIF_GPS_LONGITUDE = 0x02;
++const uint8_t EXIF_GPS_ALTITUDE = 0x04;
++const uint8_t EXIF_GPS_TIMESTAMP = 0x08;
++const uint8_t EXIF_GPS_PROCMETHOD = 0x10;
++const uint8_t EXIF_GPS_IMG_DIRECTION = 0x20;
++
++/* Values */
++#define EXIF_DEF_IMAGE_DESCRIPTION "Jpeg"
++#define EXIF_DEF_SOFTWARE "Android"
++#define EXIF_DEF_EXIF_VERSION "0220"
++#define EXIF_DEF_USERCOMMENTS "  "
++#define EXIF_DEF_FLASHPIXVERSION "0100" /* Flashpix Format Version 1.0 */
++
++#define EXIF_DEF_YCBCR_POSITIONING 1 /* centered */
++#define EXIF_DEF_FNUMBER_NUM 26      /* 2.6 */
++#define EXIF_DEF_FNUMBER_DEN 10
++#define EXIF_DEF_EXPOSURE_PROGRAM 3 /* aperture priority */
++#define EXIF_DEF_FOCAL_LEN_NUM 278  /* 2.78mm */
++#define EXIF_DEF_FOCAL_LEN_DEN 100
++#define EXIF_DEF_FLASH 0                 /* O: off, 1: on*/
++#define EXIF_FLASH_FORCED_ON 1 << 3;     /* mode description */
++#define EXIF_FLASH_FORCED_OFF 1 << 4;    /* mode description */
++#define EXIF_FLASH_AUTO 1 << 3 | 1 << 4; /* mode description */
++#define EXIF_FLASH_ON 1                  /* O: off, 1: on - fired or not*/
++#define EXIF_DEF_COLOR_SPACE 1
++#define EXIF_DEF_CUSTOM_RENDERED 0
++#define EXIF_CUSTOM_RENDERED_HDR 1
++#define EXIF_DEF_EXPOSURE_MODE EXIF_EXPOSURE_AUTO
++#define EXIF_DEF_APEX_DEN 10
++#define EXIF_DEF_APEX_NUM 25
++#define EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN 0
++
++#define EXIF_DEF_COMPRESSION 6
++#define EXIF_DEF_RESOLUTION_NUM 72
++#define EXIF_DEF_RESOLUTION_DEN 1
++#define EXIF_DEF_RESOLUTION_UNIT 2 /* inches */
++
++typedef struct {
++    uint32_t num;
++    uint32_t den;
++} rational_t;
++
++typedef struct {
++    int32_t num;
++    int32_t den;
++} srational_t;
++
++typedef struct {
++    bool enableThumb;
++
++    uint8_t image_description[32];
++    uint8_t flashpix_version[4];
++    uint8_t components_configuration[4];
++    uint8_t maker[32];
++    uint8_t model[32];
++    uint8_t software[32];
++    uint8_t exif_version[4];
++    uint8_t date_time[20];
++    uint8_t subsec_time[8];
++    uint8_t user_comment[150];
++
++    uint32_t width;
++    uint32_t height;
++    uint32_t widthThumb;
++    uint32_t heightThumb;
++
++    uint16_t orientation;
++    uint16_t ycbcr_positioning;
++    uint16_t exposure_program;
++    uint16_t iso_speed_rating;
++    uint16_t metering_mode;
++    uint16_t flash;
++    uint16_t color_space;
++    uint16_t custom_rendered;
++    uint16_t exposure_mode;
++    uint16_t white_balance;
++    rational_t zoom_ratio;
++    uint16_t scene_capture_type;
++    uint16_t light_source;
++    uint16_t gain_control;
++    uint16_t contrast;
++    uint16_t saturation;
++    uint16_t sharpness;
++
++    rational_t exposure_time;
++    rational_t fnumber;
++    rational_t aperture;
++    rational_t max_aperture;
++    rational_t focal_length;
++    rational_t subject_distance;
++
++    srational_t shutter_speed;
++    srational_t brightness;
++    srational_t exposure_bias;
++
++    // bit 0~4 indicate whether Gps items latitude, longitude, altitude, timestamp,
++    // datastamp exist or not.
++    uint8_t enableGps;
++    uint8_t gps_latitude_ref[2];
++    uint8_t gps_longitude_ref[2];
++
++    uint8_t gps_version_id[4];
++    uint8_t gps_altitude_ref;
++
++    rational_t gps_latitude[3];
++    rational_t gps_longitude[3];
++    rational_t gps_altitude;
++    rational_t gps_timestamp[3];
++    uint8_t gps_datestamp[11];
++    uint8_t gps_processing_method[100];
++
++    uint8_t gps_img_direction_ref[2];
++    rational_t gps_img_direction;
++
++    rational_t x_resolution;
++    rational_t y_resolution;
++    uint16_t resolution_unit;
++    uint16_t compression_scheme;
++
++    uint16_t makerNoteDataSize;
++    unsigned char* makerNoteData;
++    bool makernoteToApp2;
++} exif_attribute_t;
+diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
+new file mode 100644
+index 000000000000..34f885ae48f8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
+@@ -0,0 +1,542 @@
++/*
++ * Copyright Samsung Electronics Co.,LTD.
++ * Copyright (C) 2010 The Android Open Source Project
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *
++ * JPEG DRIVER MODULE (ExifCreater.cpp)
++ * Author  : ge.lee       -- initial version
++ * Date    : 03 June 2010
++ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
++ */
++
++#define LOG_TAG "ExifCreater"
++
++#include "ExifCreater.h"
++
++#include <fcntl.h>
++#include <sys/mman.h>
++
++#include "iutils/CameraLog.h"
++
++static const char ExifAsciiPrefix[] = {0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0};
++
++namespace icamera {
++
++ExifCreater::ExifCreater() {
++    m_thumbBuf = nullptr;
++    m_thumbSize = 0;
++}
++
++ExifCreater::~ExifCreater() {}
++
++exif_status ExifCreater::setThumbData(const void* thumbBuf, unsigned int thumbSize) {
++    // TODO: Maybe we should take into account the rest of the EXIF data as well here,
++    // not just the thumbnail size.
++    if (thumbSize >= EXIF_SIZE_LIMITATION) {
++        LOGE("ERROR: Too big thumb size %d (limit: %d)", thumbSize, EXIF_SIZE_LIMITATION);
++        m_thumbBuf = nullptr;
++        m_thumbSize = 0;
++        return EXIF_FAIL;
++    }
++
++    m_thumbBuf = static_cast<unsigned char*>(const_cast<void*>(thumbBuf));
++    m_thumbSize = thumbSize;
++    return EXIF_SUCCESS;
++}
++
++bool ExifCreater::isThumbDataSet() const {
++    return m_thumbBuf != nullptr;
++}
++
++// if exif tags size + thumbnail size is > 64K, it will disable thumbnail
++exif_status ExifCreater::makeExif(void* exifOut, exif_attribute_t* exifInfo, size_t* size) {
++    LOG1("makeExif start");
++
++    unsigned char *pCur, *pApp1Start, *pIfdStart, *pGpsIfdPtr, *pNextIfdOffset;
++    unsigned int tmp, LongerTagOffset = 0, LongerTagOffsetWithoutThumbnail;
++    pApp1Start = pCur = static_cast<unsigned char*>(exifOut);
++
++    // 2 Exif Identifier Code & TIFF Header
++    pCur += 4;  // Skip 4 Byte for APP1 marker and length
++    unsigned char ExifIdentifierCode[6] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
++    MEMCPY_S(pCur, sizeof(ExifIdentifierCode), ExifIdentifierCode, sizeof(ExifIdentifierCode));
++    pCur += 6;
++
++    /* Byte Order - little endian, Offset of IFD - 0x00000008.H */
++    unsigned char TiffHeader[8] = {0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00};
++    MEMCPY_S(pCur, sizeof(TiffHeader), TiffHeader, sizeof(TiffHeader));
++    pIfdStart = pCur;
++    pCur += 8;
++
++    // 2 0th IFD TIFF Tags
++    if (exifInfo->enableGps)
++        tmp = NUM_0TH_IFD_TIFF;
++    else
++        tmp = NUM_0TH_IFD_TIFF - 1;
++
++    MEMCPY_S(pCur, NUM_SIZE, (int8_t*)&tmp, NUM_SIZE);
++    pCur += NUM_SIZE;
++
++    LongerTagOffset += 8 + NUM_SIZE + tmp * IFD_SIZE + OFFSET_SIZE;
++
++    writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG, 1, exifInfo->width);
++    writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG, 1, exifInfo->height);
++    writeExifIfd(&pCur, EXIF_TAG_IMAGE_DESCRIPTION, EXIF_TYPE_ASCII,
++                 strlen(reinterpret_cast<char*>(exifInfo->image_description)) + 1,
++                 exifInfo->image_description, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_MAKE, EXIF_TYPE_ASCII, strlen((char*)exifInfo->maker) + 1,
++                 exifInfo->maker, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_MODEL, EXIF_TYPE_ASCII, strlen((char*)exifInfo->model) + 1,
++                 exifInfo->model, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT, 1, exifInfo->orientation);
++    writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL, 1, &exifInfo->x_resolution,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL, 1, &exifInfo->y_resolution,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT, 1, exifInfo->resolution_unit);
++    writeExifIfd(&pCur, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII, strlen((char*)exifInfo->software) + 1,
++                 exifInfo->software, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII, 20, exifInfo->date_time,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_YCBCR_POSITIONING, EXIF_TYPE_SHORT, 1,
++                 exifInfo->ycbcr_positioning);
++    writeExifIfd(&pCur, EXIF_TAG_EXIF_IFD_POINTER, EXIF_TYPE_LONG, 1, LongerTagOffset);
++
++    pGpsIfdPtr = pCur;
++    if (exifInfo->enableGps) {
++        pCur += IFD_SIZE;  // Skip a ifd size for gps IFD pointer
++    }
++
++    pNextIfdOffset = pCur;  // Skip a offset size for next IFD offset
++    pCur += OFFSET_SIZE;
++
++    // 2 0th IFD Exif Private Tags
++    pCur = pIfdStart + LongerTagOffset;
++
++    int drop_num = 0;
++    if (exifInfo->exposure_time.den == 0) drop_num++;
++    if (exifInfo->shutter_speed.den == 0) drop_num++;
++    if (exifInfo->makerNoteDataSize == 0 || exifInfo->makernoteToApp2) {
++        // skip the makernote IFD in APP1, when we don't have any,
++        // or if we want it to APP2
++        drop_num++;
++    }
++    tmp = NUM_0TH_IFD_EXIF - drop_num;
++    MEMCPY_S(pCur, NUM_SIZE, &tmp, NUM_SIZE);
++    pCur += NUM_SIZE;
++
++    LongerTagOffset += NUM_SIZE + tmp * IFD_SIZE + OFFSET_SIZE;
++    if (exifInfo->exposure_time.den != 0) {
++        writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL, 1, &exifInfo->exposure_time,
++                     &LongerTagOffset, pIfdStart);
++    }
++    writeExifIfd(&pCur, EXIF_TAG_FNUMBER, EXIF_TYPE_RATIONAL, 1, &exifInfo->fnumber,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_PROGRAM, EXIF_TYPE_SHORT, 1, exifInfo->exposure_program);
++    writeExifIfd(&pCur, EXIF_TAG_ISO_SPEED_RATING, EXIF_TYPE_SHORT, 1, exifInfo->iso_speed_rating);
++    writeExifIfd(&pCur, EXIF_TAG_EXIF_VERSION, EXIF_TYPE_UNDEFINED, 4, exifInfo->exif_version);
++    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_ORG, EXIF_TYPE_ASCII, 20, exifInfo->date_time,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_DIGITIZE, EXIF_TYPE_ASCII, 20, exifInfo->date_time,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_COMPONENTS_CONFIGURATION, EXIF_TYPE_UNDEFINED, 4,
++                 exifInfo->components_configuration);
++    if (exifInfo->shutter_speed.den != 0) {
++        writeExifIfd(&pCur, EXIF_TAG_SHUTTER_SPEED, EXIF_TYPE_SRATIONAL, 1,
++                     reinterpret_cast<rational_t*>(&exifInfo->shutter_speed), &LongerTagOffset,
++                     pIfdStart);
++    }
++    writeExifIfd(&pCur, EXIF_TAG_APERTURE, EXIF_TYPE_RATIONAL, 1, &exifInfo->aperture,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_BRIGHTNESS, EXIF_TYPE_SRATIONAL, 1,
++                 reinterpret_cast<rational_t*>(&exifInfo->brightness), &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_BIAS, EXIF_TYPE_SRATIONAL, 1,
++                 reinterpret_cast<rational_t*>(&exifInfo->exposure_bias), &LongerTagOffset,
++                 pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_MAX_APERTURE, EXIF_TYPE_RATIONAL, 1, &exifInfo->max_aperture,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_SUBJECT_DISTANCE, EXIF_TYPE_RATIONAL, 1,
++                 &exifInfo->subject_distance, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT, 1, exifInfo->metering_mode);
++    writeExifIfd(&pCur, EXIF_TAG_LIGHT_SOURCE, EXIF_TYPE_SHORT, 1, exifInfo->light_source);
++    writeExifIfd(&pCur, EXIF_TAG_FLASH, EXIF_TYPE_SHORT, 1, exifInfo->flash);
++    writeExifIfd(&pCur, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL, 1, &exifInfo->focal_length,
++                 &LongerTagOffset, pIfdStart);
++    char code[8] = {0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00};
++    size_t commentsLen = strlen((char*)exifInfo->user_comment) + 1;
++    if (commentsLen > (sizeof(exifInfo->user_comment) - sizeof(code))) return EXIF_FAIL;
++    memmove(exifInfo->user_comment + sizeof(code), exifInfo->user_comment, commentsLen);
++    MEMCPY_S(exifInfo->user_comment, sizeof(exifInfo->user_comment), code, sizeof(code));
++    writeExifIfd(&pCur, EXIF_TAG_USER_COMMENT, EXIF_TYPE_UNDEFINED, commentsLen + sizeof(code),
++                 exifInfo->user_comment, &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME, EXIF_TYPE_ASCII,
++                 strlen((char*)exifInfo->subsec_time) + 1, exifInfo->subsec_time, &LongerTagOffset,
++                 pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_ORIG, EXIF_TYPE_ASCII,
++                 strlen((char*)exifInfo->subsec_time) + 1, exifInfo->subsec_time, &LongerTagOffset,
++                 pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_DIG, EXIF_TYPE_ASCII,
++                 strlen((char*)exifInfo->subsec_time) + 1, exifInfo->subsec_time, &LongerTagOffset,
++                 pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_FLASH_PIX_VERSION, EXIF_TYPE_UNDEFINED, 4,
++                 exifInfo->flashpix_version);
++    writeExifIfd(&pCur, EXIF_TAG_COLOR_SPACE, EXIF_TYPE_SHORT, 1, exifInfo->color_space);
++    writeExifIfd(&pCur, EXIF_TAG_PIXEL_X_DIMENSION, EXIF_TYPE_LONG, 1, exifInfo->width);
++    writeExifIfd(&pCur, EXIF_TAG_PIXEL_Y_DIMENSION, EXIF_TYPE_LONG, 1, exifInfo->height);
++    writeExifIfd(&pCur, EXIF_TAG_CUSTOM_RENDERED, EXIF_TYPE_SHORT, 1, exifInfo->custom_rendered);
++    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_SHORT, 1, exifInfo->exposure_mode);
++    writeExifIfd(&pCur, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_SHORT, 1, exifInfo->white_balance);
++    writeExifIfd(&pCur, EXIF_TAG_JPEG_ZOOM_RATIO, EXIF_TYPE_RATIONAL, 1, &exifInfo->zoom_ratio,
++                 &LongerTagOffset, pIfdStart);
++    writeExifIfd(&pCur, EXIF_TAG_SCENCE_CAPTURE_TYPE, EXIF_TYPE_SHORT, 1,
++                 exifInfo->scene_capture_type);
++    writeExifIfd(&pCur, EXIF_TAG_GAIN_CONTROL, EXIF_TYPE_SHORT, 1, exifInfo->gain_control);
++    writeExifIfd(&pCur, EXIF_TAG_CONTRAST, EXIF_TYPE_SHORT, 1, exifInfo->contrast);
++    writeExifIfd(&pCur, EXIF_TAG_SATURATION, EXIF_TYPE_SHORT, 1, exifInfo->saturation);
++    writeExifIfd(&pCur, EXIF_TAG_SHARPNESS, EXIF_TYPE_SHORT, 1, exifInfo->sharpness);
++
++    // Save MakerNote data to APP1, unless we want it APP2
++    if (exifInfo->makerNoteDataSize > 0 && !exifInfo->makernoteToApp2) {
++        writeExifIfd(&pCur, EXIF_TAG_MAKER_NOTE, EXIF_TYPE_UNDEFINED, exifInfo->makerNoteDataSize,
++                     (unsigned char*)exifInfo->makerNoteData, &LongerTagOffset, pIfdStart);
++    }
++
++    tmp = 0;
++    MEMCPY_S(pCur, OFFSET_SIZE, (int8_t*)&tmp, OFFSET_SIZE);  // next IFD offset
++    pCur += OFFSET_SIZE;
++
++    // 2 0th IFD GPS Info Tags
++    if (exifInfo->enableGps) {
++        writeExifIfd(&pGpsIfdPtr, EXIF_TAG_GPS_IFD_POINTER, EXIF_TYPE_LONG, 1,
++                     LongerTagOffset);  // GPS IFD pointer skipped on 0th IFD
++
++        pCur = pIfdStart + LongerTagOffset;
++
++        tmp = NUM_0TH_IFD_GPS;
++        if ((exifInfo->enableGps & EXIF_GPS_LATITUDE) == 0) tmp -= 2;
++        if ((exifInfo->enableGps & EXIF_GPS_LONGITUDE) == 0) tmp -= 2;
++        if ((exifInfo->enableGps & EXIF_GPS_ALTITUDE) == 0) tmp -= 2;
++        if ((exifInfo->enableGps & EXIF_GPS_TIMESTAMP) == 0) tmp -= 1;
++        if ((exifInfo->enableGps & EXIF_GPS_PROCMETHOD) == 0) tmp -= 1;
++        if ((exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) == 0) tmp -= 2;
++
++        MEMCPY_S(pCur, NUM_SIZE, (int8_t*)&tmp, NUM_SIZE);
++        pCur += NUM_SIZE;
++
++        LongerTagOffset += NUM_SIZE + tmp * IFD_SIZE + OFFSET_SIZE;
++
++        writeExifIfd(&pCur, EXIF_TAG_GPS_VERSION_ID, EXIF_TYPE_BYTE, 4, exifInfo->gps_version_id);
++        if (exifInfo->enableGps & EXIF_GPS_LATITUDE) {
++            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE_REF, EXIF_TYPE_ASCII, 2,
++                         exifInfo->gps_latitude_ref);
++            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL, 3,
++                         exifInfo->gps_latitude, &LongerTagOffset, pIfdStart);
++        }
++
++        if (exifInfo->enableGps & EXIF_GPS_LONGITUDE) {
++            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_TYPE_ASCII, 2,
++                         exifInfo->gps_longitude_ref);
++            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL, 3,
++                         exifInfo->gps_longitude, &LongerTagOffset, pIfdStart);
++        }
++
++        if (exifInfo->enableGps & EXIF_GPS_ALTITUDE) {
++            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_TYPE_BYTE, 1,
++                         exifInfo->gps_altitude_ref);
++            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL, 1,
++                         &exifInfo->gps_altitude, &LongerTagOffset, pIfdStart);
++        }
++
++        if (exifInfo->enableGps & EXIF_GPS_TIMESTAMP) {
++            writeExifIfd(&pCur, EXIF_TAG_GPS_TIMESTAMP, EXIF_TYPE_RATIONAL, 3,
++                         exifInfo->gps_timestamp, &LongerTagOffset, pIfdStart);
++        }
++
++        if (exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) {
++            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION_REF, EXIF_TYPE_ASCII, 2,
++                         exifInfo->gps_img_direction_ref);
++            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION, EXIF_TYPE_RATIONAL, 1,
++                         &exifInfo->gps_img_direction, &LongerTagOffset, pIfdStart);
++        }
++
++        if (exifInfo->enableGps & EXIF_GPS_PROCMETHOD) {
++            tmp = strlen((char*)exifInfo->gps_processing_method);
++            if (tmp > 0) {
++                if (tmp > 100) {
++                    tmp = 100;
++                }
++                unsigned char tmp_buf[100 + sizeof(ExifAsciiPrefix)];
++                MEMCPY_S(tmp_buf, sizeof(tmp_buf), ExifAsciiPrefix, sizeof(ExifAsciiPrefix));
++                MEMCPY_S(&tmp_buf[sizeof(ExifAsciiPrefix)], 100, exifInfo->gps_processing_method,
++                         tmp);
++                writeExifIfd(&pCur, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_TYPE_UNDEFINED,
++                             tmp + sizeof(ExifAsciiPrefix), tmp_buf, &LongerTagOffset, pIfdStart);
++            }
++        }
++        writeExifIfd(&pCur, EXIF_TAG_GPS_DATESTAMP, EXIF_TYPE_ASCII, 11, exifInfo->gps_datestamp,
++                     &LongerTagOffset, pIfdStart);
++        tmp = 0;
++        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t*)&tmp, OFFSET_SIZE);  // next IFD offset
++        pCur += OFFSET_SIZE;
++    }
++
++    // backup LongerTagOffset, if the total exif size is > 64K, we will use it.
++    LongerTagOffsetWithoutThumbnail = LongerTagOffset;
++    if (LongerTagOffsetWithoutThumbnail >= EXIF_SIZE_LIMITATION) {
++        LOGE("line:%d, in the makeExif, the size exceeds 64K", __LINE__);
++        return EXIF_FAIL;
++    }
++
++    // 2 1th IFD TIFF Tags
++    if (exifInfo->enableThumb && (m_thumbBuf != nullptr) && (m_thumbSize > 0)) {
++        writeThumbData(pIfdStart, pNextIfdOffset, &LongerTagOffset, exifInfo);
++    } else {
++        tmp = 0;
++        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t*)&tmp,
++                 OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
++    }
++
++    // fill APP1 maker
++    unsigned char App1Marker[2] = {0xff, 0xe1};
++    MEMCPY_S(pApp1Start, 2, App1Marker, 2);
++    pApp1Start += 2;
++
++    // calc and fill the APP1 segment total size, 2 is length; 6 is ExifIdentifierCode
++    *size = 2 + 6 + LongerTagOffset;
++
++    writeMarkerSizeToBuf(pApp1Start, *size);
++
++    unsigned app2StartOffset = *size;
++    *size += 2;  // APP1 marker size
++
++    exif_status status = EXIF_SUCCESS;
++
++    if (exifInfo->makernoteToApp2) {
++        LOG1("Makernote goes to APP2 segment.");
++        status = makeApp2((pApp1Start + app2StartOffset), *size, exifInfo);
++    }
++
++    if (status != EXIF_SUCCESS) LOGW("Failed to create EXIF APP2 section");
++
++    LOG1("makeExif End");
++
++    return EXIF_SUCCESS;
++}
++
++void ExifCreater::writeMarkerSizeToBuf(unsigned char* ptrTo, unsigned int size) {
++    unsigned char size_mm[2] = {static_cast<unsigned char>((size >> 8) & 0xFF),
++                                static_cast<unsigned char>(size & 0xFF)};
++
++    MEMCPY_S(ptrTo, 2, size_mm, 2);
++}
++
++/**
++ * makeApp2
++ *
++ * Write the makernote to APP2 segment. Use multiple APP2 segments if makernote
++ * size is more than one segment (64 kb)
++ *
++ * \param pStartApp2 [IN] APP2 start address
++ * \param exifInfo [IN] Data to be written
++ * \param writeId [IN] Whether to write the Intel Makernote ID string.
++ * \param size [OUT] Total size after APP2 is written
++ */
++exif_status ExifCreater::makeApp2(void* pStartApp2, size_t& size, exif_attribute_t* exifInfo,
++                                  bool writeId) {
++    LOG1("@%s", __func__);
++
++    // APP2 marker will be written starting from the pos pointed to by
++    // pStartApp2
++
++    if (exifInfo->makerNoteDataSize <= 0) return EXIF_SUCCESS;
++
++    int bytesLeftForSegment = EXIF_SIZE_LIMITATION;
++    int bytesToWrite = exifInfo->makerNoteDataSize;
++
++    unsigned char *pCur = nullptr, *pApp2Start = nullptr;
++    unsigned char App2Marker[SIZEOF_APP2_MARKER] = {0xff, 0xe2};
++    int writeCount = 0;
++    unsigned char* toWrite = exifInfo->makerNoteData;
++
++    pCur = static_cast<unsigned char*>(pStartApp2);
++
++    // Write Makernote up to ~64kB, then split to a new
++    // APP2 segment, if needed
++    while (bytesToWrite > 0) {
++        pApp2Start = pCur;
++        pCur += 4;  // Skip 4 bytes for APP2 marker and length
++
++        if (writeId) {
++            MEMCPY_S(pCur, sizeof(MAKERNOTE_ID), MAKERNOTE_ID, sizeof(MAKERNOTE_ID));
++            pCur += sizeof(MAKERNOTE_ID);
++            size += sizeof(MAKERNOTE_ID);
++            // ID overhead for one APP2 segment
++            bytesLeftForSegment -= sizeof(MAKERNOTE_ID);
++        }
++
++        // Overhead for one APP2 segment:
++        bytesLeftForSegment -= (sizeof(App2Marker) + SIZEOF_LENGTH_FIELD);
++
++        if (bytesToWrite > bytesLeftForSegment) {
++            // More data to write than what fits to one APP2 marker
++            writeCount = bytesLeftForSegment;
++        } else {
++            // All data fits to one APP2 segment
++            writeCount = bytesToWrite;
++        }
++
++        bytesToWrite -= writeCount;
++
++        MEMCPY_S(pCur, writeCount, toWrite, writeCount);
++        pCur += writeCount;
++        toWrite += writeCount;
++        size += writeCount;
++
++        // Last, put the APP2 marker to the beginning of the segment
++        MEMCPY_S(pApp2Start, sizeof(App2Marker), App2Marker, sizeof(App2Marker));
++        pApp2Start += sizeof(App2Marker);
++
++        // Length field goes after the APP2 marker
++        int app2SegmentSize = writeCount + SIZEOF_LENGTH_FIELD;  // Raw data written + overhead
++        if (writeId) app2SegmentSize += sizeof(MAKERNOTE_ID);
++
++        writeMarkerSizeToBuf(pApp2Start, app2SegmentSize);
++
++        // add the 2 bytes for both length field and APP2 marker, the caller has to know the total
++        // size
++        size += sizeof(App2Marker) + SIZEOF_LENGTH_FIELD;
++
++        // Reset byte counts for another APP2 segment, if needed
++        bytesLeftForSegment = EXIF_SIZE_LIMITATION;
++    }
++
++    return EXIF_SUCCESS;
++}
++
++void ExifCreater::writeThumbData(unsigned char* pIfdStart, unsigned char* pNextIfdOffset,
++                                 unsigned int* LongerTagOffset, exif_attribute_t* exifInfo) {
++    unsigned char* pCur;
++    unsigned int tmp;
++
++    // firstly calc the exif total size, if it's > 64K, we'll disable the thumbnail
++    tmp = 4 + 6 + *LongerTagOffset;  // 4 is APP1 marker and length; 6 is ExifIdentifierCode
++    tmp += NUM_SIZE + NUM_1TH_IFD_TIFF * IFD_SIZE + OFFSET_SIZE;
++    tmp += sizeof(exifInfo->x_resolution) + sizeof(exifInfo->y_resolution);
++    tmp += m_thumbSize;
++
++    if (tmp > EXIF_SIZE_LIMITATION) {
++        LOGD("line:%d, in makeExif, exif total size(%d) > 64K, we'll disable thumbnail.", __LINE__,
++             tmp);
++        m_thumbSize = 0;
++        m_thumbBuf = nullptr;
++        tmp = 0;
++        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t*)&tmp,
++                 OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
++    } else {
++        tmp = *LongerTagOffset;
++        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t*)&tmp,
++                 OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
++
++        pCur = pIfdStart + *LongerTagOffset;
++
++        tmp = NUM_1TH_IFD_TIFF;
++        MEMCPY_S(pCur, NUM_SIZE, (int8_t*)&tmp, NUM_SIZE);
++        pCur += NUM_SIZE;
++
++        *LongerTagOffset += NUM_SIZE + NUM_1TH_IFD_TIFF * IFD_SIZE + OFFSET_SIZE;
++
++        writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG, 1, exifInfo->widthThumb);
++        writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG, 1, exifInfo->heightThumb);
++        writeExifIfd(&pCur, EXIF_TAG_COMPRESSION_SCHEME, EXIF_TYPE_SHORT, 1,
++                     exifInfo->compression_scheme);
++        writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT, 1, exifInfo->orientation);
++        writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL, 1, &exifInfo->x_resolution,
++                     LongerTagOffset, pIfdStart);
++        writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL, 1, &exifInfo->y_resolution,
++                     LongerTagOffset, pIfdStart);
++        writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT, 1,
++                     exifInfo->resolution_unit);
++        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT, EXIF_TYPE_LONG, 1, *LongerTagOffset);
++        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN, EXIF_TYPE_LONG, 1, m_thumbSize);
++
++        tmp = 0;
++        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t*)&tmp, OFFSET_SIZE);  // next IFD offset
++        // pCur += OFFSET_SIZE;
++
++        MEMCPY_S(pIfdStart + *LongerTagOffset, m_thumbSize, m_thumbBuf, m_thumbSize);
++        *LongerTagOffset += m_thumbSize;
++    }
++}
++
++void ExifCreater::writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                               unsigned int count, uint32_t value) {
++    MEMCPY_S(*pCur, 2, (int8_t*)&tag, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 2, (int8_t*)&type, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 4, (int8_t*)&count, 4);
++    *pCur += 4;
++    MEMCPY_S(*pCur, 4, (int8_t*)&value, 4);
++    *pCur += 4;
++}
++
++void ExifCreater::writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                               unsigned int count, unsigned char* pValue) {
++    char buf[4] = {
++        0,
++    };
++
++    MEMCPY_S(buf, count, pValue, count);
++    MEMCPY_S(*pCur, 2, (int8_t*)&tag, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 2, (int8_t*)&type, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 4, (int8_t*)&count, 4);
++    *pCur += 4;
++    MEMCPY_S(*pCur, 4, (int8_t*)buf, 4);
++    *pCur += 4;
++}
++
++void ExifCreater::writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                               unsigned int count, unsigned char* pValue, unsigned int* offset,
++                               unsigned char* start) {
++    MEMCPY_S(*pCur, 2, (int8_t*)&tag, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 2, (int8_t*)&type, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 4, (int8_t*)&count, 4);
++    *pCur += 4;
++    MEMCPY_S(*pCur, 4, (int8_t*)offset, 4);
++    *pCur += 4;
++    MEMCPY_S(start + *offset, count, pValue, count);
++    *offset += count;
++}
++
++void ExifCreater::writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                               unsigned int count, rational_t* pValue, unsigned int* offset,
++                               unsigned char* start) {
++    MEMCPY_S(*pCur, 2, (int8_t*)&tag, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 2, (int8_t*)&type, 2);
++    *pCur += 2;
++    MEMCPY_S(*pCur, 4, (int8_t*)&count, 4);
++    *pCur += 4;
++    MEMCPY_S(*pCur, 4, (int8_t*)offset, 4);
++    *pCur += 4;
++    MEMCPY_S(start + *offset, 8 * count, (int8_t*)pValue, 8 * count);
++    *offset += 8 * count;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
+new file mode 100644
+index 000000000000..bf90e260567e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
+@@ -0,0 +1,114 @@
++/*
++ * Copyright Samsung Electronics Co.,LTD.
++ * Copyright (C) 2010 The Android Open Source Project
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *
++ * JPEG DRIVER MODULE (JpegEncoder.h)
++ * Author  : ge.lee       -- initial version
++ * Date    : 03 June 2010
++ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
++ */
++
++#pragma once
++
++#include <stdint.h>
++#include <sys/ioctl.h>
++
++#include "Exif.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++#define MAX_JPG_WIDTH 4352
++#define MAX_JPG_HEIGHT 3264
++#define MAX_JPG_RESOLUTION (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
++
++#define MAX_JPG_THUMBNAIL_WIDTH 640
++#define MAX_JPG_THUMBNAIL_HEIGHT 480
++#define MAX_JPG_THUMBNAIL_RESOLUTION (MAX_JPG_THUMBNAIL_WIDTH * MAX_JPG_THUMBNAIL_HEIGHT)
++
++#define MAX_RGB_WIDTH 800
++#define MAX_RGB_HEIGHT 480
++#define MAX_RGB_RESOLUTION (MAX_RGB_WIDTH * MAX_RGB_HEIGHT)
++
++/*******************************************************************************/
++/* define JPG & image memory */
++/* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */
++#define JPG_STREAM_BUF_SIZE ((MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
++#define JPG_STREAM_THUMB_BUF_SIZE ((MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
++#define JPG_FRAME_BUF_SIZE (((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
++#define JPG_FRAME_THUMB_BUF_SIZE (((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
++#define JPG_RGB_BUF_SIZE (((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE)
++
++#define JPG_TOTAL_BUF_SIZE                                                  \
++    (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE + JPG_FRAME_BUF_SIZE + \
++     JPG_FRAME_THUMB_BUF_SIZE + JPG_RGB_BUF_SIZE)
++
++#define JPG_MAIN_START 0x00
++#define JPG_THUMB_START JPG_STREAM_BUF_SIZE
++#define IMG_MAIN_START (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
++#define IMG_THUMB_START (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
++/*******************************************************************************/
++
++const char MAKERNOTE_ID[] = {0x49, 0x6e, 0x74, 0x65, 0x6c, 0x4d,
++                             0x6b, 0x6e, 0x6f, 0x74, 0x65, 0x0 /* "IntelMknote\0" */};
++
++const unsigned SIZEOF_LENGTH_FIELD = 2;
++const unsigned SIZEOF_APP2_MARKER = 2;
++const unsigned SIZEOF_APP2_OVERHEAD =
++    sizeof(MAKERNOTE_ID) + SIZEOF_APP2_MARKER + SIZEOF_LENGTH_FIELD;
++const bool ENABLE_APP2_MARKER = true;
++typedef enum { EXIF_FAIL = -1, EXIF_SUCCESS = 0 } exif_status;
++
++class ExifCreater {
++ public:
++    ExifCreater();
++    virtual ~ExifCreater();
++
++    exif_status setThumbData(const void* thumbBuf, unsigned int thumbSize);
++
++    bool isThumbDataSet() const;
++
++    exif_status makeExif(void* exifOut, exif_attribute_t* exifInfo, size_t* size);
++
++ private:
++    exif_status makeApp2(void* pStartApp2, size_t& size, exif_attribute_t* exifInfo,
++                         bool writeId = true);
++    void writeMarkerSizeToBuf(unsigned char* ptrTo, unsigned int size);
++    /*
++        Every IFD has 12Bytes.
++        Tag ID, 2B; Type, 2B; Count, 4B; Value/Offset, 4B;
++        If it is Value, please use the first two functions.
++        If it is Offset, please use the last two functions
++        and store the data in the rear.
++    */
++    void writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                      unsigned int count, uint32_t value);
++    void writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                      unsigned int count, unsigned char* pValue);
++    void writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                      unsigned int count, rational_t* pValue, unsigned int* offset,
++                      unsigned char* start);
++    void writeExifIfd(unsigned char** pCur, unsigned short tag, unsigned short type,
++                      unsigned int count, unsigned char* pValue, unsigned int* offset,
++                      unsigned char* start);
++    void writeThumbData(unsigned char* pIfdStart, unsigned char* pNextIfdOffset,
++                        unsigned int* LongerTagOffset, exif_attribute_t* exifInfo);
++
++    unsigned char* m_thumbBuf;  // MAP: Added to set thumbnail from external data
++    unsigned int m_thumbSize;   // MAP: Added to set thumbnail from external data
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
+new file mode 100644
+index 000000000000..9e810b07f13d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++#define DEFAULT_JPEG_QUALITY 95
++static const unsigned char mJpegMarkerSOI[2] = {0xFF, 0xD8};
++
++struct EncodePackage {
++    EncodePackage()
++            : inputWidth(0),
++              inputHeight(0),
++              inputStride(0),
++              inputFormat(0),
++              inputSize(0),
++              inputBufferHandle(nullptr),
++              inputData(nullptr),
++              outputWidth(0),
++              outputHeight(0),
++              outputSize(0),
++              outputBufferHandle(nullptr),
++              outputData(nullptr),
++              quality(0),
++              encodedDataSize(0),
++              exifData(nullptr),
++              exifDataSize(0) {}
++
++    /* input buffer info */
++    int inputWidth;
++    int inputHeight;
++    int inputStride;
++    int inputFormat;
++    unsigned int inputSize;
++    void* inputBufferHandle;
++    void* inputData;
++
++    /* output buffer info */
++    int outputWidth;
++    int outputHeight;
++    unsigned int outputSize;
++    void* outputBufferHandle;
++    void* outputData;
++
++    int quality;
++    uint32_t encodedDataSize;
++    uint8_t* exifData;
++    uint32_t exifDataSize;
++};
++
++class IJpegEncoder {
++ public:
++    IJpegEncoder(){};
++    virtual ~IJpegEncoder(){};
++
++    static std::unique_ptr<IJpegEncoder> createJpegEncoder();
++    virtual bool doJpegEncode(EncodePackage* package) = 0;
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(IJpegEncoder);
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
+new file mode 100644
+index 000000000000..bbfe08556d8d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
+@@ -0,0 +1,222 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "JpegMaker"
++
++#include "JpegMaker.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++JpegMaker::JpegMaker() {
++    LOG2("@%s", __func__);
++    mExifMaker = std::unique_ptr<EXIFMaker>(new EXIFMaker());
++}
++
++JpegMaker::~JpegMaker() {
++    LOG2("@%s", __func__);
++}
++
++status_t JpegMaker::setupExifWithMetaData(int bufWidth, int bufHeight, const Parameters& parameter,
++                                          ExifMetaData* metaData) {
++    LOG2("@%s", __func__);
++
++    status_t status = OK;
++
++    status = processJpegSettings(parameter, metaData);
++    CheckError(status != OK, status, "@%s: Process settngs for JPEG failed!", __func__);
++
++    mExifMaker->initialize(bufWidth, bufHeight);
++    mExifMaker->pictureTaken(metaData);
++
++    mExifMaker->enableFlash(metaData->flashFired, metaData->v3AeMode, metaData->flashMode);
++    mExifMaker->updateSensorInfo(parameter);
++    mExifMaker->saveMakernote(parameter);
++
++    status = processExifSettings(parameter, metaData);
++    if (status != OK) {
++        LOGE("@%s: Process settngs for Exif! %d", __func__, status);
++        return status;
++    }
++
++    mExifMaker->initializeLocation(metaData);
++    mExifMaker->setSensorAeConfig(parameter);
++
++    if (metaData->software) mExifMaker->setSoftware(metaData->software);
++
++    return status;
++}
++
++status_t JpegMaker::getExif(const EncodePackage& thumbnailPackage, uint8_t* exifPtr,
++                            uint32_t* exifSize) {
++    if (thumbnailPackage.encodedDataSize > 0 && thumbnailPackage.quality > 0) {
++        mExifMaker->setThumbnail(static_cast<unsigned char*>(thumbnailPackage.outputData),
++                                 thumbnailPackage.encodedDataSize, thumbnailPackage.outputWidth,
++                                 thumbnailPackage.outputHeight);
++    }
++    *exifSize = mExifMaker->makeExif(exifPtr);
++    return *exifSize > 0 ? OK : UNKNOWN_ERROR;
++}
++
++status_t JpegMaker::processExifSettings(const Parameters& params, ExifMetaData* metaData) {
++    LOG2("@%s:", __func__);
++    status_t status = OK;
++
++    status = processGpsSettings(params, metaData);
++    status |= processColoreffectSettings(params, metaData);
++    status |= processScalerCropSettings(params, metaData);
++
++    return status;
++}
++
++/* copy exif data into output buffer */
++void JpegMaker::writeExifData(EncodePackage* package) {
++    CheckError(package == nullptr, VOID_VALUE, "@%s, package is nullptr", __func__);
++
++    if (package->exifDataSize == 0) return;
++
++    CheckError(!package->outputData, VOID_VALUE, "@%s, outputData is nullptr", __func__);
++    CheckError(!package->exifData, VOID_VALUE, "@%s, exifData is nullptr", __func__);
++
++    unsigned int jSOISize = sizeof(mJpegMarkerSOI);
++    unsigned char* jpegOut = reinterpret_cast<unsigned char*>(package->outputData);
++    MEMCPY_S(jpegOut, jSOISize, mJpegMarkerSOI, jSOISize);
++    jpegOut += jSOISize;
++
++    MEMCPY_S(jpegOut, package->exifDataSize, reinterpret_cast<unsigned char*>(package->exifData),
++             package->exifDataSize);
++}
++
++/**
++ * processJpegSettings
++ *
++ * Store JPEG settings to the exif metadata
++ *
++ * \param [IN] jpeg parameters
++ * \ metaData [out] metadata of the request
++ *
++ */
++status_t JpegMaker::processJpegSettings(const Parameters& params, ExifMetaData* metaData) {
++    LOG2("@%s:", __func__);
++    status_t status = OK;
++
++    CheckError(!metaData, UNKNOWN_ERROR, "MetaData struct not intialized");
++
++    // make jpeg with thumbnail or not
++    camera_resolution_t thumbSize = {0};
++    params.getJpegThumbnailSize(thumbSize);
++    LOG2("%s request thumbname size %dx%d", __func__, thumbSize.width, thumbSize.height);
++
++    uint8_t new_jpeg_quality = DEFAULT_JPEG_QUALITY;
++    int ret = params.getJpegQuality(&new_jpeg_quality);
++    if (ret != icamera::OK) {
++        LOGW("cannot find jpeg quality, use default");
++    }
++    metaData->mJpegSetting.jpegQuality = new_jpeg_quality;
++
++    uint8_t new_jpeg_thumb_quality = DEFAULT_JPEG_QUALITY;
++    params.getJpegThumbnailQuality(&new_jpeg_thumb_quality);
++    metaData->mJpegSetting.jpegThumbnailQuality = new_jpeg_thumb_quality;
++    metaData->mJpegSetting.thumbWidth = thumbSize.width;
++    metaData->mJpegSetting.thumbHeight = thumbSize.height;
++
++    int new_rotation = 0;
++    params.getJpegRotation(new_rotation);
++    metaData->mJpegSetting.orientation = new_rotation;
++
++    LOG1("jpegQuality=%d,thumbQuality=%d,thumbW=%d,thumbH=%d,orientation=%d",
++         metaData->mJpegSetting.jpegQuality, metaData->mJpegSetting.jpegThumbnailQuality,
++         metaData->mJpegSetting.thumbWidth, metaData->mJpegSetting.thumbHeight,
++         metaData->mJpegSetting.orientation);
++
++    params.getAeMode(metaData->aeMode);
++    params.getAwbMode(metaData->awbMode);
++
++    metaData->currentFocusDistance = 0.0;
++    float focusDistance = 0.0;
++    params.getFocusDistance(focusDistance);
++    if (focusDistance != 0) {
++        metaData->currentFocusDistance = ceil(1000.0 / focusDistance);
++    }
++    LOG2("aeMode=%d, awbMode=%d, currentFocusDistance=%f", metaData->aeMode, metaData->awbMode,
++         metaData->currentFocusDistance);
++
++    return status;
++}
++
++/**
++ * This function will get GPS metadata from request setting
++ *
++ * \param[in] settings The Anroid metadata to process GPS settings from
++ * \param[out] metadata The EXIF data where the GPS setting are written to
++ */
++status_t JpegMaker::processGpsSettings(const Parameters& param, ExifMetaData* metadata) {
++    LOG2("@%s:", __func__);
++    status_t status = OK;
++
++    // gps latitude
++    double new_gps_latitude = 0.0;
++    param.getJpegGpsLatitude(new_gps_latitude);
++    metadata->mGpsSetting.latitude = new_gps_latitude;
++
++    double new_gps_longitude = 0.0;
++    param.getJpegGpsLongitude(new_gps_longitude);
++    metadata->mGpsSetting.longitude = new_gps_longitude;
++
++    double new_gps_altitude = 0.0;
++    param.getJpegGpsAltitude(new_gps_altitude);
++    metadata->mGpsSetting.altitude = new_gps_altitude;
++
++    // gps timestamp
++    int64_t new_gps_timestamp = 0;
++    param.getJpegGpsTimeStamp(new_gps_timestamp);
++    metadata->mGpsSetting.gpsTimeStamp = new_gps_timestamp;
++
++    // gps processing method
++    char new_gps_processing_method[MAX_NUM_GPS_PROCESSING_METHOD + 1];
++    CLEAR(new_gps_processing_method);
++    param.getJpegGpsProcessingMethod(MAX_NUM_GPS_PROCESSING_METHOD, new_gps_processing_method);
++    if (strlen(new_gps_processing_method) != 0) {
++        snprintf(metadata->mGpsSetting.gpsProcessingMethod,
++                 sizeof(metadata->mGpsSetting.gpsProcessingMethod), "%s",
++                 new_gps_processing_method);
++    }
++
++    return status;
++}
++
++status_t JpegMaker::processColoreffectSettings(const Parameters& param, ExifMetaData* metaData) {
++    LOG2("@%s:", __func__);
++    status_t status = OK;
++
++    camera_effect_mode_t new_image_effect = CAM_EFFECT_NONE;
++    param.getImageEffect(new_image_effect);
++    metaData->effectMode = new_image_effect;
++    LOG2("effect mode=%d", metaData->effectMode);
++
++    return status;
++}
++
++status_t JpegMaker::processScalerCropSettings(const Parameters& param, ExifMetaData* metaData) {
++    LOG2("@%s:", __func__);
++    status_t status = OK;
++
++    return status;
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
+new file mode 100644
+index 000000000000..8f5036216c54
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
+@@ -0,0 +1,56 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++
++#include "EXIFMaker.h"
++#include "EXIFMetaData.h"
++#include "IJpegEncoder.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++/**
++ * \class JpegMaker
++ * Does the EXIF header creation and appending to the provided jpeg buffer
++ *
++ */
++class JpegMaker {
++ public: /* Methods */
++    explicit JpegMaker();
++    virtual ~JpegMaker();
++    status_t setupExifWithMetaData(int bufWidth, int bufHeight, const Parameters& parameter,
++                                   ExifMetaData* metaData);
++    status_t getExif(const EncodePackage& thumbnailPackage, uint8_t* exifPtr, uint32_t* exifSize);
++    void writeExifData(EncodePackage* package);
++
++ private: /* Methods */
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(JpegMaker);
++
++    status_t processExifSettings(const Parameters& params, ExifMetaData* metaData);
++    status_t processJpegSettings(const Parameters& params, ExifMetaData* metaData);
++    status_t processGpsSettings(const Parameters& params, ExifMetaData* metadata);
++    status_t processColoreffectSettings(const Parameters& params, ExifMetaData* metaData);
++    status_t processScalerCropSettings(const Parameters& params, ExifMetaData* metaData);
++
++ private: /* Members */
++    std::unique_ptr<EXIFMaker> mExifMaker;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
+new file mode 100644
+index 000000000000..ed89d935f7fe
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
+@@ -0,0 +1,74 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "JpegEncoderCore"
++
++#include "JpegEncoderCore.h"
++
++#include <cros-camera/camera_buffer_manager.h>
++#include <linux/videodev2.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++JpegEncoderCore::JpegEncoderCore() {
++    LOG1("@%s", __func__);
++}
++
++JpegEncoderCore::~JpegEncoderCore() {
++    LOG1("@%s", __func__);
++}
++
++std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder() {
++    return std::unique_ptr<JpegEncoderCore>(new JpegEncoderCore());
++}
++
++/**
++ * doJpegEncode
++ *
++ * Do HW / SW JPEG encoding for the main buffer
++ * Do SW JPEG encoding for the thumbnail buffer
++ *
++ * \param pa [IN/OUT] Information that should be encoded
++ */
++bool JpegEncoderCore::doJpegEncode(EncodePackage* pa) {
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    CheckError(pa == nullptr, false, "@%s, pa is nullptr", __func__);
++
++    CheckError(pa->inputWidth != pa->outputWidth || pa->inputHeight != pa->outputHeight, false,
++               "@%s, input size != output size", __func__);
++    CheckError(pa->inputWidth <= 0 || pa->outputWidth <= 0, false,
++               "@%s, inputWidth:%d, outputWidth:%d", __func__, pa->inputWidth, pa->outputWidth);
++    CheckError(pa->inputHeight <= 0 || pa->outputHeight <= 0, false,
++               "@%s, inputHeight:%d, outputHeight:%d", __func__, pa->inputHeight, pa->outputHeight);
++
++    nsecs_t startTime = CameraUtils::systemTime();
++    bool ret = mJpegCompressor->CompressImage(
++        *(reinterpret_cast<buffer_handle_t*>(pa->inputBufferHandle)), pa->inputData,
++        V4L2_PIX_FMT_NV12, *(reinterpret_cast<buffer_handle_t*>(pa->outputBufferHandle)),
++        pa->outputData, pa->outputSize, pa->inputWidth, pa->inputHeight, pa->quality, pa->exifData,
++        pa->exifDataSize, &pa->encodedDataSize);
++
++    LOG1("@%s: encoding ret:%d, %dx%d need % ms, jpeg size %u, quality %d)", __func__, ret,
++         pa->outputWidth, pa->outputHeight, (CameraUtils::systemTime() - startTime) / 1000000,
++         pa->encodedDataSize, pa->quality);
++
++    return ret && pa->encodedDataSize > 0;
++}
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
+new file mode 100644
+index 000000000000..bb9187f0b0b7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <cros-camera/jpeg_compressor.h>
++
++#include <memory>
++#include <mutex>
++
++#include "IJpegEncoder.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++class JpegEncoderCore : public IJpegEncoder {
++ public:
++    JpegEncoderCore();
++    ~JpegEncoderCore();
++
++    virtual bool doJpegEncode(EncodePackage* pa);
++
++ private:
++    DISALLOW_COPY_AND_ASSIGN(JpegEncoderCore);
++
++    std::unique_ptr<cros::JpegCompressor> mJpegCompressor;
++};
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
+new file mode 100644
+index 000000000000..0aafef8c185f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
+@@ -0,0 +1,740 @@
++/*
++ * Copyright (C) 2011 The Android Open Source Project
++ * Copyright (C) 2016-2020 Intel Corporation. All Rights Reserved.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "SWJpegEncoder"
++
++#include "SWJpegEncoder.h"
++
++#include <string>
++
++#include "ImageConverter.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#define RESOLUTION_1_3MP_WIDTH 1280
++#define RESOLUTION_1_3MP_HEIGHT 960
++
++namespace icamera {
++
++SWJpegEncoder::SWJpegEncoder()
++        : mJpegSize(-1),
++          mTotalWidth(0),
++          mTotalHeight(0),
++          mDstBuf(nullptr),
++          mCPUCoresNum(1) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++}
++
++SWJpegEncoder::~SWJpegEncoder() {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++}
++
++std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder() {
++    return std::unique_ptr<SWJpegEncoder>(new SWJpegEncoder());
++}
++
++/**
++ * \param package: encode package for either thumbnail or main image
++ * \return true if encoding succeeds
++ * \return false if encoding fails
++ */
++bool SWJpegEncoder::doJpegEncode(EncodePackage* package) {
++    CheckError(package == nullptr, false, "@%s, package is nullptr", __func__);
++
++    int status = 0;
++    nsecs_t startTime = CameraUtils::systemTime();
++
++    LOG2("@%s: IN = {buf:%p, w:%u, h:%u, sz:%u, stride:%d, fmt:%s}", __func__, package->inputData,
++         package->inputWidth, package->inputHeight, package->inputSize, package->inputStride,
++         icamera::CameraUtils::format2string(package->inputFormat).c_str());
++
++    LOG2("@%s: OUT = {buf:%p, w:%u, h:%u, sz:%u, q:%d}", __func__, package->outputData,
++         package->outputWidth, package->outputHeight, package->outputSize, package->quality);
++
++    if (package->inputWidth == 0 || package->inputHeight == 0 || package->inputFormat == 0) {
++        ALOGE("Invalid input received!");
++        mJpegSize = -1;
++        goto exit;
++    }
++
++    mTotalWidth = package->inputWidth;
++    mTotalHeight = package->inputHeight;
++
++    /*
++     * For encoding main buffer, need to skip the exif data and SOI header.
++     * Because the SOI(jpeg maker) is written in the beginning of jpeg data when
++     * do encode, so only skip the exif data size here, and the SOI will be moved
++     * to the head of output buffer
++     */
++    mDstBuf = reinterpret_cast<unsigned char*>(package->outputData) + package->exifDataSize;
++
++    if (useMultiThreadEncoding(package->inputWidth, package->inputHeight))
++        status = swEncodeMultiThread(*package);
++    else
++        status = swEncode(*package);
++
++    if (status < 0) goto exit;
++
++    package->encodedDataSize = mJpegSize;
++
++    LOG2("@%s encode, total consume:%ums, encoded jpeg size: %d", __func__,
++         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), mJpegSize);
++
++    return mJpegSize > 0 ? true : false;
++exit:
++    return false;
++}
++
++/**
++ *  This function will decide if we need to enable the multi thread jpeg encoding.
++ *  currently, we have two conditions to use the old single jpeg encoding.
++ *  one is that the resolution is smaller than the 1.3M
++ *  the other is that the CPU number is 1
++ *
++ *  \param width: the Jpeg width
++ *  \param height: the Jpeg height
++ *
++ *  \return false if we don't need multi thread Jpeg encoding
++ *  \return true if we need multi thread Jpeg encoding
++ */
++bool SWJpegEncoder::useMultiThreadEncoding(int width, int height) {
++    LOG2("@%s, line:%d, width:%d, height:%d", __func__, __LINE__, width, height);
++    bool ret = false;
++
++    /* more conditions could be added to here by according to the request */
++    if ((width < RESOLUTION_1_3MP_WIDTH && height < RESOLUTION_1_3MP_HEIGHT))
++        ret = false;
++    else if (width & 0xf)
++        ret = false;
++    else
++        ret = true;
++
++    LOG2("@%s, line:%d, ret:%d", __func__, __LINE__, ret);
++    return ret;
++}
++
++/**
++ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
++ * single thread.
++ *
++ * \param package: jpeg encode package
++ * \return 0 if encoding was successful
++ * \return -1 if encoding failed
++ */
++int SWJpegEncoder::swEncode(const EncodePackage& package) {
++    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
++    int status = 0;
++    Codec encoder;
++
++    encoder.init();
++    encoder.setJpegQuality(package.quality);
++    status = encoder.configEncoding(package.inputWidth, package.inputHeight, package.inputStride,
++                                    static_cast<JSAMPLE*>(mDstBuf),
++                                    (package.outputSize - package.exifDataSize));
++    const void* uv_buf =
++        static_cast<unsigned char*>(package.inputData) + package.inputStride * package.inputHeight;
++
++    if (status) goto exit;
++
++    status = encoder.doJpegEncoding(package.inputData, uv_buf, package.inputFormat);
++    if (status) goto exit;
++
++exit:
++    if (status)
++        mJpegSize = -1;
++    else
++        encoder.getJpegSize(&mJpegSize);
++
++    encoder.deInit();
++
++    return (status ? -1 : 0);
++}
++
++/**
++ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
++ * multi thread.
++ * the thread number depends on the CPU number.
++ *
++ * \param package: jpeg encode package
++ * \return 0 if encoding was successful
++ * \return -1 if encoding failed
++ */
++int SWJpegEncoder::swEncodeMultiThread(const EncodePackage& package) {
++    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
++    int status = 0;
++
++    init(mCPUCoresNum);
++    config(package);
++
++    status = doJpegEncodingMultiThread();
++    if (status) goto exit;
++
++exit:
++    mJpegSize = status ? -1 : mergeJpeg();
++    deInit();
++
++    return (status ? -1 : 0);
++}
++
++/**
++ * Initialize for the multi thread jpeg encoding
++ *
++ * it will create n CodecWorkerThread by according to the thread number.
++ */
++void SWJpegEncoder::init(unsigned int threadNum) {
++    unsigned int num = CLIP(threadNum, MAX_THREAD_NUM, MIN_THREAD_NUM);
++    LOG2("@%s, line:%d, thread number, pass:%d, real:%d", __func__, __LINE__, threadNum, num);
++
++    for (unsigned int i = 0; i < num; i++) {
++        std::shared_ptr<CodecWorkerThread> codecWorkerThread(new CodecWorkerThread);
++        mSwJpegEncoder.push_back(codecWorkerThread);
++    }
++}
++
++/**
++ * deInit for the multi thread jpeg encoding
++ *
++ * it will release all n CodecWorkerThread
++ */
++void SWJpegEncoder::deInit(void) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    for (auto& encoder : mSwJpegEncoder) {
++        encoder.reset();
++    }
++
++    mSwJpegEncoder.clear();
++}
++
++/**
++ * configue every thread for multi thread jpeg
++ *
++ * \param package: jpeg encode package
++ */
++void SWJpegEncoder::config(const EncodePackage& package) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    std::shared_ptr<CodecWorkerThread> encThread;
++    CodecWorkerThread::CodecConfig cfg;
++
++    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
++        cfg.width = package.inputWidth;
++        /*
++            for example, there are 4 threads.
++            the first 3 threads must align to 16 which is NV12_MCU_SIZE
++            but for the last thread, it doesn't have this request.
++        */
++        cfg.height = ALIGN_16(package.inputHeight / mSwJpegEncoder.size());
++        cfg.stride = package.inputStride;
++        /*
++         * For NV12 format, Y and UV data are independent, total size is width*height*1.5;
++         * For YUYV format, Y and UV data are crossing, total size is width*height*2;
++         * So the inBufY and inBufUV should be distinguished base on format.
++         */
++        cfg.fourcc = package.inputFormat;
++        cfg.inBufY =
++            (cfg.fourcc == V4L2_PIX_FMT_YUYV)
++                ? static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * 2 * i
++                : static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * i;
++        cfg.inBufUV =
++            (cfg.fourcc == V4L2_PIX_FMT_NV12 || cfg.fourcc == V4L2_PIX_FMT_NV21)
++                ? (static_cast<unsigned char*>(package.inputData) +
++                   package.inputStride * package.inputHeight + cfg.stride * cfg.height * i / 2)
++                : nullptr;
++        cfg.quality = package.quality;
++        cfg.outBufSize = (package.outputSize - package.exifDataSize - DEST_BUF_OFFSET) /
++                         package.inputHeight * cfg.height;
++        cfg.outBuf = static_cast<unsigned char*>(mDstBuf) + DEST_BUF_OFFSET + cfg.outBufSize * i;
++        /* update the last thread's height */
++        if (i == mSwJpegEncoder.size() - 1) {
++            cfg.height = package.inputHeight - cfg.height * (mSwJpegEncoder.size() - 1);
++            cfg.outBufSize = package.outputSize - package.exifDataSize - DEST_BUF_OFFSET -
++                             cfg.outBufSize * (mSwJpegEncoder.size() - 1);
++        }
++
++        encThread = mSwJpegEncoder[i];
++        encThread->setConfig(cfg);
++        LOG2("@%s, line:%d, the %d picture thread cfg", __func__, __LINE__, i);
++        LOG2("@%s, line:%d, cfg.width:%d, cfg.height:%d", __func__, __LINE__, cfg.width,
++             cfg.height);
++        LOG2("@%s, line:%d, cfg.fourcc:%d, cfg.quality:%d", __func__, __LINE__, cfg.fourcc,
++             cfg.quality);
++        LOG2("@%s, line:%d, cfg.inBufY:%p, cfg.inBufUV:%p", __func__, __LINE__, cfg.inBufY,
++             cfg.inBufUV);
++        LOG2("@%s, line:%d, cfg.outBuf:%p, cfg.outBufSize:%d", __func__, __LINE__, cfg.outBuf,
++             cfg.outBufSize);
++    }
++}
++
++/**
++ * the function will trigger the multi jpeg encoding
++ *
++ * \return 0 if encoding was successful
++ * \return -1 if encoding failed
++ */
++int SWJpegEncoder::doJpegEncodingMultiThread(void) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    std::shared_ptr<CodecWorkerThread> encThread;
++    status_t status = OK;
++    std::string threadName("CamHAL_SWEncodeMultiThread");
++
++    /* run all threads */
++    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
++        threadName = threadName + ":" + std::to_string(i);
++        LOG2("@%s, new sw jpeg thread name:%s", __func__, threadName.c_str());
++        encThread = mSwJpegEncoder[i];
++        status = encThread->runThread(threadName.c_str());
++        if (status != OK) {
++            ALOGE("@%s, line:%d, start jpeg thread fail, thread name:%s", __func__, __LINE__,
++                  threadName.c_str());
++            return status;
++        }
++    }
++
++    /* wait all threads to finish */
++    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
++        LOG2("@%s, the %d sw jpeg encoder thread before join!", __func__, i);
++        encThread = mSwJpegEncoder[i];
++        encThread->waitThreadFinish();
++        if (encThread->getJpegDataSize() == -1) status = UNKNOWN_ERROR;
++    }
++
++    return status;
++}
++
++/**
++ * the function will merge all jpeg pictures which are generated in multi threads
++ * to one jpeg picture
++ *
++ * \return int the merged jpeg size
++ */
++int SWJpegEncoder::mergeJpeg(void) {
++#define HEADER_TOTAL_LEN 623
++#define HEADER_SOS_LEN 14
++#define HEADER_EOI_LEN 2
++#define HEADER_HEIGHT_POS 163
++#define HEADER_WIDTH_POS 165
++#define NV12_MCU_SIZE 16
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    int size = HEADER_TOTAL_LEN - HEADER_SOS_LEN;
++    CodecWorkerThread::CodecConfig cfg;
++    nsecs_t startTime;
++    std::shared_ptr<CodecWorkerThread> encThread = mSwJpegEncoder.at(0);
++    if (encThread == nullptr) {
++        ALOGE("encThread is nullptr");
++        return -1;
++    }
++    encThread->getConfig(&cfg);
++
++    /* Write the JPEG header */
++    MEMCPY_S(mDstBuf, size, cfg.outBuf, size);
++
++    /* Update the width and height info */
++    mDstBuf[HEADER_HEIGHT_POS] = (mTotalHeight >> 8) & 0xFF;
++    mDstBuf[HEADER_HEIGHT_POS + 1] = mTotalHeight & 0xFF;
++    mDstBuf[HEADER_WIDTH_POS] = (mTotalWidth >> 8) & 0xFF;
++    mDstBuf[HEADER_WIDTH_POS + 1] = mTotalWidth & 0xFF;
++
++    /* Write the restarting interval */
++    if (mSwJpegEncoder.size() > 1) {
++        unsigned int MCUs = (cfg.height / NV12_MCU_SIZE) * (cfg.width / NV12_MCU_SIZE);
++        mDstBuf[size++] = 0xFF;
++        mDstBuf[size++] = 0xDD;
++        mDstBuf[size++] = 0;
++        mDstBuf[size++] = 4;
++        mDstBuf[size++] = (MCUs >> 8) & 0xFF;
++        mDstBuf[size++] = MCUs & 0xFF;
++    }
++
++    /* Write the SOS */
++    MEMCPY_S(reinterpret_cast<void*>((unsigned long)mDstBuf + size), HEADER_SOS_LEN,
++             reinterpret_cast<void*>((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN - HEADER_SOS_LEN),
++             HEADER_SOS_LEN);
++    size += HEADER_SOS_LEN;
++
++    /* Write coded segments */
++    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
++        encThread = mSwJpegEncoder[i];
++        startTime = CameraUtils::systemTime();
++        encThread->getConfig(&cfg);
++        memmove(reinterpret_cast<void*>((unsigned long)mDstBuf + size),
++                reinterpret_cast<void*>((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN),
++                (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN));
++        LOG2("@%s, wr %d segments, size:%d, consume:%ums", __func__, i,
++             (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN),
++             (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
++        size += (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN);
++
++        if (i != (mSwJpegEncoder.size() - 1)) {
++            mDstBuf[size++] = 0xFF;
++            mDstBuf[size++] = (i & 0x7) | 0xD0;
++        }
++    }
++
++    /* Write EOI */
++    mDstBuf[size++] = 0xFF;
++    mDstBuf[size++] = 0xD9;
++
++    return size;
++}
++
++SWJpegEncoder::CodecWorkerThread::CodecWorkerThread() : mDataSize(-1) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    CLEAR(mCfg);
++}
++
++SWJpegEncoder::CodecWorkerThread::~CodecWorkerThread() {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++}
++
++/**
++ * run one thread for multi thread jpeg encoding
++ *
++ * \param name: the thread name
++ */
++status_t SWJpegEncoder::CodecWorkerThread::runThread(const char* name) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    return this->run(name);
++}
++
++/**
++ * wait one thread until it has finished
++ *
++ */
++void SWJpegEncoder::CodecWorkerThread::waitThreadFinish(void) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    this->join();
++    this->requestExitAndWait();
++}
++
++/**
++ * get jpeg size which is done in one thread
++ *
++ * \return int the coded jpeg size
++ */
++int SWJpegEncoder::CodecWorkerThread::getJpegDataSize(void) {
++    LOG2("@%s, line:%d", __func__, __LINE__);
++    return mDataSize;
++}
++
++/**
++ * the thread exe function for one jpeg thread
++ * when the encoding has been done, it will return false to terminate the thread
++ *
++ * \return false
++ */
++bool SWJpegEncoder::CodecWorkerThread::threadLoop() {
++    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
++    nsecs_t startTime = CameraUtils::systemTime();
++    int ret = swEncode();
++    LOG2("@%s one swEncode done!, consume:%ums, ret:%d", __func__,
++         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), ret);
++
++    return false;
++}
++
++/**
++ * this function will call the SWJpegEncoder to encode one jpeg.
++ * it's the main function of the threadLoop
++ *
++ * \return 0 if encoding was successful
++ * \return -1 if encoding failed
++ */
++int SWJpegEncoder::CodecWorkerThread::swEncode(void) {
++    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
++    int status = 0;
++    Codec encoder;
++
++    encoder.init();
++    encoder.setJpegQuality(mCfg.quality);
++    status = encoder.configEncoding(mCfg.width, mCfg.height, mCfg.stride,
++                                    static_cast<JSAMPLE*>(mCfg.outBuf), mCfg.outBufSize);
++    if (status) goto exit;
++
++    status = encoder.doJpegEncoding(mCfg.inBufY, mCfg.inBufUV, mCfg.fourcc);
++    if (status) goto exit;
++
++exit:
++    if (status)
++        mDataSize = -1;
++    else
++        encoder.getJpegSize(&mDataSize);
++
++    encoder.deInit();
++
++    return (status ? -1 : 0);
++}
++
++SWJpegEncoder::Codec::Codec() : mStride(-1), mJpegQuality(DEFAULT_JPEG_QUALITY) {
++    LOG2("@%s", __func__);
++    CLEAR(mCInfo);
++    CLEAR(mJErr);
++}
++
++SWJpegEncoder::Codec::~Codec() {
++    LOG2("@%s", __func__);
++}
++
++/**
++ * Init the SW jpeg encoder
++ *
++ * It will init the libjpeg library
++ */
++void SWJpegEncoder::Codec::init(void) {
++    LOG2("@%s", __func__);
++    CLEAR(mCInfo);
++    mCInfo.err = jpeg_std_error(&mJErr);
++    jpeg_create_compress(&mCInfo);
++}
++
++/**
++ * deInit the SW jpeg encoder
++ *
++ * It will deinit the libjpeg library
++ */
++void SWJpegEncoder::Codec::deInit(void) {
++    LOG2("@%s", __func__);
++    jpeg_destroy_compress(&mCInfo);
++}
++
++/**
++ * Set the jpeg quality
++ *
++ * \param quality: one value from 0 to 100
++ *
++ */
++void SWJpegEncoder::Codec::setJpegQuality(int quality) {
++    LOG2("@%s, quality:%d", __func__, quality);
++    mJpegQuality = CLIP(quality, 100, 1);
++}
++
++/**
++ * Config the SW jpeg encoder.
++ *
++ * mainly, it will set the destination buffer manager, color space, quality.
++ *
++ * \param width: the width of the jpeg dimentions.
++ * \param height: the height of the jpeg dimentions.
++ * \param jpegBuf: the dest buffer to store the jpeg data
++ * \param jpegBufSize: the size of jpegBuf buffer
++ *
++ * \return 0 if the configuration is right.
++ * \return -1 if the configuration fails.
++ */
++int SWJpegEncoder::Codec::configEncoding(int width, int height, int stride, void* jpegBuf,
++                                         int jpegBufSize) {
++    LOG2("@%s", __func__);
++
++    mStride = stride;
++    mCInfo.input_components = 3;
++    mCInfo.in_color_space = (J_COLOR_SPACE)SUPPORTED_FORMAT;
++    mCInfo.image_width = width;
++    mCInfo.image_height = height;
++
++    if (setupJpegDestMgr(&mCInfo, static_cast<JSAMPLE*>(jpegBuf), jpegBufSize) < 0) {
++        ALOGE("@%s, line:%d, setupJpegDestMgr fail", __func__, __LINE__);
++        return -1;
++    }
++
++    jpeg_set_defaults(&mCInfo);
++    jpeg_set_colorspace(&mCInfo, (J_COLOR_SPACE)SUPPORTED_FORMAT);
++    jpeg_set_quality(&mCInfo, mJpegQuality, TRUE);
++    mCInfo.raw_data_in = TRUE;
++    mCInfo.dct_method = JDCT_ISLOW;
++    mCInfo.comp_info[0].h_samp_factor = 2;
++    mCInfo.comp_info[0].v_samp_factor = 2;
++    mCInfo.comp_info[1].h_samp_factor = 1;
++    mCInfo.comp_info[1].v_samp_factor = 1;
++    mCInfo.comp_info[2].h_samp_factor = 1;
++    mCInfo.comp_info[2].v_samp_factor = 1;
++    jpeg_start_compress(&mCInfo, TRUE);
++
++    return 0;
++}
++
++/**
++ * Do the SW jpeg encoding.
++ *
++ * it will convert the YUV data to P411 and then do jpeg encoding.
++ *
++ * \param y_buf: the source buffer for Y data
++ * \param uv_buf: the source buffer for UV data,
++ * \it could be nullptr if fourcc is V4L2_PIX_FMT_YUYV
++ * \return 0 if the encoding is successful.
++ * \return -1 if the encoding fails.
++ */
++int SWJpegEncoder::Codec::doJpegEncoding(const void* y_buf, const void* uv_buf, int fourcc) {
++    LOG2("@%s", __func__);
++
++    unsigned char* srcY = nullptr;
++    unsigned char* srcUV = nullptr;
++    unsigned char* p411 = nullptr;
++    JSAMPROW y[16], u[16], v[16];
++    JSAMPARRAY data[3];
++    int i, j, width, height;
++
++    width = mCInfo.image_width;
++    height = mCInfo.image_height;
++    srcY = (unsigned char*)y_buf;
++    srcUV = (unsigned char*)uv_buf;
++    p411 = new unsigned char[width * height * 3 / 2];
++
++    switch (fourcc) {
++        case V4L2_PIX_FMT_YUYV:
++            ImageConverter::YUY2ToP411(width, height, mStride, srcY, p411);
++            break;
++        case V4L2_PIX_FMT_NV12:
++            ImageConverter::NV12ToP411Separate(width, height, mStride, srcY, srcUV, p411);
++            break;
++        case V4L2_PIX_FMT_NV21:
++            ImageConverter::NV21ToP411Separate(width, height, mStride, srcY, srcUV, p411);
++            break;
++        default:
++            ALOGE("%s Unsupported fourcc %d", __func__, fourcc);
++            delete[] p411;
++            return -1;
++    }
++
++    data[0] = y;
++    data[1] = u;
++    data[2] = v;
++    for (i = 0; i < height; i += 16) {
++        for (j = 0; j < 16 && (i + j) < height; j++) {
++            y[j] = p411 + width * (j + i);
++            if (j % 2 == 0) {
++                u[j / 2] = p411 + width * height + width / 2 * ((j + i) / 2);
++                v[j / 2] = p411 + width * height + width * height / 4 + width / 2 * ((j + i) / 2);
++            }
++        }
++        jpeg_write_raw_data(&mCInfo, data, 16);
++    }
++
++    jpeg_finish_compress(&mCInfo);
++
++    delete[] p411;
++    p411 = nullptr;
++
++    return 0;
++}
++
++/**
++ * Get the jpeg size.
++ *
++ * \param jpegSize: get the real jpeg size, it will be -1, if encoding fails
++ */
++void SWJpegEncoder::Codec::getJpegSize(int* jpegSize) {
++    LOG2("@%s", __func__);
++
++    JpegDestMgrPtr dest = (JpegDestMgrPtr)mCInfo.dest;
++
++    *jpegSize = (false == dest->encodeSuccess) ? -1 : dest->codedSize;
++}
++
++/**
++ * Setup the jpeg destination buffer manager
++ *
++ * it will convert the YUV data to P411 and then do jpeg encoding.
++ *
++ * \param cInfo: the compress pointer
++ * \param jpegBuf: the buffer pointer for jpeg data
++ * \param jpegBufSize: the jpegBuf buffer's size
++ * \return 0 if it's successful.
++ * \return -1 if it fails.
++ */
++int SWJpegEncoder::Codec::setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE* jpegBuf,
++                                           int jpegBufSize) {
++    LOG2("@%s", __func__);
++    JpegDestMgrPtr dest;
++
++    if (nullptr == jpegBuf || jpegBufSize <= 0) {
++        ALOGE("@%s, line:%d, jpegBuf:%p, jpegBufSize:%d", __func__, __LINE__, jpegBuf, jpegBufSize);
++        return -1;
++    }
++
++    if (cInfo->dest == nullptr) {
++        cInfo->dest = (struct jpeg_destination_mgr*)(*cInfo->mem->alloc_small)(
++            (j_common_ptr)cInfo, JPOOL_PERMANENT, sizeof(JpegDestMgr));
++        CLEAR(*cInfo->dest);
++    }
++    dest = (JpegDestMgrPtr)cInfo->dest;
++
++    dest->pub.init_destination = initDestination;
++    dest->pub.empty_output_buffer = emptyOutputBuffer;
++    dest->pub.term_destination = termDestination;
++    dest->outJpegBuf = jpegBuf;
++    dest->outJpegBufSize = jpegBufSize;
++
++    return 0;
++}
++
++/**
++ * Init the destination
++ *
++ * It's the first function which be called
++ * among initDestination, emptyOutputBuffer and termDestination
++ *
++ * \param cInfo: the compress pointer
++ */
++void SWJpegEncoder::Codec::initDestination(j_compress_ptr cInfo) {
++    LOG2("@%s", __func__);
++    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
++
++    dest->pub.next_output_byte = dest->outJpegBuf;
++    dest->pub.free_in_buffer = dest->outJpegBufSize;
++    dest->encodeSuccess = true;
++}
++
++/**
++ * Empty the output buffer
++ *
++ * The function should not be called,
++ * because we should allocate enough memory for the jpeg destination buffer
++ * If we return FALSE, the libjpeg will terminate, so return TRUE always.
++ * But when the function is called, the encoding failing will be recorded.
++ *
++ * \param cInfo: the compress pointer
++ * \return TRUE if it is successful.
++ * \return FALSE if something is wrong
++ */
++boolean SWJpegEncoder::Codec::emptyOutputBuffer(j_compress_ptr cInfo) {
++    LOG2("@%s", __func__);
++    ALOGE("@%s, line:%d, buffer overflow!", __func__, __LINE__);
++    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
++
++    /* re-cfg the buffer info */
++    dest->pub.next_output_byte = dest->outJpegBuf;
++    dest->pub.free_in_buffer = dest->outJpegBufSize;
++    dest->encodeSuccess = false;
++
++    return TRUE; /* if return FALSE, the total taking picture will fail */
++}
++
++/**
++ * Terminate the destination
++ *
++ * The function will be called as the last function,
++ * among initDestination, emptyOutputBuffer and termDestination.
++ * We can get the encoded jpeg size from it.
++ *
++ * \param cInfo: the compress pointer
++ */
++void SWJpegEncoder::Codec::termDestination(j_compress_ptr cInfo) {
++    LOG2("@%s", __func__);
++    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
++
++    dest->codedSize = dest->outJpegBufSize - dest->pub.free_in_buffer;
++    LOG2("@%s, line:%d, codedSize:%d", __func__, __LINE__, dest->codedSize);
++}
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
+new file mode 100644
+index 000000000000..170dfdbb023e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
+@@ -0,0 +1,186 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2016-2020 Intel Corporation. All Rights Reserved.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ *\file SWJpegEncoder.h
++ *
++ * Abstracts the SW jpeg encoder
++ *
++ * This class calls the libjpeg ditectly. And libskia's performance is poor.
++ * The SW jpeg encoder is used for the thumbnail encoding mainly.
++ * But When the HW jpeg encoding fails, it will use the SW jpeg encoder also.
++ *
++ */
++
++#pragma once
++
++#include <linux/videodev2.h>
++#include <stdio.h>
++
++#include <vector>
++
++#include "IJpegEncoder.h"
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "iutils/Utils.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++#include "jpeglib.h"
++#ifdef __cplusplus
++}
++#endif
++
++namespace icamera {
++
++/**
++ * \class SWJpegEncoder
++ *
++ * This class is used for sw jpeg encoder.
++ * It will use single or multi thread to do the sw jpeg encoding
++ * It just support NV12 input currently.
++ */
++class SWJpegEncoder : public IJpegEncoder {
++ public:
++    SWJpegEncoder();
++    ~SWJpegEncoder();
++
++    virtual bool doJpegEncode(EncodePackage* package);
++
++ private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(SWJpegEncoder);
++
++ private:
++    bool useMultiThreadEncoding(int width, int height);
++    int swEncode(const EncodePackage& package);
++    int swEncodeMultiThread(const EncodePackage& package);
++
++    int mJpegSize;             /*!< it's used to store jpeg size */
++    int mTotalWidth;           /*!< the final jpeg width */
++    int mTotalHeight;          /*!< the final jpeg height */
++    unsigned char* mDstBuf;    /*!< the dest buffer to store the final jpeg */
++    unsigned int mCPUCoresNum; /*!< use to remember the CPU Cores number */
++
++ private:
++    /**
++     * \class CodecWorkerThread
++     *
++     * This class will create one thread to do one sw jpeg encoder.
++     * It will call the SWJpegEncoderWrapper directly.
++     */
++    class CodecWorkerThread : public Thread {
++     public:
++        struct CodecConfig {
++            // input buffer configuration
++            int width;
++            int height;
++            int stride;
++            int fourcc;
++            void* inBufY;
++            void* inBufUV;
++            // output buffer configuration
++            int quality;
++            void* outBuf;
++            int outBufSize;
++        };
++
++        CodecWorkerThread();
++        ~CodecWorkerThread();
++
++        void setConfig(const CodecConfig& cfg) { mCfg = cfg; }
++        void getConfig(CodecConfig* cfg) const { *cfg = mCfg; }
++        status_t runThread(const char* name);
++        void waitThreadFinish(void);
++        int getJpegDataSize(void);
++
++     private:
++        int mDataSize;    /*!< the jpeg data size in one thread */
++        CodecConfig mCfg; /*!< the cfg in one thread */
++     private:
++        virtual bool threadLoop();
++        int swEncode(void);
++    };
++
++ private:
++    void init(unsigned int threadNum = 1);
++    void deInit(void);
++    void config(const EncodePackage& package);
++    int doJpegEncodingMultiThread(void);
++    int mergeJpeg(void);
++
++    std::vector<std::shared_ptr<CodecWorkerThread> > mSwJpegEncoder;
++    static const unsigned int MAX_THREAD_NUM = 8; /*!< the same as max jpeg restart time */
++    static const unsigned int MIN_THREAD_NUM = 1;
++
++    /*!< it's used to use one buffer to merge the multi jpeg data to one jpeg data */
++    static const unsigned int DEST_BUF_OFFSET = 1024;
++
++ private:
++    /**
++     * \class Codec
++     *
++     * This class is used for sw jpeg encoder.
++     * It will call the libjpeg directly.
++     * It just support NV12 input currently.
++     */
++    class Codec {
++     public:
++        Codec();
++        ~Codec();
++
++        void init(void);
++        void deInit(void);
++        void setJpegQuality(int quality);
++        int configEncoding(int width, int height, int stride, void* jpegBuf, int jpegBufSize);
++        /*
++            if fourcc is V4L2_PIX_FMT_NV12, y_buf and uv_buf must be passed
++            if fourcc is V4L2_PIX_FMT_YUYV, y_buf must be passed, uv_buf could be nullptr
++        */
++        int doJpegEncoding(const void* y_buf, const void* uv_buf = nullptr,
++                           int fourcc = V4L2_PIX_FMT_NV12);
++        void getJpegSize(int* jpegSize);
++
++     private:
++        // prevent copy constructor and assignment operator
++        DISALLOW_COPY_AND_ASSIGN(Codec);
++
++     private:
++        typedef struct {
++            struct jpeg_destination_mgr pub;
++            JSAMPLE* outJpegBuf; /*!< jpeg output buffer */
++            int outJpegBufSize;  /*!< jpeg output buffer size */
++            int codedSize;       /*!< the final encoded out jpeg size */
++            bool encodeSuccess;  /*!< if buffer overflow, it will be set to false */
++        } JpegDestMgr, *JpegDestMgrPtr;
++
++        int mStride;
++        struct jpeg_compress_struct mCInfo;
++        struct jpeg_error_mgr mJErr;
++        int mJpegQuality;
++        static const unsigned int SUPPORTED_FORMAT = JCS_YCbCr;
++
++        int setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE* jpegBuf, int jpegBufSize);
++        // the below three functions are for the dest buffer manager.
++        static void initDestination(j_compress_ptr cInfo);
++        static boolean emptyOutputBuffer(j_compress_ptr cInfo);
++        static void termDestination(j_compress_ptr cInfo);
++    };
++};
++
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
+new file mode 100644
+index 000000000000..9aa26c9ca706
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
+@@ -0,0 +1,435 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CameraMetadata"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#include "CameraMetadata.h"
++
++namespace icamera {
++
++CameraMetadata::CameraMetadata() :
++        mBuffer(NULL), mLocked(false) {
++}
++
++CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
++        mLocked(false)
++{
++    mBuffer = allocate_icamera_metadata(entryCapacity, dataCapacity);
++}
++
++CameraMetadata::CameraMetadata(const CameraMetadata &other) :
++        mLocked(false) {
++    mBuffer = clone_icamera_metadata(other.mBuffer);
++}
++
++CameraMetadata::CameraMetadata(icamera_metadata_t *buffer) :
++        mBuffer(NULL), mLocked(false) {
++    acquire(buffer);
++}
++
++CameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
++    return operator=(other.mBuffer);
++}
++
++CameraMetadata &CameraMetadata::operator=(const icamera_metadata_t *buffer) {
++    if (mLocked) {
++        LOGE("%s: Assignment to a locked CameraMetadata!", __func__);
++        return *this;
++    }
++
++    if (buffer != mBuffer) {
++        icamera_metadata_t *newBuffer = clone_icamera_metadata(buffer);
++        clear();
++        mBuffer = newBuffer;
++    }
++    return *this;
++}
++
++CameraMetadata::~CameraMetadata() {
++    mLocked = false;
++    clear();
++}
++
++const icamera_metadata_t* CameraMetadata::getAndLock() {
++    mLocked = true;
++    return mBuffer;
++}
++
++status_t CameraMetadata::unlock(const icamera_metadata_t *buffer) {
++    if (!mLocked) {
++        LOGE("%s: Can't unlock a non-locked CameraMetadata!", __func__);
++        return INVALID_OPERATION;
++    }
++    if (buffer != mBuffer) {
++        LOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
++                __func__);
++        return BAD_VALUE;
++    }
++    mLocked = false;
++    return OK;
++}
++
++icamera_metadata_t* CameraMetadata::release() {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return NULL;
++    }
++    icamera_metadata_t *released = mBuffer;
++    mBuffer = NULL;
++    return released;
++}
++
++void CameraMetadata::clear() {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return;
++    }
++    if (mBuffer) {
++        free_icamera_metadata(mBuffer);
++        mBuffer = NULL;
++    }
++}
++
++void CameraMetadata::acquire(icamera_metadata_t *buffer) {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return;
++    }
++    clear();
++    mBuffer = buffer;
++
++    if (validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
++        LOGE("%s: Failed to validate metadata structure %p",
++                 __func__, buffer);
++    }
++}
++
++void CameraMetadata::acquire(CameraMetadata &other) {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return;
++    }
++    acquire(other.release());
++}
++
++status_t CameraMetadata::append(const CameraMetadata &other) {
++    return append(other.mBuffer);
++}
++
++status_t CameraMetadata::append(const icamera_metadata_t* other) {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    size_t extraEntries = get_icamera_metadata_entry_count(other);
++    size_t extraData = get_icamera_metadata_data_count(other);
++    resizeIfNeeded(extraEntries, extraData);
++
++    return append_icamera_metadata(mBuffer, other);
++}
++
++size_t CameraMetadata::entryCount() const {
++    return (mBuffer == NULL) ? 0 :
++            get_icamera_metadata_entry_count(mBuffer);
++}
++
++bool CameraMetadata::isEmpty() const {
++    return entryCount() == 0;
++}
++
++status_t CameraMetadata::sort() {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    return sort_icamera_metadata(mBuffer);
++}
++
++status_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
++    int tagType = get_icamera_metadata_tag_type(tag);
++    if (tagType == -1 || tagType >= ICAMERA_NUM_TYPES) {
++        LOGE("Update metadata entry: Unknown tag %d type=%d", tag, tagType);
++        return INVALID_OPERATION;
++    }
++    if (tagType != expectedType) {
++        LOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
++                "got type %s data instead ",
++                get_icamera_metadata_tag_name(tag), tag,
++                icamera_metadata_type_names[tagType],
++                icamera_metadata_type_names[expectedType]);
++        return INVALID_OPERATION;
++    }
++    return OK;
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const int32_t *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_INT32)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const uint8_t *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const float *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_FLOAT)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const int64_t *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_INT64)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const double *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_DOUBLE)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const icamera_metadata_rational_t *data, size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_RATIONAL)) != OK) {
++        return res;
++    }
++    return updateImpl(tag, (const void*)data, data_count);
++}
++
++status_t CameraMetadata::update(uint32_t tag,
++        const std::string &string) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
++        return res;
++    }
++    // string.size() doesn't count the null termination character.
++    return updateImpl(tag, (const void*)string.c_str(), string.size() + 1);
++}
++
++status_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
++        size_t data_count) {
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    int type = get_icamera_metadata_tag_type(tag);
++    if (type == -1) {
++        LOGE("%s: Tag %d not found", __func__, tag);
++        return BAD_VALUE;
++    }
++    size_t data_size = calculate_icamera_metadata_entry_data_size(type,
++            data_count);
++
++    res = resizeIfNeeded(1, data_size);
++
++    if (res == OK) {
++        icamera_metadata_entry_t entry;
++        res = find_icamera_metadata_entry(mBuffer, tag, &entry);
++        if (res == NAME_NOT_FOUND) {
++            res = add_icamera_metadata_entry(mBuffer,
++                    tag, data, data_count);
++        } else if (res == OK) {
++            res = update_icamera_metadata_entry(mBuffer,
++                    entry.index, data, data_count, NULL);
++        }
++    }
++
++    if (res != OK) {
++        LOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
++                __func__, get_icamera_metadata_section_name(tag),
++                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
++    }
++
++    if(validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
++             LOGE("%s: Failed to validate metadata structure after update %p",
++             __func__, mBuffer);
++    }
++
++    return res;
++}
++
++bool CameraMetadata::exists(uint32_t tag) const {
++    icamera_metadata_ro_entry entry;
++    return find_icamera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
++}
++
++icamera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
++    status_t res;
++    icamera_metadata_entry entry;
++    CLEAR(entry);
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        entry.count = 0;
++        return entry;
++    }
++    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
++    if (res != OK) {
++        entry.count = 0;
++        entry.data.u8 = NULL;
++    }
++    return entry;
++}
++
++icamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
++    status_t res;
++    icamera_metadata_ro_entry entry;
++    res = find_icamera_metadata_ro_entry(mBuffer, tag, &entry);
++    if (res != OK) {
++        entry.count = 0;
++        entry.data.u8 = NULL;
++    }
++    return entry;
++}
++
++status_t CameraMetadata::erase(uint32_t tag) {
++    icamera_metadata_entry_t entry;
++    status_t res;
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return INVALID_OPERATION;
++    }
++    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
++    if (res == NAME_NOT_FOUND) {
++        return OK;
++    } else if (res != OK) {
++        LOGE("%s: Error looking for entry %s.%s (%x): %s %d",
++                __func__,
++                get_icamera_metadata_section_name(tag),
++                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
++        return res;
++    }
++    res = delete_icamera_metadata_entry(mBuffer, entry.index);
++    if (res != OK) {
++        LOGE("%s: Error deleting entry %s.%s (%x): %s %d",
++                __func__,
++                get_icamera_metadata_section_name(tag),
++                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
++    }
++    return res;
++}
++
++void CameraMetadata::dump(int fd, int verbosity, int indentation) const {
++    dump_indented_icamera_metadata(mBuffer, fd, verbosity, indentation);
++}
++
++status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
++    if (mBuffer == NULL) {
++        mBuffer = allocate_icamera_metadata(extraEntries * 2, extraData * 2);
++        if (mBuffer == NULL) {
++            LOGE("%s: Can't allocate larger metadata buffer", __func__);
++            return NO_MEMORY;
++        }
++    } else {
++        size_t currentEntryCount = get_icamera_metadata_entry_count(mBuffer);
++        size_t currentEntryCap = get_icamera_metadata_entry_capacity(mBuffer);
++        size_t newEntryCount = currentEntryCount +
++                extraEntries;
++        newEntryCount = (newEntryCount > currentEntryCap) ?
++                newEntryCount * 2 : currentEntryCap;
++
++        size_t currentDataCount = get_icamera_metadata_data_count(mBuffer);
++        size_t currentDataCap = get_icamera_metadata_data_capacity(mBuffer);
++        size_t newDataCount = currentDataCount +
++                extraData;
++        newDataCount = (newDataCount > currentDataCap) ?
++                newDataCount * 2 : currentDataCap;
++
++        if (newEntryCount > currentEntryCap ||
++                newDataCount > currentDataCap) {
++            icamera_metadata_t *oldBuffer = mBuffer;
++            mBuffer = allocate_icamera_metadata(newEntryCount,
++                    newDataCount);
++            if (mBuffer == NULL) {
++                LOGE("%s: Can't allocate larger metadata buffer", __func__);
++                return NO_MEMORY;
++            }
++            append_icamera_metadata(mBuffer, oldBuffer);
++            free_icamera_metadata(oldBuffer);
++        }
++    }
++    return OK;
++}
++
++void CameraMetadata::swap(CameraMetadata& other) {
++    if (mLocked) {
++        LOGE("%s: CameraMetadata is locked", __func__);
++        return;
++    } else if (other.mLocked) {
++        LOGE("%s: Other CameraMetadata is locked", __func__);
++        return;
++    }
++
++    icamera_metadata* thisBuf = mBuffer;
++    icamera_metadata* otherBuf = other.mBuffer;
++
++    other.mBuffer = thisBuf;
++    mBuffer = otherBuf;
++}
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
+new file mode 100644
+index 000000000000..6acf03e91989
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
+@@ -0,0 +1,200 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++
++#include "icamera_metadata_base.h"
++#include "iutils/Errors.h"
++
++namespace icamera {
++
++/**
++ * A convenience wrapper around the C-based icamera_metadata_t library.
++ */
++class CameraMetadata {
++  public:
++    /** Creates an empty object; best used when expecting to acquire contents
++     * from elsewhere */
++    CameraMetadata();
++    /** Creates an object with space for entryCapacity entries, with
++     * dataCapacity extra storage */
++    CameraMetadata(size_t entryCapacity, size_t dataCapacity = 10);
++
++    ~CameraMetadata();
++
++    /** Takes ownership of passed-in buffer */
++    CameraMetadata(icamera_metadata_t *buffer);
++    /** Clones the metadata */
++    CameraMetadata(const CameraMetadata &other);
++
++    /**
++     * Assignment clones metadata buffer.
++     */
++    CameraMetadata &operator=(const CameraMetadata &other);
++    CameraMetadata &operator=(const icamera_metadata_t *buffer);
++
++    /**
++     * Get reference to the underlying metadata buffer. Ownership remains with
++     * the CameraMetadata object, but non-const CameraMetadata methods will not
++     * work until unlock() is called. Note that the lock has nothing to do with
++     * thread-safety, it simply prevents the icamera_metadata_t pointer returned
++     * here from being accidentally invalidated by CameraMetadata operations.
++     */
++    const icamera_metadata_t* getAndLock();
++
++    /**
++     * Unlock the CameraMetadata for use again. After this unlock, the pointer
++     * given from getAndLock() may no longer be used. The pointer passed out
++     * from getAndLock must be provided to guarantee that the right object is
++     * being unlocked.
++     */
++    status_t unlock(const icamera_metadata_t *buffer);
++
++    /**
++     * Release a raw metadata buffer to the caller. After this call,
++     * CameraMetadata no longer references the buffer, and the caller takes
++     * responsibility for freeing the raw metadata buffer (using
++     * free_camera_metadata()), or for handing it to another CameraMetadata
++     * instance.
++     */
++    icamera_metadata_t* release();
++
++    /**
++     * Clear the metadata buffer and free all storage used by it
++     */
++    void clear();
++
++    /**
++     * Acquire a raw metadata buffer from the caller. After this call,
++     * the caller no longer owns the raw buffer, and must not free or manipulate it.
++     * If CameraMetadata already contains metadata, it is freed.
++     */
++    void acquire(icamera_metadata_t* buffer);
++
++    /**
++     * Acquires raw buffer from other CameraMetadata object. After the call, the argument
++     * object no longer has any metadata.
++     */
++    void acquire(CameraMetadata &other);
++
++    /**
++     * Append metadata from another CameraMetadata object.
++     */
++    status_t append(const CameraMetadata &other);
++
++    /**
++     * Append metadata from a raw camera_metadata buffer
++     */
++    status_t append(const icamera_metadata* other);
++
++    /**
++     * Number of metadata entries.
++     */
++    size_t entryCount() const;
++
++    /**
++     * Is the buffer empty (no entires)
++     */
++    bool isEmpty() const;
++
++    /**
++     * Sort metadata buffer for faster find
++     */
++    status_t sort();
++
++    /**
++     * Update metadata entry. Will create entry if it doesn't exist already, and
++     * will reallocate the buffer if insufficient space exists. Overloaded for
++     * the various types of valid data.
++     */
++    status_t update(uint32_t tag,
++            const uint8_t *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const int32_t *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const float *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const int64_t *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const double *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const icamera_metadata_rational_t *data, size_t data_count);
++    status_t update(uint32_t tag,
++            const std::string &string);
++
++    /**
++     * Check if a metadata entry exists for a given tag id
++     *
++     */
++    bool exists(uint32_t tag) const;
++
++    /**
++     * Get metadata entry by tag id
++     */
++    icamera_metadata_entry find(uint32_t tag);
++
++    /**
++     * Get metadata entry by tag id, with no editing
++     */
++    icamera_metadata_ro_entry find(uint32_t tag) const;
++
++    /**
++     * Delete metadata entry by tag
++     */
++    status_t erase(uint32_t tag);
++
++    /**
++     * Swap the underlying camera metadata between this and the other
++     * metadata object.
++     */
++    void swap(CameraMetadata &other);
++
++    /**
++     * Dump contents into FD for debugging. The verbosity levels are
++     * 0: Tag entry information only, no data values
++     * 1: Level 0 plus at most 16 data values per entry
++     * 2: All information
++     *
++     * The indentation parameter sets the number of spaces to add to the start
++     * each line of output.
++     */
++    void dump(int fd, int verbosity = 1, int indentation = 0) const;
++
++  private:
++    icamera_metadata_t *mBuffer;
++    bool               mLocked;
++
++    /**
++     * Check if tag has a given type
++     */
++    status_t checkType(uint32_t tag, uint8_t expectedType);
++
++    /**
++     * Base update entry method
++     */
++    status_t updateImpl(uint32_t tag, const void *data, size_t data_count);
++
++    /**
++     * Resize metadata buffer if needed by reallocating it and copying it over.
++     */
++    status_t resizeIfNeeded(size_t extraEntries, size_t extraData);
++
++};
++
++} // namespace android
+diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
+new file mode 100644
+index 000000000000..8c40513cab1f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
+@@ -0,0 +1,381 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ParameterGenerator"
++
++#include <math.h>
++#include <memory>
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#include "MakerNote.h"
++#include "AiqResultStorage.h"
++#include "AiqUtils.h"
++#include "ParameterHelper.h"
++#include "ParameterGenerator.h"
++
++namespace icamera {
++
++#define MIN_TONEMAP_POINTS 64
++#define CHECK_REQUEST_ID(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error request id %ld!", __func__, id);
++#define CHECK_SEQUENCE(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error sequence %ld!", __func__, id);
++
++ParameterGenerator::ParameterGenerator(int cameraId) :
++    mCameraId(cameraId),
++    mTonemapMaxCurvePoints(0)
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++    reset();
++
++    camera_info_t info;
++    CLEAR(info);
++    PlatformData::getCameraInfo(mCameraId, info);
++    info.capability->getTonemapMaxCurvePoints(mTonemapMaxCurvePoints);
++    if (mTonemapMaxCurvePoints > 0 && mTonemapMaxCurvePoints < MIN_TONEMAP_POINTS) {
++        LOGW("%s: wrong tonemap points", __func__);
++        mTonemapMaxCurvePoints = 0;
++    }
++    if (mTonemapMaxCurvePoints) {
++        mTonemapCurveRed = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
++        mTonemapCurveBlue = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
++        mTonemapCurveGreen = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
++
++        // Initialize P_IN, P_OUT values [(P_IN, P_OUT), ..]
++        for (int32_t i = 0; i < mTonemapMaxCurvePoints; i++) {
++            float index = static_cast<float>(i);
++            mTonemapCurveRed[i * 2] = index / (mTonemapMaxCurvePoints - 1);
++            mTonemapCurveRed[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
++            mTonemapCurveBlue[i * 2] = index / (mTonemapMaxCurvePoints - 1);
++            mTonemapCurveBlue[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
++            mTonemapCurveGreen[i * 2] = index / (mTonemapMaxCurvePoints - 1);
++            mTonemapCurveGreen[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
++        }
++    }
++}
++
++ParameterGenerator::~ParameterGenerator()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++}
++
++int ParameterGenerator::reset()
++{
++    LOG1("%s, mCameraId = %d", __func__, mCameraId);
++    AutoMutex l(mParamsLock);
++    mRequestParamMap.clear();
++
++    return OK;
++}
++
++int ParameterGenerator::saveParameters(long sequence, long requestId, const Parameters* param)
++{
++    CHECK_REQUEST_ID(requestId);
++    CHECK_SEQUENCE(sequence);
++
++    AutoMutex l(mParamsLock);
++    if (param)
++        mLastParam = *param;
++
++    LOG2("%s, sequence %ld", __func__, sequence);
++    std::shared_ptr<RequestParam> requestParam = nullptr;
++    if (mRequestParamMap.size() < kStorageSize) {
++        requestParam = std::make_shared<RequestParam>();
++    } else {
++        auto it = mRequestParamMap.begin();
++        requestParam = it->second;
++        mRequestParamMap.erase(it->first);
++    }
++
++    requestParam->requestId = requestId;
++    requestParam->param = mLastParam;
++
++    mRequestParamMap[sequence] = requestParam;
++    return OK;
++}
++
++void ParameterGenerator::updateParameters(long sequence, const Parameters *param)
++{
++    CheckError(!param, VOID_VALUE, "The param is nullptr!");
++
++    LOG2("%s, sequence %ld", __func__, sequence);
++
++    AutoMutex l(mParamsLock);
++    std::shared_ptr<RequestParam> requestParam = nullptr;
++    if (mRequestParamMap.find(sequence) != mRequestParamMap.end()) {
++        requestParam = mRequestParamMap[sequence];
++    } else {
++        auto it = mRequestParamMap.begin();
++        requestParam = it->second;
++        mRequestParamMap.erase(it->first);
++    }
++    int32_t userRequestId = 0;
++    int ret = param->getUserRequestId(userRequestId);
++    if (ret == OK) {
++        requestParam->param.setUserRequestId(userRequestId);
++    }
++    // Update Jpeg related settings
++    int rotation = 0;
++    ret = param->getJpegRotation(rotation);
++    if (ret == OK) {
++        requestParam->param.setJpegRotation(rotation);
++    }
++    uint8_t quality = 0;
++    ret = param->getJpegQuality(&quality);
++    if (ret == OK) {
++        requestParam->param.setJpegQuality(quality);
++    }
++    int64_t timestamp = 0;
++    ret = param->getJpegGpsTimeStamp(timestamp);
++    if (ret == OK) {
++        requestParam->param.setJpegGpsTimeStamp(timestamp);
++    }
++    double gpsCoordinates[3] = { 0 };
++    int retLat = param->getJpegGpsLatitude(gpsCoordinates[0]);
++    int retLon = param->getJpegGpsLongitude(gpsCoordinates[1]);
++    int retAlt = param->getJpegGpsAltitude(gpsCoordinates[2]);
++    if (retLat == OK && retLon == OK && retAlt == OK) {
++        requestParam->param.setJpegGpsCoordinates(gpsCoordinates);
++    }
++    camera_resolution_t res;
++    ret = param->getJpegThumbnailSize(res);
++    if (ret == OK) {
++        requestParam->param.setJpegThumbnailSize(res);
++    }
++    quality = 0;
++    ret = param->getJpegThumbnailQuality(&quality);
++    if (ret == OK) {
++        requestParam->param.setJpegThumbnailQuality(quality);
++    }
++
++    mRequestParamMap[sequence] = requestParam;
++}
++
++int ParameterGenerator::getParameters(long sequence, Parameters *param, bool resultOnly)
++{
++    CheckError((param == nullptr), UNKNOWN_ERROR, "nullptr to get param!");
++
++    if (!resultOnly && sequence < 0) {
++        *param = mLastParam;
++    } else if (!resultOnly) {
++        if (mRequestParamMap.find(sequence) != mRequestParamMap.end()) {
++            *param = mRequestParamMap[sequence]->param;
++        } else {
++            LOGE("Can't find settings for seq %ld", sequence);
++        }
++    }
++
++    generateParametersL(sequence, param);
++    return OK;
++}
++
++int ParameterGenerator::getUserRequestId(long sequence, int32_t& userRequestId)
++{
++    CHECK_SEQUENCE(sequence);
++
++    AutoMutex l(mParamsLock);
++    if (mRequestParamMap.find(sequence) != mRequestParamMap.end()) {
++        return mRequestParamMap[sequence]->param.getUserRequestId(userRequestId);
++    }
++
++    LOGE("Can't find user requestId for seq %ld", sequence);
++    return UNKNOWN_ERROR;
++}
++
++int ParameterGenerator::getRequestId(long sequence, long& requestId)
++{
++    CHECK_SEQUENCE(sequence);
++    requestId = -1;
++
++    AutoMutex l(mParamsLock);
++    if (mRequestParamMap.find(sequence) != mRequestParamMap.end()) {
++        requestId = mRequestParamMap[sequence]->requestId;
++        return OK;
++    }
++
++    LOGE("Can't find requestId for seq %ld", sequence);
++    return UNKNOWN_ERROR;
++}
++
++int ParameterGenerator::generateParametersL(long sequence, Parameters *params)
++{
++    if (PlatformData::isEnableAIQ(mCameraId)) {
++        updateWithAiqResultsL(sequence, params);
++        updateTonemapCurve(sequence, params);
++    }
++    return OK;
++}
++
++int ParameterGenerator::updateWithAiqResultsL(long sequence, Parameters *params)
++{
++    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
++    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
++           "%s Aiq result of sequence %ld does not exist", __func__, sequence);
++
++    // Update AE related parameters
++    camera_ae_state_t aeState = aiqResult->mAeResults.exposures[0].converged ?
++            AE_STATE_CONVERGED : AE_STATE_NOT_CONVERGED;
++    params->setAeState(aeState);
++
++    if (CameraUtils::isMultiExposureCase(aiqResult->mTuningMode) &&
++        aiqResult->mAeResults.num_exposures > 1 && aiqResult->mAeResults.exposures[1].exposure) {
++        params->setExposureTime(aiqResult->mAeResults.exposures[1].exposure->exposure_time_us);
++    } else {
++        params->setExposureTime(aiqResult->mAeResults.exposures[0].exposure->exposure_time_us);
++    }
++    params->setSensitivityIso(aiqResult->mAeResults.exposures[0].exposure->iso);
++
++    // Update AWB related parameters
++    updateAwbGainsL(params, aiqResult->mAwbResults);
++    camera_color_transform_t ccm;
++    MEMCPY_S(ccm.color_transform, sizeof(ccm.color_transform),
++             aiqResult->mPaResults.color_conversion_matrix,
++             sizeof(aiqResult->mPaResults.color_conversion_matrix));
++    params->setColorTransform(ccm);
++
++    camera_color_gains_t colorGains;
++    colorGains.color_gains_rggb[0] = aiqResult->mPaResults.color_gains.r;
++    colorGains.color_gains_rggb[1] = aiqResult->mPaResults.color_gains.gr;
++    colorGains.color_gains_rggb[2] = aiqResult->mPaResults.color_gains.gb;
++    colorGains.color_gains_rggb[3] = aiqResult->mPaResults.color_gains.b;
++    params->setColorGains(colorGains);
++
++    camera_awb_state_t awbState = (fabs(aiqResult->mAwbResults.distance_from_convergence) < 0.001) ?
++            AWB_STATE_CONVERGED : AWB_STATE_NOT_CONVERGED;
++    params->setAwbState(awbState);
++
++    // Update AF related parameters
++    camera_af_state_t afState = \
++            (aiqResult->mAfResults.status == ia_aiq_af_status_local_search) ? AF_STATE_LOCAL_SEARCH
++          : (aiqResult->mAfResults.status == ia_aiq_af_status_extended_search) ? AF_STATE_EXTENDED_SEARCH
++          : (aiqResult->mAfResults.status == ia_aiq_af_status_success) ? AF_STATE_SUCCESS
++          : (aiqResult->mAfResults.status == ia_aiq_af_status_fail) ? AF_STATE_FAIL
++          : AF_STATE_IDLE;
++    params->setAfState(afState);
++    params->setFocusDistance(aiqResult->mAfDistanceDiopters);
++    params->setFocusRange(aiqResult->mFocusRange);
++
++    bool lensMoving = false;
++    if (afState == AF_STATE_LOCAL_SEARCH || afState == AF_STATE_EXTENDED_SEARCH) {
++        lensMoving = (aiqResult->mAfResults.final_lens_position_reached == false);
++    } else if (aiqResult->mAiqParam.afMode == AF_MODE_OFF) {
++        lensMoving = (aiqResult->mAfResults.lens_driver_action ? true : false);
++    }
++    params->setLensState(lensMoving);
++
++    // Update scene mode
++    camera_scene_mode_t sceneMode = SCENE_MODE_AUTO;
++    params->getSceneMode(sceneMode);
++
++    /* Use direct AE result to update sceneMode to reflect the actual mode AE want to have,
++     * Besides needed by full pipe auto-switch, this is also necessary when user want to
++     * switch pipe in user app according to AE result.
++     */
++    if (sceneMode == SCENE_MODE_AUTO) {
++        if (aiqResult->mAeResults.multiframe== ia_aiq_bracket_mode_hdr) {
++            sceneMode = SCENE_MODE_HDR;
++        } else if (aiqResult->mAeResults.multiframe == ia_aiq_bracket_mode_ull) {
++            sceneMode = SCENE_MODE_ULL;
++        }
++    }
++    LOG2("%s, sceneMode:%d", __func__, sceneMode);
++    params->setSceneMode(sceneMode);
++
++    camera_lens_shading_map_mode_type_t lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
++    params->getLensShadingMapMode(lensShadingMapMode);
++    if (lensShadingMapMode == LENS_SHADING_MAP_MODE_ON) {
++        size_t size = aiqResult->mAiqParam.lensShadingMapSize.x *
++                      aiqResult->mAiqParam.lensShadingMapSize.y * 4;
++        params->setLensShadingMap(aiqResult->mAiqParam.lensShadingMap, size);
++    }
++
++    return updateCommonMetadata(params, aiqResult);
++}
++
++int ParameterGenerator::updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result)
++{
++    camera_awb_gains_t awbGains;
++    CLEAR(awbGains);
++    float normalizedR, normalizedG, normalizedB;
++
++    if (params->getAwbGains(awbGains) == OK) {
++        // User manual AWB gains
++        awbGains.g_gain = CLIP(awbGains.g_gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
++        normalizedG = AiqUtils::normalizeAwbGain(awbGains.g_gain);
++    } else {
++        // non-manual AWB gains, try to find a proper G that makes R/G/B all in the gain range.
++        normalizedG = sqrt((AWB_GAIN_NORMALIZED_START * AWB_GAIN_NORMALIZED_END) / \
++                           (result.accurate_r_per_g * result.accurate_b_per_g));
++        awbGains.g_gain = AiqUtils::convertToUserAwbGain(normalizedG);
++    }
++
++    normalizedR = result.accurate_r_per_g * normalizedG;
++    normalizedB = result.accurate_b_per_g * normalizedG;
++
++    awbGains.r_gain = AiqUtils::convertToUserAwbGain(normalizedR);
++    awbGains.b_gain = AiqUtils::convertToUserAwbGain(normalizedB);
++
++    LOG2("awbGains [r, g, b] = [%d, %d, %d]", awbGains.r_gain, awbGains.g_gain, awbGains.b_gain);
++    params->setAwbGains(awbGains);
++
++    // Update the AWB result
++    camera_awb_result_t awbResult;
++    awbResult.r_per_g = result.accurate_r_per_g;
++    awbResult.b_per_g = result.accurate_b_per_g;
++    LOG2("awb result: %f, %f", awbResult.r_per_g, awbResult.b_per_g);
++    params->setAwbResult(&awbResult);
++
++    return OK;
++}
++
++int ParameterGenerator::updateTonemapCurve(long sequence, Parameters *params)
++{
++    if (!mTonemapMaxCurvePoints)
++        return OK;
++
++    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
++    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
++               "%s Aiq result of sequence %ld does not exist", __func__, sequence);
++    const ia_aiq_gbce_results &gbceResults = aiqResult->mGbceResults;
++
++    int multiplier = gbceResults.gamma_lut_size / mTonemapMaxCurvePoints;
++    for (int32_t i=0; i < mTonemapMaxCurvePoints; i++) {
++        mTonemapCurveRed[i * 2 + 1] = gbceResults.r_gamma_lut[i * multiplier];
++        mTonemapCurveBlue[i * 2 + 1] = gbceResults.g_gamma_lut[i * multiplier];
++        mTonemapCurveGreen[i * 2 + 1] = gbceResults.b_gamma_lut[i * multiplier];
++    }
++
++    int count = mTonemapMaxCurvePoints * 2;
++    camera_tonemap_curves_t curves =
++            {count, count, count,
++             mTonemapCurveRed.get(), mTonemapCurveBlue.get(), mTonemapCurveGreen.get()};
++    params->setTonemapCurves(curves);
++    return OK;
++}
++
++int ParameterGenerator::updateCommonMetadata(Parameters *params, const AiqResult *aiqResult) {
++    CameraMetadata metadata;
++
++    metadata.update(CAMERA_SENSOR_ROLLING_SHUTTER_SKEW, &aiqResult->mRollingShutter, 1);
++    int64_t frameDuration = aiqResult->mFrameDuration * 1000;  // us -> ns
++    metadata.update(CAMERA_SENSOR_FRAME_DURATION, &frameDuration, 1);
++
++    ParameterHelper::merge(metadata, params);
++    return OK;
++}
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
+new file mode 100644
+index 000000000000..20ffcc79c0d3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
+@@ -0,0 +1,110 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <map>
++
++#include "iutils/Thread.h"
++#include "Parameters.h"
++
++namespace icamera {
++
++/*
++ * \class ParameterGenerator
++ * This class is used to generator parameter results. It updates the parameters
++ * with AIQ results, sensor embedded metadata and 3A statistics.
++ * The parameter results are stored with the frame sequence indicating on which
++ * frame the parameters are active.
++ */
++class ParameterGenerator {
++public:
++    ParameterGenerator(int cameraId);
++    ~ParameterGenerator();
++
++    /**
++     * \brief reset the parameters data.
++     */
++    int reset();
++
++    /**
++     * \brief Save parameters with sequence id indicating the active frame.
++     *           And update the aiq result parameters as well.
++     */
++    int saveParameters(long predictSequence, long requestId, const Parameters *param = nullptr);
++
++    /**
++     * \brief Update parameters per sequence id.
++     */
++    void updateParameters(long sequence, const Parameters *param);
++    int getUserRequestId(long sequence, int32_t& userRequestId);
++
++    /**
++     * \brief Get the parameters for the frame indicated by the sequence id.
++     */
++    int getParameters(long sequence, Parameters *param, bool mergeResultOnly = true);
++    int getRequestId(long predictSequence, long& requestId);
++
++private:
++    ParameterGenerator(const ParameterGenerator& other);
++    ParameterGenerator& operator=(const ParameterGenerator& other);
++
++    int generateParametersL(long sequence, Parameters *params);
++    int updateWithAiqResultsL(long sequence, Parameters *params);
++    int updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result);
++    int updateTonemapCurve(long sequence, Parameters *params);
++
++    int updateCommonMetadata(Parameters *params, const AiqResult *aiqResult);
++
++private:
++    typedef enum {
++        RESULT_TYPE_AIQ = 1,
++        RESULT_TYPE_SENSOR_EMD = 1 << 1,
++        RESULT_TYPE_STATISTICS = 1 << 2
++    } ResultType;
++
++    class RequestParam {
++    public:
++        RequestParam() : requestId(-1) {}
++
++        ~RequestParam() {}
++
++        long requestId;
++        Parameters param;
++
++    private:
++        RequestParam(const RequestParam& other);
++        RequestParam& operator=(const RequestParam& other);
++    };
++
++private:
++    int mCameraId;
++    static const int kStorageSize = MAX_SETTING_COUNT;
++
++    // Guard for ParameterGenerator public API.
++    Mutex mParamsLock;
++    // first: sequence id, second: RequestParam data
++    std::map<long, std::shared_ptr<RequestParam>> mRequestParamMap;
++    Parameters mLastParam;
++
++    std::unique_ptr<float[]> mTonemapCurveRed;
++    std::unique_ptr<float[]> mTonemapCurveBlue;
++    std::unique_ptr<float[]> mTonemapCurveGreen;
++    int32_t mTonemapMaxCurvePoints;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
+new file mode 100644
+index 000000000000..578557f5caca
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
+@@ -0,0 +1,84 @@
++/*
++ * Copyright (C) 2017-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "ParameterHelper"
++
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++
++#include "Parameters.h"
++#include "ParameterHelper.h"
++
++namespace icamera {
++
++void ParameterHelper::merge(const Parameters& src, Parameters* dst)
++{
++    AutoRLock rl(src.mData);
++    merge(getMetadata(src.mData), dst);
++}
++
++void ParameterHelper::merge(const CameraMetadata& metadata, Parameters* dst)
++{
++    if (metadata.isEmpty()) {
++        // Nothing needs to be merged
++        return;
++    }
++
++    AutoWLock wl(dst->mData);
++    const icamera_metadata_t* src = const_cast<CameraMetadata*>(&metadata)->getAndLock();
++    size_t count = metadata.entryCount();
++    icamera_metadata_ro_entry_t entry;
++    for (size_t i = 0; i < count; i++) {
++        CLEAR(entry);
++        if (get_icamera_metadata_ro_entry(src, i, &entry) != OK) {
++            continue;
++        }
++        switch (entry.type) {
++        case ICAMERA_TYPE_BYTE:
++            getMetadata(dst->mData).update(entry.tag, entry.data.u8, entry.count);
++            break;
++        case ICAMERA_TYPE_INT32:
++            getMetadata(dst->mData).update(entry.tag, entry.data.i32, entry.count);
++            break;
++        case ICAMERA_TYPE_FLOAT:
++            getMetadata(dst->mData).update(entry.tag, entry.data.f, entry.count);
++            break;
++        case ICAMERA_TYPE_INT64:
++            getMetadata(dst->mData).update(entry.tag, entry.data.i64, entry.count);
++            break;
++        case ICAMERA_TYPE_DOUBLE:
++            getMetadata(dst->mData).update(entry.tag, entry.data.d, entry.count);
++            break;
++        case ICAMERA_TYPE_RATIONAL:
++            getMetadata(dst->mData).update(entry.tag, entry.data.r, entry.count);
++            break;
++        default:
++            LOGW("Invalid entry type, should never happen");
++            break;
++        }
++    }
++    const_cast<CameraMetadata*>(&metadata)->unlock(src);
++}
++
++void ParameterHelper::copyMetadata(const Parameters& source, CameraMetadata* metadata)
++{
++    CheckError((!metadata), VOID_VALUE, "null metadata to be updated!");
++
++    AutoRLock rl(source.mData);
++    *metadata = getMetadata(source.mData);
++}
++
++} // end of namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
+new file mode 100644
+index 000000000000..8e5cf6e25f81
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
+@@ -0,0 +1,142 @@
++/*
++ * Copyright (C) 2017-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/RWLock.h"
++#include "CameraMetadata.h"
++
++namespace icamera {
++
++class Parameters;
++
++/**
++ * \class ParameterHelper
++ *
++ * There are two main purposes of this class:
++ * 1. Provide some wrapper functions for the implementation of Parameters.
++ * 2. Provide some interface for HAL to access and modify Parameters internal data.
++ */
++class ParameterHelper {
++public:
++    /**
++     * \brief Merge and update dst parameter buffer with another parameter instance.
++     *
++     * \param[in] Parameters src: the source parameter.
++     * \param[out] Parameters dst: the parameter to be updated.
++     *
++     * \return void
++     */
++    static void merge(const Parameters& src, Parameters* dst);
++
++    /**
++     * \brief Merge and update dst parameter buffer by using metadata.
++     *
++     * \param[in] CameraMetadata metadata: the source metadata.
++     * \param[out] Parameters dst: the parameter to be updated.
++     *
++     * \return void
++     */
++    static void merge(const CameraMetadata& metadata, Parameters* dst);
++
++    /**
++     * \brief Copy metadata from parameter buffer.
++     *
++     * Some HAL V3 style parameters are not returned in the getParameter()
++     * because it is not used inside the HAL.
++     * Provide this function to assist upperlayer to return metadata
++     * to applications.
++     *
++     * \param[in] Parameters source: the parameter to provide metadata.
++     * \param[out] CameraMetadata metadata: the metadata to be updated.
++     *
++     * \return void
++     */
++    static void copyMetadata(const Parameters& source, CameraMetadata* metadata);
++
++private:
++    // The definitions and interfaces in this private section are only for Parameters internal
++    // use, HAL other code shouldn't and cannot access them.
++    friend class Parameters;
++
++    /**
++     * \class ParameterData
++     *
++     * \brief The definition of Parameters' internal data structure used to hide implementation
++     *        details of Parameters.
++     */
++    class ParameterData {
++    public:
++        ParameterData() {}
++        ~ParameterData() {}
++
++        ParameterData(const ParameterData& other) : mMetadata(other.mMetadata) {}
++        ParameterData& operator=(const ParameterData& other) {
++            mMetadata = other.mMetadata;
++            return *this;
++        }
++
++        CameraMetadata mMetadata; // The data structure to save all of the parameters.
++        RWLock mRwLock;           // Read-write lock to make Parameters class thread-safe
++    };
++
++    // Customized wrappers of RWLock to make the implementation of Parameters much cleaner.
++    class AutoRLock {
++    public:
++        AutoRLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.readLock(); }
++        ~AutoRLock() { mLock.unlock(); }
++    private:
++        RWLock& mLock;
++    };
++
++    class AutoWLock {
++    public:
++        AutoWLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.writeLock(); }
++        ~AutoWLock() { mLock.unlock(); }
++    private:
++        RWLock& mLock;
++    };
++
++    static ParameterData& getInternalData(void* data) {
++        return *reinterpret_cast<ParameterData*>(data);
++    }
++
++    static void* createParameterData() {
++        return new ParameterData();
++    }
++
++    static void* createParameterData(void* data) {
++        return new ParameterData(getInternalData(data));
++    }
++
++    static void releaseParameterData(void* data) {
++        delete &getInternalData(data);
++    }
++
++    static void deepCopy(void* srcData, void* dstData) {
++        getInternalData(dstData) = getInternalData(srcData);
++    }
++
++    static CameraMetadata& getMetadata(void* data) {
++        return getInternalData(data).mMetadata;
++    }
++
++    static icamera_metadata_ro_entry_t getMetadataEntry(void* data, uint32_t tag) {
++        return const_cast<const CameraMetadata*>(&getMetadata(data))->find(tag);
++    }
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/metadata/Parameters.cpp b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
+new file mode 100644
+index 000000000000..e62c1f8fc4d9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
+@@ -0,0 +1,2026 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "Parameters"
++
++#include "iutils/Errors.h"
++#include "iutils/CameraLog.h"
++#include "iutils/CameraDump.h"
++#include "iutils/Utils.h"
++
++#include "PlatformData.h"
++#include "Parameters.h"
++#include "ParameterHelper.h"
++
++using std::vector;
++
++namespace icamera {
++
++Parameters::Parameters() : mData(ParameterHelper::createParameterData()) {}
++
++Parameters::Parameters(const Parameters& other) :
++        mData(ParameterHelper::createParameterData(other.mData)) {}
++
++Parameters& Parameters::operator=(const Parameters& other)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    ParameterHelper::deepCopy(other.mData, mData);
++    return *this;
++}
++
++Parameters::~Parameters()
++{
++    ParameterHelper::releaseParameterData(mData);
++    mData = nullptr;
++}
++
++void Parameters::merge(const Parameters& other)
++{
++    ParameterHelper::merge(other, this);
++}
++
++int Parameters::setAeMode(camera_ae_mode_t aeMode)
++{
++    uint8_t mode = aeMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_MODE, &mode, 1);
++}
++
++int Parameters::getAeMode(camera_ae_mode_t& aeMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    aeMode = (camera_ae_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAeState(camera_ae_state_t aeState)
++{
++    uint8_t state = aeState;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_STATE, &state, 1);
++}
++
++int Parameters::getAeState(camera_ae_state_t& aeState) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_STATE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    aeState = (camera_ae_state_t)entry.data.u8[0];
++    return OK;
++}
++
++static int setRegions(CameraMetadata& metadata, camera_window_list_t regions, int tag)
++{
++    if (regions.empty()) {
++        // Nothing to do with an empty parameter.
++        return INVALID_OPERATION;
++    }
++
++    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
++    int values[regions.size() * ELEM_NUM];
++    for (size_t i = 0; i < regions.size(); i++) {
++        values[i * ELEM_NUM] = regions[i].left;
++        values[i * ELEM_NUM + 1] = regions[i].top;
++        values[i * ELEM_NUM + 2] = regions[i].right;
++        values[i * ELEM_NUM + 3] = regions[i].bottom;
++        values[i * ELEM_NUM + 4] = regions[i].weight;
++    }
++
++    return metadata.update(tag, values, ARRAY_SIZE(values));
++}
++
++static int getRegions(icamera_metadata_ro_entry_t entry, camera_window_list_t& regions)
++{
++    regions.clear();
++    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
++    if (entry.count == 0 || entry.count % ELEM_NUM != 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    camera_window_t w;
++    for (size_t i = 0; i < entry.count; i += ELEM_NUM) {
++        w.left = entry.data.i32[i];
++        w.top = entry.data.i32[i + 1];
++        w.right = entry.data.i32[i + 2];
++        w.bottom = entry.data.i32[i + 3];
++        w.weight = entry.data.i32[i + 4];
++        regions.push_back(w);
++    }
++
++    return OK;
++}
++
++int Parameters::setAeRegions(camera_window_list_t aeRegions)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return setRegions(ParameterHelper::getMetadata(mData), aeRegions, CAMERA_AE_REGIONS);
++}
++
++int Parameters::getAeRegions(camera_window_list_t& aeRegions) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AE_REGIONS), aeRegions);
++}
++
++int Parameters::setAeLock(bool lock)
++{
++    uint8_t lockValue = lock ? 1 : 0;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_LOCK, &lockValue, 1);
++}
++
++int Parameters::getAeLock(bool& lock) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    lock = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setExposureTime(int64_t exposureTime)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_EXPOSURE_TIME, &exposureTime, 1);
++}
++
++int Parameters::getExposureTime(int64_t& exposureTime) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_EXPOSURE_TIME);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    exposureTime = entry.data.i64[0];
++    return OK;
++}
++
++int Parameters::setSensitivityGain(float gain)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN, &gain, 1);
++}
++
++int Parameters::getSensitivityGain(float& gain) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    gain = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setSensitivityIso(int32_t iso)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_SENSITIVITY, &iso, 1);
++}
++
++int Parameters::getSensitivityIso(int32_t& iso) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_SENSITIVITY);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    iso = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setAeCompensation(int ev)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_COMPENSATION, &ev, 1);
++}
++
++int Parameters::getAeCompensation(int& ev) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    ev = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setFrameRate(float fps)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FRAME_RATE, &fps, 1);
++}
++
++int Parameters::getFrameRate(float& fps) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FRAME_RATE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    fps = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setAntiBandingMode(camera_antibanding_mode_t bandingMode)
++{
++    uint8_t mode = bandingMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_ANTIBANDING_MODE, &mode, 1);
++}
++
++int Parameters::getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_ANTIBANDING_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    bandingMode = (camera_antibanding_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbMode(camera_awb_mode_t awbMode)
++{
++    uint8_t mode = awbMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_MODE, &mode, 1);
++}
++
++int Parameters::getAwbMode(camera_awb_mode_t& awbMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    awbMode = (camera_awb_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbState(camera_awb_state_t awbState)
++{
++    uint8_t state = awbState;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_STATE, &state, 1);
++}
++
++int Parameters::getAwbState(camera_awb_state_t& awbState) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_STATE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    awbState = (camera_awb_state_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbLock(bool lock)
++{
++    uint8_t lockValue = lock ? 1 : 0;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_LOCK, &lockValue, 1);
++}
++
++int Parameters::getAwbLock(bool& lock) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    lock = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbCctRange(camera_range_t cct)
++{
++    int range[] = {(int)cct.min, (int)cct.max};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CCT_RANGE, range, ARRAY_SIZE(range));
++}
++
++int Parameters::getAwbCctRange(camera_range_t& cct) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CCT_RANGE);
++    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    cct.min = entry.data.i32[0];
++    cct.max = entry.data.i32[1];
++    return OK;
++}
++
++int Parameters::setAwbGains(camera_awb_gains_t awbGains)
++{
++    int values[] = {awbGains.r_gain, awbGains.g_gain, awbGains.b_gain};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAINS, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getAwbGains(camera_awb_gains_t& awbGains) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAINS);
++    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    awbGains.r_gain = entry.data.i32[0];
++    awbGains.g_gain = entry.data.i32[1];
++    awbGains.b_gain = entry.data.i32[2];
++    return OK;
++}
++
++int Parameters::setAwbResult(void* data)
++{
++    uint32_t size = sizeof(camera_awb_result_t);
++    uint32_t tag = CAMERA_AWB_RESULT;
++    ParameterHelper::AutoWLock wl(mData);
++
++    if (data == NULL) {
++        return ParameterHelper::getMetadata(mData).erase(tag);
++    }
++    return ParameterHelper::getMetadata(mData).update(tag, (uint8_t*)data, size);
++}
++
++int Parameters::getAwbResult(void* data) const
++{
++    if (data == NULL) {
++        return BAD_VALUE;
++    }
++
++    uint32_t size = sizeof(camera_awb_result_t);
++    uint32_t tag = CAMERA_AWB_RESULT;
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, tag);
++    if (entry.count != size) {
++        return NAME_NOT_FOUND;
++    }
++
++    MEMCPY_S(data, size, entry.data.u8, size);
++
++    return OK;
++}
++
++int Parameters::setAwbGainShift(camera_awb_gains_t awbGainShift)
++{
++    int values[] = {awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAIN_SHIFT, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getAwbGainShift(camera_awb_gains_t& awbGainShift) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAIN_SHIFT);
++    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    awbGainShift.r_gain = entry.data.i32[0];
++    awbGainShift.g_gain = entry.data.i32[1];
++    awbGainShift.b_gain = entry.data.i32[2];
++    return OK;
++}
++
++int Parameters::setAwbWhitePoint(camera_coordinate_t whitePoint)
++{
++    int values[] = {whitePoint.x, whitePoint.y};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_WHITE_POINT, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getAwbWhitePoint(camera_coordinate_t& whitePoint) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_WHITE_POINT);
++    const size_t ELEM_NUM = sizeof(camera_coordinate_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++
++    whitePoint.x = entry.data.i32[0];
++    whitePoint.y = entry.data.i32[1];
++
++    return OK;
++}
++
++int Parameters::setColorTransform(camera_color_transform_t colorTransform)
++{
++    float* transform = (float*)colorTransform.color_transform;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_TRANSFORM, transform, 3 * 3);
++}
++
++int Parameters::getColorTransform(camera_color_transform_t& colorTransform) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_TRANSFORM);
++    const size_t ELEM_NUM = 3 * 3;
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    for (size_t i = 0; i < ELEM_NUM; i++) {
++        colorTransform.color_transform[i / 3][i % 3] = entry.data.f[i];
++    }
++
++    return OK;
++}
++
++int Parameters::setColorGains(camera_color_gains_t colorGains)
++{
++    float* gains = colorGains.color_gains_rggb;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_GAINS, gains, 4);
++}
++
++int Parameters::getColorGains(camera_color_gains_t& colorGains) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    icamera_metadata_ro_entry_t entry =
++        ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_GAINS);
++    const size_t ELEM_NUM = 4;
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    for (size_t i = 0; i < ELEM_NUM; i++) {
++        colorGains.color_gains_rggb[i] = entry.data.f[i];
++    }
++    return OK;
++}
++
++int Parameters::setAwbRegions(camera_window_list_t awbRegions)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return setRegions(ParameterHelper::getMetadata(mData), awbRegions, CAMERA_AWB_REGIONS);
++}
++
++int Parameters::getAwbRegions(camera_window_list_t& awbRegions) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_REGIONS), awbRegions);
++}
++
++int Parameters::setNrMode(camera_nr_mode_t nrMode)
++{
++    uint8_t mode = nrMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_MODE, &mode, 1);
++}
++
++int Parameters::getNrMode(camera_nr_mode_t& nrMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    nrMode = (camera_nr_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setNrLevel(camera_nr_level_t level)
++{
++    int values [] = {level.overall, level.spatial, level.temporal};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_LEVEL, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getNrLevel(camera_nr_level_t& level) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_LEVEL);
++    const size_t ELEM_NUM = sizeof(camera_nr_level_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    level.overall = entry.data.i32[0];
++    level.spatial = entry.data.i32[1];
++    level.temporal = entry.data.i32[2];
++    return OK;
++}
++
++int Parameters::setIrisMode(camera_iris_mode_t irisMode)
++{
++    uint8_t mode = irisMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_MODE, &mode, 1);
++}
++
++int Parameters::getIrisMode(camera_iris_mode_t& irisMode)
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    irisMode = (camera_iris_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setIrisLevel(int level)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_LEVEL, &level, 1);
++}
++
++int Parameters::getIrisLevel(int& level)
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_LEVEL);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    level = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setWdrLevel(uint8_t level)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WDR_LEVEL, &level, 1);
++}
++
++int Parameters::getWdrLevel(uint8_t& level) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WDR_LEVEL);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    level = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setEffectSceneMode(camera_scene_mode_t sceneMode)
++{
++    uint8_t mode = sceneMode;
++    LOGW("Effect scene mode is deprecated. Please use setSceneMode() instead.");
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
++}
++
++int Parameters::getEffectSceneMode(camera_scene_mode_t& sceneMode) const
++{
++    LOGW("Effect scene mode is deprecated. Please use getSceneMode() instead.");
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setSceneMode(camera_scene_mode_t sceneMode)
++{
++    uint8_t mode = sceneMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
++}
++
++int Parameters::getSceneMode(camera_scene_mode_t& sceneMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setWeightGridMode(camera_weight_grid_mode_t weightGridMode)
++{
++    uint8_t mode = (uint8_t)weightGridMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WEIGHT_GRID_MODE, &mode, 1);
++}
++
++int Parameters::getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WEIGHT_GRID_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    weightGridMode = (camera_weight_grid_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setBlcAreaMode(camera_blc_area_mode_t blcAreaMode)
++{
++    uint8_t mode = blcAreaMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_BLC_AREA_MODE, &mode, 1);
++}
++
++int Parameters::getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_BLC_AREA_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    blcAreaMode = (camera_blc_area_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setFpsRange(camera_range_t fpsRange)
++{
++    float range[] = {fpsRange.min, fpsRange.max};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_TARGET_FPS_RANGE, range, ARRAY_SIZE(range));
++}
++
++int Parameters::getFpsRange(camera_range_t& fpsRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_TARGET_FPS_RANGE);
++    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(float);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++    fpsRange.min = entry.data.f[0];
++    fpsRange.max = entry.data.f[1];
++    return OK;
++}
++
++int Parameters::setImageEnhancement(camera_image_enhancement_t effects)
++{
++    int values[] = {effects.sharpness, effects.brightness, effects.contrast, effects.hue, effects.saturation};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IMAGE_ENHANCEMENT, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getImageEnhancement(camera_image_enhancement_t& effects) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IMAGE_ENHANCEMENT);
++    size_t number_of_effects = sizeof(camera_image_enhancement_t) / sizeof(int);
++    if (entry.count != number_of_effects) {
++        return NAME_NOT_FOUND;
++    }
++    effects.sharpness = entry.data.i32[0];
++    effects.brightness = entry.data.i32[1];
++    effects.contrast = entry.data.i32[2];
++    effects.hue = entry.data.i32[3];
++    effects.saturation = entry.data.i32[4];
++
++    return OK;
++}
++
++int Parameters::setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode)
++{
++    uint8_t mode = deinterlaceMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DEINTERLACE_MODE, &mode, 1);
++}
++
++int Parameters::getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DEINTERLACE_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    deinterlaceMode = (camera_deinterlace_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const
++{
++    supportedModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedModes.push_back((camera_video_stabilization_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedAeMode(vector <camera_ae_mode_t> &supportedAeModes) const
++{
++    supportedAeModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedAeModes.push_back((camera_ae_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedAwbMode(vector <camera_awb_mode_t> &supportedAwbModes) const
++{
++    supportedAwbModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_AVAILABLE_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedAwbModes.push_back((camera_awb_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedAfMode(vector <camera_af_mode_t> &supportedAfModes) const
++{
++    supportedAfModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_AVAILABLE_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedAfModes.push_back((camera_af_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedSceneMode(vector <camera_scene_mode_t> &supportedSceneModes) const
++{
++    supportedSceneModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedSceneModes.push_back((camera_scene_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedAntibandingMode(vector <camera_antibanding_mode_t> &supportedAntibindingModes) const
++{
++    supportedAntibindingModes.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_ANTIBANDING_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        supportedAntibindingModes.push_back((camera_antibanding_mode_t)entry.data.u8[i]);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedFpsRange(camera_range_array_t& ranges) const
++{
++    ranges.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES);
++    if (entry.count == 0 || entry.count % 2 != 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    camera_range_t fps;
++    for (size_t i = 0; i < entry.count; i += 2) {
++        fps.min = entry.data.f[i];
++        fps.max = entry.data.f[i + 1];
++        ranges.push_back(fps);
++    }
++
++    return OK;
++}
++
++int Parameters::getSupportedStreamConfig(stream_array_t& config) const
++{
++    config.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AVAILABLE_CONFIGURATIONS);
++    const int streamConfMemberNum = sizeof(stream_t) / sizeof(int);
++    if (entry.count == 0 || entry.count % streamConfMemberNum != 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    stream_t cfg;
++    CLEAR(cfg);
++
++    for (size_t i = 0; i < entry.count; i += streamConfMemberNum) {
++        MEMCPY_S(&cfg, sizeof(stream_t), &entry.data.i32[i], sizeof(stream_t));
++        cfg.stride = CameraUtils::getStride(cfg.format, cfg.width);
++        cfg.size   = CameraUtils::getFrameSize(cfg.format, cfg.width, cfg.height);
++        config.push_back(cfg);
++    }
++    return OK;
++}
++
++int Parameters::getSupportedSensorExposureTimeRange(camera_range_t& range) const
++{
++    CLEAR(range);
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE);
++    if (entry.count != 2) {
++        return NAME_NOT_FOUND;
++    }
++
++    range.min = (float)(entry.data.i64[0]);
++    range.max = (float)(entry.data.i64[1]);
++    return OK;
++}
++
++int Parameters::getSupportedSensorSensitivityRange(camera_range_t& range) const
++{
++    CLEAR(range);
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_SENSITIVITY_RANGE);
++    if (entry.count != 2) {
++        return NAME_NOT_FOUND;
++    }
++
++    range.min = entry.data.i32[0];
++    range.max = entry.data.i32[1];
++    return OK;
++}
++
++int Parameters::getSupportedFeatures(camera_features_list_t& features) const
++{
++    features.clear();
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AVAILABLE_FEATURES);
++    for (size_t i = 0; i < entry.count; i++) {
++        features.push_back((camera_features)entry.data.u8[i]);
++    }
++    return OK;
++}
++
++int Parameters::getAeCompensationRange(camera_range_t& evRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_RANGE);
++    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
++    if (entry.count != ELEM_NUM) {
++        return NAME_NOT_FOUND;
++    }
++
++    evRange.min = entry.data.i32[0];
++    evRange.max = entry.data.i32[1];
++    return OK;
++}
++
++int Parameters::getAeCompensationStep(camera_rational_t& evStep) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_STEP);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    evStep.numerator = entry.data.r[0].numerator;
++    evStep.denominator = entry.data.r[0].denominator;
++    return OK;
++}
++
++int Parameters::getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t> & etRanges) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++
++    const int MEMBER_COUNT = 3;
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_EXPOSURE_TIME_RANGE);
++    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    camera_ae_exposure_time_range_t range;
++    CLEAR(range);
++
++    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
++        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
++        range.et_range.min = entry.data.i32[i + 1];
++        range.et_range.max = entry.data.i32[i + 2];
++        etRanges.push_back(range);
++    }
++    return OK;
++}
++
++int Parameters::getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++
++    const int MEMBER_COUNT = 3;
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_GAIN_RANGE);
++    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    camera_ae_gain_range_t range;
++    CLEAR(range);
++
++    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
++        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
++        // Since we use int to store float, before storing it we multiply min and max by 100,
++        // so we need to divide 100 when giving them outside.
++        range.gain_range.min = (float)entry.data.i32[i + 1] / 100.0;
++        range.gain_range.max = (float)entry.data.i32[i + 2] / 100.0;
++        gainRanges.push_back(range);
++    }
++    return OK;
++}
++
++bool Parameters::getAeLockAvailable() const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK_AVAILABLE);
++    if (entry.count != 1) {
++        return false;
++    }
++
++    return (entry.data.u8[0] == CAMERA_AE_LOCK_AVAILABLE_TRUE);
++}
++
++bool Parameters::getAwbLockAvailable() const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK_AVAILABLE);
++    if (entry.count != 1) {
++        return false;
++    }
++
++    return (entry.data.u8[0] == CAMERA_AWB_LOCK_AVAILABLE_TRUE);
++}
++
++int Parameters::setExposureTimeRange(camera_range_t exposureTimeRange)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    const int MEMBER_COUNT = 2;
++    int values[MEMBER_COUNT] = {(int)exposureTimeRange.min, (int)exposureTimeRange.max};
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_EXPOSURE_TIME_RANGE, values, MEMBER_COUNT);
++}
++
++int Parameters::getExposureTimeRange(camera_range_t& exposureTimeRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++
++    const int MEMBER_COUNT = 2;
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_EXPOSURE_TIME_RANGE);
++    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
++        return NAME_NOT_FOUND;
++    }
++
++    exposureTimeRange.min = entry.data.i32[0];
++    exposureTimeRange.max = entry.data.i32[1];
++    return OK;
++}
++
++int Parameters::setSensitivityGainRange(camera_range_t sensitivityGainRange)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    float values[] = {sensitivityGainRange.min, sensitivityGainRange.max};
++
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN_RANGE, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getSensitivityGainRange(camera_range_t& sensitivityGainRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++
++    const int MEMBER_COUNT = 2;
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN_RANGE);
++    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
++        return NAME_NOT_FOUND;
++    }
++
++    sensitivityGainRange.min = entry.data.f[0];
++    sensitivityGainRange.max = entry.data.f[1];
++    return OK;
++}
++
++int Parameters::setAeConvergeSpeed(camera_converge_speed_t speed)
++{
++    uint8_t aeSpeed = speed;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED, &aeSpeed, 1);
++}
++
++int Parameters::getAeConvergeSpeed(camera_converge_speed_t& speed) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    speed = (camera_converge_speed_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbConvergeSpeed(camera_converge_speed_t speed)
++{
++    uint8_t awbSpeed = speed;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED, &awbSpeed, 1);
++}
++
++int Parameters::getAwbConvergeSpeed(camera_converge_speed_t& speed) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    speed = (camera_converge_speed_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAeConvergeSpeedMode(camera_converge_speed_mode_t mode)
++{
++    uint8_t speedMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED_MODE, &speedMode, 1);
++}
++
++int Parameters::getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode)
++{
++    uint8_t speedMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED_MODE, &speedMode, 1);
++}
++
++int Parameters::getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setMakernoteData(const void* data, unsigned int size)
++{
++    CheckError(!data || size == 0, BAD_VALUE, "%s, invalid parameters", __func__);
++    ParameterHelper::AutoWLock wl(mData);
++
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_DATA, (uint8_t*)data, size);
++}
++
++int Parameters::getMakernoteData(void* data, unsigned int* size) const
++{
++    CheckError(!data || !size, BAD_VALUE, "%s, invalid parameters", __func__);
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_DATA);
++    if (entry.count > 0) {
++        MEMCPY_S(data, *size, entry.data.u8, entry.count);
++        *size = entry.count;
++    } else {
++        return NAME_NOT_FOUND;
++    }
++
++    return OK;
++}
++
++int Parameters::setCustomAicParam(const void* data, unsigned int length)
++{
++    CheckError(!data, BAD_VALUE, "%s, invalid parameters", __func__);
++    ParameterHelper::AutoWLock wl(mData);
++
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_CUSTOM_AIC_PARAM, (uint8_t*)data, length);
++}
++
++int Parameters::getCustomAicParam(void* data, unsigned int* length) const
++{
++    CheckError(!data || !length, BAD_VALUE, "%s, invalid parameters", __func__);
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_CUSTOM_AIC_PARAM);
++    if (entry.count > 0) {
++        MEMCPY_S(data, *length, entry.data.u8, entry.count);
++        *length = entry.count;
++    } else {
++        return NAME_NOT_FOUND;
++    }
++
++    return OK;
++}
++
++int Parameters::setMakernoteMode(camera_makernote_mode_t mode)
++{
++    uint8_t mknMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_MODE, &mknMode, 1);
++}
++
++int Parameters::getMakernoteMode(camera_makernote_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    mode = (camera_makernote_mode_t)entry.data.u8[0];
++
++    return OK;
++}
++
++int Parameters::setDigitalZoomRatio(float ratio)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DIGITAL_ZOOM_RATIO, &ratio, 1);
++}
++
++int Parameters::getDigitalZoomRatio(float& ratio) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DIGITAL_ZOOM_RATIO);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    ratio = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setLdcMode(camera_ldc_mode_t mode)
++{
++    uint8_t ldcMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_LDC_MODE, &ldcMode, 1);
++}
++
++int Parameters::getLdcMode(camera_ldc_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_LDC_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_ldc_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setRscMode(camera_rsc_mode_t mode)
++{
++    uint8_t rscMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RSC_MODE, &rscMode, 1);
++}
++
++int Parameters::getRscMode(camera_rsc_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RSC_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_rsc_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setFlipMode(camera_flip_mode_t mode)
++{
++    uint8_t flipMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FLIP_MODE, &flipMode, 1);
++}
++
++int Parameters::getFlipMode(camera_flip_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FLIP_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_flip_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setMonoDsMode(camera_mono_downscale_mode_t mode)
++{
++    uint8_t monoDsMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MONO_DOWNSCALE, &monoDsMode, 1);
++}
++
++int Parameters::getMonoDsMode(camera_mono_downscale_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MONO_DOWNSCALE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_mono_downscale_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setRun3ACadence(int cadence)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RUN3_A_CADENCE, &cadence, 1);
++}
++
++int Parameters::getRun3ACadence(int &cadence) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RUN3_A_CADENCE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    cadence = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t mode)
++{
++    uint8_t dewarpingMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FISHEYE_DEWARPING_MODE, &dewarpingMode, 1);
++}
++
++int Parameters::getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FISHEYE_DEWARPING_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_fisheye_dewarping_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAeDistributionPriority(camera_ae_distribution_priority_t priority)
++{
++    uint8_t distributionPriority = priority;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY, &distributionPriority, 1);
++}
++
++int Parameters::getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    priority = (camera_ae_distribution_priority_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange)
++{
++    uint8_t mode = colorRange;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_YUV_COLOR_RANGE, &mode, 1);
++}
++
++int Parameters::getYuvColorRangeMode(camera_yuv_color_range_mode_t& colorRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_YUV_COLOR_RANGE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    colorRange = (camera_yuv_color_range_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setJpegQuality(uint8_t quality)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_QUALITY, &quality, 1);
++}
++
++int Parameters::getJpegQuality(uint8_t *quality) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_QUALITY);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    *quality = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setJpegThumbnailQuality(uint8_t quality)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_QUALITY, &quality, 1);
++}
++
++int Parameters::getJpegThumbnailQuality(uint8_t *quality) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_QUALITY);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    *quality = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setJpegThumbnailSize(const camera_resolution_t& res)
++{
++    int size[2] = {res.width, res.height};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_SIZE, size, 2);
++}
++
++int Parameters::getJpegThumbnailSize(camera_resolution_t& res) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_SIZE);
++    if (entry.count != 2) {
++        return NAME_NOT_FOUND;
++    }
++    res.width  = entry.data.i32[0];
++    res.height = entry.data.i32[1];
++    return OK;
++}
++
++int Parameters::setJpegRotation(int rotation)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_ORIENTATION, &rotation, 1);
++}
++
++int Parameters::getJpegRotation(int &rotation) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_ORIENTATION);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    rotation = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setJpegGpsCoordinates(const double *coordinates)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_COORDINATES, coordinates, 3);
++}
++
++int Parameters::getJpegGpsLatitude(double &latitude) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
++    if (entry.count != 3) {
++        return NAME_NOT_FOUND;
++    }
++    latitude = entry.data.d[0];
++    return OK;
++}
++
++int Parameters::getJpegGpsLongitude(double &longitude) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
++    if (entry.count != 3) {
++        return NAME_NOT_FOUND;
++    }
++    longitude = entry.data.d[1];
++    return OK;
++}
++
++int Parameters::getJpegGpsAltitude(double &altitude) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
++    if (entry.count != 3) {
++        return NAME_NOT_FOUND;
++    }
++    altitude = entry.data.d[2];
++    return OK;
++}
++
++int Parameters::setJpegGpsTimeStamp(int64_t  timestamp)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_TIMESTAMP, &timestamp, 1);
++}
++
++int Parameters::getJpegGpsTimeStamp(int64_t &timestamp) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_TIMESTAMP);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    timestamp = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setJpegGpsProcessingMethod(int processMethod)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, &processMethod, 1);
++}
++
++int Parameters::getJpegGpsProcessingMethod(int &processMethod) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    processMethod = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setJpegGpsProcessingMethod(const char* processMethod)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, (const uint8_t*)processMethod, strlen(processMethod) + 1);
++}
++
++int Parameters::getJpegGpsProcessingMethod(int size, char* processMethod) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
++    if (entry.count <= 0) {
++        return NAME_NOT_FOUND;
++    }
++    MEMCPY_S(processMethod, size, entry.data.u8, entry.count);
++    return OK;
++}
++
++int Parameters::setImageEffect(camera_effect_mode_t  effect)
++{
++    uint8_t effectmode = effect;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_EFFECT_MODE, &effectmode, 1);
++}
++
++int Parameters::getImageEffect(camera_effect_mode_t &effect) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_EFFECT_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    effect = (camera_effect_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setVideoStabilizationMode(camera_video_stabilization_mode_t mode)
++{
++    uint8_t dvsMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_VIDEO_STABILIZATION_MODE, &dvsMode, 1);
++}
++
++int Parameters::getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_VIDEO_STABILIZATION_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_video_stabilization_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::getFocalLength(float &focal) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCAL_LENGTH);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    focal = (float)entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setFocalLength(float focal)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCAL_LENGTH, &focal, 1);
++}
++
++int Parameters::getAperture(float &aperture) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_APERTURE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    aperture = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setAperture(float aperture)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_APERTURE, &aperture, 1);
++}
++
++int Parameters::getFocusDistance(float &distance) const {
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_DISTANCE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    distance = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::setFocusDistance(float distance) {
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_DISTANCE, &distance, 1);
++}
++
++int Parameters::setFocusRange(const camera_range_t &focusRange)
++{
++    float range[] = {focusRange.min, focusRange.max};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_RANGE,
++                                                      range, ARRAY_SIZE(range));
++}
++
++int Parameters::getFocusRange(camera_range_t& focusRange) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_RANGE);
++    if (entry.count != (sizeof(camera_range_t) / sizeof(float))) {
++        return NAME_NOT_FOUND;
++    }
++    focusRange.min = entry.data.f[0];
++    focusRange.max = entry.data.f[1];
++    return OK;
++}
++
++int Parameters::setAfMode(camera_af_mode_t afMode)
++{
++    uint8_t mode = afMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_MODE, &mode, 1);
++}
++
++int Parameters::getAfMode(camera_af_mode_t& afMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    afMode = (camera_af_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAfTrigger(camera_af_trigger_t afTrigger)
++{
++    uint8_t trigger = afTrigger;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_TRIGGER, &trigger, 1);
++}
++
++int Parameters::getAfTrigger(camera_af_trigger_t& afTrigger) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_TRIGGER);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    afTrigger = (camera_af_trigger_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setAfRegions(camera_window_list_t afRegions)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return setRegions(ParameterHelper::getMetadata(mData), afRegions, CAMERA_AF_REGIONS);
++}
++
++int Parameters::getAfRegions(camera_window_list_t& afRegions) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AF_REGIONS), afRegions);
++}
++
++int Parameters::setAfState(camera_af_state_t afState)
++{
++    uint8_t state = afState;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_STATE, &state, 1);
++}
++
++int Parameters::getAfState(camera_af_state_t& afState) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_STATE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    afState = (camera_af_state_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setLensState(bool lensMoving)
++{
++    uint8_t state = (lensMoving) ? 1 : 0;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_STATE, &state, 1);
++}
++
++int Parameters::getLensState(bool& lensMoving) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_STATE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    lensMoving = (entry.data.u8[0] > 0);
++    return OK;
++}
++
++int Parameters::getLensAperture(float &aperture) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_AVAILABLE_APERTURES);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    aperture = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::getLensFilterDensity(float &filterDensity) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData,
++                                                   CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    filterDensity = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::getLensMinFocusDistance(float &minFocusDistance) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    minFocusDistance = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::getLensHyperfocalDistance(float &hyperfocalDistance) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    hyperfocalDistance = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::getSensorMountType(camera_mount_type_t& sensorMountType) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_SENSOR_MOUNT_TYPE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    sensorMountType = (camera_mount_type_t)entry.data.u8[0];
++    return OK;
++}
++
++// User can set envrionment and then call api to update the debug level.
++int Parameters::updateDebugLevel()
++{
++    Log::setDebugLevel();
++    CameraDump::setDumpLevel();
++    return OK;
++}
++
++int Parameters::setTestPatternMode(camera_test_pattern_mode_t mode)
++{
++    int32_t testPatterMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_TEST_PATTERN_MODE, &testPatterMode, 1);
++}
++
++int Parameters::getTestPatternMode(camera_test_pattern_mode_t& mode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_TEST_PATTERN_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_test_pattern_mode_t)entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setCropRegion(camera_crop_region_t cropRegion)
++{
++    int values[] = {cropRegion.flag, cropRegion.x, cropRegion.y};
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_SCALER_CROP_REGION, values, ARRAY_SIZE(values));
++}
++
++int Parameters::getCropRegion(camera_crop_region_t& cropRegion) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SCALER_CROP_REGION);
++    if (entry.count <= 0) {
++        return NAME_NOT_FOUND;
++    }
++    cropRegion.flag = entry.data.i32[0];
++    cropRegion.x = entry.data.i32[1];
++    cropRegion.y = entry.data.i32[2];
++    return OK;
++}
++
++int Parameters::setControlSceneMode(uint8_t sceneModeValue)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_SCENE_MODE, &sceneModeValue, 1);
++}
++
++int Parameters::setFaceDetectMode(uint8_t faceDetectMode)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1);
++}
++
++int Parameters::getFaceDetectMode(uint8_t& faceDetectMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_FACE_DETECT_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    faceDetectMode = entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setFaceIds(int *faceIds, int faceNum)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_IDS, faceIds, faceNum);
++}
++
++int Parameters::getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
++    if (entry.count <= 0) {
++        return NAME_NOT_FOUND;
++    }
++    arraySize.left = entry.data.i32[0];
++    arraySize.top = entry.data.i32[1];
++    arraySize.right = arraySize.left + entry.data.i32[2]; //width
++    arraySize.bottom = arraySize.top + entry.data.i32[3]; //height
++    return OK;
++}
++
++int Parameters::setShadingMode(camera_shading_mode_t shadingMode)
++{
++    uint8_t mode = shadingMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_SHADING_MODE, &mode, 1);
++}
++
++int Parameters::getShadingMode(camera_shading_mode_t& shadingMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SHADING_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    shadingMode = (camera_shading_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode)
++{
++    uint8_t mode = lensShadingMapMode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,
++                                                      &mode, 1);
++}
++
++int Parameters::getLensShadingMapMode(
++                                  camera_lens_shading_map_mode_type_t &lensShadingMapMode) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    lensShadingMapMode = (camera_lens_shading_map_mode_type_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP,
++                                                      lensShadingMap, lensShadingMapSize);
++}
++
++int Parameters::getLensShadingMap(float **lensShadingMap, size_t &lensShadingMapSize) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP);
++
++    camera_coordinate_t shadingMapSize;
++    getLensInfoShadingMapSize(shadingMapSize);
++    const size_t lsmSize = shadingMapSize.x * shadingMapSize.y * 4;
++    if (entry.count < lsmSize || !entry.data.f || !lensShadingMap) {
++        return NAME_NOT_FOUND;
++    }
++
++    *lensShadingMap = const_cast<float*>(entry.data.f);
++    lensShadingMapSize = lsmSize;
++    return OK;
++}
++
++int Parameters::getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_SHADING_MAP_SIZE);
++    if (entry.count <= 0) {
++        return NAME_NOT_FOUND;
++    }
++
++    shadingMapSize.x = entry.data.i32[0];  // width
++    shadingMapSize.y = entry.data.i32[1];  // height
++    return OK;
++}
++
++int Parameters::setTonemapMode(camera_tonemap_mode_t mode) {
++    uint8_t tMode = mode;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_MODE, &tMode, 1);
++}
++
++int Parameters::getTonemapMode(camera_tonemap_mode_t& mode) const {
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MODE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    mode = (camera_tonemap_mode_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::getSupportedTonemapMode(vector<camera_tonemap_mode_t>& tonemapModes) const {
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES);
++    for (size_t i = 0; i < entry.count; i++) {
++        tonemapModes.push_back((camera_tonemap_mode_t)entry.data.u8[i]);
++    }
++    return OK;
++}
++
++int Parameters::setTonemapPresetCurve(camera_tonemap_preset_curve_t type) {
++    uint8_t cType = type;
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_PRESET_CURVE, &cType, 1);
++}
++
++int Parameters::getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const {
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_PRESET_CURVE);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    type = (camera_tonemap_preset_curve_t)entry.data.u8[0];
++    return OK;
++}
++
++int Parameters::setTonemapGamma(float gamma) {
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_GAMMA, &gamma, 1);
++}
++
++int Parameters::getTonemapGamma(float& gamma) const {
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_GAMMA);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    gamma = entry.data.f[0];
++    return OK;
++}
++
++int Parameters::getTonemapMaxCurvePoints(int32_t& number) const {
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MAX_CURVE_POINTS);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    number = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setTonemapCurves(const camera_tonemap_curves_t& curves) {
++    ParameterHelper::AutoWLock wl(mData);
++    int ret = ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_RED,
++                                                         curves.rCurve, curves.rSize);
++    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_BLUE,
++                                                      curves.bCurve, curves.bSize);
++    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_GREEN,
++                                                      curves.gCurve, curves.gSize);
++    return ret;
++}
++
++int Parameters::getTonemapCurves(camera_tonemap_curves_t& curves) const {
++    curves.rSize = 0;
++    curves.bSize = 0;
++    curves.gSize = 0;
++
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_RED);
++    if (entry.count > 0) {
++        curves.rSize = entry.count;
++        curves.rCurve = entry.data.f;
++    }
++    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_BLUE);
++    if (entry.count > 0) {
++        curves.bSize = entry.count;
++        curves.bCurve = entry.data.f;
++    }
++    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_GREEN);
++    if (entry.count > 0) {
++        curves.gSize = entry.count;
++        curves.gCurve = entry.data.f;
++    }
++    return (curves.rSize && curves.bSize && curves.gSize) ? OK : NAME_NOT_FOUND;
++}
++
++int Parameters::setUserRequestId(int32_t userRequestId) {
++    ParameterHelper::AutoWLock wl(mData);
++
++    return ParameterHelper::getMetadata(mData).update(CAMERA_REQUEST_ID, &userRequestId, 1);
++}
++
++int Parameters::getUserRequestId(int32_t& userRequestId) const {
++    ParameterHelper::AutoRLock rl(mData);
++
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_REQUEST_ID);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++
++    userRequestId = entry.data.i32[0];
++    return OK;
++}
++
++int Parameters::setCaptureIntent(uint8_t captureIntent)
++{
++    ParameterHelper::AutoWLock wl(mData);
++    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_CAPTUREINTENT,
++                                                      &captureIntent, 1);
++}
++
++int Parameters::getCaptureIntent(uint8_t& captureIntent) const
++{
++    ParameterHelper::AutoRLock rl(mData);
++    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_CAPTUREINTENT);
++    if (entry.count != 1) {
++        return NAME_NOT_FOUND;
++    }
++    captureIntent = entry.data.u8[0];
++    return OK;
++}
++
++} // end of namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
+new file mode 100644
+index 000000000000..52ffd86ded71
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
+@@ -0,0 +1,976 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "camera_metadata"
++
++#include <inttypes.h>
++#include "icamera_metadata_base.h"
++#include "iutils/Utils.h"
++#include <assert.h>
++#include <stdlib.h>
++#include <errno.h>
++
++// TODO need to find out the correct print function
++#include <stdio.h>
++#define ALOGE printf
++
++#define OK         0
++#define ERROR      1
++#define NOT_FOUND (-ENOENT)
++
++/**
++ * A single metadata entry, storing an array of values of a given type. If the
++ * array is no larger than 4 bytes in size, it is stored in the data.value[]
++ * array; otherwise, it can found in the parent's data array at index
++ * data.offset.
++ */
++#define ENTRY_ALIGNMENT ((size_t) 4)
++typedef struct camera_metadata_buffer_entry {
++    uint32_t tag;
++    uint32_t count;
++    union {
++        uint32_t offset;
++        uint8_t  value[4];
++    } data;
++    uint8_t  type;
++    uint8_t  reserved[3];
++} camera_metadata_buffer_entry_t;
++
++typedef uint32_t metadata_uptrdiff_t;
++typedef uint32_t metadata_size_t;
++
++/**
++ * A packet of metadata. This is a list of entries, each of which may point to
++ * its values stored at an offset in data.
++ *
++ * It is assumed by the utility functions that the memory layout of the packet
++ * is as follows:
++ *
++ *   |-----------------------------------------------|
++ *   | icamera_metadata_t                             |
++ *   |                                               |
++ *   |-----------------------------------------------|
++ *   | reserved for future expansion                 |
++ *   |-----------------------------------------------|
++ *   | camera_metadata_buffer_entry_t #0             |
++ *   |-----------------------------------------------|
++ *   | ....                                          |
++ *   |-----------------------------------------------|
++ *   | camera_metadata_buffer_entry_t #entry_count-1 |
++ *   |-----------------------------------------------|
++ *   | free space for                                |
++ *   | (entry_capacity-entry_count) entries          |
++ *   |-----------------------------------------------|
++ *   | start of camera_metadata.data                 |
++ *   |                                               |
++ *   |-----------------------------------------------|
++ *   | free space for                                |
++ *   | (data_capacity-data_count) bytes              |
++ *   |-----------------------------------------------|
++ *
++ * With the total length of the whole packet being camera_metadata.size bytes.
++ *
++ * In short, the entries and data are contiguous in memory after the metadata
++ * header.
++ */
++#define METADATA_ALIGNMENT ((size_t) 4)
++struct icamera_metadata {
++    metadata_size_t          size;
++    uint32_t                 version;
++    uint32_t                 flags;
++    metadata_size_t          entry_count;
++    metadata_size_t          entry_capacity;
++    metadata_uptrdiff_t      entries_start; // Offset from camera_metadata
++    metadata_size_t          data_count;
++    metadata_size_t          data_capacity;
++    metadata_uptrdiff_t      data_start; // Offset from camera_metadata
++    uint8_t                  reserved[];
++};
++
++/**
++ * A datum of metadata. This corresponds to icamera_metadata_entry_t::data
++ * with the difference that each element is not a pointer. We need to have a
++ * non-pointer type description in order to figure out the largest alignment
++ * requirement for data (DATA_ALIGNMENT).
++ */
++#define DATA_ALIGNMENT ((size_t) 8)
++typedef union camera_metadata_data {
++    uint8_t u8;
++    int32_t i32;
++    float   f;
++    int64_t i64;
++    double  d;
++    icamera_metadata_rational_t r;
++} camera_metadata_data_t;
++
++/**
++ * The preferred alignment of a packet of camera metadata. In general,
++ * this is the lowest common multiple of the constituents of a metadata
++ * package, i.e, of DATA_ALIGNMENT and ENTRY_ALIGNMENT.
++ */
++#define MAX_ALIGNMENT(A, B) (((A) > (B)) ? (A) : (B))
++#define METADATA_PACKET_ALIGNMENT \
++    MAX_ALIGNMENT(MAX_ALIGNMENT(DATA_ALIGNMENT, METADATA_ALIGNMENT), ENTRY_ALIGNMENT);
++
++/** Versioning information */
++#define CURRENT_METADATA_VERSION 1
++
++/** Flag definitions */
++#define FLAG_SORTED 0x00000001
++
++/** Tag information */
++
++typedef struct tag_info {
++    const char *tag_name;
++    uint8_t     tag_type;
++} tag_info_t;
++
++#include "icamera_metadata_tag_info.c"
++
++const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES] = {
++    sizeof(uint8_t),                    // ICAMERA_TYPE_BYTE
++    sizeof(int32_t),                    // ICAMERA_TYPE_INT32
++    sizeof(float),                      // ICAMERA_TYPE_FLOAT
++    sizeof(int64_t),                    // ICAMERA_TYPE_INT64
++    sizeof(double),                     // ICAMERA_TYPE_DOUBLE
++    sizeof(icamera_metadata_rational_t) // ICAMERA_TYPE_RATIONAL
++};
++
++const char *icamera_metadata_type_names[ICAMERA_NUM_TYPES] = {
++    "byte",                             // ICAMERA_TYPE_BYTE
++    "int32",                            // ICAMERA_TYPE_INT32
++    "float",                            // ICAMERA_TYPE_FLOAT
++    "int64",                            // ICAMERA_TYPE_INT64
++    "double",                           // ICAMERA_TYPE_DOUBLE
++    "rational"                          // ICAMERA_TYPE_RATIONAL
++};
++
++static camera_metadata_buffer_entry_t *get_entries(
++        const icamera_metadata_t *metadata) {
++    return (camera_metadata_buffer_entry_t*)
++            ((uint8_t*)metadata + metadata->entries_start);
++}
++
++static uint8_t *get_data(const icamera_metadata_t *metadata) {
++    return (uint8_t*)metadata + metadata->data_start;
++}
++
++size_t get_icamera_metadata_alignment() {
++    return METADATA_PACKET_ALIGNMENT;
++}
++
++icamera_metadata_t *allocate_copy_icamera_metadata_checked(
++        const icamera_metadata_t *src,
++        size_t src_size) {
++
++    if (src == NULL) {
++        return NULL;
++    }
++
++    void *buffer = malloc(src_size);
++    MEMCPY_S(buffer, src_size, src, src_size);
++
++    icamera_metadata_t *metadata = (icamera_metadata_t*) buffer;
++    if (validate_icamera_metadata_structure(metadata, &src_size) != OK) {
++        free(buffer);
++        return NULL;
++    }
++
++    return metadata;
++}
++
++icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
++                                              size_t data_capacity) {
++
++    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
++                                                          data_capacity);
++    void *buffer = malloc(memory_needed);
++    return place_icamera_metadata(buffer, memory_needed,
++                                 entry_capacity,
++                                 data_capacity);
++}
++
++icamera_metadata_t *place_icamera_metadata(void *dst,
++                                           size_t dst_size,
++                                           size_t entry_capacity,
++                                           size_t data_capacity) {
++    if (dst == NULL) return NULL;
++
++    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
++                                                          data_capacity);
++    if (memory_needed > dst_size) return NULL;
++
++    icamera_metadata_t *metadata = (icamera_metadata_t*)dst;
++    metadata->version = CURRENT_METADATA_VERSION;
++    metadata->flags = 0;
++    metadata->entry_count = 0;
++    metadata->entry_capacity = entry_capacity;
++    metadata->entries_start =
++            ALIGN_TO(sizeof(icamera_metadata_t), ENTRY_ALIGNMENT);
++    metadata->data_count = 0;
++    metadata->data_capacity = data_capacity;
++    metadata->size = memory_needed;
++    size_t data_unaligned = (uint8_t*)(get_entries(metadata) +
++            metadata->entry_capacity) - (uint8_t*)metadata;
++    metadata->data_start = ALIGN_TO(data_unaligned, DATA_ALIGNMENT);
++
++    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
++    return metadata;
++}
++void free_icamera_metadata(icamera_metadata_t *metadata) {
++    free(metadata);
++}
++
++size_t calculate_icamera_metadata_size(size_t entry_count,
++                                       size_t data_count) {
++    size_t memory_needed = sizeof(icamera_metadata_t);
++    // Start entry list at aligned boundary
++    memory_needed = ALIGN_TO(memory_needed, ENTRY_ALIGNMENT);
++    memory_needed += sizeof(camera_metadata_buffer_entry_t[entry_count]);
++    // Start buffer list at aligned boundary
++    memory_needed = ALIGN_TO(memory_needed, DATA_ALIGNMENT);
++    memory_needed += sizeof(uint8_t[data_count]);
++    return memory_needed;
++}
++
++size_t get_icamera_metadata_size(const icamera_metadata_t *metadata) {
++    if (metadata == NULL) return ERROR;
++
++    return metadata->size;
++}
++
++size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata) {
++    if (metadata == NULL) return ERROR;
++
++    return calculate_icamera_metadata_size(metadata->entry_count,
++                                          metadata->data_count);
++}
++
++size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata) {
++    return metadata->entry_count;
++}
++
++size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata) {
++    return metadata->entry_capacity;
++}
++
++size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata) {
++    return metadata->data_count;
++}
++
++size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata) {
++    return metadata->data_capacity;
++}
++
++icamera_metadata_t* copy_icamera_metadata(void *dst, size_t dst_size,
++        const icamera_metadata_t *src) {
++    size_t memory_needed = get_icamera_metadata_compact_size(src);
++
++    if (dst == NULL) return NULL;
++    if (dst_size < memory_needed) return NULL;
++
++    icamera_metadata_t *metadata =
++        place_icamera_metadata(dst, dst_size, src->entry_count, src->data_count);
++
++    if (metadata == NULL) {
++        ALOGE("%s: metadata is null!", __func__);
++        return NULL;
++    }
++    metadata->flags = src->flags;
++    metadata->entry_count = src->entry_count;
++    metadata->data_count = src->data_count;
++
++    MEMCPY_S(get_entries(metadata),sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]),
++             get_entries(src), sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]));
++    MEMCPY_S(get_data(metadata), sizeof(uint8_t[metadata->data_count]),
++             get_data(src), sizeof(uint8_t[metadata->data_count]));
++
++    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
++    return metadata;
++}
++
++int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
++                                        const size_t *expected_size) {
++
++    if (metadata == NULL) {
++        ALOGE("%s: metadata is null!", __func__);
++        return ERROR;
++    }
++
++    // Check that the metadata pointer is well-aligned first.
++    {
++        static const struct {
++            const char *name;
++            size_t alignment;
++        } alignments[] = {
++            {
++                .name = "icamera_metadata",
++                .alignment = METADATA_ALIGNMENT
++            },
++            {
++                .name = "camera_metadata_buffer_entry",
++                .alignment = ENTRY_ALIGNMENT
++            },
++            {
++                .name = "camera_metadata_data",
++                .alignment = DATA_ALIGNMENT
++            },
++        };
++
++        size_t i = 0;
++        for (i = 0; i < sizeof(alignments)/sizeof(alignments[0]); ++i) {
++            uintptr_t aligned_ptr = ALIGN_TO(metadata, alignments[i].alignment);
++
++            if ((uintptr_t)metadata != aligned_ptr) {
++                ALOGE("%s: Metadata pointer is not aligned (actual %p, "
++                      "expected %p) to type %s",
++                      __func__, metadata,
++                      (void*)aligned_ptr, alignments[i].name);
++                return ERROR;
++            }
++        }
++    }
++
++    /**
++     * Check that the metadata contents are correct
++     */
++
++    if (expected_size != NULL && metadata->size > *expected_size) {
++        ALOGE("%s: Metadata size (%" PRIu32 ") should be <= expected size (%zu)",
++              __func__, metadata->size, *expected_size);
++        return ERROR;
++    }
++
++    if (metadata->entry_count > metadata->entry_capacity) {
++        ALOGE("%s: Entry count (%" PRIu32 ") should be <= entry capacity "
++              "(%" PRIu32 ")",
++              __func__, metadata->entry_count, metadata->entry_capacity);
++        return ERROR;
++    }
++
++    const metadata_uptrdiff_t entries_end =
++        metadata->entries_start + metadata->entry_capacity;
++    if (entries_end < metadata->entries_start || // overflow check
++        entries_end > metadata->data_start) {
++
++        ALOGE("%s: Entry start + capacity (%" PRIu32 ") should be <= data start "
++              "(%" PRIu32 ")",
++               __func__,
++              (metadata->entries_start + metadata->entry_capacity),
++              metadata->data_start);
++        return ERROR;
++    }
++
++    const metadata_uptrdiff_t data_end =
++        metadata->data_start + metadata->data_capacity;
++    if (data_end < metadata->data_start || // overflow check
++        data_end > metadata->size) {
++
++        ALOGE("%s: Data start + capacity (%" PRIu32 ") should be <= total size "
++              "(%" PRIu32 ")",
++               __func__,
++              (metadata->data_start + metadata->data_capacity),
++              metadata->size);
++        return ERROR;
++    }
++
++    // Validate each entry
++    const metadata_size_t entry_count = metadata->entry_count;
++    camera_metadata_buffer_entry_t *entries = get_entries(metadata);
++
++    size_t i = 0;
++    for (i = 0; i < entry_count; ++i) {
++
++        if ((uintptr_t)&entries[i] != ALIGN_TO(&entries[i], ENTRY_ALIGNMENT)) {
++            ALOGE("%s: Entry index %zu had bad alignment (address %p),"
++                  " expected alignment %zu",
++                  __func__, i, &entries[i], ENTRY_ALIGNMENT);
++            return ERROR;
++        }
++
++        camera_metadata_buffer_entry_t entry = entries[i];
++
++        if (entry.type >= ICAMERA_NUM_TYPES) {
++            ALOGE("%s: Entry index %zu had a bad type %d",
++                  __func__, i, entry.type);
++            return ERROR;
++        }
++
++        int tag_type = get_icamera_metadata_tag_type(entry.tag);
++        if (tag_type != (int)entry.type) {
++            ALOGE("%s: Entry index %zu had tag type %d, but the type was %d",
++                  __func__, i, tag_type, entry.type);
++            return ERROR;
++        }
++
++        size_t data_size =
++                calculate_icamera_metadata_entry_data_size(entry.type,
++                                                          entry.count);
++
++        if (data_size != 0) {
++            camera_metadata_data_t *data =
++                    (camera_metadata_data_t*) (get_data(metadata) +
++                                               entry.data.offset);
++
++            if ((uintptr_t)data != ALIGN_TO(data, DATA_ALIGNMENT)) {
++                ALOGE("%s: Entry index %zu had bad data alignment (address %p),"
++                      " expected align %zu, (tag name %s, data size %zu)",
++                      __func__, i, data, DATA_ALIGNMENT,
++                      get_icamera_metadata_tag_name(entry.tag) ?: "unknown",
++                      data_size);
++                return ERROR;
++            }
++
++            size_t data_entry_end = entry.data.offset + data_size;
++            if (data_entry_end < entry.data.offset || // overflow check
++                data_entry_end > metadata->data_capacity) {
++
++                ALOGE("%s: Entry index %zu data ends (%zu) beyond the capacity "
++                      "%" PRIu32, __func__, i, data_entry_end,
++                      metadata->data_capacity);
++                return ERROR;
++            }
++
++        } else if (entry.count == 0) {
++            if (entry.data.offset != 0) {
++                ALOGE("%s: Entry index %zu had 0 items, but offset was non-0 "
++                     "(%" PRIu32 "), tag name: %s", __func__, i, entry.data.offset,
++                        get_icamera_metadata_tag_name(entry.tag) ?: "unknown");
++                return ERROR;
++            }
++        } // else data stored inline, so we look at value which can be anything.
++    }
++
++    return OK;
++}
++
++int append_icamera_metadata(icamera_metadata_t *dst,
++        const icamera_metadata_t *src) {
++    if (dst == NULL || src == NULL ) return ERROR;
++
++    if (dst->entry_capacity < src->entry_count + dst->entry_count) return ERROR;
++    if (dst->data_capacity < src->data_count + dst->data_count) return ERROR;
++
++    if (dst->entry_capacity - dst->entry_count < src->entry_count) {
++        ALOGE("%s: Dst available buffer size for entry is smaller than src needed.", __func__);
++    }
++    MEMCPY_S(get_entries(dst) + dst->entry_count,
++             sizeof(camera_metadata_buffer_entry_t) * (dst->entry_capacity - dst->entry_count),
++             get_entries(src), sizeof(camera_metadata_buffer_entry_t[src->entry_count]));
++
++    if (dst->data_capacity - dst->data_count < src->data_count) {
++        ALOGE("%s: Dst available buffer size for data is smaller than src needed.", __func__);
++    }
++    MEMCPY_S(get_data(dst) + dst->data_count, sizeof(uint8_t[dst->data_capacity - dst->data_count]),
++             get_data(src), sizeof(uint8_t[src->data_count]));
++    if (dst->data_count != 0) {
++        camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
++        size_t i = 0;
++        for (i = 0; i < src->entry_count; i++, entry++) {
++            if ( calculate_icamera_metadata_entry_data_size(entry->type,
++                            entry->count) > 0 ) {
++                entry->data.offset += dst->data_count;
++            }
++        }
++    }
++    if (dst->entry_count == 0) {
++        // Appending onto empty buffer, keep sorted state
++        dst->flags |= src->flags & FLAG_SORTED;
++    } else if (src->entry_count != 0) {
++        // Both src, dst are nonempty, cannot assume sort remains
++        dst->flags &= ~FLAG_SORTED;
++    } else {
++        // Src is empty, keep dst sorted state
++    }
++    dst->entry_count += src->entry_count;
++    dst->data_count += src->data_count;
++
++    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
++    return OK;
++}
++
++icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src) {
++    if (src == NULL) return NULL;
++    icamera_metadata_t *clone = allocate_icamera_metadata(
++        get_icamera_metadata_entry_count(src),
++        get_icamera_metadata_data_count(src));
++    if (clone != NULL) {
++        int res = append_icamera_metadata(clone, src);
++        if (res != OK) {
++            free_icamera_metadata(clone);
++            clone = NULL;
++        }
++    }
++    assert(validate_icamera_metadata_structure(clone, NULL) == OK);
++    return clone;
++}
++
++size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
++        size_t data_count) {
++    if (type >= ICAMERA_NUM_TYPES) return 0;
++    size_t data_bytes = data_count *
++            icamera_metadata_type_size[type];
++    return data_bytes <= 4 ? 0 : ALIGN_TO(data_bytes, DATA_ALIGNMENT);
++}
++
++static int add_camera_metadata_entry_raw(icamera_metadata_t *dst,
++        uint32_t tag,
++        uint8_t  type,
++        const void *data,
++        size_t data_count) {
++
++    if (dst == NULL) return ERROR;
++    if (dst->entry_count == dst->entry_capacity) return ERROR;
++    if (data == NULL) return ERROR;
++
++    size_t data_bytes =
++            calculate_icamera_metadata_entry_data_size(type, data_count);
++    if (data_bytes + dst->data_count > dst->data_capacity) return ERROR;
++
++    if (type >= ICAMERA_NUM_TYPES) {
++        ALOGE("%s: Bad type %d", __func__, type);
++        return ERROR;
++    }
++    size_t data_payload_bytes =
++            data_count * icamera_metadata_type_size[type];
++    camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
++    memset(entry, 0, sizeof(camera_metadata_buffer_entry_t));
++    entry->tag = tag;
++    entry->type = type;
++    entry->count = data_count;
++
++    if (data_bytes == 0) {
++        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
++    } else {
++        entry->data.offset = dst->data_count;
++        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
++        dst->data_count += data_bytes;
++    }
++    dst->entry_count++;
++    dst->flags &= ~FLAG_SORTED;
++    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
++    return OK;
++}
++
++int add_icamera_metadata_entry(icamera_metadata_t *dst,
++        uint32_t tag,
++        const void *data,
++        size_t data_count) {
++
++    int type = get_icamera_metadata_tag_type(tag);
++    if (type == -1) {
++        ALOGE("%s: Unknown tag %04x.", __func__, tag);
++        return ERROR;
++    }
++
++    return add_camera_metadata_entry_raw(dst,
++            tag,
++            type,
++            data,
++            data_count);
++}
++
++static int compare_entry_tags(const void *p1, const void *p2) {
++    uint32_t tag1 = ((camera_metadata_buffer_entry_t*)p1)->tag;
++    uint32_t tag2 = ((camera_metadata_buffer_entry_t*)p2)->tag;
++    return  tag1 < tag2 ? -1 :
++            tag1 == tag2 ? 0 :
++            1;
++}
++
++int sort_icamera_metadata(icamera_metadata_t *dst) {
++    if (dst == NULL) return ERROR;
++    if (dst->flags & FLAG_SORTED) return OK;
++
++    qsort(get_entries(dst), dst->entry_count,
++            sizeof(camera_metadata_buffer_entry_t),
++            compare_entry_tags);
++    dst->flags |= FLAG_SORTED;
++
++    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
++    return OK;
++}
++
++int get_icamera_metadata_entry(icamera_metadata_t *src,
++        size_t index,
++        icamera_metadata_entry_t *entry) {
++    if (src == NULL || entry == NULL) return ERROR;
++    if (index >= src->entry_count) return ERROR;
++
++    camera_metadata_buffer_entry_t *buffer_entry = get_entries(src) + index;
++
++    entry->index = index;
++    entry->tag = buffer_entry->tag;
++    entry->type = buffer_entry->type;
++    entry->count = buffer_entry->count;
++    if (buffer_entry->count *
++            icamera_metadata_type_size[buffer_entry->type] > 4) {
++        entry->data.u8 = get_data(src) + buffer_entry->data.offset;
++    } else {
++        entry->data.u8 = buffer_entry->data.value;
++    }
++    return OK;
++}
++
++int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
++        size_t index,
++        icamera_metadata_ro_entry_t *entry) {
++    return get_icamera_metadata_entry((icamera_metadata_t*)src, index,
++            (icamera_metadata_entry_t*)entry);
++}
++
++int find_icamera_metadata_entry(icamera_metadata_t *src,
++        uint32_t tag,
++        icamera_metadata_entry_t *entry) {
++    if (src == NULL) return ERROR;
++
++    uint32_t index;
++    if (src->flags & FLAG_SORTED) {
++        // Sorted entries, do a binary search
++        camera_metadata_buffer_entry_t *search_entry = NULL;
++        camera_metadata_buffer_entry_t key;
++        key.tag = tag;
++        search_entry = (camera_metadata_buffer_entry_t *)bsearch(&key,
++                get_entries(src),
++                src->entry_count,
++                sizeof(camera_metadata_buffer_entry_t),
++                compare_entry_tags);
++        if (search_entry == NULL) return NOT_FOUND;
++        index = search_entry - get_entries(src);
++    } else {
++        // Not sorted, linear search
++        camera_metadata_buffer_entry_t *search_entry = get_entries(src);
++        for (index = 0; index < src->entry_count; index++, search_entry++) {
++            if (search_entry->tag == tag) {
++                break;
++            }
++        }
++        if (index == src->entry_count) return NOT_FOUND;
++    }
++
++    return get_icamera_metadata_entry(src, index,
++            entry);
++}
++
++int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
++        uint32_t tag,
++        icamera_metadata_ro_entry_t *entry) {
++    return find_icamera_metadata_entry((icamera_metadata_t*)src, tag,
++            (icamera_metadata_entry_t*)entry);
++}
++
++int delete_icamera_metadata_entry(icamera_metadata_t *dst,
++        size_t index) {
++    if (dst == NULL) return ERROR;
++    if (index >= dst->entry_count) return ERROR;
++
++    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
++    size_t data_bytes = calculate_icamera_metadata_entry_data_size(entry->type,
++            entry->count);
++
++    if (data_bytes > 0) {
++        // Shift data buffer to overwrite deleted data
++        uint8_t *start = get_data(dst) + entry->data.offset;
++        uint8_t *end = start + data_bytes;
++        size_t length = dst->data_count - entry->data.offset - data_bytes;
++        memmove(start, end, length);
++
++        // Update all entry indices to account for shift
++        camera_metadata_buffer_entry_t *e = get_entries(dst);
++        size_t i;
++        for (i = 0; i < dst->entry_count; i++) {
++            if (calculate_icamera_metadata_entry_data_size(
++                    e->type, e->count) > 0 &&
++                    e->data.offset > entry->data.offset) {
++                e->data.offset -= data_bytes;
++            }
++            ++e;
++        }
++        dst->data_count -= data_bytes;
++    }
++    // Shift entry array
++    memmove(entry, entry + 1,
++            sizeof(camera_metadata_buffer_entry_t) *
++            (dst->entry_count - index - 1) );
++    dst->entry_count -= 1;
++
++    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
++    return OK;
++}
++
++int update_icamera_metadata_entry(icamera_metadata_t *dst,
++        size_t index,
++        const void *data,
++        size_t data_count,
++        icamera_metadata_entry_t *updated_entry) {
++    if (dst == NULL) return ERROR;
++    if (index >= dst->entry_count) return ERROR;
++
++    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
++    if (entry->type >= ICAMERA_NUM_TYPES) return ERROR;
++
++    size_t data_bytes =
++            calculate_icamera_metadata_entry_data_size(entry->type,
++                    data_count);
++    size_t data_payload_bytes =
++            data_count * icamera_metadata_type_size[entry->type];
++
++    size_t entry_bytes =
++            calculate_icamera_metadata_entry_data_size(entry->type,
++                    entry->count);
++    if (data_bytes != entry_bytes) {
++        // May need to shift/add to data array
++        if (dst->data_capacity < dst->data_count + data_bytes - entry_bytes) {
++            // No room
++            return ERROR;
++        }
++        if (entry_bytes != 0) {
++            // Remove old data
++            uint8_t *start = get_data(dst) + entry->data.offset;
++            uint8_t *end = start + entry_bytes;
++            size_t length = dst->data_count - entry->data.offset - entry_bytes;
++            memmove(start, end, length);
++            dst->data_count -= entry_bytes;
++
++            // Update all entry indices to account for shift
++            camera_metadata_buffer_entry_t *e = get_entries(dst);
++            size_t i;
++            for (i = 0; i < dst->entry_count; i++) {
++                if (calculate_icamera_metadata_entry_data_size(
++                        e->type, e->count) > 0 &&
++                        e->data.offset > entry->data.offset) {
++                    e->data.offset -= entry_bytes;
++                }
++                ++e;
++            }
++        }
++
++        if (data_bytes != 0) {
++            // Append new data
++            entry->data.offset = dst->data_count;
++
++            MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
++            dst->data_count += data_bytes;
++        }
++    } else if (data_bytes != 0) {
++        // data size unchanged, reuse same data location
++        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
++    }
++
++    if (data_bytes == 0) {
++        // Data fits into entry
++        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
++    }
++
++    entry->count = data_count;
++
++    if (updated_entry != NULL) {
++        get_icamera_metadata_entry(dst,
++                index,
++                updated_entry);
++    }
++
++    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
++    return OK;
++}
++
++const char *get_icamera_metadata_section_name(uint32_t tag) {
++    uint32_t tag_section = tag >> 16;
++    if (tag_section >= CAMERA_SECTION_COUNT) {
++        return NULL;
++    }
++    return icamera_metadata_section_names[tag_section];
++}
++
++const char *get_icamera_metadata_tag_name(uint32_t tag) {
++    uint32_t tag_section = tag >> 16;
++    if (tag_section >= CAMERA_SECTION_COUNT ||
++        tag >= icamera_metadata_section_bounds[tag_section][1] ) {
++        return NULL;
++    }
++    uint32_t tag_index = tag & 0xFFFF;
++    return icamera_tag_info[tag_section][tag_index].tag_name;
++}
++
++int get_icamera_metadata_tag_type(uint32_t tag) {
++    uint32_t tag_section = tag >> 16;
++    if (tag_section >= CAMERA_SECTION_COUNT ||
++            tag >= icamera_metadata_section_bounds[tag_section][1] ) {
++        return -1;
++    }
++    uint32_t tag_index = tag & 0xFFFF;
++    return icamera_tag_info[tag_section][tag_index].tag_type;
++}
++
++static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag, int type,
++        int count,
++        int indentation);
++
++void dump_icamera_metadata(const icamera_metadata_t *metadata,
++        int fd,
++        int verbosity) {
++    dump_indented_icamera_metadata(metadata, fd, verbosity, 0);
++}
++
++void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
++        int fd,
++        int verbosity,
++        int indentation) {
++    if (metadata == NULL) {
++        dprintf(fd, "%*sDumping camera metadata array: Not allocated\n",
++                indentation, "");
++        return;
++    }
++    unsigned int i;
++    dprintf(fd,
++            "%*sDumping camera metadata array: %" PRIu32 " / %" PRIu32 " entries, "
++            "%" PRIu32 " / %" PRIu32 " bytes of extra data.\n", indentation, "",
++            metadata->entry_count, metadata->entry_capacity,
++            metadata->data_count, metadata->data_capacity);
++    dprintf(fd, "%*sVersion: %d, Flags: %08x\n",
++            indentation + 2, "",
++            metadata->version, metadata->flags);
++    camera_metadata_buffer_entry_t *entry = get_entries(metadata);
++    for (i=0; i < metadata->entry_count; i++, entry++) {
++
++        const char *tag_name, *tag_section;
++        tag_section = get_icamera_metadata_section_name(entry->tag);
++        if (tag_section == NULL) {
++            tag_section = "unknownSection";
++        }
++        tag_name = get_icamera_metadata_tag_name(entry->tag);
++        if (tag_name == NULL) {
++            tag_name = "unknownTag";
++        }
++        const char *type_name;
++        if (entry->type >= ICAMERA_NUM_TYPES) {
++            type_name = "unknown";
++        } else {
++            type_name = icamera_metadata_type_names[entry->type];
++        }
++        dprintf(fd, "%*s%s.%s (%05x): %s[%" PRIu32 "]\n",
++             indentation + 2, "",
++             tag_section,
++             tag_name,
++             entry->tag,
++             type_name,
++             entry->count);
++
++        if (verbosity < 1) continue;
++
++        if (entry->type >= ICAMERA_NUM_TYPES) continue;
++
++        size_t type_size = icamera_metadata_type_size[entry->type];
++        uint8_t *data_ptr;
++        if ( type_size * entry->count > 4 ) {
++            if (entry->data.offset >= metadata->data_count) {
++                ALOGE("%s: Malformed entry data offset: %" PRIu32 " (max %" PRIu32 ")",
++                        __func__,
++                        entry->data.offset,
++                        metadata->data_count);
++                continue;
++            }
++            data_ptr = get_data(metadata) + entry->data.offset;
++        } else {
++            data_ptr = entry->data.value;
++        }
++        int count = entry->count;
++        if (verbosity < 2 && count > 16) count = 16;
++
++        print_data(fd, data_ptr, entry->tag, entry->type, count, indentation);
++    }
++}
++
++static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag,
++        int type, int count, int indentation) {
++    static int values_per_line[ICAMERA_NUM_TYPES] = {
++        16,                   // ICAMERA_TYPE_BYTE
++        4,                    // ICAMERA_TYPE_INT32
++        8,                    // ICAMERA_TYPE_FLOAT
++        2,                    // ICAMERA_TYPE_INT64
++        4,                    // ICAMERA_TYPE_DOUBLE
++        2,                    // ICAMERA_TYPE_RATIONAL
++    };
++    size_t type_size = icamera_metadata_type_size[type];
++    char value_string_tmp[ICAMERA_METADATA_ENUM_STRING_MAX_SIZE];
++    int32_t value;
++
++    int lines = count / values_per_line[type];
++    if (count % values_per_line[type] != 0) lines++;
++
++    int index = 0;
++    int j, k;
++    for (j = 0; j < lines; j++) {
++        dprintf(fd, "%*s[", indentation + 4, "");
++        for (k = 0;
++             k < values_per_line[type] && count > 0;
++             k++, count--, index += type_size) {
++
++            switch (type) {
++                case ICAMERA_TYPE_BYTE:
++                    value = *(data_ptr + index);
++                    if (icamera_metadata_enum_snprint(tag,
++                                                      value,
++                                                      value_string_tmp,
++                                                      sizeof(value_string_tmp))
++                        == OK) {
++                        dprintf(fd, "%s ", value_string_tmp);
++                    } else {
++                        dprintf(fd, "%hhu ",
++                                *(data_ptr + index));
++                    }
++                    break;
++                case ICAMERA_TYPE_INT32:
++                    value =
++                            *(int32_t*)(data_ptr + index);
++                    if (icamera_metadata_enum_snprint(tag,
++                                                      value,
++                                                      value_string_tmp,
++                                                      sizeof(value_string_tmp))
++                        == OK) {
++                        dprintf(fd, "%s ", value_string_tmp);
++                    } else {
++                        dprintf(fd, "%" PRId32 " ",
++                                *(int32_t*)(data_ptr + index));
++                    }
++                    break;
++                case ICAMERA_TYPE_FLOAT:
++                    dprintf(fd, "%0.8f ",
++                            *(float*)(data_ptr + index));
++                    break;
++                case ICAMERA_TYPE_INT64:
++                    dprintf(fd, "%" PRId64 " ",
++                            *(int64_t*)(data_ptr + index));
++                    break;
++                case ICAMERA_TYPE_DOUBLE:
++                    dprintf(fd, "%0.8f ",
++                            *(double*)(data_ptr + index));
++                    break;
++                case ICAMERA_TYPE_RATIONAL: {
++                    int32_t numerator = *(int32_t*)(data_ptr + index);
++                    int32_t denominator = *(int32_t*)(data_ptr + index + 4);
++                    dprintf(fd, "(%d / %d) ",
++                            numerator, denominator);
++                    break;
++                }
++                default:
++                    dprintf(fd, "??? ");
++            }
++        }
++        dprintf(fd, "]\n");
++    }
++}
+diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
+new file mode 100644
+index 000000000000..77f02d0ae038
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
+@@ -0,0 +1,445 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string.h>
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define ALIGN_TO(val, alignment) \
++    (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1))
++
++/**
++ * Tag hierarchy and enum definitions for camera_metadata_entry
++ * =============================================================================
++ */
++
++/**
++ * Main enum definitions are in a separate file to make it easy to
++ * maintain
++ */
++#include "icamera_metadata_tags.h"
++
++/**
++ * Enum range for each top-level category
++ */
++
++extern unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2];
++
++extern const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT];
++
++/**
++ * Type definitions for camera_metadata_entry
++ * =============================================================================
++ */
++enum {
++    // Unsigned 8-bit integer (uint8_t)
++    ICAMERA_TYPE_BYTE = 0,
++    // Signed 32-bit integer (int32_t)
++    ICAMERA_TYPE_INT32 = 1,
++    // 32-bit float (float)
++    ICAMERA_TYPE_FLOAT = 2,
++    // Signed 64-bit integer (int64_t)
++    ICAMERA_TYPE_INT64 = 3,
++    // 64-bit float (double)
++    ICAMERA_TYPE_DOUBLE = 4,
++    // A 64-bit fraction (camera_metadata_rational_t)
++    ICAMERA_TYPE_RATIONAL = 5,
++    // Number of type fields
++    ICAMERA_NUM_TYPES
++};
++
++typedef struct icamera_metadata_rational {
++    int32_t numerator;
++    int32_t denominator;
++} icamera_metadata_rational_t;
++
++/**
++ * A reference to a metadata entry in a buffer.
++ *
++ * The data union pointers point to the real data in the buffer, and can be
++ * modified in-place if the count does not need to change. The count is the
++ * number of entries in data of the entry's type, not a count of bytes.
++ */
++typedef struct icamera_metadata_entry {
++    size_t   index;
++    uint32_t tag;
++    uint8_t  type;
++    size_t   count;
++    union {
++        uint8_t *u8;
++        int32_t *i32;
++        float   *f;
++        int64_t *i64;
++        double  *d;
++        icamera_metadata_rational_t *r;
++    } data;
++} icamera_metadata_entry_t;
++
++/**
++ * A read-only reference to a metadata entry in a buffer. Identical to
++ * camera_metadata_entry in layout
++ */
++typedef struct icamera_metadata_ro_entry {
++    size_t   index;
++    uint32_t tag;
++    uint8_t  type;
++    size_t   count;
++    union {
++        const uint8_t *u8;
++        const int32_t *i32;
++        const float   *f;
++        const int64_t *i64;
++        const double  *d;
++        const icamera_metadata_rational_t *r;
++    } data;
++} icamera_metadata_ro_entry_t;
++
++/**
++ * Size in bytes of each entry type
++ */
++extern const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES];
++
++/**
++ * Human-readable name of each entry type
++ */
++extern const char* icamera_metadata_type_names[ICAMERA_NUM_TYPES];
++
++/**
++ * Main definitions for the metadata entry and array structures
++ * =============================================================================
++ */
++
++/**
++ * A packet of metadata. This is a list of metadata entries, each of which has
++ * an integer tag to identify its meaning, 'type' and 'count' field, and the
++ * data, which contains a 'count' number of entries of type 'type'. The packet
++ * has a fixed capacity for entries and for extra data.  A new entry uses up one
++ * entry slot, and possibly some amount of data capacity; the function
++ * calculate_camera_metadata_entry_data_size() provides the amount of data
++ * capacity that would be used up by an entry.
++ *
++ * Entries are not sorted by default, and are not forced to be unique - multiple
++ * entries with the same tag are allowed. The packet will not dynamically resize
++ * when full.
++ *
++ * The packet is contiguous in memory, with size in bytes given by
++ * get_camera_metadata_size(). Therefore, it can be copied safely with memcpy()
++ * to a buffer of sufficient size. The copy_camera_metadata() function is
++ * intended for eliminating unused capacity in the destination packet.
++ */
++struct icamera_metadata;
++typedef struct icamera_metadata icamera_metadata_t;
++
++/**
++ * Functions for manipulating camera metadata
++ * =============================================================================
++ *
++ * NOTE: Unless otherwise specified, functions that return type "int"
++ * return 0 on success, and non-0 value on error.
++ */
++
++/**
++ * Allocate a new camera_metadata structure, with some initial space for entries
++ * and extra data. The entry_capacity is measured in entry counts, and
++ * data_capacity in bytes. The resulting structure is all contiguous in memory,
++ * and can be freed with free_camera_metadata().
++ */
++icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
++        size_t data_capacity);
++
++/**
++ * Get the required alignment of a packet of camera metadata, which is the
++ * maximal alignment of the embedded camera_metadata, camera_metadata_buffer_entry,
++ * and camera_metadata_data.
++ */
++size_t get_icamera_metadata_alignment();
++
++/**
++ * Allocate a new camera_metadata structure of size src_size. Copy the data,
++ * ignoring alignment, and then attempt validation. If validation
++ * fails, free the memory and return NULL. Otherwise return the pointer.
++ *
++ * The resulting pointer can be freed with free_camera_metadata().
++ */
++icamera_metadata_t *allocate_copy_icamera_metadata_checked(
++        const icamera_metadata_t *src,
++        size_t src_size);
++
++/**
++ * Place a camera metadata structure into an existing buffer. Returns NULL if
++ * the buffer is too small for the requested number of reserved entries and
++ * bytes of data. The entry_capacity is measured in entry counts, and
++ * data_capacity in bytes. If the buffer is larger than the required space,
++ * unused space will be left at the end. If successful, returns a pointer to the
++ * metadata header placed at the start of the buffer. It is the caller's
++ * responsibility to free the original buffer; do not call
++ * free_camera_metadata() with the returned pointer.
++ */
++icamera_metadata_t *place_icamera_metadata(void *dst, size_t dst_size,
++        size_t entry_capacity,
++        size_t data_capacity);
++
++/**
++ * Free a camera_metadata structure. Should only be used with structures
++ * allocated with allocate_camera_metadata().
++ */
++void free_icamera_metadata(icamera_metadata_t *metadata);
++
++/**
++ * Calculate the buffer size needed for a metadata structure of entry_count
++ * metadata entries, needing a total of data_count bytes of extra data storage.
++ */
++size_t calculate_icamera_metadata_size(size_t entry_count,
++        size_t data_count);
++
++/**
++ * Get current size of entire metadata structure in bytes, including reserved
++ * but unused space.
++ */
++size_t get_icamera_metadata_size(const icamera_metadata_t *metadata);
++
++/**
++ * Get size of entire metadata buffer in bytes, not including reserved but
++ * unused space. This is the amount of space needed by copy_camera_metadata for
++ * its dst buffer.
++ */
++size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata);
++
++/**
++ * Get the current number of entries in the metadata packet.
++ *
++ * metadata packet must be valid, which can be checked before the call with
++ * validate_camera_metadata_structure().
++ */
++size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata);
++
++/**
++ * Get the maximum number of entries that could fit in the metadata packet.
++ */
++size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata);
++
++/**
++ * Get the current count of bytes used for value storage in the metadata packet.
++ */
++size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata);
++
++/**
++ * Get the maximum count of bytes that could be used for value storage in the
++ * metadata packet.
++ */
++size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata);
++
++/**
++ * Copy a metadata structure to a memory buffer, compacting it along the
++ * way. That is, in the copied structure, entry_count == entry_capacity, and
++ * data_count == data_capacity.
++ *
++ * If dst_size > get_camera_metadata_compact_size(), the unused bytes are at the
++ * end of the buffer. If dst_size < get_camera_metadata_compact_size(), returns
++ * NULL. Otherwise returns a pointer to the metadata structure header placed at
++ * the start of dst.
++ *
++ * Since the buffer was not allocated by allocate_camera_metadata, the caller is
++ * responsible for freeing the underlying buffer when needed; do not call
++ * free_camera_metadata.
++ */
++icamera_metadata_t *copy_icamera_metadata(void *dst, size_t dst_size,
++        const icamera_metadata_t *src);
++
++/**
++ * Validate that a metadata is structurally sane. That is, its internal
++ * state is such that we won't get buffer overflows or run into other
++ * 'impossible' issues when calling the other API functions.
++ *
++ * This is useful in particular after copying the binary metadata blob
++ * from an untrusted source, since passing this check means the data is at least
++ * consistent.
++ *
++ * The expected_size argument is optional.
++ *
++ * Returns 0 on success. A non-0 value is returned on error.
++ */
++int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
++                                        const size_t *expected_size);
++
++/**
++ * Append camera metadata in src to an existing metadata structure in dst.  This
++ * does not resize the destination structure, so if it is too small, a non-zero
++ * value is returned. On success, 0 is returned. Appending onto a sorted
++ * structure results in a non-sorted combined structure.
++ */
++int append_icamera_metadata(icamera_metadata_t *dst, const icamera_metadata_t *src);
++
++/**
++ * Clone an existing metadata buffer, compacting along the way. This is
++ * equivalent to allocating a new buffer of the minimum needed size, then
++ * appending the buffer to be cloned into the new buffer. The resulting buffer
++ * can be freed with free_camera_metadata(). Returns NULL if cloning failed.
++ */
++
++icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src);
++/**
++ * Calculate the number of bytes of extra data a given metadata entry will take
++ * up. That is, if entry of 'type' with a payload of 'data_count' values is
++ * added, how much will the value returned by get_camera_metadata_data_count()
++ * be increased? This value may be zero, if no extra data storage is needed.
++ */
++size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
++        size_t data_count);
++
++/**
++ * Add a metadata entry to a metadata structure. Returns 0 if the addition
++ * succeeded. Returns a non-zero value if there is insufficient reserved space
++ * left to add the entry, or if the tag is unknown.  data_count is the number of
++ * entries in the data array of the tag's type, not a count of
++ * bytes. Entries are always added to the end of the structure (highest index),
++ * so after addition, a previously-sorted array will be marked as unsorted.
++ *
++ * Returns 0 on success. A non-0 value is returned on error.
++ */
++int add_icamera_metadata_entry(icamera_metadata_t *dst,
++        uint32_t tag,
++        const void *data,
++        size_t data_count);
++
++/**
++ * Sort the metadata buffer for fast searching. If already marked as sorted,
++ * does nothing. Adding or appending entries to the buffer will place the buffer
++ * back into an unsorted state.
++ *
++ * Returns 0 on success. A non-0 value is returned on error.
++ */
++int sort_icamera_metadata(icamera_metadata_t *dst);
++
++/**
++ * Get metadata entry at position index in the metadata buffer.
++ * Index must be less than entry count, which is returned by
++ * get_icamera_metadata_entry_count().
++ *
++ * src and index are inputs; the passed-in entry is updated with the details of
++ * the entry. The data pointer points to the real data in the buffer, and can be
++ * updated as long as the data count does not change.
++ *
++ * Returns 0 on success. A non-0 value is returned on error.
++ */
++int get_icamera_metadata_entry(icamera_metadata_t *src,
++        size_t index,
++        icamera_metadata_entry_t *entry);
++
++/**
++ * Get metadata entry at position index, but disallow editing the data.
++ */
++int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
++        size_t index,
++        icamera_metadata_ro_entry_t *entry);
++
++/**
++ * Find an entry with given tag value. If not found, returns -ENOENT. Otherwise,
++ * returns entry contents like get_camera_metadata_entry.
++ *
++ * If multiple entries with the same tag exist, does not have any guarantees on
++ * which is returned. To speed up searching for tags, sort the metadata
++ * structure first by calling sort_camera_metadata().
++ */
++int find_icamera_metadata_entry(icamera_metadata_t *src,
++        uint32_t tag,
++        icamera_metadata_entry_t *entry);
++
++/**
++ * Find an entry with given tag value, but disallow editing the data
++ */
++int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
++        uint32_t tag,
++        icamera_metadata_ro_entry_t *entry);
++
++/**
++ * Delete an entry at given index. This is an expensive operation, since it
++ * requires repacking entries and possibly entry data. This also invalidates any
++ * existing camera_metadata_entry.data pointers to this buffer. Sorting is
++ * maintained.
++ */
++int delete_icamera_metadata_entry(icamera_metadata_t *dst,
++        size_t index);
++
++/**
++ * Updates a metadata entry with new data. If the data size is changing, may
++ * need to adjust the data array, making this an O(N) operation. If the data
++ * size is the same or still fits in the entry space, this is O(1). Maintains
++ * sorting, but invalidates camera_metadata_entry instances that point to the
++ * updated entry. If a non-NULL value is passed in to entry, the entry structure
++ * is updated to match the new buffer state.  Returns a non-zero value if there
++ * is no room for the new data in the buffer.
++ */
++int update_icamera_metadata_entry(icamera_metadata_t *dst,
++        size_t index,
++        const void *data,
++        size_t data_count,
++        icamera_metadata_entry_t *updated_entry);
++
++/**
++ * Retrieve human-readable name of section the tag is in. Returns NULL if
++ * no such tag is defined.
++ */
++const char *get_icamera_metadata_section_name(uint32_t tag);
++
++/**
++ * Retrieve human-readable name of tag (not including section). Returns NULL if
++ * no such tag is defined.
++ */
++const char *get_icamera_metadata_tag_name(uint32_t tag);
++
++/**
++ * Retrieve the type of a tag. Returns -1 if no such tag is defined.
++ */
++int get_icamera_metadata_tag_type(uint32_t tag);
++
++/**
++ * Print fields in the metadata to the log.
++ * verbosity = 0: Only tag entry information
++ * verbosity = 1: Tag entry information plus at most 16 data values
++ * verbosity = 2: All information
++ */
++void dump_icamera_metadata(const icamera_metadata_t *metadata,
++        int fd,
++        int verbosity);
++
++/**
++ * Print fields in the metadata to the log; adds indentation parameter, which
++ * specifies the number of spaces to insert before each line of the dump
++ */
++void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
++        int fd,
++        int verbosity,
++        int indentation);
++
++/**
++ * Prints the specified tag value as a string. Only works for enum tags.
++ * Returns 0 on success, -1 on failure.
++ */
++int icamera_metadata_enum_snprint(uint32_t tag,
++                                  int32_t value,
++                                  char *dst,
++                                  size_t size);
++
++#ifdef __cplusplus
++}
++#endif
+diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
+new file mode 100644
+index 000000000000..491348aba397
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
+@@ -0,0 +1,2698 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ * !! Do not reference this file directly !!
++ *
++ * It is logically a part of camera_metadata_base.cpp.  It is broken out for
++ * ease of maintaining the tag info.
++ *
++ * Array assignments are done using specified-index syntax to keep things in
++ * sync with icamera_metadata_tags.h
++ */
++
++/**
++ * ! Do not edit this file directly !
++ *
++ * Generated automatically from icamera_metadata_tag_info.mako
++ */
++
++const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT] = {
++    "camera.ae", /* [CAMERA_AE] */
++    "camera.awb", /* [CAMERA_AWB] */
++    "camera.af", /* [CAMERA_AF] */
++    "camera.control", /* [CAMERA_CONTROL] */
++    "camera.demosaic", /* [CAMERA_DEMOSAIC] */
++    "camera.edge", /* [CAMERA_EDGE] */
++    "camera.flash", /* [CAMERA_FLASH] */
++    "camera.flash.info", /* [CAMERA_FLASH_INFO] */
++    "camera.hotPixel", /* [CAMERA_HOT_PIXEL] */
++    "camera.jpeg", /* [CAMERA_JPEG] */
++    "camera.lens", /* [CAMERA_LENS] */
++    "camera.lens.info", /* [CAMERA_LENS_INFO] */
++    "camera.noiseReduction", /* [CAMERA_NOISE_REDUCTION] */
++    "camera.request", /* [CAMERA_REQUEST] */
++    "camera.scaler", /* [CAMERA_SCALER] */
++    "camera.sensor", /* [CAMERA_SENSOR] */
++    "camera.sensor.info", /* [CAMERA_SENSOR_INFO] */
++    "camera.shading", /* [CAMERA_SHADING] */
++    "camera.statistics", /* [CAMERA_STATISTICS] */
++    "camera.statistics.info", /* [CAMERA_STATISTICS_INFO] */
++    "camera.tonemap", /* [CAMERA_TONEMAP] */
++    "camera.led", /* [CAMERA_LED] */
++    "camera.info", /* [CAMERA_INFO] */
++    "camera.blackLevel", /* [CAMERA_BLACK_LEVEL] */
++    "camera.sync", /* [CAMERA_SYNC] */
++    "camera.reprocess", /* [CAMERA_REPROCESS] */
++    "intel.info", /* [INTEL_INFO] */
++    "intel.control", /* [INTEL_CONTROL] */
++    "intel.control_isp", /* [INTEL_CONTROL_ISP] */
++};
++
++unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2] = {
++    /* [CAMERA_AE] */
++    { CAMERA_AE_START, CAMERA_AE_END },
++    /* [CAMERA_AWB] */
++    { CAMERA_AWB_START, CAMERA_AWB_END },
++    /* [CAMERA_AF] */
++    { CAMERA_AF_START, CAMERA_AF_END },
++    /* [CAMERA_CONTROL] */
++    { CAMERA_CONTROL_START, CAMERA_CONTROL_END },
++    /* [CAMERA_DEMOSAIC] */
++    { CAMERA_DEMOSAIC_START, CAMERA_DEMOSAIC_END },
++    /* [CAMERA_EDGE] */
++    { CAMERA_EDGE_START, CAMERA_EDGE_END },
++    /* [CAMERA_FLASH] */
++    { CAMERA_FLASH_START, CAMERA_FLASH_END },
++    /* [CAMERA_FLASH_INFO] */
++    { CAMERA_FLASH_INFO_START, CAMERA_FLASH_INFO_END },
++    /* [CAMERA_HOT_PIXEL] */
++    { CAMERA_HOT_PIXEL_START, CAMERA_HOT_PIXEL_END },
++    /* [CAMERA_JPEG] */
++    { CAMERA_JPEG_START, CAMERA_JPEG_END },
++    /* [CAMERA_LENS] */
++    { CAMERA_LENS_START, CAMERA_LENS_END },
++    /* [CAMERA_LENS_INFO] */
++    { CAMERA_LENS_INFO_START, CAMERA_LENS_INFO_END },
++    /* [CAMERA_NOISE_REDUCTION] */
++    { CAMERA_NOISE_REDUCTION_START, CAMERA_NOISE_REDUCTION_END },
++    /* [CAMERA_REQUEST] */
++    { CAMERA_REQUEST_START, CAMERA_REQUEST_END },
++    /* [CAMERA_SCALER] */
++    { CAMERA_SCALER_START, CAMERA_SCALER_END },
++    /* [CAMERA_SENSOR] */
++    { CAMERA_SENSOR_START, CAMERA_SENSOR_END },
++    /* [CAMERA_SENSOR_INFO] */
++    { CAMERA_SENSOR_INFO_START, CAMERA_SENSOR_INFO_END },
++    /* [CAMERA_SHADING] */
++    { CAMERA_SHADING_START, CAMERA_SHADING_END },
++    /* [CAMERA_STATISTICS] */
++    { CAMERA_STATISTICS_START, CAMERA_STATISTICS_END },
++    /* [CAMERA_STATISTICS_INFO] */
++    { CAMERA_STATISTICS_INFO_START, CAMERA_STATISTICS_INFO_END },
++    /* [CAMERA_TONEMAP] */
++    { CAMERA_TONEMAP_START, CAMERA_TONEMAP_END },
++    /* [CAMERA_LED] */
++    { CAMERA_LED_START, CAMERA_LED_END },
++    /* [CAMERA_INFO] */
++    { CAMERA_INFO_START, CAMERA_INFO_END },
++    /* [CAMERA_BLACK_LEVEL] */
++    { CAMERA_BLACK_LEVEL_START, CAMERA_BLACK_LEVEL_END },
++    /* [CAMERA_SYNC] */
++    { CAMERA_SYNC_START, CAMERA_SYNC_END },
++    /* [CAMERA_REPROCESS] */
++    { CAMERA_REPROCESS_START, CAMERA_REPROCESS_END },
++    /* [INTEL_INFO] */
++    { INTEL_INFO_START, INTEL_INFO_END },
++    /* [INTEL_CONTROL] */
++    { INTEL_CONTROL_START, INTEL_CONTROL_END },
++    /* [INTEL_CONTROL_ISP] */
++    { INTEL_CONTROL_ISP_START, INTEL_CONTROL_ISP_END },
++};
++
++static tag_info_t camera_ae[CAMERA_AE_END -
++        CAMERA_AE_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "lock",                          ICAMERA_TYPE_BYTE   },
++    { "regions",                       ICAMERA_TYPE_INT32  },
++    { "antibandingMode",               ICAMERA_TYPE_BYTE   },
++    { "compensation",                  ICAMERA_TYPE_INT32  },
++    { "targetFpsRange",                ICAMERA_TYPE_FLOAT  },
++    { "precaptureTrigger",             ICAMERA_TYPE_BYTE   },
++    { "state",                         ICAMERA_TYPE_BYTE   },
++    { "availableModes",                ICAMERA_TYPE_BYTE   },
++    { "availableAntibandingModes",     ICAMERA_TYPE_BYTE   },
++    { "compensationStep",              ICAMERA_TYPE_RATIONAL
++                        },
++    { "compensationRange",             ICAMERA_TYPE_INT32  },
++    { "availableTargetFpsRanges",      ICAMERA_TYPE_FLOAT  },
++    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_awb[CAMERA_AWB_END -
++        CAMERA_AWB_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "colorTransform",                ICAMERA_TYPE_FLOAT  },
++    { "colorGains",                    ICAMERA_TYPE_FLOAT  },
++    { "lock",                          ICAMERA_TYPE_BYTE   },
++    { "regions",                       ICAMERA_TYPE_INT32  },
++    { "cctRange",                      ICAMERA_TYPE_INT32  },
++    { "gains",                         ICAMERA_TYPE_INT32  },
++    { "gainShift",                     ICAMERA_TYPE_INT32  },
++    { "whitePoint",                    ICAMERA_TYPE_INT32  },
++    { "convergeSpeed",                 ICAMERA_TYPE_BYTE   },
++    { "convergeSpeedMode",             ICAMERA_TYPE_BYTE   },
++    { "state",                         ICAMERA_TYPE_BYTE   },
++    { "result",                        ICAMERA_TYPE_BYTE   },
++    { "availableModes",                ICAMERA_TYPE_BYTE   },
++    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_af[CAMERA_AF_END -
++        CAMERA_AF_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "regions",                       ICAMERA_TYPE_INT32  },
++    { "trigger",                       ICAMERA_TYPE_BYTE   },
++    { "availableModes",                ICAMERA_TYPE_BYTE   },
++    { "state",                         ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_control[CAMERA_CONTROL_END -
++        CAMERA_CONTROL_START] = {
++    { "captureintent",                 ICAMERA_TYPE_BYTE   },
++    { "effectMode",                    ICAMERA_TYPE_BYTE   },
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
++    { "videoStabilizationMode",        ICAMERA_TYPE_BYTE   },
++    { "availableEffects",              ICAMERA_TYPE_BYTE   },
++    { "availableModes",                ICAMERA_TYPE_BYTE   },
++    { "availableSceneModes",           ICAMERA_TYPE_BYTE   },
++    { "availableVideoStabilizationModes",
++                                        ICAMERA_TYPE_BYTE   },
++    { "maxRegions",                    ICAMERA_TYPE_INT32  },
++    { "sceneModeOverrides",            ICAMERA_TYPE_BYTE   },
++    { "availableHighSpeedVideoConfigurations",
++                                        ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t camera_demosaic[CAMERA_DEMOSAIC_END -
++        CAMERA_DEMOSAIC_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_edge[CAMERA_EDGE_END -
++        CAMERA_EDGE_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "strength",                      ICAMERA_TYPE_BYTE   },
++    { "availableEdgeModes",            ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_flash[CAMERA_FLASH_END -
++        CAMERA_FLASH_START] = {
++    { "firingPower",                   ICAMERA_TYPE_BYTE   },
++    { "firingTime",                    ICAMERA_TYPE_INT64  },
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "colorTemperature",              ICAMERA_TYPE_BYTE   },
++    { "maxEnergy",                     ICAMERA_TYPE_BYTE   },
++    { "state",                         ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_flash_info[CAMERA_FLASH_INFO_END -
++        CAMERA_FLASH_INFO_START] = {
++    { "available",                     ICAMERA_TYPE_BYTE   },
++    { "chargeDuration",                ICAMERA_TYPE_INT64  },
++};
++
++static tag_info_t camera_hot_pixel[CAMERA_HOT_PIXEL_END -
++        CAMERA_HOT_PIXEL_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "availableHotPixelModes",        ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_jpeg[CAMERA_JPEG_END -
++        CAMERA_JPEG_START] = {
++    { "gpsCoordinates",                ICAMERA_TYPE_DOUBLE },
++    { "gpsProcessingMethod",           ICAMERA_TYPE_BYTE   },
++    { "gpsTimestamp",                  ICAMERA_TYPE_INT64  },
++    { "orientation",                   ICAMERA_TYPE_INT32  },
++    { "quality",                       ICAMERA_TYPE_BYTE   },
++    { "thumbnailQuality",              ICAMERA_TYPE_BYTE   },
++    { "thumbnailSize",                 ICAMERA_TYPE_INT32  },
++    { "availableThumbnailSizes",       ICAMERA_TYPE_INT32  },
++    { "maxSize",                       ICAMERA_TYPE_INT32  },
++    { "size",                          ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t camera_lens[CAMERA_LENS_END -
++        CAMERA_LENS_START] = {
++    { "aperture",                      ICAMERA_TYPE_FLOAT  },
++    { "filterDensity",                 ICAMERA_TYPE_FLOAT  },
++    { "focalLength",                   ICAMERA_TYPE_FLOAT  },
++    { "focusDistance",                 ICAMERA_TYPE_FLOAT  },
++    { "opticalStabilizationMode",      ICAMERA_TYPE_BYTE   },
++    { "facing",                        ICAMERA_TYPE_BYTE   },
++    { "focusRange",                    ICAMERA_TYPE_FLOAT  },
++    { "state",                         ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_lens_info[CAMERA_LENS_INFO_END -
++        CAMERA_LENS_INFO_START] = {
++    { "availableApertures",            ICAMERA_TYPE_FLOAT  },
++    { "availableFilterDensities",      ICAMERA_TYPE_FLOAT  },
++    { "availableFocalLengths",         ICAMERA_TYPE_FLOAT  },
++    { "availableOpticalStabilization", ICAMERA_TYPE_BYTE   },
++    { "hyperfocalDistance",            ICAMERA_TYPE_FLOAT  },
++    { "minimumFocusDistance",          ICAMERA_TYPE_FLOAT  },
++    { "shadingMapSize",                ICAMERA_TYPE_INT32  },
++    { "focusDistanceCalibration",      ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_noise_reduction[CAMERA_NOISE_REDUCTION_END -
++        CAMERA_NOISE_REDUCTION_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "strength",                      ICAMERA_TYPE_BYTE   },
++    { "availableNoiseReductionModes",  ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_request[CAMERA_REQUEST_END -
++        CAMERA_REQUEST_START] = {
++    { "id",                            ICAMERA_TYPE_INT32  },
++    { "metadataMode",                  ICAMERA_TYPE_BYTE   },
++    { "maxNumOutputStreams",           ICAMERA_TYPE_INT32  },
++    { "maxNumInputStreams",            ICAMERA_TYPE_INT32  },
++    { "pipelineDepth",                 ICAMERA_TYPE_BYTE   },
++    { "pipelineMaxDepth",              ICAMERA_TYPE_BYTE   },
++    { "partialResultCount",            ICAMERA_TYPE_INT32  },
++    { "availableCapabilities",         ICAMERA_TYPE_BYTE   },
++    { "availableRequestKeys",          ICAMERA_TYPE_INT32  },
++    { "availableResultKeys",           ICAMERA_TYPE_INT32  },
++    { "availableCharacteristicsKeys",  ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t camera_scaler[CAMERA_SCALER_END -
++        CAMERA_SCALER_START] = {
++    { "cropRegion",                    ICAMERA_TYPE_INT32  },
++    { "availableJpegSizes",            ICAMERA_TYPE_INT32  },
++    { "availableMaxDigitalZoom",       ICAMERA_TYPE_FLOAT  },
++    { "availableInputOutputFormatsMap",
++                                        ICAMERA_TYPE_INT32  },
++    { "availableStreamConfigurations", ICAMERA_TYPE_INT32  },
++    { "availableMinFrameDurations",    ICAMERA_TYPE_INT64  },
++    { "availableStallDurations",       ICAMERA_TYPE_INT64  },
++    { "croppingType",                  ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_sensor[CAMERA_SENSOR_END -
++        CAMERA_SENSOR_START] = {
++    { "exposureTime",                  ICAMERA_TYPE_INT64  },
++    { "frameDuration",                 ICAMERA_TYPE_INT64  },
++    { "sensitivity",                   ICAMERA_TYPE_INT32  },
++    { "referenceIlluminant1",          ICAMERA_TYPE_BYTE   },
++    { "referenceIlluminant2",          ICAMERA_TYPE_BYTE   },
++    { "calibrationTransform1",         ICAMERA_TYPE_RATIONAL
++                        },
++    { "calibrationTransform2",         ICAMERA_TYPE_RATIONAL
++                        },
++    { "colorTransform1",               ICAMERA_TYPE_RATIONAL
++                        },
++    { "colorTransform2",               ICAMERA_TYPE_RATIONAL
++                        },
++    { "forwardMatrix1",                ICAMERA_TYPE_RATIONAL
++                        },
++    { "forwardMatrix2",                ICAMERA_TYPE_RATIONAL
++                        },
++    { "baseGainFactor",                ICAMERA_TYPE_RATIONAL
++                        },
++    { "blackLevelPattern",             ICAMERA_TYPE_INT32  },
++    { "maxAnalogSensitivity",          ICAMERA_TYPE_INT32  },
++    { "orientation",                   ICAMERA_TYPE_INT32  },
++    { "profileHueSatMapDimensions",    ICAMERA_TYPE_INT32  },
++    { "timestamp",                     ICAMERA_TYPE_INT64  },
++    { "temperature",                   ICAMERA_TYPE_FLOAT  },
++    { "neutralColorPoint",             ICAMERA_TYPE_RATIONAL
++                        },
++    { "noiseProfile",                  ICAMERA_TYPE_DOUBLE },
++    { "profileHueSatMap",              ICAMERA_TYPE_FLOAT  },
++    { "profileToneCurve",              ICAMERA_TYPE_FLOAT  },
++    { "greenSplit",                    ICAMERA_TYPE_FLOAT  },
++    { "testPatternData",               ICAMERA_TYPE_INT32  },
++    { "testPatternMode",               ICAMERA_TYPE_INT32  },
++    { "availableTestPatternModes",     ICAMERA_TYPE_INT32  },
++    { "opaqueRawSize",                 ICAMERA_TYPE_INT32  },
++    { "rollingShutterSkew",            ICAMERA_TYPE_INT64  },
++};
++
++static tag_info_t camera_sensor_info[CAMERA_SENSOR_INFO_END -
++        CAMERA_SENSOR_INFO_START] = {
++    { "activeArraySize",               ICAMERA_TYPE_INT32  },
++    { "sensitivityRange",              ICAMERA_TYPE_INT32  },
++    { "colorFilterArrangement",        ICAMERA_TYPE_BYTE   },
++    { "exposureTimeRange",             ICAMERA_TYPE_INT64  },
++    { "maxFrameDuration",              ICAMERA_TYPE_INT64  },
++    { "physicalSize",                  ICAMERA_TYPE_FLOAT  },
++    { "pixelArraySize",                ICAMERA_TYPE_INT32  },
++    { "whiteLevel",                    ICAMERA_TYPE_INT32  },
++    { "timestampSource",               ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_shading[CAMERA_SHADING_END -
++        CAMERA_SHADING_START] = {
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "strength",                      ICAMERA_TYPE_BYTE   },
++    { "availableModes",                ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_statistics[CAMERA_STATISTICS_END -
++        CAMERA_STATISTICS_START] = {
++    { "faceDetectMode",                ICAMERA_TYPE_BYTE   },
++    { "histogramMode",                 ICAMERA_TYPE_BYTE   },
++    { "sharpnessMapMode",              ICAMERA_TYPE_BYTE   },
++    { "hotPixelMapMode",               ICAMERA_TYPE_BYTE   },
++    { "faceIds",                       ICAMERA_TYPE_INT32  },
++    { "faceLandmarks",                 ICAMERA_TYPE_INT32  },
++    { "faceRectangles",                ICAMERA_TYPE_INT32  },
++    { "faceScores",                    ICAMERA_TYPE_BYTE   },
++    { "histogram",                     ICAMERA_TYPE_INT32  },
++    { "sharpnessMap",                  ICAMERA_TYPE_INT32  },
++    { "lensShadingCorrectionMap",      ICAMERA_TYPE_BYTE   },
++    { "lensShadingMap",                ICAMERA_TYPE_FLOAT  },
++    { "predictedColorGains",           ICAMERA_TYPE_FLOAT  },
++    { "predictedColorTransform",       ICAMERA_TYPE_RATIONAL
++                        },
++    { "sceneFlicker",                  ICAMERA_TYPE_BYTE   },
++    { "hotPixelMap",                   ICAMERA_TYPE_INT32  },
++    { "lensShadingMapMode",            ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_statistics_info[CAMERA_STATISTICS_INFO_END -
++        CAMERA_STATISTICS_INFO_START] = {
++    { "availableFaceDetectModes",      ICAMERA_TYPE_BYTE   },
++    { "histogramBucketCount",          ICAMERA_TYPE_INT32  },
++    { "maxFaceCount",                  ICAMERA_TYPE_INT32  },
++    { "maxHistogramCount",             ICAMERA_TYPE_INT32  },
++    { "maxSharpnessMapValue",          ICAMERA_TYPE_INT32  },
++    { "sharpnessMapSize",              ICAMERA_TYPE_INT32  },
++    { "availableHotPixelMapModes",     ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_tonemap[CAMERA_TONEMAP_END -
++        CAMERA_TONEMAP_START] = {
++    { "curveBlue",                     ICAMERA_TYPE_FLOAT  },
++    { "curveGreen",                    ICAMERA_TYPE_FLOAT  },
++    { "curveRed",                      ICAMERA_TYPE_FLOAT  },
++    { "mode",                          ICAMERA_TYPE_BYTE   },
++    { "maxCurvePoints",                ICAMERA_TYPE_INT32  },
++    { "availableToneMapModes",         ICAMERA_TYPE_BYTE   },
++    { "gamma",                         ICAMERA_TYPE_FLOAT  },
++    { "presetCurve",                   ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_led[CAMERA_LED_END -
++        CAMERA_LED_START] = {
++    { "transmit",                      ICAMERA_TYPE_BYTE   },
++    { "availableLeds",                 ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_info[CAMERA_INFO_END -
++        CAMERA_INFO_START] = {
++    { "supportedHardwareLevel",        ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_black_level[CAMERA_BLACK_LEVEL_END -
++        CAMERA_BLACK_LEVEL_START] = {
++    { "lock",                          ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t camera_sync[CAMERA_SYNC_END -
++        CAMERA_SYNC_START] = {
++    { "frameNumber",                   ICAMERA_TYPE_INT64  },
++    { "maxLatency",                    ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t camera_reprocess[CAMERA_REPROCESS_END -
++        CAMERA_REPROCESS_START] = {
++    { "maxCaptureStall",               ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t intel_info[INTEL_INFO_END -
++        INTEL_INFO_START] = {
++    { "availableConfigurations",       ICAMERA_TYPE_INT32  },
++    { "availableFeatures",             ICAMERA_TYPE_BYTE   },
++    { "aeExposureTimeRange",           ICAMERA_TYPE_INT32  },
++    { "aeGainRange",                   ICAMERA_TYPE_INT32  },
++    { "wfov",                          ICAMERA_TYPE_BYTE   },
++    { "sensorMountType",               ICAMERA_TYPE_BYTE   },
++};
++
++static tag_info_t intel_control[INTEL_CONTROL_END -
++        INTEL_CONTROL_START] = {
++    { "imageEnhancement",              ICAMERA_TYPE_INT32  },
++    { "sensitivityGain",               ICAMERA_TYPE_FLOAT  },
++    { "frameRate",                     ICAMERA_TYPE_FLOAT  },
++    { "aeConvergeSpeed",               ICAMERA_TYPE_BYTE   },
++    { "nrMode",                        ICAMERA_TYPE_BYTE   },
++    { "nrLevel",                       ICAMERA_TYPE_INT32  },
++    { "irisMode",                      ICAMERA_TYPE_BYTE   },
++    { "aeDistributionPriority",        ICAMERA_TYPE_BYTE   },
++    { "irisLevel",                     ICAMERA_TYPE_INT32  },
++    { "wdrMode",                       ICAMERA_TYPE_BYTE   },
++    { "wdrLevel",                      ICAMERA_TYPE_BYTE   },
++    { "blcAreaMode",                   ICAMERA_TYPE_BYTE   },
++    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
++    { "weightGridMode",                ICAMERA_TYPE_BYTE   },
++    { "aeConvergeSpeedMode",           ICAMERA_TYPE_BYTE   },
++    { "deinterlaceMode",               ICAMERA_TYPE_BYTE   },
++    { "makernoteData",                 ICAMERA_TYPE_BYTE   },
++    { "customAicParam",                ICAMERA_TYPE_BYTE   },
++    { "makernoteMode",                 ICAMERA_TYPE_BYTE   },
++    { "yuvColorRange",                 ICAMERA_TYPE_BYTE   },
++    { "sensitivityGainRange",          ICAMERA_TYPE_FLOAT  },
++    { "exposureTimeRange",             ICAMERA_TYPE_INT32  },
++    { "fisheyeDewarpingMode",          ICAMERA_TYPE_BYTE   },
++    { "ltmTuningData",                 ICAMERA_TYPE_BYTE   },
++    { "digitalZoomRatio",              ICAMERA_TYPE_FLOAT  },
++    { "ldcMode",                       ICAMERA_TYPE_BYTE   },
++    { "rscMode",                       ICAMERA_TYPE_BYTE   },
++    { "flipMode",                      ICAMERA_TYPE_BYTE   },
++    { "monoDownscale",                 ICAMERA_TYPE_BYTE   },
++    { "run3ACadence",                  ICAMERA_TYPE_INT32  },
++    { "viewProjection",                ICAMERA_TYPE_BYTE   },
++    { "viewRotation",                  ICAMERA_TYPE_BYTE   },
++    { "viewFineAdjustments",           ICAMERA_TYPE_BYTE   },
++    { "cameraRotation",                ICAMERA_TYPE_BYTE   },
++    { "scalerCropRegion",              ICAMERA_TYPE_INT32  },
++};
++
++static tag_info_t intel_control_isp[INTEL_CONTROL_ISP_END -
++        INTEL_CONTROL_ISP_START] = {
++    { "supportedCtrlIds",              ICAMERA_TYPE_INT32  },
++    { "enabledCtrlIds",                ICAMERA_TYPE_INT32  },
++    { "wb_gains",                      ICAMERA_TYPE_BYTE   },
++    { "color_correction_matrix",       ICAMERA_TYPE_BYTE   },
++    { "advanced_color_correction_matrix",
++                                        ICAMERA_TYPE_BYTE   },
++    { "bxt_csc",                       ICAMERA_TYPE_BYTE   },
++    { "bxt_demosaic",                  ICAMERA_TYPE_BYTE   },
++    { "sc_iefd",                       ICAMERA_TYPE_BYTE   },
++    { "see",                           ICAMERA_TYPE_BYTE   },
++    { "bnlm",                          ICAMERA_TYPE_BYTE   },
++    { "tnr5_21",                       ICAMERA_TYPE_BYTE   },
++    { "xnr_dss",                       ICAMERA_TYPE_BYTE   },
++    { "gamma_tone_map",                ICAMERA_TYPE_BYTE   },
++    { "tnr5_22",                       ICAMERA_TYPE_BYTE   },
++    { "tnr5_25",                       ICAMERA_TYPE_BYTE   },
++};
++
++tag_info_t *icamera_tag_info[CAMERA_SECTION_COUNT] = {
++    camera_ae,
++    camera_awb,
++    camera_af,
++    camera_control,
++    camera_demosaic,
++    camera_edge,
++    camera_flash,
++    camera_flash_info,
++    camera_hot_pixel,
++    camera_jpeg,
++    camera_lens,
++    camera_lens_info,
++    camera_noise_reduction,
++    camera_request,
++    camera_scaler,
++    camera_sensor,
++    camera_sensor_info,
++    camera_shading,
++    camera_statistics,
++    camera_statistics_info,
++    camera_tonemap,
++    camera_led,
++    camera_info,
++    camera_black_level,
++    camera_sync,
++    camera_reprocess,
++    intel_info,
++    intel_control,
++    intel_control_isp,
++};
++
++int icamera_metadata_enum_snprint(uint32_t tag,
++                                  int32_t value,
++                                  char *dst,
++                                  size_t size) {
++    const char *msg = "error: not an enum";
++    int ret = -1;
++
++    switch(tag) {
++        case CAMERA_AE_MODE: {
++            switch (value) {
++                case CAMERA_AE_MODE_MANUAL:
++                    msg = "MANUAL";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AE_LOCK: {
++            switch (value) {
++                case CAMERA_AE_LOCK_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_LOCK_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AE_REGIONS: {
++            break;
++        }
++        case CAMERA_AE_ANTIBANDING_MODE: {
++            switch (value) {
++                case CAMERA_AE_ANTIBANDING_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_ANTIBANDING_MODE_50HZ:
++                    msg = "50HZ";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_ANTIBANDING_MODE_60HZ:
++                    msg = "60HZ";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_ANTIBANDING_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AE_COMPENSATION: {
++            break;
++        }
++        case CAMERA_AE_TARGET_FPS_RANGE: {
++            break;
++        }
++        case CAMERA_AE_PRECAPTURE_TRIGGER: {
++            switch (value) {
++                case CAMERA_AE_PRECAPTURE_TRIGGER_IDLE:
++                    msg = "IDLE";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_PRECAPTURE_TRIGGER_START:
++                    msg = "START";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AE_STATE: {
++            switch (value) {
++                case CAMERA_AE_STATE_INACTIVE:
++                    msg = "INACTIVE";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_STATE_SEARCHING:
++                    msg = "SEARCHING";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_STATE_CONVERGED:
++                    msg = "CONVERGED";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_STATE_LOCKED:
++                    msg = "LOCKED";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_STATE_FLASH_REQUIRED:
++                    msg = "FLASH_REQUIRED";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_STATE_PRECAPTURE:
++                    msg = "PRECAPTURE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AE_AVAILABLE_MODES: {
++            break;
++        }
++        case CAMERA_AE_AVAILABLE_ANTIBANDING_MODES: {
++            break;
++        }
++        case CAMERA_AE_COMPENSATION_STEP: {
++            break;
++        }
++        case CAMERA_AE_COMPENSATION_RANGE: {
++            break;
++        }
++        case CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES: {
++            break;
++        }
++        case CAMERA_AE_LOCK_AVAILABLE: {
++            switch (value) {
++                case CAMERA_AE_LOCK_AVAILABLE_FALSE:
++                    msg = "FALSE";
++                    ret = 0;
++                    break;
++                case CAMERA_AE_LOCK_AVAILABLE_TRUE:
++                    msg = "TRUE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_AWB_MODE: {
++            switch (value) {
++                case CAMERA_AWB_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_INCANDESCENT:
++                    msg = "INCANDESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_FLUORESCENT:
++                    msg = "FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_DAYLIGHT:
++                    msg = "DAYLIGHT";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_FULL_OVERCAST:
++                    msg = "FULL_OVERCAST";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_PARTLY_OVERCAST:
++                    msg = "PARTLY_OVERCAST";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_SUNSET:
++                    msg = "SUNSET";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_VIDEO_CONFERENCE:
++                    msg = "VIDEO_CONFERENCE";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_MANUAL_CCT_RANGE:
++                    msg = "MANUAL_CCT_RANGE";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_MANUAL_WHITE_POINT:
++                    msg = "MANUAL_WHITE_POINT";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_MANUAL_GAIN:
++                    msg = "MANUAL_GAIN";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM:
++                    msg = "MANUAL_COLOR_TRANSFORM";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AWB_COLOR_TRANSFORM: {
++            break;
++        }
++        case CAMERA_AWB_COLOR_GAINS: {
++            break;
++        }
++        case CAMERA_AWB_LOCK: {
++            switch (value) {
++                case CAMERA_AWB_LOCK_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_LOCK_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AWB_REGIONS: {
++            break;
++        }
++        case CAMERA_AWB_CCT_RANGE: {
++            break;
++        }
++        case CAMERA_AWB_GAINS: {
++            break;
++        }
++        case CAMERA_AWB_GAIN_SHIFT: {
++            break;
++        }
++        case CAMERA_AWB_WHITE_POINT: {
++            break;
++        }
++        case CAMERA_AWB_CONVERGE_SPEED: {
++            switch (value) {
++                case CAMERA_AWB_CONVERGE_SPEED_NORMAL:
++                    msg = "NORMAL";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_CONVERGE_SPEED_MID:
++                    msg = "MID";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_CONVERGE_SPEED_LOW:
++                    msg = "LOW";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AWB_CONVERGE_SPEED_MODE: {
++            switch (value) {
++                case CAMERA_AWB_CONVERGE_SPEED_MODE_HAL:
++                    msg = "HAL";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ:
++                    msg = "AIQ";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AWB_STATE: {
++            switch (value) {
++                case CAMERA_AWB_STATE_INACTIVE:
++                    msg = "INACTIVE";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_STATE_SEARCHING:
++                    msg = "SEARCHING";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_STATE_CONVERGED:
++                    msg = "CONVERGED";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_STATE_LOCKED:
++                    msg = "LOCKED";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AWB_RESULT: {
++            break;
++        }
++        case CAMERA_AWB_AVAILABLE_MODES: {
++            break;
++        }
++        case CAMERA_AWB_LOCK_AVAILABLE: {
++            switch (value) {
++                case CAMERA_AWB_LOCK_AVAILABLE_FALSE:
++                    msg = "FALSE";
++                    ret = 0;
++                    break;
++                case CAMERA_AWB_LOCK_AVAILABLE_TRUE:
++                    msg = "TRUE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_AF_MODE: {
++            switch (value) {
++                case CAMERA_AF_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_MODE_MACRO:
++                    msg = "MACRO";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_MODE_CONTINUOUS_VIDEO:
++                    msg = "CONTINUOUS_VIDEO";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_MODE_CONTINUOUS_PICTURE:
++                    msg = "CONTINUOUS_PICTURE";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_MODE_EDOF:
++                    msg = "EDOF";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AF_REGIONS: {
++            break;
++        }
++        case CAMERA_AF_TRIGGER: {
++            switch (value) {
++                case CAMERA_AF_TRIGGER_IDLE:
++                    msg = "IDLE";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_TRIGGER_START:
++                    msg = "START";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_TRIGGER_CANCEL:
++                    msg = "CANCEL";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_AF_AVAILABLE_MODES: {
++            break;
++        }
++        case CAMERA_AF_STATE: {
++            switch (value) {
++                case CAMERA_AF_STATE_INACTIVE:
++                    msg = "INACTIVE";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_PASSIVE_SCAN:
++                    msg = "PASSIVE_SCAN";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_PASSIVE_FOCUSED:
++                    msg = "PASSIVE_FOCUSED";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_ACTIVE_SCAN:
++                    msg = "ACTIVE_SCAN";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_FOCUSED_LOCKED:
++                    msg = "FOCUSED_LOCKED";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_NOT_FOCUSED_LOCKED:
++                    msg = "NOT_FOCUSED_LOCKED";
++                    ret = 0;
++                    break;
++                case CAMERA_AF_STATE_PASSIVE_UNFOCUSED:
++                    msg = "PASSIVE_UNFOCUSED";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_CONTROL_CAPTUREINTENT: {
++            switch (value) {
++                case CAMERA_CONTROL_CAPTUREINTENT_CUSTOM:
++                    msg = "CUSTOM";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_PREVIEW:
++                    msg = "PREVIEW";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_STILL_CAPTURE:
++                    msg = "STILL_CAPTURE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_VIDEO_RECORD:
++                    msg = "VIDEO_RECORD";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_VIDEO_SNAPSHOT:
++                    msg = "VIDEO_SNAPSHOT";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_ZERO_SHUTTER_LAG:
++                    msg = "ZERO_SHUTTER_LAG";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_MANUAL:
++                    msg = "MANUAL";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_CAPTUREINTENT_MOTION_TRACKING:
++                    msg = "MOTION_TRACKING";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_CONTROL_EFFECT_MODE: {
++            switch (value) {
++                case CAMERA_CONTROL_EFFECT_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_MONO:
++                    msg = "MONO";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_NEGATIVE:
++                    msg = "NEGATIVE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_SOLARIZE:
++                    msg = "SOLARIZE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_SEPIA:
++                    msg = "SEPIA";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_POSTERIZE:
++                    msg = "POSTERIZE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD:
++                    msg = "WHITEBOARD";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD:
++                    msg = "BLACKBOARD";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_EFFECT_MODE_AQUA:
++                    msg = "AQUA";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_CONTROL_MODE: {
++            switch (value) {
++                case CAMERA_CONTROL_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_MODE_USE_SCENE_MODE:
++                    msg = "USE_SCENE_MODE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_MODE_OFF_KEEP_STATE:
++                    msg = "OFF_KEEP_STATE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_CONTROL_SCENE_MODE: {
++            switch (value) {
++                case CAMERA_CONTROL_SCENE_MODE_DISABLED:
++                    msg = "DISABLED";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY:
++                    msg = "FACE_PRIORITY";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_ACTION:
++                    msg = "ACTION";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_PORTRAIT:
++                    msg = "PORTRAIT";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_LANDSCAPE:
++                    msg = "LANDSCAPE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_NIGHT:
++                    msg = "NIGHT";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
++                    msg = "NIGHT_PORTRAIT";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_THEATRE:
++                    msg = "THEATRE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_BEACH:
++                    msg = "BEACH";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_SNOW:
++                    msg = "SNOW";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_SUNSET:
++                    msg = "SUNSET";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO:
++                    msg = "STEADYPHOTO";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_FIREWORKS:
++                    msg = "FIREWORKS";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_SPORTS:
++                    msg = "SPORTS";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_PARTY:
++                    msg = "PARTY";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT:
++                    msg = "CANDLELIGHT";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_BARCODE:
++                    msg = "BARCODE";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO:
++                    msg = "HIGH_SPEED_VIDEO";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_SCENE_MODE_HDR:
++                    msg = "HDR";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE: {
++            switch (value) {
++                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_CONTROL_AVAILABLE_EFFECTS: {
++            break;
++        }
++        case CAMERA_CONTROL_AVAILABLE_MODES: {
++            break;
++        }
++        case CAMERA_CONTROL_AVAILABLE_SCENE_MODES: {
++            break;
++        }
++        case CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES: {
++            break;
++        }
++        case CAMERA_CONTROL_MAX_REGIONS: {
++            break;
++        }
++        case CAMERA_CONTROL_SCENE_MODE_OVERRIDES: {
++            break;
++        }
++        case CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS: {
++            break;
++        }
++
++        case CAMERA_DEMOSAIC_MODE: {
++            switch (value) {
++                case CAMERA_DEMOSAIC_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_DEMOSAIC_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_EDGE_MODE: {
++            switch (value) {
++                case CAMERA_EDGE_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_EDGE_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_EDGE_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                case CAMERA_EDGE_MODE_ZERO_SHUTTER_LAG:
++                    msg = "ZERO_SHUTTER_LAG";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_EDGE_STRENGTH: {
++            break;
++        }
++        case CAMERA_EDGE_AVAILABLE_EDGE_MODES: {
++            break;
++        }
++
++        case CAMERA_FLASH_FIRING_POWER: {
++            break;
++        }
++        case CAMERA_FLASH_FIRING_TIME: {
++            break;
++        }
++        case CAMERA_FLASH_MODE: {
++            switch (value) {
++                case CAMERA_FLASH_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_MODE_SINGLE:
++                    msg = "SINGLE";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_MODE_TORCH:
++                    msg = "TORCH";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_FLASH_COLOR_TEMPERATURE: {
++            break;
++        }
++        case CAMERA_FLASH_MAX_ENERGY: {
++            break;
++        }
++        case CAMERA_FLASH_STATE: {
++            switch (value) {
++                case CAMERA_FLASH_STATE_UNAVAILABLE:
++                    msg = "UNAVAILABLE";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_STATE_CHARGING:
++                    msg = "CHARGING";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_STATE_READY:
++                    msg = "READY";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_STATE_FIRED:
++                    msg = "FIRED";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_STATE_PARTIAL:
++                    msg = "PARTIAL";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_FLASH_INFO_AVAILABLE: {
++            switch (value) {
++                case CAMERA_FLASH_INFO_AVAILABLE_FALSE:
++                    msg = "FALSE";
++                    ret = 0;
++                    break;
++                case CAMERA_FLASH_INFO_AVAILABLE_TRUE:
++                    msg = "TRUE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_FLASH_INFO_CHARGE_DURATION: {
++            break;
++        }
++
++        case CAMERA_HOT_PIXEL_MODE: {
++            switch (value) {
++                case CAMERA_HOT_PIXEL_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_HOT_PIXEL_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES: {
++            break;
++        }
++
++        case CAMERA_JPEG_GPS_COORDINATES: {
++            break;
++        }
++        case CAMERA_JPEG_GPS_PROCESSING_METHOD: {
++            break;
++        }
++        case CAMERA_JPEG_GPS_TIMESTAMP: {
++            break;
++        }
++        case CAMERA_JPEG_ORIENTATION: {
++            break;
++        }
++        case CAMERA_JPEG_QUALITY: {
++            break;
++        }
++        case CAMERA_JPEG_THUMBNAIL_QUALITY: {
++            break;
++        }
++        case CAMERA_JPEG_THUMBNAIL_SIZE: {
++            break;
++        }
++        case CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES: {
++            break;
++        }
++        case CAMERA_JPEG_MAX_SIZE: {
++            break;
++        }
++        case CAMERA_JPEG_SIZE: {
++            break;
++        }
++
++        case CAMERA_LENS_APERTURE: {
++            break;
++        }
++        case CAMERA_LENS_FILTER_DENSITY: {
++            break;
++        }
++        case CAMERA_LENS_FOCAL_LENGTH: {
++            break;
++        }
++        case CAMERA_LENS_FOCUS_DISTANCE: {
++            break;
++        }
++        case CAMERA_LENS_OPTICAL_STABILIZATION_MODE: {
++            switch (value) {
++                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_LENS_FACING: {
++            switch (value) {
++                case CAMERA_LENS_FACING_FRONT:
++                    msg = "FRONT";
++                    ret = 0;
++                    break;
++                case CAMERA_LENS_FACING_BACK:
++                    msg = "BACK";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_LENS_FOCUS_RANGE: {
++            break;
++        }
++        case CAMERA_LENS_STATE: {
++            switch (value) {
++                case CAMERA_LENS_STATE_STATIONARY:
++                    msg = "STATIONARY";
++                    ret = 0;
++                    break;
++                case CAMERA_LENS_STATE_MOVING:
++                    msg = "MOVING";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_LENS_INFO_AVAILABLE_APERTURES: {
++            break;
++        }
++        case CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES: {
++            break;
++        }
++        case CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS: {
++            break;
++        }
++        case CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION: {
++            break;
++        }
++        case CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE: {
++            break;
++        }
++        case CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE: {
++            break;
++        }
++        case CAMERA_LENS_INFO_SHADING_MAP_SIZE: {
++            break;
++        }
++        case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION: {
++            switch (value) {
++                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED:
++                    msg = "UNCALIBRATED";
++                    ret = 0;
++                    break;
++                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE:
++                    msg = "APPROXIMATE";
++                    ret = 0;
++                    break;
++                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED:
++                    msg = "CALIBRATED";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_NOISE_REDUCTION_MODE: {
++            switch (value) {
++                case CAMERA_NOISE_REDUCTION_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_NOISE_REDUCTION_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                case CAMERA_NOISE_REDUCTION_MODE_MINIMAL:
++                    msg = "MINIMAL";
++                    ret = 0;
++                    break;
++                case CAMERA_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG:
++                    msg = "ZERO_SHUTTER_LAG";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_NOISE_REDUCTION_STRENGTH: {
++            break;
++        }
++        case CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES: {
++            break;
++        }
++
++        case CAMERA_REQUEST_ID: {
++            break;
++        }
++        case CAMERA_REQUEST_METADATA_MODE: {
++            switch (value) {
++                case CAMERA_REQUEST_METADATA_MODE_NONE:
++                    msg = "NONE";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_METADATA_MODE_FULL:
++                    msg = "FULL";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS: {
++            break;
++        }
++        case CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS: {
++            break;
++        }
++        case CAMERA_REQUEST_PIPELINE_DEPTH: {
++            break;
++        }
++        case CAMERA_REQUEST_PIPELINE_MAX_DEPTH: {
++            break;
++        }
++        case CAMERA_REQUEST_PARTIAL_RESULT_COUNT: {
++            break;
++        }
++        case CAMERA_REQUEST_AVAILABLE_CAPABILITIES: {
++            switch (value) {
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
++                    msg = "BACKWARD_COMPATIBLE";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
++                    msg = "MANUAL_SENSOR";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
++                    msg = "MANUAL_POST_PROCESSING";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW:
++                    msg = "RAW";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL:
++                    msg = "ZSL";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:
++                    msg = "READ_SENSOR_SETTINGS";
++                    ret = 0;
++                    break;
++                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:
++                    msg = "BURST_CAPTURE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS: {
++            break;
++        }
++        case CAMERA_REQUEST_AVAILABLE_RESULT_KEYS: {
++            break;
++        }
++        case CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: {
++            break;
++        }
++
++        case CAMERA_SCALER_CROP_REGION: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_JPEG_SIZES: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS: {
++            break;
++        }
++        case CAMERA_SCALER_AVAILABLE_STALL_DURATIONS: {
++            break;
++        }
++        case CAMERA_SCALER_CROPPING_TYPE: {
++            switch (value) {
++                case CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY:
++                    msg = "CENTER_ONLY";
++                    ret = 0;
++                    break;
++                case CAMERA_SCALER_CROPPING_TYPE_FREEFORM:
++                    msg = "FREEFORM";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_SENSOR_EXPOSURE_TIME: {
++            break;
++        }
++        case CAMERA_SENSOR_FRAME_DURATION: {
++            break;
++        }
++        case CAMERA_SENSOR_SENSITIVITY: {
++            break;
++        }
++        case CAMERA_SENSOR_REFERENCE_ILLUMINANT1: {
++            switch (value) {
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT:
++                    msg = "DAYLIGHT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT:
++                    msg = "FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN:
++                    msg = "TUNGSTEN";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH:
++                    msg = "FLASH";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER:
++                    msg = "FINE_WEATHER";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER:
++                    msg = "CLOUDY_WEATHER";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE:
++                    msg = "SHADE";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT:
++                    msg = "DAYLIGHT_FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT:
++                    msg = "DAY_WHITE_FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT:
++                    msg = "COOL_WHITE_FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT:
++                    msg = "WHITE_FLUORESCENT";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A:
++                    msg = "STANDARD_A";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B:
++                    msg = "STANDARD_B";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C:
++                    msg = "STANDARD_C";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55:
++                    msg = "D55";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65:
++                    msg = "D65";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75:
++                    msg = "D75";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50:
++                    msg = "D50";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN:
++                    msg = "ISO_STUDIO_TUNGSTEN";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_SENSOR_REFERENCE_ILLUMINANT2: {
++            break;
++        }
++        case CAMERA_SENSOR_CALIBRATION_TRANSFORM1: {
++            break;
++        }
++        case CAMERA_SENSOR_CALIBRATION_TRANSFORM2: {
++            break;
++        }
++        case CAMERA_SENSOR_COLOR_TRANSFORM1: {
++            break;
++        }
++        case CAMERA_SENSOR_COLOR_TRANSFORM2: {
++            break;
++        }
++        case CAMERA_SENSOR_FORWARD_MATRIX1: {
++            break;
++        }
++        case CAMERA_SENSOR_FORWARD_MATRIX2: {
++            break;
++        }
++        case CAMERA_SENSOR_BASE_GAIN_FACTOR: {
++            break;
++        }
++        case CAMERA_SENSOR_BLACK_LEVEL_PATTERN: {
++            break;
++        }
++        case CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY: {
++            break;
++        }
++        case CAMERA_SENSOR_ORIENTATION: {
++            break;
++        }
++        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS: {
++            break;
++        }
++        case CAMERA_SENSOR_TIMESTAMP: {
++            break;
++        }
++        case CAMERA_SENSOR_TEMPERATURE: {
++            break;
++        }
++        case CAMERA_SENSOR_NEUTRAL_COLOR_POINT: {
++            break;
++        }
++        case CAMERA_SENSOR_NOISE_PROFILE: {
++            break;
++        }
++        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP: {
++            break;
++        }
++        case CAMERA_SENSOR_PROFILE_TONE_CURVE: {
++            break;
++        }
++        case CAMERA_SENSOR_GREEN_SPLIT: {
++            break;
++        }
++        case CAMERA_SENSOR_TEST_PATTERN_DATA: {
++            break;
++        }
++        case CAMERA_SENSOR_TEST_PATTERN_MODE: {
++            switch (value) {
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR:
++                    msg = "SOLID_COLOR";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS:
++                    msg = "COLOR_BARS";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY:
++                    msg = "COLOR_BARS_FADE_TO_GRAY";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_PN9:
++                    msg = "PN9";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1:
++                    msg = "CUSTOM1";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES: {
++            break;
++        }
++        case CAMERA_SENSOR_OPAQUE_RAW_SIZE: {
++            break;
++        }
++        case CAMERA_SENSOR_ROLLING_SHUTTER_SKEW: {
++            break;
++        }
++
++        case CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_SENSITIVITY_RANGE: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT: {
++            switch (value) {
++                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB:
++                    msg = "RGGB";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG:
++                    msg = "GRBG";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG:
++                    msg = "GBRG";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR:
++                    msg = "BGGR";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB:
++                    msg = "RGB";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_MAX_FRAME_DURATION: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_PHYSICAL_SIZE: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_WHITE_LEVEL: {
++            break;
++        }
++        case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE: {
++            switch (value) {
++                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN:
++                    msg = "UNKNOWN";
++                    ret = 0;
++                    break;
++                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME:
++                    msg = "REALTIME";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_SHADING_MODE: {
++            switch (value) {
++                case CAMERA_SHADING_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_SHADING_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_SHADING_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_SHADING_STRENGTH: {
++            break;
++        }
++        case CAMERA_SHADING_AVAILABLE_MODES: {
++            break;
++        }
++
++        case CAMERA_STATISTICS_FACE_DETECT_MODE: {
++            switch (value) {
++                case CAMERA_STATISTICS_FACE_DETECT_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE:
++                    msg = "SIMPLE";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_FACE_DETECT_MODE_FULL:
++                    msg = "FULL";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_STATISTICS_HISTOGRAM_MODE: {
++            switch (value) {
++                case CAMERA_STATISTICS_HISTOGRAM_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_HISTOGRAM_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_STATISTICS_SHARPNESS_MAP_MODE: {
++            switch (value) {
++                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE: {
++            switch (value) {
++                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_STATISTICS_FACE_IDS: {
++            break;
++        }
++        case CAMERA_STATISTICS_FACE_LANDMARKS: {
++            break;
++        }
++        case CAMERA_STATISTICS_FACE_RECTANGLES: {
++            break;
++        }
++        case CAMERA_STATISTICS_FACE_SCORES: {
++            break;
++        }
++        case CAMERA_STATISTICS_HISTOGRAM: {
++            break;
++        }
++        case CAMERA_STATISTICS_SHARPNESS_MAP: {
++            break;
++        }
++        case CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP: {
++            break;
++        }
++        case CAMERA_STATISTICS_LENS_SHADING_MAP: {
++            break;
++        }
++        case CAMERA_STATISTICS_PREDICTED_COLOR_GAINS: {
++            break;
++        }
++        case CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM: {
++            break;
++        }
++        case CAMERA_STATISTICS_SCENE_FLICKER: {
++            switch (value) {
++                case CAMERA_STATISTICS_SCENE_FLICKER_NONE:
++                    msg = "NONE";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_SCENE_FLICKER_50HZ:
++                    msg = "50HZ";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_SCENE_FLICKER_60HZ:
++                    msg = "60HZ";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_STATISTICS_HOT_PIXEL_MAP: {
++            break;
++        }
++        case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE: {
++            switch (value) {
++                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_MAX_FACE_COUNT: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE: {
++            break;
++        }
++        case CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES: {
++            break;
++        }
++
++        case CAMERA_TONEMAP_CURVE_BLUE: {
++            break;
++        }
++        case CAMERA_TONEMAP_CURVE_GREEN: {
++            break;
++        }
++        case CAMERA_TONEMAP_CURVE_RED: {
++            break;
++        }
++        case CAMERA_TONEMAP_MODE: {
++            switch (value) {
++                case CAMERA_TONEMAP_MODE_CONTRAST_CURVE:
++                    msg = "CONTRAST_CURVE";
++                    ret = 0;
++                    break;
++                case CAMERA_TONEMAP_MODE_FAST:
++                    msg = "FAST";
++                    ret = 0;
++                    break;
++                case CAMERA_TONEMAP_MODE_HIGH_QUALITY:
++                    msg = "HIGH_QUALITY";
++                    ret = 0;
++                    break;
++                case CAMERA_TONEMAP_MODE_GAMMA_VALUE:
++                    msg = "GAMMA_VALUE";
++                    ret = 0;
++                    break;
++                case CAMERA_TONEMAP_MODE_PRESET_CURVE:
++                    msg = "PRESET_CURVE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_TONEMAP_MAX_CURVE_POINTS: {
++            break;
++        }
++        case CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES: {
++            break;
++        }
++        case CAMERA_TONEMAP_GAMMA: {
++            break;
++        }
++        case CAMERA_TONEMAP_PRESET_CURVE: {
++            switch (value) {
++                case CAMERA_TONEMAP_PRESET_CURVE_SRGB:
++                    msg = "SRGB";
++                    ret = 0;
++                    break;
++                case CAMERA_TONEMAP_PRESET_CURVE_REC709:
++                    msg = "REC709";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_LED_TRANSMIT: {
++            switch (value) {
++                case CAMERA_LED_TRANSMIT_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_LED_TRANSMIT_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_LED_AVAILABLE_LEDS: {
++            switch (value) {
++                case CAMERA_LED_AVAILABLE_LEDS_TRANSMIT:
++                    msg = "TRANSMIT";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL: {
++            switch (value) {
++                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
++                    msg = "LIMITED";
++                    ret = 0;
++                    break;
++                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
++                    msg = "FULL";
++                    ret = 0;
++                    break;
++                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
++                    msg = "LEGACY";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_BLACK_LEVEL_LOCK: {
++            switch (value) {
++                case CAMERA_BLACK_LEVEL_LOCK_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case CAMERA_BLACK_LEVEL_LOCK_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_SYNC_FRAME_NUMBER: {
++            switch (value) {
++                case CAMERA_SYNC_FRAME_NUMBER_CONVERGING:
++                    msg = "CONVERGING";
++                    ret = 0;
++                    break;
++                case CAMERA_SYNC_FRAME_NUMBER_UNKNOWN:
++                    msg = "UNKNOWN";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case CAMERA_SYNC_MAX_LATENCY: {
++            switch (value) {
++                case CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL:
++                    msg = "PER_FRAME_CONTROL";
++                    ret = 0;
++                    break;
++                case CAMERA_SYNC_MAX_LATENCY_UNKNOWN:
++                    msg = "UNKNOWN";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case CAMERA_REPROCESS_MAX_CAPTURE_STALL: {
++            break;
++        }
++
++        case INTEL_INFO_AVAILABLE_CONFIGURATIONS: {
++            break;
++        }
++        case INTEL_INFO_AVAILABLE_FEATURES: {
++            switch (value) {
++                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE:
++                    msg = "MANUAL_EXPOSURE";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE:
++                    msg = "MANUAL_WHITE_BALANCE";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT:
++                    msg = "IMAGE_ENHANCEMENT";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION:
++                    msg = "NOISE_REDUCTION";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE:
++                    msg = "SCENE_MODE";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE:
++                    msg = "WEIGHT_GRID_MODE";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL:
++                    msg = "PER_FRAME_CONTROL";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL:
++                    msg = "ISP_CONTROL";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_INFO_AE_EXPOSURE_TIME_RANGE: {
++            break;
++        }
++        case INTEL_INFO_AE_GAIN_RANGE: {
++            break;
++        }
++        case INTEL_INFO_WFOV: {
++            switch (value) {
++                case INTEL_INFO_WFOV_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_WFOV_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_INFO_SENSOR_MOUNT_TYPE: {
++            switch (value) {
++                case INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED:
++                    msg = "WALL_MOUNTED";
++                    ret = 0;
++                    break;
++                case INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER:
++                    msg = "CEILING_MOUNTER";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++
++        case INTEL_CONTROL_IMAGE_ENHANCEMENT: {
++            break;
++        }
++        case INTEL_CONTROL_SENSITIVITY_GAIN: {
++            break;
++        }
++        case INTEL_CONTROL_FRAME_RATE: {
++            break;
++        }
++        case INTEL_CONTROL_AE_CONVERGE_SPEED: {
++            switch (value) {
++                case INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL:
++                    msg = "NORMAL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_CONVERGE_SPEED_MID:
++                    msg = "MID";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_CONVERGE_SPEED_LOW:
++                    msg = "LOW";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_NR_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_NR_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_NR_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_NR_MODE_MANUAL_NORMAL:
++                    msg = "MANUAL_NORMAL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_NR_MODE_MANUAL_EXPERT:
++                    msg = "MANUAL_EXPERT";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_NR_LEVEL: {
++            break;
++        }
++        case INTEL_CONTROL_IRIS_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_IRIS_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_IRIS_MODE_MANUAL:
++                    msg = "MANUAL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_IRIS_MODE_CUSTOMIZED:
++                    msg = "CUSTOMIZED";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY: {
++            switch (value) {
++                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER:
++                    msg = "SHUTTER";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO:
++                    msg = "ISO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE:
++                    msg = "APERTURE";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_IRIS_LEVEL: {
++            break;
++        }
++        case INTEL_CONTROL_WDR_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_WDR_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_WDR_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_WDR_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_WDR_LEVEL: {
++            break;
++        }
++        case INTEL_CONTROL_BLC_AREA_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_BLC_AREA_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_BLC_AREA_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_SCENE_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_SCENE_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_SCENE_MODE_HDR:
++                    msg = "HDR";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_SCENE_MODE_ULL:
++                    msg = "ULL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_SCENE_MODE_VIDEO_LL:
++                    msg = "VIDEO_LL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_SCENE_MODE_HDR2:
++                    msg = "HDR2";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_WEIGHT_GRID_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO:
++                    msg = "AUTO";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1:
++                    msg = "CUSTOM_WEIGHT_GRID1";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2:
++                    msg = "CUSTOM_WEIGHT_GRID2";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3:
++                    msg = "CUSTOM_WEIGHT_GRID3";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL:
++                    msg = "HAL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ:
++                    msg = "AIQ";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_DEINTERLACE_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_DEINTERLACE_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_DEINTERLACE_MODE_WEAVING:
++                    msg = "WEAVING";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_MAKERNOTE_DATA: {
++            break;
++        }
++        case INTEL_CONTROL_CUSTOM_AIC_PARAM: {
++            break;
++        }
++        case INTEL_CONTROL_MAKERNOTE_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_MAKERNOTE_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_MAKERNOTE_MODE_JPEG:
++                    msg = "JPEG";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_MAKERNOTE_MODE_RAW:
++                    msg = "RAW";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_YUV_COLOR_RANGE: {
++            switch (value) {
++                case INTEL_CONTROL_YUV_COLOR_RANGE_FULL:
++                    msg = "FULL";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED:
++                    msg = "REDUCED";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_SENSITIVITY_GAIN_RANGE: {
++            break;
++        }
++        case INTEL_CONTROL_EXPOSURE_TIME_RANGE: {
++            break;
++        }
++        case INTEL_CONTROL_FISHEYE_DEWARPING_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW:
++                    msg = "REARVIEW";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW:
++                    msg = "HITCHVIEW";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_LTM_TUNING_DATA: {
++            break;
++        }
++        case INTEL_CONTROL_DIGITAL_ZOOM_RATIO: {
++            break;
++        }
++        case INTEL_CONTROL_LDC_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_LDC_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_LDC_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_RSC_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_RSC_MODE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_RSC_MODE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_FLIP_MODE: {
++            switch (value) {
++                case INTEL_CONTROL_FLIP_MODE_NONE:
++                    msg = "NONE";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_FLIP_MODE_VFLIP:
++                    msg = "VFLIP";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_FLIP_MODE_HFLIP:
++                    msg = "HFLIP";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_FLIP_MODE_VHFLIP:
++                    msg = "VHFLIP";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_MONO_DOWNSCALE: {
++            switch (value) {
++                case INTEL_CONTROL_MONO_DOWNSCALE_OFF:
++                    msg = "OFF";
++                    ret = 0;
++                    break;
++                case INTEL_CONTROL_MONO_DOWNSCALE_ON:
++                    msg = "ON";
++                    ret = 0;
++                    break;
++                default:
++                    msg = "error: enum value out of range";
++            }
++            break;
++        }
++        case INTEL_CONTROL_RUN3_A_CADENCE: {
++            break;
++        }
++        case INTEL_CONTROL_VIEW_PROJECTION: {
++            break;
++        }
++        case INTEL_CONTROL_VIEW_ROTATION: {
++            break;
++        }
++        case INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS: {
++            break;
++        }
++        case INTEL_CONTROL_CAMERA_ROTATION: {
++            break;
++        }
++        case INTEL_CONTROL_SCALER_CROP_REGION: {
++            break;
++        }
++
++        case INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_ENABLED_CTRL_IDS: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_WB_GAINS: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_BXT_CSC: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_BXT_DEMOSAIC: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_SC_IEFD: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_SEE: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_BNLM: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_TNR5_21: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_XNR_DSS: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_GAMMA_TONE_MAP: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_TNR5_22: {
++            break;
++        }
++        case INTEL_CONTROL_ISP_TNR5_25: {
++            break;
++        }
++
++    }
++
++    snprintf(dst, size, "%s", msg);
++    dst[size - 1] = '\0';
++
++    return ret;
++}
++
++#define ICAMERA_METADATA_ENUM_STRING_MAX_SIZE 24
+diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
+new file mode 100644
+index 000000000000..f8223c898db9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
+@@ -0,0 +1,1019 @@
++/*
++ * Copyright (C) 2012 The Android Open Source Project
++ * Copyright (C) 2015-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ * !! Do not include this file directly !!
++ *
++ * Include icamera_metadata_base.h instead.
++ */
++
++/**
++ * ! Do not edit this file directly !
++ *
++ * Generated automatically from icamera_metadata_tags.mako
++ */
++
++/**
++ * Top level hierarchy definitions for camera metadata. *_INFO sections are for
++ * the static metadata that can be retrived without opening the camera device.
++ * New sections must be added right before CAMERA_SECTION_COUNT to maintain
++ * existing enumerations.
++ */
++typedef enum icamera_metadata_section {
++    CAMERA_AE,
++    CAMERA_AWB,
++    CAMERA_AF,
++    CAMERA_CONTROL,
++    CAMERA_DEMOSAIC,
++    CAMERA_EDGE,
++    CAMERA_FLASH,
++    CAMERA_FLASH_INFO,
++    CAMERA_HOT_PIXEL,
++    CAMERA_JPEG,
++    CAMERA_LENS,
++    CAMERA_LENS_INFO,
++    CAMERA_NOISE_REDUCTION,
++    CAMERA_REQUEST,
++    CAMERA_SCALER,
++    CAMERA_SENSOR,
++    CAMERA_SENSOR_INFO,
++    CAMERA_SHADING,
++    CAMERA_STATISTICS,
++    CAMERA_STATISTICS_INFO,
++    CAMERA_TONEMAP,
++    CAMERA_LED,
++    CAMERA_INFO,
++    CAMERA_BLACK_LEVEL,
++    CAMERA_SYNC,
++    CAMERA_REPROCESS,
++    INTEL_INFO,
++    INTEL_CONTROL,
++    INTEL_CONTROL_ISP,
++    CAMERA_SECTION_COUNT
++} icamera_metadata_section_t;
++
++/**
++ * Hierarchy positions in enum space.
++ */
++typedef enum icamera_metadata_section_start {
++    CAMERA_AE_START                = CAMERA_AE                 << 16,
++    CAMERA_AWB_START               = CAMERA_AWB                << 16,
++    CAMERA_AF_START                = CAMERA_AF                 << 16,
++    CAMERA_CONTROL_START           = CAMERA_CONTROL            << 16,
++    CAMERA_DEMOSAIC_START          = CAMERA_DEMOSAIC           << 16,
++    CAMERA_EDGE_START              = CAMERA_EDGE               << 16,
++    CAMERA_FLASH_START             = CAMERA_FLASH              << 16,
++    CAMERA_FLASH_INFO_START        = CAMERA_FLASH_INFO         << 16,
++    CAMERA_HOT_PIXEL_START         = CAMERA_HOT_PIXEL          << 16,
++    CAMERA_JPEG_START              = CAMERA_JPEG               << 16,
++    CAMERA_LENS_START              = CAMERA_LENS               << 16,
++    CAMERA_LENS_INFO_START         = CAMERA_LENS_INFO          << 16,
++    CAMERA_NOISE_REDUCTION_START   = CAMERA_NOISE_REDUCTION    << 16,
++    CAMERA_REQUEST_START           = CAMERA_REQUEST            << 16,
++    CAMERA_SCALER_START            = CAMERA_SCALER             << 16,
++    CAMERA_SENSOR_START            = CAMERA_SENSOR             << 16,
++    CAMERA_SENSOR_INFO_START       = CAMERA_SENSOR_INFO        << 16,
++    CAMERA_SHADING_START           = CAMERA_SHADING            << 16,
++    CAMERA_STATISTICS_START        = CAMERA_STATISTICS         << 16,
++    CAMERA_STATISTICS_INFO_START   = CAMERA_STATISTICS_INFO    << 16,
++    CAMERA_TONEMAP_START           = CAMERA_TONEMAP            << 16,
++    CAMERA_LED_START               = CAMERA_LED                << 16,
++    CAMERA_INFO_START              = CAMERA_INFO               << 16,
++    CAMERA_BLACK_LEVEL_START       = CAMERA_BLACK_LEVEL        << 16,
++    CAMERA_SYNC_START              = CAMERA_SYNC               << 16,
++    CAMERA_REPROCESS_START         = CAMERA_REPROCESS          << 16,
++    INTEL_INFO_START               = INTEL_INFO                << 16,
++    INTEL_CONTROL_START            = INTEL_CONTROL             << 16,
++    INTEL_CONTROL_ISP_START        = INTEL_CONTROL_ISP         << 16,
++} icamera_metadata_section_start_t;
++
++/**
++ * Main enum for defining camera metadata tags.  New entries must always go
++ * before the section _END tag to preserve existing enumeration values.  In
++ * addition, the name and type of the tag needs to be added to
++ * src/metadata/icamera_metadata_tag_info.c
++ */
++typedef enum icamera_metadata_tag {
++    CAMERA_AE_MODE =                                  // enum         | public
++            CAMERA_AE_START,
++    CAMERA_AE_LOCK,                                   // enum         | public
++    CAMERA_AE_REGIONS,                                // int32[]      | public
++    CAMERA_AE_ANTIBANDING_MODE,                       // enum         | public
++    CAMERA_AE_COMPENSATION,                           // int32        | public
++    CAMERA_AE_TARGET_FPS_RANGE,                       // float[]      | public
++    CAMERA_AE_PRECAPTURE_TRIGGER,                     // enum         | public
++    CAMERA_AE_STATE,                                  // enum         | public
++    CAMERA_AE_AVAILABLE_MODES,                        // byte[]       | public
++    CAMERA_AE_AVAILABLE_ANTIBANDING_MODES,            // byte[]       | public
++    CAMERA_AE_COMPENSATION_STEP,                      // rational     | public
++    CAMERA_AE_COMPENSATION_RANGE,                     // int32[]      | public
++    CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES,            // float[]      | public
++    CAMERA_AE_LOCK_AVAILABLE,                         // enum         | public
++    CAMERA_AE_END,
++
++    CAMERA_AWB_MODE =                                 // enum         | public
++            CAMERA_AWB_START,
++    CAMERA_AWB_COLOR_TRANSFORM,                       // float[]      | public
++    CAMERA_AWB_COLOR_GAINS,                           // float[]      | public
++    CAMERA_AWB_LOCK,                                  // enum         | public
++    CAMERA_AWB_REGIONS,                               // int32[]      | public
++    CAMERA_AWB_CCT_RANGE,                             // int32[]      | public
++    CAMERA_AWB_GAINS,                                 // int32[]      | public
++    CAMERA_AWB_GAIN_SHIFT,                            // int32[]      | public
++    CAMERA_AWB_WHITE_POINT,                           // int32[]      | public
++    CAMERA_AWB_CONVERGE_SPEED,                        // enum         | public
++    CAMERA_AWB_CONVERGE_SPEED_MODE,                   // enum         | public
++    CAMERA_AWB_STATE,                                 // enum         | public
++    CAMERA_AWB_RESULT,                                // byte[]       | public
++    CAMERA_AWB_AVAILABLE_MODES,                       // byte[]       | public
++    CAMERA_AWB_LOCK_AVAILABLE,                        // enum         | public
++    CAMERA_AWB_END,
++
++    CAMERA_AF_MODE =                                  // enum         | public
++            CAMERA_AF_START,
++    CAMERA_AF_REGIONS,                                // int32[]      | public
++    CAMERA_AF_TRIGGER,                                // enum         | public
++    CAMERA_AF_AVAILABLE_MODES,                        // byte[]       | public
++    CAMERA_AF_STATE,                                  // enum         | public
++    CAMERA_AF_END,
++
++    CAMERA_CONTROL_CAPTUREINTENT =                    // enum         | public
++            CAMERA_CONTROL_START,
++    CAMERA_CONTROL_EFFECT_MODE,                       // enum         | public
++    CAMERA_CONTROL_MODE,                              // enum         | public
++    CAMERA_CONTROL_SCENE_MODE,                        // enum         | public
++    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE,          // enum         | public
++    CAMERA_CONTROL_AVAILABLE_EFFECTS,                 // byte[]       | public
++    CAMERA_CONTROL_AVAILABLE_MODES,                   // byte[]       | public
++    CAMERA_CONTROL_AVAILABLE_SCENE_MODES,             // byte[]       | public
++    CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
++                                                      // byte[]       | public
++    CAMERA_CONTROL_MAX_REGIONS,                       // int32[]      | hidden
++    CAMERA_CONTROL_SCENE_MODE_OVERRIDES,              // byte[]       | system
++    CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS,
++                                                      // int32[]      | hidden
++    CAMERA_CONTROL_END,
++
++    CAMERA_DEMOSAIC_MODE =                            // enum         | system
++            CAMERA_DEMOSAIC_START,
++    CAMERA_DEMOSAIC_END,
++
++    CAMERA_EDGE_MODE =                                // enum         | public
++            CAMERA_EDGE_START,
++    CAMERA_EDGE_STRENGTH,                             // byte         | system
++    CAMERA_EDGE_AVAILABLE_EDGE_MODES,                 // byte[]       | public
++    CAMERA_EDGE_END,
++
++    CAMERA_FLASH_FIRING_POWER =                       // byte         | system
++            CAMERA_FLASH_START,
++    CAMERA_FLASH_FIRING_TIME,                         // int64        | system
++    CAMERA_FLASH_MODE,                                // enum         | public
++    CAMERA_FLASH_COLOR_TEMPERATURE,                   // byte         | system
++    CAMERA_FLASH_MAX_ENERGY,                          // byte         | system
++    CAMERA_FLASH_STATE,                               // enum         | public
++    CAMERA_FLASH_END,
++
++    CAMERA_FLASH_INFO_AVAILABLE =                     // enum         | public
++            CAMERA_FLASH_INFO_START,
++    CAMERA_FLASH_INFO_CHARGE_DURATION,                // int64        | system
++    CAMERA_FLASH_INFO_END,
++
++    CAMERA_HOT_PIXEL_MODE =                           // enum         | public
++            CAMERA_HOT_PIXEL_START,
++    CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,       // byte[]       | public
++    CAMERA_HOT_PIXEL_END,
++
++    CAMERA_JPEG_GPS_COORDINATES =                     // double[]     | hidden
++            CAMERA_JPEG_START,
++    CAMERA_JPEG_GPS_PROCESSING_METHOD,                // byte         | hidden
++    CAMERA_JPEG_GPS_TIMESTAMP,                        // int64        | hidden
++    CAMERA_JPEG_ORIENTATION,                          // int32        | public
++    CAMERA_JPEG_QUALITY,                              // byte         | public
++    CAMERA_JPEG_THUMBNAIL_QUALITY,                    // byte         | public
++    CAMERA_JPEG_THUMBNAIL_SIZE,                       // int32[]      | public
++    CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES,            // int32[]      | public
++    CAMERA_JPEG_MAX_SIZE,                             // int32        | system
++    CAMERA_JPEG_SIZE,                                 // int32        | system
++    CAMERA_JPEG_END,
++
++    CAMERA_LENS_APERTURE =                            // float        | public
++            CAMERA_LENS_START,
++    CAMERA_LENS_FILTER_DENSITY,                       // float        | public
++    CAMERA_LENS_FOCAL_LENGTH,                         // float        | public
++    CAMERA_LENS_FOCUS_DISTANCE,                       // float        | public
++    CAMERA_LENS_OPTICAL_STABILIZATION_MODE,           // enum         | public
++    CAMERA_LENS_FACING,                               // enum         | public
++    CAMERA_LENS_FOCUS_RANGE,                          // float[]      | public
++    CAMERA_LENS_STATE,                                // enum         | public
++    CAMERA_LENS_END,
++
++    CAMERA_LENS_INFO_AVAILABLE_APERTURES =            // float[]      | public
++            CAMERA_LENS_INFO_START,
++    CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES,      // float[]      | public
++    CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,         // float[]      | public
++    CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, // byte[]       | public
++    CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE,             // float        | public
++    CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE,          // float        | public
++    CAMERA_LENS_INFO_SHADING_MAP_SIZE,                // int32[]      | hidden
++    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,      // enum         | public
++    CAMERA_LENS_INFO_END,
++
++    CAMERA_NOISE_REDUCTION_MODE =                     // enum         | public
++            CAMERA_NOISE_REDUCTION_START,
++    CAMERA_NOISE_REDUCTION_STRENGTH,                  // byte         | system
++    CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
++                                                      // byte[]       | public
++    CAMERA_NOISE_REDUCTION_END,
++
++    CAMERA_REQUEST_ID =                               // int32        | hidden
++            CAMERA_REQUEST_START,
++    CAMERA_REQUEST_METADATA_MODE,                     // enum         | system
++    CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS,            // int32[]      | hidden
++    CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS,             // int32        | hidden
++    CAMERA_REQUEST_PIPELINE_DEPTH,                    // byte         | public
++    CAMERA_REQUEST_PIPELINE_MAX_DEPTH,                // byte         | public
++    CAMERA_REQUEST_PARTIAL_RESULT_COUNT,              // int32        | public
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES,            // enum[]       | public
++    CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS,            // int32[]      | hidden
++    CAMERA_REQUEST_AVAILABLE_RESULT_KEYS,             // int32[]      | hidden
++    CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,    // int32[]      | hidden
++    CAMERA_REQUEST_END,
++
++    CAMERA_SCALER_CROP_REGION =                       // int32[]      | public
++            CAMERA_SCALER_START,
++    CAMERA_SCALER_AVAILABLE_JPEG_SIZES,               // int32[]      | hidden
++    CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,         // float        | public
++    CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, // int32[]      | hidden
++    CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,    // int32[]      | hidden
++    CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,      // int64[]      | hidden
++    CAMERA_SCALER_AVAILABLE_STALL_DURATIONS,          // int64[]      | hidden
++    CAMERA_SCALER_CROPPING_TYPE,                      // enum         | public
++    CAMERA_SCALER_END,
++
++    CAMERA_SENSOR_EXPOSURE_TIME =                     // int64        | public
++            CAMERA_SENSOR_START,
++    CAMERA_SENSOR_FRAME_DURATION,                     // int64        | public
++    CAMERA_SENSOR_SENSITIVITY,                        // int32        | public
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1,              // enum         | public
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT2,              // byte         | public
++    CAMERA_SENSOR_CALIBRATION_TRANSFORM1,             // rational[]   | public
++    CAMERA_SENSOR_CALIBRATION_TRANSFORM2,             // rational[]   | public
++    CAMERA_SENSOR_COLOR_TRANSFORM1,                   // rational[]   | public
++    CAMERA_SENSOR_COLOR_TRANSFORM2,                   // rational[]   | public
++    CAMERA_SENSOR_FORWARD_MATRIX1,                    // rational[]   | public
++    CAMERA_SENSOR_FORWARD_MATRIX2,                    // rational[]   | public
++    CAMERA_SENSOR_BASE_GAIN_FACTOR,                   // rational     | system
++    CAMERA_SENSOR_BLACK_LEVEL_PATTERN,                // int32[]      | public
++    CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY,             // int32        | public
++    CAMERA_SENSOR_ORIENTATION,                        // int32        | public
++    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,     // int32[]      | system
++    CAMERA_SENSOR_TIMESTAMP,                          // int64        | public
++    CAMERA_SENSOR_TEMPERATURE,                        // float        | system
++    CAMERA_SENSOR_NEUTRAL_COLOR_POINT,                // rational[]   | public
++    CAMERA_SENSOR_NOISE_PROFILE,                      // double[]     | public
++    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP,                // float[]      | system
++    CAMERA_SENSOR_PROFILE_TONE_CURVE,                 // float[]      | system
++    CAMERA_SENSOR_GREEN_SPLIT,                        // float        | public
++    CAMERA_SENSOR_TEST_PATTERN_DATA,                  // int32[]      | public
++    CAMERA_SENSOR_TEST_PATTERN_MODE,                  // enum         | public
++    CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES,       // int32[]      | public
++    CAMERA_SENSOR_OPAQUE_RAW_SIZE,                    // int32[]      | system
++    CAMERA_SENSOR_ROLLING_SHUTTER_SKEW,               // int64        | public
++    CAMERA_SENSOR_END,
++
++    CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE =            // int32[]      | public
++            CAMERA_SENSOR_INFO_START,
++    CAMERA_SENSOR_INFO_SENSITIVITY_RANGE,             // int32[]      | public
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,      // enum         | public
++    CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE,           // int64[]      | public
++    CAMERA_SENSOR_INFO_MAX_FRAME_DURATION,            // int64        | public
++    CAMERA_SENSOR_INFO_PHYSICAL_SIZE,                 // float[]      | public
++    CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE,              // int32[]      | public
++    CAMERA_SENSOR_INFO_WHITE_LEVEL,                   // int32        | public
++    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE,              // enum         | public
++    CAMERA_SENSOR_INFO_END,
++
++    CAMERA_SHADING_MODE =                             // enum         | public
++            CAMERA_SHADING_START,
++    CAMERA_SHADING_STRENGTH,                          // byte         | system
++    CAMERA_SHADING_AVAILABLE_MODES,                   // byte[]       | public
++    CAMERA_SHADING_END,
++
++    CAMERA_STATISTICS_FACE_DETECT_MODE =              // enum         | public
++            CAMERA_STATISTICS_START,
++    CAMERA_STATISTICS_HISTOGRAM_MODE,                 // enum         | system
++    CAMERA_STATISTICS_SHARPNESS_MAP_MODE,             // enum         | system
++    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE,             // enum         | public
++    CAMERA_STATISTICS_FACE_IDS,                       // int32[]      | hidden
++    CAMERA_STATISTICS_FACE_LANDMARKS,                 // int32[]      | hidden
++    CAMERA_STATISTICS_FACE_RECTANGLES,                // int32[]      | hidden
++    CAMERA_STATISTICS_FACE_SCORES,                    // byte[]       | hidden
++    CAMERA_STATISTICS_HISTOGRAM,                      // int32[]      | system
++    CAMERA_STATISTICS_SHARPNESS_MAP,                  // int32[]      | system
++    CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP,    // byte         | public
++    CAMERA_STATISTICS_LENS_SHADING_MAP,               // float[]      | hidden
++    CAMERA_STATISTICS_PREDICTED_COLOR_GAINS,          // float[]      | hidden
++    CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM,      // rational[]   | hidden
++    CAMERA_STATISTICS_SCENE_FLICKER,                  // enum         | public
++    CAMERA_STATISTICS_HOT_PIXEL_MAP,                  // int32[]      | public
++    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,          // enum         | public
++    CAMERA_STATISTICS_END,
++
++    CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES = 
++                                                      // byte[]       | public
++            CAMERA_STATISTICS_INFO_START,
++    CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,    // int32        | system
++    CAMERA_STATISTICS_INFO_MAX_FACE_COUNT,            // int32        | public
++    CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,       // int32        | system
++    CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,   // int32        | system
++    CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE,        // int32[]      | system
++    CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
++                                                      // byte[]       | public
++    CAMERA_STATISTICS_INFO_END,
++
++    CAMERA_TONEMAP_CURVE_BLUE =                       // float[]      | public
++            CAMERA_TONEMAP_START,
++    CAMERA_TONEMAP_CURVE_GREEN,                       // float[]      | public
++    CAMERA_TONEMAP_CURVE_RED,                         // float[]      | public
++    CAMERA_TONEMAP_MODE,                              // enum         | public
++    CAMERA_TONEMAP_MAX_CURVE_POINTS,                  // int32        | public
++    CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES,          // byte[]       | public
++    CAMERA_TONEMAP_GAMMA,                             // float        | public
++    CAMERA_TONEMAP_PRESET_CURVE,                      // enum         | public
++    CAMERA_TONEMAP_END,
++
++    CAMERA_LED_TRANSMIT =                             // enum         | hidden
++            CAMERA_LED_START,
++    CAMERA_LED_AVAILABLE_LEDS,                        // enum[]       | hidden
++    CAMERA_LED_END,
++
++    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL =            // enum         | public
++            CAMERA_INFO_START,
++    CAMERA_INFO_END,
++
++    CAMERA_BLACK_LEVEL_LOCK =                         // enum         | public
++            CAMERA_BLACK_LEVEL_START,
++    CAMERA_BLACK_LEVEL_END,
++
++    CAMERA_SYNC_FRAME_NUMBER =                        // enum         | hidden
++            CAMERA_SYNC_START,
++    CAMERA_SYNC_MAX_LATENCY,                          // enum         | public
++    CAMERA_SYNC_END,
++
++    CAMERA_REPROCESS_MAX_CAPTURE_STALL =              // int32        | public
++            CAMERA_REPROCESS_START,
++    CAMERA_REPROCESS_END,
++
++    INTEL_INFO_AVAILABLE_CONFIGURATIONS =             // int32[]      | hidden
++            INTEL_INFO_START,
++    INTEL_INFO_AVAILABLE_FEATURES,                    // enum[]       | public
++    INTEL_INFO_AE_EXPOSURE_TIME_RANGE,                // int32[]      | public
++    INTEL_INFO_AE_GAIN_RANGE,                         // int32[]      | public
++    INTEL_INFO_WFOV,                                  // enum         | public
++    INTEL_INFO_SENSOR_MOUNT_TYPE,                     // enum         | public
++    INTEL_INFO_END,
++
++    INTEL_CONTROL_IMAGE_ENHANCEMENT =                 // int32        | public
++            INTEL_CONTROL_START,
++    INTEL_CONTROL_SENSITIVITY_GAIN,                   // float        | public
++    INTEL_CONTROL_FRAME_RATE,                         // float        | public
++    INTEL_CONTROL_AE_CONVERGE_SPEED,                  // enum         | public
++    INTEL_CONTROL_NR_MODE,                            // enum         | public
++    INTEL_CONTROL_NR_LEVEL,                           // int32[]      | public
++    INTEL_CONTROL_IRIS_MODE,                          // enum         | public
++    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY,           // enum         | public
++    INTEL_CONTROL_IRIS_LEVEL,                         // int32        | public
++    INTEL_CONTROL_WDR_MODE,                           // enum         | public
++    INTEL_CONTROL_WDR_LEVEL,                          // byte         | public
++    INTEL_CONTROL_BLC_AREA_MODE,                      // enum         | public
++    INTEL_CONTROL_SCENE_MODE,                         // enum         | public
++    INTEL_CONTROL_WEIGHT_GRID_MODE,                   // enum         | public
++    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE,             // enum         | public
++    INTEL_CONTROL_DEINTERLACE_MODE,                   // enum         | public
++    INTEL_CONTROL_MAKERNOTE_DATA,                     // byte         | public
++    INTEL_CONTROL_CUSTOM_AIC_PARAM,                   // byte         | public
++    INTEL_CONTROL_MAKERNOTE_MODE,                     // enum         | public
++    INTEL_CONTROL_YUV_COLOR_RANGE,                    // enum         | public
++    INTEL_CONTROL_SENSITIVITY_GAIN_RANGE,             // float[]      | public
++    INTEL_CONTROL_EXPOSURE_TIME_RANGE,                // int32[]      | public
++    INTEL_CONTROL_FISHEYE_DEWARPING_MODE,             // enum         | public
++    INTEL_CONTROL_LTM_TUNING_DATA,                    // byte[]       | public
++    INTEL_CONTROL_DIGITAL_ZOOM_RATIO,                 // float        | public
++    INTEL_CONTROL_LDC_MODE,                           // enum         | public
++    INTEL_CONTROL_RSC_MODE,                           // enum         | public
++    INTEL_CONTROL_FLIP_MODE,                          // enum         | public
++    INTEL_CONTROL_MONO_DOWNSCALE,                     // enum         | public
++    INTEL_CONTROL_RUN3_A_CADENCE,                     // int32        | public
++    INTEL_CONTROL_VIEW_PROJECTION,                    // byte[]       | public
++    INTEL_CONTROL_VIEW_ROTATION,                      // byte[]       | public
++    INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS,              // byte[]       | public
++    INTEL_CONTROL_CAMERA_ROTATION,                    // byte[]       | public
++    INTEL_CONTROL_SCALER_CROP_REGION,                 // int32[]      | public
++    INTEL_CONTROL_END,
++
++    INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS =            // int32[]      | public
++            INTEL_CONTROL_ISP_START,
++    INTEL_CONTROL_ISP_ENABLED_CTRL_IDS,               // int32[]      | public
++    INTEL_CONTROL_ISP_WB_GAINS,                       // byte[]       | public
++    INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX,        // byte[]       | public
++    INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX,
++                                                      // byte[]       | public
++    INTEL_CONTROL_ISP_BXT_CSC,                        // byte[]       | public
++    INTEL_CONTROL_ISP_BXT_DEMOSAIC,                   // byte[]       | public
++    INTEL_CONTROL_ISP_SC_IEFD,                        // byte[]       | public
++    INTEL_CONTROL_ISP_SEE,                            // byte[]       | public
++    INTEL_CONTROL_ISP_BNLM,                           // byte[]       | public
++    INTEL_CONTROL_ISP_TNR5_21,                        // byte[]       | public
++    INTEL_CONTROL_ISP_XNR_DSS,                        // byte[]       | public
++    INTEL_CONTROL_ISP_GAMMA_TONE_MAP,                 // byte[]       | public
++    INTEL_CONTROL_ISP_TNR5_22,                        // byte[]       | public
++    INTEL_CONTROL_ISP_TNR5_25,                        // byte[]       | public
++    INTEL_CONTROL_ISP_END,
++
++} icamera_metadata_tag_t;
++
++/**
++ * Enumeration definitions for the various entries that need them
++ */
++
++// CAMERA_AE_MODE
++typedef enum icamera_metadata_enum_camera_ae_mode {
++    CAMERA_AE_MODE_MANUAL,
++    CAMERA_AE_MODE_AUTO,
++} icamera_metadata_enum_camera_ae_mode_t;
++
++// CAMERA_AE_LOCK
++typedef enum icamera_metadata_enum_camera_ae_lock {
++    CAMERA_AE_LOCK_OFF,
++    CAMERA_AE_LOCK_ON,
++} icamera_metadata_enum_camera_ae_lock_t;
++
++// CAMERA_AE_ANTIBANDING_MODE
++typedef enum icamera_metadata_enum_camera_ae_antibanding_mode {
++    CAMERA_AE_ANTIBANDING_MODE_AUTO,
++    CAMERA_AE_ANTIBANDING_MODE_50HZ,
++    CAMERA_AE_ANTIBANDING_MODE_60HZ,
++    CAMERA_AE_ANTIBANDING_MODE_OFF,
++} icamera_metadata_enum_camera_ae_antibanding_mode_t;
++
++// CAMERA_AE_PRECAPTURE_TRIGGER
++typedef enum icamera_metadata_enum_camera_ae_precapture_trigger {
++    CAMERA_AE_PRECAPTURE_TRIGGER_IDLE,
++    CAMERA_AE_PRECAPTURE_TRIGGER_START,
++} icamera_metadata_enum_camera_ae_precapture_trigger_t;
++
++// CAMERA_AE_STATE
++typedef enum icamera_metadata_enum_camera_ae_state {
++    CAMERA_AE_STATE_INACTIVE,
++    CAMERA_AE_STATE_SEARCHING,
++    CAMERA_AE_STATE_CONVERGED,
++    CAMERA_AE_STATE_LOCKED,
++    CAMERA_AE_STATE_FLASH_REQUIRED,
++    CAMERA_AE_STATE_PRECAPTURE,
++} icamera_metadata_enum_camera_ae_state_t;
++
++// CAMERA_AE_LOCK_AVAILABLE
++typedef enum icamera_metadata_enum_camera_ae_lock_available {
++    CAMERA_AE_LOCK_AVAILABLE_FALSE,
++    CAMERA_AE_LOCK_AVAILABLE_TRUE,
++} icamera_metadata_enum_camera_ae_lock_available_t;
++
++// CAMERA_AWB_MODE
++typedef enum icamera_metadata_enum_camera_awb_mode {
++    CAMERA_AWB_MODE_AUTO,
++    CAMERA_AWB_MODE_INCANDESCENT,
++    CAMERA_AWB_MODE_FLUORESCENT,
++    CAMERA_AWB_MODE_DAYLIGHT,
++    CAMERA_AWB_MODE_FULL_OVERCAST,
++    CAMERA_AWB_MODE_PARTLY_OVERCAST,
++    CAMERA_AWB_MODE_SUNSET,
++    CAMERA_AWB_MODE_VIDEO_CONFERENCE,
++    CAMERA_AWB_MODE_MANUAL_CCT_RANGE,
++    CAMERA_AWB_MODE_MANUAL_WHITE_POINT,
++    CAMERA_AWB_MODE_MANUAL_GAIN,
++    CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM,
++} icamera_metadata_enum_camera_awb_mode_t;
++
++// CAMERA_AWB_LOCK
++typedef enum icamera_metadata_enum_camera_awb_lock {
++    CAMERA_AWB_LOCK_OFF,
++    CAMERA_AWB_LOCK_ON,
++} icamera_metadata_enum_camera_awb_lock_t;
++
++// CAMERA_AWB_CONVERGE_SPEED
++typedef enum icamera_metadata_enum_camera_awb_converge_speed {
++    CAMERA_AWB_CONVERGE_SPEED_NORMAL,
++    CAMERA_AWB_CONVERGE_SPEED_MID,
++    CAMERA_AWB_CONVERGE_SPEED_LOW,
++} icamera_metadata_enum_camera_awb_converge_speed_t;
++
++// CAMERA_AWB_CONVERGE_SPEED_MODE
++typedef enum icamera_metadata_enum_camera_awb_converge_speed_mode {
++    CAMERA_AWB_CONVERGE_SPEED_MODE_HAL,
++    CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ,
++} icamera_metadata_enum_camera_awb_converge_speed_mode_t;
++
++// CAMERA_AWB_STATE
++typedef enum icamera_metadata_enum_camera_awb_state {
++    CAMERA_AWB_STATE_INACTIVE,
++    CAMERA_AWB_STATE_SEARCHING,
++    CAMERA_AWB_STATE_CONVERGED,
++    CAMERA_AWB_STATE_LOCKED,
++} icamera_metadata_enum_camera_awb_state_t;
++
++// CAMERA_AWB_LOCK_AVAILABLE
++typedef enum icamera_metadata_enum_camera_awb_lock_available {
++    CAMERA_AWB_LOCK_AVAILABLE_FALSE,
++    CAMERA_AWB_LOCK_AVAILABLE_TRUE,
++} icamera_metadata_enum_camera_awb_lock_available_t;
++
++// CAMERA_AF_MODE
++typedef enum icamera_metadata_enum_camera_af_mode {
++    CAMERA_AF_MODE_OFF,
++    CAMERA_AF_MODE_AUTO,
++    CAMERA_AF_MODE_MACRO,
++    CAMERA_AF_MODE_CONTINUOUS_VIDEO,
++    CAMERA_AF_MODE_CONTINUOUS_PICTURE,
++    CAMERA_AF_MODE_EDOF,
++} icamera_metadata_enum_camera_af_mode_t;
++
++// CAMERA_AF_TRIGGER
++typedef enum icamera_metadata_enum_camera_af_trigger {
++    CAMERA_AF_TRIGGER_IDLE,
++    CAMERA_AF_TRIGGER_START,
++    CAMERA_AF_TRIGGER_CANCEL,
++} icamera_metadata_enum_camera_af_trigger_t;
++
++// CAMERA_AF_STATE
++typedef enum icamera_metadata_enum_camera_af_state {
++    CAMERA_AF_STATE_INACTIVE,
++    CAMERA_AF_STATE_PASSIVE_SCAN,
++    CAMERA_AF_STATE_PASSIVE_FOCUSED,
++    CAMERA_AF_STATE_ACTIVE_SCAN,
++    CAMERA_AF_STATE_FOCUSED_LOCKED,
++    CAMERA_AF_STATE_NOT_FOCUSED_LOCKED,
++    CAMERA_AF_STATE_PASSIVE_UNFOCUSED,
++} icamera_metadata_enum_camera_af_state_t;
++
++// CAMERA_CONTROL_CAPTUREINTENT
++typedef enum icamera_metadata_enum_camera_control_captureintent {
++    CAMERA_CONTROL_CAPTUREINTENT_CUSTOM,
++    CAMERA_CONTROL_CAPTUREINTENT_PREVIEW,
++    CAMERA_CONTROL_CAPTUREINTENT_STILL_CAPTURE,
++    CAMERA_CONTROL_CAPTUREINTENT_VIDEO_RECORD,
++    CAMERA_CONTROL_CAPTUREINTENT_VIDEO_SNAPSHOT,
++    CAMERA_CONTROL_CAPTUREINTENT_ZERO_SHUTTER_LAG,
++    CAMERA_CONTROL_CAPTUREINTENT_MANUAL,
++    CAMERA_CONTROL_CAPTUREINTENT_MOTION_TRACKING,
++} icamera_metadata_enum_camera_control_captureintent_t;
++
++// CAMERA_CONTROL_EFFECT_MODE
++typedef enum icamera_metadata_enum_camera_control_effect_mode {
++    CAMERA_CONTROL_EFFECT_MODE_OFF,
++    CAMERA_CONTROL_EFFECT_MODE_MONO,
++    CAMERA_CONTROL_EFFECT_MODE_NEGATIVE,
++    CAMERA_CONTROL_EFFECT_MODE_SOLARIZE,
++    CAMERA_CONTROL_EFFECT_MODE_SEPIA,
++    CAMERA_CONTROL_EFFECT_MODE_POSTERIZE,
++    CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD,
++    CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD,
++    CAMERA_CONTROL_EFFECT_MODE_AQUA,
++} icamera_metadata_enum_camera_control_effect_mode_t;
++
++// CAMERA_CONTROL_MODE
++typedef enum icamera_metadata_enum_camera_control_mode {
++    CAMERA_CONTROL_MODE_OFF,
++    CAMERA_CONTROL_MODE_AUTO,
++    CAMERA_CONTROL_MODE_USE_SCENE_MODE,
++    CAMERA_CONTROL_MODE_OFF_KEEP_STATE,
++} icamera_metadata_enum_camera_control_mode_t;
++
++// CAMERA_CONTROL_SCENE_MODE
++typedef enum icamera_metadata_enum_camera_control_scene_mode {
++    CAMERA_CONTROL_SCENE_MODE_DISABLED                          = 0,
++    CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY,
++    CAMERA_CONTROL_SCENE_MODE_ACTION,
++    CAMERA_CONTROL_SCENE_MODE_PORTRAIT,
++    CAMERA_CONTROL_SCENE_MODE_LANDSCAPE,
++    CAMERA_CONTROL_SCENE_MODE_NIGHT,
++    CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT,
++    CAMERA_CONTROL_SCENE_MODE_THEATRE,
++    CAMERA_CONTROL_SCENE_MODE_BEACH,
++    CAMERA_CONTROL_SCENE_MODE_SNOW,
++    CAMERA_CONTROL_SCENE_MODE_SUNSET,
++    CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO,
++    CAMERA_CONTROL_SCENE_MODE_FIREWORKS,
++    CAMERA_CONTROL_SCENE_MODE_SPORTS,
++    CAMERA_CONTROL_SCENE_MODE_PARTY,
++    CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT,
++    CAMERA_CONTROL_SCENE_MODE_BARCODE,
++    CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO,
++    CAMERA_CONTROL_SCENE_MODE_HDR,
++} icamera_metadata_enum_camera_control_scene_mode_t;
++
++// CAMERA_CONTROL_VIDEO_STABILIZATION_MODE
++typedef enum icamera_metadata_enum_camera_control_video_stabilization_mode {
++    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF,
++    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON,
++} icamera_metadata_enum_camera_control_video_stabilization_mode_t;
++
++// CAMERA_DEMOSAIC_MODE
++typedef enum icamera_metadata_enum_camera_demosaic_mode {
++    CAMERA_DEMOSAIC_MODE_FAST,
++    CAMERA_DEMOSAIC_MODE_HIGH_QUALITY,
++} icamera_metadata_enum_camera_demosaic_mode_t;
++
++// CAMERA_EDGE_MODE
++typedef enum icamera_metadata_enum_camera_edge_mode {
++    CAMERA_EDGE_MODE_OFF,
++    CAMERA_EDGE_MODE_FAST,
++    CAMERA_EDGE_MODE_HIGH_QUALITY,
++    CAMERA_EDGE_MODE_ZERO_SHUTTER_LAG,
++} icamera_metadata_enum_camera_edge_mode_t;
++
++// CAMERA_FLASH_MODE
++typedef enum icamera_metadata_enum_camera_flash_mode {
++    CAMERA_FLASH_MODE_OFF,
++    CAMERA_FLASH_MODE_SINGLE,
++    CAMERA_FLASH_MODE_TORCH,
++} icamera_metadata_enum_camera_flash_mode_t;
++
++// CAMERA_FLASH_STATE
++typedef enum icamera_metadata_enum_camera_flash_state {
++    CAMERA_FLASH_STATE_UNAVAILABLE,
++    CAMERA_FLASH_STATE_CHARGING,
++    CAMERA_FLASH_STATE_READY,
++    CAMERA_FLASH_STATE_FIRED,
++    CAMERA_FLASH_STATE_PARTIAL,
++} icamera_metadata_enum_camera_flash_state_t;
++
++// CAMERA_FLASH_INFO_AVAILABLE
++typedef enum icamera_metadata_enum_camera_flash_info_available {
++    CAMERA_FLASH_INFO_AVAILABLE_FALSE,
++    CAMERA_FLASH_INFO_AVAILABLE_TRUE,
++} icamera_metadata_enum_camera_flash_info_available_t;
++
++// CAMERA_HOT_PIXEL_MODE
++typedef enum icamera_metadata_enum_camera_hot_pixel_mode {
++    CAMERA_HOT_PIXEL_MODE_OFF,
++    CAMERA_HOT_PIXEL_MODE_FAST,
++    CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY,
++} icamera_metadata_enum_camera_hot_pixel_mode_t;
++
++// CAMERA_LENS_OPTICAL_STABILIZATION_MODE
++typedef enum icamera_metadata_enum_camera_lens_optical_stabilization_mode {
++    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF,
++    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON,
++} icamera_metadata_enum_camera_lens_optical_stabilization_mode_t;
++
++// CAMERA_LENS_FACING
++typedef enum icamera_metadata_enum_camera_lens_facing {
++    CAMERA_LENS_FACING_FRONT,
++    CAMERA_LENS_FACING_BACK,
++} icamera_metadata_enum_camera_lens_facing_t;
++
++// CAMERA_LENS_STATE
++typedef enum icamera_metadata_enum_camera_lens_state {
++    CAMERA_LENS_STATE_STATIONARY,
++    CAMERA_LENS_STATE_MOVING,
++} icamera_metadata_enum_camera_lens_state_t;
++
++// CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
++typedef enum icamera_metadata_enum_camera_lens_info_focus_distance_calibration {
++    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED,
++    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE,
++    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED,
++} icamera_metadata_enum_camera_lens_info_focus_distance_calibration_t;
++
++// CAMERA_NOISE_REDUCTION_MODE
++typedef enum icamera_metadata_enum_camera_noise_reduction_mode {
++    CAMERA_NOISE_REDUCTION_MODE_OFF,
++    CAMERA_NOISE_REDUCTION_MODE_FAST,
++    CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY,
++    CAMERA_NOISE_REDUCTION_MODE_MINIMAL,
++    CAMERA_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG,
++} icamera_metadata_enum_camera_noise_reduction_mode_t;
++
++// CAMERA_REQUEST_METADATA_MODE
++typedef enum icamera_metadata_enum_camera_request_metadata_mode {
++    CAMERA_REQUEST_METADATA_MODE_NONE,
++    CAMERA_REQUEST_METADATA_MODE_FULL,
++} icamera_metadata_enum_camera_request_metadata_mode_t;
++
++// CAMERA_REQUEST_AVAILABLE_CAPABILITIES
++typedef enum icamera_metadata_enum_camera_request_available_capabilities {
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS,
++    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE,
++} icamera_metadata_enum_camera_request_available_capabilities_t;
++
++// CAMERA_SCALER_CROPPING_TYPE
++typedef enum icamera_metadata_enum_camera_scaler_cropping_type {
++    CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY,
++    CAMERA_SCALER_CROPPING_TYPE_FREEFORM,
++} icamera_metadata_enum_camera_scaler_cropping_type_t;
++
++// CAMERA_SENSOR_REFERENCE_ILLUMINANT1
++typedef enum icamera_metadata_enum_camera_sensor_reference_illuminant1 {
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT                = 1,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT             = 2,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN                = 3,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH                   = 4,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER            = 9,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER          = 10,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE                   = 11,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT    = 12,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT   = 13,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT  = 14,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT       = 15,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A              = 17,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B              = 18,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C              = 19,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55                     = 20,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65                     = 21,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75                     = 22,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50                     = 23,
++    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN     = 24,
++} icamera_metadata_enum_camera_sensor_reference_illuminant1_t;
++
++// CAMERA_SENSOR_TEST_PATTERN_MODE
++typedef enum icamera_metadata_enum_camera_sensor_test_pattern_mode {
++    CAMERA_SENSOR_TEST_PATTERN_MODE_OFF,
++    CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR,
++    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS,
++    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY,
++    CAMERA_SENSOR_TEST_PATTERN_MODE_PN9,
++    CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1                     = 256,
++} icamera_metadata_enum_camera_sensor_test_pattern_mode_t;
++
++// CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
++typedef enum icamera_metadata_enum_camera_sensor_info_color_filter_arrangement {
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB,
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG,
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG,
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR,
++    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB,
++} icamera_metadata_enum_camera_sensor_info_color_filter_arrangement_t;
++
++// CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE
++typedef enum icamera_metadata_enum_camera_sensor_info_timestamp_source {
++    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN,
++    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME,
++} icamera_metadata_enum_camera_sensor_info_timestamp_source_t;
++
++// CAMERA_SHADING_MODE
++typedef enum icamera_metadata_enum_camera_shading_mode {
++    CAMERA_SHADING_MODE_OFF,
++    CAMERA_SHADING_MODE_FAST,
++    CAMERA_SHADING_MODE_HIGH_QUALITY,
++} icamera_metadata_enum_camera_shading_mode_t;
++
++// CAMERA_STATISTICS_FACE_DETECT_MODE
++typedef enum icamera_metadata_enum_camera_statistics_face_detect_mode {
++    CAMERA_STATISTICS_FACE_DETECT_MODE_OFF,
++    CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE,
++    CAMERA_STATISTICS_FACE_DETECT_MODE_FULL,
++} icamera_metadata_enum_camera_statistics_face_detect_mode_t;
++
++// CAMERA_STATISTICS_HISTOGRAM_MODE
++typedef enum icamera_metadata_enum_camera_statistics_histogram_mode {
++    CAMERA_STATISTICS_HISTOGRAM_MODE_OFF,
++    CAMERA_STATISTICS_HISTOGRAM_MODE_ON,
++} icamera_metadata_enum_camera_statistics_histogram_mode_t;
++
++// CAMERA_STATISTICS_SHARPNESS_MAP_MODE
++typedef enum icamera_metadata_enum_camera_statistics_sharpness_map_mode {
++    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF,
++    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON,
++} icamera_metadata_enum_camera_statistics_sharpness_map_mode_t;
++
++// CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE
++typedef enum icamera_metadata_enum_camera_statistics_hot_pixel_map_mode {
++    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF,
++    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON,
++} icamera_metadata_enum_camera_statistics_hot_pixel_map_mode_t;
++
++// CAMERA_STATISTICS_SCENE_FLICKER
++typedef enum icamera_metadata_enum_camera_statistics_scene_flicker {
++    CAMERA_STATISTICS_SCENE_FLICKER_NONE,
++    CAMERA_STATISTICS_SCENE_FLICKER_50HZ,
++    CAMERA_STATISTICS_SCENE_FLICKER_60HZ,
++} icamera_metadata_enum_camera_statistics_scene_flicker_t;
++
++// CAMERA_STATISTICS_LENS_SHADING_MAP_MODE
++typedef enum icamera_metadata_enum_camera_statistics_lens_shading_map_mode {
++    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF,
++    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON,
++} icamera_metadata_enum_camera_statistics_lens_shading_map_mode_t;
++
++// CAMERA_TONEMAP_MODE
++typedef enum icamera_metadata_enum_camera_tonemap_mode {
++    CAMERA_TONEMAP_MODE_CONTRAST_CURVE,
++    CAMERA_TONEMAP_MODE_FAST,
++    CAMERA_TONEMAP_MODE_HIGH_QUALITY,
++    CAMERA_TONEMAP_MODE_GAMMA_VALUE,
++    CAMERA_TONEMAP_MODE_PRESET_CURVE,
++} icamera_metadata_enum_camera_tonemap_mode_t;
++
++// CAMERA_TONEMAP_PRESET_CURVE
++typedef enum icamera_metadata_enum_camera_tonemap_preset_curve {
++    CAMERA_TONEMAP_PRESET_CURVE_SRGB,
++    CAMERA_TONEMAP_PRESET_CURVE_REC709,
++} icamera_metadata_enum_camera_tonemap_preset_curve_t;
++
++// CAMERA_LED_TRANSMIT
++typedef enum icamera_metadata_enum_camera_led_transmit {
++    CAMERA_LED_TRANSMIT_OFF,
++    CAMERA_LED_TRANSMIT_ON,
++} icamera_metadata_enum_camera_led_transmit_t;
++
++// CAMERA_LED_AVAILABLE_LEDS
++typedef enum icamera_metadata_enum_camera_led_available_leds {
++    CAMERA_LED_AVAILABLE_LEDS_TRANSMIT,
++} icamera_metadata_enum_camera_led_available_leds_t;
++
++// CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
++typedef enum icamera_metadata_enum_camera_info_supported_hardware_level {
++    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED,
++    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
++    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
++} icamera_metadata_enum_camera_info_supported_hardware_level_t;
++
++// CAMERA_BLACK_LEVEL_LOCK
++typedef enum icamera_metadata_enum_camera_black_level_lock {
++    CAMERA_BLACK_LEVEL_LOCK_OFF,
++    CAMERA_BLACK_LEVEL_LOCK_ON,
++} icamera_metadata_enum_camera_black_level_lock_t;
++
++// CAMERA_SYNC_FRAME_NUMBER
++typedef enum icamera_metadata_enum_camera_sync_frame_number {
++    CAMERA_SYNC_FRAME_NUMBER_CONVERGING                         = -1,
++    CAMERA_SYNC_FRAME_NUMBER_UNKNOWN                            = -2,
++} icamera_metadata_enum_camera_sync_frame_number_t;
++
++// CAMERA_SYNC_MAX_LATENCY
++typedef enum icamera_metadata_enum_camera_sync_max_latency {
++    CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL                   = 0,
++    CAMERA_SYNC_MAX_LATENCY_UNKNOWN                             = -1,
++} icamera_metadata_enum_camera_sync_max_latency_t;
++
++// INTEL_INFO_AVAILABLE_FEATURES
++typedef enum icamera_metadata_enum_intel_info_available_features {
++    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE               = 0,
++    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE          = 1,
++    INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT             = 2,
++    INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION               = 3,
++    INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE                    = 4,
++    INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE              = 5,
++    INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL             = 6,
++    INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL                   = 7,
++} icamera_metadata_enum_intel_info_available_features_t;
++
++// INTEL_INFO_WFOV
++typedef enum icamera_metadata_enum_intel_info_wfov {
++    INTEL_INFO_WFOV_OFF,
++    INTEL_INFO_WFOV_ON,
++} icamera_metadata_enum_intel_info_wfov_t;
++
++// INTEL_INFO_SENSOR_MOUNT_TYPE
++typedef enum icamera_metadata_enum_intel_info_sensor_mount_type {
++    INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED,
++    INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER,
++} icamera_metadata_enum_intel_info_sensor_mount_type_t;
++
++// INTEL_CONTROL_AE_CONVERGE_SPEED
++typedef enum icamera_metadata_enum_intel_control_ae_converge_speed {
++    INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL,
++    INTEL_CONTROL_AE_CONVERGE_SPEED_MID,
++    INTEL_CONTROL_AE_CONVERGE_SPEED_LOW,
++} icamera_metadata_enum_intel_control_ae_converge_speed_t;
++
++// INTEL_CONTROL_NR_MODE
++typedef enum icamera_metadata_enum_intel_control_nr_mode {
++    INTEL_CONTROL_NR_MODE_OFF,
++    INTEL_CONTROL_NR_MODE_AUTO,
++    INTEL_CONTROL_NR_MODE_MANUAL_NORMAL,
++    INTEL_CONTROL_NR_MODE_MANUAL_EXPERT,
++} icamera_metadata_enum_intel_control_nr_mode_t;
++
++// INTEL_CONTROL_IRIS_MODE
++typedef enum icamera_metadata_enum_intel_control_iris_mode {
++    INTEL_CONTROL_IRIS_MODE_AUTO,
++    INTEL_CONTROL_IRIS_MODE_MANUAL,
++    INTEL_CONTROL_IRIS_MODE_CUSTOMIZED,
++} icamera_metadata_enum_intel_control_iris_mode_t;
++
++// INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY
++typedef enum icamera_metadata_enum_intel_control_ae_distribution_priority {
++    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO,
++    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER,
++    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO,
++    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE,
++} icamera_metadata_enum_intel_control_ae_distribution_priority_t;
++
++// INTEL_CONTROL_WDR_MODE
++typedef enum icamera_metadata_enum_intel_control_wdr_mode {
++    INTEL_CONTROL_WDR_MODE_OFF,
++    INTEL_CONTROL_WDR_MODE_ON,
++    INTEL_CONTROL_WDR_MODE_AUTO,
++} icamera_metadata_enum_intel_control_wdr_mode_t;
++
++// INTEL_CONTROL_BLC_AREA_MODE
++typedef enum icamera_metadata_enum_intel_control_blc_area_mode {
++    INTEL_CONTROL_BLC_AREA_MODE_OFF,
++    INTEL_CONTROL_BLC_AREA_MODE_ON,
++} icamera_metadata_enum_intel_control_blc_area_mode_t;
++
++// INTEL_CONTROL_SCENE_MODE
++typedef enum icamera_metadata_enum_intel_control_scene_mode {
++    INTEL_CONTROL_SCENE_MODE_AUTO,
++    INTEL_CONTROL_SCENE_MODE_HDR,
++    INTEL_CONTROL_SCENE_MODE_ULL,
++    INTEL_CONTROL_SCENE_MODE_VIDEO_LL,
++    INTEL_CONTROL_SCENE_MODE_HDR2,
++} icamera_metadata_enum_intel_control_scene_mode_t;
++
++// INTEL_CONTROL_WEIGHT_GRID_MODE
++typedef enum icamera_metadata_enum_intel_control_weight_grid_mode {
++    INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO,
++    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1,
++    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2,
++    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3,
++} icamera_metadata_enum_intel_control_weight_grid_mode_t;
++
++// INTEL_CONTROL_AE_CONVERGE_SPEED_MODE
++typedef enum icamera_metadata_enum_intel_control_ae_converge_speed_mode {
++    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL,
++    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ,
++} icamera_metadata_enum_intel_control_ae_converge_speed_mode_t;
++
++// INTEL_CONTROL_DEINTERLACE_MODE
++typedef enum icamera_metadata_enum_intel_control_deinterlace_mode {
++    INTEL_CONTROL_DEINTERLACE_MODE_OFF,
++    INTEL_CONTROL_DEINTERLACE_MODE_WEAVING,
++} icamera_metadata_enum_intel_control_deinterlace_mode_t;
++
++// INTEL_CONTROL_MAKERNOTE_MODE
++typedef enum icamera_metadata_enum_intel_control_makernote_mode {
++    INTEL_CONTROL_MAKERNOTE_MODE_OFF,
++    INTEL_CONTROL_MAKERNOTE_MODE_JPEG,
++    INTEL_CONTROL_MAKERNOTE_MODE_RAW,
++} icamera_metadata_enum_intel_control_makernote_mode_t;
++
++// INTEL_CONTROL_YUV_COLOR_RANGE
++typedef enum icamera_metadata_enum_intel_control_yuv_color_range {
++    INTEL_CONTROL_YUV_COLOR_RANGE_FULL,
++    INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED,
++} icamera_metadata_enum_intel_control_yuv_color_range_t;
++
++// INTEL_CONTROL_FISHEYE_DEWARPING_MODE
++typedef enum icamera_metadata_enum_intel_control_fisheye_dewarping_mode {
++    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF,
++    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW,
++    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW,
++} icamera_metadata_enum_intel_control_fisheye_dewarping_mode_t;
++
++// INTEL_CONTROL_LDC_MODE
++typedef enum icamera_metadata_enum_intel_control_ldc_mode {
++    INTEL_CONTROL_LDC_MODE_OFF,
++    INTEL_CONTROL_LDC_MODE_ON,
++} icamera_metadata_enum_intel_control_ldc_mode_t;
++
++// INTEL_CONTROL_RSC_MODE
++typedef enum icamera_metadata_enum_intel_control_rsc_mode {
++    INTEL_CONTROL_RSC_MODE_OFF,
++    INTEL_CONTROL_RSC_MODE_ON,
++} icamera_metadata_enum_intel_control_rsc_mode_t;
++
++// INTEL_CONTROL_FLIP_MODE
++typedef enum icamera_metadata_enum_intel_control_flip_mode {
++    INTEL_CONTROL_FLIP_MODE_NONE,
++    INTEL_CONTROL_FLIP_MODE_VFLIP,
++    INTEL_CONTROL_FLIP_MODE_HFLIP,
++    INTEL_CONTROL_FLIP_MODE_VHFLIP,
++} icamera_metadata_enum_intel_control_flip_mode_t;
++
++// INTEL_CONTROL_MONO_DOWNSCALE
++typedef enum icamera_metadata_enum_intel_control_mono_downscale {
++    INTEL_CONTROL_MONO_DOWNSCALE_OFF,
++    INTEL_CONTROL_MONO_DOWNSCALE_ON,
++} icamera_metadata_enum_intel_control_mono_downscale_t;
++
+diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
+new file mode 100644
+index 000000000000..909fd9e59120
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
+@@ -0,0 +1,583 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "AiqInitData"
++
++#include <sys/stat.h>
++
++#include "iutils/CameraLog.h"
++#include "AiqInitData.h"
++#include "AiqUtils.h"
++#include "PlatformData.h"
++#include "ia_types.h"
++
++using std::string;
++
++namespace icamera {
++
++AiqdData::AiqdData(TuningMode tuningMode, const string& sensorName) :
++    mDataPtr(nullptr)
++{
++    CLEAR(mBinaryData);
++
++    mAiqdFileName.append(CAMERA_CACHE_DIR);
++    mAiqdFileName.append(sensorName);
++    mAiqdFileName.append("_");
++    mAiqdFileName.append(CameraUtils::tuningMode2String(tuningMode));
++    mAiqdFileName.append(".aiqd");
++
++    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
++    loadAiqdFromFile();
++};
++
++AiqdData::~AiqdData()
++{
++    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
++}
++
++ia_binary_data* AiqdData::getAiqd()
++{
++    return mDataPtr ? &mBinaryData : nullptr;
++}
++
++void AiqdData::saveAiqd(const ia_binary_data& data)
++{
++    LOG1("%s", __func__);
++
++    if (!mDataPtr || data.size != mBinaryData.size) {
++        mDataPtr.reset(new char[data.size]);
++        mBinaryData.size = data.size;
++        mBinaryData.data = mDataPtr.get();
++    }
++    MEMCPY_S(mBinaryData.data, mBinaryData.size, data.data, data.size);
++
++    saveAiqdToFile();
++}
++
++void AiqdData::loadAiqdFromFile()
++{
++    LOG1("%s", __func__);
++
++    // Get file size
++    struct stat fileStat;
++    CLEAR(fileStat);
++    int ret = stat(mAiqdFileName.c_str(), &fileStat);
++    if (ret != 0) {
++        LOG1("There is no aiqd file %s", mAiqdFileName.c_str());
++        return;
++    }
++
++    // Opem aiqd file
++    FILE* fp = fopen(mAiqdFileName.c_str(), "rb");
++    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
++                 mAiqdFileName.c_str(), strerror(errno));
++
++    std::unique_ptr<char[]> dataPtr(new char[fileStat.st_size]);
++
++    // Read aiqd data
++    size_t readSize = fread(dataPtr.get(), sizeof(char), fileStat.st_size, fp);
++    fclose(fp);
++
++    CheckWarning(readSize != (size_t)fileStat.st_size, VOID_VALUE,
++                 "Failed to read aiqd %s, error %s",
++                 mAiqdFileName.c_str(), strerror(errno));
++
++    mDataPtr = move(dataPtr);
++    mBinaryData.data = mDataPtr.get();
++    mBinaryData.size = fileStat.st_size;
++    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
++}
++
++void AiqdData::saveAiqdToFile()
++{
++    LOG1("%s", __func__);
++
++    // Open aiqd file
++    FILE* fp = fopen(mAiqdFileName.c_str(), "wb");
++    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
++                 mAiqdFileName.c_str(), strerror(errno));
++
++    // Write aiqd data to file
++    size_t writeSize = fwrite(mBinaryData.data, 1, mBinaryData.size, fp);
++    if (writeSize != mBinaryData.size) {
++        LOGW("Failed to write aiqd data %s, error %s", mAiqdFileName.c_str(), strerror(errno));
++        fclose(fp);
++        return;
++    }
++
++    fflush(fp);
++    fclose(fp);
++
++    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
++}
++
++CpfConf::CpfConf()
++{
++    mLard = new IntelLard();
++    mCmc = std::unique_ptr<IntelCmc>(new IntelCmc());
++    CLEAR(mAiq);
++    CLEAR(mIsp);
++    CLEAR(mOthers);
++}
++
++CpfConf::~CpfConf()
++{
++    delete mLard;
++    LOG1("@%s", __func__);
++}
++
++int CpfConf::init(const ia_binary_data& cpfData, const LardTagConfig* lardTagCfg)
++{
++    LOG1("@%s", __func__);
++
++    CheckWarning(mCmc->getCmc(), OK, "cmc has already been init before!");
++    CheckError((cpfData.data == nullptr), BAD_VALUE, "Error Initializing CPF configure");
++
++    bool cmcRet = false;
++    ia_lard *iaLard = mLard->init(&cpfData);
++    if (iaLard) {
++        LOG1("AIQB file supported by lard.");
++        ia_lard_input_params lardInputParams;
++        initLardInputParam(*iaLard, lardTagCfg, &lardInputParams);
++
++        ia_lard_results* lardResults;
++        // Run ia_lard, result is nullptr if aiqb file is not supported
++        ia_err iaErr = mLard->run(iaLard, &lardInputParams, &lardResults);
++        if (lardResults != nullptr) {
++            LOG1("ia_lard_run success, using lard to get cmc mode and tuning.");
++            cmcRet = mCmc->init(&lardResults->aiqb_cmc_data, nullptr);
++            mAiq = lardResults->aiqb_aiq_data;
++            mIsp = lardResults->aiqb_isp_data;
++            mOthers = lardResults->aiqb_other_data;
++        } else {
++            LOGE("Fail to run ia_lard, iaErr = %d", iaErr);
++        }
++        mLard->deinit(iaLard);
++    } else {
++        LOG1("Lard not supported. The AIQB file may be in old CPF format");
++        cmcRet = mCmc->init(&cpfData, nullptr);
++        mAiq = cpfData;
++        mIsp = cpfData;
++        mOthers = cpfData;
++    }
++    CheckError(!cmcRet, FAILED_TRANSACTION, "Error cmc parser init!");
++
++    return OK;
++}
++
++ia_cmc_t* CpfConf::getCmc() const
++{
++    return mCmc->getCmc();
++}
++
++uintptr_t CpfConf::getCmcHandle() const
++{
++    return mCmc->getCmcHandle();
++}
++
++void CpfConf::getIspData(ia_binary_data* ispData)
++{
++    ispData->data = mIsp.data;
++    ispData->size = mIsp.size;
++}
++
++void CpfConf::getAiqData(ia_binary_data* aiqData)
++{
++    aiqData->data = mAiq.data;
++    aiqData->size = mAiq.size;
++}
++
++void CpfConf::getOtherData(ia_binary_data* otherData)
++{
++    otherData->data = mOthers.data;
++    otherData->size = mOthers.size;
++}
++
++void CpfConf::deinit()
++{
++    mCmc->deinit();
++}
++
++void CpfConf::initLardInputParam(const ia_lard& iaLard,
++                                 const LardTagConfig* lardTagCfg,
++                                 ia_lard_input_params* lardInputParam)
++{
++    if (!lardTagCfg) {
++        lardInputParam->cmc_mode_tag = FOURCC_TO_UL('D','F','L','T');
++        lardInputParam->aiq_mode_tag = FOURCC_TO_UL('D','F','L','T');
++        lardInputParam->isp_mode_index = FOURCC_TO_UL('D','F','L','T');
++        lardInputParam->others_mode_tag = FOURCC_TO_UL('D','F','L','T');
++        return;
++    }
++
++    unsigned int count = 0;
++    const unsigned int *tags = nullptr;
++
++    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','C','M','C'), &count, &tags);
++    lardInputParam->cmc_mode_tag = isTagValid(lardTagCfg->cmcTag, count, tags) ? \
++                                   lardTagCfg->cmcTag : FOURCC_TO_UL('D','F','L','T');
++
++    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','A','I','Q'), &count, &tags);
++    lardInputParam->aiq_mode_tag = isTagValid(lardTagCfg->aiqTag, count, tags) ? \
++                                   lardTagCfg->aiqTag : FOURCC_TO_UL('D','F','L','T');
++
++    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','I','S','P'), &count, &tags);
++    lardInputParam->isp_mode_index = isTagValid(lardTagCfg->ispTag, count, tags) ? \
++                                     lardTagCfg->ispTag : FOURCC_TO_UL('D','F','L','T');
++
++    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','T','H','R'), &count, &tags);
++    lardInputParam->others_mode_tag = isTagValid(lardTagCfg->othersTag, count, tags) ? \
++                                      lardTagCfg->othersTag : FOURCC_TO_UL('D','F','L','T');
++
++    LOG1("@%s: The lard tags are: aiq-0x%x, isp-0x%x, cmc-0x%x, others-0x%x", __func__,
++        lardInputParam->aiq_mode_tag, lardInputParam->isp_mode_index,
++        lardInputParam->cmc_mode_tag, lardInputParam->others_mode_tag);
++}
++
++bool CpfConf::isTagValid(unsigned int tag, unsigned int count, const unsigned int* tags)
++{
++    if (tags != nullptr) {
++        for (unsigned int i = 0; i < count; i++) {
++            if (tags[i] == tag) return true;
++        }
++    }
++    LOG1("@%s: Tag 0x%x is not valid. Will use DFLT instead.", __func__, tag);
++    return false;
++}
++
++CpfStore::CpfStore(const std::string& sensorName,
++                   const std::string& camCfgDir,
++                   const std::vector<TuningConfig>& tuningCfg,
++                   const std::vector<LardTagConfig>& lardTagCfg)
++{
++    LOG1("@%s:Sensor Name = %s", __func__, sensorName.c_str());
++
++    LardTagConfig* oneLardTagCfg = nullptr;
++
++    CLEAR(mCpfConfig);
++    for (auto &cfg : tuningCfg) {
++        if (mCpfConfig[cfg.tuningMode] != nullptr) {
++            continue;
++        }
++
++        if (cfg.aiqbName.empty()) {
++            LOGE("aiqb name is empty, sensor name %s", sensorName.c_str());
++            continue;
++        }
++
++        if (mCpfData.find(cfg.aiqbName) == mCpfData.end()) {
++            // Obtain the configurations
++            if (loadConf(camCfgDir, cfg.aiqbName) != OK) {
++                LOGE("load file %s failed, sensor %s", cfg.aiqbName.c_str(), sensorName.c_str());
++                continue;
++            }
++        }
++
++        oneLardTagCfg = nullptr;
++        for (size_t i = 0; i < lardTagCfg.size(); i++) {
++            if (cfg.tuningMode == lardTagCfg[i].tuningMode) {
++                oneLardTagCfg = const_cast<LardTagConfig*>(&lardTagCfg[i]);
++                break;
++            }
++        }
++
++        CpfConf* cpfConf = new CpfConf();
++
++        cpfConf->init(mCpfData[cfg.aiqbName], oneLardTagCfg);
++        mCpfConfig[cfg.tuningMode] = cpfConf;
++    }
++}
++
++CpfStore::~CpfStore()
++{
++    LOG1("@%s", __func__);
++    for (int mode=0; mode<TUNING_MODE_MAX; mode++) {
++        if (mCpfConfig[mode]) {
++            mCpfConfig[mode]->deinit();
++            delete mCpfConfig[mode];
++        }
++    }
++    for (auto &cpfData : mCpfData) {
++        if (cpfData.second.data) {
++            free(cpfData.second.data);
++        }
++    }
++    mCpfData.clear();
++}
++
++/**
++ * findConfigFile
++ *
++ * Search the path where CPF files are stored
++*/
++int CpfStore::findConfigFile(const std::string& camCfgDir, std::string* cpfPathName)
++{
++    LOG1("@%s, cpfPathName:%p", __func__, cpfPathName);
++    CheckError(!cpfPathName, BAD_VALUE, "@%s, cpfPathName is nullptr", __func__);
++
++    std::vector<string> configFilePath;
++    configFilePath.push_back("./");
++    configFilePath.push_back(camCfgDir);
++    int configFileCount = configFilePath.size();
++
++    string cpfFile;
++    for (int i = 0; i < configFileCount; i++) {
++        cpfFile.append(configFilePath.at(i));
++        cpfFile.append(*cpfPathName);
++        struct stat st;
++        if (!stat(cpfFile.c_str(), &st))
++            break;
++        cpfFile.clear();
++    }
++
++    if (cpfFile.empty()) {//CPF file not found
++        LOG1("@%s:No CPF file found for %s", __func__,cpfPathName->c_str());
++        return NAME_NOT_FOUND;
++    }
++
++    *cpfPathName = cpfFile;
++    LOG1("@%s:CPF file found %s", __func__,cpfPathName->c_str());
++    return OK;
++}
++
++/**
++ * loadConf
++ *
++ * load the CPF file
++*/
++int CpfStore::loadConf(const std::string& camCfgDir, const std::string& aiqbName)
++{
++    LOG1("@%s", __func__);
++    int ret = OK;
++    const char *suffix = ".aiqb";
++
++    string cpfPathName = aiqbName;
++    cpfPathName.append(suffix);
++    LOG1("aiqb file name %s", cpfPathName.c_str());
++
++    if (findConfigFile(camCfgDir, &cpfPathName) != OK) {
++        LOGE("CpfStore no aiqb file:%s", aiqbName.c_str());
++        return NAME_NOT_FOUND;
++    }
++
++    LOG1("Opening CPF file \"%s\"", cpfPathName.c_str());
++    FILE *file = fopen(cpfPathName.c_str(), "rb");
++    CheckError((file == nullptr), NAME_NOT_FOUND, "ERROR in opening CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
++    do {
++        int fileSize;
++        if ((fseek(file, 0, SEEK_END) < 0) || ((fileSize = ftell(file)) < 0) || (fseek(file, 0, SEEK_SET) < 0)) {
++            LOGE("ERROR querying properties of CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
++            ret = BAD_VALUE;
++            break;
++        }
++
++        mCpfData[aiqbName].data = malloc(fileSize);
++        if (!mCpfData[aiqbName].data) {
++            LOGE("ERROR no memory in %s!", __func__);
++            ret = NO_MEMORY;
++            break;
++        }
++
++        if (fread(mCpfData[aiqbName].data, fileSize, 1, file) < 1) {
++            LOGE("ERROR reading CPF file \"%s\"!", cpfPathName.c_str());
++            ret = INVALID_OPERATION;
++            break;
++        }
++        mCpfData[aiqbName].size = fileSize;
++    } while (0);
++
++    if (fclose(file)) {
++        LOGE("ERROR in closing CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
++    }
++
++    return ret;
++}
++
++/**
++ * convenience getter for Isp data, Aiq data, cmc data and other data.
++ */
++int CpfStore::getCpfAndCmc(ia_binary_data* ispData,
++                           ia_binary_data* aiqData,
++                           ia_binary_data* otherData,
++                           uintptr_t* cmcHandle,
++                           TuningMode mode,
++                           ia_cmc_t** cmcData)
++{
++    LOG1("@%s mode = %d", __func__, mode);
++    CheckError((mCpfConfig[mode] == nullptr), NO_INIT, "@%s, No aiqb init, mode = %d", __func__, mode);
++    if (ispData != nullptr)
++        mCpfConfig[mode]->getIspData(ispData);
++    if (aiqData != nullptr)
++        mCpfConfig[mode]->getAiqData(aiqData);
++    if (otherData != nullptr)
++        mCpfConfig[mode]->getOtherData(otherData);
++    if (cmcData) {
++        *cmcData = mCpfConfig[mode]->getCmc();
++    }
++    if (cmcHandle) {
++        *cmcHandle = mCpfConfig[mode]->getCmcHandle();
++    }
++
++    if (mode == TUNING_MODE_VIDEO_ULL) {
++        LOG2("@%s ULL mode, ULL cpf file is used", __func__);
++    } else if (mode == TUNING_MODE_VIDEO_CUSTOM_AIC) {
++        LOG2("@%s CUSTOM AIC mode, CUSTOM AIC cpf file is used", __func__);
++    } else if (mode == TUNING_MODE_VIDEO_LL) {
++        LOG2("@%s VIDEO LL mode, VIDEO LL cpf file is used", __func__);
++    } else if (mode == TUNING_MODE_VIDEO_REAR_VIEW) {
++        LOG2("@%s VIDEO Rear View mode, VIDEO REAR VIEW cpf file is used", __func__);
++    } else if (mode == TUNING_MODE_VIDEO_HITCH_VIEW) {
++        LOG2("@%s VIDEO Hitch View mode, VIDEO HITCH VIEW cpf file is used", __func__);
++    } else {
++        LOG2("@%s VIDEO mode, default cpf file is used", __func__);
++    }
++
++    return OK;
++}
++
++AiqInitData::AiqInitData(const std::string& sensorName,
++                         const std::string& camCfgDir,
++                         const std::vector<TuningConfig>& tuningCfg,
++                         const std::vector<LardTagConfig>& lardTagCfg,
++                         const std::string& nvmDir,
++                         int maxNvmSize) :
++    mSensorName(sensorName),
++    mCamCfgDir(camCfgDir),
++    mNvmDir(nvmDir),
++    mMaxNvmSize(maxNvmSize),
++    mTuningCfg(tuningCfg),
++    mLardTagCfg(lardTagCfg),
++    mCpfStore(nullptr),
++    mNvmDataBuf(nullptr),
++    mMakerNote(nullptr)
++{
++    CLEAR(mNvmData);
++    mMakerNote = unique_ptr<MakerNote>(new MakerNote);
++}
++
++AiqInitData::~AiqInitData()
++{
++    delete mCpfStore;
++    for (auto aiqd : mAiqdDataMap) {
++        delete aiqd.second;
++    }
++}
++
++int AiqInitData::getCpfAndCmc(ia_binary_data* ispData,
++                              ia_binary_data* aiqData,
++                              ia_binary_data* otherData,
++                              uintptr_t* cmcHandle,
++                              TuningMode mode,
++                              ia_cmc_t** cmcData)
++{
++    if (!mCpfStore) {
++        mCpfStore = new CpfStore(mSensorName, mCamCfgDir, mTuningCfg, mLardTagCfg);
++    }
++    return mCpfStore->getCpfAndCmc(ispData, aiqData, otherData, cmcHandle, mode, cmcData);
++}
++
++status_t AiqInitData::loadNvm()
++{
++    LOG1("@%s", __func__);
++
++    if (mNvmDir.length() == 0) {
++        LOG1("NVM dirctory from config is null");
++        return UNKNOWN_ERROR;
++    }
++
++    string nvmDataPath(NVM_DATA_PATH);
++    if (nvmDataPath.back() != '/')
++        nvmDataPath.append("/");
++
++    nvmDataPath.append(mNvmDir);
++    if (nvmDataPath.back() != '/')
++        nvmDataPath.append("/");
++
++    nvmDataPath.append("eeprom");
++    LOG2("NVM data for %s is located in %s", mSensorName.c_str(), nvmDataPath.c_str());
++
++    FILE* nvmFile = fopen(nvmDataPath.c_str(), "rb");
++    CheckError(!nvmFile, UNKNOWN_ERROR, "Failed to open NVM file: %s", nvmDataPath.c_str());
++
++    fseek(nvmFile, 0, SEEK_END);
++    int nvmDataSize = std::min(static_cast<int>(ftell(nvmFile)), mMaxNvmSize);
++    fseek(nvmFile, 0, SEEK_SET);
++
++    std::unique_ptr<char[]> nvmData(new char[nvmDataSize]);
++    LOG2("NVM data size: %d bytes", nvmDataSize);
++
++    int ret = fread(nvmData.get(), nvmDataSize, 1, nvmFile);
++    fclose(nvmFile);
++    CheckError(ret == 0, UNKNOWN_ERROR, "Cannot read nvm data");
++
++    mNvmDataBuf = std::move(nvmData);
++    mNvmData.data = mNvmDataBuf.get();
++    mNvmData.size = nvmDataSize;
++
++    return OK;
++}
++
++ia_binary_data* AiqInitData::getNvm()
++{
++    if (!mNvmData.data || mNvmData.size == 0) {
++        loadNvm();
++    }
++
++    return mNvmData.data ? &mNvmData : nullptr;
++}
++
++ia_binary_data* AiqInitData::getAiqd(TuningMode mode) {
++    if (mAiqdDataMap.find(mode) == mAiqdDataMap.end()) {
++        mAiqdDataMap[mode] = new AiqdData(mode, mSensorName);
++    }
++    AiqdData* aiqd = mAiqdDataMap[mode];
++    CheckError(!aiqd, nullptr, "@%s, aiqd is nullptr", __func__);
++
++    return aiqd->getAiqd();
++}
++
++void AiqInitData::saveAiqd(TuningMode mode, const ia_binary_data& data) {
++    if (mAiqdDataMap.find(mode) == mAiqdDataMap.end()) {
++        mAiqdDataMap[mode] = new AiqdData(mode, mSensorName);
++    }
++
++    AiqdData* aiqd = mAiqdDataMap[mode];
++    CheckError(!aiqd, VOID_VALUE, "@%s, aiqd is nullptr", __func__);
++
++    aiqd->saveAiqd(data);
++}
++
++void* AiqInitData::getMknHandle(void)
++{
++    return mMakerNote->getMknHandle();
++}
++
++int AiqInitData::saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence)
++{
++    return mMakerNote->saveMakernoteData(makernoteMode, sequence);
++}
++
++void AiqInitData::updateMakernoteTimeStamp(int64_t sequence, uint64_t timestamp)
++{
++    mMakerNote->updateTimestamp(sequence, timestamp);
++}
++
++void AiqInitData::acquireMakernoteData(uint64_t timestamp, Parameters *param)
++{
++    mMakerNote->acquireMakernoteData(timestamp, param);
++}
++
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
+new file mode 100644
+index 000000000000..f6d090a847a9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
+@@ -0,0 +1,235 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <map>
++#include <memory>
++#include <string>
++#include <vector>
++
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "CameraMetadata.h"
++
++#include "MakerNote.h"
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/IntelLard.h"
++#include "modules/sandboxing/client/IntelCmc.h"
++#else
++#include "modules/algowrapper/IntelLard.h"
++#include "modules/algowrapper/IntelCmc.h"
++#endif
++
++namespace icamera {
++
++#define NVM_DATA_PATH "/sys/bus/i2c/devices/"
++
++/**
++ * This class is intended to save/load AIQD data.
++ */
++class AiqdData
++{
++public:
++    AiqdData(TuningMode tuningMode, const std::string& sensorName);
++    ~AiqdData();
++
++    ia_binary_data* getAiqd();
++    void saveAiqd(const ia_binary_data& data);
++
++private:
++    void loadAiqdFromFile();
++    void saveAiqdToFile();
++
++private:
++    std::string mAiqdFileName;
++    ia_binary_data mBinaryData;
++    std::unique_ptr<char[]> mDataPtr;
++};
++
++/**
++  * The IA data stored
++*/
++class CpfConf
++{
++public:
++    CpfConf();
++    virtual ~CpfConf();
++
++    /**
++     * \brief get CMC pointer
++     *
++     */
++    ia_cmc_t* getCmc() const;
++
++    /**
++     * \brief get CMC uintptr_t
++     *
++     */
++    uintptr_t getCmcHandle() const;
++
++    /**
++     * \brief get ISP data from CPF file
++     *
++     * \param[out] ia_binary_data* IspData: ISP data
++     */
++    void getIspData(ia_binary_data* IspData);
++
++    /**
++     * \brief get AIQ data from CPF file
++     *
++     * \param[out] ia_binary_data* AiqData: AIQ data
++     */
++    void getAiqData(ia_binary_data* AiqData);
++
++    /**
++     * \brief get others data from CPF file, including LTM data
++     *
++     * \param[out] ia_binary_data* otherData: others data
++     */
++    void getOtherData(ia_binary_data* otherData);
++
++    /**
++     * \brief parse CMC/ISP/AIQ/Others from the CPF data
++     *
++     * Parse the CMC/ISP/AIQ/Others data according to the tuning mode, and init
++     * the CMC handler.
++     *
++     * \param[in] ia_binary_data: CPF data loaded from the AIQB file
++     * \param[in] LardTagConfig: lard tag cfg
++     *
++     * \return OK if init successfully; otherwise non-0 value is returned.
++     */
++    int init(const ia_binary_data& cpfData, const LardTagConfig* lardTagCfg);
++
++    /**
++      * \brief deinit CMC handler.
++    */
++    void deinit();
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(CpfConf);
++
++    void initLardInputParam(const ia_lard& iaLard,
++                            const LardTagConfig* lardTagCfg,
++                            ia_lard_input_params* lardInputParam);
++    bool isTagValid(unsigned int tag, unsigned int count, const unsigned int* tags);
++
++private:
++    IntelLard* mLard;
++    std::unique_ptr<IntelCmc> mCmc;
++    ia_binary_data mAiq;
++    ia_binary_data mIsp;
++    ia_binary_data mOthers;
++};//end CpfConf
++
++/**
++  * CPF file operation class
++*/
++class CpfStore
++{
++public:
++    CpfStore(const std::string& sensorName,
++             const std::string& camCfgDir,
++             const std::vector<TuningConfig>& tuningCfg,
++             const std::vector<LardTagConfig>& lardTagCfg);
++    virtual ~CpfStore();
++
++    /**
++     * get Isp and Aiq data info
++     *
++     * \param ispData: return isp data of struct ia_binary_data
++     * \param aiqData: return aiq data of struct ia_binary_data
++     * \param otherData: return other data of struct ia_binary_data, such as tuning data for LTM
++     * \param cmcHandle: return cmc uintptr_t
++     * \param mode: Camera Mode
++     * \param cmcData: return cmc pointer
++     * \return NO_INIT if data not found, return OK if success.
++     */
++    int getCpfAndCmc(ia_binary_data* ispData,
++                     ia_binary_data* aiqData,
++                     ia_binary_data* otherData,
++                     uintptr_t* cmcHandle,
++                     TuningMode mode = TUNING_MODE_VIDEO,
++                     ia_cmc_t** cmcData = nullptr);
++private:
++    DISALLOW_COPY_AND_ASSIGN(CpfStore);
++
++    int findConfigFile(const std::string& camCfgDir, std::string* cpfPathName);
++    int loadConf(const std::string& camCfgDir, const std::string& aiqbName);
++
++public:
++    CpfConf* mCpfConfig[TUNING_MODE_MAX];
++    std::map<std::string, ia_binary_data> mCpfData;
++
++};//end CpfStore
++
++/**
++ * This class ia a wrapper class which includes CPF data, AIQD data and NVM data.
++ */
++class AiqInitData {
++ public:
++    AiqInitData(const std::string& sensorName,
++                const std::string& camCfgDir,
++                const std::vector<TuningConfig>& tuningCfg,
++                const std::vector<LardTagConfig>& lardTagCfg,
++                const std::string& nvmDir,
++                int maxNvmSize);
++    ~AiqInitData();
++
++    // cpf and cmc
++    int getCpfAndCmc(ia_binary_data* ispData,
++                     ia_binary_data* aiqData,
++                     ia_binary_data* otherData,
++                     uintptr_t* cmcHandle,
++                     TuningMode mode = TUNING_MODE_VIDEO,
++                     ia_cmc_t** cmcData = nullptr);
++
++    // aiqd
++    ia_binary_data* getAiqd(TuningMode mode);
++    void saveAiqd(TuningMode mode, const ia_binary_data& data);
++
++    // nvm
++    ia_binary_data* getNvm();
++
++    // maker note
++    void* getMknHandle(void);
++    int saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence);
++    void updateMakernoteTimeStamp(int64_t sequence, uint64_t timestamp);
++    void acquireMakernoteData(uint64_t timestamp, Parameters *param);
++
++ private:
++    status_t loadNvm();
++
++ private:
++    std::string mSensorName;
++    std::string mCamCfgDir;
++    std::string mNvmDir;
++    int mMaxNvmSize;
++    std::vector<TuningConfig> mTuningCfg;
++    std::vector<LardTagConfig> mLardTagCfg;
++    CpfStore* mCpfStore;
++
++    // NVM data
++    std::unique_ptr <char[]> mNvmDataBuf;
++    ia_binary_data mNvmData;
++
++    std::unique_ptr<MakerNote> mMakerNote;
++
++    std::map<TuningMode, AiqdData*> mAiqdDataMap;
++};
++
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
+new file mode 100644
+index 000000000000..303bb8d44301
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
+@@ -0,0 +1,1903 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ * Copyright 2008-2017, The Android Open Source Project
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "CameraParser"
++
++#include <string.h>
++#include <expat.h>
++#include <memory>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "metadata/ParameterHelper.h"
++
++#include "PlatformData.h"
++#include "CameraParser.h"
++
++using std::string;
++using std::vector;
++
++#include "v4l2/NodeInfo.h"
++
++namespace icamera {
++#define  LIBCAMHAL_PROFILE_NAME "libcamhal_profile.xml"
++CameraParser::CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg) :
++    mStaticCfg(cfg),
++    mCurrentDataField(FIELD_INVALID),
++    mSensorNum(0),
++    mCurrentSensor(0),
++    pCurrentCam(nullptr),
++    mInMediaCtlCfg(false),
++    mInStaticMetadata(false),
++    mMC(mc),
++    mMetadataCache(nullptr) {
++    LOGXML("@%s", __func__);
++    CheckError(mc == nullptr || cfg == nullptr, VOID_VALUE,
++               "@%s, passed parameters are wrong, mc:%p, data:%p", __func__, mc, cfg);
++
++    mMetadataCache = new long[mMetadataCacheSize];
++    getProfileDataFromXmlFile();
++
++    if(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
++        dumpSensorInfo();
++}
++
++CameraParser::~CameraParser()
++{
++    delete []mMetadataCache;
++}
++
++/**
++ * Replacing $I2CBUS with the real mI2CBus if the value contains the string "$I2CBUS"
++ * one example: "imx319 $I2CBUS"
++ * Replacing $CSI_PORT with the real mCsiPort if the value contains the string "$CSI_PORT"
++ * one example: "Intel IPU6 CSI-2 $CSI_PORT"
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param value: camera information.
++ * \return: if the value contains the string, it will be replaced.
++ */
++string CameraParser::replaceStringInXml(CameraParser *profiles, const char *value)
++{
++    string valueTmp;
++    CheckError(value == nullptr, valueTmp, "value is nullptr");
++
++    valueTmp = value;
++    string::size_type found = string::npos;
++    if ((found = valueTmp.find("$I2CBUS")) != string::npos) {
++        valueTmp.replace(found, sizeof("$I2CBUS"), profiles->mI2CBus);
++        LOGXML("@%s, sensor full name is %s", __func__, valueTmp.c_str());
++    } else if ((found = valueTmp.find("$CSI_PORT")) != string::npos) {
++        valueTmp.replace(found, sizeof("$CSI_PORT"), profiles->mCsiPort);
++        LOGXML("@%s, csi entity full name is %s", __func__, valueTmp.c_str());
++    }
++
++    return valueTmp;
++}
++
++/**
++ * This function will check which field that the parser parses to.
++ *
++ * The field is set to 3 types.
++ * FIELD_INVALID FIELD_SENSOR and FIELD_COMMON
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void CameraParser::checkField(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s", __func__, name);
++    if (strcmp(name, "CameraSettings") == 0) {
++        profiles->mCurrentDataField = FIELD_INVALID;
++        return;
++    } else if (strcmp(name, "Sensor") == 0) {
++        profiles->mSensorNum++;
++        profiles->mCurrentSensor = profiles->mSensorNum - 1;
++        if (profiles->mCurrentSensor >= 0 && profiles->mCurrentSensor < MAX_CAMERA_NUMBER) {
++            profiles->pCurrentCam = new PlatformData::StaticCfg::CameraInfo;
++
++            int idx = 0;
++            string sensorEntityName;
++            string sinkEntityName;
++            while (atts[idx]) {
++                const char* key = atts[idx];
++                const char* val = atts[idx + 1];
++                LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++                if (strcmp(key, "name") == 0) {
++                    profiles->pCurrentCam->sensorName = val;
++                } else if (strcmp(key, "description") == 0) {
++                    profiles->pCurrentCam->sensorDescription = val;
++                }
++                idx += 2;
++            }
++
++            if (!profiles->pCurrentCam->sensorName.empty() &&
++                (profiles->mAvailableSensor.find(profiles->pCurrentCam->sensorName) !=
++                 profiles->mAvailableSensor.end())) {
++                /* parameters information format example:
++                   sinkEntityName is "Intel IPU6 CSI-2 1"
++                   profiles->pCurrentCam->sensorName is "ov8856-wf"
++                   sensorName is "ov8856"
++                */
++                string sinkEntityName = profiles->mAvailableSensor[profiles->pCurrentCam->sensorName];
++                profiles->mCsiPort = sinkEntityName.substr(sinkEntityName.find_last_of(' ') + 1);
++                string sensorName = profiles->pCurrentCam->sensorName;
++                sensorName = sensorName.substr(0, (sensorName.find_last_of('-')));
++                profiles->mMC->getI2CBusAddress(sensorName, sinkEntityName, &profiles->mI2CBus);
++
++                LOGXML("@%s, mI2CBus:%s, cisPort:%s", __func__,
++                       profiles->mI2CBus.c_str(), profiles->mCsiPort.c_str());
++             }
++
++            profiles->mMetadata.clear();
++            profiles->mCurrentDataField = FIELD_SENSOR;
++
++            return;
++        }
++    } else if (strcmp(name, "Common") == 0) {
++        profiles->mCurrentDataField = FIELD_COMMON;
++        return;
++    }
++
++    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
++    return;
++}
++
++/**
++ * This function will handle all the common related elements.
++ *
++ * It will be called in the function startElement
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void CameraParser::handleCommon(CameraParser *profiles, const char *name, const char **atts)
++{
++    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
++         ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
++
++    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]: %s", __func__, name, atts[0], atts[1]);
++    CommonConfig *cfg = &profiles->mStaticCfg->mCommonConfig;
++    if (strcmp(name, "version") == 0) {
++        cfg->xmlVersion = atof(atts[1]);
++    } else if (strcmp(name, "platform") == 0) {
++        cfg->ipuName = atts[1];
++    } else if (strcmp(name, "availableSensors") == 0) {
++        parseXmlConvertStrings(atts[1], cfg->availableSensors, convertCharToString);
++    } else if (strcmp(name, "useGpuTnr") == 0) {
++       cfg->isGpuTnrEnabled = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "cameraNumber") == 0) {
++       cfg->cameraNumber = atoi(atts[1]);
++    }
++}
++
++/**
++ * This function will handle all the sensor related elements.
++ *
++ * It will be called in the function startElement
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void CameraParser::handleSensor(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s, profiles->mCurrentSensor:%d", __func__, name, profiles->mCurrentSensor);
++    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
++        ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
++
++    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]:%s", __func__, name, atts[0], atts[1]);
++    if (strcmp(name, "supportedISysSizes") == 0) {
++        parseSizesList(atts[1], pCurrentCam->mSupportedISysSizes);
++        for (const auto &s : pCurrentCam->mSupportedISysSizes)
++            LOGXML("@%s, mSupportedISysSizes: width:%d, height:%d", __func__,
++                s.width, s.height);
++    } else if (strcmp(name, "supportedISysFormat") == 0) {
++        getSupportedFormat(atts[1], pCurrentCam->mSupportedISysFormat);
++    } else if (strcmp(name, "iSysRawFormat") == 0) {
++        pCurrentCam->mISysRawFormat = CameraUtils::string2PixelCode(atts[1]);
++    } else if (strcmp(name, "configModeToStreamId") == 0) {
++        char* srcDup = strdup(atts[1]);
++        CheckError(!srcDup, VOID_VALUE, "Create a copy of source string failed.");
++
++        char* endPtr = (char*)strchr(srcDup, ',');
++        if (endPtr) {
++            *endPtr = 0;
++            ConfigMode configMode = CameraUtils::getConfigModeByName(srcDup);
++            int streamId = atoi(endPtr + 1);
++            pCurrentCam->mConfigModeToStreamId[configMode] = streamId;
++        }
++        free(srcDup);
++    } else if (strcmp(name, "pSysFormat") == 0) {
++        getSupportedFormat(atts[1], pCurrentCam->mPSysFormat);
++    } else if (strcmp(name, "enableAIQ") == 0) {
++        pCurrentCam->mEnableAIQ = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "useCrlModule") == 0) {
++        pCurrentCam->mUseCrlModule = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "skipFrameV4L2Error") == 0) {
++        pCurrentCam->mSkipFrameV4L2Error = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "useSensorDigitalGain") == 0) {
++        pCurrentCam->mUseSensorDigitalGain = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "useIspDigitalGain") == 0) {
++        pCurrentCam->mUseIspDigitalGain = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "preRegisterBuffer") == 0) {
++        pCurrentCam->mNeedPreRegisterBuffers = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "enableFrameSyncCheck") == 0) {
++        pCurrentCam->mFrameSyncCheckEnabled = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "lensName") == 0) {
++        profiles->mMC->getVCMI2CAddr(atts[1], &pCurrentCam->mLensName);
++    } else if (strcmp(name, "lensHwType") == 0) {
++        if (strcmp(atts[1], "LENS_VCM_HW") == 0) {
++            pCurrentCam->mLensHwType = LENS_VCM_HW;
++        } else {
++            LOGE("unknown Lens HW type %s, set to LENS_NONE_HW", atts[1]);
++            pCurrentCam->mLensHwType = LENS_NONE_HW;
++        }
++    } else if (strcmp(name, "autoSwitchType") == 0) {
++        if (strcmp(atts[1], "full") == 0) {
++            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_FULL;
++        } else {
++            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_PSYS;
++        }
++    } else if (strcmp(name, "lensCloseCode") == 0) {
++        pCurrentCam->mLensCloseCode = atoi(atts[1]);
++    } else if (strcmp(name, "cITMaxMargin") == 0) {
++        pCurrentCam->mCITMaxMargin = atoi(atts[1]);
++    } else if (strcmp(name, "ltmGainLag") == 0) {
++        pCurrentCam->mLtmGainLag = atoi(atts[1]);
++    } else if (strcmp(name, "enableLtmThread") == 0) {
++        pCurrentCam->mEnableLtmThread = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "enableLtmDefog") == 0) {
++        pCurrentCam->mEnableLtmDefog = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "enableLtm") == 0) {
++        pCurrentCam->mLtmEnabled = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "maxSensorDg") == 0) {
++        pCurrentCam->mMaxSensorDigitalGain = atoi(atts[1]);
++    } else if (strcmp(name, "sensorDgType") == 0) {
++        if (strcmp(atts[1], "type_2_x") == 0) {
++            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_2_X;
++        } else if (strcmp(atts[1], "type_x") == 0) {
++            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_X;
++        } else {
++            LOGE("unknown sensor digital gain type:%s, set to SENSOR_DG_TYPE_NONE", atts[1]);
++            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_NONE;
++        }
++    } else if (strcmp(name, "exposureLag") == 0) {
++        pCurrentCam->mExposureLag = atoi(atts[1]);
++    } else if (strcmp(name, "graphSettingsFile") == 0) {
++        pCurrentCam->mGraphSettingsFile = atts[1];
++    } else if (strcmp(name, "graphSettingsType") == 0) {
++        if (strcmp(atts[1], "coupled") == 0) {
++            pCurrentCam->mGraphSettingsType = COUPLED;
++        } else if (strcmp(atts[1], "dispersed") == 0) {
++            pCurrentCam->mGraphSettingsType = DISPERSED;
++        } else {
++            LOGW("unknown graph settings type %s, set to COUPLED", atts[1]);
++            pCurrentCam->mGraphSettingsType = COUPLED;
++        }
++    } else if (strcmp(name, "gainLag") == 0) {
++        pCurrentCam->mGainLag = atoi(atts[1]);
++    } else if (strcmp(name, "customAicLibraryName") == 0) {
++        pCurrentCam->mCustomAicLibraryName = atts[1];
++    } else if (strcmp(name, "custom3ALibraryName") == 0){
++        pCurrentCam->mCustom3ALibraryName = atts[1];
++    } else if (strcmp(name, "yuvColorRangeMode") == 0) {
++        if (strcmp(atts[1],"full") == 0) {
++            pCurrentCam->mYuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
++        } else if (strcmp(atts[1],"reduced") == 0) {
++            pCurrentCam->mYuvColorRangeMode = CAMERA_REDUCED_MODE_YUV_COLOR_RANGE;
++        }
++    } else if (strcmp(name, "initialSkipFrame") == 0) {
++        pCurrentCam->mInitialSkipFrame = atoi(atts[1]);
++    } else if (strcmp(name, "maxRawDataNum") == 0) {
++        pCurrentCam->mMaxRawDataNum = atoi(atts[1]);
++    }  else if (strcmp(name, "topBottomReverse") == 0) {
++        pCurrentCam->mTopBottomReverse = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "maxRequestsInflight") == 0) {
++        pCurrentCam->mMaxRequestsInflight = atoi(atts[1]);
++    } else if (strcmp(name, "psysContinueStats") == 0) {
++        pCurrentCam->mPsysContinueStats = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "preferredBufQSize") == 0) {
++        pCurrentCam->mPreferredBufQSize = atoi(atts[1]);
++    } else if (strcmp(name, "pipeSwitchDelayFrame") == 0) {
++        pCurrentCam->mPipeSwitchDelayFrame = atoi(atts[1]);
++    } else if (strcmp(name, "supportedTuningConfig") == 0) {
++        parseSupportedTuningConfig(atts[1], pCurrentCam->mSupportedTuningConfig);
++    } else if (strcmp(name, "enableAiqd") == 0) {
++        pCurrentCam->mEnableAiqd = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "testPatternMap") == 0) {
++        int size = strlen(atts[1]);
++        char src[size + 1];
++        MEMCPY_S(src, size, atts[1], size);
++        src[size] = '\0';
++        int32_t mode = TEST_PATTERN_OFF;
++        char* savePtr = nullptr;
++
++        char* tablePtr = strtok_r(src, ",", &savePtr);
++        while (tablePtr) {
++            if (strcmp(tablePtr, "Off") == 0) {
++                mode = TEST_PATTERN_OFF;
++            } else if (strcmp(tablePtr, "ColorBars") == 0) {
++                mode = COLOR_BARS;
++            } else if (strcmp(tablePtr, "SolidColor") == 0) {
++                mode = SOLID_COLOR;
++            } else if (strcmp(tablePtr, "ColorBarsFadeToGray") == 0) {
++                mode = COLOR_BARS_FADE_TO_GRAY;
++            } else if (strcmp(tablePtr, "PN9") == 0) {
++                mode = PN9;
++            } else if (strcmp(tablePtr, "CUSTOM1") == 0) {
++                mode = TEST_PATTERN_CUSTOM1;
++            } else {
++                LOGE("Test pattern string %s is unknown, please check", tablePtr);
++                return;
++            }
++
++            tablePtr = strtok_r(nullptr, ",", &savePtr);
++            CheckError(tablePtr == nullptr, VOID_VALUE, "Driver test pattern is nullptr");
++
++            pCurrentCam->mTestPatternMap[mode] = atoi(tablePtr);
++
++            tablePtr = strtok_r(nullptr, ",", &savePtr);
++        }
++    } else if (strcmp(name, "lardTags") == 0) {
++        parseLardTags(atts[1], pCurrentCam->mLardTagsConfig);
++    } else if (strcmp(name, "availableConfigModeForAuto") == 0) {
++        parseXmlConvertStrings(atts[1], pCurrentCam->mConfigModesForAuto, CameraUtils::getConfigModeByName);
++    } else if (strcmp(name, "supportedAeMultiExpRange") == 0) {
++        parseMultiExpRange(atts[1]);
++    } else if (strcmp(name, "dvsType") == 0) {
++        if (strcmp(atts[1], "MORPH_TABLE") == 0) {
++            pCurrentCam->mDVSType = MORPH_TABLE;
++        } else if (strcmp(atts[1], "IMG_TRANS") == 0) {
++            pCurrentCam->mDVSType = IMG_TRANS;
++        }
++    } else if (strcmp(name, "pslOutputMapForRotation") == 0) {
++        parseOutputMap(atts[1], pCurrentCam->mOutputMap);
++    } else if (strcmp(name, "maxNvmDataSize") == 0) {
++        pCurrentCam->mMaxNvmDataSize = atoi(atts[1]);
++    } else if (strcmp(name, "nvmDirectory") == 0) {
++        pCurrentCam->mNvmDirectory = atts[1];
++    } else if (strcmp(name, "isISYSCompression") == 0) {
++        pCurrentCam->mISYSCompression = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "isPSACompression") == 0) {
++        pCurrentCam->mPSACompression = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "isOFSCompression") == 0) {
++        pCurrentCam->mOFSCompression = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "faceAeEnabled") == 0) {
++        pCurrentCam->mFaceAeEnabled = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "psysAlignWithSof") == 0) {
++        pCurrentCam->mPsysAlignWithSof = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "psysBundleWithAic") == 0) {
++        pCurrentCam->mPsysBundleWithAic = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "swProcessingAlignWithIsp") == 0) {
++        pCurrentCam->mSwProcessingAlignWithIsp = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "faceEngineRunningInterval") == 0) {
++        int val = atoi(atts[1]);
++        pCurrentCam->mFaceEngineRunningInterval =
++            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
++    } else if (strcmp(name, "faceEngineRunningIntervalNoFace") == 0) {
++        int val = atoi(atts[1]);
++        pCurrentCam->mFaceEngineRunningIntervalNoFace =
++            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
++    } else if (strcmp(name, "faceEngineRunningSync") == 0) {
++        pCurrentCam->mFaceEngineRunningSync = strcmp(atts[1], "true") == 0;
++    } else if (strcmp(name, "videoStreamNum") == 0) {
++        int val = atoi(atts[1]);
++        pCurrentCam->mVideoStreamNum = val > 0 ? val : DEFAULT_VIDEO_STREAM_NUM;
++    }
++}
++
++int CameraParser::parseSupportedTuningConfig(const char *str, vector <TuningConfig> &config)
++{
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++    LOGXML("@%s, str = %s", __func__, str);
++
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    char *savePtr;
++    char *configMode = strtok_r(src, ",", &savePtr);
++    TuningConfig cfg;
++    while (configMode) {
++        char* tuningMode = strtok_r(nullptr, ",", &savePtr);
++        char* aiqb = strtok_r(nullptr, ",", &savePtr);
++        CheckError(configMode == nullptr || tuningMode == nullptr
++              || aiqb == nullptr, -1, "@%s, wrong str %s", __func__, str);
++
++        LOGXML("@%s, configMode %s, tuningMode %s, aiqb name %s",
++                __func__, configMode, tuningMode, aiqb);
++        cfg.configMode = CameraUtils::getConfigModeByName(configMode);
++        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
++        cfg.aiqbName = aiqb;
++        config.push_back(cfg);
++        if (savePtr != nullptr)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        configMode = strtok_r(nullptr, ",", &savePtr);
++    }
++    return 0;
++}
++
++int CameraParser::parseLardTags(const char *str, vector <LardTagConfig> &lardTags)
++{
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++    LOGXML("@%s, str = %s", __func__, str);
++
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++
++    char *savePtr;
++    char *tuningMode = strtok_r(src, ",", &savePtr);
++    LardTagConfig cfg;
++    while (tuningMode) {
++        char* cmcTag = strtok_r(nullptr, ",", &savePtr);
++        char* aiqTag = strtok_r(nullptr, ",", &savePtr);
++        char* ispTag = strtok_r(nullptr, ",", &savePtr);
++        char* othersTag = strtok_r(nullptr, ",", &savePtr);
++
++        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
++        cfg.cmcTag = CameraUtils::fourcc2UL(cmcTag);
++        cfg.aiqTag = CameraUtils::fourcc2UL(aiqTag);
++        cfg.ispTag = CameraUtils::fourcc2UL(ispTag);
++        cfg.othersTag = CameraUtils::fourcc2UL(othersTag);
++        CheckError(cfg.cmcTag == 0 || cfg.aiqTag == 0 || cfg.ispTag == 0
++              || cfg.othersTag == 0, -1, "@%s, wrong str %s", __func__, str);
++
++        lardTags.push_back(cfg);
++        LOGXML("@%s, tuningMode %s, cmc %s, aiq %s, isp %s, others %s",
++                __func__, tuningMode, cmcTag, aiqTag, ispTag, othersTag);
++
++        if (savePtr != nullptr)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        tuningMode = strtok_r(nullptr, ",", &savePtr);
++    }
++
++    return 0;
++}
++
++void CameraParser::parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    MediaCtlConf mc;
++    int idx = 0;
++
++    while (atts[idx]) {
++        const char *key = atts[idx];
++        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
++        if (strcmp(key, "id") == 0) {
++            mc.mcId = strtol(atts[idx + 1], nullptr, 10);
++        } else if (strcmp(key, "ConfigMode") == 0) {
++            parseXmlConvertStrings(atts[idx + 1], mc.configMode, CameraUtils::getConfigModeByName);
++        } else if (strcmp(key, "outputWidth") == 0) {
++            mc.outputWidth = strtoul(atts[idx + 1], nullptr, 10);
++        } else if (strcmp(key, "outputHeight") == 0) {
++            mc.outputHeight = strtoul(atts[idx + 1], nullptr, 10);
++        } else if (strcmp(key, "format") == 0) {
++            mc.format = CameraUtils::string2PixelCode(atts[idx + 1]);
++        }
++        idx += 2;
++    }
++
++    LOGXML("@%s, name:%s, atts[0]:%s, id: %d", __func__, name, atts[0], mc.mcId);
++    //Add a new empty MediaControl Configuration
++    profiles->pCurrentCam->mMediaCtlConfs.push_back(mc);
++}
++
++#define V4L2_CID_WATERMARK  0x00982901
++#define V4L2_CID_WATERMARK2 0x00982902
++void CameraParser::parseControlElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    McCtl ctl;
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    LOGXML("@%s, name:%s", __func__, name);
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx + 1, val);
++        if (strcmp(key, "name") == 0) {
++            ctl.entityName = replaceStringInXml(profiles, val);
++            ctl.entity = profiles->mMC->getEntityIdByName(ctl.entityName.c_str());
++        } else if (strcmp(key, "ctrlId") == 0) {
++            if (!strcmp(val, "V4L2_CID_LINK_FREQ")) {
++                ctl.ctlCmd = V4L2_CID_LINK_FREQ;
++            } else if (!strcmp(val, "V4L2_CID_VBLANK")) {
++                ctl.ctlCmd = V4L2_CID_VBLANK;
++            } else if (!strcmp(val, "V4L2_CID_HBLANK")) {
++                ctl.ctlCmd = V4L2_CID_HBLANK;
++            } else if (!strcmp(val, "V4L2_CID_EXPOSURE")) {
++                ctl.ctlCmd = V4L2_CID_EXPOSURE;
++            } else if (!strcmp(val, "V4L2_CID_ANALOGUE_GAIN")) {
++                ctl.ctlCmd = V4L2_CID_ANALOGUE_GAIN;
++            } else if (!strcmp(val, "V4L2_CID_HFLIP")) {
++                ctl.ctlCmd = V4L2_CID_HFLIP;
++            } else if (!strcmp(val, "V4L2_CID_VFLIP")) {
++                ctl.ctlCmd = V4L2_CID_VFLIP;
++            } else if (!strcmp(val, "V4L2_CID_WATERMARK")) {
++                ctl.ctlCmd = V4L2_CID_WATERMARK;
++            } else if (!strcmp(val, "V4L2_CID_WATERMARK2")) {
++                ctl.ctlCmd = V4L2_CID_WATERMARK2;
++            } else if (!strcmp(val, "V4L2_CID_TEST_PATTERN")) {
++                ctl.ctlCmd = V4L2_CID_TEST_PATTERN;
++            } else {
++                LOGE("Unknow ioctl command %s", val);
++                ctl.ctlCmd = -1;
++            }
++        } else if (strcmp(key, "value") == 0) {
++            ctl.ctlValue = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "ctrlName") == 0) {
++            ctl.ctlName = val;
++        }
++        idx += 2;
++    }
++
++    mc.ctls.push_back(ctl);
++}
++
++void CameraParser::parseSelectionElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    McFormat sel;
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    LOGXML("@%s, name:%s", __func__, name);
++
++    sel.top = -1; //top is not specified, need to be calc later.
++    sel.left = -1; //left is not specified, need to be calc later.
++    sel.width = 0; //width is not specified, need to be calc later.
++    sel.height = 0; //height is not specified, need to be calc later.
++    sel.formatType = FC_SELECTION;
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++        if (strcmp(key, "name") == 0) {
++            sel.entityName = replaceStringInXml(profiles, val);
++            sel.entity = profiles->mMC->getEntityIdByName(sel.entityName.c_str());
++        } else if (strcmp(key, "pad") == 0) {
++            sel.pad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "target") == 0) {
++            if (!strcmp(val, "V4L2_SEL_TGT_COMPOSE")) {
++                sel.selCmd = V4L2_SEL_TGT_COMPOSE;
++            } else if (!strcmp(val, "V4L2_SEL_TGT_CROP")) {
++                sel.selCmd = V4L2_SEL_TGT_CROP;
++            }
++        } else if (strcmp(key, "top") == 0) {
++            sel.top = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "left") == 0) {
++            sel.left = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "width") == 0) {
++            sel.width = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "height") == 0) {
++            sel.height = strtoul(val, nullptr, 10);
++        }
++        idx += 2;
++    }
++
++    mc.formats.push_back(sel);
++}
++
++/**
++ * Store the MediaCtlConf mapping table for supportedStreamConfig by id.
++ * Then we can select the MediaCtlConf through this table and configured stream.
++ */
++void CameraParser::storeMcMappForConfig(int mcId, stream_t streamCfg)
++{
++    //We need to insert new one if mcId isn't in mStreamToMcMap.
++    if (pCurrentCam->mStreamToMcMap.find(mcId) == pCurrentCam->mStreamToMcMap.end()) {
++        pCurrentCam->mStreamToMcMap.insert(std::pair<int, stream_array_t>(mcId, stream_array_t()));
++    }
++
++    stream_array_t &streamVector = pCurrentCam->mStreamToMcMap[mcId];
++    streamVector.push_back(streamCfg);
++}
++
++/**
++ * \brief Parses the string with the supported stream configurations
++ * a stream configuration is made of 4 necessary elements
++ * - Format
++ * - Resolution
++ * - Field (Interlaced field)
++ * - Media config ID
++ * we parse the string in 4 steps
++ * example of valid stream configuration is: V4L2_PIX_FMT_NV12,1920x1080,0,0
++
++ * the following elements are optional:
++ * - Max fps, for continuous streaming and high quality capture. (optional)
++ * example: V4L2_PIX_FMT_NV12,1920x1080,0,0,(30/15)
++ *
++ * \param src: string to be parsed
++ * \param configs: Stream config array needs to be filled in
++ *
++ */
++void CameraParser::parseStreamConfig(const char* src, stream_array_t& configs)
++{
++    HAL_TRACE_CALL(1);
++
++    int mcId = -1;
++    char* endPtr = nullptr;
++    char* separatorPtr = nullptr;
++    int parseStep = 0;
++    stream_t config;
++    CLEAR(config);
++
++#define NUM_ELEMENTS_NECESSARY 4
++// Has optional element
++#define NUM_ELEMENTS (NUM_ELEMENTS_NECESSARY + 1)
++
++    bool lastElement = false; // the last one?
++    do {
++        parseStep++;
++
++        // Get the next segement for necessary element
++        // Get the next segement for optional element if it exist
++        if (parseStep <= NUM_ELEMENTS_NECESSARY
++            || (!lastElement && (*src == '('))) {
++
++            separatorPtr = (char *)strchr(src, ',');
++            if (separatorPtr) {
++                *separatorPtr = 0;
++            } else {
++                lastElement = true;
++            }
++        }
++
++        switch (parseStep) {
++            case 1: // Step 1: Parse format
++                LOGXML("stream format is %s", src);
++                config.format = CameraUtils::string2PixelCode(src);
++                CheckError(config.format == -1, VOID_VALUE, "@%s, format fails", __func__);
++                break;
++            case 2: // Step 2: Parse the resolution
++                config.width = strtol(src, &endPtr, 10);
++                CheckError(!endPtr || *endPtr != 'x', VOID_VALUE, "@%s, width fails", __func__);
++                src = endPtr + 1;
++                config.height = strtol(src, &endPtr, 10);
++                LOGXML("(%dx%d)", config.width, config.height);
++                break;
++            case 3: // Step 3: Parse field
++                config.field = strtol(src, &endPtr, 10);
++                LOGXML("stream field is %d", config.field);
++                break;
++            case 4: // Step 4: Parse MediaCtlConf id.
++                mcId = strtol(src, &endPtr, 10);
++                CheckError(mcId < 0, VOID_VALUE, "@%s, mcId fails", __func__);
++                LOGXML("the mcId for supported stream config is %d", mcId);
++                break;
++        }
++
++        if (!lastElement) {
++            // Move to the next element
++            src = separatorPtr + 1;
++            src = skipWhiteSpace(src);
++        } else if (parseStep < NUM_ELEMENTS_NECESSARY ){
++            LOGE("Malformed stream configuration, only finish step %d", parseStep);
++            return;
++        }
++
++        // Finish all elements for one config
++        if (parseStep >= NUM_ELEMENTS) {
++            configs.push_back(config);
++            storeMcMappForConfig(mcId, config);
++            CLEAR(config);
++            mcId = -1;
++            parseStep = 0;
++            LOGXML("Stream Configuration found");
++            if (lastElement) {
++                break;
++            }
++        }
++    } while (true);
++}
++
++void CameraParser::parseSupportedFeatures(const char* src, camera_features_list_t& features)
++{
++    HAL_TRACE_CALL(1);
++
++    char * endPtr = nullptr;
++    camera_features feature = INVALID_FEATURE;
++    do {
++        endPtr = (char *)strchr(src, ',');
++        if (endPtr) {
++            *endPtr = 0;
++        }
++        if (strcmp(src, "MANUAL_EXPOSURE") == 0) {
++            feature = MANUAL_EXPOSURE;
++        } else if (strcmp(src, "MANUAL_WHITE_BALANCE") == 0) {
++            feature = MANUAL_WHITE_BALANCE;
++        } else if (strcmp(src, "IMAGE_ENHANCEMENT") == 0) {
++            feature = IMAGE_ENHANCEMENT;
++        } else if (strcmp(src, "NOISE_REDUCTION") == 0) {
++            feature = NOISE_REDUCTION;
++        } else if (strcmp(src, "SCENE_MODE") == 0) {
++            feature = SCENE_MODE;
++        } else if (strcmp(src, "WEIGHT_GRID_MODE") == 0) {
++            feature = WEIGHT_GRID_MODE;
++        } else if (strcmp(src, "PER_FRAME_CONTROL") == 0) {
++            feature = PER_FRAME_CONTROL;
++        } else if (strcmp(src, "ISP_CONTROL") == 0) {
++            feature = ISP_CONTROL;
++        } else {
++            feature = INVALID_FEATURE;
++        }
++
++        if (feature != INVALID_FEATURE) {
++            features.push_back(feature);
++        }
++
++        if (endPtr) {
++            src = endPtr + 1;
++            src = skipWhiteSpace(src);
++        }
++    } while (endPtr);
++}
++
++int CameraParser::parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes)
++{
++    HAL_TRACE_CALL(1);
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++
++    char *savePtr, *tablePtr;
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    camera_video_stabilization_mode_t mode = VIDEO_STABILIZATION_MODE_OFF;
++
++    tablePtr = strtok_r(src, ",", &savePtr);
++    while (tablePtr) {
++        if (strcmp(tablePtr, "ON") == 0) {
++            mode = VIDEO_STABILIZATION_MODE_ON;
++        } else if (strcmp(tablePtr, "OFF") == 0) {
++            mode = VIDEO_STABILIZATION_MODE_OFF;
++        }
++        supportedModes.push_back(mode);
++
++        if (savePtr != nullptr)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        tablePtr = strtok_r(nullptr, ",", &savePtr);
++    }
++
++    return OK;
++}
++
++int CameraParser::parseSupportedAeMode(const char* str, vector <camera_ae_mode_t> &supportedModes)
++{
++    HAL_TRACE_CALL(1);
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++
++    char *savePtr, *tablePtr;
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    camera_ae_mode_t aeMode = AE_MODE_AUTO;
++
++    tablePtr = strtok_r(src, ",", &savePtr);
++    while (tablePtr) {
++        if (strcmp(tablePtr, "AUTO") == 0) {
++            aeMode = AE_MODE_AUTO;
++        } else if (strcmp(tablePtr, "MANUAL") == 0) {
++            aeMode = AE_MODE_MANUAL;
++        }
++        supportedModes.push_back(aeMode);
++        if (savePtr != nullptr)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        tablePtr = strtok_r(nullptr, ",", &savePtr);
++    }
++
++    return OK;
++}
++
++int CameraParser::parseSupportedAfMode(const char* str, vector <camera_af_mode_t> &supportedModes)
++{
++    HAL_TRACE_CALL(1);
++    CheckError(str == NULL, -1, "@%s, str is NULL", __func__);
++
++    char *savePtr, *tablePtr;
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    camera_af_mode_t afMode = AF_MODE_AUTO;
++
++    tablePtr = strtok_r(src, ",", &savePtr);
++    while (tablePtr) {
++        if (strcmp(tablePtr, "AUTO") == 0) {
++            afMode = AF_MODE_AUTO;
++        } else if (strcmp(tablePtr, "MACRO") == 0) {
++            afMode = AF_MODE_MACRO;
++        } else if (strcmp(tablePtr, "CONTINUOUS_VIDEO") == 0) {
++            afMode = AF_MODE_CONTINUOUS_VIDEO;
++        } else if (strcmp(tablePtr, "CONTINUOUS_PICTURE") == 0) {
++            afMode = AF_MODE_CONTINUOUS_PICTURE;
++        } else if (strcmp(tablePtr, "OFF") == 0) {
++            afMode = AF_MODE_OFF;
++        }
++        supportedModes.push_back(afMode);
++        if (savePtr != NULL)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        tablePtr = strtok_r(NULL, ",", &savePtr);
++    }
++
++    return OK;
++}
++
++int CameraParser::parseSupportedAntibandingMode(const char* str, vector <camera_antibanding_mode_t> &supportedModes)
++{
++    HAL_TRACE_CALL(1);
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++
++    char *savePtr, *tablePtr;
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    camera_antibanding_mode_t antibandingMode = ANTIBANDING_MODE_OFF;
++
++    tablePtr = strtok_r(src, ",", &savePtr);
++    while (tablePtr) {
++        if (strcmp(tablePtr, "AUTO") == 0) {
++            antibandingMode = ANTIBANDING_MODE_AUTO;
++        } else if (strcmp(tablePtr, "50Hz") == 0) {
++            antibandingMode = ANTIBANDING_MODE_50HZ;
++        } else if (strcmp(tablePtr, "60Hz") == 0) {
++            antibandingMode = ANTIBANDING_MODE_60HZ;
++        } else if (strcmp(tablePtr, "OFF") == 0) {
++            antibandingMode = ANTIBANDING_MODE_OFF;
++        }
++        supportedModes.push_back(antibandingMode);
++        if (savePtr != nullptr)
++            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++        tablePtr = strtok_r(nullptr, ",", &savePtr);
++    }
++
++    return OK;
++}
++
++int CameraParser::parseSupportedAeParamRange(const char* src, vector<int>& scenes,
++        vector<float>& minValues, vector<float>& maxValues)
++{
++    HAL_TRACE_CALL(1);
++    char* srcDup = strdup(src);
++    CheckError((srcDup == nullptr), NO_MEMORY, "Create a copy of source string failed.");
++
++    char* srcTmp = srcDup;
++    char* endPtr = nullptr;
++    while ((endPtr = (char *)strchr(srcTmp, ','))) {
++        if (endPtr) *endPtr = 0;
++
++        camera_scene_mode_t scene = CameraUtils::getSceneModeByName(srcTmp);
++        scenes.push_back(scene);
++        if (endPtr) {
++            srcTmp = endPtr + 1;
++            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        }
++
++        float min = strtof(srcTmp, &endPtr);
++        minValues.push_back(min);
++        if (endPtr == nullptr || *endPtr != ',') {
++            LOGE("Malformed ET range in exposure time range configuration");
++            free(srcDup);
++            return UNKNOWN_ERROR;
++        }
++        srcTmp = endPtr + 1;
++        float max = strtof(srcTmp, &endPtr);
++        maxValues.push_back(max);
++
++        if (endPtr) {
++            srcTmp = endPtr + 1;
++            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        }
++    }
++    free(srcDup);
++    return OK;
++}
++
++void CameraParser::parseFormatElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s", __func__, name);
++
++    McFormat fmt;
++    fmt.type = RESOLUTION_TARGET;
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++        if (strcmp(key, "name") == 0) {
++            fmt.entityName = replaceStringInXml(profiles, val);
++            fmt.entity = profiles->mMC->getEntityIdByName(fmt.entityName.c_str());
++        } else if (strcmp(key, "pad") == 0) {
++            fmt.pad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "stream") == 0) {
++            fmt.stream = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "type") == 0) {
++            if (strcmp(val, "RESOLUTION_MAX") == 0) {
++                fmt.type = RESOLUTION_MAX;
++            } else if (strcmp(val, "RESOLUTION_COMPOSE") == 0) {
++                fmt.type = RESOLUTION_COMPOSE;
++            } else if (strcmp(val, "RESOLUTION_CROP") == 0) {
++                fmt.type = RESOLUTION_CROP;
++            } else if (strcmp(val, "RESOLUTION_TARGET") == 0) {
++                fmt.type = RESOLUTION_TARGET;
++            } else {
++                LOGE("Parse format type failed. type = %s", val);
++                return;
++            }
++        } else if (strcmp(key, "width") == 0) {
++            fmt.width = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "height") == 0) {
++            fmt.height = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "format") == 0) {
++            fmt.pixelCode = CameraUtils::string2PixelCode(val);
++        }
++        idx += 2;
++    }
++
++    fmt.formatType = FC_FORMAT;
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    mc.formats.push_back(fmt);
++}
++
++void CameraParser::parseLinkElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    McLink link;
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    LOGXML("@%s, name:%s", __func__, name);
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++        if (strcmp(key, "srcName") == 0) {
++            link.srcEntityName = replaceStringInXml(profiles, val);
++            link.srcEntity = profiles->mMC->getEntityIdByName(link.srcEntityName.c_str());
++        } else if (strcmp(key, "srcPad") == 0) {
++            link.srcPad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "sinkName") == 0) {
++            link.sinkEntityName = replaceStringInXml(profiles, val);
++            link.sinkEntity = profiles->mMC->getEntityIdByName(link.sinkEntityName.c_str());
++        } else if (strcmp(key, "sinkPad") == 0) {
++            link.sinkPad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "enable") == 0) {
++            link.enable = strcmp(val, "true") == 0;
++        }
++
++        idx += 2;
++    }
++
++    mc.links.push_back(link);
++}
++
++void CameraParser::parseRouteElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    McRoute route;
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    LOGXML("@%s, name:%s", __func__, name);
++    route.flag = MEDIA_LNK_FL_ENABLED;
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++        if (strcmp(key, "name") == 0) {
++            route.entityName = replaceStringInXml(profiles, val);
++            route.entity = profiles->mMC->getEntityIdByName(route.entityName.c_str());
++        } else if (strcmp(key, "srcPad") == 0) {
++            route.srcPad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "sinkPad") == 0) {
++            route.sinkPad = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "srcStream") == 0) {
++            route.srcStream = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "sinkStream") == 0) {
++            route.sinkStream = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "flag") == 0) {
++            route.flag = strtoul(val, nullptr, 10);
++        }
++        idx += 2;
++    }
++
++    mc.routes.push_back(route);
++}
++
++void CameraParser::parseVideoElement(CameraParser *profiles, const char * /*name*/, const char **atts)
++{
++   McVideoNode videoNode;
++   MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++
++   videoNode.name = replaceStringInXml(profiles, atts[1]);
++   videoNode.videoNodeType = GetNodeType(atts[3]);
++   LOGXML("@%s, name:%s, videoNodeType:%d", __func__, videoNode.name.c_str(), videoNode.videoNodeType);
++
++   mc.videoNodes.push_back(videoNode);
++}
++
++// MediaCtl output tag xml parsing code for the field like:
++// <output port="main" width="1920" height="1088" format="V4L2_PIX_FMT_YUYV420_V32"/>
++// <output port="second" width="3264" height="2448" format="V4L2_PIX_FMT_SGRBG12V32"/>
++void CameraParser::parseOutputElement(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s", __func__, name);
++
++    McOutput output;
++
++    int idx = 0;
++    while (atts[idx]) {
++        const char* key = atts[idx];
++        const char* val = atts[idx + 1];
++        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++        if (strcmp(key, "port") == 0) {
++            if (strcmp(val, "main") ==  0)
++                output.port = MAIN_PORT;
++            else if (strcmp(val, "second") ==  0)
++                output.port = SECOND_PORT;
++            else if (strcmp(val, "third") ==  0)
++                output.port = THIRD_PORT;
++            else if (strcmp(val, "forth") ==  0)
++                output.port = FORTH_PORT;
++            else
++                output.port = INVALID_PORT;
++        } else if (strcmp(key, "width") == 0) {
++            output.width = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "height") == 0) {
++            output.height = strtoul(val, nullptr, 10);
++        } else if (strcmp(key, "format") == 0) {
++            output.v4l2Format = CameraUtils::string2PixelCode(val);
++        }
++        idx += 2;
++    }
++
++    LOGXML("@%s, port:%d, output size:%dx%d, v4l2Format:%x", __func__, output.port,
++            output.width, output.height, output.v4l2Format);
++
++    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
++    mc.outputs.push_back(output);
++}
++
++void CameraParser::parseMultiExpRange(const char* src)
++{
++    ExpRange* range = nullptr;
++    MultiExpRange multiRange;
++    MultiExpRange* pCurrRange = nullptr;
++    pCurrentCam->mMultiExpRanges.clear();
++    static const int MULTI_EXPOSURE_TAG_SHS1 = 0;
++    static const int MULTI_EXPOSURE_TAG_RHS1 = 1;
++    static const int MULTI_EXPOSURE_TAG_SHS2 = 2;
++    static const int MULTI_EXPOSURE_TAG_RHS2 = 3;
++    static const int MULTI_EXPOSURE_TAG_SHS3 = 4;
++
++    string srcDup = src;
++    CheckError((srcDup.c_str() == nullptr), VOID_VALUE, "Create a copy of source string failed.");
++
++    const char* srcTmp = srcDup.c_str();
++    char* endPtr = nullptr;
++    int tag = -1;
++    while ((endPtr = (char *)strchr(srcTmp, ','))) {
++        *endPtr = 0;
++        if (strcmp(srcTmp, "SHS1") == 0) {
++            tag = MULTI_EXPOSURE_TAG_SHS1;
++        } else if (strcmp(srcTmp, "RHS1") == 0) {
++            tag = MULTI_EXPOSURE_TAG_RHS1;
++        } else if (strcmp(srcTmp, "SHS2") == 0) {
++            tag = MULTI_EXPOSURE_TAG_SHS2;
++        } else if (strcmp(srcTmp, "RHS2") == 0) {
++            tag = MULTI_EXPOSURE_TAG_RHS2;
++        } else if (strcmp(srcTmp, "SHS3") == 0) {
++            tag = MULTI_EXPOSURE_TAG_SHS3;
++        } else {
++            LOGE("Malformed tag for multi-exposure range configuration");
++            return;
++        }
++
++        if (endPtr) {
++            srcTmp = endPtr + 1;
++            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        }
++
++        CLEAR(multiRange);
++        multiRange.Resolution.width = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        multiRange.Resolution.height = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
++
++        pCurrRange = nullptr;
++        for (unsigned int i = 0; i < pCurrentCam->mMultiExpRanges.size(); i++) {
++            if (pCurrentCam->mMultiExpRanges[i].Resolution.width == multiRange.Resolution.width &&
++                pCurrentCam->mMultiExpRanges[i].Resolution.height == multiRange.Resolution.height) {
++                pCurrRange = &(pCurrentCam->mMultiExpRanges[i]);
++                break;
++            }
++        }
++        if (pCurrRange) {
++            switch (tag) {
++                case MULTI_EXPOSURE_TAG_SHS1:
++                    range = &pCurrRange->SHS1;
++                    break;
++                case MULTI_EXPOSURE_TAG_RHS1:
++                    range = &pCurrRange->RHS1;
++                    break;
++                case MULTI_EXPOSURE_TAG_SHS2:
++                    range = &pCurrRange->SHS2;
++                    break;
++                case MULTI_EXPOSURE_TAG_RHS2:
++                    range = &pCurrRange->RHS2;
++                    break;
++                case MULTI_EXPOSURE_TAG_SHS3:
++                    range = &pCurrRange->SHS3;
++                    break;
++                default:
++                    LOGE("Wrong tag for multi-exposure range configuration");
++                    return;
++            }
++        } else {
++            switch (tag) {
++                case MULTI_EXPOSURE_TAG_SHS1:
++                    range = &multiRange.SHS1;
++                    break;
++                case MULTI_EXPOSURE_TAG_RHS1:
++                    range = &multiRange.RHS1;
++                    break;
++                case MULTI_EXPOSURE_TAG_SHS2:
++                    range = &multiRange.SHS2;
++                    break;
++                case MULTI_EXPOSURE_TAG_RHS2:
++                    range = &multiRange.RHS2;
++                    break;
++                case MULTI_EXPOSURE_TAG_SHS3:
++                    range = &multiRange.SHS3;
++                    break;
++                default:
++                    LOGE("Wrong tag for multi-exposure range configuration");
++                    return;
++            }
++        }
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        range->min = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        range->max = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        range->step = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        range->lowerBound = strtol(srcTmp, &endPtr, 10);
++        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
++
++        srcTmp = endPtr + 1;
++        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        range->upperBound = strtol(srcTmp, &endPtr, 10);
++
++        if (endPtr) {
++            srcTmp = endPtr + 1;
++            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
++        }
++
++        if (!pCurrRange) {
++            pCurrentCam->mMultiExpRanges.push_back(multiRange);
++        }
++    }
++}
++
++int CameraParser::parsePair(const char *str, int *first, int *second, char delim, char **endptr)
++{
++    // Find the first integer.
++    char *end;
++    int w = (int)strtol(str, &end, 10);
++    // If a delimeter does not immediately follow, give up.
++    if (*end != delim) {
++        LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
++        return -1;
++    }
++
++    // Find the second integer, immediately after the delimeter.
++    int h = (int)strtol(end+1, &end, 10);
++
++    *first = w;
++    *second = h;
++
++    if (endptr) {
++        *endptr = end;
++    }
++
++    return 0;
++}
++
++void CameraParser::parseSizesList(const char *sizesStr, vector <camera_resolution_t> &sizes)
++{
++    if (sizesStr == 0) {
++        return;
++    }
++
++    char *sizeStartPtr = (char *)sizesStr;
++
++    while (true) {
++        camera_resolution_t r;
++        int success = parsePair(sizeStartPtr, &r.width, &r.height, 'x',
++                                 &sizeStartPtr);
++        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
++            LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
++            return;
++        }
++        if (r.width > 0 && r.height > 0)
++            sizes.push_back(r);
++
++        if (*sizeStartPtr == '\0') {
++            return;
++        }
++        sizeStartPtr++;
++    }
++}
++
++/*
++ * The pls output to user requirement mapping table
++ *
++ * first: user requirement, second: psl output
++ * eg: <pslOutputForRotation value="3264x2448@1200x1600"/>
++ */
++void CameraParser::parseOutputMap(const char *str, vector<UserToPslOutputMap> &outputMap)
++{
++    char *srcDup = strdup(str);
++    CheckError((srcDup == nullptr), VOID_VALUE, "Create a copy of source string failed.");
++
++    char *srcTmp = srcDup;
++    char *endPtr = nullptr;
++    do {
++        endPtr = (char *)strchr(srcTmp, ',');
++        if (endPtr) {
++            *endPtr = 0;
++        }
++        char *tmpPtr = (char *)strchr(srcTmp, '@');
++        if (tmpPtr) {
++            *tmpPtr = 0;
++        }
++
++        UserToPslOutputMap map;
++        parsePair(srcTmp, &(map.User).width, &(map.User).height, 'x');
++        if (tmpPtr) {
++            srcTmp = tmpPtr + 1;
++            srcTmp = (char*)skipWhiteSpace(srcTmp);
++        }
++        parsePair(srcTmp, &(map.Psl).width, &(map.Psl).height, 'x');
++        outputMap.push_back(map);
++
++        if (endPtr) {
++            srcTmp = endPtr + 1;
++            srcTmp = (char*)skipWhiteSpace(srcTmp);
++        }
++    } while (endPtr);
++
++    free(srcDup);
++}
++
++int CameraParser::getSupportedFormat(const char* str, vector <int>& supportedFormat)
++{
++    if (str == nullptr) {
++        LOGE("the str is nullptr");
++        return -1;
++    }
++
++    LOGXML("@%s, str:%s", __func__, str);
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++    char* savePtr;
++    char* fmt = strtok_r(src, ",", &savePtr);
++    while (fmt) {
++        int actual = CameraUtils::string2PixelCode(fmt);
++        if (actual != -1) {
++            supportedFormat.push_back(actual);
++            LOGXML("@%s, add format:%d", __func__, actual);
++        }
++        fmt = strtok_r(nullptr, ",", &savePtr);
++    }
++
++    return 0;
++}
++
++/**
++ * This function will handle all the MediaCtlCfg related elements.
++ *
++ * It will be called in the function startElement
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void CameraParser::handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
++    if (strcmp(name, "MediaCtlConfig") == 0) {
++        parseMediaCtlConfigElement(profiles, name, atts);
++    } else if (strcmp(name, "link") == 0) {
++        parseLinkElement(profiles, name, atts);
++    } else if (strcmp(name, "route") == 0) {
++        parseRouteElement(profiles, name, atts);
++    } else if (strcmp(name, "control") == 0) {
++        parseControlElement(profiles, name, atts);
++    } else if (strcmp(name, "selection") == 0) {
++        parseSelectionElement(profiles, name, atts);
++    } else if (strcmp(name, "format") == 0) {
++        parseFormatElement(profiles, name, atts);
++    } else if (strcmp(name, "videonode") == 0) {
++        parseVideoElement(profiles, name, atts);
++    } else if (strcmp(name, "output") == 0) {
++        parseOutputElement(profiles, name, atts);
++    }
++}
++
++/**
++ * This function will handle all the StaticMetadata related elements.
++ *
++ * It will be called in the function startElement
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void CameraParser::handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
++    if (strcmp(name, "supportedStreamConfig") == 0) {
++        stream_array_t configsArray;
++        parseStreamConfig(atts[1], configsArray);
++        const int STREAM_MEMBER_NUM = sizeof(stream_t) / sizeof(int);
++        int dataSize = configsArray.size() * STREAM_MEMBER_NUM;
++        int configs[dataSize];
++        CLEAR(configs);
++        for (size_t i = 0; i < configsArray.size(); i++) {
++            LOGXML("@%s, stream config info: format=%s (%dx%d) field=%d type=%d", __func__,
++                    CameraUtils::format2string(configsArray[i].format).c_str(),
++                    configsArray[i].width, configsArray[i].height,
++                    configsArray[i].field, configsArray[i].streamType);
++            MEMCPY_S(&configs[i * STREAM_MEMBER_NUM], sizeof(stream_t),
++                     &configsArray[i], sizeof(stream_t));
++        }
++        mMetadata.update(INTEL_INFO_AVAILABLE_CONFIGURATIONS, configs, dataSize);
++    } else if (strcmp(name, "fpsRange") == 0) {
++        vector<double> rangeArray;
++        parseXmlConvertStrings(atts[1], rangeArray, atof);
++        float fpsRange[rangeArray.size()];
++        CLEAR(fpsRange);
++        for (size_t i = 0; i < rangeArray.size(); i++){
++            fpsRange[i] = static_cast<float>(rangeArray[i]);
++        }
++        LOGXML("@%s, supported fps range size: %zu", __func__, rangeArray.size());
++        mMetadata.update(CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES, fpsRange, ARRAY_SIZE(fpsRange));
++    } else if (strcmp(name, "evRange") == 0) {
++        vector<int> rangeArray;
++        parseXmlConvertStrings(atts[1], rangeArray, atoi);
++
++        int evRange[rangeArray.size()];
++        CLEAR(evRange);
++        for (size_t i = 0; i < rangeArray.size(); i++) {
++            evRange[i] = rangeArray[i];
++        }
++        LOGXML("@%s, supported ev range size: %zu", __func__, rangeArray.size());
++        mMetadata.update(CAMERA_AE_COMPENSATION_RANGE, evRange, ARRAY_SIZE(evRange));
++    } else if (strcmp(name, "evStep") == 0) {
++        vector<int> rationalType;
++        int ret = parseXmlConvertStrings(atts[1], rationalType, atoi);
++        CheckError((ret != OK), VOID_VALUE, "Parse evStep failed");
++
++        icamera_metadata_rational_t evStep = {rationalType[0], rationalType[1]};
++        LOGXML("@%s, the numerator: %d, denominator: %d", __func__, evStep.numerator, evStep.denominator);
++        mMetadata.update(CAMERA_AE_COMPENSATION_STEP, &evStep, 1);
++    } else if (strcmp(name, "supportedFeatures") == 0) {
++        camera_features_list_t supportedFeatures;
++        parseSupportedFeatures(atts[1], supportedFeatures);
++        int numberOfFeatures = supportedFeatures.size();
++        uint8_t features[numberOfFeatures];
++        CLEAR(features);
++        for (int i = 0; i < numberOfFeatures; i++) {
++            features[i] = supportedFeatures[i];
++        }
++        mMetadata.update(INTEL_INFO_AVAILABLE_FEATURES, features, numberOfFeatures);
++    } else if (strcmp(name, "supportedAeExposureTimeRange") == 0) {
++        vector<int> scenes;
++        vector<float> minValues, maxValues;
++        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
++        CheckError((ret != OK), VOID_VALUE, "Parse AE eExposure time range failed");
++
++        const int MEMBER_COUNT = 3;
++        const int dataSize = scenes.size() * MEMBER_COUNT;
++        int rangeData[dataSize];
++        CLEAR(rangeData);
++
++        for (size_t i = 0; i < scenes.size(); i++) {
++            LOGXML("@%s, scene mode:%d supported exposure time range (%f-%f)", __func__,
++                    scenes[i], minValues[i], maxValues[i]);
++            rangeData[i * MEMBER_COUNT] = scenes[i];
++            rangeData[i * MEMBER_COUNT + 1] = (int)minValues[i];
++            rangeData[i * MEMBER_COUNT + 2] = (int)maxValues[i];
++        }
++        mMetadata.update(INTEL_INFO_AE_EXPOSURE_TIME_RANGE, rangeData, dataSize);
++    } else if (strcmp(name, "supportedAeGainRange") == 0) {
++        vector<int> scenes;
++        vector<float> minValues, maxValues;
++        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
++        CheckError((ret != OK), VOID_VALUE, "Parse AE gain range failed");
++
++        const int MEMBER_COUNT = 3;
++        const int dataSize = scenes.size() * MEMBER_COUNT;
++        int rangeData[dataSize];
++        CLEAR(rangeData);
++
++        for (size_t i = 0; i < scenes.size(); i++) {
++            LOGXML("@%s, scene mode:%d supported gain range (%f-%f)", __func__,
++                    scenes[i], minValues[i], maxValues[i]);
++            rangeData[i * MEMBER_COUNT] = scenes[i];
++            // Since we use int to store float, before storing it we multiply min and max by 100.
++            rangeData[i * MEMBER_COUNT + 1] = (int)(minValues[i] * 100);
++            rangeData[i * MEMBER_COUNT + 2] = (int)(maxValues[i] * 100);
++        }
++        mMetadata.update(INTEL_INFO_AE_GAIN_RANGE, rangeData, dataSize);
++    } else if (strcmp(name, "supportedVideoStabilizationModes") == 0) {
++        camera_video_stabilization_list_t supportedMode;
++        parseSupportedVideoStabilizationMode(atts[1], supportedMode);
++        uint8_t modes[supportedMode.size()];
++        CLEAR(modes);
++        for(size_t i = 0; i < supportedMode.size(); i++) {
++            modes[i] = supportedMode[i];
++        }
++        mMetadata.update(CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, modes, supportedMode.size());
++    } else if (strcmp(name, "supportedAeMode") == 0) {
++        vector <camera_ae_mode_t> supportedAeMode;
++        parseSupportedAeMode(atts[1], supportedAeMode);
++        uint8_t aeModes[supportedAeMode.size()];
++        CLEAR(aeModes);
++        for (size_t i = 0; i < supportedAeMode.size(); i++) {
++            aeModes[i] = supportedAeMode[i];
++        }
++        mMetadata.update(CAMERA_AE_AVAILABLE_MODES, aeModes, supportedAeMode.size());
++    } else if (strcmp(name, "supportedAwbMode") == 0) {
++        vector <camera_awb_mode_t> supportedAwbMode;
++        parseXmlConvertStrings(atts[1], supportedAwbMode, CameraUtils::getAwbModeByName);
++        uint8_t awbModes[supportedAwbMode.size()];
++        CLEAR(awbModes);
++        for (size_t i = 0; i < supportedAwbMode.size(); i++) {
++            awbModes[i] = supportedAwbMode[i];
++        }
++        mMetadata.update(CAMERA_AWB_AVAILABLE_MODES, awbModes, supportedAwbMode.size());
++    } else if (strcmp(name, "supportedSceneMode") == 0) {
++        vector <camera_scene_mode_t> supportedSceneMode;
++        parseXmlConvertStrings(atts[1], supportedSceneMode, CameraUtils::getSceneModeByName);
++        uint8_t sceneModes[supportedSceneMode.size()];
++        CLEAR(sceneModes);
++        for (size_t i = 0; i < supportedSceneMode.size(); i++) {
++            sceneModes[i] = supportedSceneMode[i];
++        }
++        mMetadata.update(CAMERA_CONTROL_AVAILABLE_SCENE_MODES, sceneModes, supportedSceneMode.size());
++    } else if (strcmp(name, "supportedAfMode") == 0) {
++        vector <camera_af_mode_t> supportedAfMode;
++        parseSupportedAfMode(atts[1], supportedAfMode);
++        uint8_t afModes[supportedAfMode.size()];
++        CLEAR(afModes);
++        for (size_t i = 0; i < supportedAfMode.size(); i++) {
++            afModes[i] = supportedAfMode[i];
++        }
++        mMetadata.update(CAMERA_AF_AVAILABLE_MODES, afModes, supportedAfMode.size());
++    } else if (strcmp(name, "supportedAntibandingMode") == 0) {
++        vector <camera_antibanding_mode_t> supportedAntibandingMode;
++        parseSupportedAntibandingMode(atts[1], supportedAntibandingMode);
++        uint8_t antibandingModes[supportedAntibandingMode.size()];
++        CLEAR(antibandingModes);
++        for (size_t i = 0; i < supportedAntibandingMode.size(); i++) {
++            antibandingModes[i] = supportedAntibandingMode[i];
++        }
++        mMetadata.update(CAMERA_AE_AVAILABLE_ANTIBANDING_MODES, antibandingModes, supportedAntibandingMode.size());
++    } else if (strcmp(name, "sensorMountType") == 0) {
++        uint8_t mountType = WALL_MOUNTED;
++
++        if (strcmp(atts[1], "CEILING_MOUNTED") == 0)
++            mountType = CEILING_MOUNTED;
++
++        mMetadata.update(INTEL_INFO_SENSOR_MOUNT_TYPE, &mountType, 1);
++        LOGXML("@%s, sensor mount type: %d", __func__, mountType);
++    } else if (strcmp(name, "StaticMetadata") != 0) { // Make sure it doesn't reach the end of StaticMetadata.
++        handleGenericStaticMetaData(name, atts[1]);
++    }
++}
++
++/**
++ * \brief Parses string for generic static metadata and save them.
++ *
++ * \param name: the element's name.
++ * \param src: the element's value, only include data and separator 'x' or ','.
++ */
++void CameraParser::handleGenericStaticMetaData(const char *name, const char *src)
++{
++    uint32_t tag =
++            (strcmp(name, "ae.lockAvailable") == 0)              ? CAMERA_AE_LOCK_AVAILABLE
++          : (strcmp(name, "awb.lockAvailable") == 0)             ? CAMERA_AWB_LOCK_AVAILABLE
++          : (strcmp(name, "control.availableModes") == 0)        ? CAMERA_CONTROL_AVAILABLE_MODES
++          : (strcmp(name, "control.availableSceneModes") == 0)   ? CAMERA_CONTROL_AVAILABLE_SCENE_MODES
++          : (strcmp(name, "control.maxRegions") == 0)            ? CAMERA_CONTROL_MAX_REGIONS
++          : (strcmp(name, "statistics.info.availableFaceDetectModes") == 0) ? CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES
++          : (strcmp(name, "statistics.info.maxFaceCount") == 0)  ? CAMERA_STATISTICS_INFO_MAX_FACE_COUNT
++          : (strcmp(name, "sensor.info.activeArraySize") == 0)   ? CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE
++          : (strcmp(name, "sensor.info.pixelArraySize") == 0)    ? CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE
++          : (strcmp(name, "sensor.info.physicalSize") == 0)      ? CAMERA_SENSOR_INFO_PHYSICAL_SIZE
++          : (strcmp(name, "sensor.info.sensitivityRange") == 0)  ? CAMERA_SENSOR_INFO_SENSITIVITY_RANGE
++          : (strcmp(name, "sensor.info.exposureTimeRange") == 0) ? CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE
++          : (strcmp(name, "sensor.info.colorFilterArrangement") == 0) ? CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
++          : (strcmp(name, "sensor.availableTestPatternModes") == 0) ? CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES
++          : (strcmp(name, "sensor.orientation") == 0)            ? CAMERA_SENSOR_ORIENTATION
++          : (strcmp(name, "sensor.opaqueRawSize") == 0)          ? CAMERA_SENSOR_OPAQUE_RAW_SIZE
++          : (strcmp(name, "shading.availableModes") == 0)        ? CAMERA_SHADING_AVAILABLE_MODES
++          : (strcmp(name, "lens.facing") == 0)                   ? CAMERA_LENS_FACING
++          : (strcmp(name, "lens.info.availableApertures") == 0)  ? CAMERA_LENS_INFO_AVAILABLE_APERTURES
++          : (strcmp(name, "lens.info.availableFilterDensities") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES
++          : (strcmp(name, "lens.info.availableFocalLengths") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS
++          : (strcmp(name, "lens.info.availableOpticalStabilization") == 0) ? CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION
++          : (strcmp(name, "lens.info.hyperfocalDistance") == 0)  ? CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE
++          : (strcmp(name, "lens.info.minimumFocusDistance") == 0) ? CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE
++          : (strcmp(name, "lens.info.shadingMapSize") == 0)      ? CAMERA_LENS_INFO_SHADING_MAP_SIZE
++          : (strcmp(name, "lens.info.focusDistanceCalibration") == 0) ? CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
++          : (strcmp(name, "request.maxNumOutputStreams") == 0)   ? CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS
++          : (strcmp(name, "request.maxNumInputStreams") == 0)    ? CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS
++          : (strcmp(name, "request.pipelineMaxDepth") == 0)      ? CAMERA_REQUEST_PIPELINE_MAX_DEPTH
++          : (strcmp(name, "request.availableCapabilities") == 0) ? CAMERA_REQUEST_AVAILABLE_CAPABILITIES
++          : (strcmp(name, "scaler.availableInputOutputFormatsMap") == 0) ? CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP
++          : (strcmp(name, "scaler.availableStreamConfigurations") == 0)  ? CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS
++          : (strcmp(name, "scaler.availableMinFrameDurations") == 0)     ? CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS
++          : (strcmp(name, "scaler.availableStallDurations") == 0)        ? CAMERA_SCALER_AVAILABLE_STALL_DURATIONS
++          : (strcmp(name, "reprocess.maxCaptureStall") == 0)     ? CAMERA_REPROCESS_MAX_CAPTURE_STALL
++          : (strcmp(name, "jpeg.maxSize") == 0)                  ? CAMERA_JPEG_MAX_SIZE
++          : (strcmp(name, "jpeg.availableThumbnailSizes") == 0)  ? CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES
++          : (strcmp(name, "edge.availableEdgeModes") == 0)       ? CAMERA_EDGE_AVAILABLE_EDGE_MODES
++          : (strcmp(name, "hotPixel.availableHotPixelModes") == 0) ? CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES
++          : (strcmp(name, "noiseReduction.availableNoiseReductionModes") == 0) ? CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES
++          : (strcmp(name, "tonemap.maxCurvePoints") == 0)        ? CAMERA_TONEMAP_MAX_CURVE_POINTS
++          : (strcmp(name, "tonemap.availableToneMapModes") == 0) ? CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES
++          : (strcmp(name, "info.supportedHardwareLevel") == 0)   ? CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
++          : (strcmp(name, "sync.maxLatency") == 0)               ? CAMERA_SYNC_MAX_LATENCY
++          : -1;
++    int tagType = get_icamera_metadata_tag_type(tag);
++    if (tagType == -1) {
++        LOGW("Unsupported metadata %s", name);
++        return;
++    }
++
++    union {
++        uint8_t* u8;
++        int32_t* i32;
++        int64_t* i64;
++        float*   f;
++        double*  d;
++        icamera_metadata_rational_t* r;
++    } data;
++    data.u8 = (unsigned char *)mMetadataCache;
++
++    int index = 0;
++    int maxIndex = mMetadataCacheSize / sizeof(double); // worst case
++    char * endPtr = nullptr;
++    do {
++        switch (tagType) {
++        case ICAMERA_TYPE_BYTE:
++            data.u8[index]= (char)strtol(src, &endPtr, 10);
++            LOGXML(" - %d -", data.u8[index]);
++            break;
++        case ICAMERA_TYPE_INT32:
++        case ICAMERA_TYPE_RATIONAL:
++            data.i32[index]= strtol(src, &endPtr, 10);
++            LOGXML(" - %d -", data.i32[index]);
++            break;
++        case ICAMERA_TYPE_INT64:
++            data.i64[index]= strtol(src, &endPtr, 10);
++            LOGXML(" - %ld -", data.i64[index]);
++            break;
++        case ICAMERA_TYPE_FLOAT:
++            data.f[index]= strtof(src, &endPtr);
++            LOGXML(" - %8.3f -", data.f[index]);
++            break;
++        case ICAMERA_TYPE_DOUBLE:
++            data.d[index]= strtof(src, &endPtr);
++            LOGXML(" - %8.3f -", data.d[index]);
++            break;
++        }
++        index++;
++
++        if (endPtr != nullptr && (*endPtr == 'x' || *endPtr == ',')) {
++            src = endPtr + 1;
++        } else {
++            break;
++        }
++    } while (index < maxIndex);
++
++    switch (tagType) {
++    case ICAMERA_TYPE_BYTE:
++        mMetadata.update(tag, data.u8, index);
++        break;
++    case ICAMERA_TYPE_INT32:
++        mMetadata.update(tag, data.i32, index);
++        break;
++    case ICAMERA_TYPE_INT64:
++        mMetadata.update(tag, data.i64, index);
++        break;
++    case ICAMERA_TYPE_FLOAT:
++        mMetadata.update(tag, data.f, index);
++        break;
++    case ICAMERA_TYPE_DOUBLE:
++        mMetadata.update(tag, data.d, index);
++        break;
++    case ICAMERA_TYPE_RATIONAL:
++        mMetadata.update(tag, data.r, index / 2);
++        break;
++    }
++}
++
++/**
++ * the callback function of the libexpat for handling of one element start
++ *
++ * When it comes to the start of one element. This function will be called.
++ *
++ * \param userData: the pointer we set by the function XML_SetUserData.
++ * \param name: the element's name.
++ */
++void CameraParser::startParseElement(void *userData, const char *name, const char **atts)
++{
++    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
++
++    if (profiles->mCurrentDataField == FIELD_INVALID) {
++        profiles->checkField(profiles, name, atts);
++        return;
++    }
++
++    switch (profiles->mCurrentDataField) {
++        case FIELD_SENSOR:
++            if (strcmp(name, "MediaCtlConfig") == 0) {
++                profiles->mInMediaCtlCfg = true;
++                LOGXML("@%s %s, mInMediaCtlCfg is set to true", __func__, name);
++            } else if (strcmp(name, "StaticMetadata") == 0) {
++                profiles->mInStaticMetadata = true;
++                LOGXML("@%s %s, mInStaticMetadata is set to true", __func__, name);
++            }
++
++            if (profiles->mInMediaCtlCfg) {
++                // The MediaCtlCfg belongs to the sensor segments
++                profiles->handleMediaCtlCfg(profiles, name, atts);
++            } else if (profiles->mInStaticMetadata) {
++                // The StaticMetadata belongs to the sensor segments
++                profiles->handleStaticMetaData(profiles, name, atts);
++            } else {
++                profiles->handleSensor(profiles, name, atts);
++            }
++            break;
++        case FIELD_COMMON:
++            profiles->handleCommon(profiles, name, atts);
++            break;
++        default:
++            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
++            break;
++    }
++}
++
++/**
++ * the callback function of the libexpat for handling of one element end
++ *
++ * When it comes to the end of one element. This function will be called.
++ *
++ * \param userData: the pointer we set by the function XML_SetUserData.
++ * \param name: the element's name.
++ */
++void CameraParser::endParseElement(void *userData, const char *name)
++{
++    LOGXML("@%s %s", __func__, name);
++
++    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
++
++    if (strcmp(name, "Sensor") == 0) {
++        profiles->mCurrentDataField = FIELD_INVALID;
++        if (profiles->pCurrentCam) {
++            LOGXML("@%s: Add camera id %d (%s)", __func__, profiles->mCurrentSensor,
++                   profiles->pCurrentCam->sensorName.c_str());
++            if (profiles->pCurrentCam->mLensName.empty() &&
++                profiles->pCurrentCam->sensorName.find("-wf") != string::npos) {
++                int ret = profiles->mMC->getLensName(&profiles->pCurrentCam->mLensName);
++                if (ret != OK) {
++                    LOGXML("@%s, Failed to getLensName", __func__);
++                }
++            }
++            // Merge the content of mMetadata into mCapability.
++            ParameterHelper::merge(profiles->mMetadata, &profiles->pCurrentCam->mCapability);
++            profiles->mMetadata.clear();
++
++            // For non-extended camera, it should be in order by mCurrentSensor
++            profiles->mStaticCfg->mCameras.insert(profiles->mStaticCfg->mCameras.begin() +
++                                               profiles->mCurrentSensor, *(profiles->pCurrentCam));
++
++            delete profiles->pCurrentCam;
++            profiles->pCurrentCam = nullptr;
++        }
++    }
++
++    if (strcmp(name, "MediaCtlConfig") == 0) {
++        LOGXML("@%s %s, mInMediaCtlCfg is set to false", __func__, name);
++        profiles->mInMediaCtlCfg = false;
++    }
++
++    if (strcmp(name, "StaticMetadata") == 0) {
++        LOGXML("@%s %s, mInStaticMetadata is set to false", __func__, name);
++        profiles->mInStaticMetadata = false;
++    }
++
++    if (strcmp(name, "Common") == 0)
++        profiles->mCurrentDataField = FIELD_INVALID;
++}
++
++/**
++* Get available sensors.
++*
++* The function will read libcamhal_profile.xml, and parse out all of sensors.
++* Then those sensors will be checked if it exists in mediaEntity, if it exists,
++* we put it in availableSensors.
++* In libcamhal_profile.xml it should have the following requirements:
++* 1. <availableSensors value="ov8856-wf-2,ov2740-uf-0,ov2740-wf-2"/>
++*     The value is "'camera name'-wf/uf-'CSI port number'".
++*     For example: camera name is "ov8856". Sensor's sink entity name is
++*      "Intel IPU6 CSI-2 2" and it is word facing. The value is ov8856-wf-2.
++* 2. <platform value="IPU6"/> the platform value must be uppercase letter.
++*
++*/
++std::vector<std::string> CameraParser::getAvailableSensors(const std::string &ipuName,
++                                                        const std::vector<std::string> &sensorsList)
++{
++    LOGXML("@%s, ipuName:%s", __func__, ipuName.c_str());
++
++    /* if the string doesn't contain -wf- or -uf-, it needn't be parsed */
++    if ((sensorsList[0].find("-wf-") == string::npos) &&
++        (sensorsList[0].find("-uf-") == string::npos)) {
++        return sensorsList;
++    }
++
++    // sensor's sink entity name prefix:Intel IPU6 CSI-2 2
++    std::string sensorSinkName = "Intel ";
++    sensorSinkName.append(ipuName);
++    sensorSinkName.append(" CSI-2 ");
++
++    std::vector<string> availableSensors;
++    for (auto& sensor : sensorsList) {
++        std::string srcSensor = sensor;
++        std::string portNum = srcSensor.substr(srcSensor.find_last_of('-') + 1);
++        std::string sensorSinkNameTmp = sensorSinkName;
++        sensorSinkNameTmp.append(portNum);
++        std::string sensorName = srcSensor.substr(0, srcSensor.find_first_of('-'));
++
++        bool ret = mMC->checkAvailableSensor(sensorName, sensorSinkNameTmp);
++        if (ret) {
++            std::string sensorNameTmp = srcSensor.substr(0, srcSensor.find_last_of('-'));
++            availableSensors.push_back(sensorNameTmp);
++            mAvailableSensor[sensorNameTmp] = sensorSinkNameTmp;
++            LOGXML("@%s, The availabel sensor name:%s, sensorSinkNameTmp:%s",
++                   __func__, sensorNameTmp.c_str(), sensorSinkNameTmp.c_str());
++        }
++    }
++
++    return availableSensors;
++}
++
++/**
++ * Get camera configuration from xml file
++ *
++ * The function will read the xml configuration file firstly.
++ * Then it will parse out the camera settings.
++ * The camera setting is stored inside this CameraParser class.
++ *
++ */
++void CameraParser::getProfileDataFromXmlFile(void)
++{
++    LOGXML("@%s", __func__);
++
++    // Get common data from libcamhal_profile.xml
++    int ret = getDataFromXmlFile(LIBCAMHAL_PROFILE_NAME);
++    CheckError(ret != OK, VOID_VALUE, "Failed to get libcamhal profile data frome %s", LIBCAMHAL_PROFILE_NAME);
++
++    // According to sensor name to get sensor data
++    LOGXML("The kinds of sensor is %zu", mStaticCfg->mCommonConfig.availableSensors.size());
++    vector<string> allSensors = getAvailableSensors(mStaticCfg->mCommonConfig.ipuName,
++                                                    mStaticCfg->mCommonConfig.availableSensors);
++
++    if (allSensors.size() == 0) {
++        LOGW("The style of libcamhal_profile is too old, please switch it as soon as possible !!!");
++        return;
++    }
++
++    for (auto sensor : allSensors) {
++        string sensorName = "sensors/";
++        sensorName.append(sensor);
++        sensorName.append(".xml");
++        int ret = getDataFromXmlFile(sensorName);
++        CheckError(ret != OK, VOID_VALUE, "Failed to get sensor profile data frome %s", sensorName.c_str());
++    }
++}
++
++void CameraParser::dumpSensorInfo(void)
++{
++    LOGXML("@%s, line%d, for sensors settings==================", __func__, __LINE__);
++    LOGXML("@%s, line%d, sensor number:%d", __func__, __LINE__, getSensorNum());
++    for (unsigned i = 0; i < getSensorNum(); i++) {
++        LOGXML("@%s, line%d, i:%d", __func__, __LINE__, i);
++        LOGXML("@%s, line%d, mCameras[%d].sensorName:%s", __func__, __LINE__, i, mStaticCfg->mCameras[i].sensorName.c_str());
++        LOGXML("@%s, line%d, mCameras[%d].mISysFourcc:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mISysFourcc);
++
++        stream_array_t supportedConfigs;
++        mStaticCfg->mCameras[i].mCapability.getSupportedStreamConfig(supportedConfigs);
++        for (size_t j = 0; j < supportedConfigs.size(); j++) {
++            LOGXML("@%s, line%d, mCameras[%d]: format:%d size(%dx%d) field:%d", __func__, __LINE__,
++                i, supportedConfigs[j].format, supportedConfigs[j].width,
++                supportedConfigs[j].height, supportedConfigs[j].field);
++        }
++
++        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mSupportedISysFormat.size(); j++) {
++            LOGXML("@%s, line%d, mCameras[%d].mSupportedISysFormat:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mSupportedISysFormat[j]);
++        }
++
++        // dump the media controller mapping table for supportedStreamConfig
++        LOGXML("The media controller mapping table size: %zu", mStaticCfg->mCameras[i].mStreamToMcMap.size());
++        for (auto& pool : mStaticCfg->mCameras[i].mStreamToMcMap) {
++            int mcId = pool.first;
++            stream_array_t &mcMapVector = pool.second;
++            LOGXML("mcId: %d, the supportedStreamConfig vector size: %zu", mcId, mcMapVector.size());
++        }
++
++        // dump the media controller information
++        LOGXML("============Format Configuration==================");
++        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mMediaCtlConfs.size(); j++) {
++            const MediaCtlConf* mc = &mStaticCfg->mCameras[i].mMediaCtlConfs[j];
++            for (unsigned k = 0; k < mc->links.size(); k++) {
++                const McLink* link = &mc->links[k];
++                LOGXML("       link src %s [%d:%d] ==> %s [%d:%d] enable %d", link->srcEntityName.c_str(), link->srcEntity, link->srcPad, link->sinkEntityName.c_str(), link->sinkEntity, link->sinkPad, link->enable);
++            }
++            for (unsigned k = 0; k < mc->ctls.size(); k++) {
++                const McCtl* ctl = &mc->ctls[k];
++                LOGXML("       Ctl %s [%d] cmd %s [0x%08x] value %d", ctl->entityName.c_str(), ctl->entity, ctl->ctlName.c_str(), ctl->ctlCmd, ctl->ctlValue);
++            }
++            for (unsigned k = 0; k < mc->formats.size(); k++) {
++                const McFormat* format = &mc->formats[k];
++                if (format->formatType == FC_FORMAT)
++                    LOGXML("       format %s [%d:%d] [%dx%d] %s", format->entityName.c_str(), format->entity, format->pad, format->width, format->height, CameraUtils::pixelCode2String(format->pixelCode));
++                else if (format->formatType == FC_SELECTION)
++                    LOGXML("       select %s [%d:%d] selCmd: %d [%d, %d] [%dx%d]", format->entityName.c_str(), format->entity, format->pad, format->selCmd, format->top, format->left, format->width, format->height);
++            }
++        }
++        LOGXML("============End of Format Configuration===========");
++    }
++
++    LOGXML("@%s, line%d, for common settings==================", __func__, __LINE__);
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.h b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
+new file mode 100644
+index 000000000000..4a0d42cf6f0e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
+@@ -0,0 +1,127 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ *\file CameraParser.h
++ *
++ * parser for the camera xml configuration file
++ *
++ * This file calls the libexpat ditectly. The libexpat is one xml parser.
++ * It will parse the camera configuration out firstly.
++ * Then other module can call the methods of it to get the real configuration.
++ *
++ */
++
++#pragma once
++
++#include <unordered_map>
++#include "PlatformData.h"
++#include "ParserBase.h"
++#include "CameraMetadata.h"
++
++namespace icamera {
++
++/**
++ * \class CameraParser
++ *
++ * This class is used to parse the camera configuration file.
++ * The configuration file is xml format.
++ * This class will use the expat lib to do the xml parser.
++ */
++class CameraParser : public ParserBase {
++public:
++    CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg);
++    ~CameraParser();
++
++    unsigned getSensorNum(void) {return mSensorNum;};
++
++private:
++    DISALLOW_COPY_AND_ASSIGN(CameraParser);
++
++private:
++    PlatformData::StaticCfg *mStaticCfg;
++
++    enum DataField {
++        FIELD_INVALID = 0,
++        FIELD_SENSOR,
++        FIELD_COMMON
++    } mCurrentDataField;
++    int mSensorNum;
++    int mCurrentSensor;
++    std::string mI2CBus;
++    std::string mCsiPort;
++    std::unordered_map<std::string, std::string> mAvailableSensor;
++    PlatformData::StaticCfg::CameraInfo *pCurrentCam;
++    bool mInMediaCtlCfg;
++    bool mInStaticMetadata;
++    MediaControl* mMC;
++    CameraMetadata mMetadata;
++
++    long* mMetadataCache;
++    static const int mMetadataCacheSize = 4096;
++
++    void startParseElement(void *userData, const char *name, const char **atts);
++    void endParseElement(void *userData, const char *name);
++
++    static void parseSizesList(const char *sizesStr, std::vector <camera_resolution_t> &sizes);
++    static int getSupportedFormat(const char* str, std::vector <int>& supportedFormat);
++    static int parsePair(const char *str, int *first, int *second, char delim, char **endptr = nullptr);
++
++    std::vector<std::string> getAvailableSensors(const std::string &ipuName,
++                                                 const std::vector<std::string> &sensorsList);
++    void getProfileDataFromXmlFile(void);
++    void getSensorDataFromXmlFile(void);
++    void checkField(CameraParser *profiles, const char *name, const char **atts);
++
++    void handleSensor(CameraParser *profiles, const char *name, const char **atts);
++    void handleCommon(CameraParser *profiles, const char *name, const char **atts);
++
++    void parseStreamConfig(const char* src, stream_array_t& configs);
++    void parseSupportedFeatures(const char* src, camera_features_list_t& features);
++    void parseSupportedIspControls(const char* src, std::vector<uint32_t>& features);
++    int parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes);
++    int parseSupportedAeMode(const char* str, std::vector <camera_ae_mode_t> &supportedModes);
++    int parseSupportedAfMode(const char* str, std::vector <camera_af_mode_t> &supportedModes);
++    int parseSupportedAntibandingMode(const char* str, std::vector <camera_antibanding_mode_t> &supportedModes);
++    int parseSupportedAeParamRange(const char* src, std::vector<int>& scenes,
++                                   std::vector<float>& minValues, std::vector<float>& maxValues);
++
++// parse the media controller configuration in xml, the MediaControl MUST be run before the parser to run.
++    void handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts);
++    void handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts);
++    void handleGenericStaticMetaData(const char *name, const char *src);
++    void parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts);
++    void storeMcMappForConfig(int mcId, stream_t streamCfg);
++    void parseLinkElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseRouteElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseControlElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseSelectionElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseFormatElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseVideoElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseOutputElement(CameraParser *profiles, const char *name, const char **atts);
++    void parseMultiExpRange(const char* src);
++
++    int parseSupportedTuningConfig(const char *str, std::vector <TuningConfig> &config);
++    int parseLardTags(const char *str, std::vector <LardTagConfig> &lardTags);
++
++    void dumpSensorInfo(void);
++
++    void parseOutputMap(const char *str, std::vector<UserToPslOutputMap> &outputMap);
++
++    std::string replaceStringInXml(CameraParser *profiles, const char *value);
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
+new file mode 100644
+index 000000000000..61119ac701f9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
+@@ -0,0 +1,228 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++#include <vector>
++#include <map>
++#include "Parameters.h"
++
++namespace icamera {
++
++/**
++ * Use to link buffer producers and consumers
++ */
++enum Port {
++    MAIN_PORT = 0,
++    SECOND_PORT,
++    THIRD_PORT,
++    FORTH_PORT,
++    INVALID_PORT
++};
++
++enum {
++    FACING_BACK = 0,
++    FACING_FRONT = 1,
++};
++
++enum {
++    ORIENTATION_0 = 0,
++    ORIENTATION_90 = 90,
++    ORIENTATION_180 = 180,
++    ORIENTATION_270 = 270,
++};
++
++enum {
++    LENS_VCM_HW = 0,
++    LENS_NONE_HW
++};
++
++enum {
++    AUTO_SWITCH_FULL = 0,
++    AUTO_SWITCH_PSYS
++};
++
++enum {
++    SENSOR_EXPOSURE_SINGLE = 0,        /* sensor is single exposure */
++    SENSOR_FIX_EXPOSURE_RATIO,         /* Fix exposure ratio between long and short exposure */
++    SENSOR_RELATIVE_MULTI_EXPOSURES,   /* AE output exposures are converted to Shutter and
++                                          Readout time, then set to sensor driver */
++    SENSOR_MULTI_EXPOSURES,            /* Multi-exposures are set to sensor driver directly */
++    SENSOR_DUAL_EXPOSURES_DCG_AND_VS   /* Dual-exposure and multiple gains, i.e. DCG + VS */
++};
++
++enum {
++    SENSOR_GAIN_NONE = 0,
++    SENSOR_MULTI_DG_AND_CONVERTION_AG,  /* Multi-DigitalGain and convertion AnalogGain are set
++                                           to sensor driver */
++    ISP_DG_AND_SENSOR_DIRECT_AG,        /* All digital gain is passed to ISP */
++    SENSOR_MULTI_DG_AND_DIRECT_AG       /* Multi analog and digital gains, i.e. DCG */
++};
++
++/**
++ * This definition is used to distinguish different camera running mode, like video or still.
++ */
++typedef enum {
++    TUNING_MODE_VIDEO,
++    TUNING_MODE_VIDEO_ULL,
++    TUNING_MODE_VIDEO_CUSTOM_AIC,
++    TUNING_MODE_VIDEO_LL,
++    TUNING_MODE_VIDEO_REAR_VIEW,
++    TUNING_MODE_VIDEO_HITCH_VIEW,
++    TUNING_MODE_STILL_CAPTURE,
++    TUNING_MODE_MAX
++} TuningMode;
++
++/*
++ * The mapping algorithm for sensor digital gain
++ */
++typedef enum {
++    SENSOR_DG_TYPE_NONE,
++    SENSOR_DG_TYPE_X,           //linear relationship, gain = n*value (value: register value, n: ratio)
++    SENSOR_DG_TYPE_2_X,         //exponential relationship, gain = 2 ^ value (value: register value)
++} SensorDgType;
++
++typedef enum {
++    MORPH_TABLE = 0,
++    IMG_TRANS
++} DvsType;
++
++// Note AUTO is not real config mode in the HAL.
++typedef camera_stream_configuration_mode_t ConfigMode;
++
++typedef struct TuningConfig {
++    ConfigMode configMode;                 /*!< configMode is internal usage to select AIQ and
++                                                Pipeline. AUTO is not real config mode. */
++    TuningMode tuningMode;                 /*!< tuningMode is used to define user cases,
++                                                like video or still. */
++    std::string aiqbName;                       /*!< special aiqb name corresponding with TuningMode */
++} TuningConfig;
++
++typedef struct {
++    /*!< tuningMode is used to define user cases, like video or still. */
++    TuningMode tuningMode;
++    unsigned int cmcTag;
++    unsigned int aiqTag;
++    unsigned int ispTag;
++    unsigned int othersTag;
++} LardTagConfig;
++
++typedef struct {
++    uint32_t horizontal_crop_offset;
++    uint32_t vertical_crop_offset;
++    uint32_t cropped_image_width;
++    uint32_t cropped_image_height;
++    uint32_t horizontal_scaling_numerator;
++    uint32_t horizontal_scaling_denominator;
++    uint32_t vertical_scaling_numerator;
++    uint32_t vertical_scaling_denominator;
++} SensorFrameParams;
++
++enum ExecutorNotifyPolicy {
++    POLICY_FRAME_FIRST = 0,
++    POLICY_STATS_FIRST,
++    POLICY_INVALID,
++};
++
++struct ExecutorPolicy {
++    std::string exeName;
++    ExecutorNotifyPolicy notifyPolicy;
++    std::vector<std::string> pgList;
++    std::vector<int> opModeList;
++    std::vector<int> cyclicFeedbackRoutineList;
++    std::vector<int> cyclicFeedbackDelayList;
++    ExecutorPolicy() : notifyPolicy(POLICY_FRAME_FIRST) {}
++};
++
++struct ExecutorDepth {
++    std::vector<std::string> bundledExecutors;
++    std::vector<int> depths;
++};
++
++struct PolicyConfig {
++    int graphId;
++    std::string policyDescription;
++    std::vector<ExecutorPolicy> pipeExecutorVec;
++    std::vector<std::string> exclusivePgs;
++    std::vector<ExecutorDepth> bundledExecutorDepths;
++    bool enableBundleInSdv;
++
++    PolicyConfig() { graphId = -1; enableBundleInSdv = true; }
++};
++
++struct CommonConfig {
++    float xmlVersion;
++    std::string ipuName;
++    std::vector<std::string> availableSensors;
++    bool isGpuTnrEnabled;
++    int cameraNumber;
++
++    CommonConfig() { xmlVersion = 1.0; isGpuTnrEnabled = false; cameraNumber = 0;}
++};
++
++struct OBSetting {
++    ConfigMode configMode;
++    int top;
++    int left;
++    int sectionHeight;
++    int interleaveStep;
++};
++
++struct ExpRange {
++    int min;
++    int max;
++    int step;
++    int lowerBound;
++    int upperBound;
++};
++
++/**
++ * Multi exposure range information
++*/
++struct MultiExpRange {
++    camera_resolution_t Resolution;
++    ExpRange SHS1;
++    ExpRange RHS1;
++    ExpRange SHS2;
++    ExpRange RHS2;
++    ExpRange SHS3;
++};
++
++struct UserToPslOutputMap {
++    camera_resolution_t User;
++    camera_resolution_t Psl;
++};
++
++struct FrameInfo {
++    FrameInfo() {}
++    int mWidth = 0;
++    int mHeight = 0;
++    int mFormat = 0;
++    int mStride = 0;
++    int mBpp = 0;
++};
++typedef std::map<Port, FrameInfo> FrameInfoPortMap;
++
++/**
++ * Indicate if the graph setting for video and still is coupled or dispersed
++ */
++typedef enum {
++    COUPLED,
++    DISPERSED,
++} GraphSettingType;
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
+new file mode 100644
+index 000000000000..92c3f76ed0d8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
+@@ -0,0 +1,165 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "ParserBase"
++
++#include <memory>
++#include <expat.h>
++#include <string.h>
++
++#include "ParserBase.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++
++ParserBase::ParserBase()
++{
++    LOGXML("@%s", __func__);
++}
++
++const char *ParserBase::skipWhiteSpace(const char *src)
++{
++    while (*src == '\n' || *src == '\t' || *src == ' ' || *src == '\v' || *src == '\r' || *src == '\f') {
++        src++;
++    }
++    return src;
++}
++
++int ParserBase::parseXmlParameterToChar(const char *str, unsigned char *table)
++{
++    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
++
++    int index = 0;
++    char *savePtr, *tablePtr;
++    int sz = strlen(str);
++    char src[sz + 1];
++    MEMCPY_S(src, sz, str, sz);
++    src[sz] = '\0';
++
++    tablePtr = strtok_r(src, ",", &savePtr);
++    while (tablePtr) {
++        table[index] = atoi(tablePtr);
++        if (savePtr != nullptr)
++            savePtr = const_cast<char *>(skipWhiteSpace(savePtr));
++        index++;
++        tablePtr = strtok_r(nullptr, ",", &savePtr);
++    }
++    return 0;
++}
++
++/* template function need the function ptr */
++std::string ParserBase::convertCharToString(const char *str)
++{
++    return str;
++}
++
++void ParserBase::startElement(void *userData, const char *name, const char **atts)
++{
++    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
++    profiles->startParseElement(userData, name, atts);
++}
++
++void ParserBase::endElement(void *userData, const char *name)
++{
++    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
++    profiles->endParseElement(userData, name);
++}
++
++int ParserBase::parseXmlFile(const std::string &xmlFile)
++{
++    int ret = UNKNOWN_ERROR;
++    int done;
++    FILE *fp = nullptr;
++    int bufSize = 4 * 1024;  // parse 4k data every time
++
++    CheckError(xmlFile.empty(), UNKNOWN_ERROR, "xmlFile is empty");
++
++    LOGXML("@%s, parsing profile: %s", __func__, xmlFile.c_str());
++
++    fp = ::fopen(xmlFile.c_str(), "r");
++    CheckError(nullptr == fp, UNKNOWN_ERROR, "@%s, line:%d, Can not open profile file %s in read mode, fp is nullptr",
++          __func__, __LINE__, xmlFile.c_str());
++
++    std::unique_ptr<char[]>pBuf(new char[bufSize]);
++    XML_Parser parser = ::XML_ParserCreate(nullptr);
++    if (nullptr == parser) {
++        LOGE("@%s, line:%d, parser is nullptr", __func__, __LINE__);
++        goto exit;
++    }
++
++    ::XML_SetUserData(parser, this);
++    ::XML_SetElementHandler(parser, startElement, endElement);
++
++    do {
++        int len = (int)::fread(pBuf.get(), 1, bufSize, fp);
++        if (!len) {
++            if (ferror(fp)) {
++                clearerr(fp);
++                goto exit;
++            }
++        }
++        done = len < bufSize;
++        if (XML_Parse(parser, (const char *)pBuf.get(), len, done) == XML_STATUS_ERROR) {
++            LOGE("@%s, line:%d, XML_Parse error", __func__, __LINE__);
++            goto exit;
++        }
++    } while (!done);
++    ret = OK;
++
++exit:
++    if (parser)
++        ::XML_ParserFree(parser);
++    if (fp)
++    ::fclose(fp);
++
++    return ret;
++}
++
++void ParserBase::getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
++                                     std::string &xmlFile)
++{
++    struct stat st;
++    for (auto xml : avaliableXmlFiles) {
++        int ret = stat(xml, &st);
++        if (ret == 0) {
++            xmlFile = xml;
++            return;
++        }
++    }
++}
++
++int ParserBase::getDataFromXmlFile(std::string fileName)
++{
++    LOGXML("@%s", __func__);
++    CheckError(fileName.size() == 0, UNKNOWN_ERROR, "file name is null");
++
++    std::string curFolderFileName = std::string("./") + fileName;
++    std::string sysFolderFileName = PlatformData::getCameraCfgPath() + fileName;
++    const std::vector <const char *> profiles = {
++        curFolderFileName.c_str(),
++        sysFolderFileName.c_str()
++    };
++
++    std::string chosenXmlFile;
++    getAvaliableXmlFile(profiles, chosenXmlFile);
++    CheckError(chosenXmlFile.empty(), UNKNOWN_ERROR, "%s is not found in: %s or %s",
++          fileName.c_str(), curFolderFileName.c_str(), sysFolderFileName.c_str());
++
++    return parseXmlFile(chosenXmlFile);
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.h b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
+new file mode 100644
+index 000000000000..c6ccaff7dd38
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
+@@ -0,0 +1,102 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ *\file ParserBase.h
++ *
++ * parser for the camera xml configuration file, this is a basic class.
++ *
++ * This file calls the libexpat ditectly. The libexpat is one xml parser.
++ * It will parse the camera configuration out firstly.
++ * Then other module can call the methods of it to get the real configuration.
++ *
++ */
++
++#pragma once
++
++#include "PlatformData.h"
++
++namespace icamera {
++
++class ParserBaseCallBack {
++public:
++    virtual ~ParserBaseCallBack() {}
++    virtual void startParseElement(void *userData, const char *name, const char **atts){};
++    virtual void endParseElement(void *userData, const char *name){};
++};
++
++class ParserBase : public ParserBaseCallBack {
++public:
++    ParserBase();
++    virtual ~ParserBase() {}
++
++private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(ParserBase);
++
++protected:
++    /**
++     * Get an avaliable xml file
++     *
++     * Find the first avaliable xml file.
++     *
++     * \param[in] const vector<char *>& allAvaliableXmlFiles: all avaliable xml files list.
++     * \param[out] string& xmlFile: to store a avaliable xml file
++     */
++    void getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
++                             std::string &xmlFile);
++
++    /**
++     * Get camera configuration from xml file
++     *
++     * The function will read the xml configuration file firstly.
++     * Then it will parse out the camera settings.
++     * The camera setting is stored inside this CameraProfiles class.
++     */
++    int getDataFromXmlFile(std::string fileName);
++
++    int parseXmlFile(const std::string &xmlFile);
++    const char* skipWhiteSpace(const char *src);
++    int parseXmlParameterToChar(const char *str, unsigned char *table);
++
++    static void startElement(void *userData, const char *name, const char **atts);
++    static void endElement(void *userData, const char *name);
++    static std::string convertCharToString(const char *str);
++
++    template<typename T>
++    int parseXmlConvertStrings(const char *str, std::vector<T> &vectorT,
++                               T (*parseXmlString)(const char *)) {
++        CheckError(str == nullptr || parseXmlString == nullptr, -1, "@%s, input parameter is nullptr", __func__);
++
++        int sz = strlen(str);
++        char src[sz + 1];
++        MEMCPY_S(src, sz, str, sz);
++        src[sz] = '\0';
++
++        char *savePtr = nullptr;
++        char *cfgName = strtok_r(src, ",", &savePtr);
++        while(cfgName) {
++            vectorT.push_back(parseXmlString(cfgName));
++            if (savePtr != nullptr)
++                savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
++            cfgName = strtok_r(nullptr, ",", &savePtr);
++        }
++
++        return 0;
++    }
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
+new file mode 100644
+index 000000000000..b42f436b218d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
+@@ -0,0 +1,1369 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "PlatformData"
++
++#include <sys/sysinfo.h>
++#include <math.h>
++#include <memory>
++
++#include "iutils/CameraLog.h"
++
++#include "PlatformData.h"
++#include "CameraParser.h"
++#include "PolicyParser.h"
++#include "ParameterHelper.h"
++
++#include "gc/GraphConfigManager.h"
++
++using std::string;
++using std::vector;
++
++namespace icamera {
++PlatformData *PlatformData::sInstance = nullptr;
++Mutex  PlatformData::sLock;
++
++PlatformData* PlatformData::getInstance()
++{
++    AutoMutex lock(sLock);
++    if (sInstance == nullptr) {
++        sInstance = new PlatformData();
++    }
++
++    return sInstance;
++}
++
++void PlatformData::releaseInstance()
++{
++    AutoMutex lock(sLock);
++    LOG1("@%s", __func__);
++
++    if (sInstance) {
++        delete sInstance;
++        sInstance = nullptr;
++    }
++}
++
++PlatformData::PlatformData()
++{
++    LOG1("@%s", __func__);
++    MediaControl *mc = MediaControl::getInstance();
++    mc->initEntities();
++
++    CameraParser CameraParser(mc, &mStaticCfg);
++    PolicyParser PolicyParser(&mStaticCfg);
++}
++
++PlatformData::~PlatformData() {
++    LOG1("@%s", __func__);
++
++    releaseGraphConfigNodes();
++
++    MediaControl::getInstance()->clearEntities();
++    MediaControl::releaseInstance();
++
++    for (size_t i = 0; i < mAiqInitData.size(); i++) {
++        delete mAiqInitData[i];
++    }
++
++    mAiqInitData.clear();
++}
++
++int PlatformData::init() {
++    LOG2("@%s", __func__);
++
++    getInstance()->parseGraphFromXmlFile();
++
++    StaticCfg *staticCfg = &(getInstance()->mStaticCfg);
++    for (size_t i = 0; i < staticCfg->mCameras.size(); i++) {
++        AiqInitData* aiqInitData =
++            new AiqInitData(staticCfg->mCameras[i].sensorName,
++                            getCameraCfgPath(),
++                            staticCfg->mCameras[i].mSupportedTuningConfig,
++                            staticCfg->mCameras[i].mLardTagsConfig,
++                            staticCfg->mCameras[i].mNvmDirectory,
++                            staticCfg->mCameras[i].mMaxNvmDataSize);
++        getInstance()->mAiqInitData.push_back(aiqInitData);
++    }
++
++    return OK;
++}
++
++/**
++ * Read graph descriptor and settings from configuration files.
++ *
++ * The resulting graphs represend all possible graphs for given sensor, and
++ * they are stored in capinfo structure.
++ */
++void PlatformData::parseGraphFromXmlFile() {
++    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
++
++    // Assuming that PSL section from profiles is already parsed, and number
++    // of cameras is known.
++    graphConfig->addCustomKeyMap();
++    for (size_t i = 0; i < getInstance()->mStaticCfg.mCameras.size(); ++i) {
++        const string &fileName = getInstance()->mStaticCfg.mCameras[i].mGraphSettingsFile;
++        if (fileName.empty()) {
++            continue;
++        }
++
++        LOGXML("Using graph setting file:%s for camera:%zu", fileName.c_str(), i);
++        int ret  = graphConfig->parse(i, fileName.c_str());
++        CheckError(ret != OK, VOID_VALUE, "Could not read graph config file for camera %zu", i);
++    }
++}
++
++void PlatformData::releaseGraphConfigNodes()
++{
++    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
++    graphConfig->releaseGraphNodes();
++    for (uint8_t cameraId = 0; cameraId < mStaticCfg.mCameras.size(); cameraId++) {
++        IGraphConfigManager::releaseInstance(cameraId);
++    }
++}
++
++const char* PlatformData::getSensorName(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].sensorName.c_str();
++}
++
++const char* PlatformData::getSensorDescription(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].sensorDescription.c_str();
++}
++
++const char* PlatformData::getLensName(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mLensName.c_str();
++}
++
++int PlatformData::getLensHwType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mLensHwType;
++}
++
++int PlatformData::getDVSType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mDVSType;
++}
++
++bool PlatformData::getISYSCompression(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mISYSCompression;
++}
++
++bool PlatformData::getPSACompression(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPSACompression;
++}
++
++bool PlatformData::getOFSCompression(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mOFSCompression;
++}
++
++int PlatformData::getCITMaxMargin(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mCITMaxMargin;
++}
++
++bool PlatformData::isEnableAIQ(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAIQ;
++}
++
++bool PlatformData::isEnableLtmThread(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmThread;
++}
++
++bool PlatformData::isFaceAeEnabled(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceAeEnabled;
++}
++
++int PlatformData::faceEngineRunningInterval(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningInterval;
++}
++
++int PlatformData::faceEngineRunningIntervalNoFace(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningIntervalNoFace;
++}
++
++bool PlatformData::isFaceEngineSyncRunning(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningSync;
++}
++
++bool PlatformData::isDvsSupported(int cameraId)
++{
++    camera_video_stabilization_list_t videoStabilizationList;
++    Parameters* param = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
++    param->getSupportedVideoStabilizationMode(videoStabilizationList);
++
++    bool supported = false;
++    for (auto it : videoStabilizationList) {
++        if (it == VIDEO_STABILIZATION_MODE_ON) {
++            supported = true;
++        }
++    }
++
++    LOG2("@%s, dvs supported:%d", __func__, supported);
++    return supported;
++}
++
++bool PlatformData::psysAlignWithSof(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysAlignWithSof;
++}
++
++bool PlatformData::psysBundleWithAic(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysBundleWithAic;
++}
++
++bool PlatformData::swProcessingAlignWithIsp(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mSwProcessingAlignWithIsp;
++}
++
++bool PlatformData::isUsingSensorDigitalGain(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mUseSensorDigitalGain;
++}
++
++bool PlatformData::isUsingIspDigitalGain(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mUseIspDigitalGain;
++}
++
++bool PlatformData::isNeedToPreRegisterBuffer(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mNeedPreRegisterBuffers;
++}
++
++int PlatformData::getAutoSwitchType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mAutoSwitchType;
++}
++
++bool PlatformData::isEnableFrameSyncCheck(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mFrameSyncCheckEnabled;
++}
++
++bool PlatformData::isEnableDefog(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmDefog;
++}
++
++int PlatformData::getExposureNum(int cameraId, bool multiExposure)
++{
++    if (multiExposure) {
++        return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureNum;
++    }
++
++    int exposureNum = 1;
++
++    return exposureNum;
++}
++
++bool PlatformData::isLtmEnabled(int cameraId)
++{
++
++    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmEnabled;
++}
++
++int PlatformData::getSensorExposureType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureType;
++}
++
++int PlatformData::getSensorGainType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorGainType;
++}
++
++bool PlatformData::isSkipFrameOnSTR2MMIOErr(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mSkipFrameV4L2Error;
++}
++
++unsigned int PlatformData::getInitialSkipFrame(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mInitialSkipFrame;
++}
++
++unsigned int PlatformData::getMaxRawDataNum(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxRawDataNum;
++}
++
++bool PlatformData::getTopBottomReverse(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mTopBottomReverse;
++}
++
++bool PlatformData::isPsysContinueStats(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysContinueStats;
++}
++
++unsigned int PlatformData::getPreferredBufQSize(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPreferredBufQSize;
++}
++
++unsigned int PlatformData::getPipeSwitchDelayFrame(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mPipeSwitchDelayFrame;
++}
++
++int PlatformData::getLtmGainLag(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmGainLag;
++}
++
++int PlatformData::getMaxSensorDigitalGain(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxSensorDigitalGain;
++}
++
++SensorDgType PlatformData::sensorDigitalGainType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorDgType;
++}
++
++int PlatformData::getExposureLag(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mExposureLag;
++}
++
++int PlatformData::getGainLag(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mGainLag;
++}
++
++PolicyConfig* PlatformData::getExecutorPolicyConfig(int graphId)
++{
++    size_t i = 0;
++    PlatformData::StaticCfg *cfg = &getInstance()->mStaticCfg;
++
++    for (i = 0; i < cfg->mPolicyConfig.size(); i++) {
++        if (graphId == cfg->mPolicyConfig[i].graphId) {
++            return &(cfg->mPolicyConfig[i]);
++        }
++    }
++
++    LOGW("Couldn't find the executor policy for graphId(%d), please check xml file", graphId);
++    return nullptr;
++}
++
++int PlatformData::numberOfCameras()
++{
++    return getInstance()->mStaticCfg.mCameras.size();
++}
++
++int PlatformData::getXmlCameraNumber()
++{
++    return getInstance()->mStaticCfg.mCommonConfig.cameraNumber;
++}
++
++MediaCtlConf *PlatformData::getMediaCtlConf(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf;
++}
++
++int PlatformData::getCameraInfo(int cameraId, camera_info_t& info)
++{
++    // TODO correct the version info
++    info.device_version = 1;
++    info.facing = getInstance()->mStaticCfg.mCameras[cameraId].mFacing;
++    info.orientation= getInstance()->mStaticCfg.mCameras[cameraId].mOrientation;
++    info.name = getSensorName(cameraId);
++    info.description = getSensorDescription(cameraId);
++    info.capability = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
++    return OK;
++}
++
++bool PlatformData::isFeatureSupported(int cameraId, camera_features feature)
++{
++    camera_features_list_t features;
++    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedFeatures(features);
++
++    if (features.empty()) {
++        return false;
++    }
++    for (auto& item : features) {
++        if (item == feature) {
++            return true;
++        }
++    }
++    return false;
++}
++
++bool PlatformData::isSupportedStream(int cameraId, const stream_t& conf)
++{
++    int width = conf.width;
++    int height = conf.height;
++    int format = conf.format;
++    int field = conf.field;
++
++    stream_array_t availableConfigs;
++    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedStreamConfig(availableConfigs);
++    bool sameConfigFound = false;
++    for (auto const& config : availableConfigs) {
++        if (config.format == format && config.field == field
++                && config.width == width && config.height == height) {
++            sameConfigFound = true;
++            break;
++        }
++    }
++
++    return sameConfigFound;
++}
++
++void PlatformData::getSupportedISysSizes(int cameraId, vector <camera_resolution_t>& resolutions)
++{
++    resolutions = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysSizes;
++}
++
++bool PlatformData::getSupportedISysFormats(int cameraId, vector <int>& formats)
++{
++    formats = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
++
++    return true;
++}
++
++int PlatformData::getISysFormat(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc;
++}
++
++/**
++ * The ISYS format is determined by the steps below:
++ * 1. Try to use the specified format in media control config if it exists.
++ * 2. If the given format is supported by ISYS, then use it.
++ * 3. Use the first supported format if still could not find an appropriate one.
++ */
++void PlatformData::selectISysFormat(int cameraId, int format)
++{
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    if (mc != nullptr && mc->format != -1) {
++        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = mc->format;
++    } else if (isISysSupportedFormat(cameraId, format)) {
++        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = format;
++    } else {
++        // Set the first one in support list to default Isys output.
++        vector <int> supportedFormat =
++            getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
++        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = supportedFormat[0];
++    }
++}
++
++/**
++ * The media control config is determined by the steps below:
++ * 1. Check if can get one from the given MC ID.
++ * 2. And then, try to use ConfigMode to find matched one.
++ * 3. Use stream config to get a corresponding mc id, and then get the config by id.
++ * 4. Return nullptr if still could not find an appropriate one.
++ */
++void PlatformData::selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId)
++{
++    if (!isIsysEnabled(cameraId)) return;
++
++    const StaticCfg::CameraInfo& pCam = getInstance()->mStaticCfg.mCameras[cameraId];
++
++    MediaCtlConf* mcConfig = getMcConfByMcId(pCam, mcId);
++    if (!mcConfig) {
++        mcConfig = getMcConfByConfigMode(pCam, stream, mode);
++    }
++
++    if (!mcConfig) {
++        mcConfig = getMcConfByStream(pCam, stream);
++    }
++
++    getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf = mcConfig;
++
++    if (!mcConfig) {
++        LOGE("No matching McConf: cameraId %d, configMode %d, mcId %d", cameraId, mode, mcId);
++    }
++}
++
++/*
++ * Find the MediaCtlConf based on the given MC id.
++ */
++MediaCtlConf* PlatformData::getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId)
++{
++    if (mcId == -1) {
++        return nullptr;
++    }
++
++    for (auto& mc : cameraInfo.mMediaCtlConfs) {
++        if (mcId == mc.mcId) {
++            return (MediaCtlConf*)&mc;
++        }
++    }
++
++    return nullptr;
++}
++
++/*
++ * Find the MediaCtlConf based on MC id in mStreamToMcMap.
++ */
++MediaCtlConf* PlatformData::getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
++                                              const stream_t& stream)
++{
++    int mcId = -1;
++    for (auto& table : cameraInfo.mStreamToMcMap) {
++        for(auto& config : table.second) {
++            if (config.format == stream.format && config.field == stream.field
++                    && config.width == stream.width && config.height == stream.height) {
++                mcId = table.first;
++                break;
++            }
++        }
++        if (mcId != -1) {
++            break;
++        }
++    }
++
++    return getMcConfByMcId(cameraInfo, mcId);
++}
++
++/*
++ * Find the MediaCtlConf based on operation mode and stream info.
++ */
++MediaCtlConf* PlatformData::getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
++                                                  const stream_t& stream, ConfigMode mode)
++{
++    for (auto& mc : cameraInfo.mMediaCtlConfs) {
++        for (auto& cfgMode : mc.configMode) {
++            if (mode != cfgMode) continue;
++
++            int outputWidth = mc.outputWidth;
++            int outputHeight = mc.outputHeight;
++            int stride = CameraUtils::getStride(mc.format, mc.outputWidth);
++            bool sameStride = (stride == CameraUtils::getStride(mc.format, stream.width));
++            /*
++             * outputWidth and outputHeight is 0 means the ISYS output size
++             * is dynamic, we don't need to check if it matches with stream config.
++             */
++            if ((outputWidth == 0 && outputHeight == 0 ) ||
++                ((stream.width == outputWidth || sameStride)
++                && stream.height == outputHeight)) {
++                return (MediaCtlConf*)&mc;
++            }
++        }
++    }
++
++    return nullptr;
++}
++
++/*
++ * Check if video node is enabled via camera Id and video node type.
++ */
++bool PlatformData::isVideoNodeEnabled(int cameraId, VideoNodeType type) {
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    if (!mc) return false;
++
++    for(auto const& nd : mc->videoNodes) {
++        if (type == nd.videoNodeType) {
++            return true;
++        }
++    }
++    return false;
++}
++
++bool PlatformData::isISysSupportedFormat(int cameraId, int format)
++{
++    vector <int> supportedFormat;
++    getSupportedISysFormats(cameraId, supportedFormat);
++
++    for (auto const fmt : supportedFormat) {
++        if (format == fmt)
++            return true;
++    }
++    return false;
++}
++
++bool PlatformData::isISysSupportedResolution(int cameraId, camera_resolution_t resolution)
++{
++    vector <camera_resolution_t> res;
++    getSupportedISysSizes(cameraId, res);
++
++    for (auto const& size : res) {
++        if (resolution.width == size.width && resolution.height== size.height)
++            return true;
++    }
++
++    return false;
++}
++
++int PlatformData::getISysRawFormat(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mISysRawFormat;
++}
++
++stream_t PlatformData::getISysOutputByPort(int cameraId, Port port)
++{
++    stream_t config;
++    CLEAR(config);
++
++    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
++    CheckError(!mc, config, "Invalid media control config.");
++
++    for (const auto& output : mc->outputs) {
++        if (output.port == port) {
++            config.format  = output.v4l2Format;
++            config.width   = output.width;
++            config.height  = output.height;
++            break;
++        }
++    }
++
++    return config;
++}
++
++bool PlatformData::isAiqdEnabled(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAiqd;
++}
++
++int PlatformData::getFormatByDevName(int cameraId, const string& devName, McFormat& format)
++{
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
++
++    for (auto &fmt : mc->formats) {
++        if (fmt.formatType == FC_FORMAT && devName == fmt.entityName) {
++            format = fmt;
++            return OK;
++        }
++    }
++
++    LOGE("Failed to find DevName for cameraId: %d, devname: %s", cameraId, devName.c_str());
++    return BAD_VALUE;
++}
++
++int PlatformData::getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType, string& videoNodeName)
++{
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
++
++    for(auto const& nd : mc->videoNodes) {
++        if (videoNodeType == nd.videoNodeType) {
++            videoNodeName = nd.name;
++            return OK;
++        }
++    }
++
++    LOGE("failed to find video note name for cameraId: %d", cameraId);
++    return BAD_VALUE;
++}
++
++int PlatformData::getDevNameByType(int cameraId, VideoNodeType videoNodeType, string& devName)
++{
++    if (!isIsysEnabled(cameraId)) return OK;
++
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    bool isSubDev = false;
++
++    switch (videoNodeType) {
++        case VIDEO_PIXEL_ARRAY:
++        case VIDEO_PIXEL_BINNER:
++        case VIDEO_PIXEL_SCALER:
++        {
++            isSubDev = true;
++            // For sensor subdevices are fixed and sensor HW may be initialized before configure,
++            // the first MediaCtlConf is used to find sensor subdevice name.
++            PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
++            mc = &pCam->mMediaCtlConfs[0];
++            break;
++        }
++        case VIDEO_ISYS_RECEIVER_BACKEND:
++        case VIDEO_ISYS_RECEIVER:
++        {
++            isSubDev = true;
++            break;
++        }
++        default:
++            break;
++    }
++
++    CheckError(!mc, NAME_NOT_FOUND, "failed to get MediaCtlConf, videoNodeType %d", videoNodeType);
++
++    for(auto& nd : mc->videoNodes) {
++        if (videoNodeType == nd.videoNodeType) {
++            string tmpDevName;
++            CameraUtils::getDeviceName(nd.name.c_str(), tmpDevName, isSubDev);
++            if (!tmpDevName.empty()) {
++                devName = tmpDevName;
++                LOG2("@%s, Found DevName. cameraId: %d, get video node: %s, devname: %s",
++                      __func__, cameraId, nd.name.c_str(), devName.c_str());
++                return OK;
++            } else {
++                // Use default device name if cannot find it
++                if (isSubDev)
++                    devName = "/dev/v4l-subdev1";
++                else
++                    devName = "/dev/video5";
++                LOGE("Failed to find DevName for cameraId: %d, get video node: %s, devname: %s",
++                      cameraId, nd.name.c_str(), devName.c_str());
++                return NAME_NOT_FOUND;
++            }
++        }
++    }
++
++    LOG1("Failed to find devname for cameraId: %d, use default setting instead", cameraId);
++    return NAME_NOT_FOUND;
++}
++
++/**
++ * The ISYS best resolution is determined by the steps below:
++ * 1. If the resolution is specified in MediaCtlConf, then use it.
++ * 2. Try to find the exact matched one in ISYS supported resolutions.
++ * 3. Try to find the same ratio resolution.
++ * 4. If still couldn't get one, then use the biggest one.
++ */
++camera_resolution_t PlatformData::getISysBestResolution(int cameraId, int width,
++                                                        int height, int field)
++{
++    LOG1("@%s, width:%d, height:%d", __func__, width, height);
++
++    // Skip for interlace, we only support by-pass in interlaced mode
++    if (field == V4L2_FIELD_ALTERNATE) {
++        return {width, height};
++    }
++
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    // The isys output size is fixed if outputWidth/outputHeight != 0
++    // So we use it to as the ISYS resolution.
++    if (mc != nullptr && mc->outputWidth != 0 && mc->outputHeight != 0) {
++        return {mc->outputWidth, mc->outputHeight};
++    }
++
++    const float RATIO_TOLERANCE = 0.05f; // Supported aspect ratios that are within RATIO_TOLERANCE
++    const float kTargetRatio = (float)width / height;
++
++    vector <camera_resolution_t> res;
++    // The supported resolutions are saved in res with ascending order(small -> bigger)
++    getSupportedISysSizes(cameraId, res);
++
++    // Try to find out the same resolution in the supported isys resolution list
++    // if it couldn't find out the same one, then use the bigger one which is the same ratio
++    for (auto const& size : res) {
++        if (width <= size.width && height <= size.height &&
++            fabs((float)size.width/size.height - kTargetRatio) < RATIO_TOLERANCE) {
++            LOG1("@%s: Found the best ISYS resoltoution (%d)x(%d)", __func__,
++                 size.width, size.height);
++            return {size.width, size.height};
++        }
++    }
++
++    // If it still couldn't find one, then use the biggest one in the supported list.
++    LOG1("@%s: ISYS resolution not found, used the biggest one: (%d)x(%d)",
++         __func__, res.back().width, res.back().height);
++    return {res.back().width, res.back().height};
++}
++
++bool PlatformData::isIsysEnabled(int cameraId)
++{
++    if (getInstance()->mStaticCfg.mCameras[cameraId].mMediaCtlConfs.empty()) {
++        return false;
++    }
++    return true;
++}
++
++int PlatformData::calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams)
++{
++    if (!isIsysEnabled(cameraId)) {
++        LOG2("%s, no mc, just use default from xml", __func__);
++        vector <camera_resolution_t> res;
++        getSupportedISysSizes(cameraId, res);
++
++        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
++        sensorFrameParams = {0, 0, static_cast<uint32_t>(res[0].width),
++                             static_cast<uint32_t>(res[0].height), 1, 1, 1, 1};
++
++        return OK;
++    }
++
++    CLEAR(sensorFrameParams);
++
++    uint32_t width = 0;
++    uint32_t horizontalOffset = 0;
++    uint32_t horizontalBinNum = 1;
++    uint32_t horizontalBinDenom = 1;
++    uint32_t horizontalBin = 1;
++
++    uint32_t height = 0;
++    uint32_t verticalOffset = 0;
++    uint32_t verticalBinNum = 1;
++    uint32_t verticalBinDenom = 1;
++    uint32_t verticalBin = 1;
++
++    /**
++     * For this function, it may be called without configuring stream
++     * in some UT cases, the mc is nullptr at this moment. So we need to
++     * get one default mc to calculate frame params.
++     */
++    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
++    if (mc == nullptr) {
++        PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
++        mc = &pCam->mMediaCtlConfs[0];
++    }
++
++    bool pixArraySizeFound = false;
++    for (auto const& current : mc->formats) {
++        if (!pixArraySizeFound && current.width > 0 && current.height > 0) {
++            width = current.width;
++            height = current.height;
++            pixArraySizeFound = true;
++            LOG2("%s: active pixel array H=%d, W=%d", __func__, height, width);
++            //Setup initial sensor frame params.
++            sensorFrameParams.horizontal_crop_offset += horizontalOffset;
++            sensorFrameParams.vertical_crop_offset += verticalOffset;
++            sensorFrameParams.cropped_image_width = width;
++            sensorFrameParams.cropped_image_height = height;
++            sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
++            sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
++            sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
++            sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
++        }
++
++        if (current.formatType != FC_SELECTION) {
++            continue;
++        }
++
++        if (current.selCmd == V4L2_SEL_TGT_CROP) {
++
++            width = current.width * horizontalBin;
++            horizontalOffset = current.left * horizontalBin;
++            height = current.height * verticalBin;
++            verticalOffset = current.top * verticalBin;
++
++            LOG2("%s: crop (binning factor: hor/vert:%d,%d)"
++                  , __func__, horizontalBin, verticalBin);
++
++            LOG2("%s: crop left = %d, top = %d, width = %d height = %d",
++                  __func__, horizontalOffset, verticalOffset, width, height);
++
++        } else if (current.selCmd == V4L2_SEL_TGT_COMPOSE) {
++            if (width == 0 || height == 0) {
++                LOGE("Invalid XML configuration, no pixel array width/height when handling compose, skip.");
++                return BAD_VALUE;
++            }
++            if (current.width == 0 || current.height == 0) {
++                LOGW("%s: Invalid XML configuration for TGT_COMPOSE,"
++                     "0 value detected in width or height", __func__);
++                return BAD_VALUE;
++            } else {
++                LOG2("%s: Compose width %d/%d, height %d/%d", __func__, width, current.width,
++                    height, current.height);
++                // the scale factor should be float, so multiple numerator and denominator
++                // with coefficient to indicate float factor
++                const int SCALE_FACTOR_COEF = 10;
++                horizontalBin = width / current.width;
++                horizontalBinNum = width * SCALE_FACTOR_COEF / current.width;
++                horizontalBinDenom = SCALE_FACTOR_COEF;
++                verticalBin = height / current.height;
++                verticalBinNum = height * SCALE_FACTOR_COEF / current.height;
++                verticalBinDenom = SCALE_FACTOR_COEF;
++            }
++
++            LOG2("%s: COMPOSE horizontal bin factor=%d, (%d/%d)",
++                  __func__, horizontalBin, horizontalBinNum, horizontalBinDenom);
++            LOG2("%s: COMPOSE vertical bin factor=%d, (%d/%d)",
++                  __func__, verticalBin, verticalBinNum, verticalBinDenom);
++        } else {
++            LOGW("%s: Target for selection is not CROP neither COMPOSE!", __func__);
++            continue;
++        }
++
++        sensorFrameParams.horizontal_crop_offset += horizontalOffset;
++        sensorFrameParams.vertical_crop_offset += verticalOffset;
++        sensorFrameParams.cropped_image_width = width;
++        sensorFrameParams.cropped_image_height = height;
++        sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
++        sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
++        sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
++        sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
++    }
++
++    return OK;
++
++}
++
++void PlatformData::getSupportedTuningConfig(int cameraId, vector <TuningConfig> &configs)
++{
++    configs = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig;
++}
++
++bool PlatformData::usePsys(int cameraId, int format)
++{
++    if (getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty()) {
++        LOG1("@%s, the tuning config in xml does not exist", __func__);
++        return false;
++    }
++
++    if (getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat.empty()) {
++        LOG1("@%s, the psys supported format does not exist", __func__);
++        return false;
++    }
++
++    for (auto &psys_fmt : getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat) {
++        if (format == psys_fmt)
++            return true;
++    }
++
++    LOGW("%s, No matched format found, but expected format:%s", __func__,
++        CameraUtils::pixelCode2String(format));
++
++    return false;
++}
++
++int PlatformData::getConfigModesByOperationMode(int cameraId, uint32_t operationMode, vector <ConfigMode> &configModes)
++{
++    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
++        LOG2("%s: operationMode was invalid operation mode", __func__);
++        return INVALID_OPERATION;
++    }
++
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
++          "@%s, the tuning config in xml does not exist", __func__);
++
++    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
++        if (getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto.empty()) {
++            // Use the first config mode as default for auto
++            configModes.push_back(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig[0].configMode);
++            LOG2("%s: add config mode %d for operation mode %d", __func__, configModes[0], operationMode);
++        } else {
++            configModes = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto;
++        }
++    } else {
++        for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
++            if (operationMode == (uint32_t)cfg.configMode) {
++                configModes.push_back(cfg.configMode);
++                LOG2("%s: add config mode %d for operation mode %d", __func__, cfg.configMode, operationMode);
++            }
++        }
++    }
++
++    if (configModes.size() > 0) return OK;
++    LOGW("%s, configure number %zu, operationMode %x, cameraId %d", __func__,
++            configModes.size(), operationMode, cameraId);
++    return INVALID_OPERATION;
++}
++
++int PlatformData::getTuningModeByConfigMode(int cameraId, ConfigMode configMode,
++                                            TuningMode& tuningMode)
++{
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(),
++          INVALID_OPERATION, "the tuning config in xml does not exist");
++
++    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
++        LOG2("%s, tuningMode %d, configMode %x", __func__, cfg.tuningMode, cfg.configMode);
++        if (cfg.configMode == configMode) {
++            tuningMode = cfg.tuningMode;
++            return OK;
++        }
++    }
++
++    LOGW("%s, configMode %x, cameraId %d, no tuningModes", __func__, configMode, cameraId);
++    return INVALID_OPERATION;
++}
++
++int PlatformData::getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config)
++{
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
++          "@%s, the tuning config in xml does not exist.", __func__);
++
++    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
++        if (cfg.configMode == mode) {
++            config = cfg;
++            return OK;
++        }
++    }
++
++    LOGW("%s, configMode %x, cameraId %d, no TuningConfig", __func__, mode, cameraId);
++    return INVALID_OPERATION;
++}
++
++int PlatformData::getStreamIdByConfigMode(int cameraId, ConfigMode configMode)
++{
++    std::map<int, int> modeMap = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModeToStreamId;
++    return modeMap.find(configMode) == modeMap.end() ? -1 : modeMap[configMode];
++}
++
++int PlatformData::getMaxRequestsInflight(int cameraId)
++{
++    int inflight = getInstance()->mStaticCfg.mCameras[cameraId].mMaxRequestsInflight;
++    if (inflight <= 0) {
++        inflight = isEnableAIQ(cameraId) ? 4 : MAX_BUFFER_COUNT;
++    }
++
++    return inflight;
++}
++
++bool PlatformData::getGraphConfigNodes(int cameraId)
++{
++    return !(getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsFile.empty());
++}
++
++GraphSettingType PlatformData::getGraphSettingsType(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsType;
++}
++
++camera_yuv_color_range_mode_t PlatformData::getYuvColorRangeMode(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mYuvColorRangeMode;
++}
++
++ia_binary_data* PlatformData::getAiqd(int cameraId, TuningMode mode)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), nullptr,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
++    return aiqInitData->getAiqd(mode);
++}
++
++void PlatformData::saveAiqd(int cameraId, TuningMode tuningMode, const ia_binary_data& data)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), VOID_VALUE,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
++    aiqInitData->saveAiqd(tuningMode, data);
++}
++
++// load cpf when tuning file (.aiqb) is available
++int PlatformData::getCpfAndCmc(int cameraId,
++                               ia_binary_data* ispData,
++                               ia_binary_data* aiqData,
++                               ia_binary_data* otherData,
++                               uintptr_t* cmcHandle,
++                               TuningMode mode,
++                               ia_cmc_t** cmcData)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()) ||
++               cameraId >= MAX_CAMERA_NUMBER, BAD_VALUE, "@%s, bad cameraId:%d",
++               __func__, cameraId);
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(),
++               INVALID_OPERATION, "@%s, the tuning config in xml does not exist", __func__);
++
++    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
++    return aiqInitData->getCpfAndCmc(ispData, aiqData, otherData, cmcHandle, mode, cmcData);
++}
++
++bool PlatformData::isCSIBackEndCapture(int cameraId)
++{
++    bool isCsiBECapture = false;
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
++
++    for(const auto& node : mc->videoNodes) {
++        if (node.videoNodeType == VIDEO_GENERIC &&
++                (node.name.find("BE capture") != string::npos ||
++                 node.name.find("BE SOC capture") != string::npos)) {
++            isCsiBECapture = true;
++            break;
++        }
++    }
++
++    return isCsiBECapture;
++}
++
++bool PlatformData::isCSIFrontEndCapture(int cameraId)
++{
++    bool isCsiFeCapture = false;
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
++
++    for(const auto& node : mc->videoNodes) {
++        if (node.videoNodeType == VIDEO_GENERIC &&
++                (node.name.find("CSI-2") != string::npos ||
++                 node.name.find("TPG") != string::npos)) {
++            isCsiFeCapture = true;
++            break;
++        }
++    }
++    return isCsiFeCapture;
++}
++
++bool PlatformData::isTPGReceiver(int cameraId)
++{
++    bool isTPGCapture = false;
++    MediaCtlConf *mc = getMediaCtlConf(cameraId);
++    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
++
++    for(const auto& node : mc->videoNodes) {
++        if (node.videoNodeType == VIDEO_ISYS_RECEIVER &&
++                (node.name.find("TPG") != string::npos)) {
++            isTPGCapture = true;
++            break;
++        }
++    }
++    return isTPGCapture;
++}
++
++int PlatformData::getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
++                                                camera_range_t& etRange)
++{
++    vector<camera_ae_exposure_time_range_t> ranges;
++    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeExposureTimeRange(ranges);
++
++    if (ranges.empty())
++        return NAME_NOT_FOUND;
++
++    for (auto& item : ranges) {
++        if (item.scene_mode == sceneMode) {
++            etRange = item.et_range;
++            return OK;
++        }
++    }
++    return NAME_NOT_FOUND;
++}
++
++int PlatformData::getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
++                                        camera_range_t& gainRange)
++{
++    vector<camera_ae_gain_range_t> ranges;
++    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeGainRange(ranges);
++
++    if(ranges.empty()) {
++        return NAME_NOT_FOUND;
++    }
++
++    for (auto& item : ranges) {
++        if (item.scene_mode == sceneMode) {
++            gainRange = item.gain_range;
++            return OK;
++        }
++    }
++    return NAME_NOT_FOUND;
++}
++
++bool PlatformData::isUsingCrlModule(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mUseCrlModule;
++}
++
++vector<MultiExpRange> PlatformData::getMultiExpRanges(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mMultiExpRanges;
++}
++
++camera_resolution_t *PlatformData::getPslOutputForRotation(int width, int height, int cameraId)
++{
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap.empty(), nullptr,
++          "@%s, cameraId: %d, there isn't pslOutputMapForRotation field in xml.", __func__, cameraId);
++
++    vector<UserToPslOutputMap> &outputMap = getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap;
++    for (auto & map : outputMap) {
++        if (width == map.User.width && height == map.User.height) {
++            LOG2("cameraId: %d, find the psl output resoltion(%d, %d) for %dx%d",
++                  cameraId, map.Psl.width, map.Psl.height, map.User.width, map.User.height);
++            return &map.Psl;
++        }
++    }
++
++    return nullptr;
++}
++
++bool PlatformData::isTestPatternSupported(int cameraId)
++{
++    return !getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty();
++}
++
++int32_t PlatformData::getSensorTestPattern(int cameraId, int32_t mode)
++{
++    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty(), -1,
++          "@%s, cameraId: %d, mTestPatternMap is empty!", __func__, cameraId);
++    auto testPatternMap = getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap;
++
++    if (testPatternMap.find(mode) == testPatternMap.end()) {
++        LOGW("Test pattern %d wasn't found in configuration file, return -1", mode);
++        return -1;
++    }
++    return testPatternMap[mode];
++}
++
++ia_binary_data *PlatformData::getNvm(int cameraId)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), nullptr,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    return getInstance()->mAiqInitData[cameraId]->getNvm();
++}
++
++camera_coordinate_system_t PlatformData::getActivePixelArray(int cameraId)
++{
++    camera_coordinate_system_t arraySize;
++    CLEAR(arraySize);
++
++    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSensorActiveArraySize(arraySize);
++
++    return {arraySize.left, arraySize.top, arraySize.right, arraySize.bottom};
++}
++
++string PlatformData::getCameraCfgPath()
++{
++    char* p = getenv("CAMERA_CFG_PATH");
++
++    return p? string(p) : string(CAMERA_DEFAULT_CFG_PATH);
++}
++
++string PlatformData::getGraphDescFilePath()
++{
++    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_DESCRIPTOR_FILE);
++}
++
++string PlatformData::getGraphSettingFilePath()
++{
++    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_SETTINGS_DIR);
++}
++
++int PlatformData::getSensorDigitalGain(int cameraId, float realDigitalGain)
++{
++    int sensorDg = 0;
++    int maxSensorDg = PlatformData::getMaxSensorDigitalGain(cameraId);
++
++    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
++        int index = 0;
++        while (pow(2, index) <= realDigitalGain) {
++            sensorDg = index;
++            index++;
++        }
++        sensorDg = CLIP(sensorDg, maxSensorDg, 0);
++    } else {
++        LOGE("%s, don't support the sensor digital gain type: %d",
++                __func__, PlatformData::sensorDigitalGainType(cameraId));
++    }
++
++    return sensorDg;
++}
++
++float PlatformData::getIspDigitalGain(int cameraId, float realDigitalGain)
++{
++    float ispDg = 1.0f;
++    int sensorDg = getSensorDigitalGain(cameraId, realDigitalGain);
++
++    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
++        ispDg = realDigitalGain / pow(2, sensorDg);
++        ispDg = CLIP(ispDg, ispDg, 1.0);
++    } else {
++        LOGE("%s, don't support the sensor digital gain type: %d",
++                __func__, PlatformData::sensorDigitalGainType(cameraId));
++    }
++
++    return ispDg;
++}
++
++int PlatformData::saveMakernoteData(int cameraId, camera_makernote_mode_t makernoteMode,
++                                    int64_t sequence)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), BAD_VALUE,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    return getInstance()->mAiqInitData[cameraId]->saveMakernoteData(makernoteMode, sequence);
++}
++
++void* PlatformData::getMknHandle(int cameraId)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), nullptr,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    return getInstance()->mAiqInitData[cameraId]->getMknHandle();
++}
++
++void PlatformData::updateMakernoteTimeStamp(int cameraId, int64_t sequence, uint64_t timestamp)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), VOID_VALUE,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    return getInstance()->mAiqInitData[cameraId]->updateMakernoteTimeStamp(sequence, timestamp);
++}
++
++void  PlatformData::acquireMakernoteData(int cameraId, uint64_t timestamp, Parameters *param)
++{
++    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), VOID_VALUE,
++               "@%s, bad cameraId:%d", __func__, cameraId);
++
++    return getInstance()->mAiqInitData[cameraId]->acquireMakernoteData(timestamp, param);
++}
++
++int PlatformData::getScalerInfo(int cameraId, int32_t streamId,
++                                float *scalerWidth, float *scalerHeight)
++{
++    if (getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.empty()) {
++        *scalerWidth = 1.0;
++        *scalerHeight = 1.0;
++        return OK;
++    }
++
++    for (auto &scalerInfo : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
++        LOG2("%s, streamId %d, scalerWidth %f, scalerHeight %f", __func__, scalerInfo.streamId,
++             scalerInfo.scalerWidth, scalerInfo.scalerHeight);
++        if (scalerInfo.streamId == streamId) {
++            *scalerWidth = scalerInfo.scalerWidth;
++            *scalerHeight = scalerInfo.scalerHeight;
++            break;
++        }
++    }
++
++    return OK;
++}
++
++void  PlatformData::setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo)
++{
++    for (auto &scalerInfoInput : scalerInfo) {
++        bool flag = false;
++        for (auto &scalerInfoTmp : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
++            if (scalerInfoInput.streamId == scalerInfoTmp.streamId) {
++                scalerInfoTmp.scalerWidth = scalerInfoInput.scalerWidth;
++                scalerInfoTmp.scalerHeight = scalerInfoInput.scalerHeight;
++                flag = true;
++                break;
++            }
++        }
++        if (!flag) {
++            getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.push_back(scalerInfoInput);
++        }
++    }
++}
++
++bool PlatformData::isGpuTnrEnabled()
++{
++    return getInstance()->mStaticCfg.mCommonConfig.isGpuTnrEnabled;
++}
++
++int PlatformData::getVideoStreamNum(int cameraId)
++{
++    return getInstance()->mStaticCfg.mCameras[cameraId].mVideoStreamNum;
++}
++
++bool PlatformData::isUsingGpuAlgo()
++{
++    bool enabled = false;
++    enabled |= isGpuTnrEnabled();
++    return enabled;
++}
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.h b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
+new file mode 100644
+index 000000000000..a40f2c0a4d4e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
+@@ -0,0 +1,1159 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <limits.h>
++#include <v4l2_device.h>
++
++#include <vector>
++#include <string>
++#include <map>
++#include <unordered_map>
++
++#include "ICamera.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "CameraTypes.h"
++#include "Parameters.h"
++#include "AiqInitData.h"
++#include "MediaControl.h"
++#include "IGraphConfig.h"
++
++namespace icamera {
++
++#define RESOLUTION_1_3MP_WIDTH  1280
++#define RESOLUTION_1_3MP_HEIGHT 960
++#define RESOLUTION_1080P_WIDTH  1920
++#define RESOLUTION_1080P_HEIGHT 1080
++#define RESOLUTION_720P_WIDTH   1280
++#define RESOLUTION_720P_HEIGHT  720
++#define RESOLUTION_VGA_WIDTH    640
++#define RESOLUTION_VGA_HEIGHT   480
++
++#define MAX_BUFFER_COUNT (10)
++#define MAX_STREAM_NUMBER   5
++#define DEFAULT_VIDEO_STREAM_NUM 2
++#define MAX_WEIGHT_GRID_SIDE_LEN 1024
++
++#define FACE_ENGINE_DEFAULT_RUNNING_INTERVAL 1
++
++/* Max number of the RAW buffer number is 32.
++ * Max number size of the pipeline depth is 6.
++ * Max setting count should be larger than raw buffer number + pipeline depth.
++ */
++#define MAX_SETTING_COUNT 40
++#define CAMERA_PORT_NAME "CSI-2"
++
++#define MAX_CAMERA_NUMBER 2
++#define CAMERA_CACHE_DIR "/var/cache/camera/"
++#define CAMERA_DEFAULT_CFG_PATH "/etc/camera/"
++#define CAMERA_GRAPH_DESCRIPTOR_FILE "gcss/graph_descriptor.xml"
++#define CAMERA_GRAPH_SETTINGS_DIR "gcss/"
++
++class GraphConfigNodes;
++class PlatformData {
++private:
++    //Prevent to create multiple instances
++    PlatformData();
++    ~PlatformData();
++
++public:
++    class StaticCfg {
++    public:
++        StaticCfg() {
++            mCameras.clear();
++        };
++        ~StaticCfg() {}; // not release resource by design
++
++        /**
++         * Camera feature info that is specific to camera id
++         */
++        class CameraInfo {
++        public:
++            CameraInfo() :
++                sensorName(""),
++                sensorDescription("unset"),
++                mLensName(""),
++                mLensHwType(LENS_NONE_HW),
++                mAutoSwitchType(AUTO_SWITCH_PSYS),
++                mLtmEnabled(false),
++                mSensorExposureNum(2),
++                mSensorExposureType(SENSOR_EXPOSURE_SINGLE),
++                mSensorGainType(SENSOR_GAIN_NONE),
++                mLensCloseCode(0),
++                mEnableAIQ(false),
++                mSkipFrameV4L2Error(false),
++                mCITMaxMargin(0),
++                mYuvColorRangeMode(CAMERA_FULL_MODE_YUV_COLOR_RANGE),
++                mInitialSkipFrame(0),
++                mMaxRawDataNum(MAX_BUFFER_COUNT),
++                mTopBottomReverse(false),
++                mPsysContinueStats(false),
++                mMaxRequestsInflight(0),
++                mPreferredBufQSize(MAX_BUFFER_COUNT),
++                mPipeSwitchDelayFrame(0),
++                mExposureLag(MAX_BUFFER_COUNT),
++                mGainLag(0),
++                mLtmGainLag(0),
++                mEnableLtmThread(false),
++                mEnableLtmDefog(false),
++                mMaxSensorDigitalGain(0),
++                mSensorDgType(SENSOR_DG_TYPE_NONE),
++                mISysFourcc(V4L2_PIX_FMT_SGRBG8),
++                mISysRawFormat(V4L2_PIX_FMT_SGRBG10),
++                mUseCrlModule(true),
++                mFacing(FACING_BACK),
++                mOrientation(ORIENTATION_0),
++                mUseSensorDigitalGain(false),
++                mUseIspDigitalGain(false),
++                mNeedPreRegisterBuffers(false),
++                mFrameSyncCheckEnabled(false),
++                mEnableAiqd(false),
++                mCurrentMcConf(nullptr),
++                mGraphSettingsType(COUPLED),
++                mDVSType(MORPH_TABLE),
++                mISYSCompression(false),
++                mPSACompression(false),
++                mOFSCompression(false),
++                mFaceAeEnabled(false),
++                mFaceEngineRunningInterval(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
++                mFaceEngineRunningIntervalNoFace(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
++                mFaceEngineRunningSync(false),
++                mPsysAlignWithSof(false),
++                mPsysBundleWithAic(false),
++                mSwProcessingAlignWithIsp(false),
++                mMaxNvmDataSize(0),
++                mVideoStreamNum(DEFAULT_VIDEO_STREAM_NUM)
++            {
++            }
++
++            std::vector <MediaCtlConf> mMediaCtlConfs;
++
++            std::string sensorName;
++            std::string sensorDescription;
++            std::string mLensName;
++            int mLensHwType;
++            int mAutoSwitchType;
++            bool mLtmEnabled;
++            int mSensorExposureNum;
++            int mSensorExposureType;
++            int mSensorGainType;
++            int mLensCloseCode;
++            bool mEnableAIQ;
++            bool mSkipFrameV4L2Error;
++            int mCITMaxMargin;
++            camera_yuv_color_range_mode_t mYuvColorRangeMode;
++            unsigned int mInitialSkipFrame;
++            unsigned int mMaxRawDataNum;
++            bool mTopBottomReverse;
++            bool mPsysContinueStats;
++            int mMaxRequestsInflight;
++            unsigned int mPreferredBufQSize;
++            unsigned int mPipeSwitchDelayFrame;
++            int mExposureLag;
++            int mGainLag;
++            int mLtmGainLag;
++            bool mEnableLtmThread;
++            bool mEnableLtmDefog;
++            int mMaxSensorDigitalGain;
++            SensorDgType mSensorDgType;
++            std::string mCustomAicLibraryName;
++            std::string mCustom3ALibraryName;
++            std::vector <camera_resolution_t> mSupportedISysSizes; // ascending order request
++            std::vector <int> mSupportedISysFormat;
++            int mISysFourcc; // the isys output format
++            int mISysRawFormat; // the isys raw format if scale enabled
++
++            std::vector <int> mPSysFormat; // the psys output format
++            std::vector <TuningConfig> mSupportedTuningConfig;
++            std::vector <LardTagConfig> mLardTagsConfig;
++            std::vector <ConfigMode> mConfigModesForAuto;
++
++            bool mUseCrlModule;
++            int mFacing;
++            int mOrientation;
++            bool mUseSensorDigitalGain;
++            bool mUseIspDigitalGain;
++            bool mNeedPreRegisterBuffers;
++            bool mFrameSyncCheckEnabled;
++            bool mEnableAiqd;
++            MediaCtlConf *mCurrentMcConf;
++            std::map<int, stream_array_t> mStreamToMcMap;
++            Parameters mCapability;
++
++            std::string mGraphSettingsFile;
++            GraphSettingType mGraphSettingsType;
++            std::vector <MultiExpRange> mMultiExpRanges;
++            std::vector <uint32_t> mSupportedIspControlFeatures;
++            int mDVSType;
++            bool mISYSCompression;
++            bool mPSACompression;
++            bool mOFSCompression;
++            bool mFaceAeEnabled;
++            int mFaceEngineRunningInterval;
++            int mFaceEngineRunningIntervalNoFace;
++            int mFaceEngineRunningSync;
++            bool mPsysAlignWithSof;
++            bool mPsysBundleWithAic;
++            bool mSwProcessingAlignWithIsp;
++
++            /* key: camera_test_pattern_mode_t, value: sensor test pattern mode */
++            std::unordered_map<int32_t, int32_t> mTestPatternMap;
++
++            // This is for binding stream id to ConfigMode, since the stream id from kernel list of
++            // a PG might be incorrect. To be removed after stream id mismatch issue fixed.
++            std::map<int, int> mConfigModeToStreamId;
++            std::vector<UserToPslOutputMap> mOutputMap;
++            int mMaxNvmDataSize;
++            std::string mNvmDirectory;
++            std::vector<IGraphType::ScalerInfo> mScalerInfo;
++            int mVideoStreamNum;
++        };
++
++        std::vector<CameraInfo> mCameras;
++        std::vector<PolicyConfig> mPolicyConfig;
++        CommonConfig mCommonConfig;
++    };
++private:
++    StaticCfg mStaticCfg;
++
++    std::vector<AiqInitData*> mAiqInitData;
++private:
++    /**
++     * Get access to the platform singleton.
++     *
++     * Note: this is implemented in PlatformFactory.cpp
++     */
++    static PlatformData* sInstance;
++    static Mutex sLock;
++    static PlatformData* getInstance();
++
++    /**
++     * Parse graph descriptor and settings from configuration files.
++     */
++    void parseGraphFromXmlFile();
++
++    /**
++     * Release GraphConfigNodes in StaticCfg::CameraInfo
++     */
++    void releaseGraphConfigNodes();
++
++    /**
++     * Get MediaCtlConf via MC ID.
++     */
++    static MediaCtlConf* getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId);
++
++    /**
++     * Get MediaCtlConf via stream config.
++     */
++    static MediaCtlConf* getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
++                                           const stream_t& stream);
++
++    /**
++     * Get MediaCtlConf via ConfigMode.
++     */
++    static MediaCtlConf* getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
++                                               const stream_t& stream, ConfigMode mode);
++
++    /**
++     * Check if video node is enabled via camera Id and video node type.
++     */
++    static bool isVideoNodeEnabled(int cameraId, VideoNodeType type);
++
++public:
++     /**
++      * releaseInstance
++      * This function must be called when the hal is destroyed.
++      */
++    static void releaseInstance();
++
++    /**
++     * init PlatformData
++     *
++     * \return OK if init PlatformData successfully, otherwise return ERROR.
++     */
++    static int init();
++
++    /**
++     * get the camera numbers
++     *
++     * \return int: the camera numbers
++     */
++    static int numberOfCameras();
++
++    /**
++     * get the camera number in xml
++     *
++     * \return int: the camera numbers in xml
++     */
++    static int getXmlCameraNumber();
++
++    /**
++     * get the sensor name
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return char*: the sensor name string.
++     */
++    static const char* getSensorName(int cameraId);
++
++    /**
++     * get the sensor description
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return const char*: the sensor descrition string.
++     */
++    static const char* getSensorDescription(int cameraId);
++
++    /**
++     * get the Lens name
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return char*: the lens name string.
++     */
++    static const char* getLensName(int cameraId);
++
++    /**
++     * get the Lens HW type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return int: the Lens HW type
++     */
++    static int getLensHwType(int cameraId);
++
++    /**
++     * get the DVS type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return int: the DVS type
++     */
++    static int getDVSType(int cameraId);
++
++    /**
++     * get the ISYS compression flag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if ISYS compression is enabled
++     */
++    static bool getISYSCompression(int cameraId);
++
++    /**
++     * get the PSA compression flag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if PSA compression is enabled
++     */
++    static bool getPSACompression(int cameraId);
++
++    /**
++     * get the OFS compression flag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if OFS compression is enabled
++     */
++    static bool getOFSCompression(int cameraId);
++
++    /**
++     * get the max coarse integration time margin
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return int: the value of max coarse integration time margin.
++     */
++    static int getCITMaxMargin(int cameraId);
++
++    /**
++     * Check AIQ is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if AIQ is enabled or not.
++     */
++    static bool isEnableAIQ(int cameraId);
++
++    /**
++     * Check if sensor digital gain is used or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if sensor gain is used or not.
++     */
++    static bool isUsingSensorDigitalGain(int cameraId);
++
++    /**
++     * Check if using isp digital gain or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if using isp gain or not.
++     */
++    static bool isUsingIspDigitalGain(int cameraId);
++
++    /**
++     * Check if need to pre-register buffers or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if pre-register buffers or not.
++     */
++    static bool isNeedToPreRegisterBuffer(int cameraId);
++
++    /**
++     * Get auto switch type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of auto switch type
++     */
++    static int getAutoSwitchType(int cameraId);
++
++    /**
++     * Check Defog(LTM) is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if Defog is enabled or not.
++     */
++    static bool isEnableDefog(int cameraId);
++
++    /**
++     * Check Frame Sync is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if Frame Sync is enabled or not.
++     */
++    static bool isEnableFrameSyncCheck(int cameraId);
++
++    /**
++     * Get exposure number
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param multiExposure: true or false
++     * \return the value of exposure number according to different cases
++     */
++    static int getExposureNum(int cameraId, bool multiExposure);
++
++    /**
++     * Check LTM is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if LTM is enabled or not.
++     */
++    static bool isLtmEnabled(int cameraId);
++
++    /**
++     * Get sensor exposure type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of sensor exposure type
++     */
++    static int getSensorExposureType(int cameraId);
++
++    /**
++     * Get sensor gain type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of sensor gain type
++     */
++    static int getSensorGainType(int cameraId);
++
++    /**
++     * Get sensor's initial skip frame number
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of initial skip frame number
++     */
++    static unsigned int getInitialSkipFrame(int cameraId);
++
++    /**
++     * Get max raw data number
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of max raw data number
++     */
++    static unsigned int getMaxRawDataNum(int cameraId);
++
++     /**
++     * Get sensor's top bottom filed reverse option
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of top bottom filed reverse value
++     */
++    static bool getTopBottomReverse(int cameraId);
++
++    /*
++     * Check if Psys continuous stats is needed or not.
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if it is needed
++     */
++    static bool isPsysContinueStats(int cameraId);
++
++    /**
++     * Get preferred buffer queue size
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of preferred buffer queue size
++     */
++    static unsigned int getPreferredBufQSize(int cameraId);
++
++    /**
++     * Get pipe switch delay frame
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of delay frame
++     */
++    static unsigned int getPipeSwitchDelayFrame(int cameraId);
++
++    /**
++     * Get Ltm Gain lag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of LTM gain lag
++     */
++    static int getLtmGainLag(int cameraId);
++
++    /**
++     * Check ltm thread is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if ltm thread is enabled or not.
++     */
++    static bool isEnableLtmThread(int cameraId);
++
++    /**
++     * Check face detection is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if face detection is enabled or not.
++     */
++    static bool isFaceAeEnabled(int cameraId);
++
++    /**
++     * get face engine's running interval
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the face engine running interval value.
++     */
++    static int faceEngineRunningInterval(int cameraId);
++
++    /**
++     * get face engine's running interval when face is not found
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the face engine running interval value when face is not found.
++     */
++    static int faceEngineRunningIntervalNoFace(int cameraId);
++
++    /**
++     * Check face detection runs  synchronously or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if face detection runs synchronously or not.
++     */
++    static bool isFaceEngineSyncRunning(int cameraId);
++
++    /**
++     * get dvs supported status
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true: dvs supported; false: dvs not supported.
++     */
++    static bool isDvsSupported(int cameraId);
++
++    /**
++     * Check psys align with sof is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if psys align with sof is enabled or not.
++     */
++    static bool psysAlignWithSof(int cameraId);
++
++    /**
++     * Check running psys bundle with aic is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if running psys bundle with aic is enabled or not.
++     */
++    static bool psysBundleWithAic(int cameraId);
++
++    /**
++     * Check software processing align with isp is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if software processing align with isp is enabled or not.
++     */
++    static bool swProcessingAlignWithIsp(int cameraId);
++
++    /**
++     * Get the max digital gain of sensor
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of max digital gain
++     */
++    static int getMaxSensorDigitalGain(int cameraId);
++
++    /**
++     * Get sensor digital gain type
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the sensor digital gain type
++     */
++    static SensorDgType sensorDigitalGainType(int cameraId);
++
++    /**
++     * Get sensor's exposure lag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of exposure lag
++     */
++    static int getExposureLag(int cameraId);
++
++    /**
++     * Get sensor's gain lag
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the value of gain lag
++     */
++    static int getGainLag(int cameraId);
++
++    /**
++     * Get the executor policy config.
++     *
++     * \param[in] graphId: the graph id
++     *
++     * \return PolicyConfig* object if found, otherwise return nullptr.
++     */
++    static PolicyConfig* getExecutorPolicyConfig(int graphId);
++
++    /**
++     * According to stream info to select MC
++     * this function will compare the format/resolutions/interlace to find the MediaCtlConf
++     * and then store it into cameraInfo.
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param stream: the stream info
++     * \param mode: the stream operation mode
++     */
++    static void selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId);
++
++    /**
++     * to get the current MediaCtlConf
++     * after the media controller has been analyzed, the media controller information will be stored in the mMediaCtlConfs.
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return MediaCtlConf*, if it doens't find one, this function will return nullptr.
++     */
++    static MediaCtlConf *getMediaCtlConf(int cameraId);
++
++    /**
++     * \brief Fill camera info and capability according to given camera id
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[out] camera_info_t info
++     *
++     * \return 0 if succeed, other value indicates failed.
++     */
++    static int getCameraInfo(int cameraId, camera_info_t& info);
++
++    /**
++     * \brief Check if the camera_features feature is supported
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[in] camera_features feature
++     *
++     * \return true if supported, otherwise return false.
++     */
++    static bool isFeatureSupported(int cameraId, camera_features feature);
++
++    /**
++     * \brief Check if the given stream config is supported
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[in] stream_t conf
++     *
++     * \return true if supported, otherwise return false.
++     */
++    static bool isSupportedStream(int cameraId, const stream_t& conf);
++
++    /**
++     * get the isys supported size list
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param sizes: the function will fill the isys supported size list to the sizes
++     */
++    static void getSupportedISysSizes(int cameraId, std::vector <camera_resolution_t>& resolutions);
++
++    /**
++     * get the isys supported format list
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param formats: the function will fill the isys supported format list to the formats
++     * \return true if success, return false if it fails.
++     */
++    static bool getSupportedISysFormats(int cameraId, std::vector <int>& formats);
++
++    /**
++     * Format for the ISYS output
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the format for the isys output
++     */
++    static int getISysFormat(int cameraId);
++
++    /**
++     * Set ISYS output format
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param format: the isys output format
++     */
++    static void selectISysFormat(int cameraId, int format);
++
++    /**
++     * If ISYS supported format.
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     */
++    static bool isISysSupportedFormat(int cameraId, int format);
++
++    /**
++     * if the resolution is supported by Isys
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param resolution: the requested resolution
++     * \return true if the resolution is supported by isys, otherwise false
++     */
++    static bool isISysSupportedResolution(int cameraId, camera_resolution_t resolution);
++
++    /**
++     * Check if the frame needs to be skipped when STR2MMIO error occurs
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return if corrupted frame needs to be skipped or not.
++     */
++    static bool isSkipFrameOnSTR2MMIOErr(int cameraId);
++
++    /**
++     * Format for the ISYS RAW output
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the RAW format if isys scale enabled
++     */
++    static int getISysRawFormat(int cameraId);
++
++    /**
++     * Get the config of the ISYS output per port
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the config of the ISYS output for the given port.
++     */
++    static stream_t getISysOutputByPort(int cameraId, Port port);
++
++    /**
++     * get the format by device name
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param devName: device name
++     * \format: return param for format
++     * \return the status
++     */
++    static int getFormatByDevName(int cameraId, const std::string& devName, McFormat& format);
++
++    /**
++     * get the video node name
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param videoNodeType: value of enum VideoNodeType
++     * \param videoNodeName: return param for the video node name
++     * \return the status
++     */
++    static int getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType,
++                                      std::string& videoNodeName);
++
++    /**
++     * get the hardware device name
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param videoNodeType: value of enum VideoNodeType
++     * \param devName: return param for the device name
++     * \return the status
++     */
++    static int getDevNameByType(int cameraId, VideoNodeType videoNodeType, std::string& devName);
++
++    /**
++     * Check if ISYS is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if ISYS is enabled, otherwise return false
++     */
++    static bool isIsysEnabled(int cameraId);
++
++    static int calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams);
++
++    /**
++     * Get the optmized resolutions that supported by input system
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param width:    The width of the request frame
++     * \param height:   The height of the request frame
++     * \param field:    The field of the request frame
++     *
++     * \return camera_resolution_t: The optimized resolution that used to configure the ISYS.
++     */
++    static camera_resolution_t getISysBestResolution(int cameraId, int width, int height, int field);
++
++    /**
++     * to get if it support the format
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param format:the format will be checked if the psys supports.
++     * \return true or false for the psys could be used or not.
++     */
++    static bool usePsys(int cameraId, int format);
++
++    /**
++     * to get supported psys dag config
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param configs: the function will fill supported psys dag config list to the configs
++     */
++    static void getSupportedTuningConfig(int cameraId, std::vector <TuningConfig> &configs);
++
++    /**
++     * to get the ConfigMode by operation Mode
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param operationMode: the operation mode
++     * \param configModes: the function will fill available ConfigMode for this operation mode
++     * \return OK if get ConfigMode, otherwise return INVALID_OPERATION
++     */
++    static int getConfigModesByOperationMode(int cameraId, uint32_t operationMode,
++                                             std::vector <ConfigMode> &configModes);
++
++    /**
++     * to get the TuningMode by Config Mode
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param configMode: type of ConfigMode (except auto)
++     * \param tuningMode: return related TuningMode
++     * \return OK if get TuningMode, otherwise return INVALID_OPERATION
++     */
++    static int getTuningModeByConfigMode(int cameraId, ConfigMode configMode, TuningMode& tuningMode);
++
++    /**
++     * to get tuning config by ConfigMode
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param mode: ConfigMode
++     * \param config: return related TuningConfig
++     * \return OK if get TuningConfig, otherwise return INVALID_OPERATION
++     */
++    static int getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config);
++
++    /*
++     * Get stream id by the given configMode
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param configMode: ConfigMode
++     * \return the stream id if succeeds, otherwise return -1.
++     */
++    static int getStreamIdByConfigMode(int cameraId, ConfigMode configMode);
++
++    /*
++     * Get the max requests number in flight
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the max requests number in flight
++     */
++    static int getMaxRequestsInflight(int cameraId);
++
++    /**
++     * get yuv color range mode
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the correponding camera_yuv_color_range_mode_t.
++     */
++    static camera_yuv_color_range_mode_t getYuvColorRangeMode(int cameraId);
++
++    /**
++     * Get aiqd
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param tuningMode: mode
++     * \return ia_binary_data
++     */
++    static ia_binary_data* getAiqd(int cameraId, TuningMode mode);
++
++    /**
++     * Save aiqd
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param tuningMode: mode
++     * \param ia_binary_data: data
++     */
++    static void saveAiqd(int cameraId, TuningMode tuningMode, const ia_binary_data& data);
++
++    /**
++     * Get cpf and cmc
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param ispData: isp data in cpf
++     * \param aiqData:  aiq data in cpf
++     * \param otherData: other data in cpf
++     * \param cmcHandle: cmc handle
++     * \param mode: tuning mode
++     * \param cmcData: cmd data
++     * \return OK if it is successful.
++     */
++    static int getCpfAndCmc(int cameraId,
++                            ia_binary_data* ispData,
++                            ia_binary_data* aiqData,
++                            ia_binary_data* otherData,
++                            uintptr_t* cmcHandle,
++                            TuningMode mode = TUNING_MODE_VIDEO,
++                            ia_cmc_t** cmcData = nullptr);
++
++    /**
++     * If dynamic graph config enabled
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if use graphConfig file.
++     */
++    static bool getGraphConfigNodes(int cameraId);
++
++    /**
++     * to get the type of graph settings
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the graph settings type: COUPLED or DISPERSED.
++     */
++    static GraphSettingType getGraphSettingsType(int cameraId);
++
++    /**
++     * if ISYS CSI Back End capture enabled
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if the current sensor is CSI Back End capture or not
++     */
++    static bool isCSIBackEndCapture(int cameraId);
++
++    /**
++     * if ISYS CSI Front End capture enabled
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if the current sensor is CSI Front End capture or not
++     */
++    static bool isCSIFrontEndCapture(int cameraId);
++
++    /**
++     * if AIQD enabled
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if AIQD is enabled or not
++     */
++    static bool isAiqdEnabled(int cameraId);
++
++    /**
++     * if image from tpg
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if frame is from tpg or not
++     */
++    static bool isTPGReceiver(int cameraId);
++
++    static int getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
++                                             camera_range_t& etRange);
++    static int getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
++                                     camera_range_t& gainRange);
++
++    /**
++     * if CrlModule is used
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if CrlModule driver is used, otherwise return false
++     */
++    static bool isUsingCrlModule(int cameraId);
++
++    /**
++     * to get the MultiExpRange of CameraInfo
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return the MultiExpRange for current camera id.
++     */
++    static std::vector<MultiExpRange> getMultiExpRanges(int cameraId);
++
++    /**
++     * Get the psl output resolution
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param width:    The width of user requirement
++     * \param height:   The height of user requirement
++     * \return the psl output resolution if provides it in xml file, otherwise return nullptr.
++     */
++    static camera_resolution_t *getPslOutputForRotation(int width, int height, int cameraId);
++
++    /**
++     * Check if test pattern is supported or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if mTestPatternMap is defined, otherwise return false.
++     */
++    static bool isTestPatternSupported(int cameraId);
++
++    /**
++     * get sensor test pattern
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param mode: camera_test_pattern_mode_t
++     * \return corresponding sensor test pattern if provided in xml file, otherwise return -1.
++     */
++    static int32_t getSensorTestPattern(int cameraId, int32_t mode);
++
++    /**
++     * Get the nvm
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return ia_binary_data
++     */
++    static ia_binary_data* getNvm(int cameraId);
++
++    /**
++    * Get sensor active array size
++    *
++    * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++    * \return the value of camera_coordinate_system_t.
++    */
++    static camera_coordinate_system_t getActivePixelArray(int cameraId);
++
++    /**
++    * Get camera cfg path from environment variable
++    *
++    * \param void
++    * \return the value of camera cfg path.
++    */
++    static std::string getCameraCfgPath();
++
++    /**
++    * Get camera graph descriptor file path
++    *
++    * \param void
++    * \return the value of camera graph descriptor file path.
++    */
++    static std::string getGraphDescFilePath();
++
++    /**
++    * Get camera graph setting file path.
++    *
++    * \param void
++    * \return the value of camera graph setting file path.
++    */
++    static std::string getGraphSettingFilePath();
++
++    /*
++     * Get sensor value for the digital gain.
++     *
++     * Since the calculation formula may be different between sensors,
++     * so we need to get this value based on sensor digital gain type.
++     * For imx274, the magnification = 2^x (x is the register value).
++     *
++     * Need to specify the sensorDgType, maxSensorDg and useIspDigitalGain in xml.
++     */
++    static int getSensorDigitalGain(int cameraId, float realDigitalGain);
++
++    /*
++     * Get the isp gain
++     *
++     * Separate real digital to sensorDg and ispDg, and the ispDg >= 1
++     */
++    static float getIspDigitalGain(int cameraId, float realDigitalGain);
++
++    /**
++     * \brief Save Makernote by ia_mkn_trg mode
++     *
++     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[in] camera_makernote_mode_t: MAKERNOTE_MODE_JPEG is corresponding
++     *           to ia_mkn_trg_section_1 for Normal Jpeg capture;
++     *           MAKERNOTE_MODE_RAW is corresponding to ia_mkn_trg_section_2
++     *           for Raw image capture.
++     * \param[in] int64_t sequence: the sequence in latest AiqResult
++     *
++     * \return OK if get Makernote successfully, otherwise return ERROR.
++     */
++    static int saveMakernoteData(int cameraId, camera_makernote_mode_t makernoteMode,
++                                 int64_t sequence);
++
++    /**
++     * \brief Get ia_mkn (Makernote) handle.
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     */
++    static ia_mkn *getMknHandle(int cameraId);
++
++    /**
++     * \brief Update Makernote timestamp.
++     *
++     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[in] sequence: the sequence in frame buffer;
++     * \param[in] timestamp: the frame timestamp corresponding sequence
++     *
++     */
++    static void updateMakernoteTimeStamp(int cameraId, int64_t sequence, uint64_t timestamp);
++
++    /**
++     * \brief acquire Makernote data.
++     *
++     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param[in] sequence: acquire MakerNote per timestamp
++     * \param[out] param: Makernote data will be saved in Parameters as metadata.
++     *
++     */
++    static void acquireMakernoteData(int cameraId, uint64_t timestamp, Parameters *param);
++
++    /*
++     * Get the scaler info
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param streamId: hal stream id
++     * \param sclscalerWidth and scalerHeight : return related scaler info
++     * \return OK.
++     */
++    static int getScalerInfo(int cameraId, int32_t streamId,
++                             float *scalerWidth, float *scalerHeight);
++
++    /*
++     * Set the scaler info
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \param scalerInfo related IGraphType::ScalerInfo
++     */
++    static void setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo);
++
++     /**
++     * Check gpu tnr is enabled or not
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return true if tnr is enabled.
++     */
++     static bool isGpuTnrEnabled();
++
++     /**
++     * get the video stream number supported
++     *
++     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
++     * \return HAL video stream number.
++     */
++     static int getVideoStreamNum(int cameraId);
++
++     /**
++     * Check should connect gpu algo or not
++     * should connect gpu algo service if any gpu algorithm is used
++     * \return true if should connect gpu algo.
++     */
++     static bool isUsingGpuAlgo();
++};
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
+new file mode 100644
+index 000000000000..f799f21a8ec8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
+@@ -0,0 +1,226 @@
++/*
++ * Copyright (C) 2017-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "PolicyParser"
++
++#include <string.h>
++#include <expat.h>
++
++#include "iutils/CameraLog.h"
++
++#include "PolicyParser.h"
++
++namespace icamera {
++#define PSYS_POLICY_FILE_NAME "psys_policy_profiles.xml"
++PolicyParser::PolicyParser(PlatformData::StaticCfg *cfg) :
++    mStaticCfg(cfg),
++    mCurrentDataField(FIELD_INVALID),
++    pCurrentConf(nullptr) {
++    LOGXML("@%s", __func__);
++    CheckError(!mStaticCfg, VOID_VALUE, "@%s, cfg parameter is wrong", __func__);
++    mStaticCfg->mPolicyConfig.clear();
++
++    int ret = getDataFromXmlFile(PSYS_POLICY_FILE_NAME);
++    CheckError(ret != OK, VOID_VALUE,
++               "Failed to get policy profiles data frome %s", PSYS_POLICY_FILE_NAME);
++}
++
++/**
++ * This function will check which field that the parser parses to.
++ *
++ * The field is set to 2 types.
++ * FIELD_INVALID FIELD_GRAPH
++ *
++ * \param profiles: the pointer of the PolicyParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void PolicyParser::checkField(PolicyParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s", __func__, name);
++    if (strcmp(name, "PsysPolicyConfig") == 0) {
++        profiles->mCurrentDataField = FIELD_INVALID;
++        return;
++    } else if (strcmp(name, "graph") == 0) {
++        profiles->pCurrentConf = new PolicyConfig;
++
++        int idx = 0;
++        while (atts[idx]) {
++            const char* key = atts[idx];
++            const char* val = atts[idx + 1];
++            LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
++            if (strcmp(key, "id") == 0) {
++                profiles->pCurrentConf->graphId = atoi(val);
++            } else if (strcmp(key, "description") == 0) {
++                profiles->pCurrentConf->policyDescription = val;
++            }
++            idx += 2;
++        }
++        profiles->mCurrentDataField = FIELD_GRAPH;
++        return;
++    }
++
++    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
++    return;
++}
++
++void PolicyParser::handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts)
++{
++    int idx = 0;
++    ExecutorPolicy policy;
++
++    while (atts[idx]) {
++        const char *key = atts[idx];
++        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
++        if (strcmp(key, "name") == 0) {
++            policy.exeName = atts[idx + 1];
++        } else if (strcmp(key, "pgs") == 0) {
++            parseXmlConvertStrings(atts[idx + 1], policy.pgList, convertCharToString);
++        } else if (strcmp(key, "op_modes") == 0) {
++            parseXmlConvertStrings(atts[idx + 1], policy.opModeList, atoi);
++        } else if (strcmp(key, "notify_policy") == 0) {
++            int notifyPolicy = std::stoi(atts[idx + 1]);
++            if (notifyPolicy >= 0 && notifyPolicy < POLICY_INVALID) {
++                policy.notifyPolicy = (ExecutorNotifyPolicy)notifyPolicy;
++            } else {
++                LOGW("Invalid notify policy value: %d", notifyPolicy);
++            }
++        } else if (strcmp(key, "cyclic_feedback_routine") == 0) {
++            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackRoutineList, atoi);
++        } else if (strcmp(key, "cyclic_feedback_delay") == 0) {
++            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackDelayList, atoi);
++        } else {
++            LOGW("Invalid policy attribute: %s", key);
++        }
++        idx += 2;
++    }
++
++    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
++    profiles->pCurrentConf->pipeExecutorVec.push_back(policy);
++}
++
++void PolicyParser::handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts)
++{
++    int idx = 0;
++    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
++    const char *key = atts[idx];
++    if (strcmp(key, "pgs") == 0) {
++        parseXmlConvertStrings(atts[idx + 1], profiles->pCurrentConf->exclusivePgs, convertCharToString);
++    } else {
++        LOGE("Invalid policy attribute %s in exclusive label.", key);
++    }
++}
++
++void PolicyParser::handleBundles(PolicyParser *profiles, const char *name, const char **atts)
++{
++    int idx = 0;
++    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
++    const char *key = atts[idx];
++
++    CheckError(strcmp(key, "executors") != 0, VOID_VALUE, "Invalid policy attribute %s in bundle label.", key);
++
++    // The structure of a bundle looks like: "proc:0,post:1" which uses ',' to split
++    // different executors' names, and uses ':' to specify the executor's depth.
++    std::vector<std::string> bundledExecutors;
++    std::vector<int> depths;
++    std::vector<std::string> executors = CameraUtils::splitString(atts[idx + 1], ',');
++
++    for (const auto & item : executors) {
++        std::vector<std::string> executorDepth = CameraUtils::splitString(item.c_str(), ':');
++        CheckError(executorDepth.size() != 2, VOID_VALUE, "Invalid executor-depth mapping.");
++
++        bundledExecutors.push_back(executorDepth[0]);
++        depths.push_back(std::stoi(executorDepth[1]));
++    }
++
++    ExecutorDepth executorDepth = {bundledExecutors, depths};
++    profiles->pCurrentConf->bundledExecutorDepths.push_back(executorDepth);
++}
++
++/**
++ * This function will handle all the sensor related elements.
++ *
++ * It will be called in the function startElement
++ *
++ * \param profiles: the pointer of the CameraParser.
++ * \param name: the element's name.
++ * \param atts: the element's attribute.
++ */
++void PolicyParser::handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts)
++{
++    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
++    if (strcmp(name, "pipe_executor") == 0) {
++        handlePipeExecutor(profiles, name, atts);
++    } else if (strcmp(name, "exclusive") == 0) {
++        handleExclusivePGs(profiles, name, atts);
++    } else if (strcmp(name, "bundle") == 0) {
++        handleBundles(profiles, name, atts);
++    } else if (strcmp(name, "enableBundleInSdv") == 0) {
++        profiles->pCurrentConf->enableBundleInSdv = (strcmp(atts[1], "true") == 0) ? true : false;
++        LOGXML("%s: enableBundleInSdv: %s", __func__, atts[1]);
++    }
++}
++
++/**
++ * the callback function of the libexpat for handling of one element start
++ *
++ * When it comes to the start of one element. This function will be called.
++ *
++ * \param userData: the pointer we set by the function XML_SetUserData.
++ * \param name: the element's name.
++ */
++void PolicyParser::startParseElement(void *userData, const char *name, const char **atts)
++{
++    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
++
++    if (profiles->mCurrentDataField == FIELD_INVALID) {
++        profiles->checkField(profiles, name, atts);
++        return;
++    }
++
++    switch (profiles->mCurrentDataField) {
++        case FIELD_GRAPH:
++            profiles->handlePolicyConfig(profiles, name, atts);
++            break;
++        default:
++            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
++            break;
++    }
++}
++
++/**
++ * the callback function of the libexpat for handling of one element end
++ *
++ * When it comes to the end of one element. This function will be called.
++ *
++ * \param userData: the pointer we set by the function XML_SetUserData.
++ * \param name: the element's name.
++ */
++void PolicyParser::endParseElement(void *userData, const char *name)
++{
++    LOGXML("@%s %s", __func__, name);
++
++    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
++
++    if (strcmp(name, "graph") == 0) {
++        LOGXML("@%s, add policyConf, graphId: %d", __func__, profiles->pCurrentConf->graphId);
++        profiles->mStaticCfg->mPolicyConfig.push_back(*(profiles->pCurrentConf));
++        delete profiles->pCurrentConf;
++        profiles->pCurrentConf = nullptr;
++        profiles->mCurrentDataField = FIELD_INVALID;
++    }
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
+new file mode 100644
+index 000000000000..ca5b13e26a83
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
+@@ -0,0 +1,73 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/**
++ *\File PolicyParser.h
++ *
++ * parser for the policy xml configuration file
++ *
++ * This file calls the libexpat ditectly. The libexpat is one xml parser.
++ * It will parse the camera configuration out firstly.
++ * Then other module can call the methods of it to get the real configuration.
++ */
++
++#pragma once
++
++#include "iutils/Utils.h"
++
++#include "CameraTypes.h"
++#include "PlatformData.h"
++#include "ParserBase.h"
++
++namespace icamera {
++
++/**
++ * \class PolicyParser
++ *
++ * This class is used to parse the policy configuration file.
++ * The configuration file is xml format.
++ * This class will use the expat lib to do the xml parser.
++ */
++class PolicyParser : public ParserBase {
++public:
++    PolicyParser(PlatformData::StaticCfg *cfg);
++    ~PolicyParser(){}
++
++    void startParseElement(void *userData, const char *name, const char **atts);
++    void endParseElement(void *userData, const char *name);
++
++private:
++    // prevent copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(PolicyParser);
++
++private:
++    void checkField(PolicyParser *profiles, const char *name, const char **atts);
++    void handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts);
++    void handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts);
++    void handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts);
++    void handleBundles(PolicyParser *profiles, const char *name, const char **atts);
++
++private:
++    PlatformData::StaticCfg *mStaticCfg;
++
++    enum DataField {
++        FIELD_INVALID = 0,
++        FIELD_GRAPH,
++    } mCurrentDataField;
++    PolicyConfig *pCurrentConf;
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
+new file mode 100644
+index 000000000000..76ba798a7d44
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
+@@ -0,0 +1,338 @@
++/*
++ * Copyright (C) 2016-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "FormatUtils"
++
++#include <stdint.h>
++#include <math.h>
++#include <linux/v4l2-mediabus.h>
++#include <linux/ipu-isys.h>
++#include "ia_cipf/ia_cipf_types.h"
++#include "FormatUtils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++using std::string;
++using namespace icamera;
++
++/**
++ * Utilities to query information about V4L2 types in graph config
++ */
++
++namespace graphconfig {
++namespace utils {
++
++enum FormatType {
++    FORMAT_RAW,
++    FORMAT_RAW_VEC,
++    FORMAT_YUV,
++    FORMAT_YUV_VEC,
++    FORMAT_RGB,
++    FORMAT_MBUS_BAYER,
++    FORMAT_MBUS_YUV,
++    FORMAT_JPEG,
++    FORMAT_FOURCC
++};
++
++struct FormatInfo {
++    int32_t pixelCode;  // OS specific pixel code, in this case V4L2 or Media bus
++    int32_t commonPixelCode;  // Common pixel code used by CIPF and GCSS in settings
++    string fullName;
++    string shortName;
++    int32_t bpp;
++    FormatType type;
++};
++
++/**
++ * gFormatMapping
++ *
++ * Table for mapping OS agnostic formats defined in CIPF and OS specific ones
++ * (in this case V4L2, or media bus).
++ * The table also helps provide textual representation and bits per pixel.
++ * CIPF does not define most of the formats, only the ones it needs, that is why
++ * most of the entries have 0 on the common pixel format.
++ * Conversely there are some new formats introduce by CIPF that do not have
++ * V4L2 representation.
++ */
++static const FormatInfo gFormatMapping[] = {
++    { V4L2_PIX_FMT_SBGGR8, 0, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG8, 0, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB8, 0, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SGRBG8, ia_cipf_frame_fourcc_grbg, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
++    { V4L2_PIX_FMT_SBGGR10, ia_cipf_frame_fourcc_bg10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG10, ia_cipf_frame_fourcc_gb10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_ba10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB10, ia_cipf_frame_fourcc_rg10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
++    // align to xos definition and css format: IA_CSS_DATA_FORMAT_BAYER_GRBG
++    // it's different with ia_cipf_frame_fourcc_ba10 which align to css format:
++    // IA_CSS_DATA_FORMAT_RAW
++    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_gr10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
++    { 0, css_fourcc_grbg_12_li, "css_fourcc_grbg_12_li", "CSL6", 15, FORMAT_RAW},
++    { V4L2_PIX_FMT_SGRBG12, ia_cipf_frame_fourcc_ba12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_NV12, ia_cipf_frame_fourcc_nv12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_NV21, ia_cipf_frame_fourcc_nv21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_UYVY, ia_cipf_frame_fourcc_uyvy, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
++
++    { V4L2_PIX_FMT_YUV420, ia_cipf_frame_fourcc_iyuv, "YUV420_8_PL", "YUV420", 12, FORMAT_YUV },
++    // Packed formats No V4L2 equivalent exists
++    // Normal YUV420 planar but with each sample of 12bits stored in 16bits
++    { 0, ia_cipf_frame_fourcc_i420, "YUV420-12-16p", "YUV420", 24, FORMAT_YUV },
++    // Normal YUV420 planar but with each sample of 12-bit DMA-packed
++    // (42 pixels and 8 bits of padding in a 64-byte DMA word)
++    { 0, css_fourcc_yuv420_12_p64, "YUV420-12-64p", "YUV420", 18, FORMAT_YUV },
++    //  Normal YUV420 planar but with each sample of 10-bit DMA-packed
++    // (51 pixels and 2 bits of padding in a 64-byte DMA word)
++    { 0, css_fourcc_yuv420_10_p64, "YUV420-10-64p", "YUV420", 15, FORMAT_YUV },
++
++    { V4L2_MBUS_FMT_SBGGR10_1X10, ia_cipf_frame_fourcc_bg10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGBRG10_1X10, ia_cipf_frame_fourcc_gb10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGRBG10_1X10, ia_cipf_frame_fourcc_ba10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SRGGB10_1X10, ia_cipf_frame_fourcc_rg10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_UYVY8_1X16, ia_cipf_frame_fourcc_uyvy, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS_YUV },
++    { V4L2_PIX_FMT_SBGGR12, 0, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG12, 0, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB12, 0, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_SBGGR10P, 0, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGBRG10P, 0, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SGRBG10P, 0, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
++    { V4L2_PIX_FMT_SRGGB10P, 0, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
++
++    { V4L2_PIX_FMT_NV16, 0, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
++    { V4L2_PIX_FMT_YUYV, 0, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
++    { V4L2_PIX_FMT_YVU420, 0, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
++    { V4L2_PIX_FMT_YUV422P, 0, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
++
++    { V4L2_PIX_FMT_BGR24, 0, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
++    { V4L2_PIX_FMT_BGR32, 0, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_XBGR32, 0, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_XRGB32, 0, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
++    { V4L2_PIX_FMT_RGB565, 0, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
++
++    { V4L2_PIX_FMT_JPEG, 0, "V4L2_PIX_FMT_JPEG", "JPEG", 0, FORMAT_JPEG },
++
++    { V4L2_MBUS_FMT_SBGGR12_1X12, 0, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGBRG12_1X12, 0, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGRBG12_1X12, 0, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SRGGB12_1X12, 0, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS_BAYER },
++
++    { V4L2_MBUS_FMT_SBGGR8_1X8, 0, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGBRG8_1X8, 0, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SGRBG8_1X8, 0, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS_BAYER },
++    { V4L2_MBUS_FMT_SRGGB8_1X8, 0, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS_BAYER },
++
++    { V4L2_MBUS_FMT_YUYV8_1X16, 0, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS_YUV },
++    { V4L2_MBUS_FMT_UYVY8_2X8, 0, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS_YUV},
++
++};
++
++const string pixelCode2String(int32_t code)
++{
++
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].pixelCode == code) {
++            return gFormatMapping[i].fullName;
++        }
++    }
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].commonPixelCode == code) {
++            return gFormatMapping[i].fullName;
++        }
++    }
++
++    LOGE("Invalid Pixel Format: 0x%x", code);
++    return "INVALID FORMAT";
++}
++
++int32_t string2PixelCode(const string &code)
++{
++    if (code.empty()) {
++        LOGE("Invalid Pixel Format: %s", code.c_str());
++        return -1;
++    }
++
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].fullName == code) {
++            return gFormatMapping[i].pixelCode;
++        }
++    }
++
++    LOGE("Invalid Pixel Format: %s", code.c_str());
++    return -1;
++}
++
++const string format2string(int32_t format)
++{
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            return gFormatMapping[i].shortName;
++        }
++    }
++
++    LOGW("Not in our format list :%x", format);
++    return "INVALID-FORMAT";
++}
++
++bool isPlanarFormat(int32_t format)
++{
++    return (format == V4L2_PIX_FMT_NV12 ||
++            format == V4L2_PIX_FMT_NV21 ||
++            format == V4L2_PIX_FMT_YUV420 ||
++            format == V4L2_PIX_FMT_YVU420 ||
++            format == V4L2_PIX_FMT_YUV422P);
++}
++
++bool isRaw(int32_t format)
++{
++    int32_t size = ARRAY_SIZE(gFormatMapping);
++    for (int32_t i = 0; i < size; i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            // Both normal raw and vector raw treated as raw here.
++            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
++        }
++    }
++
++    return false;
++}
++
++bool isVectorizedRaw(int32_t format)
++{
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            return gFormatMapping[i].type == FORMAT_RAW_VEC;
++        }
++    }
++
++    return false;
++}
++
++/**
++ * Calculate bytes per line(bpl) based on fourcc format.
++ *
++ * \param[in] format 4CC code in OS specific format
++ * \return bpl bytes per line
++ */
++int32_t getBpl(int32_t format, int32_t width)
++{
++    int32_t bpl = 0;
++    switch (format) {
++        case css_fourcc_yuv420_12_p64:      // YUV
++            /*
++             * Align based on UV planes, which have half the strides compared to y plane.
++             * 42 whole pixels in each 64 byte word, rest 8 bits per word is padding.
++             * The total bpl is double the UV-plane strides.
++             */
++            bpl = ceil(((double)width / 2) / 42) * 64 * 2;
++            break;
++        case css_fourcc_yyuv420_v32:        // Y032
++            bpl = width * 6;
++            break;
++        case css_fourcc_grbg_12_li:            // CSL6
++            bpl = width * 4;
++            break;
++        case css_fourcc_grbg_10_v32:        // BV0G
++        case ia_cipf_frame_fourcc_i420:     // V420
++        case css_fourcc_raw_interleaved:    // BV0K
++        case ia_cipf_frame_fourcc_ba10:     // BA10
++        case ia_cipf_frame_fourcc_gr10:     // GR10
++        case ia_cipf_frame_fourcc_ba12:
++        case css_fourcc_p010:               //YUV 10bit serial
++        case css_fourcc_p010_lsb:
++        case css_fourcc_p010_msb_tile_y:
++        case css_fourcc_p010_msb_cile_y:
++            bpl = width * 2;
++            break;
++        case ia_cipf_frame_fourcc_nv12:     // NV12
++        case ia_cipf_frame_fourcc_grbg:     // GRBG
++            bpl = width;
++            break;
++        default:
++            bpl = width;
++            LOGW("bpl defaulting to width for format:%s", CameraUtils::format2string(format).c_str());
++            break;
++    }
++    return bpl;
++}
++
++/**
++ *  Retrieve the bits per pixel  from the OS specific pixel code.
++ *  This is ususally used for buffer allocation calculations
++ *
++ *  \param [in] format 4CC code in OS specific format
++ *  \return bits per pixel
++ */
++int32_t getBpp(int32_t format)
++{
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].pixelCode == format) {
++            return gFormatMapping[i].bpp;
++        }
++    }
++
++    LOGE("There is no bpp supplied for format %s",
++            pixelCode2String(format).c_str());
++    return -1;
++}
++
++/**
++ *  Retrieve the bits per pixel from the common pixel code format (CIPF)
++ *  This is usually used for buffer allocation calculations
++ *
++ *  \param [in] format 4CC code in Common format
++ *  \return bits per pixel
++ */
++int32_t getBppFromCommon(int32_t format)
++{
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].commonPixelCode == format) {
++            return gFormatMapping[i].bpp;
++        }
++    }
++
++    LOGE("There is no bpp supplied for format %s",
++            pixelCode2String(format).c_str());
++    return -1;
++}
++
++int32_t getNumOfPlanes(int32_t format)
++{
++    switch(format) {
++        case V4L2_PIX_FMT_NV12:
++        case V4L2_PIX_FMT_SGRBG8:
++        case V4L2_FMT_IPU_ISYS_META:
++            return 1;
++        //Add more when needed...
++        default:
++            return 1;
++    }
++}
++
++int32_t getV4L2Format(const int32_t commonPixelFormat)
++{
++    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
++        if (gFormatMapping[i].commonPixelCode == commonPixelFormat)
++            return gFormatMapping[i].pixelCode;
++    }
++
++    LOGE("Failed to find any V4L2 format with format %s",
++            pixelCode2String(commonPixelFormat).c_str());
++    return -1;
++}
++
++} // namespace utils
++} // namespace graphconfig
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
+new file mode 100644
+index 000000000000..d6f3a03ad9dd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
+@@ -0,0 +1,34 @@
++/*
++ * Copyright (C) 2016-2019 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <string>
++
++namespace graphconfig {
++namespace utils {
++
++int32_t getV4L2Format(const int32_t commonPixelFormat);
++const std::string format2string(int32_t format);
++bool isPlanarFormat(int32_t v4l2Format);
++bool isRaw(int32_t format);
++bool isVectorizedRaw(int32_t format);
++int32_t getBpl(int32_t format, int32_t width);
++int32_t getBpp(int32_t format);
++int32_t getBppFromCommon(int32_t format);
++
++}  // namespace utils
++}  // namespace graphconfig
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
+new file mode 100644
+index 000000000000..1fb4ed262100
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
+@@ -0,0 +1,199 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GraphConfig"
++
++#include "src/platformdata/gc/GraphConfig.h"
++
++#include "PlatformData.h"
++#include "iutils/CameraLog.h"
++
++using std::vector;
++using std::map;
++using std::string;
++
++namespace icamera {
++
++GraphConfig::GraphConfig(int32_t camId, ConfigMode mode) :
++        mCameraId(camId) {
++    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl(camId, mode,
++                                                        PlatformData::getGraphSettingsType(camId)));
++}
++
++GraphConfig::GraphConfig() :
++        mCameraId(-1) {
++    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl());
++}
++
++GraphConfig::~GraphConfig() {
++}
++
++void GraphConfig::addCustomKeyMap() {
++    mGraphConfigImpl->addCustomKeyMap();
++}
++
++status_t GraphConfig::parse(int cameraId, const char *settingsXmlFile) {
++    string graphDescFile = PlatformData::getGraphDescFilePath();
++    string settingsFile = PlatformData::getGraphSettingFilePath() + settingsXmlFile;
++    return mGraphConfigImpl->parse(cameraId, graphDescFile.c_str(), settingsFile.c_str());
++}
++
++void GraphConfig::releaseGraphNodes() {
++    mGraphConfigImpl->releaseGraphNodes();
++}
++
++status_t GraphConfig::configStreams(const vector<HalStream*> &activeStreams) {
++    LOG1("@%s", __func__);
++
++    int ret = mGraphConfigImpl->configStreams(activeStreams);
++    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to config streams", __func__);
++
++    ret = mGraphConfigImpl->getGraphConfigData(&mGraphData);
++    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get the static graph config data", __func__);
++
++    return OK;
++}
++
++status_t GraphConfig::getGdcKernelSetting(uint32_t *kernelId,
++                                          ia_isp_bxt_resolution_info_t *resolution) {
++    LOG1("@%s", __func__);
++    CheckError(!kernelId || !resolution, UNKNOWN_ERROR, "kernelId or resolution is nullptr");
++
++    if ((mGraphData.gdcReso.input_width == 0) || (mGraphData.gdcReso.input_height == 0) ||
++        (mGraphData.gdcReso.output_width == 0) || (mGraphData.gdcReso.output_height == 0)) {
++        LOG2("%s, Failed to get gdc InReso: w: %d, h: %d; OutReso: w: %d, h: %d; ", __func__,
++             mGraphData.gdcReso.input_width, mGraphData.gdcReso.input_height,
++             mGraphData.gdcReso.output_width, mGraphData.gdcReso.output_height);
++        return NO_ENTRY;
++    }
++
++    *kernelId = mGraphData.gdcKernelId;
++    *resolution = mGraphData.gdcReso;
++
++    return OK;
++}
++
++status_t GraphConfig::graphGetStreamIds(vector<int32_t> &streamIds) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.streamIds.empty(), UNKNOWN_ERROR, "%s, The streamIds vector is empty", __func__);
++
++    streamIds = mGraphData.streamIds;
++    return OK;
++}
++
++int GraphConfig::getStreamIdByPgName(string pgName) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
++
++    for (auto &info : mGraphData.pgInfo) {
++        if (info.pgName == pgName) {
++            return info.streamId;
++        }
++    }
++
++    LOGE("%s, Failed to get stream id for pgName: %s", __func__, pgName.c_str());
++    return -1;
++}
++
++int GraphConfig::getPgIdByPgName(string pgName) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
++
++    for (auto &info : mGraphData.pgInfo) {
++        if (info.pgName == pgName) {
++            return info.pgId;
++        }
++    }
++
++    LOGE("%s, Failed to get pg id for pgName: %s", __func__, pgName.c_str());
++    return -1;
++}
++
++ia_isp_bxt_program_group* GraphConfig::getProgramGroup(int32_t streamId) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.programGroup.empty(), nullptr, "%s, The programGroup vector is empty", __func__);
++
++    for (auto &info : mGraphData.programGroup) {
++        if (info.streamId == streamId && info.pgPtr != nullptr) {
++            return info.pgPtr;
++        }
++    }
++
++    LOGE("%s, Failed to get programGroup for streamId", __func__, streamId);
++    return nullptr;
++}
++
++status_t GraphConfig::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
++    LOG1("@%s", __func__);
++    for (auto &info : mGraphData.mbrInfo) {
++        if (streamId == info.streamId) {
++            data = &info.data;
++            return OK;
++        }
++    }
++
++    return BAD_VALUE;
++}
++
++status_t GraphConfig::getPgNames(vector<string>* pgNames) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.pgNames.empty(), UNKNOWN_ERROR, "%s, The pgNames vector is empty", __func__);
++
++    *pgNames = mGraphData.pgNames;
++    return OK;
++}
++
++status_t GraphConfig::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
++    LOG1("@%s", __func__);
++    CheckError(mGraphData.pgInfo.empty(), UNKNOWN_ERROR, "%s, The pgInfo vector is empty", __func__);
++
++    for (auto &info : mGraphData.pgInfo) {
++        if (info.pgName == pgName && info.rbmValue.rbm != nullptr) {
++            *stageAttr = info.rbmValue;
++            return OK;
++        }
++    }
++
++    return BAD_VALUE;
++}
++
++int GraphConfig::getProgramGroup(string pgName, ia_isp_bxt_program_group* programGroupForPG) {
++    LOG1("@%s", __func__);
++    return mGraphConfigImpl->getProgramGroup(pgName, programGroupForPG);
++}
++
++status_t GraphConfig::pipelineGetConnections(const vector<string>& pgList,
++                                             vector<IGraphType::PipelineConnection> *confVector) {
++    LOG1("@%s", __func__);
++    CheckError(!confVector, UNKNOWN_ERROR, "%s, The confVector is nullptr", __func__);
++
++    status_t ret;
++    std::vector<IGraphType::ScalerInfo> scalerInfo;
++
++    ret = mGraphConfigImpl->pipelineGetConnections(pgList, &scalerInfo, confVector);
++    CheckError(ret != OK, ret, "%s, Failed to pipelineGetConnections", __func__);
++
++    CheckError(mCameraId == -1, UNKNOWN_ERROR, "%s: mCameraId is -1", __func__);
++    PlatformData::setScalerInfo(mCameraId, scalerInfo);
++    return OK;
++}
++
++status_t GraphConfig::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t *pgId) {
++    LOG1("@%s", __func__);
++    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
++    return mGraphConfigImpl->getPgIdForKernel(streamId, kernelId, pgId);
++}
++}  // icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
+new file mode 100644
+index 000000000000..03c306f5683d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
+@@ -0,0 +1,88 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <memory>
++#include <utility>
++#include <vector>
++#include "HalStream.h"
++#include "iutils/Utils.h"
++#include "iutils/Errors.h"
++
++#ifdef ENABLE_SANDBOXING
++#include "modules/sandboxing/client/GraphConfigImpl.h"
++#else
++#include "modules/algowrapper/graph/GraphConfigImpl.h"
++#endif
++
++namespace icamera {
++
++/**
++ * \class GraphConfig
++ *
++ * \brief This is a wrapper of GraphConfigImpl class and it provides the
++ * public APIs to get the graph config data.
++ *
++ * It maintains one static area and GraphConfigImpl object, user get graph
++ * config data from the local structure or GraphConfigImpl object through
++ * the public APIs
++ */
++class GraphConfig : public IGraphConfig {
++public:
++    GraphConfig();
++    GraphConfig(int32_t camId, ConfigMode mode);
++    virtual ~GraphConfig();
++
++    void addCustomKeyMap();
++    status_t parse(int cameraId, const char *settingsXmlFile);
++    void releaseGraphNodes();
++
++    // These public methods called by GraphConfigManager
++    status_t configStreams(const std::vector<HalStream*> &activeStreams);
++    int getSelectedMcId() { return mGraphData.mcId; }
++    virtual int getGraphId(void) { return mGraphData.graphId; }
++    virtual void getCSIOutputResolution(camera_resolution_t &reso) { reso = mGraphData.csiReso; }
++
++    virtual status_t getGdcKernelSetting(uint32_t *kernelId,
++                                         ia_isp_bxt_resolution_info_t *resolution);
++    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds);
++    virtual int getStreamIdByPgName(std::string pgName);
++    virtual int getPgIdByPgName(std::string pgName);
++    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
++    virtual status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
++    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
++    virtual status_t getPgNames(std::vector<std::string>* pgNames);
++
++    virtual int getProgramGroup(std::string pgName,
++                                ia_isp_bxt_program_group* programGroupForPG);
++    virtual status_t getPgIdForKernel(const uint32_t streamId,
++                                      const int32_t kernelId, int32_t *pgId);
++
++    virtual status_t pipelineGetConnections(
++                         const std::vector<std::string> &pgList,
++                         std::vector<IGraphType::PipelineConnection> *confVector);
++private:
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfig);
++
++private:
++    int32_t mCameraId;
++    IGraphType::GraphConfigData mGraphData;
++    std::unique_ptr<GraphConfigImpl> mGraphConfigImpl;
++};
++
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
+new file mode 100644
+index 000000000000..3b792e0f8600
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
+@@ -0,0 +1,179 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "GraphConfigManager"
++
++#include "src/platformdata/gc/GraphConfigManager.h"
++
++#include "iutils/Utils.h"
++#include "iutils/CameraLog.h"
++#include "PlatformData.h"
++
++using std::vector;
++using std::map;
++
++namespace icamera {
++GraphConfigManager::GraphConfigManager(int32_t cameraId) :
++    mGcConfigured(false),
++    mCameraId(cameraId),
++    mMcId(-1)
++{
++}
++
++GraphConfigManager::~GraphConfigManager()
++{
++    mGraphConfigMap.clear();
++    mGcConfigured = false;
++    releaseHalStream();
++}
++
++void GraphConfigManager::releaseHalStream()
++{
++    for(auto &halStream : mHalStreamVec) {
++        delete halStream;
++    }
++    mHalStreamVec.clear();
++}
++
++/*
++ * Get the useCase from the stream and operationMode.
++ */
++StreamUseCase GraphConfigManager::getUseCaseFromStream(ConfigMode configMode, const stream_t &stream)
++{
++    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE ||
++            stream.usage == CAMERA_STREAM_STILL_CAPTURE)
++        return USE_CASE_STILL_CAPTURE;
++
++    return USE_CASE_PREVIEW;
++}
++
++/**
++ * Initialize the state of the GraphConfigManager after parsing the stream
++ * configuration.
++ * Perform the first level query to find a subset of settings that fulfill the
++ * constrains from the stream configuration.
++ *
++ * \param[in] streamList: all the streams info.
++ */
++status_t GraphConfigManager::configStreams(const stream_config_t *streamList)
++{
++    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
++    CheckError(!streamList, BAD_VALUE, "%s: Null streamList configured", __func__);
++
++    vector <ConfigMode> configModes;
++    int ret = PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
++    CheckError(ret != OK, ret, "%s, get ConfigMode failed %d", __func__, ret);
++
++    // Convert the stream_t to HalStream
++    // Use the stream list with descending order to find graph settings.
++    releaseHalStream();
++    for (int i = 0; i < streamList->num_streams; i++) {
++        // Don't handle input stream or opaque RAW stream when configure graph configuration.
++        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
++            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
++
++        bool stored = false;
++        StreamUseCase useCase = getUseCaseFromStream(configModes[0], streamList->streams[i]);
++        streamProps props = {
++            static_cast<uint32_t>(streamList->streams[i].width),
++            static_cast<uint32_t>(streamList->streams[i].height),
++            streamList->streams[i].format,
++            streamList->streams[i].id,
++            useCase,
++        };
++        HalStream* halStream = new HalStream(props, static_cast<void*>(&streamList->streams[i]));
++        CheckError(!halStream, UNKNOWN_ERROR, "Failed to create hal stream");
++
++        for (size_t j = 0; j < mHalStreamVec.size(); j++) {
++            if (halStream->width() * halStream->height() > mHalStreamVec[j]->width() * mHalStreamVec[j]->height()) {
++                stored = true;
++                mHalStreamVec.insert((mHalStreamVec.begin() + j), halStream);
++                break;
++            }
++        }
++        if (!stored)
++            mHalStreamVec.push_back(halStream);
++    }
++
++    //debug
++    dumpStreamConfig();
++    mGraphConfigMap.clear();
++    mMcId = -1;
++
++    for (auto mode : configModes) {
++        LOG1("Mapping the operationMode %d to ConfigMode %d", streamList->operation_mode, mode);
++
++        std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>(mCameraId, mode);
++        ret = graphConfig->configStreams(mHalStreamVec);
++        CheckWarning(ret != OK, ret, "%s, Failed to configure graph: real ConfigMode %x", __func__, mode);
++
++        int id = graphConfig->getSelectedMcId();
++        CheckError((id != -1 && mMcId != -1 && mMcId != id), UNKNOWN_ERROR,
++                    "Not support two different MC ID at same time:(%d/%d)", mMcId, id);
++        mMcId = id;
++        LOGG("%s: Add graph setting for op_mode %d", __func__, mode);
++        mGraphConfigMap[mode] = graphConfig;
++    }
++
++    mGcConfigured = true;
++    return OK;
++}
++
++std::shared_ptr<IGraphConfig> GraphConfigManager::getGraphConfig(ConfigMode configMode)
++{
++    for (auto& gc : mGraphConfigMap) {
++        if (gc.first == configMode) {
++            LOGG("%s: found graph config for mode %d", __func__, configMode);
++            return gc.second;
++        }
++    }
++
++    return nullptr;
++}
++
++void GraphConfigManager::dumpStreamConfig()
++{
++    for (size_t i = 0; i < mHalStreamVec.size(); i++) {
++        LOG1("stream[%zu] %dx%d, fmt %s", i,
++             mHalStreamVec[i]->width(), mHalStreamVec[i]->height(),
++             CameraUtils::pixelCode2String(mHalStreamVec[i]->format()));
++    }
++}
++
++map<int, IGraphConfigManager*> IGraphConfigManager::sInstances;
++Mutex IGraphConfigManager::sLock;
++
++IGraphConfigManager* IGraphConfigManager::getInstance(int cameraId)
++{
++    AutoMutex lock(sLock);
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        return sInstances[cameraId];
++    }
++
++    sInstances[cameraId] = new GraphConfigManager(cameraId);
++    return sInstances[cameraId];
++}
++
++void IGraphConfigManager::releaseInstance(int cameraId)
++{
++    AutoMutex lock(sLock);
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        IGraphConfigManager* gcManager = sInstances[cameraId];
++        sInstances.erase(cameraId);
++        delete gcManager;
++    }
++}
++}  // icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
+new file mode 100644
+index 000000000000..68b5066ed200
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <gcss.h>
++
++#include <memory>
++#include <utility>
++#include <vector>
++
++#include "iutils/Errors.h"
++#include "iutils/Thread.h"
++#include "GraphConfig.h"
++#include "IGraphConfigManager.h"
++
++namespace icamera {
++
++/**
++ * \class GraphConfigManager
++ *
++ * Class to wrap over parsing and executing queries on graph settings.
++ * GraphConfigManager owns the interface towards GCSS and provides convenience
++ * for HAL to execute queries and it generates GraphConfig objects as results.
++ *
++ * GraphConfigManager also provides static method for parsing graph descriptor
++ * and graph settings from XML files and filtering that data based on sensor.
++ * The \class GraphConfigmanager::Nodes object is stored in CameraCapInfo and
++ * is used when instantiating GCM.
++ *
++ * At camera open, GraphConfigManager object is created.
++ * At stream config time the state of GraphConfig manager changes with the
++ * result of the first query. This is the possible subset of graph settings that
++ * can fulfill the requirements of requested streams.
++ * At this point, there may be more than one options, but
++ * GCM can always return some default settings.
++ *
++ * Per each request, GraphConfigManager creates GraphConfig objects based
++ * on request content. These objects are owned by GCM in a pool, and passed
++ * around HAL via shared pointers.
++ */
++class GraphConfigManager: public IGraphConfigManager
++{
++public:
++    explicit GraphConfigManager(int32_t cameraId);
++    virtual ~GraphConfigManager();
++
++    // Public APIs in IGraphConfigManager
++    virtual status_t configStreams(const stream_config_t *streamList);
++    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode);
++    virtual int getSelectedMcId() { LOGG("%s: %d", __func__, mMcId); return mMcId; }
++    virtual bool isGcConfigured(void) { LOGG("%s: %d", __func__, mGcConfigured); return mGcConfigured; }
++
++private:
++    // Disable copy constructor and assignment operator
++    DISALLOW_COPY_AND_ASSIGN(GraphConfigManager);
++
++    StreamUseCase getUseCaseFromStream(ConfigMode configMode, const stream_t &stream);
++    void releaseHalStream();
++
++    // Debuging helpers
++    void dumpStreamConfig();
++private:
++
++    bool mGcConfigured;
++    int32_t mCameraId;
++    std::map<ConfigMode, std::shared_ptr<GraphConfig> > mGraphConfigMap;
++    std::vector<HalStream*> mHalStreamVec;
++    int mMcId;
++};
++
++} // icamera
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
+new file mode 100644
+index 000000000000..7f822e6b20c6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2018-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#define LOG_TAG "GraphUtils"
++
++#include "GraphUtils.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
++#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
++#define psys_2600_term_idx_from_uid(uid) ((uid & 0x0000FFFF) - 1)
++
++using namespace std;
++
++namespace icamera {
++
++void GraphUtils::dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
++        return;
++    }
++
++    LOGG("Graph connections:");
++    for (auto& conn : connections) {
++
++        LOGG("Format settings: enabled === %d ===, terminalIdx %d, width %d, height %d, fourcc %s, bpl %d, bpp %d",
++                    conn.portFormatSettings.enabled,
++                    conn.portFormatSettings.terminalId,
++                    conn.portFormatSettings.width, conn.portFormatSettings.height,
++                    CameraUtils::fourcc2String(conn.portFormatSettings.fourcc).c_str(),
++                    conn.portFormatSettings.bpl, conn.portFormatSettings.bpp);
++
++        LOGG("Connection config: sourceStage %d(%d), sourceTerminal %d(%d), sourceIteration %d, " \
++                    "sinkStage %d(%d), sinkTerminal %d(%d), sinkIteration %d, connectionType %d",
++                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSourceStage),
++                    conn.connectionConfig.mSourceStage,
++                    conn.connectionConfig.mSourceTerminal - conn.connectionConfig.mSourceStage -1,
++                    conn.connectionConfig.mSourceTerminal,
++                    conn.connectionConfig.mSourceIteration,
++                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSinkStage),
++                    conn.connectionConfig.mSinkStage,
++                    conn.connectionConfig.mSinkTerminal - conn.connectionConfig.mSinkStage -1,
++                    conn.connectionConfig.mSinkTerminal,
++                    conn.connectionConfig.mSinkIteration,
++                    conn.connectionConfig.mConnectionType);
++
++        LOGG("Edge port: %d", conn.hasEdgePort);
++    }
++
++    return;
++}
++
++void GraphUtils::dumpKernelInfo(const ia_isp_bxt_program_group& programGroup)
++{
++    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
++        return;
++    }
++
++    LOGG("Kernel info: count %d, opMode %d", programGroup.kernel_count, programGroup.operation_mode);
++
++    for(unsigned int i = 0; i< programGroup.kernel_count; i++) {
++
++        const ia_isp_bxt_run_kernels_t& curRunKernel = programGroup.run_kernels[i];
++
++        LOGG("uid %d, streamId: %d, enabled %d", curRunKernel.kernel_uuid, curRunKernel.stream_id,
++                    curRunKernel.enable);
++
++        if (programGroup.run_kernels[i].resolution_info) {
++            LOGG("Resolution: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
++                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
++                       curRunKernel.resolution_info->input_width, curRunKernel.resolution_info->input_height,
++                       curRunKernel.resolution_info->input_crop.left, curRunKernel.resolution_info->input_crop.top,
++                       curRunKernel.resolution_info->input_crop.right, curRunKernel.resolution_info->input_crop.bottom,
++                       curRunKernel.resolution_info->output_width, curRunKernel.resolution_info->output_height,
++                       curRunKernel.resolution_info->output_crop.left, curRunKernel.resolution_info->output_crop.top,
++                       curRunKernel.resolution_info->output_crop.right, curRunKernel.resolution_info->output_crop.bottom);
++        }
++
++        if (programGroup.run_kernels[i].resolution_history) {
++            LOGG("Resolution history: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
++                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
++                       curRunKernel.resolution_history->input_width, curRunKernel.resolution_history->input_height,
++                       curRunKernel.resolution_history->input_crop.left, curRunKernel.resolution_history->input_crop.top,
++                       curRunKernel.resolution_history->input_crop.right, curRunKernel.resolution_history->input_crop.bottom,
++                       curRunKernel.resolution_history->output_width, curRunKernel.resolution_history->output_height,
++                       curRunKernel.resolution_history->output_crop.left, curRunKernel.resolution_history->output_crop.top,
++                       curRunKernel.resolution_history->output_crop.right, curRunKernel.resolution_history->output_crop.bottom);
++
++        }
++
++        LOGG("metadata %d %d %d %d, bppInfo: %d %d, outputCount %d",
++                   curRunKernel.metadata[0], curRunKernel.metadata[1], curRunKernel.metadata[2], curRunKernel.metadata[3],
++                   curRunKernel.bpp_info.input_bpp, curRunKernel.bpp_info.output_bpp,
++                   curRunKernel.output_count);
++    }
++
++    return;
++}
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
+new file mode 100644
+index 000000000000..86686c576e1c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
+@@ -0,0 +1,27 @@
++/*
++ * Copyright (C) 2018-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include "IGraphConfig.h"
++#include "IGraphConfigManager.h"
++#include "ia_isp_bxt_types.h"
++
++namespace icamera {
++namespace GraphUtils {
++    void dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections);
++    void dumpKernelInfo(const ia_isp_bxt_program_group& programGroup);
++};
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
+new file mode 100644
+index 000000000000..139125a46552
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
+@@ -0,0 +1,74 @@
++/*
++ * Copyright (C) 2016-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++namespace icamera {
++
++// Temporary solution
++enum StreamUseCase {
++    USE_CASE_COMMON = 0,
++    USE_CASE_PREVIEW = 1 << 0,        // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
++    USE_CASE_VIDEO = 1 << 1,          // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
++    USE_CASE_STILL_CAPTURE = 1 << 2,  // For HAL_PIXEL_FORMAT_BLOB/HAL_PIXEL_FORMAT_YCbCr_420_888
++    USE_CASE_RAW = 1 << 3,            // For HAL_PIXEL_FORMAT_RAW16/HAL_PIXEL_FORMAT_RAW_OPAQUE
++    USE_CASE_ZSL = 1 << 4,            // For ZSL stream
++    USE_CASE_INPUT = 1 << 5,           // For input stream
++};
++
++struct streamProps {
++    uint32_t width;
++    uint32_t height;
++    int format;
++    int streamId;
++    StreamUseCase useCase;
++};
++
++class HalStream
++{
++ public:
++    HalStream(struct streamProps &props, void *priv):
++        mWidth(props.width),
++        mHeight(props.height),
++        mFormat(props.format),
++        mStreamId(props.streamId),
++        mUseCase(props.useCase)
++    {
++        maxBuffers = 0;
++        mPrivate = priv;
++    }
++
++    ~HalStream() { }
++
++    uint32_t width() const { return mWidth; }
++    uint32_t height() const { return mHeight; }
++    int format() const { return mFormat; }
++    int streamId() const { return mStreamId; }
++    StreamUseCase useCase() const { return mUseCase; }
++    void *priv() { return mPrivate; }
++
++ public:
++    uint32_t mWidth;
++    uint32_t mHeight;
++    int mFormat;  // TODO: use v4l2 definition
++    int mStreamId;
++    StreamUseCase mUseCase;
++
++    int maxBuffers;
++    void *mPrivate;
++};
++
++} /* namespace icamera */
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
+new file mode 100644
+index 000000000000..8771706dc447
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
+@@ -0,0 +1,203 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include <string>
++#include "HalStream.h"
++#include "Parameters.h"
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++
++#include <gcss.h>
++#include <gcss_aic_utils.h>
++#include "ia_isp_bxt_types.h"
++#include "ia_view_types.h"
++
++typedef uint32_t ia_uid;
++
++namespace GCSS {
++    class GraphConfigNode;
++    class GraphQueryManager;
++    class ItemUID;
++}
++
++typedef GCSS::GraphConfigNode Node;
++typedef std::vector<Node*> NodesPtrVector;
++
++namespace icamera {
++
++/**
++ * Stream id associated with still capture.
++ */
++static const int32_t STILL_STREAM_ID = 60000;
++/**
++ * Stream id associated with video stream.
++ */
++#ifdef TNR7_CM
++static const int32_t VIDEO_STREAM_ID = 60006;
++#else
++static const int32_t VIDEO_STREAM_ID = 60001;
++#endif
++
++namespace IGraphType {
++class ConnectionConfig {
++ public:
++    ConnectionConfig(): mSourceStage(0),
++                        mSourceTerminal(0),
++                        mSourceIteration(0),
++                        mSinkStage(0),
++                        mSinkTerminal(0),
++                        mSinkIteration(0),
++                        mConnectionType(0) {}
++
++    ConnectionConfig(ia_uid sourceStage,
++                     ia_uid sourceTerminal,
++                     ia_uid sourceIteration,
++                     ia_uid sinkStage,
++                     ia_uid sinkTerminal,
++                     ia_uid sinkIteration,
++                     int connectionType):
++                         mSourceStage(sourceStage),
++                         mSourceTerminal(sourceTerminal),
++                         mSourceIteration(sourceIteration),
++                         mSinkStage(sinkStage),
++                         mSinkTerminal(sinkTerminal),
++                         mSinkIteration(sinkIteration),
++                         mConnectionType(connectionType) {}
++    void dump() {
++        LOG1("connection src 0x%x (0x%x) sink 0x%x(0x%x)",
++             mSourceStage, mSourceTerminal, mSinkStage, mSinkTerminal);
++    }
++
++    ia_uid mSourceStage;
++    ia_uid mSourceTerminal;
++    ia_uid mSourceIteration;
++    ia_uid mSinkStage;
++    ia_uid mSinkTerminal;
++    ia_uid mSinkIteration;
++    int mConnectionType;
++};
++
++/**
++* \struct PortFormatSettings
++* Format settings for a port in the graph
++*/
++struct PortFormatSettings {
++    int32_t      enabled;
++    uint32_t     terminalId; /**< Unique terminal id (is a fourcc code) */
++    int32_t      width;    /**< Width of the frame in pixels */
++    int32_t      height;   /**< Height of the frame in lines */
++    int32_t      fourcc;   /**< Frame format */
++    int32_t      bpl;      /**< Bytes per line*/
++    int32_t      bpp;      /**< Bits per pixel */
++};
++
++/**
++ * \struct PipelineConnection
++ * Group port format, connection, stream, edge port for
++ * pipeline configuration
++ */
++struct PipelineConnection {
++    PipelineConnection() : stream(nullptr), hasEdgePort(false) { CLEAR(portFormatSettings); }
++    PortFormatSettings portFormatSettings;
++    ConnectionConfig connectionConfig;
++    HalStream *stream;
++    bool hasEdgePort;
++};
++
++struct StageAttr{
++    void *rbm;
++    uint32_t rbm_bytes;
++    StageAttr() : rbm(nullptr), rbm_bytes(0) {}
++};
++
++enum terminal_connection_type {
++    connection_type_push, /* data is pushed by source stage execute */
++    connection_type_pull  /* data is pulled by sink stage execute */
++};
++
++struct PgInfo {
++    PgInfo() : pgId(-1), streamId(-1) {}
++    std::string pgName;
++    int pgId;
++    int streamId;
++    StageAttr rbmValue;
++};
++
++struct MbrInfo {
++    MbrInfo() { streamId = -1; CLEAR(data); }
++    int streamId;
++    ia_isp_bxt_gdc_limits data;
++};
++
++struct ProgramGroupInfo {
++    ProgramGroupInfo() { streamId = -1; pgPtr = nullptr; }
++    int streamId;
++    ia_isp_bxt_program_group *pgPtr;
++};
++
++struct GraphConfigData {
++    int mcId;
++    int graphId;
++    uint32_t gdcKernelId;
++    camera_resolution_t csiReso;
++    ia_isp_bxt_resolution_info_t gdcReso;
++    std::vector<int32_t> streamIds;
++    std::vector<PgInfo> pgInfo;
++    std::vector<MbrInfo> mbrInfo;
++    std::vector<std::string> pgNames;
++    std::vector<ProgramGroupInfo> programGroup;
++    GraphConfigData() : mcId(-1),
++                        graphId(-1),
++                        gdcKernelId(-1) {
++        CLEAR(csiReso);
++        CLEAR(gdcReso);
++    }
++};
++
++struct ScalerInfo {
++    int32_t streamId;
++    float scalerWidth;
++    float scalerHeight;
++};
++}  // namespace IGraphType
++
++class IGraphConfig {
++public:
++    virtual ~IGraphConfig() = default;
++
++    virtual void getCSIOutputResolution(camera_resolution_t &reso) = 0;
++    virtual status_t getGdcKernelSetting(uint32_t *kernelId,
++                                         ia_isp_bxt_resolution_info_t *resolution) = 0;
++    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds) = 0;
++    virtual int getGraphId(void) = 0;
++    virtual int getStreamIdByPgName(std::string pgName) = 0;
++    virtual int getPgIdByPgName(std::string pgName) = 0;
++    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId) = 0;
++    virtual int getProgramGroup(std::string pgName,
++                                ia_isp_bxt_program_group* programGroupForPG) {return OK;}
++    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) = 0;
++    virtual status_t getPgRbmValue(std::string pgName,
++                                   IGraphType::StageAttr *stageAttr) {return OK;}
++    virtual status_t getPgIdForKernel(const uint32_t streamIds,
++                                      const int32_t kernelId, int32_t *pgId) {return OK;}
++    virtual status_t getPgNames(std::vector<std::string>* pgNames) = 0;
++    virtual status_t pipelineGetConnections(
++                         const std::vector<std::string> &pgList,
++                         std::vector<IGraphType::PipelineConnection> *confVector) = 0;
++};
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
+new file mode 100644
+index 000000000000..fa55c57ab2d1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
+@@ -0,0 +1,43 @@
++/*
++ * Copyright (C) 2018-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include <memory>
++#include <map>
++
++#include "CameraTypes.h"
++#include "IGraphConfig.h"
++#include "Parameters.h"
++#include "iutils/Thread.h"
++
++namespace icamera {
++class IGraphConfigManager {
++public:
++    virtual ~IGraphConfigManager() = default;
++
++    virtual int configStreams(const stream_config_t* streams) = 0;
++    virtual int getSelectedMcId() = 0;
++    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode) = 0;
++    virtual bool isGcConfigured(void) = 0;
++    static void releaseInstance(int cameraId);
++    static IGraphConfigManager* getInstance(int cameraId);
++
++private:
++    // Guard for singleton instance creation.
++    static Mutex sLock;
++    static std::map<int, IGraphConfigManager*> sInstances;
++};
++}
+diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
+new file mode 100644
+index 000000000000..624d750c868d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2016-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++GCSS_KEY (BAYER_ORDER, bayer_order)
++GCSS_KEY (GAIN, analogue_gain)
++GCSS_KEY (CSI_BE, csi_be)
++GCSS_KEY (CSI_BE_SOC, csi_be_soc)
++GCSS_KEY (CSI_PORT, csi_port)
++GCSS_KEY (EXPOSURE, exposure)
++GCSS_KEY (FLL, min_fll)
++GCSS_KEY (INTERLACED, interlaced)
++GCSS_KEY (HFLIP, hflip)
++GCSS_KEY (LINK_FREQ, link_freq)
++GCSS_KEY (LLP, min_llp)
++GCSS_KEY (SENSOR_MODE, sensor_mode)
++GCSS_KEY (PIXEL_ARRAY, pixel_array)
++GCSS_KEY (BINNER, binner)
++GCSS_KEY (SCALER, scaler)
++GCSS_KEY (BINNING_H_FACTOR, h_factor)
++GCSS_KEY (BINNING_V_FACTOR, v_factor)
++GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
++GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
++GCSS_KEY (PORT_0, port_0)
++GCSS_KEY (SCALER_PAD, scaler_pad)
++GCSS_KEY (TARGET, target)
++GCSS_KEY (SENSOR_NAME, sensor_name)
++GCSS_KEY (TPG, tpg)
++GCSS_KEY (STILL_POST_GDC, still_post_gdc)
++GCSS_KEY (VFLIP, vflip)
++GCSS_KEY (VIDEO0, video0)
++GCSS_KEY (VIDEO1, video1)
++GCSS_KEY (VIDEO2, video2)
++GCSS_KEY (STILL0, still0)
++GCSS_KEY (STILL1, still1)
++GCSS_KEY (STILL2, still2)
++GCSS_KEY (RAW, raw)
++GCSS_KEY (OP_MODE, op_mode)
++GCSS_KEY (MC_ID, mc_id)
+diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
+new file mode 100644
+index 000000000000..c3b84fde440b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
+@@ -0,0 +1,1155 @@
++/*
++ * Copyright (C) 2011 The Android Open Source Project
++ * Copyright (C) 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "MediaControl"
++
++#include <stack>
++#include <linux/v4l2-mediabus.h>
++#include <linux/videodev2.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Errors.h"
++#include "iutils/Utils.h"
++#include "V4l2DeviceFactory.h"
++#include "MediaControl.h"
++#include "Parameters.h"
++#include "SysCall.h"
++#include "PlatformData.h"
++
++using std::string;
++using std::vector;
++
++namespace icamera {
++
++struct MediaLink {
++    MediaPad *source;
++    MediaPad *sink;
++    MediaLink *twin;
++    uint32_t flags;
++    uint32_t padding[3];
++};
++
++struct MediaPad {
++    MediaEntity *entity;
++    uint32_t index;
++    uint32_t flags;
++    uint32_t padding[3];
++};
++
++struct MediaEntity {
++    media_entity_desc info;
++    MediaPad *pads;
++    MediaLink *links;
++    unsigned int maxLinks;
++    unsigned int numLinks;
++
++    char devname[32];
++};
++
++MediaControl *MediaControl::sInstance = nullptr;
++Mutex MediaControl::sLock;
++
++MediaControl* MediaControl::getMediaControlInstance() {
++    MediaControl* mediaControlInstance = nullptr;
++
++    for (int i = 0; i < MEDIA_DEVICE_MAX_NUM; i++) {
++        std::string fileName = MEDIA_CTL_DEV_NAME;
++        fileName.append(std::to_string(i));
++
++        struct stat fileStat = {};
++        int ret = stat(fileName.c_str(), &fileStat);
++        if (ret != 0) {
++            LOG2("%s: There is no file %s", __func__, fileName.c_str());
++            continue;
++        }
++
++        SysCall *sc = SysCall::getInstance();
++        int fd = sc->open(fileName.c_str(), O_RDWR);
++        CheckError(fd < 0, nullptr, "%s: Error open media device %s:%s", __func__, fileName.c_str(),
++                   strerror(errno));
++
++        media_device_info info;
++        ret = sc->ioctl(fd, MEDIA_IOC_DEVICE_INFO, &info);
++        if ((ret != -1) &&
++            (0 == strncmp(info.driver, MEDIA_DRIVER_NAME, strlen(MEDIA_DRIVER_NAME)))) {
++            mediaControlInstance = new MediaControl(fileName.c_str());
++        }
++
++        if (sc->close(fd) < 0) {
++            LOGE("%s: Error close media device %s:%s", __func__, fileName.c_str(), strerror(errno));
++        }
++
++        if (mediaControlInstance) {
++            LOG2("%s: media device name:%s", __func__, fileName.c_str());
++            break;
++        }
++    }
++
++    return mediaControlInstance;
++}
++
++/*static*/ MediaControl*
++MediaControl::getInstance()
++{
++    LOG1("%s", __func__);
++    AutoMutex lock(sLock);
++    if (!sInstance) {
++        sInstance = getMediaControlInstance();
++    }
++    return sInstance;
++}
++
++void MediaControl::releaseInstance()
++{
++    LOG1("%s", __func__);
++    AutoMutex lock(sLock);
++    delete sInstance;
++    sInstance = nullptr;
++}
++
++MediaControl::MediaControl(const char *devName) :
++    mDevName(devName)
++{
++    LOG1("@%s device: %s", __func__, devName);
++}
++
++MediaControl::~MediaControl()
++{
++    LOG1("@%s", __func__);
++}
++
++int MediaControl::initEntities()
++{
++    LOG1("@%s", __func__);
++
++    mEntities.reserve(100);
++
++    int ret = enumInfo();
++    if (ret != 0) {
++        LOGE("Enum Info failed.");
++        return -1;
++    }
++
++    return 0;
++}
++
++void MediaControl::clearEntities()
++{
++    LOG1("@%s", __func__);
++
++    auto entity = mEntities.begin();
++    while (entity != mEntities.end()) {
++        delete [] entity->pads;
++        entity->pads = nullptr;
++        delete [] entity->links;
++        entity->links = nullptr;
++        entity = mEntities.erase(entity);
++    }
++}
++
++MediaEntity *MediaControl::getEntityByName(const char *name)
++{
++    CheckError(!name, nullptr, "Invalid Entity name");
++
++    for (auto &entity : mEntities) {
++        if (strcmp(name, entity.info.name) == 0) {
++            return &entity;
++        }
++    }
++
++    return nullptr;
++}
++
++int MediaControl::getEntityIdByName(const char *name)
++{
++    MediaEntity *entity = getEntityByName(name);
++    if (!entity) {
++        return -1;
++    }
++
++    return entity->info.id;
++}
++
++int MediaControl::resetAllLinks()
++{
++    int ret;
++
++    LOG1("@%s", __func__);
++
++    for (auto &entity : mEntities) {
++
++        for (uint32_t j = 0; j < entity.numLinks; j++) {
++            MediaLink *link = &entity.links[j];
++
++            if (link->flags & MEDIA_LNK_FL_IMMUTABLE ||
++                    link->source->entity->info.id != entity.info.id) {
++                continue;
++            }
++            ret = setupLink(link->source, link->sink,
++                    link->flags & ~MEDIA_LNK_FL_ENABLED);
++
++            if (ret < 0)
++                return ret;
++        }
++    }
++
++    return 0;
++}
++
++int MediaControl::setupLink(MediaPad *source, MediaPad *sink, uint32_t flags)
++{
++    MediaLink *link = nullptr;
++    media_link_desc ulink;
++    uint32_t i;
++    int ret = 0;
++    LOG1("@%s", __func__);
++
++    SysCall *sc = SysCall::getInstance();
++
++    int fd = openDevice();
++    if (fd < 0)
++        goto done;
++
++    for (i = 0; i < source->entity->numLinks; i++) {
++        link = &source->entity->links[i];
++
++        if (link->source->entity == source->entity &&
++                link->source->index == source->index &&
++                link->sink->entity == sink->entity &&
++                link->sink->index == sink->index)
++            break;
++    }
++
++    if (i == source->entity->numLinks) {
++        LOGE("%s: Link not found", __func__);
++        ret = -ENOENT;
++        goto done;
++    }
++
++    /* source pad */
++    memset(&ulink, 0, sizeof(media_link_desc));
++    ulink.source.entity = source->entity->info.id;
++    ulink.source.index = source->index;
++    ulink.source.flags = MEDIA_PAD_FL_SOURCE;
++
++    /* sink pad */
++    ulink.sink.entity = sink->entity->info.id;
++    ulink.sink.index = sink->index;
++    ulink.sink.flags = MEDIA_PAD_FL_SINK;
++
++    if (link)
++        ulink.flags = flags | (link->flags & MEDIA_LNK_FL_IMMUTABLE);
++
++    if (Log::isDumpMediaInfo())
++        dumpLinkDesc(&ulink, 1);
++
++    ret = sc->ioctl(fd, MEDIA_IOC_SETUP_LINK, &ulink);
++    if (ret == -1) {
++        ret = -errno;
++        LOGE( "%s: Unable to setup link (%s)",
++                __func__, strerror(errno));
++        goto done;
++    }
++
++    if (link) {
++        link->flags = ulink.flags;
++        link->twin->flags = ulink.flags;
++    }
++
++    ret = 0;
++
++done:
++    closeDevice(fd);
++    return ret;
++}
++
++int MediaControl::setupLink(uint32_t srcEntity, uint32_t srcPad,
++                            uint32_t sinkEntity, uint32_t sinkPad, bool enable)
++{
++    LOG1("@%s srcEntity %d srcPad %d sinkEntity %d sinkPad %d enable %d",
++            __func__, srcEntity, srcPad, sinkEntity, sinkPad, enable);
++
++    for (auto &entity : mEntities) {
++        for (uint32_t j = 0; j < entity.numLinks; j++) {
++            MediaLink *link = &entity.links[j];
++
++            if ((link->source->entity->info.id == srcEntity)
++                && (link->source->index == srcPad)
++                && (link->sink->entity->info.id == sinkEntity)
++                && (link->sink->index == sinkPad)) {
++
++                if (enable)
++                    link->flags |= MEDIA_LNK_FL_ENABLED;
++                else
++                    link->flags &= ~MEDIA_LNK_FL_ENABLED;
++
++                return setupLink(link->source, link->sink, link->flags);
++            }
++        }
++    }
++
++    return -1;
++}
++
++int MediaControl::openDevice()
++{
++    int fd;
++    LOG1("@%s %s", __func__, mDevName.c_str());
++
++    SysCall *sc = SysCall::getInstance();
++
++    fd = sc->open(mDevName.c_str(), O_RDWR);
++    if (fd < 0) {
++        LOGE("%s: Error open media device %s: %s", __func__,
++             mDevName.c_str(), strerror(errno));
++        return UNKNOWN_ERROR;
++    }
++
++    return fd;
++}
++
++void MediaControl::closeDevice(int fd)
++{
++    LOG1("@%s", __func__);
++
++    if (fd < 0)
++        return ;
++
++    SysCall *sc = SysCall::getInstance();
++
++    if (sc->close(fd) < 0) {
++        LOGE("%s: Error close media device %s: %s", __func__,
++             mDevName.c_str(), strerror(errno));
++    }
++}
++
++void MediaControl::dumpInfo(media_device_info& devInfo)
++{
++    LOGD("Media controller API version %u.%u.%u\n\n",
++         (devInfo.media_version << 16) & 0xff,
++         (devInfo.media_version << 8) & 0xff,
++         (devInfo.media_version << 0) & 0xff);
++
++    LOGD("Media device information\n"
++         "------------------------\n"
++         "driver          %s\n"
++         "model           %s\n"
++         "serial          %s\n"
++         "bus info        %s\n"
++         "hw revision     0x%x\n"
++         "driver version  %u.%u.%u\n\n",
++         devInfo.driver, devInfo.model,
++         devInfo.serial, devInfo.bus_info,
++         devInfo.hw_revision,
++         (devInfo.driver_version << 16) & 0xff,
++         (devInfo.driver_version << 8) & 0xff,
++         (devInfo.driver_version << 0) & 0xff);
++
++    for (uint32_t i = 0; i < sizeof(devInfo.reserved)/sizeof(uint32_t); i++)
++         LOG2("reserved[%u] %d", i, devInfo.reserved[i]);
++}
++
++int MediaControl::enumInfo()
++{
++    int ret;
++    int fd = -1;
++    media_device_info info;
++    LOG1("@%s", __func__);
++
++    SysCall *sc = SysCall::getInstance();
++
++    if (mEntities.size() > 0)
++        return 0;
++
++    fd = openDevice();
++    if (fd < 0) {
++        LOGE("Open device failed.");
++        return fd;
++    }
++
++    ret = sc->ioctl(fd, MEDIA_IOC_DEVICE_INFO, &info);
++    if (ret < 0) {
++        LOGE("%s: Unable to retrieve media device information for device %s (%s)",__func__, mDevName.c_str(), strerror(errno));
++        goto done;
++    }
++
++    if (Log::isDumpMediaInfo())
++        dumpInfo(info);
++
++    ret = enumEntities(fd, info);
++    if (ret < 0) {
++        LOGE("%s: Unable to enumerate entities for device %s", __func__, mDevName.c_str());
++        goto done;
++    }
++
++    LOG2("Found %lu entities", mEntities.size());
++    LOG2("Enumerating pads and links");
++
++    ret = enumLinks(fd);
++    if (ret < 0) {
++        LOGE("%s: Unable to enumerate pads and linksfor device %s", __func__, mDevName.c_str());
++        goto done;
++    }
++
++    ret = 0;
++
++done:
++    closeDevice(fd);
++    return ret;
++}
++
++void MediaControl::dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo)
++{
++    LOGD("id %d", desc.id);
++    LOGD("name %s", desc.name);
++    LOGD("type 0x%x", desc.type);
++    LOGD("revision %d", desc.revision);
++    LOGD("flags %d", desc.flags);
++    LOGD("group_id %d", desc.group_id);
++    LOGD("pads %d", desc.pads);
++    LOGD("links %u", desc.links);
++
++    for (uint32_t i = 0; i < sizeof(desc.reserved)/sizeof(uint32_t); i++)
++        LOGD("reserved[%u] %d", i, devInfo.reserved[i]);
++}
++
++int MediaControl::enumEntities(int fd, media_device_info& devInfo)
++{
++    MediaEntity entity;
++    uint32_t id;
++    int ret;
++    LOG1("@%s", __func__);
++    SysCall *sc = SysCall::getInstance();
++
++    for (id = 0, ret = 0; ; id = entity.info.id) {
++        memset(&entity, 0, sizeof(MediaEntity));
++        entity.info.id = id | MEDIA_ENT_ID_FLAG_NEXT;
++
++        ret = sc->ioctl(fd, MEDIA_IOC_ENUM_ENTITIES, &entity.info);
++        if (ret < 0) {
++            ret = errno != EINVAL ? -errno : 0;
++            break;
++        }
++
++        if (Log::isDumpMediaInfo())
++            dumpEntityDesc(entity.info, devInfo);
++
++        /* Number of links (for outbound links) plus number of pads (for
++         * inbound links) is a good safe initial estimate of the total
++         * number of links.
++         */
++        entity.maxLinks = entity.info.pads + entity.info.links;
++
++        entity.pads = new MediaPad[entity.info.pads];
++        entity.links = new MediaLink[entity.maxLinks];
++        getDevnameFromSysfs(&entity);
++        mEntities.push_back(entity);
++
++        /* Note: carefully to move the follow setting. It must be behind of
++         * push_back to mEntities:
++         * 1. if entity is not pushed back to mEntities, getEntityById will
++         * return NULL.
++         * 2. we can't set entity.pads[i].entity to &entity direct. Because,
++         * entity is stack variable, its scope is just this function.
++         */
++        for (uint32_t i = 0; i < entity.info.pads; ++i) {
++            entity.pads[i].entity = getEntityById(entity.info.id);
++        }
++    }
++
++    return ret;
++}
++
++int MediaControl::getDevnameFromSysfs(MediaEntity *entity)
++{
++    char sysName[MAX_SYS_NAME] = {'\0'};
++    char target[MAX_TARGET_NAME] = {'\0'};
++    int ret;
++
++    if (!entity) {
++        LOGE("entity is null.");
++        return -EINVAL;
++    }
++
++    ret = snprintf(sysName, MAX_SYS_NAME, "/sys/dev/char/%u:%u",
++                   entity->info.v4l.major, entity->info.v4l.minor);
++    if (ret <= 0) {
++        LOGE("create sysName failed ret %d.", ret);
++        return -EINVAL;
++    }
++
++    ret = readlink(sysName, target, MAX_TARGET_NAME);
++    if (ret <= 0) {
++        LOGE("readlink sysName %s failed ret %d.", sysName, ret);
++        return -EINVAL;
++    }
++
++    char *d = strrchr(target, '/');
++    if (!d) {
++        LOGE("target is invalid %s.", target);
++        return -EINVAL;
++    }
++    d++; /* skip '/' */
++
++    char *t = strstr(d, "dvb");
++    if (t && t == d) {
++        t = strchr(t, '.');
++        if (!t) {
++            LOGE("target is invalid %s.", target);
++            return -EINVAL;
++        }
++        *t = '/';
++        d +=3; /* skip "dvb" */
++        snprintf(entity->devname, sizeof(entity->devname), "/dev/dvb/adapter%s", d);
++    } else {
++        snprintf(entity->devname, sizeof(entity->devname), "/dev/%s", d);
++    }
++
++    return 0;
++}
++
++void MediaControl::dumpPadDesc(media_pad_desc *pads, const int padsCount, const char *name)
++{
++    for (int i = 0; i < padsCount; i++) {
++        LOGD("Dump %s Pad desc %d", name == nullptr? "": name, i);
++        LOGD("entity: %d", pads[i].entity);
++        LOGD("index: %d", pads[i].index);
++        LOGD("flags: %d", pads[i].flags);
++        LOGD("reserved[0]: %d", pads[i].reserved[0]);
++        LOGD("reserved[1]: %d", pads[i].reserved[1]);
++    }
++}
++
++void MediaControl::dumpLinkDesc(media_link_desc *links, const int linksCount)
++{
++    for (int i = 0; i < linksCount; i++) {
++        LOG2("Dump Link desc %d", i);
++        MediaEntity *sourceEntity = getEntityById(links[i].source.entity);
++        MediaEntity *sinkEntity = getEntityById(links[i].sink.entity);
++
++        dumpPadDesc(&links[i].source, 1, sourceEntity->info.name);
++        dumpPadDesc(&links[i].sink, 1, sinkEntity->info.name);
++        LOGD("flags: %d", links[i].flags);
++        LOGD("reserved[0]: %d", links[i].reserved[0]);
++        LOGD("reserved[1]: %d", links[i].reserved[1]);
++    }
++}
++
++int MediaControl::enumLinks(int fd)
++{
++    int ret = 0;
++    LOG1("@%s", __func__);
++
++    SysCall *sc = SysCall::getInstance();
++
++    for (auto &entity : mEntities) {
++        media_links_enum links;
++        uint32_t i;
++
++        links.entity = entity.info.id;
++        links.pads = new media_pad_desc[entity.info.pads];
++        links.links = new media_link_desc[entity.info.links];
++
++        if (sc->ioctl(fd, MEDIA_IOC_ENUM_LINKS, &links) < 0) {
++            ret = -errno;
++            LOG2("%s: Unable to enumerate pads and links (%s).", __func__, strerror(errno));
++            delete [] links.pads;
++            delete [] links.links;
++            return ret;
++        }
++
++        if (Log::isDumpMediaInfo()) {
++            LOG2("entity %d", links.entity);
++            dumpPadDesc(links.pads, entity.info.pads);
++            dumpLinkDesc(links.links, entity.info.links);
++        }
++
++        for (i = 0; i < entity.info.pads; ++i) {
++            entity.pads[i].entity = getEntityById(entity.info.id);
++            entity.pads[i].index = links.pads[i].index;
++            entity.pads[i].flags = links.pads[i].flags;
++        }
++
++        for (i = 0; i < entity.info.links; ++i) {
++            media_link_desc *link = &links.links[i];
++            MediaLink *fwdlink;
++            MediaLink *backlink;
++            MediaEntity *source;
++            MediaEntity *sink;
++
++            source = getEntityById(link->source.entity);
++            sink = getEntityById(link->sink.entity);
++
++            if (source == nullptr || sink == nullptr) {
++                LOG2("WARNING entity %u link %u src %u/%u to %u/%u is invalid!",
++                        entity.info.id, i, link->source.entity,
++                        link->source.index,
++                        link->sink.entity,
++                        link->sink.index);
++                ret = -EINVAL;
++            } else {
++                fwdlink = entityAddLink(source);
++                if (fwdlink) {
++                    fwdlink->source = &source->pads[link->source.index];
++                    fwdlink->sink = &sink->pads[link->sink.index];
++                    fwdlink->flags = link->flags;
++                }
++
++                backlink = entityAddLink(sink);
++                if (backlink) {
++                    backlink->source = &source->pads[link->source.index];
++                    backlink->sink = &sink->pads[link->sink.index];
++                    backlink->flags = link->flags;
++                }
++
++                if (fwdlink)
++                    fwdlink->twin = backlink;
++                if (backlink)
++                    backlink->twin = fwdlink;
++            }
++        }
++
++        delete [] links.pads;
++        delete [] links.links;
++    }
++
++    return ret;
++}
++
++MediaLink *MediaControl::entityAddLink(MediaEntity *entity)
++{
++    if (entity->numLinks >= entity->maxLinks) {
++        uint32_t maxLinks = entity->maxLinks * 2;
++        MediaLink* links = new MediaLink[maxLinks];
++
++        MEMCPY_S(links, sizeof(MediaLink) * maxLinks, entity->links,
++                 sizeof(MediaLink) * entity->maxLinks);
++        delete [] entity->links;
++
++        for (uint32_t i = 0; i < entity->numLinks; ++i) {
++            links[i].twin->twin = &links[i];
++        }
++
++        entity->maxLinks = maxLinks;
++        entity->links = links;
++    }
++
++    return &entity->links[entity->numLinks++];
++}
++
++MediaEntity *MediaControl::getEntityById(uint32_t id)
++{
++    bool next = id & MEDIA_ENT_ID_FLAG_NEXT;
++
++    id &= ~MEDIA_ENT_ID_FLAG_NEXT;
++
++    for (uint32_t i = 0; i < mEntities.size(); i++) {
++        if ((mEntities[i].info.id == id && !next) ||
++                (mEntities[0].info.id > id && next)) {
++            return &mEntities[i];
++        }
++
++    }
++
++    return nullptr;
++}
++
++const char *MediaControl::entitySubtype2String(unsigned type)
++{
++    static const char *nodeTypes[] = {
++        "Unknown",
++        "V4L",
++        "FB",
++        "ALSA",
++        "DVB",
++    };
++    static const char *subdevTypes[] = {
++        "Unknown",
++        "Sensor",
++        "Flash",
++        "Lens",
++    };
++
++    uint32_t subtype = type & MEDIA_ENT_SUBTYPE_MASK;
++
++    switch (type & MEDIA_ENT_TYPE_MASK) {
++    case MEDIA_ENT_T_DEVNODE:
++        if (subtype >= ARRAY_SIZE(nodeTypes))
++            subtype = 0;
++        return nodeTypes[subtype];
++
++    case MEDIA_ENT_T_V4L2_SUBDEV:
++        if (subtype >= ARRAY_SIZE(subdevTypes))
++            subtype = 0;
++        return subdevTypes[subtype];
++    default:
++        return nodeTypes[0];
++    }
++}
++
++const char *MediaControl::padType2String(unsigned flag)
++{
++    static const struct {
++        __u32 flag;
++        const char *name;
++    } flags[] = {
++        { MEDIA_PAD_FL_SINK, "Sink" },
++        { MEDIA_PAD_FL_SOURCE, "Source" },
++    };
++
++    uint32_t i;
++
++    for (i = 0; i < ARRAY_SIZE(flags); i++) {
++        if (flags[i].flag & flag)
++            return flags[i].name;
++    }
++
++    return "Unknown";
++}
++
++int MediaControl::setMediaMcCtl(int cameraId, vector <McCtl> ctls)
++{
++    for (auto &ctl : ctls) {
++        MediaEntity *entity = getEntityById(ctl.entity);
++        V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
++        int ret = subDev->SetControl(ctl.ctlCmd, ctl.ctlValue);
++        LOG2("set Ctl %s [%d] cmd %s [0x%08x] value %d", ctl.entityName.c_str(), ctl.entity,
++                ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
++        CheckError(ret != OK, ret, "set Ctl %s [%d] cmd %s [0x%08x] value %d failed.",
++                ctl.entityName.c_str(), ctl.entity, ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
++    }
++    return 0;
++}
++
++int MediaControl::setMediaMcLink(vector <McLink> links)
++{
++    for (auto &link : links) {
++        LOG2("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d.",
++              link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
++              link.sinkEntity, link.sinkPad, link.enable);
++        int ret = setupLink(link.srcEntity, link.srcPad, link.sinkEntity, link.sinkPad, link.enable);
++        if (ret < 0) {
++            LOGE("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d failed.",
++                link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
++                link.sinkEntity, link.sinkPad, link.enable);
++            return ret;
++        }
++    }
++    return 0;
++}
++
++int MediaControl::setFormat(int cameraId, const McFormat *format, int targetWidth, int targetHeight, int field)
++{
++    PERF_CAMERA_ATRACE();
++    int ret;
++    v4l2_mbus_framefmt mbusfmt;
++    MediaEntity *entity = getEntityById(format->entity);
++    if (entity == nullptr) {
++        LOGE("@%s, get entity fail for calling getEntityById", __func__);
++        return BAD_VALUE;
++    }
++
++    MediaPad *pad = &entity->pads[format->pad];
++    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
++    LOG1("@%s, targetWidth:%d, targetHeight:%d", __func__, targetWidth, targetHeight);
++    LOG2("SENSORCTRLINFO: width=%d", targetWidth);
++    LOG2("SENSORCTRLINFO: height=%d", targetHeight);
++    LOG2("SENSORCTRLINFO: code=0x%x", format->pixelCode);
++
++    CLEAR(mbusfmt);
++    if (format->width != 0 && format->height != 0) {
++        mbusfmt.width  = format->width;
++        mbusfmt.height = format->height;
++    } else if (format->type == RESOLUTION_TARGET) {
++        mbusfmt.width  = targetWidth;
++        mbusfmt.height = targetHeight;
++    }
++    mbusfmt.field = field;
++
++    if (format->pixelCode) {
++        mbusfmt.code = format->pixelCode;
++    } else {
++        mbusfmt.code = CameraUtils::getMBusFormat(cameraId, PlatformData::getISysFormat(cameraId));
++    }
++    LOG2("set format %s [%d:%d] [%dx%d] [%dx%d] %s ", format->entityName.c_str(),
++            format->entity, format->pad, mbusfmt.width, mbusfmt.height,
++            targetWidth, targetHeight, CameraUtils::pixelCode2String(mbusfmt.code));
++
++    struct v4l2_subdev_format fmt = {};
++    fmt.pad = format->pad;
++    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
++    fmt.format = mbusfmt;
++    ret = subDev->SetFormat(fmt);
++    CheckError(ret < 0, BAD_VALUE, "set format %s [%d:%d] [%dx%d] %s failed.",
++            format->entityName.c_str(), format->entity, format->pad, format->width, format->height,
++            CameraUtils::pixelCode2String(format->pixelCode));
++
++    mbusfmt = fmt.format;
++
++    /* If the pad is an output pad, automatically set the same format on
++     * the remote subdev input pads, if any.
++     */
++    if (pad->flags & MEDIA_PAD_FL_SOURCE) {
++        for (unsigned int i = 0; i < pad->entity->numLinks; ++i) {
++            MediaLink *link = &pad->entity->links[i];
++
++            if (!(link->flags & MEDIA_LNK_FL_ENABLED))
++                continue;
++
++            if (link->source == pad && link->sink->entity->info.type == MEDIA_ENT_T_V4L2_SUBDEV) {
++                auto subDev = V4l2DeviceFactory::getSubDev(cameraId, link->sink->entity->devname);
++
++                struct v4l2_subdev_format tmt = {};
++                tmt.format = mbusfmt;
++                tmt.pad = link->sink->index;
++                tmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
++                subDev->SetFormat(tmt);
++            }
++        }
++    }
++
++    return 0;
++}
++
++int MediaControl::setSelection(int cameraId,
++        const McFormat *format, int targetWidth, int targetHeight)
++{
++    PERF_CAMERA_ATRACE();
++    int ret = OK;
++
++    MediaEntity *entity = getEntityById(format->entity);
++    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
++    LOG1("@%s, cameraId:%d, targetWidth:%d, targetHeight:%d", __func__, cameraId, targetWidth, targetHeight);
++
++    if (format->top != -1 && format->left != -1 && format->width != 0 && format->height != 0) {
++        struct v4l2_subdev_selection selection = {};
++        selection.pad = format->pad;
++        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
++        selection.target = format->selCmd;
++        selection.flags = 0;
++        selection.r.top = format->top;
++        selection.r.left = format->left;
++        selection.r.width = format->width;
++        selection.r.height = format->height;
++
++        ret = subDev->SetSelection(selection);
++    } else if (format->selCmd == V4L2_SEL_TGT_CROP || format->selCmd == V4L2_SEL_TGT_COMPOSE) {
++        LOG2("@%s, line:%d, targetWidth:%d, targetHeight:%d", __func__, __LINE__, targetWidth, targetHeight);
++
++        struct v4l2_subdev_selection selection = {};
++        selection.pad = format->pad;
++        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
++        selection.target = format->selCmd;
++        selection.flags = 0;
++        selection.r.top = 0;
++        selection.r.left = 0;
++        selection.r.width = targetWidth;
++        selection.r.height = targetHeight;
++
++        ret = subDev->SetSelection(selection);
++    } else {
++        ret = BAD_VALUE;
++    }
++
++    CheckError(ret < 0, BAD_VALUE, "set selection %s [%d:%d] selCmd: %d [%d, %d] [%dx%d] failed",
++            format->entityName.c_str(), format->entity, format->pad, format->selCmd,
++            format->top, format->left, format->width, format->height);
++
++    return OK;
++}
++
++int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field)
++{
++    LOG1("%s, cameraId:%d", __func__, cameraId);
++    /* Setup controls in format Configuration */
++    int ret = setMediaMcCtl(cameraId, mc->ctls);
++    CheckError(ret != OK, ret, "set MediaCtlConf McCtl failed: ret=%d", ret);
++
++    /* Set format & selection in format Configuration */
++    for (auto &fmt : mc->formats) {
++        if (fmt.formatType == FC_FORMAT) {
++            setFormat(cameraId, &fmt, width, height, field);
++        } else if (fmt.formatType == FC_SELECTION) {
++            setSelection(cameraId, &fmt, width, height);
++        }
++    }
++
++    /* Set link in format Configuration */
++    ret = setMediaMcLink(mc->links);
++    CheckError(ret != OK, ret, "set MediaCtlConf McLink failed: ret = %d", ret);
++
++    dumpEntityTopology();
++
++    return OK;
++}
++
++int MediaControl::getVCMI2CAddr(const char* vcmName, string* vcmI2CAddr) {
++    CheckError(!vcmI2CAddr, BAD_VALUE, "vcmI2CAddr is nullptr");
++    CheckError(!vcmName, BAD_VALUE, "vcmName is nullptr");
++
++    for (auto &entity : mEntities) {
++        if (strncmp(entity.info.name, vcmName, strlen(vcmName)) == 0) {
++            *vcmI2CAddr = entity.info.name;
++            LOG2("%s, vcm addr name %s", __func__, entity.info.name);
++            return OK;
++        }
++    }
++
++    return NAME_NOT_FOUND;
++}
++
++void MediaControl::mediaCtlClear(int cameraId, MediaCtlConf *mc)
++{
++    LOG1("%s, cameraId:%d", __func__, cameraId);
++
++}
++
++// This function must be called after enumEntities().
++int MediaControl::getLensName(string *lensName)
++{
++    LOG1("@%s", __func__);
++    CheckError(!lensName, UNKNOWN_ERROR, "lensName is nullptr");
++
++    for (auto &entity : mEntities) {
++        if (entity.info.type == MEDIA_ENT_T_V4L2_SUBDEV_LENS) {
++           *lensName = entity.info.name;
++           return OK;
++        }
++    }
++
++    return UNKNOWN_ERROR;
++}
++
++// This function must be called after enumEntities().
++bool MediaControl::checkAvailableSensor(const std::string &sensorEntityName,
++                                        const std::string &sinkEntityName)
++{
++    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__,
++         sensorEntityName.c_str(), sinkEntityName.c_str());
++
++    std::string sensorEntityNameTmp = sensorEntityName;
++    sensorEntityNameTmp.append(" ");
++    size_t nameLen = sensorEntityNameTmp.length();
++    for (auto &entity : mEntities) {
++        int linksCount = entity.info.links;
++        MediaLink *links = entity.links;
++        for (int i = 0; i < linksCount; i++) {
++            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
++                char *entityName = entity.info.name;
++                if (strncmp(entityName, sensorEntityNameTmp.c_str(), nameLen) == 0) {
++                    return true;
++                }
++            }
++        }
++    }
++
++    return false;
++}
++
++// This function must be called after enumEntities().
++int MediaControl::getI2CBusAddress(const string &sensorEntityName, const string &sinkEntityName, string *i2cBus)
++{
++    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__, sensorEntityName.c_str(), sinkEntityName.c_str());
++    CheckError(!i2cBus, UNKNOWN_ERROR, "i2cBus is nullptr");
++
++    for (auto &entity : mEntities) {
++        int linksCount = entity.info.links;
++        MediaLink *links = entity.links;
++        char *entityName = nullptr;
++        size_t sensorEntityNameLen = sensorEntityName.length();
++        for (int i = 0; i < linksCount; i++) {
++            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
++                entityName = entity.info.name;
++                break;
++            }
++        }
++
++        // entityName example: "imx319 10-0010", sensorEntityName example: "imx319"
++        if (entityName && (strlen(entityName) > (sensorEntityNameLen + 1))) {
++            *i2cBus = entityName + sensorEntityNameLen + 1;
++            LOG2("i2cBus is %s", i2cBus->c_str());
++            return OK;
++        }
++    }
++
++    return UNKNOWN_ERROR;
++}
++
++void MediaControl::dumpTopologyDot()
++{
++    printf("digraph board {\n");
++    printf("\trankdir=TB\n");
++
++    for (auto &entity : mEntities) {
++        const media_entity_desc *info = &entity.info;
++        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
++        uint32_t numLinks = entity.numLinks;
++        uint32_t npads;
++        UNUSED(npads);
++
++        switch (info->type & MEDIA_ENT_TYPE_MASK) {
++        case MEDIA_ENT_T_DEVNODE:
++            // Although printf actually can print NULL pointer, but make check
++            // to make KW happy.
++            if (devname)
++                printf("\tn%08x [label=\"%s\\n%s\", shape=box, style=filled, "
++                    "fillcolor=yellow]\n",
++                    info->id, info->name, devname);
++            break;
++
++        case MEDIA_ENT_T_V4L2_SUBDEV:
++            printf("\tn%08x [label=\"{{", info->id);
++
++            for (int i = 0, npads = 0; i < info->pads; ++i) {
++                MediaPad *pad = entity.pads + i;
++
++                if (!(pad->flags & MEDIA_PAD_FL_SINK))
++                    continue;
++
++                printf("%s<port%d> %d", npads ? " | " : "", i, i);
++                npads++;
++            }
++
++            printf("} | %s", info->name);
++            if (devname)
++                printf("\\n%s", devname);
++            printf(" | {");
++
++            for (int i = 0, npads = 0; i < info->pads; ++i) {
++                MediaPad *pad = entity.pads + i;
++
++                if (!(pad->flags & MEDIA_PAD_FL_SOURCE))
++                    continue;
++
++                printf("%s<port%d> %d", npads ? " | " : "", i, i);
++                npads++;
++            }
++
++            printf("}}\", shape=Mrecord, style=filled, fillcolor=green]\n");
++            break;
++
++        default:
++            continue;
++        }
++
++        for (uint32_t i = 0; i < numLinks; i++) {
++             MediaLink *link = entity.links + i;
++             MediaPad *source = link->source;
++             MediaPad *sink = link->sink;
++
++            /*Only print the forward links of the entity*/
++            if (source->entity != &entity)
++                continue;
++
++            printf("\tn%08x", source->entity->info.id);
++            if ((source->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
++                printf(":port%u", source->index);
++            printf(" -> ");
++            printf("n%08x", sink->entity->info.id);
++            if ((sink->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
++                printf(":port%u", sink->index);
++
++            if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
++                printf(" [style=bold]");
++            else if (!(link->flags & MEDIA_LNK_FL_ENABLED))
++                printf(" [style=dashed]");
++            printf("\n");
++        }
++    }
++
++    printf("}\n");
++}
++
++void MediaControl::dumpTopologyText()
++{
++    static const struct {
++        __u32 flag;
++        const char *name;
++    } link_flags[] = {
++        { MEDIA_LNK_FL_ENABLED, "ENABLED" },
++        { MEDIA_LNK_FL_IMMUTABLE, "IMMUTABLE" },
++        { MEDIA_LNK_FL_DYNAMIC, "DYNAMIC" },
++    };
++
++    printf("Device topology\n");
++
++    for (auto &entity : mEntities) {
++        const media_entity_desc *info = &entity.info;
++        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
++        uint32_t numLinks = entity.numLinks;
++
++        uint32_t padding = printf("- entity %u: ", info->id);
++        printf("%s (%u pad%s, %u link%s)\n", info->name,
++            info->pads, info->pads > 1 ? "s" : "",
++            numLinks, numLinks > 1 ? "s" : "");
++        printf("%*ctype %s subtype %s flags %x\n", padding, ' ',
++            padType2String(info->type),
++            entitySubtype2String(info->type),
++            info->flags);
++        if (devname)
++            printf("%*cdevice node name %s\n", padding, ' ', devname);
++
++        for (int i = 0; i < info->pads; i++) {
++            MediaPad *pad = entity.pads + i;
++
++            printf("\tpad%d: %s\n", i, padType2String(pad->flags));
++
++            /*
++             *if ((info->type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
++             *v4l2_subdev_print_format(entity, i, V4L2_SUBDEV_FORMAT_ACTIVE);
++             */
++            for (uint32_t j = 0; j < numLinks; j++) {
++                MediaLink *link = entity.links + j;
++                MediaPad *source = link->source;
++                MediaPad *sink = link->sink;
++                bool first = true;
++
++                if (source->entity == &entity && source->index == j)
++                    printf("\t\t-> \"%s\":%u [", sink->entity->info.name,
++                       sink->index);
++                else if (sink->entity == &entity && sink->index == j)
++                    printf("\t\t<- \"%s\":%u [", source->entity->info.name,
++                       source->index);
++                else
++                    continue;
++
++                for (uint32_t k = 0; k < ARRAY_SIZE(link_flags); k++) {
++                    if (!(link->flags & link_flags[k].flag))
++                        continue;
++                    if (!first)
++                        printf(",");
++                    printf("%s", link_flags[k].name);
++                    first = false;
++                }
++
++                printf("]\n");
++            }
++        }
++        printf("\n");
++    }
++}
++
++void MediaControl::dumpEntityTopology(bool dot)
++{
++    if (Log::isDumpMediaTopo()) {
++        if (dot)
++            dumpTopologyDot();
++        else
++            dumpTopologyText();
++    }
++}
++} // namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.h b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
+new file mode 100644
+index 000000000000..0e3d284d0a83
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
+@@ -0,0 +1,305 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++#include <string>
++
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <string.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <errno.h>
++#include <linux/v4l2-subdev.h>
++#include <linux/media.h>
++#include <expat.h>
++
++#include <v4l2_device.h>
++
++#include "CameraTypes.h"
++#include "iutils/Thread.h"
++
++#include "NodeInfo.h"
++
++using namespace std;
++namespace icamera {
++
++struct MediaEntity;
++struct MediaPad;
++struct MediaLink;
++
++#define MEDIA_CTL_DEV_NAME "/dev/media"
++#define MEDIA_DRIVER_NAME "intel-ipu"
++#define MEDIA_DEVICE_MAX_NUM 256
++
++enum {
++    FC_FORMAT = 0,
++    FC_SELECTION = 1,
++};
++
++enum ResolutionType {
++    RESOLUTION_MAX = 0,
++    RESOLUTION_COMPOSE,
++    RESOLUTION_CROP,
++    RESOLUTION_TARGET,
++
++};
++
++struct McFormat {
++    int entity;
++    int pad;
++    int stream;
++    int formatType;
++    int selCmd;
++    int top;
++    int left;
++    int width;
++    int height;
++    enum ResolutionType type;
++    std::string entityName;
++    unsigned int pixelCode;
++    McFormat() {
++        entity = 0;
++        pad = 0;
++        stream = 0;
++        formatType = 0;
++        selCmd = 0;
++        top = 0;
++        left = 0;
++        width = 0;
++        height = 0;
++        type = RESOLUTION_MAX;
++        pixelCode = 0;}
++};
++
++struct McOutput {
++    Port port;
++    unsigned int v4l2Format;
++    int width;
++    int height;
++    McOutput() { port = INVALID_PORT; v4l2Format = 0; width = 0; height = 0; }
++};
++
++struct McCtl {
++    int entity;
++    int ctlCmd;
++    int ctlValue;
++    std::string ctlName;
++    std::string entityName;
++    McCtl() { entity = 0; ctlCmd = 0; ctlValue= 0; }
++};
++
++struct McLink {
++    int srcEntity;
++    int srcPad;
++    int sinkEntity;
++    int sinkPad;
++    bool enable;
++    std::string srcEntityName;
++    std::string sinkEntityName;
++    McLink() { srcEntity = 0; srcPad = 0; sinkEntity = 0; sinkPad = 0; enable = false; }
++};
++
++struct McRoute {
++    int entity;
++    uint32_t sinkPad;
++    uint32_t sinkStream;
++    uint32_t srcPad;
++    uint32_t srcStream;
++    uint32_t flag;
++    std::string entityName;
++    McRoute() { entity = 0; sinkPad = 0; srcPad = 0; sinkStream = 0; srcStream = 0; flag = 0; entityName.clear(); }
++};
++
++struct McVideoNode {
++    std::string name;
++    VideoNodeType videoNodeType;
++    McVideoNode() { videoNodeType = VIDEO_GENERIC; }
++};
++
++struct MediaCtlConf {
++    std::vector <McCtl> ctls;
++    std::vector <McLink> links;
++    std::vector <McRoute> routes;
++    std::vector <McFormat> formats;
++    std::vector <McOutput> outputs;
++    std::vector <McVideoNode> videoNodes;
++    int mcId;
++    int outputWidth;
++    int outputHeight;
++    std::vector <ConfigMode> configMode;
++    int format;
++    /*
++     * The outputWidth or outputHeight is 0 if there isn't this setting
++     * in MediaCtlConf. It means the isys output size is dynamic, and
++     * we don't use stream size to select MC.
++     */
++    MediaCtlConf() {
++        mcId = -1;
++        outputWidth = 0;
++        outputHeight = 0;
++        format = -1;
++    }
++};
++
++/**
++ * \class MediaController
++ *
++ * This class is used for discovering and configuring the internal topology
++ * of a media device. Devices are modelled as an oriented graph of building
++ * blocks called media entities. The media entities are connected to each other
++ * through pads.
++ *
++ * Each media entity corresponds to a V4L2 subdevice. This class is also used
++ * for configuring the V4L2 subdevices.
++ */
++
++class MediaControl {
++public:
++    /**
++     * \brief Get the singleton instance of MediaControl
++     */
++    static MediaControl* getInstance();
++
++    /**
++     * \brief Release the singleton instance of MediaControl.
++     */
++    static void releaseInstance();
++
++    /**
++     * \brief Enum entities and link, and reset all links
++     *
++     * \return 0 if succeed, other value indicates failed
++     */
++    int initEntities();
++
++    /**
++     * \brief Free all entities and links memory
++     */
++    void clearEntities();
++
++    /**
++     * \brief Get the entity by name
++     *
++     * \return entity id if succeed or -1 if error
++     */
++    int getEntityIdByName(const char *name);
++
++    /**
++     * \brief Get VCM I2C bus address
++     *
++     * \return 0 if succeed, other value indicates failed
++     */
++    int getVCMI2CAddr(const char* vcmName, std::string* vcmI2CAddr);
++
++    /**
++     * \brief Set up media controller pipe
++     *
++     * \param cameraId: the current camera id
++     * \param mc: the MediaCtlConf got from platform data
++     * \param sensorName: the sensor name get from platform data
++     * \param width: The width of the request frame
++     * \param height: The height of the request frame
++     * \param format: The format of the request frame
++     * \param field: The field of the request frame
++     *
++     * \return OK if succeed, other value indicates failed
++     */
++    int mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field);
++
++    /**
++     * \brief Clear media controller pipe
++     *
++     *
++     * \param cameraId: the current camera id
++     * \param mc: the MediaCtlConf got from platform data
++     */
++    void mediaCtlClear(int cameraId, MediaCtlConf *mc);
++
++    int resetAllLinks();
++
++    int getLensName(string *lensName);
++    bool checkAvailableSensor(const std::string &sensorEntityName,
++                              const std::string &sinkEntityName);
++    /**
++     * Getting I2C bus address by the name of sensor entity and the name of sensor's sink entity.
++     *
++     * \sensorEntityName: the name of sensor entity.
++     * \sinkEntityName: the name of sensor's sink entity.
++     * \i2cBus: I2C bus address.
++     * \return OK if succeed, other value indicates failed
++     */
++    int getI2CBusAddress(const std::string &sensorEntityName, const std::string &sinkEntityName,
++                         std::string *i2cBus);
++private:
++    MediaControl& operator=(const MediaControl&);
++    MediaControl(const char *devName);
++    ~MediaControl();
++
++    static MediaControl* getMediaControlInstance();
++    int openDevice();
++    void closeDevice(int fd);
++
++    //enum MediaControl info.
++    int enumInfo();
++    int enumLinks(int fd);
++    int enumEntities(int fd, media_device_info& devInfo);
++
++    //get entity info.
++    int getDevnameFromSysfs(MediaEntity *entity);
++    MediaEntity *getEntityById(uint32_t id);
++    MediaEntity *getEntityByName(const char *name);
++
++    //set up entity link.
++
++    MediaLink *entityAddLink(MediaEntity *entity);
++    int setupLink(uint32_t srcEntity, uint32_t srcPad, uint32_t sinkEntity, uint32_t sinkPad, bool enable);
++    int setupLink(MediaPad *source, MediaPad *sink, uint32_t flags);
++
++    //set up MediaCtlConf info.
++    int setMediaMcCtl(int cameraId, std::vector <McCtl> ctls);
++    int setMediaMcLink(std::vector <McLink> links);
++    int setFormat(int cameraId, const McFormat *format,
++            int targetWidth, int targetHeight, int field);
++    int setSelection(int cameraId, const McFormat *format,
++            int targetWidth, int targetHeight);
++
++    /* Dump functions */
++    void dumpInfo(media_device_info& devInfo);
++    void dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo);
++    void dumpPadDesc(media_pad_desc *pads, const int padsCount = 1, const char *name = nullptr);
++    void dumpLinkDesc(media_link_desc *links, const int linksCount = 1);
++    const char *entitySubtype2String(unsigned type);
++    const char *padType2String(unsigned flag);
++    void dumpEntityTopology(bool dot = true);
++    void dumpTopologyDot();
++    void dumpTopologyText();
++
++private:
++    std::string mDevName;
++    std::vector <MediaEntity> mEntities;
++
++private:
++    static MediaControl *sInstance;
++    static Mutex sLock;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
+new file mode 100644
+index 000000000000..2709861a757d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "src/v4l2/NodeInfo.h"
++
++const VideoNodeInfo gVideoNodeInfos[] = {
++    { VIDEO_GENERIC,             "VIDEO_GENERIC",              "Generic" },
++    { VIDEO_GENERIC_MEDIUM_EXPO, "VIDEO_GENERIC_MEDIUM_EXPO",  "GenericMediumExpo" },
++    { VIDEO_GENERIC_SHORT_EXPO,  "VIDEO_GENERIC_SHORT_EXPO",   "GenericShortExpo" },
++
++    { VIDEO_PIXEL_ARRAY,         "VIDEO_PIXEL_ARRAY",          "PixelArray" },
++    { VIDEO_PIXEL_BINNER,        "VIDEO_PIXEL_BINNER",         "PixelBinner" },
++    { VIDEO_PIXEL_SCALER,        "VIDEO_PIXEL_SCALER",         "PixelScaler" },
++
++    { VIDEO_ISYS_RECEIVER,       "VIDEO_ISYS_RECEIVER",        "ISysReceiver" },
++    { VIDEO_ISYS_RECEIVER_BACKEND,  "VIDEO_ISYS_RECEIVER_BACKEND",  "CsiBE"},
++};
++
++const char* GetNodeName(VideoNodeType nodeType)
++{
++    int size = ARRAY_SIZE(gVideoNodeInfos);
++    for (int i = 0; i < size; i++) {
++        if (gVideoNodeInfos[i].type == nodeType) {
++            return gVideoNodeInfos[i].shortName;
++        }
++    }
++    return "InvalidNode";
++}
++
++VideoNodeType GetNodeType(const char* nodeName)
++{
++    int size = ARRAY_SIZE(gVideoNodeInfos);
++    for (int i = 0; i < size; i++) {
++        if (strcmp(gVideoNodeInfos[i].fullName, nodeName) == 0) {
++            return gVideoNodeInfos[i].type;
++        }
++    }
++
++    return VIDEO_GENERIC;
++}
+diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
+new file mode 100644
+index 000000000000..c5905603a4c5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "iutils/Utils.h"
++
++enum VideoNodeType {
++    // video node device
++    VIDEO_GENERIC,
++    VIDEO_GENERIC_MEDIUM_EXPO,
++    VIDEO_GENERIC_SHORT_EXPO,
++
++    // sensor subdevice
++    VIDEO_PIXEL_ARRAY,
++    VIDEO_PIXEL_BINNER,
++    VIDEO_PIXEL_SCALER,
++
++    // ISP subdevice
++    VIDEO_ISYS_RECEIVER,
++    VIDEO_ISYS_RECEIVER_BACKEND,
++};
++
++struct VideoNodeInfo {
++    VideoNodeType type;
++    const char* fullName;
++    const char* shortName;
++};
++
++enum EncodeBufferType {
++    ENCODE_ISA_CONFIG  = 0,
++    ENCODE_STATS = 1,
++};
++
++extern const VideoNodeInfo gVideoNodeInfos[];
++extern const char* GetNodeName(VideoNodeType nodeType);
++extern VideoNodeType GetNodeType(const char* nodeName);
+diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
+new file mode 100644
+index 000000000000..2f82704d143b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
+@@ -0,0 +1,212 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "SysCall"
++
++#include "iutils/CameraLog.h"
++#include "SysCall.h"
++
++namespace icamera {
++
++static int sCreatedCount = 0;
++bool SysCall::sIsInitialized = false;
++SysCall *SysCall::sInstance = nullptr;
++//Guard for singleton instance creation
++Mutex SysCall::sLock;
++
++/*static*/ SysCall*
++SysCall::getInstance()
++{
++    AutoMutex lock(sLock);
++    if (!sIsInitialized) {
++        //Use real sys call as default
++        sInstance = new SysCall();
++        sIsInitialized = true;
++    }
++    return sInstance;
++}
++
++void SysCall::updateInstance(SysCall* newSysCall)
++{
++    LOG1("%s", __func__);
++    AutoMutex lock(sLock);
++    if (sIsInitialized) {
++        sIsInitialized = false;
++    }
++    sInstance = newSysCall;
++    if (newSysCall != nullptr)
++        sIsInitialized = true;
++}
++
++SysCall::SysCall()
++{
++    sCreatedCount++;
++    LOG1("Syscall was created %d time", sCreatedCount);
++}
++
++SysCall::~SysCall()
++{
++    sCreatedCount--;
++    LOG1("Syscall was destructed %d time", sCreatedCount);
++}
++
++int SysCall::open(const char *pathname, int flags)
++{
++    return ::open(pathname, flags);
++}
++
++int SysCall::close(int fd)
++{
++    return ::close(fd);
++}
++
++void *SysCall::mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off)
++{
++    return ::mmap(addr, len, prot, flag, filedes, off);
++}
++
++int SysCall::munmap(void *addr, size_t len)
++{
++    return ::munmap(addr, len);
++}
++
++int SysCall::ioctl(int fd, int request, struct media_device_info *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct media_link_desc *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct media_links_enum *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct media_links_desc *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct media_entity_desc *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_capability *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, v4l2_fmtdesc *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, enum v4l2_buf_type *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_format *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_requestbuffers *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_buffers *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_buffer *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_subdev_format *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_subdev_stream *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++int SysCall::ioctl(int fd, int request, struct v4l2_streamon_info *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_ext_controls *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_control *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_queryctrl *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_subdev_selection *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_subdev_routing *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_querymenu *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_event_subscription *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_event *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, struct v4l2_exportbuffer *arg)
++{
++    return ioctl(fd, request, (void *)arg);
++}
++
++int SysCall::ioctl(int fd, int request, void *arg)
++{
++    int ret = 0;
++    do {
++        ret = ::ioctl(fd, request, arg);
++    } while (-1 == ret && EINTR == errno);
++
++    return ret;
++}
++
++int SysCall::poll(struct pollfd *pfd, nfds_t nfds, int timeout)
++{
++    int ret = 0;
++    do {
++        ret = ::poll(pfd, nfds, timeout);
++    } while (-1 == ret && EINTR == errno);
++
++    return ret;
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.h b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
+new file mode 100644
+index 000000000000..4ef9c058455d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
+@@ -0,0 +1,87 @@
++/*
++ * Copyright (C) 2015-2018 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <errno.h>
++#include <poll.h>
++#include <unistd.h>
++#include <sys/ioctl.h>
++#include <sys/mman.h>
++#include <linux/media.h>
++#include <linux/videodev2.h>
++#include <linux/v4l2-subdev.h>
++
++#include "iutils/Thread.h"
++
++namespace icamera {
++
++class SysCall {
++protected:
++    SysCall();
++    virtual ~SysCall();
++
++public:
++    virtual int open(const char *pathname, int flags);
++    virtual int close(int fd);
++    virtual void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
++    virtual int munmap(void *addr, size_t len);
++
++    virtual int ioctl(int fd, int request, struct media_device_info *arg);
++    virtual int ioctl(int fd, int request, struct media_link_desc *arg);
++    virtual int ioctl(int fd, int request, struct media_links_enum *arg);
++    virtual int ioctl(int fd, int request, struct media_links_desc *arg);
++    virtual int ioctl(int fd, int request, struct media_entity_desc *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_capability *arg);
++    virtual int ioctl(int fd, int request, v4l2_fmtdesc *arg);
++    virtual int ioctl(int fd, int request, enum v4l2_buf_type *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_format *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_requestbuffers *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_buffers *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_buffer *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_subdev_format *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_subdev_stream *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_streamon_info *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_ext_controls *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_control *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_queryctrl *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_subdev_selection *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_subdev_routing *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_querymenu *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_event_subscription *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_event *arg);
++    virtual int ioctl(int fd, int request, struct v4l2_exportbuffer *arg);
++
++    virtual int poll(struct pollfd *pfd, nfds_t nfds, int timeout);
++
++private:
++        int ioctl(int fd, int request, void *arg);
++
++public:
++    static SysCall* getInstance();
++    static void updateInstance(SysCall* newSysCall);
++private:
++    SysCall&   operator=(const SysCall&);         //Don't call me
++
++    static bool sIsInitialized;
++    static SysCall *sInstance;
++    static Mutex sLock;
++};
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
+new file mode 100644
+index 000000000000..90950d2d04c8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
+@@ -0,0 +1,126 @@
++/*
++ * Copyright (C) 2015-2020 Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "V4l2DeviceFactory"
++
++#include <fcntl.h>
++
++#include "iutils/CameraLog.h"
++
++#include "V4l2DeviceFactory.h"
++
++using namespace std;
++
++namespace icamera {
++
++map<int, V4l2DeviceFactory*> V4l2DeviceFactory::sInstances;
++Mutex V4l2DeviceFactory::sLock;
++
++V4l2DeviceFactory::V4l2DeviceFactory(int cameraId) : mCameraId(cameraId)
++{
++    LOG1("V4l2DeviceFactory created for id:%d", mCameraId);
++}
++
++V4l2DeviceFactory::~V4l2DeviceFactory()
++{
++    LOG1("V4l2DeviceFactory released for id:%d", mCameraId);
++}
++
++/**
++ * Create a static instance of V4l2DeviceFactory for cameraId.
++ * It should be called before any device is used.
++ */
++void V4l2DeviceFactory::createDeviceFactory(int cameraId)
++{
++    AutoMutex lock(sLock);
++    getInstance(cameraId);
++}
++
++/**
++ * Release the static instance of V4l2DeviceFactory for cameraId.
++ * All device related to the instance of of V4l2DeviceFactory will be release here as well
++ * After calling this function, all device could not be used anymore.
++ */
++void V4l2DeviceFactory::releaseDeviceFactory(int cameraId)
++{
++    AutoMutex lock(sLock);
++    V4l2DeviceFactory* factory = getInstance(cameraId);
++    sInstances.erase(cameraId);
++    factory->releaseSubDevices(cameraId);
++    delete factory;
++}
++
++/**
++ * Get an opened sub device
++ *
++ * The caller is supposed to get an opened sub device.
++ * If openSubDev failed, it just return non-opened instance,
++ * and using this instance to call its funtion will cause 'device not open' error,
++ *
++ * Return a not nullptr sub device pointer
++ */
++V4L2Subdevice* V4l2DeviceFactory::getSubDev(int cameraId, const string& devName)
++{
++    AutoMutex lock(sLock);
++    V4l2DeviceFactory* factory = getInstance(cameraId);
++    // If an existing sub device found, then just return it.
++
++    if (factory->mDevices.find(devName) != factory->mDevices.end()) {
++        return factory->mDevices[devName];
++    }
++    // Create a new sub device for devName, since it's not created before.
++    V4L2Subdevice* subdev = new V4L2Subdevice(devName);
++
++    // Make sure the caller always got an opened device.
++    subdev->Open(O_RDWR);
++    // Add the new allocated sub device into device map.
++    factory->mDevices[devName] = subdev;
++    return subdev;
++}
++
++/**
++ * Release all sub devices in device map
++ *
++ * It's a private function with no lock in it, must be called with lock protection.
++ *
++ * It MUST be called after all sub devices are not used anymore
++ */
++void V4l2DeviceFactory::releaseSubDevices(int  /*cameraId*/)
++{
++    for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
++        V4L2Subdevice* subdev = it->second;
++        if (subdev) {
++            subdev->Close();
++            delete subdev;
++        }
++    }
++    mDevices.clear();
++}
++
++/**
++ * Private function with no lock in it, must be called with lock protection
++ */
++V4l2DeviceFactory* V4l2DeviceFactory::getInstance(int cameraId)
++{
++    if (sInstances.find(cameraId) != sInstances.end()) {
++        return sInstances[cameraId];
++    }
++
++    sInstances[cameraId] = new V4l2DeviceFactory(cameraId);
++    return sInstances[cameraId];
++}
++
++} //namespace icamera
+diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
+new file mode 100644
+index 000000000000..115187d5fa37
+--- /dev/null
++++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
+@@ -0,0 +1,61 @@
++/*
++ * Copyright (C) 2015-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <v4l2_device.h>
++
++#include <map>
++#include <string>
++
++#include "iutils/Utils.h"
++#include "iutils/Thread.h"
++
++namespace icamera {
++
++/**
++ * Create all v4l2 devices, and provide users an opened device pointer,
++ * the users should not release any instance got from this factory,
++ * all devices will be released together by releaseDeviceFactory.
++ *
++ * Currently only sub device is supported.
++ *
++ * TODO: Next step, all v4l2 devices should be managed by this class
++ */
++class V4l2DeviceFactory {
++public:
++    static void createDeviceFactory(int cameraId);
++    static void releaseDeviceFactory(int cameraId);
++
++    static V4L2Subdevice* getSubDev(int cameraId, const std::string& devName);
++
++private:
++    V4l2DeviceFactory(int cameraId);
++    ~V4l2DeviceFactory();
++
++    static V4l2DeviceFactory* getInstance(int cameraId);
++    void releaseSubDevices(int cameraId);
++
++private:
++    static std::map<int, V4l2DeviceFactory*> sInstances;
++    //Guard for V4l2DeviceFactory public API access
++    static Mutex sLock;
++
++    int mCameraId;
++    std::map<std::string, V4L2Subdevice*> mDevices;
++};
++
++} //namespace icamera
+-- 
+2.17.1
+
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code.patch b/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code.patch
deleted file mode 100644
index 63e1bbb..0000000
--- a/media-libs/cros-camera-hal-intel-ipu6-squash/files/0001-intel-ipu6-Add-initial-code.patch
+++ /dev/null
@@ -1,185729 +0,0 @@
-From e7403c57a75579c2843d470bd69fc47648cac0c9 Mon Sep 17 00:00:00 2001
-From: Tianshu Qiu <tian.shu.qiu@intel.com>
-Date: Wed, 30 Oct 2019 10:03:39 +0800
-Subject: [PATCH] intel:ipu6: Add initial code
-
-Add initial code in src/platform2/camera/hal/intel/ipu6
-1.HAL code
-2.3a header file
-
-Change-Id: Ie8fbf5df647e72c2733a67c07d82f9d565b17d1a
-Signed-off-by: Liang Yang <liang.l.yang@intel.com>
-Signed-off-by: Tianshu Qiu <tian.shu.qiu@intel.com>
----
- camera/hal/intel/ipu6/BUILD.gn                     |   400 +
- camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp     |   142 +
- camera/hal/intel/ipu6/aal/Camera3AMetadata.h       |    50 +
- camera/hal/intel/ipu6/aal/Camera3HAL.cpp           |   282 +
- camera/hal/intel/ipu6/aal/Camera3HAL.h             |    69 +
- camera/hal/intel/ipu6/aal/Camera3HALModule.cpp     |   233 +
- camera/hal/intel/ipu6/aal/Camera3Stream.cpp        |   407 +
- camera/hal/intel/ipu6/aal/Camera3Stream.h          |   139 +
- camera/hal/intel/ipu6/aal/HALv3Interface.h         |    32 +
- camera/hal/intel/ipu6/aal/HALv3Utils.cpp           |   138 +
- camera/hal/intel/ipu6/aal/HALv3Utils.h             |    72 +
- camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp  |   304 +
- camera/hal/intel/ipu6/aal/IntelAEStateMachine.h    |   135 +
- camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp  |   442 +
- camera/hal/intel/ipu6/aal/IntelAFStateMachine.h    |   145 +
- camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp |   227 +
- camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h   |   131 +
- camera/hal/intel/ipu6/aal/MetadataConvert.cpp      |  2166 +++
- camera/hal/intel/ipu6/aal/MetadataConvert.h        |   118 +
- camera/hal/intel/ipu6/aal/PostProcessor.cpp        |   196 +
- camera/hal/intel/ipu6/aal/PostProcessor.h          |    58 +
- camera/hal/intel/ipu6/aal/RequestManager.cpp       |   561 +
- camera/hal/intel/ipu6/aal/RequestManager.h         |   103 +
- camera/hal/intel/ipu6/aal/ResultProcessor.cpp      |   462 +
- camera/hal/intel/ipu6/aal/ResultProcessor.h        |   178 +
- camera/hal/intel/ipu6/aal/chrome/HALv3Header.h     |    20 +
- camera/hal/intel/ipu6/include/api/ICamera.h        |   574 +
- camera/hal/intel/ipu6/include/api/Parameters.h     |  2559 +++
- camera/hal/intel/ipu6/include/cameranvm.h          |   112 +
- camera/hal/intel/ipu6/include/gcss/GCSSParser.h    |    64 +
- camera/hal/intel/ipu6/include/gcss/gcss.h          |   279 +
- .../hal/intel/ipu6/include/gcss/gcss_aic_utils.h   |   325 +
- .../hal/intel/ipu6/include/gcss/gcss_isp_utils.h   |   148 +
- camera/hal/intel/ipu6/include/gcss/gcss_item.h     |   267 +
- camera/hal/intel/ipu6/include/gcss/gcss_keys.h     |   139 +
- camera/hal/intel/ipu6/include/gcss/gcss_utils.h    |   637 +
- .../intel/ipu6/include/gcss/graph_query_manager.h  |   152 +
- camera/hal/intel/ipu6/include/gcss/graph_utils.h   |   448 +
- .../hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h |   409 +
- .../intel/ipu6/include/ia_cipf_css/ia_cipf_css.h   |  1009 ++
- camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h  |    81 +
- .../intel/ipu6/include/ia_imaging/ia_aec_types.h   |   143 +
- .../intel/ipu6/include/ia_imaging/ia_aic_myriad.h  |   181 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h  |   621 +
- .../ipu6/include/ia_imaging/ia_aiq_deprecated.h    |   266 +
- .../intel/ipu6/include/ia_imaging/ia_aiq_types.h   |   909 ++
- .../intel/ipu6/include/ia_imaging/ia_aiqb_encode.h |    70 +
- .../intel/ipu6/include/ia_imaging/ia_aiqb_parser.h |   123 +
- .../hal/intel/ipu6/include/ia_imaging/ia_alloc.h   |   121 +
- .../hal/intel/ipu6/include/ia_imaging/ia_bcomp.h   |    89 +
- .../intel/ipu6/include/ia_imaging/ia_bcomp_types.h |    68 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h |   545 +
- .../intel/ipu6/include/ia_imaging/ia_ccat_types.h  |   225 +
- .../intel/ipu6/include/ia_imaging/ia_cmc_parser.h  |    47 +
- .../include/ia_imaging/ia_cmc_parser_deprecated.h  |    42 +
- .../intel/ipu6/include/ia_imaging/ia_cmc_types.h   |  1468 ++
- .../ipu6/include/ia_imaging/ia_configuration.h     |    61 +
- .../intel/ipu6/include/ia_imaging/ia_coordinate.h  |   149 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h  |   133 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h  |   286 +
- .../ipu6/include/ia_imaging/ia_dvs_deprecated.h    |    96 +
- .../intel/ipu6/include/ia_imaging/ia_dvs_types.h   |   304 +
- .../intel/ipu6/include/ia_imaging/ia_emd_decoder.h |    92 +
- .../intel/ipu6/include/ia_imaging/ia_emd_types.h   |   194 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h  |   153 +
- .../ipu6/include/ia_imaging/ia_exc_deprecated.h    |   171 +
- .../intel/ipu6/include/ia_imaging/ia_intrinsics.h  |   138 +
- .../ipu6/include/ia_imaging/ia_intrinsics_types.h  |    58 +
- .../hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h |   916 ++
- .../include/ia_imaging/ia_isp_bxt_deprecated.h     |   641 +
- .../ia_imaging/ia_isp_bxt_statistics_types.h       |   192 +
- .../ipu6/include/ia_imaging/ia_isp_bxt_types.h     |   192 +
- .../intel/ipu6/include/ia_imaging/ia_isp_types.h   |    97 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h |   150 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_log.h  |    93 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h  |   146 +
- .../ipu6/include/ia_imaging/ia_ltm_deprecated.h    |   103 +
- .../intel/ipu6/include/ia_imaging/ia_ltm_types.h   |   151 +
- .../intel/ipu6/include/ia_imaging/ia_me_corner.h   |   142 +
- .../intel/ipu6/include/ia_imaging/ia_mkn_decoder.h |   138 +
- .../intel/ipu6/include/ia_imaging/ia_mkn_encoder.h |   167 +
- .../intel/ipu6/include/ia_imaging/ia_mkn_types.h   |   165 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h  |   172 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h   |    92 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h  |  1979 +++
- .../intel/ipu6/include/ia_imaging/ia_p2p_types.h   |   221 +
- .../intel/ipu6/include/ia_imaging/ia_pal_exports.h |    27 +
- .../ipu6/include/ia_imaging/ia_pal_types_isp.h     |    43 +
- .../ia_imaging/ia_pal_types_isp_ids_autogen.h      |   360 +
- .../ia_pal_types_isp_parameters_autogen.h          | 16093 +++++++++++++++++++
- .../ipu6/include/ia_imaging/ia_statistics_types.h  |   111 +
- .../hal/intel/ipu6/include/ia_imaging/ia_types.h   |   309 +
- camera/hal/intel/ipu6/include/ia_imaging/ia_view.h |   163 +
- .../intel/ipu6/include/ia_imaging/ia_view_types.h  |   220 +
- .../ipu6/include/ia_imaging/pvl_blink_detection.h  |   213 +
- .../hal/intel/ipu6/include/ia_imaging/pvl_config.h |    88 +
- .../ipu6/include/ia_imaging/pvl_eye_detection.h    |   156 +
- .../ipu6/include/ia_imaging/pvl_face_detection.h   |   270 +
- .../ipu6/include/ia_imaging/pvl_face_recognition.h |   473 +
- .../ipu6/include/ia_imaging/pvl_image_montage.h    |   229 +
- .../include/ia_imaging/pvl_landmark_detection.h    |   135 +
- .../ipu6/include/ia_imaging/pvl_mouth_detection.h  |   154 +
- .../ipu6/include/ia_imaging/pvl_object_tracking.h  |   238 +
- .../intel/ipu6/include/ia_imaging/pvl_panorama.h   |   262 +
- .../include/ia_imaging/pvl_pedestrian_detection.h  |   222 +
- .../include/ia_imaging/pvl_perspective_control.h   |   408 +
- .../ipu6/include/ia_imaging/pvl_smile_detection.h  |   242 +
- .../hal/intel/ipu6/include/ia_imaging/pvl_types.h  |   172 +
- camera/hal/intel/ipu6/include/ia_tools/css_types.h |    57 +
- camera/hal/intel/ipu6/include/ia_tools/ia_list.h   |   111 +
- camera/hal/intel/ipu6/include/linux/ipu-isys.h     |    51 +
- camera/hal/intel/ipu6/include/utils/ScopedAtrace.h |    73 +
- .../intel/ipu6/modules/algowrapper/IntelAiq.cpp    |   136 +
- .../hal/intel/ipu6/modules/algowrapper/IntelAiq.h  |    53 +
- .../intel/ipu6/modules/algowrapper/IntelCmc.cpp    |    63 +
- .../hal/intel/ipu6/modules/algowrapper/IntelCmc.h  |    37 +
- .../intel/ipu6/modules/algowrapper/IntelDvs.cpp    |   190 +
- .../hal/intel/ipu6/modules/algowrapper/IntelDvs.h  |    57 +
- .../modules/algowrapper/IntelFaceDetection.cpp     |   149 +
- .../ipu6/modules/algowrapper/IntelFaceDetection.h  |    44 +
- .../modules/algowrapper/IntelIspParamAdaptor.cpp   |   139 +
- .../modules/algowrapper/IntelIspParamAdaptor.h     |    45 +
- .../intel/ipu6/modules/algowrapper/IntelLard.cpp   |    71 +
- .../hal/intel/ipu6/modules/algowrapper/IntelLard.h |    34 +
- .../intel/ipu6/modules/algowrapper/IntelLtm.cpp    |    65 +
- .../hal/intel/ipu6/modules/algowrapper/IntelLtm.h  |    33 +
- .../intel/ipu6/modules/algowrapper/IntelMkn.cpp    |    70 +
- .../hal/intel/ipu6/modules/algowrapper/IntelMkn.h  |    36 +
- .../ipu6/modules/algowrapper/IntelPGParam.cpp      |  1266 ++
- .../intel/ipu6/modules/algowrapper/IntelPGParam.h  |   247 +
- .../intel/ipu6/modules/algowrapper/StatsTypes.h    |    46 +
- .../modules/algowrapper/graph/GraphConfigImpl.cpp  |   876 +
- .../modules/algowrapper/graph/GraphConfigImpl.h    |   185 +
- .../modules/algowrapper/graph/GraphConfigPipe.cpp  |  2035 +++
- .../modules/algowrapper/graph/GraphConfigPipe.h    |   326 +
- .../intel/ipu6/modules/ia_cipr/include/css_types.h |    61 +
- .../intel/ipu6/modules/ia_cipr/include/ia_cipr.h   |   142 +
- .../ipu6/modules/ia_cipr/include/ia_cipr_alloc.h   |   152 +
- .../ipu6/modules/ia_cipr/include/ia_cipr_memory.h  |   210 +
- .../ia_cipr/include/ia_cipr_memory_device.h        |    56 +
- .../ipu6/modules/ia_cipr/include/ia_cipr_psys.h    |   495 +
- .../intel/ipu6/modules/ia_cipr/include/ipu-psys.h  |   112 +
- .../ia_cipr/src/common/ia_cipr_memory_common.cpp   |   511 +
- .../ia_cipr/src/common/ia_cipr_memory_common.h     |    34 +
- .../ia_cipr/src/common/ia_cipr_memory_device_ops.h |    38 +
- .../ipu6/modules/ia_cipr/src/common/ia_list.cpp    |   118 +
- .../ipu6/modules/ia_cipr/src/common/ia_list.h      |   111 +
- .../modules/ia_cipr/src/linux/ia_cipr_alloc.cpp    |    99 +
- .../modules/ia_cipr/src/linux/ia_cipr_psys.cpp     |   778 +
- .../modules/ia_css/ipu6/include/assert_support.h   |   210 +
- .../modules/ia_css/ipu6/include/cpu_mem_support.h  |   239 +
- .../modules/ia_css/ipu6/include/error_support.h    |   112 +
- .../modules/ia_css/ipu6/include/frame_support.h    |    63 +
- .../ia_css/ipu6/include/ia_css_base_types.h        |    55 +
- .../ipu6/include/ia_css_isa_parameter_defs.h       |   789 +
- .../ipu6/include/ia_css_isa_parameter_defs_dep.h   |   580 +
- .../ia_css/ipu6/include/ia_css_kernel_bitmap.h     |   262 +
- .../ipu6/include/ia_css_kernel_bitmap_impl.h       |   340 +
- .../include/ia_css_kernel_bitmap_storage_class.h   |    30 +
- .../ipu6/include/ia_css_kernel_user_param_types.h  |    88 +
- .../ipu6/include/ia_css_param_storage_class.h      |    30 +
- .../ipu6/include/ia_css_program_group_data.h       |   449 +
- .../ipu6/include/ia_css_program_group_data_defs.h  |   244 +
- .../ipu6/include/ia_css_program_group_data_impl.h  |   461 +
- .../ipu6/include/ia_css_program_group_param.h      |   295 +
- .../ipu6/include/ia_css_program_group_param.sim.h  |   155 +
- .../include/ia_css_program_group_param_private.h   |    85 +
- .../include/ia_css_program_group_param_types.h     |    66 +
- .../ia_css/ipu6/include/ia_css_psys_buffer_set.h   |   290 +
- .../ipu6/include/ia_css_psys_data_storage_class.h  |    30 +
- .../ia_css/ipu6/include/ia_css_psys_data_trace.h   |   104 +
- .../include/ia_css_psys_dynamic_storage_class.h    |    30 +
- .../ipu6/include/ia_css_psys_dynamic_trace.h       |   105 +
- .../ia_css/ipu6/include/ia_css_psys_kernel_trace.h |   105 +
- .../ipu6/include/ia_css_psys_manifest_types.h      |   108 +
- .../ia_css/ipu6/include/ia_css_psys_param_trace.h  |   104 +
- .../ipu6/include/ia_css_psys_private_pg_data.h     |    53 +
- .../ia_css/ipu6/include/ia_css_psys_process.h      |   395 +
- .../ipu6/include/ia_css_psys_process.hsys.kernel.h |   159 +
- .../ipu6/include/ia_css_psys_process.hsys.user.h   |    94 +
- .../ia_css/ipu6/include/ia_css_psys_process.psys.h |    54 +
- .../ipu6/include/ia_css_psys_process_group.h       |   487 +
- .../ia_css_psys_process_group.hsys.kernel.h        |   379 +
- .../include/ia_css_psys_process_group.hsys.user.h  |   224 +
- .../ipu6/include/ia_css_psys_process_group.psys.h  |    61 +
- .../include/ia_css_psys_process_group_cmd_impl.h   |   280 +
- .../ipu6/include/ia_css_psys_process_group_impl.h  |  1846 +++
- .../ia_css/ipu6/include/ia_css_psys_process_impl.h |   694 +
- .../include/ia_css_psys_process_private_types.h    |   135 +
- .../ipu6/include/ia_css_psys_process_types.h       |    98 +
- .../include/ia_css_psys_program_group_manifest.h   |   320 +
- .../ia_css_psys_program_group_manifest.hsys.user.h |    78 +
- .../ia_css_psys_program_group_manifest.sim.h       |   131 +
- .../ia_css_psys_program_group_manifest_impl.h      |   417 +
- .../include/ia_css_psys_program_group_private.h    |   278 +
- .../ipu6/include/ia_css_psys_program_manifest.h    |   679 +
- .../ia_css_psys_program_manifest.hsys.kernel.h     |   105 +
- .../ia_css_psys_program_manifest.hsys.user.h       |    41 +
- .../include/ia_css_psys_program_manifest.sim.h     |    65 +
- .../include/ia_css_psys_program_manifest_impl.h    |   577 +
- .../ipu6/include/ia_css_psys_sim_storage_class.h   |    30 +
- .../ia_css/ipu6/include/ia_css_psys_sim_trace.h    |    97 +
- .../include/ia_css_psys_static_storage_class.h     |    30 +
- .../ia_css/ipu6/include/ia_css_psys_static_trace.h |   105 +
- .../ia_css/ipu6/include/ia_css_psys_terminal.h     |   403 +
- .../ipu6/include/ia_css_psys_terminal.hsys.user.h  |   257 +
- .../ipu6/include/ia_css_psys_terminal_impl.h       |  2053 +++
- .../ipu6/include/ia_css_psys_terminal_manifest.h   |   621 +
- .../ia_css_psys_terminal_manifest.hsys.user.h      |    40 +
- .../include/ia_css_psys_terminal_manifest.sim.h    |    50 +
- .../include/ia_css_psys_terminal_manifest_impl.h   |   745 +
- .../include/ia_css_psys_terminal_private_types.h   |   102 +
- .../ia_css/ipu6/include/ia_css_psys_transport.h    |    96 +
- .../ipu6/include/ia_css_psys_transport_dep.h       |    66 +
- .../modules/ia_css/ipu6/include/ia_css_psysapi.h   |    25 +
- .../ipu6/include/ia_css_psysapi_fw_version.h       |    35 +
- .../ia_css/ipu6/include/ia_css_psysapi_trace.h     |    80 +
- .../ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h  |   199 +
- .../modules/ia_css/ipu6/include/ia_css_rbm_impl.h  |   410 +
- .../ia_css/ipu6/include/ia_css_rbm_manifest.h      |   146 +
- .../ipu6/include/ia_css_rbm_manifest_types.h       |    96 +
- .../ia_css/ipu6/include/ia_css_rbm_storage_class.h |    38 +
- .../modules/ia_css/ipu6/include/ia_css_rbm_trace.h |    79 +
- .../modules/ia_css/ipu6/include/ia_css_terminal.h  |   187 +
- .../ipu6/include/ia_css_terminal_base_types.h      |    53 +
- .../ia_css/ipu6/include/ia_css_terminal_defs.h     |   209 +
- .../ia_css/ipu6/include/ia_css_terminal_impl.h     |   497 +
- .../ia_css/ipu6/include/ia_css_terminal_manifest.h |   233 +
- .../include/ia_css_terminal_manifest_base_types.h  |    75 +
- .../ipu6/include/ia_css_terminal_manifest_impl.h   |   391 +
- .../ipu6/include/ia_css_terminal_manifest_types.h  |   349 +
- .../ia_css/ipu6/include/ia_css_terminal_types.h    |   477 +
- .../modules/ia_css/ipu6/include/ia_css_trace.h     |  1002 ++
- .../ia_css/ipu6/include/ipu_device_acb_devices.h   |    58 +
- .../ia_css/ipu6/include/ipu_device_gp_devices.h    |   205 +
- .../modules/ia_css/ipu6/include/math_support.h     |   328 +
- .../modules/ia_css/ipu6/include/misc_support.h     |    78 +
- .../ipu6/include/pg_control_init_framework.h       |    78 +
- .../modules/ia_css/ipu6/include/platform_support.h |   194 +
- .../modules/ia_css/ipu6/include/print_support.h    |   121 +
- .../ia_css/ipu6/include/psys_system_global_impl.h  |   504 +
- .../modules/ia_css/ipu6/include/storage_class.h    |    55 +
- .../modules/ia_css/ipu6/include/type_support.h     |    82 +
- .../ia_css/ipu6/include/vied_nci_acb_route_type.h  |    41 +
- .../ipu6/include/vied_nci_psys_resource_model.h    |   380 +
- .../ipu6/include/vied_nci_psys_system_global.h     |   186 +
- .../modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c |   151 +
- .../ia_css/ipu6/src/ia_css_program_group_data.c    |    28 +
- .../ia_css/ipu6/src/ia_css_program_group_param.c   |   769 +
- .../modules/ia_css/ipu6/src/ia_css_psys_process.c  |  1038 ++
- .../ia_css/ipu6/src/ia_css_psys_process_group.c    |   826 +
- .../ipu6/src/ia_css_psys_process_group_cmd_impl.c  |   137 +
- .../ipu6/src/ia_css_psys_program_group_manifest.c  |  1081 ++
- .../ia_css/ipu6/src/ia_css_psys_program_manifest.c |   972 ++
- .../modules/ia_css/ipu6/src/ia_css_psys_terminal.c |   534 +
- .../ipu6/src/ia_css_psys_terminal_manifest.c       |   776 +
- .../ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c      |    19 +
- .../ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c |    22 +
- .../ia_css/ipu6/src/ia_css_terminal_manifest.c     |    22 +
- .../modules/ia_css/ipu6/src/vied_nci_psys_system.c |    28 +
- .../modules/ia_css/ipu6se/include/assert_support.h |   210 +
- .../ia_css/ipu6se/include/cpu_mem_support.h        |   239 +
- .../modules/ia_css/ipu6se/include/error_support.h  |   112 +
- .../modules/ia_css/ipu6se/include/frame_support.h  |    63 +
- .../ia_css/ipu6se/include/ia_css_base_types.h      |    55 +
- .../ipu6se/include/ia_css_isa_parameter_defs.h     |   789 +
- .../ipu6se/include/ia_css_isa_parameter_defs_dep.h |   580 +
- .../ia_css/ipu6se/include/ia_css_kernel_bitmap.h   |   262 +
- .../ipu6se/include/ia_css_kernel_bitmap_impl.h     |   340 +
- .../include/ia_css_kernel_bitmap_storage_class.h   |    30 +
- .../include/ia_css_kernel_user_param_types.h       |    88 +
- .../ipu6se/include/ia_css_param_storage_class.h    |    30 +
- .../ipu6se/include/ia_css_program_group_data.h     |   449 +
- .../include/ia_css_program_group_data_defs.h       |   244 +
- .../include/ia_css_program_group_data_impl.h       |   461 +
- .../ipu6se/include/ia_css_program_group_param.h    |   295 +
- .../include/ia_css_program_group_param.sim.h       |   155 +
- .../include/ia_css_program_group_param_private.h   |    85 +
- .../include/ia_css_program_group_param_types.h     |    66 +
- .../ia_css/ipu6se/include/ia_css_psys_buffer_set.h |   290 +
- .../include/ia_css_psys_data_storage_class.h       |    30 +
- .../ia_css/ipu6se/include/ia_css_psys_data_trace.h |   104 +
- .../include/ia_css_psys_dynamic_storage_class.h    |    30 +
- .../ipu6se/include/ia_css_psys_dynamic_trace.h     |   105 +
- .../ipu6se/include/ia_css_psys_kernel_trace.h      |   105 +
- .../ipu6se/include/ia_css_psys_manifest_types.h    |   108 +
- .../ipu6se/include/ia_css_psys_param_trace.h       |   104 +
- .../ipu6se/include/ia_css_psys_private_pg_data.h   |    53 +
- .../ia_css/ipu6se/include/ia_css_psys_process.h    |   395 +
- .../include/ia_css_psys_process.hsys.kernel.h      |   159 +
- .../ipu6se/include/ia_css_psys_process.hsys.user.h |    94 +
- .../ipu6se/include/ia_css_psys_process.psys.h      |    54 +
- .../ipu6se/include/ia_css_psys_process_group.h     |   487 +
- .../ia_css_psys_process_group.hsys.kernel.h        |   379 +
- .../include/ia_css_psys_process_group.hsys.user.h  |   224 +
- .../include/ia_css_psys_process_group.psys.h       |    61 +
- .../include/ia_css_psys_process_group_cmd_impl.h   |   280 +
- .../include/ia_css_psys_process_group_impl.h       |  1846 +++
- .../ipu6se/include/ia_css_psys_process_impl.h      |   694 +
- .../include/ia_css_psys_process_private_types.h    |   135 +
- .../ipu6se/include/ia_css_psys_process_types.h     |    98 +
- .../include/ia_css_psys_program_group_manifest.h   |   320 +
- .../ia_css_psys_program_group_manifest.hsys.user.h |    78 +
- .../ia_css_psys_program_group_manifest.sim.h       |   131 +
- .../ia_css_psys_program_group_manifest_impl.h      |   417 +
- .../include/ia_css_psys_program_group_private.h    |   278 +
- .../ipu6se/include/ia_css_psys_program_manifest.h  |   679 +
- .../ia_css_psys_program_manifest.hsys.kernel.h     |   105 +
- .../ia_css_psys_program_manifest.hsys.user.h       |    41 +
- .../include/ia_css_psys_program_manifest.sim.h     |    65 +
- .../include/ia_css_psys_program_manifest_impl.h    |   577 +
- .../ipu6se/include/ia_css_psys_sim_storage_class.h |    30 +
- .../ia_css/ipu6se/include/ia_css_psys_sim_trace.h  |    97 +
- .../include/ia_css_psys_static_storage_class.h     |    30 +
- .../ipu6se/include/ia_css_psys_static_trace.h      |   105 +
- .../ia_css/ipu6se/include/ia_css_psys_terminal.h   |   403 +
- .../include/ia_css_psys_terminal.hsys.user.h       |   257 +
- .../ipu6se/include/ia_css_psys_terminal_impl.h     |  2053 +++
- .../ipu6se/include/ia_css_psys_terminal_manifest.h |   621 +
- .../ia_css_psys_terminal_manifest.hsys.user.h      |    40 +
- .../include/ia_css_psys_terminal_manifest.sim.h    |    50 +
- .../include/ia_css_psys_terminal_manifest_impl.h   |   745 +
- .../include/ia_css_psys_terminal_private_types.h   |   102 +
- .../ia_css/ipu6se/include/ia_css_psys_transport.h  |    96 +
- .../ipu6se/include/ia_css_psys_transport_dep.h     |    47 +
- .../modules/ia_css/ipu6se/include/ia_css_psysapi.h |    25 +
- .../ipu6se/include/ia_css_psysapi_fw_version.h     |    35 +
- .../ia_css/ipu6se/include/ia_css_psysapi_trace.h   |    80 +
- .../modules/ia_css/ipu6se/include/ia_css_rbm.h     |   199 +
- .../ia_css/ipu6se/include/ia_css_rbm_impl.h        |   410 +
- .../ia_css/ipu6se/include/ia_css_rbm_manifest.h    |   146 +
- .../ipu6se/include/ia_css_rbm_manifest_types.h     |    96 +
- .../ipu6se/include/ia_css_rbm_storage_class.h      |    38 +
- .../ia_css/ipu6se/include/ia_css_rbm_trace.h       |    79 +
- .../ia_css/ipu6se/include/ia_css_terminal.h        |   187 +
- .../ipu6se/include/ia_css_terminal_base_types.h    |    53 +
- .../ia_css/ipu6se/include/ia_css_terminal_defs.h   |   209 +
- .../ia_css/ipu6se/include/ia_css_terminal_impl.h   |   497 +
- .../ipu6se/include/ia_css_terminal_manifest.h      |   233 +
- .../include/ia_css_terminal_manifest_base_types.h  |    75 +
- .../ipu6se/include/ia_css_terminal_manifest_impl.h |   391 +
- .../include/ia_css_terminal_manifest_types.h       |   349 +
- .../ia_css/ipu6se/include/ia_css_terminal_types.h  |   477 +
- .../modules/ia_css/ipu6se/include/ia_css_trace.h   |  1002 ++
- .../ia_css/ipu6se/include/ipu_device_acb_devices.h |    39 +
- .../ia_css/ipu6se/include/ipu_device_gp_devices.h  |   195 +
- .../modules/ia_css/ipu6se/include/math_support.h   |   328 +
- .../modules/ia_css/ipu6se/include/misc_support.h   |    78 +
- .../ipu6se/include/pg_control_init_framework.h     |    78 +
- .../ia_css/ipu6se/include/platform_support.h       |   194 +
- .../modules/ia_css/ipu6se/include/print_support.h  |   121 +
- .../ipu6se/include/psys_system_global_impl.h       |   504 +
- .../modules/ia_css/ipu6se/include/storage_class.h  |    55 +
- .../modules/ia_css/ipu6se/include/type_support.h   |    82 +
- .../ipu6se/include/vied_nci_acb_route_type.h       |    41 +
- .../ipu6se/include/vied_nci_psys_resource_model.h  |   342 +
- .../ipu6se/include/vied_nci_psys_system_global.h   |   186 +
- .../ia_css/ipu6se/src/ia_css_kernel_bitmap.c       |   151 +
- .../ia_css/ipu6se/src/ia_css_program_group_data.c  |    28 +
- .../ia_css/ipu6se/src/ia_css_program_group_param.c |   769 +
- .../ia_css/ipu6se/src/ia_css_psys_process.c        |  1038 ++
- .../ia_css/ipu6se/src/ia_css_psys_process_group.c  |   826 +
- .../src/ia_css_psys_process_group_cmd_impl.c       |   137 +
- .../src/ia_css_psys_program_group_manifest.c       |  1081 ++
- .../ipu6se/src/ia_css_psys_program_manifest.c      |   972 ++
- .../ia_css/ipu6se/src/ia_css_psys_terminal.c       |   534 +
- .../ipu6se/src/ia_css_psys_terminal_manifest.c     |   776 +
- .../ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c    |    19 +
- .../modules/ia_css/ipu6se/src/ia_css_terminal.c    |    22 +
- .../ia_css/ipu6se/src/ia_css_terminal_manifest.c   |    22 +
- .../ia_css/ipu6se/src/vied_nci_psys_system.c       |    28 +
- .../ipu6/modules/memory/Camera3BufferPool.cpp      |   133 +
- .../intel/ipu6/modules/memory/Camera3BufferPool.h  |    51 +
- .../ipu6/modules/memory/chrome/Camera3Buffer.cpp   |   555 +
- .../ipu6/modules/memory/chrome/Camera3Buffer.h     |   169 +
- .../intel/ipu6/modules/sandboxing/IPCCommon.cpp    |   108 +
- .../hal/intel/ipu6/modules/sandboxing/IPCCommon.h  |   112 +
- .../ipu6/modules/sandboxing/IPCGraphConfig.cpp     |   495 +
- .../intel/ipu6/modules/sandboxing/IPCGraphConfig.h |   171 +
- .../intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp  |  1167 ++
- .../intel/ipu6/modules/sandboxing/IPCIntelAiq.h    |   367 +
- .../intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp  |   259 +
- .../intel/ipu6/modules/sandboxing/IPCIntelCmc.h    |    96 +
- .../intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp  |   724 +
- .../intel/ipu6/modules/sandboxing/IPCIntelDvs.h    |   247 +
- .../intel/ipu6/modules/sandboxing/IPCIntelFD.cpp   |    63 +
- .../hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h |    32 +
- .../intel/ipu6/modules/sandboxing/IPCIntelLard.cpp |   298 +
- .../intel/ipu6/modules/sandboxing/IPCIntelLard.h   |   103 +
- .../intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp  |   337 +
- .../intel/ipu6/modules/sandboxing/IPCIntelLtm.h    |   118 +
- .../intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp  |    81 +
- .../intel/ipu6/modules/sandboxing/IPCIntelMkn.h    |    64 +
- .../ipu6/modules/sandboxing/IPCIntelPGParam.cpp    |   478 +
- .../ipu6/modules/sandboxing/IPCIntelPGParam.h      |   160 +
- .../ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp |   558 +
- .../ipu6/modules/sandboxing/IPCIspParamAdaptor.h   |   170 +
- .../modules/sandboxing/client/GraphConfigImpl.cpp  |   189 +
- .../modules/sandboxing/client/GraphConfigImpl.h    |    78 +
- .../ipu6/modules/sandboxing/client/IntelAiq.cpp    |   317 +
- .../ipu6/modules/sandboxing/client/IntelAiq.h      |    74 +
- .../modules/sandboxing/client/IntelAlgoClient.cpp  |   385 +
- .../modules/sandboxing/client/IntelAlgoClient.h    |   116 +
- .../modules/sandboxing/client/IntelAlgoCommon.cpp  |   125 +
- .../modules/sandboxing/client/IntelAlgoCommon.h    |    67 +
- .../ipu6/modules/sandboxing/client/IntelCmc.cpp    |   108 +
- .../ipu6/modules/sandboxing/client/IntelCmc.h      |    58 +
- .../ipu6/modules/sandboxing/client/IntelDvs.cpp    |   356 +
- .../ipu6/modules/sandboxing/client/IntelDvs.h      |    79 +
- .../sandboxing/client/IntelFaceDetection.cpp       |   121 +
- .../modules/sandboxing/client/IntelFaceDetection.h |    48 +
- .../sandboxing/client/IntelIspParamAdaptor.cpp     |   197 +
- .../sandboxing/client/IntelIspParamAdaptor.h       |    59 +
- .../ipu6/modules/sandboxing/client/IntelLard.cpp   |   138 +
- .../ipu6/modules/sandboxing/client/IntelLard.h     |    50 +
- .../ipu6/modules/sandboxing/client/IntelLtm.cpp    |   136 +
- .../ipu6/modules/sandboxing/client/IntelLtm.h      |    53 +
- .../ipu6/modules/sandboxing/client/IntelMkn.cpp    |   122 +
- .../ipu6/modules/sandboxing/client/IntelMkn.h      |    53 +
- .../modules/sandboxing/client/IntelPGParam.cpp     |   271 +
- .../ipu6/modules/sandboxing/client/IntelPGParam.h  |    69 +
- .../sandboxing/server/GraphConfigServer.cpp        |   164 +
- .../modules/sandboxing/server/GraphConfigServer.h  |    44 +
- .../modules/sandboxing/server/IntelAiqServer.cpp   |   337 +
- .../modules/sandboxing/server/IntelAiqServer.h     |    50 +
- .../modules/sandboxing/server/IntelAlgoServer.cpp  |   484 +
- .../modules/sandboxing/server/IntelAlgoServer.h    |   110 +
- .../modules/sandboxing/server/IntelCmcServer.cpp   |    92 +
- .../modules/sandboxing/server/IntelCmcServer.h     |    40 +
- .../modules/sandboxing/server/IntelDvsServer.cpp   |   317 +
- .../modules/sandboxing/server/IntelDvsServer.h     |    54 +
- .../modules/sandboxing/server/IntelFDServer.cpp    |    62 +
- .../ipu6/modules/sandboxing/server/IntelFDServer.h |    39 +
- .../modules/sandboxing/server/IntelLardServer.cpp  |   112 +
- .../modules/sandboxing/server/IntelLardServer.h    |    40 +
- .../modules/sandboxing/server/IntelLtmServer.cpp   |   108 +
- .../modules/sandboxing/server/IntelLtmServer.h     |    40 +
- .../modules/sandboxing/server/IntelMknServer.cpp   |   128 +
- .../modules/sandboxing/server/IntelMknServer.h     |    45 +
- .../sandboxing/server/IntelPGParamServer.cpp       |   215 +
- .../modules/sandboxing/server/IntelPGParamServer.h |    55 +
- .../sandboxing/server/IspParamAdaptorServer.cpp    |   158 +
- .../sandboxing/server/IspParamAdaptorServer.h      |    44 +
- camera/hal/intel/ipu6/src/3a/AiqCore.cpp           |   982 ++
- camera/hal/intel/ipu6/src/3a/AiqCore.h             |   213 +
- camera/hal/intel/ipu6/src/3a/AiqEngine.cpp         |   526 +
- camera/hal/intel/ipu6/src/3a/AiqEngine.h           |   151 +
- camera/hal/intel/ipu6/src/3a/AiqResult.cpp         |   176 +
- camera/hal/intel/ipu6/src/3a/AiqResult.h           |   106 +
- camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp  |   286 +
- camera/hal/intel/ipu6/src/3a/AiqResultStorage.h    |   246 +
- camera/hal/intel/ipu6/src/3a/AiqSetting.cpp        |   350 +
- camera/hal/intel/ipu6/src/3a/AiqSetting.h          |   149 +
- camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp     |   147 +
- camera/hal/intel/ipu6/src/3a/AiqStatistics.h       |    58 +
- camera/hal/intel/ipu6/src/3a/AiqUnit.cpp           |   271 +
- camera/hal/intel/ipu6/src/3a/AiqUnit.h             |   157 +
- camera/hal/intel/ipu6/src/3a/AiqUtils.cpp          |   506 +
- camera/hal/intel/ipu6/src/3a/AiqUtils.h            |   179 +
- camera/hal/intel/ipu6/src/3a/Dvs.cpp               |   608 +
- camera/hal/intel/ipu6/src/3a/Dvs.h                 |   118 +
- camera/hal/intel/ipu6/src/3a/DvsResult.cpp         |   105 +
- camera/hal/intel/ipu6/src/3a/DvsResult.h           |    48 +
- camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp |    35 +
- camera/hal/intel/ipu6/src/3a/I3AControlFactory.h   |    44 +
- camera/hal/intel/ipu6/src/3a/ImagingControl.h      |    46 +
- camera/hal/intel/ipu6/src/3a/LensManager.cpp       |   101 +
- camera/hal/intel/ipu6/src/3a/LensManager.h         |    77 +
- camera/hal/intel/ipu6/src/3a/Ltm.cpp               |   550 +
- camera/hal/intel/ipu6/src/3a/Ltm.h                 |   185 +
- camera/hal/intel/ipu6/src/3a/MakerNote.cpp         |   139 +
- camera/hal/intel/ipu6/src/3a/MakerNote.h           |   129 +
- camera/hal/intel/ipu6/src/3a/SensorManager.cpp     |   327 +
- camera/hal/intel/ipu6/src/3a/SensorManager.h       |   111 +
- .../intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp |   694 +
- .../intel/ipu6/src/3a/intel3a/Intel3AParameter.h   |   103 +
- .../intel/ipu6/src/3a/intel3a/Intel3AResult.cpp    |   172 +
- .../hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h  |    45 +
- camera/hal/intel/ipu6/src/core/BufferQueue.cpp     |   286 +
- camera/hal/intel/ipu6/src/core/BufferQueue.h       |   206 +
- camera/hal/intel/ipu6/src/core/CameraBuffer.cpp    |   401 +
- camera/hal/intel/ipu6/src/core/CameraBuffer.h      |   169 +
- camera/hal/intel/ipu6/src/core/CameraDevice.cpp    |  1162 ++
- camera/hal/intel/ipu6/src/core/CameraDevice.h      |   284 +
- camera/hal/intel/ipu6/src/core/CameraEvent.cpp     |    83 +
- camera/hal/intel/ipu6/src/core/CameraEvent.h       |    50 +
- camera/hal/intel/ipu6/src/core/CameraEventType.h   |   110 +
- camera/hal/intel/ipu6/src/core/CameraStream.cpp    |   230 +
- camera/hal/intel/ipu6/src/core/CameraStream.h      |   118 +
- camera/hal/intel/ipu6/src/core/CaptureUnit.cpp     |   510 +
- camera/hal/intel/ipu6/src/core/CaptureUnit.h       |   196 +
- camera/hal/intel/ipu6/src/core/DeviceBase.cpp      |   441 +
- camera/hal/intel/ipu6/src/core/DeviceBase.h        |   171 +
- camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp |   850 +
- camera/hal/intel/ipu6/src/core/IspParamAdaptor.h   |   147 +
- camera/hal/intel/ipu6/src/core/IspSettings.h       |    46 +
- camera/hal/intel/ipu6/src/core/LensHw.cpp          |   159 +
- camera/hal/intel/ipu6/src/core/LensHw.h            |    63 +
- camera/hal/intel/ipu6/src/core/PSysProcessor.cpp   |   860 +
- camera/hal/intel/ipu6/src/core/PSysProcessor.h     |   129 +
- .../hal/intel/ipu6/src/core/ProcessorManager.cpp   |   125 +
- camera/hal/intel/ipu6/src/core/ProcessorManager.h  |    71 +
- camera/hal/intel/ipu6/src/core/RequestThread.cpp   |   537 +
- camera/hal/intel/ipu6/src/core/RequestThread.h     |   153 +
- camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp    |   331 +
- camera/hal/intel/ipu6/src/core/SensorHwCtrl.h      |    99 +
- camera/hal/intel/ipu6/src/core/SofSource.cpp       |   226 +
- camera/hal/intel/ipu6/src/core/SofSource.h         |    64 +
- camera/hal/intel/ipu6/src/core/StreamSource.h      |    49 +
- .../hal/intel/ipu6/src/core/SwImageProcessor.cpp   |   158 +
- camera/hal/intel/ipu6/src/core/SwImageProcessor.h  |    46 +
- camera/hal/intel/ipu6/src/core/SyncManager.cpp     |   198 +
- camera/hal/intel/ipu6/src/core/SyncManager.h       |    58 +
- .../intel/ipu6/src/core/psysprocessor/PGCommon.cpp |  1224 ++
- .../intel/ipu6/src/core/psysprocessor/PGCommon.h   |   238 +
- .../intel/ipu6/src/core/psysprocessor/PGUtils.cpp  |   194 +
- .../intel/ipu6/src/core/psysprocessor/PGUtils.h    |    86 +
- .../intel/ipu6/src/core/psysprocessor/PSysDAG.cpp  |   669 +
- .../intel/ipu6/src/core/psysprocessor/PSysDAG.h    |   147 +
- .../src/core/psysprocessor/PipeLiteExecutor.cpp    |  1116 ++
- .../ipu6/src/core/psysprocessor/PipeLiteExecutor.h |   193 +
- .../ipu6/src/core/psysprocessor/PolicyManager.cpp  |   168 +
- .../ipu6/src/core/psysprocessor/PolicyManager.h    |    79 +
- camera/hal/intel/ipu6/src/fd/FaceBase.h            |    80 +
- camera/hal/intel/ipu6/src/fd/FaceDetection.cpp     |   529 +
- camera/hal/intel/ipu6/src/fd/FaceDetection.h       |   118 +
- camera/hal/intel/ipu6/src/hal/CameraHal.cpp        |   270 +
- camera/hal/intel/ipu6/src/hal/CameraHal.h          |    85 +
- camera/hal/intel/ipu6/src/hal/ICamera.cpp          |   374 +
- .../intel/ipu6/src/image_process/IImageProcessor.h |    46 +
- .../ipu6/src/image_process/ImageConverter.cpp      |   798 +
- .../intel/ipu6/src/image_process/ImageConverter.h  |    59 +
- .../ipu6/src/image_process/PostProcessorBase.cpp   |   318 +
- .../ipu6/src/image_process/PostProcessorBase.h     |   118 +
- .../ipu6/src/image_process/PostProcessorCore.cpp   |   141 +
- .../ipu6/src/image_process/PostProcessorCore.h     |    68 +
- .../hal/intel/ipu6/src/image_process/ProcessType.h |    30 +
- .../image_process/chrome/ImageProcessorCore.cpp    |   234 +
- .../src/image_process/chrome/ImageProcessorCore.h  |    44 +
- camera/hal/intel/ipu6/src/iutils/CameraDump.cpp    |   409 +
- camera/hal/intel/ipu6/src/iutils/CameraDump.h      |   170 +
- camera/hal/intel/ipu6/src/iutils/CameraLog.cpp     |   270 +
- camera/hal/intel/ipu6/src/iutils/CameraLog.h       |   200 +
- camera/hal/intel/ipu6/src/iutils/Errors.h          |    65 +
- camera/hal/intel/ipu6/src/iutils/RWLock.h          |    98 +
- camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp  |    63 +
- .../hal/intel/ipu6/src/iutils/SwImageConverter.cpp |   406 +
- .../hal/intel/ipu6/src/iutils/SwImageConverter.h   |    42 +
- camera/hal/intel/ipu6/src/iutils/Thread.cpp        |   222 +
- camera/hal/intel/ipu6/src/iutils/Thread.h          |   198 +
- camera/hal/intel/ipu6/src/iutils/Trace.cpp         |    54 +
- camera/hal/intel/ipu6/src/iutils/Trace.h           |   241 +
- camera/hal/intel/ipu6/src/iutils/Utils.cpp         |   740 +
- camera/hal/intel/ipu6/src/iutils/Utils.h           |   277 +
- camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp       |   540 +
- camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h         |    69 +
- camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp    |    57 +
- camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h      |    65 +
- camera/hal/intel/ipu6/src/jpeg/Exif.h              |   344 +
- camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp     |   604 +
- camera/hal/intel/ipu6/src/jpeg/ExifCreater.h       |   141 +
- camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h      |    76 +
- camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp       |   233 +
- camera/hal/intel/ipu6/src/jpeg/JpegMaker.h         |    58 +
- .../intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp |    76 +
- .../intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h   |    39 +
- .../hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp   |   772 +
- camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h  |   184 +
- .../hal/intel/ipu6/src/metadata/CameraMetadata.cpp |   435 +
- .../hal/intel/ipu6/src/metadata/CameraMetadata.h   |   200 +
- .../intel/ipu6/src/metadata/ParameterGenerator.cpp |   313 +
- .../intel/ipu6/src/metadata/ParameterGenerator.h   |   112 +
- .../intel/ipu6/src/metadata/ParameterHelper.cpp    |    84 +
- .../hal/intel/ipu6/src/metadata/ParameterHelper.h  |   142 +
- camera/hal/intel/ipu6/src/metadata/Parameters.cpp  |  1931 +++
- .../ipu6/src/metadata/icamera_metadata_base.cpp    |   976 ++
- .../ipu6/src/metadata/icamera_metadata_base.h      |   445 +
- .../ipu6/src/metadata/icamera_metadata_tag_info.c  |  2630 +++
- .../ipu6/src/metadata/icamera_metadata_tags.h      |   999 ++
- .../intel/ipu6/src/platformdata/AiqInitData.cpp    |   524 +
- .../hal/intel/ipu6/src/platformdata/AiqInitData.h  |   199 +
- .../intel/ipu6/src/platformdata/CameraParser.cpp   |  1939 +++
- .../hal/intel/ipu6/src/platformdata/CameraParser.h |   128 +
- .../hal/intel/ipu6/src/platformdata/CameraTypes.h  |   226 +
- .../hal/intel/ipu6/src/platformdata/ParserBase.cpp |   165 +
- .../hal/intel/ipu6/src/platformdata/ParserBase.h   |   102 +
- .../intel/ipu6/src/platformdata/PlatformData.cpp   |  1296 ++
- .../hal/intel/ipu6/src/platformdata/PlatformData.h |  1094 ++
- .../intel/ipu6/src/platformdata/PolicyParser.cpp   |   226 +
- .../hal/intel/ipu6/src/platformdata/PolicyParser.h |    73 +
- .../intel/ipu6/src/platformdata/gc/FormatUtils.cpp |   338 +
- .../intel/ipu6/src/platformdata/gc/FormatUtils.h   |    34 +
- .../intel/ipu6/src/platformdata/gc/GraphConfig.cpp |   192 +
- .../intel/ipu6/src/platformdata/gc/GraphConfig.h   |    87 +
- .../src/platformdata/gc/GraphConfigManager.cpp     |   179 +
- .../ipu6/src/platformdata/gc/GraphConfigManager.h  |    85 +
- .../intel/ipu6/src/platformdata/gc/GraphUtils.cpp  |   112 +
- .../intel/ipu6/src/platformdata/gc/GraphUtils.h    |    27 +
- .../hal/intel/ipu6/src/platformdata/gc/HalStream.h |    74 +
- .../intel/ipu6/src/platformdata/gc/IGraphConfig.h  |   199 +
- .../ipu6/src/platformdata/gc/IGraphConfigManager.h |    43 +
- .../ipu6/src/platformdata/gc/custom_gcss_keys.h    |    50 +
- camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp    |  1116 ++
- camera/hal/intel/ipu6/src/v4l2/MediaControl.h      |   302 +
- camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp        |    53 +
- camera/hal/intel/ipu6/src/v4l2/NodeInfo.h          |    50 +
- camera/hal/intel/ipu6/src/v4l2/SysCall.cpp         |   212 +
- camera/hal/intel/ipu6/src/v4l2/SysCall.h           |    87 +
- .../hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp  |   126 +
- camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h |    61 +
- 610 files changed, 180827 insertions(+)
- create mode 100644 camera/hal/intel/ipu6/BUILD.gn
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3AMetadata.h
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3HAL.h
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/Camera3Stream.h
- create mode 100644 camera/hal/intel/ipu6/aal/HALv3Interface.h
- create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/HALv3Utils.h
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
- create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/MetadataConvert.h
- create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/PostProcessor.h
- create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/RequestManager.h
- create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.cpp
- create mode 100644 camera/hal/intel/ipu6/aal/ResultProcessor.h
- create mode 100644 camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
- create mode 100644 camera/hal/intel/ipu6/include/api/ICamera.h
- create mode 100644 camera/hal/intel/ipu6/include/api/Parameters.h
- create mode 100644 camera/hal/intel/ipu6/include/cameranvm.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/GCSSParser.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_item.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_keys.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_utils.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
- create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_utils.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_tools/css_types.h
- create mode 100644 camera/hal/intel/ipu6/include/ia_tools/ia_list.h
- create mode 100644 camera/hal/intel/ipu6/include/linux/ipu-isys.h
- create mode 100644 camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
- create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
- create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
- create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
- create mode 100644 camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqCore.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqEngine.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResult.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqSetting.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqStatistics.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUnit.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/AiqUtils.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/Dvs.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/DvsResult.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/ImagingControl.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/LensManager.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/Ltm.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/MakerNote.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/SensorManager.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
- create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
- create mode 100644 camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
- create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/BufferQueue.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraBuffer.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraDevice.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraEvent.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraEventType.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/CameraStream.h
- create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/CaptureUnit.h
- create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/DeviceBase.h
- create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
- create mode 100644 camera/hal/intel/ipu6/src/core/IspSettings.h
- create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/LensHw.h
- create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/PSysProcessor.h
- create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/ProcessorManager.h
- create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/RequestThread.h
- create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
- create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/SofSource.h
- create mode 100644 camera/hal/intel/ipu6/src/core/StreamSource.h
- create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/SwImageProcessor.h
- create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/SyncManager.h
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
- create mode 100644 camera/hal/intel/ipu6/src/fd/FaceBase.h
- create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
- create mode 100644 camera/hal/intel/ipu6/src/fd/FaceDetection.h
- create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.cpp
- create mode 100644 camera/hal/intel/ipu6/src/hal/CameraHal.h
- create mode 100644 camera/hal/intel/ipu6/src/hal/ICamera.cpp
- create mode 100644 camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
- create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
- create mode 100644 camera/hal/intel/ipu6/src/image_process/ImageConverter.h
- create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
- create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
- create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
- create mode 100644 camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
- create mode 100644 camera/hal/intel/ipu6/src/image_process/ProcessType.h
- create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
- create mode 100644 camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraDump.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/CameraLog.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Errors.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/RWLock.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Thread.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Trace.h
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.cpp
- create mode 100644 camera/hal/intel/ipu6/src/iutils/Utils.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/Exif.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
- create mode 100644 camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
- create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
- create mode 100644 camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
- create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
- create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
- create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
- create mode 100644 camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
- create mode 100644 camera/hal/intel/ipu6/src/metadata/Parameters.cpp
- create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
- create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
- create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
- create mode 100644 camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraParser.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/ParserBase.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/PlatformData.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
- create mode 100644 camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/MediaControl.h
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/SysCall.h
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
- create mode 100644 camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
-
-diff --git a/camera/hal/intel/ipu6/BUILD.gn b/camera/hal/intel/ipu6/BUILD.gn
-new file mode 100644
-index 000000000000..69cd3e890b0c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/BUILD.gn
-@@ -0,0 +1,402 @@
-+#
-+#  Copyright (C) 2019-2020 Intel Corporation
-+#
-+#  Licensed under the Apache License, Version 2.0 (the "License");
-+#  you may not use this file except in compliance with the License.
-+#  You may obtain a copy of the License at
-+#
-+#       http://www.apache.org/licenses/LICENSE-2.0
-+#
-+#  Unless required by applicable law or agreed to in writing, software
-+#  distributed under the License is distributed on an "AS IS" BASIS,
-+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+#  See the License for the specific language governing permissions and
-+#  limitations under the License.
-+#
-+
-+group("all") {
-+  deps = [
-+    ":libcam_algo",
-+    ":libcamhal",
-+  ]
-+}
-+
-+shared_library("libcamhal") {
-+  sources = [
-+    "aal/Camera3AMetadata.cpp",
-+    "aal/Camera3HAL.cpp",
-+    "aal/Camera3HALModule.cpp",
-+    "aal/Camera3Stream.cpp",
-+    "aal/HALv3Utils.cpp",
-+    "aal/IntelAEStateMachine.cpp",
-+    "aal/IntelAFStateMachine.cpp",
-+    "aal/IntelAWBStateMachine.cpp",
-+    "aal/MetadataConvert.cpp",
-+    "aal/PostProcessor.cpp",
-+    "aal/RequestManager.cpp",
-+    "aal/ResultProcessor.cpp",
-+    "modules/ia_cipr/src/common/ia_cipr_memory_common.cpp",
-+    "modules/ia_cipr/src/common/ia_list.cpp",
-+    "modules/ia_cipr/src/linux/ia_cipr_alloc.cpp",
-+    "modules/ia_cipr/src/linux/ia_cipr_psys.cpp",
-+    "modules/sandboxing/client/IntelAlgoClient.cpp",
-+    "modules/sandboxing/client/IntelAlgoCommon.cpp",
-+    "modules/sandboxing/client/IntelLard.cpp",
-+    "modules/sandboxing/client/IntelFaceDetection.cpp",
-+    "modules/sandboxing/client/GraphConfigImpl.cpp",
-+    "modules/sandboxing/client/IntelCmc.cpp",
-+    "modules/sandboxing/client/IntelMkn.cpp",
-+    "modules/sandboxing/client/IntelLtm.cpp",
-+    "modules/sandboxing/client/IntelAiq.cpp",
-+    "modules/sandboxing/client/IntelDvs.cpp",
-+    "modules/sandboxing/client/IntelIspParamAdaptor.cpp",
-+    "modules/sandboxing/client/IntelPGParam.cpp",
-+    "modules/sandboxing/IPCCommon.cpp",
-+    "modules/sandboxing/IPCIntelLard.cpp",
-+    "modules/sandboxing/IPCIntelFD.cpp",
-+    "modules/sandboxing/IPCGraphConfig.cpp",
-+    "modules/sandboxing/IPCIntelCmc.cpp",
-+    "modules/sandboxing/IPCIntelMkn.cpp",
-+    "modules/sandboxing/IPCIntelLtm.cpp",
-+    "modules/sandboxing/IPCIntelAiq.cpp",
-+    "modules/sandboxing/IPCIntelDvs.cpp",
-+    "modules/sandboxing/IPCIspParamAdaptor.cpp",
-+    "modules/sandboxing/IPCIntelPGParam.cpp",
-+    "modules/memory/Camera3BufferPool.cpp",
-+    "modules/memory/chrome/Camera3Buffer.cpp",
-+    "src/3a/AiqCore.cpp",
-+    "src/3a/AiqEngine.cpp",
-+    "src/3a/AiqResult.cpp",
-+    "src/3a/AiqResultStorage.cpp",
-+    "src/3a/AiqSetting.cpp",
-+    "src/3a/AiqStatistics.cpp",
-+    "src/3a/AiqUnit.cpp",
-+    "src/3a/AiqUtils.cpp",
-+    "src/3a/I3AControlFactory.cpp",
-+    "src/3a/DvsResult.cpp",
-+    "src/3a/Dvs.cpp",
-+    "src/3a/MakerNote.cpp",
-+    "src/3a/LensManager.cpp",
-+    "src/3a/Ltm.cpp",
-+    "src/3a/SensorManager.cpp",
-+    "src/3a/intel3a/Intel3AParameter.cpp",
-+    "src/3a/intel3a/Intel3AResult.cpp",
-+    "src/core/BufferQueue.cpp",
-+    "src/core/CameraBuffer.cpp",
-+    "src/core/CameraDevice.cpp",
-+    "src/core/CameraEvent.cpp",
-+    "src/core/CameraStream.cpp",
-+    "src/core/CaptureUnit.cpp",
-+    "src/core/DeviceBase.cpp",
-+    "src/core/IspParamAdaptor.cpp",
-+    "src/core/LensHw.cpp",
-+    "src/core/PSysProcessor.cpp",
-+    "src/core/ProcessorManager.cpp",
-+    "src/core/RequestThread.cpp",
-+    "src/core/SensorHwCtrl.cpp",
-+    "src/core/SofSource.cpp",
-+    "src/core/SwImageProcessor.cpp",
-+    "src/core/SyncManager.cpp",
-+    "src/core/psysprocessor/PGCommon.cpp",
-+    "src/core/psysprocessor/PGUtils.cpp",
-+    "src/core/psysprocessor/PSysDAG.cpp",
-+    "src/core/psysprocessor/PipeLiteExecutor.cpp",
-+    "src/core/psysprocessor/PolicyManager.cpp",
-+    "src/fd/FaceDetection.cpp",
-+    "src/hal/CameraHal.cpp",
-+    "src/hal/ICamera.cpp",
-+    "src/image_process/ImageConverter.cpp",
-+    "src/image_process/PostProcessorBase.cpp",
-+    "src/image_process/PostProcessorCore.cpp",
-+    "src/image_process/chrome/ImageProcessorCore.cpp",
-+    "src/iutils/CameraDump.cpp",
-+    "src/iutils/CameraLog.cpp",
-+    "src/iutils/ScopedAtrace.cpp",
-+    "src/iutils/SwImageConverter.cpp",
-+    "src/iutils/Thread.cpp",
-+    "src/iutils/Trace.cpp",
-+    "src/iutils/Utils.cpp",
-+    "src/jpeg/EXIFMaker.cpp",
-+    "src/jpeg/EXIFMetaData.cpp",
-+    "src/jpeg/ExifCreater.cpp",
-+    "src/jpeg/JpegMaker.cpp",
-+    "src/jpeg/sw/SWJpegEncoder.cpp",  # TODO: Migrate to hardware JPEG encoding later
-+    "src/metadata/CameraMetadata.cpp",
-+    "src/metadata/ParameterGenerator.cpp",
-+    "src/metadata/ParameterHelper.cpp",
-+    "src/metadata/Parameters.cpp",
-+    "src/metadata/icamera_metadata_base.cpp",
-+    "src/platformdata/AiqInitData.cpp",
-+    "src/platformdata/CameraParser.cpp",
-+    "src/platformdata/ParserBase.cpp",
-+    "src/platformdata/PlatformData.cpp",
-+    "src/platformdata/PolicyParser.cpp",
-+    "src/platformdata/gc/FormatUtils.cpp",
-+    "src/platformdata/gc/GraphConfig.cpp",
-+    "src/platformdata/gc/GraphConfigManager.cpp",
-+    "src/platformdata/gc/GraphUtils.cpp",
-+    "src/v4l2/MediaControl.cpp",
-+    "src/v4l2/SysCall.cpp",
-+    "src/v4l2/V4l2DeviceFactory.cpp",
-+    "src/v4l2/NodeInfo.cpp",
-+  ]
-+  cflags_cc = [
-+    "-fvisibility=default",
-+  ]
-+  include_dirs = [
-+    ".",
-+    "include",
-+    "include/api",
-+    "include/utils",
-+    "include/linux",
-+    "src",
-+    "src/fd",
-+    "src/platformdata",
-+    "src/platformdata/gc",
-+    "src/v4l2",
-+    "src/iutils",
-+    "src/core",
-+    "src/core/psysprocessor",
-+    "src/metadata",
-+    "src/3a/intel3a",
-+    "src/3a/external",
-+    "src/3a",
-+    "src/image_process",
-+    "src/image_process/chrome",
-+    "src/jpeg/",
-+    "src/jpeg/sw",
-+    "aal",
-+    "aal/chrome",
-+    "modules/ia_cipr/include",
-+    "modules/ia_cipr/src/common",
-+    "modules/ia_cipr/src/linux/linux",
-+    "modules/memory",
-+    "modules/memory/chrome",
-+    "include/ia_imaging",
-+    "include",
-+    "include/gcss",
-+  ]
-+  defines = [
-+    "CAL_BUILD",
-+    "IPU_SYSVER_IPU6",
-+    "USE_PG_LITE_PIPE",
-+    "HAVE_LINUX_OS",
-+    "__STDC_FORMAT_MACROS",
-+    "HAVE_PTHREADS",
-+    "HAVE_IA_TYPES",
-+    "HAVE_PRCTL",
-+    "SW_JPEG_ENCODE",
-+    "CAMERA_HAL_DEBUG",
-+    "DUMP_IMAGE",
-+    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
-+    "ENABLE_SANDBOXING",
-+    "FACE_DETECTION",
-+  ]
-+  libs = [
-+    "camera_client",
-+    "camera_metadata",
-+    "camera_common",
-+    "cbm",
-+    "jpeg",
-+    "dl",
-+  ]
-+  pkg_deps = [
-+    "cros-camera-android-headers",
-+    "expat",
-+    "libcab",
-+    "libcamera_client",
-+    "libcamera_common",
-+    "libcamera_exif",
-+    "libcamera_metadata",
-+    "libcamera_v4l2_device",
-+    "libcbm",
-+    "libchrome-${libbase_ver}",
-+    "libmojo-${libbase_ver}",
-+    "libsync",
-+    "libyuv",
-+  ]
-+  if (use.ipu6se) {
-+    sources += [
-+      "modules/ia_css/ipu6se/src/ia_css_program_group_param.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_process_group.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c",
-+      "modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c",
-+      "modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_process.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_terminal.c",
-+      "modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c",
-+      "modules/ia_css/ipu6se/src/vied_nci_psys_system.c",
-+      "modules/ia_css/ipu6se/src/ia_css_terminal.c",
-+      "modules/ia_css/ipu6se/src/ia_css_program_group_data.c",
-+      "modules/ia_css/ipu6se/src/ia_css_rbm.c",
-+    ]
-+    include_dirs += [
-+      "modules/ia_css/ipu6se/include",
-+    ]
-+    defines += [
-+      "IPU_SYSVER_ipu6v3",
-+    ]
-+  } else {
-+    sources += [
-+      "modules/ia_css/ipu6/src/ia_css_program_group_param.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_process_group.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c",
-+      "modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c",
-+      "modules/ia_css/ipu6/src/ia_css_terminal_manifest.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_process.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_terminal.c",
-+      "modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c",
-+      "modules/ia_css/ipu6/src/vied_nci_psys_system.c",
-+      "modules/ia_css/ipu6/src/ia_css_terminal.c",
-+      "modules/ia_css/ipu6/src/ia_css_program_group_data.c",
-+      "modules/ia_css/ipu6/src/ia_css_rbm.c",
-+    ]
-+    include_dirs += [
-+      "modules/ia_css/ipu6/include",
-+    ]
-+  }
-+  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
-+}
-+
-+shared_library("libcam_algo") {
-+  sources = [
-+    "src/3a/DvsResult.cpp",
-+    "src/iutils/Utils.cpp",
-+    "src/iutils/Trace.cpp",
-+    "src/iutils/ScopedAtrace.cpp",
-+    "src/iutils/Thread.cpp",
-+    "src/iutils/CameraLog.cpp",
-+    "src/platformdata/gc/FormatUtils.cpp",
-+    "src/platformdata/gc/GraphUtils.cpp",
-+    "src/core/psysprocessor/PGUtils.cpp",
-+    "modules/sandboxing/IPCCommon.cpp",
-+    "modules/sandboxing/IPCIntelLard.cpp",
-+    "modules/sandboxing/IPCIntelFD.cpp",
-+    "modules/sandboxing/IPCGraphConfig.cpp",
-+    "modules/sandboxing/IPCIntelCmc.cpp",
-+    "modules/sandboxing/IPCIntelMkn.cpp",
-+    "modules/sandboxing/IPCIntelLtm.cpp",
-+    "modules/sandboxing/IPCIntelAiq.cpp",
-+    "modules/sandboxing/IPCIntelDvs.cpp",
-+    "modules/sandboxing/IPCIspParamAdaptor.cpp",
-+    "modules/sandboxing/IPCIntelPGParam.cpp",
-+    "modules/sandboxing/server/IntelAlgoServer.cpp",
-+    "modules/sandboxing/server/IntelLardServer.cpp",
-+    "modules/sandboxing/server/IntelFDServer.cpp",
-+    "modules/sandboxing/server/GraphConfigServer.cpp",
-+    "modules/sandboxing/server/IntelCmcServer.cpp",
-+    "modules/sandboxing/server/IntelMknServer.cpp",
-+    "modules/sandboxing/server/IntelLtmServer.cpp",
-+    "modules/sandboxing/server/IntelAiqServer.cpp",
-+    "modules/sandboxing/server/IntelDvsServer.cpp",
-+    "modules/sandboxing/server/IspParamAdaptorServer.cpp",
-+    "modules/sandboxing/server/IntelPGParamServer.cpp",
-+    "modules/algowrapper/IntelLard.cpp",
-+    "modules/algowrapper/IntelFaceDetection.cpp",
-+    "modules/algowrapper/graph/GraphConfigImpl.cpp",
-+    "modules/algowrapper/graph/GraphConfigPipe.cpp",
-+    "modules/algowrapper/IntelCmc.cpp",
-+    "modules/algowrapper/IntelMkn.cpp",
-+    "modules/algowrapper/IntelLtm.cpp",
-+    "modules/algowrapper/IntelAiq.cpp",
-+    "modules/algowrapper/IntelDvs.cpp",
-+    "modules/algowrapper/IntelIspParamAdaptor.cpp",
-+    "modules/algowrapper/IntelPGParam.cpp",
-+    "src/3a/AiqUtils.cpp",
-+  ]
-+  cflags_cc = [
-+    "-fvisibility=default",
-+  ]
-+  include_dirs = [
-+    ".",
-+    "include",
-+    "include/api",
-+    "include/utils",
-+    "include/linux",
-+    "src",
-+    "src/fd",
-+    "src/platformdata",
-+    "src/platformdata/gc",
-+    "src/v4l2",
-+    "src/iutils",
-+    "src/core",
-+    "src/core/psysprocessor",
-+    "src/metadata",
-+    "src/3a/intel3a",
-+    "src/3a/external",
-+    "src/3a",
-+    "src/image_process",
-+    "src/image_process/chrome",
-+    "src/jpeg/",
-+    "src/jpeg/sw",
-+    "aal",
-+    "aal/chrome",
-+    "modules/memory",
-+    "modules/memory/chrome",
-+    "include/ia_imaging",
-+    "include",
-+    "include/gcss",
-+ ]
-+  defines = [
-+    "CAL_BUILD",
-+    "IPU_SYSVER_IPU6",
-+    "USE_PG_LITE_PIPE",
-+    "HAVE_LINUX_OS",
-+    "__STDC_FORMAT_MACROS",
-+    "HAVE_PTHREADS",
-+    "HAVE_IA_TYPES",
-+    "HAVE_PRCTL",
-+    "SW_JPEG_ENCODE",
-+    "CAMERA_HAL_DEBUG",
-+    "DUMP_IMAGE",
-+    "HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL=0x10F",
-+    "ENABLE_SANDBOXING",
-+    "FACE_DETECTION",
-+  ]
-+  libs = [
-+    "ia_aiq",
-+    "ia_cmc_parser",
-+    "ia_exc",
-+    "ia_log",
-+    "ia_mkn",
-+    "ia_ltm",
-+    "ia_isp_bxt",
-+    "ia_dvs",
-+    "ia_lard",
-+    "pvl_eye_detection",
-+    "pvl_face_detection",
-+    "pvl_mouth_detection",
-+    "gcss",
-+    "ia_aiqb_parser",
-+  ]
-+  pkg_deps = [
-+    "cros-camera-android-headers",
-+    "libcab",
-+    "libmojo-${libbase_ver}",
-+  ]
-+  if (use.ipu6se) {
-+    libs += [
-+      "ipu6sepla",
-+      "ia_p2p_ipu6sepla",
-+    ]
-+    defines += [
-+      "IPU_SYSVER_ipu6v3",
-+    ]
-+    include_dirs += [
-+      "modules/ia_css/ipu6se/include",
-+    ]
-+  } else {
-+    libs += [
-+      "ipu6",
-+      "ia_p2p_ipu6",
-+    ]
-+    include_dirs += [
-+      "modules/ia_css/ipu6/include",
-+    ]
-+  }
-+  deps = [ "//camera/common/libcamera_ipc:libcamera_ipc_mojom" ]
-+}
-diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
-new file mode 100644
-index 000000000000..0d84a130f35a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.cpp
-@@ -0,0 +1,142 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Camera3AMetadata"
-+
-+#include "Utils.h"
-+
-+#include "HALv3Header.h"
-+#include "HALv3Utils.h"
-+#include "Camera3AMetadata.h"
-+
-+namespace camera3 {
-+
-+Camera3AMetadata::Camera3AMetadata(int cameraId) : mCameraId(cameraId)
-+{
-+    LOG1("@%s", __func__);
-+
-+    mIntelAFStateMachine = new IntelAFStateMachine(mCameraId);
-+    mIntelAEStateMachine = new IntelAEStateMachine(mCameraId);
-+    mIntelAWBStateMachine = new IntelAWBStateMachine(mCameraId);
-+}
-+
-+Camera3AMetadata::~Camera3AMetadata()
-+{
-+    LOG1("@%s", __func__);
-+
-+    delete mIntelAFStateMachine;
-+    delete mIntelAEStateMachine;
-+    delete mIntelAWBStateMachine;
-+}
-+
-+void Camera3AMetadata::process3Astate(const icamera::Parameters &parameter,
-+                                      android::CameraMetadata &metadata)
-+{
-+    LOG2("@%s", __func__);
-+
-+    // get 3a info from metadata
-+    uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
-+    camera_metadata_entry entry = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
-+    if (entry.count == 1) {
-+        afTrigger = entry.data.u8[0];
-+    }
-+
-+    uint8_t afMode = ANDROID_CONTROL_AF_MODE_AUTO;
-+    entry = metadata.find(ANDROID_CONTROL_AF_MODE);
-+    if (entry.count == 1) {
-+        afMode = entry.data.u8[0];
-+    }
-+
-+    mIntelAFStateMachine->processTriggers(afTrigger, afMode);
-+
-+    // get AF state
-+    icamera::camera_af_state_t afState = icamera::AF_STATE_IDLE;
-+    parameter.getAfState(afState);
-+
-+    bool lensMoving = false;
-+    parameter.getLensState(lensMoving);
-+    mIntelAFStateMachine->processResult(afState, lensMoving, metadata);
-+
-+    AeControls aeControls = {
-+        ANDROID_CONTROL_AE_MODE_ON,
-+        ANDROID_CONTROL_AE_LOCK_OFF,
-+        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE,
-+        ANDROID_CONTROL_SCENE_MODE_DISABLED,
-+        0
-+    };
-+    uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
-+    entry = metadata.find(ANDROID_CONTROL_MODE);
-+    if (entry.count == 1) {
-+        controlMode = entry.data.u8[0];
-+    }
-+
-+    uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
-+    entry = metadata.find(ANDROID_CONTROL_SCENE_MODE);
-+    if (entry.count == 1) {
-+        sceneMode = entry.data.u8[0];
-+    }
-+
-+    entry = metadata.find(ANDROID_CONTROL_AE_MODE);
-+    if (entry.count == 1) {
-+        aeControls.aeMode = entry.data.u8[0];
-+    }
-+
-+    entry = metadata.find(ANDROID_CONTROL_AE_LOCK);
-+    if (entry.count == 1) {
-+        aeControls.aeLock = entry.data.u8[0];
-+    }
-+
-+    entry = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
-+    if (entry.count == 1) {
-+        aeControls.aePreCaptureTrigger = entry.data.u8[0];
-+    }
-+
-+    entry = metadata.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION);
-+    if (entry.count == 1) {
-+        aeControls.evCompensation = entry.data.i32[0];
-+    }
-+
-+    mIntelAEStateMachine->processState(controlMode, sceneMode, aeControls);
-+
-+    // get AE state
-+    icamera::camera_ae_state_t aeState = icamera::AE_STATE_NOT_CONVERGED;
-+    parameter.getAeState(aeState);
-+    mIntelAEStateMachine->processResult(aeState == icamera::AE_STATE_CONVERGED, metadata);
-+
-+    AwbControls awbControls = {
-+        ANDROID_CONTROL_AWB_MODE_AUTO,
-+        ANDROID_CONTROL_AWB_LOCK_OFF,
-+        0, 0
-+    };
-+    entry = metadata.find(ANDROID_CONTROL_AWB_MODE);
-+    if (entry.count == 1) {
-+        awbControls.awbMode = entry.data.u8[0];
-+    }
-+
-+    entry = metadata.find(ANDROID_CONTROL_AWB_LOCK);
-+    if (entry.count == 1) {
-+        awbControls.awbLock = entry.data.u8[0];
-+    }
-+
-+    mIntelAWBStateMachine->processState(controlMode, sceneMode, awbControls);
-+
-+    // get AWB state
-+    icamera::camera_awb_state_t awbState = icamera::AWB_STATE_NOT_CONVERGED;
-+    parameter.getAwbState(awbState);
-+    mIntelAWBStateMachine->processResult(awbState == icamera::AWB_STATE_CONVERGED, metadata);
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3AMetadata.h b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
-new file mode 100644
-index 000000000000..0162ba083bec
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3AMetadata.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "IntelAFStateMachine.h"
-+#include "IntelAEStateMachine.h"
-+#include "IntelAWBStateMachine.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \class Camera3AMetadata
-+ *
-+ * This class is used to handle 3A related metadata. It also returns
-+ * 3A state.
-+ */
-+class Camera3AMetadata {
-+
-+public:
-+    Camera3AMetadata(int cameraId);
-+    ~Camera3AMetadata();
-+
-+    void process3Astate(const icamera::Parameters &parameter, android::CameraMetadata &metadata);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(Camera3AMetadata);
-+
-+private:
-+    int mCameraId;
-+
-+    IntelAFStateMachine *mIntelAFStateMachine;
-+    IntelAEStateMachine *mIntelAEStateMachine;
-+    IntelAWBStateMachine *mIntelAWBStateMachine;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.cpp b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
-new file mode 100644
-index 000000000000..5526428ac16c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3HAL.cpp
-@@ -0,0 +1,282 @@
-+/*
-+ * Copyright (C) 2017-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Camera3HAL"
-+
-+#include <memory>
-+
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "ICamera.h"
-+
-+#include "Camera3HAL.h"
-+#include "HALv3Utils.h"
-+
-+namespace camera3 {
-+
-+/******************************************************************************
-+ *  C DEVICE INTERFACE IMPLEMENTATION WRAPPER
-+ *****************************************************************************/
-+
-+//Common check before the function call
-+#define FUNCTION_PREPARED_RETURN \
-+    if (!dev)\
-+        return -EINVAL;\
-+    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(dev->priv);
-+
-+static int
-+hal_dev_initialize(const struct camera3_device * dev,
-+                   const camera3_callback_ops_t *callback_ops)
-+{
-+    LOG1("@%s", __func__);
-+
-+    FUNCTION_PREPARED_RETURN
-+
-+    return camera_priv->initialize(callback_ops);
-+}
-+
-+static int
-+hal_dev_configure_streams(const struct camera3_device * dev,
-+                          camera3_stream_configuration_t *stream_list)
-+{
-+    LOG1("@%s", __func__);
-+
-+    FUNCTION_PREPARED_RETURN
-+
-+    return camera_priv->configure_streams(stream_list);
-+}
-+
-+static const camera_metadata_t*
-+hal_dev_construct_default_request_settings(const struct camera3_device * dev,
-+                                           int type)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (!dev)
-+        return nullptr;
-+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
-+
-+    return camera_priv->construct_default_request_settings(type);
-+}
-+
-+static int
-+hal_dev_process_capture_request(const struct camera3_device * dev,
-+                                camera3_capture_request_t *request)
-+{
-+    LOG1("@%s", __func__);
-+
-+    FUNCTION_PREPARED_RETURN
-+
-+    return camera_priv->process_capture_request(request);
-+}
-+
-+static void
-+hal_dev_dump(const struct camera3_device * dev, int fd)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (!dev)
-+        return;
-+
-+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
-+
-+    camera_priv->dump(fd);
-+}
-+
-+static int
-+hal_dev_flush(const struct camera3_device * dev)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (!dev)
-+        return -EINVAL;
-+
-+    Camera3HAL* camera_priv = (Camera3HAL*)(dev->priv);
-+    return camera_priv->flush();
-+}
-+
-+static camera3_device_ops hal_dev_ops = {
-+    .initialize                         = hal_dev_initialize,
-+    .configure_streams                  = hal_dev_configure_streams,
-+    .register_stream_buffers            = nullptr,
-+    .construct_default_request_settings = hal_dev_construct_default_request_settings,
-+    .process_capture_request            = hal_dev_process_capture_request,
-+    .get_metadata_vendor_tag_ops        = nullptr,
-+    .dump                               = hal_dev_dump,
-+    .flush                              = hal_dev_flush,
-+    .reserved                           = {0},
-+};
-+
-+/******************************************************************************
-+ *  C++ CLASS IMPLEMENTATION
-+ *****************************************************************************/
-+Camera3HAL::Camera3HAL(int cameraId, const hw_module_t* module) :
-+    mCameraId(cameraId),
-+    mInitialized(false)
-+{
-+    LOG1("@%s", __func__);
-+
-+    mDevice = {};
-+    mDevice.common.tag = HARDWARE_DEVICE_TAG;
-+    mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_3;
-+    mDevice.common.module = (hw_module_t *)(module);
-+    // hal_dev_close is kept in the module for symmetry with dev_open
-+    // it will be set there
-+    mDevice.common.close = nullptr;
-+    mDevice.ops = &hal_dev_ops;
-+    mDevice.priv = this;
-+
-+    int ret = icamera::camera_hal_init();
-+    CheckError(ret != icamera::OK, VOID_VALUE, "@%s, camera_hal_init fails, ret:%d", __func__, ret);
-+
-+    ret = icamera::camera_device_open(cameraId);
-+    if (ret != icamera::OK) {
-+        LOGE("@%s, camera_device_open fails, ret:%d", __func__, ret);
-+
-+        icamera::camera_device_close(cameraId);
-+        icamera::camera_hal_deinit();
-+
-+        return;
-+    }
-+
-+    mRequestManager = std::unique_ptr<RequestManager>(new RequestManager(cameraId));
-+
-+    mInitialized = true;
-+}
-+
-+Camera3HAL::~Camera3HAL()
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (mRequestManager) {
-+        mRequestManager->flush();
-+        mRequestManager->deinit();
-+
-+        mRequestManager.reset(); // mRequestManager must be released before device deinit
-+    }
-+
-+    icamera::camera_device_close(mCameraId);
-+    icamera::camera_hal_deinit();
-+}
-+
-+/* *********************************************************************
-+ * Camera3 device  APIs
-+ * ********************************************************************/
-+int Camera3HAL::initialize(const camera3_callback_ops_t *callback_ops)
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, -ENODEV, "@%s, mInitialized is false", __func__);
-+    int status = icamera::OK;
-+
-+    if (callback_ops == nullptr)
-+        return -ENODEV;
-+
-+    status = mRequestManager->init(callback_ops);
-+    if (status != icamera::OK) {
-+        LOGE("Error register callback status = %d", status);
-+        return -ENODEV;
-+    }
-+    return status;
-+}
-+
-+int Camera3HAL::configure_streams(camera3_stream_configuration_t *stream_list)
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
-+    CheckError(!stream_list, -EINVAL, "@%s, stream_list is nullptr", __func__);
-+
-+    if (!stream_list->streams || !stream_list->num_streams) {
-+        LOGE("%s: Bad input! streams list ptr: %p, num %d", __func__,
-+            stream_list->streams, stream_list->num_streams);
-+        return -EINVAL;
-+    }
-+    int num = stream_list->num_streams;
-+    LOG2("@%s, stream num:%d", __func__, num);
-+    while (num--) {
-+        if (!stream_list->streams[num]){
-+            LOGE("%s: Bad input! streams (%d) 's ptr: %p", __func__,
-+                num, stream_list->streams[num]);
-+            return -EINVAL;
-+        }
-+    }
-+
-+    int status = mRequestManager->configureStreams(stream_list);
-+    return (status == icamera::OK) ? 0 : -EINVAL;
-+}
-+
-+const camera_metadata_t* Camera3HAL::construct_default_request_settings(int type)
-+{
-+    LOG1("@%s, type:%d", __func__, type);
-+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    if (type < CAMERA3_TEMPLATE_PREVIEW || type >= CAMERA3_TEMPLATE_COUNT)
-+        return nullptr;
-+
-+    const camera_metadata_t * meta = nullptr;
-+    int status = mRequestManager->constructDefaultRequestSettings(type, &meta);
-+    CheckError(status != icamera::OK, nullptr, "construct default request setting error");
-+
-+    return meta;
-+}
-+
-+int Camera3HAL::process_capture_request(camera3_capture_request_t *request)
-+{
-+    LOG2("@%s", __func__);
-+    CheckError(!mInitialized, -EINVAL, "@%s, mInitialized is false", __func__);
-+
-+    if (request == nullptr) {
-+        LOGE("%s: request is null!", __func__);
-+        return -EINVAL;
-+    } else if (!request->num_output_buffers || request->output_buffers == nullptr) {
-+        LOGE("%s: num_output_buffers %d, output_buffers %p", __func__,
-+              request->num_output_buffers, request->output_buffers);
-+        return -EINVAL;
-+    } else if (request->output_buffers->stream == nullptr) {
-+        LOGE("%s: output_buffers->stream is null!", __func__);
-+        return -EINVAL;
-+    } else if (request->output_buffers->stream->priv == nullptr) {
-+        LOGE("%s: output_buffers->stream->priv is null!", __func__);
-+        return -EINVAL;
-+    } else if (request->output_buffers->buffer == nullptr
-+          || *(request->output_buffers->buffer) == nullptr) {
-+        LOGE("%s: output buffer is invalid", __func__);
-+        return -EINVAL;
-+    }
-+
-+    int status = mRequestManager->processCaptureRequest(request);
-+    if (status == icamera::OK)
-+        return icamera::OK;
-+
-+    return (status == icamera::BAD_VALUE) ? -EINVAL : -ENODEV;
-+}
-+
-+void Camera3HAL::dump(int fd)
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    mRequestManager->dump(fd);
-+}
-+
-+int Camera3HAL::flush()
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, icamera::UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    return mRequestManager->flush();
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3HAL.h b/camera/hal/intel/ipu6/aal/Camera3HAL.h
-new file mode 100644
-index 000000000000..5a9f81ff7914
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3HAL.h
-@@ -0,0 +1,69 @@
-+/*
-+ * Copyright (C) 2018-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <hardware/camera3.h>
-+
-+#include <memory>
-+
-+#include "RequestManager.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \class Camera3HAL
-+ *
-+ * This class represents a single HAL device instance. It has the following
-+ * roles:
-+ * - It implements the camera3_device_ops_t  API  defined by Android.
-+ * - It instantiates RequestManager.
-+ */
-+class Camera3HAL : public camera3_device_ops_t {
-+
-+public:
-+    Camera3HAL(int cameraId, const hw_module_t* module);
-+    virtual ~Camera3HAL();
-+    bool isInitialized() { return mInitialized; }
-+    camera3_device_t* getDeviceStruct() { return &mDevice; }
-+    int getCameraId() { return mCameraId; };
-+
-+    /**********************************************************************
-+     * camera3_device_ops_t implementation
-+     */
-+    int initialize(const camera3_callback_ops_t *callback_ops);
-+
-+    int configure_streams(camera3_stream_configuration_t *stream_list);
-+
-+    const camera_metadata_t* construct_default_request_settings(int type);
-+
-+    int process_capture_request(camera3_capture_request_t *request);
-+
-+    void get_metadata_vendor_tag_ops(vendor_tag_query_ops_t *ops);
-+
-+    void dump(int fd);
-+
-+    int flush();
-+
-+private:
-+    int mCameraId;
-+    std::unique_ptr<RequestManager> mRequestManager;
-+    camera3_device_t   mDevice;
-+
-+    bool mInitialized;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
-new file mode 100644
-index 000000000000..8416b93a00bb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3HALModule.cpp
-@@ -0,0 +1,233 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "Camera3HALModule"
-+
-+#include <mutex>
-+#include <hardware/camera3.h>
-+#include <hardware/hardware.h>
-+
-+#include "iutils/CameraDump.h"
-+#include "Utils.h"
-+#include "ICamera.h"
-+
-+#include "MetadataConvert.h"
-+#include "Camera3HAL.h"
-+#include "HALv3Utils.h"
-+
-+namespace camera3 {
-+
-+#define MAX_CAMERAS 2
-+
-+/**
-+ * \macro VISIBILITY_PUBLIC
-+ *
-+ * Controls the visibility of symbols in the shared library.
-+ * In production builds all symbols in the shared library are hidden
-+ * except the ones using this linker attribute.
-+ */
-+#define VISIBILITY_PUBLIC __attribute__ ((visibility ("default")))
-+
-+static int hal_dev_close(hw_device_t* device);
-+
-+/**********************************************************************
-+ * Camera Module API (C API)
-+ **********************************************************************/
-+
-+static bool sInstances[MAX_CAMERAS] = {false, false};
-+static int sInstanceCount = 0;
-+// sCameraMetadata buffer won't be free in CAL
-+static android::CameraMetadata *sCameraMetadata[MAX_CAMERAS] = { nullptr };
-+
-+/**
-+ * Global mutex used to protect sInstanceCount and sInstances
-+ */
-+static std::mutex sCameraHalMutex;
-+
-+int openCameraHardware(int id, const hw_module_t* module, hw_device_t** device)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (sInstances[id])
-+        return 0;
-+
-+    Camera3HAL* halDev = new Camera3HAL(id, module);
-+    if (!halDev->isInitialized()) {
-+        LOGE("HAL initialization fail!");
-+        delete halDev;
-+        return -EINVAL;
-+    }
-+    camera3_device_t *cam3Device = halDev->getDeviceStruct();
-+
-+    cam3Device->common.close = hal_dev_close;
-+    *device = &cam3Device->common;
-+
-+    sInstanceCount++;
-+    sInstances[id] = true;
-+
-+    LOG1("@%s end", __func__);
-+    return 0;
-+}
-+
-+static int hal_get_number_of_cameras(void)
-+{
-+    LOG1("@%s", __func__);
-+
-+    return icamera::get_number_of_cameras();
-+}
-+
-+static int hal_get_camera_info(int cameraId, struct camera_info *cameraInfo)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (cameraId < 0 || !cameraInfo ||
-+          cameraId >= hal_get_number_of_cameras())
-+        return -EINVAL;
-+
-+    icamera::camera_info_t info;
-+    icamera::get_camera_info(cameraId, info);
-+
-+    if (sCameraMetadata[cameraId] == nullptr) {
-+        sCameraMetadata[cameraId] = new android::CameraMetadata;
-+        MetadataConvert::HALCapabilityToStaticMetadata(*(info.capability),
-+                                                       sCameraMetadata[cameraId]);
-+    }
-+    int32_t tag = ANDROID_LENS_FACING;
-+    camera_metadata_entry entry = sCameraMetadata[cameraId]->find(tag);
-+    if (entry.count == 1) {
-+        info.facing = entry.data.u8[0];
-+    }
-+    tag = ANDROID_SENSOR_ORIENTATION;
-+    entry = sCameraMetadata[cameraId]->find(tag);
-+    if (entry.count == 1) {
-+        info.orientation = entry.data.u8[0];
-+    }
-+    memset(cameraInfo, 0, sizeof(camera_info));
-+    cameraInfo->facing = info.facing ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT;
-+    cameraInfo->device_version = CAMERA_DEVICE_API_VERSION_3_3;
-+    cameraInfo->orientation = info.orientation;
-+    const camera_metadata_t *settings = sCameraMetadata[cameraId]->getAndLock();
-+    cameraInfo->static_camera_characteristics = settings;
-+    sCameraMetadata[cameraId]->unlock(settings);
-+
-+    return 0;
-+}
-+
-+static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)
-+{
-+    LOG1("@%s", __func__);
-+
-+    UNUSED(callbacks);
-+    return 0;
-+}
-+
-+static int hal_dev_open(const hw_module_t* module, const char* name,
-+                        hw_device_t** device)
-+{
-+    icamera::Log::setDebugLevel();
-+    icamera::CameraDump::setDumpLevel();
-+
-+    LOG1("@%s", __func__);
-+
-+    int status = -EINVAL;
-+    int camera_id;
-+
-+    if (!name || !module || !device) {
-+        LOGE("Camera name is nullptr");
-+        return status;
-+    }
-+
-+    LOG1("%s, camera id: %s", __func__, name);
-+    camera_id = atoi(name);
-+    if (camera_id < 0 || camera_id >= hal_get_number_of_cameras()) {
-+        LOGE("%s: Camera id %d is out of bounds, num. of cameras (%d)",
-+             __func__, camera_id, hal_get_number_of_cameras());
-+        return -ENODEV;
-+    }
-+
-+    std::lock_guard<std::mutex> l(sCameraHalMutex);
-+
-+    if (sInstanceCount > 0 && sInstances[camera_id]) {
-+        LOGW("Camera already has been opened!");
-+        return -EUSERS;
-+    }
-+
-+    return openCameraHardware(camera_id, module, device);
-+}
-+
-+static int hal_dev_close(hw_device_t* device)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (!device || sInstanceCount == 0) {
-+        LOGW("hal close, instance count %d", sInstanceCount);
-+        return -EINVAL;
-+    }
-+
-+    camera3_device_t *camera3_dev = (struct camera3_device *)device;
-+    Camera3HAL* camera_priv = static_cast<Camera3HAL*>(camera3_dev->priv);
-+
-+    if (camera_priv != nullptr) {
-+        std::lock_guard<std::mutex> l(sCameraHalMutex);
-+        int id = camera_priv->getCameraId();
-+        delete camera_priv;
-+        sInstanceCount--;
-+        sInstances[id] = false;
-+    }
-+
-+    LOG1("%s, instance count %d", __func__, sInstanceCount);
-+
-+    return 0;
-+}
-+
-+static int hal_set_torch_mode (const char* camera_id, bool enabled){
-+    LOG1("@%s", __func__);
-+
-+    UNUSED(camera_id);
-+    UNUSED(enabled);
-+    return -ENOSYS;
-+}
-+
-+static struct hw_module_methods_t hal_module_methods = {
-+    .open = hal_dev_open
-+};
-+
-+static hw_module_t camera_common = {
-+    .tag                = HARDWARE_MODULE_TAG,
-+    .module_api_version = CAMERA_MODULE_API_VERSION_2_3,
-+    .hal_api_version    = HARDWARE_HAL_API_VERSION,
-+    .id                 = CAMERA_HARDWARE_MODULE_ID,
-+    .name               = "Intel Camera3HAL Module",
-+    .author             = "Intel",
-+    .methods            = &hal_module_methods,
-+    .dso                = nullptr,
-+    .reserved           = {0}
-+};
-+
-+extern "C" {
-+camera_module_t VISIBILITY_PUBLIC HAL_MODULE_INFO_SYM = {
-+    .common                = camera_common,
-+    .get_number_of_cameras = hal_get_number_of_cameras,
-+    .get_camera_info       = hal_get_camera_info,
-+    .set_callbacks         = hal_set_callbacks,
-+    .get_vendor_tag_ops    = nullptr,
-+    .open_legacy           = nullptr,
-+    .set_torch_mode        = hal_set_torch_mode,
-+    .init                  = nullptr,
-+    .reserved              = {0}
-+};
-+}
-+
-+} //namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.cpp b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
-new file mode 100644
-index 000000000000..178b616ba7bb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
-@@ -0,0 +1,407 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Camera3Stream"
-+
-+#include "stdlib.h"
-+
-+#include "Errors.h"
-+#include "Utils.h"
-+#include "ICamera.h"
-+
-+#include "HALv3Utils.h"
-+
-+#include "MetadataConvert.h"
-+#include "Camera3Stream.h"
-+#include "CameraDump.h"
-+#include "PlatformData.h"
-+
-+namespace camera3 {
-+Camera3Stream::Camera3Stream(int cameraId, CallbackEventInterface *callback,
-+                             uint32_t maxNumReqInProc, const icamera::stream_t &halStream,
-+                             const camera3_stream_t &stream,
-+                             const camera3_stream_t *inputStream) :
-+    mCameraId(cameraId),
-+    mEventCallback(callback),
-+    mPostProcessType(icamera::POST_PROCESS_NONE),
-+    mStreamState(false),
-+    mHALStream(halStream),
-+    mMaxNumReqInProc(maxNumReqInProc),
-+    mPostProcessBufPool(nullptr),
-+    mStream(stream),
-+    mFaceDetection(nullptr),
-+    mFDRunDefaultInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
-+    mFDRunIntervalNoFace(icamera::PlatformData::faceEngineRunningIntervalNoFace(cameraId)),
-+    mFDRunInterval(icamera::PlatformData::faceEngineRunningInterval(cameraId)),
-+    mFrameCnt(0),
-+    mInputPostProcessType(icamera::POST_PROCESS_NONE)
-+{
-+    LOG1("[%d]@%s, mMaxNumReqInProc:%d, inputStream:%p, stream:%dx%d, format:%d, type:%d",
-+         mHALStream.id, __func__, mMaxNumReqInProc, inputStream,
-+         mHALStream.width, mHALStream.height, mHALStream.format, mStream.stream_type);
-+
-+    mPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
-+    mPostProcessBufPool = std::unique_ptr<Camera3BufferPool>(new Camera3BufferPool());
-+
-+    if (inputStream) {
-+        LOG2("@%s, inputStream: width:%d, height:%d, format:%d", __func__,
-+             inputStream->width, inputStream->height, inputStream->format);
-+
-+        mInputPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
-+        mInputStream = std::unique_ptr<camera3_stream_t>(new camera3_stream_t);
-+        *mInputStream = *inputStream;
-+    }
-+
-+    LOG2("@%s, mFaceDetection:%p, mFDRunDefaultInterval:%d, mFDRunIntervalNoFace:%d",
-+         __func__, mFaceDetection, mFDRunDefaultInterval, mFDRunIntervalNoFace);
-+}
-+
-+Camera3Stream::~Camera3Stream()
-+{
-+    LOG1("[%d]@%s", mHALStream.id, __func__);
-+
-+    setActive(false);
-+
-+    for (auto& buf : mBuffers) {
-+        buf.second->unlock();
-+    }
-+
-+    mBuffers.clear();
-+    std::lock_guard<std::mutex> l(mLock);
-+    mCaptureResultVector.clear();
-+}
-+
-+void Camera3Stream::sendEvent(const icamera::camera_msg_data_t &data) {
-+    LOG2("@%s receive sof event: %ld", __func__, data.data.buffer_ready.timestamp);
-+
-+    std::lock_guard<std::mutex> sofLock(mSofLock);
-+    mSofCondition.notify_one();
-+}
-+
-+void Camera3Stream::handleSofAlignment() {
-+    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId))
-+        return;
-+
-+    std::unique_lock<std::mutex> sofLock(mSofLock);
-+    std::cv_status ret = mSofCondition.wait_for(sofLock,
-+        std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
-+
-+    if (ret == std::cv_status::timeout) {
-+        LOGW("%s, [%d] wait sof timeout, skip alignment this time", __func__, mHALStream.id);
-+    }
-+    LOG2("%s, [%d] running post processing align with sof event", __func__, mHALStream.id);
-+}
-+
-+bool Camera3Stream::threadLoop()
-+{
-+    LOG1("[%d]@%s", mHALStream.id, __func__);
-+
-+    std::shared_ptr<CaptureResult> result = nullptr;
-+    {
-+    std::unique_lock<std::mutex> lock(mLock);
-+    // check if there is buffer queued
-+    if (mCaptureResultVector.empty()) {
-+        std::cv_status ret = mBufferDoneCondition.wait_for(
-+                lock,
-+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
-+        if (ret == std::cv_status::timeout) {
-+            LOGW("[%d]%s, wait request time out", mHALStream.id, __func__);
-+        }
-+
-+        return true;
-+    }
-+    result = mCaptureResultVector.at(0);
-+    }
-+
-+    // dequeue buffer from HAL
-+    icamera::camera_buffer_t *buffer = nullptr;
-+    icamera::Parameters parameter;
-+
-+    std::shared_ptr<Camera3Buffer> inputCam3Buf = result->inputCam3Buf;
-+
-+    if (!inputCam3Buf) {
-+        int ret = icamera::camera_stream_dqbuf(mCameraId, mHALStream.id, &buffer, &parameter);
-+        CheckError(ret != icamera::OK || !buffer,
-+                   true, "[%d]failed to dequeue buffer, ret %d", mHALStream.id, ret);
-+
-+        LOG2("%s, buffer->timestamp:%lld", __func__, buffer->timestamp);
-+    }
-+
-+    {
-+    std::unique_lock<std::mutex> lock(mLock);
-+    mCaptureResultVector.erase(mCaptureResultVector.begin());
-+    }
-+
-+    buffer_handle_t handle = result->handle;
-+    std::shared_ptr<Camera3Buffer> ccBuf = nullptr;
-+    {
-+    std::unique_lock<std::mutex> lock(mLock);
-+    CheckError(mBuffers.find(handle) == mBuffers.end(), false, "can't find handle %p", handle);
-+
-+    ccBuf = mBuffers[handle];
-+    mBuffers.erase(handle);
-+    CheckError(ccBuf == nullptr, false, "ccBuf is nullptr");
-+    }
-+
-+    int dumpOutputFmt = V4L2_PIX_FMT_NV12;
-+    if (!inputCam3Buf && mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
-+        LOG2("%s, hal buffer: %p, ccBuf address: %p", __func__, buffer->addr, ccBuf->data());
-+        // handle normal postprocess
-+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
-+            LOG2("[%d]%s Post processing buffer.", mHALStream.id, __func__);
-+
-+            handleSofAlignment();
-+            LOG2("%s, do software postProcessing for sequence: %ld", __func__, buffer->sequence);
-+            std::shared_ptr<Camera3Buffer> inBuf = mPostProcessBufPool->findBuffer(buffer->addr);
-+            CheckError(!inBuf, false, "failed to find the buffer in still pool");
-+
-+            icamera::status_t status = mPostProcessor->doPostProcessing(inBuf, parameter, ccBuf);
-+            CheckError(status != icamera::OK, true, "@%s, doPostProcessing fails, mPostProcessType:%d",
-+                  __func__, mPostProcessType);
-+
-+            // return internal buffer after post processing
-+            LOG2("return buffer:%p add:%p after post processing", buffer, buffer->addr);
-+            mPostProcessBufPool->returnBuffer(inBuf);
-+        }
-+        if (mPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
-+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
-+        }
-+    } else if (inputCam3Buf) {
-+        parameter = result->param;
-+
-+        inputCam3Buf->dumpImage(result->frameNumber, icamera::DUMP_AAL_INPUT, V4L2_PIX_FMT_NV12);
-+        if (mInputPostProcessType != icamera::POST_PROCESS_NONE) {
-+            icamera::status_t status = mInputPostProcessor->doPostProcessing(inputCam3Buf, parameter, ccBuf);
-+            CheckError(status != icamera::OK, true, "@%s, doPostProcessing fails, mInputPostProcessType:%d",
-+                  __func__, mInputPostProcessType);
-+        } else {
-+            MEMCPY_S(ccBuf->data(), ccBuf->size(), inputCam3Buf->data(), inputCam3Buf->size());
-+        }
-+
-+        if (mInputPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
-+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
-+        }
-+    }
-+
-+    faceRunningByCondition(ccBuf->getHalBuffer());
-+
-+    ccBuf->dumpImage(result->frameNumber, icamera::DUMP_AAL_OUTPUT, dumpOutputFmt);
-+    ccBuf->unlock();
-+    ccBuf->deinit();
-+    ccBuf->getFence(&result->outputBuffer);
-+
-+    // notify shutter done
-+    if (inputCam3Buf || mHALStream.usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
-+        ShutterEvent shutterEvent = {result->frameNumber, inputCam3Buf ? 0 : buffer->timestamp};
-+        mEventCallback->shutterDone(shutterEvent);
-+    }
-+
-+    // notify frame done
-+    BufferEvent bufferEvent = {};
-+    bufferEvent.frameNumber = result->frameNumber;
-+    if (!inputCam3Buf) {
-+        bufferEvent.timestamp = buffer->timestamp;
-+    }
-+    bufferEvent.parameter = &parameter;
-+    bufferEvent.outputBuffer = &result->outputBuffer;
-+
-+    mEventCallback->bufferDone(bufferEvent);
-+
-+    return true;
-+}
-+
-+void Camera3Stream::faceRunningByCondition(const icamera::camera_buffer_t &buffer) {
-+    if (!mFaceDetection)
-+        return;
-+
-+    LOG2("[%d]@%s", mHALStream.id, __func__);
-+
-+    /*
-+       FD runs 1 frame every mFDRunInterval frames.
-+       And the default value of mFDRunInterval is mFDRunDefaultInterval
-+    */
-+    if (mFrameCnt % mFDRunInterval == 0) {
-+        mFaceDetection->runFaceDetection(buffer);
-+    }
-+
-+    /*
-+       When face doesn't be detected during mFDRunIntervalNoFace's frame,
-+       we may change FD running's interval frames.
-+    */
-+    if (mFDRunIntervalNoFace > mFDRunDefaultInterval) {
-+        static unsigned int noFaceCnt = 0;
-+        int faceNum = mFaceDetection->getFaceNum();
-+
-+        /*
-+           The purpose of changing the value of the variable is to run FD immediately when face
-+           is detected.
-+        */
-+        if (faceNum == 0) {
-+            if (mFDRunInterval != mFDRunIntervalNoFace) {
-+                noFaceCnt = ++noFaceCnt % mFDRunIntervalNoFace;
-+                if (noFaceCnt == 0) {
-+                    mFDRunInterval = mFDRunIntervalNoFace;
-+                }
-+            }
-+        } else {
-+           if (mFDRunInterval != mFDRunDefaultInterval) {
-+                mFDRunInterval = mFDRunDefaultInterval;
-+                mFrameCnt =  mFDRunInterval - 1;
-+                noFaceCnt = 0;
-+            }
-+        }
-+    }
-+
-+    mFrameCnt = ++mFrameCnt % mFDRunInterval;
-+}
-+
-+void Camera3Stream::requestExit()
-+{
-+    LOG1("[%d]@%s", mHALStream.id, __func__);
-+
-+    icamera::Thread::requestExit();
-+    std::lock_guard<std::mutex> l(mLock);
-+    mBufferDoneCondition.notify_one();
-+
-+    if (mFaceDetection) {
-+        icamera::FaceDetection::destoryInstance(mCameraId);
-+        mFaceDetection = nullptr;
-+    }
-+}
-+
-+int Camera3Stream::processRequest(const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
-+                                  const camera3_stream_buffer_t &outputBuffer,
-+                                  icamera::camera_buffer_t *buffer)
-+{
-+    LOG1("[%d]@%s", mHALStream.id, __func__);
-+
-+    std::shared_ptr<Camera3Buffer> ccBuf = std::make_shared<Camera3Buffer>();
-+    buffer_handle_t handle = *outputBuffer.buffer;
-+
-+    {
-+    std::unique_lock<std::mutex> lock(mLock);
-+    CheckError(mBuffers.find(handle) != mBuffers.end(), icamera::BAD_VALUE,
-+               "handle %p is duplicated!", handle);
-+
-+    mBuffers[handle] = ccBuf;
-+    }
-+
-+    icamera::status_t status = ccBuf->init(&outputBuffer, mCameraId);
-+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
-+    status = ccBuf->waitOnAcquireFence();
-+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
-+    status = ccBuf->lock();
-+    CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
-+
-+    if (inputCam3Buf) {
-+        return icamera::OK;
-+    }
-+
-+    *buffer = ccBuf->getHalBuffer();
-+    if (mPostProcessType != icamera::POST_PROCESS_NONE) {
-+        std::shared_ptr<Camera3Buffer> buf = mPostProcessBufPool->acquireBuffer();
-+        CheckError(buf == nullptr, icamera::BAD_VALUE, "no available internal buffer for still");
-+
-+        *buffer = buf->getHalBuffer();
-+    }
-+    LOG2("@%s [%d] buffer:%p addr: %p, fd: %d",
-+         __func__, mHALStream.id, buffer, buffer->addr, buffer->dmafd);
-+
-+    // Fill the specific setting
-+    buffer->s.usage = mHALStream.usage;
-+    buffer->s.id = mHALStream.id;
-+
-+    return icamera::OK;
-+}
-+
-+void Camera3Stream::queueBufferDone(uint32_t frameNumber,
-+                                    const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
-+                                    const camera3_stream_buffer_t &outputBuffer,
-+                                    const icamera::Parameters &param)
-+{
-+    LOG1("[%d]@%s, frameNumber:%d", mHALStream.id, __func__, frameNumber);
-+
-+    std::lock_guard<std::mutex> l(mLock);
-+
-+    std::shared_ptr<CaptureResult> result = std::make_shared<CaptureResult>();
-+    result->frameNumber = frameNumber;
-+    result->outputBuffer = outputBuffer;
-+    result->handle = *outputBuffer.buffer;
-+    result->outputBuffer.buffer = &result->handle;
-+    result->inputCam3Buf = inputCam3Buf;
-+    result->param = param;
-+
-+    mCaptureResultVector.push_back(result);
-+    mBufferDoneCondition.notify_one();
-+}
-+
-+int Camera3Stream::setActive(bool state)
-+{
-+    LOG1("[%d]@%s state %d", mHALStream.id, __func__, state);
-+
-+    if (!mStreamState && state) {
-+        std::string threadName = "Cam3Stream-";
-+        threadName += std::to_string(mHALStream.id);
-+
-+        // Run Camera3Stream thread
-+        run(threadName);
-+
-+        if (mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW) {
-+            // configure the post processing.
-+            // Note: the mHALStream may be changed after calling this function
-+            mPostProcessor->configure(mStream, mHALStream);
-+            mPostProcessType = mPostProcessor->getPostProcessType();
-+            LOG2("@%s, mPostProcessType:%d", __func__, mPostProcessType);
-+        }
-+
-+        // Allocate local buffer pool for post-processing
-+        int ret = icamera::OK;
-+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
-+            ret = mPostProcessBufPool->createBufferPool(mCameraId, mMaxNumReqInProc, mHALStream);
-+            CheckError(ret != icamera::OK, icamera::NO_MEMORY, "Failed to create buffer pool for post processor");
-+        }
-+
-+        if (mInputPostProcessor) {
-+            mInputPostProcessor->configure(mStream, *mInputStream.get());
-+            mInputPostProcessType = mInputPostProcessor->getPostProcessType();
-+        }
-+    } else if (mStreamState && !state) {
-+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
-+            mPostProcessBufPool->destroyBufferPool();
-+            mPostProcessType = icamera::POST_PROCESS_NONE;
-+        }
-+
-+        if (mInputPostProcessor) {
-+            mInputPostProcessType = icamera::POST_PROCESS_NONE;
-+        }
-+
-+        // Exit Camera3Stream thread
-+        requestExit();
-+    }
-+
-+    mStreamState = state;
-+
-+    return icamera::OK;
-+}
-+
-+void Camera3Stream::activateFaceDetection(unsigned int maxFaceNum)
-+{
-+    LOG1("[%d]@%s maxFaceNum %d, mCameraId %d", mHALStream.id, __func__, maxFaceNum, mCameraId);
-+
-+    mFaceDetection = icamera::FaceDetection::createInstance(mCameraId, maxFaceNum, mHALStream.id);
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/Camera3Stream.h b/camera/hal/intel/ipu6/aal/Camera3Stream.h
-new file mode 100644
-index 000000000000..f90103c070dc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.h
-@@ -0,0 +1,139 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <mutex>
-+#include <vector>
-+#include <map>
-+#include <unordered_map>
-+
-+#include "FaceDetection.h"
-+#include <hardware/camera3.h>
-+#include "PostProcessor.h"
-+#include "ResultProcessor.h"
-+#include "Thread.h"
-+#include "Camera3BufferPool.h"
-+
-+namespace camera3 {
-+
-+struct CaptureResult {
-+    uint32_t frameNumber;
-+    camera3_stream_buffer_t outputBuffer;
-+    buffer_handle_t handle;
-+    std::shared_ptr<Camera3Buffer> inputCam3Buf;
-+    icamera::Parameters param;
-+};
-+
-+/**
-+ * \class InternalBufferPool
-+ *
-+ * This class is used to manage a local memory pool for still and post processing stream
-+ * It needs to follow the calling sequence:
-+ * allocBuffers -> acquireBuffer -> findBuffer -> returnBuffer
-+ */
-+class InternalBufferPool {
-+
-+public:
-+    InternalBufferPool();
-+    ~InternalBufferPool();
-+
-+    icamera::status_t allocBuffers(const icamera::stream_t &stream, uint32_t numBuffers, int cameraId);
-+    void destroyBuffers();
-+    std::shared_ptr<Camera3Buffer> acquireBuffer();
-+    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
-+    std::shared_ptr<Camera3Buffer> findBuffer(void *memAddr);
-+
-+private:
-+    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool> mInterBuf; // first: camera3Buffer, second: busy
-+    std::mutex  mLock;
-+};
-+
-+/**
-+ * \class Camera3Stream
-+ *
-+ * This class is used to handle requests. It has the following
-+ * roles:
-+ * - It instantiates PostProcessor.
-+ */
-+class Camera3Stream : public icamera::Thread {
-+
-+public:
-+    Camera3Stream(int cameraId, CallbackEventInterface *callback,
-+                  uint32_t maxNumReqInProc, const icamera::stream_t &halStream,
-+                  const camera3_stream_t &stream,
-+                  const camera3_stream_t *inputStream = nullptr);
-+    virtual ~Camera3Stream();
-+
-+    virtual bool threadLoop();
-+    virtual void requestExit();
-+
-+    int processRequest(const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
-+                       const camera3_stream_buffer_t &outputBuffer,
-+                       icamera::camera_buffer_t *buffer);
-+
-+    void queueBufferDone(uint32_t frameNumber,
-+                         const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
-+                         const camera3_stream_buffer_t &outputBuffer,
-+                         const icamera::Parameters& param);
-+    int setActive(bool state);
-+    bool isActive() { return mStreamState; }
-+    void activateFaceDetection(unsigned int maxFaceNum);
-+    int getPostProcessType() { return mPostProcessType; }
-+    void sendEvent(const icamera::camera_msg_data_t &data);
-+
-+ private:
-+    void handleSofAlignment();
-+
-+private:
-+    const uint64_t kMaxDuration = 2000000000; // 2000ms
-+
-+    int mCameraId;
-+    std::condition_variable mBufferDoneCondition;
-+    std::mutex mLock;
-+
-+    std::condition_variable mSofCondition;
-+    std::mutex mSofLock;
-+
-+    CallbackEventInterface *mEventCallback;
-+
-+    int mPostProcessType;
-+    std::unique_ptr<PostProcessor> mPostProcessor;
-+
-+    bool mStreamState;
-+    icamera::stream_t  mHALStream;
-+    uint32_t           mMaxNumReqInProc;
-+    std::unique_ptr<Camera3BufferPool> mPostProcessBufPool;
-+
-+    camera3_stream_t mStream;
-+
-+    std::vector<std::shared_ptr<CaptureResult>> mCaptureResultVector;
-+    std::map<buffer_handle_t, std::shared_ptr<Camera3Buffer>> mBuffers;
-+
-+    icamera::FaceDetection *mFaceDetection;
-+    unsigned int mFDRunDefaultInterval; // FD running's interval frames.
-+    unsigned int mFDRunIntervalNoFace; // FD running's interval frames without face.
-+    unsigned int mFDRunInterval; // run 1 frame every mFDRunInterval frames.
-+    unsigned int mFrameCnt; // from 0 to (mFDRunInterval - 1).
-+
-+    int mInputPostProcessType;
-+    std::unique_ptr<PostProcessor> mInputPostProcessor;
-+    std::unique_ptr<camera3_stream_t> mInputStream;
-+
-+    void faceRunningByCondition(const icamera::camera_buffer_t &buffer);
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/HALv3Interface.h b/camera/hal/intel/ipu6/aal/HALv3Interface.h
-new file mode 100644
-index 000000000000..952542e2ac72
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/HALv3Interface.h
-@@ -0,0 +1,32 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace camera3 {
-+
-+/**
-+ * \brief An interface used to callback RequestManager.
-+ */
-+class RequestManagerCallback {
-+public:
-+    RequestManagerCallback() {}
-+    virtual ~RequestManagerCallback() {}
-+
-+    virtual void returnRequestDone(uint32_t frameNumber) = 0;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.cpp b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
-new file mode 100644
-index 000000000000..a773c8866706
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
-@@ -0,0 +1,138 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "HalV3Utils"
-+
-+#include <linux/videodev2.h>
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "HALv3Utils.h"
-+#include "PlatformData.h"
-+
-+namespace camera3 {
-+namespace HalV3Utils {
-+
-+static const char* Camera3StreamTypes[] = {
-+    "OUTPUT", // CAMERA3_STREAM_OUTPUT
-+    "INPUT", // CAMERA3_STREAM_INPUT
-+    "BIDIRECTIONAL", // CAMERA3_STREAM_BIDIRECTIONAL
-+    "INVALID"
-+};
-+
-+const char *getCamera3StreamType(int type)
-+{
-+    int num = sizeof(Camera3StreamTypes) / sizeof(Camera3StreamTypes[0]);
-+    return (type >= 0 && type < num) ? Camera3StreamTypes[type] : Camera3StreamTypes[num - 1];
-+}
-+
-+int HALFormatToV4l2Format(int cameraId, int halFormat)
-+{
-+    LOG1("@%s", __func__);
-+
-+    int format = -1;
-+    switch (halFormat) {
-+        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
-+        case HAL_PIXEL_FORMAT_YCbCr_420_888:
-+        case HAL_PIXEL_FORMAT_BLOB:
-+            format = V4L2_PIX_FMT_NV12;
-+            break;
-+        case HAL_PIXEL_FORMAT_RAW_OPAQUE:
-+            format = icamera::PlatformData::getISysRawFormat(cameraId);
-+            break;
-+        default:
-+            LOGW("unsupport format %d", halFormat);
-+            break;
-+    }
-+
-+    return format;
-+}
-+
-+int getRotationDegrees(const camera3_stream_t &stream)
-+{
-+    LOG1("@%s", __func__);
-+    if (stream.stream_type != CAMERA3_STREAM_OUTPUT) {
-+        LOG2("%s, no need rotation for stream type %d", __func__, stream.stream_type);
-+        return 0;
-+    }
-+#ifdef CAL_BUILD
-+    switch (stream.crop_rotate_scale_degrees) {
-+        case CAMERA3_STREAM_ROTATION_0:
-+            return 0;
-+        case CAMERA3_STREAM_ROTATION_90:
-+            return 90;
-+        case CAMERA3_STREAM_ROTATION_270:
-+            return 270;
-+        default:
-+            LOGE("unsupport rotate degree: %d, the value must be (0,1,3)", stream.crop_rotate_scale_degrees);
-+            return -1;
-+    }
-+#endif
-+}
-+
-+int fillHALStreams(int cameraId, const camera3_stream_t &camera3Stream, icamera::stream_t *stream)
-+{
-+    LOG1("@%s, cameraId:%d", __func__, cameraId);
-+
-+    stream->format = HALFormatToV4l2Format(cameraId, camera3Stream.format);
-+    CheckError(stream->format == -1, icamera::BAD_VALUE, "unsupported format %x", camera3Stream.format);
-+
-+    //  For rotation cases, aal needs to get the psl output which mapping to user requirement.
-+    if (getRotationDegrees(camera3Stream) > 0) {
-+        icamera::camera_resolution_t *psl =
-+            icamera::PlatformData::getPslOutputForRotation(camera3Stream.width,
-+                                                           camera3Stream.height,
-+                                                           cameraId);
-+
-+        stream->width = psl ? psl->width : camera3Stream.height;
-+        stream->height = psl ? psl->height : camera3Stream.width;
-+        LOG1("%s, Use the psl output %dx%d to map user requirement: %dx%d", __func__,
-+             stream->width, stream->height, camera3Stream.width, camera3Stream.height);
-+    } else {
-+        stream->width = camera3Stream.width;
-+        stream->height = camera3Stream.height;
-+    }
-+
-+    stream->field = 0;
-+    stream->stride = icamera::CameraUtils::getStride(stream->format, stream->width);
-+    stream->size = icamera::CameraUtils::getFrameSize(stream->format, stream->width, stream->height);
-+    stream->memType = V4L2_MEMORY_USERPTR;
-+    stream->streamType = icamera::CAMERA_STREAM_OUTPUT;
-+    if (camera3Stream.usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
-+        stream->usage = icamera::CAMERA_STREAM_VIDEO_CAPTURE;
-+    } else if (camera3Stream.usage & GRALLOC_USAGE_HW_CAMERA_ZSL) {
-+        stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
-+    } else {
-+        if (camera3Stream.format == HAL_PIXEL_FORMAT_BLOB) {
-+            stream->usage = icamera::CAMERA_STREAM_STILL_CAPTURE;
-+        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
-+            // Check if it is YUV capture
-+            int size = stream->width * stream->height;
-+            stream->usage = (size > RESOLUTION_1080P_WIDTH * RESOLUTION_1080P_HEIGHT) ?
-+                            icamera::CAMERA_STREAM_STILL_CAPTURE : icamera::CAMERA_STREAM_PREVIEW;
-+        } else if (camera3Stream.format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
-+            stream->usage = icamera::CAMERA_STREAM_OPAQUE_RAW;
-+        } else {
-+            stream->usage = icamera::CAMERA_STREAM_PREVIEW;
-+        }
-+    }
-+
-+    LOG2("@%s, stream: width:%d, height:%d, usage %d", __func__, stream->width, stream->height,
-+         stream->usage);
-+    return icamera::OK;
-+}
-+
-+} // namespace HalV3Utils
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/HALv3Utils.h b/camera/hal/intel/ipu6/aal/HALv3Utils.h
-new file mode 100644
-index 000000000000..d9622a1df34a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.h
-@@ -0,0 +1,72 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <hardware/camera3.h>
-+#include "iutils/CameraLog.h"
-+#include "Parameters.h"
-+
-+namespace camera3 {
-+
-+#undef LOG1
-+#undef LOG2
-+#undef LOGI
-+#undef LOGW
-+#undef LOGE
-+#undef SLOWLY_MULTIPLIER
-+
-+#define SLOWLY_MULTIPLIER (icamera::gSlowlyRunRatio ? icamera::gSlowlyRunRatio : 1)
-+
-+#ifdef HAVE_LINUX_OS
-+
-+#define LOG1(format, args...) \
-+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL1,\
-+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
-+#define LOG2(format, args...) \
-+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL2,\
-+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
-+#define LOGFPS(format, args...) \
-+    icamera::Log::print_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_FPS,\
-+            LOG_TAG, icamera::CAMERA_DEBUG_LOG_FPS, format, ##args)
-+#define LOGI(format, args...) \
-+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_INFO, format, ##args)
-+#define LOGW(format, args...) \
-+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_WARNING, format, ##args)
-+#define LOGE(format, args...) \
-+    icamera::Log::print_log(true, LOG_TAG, icamera::CAMERA_DEBUG_LOG_ERR, format, ##args)
-+
-+#else
-+
-+#define LOG1(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL1,\
-+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOG2(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_LEVEL2,\
-+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGFPS(...) icamera::__camera_hal_log(icamera::gLogLevel & icamera::CAMERA_DEBUG_LOG_FPS,\
-+                        ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGI(...) icamera::__camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-+#define LOGW(...) icamera::__camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
-+#define LOGE(...) icamera::__camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
-+
-+#endif
-+namespace HalV3Utils {
-+    const char *getCamera3StreamType(int type);
-+    int HALFormatToV4l2Format(int cameraId, int halFormat);
-+    int getRotationDegrees(const camera3_stream_t &stream);
-+    int fillHALStreams(int cameraId, const camera3_stream_t &camera3Stream, icamera::stream_t *stream);
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
-new file mode 100644
-index 000000000000..eeb38c18b43c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.cpp
-@@ -0,0 +1,304 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAEStateMachine"
-+
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "HALv3Utils.h"
-+
-+#include "IntelAEStateMachine.h"
-+
-+namespace camera3 {
-+
-+IntelAEStateMachine::IntelAEStateMachine(int cameraId):
-+        mCameraId(cameraId),
-+        mLastControlMode(0),
-+        mLastSceneMode(0),
-+        mCurrentAeMode(NULL)
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+    mCurrentAeMode = &mAutoMode;
-+    CLEAR(mLastAeControls);
-+    mLastAeControls.aeMode = ANDROID_CONTROL_AE_MODE_ON;
-+}
-+
-+IntelAEStateMachine::~IntelAEStateMachine()
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+}
-+
-+/**
-+ * Process states in input stage before the AE is run.
-+ * It is initializing the current state if input
-+ * parameters have an influence.
-+ *
-+ * \param[IN] controlMode: control.controlMode
-+ * \param[IN] sceneMode: control.sceneMode
-+ * \param[IN] aeControls: set of control.<ae>
-+ */
-+int IntelAEStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
-+                                      const AeControls &aeControls)
-+{
-+    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
-+        LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d", __func__,
-+                        controlMode, aeControls.aeMode);
-+        mCurrentAeMode = &mOffMode;
-+    } else {
-+        if (aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
-+            mCurrentAeMode = &mOffMode;
-+            LOG2("%s: Set AE offMode: controlMode = %d, aeMode = %d",
-+                 __func__, controlMode, aeControls.aeMode);
-+        } else {
-+            LOG2("%s: Set AE AutoMode: controlMode = %d, aeMode = %d",
-+                 __func__, controlMode, aeControls.aeMode);
-+            mCurrentAeMode = &mAutoMode;
-+        }
-+    }
-+
-+    mLastAeControls = aeControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+
-+    return mCurrentAeMode->processState(controlMode, sceneMode, aeControls);
-+}
-+
-+/**
-+ * Process results and define output state after the AE is run
-+ *
-+ * \param[IN] aeConverged: from the ae result
-+ * \param[IN] results: cameraMetadata to write dynamic tags.
-+ */
-+int IntelAEStateMachine::processResult(bool aeConverged, android::CameraMetadata &result)
-+{
-+    if (CC_UNLIKELY(mCurrentAeMode == NULL)) {
-+        LOGE("Invalid AE mode - this could not happen - BUG!");
-+        return icamera::UNKNOWN_ERROR;
-+    }
-+
-+    return mCurrentAeMode->processResult(aeConverged, result);
-+}
-+
-+/******************************************************************************
-+ * AE MODE   -  BASE
-+ ******************************************************************************/
-+IntelAEModeBase::IntelAEModeBase():
-+    mLastControlMode(0),
-+    mLastSceneMode(0),
-+    mEvChanged(false),
-+    mLastAeConvergedFlag(false),
-+    mAeRunCount(0),
-+    mAeConvergedCount(0),
-+    mCurrentAeState(ANDROID_CONTROL_AE_STATE_INACTIVE)
-+{
-+    LOG1("%s", __func__);
-+    CLEAR(mLastAeControls);
-+}
-+
-+void IntelAEModeBase::updateResult(android::CameraMetadata &results)
-+{
-+    LOG2("%s: current AE state is: %d", __func__, mCurrentAeState);
-+
-+    //# METADATA_Dynamic control.aeMode done
-+    results.update(ANDROID_CONTROL_AE_MODE, &mLastAeControls.aeMode, 1);
-+    //# METADATA_Dynamic control.aeLock done
-+    results.update(ANDROID_CONTROL_AE_LOCK, &mLastAeControls.aeLock, 1);
-+    //# METADATA_Dynamic control.aePrecaptureTrigger done
-+    results.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
-+                   &mLastAeControls.aePreCaptureTrigger, 1);
-+    //# METADATA_Dynamic control.aeState done
-+    results.update(ANDROID_CONTROL_AE_STATE, &mCurrentAeState, 1);
-+}
-+
-+void IntelAEModeBase::resetState()
-+{
-+    LOG2("%s", __func__);
-+
-+    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+    mLastAeConvergedFlag = false;
-+    mAeRunCount = 0;
-+    mAeConvergedCount = 0;
-+}
-+
-+/******************************************************************************
-+ * AE MODE   -  OFF
-+ ******************************************************************************/
-+
-+IntelAEModeOff::IntelAEModeOff():IntelAEModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAEModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
-+                                 const AeControls &aeControls)
-+{
-+    LOG2("%s", __func__);
-+
-+    mLastAeControls = aeControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+
-+    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
-+        aeControls.aeMode == ANDROID_CONTROL_AE_MODE_OFF) {
-+        resetState();
-+    } else {
-+        LOGE("AE State machine should not be OFF! - Fix bug");
-+        return icamera::UNKNOWN_ERROR;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int
-+IntelAEModeOff::processResult(bool aeConverged, android::CameraMetadata &result)
-+{
-+    UNUSED(aeConverged);
-+    LOG2("%s", __func__);
-+
-+    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+/******************************************************************************
-+ * AE MODE   -  AUTO
-+ ******************************************************************************/
-+
-+IntelAEModeAuto::IntelAEModeAuto():IntelAEModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int
-+IntelAEModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
-+                              const AeControls &aeControls)
-+{
-+    if(controlMode != mLastControlMode) {
-+        LOG1("%s: control mode has changed %d -> %d, reset AE State",
-+             __func__, controlMode, mLastControlMode);
-+        resetState();
-+    }
-+
-+    if (aeControls.aeLock == ANDROID_CONTROL_AE_LOCK_ON) {
-+        // If ev compensation changes, we have to let the AE run until
-+        // convergence. Thus we need to figure out changes in compensation and
-+        // only change the state immediately to locked,
-+        // IF the EV did not change.
-+        if (mLastAeControls.evCompensation != aeControls.evCompensation)
-+            mEvChanged = true;
-+
-+        if (!mEvChanged)
-+            mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
-+    } else if (aeControls.aeMode != mLastAeControls.aeMode ||
-+               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
-+                sceneMode != mLastSceneMode)) {
-+        resetState();
-+    } else {
-+        switch (mCurrentAeState) {
-+            case ANDROID_CONTROL_AE_STATE_LOCKED:
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+                break;
-+            case ANDROID_CONTROL_AE_STATE_SEARCHING:
-+            case ANDROID_CONTROL_AE_STATE_INACTIVE:
-+            case ANDROID_CONTROL_AE_STATE_CONVERGED:
-+            case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
-+            case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
-+                if (aeControls.aePreCaptureTrigger ==
-+                        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START)
-+                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE;
-+
-+                if (aeControls.aePreCaptureTrigger ==
-+                        ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL)
-+                    mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+                break;
-+            default:
-+                LOGE("Invalid AE state!, State set to INACTIVE");
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+
-+            break;
-+        }
-+    }
-+    mLastAeControls = aeControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+    return icamera::OK;
-+}
-+
-+int IntelAEModeAuto::processResult(bool aeConverged, android::CameraMetadata &result)
-+{
-+    switch (mCurrentAeState) {
-+    case ANDROID_CONTROL_AE_STATE_LOCKED:
-+        //do nothing
-+        break;
-+    case ANDROID_CONTROL_AE_STATE_INACTIVE:
-+    case ANDROID_CONTROL_AE_STATE_SEARCHING:
-+    case ANDROID_CONTROL_AE_STATE_CONVERGED:
-+    case ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED:
-+        if (aeConverged) {
-+            mEvChanged = false; // converged -> reset
-+            if (mLastAeControls.aeLock) {
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
-+            } else {
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
-+            }
-+        } else {
-+            mCurrentAeState = ANDROID_CONTROL_AE_STATE_SEARCHING;
-+        }
-+        break;
-+    case ANDROID_CONTROL_AE_STATE_PRECAPTURE:
-+        if (aeConverged) {
-+            mEvChanged = false; // converged -> reset
-+            if (mLastAeControls.aeLock) {
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_LOCKED;
-+            } else {
-+                mCurrentAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;
-+            }
-+        } // here the else is staying at the same state.
-+        break;
-+    default:
-+        LOGE("Invalid AE state!, State set to INACTIVE");
-+        mCurrentAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+        break;
-+    }
-+
-+    if (aeConverged) {
-+        if (mLastAeConvergedFlag == true) {
-+            mAeConvergedCount++;
-+            LOG2("%s: AE converged for %d frames", __func__, mAeConvergedCount);
-+        } else {
-+            mAeConvergedCount = 1;
-+            LOG1("%s: AE converging -> converged, after running AE for %d times",
-+                  __func__, mAeRunCount);
-+        }
-+    } else {
-+        if (mLastAeConvergedFlag == true) {
-+            LOG1("%s: AE Converged -> converging", __func__);
-+            mAeRunCount = 1;
-+            mAeConvergedCount = 0;
-+        } else {
-+            mAeRunCount++;
-+            LOG2("%s: AE converging for %d frames", __func__, mAeRunCount);
-+        }
-+    }
-+    mLastAeConvergedFlag = aeConverged;
-+
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
-new file mode 100644
-index 000000000000..51b3bf2a76b5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAEStateMachine.h
-@@ -0,0 +1,135 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "HALv3Header.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \struct AeControls
-+ *
-+ * Control Modes saved and passed back to control unit after reading
-+ *
-+ */
-+struct AeControls {
-+    uint8_t aeMode;                 /**< AE_MODE */
-+    uint8_t aeLock;                 /**< AE_LOCK */
-+    uint8_t aePreCaptureTrigger;    /**< PRECAPTURE_TRIGGER */
-+    uint8_t sceneMode;              /**< SCENE_MODE */
-+    int32_t evCompensation;         /**< AE_EXPOSURE_COMPENSATION */
-+};
-+
-+/**
-+ * \class IntelAEModeBase
-+ *
-+ * Base class for all the Autoexposure modes as defined by the Android
-+ * camera device V3.x API.
-+ * Each mode will follow certain state transitions. See documentation for
-+ * android.control.aeState
-+ *
-+ */
-+class IntelAEModeBase {
-+public:
-+    IntelAEModeBase();
-+    virtual ~IntelAEModeBase() {};
-+
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AeControls &aeControls) = 0;
-+
-+    virtual int processResult(bool aeConverged, android::CameraMetadata &results) = 0;
-+
-+    void resetState(void);
-+    uint8_t getState() const { return mCurrentAeState; }
-+protected:
-+    void updateResult(android::CameraMetadata &results);
-+protected:
-+    AeControls  mLastAeControls;
-+    uint8_t     mLastControlMode;
-+    uint8_t     mLastSceneMode;
-+    bool        mEvChanged; /**< set and kept to true when ev changes until
-+                                 converged */
-+
-+    bool        mLastAeConvergedFlag;
-+    uint8_t     mAeRunCount;
-+    uint8_t     mAeConvergedCount;
-+    uint8_t     mCurrentAeState;
-+};
-+
-+/**
-+ * \class IntelAEModeAuto
-+ * Derived class from IntelAEModeBase for Auto mode
-+ *
-+ */
-+class IntelAEModeAuto: public IntelAEModeBase {
-+public:
-+    IntelAEModeAuto();
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AeControls &aeControls);
-+    virtual int processResult(bool aeConverged, android::CameraMetadata& result);
-+};
-+
-+/**
-+ * \class IntelAEModeOFF
-+ * Derived class from IntelAEModeBase for OFF mode
-+ *
-+ */
-+class IntelAEModeOff: public IntelAEModeBase {
-+public:
-+    IntelAEModeOff();
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AeControls &aeControls);
-+    virtual int processResult(bool aeConverged, android::CameraMetadata& result);
-+};
-+
-+/**
-+ * \class IntelAEStateMachine
-+ *
-+ * This class adapts the Android V3 AE triggers and state transitions to
-+ * the ones implemented by the Intel AIQ algorithm
-+ * This class is platform independent. Platform specific behaviors should be
-+ * implemented in derived classes from this one or from the IntelAEModeBase
-+ *
-+ */
-+class IntelAEStateMachine {
-+public:
-+    IntelAEStateMachine(int cameraId);
-+    virtual ~IntelAEStateMachine();
-+
-+    int processState(uint8_t controlMode, uint8_t sceneMode,
-+                     const AeControls &aeControls);
-+
-+    int processResult(bool aeConverged, android::CameraMetadata &results);
-+
-+    uint8_t getState() const { return mCurrentAeMode->getState(); }
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(IntelAEStateMachine);
-+
-+private: /* members*/
-+    int mCameraId;
-+    AeControls  mLastAeControls;
-+    uint8_t     mLastControlMode;
-+    uint8_t     mLastSceneMode;
-+
-+    IntelAEModeBase *mCurrentAeMode;
-+
-+    IntelAEModeOff mOffMode;
-+    IntelAEModeAuto mAutoMode;
-+};
-+
-+}  // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
-new file mode 100644
-index 000000000000..3c7ff5f08914
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
-@@ -0,0 +1,442 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAFStateMachine"
-+
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "HALv3Utils.h"
-+
-+#include "IntelAFStateMachine.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * AF timeouts. Together these will make:
-+ * timeout if: [MIN_AF_TIMEOUT - MAX_AF_FRAME_COUNT_TIMEOUT - MAX_AF_TIMEOUT]
-+ * which translates to 2-4 seconds with the current values. Actual timeout value
-+ * will depend on the FPS. E.g. >30FPS = 2s, 20FPS = 3s, <15FPS = 4s.
-+ */
-+
-+/**
-+ * MAX_AF_TIMEOUT
-+ * Maximum time we allow the AF to iterate without a result.
-+ * This timeout is the last resort, for very low FPS operation.
-+ * Units are in microseconds.
-+ * 4 seconds is a compromise between CTS & ITS. ITS allows for 10 seconds for
-+ * 3A convergence. CTS1 allows only 5, but it doesn't require convergence, just
-+ * a conclusion. We reserve one second for latencies to be safe. This makes the
-+ * timeout 5 (cts1) - 1 (latency safety) = 4 seconds = 4000000us.
-+ */
-+static const long int MAX_AF_TIMEOUT = 4000000;  // 4 seconds
-+
-+/**
-+ * MIN_AF_TIMEOUT
-+ * For very high FPS use cases, we want to anyway allow some time for moving the
-+ * lens.
-+ */
-+static const long int MIN_AF_TIMEOUT = 2000000;  // 2 seconds
-+
-+/**
-+ * MAX_AF_FRAME_COUNT_TIMEOUT
-+ * Maximum time we allow the AF to iterate without a result.
-+ * Based on frames, as the AF algorithm itself needs frames for its operation,
-+ * not just time, and the FPS varies.
-+ * This is the timeout for normal operation, and translates to 2 seconds
-+ * if FPS is 30.
-+ */
-+static const int MAX_AF_FRAME_COUNT_TIMEOUT = 60;  // 2 seconds if 30fps
-+
-+#ifndef HONEST_AF
-+// not-so-honest
-+#define HONEST_AF 0
-+#endif
-+
-+IntelAFStateMachine::IntelAFStateMachine(int cameraId) :
-+        mCameraId(cameraId)
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+    mCurrentAfMode = &mAutoMode;
-+    mLastAfControls = { ANDROID_CONTROL_AF_MODE_AUTO,
-+                        ANDROID_CONTROL_AF_TRIGGER_IDLE };
-+}
-+
-+IntelAFStateMachine::~IntelAFStateMachine()
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+}
-+
-+int IntelAFStateMachine::processTriggers(uint8_t afTrigger, uint8_t afMode)
-+{
-+    if (afMode != mLastAfControls.afMode) {
-+        LOG1("Change of AF mode from %d to %d", mLastAfControls.afMode, afMode);
-+
-+        switch (afMode) {
-+        case ANDROID_CONTROL_AF_MODE_AUTO:
-+        case ANDROID_CONTROL_AF_MODE_MACRO:
-+            mCurrentAfMode = &mAutoMode;
-+            break;
-+        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
-+        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
-+            mCurrentAfMode = &mContinuousPictureMode;
-+            break;
-+        case ANDROID_CONTROL_AF_MODE_OFF:
-+            mCurrentAfMode = &mOffMode;
-+            break;
-+        default:
-+            LOGE("INVALID AF mode requested defaulting to AUTO");
-+            mCurrentAfMode = &mAutoMode;
-+            break;
-+        }
-+        mCurrentAfMode->resetState();
-+    }
-+    mLastAfControls.afTrigger = afTrigger;
-+    mLastAfControls.afMode = afMode;
-+
-+    LOG2("%s: afMode %d", __func__, mLastAfControls.afMode);
-+    return mCurrentAfMode->processTriggers(afTrigger, afMode);
-+}
-+
-+int IntelAFStateMachine::processResult(int afState, bool lensMoving,
-+                                       android::CameraMetadata &result)
-+{
-+    if (CC_UNLIKELY(mCurrentAfMode == NULL)) {
-+        LOGE("Invalid AF mode - this could not happen - BUG!");
-+        return icamera::UNKNOWN_ERROR;
-+    }
-+
-+    return mCurrentAfMode->processResult(afState, lensMoving, result);
-+}
-+
-+/**
-+ * updateDefaults
-+ *
-+ * Used in case of error in the algorithm or fixed focus sensor
-+ * In case of fixed focus sensor we always report locked
-+ */
-+int IntelAFStateMachine::updateDefaults(android::CameraMetadata& result,
-+                                        bool fixedFocus) const
-+{
-+
-+    mCurrentAfMode->updateResult(result);
-+    uint8_t defaultState = ANDROID_CONTROL_AF_STATE_INACTIVE;
-+    if (fixedFocus)
-+        defaultState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
-+
-+    result.update(ANDROID_CONTROL_AF_STATE, &defaultState, 1);
-+
-+    return icamera::OK;
-+}
-+
-+/******************************************************************************
-+ * AF MODE   -  BASE
-+ ******************************************************************************/
-+IntelAfModeBase::IntelAfModeBase():
-+        mCurrentAfState(ANDROID_CONTROL_AF_STATE_INACTIVE),
-+        mLensState(ANDROID_LENS_STATE_STATIONARY),
-+        mLastActiveTriggerTime(0),
-+        mFramesSinceTrigger(0)
-+{
-+    LOG1("%s", __func__);
-+    mLastAfControls = { ANDROID_CONTROL_AF_MODE_AUTO,
-+                        ANDROID_CONTROL_AF_TRIGGER_IDLE };
-+}
-+
-+/**
-+ * processTriggers
-+ *
-+ * This method is called BEFORE auto focus algorithm has RUN
-+ * Input parameters are pre-filled by the Intel3APlus::fillAfInputParams()
-+ * by parsing the request settings.
-+ * Other parameters from the capture request settings not filled in the input
-+ * params structure is passed as argument
-+ */
-+int IntelAfModeBase::processTriggers(uint8_t afTrigger, uint8_t afMode)
-+{
-+    LOG2("%s", __func__);
-+
-+    if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
-+        resetTrigger(icamera::CameraUtils::systemTime() / 1000);
-+        LOG1("AF TRIGGER START");
-+    } else if (afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
-+        LOG1("AF TRIGGER CANCEL");
-+        resetTrigger(0);
-+    }
-+    mLastAfControls.afTrigger = afTrigger;
-+    mLastAfControls.afMode = afMode;
-+    return icamera::OK;
-+}
-+
-+void
-+IntelAfModeBase::updateResult(android::CameraMetadata& results)
-+{
-+    LOG2("%s", __func__);
-+
-+    LOG2("%s afMode = %d state = %d", __func__, mLastAfControls.afMode, mCurrentAfState);
-+
-+    results.update(ANDROID_CONTROL_AF_MODE, &mLastAfControls.afMode, 1);
-+    //# METADATA_Dynamic control.afTrigger done
-+    results.update(ANDROID_CONTROL_AF_TRIGGER, &mLastAfControls.afTrigger, 1);
-+    //# METADATA_Dynamic control.afState done
-+    results.update(ANDROID_CONTROL_AF_STATE, &mCurrentAfState, 1);
-+    /**
-+     * LENS STATE update
-+     */
-+    //# METADATA_Dynamic lens.state Done
-+    results.update(ANDROID_LENS_STATE, &mLensState, 1);
-+}
-+
-+void IntelAfModeBase::resetTrigger(usecs_t triggerTime)
-+{
-+    mLastActiveTriggerTime = triggerTime;
-+    mFramesSinceTrigger = 0;
-+}
-+
-+void IntelAfModeBase::resetState()
-+{
-+    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
-+}
-+
-+void IntelAfModeBase::checkIfFocusTimeout()
-+{
-+     // give up if AF was iterating for too long
-+    if (mLastActiveTriggerTime != 0) {
-+        mFramesSinceTrigger++;
-+        usecs_t now = icamera::CameraUtils::systemTime() / 1000;
-+        usecs_t timeSinceTriggered = now - mLastActiveTriggerTime;
-+        if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED) {
-+            /**
-+             * Timeout IF either time has passed beyond MAX_AF_TIMEOUT
-+             *                         OR
-+             * Enough frames have been processed and time has passed beyond
-+             * MIN_AF_TIMEOUT
-+             */
-+            if (timeSinceTriggered > MAX_AF_TIMEOUT ||
-+                (mFramesSinceTrigger > MAX_AF_FRAME_COUNT_TIMEOUT &&
-+                 timeSinceTriggered  > MIN_AF_TIMEOUT)) {
-+                resetTrigger(0);
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
-+            }
-+        }
-+    }
-+}
-+
-+/******************************************************************************
-+ * AF MODE   -  OFF
-+ ******************************************************************************/
-+
-+IntelAFModeOff::IntelAFModeOff():IntelAfModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAFModeOff::processTriggers(uint8_t afTrigger, uint8_t afMode)
-+{
-+    LOG2("%s", __func__);
-+
-+    mLastAfControls.afTrigger = afTrigger;
-+    mLastAfControls.afMode = afMode;
-+    return icamera::OK;
-+}
-+
-+int IntelAFModeOff::processResult(int afState, bool lensMoving, android::CameraMetadata& result) {
-+    /**
-+     * IN MANUAL and EDOF AF state never changes
-+     */
-+    LOG2("%s", __func__);
-+
-+    mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
-+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+/******************************************************************************
-+ * AF MODE   -  AUTO
-+ ******************************************************************************/
-+
-+IntelAFModeAuto::IntelAFModeAuto():IntelAfModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAFModeAuto::processTriggers(uint8_t afTrigger, uint8_t afMode)
-+{
-+    LOG2("%s", __func__);
-+
-+    IntelAfModeBase::processTriggers(afTrigger, afMode);
-+
-+    // Override AF state if we just got an AF TRIGGER Start
-+    // This is only valid for the AUTO/MACRO state machine
-+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
-+        mCurrentAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN;
-+        LOG2("@%s AF state ACTIVE_SCAN (trigger start)", __PRETTY_FUNCTION__);
-+    } else if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
-+        mCurrentAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
-+        LOG2("@%s AF state INACTIVE (trigger cancel)", __PRETTY_FUNCTION__);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int IntelAFModeAuto::processResult(int afState, bool lensMoving, android::CameraMetadata& result) {
-+    LOG2("%s", __func__);
-+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
-+
-+    if (mLastActiveTriggerTime != 0 || !HONEST_AF) {
-+        switch (afState) {
-+        case icamera::AF_STATE_LOCAL_SEARCH:
-+        case icamera::AF_STATE_EXTENDED_SEARCH:
-+            LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
-+            break;
-+        case icamera::AF_STATE_SUCCESS:
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
-+            resetTrigger(0);
-+            LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
-+            break;
-+        case icamera::AF_STATE_FAIL:
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
-+            resetTrigger(0);
-+            LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
-+            break;
-+        default:
-+        case icamera::AF_STATE_IDLE:
-+            LOG2("@%s AF state INACTIVE", __PRETTY_FUNCTION__);
-+            break;
-+        }
-+    }
-+
-+    checkIfFocusTimeout();
-+
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+/******************************************************************************
-+ * AF MODE   -  CONTINUOUS PICTURE
-+ ******************************************************************************/
-+
-+IntelAFModeContinuousPicture::IntelAFModeContinuousPicture():IntelAfModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAFModeContinuousPicture::processTriggers(uint8_t afTrigger, uint8_t afMode)
-+{
-+    LOG2("%s", __func__);
-+
-+    IntelAfModeBase::processTriggers(afTrigger, afMode);
-+
-+    // Override AF state if we just got an AF TRIGGER CANCEL
-+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_CANCEL) {
-+        /* Scan is supposed to be restarted, which we try by triggering a new
-+         * scan. (see IntelAFStateMachine::processTriggers)
-+         * This however, doesn't do anything at all, because AIQ does not
-+         * want to play ball, at least yet.
-+         *
-+         * We can skip state transitions when allowed by the state
-+         * machine documentation, so skip INACTIVE, also skip PASSIVE_SCAN if
-+         * possible and go directly to either PASSIVE_FOCUSED or UNFOCUSED
-+         *
-+         * TODO: Remove this switch-statement, once triggering a scan starts to
-+         * work. We could go directly to PASSIVE_SCAN always then, because a
-+         * scan is really happening. Now it is not.
-+         */
-+        switch (mCurrentAfState) {
-+        case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
-+        case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
-+            break;
-+        case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
-+            break;
-+        default:
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
-+            break;
-+        }
-+    }
-+    /* Override AF state if we just got an AF TRIGGER START, this will stop
-+     * the scan as intended in the state machine documentation (see
-+     * IntelAFStateMachine::processTriggers)
-+     */
-+    if (mLastAfControls.afTrigger == ANDROID_CONTROL_AF_TRIGGER_START) {
-+        if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
-+        else if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED ||
-+                 mCurrentAfState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int IntelAFModeContinuousPicture::processResult(int afState, bool lensMoving,
-+                                                android::CameraMetadata& result)
-+{
-+    LOG2("%s", __func__);
-+    mLensState = lensMoving ? ANDROID_LENS_STATE_MOVING : ANDROID_LENS_STATE_STATIONARY;
-+
-+    // state transition from locked state are only allowed via triggers, which
-+    // are handled in the currentAFMode processTriggers() and below in this function.
-+    if (mCurrentAfState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED &&
-+        mCurrentAfState != ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
-+        switch (afState) {
-+        case icamera::AF_STATE_LOCAL_SEARCH:
-+        case icamera::AF_STATE_EXTENDED_SEARCH:
-+            LOG2("@%s AF state SCANNING", __PRETTY_FUNCTION__);
-+            mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
-+            break;
-+        case icamera::AF_STATE_SUCCESS:
-+            if (mLastActiveTriggerTime == 0) {
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
-+                LOG2("@%s AF state PASSIVE_FOCUSED", __PRETTY_FUNCTION__);
-+            } else {
-+                resetTrigger(0);
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
-+                LOG2("@%s AF state FOCUSED_LOCKED", __PRETTY_FUNCTION__);
-+            }
-+            break;
-+        case icamera::AF_STATE_FAIL:
-+            if (mLastActiveTriggerTime == 0) {
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
-+                LOG2("@%s AF state PASSIVE_UNFOCUSED", __PRETTY_FUNCTION__);
-+            } else {
-+                resetTrigger(0);
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
-+                LOG2("@%s AF state NOT_FOCUSED_LOCKED", __PRETTY_FUNCTION__);
-+            }
-+            break;
-+        default:
-+        case icamera::AF_STATE_IDLE:
-+            if (mCurrentAfState == ANDROID_CONTROL_AF_STATE_INACTIVE) {
-+                mCurrentAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
-+                LOG2("@%s AF state PASSIVE_UNFOCUSED (idle)", __PRETTY_FUNCTION__);
-+            }
-+            break;
-+        }
-+    }
-+
-+    checkIfFocusTimeout();
-+
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+} // namespace camera3
-+
-diff --git a/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
-new file mode 100644
-index 000000000000..06d94a597465
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.h
-@@ -0,0 +1,145 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "HALv3Header.h"
-+
-+namespace camera3 {
-+
-+typedef int64_t usecs_t;
-+
-+/**
-+ * \struct AfControls
-+ *
-+ * Control Modes saved and passed back to control unit after reading
-+ *
-+ */
-+struct AfControls {
-+    uint8_t afMode; /**< AF_MODE */
-+    uint8_t afTrigger; /**< AF_TRIGGER */
-+};
-+
-+/**
-+ * \class IntelAfModeBase
-+ *
-+ * Base class for all the AutoFocus modes as defined by the Android
-+ * camera device V3.x API.
-+ * Each mode will follow certain state transitions. See documentation for
-+ * android.control.afState
-+ *
-+ */
-+class IntelAfModeBase {
-+public:
-+    IntelAfModeBase();
-+    virtual ~IntelAfModeBase() {};
-+
-+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode) = 0;
-+    virtual int processResult(int afState, bool lensMoving,
-+                              android::CameraMetadata& result) =0 ;
-+
-+    void resetState(void);
-+    void resetTrigger(usecs_t triggerTime);
-+    int getState() { return mCurrentAfState; }
-+    void updateResult(android::CameraMetadata& results);
-+protected:
-+    void checkIfFocusTimeout();
-+protected:
-+    AfControls mLastAfControls;
-+    uint8_t mCurrentAfState;
-+    uint8_t  mLensState;
-+    usecs_t  mLastActiveTriggerTime;   /**< in useconds */
-+    uint32_t mFramesSinceTrigger;
-+};
-+
-+/**
-+ * \class IntelAFModeAuto
-+ * Derived class from IntelAFModeBase for Auto mode
-+ *
-+ */
-+class IntelAFModeAuto: public IntelAfModeBase {
-+public:
-+    IntelAFModeAuto();
-+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
-+    virtual int processResult(int afState, bool lensMoving,
-+                              android::CameraMetadata& result);
-+};
-+
-+/**
-+ * \class IntelAFModeContinuousPicture
-+ * Derived class from IntelAFModeBase for Continuous AF mode
-+ *
-+ */
-+class IntelAFModeContinuousPicture: public IntelAfModeBase {
-+public:
-+    IntelAFModeContinuousPicture();
-+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
-+    virtual int processResult(int afState, bool lensMoving,
-+                              android::CameraMetadata& result);
-+};
-+
-+/**
-+ * \class IntelAFModeOff
-+ * Derived class from IntelAFModeBase for OFF mode
-+ *
-+ */
-+class IntelAFModeOff: public IntelAfModeBase {
-+public:
-+    IntelAFModeOff();
-+    virtual int processTriggers(uint8_t afTrigger, uint8_t afMode);
-+    virtual int processResult(int afState, bool lensMoving,
-+                              android::CameraMetadata& result);
-+};
-+
-+/**
-+ * \class IntelAFStateMachine
-+ *
-+ * This class adapts the Android V3 AF triggers and state transitions to
-+ * the ones implemented by the Intel AIQ algorithm
-+ * This class is platform independent. Platform specific behaviors should be
-+ * implemented in derived classes from this one or from the IntelAFModeBase
-+ *
-+ */
-+class IntelAFStateMachine {
-+public:
-+    IntelAFStateMachine(int cameraId);
-+    virtual ~IntelAFStateMachine();
-+
-+    int processTriggers(uint8_t afTrigger, uint8_t afMode);
-+    int processResult(int afState, bool lensMoving,
-+                      android::CameraMetadata& result);
-+
-+    int updateDefaults(android::CameraMetadata &result,
-+                       bool fixedFocus = false) const;
-+
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(IntelAFStateMachine);
-+
-+private: /* members*/
-+    int mCameraId;
-+    AfControls      mLastAfControls;
-+    IntelAfModeBase *mCurrentAfMode;
-+
-+    std::vector<uint8_t> mAvailableModes;
-+
-+    IntelAFModeOff mOffMode;
-+    IntelAFModeAuto mAutoMode;
-+
-+    IntelAFModeContinuousPicture mContinuousPictureMode;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
-new file mode 100644
-index 000000000000..66f8d1c70bc4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.cpp
-@@ -0,0 +1,227 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAWBStateMachine"
-+
-+#include "HALv3Utils.h"
-+
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "IntelAWBStateMachine.h"
-+
-+namespace camera3 {
-+
-+IntelAWBStateMachine::IntelAWBStateMachine(int aCameraId):
-+        mCameraId(aCameraId),
-+        mLastControlMode(0),
-+        mLastSceneMode(0),
-+        mCurrentAwbMode(NULL)
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+    mCurrentAwbMode = &mAutoMode;
-+    CLEAR(mLastAwbControls);
-+    mLastAwbControls.awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
-+}
-+
-+IntelAWBStateMachine::~IntelAWBStateMachine()
-+{
-+    LOG1("%s mCameraId %d", __func__, mCameraId);
-+}
-+
-+int IntelAWBStateMachine::processState(uint8_t controlMode, uint8_t sceneMode,
-+                                       const AwbControls &awbControls)
-+{
-+    if (controlMode == ANDROID_CONTROL_MODE_OFF) {
-+        mCurrentAwbMode = &mOffMode;
-+
-+        if (controlMode != mLastControlMode)
-+            LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d",
-+                        __func__, controlMode, awbControls.awbMode);
-+    } else {
-+        if (awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
-+            mCurrentAwbMode = &mOffMode;
-+            if (awbControls.awbMode != mLastAwbControls.awbMode)
-+                LOG1("%s: Set AWB offMode: controlMode = %d, awbMode = %d",
-+                                __func__, controlMode, awbControls.awbMode);
-+        } else {
-+            mCurrentAwbMode = &mAutoMode;
-+            if (awbControls.awbMode != mLastAwbControls.awbMode)
-+                LOG1("%s: Set AWB autoMode: controlMode = %d, awbMode = %d",
-+                                __func__, controlMode, awbControls.awbMode);
-+        }
-+    }
-+
-+    mLastAwbControls = awbControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+    return mCurrentAwbMode->processState(controlMode, sceneMode, awbControls);
-+}
-+
-+int IntelAWBStateMachine::processResult(bool converged, android::CameraMetadata &result)
-+{
-+    if (CC_UNLIKELY(mCurrentAwbMode == NULL)) {
-+        LOGE("Invalid AWB mode - this could not happen - BUG!");
-+        return icamera::UNKNOWN_ERROR;
-+    }
-+
-+    return mCurrentAwbMode->processResult(converged, result);
-+}
-+
-+/******************************************************************************
-+ * AWB MODE   -  BASE
-+ ******************************************************************************/
-+IntelAWBModeBase::IntelAWBModeBase():
-+        mLastControlMode(0),
-+        mLastSceneMode(0),
-+        mCurrentAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE)
-+{
-+    LOG1("%s", __func__);
-+
-+    CLEAR(mLastAwbControls);
-+}
-+
-+void IntelAWBModeBase::updateResult(android::CameraMetadata& results)
-+{
-+    LOG2("%s: current AWB state is: %d", __func__, mCurrentAwbState);
-+
-+    //# METADATA_Dynamic control.awbMode done
-+    results.update(ANDROID_CONTROL_AWB_MODE, &mLastAwbControls.awbMode, 1);
-+    //# METADATA_Dynamic control.awbLock done
-+    results.update(ANDROID_CONTROL_AWB_LOCK, &mLastAwbControls.awbLock, 1);
-+    //# METADATA_Dynamic control.awbState done
-+    results.update(ANDROID_CONTROL_AWB_STATE, &mCurrentAwbState, 1);
-+}
-+
-+void IntelAWBModeBase::resetState()
-+{
-+    LOG2("%s", __func__);
-+
-+    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+}
-+
-+/******************************************************************************
-+ * AWB MODE   -  OFF
-+ ******************************************************************************/
-+
-+IntelAWBModeOff::IntelAWBModeOff():IntelAWBModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAWBModeOff::processState(uint8_t controlMode, uint8_t sceneMode,
-+                                  const AwbControls &awbControls)
-+{
-+    LOG2("%s", __func__);
-+
-+    int ret = icamera::OK;
-+
-+    mLastAwbControls = awbControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+
-+    if (controlMode == ANDROID_CONTROL_MODE_OFF ||
-+        awbControls.awbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
-+        resetState();
-+    } else {
-+        LOGE("AWB State machine should not be OFF! - Fix bug");
-+        ret = icamera::UNKNOWN_ERROR;
-+    }
-+
-+    return ret;
-+}
-+
-+int IntelAWBModeOff::processResult(bool converged, android::CameraMetadata& result)
-+{
-+    UNUSED(converged);
-+    LOG2("%s", __func__);
-+
-+    mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+/******************************************************************************
-+ * AWB MODE   -  AUTO
-+ ******************************************************************************/
-+
-+IntelAWBModeAuto::IntelAWBModeAuto():IntelAWBModeBase()
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+int IntelAWBModeAuto::processState(uint8_t controlMode, uint8_t sceneMode,
-+                                   const AwbControls &awbControls)
-+{
-+    if (controlMode != mLastControlMode) {
-+        LOG1("%s: control mode has changed %d -> %d, reset AWB State", __func__,
-+                mLastControlMode, controlMode);
-+        resetState();
-+    }
-+
-+    if (awbControls.awbLock == ANDROID_CONTROL_AWB_LOCK_ON) {
-+        mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_LOCKED;
-+    } else if (awbControls.awbMode != mLastAwbControls.awbMode ||
-+               (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE &&
-+                sceneMode != mLastSceneMode)) {
-+        resetState();
-+    } else {
-+        switch (mCurrentAwbState) {
-+            case ANDROID_CONTROL_AWB_STATE_LOCKED:
-+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+                break;
-+            case ANDROID_CONTROL_AWB_STATE_INACTIVE:
-+            case ANDROID_CONTROL_AWB_STATE_SEARCHING:
-+            case ANDROID_CONTROL_AWB_STATE_CONVERGED:
-+                //do nothing
-+                break;
-+            default:
-+                LOGE("Invalid AWB state!, State set to INACTIVE");
-+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+        }
-+    }
-+    mLastAwbControls = awbControls;
-+    mLastSceneMode = sceneMode;
-+    mLastControlMode = controlMode;
-+    return icamera::OK;
-+}
-+
-+int IntelAWBModeAuto::processResult(bool converged, android::CameraMetadata& result)
-+{
-+    switch (mCurrentAwbState) {
-+        case ANDROID_CONTROL_AWB_STATE_LOCKED:
-+        //do nothing
-+            break;
-+        case ANDROID_CONTROL_AWB_STATE_INACTIVE:
-+        case ANDROID_CONTROL_AWB_STATE_SEARCHING:
-+        case ANDROID_CONTROL_AWB_STATE_CONVERGED:
-+            if (converged)
-+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_CONVERGED;
-+            else
-+                mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_SEARCHING;
-+            break;
-+        default:
-+            LOGE("invalid AWB state!, State set to INACTIVE");
-+            mCurrentAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+    }
-+
-+    updateResult(result);
-+
-+    return icamera::OK;
-+}
-+
-+} // namespace camera3
-+
-diff --git a/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
-new file mode 100644
-index 000000000000..47f4c22f7f6c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/IntelAWBStateMachine.h
-@@ -0,0 +1,131 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "HALv3Header.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \struct AwbControls
-+ *
-+ * Control Modes saved and passed back to control unit after reading
-+ *
-+ */
-+struct AwbControls {
-+    uint8_t awbMode;                        /**< AWB_MODE */
-+    uint8_t awbLock;                        /**< AWB_LOCK */
-+    uint8_t colorCorrectionMode;            /**< COLOR_CORRECTION_MODE */
-+    uint8_t colorCorrectionAberrationMode;  /**< COLOR_CORRECTION_ABERRATION_MODE */
-+};
-+
-+/**
-+ * \class IntelAWBModeBase
-+ *
-+ * Base class for all the Auto white balance modes as defined by the Android
-+ * camera device V3.x API.
-+ * Each mode will follow certain state transitions. See documentation for
-+ * android.control.awbState
-+ *
-+ */
-+class IntelAWBModeBase {
-+public:
-+    IntelAWBModeBase();
-+    virtual ~IntelAWBModeBase() {};
-+
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AwbControls &awbControls) = 0;
-+
-+    virtual int processResult(bool converged, android::CameraMetadata &results) = 0;
-+
-+    void resetState(void);
-+    uint8_t getState() const { return mCurrentAwbState; }
-+protected:
-+    void updateResult(android::CameraMetadata& results);
-+protected:
-+    AwbControls  mLastAwbControls;
-+    uint8_t     mLastControlMode;
-+    uint8_t     mLastSceneMode;
-+
-+    uint8_t     mCurrentAwbState;
-+};
-+
-+/**
-+ * \class IntelAWBModeAuto
-+ * Derived class from IntelAWBModeBase for Auto mode
-+ *
-+ */
-+class IntelAWBModeAuto: public IntelAWBModeBase {
-+public:
-+    IntelAWBModeAuto();
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AwbControls &awbControls);
-+
-+    virtual int processResult(bool converged, android::CameraMetadata &results);
-+};
-+
-+/**
-+ * \class IntelAWBModeOFF
-+ * Derived class from IntelAWBModeBase for OFF mode
-+ *
-+ */
-+class IntelAWBModeOff: public IntelAWBModeBase {
-+public:
-+    IntelAWBModeOff();
-+    virtual int processState(uint8_t controlMode, uint8_t sceneMode,
-+                             const AwbControls &awbControls);
-+
-+    virtual int processResult(bool converged, android::CameraMetadata &results);
-+};
-+
-+/**
-+ * \class IntelAWBStateMachine
-+ *
-+ * This class adapts the Android V3 AWB triggers and state transitions to
-+ * the ones implemented by the Intel AIQ algorithm
-+ * This class is platform independent. Platform specific behaviors should be
-+ * implemented in derived classes from this one or from the IntelAWBModeBase
-+ *
-+ */
-+class IntelAWBStateMachine {
-+public:
-+    IntelAWBStateMachine(int CameraId);
-+    virtual ~IntelAWBStateMachine();
-+
-+    int processState(uint8_t controlMode, uint8_t sceneMode,
-+                     const AwbControls &awbControls);
-+
-+    int processResult(bool converged, android::CameraMetadata &results);
-+
-+    uint8_t getState() const { return mCurrentAwbMode->getState(); }
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(IntelAWBStateMachine);
-+
-+private: /* members*/
-+    int mCameraId;
-+    AwbControls  mLastAwbControls;
-+    uint8_t     mLastControlMode;
-+    uint8_t     mLastSceneMode;
-+
-+    IntelAWBModeBase *mCurrentAwbMode;
-+
-+    IntelAWBModeOff mOffMode;
-+    IntelAWBModeAuto mAutoMode;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.cpp b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
-new file mode 100644
-index 000000000000..6fad7b3fc074
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
-@@ -0,0 +1,2166 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "MetadataConvert"
-+
-+#include <cmath>
-+#include <sstream>
-+
-+#include "Errors.h"
-+#include "Utils.h"
-+
-+#include "HALv3Utils.h"
-+#include "MetadataConvert.h"
-+#include "ParameterHelper.h"
-+
-+namespace camera3 {
-+
-+#define NSEC_PER_SEC 1000000000LLU
-+#define DEFAULT_FPS_RANGE_MIN 15
-+#define DEFAULT_FPS_RANGE_MAX 30
-+
-+template<typename T>
-+struct ValuePair {
-+    int halValue;
-+    T androidValue;
-+};
-+
-+template<typename T>
-+static int getAndroidValue(int halValue, const ValuePair<T>* table, int tableCount, T* androidValue)
-+{
-+    CheckError(!table, icamera::BAD_VALUE, "null table!");
-+    CheckError(!androidValue, icamera::BAD_VALUE, "androidValue is nullptr!");
-+
-+    for (int i = 0; i < tableCount; i++) {
-+        if (halValue == table[i].halValue) {
-+            *androidValue = table[i].androidValue;
-+            return icamera::OK;
-+        }
-+    }
-+    return icamera::BAD_VALUE;
-+}
-+
-+template<typename T>
-+static int getHalValue(T androidValue, const ValuePair<T>* table, int tableCount, int* halValue)
-+{
-+    CheckError(!table, icamera::BAD_VALUE, "null table!");
-+    CheckError(!halValue, icamera::BAD_VALUE, "halValue is nullptr!");
-+
-+    for (int i = 0; i < tableCount; i++) {
-+        if (androidValue == table[i].androidValue) {
-+            *halValue = table[i].halValue;
-+            return icamera::OK;
-+        }
-+    }
-+    return icamera::BAD_VALUE;
-+}
-+
-+static const ValuePair<int32_t> testPatternTable[]= {
-+    {icamera::TEST_PATTERN_OFF,        ANDROID_SENSOR_TEST_PATTERN_MODE_OFF},
-+    {icamera::SOLID_COLOR,             ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR},
-+    {icamera::COLOR_BARS,              ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS},
-+    {icamera::COLOR_BARS_FADE_TO_GRAY, ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY},
-+    {icamera::PN9,                     ANDROID_SENSOR_TEST_PATTERN_MODE_PN9},
-+    {icamera::TEST_PATTERN_CUSTOM1,    ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1},
-+};
-+
-+static const ValuePair<uint8_t> antibandingModesTable[] = {
-+    {icamera::ANTIBANDING_MODE_AUTO,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO},
-+    {icamera::ANTIBANDING_MODE_50HZ,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ},
-+    {icamera::ANTIBANDING_MODE_60HZ,  ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ},
-+    {icamera::ANTIBANDING_MODE_OFF,   ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF},
-+};
-+
-+static const ValuePair<uint8_t> aeModesTable[] = {
-+    {icamera::AE_MODE_AUTO,   ANDROID_CONTROL_AE_MODE_ON},
-+    {icamera::AE_MODE_MANUAL, ANDROID_CONTROL_AE_MODE_OFF},
-+};
-+
-+static const ValuePair<uint8_t> awbModesTable[] = {
-+    {icamera::AWB_MODE_AUTO,            ANDROID_CONTROL_AWB_MODE_AUTO},
-+    {icamera::AWB_MODE_INCANDESCENT,    ANDROID_CONTROL_AWB_MODE_INCANDESCENT},
-+    {icamera::AWB_MODE_FLUORESCENT,     ANDROID_CONTROL_AWB_MODE_FLUORESCENT},
-+    {icamera::AWB_MODE_DAYLIGHT,        ANDROID_CONTROL_AWB_MODE_DAYLIGHT},
-+    {icamera::AWB_MODE_FULL_OVERCAST,   ANDROID_CONTROL_AWB_MODE_TWILIGHT},
-+    {icamera::AWB_MODE_PARTLY_OVERCAST, ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT},
-+    {icamera::AWB_MODE_MANUAL_COLOR_TRANSFORM, ANDROID_CONTROL_AWB_MODE_OFF},
-+};
-+
-+static const ValuePair<uint8_t> afModesTable[] = {
-+    {icamera::AF_MODE_OFF,                ANDROID_CONTROL_AF_MODE_OFF},
-+    {icamera::AF_MODE_AUTO,               ANDROID_CONTROL_AF_MODE_AUTO},
-+    {icamera::AF_MODE_MACRO,              ANDROID_CONTROL_AF_MODE_MACRO},
-+    {icamera::AF_MODE_CONTINUOUS_VIDEO,   ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO},
-+    {icamera::AF_MODE_CONTINUOUS_PICTURE, ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE},
-+};
-+
-+static const ValuePair<uint8_t> afTriggerTable[] = {
-+    {icamera::AF_TRIGGER_START,  ANDROID_CONTROL_AF_TRIGGER_START},
-+    {icamera::AF_TRIGGER_CANCEL, ANDROID_CONTROL_AF_TRIGGER_CANCEL},
-+    {icamera::AF_TRIGGER_IDLE,   ANDROID_CONTROL_AF_TRIGGER_IDLE},
-+};
-+
-+static const ValuePair<uint8_t> dvsModesTable[] = {
-+    {icamera::VIDEO_STABILIZATION_MODE_OFF, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF},
-+    {icamera::VIDEO_STABILIZATION_MODE_ON,  ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON},
-+};
-+
-+static const ValuePair<uint8_t> effectModesTable[] = {
-+    {icamera::CAM_EFFECT_NONE,     ANDROID_CONTROL_EFFECT_MODE_OFF},
-+    {icamera::CAM_EFFECT_MONO,     ANDROID_CONTROL_EFFECT_MODE_MONO},
-+    {icamera::CAM_EFFECT_SEPIA,    ANDROID_CONTROL_EFFECT_MODE_SEPIA},
-+    {icamera::CAM_EFFECT_NEGATIVE, ANDROID_CONTROL_EFFECT_MODE_NEGATIVE},
-+};
-+
-+static const ValuePair<uint8_t> shadingModeTable[] = {
-+    {icamera::SHADING_MODE_OFF,   ANDROID_SHADING_MODE_OFF},
-+    {icamera::SHADING_MODE_FAST, ANDROID_SHADING_MODE_FAST},
-+    {icamera::SHADING_MODE_HIGH_QUALITY, ANDROID_SHADING_MODE_HIGH_QUALITY},
-+};
-+
-+static const ValuePair<uint8_t> lensShadingMapModeTable[] = {
-+    {icamera::LENS_SHADING_MAP_MODE_OFF,   ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF},
-+    {icamera::LENS_SHADING_MAP_MODE_ON, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON},
-+};
-+
-+static const ValuePair<uint8_t> tonemapModesTable[] = {
-+    {icamera::TONEMAP_MODE_FAST,         ANDROID_TONEMAP_MODE_FAST},
-+    {icamera::TONEMAP_MODE_HIGH_QUALITY, ANDROID_TONEMAP_MODE_HIGH_QUALITY},
-+    {icamera::TONEMAP_MODE_GAMMA_VALUE,  ANDROID_TONEMAP_MODE_GAMMA_VALUE},
-+    {icamera::TONEMAP_MODE_PRESET_CURVE, ANDROID_TONEMAP_MODE_PRESET_CURVE},
-+};
-+
-+static const ValuePair<uint8_t> tonemapPresetCurvesTable[] = {
-+    {icamera::TONEMAP_PRESET_CURVE_SRGB,   ANDROID_TONEMAP_PRESET_CURVE_SRGB},
-+    {icamera::TONEMAP_PRESET_CURVE_REC709, ANDROID_TONEMAP_PRESET_CURVE_REC709},
-+};
-+
-+MetadataConvert::MetadataConvert(int cameraId) :
-+    mCameraId(cameraId)
-+{
-+    LOG1("@%s, mCameraId %d", __func__, mCameraId);
-+}
-+
-+MetadataConvert::~MetadataConvert()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+int MetadataConvert::constructDefaultMetadata(android::CameraMetadata *settings)
-+{
-+    LOG1("@%s", __func__);
-+
-+    int maxRegions[3] = {1,0,1};
-+    settings->update(ANDROID_CONTROL_MAX_REGIONS, maxRegions, 3);
-+
-+    // AE, AF region (AWB region is not supported)
-+    int meteringRegion[5] = {0, 0, 0, 0, 0};
-+    settings->update(ANDROID_CONTROL_AE_REGIONS, meteringRegion, 5);
-+    settings->update(ANDROID_CONTROL_AF_REGIONS, meteringRegion, 5);
-+
-+    // Control AE, AF, AWB
-+    uint8_t mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
-+    settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
-+    int32_t ev = 0;
-+    settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
-+    uint8_t lock = ANDROID_CONTROL_AE_LOCK_OFF;
-+    settings->update(ANDROID_CONTROL_AE_LOCK, &lock, 1);
-+    mode = ANDROID_CONTROL_AE_MODE_ON;
-+    settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
-+    settings->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &mode, 1);
-+    mode = ANDROID_CONTROL_AE_STATE_INACTIVE;
-+    settings->update(ANDROID_CONTROL_AE_STATE, &mode, 1);
-+
-+    mode = ANDROID_CONTROL_AF_MODE_OFF;
-+    settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_AF_TRIGGER_IDLE;
-+    settings->update(ANDROID_CONTROL_AF_TRIGGER, &mode, 1);
-+    mode = ANDROID_CONTROL_AF_STATE_INACTIVE;
-+    settings->update(ANDROID_CONTROL_AF_STATE, &mode, 1);
-+
-+    lock = ANDROID_CONTROL_AWB_LOCK_OFF;
-+    settings->update(ANDROID_CONTROL_AWB_LOCK, &lock, 1);
-+    mode = ANDROID_CONTROL_AWB_MODE_AUTO;
-+    settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_AWB_STATE_INACTIVE;
-+    settings->update(ANDROID_CONTROL_AWB_STATE, &mode, 1);
-+
-+    // Control others
-+    mode = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
-+    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &mode, 1);
-+    mode = ANDROID_CONTROL_EFFECT_MODE_OFF;
-+    settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_MODE_AUTO;
-+    settings->update(ANDROID_CONTROL_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
-+    settings->update(ANDROID_CONTROL_SCENE_MODE, &mode, 1);
-+    mode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
-+    settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
-+
-+    // Edge
-+    mode = ANDROID_EDGE_MODE_OFF;
-+    settings->update(ANDROID_EDGE_MODE, &mode, 1);
-+
-+    // Noise reduction
-+    mode = ANDROID_NOISE_REDUCTION_MODE_OFF;
-+    settings->update(ANDROID_NOISE_REDUCTION_MODE, &mode, 1);
-+
-+    // Flash
-+    mode = ANDROID_FLASH_MODE_OFF;
-+    settings->update(ANDROID_FLASH_MODE, &mode, 1);
-+    mode = ANDROID_FLASH_STATE_READY;
-+    settings->update(ANDROID_FLASH_STATE, &mode, 1);
-+
-+    // Hot pixel
-+    mode = ANDROID_HOT_PIXEL_MODE_FAST;
-+    settings->update(ANDROID_HOT_PIXEL_MODE, &mode, 1);
-+
-+    // Black level
-+    lock = ANDROID_BLACK_LEVEL_LOCK_OFF;
-+    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lock, 1);
-+
-+    // Lens
-+    camera_metadata_entry entry = settings->find(ANDROID_LENS_INFO_AVAILABLE_APERTURES);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_APERTURE, &entry.data.f[0], 1);
-+    }
-+    entry = settings->find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_FOCAL_LENGTH, &entry.data.f[0], 1);
-+    }
-+    entry = settings->find(CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &entry.data.f[0], 1);
-+    }
-+
-+    float filterDensity = 0.0f;
-+    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
-+    mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
-+    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
-+
-+    int64_t value_i64 = 0;
-+    settings->update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &value_i64, 1);
-+
-+    // Sync
-+    int64_t frameNumber = ANDROID_SYNC_FRAME_NUMBER_UNKNOWN;
-+    settings->update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, 1);
-+
-+    // Request
-+    mode = ANDROID_REQUEST_TYPE_CAPTURE;
-+    settings->update(ANDROID_REQUEST_TYPE, &mode, 1);
-+    mode = ANDROID_REQUEST_METADATA_MODE_NONE;
-+    settings->update(ANDROID_REQUEST_METADATA_MODE, &mode, 1);
-+
-+    // Scale
-+    int32_t region[] = {0, 0, 0, 0};
-+    settings->update(ANDROID_SCALER_CROP_REGION, region, 4);
-+
-+    // Statistics
-+    mode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_FACE_DETECT_MODE, &mode, 1);
-+    mode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &mode, 1);
-+    mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &mode, 1);
-+    mode = ANDROID_STATISTICS_SCENE_FLICKER_NONE;
-+    settings->update(ANDROID_STATISTICS_SCENE_FLICKER, &mode, 1);
-+
-+    // Tonemap
-+    mode = ANDROID_TONEMAP_MODE_FAST;
-+    settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
-+
-+    // Sensor
-+    value_i64 = 0;
-+    settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &value_i64, 1);
-+    int32_t sensitivity = 0;
-+    settings->update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1);
-+    int64_t frameDuration = 33000000;
-+    settings->update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
-+    int32_t testPattern = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
-+    settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &testPattern, 1);
-+
-+    // Jpeg
-+    uint8_t quality = 95;
-+    settings->update(ANDROID_JPEG_QUALITY, &quality, 1);
-+    quality = 90;
-+    settings->update(ANDROID_JPEG_THUMBNAIL_QUALITY, &quality, 1);
-+
-+    entry = settings->find(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
-+    int32_t thumbSize[] = { 0, 0 };
-+    if (entry.count >= 4) {
-+        thumbSize[0] = entry.data.i32[2];
-+        thumbSize[1] = entry.data.i32[3];
-+    } else {
-+        LOGE("Thumbnail size should have more than 2 resolutions: 0x0 and non zero size. Debug.");
-+    }
-+    settings->update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbSize, 2);
-+
-+    entry = settings->find(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES);
-+    if (entry.count > 0) {
-+        mode = entry.data.u8[0];
-+        for (uint32_t i = 0; i < entry.count; i++) {
-+            if (entry.data.u8[i] == ANDROID_TONEMAP_MODE_HIGH_QUALITY) {
-+                mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
-+                break;
-+            }
-+        }
-+        settings->update(ANDROID_TONEMAP_MODE, &mode, 1);
-+    }
-+
-+    // Color correction
-+    mode = ANDROID_COLOR_CORRECTION_MODE_FAST;
-+    settings->update(ANDROID_COLOR_CORRECTION_MODE, &mode, 1);
-+
-+    float colorTransform[9] = {1.0, 0.0, 0.0,
-+                               0.0, 1.0, 0.0,
-+                               0.0, 0.0, 1.0};
-+    camera_metadata_rational_t transformMatrix[9];
-+    for (int i = 0; i < 9; i++) {
-+        transformMatrix[i].numerator = colorTransform[i];
-+        transformMatrix[i].denominator = 1.0;
-+    }
-+    settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, transformMatrix, 9);
-+
-+    float colorGains[4] = {1.0, 1.0, 1.0, 1.0};
-+    settings->update(ANDROID_COLOR_CORRECTION_GAINS, colorGains, 4);
-+
-+    mode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
-+    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &mode, 1);
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::updateDefaultRequestSettings(int type, android::CameraMetadata *settings)
-+{
-+    uint8_t intent =
-+        (type == CAMERA3_TEMPLATE_PREVIEW)          ? ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW : \
-+        (type == CAMERA3_TEMPLATE_STILL_CAPTURE)    ? ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE : \
-+        (type == CAMERA3_TEMPLATE_VIDEO_RECORD)     ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD : \
-+        (type == CAMERA3_TEMPLATE_VIDEO_SNAPSHOT)   ? ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT : \
-+        (type == CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG) ? ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG : \
-+        (type == CAMERA3_TEMPLATE_MANUAL)           ? ANDROID_CONTROL_CAPTURE_INTENT_MANUAL : \
-+        ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
-+    settings->update(ANDROID_CONTROL_CAPTURE_INTENT, &intent, 1);
-+
-+    uint8_t ctrlMode = ANDROID_CONTROL_MODE_AUTO;
-+    uint8_t aeMode   = ANDROID_CONTROL_AE_MODE_ON;
-+    uint8_t awbMode  = ANDROID_CONTROL_AWB_MODE_AUTO;
-+    uint8_t afMode   = ANDROID_CONTROL_AF_MODE_OFF;
-+
-+    switch (type) {
-+    case CAMERA3_TEMPLATE_MANUAL:
-+        ctrlMode = ANDROID_CONTROL_MODE_OFF;
-+        aeMode   = ANDROID_CONTROL_AE_MODE_OFF;
-+        awbMode  = ANDROID_CONTROL_AWB_MODE_OFF;
-+        afMode   = ANDROID_CONTROL_AF_MODE_OFF;
-+        break;
-+    case CAMERA3_TEMPLATE_STILL_CAPTURE:
-+    case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
-+    case CAMERA3_TEMPLATE_PREVIEW:
-+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
-+        break;
-+    case CAMERA3_TEMPLATE_VIDEO_RECORD:
-+    case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
-+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    // Check if AF mode is supported or not.
-+    uint32_t tag = ANDROID_CONTROL_AF_AVAILABLE_MODES;
-+    camera_metadata_entry entry = settings->find(tag);
-+    bool found = false;
-+    if (entry.count > 0) {
-+       for (size_t i = 0; i < entry.count; i++) {
-+           if (afMode == entry.data.u8[i]) found = true;
-+       }
-+    }
-+    if (!found) afMode = ANDROID_CONTROL_AF_MODE_OFF;
-+
-+    LOG2("%s, type %d, ctrlMode %d, aeMode %d, awbMode %d, afMode %d",
-+            __func__, type, ctrlMode, aeMode, awbMode, afMode);
-+    settings->update(ANDROID_CONTROL_MODE,     &ctrlMode, 1);
-+    settings->update(ANDROID_CONTROL_AE_MODE,  &aeMode,   1);
-+    settings->update(ANDROID_CONTROL_AWB_MODE, &awbMode,  1);
-+    settings->update(ANDROID_CONTROL_AF_MODE, &afMode,  1);
-+
-+    tag = ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
-+    camera_metadata_entry fpsRangesEntry = settings->find(tag);
-+    if ((fpsRangesEntry.count >= 2) && (fpsRangesEntry.count % 2 == 0)) {
-+        int32_t delta = INT32_MAX;
-+        int fpsRange[] = {DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX};
-+
-+        //choose closest (DEFAULT_FPS_RANGE_MIN, DEFAULT_FPS_RANGE_MAX) range
-+        for (size_t i = 0; i < fpsRangesEntry.count; i += 2) {
-+            int32_t diff = abs(fpsRangesEntry.data.i32[i] - DEFAULT_FPS_RANGE_MIN) +
-+                           abs(fpsRangesEntry.data.i32[i + 1] - DEFAULT_FPS_RANGE_MAX);
-+
-+            if (delta > diff) {
-+                fpsRange[0] = fpsRangesEntry.data.i32[i];
-+                fpsRange[1] = fpsRangesEntry.data.i32[i + 1];
-+                delta = diff;
-+            }
-+        }
-+
-+        if (type == CAMERA3_TEMPLATE_VIDEO_RECORD) {
-+            // Stable range requried for video recording
-+            fpsRange[0] = fpsRange[1];
-+        }
-+        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fpsRange[0], 2);
-+    } else {
-+        LOGW("The fpsRanges isn't correct, please check the profiles file");
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::requestMetadataToHALMetadata(const android::CameraMetadata &settings,
-+                                                  icamera::Parameters *parameter)
-+{
-+    LOG1("@%s: settings entry count %d", __func__, settings.entryCount());
-+    CheckError(parameter == nullptr, icamera::BAD_VALUE, "%s, parameter is nullptr", __func__);
-+
-+    // ANDROID_COLOR_CORRECTION
-+    convertColorCorrectionMetadata(settings, parameter);
-+
-+    // ANDROID_CONTROL
-+    convertControlMetadata(settings, parameter);
-+
-+    // ANDROID_DEMOSAIC
-+    // ANDROID_EDGE
-+    // ANDROID_HOT_PIXEL
-+    // ANDROID_NOISE_REDUCTION
-+    // ANDROID_SHADING
-+    // ANDROID_TONEMAP
-+    convertTonemapMetadata(settings, parameter);
-+    // ANDROID_BLACK_LEVEL
-+    convertAdvancedFeatureMetadata(settings, parameter);
-+    // ANDROID_FLASH
-+
-+    // ANDROID_JPEG
-+    convertJpegMetadata(settings, parameter);
-+
-+    // ANDROID_LENS
-+    convertLensMetadata(settings, parameter);
-+
-+    // ANDROID_SCALER
-+
-+    // ANDROID_SENSOR
-+    convertSensorMetadata(settings, parameter);
-+
-+    // ANDROID_STATISTICS
-+
-+    // ANDROID_LED
-+
-+    // ANDROID_REPROCESS
-+
-+     return icamera::OK;
-+}
-+
-+int MetadataConvert::HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
-+                                                  android::CameraMetadata *settings)
-+{
-+    LOG1("@%s", __func__);
-+
-+    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
-+
-+    // ANDROID_COLOR_CORRECTION
-+    convertColorCorrectionParameter(parameter, settings);
-+
-+    // ANDROID_CONTROL
-+    convertControlParameter(parameter, settings);
-+
-+    // ANDROID_FLASH
-+    // ANDROID_FLASH_INFO
-+    convertFlashParameter(parameter, settings);
-+
-+    // ANDROID_JPEG
-+
-+    // ANDROID_LENS
-+    // ANDROID_LENS_INFO
-+    convertLensParameter(parameter, settings);
-+
-+    // ANDROID_QUIRKS
-+
-+    // ANDROID_REQUEST
-+
-+    // ANDROID_SCALER
-+
-+    // ANDROID_SENSOR
-+    // ANDROID_SENSOR_INFO
-+    convertSensorParameter(parameter, settings);
-+
-+    // ANDROID_STATISTICS
-+    // ANDROID_STATISTICS_INFO
-+    convertStatisticsParameter(parameter, settings);
-+
-+    // ANDROID_TONEMAP
-+    convertTonemapParameter(parameter, settings);
-+
-+    // ANDROID_DEMOSAIC, ANDROID_EDGE, ANDROID_HOT_PIXEL, ANDROID_NOISE_REDUCTION
-+    // ANDROID_SHADING, ANDROID_INFO, ANDROID_BLACK_LEVEL, ANDROID_SYNC
-+    convertAdvancedFeatureParameter(parameter, settings);
-+
-+    // ANDROID_LED
-+
-+    // ANDROID_REPROCESS
-+
-+    // ANDROID_DEPTH
-+
-+    LOG1("@%s: convert entry count %d", __func__, settings->entryCount());
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::HALCapabilityToStaticMetadata(const icamera::Parameters &parameter,
-+                                                   android::CameraMetadata *settings)
-+{
-+    LOG1("@%s", __func__);
-+
-+    CheckError(settings == nullptr, icamera::BAD_VALUE, "%s, settings is nullptr", __func__);
-+
-+    // ANDROID_COLOR_CORRECTION
-+    uint8_t aberrationAvailable = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
-+    settings->update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, &aberrationAvailable, 1);
-+
-+    // ANDROID_CONTROL
-+    fillControlStaticMetadata(parameter, settings);
-+
-+    // ANDROID_FLASH
-+    // ANDROID_FLASH_INFO
-+    uint8_t flashInfoAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;
-+    settings->update(ANDROID_FLASH_INFO_AVAILABLE, &flashInfoAvailable, 1);
-+
-+    // ANDROID_JPEG
-+    fillJpegStaticMetadata(parameter, settings);
-+
-+    // ANDROID_LENS
-+    // ANDROID_LENS_INFO
-+    fillLensStaticMetadata(parameter, settings);
-+
-+    // ANDROID_QUIRKS
-+
-+    // ANDROID_REQUEST
-+    fillRequestStaticMetadata(parameter, settings);
-+
-+    // ANDROID_SCALER
-+    fillScalerStaticMetadata(parameter, settings);
-+
-+    // ANDROID_SENSOR
-+    // ANDROID_SENSOR_INFO
-+    fillSensorStaticMetadata(parameter, settings);
-+
-+    // ANDROID_STATISTICS
-+    // ANDROID_STATISTICS_INFO
-+    fillStatisticsStaticMetadata(parameter, settings);
-+
-+    // ANDROID_TONEMAP
-+    fillTonemapStaticMetadata(parameter, settings);
-+
-+    // ANDROID_LED
-+    uint8_t availLeds = ANDROID_LED_AVAILABLE_LEDS_TRANSMIT;
-+    settings->update(ANDROID_LED_AVAILABLE_LEDS, &availLeds, 1);
-+
-+    // ANDROID_REPROCESS
-+
-+    // ANDROID_DEPTH
-+
-+    fillAdvancedFeatureStaticMetadata(parameter, settings);
-+
-+    return icamera::OK;
-+}
-+
-+void MetadataConvert::convertFaceDetectionMetadata(
-+                                        const icamera::CVFaceDetectionAbstractResult &fdResult,
-+                                        android::CameraMetadata *settings)
-+{
-+    CheckError(settings == nullptr, VOID_VALUE, "@%s, settings is nullptr", __func__);
-+
-+    camera_metadata_entry entry = settings->find(ANDROID_STATISTICS_FACE_DETECT_MODE);
-+    CheckError(entry.count == 0, VOID_VALUE, "@%s: No face detection mode setting", __func__);
-+
-+    const uint8_t mode = entry.data.u8[0];
-+    if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
-+        LOG2("%s: Face mode is off", __func__);
-+        int faceIds[1] = {0};
-+        settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
-+        return;
-+    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE) {
-+        LOG2("%s: Face mode is simple", __func__);
-+        // Face id is expected to be -1 for SIMPLE mode
-+        if (fdResult.faceNum > 0) {
-+            int faceIds[MAX_FACES_DETECTABLE];
-+            for (int i = 0; i < fdResult.faceNum; i++) {
-+                faceIds[i] = -1;
-+            }
-+            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, fdResult.faceNum);
-+        } else {
-+            int faceIds[1] = {-1};
-+            settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, 1);
-+        }
-+    } else if (mode == ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
-+        LOG2("%s: Face mode is full", __func__);
-+        /*
-+         * from the spec:
-+         * SIMPLE mode must fill in android.statistics.faceRectangles and android.statistics.faceScores.
-+         * FULL mode must also fill in android.statistics.faceIds, and android.statistics.faceLandmarks.
-+         */
-+        settings->update(ANDROID_STATISTICS_FACE_IDS, fdResult.faceIds, fdResult.faceNum);
-+        settings->update(ANDROID_STATISTICS_FACE_LANDMARKS, fdResult.faceLandmarks, LM_SIZE * fdResult.faceNum);
-+    }
-+
-+    settings->update(ANDROID_STATISTICS_FACE_RECTANGLES, fdResult.faceRect, RECT_SIZE * fdResult.faceNum);
-+    settings->update(ANDROID_STATISTICS_FACE_SCORES, fdResult.faceScores, fdResult.faceNum);
-+}
-+
-+int MetadataConvert::convertColorCorrectionMetadata(const android::CameraMetadata &settings,
-+                                                    icamera::Parameters *parameter)
-+{
-+    uint32_t tag = ANDROID_COLOR_CORRECTION_TRANSFORM;
-+    camera_metadata_ro_entry entry = settings.find(tag);
-+    if (entry.count == 9) {
-+        icamera::camera_color_transform_t transform;
-+        for (size_t i = 0; i < entry.count; i++) {
-+            transform.color_transform[i / 3][i % 3] =
-+                    ((float)entry.data.r[i].numerator) / entry.data.r[i].denominator;
-+        }
-+        parameter->setColorTransform(transform);
-+    }
-+
-+    tag = ANDROID_COLOR_CORRECTION_GAINS;
-+    entry = settings.find(tag);
-+    if (entry.count == 4) {
-+        icamera::camera_color_gains_t gains;
-+        for (size_t i = 0; i < entry.count; i++) {
-+            gains.color_gains_rggb[i] = entry.data.f[i];
-+        }
-+        parameter->setColorGains(gains);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertColorCorrectionParameter(const icamera::Parameters &parameter,
-+                                                     android::CameraMetadata *settings)
-+{
-+    icamera::camera_color_transform_t transform;
-+    if (parameter.getColorTransform(transform) == 0) {
-+        camera_metadata_rational_t matrix[9];
-+        for (int i = 0; i < 9; i++) {
-+            matrix[i].numerator = round(transform.color_transform[i / 3][i % 3] * 1000);
-+            matrix[i].denominator = 1000;
-+        }
-+        settings->update(ANDROID_COLOR_CORRECTION_TRANSFORM, &matrix[0], 9);
-+    }
-+
-+    icamera::camera_color_gains_t colorGains;
-+    if (parameter.getColorGains(colorGains) == 0) {
-+        settings->update(ANDROID_COLOR_CORRECTION_GAINS, &colorGains.color_gains_rggb[0], 4);
-+    }
-+
-+    uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
-+    settings->update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &aberrationMode, 1);
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertControlMetadata(const android::CameraMetadata &settings,
-+                                            icamera::Parameters *parameter)
-+{
-+    int ret = icamera::OK;
-+    int mode = 0;
-+    uint32_t tag = ANDROID_CONTROL_AE_MODE;
-+    camera_metadata_ro_entry entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setAeMode((icamera::camera_ae_mode_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_STATISTICS_FACE_DETECT_MODE;
-+    entry = settings.find(tag);
-+    uint8_t fdValue = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
-+    if ((entry.count == 1) && (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF)) {
-+        int faceIds[1] = {0};
-+        parameter->setFaceIds(faceIds, 1);
-+    } else {
-+        fdValue = entry.data.u8[0];
-+    }
-+    parameter->setFaceDetectMode(fdValue);
-+
-+    tag = ANDROID_CONTROL_AE_LOCK;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        bool aeLock = (entry.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON);
-+        parameter->setAeLock(aeLock);
-+    }
-+
-+    tag = ANDROID_CONTROL_AE_REGIONS;
-+    entry = settings.find(tag);
-+    icamera::camera_window_list_t windows;
-+    if (entry.count > 0) {
-+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
-+            parameter->setAeRegions(windows);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AE_TARGET_FPS_RANGE;
-+    entry = settings.find(tag);
-+    if (entry.count == 2) {
-+        icamera::camera_range_t range;
-+        range.min = entry.data.i32[0];
-+        range.max = entry.data.i32[1];
-+        parameter->setFpsRange(range);
-+    }
-+
-+    tag = ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setAeCompensation(entry.data.i32[0]);
-+    }
-+
-+    tag = ANDROID_CONTROL_AE_ANTIBANDING_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setAntiBandingMode((icamera::camera_antibanding_mode_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AF_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], afModesTable, ARRAY_SIZE(afModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setAfMode((icamera::camera_af_mode_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AF_TRIGGER;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], afTriggerTable, ARRAY_SIZE(afTriggerTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setAfTrigger((icamera::camera_af_trigger_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AF_REGIONS;
-+    entry = settings.find(tag);
-+    windows.clear();
-+    if (entry.count > 0) {
-+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
-+            parameter->setAfRegions(windows);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AWB_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setAwbMode((icamera::camera_awb_mode_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_AWB_LOCK;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        bool awbLock = (entry.data.u8[0] == ANDROID_CONTROL_AWB_LOCK_ON);
-+        parameter->setAwbLock(awbLock);
-+    }
-+
-+    tag = ANDROID_CONTROL_AWB_REGIONS;
-+    entry = settings.find(tag);
-+    windows.clear();
-+    if (entry.count > 0) {
-+        if (convertToHalWindow(entry.data.i32, entry.count, &windows) == 0) {
-+            parameter->setAwbRegions(windows);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setVideoStabilizationMode((icamera::camera_video_stabilization_mode_t)mode);
-+        }
-+    }
-+
-+    tag = ANDROID_CONTROL_EFFECT_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setImageEffect((icamera::camera_effect_mode_t)mode);
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertControlParameter(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings)
-+{
-+    int ret = icamera::OK;
-+    uint8_t mode = 0;
-+    icamera::camera_ae_mode_t aeMode;
-+    if (parameter.getAeMode(aeMode) == 0) {
-+        ret = getAndroidValue(aeMode,aeModesTable, ARRAY_SIZE(aeModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_AE_MODE, &mode, 1);
-+        }
-+    }
-+
-+    bool aeLock;
-+    if (parameter.getAeLock(aeLock) == 0) {
-+        uint8_t mode = aeLock ? ANDROID_CONTROL_AE_LOCK_ON
-+                              : ANDROID_CONTROL_AE_LOCK_OFF;
-+        settings->update(ANDROID_CONTROL_AE_LOCK, &mode, 1);
-+    }
-+
-+    icamera::camera_window_list_t windows;
-+    parameter.getAeRegions(windows);
-+    int count = windows.size() * 5;
-+    if (count > 0) {
-+        int regions[count];
-+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AE_REGIONS, &regions[0], count);
-+        }
-+    }
-+
-+    icamera::camera_range_t range;
-+    if (parameter.getFpsRange(range) == 0) {
-+        int fps[2] = {(int)range.min, (int)range.max};
-+        settings->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &fps[0], 2);
-+    }
-+
-+    int ev;
-+    if (parameter.getAeCompensation(ev) == 0) {
-+        settings->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &ev, 1);
-+    }
-+
-+    icamera::camera_antibanding_mode_t antiMode;
-+    if (parameter.getAntiBandingMode(antiMode) == 0) {
-+        ret = getAndroidValue(antiMode, antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &mode, 1);
-+        }
-+    }
-+
-+    icamera::camera_af_mode_t afMode;
-+    if (parameter.getAfMode(afMode) == 0) {
-+        ret = getAndroidValue(afMode, afModesTable, ARRAY_SIZE(afModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_AF_MODE, &mode, 1);
-+        }
-+    }
-+
-+    windows.clear();
-+    parameter.getAfRegions(windows);
-+    count = windows.size() * 5;
-+    if (count > 0) {
-+        int regions[count];
-+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AF_REGIONS, &regions[0], count);
-+        }
-+    }
-+
-+    icamera::camera_awb_mode_t awbMode;
-+    if (parameter.getAwbMode(awbMode) == 0) {
-+        ret = getAndroidValue(awbMode, awbModesTable, ARRAY_SIZE(awbModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_AWB_MODE, &mode, 1);
-+        }
-+    }
-+
-+    bool awbLock;
-+    if (parameter.getAwbLock(awbLock) == 0) {
-+        uint8_t mode = awbLock ? ANDROID_CONTROL_AWB_LOCK_ON
-+                               : ANDROID_CONTROL_AWB_LOCK_OFF;
-+        settings->update(ANDROID_CONTROL_AWB_LOCK, &mode, 1);
-+    }
-+
-+    windows.clear();
-+    parameter.getAwbRegions(windows);
-+    count = windows.size() * 5;
-+    if (count > 0) {
-+        int regions[count];
-+        count = convertToMetadataRegion(windows, windows.size() * 5, regions);
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AWB_REGIONS, &regions[0], count);
-+        }
-+    }
-+
-+    icamera::camera_video_stabilization_mode_t dvsMode;
-+    if (parameter.getVideoStabilizationMode(dvsMode) == 0) {
-+        ret = getAndroidValue(dvsMode, dvsModesTable, ARRAY_SIZE(dvsModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &mode, 1);
-+        }
-+    }
-+
-+    icamera::camera_effect_mode_t effectMode;
-+    if (parameter.getImageEffect(effectMode) == 0) {
-+        ret = getAndroidValue(effectMode, effectModesTable, ARRAY_SIZE(effectModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_CONTROL_EFFECT_MODE, &mode, 1);
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertJpegMetadata(const android::CameraMetadata &settings,
-+                                         icamera::Parameters *parameter)
-+{
-+    uint32_t tag = ANDROID_JPEG_GPS_COORDINATES;
-+    camera_metadata_ro_entry entry = settings.find(tag);
-+    if (entry.count == 3) {
-+        parameter->setJpegGpsCoordinates(entry.data.d);
-+    }
-+
-+    tag = ANDROID_JPEG_GPS_PROCESSING_METHOD;
-+    entry = settings.find(tag);
-+    if (entry.count >= 1) {
-+        char data[entry.count + 1];
-+        MEMCPY_S(data, sizeof(data), entry.data.u8, entry.count);
-+        data[entry.count] = 0;
-+        parameter->setJpegGpsProcessingMethod(data);
-+    }
-+
-+    tag = ANDROID_JPEG_GPS_TIMESTAMP;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setJpegGpsTimeStamp(entry.data.i64[0]);
-+    }
-+
-+    tag = ANDROID_JPEG_ORIENTATION;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setJpegRotation(entry.data.i32[0]);
-+    }
-+
-+    tag = ANDROID_JPEG_QUALITY;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        int quality = entry.data.u8[0];
-+        parameter->setJpegQuality(quality);
-+    }
-+
-+    tag = ANDROID_JPEG_THUMBNAIL_QUALITY;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        int quality = entry.data.u8[0];
-+        parameter->setJpegThumbnailQuality(quality);
-+    }
-+
-+    tag = ANDROID_JPEG_THUMBNAIL_SIZE;
-+    entry = settings.find(tag);
-+    if (entry.count == 2) {
-+        icamera::camera_resolution_t size;
-+        size.width  = entry.data.i32[0];
-+        size.height = entry.data.i32[1];
-+        parameter->setJpegThumbnailSize(size);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertTonemapMetadata(const android::CameraMetadata &settings,
-+                                            icamera::Parameters *parameter) {
-+    int ret = icamera::OK;
-+
-+    camera_metadata_ro_entry entry = settings.find(ANDROID_TONEMAP_MODE);
-+    if (entry.count == 1) {
-+        int32_t mode = 0;
-+        ret = getHalValue(entry.data.u8[0], tonemapModesTable,
-+                          ARRAY_SIZE(tonemapModesTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setTonemapMode((icamera::camera_tonemap_mode_t)mode);
-+        }
-+    }
-+
-+    entry = settings.find(ANDROID_TONEMAP_PRESET_CURVE);
-+    if (entry.count == 1) {
-+        int32_t curve = 0;
-+        ret = getHalValue(entry.data.u8[0], tonemapPresetCurvesTable,
-+                          ARRAY_SIZE(tonemapPresetCurvesTable), &curve);
-+        if (ret == icamera::OK) {
-+            parameter->setTonemapPresetCurve((icamera::camera_tonemap_preset_curve_t)curve);
-+        }
-+    }
-+
-+    entry = settings.find(ANDROID_TONEMAP_GAMMA);
-+    if (entry.count == 1) {
-+        parameter->setTonemapGamma(entry.data.f[0]);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertTonemapParameter(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings) {
-+    icamera::camera_tonemap_curves_t curves;
-+    if (parameter.getTonemapCurves(curves) == 0) {
-+        settings->update(ANDROID_TONEMAP_CURVE_RED, curves.rCurve, curves.rSize);
-+        settings->update(ANDROID_TONEMAP_CURVE_BLUE, curves.bCurve, curves.bSize);
-+        settings->update(ANDROID_TONEMAP_CURVE_GREEN, curves.gCurve, curves.gSize);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertSensorMetadata(const android::CameraMetadata &settings,
-+                                           icamera::Parameters *parameter)
-+{
-+    // get control ae mode
-+    uint8_t manualAeMode = ANDROID_CONTROL_AE_MODE_ON;
-+    uint32_t tag = ANDROID_CONTROL_AE_MODE;
-+    camera_metadata_ro_entry entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        manualAeMode = entry.data.u8[0];
-+    }
-+
-+    // get control mode
-+    uint8_t manualMode = ANDROID_CONTROL_MODE_AUTO;
-+    tag = ANDROID_CONTROL_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        manualMode = entry.data.u8[0];
-+    }
-+
-+    if (manualAeMode == ANDROID_CONTROL_AE_MODE_OFF || manualMode == ANDROID_CONTROL_MODE_OFF) {
-+        // manual exposure control
-+        tag = ANDROID_SENSOR_EXPOSURE_TIME;
-+        entry = settings.find(tag);
-+        if (entry.count == 1) {
-+            parameter->setExposureTime(entry.data.i64[0] / 1000); // ns -> us
-+        }
-+
-+        // manual sensitivity control
-+        tag = ANDROID_SENSOR_SENSITIVITY;
-+        entry = settings.find(tag);
-+        if (entry.count == 1) {
-+            float sensitivity = log10(entry.data.i32[0]) * 20.0; // ISO -> db
-+            parameter->setSensitivityGain(sensitivity);
-+        }
-+
-+        // manual frame duration control
-+        int64_t maxFrameDuration = 0;
-+        entry = settings.find(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION);
-+        if (entry.count == 1) {
-+            maxFrameDuration = entry.data.i64[0];
-+            LOG2("@%s, maxFrameDuration:%ld ns", __func__, maxFrameDuration);
-+        }
-+
-+        tag = ANDROID_SENSOR_FRAME_DURATION;
-+        entry = settings.find(tag);
-+        if (entry.count == 1) {
-+            int64_t frameDuration = entry.data.i64[0];
-+            LOG2("@%s, frameDuration:%ld ns", __func__, frameDuration);
-+            if (maxFrameDuration > 0 && frameDuration > maxFrameDuration) {
-+                frameDuration = maxFrameDuration;
-+            }
-+
-+            float fps = NSEC_PER_SEC / frameDuration;
-+            parameter->setFrameRate(fps);
-+        }
-+    }
-+
-+    // Test Pattern Mode
-+    tag = ANDROID_SENSOR_TEST_PATTERN_MODE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        int halTestPatternMode = icamera::TEST_PATTERN_OFF;
-+        int ret = getHalValue(entry.data.i32[0], testPatternTable, ARRAY_SIZE(testPatternTable),
-+                              &halTestPatternMode);
-+        if (ret == icamera::OK) {
-+            parameter->setTestPatternMode(static_cast<icamera::camera_test_pattern_mode_t>(halTestPatternMode));
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertSensorParameter(const icamera::Parameters &parameter,
-+                                            android::CameraMetadata *settings)
-+{
-+    int64_t exposure;
-+    if (parameter.getExposureTime(exposure) == 0) {
-+        int64_t time = exposure * 1000; // us -> ns
-+        settings->update(ANDROID_SENSOR_EXPOSURE_TIME, &time, 1);
-+    }
-+
-+    float sensitivity;
-+    if (parameter.getSensitivityGain(sensitivity) == 0) {
-+        int32_t iso = round(pow(10, (sensitivity / 20))); // db -> ISO
-+        settings->update(ANDROID_SENSOR_SENSITIVITY, &iso, 1);
-+    }
-+
-+    float fps;
-+    if (parameter.getFrameRate(fps) == icamera::OK) {
-+        int64_t duration = NSEC_PER_SEC / fps;
-+        settings->update(ANDROID_SENSOR_FRAME_DURATION, &duration, 1);
-+    }
-+
-+    icamera::camera_test_pattern_mode_t halTestPatternMode = icamera::TEST_PATTERN_OFF;
-+    if (parameter.getTestPatternMode(halTestPatternMode) == icamera::OK) {
-+        int32_t androidPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;
-+        int ret = getAndroidValue(halTestPatternMode, testPatternTable, ARRAY_SIZE(testPatternTable),
-+                                  &androidPatternMode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_SENSOR_TEST_PATTERN_MODE, &androidPatternMode, 1);
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertLensMetadata(const android::CameraMetadata &settings,
-+                                         icamera::Parameters *parameter)
-+{
-+    uint32_t tag = ANDROID_LENS_FOCAL_LENGTH;
-+    camera_metadata_ro_entry entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setFocalLength(entry.data.f[0]);
-+    }
-+
-+    tag = ANDROID_LENS_APERTURE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setAperture(entry.data.f[0]);
-+    }
-+
-+    tag = ANDROID_LENS_FOCUS_DISTANCE;
-+    entry = settings.find(tag);
-+    if (entry.count == 1) {
-+        parameter->setFocusDistance(entry.data.f[0]);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertLensParameter(const icamera::Parameters &parameter,
-+                                          android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_APERTURES;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_APERTURE, entry.data.f, 1);
-+    }
-+
-+    float focal = 0.0f;
-+    parameter.getFocalLength(focal);
-+    if (focal < EPSILON) {
-+        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
-+        if (entry.count >= 1) {
-+            focal = entry.data.f[0];
-+        }
-+    }
-+    settings->update(ANDROID_LENS_FOCAL_LENGTH, &focal, 1);
-+
-+    float focusDistanceDiopters = 0.0;
-+    if (parameter.getFocusDistance(focusDistanceDiopters) == 0) {
-+        settings->update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistanceDiopters, 1);
-+    }
-+
-+    icamera::camera_range_t focusRange = {};
-+    if (parameter.getFocusRange(focusRange) == 0) {
-+        float range[] = {focusRange.min, focusRange.max};
-+        settings->update(ANDROID_LENS_FOCUS_RANGE, range, 2);
-+    }
-+
-+    uint8_t mode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
-+    settings->update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &mode, 1);
-+    float filterDensity = 0.0;
-+    settings->update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertStatisticsParameter(const icamera::Parameters & /*parameter*/,
-+                                                android::CameraMetadata *settings)
-+{
-+    uint8_t fdValue = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fdValue, 1);
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertFlashParameter(const icamera::Parameters & /*parameter*/,
-+                                           android::CameraMetadata *settings)
-+{
-+    uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
-+    settings->update(ANDROID_FLASH_MODE, &flashMode, 1);
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertAdvancedFeatureMetadata(const android::CameraMetadata &settings,
-+                                                    icamera::Parameters *parameter)
-+{
-+    int ret = icamera::OK;
-+    // ANDROID_DEMOSAIC
-+    // ANDROID_EDGE
-+    // ANDROID_HOT_PIXEL
-+    // ANDROID_NOISE_REDUCTION
-+
-+    // ANDROID_SHADING
-+    int mode;
-+    camera_metadata_ro_entry entry = settings.find(ANDROID_SHADING_MODE);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], shadingModeTable,
-+                          ARRAY_SIZE(shadingModeTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setShadingMode((icamera::camera_shading_mode_t)mode);
-+        }
-+    }
-+
-+    entry = settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE);
-+    if (entry.count == 1) {
-+        ret = getHalValue(entry.data.u8[0], lensShadingMapModeTable,
-+                          ARRAY_SIZE(lensShadingMapModeTable), &mode);
-+        if (ret == icamera::OK) {
-+            parameter->setLensShadingMapMode((icamera::camera_lens_shading_map_mode_type_t)mode);
-+        }
-+    }
-+
-+    // ANDROID_TONEMAP
-+    // ANDROID_INFO
-+    // ANDROID_BLACK_LEVEL
-+
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertAdvancedFeatureParameter(const icamera::Parameters &parameter,
-+                                                     android::CameraMetadata *settings)
-+{
-+    int ret = icamera::OK;
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    // ANDROID_DEMOSAIC
-+
-+    // ANDROID_EDGE
-+    uint8_t edgeMode = ANDROID_EDGE_MODE_OFF;
-+    settings->update(ANDROID_EDGE_MODE, &edgeMode, 1);
-+
-+    // ANDROID_HOT_PIXEL
-+
-+    // ANDROID_NOISE_REDUCTION
-+    uint8_t nrMode = ANDROID_NOISE_REDUCTION_MODE_OFF;
-+    settings->update(ANDROID_NOISE_REDUCTION_MODE, &nrMode, 1);
-+
-+    // ANDROID_SHADING
-+    icamera::camera_shading_mode_t shadingMode;
-+    uint8_t saMode;
-+    if (parameter.getShadingMode(shadingMode) == icamera::OK) {
-+        ret = getAndroidValue(shadingMode, shadingModeTable,
-+                              ARRAY_SIZE(shadingModeTable), &saMode);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_SHADING_MODE, &saMode, 1);
-+        }
-+    }
-+
-+    icamera::camera_lens_shading_map_mode_type_t lensShadingMapMode;
-+    uint8_t lesnSMMode;
-+    ret = parameter.getLensShadingMapMode(lensShadingMapMode);
-+    if (ret == icamera::OK) {
-+        ret = getAndroidValue(lensShadingMapMode, shadingModeTable,
-+                              ARRAY_SIZE(shadingModeTable), &lesnSMMode);
-+        if (ret == icamera::OK) {
-+             settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lesnSMMode, 1);
-+        }
-+    }
-+
-+    if (lensShadingMapMode == icamera::LENS_SHADING_MAP_MODE_ON) {
-+        float lensShadingMap[MAX_LSC_GRID_SIZE * 4];
-+        size_t lensShadingMapSize;
-+        ret = parameter.getLensShadingMap(lensShadingMap, lensShadingMapSize);
-+        if (ret == icamera::OK) {
-+            settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP,
-+                             lensShadingMap, lensShadingMapSize);
-+            if (saMode == ANDROID_SHADING_MODE_OFF) {
-+                saMode = ANDROID_SHADING_MODE_FAST;
-+                settings->update(ANDROID_SHADING_MODE, &saMode, 1);
-+            }
-+        }
-+    }
-+
-+    // ANDROID_TONEMAP
-+    // ANDROID_INFO
-+    // ANDROID_BLACK_LEVEL
-+    // ANDROID_SYNC
-+
-+    return icamera::OK;
-+}
-+
-+void MetadataConvert::fillControlStaticMetadata(const icamera::Parameters &parameter,
-+                                                android::CameraMetadata *settings)
-+{
-+    int ret = icamera::OK;
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    icamera_metadata_entry entry = meta.find(CAMERA_CONTROL_AVAILABLE_MODES);
-+    if (entry.count != 0) {
-+        settings->update(ANDROID_CONTROL_AVAILABLE_MODES, entry.data.u8, entry.count);
-+    }
-+
-+    std::vector <icamera::camera_antibanding_mode_t> antibandingModes;
-+    parameter.getSupportedAntibandingMode(antibandingModes);
-+    if (antibandingModes.size() > 0) {
-+        int size = antibandingModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(antibandingModes[i], antibandingModesTable, ARRAY_SIZE(antibandingModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, data, count);
-+        }
-+    } else {
-+        LOGW("No antibanding modes provided!");
-+    }
-+
-+    std::vector <icamera::camera_ae_mode_t> availAeModes;
-+    parameter.getSupportedAeMode(availAeModes);
-+    if (availAeModes.size() > 0) {
-+        int size = availAeModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(availAeModes[i], aeModesTable, ARRAY_SIZE(aeModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AE_AVAILABLE_MODES, data, count);
-+        }
-+    } else {
-+        LOGW("No ae modes provided!");
-+    }
-+
-+    uint8_t aeLockAvailable = parameter.getAeLockAvailable() ? \
-+            ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE : ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE;
-+    settings->update(ANDROID_CONTROL_AE_LOCK_AVAILABLE, &aeLockAvailable, 1);
-+
-+    icamera::camera_range_array_t fpsRanges;
-+    if (parameter.getSupportedFpsRange(fpsRanges) == 0) {
-+        int count = fpsRanges.size() * 2;
-+        int32_t data[count];
-+        for (size_t i = 0; i < fpsRanges.size(); i++) {
-+            data[i * 2] = (int32_t)fpsRanges[i].min;
-+            data[i * 2 + 1] = (int32_t)fpsRanges[i].max;
-+        }
-+        settings->update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, data, count);
-+    } else {
-+        LOGW("No fps ranges provided!");
-+    }
-+
-+    icamera::camera_range_t aeCompensationRange;
-+    if (parameter.getAeCompensationRange(aeCompensationRange) == 0) {
-+        int32_t data[2];
-+        data[0] = (int32_t)aeCompensationRange.min;
-+        data[1] = (int32_t)aeCompensationRange.max;
-+        settings->update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, data, 2);
-+    } else {
-+        LOGW("No ae compensation range provided!");
-+    }
-+
-+    icamera::camera_rational_t aeCompensationStep;
-+    if (parameter.getAeCompensationStep(aeCompensationStep) == 0) {
-+        camera_metadata_rational rational;
-+        rational.numerator = aeCompensationStep.numerator;
-+        rational.denominator = aeCompensationStep.denominator;
-+        settings->update(ANDROID_CONTROL_AE_COMPENSATION_STEP, &rational, 1);
-+    } else {
-+        LOGW("No ae compensation step provided!");
-+    }
-+
-+    std::vector <icamera::camera_af_mode_t> availAfModes;
-+    parameter.getSupportedAfMode(availAfModes);
-+    if (availAfModes.size() > 0) {
-+        int size = availAfModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(availAfModes[i], afModesTable, ARRAY_SIZE(afModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AF_AVAILABLE_MODES, data, count);
-+        }
-+    } else {
-+        LOGW("No af modes provided!");
-+    }
-+
-+    uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
-+    settings->update(ANDROID_CONTROL_AVAILABLE_EFFECTS, &effectMode, 1);
-+
-+    entry = meta.find(CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
-+    if (entry.count != 0) {
-+        settings->update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, entry.data.u8, entry.count);
-+    } else {
-+        LOGW("No available scene modes");
-+    }
-+
-+    icamera::camera_video_stabilization_list_t availDvsModes;
-+    parameter.getSupportedVideoStabilizationMode(availDvsModes);
-+    if (availDvsModes.size() > 0) {
-+        int size = availDvsModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(availDvsModes[i], dvsModesTable, ARRAY_SIZE(dvsModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, data, count);
-+        }
-+    } else {
-+        LOGW("No video stablization modes provided!");
-+    }
-+
-+    std::vector <icamera::camera_awb_mode_t> availAwbModes;
-+    parameter.getSupportedAwbMode(availAwbModes);
-+    if (availAwbModes.size() > 0) {
-+        int size = availAwbModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(availAwbModes[i], awbModesTable, ARRAY_SIZE(awbModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, data, count);
-+        }
-+    } else {
-+        LOGW("No awb modes provided!");
-+    }
-+
-+    uint8_t awbLockAvailable = parameter.getAwbLockAvailable() ? \
-+            ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE : ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
-+    settings->update(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, &awbLockAvailable, 1);
-+
-+    int32_t rawSensitivity = 100;
-+    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &rawSensitivity, 1);
-+
-+    int32_t rawSensitivityRange[2] = {100, 100};
-+    settings->update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE, rawSensitivityRange, 2);
-+
-+    int maxRegions[3] = {1, 0, 1};
-+    settings->update(ANDROID_CONTROL_MAX_REGIONS, maxRegions, 3);
-+}
-+
-+void MetadataConvert::fillScalerStaticMetadata(const icamera::Parameters &parameter,
-+                                               android::CameraMetadata *settings)
-+{
-+// stream configuration: fmt, w, h, type
-+#define STREAM_CFG_SIZE 4
-+// duration: fmt, w, h, ns
-+#define DURATION_SIZE 4
-+
-+    float maxDigitalZoom = 1.0;
-+    settings->update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, &maxDigitalZoom, 1);
-+
-+    uint8_t type = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
-+    settings->update(ANDROID_SCALER_CROPPING_TYPE, &type, 1);
-+
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count > 0) {
-+        settings->update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP,
-+                         entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_REPROCESS_MAX_CAPTURE_STALL;
-+    entry = meta.find(tag);
-+    if (entry.count > 0) {
-+        settings->update(ANDROID_REPROCESS_MAX_CAPTURE_STALL, entry.data.i32, entry.count);
-+    }
-+
-+    icamera::supported_stream_config_array_t configs;
-+    parameter.getSupportedStreamConfig(configs);
-+    if (configs.size() == 0) {
-+        LOGW("No stream configs provided!");
-+        return;
-+    }
-+
-+    int rawConfigs = 0;
-+    for (auto & cfg : configs) {
-+        if (cfg.format == V4L2_PIX_FMT_SGRBG10) {
-+            rawConfigs++;
-+        }
-+    }
-+
-+    int configNum = configs.size() + rawConfigs;
-+    LOG2("%s, configs.size() %u, rawConfigs %d", __func__, configs.size(), rawConfigs);
-+    int* cfgData = new int[configNum * 3 * STREAM_CFG_SIZE];
-+    int64_t* durationData = new int64_t[configs.size() * 3 * DURATION_SIZE];
-+    int64_t* stallDurationData = new int64_t[configs.size() * 3 * DURATION_SIZE];
-+    unsigned int cfgCnt = 0;
-+    unsigned int durationCnt = 0;
-+    unsigned int stallDurationCnt = 0;
-+    int cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
-+    int fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
-+
-+    for (auto & cfg : configs) {
-+        /*
-+         * Filter out the items which width is less than height.
-+         * These items are for rotation case, user doesn't need to know these.
-+         */
-+        if (cfg.width < cfg.height) {
-+            LOG1("@%s skip cfg %dx%d which is for rotation", __func__, cfg.width, cfg.height);
-+            continue;
-+        }
-+
-+        if (cfg.streamType == icamera::CAMERA_STREAM_OUTPUT) {
-+            cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
-+
-+            // For implementation_defined
-+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+            cfgCnt++;
-+            durationData[durationCnt * DURATION_SIZE] = fmt;
-+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
-+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
-+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
-+            durationCnt++;
-+
-+            // For ycbcr_420_888
-+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+            cfgCnt++;
-+            durationData[durationCnt * DURATION_SIZE] = fmt;
-+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
-+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
-+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
-+            durationCnt++;
-+
-+            // For blob
-+            fmt = ANDROID_SCALER_AVAILABLE_FORMATS_BLOB;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+            cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+            cfgCnt++;
-+            durationData[durationCnt * DURATION_SIZE] = fmt;
-+            durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
-+            durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
-+            durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
-+            durationCnt++;
-+            stallDurationData[stallDurationCnt * DURATION_SIZE] = fmt;
-+            stallDurationData[stallDurationCnt * DURATION_SIZE + 1] = cfg.width;
-+            stallDurationData[stallDurationCnt * DURATION_SIZE + 2] = cfg.height;
-+            stallDurationData[stallDurationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxCaptureFps;
-+            stallDurationCnt++;
-+        } else if (cfg.streamType == icamera::CAMERA_STREAM_INPUT) {
-+            cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT;
-+            if (cfg.format == V4L2_PIX_FMT_NV12) {
-+                fmt = ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+                cfgCnt++;
-+            }
-+        } else if (cfg.streamType == icamera::CAMERA_STREAM_BIDIRECTIONAL) {
-+            if (cfg.format == V4L2_PIX_FMT_SGRBG10) {
-+                cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;
-+                fmt = ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+                cfgCnt++;
-+                cfgType = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE] = fmt;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 1] = cfg.width;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 2] = cfg.height;
-+                cfgData[cfgCnt * STREAM_CFG_SIZE + 3] = cfgType;
-+                cfgCnt++;
-+                durationData[durationCnt * DURATION_SIZE] = fmt;
-+                durationData[durationCnt * DURATION_SIZE + 1] = cfg.width;
-+                durationData[durationCnt * DURATION_SIZE + 2] = cfg.height;
-+                durationData[durationCnt * DURATION_SIZE + 3] = NSEC_PER_SEC/cfg.maxVideoFps;
-+                durationCnt++;
-+            }
-+        }
-+    }
-+    settings->update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
-+                     cfgData, cfgCnt * STREAM_CFG_SIZE);
-+    settings->update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
-+                     durationData, durationCnt * DURATION_SIZE);
-+    settings->update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
-+                     stallDurationData, stallDurationCnt * DURATION_SIZE);
-+
-+    delete []cfgData;
-+    delete []durationData;
-+    delete []stallDurationData;
-+}
-+
-+void MetadataConvert::fillTonemapStaticMetadata(const icamera::Parameters &parameter,
-+                                                android::CameraMetadata *settings) {
-+    int ret = icamera::OK;
-+
-+    int32_t maxPoint = 0;
-+    if (parameter.getTonemapMaxCurvePoints(maxPoint) == 0) {
-+        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, &maxPoint, 1);
-+    }
-+
-+    std::vector <icamera::camera_tonemap_mode_t> tonemapModes;
-+    parameter.getSupportedTonemapMode(tonemapModes);
-+    if (tonemapModes.size() > 0) {
-+        int size = tonemapModes.size();
-+        uint8_t data[size];
-+        int count = 0;
-+        for (int i = 0; i < size; i++) {
-+            ret = getAndroidValue(tonemapModes[i], tonemapModesTable, ARRAY_SIZE(tonemapModesTable), &data[count]);
-+            if (ret == icamera::OK) {
-+                count++;
-+            }
-+        }
-+        if (count > 0) {
-+            settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, data, count);
-+        }
-+    }
-+}
-+
-+void MetadataConvert::fillSensorStaticMetadata(const icamera::Parameters &parameter,
-+                                               android::CameraMetadata *settings)
-+{
-+    icamera::camera_range_t timeRange;
-+    // Fill it if it is supported
-+    if (parameter.getSupportedSensorExposureTimeRange(timeRange) == 0) {
-+        int64_t range[2];
-+        range[0] = timeRange.min * 1000LLU; // us -> ns
-+        range[1] = timeRange.max * 1000LLU; // us -> ns
-+        settings->update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, range, 2);
-+        settings->update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, &(range[1]), 1);
-+    } else {
-+        LOGW("No SensorExposureTimeRange provided!");
-+    }
-+
-+    icamera::camera_range_t sensitivityRange;
-+    if (parameter.getSupportedSensorSensitivityRange(sensitivityRange) == 0) {
-+        int32_t range[2];
-+        range[0] = (int32_t)sensitivityRange.min;
-+        range[1] = (int32_t)sensitivityRange.max;
-+        settings->update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, range, 2);
-+    } else {
-+        LOGW("No SensorSensitivityRange provided!");
-+    }
-+
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    // Check if the count is correct
-+    if (entry.count == 4) {
-+        settings->update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_SENSOR_OPAQUE_RAW_SIZE;
-+    entry = meta.find(tag);
-+    if (entry.count > 0) {
-+        settings->update(ANDROID_SENSOR_OPAQUE_RAW_SIZE, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE;
-+    entry = meta.find(tag);
-+    if (entry.count == 2) {
-+        settings->update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_SENSOR_INFO_PHYSICAL_SIZE;
-+    entry = meta.find(tag);
-+    if (entry.count == 2) {
-+        settings->update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, entry.data.u8, entry.count);
-+    }
-+
-+    tag = CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES;
-+    entry = meta.find(tag);
-+    if (entry.count != 0) {
-+        settings->update(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, entry.data.i32, entry.count);
-+    }
-+
-+    int32_t whiteLevel = 0;
-+    settings->update(ANDROID_SENSOR_INFO_WHITE_LEVEL, &whiteLevel, 1);
-+
-+    int32_t blackLevelPattern[4] = {0, 0, 0, 0};
-+    settings->update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, blackLevelPattern, 4);
-+
-+    uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
-+    settings->update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, &timestampSource, 1);
-+
-+    camera_metadata_rational_t baseGainFactor = {0, 1};
-+    settings->update(ANDROID_SENSOR_BASE_GAIN_FACTOR, &baseGainFactor, 1);
-+
-+    int32_t maxAnalogSensitivity = 0;
-+    settings->update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, &maxAnalogSensitivity, 1);
-+
-+    int32_t orientation = 0;
-+    tag = CAMERA_SENSOR_ORIENTATION;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        orientation = entry.data.u8[0];
-+    }
-+    settings->update(ANDROID_SENSOR_ORIENTATION, &orientation, 1);
-+
-+    int32_t profileHueSatMapDimensions[3] = {0, 0, 0};
-+    settings->update(ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS, profileHueSatMapDimensions, 3);
-+}
-+
-+void MetadataConvert::fillLensStaticMetadata(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_APERTURES;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, entry.data.f, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_SHADING_MAP_SIZE;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, entry.data.u8, entry.count);
-+    }
-+
-+    tag = CAMERA_LENS_FACING;
-+    entry = meta.find(tag);
-+    uint8_t lensFacing = ANDROID_LENS_FACING_BACK;
-+    if (entry.count == 1) {
-+        lensFacing = entry.data.u8[0];
-+    }
-+    settings->update(ANDROID_LENS_FACING, &lensFacing, 1);
-+
-+    uint8_t availableOpticalStabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
-+    settings->update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &availableOpticalStabilization, 1);
-+}
-+
-+void MetadataConvert::fillRequestStaticMetadata(const icamera::Parameters &parameter,
-+                                                android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_REQUEST_PIPELINE_MAX_DEPTH;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, entry.data.u8, entry.count);
-+    }
-+
-+    tag = CAMERA_REQUEST_AVAILABLE_CAPABILITIES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, entry.data.u8, entry.count);
-+    }
-+
-+    tag = CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, entry.data.i32, entry.count);
-+    }
-+
-+    int32_t partialResultCount = 1;
-+    settings->update(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, &partialResultCount, 1);
-+
-+    int32_t requestKeysBasic[] = {
-+        ANDROID_CONTROL_AE_LOCK,
-+        ANDROID_CONTROL_AWB_LOCK,
-+        ANDROID_BLACK_LEVEL_LOCK,
-+        ANDROID_LENS_APERTURE,
-+        ANDROID_LENS_FOCAL_LENGTH,
-+        ANDROID_LENS_FOCUS_DISTANCE,
-+        ANDROID_LENS_FILTER_DENSITY,
-+        ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
-+        ANDROID_SENSOR_FRAME_DURATION,
-+        ANDROID_CONTROL_CAPTURE_INTENT,
-+        ANDROID_REQUEST_ID,
-+        ANDROID_REQUEST_TYPE,
-+        ANDROID_TONEMAP_MODE,
-+        ANDROID_TONEMAP_PRESET_CURVE,
-+        ANDROID_TONEMAP_GAMMA
-+    };
-+    size_t requestKeysCnt =
-+            sizeof(requestKeysBasic)/sizeof(requestKeysBasic[0]);
-+    settings->update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, requestKeysBasic, requestKeysCnt);
-+
-+    int32_t resultKeysBasic[] = {
-+        ANDROID_REQUEST_ID,
-+        ANDROID_REQUEST_TYPE,
-+        ANDROID_BLACK_LEVEL_LOCK,
-+        ANDROID_LENS_APERTURE,
-+        ANDROID_LENS_FOCAL_LENGTH,
-+        ANDROID_LENS_FOCUS_DISTANCE,
-+        ANDROID_LENS_FILTER_DENSITY,
-+        ANDROID_LENS_FOCUS_RANGE,
-+        ANDROID_LENS_STATE,
-+        ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
-+        ANDROID_TONEMAP_CURVE_RED,
-+        ANDROID_TONEMAP_CURVE_BLUE,
-+        ANDROID_TONEMAP_CURVE_GREEN
-+    };
-+    size_t resultKeysCnt =
-+            sizeof(resultKeysBasic)/sizeof(resultKeysBasic[0]);
-+    settings->update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
-+            resultKeysBasic, resultKeysCnt);
-+
-+    int32_t characteristicsKeysBasic[] = {
-+        ANDROID_SENSOR_ORIENTATION,
-+        ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
-+        ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
-+        ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
-+        ANDROID_REQUEST_PIPELINE_MAX_DEPTH, ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
-+        ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
-+        ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
-+        ANDROID_CONTROL_AE_LOCK_AVAILABLE,
-+        ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
-+        ANDROID_SENSOR_FRAME_DURATION,
-+        ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
-+        ANDROID_TONEMAP_MAX_CURVE_POINTS,
-+        ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES
-+     };
-+    settings->update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
-+                      characteristicsKeysBasic,
-+                      sizeof(characteristicsKeysBasic)/sizeof(int32_t));
-+}
-+
-+void MetadataConvert::fillStatisticsStaticMetadata(const icamera::Parameters &parameter,
-+                                                   android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    icamera_metadata_entry entry;
-+    entry = meta.find(CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
-+    if (entry.count != 0) {
-+        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, entry.data.u8, entry.count);
-+    } else {
-+        uint8_t availFaceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
-+        settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, &availFaceDetectMode, 1);
-+    }
-+
-+    entry = meta.find(CAMERA_STATISTICS_INFO_MAX_FACE_COUNT);
-+    if (entry.count != 0) {
-+        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, entry.data.i32, entry.count);
-+    } else {
-+        int32_t maxFaceCount = 0;
-+        settings->update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, &maxFaceCount, 1);
-+    }
-+
-+    int32_t histogramBucketCount = 0;
-+    settings->update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, &histogramBucketCount, 1);
-+
-+    int32_t maxHistogramCount = 0;
-+    settings->update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, &maxHistogramCount, 1);
-+
-+    int32_t maxSharpnessMapValue = 0;
-+    settings->update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, &maxSharpnessMapValue, 1);
-+
-+    int32_t sharpnessMapSize[2] = {0, 0};
-+    settings->update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, sharpnessMapSize, 2);
-+
-+    uint8_t availableHotPixelMapModes = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, &availableHotPixelMapModes, 1);
-+
-+    uint8_t availableLensShadingMapModes = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;
-+    settings->update(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, &availableLensShadingMapModes, 1);
-+}
-+
-+void MetadataConvert::fillJpegStaticMetadata(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    uint32_t tag = CAMERA_JPEG_MAX_SIZE;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_JPEG_MAX_SIZE, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 2) {
-+        settings->update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, entry.data.i32, entry.count);
-+    }
-+}
-+
-+void MetadataConvert::fillAdvancedFeatureStaticMetadata(const icamera::Parameters &parameter,
-+                                                        android::CameraMetadata *settings)
-+{
-+    icamera::CameraMetadata meta;
-+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
-+
-+    // ANDROID_DEMOSAIC
-+
-+    // ANDROID_EDGE
-+    uint32_t tag = CAMERA_EDGE_AVAILABLE_EDGE_MODES;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_EDGE_AVAILABLE_EDGE_MODES, entry.data.u8, entry.count);
-+    }
-+
-+    // ANDROID_HOT_PIXEL
-+    tag = CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, entry.data.u8, entry.count);
-+    }
-+
-+    // ANDROID_NOISE_REDUCTION
-+    tag = CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, entry.data.u8, entry.count);
-+    }
-+
-+    // ANDROID_SHADING
-+
-+    // ANDROID_TONEMAP
-+    tag = CAMERA_TONEMAP_MAX_CURVE_POINTS;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_TONEMAP_MAX_CURVE_POINTS, entry.data.i32, entry.count);
-+    }
-+
-+    tag = CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES;
-+    entry = meta.find(tag);
-+    if (entry.count >= 1) {
-+        settings->update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, entry.data.u8, entry.count);
-+    }
-+
-+    // ANDROID_INFO
-+    tag = CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, entry.data.u8, entry.count);
-+    }
-+
-+    // ANDROID_BLACK_LEVEL
-+
-+    // ANDROID_SYNC
-+    tag = CAMERA_SYNC_MAX_LATENCY;
-+    entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        settings->update(ANDROID_SYNC_MAX_LATENCY, entry.data.i32, entry.count);
-+    }
-+}
-+
-+int MetadataConvert::convertToHalWindow(const int32_t* data, int dataCount,
-+                                        icamera::camera_window_list_t* windows)
-+{
-+    windows->clear();
-+    CheckError((!data), icamera::BAD_VALUE, "null data to convert hal window!");
-+    CheckError((dataCount % 5 != 0), icamera::BAD_VALUE, "wrong data count %d!", dataCount);
-+
-+    icamera::camera_window_t window;
-+    for (int i = 0; i < dataCount / 5; i+=5) {
-+        window.left   = data[i];
-+        window.top    = data[i + 1];
-+        window.right  = data[i + 2];
-+        window.bottom = data[i + 3];
-+        window.weight = data[i + 4];
-+        windows->push_back(window);
-+    }
-+    return icamera::OK;
-+}
-+
-+int MetadataConvert::convertToMetadataRegion(const icamera::camera_window_list_t& windows,
-+                                                 int dataCount, int32_t* data)
-+{
-+    size_t num = windows.size();
-+    CheckError((!data), 0, "null data to convert Metadata region!");
-+    CheckError(((unsigned int)dataCount < num * 5), 0, "small dataCount!");
-+
-+    for (size_t i = 0; i < windows.size(); i++) {
-+        data[i * 5]     = windows[i].left;
-+        data[i * 5 + 1] = windows[i].top;
-+        data[i * 5 + 2] = windows[i].right;
-+        data[i * 5 + 3] = windows[i].bottom;
-+        data[i * 5 + 4] = windows[i].weight;
-+    }
-+
-+    return num * 5;
-+}
-+
-+void MetadataConvert::dumpMetadata(const camera_metadata_t *meta)
-+{
-+    if (!meta || !icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_LEVEL2)) {
-+        return;
-+    }
-+
-+    LOG2("%s", __func__);
-+    int entryCount = get_camera_metadata_entry_count(meta);
-+
-+    for (int i = 0; i < entryCount; i++) {
-+        camera_metadata_entry_t entry;
-+        if (get_camera_metadata_entry((camera_metadata_t *)meta, i, &entry)) {
-+            continue;
-+        }
-+
-+        // Print tag & type
-+        const char *tagName, *tagSection;
-+        tagSection = get_camera_metadata_section_name(entry.tag);
-+        if (tagSection == nullptr) {
-+            tagSection = "unknownSection";
-+        }
-+        tagName = get_camera_metadata_tag_name(entry.tag);
-+        if (tagName == nullptr) {
-+            tagName = "unknownTag";
-+        }
-+        const char *typeName;
-+        if (entry.type >= NUM_TYPES) {
-+            typeName = "unknown";
-+        } else {
-+            typeName = camera_metadata_type_names[entry.type];
-+        }
-+        LOG2("(%d)%s.%s (%05x): %s[%zu], type: %d",
-+             i,
-+             tagSection,
-+             tagName,
-+             entry.tag,
-+             typeName,
-+             entry.count,
-+             entry.type);
-+
-+        // Print data
-+        size_t j;
-+        const uint8_t *u8;
-+        const int32_t *i32;
-+        const float   *f;
-+        const int64_t *i64;
-+        const double  *d;
-+        const camera_metadata_rational_t *r;
-+        std::ostringstream stringStream;
-+        stringStream << "[";
-+
-+        switch (entry.type) {
-+        case TYPE_BYTE:
-+            u8 = entry.data.u8;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << (int32_t)u8[j] << " ";
-+            break;
-+        case TYPE_INT32:
-+            i32 = entry.data.i32;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << " " << i32[j] << " ";
-+            break;
-+        case TYPE_FLOAT:
-+            f = entry.data.f;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << " " << f[j] << " ";
-+            break;
-+        case TYPE_INT64:
-+            i64 = entry.data.i64;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << " " << i64[j] << " ";
-+            break;
-+        case TYPE_DOUBLE:
-+            d = entry.data.d;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << " " << d[j] << " ";
-+            break;
-+        case TYPE_RATIONAL:
-+            r = entry.data.r;
-+            for (j = 0; j < entry.count; j++)
-+                stringStream << " (" << r[j].numerator << ", " << r[j].denominator << ") ";
-+            break;
-+        }
-+        stringStream << "]";
-+        std::string str = stringStream.str();
-+        LOG2("%s", str.c_str());
-+    }
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/MetadataConvert.h b/camera/hal/intel/ipu6/aal/MetadataConvert.h
-new file mode 100644
-index 000000000000..d6d652c6f92a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <hardware/camera3.h>
-+#include "HALv3Header.h"
-+
-+#include "Parameters.h"
-+#include "FaceDetection.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \class MetadataConvert
-+ *
-+ * This class is used to convert application metadata to HAL metadata.
-+ *
-+ */
-+class MetadataConvert {
-+
-+public:
-+    MetadataConvert(int cameraId);
-+    virtual ~MetadataConvert();
-+
-+    static int constructDefaultMetadata(android::CameraMetadata *settings);
-+    static int updateDefaultRequestSettings(int type, android::CameraMetadata *settings);
-+
-+    static int requestMetadataToHALMetadata(const android::CameraMetadata &settings,
-+                                            icamera::Parameters *parameter);
-+    static int HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
-+                                            android::CameraMetadata *settings);
-+    static int HALCapabilityToStaticMetadata(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings);
-+    static void dumpMetadata(const camera_metadata_t *meta);
-+    static void convertFaceDetectionMetadata(
-+                                    const icamera::CVFaceDetectionAbstractResult &fdResult,
-+                                    android::CameraMetadata *settings);
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(MetadataConvert);
-+
-+    // Parameters -> Android dynamic metadata
-+    static int convertColorCorrectionParameter(const icamera::Parameters &parameter,
-+                                               android::CameraMetadata *settings);
-+    static int convertControlParameter(const icamera::Parameters &parameter,
-+                                       android::CameraMetadata *settings);
-+    static int convertSensorParameter(const icamera::Parameters &parameter,
-+                                      android::CameraMetadata *settings);
-+    static int convertLensParameter(const icamera::Parameters &parameter,
-+                                      android::CameraMetadata *settings);
-+    static int convertStatisticsParameter(const icamera::Parameters & /*parameter*/,
-+                                          android::CameraMetadata *settings);
-+    static int convertTonemapParameter(const icamera::Parameters &parameter,
-+                                       android::CameraMetadata *settings);
-+    static int convertFlashParameter(const icamera::Parameters & /*parameter*/,
-+                                     android::CameraMetadata *settings);
-+    static int convertAdvancedFeatureMetadata(const android::CameraMetadata &settings,
-+                                              icamera::Parameters *parameter);
-+    static int convertAdvancedFeatureParameter(const icamera::Parameters &parameter,
-+                                               android::CameraMetadata *settings);
-+
-+    // Android control metadata -> parameters
-+    static int convertColorCorrectionMetadata(const android::CameraMetadata &settings,
-+                                              icamera::Parameters *parameter);
-+    static int convertControlMetadata(const android::CameraMetadata &settings,
-+                                      icamera::Parameters *parameter);
-+    static int convertTonemapMetadata(const android::CameraMetadata &settings,
-+                                      icamera::Parameters *parameter);
-+    static int convertJpegMetadata(const android::CameraMetadata &settings,
-+                                   icamera::Parameters *parameter);
-+    static int convertSensorMetadata(const android::CameraMetadata &settings,
-+                                     icamera::Parameters *parameter);
-+    static int convertLensMetadata(const android::CameraMetadata &settings,
-+                                   icamera::Parameters *parameter);
-+
-+    // Capabilities -> Android static metadata
-+    static void fillControlStaticMetadata(const icamera::Parameters &parameter,
-+                                          android::CameraMetadata *settings);
-+    static void fillScalerStaticMetadata(const icamera::Parameters &parameter,
-+                                         android::CameraMetadata *settings);
-+    static void fillSensorStaticMetadata(const icamera::Parameters &parameter,
-+                                         android::CameraMetadata *settings);
-+    static void fillLensStaticMetadata(const icamera::Parameters &parameter,
-+                                       android::CameraMetadata *settings);
-+    static void fillRequestStaticMetadata(const icamera::Parameters &parameter,
-+                                          android::CameraMetadata *settings);
-+    static void fillStatisticsStaticMetadata(const icamera::Parameters &parameter,
-+                                             android::CameraMetadata *settings);
-+    static void fillTonemapStaticMetadata(const icamera::Parameters &parameter,
-+                                          android::CameraMetadata *settings);
-+    static void fillJpegStaticMetadata(const icamera::Parameters &parameter,
-+                                       android::CameraMetadata *settings);
-+    static void fillAdvancedFeatureStaticMetadata(const icamera::Parameters &parameter,
-+                                                  android::CameraMetadata *settings);
-+
-+    static int convertToHalWindow(const int32_t* data, int dataCount,
-+                                  icamera::camera_window_list_t* windows);
-+    static int convertToMetadataRegion(const icamera::camera_window_list_t& windows,
-+                                       int dataCount, int32_t* data);
-+
-+private:
-+    int mCameraId;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.cpp b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
-new file mode 100644
-index 000000000000..7a33a7ac0434
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/PostProcessor.cpp
-@@ -0,0 +1,196 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PostProcessor"
-+
-+#include "HALv3Utils.h"
-+#include "PostProcessor.h"
-+
-+namespace camera3 {
-+
-+PostProcessor::PostProcessor(int cameraId, const camera3_stream_t &stream) :
-+    mCameraId(cameraId),
-+    mPostProcessType(icamera::POST_PROCESS_NONE),
-+    mPostProcessorCore(std::unique_ptr<icamera::PostProcessorCore>(new icamera::PostProcessorCore(cameraId)))
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+PostProcessor::~PostProcessor()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+icamera::status_t
-+PostProcessor::configure(const camera3_stream_t &stream, const camera3_stream_t &srcStream)
-+{
-+    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
-+    LOG1("@%s, srcStream: w:%d, h:%d, f:%d", __func__, srcStream.width, srcStream.height, srcStream.format);
-+
-+    icamera::stream_t halStream;
-+    int ret = camera3::HalV3Utils::fillHALStreams(mCameraId, srcStream, &halStream);
-+    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d, ret:%d", __func__,
-+         halStream.width, halStream.height, halStream.format, halStream.size, halStream.stride, ret);
-+    CheckError(ret != icamera::OK, ret, "fillHALStreams fails, ret %d", ret);
-+
-+    return configure(stream, halStream);
-+}
-+
-+/* configure
-+ *
-+ * Decide post-processing is needed based on user stream and hal stream.
-+ * The default processing order is rotate -> crop -> scale -> convert -> encode.
-+ */
-+icamera::status_t
-+PostProcessor::configure(const camera3_stream_t &stream, const icamera::stream_t &halStream)
-+{
-+    LOG1("@%s, stream: w:%d, h:%d, f:%d", __func__, stream.width, stream.height, stream.format);
-+    LOG1("@%s, halStream: w:%d, h:%d, f:%d, size:%d, stride:%d", __func__,
-+         halStream.width, halStream.height, halStream.format, halStream.size, halStream.stride);
-+
-+    icamera::PostProcessInfo info;
-+    mPostProcessType = icamera::POST_PROCESS_NONE;
-+    std::vector<icamera::PostProcessInfo> processingOrder;
-+    int angle = HalV3Utils::getRotationDegrees(stream);
-+
-+    /* Fill the input/output information for the post processing unit.
-+     * The input info of the current processing unit is the output info of last unit
-+     */
-+    icamera::stream_t inputStreamInfo = halStream;
-+    if (angle > 0 && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_ROTATE)) {
-+        mPostProcessType |= icamera::POST_PROCESS_ROTATE;
-+        info.angle = angle;
-+        info.type = icamera::POST_PROCESS_ROTATE;
-+        info.inputInfo = inputStreamInfo;
-+        info.outputInfo = inputStreamInfo;
-+        info.outputInfo.width = inputStreamInfo.height;
-+        info.outputInfo.height = inputStreamInfo.width;
-+        info.outputInfo.stride = inputStreamInfo.height;
-+        info.outputInfo.format = inputStreamInfo.format;
-+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
-+                                                                  info.outputInfo.width,
-+                                                                  info.outputInfo.height);
-+        LOG2("%s, Rotate: input %dx%d, output: %dx%d, angle: %d", __func__, inputStreamInfo.width,
-+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height, angle);
-+
-+        inputStreamInfo = info.outputInfo;
-+        processingOrder.push_back(info);
-+    }
-+
-+    // Crop
-+    if (inputStreamInfo.width * stream.height != inputStreamInfo.height * stream.width
-+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CROP)) {
-+        mPostProcessType |= icamera::POST_PROCESS_CROP;
-+        info.type = icamera::POST_PROCESS_CROP;
-+        info.inputInfo = inputStreamInfo;
-+
-+        // Caclulate the best crop size with same aspect ratio
-+        if (inputStreamInfo.width * stream.height < inputStreamInfo.height * stream.width) {
-+            info.outputInfo.width = info.inputInfo.width;
-+            info.outputInfo.height = ALIGN(info.inputInfo.width * stream.height / stream.width, 2);
-+        } else {
-+            info.outputInfo.width = ALIGN(info.inputInfo.height * stream.width / stream.height, 2);
-+            info.outputInfo.height = info.inputInfo.height;
-+        }
-+        info.outputInfo.format = inputStreamInfo.format;
-+        info.outputInfo.stride = info.outputInfo.width;
-+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
-+                                                                  info.outputInfo.width,
-+                                                                  info.outputInfo.height);
-+        LOG2("%s, Crop: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
-+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
-+
-+        inputStreamInfo = info.outputInfo;
-+        processingOrder.push_back(info);
-+    }
-+
-+    // Scale
-+    if ((uint32_t)inputStreamInfo.width * inputStreamInfo.height != stream.width * stream.height
-+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_SCALING)) {
-+        mPostProcessType |= icamera::POST_PROCESS_SCALING;
-+        info.type = icamera::POST_PROCESS_SCALING;
-+        info.inputInfo = inputStreamInfo;
-+        info.outputInfo.width = stream.width;
-+        info.outputInfo.height = stream.height;
-+        info.outputInfo.stride = stream.width;
-+        info.outputInfo.format = inputStreamInfo.format;
-+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
-+                                                                  info.outputInfo.width,
-+                                                                  info.outputInfo.height);
-+        LOG2("%s, Scale: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
-+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
-+
-+        inputStreamInfo = info.outputInfo;
-+        processingOrder.push_back(info);
-+    }
-+
-+    // Convert
-+    if (inputStreamInfo.format != HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format)
-+        && mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_CONVERT)) {
-+        mPostProcessType |= icamera::POST_PROCESS_CONVERT;
-+        info.type = icamera::POST_PROCESS_CONVERT;
-+        info.inputInfo = inputStreamInfo;
-+        info.outputInfo.width = stream.width;
-+        info.outputInfo.height = stream.height;
-+        info.outputInfo.stride = stream.width;
-+        info.outputInfo.format = HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format);
-+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
-+                                                                  info.outputInfo.width,
-+                                                                  info.outputInfo.height);
-+        LOG2("%s, Convert: input %dx%d, output: %dx%d", __func__, inputStreamInfo.width,
-+             inputStreamInfo.height, info.outputInfo.width, info.outputInfo.height);
-+
-+        inputStreamInfo = info.outputInfo;
-+        processingOrder.push_back(info);
-+    }
-+
-+    // Encode
-+    if (stream.format == HAL_PIXEL_FORMAT_BLOB &&
-+        mPostProcessorCore->isPostProcessTypeSupported(icamera::POST_PROCESS_JPEG_ENCODING)) {
-+        mPostProcessType |= icamera::POST_PROCESS_JPEG_ENCODING;
-+        info.type = icamera::POST_PROCESS_JPEG_ENCODING;
-+        info.inputInfo = inputStreamInfo;
-+        info.outputInfo.width = stream.width;
-+        info.outputInfo.height = stream.height;
-+        info.outputInfo.stride = stream.width;
-+        info.outputInfo.format = HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format);
-+        info.outputInfo.size = icamera::CameraUtils::getFrameSize(info.outputInfo.format,
-+                                                                  info.outputInfo.width,
-+                                                                  info.outputInfo.height);
-+        inputStreamInfo = info.outputInfo;
-+        processingOrder.push_back(info);
-+    }
-+
-+    if ((uint32_t)inputStreamInfo.width != stream.width ||
-+        (uint32_t)inputStreamInfo.height != stream.height ||
-+        inputStreamInfo.format != HalV3Utils::HALFormatToV4l2Format(mCameraId, stream.format)) {
-+        LOGE("%s, output stream doesn't match with the requirement after post-processing", __func__);
-+        return icamera::UNKNOWN_ERROR;
-+    }
-+    LOG1("@%s, camera id %d, mPostProcessType %d, processing unit number: %zu",
-+         __func__, mCameraId, mPostProcessType, processingOrder.size());
-+    mPostProcessorCore->configure(processingOrder);
-+
-+    return icamera::OK;
-+}
-+
-+icamera::status_t PostProcessor::doPostProcessing(const std::shared_ptr<Camera3Buffer> &inBuf,
-+                                                  const icamera::Parameters &parameter,
-+                                                  std::shared_ptr<Camera3Buffer> &outBuf)
-+{
-+    return mPostProcessorCore->doPostProcessing(inBuf, parameter, outBuf);
-+}
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/PostProcessor.h b/camera/hal/intel/ipu6/aal/PostProcessor.h
-new file mode 100644
-index 000000000000..a79f59c42d4f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/PostProcessor.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <hardware/camera3.h>
-+#include <memory>
-+#include "ICamera.h"
-+#include "Utils.h"
-+#include "Errors.h"
-+#include "PostProcessorCore.h"
-+#include "Camera3Buffer.h"
-+
-+namespace camera3 {
-+/**
-+ * \class PostProcessor
-+ *
-+ * A wrapper based on PostProcessorCore for handling post-processing sequence, there are two main purposes of this class.
-+ * 1. Provide the wrapper to implement post-processing feature.
-+ * 2. Parsing the processing type and formulate the processing sequence
-+ */
-+class PostProcessor {
-+
-+public:
-+    PostProcessor(int cameraId, const camera3_stream_t &stream);
-+    virtual ~PostProcessor();
-+
-+    // the srcStream will convert to type icamera::stream_t and call the other configure() function
-+    icamera::status_t configure(const camera3_stream_t &stream, const camera3_stream_t &srcStream);
-+    icamera::status_t configure(const camera3_stream_t &stream, const icamera::stream_t &halStream);
-+    int getPostProcessType() { return mPostProcessType; }
-+    icamera::status_t doPostProcessing(const std::shared_ptr<Camera3Buffer> &inBuf,
-+                                       const icamera::Parameters &parameter,
-+                                       std::shared_ptr<Camera3Buffer> &outBuf);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PostProcessor);
-+
-+private:
-+    int mCameraId;
-+    int mPostProcessType;
-+    std::unique_ptr<icamera::PostProcessorCore> mPostProcessorCore;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/RequestManager.cpp b/camera/hal/intel/ipu6/aal/RequestManager.cpp
-new file mode 100644
-index 000000000000..23d4c593bbea
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/RequestManager.cpp
-@@ -0,0 +1,561 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "RequestManager"
-+
-+#include <math.h>
-+#include <cstdlib>
-+#include <hardware/gralloc.h>
-+
-+#include <linux/videodev2.h>
-+
-+#include "ICamera.h"
-+#include "Parameters.h"
-+#include "Utils.h"
-+#include "Errors.h"
-+
-+#include "HALv3Utils.h"
-+#include "MetadataConvert.h"
-+#include "RequestManager.h"
-+#include "PlatformData.h"
-+
-+namespace camera3 {
-+RequestManager::RequestManager(int cameraId) :
-+    mCameraId(cameraId),
-+    mCallbackOps(nullptr),
-+    mCameraDeviceStarted(false),
-+    mResultProcessor(nullptr),
-+    mRequestInProgress(0)
-+{
-+    LOG1("@%s", __func__);
-+
-+    CLEAR(mCameraBufferInfo);
-+}
-+
-+RequestManager::~RequestManager()
-+{
-+    LOG1("@%s", __func__);
-+
-+    deleteStreams(false);
-+
-+    delete mResultProcessor;
-+}
-+
-+int RequestManager::init(const camera3_callback_ops_t *callback_ops)
-+{
-+    LOG1("@%s", __func__);
-+
-+    // Update the default settings from camera HAL
-+    icamera::Parameters parameter;
-+    int ret = icamera::camera_get_parameters(mCameraId, parameter);
-+    CheckError(ret != icamera::OK, ret, "failed to get parameters, ret %d", ret);
-+
-+    android::CameraMetadata defaultRequestSettings;
-+    // Get static metadata
-+    MetadataConvert::HALCapabilityToStaticMetadata(parameter, &defaultRequestSettings);
-+
-+    // Get defalut settings
-+    MetadataConvert::constructDefaultMetadata(&defaultRequestSettings);
-+    MetadataConvert::HALMetadataToRequestMetadata(parameter, &defaultRequestSettings);
-+
-+    mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW] = defaultRequestSettings;
-+    MetadataConvert::updateDefaultRequestSettings(CAMERA3_TEMPLATE_PREVIEW,
-+            &mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW]);
-+
-+    mResultProcessor = new ResultProcessor(mCameraId, callback_ops, this);
-+    mCallbackOps = callback_ops;
-+
-+    // Register callback to icamera HAL
-+    icamera::camera_callback_ops_t::notify = RequestManager::callbackNotify;
-+    icamera::camera_callback_register(mCameraId,
-+                                      static_cast<icamera::camera_callback_ops_t*>(this));
-+
-+    return icamera::OK;
-+}
-+
-+int RequestManager::deinit()
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (mCameraDeviceStarted) {
-+        int ret = icamera::camera_device_stop(mCameraId);
-+        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
-+        mCameraDeviceStarted = false;
-+    }
-+
-+    mRequestInProgress = 0;
-+    return icamera::OK;
-+}
-+
-+void RequestManager::callbackNotify(const icamera::camera_callback_ops *cb,
-+                                    const icamera::camera_msg_data_t &data) {
-+    LOG2("@%s, type %d", __func__, data.type);
-+    RequestManager *callback = const_cast<RequestManager*>(static_cast<const RequestManager*>(cb));
-+
-+    callback->mResultProcessor->callbackNotify(data);
-+    callback->handleCallbackEvent(data);
-+}
-+
-+void RequestManager::handleCallbackEvent(const icamera::camera_msg_data_t &data) {
-+    LOG2("@%s, cameraId: %d", __func__, mCameraId);
-+
-+    if (!icamera::PlatformData::swProcessingAlignWithIsp(mCameraId))
-+        return;
-+
-+    for (auto &stream : mCamera3StreamVector) {
-+        if (stream->getPostProcessType() != icamera::POST_PROCESS_NONE) {
-+            stream->sendEvent(data);
-+        }
-+    }
-+}
-+
-+int RequestManager::configureStreams(camera3_stream_configuration_t *stream_list)
-+{
-+    LOG1("@%s", __func__);
-+
-+    int ret = checkStreamRotation(stream_list);
-+
-+    CheckError(ret != icamera::OK, icamera::BAD_VALUE, "Unsupport rotation degree!");
-+
-+    if (mCameraDeviceStarted) {
-+        ret = icamera::camera_device_stop(mCameraId);
-+        CheckError(ret != icamera::OK, ret, "failed to stop camera device, ret %d", ret);
-+        mCameraDeviceStarted = false;
-+    }
-+
-+    uint32_t streamsNum = stream_list->num_streams;
-+    uint32_t operationMode = stream_list->operation_mode;
-+    LOG1("@%s, streamsNum:%d, operationMode:%d", __func__, streamsNum, operationMode);
-+    CheckError((operationMode != CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE &&
-+          operationMode != CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE),
-+          icamera::BAD_VALUE, "Unknown operation mode %d!", operationMode);
-+
-+    int inputStreamNum = 0;
-+    int outStreamNum = 0;
-+    camera3_stream_t *stream = nullptr;
-+    for (uint32_t i = 0; i < streamsNum; i++) {
-+        stream = stream_list->streams[i];
-+        LOG1("@%s, Config stream (%s):%dx%d, fmt:%d, usage:%d, max buffers:%d, priv:%p", __func__,
-+             HalV3Utils::getCamera3StreamType(stream->stream_type),
-+             stream->width, stream->height, stream->format,
-+             stream->usage, stream->max_buffers, stream->priv);
-+        if (stream->stream_type == CAMERA3_STREAM_OUTPUT) {
-+            outStreamNum++;
-+        } else if (stream->stream_type == CAMERA3_STREAM_INPUT) {
-+            inputStreamNum++;
-+        } else if (stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
-+            inputStreamNum++;
-+            outStreamNum++;
-+        } else {
-+            LOGE("@%s, Unknown stream type %d!", __func__, stream->stream_type);
-+            return icamera::BAD_VALUE;
-+        }
-+        CheckError(inputStreamNum > 1, icamera::BAD_VALUE, "Too many input streams : %d !", inputStreamNum);
-+    }
-+    CheckError(outStreamNum == 0, icamera::BAD_VALUE, "No output streams!");
-+
-+    /*
-+     * Configure stream
-+     */
-+    int hwStreamNum = 0;
-+    camera3_stream_t *inputStream = nullptr;
-+    // Enable video pipe if yuv stream exists (for 3A stats data)
-+    bool needAssignPreviewStream = true;
-+    icamera::stream_t* yuvStream = nullptr;
-+    for (uint32_t i = 0; i < streamsNum; i++) {
-+        if (stream_list->streams[i]->stream_type == CAMERA3_STREAM_INPUT) {
-+            if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
-+                inputStream = stream_list->streams[i];
-+                LOG1("@%s, input stream: w:%d, h:%d, f:%d", __func__,
-+                     inputStream->width, inputStream->height, inputStream->format);
-+            }
-+            stream_list->streams[i]->max_buffers = 1;
-+            continue;
-+        }
-+
-+        ret = HalV3Utils::fillHALStreams(mCameraId, *stream_list->streams[i], &mHALStream[hwStreamNum]);
-+        CheckError(ret != icamera::OK, ret, "failed to fill mHALStream[%d], ret:%d", ret, i);
-+
-+        if (!yuvStream && (stream_list->streams[i]->format != HAL_PIXEL_FORMAT_BLOB &&
-+            mHALStream[hwStreamNum].usage != icamera::CAMERA_STREAM_OPAQUE_RAW)) {
-+            yuvStream = &mHALStream[hwStreamNum];
-+        }
-+        if (mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_PREVIEW
-+            || mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_VIDEO_CAPTURE)
-+            needAssignPreviewStream = false;
-+
-+        hwStreamNum++;
-+    }
-+    if (needAssignPreviewStream && yuvStream) {
-+        yuvStream->usage = icamera::CAMERA_STREAM_PREVIEW;
-+    }
-+
-+    icamera::stream_config_t streamCfg = {
-+        hwStreamNum,
-+        mHALStream,
-+        icamera::camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_MODE_AUTO
-+    };
-+
-+    for (int i = 0; i < hwStreamNum; i++) {
-+        const icamera::stream_t& s = mHALStream[i];
-+        LOG1("@%s, mHALStream[%d]: w:%d, h:%d, f:%d, u:%d", __func__, i, s.width, s.height,
-+             s.format, s.usage);
-+    }
-+
-+    // Mark all streams as NOT active
-+    for (auto &stream : mCamera3StreamVector) {
-+        stream->setActive(false);
-+    }
-+
-+    int enableFDStreamNum = -1;
-+    Camera3Stream *faceDetectionOwner = nullptr;
-+    //Mark one camera3Stream run face detection
-+    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
-+        LOG1("Face detection is enable");
-+        chooseStreamForFaceDetection(streamsNum, stream_list->streams, &enableFDStreamNum);
-+    }
-+
-+    ret = icamera::camera_device_config_streams(mCameraId, &streamCfg);
-+    CheckError(ret != icamera::OK, ret, "failed to configure stream, ret %d", ret);
-+
-+    // Create Stream for new streams
-+    hwStreamNum = 0;
-+    for (uint32_t i = 0; i < streamsNum; i++) {
-+        camera3_stream_t *stream = stream_list->streams[i];
-+        if (stream->stream_type == CAMERA3_STREAM_INPUT) {
-+            continue;
-+        }
-+
-+        if (stream->priv == nullptr) {
-+            Camera3Stream *s = new Camera3Stream(mCameraId,
-+                                                 mResultProcessor,
-+                                                 mHALStream[hwStreamNum].max_buffers,
-+                                                 mHALStream[hwStreamNum],
-+                                                 *stream,
-+                                                 inputStream);
-+            s->setActive(true);
-+            stream->priv = s;
-+            stream->max_buffers = mHALStream[hwStreamNum].max_buffers;
-+            stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE | GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_NEVER;
-+            if (mHALStream[hwStreamNum].usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
-+                stream->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
-+            }
-+            mCamera3StreamVector.push_back(s);
-+        } else {
-+            static_cast<Camera3Stream*> (stream->priv)->setActive(true);
-+        }
-+        hwStreamNum++;
-+        LOGI("OUTPUT max buffer %d, usage %x, format %x", stream->max_buffers, stream->usage, stream->format);
-+
-+        if (enableFDStreamNum == i) {
-+            faceDetectionOwner = static_cast<Camera3Stream*> (stream->priv);
-+        }
-+    }
-+
-+    // Remove useless Camera3Stream
-+    deleteStreams(true);
-+
-+    if (faceDetectionOwner != nullptr) {
-+        faceDetectionOwner->activateFaceDetection(MAX_FACES_DETECTABLE);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+void RequestManager::chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t **streams, int *enableFDStreamNum)
-+{
-+    LOG1("@%s", __func__);
-+    camera3_stream_t *preStream = nullptr;
-+    camera3_stream_t *yuvStream = nullptr;
-+    int maxWidth = MAX_FACE_FRAME_WIDTH;
-+    int maxHeight = MAX_FACE_FRAME_HEIGHT;
-+    int preStreamNum = -1;
-+    int yuvStreamNum = -1;
-+
-+    for (uint32_t i = 0; i < streamsNum; i++) {
-+        camera3_stream_t *s = streams[i];
-+        if (!s || s->stream_type != CAMERA3_STREAM_OUTPUT || s->width > maxWidth || s->height > maxHeight) {
-+            continue;
-+        }
-+
-+        LOG1("stream information:format=%d, width=%d, height=%d", s->format, s->width, s->height);
-+        // We assume HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream is the
-+        // preview stream and it's requested in every capture request.
-+        // If there are two HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED streams,
-+        // We pick the smaller stream due to performance concern.
-+        if (s->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
-+            if (preStream && preStream->width * preStream->height <= s->width * s->height) {
-+                continue;
-+            }
-+            preStream = s;
-+            preStreamNum = i;
-+        }
-+
-+        if (s->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
-+            if (yuvStream && yuvStream->width * yuvStream->height <= s->width * s->height) {
-+                continue;
-+            }
-+            yuvStream = s;
-+            yuvStreamNum = i;
-+        }
-+    }
-+
-+    *enableFDStreamNum = -1;
-+    if (preStreamNum >= 0) {
-+        *enableFDStreamNum = preStreamNum;
-+    } else if (yuvStreamNum >= 0) {
-+        *enableFDStreamNum = yuvStreamNum;
-+    }
-+    LOG1("enableFDStreamNum %d", *enableFDStreamNum);
-+}
-+
-+int RequestManager::constructDefaultRequestSettings(int type, const camera_metadata_t **meta)
-+{
-+    LOG1("@%s, type %d", __func__, type);
-+
-+    if (mDefaultRequestSettings.count(type) == 0) {
-+        mDefaultRequestSettings[type] = mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW];
-+        MetadataConvert::updateDefaultRequestSettings(type, &mDefaultRequestSettings[type]);
-+    }
-+    const camera_metadata_t *setting = mDefaultRequestSettings[type].getAndLock();
-+    *meta = setting;
-+    mDefaultRequestSettings[type].unlock(setting);
-+
-+    return icamera::OK;
-+}
-+
-+int RequestManager::processCaptureRequest(camera3_capture_request_t *request)
-+{
-+    CheckError(!request, icamera::UNKNOWN_ERROR, "@%s, request is nullptr", __func__);
-+    LOG1("@%s, frame_number:%d, input_buffer:%d, num_output_buffers:%d", __func__,
-+         request->frame_number, request->input_buffer ? 1 : 0, request->num_output_buffers);
-+
-+    // Valid buffer and request
-+    CheckError(request->num_output_buffers > kMaxStreamNum, icamera::BAD_VALUE,
-+          "@%s, num_output_buffers:%d", __func__, request->num_output_buffers);
-+
-+    int ret = icamera::OK;
-+
-+    waitProcessRequest();
-+
-+    int index = -1;
-+    for (int i = 0; i < kMaxProcessRequestNum; i++) {
-+        if (!mCameraBufferInfo[i].frameInProcessing) {
-+            index = i;
-+        }
-+    }
-+    CheckError(index < 0, icamera::UNKNOWN_ERROR, "no empty CameraBufferInfo!");
-+    CLEAR(mCameraBufferInfo[index]);
-+
-+    std::shared_ptr<Camera3Buffer> inputCam3Buf = nullptr;
-+    icamera::sensor_raw_info_t opaqueRawInfo = { -1, 0 };
-+    if (request->input_buffer) {
-+        inputCam3Buf = std::make_shared<Camera3Buffer>();
-+        icamera::status_t status = inputCam3Buf->init(request->input_buffer, mCameraId);
-+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to init CameraBuffer");
-+        status = inputCam3Buf->waitOnAcquireFence();
-+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to sync CameraBuffer");
-+        status = inputCam3Buf->lock();
-+        CheckError(status != icamera::OK, icamera::BAD_VALUE, "Failed to lock buffer");
-+
-+        if (request->input_buffer->stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
-+            MEMCPY_S(&opaqueRawInfo, sizeof(opaqueRawInfo), inputCam3Buf->data(),
-+                     inputCam3Buf->size());
-+            LOG2("%s, sequence id %ld, timestamp %ld", __func__, opaqueRawInfo.sequence,
-+                  opaqueRawInfo.timestamp);
-+        }
-+    }
-+
-+    icamera::Parameters param;
-+    param.setMakernoteMode(icamera::MAKERNOTE_MODE_OFF);
-+    if (request->settings) {
-+        MetadataConvert::dumpMetadata(request->settings);
-+        mLastSettings = request->settings;
-+    } else if (mLastSettings.isEmpty()) {
-+        LOGE("nullptr settings for the first reqeust!");
-+        return icamera::BAD_VALUE;
-+    }
-+
-+    icamera::camera_buffer_t *buffer[kMaxStreamNum] = {nullptr};
-+    int numBuffers = request->num_output_buffers;
-+    bool forceUpdate = false;
-+    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
-+        camera3_stream_t *aStream = request->output_buffers[i].stream; // app stream
-+        Camera3Stream    *lStream = static_cast<Camera3Stream*> (aStream->priv); // local stream
-+        if (aStream->format == HAL_PIXEL_FORMAT_BLOB ||
-+            aStream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
-+            param.setMakernoteMode(icamera::MAKERNOTE_MODE_JPEG);
-+            forceUpdate = true;
-+        }
-+        ret = lStream->processRequest(opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
-+                                      request->output_buffers[i],
-+                                      &mCameraBufferInfo[index].halBuffer[i]);
-+        CheckError(ret != icamera::OK, ret, "Failed to process request, ret:%d", ret);
-+
-+        mCameraBufferInfo[index].halBuffer[i].sequence = opaqueRawInfo.sequence;
-+        mCameraBufferInfo[index].halBuffer[i].timestamp = opaqueRawInfo.timestamp;
-+        buffer[i] = &mCameraBufferInfo[index].halBuffer[i];
-+    }
-+
-+    if (request->settings) {
-+        // Convert metadata to Parameters
-+        MetadataConvert::requestMetadataToHALMetadata(mLastSettings, &param);
-+    }
-+
-+    if (!inputCam3Buf || opaqueRawInfo.sequence >= 0) {
-+        ret = icamera::camera_stream_qbuf(mCameraId, buffer, numBuffers,
-+                                          request->settings || forceUpdate ? &param : nullptr);
-+        CheckError(ret != icamera::OK, ret, "@%s, camera_stream_qbuf fails,ret:%d", __func__, ret);
-+    }
-+
-+    increaseRequestCount();
-+
-+    if (!mCameraDeviceStarted) {
-+        ret = icamera::camera_device_start(mCameraId);
-+        CheckError(ret != icamera::OK, ret, "failed to start device, ret %d", ret);
-+
-+        mCameraDeviceStarted = true;
-+    }
-+
-+    for (uint32_t i = 0; i < request->num_output_buffers; i++) {
-+        Camera3Stream* s = static_cast<Camera3Stream*>(request->output_buffers[i].stream->priv);
-+        s->queueBufferDone(request->frame_number,
-+                           opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
-+                           request->output_buffers[i],
-+                           param);
-+    }
-+    mCameraBufferInfo[index].frameInProcessing = true;
-+    mCameraBufferInfo[index].frameNumber = request->frame_number;
-+
-+    mResultProcessor->registerRequest(request, inputCam3Buf);
-+
-+    return ret;
-+}
-+
-+void RequestManager::dump(int fd)
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+int RequestManager::flush()
-+{
-+    LOG1("@%s", __func__);
-+
-+    icamera::nsecs_t startTime = icamera::CameraUtils::systemTime();
-+    icamera::nsecs_t interval = 0;
-+    const icamera::nsecs_t ONE_SECOND = 1000000000;
-+
-+    // wait 1000ms at most while there are requests in the HAL
-+    while (mRequestInProgress > 0 && interval <= ONE_SECOND) {
-+        usleep(10000); //wait 10ms
-+        interval = icamera::CameraUtils::systemTime() - startTime;
-+    }
-+
-+    LOG2("@%s, line:%d, mRequestInProgress:%d, time spend:%ld us",
-+          __func__, __LINE__, mRequestInProgress, interval / 1000);
-+
-+    // based on API, -ENODEV (NO_INIT) error should be returned.
-+    CheckError(interval > ONE_SECOND, icamera::NO_INIT,
-+          "flush() > 1s, timeout:%ld us", interval/1000);
-+
-+    return icamera::OK;
-+}
-+
-+void RequestManager::deleteStreams(bool inactiveOnly)
-+{
-+    LOG1("@%s", __func__);
-+
-+    unsigned int i = 0;
-+    while (i < mCamera3StreamVector.size()) {
-+        Camera3Stream *s = mCamera3StreamVector.at(i);
-+
-+        if (!inactiveOnly || !s->isActive()) {
-+            mCamera3StreamVector.erase(mCamera3StreamVector.begin() + i);
-+            delete s;
-+        } else {
-+            ++i;
-+        }
-+    }
-+}
-+
-+int RequestManager::waitProcessRequest()
-+{
-+    LOG1("@%s", __func__);
-+
-+    std::unique_lock<std::mutex> lock(mRequestLock);
-+    // check if it is ready to process next request
-+    while (mRequestInProgress >= mHALStream[0].max_buffers) {
-+        std::cv_status ret = mRequestCondition.wait_for(
-+                lock,
-+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
-+        if (ret == std::cv_status::timeout) {
-+            LOGW("%s, wait to process request time out", __func__);
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+void RequestManager::increaseRequestCount()
-+{
-+    LOG1("@%s", __func__);
-+
-+    std::lock_guard<std::mutex> l(mRequestLock);
-+    ++mRequestInProgress;
-+}
-+
-+void RequestManager::returnRequestDone(uint32_t frameNumber)
-+{
-+    LOG1("@%s", __func__);
-+
-+    std::lock_guard<std::mutex> l(mRequestLock);
-+
-+    // Update mCameraBufferInfo based on frameNumber
-+    for (int i = 0; i < kMaxProcessRequestNum; i++) {
-+        if (mCameraBufferInfo[i].frameNumber == frameNumber) {
-+            mCameraBufferInfo[i].frameInProcessing = false;
-+        }
-+    }
-+    mRequestInProgress--;
-+    mRequestCondition.notify_one();
-+}
-+
-+int RequestManager::checkStreamRotation(camera3_stream_configuration_t *stream_list)
-+{
-+    int rotationDegree0 = -1, countOutputStream = 0;
-+
-+    for (size_t i = 0; i < stream_list->num_streams; i++) {
-+        if (stream_list->streams[i]->stream_type != CAMERA3_STREAM_OUTPUT) {
-+            continue;
-+        }
-+        countOutputStream++;
-+
-+        int rotationDegree = HalV3Utils::getRotationDegrees(*(stream_list->streams[i]));
-+        CheckError(rotationDegree < 0, icamera::BAD_VALUE, "Unsupport rotation degree!");
-+
-+        if (countOutputStream == 1) {
-+            rotationDegree0 = rotationDegree;
-+        } else {
-+            CheckError(rotationDegree0 != rotationDegree, icamera::BAD_VALUE,
-+                   "rotationDegree0:%d, stream[%lu] rotationDegree:%d, not the same",
-+                   rotationDegree0, i, rotationDegree);
-+        }
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/RequestManager.h b/camera/hal/intel/ipu6/aal/RequestManager.h
-new file mode 100644
-index 000000000000..e479b529453f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/RequestManager.h
-@@ -0,0 +1,103 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+#include <mutex>
-+
-+#include <hardware/camera3.h>
-+
-+#include "HALv3Header.h"
-+#include "HALv3Interface.h"
-+#include "ResultProcessor.h"
-+#include "Camera3Stream.h"
-+
-+namespace camera3 {
-+
-+struct Camera3Request {
-+    uint32_t frameNumber;
-+    android::CameraMetadata settings;
-+};
-+
-+/**
-+ * \class RequestManager
-+ *
-+ * This class is used to handle requests. It has the following
-+ * roles:
-+ * - It instantiates ResultProcessor.
-+ */
-+class RequestManager : public RequestManagerCallback, public icamera::camera_callback_ops_t {
-+
-+public:
-+    RequestManager(int cameraId);
-+    virtual ~RequestManager();
-+
-+    int init(const camera3_callback_ops_t *callback_ops);
-+
-+    int deinit();
-+
-+    int configureStreams(camera3_stream_configuration_t *stream_list);
-+
-+    int constructDefaultRequestSettings(int type, const camera_metadata_t **meta);
-+
-+    int processCaptureRequest(camera3_capture_request_t *request);
-+
-+    void dump(int fd);
-+
-+    int flush();
-+
-+    void returnRequestDone(uint32_t frameNumber);
-+private:
-+    void deleteStreams(bool inactiveOnly);
-+    void increaseRequestCount();
-+    int waitProcessRequest();
-+    void chooseStreamForFaceDetection(uint32_t streamsNum, camera3_stream_t **streams, int *enableFDStreamNum);
-+    int checkStreamRotation(camera3_stream_configuration_t *stream_list);
-+
-+    static void callbackNotify(const icamera::camera_callback_ops *cb,
-+                               const icamera::camera_msg_data_t &data);
-+    void handleCallbackEvent(const icamera::camera_msg_data_t &data);
-+
-+private:
-+    static const int kMaxStreamNum = 4; // PREVIEW, VIDEO, STILL and POSTVIEW
-+    const uint64_t kMaxDuration = 2000000000; // 2000ms
-+
-+    static const int kMaxProcessRequestNum = 10;
-+    struct CameraBufferInfo {
-+        icamera::camera_buffer_t halBuffer[kMaxStreamNum];
-+        uint32_t frameNumber;
-+        bool frameInProcessing;
-+    };
-+    struct CameraBufferInfo mCameraBufferInfo[kMaxProcessRequestNum];
-+
-+    int mCameraId;
-+    const camera3_callback_ops_t *mCallbackOps;
-+    bool mCameraDeviceStarted;
-+    ResultProcessor *mResultProcessor;
-+
-+    std::map<int, android::CameraMetadata> mDefaultRequestSettings;
-+    icamera::stream_t mHALStream[kMaxStreamNum]; // not include CAMERA3_STREAM_INPUT stream
-+    std::vector<Camera3Stream*> mCamera3StreamVector;
-+
-+    std::condition_variable mRequestCondition;
-+    // mRequestLock is used to protect mRequestInProgress
-+    std::mutex mRequestLock;
-+    uint32_t mRequestInProgress;
-+    android::CameraMetadata mLastSettings;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.cpp b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
-new file mode 100644
-index 000000000000..aa349c5e80a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
-@@ -0,0 +1,462 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ResultProcessor"
-+
-+#include <mutex>
-+
-+#include "Errors.h"
-+#include "Utils.h"
-+
-+#include "HALv3Utils.h"
-+#include "MetadataConvert.h"
-+#include "ResultProcessor.h"
-+#include "PlatformData.h"
-+
-+namespace camera3 {
-+
-+#define META_ENTRY_COUNT 256
-+#define META_DATA_COUNT  80000
-+#define FPS_FRAME_COUNT  60  // the frame interval to print fps
-+
-+MetadataMemory::MetadataMemory() :
-+    mMeta(META_ENTRY_COUNT, META_DATA_COUNT),
-+    mMemory(nullptr)
-+{
-+}
-+
-+MetadataMemory::~MetadataMemory()
-+{
-+    // Return memory to metadata
-+    getMetadata();
-+}
-+
-+android::CameraMetadata* MetadataMemory::getMetadata()
-+{
-+    if (mMemory) {
-+        mMeta.acquire(mMemory);
-+        mMemory = nullptr;
-+    }
-+    return &mMeta;
-+}
-+
-+camera_metadata_t* MetadataMemory::getMemory()
-+{
-+    if (!mMemory) {
-+        mMemory = mMeta.release();
-+    }
-+    return mMemory;
-+}
-+
-+void MetadataMemory::copyMetadata(const camera_metadata_t* src)
-+{
-+    getMemory();
-+    // Clear old metadata
-+    mMemory = place_camera_metadata(mMemory,
-+                                    get_camera_metadata_size(mMemory),
-+                                    get_camera_metadata_entry_capacity(mMemory),
-+                                    get_camera_metadata_data_capacity(mMemory));
-+    getMetadata();
-+    mMeta.append(src);
-+}
-+
-+ResultProcessor::ResultProcessor(int cameraId, const camera3_callback_ops_t *callback,
-+                                 RequestManagerCallback *requestManagerCallback) :
-+    mCameraId(cameraId),
-+    mCallbackOps(callback),
-+    mLastSettings(nullptr),
-+    mRequestManagerCallback(requestManagerCallback)
-+{
-+    UNUSED(mCameraId);
-+    LOG1("@%s, mCameraId %d", __func__, mCameraId);
-+
-+    mLastSettings = acquireMetadataMemory();
-+
-+    mResultThread = std::unique_ptr<ResultThread>(new ResultThread(this));
-+
-+    mCamera3AMetadata = new Camera3AMetadata(mCameraId);
-+    gettimeofday(&mRequestTime, nullptr);
-+    CLEAR(mLastParams);
-+}
-+
-+ResultProcessor::~ResultProcessor()
-+{
-+    LOG1("@%s", __func__);
-+
-+    for (auto &item : mRequestStateVector) {
-+        releaseMetadataMemory(item.metaResult);
-+    }
-+    mRequestStateVector.clear();
-+
-+    releaseMetadataMemory(mLastSettings);
-+    while (mMetadataVector.size() > 0) {
-+        LOG1("%s: release meta %p", __func__, mMetadataVector.back());
-+        delete mMetadataVector.back();
-+        mMetadataVector.pop_back();
-+    }
-+
-+    delete mCamera3AMetadata;
-+
-+    mInputCam3Bufs.clear();
-+}
-+
-+void ResultProcessor::callbackNotify(const icamera::camera_msg_data_t &data)
-+{
-+    LOG2("@%s, type %d", __func__, data.type);
-+
-+    mResultThread->sendEvent(data);
-+}
-+
-+int ResultProcessor::registerRequest(const camera3_capture_request_t *request,
-+                                     std::shared_ptr<Camera3Buffer> inputCam3Buf)
-+{
-+    LOG1("@%s frame_number:%u, inputCam3Buf:%p", __func__, request->frame_number, inputCam3Buf.get());
-+
-+    RequestState req;
-+    req.frameNumber = request->frame_number;
-+    req.buffersToReturn = request->num_output_buffers;
-+    req.partialResultCount = 1;
-+
-+    std::lock_guard<std::mutex> l(mLock);
-+    // Copy settings
-+    if (request->settings) {
-+        mLastSettings->copyMetadata(request->settings);
-+    }
-+
-+    req.metaResult = acquireMetadataMemory();
-+    req.metaResult->copyMetadata(mLastSettings->getMemory());
-+
-+    mRequestStateVector.push_back(req);
-+
-+    if (inputCam3Buf) {
-+        mInputCam3Bufs[req.frameNumber] = inputCam3Buf;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+int ResultProcessor::shutterDone(const ShutterEvent &event)
-+{
-+    bool inputBuffer = false;
-+    std::lock_guard<std::mutex> l(mLock);
-+    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
-+        if (mInputCam3Bufs.find(event.frameNumber) != mInputCam3Bufs.end()) {
-+            if (mRequestStateVector.at(i).frameNumber != event.frameNumber) {
-+                continue;
-+            } else {
-+                inputBuffer = true;
-+            }
-+        } else if (mRequestStateVector.at(i).isShutterDone) {
-+            continue;
-+        }
-+
-+        camera3_notify_msg_t notifyMsg;
-+        notifyMsg.type = CAMERA3_MSG_SHUTTER;
-+        notifyMsg.message.shutter.frame_number = mRequestStateVector.at(i).frameNumber;
-+        notifyMsg.message.shutter.timestamp = event.timestamp;
-+
-+        MetadataMemory *metaResult = mRequestStateVector[i].metaResult;
-+        android::CameraMetadata *meta = metaResult->getMetadata();
-+        if (!inputBuffer) {
-+            meta->update(ANDROID_SENSOR_TIMESTAMP,
-+                     reinterpret_cast<const int64_t*>(&event.timestamp), 1);
-+        } else {
-+            // update shutter timestamp if there is input stream
-+            camera_metadata_entry entry = meta->find(ANDROID_SENSOR_TIMESTAMP);
-+            if (entry.count == 1) {
-+                notifyMsg.message.shutter.timestamp = entry.data.i64[0];
-+            }
-+        }
-+
-+        mCallbackOps->notify(mCallbackOps, &notifyMsg);
-+        mRequestStateVector.at(i).isShutterDone = true;
-+        LOG2("@%s, frame_number:%u, shutter timestamp:%lld", __func__,
-+             notifyMsg.message.shutter.frame_number, notifyMsg.message.shutter.timestamp);
-+        if (checkRequestDone(mRequestStateVector.at(i))) {
-+            returnRequestDone(notifyMsg.message.shutter.frame_number);
-+            releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
-+            mRequestStateVector.erase(mRequestStateVector.begin() + i);
-+        }
-+        return icamera::OK;
-+    }
-+
-+    LOGW("@%s frame_number:%u wasn't found!", __func__, event.frameNumber);
-+    return icamera::OK;
-+}
-+
-+int ResultProcessor::bufferDone(const BufferEvent &event)
-+{
-+    camera3_capture_result_t result;
-+    CLEAR(result);
-+
-+    MetadataMemory* metaMem = nullptr;
-+    {
-+        std::lock_guard<std::mutex> l(mLock);
-+        for (auto &reqStat : mRequestStateVector) {
-+            if (reqStat.frameNumber == event.frameNumber
-+                && reqStat.partialResultReturned < reqStat.partialResultCount) {
-+                reqStat.partialResultReturned = 1;
-+                metaMem = reqStat.metaResult;
-+            }
-+        }
-+    }
-+
-+    result.frame_number = event.frameNumber;
-+    result.output_buffers = event.outputBuffer;
-+    result.num_output_buffers = 1;
-+    if (metaMem) {
-+        if (mInputCam3Bufs.find(result.frame_number) == mInputCam3Bufs.end()) {
-+            android::CameraMetadata* metaResult = metaMem->getMetadata();
-+            MetadataConvert::HALMetadataToRequestMetadata(*(event.parameter), metaResult);
-+            updateMetadata(*(event.parameter), metaResult);
-+            mCamera3AMetadata->process3Astate(*(event.parameter), *metaResult);
-+        }
-+
-+        result.result = metaMem->getMemory();
-+
-+        result.partial_result = 1;
-+        LOG1("@%s frame_number:%u, timestamp:%lld, metadataDone", __func__, event.frameNumber, event.timestamp);
-+    } else {
-+        result.result = nullptr;
-+        result.partial_result = 0;
-+    }
-+    mCallbackOps->process_capture_result(mCallbackOps, &result);
-+
-+    bool found = false;
-+    std::lock_guard<std::mutex> l(mLock);
-+    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
-+        if (mRequestStateVector.at(i).frameNumber == event.frameNumber) {
-+            mRequestStateVector.at(i).buffersReturned++;
-+            mRequestStateVector.at(i).partialResultReturned = 1;
-+            if (checkRequestDone(mRequestStateVector.at(i))) {
-+                returnInputBuffer(event.frameNumber);
-+                returnRequestDone(event.frameNumber);
-+                releaseMetadataMemory(mRequestStateVector.at(i).metaResult);
-+                mRequestStateVector.erase(mRequestStateVector.begin() + i);
-+            }
-+            found = true;
-+        }
-+    }
-+    if (!found) {
-+        LOGW("%s, event.frameNumber %u wasn't found!", __func__, event.frameNumber);
-+    } else {
-+        LOG2("%s, event.frameNumber %u was returned", __func__, event.frameNumber);
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+void ResultProcessor::updateMetadata(const icamera::Parameters &parameter,
-+                                     android::CameraMetadata *settings) {
-+    /*
-+     *  if we support face ae and the face detection mode is not off,
-+     *  set face detect metadata to the request metadata, then the face area will be drawn.
-+     */
-+    if (icamera::PlatformData::isFaceAeEnabled(mCameraId)) {
-+        uint8_t faceDetectMode;
-+        int ret = parameter.getFaceDetectMode(faceDetectMode);
-+        if (ret == icamera::OK && faceDetectMode != icamera::FD_MODE_OFF) {
-+            icamera::CVFaceDetectionAbstractResult faceResult;
-+            ret = icamera::FaceDetection::getResult(mCameraId, &faceResult);
-+            if (ret == icamera::OK) {
-+                MetadataConvert::convertFaceDetectionMetadata(faceResult, settings);
-+                LOG2("@%s, set face detection metadata, face number:%d",
-+                        __func__, faceResult.faceNum);
-+            }
-+        }
-+    }
-+
-+    int64_t exposure = 0;
-+    float sensitivity = 0.0f;
-+    parameter.getExposureTime(exposure);
-+    parameter.getSensitivityGain(sensitivity);
-+
-+    uint8_t lockMode = ANDROID_BLACK_LEVEL_LOCK_OFF;
-+    camera_metadata_entry entry = settings->find(ANDROID_BLACK_LEVEL_LOCK);
-+    if (entry.count == 1 && (entry.data.u8[0] == ANDROID_BLACK_LEVEL_LOCK_ON)) {
-+        lockMode = (exposure == mLastParams.sensorExposure
-+                    && sensitivity == mLastParams.sensorIso) ?
-+                    ANDROID_BLACK_LEVEL_LOCK_ON : ANDROID_BLACK_LEVEL_LOCK_OFF;
-+    }
-+    LOG2("@%s, the black level lock metadata: %d", __func__, lockMode);
-+    settings->update(ANDROID_BLACK_LEVEL_LOCK, &lockMode, 1);
-+
-+    mLastParams.sensorExposure = exposure;
-+    mLastParams.sensorIso = sensitivity;
-+}
-+
-+// the input buffer must be returned as the last one buffer
-+void ResultProcessor::returnInputBuffer(uint32_t frameNumber)
-+{
-+    if (mInputCam3Bufs.find(frameNumber) == mInputCam3Bufs.end()) {
-+        return;
-+    }
-+
-+    std::shared_ptr<Camera3Buffer> inBuf = mInputCam3Bufs[frameNumber];
-+    if (!inBuf) {
-+        return;
-+    }
-+
-+    camera3_stream_t *s = inBuf->getStream();
-+    if (s) {
-+        LOG2("@%s, frame_number:%u, w:%d, h:%d, f:%d", __func__, frameNumber, s->width, s->height, s->format);
-+    }
-+
-+    camera3_stream_buffer_t buf = {};
-+    buf.stream = s;
-+    buf.buffer = inBuf->getBufferHandle();
-+    buf.status = inBuf->status();
-+
-+    inBuf->getFence(&buf);
-+    inBuf->unlock();
-+    inBuf->deinit();
-+
-+    camera3_capture_result_t result = {};
-+    result.frame_number = frameNumber;
-+    result.result = nullptr;
-+    result.input_buffer = &buf;
-+
-+    LOG1("@%s, frame_number:%u, return the input buffer", __func__, frameNumber);
-+    mCallbackOps->process_capture_result(mCallbackOps, &result);
-+
-+    mInputCam3Bufs.erase(frameNumber);
-+}
-+
-+bool ResultProcessor::checkRequestDone(const RequestState &requestState)
-+{
-+    LOG1("@%s", __func__);
-+
-+    return (requestState.isShutterDone
-+        && requestState.partialResultCount == requestState.partialResultReturned
-+        && requestState.buffersToReturn == requestState.buffersReturned);
-+}
-+
-+void ResultProcessor::returnRequestDone(uint32_t frameNumber)
-+{
-+    LOG2("@%s frame_number:%d", __func__, frameNumber);
-+
-+    if ((frameNumber % FPS_FRAME_COUNT == 0) &&
-+        icamera::Log::isDebugLevelEnable(icamera::CAMERA_DEBUG_LOG_FPS)) {
-+        struct timeval curTime;
-+        gettimeofday(&curTime, nullptr);
-+        int duration = static_cast<int>(curTime.tv_usec - mRequestTime.tv_usec
-+                       + ((curTime.tv_sec - mRequestTime.tv_sec) * 1000000));
-+        if (frameNumber == 0) {
-+            LOGFPS("%s, time of launch to preview: %dms", __func__, (duration / 1000));
-+        } else {
-+            float curFps = static_cast<float>(1000000) /
-+                           static_cast<float>(duration / FPS_FRAME_COUNT);
-+            LOGFPS("@%s, fps: %02f", __func__, curFps);
-+        }
-+        gettimeofday(&mRequestTime, nullptr);
-+    }
-+
-+    mRequestManagerCallback->returnRequestDone(frameNumber);
-+}
-+
-+MetadataMemory* ResultProcessor::acquireMetadataMemory()
-+{
-+    MetadataMemory* metaMem = nullptr;
-+    if (mMetadataVector.size() > 0) {
-+        metaMem = mMetadataVector.back();
-+        mMetadataVector.pop_back();
-+    } else {
-+        metaMem = new MetadataMemory();
-+        LOG1("%s: allocate new one: %p", __func__, metaMem);
-+    }
-+
-+    return metaMem;
-+}
-+
-+void ResultProcessor::releaseMetadataMemory(MetadataMemory* metaMem)
-+{
-+    CheckError(metaMem == nullptr, VOID_VALUE, "%s: null metaMem!", __func__);
-+    mMetadataVector.push_back(metaMem);
-+}
-+
-+ResultProcessor::ResultThread::ResultThread(ResultProcessor *resultProcessor)
-+    : mResultProcessor(resultProcessor)
-+{
-+    LOG1("@%s", __func__);
-+
-+    run("ResultThread");
-+}
-+
-+ResultProcessor::ResultThread::~ResultThread()
-+{
-+    LOG1("@%s", __func__);
-+
-+    requestExit();
-+    std::lock_guard<std::mutex> l(mEventQueueLock);
-+    mEventCondition.notify_one();
-+}
-+
-+void ResultProcessor::ResultThread::sendEvent(const icamera::camera_msg_data_t &data)
-+{
-+    LOG2("@%s", __func__);
-+    std::lock_guard<std::mutex> l(mEventQueueLock);
-+    mEventQueue.push(data);
-+    mEventCondition.notify_one();
-+}
-+
-+bool ResultProcessor::ResultThread::threadLoop()
-+{
-+    LOG2("@%s", __func__);
-+
-+    icamera::camera_msg_data_t data;
-+    // mutex only protects mEventQueue
-+    {
-+        std::unique_lock<std::mutex> l(mEventQueueLock);
-+        // check if there is event queued
-+        if (mEventQueue.empty()) {
-+            std::cv_status ret = mEventCondition.wait_for(l,
-+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
-+
-+            if (ret == std::cv_status::timeout) {
-+                LOGW("%s, wait event timeout", __func__);
-+            }
-+
-+            return true;
-+        }
-+
-+        // parse event
-+        data = std::move(mEventQueue.front());
-+        mEventQueue.pop();
-+    }
-+
-+    // handle message
-+    switch (data.type) {
-+        // Regards isp buffer ready as shutter event
-+        case icamera::CAMERA_ISP_BUF_READY: {
-+            ShutterEvent event = {
-+                data.data.buffer_ready.frameNumber,
-+                data.data.buffer_ready.timestamp
-+            };
-+            LOG2("@%s, frameNumber %d, timestamp %ld, mResultProcessor:%p", __func__,
-+                 event.frameNumber, event.timestamp, mResultProcessor);
-+            mResultProcessor->shutterDone(event);
-+            break;
-+        }
-+        default: {
-+            LOGW("unknown message type %d", data.type);
-+            break;
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/ResultProcessor.h b/camera/hal/intel/ipu6/aal/ResultProcessor.h
-new file mode 100644
-index 000000000000..ccc0d96662d6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.h
-@@ -0,0 +1,178 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <sys/time.h>
-+#include <hardware/camera3.h>
-+
-+#include <vector>
-+#include <queue>
-+#include <mutex>
-+#include <unordered_map>
-+
-+#include "Parameters.h"
-+#include "Thread.h"
-+#include "HALv3Header.h"
-+#include "HALv3Interface.h"
-+#include "Camera3AMetadata.h"
-+#include "Camera3Buffer.h"
-+
-+namespace camera3 {
-+
-+// Store metadata that are created by the AAL
-+// To avoid continuous allocation/de-allocation of metadata buffers
-+class MetadataMemory {
-+public:
-+    MetadataMemory();
-+    ~MetadataMemory();
-+
-+    // Don't access to metadata and memory in parellel
-+    // because metadata may reallocate memory when new entries are added.
-+    android::CameraMetadata* getMetadata(); // For entries update
-+    camera_metadata_t* getMemory();         // For metadata copy
-+
-+    // Helper function to avoid memory reallocation
-+    void copyMetadata(const camera_metadata_t* src);
-+
-+private:
-+    android::CameraMetadata mMeta; // May reallocate buffer if entries are added
-+    camera_metadata_t* mMemory;
-+};
-+
-+struct RequestState {
-+    uint32_t frameNumber;
-+
-+    bool isShutterDone;
-+
-+    unsigned int partialResultReturned;
-+    unsigned int partialResultCount;
-+
-+    unsigned int buffersReturned;
-+    unsigned int buffersToReturn;
-+
-+    MetadataMemory* metaResult;
-+
-+    RequestState() {
-+        frameNumber = 0;
-+        isShutterDone = false;
-+        partialResultReturned = 0;
-+        partialResultCount = 0;
-+        buffersReturned = 0;
-+        buffersToReturn = 0;
-+        metaResult = nullptr;
-+    }
-+};
-+
-+struct ShutterEvent {
-+    uint32_t frameNumber;
-+    uint64_t timestamp;
-+};
-+
-+struct BufferEvent {
-+    uint32_t frameNumber;
-+    uint64_t timestamp;
-+    const icamera::Parameters *parameter;
-+    const camera3_stream_buffer_t *outputBuffer;
-+};
-+
-+struct ReferenceParam {
-+    int64_t sensorExposure;
-+    float sensorIso;
-+};
-+
-+/**
-+ * \brief An interface used to callback buffer event.
-+ */
-+class CallbackEventInterface {
-+public:
-+    CallbackEventInterface() {}
-+    virtual ~CallbackEventInterface() {}
-+
-+    virtual int bufferDone(const BufferEvent &event) = 0;
-+    virtual int shutterDone(const ShutterEvent &event) = 0;
-+};
-+
-+/**
-+ * \class ResultProcessor
-+ *
-+ * This class is used to handle shutter done, buffer done and metadata done event.
-+ *
-+ */
-+class ResultProcessor : public CallbackEventInterface {
-+
-+public:
-+    ResultProcessor(int cameraId, const camera3_callback_ops_t *callback,
-+                    RequestManagerCallback *requestManagerCallback);
-+    virtual ~ResultProcessor();
-+
-+    int registerRequest(const camera3_capture_request_t *request,
-+                        std::shared_ptr<Camera3Buffer> inputCam3Buf);
-+
-+    virtual int shutterDone(const ShutterEvent &event);
-+    virtual int bufferDone(const BufferEvent &event);
-+
-+    void callbackNotify(const icamera::camera_msg_data_t &data);
-+
-+private:
-+    bool checkRequestDone(const RequestState &requestState);
-+    void returnRequestDone(uint32_t frameNumber);
-+
-+    MetadataMemory* acquireMetadataMemory();
-+    void releaseMetadataMemory(MetadataMemory* metaMem);
-+
-+    void returnInputBuffer(uint32_t frameNumber);
-+    void updateMetadata(const icamera::Parameters &parameter, android::CameraMetadata *settings);
-+
-+private:
-+    class ResultThread : public icamera::Thread {
-+    public:
-+        ResultThread(ResultProcessor *resultProcessor);
-+        ~ResultThread();
-+
-+        void sendEvent(const icamera::camera_msg_data_t &data);
-+    private:
-+        virtual bool threadLoop();
-+
-+    private:
-+        const uint64_t kMaxDuration = 2000000000; // 2000ms
-+        ResultProcessor *mResultProcessor;
-+
-+        std::condition_variable mEventCondition;
-+        std::mutex mEventQueueLock;
-+        std::queue<icamera::camera_msg_data_t> mEventQueue;
-+    };
-+    std::unique_ptr<ResultThread> mResultThread;
-+
-+    int mCameraId;
-+    const camera3_callback_ops_t *mCallbackOps;
-+
-+    // mLock is used to protect mRequestStateVector
-+    std::mutex mLock;
-+    std::vector<RequestState> mRequestStateVector;
-+    std::vector<MetadataMemory*> mMetadataVector;
-+    MetadataMemory* mLastSettings;
-+
-+    RequestManagerCallback *mRequestManagerCallback;
-+
-+    Camera3AMetadata *mCamera3AMetadata;
-+
-+    std::unordered_map<int, std::shared_ptr<Camera3Buffer>> mInputCam3Bufs;
-+    timeval mRequestTime;
-+    ReferenceParam mLastParams;
-+};
-+
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
-new file mode 100644
-index 000000000000..3fc2deff906b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/aal/chrome/HALv3Header.h
-@@ -0,0 +1,20 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+// metadata related header file
-+#include <camera/camera_metadata.h>
-diff --git a/camera/hal/intel/ipu6/include/api/ICamera.h b/camera/hal/intel/ipu6/include/api/ICamera.h
-new file mode 100644
-index 000000000000..6ecab9317a3a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/api/ICamera.h
-@@ -0,0 +1,574 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*
-+ *
-+ * Filename: ICamera.h
-+ *
-+ * ------------------------------------------------------------------------------
-+ * REVISION HISTORY
-+ *******************************************************************************
-+ *     Version        0.10       Initialize camera HAL API
-+ *******************************************************************************
-+ *     Version        0.20       Update for the device handle and stream handle
-+ *                               Update for the coding style of the type
-+ *******************************************************************************
-+ *     Version        0.21       Remove API camera_device_set_param and camera_device_get_param
-+ *                               Remove type define camera_stream_t
-+ *******************************************************************************
-+ *     Version        0.30       Remove API camera_device_del_stream
-+ *                               Rename API camera_device_add_stream -> camera_device_config_streams
-+ *                                   * All the streams are added at the same time
-+ *                               Rename camera_device_init -> camera_hal_init
-+ *                               Rename camera_device_deinit -> camera_hal_deinit
-+ *                               Remove the typedef for struct camera_buffer
-+ *******************************************************************************
-+ *     Version        0.31       Remove duplicated camera_frame_info_t
-+ *                               Cleanup the camera_buffer_t structure
-+ *******************************************************************************
-+ *     Version        0.40       Delete redundant query_frame_info
-+ *                               Add assist API: get_frame_size
-+ *******************************************************************************
-+ *     Version        0.41       Add API camera_device_allocate_memory to enable mmap memory mode
-+ *******************************************************************************
-+ *     Version        0.42       Merge all the common types to Parameters.h
-+ *******************************************************************************
-+  *    Version        0.43       Add sensor description in camera_info_t
-+ *******************************************************************************
-+ *     Version        0.44       Change output parameter of get_frame_size
-+ *******************************************************************************
-+ *     Version        0.45       Add two parameters(number of buffers, parameters) for camera_stream_qbuf
-+                                 Add one parameter(parameters) for camera_stream_dqbuf
-+*******************************************************************************
-+ *     Version        0.46       Add virtual channel camera number for camera_device_open
-+                                 Add virtual channel information in camera_info_t
-+ *******************************************************************************
-+ *     Version        0.50       Support specifying input format (aka ISYS output format).
-+ *******************************************************************************
-+ *     Version        0.51       Support specifying inputConfig inlucding inputformat/resolution
-+                                 Params int inputFmt changed to stream_t *inputConfig
-+ *******************************************************************************
-+ *     Version        0.60       Overload interface camera_stream_qbuf() with refined parameters
-+                                 old camera_stream_qbuf() will be removed soon
-+ *******************************************************************************
-+ *     Version        0.61       Add API camera_callback_register() to notify event to AAL
-+ * ------------------------------------------------------------------------------
-+ *
-+ */
-+
-+#pragma once
-+
-+#include "Parameters.h"
-+
-+#include <stdlib.h> // For including definition of NULL
-+
-+namespace icamera {
-+
-+/**
-+ * \struct camera_info_t: Define each camera basic information
-+ */
-+typedef struct {
-+    int facing;
-+    int orientation;
-+    int device_version;
-+    const char* name; /**< Sensor name */
-+    const char* description; /**< Sensor description */
-+    const Parameters *capability; /**< camera capability */
-+} camera_info_t;
-+
-+/**
-+ * \brief
-+ *   Get numbers of camera
-+ *
-+ * \note
-+ *   This allows user to get the numbers of camera without init or open camera device.
-+ *
-+ * \return
-+ *   >0 the numbers of camera
-+ * \return
-+ *   <= 0 failed to get camera numbers
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int num = get_number_of_cameras();
-+ * \endcode
-+ **/
-+int get_number_of_cameras();
-+
-+/**
-+ * \brief
-+ *   Get camera info including camera capability.
-+ *
-+ * \note
-+ *   It can be called before hal init
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[out]
-+ *   camera_info_t info: Camera info filled by libcamhal
-+ *
-+ * \return
-+ *   0 succeed to get camera info
-+ * \return
-+ *   <0 error code, failed to get camera info
-+ *
-+ * \par Sample code
-+ *
-+ * \code
-+ *   int camera_id = 0;
-+ *   camera_info_t info;
-+ *   get_camera_info(camera_id, info);
-+ *
-+ * \endcode
-+ *
-+ **/
-+int get_camera_info(int camera_id, camera_info_t& info);
-+
-+/**
-+ * \brief
-+ *   Initialize camera HAL
-+ *
-+ * \return
-+ *   0 succeed to init camera HAL
-+ * \return
-+ *   <0 error code, failed to init camera HAL
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int ret = camera_hal_init();
-+ * \endcode
-+ **/
-+int camera_hal_init();
-+
-+/**
-+ * \brief
-+ *   De-initialize camera HAL
-+ *
-+ * \return
-+ *   0 succeed to deinit camera HAL
-+ * \return
-+ *   <0 error code, failed to deinit camera device
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int ret = camera_hal_deinit();
-+ * \endcode
-+ **/
-+int camera_hal_deinit();
-+
-+/**
-+ * \brief
-+ *   Register callback function
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   camera_callback_ops_t *callback: callback handle
-+ *
-+ **/
-+void camera_callback_register(int camera_id, const camera_callback_ops_t *callback);
-+
-+/**
-+ * \brief
-+ *   Open camera device by camera ID
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ *
-+ * \return
-+ *   0 succeed to open camera device
-+ * \return
-+ *   <0 error code, failed to open camera device
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int camera_id = 0;
-+ *   int ret = camera_device_open(camera_id);
-+ * \endcode
-+ **/
-+int camera_device_open(int camera_id);
-+
-+/**
-+ * \brief
-+ *   Close camera device by camera ID
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int camera_id = 0;
-+ *   int ret = camera_device_open(camera_id);
-+ *   camera_device_close(camera_id);
-+ * \endcode
-+ **/
-+void camera_device_close(int camera_id);
-+
-+/**
-+ * \brief
-+ *   Configure sensor input of camera device, it is not allowed to call this when camera is started.
-+ *   Optional call.
-+ *
-+ * \note
-+ *   1. To re-configure sensor input, camera device must be stopped first.
-+ *   2. The new sensor configuration will overwrite the previous config.
-+ *   3. The new "inputConfig" will be used for all the future operation until the device is closed.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   int inputConfig: Specify which input format, resolution(the output of ISYS) should be used.
-+ *
-+ * \return
-+ *   0 succeed to configure streams
-+ * \return
-+ *   <0 error code, failed to configure stream
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int camera_id = 0;
-+ *   stream_t input_config;
-+ *   CLEAR(input_config);
-+ *   input_config.format = V4L2_PIX_FMT_SGRBG8V32;
-+ *   ret = camera_device_config_sensor_input(camera_id, &input_config);
-+ * \endcode
-+ **/
-+int camera_device_config_sensor_input(int camera_id, const stream_t *inputConfig);
-+
-+/**
-+ * \brief
-+ *   Configure streams to camera device, it is not allowed to call this when camera is started.
-+ *
-+ * \note
-+ *   1. To re-configure streams, camera device must be stopped first.
-+ *   2. The new streams configuration will overwrite the previous streams.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   stream_config_t stream_list: stream configuration list, if success, stream id is filled in streams[]
-+ *
-+ * \return
-+ *   0 succeed to configure streams
-+ * \return
-+ *   <0 error code, failed to configure stream
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int camera_id = 0;
-+ *   stream_config_t stream_list;
-+ *   stream_t streams[1];
-+ *   streams[0].format = V4L2_PIX_FMT_SGRBG8;
-+ *   streams[0].width = 1920;
-+ *   streams[0].height = 1080;
-+ *   streams[0].memType = V4L2_MEMORY_USERPTR;
-+ *   stream_list.num_streams = 1;
-+ *   stream_list.streams = streams;
-+ *   ret = camera_device_config_streams(camera_id, &stream_list);
-+ * \endcode
-+ **/
-+int camera_device_config_streams(int camera_id, stream_config_t *stream_list);
-+
-+/**
-+ * \brief
-+ *   Start camera device
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ *
-+ * \return
-+ *   0 succeed to start device
-+ * \return
-+ *   <0 error code, failed to start device
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   int camera_id=0;
-+ *   stream_config_t stream_list;
-+ *   ...
-+ *   ret = camera_device_config_streams(camera_id, &stream_list);
-+ *   ret = camera_device_start(camera_id);
-+ *   ... ...
-+ *   ret = camera_device_stop(camera_id);
-+ * \endcode
-+ *
-+ **/
-+int camera_device_start(int camera_id);
-+
-+/**
-+ * \brief
-+ *   Stop camera device.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ *
-+ * \return
-+ *   0 succeed to stop device
-+ * \return
-+ *   <0 error code, failed to stop device
-+ *
-+ * \see camera_device_start()
-+ **/
-+int camera_device_stop(int camera_id);
-+
-+/**
-+ * \brief
-+ *   Allocate memory for mmap & dma export io-mode
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[out]
-+ *   camera_buffer_t buffer: in Mmap mode, mmaped address is filled in addr;
-+ *   in DMA export mode, the dma fd is flled in dmafd.
-+ *
-+ * \return
-+ *   0 succeed to allocate memory
-+ * \return
-+ *   <0 error code, failed to allocate memory
-+ *
-+ * \par Sample code:
-+ *
-+ * \code
-+ *   camera_buffer_t *buffers = (camera_buffer_t *)malloc(sizeof(camera_buffer_t)*buffer_count);
-+ *   camera_buffer_t *buf = buffers;
-+ *   buf.s = stream;
-+ *   for (int i = 0; i < buffer_count; i++, buf++) {
-+ *     camera_device_allocate_memory(camera_id, buf):
-+ *   }
-+ *
-+ *   buf = buffers;
-+ *   for (int i = 0; i < buffer_count; i++, buf++) {
-+ *       camera_stream_qbuf(camera_id, stream_id, buf);
-+ *   }
-+ *
-+ *   camera_device_start(camera_id);
-+ * \endcode
-+ *
-+ */
-+int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer);
-+
-+/**
-+ * \brief
-+ *   Queue a buffer to device (deprecated, will be removed soon.)
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   int stream_id: ID of stream
-+ * \param[in]
-+ *   camera_buffer_t buffer: buffer queued to device
-+ * \param[in]
-+ *   int num_buffers: indicates how many buffers need to be queued at the same time,
-+                      and these buffers MUST be for different streams.
-+                      And stream id in buffer MUST be filled correctly.
-+ * \param[in]
-+ *   Parameters settings: Settings used for this group of buffers.
-+ *
-+ * \return
-+ *   0 succeed to queue buffers
-+ * \return
-+ *   <0 error code, failed to queue buffers
-+ *
-+ * \see camera_stream_dqbuf();
-+ **/
-+int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
-+                       int num_buffers = 1, const Parameters* settings = NULL);
-+
-+/**
-+ * \brief
-+ *   Queue one or serveral buffers to the camera device
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   camera_buffer_t buffer: array of pointers to camera_buffer_t
-+ *   buffer[i]->s MUST be filled before calling this API.
-+ * \param[in]
-+ *   int num_buffers: indicates how many buffers are in the buffer pointer array,
-+ *                    and these buffers MUST be for different streams. Stream id is
-+ *                    filled and give back to app when camera_device_config_streams()
-+ *                    is called, HAL will do the mapping when parsing queued buffers
-+ *                    according to num_buffers.
-+ * \param[in]
-+ *   Parameters settings: Settings used for this group of buffers.
-+ *                        This is used for per-frame setting, which means the settings should be
-+ *                        applied for the group of buffers.
-+ *
-+ * \return
-+ *   0 succeed to queue buffers
-+ * \return
-+ *   <0 error code, failed to queue buffers
-+ *
-+ * \see camera_stream_qbuf();
-+ **/
-+int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
-+                       int num_buffers = 1, const Parameters* settings = NULL);
-+
-+/**
-+ * \brief
-+ *   Dequeue a buffer from device per stream id.
-+ *
-+ * \note
-+ *   It's a block function, that means the caller will be blocked until buffer is ready.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   int stream_id: ID of stream
-+ * \param[out]
-+ *   camera_buffer_t buffer: buffer dqueued from device
-+ * \param[out]
-+ *   Parameters settings: Settings used for this buffer.
-+ *
-+ * \return
-+ *   0 succeed to dqueue buffer
-+ * \return
-+ *   <0 error code, failed to dqueue buffer
-+ *
-+ * \par Sample code
-+ *
-+ * \code
-+ *   const int buffer_count = 8;
-+ *   int bpp = 0;
-+ *   int buffer_size = get_frame_size(camera_id, V4L2_PIX_FMT_SGRBG8, 1920, 1080, V4L2_FIELD_ANY, &bpp);
-+ *   camera_buffer_t buffers[buffer_count];
-+ *   camera_buffer_t *buf = nullptr;
-+ *   for (int i = 0; i < buffer_count; i++) {
-+ *     buf = &buffers[i];
-+ *     posix_memalign(&buf->addr, getpagesize(), buffer_size);
-+ *     buf->s = stream; // stream here comes from parameter and result of camera_device_config_streams.
-+ *   }
-+ *
-+ *   for (int i = 0; i < buffer_count; i++) {
-+ *       buf = &buffers[i];
-+ *       camera_stream_qbuf(camera_id, stream_id, &buf);
-+ *   }
-+ *
-+ *   camera_device_start(camera_id);
-+ *
-+ *   for (int i = 0; i < buffer_count; i++) {
-+ *       camera_stream_dqbuf(camera_id, stream_id, &buf);
-+ *       // processing data with buf
-+ *   }
-+ * \endcode
-+ *
-+ **/
-+int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
-+                        Parameters* settings = NULL);
-+
-+/**
-+ * \brief
-+ *   Set a set of parameters to the gaven camera device.
-+ *
-+ * \note
-+ *   It MUST be called after device opened, otherwise error will be returned.
-+ *   Which buffer the paramters takes effect in is not guaranteed.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[in]
-+ *   Parameters param: A set of parameters.
-+ *
-+ * \return
-+ *   0 succeed to set camera parameters
-+ * \return
-+ *   <0 error code, failed to set camera parameters
-+ *
-+ * \par Sample code
-+ *
-+ * \code
-+ *   Parameters param;
-+ *    camera_ae_mode_t aeMode = AE_MODE_MANUAL;
-+ *    int64_t expTime = 10 * 1000;
-+ *    param.setAeMode(aeMode);
-+ *    param.setExposureTime(expTime);
-+ *    param.setXXX(); // Set other parameters...
-+ *
-+ *   int ret = camera_set_parameters(camera_id, param);
-+ *
-+ * \endcode
-+ *
-+ **/
-+int camera_set_parameters(int camera_id, const Parameters& param);
-+
-+/**
-+ * \brief
-+ *   Get parameter from the gaven camera device.
-+ *
-+ * \note
-+ *   It MUST be called after device opened, otherwise error will be returned.
-+ *
-+ * \param[in]
-+ *   int camera_id: ID of the camera
-+ * \param[out]
-+ *   Parameters param:  parameters need to be filled in
-+ *
-+ * \return
-+ *   0 succeed to get camera parameters
-+ * \return
-+ *   <0 error code, failed to get camera parameters
-+ *
-+ * \par Sample code
-+ *
-+ * \code
-+ *   Parameters param;
-+ *   int ret = camera_get_parameters(camera_id, param);
-+ *   camera_ae_mode_t aeMode = AE_MODE_MANUAL;
-+ *   ret = param.getAeMode(aeMode);
-+ *
-+ * \endcode
-+ *
-+ **/
-+int camera_get_parameters(int camera_id, Parameters& param);
-+
-+/**************************************Optional API ******************************
-+ * The API defined in this section is optional.
-+ */
-+
-+/**
-+ * \brief
-+ *   Return the size information of a frame.
-+ *
-+ * \note
-+ *   It is used to assist the test cases to double confirm the final buffer size
-+ *
-+ * \param[in]
-+ *   int camera_id: The camera device index
-+ * \param[in]
-+ *   int format: The v4l2 format of the frame
-+ * \param[in]
-+ *   int width: The width of the frame
-+ * \param[in]
-+ *   int height: The height of the frame
-+ * \param[in]
-+ *   int field: The interlace field of the frame
-+ * \param[out]
-+ *   int bpp: The bpp of the format
-+ *
-+ * \return
-+ *   frame size.
-+ **/
-+int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp);
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/include/api/Parameters.h b/camera/hal/intel/ipu6/include/api/Parameters.h
-new file mode 100644
-index 000000000000..8faaddc95d0d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/api/Parameters.h
-@@ -0,0 +1,2559 @@
-+/*
-+ * Copyright (C) 2013 The Android Open Source Project
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*
-+ *
-+ * Filename: Parameters.h
-+ *
-+ * ------------------------------------------------------------------------------
-+ * REVISION HISTORY
-+ *     Version        0.1        Initialize camera parameters API
-+ *     Version        0.2        Merge all the types to this file
-+ *     Version        0.3        Add AE compensation related APIs.
-+ *     Version        0.31       Add manual color matrix APIs.
-+ *     Version        0.32       Add manual AE/AWB converge speed APIs.
-+ *     Version        0.33       Add timestamp variable in camera_buffer_t
-+ *     Version        0.34       Add AE window weight grid API
-+ *     Version        0.40       Add Data Structure for HAL 3.3
-+ *     Version        0.41       Add API getSupportedAeExposureTimeRange
-+ *                               Add API getSupportedAeGainRange
-+ *     Version        0.42       Add API updateDebugLevel
-+ *     Version        0.43       Add API set and get deinterlace mode
-+ *     Version        0.44       Add API set and get gps processing method
-+ *                               Add API set and get focal length
-+ *     Version        0.45       Add get supported static metadata APIs
-+ *     Version        0.50       Support low level ISP feature control
-+ *     Version        0.51       Support getting supported ISP control feature list
-+ *     Version        0.52       Add API set and get awb result
-+ *     Version        0.53       Add API to get/set enabled ISP control feature list
-+ *     Version        0.54       Add API to get/set fisheye dewarping mode
-+ *     Version        0.55       Add API to get/set LTM tuning data
-+ *     Version        0.56       Add API to get/set LDC/RSC/digital zoom ratio
-+ *     Version        0.58       Add API to get/set 3A state, and lens state.
-+ *     Version        0.59       Add API to get/set AE/AWB lock
-+ *     Version        0.61       Add API to support vertical and horizontal flip.
-+ *     Version        0.62       Add API to support 3A cadence.
-+ *     Version        0.63       Add API to enable/disable MONO Downscale feature.
-+ *     Version        0.64       Add callback message definition.
-+ *     Version        0.65       Add API to support OUTPUT/INPUT streams.
-+ *     Version        0.66       modifies callback message definition.
-+ *     Version        0.67       Add API to support lens.focusDistance and lens.focalLength
-+ *     Version        0.68       Add API to support shading map.
-+ *     Version        0.69       Add API to support statistics lens shading map control.
-+ *     Version        0.70       Add API to support tonemap.
-+ *     Version        0.71       Add API to support OPAQUE RAW usage for RAW reprocessing.
-+ *     Version        0.72       Add streamType into supported_stream_config_t.
-+ *
-+ *
-+ * ------------------------------------------------------------------------------
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+#include <set>
-+#include <stdint.h>
-+
-+namespace icamera {
-+
-+/***************Start of Camera Basic Data Structure ****************************/
-+/**
-+ * Basic definition will be inherited by more complicated structure.
-+ * MUST be all "int" in this structure.
-+ */
-+typedef struct {
-+    int width;
-+    int height;
-+} camera_resolution_t;
-+
-+/**
-+ * \struct stream_t: stream basic info
-+ *
-+ * \note
-+ *   MUST use int if new member added.
-+ */
-+typedef struct {
-+    int format;    /**< stream format refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html */
-+    int width;     /**< image width */
-+    int height;    /**< image height */
-+    int field;     /**< refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/field-order.html#v4l2-field */
-+
-+/*
-+* The buffer geometry introduction.
-+* The YUV image is formed with Y:Luma and UV:Chroma. And there are
-+* two kinds of styles for YUV format: planar and packed.
-+*
-+*   YUV420:NV12
-+*
-+*            YUV420(720x480) sampling
-+*
-+*       |<----width+padding=alignedBpl----->|
-+*     Y *-------*-------*-------*-------*....-----
-+*       |                               |   :  ^
-+*       |   # UV            #           |   :  |
-+*       |                               |   :  |
-+*       *-------*-------*-------*-------*....  |
-+*       |                               |   :  |
-+*       |   #               #           |   :  |
-+*       |                               |   :  |
-+*       *-------*-------*-------*-------*.... (height * 3 / 2)
-+*       |                               |   :  |
-+*       |   #               #           |   :  |
-+*       |                               |   :  |
-+*       *-------*-------*-------*-------*....  |
-+*       |                               |   :  |
-+*       |   #               #           |   :  |
-+*       |                               |   :  v
-+*       *-------*-------*-------*-------*....-----
-+*
-+*         The data stored in memory
-+*          ____________w___________ .....
-+*         |Y0|Y1                   |    :
-+*         |                        |    :
-+*         h                        h    :
-+*         |                        |    :
-+*         |                        |    :
-+*         |________________________|....:
-+*         |U|V|U|V                 |    :
-+*        h/2                      h/2   :
-+*         |____________w___________|....:
-+*
-+*       bpp = 12
-+*       bpl = width;
-+*       stride = align64(bpl):
-+*
-+*   YUV422:YUY2
-+*
-+*           YUV422(720x480) sampling
-+*
-+*       |<--(width*2)+padding=alignedBpl-->|
-+*   YUV *#----*#-----*#-----*#-----*#....-----
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#.... (height)
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....  |
-+*       *#----*#-----*#-----*#-----*#....-----
-+*
-+*         The data stored in memory
-+*          ____________w___________ .....
-+*         |Y0|Cb|Y1|Cr             |    :
-+*         |                        |    :
-+*         |                        |    :
-+*         |                        |    :
-+*         h                        h    :
-+*         |                        |    :
-+*         |                        |    :
-+*         |                        |    :
-+*         |____________w___________|....:
-+*
-+*       bpp = 16
-+*       bpl = width * bpp / 8 = width * 2;
-+*       stride = align64(bpl):
-+*
-+*       Note: The stride defined in HAL is same as aligned bytes per line.
-+*/
-+    int stride;    /**< stride = aligned bytes per line */
-+    int size;      /**< real buffer size */
-+
-+    int id;        /**< Id that is filled by HAL. */
-+    int memType;   /**< buffer memory type filled by app, refer to https://linuxtv.org/downloads/v4l-dvb-apis/io.html */
-+
-+    /**
-+     * The maximum number of buffers the HAL device may need to have dequeued at
-+     * the same time. The HAL device may not have more buffers in-flight from
-+     * this stream than this value.
-+     */
-+    uint32_t max_buffers;
-+
-+    int usage; /**<The usage of this stream defined in camera_stream_usage_t. */
-+    int streamType; /**<The stream type of this stream defined in camera_stream_type_t. */
-+} stream_t;
-+
-+typedef std::vector<stream_t> stream_array_t;
-+
-+/**
-+ * \struct stream_config_t: stream configuration info
-+ *
-+ * Contains all streams info in this configuration.
-+ */
-+typedef struct {
-+    int num_streams; /**< number of streams in this configuration */
-+    stream_t    *streams; /**< streams list */
-+    /**
-+     * The operation mode of the streams in this configuration. It should be one of the value
-+     * defined in camera_stream_configuration_mode_t.
-+     * The HAL uses this mode as an indicator to set the stream property (e.g.,
-+     * camera_stream->max_buffers) appropriately. For example, if the configuration is
-+     * CAMERA_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE, the HAL may want to set aside more
-+     * buffers for batch mode operation (see camera.control.availableHighSpeedVideoConfigurations
-+     * for batch mode definition).
-+     */
-+    uint32_t operation_mode;
-+} stream_config_t;
-+
-+/**
-+ * \struct supported_stream_config_t: the supported stream configurations
-+ *
-+ * \note
-+ *   MUST use int if new member added.
-+ */
-+typedef struct {
-+    int format;    /**< stream format refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html */
-+    int width;     /**< image width */
-+    int height;    /**< image height */
-+    int field;     /**< refer to v4l2 definition https://linuxtv.org/downloads/v4l-dvb-apis/field-order.html#v4l2-field */
-+
-+    int stride;    /**< stride = aligned bytes per line */
-+    int size;      /**< real buffer size */
-+
-+    int maxVideoFps;  /**<The max fps max fps when only this stream is configured for continuous streaming. */
-+    int maxCaptureFps;  /**<The max fps max fps when only this stream is configured for high quality still capture. */
-+
-+    int streamType; /**< The type of the stream, one of the camera_stream_type_t values. */
-+} supported_stream_config_t;
-+
-+typedef std::vector<supported_stream_config_t> supported_stream_config_array_t;
-+
-+/**
-+ * \struct camera_buffer_flags_t: Specify a buffer's properties.
-+ *
-+ * The buffer's properties can be one of them or combined with some of them.
-+ */
-+typedef enum {
-+    BUFFER_FLAG_DMA_EXPORT = 1<<0,
-+    BUFFER_FLAG_INTERNAL = 1<<1,
-+    BUFFER_FLAG_SW_READ = 1<<2,
-+    BUFFER_FLAG_SW_WRITE = 1<<3,
-+} camera_buffer_flags_t;
-+
-+/**
-+ * \struct camera_buffer_t: camera buffer info
-+ *
-+ * camera buffer is used to carry device frames. Application allocate buffer structure,
-+ * according to memory type to allocate memory and queue to device.
-+ */
-+typedef struct {
-+    stream_t s;   /**< stream info */
-+    void *addr;   /**< buffer addr for userptr and mmap memory mode */
-+    int index;    /**< buffer index, filled by HAL. it is used for qbuf and dqbuf in order */
-+    long sequence; /**< buffer sequence, filled by HAL, to record buffer dqueue sequence from device */
-+    int dmafd;    /**< buffer dmafd for DMA import and export mode */
-+    int flags;    /**< buffer flags, its type is camera_buffer_flags_t, used to specify buffer properties */
-+    uint64_t timestamp; /**< buffer timestamp, it's a time reference measured in nanosecond */
-+    int reserved; /**< reserved for future */
-+} camera_buffer_t;
-+
-+/**
-+ * camera_stream_type_t:
-+ *
-+ * The type of the camera stream, which defines whether the camera HAL device
-+ * is the producer or the consumer for that stream, and how the buffers of that
-+ * stream relate to the other streams.
-+ */
-+typedef enum {
-+    /**
-+     * This stream is an output stream; the camera HAL device will be responsible to
-+     * fill the buffers of this stream with newly captured or reprocessed image data.
-+     */
-+    CAMERA_STREAM_OUTPUT = 0,
-+
-+    /**
-+     * This stream is an input stream; the camera HAL device will be responsible
-+     * to read buffers from this stream and to send them through the camera
-+     * processing pipeline, as if the buffer was a newly captured image from
-+     * the imager.
-+     *
-+     * The pixel format for an input stream can be any format reported by
-+     * camera.scaler.availableInputOutputFormatsMap. The pixel format of the
-+     * output stream used to produce the reprocessing data may be any format
-+     * reported by camera.scaler.availableStreamConfigurations. The supported
-+     * inputoutput stream combinations depends on the camera device capabilities.
-+     * See camera.scaler.availableInputOutputFormatsMap for stream map details.
-+     *
-+     * This kind of stream is generally used to reprocess data into higher
-+     * quality images (that otherwise would cause a frame rate performance loss),
-+     * or to do off-line reprocessing.
-+     * The typical use cases are OPAQUE (typically ZSL) and YUV reprocessing.
-+     */
-+    CAMERA_STREAM_INPUT = 1,
-+
-+    /**
-+     * This stream can be used for input and output. Typically, the stream is
-+     * used as an output stream, but occasionally one already-filled buffer may
-+     * be sent back to the HAL device for reprocessing.
-+     *
-+     * This kind of stream is generally meant for Zero Shutter Lag (ZSL)
-+     * features, where copying the captured image from the output buffer to the
-+     * reprocessing input buffer would be expensive.
-+     *
-+     * Note that the HAL will always be reprocessing data it produced.
-+     *
-+     */
-+    CAMERA_STREAM_BIDIRECTIONAL = 2,
-+
-+    /**
-+     * Total number of framework-defined stream types
-+     */
-+    CAMERA_NUM_STREAM_TYPES
-+
-+} camera_stream_type_t;
-+
-+/**
-+ * camera_stream_usage_t:
-+ *
-+ * The type of the camera stream, which defines whether the camera HAL device
-+ * is the producer or the consumer for that stream, and how the buffers of that
-+ * stream relate to the other streams.
-+ */
-+typedef enum {
-+    /**
-+     * This stream is an output stream for preview;
-+     */
-+    CAMERA_STREAM_PREVIEW = 0,
-+
-+    /**
-+     * This stream is an output stream for VIDEO CAPTURE;
-+     */
-+    CAMERA_STREAM_VIDEO_CAPTURE,
-+
-+    /**
-+     * This stream is an output stream for STILL IMAGE CAPTURE;
-+     */
-+    CAMERA_STREAM_STILL_CAPTURE,
-+
-+    /**
-+     * This stream is an output stream for Application processing which is accessed by CPU;
-+     */
-+    CAMERA_STREAM_APP,
-+
-+    /**
-+     * This stream is an output stream for Opaque RAW reprocess.
-+     */
-+    CAMERA_STREAM_OPAQUE_RAW,
-+} camera_stream_usage_t;
-+
-+/**
-+ * camera_stream_configuration_mode_t:
-+ *
-+ * This defines the general operation mode for the HAL (for a given stream configuration), where
-+ * modes besides NORMAL have different semantics, and usually the generality of the APIs are
-+ * limited in exchange for higher performance in some particular area.
-+ */
-+typedef enum {
-+    /**
-+     * Normal stream configuration operation mode.
-+     * This is the default camera operation mode, where all semantics of HAL APIs and metadata
-+     * controls apply.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_NORMAL = 0,
-+
-+    /**
-+     * CONSTRAINED_HIGH_SPEED is the special constrained high speed operation mode for devices
-+     * that do not support high speed output in NORMAL mode.
-+     * To support this configuration mode, camera.control.availableHighSpeedVideoConfigurations
-+     * should be implemented and CONSTRAINED_HIGH_SPEED should be reported in
-+     * camera.request.availableCapabilities.
-+     * All streams in this configuration mode operate at high speed mode and have different
-+     * characteristics and limitations to achieve high speed output. The NORMAL mode can also be
-+     * used for high speed output, if the HAL supports high speed output while satisfying all the
-+     * semantics of HAL APIs and metadata controls. It is recommended for the HAL to support high
-+     * speed output in NORMAL mode (by advertising the high speed FPS ranges in
-+     * camera.control.aeAvailableTargetFpsRanges) if possible.
-+     *
-+     * This mode has below limitations/requirements:
-+     *
-+     *   1. The HAL must support up to 2 streams with sizes reported by
-+     *       camera.control.availableHighSpeedVideoConfigurations.
-+     *   2. In this mode, the HAL is expected to output up to 120fps or higher. It must
-+     *       support the targeted FPS range and resolution configurations reported by
-+     *       camera.control.availableHighSpeedVideoConfigurations.
-+     *   3. To achieve efficient high speed streaming, the HAL may have to aggregate multiple
-+     *       frames together and send the batch to camera device for processing there the request
-+     *       controls are same for all the frames in this batch (batch mode). The HAL must
-+     *       support the max batch size. And the max batch size requirements are defined by
-+     *       camera.control.availableHighSpeedVideoConfigurations.
-+     *   4. The HAL will override {aeMode, awbMode, afMode} to {ON, ON, CONTINUOUS_VIDEO}.
-+     *       All post-processing block mode controls must be overridden to be FAST. Therefore, no
-+     *       manual control of capture and post-processing parameters is possible. All other
-+     *       controls operate the same as when camera.control.mode == AUTO.
-+     *       This means that all other camera.control.* fields must continue to work, such as
-+     *           camera.control.aeTargetFpsRange
-+     *           camera.control.aeExposureCompensation
-+     *           camera.control.aeLock
-+     *           camera.control.awbLock
-+     *           camera.control.effectMode
-+     *           camera.control.aeRegions
-+     *           camera.control.afRegions
-+     *           camera.control.awbRegions
-+     *           camera.control.afTrigger
-+     *           camera.control.aePrecaptureTrigger
-+     *       Outside of camera.control.*, the following controls must work:
-+     *           camera.flash.mode (TORCH mode only, automatic flash for still capture will not
-+     *                                           work since aeMode is ON)
-+     *           camera.lens.opticalStabilizationMode (if it is supported)
-+     *           camera.scaler.cropRegion
-+     *           camera.statistics.faceDetectMode (if it is supported)
-+     *
-+     * TODO: The high speed mode is not completely supported yet.
-+     *       1) Now the HAL supports up to 60fps@1080p.
-+     *       2) The static metadata camera.control.availableHighSpeedVideoConfigurations should be
-+     *           implemented.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED = 1,
-+
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_AUTO is a configurable mode, but not a real
-+     * mode in HAL. The user uses this mode to allow the HAL selects appropriate config mode
-+     * internally, so it should NOT be regarded as specific ConfigMode, but operation mode only.
-+     *
-+     * TuningModes used in AUTO mode depends on ConfigMode the HAL selects.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_AUTO,
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_HDR is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig HDR pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_HDR,
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_ULL is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig ULL pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_ULL,
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_HLC is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig HLC pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_HLC,
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig CUSTOM_AIC pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC,
-+
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig Video LL pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL,
-+
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE is used to select PSYS pipeline,
-+     * Create only still pipe
-+     * TuningMode and MediaCtlConfig still pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE,
-+
-+    /**
-+     * CAMERA_STREAM_CONFIGURATION_MODE_HDR2 is used to select PSYS pipeline,
-+     * TuningMode and MediaCtlConfig HDR2 pipe.
-+     */
-+    CAMERA_STREAM_CONFIGURATION_MODE_HDR2,
-+
-+    CAMERA_STREAM_CONFIGURATION_MODE_END
-+} camera_stream_configuration_mode_t;
-+
-+/***************End of Camera Basic Data Structure ****************************/
-+
-+/*******************Start of Camera Parameters Definition**********************/
-+/**
-+ * \enum camera_features: camera supportted features.
-+ */
-+typedef enum {
-+    MANUAL_EXPOSURE,       /**< Allow user to controll exposure time and ISO manually */
-+    MANUAL_WHITE_BALANCE,  /**< Allow user to controll AWB mode, cct range, and gain */
-+    IMAGE_ENHANCEMENT,     /**< Sharpness, Brightness, Contrast, Hue, Saturation */
-+    NOISE_REDUCTION,       /**< Allow user to control NR mode and NR level */
-+    SCENE_MODE,            /**< Allow user to control scene mode */
-+    WEIGHT_GRID_MODE,      /**< Allow user to control custom weight grid mode */
-+    PER_FRAME_CONTROL,     /**< Allow user to control most of parameters for each frame */
-+    ISP_CONTROL,           /**< Allow user to control low level ISP features */
-+    INVALID_FEATURE
-+} camera_features;
-+typedef std::vector<camera_features> camera_features_list_t;
-+
-+/**
-+ * \struct camera_range_t: Used to specify the range info for something like FPS.
-+ */
-+typedef struct {
-+    float min;
-+    float max;
-+} camera_range_t;
-+typedef std::vector<camera_range_t> camera_range_array_t;
-+
-+/**
-+ * \enum camera_ae_mode_t: Used to control how AE works.
-+ */
-+typedef enum {
-+    AE_MODE_AUTO,   /**< */
-+    AE_MODE_MANUAL, /**< */
-+    AE_MODE_MAX     /**< Invalid AE mode, any new mode should be added before this */
-+} camera_ae_mode_t;
-+
-+typedef enum {
-+    AE_STATE_NOT_CONVERGED,
-+    AE_STATE_CONVERGED
-+} camera_ae_state_t;
-+
-+/**
-+ * \enum camera_antibanding_mode_t: Used to control antibanding mode.
-+ */
-+typedef enum {
-+    ANTIBANDING_MODE_AUTO, /**< Auto detect the flicker frequency. */
-+    ANTIBANDING_MODE_50HZ, /**< Specify the flicker frequency to 50Hz. */
-+    ANTIBANDING_MODE_60HZ, /**< Specify the flicker frequency to 60Hz. */
-+    ANTIBANDING_MODE_OFF,  /**< Do not try to remove the flicker. */
-+} camera_antibanding_mode_t;
-+
-+/**
-+ * \enum camera_scene_mode_t: Used to control scene mode.
-+ *
-+ * Different scene mode may have different WB effects or different exposure behavior.
-+ */
-+typedef enum {
-+    SCENE_MODE_AUTO,
-+    SCENE_MODE_HDR,
-+    SCENE_MODE_ULL,
-+    SCENE_MODE_HLC,
-+    SCENE_MODE_NORMAL,
-+    SCENE_MODE_CUSTOM_AIC,
-+    SCENE_MODE_VIDEO_LL,
-+    SCENE_MODE_STILL_CAPTURE,
-+    SCENE_MODE_HDR2,
-+    SCENE_MODE_MAX
-+} camera_scene_mode_t;
-+
-+/**
-+ * \struct camera_ae_exposure_time_range_t: Provide supported exposure time range info per scene mode.
-+ */
-+typedef struct {
-+    camera_scene_mode_t scene_mode;
-+    camera_range_t et_range; /**< The exposure time range whose unit is us. */
-+} camera_ae_exposure_time_range_t;
-+
-+/**
-+ * \struct camera_ae_gain_range_t: Provide supported gain range info per scene mode.
-+ */
-+typedef struct {
-+    camera_scene_mode_t scene_mode;
-+    camera_range_t gain_range; /**< The available sensor gain range whose unit is db. */
-+} camera_ae_gain_range_t;
-+
-+/*
-+ * \enum camera_weight_grid_mode_t: Use to select which customized weight grid should be used.
-+ */
-+typedef enum {
-+    WEIGHT_GRID_AUTO,
-+    CUSTOM_WEIGHT_GRID_1,
-+    CUSTOM_WEIGHT_GRID_2,
-+    CUSTOM_WEIGHT_GRID_3,
-+    CUSTOM_WEIGHT_GRID_4,
-+    CUSTOM_WEIGHT_GRID_5,
-+    CUSTOM_WEIGHT_GRID_6,
-+    CUSTOM_WEIGHT_GRID_7,
-+    CUSTOM_WEIGHT_GRID_8,
-+    CUSTOM_WEIGHT_GRID_9,
-+    CUSTOM_WEIGHT_GRID_10,
-+    CUSTOM_WEIGHT_GRID_MAX
-+} camera_weight_grid_mode_t;
-+
-+/**
-+ * \enum camera_yuv_color_range_mode_t: Specify which YUV color range will be used.
-+ */
-+typedef enum {
-+    CAMERA_FULL_MODE_YUV_COLOR_RANGE,       /*!< Full range (0 - 255) YUV data. */
-+    CAMERA_REDUCED_MODE_YUV_COLOR_RANGE     /*!< Reduced range aka. BT.601 (16-235) YUV data range. */
-+} camera_yuv_color_range_mode_t;
-+
-+/**
-+ * \enum camera_awb_mode_t: Used to control AWB working mode.
-+ */
-+typedef enum {
-+    AWB_MODE_AUTO,
-+    AWB_MODE_INCANDESCENT,
-+    AWB_MODE_FLUORESCENT,
-+    AWB_MODE_DAYLIGHT,
-+    AWB_MODE_FULL_OVERCAST,
-+    AWB_MODE_PARTLY_OVERCAST,
-+    AWB_MODE_SUNSET,
-+    AWB_MODE_VIDEO_CONFERENCE,
-+    AWB_MODE_MANUAL_CCT_RANGE,
-+    AWB_MODE_MANUAL_WHITE_POINT,
-+    AWB_MODE_MANUAL_GAIN,
-+    AWB_MODE_MANUAL_COLOR_TRANSFORM,
-+    AWB_MODE_MAX
-+} camera_awb_mode_t;
-+
-+typedef enum {
-+    AWB_STATE_NOT_CONVERGED,
-+    AWB_STATE_CONVERGED
-+} camera_awb_state_t;
-+
-+/**
-+ * \enum camera_af_mode_t: Used to control af working mode.
-+ *
-+ * OFF:
-+ * Af algo is disabled, len position is controlled by application if supported.
-+ *
-+ * AUTO:
-+ * In this mode, the lens does not move unless the af trigger is activated.
-+ * The af algo will update af state every frame, and lock lens position when action is
-+ * completed.
-+ * The af trigger can be activated repeatedly.
-+ * Cancelling af trigger resets the lens position to default.
-+ *
-+ * MACRO:
-+ * Similar to AUTO and focus on objects very close to the camera.
-+ *
-+ * CONTINUOUS_VIDEO:
-+ * In this mode, the af algo modifies the lens position continually to
-+ * attempt to provide a constantly-in-focus image stream.
-+ * When the af trigger is activated,  af algo locks the lens position
-+ * until a cancel AF trigger is received.
-+ *
-+ * CONTINUOUS_PICTURE:
-+ * Similar to CONTINUOUS_VIDEO, except:
-+ * When the af trigger is activated, af algo can finish the current scan
-+ * before locking the lens position.
-+ *
-+ * Please refer to camera_af_trigger_t about how to trigger auto focus.
-+ * Please refer to camera_af_state_t about how to get autofocus result.
-+ */
-+typedef enum {
-+    AF_MODE_OFF,
-+    AF_MODE_AUTO,
-+    AF_MODE_MACRO,
-+    AF_MODE_CONTINUOUS_VIDEO,
-+    AF_MODE_CONTINUOUS_PICTURE,
-+    AF_MODE_MAX,
-+} camera_af_mode_t;
-+
-+/**
-+ * \enum camera_af_trigger_t: Used trigger/cancel autofocus
-+ *
-+ * When af algo is enabled and it is changed to START, the HAL will
-+ * trigger autofocus.
-+ * When it is changed to CANCEL, the HAL will cancel any active trigger.
-+ *
-+ * Generally, applications should set it to START or CANCEL for only a
-+ * single frame capture, and then return it to IDLE, to get ready for
-+ * the next action.
-+ */
-+typedef enum {
-+    AF_TRIGGER_IDLE,
-+    AF_TRIGGER_START,
-+    AF_TRIGGER_CANCEL,
-+} camera_af_trigger_t;
-+
-+/**
-+ * \enum camera_af_state_t: Used to return af state.
-+ */
-+typedef enum {
-+    AF_STATE_IDLE,               /*!< Focus is idle */
-+    AF_STATE_LOCAL_SEARCH,       /*!< Focus is in local search state */
-+    AF_STATE_EXTENDED_SEARCH,    /*!< Focus is in extended search state */
-+    AF_STATE_SUCCESS,            /*!< Focus has succeeded */
-+    AF_STATE_FAIL                /*!< Focus has failed */
-+} camera_af_state_t;
-+
-+/**
-+ * \enum camera_awb_mode_t: Used to control which preset effect will be used.
-+ */
-+typedef enum {
-+    CAM_EFFECT_NONE = 0,
-+    CAM_EFFECT_MONO,
-+    CAM_EFFECT_SEPIA,
-+    CAM_EFFECT_NEGATIVE,
-+    CAM_EFFECT_SKY_BLUE,
-+    CAM_EFFECT_GRASS_GREEN,
-+    CAM_EFFECT_SKIN_WHITEN_LOW,
-+    CAM_EFFECT_SKIN_WHITEN,
-+    CAM_EFFECT_SKIN_WHITEN_HIGH,
-+    CAM_EFFECT_VIVID,
-+} camera_effect_mode_t;
-+
-+/**
-+ * \enum camera_test_pattern_mode_t: Use to control test pattern mode.
-+ */
-+typedef enum {
-+    TEST_PATTERN_OFF = 0,
-+    SOLID_COLOR,
-+    COLOR_BARS,
-+    COLOR_BARS_FADE_TO_GRAY,
-+    PN9,
-+    TEST_PATTERN_CUSTOM1,
-+} camera_test_pattern_mode_t;
-+
-+/**
-+ * \enum camera_tonemap_mode_t: Use to control tonemap mode.
-+ */
-+typedef enum {
-+    TONEMAP_MODE_CONTRAST_CURVE,
-+    TONEMAP_MODE_FAST,
-+    TONEMAP_MODE_HIGH_QUALITY,
-+    TONEMAP_MODE_GAMMA_VALUE,
-+    TONEMAP_MODE_PRESET_CURVE,
-+} camera_tonemap_mode_t;
-+
-+/**
-+ * \enum camera_tonemap_preset_curve_t: Use to control preset curve type.
-+ */
-+typedef enum {
-+    TONEMAP_PRESET_CURVE_SRGB,
-+    TONEMAP_PRESET_CURVE_REC709,
-+} camera_tonemap_preset_curve_t;
-+
-+typedef struct {
-+    int32_t rSize;
-+    int32_t bSize;
-+    int32_t gSize;
-+    const float* rCurve;
-+    const float* bCurve;
-+    const float* gCurve;
-+} camera_tonemap_curves_t;
-+
-+/**
-+ * \enum camera_msg_type_t: Use to indicate the type of message sent.
-+ */
-+typedef enum {
-+    CAMERA_EVENT_NONE = 0,
-+    CAMERA_ISP_BUF_READY,
-+    CAMERA_DEVICE_ERROR,
-+    CAMERA_IPC_ERROR,
-+} camera_msg_type_t;
-+
-+/**
-+ * \struct Sensor RAW data info for ZSL.
-+ */
-+typedef struct {
-+    long sequence;
-+    uint64_t timestamp;
-+} sensor_raw_info_t;
-+
-+/**
-+ * \struct isp_buffer_ready_t: Use to send isp buffer ready event data.
-+ */
-+typedef struct {
-+    uint32_t frameNumber;
-+    uint64_t timestamp;
-+} isp_buffer_ready_t;
-+
-+/**
-+ * \struct camera_msg_data_t: Use to specify msg data.
-+ */
-+typedef struct {
-+    camera_msg_type_t type;
-+    union {
-+        isp_buffer_ready_t buffer_ready;
-+    } data;
-+} camera_msg_data_t;
-+
-+/**
-+ * \struct camera_callback_ops_t
-+ */
-+typedef struct camera_callback_ops {
-+    void (*notify)(const camera_callback_ops* cb, const camera_msg_data_t &data);
-+} camera_callback_ops_t;
-+
-+/**
-+ * \struct camera_awb_gains_t: Used to specify AWB gain and AWB gain shift.
-+ */
-+typedef struct {
-+    int r_gain;
-+    int g_gain;
-+    int b_gain;
-+} camera_awb_gains_t;
-+
-+/*!< camera_crop_region_t: Set crop region related parameters*/
-+typedef struct {
-+    int flag;
-+    int x;
-+    int y;
-+} camera_crop_region_t;
-+
-+/**
-+ * \struct camera_color_transform_t: Specify the color transform matrix.
-+ */
-+typedef struct {
-+    float color_transform[3][3];
-+} camera_color_transform_t;
-+
-+/**
-+ * \struct camera_color_gains_t: Specify the color correction gains.
-+ */
-+typedef struct {
-+    float color_gains_rggb[4];
-+} camera_color_gains_t;
-+
-+/**
-+ * \enum camera_nr_mode_t: Specify the noise reduction mode.
-+ */
-+typedef enum {
-+    NR_MODE_OFF,
-+    NR_MODE_AUTO,
-+    NR_MODE_MANUAL_NORMAL,
-+    NR_MODE_MANUAL_EXPERT,
-+} camera_nr_mode_t;
-+
-+/**
-+ * \struct camera_nr_level_t: Specify the noise reduction level.
-+ */
-+typedef struct {
-+    int overall;
-+    int spatial;
-+    int temporal;
-+} camera_nr_level_t;
-+
-+/**
-+ * \enum camera_iris_mode_t: Specify the IRIS mode.
-+ */
-+typedef enum {
-+    IRIS_MODE_AUTO,
-+    IRIS_MODE_MANUAL,
-+    IRIS_MODE_CUSTOMIZED,
-+} camera_iris_mode_t;
-+
-+/**
-+ * \enum camera_wdr_mode_t: Specify the WDR/HDR mode. (deprecated)
-+ */
-+typedef enum {
-+    WDR_MODE_AUTO,
-+    WDR_MODE_ON,
-+    WDR_MODE_OFF,
-+} camera_wdr_mode_t;
-+
-+/**
-+ * \enum camera_blc_area_mode_t: Switch black area mode.
-+ */
-+typedef enum {
-+    BLC_AREA_MODE_OFF,
-+    BLC_AREA_MODE_ON,
-+} camera_blc_area_mode_t;
-+
-+/**
-+ * \struct camera_window_t: Used to specify AE/AWB weighted regions.
-+ */
-+typedef struct {
-+    int left;
-+    int top;
-+    int right;
-+    int bottom;
-+    int weight;
-+} camera_window_t;
-+typedef std::vector<camera_window_t> camera_window_list_t;
-+
-+/**
-+ * \struct camera_image_enhancement_t: Used to specify the image enhancement effect.
-+ */
-+typedef struct {
-+    int sharpness;
-+    int brightness;
-+    int contrast;
-+    int hue;
-+    int saturation;
-+} camera_image_enhancement_t;
-+
-+/**
-+ * \struct camera_coordinate_t: The coordinate of a point in a specified coordinate system.
-+ */
-+typedef struct {
-+    int x;
-+    int y;
-+} camera_coordinate_t;
-+
-+/**
-+ * \struct camera_coordinate_system_t: Used to specify the coordinate system.
-+ */
-+typedef struct {
-+    int left;   /*!< Left coordinate value in the coordinate system. */
-+    int top;    /*!< Top coordinate value in the coordinate system. */
-+    int right;  /*!< Right coordinate value in the coordinate system. */
-+    int bottom; /*!< Bottom coordinate value in the coordinate system. */
-+} camera_coordinate_system_t;
-+
-+/**
-+ * \struct camera_rational_t: Used to present a rational.
-+ */
-+typedef struct {
-+    int numerator;
-+    int denominator;
-+} camera_rational_t;
-+
-+/**
-+ * \struct camera_awb_result_t: Present AWB result.
-+ */
-+typedef struct {
-+    float r_per_g; /*!< Accurate White Point (R) for the image: relative value*/
-+    float b_per_g; /*!< Accurate White Point (B) for the image. relative value*/
-+} camera_awb_result_t;
-+
-+/**
-+ * \enum camera_converge_speed_t: Used to control AE/AWB converge speed.
-+ */
-+typedef enum {
-+    CONVERGE_NORMAL,
-+    CONVERGE_MID,
-+    CONVERGE_LOW,
-+    CONVERGE_MAX
-+} camera_converge_speed_t;
-+
-+/**
-+ * \enum camera_converge_speed_mode_t: Used to control AE/AWB converge speed mode.
-+ */
-+typedef enum {
-+    CONVERGE_SPEED_MODE_AIQ, /*!< Use AIQ Aglo to control converge speed. */
-+    CONVERGE_SPEED_MODE_HAL  /*!< Implement converge speed control in HAL. */
-+} camera_converge_speed_mode_t;
-+
-+/**
-+ * \enum camera_ae_distribution_priority_t: Used to control exposure priority mode.
-+ */
-+typedef enum {
-+    DISTRIBUTION_AUTO,    /*!< The AIQ Aglo decides completely */
-+    DISTRIBUTION_SHUTTER, /*!< Shutter speed priority mode */
-+    DISTRIBUTION_ISO,     /*!< ISO priority mode */
-+    DISTRIBUTION_APERTURE /*!< Aperture priority mode */
-+} camera_ae_distribution_priority_t;
-+
-+/**
-+ * \enum camera_deinterlace_mode_t: Used to control the deinterlace mode.
-+ */
-+typedef enum {
-+    DEINTERLACE_OFF,    /*!< Do not do any deinterlace */
-+    DEINTERLACE_WEAVING /*!< Weave the two frame buffers into one. */
-+} camera_deinterlace_mode_t;
-+
-+/**
-+ * \enum camera_fisheye_dewarping_mode_t: Used to control the dewarping mode.
-+ */
-+typedef enum {
-+    FISHEYE_DEWARPING_OFF,
-+    FISHEYE_DEWARPING_REARVIEW,
-+    FISHEYE_DEWARPING_HITCHVIEW
-+} camera_fisheye_dewarping_mode_t;
-+
-+/**
-+ * \enum camera_makernote_mode_t: Used to control makernote mode.
-+ */
-+typedef enum {
-+    MAKERNOTE_MODE_OFF,
-+    MAKERNOTE_MODE_JPEG,
-+    MAKERNOTE_MODE_RAW
-+} camera_makernote_mode_t;
-+
-+/**
-+ * \enum camera_ldc_mode_t: Used to toggle lens distortion correction.
-+ */
-+typedef enum {
-+    LDC_MODE_OFF,
-+    LDC_MODE_ON
-+} camera_ldc_mode_t;
-+
-+/**
-+ * \enum camera_rsc_mode_t: Used to toggle rolling shutter correction.
-+ */
-+typedef enum {
-+    RSC_MODE_OFF,
-+    RSC_MODE_ON
-+} camera_rsc_mode_t;
-+
-+/**
-+ * \enum camera_flip_mode_t: Used to set output slip.
-+ */
-+typedef enum {
-+    FLIP_MODE_NONE = 0,
-+    FLIP_MODE_VFLIP,
-+    FLIP_MODE_HFLIP,
-+    FLIP_MODE_VHFLIP
-+} camera_flip_mode_t;
-+
-+/**
-+ * \enum camera_mono_downscale_mode_t: Used to enable/disable MONO Downscale.
-+ */
-+typedef enum {
-+    MONO_DS_MODE_OFF,
-+    MONO_DS_MODE_ON
-+} camera_mono_downscale_mode_t;
-+
-+/**
-+ * \enum camera_video_stabilization_mode_t: Used to control the video stabiliztion mode.
-+ */
-+typedef enum {
-+    VIDEO_STABILIZATION_MODE_OFF,
-+    VIDEO_STABILIZATION_MODE_ON
-+} camera_video_stabilization_mode_t;
-+typedef std::vector<camera_video_stabilization_mode_t> camera_video_stabilization_list_t;
-+
-+/**
-+ * \enum camera_mount_type_t: camera mount type
-+ */
-+typedef enum {
-+    WALL_MOUNTED,
-+    CEILING_MOUNTED,
-+} camera_mount_type_t;
-+
-+/**
-+* \enum camera_shading_mode_t: camera shading mode type
-+*/
-+typedef enum {
-+    SHADING_MODE_OFF,
-+    SHADING_MODE_FAST,
-+    SHADING_MODE_HIGH_QUALITY
-+} camera_shading_mode_t;
-+
-+#define MAX_LSC_GRID_WIDTH 64
-+#define MAX_LSC_GRID_HEIGHT 64
-+#define MAX_LSC_GRID_SIZE (MAX_LSC_GRID_WIDTH * MAX_LSC_GRID_HEIGHT)
-+
-+/**
-+* \enum camera_lens_shading_map_mode_type_t: camera lens shading map mode type
-+*/
-+typedef enum {
-+    LENS_SHADING_MAP_MODE_OFF,
-+    LENS_SHADING_MAP_MODE_ON
-+} camera_lens_shading_map_mode_type_t;
-+
-+/**
-+ * \class Parameters
-+ *
-+ * \brief
-+ *   Manage parameter's data structure, and provide set and get parameters
-+ *
-+ * This class provides a thread safe management to internal parameter's data
-+ * structure, and helps client to easily set parameters to and get parameters
-+ * from camera device.
-+ *
-+ * \version 0.1
-+ *
-+ */
-+class Parameters {
-+public:
-+    Parameters();
-+    Parameters(const Parameters& other);
-+    Parameters& operator=(const Parameters& other);
-+    ~Parameters();
-+    /**
-+     * \brief Merge and update current parameter with other
-+     *
-+     * \param[in] Parameters other: parameter source
-+     *
-+     * \return void
-+     */
-+    void merge(const Parameters& other);
-+
-+    // Belows are camera capability related parameters operations
-+    /**
-+     * \brief Get supported fps range list
-+     *
-+     * \param[out] camera_range_array_t& ranges
-+     *
-+     * \return 0 if fps range supported, otherwise non-0 value is returned.
-+     */
-+    int getSupportedFpsRange(camera_range_array_t& ranges) const;
-+
-+    /**
-+     * \brief Get supported Stream Config list
-+     *
-+     * \param[out] supported_stream_config_array_t& config
-+     *
-+     * \return 0 if Stream Configs supported, otherwise non-0 value is returned.
-+     */
-+    int getSupportedStreamConfig(supported_stream_config_array_t& config) const;
-+
-+    // Belows are camera capability related parameters operations
-+    /**
-+     * \brief Get supported sensor exposure time range (microsecond)
-+     *
-+     * \param[out] camera_range_t& range
-+     *
-+     * \return 0 if it is supported, otherwise non-0 value is returned.
-+     */
-+    int getSupportedSensorExposureTimeRange(camera_range_t& range) const;
-+
-+    // Belows are camera capability related parameters operations
-+    /**
-+     * \brief Get supported sensor sensitivity time range
-+     *
-+     * \param[out] camera_range_t& range
-+     *
-+     * \return 0 if it is supported, otherwise non-0 value is returned.
-+     */
-+    int getSupportedSensorSensitivityRange(camera_range_t& range) const;
-+
-+    /**
-+     * \brief Get supported feature list.
-+     *
-+     * Camera application MUST check if the feature is supported before trying to enable it.
-+     * Otherwise the behavior is undefined currently, HAL may just ignore the request.
-+     *
-+     * \param[out] camera_features_list_t& features: All supported feature will be filled in "features"
-+     *
-+     * \return: If no feature supported, features will be empty
-+     */
-+    int getSupportedFeatures(camera_features_list_t& features) const;
-+
-+    /**
-+     * \brief Get ae compensation range supported by camera device
-+     *
-+     * \param[out] camera_range_t& evRange
-+     *
-+     * \return 0 if ae compensation supported, non-0 or evRange equals [0, 0] means ae compensation not supported.
-+     */
-+    int getAeCompensationRange(camera_range_t& evRange) const;
-+
-+    /**
-+     * \brief Get ae compensation step supported by camera device
-+     *
-+     * Smallest step by which the exposure compensation can be changed.
-+     * This is the unit for setAeCompensation. For example, if this key has
-+     * a value of `1/2`, then a setting of `-2` for setAeCompensation means
-+     * that the target EV offset for the auto-exposure routine is -1 EV.
-+     *
-+     * One unit of EV compensation changes the brightness of the captured image by a factor
-+     * of two. +1 EV doubles the image brightness, while -1 EV halves the image brightness.
-+     *
-+     * \param[out] camera_rational_t& evStep
-+     *
-+     * \return 0 if ae compensation supported, non-0 means ae compensation not supported.
-+     */
-+    int getAeCompensationStep(camera_rational_t& evStep) const;
-+
-+    /**
-+     * \brief Get supported manual exposure time range
-+     *
-+     * Different sensors or same sensor in different settings may have different supported exposure
-+     * time range, so camera application needs to use this API to check if the user's settings is
-+     * in the supported range, if application pass an out of exposure time, HAL will clip it
-+     * according to this supported range.
-+     *
-+     * \param[out] vector<camera_ae_exposure_time_range_t>& etRanges
-+     *
-+     * \return 0 if exposure time range is filled by HAL.
-+     */
-+    int getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t>& etRanges) const;
-+
-+    /**
-+     * \brief Get supported manual sensor gain range
-+     *
-+     * Different sensors or same sensor in different settings may have different supported sensor
-+     * gain range, so camera application needs to use this API to check if the user's settings is
-+     * in the supported range, if application pass an out of range gain, HAL will clip it according
-+     * to this supported range.
-+     *
-+     * \param[out] vector<camera_ae_gain_range_t>& gainRanges
-+     *
-+     * \return 0 if exposure time range is filled by HAL.
-+     */
-+    int getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const;
-+
-+    // Belows are AE related parameters operations
-+    /**
-+     * \brief Set exposure mode(auto/manual).
-+     *
-+     * "auto" means 3a algorithm will control exposure time and gain automatically.
-+     * "manual" means user can control exposure time or gain, or both of them.
-+     * Under manual mode, if user only set one of exposure time or gain, then 3a algorithm
-+     * will help to calculate the other one.
-+     *
-+     * \param[in] camera_ae_mode_t aeMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeMode(camera_ae_mode_t aeMode);
-+
-+    /**
-+     * \brief Get exposure mode
-+     *
-+     * \param[out] aeMode: Currently used ae mode will be set to aeMode if 0 is returned.
-+     *
-+     * \return 0 if exposure mode was set, otherwise non-0 value is returned.
-+     */
-+    int getAeMode(camera_ae_mode_t& aeMode) const;
-+
-+    /**
-+     * \brief Set AE state.
-+     *
-+     * \param[in] camera_ae_state_t aeState
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeState(camera_ae_state_t aeState);
-+
-+    /**
-+     * \brief Get AE state
-+     *
-+     * \param[out] aeState: Currently AE state will be set to aeState if 0 is returned.
-+     *
-+     * \return 0 if AE state was set, otherwise non-0 value is returned.
-+     */
-+    int getAeState(camera_ae_state_t& aeState) const;
-+
-+    /**
-+     * \brief Set ae lock
-+     *
-+     * \param[in] bool lock
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeLock(bool lock);
-+
-+    /**
-+     * \brief Get ae lock
-+     *
-+     * \param[out] bool lock
-+     *
-+     * \return 0 if lock was set, otherwise non-0 value is returned.
-+     */
-+    int getAeLock(bool& lock) const;
-+
-+    /**
-+     * \brief Get supported video stabilization mode
-+     *
-+     * Camera application MUST check if the video stabilization mode is supported before trying
-+     * to enable it. Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedModes: All supported video stabilization mode will be filled in "supportedModes"
-+     *
-+     * \return: If no mode supported, supportedModes will be empty
-+     */
-+    int getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const;
-+
-+    /**
-+     * \brief Get supported ae mode
-+     *
-+     * Camera application MUST check if the ae mode is supported before trying to enable it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedAeModes: All supported ae mode will be filled in "supportedAeModes"
-+     *
-+     * \return: If no ae mode supported, supportedAeModes will be empty
-+     */
-+    int getSupportedAeMode(std::vector<camera_ae_mode_t> &supportedAeModes) const;
-+
-+    /**
-+     * \brief Get supported awb mode
-+     *
-+     * Camera application MUST check if the awb mode is supported before trying to enable it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedAwbModes: All supported awb mode will be filled in "supportedAwbModes"
-+     *
-+     * \return: If no awb mode supported, supportedAwbModes will be empty
-+     */
-+    int getSupportedAwbMode(std::vector<camera_awb_mode_t> &supportedAwbModes) const;
-+
-+    /**
-+     * \brief Get supported af mode
-+     *
-+     * Camera application MUST check if the af mode is supported before trying to enable it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedAfModes: All supported af mode will be filled in "supportedAfModes"
-+     *
-+     * \return: If no af mode supported, supportedAfModes will be empty
-+     */
-+    int getSupportedAfMode(std::vector<camera_af_mode_t> &supportedAfModes) const;
-+
-+    /**
-+     * \brief Get supported scene mode
-+     *
-+     * Camera application MUST check if the scene mode is supported before trying to enable it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedSceneModes: All supported scene mode will be filled in "supportedSceneModes"
-+     *
-+     * \return: If no scene mode supported, supportedSceneModes will be empty
-+     */
-+    int getSupportedSceneMode(std::vector<camera_scene_mode_t> &supportedSceneModes) const;
-+
-+    /**
-+     * \brief Get supported antibanding mode
-+     *
-+     * Camera application MUST check if the antibanding mode is supported before trying to enable it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \param[out] supportedAntibindingModes: All supported scene mode will be filled in "supportedAntibindingModes"
-+     *
-+     * \return: If no antibanding mode supported, supportedAntibindingModes will be empty
-+     */
-+    int getSupportedAntibandingMode(std::vector<camera_antibanding_mode_t> &supportedAntibindingModes) const;
-+
-+    /**
-+     * \brief Get if ae lock is available
-+     *
-+     * Camera application MUST check if ae lock is supported before trying to lock it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \return: true if lock is supported, false if not
-+     */
-+    bool getAeLockAvailable() const;
-+
-+    /**
-+     * \brief Get if awb lock is available
-+     *
-+     * Camera application MUST check if awb lock is supported before trying to lock it.
-+     * Otherwise one error occuring, HAL may just ignore the request.
-+     *
-+     * \return: true if lock is supported, false if not
-+     */
-+    bool getAwbLockAvailable() const;
-+
-+    /**
-+     * \brief Set AE region
-+     *
-+     * Current only fisrt region can take effect when BLC mode is BLC_AREA_MODE_ON;
-+     * if BLC_AREA_MODE_OFF, AE region function will be diabled.
-+     *
-+     * \param[in] camera_window_list_t aeRegions
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeRegions(camera_window_list_t aeRegions);
-+
-+    /**
-+     * \brief Get AE region
-+     *
-+     * \param[out] camera_window_list_t aeRegions
-+     *
-+     * \return 0 if aeRegions were set, otherwise non-0 value is returned.
-+     */
-+    int getAeRegions(camera_window_list_t& aeRegions) const;
-+
-+    /**
-+     * \brief Set exposure time whose unit is microsecond(us).
-+     *
-+     * The exposure time only take effect when ae mode set to manual.
-+     *
-+     * \param[in] int64_t exposureTime
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setExposureTime(int64_t exposureTime);
-+
-+    /**
-+     * \brief Get exposure time whose unit is microsecond(us).
-+     *
-+     * \param[out] int64_t& exposureTime: exposure time if be set in exposureTime if 0 is returned.
-+     *
-+     * \return 0 if exposure time was set, non-0 means no exposure time was set.
-+     */
-+    int getExposureTime(int64_t& exposureTime) const;
-+
-+    /**
-+     * \brief Set sensor gain whose unit is db.
-+     * The sensor gain only take effect when ae mode set to manual.
-+     *
-+     * \param[in] float gain
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setSensitivityGain(float gain);
-+
-+    /**
-+     * \brief Get sensor gain whose unit is db.
-+     *
-+     * \param[out] float gain
-+     *
-+     * \return 0 if sensor gain was set, non-0 means no sensor gain was set.
-+     */
-+    int getSensitivityGain(float& gain) const;
-+
-+    /**
-+     * \brief Set ae compensation whose unit is compensation step.
-+     *
-+     * The adjustment is measured as a count of steps, with the
-+     * step size defined ae compensation step and the allowed range by ae compensation range.
-+     *
-+     * For example, if the exposure value (EV) step is 0.333, '6'
-+     * will mean an exposure compensation of +2 EV; -3 will mean an
-+     * exposure compensation of -1 EV. One EV represents a doubling of image brightness.
-+     *
-+     * In the event of exposure compensation value being changed, camera device
-+     * may take several frames to reach the newly requested exposure target.
-+     *
-+     * \param[in] int ev
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeCompensation(int ev);
-+
-+    /**
-+     * \brief Get ae compensation whose unit is compensation step.
-+     *
-+     * \param[out] int ev
-+     *
-+     * \return 0 if ae compensation was set, non-0 means no ae compensation was set.
-+     */
-+    int getAeCompensation(int& ev) const;
-+
-+    /**
-+     * \brief Set frame rate
-+     *
-+     * \param[in] float fps
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setFrameRate(float fps);
-+
-+    /**
-+     * \brief Get frame rate
-+     *
-+     * \param[out] float& fps
-+     *
-+     * \return 0 if frame rate was set, otherwise non-0 value is returned.
-+     */
-+    int getFrameRate(float& fps) const;
-+
-+    /**
-+     * \brief Set antibanding mode
-+     *
-+     * \param[in] camera_antibanding_mode_t bandingMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAntiBandingMode(camera_antibanding_mode_t bandingMode);
-+
-+    /**
-+     * \brief Get antibanding mode
-+     *
-+     * \param[out] camera_antibanding_mode_t& bandingMode
-+     *
-+     * \return 0 if antibanding mode was set, otherwise non-0 value is returned.
-+     */
-+    int getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const;
-+
-+    /**
-+     * \brief Set AE distribution priority.
-+     *
-+     * \param[in] camera_ae_distribution_priority_t priority: the AE distribution priority to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeDistributionPriority(camera_ae_distribution_priority_t priority);
-+
-+    /**
-+     * \brief Get AE distribution priority.
-+     *
-+     * \param[out] camera_ae_distribution_priority_t priority: the AE distribution priority.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const;
-+
-+    /**
-+     * \brief set exposure time range
-+     *
-+     * \param[in] camera_range_t: the exposure time range to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setExposureTimeRange(camera_range_t exposureTimeRange);
-+
-+    /**
-+     * \brief get exposure time range
-+     *
-+     * \param[out] camera_range_t: the exposure time had been set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getExposureTimeRange(camera_range_t& exposureTimeRange) const;
-+
-+    /**
-+     * \brief set sensitivity gain range
-+     *
-+     * \param[in] camera_range_t: the sensitivity gain range(the unit is db) to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setSensitivityGainRange(camera_range_t sensitivityGainRange);
-+
-+    /**
-+     * \brief get sensitivity gain range
-+     *
-+     * \param[out] camera_range_t: the sensitivity gain(the unit is db) had been set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getSensitivityGainRange(camera_range_t& sensitivityGainRange) const;
-+
-+    /**
-+     * \brief Set weight grid mode
-+     *
-+     * \param[in] camera_weight_grid_mode_t weightGridMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setWeightGridMode(camera_weight_grid_mode_t weightGridMode);
-+
-+    /**
-+     * \brief Get weight grid mode
-+     *
-+     * \param[out] camera_weight_grid_mode_t& weightGridMode
-+     *
-+     * \return 0 if weight grid mode was set, otherwise non-0 value is returned.
-+     */
-+    int getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const;
-+
-+    /**
-+     * \brief Set BLC (backlight compensation) area mode
-+     *
-+     * \param[in] camera_blc_area_mode_t blcAreaMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setBlcAreaMode(camera_blc_area_mode_t blcAreaMode);
-+
-+    /**
-+     * \brief Get BLC (backlight compensation) area mode
-+     *
-+     * \param[out] camera_blc_area_mode_t& blcAreaMode
-+     *
-+     * \return 0 if BLC area mode was set, otherwise non-0 value is returned.
-+     */
-+    int getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const;
-+
-+    int setFpsRange(camera_range_t fpsRange);
-+    int getFpsRange(camera_range_t& fpsRange) const;
-+
-+    // Belows are AWB related parameters operations
-+    /**
-+     * \brief Set white balance mode
-+     *
-+     * White balance mode could be one of totally auto, preset cct range, customized cct range, customized
-+     * white area, customize gains.
-+     *
-+     * \param[in] camera_awb_mode_t awbMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbMode(camera_awb_mode_t awbMode);
-+
-+    /**
-+     * \brief Get white balance mode currently used.
-+     *
-+     * \param[out] camera_awb_mode_t& awbMode
-+     *
-+     * \return 0 if awb mode was set, non-0 means no awb mode was set.
-+     */
-+    int getAwbMode(camera_awb_mode_t& awbMode) const;
-+
-+    /**
-+     * \brief Set AWB state.
-+     *
-+     * \param[in] camera_awb_state_t awbState
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbState(camera_awb_state_t awbState);
-+
-+    /**
-+     * \brief Get AWB state
-+     *
-+     * \param[out] awbState: Currently AWB state will be set to awbState if 0 is returned.
-+     *
-+     * \return 0 if AWB state was set, otherwise non-0 value is returned.
-+     */
-+    int getAwbState(camera_awb_state_t& awbState) const;
-+
-+    /**
-+     * \brief Set awb lock
-+     *
-+     * \param[in] bool lock
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbLock(bool lock);
-+
-+    /**
-+     * \brief Get awb lock
-+     *
-+     * \param[out] bool lock
-+     *
-+     * \return 0 if lock was set, otherwise non-0 value is returned.
-+     */
-+    int getAwbLock(bool& lock) const;
-+
-+    /**
-+     * \brief Set customized cct range.
-+     *
-+     * Customized cct range only take effect when awb mode is set to AWB_MODE_MANUAL_CCT_RANGE
-+     *
-+     * \param[in] camera_range_t cct range, which specify min and max cct for 3a algorithm to use.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbCctRange(camera_range_t cct);
-+
-+    /**
-+     * \brief Get customized cct range currently used.
-+     *
-+     * \param[out] camera_range_t& cct range
-+     *
-+     * \return 0 if cct range was set, non-0 means no cct range was set.
-+     */
-+    int getAwbCctRange(camera_range_t& cct) const;
-+
-+    /**
-+     * \brief Set customized awb gains.
-+     *
-+     * Customized awb gains only take effect when awb mode is set to AWB_MODE_MANUAL_GAIN
-+     *
-+     * The range of each gain is (0, 255).
-+     *
-+     * \param[in] camera_awb_gains_t awb gains, which specify r,g,b gains for overriding awb result.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbGains(camera_awb_gains_t awbGains);
-+
-+    /**
-+     * \brief Get customized awb gains currently used.
-+     *
-+     * \param[out] camera_awb_gains_t& awb gains
-+     *
-+     * \return 0 if awb gain was set, non-0 means no awb gain was set.
-+     */
-+    int getAwbGains(camera_awb_gains_t& awbGains) const;
-+
-+    /**
-+     * \brief Set awb gain shift.
-+     *
-+     * Customized awb gain shift only take effect when awb mode is NOT set to AWB_MODE_MANUAL_GAIN
-+     *
-+     * The range of each gain shift is (0, 255).
-+     *
-+     * \param[in] camera_awb_gains_t awb gain shift, which specify r,g,b gains for updating awb result.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbGainShift(camera_awb_gains_t awbGainShift);
-+
-+    /**
-+     * \brief Get customized awb gains shift currently used.
-+     *
-+     * \param[out] camera_awb_gains_t& awb gain shift
-+     *
-+     * \return 0 if awb gain shift was set, non-0 means no awb gain shift was set.
-+     */
-+    int getAwbGainShift(camera_awb_gains_t& awbGainShift) const;
-+
-+    /**
-+     * \brief Set awb result.
-+     *
-+     * \param[in] data: The data used to override awb result.
-+     *
-+     * Note: data is allocated by the caller and NULL is for erasing the param.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbResult(void *data);
-+
-+    /**
-+     * \brief Get awb result currently used.
-+     *
-+     * \param[out] data: the awb result pointer to user
-+     *
-+     * Note: data is allocated by the caller and it must never be NULL.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAwbResult(void *data) const;
-+
-+    /**
-+     * \brief Set manual white point coordinate.
-+     *
-+     * Only take effect when awb mode is set to AWB_MODE_MANUAL_WHITE_POINT.
-+     * The coordinate system is based on frame which is currently displayed.
-+     *
-+     * \param[in] camera_coordinate_t white point
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbWhitePoint(camera_coordinate_t whitePoint);
-+
-+    /**
-+     * \brief Get manual white point coordinate.
-+     *
-+     * \param[out] camera_coordinate_t& white point
-+     *
-+     * \return 0 if white point was set, non-0 means no white point was set.
-+     */
-+    int getAwbWhitePoint(camera_coordinate_t& whitePoint) const;
-+
-+    /**
-+     * \brief Set customized color transform which is a 3x3 matrix.
-+     *
-+     *  Manual color transform only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
-+     *
-+     * \param[in] camera_color_transform_t colorTransform: a 3x3 matrix for color convertion.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setColorTransform(camera_color_transform_t colorTransform);
-+
-+    /**
-+     * \brief Get color transform matrix currently used.
-+     *
-+     * \param[out] camera_color_transform_t& color transform matrix
-+     *
-+     * \return 0 if color transform matrix was set, non-0 means no color transform matrix was set.
-+     */
-+    int getColorTransform(camera_color_transform_t& colorTransform) const;
-+
-+    /**
-+     * \brief Set customized color correction gains which is a 4 array.
-+     *
-+     *  Manual color correction gains only takes effect when awb mode set to AWB_MODE_MANUAL_COLOR_TRANSFORM.
-+     *
-+     * \param[in] camera_color_gains_t colorGains: a 4 array for color correction gains.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setColorGains(camera_color_gains_t colorGains);
-+    /**
-+     * \brief Get color correction gains currently used.
-+     *
-+     * \param[out] camera_color_gains_t& color correction gains
-+     *
-+     * \return 0 if color correction gains was set, non-0 means no color correction gains was set.
-+     */
-+    int getColorGains(camera_color_gains_t& colorGains) const;
-+
-+    int setAwbRegions(camera_window_list_t awbRegions);
-+    int getAwbRegions(camera_window_list_t& awbRegions) const;
-+
-+    // Belows are convergence speed related parameters operations
-+    /**
-+     * \brief Set customized Ae converge speed.
-+     *
-+     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeConvergeSpeed(camera_converge_speed_t speed);
-+
-+    /**
-+     * \brief Get customized Ae converge speed.
-+     *
-+     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAeConvergeSpeed(camera_converge_speed_t& speed) const;
-+
-+    /**
-+     * \brief Set customized Awb converge speed.
-+     *
-+     * \param[in] camera_converge_speed_t speed: the converge speed to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbConvergeSpeed(camera_converge_speed_t speed);
-+
-+    /**
-+     * \brief Get customized Awb converge speed.
-+     *
-+     * \param[out] camera_converge_speed_t& speed: the converge speed been set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAwbConvergeSpeed(camera_converge_speed_t& speed) const;
-+
-+    /**
-+     * \brief Set customized Ae converge speed mode.
-+     *
-+     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAeConvergeSpeedMode(camera_converge_speed_mode_t mode);
-+
-+    /**
-+     * \brief Get customized Ae converge speed mode.
-+     *
-+     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
-+
-+    /**
-+     * \brief Set customized Awb converge speed mode.
-+     *
-+     * \param[in] camera_converge_speed_mode_t mode: the converge speed mode to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode);
-+
-+    /**
-+     * \brief Get customized Awb converge speed mode.
-+     *
-+     * \param[out] camera_converge_speed_mode_t mode: the converge speed mode to be set.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const;
-+
-+    // Belows are ISP related parameters operations
-+    int setNrMode(camera_nr_mode_t nrMode);
-+    int getNrMode(camera_nr_mode_t& nrMode) const;
-+
-+    int setNrLevel(camera_nr_level_t level);
-+    int getNrLevel(camera_nr_level_t& level) const;
-+
-+    /**
-+     * \brief Set YUV color range mode
-+     *
-+     * \param[in] camera_yuv_color_range_mode_t colorRange: the YUV color range mode to be set.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange);
-+
-+    /**
-+     * \brief Get YUV color range mode
-+     *
-+     * \param[out] camera_yuv_color_range_mode_t colorRange: the YUV color range mode.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getYuvColorRangeMode(camera_yuv_color_range_mode_t & colorRange) const;
-+
-+    /**
-+     * \brief Set customized effects.
-+     *
-+     * One of sharpness, brightness, contrast, hue, saturation could be controlled by this API.
-+     * Valid range should be [-128, 127]
-+     *
-+     * \param[in] camera_image_enhancement_t effects
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setImageEnhancement(camera_image_enhancement_t effects);
-+
-+    /**
-+     * \brief Get customized effects.
-+     *
-+     * \param[out] effects
-+     *
-+     * \return 0 if effects was set, non-0 return value means no effects was set.
-+     */
-+    int getImageEnhancement(camera_image_enhancement_t& effects) const;
-+
-+    // Belows are other parameters operations
-+    int setIrisMode(camera_iris_mode_t irisMode);
-+    int getIrisMode(camera_iris_mode_t& irisMode);
-+
-+    int setIrisLevel(int level);
-+    int getIrisLevel(int& level);
-+
-+    /**
-+     * \brief Set WDR Level
-+     *
-+     * \param[in] uint8_t level
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setWdrLevel(uint8_t level);
-+
-+    /**
-+     * \brief Get WDR level currently used.
-+     *
-+     * \param[out] uint8_t& level
-+     *
-+     * \return 0 if get WDR level, non-0 means error.
-+     */
-+    int getWdrLevel(uint8_t& level) const;
-+
-+    /**
-+     * \brief Set effect scene mode
-+     *
-+     * \param[in] camera_scene_mode_t: scene mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setEffectSceneMode(camera_scene_mode_t sceneMode);
-+
-+    /**
-+     * \brief Get effect scene mode based on runtime
-+     *
-+     * \param[out] camera_scene_mode_t&: scene mode
-+     *
-+     * \return 0 if get scene mode, non-0 means error.
-+     */
-+    int getEffectSceneMode(camera_scene_mode_t& sceneMode) const;
-+
-+    /**
-+     * \brief Set scene mode
-+     *
-+     * \param[in] camera_scene_mode_t: scene mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setSceneMode(camera_scene_mode_t sceneMode);
-+
-+    /**
-+     * \brief Get scene mode current set by user.
-+     *
-+     * \param[out] camera_scene_mode_t&: scene mode
-+     *
-+     * \return 0 if get scene mode, non-0 means error.
-+     */
-+    int getSceneMode(camera_scene_mode_t& sceneMode) const;
-+
-+    /**
-+     * \brief Set deinterlace mode
-+     *
-+     * \param[in] camera_deinterlace_mode_t deinterlaceMode
-+     *
-+     * Setting deinterlace mode only takes effect before camera_device_config_streams called
-+     * That's it cannot be changed after camera_device_config_streams.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode);
-+
-+    /**
-+     * \brief Get deinterlace mode
-+     *
-+     * \param[out] camera_deinterlace_mode_t& deinterlaceMode
-+     *
-+     * \return 0 if deinterlace mode was set, non-0 means no deinterlace mode was set.
-+     */
-+    int getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const;
-+
-+    /**
-+     * \brief Set Makernote Data
-+     *
-+     * \param[in] const void* data: the pointer of data.
-+     * \param[in] unsigned int size: the size of the data.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setMakernoteData(const void* data, unsigned int size);
-+
-+    /**
-+     * \brief Get Makernote Data
-+     *
-+     * \param[out] void* data: the pointer of destination buffer.
-+     * \param[in/out] in: the buffer size; out: the buffer used size.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getMakernoteData(void* data, unsigned int* size) const;
-+
-+    /**
-+     * \brief Set Custom Aic Param
-+     *
-+     * \param[in] const void* data: the pointer of data.
-+     * \param[in] int length: the length of the data.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setCustomAicParam(const void* data, unsigned int length);
-+
-+    /**
-+     * \brief Get Custom Aic Param
-+     *
-+     * \param[out] void* data: the pointer of destination buffer.
-+     * \param[in/out] in: the buffer size; out: the buffer used size.
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int getCustomAicParam(void* data, unsigned int* length) const;
-+
-+    /**
-+     * \brief Set makernote mode
-+     *
-+     * \param[in] camera_makernote_mode_t mode
-+     *
-+     * \return 0 if get successfully, otherwise non-0 value is returned.
-+     */
-+    int setMakernoteMode(camera_makernote_mode_t mode);
-+
-+    /**
-+     * \brief get makernote mode
-+     *
-+     * \param[out] camera_makernote_mode_t &mode
-+     *
-+     * \return 0 if makernote mode was set, otherwise return non-0 value.
-+     */
-+    int getMakernoteMode(camera_makernote_mode_t &mode) const;
-+
-+    /**
-+     * \brief Set digital zoom ratio
-+     *
-+     * \param[in] float ratio
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setDigitalZoomRatio(float ratio);
-+
-+    /**
-+     * \brief Get digital zoom ratio
-+     *
-+     * \param[out] float& ratio
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getDigitalZoomRatio(float& ratio) const;
-+
-+    /**
-+     * \brief Set lens distortion correction mode
-+     *
-+     * \param[in] camera_ldc_mode_t mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setLdcMode(camera_ldc_mode_t mode);
-+
-+    /**
-+     * \brief Get lens distortion correction mode
-+     *
-+     * \param[out] camera_ldc_mode_t& mode
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getLdcMode(camera_ldc_mode_t &mode) const;
-+
-+    /**
-+     * \brief Set rolling shutter correction mode
-+     *
-+     * \param[in] camera_rsc_mode_t mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setRscMode(camera_rsc_mode_t mode);
-+
-+    /**
-+     * \brief Get rolling shutter correction mode
-+     *
-+     * \param[out] camera_rsc_mode_t& mode
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getRscMode(camera_rsc_mode_t &mode) const;
-+
-+    /**
-+     * \brief flip mode
-+     *
-+     * \param[in] camera_flip_mode_t mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setFlipMode(camera_flip_mode_t mode);
-+
-+    /**
-+     * \brief Get flip mode
-+     *
-+     * \param[out] camera_flip_mode_t& mode
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getFlipMode(camera_flip_mode_t &mode) const;
-+
-+    /**
-+     * \brief set frame interval to run 3A
-+     *
-+     * \param[in] int cadence which is frame interval
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setRun3ACadence(int cadence);
-+
-+    /**
-+     * \brief Get frame interval to run 3A
-+     *
-+     * \param[out] int& cadence which is frame interval
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getRun3ACadence(int &cadence) const;
-+
-+    /**
-+     * \brief mono downscale mode
-+     *
-+     * \param[in] camera_mono_downscale_mode_t mode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setMonoDsMode(camera_mono_downscale_mode_t mode);
-+
-+    /**
-+     * \brief Get mono downscale mode
-+     *
-+     * \param[out] camera_mono_downscale_mode_t& mode
-+     *
-+     * \return 0 if find the corresponding data, otherwise non-0 value is returned.
-+     */
-+    int getMonoDsMode(camera_mono_downscale_mode_t &mode) const;
-+
-+    /**
-+     * \brief Set Fisheye Dewarping Mode
-+     *
-+     * \param[in] camera_fisheye_dewarping_mode_t dewarpingMode
-+     *
-+     * Setting dewarping mode only takes effect before camera_device_config_streams called
-+     * That's it cannot be changed after camera_device_config_streams.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t dewarpingMode);
-+
-+    /**
-+     * \brief Get Fisheye Dewarping Mode
-+     *
-+     * \param[out] camera_fisheye_dewarping_mode_t &dewarpingMode
-+     *
-+     * \return 0 if dewarping mode was set, non-0 means no dewarping mode was set.
-+     */
-+    int getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &dewarpingMode) const;
-+
-+    // Belows are Jpeg related parameters operations
-+    int getJpegQuality(uint8_t *quality) const;
-+    int setJpegQuality(uint8_t quality);
-+
-+    int getJpegThumbnailQuality(uint8_t *quality) const;
-+    int setJpegThumbnailQuality(uint8_t quality);
-+
-+    int setJpegThumbnailSize(const camera_resolution_t& res);
-+    int getJpegThumbnailSize(camera_resolution_t& res) const;
-+
-+    int getJpegRotation(int &rotation) const;
-+    int setJpegRotation(int  rotation);
-+
-+    int setJpegGpsCoordinates(const double *coordinates);
-+    int getJpegGpsLatitude(double &latitude) const;
-+    int getJpegGpsLongitude(double &longitude) const;
-+    int getJpegGpsAltitude(double &altiude) const;
-+
-+    int getJpegGpsTimeStamp(int64_t &timestamp) const;
-+    int setJpegGpsTimeStamp(int64_t  timestamp);
-+
-+    int getJpegGpsProcessingMethod(int &processMethod) const;
-+    int setJpegGpsProcessingMethod(int  processMethod);
-+
-+    int getJpegGpsProcessingMethod(int size, char* processMethod) const;
-+    int setJpegGpsProcessingMethod(const char* processMethod);
-+
-+    int getImageEffect(camera_effect_mode_t &effect) const;
-+    int setImageEffect(camera_effect_mode_t  effect);
-+
-+    int getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const;
-+    int setVideoStabilizationMode(camera_video_stabilization_mode_t mode);
-+
-+    int getFocalLength(float &focal) const;
-+    int setFocalLength(float focal);
-+
-+    /**
-+     * \brief Get aperture value currently used
-+     *
-+     * \param[in] float& aperture
-+     *
-+     * \return 0 if aperture was set, non=0 means no aperture was set
-+     */
-+    int getAperture(float &aperture) const;
-+    /**
-+     * \brief Set aperture value
-+     *
-+     * \param[in] float aperture
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAperture(float aperture);
-+
-+    /**
-+     * \brief Get focus distance value currently used
-+     *
-+     * \param[in] float& distance
-+     *
-+     * \return 0 if distance was set, non-0 means no focus distance was set
-+     */
-+    int getFocusDistance(float &distance) const;
-+    /**
-+     * \brief Set focus distance value
-+     *
-+     * \param[in] float distance
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setFocusDistance(float distance);
-+
-+    /**
-+     * \brief Get focus range value currently used
-+     *
-+     * \param[in] camera_range_t& focusRange
-+     *
-+     * \return 0 if focus range was set, non-0 means no focus range was set
-+     */
-+    int getFocusRange(camera_range_t& focusRange) const;
-+    /**
-+     * \brief Set focus range value
-+     *
-+     * \param[in] camera_range_t focusRange
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setFocusRange(const camera_range_t& focusRange);
-+
-+    /**
-+     * \brief Set af mode
-+     *
-+     * \param[in] camera_af_mode_t afMode
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAfMode(camera_af_mode_t afMode);
-+
-+    /**
-+     * \brief Get af mode currently used.
-+     *
-+     * \param[out] camera_af_mode_t& afMode
-+     *
-+     * \return 0 if af mode was set, non-0 means no af mode was set.
-+     */
-+    int getAfMode(camera_af_mode_t& afMode) const;
-+
-+    /**
-+     * \brief Trigger or cancel auto focus
-+     *
-+     * \param[in] camera_af_trigger_t afTrigger
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAfTrigger(camera_af_trigger_t afTrigger);
-+
-+    /**
-+     * \brief Get auto focus trigger value
-+     *
-+     * \param[out] camera_af_trigger_t afTrigger
-+     *
-+     * \return 0 if af trigger was set, otherwise non-0 value is returned.
-+     */
-+    int getAfTrigger(camera_af_trigger_t& afTrigger) const;
-+
-+    /**
-+     * \brief Set AF state.
-+     *
-+     * \param[in] camera_af_state_t afState
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAfState(camera_af_state_t afState);
-+
-+    /**
-+     * \brief Get AF state
-+     *
-+     * \param[out] afState: Currently AF state will be set to afState if 0 is returned.
-+     *
-+     * \return 0 if AF state was set, otherwise non-0 value is returned.
-+     */
-+    int getAfState(camera_af_state_t& afState) const;
-+
-+    /**
-+     * \brief Set lens state.
-+     *
-+     * \param[in] if lens is moving
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setLensState(bool lensMoving);
-+
-+    /**
-+     * \brief Get lens state
-+     *
-+     * \param[out] isMoving: if lens is moving currently
-+     *
-+     * \return 0 if lens state was set, otherwise non-0 value is returned.
-+     */
-+    int getLensState(bool& lensMoving) const;
-+
-+    /**
-+     * \brief Set af region
-+     *
-+     * \param[in] camera_window_list_t afRegions
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setAfRegions(camera_window_list_t afRegions);
-+
-+    /**
-+     * \brief Get af region
-+     *
-+     * \param[out] camera_window_list_t afRegions
-+     *
-+     * \return 0 if afRegions were set, otherwise non-0 value is returned.
-+     */
-+    int getAfRegions(camera_window_list_t& afRegions) const;
-+
-+    /**
-+     * \brief Get camera sensor mount type
-+     *
-+     * \param[out] sensorMountType sensor mount type: WALL_MOUNT or CEILING_MOUNT
-+     *
-+     * \return 0 if sensorMountType was set, otherwise non-0 value is returned.
-+     */
-+    int getSensorMountType(camera_mount_type_t& sensorMountType) const;
-+
-+    int updateDebugLevel();
-+
-+    /**
-+     * \brief Set camera test pattern mode
-+     *
-+     * \param[in] mode: the camera device test pattern mode.
-+     *
-+     * \return 0 if set successfully, otherwise non-0 value is returned.
-+     */
-+    int setTestPatternMode(camera_test_pattern_mode_t mode);
-+
-+    /**
-+     * \brief Get camera test pattern mode
-+     *
-+     * \param[out] mode: the camera device test pattern mode.
-+     *
-+     * \return 0 if test pattern mode was set, otherwise non-0 value is returned.
-+     */
-+    int getTestPatternMode(camera_test_pattern_mode_t& mode) const;
-+
-+    /**
-+     * \brief Set crop region
-+     *
-+     * \param[in] cropRegion  the crop region related parameters
-+     *
-+     * \return 0 if successfully, otherwise non-0 value is returned.
-+     */
-+    int setCropRegion(camera_crop_region_t cropRegion);
-+
-+    /**
-+     * \brief Get crop region
-+     *
-+     * \param[out] cropRegion  the crop related parameters
-+     *
-+     * \return 0 if successfully, otherwise non-0 value is returned.
-+     */
-+    int getCropRegion(camera_crop_region_t& cropRegion) const;
-+
-+    /**
-+    * \brief Set control scene mode
-+    *
-+    * \param[in] sceneModeValue the control scene mode related parameters
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setControlSceneMode(uint8_t sceneModeValue);
-+
-+    /**
-+    * \brief Set face detect mode
-+    *
-+    * \param[in] faceDetectMode the face detect mode related parameters
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setFaceDetectMode(uint8_t faceDetectMode);
-+
-+    /**
-+    * \brief Get face detect mode
-+    *
-+    * \param[out] faceDetectMode the face detect mode related parameters, 0:OFF 1:SIMPLE 2:FULL
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getFaceDetectMode(uint8_t& faceDetectMode) const;
-+
-+    /**
-+    * \brief Set face id
-+    *
-+    * \param[in] int *faceIds, int faceNum
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setFaceIds(int *faceIds, int faceNum);
-+
-+    /**
-+     * Get sensor active array size
-+     *
-+     * \param[out] camera_coordinate_system_t& arraySize
-+     * \return 0 if successfully, otherwise non-0 value is returned.
-+     */
-+    int getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const;
-+
-+    /**
-+    * \brief Set shading  mode
-+    *
-+    * \param[in] shadingMode the shading mode related parameters
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setShadingMode(camera_shading_mode_t shadingMode);
-+
-+    /**
-+    * \brief Get shading  mode
-+    *
-+    * \param[out] shadingMode the shading mode related parameters, 0:OFF 1:FAST 2:HIGH_QUALITY
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getShadingMode(camera_shading_mode_t& shadingMode) const;
-+
-+    /**
-+    * \brief Set statistics lens shading map mode
-+    *
-+    * \param[in] lensShadingMapMode the lens shading map mode related parameters
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode);
-+
-+    /**
-+    * \brief Get statistics lens shading map mode
-+    *
-+    * \param[out] lensShadingMapMode the lens shading map mode related parameters, 0:OFF 1:ON
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getLensShadingMapMode(camera_lens_shading_map_mode_type_t &lensShadingMapMode) const;
-+
-+    /**
-+    * \brief Set lens shading map
-+    *
-+    * \param[in] lensShadingMap the lens shading map
-+    * \param[in] lensShadingMapSize lensShadingMap's size
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize);
-+
-+    /**
-+    * \brief Get lens shading map
-+    *
-+    * \param[out] lensShadingMap the lens shading map
-+    * \param[out] lensShadingMapSize the lens shading map's size
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getLensShadingMap(float *lensShadingMap, size_t &lensShadingMapSize) const;
-+
-+    /**
-+    * \brief Get lens shading map size
-+    *
-+    * \param[out] arraySize the lens shading map size related parameters
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const;
-+
-+    /*
-+    * \brief Set tonemap mode
-+    *
-+    * \param[in] camera_tonemap_mode_t& mode
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setTonemapMode(camera_tonemap_mode_t mode);
-+
-+    /**
-+    * \brief Get tonemap mode
-+    *
-+    * \param[out] camera_tonemap_mode_t& mode
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getTonemapMode(camera_tonemap_mode_t& mode) const;
-+
-+    /**
-+    * \brief Get supported tonemap modes
-+    *
-+    * \param[out] vector<camera_tonemap_mode_t>& tonemapModes
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getSupportedTonemapMode(std::vector<camera_tonemap_mode_t>& tonemapModes) const;
-+
-+    /**
-+    * \brief Set the type of tonemap preset curve
-+    *
-+    * \param[in] camera_tonemap_preset_curve_t type
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setTonemapPresetCurve(camera_tonemap_preset_curve_t type);
-+
-+    /**
-+    * \brief Get tonemap gamma
-+    *
-+    * \param[out] camera_tonemap_preset_curve_t& type
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const;
-+
-+    /**
-+    * \brief Set tonemap gamma
-+    *
-+    * \param[in] float gamma
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setTonemapGamma(float gamma);
-+
-+    /**
-+    * \brief Get tonemap gamma
-+    *
-+    * \param[out] float& gamma
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getTonemapGamma(float& gamma) const;
-+
-+    /**
-+    * \brief Get number of tonemap curve points
-+    *
-+    * \param[out] int32_t& number
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getTonemapMaxCurvePoints(int32_t& number) const;
-+
-+    /**
-+    * \brief Set tonemap curves
-+    *
-+    * \param[in] const camera_tonemap_curves_t& curve
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int setTonemapCurves(const camera_tonemap_curves_t& curves);
-+
-+    /**
-+    * \brief Get tonemap curves
-+    *
-+    * \param[out] camera_tonemap_curves_t& curve
-+    *
-+    * \return 0 if successfully, otherwise non-0 value is returned.
-+    */
-+    int getTonemapCurves(camera_tonemap_curves_t& curves) const;
-+
-+private:
-+    friend class ParameterHelper;
-+    void* mData; // The internal data to save the all of the parameters.
-+}; // class Parameters
-+/*******************End of Camera Parameters Definition**********************/
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/include/cameranvm.h b/camera/hal/intel/ipu6/include/cameranvm.h
-new file mode 100644
-index 000000000000..64cbbf2af24d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/cameranvm.h
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright 2012-2017 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *     http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file cameranvm.h
-+ * \brief Definitions of NVM creator functions.
-+*/
-+
-+#ifndef CAMERANVM_H_
-+#define CAMERANVM_H_
-+
-+#include "ia_types.h"
-+#include "ia_nvm.h"
-+
-+// macro for memcpy
-+#ifndef MEMCPY_S
-+#define NVM_MIN(a, b) ((a) < (b) ? (a) : (b))
-+#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), NVM_MIN((size_t)(dmax), (size_t)(smax)))
-+#endif
-+
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief NVM parsing status codes.
-+ */
-+typedef enum
-+{
-+    nvm_error_none,            /*!< No error. */
-+    nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
-+    nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
-+    nvm_error_af,              /*!< Error parsing AF parameters. */
-+    nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
-+    nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
-+    nvm_error_crc,             /*!< CRC check error. */
-+    nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
-+    nvm_error_version,         /*!< invalid version. */
-+    nvm_status_intel_format    /*!< The NVM data is in Intel default format. */
-+} nvm_error;
-+
-+typedef struct
-+{
-+    int lsc_color_temperature;             /*!< color temperature of shading table calibrate. as ct/100 */
-+    uint16_t *lsc_tables[IA_NVM_NUM_CHANNELS]; /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. */
-+} nvm_lsc;
-+
-+typedef struct
-+{
-+    uint8_t lsc_width;                         /*!< Width of LSC tables */
-+    uint8_t lsc_height;                        /*!< Height of LSC tables. */
-+    nvm_lsc *lsc[2];                           /*!< LSC tables 1. */
-+} nvm_data;
-+
-+/*!
-+ * \brief Creates Intel specified NVM data from various NVM data.
-+ * Detection of NVM data is done based on camera ID string. Created NVM
-+ * data buffer must be deleted with function cameranvm_delete.
-+ * \param[in]     camera_name           String identifying NVM format from various cameras.
-+ * \param[in]     input_nvm_data        NVM data from camera module.
-+ * \param[in]     input_nvm_motor_data  NVM data from camera lens motor EEPROM.
-+ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
-+ * \return                              Error code from NVM creation.
-+ */
-+nvm_error
-+cameranvm_create(const char *camera_name,
-+                 const ia_binary_data *input_nvm_data,
-+                 const ia_binary_data *input_motor_nvm_data,
-+                 ia_binary_data **output_nvm_data);
-+
-+
-+/*!
-+ * \brief Creates Intel specified NVM data from NVM data in google format.
-+ * Detection of NVM data is done based on camera ID string. NVM data in
-+ * google format should be converted into Intel format, and Created NVM
-+ * data buffer must be deleted with function cameranvm_delete.
-+ * \param[in]     lsc  lsc tables in google format.
-+ * \param[out]    output_nvm_data       NVM data converted into Intel specified format.
-+ * \return                              Error code from NVM creation.
-+ */
-+nvm_error
-+cameranvm_convert(const nvm_data *input_nvm_data,
-+                 ia_binary_data **output_nvm_data);
-+
-+/*!
-+ * \brief Deletes NVM data buffer created with function cameranvm_create.
-+ * This function only frees the allocated buffer and clears the parameters
-+ * in the given structure.
-+ * \param[in] nvm_data  Previously created NVM data buffer.
-+ */
-+void
-+cameranvm_delete(ia_binary_data *nvm_data);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* CAMERANVM_H_ */
-diff --git a/camera/hal/intel/ipu6/include/gcss/GCSSParser.h b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
-new file mode 100644
-index 000000000000..e7307b9fb8b8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
-@@ -0,0 +1,64 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __GCSS_PARSER_H__
-+#define __GCSS_PARSER_H__
-+
-+#include "gcss.h"
-+#include "gcss_item.h"
-+#include <expat.h>
-+
-+namespace GCSS {
-+
-+/**
-+ * \class GCSSParser
-+ *
-+ * This class is used to parse the Graph Configuration Subsystem graph
-+ * descriptor xml file. Uses the expat lib to do the parsing.
-+ */
-+class GCSSParser {
-+public:
-+    GCSSParser();
-+    ~GCSSParser();
-+    void parseGCSSXmlFile(const char*, IGraphConfig**);
-+    void parseGCSSXmlData(char*, size_t, IGraphConfig**);
-+
-+private: /* Constants*/
-+    static const int BUFFERSIZE = 4*1024;  // For xml file
-+
-+private: /* Methods */
-+    GCSSParser(const GCSSParser& other);
-+    GCSSParser& operator=(const GCSSParser& other);
-+
-+    static void startElement(void *userData, const char *name, const char **atts);
-+    static void endElement(void *userData, const char *name);
-+
-+    void parseXML(XML_Parser &parser, const char* fileName, void* pBuf);
-+#ifndef ZLIB_DISABLED
-+    void parseGz(XML_Parser &parser, const char* filename, void* pBuf);
-+#endif
-+    void handleGraph(const char *name, const char **atts);
-+    void handleNode(const char *name, const char **atts);
-+    void checkField(GCSSParser *profiles, const char *name, const char **atts);
-+
-+private:  /* Members */
-+
-+    ia_uid mTopLevelNode;
-+    std::string mVersion; /* save version number from the xml here */
-+    GCSS::GraphConfigNode *mCurrentNode; /* TODO: these should be of GraphConfig-iface type */
-+};
-+} // namespace
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss.h b/camera/hal/intel/ipu6/include/gcss/gcss.h
-new file mode 100644
-index 000000000000..109c88698b67
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss.h
-@@ -0,0 +1,279 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef __GCSS_H__
-+#define __GCSS_H__
-+
-+#include <ia_tools/css_types.h>
-+#include <ia_cipf/ia_cipf_types.h>
-+
-+#ifdef __cplusplus
-+
-+#include <string>
-+#include <map>
-+#include <utility>
-+#include <vector>
-+
-+namespace GCSS {
-+
-+/* For now there is no C API to GCSS so exposing the ItemUID and IGraphConfig
-+ * here */
-+class ItemUID
-+{
-+public:
-+    static ia_uid str2key(const std::string&);
-+    static const char* key2str(const ia_uid key);
-+    static bool isInteger(const ia_uid key);
-+    static ia_uid generateKey(const std::string&);
-+    static void addCustomKeyMap(std::map<std::string, ia_uid> &osMap);
-+
-+    ItemUID(std::initializer_list<ia_uid> uids) {
-+        mUids.insert(mUids.end(), uids.begin(), uids.end());
-+    };
-+    ItemUID (const std::string &itemName);
-+    ItemUID() {};
-+    void pop_back() { mUids.pop_back(); };
-+    void push_back( const ia_uid& iuid) { mUids.push_back(iuid); };
-+
-+    bool operator == (const ItemUID& v) const {
-+        return v.mUids == mUids;
-+    }
-+
-+    std::string toString() const;
-+
-+    std::size_t size() const { return mUids.size(); };
-+
-+    ItemUID(const ItemUID &ref) { mUids = ref.mUids; };
-+    ItemUID & operator=(const ItemUID &v) {
-+        // check for self-assignment
-+        if (&v == this)
-+            return *this;
-+
-+        mUids = v.mUids;
-+        return *this;
-+    }
-+
-+    ia_uid& operator[](std::size_t idx) { return mUids[idx]; }
-+    const ia_uid& operator[](std::size_t idx) const
-+    { return mUids[idx]; }
-+
-+private:
-+    friend bool operator<(const ItemUID &r, const ItemUID &l);
-+    friend bool operator>(const ItemUID &r, const ItemUID &l);
-+    std::vector<ia_uid> mUids;
-+
-+};
-+
-+class IGraphConfig
-+{
-+public:
-+    virtual ~IGraphConfig() {}
-+
-+    /**
-+     * Get root level node of the graph
-+     *
-+     * \ingroup gcss
-+     *
-+     * \return pointer to root node on success
-+     * \return NULL if error
-+     */
-+    virtual IGraphConfig* getRoot(void) const = 0;
-+    /*
-+     * Get ancestor for the node
-+     *
-+     * \ingroup gcss
-+     *
-+     * \return pointer to ancestor node on success
-+     * \return NULL if error
-+     */
-+    virtual IGraphConfig* getAncestor(void) const = 0;
-+
-+    virtual uint32_t getDescendantCount() const = 0;
-+
-+    /**
-+     * Get descendant by GCSS_KEY
-+     *
-+     * \ingroup gcss
-+     *
-+     * \return pointer to the descendant if success
-+     * \return NULL if error
-+     */
-+    virtual IGraphConfig* getDescendant(ia_uid) const = 0;
-+
-+    /**
-+     * Get descendant by GCSS_KEY, or array of keys
-+     *
-+     * \ingroup gcss
-+     *
-+     * possible usages:
-+     * getDescendant(GCSS_KEY_GRAPH);
-+     * getDescendant({GCSS_KEY_GRAPH, GCSS_KEY_CONNECTION});
-+     *
-+     * \return pointer to the descendant if success
-+     * \return NULL if error
-+     */
-+
-+    virtual IGraphConfig* getDescendant(const ItemUID&) const = 0;
-+    /**
-+     * DEPRECATED
-+     * Get descendant by string
-+     *
-+     * \ingroup gcss
-+     *
-+     * \return pointer to the descendant if success
-+     * \return NULL if error
-+     */
-+    virtual IGraphConfig* getDescendantByString(const std::string &str) const = 0;
-+
-+    /**
-+     * Get int value for an attribute given as GCSS_KEY
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] gcss key
-+     * \param[out] int value
-+     * \return css_err_none if success
-+     */
-+    virtual css_err_t getValue(ia_uid, int&) const = 0;
-+    virtual css_err_t getValue(const ItemUID&, int&) const = 0;
-+
-+    /**
-+     * Get str value for an attribute given as GCSS_KEY
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] gcss key
-+     * \param[out] str value
-+     * \return css_err_none if success
-+     */
-+    virtual css_err_t getValue(ia_uid, std::string&) const = 0;
-+    virtual css_err_t getValue(const ItemUID&, std::string&) const = 0;
-+
-+    /**
-+     * Set int value for an attribute given as GCSS_KEY
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] gcss key
-+     * \param[in] int value
-+     * \return css_err_none if success
-+     */
-+
-+    virtual css_err_t setValue(ia_uid, int) = 0;
-+    virtual css_err_t setValue(const ItemUID&, int) = 0;
-+
-+    /**
-+     * Set str value for an attribute given as GCSS_KEY
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] gcss key
-+     * \param[in] str value
-+     * \return css_err_none if success
-+     */
-+    virtual css_err_t setValue(ia_uid, const std::string&) = 0;
-+    virtual css_err_t setValue(const ItemUID&, const std::string&) = 0;
-+
-+    /* Helpers to get uid of the node. Either as a string or uint*/
-+    virtual std::string getName()const = 0;
-+    virtual ia_uid getUid() const = 0;
-+
-+    /**
-+    * Check if node in the graph is of given type
-+    *
-+    * \ingroup gcss
-+    *
-+    * Check if node is, for example, sink, port, program group.
-+    *
-+    * \param[in] type to compare against as a gcss key
-+    * \return true if type matches, false otherwise
-+    */
-+    virtual bool isType(ia_uid) const = 0;
-+
-+};
-+
-+/**
-+* \class NodeIterator
-+* \ingroup gcss
-+* allows iteration of descendants by type, name or value
-+*/
-+class NodeIterator
-+{
-+public:
-+    /**
-+    * Iterator is constructed by givin pointer to the IGraphConfig object
-+    * that is being iterated.
-+    * \ingroup gcss
-+    */
-+    NodeIterator(const IGraphConfig *node) : mCurrentIndex(0), mTarget(node), mCurrentKey(0) {}
-+
-+    /**
-+    * Iterates descendants of the node by their type
-+    * \ingroup gcss
-+    * \param[in] type           Gcss key of the type to iterate
-+    * \return    IGraphConfig   As long as descendants found
-+    * \return    NULL           When end reached
-+    */
-+    IGraphConfig* iterateByType(const ia_uid &type);
-+
-+    /**
-+    * Iterates descendants of the node with a given uid
-+    *
-+    * \ingroup gcss
-+    * \param[in] uid            Descendant uid as a gcss key
-+    * \return    IGraphConfig   As long as matching descendants found
-+    * \return    NULL           When end reached
-+    */
-+
-+    IGraphConfig* iterateByUid(const ia_uid &name);
-+
-+    /**
-+    * Iterates all descendants of the node
-+    *
-+    * \ingroup gcss
-+    * \return    IGraphConfig   As long as matching descendants found
-+    * \return    NULL           When end reached
-+    */
-+    IGraphConfig* iterateDescendants();
-+private:
-+    IGraphConfig* iterateNodes(const ia_uid &type, const std::string &str);
-+    IGraphConfig* reset();
-+    int32_t mCurrentIndex; /**< state of the iterator */
-+    const IGraphConfig *mTarget;   /**< node being iterated */
-+    // for caching key to string conversions
-+    ia_uid mCurrentKey;
-+    std::string mCurrentString;
-+};
-+} // namespace
-+
-+extern "C" {
-+#endif
-+
-+#define GCSS_KEY(key, str) GCSS_KEY_##key,
-+#define GCSS_KEY_SECTION_START(key, str, val) GCSS_KEY_##key = val,
-+#define GCSS_KEY_SECTION_END(key, str, val) GCSS_KEY_##key = val,
-+typedef enum _GraphConfigKey {
-+    #include "gcss_keys.h"
-+    GCSS_KEY_START_CUSTOM_KEYS = 0x8000,
-+} GraphConfigKey;
-+#undef GCSS_KEY
-+#undef GCSS_KEY_SECTION_START
-+#undef GCSS_KEY_SECTION_END
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
-new file mode 100644
-index 000000000000..a6c1bab1dbef
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
-@@ -0,0 +1,325 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef GCSS_AIC_UTILS_H_
-+#define GCSS_AIC_UTILS_H_
-+
-+extern "C" {
-+#include "ia_isp_bxt_types.h"
-+#include "ia_view_types.h"
-+}
-+
-+#include "gcss.h"
-+#include "gcss_item.h"
-+#include "graph_utils.h"
-+#include "gcss_isp_utils.h"
-+
-+namespace GCSS {
-+
-+typedef std::map<GCSS::IGraphConfig*, ia_isp_bxt_resolution_info_t> portResHistoryMap;
-+typedef std::vector<GCSS::IGraphConfig*> NodesVector;
-+typedef std::vector<int32_t> StreamIdVector;
-+/*
-+* Map with the information for each stream id of the RBM for each PG
-+* the key of the map is the stream id (60000, 60001, etc..)
-+* the Values in the map is a vector with tuples that have the PG/CB id as integer
-+* and the RBM as a string.
-+*/
-+typedef std::map<int32_t, std::vector<std::tuple<int32_t, std::string> > > GraphRoutingInfo;
-+/*
-+ * Maps the execution context id to index of the vector mKernels  where the
-+ * pre-allocated arrays of ia_isp_bxt_run_kernels_t are stored. <exec_ctx_id, idx>
-+ */
-+typedef std::map<int32_t, uint32_t> ExecCtxIdsMap;
-+/**
-+* \class BxtAicUtils
-+* GCSS AIC dependent utility functions
-+* */
-+class BxtAicUtils {
-+public: /*  methods */
-+    /**
-+     * \param legacy true if stream id is used instead of execution context
-+     */
-+    BxtAicUtils(bool legacy = true);
-+    ~BxtAicUtils();
-+    /**
-+     * Init aic utils
-+     *
-+     * Reserves memory, and creates kernel lists for each stream
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] GCHandle a handle to createGraph result
-+     * \return css_err_none when successful
-+     */
-+    css_err_t initAicUtils(const IGraphConfig *GCHandle);
-+
-+    /**
-+     * get the list of stream Ids available in the graph settings initialized
-+     * in this object.
-+     *
-+     * \param[out] streamIds vector with the stream id's
-+     * \param[in] active boolean to specify whether the list of stream ids will
-+     *                   have all the stream ids in the graph or only the ones
-+     *                   with valid settings. Those are considered as active
-+     *                   streams
-+     * \return css_err_none
-+     */
-+
-+    css_err_t getStreamIds(std::vector<int32_t> &streamIds, bool active = false) const;
-+
-+    /**
-+     * Get program group by stream id
-+     *
-+     * \ingroup gcss
-+     *
-+     * Returns pointer to program group struct, which is allocated as a
-+     * member of this class. So the ownership of the memory remains in the instance
-+     * of this class. The user does not need to free the memory.
-+     *
-+     * \param[in] stremId a stream id of the program group being requested
-+     * \param[out] pg Reference to a program group struct being populated
-+     */
-+    void getProgramGroup(int32_t streamId, ia_isp_bxt_program_group &pg);
-+
-+    /**
-+    * Returns the structure required by ia_isp (aka PAL) to run
-+    *
-+    * \ingroup gcss
-+    * Unfortunate name, program group. This is the array of structures
-+    * ia_isp_bxt_run_kernels_t that describes the input/output resolution for
-+    * each kernel.
-+    * This version of the API takes as input a concrete IGraphConfig node that
-+    * represents a PG. The other API takes the stream-id and returns all the kernels
-+    * in all the PG's that belong to them.
-+    * In both cases the list of kernels is returned inside the AIC structure
-+    * ia_isp_bxt_program_group.
-+    * The memory allocated is owned by this instance. The user of this API must not
-+    * de-allocate the pg.run_kernels pointer.
-+    *
-+    * NOTE: The current implementation only supports IPU6, not yet IPU5
-+    *
-+    * \param[in] pgNode IGraphConfig node representing a particular PG
-+    * \param[out] pg Reference to a program group struct being populated
-+    */
-+    css_err_t getProgramGroup(const IGraphConfig* pgNode, ia_isp_bxt_program_group &pg);
-+
-+    /**
-+     * Get cmc mode tag associated with the sensor
-+     * \ingroup gcss
-+     *
-+     * This will be used to retieve the CMC section of a multi-tune file. This
-+     * is done using ia_lard.
-+     *
-+     * \param[out] cmcTag
-+     * \return css_err_none if everything goes ok
-+     * \return css_err_internal if settigns do no thave sensor node
-+     * \return css_err_data if sensor node does node have the attribure cmc_tag
-+     */
-+    css_err_t getSensorCmcId(std::string &cmcTag);
-+
-+    /* Get Information about the DOL mode of the sensor
-+     * \ingroup gcss
-+     *
-+     * This will be used to retieve the conversion gain and the DOL mode from
-+     * the settings of the sensor mode.
-+     * if sensor mode does not have the attribute the method does not fail but
-+     * returns gain 1 and mode none.
-+     *
-+     * TODO: Mode should come as an enum and not as string, this requires
-+     * addition of dol mode in ia_isp_bxt
-+     *
-+     * \param[out] gain conversion gain
-+     * \param[out] mode DOL mode, only 4 possible values
-+     * \return css_err_none if everything goes ok
-+     * \return css_err_internal if settigns do no thave sensor node or instance
-+     *                          is not initialized
-+     */
-+    css_err_t getDolInfo(float &gain, std::string &mode);
-+
-+    /* Get MBR Tool data
-+    * \ingroup gcss
-+    *
-+    * Retrieve the limits of MBR tool stored in the settings. This information
-+    * is required for WFOV mode.
-+    *
-+    * \param[in] stream_id Value of the stream_id associated with the MBR limits
-+    * \param[out] data Pointer to valid structure where to store the MBR limits
-+    * \return css_err_none if everything goes ok
-+    * \return css_err_data if settigns do not have enough data to fill the mbr limits structure
-+    * \return css_err_internal if settigns do not have mbr limits data
-+    *
-+    */
-+    css_err_t getMbrData(int32_t stream_id, ia_isp_bxt_gdc_limits *data);
-+
-+    /**
-+     * Get the IGraphConfig root node that was used to initialize this utility
-+     * class. This allows users to perform other queries to the IGraphConfig
-+     * interface.
-+     * \ingroup gcss
-+     *
-+     */
-+    const IGraphConfig* getGraphConfig() { return mGCHandle; }
-+
-+    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history);
-+
-+    /**
-+    * Retrieves the list of all the RBM's in all the stream-ids present in the
-+    * settings. The RBM's are listed per PG/CB
-+    * \see GraphRoutingInfo
-+    * \ingroup gcss
-+    *
-+    */
-+    css_err_t getRoutingInfo(GraphRoutingInfo &routingInfo);
-+
-+    /**
-+     * Dumps the list of kernels for given stream
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] streamId
-+     */
-+    void dumpKernels(int32_t streamId);
-+    /**
-+     * Dumps the information from a list of kernels descriptors
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] streamId
-+     */
-+    static void dumpKernels(ia_isp_bxt_run_kernels_t *kernelList,
-+                            uint32_t kernel_count);
-+
-+    static void dumpResInfo(ia_isp_bxt_run_kernels_t &kernelInfo);
-+    static void dumpResHistory(ia_isp_bxt_resolution_info_t &resInfo,
-+                               const char* name);
-+private:
-+    /* pair of execution context id and port */
-+    typedef std::pair<int32_t, IGraphConfig*> StreamPort;
-+    typedef ia_isp_bxt_resolution_info_t ResolutionInfo;
-+
-+    /* Helper classes to store sensor and kernel information */
-+    struct Scaler: public ResolutionInfo {
-+        Scaler() : num(1), denom(1) {} /**< avoid possible division by 0 */
-+        int32_t num;  /**< scaling factor numerator */
-+        int32_t denom; /**< scaling factor denominator */
-+    };
-+    struct Binner : public ResolutionInfo {
-+        Binner() : hFactor(1), vFactor(1) {} /**< avoid possible division by 0 */
-+        int32_t hFactor;  /**< horizontal binning factor */
-+        int32_t vFactor; /**< Vertical binning factor */
-+    };
-+    struct SensorModeInfo {
-+        ResolutionInfo pixelArray;
-+        Binner binner;
-+        Scaler scaler;
-+    };
-+    struct ResolutionMemPool {
-+           std::vector<ResolutionInfo *> resHistorys;
-+           std::vector<ResolutionInfo *> resInfos;
-+    };
-+    struct KernelGroupInfo {
-+        KernelGroupInfo() : runKernels(nullptr), kernelCount(0) {}
-+        KernelGroupInfo(uint32_t kCount) : runKernels(nullptr), kernelCount(kCount) {}
-+        ia_isp_bxt_run_kernels_t *runKernels;
-+        uint32_t kernelCount = 0;
-+    };
-+    // Storage for kernel info extensions to AIC requirements
-+    struct KernelInfo {
-+        int32_t rcb;
-+        int32_t branchPoint;
-+        int32_t sinkPortId;
-+        int32_t restorePoint;
-+        IGraphConfig *sinkPort;
-+        IGraphConfig *srcPort;
-+    };
-+
-+    css_err_t collectNodesIntAttribute(std::vector<int32_t> &pgsAttribute,
-+                                       ia_uid attributeKey,
-+                                       ia_uid nodeType) const;
-+    int32_t getUpstreamStreamId(int32_t streamId,
-+                                IGraphConfig **upstreamPort);
-+
-+    css_err_t createKernelListStructures();
-+    css_err_t createPerPgKernelListStructures(const IGraphConfig *pg, uint32_t);
-+    static css_err_t getSensorModeInfo(IGraphConfig &sensorNode, SensorModeInfo &sensorInfo);
-+    static css_err_t sourceGetResolutionHistory(ResolutionInfo &history,
-+                                                IGraphConfig &sourceNode);
-+    static css_err_t  calculateSensorResolutionHistory(IGraphConfig &sensorNode,
-+                                                       ResolutionInfo &history);
-+    static css_err_t  calculateTPGResolutionHistory(IGraphConfig &sensorNode,
-+                                                    ResolutionInfo &history);
-+    static css_err_t calculateBufSrcResolutionHistory(IGraphConfig &tpgNode,
-+                                                      ResolutionInfo &history);
-+    static css_err_t getCsiDimensions(IGraphConfig &sensorNode,
-+                                      ResolutionInfo &pixFormat);
-+    css_err_t populateKernelArray(int32_t streamId,
-+                                  ia_isp_bxt_run_kernels_t *kernelList,
-+                                  uint32_t index,
-+                                  portResHistoryMap &portResHistory);
-+
-+    css_err_t getStreamChains(std::map<int32_t, std::vector<StreamPort>> &streamChains);
-+    css_err_t generateKernelListsForExecCtxs();
-+
-+    css_err_t getResHistoryForIntermediatePg(const IGraphConfig *pg,
-+        ResolutionInfo &resolutionHistory,
-+                                             portResHistoryMap &portResHistory);
-+    css_err_t handleSinkPort(KernelInfo &kInfo, const IGraphConfig *pg, std::vector<int32_t> &, int32_t);
-+    static css_err_t kernelGetValues(const GCSS::IGraphConfig *kernelNode,
-+                                     int32_t *palUuid = NULL,
-+                                     int32_t *kernelId = NULL,
-+                                     uint32_t *metadata = NULL,
-+                                     int32_t *enable = NULL,
-+                                     int32_t *rcb = NULL,
-+                                     int32_t *branchPoint = NULL,
-+                                     int32_t *sinkPort = NULL,
-+                                     int32_t *restorePoint = NULL);
-+
-+    static css_err_t kernelGetResolutions(const IGraphConfig *kernelNode,
-+                                          std::map<std::string, ResolutionInfo> &resInfos);
-+    static css_err_t kernelGetResolutions(const GCSS::IGraphConfig *kernelNode,
-+        ResolutionInfo *resInfo);
-+
-+    static css_err_t kernelGetBppInfo(const IGraphConfig &kernelNode,
-+                                      ia_isp_bxt_run_kernels_t &runKernel);
-+    static void accumulateCrop(ia_rectangle &in, const ia_rectangle &toAccumulate,
-+                                       int32_t scaleNum = 1, int32_t scaleDenom = 1);
-+    css_err_t kernelIdSanityCheck(uint32_t checksum, uint32_t kernelCount);
-+
-+    // IPU6/7 new logic - start
-+    bool nodesHaveKernelLinks();
-+    bool detectNewGraphVersion();
-+    // IPU6 new logic - end
-+    static bool kernelHasResolutions(GCSS::IGraphConfig *kernelNode);
-+    void deleteKernelInfo();
-+    static void dumpPortResHistoryMap (portResHistoryMap &m);
-+    static const char* resInfoToStr(ResolutionInfo &resInfo);
-+    void applyKernelConfigs(const KernelConfigs &kernelConf,
-+                            ia_isp_bxt_run_kernels_t &runKernels);
-+    friend class GraphUtil;
-+    ExecCtxIdsMap mExecCtxIds;
-+    std::vector<ResolutionMemPool> mResMems;
-+    std::map<const IGraphConfig*, KernelGroupInfo> mRunKernelsPerPg;
-+    std::map<int32_t, KernelGroupInfo> mRunKernelsPerStream;
-+    ResolutionInfo mSourceHistory;
-+
-+    const IGraphConfig *mGCHandle;
-+    bool mUseStreamId;
-+    GraphUtil mGraphUtil;
-+    GdfVersion mGdfVersion;
-+    std::shared_ptr<IspUtils> mISPUtils;
-+};
-+} // namespace
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
-new file mode 100644
-index 000000000000..647981542518
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
-@@ -0,0 +1,148 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef GCSS_ISP_UTILS_H_
-+#define GCSS_ISP_UTILS_H_
-+
-+#include "gcss.h"
-+#include "graph_utils.h"
-+
-+namespace GCSS {
-+
-+struct KernelConfigContainer {
-+    int32_t overwriteMode = 0; /**< use this flag to tell which values to update */
-+    uint32_t kernel_uuid;
-+    int32_t enable;
-+    uint32_t metadata[4];
-+    ia_isp_bxt_bpp_info_t bpp_info;
-+};
-+
-+/**
-+* These modes are used to tell which kernel properties are to be overwritten
-+*/
-+enum OverwriteMode {
-+    OVERWRITE_ENABLE   = 1 << 1,
-+    OVERWRITE_BPP      = 1 << 2,
-+    OVERWRITE_METADATA = 1 << 3
-+};
-+
-+static const std::string IPU_VER_5("IPU5");
-+static const std::string IPU_VER_6("IPU6");
-+static const std::string IPU_VER_7("IPU7");
-+/**
-+ * Vector that is used to hold kernelConfig structs per kernel
-+ */
-+typedef std::vector<KernelConfigContainer> KernelConfigs;
-+
-+/** \class IspUtils
-+ * Provides IPU specific utilities that can be accessed through
-+ * the pointer constructed with the Factory method.
-+ */
-+class IspUtils {
-+
-+public:
-+    virtual ~IspUtils() {}
-+
-+    /**
-+    * Isp Utils Factory
-+    *
-+    * \ingroup gcss
-+    *
-+    * Returns pointer that allows access to common and IPU specific utilities.
-+    * Ipu is automatically selected based on the version attribute in the
-+    * graph descriptor.
-+    *
-+    * \param[in]  settings
-+    * \return     pointer to one of the ipu specific implementations
-+    */
-+    static std::shared_ptr<IspUtils> Factory(const IGraphConfig *settings);
-+
-+    /**
-+    * Is dvs enabled
-+    *
-+    * \ingroup gcss
-+    *
-+    * Returns true if dvs enabled in settings. False otherwise,
-+    *
-+    * \return true if dvs is enabled in the settings
-+    * \return false if dvs disabled in the settings
-+    */
-+    virtual bool isDvsEnabled() = 0;
-+
-+    /**
-+    * Get IPU version
-+    *
-+    * \ingroup gcss
-+    *
-+    * Returns ipu version as GdfVersion type
-+    *
-+    * \return GdfVersion
-+    */
-+    virtual GdfVersion getIpuVersion() = 0;
-+
-+    /**
-+    * Get kernel configurations
-+    *
-+    * \ingroup gcss
-+    *
-+    * Returns map of runtime kernel configurations. KernelConfigurations map
-+    * contains pal uuid and enable value for kernel. Use through ipu specific
-+    * implementation.
-+    *
-+    * \param[out] KernelConfigContainer populated with kernel configs
-+    * \return css_err_none on success
-+    * \return css_err_nimpl if function not implemented
-+    * \return css_err_general in case of error
-+    */
-+    virtual css_err_t getKernelConfigurations(KernelConfigs &kConfig) = 0;
-+
-+    /** Apply given format to output port
-+    *
-+    * \ingroup gcss
-+    *
-+    * Applies given format to the port that the sink is connected to.
-+    * The given format has to be present in the options list of the pg where the
-+    * port belongs to. If there is no options list for the pg, then no error is
-+    * returned and no format applied.
-+    *
-+    * \param[in] sink    Pointer to the sink in the graph.
-+    * \param[in] format  Name of the format that is being applied
-+    * \return css_err_none   in case of success
-+    * \return css_err_data   in case the given format is not in the options list
-+    */
-+    virtual css_err_t applyFormat(const IGraphConfig *sink,
-+        const std::string &format) = 0;
-+
-+    /** Applies compression to full pipe and sets given format to output port
-+    *
-+    * \ingroup gcss
-+    *
-+    * Applies given format to the port that the sink is connected to.
-+    * The given format has to be present in the options list of the pg where the
-+    * port belongs to. If there is no options list for the pg, then no error is
-+    * returned and no format applied. Applies compression also to PSA and to
-+    * tnr ports if present.
-+    *
-+    * \param[in] sink    Pointer to the sink in the graph.
-+    * \param[in] format  Name of the compressed format that is being applied
-+    * \return css_err_none       in case of success
-+    * \return css_err_argument   in case the given format is not compressed
-+    * \return css_err_data       in case the given format is not in the options list
-+    */
-+    virtual css_err_t applyCompression(const IGraphConfig *sink,
-+        const std::string &format) = 0;
-+};
-+} // namespace
-+#endif
-\ No newline at end of file
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_item.h b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
-new file mode 100644
-index 000000000000..448e6e0498cd
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
-@@ -0,0 +1,267 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef GCSS_ITEM_H_
-+#define GCSS_ITEM_H_
-+
-+#include "gcss.h"
-+namespace GCSS {
-+
-+class GraphQueryManager;
-+
-+/** RelayControl :
-+* Controls of assigning GraphConfig container elements */
-+namespace RelayControl {
-+    typedef int8_t Rule;
-+    const Rule RELAY_RULE_ADD_NODES = 0x1;
-+    const Rule RELAY_RULE_HANDLE_OPTIONS = 1 << 1;
-+    const Rule RELAY_RULE_PROPAGATE = 1 << 2;
-+    const Rule RELAY_RULE_OVERWRITE = 1 << 3;
-+}
-+
-+void getGcssKeys(std::map<std::string, ia_uid> &src);
-+void copyGcssKeys(std::map<std::string, ia_uid> &src);
-+
-+/**
-+ * Holds type of the item. It can be Node or Attribute (int or string)
-+ */
-+enum Type {
-+    NA               = (1 << 0),
-+    STR_ATTRIBUTE    = (1 << 1),
-+    INT_ATTRIBUTE    = (1 << 2),
-+    NODE             = (1 << 3)
-+};
-+/**
-+ * \class GraphConfigItem
-+ * Base class that holds attributes or nodes inside
-+ */
-+class GraphConfigItem
-+{
-+public:
-+    typedef std::multimap<ia_uid, GraphConfigItem*> gcss_item_map;
-+    typedef gcss_item_map::const_iterator const_iterator;
-+
-+    /** Getter for int value of attribute. Return error if getValue is being
-+     * used directly or if child class doesn't implement getValue
-+     * \param[out] value
-+     */
-+
-+    virtual css_err_t getValue(int&) {return css_err_noentry;}
-+    /** Getter for string value of attribute. Return error if getValue is being
-+     * used directly or if child class doesn't implement getValue
-+     * \param[out] value
-+     */
-+
-+    virtual css_err_t getValue(std::string&) {return css_err_noentry;}
-+    /** Setter for string value of attribute.
-+     * \param[in] new value
-+     */
-+
-+    virtual css_err_t setValue(const std::string&) {return css_err_noentry;}
-+    /** Setter for int value of attribute.
-+     * \param[in] new value
-+     */
-+    virtual css_err_t setValue(int) {return css_err_noentry;}
-+
-+    Type mType;
-+    GraphConfigItem(Type type) : mType(type) {}
-+
-+    virtual ~GraphConfigItem() {}
-+};
-+
-+
-+inline bool operator<(const ItemUID &r, const ItemUID &l)
-+{
-+    return r.mUids < l.mUids;
-+}
-+
-+inline bool operator>(const ItemUID &r, const ItemUID &l)
-+{
-+    return r.mUids > l.mUids;
-+}
-+
-+/**
-+ * \class GraphConfigAttribute
-+ * Base class for graph config attributes
-+ */
-+class GraphConfigAttribute : public GraphConfigItem {
-+public:
-+    GraphConfigAttribute() : GraphConfigItem(NA){}
-+    GraphConfigAttribute(Type t) : GraphConfigItem(t){}
-+    ~GraphConfigAttribute() {}
-+};
-+
-+/**
-+ * \class GraphConfigIntAttribute
-+ * Container for integer type attributes
-+ */
-+class GraphConfigIntAttribute : public GraphConfigAttribute
-+{
-+public:
-+    GraphConfigIntAttribute() : GraphConfigAttribute(INT_ATTRIBUTE), mInteger(-1){}
-+    GraphConfigIntAttribute* copy();
-+    css_err_t getValue(int& intVal){intVal = mInteger; return css_err_none;}
-+    css_err_t setValue(int intVal) { return insertInteger(intVal);}
-+    ~GraphConfigIntAttribute() {};
-+private:
-+    css_err_t insertInteger(int);
-+    int mInteger;
-+};
-+
-+/**
-+ * \class GraphConfigStrAttribute
-+ * Container for string type attributes
-+ */
-+class GraphConfigStrAttribute : public GraphConfigAttribute
-+{
-+public:
-+    GraphConfigStrAttribute() : GraphConfigAttribute(STR_ATTRIBUTE){}
-+    GraphConfigStrAttribute* copy();
-+    css_err_t getValue(std::string& str){str = mString; return css_err_none;}
-+    css_err_t setValue(const std::string& str) { return insertString(str);}
-+    ~GraphConfigStrAttribute() {};
-+private:
-+    css_err_t insertString(const std::string&);
-+    std::string mString;
-+};
-+
-+/**
-+ * \class GraphConfigNode
-+ * Provides methods for manipulating nodes in the graph
-+ */
-+class GraphConfigNode : public GraphConfigItem, public IGraphConfig
-+{
-+public:
-+    GraphConfigNode(const GraphConfigNode&);
-+    GraphConfigNode() : GraphConfigItem(NODE), mAncestor(NULL){};
-+    ~GraphConfigNode();
-+
-+    GraphConfigNode* copy() const;
-+    operator IGraphConfig*() { return this; }
-+    static void dumpNodeTree(const GraphConfigNode*, int depth  = 0);
-+    const_iterator begin() const { return mItem.begin(); }
-+    const_iterator end() const { return mItem.end(); }
-+
-+    css_err_t insertDescendant(GraphConfigItem*, const ia_uid);
-+    css_err_t removeDescendant(const ia_uid);
-+    css_err_t createAttribute(const ItemUID& item, GraphConfigAttribute** ret);
-+
-+    css_err_t changeBaseNodeIntoNode(GraphConfigNode &configNode);
-+
-+    /**
-+     * Helper function which iterates through given node and search for
-+     * matching attribute. Return error if not found.
-+     * \param attribute the ItemUID of attribute to search
-+     * \param searchAttributeValue the value to search
-+     * \param it iterator for the node to search
-+     * \return css_err_t
-+     */
-+    template <typename T>
-+    css_err_t iterateAttributes(ia_uid attribute,
-+        const T& searchAttributeValue,
-+        const const_iterator& it) const;
-+
-+    static css_err_t handleAttributeOptions(GraphConfigNode *node,
-+        ia_uid attribute_key,
-+        const std::string &newValue);
-+
-+    /** DEPRECATED public methods, use IGraphConfig implementations instead */
-+    GraphConfigNode* getRootNode(void) const;
-+    css_err_t getAncestor(GraphConfigNode**);
-+    css_err_t getAttribute(const ia_uid iuid, GraphConfigAttribute** ret) const;
-+    css_err_t getAttribute(const ItemUID& item, GraphConfigAttribute** ret) const;
-+    css_err_t getDescendant(const ia_uid, GraphConfigNode**) const;
-+    css_err_t getDescendant(const ia_uid attribute,
-+        const int searchAttributeValue,
-+        const_iterator& it,
-+        GraphConfigNode** retNode) const;
-+    css_err_t getDescendant(const ia_uid attribute,
-+        const std::string& searchAttributeValue,
-+        const_iterator& it,
-+        GraphConfigNode** retNode) const;
-+    css_err_t getDescendantByString(const std::string &str,
-+        GraphConfigNode **retNode);
-+private:
-+    /* private methods */
-+    GraphConfigNode & operator=(const GraphConfigNode &);
-+
-+    GraphConfigItem::const_iterator getNext(const_iterator& it){
-+                                            return std::next(it, 1);}
-+    GraphConfigItem::const_iterator getNextAttribute(
-+            GraphConfigItem::const_iterator& it) const;
-+
-+    template <typename T>
-+    css_err_t getAttrValue(const ia_uid& uid, T& val) const;
-+
-+    template <typename T>
-+    css_err_t setAttrValue(const ia_uid& uid, T& val);
-+
-+    void dumpNode();
-+
-+    /* private members */
-+    gcss_item_map mItem; /**< map that holds GraphConfigItem objects inside */
-+    GraphConfigNode* mAncestor;
-+
-+
-+    css_err_t setValueFromStr(const ItemUID &iuid, const std::string val);
-+    virtual IGraphConfig* getGraphConfigItem(const ItemUID&) const;
-+
-+public: /* implements IGraphConfig */
-+    virtual IGraphConfig* getRoot(void) const;
-+    virtual IGraphConfig* getAncestor(void) const;
-+    virtual IGraphConfig* getDescendant(ia_uid uid) const;
-+    virtual IGraphConfig* getDescendant(const ItemUID&) const;
-+    virtual IGraphConfig* getDescendantByString(const std::string &str) const;
-+    virtual uint32_t getDescendantCount() const;
-+    virtual css_err_t getValue(ia_uid, int&) const;
-+    virtual css_err_t getValue(const ItemUID&, int&) const;
-+
-+    virtual css_err_t getValue(ia_uid, std::string&) const;
-+    virtual css_err_t getValue(const ItemUID&, std::string&) const;
-+
-+    virtual css_err_t setValue(ia_uid, int);
-+    virtual css_err_t setValue(const ItemUID&, int);
-+
-+    virtual css_err_t setValue(ia_uid, const std::string&);
-+    virtual css_err_t setValue(const ItemUID&, const std::string&);
-+    virtual std::string getName() const;
-+    virtual ia_uid getUid() const;
-+    virtual bool isType(ia_uid) const;
-+
-+    /* access not part of IGraphConfig */
-+    bool hasItem(const ia_uid iuid) const;
-+    css_err_t addValue(ia_uid uid, const std::string &val);
-+    css_err_t addValue(ia_uid uid, int val);
-+
-+    // To silence possible compiler warning
-+    using GraphConfigItem::getValue;
-+    using GraphConfigItem::setValue;
-+};
-+/* class to expose GraphConfigNode internals to GraphQueryManager */
-+class GraphQueryUtils : public GraphConfigNode {
-+public:
-+    static css_err_t addDescendantsFromNode(
-+        GraphConfigNode *to,
-+        GraphConfigNode *from,
-+        RelayControl::Rule rr = RelayControl::RELAY_RULE_ADD_NODES
-+        | RelayControl::RELAY_RULE_OVERWRITE);
-+private:
-+    static GraphConfigNode* getPortPeer(GraphConfigNode* portNode);
-+    static void disableUnusedPorts(GraphConfigNode *gcNode);
-+    static css_err_t disableNode(GraphConfigNode *);
-+    friend GraphQueryManager;
-+};
-+} // namespace GCSS
-+#endif /* GCSS_ITEM_H_ */
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_keys.h b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
-new file mode 100644
-index 000000000000..fc428b8a9cce
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
-@@ -0,0 +1,139 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+GCSS_KEY_SECTION_START (NA, na, 0x0000)
-+GCSS_KEY (AE_STATS_SINK, ae_stats_sink)
-+GCSS_KEY (AF_STATS_SINK, af_stats_sink)
-+GCSS_KEY (AWB_STATS_SINK, awb_stats_sink)
-+GCSS_KEY (BASE_NODE, base_node)
-+GCSS_KEY (BASE_TYPE, base_type)
-+GCSS_KEY (BUFFER_SRC0, buffer_src0)
-+GCSS_KEY (COMPUTE_BLOCK, compute_block)
-+GCSS_KEY (CONNECTION, connection)
-+GCSS_KEY (CONTENT_TYPE, content_type)
-+GCSS_KEY (CONVERSION_GAIN, conversion_gain)
-+GCSS_KEY (CMC_TAG, cmc_tag)
-+GCSS_KEY (DEMUXER, demux)
-+GCSS_KEY (DESTINATION, destination)
-+GCSS_KEY (DOL_MODE, dol_mode)
-+GCSS_KEY (FLOW, flow)
-+GCSS_KEY (FORMAT, format)
-+GCSS_KEY (GRAPH, graph)
-+GCSS_KEY (GRAPHS, graphs)
-+GCSS_KEY (GRAPH_DESCRIPTOR, graph_descriptor)
-+GCSS_KEY (GRAPH_SETTINGS, graph_settings)
-+GCSS_KEY (HW, hw)
-+GCSS_KEY (INPUT, input)
-+GCSS_KEY (KERNEL, kernel)
-+GCSS_KEY (KERNEL_LINK, klink)
-+GCSS_KEY (MBR_DATA, mbr_data)
-+GCSS_KEY (METADATA, metadata)
-+GCSS_KEY (MODE_ID, mode_id)
-+GCSS_KEY (MUXER, mux)
-+GCSS_KEY (NAME, name)
-+GCSS_KEY (NODE, node)
-+GCSS_KEY (NODES, nodes)
-+GCSS_KEY (OUTPUT, output)
-+GCSS_KEY (PEER, peer)
-+GCSS_KEY (PORT, port)
-+GCSS_KEY (PROGRAM_GROUP, program_group)
-+GCSS_KEY (SENSOR, sensor)
-+GCSS_KEY (SENSOR_MODES, sensor_modes)
-+GCSS_KEY (PIXEL_ARRAY, pixel_array)
-+GCSS_KEY (BINNER, binner)
-+GCSS_KEY (SCALER, scaler)
-+GCSS_KEY (CSI_BE, csi_be)
-+GCSS_KEY (CSI_BE_DOL, csi_be_dol)
-+GCSS_KEY (CSI_BE_SOC, csi_be_soc)
-+GCSS_KEY (SENSOR_TYPE, sensor_type)
-+GCSS_KEY (SETTINGS, settings)
-+GCSS_KEY (SINK, sink)
-+GCSS_KEY (SOURCE, source)
-+GCSS_KEY (SPLITTER, split)
-+GCSS_KEY (STATIC, static)
-+GCSS_KEY (TARGET, target)
-+GCSS_KEY (TYPE, type)
-+GCSS_KEY (VALUE, value)
-+GCSS_KEY (CIPF, cipf)
-+GCSS_KEY (ATTRIBUTE, attribute)
-+GCSS_KEY (OPTIONS, options)
-+GCSS_KEY (APPLY, apply)
-+GCSS_KEY (TPG, tpg)
-+GCSS_KEY (SIMULATION, simulation)
-+GCSS_KEY (VERSION, version)
-+GCSS_KEY (FILE_NAME, file_name)
-+GCSS_KEY (RBM, rbm)
-+GCSS_KEY (DESCRIPTION, description)
-+GCSS_KEY (VIDEO_BPP, video_bpp)
-+GCSS_KEY (STILLS_BPP, stills_bpp)
-+GCSS_KEY (EXTERNAL_STAGE, external_stage)
-+GCSS_KEY (PDAF_TYPE, pdaf_type)
-+GCSS_KEY (SUBSYSTEM, subsystem)
-+GCSS_KEY (HW_BITMAPS, hw_bitmaps)
-+GCSS_KEY (DEB, deb)
-+GCSS_KEY (TEB, teb)
-+GCSS_KEY (REB, reb)
-+/* add new keys to this section above this line */
-+GCSS_KEY_SECTION_END (GENERIC_KEYS_END, generic_keys_end, 0x0FFF)
-+
-+/* do not add keys here! */
-+
-+/* NUMERICAL KEY DEFINITIONS */
-+GCSS_KEY_SECTION_START (NUMERICAL_START, num_start, 0x2000)
-+GCSS_KEY (ACTIVE_INPUT, active_input)
-+GCSS_KEY (ACTIVE_OUTPUTS, active_outputs)
-+GCSS_KEY (ACTIVE_OUTPUT, active_output)
-+GCSS_KEY (BINNING_H_FACTOR, h_factor)
-+GCSS_KEY (BINNING_V_FACTOR, v_factor)
-+GCSS_KEY (BOTTOM, bottom)
-+GCSS_KEY (BPP, bpp)
-+GCSS_KEY (BRANCH_POINT, branch_point)
-+GCSS_KEY (BYTES_PER_LINE, bpl)
-+GCSS_KEY (CONCURRENT, concurrent)
-+GCSS_KEY (DIRECTION, direction)
-+GCSS_KEY (DVS, dvs)
-+GCSS_KEY (ENABLED, enabled)
-+GCSS_KEY (EXEC_CTX_ID, exec_ctx_id)
-+GCSS_KEY (FLIP_H, flip_h)
-+GCSS_KEY (FLIP_V, flip_v)
-+GCSS_KEY (FPS, fps)
-+GCSS_KEY (FRAGMENT_COUNT, fragment_count)
-+GCSS_KEY (HEIGHT, height)
-+GCSS_KEY (ID, id)
-+GCSS_KEY (KEY, key)
-+GCSS_KEY (LEFT, left)
-+GCSS_KEY (LINK_ID, link_id)
-+GCSS_KEY (OPMODE, operation_mode)
-+GCSS_KEY (PAL_UUID, pal_uuid)
-+GCSS_KEY (PG_ID, pg_id)
-+GCSS_KEY (POWER_FACTOR, power_factor)
-+GCSS_KEY (PRIVATE, private)
-+GCSS_KEY (PSYS_FREQ, psys_frequency)
-+GCSS_KEY (RCB, rcb)
-+GCSS_KEY (RESTORE_POINT, restore_point)
-+GCSS_KEY (RIGHT, right)
-+GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
-+GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
-+GCSS_KEY (SINK_PORT, sink_port)
-+GCSS_KEY (STREAM_ID, stream_id)
-+GCSS_KEY (TNR, tnr)
-+GCSS_KEY (TOP, top)
-+GCSS_KEY (TUNING_MODE, tuning_mode)
-+GCSS_KEY (WIDTH, width)
-+/* add new keys to this section above this line */
-+GCSS_KEY_SECTION_END (NUMERICAL_END, num_end, 0x2FFF)
-+
-+/* do not add keys here, start a new section instead! */
-diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
-new file mode 100644
-index 000000000000..f17b6df66337
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef GCSS_UTILS_H_
-+#define GCSS_UTILS_H_
-+
-+#include "gcss.h"
-+#include <set>
-+#include <utility>
-+#include <string>
-+#include <limits>
-+#include "gcss_item.h"
-+
-+namespace GCSS {
-+/**
-+ * \enum GdfVersion
-+ * Enum to identify the different IPU versions
-+ */
-+enum GdfVersion {
-+    GDF_VERSION_NONE,
-+    GDF_VERSION_IPU4 = 4,
-+    GDF_VERSION_IPU5,
-+    GDF_VERSION_IPU6,
-+    GDF_VERSION_IPU7
-+};
-+/**
-+ * \class GraphCameraUtil
-+ * Class that holds utility functions to derive information from
-+ * GraphConfig container for Camera runtime.
-+ *
-+ * Utilities are separated from GraphConfig interface in order to
-+ * specialize the XML-schema that Camera runtime is dependent of
-+ * from the generic concept of graph information.
-+ *
-+ * These specializations include execCtxs, ports, execCtx edges
-+ * as well as sensor and imaging kernel details that are nested
-+ * in generic graph elements hierarchy.
-+ */
-+class GraphCameraUtil
-+{
-+public: // types
-+   /**
-+    * \struct PortDescriptor
-+    * Information of a port from an XML graph node
-+    */
-+    struct PortDescriptor {
-+        std::string    name;
-+        std::string    pgName;
-+        int32_t        direction;
-+        int32_t        enabled;
-+        uint32_t       terminalId; /**< Unique terminal id (is a fourcc code)
-+                                         this is relevant only when the node
-+                                         is a PG and then the port is a terminal */
-+        uint32_t        width;    /**< Width of the frame in pixels */
-+        uint32_t        height;   /**< Height of the frame in lines */
-+        std::string     format;   /**< Frame format name, use gcss_format
-+                                       utilities to query more information */
-+    };
-+
-+public:
-+    virtual ~GraphCameraUtil() {}
-+
-+    static const int32_t PORT_DIRECTION_INPUT = 0;
-+    static const int32_t PORT_DIRECTION_OUTPUT = 1;
-+    //pair of source and sink between either 2 pg, or 2 execution context.
-+    typedef std::pair<std::string, std::string> StreamConnection;
-+
-+    /*
-+     * Generic Dimensions prototype:
-+     *
-+     * Port-elements, kernels as well as sensor entities input and output
-+     * elements reuse the common dimensions prototype including
-+     *  GCSS_KEY_WIDTH, GCSS_KEY_HEIGHT, GCSS_KEY_BYTES_PER_LINE,
-+     *  GCSS_KEY_LEFT, GCSS_KEY_TOP, GCSS_KEY_RIGHT, GCSS_KEY_BOTTOM
-+     */
-+
-+    /**
-+     * Get width, height, bpl and cropping values from the given element
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] node the node to read the values from
-+     * \param[out] w width
-+     * \param[out] h height
-+     * \param[out] l left crop
-+     * \param[out] t top crop
-+     * \param[out] r right crop
-+     * \param[out] b bottom crop
-+     */
-+    static css_err_t getDimensions(const IGraphConfig *node,
-+                                   int32_t *w = NULL,
-+                                   int32_t *h = NULL,
-+                                   int32_t *l = NULL,
-+                                   int32_t *t = NULL,
-+                                   int32_t *r = NULL,
-+                                   int32_t *b = NULL);
-+
-+    /*
-+     * NODE-specialization
-+     */
-+    static IGraphConfig* nodeGetPortById(const IGraphConfig *node, int32_t id);
-+
-+    /*
-+     * PORT-specialization
-+     */
-+
-+    /**
-+     * Check if port is at the edge
-+     *
-+     * \ingroup gcss
-+     *
-+     * A port is at the edge of the video execCtx (pipeline) if its peer is in a PG
-+     * that has a different execCtxID (a.k.a. pipeline id) or if its peer is a
-+     * virtual sink.
-+     *
-+     * Here we check for both conditions and return true if this port is at either
-+     * edge of a pipeline
-+     * \param[in] port Reference to port Graph node
-+     * \return true if it is edge port
-+     */
-+    static bool isEdgePort(const IGraphConfig* port);
-+
-+    /**
-+     * Check if port is virtual
-+     *
-+     * \ingroup gcss
-+     *
-+     * Check if the port is a virtual port. this is the end point
-+     * of the graph. Virtual ports are the nodes of type sink.
-+     *
-+     * \param[in] port Reference to port Graph node
-+     * \return true if it is a virtual port
-+     * \return false if it is not a virtual port
-+     */
-+    static bool portIsVirtual(const IGraphConfig* port);
-+    /**
-+     * return child node full name, this is pg-name:child-name
-+     *
-+     * This makes the child name unique in the graph, because multiple
-+     * nodes may have children named same way (ex: input)
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port Reference to port Graph node
-+     * \return string with the full name
-+     */
-+    static std::string getFullName(const IGraphConfig &child);
-+
-+    /**
-+     * Return the port descriptor
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port
-+     * \param[out] descriptor
-+     * \return 0 if it is an input port
-+     * \return 1 if it is an output port
-+     */
-+    static css_err_t portGetDescriptor(const IGraphConfig* port,
-+                                       PortDescriptor &desc);
-+    /**
-+     * Return the port direction
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port
-+     * \return 0 if it is an input port
-+     * \return 1 if it is an output port
-+     */
-+    static int portGetDirection(const IGraphConfig* port);
-+
-+    /**
-+     * For a given port node it constructs the fourCC code used in the connection
-+     * object. This is constructed from the program group id.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] portNode
-+     * \param[out] stageId Fourcc code that describes the PG where this node is
-+     *                     contained
-+     * \param[out] terminalID Fourcc code that describes the port, in FW jargon,
-+     *                        this is a PG terminal.
-+     * \return css_err_none in case of no error
-+     * \return css_err_argument in case some error is found
-+     */
-+    static css_err_t portGetFourCCInfo(const IGraphConfig *portNode,
-+                                      ia_uid& stageId,
-+                                      uint32_t& terminalId);
-+
-+    /**
-+     * Retrieve the graph config node of the port that is connected to a given port.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port Node with the info of the port that we want to find its peer.
-+     * \param[out] peer Pointer to a node where the peer node reference will be
-+     *                  stored
-+     * \return css_err_none
-+     * \return css_err_argument if any of the graph settings is incorrect.
-+     */
-+    static css_err_t portGetPeer(const IGraphConfig* port, IGraphConfig** peer);
-+
-+    /**
-+     * Finds the stream id of the program group that the port is in.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port The port whose stream id is being returned
-+     * \return valid stream id, or -1 in case of error.
-+     */
-+    static int portGetStreamId(const IGraphConfig *port);
-+    /**
-+     * Finds the execCtx id of the program group that the port is in.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] port The port whose execCtx is being returned
-+     * \return valid execCtx id, or -1 in case of error.
-+     */
-+    static int portGetExecCtxId(const IGraphConfig *port);
-+    static int getExecCtxIds(const IGraphConfig &setting,
-+                             std::set<int32_t> &execCtxIds);
-+    static int getExecCtxIdsTuningMap(const IGraphConfig &settings,
-+                                      std::map<int32_t,int32_t> &execCtxIdsTuningMap);
-+    static int portGetKey(const IGraphConfig *port, ia_uid uid);
-+
-+    /**
-+    * Retrieves the basic information of a port. Uses the peer port (i.e. the
-+    * port connected to this one) to get the information if not found from the
-+    * given port.
-+    *
-+    * Returns an error if some of the information is missing unless it is a
-+    * private port.
-+    *
-+    * \ingroup gcss
-+    *
-+    * \param[in] port        Port to query the format.
-+    * \param[out] enabled    Passthrough, enabled or disabled status
-+    * \param[out] terminalId Unique terminal id
-+    */
-+    static css_err_t portGetInfo(const GCSS::IGraphConfig *port,
-+                                 uint32_t &enabled,
-+                                 uint32_t &terminalId);
-+
-+    /**
-+    * Retrieves the format information of a port. Uses the peer port (i.e. the
-+    * port connected to this one) to get the information if not found from the
-+    * given port.
-+    *
-+    * Returns an error if some of the information is missing unless it is a
-+    * private port.
-+    *
-+    * \ingroup gcss
-+    *
-+    * \param[in] port        Port to query the format.
-+    * \param[out] enabled    Passthrough, enabled or disabled status
-+    * \param[out] terminalId Unique terminal id
-+    * \param[out] width      Width of the frame in pixels
-+    * \param[out] height     Height of the frame in lines
-+    * \param[out] fourcc     Frame format
-+    * \param[out] bpl        Bytes per line
-+    * \param[out] bpp        Bits per pixel
-+    */
-+    static css_err_t portGetFormat(const GCSS::IGraphConfig *port,
-+                                   uint32_t &enabled,
-+                                   uint32_t &terminalId,
-+                                   uint32_t &width,
-+                                   uint32_t &height,
-+                                   uint32_t &fourcc,
-+                                   uint32_t &bpl,
-+                                   uint32_t &bpp);
-+
-+    /** Apply given format to output port
-+     *
-+     * \ingroup gcss
-+     *
-+     * Applies given format to the port that the sink is connected to.
-+     * The given format has to be present in the options list of the pg where the
-+     * port belongs to. If there is no options list for the pg, then no error is
-+     * returned and no format applied.
-+     *
-+     * \param[in] sink    Pointer to the sink in the graph.
-+     * \param[in] format  Name of the format that is being applied
-+     * \return css_err_none   in case of success
-+     * \return css_err_data   in case the given format is not in the options list
-+     */
-+    static css_err_t applyFormat(const IGraphConfig *sink,
-+                                 const std::string &format);
-+
-+    /**
-+     * SENSOR-specialization
-+     */
-+
-+    /**
-+     * Get binning factor values from the given node
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] node the node to read the values from
-+     * \param[out] hBin horizontal binning factor
-+     * \param[out] vBin vertical binning factor
-+     */
-+    static css_err_t sensorGetBinningFactor(const IGraphConfig *node,
-+                                           int &hBin, int &vBin);
-+
-+    /**
-+     * Get scaling factor values from the given node
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] node the node to read the values from
-+     * \param[out] scalingNum scaling ratio
-+     * \param[out] scalingDenom scaling ratio
-+     */
-+    static css_err_t sensorGetScalingFactor(const IGraphConfig *node,
-+                                           int &scalingNum,
-+                                           int &scalingDenom);
-+    /**
-+    * sensorGetType
-+    *
-+    * Returns the sensor type as a string. Sensor types are typically
-+    * BAYER, SVE, MD etc..
-+    * The input is a valid graph settings (output of createGraph)
-+    *
-+    * \param[in] settings
-+    * \param[out[ sensorType
-+    * \return css_err_argument if the inputs arguments are invalid
-+    * \return css_err_noentry if it could not find the sensor type
-+    * \return css_err_none if everything went ok.
-+    */
-+    static css_err_t sensorGetType(const IGraphConfig *settings,
-+                                   std::string &sensorType);
-+
-+    /**
-+    * Get content type
-+    *
-+    * By default if content_type tag is not found will return pixel_data
-+    *
-+    * \ingroup gcss
-+    *
-+    * \param[in] node the node to read the values from
-+    * \return content type string
-+    */
-+    static std::string portGetContentType(const IGraphConfig *node);
-+
-+    /**
-+     * Analyse all connections between execution context.
-+     * Generates 3 lists:
-+     * - list of pair of names of inter-connections between execution contexts
-+     * - list of input ports names associated with input streams
-+     * - list of output ports names associated with output streams
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] graphHandle pointer to any node in the graph
-+     * \param[out] connections set connections with edges pair
-+     * \param[out] pixel_sources pixel data sources
-+     * \param[out] pixel_sinks pixel data sinks
-+     */
-+    static css_err_t getExecCtxConnectionPorts(const IGraphConfig *graphHandle,
-+                                               std::vector<StreamConnection> &connections,
-+                                               std::vector<std::string> &pixel_sources,
-+                                               std::vector<std::string> &pixel_sinks);
-+    /**
-+     * Finds input ports for the given execCtx or stream id
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] uid key identifying whether the next value is a stream id or
-+     *                a exec ctx id.
-+     * \param[in] execCtxId id of the execCtx OR stream id
-+     * \param[in] graphHandle pointer to any node in the graph
-+     * \param[out] ports reference to a vector of IGraphConfig where to store the
-+     *                   found ports
-+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
-+     */
-+    static css_err_t getInputPorts(ia_uid uid,
-+                                   int32_t execCtxId,
-+                                   const IGraphConfig &graphHandle,
-+                                   std::vector<IGraphConfig *> &ports,
-+                                   ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
-+    /**
-+     * Finds output ports for the given execCtx or stream id
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] uid key identifying whether the next value is a stream id or
-+     *                a exec ctx id.
-+     * \param[in] execCtxId id of the execCtx OR stream id
-+     * \param[in] graphHandle pointer to any node in the graph
-+     * \param[out] ports reference to a vector of IGraphConfig where to store the
-+     *                   found ports
-+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
-+     */
-+    static css_err_t getOutputPorts(ia_uid uid,
-+                                    int32_t execCtxId,
-+                                    const IGraphConfig &graphHandle,
-+                                    std::vector<IGraphConfig *> &ports,
-+                                    ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
-+    /**
-+     * Finds input port for the given execCtx or stream id
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] uid key identifying whether the next value is a stream id or
-+     *                a exec ctx id.
-+     * \param[in] execCtxId id of the execCtx OR stream id
-+     * \param[in] graphHandle pointer to any node in the graph
-+     * \param[out] port input port
-+     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
-+     */
-+    static css_err_t getInputPort(ia_uid uid,
-+                                  int32_t execCtxId,
-+                                  const IGraphConfig *graphHandle,
-+                                  IGraphConfig **port,
-+                                  ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
-+
-+    /**
-+     * getSubgraphPorts
-+     *
-+     * For a given subgraph, specified via stream id or exec-ctx id, retrieve the
-+     * ports that cross subgraph boundaries.
-+     *
-+     * \ingroup gcss
-+     * \param[in] uid Key to specify whether we are looking for stream id or exec ctx
-+     *                ids input port. Possible values are GCSS_KEY_STREAM_ID or
-+     *                GCSS_KEY_EXEC_CTX_ID
-+     * \param[in] execCtxId Value of the stream/exec-ctx id
-+     * \param[in] direction Either PORT_DIRECTION_INPUT or PORT_DIRECTION_OUTPUT
-+     * \param[in] graphHandle Reference to the root node of the tree
-+     * \param[in] computeKey
-+     * \param[out] ports vector of pointers where to store the found port nodes.
-+     *
-+     * \return  css_err_argument in case of any of the input parameters being invalid
-+     *                           or in case it did not find any port.
-+     */
-+    static css_err_t getSubgraphPorts(ia_uid uid,
-+                                      int32_t execCtxId,
-+                                      int32_t direction,
-+                                      const IGraphConfig &graphHandle,
-+                                      std::vector<IGraphConfig *> &ports,
-+                                      ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
-+
-+    /**
-+     *
-+     * Retrieve a list of program groups that belong to a given execCtx id or
-+     * stream id.
-+     * Iterates through the graph configuration storing the program groups
-+     * that match this execCtx id into the provided vector.
-+     *
-+     * \param[in] uid Used to determine if we search the PG per stream-id or exec
-+     *                ctx-id
-+     * \param[in] value Depending on the key parameter this is the value of the
-+     *                  stream-id or execCtx-id to match.
-+     * \param[in] GCHandle Handle to get graph result.
-+     * \param[out] programGroups Vector with the nodes that match the criteria.
-+     */
-+    static css_err_t getProgramGroups(ia_uid uid,
-+                                     int32_t value,
-+                                     const GCSS::IGraphConfig *GCHandle,
-+                                     std::vector<IGraphConfig*> &pgs);
-+
-+    /**
-+     * Retrieve the number of kernels inside a PG
-+     *
-+     * \param[in] pgNode Pointer to a IGraphConfig node that represents a PG.
-+     * \param[out] kernelCount number of kernels found inside.
-+     */
-+    static css_err_t getKernelCountInPg(const GCSS::IGraphConfig *pgNode,
-+                                        uint32_t &kernelCount);
-+    /**
-+     * Helper function to get values from the kernel settings
-+     * \todo Moved to bxt aic utils, will be removed from here after hal has
-+     *       adapted to changes.
-+     * \ingroup gcss
-+     *
-+     * \param[in] kernelNode
-+     * \param[out] palUuid
-+     * \param[out] kernelId
-+     * \param[out] metadata
-+     * \param[out] enable
-+     * \param[out] rcb
-+     * \param[out] branchPoint
-+     */
-+    static css_err_t kernelGetValues(const IGraphConfig *kernelNode,
-+                                    int32_t *palUuid = NULL,
-+                                    int32_t *kernelId = NULL,
-+                                    uint32_t *metadata = NULL,
-+                                    int32_t *enable = NULL,
-+                                    int32_t *rcb = NULL,
-+                                    int32_t *branchPoint = NULL,
-+                                    int32_t *sinkPort = NULL);
-+
-+    /**
-+     * Return pointer to active source
-+     *
-+     * Graph descriptor may define multiple sources. This function returns
-+     * pointer to source node that is set active.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in]  settings,   pointer to gc graph
-+     * \param[out] sourceNode, vector of pointers to active sources
-+     */
-+    static css_err_t getSourceNode(const IGraphConfig *gcHandle,
-+            std::vector<IGraphConfig*> &sourceNodes);
-+
-+
-+    /**
-+    * Retrieve all the sinks in the current graph configuration that match the
-+    * input parameter string in their name attribute.
-+    *
-+    * If the name to match is empty it returns all the nodes of type sink
-+    *
-+    * \param[in] name String containing the name to match.
-+    * \param[in] gcHandle pointer to the graph
-+    * \param[out] sink List of sinks that match that name
-+    * \return css_err_none in case of success
-+    * \return css_err_noentry if no sinks were found in the graph config.
-+    * \return css_err_argument if graph config handle is nullptr
-+    */
-+    static css_err_t graphGetSinksByName(const std::string &name,
-+                                         const IGraphConfig *gcHandle,
-+                                         std::vector<IGraphConfig*> &sinks);
-+
-+    /**
-+     * Debug utils
-+     */
-+
-+    /**
-+     * Pretty print any recognized element: node, port, kernel
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] node of which name to print
-+     */
-+    static std::string print(const IGraphConfig *node);
-+
-+    /**
-+     * Dumps the whole tree of nodes and attributes.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param node Node to dump
-+     * \param depth Depth level of the dump. Default(whole tree) is 0
-+     */
-+    static void dumpNodeTree(const IGraphConfig* node, int depth = 0);
-+
-+    /**
-+     * Convert string containing a number to a binary blob.
-+     *
-+     * \ingroup gcss
-+     *
-+     * \param[in] str String containing a number in decimal or hex (prefix "0x").
-+     * \param[out] bytes Size of the new binary data in bytes.
-+     *
-+     * \return void* Pointer to the newly allocated binary data.
-+     *               The format is little-endian, least significant bytes first.
-+     *               Caller must free with IA_CIPR_FREE()
-+     */
-+    static void *numString2binary(const std::string &str, unsigned int *bytes = NULL);
-+
-+    /**
-+     * Process the attribute overrides tags in the graph.
-+     * The apply tag allows a graph to modify an attribute of a member node.
-+     * The syntax is:
-+     * <apply target="" value=""/>
-+     * - Target is the fully qualified name of the  attribute we want to override.
-+     *  By fully qualified we mean that it contains the names of all the nodes in the
-+     *  hierarchy until the attribute. The names are separated by colon (:).
-+     *   Ex, to change the attribute of a kernel the target  would be:
-+     *   "node:kernel:attribute"
-+     * - Value is the value to give the the attribute.
-+     *
-+     * Please note that this logic does not insert new attributes to a given node
-+     * it just modifies an existing. The parsing of the graph will fail if
-+     * the override tries to add a new attribute.
-+     *
-+     * This mechanism is useful to reduce the number of duplicated nodes that only
-+     * differ in a few attributes. This is the case for example for the 8/10 bpp
-+     * PSA node.
-+     *
-+     * \param[in] graphNode Node to the GDF graph
-+     * \param[out] result Node to the resulting tree of combining the settings with
-+     *                    the graph.
-+     *
-+     * \return css_err_none in case no error
-+     *         css_err_data in case the node or attribute are not present in the
-+     *                      current graph.
-+     */
-+    static css_err_t processGraphOverrides(GraphConfigNode& graphNode, GraphConfigNode& results);
-+};
-+
-+/**
-+ * \brief Rounds the given number up to the next power of 2
-+ *
-+ * Rounds given number up to the next power two. Up to number
-+ * of bits in 'unsigned int' type.
-+ *
-+ * \returns Value of 'a' rounded up to the next power of two.
-+ *          Zero in case of an overflow.
-+*/
-+inline unsigned ceil_pow2(unsigned a)
-+{
-+    // Maximum number of possible bit shifts, to avoid error situations
-+    const int maxNumShifts = std::numeric_limits<unsigned>::digits - 1;
-+
-+    unsigned result = 1;
-+    int shifts = 0;
-+    while (result < a && shifts <= maxNumShifts) {
-+        result <<= 1;
-+        ++shifts;
-+    }
-+
-+    if (shifts > maxNumShifts) {
-+        // Overflow, return zero.
-+        result = 0;
-+    }
-+
-+    return result;
-+}
-+
-+} // namespace GCSS
-+
-+#endif /* GCSS_UTILS_H_ */
-diff --git a/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
-new file mode 100644
-index 000000000000..092ce7f4dfb5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
-@@ -0,0 +1,152 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef GRAPH_QUERY_MANAGER_H
-+#define GRAPH_QUERY_MANAGER_H
-+
-+#include "gcss.h"
-+#include "gcss_item.h"
-+#include "gcss_utils.h"
-+
-+namespace GCSS {
-+
-+class GraphQueryManager
-+{
-+public:
-+    GraphQueryManager() : mStrictQuery(true),
-+                          mGS(nullptr),
-+                          mGD(nullptr),
-+                          mKey(-1){}
-+    ~GraphQueryManager(){}
-+
-+    typedef std::map<ItemUID, std::string> GraphQuery;
-+    typedef std::vector<IGraphConfig*> QueryResult;
-+
-+    /**
-+    * isInitialized
-+    *
-+    * \ingroup gcss
-+    *
-+    * Returns true if the object has been initialized correctly with valid
-+    * settings and descriptor
-+    *
-+    */
-+    bool isInitialized() { return (mGS != nullptr && mGD != nullptr); };
-+
-+    /**
-+     * Create graph
-+     *
-+     * \ingroup gcss
-+     *
-+     * Takes pointer to one of the settings found with queryGraphs and
-+     * returns full graph combined with graph descriptor.
-+     *
-+     * \param[in] settings
-+     * \param[out] result
-+     */
-+    css_err_t createGraph(IGraphConfig* settingsGraph, IGraphConfig** result);
-+
-+    /**
-+     * Destroy graph
-+     *
-+     * \ingroup gcss
-+     *
-+     * Needs to be called for each graph created with createGraph
-+     *
-+     * \param[in] graph
-+     *
-+     */
-+    static void destroyGraph(IGraphConfig* graph);
-+
-+    /**
-+    * Query graphs
-+    *
-+    * \ingroup gcss
-+    *
-+    * Query graph settings file for settings that matches search terms in
-+    * GraphQuery;
-+    *
-+    * \param[in] GraphQuery
-+    * \param[out] QueryResult
-+    * \param[optional | in] strict if true, all search terms has to match
-+    */
-+    css_err_t queryGraphs(const GraphQuery&,
-+                          QueryResult&,
-+                          bool strict = true);
-+    css_err_t queryGraphs(const GraphQuery&,
-+                          const QueryResult&,
-+                          QueryResult&,
-+                          bool strict = true);
-+
-+    /**
-+     * Set graph settings
-+     *
-+     * \ingroup gcss
-+     *
-+     * Set parsed graph settings to graph query manager for later use.
-+     *
-+     * \param[in] settings
-+     */
-+    void setGraphSettings(const IGraphConfig* settings);
-+
-+    /**
-+     * Set graph descriptor
-+     *
-+     * \ingroup gcss
-+     *
-+     * Set parsed graph descriptor to graph query manager for later use.
-+     *
-+     * \param[in] descriptor
-+     */
-+    void setGraphDescriptor(const IGraphConfig* descriptor);
-+private:
-+    css_err_t getGraph(GraphConfigNode*, GraphConfigNode*);
-+    bool mStrictQuery; /**< true by default. True = every search item has to match
-+                        false = at least one match */
-+    // Store parsed data into these containers, instead of using a single node
-+    const IGraphConfig *mGS; // graph settings
-+    const IGraphConfig *mGD; // graph descriptor
-+    int32_t mKey; // key of the selected setting
-+
-+    void goThroughSearchItems(const GraphQuery&, const IGraphConfig*, uint16_t&);
-+
-+    static css_err_t addSensorModeData(GraphConfigNode *sensorNode,
-+                                      GraphConfigNode *sensorModesNode,
-+                                      const std::string &sensorModeID);
-+    css_err_t getConnectionData(const std::string& source_connection,
-+                               const std::string& sink_connection,
-+                               GraphConfigNode *settings,
-+                               GraphConfigNode *ret_node);
-+    css_err_t getStaticConnectionData(const std::string& source_connection,
-+                                      const std::string& sink_connection,
-+                                      GraphConfigNode *ret_node);
-+    IGraphConfig *copyNodeToResult(IGraphConfig *descriptorNodes,
-+                                   ia_uid nodeId,
-+                                   GraphConfigNode* resultNode);
-+    css_err_t propagateIntAttribute(IGraphConfig *srcNode,
-+                                    IGraphConfig *dstNode,
-+                                    ia_uid attributeId);
-+    css_err_t propagateStrAttribute(IGraphConfig *srcNode,
-+                                    IGraphConfig *dstNode,
-+                                    ia_uid attributeId);
-+    css_err_t validateSettingsAgainstDescriptor();
-+    bool nodeHasBaseNode(IGraphConfig &graphNode, std::string &baseNodeName);
-+    IGraphConfig* constructNodeFromBase(IGraphConfig *derivedNode,
-+                                        std::string &baseName,
-+                                        IGraphConfig *gdfNodesRoot);
-+};
-+} // namespace
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/gcss/graph_utils.h b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
-new file mode 100644
-index 000000000000..ca58af8afb7c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
-@@ -0,0 +1,448 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#ifndef IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
-+#define IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
-+
-+#include <memory>
-+#include <functional>
-+#include <set>
-+
-+extern "C" {
-+#include "ia_isp_bxt_types.h"
-+}
-+#include "gcss.h"
-+#include "gcss_utils.h"
-+
-+namespace GCSS {
-+
-+
-+/**
-+ * \class GraphUtil
-+ *
-+ * This class implements similar functionality as BxtAicUtils. It is meant as
-+ * a replacement for IPU6 graphs that contain more explicit graph information.
-+ * It is then an internal implementation detail of BxtAicUtils that has more
-+ * capabilities.
-+ *
-+ * This class analyses the graph settings and creates a representation
-+ * of the graph and inner imaging graphs.
-+ *
-+ * This representation does not duplicate data, just stores it in a more
-+ * convenient way to perform graph operations.
-+ *
-+ * We need to separate conceptually the XML data stored in IGraphConfig containers
-+ * (that is also stored as a tree of nodes) from the actual graph that represents
-+ * the information stored, the graph that represents an imaging system.
-+ * For that we formalise the following concepts:
-+ * - Container graph: This is the graph made out of IGraphConfig nodes. It is a
-+ *   representation of the XML hierarchical structure. The information stored
-+ *   in this graph is a 1:1 mapping with the XML data. IGraphConfig methods
-+ *   helps us to traverse this graph and find information from the nodes (xml
-+ *   tags) and xml attributes.
-+ *
-+ * - Camera Graph: this is the graph that represents a camera subsystem. The nodes
-+ *   in this graph are sensor, buffer source/sinks and processing nodes like
-+ *   Program Groups (FW).
-+ *
-+ * - Imaging Graph: This is the graph that represents the image processing
-+ * nodes inside the camera graph processing nodes (ex: PG). The nodes of
-+ * this graph are imaging kernels (PAL/ATE), routing elements (mux/demux/split)
-+ * and also PG ports because one imaging graph may expand multiple PG's
-+ *
-+ * - Meta-graph: This is the graph made out of camera subgraphs. The Camera graph
-+ * may group its nodes in two different ways:
-+ *   - stream-id: this traditionally aligns with the video/still/IR pipes.
-+ *   - execution context id: This grouping is done to split the nodes in separate
-+ *   threads (execution contexts). Only used by CISU.
-+ *
-+ * Conceptually the last three graphs are nested, the metagraph is at the top,
-+ * then the camera graph and finally the imaging graph.
-+ *
-+ * The imaging graphs are split per subgraph id because the structures given to
-+ * PAL are also grouped by subgraph id, whatever this may be (stream-id or exec-ctx)
-+ *
-+ * The container graph is the data storage that is passed during the initialisation
-+ * of this class, but the other three graphs are now represented by the
-+ * following member variables of this class:
-+ * - Camera Graph: mGraphNodes
-+ * - MetaGraph : mSubGraphInfoMap
-+ * - Imaging Graph: inside a a subgraph info map entry as imagingGraph.
-+ *
-+ * All the nodes of these three graphs derived from the same base struct that
-+ * contains the needed fields to traverse those graphs in topological order.
-+ * This is, a bi-directional adjacently list.
-+ * With this representation it is very easy to perform any type of operation in
-+ * topological order. We use the same algorithm (Graph Depth First) implemented
-+ * in method traverseGraph with different visitor functions.
-+ * Same scheme can be used at any of those 3 levels.
-+ *
-+ * At the moment the visitors are used for:
-+ * - Dumping information in traces for each node (for the 3 graphs)
-+ * - Calculating the resolution history of the imaging kernels
-+ * - detecting subgraph boundaries at the camera graph
-+ *
-+ * Any new operation on the graph only requires a new visitor function at the
-+ * correct level of detail (meta-graph, graph or imaging-graph)
-+ *
-+ */
-+class GraphUtil
-+{
-+public:
-+    GraphUtil();
-+    ~GraphUtil();
-+    /**
-+     * Initialise the GraphUtils class.
-+     * During this call the class will analyse the graph settings and create
-+     * structures to store the information of the imaging kernels found.
-+     * It creates
-+     * \param[in] subgraphType either GCSS_KEY_STREAM_ID or GCSS_ID_EXEC_CTX
-+     *                         It determines what type of subgraph will be used
-+     *                         to group the kernels.
-+     * \param[in] ipuVer IPU version
-+     *
-+     * \param[out] gcHandle Pointer to a IGraphConfig Object that represents
-+     *                      some graph-settings.
-+     * \return css_err_none if everything is fine
-+     * \return css_err_no_memory if there is some problem allocating the new
-+     *                           structures.
-+     * \return css_err_internal if there is some problem with the graph settings
-+     *                          being analysed
-+     */
-+    css_err_t init(ia_uid subgraphType, const IGraphConfig *gcHandle,
-+                   GdfVersion ipuVer = GdfVersion::GDF_VERSION_IPU6);
-+
-+    /* Query methods */
-+    /**
-+     * isInitialized
-+     * returns true if the class was initialised with some settings
-+     */
-+    inline bool isInitialized() { return (mGraphSettings != nullptr); }
-+    /**
-+     * Get program group by execution context Id or stream id
-+     *
-+     *
-+     * Fills the provided structure with the relevant data for that subgraph
-+     * id provided. This id needs to be align with the construction time parameter.
-+     * i.e. you cannot construct this object with GCSS_KEY_STREAM_ID and then
-+     * pass a execution ctx id to this method.
-+     *
-+     * The granularity of the subgraphs is different and it should match the
-+     * granularity of the AIC execution.
-+     *
-+     * \param[in] subgraphId A stream id (or exec Ctx) of the program group
-+     *                      being requested.
-+     *                      The concrete value needs to be in sync with the input
-+     *                      parameter during initialisation call.
-+     * \param[out] pg reference to a program group struct being populated
-+     *
-+     * \return css_err_none if everything is fine.
-+     * \return css_err_data if the subgraph does not contain any subgraphs with
-+     *                      the requested id.
-+     */
-+    css_err_t getAicData(int32_t subgraphId, ia_isp_bxt_program_group &pg);
-+
-+    /**
-+    * Get the AIC PG info from a IGraphConfig PG node.
-+    * The PG node must be part of the settings that where used to initialize this
-+    * instance.
-+    *
-+    * \param[in] pgNode A IGraphConfig Node that represents the PG whose kernels
-+    *                   we want to retrieve.
-+    * \param[out] pg reference to a program group struct being populated
-+    *
-+    * \return css_err_none if everything is fine.
-+    * \return css_err_data if the PG is not in the settings used during initialization
-+    */
-+    css_err_t getPgAicData(const IGraphConfig *pgNode, ia_isp_bxt_program_group &pg);
-+
-+    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history) {
-+        history = mSourceHistory;
-+        return css_err_none;
-+    };
-+    /**
-+     * Debugging tool to dump to error traces the AIC structures of the given
-+     * subgraph id.
-+     * \param[in] subgraphId
-+     */
-+    void dumpKernels(int32_t subgraphId);
-+
-+private: // types
-+    /**
-+     * \struct KernelInfoMemPool
-+     * structure to associate the array of run kernel structs for each
-+     * subgraph-id or PG,
-+     * and the resolution info structures allocated for each kernel.
-+     * Each kernel needs two, the size of these vector should
-+     * match the number of kernels in a given subgraph-id.
-+     * This struct is used only for memory management purposes (allocate/free).
-+     * We need this for two reasons:
-+     * - because the structure ia_isp_bxt_run_kernels_t has pointers to two
-+     *   structures of type ia_isp_bxt_resolution_info_t that may be null.
-+     * - because the interface of AIC requires a C-style array of run kernels
-+     *   structures
-+     */
-+    struct KernelInfoMemPool {
-+           ia_isp_bxt_run_kernels_t *runKernels;
-+           size_t kernelCount;
-+           std::vector<ia_isp_bxt_resolution_info_t *> resHistorys;
-+           std::vector<ia_isp_bxt_resolution_info_t *> resInfos;
-+    };
-+    /**
-+     * \enum
-+     * Type of the inner graph nodes
-+     */
-+    enum ImagingNodeType {
-+            IMAGING_NODE_KERNEL,
-+            IMAGING_NODE_MUX,
-+            IMAGING_NODE_DEMUX,
-+            IMAGING_NODE_SPLIT,
-+            IMAGING_NODE_PG_PORT_IN,
-+            IMAGING_NODE_PG_PORT_OUT,
-+            IMAGING_NODE_NONE
-+    };
-+    /**
-+     * \struct BaseGraphNode
-+     * Base structure that is used for the three types of nodes that
-+     * the camera graph has at different levels
-+     * Top level meta-graph made out of subgraphs
-+     * Medium level graph made out of sources, PG's, sink etc..
-+     * Inner graph that represent the imaging elements inside the Program Group
-+     * nodes the inner graph is made out of kernels, mux/demux and ports of the
-+     * PG's
-+     * This structure has the basics to traverse the graph in any direction
-+     * using standard graph traversal algorithms.
-+     */
-+
-+    struct BaseGraphNode {
-+        std::string name;
-+        IGraphConfig* data;
-+        bool visited;
-+        std::map<BaseGraphNode*, std::string > parents;
-+        std::map<BaseGraphNode*, std::string> children;
-+        BaseGraphNode(): data(nullptr), visited(false) {}
-+        void addParent(BaseGraphNode *p, std::string pinId) {
-+            parents.insert(std::pair<BaseGraphNode*, std::string>(p, pinId));
-+        }
-+        void addChild(BaseGraphNode *c, std::string pinId) {
-+            children.insert(std::pair<BaseGraphNode*, std::string>(c, pinId));
-+        }
-+        void removeChild(BaseGraphNode *c) {
-+            auto it = children.find(c);
-+            if (it != children.end()) {
-+                children.erase(it);
-+            }
-+        }
-+        void removeParent(BaseGraphNode *p) {
-+            auto it = parents.find(p);
-+            if (it != parents.end()) {
-+                parents.erase(it);
-+            }
-+        }
-+        void emanzipate() {
-+            for (auto &p : parents) {
-+                p.first->removeChild(this);
-+            }
-+            for (auto &c : children) {
-+                c.first->removeParent(this);
-+            }
-+        }
-+    };
-+
-+    struct GraphNode : public BaseGraphNode {
-+        ia_uid type;    /**<GCSS_KEY_HW, GCSS_KEY_PROGRAM_GROUP, GCSS_KEY_SINK */
-+        int32_t streamId;
-+        int32_t exeCtxId;
-+        GraphNode(): BaseGraphNode(),
-+                     type(GCSS_KEY_PROGRAM_GROUP),
-+                     streamId(-1),
-+                     exeCtxId(-1){}
-+    };
-+    typedef std::shared_ptr<GraphNode> GraphNodePtr;
-+
-+    enum ImagingNodeFlags {
-+        IMAGING_NODE_FLAG_NONE,
-+        IMAGING_NODE_FLAG_RCB            = (0x1 << 0),      /*<! if this imaging node kernel is a Resolution Changing Block or not*/
-+        IMAGING_NODE_FLAG_PRIVATE_PORT   = (0x1 << 1),
-+        IMAGING_NODE_FLAG_DISABLED       = (0x1 << 2),  /*<! This flag has the same meaning as the kernel enabled field, but is generic for all types of imaging nodes */
-+        IMAGING_NODE_FLAG_MAX            = (0x1 << 3)
-+    };
-+    /**
-+     * \struct ImagingNode
-+     * Node in the pipe of imaging elements (kernels)
-+     * This struct is used to create a graph of nodes and perform operations
-+     * in topological order, like the resolution history calculation.
-+     * The information of the links is derived from kernel links(klink)
-+     * The resolution history used for the run_kernel struct is usually filled
-+     * from the parent. The modifications of the history from this node
-+     * are stored in the member nextresolutionHistory. They are meant for the children
-+     * nodes.
-+     * In order to suport kernels with more than 1 child we have the resoltuion
-+     * info and nextresolutionHistory as vectors, one per output klink
-+     */
-+    struct ImagingNode : public BaseGraphNode {
-+        ImagingNodeType type;
-+        int32_t flags;
-+        std::map<std::string, ia_isp_bxt_resolution_info_t> resolutionInfo;  /*<! resolution info for each of the outputs of this kernel, key is kernel output pin name */
-+        std::map<std::string, ia_isp_bxt_resolution_info_t> nextResolutionHistory; /*<! resolution history for the NEXT kernels (children nodes) ,  key is kernel output pin name*/
-+        ia_isp_bxt_resolution_info_t currentHistory;
-+        ia_isp_bxt_run_kernels_t kernelInfo; /*<! local copy used for temporary operations */
-+        ia_isp_bxt_run_kernels_t *outKInfo; /*<! preallocated run_kernels for output towards AIC.*/
-+        int32_t routingActivePath; /*<! In case this node is a routing element (mux/demux) this member stores the active input/output */
-+        ImagingNode();
-+    };
-+    typedef std::shared_ptr<ImagingNode> ImagingNodePtr;
-+
-+    /**
-+     * \struct SubGraphInfo
-+     * Container for the information of a single subgraph.
-+     * The type of subgraph can be stream-id or exec-ctx.
-+     * It can be also considered a node of a meta-graph made out of subgraphs.
-+     */
-+    struct SubGraphInfo : public BaseGraphNode {
-+        ia_uid subgraphType;  /**< gcss key for exec-ctx or stream-id */
-+        int32_t id;           /**< id fo the subgraph */
-+        /**< if the subgraph type is stream id this value is the same as id,
-+         * if subgraph type is execution context then this value is the stream
-+         * id of all the nodes inside the subgraph, there cannot be more than 1
-+         **/
-+        int32_t streamId;
-+        uint32_t ispTuningMode;
-+        std::vector<GraphNode*> nodes;
-+        std::vector<IGraphConfig*> pgs;
-+        std::vector<IGraphConfig*> inputPorts;
-+        std::vector<IGraphConfig*> outputPorts;
-+        size_t kernelCount;
-+        ia_isp_bxt_run_kernels_t *kernelMemory;
-+        std::map<std::string, ImagingNodePtr> imagingGraph;
-+        SubGraphInfo() : BaseGraphNode(),
-+                         subgraphType(GCSS_KEY_STREAM_ID),
-+                         id(0), streamId(-1),
-+                         ispTuningMode(0),kernelCount(0),
-+                         kernelMemory(nullptr) {}
-+    };
-+    typedef std::shared_ptr<SubGraphInfo> SubGraphInfoPtr;
-+
-+    struct KernelLink {
-+        KernelLink(IGraphConfig &kl);
-+        bool isSrcAPort() { return srcPin.empty(); }
-+        bool isDstAPort() { return dstPin.empty(); }
-+        std::string toStr() { return srcNode + ":" + srcPin + "->" + dstNode + ":" + dstPin; }
-+        std::string srcNode;
-+        std::string srcPin;
-+        std::string dstNode;
-+        std::string dstPin;
-+    };
-+private: //methods
-+    css_err_t analyzeGraphSettings();
-+    css_err_t allocateAicData();
-+    void deleteAicStructs();
-+    css_err_t populateAicData();
-+    css_err_t removeUnusedNodes();
-+    css_err_t disableKernelsToDisabledTerminals(SubGraphInfo &sgInfo);
-+    css_err_t analyzeSubGraphs(std::map<int32_t, SubGraphInfoPtr> &infoMap);
-+    css_err_t addGraphNode(IGraphConfig &node);
-+    css_err_t addGraphConnection(IGraphConfig &node);
-+    css_err_t addImagingNode(SubGraphInfo& sgInfo, IGraphConfig& kernel, std::string pgName);
-+    css_err_t addImagingLink(SubGraphInfo &ctxInfo, IGraphConfig &klink,
-+                             IGraphConfig &pg);
-+    css_err_t addRoutingNode(SubGraphInfo &sgInfo, IGraphConfig &routing,
-+                             ImagingNodeType type, std::string pgName);
-+    css_err_t collectPgInnerGraph(SubGraphInfo &sgi, IGraphConfig &pg);
-+    css_err_t collectSourceInnerGraph(SubGraphInfo &sgi);
-+    css_err_t collectInterPgConnections(SubGraphInfo &sgi);
-+    css_err_t collectSubgraphConnections();
-+    css_err_t traverseGraph(BaseGraphNode *item,
-+                            std::function<css_err_t(BaseGraphNode*)> &f,
-+                            bool forward = true);
-+    css_err_t getDownstreamSubgraphs(IGraphConfig *src,
-+                                    std::vector<int32_t> &subgraphIds);
-+    css_err_t calculateSourceResHistory(SubGraphInfo &sgi,
-+                                       ia_isp_bxt_resolution_info_t &resHistory);
-+    css_err_t fillAicRunKernels(SubGraphInfo &sgi);
-+    css_err_t getUpstreamResHistory(ImagingNode &portNode);
-+    css_err_t getCrossSgInPorts(GraphNode &node,
-+                                std::vector<IGraphConfig *> &ports);
-+    css_err_t getParentHistory(ImagingNode &child,
-+                               ia_isp_bxt_resolution_info_t &parentHistory);
-+    css_err_t getKernelResolutionInfos(ImagingNode &kNode);
-+    css_err_t disableDisconnectedKernels(SubGraphInfo &sgi);
-+    void getAvailableSubgraphs(std::set<int32_t> &ids);
-+    void resetGraph();
-+    void resetInnerGraph(SubGraphInfo &sgi, bool reportUnvisited = true);
-+    void resetMetaGraph();
-+    css_err_t subgraphConnectionVisitor(BaseGraphNode *n);
-+    css_err_t resHistoryCalcVisitor(BaseGraphNode *n);
-+    css_err_t resHistoryINodeVisitor(BaseGraphNode *n);
-+    css_err_t kernelDisableVisitor(BaseGraphNode *n, bool forward = false);
-+    css_err_t kernelDisconectedVisitor(BaseGraphNode *n, bool forward = false);
-+    css_err_t activeNodeVisitor(BaseGraphNode *n, std::vector<std::string> *nodes);
-+    css_err_t getUnvisitedInputPortsPeers(SubGraphInfo &sgi, std::vector<ImagingNode*> &internalInputPeers);
-+    // Debug utils
-+    void dumpSubGraphInfos();
-+    void dumpInnerGraph(int32_t id);
-+    void dumpOuterGraph();
-+    void dumpAicStructs();
-+    static css_err_t dumpInnerNodeVisitor(BaseGraphNode *item, ImagingNodeType type);
-+    static css_err_t printOuterNode(BaseGraphNode *item);
-+private: // members
-+    const IGraphConfig *mGraphSettings;
-+    ia_uid mSubgraphType;   /**< GCSS_KEY_STREAM_ID, GCSS_KEY_EXEC_CTX_ID */
-+    ia_isp_bxt_resolution_info_t mSourceHistory;
-+
-+    /**
-+     * map with the Info for each subgraph, the key is the subgraph id.
-+     * The concrete subrgraph type is passed in the constructor
-+     * we can use stream-id or execution-context-id
-+     * The inner graphs are stored in the SubgraphInfo structure
-+     */
-+    std::map<int32_t, SubGraphInfoPtr> mSubgraphInfoMap;
-+
-+    /**
-+     * outer graph as represented by the lighter GraphNode structures.
-+     * The key is the name of the node.
-+     */
-+    std::map<std::string, GraphNodePtr> mGraphNodes;
-+    std::vector<IGraphConfig*> mConnections;
-+    /**
-+     * map used to store the memory for the AIC structs associated with a given
-+     * subgraph id. The key of the map is the subgraph-id
-+     * This map is used only for memory management (alloc/free).
-+     * The arrays stored here are used via the SubgraphInfo::kernelMemory field
-+     */
-+    std::map<int32_t, KernelInfoMemPool> mKernelMemoryMap;
-+    /**
-+    * map used to store the memory for the AIC structs associated with a given
-+    * PG id. The key of the map is the IGraphConfig Node address that represents
-+    * each node.
-+    * This map is used only for memory management (alloc/free).
-+    */
-+    std::map<const IGraphConfig*, KernelInfoMemPool> mPGKernelMemoryMap;
-+    /**
-+     * IPU version
-+     */
-+    GCSS::GdfVersion mIpuVer;
-+    /**
-+     * if IPU version is < than 7 the computeKey is GCSS_KEY_PROGRAM_GROUP
-+     * in IPU7 the concept of PG was replace with compute blocks. in this
-+     * case the mComputeKeyUid id GCSS_KEY_COMPUTE_BLOCK
-+     */
-+    ia_uid mComputeKeyUid;
-+};
-+
-+} //namespace GCSS
-+
-+
-+#endif /* IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
-new file mode 100644
-index 000000000000..06b4f254c13f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
-@@ -0,0 +1,409 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPF_TYPES_H_
-+#define _IA_CIPF_TYPES_H_
-+
-+#include <ia_tools/ia_list.h>
-+#include <ia_tools/css_types.h>
-+
-+/** \file ia_cipf_types.h
-+ *
-+ * Definitions for datatypes used with public CIPF interfaces
-+ *
-+ * \ingroup ia_cipf
-+ *
-+ * Includes opaque CIPF objects and types for data management
-+ */
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct _cipf_terminal ia_cipf_terminal_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct _cipf_container ia_cipf_container_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct _cipf_connection ia_cipf_connection_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_registry ia_cipf_registry_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct _cipf_property ia_cipf_property_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct _cipf_stage ia_cipf_stage_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef css_err_t (*ia_cipf_stage_completion_op_t)(ia_cipf_stage_t*, void *priv);
-+
-+/** ia_cipf_iterator_t - context of single pipeline iteration
-+ *
-+ * \ingroup ia_cipf
-+ *
-+ * Iterator object holds accessors (<stage, container>-pairs called parcels)
-+ * for pipeline components associated with single execution step. Amount of
-+ * stages and terminals within single execution step may vary based on
-+ * DAG definition.
-+ */
-+typedef struct ia_cipf_iterator ia_cipf_iterator_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_pipe ia_cipf_pipe_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef uint32_t ia_uid;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+#define ia_fourcc(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
-+                              | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
-+
-+ /**
-+ * \ingroup ia_cipf
-+ * macro used to print in traces the fourcc values
-+ * firs macro is used to define the format.
-+ */
-+#define ia_fourcc_conv "%c%c%c%c"
-+#define ia_fourcc_to_conv(fourcc) \
-+        ((fourcc) >> 24) & 0x7f, ((fourcc) >> 16) & 0x7f,\
-+        ((fourcc) >> 8) & 0x7f, (fourcc) & 0x7f
-+
-+typedef struct log_context log_context_t;
-+
-+/*
-+ * \todo Add documentation where do the format definitions come from
-+ * and/or how are they defined.
-+ */
-+
-+/* Native UID definitions for fourcc pixel formats */
-+#define ia_cipf_frame_fourcc_i420 ia_fourcc('V','4','2','0')
-+#define ia_cipf_frame_fourcc_iyuv ia_fourcc('I','Y','U','V') /* YUV420 planar */
-+#define ia_cipf_frame_fourcc_yv12 ia_fourcc('Y','V','1','2') /* YUV420 planar U and V reversed */
-+#define ia_cipf_frame_fourcc_ciyuv ia_fourcc('C','I','Y','U') /* YUV420 planar 8bpe, compressed */
-+#define ia_cipf_frame_fourcc_p01y ia_fourcc('P','0','1','Y') /* YUV420 planar 10bpp, compressed */
-+#define ia_cipf_frame_fourcc_c420 ia_fourcc('C','4','2','0') /* YUV420 planar, 16bpe compressed */
-+#define ia_cipf_frame_fourcc_m420 ia_fourcc('M','4','2','0') /* YUV420 semi-planar line interleaved */
-+#define ia_cipf_frame_fourcc_nv12 ia_fourcc('N','V','1','2')
-+#define ia_cipf_frame_fourcc_p412 ia_fourcc('P','4','1','2') /*YUV420 planar 12bpp */
-+#define ia_cipf_frame_fourcc_cnv12_tnr ia_fourcc('C','T','1','2') /* Compressed planar NV12, for TNR input/output */
-+#define ia_cipf_frame_fourcc_cnv12 ia_fourcc('C','N','1','2') /* Compressed semi-planar NV12,  */
-+#define ia_cipf_frame_fourcc_pc10 ia_fourcc('P','C','1','0') /* Compressed semi-planar P010 MSB  */
-+#define ia_cipf_frame_fourcc_pc12 ia_fourcc('P','C','1','2') /* Compressed semi-planar P012 MSB  */
-+#define ia_cipf_frame_fourcc_nv21 ia_fourcc('N','V','2','1')
-+#define ia_cipf_frame_fourcc_nv16 ia_fourcc('N','V','1','6')
-+#define ia_cipf_frame_fourcc_yuy2 ia_fourcc('Y','U','Y','2')
-+#define ia_cipf_frame_fourcc_ba10 ia_fourcc('B','A','1','0')
-+#define ia_cipf_frame_fourcc_rg10 ia_fourcc('R','G','1','0')
-+#define ia_cipf_frame_fourcc_bg10 ia_fourcc('B','G','1','0')
-+#define ia_cipf_frame_fourcc_gb10 ia_fourcc('G','B','1','0')
-+#define ia_cipf_frame_fourcc_gr08 ia_fourcc('G','R','0','8')
-+#define ia_cipf_frame_fourcc_gr10 ia_fourcc('G','R','1','0')
-+#define ia_cipf_frame_fourcc_grbg ia_fourcc('G','R','B','G')
-+#define ia_cipf_frame_fourcc_rggb ia_fourcc('R','G','G','B')
-+#define ia_cipf_frame_fourcc_bggr ia_fourcc('B','G','G','R')
-+#define ia_cipf_frame_fourcc_gbrg ia_fourcc('G','B','R','G')
-+#define ia_cipf_frame_fourcc_y800 ia_fourcc('Y','8','0','0')
-+#define ia_cipf_frame_fourcc_tile ia_fourcc('T','I','L','E') /* NV12 tiled TileYUV420_8_SP */
-+#define ia_cipf_frame_fourcc_cile ia_fourcc('C','I','L','E') /* NV12 tiled, compressed TileYUV420_8_SP_C */
-+#define ia_cipf_frame_fourcc_bin8 ia_fourcc('B','I','N','8')
-+#define ia_cipf_frame_fourcc_uyvy ia_fourcc('U','Y','V','Y')
-+#define ia_cipf_frame_fourcc_srgb48 ia_fourcc('S','R','4','8')
-+#define ia_cipf_frame_fourcc_yuv420_16_pl ia_fourcc('S','4','2','0')
-+#define ia_cipf_frame_fourcc_yuv444_8_pl ia_fourcc('N','A','N','A')
-+#define ia_cipf_frame_fourcc_yuv420_8_sp_c_tnr ia_fourcc('C','T','1','2')
-+#define ia_cipf_frame_fourcc_yuv420_16_sp ia_fourcc('P','0','1','6')
-+
-+/* pdaf bayer formats */
-+#define ia_cipf_frame_fourcc_pafn ia_fourcc('P','A','F','n')
-+#define ia_cipf_frame_fourcc_pafi ia_fourcc('P','A','F','i')
-+#define ia_cipf_frame_fourcc_paf_08 ia_fourcc('P','F','8','n')
-+#define ia_cipf_frame_fourcc_paf_10 ia_fourcc('P','F','1','n')
-+#define ia_cipf_frame_fourcc_paf_12 ia_fourcc('P','F','2','n')
-+#define ia_cipf_frame_fourcc_paf_14 ia_fourcc('P','F','4','n')
-+#define ia_cipf_frame_fourcc_paf_16 ia_fourcc('P','F','6','n')
-+
-+#define ia_cipf_frame_fourcc_paf_08i ia_fourcc('P','F','8','i')
-+#define ia_cipf_frame_fourcc_paf_10i ia_fourcc('P','F','1','i')
-+#define ia_cipf_frame_fourcc_paf_12i ia_fourcc('P','F','2','i')
-+#define ia_cipf_frame_fourcc_paf_14i ia_fourcc('P','F','4','i')
-+#define ia_cipf_frame_fourcc_paf_16i ia_fourcc('P','F','6','i')
-+
-+#define ia_cipf_frame_fourcc_ba12 ia_fourcc('B','A','1','2')
-+
-+/* CSS format fourcc codes for export */
-+#define css_fourcc_raw                  ia_fourcc('C','S','B','A')
-+
-+/* Vectorized Bayer formats */
-+#define css_fourcc_bggr_10_v32          ia_fourcc('b','V','0','E')
-+#define css_fourcc_gbrg_10_v32          ia_fourcc('b','V','0','F')
-+#define css_fourcc_grbg_10_v32          ia_fourcc('b','V','0','G')
-+#define css_fourcc_rggb_10_v32          ia_fourcc('b','V','0','H')
-+#define css_fourcc_bggr_12_v32          ia_fourcc('b','V','0','I')
-+#define css_fourcc_gbrg_12_v32          ia_fourcc('b','V','0','J')
-+#define css_fourcc_grbg_12_v32          ia_fourcc('b','V','0','K')
-+#define css_fourcc_rggb_12_v32          ia_fourcc('b','V','0','L')
-+
-+/* Not actually raw interleaved format but 12 bit vectorized GRBG bayer. Wrong
-+ * naming but is still used in HAL.
-+ ** \todo Remove this definition once there are no more dependencies */
-+#define css_fourcc_raw_interleaved      css_fourcc_grbg_12_v32
-+
-+/* Packed vectorized Bayer formats */
-+#define css_fourcc_bggr_10_v32_p64      ia_fourcc('b','V','0','M')
-+#define css_fourcc_gbrg_10_v32_p64      ia_fourcc('b','V','0','N')
-+#define css_fourcc_grbg_10_v32_p64      ia_fourcc('b','V','0','O')
-+#define css_fourcc_rggb_10_v32_p64      ia_fourcc('b','V','0','P')
-+#define css_fourcc_bggr_12_v32_p64      ia_fourcc('b','V','0','Q')
-+#define css_fourcc_gbrg_12_v32_p64      ia_fourcc('b','V','0','R')
-+#define css_fourcc_grbg_12_v32_p64      ia_fourcc('b','V','0','S')
-+#define css_fourcc_rggb_12_v32_p64      ia_fourcc('b','V','0','T')
-+
-+/* Packed Normal Bayer Formats */
-+#define css_fourcc_bggr_14_p64          ia_fourcc('p','B','E','E')
-+#define css_fourcc_gbrg_14_p64          ia_fourcc('p','G','E','E')
-+#define css_fourcc_grbg_14_p64          ia_fourcc('p','g','E','E')
-+#define css_fourcc_rggb_14_p64          ia_fourcc('p','R','E','E')
-+#define css_fourcc_bggr_12_p64          ia_fourcc('p','B','C','C')
-+#define css_fourcc_gbrg_12_p64          ia_fourcc('p','G','C','C')
-+#define css_fourcc_grbg_12_p64          ia_fourcc('p','g','C','C')
-+#define css_fourcc_rggb_12_p64          ia_fourcc('p','R','C','C')
-+#define css_fourcc_bggr_10_p64          ia_fourcc('p','B','A','A')
-+#define css_fourcc_gbrg_10_p64          ia_fourcc('p','G','A','A')
-+#define css_fourcc_grbg_10_p64          ia_fourcc('p','g','A','A')
-+#define css_fourcc_rggb_10_p64          ia_fourcc('p','R','A','A')
-+
-+/* Line interleaved formats */
-+#define css_fourcc_bggr_10_li           ia_fourcc('C','S','L','0')
-+#define css_fourcc_gbrg_10_li           ia_fourcc('C','S','L','1')
-+#define css_fourcc_grbg_10_li           ia_fourcc('C','S','L','2')
-+#define css_fourcc_rggb_10_li           ia_fourcc('C','S','L','3')
-+#define css_fourcc_bggr_12_li           ia_fourcc('C','S','L','4')
-+#define css_fourcc_gbrg_12_li           ia_fourcc('C','S','L','5')
-+#define css_fourcc_grbg_12_li           ia_fourcc('C','S','L','6')
-+#define css_fourcc_rggb_12_li           ia_fourcc('C','S','L','7')
-+
-+/* Compressed bayer formats */
-+#define css_fourcc_bggr_8_c             ia_fourcc('B','G','8','C')
-+#define css_fourcc_gbrg_8_c             ia_fourcc('G','B','8','C')
-+#define css_fourcc_grbg_8_c             ia_fourcc('G','R','8','C')
-+#define css_fourcc_rggb_8_c             ia_fourcc('R','G','8','C')
-+#define css_fourcc_bggr_10_c            ia_fourcc('B','G','1','C')
-+#define css_fourcc_gbrg_10_c            ia_fourcc('G','B','1','C')
-+#define css_fourcc_grbg_10_c            ia_fourcc('G','R','1','C')
-+#define css_fourcc_rggb_10_c            ia_fourcc('R','G','1','C')
-+
-+/* YUV formats */
-+#define css_fourcc_internal_yuv_line    ia_fourcc('C','S','Y','C')
-+#define css_fourcc_yyuv420_v32          ia_fourcc('y','0','3','2')
-+#define css_fourcc_yyuv420_12_v32_p64   ia_fourcc('y','0','3','6')
-+#define css_fourcc_yuv420_internal      ia_fourcc('C','S','Y','I') /* denotes all YUVs with bpe 8, for TNR, for example */
-+#define css_fourcc_yplanar              ia_fourcc('C','S','Y','P')
-+#define css_fourcc_yuv420_12_p64        ia_fourcc('C','S','4','2')
-+#define css_fourcc_yuv420_10_p64        ia_fourcc('C','S','4','0')
-+
-+#define css_fourcc_p010                 ia_fourcc('P','0','1','0')
-+#define css_fourcc_p010_lsb             ia_fourcc('P','0','1','L')
-+/* Intel internal format: P010 Tile-Y (MSB) */
-+#define css_fourcc_p010_msb_tile_y          ia_fourcc('T','0','1','0')  /* TileYUV420_10_SP */
-+/* Intel internal format: P010 Tile-Y (MSB), compressed*/
-+#define css_fourcc_p010_msb_cile_y          ia_fourcc('C','0','1','0') /* TileYUV420_10_SP_C */
-+
-+#define css_fourcc_p012                 ia_fourcc('P','0','1','2')
-+#define css_fourcc_p012_lsb             ia_fourcc('P','L','1','2')
-+/* Intel internal format: P012 Tile-Y (MSB) */
-+#define css_fourcc_p012_msb_tile_y          ia_fourcc('T','0','1','2') /* TileYUV420_12_SP */
-+/* Intel internal format: P012 Tile-Y (MSB), compressed*/
-+#define css_fourcc_p012_msb_cile_y          ia_fourcc('C','0','1','2') /* TileYUV420_12_SP_C */
-+
-+#define css_fourcc_yuv420_12_pl          ia_fourcc('P','4','1','2')
-+
-+#define ia_cipf_frame_fourcc_ir16 ia_fourcc('I','R','1','6')
-+
-+/* Native object type reference UIDs */
-+#define ia_cipf_pipeline_location_ref_uid   ia_fourcc('P','O','L','R')
-+#define ia_cipf_platform_buffer_ref_uid     ia_fourcc('P','O','B','R')
-+#define ia_cipf_platform_buffer_offset_uid  ia_fourcc('P','O','B','O')
-+#define ia_cipf_platform_memory_ref_uid     ia_fourcc('P','O','M','R')
-+#define ia_cipf_platform_memory_device_ref_uid ia_fourcc('P','O','M','D')
-+
-+/* Native type payload UIDs */
-+#define ia_cipf_payload_uid_int32           ia_fourcc('D','A','$','0')
-+#define ia_cipf_payload_uid_uint32          ia_fourcc('D','A','$','1')
-+#define ia_cipf_payload_uid_resolution      ia_fourcc('D','A','$','2')
-+#define ia_cipf_payload_uid_boolean         ia_fourcc('D','A','$','3')
-+#define ia_cipf_payload_uid_uint64          ia_fourcc('D','A','$','4')
-+#define ia_cipf_payload_uid_void_ref        ia_fourcc('D','R','$','0')
-+#define ia_cipf_payload_uid_int32_ref       ia_fourcc('D','R','$','1')
-+#define ia_cipf_payload_uid_uint32_ref      ia_fourcc('D','R','$','2')
-+#define ia_cipf_payload_uid_resolution_ref  ia_fourcc('D','R','$','3')
-+#define ia_cipf_payload_uid_string_ref      ia_fourcc('D','R','$','4')
-+#define ia_cipf_payload_uid_uint64_ref      ia_fourcc('D','R','$','5')
-+#define ia_cipf_payload_uid_offset_ref      ia_fourcc('D','O','$','0')
-+
-+/* Native payload for special unidentified property */
-+#define ia_cipf_payload_uid_unidentified    ia_fourcc('U','I','P','R')
-+
-+/* Native property UIDs */
-+#define ia_cipf_frame_format_uid ia_fourcc('P','X','F','M')
-+#define ia_cipf_frame_uid ia_fourcc('F','R','A','M')
-+#define ia_cipf_fragment_descriptor_uid ia_fourcc('F','R','D','S')
-+#define ia_cipf_property_data_uid ia_fourcc('D','A','T','A')
-+#define ia_cipf_tunneled_terminal_data_uid  ia_fourcc('A','U','T','O')
-+
-+#define IA_CIPF_PAYLOAD_STORAGE_SIZE 8
-+
-+/** Identifiable data payload type
-+ *
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_payload {
-+    ia_uid     uid;  /* data type identifier */
-+    uint32_t   size; /* size in bytes allocated to data.cpu_ptr */
-+    union {
-+        void        *cpu_ptr;
-+        uint32_t    offset;
-+        uint32_t    handle;
-+        uint8_t     raw[IA_CIPF_PAYLOAD_STORAGE_SIZE];
-+        uint32_t    uvalue;
-+        uint64_t    u64value;
-+        int32_t     svalue;
-+    } data;
-+} ia_cipf_payload_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_frame_format {
-+    uint32_t        width;    /**< Width of the frame in pixels */
-+    uint32_t        height;   /**< Height of the frame in lines */
-+    uint32_t        fourcc;   /**< Frame format */
-+    uint32_t        bpl;      /**< Bytes per line*/
-+    uint32_t        bpp;      /**< Bits per pixel */
-+} ia_cipf_frame_format_t;
-+
-+#define IA_CIPF_MAX_PLANES 6
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_timestamp {
-+    uint64_t seconds; /**< Number of whole seconds */
-+    uint64_t useconds; /**< Rest of the time in microseconds */
-+} ia_cipf_timestamp_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_frame {
-+    ia_uid              uid;
-+    uint32_t            id;
-+    uint32_t            sequence;
-+    ia_cipf_timestamp_t timestamp;
-+    uint32_t            flags;
-+    uint32_t            allocated;
-+    uint32_t            planes;
-+    ia_cipf_payload_t   payload[IA_CIPF_MAX_PLANES];
-+} ia_cipf_frame_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_buffer {
-+    ia_cipf_payload_t    payload;
-+} ia_cipf_buffer_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef enum ia_cipf_terminal_type {
-+    ia_cipf_terminal_type_frame_input,
-+    ia_cipf_terminal_type_frame_output,
-+    ia_cipf_terminal_type_param_input,
-+    ia_cipf_terminal_type_param_output
-+} ia_cipf_terminal_type_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef enum ia_cipf_connection_type {
-+    connection_type_push, /* data is pushed by source stage execute */
-+    connection_type_pull  /* data is pulled by sink stage execute */
-+} ia_cipf_connection_type_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_point {
-+    uint16_t x;
-+    uint16_t y;
-+} ia_cipf_point_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_rect {
-+    uint16_t x;
-+    uint16_t y;
-+    uint16_t width;
-+    uint16_t height;
-+} ia_cipf_rect_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_resolution {
-+    uint16_t width;
-+    uint16_t height;
-+} ia_cipf_resolution_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_association {
-+    ia_uid stage;
-+    ia_uid terminal;
-+    ia_uid property;
-+} ia_cipf_association_t;
-+
-+/**
-+ * \ingroup ia_cipf
-+ */
-+typedef struct ia_cipf_fragment_desc {
-+    ia_cipf_resolution_t size;
-+    ia_cipf_point_t start;
-+} ia_cipf_fragment_desc_t;
-+
-+#endif /* _IA_CIPF_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
-new file mode 100644
-index 000000000000..e4bfe4acc03a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
-@@ -0,0 +1,1009 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPF_CSS_H_
-+#define _IA_CIPF_CSS_H_
-+
-+#include <ia_cipf/ia_cipf_types.h>
-+
-+/* Note:
-+ * PSYS Library is considered to query UIDs from binary releases
-+ * or from other external definition (markup language?)
-+ *
-+ * Here we would define only the ones statically integrated
-+ */
-+
-+#define psys_2401_vfpp_pg_uid       ia_fourcc('V','F','P','P')
-+#define psys_2401_vfpp_in_uid       psys_2401_vfpp_pg_uid + 1
-+#define psys_2401_vfpp_out_uid      psys_2401_vfpp_pg_uid + 2
-+#define psys_2401_vfpp_params_uid   psys_2401_vfpp_pg_uid + 3
-+
-+#define psys_2401_preview_pg_uid     ia_fourcc('P','R','E','0')
-+#define psys_2401_preview_in_uid     psys_2401_preview_pg_uid + 1
-+#define psys_2401_preview_out_uid    psys_2401_preview_pg_uid + 2
-+#define psys_2401_preview_params_uid psys_2401_preview_pg_uid + 3
-+
-+#define psys_2401_capture_pg_uid                ia_fourcc('P','R','I','0')
-+#define psys_2401_capture_in_uid                psys_2401_capture_pg_uid + 1
-+#define psys_2401_capture_params_uid            psys_2401_capture_pg_uid + 2
-+#define psys_2401_capture_main_output_uid       psys_2401_capture_pg_uid + 3
-+#define psys_2401_capture_vfpp_output_uid       psys_2401_capture_pg_uid + 4
-+
-+#define psys_2401_codec_uid               ia_fourcc('2','4','C','O')
-+#define psys_2401_3A_grid_info_uid        psys_2401_codec_uid + 1
-+#define psys_2401_3A_statistics_uid       psys_2401_codec_uid + 2
-+
-+#define psys_2401_lsc_table_uid         ia_fourcc('2','4','P','A')
-+#define psys_2401_3A_statistics_hi_uid  psys_2401_lsc_table_uid + 1
-+#define psys_2401_3A_statistics_lo_uid  psys_2401_lsc_table_uid + 2
-+#define psys_2401_3A_histogram_uid      psys_2401_lsc_table_uid + 3
-+
-+/* 2600 UIDS */
-+#define psys_2600_small_uid         ia_fourcc('S','M','A','0')
-+#define psys_2600_small_input_uid   psys_2600_small_uid + 1
-+#define psys_2600_small_output_uid  psys_2600_small_uid + 2
-+#define psys_2600_small_param_uid   psys_2600_small_uid + 3
-+#define psys_2600_small_secondary_output_uid psys_2600_small_uid + 4
-+
-+#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
-+#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
-+#define is_psys_stage_uid(uid) ((uid & 0x0000FFFF) == psys_2600_pg_uid(0))
-+
-+#define psys_2600_4k60_pg_id        107
-+#define psys_2600_4k60_uid          psys_2600_pg_uid(psys_2600_4k60_pg_id)
-+#define psys_2600_4k60_param_uid    psys_2600_4k60_uid + 1
-+#define psys_2600_4k60_input_uid    psys_2600_4k60_uid + 2
-+#define psys_2600_4k60_output_uid   psys_2600_4k60_uid + 3
-+#define psys_2600_4k60_secondary_output_uid psys_2600_4k60_uid + 4
-+
-+#define psys_2600_uvswap_pg_id        119
-+#define psys_2600_uvswap_uid          psys_2600_pg_uid(psys_2600_uvswap_pg_id)
-+#define psys_2600_uvswap_param_uid    psys_2600_uvswap_uid + 1
-+#define psys_2600_uvswap_input_uid    psys_2600_uvswap_uid + 2
-+#define psys_2600_uvswap_output_uid   psys_2600_uvswap_uid + 3
-+
-+#define psys_2600_popg_pg_id                201
-+#define psys_2600_popg_uid                  psys_2600_pg_uid(psys_2600_popg_pg_id)
-+#define psys_2600_popg_param_uid            psys_2600_popg_uid + 1
-+#define psys_2600_popg_program_uid          psys_2600_popg_uid + 2
-+#define psys_2600_popg_input_uid            psys_2600_popg_uid + 3
-+#define psys_2600_popg_output_uid           psys_2600_popg_uid + 4
-+#define psys_2600_popg_secondary_output_uid psys_2600_popg_uid + 5
-+
-+/* \todo Temporarily switched to use still post-gdc PG */
-+#define psys_2600_post_gdc_pg_id                118
-+#define psys_2600_post_gdc_uid                  psys_2600_pg_uid(psys_2600_post_gdc_pg_id)
-+#define psys_2600_post_gdc_param_uid            psys_2600_post_gdc_uid + 1
-+#define psys_2600_post_gdc_program_uid          psys_2600_post_gdc_uid + 2
-+#define psys_2600_post_gdc_input_uid            psys_2600_post_gdc_uid + 3
-+#define psys_2600_post_gdc_spatial_param_uid    psys_2600_post_gdc_uid + 4
-+#define psys_2600_post_gdc_output_uid           psys_2600_post_gdc_uid + 5
-+#define psys_2600_post_gdc_secondary_output_uid psys_2600_post_gdc_uid + 6
-+#define psys_2600_post_gdc_third_output_uid     psys_2600_post_gdc_uid + 7
-+
-+#define psys_2600_video_post_gdc_pg_id                114
-+#define psys_2600_video_post_gdc_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_pg_id)
-+#define psys_2600_video_post_gdc_param_uid            psys_2600_video_post_gdc_uid + 1
-+#define psys_2600_video_post_gdc_program_uid          psys_2600_video_post_gdc_uid + 2
-+#define psys_2600_video_post_gdc_input_uid            psys_2600_video_post_gdc_uid + 3
-+#define psys_2600_video_post_gdc_spatial_param_uid    psys_2600_video_post_gdc_uid + 4
-+#define psys_2600_video_post_gdc_output_uid           psys_2600_video_post_gdc_uid + 5
-+#define psys_2600_video_post_gdc_secondary_output_uid psys_2600_video_post_gdc_uid + 6
-+#define psys_2600_video_post_gdc_third_output_uid     psys_2600_video_post_gdc_uid + 7
-+#define psys_2600_video_post_gdc_tnr_input_uid        psys_2600_video_post_gdc_uid + 8
-+#define psys_2600_video_post_gdc_tnr_output_uid       psys_2600_video_post_gdc_uid + 9
-+
-+#define psys_2600_video_post_gdc_v2_pg_id                129
-+#define psys_2600_video_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_pg_id)
-+#define psys_2600_video_post_gdc_v2_param_uid            psys_2600_video_post_gdc_v2_uid + 1
-+#define psys_2600_video_post_gdc_v2_program_uid          psys_2600_video_post_gdc_v2_uid + 2
-+#define psys_2600_video_post_gdc_v2_input_uid            psys_2600_video_post_gdc_v2_uid + 3
-+#define psys_2600_video_post_gdc_v2_spatial_param_uid    psys_2600_video_post_gdc_v2_uid + 4
-+#define psys_2600_video_post_gdc_v2_output_uid           psys_2600_video_post_gdc_v2_uid + 5
-+#define psys_2600_video_post_gdc_v2_secondary_output_uid psys_2600_video_post_gdc_v2_uid + 6
-+#define psys_2600_video_post_gdc_v2_third_output_uid     psys_2600_video_post_gdc_v2_uid + 7
-+#define psys_2600_video_post_gdc_v2_tnr_input_uid        psys_2600_video_post_gdc_v2_uid + 8
-+#define psys_2600_video_post_gdc_v2_tnr_output_uid       psys_2600_video_post_gdc_v2_uid + 9
-+
-+#define psys_2600_video_post_gdc_mbr_pg_id                132
-+#define psys_2600_video_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_mbr_pg_id)
-+#define psys_2600_video_post_gdc_mbr_param_uid            psys_2600_video_post_gdc_mbr_uid + 1
-+#define psys_2600_video_post_gdc_mbr_program_uid          psys_2600_video_post_gdc_mbr_uid + 2
-+#define psys_2600_video_post_gdc_mbr_input_uid            psys_2600_video_post_gdc_mbr_uid + 3
-+#define psys_2600_video_post_gdc_mbr_spatial_param_uid    psys_2600_video_post_gdc_mbr_uid + 4
-+#define psys_2600_video_post_gdc_mbr_output_uid           psys_2600_video_post_gdc_mbr_uid + 5
-+#define psys_2600_video_post_gdc_mbr_secondary_output_uid psys_2600_video_post_gdc_mbr_uid + 6
-+#define psys_2600_video_post_gdc_mbr_third_output_uid     psys_2600_video_post_gdc_mbr_uid + 7
-+#define psys_2600_video_post_gdc_mbr_tnr_input_uid        psys_2600_video_post_gdc_mbr_uid + 8
-+#define psys_2600_video_post_gdc_mbr_tnr_output_uid       psys_2600_video_post_gdc_mbr_uid + 9
-+
-+#define psys_2600_video_post_gdc_v2_mbr_pg_id                172
-+#define psys_2600_video_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_mbr_pg_id)
-+#define psys_2600_video_post_gdc_v2_mbr_param_uid            psys_2600_video_post_gdc_v2_mbr_uid + 1
-+#define psys_2600_video_post_gdc_v2_mbr_program_uid          psys_2600_video_post_gdc_v2_mbr_uid + 2
-+#define psys_2600_video_post_gdc_v2_mbr_input_uid            psys_2600_video_post_gdc_v2_mbr_uid + 3
-+#define psys_2600_video_post_gdc_v2_mbr_spatial_param_uid    psys_2600_video_post_gdc_v2_mbr_uid + 4
-+#define psys_2600_video_post_gdc_v2_mbr_output_uid           psys_2600_video_post_gdc_v2_mbr_uid + 5
-+#define psys_2600_video_post_gdc_v2_mbr_secondary_output_uid psys_2600_video_post_gdc_v2_mbr_uid + 6
-+#define psys_2600_video_post_gdc_v2_mbr_third_output_uid     psys_2600_video_post_gdc_v2_mbr_uid + 7
-+#define psys_2600_video_post_gdc_v2_mbr_tnr_input_uid        psys_2600_video_post_gdc_v2_mbr_uid + 8
-+#define psys_2600_video_post_gdc_v2_mbr_tnr_output_uid       psys_2600_video_post_gdc_v2_mbr_uid + 9
-+
-+#define psys_2600_video_pre_gdc_pg_id        116
-+#define psys_2600_video_pre_gdc_uid          psys_2600_pg_uid(psys_2600_video_pre_gdc_pg_id)
-+#define psys_2600_video_pre_gdc_param_uid    psys_2600_video_pre_gdc_uid + 1
-+#define psys_2600_video_pre_gdc_program_uid  psys_2600_video_pre_gdc_uid + 2
-+#define psys_2600_video_pre_gdc_input_uid    psys_2600_video_pre_gdc_uid + 3
-+#define psys_2600_video_pre_gdc_output_uid   psys_2600_video_pre_gdc_uid + 4
-+
-+#define psys_2600_ipu5_video_pre_gdc_pg_id                  140
-+#define psys_2600_ipu5_video_pre_gdc_uid                    psys_2600_pg_uid(psys_2600_ipu5_video_pre_gdc_pg_id)
-+#define psys_2600_ipu5_video_pre_gdc_param_uid              psys_2600_ipu5_video_pre_gdc_uid + 1
-+#define psys_2600_ipu5_video_pre_gdc_program_uid            psys_2600_ipu5_video_pre_gdc_uid + 2
-+#define psys_2600_ipu5_video_pre_gdc_param_spatial_in_uid   psys_2600_ipu5_video_pre_gdc_uid + 3
-+#define psys_2600_ipu5_video_pre_gdc_input_uid              psys_2600_ipu5_video_pre_gdc_uid + 4
-+#define psys_2600_ipu5_video_pre_gdc_output_uid             psys_2600_ipu5_video_pre_gdc_uid + 5
-+
-+#define psys_ipu5_video_pre_gdc_vpless_pg_id                    167
-+#define psys_ipu5_video_pre_gdc_vpless_uid                      psys_2600_pg_uid(psys_ipu5_video_pre_gdc_vpless_pg_id)
-+#define psys_ipu5_video_pre_gdc_vpless_param_uid                psys_ipu5_video_pre_gdc_vpless_uid + 1
-+#define psys_ipu5_video_pre_gdc_vpless_program_uid              psys_ipu5_video_pre_gdc_vpless_uid + 2
-+#define psys_ipu5_video_pre_gdc_vpless_program_control_init_uid psys_ipu5_video_pre_gdc_vpless_uid + 3
-+#define psys_ipu5_video_pre_gdc_vpless_input_uid                psys_ipu5_video_pre_gdc_vpless_uid + 4
-+#define psys_ipu5_video_pre_gdc_vpless_output_uid               psys_ipu5_video_pre_gdc_vpless_uid + 5
-+#define psys_ipu5_video_pre_gdc_gammastar_grid_uid              psys_ipu5_video_pre_gdc_vpless_uid + 6
-+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 7
-+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 8
-+#define psys_ipu5_video_pre_gdc_dvs_mv_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 9
-+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l0_uid                psys_ipu5_video_pre_gdc_vpless_uid + 10
-+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l1_uid                psys_ipu5_video_pre_gdc_vpless_uid + 11
-+#define psys_ipu5_video_pre_gdc_dvs_fe_in_l2_uid                psys_ipu5_video_pre_gdc_vpless_uid + 12
-+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 13
-+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 14
-+#define psys_ipu5_video_pre_gdc_dvs_fe_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 15
-+
-+#define psys_2600_ipu6_lb_video_pg_id                  182
-+#define psys_2600_ipu6_lb_video_uid                    psys_2600_pg_uid(psys_2600_ipu6_lb_video_pg_id)
-+#define psys_2600_ipu6_lb_video_param_uid              psys_2600_ipu6_lb_video_uid + 1
-+#define psys_2600_ipu6_lb_video_program_uid            psys_2600_ipu6_lb_video_uid + 2
-+#define psys_2600_ipu6_lb_video_program_control_uid    psys_2600_ipu6_lb_video_uid + 3
-+#define psys_2600_ipu6_lb_video_input_uid              psys_2600_ipu6_lb_video_uid + 4
-+#define psys_2600_ipu6_lb_video_output_uid             psys_2600_ipu6_lb_video_uid + 5
-+
-+#define psys_ipu6_bb_pg_id                 189
-+#define psys_ipu6_bb_uid                   psys_2600_pg_uid(psys_ipu6_bb_pg_id)
-+#define psys_ipu6_bb_input_uid             (psys_ipu6_bb_uid + 1)
-+#define psys_ipu6_bb_mp_uid                (psys_ipu6_bb_uid + 2)
-+#define psys_ipu6_bb_dp_uid                (psys_ipu6_bb_uid + 3)
-+#define psys_ipu6_bb_ppp_uid               (psys_ipu6_bb_uid + 4)
-+#define psys_ipu6_bb_tnr_ref_in_uid        (psys_ipu6_bb_uid + 5)
-+#define psys_ipu6_bb_tnr_recsim_in_uid     (psys_ipu6_bb_uid + 6)
-+#define psys_ipu6_bb_tnr_ref_out_uid       (psys_ipu6_bb_uid + 7)
-+#define psys_ipu6_bb_tnr_recsim_out_uid    (psys_ipu6_bb_uid + 8)
-+#define psys_ipu6_bb_program_control_uid   (psys_ipu6_bb_uid + 9)
-+#define psys_ipu6_bb_param_in_uid          (psys_ipu6_bb_uid + 10)
-+#define psys_ipu6_bb_program_uid           (psys_ipu6_bb_uid + 11)
-+
-+#define psys_ipu6_lb_rbm_pg_id                183
-+#define psys_ipu6_lb_rbm_uid                  psys_2600_pg_uid(psys_ipu6_lb_rbm_pg_id)
-+#define psys_ipu6_lb_rbm_param_uid            (psys_ipu6_lb_rbm_uid + 1)
-+#define psys_ipu6_lb_rbm_program_uid          (psys_ipu6_lb_rbm_uid + 2)
-+#define psys_ipu6_lb_rbm_program_control_uid  (psys_ipu6_lb_rbm_uid + 3)
-+#define psys_ipu6_lb_rbm_input_uid            (psys_ipu6_lb_rbm_uid + 4)
-+#define psys_ipu6_lb_rbm_output_uid           (psys_ipu6_lb_rbm_uid + 5)
-+#define psys_ipu6_lb_rbm_gammastar_grid_uid   (psys_ipu6_lb_rbm_uid + 6)
-+#define psys_ipu6_lb_rbm_dvs_mv_out_l0_uid    (psys_ipu6_lb_rbm_uid + 7)
-+#define psys_ipu6_lb_rbm_dvs_mv_out_l1_uid    (psys_ipu6_lb_rbm_uid + 8)
-+#define psys_ipu6_lb_rbm_dvs_mv_out_l2_uid    (psys_ipu6_lb_rbm_uid + 9)
-+#define psys_ipu6_lb_rbm_dvs_fe_in_l0_uid     (psys_ipu6_lb_rbm_uid + 10)
-+#define psys_ipu6_lb_rbm_dvs_fe_in_l1_uid     (psys_ipu6_lb_rbm_uid + 11)
-+#define psys_ipu6_lb_rbm_dvs_fe_in_l2_uid     (psys_ipu6_lb_rbm_uid + 12)
-+#define psys_ipu6_lb_rbm_dvs_fe_out_l0_uid    (psys_ipu6_lb_rbm_uid + 13)
-+#define psys_ipu6_lb_rbm_dvs_fe_out_l1_uid    (psys_ipu6_lb_rbm_uid + 14)
-+#define psys_ipu6_lb_rbm_dvs_fe_out_l2_uid    (psys_ipu6_lb_rbm_uid + 15)
-+
-+#define psys_ipu6_isa_rbm_pg_id                185
-+#define psys_ipu6_isa_rbm_uid                  psys_2600_pg_uid(psys_ipu6_isa_rbm_pg_id)
-+#define psys_ipu6_isa_rbm_param_uid            (psys_ipu6_isa_rbm_uid + 1)
-+#define psys_ipu6_isa_rbm_program_uid          (psys_ipu6_isa_rbm_uid + 2)
-+#define psys_ipu6_isa_rbm_program_control_uid  (psys_ipu6_isa_rbm_uid + 3)
-+#define psys_ipu6_isa_rbm_input_uid            (psys_ipu6_isa_rbm_uid + 4)
-+#define psys_ipu6_isa_rbm_blc_input_uid        (psys_ipu6_isa_rbm_uid + 5)
-+#define psys_ipu6_isa_rbm_lsc_input_uid        (psys_ipu6_isa_rbm_uid + 6)
-+#define psys_ipu6_isa_rbm_output_bayer_uid     (psys_ipu6_isa_rbm_uid + 7)
-+#define psys_ipu6_isa_rbm_output_yuv_a_uid     (psys_ipu6_isa_rbm_uid + 8)
-+#define psys_ipu6_isa_rbm_output_yuv_b_uid     (psys_ipu6_isa_rbm_uid + 9)
-+#define psys_ipu6_isa_rbm_output_full_uid      (psys_ipu6_isa_rbm_uid + 10)
-+#define psys_ipu6_isa_rbm_output_ir_uid        (psys_ipu6_isa_rbm_uid + 11)
-+#define psys_ipu6_isa_rbm_output_sis_a_uid     (psys_ipu6_isa_rbm_uid + 12)
-+#define psys_ipu6_isa_rbm_output_sis_b_uid     (psys_ipu6_isa_rbm_uid + 13)
-+#define psys_ipu6_isa_rbm_output_af_uid        (psys_ipu6_isa_rbm_uid + 14)
-+#define psys_ipu6_isa_rbm_output_awb_uid       (psys_ipu6_isa_rbm_uid + 15)
-+#define psys_ipu6_isa_rbm_output_paf_uid       (psys_ipu6_isa_rbm_uid + 16)
-+#define psys_ipu6_isa_rbm_param_out_uid        (psys_ipu6_isa_rbm_uid + 17)
-+#define psys_ipu6_isa_rbm_input_short_uid      (psys_ipu6_isa_rbm_uid + 18)
-+#define psys_ipu6_isa_rbm_input_medium_uid     (psys_ipu6_isa_rbm_uid + 19)
-+#define psys_ipu6_isa_rbm_input_paf_uid        (psys_ipu6_isa_rbm_uid + 20)
-+
-+#define psys_ipu6s_isa_pg_id                198
-+#define psys_ipu6s_isa_uid                  psys_2600_pg_uid(psys_ipu6s_isa_pg_id)
-+#define psys_ipu6s_isa_param_uid            (psys_ipu6s_isa_uid + 1)
-+#define psys_ipu6s_isa_program_uid          (psys_ipu6s_isa_uid + 2)
-+#define psys_ipu6s_isa_program_control_uid  (psys_ipu6s_isa_uid + 3)
-+#define psys_ipu6s_isa_input_uid            (psys_ipu6s_isa_uid + 4)
-+#define psys_ipu6s_isa_blc_input_uid        (psys_ipu6s_isa_uid + 5)
-+#define psys_ipu6s_isa_lsc_input_uid        (psys_ipu6s_isa_uid + 6)
-+#define psys_ipu6s_isa_output_bayer_uid     (psys_ipu6s_isa_uid + 7)
-+#define psys_ipu6s_isa_output_yuv_a_uid     (psys_ipu6s_isa_uid + 8)
-+#define psys_ipu6s_isa_output_yuv_b_uid     (psys_ipu6s_isa_uid + 9)
-+#define psys_ipu6s_isa_output_full_uid      (psys_ipu6s_isa_uid + 10)
-+#define psys_ipu6s_isa_output_af_uid        (psys_ipu6s_isa_uid + 11)
-+#define psys_ipu6s_isa_output_awb_uid       (psys_ipu6s_isa_uid + 12)
-+#define psys_ipu6s_isa_output_paf_uid       (psys_ipu6s_isa_uid + 13)
-+
-+#define psys_fake_ipu6s_isa_pg_id                199
-+#define psys_fake_ipu6s_isa_uid                  psys_2600_pg_uid(psys_fake_ipu6s_isa_pg_id)
-+#define psys_fake_ipu6s_isa_param_uid            (psys_fake_ipu6s_isa_uid + 1)
-+#define psys_fake_ipu6s_isa_program_uid          (psys_fake_ipu6s_isa_uid + 2)
-+#define psys_fake_ipu6s_isa_program_control_uid  (psys_fake_ipu6s_isa_uid + 3)
-+#define psys_fake_ipu6s_isa_input_uid            (psys_fake_ipu6s_isa_uid + 4)
-+#define psys_fake_ipu6s_isa_blc_input_uid        (psys_fake_ipu6s_isa_uid + 5)
-+#define psys_fake_ipu6s_isa_lsc_input_uid        (psys_fake_ipu6s_isa_uid + 6)
-+#define psys_fake_ipu6s_isa_output_bayer_uid     (psys_fake_ipu6s_isa_uid + 7)
-+#define psys_fake_ipu6s_isa_output_yuv_a_uid     (psys_fake_ipu6s_isa_uid + 8)
-+#define psys_fake_ipu6s_isa_output_yuv_b_uid     (psys_fake_ipu6s_isa_uid + 9)
-+#define psys_fake_ipu6s_isa_output_full_uid      (psys_fake_ipu6s_isa_uid + 10)
-+#define psys_fake_ipu6s_isa_output_af_uid        (psys_fake_ipu6s_isa_uid + 11)
-+#define psys_fake_ipu6s_isa_output_awb_uid       (psys_fake_ipu6s_isa_uid + 12)
-+#define psys_fake_ipu6s_isa_output_paf_uid       (psys_fake_ipu6s_isa_uid + 13)
-+
-+#ifndef IPU_SYSVER_ipu6v5
-+#define psys_ipu6_isa_lb_pg_id                     187
-+#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
-+#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
-+#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
-+#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
-+#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
-+#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
-+#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
-+#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
-+#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
-+#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
-+#define psys_ipu6_isa_lb_output_yuv_b_uid          (psys_ipu6_isa_lb_uid + 10)
-+#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 11)
-+#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 12)
-+#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 13)
-+#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 14)
-+#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 15)
-+#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 16)
-+#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 17)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 18)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 19)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 20)
-+#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 21)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 22)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 23)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 24)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 25)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 26)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 27)
-+#define psys_ipu6_isa_lb_input_short_uid           (psys_ipu6_isa_lb_uid + 28)
-+#define psys_ipu6_isa_lb_input_medium_uid          (psys_ipu6_isa_lb_uid + 29)
-+#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 30)
-+#else
-+#define psys_ipu6_isa_lb_pg_id                     187
-+#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
-+#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
-+#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
-+#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
-+#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
-+#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
-+#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
-+#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
-+#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
-+#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
-+#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 10)
-+#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 11)
-+#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 12)
-+#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 13)
-+#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 14)
-+#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 15)
-+#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 16)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 17)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 18)
-+#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 19)
-+#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 20)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 21)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 22)
-+#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 23)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 24)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 25)
-+#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 26)
-+#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 27)
-+
-+#endif
-+
-+
-+#define psys_ipu6_bb_gdc_pg_id                 196
-+#define psys_ipu6_bb_gdc_uid                   psys_2600_pg_uid(psys_ipu6_bb_gdc_pg_id)
-+#define psys_ipu6_bb_gdc_input_uid             (psys_ipu6_bb_gdc_uid + 1)
-+#define psys_ipu6_bb_gdc_mp_uid                (psys_ipu6_bb_gdc_uid + 2)
-+#define psys_ipu6_bb_gdc_dp_uid                (psys_ipu6_bb_gdc_uid + 3)
-+#define psys_ipu6_bb_gdc_ppp_uid               (psys_ipu6_bb_gdc_uid + 4)
-+#define psys_ipu6_bb_gdc_program_control_uid   (psys_ipu6_bb_gdc_uid + 5)
-+#define psys_ipu6_bb_gdc_param_in_uid          (psys_ipu6_bb_gdc_uid + 6)
-+#define psys_ipu6_bb_gdc_program_uid           (psys_ipu6_bb_gdc_uid + 7)
-+
-+#define psys_2600_video_pre_gdc_hq_pg_id             122
-+#define psys_2600_video_pre_gdc_hq_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_pg_id)
-+#define psys_2600_video_pre_gdc_hq_param_uid         psys_2600_video_pre_gdc_hq_uid + 1
-+#define psys_2600_video_pre_gdc_hq_program_uid       psys_2600_video_pre_gdc_hq_uid + 2
-+#define psys_2600_video_pre_gdc_hq_input_uid         psys_2600_video_pre_gdc_hq_uid + 3
-+#define psys_2600_video_pre_gdc_hq_output_uid        psys_2600_video_pre_gdc_hq_uid + 4
-+#define psys_2600_video_pre_gdc_hq_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_uid + 5
-+#define psys_2600_video_pre_gdc_hq_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_uid + 6
-+#define psys_2600_video_pre_gdc_hq_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_uid + 7
-+#define psys_2600_video_pre_gdc_hq_spatial_out_0_uid psys_2600_video_pre_gdc_hq_uid + 8
-+#define psys_2600_video_pre_gdc_hq_spatial_out_1_uid psys_2600_video_pre_gdc_hq_uid + 9
-+#define psys_2600_video_pre_gdc_hq_spatial_out_2_uid psys_2600_video_pre_gdc_hq_uid + 10
-+
-+#define psys_2600_video_pre_gdc_hq_vcr2_pg_id             148
-+#define psys_2600_video_pre_gdc_hq_vcr2_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_vcr2_pg_id)
-+#define psys_2600_video_pre_gdc_hq_vcr2_param_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 1
-+#define psys_2600_video_pre_gdc_hq_vcr2_program_uid       psys_2600_video_pre_gdc_hq_vcr2_uid + 2
-+#define psys_2600_video_pre_gdc_hq_vcr2_input_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 3
-+#define psys_2600_video_pre_gdc_hq_vcr2_output_uid        psys_2600_video_pre_gdc_hq_vcr2_uid + 4
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 5
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 6
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 7
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_0_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 8
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_1_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 9
-+#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_2_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 10
-+
-+#define psys_2600_ipu5_still_pre_gdc_pg_id        143
-+#define psys_2600_ipu5_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_pg_id)
-+#define psys_2600_ipu5_still_pre_gdc_param_uid    psys_2600_ipu5_still_pre_gdc_uid + 1
-+#define psys_2600_ipu5_still_pre_gdc_program_uid  psys_2600_ipu5_still_pre_gdc_uid + 2
-+#define psys_2600_ipu5_still_pre_gdc_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_uid + 3
-+#define psys_2600_ipu5_still_pre_gdc_input_uid   psys_2600_ipu5_still_pre_gdc_uid + 4
-+#define psys_2600_ipu5_still_pre_gdc_output_uid   psys_2600_ipu5_still_pre_gdc_uid + 5
-+
-+
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id        144
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id)
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_param_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 1
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_program_uid  psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 2
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 3
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_input_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 4
-+#define psys_2600_ipu5_still_pre_gdc_no_xnr_output_uid   psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 5
-+
-+#define psys_2600_ipu5_still_pre_gdc_vpless_pg_id                       168
-+#define psys_2600_ipu5_still_pre_gdc_vpless_uid                         psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_vpless_pg_id)
-+#define psys_2600_ipu5_still_pre_gdc_vpless_param_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 1
-+#define psys_2600_ipu5_still_pre_gdc_vpless_program_uid                 psys_2600_ipu5_still_pre_gdc_vpless_uid + 2
-+#define psys_2600_ipu5_still_pre_gdc_vpless_gammstar_acc_ctrl_uid       psys_2600_ipu5_still_pre_gdc_vpless_uid + 3
-+#define psys_2600_ipu5_still_pre_gdc_vpless_input_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 4
-+#define psys_2600_ipu5_still_pre_gdc_vpless_output_uid                  psys_2600_ipu5_still_pre_gdc_vpless_uid + 5
-+#define psys_2600_ipu5_still_pre_gdc_vpless_spt_gammstar_grid           psys_2600_ipu5_still_pre_gdc_vpless_uid + 6
-+
-+#define psys_ipu5_still_post_gdc_v4_pg_id                162
-+#define psys_ipu5_still_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_v4_pg_id)
-+#define psys_ipu5_still_post_gdc_v4_param_uid            psys_ipu5_still_post_gdc_v4_uid + 1
-+#define psys_ipu5_still_post_gdc_v4_program_uid          psys_ipu5_still_post_gdc_v4_uid + 2
-+#define psys_ipu5_still_post_gdc_v4_input_uid            psys_ipu5_still_post_gdc_v4_uid + 3
-+#define psys_ipu5_still_post_gdc_v4_spatial_param_uid    psys_ipu5_still_post_gdc_v4_uid + 4
-+#define psys_ipu5_still_post_gdc_v4_output_uid           psys_ipu5_still_post_gdc_v4_uid + 5
-+#define psys_ipu5_still_post_gdc_v4_secondary_output_uid psys_ipu5_still_post_gdc_v4_uid + 6
-+#define psys_ipu5_still_post_gdc_v4_third_output_uid     psys_ipu5_still_post_gdc_v4_uid + 7
-+
-+#define psys_ipu5_video_post_gdc_pg_id                151
-+#define psys_ipu5_video_post_gdc_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_pg_id)
-+#define psys_ipu5_video_post_gdc_param_uid            psys_ipu5_video_post_gdc_uid + 1
-+#define psys_ipu5_video_post_gdc_program_uid          psys_ipu5_video_post_gdc_uid + 2
-+#define psys_ipu5_video_post_gdc_input_uid            psys_ipu5_video_post_gdc_uid + 3
-+#define psys_ipu5_video_post_gdc_spatial_param_uid    psys_ipu5_video_post_gdc_uid + 4
-+#define psys_ipu5_video_post_gdc_output_uid           psys_ipu5_video_post_gdc_uid + 5
-+#define psys_ipu5_video_post_gdc_secondary_output_uid psys_ipu5_video_post_gdc_uid + 6
-+#define psys_ipu5_video_post_gdc_third_output_uid     psys_ipu5_video_post_gdc_uid + 7
-+#define psys_ipu5_video_post_gdc_tnr_input_uid        psys_ipu5_video_post_gdc_uid + 8
-+#define psys_ipu5_video_post_gdc_tnr_output_uid       psys_ipu5_video_post_gdc_uid + 9
-+
-+#define psys_ipu5_video_post_gdc_v4_pg_id                169
-+#define psys_ipu5_video_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_v4_pg_id)
-+#define psys_ipu5_video_post_gdc_v4_param_uid            psys_ipu5_video_post_gdc_v4_uid + 1
-+#define psys_ipu5_video_post_gdc_v4_program_uid          psys_ipu5_video_post_gdc_v4_uid + 2
-+#define psys_ipu5_video_post_gdc_v4_input_uid            psys_ipu5_video_post_gdc_v4_uid + 3
-+#define psys_ipu5_video_post_gdc_v4_spatial_param_uid    psys_ipu5_video_post_gdc_v4_uid + 4
-+#define psys_ipu5_video_post_gdc_v4_output_uid           psys_ipu5_video_post_gdc_v4_uid + 5
-+#define psys_ipu5_video_post_gdc_v4_secondary_output_uid psys_ipu5_video_post_gdc_v4_uid + 6
-+#define psys_ipu5_video_post_gdc_v4_third_output_uid     psys_ipu5_video_post_gdc_v4_uid + 7
-+#define psys_ipu5_video_post_gdc_v4_tnr_input_uid        psys_ipu5_video_post_gdc_v4_uid + 8
-+#define psys_ipu5_video_post_gdc_v4_tnr_output_uid       psys_ipu5_video_post_gdc_v4_uid + 9
-+
-+#define psys_ipu5_video_post_gdc_10bit_pg_id                193
-+#define psys_ipu5_video_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_10bit_pg_id)
-+#define psys_ipu5_video_post_gdc_10bit_param_uid            psys_ipu5_video_post_gdc_10bit_uid + 1
-+#define psys_ipu5_video_post_gdc_10bit_program_uid          psys_ipu5_video_post_gdc_10bit_uid + 2
-+#define psys_ipu5_video_post_gdc_10bit_input_uid            psys_ipu5_video_post_gdc_10bit_uid + 3
-+#define psys_ipu5_video_post_gdc_10bit_spatial_param_uid    psys_ipu5_video_post_gdc_10bit_uid + 4
-+#define psys_ipu5_video_post_gdc_10bit_output_uid           psys_ipu5_video_post_gdc_10bit_uid + 5
-+#define psys_ipu5_video_post_gdc_10bit_secondary_output_uid psys_ipu5_video_post_gdc_10bit_uid + 6
-+#define psys_ipu5_video_post_gdc_10bit_third_output_uid     psys_ipu5_video_post_gdc_10bit_uid + 7
-+#define psys_ipu5_video_post_gdc_10bit_tnr_input_uid        psys_ipu5_video_post_gdc_10bit_uid + 8
-+#define psys_ipu5_video_post_gdc_10bit_tnr_output_uid       psys_ipu5_video_post_gdc_10bit_uid + 9
-+#define psys_ipu5_video_post_gdc_10bit_main_output_uid      psys_ipu5_video_post_gdc_10bit_uid + 10
-+#define psys_ipu5_video_post_gdc_10bit_display_output_uid   psys_ipu5_video_post_gdc_10bit_uid + 11
-+
-+#define psys_ipu5_still_post_gdc_10bit_pg_id                197
-+#define psys_ipu5_still_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_10bit_pg_id)
-+#define psys_ipu5_still_post_gdc_10bit_param_uid            psys_ipu5_still_post_gdc_10bit_uid + 1
-+#define psys_ipu5_still_post_gdc_10bit_program_uid          psys_ipu5_still_post_gdc_10bit_uid + 2
-+#define psys_ipu5_still_post_gdc_10bit_input_uid            psys_ipu5_still_post_gdc_10bit_uid + 3
-+#define psys_ipu5_still_post_gdc_10bit_spatial_param_uid    psys_ipu5_still_post_gdc_10bit_uid + 4
-+#define psys_ipu5_still_post_gdc_10bit_output_uid           psys_ipu5_still_post_gdc_10bit_uid + 5
-+#define psys_ipu5_still_post_gdc_10bit_secondary_output_uid psys_ipu5_still_post_gdc_10bit_uid + 6
-+#define psys_ipu5_still_post_gdc_10bit_third_output_uid     psys_ipu5_still_post_gdc_10bit_uid + 7
-+#define psys_ipu5_still_post_gdc_10bit_main_output_uid      psys_ipu5_still_post_gdc_10bit_uid + 8
-+#define psys_ipu5_still_post_gdc_10bit_display_output_uid   psys_ipu5_still_post_gdc_10bit_uid + 9
-+
-+
-+#ifdef _MSC_VER
-+    #define psys_2600_still_pre_gdc_pg_id    136
-+#else //_MSC_VER
-+    #define psys_2600_still_pre_gdc_pg_id    131
-+#endif
-+#define psys_2600_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_pg_id)
-+#define psys_2600_still_pre_gdc_param_uid    psys_2600_still_pre_gdc_uid + 1
-+#define psys_2600_still_pre_gdc_program_uid  psys_2600_still_pre_gdc_uid + 2
-+#define psys_2600_still_pre_gdc_input_uid    psys_2600_still_pre_gdc_uid + 3
-+#define psys_2600_still_pre_gdc_output_uid   psys_2600_still_pre_gdc_uid + 4
-+
-+#define psys_2600_still_pre_gdc_vcr2_pg_id        150
-+#define psys_2600_still_pre_gdc_vcr2_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_vcr2_pg_id)
-+#define psys_2600_still_pre_gdc_vcr2_param_uid    psys_2600_still_pre_gdc_vcr2_uid + 1
-+#define psys_2600_still_pre_gdc_vcr2_program_uid  psys_2600_still_pre_gdc_vcr2_uid + 2
-+#define psys_2600_still_pre_gdc_vcr2_input_uid    psys_2600_still_pre_gdc_vcr2_uid + 3
-+#define psys_2600_still_pre_gdc_vcr2_output_uid   psys_2600_still_pre_gdc_vcr2_uid + 4
-+
-+/* \todo dummy definition for Windows only until we can sort out the conflict
-+ * needed to continue patch porting, this allows the conflicts to only be present in this file
-+ */
-+#ifdef _MSC_VER
-+    #define psys_2600_still_pre_gdc_v3_uid          ia_fourcc('D','U','M','Y') // DUMMY
-+#else
-+    #define psys_2600_still_pre_gdc_v3_pg_id        136
-+    #define psys_2600_still_pre_gdc_v3_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_v3_pg_id)
-+    #define psys_2600_still_pre_gdc_v3_param_uid    psys_2600_still_pre_gdc_v3_uid + 1
-+    #define psys_2600_still_pre_gdc_v3_program_uid  psys_2600_still_pre_gdc_v3_uid + 2
-+    #define psys_2600_still_pre_gdc_v3_input_uid    psys_2600_still_pre_gdc_v3_uid + 3
-+    #define psys_2600_still_pre_gdc_v3_output_uid   psys_2600_still_pre_gdc_v3_uid + 4
-+#endif
-+
-+#define psys_2600_still_post_gdc_pg_id                118
-+#define psys_2600_still_post_gdc_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_pg_id)
-+#define psys_2600_still_post_gdc_param_uid            psys_2600_still_post_gdc_uid + 1
-+#define psys_2600_still_post_gdc_program_uid          psys_2600_still_post_gdc_uid + 2
-+#define psys_2600_still_post_gdc_input_uid            psys_2600_still_post_gdc_uid + 3
-+#define psys_2600_still_post_gdc_spatial_param_uid    psys_2600_still_post_gdc_uid + 4
-+#define psys_2600_still_post_gdc_output_uid           psys_2600_still_post_gdc_uid + 5
-+#define psys_2600_still_post_gdc_secondary_output_uid psys_2600_still_post_gdc_uid + 6
-+#define psys_2600_still_post_gdc_third_output_uid     psys_2600_still_post_gdc_uid + 7
-+
-+#define psys_2600_still_post_gdc_v2_pg_id                128
-+#define psys_2600_still_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_pg_id)
-+#define psys_2600_still_post_gdc_v2_param_uid            psys_2600_still_post_gdc_v2_uid + 1
-+#define psys_2600_still_post_gdc_v2_program_uid          psys_2600_still_post_gdc_v2_uid + 2
-+#define psys_2600_still_post_gdc_v2_input_uid            psys_2600_still_post_gdc_v2_uid + 3
-+#define psys_2600_still_post_gdc_v2_spatial_param_uid    psys_2600_still_post_gdc_v2_uid + 4
-+#define psys_2600_still_post_gdc_v2_output_uid           psys_2600_still_post_gdc_v2_uid + 5
-+#define psys_2600_still_post_gdc_v2_secondary_output_uid psys_2600_still_post_gdc_v2_uid + 6
-+#define psys_2600_still_post_gdc_v2_third_output_uid     psys_2600_still_post_gdc_v2_uid + 7
-+
-+#define psys_2600_still_post_gdc_mbr_pg_id                133
-+#define psys_2600_still_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_mbr_pg_id)
-+#define psys_2600_still_post_gdc_mbr_param_uid            psys_2600_still_post_gdc_mbr_uid + 1
-+#define psys_2600_still_post_gdc_mbr_program_uid          psys_2600_still_post_gdc_mbr_uid + 2
-+#define psys_2600_still_post_gdc_mbr_input_uid            psys_2600_still_post_gdc_mbr_uid + 3
-+#define psys_2600_still_post_gdc_mbr_spatial_param_uid    psys_2600_still_post_gdc_mbr_uid + 4
-+#define psys_2600_still_post_gdc_mbr_output_uid           psys_2600_still_post_gdc_mbr_uid + 5
-+#define psys_2600_still_post_gdc_mbr_secondary_output_uid psys_2600_still_post_gdc_mbr_uid + 6
-+#define psys_2600_still_post_gdc_mbr_third_output_uid     psys_2600_still_post_gdc_mbr_uid + 7
-+
-+#define psys_2600_still_post_gdc_v2_mbr_pg_id                173
-+#define psys_2600_still_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_mbr_pg_id)
-+#define psys_2600_still_post_gdc_v2_mbr_param_uid            psys_2600_still_post_gdc_v2_mbr_uid + 1
-+#define psys_2600_still_post_gdc_v2_mbr_program_uid          psys_2600_still_post_gdc_v2_mbr_uid + 2
-+#define psys_2600_still_post_gdc_v2_mbr_input_uid            psys_2600_still_post_gdc_v2_mbr_uid + 3
-+#define psys_2600_still_post_gdc_v2_mbr_spatial_param_uid    psys_2600_still_post_gdc_v2_mbr_uid + 4
-+#define psys_2600_still_post_gdc_v2_mbr_output_uid           psys_2600_still_post_gdc_v2_mbr_uid + 5
-+#define psys_2600_still_post_gdc_v2_mbr_secondary_output_uid psys_2600_still_post_gdc_v2_mbr_uid + 6
-+#define psys_2600_still_post_gdc_v2_mbr_third_output_uid     psys_2600_still_post_gdc_v2_mbr_uid + 7
-+
-+#define psys_2600_video_isa_pg_id                127
-+#define psys_2600_video_isa_uid                  psys_2600_pg_uid(psys_2600_video_isa_pg_id)
-+#define psys_2600_video_isa_param_uid            psys_2600_video_isa_uid + 1
-+#define psys_2600_video_isa_program_uid          psys_2600_video_isa_uid + 2
-+#define psys_2600_video_isa_input_uid            psys_2600_video_isa_uid + 3
-+#define psys_2600_video_isa_output_uid           psys_2600_video_isa_uid + 4
-+#define psys_2600_video_isa_secondary_output_uid psys_2600_video_isa_uid + 5
-+#define psys_2600_video_isa_ae_output_uid        psys_2600_video_isa_uid + 6
-+#define psys_2600_video_isa_blc_type0_input_uid  psys_2600_video_isa_uid + 7
-+#define psys_2600_video_isa_blc_type1_input_uid  psys_2600_video_isa_uid + 8
-+#define psys_2600_video_isa_blc_type2_input_uid  psys_2600_video_isa_uid + 9
-+#define psys_2600_video_isa_lsc_type0_input_uid  psys_2600_video_isa_uid + 10
-+#define psys_2600_video_isa_lsc_type1_input_uid  psys_2600_video_isa_uid + 11
-+#define psys_2600_video_isa_lsc_type2_input_uid  psys_2600_video_isa_uid + 12
-+#define psys_2600_video_isa_awb_output_uid       psys_2600_video_isa_uid + 13
-+#define psys_2600_video_isa_af_output_uid        psys_2600_video_isa_uid + 14
-+
-+#define psys_2600_video_rgbir_isa_pg_id                130
-+#define psys_2600_video_rgbir_isa_uid                  psys_2600_pg_uid(psys_2600_video_rgbir_isa_pg_id)
-+#define psys_2600_video_rgbir_isa_param_uid            psys_2600_video_rgbir_isa_uid + 1
-+#define psys_2600_video_rgbir_isa_program_uid          psys_2600_video_rgbir_isa_uid + 2
-+#define psys_2600_video_rgbir_isa_input_uid            psys_2600_video_rgbir_isa_uid + 3
-+#define psys_2600_video_rgbir_isa_output_uid           psys_2600_video_rgbir_isa_uid + 4
-+#define psys_2600_video_rgbir_isa_secondary_output_uid psys_2600_video_rgbir_isa_uid + 5
-+#define psys_2600_video_rgbir_isa_ae_output_uid        psys_2600_video_rgbir_isa_uid + 6
-+#define psys_2600_video_rgbir_isa_blc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 7
-+#define psys_2600_video_rgbir_isa_blc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 8
-+#define psys_2600_video_rgbir_isa_blc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 9
-+#define psys_2600_video_rgbir_isa_lsc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 10
-+#define psys_2600_video_rgbir_isa_lsc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 11
-+#define psys_2600_video_rgbir_isa_lsc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 12
-+#define psys_2600_video_rgbir_isa_awb_output_uid       psys_2600_video_rgbir_isa_uid + 13
-+#define psys_2600_video_rgbir_isa_af_output_uid        psys_2600_video_rgbir_isa_uid + 14
-+
-+
-+#define psys_2600_ipu5_video_isa_pg_id                141
-+#define psys_2600_ipu5_video_isa_uid                  psys_2600_pg_uid(psys_2600_ipu5_video_isa_pg_id)
-+#define psys_2600_ipu5_video_isa_param_uid            psys_2600_ipu5_video_isa_uid + 1
-+#define psys_2600_ipu5_video_isa_program_uid          psys_2600_ipu5_video_isa_uid + 2
-+#define psys_2600_ipu5_video_isa_input_uid            psys_2600_ipu5_video_isa_uid + 3
-+#define psys_2600_ipu5_video_isa_output_uid           psys_2600_ipu5_video_isa_uid + 4
-+#define psys_2600_ipu5_video_isa_secondary_output_uid psys_2600_ipu5_video_isa_uid + 5
-+#define psys_2600_ipu5_video_isa_sis_output_uid       psys_2600_ipu5_video_isa_uid + 6
-+#define psys_2600_ipu5_video_isa_ae_output_uid        psys_2600_ipu5_video_isa_uid + 7
-+#define psys_2600_ipu5_video_isa_blc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 8
-+#define psys_2600_ipu5_video_isa_blc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 9
-+#define psys_2600_ipu5_video_isa_blc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 10
-+#define psys_2600_ipu5_video_isa_lsc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 11
-+#define psys_2600_ipu5_video_isa_lsc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 12
-+#define psys_2600_ipu5_video_isa_lsc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 13
-+#define psys_2600_ipu5_video_isa_awb_output_uid       psys_2600_ipu5_video_isa_uid + 14
-+#define psys_2600_ipu5_video_isa_af_output_uid        psys_2600_ipu5_video_isa_uid + 15
-+
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id                174
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid                  psys_2600_pg_uid(psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id)
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_param_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 1
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_program_uid          psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 2
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_bayer_output_uid     psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 3
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_sis_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 4
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_ae_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 5
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 6
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 7
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 8
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 9
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 10
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 11
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_awb_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 12
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_af_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 13
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_gammastar_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 14
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_input_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 15
-+#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_output_uid           psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 16
-+
-+#define psys_ipu5_isa_lb_pg_id                          194
-+#define psys_ipu5_isa_lb_uid                            psys_2600_pg_uid(psys_ipu5_isa_lb_pg_id)
-+#define psys_ipu5_isa_lb_param_uid                      psys_ipu5_isa_lb_uid + 1
-+#define psys_ipu5_isa_lb_program_uid                    psys_ipu5_isa_lb_uid + 2
-+#define psys_ipu5_isa_lb_program_control_init_uid       psys_ipu5_isa_lb_uid + 3
-+#define psys_ipu5_isa_lb_input_uid                      psys_ipu5_isa_lb_uid + 4
-+#define psys_ipu5_isa_lb_input_paf_uid                  psys_ipu5_isa_lb_uid + 5
-+#define psys_ipu5_isa_lb_bayer_output_uid               psys_ipu5_isa_lb_uid + 6
-+#define psys_ipu5_isa_lb_sis_output_uid                 psys_ipu5_isa_lb_uid + 7
-+#define psys_ipu5_isa_lb_yuv_output_uid                 psys_ipu5_isa_lb_uid + 8
-+#define psys_ipu5_isa_lb_cached_out_param_uid           psys_ipu5_isa_lb_uid + 9
-+#define psys_ipu5_isa_lb_blc_type0_uid                  psys_ipu5_isa_lb_uid + 10
-+#define psys_ipu5_isa_lb_blc_type1_uid                  psys_ipu5_isa_lb_uid + 11
-+#define psys_ipu5_isa_lb_blc_type2_uid                  psys_ipu5_isa_lb_uid + 12
-+#define psys_ipu5_isa_lb_lsc_type0_uid                  psys_ipu5_isa_lb_uid + 13
-+#define psys_ipu5_isa_lb_lsc_type1_uid                  psys_ipu5_isa_lb_uid + 14
-+#define psys_ipu5_isa_lb_lsc_type2_uid                  psys_ipu5_isa_lb_uid + 15
-+#define psys_ipu5_isa_lb_3a_stat_awb_uid                psys_ipu5_isa_lb_uid + 16
-+#define psys_ipu5_isa_lb_3a_stat_af_uid                 psys_ipu5_isa_lb_uid + 17
-+#define psys_ipu5_isa_lb_3a_stat_paf_uid                psys_ipu5_isa_lb_uid + 18
-+#define psys_ipu5_isa_lb_gammastar_grid_uid             psys_ipu5_isa_lb_uid + 19
-+#define psys_ipu5_isa_lb_dvs_mv_out_l0_uid              psys_ipu5_isa_lb_uid + 20
-+#define psys_ipu5_isa_lb_dvs_mv_out_l1_uid              psys_ipu5_isa_lb_uid + 21
-+#define psys_ipu5_isa_lb_dvs_mv_out_l2_uid              psys_ipu5_isa_lb_uid + 22
-+#define psys_ipu5_isa_lb_dvs_fe_in_l0_uid               psys_ipu5_isa_lb_uid + 23
-+#define psys_ipu5_isa_lb_dvs_fe_in_l1_uid               psys_ipu5_isa_lb_uid + 24
-+#define psys_ipu5_isa_lb_dvs_fe_in_l2_uid               psys_ipu5_isa_lb_uid + 25
-+#define psys_ipu5_isa_lb_dvs_fe_out_l0_uid              psys_ipu5_isa_lb_uid + 26
-+#define psys_ipu5_isa_lb_dvs_fe_out_l1_uid              psys_ipu5_isa_lb_uid + 27
-+#define psys_ipu5_isa_lb_dvs_fe_out_l2_uid              psys_ipu5_isa_lb_uid + 28
-+
-+#define psys_ipu5_dfm_isl_ps_vpless_pg_id                          166
-+#define psys_ipu5_dfm_isl_ps_vpless_uid                            psys_2600_pg_uid(psys_ipu5_dfm_isl_ps_vpless_pg_id)
-+#define psys_ipu5_dfm_isl_ps_vpless_param_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 1
-+#define psys_ipu5_dfm_isl_ps_vpless_program_uid                    psys_ipu5_dfm_isl_ps_vpless_uid + 2
-+#define psys_ipu5_dfm_isl_ps_vpless_program_control_init_uid       psys_ipu5_dfm_isl_ps_vpless_uid + 3
-+#define psys_ipu5_dfm_isl_ps_vpless_input_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 4
-+#define psys_ipu5_dfm_isl_ps_vpless_input_paf_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 5
-+#define psys_ipu5_dfm_isl_ps_vpless_yuv_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 6
-+#define psys_ipu5_dfm_isl_ps_vpless_bayer_output_uid               psys_ipu5_dfm_isl_ps_vpless_uid + 7
-+#define psys_ipu5_dfm_isl_ps_vpless_sis_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 8
-+#define psys_ipu5_dfm_isl_ps_vpless_cached_out_param_uid           psys_ipu5_dfm_isl_ps_vpless_uid + 9
-+#define psys_ipu5_dfm_isl_ps_vpless_blc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 10
-+#define psys_ipu5_dfm_isl_ps_vpless_blc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 11
-+#define psys_ipu5_dfm_isl_ps_vpless_blc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 12
-+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 13
-+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 14
-+#define psys_ipu5_dfm_isl_ps_vpless_lsc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 15
-+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_awb_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 16
-+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_af_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 17
-+#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_paf_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 18
-+
-+#define psys_2600_video_isa_pre_gdc_pg_id               137
-+#define psys_2600_video_isa_pre_gdc_uid                 psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_pg_id)
-+#define psys_2600_video_isa_pre_gdc_param_uid           psys_2600_video_isa_pre_gdc_uid + 1
-+#define psys_2600_video_isa_pre_gdc_ae_output_uid       psys_2600_video_isa_pre_gdc_uid + 2
-+#define psys_2600_video_isa_pre_gdc_program_uid         psys_2600_video_isa_pre_gdc_uid + 3
-+#define psys_2600_video_isa_pre_gdc_input_uid           psys_2600_video_isa_pre_gdc_uid + 4
-+#define psys_2600_video_isa_pre_gdc_output_uid          psys_2600_video_isa_pre_gdc_uid + 5
-+#define psys_2600_video_isa_pre_gdc_blc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 6
-+#define psys_2600_video_isa_pre_gdc_blc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 7
-+#define psys_2600_video_isa_pre_gdc_blc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 8
-+#define psys_2600_video_isa_pre_gdc_lsc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 9
-+#define psys_2600_video_isa_pre_gdc_lsc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 10
-+#define psys_2600_video_isa_pre_gdc_lsc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 11
-+#define psys_2600_video_isa_pre_gdc_awb_output_uid      psys_2600_video_isa_pre_gdc_uid + 12
-+#define psys_2600_video_isa_pre_gdc_af_output_uid       psys_2600_video_isa_pre_gdc_uid + 13
-+#define psys_2600_video_isa_pre_gdc_dvs_in_0_uid        psys_2600_video_isa_pre_gdc_uid + 14
-+#define psys_2600_video_isa_pre_gdc_dvs_in_1_uid        psys_2600_video_isa_pre_gdc_uid + 15
-+#define psys_2600_video_isa_pre_gdc_dvs_in_2_uid        psys_2600_video_isa_pre_gdc_uid + 16
-+#define psys_2600_video_isa_pre_gdc_dvs_out_0_uid       psys_2600_video_isa_pre_gdc_uid + 17
-+#define psys_2600_video_isa_pre_gdc_dvs_out_1_uid       psys_2600_video_isa_pre_gdc_uid + 18
-+#define psys_2600_video_isa_pre_gdc_dvs_out_2_uid       psys_2600_video_isa_pre_gdc_uid + 19
-+
-+#define psys_2600_video_isl_pre_gdc_hq_pg_id                156
-+#define psys_2600_video_isl_pre_gdc_hq_uid                  psys_2600_pg_uid(psys_2600_video_isl_pre_gdc_hq_pg_id)
-+#define psys_2600_video_isl_pre_gdc_hq_param_uid            psys_2600_video_isl_pre_gdc_hq_uid + 1
-+#define psys_2600_video_isl_pre_gdc_hq_ae_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 2
-+#define psys_2600_video_isl_pre_gdc_hq_program_uid          psys_2600_video_isl_pre_gdc_hq_uid + 3
-+#define psys_2600_video_isl_pre_gdc_hq_input_uid            psys_2600_video_isl_pre_gdc_hq_uid + 4
-+#define psys_2600_video_isl_pre_gdc_hq_output_uid           psys_2600_video_isl_pre_gdc_hq_uid + 5
-+#define psys_2600_video_isl_pre_gdc_hq_blc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 6
-+#define psys_2600_video_isl_pre_gdc_hq_blc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 7
-+#define psys_2600_video_isl_pre_gdc_hq_blc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 8
-+#define psys_2600_video_isl_pre_gdc_hq_lsc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 9
-+#define psys_2600_video_isl_pre_gdc_hq_lsc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 10
-+#define psys_2600_video_isl_pre_gdc_hq_lsc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 11
-+#define psys_2600_video_isl_pre_gdc_hq_awb_output_uid       psys_2600_video_isl_pre_gdc_hq_uid + 12
-+#define psys_2600_video_isl_pre_gdc_hq_af_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 13
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_0_uid         psys_2600_video_isl_pre_gdc_hq_uid + 14
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_1_uid         psys_2600_video_isl_pre_gdc_hq_uid + 15
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_in_2_uid         psys_2600_video_isl_pre_gdc_hq_uid + 16
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_0_uid        psys_2600_video_isl_pre_gdc_hq_uid + 17
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_1_uid        psys_2600_video_isl_pre_gdc_hq_uid + 18
-+#define psys_2600_video_isl_pre_gdc_hq_dvs_out_2_uid        psys_2600_video_isl_pre_gdc_hq_uid + 19
-+
-+#define psys_2600_video_pre_gdc_hp_pg_id                 1002
-+#define psys_2600_video_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_pre_gdc_hp_pg_id)
-+#define psys_2600_video_pre_gdc_hp_param_uid             psys_2600_video_pre_gdc_hp_uid + 1
-+#define psys_2600_video_pre_gdc_hp_program_uid           psys_2600_video_pre_gdc_hp_uid + 2
-+#define psys_2600_video_pre_gdc_hp_input_uid             psys_2600_video_pre_gdc_hp_uid + 3
-+#define psys_2600_video_pre_gdc_hp_output_uid            psys_2600_video_pre_gdc_hp_uid + 4
-+#define psys_2600_video_pre_gdc_hp_ae_output_uid         psys_2600_video_pre_gdc_hp_uid + 5
-+#define psys_2600_video_pre_gdc_hp_blc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 6
-+#define psys_2600_video_pre_gdc_hp_blc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 7
-+#define psys_2600_video_pre_gdc_hp_blc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 8
-+#define psys_2600_video_pre_gdc_hp_lsc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 9
-+#define psys_2600_video_pre_gdc_hp_lsc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 10
-+#define psys_2600_video_pre_gdc_hp_lsc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 11
-+#define psys_2600_video_pre_gdc_hp_hw3a_awb_output_uid   psys_2600_video_pre_gdc_hp_uid + 12
-+#define psys_2600_video_pre_gdc_hp_hw3a_af_output_uid    psys_2600_video_pre_gdc_hp_uid + 13
-+#define psys_2600_video_pre_gdc_hp_fw3a_rgby_uid         psys_2600_video_pre_gdc_hp_uid + 14
-+#define psys_2600_video_pre_gdc_hp_fw3a_rgbs_uid         psys_2600_video_pre_gdc_hp_uid + 15
-+#define psys_2600_video_pre_gdc_hp_fw3a_ydrc_uid         psys_2600_video_pre_gdc_hp_uid + 16
-+#define psys_2600_video_pre_gdc_hp_drc_mapin_uid         psys_2600_video_pre_gdc_hp_uid + 17
-+
-+#define psys_2600_video_post_gdc_hp_pg_id                1003
-+#define psys_2600_video_post_gdc_hp_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hp_pg_id)
-+#define psys_2600_video_post_gdc_hp_param_uid            psys_2600_video_post_gdc_hp_uid + 1
-+#define psys_2600_video_post_gdc_hp_program_uid          psys_2600_video_post_gdc_hp_uid + 2
-+#define psys_2600_video_post_gdc_hp_input_uid            psys_2600_video_post_gdc_hp_uid + 3
-+#define psys_2600_video_post_gdc_hp_spatial_param_uid    psys_2600_video_post_gdc_hp_uid + 4
-+#define psys_2600_video_post_gdc_hp_output_uid           psys_2600_video_post_gdc_hp_uid + 5
-+#define psys_2600_video_post_gdc_hp_secondary_output_uid psys_2600_video_post_gdc_hp_uid + 6
-+#define psys_2600_video_post_gdc_hp_third_output_uid     psys_2600_video_post_gdc_hp_uid + 7
-+#define psys_2600_video_post_gdc_hp_tnr_input_uid        psys_2600_video_post_gdc_hp_uid + 8
-+#define psys_2600_video_post_gdc_hp_tnr_sim_input_uid    psys_2600_video_post_gdc_hp_uid + 9
-+#define psys_2600_video_post_gdc_hp_tnr_output_uid       psys_2600_video_post_gdc_hp_uid + 10
-+#define psys_2600_video_post_gdc_hp_tnr_sim_output_uid   psys_2600_video_post_gdc_hp_uid + 11
-+
-+#define psys_2600_video_hdr_pre_proc_pg_id                1005
-+#define psys_2600_video_hdr_pre_proc_uid                  psys_2600_pg_uid(psys_2600_video_hdr_pre_proc_pg_id)
-+#define psys_2600_video_hdr_pre_proc_param_uid            psys_2600_video_hdr_pre_proc_uid + 1
-+#define psys_2600_video_hdr_pre_proc_program_uid          psys_2600_video_hdr_pre_proc_uid + 2
-+#define psys_2600_video_hdr_pre_proc_input_uid            psys_2600_video_hdr_pre_proc_uid + 3
-+#define psys_2600_video_hdr_pre_proc_output_uid           psys_2600_video_hdr_pre_proc_uid + 4
-+#define psys_2600_video_hdr_pre_proc_secondary_output_uid psys_2600_video_hdr_pre_proc_uid + 5
-+#define psys_2600_video_hdr_pre_proc_ae_output_uid        psys_2600_video_hdr_pre_proc_uid + 6
-+#define psys_2600_video_hdr_pre_proc_blc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 7
-+#define psys_2600_video_hdr_pre_proc_blc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 8
-+#define psys_2600_video_hdr_pre_proc_blc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 9
-+#define psys_2600_video_hdr_pre_proc_lsc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 10
-+#define psys_2600_video_hdr_pre_proc_lsc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 11
-+#define psys_2600_video_hdr_pre_proc_lsc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 12
-+#define psys_2600_video_hdr_pre_proc_hw3a_awb_output_uid  psys_2600_video_hdr_pre_proc_uid + 13
-+#define psys_2600_video_hdr_pre_proc_hw3a_af_output_uid   psys_2600_video_hdr_pre_proc_uid + 14
-+#define psys_2600_video_hdr_pre_proc_fw3a_rgby_uid        psys_2600_video_hdr_pre_proc_uid + 15
-+#define psys_2600_video_hdr_pre_proc_fw3a_rgbs_uid        psys_2600_video_hdr_pre_proc_uid + 16
-+#define psys_2600_video_hdr_pre_proc_fw3a_ydrc_uid        psys_2600_video_hdr_pre_proc_uid + 17
-+#define psys_2600_video_hdr_pre_proc_drc_mapin_uid        psys_2600_video_hdr_pre_proc_uid + 18
-+
-+#define psys_2600_video_pre_gdc_hq_ns_pg_id                1007
-+#define psys_2600_video_pre_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_ns_pg_id)
-+#define psys_2600_video_pre_gdc_hq_ns_param_uid            psys_2600_video_pre_gdc_hq_ns_uid + 1
-+#define psys_2600_video_pre_gdc_hq_ns_program_uid          psys_2600_video_pre_gdc_hq_ns_uid + 2
-+#define psys_2600_video_pre_gdc_hq_ns_input_uid            psys_2600_video_pre_gdc_hq_ns_uid + 3
-+#define psys_2600_video_pre_gdc_hq_ns_output_uid           psys_2600_video_pre_gdc_hq_ns_uid + 4
-+#define psys_2600_video_pre_gdc_hq_ns_noise_output_uid     psys_2600_video_pre_gdc_hq_ns_uid + 5
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l0_uid        psys_2600_video_pre_gdc_hq_ns_uid + 6
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l1_uid        psys_2600_video_pre_gdc_hq_ns_uid + 7
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l2_uid        psys_2600_video_pre_gdc_hq_ns_uid + 8
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l0_uid       psys_2600_video_pre_gdc_hq_ns_uid + 9
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l1_uid       psys_2600_video_pre_gdc_hq_ns_uid + 10
-+#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l2_uid       psys_2600_video_pre_gdc_hq_ns_uid + 11
-+
-+#define psys_2600_video_post_gdc_hq_ns_pg_id                1008
-+#define psys_2600_video_post_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_ns_pg_id)
-+#define psys_2600_video_post_gdc_hq_ns_param_uid            psys_2600_video_post_gdc_hq_ns_uid + 1
-+#define psys_2600_video_post_gdc_hq_ns_program_uid          psys_2600_video_post_gdc_hq_ns_uid + 2
-+#define psys_2600_video_post_gdc_hq_ns_input_uid            psys_2600_video_post_gdc_hq_ns_uid + 3
-+#define psys_2600_video_post_gdc_hq_ns_spatial_param_uid    psys_2600_video_post_gdc_hq_ns_uid + 4
-+#define psys_2600_video_post_gdc_hq_ns_output_uid           psys_2600_video_post_gdc_hq_ns_uid + 5
-+#define psys_2600_video_post_gdc_hq_ns_secondary_output_uid psys_2600_video_post_gdc_hq_ns_uid + 6
-+#define psys_2600_video_post_gdc_hq_ns_third_output_uid     psys_2600_video_post_gdc_hq_ns_uid + 7
-+#define psys_2600_video_post_gdc_hq_ns_tnr_input_uid        psys_2600_video_post_gdc_hq_ns_uid + 8
-+#define psys_2600_video_post_gdc_hq_ns_tnr_output_uid       psys_2600_video_post_gdc_hq_ns_uid + 9
-+#define psys_2600_video_post_gdc_hq_ns_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_ns_uid + 10
-+#define psys_2600_video_post_gdc_hq_ns_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_ns_uid + 11
-+#define psys_2600_video_post_gdc_hq_ns_input_ns_uid         psys_2600_video_post_gdc_hq_ns_uid + 12
-+
-+#define psys_2600_video_post_gdc_hq_4k_pg_id                1011
-+#define psys_2600_video_post_gdc_hq_4k_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_4k_pg_id)
-+#define psys_2600_video_post_gdc_hq_4k_param_uid            psys_2600_video_post_gdc_hq_4k_uid + 1
-+#define psys_2600_video_post_gdc_hq_4k_program_uid          psys_2600_video_post_gdc_hq_4k_uid + 2
-+#define psys_2600_video_post_gdc_hq_4k_input_uid            psys_2600_video_post_gdc_hq_4k_uid + 3
-+#define psys_2600_video_post_gdc_hq_4k_spatial_param_uid    psys_2600_video_post_gdc_hq_4k_uid + 4
-+#define psys_2600_video_post_gdc_hq_4k_output_uid           psys_2600_video_post_gdc_hq_4k_uid + 5
-+#define psys_2600_video_post_gdc_hq_4k_secondary_output_uid psys_2600_video_post_gdc_hq_4k_uid + 6
-+#define psys_2600_video_post_gdc_hq_4k_third_output_uid     psys_2600_video_post_gdc_hq_4k_uid + 7
-+#define psys_2600_video_post_gdc_hq_4k_tnr_input_uid        psys_2600_video_post_gdc_hq_4k_uid + 8
-+#define psys_2600_video_post_gdc_hq_4k_tnr_output_uid       psys_2600_video_post_gdc_hq_4k_uid + 9
-+#define psys_2600_video_post_gdc_hq_4k_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_4k_uid + 10
-+#define psys_2600_video_post_gdc_hq_4k_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_4k_uid + 11
-+#define psys_2600_video_post_gdc_hq_4k_input_ns_uid         psys_2600_video_post_gdc_hq_4k_uid + 12
-+
-+#define psys_2600_gaussian_pg_id          123
-+#define psys_2600_gaussian_uid            psys_2600_pg_uid(psys_2600_gaussian_pg_id)
-+#define psys_2600_gaussian_param_uid      psys_2600_gaussian_uid + 1
-+#define psys_2600_gaussian_program_uid    psys_2600_gaussian_uid + 2
-+#define psys_2600_gaussian_input_uid      psys_2600_gaussian_uid + 3
-+#define psys_2600_gaussian_output_h_uid   psys_2600_gaussian_uid + 4
-+#define psys_2600_gaussian_output_v_uid   psys_2600_gaussian_uid + 5
-+
-+#define psys_2600_video_isa_pre_gdc_hq_4k_pg_id         1012
-+#define psys_2600_video_isa_pre_gdc_hq_4k_uid           psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_hq_4k_pg_id)
-+
-+#define psys_2600_video_hdr_pre_gdc_hp_pg_id                 1015
-+#define psys_2600_video_hdr_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_hdr_pre_gdc_hp_pg_id)
-+#define psys_2600_video_hdr_pre_gdc_hp_isl_input_uid         psys_2600_video_hdr_pre_gdc_hp_uid + 4
-+#define psys_2600_video_hdr_pre_gdc_hp_isl_output_uid        psys_2600_video_hdr_pre_gdc_hp_uid + 5
-+
-+#define psys_2600_video_pre_gdc_ll_pg_id                1004
-+#define psys_2600_video_pre_gdc_ll_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_ll_pg_id)
-+#define psys_2600_video_pre_gdc_ll_param_uid            psys_2600_video_pre_gdc_ll_uid + 1
-+#define psys_2600_video_pre_gdc_ll_program_uid          psys_2600_video_pre_gdc_ll_uid + 2
-+#define psys_2600_video_pre_gdc_ll_input_uid            psys_2600_video_pre_gdc_ll_uid + 3
-+#define psys_2600_video_pre_gdc_ll_output_uid           psys_2600_video_pre_gdc_ll_uid + 4
-+
-+//NCR mono-ds pg
-+#define psys_2600_ncr_monods_gdc_pg_id                1150
-+#define psys_2600_ncr_monods_gdc_uid                  psys_2600_pg_uid(psys_2600_ncr_monods_gdc_pg_id)
-+#define psys_2600_ncr_monods_gdc_param_uid            psys_2600_ncr_monods_gdc_uid + 1
-+#define psys_2600_ncr_monods_gdc_program_uid          psys_2600_ncr_monods_gdc_uid + 2
-+#define psys_2600_ncr_monods_gdc_input_uid            psys_2600_ncr_monods_gdc_uid + 3
-+#define psys_2600_ncr_monods_gdc_output_uid           psys_2600_ncr_monods_gdc_uid + 4
-+#define psys_2600_ncr_monods_gdc_output_ds4_uid       psys_2600_ncr_monods_gdc_uid + 5
-+#define psys_2600_ncr_monods_gdc_output_ds16_uid      psys_2600_ncr_monods_gdc_uid + 6
-+
-+#define psys_interleaved_code_uid     ia_fourcc('I','L','C','S')
-+#define psys_interleaved_code_in_uid  psys_interleaved_code_uid + 1
-+#define psys_interleaved_code_out_uid psys_interleaved_code_uid + 2
-+
-+#define psys_command_psys_frequency_uid ia_fourcc('P','S','C','F')
-+#define psys_command_priority_uid       ia_fourcc('P','S','C','P')
-+#define psys_command_timeout_ms_uid     ia_fourcc('P','S','C','T')
-+#define psys_stage_operation_mode_uid   ia_fourcc('P','S','O','P')
-+#define psys_stage_routing_bitmap_uid   ia_fourcc('R','B','M','0')
-+
-+#define psys_software_terminal_uid(pg_id)               ia_fourcc('P','S',((pg_id & 0xFF00) >> 8),pg_id)
-+#define psys_software_terminal_uid_from_stage_uid(uid)  psys_software_terminal_uid(psys_2600_pg_id_from_uid(uid))
-+#define is_psys_software_terminal_uid(uid)              ((uid & 0xFFFF0000) == psys_software_terminal_uid(0))
-+
-+#define is_post_gdc_uid(uid)    (uid == psys_2600_post_gdc_uid \
-+                              || uid == psys_2600_video_post_gdc_uid \
-+                              || uid == psys_2600_video_post_gdc_v2_uid \
-+                              || uid == psys_2600_video_post_gdc_mbr_uid \
-+                              || uid == psys_2600_video_post_gdc_v2_mbr_uid \
-+                              || uid == psys_2600_video_post_gdc_hq_ns_uid \
-+                              || uid == psys_2600_still_post_gdc_uid \
-+                              || uid == psys_2600_still_post_gdc_v2_uid \
-+                              || uid == psys_2600_still_post_gdc_mbr_uid \
-+                              || uid == psys_2600_still_post_gdc_v2_mbr_uid \
-+                              || uid == psys_ipu5_still_post_gdc_v4_uid \
-+                              || uid == psys_ipu5_video_post_gdc_v4_uid \
-+                              || uid == psys_ipu5_video_post_gdc_uid \
-+                              || uid == psys_ipu6_bb_uid \
-+                              || uid == psys_ipu6_bb_gdc_uid \
-+                              || uid == psys_ipu5_video_post_gdc_10bit_uid \
-+                              || uid == psys_ipu5_still_post_gdc_10bit_uid)
-+
-+#define is_pre_gdc_uid(uid)     (uid == psys_2600_video_pre_gdc_uid \
-+                              || uid == psys_2600_video_pre_gdc_hq_uid \
-+                              || uid == psys_2600_video_pre_gdc_hq_vcr2_uid \
-+                              || uid == psys_2600_video_pre_gdc_ll_uid \
-+                              || uid == psys_2600_ipu5_video_pre_gdc_uid \
-+                              || uid == psys_2600_ipu6_lb_video_uid \
-+                              || uid == psys_ipu6_lb_rbm_uid \
-+                              || uid == psys_2600_still_pre_gdc_uid \
-+                              || uid == psys_2600_still_pre_gdc_vcr2_uid \
-+                              || uid == psys_2600_still_pre_gdc_v3_uid \
-+                              || uid == psys_2600_ipu5_still_pre_gdc_uid \
-+                              || uid == psys_2600_ipu5_still_pre_gdc_no_xnr_uid \
-+                              || uid == psys_2600_ipu5_still_pre_gdc_vpless_uid)
-+
-+#define is_combined_pg_uid(uid) (uid == psys_2600_video_isa_pre_gdc_uid \
-+                              || uid == psys_2600_video_isl_pre_gdc_hq_uid \
-+                              || uid == psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid \
-+                              || uid == psys_ipu5_isa_lb_uid \
-+                              || uid == psys_ipu6_isa_lb_uid)
-+
-+#define is_isl_pg_uid(uid)    (uid == psys_ipu6_isa_rbm_uid \
-+                            || uid == psys_ipu6s_isa_uid \
-+                            || uid == psys_fake_ipu6s_isa_uid \
-+                            || uid == psys_ipu5_dfm_isl_ps_vpless_uid)
-+
-+#define is_gpu_stage_uid(uid) (uid == burstisp_stage_uid)
-+
-+/* COMMON CSS UIDS */
-+#define css_program_group_params_uid        ia_fourcc('C','S','S','P')
-+#define css_frame_descriptor_uid            ia_fourcc('C','S','S','F')
-+#define css_sc_descriptor_uid               ia_fourcc('C','S','S','C')
-+#define css_frame_max_resolution_uid        ia_fourcc('C','S','M','A')
-+#define css_frame_min_resolution_uid        ia_fourcc('C','S','M','I')
-+#define css_program_group_manifest_uid      ia_fourcc('C','S','S','M')
-+#define css_process_group_uid               ia_fourcc('C','S','P','G')
-+#define css_process_group_size_uid          ia_fourcc('C','S','P','S')
-+#define css_cipr_context_uid                ia_fourcc('C','S','C','C')
-+#define css_create_ppg_uid                  ia_fourcc('C','S','C','P')
-+#define css_fragment_max_uid                ia_fourcc('C','S','F','<')
-+#define css_fragment_min_uid                ia_fourcc('C','S','F','>')
-+#define css_fragment_uid                    ia_fourcc('C','S','F','S')
-+#define css_fragment_overlap_uid            ia_fourcc('C','S','F','O')
-+#define css_fragment_count_uid              ia_fourcc('C','S','F','C')
-+#define css_terminal_descriptor_uid         ia_fourcc('C','S','S','T')
-+#define css_kernel_bitmap_uid               ia_fourcc('C','S','S','K')
-+#define css_dynamic_kernel_bitmap_uid       ia_fourcc('C','S','S','D')
-+#define css_fragment_grid_desc_uid          ia_fourcc('C','S','F','G')
-+#define css_frame_grid_param_desc_uid       ia_fourcc('C','S','F','P')
-+#define css_param_section_desc_uid          ia_fourcc('C','S','P','D')
-+#define css_frag_param_section_desc_uid     ia_fourcc('C','S','F','D')
-+#define css_kernel_disable_uid              ia_fourcc('C','S','K','D')
-+#define css_terminal_link_id_uid            ia_fourcc('C','S','N','K')
-+#define css_pg_manifest_uid                 ia_fourcc('C','S','M','F')
-+#define css_terminal_connection_type_uid    ia_fourcc('C','S','C','T')
-+#define css_terminal_stream2gen_buffer_size_uid    ia_fourcc('C','S','S','B')
-+
-+
-+/* Encode 8bit vied_nci_resource_id_t into least significant byte of UID */
-+#define css_vied_nci_kernel_id_uid_mask ia_fourcc(0xFF,0xFF,0xFF,0)
-+#define css_vied_nci_kernel_id_uid(x)   ia_fourcc('K','I','#', x)
-+
-+/** PSYS stage operation modes
-+ *
-+ * Controllable via psys_stage_operation_mode_uid property
-+ */
-+typedef enum _psys_stage_opmode {
-+    _psys_stage_opmode_na_,         /**< not set, defaults to raw */
-+    _psys_stage_opmode_raw_,        /**< basic operation */
-+    _psys_stage_opmode_coupled_,    /**< Couple stage with downstream.
-+                                         Note: With coupling the IPU commands
-+                                         of consequent stages can be re-ordered
-+                                         for optimal scheduling with IPU
-+                                         parallelism. Delay queues are added
-+                                         between stages to sustain SDF.
-+                                        */
-+    _psys_stage_opmode_coupled_relay_, /**< Relay coupling towards downstream
-+                                         Note: When more than 2 stages
-+                                         participate in custom scheduling
-+                                         discipline. Stages can be used to
-+                                         relay the command-list (bundle) ahead
-+                                         to stages in downstream.
-+                                        */
-+    _psys_stage_opmode_delay_only_,  /**< Delay outputs by one.
-+                                         Note: Uses delays with default
-+                                         scheduling discipline. Used to expose
-+                                         aligned delay queue semantics as with
-+                                         coupled mode but without changes to
-+                                         command queueing.
-+                                        */
-+    _psys_stage_opmode_incomplete_  /**< no fragmenting and PG creation */
-+} psys_stage_opmode_t;
-+
-+/*** User control utils for PSYS stage ***/
-+
-+/** Calculate sizeof unidentified PSYS stage property
-+ *
-+ * This function is intended for generalizing the calculus of stage property
-+ * sizes when they need to be identified by user, but PSYS library provides
-+ * helper utilities for the purpose.
-+ *
-+ * Property sizes may dependent on other configuration details of a stage. In
-+ * such case the order of sequence needs to be derived from PSYS PG
-+ * specification.
-+ *
-+ * Returns 0 when property cannot be identified or size calculus misses input.
-+ * Note: value 0 cannot be set as size of property payload and hence the
-+ * property identification loop will fail unless user handles the case.
-+ *
-+ * \param[in]   property    property object to identify
-+ */
-+uint32_t psys_library_control_sizeof_property(ia_cipf_property_t *property);
-+
-+/** Preset data of PSYS stage buffer
-+ *
-+ * This function is intended to be called when new buffers are allocated and
-+ * registered for use of PSYS stage.
-+ *
-+ * In case of parameter buffers, this function can be expected to take care
-+ * of setting the defaults when available.
-+ *
-+ * Buffer preset function may be dependent on other configuration details of
-+ * a stage. This function can be expected to fetch the information from the
-+ * stage that user has configured according to PSYS PG specification as a
-+ * precondition (e.g terminal formats need to be configured).
-+ *
-+ * \param[in,out] buffer    buffer object to preset
-+ */
-+css_err_t psys_library_control_preset_buffer(ia_cipf_buffer_t *buffer);
-+
-+/** Preset parameter terminal buffer section sizes in Windows use case
-+ *
-+ * This function is intended to be called during identify loop to handle
-+ * parameter terminal properties exposed from PSYS stage.
-+ *
-+ * This function will set buffer section sizes according to specification
-+ * from manifest.
-+ *
-+ * \param[in,out] terminal    terminal object to preset
-+ */
-+css_err_t
-+psys_library_control_preset_terminal_sections(ia_cipf_terminal_t *terminal);
-+
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
-new file mode 100644
-index 000000000000..a25d9b96c6b4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
-@@ -0,0 +1,81 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+/*!
-+ * \file ia_aec.h
-+ * \brief Definitions and declarations of Intel AEC algorithm.
-+ */
-+
-+#ifndef _IA_AEC_H_
-+#define _IA_AEC_H_
-+
-+#include "ia_configuration.h"
-+#include "ia_types.h"
-+#include "ia_ccat.h"
-+#include "ia_aec_types.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Initialize IA_AEC
-+ * This function must be called before any other function in the library. It allocates memories for all AEC algorithms based on input parameters
-+ * given by the user. AIQB (from CPFF). Initialization returns a handle to the AEC instance, which is given as input parameter for all the
-+ * subsequent calls to this library. Therefore, multiple instances of AEC can running simultaneously. For example one instance per camera.
-+ *
-+ * \param[in]     atbx              Analysis Toolbox handle. AEC will use it to get statistics analysis results.
-+ * \param[in]     aiqb_data         Contains tuning parameters for AEC algorithms. NULL, if built-ion defaults are to be used.
-+ * return                           IA_AEC handle. Use the returned handle as input parameter for the consequent IA_AEC calls.
-+ */
-+LIBEXPORT ia_aec*
-+ia_aec_init(
-+    ia_ccat *ccat,
-+    const ia_binary_data *aiqb_data,
-+    const ia_cmc_t *a_cmc_ptr);
-+
-+/*!
-+ * \brief De-initialize IA_AEC and its submodules.
-+ * All memory allocated by AEC algorithm is freed. AEC handle can no longer be used.
-+ *
-+ * \param[in] ia_aec                AEC instance handle.
-+ */
-+LIBEXPORT void
-+ia_aec_deinit(ia_aec *ia_aec);
-+
-+/*!
-+ * \brief AEC calculation based on input parameters and frame statistics.
-+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
-+ *
-+ * \param[in] ia_aec                 AEC instance handle.
-+ * \param[in] aec_input_params       Input parameters for AEC calculations.
-+ * \param[out] aec_results           Pointer where AEC results are stored. Client allocates this memory and AEC only fills it with next exposure parameters.
-+ * \return                           Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aec_run(
-+    ia_aec *ia_aec,
-+    const ia_aec_input_params *aec_input_params,
-+    ia_aec_results *aec_results);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_AEC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
-new file mode 100644
-index 000000000000..ed54b294474f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
-@@ -0,0 +1,143 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+/*!
-+ * \file ia_aec.h
-+ * \brief Definitions and declarations of Intel AEC algorithm.
-+ */
-+
-+#ifndef _IA_AEC_TYPES_H_
-+#define _IA_AEC_TYPES_H_
-+
-+#include "ia_configuration.h"
-+#include "ia_types.h"
-+#include "ia_aiq_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
-+#define IA_AEC_WEIGHT_GRID_SIZE (IA_AEC_WEIGHT_GRID_WIDTH * IA_AEC_WEIGHT_GRID_HEIGHT)
-+typedef struct
-+{
-+    unsigned int grid_width;
-+    unsigned int grid_height;
-+    unsigned char data[IA_AEC_WEIGHT_GRID_SIZE];
-+} ia_aec_weight_grid;
-+#endif
-+
-+typedef struct ia_aec_t ia_aec;
-+
-+/*!
-+ * \brief Input parameter structure for AE algorithm.
-+ * This structure can be initialized to zero values for basic functionality (disable or make features ineffective).
-+ */
-+typedef struct
-+{
-+    unsigned int num_exposures;                                                     /*!< The number of exposure outputs to have. One for LDR, two or more for HDR/exposure bracketing. */
-+    ia_aiq_exposure_sensor_descriptor sensor_descriptor[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Sensor specific descriptor and limits of the used sensor mode for target frame use. */
-+    unsigned int num_sensor_descriptors;                                            /*!< The number of sensor descriptors given in the above pointer.
-+                                                                                         Used to specify different sensor descriptors for each exposure. */
-+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority;        /*!< AEC exposure distribution priority mode. */
-+    ia_aiq_ae_priority_mode priority_mode;                                          /*!< AEC priority mode. */
-+    float manual_convergence_time;                                                  /*!< Manual AEC convergence speed in seconds.
-+                                                                                        < 0.0   Use convergence speed from tunings.
-+                                                                                         0.0    Convergence filters are bypassed. This is similar behavior as in previous API when using frame_use still
-+                                                                                         > 0.0  Overrides convergence speed from tunings. */
-+    ia_aiq_ae_manual_limits manual_limits[IA_AEC_EXPOSURES_MAX_NUM];                /*!< Manual limits which override limits defined in AEC tunings. If tunings are to be used, all values must be set to 0. */
-+    unsigned int num_manual_limits;                                                 /*!< Number of limits to use. One, if same limits are used for all exposures, two or more if different limits for each exposure are used. */
-+    float ev_shift;                                                                 /*!< Exposure Value shift [-4,4]. */
-+#ifdef IA_AEC_FEATURE_FLASH
-+    ia_aiq_flash_mode flash_mode;                                                   /*!< Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
-+#endif
-+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
-+    ia_aiq_ae_metering_mode metering_mode;                                          /*!< AEC metering mode. */
-+#endif
-+#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
-+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;                             /*!< AEC flicker reduction mode. */
-+#endif
-+#ifdef IA_AEC_FEATURE_ROI_ENABLED
-+    ia_rectangle exposure_window;                                                   /*!< Rectangle of area which AEC uses to to calculate new exposure parameters. If rectangle is not to be used, all values must be set to 0. */
-+#endif
-+#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
-+    float manual_aperture_fn;                                                       /*!< Manual f-number of aperture (e.g. 2.8), <= 0.0 for N/A. Used only with P iris. */
-+#endif
-+#ifdef IA_AEC_FEATURE_DC_IRIS
-+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command;                 /*!< Used only with DC iris. 0 (auto) for N/A. */
-+#endif
-+} ia_aec_input_params;
-+
-+/*!
-+ *  \brief Gain structure defining gain value and type.
-+ */
-+typedef struct
-+{
-+    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
-+    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
-+} ia_aec_gain;
-+
-+/*!
-+* \brief AEC results.
-+*/
-+typedef struct
-+{
-+    unsigned int exposure_time_us;           /*!< Exposure time in microseconds, -1 if N/A. */
-+    ia_aec_gain gains[IA_CMC_GAINS_MAX_NUM]; /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
-+    unsigned int num_gains;                  /*!< The number of gains. */
-+    int iso;                                 /*!< ISO value corresponding to the total gains. -1 if N/A. */
-+    unsigned int total_target_exposure;      /*!< Total exposure ie. combination of Et, Total gains and Aperture gain, -1 if N/A. */
-+} ia_aec_exposure_parameters;
-+
-+typedef struct
-+{
-+    unsigned int exposure_index;                                                    /*!< Exposure index which identifies the exposure. */
-+    ia_aec_exposure_parameters exposure[IA_AEC_EXPOSURE_PLANS_NUM];                 /*!< Exposure parameters to be used in the next frame in generic format. */
-+    ia_aiq_exposure_sensor_parameters sensor_exposure[IA_AEC_EXPOSURE_PLANS_NUM];   /*!< Exposure parameters to be used in the next frame in sensor specific format. */
-+    unsigned int exposure_plan_ids[IA_AEC_EXPOSURE_PLANS_NUM];                      /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
-+    float distance_from_convergence;                                                /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
-+} ia_aec_exposure_result;
-+
-+typedef struct
-+{
-+    ia_aec_exposure_result exposures[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Results for each exposure to be used in the next frame. */
-+    unsigned int num_exposures;                                  /*!< The number of calculated exposures. */
-+    float lux_level_estimate;                                    /*!< Lux level estimate. */
-+    bool converged;                                              /*!< Indicates that AE has converged. */
-+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
-+    ia_aec_weight_grid weight_grid;                              /*!< Weight map to be used in the next frame histogram calculation. */
-+#endif
-+#ifdef IA_AEC_FEATURE_FLASH
-+    ia_aiq_flash_parameters flashes[IA_AEC_FLASHES_NUM];         /*!< Array of flash parameters for each flashes to be used in the next frame. */
-+#endif
-+#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
-+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;          /*!< Flicker reduction mode proposed by the AEC algorithm */
-+#endif
-+#ifdef IA_AEC_FEATURE_MULTIFRAME_HINT
-+    ia_aiq_bracket_mode multiframe;                              /*!< AEC may propose to use multiframe for optimal results. */
-+#endif
-+#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
-+    ia_aiq_aperture_control aperture_control;                    /*!< Aperture control parameters. */
-+#endif
-+} ia_aec_results;
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_AEC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
-new file mode 100644
-index 000000000000..c90706685c3c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
-@@ -0,0 +1,181 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_aic_myriad.h
-+ * \brief ia_aic_myriad specific implementation.
-+ *
-+ * \mainpage
-+ * \section main Automatic ISP (AIC) Configuration component for Myriad ISP
-+ *
-+ * AIC is stateless component, which purpose is to
-+ * - Convert generic results into ISP specific format.
-+ * - Adapt ISP tunings based on run-time changing parameters.
-+ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
-+ *
-+ * AIC consists of following components:
-+ * - \ref gaic
-+ *
-+ * AIC API is defined in ia_aic_myriad.h file.
-+ *
-+ * See \ref integration for more detailed information about various integration details.
-+ *
-+ * \page aicparts AIC modules
-+ * \section gaic Generic AIC (GAIC)
-+ *
-+ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
-+ * schemes to calculate ISP parameters between distinct tunings.
-+ *
-+ * \page integration Integration notes
-+ * \section AIC output buffer state
-+ *
-+ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
-+ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
-+ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
-+ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
-+ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
-+ *
-+*/
-+
-+#ifndef IA_AIC_MYRIAD_H_
-+#define IA_AIC_MYRIAD_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ipipe.h"
-+#include "ia_statistics_types.h"
-+//#include "ia_dvs_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef struct ia_aic_myriad_t ia_aic_myriad;
-+
-+/*!
-+ * \brief Initialize ia_aic_myriad.
-+ * This function must be called before any other function in the library.
-+ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the ia_aic_myriad functions.
-+ */
-+
-+LIBEXPORT ia_aic_myriad*
-+ia_aic_myriad_init(void);
-+
-+LIBEXPORT void
-+ia_aic_myriad_deinit(ia_aic_myriad *ia_aic_myriad);
-+
-+LIBEXPORT ia_err
-+ia_aic_myriad_set_tuning(
-+    ia_aic_myriad *aic_myriad,
-+    const ia_binary_data *aiqb_data,
-+    const ia_cmc_t *ia_cmc);
-+
-+/*!
-+ *  \brief ia_aic_myriad parameter input structure.
-+ */
-+typedef struct
-+{
-+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_aic_myriad_run function is called. AIC uses timestamp to decide what
-+                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
-+    unsigned int frame_width;
-+    unsigned int frame_height;
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
-+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
-+                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
-+                                                                     ae results and not only needed parameters. */
-+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
-+    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
-+//    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
-+} ia_aic_myriad_input_params;
-+
-+/*!
-+ * \brief ISP configuration for the next frame
-+ * Computes ISP parameters from input parameters and CPF values for the next image.
-+ *
-+ * \param[in] ia_aic_myriad                 Mandatory. ISP instance handle.
-+ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
-+ * \param[in/out] output                    Mandatory. Output data structure. If output pointer is given, AIC writes the results to given buffer.
-+ *                                                     Output is following ISP API format.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aic_myriad_run(
-+    ia_aic_myriad *ia_aic_myriad,
-+    const ia_aic_myriad_input_params *input_params,
-+    icIspConfig *output);
-+
-+/*!
-+ * \brief Creates ISP parameters output buffer.
-+ * This function can be used by AIC client to create AIC output buffer. This function's output can be
-+ * passed ia_aic_myriad_run() function to fill the output_data structure.
-+ *
-+ * \return                         ISP configuration parameter structure.
-+ */
-+LIBEXPORT icIspConfig *
-+ia_aic_myriad_create_output(void);
-+
-+LIBEXPORT void
-+ia_aic_myriad_delete_output(icIspConfig *output);
-+
-+LIBEXPORT ia_err
-+ia_aic_myriad_statistics_convert_rgbs_grid_v2(
-+        const icIspConfig *isp_config,
-+        ia_rgbs_grid *rgbs_grid);
-+
-+LIBEXPORT ia_err
-+ia_aic_myriad_statistics_convert_rgbs_grid(
-+    const icIspConfig *isp_config,
-+    ia_aiq_rgbs_grid *rgbs_grid);
-+
-+/*!
-+ * \brief Converts Myriad ISP specific convolution filter response grid statistics to CCAT format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into CCAT format.
-+ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
-+ *
-+ * \param[out] out_fr_grid   Mandatory.\n
-+ *                           Pointer's to structure where converted statistics are stored.
-+ *                           Converted af grid statistics.
-+ * \return                   Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aic_myriad_statistics_convert_fr_grid_v2(
-+    const icIspConfig *isp_config,
-+    ia_filter_response_grid *out_fr_grid);
-+
-+/*!
-+ * \brief Converts Myriad ISP specific convolution filter response grid statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
-+ *
-+ * \param[out] out_fr_grid   Mandatory.\n
-+ *                           Pointer's pointer where address of converted statistics are stored.
-+ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
-+ * \return                   Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aic_myriad_statistics_convert_fr_grid(
-+    const icIspConfig *isp_config,
-+    ia_aiq_af_grid *out_fr_grid);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_AIC_MYRIAD_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
-new file mode 100644
-index 000000000000..64c2170dc301
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
-@@ -0,0 +1,621 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \mainpage IA AIQ API documentation
-+ *
-+ * Browse Files and Classes tabs for details.
-+ *
-+ * \section general General info
-+ *
-+ * AIQ API has been designed to be re-entrant. Each algorithm function can be called multiple times per frame.
-+ * Input parameters for the algorithms define what is the output ie. running an algorithm with same input parameters
-+ * and same statistics produce the same output. For example one can run AE multiple times with different EV compensations
-+ * to get parameters for exposure bracketing.
-+ *
-+ * AIQ (Algorithms and Image Quality) library contains several algorithm which are used to modify RAW image.
-+ * Currently following features and algorithms are supported:
-+ * - \ref aec (Automatic Exposure Control)
-+ * - \ref awb (Automatic White Balance)
-+ * - \ref af (Automatic Focus)
-+ * - \ref sa (Shading Adaptor)
-+ * - \ref pa (Parameter Adaptor)
-+ * - \ref dsd (Discrete Scene Detection)
-+ * - \ref gbce (Global Brightness and Contrast Enhancement)
-+ *
-+ * AIQ also supports calculation of parameters for multiframe bracketing cases:
-+ * - \ref afbracket (Automatic Focus Bracket)
-+ * - \ref aebracket (Automatic Exposure Bracket)
-+ *
-+ * Running AIQ algorithms requires following steps:
-+ * - \ref init
-+ * - \ref stats
-+ * - \ref running
-+ * - \ref deinit
-+ *
-+ * Some AIQ algorithms require coordinates as inputs to specify a certain area in the image. Coordinates are relative to
-+ * the statistics thus not necessarily the whole sensor area. Coordinates are not absolute but relative. See \link ia_coordinate.h \endlink
-+ * for detailed description of the used coordinate system.
-+ * <br><hr><br>
-+ *
-+ * \section init Initialization of AIQ library
-+ *
-+ * \copybrief ia_aiq_init
-+ * To create an instance of AIQ library one must call function:
-+ * \code ia_aiq_init \endcode
-+ * \copydetails ia_aiq_init
-+ *
-+ * <br><hr><br>
-+ *
-+ * \section stats Setting of frame statistics
-+ *
-+ * Algorithms depend on statistics collected from the RAW image. Some or all of the statistics are
-+ * calculated by the ISP after RAW image capture from camera sensor. These statistics are always collected from
-+ * captured image data. To convert statistics from ISP specific format to AIQ format, a helper function can be used:
-+ * \code ia_isp_XXX_statistics_convert \endcode
-+ * See ia_isp documentation for details.
-+ *
-+ * \copybrief ia_aiq_statistics_set
-+ * To set statistics for algorithms AIQ library, one must call function:
-+ * \code ia_aiq_statistics_set \endcode
-+ * \copydetails ia_aiq_statistics_set
-+ *
-+ * Algorithms can also utilize external sensor data for making better decisions. For example external light sensor
-+ * can be used by AEC to determine correct cold start exposure parameters when AEC is called the first time without
-+ * statistics.
-+ *
-+ * \copybrief ia_aiq_sensor_events_set_v1
-+ * To set external sensor data statistics for algorithms AIQ library, one must call function:
-+ * \code ia_aiq_sensor_events_set_v1 \endcode
-+ * \copydetails ia_aiq_sensor_events_set_v1
-+ *
-+ * <br><hr><br>
-+ *
-+ * \section running Running AIQ algorithms
-+ *
-+ * Once the AIQ instance is initialized and statistics are set, algorithms can be run in any order.
-+ * \subsection af AF
-+ * \copybrief ia_aiq_af_run
-+ * \code ia_aiq_af_run \endcode
-+ * \copydetails ia_aiq_af_run
-+ *
-+ * \subsection aec AEC
-+ * \copybrief ia_aiq_ae_run
-+ * \code ia_aiq_ae_run \endcode
-+ * \copydetails ia_aiq_ae_run
-+ *
-+ * \subsection awb AWB
-+ * \copybrief ia_aiq_awb_run
-+ * \code ia_aiq_awb_run \endcode
-+ * \copydetails ia_aiq_awb_run
-+ *
-+ * \subsection sa SA
-+ * \copybrief ia_aiq_sa_run
-+ * \code ia_aiq_sa_run \endcode
-+ * \copydetails ia_aiq_sa_run
-+ *
-+ * \subsection pa PA
-+ * \copybrief ia_aiq_pa_run
-+ * \code ia_aiq_pa_run \endcode
-+ * \copydetails ia_aiq_pa_run
-+ *
-+ * \subsection dsd DSD
-+ * \copybrief ia_aiq_dsd_run
-+ * \code ia_aiq_dsd_run \endcode
-+ * \copydetails ia_aiq_dsd_run
-+ *
-+ * \subsection gbce GBCE
-+ * \copybrief ia_aiq_gbce_run
-+ * \code ia_aiq_gbce_run \endcode
-+ * \copydetails ia_aiq_gbce_run
-+ *
-+ * \subsection afbracket AF Bracket
-+ * \copybrief ia_aiq_af_bracket
-+ * \code ia_aiq_af_bracket \endcode
-+ * \copydetails ia_aiq_af_bracket
-+ *
-+ * \subsection aebracket AE Bracket & HDR
-+ * AEC supports outputting of multiple exposure results. By setting the "num_exposures" parameter >1 in ia_aiq_ae_input_params, AEC determines
-+ * the best exposure parameters to cover as much as possible of the sensor's dynamic range. AIQ's client can then queue the exposure parameters
-+ * to the sensor for consecutive frames for best speed.
-+ *
-+ * HDR support in AEC works the same way. Client requests >1 "num_exposures" but also gives AIQ the resulting statistics from all requested
-+ * exposures. AEC uses the given (multiple) statistics to calculate new exposure parameters.
-+ *
-+ *
-+ * <br><hr><br>
-+ *
-+ * \section deinit De-initialization of AIQ library
-+ *
-+ * To de-initialize and free memory AIQ library instance has allocated, one must call function:
-+ * \code
-+ * ia_aiq_deinit
-+ * \endcode
-+ *
-+ * After this call AIQ library instance is destroyed and can't be used.
-+ */
-+
-+/*!
-+ * \file ia_aiq.h
-+ * \brief Definitions and declarations of Intel 3A library.
-+ */
-+
-+#ifndef _IA_AIQ_H_
-+#define _IA_AIQ_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ia_mkn_types.h"
-+#include "ia_cmc_types.h"
-+#include "ia_aiq_deprecated.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Initialize IA_AIQ and its submodules.
-+ * This function must be called before any other function in the library. It allocates memories for all AIQ algorithms based on input parameters
-+ * given by the user. AIQB (from CPFF) and NVM data are parsed and combined resulting camera module specific tuning parameters which the
-+ * AIQ algorithms use. Initialization returns a handle to the AIQ instance, which is given as input parameter for all the
-+ * algorithms. Therefore, multiple instances of AIQ library can running simultaneously. For example one instance per camera.
-+ *
-+ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
-+ *                                  Contains tuning parameters for AIQ algorithms.
-+ * \param[in]     nvm_data          Optional.\n
-+ *                                  NVM (Non Volatile Memory) containing sensor unit specific calibration data.
-+ *                                  AIC uses camera unit specific calibration data, if given.
-+ * \param[in]     aiqd_data         Optional.\n
-+ *                                  AIQ generic input data, provided by the host. Contains various AIQ related information, collected
-+ *                                  during run-time and stored in a host file system. AIQ will parse this data in to internal storage.
-+ * \param[in]     stats_max_width   Mandatory.\n
-+ *                                  Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
-+ *                                  memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
-+ *                                  and AF statistics grid allocations.
-+ * \param[in]     stats_max_height  Mandatory.\n
-+ *                                  Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
-+ *                                  memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
-+ *                                  and AF statistics grid allocations.
-+ * \param[in]     max_num_stats_in  Mandatory.\n
-+ *                                  The maximum number of input statistics for one frame. Each statistics is related to different exposure.
-+ *                                  Used especially for sensors that support two or more simultaneous exposures (HDR).
-+ * \param[in]     ia_cmc            Mandatory.\n
-+ *                                  Parsed camera module characterization structure. ia_cmc structure needs to be kept available by client for
-+ *                                  the lifetime of AIQ component.
-+ * \param[in,out] ia_mkn            Optional.\n
-+ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from AIQ is needed
-+ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
-+ *                                  Client writes the data into Makernote section in EXIF.
-+ * return                           IA_AIQ handle. Use the returned handle as input parameter for the consequent IA_AIQ calls.
-+ */
-+LIBEXPORT ia_aiq*
-+ia_aiq_init(const ia_binary_data *aiqb_data,
-+            const ia_binary_data *nvm_data,
-+            const ia_binary_data *aiqd_data,
-+            unsigned int stats_max_width,
-+            unsigned int stats_max_height,
-+            unsigned int max_num_stats_in,
-+            ia_cmc_t *ia_cmc,
-+            ia_mkn *ia_mkn);
-+
-+/*!
-+ * \brief Set tuning to an existing AIQ instance.
-+ * This function can be used to switch tunings on-the-fly in a way that 3A preserves its state and offers smooth transition from one tuning to another.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_set_tuning(ia_aiq *ia_aiq,
-+                  const ia_binary_data *aiqb_data);
-+
-+/*!
-+ * \brief De-initialize IA_AIQ and its submodules.
-+ * All memory allocated by AIQ algoriths are freed. AIQ handle can no longer be used.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ */
-+LIBEXPORT void
-+ia_aiq_deinit(ia_aiq *ia_aiq);
-+
-+/*!
-+ *  \brief Input parameter structure for AE algorithm.
-+ */
-+typedef struct
-+{
-+    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
-+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
-+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
-+    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
-+    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
-+    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
-+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
-+    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
-+                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
-+                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
-+    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
-+                                                                     Used to specify different sensor descriptors for each exposure. */
-+    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
-+    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
-+                                                                     AEC increases weight of given point in final AEC results. */
-+    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
-+    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
-+                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
-+    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
-+                                                                     Order of gain values corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
-+    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
-+                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
-+    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
-+    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
-+    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
-+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
-+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
-+    float manual_convergence_time;                              /*!< Mandatory. Manual AEC convergence speed in seconds.
-+                                                                     -1.0 if NA (uses tunings).
-+                                                                     0.0  means convergence filters are bypassed, this is similar behavior as in previous API when using frame_use still
-+                                                                     > 0.0  Overrides convergence speed from tunings. */
-+} ia_aiq_ae_input_params_v1;
-+
-+/*!
-+ * \brief AEC calculation based on input parameters and frame statistics.
-+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] ae_input_params       Mandatory.\n
-+ *                                  Input parameters for AEC calculations.
-+ * \param[out] ae_results           Mandatory.\n
-+ *                                  Pointer's pointer where address of ISP parameters are stored.
-+ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_ae_run_v1(ia_aiq *ia_aiq,
-+              const ia_aiq_ae_input_params_v1 *ae_input_params,
-+              ia_aiq_ae_results **ae_results);
-+
-+/*!
-+* \brief Get the AEC calculated histograms.
-+* AE calculates histograms from the RGBS grid.
-+*
-+* \param[in] ia_aiq                Mandatory.\n
-+*                                  AIQ instance handle.
-+* \return                          Pointer to the calculated histograms.
-+*/
-+LIBEXPORT ia_aiq_histogram *
-+ia_aiq_get_histograms_v1(ia_aiq *ia_aiq, unsigned int a_exposure_index);
-+
-+/*!
-+ *  \brief Input parameter structure for AF algorithm.
-+ */
-+typedef struct
-+{
-+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AF calculations (Preview, Still, video etc.). */
-+    int lens_position;                                          /*!< Mandatory. Current lens position. */
-+    unsigned long long lens_movement_start_timestamp;           /*!< Mandatory. Lens movement start timestamp in us. Timestamp is compared against statistics timestamp
-+                                                                     to determine if lens was moving during statistics collection. */
-+    ia_aiq_af_operation_mode focus_mode;                        /*!< Mandatory. Focusing mode. */
-+    ia_aiq_af_range focus_range;                                /*!< Mandatory. Focusing range. Only valid when focus_mode is ia_aiq_af_operation_mode_auto. */
-+    ia_aiq_af_metering_mode focus_metering_mode;                /*!< Mandatory. Metering mode (multispot, touch). */
-+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. User setting for flash. */
-+    ia_rectangle *focus_rect;                                   /*!< Optional. */
-+    ia_aiq_manual_focus_parameters *manual_focus_parameters;    /*!< Optional. Manual focus parameters (manual lens position, manual focusing distance). Used only if
-+                                                                     focus mode 'ia_aiq_af_operation_mode_manual' is used. */
-+    bool trigger_new_search;                                    /*!< TRUE if new AF search is needed, FALSE otherwise. Host is responsible for flag cleaning. */
-+} ia_aiq_af_input_params;
-+
-+/*!
-+ * \brief AF calculation based on input parameters and frame statistics.
-+ * AF calculates new lens position based on statistics and given input parameters.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] af_input_params       Mandatory.\n
-+ *                                  Input parameters for AF calculations.
-+ * \param[out] af_results           Mandatory.\n
-+ *                                  Pointer's pointer where address of AF results are stored.
-+ *                                  Results from AF calculations.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_af_run(ia_aiq *ia_aiq,
-+              const ia_aiq_af_input_params *af_input_params,
-+              ia_aiq_af_results **af_results);
-+
-+/*!
-+ *  \brief Input parameter structure for AWB algorithm.
-+ */
-+typedef struct
-+{
-+    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
-+    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
-+    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
-+    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
-+} ia_aiq_awb_input_params_v1;
-+
-+/*!
-+ * \brief AWB calculation based on input parameters and frame statistics.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] awb_input_params      Mandatory.\n
-+ *                                  Input parameters for AWB calculations.
-+ * \param[out] awb_results          Mandatory.\n
-+ *                                  Pointer's pointer where address of AWB results are stored.
-+ *                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_awb_run_v1(ia_aiq *ia_aiq,
-+                  const ia_aiq_awb_input_params_v1 *awb_input_params,
-+                  ia_aiq_awb_results **awb_results);
-+
-+
-+/*!
-+ *  \brief Input parameter structure for GBCE algorithm.
-+ */
-+typedef struct
-+{
-+    ia_aiq_gbce_level gbce_level;           /*!< Mandatory. GBCE level. -1 to use tuning defaults.*/
-+    ia_aiq_tone_map_level tone_map_level;   /*!< Mandatory. Tone Map level. -1 to use tuning defaults.*/
-+    ia_aiq_frame_use frame_use;             /*!< Deprecated. Not used. */
-+    float ev_shift;                         /*!< Optional. Exposure Value shift [-4,4]. */
-+} ia_aiq_gbce_input_params;
-+
-+/*!
-+ * \brief GBCE calculation based on input parameters and frame statistics.
-+ * Computes gamma
-+ *
-+ * \param[in] ia_aiq                        Mandatory.\n
-+ *                                          AIQ instance handle.
-+ * \param[in] gbce_input_params             Mandatory.\n
-+ *                                          Input parameters for GBCE calculations.
-+ * \param[out] gbce_results                 Mandatory.\n
-+ *                                          Pointer's pointer where address of GBCE results are stored.
-+ *                                          Results contain GBCE Gamma table. Results can be used directly as input for AIC.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_gbce_run(ia_aiq *ia_aiq,
-+                const ia_aiq_gbce_input_params *gbce_input_params,
-+                ia_aiq_gbce_results **gbce_results);
-+
-+/*!
-+ *  \brief Input parameter structure for DSD algorithm.
-+ */
-+typedef struct
-+{
-+    ia_aiq_af_results *af_results;     /*!< Mandatory although function will not return error, if not given.
-+                                            DSD will not return all scene modes, if not given. */
-+    ia_aiq_scene_mode scene_modes_selection;  /*!<configure which scene modes should be detected by DSD*/
-+} ia_aiq_dsd_input_params;
-+
-+/*!
-+ * \brief DSD based on statistics analysis.
-+ * Determine scene (DSD) the given image.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] dsd_input_params      Mandatory.\n
-+ *                                  Input parameters for DSD calculations.
-+ * \param[out] dsd_scene            Mandatory.\n
-+ *                                  Detected scene mode.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_dsd_run(ia_aiq *ia_aiq,
-+               const ia_aiq_dsd_input_params *dsd_input_params,
-+               ia_aiq_scene_mode *dsd_scene);
-+
-+/*!
-+*  \brief Input parameter structure for Parameter adaptor.
-+*/
-+typedef struct ia_aiq_pa_input_params
-+{
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    ia_aiq_exposure_parameters *exposure_params;     /*!< Mandatory. Analog gain and exposure time. */
-+    ia_aiq_color_channels *color_gains;              /*!< Optional. RGB gains for each color channels. These gain will be applied on top of RGB gains calculated from WB results. */
-+} ia_aiq_pa_input_params;
-+
-+/*!
-+* \brief Parameter adaptor calculations for the next frame.
-+* Compute generic parameters (Color Correction Matrix and Black Level Correction),
-+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
-+* These generic results are converted to ISP specific parameters by ia_isp component.
-+*
-+* \param[in] ia_aiq                Mandatory.\n
-+*                                  AIQ instance handle.
-+* \param[in] pa_input_params       Mandatory.\n
-+*                                  Input parameters for PA calculations.
-+* \param[out] pa_results           Mandatory.\n
-+*                                  Pointer's pointer where address of parameter adaptor results are stored.
-+
-+* \return                          Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_aiq_pa_run_v1(ia_aiq *ia_aiq,
-+               const ia_aiq_pa_input_params *pa_input_params,
-+               ia_aiq_pa_results_v1 **pa_results);
-+
-+/*!
-+ * \brief Shading Adaptor calculations for the next frame.
-+ * Compute shading correction parameters.
-+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
-+ * These generic results are converted to ISP specific parameters by ia_isp component.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] sa_input_params       Mandatory.\n
-+ *                                  Input parameters for SA calculations.
-+ * \param[out] sa_results           Mandatory.\n
-+ *                                  Pointer's pointer where address of shading adaptor results are stored.
-+
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_sa_run_v2(ia_aiq *ia_aiq,
-+               const ia_aiq_sa_input_params_v1 *sa_input_params,
-+               ia_aiq_sa_results_v1 **sa_results);
-+
-+/*!
-+ *  \brief Input parameter structure for setting the statistics.
-+ */
-+typedef struct
-+{
-+    unsigned long long frame_id;                                /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
-+    unsigned long long frame_timestamp;                         /*!< Mandatory although function will not return error, if not given.
-+                                                                     Start of frame timestamp in microseconds. This value is used in conjunction with timestamps
-+                                                                     provided in the AIQ algorithms function calls to calculate the convergence
-+                                                                     speed of AIQ algorithms.
-+                                                                     AEC, AWB and AF will not converge, if not given. */
-+    const ia_aiq_ae_results *frame_ae_parameters;               /*!< Mandatory although function will not return error, if not given.
-+                                                                     Exposure results from AEC which were used to capture this frame.
-+                                                                     AEC depends on this parameters. AEC will return cold start values if not given.*/
-+    const ia_aiq_af_results *frame_af_parameters;               /*!< Mandatory although function will not return error, if not given.
-+                                                                     Focus results from AF which were used to capture this frame.
-+                                                                     AEC with AF assist light and flash usage in macro functionalities depend on these parameters. */
-+    const ia_aiq_rgbs_grid **rgbs_grids;                        /*!< Mandatory. Almost all AIQ algorithms require RGBS grid statistics. */
-+    unsigned int num_rgbs_grids;                                /*!< The number of RGBS grids. */
-+    const ia_aiq_hdr_rgbs_grid* hdr_rgbs_grid;                  /*!< Optional. HDR statistics grid. */
-+    const ia_aiq_af_grid **af_grids;                            /*!< Mandatory although function will not return error, if not given.
-+                                                                     AF will return a NULL pointer, if not given.
-+                                                                     DSD will not return all scene modes, if not given. */
-+    unsigned int num_af_grids;                                  /*!< The number of AF grids. */
-+    const ia_aiq_histogram **external_histograms;               /*!< Optional. If ISP calculates histogram, if can be given. If external histogram is not given,
-+                                                                     AIQ internally calculates the histogram from the RGBS grid statistics and given AWB parameters. */
-+    unsigned int num_external_histograms;                       /*!< The number of external histograms. */
-+    const ia_aiq_pa_results_v1 *frame_pa_parameters;               /*!< Optional (Mandatory if external_histogram is not given).
-+                                                                     AWB results used in the frame from where the statistics are collected.
-+                                                                     GBCE will give default gamma table if external histogram or AWB results are not available. */
-+    const ia_atbx_face_state *faces;                            /*!< Mandatory although function will not return error, if not given.
-+                                                                     Face coordinates from external face detector.
-+                                                                     DSD will not return all scene modes, if not given.
-+                                                                     AWB will not take face information into account, if not given. */
-+    ia_aiq_camera_orientation camera_orientation;               /*!< The orientation of the camera. Currently unused. */
-+
-+    const ia_aiq_awb_results *awb_results;                      /*!< Optional. Estimated AWB results from the previous run of AWB */
-+    const ia_aiq_sa_results_v1 *frame_sa_parameters;            /*!< Optional. LSC results used in the frame for statistics collected. */
-+    const ia_aiq_depth_grid **depth_grids;                      /*!< Optional. Depth grid statistics */
-+    unsigned int num_depth_grids;                               /*!< Optional. Number of depth grid statistics */
-+    const ia_aiq_grid *ir_grid;                                 /*!< Optional. Ir grid statistics, if available. */
-+} ia_aiq_statistics_input_params_v4;
-+
-+/*!
-+ * \brief Set input statistics and information about the captured image.
-+ * AIQ algorithms need various information about the conditions in which the frame and statistics were captured in order to
-+ * calculate new parameters.
-+ *
-+ * \param[in] ia_aiq                        Mandatory.\n
-+ *                                          AIQ instance handle.
-+ * \param[in] statistics_input_params       Mandatory.\n
-+ *                                          Input parameters containing statistics and information about a frame.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_statistics_set_v4(ia_aiq *ia_aiq,
-+    const ia_aiq_statistics_input_params_v4 *statistics_input_params);
-+
-+/*!
-+ * \brief Focus bracketing parameters.
-+ */
-+typedef struct
-+{
-+    unsigned char focus_positions;                     /*!< Number of focus positions */
-+    ia_aiq_af_results af_results;                      /*!< Autofocus results */
-+    ia_aiq_af_bracket_mode af_bracket_mode;            /*!< Focus bracketing mode */
-+} ia_aiq_af_bracket_input_params;
-+
-+/*!
-+ * \brief Calculates the list of lens positions for focus bracketing.
-+ *
-+ * \param[in]  ia_aiq                       Mandatory.\n
-+ *                                          AIQ instance handle.
-+ * \param[in]  af_bracket_input_params      Mandatory.\n
-+ *                                          Autofocus bracketing parameters.
-+ * \param[out] af_bracket_results           Mandatory.\n
-+ *                                          Pointer's pointer where address of focus bracketing results are stored.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_af_bracket(ia_aiq *ia_aiq,
-+                  const ia_aiq_af_bracket_input_params *af_bracket_input_params,
-+                  ia_aiq_af_bracket_results **af_bracket_results);
-+
-+/*!
-+ * \param[in]  ia_aiq               Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[out] out_ia_aiq_data      Mandatory.\n
-+ *                                  Contains various AIQ related information, collected during run-time and subject to
-+ *                                  be stored in a host file system. Host will copy this data, if ia_aiq_data->size > 0
-+ *                                  and ia_aiq_data->data != NULL; AIQ is responsible to deallocate data buffer
-+ *                                  during ia_aiq_deinit().
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_get_aiqd_data(ia_aiq *ia_aiq,
-+                ia_binary_data *out_ia_aiq_data);
-+
-+
-+
-+/*!
-+* \brief Data from external sensors
-+*/
-+typedef struct
-+{
-+    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
-+                                                                         Acceleration = Gravity + Linear Acceleration*/
-+    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
-+    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
-+    unsigned int num_gravity_events;                                /*!< Number of gravity events */
-+    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
-+    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
-+    ia_aiq_ambient_light_events_v1 *ambient_light_events;           /*!< The data holds information on the ambient light */
-+    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
-+    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
-+    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
-+} ia_aiq_sensor_events_v1;
-+
-+/*!
-+ * \brief Set event statistics.
-+ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
-+ *
-+ * \param[in] ia_aiq                        Mandatory.\n
-+ *                                          AIQ instance handle.
-+ * \param[in] sensor_events_input           Mandatory.\n
-+ *                                          Sensor events input holds data from libsensorhub.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_sensor_events_set_v1(ia_aiq *ia_aiq,
-+                            const ia_aiq_sensor_events_v1 *sensor_events_input);
-+
-+
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                                  Version string.
-+ */
-+LIBEXPORT const char* ia_aiq_get_version(void);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_AIQ_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
-new file mode 100644
-index 000000000000..e335dc40a22a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
-@@ -0,0 +1,266 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_aiq_deprecated.h
-+ * \brief Definitions and declarations of Intel 3A library.
-+ */
-+
-+#ifndef _IA_AIQ_DEPRECATED_H_
-+#define _IA_AIQ_DEPRECATED_H_
-+
-+#include "ia_aiq_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*
-+  Forward declaration of struct declared in ia_aiq.h
-+*/
-+struct ia_aiq_pa_input_params;
-+
-+/*!
-+* \brief Shading Adaptor results.
-+*/
-+typedef struct {
-+    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
-+    unsigned short width;                             /*!< Width of LSC grid. */
-+    unsigned short height;                            /*!< Height of LSC grid. */
-+    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
-+    cmc_bayer_order color_order;                      /*!< Color channels order. */
-+    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
-+    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
-+    float confidence;                                 /*!< Confidence in results. */
-+    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
-+} ia_aiq_sa_results;
-+
-+/*!
-+* \brief Ambient Light EventsLIGHT_AMBIENTLIGHT
-+* NOTE: This should always match to libsensorhub API
-+*/
-+typedef struct
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    float data;             /*!< Ambient Light data ? */
-+    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+} ia_aiq_ambient_light_events;
-+
-+/*!
-+* \brief Data from external sensors
-+*/
-+typedef struct
-+{
-+    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
-+                                                                    Acceleration = Gravity + Linear Acceleration*/
-+    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
-+    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
-+    unsigned int num_gravity_events;                                /*!< Number of gravity events */
-+    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
-+    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
-+    ia_aiq_ambient_light_events *ambient_light_events;              /*!< The data holds information on the ambient light */
-+    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
-+    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
-+    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
-+} ia_aiq_sensor_events;
-+
-+/*!
-+* \brief Parameter adaptor calculations for the next frame.
-+* Compute generic parameters (Color Correction Matrix and Black Level Correction),
-+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
-+* These generic results are converted to ISP specific parameters by ia_isp component.
-+*
-+* \param[in] ia_aiq                Mandatory.\n
-+*                                  AIQ instance handle.
-+* \param[in] pa_input_params       Mandatory.\n
-+*                                  Input parameters for PA calculations.
-+* \param[out] pa_results           Mandatory.\n
-+*                                  Pointer's pointer where address of parameter adaptor results are stored.
-+
-+* \return                          Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_aiq_pa_run(ia_aiq *ia_aiq,
-+     const struct ia_aiq_pa_input_params *pa_input_params,
-+     ia_aiq_pa_results **pa_results);
-+
-+/*!
-+ * \brief Set event statistics.
-+ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
-+ *
-+ * \param[in] ia_aiq                        Mandatory.\n
-+ *                                          AIQ instance handle.
-+ * \param[in] sensor_events_input           Mandatory.\n
-+ *                                          Sensor events input holds data from libsensorhub.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_sensor_events_set(ia_aiq *ia_aiq, const ia_aiq_sensor_events *sensor_events_input);
-+
-+
-+/*!
-+ *  \brief Input parameter structure for AE algorithm.
-+ */
-+typedef struct
-+{
-+    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
-+    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
-+    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
-+    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
-+    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
-+    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
-+    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
-+    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
-+                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
-+                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
-+    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
-+                                                                     Used to specify different sensor descriptors for each exposure. */
-+    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
-+    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
-+                                                                     AEC increases weight of given point in final AEC results. */
-+    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
-+    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
-+                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
-+    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
-+                                                                     Order of gain values corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
-+    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
-+                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
-+                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
-+    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
-+    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
-+    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
-+    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
-+    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
-+    float manual_convergence_time;                              /*!< Optional. Manual AEC convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
-+} ia_aiq_ae_input_params;
-+
-+/*!
-+ * \brief AEC calculation based on input parameters and frame statistics.
-+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
-+ *
-+ * \param[in] ia_aiq                Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] ae_input_params       Mandatory.\n
-+ *                                  Input parameters for AEC calculations.
-+ * \param[out] ae_results           Mandatory.\n
-+ *                                  Pointer's pointer where address of ISP parameters are stored.
-+ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_ae_run(ia_aiq *ia_aiq,
-+              const ia_aiq_ae_input_params *ae_input_params,
-+              ia_aiq_ae_results **ae_results);
-+
-+/*!
-+* \brief Get the AEC calculated histograms.
-+* AE calculates histograms from the RGBS grid.
-+*
-+* \param[in] ia_aiq                Mandatory.\n
-+*                                  AIQ instance handle.
-+* \return                          Pointer to the calculated histograms.
-+*/
-+LIBEXPORT ia_aiq_histogram *
-+ia_aiq_get_histograms(ia_aiq *ia_aiq);
-+
-+/*
-+ *  \brief Input parameter structure for Shading Adaptor. DEPRECATED
-+ */
-+typedef struct
-+{
-+    ia_aiq_frame_use frame_use;                      /*!< Mandatory. Target frame type of the AIC calculations (Preview, Still, video etc.). */
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+} ia_aiq_sa_input_params;
-+
-+/*!
-+ * \brief Shading Adaptor calculations for the next frame.
-+ * Compute shading correction parameters.
-+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
-+ * These generic results are converted to ISP specific parameters by ia_isp component.
-+ * DEPRECATED
-+ *
-+ * \param[in] a_ia_aiq_ptr          Mandatory.\n
-+ *                                  AIQ instance handle.
-+ * \param[in] a_sa_input_params     Mandatory.\n
-+ *                                  Input parameters for SA calculations.
-+ * \param[out] a_sa_results         Mandatory.\n
-+ *                                  Pointer's pointer where address of shading adaptor results are stored.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiq_sa_run(ia_aiq *a_ia_aiq_ptr,
-+                const ia_aiq_sa_input_params *a_sa_input_params,
-+                ia_aiq_sa_results **a_sa_results);
-+
-+
-+/*!
-+* \brief Shading Adaptor calculations for the next frame.
-+* Compute shading correction parameters.
-+* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
-+* These generic results are converted to ISP specific parameters by ia_isp component.
-+*
-+* \param[in] a_ia_aiq_ptr          Mandatory.\n
-+*                                  AIQ instance handle.
-+* \param[in] a_sa_input_params     Mandatory.\n
-+*                                  Input parameters for SA calculations.
-+* \param[out] a_sa_results         Mandatory.\n
-+*                                  Pointer's pointer where address of shading adaptor results are stored.
-+* \return                          Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_aiq_sa_run_v1(ia_aiq *a_ia_aiq_ptr,
-+                const ia_aiq_sa_input_params_v1 *a_sa_input_params,
-+                ia_aiq_sa_results **a_sa_results);
-+
-+/*!
-+*  \brief Input parameter structure for AWB algorithm.
-+*/
-+typedef struct
-+{
-+    ia_aiq_frame_use frame_use;                       /*!< Mandatory. Target frame type of the AWB calculations (Preview, Still, video etc.). */
-+    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
-+    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
-+    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
-+    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
-+} ia_aiq_awb_input_params;
-+
-+/*!
-+* \brief AWB calculation based on input parameters and frame statistics.
-+*
-+* \param[in] ia_aiq                Mandatory.\n
-+*                                  AIQ instance handle.
-+* \param[in] awb_input_params      Mandatory.\n
-+*                                  Input parameters for AWB calculations.
-+* \param[out] awb_results          Mandatory.\n
-+*                                  Pointer's pointer where address of AWB results are stored.
-+*                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
-+* \return                          Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_aiq_awb_run(ia_aiq *ia_aiq,
-+const ia_aiq_awb_input_params *awb_input_params,
-+ia_aiq_awb_results **awb_results);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_AIQ_DEPRECATED_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
-new file mode 100644
-index 000000000000..108303f6902d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
-@@ -0,0 +1,909 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_aiq_types.h
-+ * \brief Definitions of input/output structures of the Intel 3A library.
-+ */
-+
-+#ifndef _IA_AIQ_TYPES_H_
-+#define _IA_AIQ_TYPES_H_
-+
-+#include "ia_types.h"
-+#include "ia_cmc_types.h"
-+#include <stdint.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define IA_AIQ_MAX_NUM_EXPOSURES 10
-+
-+/*!
-+ * \brief Maximum number of sensor events supported by AIQ lib.
-+ */
-+#define IA_AIQ_MAX_NUMBER_OF_SENSOR_EVENTS 20
-+
-+typedef struct ia_aiq_t ia_aiq;
-+
-+/*!
-+ * \brief Target (frame use) for the analysis algorithms calculations.
-+ */
-+typedef enum
-+{
-+    ia_aiq_frame_use_preview,
-+    ia_aiq_frame_use_still,
-+    ia_aiq_frame_use_continuous,
-+    ia_aiq_frame_use_video,
-+} ia_aiq_frame_use;
-+
-+/*!
-+ * \brief Camera orientations.
-+ */
-+typedef enum
-+{
-+    ia_aiq_camera_orientation_unknown,      /*!< Orientation not known. */
-+    ia_aiq_camera_orientation_rotate_0,     /*!< Non-rotated landscape. */
-+    ia_aiq_camera_orientation_rotate_90,    /*!< Portrait i.e. rotated 90 degrees clockwise. */
-+    ia_aiq_camera_orientation_rotate_180,   /*!< Landscape (upside down) i.e. rotated 180 degrees clockwise. */
-+    ia_aiq_camera_orientation_rotate_270    /*!< Portrait (upside down) i.e. rotated 270 degrees clockwise. */
-+} ia_aiq_camera_orientation;
-+
-+/*!
-+ * \brief AEC flicker reduction modes.
-+ */
-+typedef enum
-+{
-+    ia_aiq_ae_flicker_reduction_off,     /*!< Disables flicker detection and reduction. */
-+    ia_aiq_ae_flicker_reduction_50hz,    /*!< Manual flicker reduction for 50Hz mains frequency. */
-+    ia_aiq_ae_flicker_reduction_60hz,    /*!< Manual flicker reduction for 60Hz mains frequency. */
-+    ia_aiq_ae_flicker_reduction_auto,    /*!< Detects flicker frequency and applies detected reduction. */
-+    ia_aiq_ae_flicker_reduction_detect,  /*!< Detects only flicker frequency but doesn't apply reduction. */
-+} ia_aiq_ae_flicker_reduction;
-+
-+/*!
-+ * \brief AEC operation modes.
-+ */
-+typedef enum {
-+    ia_aiq_ae_operation_mode_automatic,         /*!< Automatic mode. */
-+    ia_aiq_ae_operation_mode_long_exposure,     /*!< AEC produces exposure parameters with long exposure (low light & static) scene. */
-+    ia_aiq_ae_operation_mode_action,            /*!< AEC produces exposure parameters for fast moving scene. */
-+    ia_aiq_ae_operation_mode_video_conference,  /*!< AEC produces exposure parameters which can be used in video conferencing scene. */
-+    ia_aiq_ae_operation_mode_production_test,   /*!< AEC produces exposure parameters which are used in production test environment. */
-+    ia_aiq_ae_operation_mode_ultra_low_light,   /*!< AEC produces exposure parameters which are used in ultra low light scene. */
-+    ia_aiq_ae_operation_mode_fireworks,         /*!< AEC produces exposure parameters which are used in fireworks scene. */
-+    ia_aiq_ae_operation_mode_hdr,               /*!< AEC produces exposure parameters which are used for HDR imaging (vHDR or exposure bracketing). */
-+    ia_aiq_ae_operation_mode_custom_1,          /*!< AEC produces exposure parameters for a specialized custom scene 1. */
-+    ia_aiq_ae_operation_mode_custom_2,          /*!< AEC produces exposure parameters for a specialized custom scene 2. */
-+    ia_aiq_ae_operation_mode_custom_3,          /*!< AEC produces exposure parameters for a specialized custom scene 3. */
-+} ia_aiq_ae_operation_mode;
-+
-+/*!
-+ * \brief AEC metering modes.
-+ */
-+typedef enum {
-+    ia_aiq_ae_metering_mode_evaluative,  /*!< Exposure is evaluated from the whole frame. */
-+    ia_aiq_ae_metering_mode_center,      /*!< Exposure is evaluated center weighted. */
-+} ia_aiq_ae_metering_mode;
-+
-+/*!
-+ * \brief AEC priority modes.
-+ */
-+typedef enum {
-+    ia_aiq_ae_priority_mode_normal,    /*!< All areas are equally important. */
-+    ia_aiq_ae_priority_mode_highlight, /*!< Highlights must be preserved even if it means that dark parts become very dark. */
-+    ia_aiq_ae_priority_mode_shadow,    /*!< Shadow areas are more important. */
-+} ia_aiq_ae_priority_mode;
-+
-+/*!
-+ * \brief Manual AEC limit parameters.
-+ */
-+typedef struct
-+{
-+    int manual_exposure_time_min;             /*!< Optional. Minimum exposure time in microseconds. -1 if NA. */
-+    int manual_exposure_time_max;             /*!< Optional. Maximum exposure time in microseconds. -1 if NA. */
-+    int manual_frame_time_us_min;             /*!< Optional. Manual minimum frame length in microseconds. Defines maximum frame rate -1 if NA. */
-+    int manual_frame_time_us_max;             /*!< Optional. Manual maximum frame length in microseconds. Defines minimum frame rate. -1 if NA. */
-+    int manual_iso_min;                       /*!< Optional. Manual minimum ISO. -1 if NA. */
-+    int manual_iso_max;                       /*!< Optional. Manual maximum ISO. -1 if NA. */
-+} ia_aiq_ae_manual_limits;
-+
-+/*!
-+ * \brief AEC exposure distribution priority modes
-+ *
-+ * This enumeration values are used to control distribution of AEC exposure parameters. For example in some situation user may want to keep
-+ * aperture at smallest value (in order to have large DOF) as long as possible in expense of motion blur (caused by long exposure time) and
-+ * noise (caused by high ISO).
-+ *
-+ * Note. Manual priority modes as understood by SLRs are achieved by using manual exposure parameters when running AEC:
-+ * Shutter priority: Set manual_exposure_time_us in ia_aiq_ae_input_params.
-+ * ISO priority: Set manual_iso in ia_aiq_ae_input_params.
-+ * Aperture priority: Set manual_aperture_fn in ia_aiq_ae_input_params.
-+ */
-+typedef enum
-+{
-+    ia_aiq_ae_exposure_distribution_auto,     /*!< AEC internally prioritizes between exposure time, aperture and ISO when calculating distribution. */
-+    ia_aiq_ae_exposure_distribution_shutter,  /*!< AEC tries to keep the exposure time at minimum until ISO and aperture are at maximum. */
-+    ia_aiq_ae_exposure_distribution_iso,      /*!< AEC tries to keep the ISO at minimum until exposure time and aperture are at maximum. */
-+    ia_aiq_ae_exposure_distribution_aperture, /*!< AEC tries to keep the aperture at minimum until exposure time and ISO are at maximum. */
-+} ia_aiq_ae_exposure_distribution_priority;
-+
-+/*!
-+ * \brief AEC feature setting.
-+ */
-+typedef enum {
-+    ia_aiq_ae_feature_setting_tuning,     /*!< Feature setting is taken from tuning data. */
-+    ia_aiq_ae_feature_setting_disabled,   /*!< Feature setting is disabled. */
-+    ia_aiq_ae_feature_setting_enabled,    /*!< Feature setting is enabled. */
-+} ia_aiq_ae_feature_setting;
-+
-+
-+/*!
-+ * \brief Autofocus states
-+ */
-+typedef enum
-+{
-+    ia_aiq_af_status_idle,               /*!< Focus is idle */
-+    ia_aiq_af_status_local_search,       /*!< Focus is in local search state */
-+    ia_aiq_af_status_extended_search,    /*!< Focus is in extended search state */
-+    ia_aiq_af_status_success,            /*!< Focus has succeeded */
-+    ia_aiq_af_status_fail,               /*!< Focus has failed */
-+    ia_aiq_af_status_depth_search        /*!< Focus in depth search mode */
-+} ia_aiq_af_status;
-+
-+/*!
-+ * \brief Action for the lens driver
-+ */
-+typedef enum
-+{
-+    ia_aiq_lens_driver_action_none,
-+    ia_aiq_lens_driver_action_move_to_unit,
-+    ia_aiq_lens_driver_action_move_by_units
-+} ia_aiq_lens_driver_action;
-+
-+/*!
-+ * \brief Autofocus modes
-+ */
-+typedef enum
-+{
-+    ia_aiq_af_operation_mode_auto,                 /*!< Auto mode */
-+    ia_aiq_af_operation_mode_infinity,             /*!< Inifinity mode */
-+    ia_aiq_af_operation_mode_hyperfocal,           /*!< Hyperfocal mode */
-+    ia_aiq_af_operation_mode_manual,               /*!< Manual mode */
-+    ia_aiq_af_operation_mode_production_test,      /*!< Production test mode. */
-+    ia_aiq_af_operation_mode_depth_map,            /*!< Depth-map generation mode. */
-+    ia_aiq_af_operation_mode_depth,                /*!< Automatic focusing based on depth measurements only. */
-+    ia_aiq_af_operation_mode_contrast              /*!< Automatic focusing based on contrast measurements only. */
-+} ia_aiq_af_operation_mode;
-+
-+/*!
-+ * \brief Autofocus range
-+ */
-+typedef enum
-+{
-+    ia_aiq_af_range_normal,                        /*!< Normal range */
-+    ia_aiq_af_range_macro,                         /*!< Macro range */
-+    ia_aiq_af_range_extended,                      /*!< Extended/full range */
-+} ia_aiq_af_range;
-+
-+
-+/*!
-+ * \brief Autofocus metering modes
-+ */
-+typedef enum
-+{
-+    ia_aiq_af_metering_mode_auto,                      /*!< Auto metering mode */
-+    ia_aiq_af_metering_mode_touch                      /*!< Touch metering mode */
-+} ia_aiq_af_metering_mode;
-+
-+/*!
-+ * \brief Lens actuator status
-+ */
-+typedef enum
-+{
-+    ia_aiq_lens_status_stopped,                    /*!< Lens has not moved during the frame integration*/
-+    ia_aiq_lens_status_moving                      /*!< Lens has been moving during the frame integration */
-+} ia_aiq_lens_status;
-+
-+/*!
-+ * \brief Action for the manual focus
-+ */
-+typedef enum
-+{
-+    ia_aiq_manual_focus_action_none,                /*!< No action for the manual focus is required */
-+    ia_aiq_manual_focus_action_set_distance,        /*!< Set manual focus distance */
-+    ia_aiq_manual_focus_action_set_lens_position,   /*!< Set manual lens position */
-+    ia_aiq_manual_focus_action_set_focal_distance   /*!< Set manual focal distance in um (distance between the lens and the sensor plane, e.g. 4390) */
-+} ia_aiq_manual_focus_action;
-+
-+/*!
-+ * \brief Focus bracketing mode.
-+ */
-+typedef enum
-+{
-+    ia_aiq_af_bracket_mode_symmetric,        /*!< Symmetric focus bracketing around the reference lens position*/
-+    ia_aiq_af_bracket_mode_towards_near,     /*!< One side focus bracketing. Images are taken towards NEAR end (macro) */
-+    ia_aiq_af_bracket_mode_towards_far       /*!< One side focus bracketing. Images are taken towards FAR end (infinity)*/
-+} ia_aiq_af_bracket_mode;
-+
-+/*!
-+ * \brief Detected scene mode.
-+ */
-+typedef enum
-+{
-+    ia_aiq_scene_mode_none                = 0,
-+    ia_aiq_scene_mode_close_up_portrait   = (1 << 0),
-+    ia_aiq_scene_mode_portrait            = (1 << 1),
-+    ia_aiq_scene_mode_lowlight_portrait   = (1 << 2),
-+    ia_aiq_scene_mode_low_light           = (1 << 3),
-+    ia_aiq_scene_mode_action              = (1 << 4),
-+    ia_aiq_scene_mode_backlight           = (1 << 5),
-+    ia_aiq_scene_mode_landscape           = (1 << 6),
-+    ia_aiq_scene_mode_document            = (1 << 7),
-+    ia_aiq_scene_mode_firework            = (1 << 8),
-+    ia_aiq_scene_mode_lowlight_action     = (1 << 9),
-+    ia_aiq_scene_mode_baby                = (1 << 10),
-+    ia_aiq_scene_mode_barcode             = (1 << 11)
-+} ia_aiq_scene_mode;
-+
-+/*!
-+* \brief Mode for calculating AE bracketing.
-+*/
-+typedef enum
-+{
-+    ia_aiq_bracket_mode_none,             /*!< No bracketing used. */
-+    ia_aiq_bracket_mode_ull  = (1 << 0),  /*!< Ultra Low Light bracketing used. */
-+    ia_aiq_bracket_mode_hdr  = (1 << 1)   /*!< High Dynamic Range bracketing used. */
-+} ia_aiq_bracket_mode;
-+
-+/*!
-+ * \brief Manual focus parameters.
-+ */
-+typedef struct
-+{
-+    unsigned int manual_focus_distance;               /*!< Manual focus distance in mm*/
-+    int manual_lens_position;                         /*!< Manual lens position */
-+    unsigned int manual_focal_distance;               /*!< Manual focal_distance in um (e.g. 4390) */
-+    ia_aiq_manual_focus_action manual_focus_action;   /*!< Manual focus action */
-+} ia_aiq_manual_focus_parameters;
-+
-+/*!
-+ *  Gain structure defining gain value and type.
-+ */
-+typedef struct
-+{
-+    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
-+    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
-+} ia_aiq_gain;
-+
-+/*!
-+ * \brief Exposure parameters in terms of generic units.
-+ * Structure can be used as input or output from AEC.
-+ */
-+typedef struct
-+{
-+    unsigned int exposure_time_us;          /*!< Exposure time in microseconds, -1 if N/A. */
-+    float analog_gain;                      /*!< Deprecated. Analog gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
-+    float digital_gain;                     /*!< Deprecated. Digital gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
-+    float aperture_fn;                      /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. TODO: Move to ia_aiq_aperture_control structure. */
-+    unsigned int total_target_exposure;     /*!< Total exposure ie. combination of ET, gains, Aperture gain and ND gain, -1 if N/A. */
-+    bool nd_filter_enabled;                 /*!< true or false, false for N/A. */
-+    int iso;                                /*!< ISO value corresponding to the analog gain. -1 if N/A. */
-+    ia_aiq_gain gains[IA_CMC_GAINS_MAX_NUM];       /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
-+    unsigned int num_gains;                 /*!< The number of gains. */
-+} ia_aiq_exposure_parameters;
-+
-+/*!
-+ * \brief Exposure parameters in terms of sensor units.
-+ * Structure can be used as input or output from AEC.
-+ */
-+typedef struct
-+{
-+    unsigned short fine_integration_time;         /*!< Integration time specified as a number of pixel clocks added on top of coarse_integration_time. */
-+    unsigned short coarse_integration_time;       /*!< Integration time specified in multiples of pixel_periods_per_line.*/
-+    unsigned short analog_gain_code_global;       /*!< Global analog gain code. */
-+    unsigned short digital_gain_global;           /*!< Global digital gain code. */
-+    unsigned short line_length_pixels;            /*!< The number of pixels in one row. This includes visible lines and horizontal blanking lines. */
-+    unsigned short frame_length_lines;            /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
-+    unsigned short gain_codes[IA_CMC_GAINS_MAX_NUM];     /*!< Global gain codes. */
-+} ia_aiq_exposure_sensor_parameters;
-+
-+/*!
-+ * \brief Exposure related restrictions and constants in terms of sensor units.
-+ * Camera driver fills and updates these parameters whenever they are changed (for example in mode change).
-+ */
-+typedef struct
-+{
-+    float pixel_clock_freq_mhz;                        /*!< Video timing pixel clock frequency. */
-+    unsigned short pixel_periods_per_line;             /*!< The number of pixel clock periods in one line (row) time. This includes visible pixels and horizontal blanking time. */
-+    unsigned short line_periods_per_field;             /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
-+    unsigned short line_periods_vertical_blanking;     /*!< Number of vertical blanking lines. Visible lines can be calculated using this and line_periods_per_field (above) value. */
-+    unsigned short fine_integration_time_min;          /*!< The minimum allowed value for fine_integration_time in AEC outputs. */
-+    unsigned short fine_integration_time_max_margin;   /*!< fine_integration_time_max = pixel_periods_per_line - fine_integration_time_max_margin. */
-+    unsigned short coarse_integration_time_min;        /*!< The minimum allowed value for coarse_integration_time in AEC outputs. */
-+    unsigned short coarse_integration_time_max_margin; /*!< coarse_integration_time_max = line_periods_per_field - coarse_integration_time_max_margin */
-+    bool is_mono_ir_sensor;                                /*!< Judge if it is IR sensor, 1: IR sensor, 0: others*/
-+} ia_aiq_exposure_sensor_descriptor;
-+
-+/*!
-+ * AEC features.
-+ * Parameters for enabling/disabling AEC features. Setting ia_aiq_ae_feature_setting_tuning takes feature definitions from CPF.
-+ */
-+typedef struct {
-+
-+    ia_aiq_ae_feature_setting motion_blur_control;          /*!< AEC modifies exposure time/analog gain ratio based on movement in the image. */
-+    ia_aiq_ae_feature_setting backlight_compensation;       /*!< AEC analyzes and modifies exposure parameters based on backlight detection algorithm. */
-+    ia_aiq_ae_feature_setting face_utilization;             /*!< AEC uses face coordinates in exposure calculations for next frame. */
-+    ia_aiq_ae_feature_setting red_eye_reduction_flash;      /*!< AEC will propose flashes before pre-flashes to reduce red eye effect. */
-+    ia_aiq_ae_feature_setting fill_in_flash;                /*!< AEC will propose flash in back light situations, where target is close enough. */
-+    ia_aiq_ae_feature_setting continuous_flicker_detection; /*!< AEC runs the flicker detection algorithm continuously in the VF */
-+} ia_aiq_ae_features;
-+
-+
-+/*!
-+ * \brief Flash modes from the user.
-+ */
-+typedef enum
-+{
-+    ia_aiq_flash_mode_auto,
-+    ia_aiq_flash_mode_on,
-+    ia_aiq_flash_mode_off,
-+} ia_aiq_flash_mode;
-+
-+/*!
-+ * \brief Flash status.
-+ */
-+typedef enum
-+{
-+    ia_aiq_flash_status_no,                /*!< No flash use. */
-+    ia_aiq_flash_status_torch,             /*!< Torch flash use. */
-+    ia_aiq_flash_status_pre,               /*!< Pre-flash use. */
-+    ia_aiq_flash_status_main,              /*!< Main flash use. */
-+    ia_aiq_flash_status_red_eye_reduction, /*!< Red Eye Reduction flash use. */
-+} ia_aiq_flash_status;
-+
-+/*!
-+ * \brief Depth data type.
-+ */
-+typedef enum
-+{
-+    ia_aiq_depth_data_type_vcm,     /*!< VCM units */
-+    ia_aiq_depth_data_type_mm,      /*!< Distance to the object in mm */
-+} ia_aiq_depth_data_type;
-+
-+/*!
-+ * \brief Flash parameters.
-+ * Structure can be used as input or output from AEC.
-+ */
-+typedef struct
-+{
-+    ia_aiq_flash_status status;  /*!< Flash status. */
-+    char power_prc;              /*!< Flash power [0,100] value range maps 0% to 100%, 0 if off. */
-+} ia_aiq_flash_parameters;
-+
-+
-+/*!
-+ * \brief Grid for weighted histograms.
-+ * Pixel values of certain area can be weighted differently based of specified grid.
-+ * Weight grid should be passed and used by the component which is calculating the histograms from the frame data. If no pixel accurate
-+ * histograms are calculated, the weight map should be given back to AIQ library along with the statistics so that AIQ library can
-+ * calculate the weighted histograms itself from the RGBS statistics.
-+ * This structure is output as part of AEC results but it can be replaced with custom weight map.
-+ */
-+typedef struct
-+{
-+    unsigned short width;   /*!< Width of the weight grid. */
-+    unsigned short height;  /*!< Height of the weight grid. */
-+    unsigned char *weights; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
-+} ia_aiq_hist_weight_grid;
-+
-+/*!
-+ * \brief Histogram.
-+ * AIQ uses internally histogram, which are calculated from RGBS statistics:
-+ * - "RAW" frame data i.e. RGBS statistics (corrected BLC + LSC).
-+ * - "Color corrected" frame data (corrected BLC + LSC + CCM + WB)
-+ * - "Color corrected and weighted" frame data (corrected BLC + LSC + CCM + WB + Weight Map)
-+ * If histograms are calculated outside AIQ from frame pixel data (more accurate), it is expected to be "Color corrected and weighted".
-+ * Size of histogram data arrays behind the pointers depends on value of num_bins variable in the structure.
-+ */
-+typedef struct
-+{
-+    unsigned int num_bins;            /*!< Number of histogram bins. */
-+    unsigned int *r;                  /*!< R histogram. */
-+    unsigned int *g;                  /*!< G (both Gr and Gb values) histogram. */
-+    unsigned int *b;                  /*!< B histogram. */
-+    unsigned int *rgb;                /*!< Combined RGB histogram (all pixel values of R, G and B together) TODO: Remove?. Used in percentile calculation but if GW AWB is done always, the same values are calculated. */
-+    unsigned int *rgb_ch;             /*!< RGB channel-independent histogram where all channels are treated as grayscale intensities and combined into one histogram. */
-+    unsigned int *y;                  /*!< Luminance histogram. */
-+    unsigned int num_r_elements;      /*!< Number of elements in the R histogram. */
-+    unsigned int num_g_elements;      /*!< Number of elements in the G histogram. */
-+    unsigned int num_b_elements;      /*!< Number of elements in the B histogram. */
-+    unsigned int num_rgb_elements;    /*!< Number of elements in the combined RGB histogram. */
-+    unsigned int num_rgb_ch_elements; /*!< Number of elements in the RGB channel-independent histogram. */
-+    unsigned int num_y_elements;      /*!< Number of elements in the luminance histogram. */
-+} ia_aiq_histogram;
-+
-+/*!
-+ * \brief Grid block
-+ * As defined in the AIQ statistics specification.
-+ * Ranges of all parameters are [0, 255].
-+ */
-+typedef struct
-+{
-+    unsigned char avg_gr; /*!< Average Gr value in the grid. */
-+    unsigned char avg_r;  /*!< Average R value in the grid. */
-+    unsigned char avg_b;  /*!< Average B value in the grid. */
-+    unsigned char avg_gb; /*!< Average Gb value in the grid. */
-+    unsigned char sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
-+} rgbs_grid_block;
-+
-+/*!
-+ * \brief R, G, B and Saturation grid block.
-+ * As defined in the AIQ statistics specification.
-+ * RGBS grid covers the full Field Of View (FOV) of the sensor.
-+ */
-+typedef struct
-+{
-+    rgbs_grid_block *blocks_ptr;  /*!< RGBS blocks. */
-+    unsigned short grid_width;    /*!< Grid width. */
-+    unsigned short grid_height;   /*!< Grid height. */
-+    bool shading_correction;      /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
-+} ia_aiq_rgbs_grid;
-+
-+/*!
-+* \brief Generic grid structure.
-+*/
-+typedef struct
-+{
-+    unsigned short *data;       /*!< Data of size width * height. */
-+    unsigned short width;       /*!< Grid width. */
-+    unsigned short height;      /*!< Grid height. */
-+} ia_aiq_grid;
-+
-+/*!
-+ * \brief Grid block for 32-bit HDR.
-+ * As defined in the AIQ statistics specification.
-+ * Ranges of all parameters are [0, 255].
-+ */
-+typedef struct
-+{
-+    unsigned int avg_gr; /*!< Average Gr value in the grid. */
-+    unsigned int avg_r;  /*!< Average R value in the grid. */
-+    unsigned int avg_b;  /*!< Average B value in the grid. */
-+    unsigned int avg_gb; /*!< Average Gb value in the grid. */
-+    unsigned int sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
-+} hdr_rgbs_grid_block;
-+
-+/*!
-+ * \brief R, G, B and Saturation grid block for 32-bit HDR statistics.
-+ * As defined in the AIQ statistics specification.
-+ * HDR RGBS grid covers the full Field Of View (FOV) of the sensor.
-+ */
-+typedef struct
-+{
-+    hdr_rgbs_grid_block *blocks_ptr;    /*!< HDR RGBS blocks. */
-+    unsigned int grid_width;            /*!< Grid width. */
-+    unsigned int grid_height;           /*!< Grid height. */
-+    unsigned int grid_data_bit_depth;   /*!< Bit depth of data in channel data. */
-+    bool shading_correction;            /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
-+} ia_aiq_hdr_rgbs_grid;
-+
-+/*!
-+ * \brief AF statistics
-+ * As defined in the AIQ statistics specification.
-+ * AF grid covers the full Field Of View (FOV) of the sensor.
-+ */
-+typedef struct
-+{
-+    unsigned short grid_width;    /*!< Number of block elements horizontally in a grid. */
-+    unsigned short grid_height;   /*!< Number of block elements vertically in a grid. */
-+    unsigned short block_width;   /*!< Block width (bq per block element). */
-+    unsigned short block_height;  /*!< Block height (bq per grid element). */
-+    int *filter_response_1;       /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
-+    int *filter_response_2;       /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
-+} ia_aiq_af_grid;
-+
-+/*!
-+ * \brief Depth grid statistics
-+ */
-+typedef struct
-+{
-+    ia_aiq_depth_data_type type;          /*!< Data type (VCM units/mm)*/
-+    ia_rectangle *grid_rect;              /*!< ROI for the grid */
-+    int *depth_data;                      /*!< Depth data (type of data is defined by ia_aiq_depth_data_type) */
-+    unsigned char *confidence;            /*!< Confidence level */
-+    unsigned short grid_width;            /*!< Number of grid elements horizontally */
-+    unsigned short grid_height;           /*!< Number of grid elements vertically */
-+} ia_aiq_depth_grid;
-+
-+/*!
-+ * \brief AWB scene modes
-+ * Used in AWB as input to restrict White Point between certain CCT range.
-+ * Note that not in all cases only CCT range is used to restrict White Point but more intelligent estimation may be used.
-+ */
-+typedef enum
-+{
-+    ia_aiq_awb_operation_mode_auto,
-+    ia_aiq_awb_operation_mode_daylight,           /*!< Restrict CCT range to [5000, 7000]. */
-+    ia_aiq_awb_operation_mode_partly_overcast,    /*!< Restrict CCT range to [5500, 9000]. */
-+    ia_aiq_awb_operation_mode_fully_overcast,     /*!< Restrict CCT range to [6000, 7000]. */
-+    ia_aiq_awb_operation_mode_fluorescent,        /*!< Restrict CCT range to [2700, 5500]. */
-+    ia_aiq_awb_operation_mode_incandescent,       /*!< Restrict CCT range to [2700, 3100]. */
-+    ia_aiq_awb_operation_mode_sunset,
-+    ia_aiq_awb_operation_mode_video_conference,
-+    ia_aiq_awb_operation_mode_manual_cct_range,   /*!< Use given CCT range (see ia_aiq_awb_manual_cct_range). */
-+    ia_aiq_awb_operation_mode_manual_white,       /*!< Use coordinate (see ia_coordinate) relative to full FOV which should be used as white point. */
-+    ia_aiq_awb_operation_mode_production_test,
-+    ia_aiq_awb_operation_mode_candlelight,
-+    ia_aiq_awb_operation_mode_flash,
-+    ia_aiq_awb_operation_mode_snow,
-+    ia_aiq_awb_operation_mode_beach,
-+} ia_aiq_awb_operation_mode;
-+
-+/*!
-+ * \brief Manual CCT range
-+ */
-+typedef struct
-+{
-+    unsigned int min_cct;
-+    unsigned int max_cct;
-+} ia_aiq_awb_manual_cct_range;
-+
-+/*!
-+ * \brief Frame parameters which describe cropping and scaling (need to be filled by AIQ client for every frame)
-+ */
-+typedef struct
-+{
-+    unsigned short horizontal_crop_offset;            /*!< Read out offset horizontal. */
-+    unsigned short vertical_crop_offset;              /*!< Read out offset vertical. */
-+    unsigned short cropped_image_width;               /*!< Width of cropped area in native resolution. */
-+    unsigned short cropped_image_height;              /*!< Height of cropped area in native resolution. */
-+    unsigned char horizontal_scaling_numerator;       /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
-+    unsigned char horizontal_scaling_denominator;     /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
-+    unsigned char vertical_scaling_numerator;         /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
-+    unsigned char vertical_scaling_denominator;       /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
-+} ia_aiq_frame_params;
-+
-+/*!
-+ * \brief DC iris control.
-+ * When using DC iris, there are no distinct aperture steps. Use these commands to increase or decrease aperture size.
-+ */
-+typedef enum
-+{
-+    ia_aiq_aperture_control_dc_iris_auto,  /*!< State of the iris is selected automatically. */
-+    ia_aiq_aperture_control_dc_iris_hold,  /*!< Iris should hold current aperture. */
-+    ia_aiq_aperture_control_dc_iris_open,  /*!< Iris should open. */
-+    ia_aiq_aperture_control_dc_iris_close, /*!< Iris should close. */
-+} ia_aiq_aperture_control_dc_iris_command;
-+
-+/*!
-+ * \brief Aperture control parameters.
-+ * Aperture controls for both P (where iris has discrete amount of apertures) and DC (where iris has indefinite amount of possible apertures) iris.
-+ */
-+typedef struct
-+{
-+    float aperture_fn;                                       /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
-+    ia_aiq_aperture_control_dc_iris_command dc_iris_command; /*!< Used only with DC iris. */
-+    int code;                                                /*!< Iris module HW register value. */
-+} ia_aiq_aperture_control;
-+
-+/*!
-+ * \brief Exposure data for all exposures.
-+ */
-+typedef struct
-+{
-+    unsigned int exposure_index;                        /*!< Exposure index which identifies the exposure. */
-+    ia_aiq_exposure_parameters* exposure;               /*!< Exposure parameters to be used in the next frame in generic format. */
-+    ia_aiq_exposure_sensor_parameters* sensor_exposure; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
-+    float distance_from_convergence;                    /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
-+    bool converged;                                     /*!< Indicates that AE has converged. */
-+    unsigned int num_exposure_plan;                     /*!< Size of the exposure plan. Indicates how many exposure and sensor_exposure parameter structures are in the arrays above. */
-+    unsigned int *exposure_plan_ids;                    /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
-+} ia_aiq_ae_exposure_result;
-+
-+/*!
-+ * \brief AEC results.
-+ */
-+typedef struct
-+{
-+    ia_aiq_ae_exposure_result* exposures;               /*!< Results for each exposure to be used in the next frame. */
-+    unsigned int num_exposures;                         /*!< The number of calculated exposures. */
-+    ia_aiq_hist_weight_grid* weight_grid;               /*!< Weight map to be used in the next frame histogram calculation. */
-+    ia_aiq_flash_parameters* flashes;                   /*!< Array of flash parameters for each flashes to be used in the next frame. */
-+    unsigned int num_flashes;                           /*!< Number of independent flashes. */
-+    float lux_level_estimate;                           /*!< Lux level estimate. */
-+    ia_aiq_bracket_mode multiframe;                     /*!< AEC may propose to use multiframe for optimal results. */
-+    ia_aiq_ae_flicker_reduction flicker_reduction_mode; /*!< Flicker reduction mode proposed by the AEC algorithm */
-+    ia_aiq_aperture_control *aperture_control;          /*!< Aperture control parameters. */
-+} ia_aiq_ae_results;
-+
-+/*!
-+ * \brief Autofocus algorithm results
-+ */
-+typedef struct
-+{
-+    ia_aiq_af_status status;                           /*!< Focus status */
-+    unsigned short current_focus_distance;             /*!< Current focusing distance [mm] between the lens and object plane */
-+    int next_lens_position;                            /*!< Next lens position */
-+    int next_focal_distance;                           /*!< Focal distance [um] between the sensor and lens corresponding to the next lens position */
-+    ia_aiq_lens_driver_action lens_driver_action;      /*!< Lens driver action*/
-+    bool use_af_assist;                                /*!< True if the af assist light is to be used at half press, false otherwise */
-+    bool final_lens_position_reached;                  /*!< Lens has reached the final lens position */
-+} ia_aiq_af_results;
-+
-+/*!
-+ * \brief Results from AWB.
-+ */
-+typedef struct
-+{
-+    float accurate_r_per_g;           /*!< Accurate White Point for the image. */
-+    float accurate_b_per_g;           /*!< Accurate White Point for the image. */
-+    float final_r_per_g;              /*!< Final White Point, including color appearance modeling. */
-+    float final_b_per_g;              /*!< Final White Point, including color appearance modeling.*/
-+    unsigned int cct_estimate;        /*!< Correlated Color Temperature estimate calculated from the accurate WP. */
-+    float distance_from_convergence;  /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
-+} ia_aiq_awb_results;
-+
-+/*!
-+ * \brief GBCE level.
-+ * Allows to override GBCE level defined in the tuning.
-+ */
-+typedef enum
-+{
-+    ia_aiq_gbce_level_use_tuning = -1, /*!< Use GBCE level defined in the tuning. */
-+    ia_aiq_gbce_level_bypass = 0,      /*!< Use the default gamma table without stretching. This level should be used when manual AE parameters are set. */
-+    ia_aiq_gbce_level_gamma_stretch,   /*!< Apply histogram stretching. */
-+    ia_aiq_gbce_level_gamma_stretch_and_power_adaptation, /*!< Histogram stretching & gamma power adaptation. */
-+} ia_aiq_gbce_level;
-+
-+/*!
-+* \brief Tone Map level.
-+* Allows to override Tone Map level defined in the tuning.
-+*/
-+
-+typedef enum
-+{
-+    ia_aiq_tone_map_level_use_tuning = -1,  /*!< Use Tone Map level defined in the tuning. */
-+    ia_aiq_tone_map_level_bypass = 0,       /*!< Bypass TM LUT (i.e. legacy GBCE behavior) */
-+    ia_aiq_tone_map_level_default,          /*!< Separate tone mapping and Gamma */
-+    ia_aiq_tone_map_level_dynamic,          /*!< Dynamically calculate the TM LUT */
-+} ia_aiq_tone_map_level;
-+
-+/*!
-+ * \brief Results from GBCE.
-+ */
-+typedef struct {
-+    float* r_gamma_lut;             /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
-+    float* b_gamma_lut;             /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
-+    float* g_gamma_lut;             /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
-+    unsigned int gamma_lut_size;    /*!< Number of elements in each gamma LUT. */
-+    float* tone_map_lut;            /*!< Tone Mapping Gain LUT. Range [0.0 FLT_MAX] */
-+    unsigned int tone_map_lut_size; /*!< Number of elements in tone mapping LUT. */
-+} ia_aiq_gbce_results;
-+
-+/*!
-+ * \brief Values used in various operations for each color channels.
-+ * Value range depends on algorithm output.
-+ */
-+typedef struct
-+{
-+    float gr;               /*!< A value affecting Gr color channel. */
-+    float r;                /*!< A value affecting R color channel. */
-+    float b;                /*!< A value affecting B color channel. */
-+    float gb;               /*!< A value affecting Gb color channel. */
-+} ia_aiq_color_channels;
-+
-+/*!
-+ * \brief LUTs for each color channel.
-+ */
-+typedef struct
-+{
-+    float *gr;              /*!< LUT for Gr color channel. Range [0.0, 1.0].*/
-+    float *r;               /*!< LUT for R color channel. Range [0.0, 1.0]. */
-+    float *b;               /*!< LUT for B color channel. Range [0.0, 1.0]. */
-+    float *gb;              /*!< LUT for Gb color channel. Range [0.0, 1.0]. */
-+    unsigned int size;      /*!< Number of elements in each LUT. */
-+} ia_aiq_color_channels_lut;
-+
-+/*!
-+ * \brief Shading Adaptor light source weight and its type.
-+ */
-+typedef struct {
-+    float weight;
-+    cmc_light_source source_type;
-+} light_source_t;
-+
-+/*!
-+* \brief Advanced Color Correction Matrix Structure Returned by Parameter Adaptor.
-+*/
-+typedef struct {
-+    unsigned int sector_count;                                  /*!< Number of color matrix sectors. */
-+    unsigned int *hue_of_sectors;                               /*!< Starting hues of sectors. */
-+    float (*advanced_color_conversion_matrices)[3][3];          /*!< Advanced CC matrices. Array of color matrices. Each color matrix optimized using a certain sector. Array size is sector_count. */
-+    cmc_color_space target_color_space;                         /*!< Target color space of the ACMs, also the color space for which ACMs have been tuned. See enum cmc_color_space. */
-+} ia_aiq_advanced_ccm_t;
-+
-+
-+
-+/*!
-+* \brief IR Weight Grid.
-+*/
-+typedef struct {
-+    unsigned int width;                 /*!< IR Weight grid width */
-+    unsigned int height;                /*!< IR Weight grid height */
-+    unsigned short *ir_weight_grid_R;          /*!< Interpolated IR Weight for R channel */
-+    unsigned short *ir_weight_grid_G;          /*!< Interpolated IR Weight for G channel */
-+    unsigned short *ir_weight_grid_B;          /*!< Interpolated IR Weight for B channel */
-+}
-+ia_aiq_ir_weight_t;
-+
-+/*!
-+ * \brief RGB IR model.
-+ */
-+typedef struct {
-+    unsigned int width;    /*!< Width of model */
-+    unsigned int height;   /*!< Height of model */
-+    unsigned short sigma;  /*!< Sigma of model */
-+    unsigned short offset; /*!< offset of model */
-+    unsigned short max;    /*!< max value for model */
-+    unsigned short base;   /*!< base value for model */
-+} ia_aiq_rgbir_model_t;
-+
-+/*!
-+ * \brief RGB IR.
-+ */
-+typedef struct {
-+    int8_t grid_indices[16];      /*!< Grid indices */
-+    unsigned int n_models;        /*!< Number of models */
-+    ia_aiq_rgbir_model_t *models; /*!< Array of models */
-+} ia_aiq_rgbir_t;
-+
-+/*!
-+ *  \brief Input parameter structure for Shading Adaptor.
-+ */
-+typedef struct
-+{
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    float manual_convergence_time;                   /*!< Mandatory, in seconds. Allows override of tunings for LSC transition interval
-+                                                     -1.0 if NA (uses tunings).
-+                                                     0.0  forces update of LSC table, this is similar behavior as in previous API when using frame_use still
-+                                                     > 0.0  Overrides convergence speed from tunings */
-+} ia_aiq_sa_input_params_v1;
-+
-+/*!
-+ * \brief Shading Adaptor results.
-+ */
-+typedef struct {
-+    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
-+    unsigned short width;                             /*!< Width of LSC grid. */
-+    unsigned short height;                            /*!< Height of LSC grid. */
-+    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
-+    cmc_bayer_order color_order;                      /*!< Color channels order. */
-+    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
-+    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
-+    float confidence;                                 /*!< Confidence in results. */
-+    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
-+    float luma_strength;                              /*!< Luma correction strength in image corners, which is percent (normalized to be between 0.0f and 1.0f) of
-+                                                      brightness attenutation in corners against image center. Its parametric representation is a semi-sphere with
-+                                                      max 1.0f in the centre and luma_strength (e.g. 0.80f for 80%) in corner of size width x height. luma_strength
-+                                                      1.0f (see 100%) is a plane of 1.0f of size width x height. -1.0f states for invalid parameter. */
-+} ia_aiq_sa_results_v1;
-+
-+/*!
-+* \brief Results from Parameter Adaptor(Deprecated).
-+*/
-+typedef struct {
-+    float color_conversion_matrix[3][3];              /*!< CC matrix. */
-+    ia_aiq_color_channels black_level;                /*!< Black level coefficients of each Bayer channel (absolute level). */
-+    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
-+    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
-+    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
-+    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
-+    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
-+    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
-+    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
-+} ia_aiq_pa_results;
-+
-+/*!
-+* \brief Results from Parameter Adaptor.
-+*/
-+typedef struct {
-+    float color_conversion_matrix[3][3];              /*!< CC matrix. */
-+    float black_level_4x4[4][4];                    /*!< Black level coefficients of each Bayer channel (absolute level). */
-+    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
-+    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
-+    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
-+    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
-+    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
-+    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
-+    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
-+} ia_aiq_pa_results_v1;
-+
-+/*!
-+ * \brief Autofocus bracketing results
-+ */
-+typedef struct
-+{
-+    unsigned short *distances_bracketing;             /*!< Ordered array of distances in mm for focus bracketing. Distances are ordered from Infinity to close up.*/
-+    int *lens_positions_bracketing;                   /*!< Ordered array of lens positions for focus bracketing. Order is from FAR and to NEAR end. */
-+} ia_aiq_af_bracket_results;
-+
-+/*!
-+ * \brief Accelerometer Events
-+ *        Gravity Events
-+ *        Gyroscope Events
-+ */
-+typedef struct
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
-+    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
-+    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
-+    float sensitivity;      /*!< Sensitivity of the sensor */
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+} ia_aiq_sensor_data;
-+
-+
-+/*!
-+ * \brief Ambient Light Sensor (ALS) events.
-+  */
-+typedef struct
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+    float lux;              /*!< Illuminance (lux), -1 for N/A. */
-+    float cct;              /*!< Correlated color temperature (Kelvin), -1 for N/A. */
-+    cmc_cie_coords cie_coor; /*!< CIE xy chromaticity, -1 for N/A. */
-+    float r;                /*!< Red mean, -1 for N/A. */
-+    float g;                /*!< Green mean, -1 for N/A. */
-+    float b;                /*!< Blue mean, -1 for N/A. */
-+    float c;                /*!< Clear (white) mean, -1 for N/A. */
-+    float ir;               /*!< Infra-red mean, -1 for N/A. */
-+} ia_aiq_ambient_light_events_v1;
-+
-+/*!
-+ * \brief Device Movement Detector (DMD) motion level
-+ *        Coincides with the definition at ISH.
-+ */
-+typedef enum
-+{
-+    ia_aiq_dmd_motion_level_sleep = 0,          /*!< The device did not move for the last 10 seconds */
-+    ia_aiq_dmd_motion_level_motionless,
-+    ia_aiq_dmd_motion_level_slightly_drifting,
-+    ia_aiq_dmd_motion_level_slowly_moving,
-+    ia_aiq_dmd_motion_level_moving,
-+    ia_aiq_dmd_motion_level_rapidly_moving,
-+} ia_aiq_dmd_sensor_motion_level;
-+
-+/*!
-+ * \brief Device Movement Detector (DMD) Sensor Events
-+ *        This is a virtual sensor designed in ISH to detect if device is in motion.
-+ */
-+typedef struct
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    ia_aiq_dmd_sensor_motion_level motion;
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+} ia_aiq_dmd_sensor_events;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_AIQ_TYPES_H_ */
-+
-+
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
-new file mode 100644
-index 000000000000..fc719c162eb1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
-@@ -0,0 +1,70 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_aiqb_encode.h
-+ * \brief Helper functtions to encode records into AIQB.
-+ */
-+
-+
-+#ifndef IA_AIQB_ENCODE_H_
-+#define IA_AIQB_ENCODE_H_
-+
-+#include "ia_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define MAX_NUM_MAPS 20
-+typedef struct
-+{
-+    ia_aiqd_parser_offset_map offset_maps[MAX_NUM_MAPS];
-+    ia_aiqd_parser_maps_info maps_info;
-+} pointer_map;
-+
-+/*!
-+ * \brief Copies data from source data pointer to target data pointer and updates pointer address
-+ * param[in]     data_end     End address of output buffer. Used to make sure that data is not copied beyond allocated memory.
-+ * param[in]     data_input   Input buffer to copy.
-+ * param[in]     data_size    Size of data to copy.
-+ * param[in/out] data_current Target data pointer (where to copy data).
-+ * param[in/out] data_target  Target address pointer (where to update address of copied data).
-+ */
-+ia_err memory_assign_and_copy(
-+    const char *data_end,
-+    const void *data_input,
-+    size_t data_size,
-+    char **data_current,
-+    char **data_target);
-+
-+ia_err update_pointer_map(
-+    const char *data_start,
-+    const char *pointer_to_pointer,
-+    const char *pointer_to_data,
-+    pointer_map *maps);
-+
-+ia_err append_pointer_map(
-+    char *data_start,
-+    char *data_end,
-+    pointer_map *maps,
-+    char **data_current);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_AIQB_ENCODE_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
-new file mode 100644
-index 000000000000..3e9561aa6fe8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
-@@ -0,0 +1,123 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_aiqb_parser.h
-+ * \brief Generic parser of new AIQB file format.
-+ *
-+ * New AIQB format assumes that records can be typecasted directly into structures. This means that when using some variable data types in
-+ * 32 or 64 bit environments, they occupy different amount of space. Thus AIQB needs to be contructed differently for those environments.
-+ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86 for reference.
-+ *
-+ * Also, structure (and enum) packing must be disabled when constructing AIQB file (or structure packing needs taken into account when creating AIQB).
-+ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Default_packing_and_.23pragma_pack for reference.
-+ *
-+ */
-+
-+
-+#ifndef IA_AIQB_PARSER_H_
-+#define IA_AIQB_PARSER_H_
-+
-+#include "ia_types.h"
-+#include "ia_mkn_decoder.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#ifdef _DEBUG
-+#ifdef __ANDROID__
-+#include <utils/Log.h>
-+#define IA_AIQB_LOG(...)      ((void)ALOG(LOG_DEBUG, "IA_AIQB: ", __VA_ARGS__))
-+#define IA_AIQB_LOG_ERR(...)  ((void)ALOG(LOG_ERROR, "IA_AIQB: ", __VA_ARGS__))
-+#else
-+#include <stdio.h>
-+#define IA_AIQB_LOG(fmt, ...)     fprintf(stdout, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
-+#define IA_AIQB_LOG_ERR(fmt, ...) fprintf(stderr, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
-+#endif
-+#else
-+#define IA_AIQB_LOG(...) ((void)0)
-+#define IA_AIQB_LOG_ERR(...) ((void)0)
-+#endif
-+
-+/*!
-+ * \brief Offset information about pointers and data tables inside AIQB record.
-+ *
-+ * Using the offset information parser inserts correct memory address into structures' pointer values.
-+ */
-+typedef struct
-+{
-+    uint32_t offset_to_pointer;  /*!< Offset from the beginning of the record to a pointer in the typecasted structure. */
-+    uint32_t offset_to_data;     /*!< Offset from the beginning of the record to data where offset_to_pointer needs to reference. */
-+} ia_aiqd_parser_offset_map;
-+
-+/*!
-+ * \brief Tells how many offset maps there are.
-+ *
-+ * AIQB file contains as many maps as there are pointers in the tuning structure.
-+ */
-+typedef struct
-+{
-+    uint32_t checksum;         /*!< Checksum of record data after ia_mkn_header and before ia_aiqd_parserr_offset_map and ia_aiqd_parserr_maps_info calculated with function ia_aiqb_parse_checksum(). */
-+    uint32_t num_maps;         /*!< Number of ia_aiqd_parserr_offset_map (maps) structures after the record data. */
-+} ia_aiqd_parser_maps_info;
-+
-+/*!
-+ * \brief Calculates checksum of given memory using unsigned 32 bit values.
-+ *
-+ * Function will round down number of elements to sum, if size given is not multiple of 4 bytes. However this should never happen because sizeof(struct) is always multiple of 4 bytes.
-+ *
-+ * \param[in] data  Buffer from where checksum is calculated.
-+ * \param[in] count Size of buffer to sum in bytes.
-+ * \return          Calculated checksum.
-+ */
-+LIBEXPORT unsigned int
-+ia_aiqb_parse_calculate_checksum(void *data, size_t size);
-+
-+
-+/*!
-+* \brief Replace pointers in the AIQB data from map.
-+*
-+* Modifies contents of the given AIQB record data buffer by updating pointer values in the record to valid memory address.
-+* Map in the end of the record tells offset to pointers which need to be updated. Record has following structure:
-+*
-+* ia_mkn_record_header record_header;
-+* char record_data[record_header.size - (maps_info.num_maps * sizeof(ia_aiqd_parser_offset_map) + sizeof(ia_aiqd_parser_maps_info))];
-+* ia_aiqd_parser_offset_map maps[maps_info.num_maps];
-+* ia_aiqd_parser_maps_info maps_info;
-+*
-+* \param[in,out] record AIQB record buffer including all data listed above (header + data). 
-+* \return               Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_aiqb_parse_record(ia_mkn_record_header *record);
-+
-+/*!
-+ * \brief Replace pointers in the AIQB data from map.
-+ *
-+ * Modifies contents of the given AIQB data buffer by updating pointer values in all records to valid memory address.
-+ *
-+ * \param[in,out] aiqb_binary AIQB data buffer
-+ * \return                    Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_aiqb_parse(ia_binary_data *aiqb_binary);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_AIQB_PARSER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
-new file mode 100644
-index 000000000000..87dfd4c90f40
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+ /*!
-+  * \file ia_alloc.h
-+  * \brief Linear scope stack allocator interface.
-+  */
-+
-+#ifndef IA_ALLOC_H_
-+#define IA_ALLOC_H_
-+
-+#include "ia_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef void(*finalizer_function)(void *ptr);
-+typedef struct ia_alloc_t ia_alloc;
-+
-+/*!
-+ *  Initializes the linear allocator.
-+ *
-+ *  \param [in] size Size of the allocator memory space.
-+ *                   If 0, no allocation is made at this point and memory must be reserved with ia_alloc_reserve().
-+ *
-+ *  \return A pointer to the allocator object, or NULL if errors.
-+ */
-+LIBEXPORT ia_alloc* ia_alloc_init(size_t size);
-+
-+/*!
-+ *  Initializes the linear allocator using pre-allocated memory.
-+ *
-+ *  \param [in] buffer Pre-allocated memory buffer.
-+ *  \param [in] size   The size of the given buffer.
-+ *
-+ *  \return A pointer to the allocator object, or NULL if errors.
-+ */
-+LIBEXPORT ia_alloc* ia_alloc_init_from_memory(void* buffer, size_t size);
-+
-+/*!
-+ *  Reserves memory for the allocator. Can also be used to increase the size of the allocation.
-+ *
-+ *  \param [in] alloc The allocator.
-+ *  \param [in] size  The size of the internal memory space to allocate.
-+ *
-+ *  \note Stack position is automatically rewound to the start of the allocator buffer.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_nomemory, if out of memory.
-+ *          ia_err_argument, if invalid allocator or the allocator used pre-allocated memory.
-+ */
-+LIBEXPORT ia_err ia_alloc_reserve(ia_alloc* alloc, size_t size);
-+
-+/*!
-+ *  Allocates a block of memory from the allocator memory space.
-+ *
-+ *  \param [in] alloc The allocator.
-+ *  \param [in] size  The size of the requested allocation.
-+ *
-+ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
-+ */
-+LIBEXPORT void* ia_alloc_allocate(ia_alloc* alloc, size_t size);
-+
-+/*!
-+ *  Allocates a block of memory from the allocator with a custom specified finalizer for destruction.
-+ *
-+ *  \param [in] alloc The allocator.
-+ *  \param [in] size  The size of the requested allocation.
-+ *  \param [in] func  A pointer to the finalizer function.
-+ *
-+ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
-+ */
-+LIBEXPORT void* ia_alloc_allocate_with_finalizer(ia_alloc* alloc, size_t size, finalizer_function func);
-+
-+/*!
-+ *  Enters a new scope.
-+ *
-+ *  \param [in] alloc The allocator.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_internal, if maximum scope depth was reached.
-+ */
-+LIBEXPORT ia_err ia_alloc_enter_scope(ia_alloc* alloc);
-+
-+/*!
-+*  Leaves a scope.
-+*
-+*  \param [in] alloc The allocator.
-+*
-+*  \return ia_err_none, if no errors.
-+*          ia_err_internal, if there is a mismatch between enter and leave calls.
-+*/
-+LIBEXPORT ia_err ia_alloc_leave_scope(ia_alloc* alloc);
-+
-+/*!
-+ *  Deinitializes the linear allocator.
-+ *
-+ *  \param [in] alloc The allocator.
-+ */
-+LIBEXPORT void ia_alloc_deinit(ia_alloc* alloc);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+
-+#endif /* IA_ALLOC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
-new file mode 100644
-index 000000000000..bf8865129ab5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
-@@ -0,0 +1,89 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+/*!
-+ * \mainpage IA BCOMP API documentation
-+ *
-+ * Browse Files and Classes tabs for details.
-+ *
-+ */
-+/*!
-+ * \file ia_bcomp.h
-+ * \brief Definitions and declarations of IA_BCOMP library.
-+ */
-+#ifndef _IA_BCOMP_H_
-+#define _IA_BCOMP_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ia_bcomp_types.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Initialize ia_bcomp handle.
-+ *        If yes the object is allocated and initialized.
-+ *        If not, null is returned
-+ * \param [in]      ia_cmc              Mandatory, Pointer to CMC structure
-+ * \param [in]      dol_mode            Mandatory, Operating mode for DOL sensor
-+ * \param [in]      cg_ratio            Optional, conversion gain ratio for DCG sensor, if sensor is not DCG sensor, this should be set to 1.
-+ * return                               IA_BCOMP handle. Use the returned handle as input parameter for the consequent IA_BCOMP calls.
-+ *                                      Returns NULL is ia_bcomp initialization fails.
-+ */
-+LIBEXPORT ia_bcomp*
-+ia_bcomp_init(const ia_cmc_t *ia_cmc, ia_bcomp_dol_mode_t dol_mode,
-+              float cg_ratio);
-+
-+/*!
-+ * \brief Deinitialize IA_BCOMP.
-+ *        All memory allocated by BCOMP algoritmhs are freed. BCOMP handle can no longer be used.
-+ *
-+ * \param[in] ia_bcomp                  Mandatory. BCOMP instance handle.
-+ *
-+ */
-+LIBEXPORT void
-+ia_bcomp_deinit(ia_bcomp *ia_bcomp);
-+
-+/*!
-+* \brief IA_BCOMP parameters to calculate compression info.
-+*/
-+typedef struct ia_bcomp_input_params
-+{
-+    ia_aiq_ae_results *ae_results;  /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
-+                                         Currently only exposure times, analog and digital gains are used. For convenience reasons bcomp takes
-+                                         ae results and not only needed parameters. */
-+} ia_bcomp_input_params;
-+
-+/*!
-+* \brief Run a bit-compression and generates necessary outputs.
-+*
-+*  \param [in]      ia_bcomp            Mandatory, initialized ia_bcomp handle.\n
-+*  \param [in]      bcomp_input_params  Mandatory. Input parameters to run bit-compression.\n
-+*  \param[out]      bcomp_results       Mandatory. Pointer's pointer where address of bcomp results are stored.
-+*  \return                              Error code.
-+*
-+*/
-+LIBEXPORT ia_err
-+ia_bcomp_run(ia_bcomp *ia_bcomp,
-+             const ia_bcomp_input_params *bcomp_input_params,
-+             ia_bcomp_results **bcomp_results);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* _IA_BCOMP_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
-new file mode 100644
-index 000000000000..5b8d066490bc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
-@@ -0,0 +1,68 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_bcomp_types.h
-+*/
-+
-+#ifndef IA_BCOMP_TYPES_H_
-+#define IA_BCOMP_TYPES_H_
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define MAX_AMOUNT_OF_KNEE_POINTS   16
-+
-+typedef struct ia_bcomp_t ia_bcomp;
-+
-+/*!
-+* \brief compression curves.
-+*/
-+typedef struct ia_pwl_compression_curve
-+{
-+    uint32_t x[MAX_AMOUNT_OF_KNEE_POINTS];
-+    uint32_t y[MAX_AMOUNT_OF_KNEE_POINTS];
-+    uint32_t num_of_knee_points;
-+} ia_pwl_compression_curve;
-+
-+/*!
-+ * \brief Current operating modes supported for various DOL sensors.
-+ */
-+typedef enum
-+{
-+    ia_bcomp_non_dol = 0,                /*!< Non-DOL sensor >*/
-+    ia_bcomp_dol_two_or_three_frame = 1, /*!< UC1 - DOL Sensor outputs two or three exposure readout mode, long, medium , short / long, short >*/
-+    ia_bcomp_dol_dcg = 2,                    /*!< UC2 - DOL DCG (Dual Conversion gain) sensor - outputs HCG (long) and LCG (medium) with a constant cg ratio >*/
-+    ia_bcomp_dol_combined_very_short = 3,    /*!< UC3 - DOL DCG sensor - outputs combined image (long and medium exposure stitched in sensor) and very short exposure >*/
-+    ia_bcomp_dol_dcg_very_short = 4,         /*!< UC4 - DOL DCG sensor - outputs HCG (long), LCG(medium) with constant cg ratio and very short exposure frames >*/
-+} ia_bcomp_dol_mode_t;
-+
-+/*!
-+ * \brief calculated compression curves.
-+ */
-+typedef struct ia_bcomp_results
-+{
-+    ia_pwl_compression_curve    pwl_compression_curve; /*!< piecewise linear compression curve >*/
-+    ia_bcomp_dol_mode_t         dol_mode; /*!< Operating Mode for DOL sensor >*/
-+    float                       cg_ratio; /*!< Conversion Gain Ratio for the sensor - constant value per sensor >*/
-+} ia_bcomp_results;
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_BCOMP_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
-new file mode 100644
-index 000000000000..bdc27cb4d65e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
-@@ -0,0 +1,545 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_ccat.h
-+ * \brief Definitions of common analysis functions used by Intel 3A modules.
-+*/
-+
-+#ifndef IA_CCAT_H_
-+#define IA_CCAT_H_
-+
-+#include "ia_configuration.h"
-+#include "ia_ccat_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+#define IA_CCAT_ACM_SECTORS_MAX_NUM 36
-+
-+typedef struct ia_ccat_t ia_ccat;
-+typedef struct frame_info_t ia_ccat_frame_info;
-+
-+LIBEXPORT ia_ccat*
-+ia_ccat_init();
-+
-+/*!
-+ * \brief (Re)allocates memory for CMC/tunings used inside CCAT.
-+ * Given CMC structure must be valid throughout lifetime of CCAT.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_set_tunings(
-+    ia_ccat *ccat,        /*!< \param[in] Analysis toolbox's internal structure. */
-+    const ia_cmc_t *cmc); /*!< \param[in] CMC structure that will be stored and copied/modified for CCAT internal use. */
-+
-+/*!
-+ * \brief De-initializes and frees memory allocated in ia_ccat_init() function.
-+ */
-+LIBEXPORT void
-+ia_ccat_deinit(ia_ccat *ccat); /*!< \param[in] Analysis toolbox's internal structure. */
-+
-+/*!
-+ * \brief Statistics setting and initialization functions.
-+ *
-+ * Note: frame_parameters_available and frame_type:
-+ * CCAT keeps shallow copy of ia_ccat_frame_parameters structure for all frame_types (eg. flash and nonflash frame parameters) and accesses
-+ * parameters behind given pointers directly during its lifetime. When ia_ccat_set_frame_parameters is called with new set of parameters
-+ * (and frame_parameters_available is set to true), previously given frame parameters (for the given frame_type) will no longer be used and
-+ * can be freed/reused by CCAT client.
-+ * If CCAT client wants to invalidate given frame parameters (for particular frame_type) without new set of parameters, frame_parameters_available
-+ * flag should be set to false. This needs to be done for all frame_types that CCAT client wants to invalidate.
-+ *
-+ * Note: statistics_crop_area:
-+ * This information is needed to restrict use parameters from Camera Module Characterization (for example LSC),
-+ * which was done relative to the full sensor resolution (FOV).
-+ * For example, if sensor captures image size 1600x1200 (4:3 ratio) pixels and only 1600x900 (16:9) area is used from the center.
-+ * So, image area at top and bottom must not be used (needs to be cropped 150 pixels from top and bottom).
-+ * statistics_crop_area crop rectangle needs to be given relative to IA_COORDINATE_WIDTH, IA_COORDINATE_HEIGHT found in ia_coordinate.h.
-+ * Thus given structure in this example case should be:
-+ *  statistics_crop_area.left = (0*IA_COORDINATE_WIDTH/1600);
-+ *  statistics_crop_area.top = (150*IA_COORDINATE_HEIGHT/1200);
-+ *  statistics_crop_area.right = (0*IA_COORDINATE_WIDTH/1600);
-+ *  statistics_crop_area.bottom = (150*IA_COORDINATE_HEIGHT/1200);
-+ *
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_set_frame_parameters(
-+    ia_ccat *ccat,                                                           /*!< \param[in] Analysis toolbox internal data structure. */
-+    const ia_ccat_frame_statistics *frame_statistics,                        /*!< \param[in] Input statistics */
-+    const ia_ccat_frame_parameters *frame_parameters);                       /*!< \param[in] Input parameters */
-+
-+/*!
-+ * \brief Registers percentile that will be calculated from histograms covering whole frame.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_register_percentile_frame(
-+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
-+    float percentile);
-+
-+/*!
-+ * \brief Reserves frame into use.
-+ * \return Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_hold_frame(
-+    ia_ccat *ccat,                    /*!< \param[in]  Analysis toolbox internal data structure. */
-+    ia_ccat_frame_type frame_type,    /*!< \param[in]  Frame type to acquire. */
-+    ia_ccat_frame_info **frame_info); /*!< \param[out] Pointer to acquired frame info. */
-+
-+LIBEXPORT ia_err
-+ia_ccat_release_frame(
-+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
-+    ia_ccat_frame_info **frame_info); /*!< \param[in] Frame info pointer that is no longer used. */
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_percentile(
-+    ia_ccat_frame_info* frame_info,
-+    float percentile,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type histogram_type,
-+    float *percentile_bin);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_normalized_percentile(
-+    ia_ccat_frame_info* frame_info,
-+    float percentile,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type histogram_type,
-+    float *normalized_percentile);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_total_gain(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    float *total_gain);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_total_exposure_time(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    unsigned int *total_exposure_time);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_lux_level_estimate(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    float *lux_level_estimate);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_filtered_lux_level_estimate(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    float *filtered_lux_level_estimate);
-+
-+LIBEXPORT ia_err
-+ia_ccat_hold_frame_histogram(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type histogram_type,
-+    const ia_histogram **histogram);
-+
-+LIBEXPORT ia_err
-+ia_ccat_release_frame_histogram(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type histogram_type,
-+    const ia_histogram **histogram);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_histogram_info(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type histogram_type,
-+    float *mean,
-+    float *saturation_percent,
-+    float *max);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_histogram_segment_average(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_ccat_histogram_type a_histogram_type,
-+    float low_limit,
-+    float high_limit,
-+    float *average);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_ae_results(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_aec_results **ae_results);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_awb_results(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_aiq_awb_results **awb_results);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_af_results(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_aiq_af_results **af_results);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_sa_results(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_aiq_sa_results_v1 **sa_results);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_exposure_result(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_aec_exposure_result *exposure_result);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_exposure_parameters(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_aec_exposure_parameters *exposure_parameters);
-+
-+#ifdef IA_AEC_FEATURE_WEIGHT_GRID
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_histogram_weight_map(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_aec_weight_grid **weight_grid);
-+#endif
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_sensor_exposure_parameters(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    ia_aiq_exposure_sensor_parameters *exposure_sensor_parameters);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_color_gains(
-+    ia_ccat_frame_info *frame_info,
-+    ia_aiq_color_channels *color_gains);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_color_correction_matrix(
-+    ia_ccat_frame_info *frame_info,
-+    float(*matrix)[3][3]);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_timestamp(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned long long *frame_timestamp);
-+
-+/*!
-+ * \brief Get information about number of exposures and which of them is the center (in case of multi exposure frame) exposure index.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_exposure_index_info(
-+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
-+    unsigned int *center_exposure_index,                               /*!< [out] Center (in case of multiple exposures) / default exposure index . */
-+    unsigned int *num_exposures);                                      /*!< [out] Number of exposures/statistics in the frame. */
-+
-+/*!
-+ * \brief Get closest ACMs for a white point.
-+ * Note: Only CCMs are updated in out_acm structure.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_calculate_weighted_acm(
-+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
-+    const cmc_parsed_advanced_color_matrices_ls_t *parsed_acm_ls,      /*!< [in] ACMs from CMC or AIQ tunings. */
-+    unsigned int a_num_advanced_color_matrices,                        /*!< [in] Number of advanced color matrices */
-+    unsigned int sector_count,                                         /*!< [in] Number of sectors in ACMs. */
-+    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
-+    float (*out_acm)[3][3],                                            /*!< [out] Resulting ACMs. Array length is defined by sector_count. */
-+    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
-+
-+/*!
-+ * \brief Get closest CCMs for a white point.
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_calculate_weighted_ccm(
-+    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
-+    const cmc_parsed_color_matrices_t *parsed_color_matrices,          /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
-+    bool output_ccm_type_preferred,                                    /*!< [in] Flag to control output CCM to be preferred (true) or accurate (false). */
-+    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
-+    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_scaled_cmc_lens_shading(
-+    ia_ccat_frame_info *a_frame_info_ptr,
-+    unsigned int a_exposure_index,
-+    const cmc_lens_shading_correction **a_scaled_lsc_ptr);
-+
-+LIBEXPORT ia_err
-+ia_ccat_calculate_chromaticity_based_weights(
-+    ia_ccat_frame_info *frame_info,                                      /*!< [in] Frame handle. */
-+    cmc_chromaticity(*a_chromaticities_ptr)[CMC_NUM_LIGHTSOURCES],       /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
-+    unsigned int num_chromaticities,                                     /*!< [in] Number of input chromaticities. */
-+    cmc_chromaticity point,                                              /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
-+    const float *ir_proportion,                                          /*!< [in] Ir effect on chromaticity point distance (z axis). */
-+    float(*weights)[CMC_NUM_LIGHTSOURCES]);                              /*!< [out] Normalized chromaticity distances translated into weights. */
-+
-+#ifdef IA_AEC_FEATURE_FLASH
-+/*!
-+ * \brief Calculate preferred flash ratio for multi-flash using non-flash white point information. flash_ratio scale between 0-100
-+ */
-+LIBEXPORT ia_err
-+ia_ccat_calculate_flash_ratios(
-+    const cmc_multi_led_flash_t *flash_tunings,
-+    ia_ccat_frame_info *nonflash_frame_info,
-+    float (*flash_ratios)[IA_AEC_FLASHES_NUM]);
-+#endif
-+
-+#ifdef IA_CCAT_IR_GRID_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_ir_grid(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_ccat_grid_char **ir_grid);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_ir_histogram_info(
-+    ia_ccat_frame_info *frame_info,
-+    float *mean,
-+    float *saturation_percent,
-+    float *max);
-+#endif
-+
-+#ifdef IA_CCAT_DEPTH_GRID_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_depth_grid(
-+    ia_ccat_frame_info *frame_info,
-+    const ia_depth_grid **depth_grid);
-+#endif
-+
-+#ifdef IA_CCAT_RGBS_GRID_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_rgbs_grid(
-+    ia_ccat_frame_info *frame_info,
-+    bool shading_corrected,
-+    unsigned int exposure_index,
-+    const ia_rgbs_grid **rgbs_grid);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_af_grid(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_filter_response_grid **af_grid);
-+
-+#ifdef IA_CCAT_HSV_GRID_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_hsv_grid(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_ccat_hsv_grid **hsv_grid);
-+#endif
-+
-+#ifdef IA_CCAT_LUMINANCE_GRID_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_luminance_grid(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_ccat_grid_char **luminance_grid);
-+
-+#ifdef IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_motion_level_estimate(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    float *motion_estimate);
-+#endif
-+#endif
-+
-+#ifdef IA_CCAT_ROI_ANALYSIS_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_register_percentile_roi(
-+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
-+    float percentile);
-+
-+LIBEXPORT ia_err
-+ia_ccat_hold_frame_histogram_roi(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_rectangle *roi_area,
-+    ia_ccat_histogram_type histogram_type,
-+    const ia_histogram **histogram);
-+
-+LIBEXPORT ia_err
-+ia_ccat_release_frame_histogram_roi(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_rectangle *roi_area,
-+    ia_ccat_histogram_type histogram_type,
-+    const ia_histogram **histogram);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_histogram_info_roi(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_rectangle *roi_area,
-+    ia_ccat_histogram_type histogram_type,
-+    float *mean,
-+    float *saturation_percent,
-+    float *max);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_percentile_roi(
-+    ia_ccat_frame_info *frame_info,
-+    float percentile,
-+    unsigned int exposure_index,
-+    const ia_rectangle *roi_area,
-+    ia_ccat_histogram_type histogram_type,
-+    float *percentile_bin);
-+#endif /* IA_CCAT_ROI_ANALYSIS_ENABLED */
-+
-+#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
-+LIBEXPORT ia_err
-+ia_ccat_register_percentile_face(
-+    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
-+    float percentile);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_face_stencil(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_rectangle *face_area,
-+    const ia_ccat_grid_char **stencil_mask);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_faces(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int *num_faces,
-+    const ia_face_roi **faces);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_face_coverage(
-+    const ia_face_roi *face,
-+    float *coverage);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_face_y_mean(
-+    ia_ccat_frame_info *frame_info,
-+    unsigned int exposure_index,
-+    const ia_face_roi *face,
-+    float *face_y_mean);
-+
-+LIBEXPORT ia_err
-+ia_ccat_get_frame_percentile_face(
-+    ia_ccat_frame_info *frame_info,
-+    float percentile,
-+    unsigned int exposure_index,
-+    const ia_face_roi *face,
-+    ia_ccat_histogram_type histogram_type,
-+    float *percentile_bin);
-+#endif /* IA_CCAT_FACE_ANALYSIS_ENABLED */
-+#endif /* IA_CCAT_RGBS_GRID_ENABLED */
-+
-+#ifdef IA_CCAT_EXTERNAL_SENSORS_ENABLED
-+/*
-+* Sensor event functions.
-+*/
-+/*!
-+* \brief Set the accelerometer sensor events to CCAT internal circular buffer.
-+* Initialize sensor_events structure. Const fields in the structure are assumed to be initialized before calling this function.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_set_sensor_events_accelerometer(
-+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
-+    unsigned int num_events,                           /*!< [in] Number of accelerometer sensor events. */
-+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing accelerometer events for given time range. */
-+
-+/*!
-+* \brief Get a copy of accelerometer events.
-+* Outputs all events within given timestamps.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_get_sensor_events_accelerometer(
-+    const ia_ccat *ccat,                               /*!< [in] Analysistoolbox internal data structures. */
-+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
-+                                                       [out] How many events were copied to the sensor_events structure. */
-+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied accelerometer events. */
-+
-+/*!
-+* \brief Set the gyroscope sensor events to CCAT internal circular buffer.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_set_sensor_events_gyroscope(
-+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
-+    unsigned int num_events,                           /*!< [in] Number of gyroscope sensor events. */
-+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gyroscope events for given time range. */
-+
-+/*!
-+* \brief Get a copy of gyroscope events.
-+* Outputs all events within given timestamps.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_get_sensor_events_gyroscope(
-+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
-+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
-+                                                       [out] How many events were copied to the sensor_events structure. */
-+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gyroscope events. */
-+
-+/*!
-+* \brief Set the gravity sensor events to CCAT internal circular buffer.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_set_sensor_events_gravity(
-+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
-+    unsigned int num_events,                           /*!< [in] Number of gravity sensor events. */
-+    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gravity events for given time range. */
-+
-+/*!
-+* \brief Get a copy of gravity events.
-+* Outputs all events within given timestamps.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_get_sensor_events_gravity(
-+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
-+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
-+                                                       [out] How many events were copied to the sensor_events structure. */
-+    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gravity events. */
-+
-+/*!
-+* \brief Set the ambient light sensor events to CCAT internal circular buffer.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_set_sensor_events_ambient_light(
-+    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
-+    unsigned int num_events,                           /*!< [in] Number of ambient light sensor events. */
-+    const ia_ccat_ambient_light_event *sensor_events); /*!< [in] Structure containing ambient light events for given time range. */
-+
-+/*!
-+* \brief Get a copy of ambient light events.
-+* Outputs all events within given timestamps.
-+*/
-+LIBEXPORT ia_err
-+ia_ccat_get_sensor_events_ambient_light(
-+    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
-+    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
-+    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
-+                                                            [out] How many events were copied to the sensor_events structure. */
-+    ia_ccat_ambient_light_event* sensor_events);       /*!< [out] Copied ambient light events. */
-+
-+                                                       /* Following functions require frame_info structure as input. Client should call ia_ccat_hold_frame() to get the frame handle.
-+                                                       * Once frame handle is no longer used, ia_ccat_release_frame() must be called. */
-+#endif /* IA_CCAT_EXTERNAL_SENSORS_ENABLED */
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_CCAT_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
-new file mode 100644
-index 000000000000..5f352b78f0b5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
-@@ -0,0 +1,225 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_ccat.h
-+ * \brief Definitions of common analysis types used by Intel 3A modules.
-+*/
-+
-+#ifndef IA_CCAT_TYPES_H_
-+#define IA_CCAT_TYPES_H_
-+
-+#include "ia_configuration.h"
-+#include "ia_statistics_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_aec_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef enum
-+{
-+    ia_ccat_frame_type_nonflash,
-+#ifdef IA_AEC_FEATURE_FLASH
-+    ia_ccat_frame_type_flash,
-+#endif
-+    ia_ccat_frame_type_count
-+} ia_ccat_frame_type;
-+
-+typedef enum
-+{
-+    ia_ccat_histogram_type_cc_start = 0,
-+    ia_ccat_histogram_type_cc_rgb_averaged = ia_ccat_histogram_type_cc_start, /*!< Color corrected and weighted R, G and B histograms averaged into one histogram. */
-+    ia_ccat_histogram_type_cc_rgb_combined,                                   /*!< Color corrected and weighted R, G and B histograms summed into one histogram. */
-+    ia_ccat_histogram_type_cc_y,                                              /*!< Color corrected and weighted R, G and B histograms converted to Y (luminance) histogram. */
-+    ia_ccat_histogram_type_cc_end,
-+    ia_ccat_histogram_type_raw_start = ia_ccat_histogram_type_cc_end,
-+#ifdef IA_CCAT_RGBS_GRID_ENABLED
-+    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_cc_end,  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms averaged into one histogram. */
-+    ia_ccat_histogram_type_raw_rgb_combined,                                  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms summed into one histogram. */
-+    ia_ccat_histogram_type_raw_y,                                             /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms converted to Y (luminance) histogram. */
-+    ia_ccat_histogram_type_uncorrected_raw_y,                                 /*!< Raw (calculated from RGBS grid before LSC and color correction) R, G and B histograms converted to Y (luminance) histogram. */
-+    ia_ccat_histogram_type_raw_end,
-+#else
-+    ia_ccat_histogram_type_raw_end = ia_ccat_histogram_type_raw_start,
-+    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_raw_end,
-+    ia_ccat_histogram_type_raw_rgb_combined = ia_ccat_histogram_type_raw_end,
-+    ia_ccat_histogram_type_raw_y = ia_ccat_histogram_type_raw_end,
-+    ia_ccat_histogram_type_uncorrected_raw_y = ia_ccat_histogram_type_raw_end,
-+#endif
-+    ia_ccat_histogram_type_count = ia_ccat_histogram_type_raw_end,
-+    ia_ccat_histogram_type_invalid = ia_ccat_histogram_type_count,
-+} ia_ccat_histogram_type;
-+
-+typedef struct ia_ccat_histograms
-+{
-+    ia_histogram r;
-+    ia_histogram g;
-+    ia_histogram b;
-+} ia_ccat_histograms;
-+
-+#ifdef IA_CCAT_RGBS_GRID_ENABLED
-+#ifdef IA_CCAT_HSV_GRID_ENABLED
-+typedef struct ia_ccat_hsv_channels
-+{
-+    float h;
-+    float s;
-+    float v;
-+} ia_ccat_hsv_channels;
-+
-+/*!
-+* \brief HSV grid structure.
-+*/
-+typedef struct ia_ccat_hsv_grid
-+{
-+    unsigned int grid_width;                        /*! Width of the grid. */
-+    unsigned int grid_height;                       /*! Height of the grid. */
-+    ia_ccat_hsv_channels data[IA_RGBS_GRID_SIZE];   /*! Grid data. */
-+} ia_ccat_hsv_grid;
-+#endif
-+#endif
-+
-+#if defined IA_CCAT_RGBS_GRID_ENABLED || defined IA_CCAT_LUMINANCE_GRID_ENABLED || defined IA_CCAT_IR_GRID_ENABLED
-+/*!
-+ * \brief Generic 8 bit grid structure.
-+ */
-+typedef struct ia_ccat_grid_char
-+{
-+    unsigned int grid_width;                    /*! Width of the grid. */
-+    unsigned int grid_height;                   /*! Height of the grid. */
-+    unsigned char data[IA_RGBS_GRID_SIZE];      /*! Grid data. */
-+} ia_ccat_grid_char;
-+
-+/*!
-+* \brief Generic 16 bit grid structure.
-+*/
-+typedef struct ia_ccat_grid_short
-+{
-+    unsigned int grid_width;                    /*! Width of the grid. */
-+    unsigned int grid_height;                   /*! Height of the grid. */
-+    unsigned short data[IA_RGBS_GRID_SIZE];     /*! Grid data. */
-+} ia_ccat_grid_short;
-+
-+/*!
-+ * \brief Generic grid structure with floating point values.
-+ */
-+typedef struct ia_ccat_grid_float
-+{
-+    unsigned int grid_width;                    /*! Width of the grid. */
-+    unsigned int grid_height;                   /*! Height of the grid. */
-+    float data[IA_RGBS_GRID_SIZE];              /*! Grid data in floating point format. */
-+} ia_ccat_grid_float;
-+#endif
-+
-+typedef struct ia_ccat_frame_statistics
-+{
-+    bool frame_parameters_available;                                         /*!< Mandatory. Flag indicating that frame parameters can be used by CCAT. Set to false to invalidate frame parameters. */
-+    bool shading_corrected;                                                  /*!< Mandatory. Flag indicating if statistics were calculated using lens shading corrected data. */
-+    ia_ccat_frame_type frame_type;                                           /*!< Mandatory. Indicates if statistics were captured from non-flash or flash illuminated frame. */
-+    unsigned long long frame_id;                                             /*!< Mandatory. ID for the captured frame. */
-+    unsigned long long frame_timestamp;                                      /*!< Mandatory. Time stamp for captured frame. */
-+    ia_rectangle statistics_crop_area;                                       /*!< Mandatory. RGBS and AF grid area crop with respect to full field of view of sensor output using (relative)ranges from ia_coordinate.h. */
-+#ifdef IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
-+    ia_ccat_histograms rgb_histograms[IA_CCAT_STATISTICS_MAX_NUM];           /*!< Optional. RGB histograms pointer for each exposure statistics. */
-+#endif
-+#ifdef IA_CCAT_EXTERNAL_LUMINANCE_HISTOGRAM_ENABLED
-+    ia_histogram y_histogram[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance histogram. */
-+#endif
-+#ifdef IA_CCAT_RGBS_GRID_ENABLED
-+    ia_rgbs_grid rgbs_grids[IA_CCAT_STATISTICS_MAX_NUM];                     /*!< Optional. RGBS grids for each exposure statistics. */
-+#endif
-+#ifdef IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
-+    ia_filter_response_grid af_grids[IA_CCAT_STATISTICS_MAX_NUM];            /*!< Optional. AF grids for each exposure statistics. */
-+#endif
-+#ifdef IA_CCAT_EXTERNAL_LUMINANCE_GRID_ENABLED
-+    ia_ccat_grid_char y_grid[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance (LSC and color corrected) grids for each exposure statistics. */
-+#endif
-+#ifdef IA_CCAT_IR_GRID_ENABLED
-+    ia_ccat_grid_char ir_grid;                                               /*!< Optional. Ir grid (Non LSC corrected grid). */
-+#endif
-+#ifdef IA_CCAT_DEPTH_GRID_ENABLED
-+    ia_depth_grid depth_grid;                                                /*!< Optional. Depth grid. */
-+#endif
-+} ia_ccat_frame_statistics;
-+
-+typedef struct ia_ccat_frame_parameters
-+{
-+    ia_aec_results ae_results;                                               /*!< Mandatory. Exposure parameters used to capture the frame. */
-+    ia_aiq_pa_results_v1 pa_results;                                         /*!< Optional. */
-+    ia_aiq_sa_results_v1 sa_results;                                         /*!< Optional. */
-+    ia_aiq_awb_results awb_results;                                          /*!< Optional. */
-+    ia_aiq_af_results af_results;                                            /*!< Optional. */
-+#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
-+    ia_face_roi faces[IA_CCAT_FACES_MAX_NUM];                                /*!< Optional. Face coordinates from external face detector. NULL if not available. */
-+#endif
-+} ia_ccat_frame_parameters;
-+
-+/*!
-+ * \brief Structure for various motion sensors
-+ * Accelerometer Events:
-+ *  - The data holds information on the acceleration of the device in mg/sec (miligravity per second). Acceleration = Gravity + Linear Acceleration.
-+ * Gravity Events:
-+ *  - The data holds information on the gravitation of the device in mg/sec (miligravity per second).
-+ * Gyroscope Events:
-+ *  - The data holds information on the angular velocity of the device in rad/sec.
-+ */
-+typedef struct ia_ccat_motion_sensor_event
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
-+    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
-+    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
-+    float sensitivity;      /*!< Sensitivity of the sensor */
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+} ia_ccat_motion_sensor_event;
-+
-+/*!
-+ * \brief Ambient Light Events
-+ * NOTE: This should always match to libsensorhub API
-+ * TODO: Update the structure according to the API
-+ */
-+typedef struct ia_ccat_ambient_light_event
-+{
-+    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
-+    float data;             /*!< Ambient Light data ? */
-+    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
-+    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
-+} ia_ccat_ambient_light_event;
-+
-+#if 0
-+/*!
-+ * \brief Face rectangle
-+ * Range of rectangle values is defined in ia_coordinate.h:
-+ * IA_COORDINATE_TOP, IA_COORDINATE_LEFT, IA_COORDINATE_BOTTOM, IA_COORDINATE_RIGHT
-+ */
-+typedef struct ia_face_roi
-+{
-+    int tracking_id;                   /*!< Tracking id of the face. */
-+    ia_rectangle face_area;            /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
-+    ia_coordinate mouth;               /*!< Mid-point of the mouth. */
-+    ia_coordinate left_eye;            /*!< Left eye */
-+    ia_coordinate right_eye;           /*!< Right eye */
-+    bool eye_validity;                 /*!< Indicates whether a face was processed to get eye positions */
-+    float skin_type_dark_likelihood;   /*!< Likelihood of skin type being dark [0.0, 1.0]. Bright skin likelihood = 1.0 - dark_skin_type_likelihood */
-+    bool skin_type_validity;           /*!< Indicates whether a face was processed to get skin likelihood */
-+} ia_face_roi;
-+#endif
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_CCAT_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
-new file mode 100644
-index 000000000000..341f04476944
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_cmc_parser.h
-+ * \brief Parser for CMC data.
-+*/
-+
-+
-+#ifndef IA_CMC_PARSER_H_
-+#define IA_CMC_PARSER_H_
-+
-+#include "ia_types.h"
-+#include "ia_cmc_types.h"
-+#include "ia_nvm.h"
-+#include "ia_cmc_parser_deprecated.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+LIBEXPORT ia_cmc_t*
-+ia_cmc_parser_init_v1(
-+    const ia_binary_data *a_aiqb_binary,
-+    const ia_binary_data *a_nvm_data);
-+
-+LIBEXPORT void
-+ia_cmc_parser_deinit(ia_cmc_t *ia_cmc);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_CMC_PARSER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
-new file mode 100644
-index 000000000000..7ad170aee24a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
-@@ -0,0 +1,42 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_cmc_parser.h
-+ * \brief Parser for CMC data.
-+*/
-+
-+
-+#ifndef IA_CMC_PARSER_DEPRECATED_H_
-+#define IA_CMC_PARSER_DEPRECATED_H_
-+
-+#include "ia_types.h"
-+#include "ia_cmc_types.h"
-+#include "ia_nvm.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+LIBEXPORT ia_cmc_t*
-+ia_cmc_parser_init(
-+    const ia_binary_data *a_aiqb_binary);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_CMC_PARSER_DEPRECATED_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
-new file mode 100644
-index 000000000000..9172c27f84ef
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
-@@ -0,0 +1,1468 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_cmc_types.h
-+ * \brief Definitions of Camera Module Characterization (CMC) records.
-+*/
-+
-+#ifndef IA_CMC_TYPES_H_
-+#define IA_CMC_TYPES_H_
-+
-+#include "ia_mkn_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/* All CMC records are inside AIQB record in CPFF file. */
-+#define AIQB_TAG IA_MKN_CHTOUL('A','I','Q','B')  /*!< AIQ configuration block tag. */
-+
-+/*
-+ * Color Channels (1-4) refer to Raw Bayer quad in the following order.
-+ * -------------
-+ * | CC1 | CC2 |
-+ * -------------
-+ * | CC3 | CC4 |
-+ * -------------
-+ *
-+ * Structures defined in this header file, which are stored into memory/file must start from 64 bit boundary (for 64 bit systems).
-+ * Keep in mind also structures' internal padding when defining new structures.
-+ */
-+#define CMC_NUM_CHANNELS 4
-+
-+typedef struct
-+{
-+    uint16_t cc1;
-+    uint16_t cc2;
-+    uint16_t cc3;
-+    uint16_t cc4;
-+} cmc_color_channels;
-+
-+/*!
-+ * \brief CIE x and Y coordinates.
-+ */
-+typedef struct
-+{
-+    uint16_t x;
-+    uint16_t y;
-+} cie_coords_t;
-+
-+/*!
-+ * \brief R/G and B/G ratios.
-+ */
-+typedef struct
-+{
-+    uint16_t r_per_g;
-+    uint16_t b_per_g;
-+} chromaticity_t;
-+
-+/*!
-+ * \brief Physical pixel coordinates.
-+ */
-+typedef struct
-+{
-+    uint16_t x;
-+    uint16_t y;
-+} cmc_coords;
-+
-+/*!
-+ * \brief Chromaticity coordinates in CIE 1931 space.
-+ */
-+typedef struct
-+{
-+    float x;
-+    float y;
-+} cmc_cie_coords;
-+
-+/*!
-+ * \brief Chromaticity coordinates in R/G & B/G space.
-+ */
-+typedef struct
-+{
-+    float r_per_g;
-+    float b_per_g;
-+} cmc_chromaticity;
-+
-+/*!
-+* \brief 3x3 color matrix.
-+*/
-+typedef struct
-+{
-+    float matrix[3][3];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
-+} cmc_color_matrix;
-+
-+/*!
-+ * \brief Raw image bayer order.
-+ */
-+typedef enum
-+{
-+    cmc_bayer_order_2x2,                            /*!< Start of enumerations for 2x2 bayer types. */
-+    cmc_bayer_order_grbg = cmc_bayer_order_2x2,     /*!< First row contains pixels Gr, R. Second row contains pixels B, Gb. */
-+    cmc_bayer_order_rggb,                           /*!< First row contains pixels R, Gr. Second row contains pixels Gb, B. */
-+    cmc_bayer_order_bggr,                           /*!< First row contains pixels B, Gb. Second row contains pixels Gr, R. */
-+    cmc_bayer_order_gbrg,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, Gr. */
-+    cmc_bayer_order_grbi,                           /*!< First row contains pixels Gr, R. Second row contains pixels B, IR. */
-+    cmc_bayer_order_irbg,                           /*!< First row contains pixels IR, R. Second row contains pixels B, Gb. */
-+    cmc_bayer_order_rgib,                           /*!< First row contains pixels R, Gr. Second row contains pixels IR, B. */
-+    cmc_bayer_order_rigb,                           /*!< First row contains pixels R, IR. Second row contains pixels Gb, B. */
-+    cmc_bayer_order_bgir,                           /*!< First row contains pixels B, Gb. Second row contains pixels IR, R. */
-+    cmc_bayer_order_bigr,                           /*!< First row contains pixels B, IR. Second row contains pixels Gr, R. */
-+    cmc_bayer_order_gbri,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, IR. */
-+    cmc_bayer_order_ibrg,                           /*!< First row contains pixels IR, B. Second row contains pixels R, Gr. */
-+    cmc_bayer_order_4x2 = 128,                      /*!< Start of enumerations for 4x2 bayer types. */
-+    cmc_bayer_order_2pd_grbg = cmc_bayer_order_4x2, /*!< Two photodiodes per pixel in Gr, R, B, Gb order (4x2). */
-+    cmc_bayer_order_2pd_rggb,                       /*!< Two photodiodes per pixel in R, Gr, Gb, B order (4x2). */
-+    cmc_bayer_order_2pd_bggr,                       /*!< Two photodiodes per pixel in B, Gb, Gr, R order (4x2). */
-+    cmc_bayer_order_2pd_gbrg,                       /*!< Two photodiodes per pixel in Gb, B, R, Gr order (4x2). */
-+    cmc_bayer_order_4x4 = 256,                      /*!< Start of enumerations for 4x4 bayer types. */
-+    cmc_bayer_order_bgrg_gigi_rgbg_gigi = cmc_bayer_order_4x4, /*!< Order: 1st row: B G R G, 2nd row: G I G I, 3rd row: R G B G, 4th row: G I G I (4x4). */
-+    cmc_bayer_order_grgb_igig_gbgr_igig,                       /*!< Order: 1st row: G R G B, 2nd row: I G I G, 3rd row: G B G R, 4th row: I G I G (4x4). */
-+    cmc_bayer_order_rgbg_gigi_bgrg_gigi,                       /*!< Order: 1st row: R G B G, 2nd row: G I G I, 3rd row: B G R G, 4th row: G I G I (4x4). */
-+    cmc_bayer_order_gbgr_igig_grgb_igig,                       /*!< Order: 1st row: G B G R, 2nd row: I G I G, 3rd row: G R G B, 4th row: I G I G (4x4). */
-+    cmc_bayer_order_gigi_rgbg_gigi_bgrg,                       /*!< Order: 1st row: G I G I, 2nd row: R G B G, 3rd row: G I G I, 4th row: B G R G (4x4). */
-+    cmc_bayer_order_igig_gbgr_igig_grgb,                       /*!< Order: 1st row: I G I G, 2nd row: G B G R, 3rd row: I G I G, 4th row: G R G B (4x4). */
-+    cmc_bayer_order_gigi_bgrg_gigi_rgbg,                       /*!< Order: 1st row: G I G I, 2nd row: B G R G, 3rd row: G I G I, 4th row: R G B G (4x4). */
-+    cmc_bayer_order_igig_grgb_igig_gbgr                        /*!< Order: 1st row: I G I G, 2nd row: G R G B, 3rd row: I G I G, 4th row: G B G R (4x4). */
-+} cmc_bayer_order;
-+
-+/*!
-+ * \brief Color space definitions.
-+ */
-+typedef enum
-+{
-+    cmc_color_space_srgb,
-+    cmc_color_space_bt601,
-+    cmc_color_space_bt709,
-+    cmc_color_space_bt2020,
-+    cmc_color_space_bt2100_rgb,
-+    cmc_color_space_bt2100_lms,
-+    cmc_color_space_dci_p3,
-+    cmc_color_space_adobergb,
-+} cmc_color_space;
-+
-+/*!
-+ * \brief CMC names used in the record headers.
-+ */
-+typedef enum
-+{
-+    cmc_name_id_reserved = 0,                            /*!< 00 */
-+    cmc_name_id_comment,                                 /*!< 01 */
-+    cmc_name_id_general_data,                            /*!< 02 */
-+    cmc_name_id_black_level,                             /*!< 03 */
-+    cmc_name_id_black_level_spatial,                     /*!< 04 */
-+    cmc_name_id_saturation_level,                        /*!< 05 */
-+    cmc_name_id_dynamic_range_and_linearity,             /*!< 06 */
-+    cmc_name_id_module_sensitivity,                      /*!< 07 */
-+    cmc_name_id_defect_pixels,                           /*!< 08 */
-+    cmc_name_id_noise,                                   /*!< 09 */
-+    cmc_name_id_lens_shading_correction,                 /*!< 10 */
-+    cmc_name_id_lens_shading_correction_ratio,           /*!< 11 */
-+    cmc_name_id_geometric_distortion_correction,         /*!< 12 */
-+    cmc_name_id_optics_and_mechanics,                    /*!< 13 */
-+    cmc_name_id_module_spectral_response,                /*!< 14 */
-+    cmc_name_id_chromaticity_response,                   /*!< 15 */
-+    cmc_name_id_flash_chromaticity,                      /*!< 16 */
-+    cmc_name_id_nvm_info,                                /*!< 17 */
-+    cmc_name_id_color_matrices,                          /*!< 18 */
-+    cmc_name_id_analog_gain_conversion,                  /*!< 19 DEPRECATED */
-+    cmc_name_id_digital_gain,                            /*!< 20 */
-+    cmc_name_id_sensor_metadata,                         /*!< 21 */
-+    cmc_name_id_geometric_distortion_correction2,        /*!< 22 */
-+    cmc_name_id_exposure_range,                          /*!< 23 */
-+    cmc_name_id_multi_led_flash_chromaticity,            /*!< 24 */
-+    cmc_name_id_advanced_color_matrices,                 /*!< 25 */
-+    cmc_name_id_hdr,                                     /*!< 26 */
-+    cmc_name_id_infrared_correction,                     /*!< 27 */
-+    cmc_name_id_lens_shading_correction_4x4,             /*!< 28 */
-+    cmc_name_id_lateral_chromatic_aberration_correction, /*!< 29 */
-+    cmc_name_id_phase_difference,                        /*!< 30 */
-+    cmc_name_id_black_level_global,                      /*!< 31 */
-+    cmc_name_id_valid_image_area,                        /*!< 32 */
-+    cmc_name_id_lens_shading_correction_4x4_ratio,       /*!< 33 */
-+    cmc_name_id_multi_gain_conversions,                  /*!< 34 */
-+} cmc_name_id;
-+
-+/*!
-+ * \brief Camera features flags (see cmc_optomechanics_t.camera_features).
-+ * Bit '1' means that the feature is presented.
-+ */
-+typedef enum {
-+    cmc_camera_feature_lens_position_sensor        = 1,            /*!< Physical Lens Position sensor */
-+    cmc_camera_feature_voice_coil_actuator         = (1 << 1),     /*!< 'Voice Coil' type of lens actuator */
-+    cmc_camera_feature_hybrid_voice_coil_actuator  = (1 << 2),     /*!< 'Hybrid Voice Coil' type of lens actuator */
-+    cmc_camera_feature_piezo_actuator              = (1 << 3),     /*!< 'Piezo' type of lens actuator */
-+    cmc_camera_feature_mems_actuator               = (1 << 4),     /*!< 'MEMS' type of lens actuator */
-+    cmc_camera_feature_nd_filter                   = (1 << 5),     /*!< Neutral Density filter */
-+    cmc_camera_feature_mechanical_shutter          = (1 << 6),     /*!< Mechanical Shutter */
-+    cmc_camera_feature_variable_apertures          = (1 << 7),     /*!< Variable Apertures */
-+    cmc_camera_feature_optical_zoom                = (1 << 8)      /*!< Optical Zoom */
-+} cmc_camera_feature;
-+
-+/*!
-+ * \brief Camera module orientation
-+ */
-+typedef enum {
-+    cmc_camera_orientation_down = 0,            /*!< Camera module is pointing down */
-+    cmc_camera_orientation_horizontally,        /*!< Camera module is pointing horizontally */
-+    cmc_camera_orientation_up                   /*!< Camera module is pointing up */
-+} cmc_camera_orientation;
-+
-+/*!
-+ * \brief LSC level enumeration.
-+ */
-+typedef enum {
-+    cmc_lsc_force_first_grid = 0,           /*!< Use always first LSC grid */
-+    cmc_lsc_without_nvm,                    /*!< Use LSC adaptation without NVM */
-+    cmc_lsc_with_nvm                        /*!< Use LSC adaptation with NVM */
-+} cmc_lsc_level;
-+
-+/*!
-+ * \brief Shading Adaptor Level enumeration.
-+ */
-+typedef enum {
-+    cmc_sa_disable = 0,                     /*!< Do not apply shading tables (bypass LSC) */
-+    cmc_sa_cct_based,                       /*!< Use CCT based LSC selection */
-+    cmc_sa_adaptive,                        /*!< Use adaptive LSC selection */
-+    cmc_sa_self_adjusting                   /*!< Use module variation correcting LSC */
-+} cmc_sa_level;
-+
-+/*!
-+ * \brief Light source enumeration
-+ */
-+typedef enum {
-+    cmc_light_source_none = 0,           /*!< Light source N/A */
-+    cmc_light_source_a,                  /*!< Incandescent / Tungsten */
-+    cmc_light_source_b,                  /*!< Obsolete. Direct sunlight at noon */
-+    cmc_light_source_c,                  /*!< Obsolete. Average / north sky daylight */
-+    cmc_light_source_d50,                /*!< Horizon light. ICC profile PCS */
-+    cmc_light_source_d55,                /*!< Mid-morning / mid-afternoon daylight */
-+    cmc_light_source_d65,                /*!< Noon daylight. Television, sRGB color space */
-+    cmc_light_source_d75,                /*!< North sky daylight */
-+    cmc_light_source_e,                  /*!< Equal energy */
-+    cmc_light_source_f1,                 /*!< Daylight fluorescent */
-+    cmc_light_source_f2,                 /*!< Cool white fluorescent */
-+    cmc_light_source_f3,                 /*!< White fluorescent */
-+    cmc_light_source_f4,                 /*!< Warm white fluorescent */
-+    cmc_light_source_f5,                 /*!< Daylight fluorescent */
-+    cmc_light_source_f6,                 /*!< Lite white fluorescent */
-+    cmc_light_source_f7,                 /*!< D65 simulator, daylight simulator */
-+    cmc_light_source_f8,                 /*!< D50 simulator, Sylvania F40 Design 50 */
-+    cmc_light_source_f9,                 /*!< Cool white deluxe fluorescent */
-+    cmc_light_source_f10,                /*!< Philips TL85, Ultralume 50 */
-+    cmc_light_source_f11,                /*!< Philips TL84, Ultralume 40 */
-+    cmc_light_source_f12                 /*!< Philips TL83, Ultralume 30 */
-+} cmc_light_source;
-+#define CMC_NUM_LIGHTSOURCES 20u
-+
-+/*!
-+ * \brief PD sensor type enumeration.
-+ */
-+typedef enum {
-+    cmc_pd_sensor_type_non_pd = 0,        /*!< Non-PD sensor */
-+    cmc_pd_sensor_type_1,                 /*!< Type 1 (All processing done on sensor) */
-+    cmc_pd_sensor_type_2,                 /*!< Type 2 (PD extraction on sensor, statistics processing in IPU) */
-+    cmc_pd_sensor_type_3                  /*!< Type 3 (All processing done in IPU) */
-+} cmc_pd_sensor_type;
-+
-+/*!
-+ * \brief PD technology type enumeration.
-+ */
-+typedef enum {
-+    cmc_pd_technology_type_metal_shield = 0,        /*!< Metal shield-based PD */
-+    cmc_pd_technology_type_dual_photodiode,         /*!< Dual photodiode-based PD */
-+    cmc_pd_technology_type_wide_microlens           /*!< Wide microlens-based PD */
-+} cmc_pd_technology_type;
-+
-+/*!
-+ * \brief CMC gdc mode type enumeration.
-+ */
-+typedef enum {
-+    cmc_gdc_mode_grid,    /*!< CMC GDC Grid mode */
-+    cmc_gdc_mode_lut,     /*!< CMC GDC Look-up Table mode */
-+    cmc_gdc_mode_extlut   /*!< CMC GDC Look-up Table from External Tool mode */
-+} cmc_gdc_mode_type;
-+
-+/*!
-+ * \brief CMC Comment
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt8 (See AIQB_DataID), Name ID: cmc_name_id_comment (See cmc_name_id). */
-+    uint8_t project_id[16];      /*!< NULL terminated Project ID string. Date format: yymmddHHMMSSFFF. For example: 1202201823444. */
-+/*    uint8_t comment[];          / *!< Free C string text comment (NULL terminated). Must end at 64 bit alignment. * / */
-+} cmc_comment_t;
-+#define SIZEOF_CMC_COMMENT_T 24
-+
-+/*!
-+ * \brief CMC General Data
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;        /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_general_data. (enum cmc_name_id). */
-+    uint16_t width;                     /*!< Sensor native maximum width. */
-+    uint16_t height;                    /*!< Sensor native maximum height. */
-+    uint16_t bit_depth;                 /*!< Sensor native maximum bit depth (after sensor linearization). For HDR sensor, this is the bit depth after stitching. */
-+    uint16_t color_order;               /*!< Sensor color order in native orientation. */
-+    uint16_t bit_depth_packed;          /*!< Sensor native maximum bit depth (before sensor linearization = packed) . */
-+    uint8_t sve_pattern[16];            /*!< 4x4 pixel pattern. 0 means shortest exposure time and n the longest. */
-+    uint16_t single_exposure_bit_depth; /*!< Sensor native maximum bit depth for single (non-stitched) exposure. */
-+} cmc_general_data_t;
-+#define SIZEOF_CMC_GENERAL_DATA_V100_T 16
-+#define SIZEOF_CMC_GENERAL_DATA_V101_T 18
-+#define SIZEOF_CMC_GENERAL_DATA_V102_T 34
-+#define SIZEOF_CMC_GENERAL_DATA_V103_T 36
-+
-+/*!
-+ * \brief CMC Black Level
-+ * - Global black level compensation.
-+ */
-+typedef struct
-+{
-+    uint32_t exposure_time;              /*!< Exposure time. */
-+    uint32_t analog_gain;                /*!< Analog gain. */
-+    cmc_color_channels color_channels;     /*!< Color channel correction for given exposure time and analog gain. */
-+} cmc_black_level_lut_t;
-+#define SIZEOF_CMC_BLACK_LEVEL_LUT_T 16
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;     /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_black_level. (enum cmc_name_id). */
-+    uint32_t num_bl_luts;            /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
-+/*    cmc_black_level_lut_t bl_luts[]; / *!< Lookup tables for black level correction. * / */
-+} cmc_black_level_t;
-+#define SIZEOF_CMC_BLACK_LEVEL_T 12
-+
-+/*!
-+* \brief CMC for global black Level
-+* - Global black level compensation for 4x4 sensors.
-+*/
-+typedef struct
-+{
-+    uint32_t exposure_time;         /*!< Exposure time in microseconds. */
-+    float total_gain;               /*!< Total gain (including both analog and digital gains). */
-+    float black_level[4][4];        /*!< Black level correction for given exposure time and total gain. */
-+} cmc_black_level_values;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;             /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_black_level_global (See cmc_name_id). */
-+    uint32_t num_bl_luts;                    /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
-+    uint32_t padding;                        /* Ensures that next 64 bit variable starts from 64 bit boundary. */
-+    union {
-+        cmc_black_level_values *ptr;         /*!< Array of global black level values as function of exposure time and gain. Array length is defined by num_bl_luts. */
-+        uint64_t dummy;                      /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } bl_values;
-+} cmc_black_level_global;
-+
-+/*!
-+ * \brief CMC Saturation Level
-+ * - Defined for each color channels.
-+ * - Absolute pixel values using native max bit depth.
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID) Name ID: cmc_name_id_saturation_level. (enum cmc_name_id). */
-+    uint16_t saturation_cc1;     /*!< Saturation level of 1st color channel. */
-+    uint16_t saturation_cc2;     /*!< Saturation level of 2nd color channel. */
-+    uint16_t saturation_cc3;     /*!< Saturation level of 3rd color channel. */
-+    uint16_t saturation_cc4;     /*!< Saturation level of 4th color channel. */
-+} cmc_saturation_level_t;
-+#define SIZEOF_CMC_SATURATION_LEVEL_T 16
-+
-+/*!
-+ * \brief CMC Pixel Dynamic Range And Linearity
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_dynamic_range_and_linearity. (enum cmc_name_id). */
-+    uint32_t dynamic_range;      /*!< Pixel dynamic range in dB. */
-+    uint8_t num_linearity_cc1;   /*!< Number of points in color channel 1 linearity lookup table. */
-+    uint8_t num_linearity_cc2;   /*!< Number of points in color channel 2 linearity lookup table. */
-+    uint8_t num_linearity_cc3;   /*!< Number of points in color channel 3 linearity lookup table. */
-+    uint8_t num_linearity_cc4;   /*!< Number of points in color channel 4 linearity lookup table. */
-+/*    uint16_t lut_linearities[]; / *!< Linearity lookup table for color channels in order: Ch1, Ch2, Ch3 and Ch4. * / */
-+} cmc_linearity_t;
-+#define SIZEOF_CMC_LINEARITY_T 16
-+
-+/*!
-+ * \brief CMC Module Sensitivity
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_sensitivity (See cmc_name_id). */
-+    uint16_t base_iso;           /*!< Base ISO value of the camera module. */
-+} cmc_sensitivity_t;
-+#define SIZEOF_CMC_SENSITIVITY_T 10
-+
-+/*!
-+ * \brief CMC Defect Pixels
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: ??? (See AIQB_DataID), Name ID: cmc_name_id_defect_pixels (See cmc_name_id). */
-+    uint16_t not_defined;        /*!<  */
-+} cmc_defect_pixel_t;
-+#define SIZEOF_CMC_DEFECT_PIXEL_T 10
-+
-+/*!
-+ * \brief CMC Noise
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;       /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_noise (See cmc_name_id). */
-+    float noise_model_coefficients[5]; /*!< Noise model coefficients (c1..5) in equation y = c1*x^2 + Gain*c2*x + Gain^2*c3 + Gain*c4 + c5.
-+                                            Gain is sum of gain applied to pixel (DG and AG), x is the normalized mean (pixel value), and y is the variance. */
-+    int reserved;                      /*!< Reserved for alignment. Always 0. */
-+} cmc_noise;
-+
-+typedef struct
-+{
-+    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
-+    uint16_t correction_level; /*!< Luminance correction level. */
-+    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
-+/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
-+} cmc_lsc_grid_t;
-+#define SIZEOF_CMC_LSC_GRID_T 8
-+
-+/*!
-+ * \brief CMC_Lens Shading Correction
-+ * - Full native FOV
-+ * - Absolute gain values
-+ * - 100% color shading correction
-+ * - x% grid "divided by" NVM_calibration_grid (=ratio) - if no NVM use ones
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction (See cmc_name_id). */
-+    uint16_t lsc_level;          /*!< LSC level enumeration. */
-+    uint16_t num_grids;          /*!< Number of LSC grids. */
-+    uint16_t grid_width;         /*!< LSC Grid width. */
-+    uint16_t grid_height;        /*!< LSC Grid height. */
-+/*  cmc_lsc_grid_t lsc_grids[]; / *!< LSC grids. * / */
-+} cmc_lens_shading_t;
-+#define SIZEOF_CMC_LENS_SHADING_T 16
-+
-+typedef struct
-+{
-+    uint16_t pair_index;       /*!< Calibration light source pair index. */
-+    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
-+    uint16_t correction_level; /*!< Luminance correction level. */
-+    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
-+/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
-+} cmc_lsc_ratio_grid_t;
-+#define SIZEOF_CMC_LSC_RATIO_GRID_T 10
-+
-+/*!
-+ * \brief Lens Shading Correction Ratio
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;      /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_ratio (See cmc_name_id). */
-+    uint16_t num_grids;               /*!< Number of LSC grids. */
-+    uint16_t grid_width;              /*!< LSC Grid width. */
-+    uint16_t grid_height;             /*!< LSC Grid height. */
-+/*    cmc_lsc_ratio_grid_t lsc_grids[]; / *!< LSC grids. * / */
-+} cmc_lens_shading_ratio_t;
-+#define SIZEOF_CMC_LENS_SHADING_RATIO_T 14
-+
-+/*!
-+ * \brief CMC Geometric Distortion Correction
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_geometric_distortion_correction (See cmc_name_id). */
-+    float gdck1;                 /*!<  1st order radial distortion coefficient. */
-+    float gdck2;                 /*!<  2nd order radial distortion coefficient. */
-+    float gdck3;                 /*!<  3rd order radial distortion coefficient. */
-+    float gdcp1;                 /*!<  1st order tangential distortion coefficient. */
-+    float gdcp2;                 /*!<  2nd order tangential distortion coefficient. */
-+} cmc_geometric_distortion_t;
-+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_T 28
-+
-+/*!
-+ * \brief CMC Optics and Mechanics
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;                         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_optics_and_mechanics (See cmc_name_id). */
-+    uint8_t actuator;                                    /*!< Actuator type (enum). */
-+    uint8_t camera_module_orientation;                   /*!< Camera module orientation during the AF calibration (enum from Camera Module Orientation). */
-+    uint16_t camera_actuator_features;                   /*!< Camera features list (flags from cmc_camera_feature enumeration). */
-+    uint16_t nd_gain;                                    /*!< Neutral density filter gain. */
-+    uint16_t effect_focal_length;                        /*!< Effective Focal Length, (mm * 100). */
-+    uint16_t sensor_pix_size_v;                          /*!< Sensor pixel size Vertical, (um * 100). */
-+    uint16_t sensor_pix_size_h;                          /*!< Sensor pixel size Horizontal, (um * 100). */
-+    uint16_t sensor_width_pix_total;                     /*!< Sensor width in pixels, total. */
-+    uint16_t sensor_height_pix_total;                    /*!< Sensor height in pixels, total. */
-+    uint16_t lens_offset_up_to_horz;                     /*!< Lens displacement when module turns from Up to Horizontal, (um). */
-+    uint16_t lens_offset_horz_to_down;                   /*!< Lens displacement when module turns from Horizontal to Down, (um). */
-+    uint16_t range_inf_to_85mm;                          /*!< Optical range 'Inf - 8.5 cm', (um). */
-+    uint16_t range_inf_to_100mm;                         /*!< Optical range 'Inf - 10 cm', (um). */
-+    uint16_t range_inf_to_300mm;                         /*!< Optical range 'Inf - 30 cm', (um). */
-+    uint16_t range_inf_to_500mm;                         /*!< Optical range 'Inf - 50 cm', (um). */
-+    uint16_t range_inf_to_950mm;                         /*!< Optical range 'Inf - 95 cm', (um). */
-+    uint16_t range_inf_to_1200mm;                        /*!< Optical range 'Inf - 120 cm', (um). */
-+    uint16_t range_inf_to_hyperfocal;                    /*!< Optical range 'Inf - Hyperfocal', (um). */
-+    uint16_t range_inf_to_calibration_distance_far;      /*!< Optical range 'Inf - calibration distance far', (um). */
-+    uint16_t range_inf_to_calibration_distance_near;     /*!< Optical range 'Inf - calibration_distance_near', (um). */
-+    uint16_t range_inf_to_min_focusing_distance;         /*!< Optical range 'Inf - calibration_distance_near', (um). */
-+    uint16_t calibration_distance_far;                   /*!< Distance to supplier's FAR production calibration target, (cm). */
-+    uint16_t calibration_distance_near;                  /*!< Distance to supplier's NEAR production calibration target, (cm). */
-+    int16_t calibration_position_far;                    /*!< Supplier's FAR production calibration target in ACTUATOR UNITS, default (used in case NVM is not available).*/
-+    int16_t calibration_position_near;                   /*!< Supplier's NEAR production calibration target in ACTUATOR UNITS,  default (used in case NVM is not available).*/
-+    int32_t lens_range_limit;                            /*!< Maximum available value for the lens actuator. */
-+    int32_t lens_actuator_offset;                        /*!< Permanent offset to lens actuator values. */
-+    uint32_t lens_movement_time;                         /*!< Time (in us) needed to move the lens per single VC unit (if linear_lens_movement_time is 1). Total time needed per one lens move (if linear_lens_movement_time is 0)*/
-+    uint16_t min_focus_distance;                         /*!< Minimum focusing distance, (cm). */
-+    uint16_t num_apertures;                              /*!< Actual number of apertures, presented in camera. */
-+} cmc_optomechanics_t;
-+#define SIZEOF_CMC_OPTOMECHANICS    72
-+
-+/*!
-+ * \brief CMC Module Spectral Response
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_spectral_response (See cmc_name_id). */
-+    uint16_t min_wavelength;              /*!< Minimum wave length. */
-+    uint16_t max_wavelength;              /*!< Maximum wave length. */
-+    uint16_t wavelength_sampling_rate;    /*!< Wave length sampling rate. */
-+/*    cmc_color_channels spectral_response[]; / *!< Module spectral response in order: Ch1,Ch2,Ch3 and Ch4. * / */
-+} cmc_spectral_response_t;
-+#define SIZEOF_CMC_SPECTRAL_RESPONSE 14
-+
-+/*!
-+ * \brief Lightsource definition.
-+ */
-+typedef struct
-+{
-+    cie_coords_t cie_coords;           /*!< Light source CIE xy coordinates. */
-+    chromaticity_t chromaticity_response; /*!< Avg Chromaticity response for R/G anf B/G.*/
-+} cmc_lightsource_t;
-+#define SIZEOF_CMC_LIGHTSOURCE_T 8
-+
-+/*!
-+ * \brief CMC Chromaticity Response
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_chromaticity_response (See cmc_name_id). */
-+    uint16_t num_lightsources;        /*!< Number of avg light sources. */
-+    uint16_t num_nvm_lightsources;    /*!< Number of nvm light sources. */
-+/*  cmc_lightsource_t lightsources[]; / *!< Lightsources in the order: avg, high and low. * / */
-+} cmc_chromaticity_response_t;
-+#define SIZEOF_CMC_CHROMATICITY_RESPONSE 12
-+
-+/*!
-+ *  \brief Flash chromaticity responses for a point.
-+ */
-+typedef struct
-+{
-+    chromaticity_t flash_chromaticity_response;    /*!< Flash Chromaticity response, R/G and B/G */
-+} cmc_poly_point_t;
-+#define SIZEOF_CMC_POLY_POINT_T 4
-+
-+/*!
-+ * \brief CMC Flash Chromaticity
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_flash_chromaticity (See cmc_name_id). */
-+    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
-+    uint16_t num_poly_points;           /*!< Number of points defining polygon. */
-+/*    cmc_poly_point_t poly_point[];    / *!< Flash Chromaticity Deviation in R/G, B/G plane. * / */
-+} cmc_flash_chromaticity_t;
-+#define SIZEOF_CMC_FLASH_CHROMATICITY_T 14
-+
-+typedef struct
-+{
-+    cmc_light_source light_src_type; /*!< Light-source type. See enum cmc_light_source.  */
-+    chromaticity_t chromaticity;     /*!< Chromaticity (sensor) in R/G, B/G plane. */
-+    cie_coords_t cie_coords;      /*!< CIE x and y coordinates. */
-+    int32_t matrix_accurate[9];   /*!< 3x3 accurate CCM, each 3 consequtive elemets sum to 1. */
-+    int32_t matrix_preferred[9];  /*!< 3x3 preferred CCM, each 3 consequtive elemets sum to 1. */
-+} cmc_color_matrix_t;
-+#define SIZEOF_CMC_COLOR_MATRIX_T 84
-+
-+/*!
-+ * \brief CMC Color matrices
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_color_matrices (See cmc_name_id). */
-+    uint16_t num_matrices;               /*!< Number of color matrices. */
-+/*    cmc_color_matrix_t color_matrices[]; / *!< Color matrices. * / */
-+} cmc_color_matrices_t;
-+#define SIZEOF_CMC_COLOR_MATRICES_T 10
-+/*!
-+ * \brief CMC NVM Info
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_nvm_info (See cmc_name_id). */
-+    uint16_t nvm_parser_version;      /*!< Parser version for current camera module type */
-+    uint16_t nvm_data_color_order;    /*!< NVM data color order */
-+    uint16_t nvm_data_orientation;    /*!< NVM data orientation */
-+} cmc_nvm_info_t;
-+#define SIZEOF_CMC_NVM_INFO_T 14
-+
-+/*!
-+ * \brief CMC NVM Info v101
-+ */
-+typedef struct
-+{
-+    uint16_t nvm_scaling_method;        /*!< NVM table scaling method. */
-+} cmc_nvm_info_v101_t;
-+#define SIZEOF_CMC_NVM_INFO_V101_T   2
-+
-+typedef struct
-+{
-+    cmc_nvm_info_t *cmc_nvm_info;           /*!< CMC NVM info data. */
-+    cmc_nvm_info_v101_t *cmc_nvm_info_v101; /*!< CMC NVM info data v101. */
-+} cmc_parsed_nvm_info_t;
-+
-+/*!
-+ * \brief Analog gain to gain code mapping.
-+ * Gains must be defined in ascending order.
-+ */
-+typedef struct
-+{
-+    uint32_t gain;                 /*!< Gain in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint32_t code;                 /*!< Code corresponding to gain. */
-+} cmc_analog_gain_pair_t;
-+#define SIZEOF_CMC_ANALOG_GAIN_PAIR_T 8
-+
-+/*!
-+ * \brief Analog gain to gain code mapping of a segment.
-+ * Segments contain SMIA analog gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
-+ * For example analog gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Analog gain 2.0 is not calculated from the first range parameters but from the second range.
-+ */
-+typedef struct
-+{
-+    uint32_t gain_begin;         /*!< Begin of gain of the segment (inclusive) in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint32_t gain_end;           /*!< End of gain of the segment (exclusive) in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint32_t code_min;           /*!< The minimum recommended setting for the analog gain control. */
-+    uint32_t code_max;           /*!< The maximum recommended setting for the analog gain control. */
-+    uint32_t code_step;          /*!< The precision of the analog gain control. */
-+    int16_t M0;                  /*!< Gain code M0 as in SMIA. */
-+    int16_t C0;                  /*!< Gain code C0 as in SMIA. */
-+    int16_t M1;                  /*!< Gain code M1 as in SMIA. */
-+    int16_t C1;                  /*!< Gain code C1 as in SMIA. */
-+} cmc_analog_gain_segment_t;
-+#define SIZEOF_CMC_ANALOG_GAIN_SEGMENT_T 28
-+
-+/*!
-+ * \brief CMC Analog gain conversion types
-+ * Enum defines different analog gain conversion types.
-+ */
-+typedef enum
-+{
-+    cmc_analog_gain_conversion_type_none,    /*!< No analog gain conversion should be done. */
-+    cmc_analog_gain_conversion_type_segment, /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of analog gain. */
-+    cmc_analog_gain_conversion_type_pair,    /*!< Pairs contain analog gain value & corresponding register value. */
-+} cmc_analog_gain_conversion_type_t;
-+
-+/*!
-+ * \brief CMC Analog gain conversion table
-+ * Analog gain can be represented with n amount of gain code (register value) pairs/segments.
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_analog_gain_conversion (See cmc_name_id). */
-+    uint16_t conversion_type;            /*!< Analog gain conversion type.  See cmc_analog_gain_conversion_type_t. */
-+    uint16_t reserved;                   /*!< Reserved due to byte alignment. */
-+    uint16_t num_segments;               /*!< Number of gain/code segments which describe the analog gain. */
-+    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the analog gain. */
-+/*    cmc_analog_gain_segment_t gain_segments[]; */
-+/*    cmc_analog_gain_pair_t gain_pairs[]; */
-+} cmc_analog_gain_conversion_t;
-+#define SIZEOF_CMC_ANALOG_GAIN_CONVERSION_T 16
-+
-+/*!
-+ * \brief CMC Digital gain conversion types
-+ * Enum defines different digital gain conversion types.
-+ */
-+typedef enum
-+{
-+    cmc_digital_gain_conversion_type_fixed_point, /*!< Digital gain is defined in fixed point format. */
-+    cmc_digital_gain_conversion_type_pair,        /*!< Pairs contain digital gain value & corresponding register value. */
-+} cmc_digital_gain_conversion_type_t;
-+
-+/*!
-+ * \brief CMC digital gain limits and step.
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_digital_gain (See cmc_name_id). */
-+    uint16_t digital_gain_min;           /*!< The minimum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint16_t digital_gain_max;           /*!< The maximum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint8_t digital_gain_step_size;      /*!< Step size of digital gain code register value. */
-+    uint8_t digital_gain_fraction_bits;  /*!< Number of bits used for the fraction part of the 16 bit register value. */
-+/*    cmc_digital_gain_v102_t dg_v102; */
-+/*    cmc_analog_gain_pair_t dg_pairs[];*/
-+} cmc_digital_gain_t;
-+#define SIZEOF_CMC_DIGITAL_GAIN_T 14
-+
-+/*!
-+ * \brief Defines additions to digital gain structure with gain/code pairs support.
-+ */
-+typedef struct
-+{
-+    uint16_t conversion_type;            /*!< Digital gain conversion type.  See cmc_digital_gain_conversion_type_t. */
-+    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the digital gain. */
-+    uint16_t reserved;                   /*!< Not used at the moment. Reserved to ensure correct (32 bit) alignment. */
-+} cmc_digital_gain_v102_t;
-+#define SIZEOF_CMC_DIGITAL_GAIN_V102_T 6
-+
-+/*!
-+ * \brief CMC Sensor exposure registers ranges.
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_exposure_range (See cmc_name_id). */
-+    uint32_t coarse_integration_min;     /*!< Minimum sensor register value for coarse integration time. */
-+    uint32_t coarse_integration_max;     /*!< Maximum sensor register value for coarse integration time.*/
-+    uint32_t fine_integration_min;       /*!< Minimum sensor register value for fine integration time.*/
-+    uint32_t fine_integration_max;       /*!< Maximum sensor register value for fine integration time.*/
-+} cmc_exposure_range_t;
-+#define SIZEOF_CMC_EXPOSURE_RANGE_T 24
-+
-+/*!
-+ * \brief CMC Multiple LED flash chromaticity.
-+ */
-+typedef struct
-+{
-+    uint16_t device_id;                    /*!< Flash device ID enumerator. */
-+    uint16_t num_poly_points;              /*!< Number of points defining polygon. */
-+    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
-+    cie_coords_t flash_avg_cie;            /*!< Flash chromaticity in CIE X, CIE Y plane. */
-+    uint16_t reserved[2];                  /*!< Reserved for future changes. Always 0 (for now).. */
-+    cmc_poly_point_t *poly_points;         /*!< Flash Chromaticity Deviation in R/G, B/G plane. */
-+} cmc_flash_device_t;
-+#define SIZEOF_CMC_FLASH_DEVICE_T 16     /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_led_flash_chromaticity (See cmc_name_id). */
-+    uint16_t max_flash_output;           /*!< Flash maximum energy output for full power, lumen per second [lm/s] */
-+    uint16_t multi_led_flash_mode;       /*!< Reserved for future changes. Always 0 (for now). */
-+    uint16_t reserved;                   /*!< Reserved for future changes. Always 0 (for now). */
-+    uint16_t num_flash_devices;          /*!< Number of flash devices/LEDs. */
-+    cmc_flash_device_t *flash_devices;   /*!< Data of all flash devices. */
-+} cmc_multi_led_flash_t;
-+#define SIZEOF_CMC_MULTI_LED_FLASH_T 16  /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_sensor_metadata (See cmc_name_id). */
-+    uint16_t total_num_of_cfg_blocks;    /*!< Total number of config blocks (ia_emd_config_block_t). */
-+    uint16_t total_num_of_data_blocks;   /*!< Total number of decoded data blocks (ia_emd_decoded_block_t). */
-+    uint8_t num_of_exposure_sets;        /*!< Number of exposure sets in sensor embedded data. */
-+    uint8_t num_of_color_channels;       /*!< Number of color channels in sensor embedded data. */
-+    uint8_t max_num_of_faces;            /*!< Maximum number of faces in external ISP embedded data. */
-+    uint8_t reserved;                    /*!< Reserved. */
-+    /* ia_emd_config_block_t cfg_blocks[];*/   /*!< Configuration blocks array. */
-+} cmc_emd_decoder_config_t;
-+#define SIZEOF_CMC_EMD_DECODER_CONFIG_T  16 /*!< Size of cmc_emd_decoder_config_t without pointer. Used in copying data from CPF to this structure. */
-+
-+typedef struct
-+{
-+    uint8_t *key;                       /*!< Free C string text key (NULL terminated) */
-+    uint8_t *version;                   /*!< Free C string text version (NULL terminated) */
-+} cmc_version_info_t;
-+
-+typedef struct
-+{
-+    cmc_comment_t *cmc_comment;
-+    uint8_t *comment;
-+    uint16_t num_version_infos;
-+    cmc_version_info_t *version_infos;
-+} cmc_parsed_comment_t;
-+
-+typedef struct
-+{
-+    cmc_black_level_t *cmc_black_level;
-+    cmc_black_level_lut_t *cmc_black_level_luts;
-+} cmc_parsed_black_level_t;
-+
-+typedef struct
-+{
-+    cmc_linearity_t *cmc_linearity;
-+    uint16_t *cmc_linearity_lut;
-+} cmc_parsed_linearity_t;
-+
-+typedef struct
-+{
-+    cmc_lens_shading_t *cmc_lens_shading;
-+    cmc_lsc_grid_t *cmc_lsc_grids;
-+    uint16_t *lsc_grids;
-+    chromaticity_t *cmc_lsc_rg_bg_ratios;  /* Sensor R/G B/G ratios, available in
-+                                               cmc_name_id_lens_shading_correction v101. */
-+} cmc_parsed_lens_shading_t;
-+
-+typedef struct
-+{
-+    cmc_lens_shading_ratio_t *cmc_lens_shading_ratio;
-+    cmc_lsc_ratio_grid_t *cmc_lsc_ratio_grids;
-+    uint16_t *lsc_grids;
-+} cmc_parsed_lens_shading_ratio_t;
-+
-+typedef enum
-+{
-+    cmc_aperture_type_fixed = 0,          /*!< Aperture is fixed. */
-+    cmc_aperture_type_dc_iris,            /*!< Aperture is controlled by DC-iris. */
-+    cmc_aperture_type_p_iris,             /*!< Aperture is controlled by P-iris. */
-+} cmc_aperture_type_t;
-+
-+typedef struct
-+{
-+    int16_t cmc_dac_min;        /*!< Minimum value of the DA-converter (will close the iris). */
-+    int16_t cmc_dac_hold;       /*!< A value for DA-converter that will hold the iris ("barely open or barely close"). */
-+    int16_t cmc_dac_max;        /*!< Maximum value of the DA-converter (will open the iris). */
-+} cmc_dc_iris_dac_t;
-+
-+typedef struct
-+{
-+    cmc_optomechanics_t *cmc_optomechanics;
-+    uint16_t *lut_apertures;
-+    uint16_t aperture_type;         /*!< Aperture type control of type cmc_aperture_type_t, v101 and onwards. */
-+    cmc_dc_iris_dac_t dc_iris_dac;  /*!< DAC values for DC-iris, v102 and onwards. */
-+} cmc_parsed_optics_t;
-+
-+typedef struct
-+{
-+    cmc_spectral_response_t *cmc_spectral_response;
-+    cmc_color_channels *spectral_responses;
-+} cmc_parsed_spectral_response_t;
-+
-+/*!
-+ * \brief CMC Gamut.
-+ */
-+typedef struct
-+{
-+    uint16_t light_source;               /*!< Light source type (0 if not known). */
-+    uint16_t r_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
-+    uint16_t b_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
-+    uint16_t CIE_x;                      /*!< Illumination CIE x coordinate.*/
-+    uint16_t CIE_y;                      /*!< Illumination CIE x coordinate.*/
-+    uint16_t size;                       /*!< Size of the gamut tables.*/
-+    uint16_t *gamut_r_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
-+    uint16_t *gamut_b_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
-+} cmc_gamut_t;
-+#define SIZEOF_CMC_GAMUT_T 12
-+
-+typedef struct
-+{
-+    uint16_t num_illumination_gamuts;   /*!< Number of illumination gamuts */
-+    cmc_gamut_t *cmc_gamut;
-+} cmc_chromaticity_response_v101_t;
-+#define SIZEOF_CMC_CHROMATICITY_RESPONSE_V101 2
-+
-+/*!
-+ * \brief Parametric model coefficients for the average chromaticity locus and CCT curve
-+ */
-+typedef struct
-+{
-+    float locus_model[4];
-+    float cct_model[3];
-+} cmc_locus_t;
-+
-+typedef struct
-+{
-+    cmc_chromaticity_response_t *cmc_chromaticity_response;
-+    cmc_chromaticity_response_v101_t *cmc_chromaticity_response_v101;
-+    cmc_locus_t *cmc_locus;
-+    cmc_lightsource_t *cmc_lightsources_avg;
-+    cmc_lightsource_t *cmc_lightsources_hi;
-+    cmc_lightsource_t *cmc_lightsources_lo;
-+    cmc_lightsource_t *cmc_lightsources_nvm;
-+} cmc_parsed_chromaticity_response_t;
-+
-+typedef struct
-+{
-+    cmc_flash_chromaticity_t *cmc_flash_chromaticity;
-+    cmc_poly_point_t *cmc_poly_points;
-+} cmc_parsed_flash_chromaticity_t;
-+
-+typedef enum
-+{
-+    ccm_estimate_method_bypass,     /*!< Return unity CCM matrix. */
-+    ccm_estimate_method_wp,         /*!< Return CCM matrix using only white point estimate from AWB. */
-+    ccm_estimate_method_wp_sa,      /*!< Return CCM matrix using both white point estimate from AWB and Shading Adaptor Results. */
-+} ccm_estimate_method_t;
-+
-+typedef struct
-+{
-+    cmc_color_matrices_t *cmc_color_matrices;
-+    cmc_color_matrix_t *cmc_color_matrix;
-+    uint16_t *ccm_estimate_method;              /*!< ccm_estimate_method for interpolation -> ccm_estimate_method_t */
-+} cmc_parsed_color_matrices_t;
-+
-+typedef struct
-+{
-+    cmc_analog_gain_conversion_t *cmc_analog_gain_conversion;
-+    cmc_analog_gain_segment_t *cmc_analog_gain_segments;
-+    cmc_analog_gain_pair_t *cmc_analog_gain_pairs;
-+} cmc_parsed_analog_gain_conversion_t;
-+
-+/*!
-+ * \brief Gain to gain code mapping.
-+ * Gains must be defined in ascending order.
-+*/
-+typedef struct
-+{
-+    float gain;                         /*!< Gain in floating point format. */
-+    uint32_t code;                      /*!< Code corresponding to gain. */
-+} cmc_gain_code_pair_t;
-+
-+/*!
-+ * \brief Gain to gain code mapping of a segment.
-+ * Segments contain SMIA gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
-+ * For example gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Gain 2.0 is not calculated from the first range parameters but from the second range.
-+ */
-+typedef struct
-+{
-+    float gain_begin;                   /*!< Begin of gain of the segment (inclusive) in floating point format. */
-+    float gain_end;                     /*!< End of gain of the segment (exclusive) in floating point format. */
-+    uint32_t code_min;                  /*!< The minimum recommended setting for the gain control. */
-+    uint32_t code_max;                  /*!< The maximum recommended setting for the gain control. */
-+    uint32_t code_step;                 /*!< The precision of the gain control. */
-+    int16_t M0;                         /*!< Gain code M0 as in SMIA. */
-+    int16_t C0;                         /*!< Gain code C0 as in SMIA. */
-+    int16_t M1;                         /*!< Gain code M1 as in SMIA. */
-+    int16_t C1;                         /*!< Gain code C1 as in SMIA. */
-+    uint32_t padding;                   /*!< Padding to 64-bit boundary. */
-+} cmc_gain_segment_t;
-+
-+typedef struct
-+{
-+    cmc_digital_gain_t *cmc_digital_gain;
-+    cmc_digital_gain_v102_t *cmc_digital_gain_v102;
-+    cmc_analog_gain_pair_t *cmc_digital_gain_pairs;
-+} cmc_parsed_digital_gain_t;
-+
-+typedef enum
-+{
-+    cmc_gain_type_invalid = -1,     /*!< Invalid gain. */
-+    cmc_gain_type_analog_gain = 0,  /*!< Analog gain. */
-+    cmc_gain_type_digital_gain,     /*!< Digital gain. */
-+    cmc_gain_type_conversion_gain,  /*!< Conversion gain for HDR sensors. */
-+    cmc_gain_type_isp_gain,         /*!< Gain applied in ISP. */
-+} cmc_gain_type_t;
-+
-+#ifndef IA_CMC_GAINS_MAX_NUM
-+/* TODO: Use definition from ia_configuration.h */
-+/* Windows driver and imaging system simulators don't include ia_configuration.h correctly. */
-+#define IA_CMC_GAINS_MAX_NUM 4
-+#endif
-+
-+typedef enum
-+{
-+    cmc_gain_conversion_type_none,          /*!< No gain conversion should be done. */
-+    cmc_gain_conversion_type_segment,       /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of gain. */
-+    cmc_gain_conversion_type_pair,          /*!< Pairs contain gain value & corresponding register value. */
-+    cmc_gain_conversion_type_fixed_point,   /*!< Gain is defined in fixed point format. */
-+} cmc_gain_conversion_type_t;
-+
-+typedef struct
-+{
-+    uint16_t gain_min;           /*!< The minimum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint16_t gain_max;           /*!< The maximum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
-+    uint16_t gain_step_size;      /*!< Step size of gain code register value. */
-+    uint16_t fraction_bits;       /*!< Number of bits used for the fraction part of the 16 bit register value. */
-+} cmc_gain_fixed_t;
-+
-+typedef struct
-+{
-+    cmc_gain_type_t gain_type;                  /*!< Gain type. */
-+    cmc_gain_conversion_type_t conversion_type; /*!< Gain conversion type. */
-+    uint32_t num_segments;                      /*!< Number of gain/code segments which describe the gain. */
-+    uint32_t num_pairs;                         /*!< Number of gain/code pairs which describe the gain. */
-+    union
-+    {
-+        cmc_gain_segment_t *ptr;                /*!< Array of gain segments. Array length is defined by num_segments. */
-+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } segments;
-+    union
-+    {
-+        cmc_gain_code_pair_t *ptr;              /*!< Array of gain code pairs. Array length is defined by num_pairs. */
-+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } pairs;
-+    union
-+    {
-+        cmc_gain_fixed_t *ptr;                  /*!< A pointer to the fixed point format. */
-+        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } fixed;
-+} cmc_gain_conversion_t;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_gain_conversions (See cmc_name_id). */
-+    uint32_t num_gains;                 /*!< Number of gains configured. */
-+    uint32_t padding;
-+    union
-+    {
-+        cmc_gain_conversion_t* ptr;     /*!< Array of gain conversions. Array length defined in num_gains. */
-+        uint64_t dummy;                 /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } gains;
-+    uint64_t reserved;                  /* Reserved for record version updates. */
-+} cmc_multi_gain_conversions_t;
-+
-+/*!
-+* \brief CMC geometric distortion correction grids
-+*/
-+typedef struct
-+{
-+    uint16_t focus_position;             /*!< Focus motor position in terms of those used by the sensor module.
-+                                         Range should be depicted from the cmc_name_id_optics_and_mechanics section in the CPFF.). */
-+    int32_t *x_deltas;                  /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
-+                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
-+    int32_t *y_deltas;                  /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
-+                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
-+} cmc_geometric_distortion2_grid_t;
-+
-+typedef struct
-+{
-+    int32_t focalLength;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
-+    int32_t ldc_r_lut[256];         /*!< LDC(R) LUT table*/
-+    int32_t ldc_r_x_center;         /*!< X coordinate of LDC(R) correction center of symmetry */
-+    int32_t ldc_r_y_center;         /*!< Y coordinate of LDC(R) correction center of symmetry */
-+    int32_t ldc_r_y_scale_factor;   /*!< Y coordinate scaling factor for elliptical distortion of LDC(R) correction */
-+} cmc_ldc_lut_t;
-+
-+/*!
-+ * \brief LDC LUT mode
-+ */
-+typedef enum {
-+    cmc_camera_ldc_lut_type_incident_angle_vs_distorted_radius = 0,  /*!< incident angle vs Rd */
-+    cmc_camera_ldc_lut_type_undistorted_radius_vs_distorted_radius,  /*!< 1-> Ru vs Rd */
-+} cmc_camera_ldc_lut_mode_t;
-+
-+
-+/*!
-+ * \brief CMC WFOV LDC parameters
-+ */
-+
-+typedef struct
-+{
-+    float focal_length;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
-+    float max_fov_lut;            /*!< Max incident angle (in degrees) covered in the LUT.*/
-+    cmc_camera_ldc_lut_mode_t lut_mode;    /*!< LDC LUT mode: 0 -> incident angle vs Rd, 1-> Ru vs Rd*/
-+    int32_t num_lut_elements;     /*!< Number of LUT elements.*/
-+    float *ldc_r_lut;             /*!< LDC(R) LUT table in pixels*/
-+} cmc_wfov_ldc_lut_t;
-+
-+
-+/*!
-+ * \brief CMC WFOV calibration parameters
-+ */
-+typedef struct
-+{
-+    float horizontal_shift;         /*!< Horizontal shifts in pixels */
-+    float vertical_shift;           /*!< Vertical shifts in pixels */
-+    float horizontal_foclen_fact;   /*!< Horizontal focal length factor */
-+    float vertical_foclen_fact;     /*!< Vertical focal length factor */
-+    float horizontal_shear;         /*!< Horizontal shear factor */
-+    float vertical_shear;           /*!< Vertical shear factor */
-+} cmc_affine_params_t;
-+#define SIZEOF_CMC_AFFINE_PARAMS (24)
-+
-+typedef struct
-+{
-+    int16_t ldc_col_start;                             /*!< Table X offset in pixels from left corner of the sensor maximum visible area e.g.
-+                                                       If GDC_col_start=GDC_block_width*(-1) then GDC table offset is is one block left compared
-+                                                       to the maximum visible sensor area. */
-+    int16_t ldc_row_start;                             /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area e.g.
-+                                                       If GDC_row_start=GDC_block_height*(-1) then GDC table offset is is one block up compared
-+                                                       to the maximum visible sensor area.  */
-+    int16_t ldc_grid_width;                            /*!< Indicates number of grid vertices on the horizontal axis. */
-+    int16_t ldc_grid_height;                           /*!< Indicates number of grid vertices on the vertical axis. */
-+    int16_t ldc_block_width;                           /*!< Average width of the grid cell in pixel count. */
-+    int16_t ldc_block_height;                          /*!< Average height of the grid cell in pixel count. */
-+    uint16_t ldc_grid_count;                           /*!< Number of LDC grids (focus positions). */
-+    cmc_gdc_mode_type gdc_mode;                        /*!< GDC mode enum, 0=Grid based (old),  1=LUT, 2=ext-LUT. */
-+    int32_t ldc_lut_count;                             /*!< Number of LDC Luts (focal lengths) */
-+    int32_t spherical_r_lut[256];                      /*!< R-spherical LUT table for spherical to Cartesian coordinate system transformation (dewarping) */
-+    int32_t spherical_r_lut_radius_start;              /*!< R-spherical LUT table starting radius, 0-65535 */
-+    int32_t spherical_r_lut_radius_end;                /*!< R-spherical LUT table ending radius, 0-65535 */
-+    int32_t spherical_to_cartesian_x_center;           /*!< X coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
-+    int32_t spherical_to_cartesian_y_center;           /*!< Y coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
-+    cmc_geometric_distortion2_grid_t* ldc_grid;        /*!< LDC grids (legacy) */
-+    cmc_ldc_lut_t* ldc_lut;                            /*!< LDC LUTs */
-+    float max_fov_lens;                                /*!< Max field of view of the lens(degrees) */
-+    int32_t num_wfov_luts;                             /*!< Number of WFOV Luts (focal lengths) */
-+    cmc_wfov_ldc_lut_t *wfov_ldc_lut;                  /*!< WFOV LDC LUTs: Number of LUTs specified by num_wfov_luts */
-+    cmc_affine_params_t *affine_params;                /*!< WFOV affine parameters: One for each LUT */
-+} cmc_parsed_geometric_distortion2_t;
-+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_V100_T 22
-+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_R_LUT 1024 /* 256 * 4 */
-+#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_CFG_PARAMS 16
-+
-+
-+
-+/*!
-+ * \brief CMC advanced color matrix info
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: CMC_GeometricDistortion2 (See cmc_name_id). */
-+    uint16_t light_sources_count;        /*!< Number of light sources. */
-+    uint16_t sector_count;               /*!< Number of color matrix sectors.  */
-+} cmc_advanced_color_matrix_info_t;
-+#define SIZEOF_CMC_ADVANCED_COLOR_MATRIX_INFO_T 12
-+
-+/*!
-+ * \brief CMC color matrix
-+ */
-+typedef struct
-+{
-+    float color_matrix[9];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
-+} cmc_acm_color_matrix_t;
-+#define SIZEOF_CMC_ACM_COLOR_MATRIX_T 36
-+
-+/*!
-+ * \brief CMC advanced color matrices info for light sources
-+ */
-+typedef struct
-+{
-+    uint32_t src_type;                   /*!< Light source type (enum), e.g. Fluorescent. */
-+    float chromaticity[2];               /*!< Chromaticity (sensor) in R/G, B/G plane. */
-+    float src_cie_xy[2];                 /*!< CIE x and y coordinates. */
-+} cmc_acm_color_matrices_info_t;
-+#define SIZEOF_CMC_ACM_COLOR_MATRICES_INFO_T 20
-+
-+typedef struct
-+{
-+    cmc_acm_color_matrices_info_t *color_matrices_info;         /*! < Information for Color matrices. */
-+    cmc_acm_color_matrix_t traditional_color_matrix;            /*! < Color matrix optimized using all sectors. */
-+    cmc_acm_color_matrix_t *advanced_color_matrices;            /*! < Array of color matrices. Array size is sector_count */
-+} cmc_parsed_advanced_color_matrices_ls_t;
-+
-+typedef struct
-+{
-+    cmc_advanced_color_matrix_info_t *cmc_advanced_color_matrix_info;
-+    uint32_t *hue_of_sectors;                                                       /*! < Starting hue angle array of sectors. Array size is sector_count. */
-+    cmc_parsed_advanced_color_matrices_ls_t *cmc_parsed_advanced_color_matrices_ls; /*! < Array of color matrices
-+                                                                                          for different light sources.
-+                                                                                          Array size is light_sources_count. */
-+} cmc_parsed_advanced_color_matrix_t;
-+
-+typedef struct
-+{
-+    float min;    /*!< The minimum allowed ratio for the parameter. */
-+    float max;    /*!< The maximum allowed ratio for the parameter. */
-+} cmc_hdr_param_ratio_limit_t;
-+
-+/*!
-+ *  CMC HDR ratio limits.
-+ */
-+typedef struct
-+{
-+    cmc_hdr_param_ratio_limit_t hdr_exposure_time_ratio_limits; /*!< Allowed ratio between exposure times. */
-+    cmc_hdr_param_ratio_limit_t hdr_analog_gain_ratio_limits;   /*!< Allowed ratio between analog gains. */
-+    cmc_hdr_param_ratio_limit_t hdr_digital_gain_ratio_limits;  /*!< Allowed ratio between digital gains. */
-+} cmc_hdr_ratio_limits_t;
-+
-+/*!
-+* \brief CMC HDR Parameters
-+*/
-+typedef struct
-+{
-+    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
-+    float hdr_exposure_ratio_min;   /*!< Minimum HDR exposure ratio between different exposures. */
-+    float hdr_exposure_ratio_max;   /*!< Maximum HDR exposure ratio between different exposures. */
-+
-+    cmc_hdr_ratio_limits_t overall_ratio_limits;    /*!< v101. Ratio limits between the longest and shortest exposure. */
-+    cmc_hdr_ratio_limits_t pair_ratio_limits;       /*!< v101. Ratio limits between exposure pairs. */
-+} cmc_parsed_hdr_parameters_t;
-+
-+#define SIZEOF_CMC_HDR_T        16
-+#define SIZEOF_CMC_HDR_V101_T   (2*(uint32_t)sizeof(cmc_hdr_ratio_limits_t))
-+
-+typedef enum
-+{
-+    ir_correction_level_bypass,     /*!< Set PA IR Weight grid pointer as NULL. */
-+    ir_correction_level_wp,         /*!< Interpolate IR Weight grid using only white point estimate from AWB. */
-+} ir_correction_level_t;
-+
-+/*!
-+* \brief CMC IR Weight Grids Parameters
-+*/
-+typedef struct
-+{
-+    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
-+    int8_t grid_indices[16];        /*!< IR Weight grid indices showing which tables in the structure holds information. -1 means no correction for that pixel */
-+    uint16_t num_light_sources;     /*!< Number of light sources for which IR Weight Grids are characterized . */
-+    uint16_t num_grids;             /*!< Number of grids per light source. This depends on the CFA type and non -1 elements in  . */
-+    uint16_t grid_width;            /*!< IR Weight Grid width. */
-+    uint16_t grid_height;           /*!< IR Weight Grid height. */
-+}
-+cmc_ir_weight_info_t;
-+#define SIZEOF_CMC_IR_WEIGHT_INFO_T 32
-+
-+
-+typedef struct
-+{
-+    cmc_light_source source_type;    /*!< Light-source type. See enum cmc_light_source.  */
-+    float chromaticity[2];          /*!< Chromaticity (sensor) in R/G, B/G plane. */
-+    float cie_coords[2];            /*!< CIE x and y coordinates. */
-+} cmc_ir_weight_grid_info_t;
-+#define SIZEOF_CMC_IR_WEIGHT_GRID_INFO_T 20
-+
-+typedef struct
-+{
-+    cmc_ir_weight_grid_info_t *ir_weight_grid_info;     /*!< IR Weight Grid Info. */
-+    uint16_t *ir_weight_grid;        /*!< IR Weight Grids for all channels. */
-+}
-+cmc_ir_weight_grids_t;
-+
-+typedef struct
-+{
-+    float ir_proportion;            /*!< IR and green pixel proportion in sensor plane, */
-+    float reserved[3];              /*!< Reserved. */
-+}
-+cmc_ir_proportion_t;
-+#define SIZEOF_CMC_IR_PROPORTION_V101_T   ((uint32_t)sizeof(cmc_ir_proportion_t))
-+
-+typedef struct
-+{
-+    cmc_ir_weight_info_t *ir_weight_info;       /*!< IR Weight Info . */
-+    cmc_ir_weight_grids_t *ir_weight_grids;     /*!< IR Weight Grids. */
-+    cmc_ir_proportion_t *ir_proportion;         /*!< v101. */
-+}
-+cmc_parsed_ir_weight_t;
-+
-+/* CMC structures with version ID >= v200 */
-+
-+typedef struct
-+{
-+    cmc_light_source source_type;         /*!< Light source type (enum), e.g. Fluorescent. */
-+    cmc_chromaticity chromaticity;        /*!< Chromaticity (sensor) in R/G, B/G plane. */
-+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
-+    cmc_color_matrix traditional;         /*!< Color matrix optimized using all sectors. */
-+    cmc_color_matrix *advanced;           /*!< Array of color matrices (as defined by num_sectors). */
-+} cmc_advanced_color_matrices;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_advanced_color_matrices (See cmc_name_id). */
-+    unsigned short num_light_srcs;        /*!< Number of light sources. */
-+    unsigned short num_sectors;           /*!< Number of color matrix sectors.  */
-+    cmc_advanced_color_matrices *acms;    /*!< Advanced color matrices for all light sources (as defined by num_light_srcs). */
-+    unsigned int *hue_of_sectors;         /*!< Starting hue angle array of sectors (as defined by num_sectors). */
-+} cmc_advanced_color_matrix_correction;
-+
-+typedef struct
-+{
-+    cmc_light_source source_type;         /*!< Light source type. */
-+    float chromaticity_i_per_g;           /*!< Sensor Ir/G ratio. */
-+    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
-+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
-+    uint16_t *grids[4][4];                /*!< IR Grids for all color channels (as defined by grid_indices). */
-+} cmc_ir_grid;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_infrared_correction (See cmc_name_id). */
-+    char grid_indices[4][4];              /*!< IR grid indices showing which tables in the structure holds information. -1 means no correction. */
-+    unsigned short num_light_srcs;        /*!< Number of light sources. */
-+    unsigned short grid_width;            /*!< IR Grid width. */
-+    unsigned short grid_height;           /*!< IR Grid height. */
-+    cmc_ir_grid *ir_grids;                /*!< IR grids for all light sources (as defined by num_light_srcs). */
-+} cmc_infrared_correction;
-+
-+typedef struct
-+{
-+    cmc_light_source source_type;         /*!< Light source type. */
-+    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
-+    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
-+    unsigned short fraction_bits;         /*!< Number of fraction bits in the shading table fix point representation. */
-+    unsigned short *grids[4][4];          /*!< LSC gain grid stored in fixed point format with variable number of fraction bits, (16-fraction_bits)Qfraction_bits. */
-+} cmc_lsc_grid;
-+#define SIZEOF_CMC_LSC_GAIN_GRID_T 22
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
-+    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
-+    unsigned short num_light_srcs;        /*!< Number of light sources. */
-+    unsigned short grid_width;            /*!< LSC grid width. */
-+    unsigned short grid_height;           /*!< LSC grid height. */
-+    cmc_lsc_grid *lsc_grids;              /*!< LSC grids for all light sources (as defined by num_light_srcs). */
-+} cmc_lens_shading_correction;
-+#define SIZEOF_CMC_LENS_SHADING4x4_T 32
-+
-+typedef struct
-+{
-+    cmc_lsc_grid lsc_grid;                /* LSC gain grid. */
-+    uint16_t pair_index;                  /* Calibration light source pair index. Tells which NVM table number should be used (in case there are more than one, if there is only one the value is always 0). */
-+} cmc_lsc_ratio_grid;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
-+    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
-+    unsigned short num_light_srcs;        /*!< Number of light sources. */
-+    unsigned short grid_width;            /*!< LSC grid width. */
-+    unsigned short grid_height;           /*!< LSC grid height. */
-+    cmc_lsc_ratio_grid *ratio_grids;      /*!< LSC grids for all light sources (as defined by num_light_srcs). */
-+} cmc_lens_shading_ratio_correction;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lateral_chromatic_aberration_correction (See cmc_name_id). */
-+    cmc_coords optical_center;            /*!< Optical center distance from the left uppermost corner of the sensor (in native sensors resolution). This the location where no lateral chromatic aberration is present. [x, y]. */
-+    uint16_t grid_width;                  /*!< Width of the grid. */
-+    uint16_t grid_height;                 /*!< Height of the grid. */
-+    uint16_t cell_size_x;                 /*!< X-dimension distance (in pixels) between the grid points (lca_grid_*). Guaranteed to be 2^n. This is always in respect to the maximum native sensor width defined in ID2 (General Data). All adaptations to other resolutions is done in the imaging system code in the device in the runtime.*/
-+    uint16_t cell_size_y;                 /*!< Same as above but y-dimension */
-+    float *lca_grid_blue_x;               /*!< Amount of absolute lateral chromatic aberration in horizontal direction in each of the grid locations for blue pixels, in respect to the green pixel. The grid is evenly spaced over the native maximum sensor resolution and maximum field of view. 0 means no aberration, -x means shifted to left, +x mean shifted to right. Grid is aligned to the left uppermost corner of the maximum focal plane. This, as all other CMC tables, are in respect to the maximum native image sensor resolution. All adaptations to other resolutions is done in the imaging system code in the device in the runtime. */
-+    float *lca_grid_blue_y;               /*!< Same as above but in vertical direction. */
-+    float *lca_grid_red_x;                /*!< Same as above but for horizontal and red pixel. */
-+    float *lca_grid_red_y;                /*!< Same as above but in vertical direction. */
-+} cmc_lateral_chromatic_aberration_correction;
-+#define SIZEOF_CMC_LCA_HDR 20
-+
-+typedef struct
-+{
-+    uint16_t pattern_horizontal_offsets;    /*!< Buffer of horizontal offsets for repetitive PD pixels within the pattern */
-+    uint16_t pattern_vertical_offsets;      /*!< Buffer of vertical offsets for repetitive PD pixels within the pattern */
-+    uint16_t pattern_labels;                /*!< Buffer of labels for repetitive PD pixels within the pattern (0 - left pixel, 1 - right pixel) */
-+} cmc_pd_pattern_t;
-+
-+typedef struct
-+{
-+    uint16_t dlom;                          /*!< Default DLOM table for the reference golden sample */
-+} cmc_pd_dlom_t;
-+
-+typedef struct
-+{
-+    uint16_t ps_gains_left;                /*!< Default PS gains table for left pixels for the reference golden module */
-+    uint16_t ps_gains_right;               /*!< Default PS gains table for right pixels for the reference golden module */
-+} cmc_pd_ps_gains_t;
-+
-+typedef struct
-+{
-+    ia_mkn_record_header header;            /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_phase_difference */
-+    uint16_t sensor_type;                   /*!< PD sensor type (See cmc_pd_sensor_type)*/
-+    uint16_t technology_type;               /*!< PD technology type (See cmc_pd_technology_type) */
-+    uint16_t pd_horizontal_offset;          /*!< Number of pixel pairs skipped at the beginning of the frame before the start of the first PD pattern */
-+    uint16_t pd_vertical_offset;            /*!< Number of line pairs skipped at the beginning of the frame before the start of the first PD pattern */
-+    uint16_t num_pd_pixels;                 /*!< Number of repetitive PD pixels within the pattern */
-+    uint16_t pattern_width;                 /*!< Pattern width (horizontal period for repetitive PD pixels) */
-+    uint16_t pattern_height;                /*!< Pattern height (vertical period for repetitive PD pixels) */
-+    uint16_t dlom_width;                    /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in horizontal orientation */
-+    uint16_t dlom_height;                   /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in vertical orientation */
-+    uint16_t ps_gains_width;                /*!< Number of pixel sensitivity (PS) knots in horizontal orientation */
-+    uint16_t ps_gains_height;               /*!< Number of pixel sensitivity (PS) knots in vertical orientation */
-+    cmc_pd_pattern_t *cmc_pd_pattern;       /*!< PD pattern characterization (num_pd_pixels) */
-+    cmc_pd_dlom_t *cmc_pd_dlom;             /*!< Disparity of Lens Offset Mapping characterization (dlom_width*dlom_height) */
-+    cmc_pd_ps_gains_t *cmc_pd_ps_gains;     /*!< Pixel sensitivity characterization (ps_gains_width*ps_gains_height) */
-+} cmc_phase_difference_t;
-+#define SIZEOF_CMC_PHASE_DIFFERENCE_T 30
-+
-+/*!
-+ * \brief Structure defining run (count) and value pairs.
-+ */
-+typedef struct
-+{
-+    unsigned short run;    /*!< Count of how many times the same 'value' is present. */
-+    unsigned short value;  /*!< Value. */
-+} cmc_run_value;
-+
-+/*!
-+ * \brief Defines structure that describes valid image area.
-+ * When using WFOV lens, for example fisheye lens, image coming through the optics is not covering the whole sensor area.
-+ * For example corners of the captured image from sensor may be invalid and need to be excluded from 3A analysis and ISP processing.
-+ * This structure defines generic form of describing areas that should be excluded from captured rectangular sensor image.
-+ * 0 value indicates invalid area and 1 indicates valid area.
-+ * { run, value } pairs are used to compress data.
-+ *
-+ * Example how following 2D table is described with { run, value } pairs:
-+ * 0000000000000000 -> { 16, 0 },
-+ * 0000011111111111 -> { 5, 0 },  { 11, 1 },
-+ * 0111111111111110 -> { 1, 0  }, { 14, 1 }, { 1, 0 },
-+ * 0011111111111100 -> { 2, 0  }, { 12, 1 }, { 2, 0 },
-+ * 0000111111110000 -> { 4, 0  }, { 8, 1  }, { 4, 0 },
-+ *
-+ * This 2D table can be further reduced by joining per row { run, value } pairs to 1D table:
-+ * { 21, 0 }, { 11, 1 }, { 1, 0 }, { 14, 1 }, { 3, 0 }, { 12, 1 }, { 6, 0 }, { 8, 1 }, { 4, 0 }
-+ * 'width' defines how to decode 1D array into 2D table.
-+ * 'height' is given for reference, in order to calculate size of 2D table for decoding it into memory.
-+ */
-+typedef struct
-+{
-+    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_valid_image_area (See cmc_name_id). */
-+    unsigned short width;        /*!< Width of the map that indicates valid image area. */
-+    unsigned short height;       /*!< Height of the map that indicates valid image area. */
-+    unsigned int num_run_values; /*!< Number of { run, value } pairs encoded. */
-+    union {
-+        cmc_run_value *ptr;      /*!< Pointer to { run, value} pairs. */
-+        uint64_t dummy;          /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
-+    } run_values;
-+
-+    unsigned short center_x;     /*!< v201+ only -- Horizontal center of radial approximation of valid image area in pixels. */
-+    unsigned short center_y;     /*!< v201+ only -- Vertical center of radial approximation of valid image area in pixels. */
-+    unsigned int radius;         /*!< v201+ only -- Radius of valid image area in pixels */
-+    uint64_t reserved_v202;      /*!< v202+ only -- reserved for pointer to v202 data */
-+    uint64_t reserved_v203;      /*!< v202+ only -- reserved for pointer to v203 data */
-+} cmc_valid_image_area;
-+
-+/*!
-+ * \brief Parsed CMC structure.
-+ * Parser will fill the pointers in this structure so that data can be accessed more easily.
-+ */
-+typedef struct
-+{
-+    cmc_parsed_comment_t cmc_parsed_comment;                               /* 0 */
-+    cmc_general_data_t *cmc_general_data;                                  /* 8 */
-+    cmc_parsed_black_level_t cmc_parsed_black_level;                       /* DEPRECATED. Use cmc_black_level_global instead. */
-+    cmc_saturation_level_t *cmc_saturation_level;                          /* 20 */
-+    cmc_parsed_linearity_t cmc_parsed_linearity;                           /* 24 */
-+    cmc_sensitivity_t *cmc_sensitivity;                                    /* 32 */
-+    cmc_defect_pixel_t *cmc_defect_pixel;                                  /* 36 */
-+    cmc_noise *cmc_noise_model;                                            /* 40 */
-+    cmc_parsed_lens_shading_t cmc_parsed_lens_shading;                     /* 44 */
-+    cmc_parsed_optics_t cmc_parsed_optics;                                 /* 72 */
-+    cmc_parsed_spectral_response_t cmc_parsed_spectral_response;           /* 80 */
-+    cmc_parsed_chromaticity_response_t cmc_parsed_chromaticity_response;   /* 88 */
-+    cmc_parsed_flash_chromaticity_t cmc_parsed_flash_chromaticity;         /* 108 */
-+    cmc_parsed_nvm_info_t cmc_parsed_nvm_info;                             /* 114 */
-+    cmc_parsed_color_matrices_t cmc_parsed_color_matrices;                 /* */
-+    cmc_parsed_analog_gain_conversion_t cmc_parsed_analog_gain_conversion; /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
-+    cmc_parsed_digital_gain_t cmc_parsed_digital_gain;                     /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
-+    cmc_parsed_geometric_distortion2_t *cmc_parsed_geometric_distortion2;
-+    cmc_exposure_range_t *cmc_exposure_range;
-+    cmc_multi_led_flash_t *cmc_multi_led_flashes;
-+    cmc_emd_decoder_config_t *cmc_emd_decoder_config;
-+    cmc_parsed_advanced_color_matrix_t cmc_parsed_advanced_color_matrix;
-+    cmc_parsed_hdr_parameters_t *cmc_parsed_hdr_parameters;
-+    cmc_parsed_ir_weight_t *cmc_parsed_ir_weight;
-+    cmc_phase_difference_t *cmc_phase_difference;
-+    cmc_lateral_chromatic_aberration_correction *cmc_parsed_lca;
-+    cmc_lens_shading_correction *cmc_lens_shading;
-+    cmc_black_level_global *cmc_black_level_global;
-+    cmc_valid_image_area *cmc_valid_image_area;
-+    cmc_lens_shading_ratio_correction *cmc_lens_shading_ratio;
-+    cmc_multi_gain_conversions_t *cmc_multi_gain_conversions;
-+} ia_cmc_t;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_CMC_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
-new file mode 100644
-index 000000000000..bbfbaeb60963
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
-@@ -0,0 +1,61 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CONFIGURATION_H_
-+#define _IA_CONFIGURATION_H_
-+
-+#define IA_HISTOGRAM_SIZE 256
-+#define IA_RGBS_GRID_WIDTH 100
-+#define IA_RGBS_GRID_HEIGHT 100
-+#define IA_FILTER_RESPONSE_GRID_WIDTH 100
-+#define IA_FILTER_RESPONSE_GRID_HEIGHT 100
-+#define IA_DEPTH_GRID_WIDTH 16
-+#define IA_DEPTH_GRID_HEIGHT 12
-+#define IA_CMC_GAINS_MAX_NUM 4
-+#define IA_CCAT_STATISTICS_MAX_NUM 3
-+#define IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
-+#define IA_CCAT_IR_GRID_ENABLED
-+#define IA_CCAT_DEPTH_GRID_ENABLED
-+#define IA_CCAT_RGBS_GRID_ENABLED
-+#define IA_CCAT_HSV_GRID_ENABLED
-+#define IA_CCAT_LIGHT_SOURCE_ESTIMATION_ENABLED
-+#define IA_CCAT_LUMINANCE_GRID_ENABLED
-+#define IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
-+#define IA_CCAT_FACE_ANALYSIS_ENABLED
-+#define IA_CCAT_FACES_MAX_NUM 3
-+#define IA_CCAT_ROI_ANALYSIS_ENABLED
-+#define IA_CCAT_ROIS_MAX_NUM 1
-+#define IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
-+#define IA_CCAT_EXTERNAL_SENSORS_ENABLED
-+#define IA_AEC_EXPOSURES_MAX_NUM 10
-+#define IA_AEC_EXPOSURE_PLANS_NUM 4
-+#define IA_AEC_FEATURE_WEIGHT_GRID
-+#define IA_AEC_WEIGHT_GRID_WIDTH 32
-+#define IA_AEC_WEIGHT_GRID_HEIGHT 24
-+#define IA_AEC_FEATURE_CALIBRATION_DATA
-+#define IA_AEC_FEATURE_FLASH
-+#define IA_AEC_FLASHES_NUM 2
-+#define IA_AEC_FEATURE_FLICKER_DETECTION
-+#define IA_AEC_FEATURE_BACKLIGHT_DETECTION
-+#define IA_AEC_FEATURE_FACE_UTILIZATION
-+#define IA_AEC_FEATURE_ROI_ENABLED
-+#define IA_AEC_FEATURE_APERTURE_CONTROL
-+#define IA_AEC_FEATURE_DC_IRIS
-+#define IA_AEC_FEATURE_MULTIFRAME_HINT
-+#define IA_AEC_FEATURE_HDR
-+#define IA_AEC_FEATURE_MOTION_BLUR_REDUCTION
-+
-+#endif /* _IA_CONFIGURATION_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
-new file mode 100644
-index 000000000000..6a1b64ec39e2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
-@@ -0,0 +1,149 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_coordinate.h
-+ * \brief Definitions of IA imaging coordinate system and conversion functions.
-+ *
-+ * IA Imaging algorithms use relative coordinate system where top left corner
-+ * is (0,0) and bottom right corner is (8192,8192).
-+ *
-+ * Coordinate conversions can happen between arbitrary coordinate systems.
-+ *
-+ * Width and height of coordinate system must be > 0.
-+ *
-+ * Zoom factor is not considered in coordinate conversions but it should be
-+ * calculated when defining the target coordinate system.
-+ *
-+ * For example:
-+ *
-+ *      |-------------------------------------------|
-+ *      |(0,0)                                      |
-+ *      |                                           |
-+ *      |    (1800,1700)                            |
-+ *      |        |--------------|                   |
-+ *      |        |(-100,-100)   |                   |
-+ *      |        |              |                   |
-+ *      |        |     (100,100)|                   |
-+ *      |        |--------------|                   |
-+ *      |                   (5500,4000)             |
-+ *      |                                           |
-+ *      |                                           |
-+ *      |                                           |
-+ *      |                                           |
-+ *      |                                (8192,8192)|
-+ *      |-------------------------------------------|
-+ *
-+ *
-+ * There is an algorithm which works on cropped area with own coordinate system A
-+ * [(-100,100), (100.100)] inside another coordinate system B [(0,0), (8192,8192)].
-+ *
-+ * To convert results from coordinate system A to B, one must define source and target
-+ * coordinate systems:
-+ * Source system is coordinate system A.
-+ * src_system: [(-100,100), (100.100)]
-+ *
-+ * Target system defines the cropped rectangle from inside coordinate system B.
-+ * trg_system: [(1800,1700), (5500,4000)]
-+ *
-+ */
-+
-+
-+#ifndef IA_COORDINATE_H_
-+#define IA_COORDINATE_H_
-+
-+#include "ia_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*! \brief Definitions of IA imaging coordinate system. */
-+#define IA_COORDINATE_TOP 0
-+#define IA_COORDINATE_LEFT 0
-+#define IA_COORDINATE_BOTTOM 8192
-+#define IA_COORDINATE_RIGHT 8192
-+#define IA_COORDINATE_WIDTH (IA_COORDINATE_RIGHT-IA_COORDINATE_LEFT)
-+#define IA_COORDINATE_HEIGHT (IA_COORDINATE_BOTTOM-IA_COORDINATE_TOP)
-+
-+typedef enum
-+{
-+    ia_coordinate_rounding_mode_floor = 0, /* Coordinates are always floored down. This is the old behavior. */
-+    ia_coordinate_rounding_mode_ceil,      /* Coordinates are always ceiled up. */
-+    ia_coordinate_rounding_mode_round      /* Coordinates are rounded to the closest integer. */
-+} ia_coordinate_rounding_mode;
-+
-+/*!
-+ * \brief Coordinate system.
-+ * Defines the coordinate space boundaries.
-+ */
-+typedef struct
-+{
-+    int top;    /*!< Top coordinate value in the coordinate system. */
-+    int left;   /*!< Left coordinate value in the coordinate system. */
-+    int bottom; /*!< Bottom coordinate value in the coordinate system. */
-+    int right;  /*!< Right coordinate value in the coordinate system. */
-+} ia_coordinate_system;
-+
-+/*!
-+ * \brief Convert coordinate from source coordinate space to target coordinate space.
-+ * \param[in] src_system     Source coordinate system boundaries.
-+ * \param[in] trg_system     Target coordinate system boundaries.
-+ * \param[in] src_coordinate Coordinate values in source coordinate system.
-+ * \param[in] rounding_mode  Coordinate rounding mode.
-+ * \return                   Target coordinate converted from source coordinate.
-+ */
-+LIBEXPORT ia_coordinate
-+ia_coordinate_convert(
-+    const ia_coordinate_system *src_system,
-+    const ia_coordinate_system *trg_system,
-+    const ia_coordinate src_coordinate,
-+    const ia_coordinate_rounding_mode rounding_mode);
-+
-+/*!
-+*  Converts a rectangle from one coordinate system to another.
-+*
-+*  \param [in]  a_src_system_ptr   The source coordinate system.
-+*  \param [in]  a_src_rect_ptr     The source rectangle.
-+*  \param [in]  a_tgt_system_ptr   The target coordinate system.
-+*  \param [out] a_tgt_rect_ptr     The calculated target rectangle.
-+*/
-+LIBEXPORT void
-+ia_coordinate_convert_rect(
-+    const ia_coordinate_system* a_src_system_ptr,
-+    const ia_rectangle* a_src_rect_ptr,
-+    const ia_coordinate_system* a_tgt_system_ptr,
-+    ia_rectangle* a_tgt_rect_ptr);
-+
-+/*!
-+ * \brief Convert face coordinates to target coordinate system.
-+ * \param[in,out] face_state Structure containing face information from face tracker.
-+ * \param[in]     src_system Source coordinate system boundaries.
-+ * \param[in]     trg_system Target coordinate system boundaries.
-+ */
-+LIBEXPORT void
-+ia_coordinate_convert_atbx_faces(
-+    ia_atbx_face_state *face_state,
-+    const ia_coordinate_system *src_system,
-+    const ia_coordinate_system *trg_system);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+
-+#endif /* IA_COORDINATE_H_ */
-+
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
-new file mode 100644
-index 000000000000..0883373c132b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+/*!
-+ * \mainpage IA DPC API documentation
-+ *
-+ * Browse Files and Classes tabs for details.
-+ *
-+ */
-+/*!
-+ * \file ia_dpc.h
-+ * \brief Definitions and declarations of IA SD-DPC library.
-+ */
-+#ifndef _IA_DPC_H_
-+#define _IA_DPC_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ia_mkn_types.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+#define IA_DPC_VERSION "1.0.0.0"
-+typedef struct ia_dpc_t ia_dpc;
-+
-+/*!
-+ * \brief SD-DPC runtime input.
-+ */
-+typedef struct {
-+    short *frame_data;                 /*!< fixed point image */
-+    int frame_width;                   /*!< current frame width (might be cropped) */
-+    int frame_height;                  /*!< current frame height (might be cropped) */
-+} sd_dpc_input;
-+
-+/*!
-+ * \brief SD-DPC per-run output.
-+ */
-+typedef struct {
-+    short *defect_lut;          /*!< defects LUT stores the column indices (one-based) of the approved defects per row. size frame_height x max_defects_per_line */
-+    int dpc_lut_width;        /*!< the width of the DP LUT, equal to maximum number of defects per line */
-+    int dpc_lut_height;       /*!< the height of the DP LUT, equal to sensor height */
-+    bool dpc_lut_changed;     /*!< true if the new defects have been added */
-+} sd_dpc_output;
-+
-+/*!
-+ * \brief Initialize IA_DPC.The function parses the given AIQB data and determines if the SD-DPC should be used. 
-+ *        If yes the object is allocated and initialized.
-+ *        If not, null is returned
-+ *
-+ * \param[in]     aiqb_data              Mandatory.\n
-+ *                                       CPFF that contains tuning parameters for camera, ISP and AIQ algorithms.
-+ *                                       If NULL is given the function will return NULL.
-+ * \param[in]     ia_cmc                 Mandatory.\n
-+ *                                       Parsed camera module characterization structure. Internal copy of the structure will be taken.
-+ *                                       If NULL is given the function will return NULL.
-+ * \param[in]     ia_dpcd_data           Mandatory.\n
-+ *                                       loaded DPCD data. Should not be NULL, but have size = 0 instead
-+ * \param[in]     max_defects_per_line   Mandatory.\n
-+ *                                       maximum number of defects per line support by the ISP.
-+ * \param[in]     stripe_number_of_lines Mandatory.\n
-+ *                                       The maximum stripe height.
-+ * return                                IA_DPC handle. Use the returned handle as input parameter for the consequent IA_DPC calls.
-+ *                                       Returns NULL is SD-DPC should be bypassed.
-+ */
-+LIBEXPORT ia_dpc*
-+ia_dpc_init(const ia_binary_data *aiqb_data,
-+            const ia_cmc_t *ia_cmc,
-+            const ia_binary_data *ia_dpcd_data,
-+            unsigned int max_defects_per_line,
-+            unsigned int stripe_number_of_lines);
-+
-+/*!
-+ * \brief De-initialize IA_DPC.
-+ * All memory allocated by DPC algoriths are freed. DPC handle can no longer be used.
-+ *
-+ * \param[in] ia_dpc                Mandatory.\n
-+ *                                  DPC instance handle.
-+ */
-+LIBEXPORT void
-+ia_dpc_deinit(ia_dpc *ia_dpc);
-+/*!
-+ * \brief SD-DPC execution based on input parameters and stripe.
-+ *
-+ *  \param [in]      ia_dpc         Mandatory.\n
-+ *                                  SD-DPC state, updated with the intermediate results
-+ *  \param [in,out]  stripe_ptr     Mandatory.\n
-+ *                                  Stripe data that include the RAW pixels and the exisitng/ missing margins information.
-+ *  \param [out]     dpc_output     Mandatory.\n
-+ *                                  Output LUT of the verified defect pixels. The new defect pixels can be only in the given stripe region.
-+ *                                  Results can be used directly as input for AIC.
-+ *  \return                         Error code.
-+ */
-+
-+LIBEXPORT ia_err
-+ia_dpc_run(ia_dpc *ia_dpc,
-+          const sd_dpc_input *stripe_ptr,
-+          const ia_aiq_frame_params *aiq_frame_params_ptr,
-+          const ia_aiq_ae_exposure_result *ae_exposure_result_ptr,
-+          sd_dpc_output *dpc_output);
-+
-+/*!
-+ * \param[in]  ia_aiq               Mandatory.\n
-+ *                                  DPC instance handle.
-+ * \param[out] out_ia_dpcd_data     Mandatory.\n
-+ *                                  Contains various DPC related information, collected during run-time and subject to
-+ *                                  be stored in a host file system. Host will copy this data, if ia_dpcd_data->size > 0
-+ *                                  and ia_dpcd_data->data != NULL; SD-DPC is responsible to deallocate data buffer
-+ *                                  during ia_dpc_deinit().
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err 
-+ia_dpc_get_dpcd_data(
-+        ia_dpc *ia_dpc,
-+        ia_binary_data *out_ia_dpcd_data);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* _IA_DPC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
-new file mode 100644
-index 000000000000..8dfabb66b42d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
-@@ -0,0 +1,286 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \mainpage IA DVS documentation
-+ *
-+ * \section general General info
-+ *
-+ * Digital video stabilization API.
-+ *
-+ */
-+
-+/*!
-+ * \file ia_dvs.h
-+ * \brief Definitions and declarations of Intel DVS library.
-+ */
-+
-+#ifndef _IA_DVS_H_
-+#define _IA_DVS_H_
-+
-+#include <stdint.h>
-+#include "ia_dvs_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_cmc_types.h"
-+#include "ia_aiq.h"
-+#include "ia_dvs_deprecated.h"
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*! \brief Initialize the DVS module.
-+ *
-+ * \param[out]  dvs_state            dvs state.
-+ *                                   This is a pointer to a pointer to a module.
-+ * \param[in]   a_aiq_tuning_binary  aiqb binary tuning parameter.
-+ * \param[in]   cmc                  cmc_t parameter.
-+ * \return                           0 for no error, others for error.
-+ *
-+ * This function initializes the DVS module. This allocates and initializes
-+ * internal data structures. This function must always be called before any
-+ * other ia_dvs function.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_init(ia_dvs_state **dvs_state,
-+            const ia_binary_data *a_aiq_tuning_binary,
-+            const ia_cmc_t *cmc);
-+
-+/*! \brief Configure the DVS module.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ * \param[in]   config              dvs configuration
-+ * \param[in]   digital_zoom_ratio  digital zoom ratio.
-+ * \return                          0 for no error, others for error.
-+ *
-+ * This function configures the DVS module. This allocates and initializes
-+ * internal data structures. This function must always be called after ia_dvs_init
-+ * and before any other ia_dvs function is called.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_config_v1(ia_dvs_state *dvs_state,
-+                 const ia_dvs_configuration_v1 *config,
-+                 float digital_zoom_ratio);
-+
-+/*! \brief Deinitialize the DVS module.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ *
-+ * This function deinitilizes the DVS module. This frees the allocated memory.
-+ */
-+LIBEXPORT void
-+ia_dvs_deinit(ia_dvs_state *dvs_state);
-+
-+/*! \brief Set the DVS statistics.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ * \param[in]   statistics      Pointer to generic DVS statistics
-+ * \param[in]   ae_results      Optional. Pointer to AIQ AE results.
-+ * \param[in]   af_results      Optional. Pointer to AIQ AF results.
-+ * \param[in]   sensor_events   Optional. Pointer to sensor events data which contains accelerometer,
-+ *                              gravity and gyroscope events.
-+ * \param[in]   frame_readout_start     Frame readout start time. Optional for image based DVS. Mandatory for gyro based DVS
-+ * \param[in]   frame_readout_end       Frame readout end time. Optional for image based DVS. Mandatory for gyro based DVS
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function receives DVS statistics in generic format.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_statistics(ia_dvs_state *dvs_state,
-+                      const ia_dvs_statistics *statistics,
-+                      const ia_aiq_ae_results *ae_results,
-+                      const ia_aiq_af_results *af_results,
-+                      const ia_aiq_sensor_events *sensor_events,
-+                      const unsigned long long frame_readout_start,
-+                      const unsigned long long frame_readout_end);
-+
-+/*! \brief Execute DVS main process.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ * \param[in]   focus_position  Focus motor position in terms of those used by the sensor module.
-+ *                              Value 0 will use the first LDC grid from the CPF.
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function processes the DVS main functionality. This generates a
-+ * lens distortion configuration and calculates global motion.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_execute(ia_dvs_state *dvs_state,
-+               uint16_t focus_position);
-+
-+/*! \brief allocate the DVS morphing table.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ * \param[out]  morph_table     Pointer to Pointer to morphing table.
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function allocates the memory of dvs morphing table.
-+ * This allocates the struct ia_dvs_morph_table itself, and the members in the structure.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_allocate_morph_table(ia_dvs_state *dvs_state,
-+                            ia_dvs_morph_table **morph_table);
-+
-+/*! \brief Free the DVS morphing table.
-+ *
-+ * \param[in]   morph_table     Pointer to morphing table.
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function frees the memory of dvs morphing table.
-+ * Each allocated member in morph_table, and morph_table itself are freed.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_free_morph_table(ia_dvs_morph_table *morph_table);
-+
-+/*! \brief Get the GDC morphing table.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ * \param[out]  morph_table     Pointer to the GDC morph table
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function calculates GDC morphing table from lens distortion configuration, digital zoom and global motion.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_get_morph_table(ia_dvs_state *dvs_state,
-+                       ia_dvs_morph_table *morph_table);
-+
-+/*! \brief Set non blanking ratio.
-+ *
-+ * \param[in]   dvs_state               dvs_state.
-+ *                                      This is a pointer to a module.
-+ * \param[in]   nonblanking_ratio       non blanking ratio.
-+ *                                      Value 0.0 means no rolling shutter correction.
-+ * \return                              0 for no error, others for error.
-+ *
-+ * This function specifies the rolling shutter correction effect.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_non_blank_ratio(ia_dvs_state *dvs_state,
-+                           float nonblanking_ratio);
-+
-+/*! \brief Set digital zoom magnitude.
-+ *
-+ * \param[in]   dvs_state       dvs state.
-+ *                              This is a pointer to a module.
-+ * \param[in]   magnitude       digital zoom magnitude
-+ * \return                      0 for no error, others for error.
-+ *
-+ * This function specifies the digital zoom magnitude
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_digital_zoom_magnitude(ia_dvs_state *dvs_state,
-+                                  float magnitude);
-+
-+/*!
-+ * \brief Set the distortion configuration.
-+ *
-+ * This function specifies lens distortion correction grid. This will override LDC defined in CPF.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ *                                  This is a pointer to a module.
-+ * \param[in]   distortion_config   Distortion grid configuration.
-+ * \return                          0 for no error, others for error.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_distortion_config(ia_dvs_state *dvs_state,
-+                             const ia_dvs_distortion_config *distortion_config);
-+
-+/*!
-+ * \brief Set digital zoom mode.
-+ *
-+ * This function specifies the digital zoom mode.
-+ *
-+ * In mode ia_dvs_zoom_mode_center ia_dvs_set_digital_zoom_magnitude() is used to control
-+ * digital zoom. Zooming is performed to the center of the image.
-+ *
-+ * In mode ia_dvs_zoom_mode_region ia_dvs_set_digital_zoom_region() is used to control
-+ * zooming position and magnitude.
-+ *
-+ * By default mode ia_dvs_zoom_mode_center is used.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ *                                  This is a pointer to a module.
-+ * \param[in]   zoom_mode           digital zoom mode
-+ * \return                          0 for no error, others for error.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_digital_zoom_mode(ia_dvs_state *dvs_state,
-+                             ia_dvs_zoom_mode zoom_mode);
-+
-+/*!
-+ * \brief Set digital zoom region.
-+ *
-+ * This function specifies the digital zoom region. It requires setting
-+ * the zoom mode to ia_dvs_zoom_mode_region.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ *                                  This is a pointer to a module.
-+ * \param[in]   zoom_region         Rectangle which is zoomed in.
-+ *                                  This region is cropped and scaled
-+ *                                  to the size of the output image.
-+ *                                  Coordinates are given in BQs.
-+ * \return                          0 for no error, others for error.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_digital_zoom_region(ia_dvs_state *dvs_state,
-+                               ia_rectangle *zoom_region);
-+
-+/*!
-+ * \brief Set digital zoom coordinate.
-+ *
-+ * This function specifies the digital zoom coordinate. It requires setting
-+ * the zoom mode to ia_dvs_zoom_mode_coordinate.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ *                                  This is a pointer to a module.
-+ * \param[in]   zoom_coordinate     Coordinate which is zoomed in.
-+ *                                  Coordinate is given in BQs.
-+ * \return                          0 for no error, others for error.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_set_digital_zoom_coordinate(ia_dvs_state *dvs_state,
-+                               ia_coordinate *zoom_coordinate);
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                          Version string.
-+ */
-+LIBEXPORT const char* ia_dvs_get_version(void);
-+
-+/*! \brief Get the homography matrix for image stabilization.
-+*
-+* \param[in]   dvs_state             dvs state.
-+*                                    This is a pointer to a module.
-+* \param[out]  image_transformation  Pointer to the transformation structure where results are saved.
-+* \return                           0 for no error, others for error.
-+*
-+* This function calculates gets a set of homography matrices to perform video stabilization for one frame.
-+*/
-+LIBEXPORT ia_err
-+ia_dvs_get_image_transformation(ia_dvs_state *dvs_state,
-+                                ia_dvs_image_transformation *image_transformation);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_DVS_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
-new file mode 100644
-index 000000000000..f3ec84b8f027
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_DVS_DEPRECATED_H_
-+#define _IA_DVS_DEPRECATED_H_
-+
-+#include "ia_dvs_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/** DVS configuration.
-+ * This structure contains DVS configuration.
-+ */
-+typedef struct
-+{
-+    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
-+    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
-+    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
-+    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
-+    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
-+    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
-+    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
-+    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
-+    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
-+    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
-+    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
-+    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
-+    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
-+                                                     used when validating outgoing morphing table. */
-+    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
-+    int frame_rate;                             /**< Frame rate */
-+    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
-+                                                     invalid memory locations in GDC.
-+
-+                                                     This configuration should come from FW
-+                                                     to inform how large buffer is allocated for GDC processing.
-+                                                     Morphing table coordinates generated by DVS must fit inside
-+                                                     GDC buffer limits. GDC buffer is allocated by FW and
-+                                                     it needs to allocate extra padding for each side of the image data.
-+                                                     This allows DVS to generate morphing table which points are outside of the image area
-+                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
-+                                                     barrel shaped. */
-+    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
-+                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
-+                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
-+                                                     together.
-+                                                     Lens distortion correction is calculated from the full sensor resolution and
-+                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
-+                                                     the GDC input image.*/
-+    bool validate_morph_table;                  /**< False disables morph table validation, true enables. Morph table needs to be validated to
-+                                                     protect FW. Starting from IPU4 validation is performed in PAL. */
-+    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
-+                                                     provide only UV table in floating point format. */
-+    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
-+                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
-+                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
-+                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
-+    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
-+} ia_dvs_configuration;
-+
-+/*! \brief Configure the DVS module.
-+ *
-+ * \param[in]   dvs_state           dvs state.
-+ * \param[in]   config              dvs configuration
-+ * \param[in]   digital_zoom_ratio  digital zoom ratio.
-+ * \return                          0 for no error, others for error.
-+ *
-+ * This function configures the DVS module. This allocates and initializes
-+ * internal data structures. This function must always be called after ia_dvs_init
-+ * and before any other ia_dvs function is called.
-+ */
-+LIBEXPORT ia_err
-+ia_dvs_config(ia_dvs_state *dvs_state,
-+              const ia_dvs_configuration *config,
-+              float digital_zoom_ratio);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_DVS_DEPRECATED_H_ */
-\ No newline at end of file
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
-new file mode 100644
-index 000000000000..7d52f17b85a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
-@@ -0,0 +1,304 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+/*!
-+ * \file ia_dvs_types.h
-+ * \brief Data types and enumerations for Intel DVS library.
-+ */
-+#ifndef _IA_DVS_TYPES_H_
-+#define _IA_DVS_TYPES_H_
-+#include <stdint.h>
-+#include "ia_types.h"
-+
-+#define DVS_HOMOGRAPHY_MATRIX_MAX_COUNT 16
-+
-+typedef struct t_dvs_facade ia_dvs_state;
-+
-+/** DVS Algorithm.
-+ * These settings specify the members of correction axes.
-+ * ia_dvs_algorihm_0_axis is a special mode. In this case, library does not compensate the
-+ * motion, works for digital zoom and distortion correction.
-+ */
-+typedef enum
-+{
-+    ia_dvs_algorithm_0_axis     = 0,                        /**< 0 axis, means video stabilization is turned off */
-+    ia_dvs_algorithm_2_axis     = 2,                        /**< 2 axis - x and y translations */
-+    ia_dvs_algorithm_3_axis     = 3,                        /**< 3 axis - x and y translations and z-scale*/
-+    ia_dvs_algorithm_4_axis     = 4,                        /**< 4 axis */
-+    ia_dvs_algorithm_5_axis     = 5,                        /**< 5 axis - x and y translations and all rotations*/
-+    ia_dvs_algorithm_6_axis     = 6,                        /**< 6 axis - x and y translations, z-scale and all rotations*/
-+    ia_dvs_algorithm_max_axis   = ia_dvs_algorithm_6_axis,  /**< maximum axis */
-+    ia_dvs_algorithm_motion_sensor = 10                     /**< motion sensor based stabilization */
-+} ia_dvs_algorithm_version;
-+
-+/** DVS2 BQ resolution.
-+ * These parameter are BQ resolution configuration.
-+ */
-+typedef struct
-+{
-+    int width_bq;                           /**< width [BQ] */
-+    int height_bq;                          /**< height [BQ] */
-+} ia_dvs_bq_resolution;
-+
-+/** GDC Scan Mode
-+ * These settings specify the gdc scan mode.
-+ */
-+typedef enum
-+{
-+    ia_dvs_gdc_scan_mode_stb    = 0,        /**< STB (slide to the bottom) */
-+    ia_dvs_gdc_scan_mode_str,               /**< STR (slide to the right) */
-+} ia_dvs_gdc_scan_mode;
-+
-+/** GDC Interpolation Method
-+ * These settings specify the gdc interpolation method.
-+ */
-+typedef enum
-+{
-+    ia_dvs_gdc_interpolation_nnd= 0,        /**< NND (nearest neighbor) */
-+    ia_dvs_gdc_interpolation_bli,           /**< BLI (bilinear) */
-+    ia_dvs_gdc_interpolation_bci,           /**< BCI (bicubic) */
-+    ia_dvs_gdc_interpolation_lut,           /**< LUT (look up table) */
-+} ia_dvs_gdc_interpolation;
-+
-+/** GDC Performance Point
-+ * These settings specify the gdc performance point.
-+ */
-+typedef enum
-+{
-+    ia_dvs_gdc_performance_point_1x1= 0,    /**< 1x1 */
-+    ia_dvs_gdc_performance_point_2x1,       /**< 2x1 */
-+    ia_dvs_gdc_performance_point_1x2,       /**< 1x2 */
-+    ia_dvs_gdc_performance_point_2x2,       /**< 2x2 */
-+} ia_dvs_gdc_performance_point;
-+
-+/** GDC hardware configuration
-+ * These parametes are the gdc hardware block configuration.
-+ * dvs library use these parameters just check the gdc constraints,
-+ * do NOT use these parameters for any controls nor calculations.
-+ */
-+typedef struct
-+{
-+    ia_dvs_gdc_scan_mode scan_mode;
-+    ia_dvs_gdc_interpolation interpolation;
-+    ia_dvs_gdc_performance_point performance_point;
-+} ia_dvs_gdc_hw_configuration;
-+
-+/** GDC buffer configuration
-+ *  These parameters indicates the limits of the GDC ISP buffer.
-+ *  DVS needs to limit morphing table coordinates to fit inside GDC
-+ *  ISP buffer.
-+ */
-+typedef struct
-+{
-+    unsigned int x_offset;  /* X offset [BQ] for the first pixel of image data */
-+    unsigned int y_offset;  /* Y offset [BQ] for the first pixel of image data*/
-+    unsigned int width;     /* Total width [BQ] for the buffer */
-+    unsigned int height;    /* Total height [BQ] for the buffer */
-+} ia_dvs_gdc_buffer_config;
-+
-+/** Total cropping parameters
-+ *  These parameters contain sensor and ISP cropping information without any scaling or binning.
-+ *  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
-+ *  This information is used to crop lens distortion grids accordingly.
-+ */
-+typedef struct
-+{
-+    unsigned int horizontal_crop_offset;    /* Read out offset horizontal [BQ] */
-+    unsigned int vertical_crop_offset;      /* Read out offset vertical [BQ] */
-+    unsigned int cropped_width;             /* Width of cropped area without any scaling [BQ] */
-+    unsigned int cropped_height;            /* Height of cropped area without any scaling [BQ] */
-+} ia_dvs_crop_params;
-+
-+
-+
-+
-+
-+/** GDC HW limits which are specific for particluar IPU
-+ * version and need to be taken into account in the
-+ * DVS algorithm side when preparing a correct morphing table
-+ */
-+
-+
-+
-+
-+/** This enum is a list of possible constraints on the DVS morphing
-+ * table which need to be ensured during DVS algorithm execution.
-+ */
-+typedef enum
-+{
-+    ia_dvs_no_constraints = 0,     /**< No additional constraints on the morphing table need to be performed */
-+    ia_dvs_woi_validation,         /**< The morphing table is validated for access violation in FW duirng WOI pixel data fetch;
-+                                        a violation results in no compensation for the current frame */
-+    ia_dvs_max_tetragon_size,      /**< DVS ensures that the morph table tetragons fit inside pre-defined max width and height */
-+} ia_dvs_morph_table_constraints;
-+
-+/** DVS configuration.
-+ * This structure contains DVS configuration.
-+ */
-+typedef struct
-+{
-+    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
-+    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
-+    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
-+    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
-+    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
-+    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
-+    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
-+    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
-+    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
-+    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
-+    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
-+    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
-+    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
-+                                                     used when validating outgoing morphing table. */
-+    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
-+    int frame_rate;                             /**< Frame rate */
-+    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
-+                                                     invalid memory locations in GDC.
-+
-+                                                     This configuration should come from FW
-+                                                     to inform how large buffer is allocated for GDC processing.
-+                                                     Morphing table coordinates generated by DVS must fit inside
-+                                                     GDC buffer limits. GDC buffer is allocated by FW and
-+                                                     it needs to allocate extra padding for each side of the image data.
-+                                                     This allows DVS to generate morphing table which points are outside of the image area
-+                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
-+                                                     barrel shaped. */
-+    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
-+                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
-+                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
-+                                                     together.
-+                                                     Lens distortion correction is calculated from the full sensor resolution and
-+                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
-+                                                     the GDC input image.*/
-+    ia_dvs_morph_table_constraints morph_table_constraints;
-+                                                /**< Constraints defined on the DVS morphing table which need to be taken into account during
-+                                                     DVS algorithm execution for smoother video perception */
-+    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
-+                                                     provide only UV table in floating point format. */
-+    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
-+                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
-+                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
-+                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
-+    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
-+} ia_dvs_configuration_v1;
-+
-+/** Distortion grid configuration.
-+ * Structure defines lens distortion grid.
-+ */
-+typedef struct
-+{
-+    int16_t ldc_col_start;      /*!< Table X offset in pixels from left corner of the sensor maximum visible area.
-+                                     e.g. If ldc_col_start=ldc_block_width*(-1)
-+                                     then ldc table offset is is one block left compared to the maximum visible sensor area. */
-+    int16_t ldc_row_start;      /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area.
-+                                     e.g. If ldc_row_start=ldc_block_height*(-1)
-+                                     then ldc table offset is is one block up compared to the maximum visible sensor area.  */
-+    int16_t ldc_grid_width;     /*!< Indicates number of grid vertices on the horizontal axis. */
-+    int16_t ldc_grid_height;    /*!< Indicates number of grid vertices on the vertical axis. */
-+    int16_t ldc_block_width;    /*!< Width of the original grid cell (without correction). */
-+    int16_t ldc_block_height;   /*!< Height of the original grid cell (without correction). */
-+    float *x_deltas;            /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
-+                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
-+    float *y_deltas;            /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
-+                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
-+} ia_dvs_distortion_config;
-+
-+/** DVS Motion vector structure.
-+ * This structure contains definition for one local motion vector.
-+ */
-+typedef struct
-+{
-+    float x_start;          /* Normalized X start position */
-+    float y_start;          /* Normalized Y start position */
-+    float x_end;            /* Normalized X end position */
-+    float y_end;            /* Normalized y end position */
-+    float weight;           /* Weight of the motion vector [0.0, 1.0]. Describes accuracy of the motion vector */
-+} ia_dvs_motion_vector;
-+
-+/** DVS Motion vectors.
-+ * This structure contains DVS statistics.
-+ */
-+typedef struct
-+{
-+    unsigned int vector_count;              /* Number of motion vectors */
-+    ia_dvs_motion_vector *motion_vectors;   /* Table of local motion vectors. Contains [vector_count] values. */
-+} ia_dvs_statistics;
-+
-+/** DVS morphing table structure.
-+ * This structure contains morphing table which includes
-+ * lens distortion correction, digital zoom, rolling shutter correction and video stabilization.
-+ */
-+typedef struct
-+{
-+    uint32_t width_y;
-+    uint32_t height_y;
-+    uint32_t width_uv;
-+    uint32_t height_uv;
-+    uint32_t *xcoords_y;
-+    uint32_t *ycoords_y;
-+    uint32_t *xcoords_uv;
-+    uint32_t *ycoords_uv;
-+    bool morph_table_changed;
-+    float *xcoords_uv_float; /* uv x-coordinates in float format */
-+    float *ycoords_uv_float; /* uv y-coordinates in float format */
-+    bool disable_gdc;        /* Info flag for GDC to indicate input resolution = output resolution and no warping is done. */
-+} ia_dvs_morph_table;
-+
-+/** Digital zoom mode
-+ * These settings specify digital zoom mode.
-+ */
-+typedef enum {
-+        ia_dvs_zoom_mode_center = 0,
-+        ia_dvs_zoom_mode_region,
-+        ia_dvs_zoom_mode_coordinate
-+} ia_dvs_zoom_mode;
-+
-+/** DVS global translation parameters.
-+ * This structure contains the frame-to-frame translations along x and y axes
-+ * and also a coefficient for scene reliability in the range [0, 1] with 1 being
-+ * totally reliable estimate and 0 being totally unreliable
-+ */
-+typedef struct
-+{
-+    uint32_t plane_translation_x;
-+    uint32_t plane_translation_y;
-+    float reliability_coefficient;
-+} ia_dvs_global_translation;
-+
-+
-+typedef struct
-+{
-+    int32_t start_row;             /* Vertical offset in lines where matrix is applied.
-+                                      Between two offsets corresponding matrices are linearly interpolated
-+                                      element wise.*/
-+    float matrix[3][3];            /* Defines one 3x3 homography matrix which is ordered row wise. */
-+} ia_dvs_homography_matrix;
-+
-+/** Image transformation parameters.
-+* This structure defines image transformation with a list of 3x3 homography matrices.
-+* Maximum number of homography matrices is 16 and for each matrix start offset
-+* should be defined.
-+*/
-+typedef struct
-+{
-+    int32_t num_homography_matrices;                                     /* Number of homography matrices */
-+    ia_dvs_homography_matrix matrices[DVS_HOMOGRAPHY_MATRIX_MAX_COUNT];  /* Homography matrices for image
-+                                                                            transformation. Can be used e.g.
-+                                                                            for image alignment or
-+                                                                            video stabilization. */
-+} ia_dvs_image_transformation;
-+
-+#endif /* _IA_DVS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
-new file mode 100644
-index 000000000000..1d854d1af4a9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
-@@ -0,0 +1,92 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_emd_decoder.h
-+ * \brief Definitions of functions in Embedded Data decoder.
-+*/
-+
-+#ifndef _IA_EMD_DECODER_H_
-+#define _IA_EMD_DECODER_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_emd_types.h"
-+#include "ia_types.h"
-+#include "ia_log.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#ifdef LOG_EMD
-+#define IA_EMD_LOG(fmt, ...) IA_LOG(ia_log_debug, "IAEMD: " fmt, ## __VA_ARGS__)
-+#define IA_EMD_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAEMD: " fmt, ## __VA_ARGS__)
-+#define IA_EMD_LOG_INFO(fmt, ...) IA_LOG(ia_log_info, "IAEMD: " fmt, ## __VA_ARGS__)
-+#else
-+#define IA_EMD_LOG(...) ((void)0)
-+#define IA_EMD_LOG_ERROR(...) ((void)0)
-+#define IA_EMD_LOG_INFO(...) ((void)0)
-+#endif
-+
-+
-+/*!
-+ * \brief Creates Embedded Data Decoder.
-+ *
-+ * \param[in] ia_cmc                        Mandatory.\n
-+ *                                          Parsed camera module characterization structure. Internal copy of the structure will be taken.
-+ * \return                                  Pointer to Embedded Data Decoder handle.
-+ */
-+LIBEXPORT ia_emd_decoder_t *
-+ia_emd_decoder_init(
-+    const ia_cmc_t *ia_cmc);
-+
-+
-+/*!
-+ * \brief Deletes Sensor Data Decoder.
-+ *
-+ * \param[in] emd_decoder                   Mandatory. \n
-+ *                                          Pointer to decoder handle.
-+ * \return                                  None.
-+ */
-+LIBEXPORT void
-+ia_emd_decoder_deinit(ia_emd_decoder_t *emd_decoder);
-+
-+
-+/*!
-+ * \brief Runs Sensor Data Decoder.
-+ *
-+ * \param[in] emd_bin                       Mandatory. \n
-+ *                                          Pointer to sensor embedded data binary blob.
-+ * \param[in] emd_mode                      Mandatory. \n
-+ *                                          Pointer to sensor embedded data run-time configuration.
-+ * \param[in] sensor_descriptor             Mandatory. \n
-+ *                                          Pointer to sensor specific descriptor.
-+ * \param[in/out] emd_decoder               Mandatory. \n
-+                                            Pointer to decoder handle. Contains decoded exposure data as well.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_emd_decoder_run(
-+    const ia_binary_data *emd_bin,
-+    const ia_emd_mode_t *emd_mode,
-+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
-+    ia_emd_decoder_t *emd_decoder);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_EMD_DECODER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
-new file mode 100644
-index 000000000000..7d9eb03cf2e4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
-@@ -0,0 +1,194 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_emd_types.h
-+ * \brief Enumerations, structures and definitions used in the Embedded Data decoder.
-+*/
-+
-+#ifndef _EMD_TYPES_H_
-+#define _EMD_TYPES_H_
-+
-+#include <stdint.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ *  Revision of Sensor Data Decoder library, format 0xYYMMDDVV, where:
-+ * - YY: year,
-+ * - MM: month,
-+ * - DD: day,
-+ * - VV: version ('01': ver 0.1,'11': ver 1.1 etc.)
-+ */
-+#define IA_SENSOR_DATA_DECODER_REVISION         0x15080711
-+
-+#define MAX_NUMBER_OF_BLOCK_IDS                 0xF00
-+
-+/* CMC Comment */
-+#define AIQB_EMD_RECORD_1_ID                    1
-+#define AIQB_EMD_RECORD_1_VERSION               100
-+
-+/* CMC Embedded Data */
-+#define AIQB_EMD_RECORD_21_ID                   21
-+#define AIQB_EMD_RECORD_21_VERSION              100
-+#define AIQB_EMD_RECORD_21_VERSION_101          101
-+
-+
-+#define SIZEOF_CONFIG_DATA_BLOCK_T              16         /*!< Size of ia_emd_config_block_t structure in bytes. */
-+
-+/*!
-+ * \brief Elementary embedded data block IDs.
-+ */
-+typedef enum
-+{
-+    /* Parameters in sensor units */
-+    fine_int_time_sensor_units = 0,                 /*!<  0: Fine integration time in sensor units. */
-+    coarse_int_time_sensor_units,                   /*!<  1: Coarse integration time in sensor units. */
-+    a_gain_global_sensor_units,                     /*!<  2: Analog gain global in sensor units. */
-+    d_gain_global_sensor_units,                     /*!<  3: Digital gain global in sensor units. */
-+    d_gain_R_sensor_units,                          /*!<  4: Digital gain R in sensor units. */
-+    d_gain_GR_sensor_units,                         /*!<  5: Digital gain GR in sensor units. */
-+    d_gain_GB_sensor_units,                         /*!<  6: Digital gain GB in sensor units. */
-+    d_gain_B_sensor_units,                          /*!<  7: Digital gain B in sensor units. */
-+
-+    /* Parameters in generic units */
-+    fine_int_time_generic_units,                    /*!<  8: Fine integration time in generic_units. */
-+    coarse_int_time_generic_units,                  /*!<  9: Coarse integration time in generic_units. */
-+    a_gain_global_generic_units,                    /*!< 10: Analog gain global in generic_units. */
-+    d_gain_global_generic_units,                    /*!< 11: Digital gain global in generic_units. */
-+    d_gain_R_generic_units,                         /*!< 12: Digital gain R in generic_units. */
-+    d_gain_GR_generic_units,                        /*!< 13: Digital gain GR in generic_units. */
-+    d_gain_GB_generic_units,                        /*!< 14: Digital gain GB in generic_units. */
-+    d_gain_B_generic_units,                         /*!< 15: Digital gain GB in generic_units. */
-+
-+    /* Additional parameters */
-+    analog_gain_apex_format,                        /*!< 16: Analog gain in APEX format. */
-+    digital_gain_apex_format,                       /*!< 17: Digital gain in APEX format. */
-+    total_gain_apex_format,                         /*!< 18: Total gain in APEX format. */
-+    exposure_time_us,                               /*!< 19: Exposure time in us. */
-+    iso_speed,                                      /*!< 20: ISO speed value. */
-+    f_number_apex,                                  /*!< 21: F-number in APEX format. */
-+    face_count,                                     /*!< 22: Number of faces recognized in the image. */
-+    face_largest_index,                             /*!< 23: Index of the largest face in a face array. */
-+    face_top_left_corner_x,                         /*!< 24: Top-left corner of face region, X coordinates of faces recognized in the image. */
-+    face_top_left_corner_y,                         /*!< 25: Top-left corner of face region, Y coordinates of faces recognized in the image. */
-+    face_bottom_right_x,                            /*!< 26: Bottom-right corner of face region, X coordinates of faces recognized in the image. */
-+    face_bottom_right_y,                            /*!< 27: Bottom-right corner of face region, Y coordinates of faces recognized in the image. */
-+
-+    /* Misc. parameters */
-+    frame_length,                                   /*!< 28: Total line number per one frame. */
-+    line_length,                                    /*!< 29: Total pixel number per one line. */
-+    frame_counter,                                  /*!< 30: Frame counter. */
-+    x_output_size,                                  /*!< 31: Horizontal output width. */
-+    y_output_size,                                  /*!< 32: Vertical output height. */
-+
-+    /* Keep it as last one */
-+    num_of_embedded_data_block_ids                  /*!< Number of Embedded Data block IDs. */
-+} ia_emd_block_id_t;
-+
-+
-+/*!
-+ * \brief Elementary Embedded Data block.
-+ * Each block describes the content of a single elementary data unit, which could be provided from different
-+ * sources, e.g.:
-+ * - RAW data embedded lines;
-+ * - External ISP embedded data block;
-+ * - Any other type of sources.
-+ */
-+typedef struct
-+{
-+    uint32_t offset;                                /*!< Offset from beginning of data source blob in bytes. */
-+    uint16_t total_blocks;                          /*!< Total number of Elementary Data blocks in a value. */
-+    uint16_t block_number;                          /*!< Number of the current block in a series. */
-+    uint8_t  data_src;                              /*!< Value from emd_source_t enumeration. */
-+    uint8_t  block_id;                              /*!< Value from emd_block_id_t enumeration. */
-+    uint8_t  bit_mask;                              /*!< Bit mask, applyed to the byte (before applying the shift). */
-+    int8_t   byte_shift_value;                      /*!< Shift value (bits) applyed to byte. E.g. -2 is (N >> 2), 3 is (N << 3). */
-+    uint8_t  data_format;                           /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
-+    uint8_t  msb_num;                               /*!< Most significant bit of the block (e.g 11 if [11:8]), if applicable. */
-+    uint8_t  lsb_num;                               /*!< Least significant bit of the block (e.g 8 if [11:8]), if applicable. */
-+    uint8_t  embedded_line;                         /*!< Embedded line #, where data block is located. */
-+} ia_emd_config_block_t;
-+
-+
-+/*!
-+ * \brief Describes a run-time configuration of sensor embedded data.
-+ */
-+typedef struct
-+{
-+    uint32_t exp_id;                                /*!< A unique exposure ID of the frame. */
-+    int32_t stride;                                 /*!< Stride of embedded data lines. */
-+    int32_t height;                                 /*!< Num of lines in sensor emb.data, e.g for imx227 it should '2'. */
-+    int32_t *effective_width;                       /*!< Effective data for each line, e.g for imx227 it should be {160, 62}. */
-+} ia_emd_mode_t;
-+
-+
-+/*!
-+ * \brief Decoded Embedded Data block.
-+ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
-+ */
-+typedef struct
-+{
-+    int64_t data;                                   /*!< Data of the block. */
-+    uint8_t data_src;                               /*!< Value from emd_source_t enumeration. */
-+    uint8_t block_id;                               /*!< Value from emd_block_id_t enumeration. */
-+    uint8_t data_format;                            /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
-+    uint8_t reserved;                               /*!< Reserved. */
-+} ia_emd_decoded_block_t;
-+
-+/*!
-+ * \brief Decoded Embedded Data block.
-+ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
-+ */
-+typedef struct
-+{
-+    uint32_t frame_counter;                         /*!< Frame counter. */
-+    uint16_t x_output_size;                         /*!< Horizontal output width. */
-+    uint16_t y_output_size;                         /*!< Vertical output height. */
-+} ia_emd_misc_parameters_t;
-+
-+/*!
-+ * \brief Decoded Exposure parameters.
-+ */
-+typedef struct
-+{
-+    ia_aiq_exposure_sensor_parameters *sensor_units_p; /*!< Exposure parameters in terms of sensor units. */
-+    ia_aiq_exposure_parameters *generic_units_p;    /*!< Exposure parameters in terms of generic units. */
-+    ia_emd_misc_parameters_t *misc_parameters_p;    /*!< Misc decoded parameters. */
-+} ia_emd_result_t;
-+
-+
-+/*!
-+ * \brief Embedded Data Decoder handle.
-+ */
-+typedef struct
-+{
-+    uint32_t decoder_revision;                      /*!< Version of decoder: 0xMAjor.MInor. */
-+    const ia_cmc_t *ia_cmc_p;                       /*!< Pointer to internal copy of parsed camera module characterization structure. */
-+    uint16_t max_block_ID;                          /*!< Maximum block_id value from decoder_cfg_p. */
-+    uint16_t config_flags;                          /*!< Value from embedded_data_decoder_flags_t enumeration. */
-+    uint16_t *block_id_mapping;                     /*!< Array[max_block_ID + 1] for mapping of block_id to data blocks array index. */
-+    ia_emd_result_t decoded_data;                   /*!< Result of EMD decoding. */
-+    /* ia_emd_decoded_block_t blocks[];*/           /*!< Decoded data blocks array. */
-+} ia_emd_decoder_t;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _EMD_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
-new file mode 100644
-index 000000000000..0d78c5bc81ca
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
-@@ -0,0 +1,153 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_exc.h
-+ * \brief Definitions of exposure parameters conversions between generic and sensor units.
-+*/
-+
-+
-+#ifndef IA_EXC_H_
-+#define IA_EXC_H_
-+
-+#include "ia_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_cmc_types.h"
-+
-+#include "ia_exc_deprecated.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/*!
-+ * \brief Convert exposure time from generic units to sensor units (line & pixel values).
-+ * AEC will use default formula for conversion, if not given
-+ * \param[in]  exposure_range          Structure containing coarse and fine integration sensor register ranges. Can be set to NULL if not available.
-+ * \param[in]  sensor_descriptor       Structure containing coarse and fine integration time limits and step size.
-+ * \param[in]  exposure_time_us        Exposure time to convert.
-+ * \param[out] coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
-+ * \param[out] fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
-+ * \return                             Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_exposure_time_to_sensor_units(
-+    const cmc_exposure_range_t *exposure_range,
-+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
-+    const unsigned int exposure_time_us,
-+    unsigned short *coarse_integration_time,
-+    unsigned short *fine_integration_time);
-+
-+/*!
-+ * \brief Converts gain from generic units to sensor units.
-+ * AEC will use default formulae for conversion, if not given
-+ * Converts gain value to sensor units, limiting the value according to sensor specific limits.
-+ * \param[in]  gain_conversion   Structure containing gain to code mapping information.
-+ * \param[in]  gain              Gain in generic units.
-+ * \param[out] gain_code         Calculated gain code.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_gain_to_sensor_units(
-+    const cmc_gain_conversion_t *gain_conversion,
-+    const float gain,
-+    unsigned short *gain_code);
-+
-+/*!
-+ * \brief Convert exposure time from sensor units to generic units.
-+ * AEC will use default formula for conversion, if not given
-+ * \param[in]  sensor_descriptor       Structure containing pixel clock frequency needed in exposure conversion.
-+ * \param[in]  coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
-+ * \param[in]  fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
-+ * \param[out] exposure_time           Calculated exposure value in microseconds.
-+ * \return                             Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_sensor_units_to_exposure_time(
-+    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
-+    const unsigned short coarse_integration_time,
-+    const unsigned short fine_integration_time,
-+    unsigned int *exposure_time);
-+
-+/*!
-+* \brief Convert gain from sensor units to generic units.
-+* Using the sensor characteristics info, calculate gain from sensor register values.
-+* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
-+* \param[in]  gain_code         Gain code in sensor specific units.
-+* \param[out] gain              Calculated gain.
-+* \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_exc_sensor_units_to_gain(
-+    const cmc_gain_conversion_t *gain_conversion,
-+    const unsigned short gain_code,
-+    float *gain);
-+
-+/*!
-+* \brief Gets gain and code based on current code.
-+* Offset is used to retrieve previous or next gain code pairs from the CMC gain conversion tables.
-+* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
-+* \param[in]  gain_code         Gain code in sensor specific units.
-+* \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
-+* \param[out] indexed_gain_code Gain code matching the offset.
-+* \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_exc_get_gain_code(
-+    const cmc_gain_conversion_t *gain_conversion,
-+    const unsigned short gain_code,
-+    const int gain_code_offset,
-+    unsigned short *indexed_gain_code);
-+
-+/*!
-+ * \brief Converts ISO to gains and codes.
-+ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
-+ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables.
-+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
-+ * \param[in]  iso                      ISO value to be converted into gains.
-+ * \param[out] gains                    Array of calculated gains. -1.0 if not available.
-+ * \param[out] gain_codes               Array of calculated gain codes. -1 if not available.
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_convert_iso_to_multi_gains(
-+    const cmc_multi_gain_conversions_t *multi_gain_conversions,
-+    const cmc_sensitivity_t *sensitivity,
-+    const int iso,
-+    float gains[IA_CMC_GAINS_MAX_NUM],
-+    int gain_codes[IA_CMC_GAINS_MAX_NUM]);
-+
-+/*!
-+ * \brief Converts gain codes to ISO.
-+ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables. Can be NULL, if sensor doesn't support any gains.
-+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
-+ * \param[in]  gain_codes               Array of gain codes. Each element can be -1 if not available.
-+ * \param[out] iso                      Gain codes converted into ISO value. -1 if not available.
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_convert_multi_gain_codes_to_iso(
-+    const cmc_multi_gain_conversions_t *multi_gain_conversions,
-+    const cmc_sensitivity_t *sensitivity,
-+    const int gain_codes[IA_CMC_GAINS_MAX_NUM],
-+    int *iso);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_EXC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
-new file mode 100644
-index 000000000000..1f6472f1eba7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
-@@ -0,0 +1,171 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_exc_deprecated.h
-+ * \brief Definitions of exposure parameters conversions between generic and sensor units (deprecated versions).
-+*/
-+
-+
-+#ifndef IA_EXC_DEPRECATED_H_
-+#define IA_EXC_DEPRECATED_H_
-+
-+#include "ia_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/*!
-+ * \brief Convert analog gain from generic units to sensor units.
-+ * Calculate analog gain code from analog gain, limiting it to the sensor specific values.
-+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
-+ * \param[in]  analog_gain       Analog gain value to convert to sensor unit.
-+ * \param[out] analog_gain_code  Calculated analog gain code.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_analog_gain_to_sensor_units(
-+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
-+    const float analog_gain,
-+    unsigned short *analog_gain_code);
-+
-+/*!
-+ * \brief Converts digital gain from generic units to sensor units.
-+ * AEC will use default formulae for conversion, if not given
-+ * Converts digital gain value to sensor units, limiting the value according to sensor specific limits.
-+ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
-+ * \param[in]  digital_gain      Digital gain in generic units.
-+ * \param[out] digital_gain_code Calculated digital gain code.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_digital_gain_to_sensor_units(
-+    const cmc_parsed_digital_gain_t *gain_conversion,
-+    const float digital_gain,
-+    unsigned short *digital_gain_code);
-+
-+/*!
-+ * \brief Convert analog gain from sensor units to generic units.
-+ * Using the sensor characteristics info, calculate analog gain from sensor register values.
-+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
-+ * \param[in]  gain_code         Analog gain code in sensor specific units.
-+ * \param[out] analog_gain       Calculated analog gain.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_sensor_units_to_analog_gain(
-+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
-+    const unsigned short gain_code,
-+    float *analog_gain);
-+
-+/*!
-+ * \brief Converts digital gain from sensor units to generic units.
-+ * AEC will use default formula for conversion, if not given
-+ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
-+ * \param[in]  gain_code         Digital gain code in sensor specific units.
-+ * \param[out] digital_gain      Calculated digital gain.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_sensor_units_to_digital_gain(
-+    const cmc_parsed_digital_gain_t *gain_conversion,
-+    const unsigned short code,
-+    float *digital_gain);
-+
-+/*!
-+ * \brief Gets analog gain and code based on current code.
-+ * Offset is used to retrieve previous or next analog gain code pairs from the CMC analog gain conversion tables.
-+ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
-+ * \param[in]  gain_code         Analog gain code in sensor specific units.
-+ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
-+ * \param[out] indexed_gain_code Analog gain code matching the offset.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_get_analog_gain_code(
-+    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
-+    const unsigned short gain_code,
-+    const int gain_code_offset,
-+    unsigned short *indexed_gain_code);
-+
-+/*!
-+ * \brief Gets digital gain and code based on current code.
-+ * Offset is used to retrieve previous or next digital gain code pairs from the CMC digital gain conversion tables.
-+ * \param[in]  gain_conversion   Structure containing digital gain to gain code conversion tables.
-+ * \param[in]  gain_code         Digital gain code in sensor specific units.
-+ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
-+ * \param[out] indexed_gain_code Analog gain code matching the offset.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_get_digital_gain_code(
-+    const cmc_parsed_digital_gain_t *gain_conversion,
-+    const unsigned short gain_code,
-+    const int gain_code_offset,
-+    unsigned short *indexed_gain_code);
-+
-+/*!
-+ * \brief Converts ISO to analog gain and digital gain and codes.
-+ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
-+ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables.  Can be NULL, if sensor doesn't support analog gain.
-+ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
-+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
-+ * \param[in]  iso                      ISO value to be converted into gains.
-+ * \param[out] analog_gain              Calculated analog gain.-1.0 if not available.
-+ * \param[out] analog_gain_code         Calculated analog gain code. -1 if not available.
-+ * \param[out] digital_gain             Calculated digital gain. -1.0 if not available.
-+ * \param[out] digital_gain_code        Calculated digital gain code. -1 if not available.
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_convert_iso_to_gains(
-+    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
-+    const cmc_parsed_digital_gain_t *digital_gain_conversion,
-+    const cmc_sensitivity_t *sensitivity,
-+    const int iso,
-+    float *analog_gain,
-+    int *analog_gain_code,
-+    float *digital_gain,
-+    int *digital_gain_code);
-+
-+/*!
-+ * \brief Converts analog gain and digital gain codes to ISO.
-+ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables. Can be NULL, if sensor doesn't support analog gain.
-+ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
-+ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
-+ * \param[in]  analog_gain_code         Analog gain code. -1 if not available.
-+ * \param[in]  digital_gain_code        Digital gain code. -1 if not available.
-+ * \param[out] iso                      Analog and digital gain codes converted into ISO value. -1 if not available.
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_exc_convert_gain_codes_to_iso(
-+    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
-+    const cmc_parsed_digital_gain_t *digital_gain_conversion,
-+    const cmc_sensitivity_t *sensitivity,
-+    const int analog_gain_code,
-+    const int digital_gain_code,
-+    int *iso);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_EXC_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
-new file mode 100644
-index 000000000000..f2cd47572713
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
-@@ -0,0 +1,138 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_intrinsics.h
-+ * \brief Definitions and declarations of intrinsics library.
-+ */
-+
-+#ifndef _IA_INTRINSICS_H_
-+#define _IA_INTRINSICS_H_
-+
-+#include "ia_types.h"
-+#include "ia_isp_bxt_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_intrinsics_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef struct
-+{
-+    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
-+    bool  focus_supported;                          /*!<Is focussing supported*/
-+    bool  dvs_enabled;                              /*!<Is DVS enabled*/
-+} ia_intrinsics_config_params;
-+
-+/*!
-+ * \brief Initialize intrinsics.
-+ * This function must be called before any other function in the library. It allocates memories for all intrinsics
-+ * algorithms based on input parameters given by the user.
-+ *
-+ * \param[in]     ia_cmc            Mandatory. Parsed camera module characterization structure.
-+ *  return                          ia_intrinsics handle. Use the returned handle as input parameter for the consequent intrinsics calls.
-+ */
-+LIBEXPORT ia_intrinsics*
-+ia_intrinsics_init(const ia_cmc_t *ia_cmc);
-+
-+/*!
-+ * \brief Focal length calculation based on AF results.
-+ * Intrinsics lib calculates focal length for each frame.
-+ * \param[in]   intrinsics_ptr      Mandatory.\n
-+ *                                  Intrinsics handle.
-+ * \param[in]   af_results          Mandatory.\n
-+ *                                  AF results from AF algorithm.
-+ * \param[out]  out_focal_length    Mandatory.\n
-+ *                                  Calculated focal_length in x and y coordinates.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_intrinsics_get_focal_length(ia_intrinsics *intrinsics_ptr, ia_aiq_af_results *af_results, float *out_focal_length);
-+
-+/*! \brief Configure the intrinsics lib to calculate the principal point.
-+*
-+* \param[in]   intrinsics_ptr           Mandatory.\n
-+*                                       Intrinsics handle.
-+* \param[in]   config_params            Mandatory.\n
-+*                                       Needed to know the scaling/cropping done in the sensor and isp.
-+* \return                               0 for no error, others for error.
-+*
-+* This function configures the intrinsics lib to provide the needed info to calculate
-+* the principal point. This function must be called everytime the pipe config changes before
-+* calling the API to get the principal point.
-+*/
-+LIBEXPORT ia_err
-+ia_intrinsics_config(ia_intrinsics *intrinsics_ptr,
-+    ia_intrinsics_config_params *config_params);
-+
-+
-+/*! \brief Function to get the principal point x, y coordinates.
-+*
-+* \param[in]   intrinsics_ptr       Mandatory.\n
-+*                                   Intrinsics handle.
-+* \param[out]  out_principal_point  Mandatory.\n
-+*                                   Calculated principal point  x, y coordinates.
-+* \return                           0 for no error, others for error.
-+*
-+* This function returns the principal point based on the sensor params and pipe config given in the config function.
-+* Config function must be called atleast once before calling this function.
-+*/
-+LIBEXPORT ia_err
-+ia_intrinsics_get_principal_point(ia_intrinsics *intrinsics_ptr, float *out_principal_point);
-+
-+/*! \brief Function to get the distortion coefficients.
-+*
-+* \param[in]   intrinsics_ptr               Mandatory.\n
-+*                                           Intrinsics handle.
-+* \param[out]  out_radial_distortion        Mandatory.\n
-+*                                           Calculated radial_distortion coefficients k1, k2, k3.
-+* \param[out]  out_tangential_distortion    Mandatory.\n
-+*                                           Calculated tangential_distortion coefficients p1, p2.
-+* \return                                   0 for no error, others for error.
-+*
-+* This function returns the radial_distortion and tangential_distortion coefficients point based on the cmc info given in the
-+* init function. Cmc is not expected to change after intrinsic lib init.
-+*/
-+LIBEXPORT ia_err
-+ia_intrinsics_get_distortion_coefficients(ia_intrinsics *intrinsics_ptr, float *out_radial_distortion, float *out_tangential_distortion);
-+
-+/*! \brief Function to set zoom factor.
-+*
-+* \param[in]   intrinsics_ptr               Mandatory.\n
-+*                                           Intrinsics handle.
-+* \param[out]  zoom_factor                  Mandatory.\n
-+*                                           Zoom factor to set.
-+*/
-+LIBEXPORT void
-+ia_intrinsics_set_zoom_factor(ia_intrinsics *intrinsics_ptr, float zoom_factor);
-+
-+/*!
-+ * \brief De-initialize intrinsics lib.
-+ * All memory allocated by intrinsics library are freed.
-+ *
-+ */
-+LIBEXPORT void
-+ia_intrinsics_deinit(ia_intrinsics *intrinsics_ptr);
-+
-+
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_INTRINSICS_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
-new file mode 100644
-index 000000000000..1486cc4d0455
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+/*!
-+ * \file ia_intrinsics_types.h
-+ * \brief Data types and enumerations for Intel Intrinsics library.
-+ */
-+#ifndef _IA_INTRINSICS_TYPES_H_
-+#define _IA_INTRINSICS_TYPES_H_
-+#include <stdint.h>
-+#include "ia_types.h"
-+
-+typedef struct ia_intrinsics_t ia_intrinsics;
-+
-+/*!
-+ * \brief ia_intrinsics structure.
-+ */
-+
-+typedef struct ia_intrinsics_t
-+{
-+    float principal_point[2];                       /*!<The current principal point of the camera in x and y coordinates based on the current pipe config*/
-+    float radial_distortion[3];                     /*!<The radial distortion coefficients of the camera based on the current cmc*/
-+    float tangential_distortion[2];                 /*!<The tangential distortion coefficients of the camera based on the current cmc*/
-+    float undistorted_projection_transform[16];     /*!<4x4 warping matrix which can be used to describe the mapping between
-+                                                        3D world points and image pixels like camera intrinsics matrix*/
-+    const ia_cmc_t *ia_cmc;
-+    float zoom_factor;                              /*!<Zoom factor to be used in the calculations*/
-+    bool  focus_supported;                          /*!<Is focussing supported*/
-+    bool  dvs_enabled;                              /*!<Is DVS enabled*/
-+    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
-+} ia_intrinsics_t;
-+
-+/** Total cropping parameters
-+*  These parameters contain sensor and ISP cropping information without any scaling or binning.
-+*  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
-+*  This information is used to crop lens distortion grids accordingly.
-+*/
-+typedef struct
-+{
-+    unsigned int horizontal_crop_offset;    /* Read out offset horizontal */
-+    unsigned int vertical_crop_offset;      /* Read out offset vertical */
-+    unsigned int cropped_width;             /* Width of cropped area without any scaling*/
-+    unsigned int cropped_height;            /* Height of cropped area without any scaling*/
-+} ia_intrinsics_crop_params;
-+
-+#endif /* _IA_INTRINSICS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
-new file mode 100644
-index 000000000000..396bc4246f55
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
-@@ -0,0 +1,916 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_isp_bxt.h
-+ * \brief ia_isp_bxt specific implementation.
-+ *
-+ * \mainpage
-+ * \section main Automatic ISP (AIC) Configuration component for IPU4 (and onwards)
-+ *
-+ * AIC is stateless component, which purpose is to
-+ * - Convert generic results into ISP specific format.
-+ * - Adapt ISP tunings based on run-time changing parameters.
-+ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
-+ *
-+ * AIC consists of following components:
-+ * - \ref gaic
-+ * - \ref pal
-+ *
-+ * AIC API is defined in ia_isp_bxt.h file.
-+ *
-+ * See \ref integration for more detailed information about various integration details.
-+ *
-+ * \page aicparts AIC modules
-+ * \section gaic Generic AIC (GAIC)
-+ *
-+ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
-+ * schemes to calculate ISP parameters between distinct tunings.
-+ *
-+ * \section pal Parameter Abstraction Layer (PAL)
-+ *
-+ * PAL generates ISP parameters to each ISP block based on distinct tuning given to it. Refer to PAL documentation for detailed description for
-+ * configuration and dependencies of each ISP block.
-+ *
-+ * \page integration Integration notes
-+ * \section AIC output buffer state
-+ *
-+ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
-+ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
-+ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
-+ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
-+ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
-+ *
-+ * \section ispdg Digital gain in ISP
-+ *
-+ * Applying DG in ISP is preferable over sensor digital gain in certain cases:
-+ * - ISP may have higher bit depth in the image and retain information that would be lost, if digital gain operation would be done in the sensor.
-+ * - ISP can apply gains after statistics calculation. This allows 3A algorithms to operate on statistics, which would be saturated by digital gain.
-+ *   - Sometimes this is the only way to gain image data further, if higher that maximum WB gains that ISP block supports are required.
-+ *
-+ * There are three ways to implement digital gain operation in a running system (using input parameters for ia_isp_bxt_run function).
-+ * AIC client should make decision how to apply digital gain before and after statistics (or partially both):
-+ * 1. Apply digital gain in WB gains.
-+ *  - Digital gain operation is applied in ISP after statistic collection (preferred)
-+ *  - Applying digital gain after statistics collection reduces saturation of image before statistics calculation giving 3A+ algorithms best possible statistics input.
-+ *  - This can be done only if all digital gain can be applied by WB ISP block.
-+ *  - Route AEC digital gain to ia_aiq_pa_run() in ia_aiq_pa_input_params->color_gains. Further route ia_aiq_pa_results to AIC.
-+ * 2. Apply digital gain in manual_digital_gain.
-+ *  - This is simple from integration point of view.
-+ *  - Digital gain operation is applied before statistics collection (may saturate some image data in early phase of image processing).
-+ *  - Route AEC digital gain directly to manual_digital_gain parameter.
-+ * 3. Apply digital gain partially in WB gains and partially in manual_digital_gain.
-+ *  - Should be considered only if digital gain exceeds maximum gain supported by WB ISP block (see option 1).
-+ *  - Most difficult to integrate. Consider using this option, if image quality is not sufficient by using option 2.
-+ *  - Each ia_aiq_pa_results->color_gains gain is compared against maximum supported gain in the WB ISP block.
-+ *  - If all gains are below maximum supported gain, apply all gains in color_gains.
-+ *   - Example:
-+ *    - Maximum supported gain in WB ISP block is 15.9.
-+ *    - AEC requests digital gain on 4.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
-+ *    - WB gains for all color channels after ia_aiq_pa_run() (including white point gains from AWB results) are all below 15.9
-+ *     -> pass ia_aiq_pa_results to AIC as they are.
-+ *  - If some of the gains are above maximum supported gain, extract smallest amount of common gains from all color channels and set that in manual_digital_gain.
-+ *   - Note for integration: When giving statistics to AIQ, modified ia_aiq_pa_results (where common gain was removed) should be given along with the statistics.
-+ *     Also manual_digital_gain should be given in ia_aiq_ae_results, which indicates how much digital gain was applied in the statistics.
-+ *   - Example:
-+ *    - Maximum supported gain in WB ISP block is 15.9.
-+ *    - AEC requests digital gain on 18.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
-+ *    - Some color channels' WB gains after ia_aiq_pa_run() (including white point gains from AWB results) are all above 15.9
-+ *     -> modify WB gains so that common for all color channels gain is removed from ia_aiq_pa_results->color_gains and given as manual_digital_gain to AIC.
-+ *
-+ * \section performance Power & Perfomance optimizations
-+ *
-+ * \subsection state AIC output buffer state
-+ *
-+ * AIC being stateless component, won't retain anything in history of previous iterations. However, if AIC output buffer is given to AIC (to fill) by the client,
-+ * AIC stores state of ISP parameters in that buffer. Then in the next iteration, if same AIC output buffer (with same exact list of run_kernels) is given back to AIC,
-+ * it can decide to execute or skip calculation of new ISP parameters.
-+ *
-+ * \subsection tunablerunrate Tunable run rate of ISP algorithms
-+ *
-+ * Calculation of some ISP configuration parameters can be heavy and in some cases it is not needed to run some algorithms at every ia_isp_bxt_run iteration.
-+ * AIC supports variable run rate of ISP algorithms via tuning record, which contains list of ISP block UUIDs and their corresponding execution rate in microseconds.
-+ * AIC needs to get correct timestamp in microseconds as input. This timestamp is stored into the AIC output buffer. If same buffer is given back to AIC in the
-+ * next iteration, AIC detects it, compares newly given timestamp against the timestamp of the previous run and decides if calculation of certain ISP parameters
-+ * need to be done.
-+ *
-+*/
-+
-+#ifndef IA_ISP_BXT_H_
-+#define IA_ISP_BXT_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ia_isp_bxt_types.h"
-+#include "ia_isp_bxt_statistics_types.h"
-+#include "ia_isp_types.h"
-+#include "ia_dvs_types.h"
-+#include "ia_ltm_types.h"
-+#include "ia_mkn_types.h"
-+#include "ia_view_types.h"
-+#include "ia_ob.h"
-+#include "ia_isp_bxt_deprecated.h"
-+#include "ia_bcomp_types.h"
-+#include "ia_ccat_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Initialize IA_ISP and its submodules.
-+ * This function must be called before any other function in the library. It allocates memories and parses ISP specific parts from CPFF.
-+ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the
-+ * ISP functions.
-+ *
-+ * \param[in]     aiqb_data          Mandatory although function will not return error, if it not given.\n
-+ *                                   Reads generic AIC records Block from CPFF.
-+ * \param[in]     ia_cmc             Mandatory. Parsed camera module characterization structure. IA_ISP will use structures behind given pointer.
-+ *                                   Structure must be valid throughout whole lifetime of IA_ISP component.
-+ * \param[in]     max_stats_width    Mandatory. Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
-+ *                                   memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
-+ *                                   and AF statistics grid allocations.
-+ * \param[in]     max_stats_height   Mandatory. Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
-+ *                                   memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
-+ *                                   and AF statistics grid allocations.l
-+ *                                   Initialization parameters for statistics conversion.
-+ * \param[in]     max_num_stats_in   Mandatory. The maximum number of input statistics for one frame. Each statistics is related to different exposure.
-+ *                                   Used especially for sensors that support two or more simultaneous exposures (HDR).
-+ */
-+
-+LIBEXPORT ia_isp_bxt*
-+ia_isp_bxt_init(
-+    const ia_binary_data *aiqb_data,
-+    const ia_cmc_t *ia_cmc,
-+    unsigned int max_stats_width,
-+    unsigned int max_stats_height,
-+    unsigned int max_num_stats_in,
-+    ia_mkn *ia_mkn);
-+
-+/*!
-+* \brief Set tuning to an existing AIC instance.
-+* This function can be used to switch tunings on-the-fly in a way that AIC preserves its state and offers smooth transition from one tuning to another.
-+* \param[in]    ia_isp_ptr      Handle to the ia_isp instance. This is the output of _init.
-+* \param[in]    aiqb_data       Binary data containing the tunings.
-+* \param[in]    ia_cmc_ptr      Parsed structure of Camera Module Characterization.
-+* \returns error codes
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_set_tuning(ia_isp_bxt *ia_isp_ptr,
-+     const ia_binary_data *aiqb_data,
-+     const ia_cmc_t *ia_cmc_ptr);
-+
-+LIBEXPORT void
-+ia_isp_bxt_deinit(ia_isp_bxt *ia_isp_bxt);
-+
-+
-+
-+/*!
-+*  \brief IA_ISP_BXT parameter input structure.
-+*/
-+typedef struct ia_isp_bxt_input_params_v2
-+{
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
-+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
-+                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
-+                                                                     ae results and not only needed parameters. */
-+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
-+    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
-+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
-+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
-+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
-+                                                                    associated with the stream_id. */
-+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
-+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
-+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
-+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
-+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
-+                                                                    Value -96 means red become blue, green become red, blue become green */
-+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
-+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
-+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
-+                                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
-+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
-+                                                                    If custom controls are not used, pointer can be set as null.*/
-+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
-+                                                                    Algo API binary format. Binary may contain multiple parameter sets.
-+                                                                    Can be set as null if PAL override functionality is not used. */
-+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
-+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
-+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
-+                                                                    Values less than 1.0 means no additional gain. */
-+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
-+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
-+                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
-+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
-+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
-+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
-+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
-+    ia_isp_bxt_gdc_limits const *gdc_mbr_limits;     /*!< Optional.  GDC MBR limits for WFOV usecases */
-+} ia_isp_bxt_input_params_v2;
-+
-+/*!
-+ * \brief Dump AIC input parameters to binary, for debug purpose only.
-+ *
-+ * \param[in] input_params                  Mandatory. Input parameters for AIC.
-+ * \param[out] output_data                  Mandatory. Output data structure which contains the dump of input_params.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_input_params_dump(
-+    const ia_isp_bxt_input_params_v2 *bxt_input_params,
-+    ia_binary_data *output_data);
-+
-+/*!
-+ * \brief Load AIC input parameters from binary, for debug purpose only.
-+ *
-+ * \param[out] input_params                Mandatory. AIC input parameters loaded from binary.
-+ * \param[in] output_data                  Mandatory. Binary where to load AIC input parameters from.
-+ * \return                                 Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_input_params_load(
-+    ia_isp_bxt_input_params_v2 **input_params,
-+    const ia_binary_data *output_data);
-+
-+/*!
-+ * \brief ISP configuration for the next frame
-+ * Computes ISP parameters from input parameters and CPF values for the next image.
-+ *
-+ * \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
-+ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
-+ * \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
-+ *                                                     Output is PAL output following ISP API format.
-+ * \return                                  Error code.
-+ *
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_run_v2(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_isp_bxt_input_params_v2 *input_params,
-+    ia_binary_data *output_data);
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                         Version string.
-+ */
-+LIBEXPORT const char*
-+ia_isp_bxt_get_version(void);
-+
-+/*!
-+* \brief Get PAL kernel statuses.
-+* Get PAL kernel status list from previous run.
-+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
-+* \param[in] pal_status_list               Mandatory. Pointer's pointer where kernel status list is set.
-+* \param[in] status_list_count             Mandatory. Pointer where number of statuses is written.
-+*
-+*/
-+LIBEXPORT void
-+ia_isp_bxt_get_pal_status_list(ia_isp_bxt *ia_isp_bxt_ptr, ia_isp_pal_status_t **pal_status_list, unsigned int *status_list_count);
-+
-+/*!
-+ * \brief Calculates ISP parameters output buffer size for given program group.
-+ * This function can be used by AIC client to query the size of AIC output buffer for particular program group. Client should allocate the memory and
-+ * pass the size and data it to ia_isp_bxt_run() function in the output_data structure.
-+ *
-+ * \param[in] program_group        Optional. List of kernels associated with this program group. If NULL, AIC calculates output size of all ISP blocks.
-+ * \return                         Size of memory to allocate in order to fit the
-+ */
-+LIBEXPORT int
-+ia_isp_bxt_get_output_size(ia_isp_bxt_program_group *program_group);
-+
-+/*!
-+ * \brief Gets a pointer of HDR YV statistics inside the given binary statistics buffer.
-+ * Note! Output hdr_yv_grid always points inside the given statistics buffer.
-+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
-+ * \param[out] hdr_yv_grid       Mandatory. Pointer's pointer where address of statistics are located. Pointing inside given statistics buffer.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_get_hdr_yv_in_binary(
-+    const ia_binary_data *statistics,
-+    ia_isp_bxt_hdr_yv_grid_t **hdr_yv_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in] ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
-+ * \param[out] out_query_results Mandatory. A pointer to the query results which indicate which statistics are available.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_query(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    ia_isp_bxt_statistics_query_results_t* out_query_results);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in] ia_isp_bxt            Mandatory. ia_isp_bxt instance handle.
-+ * \param[in] statistics            Mandatory. Statistics in ISP specific format.
-+ * \param[in] ir_weight             Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+ * \param[in] ae_results            Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+ *                                  used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in] wb_color_gains        Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
-+ *                                  ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in] bcomp_results         Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
-+ * \param[out] out_rgbs_grid        Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                                  Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                                  if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+ * \param[out] out_ir_grid          Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+ *                                  Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                                  if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_from_binary_v4(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_aiq_color_channels *wb_color_gains,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Converts awb statistics to ccat format (<=IPU6).
-+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
-+* from various ISP formats into CCAT statistics format.
-+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
-+* \param[in] stats_width            Mandatory actual width of the statistics grid.
-+* \param[in] stats_height           Mandatory actual height of the statistics grid.
-+* \param[in] buf_color              Mandatory Average level of colors in hw statistics format.
-+* \param[in] buf_sat                Mandatory Saturation ratio data in hw statistics format.
-+*                                       0: 0% above saturation
-+*                                       255: 100% above saturation
-+* \param[in] color_stride           Mandatory. Stride in bytes for single row of color average data in buf_color.
-+* \param[in] sat_stride             Mandatory. Stride in bytes for single row of saturation data in buf_sat.
-+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
-+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
-+* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
-+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
-+* \return                           Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_statistics_convert_awb_ccat(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    const void *buf_color,
-+    const void *buf_sat,
-+    unsigned int color_stride,
-+    unsigned int sat_stride,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_aiq_color_channels *wb_color_gains,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_rgbs_grid *out_rgbs_grids,
-+    ia_ccat_grid_char *out_ir_grid);
-+
-+/*!
-+* \brief Converts rgbs grid statistics to ccat format (IPU7->).
-+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
-+* from various ISP formats into CCAT statistics format.
-+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
-+* \param[in] stats_width            Mandatory actual width of the statistics grid.
-+* \param[in] stats_height           Mandatory actual height of the statistics grid.
-+* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
-+* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
-+* \param[in] sat_buf                Mandatory Represents Saturation ratio.
-+*                                       0: 0% above saturation
-+*                                       255: 100% above saturation
-+* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
-+* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
-+* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
-+* \param[in] uint8_t_statistics     Mandatory.
-+*                                       true:  uint8_t  average values in buf1 and buf2
-+*                                       false: uint16_t average values in buf1 and buf2
-+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
-+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
-+* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
-+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
-+* \return                           Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_statistics_convert_rgbs_grid_ccat(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    const void *buf1_c0_c1_c2_c3,
-+    const void *buf2_c4_c5_c6_c7,
-+    const void *sat_buf,
-+    int buf1_cid_count,
-+    int buf2_cid_count,
-+    int min_out_bytes_per_cell,
-+    bool uint8_t_statistics,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_aiq_color_channels *wb_color_gains,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_rgbs_grid *out_rgbs_grids,
-+    ia_ccat_grid_char *out_ir_grid);
-+
-+/*!
-+* \brief Converts fr grid statistics to ccat format (all ipus).
-+* ISP generated statistics may not be in the ccat format. Statistics need to be converted
-+* from various ISP formats into CCAT statistics format.
-+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
-+* \param[in] stats_width            Mandatory actual width of the statistics grid.
-+* \param[in] stats_height           Mandatory actual height of the statistics grid.
-+* \param[in] buf1                   Mandatory fr filter data
-+* \param[in] buf2                   Optional fr filter data. Only used with ipu7. <= ipu6 must set this to NULL
-+* \param[in] stride                 Mandatory. Stride in bytes for single row of fr filter data in buf(s).
-+* \param[in] num_stats              Mandatory. Number of fr grids allocated behind the fr_grids pointer.
-+* \param[out] fr_grids              Mandatory. CCAT output fr-grids pointer.
-+* \return                           Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_statistics_convert_af_ccat(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    const void *buf1,
-+    const void *buf2,
-+    unsigned int stride,
-+    unsigned int num_stats,
-+    ia_filter_response_grid *fr_grids);
-+
-+/*!
-+* \brief Converts rgbs grid statistics to IA_AIQ format (IPU7->).
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
-+* \param[in] stats_width            Mandatory actual width of the statistics grid.
-+* \param[in] stats_height           Mandatory actual height of the statistics grid.
-+* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
-+* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
-+* \param[in] sat_buf                Mandatory Represents Saturation ratio.
-+*                                       0: 0% above saturation
-+*                                       255: 100% above saturation
-+* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
-+* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
-+* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
-+* \param[in] output_packed          Mandatory.
-+*                                       true:  uint8_t  average values in buf1 and buf2
-+*                                       false: uint16_t average values in buf1 and buf2
-+* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
-+*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
-+* \param[out] out_rgbs_grid         Mandatory. Pointer's pointer where address of converted statistics are stored.
-+*                                   Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                   if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+*                                   Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                   if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+* \return                           Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_rgbs_grid(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    const void *buf1_c0_c1_c2_c3,
-+    const void *buf2_c4_c5_c6_c7,
-+    const void *sat_buf,
-+    int buf1_cid_count,
-+    int buf2_cid_count,
-+    int min_out_bytes_per_cell,
-+    bool output_packed,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_aiq_color_channels *wb_color_gains,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in] ia_isp_bxt               Mandatory.\n
-+ *                                     ia_isp_bxt instance handle.
-+ * \param[in]  stats_width             Mandatory actual width of the statistics grid.
-+ * \param[in]  stats_height            Mandatory actual height of the statistics grid.
-+ * \param[in]  c0_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c1_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c2_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c3_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c4_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c5_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c6_avg                  Mandatory Average level of c0 color
-+ * \param[in]  c7_avg                  Mandatory Average level of c0 color
-+ * \param[in]  sat_ratio_0             Mandatory Represents Saturation ratio.
-+ *                                               0: 0% above saturation
-+ *                                               255: 100% above saturation
-+ * \param[in]  sat_ratio_1             Mandatory Represents Saturation ratio.
-+ *                                               0: 0% above saturation
-+ *                                               255: 100% above saturation
-+ * \param[in]  sat_ratio_2             Mandatory Represents Saturation ratio.
-+ *                                               0: 0% above saturation
-+ *                                               255: 100% above saturation
-+ * \param[in]  sat_ratio_3             Mandatory Represents Saturation ratio.
-+ *                                               0: 0% above saturation
-+ *                                               255: 100% above saturation
-+ * \param[in]  ir_weight               Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
-+ * \param[in]  ae_results              Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in]  wb_color_gains          Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
-+ *                                     ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in] bcomp_results            Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
-+ *
-+ * \param[out] out_rgbs_grid           Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                                     Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                                     if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+ * \param[out] out_ir_grid             Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+ *                                     Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                                     if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+ *
-+ * \return                             Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_v4(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *c0_avg,
-+    void *c1_avg,
-+    void *c2_avg,
-+    void *c3_avg,
-+    void *c4_avg,
-+    void *c5_avg,
-+    void *c6_avg,
-+    void *c7_avg,
-+    void *sat_ratio_0,
-+    void *sat_ratio_1,
-+    void *sat_ratio_2,
-+    void *sat_ratio_3,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_aiq_color_channels *wb_color_gains,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics (MSB aligned) to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+*
-+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  statistics                         Mandatory. Statistics in ISP specific format. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
-+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
-+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
-+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
-+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
-+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
-+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \return                                        Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v2(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float r_gain,
-+    float g_gain,
-+    float b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
-+
-+/*!
-+* \brief Converts HDR DP RGBS statistics (MSB aligned) to AIQ format.
-+* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
-+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
-+* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
-+* \param[in]  stats_r                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
-+* \param[in]  stats_b                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
-+* \param[in]  stats_g                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
-+* \param[in]  stats_s                            Mandatory.
-+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
-+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
-+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
-+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
-+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
-+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \return                                        Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr_v2(
-+    ia_isp_bxt *ia_isp_bxt_ptr,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *stats_r,
-+    void *stats_g,
-+    void *stats_b,
-+    void *stats_s,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float  r_gain,
-+    float  g_gain,
-+    float  b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in]  ia_isp_bxt     Mandatory ia_isp_bxt instance handle.
-+ * \param[in]  statistics     Mandatory. Statistics in ISP specific format.
-+ *
-+ * \param[out] out_af_grid    Mandatory. This pointer is returned from the initialize function
-+ *                            Pointer's pointer where address of converted statistics are stored.
-+ *                            Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                            if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
-+ * \return                    Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_af_from_binary(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    ia_aiq_af_grid **out_af_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in]  ia_isp_bxt    Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  stats_width   Mandatory. Actual width of the statistics grid.
-+ * \param[in]  stats_height  Mandatory. Actual height of the statistics grid.
-+ * \param[in]  y00_avg       Mandatory. Blocks value of Y00 filter response
-+ * \param[in]  y01_avg       Mandatory. Blocks value of Y01 filter response. IPU7 must have a NULL in this.
-+ * \param[in]  y10_avg       Mandatory. Blocks value of Y10 filter response
-+ * \param[in]  y11_avg       Mandatory. Blocks value of Y11 filter response. IPU7 must have a NULL in this.
-+ *
-+ * \param[out] out_af_grid   Mandatory.\n
-+ *                           Pointer's pointer where address of converted statistics are stored.
-+ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
-+ * \return                   Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_af(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *y00_avg,
-+    void *y01_avg,
-+    void *y10_avg,
-+    void *y11_avg,
-+    ia_aiq_af_grid **out_af_grid);
-+
-+/*!
-+* \brief Converts ISP specific statistics to ccat format.
-+* ISP generated statistics may not be in the format in which ccat expect. Statistics need to be converted
-+* from various ISP formats into ccat statistics format.
-+* \param[in]  c0_histogram      Optional. Block value of c0_histogram. Mapped to rgb_histograms->r. If null, not read.
-+* \param[in]  c1_histogram      Optional. Block value of c1_histogram. Mapped to rgb_histograms->g. If null, not read.
-+* \param[in]  c2_histogram      Optional. Block value of c2_histogram. Mapped to rgb_histograms->b. If null, not read.
-+* \param[in]  c3_histogram      Optional. Block value of c3_histogram. Mapped to y_histogram. If null, not read.
-+* \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
-+* \param[out] rgb_histograms    Optional. Pointer to rgb histograms output. If null, not written to.
-+* \param[out] y_histogram       Optional. Pointer to y histogram output. If null, not written to.
-+* \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_statistics_convert_histogram_ccat(
-+        unsigned int *c0_histogram,
-+        unsigned int *c1_histogram,
-+        unsigned int *c2_histogram,
-+        unsigned int *c3_histogram,
-+        unsigned int num_bins,
-+        ia_ccat_histograms *rgb_histograms,
-+        ia_histogram *y_histogram);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
-+ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_ae_from_binary(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    ia_aiq_histogram **out_aiq_histogram);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  c0_histogram      Mandatory. Block value of c0_histogram
-+ * \param[in]  c1_histogram      Mandatory. Block value of c1_histogram
-+ * \param[in]  c2_histogram      Mandatory. Block value of c2_histogram
-+ * \param[in]  c3_histogram      Mandatory. Block value of c3_histogram
-+ * \param[in]  c4_histogram      Mandatory. Block value of c4_histogram
-+ * \param[in]  c5_histogram      Mandatory. Block value of c5_histogram
-+ * \param[in]  c6_histogram      Mandatory. Block value of c6_histogram
-+ * \param[in]  c7_histogram      Mandatory. Block value of c7_histogram
-+ * \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
-+ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_ae(
-+    ia_isp_bxt *ia_isp_bxt,
-+    void *c0_histogram,
-+    void *c1_histogram,
-+    void *c2_histogram,
-+    void *c3_histogram,
-+    void *c4_histogram,
-+    void *c5_histogram,
-+    void *c6_histogram,
-+    void *c7_histogram,
-+    unsigned int num_bins,
-+    ia_aiq_histogram **out_aiq_histogram);
-+
-+/*!
-+ * \brief This function converts corner based statistics to generic DVS statistics.
-+ *
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ *
-+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  statistics                  Mandatory. Statistics in ISP specific format.
-+ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
-+ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
-+ * \param[out] dvs_statistics              Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                                         Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
-+ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
-+ * \return                                 Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_dvs_from_binary(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    unsigned int dvs_statistics_input_width,
-+    unsigned int dvs_statistics_input_height,
-+    ia_dvs_statistics **dvs_statistics);
-+
-+/*!
-+ * \brief This function converts corner based statistics to generic DVS statistics.
-+ *
-+ * ISP generated statistics may not be in the format in which DVS algorithms expect. Statistics need to be converted
-+ * from various ISP formats into DVS statistics format.
-+ *
-+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  bxt_dvs_statistics          Mandatory. Binary data which contains pointer to BXT specific DVS statistics structure.
-+ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
-+ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
-+ * \param[out] dvs_statistics              Mandatory. Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
-+ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
-+ * \return                                 Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_dvs(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *bxt_dvs_statistics,
-+    unsigned int dvs_statistics_input_width,
-+    unsigned int dvs_statistics_input_height,
-+    ia_dvs_statistics **dvs_statistics);
-+
-+/*!
-+ * \brief Read parameters, interpolated by GAIC, of requested ISP block.
-+ * This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, of a target ISP block.
-+ *
-+ * \param [in]  ia_isp_bxt         Mandatory.  ia_isp_bxt instance handle.
-+ * \param [in]  target_id          Mandatory.  uuid of queried ISP block.
-+ * \param [out] target_data_ptr    Mandatory.  a pointer of a pointer to data buffer that will have read parameters.
-+ * \param [out] output_size_ptr    Mandatory.  a size of all parameters. 0 if a target record does not exist.
-+ *
-+ * \return                         Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_get_interpolated_parameters(
-+    const ia_isp_bxt *ia_isp_bxt_ptr,
-+    const unsigned int target_id,
-+    char **target_data_ptr,
-+    size_t *output_size_ptr);
-+
-+/*!
-+* \brief Get Algo API values interpolated by GAIC of all the ISP blocks.
-+* This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, for all the ISP blocks.
-+*
-+* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
-+* \param [out] output_data Mandatory. Effective Algorithm API parameters binary data.
-+* \return Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_get_all_interpolated_parameters(
-+const ia_isp_bxt *ia_isp_bxt_ptr,
-+ia_binary_data* output_data);
-+
-+/*!
-+* \brief Get Direct Results.
-+* This function queries currently effective Direct Results.
-+*
-+* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
-+* \param [out] output_data Mandatory. Effective Direct Results data.
-+* \return Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_get_direct_results(
-+const ia_isp_bxt *ia_isp_bxt_ptr,
-+ia_binary_data* output_data);
-+
-+/*!
-+ * \brief Converts BXT ISP PAF statistics to IA_AIQ format.
-+ *
-+ * ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into IA_AIQ statistics format.
-+ *
-+ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
-+ * \param[in]  bxt_paf_statistics          Mandatory. Binary data which contains pointer to BXT specific PAF statistics structure.
-+ * \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
-+ * \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
-+ * \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
-+ * \return                                 Error code.
-+ */
-+ia_err ia_isp_bxt_statistics_convert_paf_from_binary(
-+        ia_isp_bxt *ia_isp_bxt,
-+        const ia_binary_data *bxt_paf_statistics,
-+        unsigned int paf_statistics_input_width,
-+        unsigned int paf_statistics_input_height,
-+        ia_aiq_depth_grid **depth_statistics);
-+
-+/*!
-+* \brief Converts uint16_t PAF statistics to IA_AIQ format.
-+*
-+* ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
-+* from the ISP format into IA_AIQ statistics format.
-+*
-+* \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  paf_statistics_data         Mandatory. uint16_t PAF data handle.
-+* \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
-+* \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
-+* \param[in]  num_phase_shifts            Mandatory. Number of phase shifts in the paf_statistics_data
-+* \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
-+* \return                                 Error code.
-+*/
-+ia_err ia_isp_bxt_statistics_convert_paf(
-+    ia_isp_bxt *ia_isp_bxt,
-+    uint16_t *paf_statistics_data,
-+    unsigned int paf_statistics_input_width,
-+    unsigned int paf_statistics_input_height,
-+    int num_phase_shifts,
-+    ia_aiq_depth_grid **depth_statistics);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_ISP_BXT_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
-new file mode 100644
-index 000000000000..9197eab0978a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
-@@ -0,0 +1,641 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_isp_bxt_deprecated.h
-+ * \brief ia_isp_bxt specific implementation.
-+*/
-+
-+#ifndef IA_ISP_BXT_DEPRECATED_H_
-+#define IA_ISP_BXT_DEPRECATED_H_
-+
-+#include "ia_aiq_types.h"
-+#include "ia_types.h"
-+#include "ia_isp_bxt_types.h"
-+#include "ia_bcomp_types.h"
-+#include "ia_aiq_deprecated.h"
-+#include "ia_cmc_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+*  HDR exposure info which provides information about the thresholds and exposure ratios.
-+*
-+*  Exposure 0: L[0]|---------------|H[0]
-+*         R[0] <--->
-+*  Exposure 1:      L[1]|----------------------|H[1]
-+*              R[1] <--->
-+*  Exposure 2:           L[2]|-----------------------------|H[2]
-+*  ...
-+*                 R[N-2] <--->
-+*  Exposure N:                L[N-1]|-----------------------------------|H[N-1]
-+*
-+*  N = number of exposures
-+*  L[n] = lowest intensity captured by n:th exposure (ia_isp_stat_split_thresh::low)
-+*  H[n] = highest intensity captured by n:th exposure (ia_isp_stat_split_thresh::high)
-+*  R[n] = exposure ratio between n:th and the longest exposure
-+*
-+*  Number of thresholds equals N, but number of exposure ratios equals N-1.
-+*/
-+typedef struct
-+{
-+    unsigned int num_exposures;                             /*!< Number of exposures. */
-+    ia_isp_stat_split_thresh thresholds[IA_AIQ_MAX_NUM_EXPOSURES]; /*!< Lowest and highest intensity values in the stitched data for each exposure [0, num_exposures-1]. */
-+    float exposure_ratios[IA_AIQ_MAX_NUM_EXPOSURES - 1];    /*!< Exposure ratios for each exposure pair (between n:th and the longest exposure) [0, num_exposures-2]. */
-+    float hdr_gain;                                         /*!< Scaling factor for normalizing pixel data to the maximum bit depth. */
-+} ia_isp_hdr_exposure_info_t;
-+
-+
-+/*!
-+*  \brief IA_ISP_BXT parameter input structure.
-+*/
-+typedef struct
-+{
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
-+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
-+                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
-+                                                     ae results and not only needed parameters. */
-+    ia_aiq_pa_results *pa_results;                   /*!< Mandatory. Parameter adaptor results from AIQ. */
-+    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
-+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
-+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
-+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
-+                                                     associated with the stream_id. */
-+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
-+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
-+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
-+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
-+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
-+                                                     Value -96 means red become blue, green become red, blue become green */
-+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
-+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
-+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
-+                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
-+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
-+                                                     If custom controls are not used, pointer can be set as null.*/
-+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
-+                                                     Algo API binary format. Binary may contain multiple parameter sets.
-+                                                     Can be set as null if PAL override functionality is not used. */
-+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
-+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
-+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
-+                                                     Values less than 1.0 means no additional gain. */
-+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
-+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
-+                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
-+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
-+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
-+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
-+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
-+} ia_isp_bxt_input_params;
-+
-+/*!
-+*  \brief IA_ISP_BXT parameter input structure.
-+*/
-+typedef struct
-+{
-+    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
-+    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
-+    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
-+    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
-+                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
-+                                                     ae results and not only needed parameters. */
-+    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
-+    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
-+    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
-+    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
-+    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
-+                                                     associated with the stream_id. */
-+    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
-+    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
-+    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
-+    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
-+    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
-+                                                     Value -96 means red become blue, green become red, blue become green */
-+    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
-+    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
-+    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
-+                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
-+    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
-+                                                     If custom controls are not used, pointer can be set as null.*/
-+    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
-+                                                     Algo API binary format. Binary may contain multiple parameter sets.
-+                                                     Can be set as null if PAL override functionality is not used. */
-+    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
-+    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
-+    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
-+                                                     Values less than 1.0 means no additional gain. */
-+    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
-+    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
-+                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
-+    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
-+    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
-+    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
-+    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
-+} ia_isp_bxt_input_params_v1;
-+
-+/*!
-+* \brief ISP configuration for the next frame
-+* Computes ISP parameters from input parameters and CPF values for the next image.
-+*
-+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
-+* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
-+* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
-+*                                                     Output is PAL output following ISP API format.
-+* \return                                  Error code.
-+*
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_run(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_isp_bxt_input_params *input_params,
-+    ia_binary_data *output_data);
-+
-+/*!
-+* \brief ISP configuration for the next frame
-+* Computes ISP parameters from input parameters and CPF values for the next image.
-+*
-+* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
-+* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
-+* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
-+*                                                     Output is PAL output following ISP API format.
-+* \return                                  Error code.
-+*
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_run_v1(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_isp_bxt_input_params_v1 *input_params,
-+    ia_binary_data *output_data);
-+
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_from_binary(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    ia_aiq_rgbs_grid **out_rgbs_grid);
-+
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *c0_avg,
-+    void *c1_avg,
-+    void *c2_avg,
-+    void *c3_avg,
-+    void *c4_avg,
-+    void *c5_avg,
-+    void *c6_avg,
-+    void *c7_avg,
-+    void *sat_ratio_0,
-+    void *sat_ratio_1,
-+    void *sat_ratio_2,
-+    void *sat_ratio_3,
-+    ia_aiq_rgbs_grid **out_rgbs_grid);
-+
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr_from_binary(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_isp_stat_split_thresh *thresholds,
-+    int num_thresholds,
-+    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float r_gain,
-+    float g_gain,
-+    float b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid);
-+
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr(
-+    ia_isp_bxt *ia_isp_bxt_ptr,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *stats_r,
-+    void *stats_g,
-+    void *stats_b,
-+    void *stats_s,
-+    const ia_isp_stat_split_thresh *thresholds,
-+    int num_thresholds,
-+    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float  r_gain,
-+    float  g_gain,
-+    float  b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+*
-+* \param[in] ia_isp_bxt                          Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  statistics                         Mandatory. Statistics in ISP specific format.
-+* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
-+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
-+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
-+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
-+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
-+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
-+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \return                                        Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v1(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
-+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float r_gain,
-+    float g_gain,
-+    float b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
-+
-+/*!
-+* \brief Converts HDR DP RGBS statistics to AIQ format.
-+* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
-+* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
-+* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
-+* \param[in]  stats_r                            Mandatory.
-+* \param[in]  stats_b                            Mandatory.
-+* \param[in]  stats_g                            Mandatory.
-+* \param[in]  stats_s                            Mandatory.
-+* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
-+* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
-+* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
-+* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
-+* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
-+* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
-+* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
-+*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \return                                        Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_hdr_v1(
-+    ia_isp_bxt *ia_isp_bxt_ptr,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *stats_r,
-+    void *stats_g,
-+    void *stats_b,
-+    void *stats_s,
-+    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
-+    const ia_isp_bxt_hdr_compression_t *hdr_compression,
-+    unsigned int stats_rgbs_hdr_block_pixel_width,
-+    unsigned int stats_rgbs_hdr_block_pixel_height,
-+    float  r_gain,
-+    float  g_gain,
-+    float  b_gain,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
-+
-+/*!
-+*  Calculates additional HDR exposure information based on the AE results.
-+*
-+*  \param [in]  ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
-+*  \param [in]  ae_results         Mandatory. AE results structure containing the used exposures.
-+*  \param [in]  hdr_bit_depth      Mandatory. Maximum bit depth of the HDR data.
-+*  \param [out] hdr_exposure_info  Mandatory. Calculated additional HDR exposure information.
-+*
-+*  \return                         Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_calculate_hdr_exposure_info(
-+ia_isp_bxt *ia_isp_bxt,
-+const ia_aiq_ae_results *ae_results,
-+unsigned int hdr_bit_depth,
-+ia_isp_hdr_exposure_info_t *hdr_exposure_info);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+* \param[in] ia_isp_bxt     Mandatory.\n
-+*                           ia_isp_bxt instance handle.
-+* \param[in]  stats_width   Mandatory actual width of the statistics grid.
-+* \param[in]  stats_height  Mandatory actual height of the statistics grid.
-+* \param[in]  c0_avg        Mandatory Average level of c0 color
-+* \param[in]  c1_avg        Mandatory Average level of c0 color
-+* \param[in]  c2_avg        Mandatory Average level of c0 color
-+* \param[in]  c3_avg        Mandatory Average level of c0 color
-+* \param[in]  c4_avg        Mandatory Average level of c0 color
-+* \param[in]  c5_avg        Mandatory Average level of c0 color
-+* \param[in]  c6_avg        Mandatory Average level of c0 color
-+* \param[in]  c7_avg        Mandatory Average level of c0 color
-+* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
-+*
-+* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
-+*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+*
-+* \return                   Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_v1(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *c0_avg,
-+    void *c1_avg,
-+    void *c2_avg,
-+    void *c3_avg,
-+    void *c4_avg,
-+    void *c5_avg,
-+    void *c6_avg,
-+    void *c7_avg,
-+    void *sat_ratio_0,
-+    void *sat_ratio_1,
-+    void *sat_ratio_2,
-+    void *sat_ratio_3,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+* \param[in] ia_isp_bxt     Mandatory.\n
-+*                           ia_isp_bxt instance handle.
-+* \param[in]  stats_width   Mandatory actual width of the statistics grid.
-+* \param[in]  stats_height  Mandatory actual height of the statistics grid.
-+* \param[in]  c0_avg        Mandatory Average level of c0 color
-+* \param[in]  c1_avg        Mandatory Average level of c0 color
-+* \param[in]  c2_avg        Mandatory Average level of c0 color
-+* \param[in]  c3_avg        Mandatory Average level of c0 color
-+* \param[in]  c4_avg        Mandatory Average level of c0 color
-+* \param[in]  c5_avg        Mandatory Average level of c0 color
-+* \param[in]  c6_avg        Mandatory Average level of c0 color
-+* \param[in]  c7_avg        Mandatory Average level of c0 color
-+* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
-+*                                     0: 0% above saturation
-+*                                     255: 100% above saturation
-+* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
-+* \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+*                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+*
-+* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
-+*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+*
-+* \return                   Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_v2(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *c0_avg,
-+    void *c1_avg,
-+    void *c2_avg,
-+    void *c3_avg,
-+    void *c4_avg,
-+    void *c5_avg,
-+    void *c6_avg,
-+    void *c7_avg,
-+    void *sat_ratio_0,
-+    void *sat_ratio_1,
-+    void *sat_ratio_2,
-+    void *sat_ratio_3,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in] ia_isp_bxt     Mandatory.\n
-+ *                           ia_isp_bxt instance handle.
-+ * \param[in]  stats_width   Mandatory actual width of the statistics grid.
-+ * \param[in]  stats_height  Mandatory actual height of the statistics grid.
-+ * \param[in]  c0_avg        Mandatory Average level of c0 color
-+ * \param[in]  c1_avg        Mandatory Average level of c0 color
-+ * \param[in]  c2_avg        Mandatory Average level of c0 color
-+ * \param[in]  c3_avg        Mandatory Average level of c0 color
-+ * \param[in]  c4_avg        Mandatory Average level of c0 color
-+ * \param[in]  c5_avg        Mandatory Average level of c0 color
-+ * \param[in]  c6_avg        Mandatory Average level of c0 color
-+ * \param[in]  c7_avg        Mandatory Average level of c0 color
-+ * \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
-+ *                                     0: 0% above saturation
-+ *                                     255: 100% above saturation
-+ * \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
-+ *                                     0: 0% above saturation
-+ *                                     255: 100% above saturation
-+ * \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
-+ *                                     0: 0% above saturation
-+ *                                     255: 100% above saturation
-+ * \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
-+ *                                     0: 0% above saturation
-+ *                                     255: 100% above saturation
-+ * \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
-+ * \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in] bcomp_results  Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
-+ *
-+ * \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+ * \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+ *                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+ *
-+ * \return                   Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_v3(
-+    ia_isp_bxt *ia_isp_bxt,
-+    unsigned int stats_width,
-+    unsigned int stats_height,
-+    void *c0_avg,
-+    void *c1_avg,
-+    void *c2_avg,
-+    void *c3_avg,
-+    void *c4_avg,
-+    void *c5_avg,
-+    void *c6_avg,
-+    void *c7_avg,
-+    void *sat_ratio_0,
-+    void *sat_ratio_1,
-+    void *sat_ratio_2,
-+    void *sat_ratio_3,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
-+* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
-+*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+* \return                      Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_from_binary_v1(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+* from various ISP formats into AIQ statistics format.
-+* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
-+* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
-+* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+* \param[in]  ae_results       Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+                               used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
-+*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+* \return                      Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_from_binary_v2(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
-+ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
-+ * from various ISP formats into AIQ statistics format.
-+ * \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
-+ * \param[in] statistics        Mandatory. Statistics in ISP specific format.
-+ * \param[in] ir_weight         Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
-+ * \param[in] ae_results        Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
-+ *                              used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
-+ * \param[in] bcomp_results     Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
-+ * \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
-+ *                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
-+ * \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
-+ *                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
-+ *                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
-+ * \return                      Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_isp_bxt_statistics_convert_awb_from_binary_v3(
-+    ia_isp_bxt *ia_isp_bxt,
-+    const ia_binary_data *statistics,
-+    const ia_aiq_ir_weight_t *ir_weight,
-+    const ia_aiq_ae_results *ae_results,
-+    const ia_bcomp_results *bcomp_results,
-+    ia_aiq_rgbs_grid **out_rgbs_grid,
-+    ia_aiq_grid **out_ir_grid);
-+
-+/*!
-+* \brief Convert legacy isp api input data to version 1 data
-+* Convert legacy isp api input data structure to new version 1 input
-+* format structure.
-+* \param[in] input_params       Legacy format input parameters
-+* \param[in] ia_cmc             CMC handle
-+* \param[out] pa_results_v1_ptr pa_results version 1 output pointer
-+* \param[out] input_params_v1   pointer to version 1 output data
-+*
-+*/
-+
-+LIBEXPORT void
-+ia_isp_convert_input_params_v0_to_v1(
-+    const ia_isp_bxt_input_params *input_params,
-+    ia_isp_bxt_input_params_v1 *input_params_v1,
-+    const ia_cmc_t *ia_cmc,
-+    ia_aiq_pa_results_v1* pa_results_v1_ptr);
-+
-+/*!
-+* \brief Convert isp api input v1 data to version 2 data
-+* Convert isp api input v1 data structure to new version 2 input
-+* format structure.
-+* \param[in] input_params       Legacy format input parameters
-+* \param[out] sa_results_v1     sa-results in format v1
-+* \param[out] input_params_v1   pointer to version 1 output data
-+*
-+*/
-+
-+struct ia_isp_bxt_input_params_v2;
-+LIBEXPORT void
-+ia_isp_convert_input_params_v1_to_v2(const ia_isp_bxt_input_params_v1 *input_params_v1,
-+    struct ia_isp_bxt_input_params_v2 *input_params_v2,
-+    ia_aiq_sa_results_v1 *sa_results_v1);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_ISP_BXT_DEPRECATED_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
-new file mode 100644
-index 000000000000..c51b1ef42529
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
-@@ -0,0 +1,192 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_isp_bxt_statistics_types.h
-+ * \brief BXT ISP specific statistics data types.
-+*/
-+#ifndef IA_ISP_BXT_STATISTICS_TYPES_H_
-+#define IA_ISP_BXT_STATISTICS_TYPES_H_
-+
-+#ifdef __cplusplus
-+extern "C"
-+{
-+#endif
-+
-+#define BXT_HISTOGRAM_BINS                          256
-+#define BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS   1024    /* Max grid size = [32, 32] */
-+
-+#define BXT_RGBS_GRID_MAX_WIDTH                     96 /* Max grid size = [96, 72] */
-+#define BXT_RGBS_GRID_MAX_HEIGHT                    72
-+#define BXT_RGBS_GRID_MAX_NUM_ELEMENTS              BXT_RGBS_GRID_MAX_WIDTH*BXT_RGBS_GRID_MAX_HEIGHT
-+
-+#define BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS 154
-+#define BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS 120
-+#define BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS 85
-+
-+#define BXT_PAF_STATS_MAX_STEPS                      11     /*!< Max number of phase shifts in a block. */
-+#define BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS          16*12*BXT_PAF_STATS_MAX_STEPS /*!< Max grid size = [16, 12] */
-+
-+#define BXT_HDR_RGBY_GRID_MAX_WIDTH                  484  /*!< Maximum grid width for HDR-statisics.*/
-+#define BXT_HDR_RGBY_GRID_MAX_HEIGHT                 276  /*!< Maximum grid height for HDR-statisics.*/
-+#define BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS           (BXT_HDR_RGBY_GRID_MAX_WIDTH * BXT_HDR_RGBY_GRID_MAX_HEIGHT)  /*!< Maximum grid size for HDR-statisics.484*276=133584.*/
-+
-+typedef enum
-+{
-+    /* TODO: These should be calculated as a hash from the below data structures. */
-+    ia_isp_bxt_statistics_uuid_filter_response_grid = 101,
-+    ia_isp_bxt_statistics_uuid_rgbs_grid = 102,
-+    ia_isp_bxt_statistics_uuid_histograms = 103,
-+    ia_isp_bxt_statistics_uuid_motion_vectors = 104,
-+    ia_isp_bxt_statistics_uuid_paf_grid = 105,
-+    ia_isp_bxt_statistics_uuid_hdr_rgbs_grid = 106,           /*!< RGBS grid with higher than 8 bit precision. */
-+    ia_isp_bxt_statistics_uuid_hdr_rgby_grid = 107,           /*!< RGBY grid with higher than 8 bit precision. Possibly compressed. */
-+    ia_isp_bxt_statistics_uuid_hdr_yv_grid = 108              /*!< Y (Luma) V (Value in HSV color space)  grid with higher than 8 bit precision. Possibly compressed. */
-+} ia_isp_bxt_statistics_uuid;
-+
-+typedef struct
-+{
-+    int32_t uuid;                           /*!< Unique identifier of the record. See ia_isp_bxt_statistics_uuid. */
-+    int32_t size;                           /*!< The size of the record (i.e., the size of this struct). */
-+} ia_isp_bxt_statistics_header_t;
-+
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;  /*!< Header data. */
-+    int32_t hist_c0[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C0. */
-+    int32_t hist_c1[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C1. */
-+    int32_t hist_c2[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C2. */
-+    int32_t hist_c3[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C3. */
-+    int32_t hist_c4[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C4. */
-+    int32_t hist_c5[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C5. */
-+    int32_t hist_c6[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C6. */
-+    int32_t hist_c7[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C7. */
-+} ia_isp_bxt_histograms_t;
-+
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
-+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    int32_t y00_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y00 filter responses for each grid block. */
-+    int32_t y01_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y01 filter responses for each grid block. */
-+    int32_t y10_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y10 filter responses for each grid block. */
-+    int32_t y11_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y11 filter responses for each grid block. */
-+    int32_t r_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< R filter responses for each grid block. */
-+    int32_t g_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< G filter responses for each grid block. */
-+    int32_t b_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< B filter responses for each grid block. */
-+} ia_isp_bxt_filter_response_grid_t;
-+
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
-+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    int32_t c0_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C0 color for each grid block. */
-+    int32_t c1_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C1 color for each grid block. */
-+    int32_t c2_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C2 color for each grid block. */
-+    int32_t c3_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C3 color for each grid block. */
-+    int32_t c4_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C4 color for each grid block. */
-+    int32_t c5_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C5 color for each grid block. */
-+    int32_t c6_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C6 color for each grid block. */
-+    int32_t c7_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C7 color for each grid block. */
-+    int32_t sat_ratio_0[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
-+    int32_t sat_ratio_1[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
-+    int32_t sat_ratio_2[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
-+    int32_t sat_ratio_3[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
-+} ia_isp_bxt_rgbs_grid_t;
-+
-+/*!
-+ * \brief RGBS data collected from decompressed and merged (from multiple exposures) HDR image.
-+ * Named as StatR/G/B/S in ISP Firmware.
-+*/
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
-+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    int32_t r_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of red color for each grid block. */
-+    int32_t g_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of (gr+gb)/2 color for each grid block. */
-+    int32_t b_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of blue color for each grid block. */
-+    unsigned char sat[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];          /*!< U8. currently this is saturation count and it will be saturation percentage after a few weeks. All codes need to be updated accordingly.*/
-+} ia_isp_bxt_hdr_rgbs_grid_t;
-+
-+/*!
-+ * \brief RBGY grids of data which may be compressed or not based on sensor and ISP pipe type.
-+ * Named as HistStatR/G/B/Y in ISP Firmware.
-+ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
-+*/
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
-+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    unsigned short r_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of R color for each grid block with high resolution. */
-+    unsigned short b_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of B color for each grid block with high resolution. */
-+    unsigned short g_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of (GR+GB)/2 color for each grid block with high resolution. */
-+    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of Y (luminance) for each grid block with high resolution. */
-+} ia_isp_bxt_hdr_rgby_grid_t;
-+
-+/*!
-+ * \brief Y (luminance) V (Value in HSV color space) grids of data which may be compressed or not based on sensor and ISP pipe type.
-+ * Named as DRCStatY/V in ISP Firmware.
-+ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
-+*/
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
-+    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    unsigned short v_max[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.v_max = max(R,G,B) in HSV color space. Compressed or not based on sensor type. */
-+    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.y_avg is same data as the y_avg in ia_isp_bxt_hdr_rgby_grid_t, but sub-sampled by 2x. */
-+} ia_isp_bxt_hdr_yv_grid_t;
-+
-+typedef struct
-+{
-+    int32_t vec_fe_x_pos;
-+    int32_t vec_fe_y_pos;
-+    int32_t vec_fm_x_pos;
-+    int32_t vec_fm_y_pos;
-+    int32_t harris_grade;
-+    int32_t match_grade;
-+    int32_t level;
-+} ia_isp_bxt_dvs_motion_vector_entry_t;
-+
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
-+    int32_t grid_width_l0;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height_l0;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_width_l1;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height_l1;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_width_l2;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
-+    int32_t grid_height_l2;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
-+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l0[BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L0 grid. */
-+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l1[BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L1 grid. */
-+    ia_isp_bxt_dvs_motion_vector_entry_t mv_l2[BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L2 grid. */
-+} ia_isp_bxt_motion_vectors_t;
-+
-+typedef struct
-+{
-+    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
-+    int32_t sum_of_diff[BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS];                       /*!<  Sum of phase differences from blocks. */
-+}ia_isp_bxt_paf_grid_t;
-+
-+#ifdef __cplusplus
-+}
-+
-+#endif
-+#endif /* IA_ISP_BXT_STATISTICS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
-new file mode 100644
-index 000000000000..19155e6773ba
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
-@@ -0,0 +1,192 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_isp_bxt_types.h
-+*/
-+
-+#ifndef IA_ISP_BXT_TYPES_H_
-+#define IA_ISP_BXT_TYPES_H_
-+
-+#include "ia_types.h"
-+#include <stdint.h>  /* defines fixed width integers */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef struct ia_isp_bxt_t ia_isp_bxt;
-+
-+/*!
-+ * \brief Input structure for resolution changing ISP block.
-+ *
-+ * If ISP block changes resolution as part of its processing, this structure defines
-+ * resolutions and cropping parameters for one input and output pins. If ISP block has
-+ * multiple outputs, structure needs to be passed for each output pin. Order of operations:
-+ *
-+ * -# Input image is cropped according to input_crop structure parameters. New cropped input resolution is calculated.
-+ * -# Cropped input image is scaled from cropped input resolution to output resolution (output_width & output_height).
-+ * -# Output image is cropped according to output_crop structure parameters.
-+ *
-+ * If ISP block doesn't change resolution of the image as part of its processing, this structure defines
-+ * resolution changes done to the image from the beginning of the pipe until now. For example if some scaling or
-+ * cropping was done before, they are combined.
-+ *
-+ * Example:
-+ *
-+ * -# Sensor outputs 6528 x 4896. Sensor crops 3264 x 2448 ROI from bottom right corner.
-+ * -# ISP block downscales the image from 3264 x 2448 to 2176 x 1632 (scale 0.6667) and crops to 1920 x 1080 (RCB):
-+ *    - resolution_info { 6528, 4896, { 3264, 2448, 0, 0 }, 2176, 1632, { 128, 276, 128, 276 } }
-+ *
-+ * -# ISP block needs to know what resolution changes were done with respect to full sensor frame:
-+ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1920, 1080, { 0, 0, 0, 0 } }
-+ *
-+ * -# ISP block forther downscales the image to 1280 x 720 (RCB):
-+ *    - resolution_info { 1920, 1080, { 0, 0, 0, 0 }, 1280, 720, { 0, 0, 0, 0 } }
-+ *
-+ * -# ISP block needs to know what resolution changes were done:
-+ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1280, 720, { 0, 0, 0, 0 } }
-+ *
-+ */
-+
-+/*!
-+* \brief Metadata buffer indices for ia_isp_bxt_run_kernels_t structure.
-+*/
-+typedef enum
-+{
-+    kernel_metadata_paf_frame_width = 0,                   /*!< Widht of PDAF frame buffer (used by DPC and PAF Statistics). */
-+    kernel_metadata_paf_frame_height                       /*!< Height of PDAF frame buffer (used by DPC and PAF Statistics). */
-+} run_kernels_metadata_t;
-+
-+typedef struct ia_isp_bxt_resolution_info
-+{
-+    int input_width;          /*!< Input image width. */
-+    int input_height;         /*!< Input image height. */
-+    ia_rectangle input_crop;  /*!< Crop offsets for input image. Cropping happens before processing the input image. */
-+    int output_width;         /*!< Output image width. */
-+    int output_height;        /*!< Output image height. */
-+    ia_rectangle output_crop; /*!< Crop offsets for output image. Cropping happens after scaling to output resolution. */
-+} ia_isp_bxt_resolution_info_t;
-+
-+/*!
-+* \brief Defines how ISP kernel should modify bit depth of image passing through it.
-+* Note: Not all ISP kernels are able to change depth of image data which it's processing.
-+*/
-+typedef struct ia_isp_bxt_bpp_info
-+{
-+    int32_t input_bpp;        /*!< Bit depth of image going in to a particular ISP kernel. */
-+    int32_t output_bpp;       /*!< Bit depth of output going out from a particular ISP kernel. */
-+} ia_isp_bxt_bpp_info_t;
-+
-+/*!
-+* \brief Describes options for run-time kernel control.
-+*/
-+typedef enum
-+{
-+    kernel_passthrough = 0,
-+    kernel_enable,
-+    kernel_disable
-+} ia_isp_bxt_enable_control_t;
-+
-+typedef struct ia_isp_bxt_run_kernels
-+{
-+    uint32_t stream_id;                                     /*!< Used to identify, in which branch of the pipe the kernel is located. */
-+    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid. ISP API (output) UUID. */
-+    int32_t enable;                                         /*!< Run-time control to passthrough, enable or disable kernel. */
-+    ia_isp_bxt_resolution_info_t *resolution_info;          /*!< Resolution change to be done in this kernel. NULL, if kernel doesn't change resolution. */
-+    ia_isp_bxt_resolution_info_t *resolution_history;       /*!< Resolution changes done before current kernel with respect to sensor output. NULL, if not available*/
-+    uint32_t metadata[4];                                   /*!< Kernel specific metadata. For example image data format etc. */
-+    ia_isp_bxt_bpp_info_t bpp_info;                         /*!< Kernel specific input and output bits per pixel values. */
-+    uint32_t output_count;                                  /*!< Number of outputs this kernel has, this means that in this structure the pointer to resolution_info can
-+                                                                 be interpreted as an array of this size */
-+    ia_binary_data system_api;                              /*!< Used by system devices to get system information from graph */
-+} ia_isp_bxt_run_kernels_t;
-+
-+typedef struct
-+{
-+    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid */
-+    uint32_t flags;
-+#define IA_ISP_BXT_PIPE_LAST     (1 << 0)                   /*!< this is the last kernel in the array */
-+#define IA_ISP_BXT_PIPE_FIRST    (1 << 1)                   /*!< this is the first kernel in a path */
-+#define IA_ISP_BXT_PIPE_TERMINAL (1 << 2)                   /*!< this is not a kernel but a terminal.
-+                                                                 In this case, kernel_uuid is the terminal id */
-+#define IA_ISP_BXT_PIPE_RCB      (1 << 3)                   /*!< this kernel is a resolution changing block */
-+} ia_isp_bxt_pipe_t;
-+
-+typedef struct ia_isp_bxt_program_group
-+{
-+    unsigned int kernel_count;                    /*!< Number of kernels in the program group .*/
-+    ia_isp_bxt_run_kernels_t *run_kernels;        /*!< Array of kernels in the program group. */
-+    unsigned int operation_mode;                  /*!< Operation mode for selecting proper tunings. Is usually associated to different resolutions. */
-+    ia_isp_bxt_pipe_t *pipe;                      /*!< The graph of kernels in the program group .*/
-+} ia_isp_bxt_program_group;
-+
-+/*!
-+* \brief ia_isp_pal_status_t keeps track of PAL kernel status.
-+*/
-+typedef struct ia_isp_pal_status_t
-+{
-+    int32_t uuid;
-+    int32_t status_id;
-+} ia_isp_pal_status_t;
-+
-+typedef struct
-+{
-+    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
-+    bool af_grid;            /*!< If true, AF grid is available. */
-+    bool histograms;         /*!< If true, histograms are available. */
-+    bool dvs_stats;          /*!< If true, DVS statistics are available. */
-+    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
-+    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
-+    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
-+    bool paf_grid;           /*!< If true, PAF grid is available. */
-+} ia_isp_bxt_statistics_query_results_t;
-+
-+/*!
-+ * \brief Describes options to decompress Y (luma).
-+ */
-+typedef enum
-+{
-+    ia_isp_bxt_hdr_y_decompression_max_rgb,   /*!< Use RGB max to calculate Y (luma). */
-+    ia_isp_bxt_hdr_y_decompression_avg_rgb    /*!< Use RGB average to calculate Y (luma). */
-+} ia_isp_bxt_hdr_y_compression_method_t;
-+
-+/*!
-+ * \brief Describes the parameters used in HDR compression algorithm.
-+ * Sensor/ISP may merge the HDR image and then compress the data to preserve data from different parts of the dynamic range.
-+ * Compression is most often done to save memory. For example, merged 20 bit (input) image data could be compressed to fit into (output) 15 bits.
-+ * Parameters in this structure are used to decompress HDR statistics back to linear space.
-+ */
-+typedef struct
-+{
-+    ia_isp_bxt_hdr_y_compression_method_t y_compression_method; /*!< Used decompression method. */
-+    ia_isp_bxt_bpp_info_t                 bpp_info;             /*!< Input and output bits per pixel values. */
-+} ia_isp_bxt_hdr_compression_t;
-+
-+/*!
-+ * \brief Structure describes the parameters used in HDR statistics.
-+ */
-+typedef struct
-+{
-+    unsigned char num_exposures;                               /*!< Mandatory. Number of exposures the sensor supports/outputs. */
-+    float *hdr_ratios;                                         /*!< Mandatory. HDR ratio of [L/S S/VS etc.] for stitching. The effective length is determined by num_exposures-1. */
-+    ia_isp_bxt_hdr_compression_t *ia_isp_bxt_hdr_compression;  /*!< Optional. NULL, if HDR statistics are already in linear space (no compression). */
-+} ia_isp_bxt_hdr_params_t;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_ISP_BXT_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
-new file mode 100644
-index 000000000000..19e2555ce089
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
-@@ -0,0 +1,97 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_isp_types.h
-+ * \brief Common ISP enumerations and structures.
-+*/
-+
-+
-+#ifndef IA_ISP_TYPES_H_
-+#define IA_ISP_TYPES_H_
-+
-+#include "ia_aiq_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ *  \brief Complexity level for ISP features.
-+ */
-+typedef enum
-+{
-+    ia_isp_feature_level_off,   /* Feature is turned off */
-+    ia_isp_feature_level_low,   /* Minimum set of algorithms are used */
-+    ia_isp_feature_level_high   /* Maximum set of algorithms are used */
-+} ia_isp_feature_level;
-+
-+/*!
-+ * \brief Custom control parameters for tuning interpolation in GAIC
-+ *
-+ * GAIC implements generic interpolations of tuning parameters as factor of certain run-time changing parameter.
-+ * This structure defines custom run-time changeable control parameters, which can be used in tuning interpolations.
-+ */
-+typedef struct
-+{
-+    int count;                        /*!< Length of parameters array. */
-+    float *parameters;                /*!< Parameters used in calculation (interpolation) of tuning values.
-+                                           The first element of the array corresponds custom tuning 0,
-+                                           second corresponds with custom tuning 1 etc.*/
-+} ia_isp_custom_controls;
-+
-+/*!
-+ *  \brief Definitions for the color effects.
-+ */
-+typedef enum
-+{
-+    ia_isp_effect_none     =               0,
-+    ia_isp_effect_sky_blue =         (1 << 0),
-+    ia_isp_effect_grass_green =      (1 << 1),
-+    ia_isp_effect_skin_whiten_low =  (1 << 2),
-+    ia_isp_effect_skin_whiten =      (1 << 3),
-+    ia_isp_effect_skin_whiten_high = (1 << 4),
-+    ia_isp_effect_sepia =            (1 << 5),
-+    ia_isp_effect_black_and_white =  (1 << 6),
-+    ia_isp_effect_negative =         (1 << 7),
-+    ia_isp_effect_vivid =            (1 << 8),
-+    ia_isp_effect_invert_gamma =     (1 << 9),
-+    ia_isp_effect_grayscale =        (1 << 10),
-+    ia_isp_effect_aqua =             (1 << 11)
-+} ia_isp_effect;
-+
-+/*!
-+ *  \brief Settings for feature level and strength.
-+ */
-+typedef struct
-+{
-+    ia_isp_feature_level feature_level;  /* Feature level */
-+    char strength;                       /* Setting for the strength [-128,127]. */
-+} ia_isp_feature_setting;
-+
-+/* Thresholds to extract data of given range from statistics. Used to split combined WDR statistics into several low dynamic range statistics. */
-+typedef struct
-+{
-+    float low;
-+    float high;
-+    float scale;
-+} ia_isp_stat_split_thresh;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_ISP_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
-new file mode 100644
-index 000000000000..19096f6af1e6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
-@@ -0,0 +1,150 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+/*!
-+ * \file ia_lard.h
-+ * \brief Lard PCF parser specific implementation.
-+ */
-+
-+#ifndef _IA_LARD_H_
-+#define _IA_LARD_H_
-+
-+#include "ia_types.h"
-+#include "ia_mkn_types.h"
-+#include <stdint.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief available group tags, each group contains all of the tuning modes,
-+ * each mode, contains all of the records which are used for the different filters tunings.
-+ */
-+#define LCMC_TAG IA_MKN_CHTOUL('L','C','M','C')  /*!< CMC group header tag. */
-+#define LAIQ_TAG IA_MKN_CHTOUL('L','A','I','Q')  /*!< 3A+ group header tag. */
-+#define LISP_TAG IA_MKN_CHTOUL('L','I','S','P')  /*!< ISP group header tag. */
-+#define LTHR_TAG IA_MKN_CHTOUL('L','T','H','R')  /*!< Others group header tag. */
-+
-+
-+typedef struct ia_lard_t ia_lard;
-+
-+/*!
-+ * \brief Initialize IA_LARD.
-+ * This function must be called before any other function in the library. It allocates needed memory and
-+ * parses given Lard CPF data. Initialization returns a handle to data of all parsed items, if given
-+ * data is valid Lard CPF data.
-+ *
-+ * \param[in]     lard_data_ptr    Mandatory although function will not return error, if it not given.\n
-+ * \return                         IA_LARD handle. Use the returned handle as input parameter for the consequent IA_LARD calls.
-+ */
-+LIBEXPORT ia_lard*
-+ia_lard_init(const ia_binary_data *lard_data_ptr);
-+
-+/*!
-+ * \brief De-initialize IA_LARD.
-+ * All memory allocated by LARD is freed. LARD handle can no longer be used.
-+ *
-+ * \param[in] ia_lard              Mandatory.\n
-+ *                                 LARD instance handle.
-+ */
-+LIBEXPORT void
-+ia_lard_deinit(ia_lard *ia_lard_ptr);
-+
-+/*!
-+ * \brief Input parameter structure for Lard run.
-+ * Please NOTICE!
-+ * the ISP group can use either index OR tag, the other groups are using tags to get
-+ * the correct thing mode.
-+ * for example
-+ * cmc_mode_tag = 'D','F','L','T'
-+ * aiq_mode_tag = 'L','O','W','L' (low light tunings which the user made up)
-+ * isp_mode_index = 1 OR 'D', 'F', 'L', 'T'
-+ * others_mode_tag = 'D','F','L','T'
-+ *
-+ *
-+ */
-+typedef struct
-+{
-+    unsigned int cmc_mode_tag;      /*!< Mandatory. CMC mode tag (4 letters) to be used with ia_lard_run. */
-+    unsigned int aiq_mode_tag;      /*!< Mandatory. AIQ mode tag (4 letters) to be used with ia_lard_run. */
-+    unsigned int isp_mode_index;    /*!< Mandatory. ISP mode index (number) or tag (4 letters) to be used with ia_lard_run. */
-+    unsigned int others_mode_tag;   /*!< Mandatory. Other mode tag (4 letters)to be used with ia_lard_run. */
-+} ia_lard_input_params;
-+
-+/*!
-+* \brief Output parameter structure for ia_lard_run.
-+* Pointers to aiqb data of requested mode for each of the groups.
-+*/
-+typedef struct ia_lard_results
-+{
-+    ia_binary_data aiqb_cmc_data;      /*!< Mandatory. Aiqb binary data struct for CMC data. */
-+    ia_binary_data aiqb_aiq_data;      /*!< Mandatory. Aiqb binary data struct for AIQ data. */
-+    ia_binary_data aiqb_isp_data;      /*!< Mandatory. Aiqb binary data struct for ISP data. */
-+    ia_binary_data aiqb_other_data;    /*!< Mandatory. Aiqb binary data struct for Other data. */
-+} ia_lard_results;
-+
-+/*!
-+ * \brief Lard run will give pointers to aiqb data of the requested modes of each group.
-+ *
-+ * \param[in] ia_lard_ptr               Mandatory.\n
-+ *                                      Lard instance handle.
-+ * \param[in] lard_input_params_ptr     Mandatory.\n
-+ *                                      Input parameters to tell modes that client is requesting.
-+ * \param[in/out] lard_results_ptr      Mandatory. \n
-+ *                                      Output pointer to aiqb data blocks of specific modes
-+ *                                      that client were requested with lard_input_params_ptr. NULL will
-+ *                                      be set if no modes are requested in some group or data for that
-+ *                                      mode can't be found.
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_lard_run(
-+    ia_lard *ia_lard_ptr,
-+    ia_lard_input_params *lard_input_params_ptr,
-+    ia_lard_results **lard_results_ptr);
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                              Lard version string.
-+ */
-+LIBEXPORT const char*
-+ia_lard_get_version(void);
-+
-+
-+/*!
-+ * \brief Get a list of all of the available tags for a given group
-+ * \param[in] ia_lard_ptr               Mandatory.\n
-+ *                                      Lard instance handle.
-+ * \param[in] mode_tag                  Mandatory.\n
-+ *                                      Mode tag (LAIQ, LISP, LCMC, LTHR)
-+ * \param[out] num_tags                 Mandatory.\n
-+ *                                      number of tunings available for given mode tag
-+ * \param[out] tags                     Mandatory.\n
-+ *                                      tags of available tunings for given mode tag
-+ * \return                              Error code.
-+ */
-+LIBEXPORT ia_err ia_lard_get_tag_list(ia_lard* ia_lard_ptr, const unsigned int mode_tag, unsigned int* num_tags, const unsigned int** tags);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_LARD_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
-new file mode 100644
-index 000000000000..70117dc1a407
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
-@@ -0,0 +1,93 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_types.h"
-+
-+#ifndef _IA_LOG_H_
-+#define _IA_LOG_H_
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#ifndef __func__
-+#define __func__ __FUNCTION__
-+#endif
-+
-+/*!
-+ * \brief Macro for not logging.
-+ */
-+#define IA_NOLOG(...)           ((void)0)
-+
-+/*!
-+ * \brief Macro wrapper for ia_log function.
-+ */
-+#define IA_LOG(level, fmt, ...) ((void)ia_log(level, fmt, ## __VA_ARGS__))
-+
-+/*!
-+ * \brief Logging levels.
-+ */
-+typedef enum
-+{
-+    ia_log_error,
-+    ia_log_debug,
-+    ia_log_info,
-+} ia_log_level;
-+
-+/*!
-+ * \brief Initializes ia_log library with external function pointers for logging.
-+ * If this function is not called, logging will be directed to stdout and stderr.
-+ *
-+ * \param[in] a_env_ptr Structure containing the addresses to logging functions.
-+ *                      If NULL is passed as function pointer, there won't be log prints.
-+ * \return              Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_log_init(ia_env *a_env_ptr);
-+
-+/*!
-+ * \brief Prints formatted string.
-+ *
-+ *
-+ * \param[in] level Log level.
-+ * \param[in] fmt   Format string.
-+ * \param[in] ...   Variables to be printed out as defined by the format string.
-+ */
-+LIBEXPORT void
-+ia_log(ia_log_level level, const char *fmt, ...);
-+
-+/*!
-+ * \brief Prints formatted string with interpreted error code.
-+ *
-+ *
-+ * \param[in]     error               Error code.
-+ * \return                            Pointer to all Error string.
-+ */
-+LIBEXPORT const char *
-+ia_log_strerror(ia_err error);
-+
-+/*!
-+ * \brief De-initialization of ia_log library.
-+ * Must be called if ia_log_init() was called.
-+ */
-+LIBEXPORT void
-+ia_log_deinit();
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_LOG_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
-new file mode 100644
-index 000000000000..e198086219df
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
-@@ -0,0 +1,146 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \mainpage IA LTM API documentation
-+ *
-+ * Browse Files and Classes tabs for details.
-+ *
-+ * \section general General info
-+ *
-+ *  \section init Initialization of LTM library
-+ *
-+ * \copybrief ia_ltm_init
-+ * To create an instance of LTM library one must call function:
-+ * \code ia_ltm_init \endcode
-+ * \copydetails ia_ltm_init
-+ *
-+ * <br><hr><br>
-+ */
-+/*!
-+ * \file ia_ltm.h
-+ * \brief Definitions and declarations of Intel LTM library.
-+ */
-+
-+
-+#ifndef _IA_LTM_H_
-+#define _IA_LTM_H_
-+
-+#include "ia_ltm_types.h"
-+#include "ia_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_isp_bxt_statistics_types.h"
-+#include "ia_mkn_types.h"
-+#include "ia_ltm_deprecated.h"
-+#include "ia_bcomp_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Initialize IA_LTM.
-+ * This function must be called before any other function in the library. It allocates memories for all LTM algorithms based on input parameters
-+ * given by the user. Tuning parameters are parsed from AIQB and saved for LTM algorithms to use. Initialization returns a handle to the LTM instance,
-+ * which is given as input parameter for other functions to access object data. Therefore, multiple instances of LTM library can running simultaneously.
-+ * For example one instance per camera.
-+ *
-+ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
-+ *                                  AIQB Block from CPFF. Contains tuning parameters for AIQ, ISP and LTM algorithms.
-+ * \param[in,out] ia_mkn            Optional.\n
-+ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from LTM is needed
-+ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
-+ *                                  Client writes the data into Makernote section in EXIF.
-+ * return                           IA_LTM handle. Use the returned handle as input parameter for the consequent IA_LTM calls.
-+ */
-+LIBEXPORT ia_ltm*
-+ia_ltm_init(const ia_binary_data *aiqb_data,
-+            ia_mkn *ia_mkn);
-+
-+/*!
-+ * \brief De-initialize IA_LTM.
-+ * All memory allocated by LTM algorithms is freed. LTM handle can no longer be used.
-+ *
-+ * \param[in] ia_ltm                Mandatory.\n
-+ *                                  LTM instance handle.
-+ */
-+LIBEXPORT void
-+ia_ltm_deinit(ia_ltm *ia_ltm);
-+
-+/*!
-+* \brief Set tuning to an existing LTM instance.
-+* This function can be used to switch tunings on-the-fly in a way that LTM preserves its state and offers smooth transition from one tuning to another.
-+*/
-+LIBEXPORT ia_err
-+ia_ltm_set_tuning(ia_ltm *ia_ltm,
-+    const ia_binary_data *tuning_data_ptr);
-+
-+/*!
-+ * \brief Input parameter structure for LTM/DRC algorithm.
-+ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
-+ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
-+ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
-+ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
-+ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
-+ * marked with '(lb)'.
-+ */
-+typedef struct ia_ltm_input_params_v2
-+{
-+    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
-+    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
-+    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
-+    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
-+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
-+    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
-+    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
-+    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
-+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
-+    const ia_bcomp_results *bcomp_results;          /*!< Optional. (lb) Compression curve for DOL sensors */
-+} ia_ltm_input_params_v2;
-+
-+/*!
-+ * \brief LTM calculation based on input parameters and frame statistics.
-+  *
-+ * \param[in] ia_ltm                        Mandatory.\n
-+ *                                          LTM instance handle.
-+ * \param[in] ltm_input_params              Mandatory.\n
-+ *                                          Input parameters for LTM calculations.
-+ * \param[out] ltm_results                  Mandatory.\n
-+ *                                          Pointer's pointer where address of LTM results are stored.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_ltm_run_v2(ia_ltm *ia_ltm,
-+        const ia_ltm_input_params_v2 *ltm_input_params,
-+        ia_ltm_results **ltm_results,
-+        ia_ltm_drc_params **ltm_results_drc);
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                                  Version string.
-+ */
-+LIBEXPORT const char* ia_ltm_get_version(void);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_LTM_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
-new file mode 100644
-index 000000000000..eb8a4c75ac8d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
-@@ -0,0 +1,103 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_ltm_deprecated.h
-+ * \brief Definitions and declarations of Intel LTM library.
-+ */
-+
-+
-+#ifndef _IA_LTM__DEPRECATED_H_
-+#define _IA_LTM__DEPRECATED_H_
-+
-+#include "ia_ltm_types.h"
-+#include "ia_types.h"
-+#include "ia_aiq_types.h"
-+#include "ia_bcomp_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Input parameter structure for LTM/DRC algorithm.
-+ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
-+ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
-+ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
-+ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
-+ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
-+ * marked with '(lb)'.
-+ */
-+typedef struct ia_ltm_input_params
-+{
-+    ia_ltm_level ltm_level;                 /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
-+    ia_aiq_frame_use frame_use;             /*!< Mandatory. Target frame type of the LTM calculations (Preview, Still, video etc.). */
-+    float ev_shift;                         /*!< Optional. (ob) Exposure Value shift [-4,4]. */
-+    char ltm_strength_manual;               /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
-+    ia_aiq_ae_results *ae_results;          /*!< Optional. (ob) AEC output will be used by LTM.*/
-+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;      /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
-+    int16_t frame_width;                    /*!< Mandatory. Width of the frame where the results will be applied. */
-+    int16_t frame_height;                   /*!< Mandatory. Height of the frame where the results will be applied. */
-+    ia_aiq_rgbs_grid *rgbs_grid_ptr;        /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;/*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_ltm_input_image *input_image_ptr;    /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
-+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
-+} ia_ltm_input_params;
-+
-+typedef struct ia_ltm_input_params_v1
-+{
-+    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
-+    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
-+    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
-+    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
-+    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
-+    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
-+    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
-+    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
-+    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
-+    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
-+} ia_ltm_input_params_v1;
-+
-+/*!
-+ * \brief LTM calculation based on input parameters and frame statistics.
-+  *
-+ * \param[in] ia_ltm                        Mandatory.\n
-+ *                                          LTM instance handle.
-+ * \param[in] ltm_input_params              Mandatory.\n
-+ *                                          Input parameters for LTM calculations.
-+ * \param[out] ltm_results                  Mandatory.\n
-+ *                                          Pointer's pointer where address of LTM results are stored.
-+ * \return                                  Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_ltm_run(ia_ltm *ia_ltm,
-+        const ia_ltm_input_params *ltm_input_params,
-+        ia_ltm_results **ltm_results,
-+        ia_ltm_drc_params **ltm_results_drc);
-+
-+LIBEXPORT ia_err
-+ia_ltm_run_v1(ia_ltm *ia_ltm,
-+        const ia_ltm_input_params_v1 *ltm_input_params,
-+        ia_ltm_results **ltm_results,
-+        ia_ltm_drc_params **ltm_results_drc);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_LTM__DEPRECATED_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
-new file mode 100644
-index 000000000000..edf2850ed6c8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
-@@ -0,0 +1,151 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_ltm_types.h
-+ * \brief Definitions of input/output structures of the Intel local tone mapping library.
-+ */
-+
-+#ifndef _IA_LTM_TYPES_H_
-+#define _IA_LTM_TYPES_H_
-+
-+#include "ia_types.h"
-+#include <stdint.h>
-+#include "ia_isp_bxt_statistics_types.h"
-+
-+#define GTM_LUT_SIZE 32
-+#define GCE_DEFOG_LUT_SIZE 64
-+#define NUM_TONE_MAP_PWL_SEGMENTS 7   /*!< Local curves in piece-wise-linear form (7 pieces)*/
-+#define MAX_LUT_WIDTH   145
-+#define MAX_LUT_HEIGHT  500
-+#define MAX_NUM_LUT 500           /*!< Max. possible number of grids in GammaStar (25 x 20) */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef struct ia_ltm_t ia_ltm;
-+
-+/*!
-+ * \brief New struct for LTM/DRC (local tone mapping/dynamic range compression),
-+ * LTM is a algorithm for local tone mapping when sensor is in HDR mode
-+ * LTM/DRC analysis algorithm is in CPU, applying LTM is a FW block called gamma.
-+ */
-+typedef enum
-+{
-+    ia_ltm_level_use_tuning = -1,      /*!< Use LTM level defined in the tuning. */
-+    ia_ltm_level_bypass = 0,           /*!< Bypass LTM (DRC) */
-+} ia_ltm_level;
-+
-+/*!
-+ * \brief Input image for LTM calculations.
-+ */
-+typedef struct
-+{
-+    ia_image_full_info image_info;     /*!< Structure defining given image format, size and other characteristics. */
-+    const ia_binary_data *image_data;  /*!< Input image buffer format, layout and size depends of width & height (and other paddings) defined in image_info structure above. */
-+} ia_ltm_input_image;
-+
-+/*!
-+ * \brief struct to hold LTM LUTs
-+ * Local curves in pwl format as needed by GammaStar
-+ * x & y indexes, slopes for each linear piece
-+ */
-+typedef struct ia_ltm_lut
-+{
-+    uint16_t points_x[NUM_TONE_MAP_PWL_SEGMENTS + 1]; /* UQ0.15 + 2^15(offset) */
-+    uint16_t slopes_a[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ8.8 */
-+    uint16_t points_y[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ0.15 */
-+} ia_ltm_lut;
-+
-+/*!
-+ * \brief struct to hold LTM results
-+ * - Local LUTs
-+ * - Number of blocks in each dimension
-+ * - Average local gain (An estimate of overall local gains to be applied is needed for accurate denoising)
-+ */
-+typedef struct ia_ltm_results
-+{
-+    ia_ltm_lut ltm_luts[MAX_NUM_LUT];   /*!< Local look-up-tables */
-+    int grid_width;                     /*!< Grid width of LTM LUTs. */
-+    int grid_height;                    /*!< Grid height of LTM LUTs. */
-+    int block_size;                     /*!< Block size (width & height in pixels) to which LTM LUTs are applied. */
-+    float ltm_gain;                     /*!< LTM gain. */
-+    float dynamic_range;                /*!< Estimated scene's dynamic range from 0 to 100.  Scene has wider dynamic range when this gets closer to 100.
-+                                        Currently only Optibright outputs this value and this would be zero always for all other LTM algorithms. */
-+} ia_ltm_results;
-+
-+/*!
-+ * \brief GTM parameters for DRC.
-+ */
-+
-+typedef struct ia_ltm_gce_defog
-+{
-+    int32_t offset_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
-+    int32_t slope_vec[GCE_DEFOG_LUT_SIZE];  /* S15 */
-+    int32_t x_cord_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
-+    int32_t x_cord_max;                     /* U15 */
-+    int32_t exponent;                       /* U4  */
-+    int32_t resolution;                     /* U4  */
-+    int32_t A0;
-+    int32_t A1;
-+    int32_t ltm_bypass;
-+    int32_t ltm_weight;                     /* U15 */
-+    int32_t defog_enable;
-+    int32_t defog_enhance;
-+} ia_ltm_gce_defog;
-+
-+typedef struct ia_ltm_drc_gtm
-+{
-+    unsigned short gtm_bypass;
-+    unsigned short xcu_gtm_offset_vec[GTM_LUT_SIZE];
-+    short xcu_gtm_slope_vec[GTM_LUT_SIZE];
-+    unsigned short xcu_gtm_x_cord_vec[GTM_LUT_SIZE];
-+    unsigned short xcu_gtm_x_cord_max;
-+    unsigned short xcu_gtm_exponent;
-+    unsigned short xcu_gtm_slope_resolution;
-+    unsigned short gtm_gain_frac_bit;
-+} ia_ltm_drc_gtm;
-+
-+/*!
-+ * \brief LTM results from algorithms, passing to DRC in IPU4i HDR pipe.
-+ */
-+
-+typedef struct ia_ltm_drc_params
-+{
-+    unsigned short gain_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];    /*!< U15.gain_map is upscaled by bilateral, applied to pixel-to-pixel in DRC FW block. */
-+    unsigned short weight_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];  /*!< U15.weight_map is for computing similarity inside DRC FW block. */
-+    ia_ltm_drc_gtm drc_gtm;                                         /*! GTM parameters. */
-+    ia_ltm_gce_defog gce_defog;                                     /*! GCE/DEFOG parameters. */
-+} ia_ltm_drc_params;
-+
-+/*!
-+ * \brief GTM parameters for GTM part of LTM.
-+ * If GTM is applied inside LTM this structure is used for passing arguments to GTM. In case that GTM is applied
-+ * inside LTM, GBCE and GammaTM ISP block should be disabled.
-+ */
-+typedef struct
-+{
-+    float manual_gain;                  /*!< Mandatory. Manual gain. -1.0 if NA */
-+    float manual_convergence_time;      /*!< Mandatory. Manual brightness convergence speed in seconds. -1.0 if NA. */
-+    unsigned long long frame_timestamp; /*!< Mandatory. Current time stamp in micro seconds. */
-+} ia_ltm_gtm_input_params;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_LTM_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
-new file mode 100644
-index 000000000000..7d3d53c48119
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
-@@ -0,0 +1,142 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_me_corner.h
-+ * \brief Motion estimation from corner detection and feature matching DVS statistics.
-+ */
-+#ifndef _IA_ME_CORNER_H_
-+#define _IA_ME_CORNER_H_
-+
-+#include <stdint.h>
-+#include "ia_dvs_types.h"
-+#include "dvs_stat_public.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/** ME Corner State.
-+ * Host code access to the Motion Estimation Corner detection API with this.
-+ */
-+typedef struct t_ia_me_corner ia_me_corner_state;
-+
-+/** \brief Initialize the ME corner detection module.
-+ *
-+ * \param[out]  me_corner_state      ME corner state.
-+ *                                   This is a pointer to a pointer to a module.
-+ * \param[in]   aiq_tuning_binary    aiqb binary tuning parameter.
-+ * \return                           0 for no error, others for error.
-+ *
-+ * This function initializes the Motion Estimation Corner detection module. This allocates and initializes
-+ * internal data structures. This function must always be called before any
-+ * other ia_me_corner function.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_init(ia_me_corner_state **me_corner_state,
-+                  const ia_binary_data *aiq_tuning_binary);
-+
-+/** \brief Configures the ME corner module.
-+ *
-+ * \param[in]  me_corner_state       ME corner state.
-+ *                                   This is a pointer to a module.
-+ * \param[in]  input_resolution      ISP input resolution in BQ.
-+ * \return                           0 for no error, others for error.
-+ *
-+ * This function configures the Motion Estimation corner detection module. This function must always be called
-+ * after ia_me_corner_init.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_config(ia_me_corner_state *me_corner_state,
-+                    ia_dvs_bq_resolution *input_resolution);
-+
-+/** \brief Deinitialize the ME corner module.
-+ *
-+ * \param[in]   me_corner_state  ME corner state.
-+ *                               This is a pointer to a module.
-+ *
-+ * This function deinitilizes the ME corner module. This frees the allocated memory.
-+ */
-+LIBEXPORT void
-+ia_me_corner_deinit(ia_me_corner_state *me_corner_state);
-+
-+/*!
-+ * \brief Allocate statistics buffer.
-+ *
-+ * Returns allocated DVS statistics.
-+ *
-+ * \param[out]  statistics          Mandatory.\n
-+ *                                  Pointer's pointer where statistics buffer instance is stored.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_allocate_statistics(struct ia_css_skc_dvs_statistics **statistics);
-+
-+/*!
-+ * \brief Free the statistics buffer.
-+ *
-+ * Free the statistics buffer.
-+ *
-+ * \param[in]   statistics          Mandatory.\n
-+ *                                  Pointer to allocated statistics buffer.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_free_statistics(struct ia_css_skc_dvs_statistics *statistics);
-+
-+
-+/** \brief Set the ME corner statistics.
-+ *
-+ * \param[in]   me_corner_state     ME corner state.
-+ *                                  This is a pointer to a module.
-+ * \param[in]   corner_statistics   Pointer to statistics from ISP
-+ * \param[out]  dvs_statistics      Pointer to pointer to converted DVS statistics
-+ * \return                          0 for no error, others for error.
-+ *
-+ * This function converts corner based statistics to generic DVS statistics.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_convert_statistics(ia_me_corner_state *me_corner_state,
-+                                const struct ia_css_skc_dvs_statistics *corner_statistics,
-+                                ia_dvs_statistics **dvs_statistics);
-+
-+/** \brief Gets the ME corner statistics configuration.
-+ *
-+ * \param[in]   me_corner_state        ME corner state.
-+ *                                     This is a pointer to a module.
-+ * \param[out]  dvs_statistics_config  Pointer to pointer to calculated DVS statistics configuration
-+ * \return                             0 for no error, others for error.
-+ *
-+ * This function calculates configuration for collecting DVS statistics.
-+ */
-+LIBEXPORT ia_err
-+ia_me_corner_get_statistics_config(ia_me_corner_state *me_corner_state,
-+                                   struct ia_css_dvs_stat_grid_info **dvs_statistics_config);
-+
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                             Version string.
-+ */
-+LIBEXPORT const char* ia_me_corner_get_version(void);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_ME_CORNER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
-new file mode 100644
-index 000000000000..132c660df1d4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
-@@ -0,0 +1,138 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_mkn_decoder.h
-+ * \brief Definitions of functions to decode records from Maker Note.
-+*/
-+
-+#ifndef IA_MKN_DECODER_H_
-+#define IA_MKN_DECODER_H_
-+
-+#include "ia_types.h"
-+#include "ia_mkn_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Checks if makernote contents are valid.
-+ *
-+ * \param[in] a_mknt_data_ptr       Mandatory.\n
-+ *                                  Pointer to the makernote (MKNT) binary data.
-+ * \param[in] a_tag                 Mandatory.\n
-+ *                                  Tag which should match tag in the given data. Can be 0, if tag doesn't matter.
-+ * \return                          True if makernote data is valid.
-+ */
-+LIBEXPORT bool
-+ia_mkn_is_valid(const ia_binary_data *a_mknt_data_ptr,
-+                const unsigned int a_tag);
-+
-+/*!
-+ * \brief Changes endianness of given makernote buffer.
-+ * Modifies the makernote buffer by changing endianness of makernote header and records.
-+ *
-+ * \param[in, out] mknt_data        Mandatory.\n
-+ *                                  Pointer to the makernote (MKNT) binary data which will be changed
-+ *                                  to different endianness.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_mkn_change_endianness(ia_binary_data *mknt_data);
-+
-+/*!
-+ * \brief Prints all records contents.
-+ * Prints all record headers and record contents into the stdout in the same format as defined by the DFID. If a buffer
-+ * containing makernote header file is given as input, the DNID is also printed out as the first value on each row.
-+ * Note. Makernote data CRC validity is not checked when printing records. Prior to calling this function,
-+ * call ia_mkn_is_valid() to validate integrity of makernote data.
-+ *
-+ * \param[in] mknt_data             Mandatory.\n
-+ *                                  Pointer to the makernote (MKNT) binary data.
-+ * \param[in] makernote_header_file Optional.\n
-+ *                                  Buffer where makernote header file has been read. Can be NULL.
-+ * \param[in] mkn_dnid_struct_name  Optional.\n
-+ *                                  C string of name of structure containing DNIDs in the given header file.
-+ * \param[in] dnid                  Mandatory.\n
-+ *                                  Record's DNID to print. If 0, all records will be printed out.
-+ * \param[in] binary                Mandatory.\n
-+ *                                  Flag indicating if data is printed out as binary data into stdout.
-+ * \param[in] key                   Mandatory.\n
-+ *                                  Packing key (16 bytes).
-+ * \return                          Error code.
-+ */
-+#ifdef TESTMODE
-+LIBEXPORT ia_err
-+ia_mkn_print_record(const ia_binary_data *mknt_data,
-+                    const char *makernote_header_file,
-+                    const char *mkn_dnid_struct_name,
-+                    ia_mkn_dnid dnid,
-+                    bool binary,
-+                    const char *key);
-+
-+#endif
-+/*!
-+ * \brief Copies record data from the makernote to given buffer.
-+ * Checks if a given record exists in the makernote and copies the data from the makernote buffer into the record data buffer.
-+ * The amount to copy depends on size value given as input in the record header structure. If size is 0,
-+ * only the record header is updated with correct data size and no data is copied. Thus this function can be called twice:
-+ * First to get the record size and second time (after allocating a buffer for the output) to get the record data. When querying
-+ * for record, DFID and DNID must match the record's DFID and DNID.
-+ * Note. Makernote data CRC validity is not checked when getting records. Prior to calling this function,
-+ * call ia_mkn_is_valid() to validate integrity of makernote data.
-+ *
-+ * \param[in] mknt_data             Mandatory.\n
-+ *                                  Pointer to the makernote (MKNT) binary data.
-+ * \param[in] key                   Mandatory.\n
-+ *                                  Packing key (16 bytes).
-+ * \param[in,out] mkn_record_header Mandatory.\n
-+ *                                  Record header with size set to 0 or wanted data size from record. DFID and DNID
-+ *                                  must be set correctly to get record data.
-+ * \param[out]    record_data       Mandatory if record header size is not 0.\n
-+ *                                  Large enough buffer to hold whole record data.
-+ * \return                          Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_mkn_get_record(const ia_binary_data *mknt_data,
-+                  const char* key,
-+                  ia_mkn_record_header *mkn_record_header,
-+                  void *record_data);
-+
-+/*!
-+ * \brief Copies record data from the makernote to given buffer.
-+ * Parses through the makernote file and copies record headers of the first num_mkn_records to the given memory array.
-+ * Client should make sure enough memory is allocated for num_mkn_records in the given array.
-+ * If mkn_record_headers is NULL, this function will return the number of records. Thus
-+ * first call can be used to query how many records there are and second call to get the actual record headers.
-+ *
-+ * \param[in] mknt_data              Mandatory.\n
-+ *                                   Pointer to the makernote (MKNT) binary data.
-+ * \param[in,out] num_mkn_records    Mandatory.\n
-+ *                                   Number of makernote records the function is allowed to parse and store to the mkn_record_headers.
-+ * \param[in,out] mkn_record_headers Mandatory.\n
-+ *                                   Client allocated memory for storing the array of record headers parsed by this function.
-+ * \return                           Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_mkn_get_record_headers(const ia_binary_data *mknt_data,
-+                          int *num_mkn_records,
-+                          ia_mkn_record_header *mkn_record_headers);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* IA_MKN_DECODER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
-new file mode 100644
-index 000000000000..b715b8595763
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
-@@ -0,0 +1,167 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_mkn_encoder.h
-+ * \brief Definitions of functions to control and add records to Maker Note.
-+*/
-+
-+#ifndef IA_MKN_ENCODER_H_
-+#define IA_MKN_ENCODER_H_
-+
-+#include <stddef.h>
-+#include "ia_types.h"
-+#include "ia_mkn_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief Creates Make Note system handle.
-+ * Allocates and initializes makernote handle. Handle must be given as input parameter to all consequent ia_mkn calls.
-+ *
-+ * \param[in] mkn_config_bits       Mandatory.\n
-+ *                                  Configuration flag bits.
-+ * \param[in] mkn_section_1_size    Mandatory.\n
-+ *                                  Size of Section 1 data buffer.
-+ * \param[in] mkn_section_2_size    Mandatory.\n
-+ *                                  Size of Section 2 data buffer.
-+ * \return                          Pointer to the makernote handle.
-+ */
-+LIBEXPORT ia_mkn*
-+ia_mkn_init(ia_mkn_config_bits mkn_config_bits,
-+            size_t mkn_section_1_size,
-+            size_t mkn_section_2_size);
-+
-+/*!
-+ * \brief Deletes Make Note system handle.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT void
-+ia_mkn_uninit(ia_mkn *mkn);
-+
-+/*!
-+ * \brief Reset Make Note system to default state.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_mkn_reset(ia_mkn *mkn);
-+
-+/*!
-+ * \brief Adds or updates a data record in the makernote.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
-+ * \param[in] data_format_id     Mandatory.\n
-+ *                               Record data format ID.
-+ * \param[in] data_name_id       Mandatory.\n
-+ *                               Record name ID.
-+ * \param[in] data               Mandatory.\n
-+ *                               Pointer to record data to be copied into the makernote. Size of data to be copied is calculated
-+ *                               from on DFID and number of elements.
-+ * \param[in] num_elements       Mandatory.\n
-+ *                               Number of elements to store.
-+ * \param[in] key                Mandatory.\n
-+ *                               Packing key (16 bytes). NULL means 'no packing'.
-+ * \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_mkn_add_record(ia_mkn *mkn,
-+                  ia_mkn_dfid mkn_data_format_id,
-+                  ia_mkn_dnid mkn_data_name_id,
-+                  const void *data,
-+                  unsigned int num_elements,
-+                  const char *key);
-+
-+/*!
-+ * \brief Deletes a data record from the makernote.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
-+ * \param[in] data_format_id     Mandatory.\n
-+ *                               Record data format ID.
-+ * \param[in] data_name_id       Mandatory.\n
-+ *                               Record name ID.
-+ * \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_mkn_delete_record(ia_mkn *mkn,
-+                     ia_mkn_dfid mkn_data_format_id,
-+                     ia_mkn_dnid mkn_data_name_id);
-+
-+/*!
-+ * \brief Prepares makernote so that it can be included into the EXIF.
-+ * Based on data target: Section 1 can be used by client for example for EXIF or Section 2 where all (Section 1 & Section 2) records will be included.
-+ * calculates checksum, updates total size of makernote data, compresses and pack makernote data.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
-+ * \param[in] data_target        Target of the makernote as defined in enum ia_mkn_trg.
-+ * \return                       Binary data structure with pointer and size of data..
-+ */
-+LIBEXPORT ia_binary_data
-+ia_mkn_prepare(ia_mkn *mkn,
-+               ia_mkn_trg data_target);
-+
-+/*!
-+ * \brief Enable/Disable makernote data collecting.
-+ *
-+ * \param[in] mkn                Mandatory. \n
-+ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
-+ * \param enable_data_collection Mandatory.\n
-+ *                               Enable/disable data collection.
-+ * \return                       Error code.
-+*/
-+LIBEXPORT ia_err
-+ia_mkn_enable(ia_mkn *mkn,
-+              bool enable_data_collection);
-+
-+/*!
-+ * \brief Merge two makernotes.
-+ * Copies all records from source makernote to the target makernote. Existing same records in the target are overwritten by source record.
-+ * Both makernotes must be created with the same makernote library ie. have the same internal structure.
-+ * After merging makernotes, ia_mkn_prepare() function must be called before using the merged makernote.
-+ *
-+ * \param[in,out] mkn_trg_data   Target makernote. Source makernote will be merged into this.
-+ * \param[in]     mkn_src_data   Source makernote.
-+ * \return                       Error code.
-+ */
-+LIBEXPORT ia_err
-+ia_mkn_merge(ia_mkn *mkn_trg,
-+             const ia_mkn *mkn_src);
-+
-+/*!
-+ * \brief Converts makernote (MKNT) binary data to full MKN data.
-+ *  Allocates full MKN data and copies the content of (MKNT) binary data to MKN.
-+ *
-+ * \param[in]     mknt_src_data  Pointer to the makernote (MKNT) binary data.
-+ * \return                       Pointer to the makernote handle.
-+ */
-+LIBEXPORT ia_mkn*
-+ia_mknt_to_mkn(const ia_binary_data *mknt_src_data);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_MKN_ENCODER_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
-new file mode 100644
-index 000000000000..a63af4d2c33b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
-@@ -0,0 +1,165 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_mkn_types.h
-+ * \brief Enumerations, structures and definitions used in the Maker Note System.
-+*/
-+
-+#ifndef _IA_MKN_TYPES_H_
-+#define _IA_MKN_TYPES_H_
-+
-+#include <stdint.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * \brief combines 4 chars into one unsigned long integer.
-+ */
-+#define IA_MKN_CHTOUL(a,b,c,d) \
-+    ( (uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24) )
-+
-+/*!
-+ * \brief Makernote tag. 4 first bytes of the makernote data.
-+ */
-+#define IA_MKN_TAG IA_MKN_CHTOUL('M','K','N','T')
-+
-+/*!
-+ * \brief Definition of ia_mkn handle.
-+ * Definition to clarify when ia_mkn handle is expected to be used.
-+ */
-+typedef void ia_mkn;
-+
-+/*!
-+ *  Start of MKN System enumeration set.
-+ * \brief Enumerations set for Maker Note System.
-+ * This part contatins two enumerations:
-+ * - 'ia_mkn_dfid', describes data type of the 'Data' field in the MKN record;
-+ * - 'ia_mkn_dnid',describes a name (or functionality) of data in the 'Data' field.
-+ * To modify this file a following procedure is used:
-+ * a) Add new enum members of ia_mkn_dfid or ia_mkn_dnid
-+ * b) Update MKN_ENUMS_DATA_REVISION accordingly.
-+ */
-+
-+/*!
-+ *  Revision of MKN System enumeration set, format 0xYYMMDDVV, where:
-+ * - YY: year,
-+ * - MM: month,
-+ * - DD: day,
-+ * - VV: version ('01','02' etc.)
-+ */
-+#define IA_MKN_ENUMS_DATA_REVISION 0x14012702
-+
-+/*!
-+ * \brief Data Format ID (DFID) enumeration describes data type of the 'Data' field in the MKN record.
-+ */
-+typedef enum
-+{
-+    ia_mkn_dfid_dummy,                     /*!< Used for dummy records (no actual data). */
-+
-+    /*! Standard integer data types */
-+    ia_mkn_dfid_signed_char,               /*!< 8-bit, int. values, range: -128 to 127 */
-+    ia_mkn_dfid_unsigned_char,             /*!< 8-bit, int. values, range: 0 to 255 */
-+    ia_mkn_dfid_signed_short,              /*!< 16-bit, int. values, range: -32768 to 32767 */
-+    ia_mkn_dfid_unsigned_short,            /*!< 16-bit, int. values, range: 0 to 65535 */
-+    ia_mkn_dfid_signed_int,                /*!< 32-bit, int. values, range: -2147483648 to 2147483647 */
-+    ia_mkn_dfid_unsigned_int,              /*!< 32-bit, int. values, range: 0 to 4294967295 */
-+    ia_mkn_dfid_signed_long_long,          /*!< 64-bit, int. values, range: -9223372036854775808 to 9223372036854775807 */
-+    ia_mkn_dfid_unsigned_long_long,        /*!< 64-bit, int. values, range: 0 to 18446744073709551615 */
-+    ia_mkn_dfid_string,                    /*!< 8-bit chars which are converted to ASCII. */
-+
-+    /*! Floating point numbers. */
-+    ia_mkn_dfid_float = 14,                /*!< IEEE-754 floating point single precision */
-+    ia_mkn_dfid_double,                    /*!< IEEE-754 floating point double precision */
-+
-+    /*! Fixed point fractional data types */
-+    ia_mkn_dfid_unsigned_q16_16,            /*!< 32-bit, Unsigned fixed point fractional value,  16 bits integer, 16 bits fractional */
-+    ia_mkn_dfid_signed_q15_16,              /*!< 32-bit, Signed fixed point fractional value,  1 bit sign, 15 bits integer, 16 bits fractional */
-+    ia_mkn_dfid_unsigned_q8_8,              /*!< 16-bit, Unsigned fixed point fractional value,  8 bits integer, 8 bits fractional */
-+    ia_mkn_dfid_signed_q7_8,                /*!< 16-bit, Signed fixed point fractional value,  1 bit sign, 7 bits integer, 8 bits fractional */
-+
-+    ia_mkn_dfid_last                        /*!< Total number of data types, keep this enum member as a last one!. */
-+} ia_mkn_dfid;
-+
-+
-+/*!
-+ * \brief Data Name ID (DNID) enumeration describes a name (or functionality) of data in the 'Data' field.
-+ */
-+typedef enum
-+{
-+    ia_mkn_dnid_dummy,                      /*!< Used for dummy records (no actual data). */
-+    ia_mkn_dnid_ia_aiq_records = 1,         /*!< ia_aiq library internal records. */
-+    ia_mkn_dnid_hal_records = 256,          /*!< HAL records. */
-+    ia_mkn_dnid_ia_isp_records = 512,       /*!< ia_isp library internal records. */
-+    ia_mkn_dnid_free_records = 768,         /*!< Next free block of records - replace this when assigned. */
-+    ia_mkn_dnid_last                        /*!< Total number of data names, keep this enum member as a last one!. */
-+} ia_mkn_dnid;
-+
-+
-+/*!
-+ * \brief Bitfield to enable makernote features.
-+ */
-+typedef enum
-+{
-+    ia_mkn_cfg_compression  = 1,        /*!< Enable compression of maker note data */
-+    ia_mkn_cfg_imported  = 1 << 1,      /*!< Shows that MKN has been imported from binary container */
-+} ia_mkn_config_bits;
-+
-+
-+/*!
-+ * \brief Target of the makernote data: Section 1 or 2 (which could represent e.g. JPEG EXIF or RAW Header data).
-+ *  Notice that if Section 2 is selected, an output makernote data will contain both Section 1 and Section 2 parts.
-+ *  Bitwise OR'd with DNID when set for the target sections.
-+ */
-+typedef enum
-+{
-+    ia_mkn_trg_section_1    = 0,        /*!< Extensions ('or'-ed to ia_mkn_dnid) */
-+    ia_mkn_trg_section_2    = 0x10000   /*!< Extensions ('or'-ed to ia_mkn_dnid) */
-+} ia_mkn_trg;
-+
-+
-+/*!
-+ * \brief Makernote header structure. Records (ia_mkn_record_header) are followed after this header.
-+ */
-+typedef struct
-+{
-+    uint32_t tag;                           /*!< Tag in the beginning of makernote data. It also can be used to determine endianness. */
-+    uint32_t size;                          /*!< Size of the actual makernote records data (including ia_mkn_header) */
-+    uint32_t system_version;                /*!< Version of makernote system, format 0xYYMMDDVV */
-+    uint32_t enum_revision;                 /*!< Revision of makernote enumerations set, format 0xYYMMDDVV */
-+    uint32_t config_bits;                   /*!< Configuration flag bits set */
-+    uint32_t checksum;                      /*!< Global checksum of all bytes from the maker note buffer */
-+} ia_mkn_header;
-+
-+
-+/*!
-+ * \brief Record header structure. Data is followed after this header.
-+ */
-+typedef struct
-+{
-+    uint32_t size;                          /*!< Size of record including header */
-+    uint8_t data_format_id;                 /*!< ia_mkn_dfid enumeration values used */
-+    uint8_t key_id;                         /*!< Packing key ID. If 0 - no packing */
-+    uint16_t data_name_id;                  /*!< ia_mkn_dnid enumeration values used */
-+} ia_mkn_record_header;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_MKN_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
-new file mode 100644
-index 000000000000..53c2a382a06f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file nvmparser.h
-+ * \brief Definitions of NVM (Non-Volatile Memory) data parser.
-+*/
-+
-+#ifndef _IA_NVM_H_
-+#define _IA_NVM_H_
-+
-+#include <stdint.h>
-+#include "ia_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define IA_NVM_NUM_CHANNELS 4
-+#define IA_NVM_LSC_BIT_DEPTH_THRESHOLD 8
-+#define IA_NVM_MIN_LSC_WIDTH 7
-+#define IA_NVM_MIN_LSC_HEIGHT 5
-+#define IA_NVM_SENSITIVITY_BIT_DEPTH 10
-+#define IA_NVM_CIE_RANGE_MIN 0.270
-+#define IA_NVM_CIE_RANGE_MAX 0.490
-+
-+#define IA_NVM_INTERFACE_PDAF_MAJOR_VERSION   2
-+
-+#define IA_NVM_STATIC_BUFFER_SIZE_V1 10
-+#define IA_NVM_STATIC_BUFFER_SIZE_V2 12 /*new nvm format with PDAF fields added*/
-+
-+/*!
-+ * \brief NVM parsing status codes.
-+ */
-+typedef enum
-+{
-+    ia_nvm_error_none,            /*!< No error. */
-+    ia_nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
-+    ia_nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
-+    ia_nvm_error_af,              /*!< Error parsing AF parameters. */
-+    ia_nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
-+    ia_nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
-+    ia_nvm_error_crc,             /*!< CRC check error. */
-+    ia_nvm_error_not_used,        /*!< No error in NVM data but NVM data is not used. */
-+    ia_nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
-+    ia_nvm_error_version,         /*!< invalid version. */
-+    ia_nvm_error_pdaf,            /*!< Error parsing PDAF parameters */
-+    ia_nvm_error_vcm,             /*!< Error parsing Closed loop vcm parameters*/
-+} ia_nvm_error;
-+
-+/*!
-+ * \brief PDAF PS Table data layout in NVM (Non-Volatile Memory) data.
-+ */
-+typedef struct
-+{
-+    uint16_t* pdaf_ps_left;          /*!< PS Gain tables for Left Pixels */
-+    uint16_t* pdaf_ps_right;         /*!< PS Gain tables for Right Pixels */
-+} ia_nvm_pdaf_ps;
-+
-+/*!
-+ * \brief PDAF data layout in NVM (Non-Volatile Memory) data.
-+ */
-+typedef struct
-+{
-+    uint8_t pdaf_ps_sensor_modes;                     /*!< number of sensor modes calibrated for PS */
-+    uint8_t pdaf_ps_knots_width;                      /*!< number of PS knots across width */
-+    uint8_t pdaf_ps_knots_height;                     /*!< number of PS knots across height */
-+    uint8_t pdaf_ps_frac_bits;                        /*!< PS Fractional Bit depth */
-+    ia_nvm_pdaf_ps *pdaf_ps_tables;                  /*!< PS tables for all the sensor modes */
-+    uint8_t pdaf_dlom_knots_width;                   /*!< number of DLOM knots across width */
-+    uint8_t pdaf_dlom_knots_height;                  /*!< number of DLOM knots across height */
-+    uint8_t pdaf_dlom_frac_bits;                     /*!< DLOM Fractional Bit Depth */
-+    int32_t* pdaf_dlom_tables;                      /*!< DLOM tables */
-+} ia_nvm_pdaf_data;
-+
-+/*!
-+ * \brief Closed loop vcm calibration data layout in NVM (Non-Volatile Memory) data.
-+ */
-+typedef struct
-+{
-+    uint8_t  closed_loop_hall_offset_vert;  /*!< vertical distance b/w Hall sensor and Magnet */
-+    uint8_t  closed_loop_hall_bias_horz;    /*!< horizontal distance b/w Hall sensor and Magnet */
-+    uint16_t closed_loop_hall_min;          /*!< Hall sensor movement minimum limit */
-+    uint16_t closed_loop_hall_max;          /*!< Hall sensor movement maximum limit */
-+} ia_nvm_closed_loop_vcm;
-+
-+/*!
-+ * \brief LSC table layout in NVM (Non-Volatile Memory) data.
-+ * LSC tables are one after another for N amount of lights. One LSC table consists of tables for 4 channels in order: Ch1, Ch2, Ch3 and Ch4.
-+ */
-+typedef struct
-+{
-+    uint8_t lsc_frac_bits;                    /*!< LSC fractional bit depth range 4-8. */
-+    void *lsc_tables[IA_NVM_NUM_CHANNELS];    /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. Type depends on lsc_fraq_bits. If <= IA_NVM_LSC_BIT_DEPTH_THRESHOLD, then uint8_t, else uint16_t. */
-+} ia_nvm_lsc;
-+
-+
-+typedef struct
-+{
-+    uint8_t major_version;                            /*!< Calibration data major version. */
-+    uint8_t minor_version;                            /*!< Calibration data minor version. */
-+    uint8_t n_pos;                                    /*!< Number of AF measurement orientations. */
-+    uint8_t vcm_lps_bits;                             /*!< VCM lens position sensor bit depth (0 if N/A). */
-+    uint8_t vcm_bits;                                 /*!< VCM register bit depth (8 or 16). */
-+    int16_t *vcm_af_near;                             /*!< VCM register values for n_pos for AF at near calibration distance (supplier specific). */
-+    int16_t *vcm_af_far;                              /*!< VCM register values for n_pos for AF at far calibration distance (supplier specific). */
-+    int16_t *vcm_af_start;                            /*!< VCM register values for n_pos for AF at lens start.DEPRICATED.the parameter must not be used */
-+    int16_t *vcm_af_end;                              /*!< VCM register values for n_pos for AF at lens end.DEPRICATED the parameter must not be used */
-+    uint8_t n_lights;                                 /*!< Number of light sources used for LSC and AWB. */
-+    uint8_t *cie_coords_x;                            /*!< CIE x coordinates for n_lights light sources. */
-+    uint8_t *cie_coords_y;                            /*!< CIE y coordinates for n_lights light sources. */
-+    uint8_t lsc_width;                                /*!< Width of all LSC tables. */
-+    uint8_t lsc_height;                               /*!< Height of all LSC tables. */
-+    ia_nvm_lsc *lsc;                                  /*!< LSC tables for n_lights. */
-+    uint16_t *awb_sensitivities[IA_NVM_NUM_CHANNELS]; /*!< AWB sensitivities for n_lights in order: Ch1, Ch2, Ch3 and Ch4. */
-+    uint8_t pdaf_data_present;                        /*!< PDAF Calibration data present or not(0: no PDAF Data)*/
-+    ia_nvm_pdaf_data *pdaf_data;                      /*!< PDAF Calibration data */
-+    uint8_t closed_loop_data_present;                 /*!< closed loop vcm data present or not (0: no vcm data)*/
-+    ia_nvm_closed_loop_vcm *vcm;                      /*!< vcm data */
-+    uint16_t checksum;                                /*!< CRC-16 checksum calculated from all bytes before checksum. */
-+} ia_nvm;
-+
-+/*!
-+ * \brief Parses intel specified camera NVM data into ia_nvm structure.
-+ * \param[in]  nvm        Camera NVM data in Intel specified format.
-+ * \param[out] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
-+ * \return                NVM parsing error code.
-+ */
-+LIBEXPORT ia_nvm_error
-+ia_nvm_parse(const ia_binary_data *nvm,
-+             ia_nvm** parsed_nvm);
-+
-+/*!
-+ * \brief Frees contents of ia_nvm structure.
-+ * \param[in] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
-+ */
-+LIBEXPORT void
-+ia_nvm_deinit(ia_nvm *parsed_nvm);
-+
-+/*!
-+ * \brief Allocates memory and creates Intel specified camera NVM data from input structure.
-+ * \param[in] parsed_nvm Structure containing values from which the binary will be created.
-+ * \return               Binary data containing the camera NVM in Intel specified format.
-+ */
-+LIBEXPORT ia_binary_data*
-+ia_nvm_binary_create(const ia_nvm *parsed_nvm);
-+
-+/*!
-+ * \brief Deletes memory allocated by ia_nvm_binary_create() function.
-+ * \param[in] nvm_binary Binary data created by function ia_nvm_binary_create.
-+ */
-+LIBEXPORT void
-+ia_nvm_binary_delete(ia_binary_data *nvm_binary);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_NVM_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
-new file mode 100644
-index 000000000000..fad1336b845c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
-@@ -0,0 +1,92 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+/*!
-+ * \mainpage IA OB API documentation
-+ *
-+ * Browse Files and Classes tabs for details.
-+ *
-+ */
-+/*!
-+ * \file ia_ob.h
-+ * \brief Definitions and declarations of IA OB library.
-+ */
-+#ifndef _IA_OB_H_
-+#define _IA_OB_H_
-+
-+#include "ia_types.h"
-+
-+#define IA_OB_DEBUG
-+#if defined IA_OB_DEBUG
-+#define IA_OB_LOG(fmt, ...)       IA_LOG(ia_log_debug, "IAOB: " fmt, ## __VA_ARGS__)
-+#define IA_OB_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAOB: ERROR: " fmt, ## __VA_ARGS__)
-+#define DEBUG_BUFFER_SIZE 1024*7
-+#else
-+#define IA_OB_LOG            IA_NOLOG
-+#define IA_OB_LOG_ERROR      IA_NOLOG
-+#endif
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define IA_OB_VERSION "1.0.0.0"
-+typedef struct ia_ob_t ia_ob;
-+
-+typedef enum
-+{
-+    ia_ob_interleave_none,
-+    ia_ob_interleave_two,
-+} ia_ob_interleave_mode;
-+
-+/*!
-+ * \brief OB runtime input.
-+ */
-+typedef struct {
-+    short *frame_data;       /*!< fixed point image */
-+    unsigned int frame_width;         /*!< current frame width (might be cropped) */
-+    unsigned int frame_height;        /*!< current frame height (might be cropped) */
-+    unsigned int ob_top;
-+    unsigned int ob_left;
-+    unsigned int ob_width;
-+    unsigned int ob_height;
-+    ia_ob_interleave_mode interleave_step;
-+} ia_ob_input;
-+
-+/*!
-+ * \brief OB per-run output.
-+ */
-+typedef struct {
-+    float cc00;
-+    float cc01;
-+    float cc10;
-+    float cc11;
-+} ia_ob_output;                 /*!< OB ouput for 4 color components */
-+
-+LIBEXPORT ia_ob*
-+ia_ob_init(void);
-+
-+LIBEXPORT void
-+ia_ob_deinit(ia_ob *ia_ob);
-+
-+LIBEXPORT ia_err
-+ia_ob_run(ia_ob *ia_ob,
-+          const ia_ob_input *ob_input,
-+          ia_ob_output *ob_output);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+#endif /* _IA_OB_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
-new file mode 100644
-index 000000000000..f504b690b0b2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
-@@ -0,0 +1,1979 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_p2p.h
-+ * \brief Declares the public2private converter API interface.
-+ */
-+
-+/*! \mainpage
-+ *
-+ *  Public2Private (P2P) is a component designed for converting algorithm-related parameters between the ISP algo API and the actual
-+ *  register layouts what firmware expects in its terminals. In the context of P2P, ISP algo parameters are referred as public data
-+ *  and the register layouts as private data.
-+ *
-+ *  P2P has three main responsibilities:
-+ *   - Converting public data to private data (encoding parameters)
-+ *   - Converting private data to public data (decoding statistics)
-+ *   - Filling the actual terminal descriptors accordingly
-+ *
-+ *  \section deps Dependencies
-+ *
-+ *  P2P has dependencies to other repositories:
-+ *   - \b include: contains include files that are common to all AIQ libraries
-+ *   - \b ia_log: the log library used in all AIQ libraries
-+ *   - \b ia_pal: contains the public parameter definitions
-+ *   - \b vied-viedifw-ispfw: P2P uses the CSS functions related to accessing data inside terminals
-+ *
-+ *  \section supported_kernels Supported Platforms and Kernels
-+ *
-+ *  Supported platforms:
-+ *   - BXT B0
-+ *   - CNL A0
-+ *   - CNL B0
-+ *   - GLV A0
-+ *
-+ *  P2P implementation currently supports the following kernels from ISYS:
-+ *   - INL
-+ *   - BLC_GLOBAL
-+ *   - BLC_SENSOR_TYPE_0
-+ *   - BLC_SENSOR_TYPE_1
-+ *   - BLC_SENSOR_TYPE_2
-+ *   - PCLN
-+ *   - LSC_SENSOR_TYPE_0
-+ *   - LSC_SENSOR_TYPE_1
-+ *   - LSC_SENSOR_TYPE_2
-+ *   - 3A_STAT_AWB
-+ *   - 3A_STAT_AF
-+ *   - 3A_STAT_AE_CCM
-+ *   - 3A_STAT_AE
-+ *   - IDS
-+ *   - 3A_STAT_PAF
-+ *
-+ *  P2P implementation currently supports the following kernels from VPREGDC:
-+ *   - WBA_WBA
-+ *   - RYNR_VCUD
-+ *   - RYNR_BNLM
-+ *   - DEMOSAIC_DEMOSAIC
-+ *   - ACM_CCM
-+ *   - ACM_ACM
-+ *   - GTC_CSC_CDS
-+ *   - GTC_GTM
-+ *   - YUV1_IEFD
-+ *   - YUV1_YDS (defaults)
-+ *   - YUV1_TCC (defaults)
-+ *   - DVS_YBIN
-+ *   - DVS_DVS
-+ *   - DVS_L0
-+ *   - DVS_L1
-+ *   - DVS_L2
-+ *   - XNR4-MH
-+ *   - XNR4-M
-+ *   - XNR4_2_Video
-+ *
-+ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS:
-+ *   - WBA_WBA
-+ *   - RYNR_VCUD
-+ *   - RYNR_BNLM
-+ *   - DEMOSAIC_DEMOSAIC
-+ *   - ACM_CCM
-+ *   - ACM_ACM
-+ *   - GTC_CSC_CDS
-+ *   - GTC_GTM
-+ *   - YUV1_IEFD
-+ *   - YUV1_YDS (defaults)
-+ *   - YUV1_TCC (defaults)
-+ *   - DVS_YBIN
-+ *   - DVS_DVS
-+ *   - DVS_L0
-+ *   - DVS_L1
-+ *   - DVS_L2
-+ *   - EXY
-+ *   - XNR42_Video
-+ *
-+ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS_DVS:
-+ *   - WBA_WBA
-+ *   - RYNR_VCUD
-+ *   - RYNR_BNLM
-+ *   - DEMOSAIC_DEMOSAIC
-+ *   - ACM_CCM
-+ *   - ACM_ACM
-+ *   - GTC_CSC_CDS
-+ *   - GTC_GTM
-+ *   - YUV1_IEFD
-+ *   - YUV1_YDS (defaults)
-+ *   - YUV1_TCC (defaults)
-+ *   - DVS_YBIN
-+ *   - DVS_DVS
-+ *   - DVS_L0
-+ *   - DVS_L1
-+ *   - DVS_L2
-+ *   - EXY
-+ *   - XNR42_Video
-+ *
-+ *  P2P implementation currently supports the following kernels from VPREGDC_ISL_HQ_4K:
-+ *   - INL
-+ *   - BLC_GLOBAL
-+ *   - BLC_SENSOR_TYPE_0
-+ *   - BLC_SENSOR_TYPE_1
-+ *   - BLC_SENSOR_TYPE_2
-+ *   - PCLN
-+ *   - LSC_SENSOR_TYPE_0
-+ *   - LSC_SENSOR_TYPE_1
-+ *   - LSC_SENSOR_TYPE_2
-+ *   - 3A_STAT_AWB
-+ *   - 3A_STAT_AF
-+ *   - 3A_STAT_AE_CCM
-+ *   - 3A_STAT_AE
-+ *   - 3A_STAT_PAF
-+ *   - WBA_WBA
-+ *   - RYNR_VCUD
-+ *   - RYNR_BNLM
-+ *   - DEMOSAIC_DEMOSAIC
-+ *   - ACM_CCM
-+ *   - ACM_ACM
-+ *   - GTC_CSC_CDS
-+ *   - GTC_GTM
-+ *   - YUV1_IEFD
-+ *   - YUV1_YDS (defaults)
-+ *   - YUV1_TCC (defaults)
-+ *   - DVS_YBIN
-+ *   - DVS_DVS
-+ *   - DVS_L0
-+ *   - DVS_L1
-+ *   - DVS_L2
-+ *   - XNR42_Video
-+ *
-+ *  P2P implementation currently supports the following kernels from VHDR_PREGDC_HP: // TODO: Update list.
-+ *   - INL
-+ *   - BLC_GLOBAL
-+ *   - BLC_SENSOR_TYPE_0
-+ *   - BLC_SENSOR_TYPE_1
-+ *   - BLC_SENSOR_TYPE_2
-+ *   - PCLN
-+ *   - LSC_V1_0_SENSOR_TYPE_0
-+ *   - LSC_V1_0_SENSOR_TYPE_1
-+ *   - LSC_V1_0_SENSOR_TYPE_2
-+ *   - DPC_1_0_1
-+ *   - IDS_V2_1
-+ *   - 3A_STAT_AWB
-+ *   - 3A_STAT_AF
-+ *   - 3A_STAT_AE_CCM
-+ *   - 3A_STAT_AE
-+ *   - BLC_SENSOR_TYPE_0
-+ *   - BLC_SENSOR_TYPE_1
-+ *   - BLC_SENSOR_TYPE_2
-+ *   - LSC_V1_0_SENSOR_TYPE_0
-+ *   - LSC_V1_0_SENSOR_TYPE_1
-+ *   - LSC_V1_0_SENSOR_TYPE_2
-+ *   - 3A_STAT_AWB
-+ *   - 3A_STAT_AF
-+ *   - OUTPUT_CROP
-+ *   - HDR_STATS
-+ *   - HDR_STATS_RGBY_OUT
-+ *   - HDR_STATS_YDRC_OUT
-+ *   - HDR_STATS_RGBS_OUT
-+ *
-+ *  P2P implementation currently supports the following kernels from VPOSTGDC:
-+ *   - DVS_COORDS
-+ *   - DVS_CONFIG
-+ *   - OFS_OF
-+ *   - OFS_SC0
-+ *   - OFS_SC1
-+ *   - OFS_ISP
-+ *   - TNR5
-+ *
-+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS:
-+ *   - DVS_COORDS
-+ *   - DVS_CONFIG
-+ *   - OFS_OF
-+ *   - OFS_SC0
-+ *   - OFS_SC1
-+ *   - OFS_ISP
-+ *   - TNR5_2_1
-+ *
-+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS2:
-+ *   - DVS_COORDS
-+ *   - DVS_CONFIG
-+ *   - OFS_OF
-+ *   - OFS_SC0
-+ *   - OFS_SC1
-+ *   - OFS_ISP
-+ *   - TNR5_2_1
-+ *
-+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS3:
-+ *   - DVS_COORDS
-+ *   - DVS_CONFIG
-+ *   - OFS_OF
-+ *   - OFS_SC0
-+ *   - OFS_SC1
-+ *   - OFS_ISP
-+ *   - TNR5_2_1
-+ *
-+ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_4K: with DVS2
-+ *   - DVS_COORDS
-+ *   - DVS_CONFIG
-+ *   - OFS_OF
-+ *   - OFS_SC0
-+ *   - OFS_SC1
-+ *   - OFS_ISP
-+ *   - TNR5_2_2
-+ *
-+ *  P2P implementation currently supports the following kernels from YUV_CSC:
-+ *   - CSC_YUV2RGB
-+ *
-+ *  \section init Initialization and deinitialization
-+ *
-+ *  P2P must be initialized before its conversion functions can be used. Initialization happens during the camera start-up with ia_p2p_init().
-+ *  This function returns a handle to the created P2P instance, required by the encoding and decoding functions. When cleaning up, P2P must be
-+ *  deinitialized with ia_p2p_deinit().
-+ *
-+ *  The user has to allocate a cache buffer which is used during encoding and decoding to store parameters which are cached between frames.
-+ *  The cache buffer is specific to a stream, so each stream must have its own cache buffer. The user takes care of giving the correct cache
-+ *  buffer to P2P. The size of the cache buffer must be queried with ia_p2p_get_cache_buffer_size().
-+ *
-+ *  \section runtime Runtime use
-+ *
-+ *  The high-level execution flow during runtime is illustrated in Figure 1. On each frame, P2P expects to get public data from PAL. The user
-+ *  is responsible for calling pal_run() to produce the public data as a binary data chunk and give this as an input to ia_p2p_parse() which
-+ *  parses the data to a form that is more easily accessible by the encoding functions. ia_p2p_parse() also requires the pointer to the cache
-+ *  buffer to use for encoding the cached data. After parsing the public data, the requirements for the terminals and the payload can be queried
-+ *  from P2P in order to allocate memory for the payload and to create terminals.
-+ *
-+ *  \mscfile overview.signalling Figure 1. Using P2P at runtime.
-+ *
-+ *  After the terminals have been created, the encoding functions can be used to fill the terminals and their payload with private data.
-+ *
-+ *  \subsection runtime_terminal_creation Querying requirements and creating terminals
-+ *
-+ *  There are five different terminal types relevant to P2P: three input terminals and two output terminals.
-+ *
-+ *  Input terminals:
-+ *      - <b>Parameter input terminal</b>: contains global kernel parameters
-+ *      - <b>Program terminal</b>: contains program-specific information, i.e. information related to fragmentation and fragment-specific kernel parameters
-+ *      - <b>Spatial parameter input terminal</b>: contains spatial kernel parameters, e.g. 2D lookup tables for LSC and GridBLC
-+ *
-+ *  Output terminals:
-+ *      - <b>Parameter output terminal</b>: contains global statistics, e.g. histograms
-+ *      - <b>Spatial parameter output terminal</b>: contains spatial statistics, e.g. RGBS grid
-+ *
-+ *  Parameter input terminal contains global parameters for all kernels, so only one parameter input terminal is required. The order of the sections
-+ *  in the parameter input terminal usually comes from a FW terminal manifest except for ISYS which does not have a manifest.
-+ *
-+ *  Program terminal contains program-specific information, i.e. parameters which are not global but fragment-specific. The user can decide into how many
-+ *  fragments the full frame is split. Only one program terminal is needed, and it contains fragment-specific parameters for all kernels and for each and every
-+ *  fragment. The order of the sections in the program terminal is such that first comes all the sections of all kernels for the first fragment (similar to
-+ *  parameter input terminal) and then for the second fragment and so on.
-+ *
-+ *  Spatial parameter input terminals are kernel-specific, so there is one for each kernel which requires spatial input parameters. The spatial parameter
-+ *  input terminal contains lookup tables e.g. LSC table.
-+ *
-+ *  Parameter output terminal contains global statistics, such as the histograms. There is only one parameter output terminal which contains statistics
-+ *  data for all kernels producing global statistics. Since the image might be fragmented, parameter output terminal contains the statistics for each
-+ *  fragment individually. The order of the sections is such that first comes the statistics of all kernels for the first fragment, then for the second
-+ *  fragment and so on.
-+ *
-+ *  Spatial parameter output terminal contains spatial statistics, such as the RGBS grid. There is one spatial parameter output terminal for each kernel
-+ *  which produces spatial statistics and it contains only the data for that specific kernel.
-+ *
-+ *  Figure 2 illustrates the process of querying terminal and payload requirements and creating the terminals. The number of sections in the
-+ *  terminals must be queried from P2P using ia_p2p_get_kernel_terminal_requirements(). Since this function returns the requirements for a single
-+ *  kernel, the user is responsible for looping it over all kernels and accumulating the results to determine the total number of sections in the
-+ *  parameter terminal and program terminal.
-+ *
-+ *  In order to calculate how much memory should be allocated for the actual payload, ia_p2p_get_kernel_payload_desc() is used. This function returns
-+ *  the required payload size for a single kernel for each terminal type. The user must accumulate the payload sizes over all kernels to determine the
-+ *  total amount of memory required for payload.
-+ *
-+ *  \mscfile terminal_creation.signalling Figure 2. Querying requirements and creating terminals.
-+ *
-+ *  After requirements for the terminals and the payload have been determined, memory should be allocated for the terminals and the payload.
-+ *  Terminals are created using the functions provided by the firmware. As previously explained, only one parameter input terminal, one parameter
-+ *  output terminal and one program terminal is needed, whereas there must be one spatial parameter input terminal for each kernel having spatial
-+ *  input parameters. The same applies to spatial output terminals.
-+ *
-+ *  \subsection runtime_encoding Encoding
-+ *
-+ *  Figure 3 illustrates the encoding process. P2P expects that the user will keep track of the section index where to write the parameters for each
-+ *  kernel. For each terminal, encoding is performed kernel by kernel in the order of increasing kernel identifier. The first kernel will write to section 0.
-+ *  The results of ia_p2p_get_kernel_requirements() define how much to increment the section index counter between loop iterations. E.g., if the first
-+ *  kernel requires 3 sections, the second kernel will be written to section index 3 and so on. The following pseudo code shows how the loop could look like
-+ *  for the parameter input terminal in case of ISYS:
-+ *
-+ *  \code{.c}
-+ *  unsigned int cur_section = 0;
-+ *  unsigned int cur_offset = 0;
-+ *
-+ *  for (kernel = 0; kernel < N_IA_CSS_ISYS_KERNEL_ID; ++kernel)
-+ *  {
-+ *      ia_p2p_parameter_terminal_encode(ia_p2p, IA_P2P_PG_ISYS, kernel, terminal, cur_section, payload_buffer, cur_offset);
-+ *
-+ *      ia_p2p_get_kernel_terminal_requirements(ia_p2p, IA_P2P_PG_ISYS, kernel, &reqs); // These could be cached before the loop.
-+ *      cur_section += reqs.parameter_section_count;
-+ *
-+ *      ia_p2p_get_kernel_payload_desc(ia_p2p, IA_P2P_PG_ISYS, kernel, fragment_count, &desc); // These could be cached before the loop.
-+ *      cur_offset += desc.parameter_payload_size;
-+ *  }
-+ *  \endcode
-+ *
-+ *  \mscfile encoding.signalling 3. Encoding process.
-+ *
-+ *  Parameter terminal does not have any dependencies, so it can be encoded at any point of execution by looping through all kernel identifiers using
-+ *  ia_p2p_param_in_terminal_encode(). Same is true for the parameter output terminal which is prepared using ia_p2p_param_out_terminal_prepare() at any time.
-+ *  Preparation only fills in the payload offsets so that firmware knows where to write the statistics.
-+ *
-+ *  Program terminal encoding must be started with ia_p2p_program_terminal_init(). This is executed only once per frame. Then, ia_p2p_program_terminal_encode()
-+ *  needs to be run for each kernel individually, just as was with ia_p2p_param_in_terminal_encode(). Program terminal encode needs the fragment descriptors,
-+ *  which define which part of the full frame the fragment contains.
-+ *
-+ *  Spatial param terminals are encoded/prepared with ia_p2p_spatial_param_in_terminal_encode() / ia_p2p_spatial_param_out_terminal_prepare(). Each kernel has its
-+ *  own spatial terminals, so the function is called only once per terminal for each kernel.
-+ *
-+ *  \subsection runtime_decoding_stats Decoding statistics
-+ *
-+ *  Figure 4 illustrates the decoding process for statistics. Decoding the parameter output terminal should be done with a similar loop as encoding the parameter
-+ *  input terminal and keeping track of the current section index. ia_p2p_param_out_terminal_decode() is used to decode the global statistics. Spatial statistics are
-+ *  decoded similarly with ia_p2p_spatial_param_out_terminal_decode() with the exception that every statistics block producing spatial statistics has its own spatial
-+ *  param output terminal.
-+ *
-+ *  \mscfile decoding_stats.signalling 4. Decoding process for statistics.
-+ *
-+ *  After all statistics have been decoded, the statistics buffer can be requested from P2P by ia_p2p_serialize_statistics(). The returned ia_binary_data buffer is
-+ *  owned by P2P and remains valid until ia_p2p_serialize_statistics() is called the next time. The user is responsible of copying the data from the ia_binary_data
-+ *  structure to another location to preserve it over several frames.
-+ *
-+ *  \subsection runtime_decoding_inputs Decoding input parameters (only for debugging purposes)
-+ *
-+ *  P2P offers functions for decoding also the input parameters. This is meant only for debugging purposes and should not be used on a real device. Decoding input
-+ *  parameters has strict requirements for the order of executing the decoding functions. It is mandatory to first decode the parameter terminal with
-+ *  ia_p2p_param_in_terminal_encode() since the parameter terminal contains the information about which kernels have been enabled. This is needed to determine
-+ *  how the other terminals are decoded. Before the program terminal can be decoded, the sequencer fragment grid descriptors for a specific kernel must be retrieved
-+ *  from the spatial parameter input terminal using ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(). After this step, ia_p2p_program_terminal_decode()
-+ *  can be used to decode program-specific parameters. Finally, ia_p2p_spatial_param_in_terminal_decode() is used to decode the spatial input terminals.
-+ *
-+ *  \mscfile decoding.signalling 5. Decoding process for input parameters.
-+ *
-+ *  \page integration_guide Integration Guide
-+ *
-+ *  This page explains how to integrate P2P for each program group.
-+ *
-+ *  The following table summarizes the supported program groups in P2P:
-+ *
-+ *  SV = meaning supported for internal System Validation only (not released for driver)
-+ *
-+ *  Program Group             | P2P Constant                         | PG ID | Fragmentation Support | BXT B0 | CNL B0 | GLV A0 | IPU6 | IPU6S
-+ *  ------------------------- | ------------------------------------ | ----- | --------------------- | ------ | ------ | ------ | ---- | ------
-+ *  ISYS                      | IA_P2P_PG_ISYS                       | 0     | Yes                   | X      | X      | -      | -    | -
-+ *  ISL PS HIRES              | IA_P2P_PG_ISL_PS_HIRES               | 127   | Yes                   | X      | -      | -      | -    | -
-+ *  ISL PS INPUT CROP         | IA_P2P_PG_ISL_PS_INPUT_CROP          | 127   | Yes                   | -      | X      | -      | -    | -
-+ *  ISL PS GLV VPLESS         | IA_P2P_PG_ISL_PS_GLV_VPLESS          | 166   | Yes                   | -      | -      | X      | -    | -
-+ *  ISA LB GLV VPLESS         | IA_P2P_PG_ISA_LB_GLV_VPLESS          | 194   | Yes                   | -      | -      | X      | -    | -
-+ *  Video PreGDC HQ           | IA_P2P_PG_VPREGDC_HQ                 | 122   | Yes                   | X      | X      | -      | -    | -
-+ *  IPU5 Video PreGDC VPless  | IA_P2P_PG_IPU5_VPREGDC_VPLESS        | 167   | Yes                   | -      | -      | X      | -    | -
-+ *  Still PreGDC              | IA_P2P_PG_SPREGDC                    | 117   | No                    | -      | -      | -      | -    | -
-+ *  IPU5 Still PreGDC VPless  | IA_P2P_PG_IPU5_SPREGDC_VPLESS        | 168   | Yes                   | -      | -      | X      | -    | -
-+ *  Still PreGDC XNR          | IA_P2P_PG_SPREGDC_XNR                | 125   | No                    | -      | -      | -      | -    | -
-+ *  Still PreGDC XNR V2       | IA_P2P_PG_SPREGDC_XNR_V2             | 131   | Yes                   | X      | X      | -      | -    | -
-+ *  Still PreGDC XNR V3       | IA_P2P_PG_SPREGDC_XNR_V3             | 136   | Yes                   | X      | X      | -      | -    | -
-+ *  Still PostGDC             | IA_P2P_PG_SPOSTGDC                   | 118   | Yes                   | X      | X      | X      | -    | -
-+ *  Still PostGDC IN8         | IA_P2P_PG_SPOSTGDC_IN8               | 152   | Yes                   |        |        | X      | -    | -
-+ *  Still PostGDC V4          | IA_P2P_PG_SPOSTGDC_V4                | 161   | No                    |        |        | SV     | -    | -
-+ *  Still PostGDC IN8 V4      | IA_P2P_PG_SPOSTGDC_IN8_V4            | 162   | Yes                   | -      | -      | X      | -    | -
-+ *  Still PostGDC V4 10BIT    | IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT     | 197   | Yes                   | -      | -      | X      | -    | -
-+ *  Video PostGDC V1          | IA_P2P_PG_IPU5_VPOSTGDC_V1           | 151   | No                    | -      | -      | X      | -    | -
-+ *  Video PostGDC V4          | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 169   | No                    | -      | -      | X      | -    | -
-+ *  Video PostGDC V4 HDR10    | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 193   | No                    | -      | -      | X      | -    | -
-+ *  Video PostGDC V2          | IA_P2P_PG_VPOSTGDC_V2                | 129   | No                    | X      | X      | -      | -    | -
-+ *  Video PostGDC V2 MBR      | IA_P2P_PG_VPOSTGDC_V2_MBR            | 172   | No                    | -      | X      | -      | -    | -
-+ *  Still PostGDC V2 MBR      | IA_P2P_PG_SPOSTGDC_V2_MBR            | 173   | Yes                   | -      | X      | -      | -    | -
-+ *  Video PostGDC MBR         | IA_P2P_PG_VPOSTGDC_MBR               | 132   | No                    | -      | X      | -      | -    | -
-+ *  Still PostGDC MBR         | IA_P2P_PG_SPOSTGDC_MBR               | 133   | Yes                   | -      | X      | -      | -    | -
-+ *  Video PreGDC HQ VCR2      | IA_P2P_PG_VPREGDC_HQ_VCR2            | 148   | Yes                   | -      | X      | -      | -    | -
-+ *  Video ISL PreGDC HQ VCR2  | IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   | 156   | Yes                   | -      | X      | -      | -    | -
-+ *  Still PreGDC XNR V2 VCR2  | IA_P2P_PG_SPREGDC_XNR_V2_VCR2        | 149   | Yes                   | -      | X      | -      | -    | -
-+ *  Still PreGDC XNR V3 VCR2  | IA_P2P_PG_SPREGDC_XNR_V3_VCR2        | 150   | Yes                   | -      | X      | -      | -    | -
-+ *  LB PSA Bypass             | IA_P2P_PG_IPU6_LB_PSA_BYPASS         | 182   | No                    | -      | -      | -      | X    | -
-+ *  LB PSA                    | IA_P2P_PG_IPU6_LB_PSA                | 183   | No                    | -      | -      | -      | X    | -
-+ *  ISL RBM                   | IA_P2P_PG_IPU6_ISL_RBM               | 185   | No                    | -      | -      | -      | X    | -
-+ *  ISA combined LB PG        | IA_P2P_PG_IPU6_ISA_LB                | 187   | No                    | -      | -      | -      | X    | -
-+ *  ISA PG                    | IA_P2P_PG_IPU6S_ISA                  | 198   | No                    | -      | -      | -      | -    | X
-+ *  Video PreGDC HQ NS        | IA_P2P_PG_VPREGDC_HQ_NS              | 1000  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PostGDC HQ NS       | IA_P2P_PG_VPOSTGDC_HQ_NS             | 1001  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PreGDC HP           | IA_P2P_PG_VPREGDC_HP                 | 1002  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PostGDC HP          | IA_P2P_PG_VPOSTGDC_HP                | 1003  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PreGDC LL           | IA_P2P_PG_VPREGDC_LL                 | 1004  | Yes                   | X      | -      | -      | -    | -
-+ *  VHDR PreProc V2           | IA_P2P_PG_VHDR_PREPROC_V2            | 1005  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PreGDC HQ NS DVS    | IA_P2P_PG_VPREGDC_HQ_NS_DVS          | 1007  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PostGDC HQ NS DVS2  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        | 1008  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PostGDC HQ NS DVS3  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        | 1009  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PreGDC HP 2FR       | IA_P2P_PG_VPREGDC_HP_2FR             | 1010  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PostGDC HQ 4K       | IA_P2P_PG_VPOSTGDC_HQ_4K             | 1011  | No                    | X      | -      | -      | -    | -
-+ *  Video PreGDC ISL HQ 4K    | IA_P2P_PG_VPREGDC_ISL_HQ_4K          | 1012  | Yes                   | X      | -      | -      | -    | -
-+ *  VHDR PreProc Stats HP     | IA_P2P_PG_VHDR_PREPROC_Stats hp      | 1013  | Yes                   | X      | -      | -      | -    | -
-+ *  Video PreGDC HP DRC       | IA_P2P_PG_VPREGDC_HP_DRC             | 1014  | Yes                   | X      | -      | -      | -    | -
-+ *  VHDR PreGDC HP            | IA_P2P_PG_VHDR_PREGDC_HP             | 1015  | Yes                   | X      | -      | -      | -    | -
-+ *  YUYV SCALE                | IA_P2P_PG_YUYV_SCALE                 | 1051  | No                    | X      | -      | -      | -    | -
-+ *  YUV_CSC                   | IA_P2P_PG_YUV_CSC                    | 1052  | No                    | X      | -      | -      | -    | -
-+ *  YUYV_LDC                  | IA_P2P_PG_YUYV_LDC                   | 1053  | No                    | X      | -      | -      | -    | -
-+ *
-+ *  \section isys Input System Program Groups
-+ *
-+ *  Program groups involved
-+ *   - ISYS
-+ *   - ISL PS GLV
-+ *   - ISL PS HIRES
-+ *   - ISL PS INPUT CROP
-+ *
-+ *  ISYS is the only program group which does not have a terminal manifest to use. This is why all control logic for P2P integration must be done by calling P2P
-+ *  encode functions in the increasing kernel id order defined in the IA_CSS_ISA_KERNEL_ID enumeration in FW code. This ordering holds true for both param in and
-+ *  program terminals. Spatial terminals use individual kernel ids and they utilize the same numbering as the param in and program terminal kernel ids.
-+ *
-+ *  ISL PS GLV, ISL PS INPUT CROP and ISL PS HIRES program groups are similar to ISYS program group, but they are run on PSYS and are meant for multi-camera setups.
-+ *  This also means that there is a manifest available. All encoding logic should follow the manifest to achieve correct section order.
-+ *
-+ *  One difference compared to the ISYS program group is also that the spatial terminals have different kernel ids than the param in and program terminal. A good
-+ *  example of this is LSC: param in and program terminals use kernel id 7 for LSC sensor type 1, but the corresponding LSC spatial terminal is using kernel id 28.
-+ *
-+ *  Since P2P needs to support both ISYS and ISL PS program groups at the same time, P2P internally uses the common logic and this is why kernel requirements
-+ *  and payload descriptors should not be calculated for spatial terminal kernel ids (kernel_id >= 24). The required payload is already calculated when calling
-+ *  ia_p2p_get_kernel_terminal_requirements() and ia_p2p_get_kernel_payload_desc() functions for the non-spatial kernel ids (kernel_id < 24). This is not critical,
-+ *  since the only downside of calling the functions is that too much memory is allocated, but should anyway be optimized.
-+ *
-+ * The following chapters list the required PAL records for each Input System program group.
-+ *
-+ *  \subsection ipu5_pre_gdc_pgs IPU5 Input System Program Group PALs
-+ *
-+
-+ *  \subsubsection isl_ps_glv_vpless IA_P2P_PG_ISL_PS_GLV_VPLESS (PG id 166)
-+ *
-+ *   - ia_pal_uuid_isp_pixelformatter
-+ *   - ia_pal_uuid_isp_bxt_norm_lin
-+ *   - ia_pal_uuid_isp_bxt_gridbaseob
-+ *   - ia_pal_uuid_isp_bxt_linearization
-+ *   - ia_pal_uuid_isp_bxt_lsc
-+ *   - ia_pal_uuid_isp_dpc_1_3
-+ *   - ia_pal_uuid_isp_pafstatistics_1
-+ *   - ia_pal_uuid_isp_lca_1_0
-+ *   - ia_pal_uuid_isp_bxt_blc
-+ *   - ia_pal_uuid_isp_bxt_disparity
-+ *   - ia_pal_uuid_isp_bxt_applycorrection
-+ *   - ia_pal_uuid_isp_bxt_awbstatistics
-+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
-+ *   - ia_pal_uuid_isp_bxt_3a_ccm
-+ *   - ia_pal_uuid_isp_bxt_aestatistics
-+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
-+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
-+ *   - ia_pal_uuid_isp_padder_bayer_a
-+ *   - ia_pal_uuid_isp_bxt_inputscalerv2
-+ *   - ia_pal_uuid_isp_bxt_vcsc
-+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
-+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
-+ *   - ia_pal_uuid_isp_padder_yuv_a
-+ *   - ia_pal_uuid_isp_crop_sis
-+ *   - ia_pal_uuid_isp_wb_sis
-+ *   - ia_pal_uuid_isp_sis_1
-+ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
-+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
-+ *
-+ *  \subsubsection isl_ps_dfm_lb_glv IA_P2P_PG_ISA_LB_GLV_VPLESS (PG id 194)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_pixelformatter
-+ *   - ia_pal_uuid_isp_bxt_norm_lin
-+ *   - ia_pal_uuid_isp_bxt_gridbaseob
-+ *   - ia_pal_uuid_isp_bxt_linearization
-+ *   - ia_pal_uuid_isp_bxt_lsc
-+ *   - ia_pal_uuid_isp_dpc_1_3
-+ *   - ia_pal_uuid_isp_pafstatistics_1
-+ *   - ia_pal_uuid_isp_lca_1_0
-+ *   - ia_pal_uuid_isp_bxt_blc
-+ *   - ia_pal_uuid_isp_bxt_disparity
-+ *   - ia_pal_uuid_isp_bxt_applycorrection
-+ *   - ia_pal_uuid_isp_bxt_awbstatistics
-+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
-+ *   - ia_pal_uuid_isp_bxt_3a_ccm
-+ *   - ia_pal_uuid_isp_bxt_aestatistics
-+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
-+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
-+ *   - ia_pal_uuid_isp_padder_bayer_a
-+ *   - ia_pal_uuid_isp_bxt_inputscalerv2
-+ *   - ia_pal_uuid_isp_bxt_vcsc
-+ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
-+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
-+ *   - ia_pal_uuid_isp_padder_yuv_a
-+ *   - ia_pal_uuid_isp_crop_sis
-+ *   - ia_pal_uuid_isp_wb_sis
-+ *   - ia_pal_uuid_isp_sis_1
-+ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
-+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
-+ *   - ia_pal_uuid_isp_bnlm_3_0
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_b2i_dm_1_0
-+ *   - ia_pal_uuid_isp_bxt_vcsc
-+ *   - ia_pal_uuid_isp_gltm_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_glim_1_0
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_gammastar_1
-+ *   - ia_pal_uuid_isp_gammatm_v3
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_strm_crop_psa
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_dvsstatistics_2
-+ *
-+ *  \section pregdc_pgs Pre-GDC Program Groups
-+ *
-+ *  Program groups involved
-+ *   - Video PreGDC
-+ *   - Video PreGDC HQ
-+ *   - Video PreGDC HQ VCR2
-+ *   - ISL Video PreGDC HQ VCR2
-+ *   - Still PreGDC
-+ *   - Still PreGDC XNR
-+ *   - Still PreGDC XNR V2
-+ *   - Still PreGDC XNR V3
-+ *   - Still PreGDC XNR V2 VCR2
-+ *   - Still PreGDC XNR V3 VCR2
-+ *   - Video PreGDC HQ NS
-+ *   - Video PreGDC HQ NS DVS
-+ *   - Video PreGDC LL
-+ *   - Video PreGDC HP
-+ *   - Video PreGDC HP 2FR
-+ *   - Video ISL PreGDC HQ 4K
-+ *   - Video HDR PreGDC HP
-+ *
-+ *  All PreGDC program groups have a manifest which should be used when calling P2P encoding functionality. Because of the DMA packing feature,
-+ *  the input and output fragment's "bits per elements" or "bpe" can be freely chosen by the driver. Hence the alignment requirements are different
-+ *  between input and output fragments. For P2P to configure the output crop parameters, it should to know the fragment descriptor calculation logic
-+ *  Hence P2P must be used to calculate the fragment descriptors for preGDC and driver would need to call the ia_p2p_calculate_pregdc_fragments()
-+ *  for that purpose.
-+ *
-+ *  Because the input and output alignments can be different, p2p maintains an internal cache about the pixels to be cropped for each fragment.
-+ *  The driver must call ia_p2p_calculate_pregdc_fragments() with input and output fragment bpe, frame width, fragment count and input and output
-+ *  fragment descriptors. P2P will use the cached output crop pixel offsets for subsequent configuring of the output crop parameters.
-+ *
-+ *  To simplify the fragment descriptor calculations, P2P assumes the maximum number of fragments to be supported as 20.
-+ *
-+ * The following chapters list the required PAL records for each Pre-GDC program group.
-+ *
-+ *  \subsection ipu5_pre_gdc_pgs IPU5 Pre-GDC Program Group PALs
-+ *
-+ *  \subsubsection  vpregdc IA_P2P_PG_IPU5_VPREGDC_VPLESS (PG id 167)
-+ *
-+ *   - ia_pal_uuid_isp_bnlm_3_0
-+ *   - ia_pal_uuid_isp_gltm_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_glim_1_0
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_gammastar_1
-+ *   - ia_pal_uuid_isp_gammatm_v3
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_strm_crop_psa
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_dvsstatistics_2
-+ *
-+ *  \subsubsection  spregdc_vpless IA_P2P_PG_IPU5_SPREGDC_VPLESS (PG id 168)
-+ *
-+ *   - ia_pal_uuid_isp_bnlm_3_0
-+ *   - ia_pal_uuid_isp_bxt_wb_stills
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector
-+ *   - ia_pal_uuid_isp_bxt_vcsc_stills
-+ *   - ia_pal_uuid_isp_gltm_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_glim_1_0
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_gammastar_1
-+ *   - ia_pal_uuid_isp_gammatm_v3
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_strm_crop_psa
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *
-+ *  \subsection ipu4p_pre_gdc_pgs IPU4P Pre-GDC Program Group PALs
-+ *
-+ *  \subsubsection  vpregdc_hq_kernels IA_P2P_PG_VPREGDC_HQ (PG id 122)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector,
-+ *   - ia_pal_uuid_isp_bxt_ccm,
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_bxt_vcud
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_xnr4_m
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \subsubsection  vpregdc_hq_vcr2_kernels IA_P2P_PG_VPREGDC_HQ_VCR2 (PG id 148)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector,
-+ *   - ia_pal_uuid_isp_bxt_ccm,
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_bxt_vcud
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_xnr4_m
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \subsubsection  video_isl_pregdc_hq_vcr2_kernels IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2 (PG id 156)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_norm_lin
-+ *   - ia_pal_uuid_isp_bxt_blc
-+ *   - ia_pal_uuid_isp_bxt_gridbaseob
-+ *   - ia_pal_uuid_isp_bxt_linearization
-+ *   - ia_pal_uuid_isp_bxt_lsc
-+ *   - ia_pal_uuid_isp_bxt_applycorrection
-+ *   - ia_pal_uuid_isp_bxt_disparity
-+ *   - ia_pal_uuid_isp_dpc_1_1
-+ *   - ia_pal_uuid_isp_bxt_awbstatistics
-+ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
-+ *   - ia_pal_uuid_isp_bxt_3a_ccm
-+ *   - ia_pal_uuid_isp_bxt_aestatistics
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2 (PG id 131)
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2_VCR2 (PG id 149)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_xnr4_mh
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \subsubsection  vpregdc_hq_ns_dvs_kernels IA_P2P_PG_VPREGDC_HQ_NS_DVS (PG id 1007)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_bxt_rynr_splitter
-+ *   - ia_pal_uuid_isp_bxt_rynr_collector
-+ *   - ia_pal_uuid_isp_bxt_bnlm
-+ *   - ia_pal_uuid_isp_bxt_vcud
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_bxt_gammatm
-+ *   - ia_pal_uuid_isp_sc_iefd
-+ *   - ia_pal_uuid_isp_exy
-+ *   - ia_pal_uuid_isp_bxt_csc2
-+ *   - ia_pal_uuid_isp_bxt_xnr_dss
-+ *   - ia_pal_uuid_isp_exy
-+ *   - ia_pal_uuid_isp_bxt_dvsstatistics
-+ *
-+ *  \section postgdc_pgs Post-GDC Program Groups
-+ *
-+ *  Program groups involved
-+ *   - Video PostGDC
-+ *   - Video PostGDC V2
-+ *   - Video PostGDC V2 MBR
-+ *   - Still PostGDC
-+ *   - Still PostGDC V2
-+ *   - Still PostGDC V2 MBR
-+ *   - Video PostGDC MBR
-+ *   - Still PostGDC MBR
-+ *   - Video PostGDC HQ NS
-+ *   - Video PostGDC HQ NS DVS2
-+ *   - Video PostGDC HQ NS DVS3
-+ *   - Video PostGDC HQ 4K
-+ *   - Video PostGDC HP
-+ *   - YUYV Scale
-+ *   - YUYV LDC
-+ *
-+ *  Both PostGDC program groups have a manifest which should be used when calling P2P encoding functionality. The driver should call ia_p2p_calculate_postgdc_fragments()
-+ *  to calculate proper fragmentation for PostGDC. This function can be used even when there is no fragmentation, i.e. the fragment count is 1. This way the integration
-+ *  can be done in the same way for both unfragmented and fragmented use cases.
-+ *
-+ *  The function ia_p2p_calculate_postgdc_fragments() calculates multiple fragment descriptors. Some of this data needs to be used when configuring the data terminals.
-+ *  The following table describes how to configure each data terminal in the program group:
-+ *
-+ *  Terminal                     | Fragment Descriptors
-+ *  ---------------------------- | ---------------------------------------------------------------------------------------------------------------
-+ *  Data input terminal          | Configure always to full frame
-+ *  Data output terminal (pin 0) | Use output_pixel_fragment_descs_display_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
-+ *  Data output terminal (pin 1) | Use output_pixel_fragment_descs_main_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
-+ *  Data output terminal (pin 2) | Use output_pixel_fragment_descs_postprocess_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
-+ *
-+ *  The input_pixel_fragment_descs descriptors returned by ia_p2p_calculate_postgdc_fragments() must be given as input to the P2P encoding functions.
-+ *
-+ * The following chapters list the required PAL records for each Post-GDC program group.
-+ *
-+ *  \subsection ipu5_post_gdc_pgs IPU5 Post-GDC Program Group PALs
-+ *
-+ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4 (PG ID 169)
-+ *
-+ *   - ia_pal_uuid_isp_gdc4_2
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_tnr5_3
-+ *
-+ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT (PG ID 193)
-+ *
-+ *   - ia_pal_uuid_isp_gdc4_2
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_tnr5_3_1
-+ *
-+ *  \subsubsection spostgdc_v4 IA_P2P_PG_SPOSTGDC_V4 (PG id 161)
-+ *
-+ *   - ia_pal_uuid_isp_gdc4_2
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *
-+ *  \subsubsection spostgdc_in8_v4 IA_P2P_PG_SPOSTGDC_IN8_V4 (PG id 162)
-+ *
-+ *   - ia_pal_uuid_isp_gdc4_2
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *
-+ *  \subsubsection spostgdc_v4_10bit IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT (PG id 197)
-+ *
-+ *   - ia_pal_uuid_isp_gdc4_2
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *
-+ *  \subsection ipu4p_post_gdc_pgs IPU4P Post-GDC Program Group PALs
-+ *
-+ *  \subsubsection vpostgdc_dvs2 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2 (PG id 1008)
-+ *
-+ *   - ia_pal_uuid_isp_gdc3_1
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_tnr5_21
-+ *
-+ *  \subsubsection vpostgdc_dvs3 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3 (PG id 1009)
-+ *
-+ *   - ia_pal_uuid_isp_gdc3_1
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_tnr5_21
-+ *
-+ *  \subsubsection vpostgdc_4K IA_P2P_PG_VPOSTGDC_HQ_4K (PG id 1011)
-+ *
-+ *   - ia_pal_uuid_isp_gdc3_1
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_tnr5_22
-+ *
-+ *  \subsubsection vpostgdc IA_P2P_PG_VPOSTGDC_V2_MBR (PG id 172)
-+ *
-+ *   - ia_pal_uuid_isp_gdc3_1
-+ *   - ia_pal_uuid_isp_ofa_1
-+ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
-+ *   - ia_pal_uuid_isp_sc_outputscaler_dp
-+ *   - ia_pal_uuid_isp_dma_cropper_ppp
-+ *   - ia_pal_uuid_isp_dma_cropper_mp
-+ *   - ia_pal_uuid_isp_dma_cropper_dp
-+ *   - ia_pal_uuid_isp_bxt_tnr5v1
-+ *
-+ *  \subsection IPU6 PGs
-+ *
-+ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB_PSA_BYPASS (PG id 182)
-+ *
-+ *   - ia_pal_uuid_isp_bnlm_3_0
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_gammastar_1
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_gammatm_v3
-+ *   - ia_pal_uuid_isp_yuv_splitter
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_gltm_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_glim_1_0
-+ *
-+ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB (PG id 183)
-+ *
-+ *   - ia_pal_uuid_isp_bnlm_3_0
-+ *   - ia_pal_uuid_isp_bxt_demosaic
-+ *   - ia_pal_uuid_isp_bxt_vcsc
-+ *   - ia_pal_uuid_isp_bxt_ccm
-+ *   - ia_pal_uuid_isp_bxt_acm
-+ *   - ia_pal_uuid_isp_bxt_vcr2
-+ *   - ia_pal_uuid_isp_gammastar_1
-+ *   - ia_pal_uuid_isp_bxt_csc
-+ *   - ia_pal_uuid_isp_gammatm_v3
-+ *   - ia_pal_uuid_isp_yuv_splitter
-+ *   - ia_pal_uuid_isp_sc_iefd_v2
-+ *   - ia_pal_uuid_isp_gltm_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_xnr_5_1
-+ *   - ia_pal_uuid_isp_espa_1_0
-+ *   - ia_pal_uuid_isp_glim_1_0
-+ *
-+ *  \subsubsection LB ISA RBM PG IA_P2P_PG_IPU6_ISL_RBM (PG id 185)
-+ *
-+ *   - ia_pal_uuid_isp_bxt_pixelformatter
-+ *   - ia_pal_uuid_isp_bxt_norm_lin
-+ *   - ia_pal_uuid_isp_bxt_blc
-+ *   - ia_pal_uuid_isp_bxt_gridbaseob
-+ *   - ia_pal_uuid_isp_linearization2_0
-+ *   - ia_pal_uuid_isp_lsc_1_1
-+ *   - ia_pal_uuid_isp_dpc_2_0
-+ *   - ia_pal_uuid_isp_bxt_disparity
-+ *   - ia_pal_uuid_isp_bxt_applycorrection
-+ *   - ia_pal_uuid_isp_af_awb_frstatistics_2_0
-+ *   - ia_pal_uuid_isp_awbstatistics_2_0
-+ *   - ia_pal_uuid_isp_ccm_3a_2_0
-+ *   - ia_pal_uuid_isp_aestatistics_2_0
-+ *   - ia_pal_uuid_isp_bxt_wb
-+ *   - ia_pal_uuid_isp_lca_1_0
-+ *   - ia_pal_uuid_isp_strm_crop_sis_a
-+ *   - ia_pal_uuid_isp_sis_1_0_a
-+ *   - ia_pal_uuid_isp_espa_sis_a
-+ *   - ia_pal_uuid_isp_pxl_crop_sis_a
-+ *   - ia_pal_uuid_isp_strm_crop_sis_b
-+ *   - ia_pal_uuid_isp_sis_1_0_b
-+ *   - ia_pal_uuid_isp_espa_sis_b
-+ *   - ia_pal_uuid_isp_pxl_crop_sis_b
-+ *   - ia_pal_uuid_isp_espa_bayer_a
-+ *   - ia_pal_uuid_isp_padder_bayer_a
-+ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
-+ *   - ia_pal_uuid_isp_b2i_bnr_1_0
-+ *   - ia_pal_uuid_isp_b2i_dm_1_0
-+ *   - ia_pal_uuid_isp_b2i_sie_1_0
-+ *   - ia_pal_uuid_isp_b2i_ds_1_0_0
-+ *   - ia_pal_uuid_isp_espa_yuv_a
-+ *   - ia_pal_uuid_isp_padder_yuv_a
-+ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
-+ *   - ia_pal_uuid_isp_b2i_ds_1_0_1
-+ *   - ia_pal_uuid_isp_espa_yuv_b
-+ *   - ia_pal_uuid_isp_padder_yuv_b
-+ *   - ia_pal_uuid_isp_pxl_crop_yuv_b
-+ *   - ia_pal_uuid_isp_espa_yuv_c
-+ *   - ia_pal_uuid_isp_padder_yuv_c
-+ *   - ia_pal_uuid_isp_pxl_crop_yuv_c
-+ *
-+ *  \subsubsection IPU6 combined ISA PG IA_P2P_PG_IPU6_ISA_LB (PG id 187)
-+ *   - ia_pal_uuid_espa_isa_sis_a
-+ *   - ia_pal_uuid_espa_isa_sis_b
-+ *   - ia_pal_uuid_ycbcrcombine
-+ *   - ia_pal_uuid_pxl_crop_sis_a
-+ *   - ia_pal_uuid_linearization2_0
-+ *   - ia_pal_uuid_pxl_crop_sis_b
-+ *   - ia_pal_uuid_pixelformatter
-+ *   - ia_pal_uuid_dpc_2_0
-+ *   - ia_pal_uuid_packer_isa_yuv_b
-+ *   - ia_pal_uuid_bxt_acm
-+ *   - ia_pal_uuid_espa_isa_bayer_a
-+ *   - ia_pal_uuid_awbstatistics_2_0
-+ *   - ia_pal_uuid_pxl_crop_yuv_c
-+ *   - ia_pal_uuid_strm_crop_psa_c
-+ *   - ia_pal_uuid_strm_crop_psa_d
-+ *   - ia_pal_uuid_strm_crop_psa_e
-+ *   - ia_pal_uuid_strm_crop_psa_f
-+ *   - ia_pal_uuid_pxl_crop_yuv_b
-+ *   - ia_pal_uuid_strm_crop_psa_h
-+ *   - ia_pal_uuid_b2i_dm_1_0
-+ *   - ia_pal_uuid_pxl_crop_yuv_a
-+ *   - ia_pal_uuid_sve_1_0
-+ *   - ia_pal_uuid_espa_isa_yuv_c
-+ *   - ia_pal_uuid_espa_isa_yuv_b
-+ *   - ia_pal_uuid_espa_isa_yuv_a
-+ *   - ia_pal_uuid_linearization2_0_c
-+ *   - ia_pal_uuid_linearization2_0_b
-+ *   - ia_pal_uuid_bxt_vcsc_stills
-+ *   - ia_pal_uuid_sis_1_0_b
-+ *   - ia_pal_uuid_lsc_1_1
-+ *   - ia_pal_uuid_espa_psa_e
-+ *   - ia_pal_uuid_sis_1_0_a
-+ *   - ia_pal_uuid_espa_psa_c
-+ *   - ia_pal_uuid_pix_crop_ir_md
-+ *   - ia_pal_uuid_espa_psa_h
-+ *   - ia_pal_uuid_bxt_vcr2
-+ *   - ia_pal_uuid_bxt_gridbaseob
-+ *   - ia_pal_uuid_xnr_5_2
-+ *   - ia_pal_uuid_bxt_norm_lin_c
-+ *   - ia_pal_uuid_bxt_blc_b
-+ *   - ia_pal_uuid_bxt_csc
-+ *   - ia_pal_uuid_padder_yuv_a
-+ *   - ia_pal_uuid_padder_yuv_b
-+ *   - ia_pal_uuid_padder_yuv_c
-+ *   - ia_pal_uuid_ccm_3a_2_0
-+ *   - ia_pal_uuid_bxt_blc_c
-+ *   - ia_pal_uuid_espa_psa_4
-+ *   - ia_pal_uuid_x2i_md_1_0
-+ *   - ia_pal_uuid_espa_psa_1
-+ *   - ia_pal_uuid_b2i_sie_1_0
-+ *   - ia_pal_uuid_bxt_applycorrection
-+ *   - ia_pal_uuid_packer_isa_yuv_c
-+ *   - ia_pal_uuid_padder_bayer_a
-+ *   - ia_pal_uuid_packer_isa_yuv_a
-+ *   - ia_pal_uuid_pxl_crop_bayer_a
-+ *   - ia_pal_uuid_dvsstatistics_2
-+ *   - ia_pal_uuid_sc_iefd_v2
-+ *   - ia_pal_uuid_packer_isa_bayer_a
-+ *   - ia_pal_uuid_b2i_bnr_1_0
-+ *   - ia_pal_uuid_af_awb_frstatistics_2_0
-+ *   - ia_pal_uuid_rgb_ir_2_0
-+ *   - ia_pal_uuid_glim_1_0
-+ *   - ia_pal_uuid_strm_crop_sis_b
-+ *   - ia_pal_uuid_strm_crop_sis_a
-+ *   - ia_pal_uuid_espa_isa_wb
-+ *   - ia_pal_uuid_bxt_blc
-+ *   - ia_pal_uuid_bxt_gridbaseob_b
-+ *   - ia_pal_uuid_bxt_gridbaseob_c
-+ *   - ia_pal_uuid_espa_psa_f
-+ *   - ia_pal_uuid_bxt_norm_lin
-+ *   - ia_pal_uuid_bxt_norm_lin_b
-+ *   - ia_pal_uuid_gltm_1_0
-+ *   - ia_pal_uuid_pixelformatter_c
-+ *   - ia_pal_uuid_pixelformatter_b
-+ *   - ia_pal_uuid_bxt_ccm
-+ *   - ia_pal_uuid_vertical_padding_1_0
-+ *   - ia_pal_uuid_b2i_ds_1_0_1
-+ *   - ia_pal_uuid_b2i_ds_1_0_0
-+ *   - ia_pal_uuid_espa_psa_d
-+ *   - ia_pal_uuid_pafstatistics_1
-+ *   - ia_pal_uuid_strm_crop_psa_g
-+ *   - ia_pal_uuid_bxt_demosaic
-+ *   - ia_pal_uuid_lca_1_0
-+ *   - ia_pal_uuid_bxt_disparity
-+ *   - ia_pal_uuid_gammastar_1
-+ *   - ia_pal_uuid_espa_psa_g
-+ *   - ia_pal_uuid_dol_1_0
-+ *   - ia_pal_uuid_aestatistics_2_0
-+ *   - ia_pal_uuid_espa_isa_ir_md
-+ *   - ia_pal_uuid_gammatm_v3
-+ *   - ia_pal_uuid_bnlm_3_0
-+ *   - ia_pal_uuid_bxt_wb
-+ *
-+ *  \page debugging Debugging
-+ *
-+ *  This page explains how P2P can be debugged. There are three ways to debug P2P operation.
-+ *
-+ *  \section simulator P2P simulator
-+ *
-+ *  P2P simulator (also known as PG dump utility), which originally was done for FW validation purposes, is a test case which can be used to run whole P2P encoding cycle
-+ *  for a program group based on a PAL output binary. The simulator takes the PAL output binary as an input and produces terminal payload dumps as an output. By attaching
-+ *  a debugger, the whole P2P encoding can be debugged. This is useful for checking if the input parameters valid and encoded correctly. Since the P2P simulator can only
-+ *  run encoding, it is not suitable for debugging statistics related issues.
-+ *
-+ *  All test case files needed by the P2P simulator can be found under <i>validation</i> folder. File <i>dumpgen.test</i> is the main test case file for running the dump
-+ *  generation. In addition to the generator, the simulator needs to know which program group to run (defined by a .pg file) and what kind of fragmentation scheme to run
-+ *  (defined by a .frag file). The simulator produces two files for each terminal: terminal descriptor and terminal payload. There can be directly used by FW for validation
-+ *  purposes.
-+ *
-+ *  The generic syntax of running the P2P simulator is as follows:
-+ *
-+ *  \code
-+ *  bin/testframework -D Validate=<boolean> -D OutputDir=<string> -D FrameWidth=<int> -D FrameHeight=<int> -D FragmentCount=<int> -D PalDataFile=<string> <Frag_file> <Pg_file> validation/dumpgen.test GenerateDump
-+ *  \endcode
-+ *
-+ *  Parameters:
-+ *  - <b>Validate</b>: Defines whether PAL output binary values will be validated or not. Possible values:
-+ *      - <i>true</i>: P2P validates all PAL output binary values and stops if there is even a single invalid value. No P2P dumps are produced in case that the validation fails.
-+ *      - <i>false</i>: Validation is skipped and the P2P dumps are produced always. If there is invalid values, it might lead to a crash in the worst case.
-+ *  - <b>OutputDir</b>: Specifies the folder where the P2P dumps are written.
-+ *  - <b>FrameWidth</b>: Defines the full input frame width. Only needed when using single.frag for fragmentation.
-+ *  - <b>FrameHeight</b>: Defines the full input frame height. Only needed when using single.frag for fragmentation.
-+ *  - <b>FragmentCount</b>: Defines the number of fragments to use. Only needed when using postgdc_auto.frag for fragmentation.
-+ *  - <b>PalDataFile</b>: Specifies the location of the PAL output binary to use as the input.
-+ *  - <b>Frag_file</b>: The file which defines the fragmentation scheme (.frag file). Currently, there are two possible schemes:
-+ *      - <i>validation/single.frag</i>: Runs a single fragment which covers the full frame. Uses FrameWidth and FrameHeight parameters.
-+ *      - <i>validation/postgdc_auto.frag</i>: Runs automatic fragmentation calculation for postgdc. Uses FragmentCount parameter to define into how many fragments the full frame is split.
-+ *      - <i>validation/auto.fraq</i>: Runs automatic fragment calculation for all program groups. THIS SHOULD BE USED in all PGs for IPU5.5.
-+ *  - <b>Pg_file</b>: The file which defines which program group to run (.pg file).
-+ *  - <b>ShowVersion</b>: Displays simulator version in output log. The version number is generated for pre-compiled binaries.
-+ *
-+ *  Example use for vpregdc using one fragment and resolution 2048x1536:
-+ *  \code
-+ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FrameWidth=2048 -D FrameHeight=1536 -D PalDataFile=PAL.bin validation/single.frag validation/vpregdc.pg validation/dumpgen.test GenerateDump
-+ *  \endcode
-+ *
-+ *  Example use for spostgdc using automatic fragmentation:
-+ *  \code
-+ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FragmentCount=2 -D PalDataFile=PAL.bin validation/postgdc_auto.frag validation/spostgdc.pg validation/dumpgen.test GenerateDump
-+ *  \endcode
-+ *
-+ *  Example use for querying version number:
-+ *  \code
-+ *  bin/testframework validation/dumpgen.test ShowVersion
-+ *  \endcode
-+ *
-+ *  \section p2pdecoder P2P decoder
-+ *
-+ *  P2P decoder can be used to interpret P2P outputs received from FW or driver teams. The decoder supports both pgdump and parambins formats. PG dump is a file which
-+ *  contains the P2P output as a single text file. Parambins, on the other hand, is a collection of binary files which define the terminal descriptor and payload for each
-+ *  terminal.
-+ *
-+ *  P2P decoder interprets the P2P output and prints all found parameters into the log output. In a sense, it is doing the P2P simulation to the other direction (from
-+ *  private to public). This can be used to check what kind of configuration parameters were sent to the FW. Also, if the pgdump is created after running the program
-+ *  group, the decoder can be used for inspecting statistics issues.
-+ *
-+ *  The version number is the same for P2P simulator and decoder. However, it is possible to query the version by running decoder.test with the same option as the simulator.
-+ *
-+ *  \subsection decode_from_pgdump Decoding From Pgdump
-+ *
-+ *  The syntax of running the decoder using a pgdump as input is as follows:
-+ *
-+ *  \code
-+ *  bin/testframework -D PGDumpFile=<string> <Pg_file> validation/decoder.test DecodePGDump
-+ *  \endcode
-+ *
-+ *  Parameters:
-+ *  - <b>PGDumpFile</b>: Specifies the location of the PG dump file to use as the input.
-+ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
-+ *
-+ *  Example use for spostgdc:
-+ *  \code
-+ *  bin/testframework -D PGDumpFile=pgdump.txt validation/spostgdc.pg validation/decoder.test DecodePGDump
-+ *  \endcode
-+ *
-+ *  \subsection decode_from_parambins Decoding From Parambins
-+ *
-+ *  The syntax of running the decoder using parambins as input is as follows:
-+ *
-+ *  \code
-+ *  bin/testframework -D ParamBinsFolder=<string> <Pg_file> validation/decoder.test DecodeParamBins
-+ *  \endcode
-+ *
-+ *  Parameters:
-+ *  - <b>ParamBinsFolder</b>: Specifies the folder which contains the parambins for all terminals to use as the input.
-+ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
-+ *
-+ *  Example use for spostgdc:
-+ *  \code
-+ *  bin/testframework -D ParamBinsFolder=p2p_output validation/spostgdc.pg validation/decoder.test DecodeParamBins
-+ *  \endcode
-+ *
-+ *  \section filedebug P2P File Debug
-+ *
-+ *  P2P contains similar file debug functionality as the other libraries (AIQ and IA_ISP). By enabling the file debug feature in the builds by defining the pre-compiler flag
-+ *  INPUT_IN_FILE, P2P will store all function calls to ia_p2p_usecase.bin files, which allows reproducing the exact same execution than what was run in real hardware.
-+ *
-+ *  Unlike the file debug in other libraries, P2P file debug cannot be run independently. Both IA_ISP_BXT and P2P file debug dumps are required in order to run the full
-+ *  simulation. This means that INPUTS_IN_FILE needs to be enabled in both ia_p2p and ia_isp_bxt libraries. The HAL/driver also instantiates multiple instances of P2P to
-+ *  be able to run encoding for different frames concurrently. This means that it is not enough to copy only one of the P2P file debug dumps. For full file debug simulation,
-+ *  all P2P file debug dumps produced from the same system startup are required.
-+ *
-+ *  \subsection filedebug_windows Capturing P2P File Debug Dumps on Windows
-+ *
-+ *  On Windows, P2P file debug dumps are produced in folder <i>C:\\Windows\\system32\\drivers</i>. Windows version of P2P is run in kernel mode which means that P2P is initialized
-+ *  already during system startup and uninitialized only when the system is shut down. Since the file debug file handles remain open until the uninitialization, the system needs
-+ *  to be restarted in order to be able to copy the ia_p2p_usecase_xxx.bin files to another location.
-+ *
-+
-+ *
-+ *  \subsection filedebug_testframework Running File Debug in Testframework
-+ *
-+ *  Running the simulation is done via ia_isp repository. On Windows side, this happens using the testframework_isp_with_p2p.sln solution file which enables P2P builds in the
-+ *  same environment and expects to get P2P dumps as input as well as the ia_isp_bxt dump. P2P dumps are read by the file debug test case using a wild card, so it is enough
-+ *  to copy all P2P file debug dumps to the <i>testdata</i> folder. There is no need to change the file names. The IA_ISP_BXT dump is set up in the same way as when debugging
-+ *  IA_ISP.
-+ */
-+
-+#ifndef IA_P2P_H_
-+#define IA_P2P_H_
-+
-+#include "ia_isp_bxt_types.h"
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_terminal.h"
-+#include "ia_css_kernel_bitmap.h"
-+#include "ia_p2p_types.h"
-+#include <ia_css_rbm.h>
-+
-+#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
-+#include "ia_p2p_private.h"
-+#endif
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*
-+ * Following definitions are used regardless if the IA_AIC is compiled in or not.
-+ * Keep this part self-contained until the proper IA_AIC implementation exists for these
-+ */
-+#define PAC_P2P_SECTIONS MAX_NUM_SECTIONS_PER_KERNEL //private buffer layout calculated by p2p also for PAC proto
-+#define PAC_P2P_MAX_FRAGMENTS IA_P2P_MAX_FRAGMENTS
-+
-+struct ia_pac_fragment_desc_p2p {
-+        uint16_t fragment_width;    /*!< The width of the fragment. */
-+        uint16_t fragment_height;   /*!< The height of the fragment. */
-+        uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
-+        uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
-+};
-+
-+struct ia_aic_section_info
-+{
-+    uint32_t param_in_size[PAC_P2P_SECTIONS];
-+    uint32_t param_sec_count;
-+    uint32_t program_size[PAC_P2P_SECTIONS];
-+    uint32_t program_sec_count;
-+    uint32_t spatial_in_size[PAC_P2P_SECTIONS];
-+    uint32_t spatial_sec_count;
-+    uint32_t uuid[MAX_NUM_ASSOCIATED_PALS_PER_DEVICE];
-+    uint32_t uuid_count;
-+    uint32_t logical_k_id;
-+    uint32_t p2p_kernel_id;
-+    struct ia_pac_fragment_desc_p2p pixel_fragment_descs[PAC_P2P_MAX_FRAGMENTS];
-+};
-+
-+/*!
-+ *  Initializes IA_P2P module for the given platform.
-+ *
-+ *  \param [in] platform The platform for which to initialize P2P.
-+ *
-+ *  \return The IA_P2P instance handle, or NULL if errors.
-+ */
-+ia_p2p_handle ia_p2p_init(ia_p2p_platform_t platform);
-+
-+/*!
-+ *  De-initializes IA_P2P module.
-+ *
-+ *  \param [in] ia_p2p IA_P2P instance handle.
-+ */
-+void ia_p2p_deinit(ia_p2p_handle ia_p2p);
-+
-+/*!
-+ *  Returns the required size for the cache buffer.
-+ *
-+ *  \param [in] ia_p2p IA_P2P instance handle.
-+ */
-+uint32_t ia_p2p_get_cache_buffer_size(ia_p2p_handle ia_p2p);
-+
-+/*!
-+ *  Parses the public data ready to be used for encoding.
-+ *
-+ *  \param [in] ia_p2p          IA_P2P instance handle.
-+ *  \param [in] public_data     The public data to parse (from PAL output).
-+ *  \param [in] cache_buffer    A pointer to the cache buffer. The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ *          ia_err_data, if public_data doesn't contain enough data.
-+ */
-+ia_err ia_p2p_parse(
-+    ia_p2p_handle ia_p2p,
-+    const ia_binary_data* public_data,
-+    void* cache_buffer);
-+
-+/*!
-+ *  Serializes the statistics to a single binary blob.
-+ *
-+ *  \param [in]  ia_p2p     IA_P2P instance handle.
-+ *  \param [out] statistics The resulting statistics data.
-+ *  \param [out] included   Flags which indicate what statistics are included in the data.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ *
-+ *  \remarks The returned data buffer is owned by P2P and is valid as long as any P2P decode functions are not called.
-+ */
-+ia_err ia_p2p_serialize_statistics(
-+    ia_p2p_handle ia_p2p,
-+    ia_binary_data* statistics,
-+    ia_p2p_statistics_included_t* included);
-+
-+/*!
-+ *  Generates a kernel bitmap for the requested program group.
-+ *
-+ *  \param [in] ia_p2p  IA_P2P instance handle.
-+ *  \param [in] pg_id   The program group id.
-+ *
-+ *  \return The kernel bitmap where set bit means that the kernel is an imaging kernel and should be encoded by P2P.
-+ */
-+ia_css_kernel_bitmap_t ia_p2p_get_kernel_bitmap(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id);
-+
-+/*!
-+*  Generates a kernel bitmap for enabled kernels of the requested program group.
-+*
-+*  \param [in] ia_p2p  IA_P2P instance handle.
-+*  \param [in] pg_id   The program group id.
-+*
-+*  \return The kernel bitmap where set bit means that the kernel is enabled and should be encoded by P2P.
-+*/
-+ia_css_kernel_bitmap_t ia_p2p_get_kernel_enable_bitmap(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id);
-+
-+/*!
-+*  Generates a kernel bitmap for disabled kernels of the requested program group.
-+*
-+*  \param [in] ia_p2p  IA_P2P instance handle.
-+*  \param [in] pg_id   The program group id.
-+*
-+*  \return The kernel bitmap where set bit means that the kernel need to be disabled for the PG.
-+*/
-+ia_css_kernel_bitmap_t ia_p2p_get_kernel_disable_bitmap(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id);
-+
-+/*!
-+ * Check if the kernel bitmaps is empty.
-+ *
-+ * \param [in] bitmap Kernel bitmap.
-+ *
-+ * \return bitmap == 0.
-+ */
-+bool ia_p2p_is_kernel_bitmap_empty(ia_css_kernel_bitmap_t bitmap);
-+
-+/*!
-+ *  Calculates proper fragments for ISL.
-+ *
-+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
-+ *  \param [in]   fragment_count                             The number of fragments.
-+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
-+ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for Bayer (non-scaled) output.
-+ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for YUV (scaled) output.
-+ */
-+ia_err ia_p2p_calculate_isl_fragments(
-+    ia_p2p_handle ia_p2p,
-+    unsigned int fragment_count,
-+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs_bayer,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs_yuv);
-+
-+/*!
-+ *  Calculates proper fragments for post-GDC.
-+ *
-+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
-+ *  \param [in]   fragment_count                             The number of fragments.
-+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
-+ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for display pin, one for each fragment.
-+ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for main pin, one for each fragment.
-+ *  \param [out]  input_pixel_fragment_descs_postprocess_pin The resulting array of output fragment descriptors for post-process pin, one for each fragment.
-+ */
-+ia_err ia_p2p_calculate_postgdc_fragments(
-+    ia_p2p_handle ia_p2p,
-+    unsigned int fragment_count,
-+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs_display_pin,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs_main_pin,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs_postprocess_pin);
-+
-+/*!
-+ *  Calculates proper fragments for pre-GDC.
-+ *
-+ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
-+ *  \param [in]   fragment_count                             The number of fragments.
-+ *  \param [in]   frame_width                                Frame width
-+ *  \param [in]   frame_height                               Frame height
-+ *  \param [in]   input_bpe                                  Input bits per element because of DMA packing
-+ *  \param [in]   output_bpe                                 Output bits per element because of DMA packing
-+ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
-+ *  \param [out]  output_pixel_fragment_descs                The resulting array of fragment descriptors, one for each fragment.
-+ */
-+ia_err ia_p2p_calculate_pregdc_fragments(
-+    ia_p2p_handle ia_p2p,
-+    unsigned int fragment_count,
-+    unsigned int frame_width,
-+    unsigned int frame_height,
-+    unsigned int input_bpe,
-+    unsigned int output_bpe,
-+    ia_p2p_fragment_desc* input_pixel_fragment_descs,
-+    ia_p2p_fragment_desc* output_pixel_fragment_descs);
-+
-+/*!
-+ *  Calculates proper fragments for a program group with pipe graph.
-+ *
-+ *  \param [in]   ia_p2p            IA_P2P instance handle.
-+ *  \param [in]   pg_id             The program group id.
-+ *  \param [in]   fragment_count    The number of fragments.
-+ *  \param [in]   pipe              The pipe graph.
-+ *  \param [in]   fragment_reqs     The constraints to align fragments.
-+ *  \param [out]  configuration     The resulting fragment configuration.
-+ */
-+ia_err ia_p2p_calculate_fragments_pipe(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    const ia_isp_bxt_pipe_t *pipe,
-+    ia_p2p_fragment_reqs *fragment_reqs,
-+    ia_p2p_fragment_configuration_t* configuration);
-+
-+/*!
-+ *  Calculates proper fragments for a program group.
-+ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
-+ *
-+ *  \param [in]   ia_p2p            IA_P2P instance handle.
-+ *  \param [in]   pg_id             The program group id.
-+ *  \param [in]   fragment_count    The number of fragments.
-+ *  \param [out]  configuration     The resulting fragment configuration.
-+ */
-+ia_err ia_p2p_calculate_fragments(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    ia_p2p_fragment_configuration_t* configuration);
-+
-+/*!
-+ *  Calculates proper fragments for a program group with routing bitmap.
-+ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
-+ *
-+ *  \param [in]   ia_p2p            IA_P2P instance handle.
-+ *  \param [in]   pg_id             The program group id.
-+ *  \param [in]   fragment_count    The number of fragments.
-+ *  \param [in]   rbm               The routing bitmap.
-+ *  \param [in]   fragment_reqs     The constraints to align fragments.
-+ *  \param [out]  configuration     The resulting fragment configuration.
-+ */
-+ia_err ia_p2p_calculate_fragments_rbm(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    const ia_css_rbm_t *rbm,
-+    ia_p2p_fragment_reqs *fragment_reqs,
-+    ia_p2p_fragment_configuration_t* configuration);
-+
-+/*!
-+ *  Calculates the required number of section descriptors for each terminal type for the given kernel.
-+ *
-+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
-+ *  \param [in]  pg_id                  The program group id.
-+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose descriptor to calculate.
-+ *  \param [out] kernel_requirements    The calculated requirements for each terminal for the given kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_get_kernel_terminal_requirements(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    ia_p2p_terminal_requirements_t* kernel_requirements);
-+
-+/*!
-+ *  Calculates the total size of payload for each terminal type for the given kernel.
-+ *
-+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
-+ *  \param [in]  pg_id                  The program group id.
-+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose payload sizes to calculate.
-+ *  \param [in]  fragment_count         The number of fragments.
-+ *  \param [in]  pixel_fragment_descs   An array of fragment descriptors, one for each fragment.
-+ *  \param [out] kernel_payload_desc    The calculated total payload size for each terminal for the given kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_get_kernel_payload_desc(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_p2p_payload_desc* kernel_payload_desc);
-+
-+/*!
-+ * Interface for IPU7 PAC. Caller needs more information about the sections.
-+ * IPU7 PAC still borrows some services from P2P.
-+ *
-+ * Interface is the same as for ia_p2p_get_kernel_payload_desc but
-+ * \ param[out] s_info                  Section information
-+ */
-+ia_err ia_pac_get_kernel_payload_desc(
-+        ia_p2p_handle ia_p2p,
-+        uint32_t pg_id,
-+        uint32_t kernel_id,
-+        unsigned int fragment_count,
-+        const ia_p2p_fragment_desc* pixel_fragment_descs,
-+        ia_p2p_payload_desc* kernel_payload_desc,
-+        struct ia_aic_section_info *s_info);
-+
-+
-+/*!
-+ *  Gets the section count and size of payload for param-in/param-out/program terminal for the given kernel.
-+ *
-+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
-+ *  \param [in]  pg_id                  The program group id.
-+ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose section count and sizes to get.
-+ *  \param [out] kernel_payload_desc    The section count and size for param-in/param-out/program terminal for the given kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ *          ia_err_data, if the section count is out of boundary.
-+ */
-+ia_err ia_p2p_get_kernel_payload_section_desc(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    ia_p2p_payload_section_desc* kernel_payload_desc);
-+
-+/*!
-+ *  Encodes data for a single kernel in a parameter terminal.
-+ *
-+ *  \param [in]     ia_p2p              IA_P2P instance handle.
-+ *  \param [in]     pg_id               The program group id.
-+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
-+ *  \param [in,out] terminal            The parameter terminal.
-+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
-+ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_param_in_terminal_encode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    ia_css_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    unsigned int payload_base_offset);
-+
-+/*!
-+ *  Initializes the program terminal sequencer with fragment information.
-+ *
-+ *  \param [in]     ia_p2p                  IA_P2P instance handle.
-+ *  \param [in]     pg_id                   The program group id.
-+ *  \param [in]     fragment_count          The number of fragments.
-+ *  \param [in]     pixel_fragment_descs    An array of fragment descriptors, one for each fragment.
-+ *  \param [in,out] terminal                The program terminal.
-+ */
-+ia_err ia_p2p_program_terminal_init(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_css_program_terminal_t* terminal);
-+
-+/*!
-+ *  Initializes the program terminal sequencer with fragment information.
-+ *
-+ *  \param [in]     ia_p2p                  IA_P2P instance handle.
-+ *  \param [in]     pg_id                   The program group id.
-+ *  \param [in]     configuration           Fragment configuration calculated with ia_p2p_calculate_fragments().
-+ *  \param [in,out] terminal                The program terminal.
-+ */
-+ia_err ia_p2p_program_terminal_init_v2(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    const ia_p2p_fragment_configuration_t* configuration,
-+    ia_css_program_terminal_t* terminal);
-+
-+/*!
-+ *  Encodes data for a single kernel in a program terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
-+ *  \param [in,out] terminal                        The program terminal.
-+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
-+ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
-+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_program_terminal_encode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_css_program_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned int total_section_count,
-+    unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    unsigned int payload_base_offset);
-+
-+/*!
-+ *  Encodes data for a single kernel in a spatial param input terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
-+ *  \param [in,out] terminal                        The spatial param input terminal.
-+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
-+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_in_terminal_encode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    unsigned int payload_base_offset);
-+
-+/*!
-+ *  Encodes data for a single kernel in a spatial param output terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
-+ *  \param [in,out] terminal                        The spatial param output terminal.
-+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
-+ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_out_terminal_prepare(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned int payload_buffer_size,
-+    unsigned int payload_base_offset);
-+
-+/*!
-+ *  Decodes spatial parameter data for a single kernel from a spatial param output terminal.
-+ *
-+ *  \param [in]     ia_p2p              IA_P2P instance handle.
-+ *  \param [in]     pg_id               The program group id.
-+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
-+ *  \param [in]     terminal            The spatial param output terminal.
-+ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
-+ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
-+ *  \param [in,out] cache_buffer        A pointer to the cache buffer for storing the cached outputs.
-+ *                                      The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_out_terminal_decode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    void* cache_buffer);
-+
-+/*!
-+*  Decodes spatial parameter data for a single kernel from a spatial param output terminal with fragment information.
-+*
-+*  \param [in]     ia_p2p               IA_P2P instance handle.
-+*  \param [in]     pg_id                The program group id.
-+*  \param [in]     kernel_id            The program group specific identifier of the kernel to decode.
-+*  \param [in]     fragments_count      To apply offsets to subsequent fragments.
-+*  \param [in]     pixel_fragment_descs Pixel fragment descriptors that were used when encoding current frame.
-+*  \param [in]     terminal             The spatial param output terminal.
-+*  \param [in]     section_index        The index of the first section where the data for this kernel is available in the terminal.
-+*  \param [in]     payload_buffer       A pointer to the beginning of the payload buffer.
-+*  \param [in]     payload_buffer_size  The total size of the given payload buffer, in bytes.
-+*  \param [in,out] cache_buffer         A pointer to the cache buffer for storing the cached outputs.
-+*                                       The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
-+*
-+*
-+*  \return ia_err_none, if no errors.
-+*          ia_err_argument, if the arguments are invalid.
-+*/
-+ia_err ia_p2p_spatial_param_out_terminal_decode_v2(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragments_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    void* cache_buffer);
-+
-+/*!
-+ *  Prepares payload for a single kernel in a parameter output terminal.
-+ *
-+ *  \param [in]     ia_p2p              IA_P2P instance handle.
-+ *  \param [in]     pg_id               The program group id.
-+ *  \param [in]     kernel_id           The program group specific identifier of the kernel whose descriptors to prepare.
-+ *  \param [in]     fragment_count      The number of fragments.
-+ *  \param [in,out] terminal            The param output terminal.
-+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
-+ *  \param [in]     payload_buffer_size The total size of the payload buffer, in bytes.
-+ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_param_out_terminal_prepare(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    ia_css_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned int total_section_count,
-+    unsigned int payload_buffer_size,
-+    unsigned int payload_base_offset);
-+
-+/*!
-+ *  Decodes param out data for a single kernel in a parameter output terminal.
-+ *
-+ *  \param [in]     ia_p2p              IA_P2P instance handle.
-+ *  \param [in]     pg_id               The program group id.
-+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
-+ *  \param [in]     fragment_count      The number of fragments.
-+ *  \param [in]     terminal            The param output terminal.
-+ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
-+ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
-+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
-+ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_param_out_terminal_decode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    const ia_css_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned int total_section_count,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size);
-+
-+/*!
-+ *  Returns the size of kernel user parameters for all the kernels in the given Program Group.
-+ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
-+ *  instead of firmware.
-+ *
-+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
-+ *  \param [in]  pg_id                  The program group id.
-+ *  \param [in]  fragment_count         The number of fragments.
-+ *  \param [out] user_parameter_size    Size of the kernel user parameters in the given PG.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_get_kernel_user_parameter_size(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    unsigned int* user_parameter_size);
-+
-+/*!
-+ *  Returns the size of kernel user parameters descriptor and payload size separately for the
-+ *  parambin generation purpose.
-+ *
-+ *  \param [in]  ia_p2p                 IA_P2P instance handle.
-+ *  \param [in]  pg_id                  The program group id.
-+ *  \param [in]  fragment_count         The number of fragments.
-+ *  \param [out] kup_desc_size          Size of the kernel user parameter descriptor for a given PG
-+ *  \param [out] kup_payload_size       Size of the kernel user parameter payload for a given PG.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_get_kup_desc_and_payload_size(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    unsigned int* kup_desc_size,
-+    unsigned int* kup_payload_size);
-+
-+/*!
-+ *  Initializes the Program Group with kernel specific user parameters.
-+ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
-+ *  instead of firmware.
-+ *
-+ *  \param [in]     ia_p2p                   IA_P2P instance handle.
-+ *  \param [in]     pg_id                    The program group id.
-+ *  \param [in]     fragment_count           The number of fragments.
-+ *  \param [in]     pixel_fragment_descs     An array of fragment descriptors, one for each fragment.
-+ *  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
-+ */
-+ia_err ia_p2p_get_kernel_user_parameters(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_desc* pixel_fragment_descs,
-+    unsigned char* user_parameters);
-+
-+/*!
-+*  Initializes the Program Group with kernel specific user parameters.
-+*  This is used in VP-less environment where some of the parameter calculation is done in P2P
-+*  instead of firmware.
-+*
-+*  \param [in]     ia_p2p                   IA_P2P instance handle.
-+*  \param [in]     pg_id                    The program group id.
-+*  \param [in]     fragment_count           The number of fragments.
-+*  \param [in]     frag_configuration       Fragment configuration calculated with ia_p2p_calculate_fragments().
-+*  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
-+*/
-+ia_err ia_p2p_get_kernel_user_parameters_v2(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    unsigned int fragment_count,
-+    const ia_p2p_fragment_configuration_t* frag_configuration,
-+    unsigned char* user_parameters);
-+
-+/*!
-+ * \brief Get version.
-+ * Get version from version header.
-+ *
-+ * \return                                  Version string.
-+ */
-+const char* ia_p2p_get_version(void);
-+
-+/*!
-+*  Decodes kernel user parameters for all kernels in the program group.
-+*  The result is printout of each parameter.
-+*
-+*  \param [in]     ia_p2p                   IA_P2P instance handle.
-+*  \param [in]     pg_id                    The program group id.
-+*  \param [in]     kup_descriptor           The kernel user parameter payload layout information.
-+*  \param [in]     payload_buffer           Kernel user parameter binary.
-+*/
-+ia_err ia_p2p_decode_kup(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    const unsigned char* kup_descriptor,
-+    const unsigned char* payload_buffer);
-+
-+
-+#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
-+/*!
-+ *  Decodes data for a single kernel in a parameter terminal.
-+ *
-+ *  \param [in]     ia_p2p              IA_P2P instance handle.
-+ *  \param [in]     pg_id               The program group id.
-+ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
-+ *  \param [in,out] terminal            The parameter terminal.
-+ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
-+ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
-+ *  \param [out]    public_data_out     A structure for the public data output.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_param_in_terminal_decode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    const ia_css_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    ia_p2p_public_data_t* public_data_out);
-+
-+/*!
-+ *  Encodes data for a single kernel in a program terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in,out] terminal                        The program terminal.
-+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
-+ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
-+ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
-+ *  \param [out]    public_data_out                 A structure for the decoded output.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_program_terminal_decode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    ia_css_program_terminal_t* terminal,
-+    unsigned int section_index,
-+    unsigned int total_section_count,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    ia_p2p_public_data_t* public_data_out);
-+
-+/*!
-+ *  Decodes fragment grid descriptors for a single kernel from a spatial param input terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in]     terminal                        The spatial param input terminal.
-+ *  \param [in]     public_data_out                 A structure for the decoded output.
-+ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    ia_p2p_public_data_t* public_data_out,
-+    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
-+
-+/*!
-+ *  Decodes spatial parameter data for a single kernel from a spatial param input terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
-+ *  \param [in]     terminal                        The spatial param input terminal.
-+ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
-+ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
-+ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
-+ *  \param [in,out] public_data_out                 A structure for the decoded output.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_in_terminal_decode(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    unsigned int section_index,
-+    const unsigned char* payload_buffer,
-+    unsigned int payload_buffer_size,
-+    ia_p2p_public_data_t* public_data_out);
-+
-+/*!
-+ *  Decodes fragment grid descriptors for a single kernel from a spatial param output terminal.
-+ *
-+ *  \param [in]     ia_p2p                          IA_P2P instance handle.
-+ *  \param [in]     pg_id                           The program group id.
-+ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
-+ *  \param [in]     fragment_count                  The number of fragments.
-+ *  \param [in]     terminal                        The spatial param output terminal.
-+ *  \param [in]     public_data_out                 A structure for the decoded output.
-+ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
-+ *
-+ *  \return ia_err_none, if no errors.
-+ *          ia_err_argument, if the arguments are invalid.
-+ */
-+ia_err ia_p2p_spatial_param_out_terminal_decode_grid_descriptors(
-+    ia_p2p_handle ia_p2p,
-+    uint32_t pg_id,
-+    uint32_t kernel_id,
-+    unsigned int fragment_count,
-+    ia_css_spatial_param_terminal_t* terminal,
-+    ia_p2p_public_data_t* public_data_out,
-+    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
-+
-+#endif
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_P2P_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
-new file mode 100644
-index 000000000000..d5f3d44dd97d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
-@@ -0,0 +1,221 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*!
-+ * \file ia_p2p_types.h
-+ * \brief Declares public2private interface data types.
-+ */
-+
-+#ifndef IA_P2P_TYPES_H_
-+#define IA_P2P_TYPES_H_
-+
-+#include <stdint.h>
-+
-+#include "ia_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*!
-+ * Max section count for each kernel
-+ */
-+#define MAX_NUM_SECTIONS_PER_KERNEL 20
-+
-+/*!
-+ * Max number of Algo kernels associated with a HW device
-+ */
-+#define MAX_NUM_ASSOCIATED_PALS_PER_DEVICE 5
-+
-+/*!
-+ *  P2P instance handle type.
-+ */
-+typedef struct ia_p2p_t* ia_p2p_handle;
-+
-+/*!
-+ *  Platform identifier.
-+ */
-+typedef enum
-+{
-+    IA_P2P_PLATFORM_BXT_A0,
-+    IA_P2P_PLATFORM_BXT_B0,
-+    IA_P2P_PLATFORM_CNL_A0,
-+    IA_P2P_PLATFORM_CNL_B0,
-+    IA_P2P_PLATFORM_GLV_A0,
-+    IA_P2P_PLATFORM_IPU6,
-+} ia_p2p_platform_t;
-+
-+#define IA_P2P_MAX_FRAGMENTS       10
-+#define IA_P2P_MAX_KERNELS_PER_PG  128
-+
-+/*!
-+ *  Fragment descriptor.
-+ */
-+typedef struct
-+{
-+    uint16_t fragment_width;    /*!< The width of the fragment. */
-+    uint16_t fragment_height;   /*!< The height of the fragment. */
-+    uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
-+    uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
-+} ia_p2p_fragment_desc;
-+
-+/*!
-+ *  Fragment requirements.
-+ */
-+typedef struct
-+{
-+    uint8_t input_bpe;    /*!< The input bits per element. */
-+    uint8_t output_bpe;   /*!< The output bits per element. */
-+} ia_p2p_fragment_reqs;
-+
-+/*!
-+ *  Full fragmentation configuration for a program group.
-+ */
-+typedef struct
-+{
-+    unsigned int fragment_count;
-+    ia_p2p_fragment_desc pixel_fragment_descs[IA_P2P_MAX_KERNELS_PER_PG][IA_P2P_MAX_FRAGMENTS];
-+} ia_p2p_fragment_configuration_t;
-+
-+/*!
-+ *  Structure for terminal requirements, specifying the number of sections required for each terminal type.
-+ */
-+typedef struct
-+{
-+    unsigned int param_in_section_count;                        /*!< The number of parameter input sections required. */
-+    unsigned int param_out_section_count_per_fragment;          /*!< The number of parameter output sections required per fragment. */
-+    unsigned int program_section_count_per_fragment;            /*!< The number of program sections required per fragment. */
-+    unsigned int spatial_param_in_section_count;                /*!< The number of spatial param input sections required. */
-+    unsigned int spatial_param_out_section_count;               /*!< The number of spatial param output sections required. */
-+} ia_p2p_terminal_requirements_t;
-+
-+/*!
-+ *  Payload descriptor specifying the total size of payload required for each terminal type.
-+ */
-+typedef struct
-+{
-+    uint32_t param_in_payload_size;             /*!< The total size of the parameter input payload in bytes. */
-+    uint32_t param_out_payload_size;            /*!< The total size of the parameter output payload in bytes. */
-+    uint32_t program_payload_size;              /*!< The total size of the program payload in bytes. */
-+    uint32_t spatial_param_in_payload_size;     /*!< The total size of the spatial param input payload in bytes. */
-+    uint32_t spatial_param_out_payload_size;    /*!< The total size of the spatial param output payload in bytes. */
-+} ia_p2p_payload_desc;
-+
-+/*!
-+ *  Payload descriptor specifying the count and size of payload required for each terminal type.
-+ */
-+typedef struct
-+{
-+    uint32_t param_in_section_count;                              /*!< The count of parameter input sections. */
-+    uint32_t param_out_section_count;                             /*!< The count of parameter output sections (per fragment). */
-+    uint32_t program_section_count;                               /*!< The count of program sections (per fragment). */
-+    uint32_t param_in_section_size[MAX_NUM_SECTIONS_PER_KERNEL];  /*!< The size of the parameter input section in bytes. */
-+    uint32_t param_out_section_size[MAX_NUM_SECTIONS_PER_KERNEL]; /*!< The size of the parameter output section in bytes. */
-+    uint32_t program_section_size[MAX_NUM_SECTIONS_PER_KERNEL];   /*!< The size of the program section in bytes. */
-+} ia_p2p_payload_section_desc;
-+/*!
-+ *  Flags for available serialized statistics.
-+ */
-+typedef struct
-+{
-+    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
-+    bool af_grid;            /*!< If true, AF grid is available. */
-+    bool histograms;         /*!< If true, histograms are available. */
-+    bool dvs_stats;          /*!< If true, DVS statistics are available. */
-+    bool paf_grid;           /*!< If true, PAF grid is available. */
-+    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
-+    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
-+    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
-+} ia_p2p_statistics_included_t;
-+
-+/* Currently supported program groups. */
-+#define IA_P2P_PG_ISYS                       0       /* No manifest available so we define a custom PG specification id for ISYS. */
-+#define IA_P2P_PG_VPOSTGDC                   114     /* IA_CSS_BXT_PSS_PG_SPECIFICATION_VPOSTGDC */
-+#define IA_P2P_PG_VPREGDC                    116     /* Deprecated */
-+#define IA_P2P_PG_SPREGDC                    117     /* Deprecated */
-+#define IA_P2P_PG_SPOSTGDC                   118
-+#define IA_P2P_PG_ISL                        120     /* Deprecated */
-+#define IA_P2P_PG_VHDR_PREPROC               121     /* Deprecated */
-+#define IA_P2P_PG_VPREGDC_HQ                 122
-+#define IA_P2P_PG_VPREGDC_HQ_VCR2            148
-+#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   156
-+#define IA_P2P_PG_SPREGDC_XNR                125     /* Deprecated */
-+#define IA_P2P_PG_SPREGDC_XNR_V2             131
-+#define IA_P2P_PG_SPREGDC_XNR_V3             136
-+#define IA_P2P_PG_SPOSTGDC_IN8               152
-+#define IA_P2P_PG_SPOSTGDC_V4                161     /* For SV usage only */
-+#define IA_P2P_PG_SPOSTGDC_IN8_V4            162
-+#define IA_P2P_PG_SPREGDC_XNR_V2_VCR2        149
-+#define IA_P2P_PG_SPREGDC_XNR_V3_VCR2        150
-+#define IA_P2P_PG_ISL_PS_HIRES               127
-+#define IA_P2P_PG_ISL_PS_INPUT_CROP          127
-+#define IA_P2P_PG_ISL_PS_RGBIR               130
-+#define IA_P2P_PG_ISL_RGBIR_VPREGDC_HQ_VCR2  158
-+#define IA_P2P_PG_SPOSTGDC_V2                128
-+#define IA_P2P_PG_SPOSTGDC_V2_MBR            173
-+#define IA_P2P_PG_VPOSTGDC_V2                129
-+#define IA_P2P_PG_VPOSTGDC_V2_MBR            172
-+#define IA_P2P_PG_VPOSTGDC_MBR               132
-+#define IA_P2P_PG_SPOSTGDC_MBR               133
-+#define IA_P2P_PG_IPU5_SPOSTGDC_10BIT        197
-+#define IA_P2P_PG_POWERON                    201     /* Deprecated */
-+#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ        137
-+#define IA_P2P_PG_ISL_PS_GLV                 138
-+#define IA_P2P_PG_ISL_PS_GLV_V2              155
-+#define IA_P2P_PG_DFM_ISL_PS_GLV_VPLESS      166     /* To be removed, leaved here to simplify integration (referenced by libiacss) */
-+#define IA_P2P_PG_ISL_PS_GLV_VPLESS          166
-+#define IA_P2P_PG_ISA_LB_GLV_VPLESS          194
-+#define IA_P2P_PG_IPU5_VPREGDC_VPLESS        167
-+#define IA_P2P_PG_IPU5_SPREGDC_VPLESS        168
-+#define IA_P2P_PG_IPU5_VPOSTGDC_V1           151
-+#define IA_P2P_PG_IPU5_VPOSTGDC_V4           169
-+#define IA_P2P_PG_IPU5_VPOSTGDC_V4_HDR10     193 /* TODO: Remove after merge. Here just to avoid two-way dependency to libiacss */
-+#define IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT     193
-+#define IA_P2P_PG_IPU6_LB_PSA_BYPASS         182
-+#define IA_P2P_PG_IPU6_LB_PSA                183
-+#define IA_P2P_PG_IPU6_ISL_RBM               185
-+#define IA_P2P_PG_IPU6_ISA_LB                187
-+#define IA_P2P_PG_IPU6_BB_OFS                188
-+#define IA_P2P_PG_IPU6_BB                    189
-+#define IA_P2P_PG_IPU6_BB_OFS_GDC            196
-+#define IA_P2P_PG_IPU6S_ISA                  198
-+#define IA_P2P_PG_VPREGDC_HQ_NS              1000    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS */
-+#define IA_P2P_PG_VPOSTGDC_HQ_NS             1001    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS */
-+#define IA_P2P_PG_VPREGDC_HP                 1002    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP */
-+#define IA_P2P_PG_VPOSTGDC_HP                1003    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HP */
-+#define IA_P2P_PG_VPREGDC_LL                 1004    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_LL */
-+#define IA_P2P_PG_VHDR_PREPROC_V2            1005    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREPROC_V2 */
-+#define IA_P2P_PG_VPREGDC_HQ_NS_DVS          1007    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS_DVS */
-+#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        1008    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS2 */
-+#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        1009    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS3 */
-+#define IA_P2P_PG_VPREGDC_HP_2FR             1010    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_2FR */
-+#define IA_P2P_PG_VPOSTGDC_HQ_4K             1011    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_4K */
-+#define IA_P2P_PG_VPREGDC_ISL_HQ_4K          1012    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_ISL_HQ_4K */
-+#define IA_P2P_PG_VHDR_PREPROC_STATS_HP      1013    /* A_CSS_PROGRAM_GROUP_ID_VHDRPREPROC_STATS_HP */
-+#define IA_P2P_PG_VPREGDC_HP_DRC             1014    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_DRC */
-+#define IA_P2P_PG_VHDR_PREGDC_HP             1015    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP */
-+#define IA_P2P_PG_VHDR_PREGDC_HP_DRC2        1016    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_DRC2 */
-+#define IA_P2P_PG_VHDR_PREGDC_HP_2FR_V2      1017    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_2FR_V2 */
-+#define IA_P2P_PG_YUYV_SCALE                 1051    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_SCALE */
-+#define IA_P2P_PG_YUV_CSC                    1052    /* IA_CSS_PROGRAM_GROUP_ID_YUV_CSC */
-+#define IA_P2P_PG_YUYV_LDC                   1053    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_LDC */
-+#define IA_P2P_PG_TEST                       1       /* For internal P2P testing. */
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_P2P_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
-new file mode 100644
-index 000000000000..db7bdb595798
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
-@@ -0,0 +1,27 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#if defined _WIN32 && defined BUILD_SHARED_LIBS
-+#if defined BROXTON_IA_PAL_EXPORTS || defined broxton_ia_pal_EXPORTS
-+#define IA_PAL_API __declspec(dllexport)
-+#else
-+#define IA_PAL_API __declspec(dllimport)
-+#endif
-+#else
-+#define IA_PAL_API
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
-new file mode 100644
-index 000000000000..2fbc76c0c908
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef IA_PAL_TYPES_ISP_H_
-+#define IA_PAL_TYPES_ISP_H_
-+
-+#ifdef __cplusplus
-+extern "C"{
-+#endif
-+
-+/*!
-+ * \brief Common header for all PAL output data structures.
-+ */
-+typedef struct
-+{
-+    int uuid;                   /*!< UUID of PAL output. Indicates, which ISP block configuration this record contains. */
-+    int size;                   /*!< Size of PAL output for a particular kernel. */
-+    bool update;                /*!< Flag indicating if PAL calculations updated results. */
-+    char enable;                /*!< Three-state kernel enable (passthrough, enable, disable) */
-+    unsigned int run_time_diff; /*!< Time difference since these PAL results were previously calculated. */
-+    unsigned short width;       /*!< Input width of frame for this ISP block. */
-+    unsigned short height;      /*!< Input height of frame for this ISP block. */
-+} ia_pal_record_header;
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* IA_PAL_TYPES_ISP_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
-new file mode 100644
-index 000000000000..c4f5fe069f29
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
-@@ -0,0 +1,360 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once

-+#include <stdint.h>

-+#include <memory.h>

-+

-+#ifdef __cplusplus

-+extern "C"{

-+#endif

-+

-+typedef enum

-+{

-+    ia_pal_uuid_isp_acm_1_1 = 13026,

-+    ia_pal_uuid_isp_aestatistics_2_0 = 26055,

-+    ia_pal_uuid_isp_aestatistics_2_1 = 55073,

-+    ia_pal_uuid_isp_af_awb_frstatistics_2_0 = 13395,

-+    ia_pal_uuid_isp_awbstatistics_2_0 = 33260,

-+    ia_pal_uuid_isp_b2i_bnr_1_0 = 8682,

-+    ia_pal_uuid_isp_b2i_dm_1_0 = 64138,

-+    ia_pal_uuid_isp_b2i_ds_1_0_0 = 10497,

-+    ia_pal_uuid_isp_b2i_ds_1_0_1 = 20739,

-+    ia_pal_uuid_isp_b2i_sie_1_0 = 58817,

-+    ia_pal_uuid_isp_b2i_sie_1_1 = 42944,

-+    ia_pal_uuid_isp_bnlm_3_0 = 41108,

-+    ia_pal_uuid_isp_bnlm_3_1 = 2748,

-+    ia_pal_uuid_isp_bnlm_3_2 = 48964,

-+    ia_pal_uuid_isp_bnlm_3_3 = 21777,

-+    ia_pal_uuid_isp_burst_isp = 11827,

-+    ia_pal_uuid_isp_bxt_3a_ccm = 15593,

-+    ia_pal_uuid_isp_bxt_acm = 13506,

-+    ia_pal_uuid_isp_bxt_aestatistics = 21985,

-+    ia_pal_uuid_isp_bxt_af_awb_fr_statistics = 21650,

-+    ia_pal_uuid_isp_bxt_applycorrection = 45482,

-+    ia_pal_uuid_isp_bxt_awbstatistics = 10104,

-+    ia_pal_uuid_isp_bxt_blc = 11700,

-+    ia_pal_uuid_isp_bxt_blc_b = 26932,

-+    ia_pal_uuid_isp_bxt_blc_c = 18168,

-+    ia_pal_uuid_isp_bxt_bnlm = 54605,

-+    ia_pal_uuid_isp_bxt_ccm = 16559,

-+    ia_pal_uuid_isp_bxt_convert16sto8u = 48932,

-+    ia_pal_uuid_isp_bxt_cropstills = 34611,

-+    ia_pal_uuid_isp_bxt_cropvideo = 42997,

-+    ia_pal_uuid_isp_bxt_csc = 31704,

-+    ia_pal_uuid_isp_bxt_csc_yuv2rgb = 1391,

-+    ia_pal_uuid_isp_bxt_csc2 = 39659,

-+    ia_pal_uuid_isp_bxt_demosaic = 48695,

-+    ia_pal_uuid_isp_bxt_disparity = 55093,

-+    ia_pal_uuid_isp_bxt_dpc = 23342,

-+    ia_pal_uuid_isp_bxt_dpcm_decode = 16046,

-+    ia_pal_uuid_isp_bxt_dpcm_encode = 11653,

-+    ia_pal_uuid_isp_bxt_dvsstatistics = 10794,

-+    ia_pal_uuid_isp_bxt_gammatm = 44304,

-+    ia_pal_uuid_isp_bxt_gridbaseob = 46517,

-+    ia_pal_uuid_isp_bxt_gridbaseob_b = 28979,

-+    ia_pal_uuid_isp_bxt_gridbaseob_c = 18935,

-+    ia_pal_uuid_isp_bxt_inputscaler = 29163,

-+    ia_pal_uuid_isp_bxt_inputscalerv2 = 10913,

-+    ia_pal_uuid_isp_bxt_isl_inputcrop = 42521,

-+    ia_pal_uuid_isp_bxt_linearization = 33288,

-+    ia_pal_uuid_isp_bxt_lsc = 53711,

-+    ia_pal_uuid_isp_bxt_norm_lin = 64791,

-+    ia_pal_uuid_isp_bxt_norm_lin_b = 1034,

-+    ia_pal_uuid_isp_bxt_norm_lin_c = 20905,

-+    ia_pal_uuid_isp_bxt_ofa_dp = 18729,

-+    ia_pal_uuid_isp_bxt_ofa_mp = 5232,

-+    ia_pal_uuid_isp_bxt_ofa_ppp = 19509,

-+    ia_pal_uuid_isp_bxt_paddingsupport = 65094,

-+    ia_pal_uuid_isp_bxt_pafstatistics = 21380,

-+    ia_pal_uuid_isp_bxt_pixelformatter = 15205,

-+    ia_pal_uuid_isp_bxt_pixprecadapter = 15868,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_postvcr = 64780,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_precropstills = 29575,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo = 13533,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_precsc2 = 60774,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_pregdc = 12215,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_prevcud = 23002,

-+    ia_pal_uuid_isp_bxt_pixprecadapter_prewb = 20178,

-+    ia_pal_uuid_isp_bxt_rynr_collector = 28476,

-+    ia_pal_uuid_isp_bxt_rynr_splitter = 61356,

-+    ia_pal_uuid_isp_bxt_shift14to16bit = 49150,

-+    ia_pal_uuid_isp_bxt_tnr5v1 = 43225,

-+    ia_pal_uuid_isp_bxt_vcr = 21834,

-+    ia_pal_uuid_isp_bxt_vcr2 = 5194,

-+    ia_pal_uuid_isp_bxt_vcsc = 60680,

-+    ia_pal_uuid_isp_bxt_vcsc_stills = 21171,

-+    ia_pal_uuid_isp_bxt_vcsc_video = 11176,

-+    ia_pal_uuid_isp_bxt_vcud = 17897,

-+    ia_pal_uuid_isp_bxt_wb = 32398,

-+    ia_pal_uuid_isp_bxt_wb_stills = 47444,

-+    ia_pal_uuid_isp_bxt_xnr4_m = 19837,

-+    ia_pal_uuid_isp_bxt_xnr4_mh = 47865,

-+    ia_pal_uuid_isp_call_info = 28030,

-+    ia_pal_uuid_isp_cas_1_0 = 22660,

-+    ia_pal_uuid_isp_ccm_3a_2_0 = 62344,

-+    ia_pal_uuid_isp_comp_spliter = 35257,

-+    ia_pal_uuid_isp_compand_1_0 = 35311,

-+    ia_pal_uuid_isp_crop_sis = 12166,

-+    ia_pal_uuid_isp_cvt_1_0 = 5505,

-+    ia_pal_uuid_isp_debug_info = 12967,

-+    ia_pal_uuid_isp_decompand_1_0 = 55624,

-+    ia_pal_uuid_isp_dehaze_1_0 = 58873,

-+    ia_pal_uuid_isp_dma_cropper_dp = 47638,

-+    ia_pal_uuid_isp_dma_cropper_mp = 27230,

-+    ia_pal_uuid_isp_dma_cropper_ppp = 49162,

-+    ia_pal_uuid_isp_dol_1_0 = 11842,

-+    ia_pal_uuid_isp_dol_2_0 = 11890,

-+    ia_pal_uuid_isp_dol_mapper = 17361,

-+    ia_pal_uuid_isp_dol_parser = 44843,

-+    ia_pal_uuid_isp_dpc_1_1 = 51918,

-+    ia_pal_uuid_isp_dpc_1_3 = 23488,

-+    ia_pal_uuid_isp_dpc_2_0 = 5679,

-+    ia_pal_uuid_isp_drc_1 = 29204,

-+    ia_pal_uuid_isp_drc_2 = 4091,

-+    ia_pal_uuid_isp_ds_dynamic = 8249,

-+    ia_pal_uuid_isp_dvsstatistics_2 = 37235,

-+    ia_pal_uuid_isp_espa_1_0 = 47319,

-+    ia_pal_uuid_isp_espa_1_1 = 41663,

-+    ia_pal_uuid_isp_espa_isa_bayer_a = 1326,

-+    ia_pal_uuid_isp_espa_isa_ir_md = 37592,

-+    ia_pal_uuid_isp_espa_isa_sis_a = 59281,

-+    ia_pal_uuid_isp_espa_isa_sis_b = 52347,

-+    ia_pal_uuid_isp_espa_isa_wb = 63427,

-+    ia_pal_uuid_isp_espa_isa_yuv_a = 33409,

-+    ia_pal_uuid_isp_espa_isa_yuv_b = 58945,

-+    ia_pal_uuid_isp_espa_isa_yuv_c = 45072,

-+    ia_pal_uuid_isp_espa_psa_1 = 11719,

-+    ia_pal_uuid_isp_espa_psa_4 = 36228,

-+    ia_pal_uuid_isp_espa_psa_5 = 33315,

-+    ia_pal_uuid_isp_espa_psa_c = 41410,

-+    ia_pal_uuid_isp_espa_psa_d = 19387,

-+    ia_pal_uuid_isp_espa_psa_e = 40191,

-+    ia_pal_uuid_isp_espa_psa_f = 56948,

-+    ia_pal_uuid_isp_espa_psa_g = 17153,

-+    ia_pal_uuid_isp_espa_psa_h = 11266,

-+    ia_pal_uuid_isp_exy = 35008,

-+    ia_pal_uuid_isp_fr_grid_1_0 = 26958,

-+    ia_pal_uuid_isp_gammastar_1 = 42751,

-+    ia_pal_uuid_isp_gammatm_v3 = 57496,

-+    ia_pal_uuid_isp_gd_dpc_2_1 = 22642,

-+    ia_pal_uuid_isp_gdc3 = 14376,

-+    ia_pal_uuid_isp_gdc3_1 = 15925,

-+    ia_pal_uuid_isp_gdc3_1_1 = 35089,

-+    ia_pal_uuid_isp_gdc4_2 = 55837,

-+    ia_pal_uuid_isp_gdc5 = 41165,

-+    ia_pal_uuid_isp_gdc7 = 12364,

-+    ia_pal_uuid_isp_gdc_sp = 44006,

-+    ia_pal_uuid_isp_glim_1_0 = 55620,

-+    ia_pal_uuid_isp_glim_2_0 = 36029,

-+    ia_pal_uuid_isp_gltm_1_0 = 60649,

-+    ia_pal_uuid_isp_gltm_2_0 = 54721,

-+    ia_pal_uuid_isp_gmv_statistics_1_0 = 54420,

-+    ia_pal_uuid_isp_hdr_blc_1 = 40166,

-+    ia_pal_uuid_isp_hdr_pwldecomp_1 = 41666,

-+    ia_pal_uuid_isp_hdr_sqrtcomp_2 = 31478,

-+    ia_pal_uuid_isp_hdr_sqrtcomp_3 = 63941,

-+    ia_pal_uuid_isp_hdr_stitch_1w = 15195,

-+    ia_pal_uuid_isp_hdr_wb_1 = 23040,

-+    ia_pal_uuid_isp_hdrstats_1 = 23432,

-+    ia_pal_uuid_isp_is_odr_a = 11470,

-+    ia_pal_uuid_isp_is_odr_b = 55449,

-+    ia_pal_uuid_isp_is_odr_c = 50407,

-+    ia_pal_uuid_isp_gdc_fp_rifd_yuvn_regs = 18444,

-+    ia_pal_uuid_isp_gdc_sp_bodr_yuv4n_regs = 53835,

-+    ia_pal_uuid_isp_gdc_sp_rifd_yuv4n_regs = 53402,

-+    ia_pal_uuid_isp_ifd_gmv = 53572,

-+    ia_pal_uuid_isp_ifd_lsc = 47907,

-+    ia_pal_uuid_isp_ifd_pdaf = 37302,

-+    ia_pal_uuid_isp_ifd_pipe = 42612,

-+    ia_pal_uuid_isp_lbff_crop_espa = 4004,

-+    ia_pal_uuid_isp_odr_ae = 6313,

-+    ia_pal_uuid_isp_odr_af_std = 62075,

-+    ia_pal_uuid_isp_odr_af_sve = 54833,

-+    ia_pal_uuid_isp_odr_awb_sat = 49283,

-+    ia_pal_uuid_isp_odr_awb_std = 2174,

-+    ia_pal_uuid_isp_odr_awb_sve = 37370,

-+    ia_pal_uuid_isp_odr_burst_isp = 14707,

-+    ia_pal_uuid_isp_odr_cv = 61005,

-+    ia_pal_uuid_isp_odr_gmv_feature = 59716,

-+    ia_pal_uuid_isp_odr_gmv_match = 51196,

-+    ia_pal_uuid_isp_odr_ir = 35969,

-+    ia_pal_uuid_isp_odr_output_me = 11628,

-+    ia_pal_uuid_isp_odr_output_ps = 61310,

-+    ia_pal_uuid_isp_odr_pdaf = 53935,

-+    ia_pal_uuid_isp_ofs_dp_bodr_regs = 59297,

-+    ia_pal_uuid_isp_ofs_mp_bodr_regs = 42394,

-+    ia_pal_uuid_isp_ofs_pp_bodr_regs = 2519,

-+    ia_pal_uuid_isp_sdp_left_ifd = 49194,

-+    ia_pal_uuid_isp_sdp_right_ifd = 24589,

-+    ia_pal_uuid_isp_sdp_image_out0_odr = 53124,

-+    ia_pal_uuid_isp_sdp_image_pp_odr = 26203,

-+    ia_pal_uuid_isp_sdp_map_odr = 14789,

-+    ia_pal_uuid_isp_slim_tnr_fp_blend_bifd_yuvnm1_regs = 20364,

-+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_rs4nm1_regs = 44594,

-+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_yuv4nm1_regs = 50322,

-+    ia_pal_uuid_isp_slim_tnr_spatial_bifd_yuvn_regs = 2937,

-+    ia_pal_uuid_isp_tnr_fp_blend_bifd_rs4n_regs = 16783,

-+    ia_pal_uuid_isp_tnr_fp_bodr_yuvn_regs = 38223,

-+    ia_pal_uuid_isp_tnr_mc_fp_bifd_mv16n_regs = 64647,

-+    ia_pal_uuid_isp_tnr_mc_fp_rifd_yuvnm1_regs = 29456,

-+    ia_pal_uuid_isp_tnr_scale_fp_bodr_yuv4n_regs = 57717,

-+    ia_pal_uuid_isp_tnr_scale_sp_bifd_y4n_regs = 21311,

-+    ia_pal_uuid_isp_tnr_scale_sp_bodr_y16n_regs = 2778,

-+    ia_pal_uuid_isp_tnr_sp_bc_bifd_yuv4n_regs = 40140,

-+    ia_pal_uuid_isp_tnr_sp_bc_bodr_rs4n_regs = 11735,

-+    ia_pal_uuid_isp_tnr_sp_bc_bifd_mv16n_regs = 17714,

-+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16n_regs = 33626,

-+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16nm1_regs = 53417,

-+    ia_pal_uuid_isp_tnr_sp_mc1_rifd_y4nm1_regs = 59712,

-+    ia_pal_uuid_isp_tnr_sp_mc2_bifd_mv16n_regs = 57592,

-+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_rs4nm1_regs = 24719,

-+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_yuv4nm1_regs = 32735,

-+    ia_pal_uuid_isp_tnr_sp_rme_bifd_y4n_regs = 50769,

-+    ia_pal_uuid_isp_tnr_sp_rme_bodr_mv16n_regs = 3636,

-+    ia_pal_uuid_isp_visp_metadata_sodr_regs = 16898,

-+    ia_pal_uuid_isp_visp_pixels_bodr_regs = 19495,

-+    ia_pal_uuid_isp_irs_1_0 = 16993,

-+    ia_pal_uuid_isp_lca_1_0 = 25352,

-+    ia_pal_uuid_isp_ldr_blc_1 = 12439,

-+    ia_pal_uuid_isp_ldr_wb_1 = 8496,

-+    ia_pal_uuid_isp_linearization2_0 = 10326,

-+    ia_pal_uuid_isp_linearization2_0_b = 42416,

-+    ia_pal_uuid_isp_linearization2_0_c = 28552,

-+    ia_pal_uuid_isp_linearization2hdr = 19752,

-+    ia_pal_uuid_isp_linearizationdg_dss = 38566,

-+    ia_pal_uuid_isp_linearizationwb_dss = 41930,

-+    ia_pal_uuid_isp_lossycomp_1_0 = 62606,

-+    ia_pal_uuid_isp_lossydecomp_1_0 = 41948,

-+    ia_pal_uuid_isp_lsc_1_1 = 16882,

-+    ia_pal_uuid_isp_lsc_1_2 = 2144,

-+    ia_pal_uuid_isp_ltm_cd_1_0 = 53308,

-+    ia_pal_uuid_isp_ltm_de_gamma_1_0 = 43310,

-+    ia_pal_uuid_isp_ltm_fd_1_0 = 6516,

-+    ia_pal_uuid_isp_ltm_vrt_ctrl = 34560,

-+    ia_pal_uuid_isp_mas = 53441,

-+    ia_pal_uuid_isp_mrc_1_0 = 57534,

-+    ia_pal_uuid_isp_norm_lin_dss = 48425,

-+    ia_pal_uuid_isp_nrf_6_00 = 24924,

-+    ia_pal_uuid_isp_nv12reader = 27990,

-+    ia_pal_uuid_isp_nv12writer = 15697,

-+    ia_pal_uuid_isp_ofa_1_dp = 60197,

-+    ia_pal_uuid_isp_ofa_1_mp = 59839,

-+    ia_pal_uuid_isp_ofa_1_ppp = 53002,

-+    ia_pal_uuid_isp_ofa_2_dp = 18275,

-+    ia_pal_uuid_isp_ofa_2_mp = 16233,

-+    ia_pal_uuid_isp_ofa_2_ppp = 16427,

-+    ia_pal_uuid_isp_outputscaler_2_0_a = 6800,

-+    ia_pal_uuid_isp_outputscaler_2_0_b = 51856,

-+    ia_pal_uuid_isp_packer_isa_bayer_a = 13215,

-+    ia_pal_uuid_isp_packer_isa_yuv_a = 3683,

-+    ia_pal_uuid_isp_packer_isa_yuv_b = 5000,

-+    ia_pal_uuid_isp_packer_isa_yuv_c = 27259,

-+    ia_pal_uuid_isp_padder_bayer_a = 19728,

-+    ia_pal_uuid_isp_padder_yuv_a = 40136,

-+    ia_pal_uuid_isp_padder_yuv_b = 49213,

-+    ia_pal_uuid_isp_padder_yuv_c = 23317,

-+    ia_pal_uuid_isp_pafstatistics_1 = 47216,

-+    ia_pal_uuid_isp_pafstatistics_1_1 = 38817,

-+    ia_pal_uuid_isp_pext_1_0 = 43213,

-+    ia_pal_uuid_isp_pix_crop_ir_md = 54005,

-+    ia_pal_uuid_isp_pixcomp_1_0 = 4693,

-+    ia_pal_uuid_isp_pixelformatter = 41023,

-+    ia_pal_uuid_isp_pixelformatter_b = 54735,

-+    ia_pal_uuid_isp_pixelformatter_c = 3081,

-+    ia_pal_uuid_isp_pixprecadapter_post_sis = 53715,

-+    ia_pal_uuid_isp_pixprecadapter_s2v_c = 57170,

-+    ia_pal_uuid_isp_pixprecadapter_v2s_4 = 56918,

-+    ia_pal_uuid_isp_pme_1_0 = 51711,

-+    ia_pal_uuid_isp_pxl_crop_bayer_a = 34076,

-+    ia_pal_uuid_isp_pxl_crop_psa = 41874,

-+    ia_pal_uuid_isp_pxl_crop_sis_a = 38128,

-+    ia_pal_uuid_isp_pxl_crop_sis_b = 3437,

-+    ia_pal_uuid_isp_pxl_crop_yuv_a = 9082,

-+    ia_pal_uuid_isp_pxl_crop_yuv_b = 33476,

-+    ia_pal_uuid_isp_pxl_crop_yuv_c = 64756,

-+    ia_pal_uuid_isp_rgb_ir_2_0 = 14488,

-+    ia_pal_uuid_isp_rgb_ir_2_1 = 62955,

-+    ia_pal_uuid_isp_rgb_ir_2_1_bbb = 39657,

-+    ia_pal_uuid_isp_rgbs_grid_1_0 = 18844,

-+    ia_pal_uuid_isp_rgbs_statistics_1_0 = 39058,

-+    ia_pal_uuid_isp_sc_iefd = 2442,

-+    ia_pal_uuid_isp_sc_iefd_v2 = 7320,

-+    ia_pal_uuid_isp_sc_outputscaler_dp = 5852,

-+    ia_pal_uuid_isp_sc_outputscaler_dp_1_1 = 23205,

-+    ia_pal_uuid_isp_sc_outputscaler_ppp = 60118,

-+    ia_pal_uuid_isp_sc_outputscaler_ppp_1_1 = 52796,

-+    ia_pal_uuid_isp_sc_ylpf = 50844,

-+    ia_pal_uuid_isp_sdp_rec = 50882,

-+    ia_pal_uuid_isp_sdp_scp = 13630,

-+    ia_pal_uuid_isp_see = 15281,

-+    ia_pal_uuid_isp_see2 = 55908,

-+    ia_pal_uuid_isp_sharpening_1_0 = 25130,

-+    ia_pal_uuid_isp_sie_vcsc1_1 = 5286,

-+    ia_pal_uuid_isp_sis_1 = 1732,

-+    ia_pal_uuid_isp_sis_1_0_a = 44134,

-+    ia_pal_uuid_isp_sis_1_0_b = 7487,

-+    ia_pal_uuid_isp_spa_sis_a = 13401,

-+    ia_pal_uuid_isp_stream2mmio = 33280,

-+    ia_pal_uuid_isp_stream2mmio_b = 10400,

-+    ia_pal_uuid_isp_stream2mmio_c = 30373,

-+    ia_pal_uuid_isp_strm_crop_psa = 45913,

-+    ia_pal_uuid_isp_strm_crop_psa_c = 12123,

-+    ia_pal_uuid_isp_strm_crop_psa_d = 44733,

-+    ia_pal_uuid_isp_strm_crop_psa_e = 1739,

-+    ia_pal_uuid_isp_strm_crop_psa_f = 40056,

-+    ia_pal_uuid_isp_strm_crop_psa_g = 46549,

-+    ia_pal_uuid_isp_strm_crop_psa_h = 42698,

-+    ia_pal_uuid_isp_strm_crop_sis_a = 9544,

-+    ia_pal_uuid_isp_strm_crop_sis_b = 49322,

-+    ia_pal_uuid_isp_sve_1_0 = 11000,

-+    ia_pal_uuid_isp_sve_1_1 = 53103,

-+    ia_pal_uuid_isp_tnr_6_0 = 64565,

-+    ia_pal_uuid_isp_tnr_scale_lb = 33723,

-+    ia_pal_uuid_isp_tnr_scale_fp = 60056,

-+    ia_pal_uuid_isp_tnr_scale_sp = 44886,

-+    ia_pal_uuid_isp_tnr5_21 = 7824,

-+    ia_pal_uuid_isp_tnr5_22 = 21293,

-+    ia_pal_uuid_isp_tnr5_25 = 41522,

-+    ia_pal_uuid_isp_tnr5_3 = 35640,

-+    ia_pal_uuid_isp_tnr5_3_1 = 43630,

-+    ia_pal_uuid_isp_tnr7_bc_1_0 = 65198,

-+    ia_pal_uuid_isp_tnr7_blend_1_0 = 32696,

-+    ia_pal_uuid_isp_tnr7_cme_1_0 = 28470,

-+    ia_pal_uuid_isp_tnr7_ims_1_0 = 4720,

-+    ia_pal_uuid_isp_tnr7_mc_1_0 = 1886,

-+    ia_pal_uuid_isp_tnr_sp_mc2 = 43550,

-+    ia_pal_uuid_isp_tnr7_rme_1_0 = 8230,

-+    ia_pal_uuid_isp_tnr7_spatial_1_0 = 3133,

-+    ia_pal_uuid_isp_tvs_1_0 = 64291,

-+    ia_pal_uuid_isp_vcr_3_1 = 36035,

-+    ia_pal_uuid_isp_vcr3 = 32600,

-+    ia_pal_uuid_isp_vcsc_2_0 = 6086,

-+    ia_pal_uuid_isp_vcsc_2_0_b = 13708,

-+    ia_pal_uuid_isp_vcsc_2_0_c = 21802,

-+    ia_pal_uuid_isp_vertical_padding_1_0 = 54484,

-+    ia_pal_uuid_isp_vltm_1_0 = 20302,

-+    ia_pal_uuid_isp_wb_1_1 = 5144,

-+    ia_pal_uuid_isp_wb_sis = 1689,

-+    ia_pal_uuid_isp_x2i_md_1_0 = 59520,

-+    ia_pal_uuid_isp_xnr_5_1 = 40137,

-+    ia_pal_uuid_isp_xnr_5_2 = 58858,

-+    ia_pal_uuid_isp_xnr_dss = 42418,

-+

-+} ia_pal_uuid;

-+

-+#ifdef __cplusplus

-+}

-+#endif

-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
-new file mode 100644
-index 000000000000..a89fd0efc0c6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
-@@ -0,0 +1,16093 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once

-+#include <stdint.h>

-+#include <memory.h>

-+

-+#ifdef __cplusplus

-+extern "C"{

-+#endif

-+

-+

-+/*! \isp struct acm_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< enable_chroma_lut Enable Chroma adaptation by LUT*/

-+    int32_t enable_chroma_lut;

-+    /*!< enable_luma_lut Enable Luma adaptation by LUT*/

-+    int32_t enable_luma_lut;

-+    /*!< enable_negative_pixels enable negative pixels in output*/

-+    int32_t enable_negative_pixels;

-+    /*!< enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/

-+    int32_t enable_chroma_low_light_mode;

-+    /*!< enable_luma_low_light_mode Enable Luma adaptation in low light mode*/

-+    int32_t enable_luma_low_light_mode;

-+    /*!< num_of_sectors number of sectors, U5.0*/

-+    int32_t num_of_sectors;

-+    /*!< chromagrid2uniformlut_cu_x[9] U12.0*/

-+    int32_t chromagrid2uniformlut_cu_x[9];

-+    /*!< chromagrid2uniformlut_cu_a[8] S4.10*/

-+    int32_t chromagrid2uniformlut_cu_a[8];

-+    /*!< lumagrid2uniformlut_cu_x[9] U12.0*/

-+    int32_t lumagrid2uniformlut_cu_x[9];

-+    /*!< lumagrid2uniformlut_cu_a[8] S4.10*/

-+    int32_t lumagrid2uniformlut_cu_a[8];

-+    /*!< ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/

-+    int32_t ccm_matrix_arr[216];

-+    /*!< hue_boundary_arr[24] Table of sectors boundaries, U11.0*/

-+    int32_t hue_boundary_arr[24];

-+    /*!< ccm_index_arr[25] Table of the sectors indices, U5.0*/

-+    int32_t ccm_index_arr[25];

-+    /*!< offr CCM bias for R, S13.0*/

-+    int32_t offr;

-+    /*!< offg CCM bias for G, S13.0*/

-+    int32_t offg;

-+    /*!< offb CCM bias for B, S13.0*/

-+    int32_t offb;

-+    /*!< luma_coeff_arr[3] Luna coefficients (weights), U0.8*/

-+    int32_t luma_coeff_arr[3];

-+    /*!< adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/

-+    int32_t adapt_chroma_lut[81];

-+    /*!< adapt_luma_lut[81] Luma adaptation LUT, S13.0*/

-+    int32_t adapt_luma_lut[81];

-+    /*!< enable_low_light_mode Enable CC's adaptation low light mode*/

-+    int32_t enable_low_light_mode;

-+    /*!< enable_compand enable for the (de)companding*/

-+    int32_t enable_compand;

-+    /*!< cu_compression_x[13] U.24 linear, default log-limited*/

-+    int32_t cu_compression_x[13];

-+    /*!< cu_compression_y[12] U.15 companded output*/

-+    int32_t cu_compression_y[12];

-+    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/

-+    int32_t cu_compression_slope[12];

-+    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/

-+    int32_t cu_decompression_x[13];

-+    /*!< cu_decompression_y[12] U.24 linear*/

-+    int32_t cu_decompression_y[12];

-+    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/

-+    int32_t cu_decompression_slope[12];

-+    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/

-+    int32_t linear_pedestal;

-+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

-+    int32_t use_pedestal;

-+

-+} ia_pal_isp_acm_1_1_t;

-+

-+/*! \isp struct aestatistics_2_0

-+AE Statistics (histogram)

-+*/

-+typedef struct

-+{

-+    /*!< cell0[96] weighted histogram grid values*/

-+    int32_t cell0[96];

-+    /*!< cell1[96] weighted histogram grid values*/

-+    int32_t cell1[96];

-+    /*!< cell2[96] weighted histogram grid values*/

-+    int32_t cell2[96];

-+    /*!< cell3[96] weighted histogram grid values*/

-+    int32_t cell3[96];

-+    /*!< cell4[96] weighted histogram grid values*/

-+    int32_t cell4[96];

-+    /*!< cell5[96] weighted histogram grid values*/

-+    int32_t cell5[96];

-+    /*!< cell6[96] weighted histogram grid values*/

-+    int32_t cell6[96];

-+    /*!< cell7[96] weighted histogram grid values*/

-+    int32_t cell7[96];

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_height;

-+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

-+    int32_t ae_en;

-+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

-+    int32_t rst_hist_array;

-+    /*!< x_start X top left corner of the grid*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< shift_id[8] shifter for the histograms per color channel*/

-+    int32_t shift_id[8];

-+

-+} ia_pal_isp_aestatistics_2_0_t;

-+

-+/*! \isp struct aestatistics_2_1

-+AE Statistics (histogram)

-+*/

-+typedef struct

-+{

-+    /*!< cell0[96] weighted histogram grid values*/

-+    int32_t cell0[96];

-+    /*!< cell1[96] weighted histogram grid values*/

-+    int32_t cell1[96];

-+    /*!< cell2[96] weighted histogram grid values*/

-+    int32_t cell2[96];

-+    /*!< cell3[96] weighted histogram grid values*/

-+    int32_t cell3[96];

-+    /*!< cell4[96] weighted histogram grid values*/

-+    int32_t cell4[96];

-+    /*!< cell5[96] weighted histogram grid values*/

-+    int32_t cell5[96];

-+    /*!< cell6[96] weighted histogram grid values*/

-+    int32_t cell6[96];

-+    /*!< cell7[96] weighted histogram grid values*/

-+    int32_t cell7[96];

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_height;

-+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

-+    int32_t ae_en;

-+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

-+    int32_t rst_hist_array;

-+    /*!< x_start X top left corner of the grid*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< shift_id[8] shifter for the histograms per color channel*/

-+    int32_t shift_id[8];

-+

-+} ia_pal_isp_aestatistics_2_1_t;

-+

-+/*! \isp struct af_awb_frstatistics_2_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_height;

-+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice*/

-+    int32_t grid_height_per_slice;

-+    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/

-+    int32_t y_fr_en;

-+    /*!< awb_fr_en 0: FF will not write to the AWB_FR  array; 1: FF will write  to the AWB_FR  array*/

-+    int32_t awb_fr_en;

-+    /*!< x_start X top left corner of the grid*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid*/

-+    int32_t y_end;

-+    /*!< shftr_val_x[7] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];m_ShftR_val_R = shftr_val_x[4];m_ShftR_val_G = shftr_val_x[5];m_ShftR_val_B = shftr_val_x[6];*/

-+    int32_t shftr_val_x[7];

-+    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_0[4];

-+    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_1[4];

-+    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_2[4];

-+    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_3[4];

-+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/

-+    int32_t mask_y0;

-+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/

-+    int32_t mask_y1;

-+    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/

-+    int32_t oe_y0;

-+    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/

-+    int32_t oe_y1;

-+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y0[4];

-+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y1[4];

-+    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/

-+    int32_t r_select;

-+    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column*/

-+    int32_t g_select;

-+    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/

-+    int32_t b_select;

-+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y00_filter_coeff[6];

-+    /*!< y00_filter_sign_vec sign vector for Y00*/

-+    int32_t y00_filter_sign_vec;

-+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y01_filter_coeff[6];

-+    /*!< y01_filter_sign_vec sign vector for Y01*/

-+    int32_t y01_filter_sign_vec;

-+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y10_filter_coeff[6];

-+    /*!< y10_filter_sign_vec sign vector for Y10*/

-+    int32_t y10_filter_sign_vec;

-+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y11_filter_coeff[6];

-+    /*!< y11_filter_sign_vec sign vector for Y11*/

-+    int32_t y11_filter_sign_vec;

-+    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/

-+    int32_t r_filter_coeff[6];

-+    /*!< r_filter_sign_vec sign vector for R*/

-+    int32_t r_filter_sign_vec;

-+    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/

-+    int32_t g_filter_coeff[6];

-+    /*!< g_filter_sign_vec sign vector for G*/

-+    int32_t g_filter_sign_vec;

-+    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/

-+    int32_t b_filter_coeff[6];

-+    /*!< b_filter_sign_vec sign vector for B*/

-+    int32_t b_filter_sign_vec;

-+    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/

-+    int32_t nf_x[7];

-+    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/

-+    int32_t sensor_mode;

-+    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/

-+    int32_t downscaling_factor;

-+    /*!< y00_blending_weight Median filter weight for Y00*/

-+    int32_t y00_blending_weight;

-+    /*!< y01_blending_weight Median filter weight for Y01*/

-+    int32_t y01_blending_weight;

-+    /*!< y10_blending_weight Median filter weight for Y10*/

-+    int32_t y10_blending_weight;

-+    /*!< y11_blending_weight Median filter weight for Y11*/

-+    int32_t y11_blending_weight;

-+

-+} ia_pal_isp_af_awb_frstatistics_2_0_t;

-+

-+/*! \isp struct awbstatistics_2_0

-+AWB Statistics (RGBS grid)

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

-+    int32_t block_height;

-+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/

-+    int32_t grid_height_per_slice;

-+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

-+    int32_t awb_en;

-+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

-+    int32_t rgbs_incl_sat;

-+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

-+    int32_t rgbs_thr_cx[8];

-+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

-+    int32_t shftr_val_cx[8];

-+    /*!< shftr_sat represents log2(num of pixels in cell)*/

-+    int32_t shftr_sat;

-+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

-+    int32_t output_packed;

-+

-+} ia_pal_isp_awbstatistics_2_0_t;

-+

-+/*! \isp struct b2i_bnr_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable B2I-BNR filter*/

-+    int32_t enable;

-+    /*!< bayer_noise_mod_poiss_coeff denoise: noise model alpha - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_poiss_coeff;

-+    /*!< bayer_noise_mod_gauss_coeff denoise: noise model beta - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_gauss_coeff;

-+    /*!< bayer_noise_mod_gain_gr denoise: noise model gain for gr - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_gain_gr;

-+    /*!< bayer_noise_mod_gain_r denoise: noise model gain for r - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_gain_r;

-+    /*!< bayer_noise_mod_gain_b denoise: noise model gain for b - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_gain_b;

-+    /*!< bayer_noise_mod_gain_gb denoise: noise model gain for gb - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

-+    int32_t bayer_noise_mod_gain_gb;

-+    /*!< bayer_noise_spatial_Gcoeff[4] denoise: spatial kernel coefficients for G pixels*/

-+    int32_t bayer_noise_spatial_Gcoeff[4];

-+    /*!< bayer_noise_spatial_Rbcoeff[3] denoise: spatial kernel coefficients for R,B pixels*/

-+    int32_t bayer_noise_spatial_Rbcoeff[3];

-+    /*!< psdy_noise_th 0-use bayer pixel for noise TH, 1- use psdY pixel for noise TH*/

-+    int32_t psdy_noise_th;

-+    /*!< radial_x_initial Radial x coordinates of corner*/

-+    int32_t radial_x_initial;

-+    /*!< radial_y_initial Radial y coordinates of corner*/

-+    int32_t radial_y_initial;

-+    /*!< radial_coords_prec_reduc radial coordinates precision reduction - to bring sqrX+sqrY to [0-256]*/

-+    int32_t radial_coords_prec_reduc;

-+    /*!< cu_radial_coeff_gr_x[6] radial coeff function for Gr channel config unit - x values*/

-+    int32_t cu_radial_coeff_gr_x[6];

-+    /*!< cu_radial_coeff_gr_y[5] radial coeff function for Gr channel config unit - y values*/

-+    int32_t cu_radial_coeff_gr_y[5];

-+    /*!< cu_radial_coeff_gr_slope[5] radial coeff function for Gr channel config unit - slope values*/

-+    int32_t cu_radial_coeff_gr_slope[5];

-+    /*!< cu_radial_coeff_r_x[6] radial coeff function for R channel config unit - x values*/

-+    int32_t cu_radial_coeff_r_x[6];

-+    /*!< cu_radial_coeff_r_y[5] radial coeff function for R channel config unit - y values*/

-+    int32_t cu_radial_coeff_r_y[5];

-+    /*!< cu_radial_coeff_r_slope[5] radial coeff function for R channel config unit - slope values*/

-+    int32_t cu_radial_coeff_r_slope[5];

-+    /*!< cu_radial_coeff_b_x[6] radial coeff function for B channel config unit - x values*/

-+    int32_t cu_radial_coeff_b_x[6];

-+    /*!< cu_radial_coeff_b_y[5] radial coeff function for B channel config unit - y values*/

-+    int32_t cu_radial_coeff_b_y[5];

-+    /*!< cu_radial_coeff_b_slope[5] radial coeff function for B channel config unit - slope values*/

-+    int32_t cu_radial_coeff_b_slope[5];

-+    /*!< cu_radial_coeff_gb_x[6] radial coeff function for Gb channel config unit - x values*/

-+    int32_t cu_radial_coeff_gb_x[6];

-+    /*!< cu_radial_coeff_gb_y[5] radial coeff function for Gb channel config unit - y values*/

-+    int32_t cu_radial_coeff_gb_y[5];

-+    /*!< cu_radial_coeff_gb_slope[5] radial coeff function for Gb channel config unit - slope values*/

-+    int32_t cu_radial_coeff_gb_slope[5];

-+

-+} ia_pal_isp_b2i_bnr_1_0_t;

-+

-+/*! \isp struct b2i_dm_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable B2I-DM filter*/

-+    int32_t enable;

-+    /*!< local_median_bypass local_median_bypass*/

-+    int32_t local_median_bypass;

-+    /*!< cas_bypass cas_bypass*/

-+    int32_t cas_bypass;

-+    /*!< g_int_x_points[2] x_points for green interpolation CU*/

-+    int32_t g_int_x_points[2];

-+    /*!< g_int_a_points a_points for green interpolation CU*/

-+    int32_t g_int_a_points;

-+    /*!< g_int_b_points b_points for green interpolation CU*/

-+    int32_t g_int_b_points;

-+    /*!< cas_x_points[2] x_points for CAS CU*/

-+    int32_t cas_x_points[2];

-+    /*!< cas_a_points a_points for CAS CU*/

-+    int32_t cas_a_points;

-+    /*!< cas_b_points b_points for CAS CU*/

-+    int32_t cas_b_points;

-+    /*!< local_med_x_points[2] x_points forlocal median CU*/

-+    int32_t local_med_x_points[2];

-+    /*!< local_med_a_points a_points forlocal median CU*/

-+    int32_t local_med_a_points;

-+    /*!< local_med_b_points b_points forlocal median CU*/

-+    int32_t local_med_b_points;

-+    /*!< cas_low_level low level of the CAS config unit. [0 , 1024]*/

-+    int32_t cas_low_level;

-+    /*!< sharp_power power of DM sharpening - higher is more sharp [0 15]*/

-+    int32_t sharp_power;

-+

-+} ia_pal_isp_b2i_dm_1_0_t;

-+

-+/*! \isp struct b2i_ds_1_0_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable scaling filter*/

-+    int32_t enable;

-+    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/

-+    int32_t scaling_ratio;

-+    /*!< horizontal_offset Position of first output pixel for scaler*/

-+    int32_t horizontal_offset;

-+    /*!< vertical_offset Position of first output line for scaler*/

-+    int32_t vertical_offset;

-+    /*!< output_height Output image height for scaler*/

-+    int32_t output_height;

-+    /*!< output_width Output image width for scaler*/

-+    int32_t output_width;

-+    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/

-+    int32_t vkernel_LUT[129];

-+    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/

-+    int32_t hkernel_LUT[129];

-+    /*!< input_height input image height*/

-+    int32_t input_height;

-+

-+} ia_pal_isp_b2i_ds_1_0_0_t;

-+

-+/*! \isp struct b2i_ds_1_0_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable scaling filter*/

-+    int32_t enable;

-+    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/

-+    int32_t scaling_ratio;

-+    /*!< horizontal_offset Position of first output pixel for scaler*/

-+    int32_t horizontal_offset;

-+    /*!< vertical_offset Position of first output line for scaler*/

-+    int32_t vertical_offset;

-+    /*!< output_height Output image height for scaler*/

-+    int32_t output_height;

-+    /*!< output_width Output image width for scaler*/

-+    int32_t output_width;

-+    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/

-+    int32_t vkernel_LUT[129];

-+    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/

-+    int32_t hkernel_LUT[129];

-+    /*!< input_height input image height*/

-+    int32_t input_height;

-+

-+} ia_pal_isp_b2i_ds_1_0_1_t;

-+

-+/*! \isp struct b2i_sie_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< csc_enable csc_bypass*/

-+    int32_t csc_enable;

-+    /*!< sharp_enable sharp_bypass*/

-+    int32_t sharp_enable;

-+    /*!< gamma_lut_enable gamma lut enable*/

-+    int32_t gamma_lut_enable;

-+    /*!< tm_lut_enable TM enable*/

-+    int32_t tm_lut_enable;

-+    /*!< ccm_enable ccm_bypass*/

-+    int32_t ccm_enable;

-+    /*!< cnr_enable cnr_bypass*/

-+    int32_t cnr_enable;

-+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

-+    int32_t csc_matrix[9];

-+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

-+    int32_t csc_matrix_norm;

-+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

-+    int32_t csc_bias_vec[3];

-+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

-+    int32_t cds_coeff_array[8];

-+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

-+    int32_t cds_coeff_array_norm;

-+    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/

-+    int32_t sharp_undershoot_power;

-+    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/

-+    int32_t sharp_overshoot_power;

-+    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/

-+    int32_t glut_base_level[5];

-+    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/

-+    int32_t glut_start_bin[5];

-+    /*!< glut_step[5] Gamma lut  - GLUT step*/

-+    int32_t glut_step[5];

-+    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/

-+    int32_t glut_gen_lut[385];

-+    /*!< gamma_prog_shift programable shift for the gamma output*/

-+    int32_t gamma_prog_shift;

-+    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/

-+    int32_t ccm_matrix[9];

-+    /*!< ccm_matrix_norm normalization factor for color enhancement*/

-+    int32_t ccm_matrix_norm;

-+    /*!< tmlut_base_level TM lut  - LUT base levels*/

-+    int32_t tmlut_base_level;

-+    /*!< tmlut_start_bin TM lut  - LUT start bin*/

-+    int32_t tmlut_start_bin;

-+    /*!< tmlut_step TM lut  - LUT step*/

-+    int32_t tmlut_step;

-+    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/

-+    int32_t tmlut_gen_lut[513];

-+    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/

-+    int32_t x_points_for_sharp_pos_th[6];

-+    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/

-+    int32_t a_points_for_sharp_pos_th[5];

-+    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/

-+    int32_t b_points_for_sharp_pos_th[5];

-+    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/

-+    int32_t x_points_for_sharp_neg_th[6];

-+    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/

-+    int32_t a_points_for_sharp_neg_th[5];

-+    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/

-+    int32_t b_points_for_sharp_neg_th[5];

-+    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/

-+    int32_t x_points_for_sharp_pixval_th[6];

-+    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/

-+    int32_t a_points_for_sharp_pixval_th[5];

-+    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/

-+    int32_t b_points_for_sharp_pixval_th[5];

-+    /*!< sharp_texture_coeff_norm texture  metric normalization power*/

-+    int32_t sharp_texture_coeff_norm;

-+    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/

-+    int32_t sharp_texture_undershoot;

-+    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/

-+    int32_t sharp_edge_undershoot;

-+    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/

-+    int32_t sharp_texture_overshoot;

-+    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/

-+    int32_t sharp_edge_overshoot;

-+    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/

-+    int32_t sharp_kernel_coeffs[6];

-+    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/

-+    int32_t x_points_for_noise_th[6];

-+    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/

-+    int32_t a_points_for_noise_th[5];

-+    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/

-+    int32_t b_points_for_noise_th[5];

-+    /*!< x_points_for_local_coring[6] x points for local coring config unit*/

-+    int32_t x_points_for_local_coring[6];

-+    /*!< a_points_for_local_coring[5] a points for local coring config unit*/

-+    int32_t a_points_for_local_coring[5];

-+    /*!< b_points_for_local_coring[5] b points for local coring config unit*/

-+    int32_t b_points_for_local_coring[5];

-+    /*!< x_points_for_global_coring[6] x points for global coring config unit*/

-+    int32_t x_points_for_global_coring[6];

-+    /*!< a_points_for_global_coring[5] a points for global coring config unit*/

-+    int32_t a_points_for_global_coring[5];

-+    /*!< b_points_for_global_coring[5] b points for global coring config unit*/

-+    int32_t b_points_for_global_coring[5];

-+    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/

-+    int32_t cnr_iir_weight;

-+    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/

-+    int32_t cnr_fir_weight[3];

-+

-+} ia_pal_isp_b2i_sie_1_0_t;

-+

-+/*! \isp struct b2i_sie_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< csc_enable csc_bypass*/

-+    int32_t csc_enable;

-+    /*!< sharp_enable sharp_bypass*/

-+    int32_t sharp_enable;

-+    /*!< gamma_lut_enable gamma lut enable*/

-+    int32_t gamma_lut_enable;

-+    /*!< tmlut_enable TM enable*/

-+    int32_t tmlut_enable;

-+    /*!< ccm_enable ccm_bypass*/

-+    int32_t ccm_enable;

-+    /*!< cnr_enable cnr_bypass*/

-+    int32_t cnr_enable;

-+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

-+    int32_t csc_matrix[9];

-+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

-+    int32_t csc_matrix_norm;

-+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

-+    int32_t csc_bias_vec[3];

-+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

-+    int32_t cds_coeff_array[8];

-+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

-+    int32_t cds_coeff_array_norm;

-+    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/

-+    int32_t sharp_undershoot_power;

-+    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/

-+    int32_t sharp_overshoot_power;

-+    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/

-+    int32_t glut_base_level[5];

-+    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/

-+    int32_t glut_start_bin[5];

-+    /*!< glut_step[5] Gamma lut  - GLUT step*/

-+    int32_t glut_step[5];

-+    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/

-+    int32_t glut_gen_lut[385];

-+    /*!< gamma_prog_shift programable shift for the gamma output*/

-+    int32_t gamma_prog_shift;

-+    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/

-+    int32_t ccm_matrix[9];

-+    /*!< ccm_matrix_norm normalization factor for color enhancement*/

-+    int32_t ccm_matrix_norm;

-+    /*!< tmlut_base_level TM lut  - LUT base levels*/

-+    int32_t tmlut_base_level;

-+    /*!< tmlut_start_bin TM lut  - LUT start bin*/

-+    int32_t tmlut_start_bin;

-+    /*!< tmlut_step TM lut  - LUT step*/

-+    int32_t tmlut_step;

-+    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/

-+    int32_t tmlut_gen_lut[513];

-+    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/

-+    int32_t x_points_for_sharp_pos_th[6];

-+    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/

-+    int32_t a_points_for_sharp_pos_th[5];

-+    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/

-+    int32_t b_points_for_sharp_pos_th[5];

-+    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/

-+    int32_t x_points_for_sharp_neg_th[6];

-+    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/

-+    int32_t a_points_for_sharp_neg_th[5];

-+    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/

-+    int32_t b_points_for_sharp_neg_th[5];

-+    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/

-+    int32_t x_points_for_sharp_pixval_th[6];

-+    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/

-+    int32_t a_points_for_sharp_pixval_th[5];

-+    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/

-+    int32_t b_points_for_sharp_pixval_th[5];

-+    /*!< sharp_texture_coeff_norm texture  metric normalization power*/

-+    int32_t sharp_texture_coeff_norm;

-+    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/

-+    int32_t sharp_texture_undershoot;

-+    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/

-+    int32_t sharp_edge_undershoot;

-+    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/

-+    int32_t sharp_texture_overshoot;

-+    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/

-+    int32_t sharp_edge_overshoot;

-+    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/

-+    int32_t sharp_kernel_coeffs[6];

-+    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/

-+    int32_t x_points_for_noise_th[6];

-+    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/

-+    int32_t a_points_for_noise_th[5];

-+    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/

-+    int32_t b_points_for_noise_th[5];

-+    /*!< x_points_for_local_coring[6] x points for local coring config unit*/

-+    int32_t x_points_for_local_coring[6];

-+    /*!< a_points_for_local_coring[5] a points for local coring config unit*/

-+    int32_t a_points_for_local_coring[5];

-+    /*!< b_points_for_local_coring[5] b points for local coring config unit*/

-+    int32_t b_points_for_local_coring[5];

-+    /*!< x_points_for_global_coring[6] x points for global coring config unit*/

-+    int32_t x_points_for_global_coring[6];

-+    /*!< a_points_for_global_coring[5] a points for global coring config unit*/

-+    int32_t a_points_for_global_coring[5];

-+    /*!< b_points_for_global_coring[5] b points for global coring config unit*/

-+    int32_t b_points_for_global_coring[5];

-+    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/

-+    int32_t cnr_iir_weight;

-+    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/

-+    int32_t cnr_fir_weight[3];

-+

-+} ia_pal_isp_b2i_sie_1_1_t;

-+

-+/*! \isp struct bnlm_3_0

-+noise reduction

-+*/

-+typedef struct

-+{

-+    /*!< bayer_fmt Bayer format*/

-+    int32_t bayer_fmt;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< run_on_y a flag that indicates if the block used on Y input*/

-+    int32_t run_on_y;

-+    /*!< hv_edge_density_thr Edge density noise sigma thr*/

-+    int32_t hv_edge_density_thr;

-+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

-+    int32_t minmax_hv_edge_density_thr;

-+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

-+    int32_t d_edge_density_thr;

-+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

-+    int32_t minmax_d_edge_density_thr;

-+    /*!< sigma_flat sigma flat*/

-+    int32_t sigma_flat;

-+    /*!< sigma_slope sigma slope*/

-+    int32_t sigma_slope;

-+    /*!< sigma_edge sigma edge*/

-+    int32_t sigma_edge;

-+    /*!< sigma_texture sigma texture*/

-+    int32_t sigma_texture;

-+    /*!< delta_flat delta flat*/

-+    int32_t delta_flat;

-+    /*!< delta_slope delta slope*/

-+    int32_t delta_slope;

-+    /*!< delta_edge delta edge*/

-+    int32_t delta_edge;

-+    /*!< delta_texture delta texture*/

-+    int32_t delta_texture;

-+    /*!< alpha_flat alpha flat*/

-+    int32_t alpha_flat;

-+    /*!< alpha_slope alpha slope*/

-+    int32_t alpha_slope;

-+    /*!< alpha_edge alpha edge*/

-+    int32_t alpha_edge;

-+    /*!< alpha_texture alpha texture*/

-+    int32_t alpha_texture;

-+    /*!< sigma_s spatial sigma of uniform filter*/

-+    int32_t sigma_s;

-+    /*!< sigma_s_b narrow sigma of elliptical filter*/

-+    int32_t sigma_s_b;

-+    /*!< sigma_s_a wide sigma of elliptical filter*/

-+    int32_t sigma_s_a;

-+    /*!< rx_sqr_start initial value of Rx^2*/

-+    int32_t rx_sqr_start;

-+    /*!< ry_sqr_start initial value of Ry^2*/

-+    int32_t ry_sqr_start;

-+    /*!< coordinates_shift coordinates shift*/

-+    int32_t coordinates_shift;

-+    /*!< color_penalty_weight color penalty weight*/

-+    int32_t color_penalty_weight;

-+    /*!< alpha_i_max alpha I max*/

-+    int32_t alpha_i_max;

-+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

-+    int32_t cu_ed_measure_x[4];

-+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

-+    int32_t cu_ed_measure_y[3];

-+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

-+    int32_t cu_ed_measure_slope[3];

-+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

-+    int32_t cu_ed_dir_measure_x[4];

-+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

-+    int32_t cu_ed_dir_measure_y[3];

-+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

-+    int32_t cu_ed_dir_measure_slope[3];

-+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

-+    int32_t cu_lin_slope_measure_x[4];

-+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

-+    int32_t cu_lin_slope_measure_y[3];

-+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

-+    int32_t cu_lin_slope_measure_slope[3];

-+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

-+    int32_t cu_lin_slope_edge_measure_x[4];

-+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

-+    int32_t cu_lin_slope_edge_measure_y[3];

-+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

-+    int32_t cu_lin_slope_edge_measure_slope[3];

-+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

-+    int32_t cu_var_measure_x[4];

-+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

-+    int32_t cu_var_measure_y[3];

-+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

-+    int32_t cu_var_measure_slope[3];

-+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

-+    int32_t cu_var_edge_measure_x[4];

-+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

-+    int32_t cu_var_edge_measure_y[3];

-+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

-+    int32_t cu_var_edge_measure_slope[3];

-+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

-+    int32_t cu_alpha_i_x[4];

-+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

-+    int32_t cu_alpha_i_y[3];

-+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

-+    int32_t cu_alpha_i_slope[3];

-+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gr_x[6];

-+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gr_y[5];

-+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gr_slope[5];

-+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

-+    int32_t cu_lsc_coeff_r_x[6];

-+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

-+    int32_t cu_lsc_coeff_r_y[5];

-+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_r_slope[5];

-+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

-+    int32_t cu_lsc_coeff_b_x[6];

-+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

-+    int32_t cu_lsc_coeff_b_y[5];

-+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_b_slope[5];

-+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gb_x[6];

-+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gb_y[5];

-+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gb_slope[5];

-+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

-+    int32_t start_col;

-+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

-+    int32_t start_row;

-+    /*!< delta_y_counter crop supporting register*/

-+    int32_t delta_y_counter;

-+    /*!< delta_x_counter crop supporting register*/

-+    int32_t delta_x_counter;

-+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

-+    int32_t cu_nm_patch_x[10];

-+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

-+    int32_t cu_nm_patch_y[9];

-+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

-+    int32_t cu_nm_patch_slope[9];

-+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

-+    int32_t cu_nm_block_x[10];

-+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

-+    int32_t cu_nm_block_y[9];

-+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

-+    int32_t cu_nm_block_slope[9];

-+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

-+    int32_t cu_input_compression_x[16];

-+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

-+    int32_t cu_input_compression_y[15];

-+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

-+    int32_t cu_input_compression_slope[15];

-+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

-+    int32_t cu_input_decompression_x[16];

-+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

-+    int32_t cu_input_decompression_y[15];

-+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

-+    int32_t cu_input_decompression_slope[15];

-+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

-+    int32_t cu_output_compression_x[16];

-+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

-+    int32_t cu_output_compression_y[15];

-+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

-+    int32_t cu_output_compression_slope[15];

-+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

-+    int32_t nm_norm_scale;

-+

-+} ia_pal_isp_bnlm_3_0_t;

-+

-+/*! \isp struct bnlm_3_1

-+noise reduction

-+*/

-+typedef struct

-+{

-+    /*!< bayer_fmt Bayer format*/

-+    int32_t bayer_fmt;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< run_on_y a flag that indicates if the block used on Y input*/

-+    int32_t run_on_y;

-+    /*!< hv_edge_density_thr Edge density noise sigma thr*/

-+    int32_t hv_edge_density_thr;

-+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

-+    int32_t minmax_hv_edge_density_thr;

-+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

-+    int32_t d_edge_density_thr;

-+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

-+    int32_t minmax_d_edge_density_thr;

-+    /*!< sigma_flat sigma flat*/

-+    int32_t sigma_flat;

-+    /*!< sigma_slope sigma slope*/

-+    int32_t sigma_slope;

-+    /*!< sigma_edge sigma edge*/

-+    int32_t sigma_edge;

-+    /*!< sigma_texture sigma texture*/

-+    int32_t sigma_texture;

-+    /*!< delta_flat delta flat*/

-+    int32_t delta_flat;

-+    /*!< delta_slope delta slope*/

-+    int32_t delta_slope;

-+    /*!< delta_edge delta edge*/

-+    int32_t delta_edge;

-+    /*!< delta_texture delta texture*/

-+    int32_t delta_texture;

-+    /*!< alpha_flat alpha flat*/

-+    int32_t alpha_flat;

-+    /*!< alpha_slope alpha slope*/

-+    int32_t alpha_slope;

-+    /*!< alpha_edge alpha edge*/

-+    int32_t alpha_edge;

-+    /*!< alpha_texture alpha texture*/

-+    int32_t alpha_texture;

-+    /*!< sigma_s spatial sigma of uniform filter*/

-+    int32_t sigma_s;

-+    /*!< sigma_s_b narrow sigma of elliptical filter*/

-+    int32_t sigma_s_b;

-+    /*!< sigma_s_a wide sigma of elliptical filter*/

-+    int32_t sigma_s_a;

-+    /*!< rx_sqr_start initial value of Rx^2*/

-+    int32_t rx_sqr_start;

-+    /*!< ry_sqr_start initial value of Ry^2*/

-+    int32_t ry_sqr_start;

-+    /*!< coordinates_shift coordinates shift*/

-+    int32_t coordinates_shift;

-+    /*!< color_penalty_weight color penalty weight*/

-+    int32_t color_penalty_weight;

-+    /*!< alpha_i_max alpha I max*/

-+    int32_t alpha_i_max;

-+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

-+    int32_t cu_ed_measure_x[4];

-+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

-+    int32_t cu_ed_measure_y[3];

-+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

-+    int32_t cu_ed_measure_slope[3];

-+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

-+    int32_t cu_ed_dir_measure_x[4];

-+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

-+    int32_t cu_ed_dir_measure_y[3];

-+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

-+    int32_t cu_ed_dir_measure_slope[3];

-+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

-+    int32_t cu_lin_slope_measure_x[4];

-+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

-+    int32_t cu_lin_slope_measure_y[3];

-+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

-+    int32_t cu_lin_slope_measure_slope[3];

-+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

-+    int32_t cu_lin_slope_edge_measure_x[4];

-+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

-+    int32_t cu_lin_slope_edge_measure_y[3];

-+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

-+    int32_t cu_lin_slope_edge_measure_slope[3];

-+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

-+    int32_t cu_var_measure_x[4];

-+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

-+    int32_t cu_var_measure_y[3];

-+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

-+    int32_t cu_var_measure_slope[3];

-+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

-+    int32_t cu_var_edge_measure_x[4];

-+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

-+    int32_t cu_var_edge_measure_y[3];

-+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

-+    int32_t cu_var_edge_measure_slope[3];

-+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

-+    int32_t cu_alpha_i_x[4];

-+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

-+    int32_t cu_alpha_i_y[3];

-+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

-+    int32_t cu_alpha_i_slope[3];

-+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gr_x[6];

-+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gr_y[5];

-+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gr_slope[5];

-+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

-+    int32_t cu_lsc_coeff_r_x[6];

-+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

-+    int32_t cu_lsc_coeff_r_y[5];

-+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_r_slope[5];

-+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

-+    int32_t cu_lsc_coeff_b_x[6];

-+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

-+    int32_t cu_lsc_coeff_b_y[5];

-+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_b_slope[5];

-+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gb_x[6];

-+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gb_y[5];

-+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gb_slope[5];

-+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

-+    int32_t start_col;

-+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

-+    int32_t start_row;

-+    /*!< delta_y_counter crop supporting register*/

-+    int32_t delta_y_counter;

-+    /*!< delta_x_counter crop supporting register*/

-+    int32_t delta_x_counter;

-+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

-+    int32_t cu_nm_patch_x[10];

-+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

-+    int32_t cu_nm_patch_y[9];

-+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

-+    int32_t cu_nm_patch_slope[9];

-+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

-+    int32_t cu_nm_block_x[10];

-+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

-+    int32_t cu_nm_block_y[9];

-+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

-+    int32_t cu_nm_block_slope[9];

-+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

-+    int32_t cu_input_compression_x[16];

-+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

-+    int32_t cu_input_compression_y[15];

-+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

-+    int32_t cu_input_compression_slope[15];

-+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

-+    int32_t cu_input_decompression_x[16];

-+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

-+    int32_t cu_input_decompression_y[15];

-+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

-+    int32_t cu_input_decompression_slope[15];

-+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

-+    int32_t cu_output_compression_x[16];

-+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

-+    int32_t cu_output_compression_y[15];

-+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

-+    int32_t cu_output_compression_slope[15];

-+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

-+    int32_t nm_norm_scale;

-+

-+} ia_pal_isp_bnlm_3_1_t;

-+

-+/*! \isp struct bnlm_3_2

-+noise reduction

-+*/

-+typedef struct

-+{

-+    /*!< bayer_fmt Bayer format*/

-+    int32_t bayer_fmt;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< run_on_y a flag that indicates if the block used on Y input*/

-+    int32_t run_on_y;

-+    /*!< hv_edge_density_thr Edge density noise sigma thr*/

-+    int32_t hv_edge_density_thr;

-+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

-+    int32_t minmax_hv_edge_density_thr;

-+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

-+    int32_t d_edge_density_thr;

-+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

-+    int32_t minmax_d_edge_density_thr;

-+    /*!< sigma_flat sigma flat*/

-+    int32_t sigma_flat;

-+    /*!< sigma_slope sigma slope*/

-+    int32_t sigma_slope;

-+    /*!< sigma_edge sigma edge*/

-+    int32_t sigma_edge;

-+    /*!< sigma_texture sigma texture*/

-+    int32_t sigma_texture;

-+    /*!< delta_flat delta flat*/

-+    int32_t delta_flat;

-+    /*!< delta_slope delta slope*/

-+    int32_t delta_slope;

-+    /*!< delta_edge delta edge*/

-+    int32_t delta_edge;

-+    /*!< delta_texture delta texture*/

-+    int32_t delta_texture;

-+    /*!< alpha_flat alpha flat*/

-+    int32_t alpha_flat;

-+    /*!< alpha_slope alpha slope*/

-+    int32_t alpha_slope;

-+    /*!< alpha_edge alpha edge*/

-+    int32_t alpha_edge;

-+    /*!< alpha_texture alpha texture*/

-+    int32_t alpha_texture;

-+    /*!< sigma_s spatial sigma of uniform filter*/

-+    int32_t sigma_s;

-+    /*!< sigma_s_b narrow sigma of elliptical filter*/

-+    int32_t sigma_s_b;

-+    /*!< sigma_s_a wide sigma of elliptical filter*/

-+    int32_t sigma_s_a;

-+    /*!< rx_sqr_start initial value of Rx^2*/

-+    int32_t rx_sqr_start;

-+    /*!< ry_sqr_start initial value of Ry^2*/

-+    int32_t ry_sqr_start;

-+    /*!< coordinates_shift coordinates shift*/

-+    int32_t coordinates_shift;

-+    /*!< color_penalty_weight color penalty weight*/

-+    int32_t color_penalty_weight;

-+    /*!< alpha_i_max alpha I max*/

-+    int32_t alpha_i_max;

-+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

-+    int32_t cu_ed_measure_x[4];

-+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

-+    int32_t cu_ed_measure_y[3];

-+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

-+    int32_t cu_ed_measure_slope[3];

-+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

-+    int32_t cu_ed_dir_measure_x[4];

-+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

-+    int32_t cu_ed_dir_measure_y[3];

-+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

-+    int32_t cu_ed_dir_measure_slope[3];

-+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

-+    int32_t cu_lin_slope_measure_x[4];

-+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

-+    int32_t cu_lin_slope_measure_y[3];

-+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

-+    int32_t cu_lin_slope_measure_slope[3];

-+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

-+    int32_t cu_lin_slope_edge_measure_x[4];

-+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

-+    int32_t cu_lin_slope_edge_measure_y[3];

-+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

-+    int32_t cu_lin_slope_edge_measure_slope[3];

-+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

-+    int32_t cu_var_measure_x[4];

-+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

-+    int32_t cu_var_measure_y[3];

-+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

-+    int32_t cu_var_measure_slope[3];

-+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

-+    int32_t cu_var_edge_measure_x[4];

-+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

-+    int32_t cu_var_edge_measure_y[3];

-+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

-+    int32_t cu_var_edge_measure_slope[3];

-+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

-+    int32_t cu_alpha_i_x[4];

-+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

-+    int32_t cu_alpha_i_y[3];

-+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

-+    int32_t cu_alpha_i_slope[3];

-+    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gr_x[6];

-+    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gr_y[5];

-+    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gr_slope[5];

-+    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

-+    int32_t cu_lsc_coeff_r_x[6];

-+    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

-+    int32_t cu_lsc_coeff_r_y[5];

-+    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_r_slope[5];

-+    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

-+    int32_t cu_lsc_coeff_b_x[6];

-+    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

-+    int32_t cu_lsc_coeff_b_y[5];

-+    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_b_slope[5];

-+    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

-+    int32_t cu_lsc_coeff_gb_x[6];

-+    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

-+    int32_t cu_lsc_coeff_gb_y[5];

-+    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

-+    int32_t cu_lsc_coeff_gb_slope[5];

-+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

-+    int32_t start_col;

-+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

-+    int32_t start_row;

-+    /*!< delta_y_counter crop supporting register*/

-+    int32_t delta_y_counter;

-+    /*!< delta_x_counter crop supporting register*/

-+    int32_t delta_x_counter;

-+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

-+    int32_t cu_nm_patch_x[10];

-+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

-+    int32_t cu_nm_patch_y[9];

-+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

-+    int32_t cu_nm_patch_slope[9];

-+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

-+    int32_t cu_nm_block_x[10];

-+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

-+    int32_t cu_nm_block_y[9];

-+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

-+    int32_t cu_nm_block_slope[9];

-+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

-+    int32_t cu_input_compression_x[16];

-+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

-+    int32_t cu_input_compression_y[15];

-+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

-+    int32_t cu_input_compression_slope[15];

-+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

-+    int32_t cu_input_decompression_x[16];

-+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

-+    int32_t cu_input_decompression_y[15];

-+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

-+    int32_t cu_input_decompression_slope[15];

-+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

-+    int32_t cu_output_compression_x[16];

-+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

-+    int32_t cu_output_compression_y[15];

-+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

-+    int32_t cu_output_compression_slope[15];

-+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

-+    int32_t nm_norm_scale;

-+

-+} ia_pal_isp_bnlm_3_2_t;

-+

-+/*! \isp struct bnlm_3_3

-+noise reduction

-+*/

-+typedef struct

-+{

-+    /*!< bayer_fmt Bayer format*/

-+    int32_t bayer_fmt;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< run_on_y a flag that indicates if the block used on Y input*/

-+    int32_t run_on_y;

-+    /*!< hv_edge_density_thr Edge density noise sigma thr*/

-+    int32_t hv_edge_density_thr;

-+    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

-+    int32_t minmax_hv_edge_density_thr;

-+    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

-+    int32_t d_edge_density_thr;

-+    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

-+    int32_t minmax_d_edge_density_thr;

-+    /*!< sigma_flat sigma flat*/

-+    int32_t sigma_flat;

-+    /*!< sigma_slope sigma slope*/

-+    int32_t sigma_slope;

-+    /*!< sigma_edge sigma edge*/

-+    int32_t sigma_edge;

-+    /*!< sigma_texture sigma texture*/

-+    int32_t sigma_texture;

-+    /*!< delta_flat delta flat*/

-+    int32_t delta_flat;

-+    /*!< delta_slope delta slope*/

-+    int32_t delta_slope;

-+    /*!< delta_edge delta edge*/

-+    int32_t delta_edge;

-+    /*!< delta_texture delta texture*/

-+    int32_t delta_texture;

-+    /*!< alpha_flat alpha flat*/

-+    int32_t alpha_flat;

-+    /*!< alpha_slope alpha slope*/

-+    int32_t alpha_slope;

-+    /*!< alpha_edge alpha edge*/

-+    int32_t alpha_edge;

-+    /*!< alpha_texture alpha texture*/

-+    int32_t alpha_texture;

-+    /*!< sigma_s spatial sigma of uniform filter*/

-+    int32_t sigma_s;

-+    /*!< sigma_s_b narrow sigma of elliptical filter*/

-+    int32_t sigma_s_b;

-+    /*!< sigma_s_a wide sigma of elliptical filter*/

-+    int32_t sigma_s_a;

-+    /*!< rx_sqr_start initial value of Rx^2*/

-+    int32_t rx_sqr_start;

-+    /*!< ry_sqr_start initial value of Ry^2*/

-+    int32_t ry_sqr_start;

-+    /*!< coordinates_shift coordinates shift*/

-+    int32_t coordinates_shift;

-+    /*!< color_penalty_weight color penalty weight*/

-+    int32_t color_penalty_weight;

-+    /*!< alpha_i_max alpha I max*/

-+    int32_t alpha_i_max;

-+    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

-+    int32_t cu_ed_measure_x[4];

-+    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

-+    int32_t cu_ed_measure_y[3];

-+    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

-+    int32_t cu_ed_measure_slope[3];

-+    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

-+    int32_t cu_ed_dir_measure_x[4];

-+    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

-+    int32_t cu_ed_dir_measure_y[3];

-+    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

-+    int32_t cu_ed_dir_measure_slope[3];

-+    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

-+    int32_t cu_lin_slope_measure_x[4];

-+    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

-+    int32_t cu_lin_slope_measure_y[3];

-+    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

-+    int32_t cu_lin_slope_measure_slope[3];

-+    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

-+    int32_t cu_lin_slope_edge_measure_x[4];

-+    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

-+    int32_t cu_lin_slope_edge_measure_y[3];

-+    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

-+    int32_t cu_lin_slope_edge_measure_slope[3];

-+    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

-+    int32_t cu_var_measure_x[4];

-+    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

-+    int32_t cu_var_measure_y[3];

-+    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

-+    int32_t cu_var_measure_slope[3];

-+    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

-+    int32_t cu_var_edge_measure_x[4];

-+    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

-+    int32_t cu_var_edge_measure_y[3];

-+    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

-+    int32_t cu_var_edge_measure_slope[3];

-+    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

-+    int32_t cu_alpha_i_x[4];

-+    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

-+    int32_t cu_alpha_i_y[3];

-+    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

-+    int32_t cu_alpha_i_slope[3];

-+    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

-+    int32_t start_col;

-+    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

-+    int32_t start_row;

-+    /*!< delta_y_counter crop supporting register*/

-+    int32_t delta_y_counter;

-+    /*!< delta_x_counter crop supporting register*/

-+    int32_t delta_x_counter;

-+    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

-+    int32_t cu_nm_patch_x[10];

-+    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

-+    int32_t cu_nm_patch_y[9];

-+    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

-+    int32_t cu_nm_patch_slope[9];

-+    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

-+    int32_t cu_nm_block_x[10];

-+    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

-+    int32_t cu_nm_block_y[9];

-+    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

-+    int32_t cu_nm_block_slope[9];

-+    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

-+    int32_t cu_input_compression_x[16];

-+    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

-+    int32_t cu_input_compression_y[15];

-+    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

-+    int32_t cu_input_compression_slope[15];

-+    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

-+    int32_t cu_input_decompression_x[16];

-+    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

-+    int32_t cu_input_decompression_y[15];

-+    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

-+    int32_t cu_input_decompression_slope[15];

-+    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

-+    int32_t cu_output_compression_x[16];

-+    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

-+    int32_t cu_output_compression_y[15];

-+    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

-+    int32_t cu_output_compression_slope[15];

-+    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

-+    int32_t nm_norm_scale;

-+    /*!< lsc_coeff_lut_gr[32] Shading coeffcients along the distance from the frame optical center*/

-+    int32_t lsc_coeff_lut_gr[32];

-+    /*!< lsc_coeff_lut_gb[32] Shading coeffcients along the distance from the frame optical center*/

-+    int32_t lsc_coeff_lut_gb[32];

-+    /*!< lsc_coeff_lut_r[32] Shading coeffcients along the distance from the frame optical center*/

-+    int32_t lsc_coeff_lut_r[32];

-+    /*!< lsc_coeff_lut_b[32] Shading coeffcients along the distance from the frame optical center*/

-+    int32_t lsc_coeff_lut_b[32];

-+

-+} ia_pal_isp_bnlm_3_3_t;

-+

-+/*! \isp struct burst_isp

-+3A results are passed to burstisp

-+*/

-+typedef struct

-+{

-+    /*!< exp_time_us exposure time*/

-+    int32_t exp_time_us;

-+    /*!< analog_gain Although the parameter is defined as analog_gain we are using it as total_gain. U24.8 precision*/

-+    int32_t analog_gain;

-+    /*!< wb_gain_gr Absolute WB gain for Gr in U3.13 format*/

-+    uint32_t wb_gain_gr;

-+    /*!< wb_gain_r Absolute WB gain for R in U3.13 format*/

-+    uint32_t wb_gain_r;

-+    /*!< wb_gain_b Absolute WB gain for Bin U3.13 format*/

-+    uint32_t wb_gain_b;

-+    /*!< wb_gain_gb Absolute WB gain for Gb in U3.13 format*/

-+    uint32_t wb_gain_gb;

-+    /*!< lut_width LUT width*/

-+    int32_t lut_width;

-+    /*!< lut_height LUT height*/

-+    int32_t lut_height;

-+    /*!< num_channel Number of channels*/

-+    int32_t num_channel;

-+    /*!< lut[16384] LUT_width*LUT_height*Num_channel*/

-+    int32_t lut[16384];

-+

-+} ia_pal_isp_burst_isp_t;

-+

-+/*! \isp struct bxt_3a_ccm

-+

-+*/

-+typedef struct

-+{

-+    /*!< gain_cx[8] WB coefficients*/

-+    int32_t gain_cx[8];

-+    /*!< m_1x[4] CCM matrix coefficients M11 - M14*/

-+    int32_t m_1x[4];

-+    /*!< m_2x[4] CCM matrix coefficients M21 - M24*/

-+    int32_t m_2x[4];

-+    /*!< m_3x[4] CCM matrix coefficients M31 - M34*/

-+    int32_t m_3x[4];

-+    /*!< c_0x[8] Y-calc matrix coefficients C01 - C08*/

-+    int32_t c_0x[8];

-+    /*!< c_1x[8] Y-calc matrix coefficients C11 - C18*/

-+    int32_t c_1x[8];

-+    /*!< c_2x[8] Y-calc matrix coefficients C21 - C28*/

-+    int32_t c_2x[8];

-+    /*!< c_3x[8] Y-calc matrix coefficients C31 - C38*/

-+    int32_t c_3x[8];

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< ccm_ycalc_en 0: CCM_YCALC is bypassed; 1: CCM_YCALC is enabled*/

-+    int32_t ccm_ycalc_en;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+

-+} ia_pal_isp_bxt_3a_ccm_t;

-+

-+/*! \isp struct bxt_acm

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_acm_bypass Block bypass for HW use*/

-+    int32_t m_acm_bypass;

-+    /*!< m_enable_chroma_lut Enable Chroma adaptation by LUT*/

-+    int32_t m_enable_chroma_lut;

-+    /*!< m_enable_luma_lut Enable Luma adaptation by LUT*/

-+    int32_t m_enable_luma_lut;

-+    /*!< m_enable_negative_pixels enable negative pixels in output*/

-+    int32_t m_enable_negative_pixels;

-+    /*!< m_enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/

-+    int32_t m_enable_chroma_low_light_mode;

-+    /*!< m_enable_luma_low_light_mode Enable Luma adaptation in low light mode*/

-+    int32_t m_enable_luma_low_light_mode;

-+    /*!< m_num_of_sectors number of sectors, U5.0*/

-+    int32_t m_num_of_sectors;

-+    /*!< m_chromagrid2uniformlut_cu_x[9] U12.0*/

-+    int32_t m_chromagrid2uniformlut_cu_x[9];

-+    /*!< m_chromagrid2uniformlut_cu_a[8] S4.10*/

-+    int32_t m_chromagrid2uniformlut_cu_a[8];

-+    /*!< m_lumagrid2uniformlut_cu_x[9] U12.0*/

-+    int32_t m_lumagrid2uniformlut_cu_x[9];

-+    /*!< m_lumagrid2uniformlut_cu_a[8] S4.10*/

-+    int32_t m_lumagrid2uniformlut_cu_a[8];

-+    /*!< m_ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/

-+    int32_t m_ccm_matrix_arr[216];

-+    /*!< m_hue_boundary_arr[24] Table of sectors boundaries, U11.0*/

-+    int32_t m_hue_boundary_arr[24];

-+    /*!< m_ccm_index_arr[25] Table of the sectors indices, U5.0*/

-+    int32_t m_ccm_index_arr[25];

-+    /*!< m_offr CCM bias for R, S13.0*/

-+    int32_t m_offr;

-+    /*!< m_offg CCM bias for G, S13.0*/

-+    int32_t m_offg;

-+    /*!< m_offb CCM bias for B, S13.0*/

-+    int32_t m_offb;

-+    /*!< m_luma_coeff_arr[3] Luna coefficients (weights), U0.8*/

-+    int32_t m_luma_coeff_arr[3];

-+    /*!< m_adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/

-+    int32_t m_adapt_chroma_lut[81];

-+    /*!< m_adapt_luma_lut[81] Luma adaptation LUT, S13.0*/

-+    int32_t m_adapt_luma_lut[81];

-+    /*!< m_enable_low_light_mode Enable CC's adaptation low light mode*/

-+    int32_t m_enable_low_light_mode;

-+

-+} ia_pal_isp_bxt_acm_t;

-+

-+/*! \isp struct bxt_aestatistics

-+

-+*/

-+typedef struct

-+{

-+    /*!< cell0[96] weighted histogram grid values*/

-+    int32_t cell0[96];

-+    /*!< cell1[96] weighted histogram grid values*/

-+    int32_t cell1[96];

-+    /*!< cell2[96] weighted histogram grid values*/

-+    int32_t cell2[96];

-+    /*!< cell3[96] weighted histogram grid values*/

-+    int32_t cell3[96];

-+    /*!< cell4[96] weighted histogram grid values*/

-+    int32_t cell4[96];

-+    /*!< cell5[96] weighted histogram grid values*/

-+    int32_t cell5[96];

-+    /*!< cell6[96] weighted histogram grid values*/

-+    int32_t cell6[96];

-+    /*!< cell7[96] weighted histogram grid values*/

-+    int32_t cell7[96];

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

-+    int32_t block_height;

-+    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

-+    int32_t ae_en;

-+    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

-+    int32_t rst_hist_array;

-+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+

-+} ia_pal_isp_bxt_aestatistics_t;

-+

-+/*! \isp struct bxt_af_awb_fr_statistics

-+

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_height;

-+    /*!< grid_height_per_slice # of blocks (vert) per Meta-Data Slice (grid_height_per_slice * grid_width <= 32; grid_height_per_slice <= 2)*/

-+    int32_t grid_height_per_slice;

-+    /*!< y_fr_en 0: FF will not write to the Y array; 1: FF will write*/

-+    int32_t y_fr_en;

-+    /*!< awb_fr_en 0: FF will not write to the AWB_FR array; 1: FF will write*/

-+    int32_t awb_fr_en;

-+    /*!< ff_en 0: FF is bypassed; 1: FF is enabled*/

-+    int32_t ff_en;

-+    /*!< x_start X top left corner of the grid. 20 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= x_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end <= (frame_width - 1 - 20)*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end <= (frame_height - 1)*/

-+    int32_t y_end;

-+    /*!< shftr_val_x[7] represents log2(num of pixels of the estimated colour component in a block) for Y00, Y01, Y10, Y11, R, G, B*/

-+    int32_t shftr_val_x[7];

-+    /*!< gx0[4] Ycalc contribution ratio for Pat_ij*/

-+    int32_t gx0[4];

-+    /*!< gx1[4] Ycalc contribution ratio for Pat_ij*/

-+    int32_t gx1[4];

-+    /*!< gx2[4] Ycalc contribution ratio for Pat_ij*/

-+    int32_t gx2[4];

-+    /*!< gx3[4] Ycalc contribution ratio for Pat_ij*/

-+    int32_t gx3[4];

-+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k corresponds to Row * 4 + Column*/

-+    int32_t mask_y0;

-+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k corresponds to Row * 4 + Column*/

-+    int32_t mask_y1;

-+    /*!< oe_y0 Output Enable for Y0; bit k corresponds to Row * 2 + Column*/

-+    int32_t oe_y0;

-+    /*!< oe_y1 Output Enable for Y1; bit k corresponds to Row * 2 + Column*/

-+    int32_t oe_y1;

-+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y0[4];

-+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y1[4];

-+    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/

-+    int32_t r_select;

-+    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column + 16*/

-+    int32_t g_select;

-+    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/

-+    int32_t b_select;

-+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y00_filter_coeff[6];

-+    /*!< y00_filter_sign_vec sign vector for Y00*/

-+    int32_t y00_filter_sign_vec;

-+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y01_filter_coeff[6];

-+    /*!< y01_filter_sign_vec sign vector for Y01*/

-+    int32_t y01_filter_sign_vec;

-+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y10_filter_coeff[6];

-+    /*!< y10_filter_sign_vec sign vector for Y10*/

-+    int32_t y10_filter_sign_vec;

-+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y11_filter_coeff[6];

-+    /*!< y11_filter_sign_vec sign vector for Y11*/

-+    int32_t y11_filter_sign_vec;

-+    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/

-+    int32_t r_filter_coeff[6];

-+    /*!< r_filter_sign_vec sign vector for R*/

-+    int32_t r_filter_sign_vec;

-+    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/

-+    int32_t g_filter_coeff[6];

-+    /*!< g_filter_sign_vec sign vector for G*/

-+    int32_t g_filter_sign_vec;

-+    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/

-+    int32_t b_filter_coeff[6];

-+    /*!< b_filter_sign_vec sign vector for B*/

-+    int32_t b_filter_sign_vec;

-+    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/

-+    int32_t nf_x[7];

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+

-+} ia_pal_isp_bxt_af_awb_fr_statistics_t;

-+

-+/*! \isp struct bxt_applycorrection

-+

-+*/

-+typedef struct

-+{

-+    /*!< global_enable global enable*/

-+    int32_t global_enable;

-+    /*!< gdc_enable gdc enable*/

-+    int32_t gdc_enable;

-+    /*!< dpc_enable dpc enable*/

-+    int32_t dpc_enable;

-+    /*!< green_pos gb position*/

-+    int32_t green_pos;

-+

-+} ia_pal_isp_bxt_applycorrection_t;

-+

-+/*! \isp struct bxt_awbstatistics

-+

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

-+    int32_t block_height;

-+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 160)*/

-+    int32_t grid_height_per_slice;

-+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

-+    int32_t awb_en;

-+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

-+    int32_t rgbs_incl_sat;

-+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

-+    int32_t rgbs_thr_cx[8];

-+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

-+    int32_t shftr_val_cx[8];

-+    /*!< shftr_sat represents log2(num of pixels in cell)*/

-+    int32_t shftr_sat;

-+

-+} ia_pal_isp_bxt_awbstatistics_t;

-+

-+/*! \isp struct bxt_blc

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

-+    int32_t dummy_bypass;

-+    /*!< fixobc00 black level value*/

-+    int32_t fixobc00;

-+    /*!< fixobc01 black level value*/

-+    int32_t fixobc01;

-+    /*!< fixobc02 black level value*/

-+    int32_t fixobc02;

-+    /*!< fixobc03 black level value*/

-+    int32_t fixobc03;

-+    /*!< fixobc10 black level value*/

-+    int32_t fixobc10;

-+    /*!< fixobc11 black level value*/

-+    int32_t fixobc11;

-+    /*!< fixobc12 black level value*/

-+    int32_t fixobc12;

-+    /*!< fixobc13 black level value*/

-+    int32_t fixobc13;

-+    /*!< fixobc20 black level value*/

-+    int32_t fixobc20;

-+    /*!< fixobc21 black level value*/

-+    int32_t fixobc21;

-+    /*!< fixobc22 black level value*/

-+    int32_t fixobc22;

-+    /*!< fixobc23 black level value*/

-+    int32_t fixobc23;

-+    /*!< fixobc30 black level value*/

-+    int32_t fixobc30;

-+    /*!< fixobc31 black level value*/

-+    int32_t fixobc31;

-+    /*!< fixobc32 black level value*/

-+    int32_t fixobc32;

-+    /*!< fixobc33 black level value*/

-+    int32_t fixobc33;

-+

-+} ia_pal_isp_bxt_blc_t;

-+

-+/*! \isp struct bxt_blc_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

-+    int32_t dummy_bypass;

-+    /*!< fixobc00 black level value*/

-+    int32_t fixobc00;

-+    /*!< fixobc01 black level value*/

-+    int32_t fixobc01;

-+    /*!< fixobc02 black level value*/

-+    int32_t fixobc02;

-+    /*!< fixobc03 black level value*/

-+    int32_t fixobc03;

-+    /*!< fixobc10 black level value*/

-+    int32_t fixobc10;

-+    /*!< fixobc11 black level value*/

-+    int32_t fixobc11;

-+    /*!< fixobc12 black level value*/

-+    int32_t fixobc12;

-+    /*!< fixobc13 black level value*/

-+    int32_t fixobc13;

-+    /*!< fixobc20 black level value*/

-+    int32_t fixobc20;

-+    /*!< fixobc21 black level value*/

-+    int32_t fixobc21;

-+    /*!< fixobc22 black level value*/

-+    int32_t fixobc22;

-+    /*!< fixobc23 black level value*/

-+    int32_t fixobc23;

-+    /*!< fixobc30 black level value*/

-+    int32_t fixobc30;

-+    /*!< fixobc31 black level value*/

-+    int32_t fixobc31;

-+    /*!< fixobc32 black level value*/

-+    int32_t fixobc32;

-+    /*!< fixobc33 black level value*/

-+    int32_t fixobc33;

-+

-+} ia_pal_isp_bxt_blc_b_t;

-+

-+/*! \isp struct bxt_blc_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

-+    int32_t dummy_bypass;

-+    /*!< fixobc00 black level value*/

-+    int32_t fixobc00;

-+    /*!< fixobc01 black level value*/

-+    int32_t fixobc01;

-+    /*!< fixobc02 black level value*/

-+    int32_t fixobc02;

-+    /*!< fixobc03 black level value*/

-+    int32_t fixobc03;

-+    /*!< fixobc10 black level value*/

-+    int32_t fixobc10;

-+    /*!< fixobc11 black level value*/

-+    int32_t fixobc11;

-+    /*!< fixobc12 black level value*/

-+    int32_t fixobc12;

-+    /*!< fixobc13 black level value*/

-+    int32_t fixobc13;

-+    /*!< fixobc20 black level value*/

-+    int32_t fixobc20;

-+    /*!< fixobc21 black level value*/

-+    int32_t fixobc21;

-+    /*!< fixobc22 black level value*/

-+    int32_t fixobc22;

-+    /*!< fixobc23 black level value*/

-+    int32_t fixobc23;

-+    /*!< fixobc30 black level value*/

-+    int32_t fixobc30;

-+    /*!< fixobc31 black level value*/

-+    int32_t fixobc31;

-+    /*!< fixobc32 black level value*/

-+    int32_t fixobc32;

-+    /*!< fixobc33 black level value*/

-+    int32_t fixobc33;

-+

-+} ia_pal_isp_bxt_blc_c_t;

-+

-+/*! \isp struct bxt_bnlm

-+

-+*/

-+typedef struct

-+{

-+    /*!< div_unit_slope[15] DIV_UNIT_SLOPE - fixed value array for config unit*/

-+    int32_t div_unit_slope[15];

-+    /*!< div_unit_x[16] DIV_UNIT_X - fixed value array for config unit*/

-+    int32_t div_unit_x[16];

-+    /*!< div_unit_y[15] DIV_UNIT_Y - fixed value array for config unit*/

-+    int32_t div_unit_y[15];

-+    /*!< m_bypass Block bypass for HW use*/

-+    int32_t m_bypass;

-+    /*!< m_bcandshift1[4] m_BCandShift1: Group B candidate factoring params*/

-+    int32_t m_bcandshift1[4];

-+    /*!< m_bcandshift2[4] m_BCandShift2: Group B candidate factoring params*/

-+    int32_t m_bcandshift2[4];

-+    /*!< m_bcandsubflag[4] m_BCandSubFlag: Group B candidate factoring params*/

-+    int32_t m_bcandsubflag[4];

-+    /*!< m_ccandshift1[4] m_CCandShift1: Group C candidate factoring params*/

-+    int32_t m_ccandshift1[4];

-+    /*!< m_ccandshift2[4] m_CCandShift2:  Group C candidate factoring params*/

-+    int32_t m_ccandshift2[4];

-+    /*!< m_ccandsubflag[4] m_CCandSubFlag:  Group C candidate factoring params*/

-+    int32_t m_ccandsubflag[4];

-+    /*!< m_candconstellation[2] m_CandConstellation: (0,1,2)  (1=Dendse 10x10 for Y video  0=16x16 sparse for Bayer)    2=Obsolete   input format related params;   Only first element is in use*/

-+    int32_t m_candconstellation[2];

-+    /*!< m_dcandshift1[4] m_DCandShift1:  Group D candidate factoring params*/

-+    int32_t m_dcandshift1[4];

-+    /*!< m_dcandshift2[4] m_DCandShift2:   Group D candidate factoring params*/

-+    int32_t m_dcandshift2[4];

-+    /*!< m_dcandsubflag[4] m_DCandSubFlag:   Group D candidate factoring params*/

-+    int32_t m_dcandsubflag[4];

-+    /*!< m_detail_radial_lut_f1[12] m_DETAIL_RADIAL_LUT_f1*/

-+    int32_t m_detail_radial_lut_f1[12];

-+    /*!< m_detail_radial_lut_f2[12] m_DETAIL_RADIAL_LUT_f2*/

-+    int32_t m_detail_radial_lut_f2[12];

-+    /*!< m_detail_radial_lut_s1[12] m_DETAIL_RADIAL_LUT_s1*/

-+    int32_t m_detail_radial_lut_s1[12];

-+    /*!< m_detail_radial_lut_s2[12] m_DETAIL_RADIAL_LUT_s2*/

-+    int32_t m_detail_radial_lut_s2[12];

-+    /*!< m_detail_radial_lut_s3[12] m_DETAIL_RADIAL_LUT_s3*/

-+    int32_t m_detail_radial_lut_s3[12];

-+    /*!< m_detail_radial_lut_v[12] m_DETAIL_RADIAL_LUT_v*/

-+    int32_t m_detail_radial_lut_v[12];

-+    /*!< m_exp_lut_f1[12] m_EXP_LUT_f1*/

-+    int32_t m_exp_lut_f1[12];

-+    /*!< m_exp_lut_f2[12] m_EXP_LUT_f2*/

-+    int32_t m_exp_lut_f2[12];

-+    /*!< m_exp_lut_o[12] m_EXP_LUT_o*/

-+    int32_t m_exp_lut_o[12];

-+    /*!< m_exp_lut_s1[12] m_EXP_LUT_s1*/

-+    int32_t m_exp_lut_s1[12];

-+    /*!< m_exp_lut_s2[12] m_EXP_LUT_s2*/

-+    int32_t m_exp_lut_s2[12];

-+    /*!< m_exp_lut_s3[12] m_EXP_LUT_s3*/

-+    int32_t m_exp_lut_s3[12];

-+    /*!< m_exp_lut_v[12] m_EXP_LUT_v*/

-+    int32_t m_exp_lut_v[12];

-+    /*!< m_frame_width OBSOLETE*/

-+    int32_t m_frame_width;

-+    /*!< m_matchqualitymaxidx[4] OBSOLETE*/

-+    int32_t m_matchqualitymaxidx[4];

-+    /*!< m_mu_root_lut_f1[12] m_MU_ROOT_LUT_f1*/

-+    int32_t m_mu_root_lut_f1[12];

-+    /*!< m_mu_root_lut_f2[12] m_MU_ROOT_LUT_f2*/

-+    int32_t m_mu_root_lut_f2[12];

-+    /*!< m_mu_root_lut_s1[12] m_MU_ROOT_LUT_s1*/

-+    int32_t m_mu_root_lut_s1[12];

-+    /*!< m_mu_root_lut_s2[12] m_MU_ROOT_LUT_s2*/

-+    int32_t m_mu_root_lut_s2[12];

-+    /*!< m_mu_root_lut_s3[12] m_MU_ROOT_LUT_s3*/

-+    int32_t m_mu_root_lut_s3[12];

-+    /*!< m_mu_root_lut_v[12] m_MU_ROOT_LUT_v*/

-+    int32_t m_mu_root_lut_v[12];

-+    /*!< m_nl_lut1_f1[10] m_NL_LUT1_f1*/

-+    int32_t m_nl_lut1_f1[10];

-+    /*!< m_nl_lut1_f2[10] m_NL_LUT1_f1*/

-+    int32_t m_nl_lut1_f2[10];

-+    /*!< m_nl_lut1_s1[10] m_NL_LUT1_s1*/

-+    int32_t m_nl_lut1_s1[10];

-+    /*!< m_nl_lut1_s2[10] m_NL_LUT1_s2*/

-+    int32_t m_nl_lut1_s2[10];

-+    /*!< m_nl_lut1_s3[10] m_NL_LUT1_s2*/

-+    int32_t m_nl_lut1_s3[10];

-+    /*!< m_nl_lut1_v[10] m_NL_LUT1_v*/

-+    int32_t m_nl_lut1_v[10];

-+    /*!< m_nl_lut2_f1[10] m_NL_LUT2_f1*/

-+    int32_t m_nl_lut2_f1[10];

-+    /*!< m_nl_lut2_f2[10] m_NL_LUT2_f1*/

-+    int32_t m_nl_lut2_f2[10];

-+    /*!< m_nl_lut2_s1[10] m_NL_LUT2_s1*/

-+    int32_t m_nl_lut2_s1[10];

-+    /*!< m_nl_lut2_s2[10] m_NL_LUT2_s2*/

-+    int32_t m_nl_lut2_s2[10];

-+    /*!< m_nl_lut2_s3[10] m_NL_LUT2_s2*/

-+    int32_t m_nl_lut2_s3[10];

-+    /*!< m_nl_lut2_v[10] m_NL_LUT2_v*/

-+    int32_t m_nl_lut2_v[10];

-+    /*!< m_nl_lut3_f1[10] m_NL_LUT3_f1*/

-+    int32_t m_nl_lut3_f1[10];

-+    /*!< m_nl_lut3_f2[10] m_NL_LUT3_f1*/

-+    int32_t m_nl_lut3_f2[10];

-+    /*!< m_nl_lut3_s1[10] m_NL_LUT3_s1*/

-+    int32_t m_nl_lut3_s1[10];

-+    /*!< m_nl_lut3_s2[10] m_NL_LUT3_s2*/

-+    int32_t m_nl_lut3_s2[10];

-+    /*!< m_nl_lut3_s3[10] m_NL_LUT3_s2*/

-+    int32_t m_nl_lut3_s3[10];

-+    /*!< m_nl_lut3_v[10] m_NL_LUT3_v*/

-+    int32_t m_nl_lut3_v[10];

-+    /*!< m_nl_lut4_f1[10] m_NL_LUT4_f1*/

-+    int32_t m_nl_lut4_f1[10];

-+    /*!< m_nl_lut4_f2[10] m_NL_LUT4_f1*/

-+    int32_t m_nl_lut4_f2[10];

-+    /*!< m_nl_lut4_s1[10] m_NL_LUT4_s1*/

-+    int32_t m_nl_lut4_s1[10];

-+    /*!< m_nl_lut4_s2[10] m_NL_LUT4_s2*/

-+    int32_t m_nl_lut4_s2[10];

-+    /*!< m_nl_lut4_s3[10] m_NL_LUT4_s2*/

-+    int32_t m_nl_lut4_s3[10];

-+    /*!< m_nl_lut4_v[10] m_NL_LUT4_v*/

-+    int32_t m_nl_lut4_v[10];

-+    /*!< m_nl_th[3] m_NL_TH: detailIx-->detailType 3 THs for classification 1=Flat.vs.Weak; 2=Weak.vs.Texture 3=Texture.vs.Edge 4=OBSOLETE & not implemented*/

-+    int32_t m_nl_th[3];

-+    /*!< m_radial_power_lut_f1[12] m_RADIAL_POWER_LUT_f1*/

-+    int32_t m_radial_power_lut_f1[12];

-+    /*!< m_radial_power_lut_f2[12] m_RADIAL_POWER_LUT_f2*/

-+    int32_t m_radial_power_lut_f2[12];

-+    /*!< m_radial_power_lut_s1[12] m_RADIAL_POWER_LUT_s1*/

-+    int32_t m_radial_power_lut_s1[12];

-+    /*!< m_radial_power_lut_s2[12] m_RADIAL_POWER_LUT_s2*/

-+    int32_t m_radial_power_lut_s2[12];

-+    /*!< m_radial_power_lut_s3[12] m_RADIAL_POWER_LUT_s3*/

-+    int32_t m_radial_power_lut_s3[12];

-+    /*!< m_radial_power_lut_v[12] m_RADIAL_POWER_LUT_v*/

-+    int32_t m_radial_power_lut_v[12];

-+    /*!< m_rxinitial m_RxInitial: Radial  (coordinates of corner) - Initial X [0,m_frame_width-1]  Default=m_frame_width/2*/

-+    int32_t m_rxinitial;

-+    /*!< m_rxsqrinitial m_RxSqrInitial: m_RxInitial^2*/

-+    int32_t m_rxsqrinitial;

-+    /*!< m_ryinitial m_RyInitial: : Radial  (coordinates of corner) - Initial Y [0,m_frame_height-1]  Default=m_frame_height/2*/

-+    int32_t m_ryinitial;

-+    /*!< m_rysqrinitial m_RySqrInitial: m_RyInitial^2*/

-+    int32_t m_rysqrinitial;

-+    /*!< m_sad_norm_lut_f1[12] m_SAD_NORM_LUT_f1*/

-+    int32_t m_sad_norm_lut_f1[12];

-+    /*!< m_sad_norm_lut_f2[12] m_SAD_NORM_LUT_f2*/

-+    int32_t m_sad_norm_lut_f2[12];

-+    /*!< m_sad_norm_lut_s1[12] m_SAD_NORM_LUT_s1*/

-+    int32_t m_sad_norm_lut_s1[12];

-+    /*!< m_sad_norm_lut_s2[12] m_SAD_NORM_LUT_s2*/

-+    int32_t m_sad_norm_lut_s2[12];

-+    /*!< m_sad_norm_lut_s3[12] m_SAD_NORM_LUT_s3*/

-+    int32_t m_sad_norm_lut_s3[12];

-+    /*!< m_sad_norm_lut_v[12] m_SAD_NORM_LUT_v*/

-+    int32_t m_sad_norm_lut_v[12];

-+    /*!< m_sig_n_detail_lut_f1[10] m_SIG_N_DETAIL_LUT_f1*/

-+    int32_t m_sig_n_detail_lut_f1[10];

-+    /*!< m_sig_n_detail_lut_f2[10] m_SIG_N_DETAIL_LUT_f1*/

-+    int32_t m_sig_n_detail_lut_f2[10];

-+    /*!< m_sig_n_detail_lut_s1[10] m_SIG_N_DETAIL_LUT_s1*/

-+    int32_t m_sig_n_detail_lut_s1[10];

-+    /*!< m_sig_n_detail_lut_s2[10] m_SIG_N_DETAIL_LUT_s2*/

-+    int32_t m_sig_n_detail_lut_s2[10];

-+    /*!< m_sig_n_detail_lut_s3[10] m_SIG_N_DETAIL_LUT_s2*/

-+    int32_t m_sig_n_detail_lut_s3[10];

-+    /*!< m_sig_n_detail_lut_v[10] m_SIG_N_DETAIL_LUT_v*/

-+    int32_t m_sig_n_detail_lut_v[10];

-+    /*!< m_sig_n_rad_lut_f1[12] m_SIG_N_RAD_LUT_f1*/

-+    int32_t m_sig_n_rad_lut_f1[12];

-+    /*!< m_sig_n_rad_lut_f2[12] m_SIG_N_RAD_LUT_f2*/

-+    int32_t m_sig_n_rad_lut_f2[12];

-+    /*!< m_sig_n_rad_lut_s1[12] m_SIG_N_RAD_LUT_s1*/

-+    int32_t m_sig_n_rad_lut_s1[12];

-+    /*!< m_sig_n_rad_lut_s2[12] m_SIG_N_RAD_LUT_s2*/

-+    int32_t m_sig_n_rad_lut_s2[12];

-+    /*!< m_sig_n_rad_lut_s3[12] m_SIG_N_RAD_LUT_s3*/

-+    int32_t m_sig_n_rad_lut_s3[12];

-+    /*!< m_sig_n_rad_lut_v[12] m_SIG_N_RAD_LUT_v*/

-+    int32_t m_sig_n_rad_lut_v[12];

-+    /*!< m_sve_groups m_SVE_Groups: OBSOLETE*/

-+    int32_t m_sve_groups;

-+    /*!< m_sve_enable m_SVE_enable: OBSOLETE*/

-+    int32_t m_sve_enable;

-+    /*!< m_sve_gain[2] m_SVE_gain: OBSOLETE*/

-+    int32_t m_sve_gain[2];

-+    /*!< m_sve_shift[2] m_SVE_shift: OBSOLETE*/

-+    int32_t m_sve_shift[2];

-+    /*!< m_signglobal_shift1 m_SigNGlobal_SHIFT1: OBSOLETE*/

-+    int32_t m_signglobal_shift1;

-+    /*!< m_signglobal_shift2 m_SigNGlobal_SHIFT2: OBSOLETE*/

-+    int32_t m_signglobal_shift2;

-+    /*!< m_signglobal_sub_flag m_SigNGlobal_SUB_FLAG: OBSOLETE*/

-+    int32_t m_signglobal_sub_flag;

-+    /*!< m_detailidxshiftleft m_detailIdxShiftLeft: detail index shift left - Dynamic range normalization  Fixed=2  [2:7]*/

-+    int32_t m_detailidxshiftleft;

-+    /*!< m_matchqualitycands[16] m_matchQualityCands: match quality index weight pick  4X4   alpha0 inputs  (4 canidates [ 0*/

-+    int32_t m_matchqualitycands[16];

-+    /*!< m_ncandforavgpixel[4] m_nCandForAvgPixel: number of cands. for average pixel  per detail Type  (15..0)+1  Typically=[16 6 4 6]*/

-+    int32_t m_ncandforavgpixel[4];

-+    /*!< m_sortth[15] m_sortTh: sort th index set - THs for Pseudo SORT (Const not to be configured)*/

-+    int32_t m_sortth[15];

-+    /*!< m_statusetopleft m_statUseTopLeft: is top left pixel G/W  (for Bayer start)*/

-+    int32_t m_statusetopleft;

-+    /*!< m_wmaxminth m_wMaxMinTh: Final TH on Max(Weight) to overright Alpha*/

-+    int32_t m_wmaxminth;

-+    /*!< m_wsumminth m_wSumMinTh:  Final TH on Sum(Weight) to overright Alpha*/

-+    int32_t m_wsumminth;

-+    /*!< rad_enable OBSOLETE*/

-+    int32_t rad_enable;

-+

-+} ia_pal_isp_bxt_bnlm_t;

-+

-+/*! \isp struct bxt_ccm

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass block bypass bit*/

-+    int32_t bypass;

-+    /*!< nb1 offset 1 for the transform*/

-+    int32_t nb1;

-+    /*!< nb2 offset 2 for the transform*/

-+    int32_t nb2;

-+    /*!< nb3 offset 3 for the transform*/

-+    int32_t nb3;

-+    /*!< configuration_matrix[9] ccm configuration matrix precision: S4.11*/

-+    int32_t configuration_matrix[9];

-+

-+} ia_pal_isp_bxt_ccm_t;

-+

-+/*! \isp struct bxt_convert16sto8u

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+

-+} ia_pal_isp_bxt_convert16sto8u_t;

-+

-+/*! \isp struct bxt_cropstills

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass block bypass*/

-+    int32_t Bypass;

-+    /*!< LeftBorder crop left border*/

-+    int32_t LeftBorder;

-+    /*!< TopBorder crop top border*/

-+    int32_t TopBorder;

-+    /*!< RightBorder crop right border*/

-+    int32_t RightBorder;

-+    /*!< BottomBorder crop bottom border*/

-+    int32_t BottomBorder;

-+

-+} ia_pal_isp_bxt_cropstills_t;

-+

-+/*! \isp struct bxt_cropvideo

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass block bypass*/

-+    int32_t Bypass;

-+    /*!< LeftBorder crop left border*/

-+    int32_t LeftBorder;

-+    /*!< TopBorder crop top border*/

-+    int32_t TopBorder;

-+    /*!< RightBorder crop right border*/

-+    int32_t RightBorder;

-+    /*!< BottomBorder crop bottom border*/

-+    int32_t BottomBorder;

-+

-+} ia_pal_isp_bxt_cropvideo_t;

-+

-+/*! \isp struct bxt_csc

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_csc_c_matrix_arr[9] CSC Matrix components (S0.14)*/

-+    int32_t m_csc_c_matrix_arr[9];

-+    /*!< m_csc_b_vec_arr[3] CSC Vector components (S0.13)*/

-+    int32_t m_csc_b_vec_arr[3];

-+    /*!< m_chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/

-+    int32_t m_chroma_ds_coeff_arr[8];

-+    /*!< m_chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/

-+    int32_t m_chroma_ds_nf;

-+    /*!< m_bypass Bypassing CSC. Outputting RGB to the Chroma downscale*/

-+    int32_t m_bypass;

-+    /*!< m_uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/

-+    int32_t m_uv_bin_output;

-+

-+} ia_pal_isp_bxt_csc_t;

-+

-+/*! \isp struct bxt_csc_yuv2rgb

-+CSC YUV2RGB Block

-+*/

-+typedef struct

-+{

-+    /*!< coeff_shift coeff_shift*/

-+    int32_t coeff_shift;

-+    /*!< yuv_calibration[3] yuv_calibration*/

-+    int32_t yuv_calibration[3];

-+    /*!< yuv2rgb_coef[9] yuv2rgb_coef*/

-+    int32_t yuv2rgb_coef[9];

-+

-+} ia_pal_isp_bxt_csc_yuv2rgb_t;

-+

-+/*! \isp struct bxt_csc2

-+Color Space Conversion and down-sample to 4:2:0

-+*/

-+typedef struct

-+{

-+    /*!< bypass_0_1 Bypass CSC2*/

-+    int32_t bypass_0_1;

-+    /*!< use_fir_flag use ani-aliasing filter before decimation*/

-+    int32_t use_fir_flag;

-+    /*!< rgb2yuv_coef[3] 3 coefs for Y , 1 for U and 1 for V , Q15*/

-+    int32_t rgb2yuv_coef[3];

-+

-+} ia_pal_isp_bxt_csc2_t;

-+

-+/*! \isp struct bxt_demosaic

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< frame_width Frame width*/

-+    int32_t frame_width;

-+    /*!< gammasg Sharpening coefficient*/

-+    int32_t gammasg;

-+    /*!< lcctrl Checkers removal control*/

-+    int32_t lcctrl;

-+    /*!< crparam1 High frequency denoise param1*/

-+    int32_t crparam1;

-+    /*!< crparam2 High frequency denoise param2*/

-+    int32_t crparam2;

-+    /*!< coringparam False color correction gain*/

-+    int32_t coringparam;

-+    /*!< char_en Checkers removal enable*/

-+    int32_t char_en;

-+    /*!< fcc_en False color correction enable*/

-+    int32_t fcc_en;

-+    /*!< car_en Chroam artifacts removal enable*/

-+    int32_t car_en;

-+    /*!< hfar_en High frequency aliasing reduction correction enable*/

-+    int32_t hfar_en;

-+    /*!< es_enable Edge smoothing enable*/

-+    int32_t es_enable;

-+    /*!< es_pow Edge smoohing enable.*/

-+    int32_t es_pow;

-+    /*!< diag_car_trade_off_th Diagonal regions protection param1*/

-+    int32_t diag_car_trade_off_th;

-+    /*!< diag_car_trade_off_slope Diagonal regions protection param2*/

-+    int32_t diag_car_trade_off_slope;

-+    /*!< stream_ylp_c Coefficient for the YLP for central element of 3x3 neighborhood*/

-+    int32_t stream_ylp_c;

-+    /*!< stream_ylp_p Coefficient for the YLP for peripheral element of 3x3 neighborhood*/

-+    int32_t stream_ylp_p;

-+    /*!< stream_ylp_d Coefficient for the YLP for diagonal element of 3x3 neighborhood*/

-+    int32_t stream_ylp_d;

-+    /*!< stream_ylp_mul_norm Coefficient for multiplier in YLP stream*/

-+    int32_t stream_ylp_mul_norm;

-+    /*!< stream_ylp_norm_shift Coefficient for YLP stream*/

-+    int32_t stream_ylp_norm_shift;

-+    /*!< configunitdiag1_x[2] CU_DIAG1 - x input*/

-+    int32_t configunitdiag1_x[2];

-+    /*!< configunitdiag2_x[2] CU_DIAG2 - x input*/

-+    int32_t configunitdiag2_x[2];

-+    /*!< configunitdiag3_x[2] CU_DIAG3 - x input*/

-+    int32_t configunitdiag3_x[2];

-+    /*!< configunitcar_sat_x[2] CU_CAR_SAT - x input*/

-+    int32_t configunitcar_sat_x[2];

-+    /*!< configunitdiag1_y[1] CU_DIAG1 - y input*/

-+    int32_t configunitdiag1_y[1];

-+    /*!< configunitdiag1_slope[1] CU_DIAG1 - slope input*/

-+    int32_t configunitdiag1_slope[1];

-+    /*!< configunitdiag2_y[1] CU_DIAG2 - y input*/

-+    int32_t configunitdiag2_y[1];

-+    /*!< configunitdiag2_slope[1] CU_DIAG2 - slope input*/

-+    int32_t configunitdiag2_slope[1];

-+    /*!< configunitdiag3_y[1] CU_DIAG3 - y input*/

-+    int32_t configunitdiag3_y[1];

-+    /*!< configunitdiag3_slope[1] CU_DIAG3 - slope input*/

-+    int32_t configunitdiag3_slope[1];

-+    /*!< configunitcar_sat_y[1] CU_CAR_SAT - y input*/

-+    int32_t configunitcar_sat_y[1];

-+    /*!< configunitcar_sat_slope[1] CU_CAR_SAT - slope input*/

-+    int32_t configunitcar_sat_slope[1];

-+

-+} ia_pal_isp_bxt_demosaic_t;

-+

-+/*! \isp struct bxt_disparity

-+

-+*/

-+typedef struct

-+{

-+    /*!< green_pos gb position*/

-+    int32_t green_pos;

-+    /*!< lc_cu_x[4] local contrast config unit x*/

-+    int32_t lc_cu_x[4];

-+    /*!< lc_cu_y[3] local contrast config unit y*/

-+    int32_t lc_cu_y[3];

-+    /*!< lc_cu_slope[3] local contrast config unit slope*/

-+    int32_t lc_cu_slope[3];

-+    /*!< delta_cu_x[4] delta config unit x*/

-+    int32_t delta_cu_x[4];

-+    /*!< delta_cu_y[3] delta config unit y*/

-+    int32_t delta_cu_y[3];

-+    /*!< delta_cu_slope[3] delta config unit slope*/

-+    int32_t delta_cu_slope[3];

-+    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/

-+    int32_t inv_lc_cu_x[8];

-+    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/

-+    int32_t inv_lc_cu_y[7];

-+    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/

-+    int32_t inv_lc_cu_slope[7];

-+    /*!< inv_delta_cu_x[8] inverse delta config unit x*/

-+    int32_t inv_delta_cu_x[8];

-+    /*!< inv_delta_cu_y[7] inverse delta config unit y*/

-+    int32_t inv_delta_cu_y[7];

-+    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/

-+    int32_t inv_delta_cu_slope[7];

-+    /*!< detail_pres detail preservation factor*/

-+    int32_t detail_pres;

-+    /*!< invscale scale factor after normalizing by inverse*/

-+    int32_t invscale;

-+

-+} ia_pal_isp_bxt_disparity_t;

-+

-+/*! \isp struct bxt_dpc

-+

-+*/

-+typedef struct

-+{

-+    /*!< afxoffset[8] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

-+    int32_t afxoffset[8];

-+    /*!< afxperiod[8] 8 Autofocus pixels X axis period*/

-+    int32_t afxperiod[8];

-+    /*!< afyoffset[8] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

-+    int32_t afyoffset[8];

-+    /*!< afyperiod[8] 8 Autofocus pixels Y axis period*/

-+    int32_t afyperiod[8];

-+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

-+    int32_t hdrfactors[16];

-+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

-+    int32_t hdrfactorsinverse[16];

-+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_slope[7];

-+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_x[8];

-+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_y[7];

-+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_slope[7];

-+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_x[8];

-+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_y[7];

-+    /*!< configunitfix_slope[3] fix config unit*/

-+    int32_t configunitfix_slope[3];

-+    /*!< configunitfix_x[4] fix config unit*/

-+    int32_t configunitfix_x[4];

-+    /*!< configunitfix_y[3] fix config unit*/

-+    int32_t configunitfix_y[3];

-+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_slope[7];

-+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_x[8];

-+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_y[7];

-+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_slope[7];

-+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_x[8];

-+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_y[7];

-+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

-+    int32_t configunitrawvslb_slope[7];

-+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

-+    int32_t configunitrawvslb_x[8];

-+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

-+    int32_t configunitrawvslb_y[7];

-+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

-+    int32_t configunitrawvsub_slope[7];

-+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

-+    int32_t configunitrawvsub_x[8];

-+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

-+    int32_t configunitrawvsub_y[7];

-+    /*!< curx[1024] x locations of the static bad pixels*/

-+    int32_t curx[1024];

-+    /*!< cury[1024] y locations of the static bad pixels*/

-+    int32_t cury[1024];

-+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t lbtype[16];

-+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t ubtype[16];

-+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

-+    int32_t pelesttype[16];

-+    /*!< dtype[16] 0-D1 1-D2  2-D3*/

-+    int32_t dtype[16];

-+    /*!< lbmasks[64] configurations related to the bayer pattern*/

-+    int32_t lbmasks[64];

-+    /*!< ubmasks[64] configurations related to the bayer pattern*/

-+    int32_t ubmasks[64];

-+    /*!< pmasks[384] configurations related to the bayer pattern*/

-+    int32_t pmasks[384];

-+    /*!< dmasks[48] configurations related to the bayer pattern*/

-+    int32_t dmasks[48];

-+    /*!< bitreduceshift Shift value for bit reduce block*/

-+    int32_t bitreduceshift;

-+    /*!< afenable enable for the AF unit block*/

-+    int32_t afenable;

-+    /*!< staticenable enable for the static LUT block*/

-+    int32_t staticenable;

-+    /*!< dynamicenable enable for the dynamic detection block*/

-+    int32_t dynamicenable;

-+    /*!< n_static_lut_entries number of static lut entries*/

-+    int32_t n_static_lut_entries;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< frame_height frame height*/

-+    int32_t frame_height;

-+    /*!< paf_grid0_en paf enable0*/

-+    int32_t paf_grid0_en;

-+    /*!< paf_grid1_en paf enable1*/

-+    int32_t paf_grid1_en;

-+    /*!< paf_grid2_en paf enable2*/

-+    int32_t paf_grid2_en;

-+    /*!< paf_grid3_en paf enable3*/

-+    int32_t paf_grid3_en;

-+    /*!< paf_grid4_en paf enable4*/

-+    int32_t paf_grid4_en;

-+    /*!< paf_grid5_en paf enable5*/

-+    int32_t paf_grid5_en;

-+    /*!< paf_grid6_en paf enable6*/

-+    int32_t paf_grid6_en;

-+    /*!< paf_grid7_en paf enable7*/

-+    int32_t paf_grid7_en;

-+

-+} ia_pal_isp_bxt_dpc_t;

-+

-+/*! \isp struct bxt_dpcm_decode

-+

-+*/

-+typedef struct

-+{

-+    /*!< first_pix_res first pixel resolution*/

-+    int32_t first_pix_res;

-+    /*!< bypass block bypass bit*/

-+    int32_t bypass;

-+    /*!< code[6] The codes array*/

-+    int32_t code[6];

-+    /*!< codethr[6] The threshold for using the next code*/

-+    int32_t codethr[6];

-+    /*!< codemask[6] Used for extracting the code from the coded word*/

-+    int32_t codemask[6];

-+    /*!< valuemask[6] Used for extracting the value from the coded word*/

-+    int32_t valuemask[6];

-+    /*!< signmask[6] Used for extracting the sign from the coded word*/

-+    int32_t signmask[6];

-+    /*!< lowresthrnum Code threshold for lower resolution coding*/

-+    int32_t lowresthrnum;

-+

-+} ia_pal_isp_bxt_dpcm_decode_t;

-+

-+/*! \isp struct bxt_dpcm_encode

-+

-+*/

-+typedef struct

-+{

-+    /*!< first_pix_res first pixel resolution*/

-+    int32_t first_pix_res;

-+    /*!< bypass block bypass bit*/

-+    int32_t bypass;

-+    /*!< code[6] The codes array*/

-+    int32_t code[6];

-+    /*!< codethr[6] The threshold for using the next code*/

-+    int32_t codethr[6];

-+    /*!< codemask[6] Used for extracting the code from the coded word*/

-+    int32_t codemask[6];

-+    /*!< valuemask[6] Used for extracting the value from the coded word*/

-+    int32_t valuemask[6];

-+    /*!< signmask[6] Used for extracting the sign from the coded word*/

-+    int32_t signmask[6];

-+    /*!< lowresthrnum Code threshold for lower resolution coding*/

-+    int32_t lowresthrnum;

-+

-+} ia_pal_isp_bxt_dpcm_encode_t;

-+

-+/*! \isp struct bxt_dvsstatistics

-+

-+*/

-+typedef struct

-+{

-+    /*!< kappa Global configuration - kappa*/

-+    int32_t kappa;

-+    /*!< match_shift Global configuration - match_shift*/

-+    int32_t match_shift;

-+    /*!< ybin_mode Global configuration - y binning mode*/

-+    int32_t ybin_mode;

-+    /*!< grid_width_l0 DVS statistics grid width level 0*/

-+    int32_t grid_width_l0;

-+    /*!< grid_height_l0 DVS statistics grid height level 0*/

-+    int32_t grid_height_l0;

-+    /*!< block_width_l0 DVS statistics block width level 0*/

-+    int32_t block_width_l0;

-+    /*!< block_height_l0 DVS statistics block height level 0*/

-+    int32_t block_height_l0;

-+    /*!< x_start_l0 DVS statistics level 0 x start*/

-+    int32_t x_start_l0;

-+    /*!< y_start_l0 DVS statistics level 0 y start*/

-+    int32_t y_start_l0;

-+    /*!< enabled_l0 DVS statistics level 0 enable*/

-+    int32_t enabled_l0;

-+    /*!< x_end_l0 DVS statistics level 0 x end*/

-+    int32_t x_end_l0;

-+    /*!< y_end_l0 DVS statistics level 0 y end*/

-+    int32_t y_end_l0;

-+    /*!< grid_width_l1 DVS statistics grid width level 1*/

-+    int32_t grid_width_l1;

-+    /*!< grid_height_l1 DVS statistics grid height level 1*/

-+    int32_t grid_height_l1;

-+    /*!< block_width_l1 DVS statistics block width level 1*/

-+    int32_t block_width_l1;

-+    /*!< block_height_l1 DVS statistics block height level 1*/

-+    int32_t block_height_l1;

-+    /*!< x_start_l1 DVS statistics level 1 x start*/

-+    int32_t x_start_l1;

-+    /*!< y_start_l1 DVS statistics level 1 y start*/

-+    int32_t y_start_l1;

-+    /*!< enabled_l1 DVS statistics level 1 enable*/

-+    int32_t enabled_l1;

-+    /*!< x_end_l1 DVS statistics level 1 x end*/

-+    int32_t x_end_l1;

-+    /*!< y_end_l1 DVS statistics level 1 y end*/

-+    int32_t y_end_l1;

-+    /*!< grid_width_l2 DVS statistics grid width level 2*/

-+    int32_t grid_width_l2;

-+    /*!< grid_height_l2 DVS statistics grid height level 2*/

-+    int32_t grid_height_l2;

-+    /*!< block_width_l2 DVS statistics block width level 2*/

-+    int32_t block_width_l2;

-+    /*!< block_height_l2 DVS statistics block height level 2*/

-+    int32_t block_height_l2;

-+    /*!< x_start_l2 DVS statistics level 2 x start*/

-+    int32_t x_start_l2;

-+    /*!< y_start_l2 DVS statistics level 2 y start*/

-+    int32_t y_start_l2;

-+    /*!< enabled_l2 DVS statistics level 2 enable*/

-+    int32_t enabled_l2;

-+    /*!< x_end_l2 DVS statistics level 2 x end*/

-+    int32_t x_end_l2;

-+    /*!< y_end_l2 DVS statistics level 2 y end*/

-+    int32_t y_end_l2;

-+    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/

-+    int32_t feroi_x_start_l0;

-+    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/

-+    int32_t feroi_y_start_l0;

-+    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/

-+    int32_t feroi_x_end_l0;

-+    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/

-+    int32_t feroi_y_end_l0;

-+    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/

-+    int32_t feroi_x_start_l1;

-+    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/

-+    int32_t feroi_y_start_l1;

-+    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/

-+    int32_t feroi_x_end_l1;

-+    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/

-+    int32_t feroi_y_end_l1;

-+    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/

-+    int32_t feroi_x_start_l2;

-+    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/

-+    int32_t feroi_y_start_l2;

-+    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/

-+    int32_t feroi_x_end_l2;

-+    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/

-+    int32_t feroi_y_end_l2;

-+

-+} ia_pal_isp_bxt_dvsstatistics_t;

-+

-+/*! \isp struct bxt_gammatm

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable for the filter*/

-+    int32_t enable;

-+    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa. 0- TM --> Gamma. 1- Gamma-->TM*/

-+    int32_t gammaBeforeTM;

-+    /*!< a1 shift amount at stage 1*/

-+    int32_t a1;

-+    /*!< a2 shift amount at stage 2*/

-+    int32_t a2;

-+    /*!< a3 shift amount at stage 3*/

-+    int32_t a3;

-+    /*!< gamma_lut_enable enable for gamma lut*/

-+    int32_t gamma_lut_enable;

-+    /*!< gamma_lut_base_level[5] base level for gamma lut*/

-+    int32_t gamma_lut_base_level[5];

-+    /*!< gamma_lut_step[5] step for gamma lut*/

-+    int32_t gamma_lut_step[5];

-+    /*!< gamma_lut_start_bin[5] start bin for gamma lut*/

-+    int32_t gamma_lut_start_bin[5];

-+    /*!< gamma_lut_size gamma lut size*/

-+    int32_t gamma_lut_size;

-+    /*!< gamma_lut_gen_lut[385] generalized lut for gamma lut*/

-+    int32_t gamma_lut_gen_lut[385];

-+    /*!< tm_lut_enable enable for tone mapping lut*/

-+    int32_t tm_lut_enable;

-+    /*!< tm_lut_base_level[1] base level for  tone mapping lut*/

-+    int32_t tm_lut_base_level[1];

-+    /*!< tm_lut_step[1] step for  tone mapping lut*/

-+    int32_t tm_lut_step[1];

-+    /*!< tm_lut_start_bin[1] start bin for  tone mapping lut*/

-+    int32_t tm_lut_start_bin[1];

-+    /*!< tm_lut_size tone mapping lut size*/

-+    int32_t tm_lut_size;

-+    /*!< tm_lut_gen_lut[513] generalized lut for tone mapping lut*/

-+    int32_t tm_lut_gen_lut[513];

-+

-+} ia_pal_isp_bxt_gammatm_t;

-+

-+/*! \isp struct bxt_gridbaseob

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

-+    int32_t blc_log2gridwidth;

-+    /*!< blc_log2gridheight log2 of grid of each subplane height*/

-+    int32_t blc_log2gridheight;

-+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t blc_col_start;

-+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t blc_row_start;

-+    /*!< blc_grid_tablec00[4096] gridob grid table*/

-+    int32_t blc_grid_tablec00[4096];

-+    /*!< blc_grid_tablec01[4096] gridob grid table*/

-+    int32_t blc_grid_tablec01[4096];

-+    /*!< blc_grid_tablec02[4096] gridob grid table*/

-+    int32_t blc_grid_tablec02[4096];

-+    /*!< blc_grid_tablec03[4096] gridob grid table*/

-+    int32_t blc_grid_tablec03[4096];

-+    /*!< blc_grid_tablec10[4096] gridob grid table*/

-+    int32_t blc_grid_tablec10[4096];

-+    /*!< blc_grid_tablec11[4096] gridob grid table*/

-+    int32_t blc_grid_tablec11[4096];

-+    /*!< blc_grid_tablec12[4096] gridob grid table*/

-+    int32_t blc_grid_tablec12[4096];

-+    /*!< blc_grid_tablec13[4096] gridob grid table*/

-+    int32_t blc_grid_tablec13[4096];

-+    /*!< blc_grid_tablec20[4096] gridob grid table*/

-+    int32_t blc_grid_tablec20[4096];

-+    /*!< blc_grid_tablec21[4096] gridob grid table*/

-+    int32_t blc_grid_tablec21[4096];

-+    /*!< blc_grid_tablec22[4096] gridob grid table*/

-+    int32_t blc_grid_tablec22[4096];

-+    /*!< blc_grid_tablec23[4096] gridob grid table*/

-+    int32_t blc_grid_tablec23[4096];

-+    /*!< blc_grid_tablec30[4096] gridob grid table*/

-+    int32_t blc_grid_tablec30[4096];

-+    /*!< blc_grid_tablec31[4096] gridob grid table*/

-+    int32_t blc_grid_tablec31[4096];

-+    /*!< blc_grid_tablec32[4096] gridob grid table*/

-+    int32_t blc_grid_tablec32[4096];

-+    /*!< blc_grid_tablec33[4096] gridob grid table*/

-+    int32_t blc_grid_tablec33[4096];

-+    /*!< blc_table_width table width*/

-+    int32_t blc_table_width;

-+    /*!< blc_table_height table height*/

-+    int32_t blc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_gridbaseob_t;

-+

-+/*! \isp struct bxt_gridbaseob_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

-+    int32_t blc_log2gridwidth;

-+    /*!< blc_log2gridheight log2 of grid of each subplane height*/

-+    int32_t blc_log2gridheight;

-+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t blc_col_start;

-+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t blc_row_start;

-+    /*!< blc_grid_tablec00[4096] gridob grid table*/

-+    int32_t blc_grid_tablec00[4096];

-+    /*!< blc_grid_tablec01[4096] gridob grid table*/

-+    int32_t blc_grid_tablec01[4096];

-+    /*!< blc_grid_tablec02[4096] gridob grid table*/

-+    int32_t blc_grid_tablec02[4096];

-+    /*!< blc_grid_tablec03[4096] gridob grid table*/

-+    int32_t blc_grid_tablec03[4096];

-+    /*!< blc_grid_tablec10[4096] gridob grid table*/

-+    int32_t blc_grid_tablec10[4096];

-+    /*!< blc_grid_tablec11[4096] gridob grid table*/

-+    int32_t blc_grid_tablec11[4096];

-+    /*!< blc_grid_tablec12[4096] gridob grid table*/

-+    int32_t blc_grid_tablec12[4096];

-+    /*!< blc_grid_tablec13[4096] gridob grid table*/

-+    int32_t blc_grid_tablec13[4096];

-+    /*!< blc_grid_tablec20[4096] gridob grid table*/

-+    int32_t blc_grid_tablec20[4096];

-+    /*!< blc_grid_tablec21[4096] gridob grid table*/

-+    int32_t blc_grid_tablec21[4096];

-+    /*!< blc_grid_tablec22[4096] gridob grid table*/

-+    int32_t blc_grid_tablec22[4096];

-+    /*!< blc_grid_tablec23[4096] gridob grid table*/

-+    int32_t blc_grid_tablec23[4096];

-+    /*!< blc_grid_tablec30[4096] gridob grid table*/

-+    int32_t blc_grid_tablec30[4096];

-+    /*!< blc_grid_tablec31[4096] gridob grid table*/

-+    int32_t blc_grid_tablec31[4096];

-+    /*!< blc_grid_tablec32[4096] gridob grid table*/

-+    int32_t blc_grid_tablec32[4096];

-+    /*!< blc_grid_tablec33[4096] gridob grid table*/

-+    int32_t blc_grid_tablec33[4096];

-+    /*!< blc_table_width table width*/

-+    int32_t blc_table_width;

-+    /*!< blc_table_height table height*/

-+    int32_t blc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_gridbaseob_b_t;

-+

-+/*! \isp struct bxt_gridbaseob_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

-+    int32_t blc_log2gridwidth;

-+    /*!< blc_log2gridheight log2 of grid of each subplane height*/

-+    int32_t blc_log2gridheight;

-+    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t blc_col_start;

-+    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t blc_row_start;

-+    /*!< blc_grid_tablec00[4096] gridob grid table*/

-+    int32_t blc_grid_tablec00[4096];

-+    /*!< blc_grid_tablec01[4096] gridob grid table*/

-+    int32_t blc_grid_tablec01[4096];

-+    /*!< blc_grid_tablec02[4096] gridob grid table*/

-+    int32_t blc_grid_tablec02[4096];

-+    /*!< blc_grid_tablec03[4096] gridob grid table*/

-+    int32_t blc_grid_tablec03[4096];

-+    /*!< blc_grid_tablec10[4096] gridob grid table*/

-+    int32_t blc_grid_tablec10[4096];

-+    /*!< blc_grid_tablec11[4096] gridob grid table*/

-+    int32_t blc_grid_tablec11[4096];

-+    /*!< blc_grid_tablec12[4096] gridob grid table*/

-+    int32_t blc_grid_tablec12[4096];

-+    /*!< blc_grid_tablec13[4096] gridob grid table*/

-+    int32_t blc_grid_tablec13[4096];

-+    /*!< blc_grid_tablec20[4096] gridob grid table*/

-+    int32_t blc_grid_tablec20[4096];

-+    /*!< blc_grid_tablec21[4096] gridob grid table*/

-+    int32_t blc_grid_tablec21[4096];

-+    /*!< blc_grid_tablec22[4096] gridob grid table*/

-+    int32_t blc_grid_tablec22[4096];

-+    /*!< blc_grid_tablec23[4096] gridob grid table*/

-+    int32_t blc_grid_tablec23[4096];

-+    /*!< blc_grid_tablec30[4096] gridob grid table*/

-+    int32_t blc_grid_tablec30[4096];

-+    /*!< blc_grid_tablec31[4096] gridob grid table*/

-+    int32_t blc_grid_tablec31[4096];

-+    /*!< blc_grid_tablec32[4096] gridob grid table*/

-+    int32_t blc_grid_tablec32[4096];

-+    /*!< blc_grid_tablec33[4096] gridob grid table*/

-+    int32_t blc_grid_tablec33[4096];

-+    /*!< blc_table_width table width*/

-+    int32_t blc_table_width;

-+    /*!< blc_table_height table height*/

-+    int32_t blc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_gridbaseob_c_t;

-+

-+/*! \isp struct bxt_inputscaler

-+

-+*/

-+typedef struct

-+{

-+    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/

-+    int32_t block_bypass;

-+    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

-+    int32_t demo_bypass;

-+    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

-+    int32_t scaler_bypass;

-+    /*!< vnumerator Vertical SF Numerator*/

-+    int32_t vnumerator;

-+    /*!< hnumerator Horizontal SF Numerator*/

-+    int32_t hnumerator;

-+    /*!< vdenominator Vertical SF Denominator*/

-+    int32_t vdenominator;

-+    /*!< hdenominator Horizontal SF Denominator*/

-+    int32_t hdenominator;

-+    /*!< norm_mul Normalization multiply coefficient*/

-+    int32_t norm_mul;

-+    /*!< norm_shift Normalization shift*/

-+    int32_t norm_shift;

-+    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

-+    int32_t output_sensor_mode;

-+    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/

-+    int32_t output_format_matrix[16];

-+    /*!< Input_Frame_Width Input frame width.*/

-+    int32_t Input_Frame_Width;

-+    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/

-+    int32_t input_is_bayer;

-+    /*!< output_height Has to be a multiple of 4.*/

-+    int32_t output_height;

-+    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/

-+    int32_t output_width;

-+    /*!< shift_to_lb Shifting before LB*/

-+    int32_t shift_to_lb;

-+    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

-+    int32_t input_sensor_mode;

-+    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/

-+    int32_t is_ul_w;

-+    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/

-+    int32_t bayer_type;

-+    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/

-+    int32_t lut_values[16];

-+    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/

-+    int32_t lut_shifts1[16];

-+    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/

-+    int32_t lut_shifts2[16];

-+    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/

-+    int32_t lut_subtraction_flags[16];

-+    /*!< lut_output_values[16] QNN LUT - Output Values*/

-+    int32_t lut_output_values[16];

-+    /*!< kernel_g_coef[6] G kernel - Coefs*/

-+    int32_t kernel_g_coef[6];

-+    /*!< kernel_g_norm File for G kernel - Norm*/

-+    int32_t kernel_g_norm;

-+    /*!< cbf_div_cu_x[12] Config unit division - X points*/

-+    int32_t cbf_div_cu_x[12];

-+    /*!< cbf_div_cu_y[11] Config unit division - Y points*/

-+    int32_t cbf_div_cu_y[11];

-+    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/

-+    int32_t cbf_div_cu_slope[11];

-+    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/

-+    int32_t cbi_r_pos[96];

-+    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/

-+    int32_t cbi_r_wgt[96];

-+    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}*/

-+    int32_t cbi_g_pos[96];

-+    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}*/

-+    int32_t cbi_g_wgt[96];

-+    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/

-+    int32_t cbi_b_pos[96];

-+    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/

-+    int32_t cbi_b_wgt[96];

-+    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/

-+    int32_t wb_matrix[16];

-+    /*!< r_wb_gain WB R gain*/

-+    int32_t r_wb_gain;

-+    /*!< g_wb_gain WB G gain*/

-+    int32_t g_wb_gain;

-+    /*!< b_wb_gain WB B gain*/

-+    int32_t b_wb_gain;

-+

-+} ia_pal_isp_bxt_inputscaler_t;

-+

-+/*! \isp struct bxt_inputscalerv2

-+

-+*/

-+typedef struct

-+{

-+    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/

-+    int32_t block_bypass;

-+    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

-+    int32_t demo_bypass;

-+    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

-+    int32_t scaler_bypass;

-+    /*!< vnumerator Vertical   SF Numerator*/

-+    int32_t vnumerator;

-+    /*!< hnumerator Horizontal SF Numerator*/

-+    int32_t hnumerator;

-+    /*!< vdenominator Vertical   SF Denominator*/

-+    int32_t vdenominator;

-+    /*!< hdenominator Horizontal SF Denominator*/

-+    int32_t hdenominator;

-+    /*!< norm_mul Normalization multiply coeffiecient*/

-+    int32_t norm_mul;

-+    /*!< norm_shift Normalization shift*/

-+    int32_t norm_shift;

-+    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

-+    int32_t output_sensor_mode;

-+    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/

-+    int32_t output_format_matrix[16];

-+    /*!< Input_Frame_Width Input frame width. Has to be a multiple of 4.*/

-+    int32_t Input_Frame_Width;

-+    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/

-+    int32_t input_is_bayer;

-+    /*!< output_height Has to be a multiple of 4.*/

-+    int32_t output_height;

-+    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/

-+    int32_t output_width;

-+    /*!< shift_to_lb Shifting before LB*/

-+    int32_t shift_to_lb;

-+    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

-+    int32_t input_sensor_mode;

-+    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/

-+    int32_t is_ul_w;

-+    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/

-+    int32_t bayer_type;

-+    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/

-+    int32_t lut_values[16];

-+    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/

-+    int32_t lut_shifts1[16];

-+    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/

-+    int32_t lut_shifts2[16];

-+    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/

-+    int32_t lut_subtraction_flags[16];

-+    /*!< lut_output_values[16] QNN LUT - Output Values*/

-+    int32_t lut_output_values[16];

-+    /*!< kernel_g_coef[6] G kernel - Coefs*/

-+    int32_t kernel_g_coef[6];

-+    /*!< kernel_g_norm File for G kernel - Norm*/

-+    int32_t kernel_g_norm;

-+    /*!< cbf_div_cu_x[12] Config unit division - X points*/

-+    int32_t cbf_div_cu_x[12];

-+    /*!< cbf_div_cu_y[11] Config unit division - Y points*/

-+    int32_t cbf_div_cu_y[11];

-+    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/

-+    int32_t cbf_div_cu_slope[11];

-+    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/

-+    int32_t cbi_r_pos[96];

-+    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/

-+    int32_t cbi_r_wgt[96];

-+    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}. Not used in Bayer (only in RGBC).*/

-+    int32_t cbi_g_pos[96];

-+    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}. Not used in Bayer (only in RGBC).*/

-+    int32_t cbi_g_wgt[96];

-+    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/

-+    int32_t cbi_b_pos[96];

-+    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/

-+    int32_t cbi_b_wgt[96];

-+    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/

-+    int32_t wb_matrix[16];

-+    /*!< r_wb_gain WB R gain. 4096 is equal to gain 1.*/

-+    int32_t r_wb_gain;

-+    /*!< g_wb_gain WB G gain. 4096 is equal to gain 1.*/

-+    int32_t g_wb_gain;

-+    /*!< b_wb_gain WB B gain. 4096 is equal to gain 1.*/

-+    int32_t b_wb_gain;

-+    /*!< g_min_r_en Enable 'G-R' mode*/

-+    int32_t g_min_r_en;

-+

-+} ia_pal_isp_bxt_inputscalerv2_t;

-+

-+/*! \isp struct bxt_isl_inputcrop

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_xstart;

-+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_ystart;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+

-+} ia_pal_isp_bxt_isl_inputcrop_t;

-+

-+/*! \isp struct bxt_linearization

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< linc00[65] linearization grid table*/

-+    int32_t linc00[65];

-+    /*!< linc01[65] linearization grid table*/

-+    int32_t linc01[65];

-+    /*!< linc02[65] linearization grid table*/

-+    int32_t linc02[65];

-+    /*!< linc03[65] linearization grid table*/

-+    int32_t linc03[65];

-+    /*!< linc10[65] linearization grid table*/

-+    int32_t linc10[65];

-+    /*!< linc11[65] linearization grid table*/

-+    int32_t linc11[65];

-+    /*!< linc12[65] linearization grid table*/

-+    int32_t linc12[65];

-+    /*!< linc13[65] linearization grid table*/

-+    int32_t linc13[65];

-+    /*!< linc20[65] linearization grid table*/

-+    int32_t linc20[65];

-+    /*!< linc21[65] linearization grid table*/

-+    int32_t linc21[65];

-+    /*!< linc22[65] linearization grid table*/

-+    int32_t linc22[65];

-+    /*!< linc23[65] linearization grid table*/

-+    int32_t linc23[65];

-+    /*!< linc30[65] linearization grid table*/

-+    int32_t linc30[65];

-+    /*!< linc31[65] linearization grid table*/

-+    int32_t linc31[65];

-+    /*!< linc32[65] linearization grid table*/

-+    int32_t linc32[65];

-+    /*!< linc33[65] linearization grid table*/

-+    int32_t linc33[65];

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_linearization_t;

-+

-+/*! \isp struct bxt_lsc

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< lsclog2gridwidth log2 width of each subplane*/

-+    int32_t lsclog2gridwidth;

-+    /*!< lsclog2gridheight log2 height of each subplane*/

-+    int32_t lsclog2gridheight;

-+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_col_start;

-+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_row_start;

-+    /*!< lsc_exp resolution modifier of the lsc tables*/

-+    int32_t lsc_exp;

-+    /*!< lsc_grid_tablec00[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec00[4096];

-+    /*!< lsc_grid_tablec01[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec01[4096];

-+    /*!< lsc_grid_tablec02[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec02[4096];

-+    /*!< lsc_grid_tablec03[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec03[4096];

-+    /*!< lsc_grid_tablec10[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec10[4096];

-+    /*!< lsc_grid_tablec11[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec11[4096];

-+    /*!< lsc_grid_tablec12[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec12[4096];

-+    /*!< lsc_grid_tablec13[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec13[4096];

-+    /*!< lsc_grid_tablec20[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec20[4096];

-+    /*!< lsc_grid_tablec21[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec21[4096];

-+    /*!< lsc_grid_tablec22[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec22[4096];

-+    /*!< lsc_grid_tablec23[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec23[4096];

-+    /*!< lsc_grid_tablec30[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec30[4096];

-+    /*!< lsc_grid_tablec31[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec31[4096];

-+    /*!< lsc_grid_tablec32[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec32[4096];

-+    /*!< lsc_grid_tablec33[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec33[4096];

-+    /*!< lsc_table_width table width*/

-+    int32_t lsc_table_width;

-+    /*!< lsc_table_height table height*/

-+    int32_t lsc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_lsc_t;

-+

-+/*! \isp struct bxt_norm_lin

-+

-+*/

-+typedef struct

-+{

-+    /*!< lut[257] Normalization lut*/

-+    int32_t lut[257];

-+    /*!< lin_en Linearization enable*/

-+    int32_t lin_en;

-+    /*!< lshift The size of normalized shift (signed)*/

-+    int32_t lshift;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_norm_lin_t;

-+

-+/*! \isp struct bxt_norm_lin_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< lut[257] Normalization lut*/

-+    int32_t lut[257];

-+    /*!< lin_en Linearization enable*/

-+    int32_t lin_en;

-+    /*!< lshift The size of normalized shift (signed)*/

-+    int32_t lshift;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_norm_lin_b_t;

-+

-+/*! \isp struct bxt_norm_lin_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< lut[257] Normalization lut*/

-+    int32_t lut[257];

-+    /*!< lin_en Linearization enable*/

-+    int32_t lin_en;

-+    /*!< lshift The size of normalized shift (signed)*/

-+    int32_t lshift;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_bxt_norm_lin_c_t;

-+

-+/*! \isp struct bxt_ofa_dp

-+

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling;

-+    /*!< pack_mode pack mode for packer*/

-+    int32_t pack_mode;

-+    /*!< bypass_flip bypass flip*/

-+    int32_t bypass_flip;

-+    /*!< bypass_mirror bypass mirror*/

-+    int32_t bypass_mirror;

-+    /*!< bypass_reduced_range bypass reduced range*/

-+    int32_t bypass_reduced_range;

-+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e[2];

-+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o[2];

-+

-+} ia_pal_isp_bxt_ofa_dp_t;

-+

-+/*! \isp struct bxt_ofa_mp

-+

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling;

-+    /*!< pack_mode pack mode for packer*/

-+    int32_t pack_mode;

-+    /*!< bypass_flip bypass flip*/

-+    int32_t bypass_flip;

-+    /*!< bypass_mirror bypass mirror*/

-+    int32_t bypass_mirror;

-+    /*!< bypass_reduced_range bypass reduced range*/

-+    int32_t bypass_reduced_range;

-+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e[2];

-+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o[2];

-+

-+} ia_pal_isp_bxt_ofa_mp_t;

-+

-+/*! \isp struct bxt_ofa_ppp

-+

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling;

-+    /*!< pack_mode pack mode for packer*/

-+    int32_t pack_mode;

-+    /*!< bypass_flip bypass flip*/

-+    int32_t bypass_flip;

-+    /*!< bypass_mirror bypass mirror*/

-+    int32_t bypass_mirror;

-+    /*!< bypass_reduced_range bypass reduced range*/

-+    int32_t bypass_reduced_range;

-+    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e[2];

-+    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o[2];

-+

-+} ia_pal_isp_bxt_ofa_ppp_t;

-+

-+/*! \isp struct bxt_paddingsupport

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/

-+    int32_t m_padval;

-+

-+} ia_pal_isp_bxt_paddingsupport_t;

-+

-+/*! \isp struct bxt_pafstatistics

-+

-+*/

-+typedef struct

-+{

-+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

-+    int32_t paf_en;

-+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

-+    int32_t paf_frame_width;

-+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

-+    int32_t paf_frame_height;

-+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

-+    int32_t skip_horizontal_start;

-+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

-+    int32_t skip_vertical_start;

-+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

-+    int32_t block_width;

-+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

-+    int32_t block_height;

-+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

-+    int32_t accum_horizontal;

-+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

-+    int32_t skip_horizontal;

-+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

-+    int32_t accum_vertical;

-+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

-+    int32_t skip_vertical;

-+    /*!< min_shift minimum evaluation shift in steps*/

-+    int32_t min_shift;

-+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

-+    int32_t shift_steps;

-+    /*!< paf_shift_step_size phase evaluation step size in pixels*/

-+    int32_t paf_shift_step_size;

-+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

-+    int32_t paf_shifter;

-+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

-+    int32_t split_accross_multiple_lines;

-+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

-+    int32_t pixels_per_line;

-+    /*!< input_modes 0: RRRR + LLLL; 1: LLLL + RRRR; 2: RLRL; 3: LRLR; 4: RRRR + LLLL alternate; 5: LLLL + RRRR alternate; 6: RLRL alternate; 7: LRLR alternate*/

-+    int32_t input_modes;

-+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

-+    int32_t input_bpp;

-+    /*!< int_prec internal precision of PAF pixels*/

-+    int32_t int_prec;

-+

-+} ia_pal_isp_bxt_pafstatistics_t;

-+

-+/*! \isp struct bxt_pixelformatter

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_ColRemoval col removal- for setting bayer pattern*/

-+    int32_t m_ColRemoval;

-+    /*!< m_RowRemoval row removal- for setting bayer pattern*/

-+    int32_t m_RowRemoval;

-+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_xstart;

-+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_ystart;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/

-+    int32_t m_padval;

-+

-+} ia_pal_isp_bxt_pixelformatter_t;

-+

-+/*! \isp struct bxt_pixprecadapter

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_t;

-+

-+/*! \isp struct bxt_pixprecadapter_postvcr

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_postvcr_t;

-+

-+/*! \isp struct bxt_pixprecadapter_precropstills

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_precropstills_t;

-+

-+/*! \isp struct bxt_pixprecadapter_precropvideo

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_precropvideo_t;

-+

-+/*! \isp struct bxt_pixprecadapter_precsc2

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_precsc2_t;

-+

-+/*! \isp struct bxt_pixprecadapter_pregdc

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_pregdc_t;

-+

-+/*! \isp struct bxt_pixprecadapter_prevcud

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_prevcud_t;

-+

-+/*! \isp struct bxt_pixprecadapter_prewb

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_bxt_pixprecadapter_prewb_t;

-+

-+/*! \isp struct bxt_rynr_collector

-+

-+*/

-+typedef struct

-+{

-+    /*!< input_pin dummy parameter for HW purpose; 1 - Stills, 0 - Video*/

-+    int32_t input_pin;

-+

-+} ia_pal_isp_bxt_rynr_collector_t;

-+

-+/*! \isp struct bxt_rynr_splitter

-+

-+*/

-+typedef struct

-+{

-+    /*!< input_pin Which input pin connect to output: if 1 (Stills), output pin is InputPin1 (pcsBayer), if 0 (Video), output pin is InputPin0 (pcsYUV420)*/

-+    int32_t input_pin;

-+

-+} ia_pal_isp_bxt_rynr_splitter_t;

-+

-+/*! \isp struct bxt_shift14to16bit

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass        {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_shiftmode Shift : 14To16(0), 16To14(1)*/

-+    int32_t m_shiftmode;

-+    /*!< m_isbayer Is Bayer? - Bayer(0) RGB(1)*/

-+    int32_t m_isbayer;

-+

-+} ia_pal_isp_bxt_shift14to16bit_t;

-+

-+/*! \isp struct bxt_tnr5v1

-+

-+*/

-+typedef struct

-+{

-+    /*!< nm_luma_lut[64] Noise model LUMA lut (for I core)*/

-+    int32_t nm_luma_lut[64];

-+    /*!< nm_chroma_lut[64] Noise model Chroma LUT (for I core)*/

-+    int32_t nm_chroma_lut[64];

-+    /*!< nm_spnr_lut[64] Noise model LUMA lut, for II core, beem used by spNR*/

-+    int32_t nm_spnr_lut[64];

-+    /*!< nm_radial_lut[128] Noise model radial Lut*/

-+    int32_t nm_radial_lut[128];

-+    /*!< nm_radial_r2_shift Noise model radial shift*/

-+    int32_t nm_radial_r2_shift;

-+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

-+    int32_t nm_radial_y_center;

-+    /*!< co_max_content maximal value for the content*/

-+    int32_t co_max_content;

-+    /*!< co_content_shift shift right for content*/

-+    int32_t co_content_shift;

-+    /*!< fm_sim_lut[64] FMVE Similarity LUT for grade calculation*/

-+    int32_t fm_sim_lut[64];

-+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

-+    int32_t fm_dist_weights[128];

-+    /*!< fm_sad_shift shift for the SAD values in the FMVE sub-block (using realigning)*/

-+    int32_t fm_sad_shift;

-+    /*!< fm_sim_arg_shift shift for FMVE similarity arg values.*/

-+    int32_t fm_sim_arg_shift;

-+    /*!< mvd_sim_lut[64] MVD Similarity LUT*/

-+    int32_t mvd_sim_lut[64];

-+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

-+    int32_t mvd_sad_shift;

-+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

-+    int32_t mvd_arg_g_static;

-+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

-+    int32_t mvd_arg_g_static_local;

-+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

-+    int32_t mvd_arg_g_move;

-+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

-+    int32_t mvd_arg_g_move_local;

-+    /*!< spnr_lut_h[64] spNR BF lut for horizontal direction*/

-+    int32_t spnr_lut_h[64];

-+    /*!< spnr_lut_v[64] spNR BF lut for vertical direction*/

-+    int32_t spnr_lut_v[64];

-+    /*!< pb_weight_pre_max maximal spTNR weight*/

-+    int32_t pb_weight_pre_max;

-+    /*!< pb_weight_in_min The minimal weight of the input frame at the blended output image.*/

-+    int32_t pb_weight_in_min;

-+    /*!< no_fmve FMVE debug flag, 0-run, 1-don't run, 2- don't run, but run content*/

-+    int32_t no_fmve;

-+    /*!< bypass bypass flag, output is 4 bit shifted input*/

-+    int32_t bypass;

-+    /*!< framenumber frame number. Should be in PAL*/

-+    int32_t framenumber;

-+    /*!< g_mv_x global  MV_X. Should be in PAL*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y. Should be in PAL*/

-+    int32_t g_mv_y;

-+

-+} ia_pal_isp_bxt_tnr5v1_t;

-+

-+/*! \isp struct bxt_vcr

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass_0_1 Bypass VCR*/

-+    int32_t bypass_0_1;

-+

-+} ia_pal_isp_bxt_vcr_t;

-+

-+/*! \isp struct bxt_vcr2

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass_0_1 Bypass VCR2*/

-+    int32_t bypass_0_1;

-+    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/

-+    int32_t input_format_420;

-+    /*!< lpf_p0_c0 Phase 0 - coef 0*/

-+    int32_t lpf_p0_c0;

-+    /*!< lpf_p0_c1 Phase 0 - coef 1*/

-+    int32_t lpf_p0_c1;

-+    /*!< lpf_p0_c2 Phase 0 - coef 2*/

-+    int32_t lpf_p0_c2;

-+    /*!< lpf_p0_c3 Phase 0 - coef 3*/

-+    int32_t lpf_p0_c3;

-+    /*!< lpf_p1_c0 Phase 1 - coef 0*/

-+    int32_t lpf_p1_c0;

-+    /*!< lpf_p1_c1 Phase 1 - coef 1*/

-+    int32_t lpf_p1_c1;

-+    /*!< lpf_p1_c2 Phase 1 - coef 2*/

-+    int32_t lpf_p1_c2;

-+    /*!< lpf_p1_c3 Phase 1 - coef 3*/

-+    int32_t lpf_p1_c3;

-+

-+} ia_pal_isp_bxt_vcr2_t;

-+

-+/*! \isp struct bxt_vcsc

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< gain Matrix table gain exponent*/

-+    int32_t gain;

-+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

-+    int32_t coef_matrix[12];

-+    /*!< t0 matrix offeset 0 (y)*/

-+    int32_t t0;

-+    /*!< t1 matrix offeset 1 (u)*/

-+    int32_t t1;

-+    /*!< t2 matrix offeset y (v)*/

-+    int32_t t2;

-+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_h;

-+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_v;

-+

-+} ia_pal_isp_bxt_vcsc_t;

-+

-+/*! \isp struct bxt_vcsc_stills

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< gain Matrix table gain exponent*/

-+    int32_t gain;

-+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

-+    int32_t coef_matrix[12];

-+    /*!< t0 matrix offeset 0 (y)*/

-+    int32_t t0;

-+    /*!< t1 matrix offeset 1 (u)*/

-+    int32_t t1;

-+    /*!< t2 matrix offeset y (v)*/

-+    int32_t t2;

-+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_h;

-+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_v;

-+

-+} ia_pal_isp_bxt_vcsc_stills_t;

-+

-+/*! \isp struct bxt_vcsc_video

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< gain Matrix table gain exponent*/

-+    int32_t gain;

-+    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

-+    int32_t coef_matrix[12];

-+    /*!< t0 matrix offeset 0 (y)*/

-+    int32_t t0;

-+    /*!< t1 matrix offeset 1 (u)*/

-+    int32_t t1;

-+    /*!< t2 matrix offeset y (v)*/

-+    int32_t t2;

-+    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_h;

-+    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

-+    int32_t fir_alpha_v;

-+

-+} ia_pal_isp_bxt_vcsc_video_t;

-+

-+/*! \isp struct bxt_vcud

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< chm_offset_u U bias*/

-+    int32_t chm_offset_u;

-+    /*!< chm_offset_v V bias*/

-+    int32_t chm_offset_v;

-+    /*!< chm_gain gain exponent of chroma metric*/

-+    int32_t chm_gain;

-+    /*!< lcs_th_low Low Chroma suppression threshold low*/

-+    int32_t lcs_th_low;

-+    /*!< lcs_th_high Low Chroma suppression threshold high*/

-+    int32_t lcs_th_high;

-+    /*!< cu_lcs_x_points[6] CU LCS X points*/

-+    int32_t cu_lcs_x_points[6];

-+    /*!< cu_lcs_y_points[5] CU LCS Y points*/

-+    int32_t cu_lcs_y_points[5];

-+    /*!< cu_lcs_slopes[5] CU LCS Slopes, Q4*/

-+    int32_t cu_lcs_slopes[5];

-+    /*!< cu_noise_x_points[7] CU Noise X points*/

-+    int32_t cu_noise_x_points[7];

-+    /*!< cu_noise_y_points[6] CU Noise Y points*/

-+    int32_t cu_noise_y_points[6];

-+    /*!< cu_noise_slopes[6] CU Noise Slopes, Q5*/

-+    int32_t cu_noise_slopes[6];

-+    /*!< cu_radial_x_points[6] CU Radial X points*/

-+    int32_t cu_radial_x_points[6];

-+    /*!< cu_radial_y_points[5] CU Radial Y points*/

-+    int32_t cu_radial_y_points[5];

-+    /*!< cu_radial_slopes[5] CU Radial Slopes, Q8*/

-+    int32_t cu_radial_slopes[5];

-+    /*!< cu_psdiv_lcs_x_points[12] CU psdiv_lcs X points*/

-+    int32_t cu_psdiv_lcs_x_points[12];

-+    /*!< cu_psdiv_lcs_y_points[11] CU psdiv_lcs Y points*/

-+    int32_t cu_psdiv_lcs_y_points[11];

-+    /*!< cu_psdiv_lcs_slopes[11] CU psdiv_lcs Slopes, Q10*/

-+    int32_t cu_psdiv_lcs_slopes[11];

-+    /*!< cu_psdiv_jbl_x_points[12] CU psdiv_jbl X points*/

-+    int32_t cu_psdiv_jbl_x_points[12];

-+    /*!< cu_psdiv_jbl_y_points[11] CU psdiv_jbl Y points*/

-+    int32_t cu_psdiv_jbl_y_points[11];

-+    /*!< cu_psdiv_jbl_slopes[11] CU psdiv_jbl Slopes, Q10*/

-+    int32_t cu_psdiv_jbl_slopes[11];

-+    /*!< noise_beta[9] Noise model Beta coefficients*/

-+    int32_t noise_beta[9];

-+    /*!< lpf_coefs[6] Bilatheral Spatial filter coefficients , Q10, {c0, c3,c4,c6,c7,c8}*/

-+    int32_t lpf_coefs[6];

-+    /*!< jbl_center_loc JBL center location for noise model*/

-+    int32_t jbl_center_loc;

-+    /*!< jbl_sigma_y JBL Y noise sigma power, Q6*/

-+    int32_t jbl_sigma_y;

-+    /*!< jbl_sigma_u JBL U noise  sigma power, Q6*/

-+    int32_t jbl_sigma_u;

-+    /*!< jbl_sigma_v JBL V noise sigma power, Q6*/

-+    int32_t jbl_sigma_v;

-+    /*!< jbl_dist_epsilon JBL minmum distance*/

-+    int32_t jbl_dist_epsilon;

-+    /*!< jbl_noise_epsilon2 JBL minimum noise estimation*/

-+    int32_t jbl_noise_epsilon2;

-+    /*!< jbl_exp2_min JBL minimum value similarity weight (exp^1/2x^2)*/

-+    int32_t jbl_exp2_min;

-+    /*!< jbl_weight_th JBL minimum weight threshold*/

-+    int32_t jbl_weight_th;

-+    /*!< upscale_only_en 0 - VCUD do denoising and duplicate chroma to 4:4:4, 1 - VCUD do only bicubic chroma upsampling to 4:4:4*/

-+    int32_t upscale_only_en;

-+    /*!< rad_en Enable Radial parameters*/

-+    int32_t rad_en;

-+    /*!< rad_x_reset top left pixel X location relative to the optical center point*/

-+    int32_t rad_x_reset;

-+    /*!< rad_y_reset top left pixel Y location relative to the optical center point*/

-+    int32_t rad_y_reset;

-+    /*!< rad_x2_reset rad_x_reset * rad_x_reset*/

-+    int32_t rad_x2_reset;

-+    /*!< rad_y2_reset rad_y_reset * rad_y_reset*/

-+    int32_t rad_y2_reset;

-+    /*!< rad_nf exponent gain for rad_inv_r2*/

-+    int32_t rad_nf;

-+    /*!< rad_inv_r2 1/radius * 2^???*/

-+    int32_t rad_inv_r2;

-+    /*!< rad_jbl_sigma_y Radial*/

-+    int32_t rad_jbl_sigma_y;

-+    /*!< rad_jbl_sigma_u Radial*/

-+    int32_t rad_jbl_sigma_u;

-+    /*!< rad_jbl_sigma_v Radial*/

-+    int32_t rad_jbl_sigma_v;

-+    /*!< rad_jbl_dist_epsilon Radial*/

-+    int32_t rad_jbl_dist_epsilon;

-+    /*!< rad_jbl_noise_epsilon2 Radial*/

-+    int32_t rad_jbl_noise_epsilon2;

-+

-+} ia_pal_isp_bxt_vcud_t;

-+

-+/*! \isp struct bxt_wb

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass            {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

-+    int32_t m_gainch0;

-+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

-+    int32_t m_gainch1;

-+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

-+    int32_t m_gainch2;

-+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

-+    int32_t m_gainch3;

-+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

-+    int32_t m_gainch4;

-+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

-+    int32_t m_gainch5;

-+    /*!< m_gainch6 Gain Channel6 (U4.12)*/

-+    int32_t m_gainch6;

-+    /*!< m_gainch7 Gain Channel7 (U4.12)*/

-+    int32_t m_gainch7;

-+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

-+    int32_t m_sensormode;

-+    /*!< m_wbindmat[16] Vector WB matrix*/

-+    int32_t m_wbindmat[16];

-+

-+} ia_pal_isp_bxt_wb_t;

-+

-+/*! \isp struct bxt_wb_stills

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass            {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

-+    int32_t m_gainch0;

-+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

-+    int32_t m_gainch1;

-+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

-+    int32_t m_gainch2;

-+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

-+    int32_t m_gainch3;

-+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

-+    int32_t m_gainch4;

-+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

-+    int32_t m_gainch5;

-+    /*!< m_gainch6 Gain Channel6 (U4.12)*/

-+    int32_t m_gainch6;

-+    /*!< m_gainch7 Gain Channel7 (U4.12)*/

-+    int32_t m_gainch7;

-+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

-+    int32_t m_sensormode;

-+    /*!< m_wbindmat[16] Vector WB matrix*/

-+    int32_t m_wbindmat[16];

-+

-+} ia_pal_isp_bxt_wb_stills_t;

-+

-+/*! \isp struct bxt_xnr4_m

-+Scalable Chroma and Luma Denoise, Medium and High Frequency

-+*/

-+typedef struct

-+{

-+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

-+    int32_t jbl_mf_bypass_y;

-+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

-+    int32_t jbl_mf_bypass_c;

-+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

-+    int32_t noise_sigma_mf_y_y;

-+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

-+    int32_t noise_sigma_mf_y_s;

-+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

-+    int32_t noise_sigma_mf_c_y;

-+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

-+    int32_t noise_sigma_mf_c_u;

-+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

-+    int32_t noise_sigma_mf_c_v;

-+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_y_y;

-+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

-+    int32_t rad_noise_sigma_mf_y_s;

-+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_c_y;

-+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

-+    int32_t rad_noise_sigma_mf_c_u;

-+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

-+    int32_t rad_noise_sigma_mf_c_v;

-+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_y_y;

-+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_c_y;

-+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

-+    int32_t noise_epsilon_mf_c_u;

-+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

-+    int32_t noise_epsilon_mf_c_v;

-+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_y_y;

-+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_y;

-+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_u;

-+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_v;

-+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_y;

-+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_c;

-+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

-+    int32_t lpf_mf_coef_y[49];

-+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

-+    int32_t lpf_mf_coef_c[49];

-+    /*!< range_weight_lut[7] JBL range Weight LUT*/

-+    int32_t range_weight_lut[7];

-+    /*!< blend_mf_power_y MF denoise blending power y*/

-+    int32_t blend_mf_power_y;

-+    /*!< blend_mf_power_c MF denoise blending power chroma*/

-+    int32_t blend_mf_power_c;

-+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

-+    int32_t rad_blend_mf_power_y;

-+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

-+    int32_t rad_blend_mf_power_c;

-+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

-+    int32_t noise_beta_y_0;

-+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

-+    int32_t noise_beta_u_0;

-+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

-+    int32_t noise_beta_u_1;

-+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

-+    int32_t noise_beta_v_0;

-+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

-+    int32_t noise_beta_v_2;

-+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_x;

-+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_y;

-+    /*!< rad_exp Radial scale bit into the Lut*/

-+    int32_t rad_exp;

-+    /*!< rad_lut[128] Radial LUT*/

-+    int32_t rad_lut[128];

-+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

-+    int32_t one_div_64_lut[64];

-+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

-+    int32_t xcu_divsqrt_exp;

-+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

-+    int32_t xcu_divsqrt_slp_a_res;

-+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

-+    int32_t xcu_divsqrt_offset[16];

-+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

-+    int32_t xcu_divsqrt_slope[16];

-+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

-+    int32_t xcu_divsqrt_x[17];

-+

-+} ia_pal_isp_bxt_xnr4_m_t;

-+

-+/*! \isp struct bxt_xnr4_mh

-+Scalable Chroma and Luma Denoise, Medium and High Frequency

-+*/

-+typedef struct

-+{

-+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

-+    int32_t jbl_mf_bypass_y;

-+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

-+    int32_t jbl_mf_bypass_c;

-+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

-+    int32_t noise_sigma_mf_y_y;

-+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

-+    int32_t noise_sigma_mf_y_s;

-+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

-+    int32_t noise_sigma_mf_c_y;

-+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

-+    int32_t noise_sigma_mf_c_u;

-+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

-+    int32_t noise_sigma_mf_c_v;

-+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_y_y;

-+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

-+    int32_t rad_noise_sigma_mf_y_s;

-+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_c_y;

-+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

-+    int32_t rad_noise_sigma_mf_c_u;

-+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

-+    int32_t rad_noise_sigma_mf_c_v;

-+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_y_y;

-+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_c_y;

-+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

-+    int32_t noise_epsilon_mf_c_u;

-+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

-+    int32_t noise_epsilon_mf_c_v;

-+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_y_y;

-+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_y;

-+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_u;

-+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_v;

-+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_y;

-+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_c;

-+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

-+    int32_t lpf_mf_coef_y[49];

-+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

-+    int32_t lpf_mf_coef_c[49];

-+    /*!< range_weight_lut[7] JBL range Weight LUT*/

-+    int32_t range_weight_lut[7];

-+    /*!< blend_mf_power_y MF denoise blending power y*/

-+    int32_t blend_mf_power_y;

-+    /*!< blend_mf_power_c MF denoise blending power chroma*/

-+    int32_t blend_mf_power_c;

-+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

-+    int32_t rad_blend_mf_power_y;

-+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

-+    int32_t rad_blend_mf_power_c;

-+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

-+    int32_t noise_beta_y_0;

-+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

-+    int32_t noise_beta_u_0;

-+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

-+    int32_t noise_beta_u_1;

-+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

-+    int32_t noise_beta_v_0;

-+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

-+    int32_t noise_beta_v_2;

-+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_x;

-+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_y;

-+    /*!< rad_exp Radial scale bit into the Lut*/

-+    int32_t rad_exp;

-+    /*!< rad_lut[128] Radial LUT*/

-+    int32_t rad_lut[128];

-+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

-+    int32_t one_div_64_lut[64];

-+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

-+    int32_t xcu_divsqrt_exp;

-+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

-+    int32_t xcu_divsqrt_slp_a_res;

-+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

-+    int32_t xcu_divsqrt_offset[16];

-+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

-+    int32_t xcu_divsqrt_slope[16];

-+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

-+    int32_t xcu_divsqrt_x[17];

-+    /*!< jbl_hf_bypass_c Bypass HF Chroma*/

-+    int32_t jbl_hf_bypass_c;

-+    /*!< noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma*/

-+    int32_t noise_sigma_hf_c_y;

-+    /*!< noise_sigma_hf_c_u Noise Sigma HF Chroma per U*/

-+    int32_t noise_sigma_hf_c_u;

-+    /*!< noise_sigma_hf_c_v Noise Sigma HF Chroma per V*/

-+    int32_t noise_sigma_hf_c_v;

-+    /*!< rad_noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma - radial*/

-+    int32_t rad_noise_sigma_hf_c_y;

-+    /*!< rad_noise_sigma_hf_c_u Noise Sigma HF Chroma per U - radial*/

-+    int32_t rad_noise_sigma_hf_c_u;

-+    /*!< rad_noise_sigma_hf_c_v Noise Sigma HF Chroma per V - radial*/

-+    int32_t rad_noise_sigma_hf_c_v;

-+    /*!< noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_hf_c_y;

-+    /*!< noise_epsilon_hf_c_u Chroma min noise variance per U , Q12*/

-+    int32_t noise_epsilon_hf_c_u;

-+    /*!< noise_epsilon_hf_c_v Chroma min noise variance per V , Q12*/

-+    int32_t noise_epsilon_hf_c_v;

-+    /*!< rad_noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_hf_c_y;

-+    /*!< rad_noise_epsilon_hf_c_u Chroma min noise variance per U , Q12 -radial*/

-+    int32_t rad_noise_epsilon_hf_c_u;

-+    /*!< rad_noise_epsilon_hf_c_v Chroma min noise variance per V , Q12 -radial*/

-+    int32_t rad_noise_epsilon_hf_c_v;

-+    /*!< lpf_hf_coef_c[49] HF JBL Spatial coefs for Chroma*/

-+    int32_t lpf_hf_coef_c[49];

-+    /*!< jbl_weight_th_hf_c Chroma Weight threshold of HF JBL*/

-+    int32_t jbl_weight_th_hf_c;

-+    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/

-+    int32_t lcs_th_low;

-+    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/

-+    int32_t lcs_th_high_delta;

-+    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/

-+    int32_t rad_lcs_th_low;

-+    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/

-+    int32_t rad_lcs_th_high_delta;

-+    /*!< xcu_lcs_exp XCU ed exponent*/

-+    int32_t xcu_lcs_exp;

-+    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/

-+    int32_t xcu_lcs_slp_a_res;

-+    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/

-+    int32_t xcu_lcs_offset[32];

-+    /*!< xcu_lcs_slope[32] XCU ed slope vector*/

-+    int32_t xcu_lcs_slope[32];

-+    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/

-+    int32_t xcu_lcs_x[33];

-+    /*!< nncu_hf_luma_blend_exp NNCU HF Luma blend  exponent*/

-+    int32_t nncu_hf_luma_blend_exp;

-+    /*!< nncu_hf_luma_blend_offset[64] NNCU HF Luma blend offset vector*/

-+    int32_t nncu_hf_luma_blend_offset[64];

-+    /*!< nncu_hf_luma_blend_x_0 NNCU HF Luma blend first X cordinate*/

-+    int32_t nncu_hf_luma_blend_x_0;

-+    /*!< nncu_hf_luma_blend_x_max NNCU HF Luma blend last X cordinate ( the #65 corrdinate -1)*/

-+    int32_t nncu_hf_luma_blend_x_max;

-+    /*!< hf_luma_power HF Luma denoise power, Q15*/

-+    int32_t hf_luma_power;

-+    /*!< rad_hf_luma_power HF Luma denoise power, Q15 -radial*/

-+    int32_t rad_hf_luma_power;

-+    /*!< blend_hf_power_c blend_mf_power_c HF denoise blending power chroma*/

-+    int32_t blend_hf_power_c;

-+

-+} ia_pal_isp_bxt_xnr4_mh_t;

-+

-+/*! \isp struct call_info

-+Call info contains timestamp of current call to calculate ISP parameters. This information is used to determine run rate of each PAL component.

-+*/

-+typedef struct

-+{

-+    /*!< timestamp[2] Timestamp of current iteration. 64 bit value (using both int32 values in the array as one).*/

-+    int32_t timestamp[2];

-+

-+} ia_pal_isp_call_info_t;

-+

-+/*! \isp struct cas_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Block enable for HW use*/

-+    int32_t enable;

-+    /*!< x_center Optical center x. Bittage is enough to fit 16K resolution*/

-+    int32_t x_center;

-+    /*!< y_center Optical center y. Bittage is enough to fit 16K resolution*/

-+    int32_t y_center;

-+    /*!< x_start Starting column of the fragment. Max number of pixels per line in a stripe is 4096*/

-+    int32_t x_start;

-+    /*!< y_start Starting row of the fragment (Usualy will be 0)*/

-+    int32_t y_start;

-+    /*!< inv_spatial_model[16] Describes the inverse spatial noise*/

-+    int32_t inv_spatial_model[16];

-+    /*!< spatial_step_log2 log2 of spatial lut step size. Bittage is enough for supporting 8192x4320 resulotion*/

-+    int32_t spatial_step_log2;

-+    /*!< nm_lut[16] noise model for luma. Save&restore register (will be ovveride in video mode)*/

-+    int32_t nm_lut[16];

-+    /*!< apu_alpha_limit update mechanism in apu - as limit increases, we need more measurements for the histogram bins to be considered as reliable.*/

-+    int32_t apu_alpha_limit;

-+    /*!< apu_alpha_power update mechanism in apu - as power increase, we count more on the new val calculated then the one from previous frame.*/

-+    int32_t apu_alpha_power;

-+    /*!< hist_vals[256] histogram valuse of APU to flow between fragments. save and restore. 2D array of size 16*(2^(4))( HWP_APU_N_VALUES*(1<<HWP_APU_HIST_N_BINS_EXP)). precision is 20 (HWP_APU_HIST_BIN_BITTAGE)*/

-+    int32_t hist_vals[256];

-+    /*!< skin_sharp_suppression_power Suppress sharpening in human skin areas*/

-+    int32_t skin_sharp_suppression_power;

-+    /*!< signal_metric_low_th low threshold for normalizing signal metric map*/

-+    int32_t signal_metric_low_th;

-+    /*!< signal_metric_slope slope for normalizing signal metric map*/

-+    int32_t signal_metric_slope;

-+    /*!< texture_noise_regulator detects less textures for higher values [0,0.2]*/

-+    int32_t texture_noise_regulator;

-+    /*!< texture_low_th low threshold for normalizing texture map. Values below this threshold will be consider as none texture.*/

-+    int32_t texture_low_th;

-+    /*!< texture_slope slope for normalizing texture map. This will be used to calculate the high threshold*/

-+    int32_t texture_slope;

-+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

-+    int32_t unsharpfilter[15];

-+    /*!< power_luma_control_enable enables the luma control mechanism*/

-+    int32_t power_luma_control_enable;

-+    /*!< cu_power_luma_control_x[4] x axis values for luma sharpening config-unit*/

-+    int32_t cu_power_luma_control_x[4];

-+    /*!< cu_power_luma_control_y[3] y axis values for luma sharpening config-unit*/

-+    int32_t cu_power_luma_control_y[3];

-+    /*!< cu_power_luma_control_slope[3] slope values for luma sharpening config-unit*/

-+    int32_t cu_power_luma_control_slope[3];

-+    /*!< power_spatial_control_th adapts the power sharpening to spatial location - this threshold is the distance from which the adaptation begins*/

-+    int32_t power_spatial_control_th;

-+    /*!< power_spatial_control_multiply_factor adapts the power sharpening to spatial location - this it the factor for the power sharpening in the periphrial regions.*/

-+    int32_t power_spatial_control_multiply_factor;

-+    /*!< power_spatial_control_slope adapts the power sharpening to spatial location - this slope is how fast the adaptation with respect to the distance from the center. In order to bypass spatial control mechanism assign this variable to 0*/

-+    int32_t power_spatial_control_slope;

-+    /*!< sharpening_power_texture Power of unsharp-mask sharpening for texture regions*/

-+    int32_t sharpening_power_texture;

-+    /*!< sharpening_power_edges Power of unsharp-mask sharpening for edges regions*/

-+    int32_t sharpening_power_edges;

-+    /*!< skin_uv_center[2] center of the UV ellipse in UV space*/

-+    int32_t skin_uv_center[2];

-+    /*!< skin_uv_ellipse[3] minor and major axis UV ellipse. Symetric matrix therfore reducing values to 3 instead of 4*/

-+    int32_t skin_uv_ellipse[3];

-+    /*!< skin_uv_low_th low threshold for normalizing non-skin area map. Values below this threshold will be consider as skin.*/

-+    int32_t skin_uv_low_th;

-+    /*!< skin_uv_slope slope for normalizing non-skin map. This will be used to calculate the high threshold*/

-+    int32_t skin_uv_slope;

-+    /*!< skin_smoothing blending factor for smooting human skin using the bilateral*/

-+    int32_t skin_smoothing;

-+    /*!< inv_denoise_power 0 - strong denoiser, 63 - weak denoiser*/

-+    int32_t inv_denoise_power;

-+    /*!< sort_low_undershoots Sorting low undershoots*/

-+    int32_t sort_low_undershoots;

-+    /*!< alfa_os controls edged overshoot. 0 - no overshoot allowed, 63 - max overshoot allowed*/

-+    int32_t alfa_os;

-+    /*!< alfa_us controls edged undershoot. 0 - no undershoot allowed, 63 - max undershoot allowed*/

-+    int32_t alfa_us;

-+    /*!< os_us_delta_compression_threshold overshood/undershood delta which exceed threshold will be compressed. 0-no OS/US allowed. 511-no OS/US clipping.*/

-+    int32_t os_us_delta_compression_threshold;

-+    /*!< saturated_color_shrap_suppression_th the sharpening for max(u,v) above this threshold wll be suppressed*/

-+    int32_t saturated_color_shrap_suppression_th;

-+    /*!< saturated_color_shrap_suppression_factor the sharpening for max(u,v) above threshold wll be suppressed by this factor*/

-+    int32_t saturated_color_shrap_suppression_factor;

-+    /*!< os_us_delta_compression_factor overshoot / undershoot compression factor*/

-+    int32_t os_us_delta_compression_factor;

-+    /*!< conf_low_th the minimum number of samples consider reliable for APU estimation*/

-+    int32_t conf_low_th;

-+    /*!< conf_slope slope for normalizing confidence map. This will be used to calculate the high threshold*/

-+    int32_t conf_slope;

-+

-+} ia_pal_isp_cas_1_0_t;

-+

-+/*! \isp struct ccm_3a_2_0

-+AE color correction

-+*/

-+typedef struct

-+{

-+    /*!< gain_cx[8] WB coefficients*/

-+    int32_t gain_cx[8];

-+    /*!< m_1x[4] CCM matrix coefficients M11 - M14 (-4..4)*/

-+    int32_t m_1x[4];

-+    /*!< m_2x[4] CCM matrix coefficients M21 - M24 (-4..4)*/

-+    int32_t m_2x[4];

-+    /*!< m_3x[4] CCM matrix coefficients M21 - M24 (-4..4)*/

-+    int32_t m_3x[4];

-+    /*!< c_x[4] Y-calc matrix coefficients C01 - C04*/

-+    int32_t c_x[4];

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+

-+} ia_pal_isp_ccm_3a_2_0_t;

-+

-+/*! \isp struct comp_spliter

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass bypass*/

-+    int32_t m_bypass;

-+

-+} ia_pal_isp_comp_spliter_t;

-+

-+/*! \isp struct compand_1_0

-+Companding 24bit --> 15bit

-+*/

-+typedef struct

-+{

-+    /*!< enable enable the companding*/

-+    int32_t enable;

-+    /*!< compand_enable enable the companding CU*/

-+    int32_t compand_enable;

-+    /*!< cu_companding_x[13] U24 linear, default log-limited*/

-+    int32_t cu_companding_x[13];

-+    /*!< cu_companding_y[12] U15 companded output*/

-+    int32_t cu_companding_y[12];

-+    /*!< cu_companding_slope[12] U1.14 15bit slopes for companding*/

-+    int32_t cu_companding_slope[12];

-+    /*!< linear_pedestal U24, Pedestal added in linear domain*/

-+    int32_t linear_pedestal;

-+

-+} ia_pal_isp_compand_1_0_t;

-+

-+/*! \isp struct crop_sis

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable pre SIS crop*/

-+    int32_t enable;

-+    /*!< crop_col_start crop_col_start*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_crop_sis_t;

-+

-+/*! \isp struct cvt_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enables the filter*/

-+    int32_t enable;

-+    /*!< enable_upsample enables upsampling (YUV422 --> YUV444)*/

-+    int32_t enable_upsample;

-+    /*!< enable_downsample enables downsampling (YUV444 --> YUV422)*/

-+    int32_t enable_downsample;

-+    /*!< enable_csc enables color space conversion (YUV  <--> RGB)*/

-+    int32_t enable_csc;

-+    /*!< enable_vertical_decimation enables vertical decimation*/

-+    int32_t enable_vertical_decimation;

-+    /*!< enable_horizontal_decimation enabled horizontal decimation*/

-+    int32_t enable_horizontal_decimation;

-+    /*!< enable_shuffle enables_shuffle*/

-+    int32_t enable_shuffle;

-+    /*!< csc_matrix[9] yuv to rgb to yuv conversion matrix, S4.11*/

-+    int32_t csc_matrix[9];

-+    /*!< shuffle_map_component_0 shuffle mapping of component 0*/

-+    int32_t shuffle_map_component_0;

-+    /*!< shuffle_map_component_1 shuffle mapping of component 1*/

-+    int32_t shuffle_map_component_1;

-+    /*!< shuffle_map_component_2 shuffle mapping of component 2*/

-+    int32_t shuffle_map_component_2;

-+    /*!< shuffle_map_component_3 shuffle mapping of component 3*/

-+    int32_t shuffle_map_component_3;

-+    /*!< shuffle_map_component_4 shuffle mapping of component 4*/

-+    int32_t shuffle_map_component_4;

-+    /*!< shuffle_map_component_5 shuffle mapping of component 5*/

-+    int32_t shuffle_map_component_5;

-+

-+} ia_pal_isp_cvt_1_0_t;

-+

-+/*! \isp struct debug_info

-+

-+*/

-+typedef struct

-+{

-+    /*!< output_data_id Output data ID. Debugging data to match P2P call sequence with correct PAL output data. AIC increments this value by 1 on every call to ia_isp_bxt_run().*/

-+    int32_t output_data_id;

-+

-+} ia_pal_isp_debug_info_t;

-+

-+/*! \isp struct decompand_1_0

-+Decompanding 15bit --> 24bit

-+*/

-+typedef struct

-+{

-+    /*!< enable enable the decompanding*/

-+    int32_t enable;

-+    /*!< decompand_enable enable the decompanding CU*/

-+    int32_t decompand_enable;

-+    /*!< cu_decompanding_x[13] U15 linear, companded*/

-+    int32_t cu_decompanding_x[13];

-+    /*!< cu_decompanding_y[12] U24 decompanded output, default log-limited*/

-+    int32_t cu_decompanding_y[12];

-+    /*!< cu_decompanding_slope[12] U20.6 26bit slopes for companding*/

-+    int32_t cu_decompanding_slope[12];

-+    /*!< linear_pedestal U24, Pedestal added in linear domain*/

-+    int32_t linear_pedestal;

-+

-+} ia_pal_isp_decompand_1_0_t;

-+

-+/*! \isp struct dehaze_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enabling the block. If enable is false, output is RGB obtained w/o 'dehazing'*/

-+    int32_t enable;

-+    /*!< dehaze_power the strength of the dehazing - obtained from previous frame*/

-+    int32_t dehaze_power;

-+    /*!< coeff_al overall airlight intrusion parameter*/

-+    int32_t coeff_al;

-+    /*!< airlight_color[3] airlight color - obtained from previouse frame*/

-+    int32_t airlight_color[3];

-+    /*!< trans_min minimal accepted tranmission used for transmition map calculation*/

-+    int32_t trans_min;

-+    /*!< trans_max maximal accepted tranmission used for transmition map calculation*/

-+    int32_t trans_max;

-+    /*!< quasi_satur_coeff quasi saturation coefficient*/

-+    int32_t quasi_satur_coeff;

-+    /*!< high_th threshold defining 'edges'*/

-+    int32_t high_th;

-+    /*!< low_th threshold defining 'flats'*/

-+    int32_t low_th;

-+    /*!< low_sim_alpha weight of the haze calculated on area used on 'edges'*/

-+    int32_t low_sim_alpha;

-+    /*!< med_sim_alpha weigh of the haze calculated on area used everwhere except edges and 'flats'*/

-+    int32_t med_sim_alpha;

-+    /*!< saturation_amp color saturation boost*/

-+    int32_t saturation_amp;

-+    /*!< update_power_weight mixing coefficient between the old and the new power (defines dynamic behaviour)*/

-+    int32_t update_power_weight;

-+    /*!< update_haze_color_weight mixing coefficient between the old and the new haze color (defines dynamic behaviour)*/

-+    int32_t update_haze_color_weight;

-+    /*!< min_tr_for_haze_color minimal transmision value for haze color calculation*/

-+    int32_t min_tr_for_haze_color;

-+    /*!< max_tr_for_haze_color maximal transmision value for haze color calculation*/

-+    int32_t max_tr_for_haze_color;

-+    /*!< cu_trans_x[7] power config unit x values*/

-+    int32_t cu_trans_x[7];

-+    /*!< cu_trans_y[6] power config unit y values*/

-+    int32_t cu_trans_y[6];

-+    /*!< cu_trans_slopes[6] power config unit slopes values*/

-+    int32_t cu_trans_slopes[6];

-+    /*!< cu_power_x[4] transmission config unit x values*/

-+    int32_t cu_power_x[4];

-+    /*!< cu_power_y[3] transmission config unit y values*/

-+    int32_t cu_power_y[3];

-+    /*!< cu_power_slopes[3] transmission config unit y values*/

-+    int32_t cu_power_slopes[3];

-+    /*!< max_h_for_update max H value to use for haze color and power updates*/

-+    int32_t max_h_for_update;

-+    /*!< CCM_yuv2rgb_matrix[9] matrix for conversion from Yuv to RGB*/

-+    int32_t CCM_yuv2rgb_matrix[9];

-+    /*!< max_uv_haze_color maximal u and v values of haze color*/

-+    int32_t max_uv_haze_color;

-+    /*!< fragment_h_acc accumulator for haze coordinate value sum on the fragment*/

-+    int32_t fragment_h_acc;

-+    /*!< fragment_x1_acc accumulator for x1 coordinate value sum on the fragment*/

-+    int32_t fragment_x1_acc;

-+    /*!< fragment_x2_acc accumulator for x2 coordinate value sum on the fragment*/

-+    int32_t fragment_x2_acc;

-+    /*!< fragment_pixel_counter accumulator for pixel counter on the fragment*/

-+    int32_t fragment_pixel_counter;

-+    /*!< fragment_number number of the fragment [0..15]*/

-+    int32_t fragment_number;

-+    /*!< fragments_in_total fragments in total*/

-+    int32_t fragments_in_total;

-+    /*!< fragments_overlap fragments overlap*/

-+    int32_t fragments_overlap;

-+    /*!< pixels_in_total overall pixels in the frame (fragmentation support for 8K maximum)*/

-+    int32_t pixels_in_total;

-+    /*!< fragment_height fragment height*/

-+    int32_t fragment_height;

-+    /*!< fragment_width fragment width*/

-+    int32_t fragment_width;

-+

-+} ia_pal_isp_dehaze_1_0_t;

-+

-+/*! \isp struct dma_cropper_dp

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass bypass the DMA_Cropper*/

-+    int32_t Bypass;

-+    /*!< crop_left number of pixels to crop from left*/

-+    int32_t crop_left;

-+    /*!< crop_top number of pixels to crop from top*/

-+    int32_t crop_top;

-+    /*!< uncropped_output_width output width before any cropping is done*/

-+    int32_t uncropped_output_width;

-+    /*!< uncropped_output_height output height before any cropping is done*/

-+    int32_t uncropped_output_height;

-+    /*!< cropped_width input crop width*/

-+    int32_t cropped_width;

-+    /*!< cropped_height input crop height*/

-+    int32_t cropped_height;

-+

-+} ia_pal_isp_dma_cropper_dp_t;

-+

-+/*! \isp struct dma_cropper_mp

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass bypass the DMA_Cropper*/

-+    int32_t Bypass;

-+    /*!< crop_left number of pixels to crop from left*/

-+    int32_t crop_left;

-+    /*!< crop_top number of pixels to crop from top*/

-+    int32_t crop_top;

-+    /*!< uncropped_output_width output width before any cropping is done*/

-+    int32_t uncropped_output_width;

-+    /*!< uncropped_output_height output height before any cropping is done*/

-+    int32_t uncropped_output_height;

-+    /*!< cropped_width input crop width*/

-+    int32_t cropped_width;

-+    /*!< cropped_height input crop height*/

-+    int32_t cropped_height;

-+

-+} ia_pal_isp_dma_cropper_mp_t;

-+

-+/*! \isp struct dma_cropper_ppp

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass bypass the DMA_Cropper*/

-+    int32_t Bypass;

-+    /*!< crop_left number of pixels to crop from left*/

-+    int32_t crop_left;

-+    /*!< crop_top number of pixels to crop from top*/

-+    int32_t crop_top;

-+    /*!< uncropped_output_width output width before any cropping is done*/

-+    int32_t uncropped_output_width;

-+    /*!< uncropped_output_height output height before any cropping is done*/

-+    int32_t uncropped_output_height;

-+    /*!< cropped_width input crop width*/

-+    int32_t cropped_width;

-+    /*!< cropped_height input crop height*/

-+    int32_t cropped_height;

-+

-+} ia_pal_isp_dma_cropper_ppp_t;

-+

-+/*! \isp struct dol_1_0

-+Digital OverLap images 3 to 1 merge

-+*/

-+typedef struct

-+{

-+    /*!< enable enabling the block. If enable == false, Output = input_long*/

-+    int32_t enable;

-+    /*!< wb_multiplied_etr_short[4] U4.14, exposure ratio of short / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

-+    int32_t wb_multiplied_etr_short[4];

-+    /*!< wb_multiplied_etr_med[4] U4.14, exposure ratio of med / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

-+    int32_t wb_multiplied_etr_med[4];

-+    /*!< wb_multiplied_etr_long[4] U4.19, exposure ratio of long / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

-+    int32_t wb_multiplied_etr_long[4];

-+    /*!< max_input_val U.0.20 - max value of input pixel*/

-+    int32_t max_input_val;

-+    /*!< is_medium_used indicates if medium image is valid*/

-+    int32_t is_medium_used;

-+    /*!< noise_model_beta_0_short[4] U.0.30, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

-+    int32_t noise_model_beta_0_short[4];

-+    /*!< noise_model_beta_1_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_1_short[4];

-+    /*!< noise_model_beta_2_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_2_short[4];

-+    /*!< noise_model_beta_0_med[4] U.0.30, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

-+    int32_t noise_model_beta_0_med[4];

-+    /*!< noise_model_beta_1_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_1_med[4];

-+    /*!< noise_model_beta_2_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_2_med[4];

-+    /*!< noise_model_beta_0_long[4] U.0.30, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

-+    int32_t noise_model_beta_0_long[4];

-+    /*!< noise_model_beta_1_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_1_long[4];

-+    /*!< noise_model_beta_2_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

-+    int32_t noise_model_beta_2_long[4];

-+    /*!< motion_detector_gain U.2.7 motion detector gain, g_md*/

-+    int32_t motion_detector_gain;

-+    /*!< motion_detector_falarm_th U.3.5 motion detector false alarm threshold, FM_md*/

-+    int32_t motion_detector_falarm_th;

-+    /*!< cu_long_not_burnt_x[4] U 15.0 long exposure not-burnt soft threshold - x values*/

-+    int32_t cu_long_not_burnt_x[4];

-+    /*!< cu_long_not_burnt_y[3] U 1.7 long exposure not-burnt soft threshold  - y values*/

-+    int32_t cu_long_not_burnt_y[3];

-+    /*!< cu_long_not_burnt_slope[3] S 3.12 long exposure not-burnt soft threshold  - slope values*/

-+    int32_t cu_long_not_burnt_slope[3];

-+    /*!< cu_med_not_burnt_x[4] U 15.0 medium exposure not-burnt soft threshold  - x values*/

-+    int32_t cu_med_not_burnt_x[4];

-+    /*!< cu_med_not_burnt_y[3] U 1.7 medium exposure not-burnt soft threshold - y values*/

-+    int32_t cu_med_not_burnt_y[3];

-+    /*!< cu_med_not_burnt_slope[3] S 3.12 medium exposure not-burnt soft threshold - slope values*/

-+    int32_t cu_med_not_burnt_slope[3];

-+    /*!< cu_short_not_shadow_x[4] U 15.0 short exposure not-shadow soft threshold  - x values*/

-+    int32_t cu_short_not_shadow_x[4];

-+    /*!< cu_short_not_shadow_y[3] U 1.7 short exposure not-shadow soft threshold - y values*/

-+    int32_t cu_short_not_shadow_y[3];

-+    /*!< cu_short_not_shadow_slope[3] S 3.12 short exposure not-shadow soft threshold - slope values*/

-+    int32_t cu_short_not_shadow_slope[3];

-+    /*!< rad_blur_not_shadow_not_burnt_power U.1.7 the power of the blurred vs. blurred not shadow not burnt*/

-+    int32_t rad_blur_not_shadow_not_burnt_power;

-+    /*!< hdr_blending_weight_1 U.1.7 - HDR blending weight 1*/

-+    int32_t hdr_blending_weight_1;

-+    /*!< hdr_blending_weight_2 U.1.7 - HDR blending weight 2*/

-+    int32_t hdr_blending_weight_2;

-+    /*!< hdr_blending_weight_3 U.1.7 - HDR blending weight 3*/

-+    int32_t hdr_blending_weight_3;

-+    /*!< hdr_blending_weight_4 U.1.7 - HDR blending weight 4*/

-+    int32_t hdr_blending_weight_4;

-+    /*!< radiance_long_max_val_for_motion[4] U.0.20 - long max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_long_max_val_for_motion[4];

-+    /*!< radiance_long_min_val_for_motion[4] S.0.21 - long min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_long_min_val_for_motion[4];

-+    /*!< radiance_med_max_val_for_motion[4] U.0.20 - med max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_med_max_val_for_motion[4];

-+    /*!< radiance_med_min_val_for_motion[4] S.0.21 - med min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_med_min_val_for_motion[4];

-+    /*!< radiance_short_or_med_max_val_for_motion_vs_long[4] U.0.20 - short or med max radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_short_or_med_max_val_for_motion_vs_long[4];

-+    /*!< radiance_short_or_med_min_val_for_motion_vs_long[4] S.0.21 - short or med min radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_short_or_med_min_val_for_motion_vs_long[4];

-+    /*!< radiance_short_max_val_for_motion_vs_med[4] U.0.20 - short max radiance value vs medium for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_short_max_val_for_motion_vs_med[4];

-+    /*!< radiance_short_min_val_for_motion[4] S.0.21 - short min radiacne value for motion detector, {Gr,R,B Gb}, 0…1*/

-+    int32_t radiance_short_min_val_for_motion[4];

-+    /*!< cu_compression_x[8] U.20 cu_compression_x*/

-+    int32_t cu_compression_x[8];

-+    /*!< cu_compression_y[7] U.15 cu_compression_y*/

-+    int32_t cu_compression_y[7];

-+    /*!< cu_compression_slope[7] S.2.10 cu_compression_slope (12 bit include sign)*/

-+    int32_t cu_compression_slope[7];

-+    /*!< motion_dilation_enable enabling dilation on motion-detection map.*/

-+    int32_t motion_dilation_enable;

-+    /*!< noise_model_var_min_val_long[4] U.0.30 - min value of noise model variance for long/HCG exposure, {Gr,R,B Gb}*/

-+    int32_t noise_model_var_min_val_long[4];

-+    /*!< noise_model_var_min_val_med[4] U.0.30- min value of noise model variance for medium exposure, {Gr,R,B Gb}*/

-+    int32_t noise_model_var_min_val_med[4];

-+    /*!< noise_model_var_min_val_short[4] U.0.30 - min value of noise model variance for short exposure, {Gr,R,B Gb}*/

-+    int32_t noise_model_var_min_val_short[4];

-+    /*!< noise_norm_shift_long U.4.0 long exposure variance normalization*/

-+    int32_t noise_norm_shift_long;

-+    /*!< noise_norm_shift_med U.4.0 medium exposure variance normalization*/

-+    int32_t noise_norm_shift_med;

-+    /*!< noise_norm_shift_short U.4.0 short exposure variance normalization*/

-+    int32_t noise_norm_shift_short;

-+    /*!< dp_enable U1.0 bypass defective pixel sensitive motion detection*/

-+    int32_t dp_enable;

-+    /*!< dpreduce_prec_long U4.0 long exposure DP sensitive motion detection parameter precision*/

-+    int32_t dpreduce_prec_long;

-+    /*!< dpreduce_prec_med U4.0 medium exposure DP sensitive motion detection parameter precision*/

-+    int32_t dpreduce_prec_med;

-+    /*!< dpreduce_slope_long[4] U0.16 long exposure slope value for DP sensitive motion detection*/

-+    int32_t dpreduce_slope_long[4];

-+    /*!< dpreduce_slope_med[4] U0.16 medium exposure slope value for DP sensitive motion detection*/

-+    int32_t dpreduce_slope_med[4];

-+    /*!< dpreduce_thre_long[4] U0.16 long exposure threshold for DP sensitive motion detection*/

-+    int32_t dpreduce_thre_long[4];

-+    /*!< dpreduce_thre_med[4] U0.16 medium exposure threshold for DP sensitive motion detection*/

-+    int32_t dpreduce_thre_med[4];

-+    /*!< blf_scale_med U0.8 bilateral filter noise model scaling factor for medium exposure*/

-+    int32_t blf_scale_med;

-+    /*!< blf_scale_short U0.8 bilateral filter noise model scaling factor for short exposure*/

-+    int32_t blf_scale_short;

-+    /*!< chroma_coring_med U0.8 moving object chroma coring in medium exposure*/

-+    int32_t chroma_coring_med;

-+    /*!< chroma_coring_short U0.8 moving object chroma coring in short exposure*/

-+    int32_t chroma_coring_short;

-+    /*!< lfm_enable enabling LFM function*/

-+    int32_t lfm_enable;

-+    /*!< lfm_rshift1 U5.0*/

-+    int32_t lfm_rshift1;

-+    /*!< lfm_rshift2 U5.0*/

-+    int32_t lfm_rshift2;

-+    /*!< lfm_rshift3 S16.0*/

-+    int32_t lfm_rshift3;

-+    /*!< lfm_clipval1 U5.0*/

-+    int32_t lfm_clipval1;

-+    /*!< lfm_clipval2 U5.0*/

-+    int32_t lfm_clipval2;

-+    /*!< lfm_clipval3 U5.0*/

-+    int32_t lfm_clipval3;

-+    /*!< lfm_maxval_long U20.0*/

-+    int32_t lfm_maxval_long;

-+    /*!< lfm_maxval_med U20.0*/

-+    int32_t lfm_maxval_med;

-+    /*!< lfm_smf_th U5.0*/

-+    int32_t lfm_smf_th;

-+    /*!< lfm_flicker_thre U5.0*/

-+    int32_t lfm_flicker_thre;

-+    /*!< lfm_flicker_gain U3.6*/

-+    int32_t lfm_flicker_gain;

-+    /*!< lfm_a2 U5.6*/

-+    int32_t lfm_a2;

-+    /*!< lfm_b2 U10.0*/

-+    int32_t lfm_b2;

-+    /*!< lfm_a3 U5.6*/

-+    int32_t lfm_a3;

-+    /*!< lfm_b3 U10.0*/

-+    int32_t lfm_b3;

-+    /*!< lfm_blend_shift_long U4.0*/

-+    int32_t lfm_blend_shift_long;

-+    /*!< lfm_blend_shift_long_med U4.0*/

-+    int32_t lfm_blend_shift_long_med;

-+    /*!< lfm_blend_shift_long_med_short U4.0*/

-+    int32_t lfm_blend_shift_long_med_short;

-+

-+} ia_pal_isp_dol_1_0_t;

-+

-+/*! \isp struct dol_2_0

-+Exposure image merger

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/

-+    int32_t bypass;

-+    /*!< cfaBayer[4] Bayer CFA descriptor; 0: R, 1: Gr; 2: Gb, 3: B*/

-+    int32_t cfaBayer[4];

-+    /*!< decompandX0[5] Decompanding input 0*/

-+    int32_t decompandX0[5];

-+    /*!< decompandY0[4] Decompanding output 0*/

-+    int32_t decompandY0[4];

-+    /*!< decompandS0[4] Decompanding slope 0*/

-+    int32_t decompandS0[4];

-+    /*!< decompandX1[5] Decompanding input 1*/

-+    int32_t decompandX1[5];

-+    /*!< decompandY1[4] Decompanding output 1*/

-+    int32_t decompandY1[4];

-+    /*!< decompandS1[4] Decompanding slope 1*/

-+    int32_t decompandS1[4];

-+    /*!< decompandX2[5] Decompanding input 2*/

-+    int32_t decompandX2[5];

-+    /*!< decompandY2[4] Decompanding output 2*/

-+    int32_t decompandY2[4];

-+    /*!< decompandS2[4] Decompanding slope 2*/

-+    int32_t decompandS2[4];

-+    /*!< decompandX3[5] Decompanding input 3*/

-+    int32_t decompandX3[5];

-+    /*!< decompandY3[4] Decompanding output 3*/

-+    int32_t decompandY3[4];

-+    /*!< decompandS3[4] Decompanding slope 3*/

-+    int32_t decompandS3[4];

-+    /*!< dolStats[16] DOL statistic extraction descriptor*/

-+    int32_t dolStats[16];

-+    /*!< dolStatsMode DOL statistic extraction mode, 0: single, 1: pair, 2:  quad*/

-+    int32_t dolStatsMode;

-+    /*!< wbGains[16] White balancing gains {R G G B}; 1 refers to 4096*/

-+    int32_t wbGains[16];

-+    /*!< combGains[16] Additional gains {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/

-+    int32_t combGains[16];

-+    /*!< blackLevel[16] Black level {LEr, LEg, LEg, LEb, MEr,…, VEb};*/

-+    int32_t blackLevel[16];

-+    /*!< residualBlackLevel[16] Residual black level {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/

-+    int32_t residualBlackLevel[16];

-+    /*!< residualBlackLevel2[4] Residual black level {LE, ME, SE, VE} for luma; 1 refers to 4096*/

-+    int32_t residualBlackLevel2[4];

-+    /*!< numExp Number of exposure images*/

-+    int32_t numExp;

-+    /*!< expRatio[4] Exposure ratios {LE, ME, SE, VE}*/

-+    int32_t expRatio[4];

-+    /*!< satvalMax[4] Saturation value {LE, ME, SE, VE}*/

-+    int32_t satvalMax[4];

-+    /*!< satThr[4] Saturation range as bit shift {LE, ME, SE, VE}*/

-+    int32_t satThr[4];

-+    /*!< satvalMin[4] Minimum saturation value {LE, ME, SE, VE}*/

-+    int32_t satvalMin[4];

-+    /*!< desatModel[3] Desaturation model; details TBA*/

-+    int32_t desatModel[3];

-+    /*!< motionIndex Baseline exposure image for motion detection*/

-+    int32_t motionIndex;

-+    /*!< motionModel[6] Motion model {LM, LM, LM, MS, MS, MS}; details TBA*/

-+    int32_t motionModel[6];

-+    /*!< motionLo[4] Low signal range {L, L, M, M}; details TBA*/

-+    int32_t motionLo[4];

-+    /*!< motionHi[4] High signal range; details TBA*/

-+    int32_t motionHi[4];

-+    /*!< motionLimit[2] Motion map limits {Lo, Hi}*/

-+    int32_t motionLimit[2];

-+    /*!< flickerModel[6] Flicker model {LE, LE, LE, ME, ME, ME, SE, SE, SE}*/

-+    int32_t flickerModel[6];

-+    /*!< flickerMaxval[4] Flicker signal upper threshold {LE, ME, SE, VE}*/

-+    int32_t flickerMaxval[4];

-+    /*!< flickerLimit[2] Flicker map limits {Lo, Hi}*/

-+    int32_t flickerLimit[2];

-+    /*!< blendingLimit[2] Blending map limits {Lo, Hi}*/

-+    int32_t blendingLimit[2];

-+    /*!< pedestal Linear output image pedestal*/

-+    int32_t pedestal;

-+    /*!< compandX[12] Input*/

-+    int32_t compandX[12];

-+    /*!< compandY[11] Output*/

-+    int32_t compandY[11];

-+    /*!< compandS[11] Slope*/

-+    int32_t compandS[11];

-+

-+} ia_pal_isp_dol_2_0_t;

-+

-+/*! \isp struct dol_mapper

-+DOL color ID mapper

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/

-+    int32_t bypass;

-+    /*!< exposures Number of exposure images*/

-+    int32_t exposures;

-+    /*!< mapping[16] Pixel extraction descriptor*/

-+    int32_t mapping[16];

-+    /*!< mode Extraction mode: single (0), pair (1), quad (2)*/

-+    int32_t mode;

-+

-+} ia_pal_isp_dol_mapper_t;

-+

-+/*! \isp struct dol_parser

-+

-+*/

-+typedef struct

-+{

-+    /*!< vbp Vertical Blanking Period Before SE starts*/

-+    int32_t vbp;

-+    /*!< crop_x Pixels to be cropped along the width of the fragment*/

-+    int32_t crop_x;

-+    /*!< crop_y Pixels to be cropped along the height of the fragment*/

-+    int32_t crop_y;

-+    /*!< cropped_width Width of the fragment*/

-+    int32_t cropped_width;

-+    /*!< cropped_height Height of the fragment*/

-+    int32_t cropped_height;

-+

-+} ia_pal_isp_dol_parser_t;

-+

-+/*! \isp struct dpc_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

-+    int32_t afxoffset[32];

-+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

-+    int32_t afxperiod[32];

-+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

-+    int32_t afyoffset[32];

-+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

-+    int32_t afyperiod[32];

-+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

-+    int32_t hdrfactors[16];

-+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

-+    int32_t hdrfactorsinverse[16];

-+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_slope[7];

-+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_x[8];

-+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_y[7];

-+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_slope[7];

-+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_x[8];

-+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_y[7];

-+    /*!< configunitfix_slope[3] fix config unit*/

-+    int32_t configunitfix_slope[3];

-+    /*!< configunitfix_x[4] fix config unit*/

-+    int32_t configunitfix_x[4];

-+    /*!< configunitfix_y[3] fix config unit*/

-+    int32_t configunitfix_y[3];

-+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_slope[7];

-+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_x[8];

-+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_y[7];

-+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_slope[7];

-+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_x[8];

-+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_y[7];

-+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

-+    int32_t configunitrawvslb_slope[7];

-+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

-+    int32_t configunitrawvslb_x[8];

-+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

-+    int32_t configunitrawvslb_y[7];

-+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

-+    int32_t configunitrawvsub_slope[7];

-+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

-+    int32_t configunitrawvsub_x[8];

-+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

-+    int32_t configunitrawvsub_y[7];

-+    /*!< curx[1024] x locations of the static bad pixels*/

-+    int32_t curx[1024];

-+    /*!< cury[1024] y locations of the static bad pixels*/

-+    int32_t cury[1024];

-+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t lbtype[16];

-+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t ubtype[16];

-+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

-+    int32_t pelesttype[16];

-+    /*!< dtype[16] 0-D1 1-D2  2-D3*/

-+    int32_t dtype[16];

-+    /*!< lbmasks[64] configurations related to the bayer pattern*/

-+    int32_t lbmasks[64];

-+    /*!< ubmasks[64] configurations related to the bayer pattern*/

-+    int32_t ubmasks[64];

-+    /*!< pmasks[384] configurations related to the bayer pattern*/

-+    int32_t pmasks[384];

-+    /*!< dmasks[48] configurations related to the bayer pattern*/

-+    int32_t dmasks[48];

-+    /*!< bitreduceshift Shift value for bit reduce block*/

-+    int32_t bitreduceshift;

-+    /*!< afenable enable for the AF unit block*/

-+    int32_t afenable;

-+    /*!< staticenable enable for the static LUT block*/

-+    int32_t staticenable;

-+    /*!< dynamicenable enable for the dynamic detection block*/

-+    int32_t dynamicenable;

-+    /*!< n_static_lut_entries number of static lut entries*/

-+    int32_t n_static_lut_entries;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< frame_height frame height*/

-+    int32_t frame_height;

-+    /*!< paf_grid_en[32] paf grid enables*/

-+    int32_t paf_grid_en[32];

-+    /*!< paf_output_mode 0)disables, do not pass anything 1) first line sent to memset0 second line sent to memset1  2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

-+    int32_t paf_output_mode;

-+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.  0: no swapping  1: swap B/C inputs*/

-+    int32_t swapping1stbc;

-+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.  0: no swapping 1: swap C/D inputs*/

-+    int32_t swapping1stcd;

-+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines  0: no swapping  1: swap A/B inputs*/

-+    int32_t swapping2ndbc;

-+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines  0: no swapping 1: swap C/D inputs*/

-+    int32_t swapping2ndcd;

-+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

-+    int32_t pdaf_width;

-+    /*!< pdaf_height Height in units of pdaf lines*/

-+    int32_t pdaf_height;

-+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines 0=use the line*/

-+    int32_t drop_pattern[32];

-+    /*!< drop_period Period of the drop pattern*/

-+    int32_t drop_period;

-+

-+} ia_pal_isp_dpc_1_1_t;

-+

-+/*! \isp struct dpc_1_3

-+

-+*/

-+typedef struct

-+{

-+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

-+    int32_t afxoffset[32];

-+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

-+    int32_t afxperiod[32];

-+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

-+    int32_t afyoffset[32];

-+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

-+    int32_t afyperiod[32];

-+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

-+    int32_t hdrfactors[16];

-+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

-+    int32_t hdrfactorsinverse[16];

-+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_slope[7];

-+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_x[8];

-+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_y[7];

-+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_slope[7];

-+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_x[8];

-+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_y[7];

-+    /*!< configunitfix_slope[3] fix config unit*/

-+    int32_t configunitfix_slope[3];

-+    /*!< configunitfix_x[4] fix config unit*/

-+    int32_t configunitfix_x[4];

-+    /*!< configunitfix_y[3] fix config unit*/

-+    int32_t configunitfix_y[3];

-+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_slope[7];

-+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_x[8];

-+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_y[7];

-+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_slope[7];

-+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_x[8];

-+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_y[7];

-+    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

-+    int32_t configunitrawvslb_slope[7];

-+    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

-+    int32_t configunitrawvslb_x[8];

-+    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

-+    int32_t configunitrawvslb_y[7];

-+    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

-+    int32_t configunitrawvsub_slope[7];

-+    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

-+    int32_t configunitrawvsub_x[8];

-+    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

-+    int32_t configunitrawvsub_y[7];

-+    /*!< curx[1024] x locations of the static bad pixels*/

-+    int32_t curx[1024];

-+    /*!< cury[1024] y locations of the static bad pixels*/

-+    int32_t cury[1024];

-+    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t lbtype[16];

-+    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

-+    int32_t ubtype[16];

-+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

-+    int32_t pelesttype[16];

-+    /*!< dtype[16] 0-D1 1-D2  2-D3*/

-+    int32_t dtype[16];

-+    /*!< lbmasks[64] configurations related to the bayer pattern*/

-+    int32_t lbmasks[64];

-+    /*!< ubmasks[64] configurations related to the bayer pattern*/

-+    int32_t ubmasks[64];

-+    /*!< pmasks[384] configurations related to the bayer pattern*/

-+    int32_t pmasks[384];

-+    /*!< dmasks[48] configurations related to the bayer pattern*/

-+    int32_t dmasks[48];

-+    /*!< bitreduceshift Shift value for bit reduce block*/

-+    int32_t bitreduceshift;

-+    /*!< afenable enable for the AF unit block*/

-+    int32_t afenable;

-+    /*!< staticenable enable for the static LUT block*/

-+    int32_t staticenable;

-+    /*!< dynamicenable enable for the dynamic detection block*/

-+    int32_t dynamicenable;

-+    /*!< n_static_lut_entries number of static lut entries*/

-+    int32_t n_static_lut_entries;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< paf_grid_en[32] paf grid enables*/

-+    int32_t paf_grid_en[32];

-+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

-+    int32_t paf_output_mode;

-+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

-+    int32_t swapping1stbc;

-+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping1stcd;

-+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

-+    int32_t swapping2ndbc;

-+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping2ndcd;

-+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

-+    int32_t pdaf_width;

-+    /*!< pdaf_height Height in units of pdaf lines*/

-+    int32_t pdaf_height;

-+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

-+    int32_t drop_pattern[32];

-+    /*!< drop_period Period of the drop pattern*/

-+    int32_t drop_period;

-+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

-+    int32_t paf_pattern_rearrangement_en;

-+    /*!< afsXStart AF pixel detection crop - start X position*/

-+    int32_t afsXStart;

-+    /*!< afsYStart AF pixel detection crop - start Y position*/

-+    int32_t afsYStart;

-+    /*!< afsXEnd AF pixel detection crop - end X position*/

-+    int32_t afsXEnd;

-+    /*!< afsYEnd AF pixel detection crop - end Y position*/

-+    int32_t afsYEnd;

-+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

-+    int32_t afsXStartCropEn;

-+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

-+    int32_t afsYStartCropEn;

-+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

-+    int32_t afsXEndCropEn;

-+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

-+    int32_t afsYEndCropEn;

-+    /*!< bypass bypass to the block*/

-+    int32_t bypass;

-+    /*!< use_nlm[16] use non local means mechanism*/

-+    int32_t use_nlm[16];

-+    /*!< sad1_thr threshold on the first sad*/

-+    int32_t sad1_thr;

-+    /*!< sad2_thr threshold on the second sad*/

-+    int32_t sad2_thr;

-+    /*!< pixel_diff_thr threshold on the pixel difference*/

-+    int32_t pixel_diff_thr;

-+    /*!< min_direction_sad_thr threshold on the min direction*/

-+    int32_t min_direction_sad_thr;

-+    /*!< max_direction_sad_thr threshold on the max direction*/

-+    int32_t max_direction_sad_thr;

-+    /*!< saturation_thr protect pixels in saturated areas*/

-+    int32_t saturation_thr;

-+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

-+    int32_t ignore_ver_direction[16];

-+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_slope[3];

-+    /*!< configunit_med_protection_x[4] nlm fix config unit*/

-+    int32_t configunit_med_protection_x[4];

-+    /*!< configunit_med_protection_y[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_y[3];

-+    /*!< clamping_disable disable clamping to support previous version of dpc*/

-+    int32_t clamping_disable;

-+    /*!< median_blend_coef median blending parameter*/

-+    int32_t median_blend_coef;

-+

-+} ia_pal_isp_dpc_1_3_t;

-+

-+/*! \isp struct dpc_2_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

-+    int32_t afxoffset[32];

-+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

-+    int32_t afxperiod[32];

-+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

-+    int32_t afyoffset[32];

-+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

-+    int32_t afyperiod[32];

-+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

-+    int32_t hdrfactors[16];

-+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

-+    int32_t hdrfactorsinverse[16];

-+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_slope[7];

-+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_x[8];

-+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_y[7];

-+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_slope[7];

-+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_x[8];

-+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_y[7];

-+    /*!< configunitfix_slope[3] fix config unit*/

-+    int32_t configunitfix_slope[3];

-+    /*!< configunitfix_x[4] fix config unit*/

-+    int32_t configunitfix_x[4];

-+    /*!< configunitfix_y[3] fix config unit*/

-+    int32_t configunitfix_y[3];

-+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_slope[7];

-+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_x[8];

-+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_y[7];

-+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_slope[7];

-+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_x[8];

-+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_y[7];

-+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

-+    int32_t pelesttype[16];

-+    /*!< dtype[16] 0-D1 1-D2  2-D3*/

-+    int32_t dtype[16];

-+    /*!< pmasks[384] configurations related to the bayer pattern*/

-+    int32_t pmasks[384];

-+    /*!< dmasks[48] configurations related to the bayer pattern*/

-+    int32_t dmasks[48];

-+    /*!< bitreduceshift Shift value for bit reduce block*/

-+    int32_t bitreduceshift;

-+    /*!< afenable enable for the AF unit block*/

-+    int32_t afenable;

-+    /*!< dynamicenable enable for the dynamic detection block*/

-+    int32_t dynamicenable;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< paf_grid_en[32] paf grid enables*/

-+    int32_t paf_grid_en[32];

-+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

-+    int32_t paf_output_mode;

-+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

-+    int32_t swapping1stbc;

-+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping1stcd;

-+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

-+    int32_t swapping2ndbc;

-+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping2ndcd;

-+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

-+    int32_t pdaf_width;

-+    /*!< pdaf_height Height in units of pdaf lines*/

-+    int32_t pdaf_height;

-+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

-+    int32_t drop_pattern[32];

-+    /*!< drop_period Period of the drop pattern*/

-+    int32_t drop_period;

-+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

-+    int32_t paf_pattern_rearrangement_en;

-+    /*!< afsXStart AF pixel detection crop - start X position*/

-+    int32_t afsXStart;

-+    /*!< afsYStart AF pixel detection crop - start Y position*/

-+    int32_t afsYStart;

-+    /*!< afsXEnd AF pixel detection crop - end X position*/

-+    int32_t afsXEnd;

-+    /*!< afsYEnd AF pixel detection crop - end Y position*/

-+    int32_t afsYEnd;

-+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

-+    int32_t afsXStartCropEn;

-+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

-+    int32_t afsYStartCropEn;

-+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

-+    int32_t afsXEndCropEn;

-+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

-+    int32_t afsYEndCropEn;

-+    /*!< bypass bypass to the block*/

-+    int32_t bypass;

-+    /*!< use_nlm[16] use non local means mechanism*/

-+    int32_t use_nlm[16];

-+    /*!< sad1_thr threshold on the first sad*/

-+    int32_t sad1_thr;

-+    /*!< sad2_thr threshold on the second sad*/

-+    int32_t sad2_thr;

-+    /*!< pixel_diff_thr threshold on the pixel difference*/

-+    int32_t pixel_diff_thr;

-+    /*!< min_direction_sad_thr threshold on the min direction*/

-+    int32_t min_direction_sad_thr;

-+    /*!< max_direction_sad_thr threshold on the max direction*/

-+    int32_t max_direction_sad_thr;

-+    /*!< saturation_thr protect pixels in saturated areas*/

-+    int32_t saturation_thr;

-+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

-+    int32_t ignore_ver_direction[16];

-+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_slope[3];

-+    /*!< configunit_med_protection_x[4] nlm fix config unit*/

-+    int32_t configunit_med_protection_x[4];

-+    /*!< configunit_med_protection_y[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_y[3];

-+    /*!< clamping_disable disable clamping to support previous version of dpc*/

-+    int32_t clamping_disable;

-+    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/

-+    int32_t sensor_type;

-+    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/

-+    int32_t fix_dist;

-+    /*!< flip_neigb_axis flip neigb vs dist axis*/

-+    int32_t flip_neigb_axis;

-+    /*!< g_locations_for_sve[16] g on 4x4 grid*/

-+    int32_t g_locations_for_sve[16];

-+    /*!< config_median_blend_slope[3] blend coef cfg*/

-+    int32_t config_median_blend_slope[3];

-+    /*!< config_median_blend_x[4] blend coef cfg*/

-+    int32_t config_median_blend_x[4];

-+    /*!< config_median_blend_y[3] blend coef cfg*/

-+    int32_t config_median_blend_y[3];

-+    /*!< config_ridges_slope[3] ridge coef cfg*/

-+    int32_t config_ridges_slope[3];

-+    /*!< config_ridges_x[4] ridge coef cfg*/

-+    int32_t config_ridges_x[4];

-+    /*!< config_ridges_y[3] ridge coef cfg*/

-+    int32_t config_ridges_y[3];

-+

-+} ia_pal_isp_dpc_2_0_t;

-+

-+/*! \isp struct drc_1

-+DRC filter

-+*/

-+typedef struct

-+{

-+    /*!< Bypass Bypass filter*/

-+    int32_t Bypass;

-+    /*!< blus_ds_factor downscale factor: 8 or 16*/

-+    int32_t blus_ds_factor;

-+    /*!< blus_sp_coef_a[256] spatial coefficients A (top left), 0.0.15*/

-+    int32_t blus_sp_coef_a[256];

-+    /*!< blus_sp_coef_b[256] spatial coefficients B (top right), 0.0.15*/

-+    int32_t blus_sp_coef_b[256];

-+    /*!< blus_sp_coef_c[256] spatial coefficients C (bottom left), 0.0.15*/

-+    int32_t blus_sp_coef_c[256];

-+    /*!< blus_sp_coef_d[256] spatial coefficients D (bottom right), 0.0.15*/

-+    int32_t blus_sp_coef_d[256];

-+    /*!< blus_sim_min min value of similarity, 0.0.15*/

-+    int32_t blus_sim_min;

-+    /*!< lce_bypass LCE bypass*/

-+    int32_t lce_bypass;

-+    /*!< lce_model_slope LCE model slope, 1.7.8*/

-+    int32_t lce_model_slope;

-+    /*!< lce_model_offset LCE model offset, 1.7.8*/

-+    int32_t lce_model_offset;

-+    /*!< lce_viir_sp_weight VIIR spatial weight, 1.0.15*/

-+    int32_t lce_viir_sp_weight;

-+    /*!< lce_power LCE power, 0.3.12*/

-+    int32_t lce_power;

-+    /*!< lce_deadzone LCE deadzone, 0.0.15*/

-+    int32_t lce_deadzone;

-+    /*!< lce_clip LCE clip, 0.0.15*/

-+    int32_t lce_clip;

-+    /*!< lr_gain_map[133584] LRGain, 0.7.8*/

-+    int32_t lr_gain_map[133584];

-+    /*!< lr_wgt_map[133584] LRWgt*/

-+    int32_t lr_wgt_map[133584];

-+    /*!< lr_map_width map width*/

-+    int32_t lr_map_width;

-+    /*!< lr_map_height map height*/

-+    int32_t lr_map_height;

-+    /*!< gtm_bypass GTM bypass*/

-+    int32_t gtm_bypass;

-+    /*!< xcu_gtm_slope_vec[32] GTM xcu slope vector, 1.15-xcu_gtm_slope_resolution.xcu_gtm_slope_resolution*/

-+    int32_t xcu_gtm_slope_vec[32];

-+    /*!< xcu_gtm_offset_vec[32] GTM xcu offset vector, 0.0.15*/

-+    int32_t xcu_gtm_offset_vec[32];

-+    /*!< xcu_gtm_x_cord_vec[32] GTM xcu x cord vector, 0.0.15*/

-+    int32_t xcu_gtm_x_cord_vec[32];

-+    /*!< xcu_gtm_x_cord_max GTM xcu x cord max, 0.0.15*/

-+    int32_t xcu_gtm_x_cord_max;

-+    /*!< xcu_gtm_exponent GTM xcu exponent*/

-+    int32_t xcu_gtm_exponent;

-+    /*!< xcu_gtm_slope_resolution GTM xcu slope resolution*/

-+    int32_t xcu_gtm_slope_resolution;

-+    /*!< gtm_gain_frac_bit GTM gain fractional bit*/

-+    int32_t gtm_gain_frac_bit;

-+

-+} ia_pal_isp_drc_1_t;

-+

-+/*! \isp struct drc_2

-+LUT based DRC and Defog

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass filter*/

-+    int32_t bypass;

-+    /*!< gtm_resolution GTM slope resolution*/

-+    int32_t gtm_resolution;

-+    /*!< gtm_slope_vec[32] GTM slope vector*/

-+    int32_t gtm_slope_vec[32];

-+    /*!< gtm_offset_vec[32] GTM offset vector*/

-+    int32_t gtm_offset_vec[32];

-+    /*!< gtm_x_cord_vec[32] GTM x cord vector*/

-+    int32_t gtm_x_cord_vec[32];

-+    /*!< gtm_x_cord_max GTM xcu x cord max, 0.0.15(for assertion)*/

-+    int32_t gtm_x_cord_max;

-+    /*!< gtm_exponent GTM xcu exponent(for assertion)*/

-+    int32_t gtm_exponent;

-+    /*!< gce_defog_resolution LCE&Defog slope resolution*/

-+    int32_t gce_defog_resolution;

-+    /*!< gce_defog_slope_vec[64] LCE&Defog slope vector*/

-+    int32_t gce_defog_slope_vec[64];

-+    /*!< gce_defog_offset_vec[64] LCE&Defog offset vector*/

-+    int32_t gce_defog_offset_vec[64];

-+    /*!< gce_defog_x_cord_vec[64] LCE&Defog x cord vector*/

-+    int32_t gce_defog_x_cord_vec[64];

-+    /*!< gce_defog_x_cord_max LCE&Defog xcu x cord max, 0.0.15(for assertion)*/

-+    int32_t gce_defog_x_cord_max;

-+    /*!< gce_defog_exponent LCE&Defog xcu exponent(for assertion)*/

-+    int32_t gce_defog_exponent;

-+    /*!< defog_A0 Control threshold for defog*/

-+    int32_t defog_A0;

-+    /*!< defog_A1 Control threshold for defog*/

-+    int32_t defog_A1;

-+    /*!< sharp_amountL Control sharpening strength L*/

-+    int32_t sharp_amountL;

-+    /*!< sharp_maxL Control sharpening max L*/

-+    int32_t sharp_maxL;

-+    /*!< sharp_thrL Control sharpening threshold L*/

-+    int32_t sharp_thrL;

-+    /*!< sharp_amountS Control sharpening strength S*/

-+    int32_t sharp_amountS;

-+    /*!< sharp_maxS Control sharpening max S*/

-+    int32_t sharp_maxS;

-+    /*!< sharp_thrS Control sharpening threshold S*/

-+    int32_t sharp_thrS;

-+    /*!< ltm_enable ltm enable*/

-+    int32_t ltm_enable;

-+    /*!< ltm_weight ltm weight*/

-+    int32_t ltm_weight;

-+

-+} ia_pal_isp_drc_2_t;

-+

-+/*! \isp struct ds_dynamic

-+Position in 2x2 QUAD form

-+*/

-+typedef struct

-+{

-+    /*!< extract_pos Position in 2x2 QUAD form - to extract pixel or pixel position in (00, 01, 10, 11) to perform downscale*/

-+    int32_t extract_pos;

-+

-+} ia_pal_isp_ds_dynamic_t;

-+

-+/*! \isp struct dvsstatistics_2

-+

-+*/

-+typedef struct

-+{

-+    /*!< kappa Global configuration - kappa*/

-+    int32_t kappa;

-+    /*!< match_shift Global configuration - match_shift*/

-+    int32_t match_shift;

-+    /*!< ybin_mode Global configuration - y binning mode*/

-+    int32_t ybin_mode;

-+    /*!< grid_width_l0 DVS statistics grid width level 0*/

-+    int32_t grid_width_l0;

-+    /*!< grid_height_l0 DVS statistics grid height level 0*/

-+    int32_t grid_height_l0;

-+    /*!< block_width_l0 DVS statistics block width level 0*/

-+    int32_t block_width_l0;

-+    /*!< block_height_l0 DVS statistics block height level 0*/

-+    int32_t block_height_l0;

-+    /*!< x_start_l0 DVS statistics level 0 x start*/

-+    int32_t x_start_l0;

-+    /*!< y_start_l0 DVS statistics level 0 y start*/

-+    int32_t y_start_l0;

-+    /*!< enabled_l0 DVS statistics level 0 enable*/

-+    int32_t enabled_l0;

-+    /*!< x_end_l0 DVS statistics level 0 x end*/

-+    int32_t x_end_l0;

-+    /*!< y_end_l0 DVS statistics level 0 y end*/

-+    int32_t y_end_l0;

-+    /*!< grid_width_l1 DVS statistics grid width level 1*/

-+    int32_t grid_width_l1;

-+    /*!< grid_height_l1 DVS statistics grid height level 1*/

-+    int32_t grid_height_l1;

-+    /*!< block_width_l1 DVS statistics block width level 1*/

-+    int32_t block_width_l1;

-+    /*!< block_height_l1 DVS statistics block height level 1*/

-+    int32_t block_height_l1;

-+    /*!< x_start_l1 DVS statistics level 1 x start*/

-+    int32_t x_start_l1;

-+    /*!< y_start_l1 DVS statistics level 1 y start*/

-+    int32_t y_start_l1;

-+    /*!< enabled_l1 DVS statistics level 1 enable*/

-+    int32_t enabled_l1;

-+    /*!< x_end_l1 DVS statistics level 1 x end*/

-+    int32_t x_end_l1;

-+    /*!< y_end_l1 DVS statistics level 1 y end*/

-+    int32_t y_end_l1;

-+    /*!< grid_width_l2 DVS statistics grid width level 2*/

-+    int32_t grid_width_l2;

-+    /*!< grid_height_l2 DVS statistics grid height level 2*/

-+    int32_t grid_height_l2;

-+    /*!< block_width_l2 DVS statistics block width level 2*/

-+    int32_t block_width_l2;

-+    /*!< block_height_l2 DVS statistics block height level 2*/

-+    int32_t block_height_l2;

-+    /*!< x_start_l2 DVS statistics level 2 x start*/

-+    int32_t x_start_l2;

-+    /*!< y_start_l2 DVS statistics level 2 y start*/

-+    int32_t y_start_l2;

-+    /*!< enabled_l2 DVS statistics level 2 enable*/

-+    int32_t enabled_l2;

-+    /*!< x_end_l2 DVS statistics level 2 x end*/

-+    int32_t x_end_l2;

-+    /*!< y_end_l2 DVS statistics level 2 y end*/

-+    int32_t y_end_l2;

-+    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/

-+    int32_t feroi_x_start_l0;

-+    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/

-+    int32_t feroi_y_start_l0;

-+    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/

-+    int32_t feroi_x_end_l0;

-+    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/

-+    int32_t feroi_y_end_l0;

-+    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/

-+    int32_t feroi_x_start_l1;

-+    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/

-+    int32_t feroi_y_start_l1;

-+    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/

-+    int32_t feroi_x_end_l1;

-+    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/

-+    int32_t feroi_y_end_l1;

-+    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/

-+    int32_t feroi_x_start_l2;

-+    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/

-+    int32_t feroi_y_start_l2;

-+    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/

-+    int32_t feroi_x_end_l2;

-+    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/

-+    int32_t feroi_y_end_l2;

-+

-+} ia_pal_isp_dvsstatistics_2_t;

-+

-+/*! \isp struct espa_1_0

-+Extendedn Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+

-+} ia_pal_isp_espa_1_0_t;

-+

-+/*! \isp struct espa_1_1

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_1_1_t;

-+

-+/*! \isp struct espa_isa_bayer_a

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_bayer_a_t;

-+

-+/*! \isp struct espa_isa_ir_md

-+Extended Stream Precision Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_ir_md_t;

-+

-+/*! \isp struct espa_isa_sis_a

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_sis_a_t;

-+

-+/*! \isp struct espa_isa_sis_b

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_sis_b_t;

-+

-+/*! \isp struct espa_isa_wb

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_wb_t;

-+

-+/*! \isp struct espa_isa_yuv_a

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_yuv_a_t;

-+

-+/*! \isp struct espa_isa_yuv_b

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_yuv_b_t;

-+

-+/*! \isp struct espa_isa_yuv_c

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_isa_yuv_c_t;

-+

-+/*! \isp struct espa_psa_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_1_t;

-+

-+/*! \isp struct espa_psa_4

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_4_t;

-+

-+/*! \isp struct espa_psa_5

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_5_t;

-+

-+/*! \isp struct espa_psa_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_c_t;

-+

-+/*! \isp struct espa_psa_d

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_d_t;

-+

-+/*! \isp struct espa_psa_e

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_e_t;

-+

-+/*! \isp struct espa_psa_f

-+Extended Stream Precsion Adapter

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_f_t;

-+

-+/*! \isp struct espa_psa_g

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_g_t;

-+

-+/*! \isp struct espa_psa_h

-+

-+*/

-+typedef struct

-+{

-+    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_0;

-+    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_1;

-+    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_2;

-+    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_3;

-+    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_4;

-+    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

-+    int32_t Shift_l_comp_5;

-+    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

-+    int32_t Shift_val_comp_0;

-+    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

-+    int32_t Shift_val_comp_1;

-+    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

-+    int32_t Shift_val_comp_2;

-+    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

-+    int32_t Shift_val_comp_3;

-+    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

-+    int32_t Shift_val_comp_4;

-+    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

-+    int32_t Shift_val_comp_5;

-+    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

-+    int32_t Clip_min_comp_0;

-+    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

-+    int32_t Clip_min_comp_1;

-+    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

-+    int32_t Clip_min_comp_2;

-+    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

-+    int32_t Clip_min_comp_3;

-+    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

-+    int32_t Clip_min_comp_4;

-+    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

-+    int32_t Clip_min_comp_5;

-+    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

-+    int32_t Clip_max_comp_0;

-+    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

-+    int32_t Clip_max_comp_1;

-+    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

-+    int32_t Clip_max_comp_2;

-+    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

-+    int32_t Clip_max_comp_3;

-+    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

-+    int32_t Clip_max_comp_4;

-+    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

-+    int32_t Clip_max_comp_5;

-+    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

-+    int32_t Offset_comp_0;

-+    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

-+    int32_t Offset_comp_1;

-+    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

-+    int32_t Offset_comp_2;

-+    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

-+    int32_t Offset_comp_3;

-+    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

-+    int32_t Offset_comp_4;

-+    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

-+    int32_t Offset_comp_5;

-+    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

-+    int32_t Clip_min_val_0;

-+    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

-+    int32_t Clip_max_val_0;

-+    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

-+    int32_t Clip_min_val_1;

-+    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

-+    int32_t Clip_max_val_1;

-+    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

-+    int32_t Clip_min_val_2;

-+    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

-+    int32_t Clip_max_val_2;

-+    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

-+    int32_t Clip_min_val_3;

-+    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

-+    int32_t Clip_max_val_3;

-+    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

-+    int32_t Clip_min_val_4;

-+    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

-+    int32_t Clip_max_val_4;

-+    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

-+    int32_t Clip_min_val_5;

-+    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

-+    int32_t Clip_max_val_5;

-+    /*!< range_reduction_en range_reduction_en*/

-+    int32_t range_reduction_en;

-+    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

-+    int32_t output_resolution;

-+    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_espa_psa_h_t;

-+

-+/*! \isp struct exy

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass filter*/

-+    int32_t bypass;

-+    /*!< Coef[2] filter coefficients*/

-+    int32_t Coef[2];

-+    /*!< NS_shift shifting noise stream to the relevant range*/

-+    int32_t NS_shift;

-+

-+} ia_pal_isp_exy_t;

-+

-+/*! \isp struct fr_grid_1_0

-+FR Statistics

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

-+    int32_t block_height;

-+    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/

-+    int32_t y_fr_en;

-+    /*!< x_start X top left corner of the grid*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid*/

-+    int32_t y_end;

-+    /*!< shftr_val_x[4] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];*/

-+    int32_t shftr_val_x[4];

-+    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_0[4];

-+    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_1[4];

-+    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_2[4];

-+    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/

-+    int32_t gx_3[4];

-+    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/

-+    int32_t mask_y0;

-+    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/

-+    int32_t mask_y1;

-+    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/

-+    int32_t oe_y0;

-+    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/

-+    int32_t oe_y1;

-+    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y0[4];

-+    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

-+    int32_t on_x_y1[4];

-+    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y00_filter_coeff[6];

-+    /*!< y00_filter_sign_vec sign vector for Y00*/

-+    int32_t y00_filter_sign_vec;

-+    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y01_filter_coeff[6];

-+    /*!< y01_filter_sign_vec sign vector for Y01*/

-+    int32_t y01_filter_sign_vec;

-+    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y10_filter_coeff[6];

-+    /*!< y10_filter_sign_vec sign vector for Y10*/

-+    int32_t y10_filter_sign_vec;

-+    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

-+    int32_t y11_filter_coeff[6];

-+    /*!< y11_filter_sign_vec sign vector for Y11*/

-+    int32_t y11_filter_sign_vec;

-+    /*!< nf_x[4] Filter response normalization factors for Y00, Y01, Y10, Y11*/

-+    int32_t nf_x[4];

-+    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/

-+    int32_t sensor_mode;

-+    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/

-+    int32_t downscaling_factor;

-+    /*!< y00_blending_weight Median filter weight for Y00*/

-+    int32_t y00_blending_weight;

-+    /*!< y01_blending_weight Median filter weight for Y01*/

-+    int32_t y01_blending_weight;

-+    /*!< y10_blending_weight Median filter weight for Y10*/

-+    int32_t y10_blending_weight;

-+    /*!< y11_blending_weight Median filter weight for Y11*/

-+    int32_t y11_blending_weight;

-+

-+} ia_pal_isp_fr_grid_1_0_t;

-+

-+/*! \isp struct gammastar_1

-+Initial Gamma* filter

-+*/

-+typedef struct

-+{

-+    /*!< gamma_star_en Bypass filter*/

-+    int32_t gamma_star_en;

-+    /*!< crop_enable Enable Crop by EDE block*/

-+    int32_t crop_enable;

-+    /*!< crop_parameters[4] Crop parameters*/

-+    int32_t crop_parameters[4];

-+    /*!< saturation_enable Saturation sub-block bypass*/

-+    int32_t saturation_enable;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< rgb2y_coef[5] RGB to luma conversion coefficients*/

-+    int32_t rgb2y_coef[5];

-+    /*!< extrap_blend_alpha blending coefficient used in extrapolation*/

-+    int32_t extrap_blend_alpha;

-+    /*!< tm_num_rows number of rows in TM grid*/

-+    int32_t tm_num_rows;

-+    /*!< tm_num_cols number of columns in TM grid*/

-+    int32_t tm_num_cols;

-+    /*!< spatial_weight[64] List of spatial weights*/

-+    int32_t spatial_weight[64];

-+    /*!< tm_blk_sz_shift Log2 of Number of pixels in row/column of TM block*/

-+    int32_t tm_blk_sz_shift;

-+    /*!< init_row First image pixel offset relative to the TM grid and the initial pixel*/

-+    int32_t init_row;

-+    /*!< init_col First image pixel offset relative to the TM grid and the initial pixel*/

-+    int32_t init_col;

-+    /*!< spatial_index_shift Shift value between index in Blk and index in spatial weights vector*/

-+    int32_t spatial_index_shift;

-+    /*!< output_shift Final shift, at end of block, converting working precision to required output precision*/

-+    int32_t output_shift;

-+    /*!< cu_similarity_weight_mapping_x[11] config unit mapping luma diff to similarity weights , X values*/

-+    int32_t cu_similarity_weight_mapping_x[11];

-+    /*!< cu_similarity_weight_mapping_b[10] config unit mapping luma diff to similarity weights,  Y values*/

-+    int32_t cu_similarity_weight_mapping_b[10];

-+    /*!< cu_similarity_weight_mapping_a[10] config unit mapping luma diff to similarity weights, Slope values*/

-+    int32_t cu_similarity_weight_mapping_a[10];

-+    /*!< cu_chroma_control_x[10] config unit for chroma control, X values*/

-+    int32_t cu_chroma_control_x[10];

-+    /*!< cu_chroma_control_b[9] config unit for chroma control, Y values*/

-+    int32_t cu_chroma_control_b[9];

-+    /*!< cu_chroma_control_a[9] config unit for chroma control, Slope values*/

-+    int32_t cu_chroma_control_a[9];

-+    /*!< tm_grid_xay[1595000] LUT that holds gammastar grid points x, slope and y values*/

-+    uint16_t tm_grid_xay[1595000];

-+

-+} ia_pal_isp_gammastar_1_t;

-+

-+/*! \isp struct gammatm_v3

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable for the filter*/

-+    int32_t enable;

-+    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa*/

-+    int32_t gammaBeforeTM;

-+    /*!< a1 shift amount at stage 1*/

-+    int32_t a1;

-+    /*!< a2 shift amount at stage 2*/

-+    int32_t a2;

-+    /*!< a3 shift amount at stage 3*/

-+    int32_t a3;

-+    /*!< gamma_lut_enable enable for gamma lut*/

-+    int32_t gamma_lut_enable;

-+    /*!< gamma_lut_base_level[8] base level for gamma lut*/

-+    int32_t gamma_lut_base_level[8];

-+    /*!< gamma_lut_step[8] step for gamma lut*/

-+    int32_t gamma_lut_step[8];

-+    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/

-+    int32_t gamma_lut_start_bin[8];

-+    /*!< gamma_lut_size gamma lut size*/

-+    int32_t gamma_lut_size;

-+    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/

-+    int32_t gamma_lut_gen_lut[1537];

-+    /*!< tm_lut_enable enable for tone mapping lut*/

-+    int32_t tm_lut_enable;

-+    /*!< tm_lut_base_level[3] base level for  tone mapping lut*/

-+    int32_t tm_lut_base_level[3];

-+    /*!< tm_lut_step[3] step for  tone mapping lut*/

-+    int32_t tm_lut_step[3];

-+    /*!< tm_lut_start_bin[3] start bin for  tone mapping lut*/

-+    int32_t tm_lut_start_bin[3];

-+    /*!< tm_lut_size tone mapping lut size*/

-+    int32_t tm_lut_size;

-+    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut*/

-+    int32_t tm_lut_gen_lut[2049];

-+    /*!< prog_shift programable shift for the gamma output*/

-+    int32_t prog_shift;

-+

-+} ia_pal_isp_gammatm_v3_t;

-+

-+/*! \isp struct gd_dpc_2_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< green_pos gb position*/

-+    int32_t green_pos;

-+    /*!< lc_cu_x[4] local contrast config unit x*/

-+    int32_t lc_cu_x[4];

-+    /*!< lc_cu_y[3] local contrast config unit y*/

-+    int32_t lc_cu_y[3];

-+    /*!< lc_cu_slope[3] local contrast config unit slope*/

-+    int32_t lc_cu_slope[3];

-+    /*!< delta_cu_x[4] delta config unit x*/

-+    int32_t delta_cu_x[4];

-+    /*!< delta_cu_y[3] delta config unit y*/

-+    int32_t delta_cu_y[3];

-+    /*!< delta_cu_slope[3] delta config unit slope*/

-+    int32_t delta_cu_slope[3];

-+    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/

-+    int32_t inv_lc_cu_x[8];

-+    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/

-+    int32_t inv_lc_cu_y[7];

-+    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/

-+    int32_t inv_lc_cu_slope[7];

-+    /*!< inv_delta_cu_x[8] inverse delta config unit x*/

-+    int32_t inv_delta_cu_x[8];

-+    /*!< inv_delta_cu_y[7] inverse delta config unit y*/

-+    int32_t inv_delta_cu_y[7];

-+    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/

-+    int32_t inv_delta_cu_slope[7];

-+    /*!< detail_pres detail preservation factor*/

-+    int32_t detail_pres;

-+    /*!< invscale scale factor after normalizing by inverse*/

-+    int32_t invscale;

-+    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

-+    int32_t afxoffset[32];

-+    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

-+    int32_t afxperiod[32];

-+    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

-+    int32_t afyoffset[32];

-+    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

-+    int32_t afyperiod[32];

-+    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

-+    int32_t hdrfactors[16];

-+    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

-+    int32_t hdrfactorsinverse[16];

-+    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_slope[7];

-+    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_x[8];

-+    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

-+    int32_t configunitcolddistvsmedian_y[7];

-+    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_slope[7];

-+    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_x[8];

-+    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

-+    int32_t configunitcolddistvsneighb_y[7];

-+    /*!< configunitfix_slope[3] fix config unit*/

-+    int32_t configunitfix_slope[3];

-+    /*!< configunitfix_x[4] fix config unit*/

-+    int32_t configunitfix_x[4];

-+    /*!< configunitfix_y[3] fix config unit*/

-+    int32_t configunitfix_y[3];

-+    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_slope[7];

-+    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_x[8];

-+    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

-+    int32_t configunithotdistvsmedian_y[7];

-+    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_slope[7];

-+    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_x[8];

-+    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

-+    int32_t configunithotdistvsneighb_y[7];

-+    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

-+    int32_t pelesttype[16];

-+    /*!< dtype[16] 0-D1 1-D2  2-D3*/

-+    int32_t dtype[16];

-+    /*!< pmasks[384] configurations related to the bayer pattern*/

-+    int32_t pmasks[384];

-+    /*!< dmasks[48] configurations related to the bayer pattern*/

-+    int32_t dmasks[48];

-+    /*!< bitreduceshift Shift value for bit reduce block*/

-+    int32_t bitreduceshift;

-+    /*!< afenable enable for the AF unit block*/

-+    int32_t afenable;

-+    /*!< dynamicenable enable for the dynamic detection block*/

-+    int32_t dynamicenable;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< paf_grid_en[32] paf grid enables*/

-+    int32_t paf_grid_en[32];

-+    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

-+    int32_t paf_pattern_rearrangement_en;

-+    /*!< afsXStart AF pixel detection crop - start X position*/

-+    int32_t afsXStart;

-+    /*!< afsYStart AF pixel detection crop - start Y position*/

-+    int32_t afsYStart;

-+    /*!< afsXEnd AF pixel detection crop - end X position*/

-+    int32_t afsXEnd;

-+    /*!< afsYEnd AF pixel detection crop - end Y position*/

-+    int32_t afsYEnd;

-+    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

-+    int32_t afsXStartCropEn;

-+    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

-+    int32_t afsYStartCropEn;

-+    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

-+    int32_t afsXEndCropEn;

-+    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

-+    int32_t afsYEndCropEn;

-+    /*!< use_nlm[16] use non local means mechanism*/

-+    int32_t use_nlm[16];

-+    /*!< sad1_thr threshold on the first sad*/

-+    int32_t sad1_thr;

-+    /*!< sad2_thr threshold on the second sad*/

-+    int32_t sad2_thr;

-+    /*!< pixel_diff_thr threshold on the pixel difference*/

-+    int32_t pixel_diff_thr;

-+    /*!< min_direction_sad_thr threshold on the min direction*/

-+    int32_t min_direction_sad_thr;

-+    /*!< max_direction_sad_thr threshold on the max direction*/

-+    int32_t max_direction_sad_thr;

-+    /*!< saturation_thr protect pixels in saturated areas*/

-+    int32_t saturation_thr;

-+    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

-+    int32_t ignore_ver_direction[16];

-+    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_slope[3];

-+    /*!< configunit_med_protection_x[4] nlm fix config unit*/

-+    int32_t configunit_med_protection_x[4];

-+    /*!< configunit_med_protection_y[3] nlm fix config unit*/

-+    int32_t configunit_med_protection_y[3];

-+    /*!< clamping_disable disable clamping to support previous version of dpc*/

-+    int32_t clamping_disable;

-+    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/

-+    int32_t sensor_type;

-+    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/

-+    int32_t fix_dist;

-+    /*!< flip_neigb_axis flip neigb vs dist axis*/

-+    int32_t flip_neigb_axis;

-+    /*!< g_locations_for_sve[16] g on 4x4 grid*/

-+    int32_t g_locations_for_sve[16];

-+    /*!< config_median_blend_slope[3] blend coef cfg*/

-+    int32_t config_median_blend_slope[3];

-+    /*!< config_median_blend_x[4] blend coef cfg*/

-+    int32_t config_median_blend_x[4];

-+    /*!< config_median_blend_y[3] blend coef cfg*/

-+    int32_t config_median_blend_y[3];

-+    /*!< config_ridges_slope[3] ridge coef cfg*/

-+    int32_t config_ridges_slope[3];

-+    /*!< config_ridges_x[4] ridge coef cfg*/

-+    int32_t config_ridges_x[4];

-+    /*!< config_ridges_y[3] ridge coef cfg*/

-+    int32_t config_ridges_y[3];

-+    /*!< global_enable global enable*/

-+    int32_t global_enable;

-+    /*!< gdc_enable gdc enable*/

-+    int32_t gdc_enable;

-+    /*!< dpc_enable dpc enable*/

-+    int32_t dpc_enable;

-+

-+} ia_pal_isp_gd_dpc_2_1_t;

-+

-+/*! \isp struct gdc3

-+HW filter reference with FW ISP API

-+*/

-+typedef struct

-+{

-+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

-+    int32_t filter_size;

-+    /*!< nums_luts number of LUTs partioning. {1-4}*/

-+    int32_t nums_luts;

-+    /*!< lut_sel LUT part selection. {0:nums_lut}*/

-+    int32_t lut_sel;

-+    /*!< lut[1536] LUT s5.10*/

-+    int32_t lut[1536];

-+    /*!< interpolation_type interpolation type*/

-+    int32_t interpolation_type;

-+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

-+    int32_t nums_hgrid_luma;

-+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

-+    int32_t nums_vgrid_luma;

-+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

-+    int32_t nums_hgrid_chroma;

-+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

-+    int32_t nums_vgrid_chroma;

-+    /*!< luma_block_width_power luma_block_width_power*/

-+    int32_t luma_block_width_power;

-+    /*!< luma_block_height_power luma_block_height_power*/

-+    int32_t luma_block_height_power;

-+    /*!< chroma_block_width_power chroma_block_width_power*/

-+    int32_t chroma_block_width_power;

-+    /*!< chroma_block_height_power chroma_block_height_power*/

-+    int32_t chroma_block_height_power;

-+    /*!< luma_origin_x[10584] luma_origin_x*/

-+    int32_t luma_origin_x[10584];

-+    /*!< luma_origin_y[10584] luma_origin_y*/

-+    int32_t luma_origin_y[10584];

-+    /*!< luma_in_block_width[10584] luma_in_block_width*/

-+    int32_t luma_in_block_width[10584];

-+    /*!< luma_in_block_height[10584] luma_in_block_heght*/

-+    int32_t luma_in_block_height[10584];

-+    /*!< luma_p0_x[10584] luma_p0_x*/

-+    int32_t luma_p0_x[10584];

-+    /*!< luma_p0_y[10584] luma_p0_y*/

-+    int32_t luma_p0_y[10584];

-+    /*!< luma_p1_x[10584] luma_p1_x*/

-+    int32_t luma_p1_x[10584];

-+    /*!< luma_p1_y[10584] luma_p1_y*/

-+    int32_t luma_p1_y[10584];

-+    /*!< luma_p2_x[10584] luma_p2_x*/

-+    int32_t luma_p2_x[10584];

-+    /*!< luma_p2_y[10584] luma_p2_y*/

-+    int32_t luma_p2_y[10584];

-+    /*!< luma_p3_x[10584] luma_p3_x*/

-+    int32_t luma_p3_x[10584];

-+    /*!< luma_p3_y[10584] luma_p3_y*/

-+    int32_t luma_p3_y[10584];

-+    /*!< chroma_origin_x[10584] chroma_origin_x*/

-+    int32_t chroma_origin_x[10584];

-+    /*!< chroma_origin_y[10584] chroma_origin_y*/

-+    int32_t chroma_origin_y[10584];

-+    /*!< chroma_in_block_width[10584] chroma_in_block_width*/

-+    int32_t chroma_in_block_width[10584];

-+    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/

-+    int32_t chroma_in_block_height[10584];

-+    /*!< chroma_p0_x[10584] chroma_p0_x*/

-+    int32_t chroma_p0_x[10584];

-+    /*!< chroma_p0_y[10584] chroma_p0_y*/

-+    int32_t chroma_p0_y[10584];

-+    /*!< chroma_p1_x[10584] chroma_p1_x*/

-+    int32_t chroma_p1_x[10584];

-+    /*!< chroma_p1_y[10584] chroma_p1_y*/

-+    int32_t chroma_p1_y[10584];

-+    /*!< chroma_p2_x[10584] chroma_p2_x*/

-+    int32_t chroma_p2_x[10584];

-+    /*!< chroma_p2_y[10584] chroma_p2_y*/

-+    int32_t chroma_p2_y[10584];

-+    /*!< chroma_p3_x[10584] chroma_p3_x*/

-+    int32_t chroma_p3_x[10584];

-+    /*!< chroma_p3_y[10584] chroma_p3_y*/

-+    int32_t chroma_p3_y[10584];

-+

-+} ia_pal_isp_gdc3_t;

-+

-+/*! \isp struct gdc3_1

-+HW filter reference with FW ISP API

-+*/

-+typedef struct

-+{

-+    /*!< filter_size */

-+    int32_t filter_size;

-+    /*!< nums_luts */

-+    int32_t nums_luts;

-+    /*!< lut_sel */

-+    int32_t lut_sel;

-+    /*!< lut[1536] */

-+    int32_t lut[1536];

-+    /*!< interpolation_type */

-+    int32_t interpolation_type;

-+    /*!< nums_hgrid_luma */

-+    int32_t nums_hgrid_luma;

-+    /*!< nums_vgrid_luma */

-+    int32_t nums_vgrid_luma;

-+    /*!< nums_hgrid_chroma */

-+    int32_t nums_hgrid_chroma;

-+    /*!< nums_vgrid_chroma */

-+    int32_t nums_vgrid_chroma;

-+    /*!< luma_block_width_power */

-+    int32_t luma_block_width_power;

-+    /*!< luma_block_height_power */

-+    int32_t luma_block_height_power;

-+    /*!< chroma_block_width_power */

-+    int32_t chroma_block_width_power;

-+    /*!< chroma_block_height_power */

-+    int32_t chroma_block_height_power;

-+    /*!< luma_origin_x[5292] */

-+    int32_t luma_origin_x[5292];

-+    /*!< luma_origin_y[5292] */

-+    int32_t luma_origin_y[5292];

-+    /*!< luma_in_block_width[5292] */

-+    int32_t luma_in_block_width[5292];

-+    /*!< luma_in_block_height[5292] */

-+    int32_t luma_in_block_height[5292];

-+    /*!< luma_p0_x[5292] */

-+    int32_t luma_p0_x[5292];

-+    /*!< luma_p0_y[5292] */

-+    int32_t luma_p0_y[5292];

-+    /*!< luma_p1_x[5292] */

-+    int32_t luma_p1_x[5292];

-+    /*!< luma_p1_y[5292] */

-+    int32_t luma_p1_y[5292];

-+    /*!< luma_p2_x[5292] */

-+    int32_t luma_p2_x[5292];

-+    /*!< luma_p2_y[5292] */

-+    int32_t luma_p2_y[5292];

-+    /*!< luma_p3_x[5292] */

-+    int32_t luma_p3_x[5292];

-+    /*!< luma_p3_y[5292] */

-+    int32_t luma_p3_y[5292];

-+    /*!< chroma_origin_x[5292] */

-+    int32_t chroma_origin_x[5292];

-+    /*!< chroma_origin_y[5292] */

-+    int32_t chroma_origin_y[5292];

-+    /*!< chroma_in_block_width[5292] */

-+    int32_t chroma_in_block_width[5292];

-+    /*!< chroma_in_block_height[5292] */

-+    int32_t chroma_in_block_height[5292];

-+    /*!< chroma_p0_x[5292] */

-+    int32_t chroma_p0_x[5292];

-+    /*!< chroma_p0_y[5292] */

-+    int32_t chroma_p0_y[5292];

-+    /*!< chroma_p1_x[5292] */

-+    int32_t chroma_p1_x[5292];

-+    /*!< chroma_p1_y[5292] */

-+    int32_t chroma_p1_y[5292];

-+    /*!< chroma_p2_x[5292] */

-+    int32_t chroma_p2_x[5292];

-+    /*!< chroma_p2_y[5292] */

-+    int32_t chroma_p2_y[5292];

-+    /*!< chroma_p3_x[5292] */

-+    int32_t chroma_p3_x[5292];

-+    /*!< chroma_p3_y[5292] */

-+    int32_t chroma_p3_y[5292];

-+

-+} ia_pal_isp_gdc3_1_t;

-+

-+/*! \isp struct gdc3_1_1

-+HW filter reference with FW ISP API

-+*/

-+typedef struct

-+{

-+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

-+    int32_t filter_size;

-+    /*!< nums_luts number of LUTs partioning. {1-4}*/

-+    int32_t nums_luts;

-+    /*!< lut_sel LUT part selection. {0:nums_lut}*/

-+    int32_t lut_sel;

-+    /*!< lut[1536] LUT s5.10*/

-+    int32_t lut[1536];

-+    /*!< interpolation_type interpolation type*/

-+    int32_t interpolation_type;

-+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

-+    int32_t nums_hgrid_luma;

-+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

-+    int32_t nums_vgrid_luma;

-+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

-+    int32_t nums_hgrid_chroma;

-+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

-+    int32_t nums_vgrid_chroma;

-+    /*!< luma_block_width_power luma_block_width_power*/

-+    int32_t luma_block_width_power;

-+    /*!< luma_block_height_power luma_block_height_power*/

-+    int32_t luma_block_height_power;

-+    /*!< chroma_block_width_power chroma_block_width_power*/

-+    int32_t chroma_block_width_power;

-+    /*!< chroma_block_height_power chroma_block_height_power*/

-+    int32_t chroma_block_height_power;

-+    /*!< gdc_warp_grid_luma[84672] gdc_warp_grid_luma*/

-+    int32_t gdc_warp_grid_luma[84672];

-+    /*!< gdc_warp_grid_chroma[84672] gdc_warp_grid_chroma*/

-+    int32_t gdc_warp_grid_chroma[84672];

-+

-+} ia_pal_isp_gdc3_1_1_t;

-+

-+/*! \isp struct gdc4_2

-+HW filter reference with FW ISP API

-+*/

-+typedef struct

-+{

-+    /*!< in_bpp image input bpp*/

-+    int32_t in_bpp;

-+    /*!< interpolation_type */

-+    int32_t interpolation_type;

-+    /*!< filter_size */

-+    int32_t filter_size;

-+    /*!< lut_sel */

-+    int32_t lut_sel;

-+    /*!< out_bpp image output bpp*/

-+    int32_t out_bpp;

-+    /*!< gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

-+    int32_t gro;

-+    /*!< perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

-+    int32_t perf_mode;

-+    /*!< ch1_in_bpp image input bpp*/

-+    int32_t ch1_in_bpp;

-+    /*!< ch1_interpolation_type */

-+    int32_t ch1_interpolation_type;

-+    /*!< ch1_filter_size */

-+    int32_t ch1_filter_size;

-+    /*!< ch1_lut_sel */

-+    int32_t ch1_lut_sel;

-+    /*!< ch1_out_bpp image output bpp*/

-+    int32_t ch1_out_bpp;

-+    /*!< ch1_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

-+    int32_t ch1_gro;

-+    /*!< ch1_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

-+    int32_t ch1_perf_mode;

-+    /*!< ch2_in_bpp image input bpp*/

-+    int32_t ch2_in_bpp;

-+    /*!< ch2_interpolation_type */

-+    int32_t ch2_interpolation_type;

-+    /*!< ch2_filter_size */

-+    int32_t ch2_filter_size;

-+    /*!< ch2_lut_sel */

-+    int32_t ch2_lut_sel;

-+    /*!< ch2_out_bpp image output bpp*/

-+    int32_t ch2_out_bpp;

-+    /*!< ch2_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

-+    int32_t ch2_gro;

-+    /*!< ch2_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

-+    int32_t ch2_perf_mode;

-+    /*!< nums_luts */

-+    int32_t nums_luts;

-+    /*!< lut[1536] */

-+    int32_t lut[1536];

-+    /*!< nums_hgrid_luma */

-+    int32_t nums_hgrid_luma;

-+    /*!< nums_vgrid_luma */

-+    int32_t nums_vgrid_luma;

-+    /*!< nums_hgrid_chroma */

-+    int32_t nums_hgrid_chroma;

-+    /*!< nums_vgrid_chroma */

-+    int32_t nums_vgrid_chroma;

-+    /*!< luma_block_width_power */

-+    int32_t luma_block_width_power;

-+    /*!< luma_block_height_power */

-+    int32_t luma_block_height_power;

-+    /*!< chroma_block_width_power */

-+    int32_t chroma_block_width_power;

-+    /*!< chroma_block_height_power */

-+    int32_t chroma_block_height_power;

-+    /*!< luma_tetragons[84672] */

-+    int32_t luma_tetragons[84672];

-+    /*!< chroma_tetragons[84672] */

-+    int32_t chroma_tetragons[84672];

-+

-+} ia_pal_isp_gdc4_2_t;

-+

-+/*! \isp struct gdc5

-+HW filter reference with FW ISP API

-+*/

-+typedef struct

-+{

-+    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

-+    int32_t filter_size;

-+    /*!< nums_luts number of LUTs partioning. {1-4}*/

-+    int32_t nums_luts;

-+    /*!< lut_sel LUT part selection. {0:nums_lut}*/

-+    int32_t lut_sel;

-+    /*!< lut[1536] LUT s1.10*/

-+    int32_t lut[1536];

-+    /*!< interpolation_type interpolation type*/

-+    int32_t interpolation_type;

-+    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

-+    int32_t nums_hgrid_luma;

-+    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

-+    int32_t nums_vgrid_luma;

-+    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

-+    int32_t nums_hgrid_chroma;

-+    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

-+    int32_t nums_vgrid_chroma;

-+    /*!< luma_block_width_power luma_block_width_power*/

-+    int32_t luma_block_width_power;

-+    /*!< luma_block_height_power luma_block_height_power*/

-+    int32_t luma_block_height_power;

-+    /*!< chroma_block_width_power chroma_block_width_power*/

-+    int32_t chroma_block_width_power;

-+    /*!< chroma_block_height_power chroma_block_height_power*/

-+    int32_t chroma_block_height_power;

-+    /*!< luma_origin_x[10584] luma_origin_x*/

-+    int32_t luma_origin_x[10584];

-+    /*!< luma_origin_y[10584] luma_origin_y*/

-+    int32_t luma_origin_y[10584];

-+    /*!< luma_in_block_width[10584] luma_in_block_width*/

-+    int32_t luma_in_block_width[10584];

-+    /*!< luma_in_block_height[10584] luma_in_block_heght*/

-+    int32_t luma_in_block_height[10584];

-+    /*!< luma_p0_x[10584] luma_p0_x*/

-+    int32_t luma_p0_x[10584];

-+    /*!< luma_p0_y[10584] luma_p0_y*/

-+    int32_t luma_p0_y[10584];

-+    /*!< luma_p1_x[10584] luma_p1_x*/

-+    int32_t luma_p1_x[10584];

-+    /*!< luma_p1_y[10584] luma_p1_y*/

-+    int32_t luma_p1_y[10584];

-+    /*!< luma_p2_x[10584] luma_p2_x*/

-+    int32_t luma_p2_x[10584];

-+    /*!< luma_p2_y[10584] luma_p2_y*/

-+    int32_t luma_p2_y[10584];

-+    /*!< luma_p3_x[10584] luma_p3_x*/

-+    int32_t luma_p3_x[10584];

-+    /*!< luma_p3_y[10584] luma_p3_y*/

-+    int32_t luma_p3_y[10584];

-+    /*!< chroma_origin_x[10584] chroma_origin_x*/

-+    int32_t chroma_origin_x[10584];

-+    /*!< chroma_origin_y[10584] chroma_origin_y*/

-+    int32_t chroma_origin_y[10584];

-+    /*!< chroma_in_block_width[10584] chroma_in_block_width*/

-+    int32_t chroma_in_block_width[10584];

-+    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/

-+    int32_t chroma_in_block_height[10584];

-+    /*!< chroma_p0_x[10584] chroma_p0_x*/

-+    int32_t chroma_p0_x[10584];

-+    /*!< chroma_p0_y[10584] chroma_p0_y*/

-+    int32_t chroma_p0_y[10584];

-+    /*!< chroma_p1_x[10584] chroma_p1_x*/

-+    int32_t chroma_p1_x[10584];

-+    /*!< chroma_p1_y[10584] chroma_p1_y*/

-+    int32_t chroma_p1_y[10584];

-+    /*!< chroma_p2_x[10584] chroma_p2_x*/

-+    int32_t chroma_p2_x[10584];

-+    /*!< chroma_p2_y[10584] chroma_p2_y*/

-+    int32_t chroma_p2_y[10584];

-+    /*!< chroma_p3_x[10584] chroma_p3_x*/

-+    int32_t chroma_p3_x[10584];

-+    /*!< chroma_p3_y[10584] chroma_p3_y*/

-+    int32_t chroma_p3_y[10584];

-+    /*!< in_bpp image input bpp*/

-+    int32_t in_bpp;

-+    /*!< out_bpp image output bpp*/

-+    int32_t out_bpp;

-+    /*!< gdc_operating_mode 0: GDC calculates tetragons; 1: tetragons from API are used, 2: GDC5_1 WFOV*/

-+    int32_t gdc_operating_mode;

-+    /*!< gdc_mode 0: bypass, 1: High Distortion only, 2: Homography only, 6: Homography and high distortion, 9: High distortion and homography*/

-+    int32_t gdc_mode;

-+    /*!< crop_top Top border for cropping*/

-+    int32_t crop_top;

-+    /*!< crop_left Left border for cropping*/

-+    int32_t crop_left;

-+    /*!< crop_bottom Bottom border for cropping*/

-+    int32_t crop_bottom;

-+    /*!< crop_right Right border for cropping*/

-+    int32_t crop_right;

-+    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S2.20,*/

-+    int32_t homography_transformation_luma_0[64];

-+    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/

-+    int32_t homography_transformation_luma_1[32];

-+    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S15.16*/

-+    int32_t homography_transformation_luma_2[48];

-+    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/

-+    int32_t homography_matrices_offset[16];

-+    /*!< homography_matrices_count number of homography matrices*/

-+    int32_t homography_matrices_count;

-+    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/

-+    int32_t ldc_r_lut[256];

-+    /*!< ldc_max_distance_from_center Maximum distance from the radial center from the full sensor resolution. Q16.8*/

-+    int32_t ldc_max_distance_from_center;

-+    /*!< ldc_r_x_center x coordinate of LDC (R) correction center of symmerty*/

-+    int32_t ldc_r_x_center;

-+    /*!< ldc_r_y_center y coordinate of LDC (R) correction center of symmerty*/

-+    int32_t ldc_r_y_center;

-+    /*!< ldc_r_y_scale_factor y coordinate scaling factor for elliptical distortion of LDC (R) correction, format Q4.16*/

-+    int32_t ldc_r_y_scale_factor;

-+    /*!< gdc_modep 0:PreAffine/Projections/LDC/PostAffine, 1:PreAffine/Projections/Rotation/LDC/PostAffine, 2:PreAffine/Projections/Rotation/PostAffine, 3:Homography/PreAffine/Projections/Rotation/LDC/PostAffine, 4:PreAffine/Homography/Projections/Rotation/LDC/PostAffine*/

-+    int32_t gdc_modep;

-+    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/

-+    int32_t rotationmatrix[9];

-+    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/

-+    int32_t projectionsf_1[2];

-+    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/

-+    int32_t projectionsf_2[2];

-+    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular*/

-+    int32_t projection_type;

-+    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/

-+    int32_t projections_inv_f_pi;

-+    /*!< ldc_mode 0:Rd/Ru mode, 1: SqLUT mode, 2: Rd/Ru mode with normalization*/

-+    int32_t ldc_mode;

-+    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/

-+    int32_t ldc_max_a;

-+    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/

-+    int32_t ldc_inv_max_a;

-+    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/

-+    int32_t ldc_lut_shift_bits;

-+    /*!< preaffine_matrix_scale[4] PreAffine Matrix for scale S4.15*/

-+    int32_t preaffine_matrix_scale[4];

-+    /*!< preaffine_matrix_translation[2] PreAffine Matrix for translation integer value S18.8*/

-+    int32_t preaffine_matrix_translation[2];

-+    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/

-+    int32_t postaffine_matrix_scale[4];

-+    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/

-+    int32_t postaffine_matrix_translation[2];

-+    /*!< invalid_coord_mask[4] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/

-+    int32_t invalid_coord_mask[4];

-+    /*!< normalization_sf Normalization scaling factor (Q20)*/

-+    int32_t normalization_sf;

-+    /*!< MSB_alignment_en 0: LSB Alignment 1:MSB Alignment*/

-+    int32_t MSB_alignment_en;

-+

-+} ia_pal_isp_gdc5_t;

-+

-+/*! \isp struct gdc7

-+

-+*/

-+typedef struct

-+{

-+    /*!< gdc_coord_enable coord calculation bypass*/

-+    int32_t gdc_coord_enable;

-+    /*!< gdc_operating_mode 0: GDC calculates tetragons; 1: tetragons from API are used, 2: GDC5_1 WFOV*/

-+    int32_t gdc_operating_mode;

-+    /*!< crop_top Top border for cropping*/

-+    int32_t crop_top;

-+    /*!< crop_left Left border for cropping*/

-+    int32_t crop_left;

-+    /*!< crop_bottom Bottom border for cropping*/

-+    int32_t crop_bottom;

-+    /*!< crop_right Right border for cropping*/

-+    int32_t crop_right;

-+    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S4.18,*/

-+    int32_t homography_transformation_luma_0[64];

-+    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/

-+    int32_t homography_transformation_luma_1[32];

-+    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S18.13*/

-+    int32_t homography_transformation_luma_2[48];

-+    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/

-+    int32_t homography_matrices_offset[16];

-+    /*!< homography_matrices_count number of homography matrices*/

-+    int32_t homography_matrices_count;

-+    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/

-+    int32_t ldc_r_lut[256];

-+    /*!< ldc_max_distance_from_center Maximum distance from the radial center from the full sensor resolution. Q16.8*/

-+    int32_t ldc_max_distance_from_center;

-+    /*!< ldc_r_x_center x coordinate of LDC (R) correction center of symmerty*/

-+    int32_t ldc_r_x_center;

-+    /*!< ldc_r_y_center y coordinate of LDC (R) correction center of symmerty*/

-+    int32_t ldc_r_y_center;

-+    /*!< ldc_r_y_scale_factor y coordinate scaling factor for elliptical distortion of LDC (R) correction, format Q4.16*/

-+    int32_t ldc_r_y_scale_factor;

-+    /*!< gdc_modep 0:Homography/Projections/LDC/PostAffine, 1:Homography/Projections/Rotation/LDC/PostAffine, 2:Homography/Projections/Rotation/PostAffine, 3:Grid/Rotation/LDC/PostAffine, 4:Grid/LDC/PostAffine, 5:Grid/PreAffine/Projections/Rotation/LDC/PostAffine, 6: Grid*/

-+    int32_t gdc_modep;

-+    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/

-+    int32_t rotationmatrix[9];

-+    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/

-+    int32_t projectionsf_1[2];

-+    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/

-+    int32_t projectionsf_2[2];

-+    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular, 3: 2D Bowl*/

-+    int32_t projection_type;

-+    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/

-+    int32_t projections_inv_f_pi;

-+    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/

-+    int32_t ldc_max_a;

-+    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/

-+    int32_t ldc_inv_max_a;

-+    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/

-+    int32_t ldc_lut_shift_bits;

-+    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/

-+    int32_t postaffine_matrix_scale[4];

-+    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/

-+    int32_t postaffine_matrix_translation[2];

-+    /*!< invalid_coord_mask[4] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/

-+    int32_t invalid_coord_mask[4];

-+    /*!< normalization_sf Normalization scaling factor (Q20)*/

-+    int32_t normalization_sf;

-+    /*!< translation3d[3] 3D translation for bowl projection (S14.8)*/

-+    int32_t translation3d[3];

-+    /*!< bowl_radius_sqr_2d 2D Bowl Radius Square (Q28.0)*/

-+    int32_t bowl_radius_sqr_2d;

-+    /*!< bowl_scale_2d 2D Bowl Scale Value (Q0.31)*/

-+    int32_t bowl_scale_2d;

-+    /*!< IRS_interpolation_enable Use NN for interpolation*/

-+    int32_t IRS_interpolation_enable;

-+    /*!< input_height input image height*/

-+    int32_t input_height;

-+    /*!< input_width input image width*/

-+    int32_t input_width;

-+    /*!< GDC_SP_coord_conv_enable GDC SP 1:4 coord conversion mechanism*/

-+    int32_t GDC_SP_coord_conv_enable;

-+    /*!< max_distortion_reporting_enable Report position within input image of last processed row for internal rolling buffer support 0-off, 1-on*/

-+    int32_t max_distortion_reporting_enable;

-+    /*!< max_distortion Maximum lens distortion in input image domain, which defines stagger of last processed input row relative to output row*/

-+    int32_t max_distortion;

-+

-+} ia_pal_isp_gdc7_t;

-+

-+/*! \isp struct glim_1_0

-+Global inverse tone mapping

-+*/

-+typedef struct

-+{

-+    /*!< glim_enable Enable GLIM*/

-+    int32_t glim_enable;

-+    /*!< glu_base_level[8] GLU base level offset*/

-+    int32_t glu_base_level[8];

-+    /*!< glu_step[8] GLU step amount per stage*/

-+    int32_t glu_step[8];

-+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin[8];

-+    /*!< glu_gen_lut_size Utilized LUT size*/

-+    int32_t glu_gen_lut_size;

-+    /*!< glu_gen_lut[385] LUT samples*/

-+    int32_t glu_gen_lut[385];

-+    /*!< gain_prec Gain precision bits*/

-+    int32_t gain_prec;

-+

-+} ia_pal_isp_glim_1_0_t;

-+

-+/*! \isp struct glim_2_0

-+Global inverse tone mapping

-+*/

-+typedef struct

-+{

-+    /*!< glim_enable Enable GLIM*/

-+    int32_t glim_enable;

-+    /*!< glu_base_level[8] GLU base level offset*/

-+    int32_t glu_base_level[8];

-+    /*!< glu_step[8] GLU step amount per stage*/

-+    int32_t glu_step[8];

-+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin[8];

-+    /*!< glu_gen_lut_size Utilized LUT size*/

-+    int32_t glu_gen_lut_size;

-+    /*!< glu_gen_lut[385] LUT samples*/

-+    int32_t glu_gen_lut[385];

-+    /*!< gain_prec Gain precision bits*/

-+    int32_t gain_prec;

-+

-+} ia_pal_isp_glim_2_0_t;

-+

-+/*! \isp struct gltm_1_0

-+Global tone mapping

-+*/

-+typedef struct

-+{

-+    /*!< gltm_enable Enable GLTM*/

-+    int32_t gltm_enable;

-+    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/

-+    int32_t fc_m[9];

-+    /*!< glu_base_level[8] GLU base level offset*/

-+    int32_t glu_base_level[8];

-+    /*!< glu_step[8] GLU step amount per stage*/

-+    int32_t glu_step[8];

-+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin[8];

-+    /*!< glu_gen_lut_size Utilized LUT size*/

-+    int32_t glu_gen_lut_size;

-+    /*!< glu_gen_lut[385] LUT samples*/

-+    int32_t glu_gen_lut[385];

-+    /*!< gain_prec Gain precision bits*/

-+    int32_t gain_prec;

-+

-+} ia_pal_isp_gltm_1_0_t;

-+

-+/*! \isp struct gltm_2_0

-+Global tone mapping

-+*/

-+typedef struct

-+{

-+    /*!< gltm_enable Enable GLTM*/

-+    int32_t gltm_enable;

-+    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/

-+    int32_t fc_m[9];

-+    /*!< glu_base_level[8] GLU base level offset*/

-+    int32_t glu_base_level[8];

-+    /*!< glu_step[8] GLU step amount per stage*/

-+    int32_t glu_step[8];

-+    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin[8];

-+    /*!< glu_gen_lut_size Utilized LUT size*/

-+    int32_t glu_gen_lut_size;

-+    /*!< glu_gen_lut[385] LUT samples*/

-+    int32_t glu_gen_lut[385];

-+    /*!< gain_prec Gain precision bits*/

-+    int32_t gain_prec;

-+

-+} ia_pal_isp_gltm_2_0_t;

-+

-+/*! \isp struct gmv_statistics_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< gmv_en ff enable/disable flag*/

-+    int32_t gmv_en;

-+    /*!< additional_bin_input set to 1 if 4x binning is required before processing, otherwise image is binned 2x*/

-+    int32_t additional_bin_input;

-+    /*!< kappa kappa for Harris grade calculation*/

-+    int32_t kappa;

-+    /*!< counter_shifter Shifter for the good feature point and good match point counter*/

-+    int32_t counter_shifter;

-+    /*!< good_corner_threshold Threshold for the good corner counter.*/

-+    int32_t good_corner_threshold;

-+    /*!< good_match_threshold Threshold for the good match counter.*/

-+    int32_t good_match_threshold;

-+    /*!< block_width Block width*/

-+    int32_t block_width;

-+    /*!< block_height Block height*/

-+    int32_t block_height;

-+    /*!< x_start x start for best feature search*/

-+    int32_t x_start;

-+    /*!< y_start y start for best feature search*/

-+    int32_t y_start;

-+    /*!< x_end x end for best feature search*/

-+    int32_t x_end;

-+    /*!< y_end y end for best feature search*/

-+    int32_t y_end;

-+

-+} ia_pal_isp_gmv_statistics_1_0_t;

-+

-+/*! \isp struct hdr_blc_1

-+HDR black level correction filter

-+*/

-+typedef struct

-+{

-+    /*!< bl_cc00 Black level, color channel (0,0) (adjusted for MSB aligned image)*/

-+    int32_t bl_cc00;

-+    /*!< bl_cc01 Black level, color channel (0,1) (adjusted for MSB aligned image)*/

-+    int32_t bl_cc01;

-+    /*!< bl_cc10 Black level, color channel (1,0) (adjusted for MSB aligned image)*/

-+    int32_t bl_cc10;

-+    /*!< bl_cc11 Black level, color channel (1,1) (adjusted for MSB aligned image)*/

-+    int32_t bl_cc11;

-+

-+} ia_pal_isp_hdr_blc_1_t;

-+

-+/*! \isp struct hdr_pwldecomp_1

-+PWL decompression filter

-+*/

-+typedef struct

-+{

-+    /*!< idx_shift Shift for computing LUT index*/

-+    int32_t idx_shift;

-+    /*!< delta_x_0_to_31[32] PWL decompression curve delta x (for each segment)*/

-+    int32_t delta_x_0_to_31[32];

-+    /*!< delta_x_32_to_63[32] PWL decompression curve delta x (for each segment)*/

-+    int32_t delta_x_32_to_63[32];

-+    /*!< slope_shift_0_to_31[32] PWL decompression curve shift representing slope (for each segment)*/

-+    int32_t slope_shift_0_to_31[32];

-+    /*!< slope_shift_32_to_63[32] PWL decompression curve shift representing slope (for each segment)*/

-+    int32_t slope_shift_32_to_63[32];

-+    /*!< offset_y_0_to_31[32] PWL decompression curve y offset (for each segment)*/

-+    int32_t offset_y_0_to_31[32];

-+    /*!< offset_y_32_to_63[32] PWL decompression curve y offset (for each segment)*/

-+    int32_t offset_y_32_to_63[32];

-+    /*!< use64 Switch for using 64-element LUTs*/

-+    int32_t use64;

-+    /*!< range_shift Shift for MSB alignment*/

-+    int32_t range_shift;

-+

-+} ia_pal_isp_hdr_pwldecomp_1_t;

-+

-+/*! \isp struct hdr_sqrtcomp_2

-+HDR compression filter

-+*/

-+typedef struct

-+{

-+    /*!< noSQRTcomp SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/

-+    int32_t noSQRTcomp;

-+

-+} ia_pal_isp_hdr_sqrtcomp_2_t;

-+

-+/*! \isp struct hdr_sqrtcomp_3

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/

-+    int32_t bypass;

-+    /*!< invsqrt_offset_vec[128] */

-+    int32_t invsqrt_offset_vec[128];

-+    /*!< invsqrt_slope_vec[128] */

-+    int32_t invsqrt_slope_vec[128];

-+    /*!< invsqrt_x_cord_vec[128] */

-+    int32_t invsqrt_x_cord_vec[128];

-+    /*!< invsqrt_exponent */

-+    int32_t invsqrt_exponent;

-+    /*!< invsqrt_resolution */

-+    int32_t invsqrt_resolution;

-+    /*!< invsqrt_x_cord_max */

-+    int32_t invsqrt_x_cord_max;

-+

-+} ia_pal_isp_hdr_sqrtcomp_3_t;

-+

-+/*! \isp struct hdr_stitch_1w

-+

-+*/

-+typedef struct

-+{

-+    /*!< blend_hithr Blending mask transfer fn upper threshold*/

-+    int32_t blend_hithr;

-+    /*!< blend_maxblendval Max. blending mask value before normalization*/

-+    int32_t blend_maxblendval;

-+    /*!< blend_blendshift Normalization shift for blending mask values*/

-+    int32_t blend_blendshift;

-+    /*!< blend_maxblendval2 Max. blending mask value after normalization*/

-+    int32_t blend_maxblendval2;

-+    /*!< dg_Yshift Shift for luminance in deghosting*/

-+    int32_t dg_Yshift;

-+    /*!< dg_A Ghost map transfer fn. parameter A*/

-+    int32_t dg_A;

-+    /*!< dg_S Ghost map transfer fn. parameter S*/

-+    int32_t dg_S;

-+    /*!< dg_Yfactshift Shift for luminance factor in deghosting*/

-+    int32_t dg_Yfactshift;

-+    /*!< dg_Yfactoffset Offset for luminance factor in deghosting*/

-+    int32_t dg_Yfactoffset;

-+    /*!< dg_ylothr Low threshold deghosting luminance sensitivity (15bit)*/

-+    int32_t dg_ylothr;

-+    /*!< dg_blur Factor for controling blurring in ghost locations (0 no blur , 128 max blur)*/

-+    int32_t dg_blur;

-+    /*!< ng_factor Normalization gain factor (ISP gain * HDR gain)*/

-+    int32_t ng_factor;

-+    /*!< ng_shift Normalization gain shift*/

-+    int32_t ng_shift;

-+    /*!< cgl_R Long exposure channel gain, R (fixed point)*/

-+    int32_t cgl_R;

-+    /*!< cgl_Gr Long exposure channel gain, Gr (fixed point)*/

-+    int32_t cgl_Gr;

-+    /*!< cgl_Gb Long exposure channel gain, Gb (fixed point)*/

-+    int32_t cgl_Gb;

-+    /*!< cgl_B Long exposure channel gain, B (fixed point)*/

-+    int32_t cgl_B;

-+    /*!< cgs_R Short exposure channel gain, R (fixed point)*/

-+    int32_t cgs_R;

-+    /*!< cgs_Gr Short exposure channel gain, Gr (fixed point)*/

-+    int32_t cgs_Gr;

-+    /*!< cgs_Gb Short exposure channel gain, Gb (fixed point)*/

-+    int32_t cgs_Gb;

-+    /*!< cgs_B Short exposure channel gain, B (fixed point)*/

-+    int32_t cgs_B;

-+    /*!< bll_cc00 Long exposure black level, color channel (0,0), WB corrected*/

-+    int32_t bll_cc00;

-+    /*!< bll_cc01 Long exposure black level, color channel (0,0), WB corrected*/

-+    int32_t bll_cc01;

-+    /*!< bll_cc10 Long exposure black level, color channel (0,0), WB corrected*/

-+    int32_t bll_cc10;

-+    /*!< bll_cc11 Long exposure black level, color channel (0,0), WB corrected*/

-+    int32_t bll_cc11;

-+    /*!< bls_cc00 Short exposure black level, color channel (0,0), fixed point*/

-+    int32_t bls_cc00;

-+    /*!< bls_cc01 Short exposure black level, color channel (0,1), fixed point*/

-+    int32_t bls_cc01;

-+    /*!< bls_cc10 Short exposure black level, color channel (1,0), fixed point*/

-+    int32_t bls_cc10;

-+    /*!< bls_cc11 Short exposure black level, color channel (1,1), fixed point*/

-+    int32_t bls_cc11;

-+    /*!< blr_cc00 Short exposure residual black level, color channel (0,0), WB corrected and exposure aligned*/

-+    int32_t blr_cc00;

-+    /*!< blr_cc01 Short exposure residual black level, color channel (0,1), WB corrected and exposure aligned*/

-+    int32_t blr_cc01;

-+    /*!< blr_cc10 Short exposure residual black level, color channel (1,0), WB corrected and exposure aligned*/

-+    int32_t blr_cc10;

-+    /*!< blr_cc11 Short exposure residual black level, color channel (1,1), WB corrected and exposure aligned*/

-+    int32_t blr_cc11;

-+    /*!< dpc_enable DPC weight parameter*/

-+    int32_t dpc_enable;

-+    /*!< lowlight_value Low light threshold*/

-+    int32_t lowlight_value;

-+    /*!< lowlight_shift Low light filter shift*/

-+    int32_t lowlight_shift;

-+    /*!< lowlight_filterStrength Low light filter strength*/

-+    int32_t lowlight_filterStrength;

-+

-+} ia_pal_isp_hdr_stitch_1w_t;

-+

-+/*! \isp struct hdr_wb_1

-+HDR white balance correction filter

-+*/

-+typedef struct

-+{

-+    /*!< gain_R Integer representation of adjusted WB gain, R*/

-+    int32_t gain_R;

-+    /*!< gain_Gr Integer representation of adjusted WB gain, Gr*/

-+    int32_t gain_Gr;

-+    /*!< gain_Gb Integer representation of adjusted WB gain, Gb*/

-+    int32_t gain_Gb;

-+    /*!< gain_B Integer representation of adjusted WB gain, B*/

-+    int32_t gain_B;

-+    /*!< gain_shift_R Adjusted WB gain shift, R*/

-+    int32_t gain_shift_R;

-+    /*!< gain_shift_Gr Adjusted WB gain shift, Gr*/

-+    int32_t gain_shift_Gr;

-+    /*!< gain_shift_Gb Adjusted WB gain shift, Gb*/

-+    int32_t gain_shift_Gb;

-+    /*!< gain_shift_B Adjusted WB gain shift, B*/

-+    int32_t gain_shift_B;

-+    /*!< clipval Clip value for input signal*/

-+    int32_t clipval;

-+

-+} ia_pal_isp_hdr_wb_1_t;

-+

-+/*! \isp struct hdrstats_1

-+HDR Statistics Extraction filter

-+*/

-+typedef struct

-+{

-+    /*!< rgbsstat_en StatR/G/B/S enable: 0 - disable, 1 - enable*/

-+    int32_t rgbsstat_en;

-+    /*!< histstat_en HistStatR/G/B/Y enable: 0 - disable, 1 - enable*/

-+    int32_t histstat_en;

-+    /*!< drcstat_en DRCStatY/V enable: 0 - disable, 1 - enable*/

-+    int32_t drcstat_en;

-+    /*!< bayer_startcolor Bayer Start Color: 0 - R, 1 - Gr, 2 - Gb, 3 - B*/

-+    int32_t bayer_startcolor;

-+    /*!< dcn_mode DCN mode: 0 - bypass, 1 - DC2, 2 - DC4, 3 - DC8, Saturation grid size: 0 - 8x8, 1 - 16x16, 2 - 32x32, 3 - 64x64*/

-+    int32_t dcn_mode;

-+    /*!< sat_thrsh Saturation threshold*/

-+    int32_t sat_thrsh;

-+    /*!< sat_rshift Saturation right shift value for converting to saturation ratio: DCN mode * 2*/

-+    int32_t sat_rshift;

-+    /*!< drcstat_xx2x_bypass Bypass XX2x sub-block*/

-+    int32_t drcstat_xx2x_bypass;

-+    /*!< decomp_bypass Bypass decompression sub-block*/

-+    int32_t decomp_bypass;

-+    /*!< decomp_y_mode decompression Y mode: 0 - average, 1 - max*/

-+    int32_t decomp_y_mode;

-+    /*!< rgbs_grid_width StatR/G/B/S grid width*/

-+    int32_t rgbs_grid_width;

-+    /*!< rgbs_grid_height StatR/G/B/S grid height*/

-+    int32_t rgbs_grid_height;

-+    /*!< hist_grid_width HistStatR/G/B/Y grid width*/

-+    int32_t hist_grid_width;

-+    /*!< hist_grid_height HistStatR/G/B/Y grid height*/

-+    int32_t hist_grid_height;

-+    /*!< drc_grid_width DRCStatY/V grid width*/

-+    int32_t drc_grid_width;

-+    /*!< drc_grid_height DRCStatY/V grid height*/

-+    int32_t drc_grid_height;

-+

-+} ia_pal_isp_hdrstats_1_t;

-+

-+/*! \isp struct input_system_drainer

-+

-+*/

-+typedef struct

-+{

-+    /*!< binning_bayer_enable Bayer binning enable*/

-+    int32_t binning_bayer_enable;

-+    /*!< binning_4cell_enable 4cell binning enable*/

-+    int32_t binning_4cell_enable;

-+    /*!< crop_enable 0 - Line cropping enabled, 1 - Line cropping enabled*/

-+    int32_t crop_enable;

-+    /*!< crop_line_top When cropping is enabled, all lines before this line will be cropped*/

-+    int32_t crop_line_top;

-+    /*!< crop_line_bot When cropping is enabled, all lines after this line will be cropped*/

-+    int32_t crop_line_bot;

-+

-+} ia_pal_isp_input_system_drainer_t;

-+

-+/*! \isp struct io_buffer

-+

-+*/

-+typedef struct

-+{

-+    /*!< input_width Input width counted in number of pixels components per line*/

-+    int32_t input_width;

-+    /*!< input_height Input height counted in number of lines*/

-+    int32_t input_height;

-+    /*!< output_width Output width counted in number of pixels components per line*/

-+    int32_t output_width;

-+    /*!< output_height Output height counted in number of lines*/

-+    int32_t output_height;

-+    /*!< x_output_offset Output horizontal offset from the input, counted in number of pixels components per line, 16b signed (if negative padding is required)*/

-+    int32_t x_output_offset;

-+    /*!< y_output_offset Output vertical offset from the input counted in number of lines, 16b signed*/

-+    int32_t y_output_offset;

-+    /*!< espa_luma_shift_left 1-perform shift left on the luma/bayer componenets, 0-perfrom shift right on the luma/bayer components*/

-+    int32_t espa_luma_shift_left;

-+    /*!< espa_luma_shift_count shift amount to the luma/bayer component where sign is kept and shift right done with rounding*/

-+    int32_t espa_luma_shift_count;

-+    /*!< espa_chroma_shift_left 1-perform shift left on the chroma componenets, 0-perfrom shift right on the chroma components*/

-+    int32_t espa_chroma_shift_left;

-+    /*!< espa_chroma_shift_count shift amount to the chroma component where sign is kept and shift right done with rounding*/

-+    int32_t espa_chroma_shift_count;

-+    /*!< espa_range_reduction_output_resolution Set the output resolution to be used at the range reduction calculation*/

-+    int32_t espa_range_reduction_output_resolution;

-+    /*!< espa_range_reduction_enable enable range reduction calculation for all components*/

-+    int32_t espa_range_reduction_enable;

-+    /*!< espa_luma_clipping_min_enable clipping the luma components to clipping_min value*/

-+    int32_t espa_luma_clipping_min_enable;

-+    /*!< espa_luma_clipping_max_enable clipping the luma components to clipping_max value*/

-+    int32_t espa_luma_clipping_max_enable;

-+    /*!< espa_chroma_clipping_min_enable clipping the chroma components to clipping_min value*/

-+    int32_t espa_chroma_clipping_min_enable;

-+    /*!< espa_chroma_clipping_max_enable clipping the chroma components to clipping_max value*/

-+    int32_t espa_chroma_clipping_max_enable;

-+    /*!< espa_luma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/

-+    int32_t espa_luma_clipping_min_value;

-+    /*!< espa_luma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/

-+    int32_t espa_luma_clipping_max_value;

-+    /*!< espa_luma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/

-+    int32_t espa_luma_offset_value;

-+    /*!< espa_chroma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/

-+    int32_t espa_chroma_clipping_min_value;

-+    /*!< espa_chroma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/

-+    int32_t espa_chroma_clipping_max_value;

-+    /*!< espa_chroma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/

-+    int32_t espa_chroma_offset_value;

-+    /*!< espa_enable Enable espa*/

-+    int32_t espa_enable;

-+    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/

-+    int32_t component_precision;

-+    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/

-+    int32_t unpack_alignment;

-+    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/

-+    int32_t vertical_ordering_enable;

-+    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/

-+    int32_t vertical_ordering_sub_line;

-+    /*!< burst_align 0-each request should be aligned to burst size except first request in line (alignment done at first request since the burst size is power of 2),  1-each request should be at burst size except page boundry and EOL*/

-+    int32_t burst_align;

-+    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/

-+    int32_t num_of_queues;

-+    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/

-+    int32_t vector_format;

-+    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/

-+    int32_t tile_mode;

-+    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/

-+    int32_t tiling_type;

-+    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/

-+    int32_t compression_mode;

-+    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/

-+    int32_t buffer_1d_enable;

-+    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/

-+    int32_t num_of_planes;

-+    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/

-+    uint32_t plane_stride[3];

-+    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

-+    uint32_t plane_offset_start_address[3];

-+    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

-+    uint32_t plane_offset_end_address[3];

-+    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/

-+    int32_t plane_tile_width[3];

-+    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/

-+    int32_t plane_tile_height[3];

-+    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/

-+    int32_t chroma_planes_order;

-+    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/

-+    int32_t chroma_duplication;

-+    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/

-+    int32_t onep_pixel_order;

-+    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/

-+    int32_t zlr_transaction_enable;

-+    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/

-+    int32_t streaming_mode;

-+    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/

-+    int32_t streaming_sw_managed;

-+    /*!< local_link_id indicates the stream used at the current connectlon*/

-+    int32_t local_link_id;

-+    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/

-+    int32_t stride_ratio;

-+    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/

-+    int32_t granularity_pointer_update;

-+    /*!< max_stride provides the maximum stride value to be used at the connection*/

-+    int32_t max_stride;

-+    /*!< block_width buffer block width configuration in pixels*/

-+    int32_t block_width;

-+    /*!< block_height buffer block height configuration in lines*/

-+    int32_t block_height;

-+    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/

-+    int32_t first_row_blocks_height;

-+    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/

-+    int32_t last_row_blocks_height;

-+    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/

-+    int32_t plane_max_burst_size[3];

-+    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/

-+    int32_t plane_horiz_subsample_config[3];

-+    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/

-+    int32_t plane_vert_subsample_config[3];

-+    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/

-+    int32_t plane_zlr_granularity[3];

-+    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/

-+    int32_t progress_message_line;

-+    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/

-+    int32_t pace_message_ref_line;

-+    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/

-+    int32_t pace_message_pace_line;

-+    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/

-+    int32_t component_in_valid_pixel;

-+    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/

-+    int32_t pixels_in_valid_cycle;

-+    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/

-+    int32_t subsample_YUV444_to_YUV422;

-+    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/

-+    int32_t middle_ack_line_number;

-+    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/

-+    int32_t middle_ack_enable;

-+    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/

-+    int32_t middle_ack_mode_stall;

-+    /*!< stream_dt stream data type as need to be used by the MIPI*/

-+    int32_t stream_dt;

-+    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/

-+    int32_t stream_vc;

-+    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/

-+    int32_t proc_ff_bypass;

-+    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

-+    int32_t dpa_bypass;

-+    /*!< sif_user_info2 information to be given by FW and used in the pipeline (driven by IFD). Read bus width defined by HWP*/

-+    uint32_t sif_user_info2;

-+    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

-+    int32_t mipi_csi_eof;

-+    /*!< ppc provides the amount of pixel per cycle*/

-+    int32_t ppc;

-+    /*!< stream_wc stream word count as need to be used by the MIPI*/

-+    int32_t stream_wc;

-+    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/

-+    uint32_t max_credits;

-+

-+} ia_pal_isp_io_buffer_t;

-+

-+/*! \isp struct irs_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable IRS*/

-+    int32_t enable;

-+    /*!< passThrough Pass throught algorithm*/

-+    int32_t passThrough;

-+    /*!< block_height */

-+    int32_t block_height;

-+    /*!< block_width */

-+    int32_t block_width;

-+    /*!< top_left_x */

-+    int32_t top_left_x;

-+    /*!< top_left_y */

-+    int32_t top_left_y;

-+    /*!< interpolation_enable */

-+    int32_t interpolation_enable;

-+    /*!< unclipped_a_max */

-+    int32_t unclipped_a_max;

-+    /*!< mask_val_Y */

-+    int32_t mask_val_Y;

-+    /*!< mask_val_U */

-+    int32_t mask_val_U;

-+    /*!< mask_val_V */

-+    int32_t mask_val_V;

-+    /*!< mask_val_Z */

-+    int32_t mask_val_Z;

-+    /*!< coord_stride stride of the given coordinates grid*/

-+    int32_t coord_stride;

-+    /*!< mode MC1/MC2/MCFR/GDC_SP/GDC_FR mode*/

-+    int32_t mode;

-+

-+} ia_pal_isp_irs_1_0_t;

-+

-+/*! \isp struct lca_1_0

-+Lateral Chromatic Aberration Correction

-+*/

-+typedef struct

-+{

-+    /*!< radial_enable radial_enable*/

-+    int32_t radial_enable;

-+    /*!< grid_enable grid_enable*/

-+    int32_t grid_enable;

-+    /*!< bypass bypass flag*/

-+    int32_t bypass;

-+    /*!< pixel_format_matrix[4] Bayer type: Gr -> 0, Gb ->1, R -> 2, B -> 3*/

-+    int32_t pixel_format_matrix[4];

-+    /*!< rx_initial rx_initial*/

-+    int32_t rx_initial;

-+    /*!< ry_initial ry_initial*/

-+    int32_t ry_initial;

-+    /*!< opt_center_x opt_center_x*/

-+    int32_t opt_center_x;

-+    /*!< opt_center_y opt_center_y*/

-+    int32_t opt_center_y;

-+    /*!< bits_per_pixel_in_map_x bits_per_pixel_in_map_x*/

-+    int32_t bits_per_pixel_in_map_x;

-+    /*!< bits_per_pixel_in_map_y bits_per_pixel_in_map_y*/

-+    int32_t bits_per_pixel_in_map_y;

-+    /*!< grid_shift_map_blue_x[324] grid_shift_map_blue_x*/

-+    int32_t grid_shift_map_blue_x[324];

-+    /*!< grid_shift_map_blue_y[324] grid_shift_map_blue_y*/

-+    int32_t grid_shift_map_blue_y[324];

-+    /*!< grid_shift_map_red_x[324] grid_shift_map_red_x*/

-+    int32_t grid_shift_map_red_x[324];

-+    /*!< grid_shift_map_red_y[324] grid_shift_map_red_y*/

-+    int32_t grid_shift_map_red_y[324];

-+    /*!< cu_blue_rad_shift_x[16] cu_blue_rad_shift_x*/

-+    int32_t cu_blue_rad_shift_x[16];

-+    /*!< cu_blue_rad_shift_y[15] cu_blue_rad_shift_y*/

-+    int32_t cu_blue_rad_shift_y[15];

-+    /*!< cu_blue_rad_shift_slope[15] cu_blue_rad_shift_slope*/

-+    int32_t cu_blue_rad_shift_slope[15];

-+    /*!< cu_red_rad_shift_x[16] cu_red_rad_shift_x*/

-+    int32_t cu_red_rad_shift_x[16];

-+    /*!< cu_red_rad_shift_y[15] cu_red_rad_shift_y*/

-+    int32_t cu_red_rad_shift_y[15];

-+    /*!< cu_red_rad_shift_slope[15] cu_red_rad_shift_slope*/

-+    int32_t cu_red_rad_shift_slope[15];

-+    /*!< resample_type resample type: 0 - bilinear, 1 - bicubic*/

-+    int32_t resample_type;

-+    /*!< rad_sqr_prec_reduction radius square precision reduction*/

-+    int32_t rad_sqr_prec_reduction;

-+    /*!< grid_shift_precision_increment grid shift precision increment*/

-+    int32_t grid_shift_precision_increment;

-+    /*!< radial_shift_precision_alignment radial shift precision alignment*/

-+    int32_t radial_shift_precision_alignment;

-+    /*!< correction_power sensitivity correction*/

-+    int32_t correction_power;

-+    /*!< binning_factor_x binnig factor for x dimension*/

-+    int32_t binning_factor_x;

-+    /*!< binning_factor_y binning factor for y dimension*/

-+    int32_t binning_factor_y;

-+

-+} ia_pal_isp_lca_1_0_t;

-+

-+/*! \isp struct ldr_blc_1

-+LDR black level correction filter

-+*/

-+typedef struct

-+{

-+    /*!< bl_cc00 Black level, color channel (0,0)*/

-+    int32_t bl_cc00;

-+    /*!< bl_cc01 Black level, color channel (0,1)*/

-+    int32_t bl_cc01;

-+    /*!< bl_cc10 Black level, color channel (1,0)*/

-+    int32_t bl_cc10;

-+    /*!< bl_cc11 Black level, color channel (1,1)*/

-+    int32_t bl_cc11;

-+

-+} ia_pal_isp_ldr_blc_1_t;

-+

-+/*! \isp struct ldr_wb_1

-+LDR white balance correction filter

-+*/

-+typedef struct

-+{

-+    /*!< gain_R WB gain, R (fixed point)*/

-+    int32_t gain_R;

-+    /*!< gain_Gr WB gain, Gr (fixed point)*/

-+    int32_t gain_Gr;

-+    /*!< gain_Gb WB gain, Gb (fixed point)*/

-+    int32_t gain_Gb;

-+    /*!< gain_B WB gain, B (fixed point)*/

-+    int32_t gain_B;

-+    /*!< gain_fract No. of fractional places in WB gain fixed pt. representation*/

-+    int32_t gain_fract;

-+    /*!< saturation_value Saturation value after WB*/

-+    int32_t saturation_value;

-+

-+} ia_pal_isp_ldr_wb_1_t;

-+

-+/*! \isp struct linearization2_0

-+Linearization

-+*/

-+typedef struct

-+{

-+    /*!< Linearization2_0_enable Enable Linearization2_0*/

-+    int32_t Linearization2_0_enable;

-+    /*!< glu_base_level0[5] GLU base level offset*/

-+    int32_t glu_base_level0[5];

-+    /*!< glu_base_level1[5] GLU1 base level offset*/

-+    int32_t glu_base_level1[5];

-+    /*!< glu_base_level2[5] GLU2 base level offset*/

-+    int32_t glu_base_level2[5];

-+    /*!< glu_base_level3[5] GLU3 base level offset*/

-+    int32_t glu_base_level3[5];

-+    /*!< glu_base_level4[5] GLU4 base level offset*/

-+    int32_t glu_base_level4[5];

-+    /*!< glu_base_level5[5] GLU5 base level offset*/

-+    int32_t glu_base_level5[5];

-+    /*!< glu_base_level6[5] GLU6 base level offset*/

-+    int32_t glu_base_level6[5];

-+    /*!< glu_base_level7[5] GLU7 base level offset*/

-+    int32_t glu_base_level7[5];

-+    /*!< glu_step0[5] GLU step amount per stage*/

-+    int32_t glu_step0[5];

-+    /*!< glu_step1[5] GLU1 step amount per stage*/

-+    int32_t glu_step1[5];

-+    /*!< glu_step2[5] GLU2 step amount per stage*/

-+    int32_t glu_step2[5];

-+    /*!< glu_step3[5] GLU3 step amount per stage*/

-+    int32_t glu_step3[5];

-+    /*!< glu_step4[5] GLU4 step amount per stage*/

-+    int32_t glu_step4[5];

-+    /*!< glu_step5[5] GLU5 step amount per stage*/

-+    int32_t glu_step5[5];

-+    /*!< glu_step6[5] GLU6 step amount per stage*/

-+    int32_t glu_step6[5];

-+    /*!< glu_step7[5] GLU7 step amount per stage*/

-+    int32_t glu_step7[5];

-+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin0[5];

-+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

-+    int32_t glu_start_bin1[5];

-+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

-+    int32_t glu_start_bin2[5];

-+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

-+    int32_t glu_start_bin3[5];

-+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

-+    int32_t glu_start_bin4[5];

-+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

-+    int32_t glu_start_bin5[5];

-+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

-+    int32_t glu_start_bin6[5];

-+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

-+    int32_t glu_start_bin7[5];

-+    /*!< glu_gen_lut_size0 Utilized LUT size*/

-+    int32_t glu_gen_lut_size0;

-+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

-+    int32_t glu_gen_lut_size1;

-+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

-+    int32_t glu_gen_lut_size2;

-+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

-+    int32_t glu_gen_lut_size3;

-+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

-+    int32_t glu_gen_lut_size4;

-+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

-+    int32_t glu_gen_lut_size5;

-+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

-+    int32_t glu_gen_lut_size6;

-+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

-+    int32_t glu_gen_lut_size7;

-+    /*!< glu_gen_lut0[512] LUT samples*/

-+    int32_t glu_gen_lut0[512];

-+    /*!< glu_gen_lut1[512] LUT1 samples*/

-+    int32_t glu_gen_lut1[512];

-+    /*!< glu_gen_lut2[512] LUT2 samples*/

-+    int32_t glu_gen_lut2[512];

-+    /*!< glu_gen_lut3[512] LUT3 samples*/

-+    int32_t glu_gen_lut3[512];

-+    /*!< glu_gen_lut4[512] LUT4 samples*/

-+    int32_t glu_gen_lut4[512];

-+    /*!< glu_gen_lut5[512] LUT5 samples*/

-+    int32_t glu_gen_lut5[512];

-+    /*!< glu_gen_lut6[512] LUT6 samples*/

-+    int32_t glu_gen_lut6[512];

-+    /*!< glu_gen_lut7[512] LUT7 samples*/

-+    int32_t glu_gen_lut7[512];

-+    /*!< mask0[4] Mask of quad 0*/

-+    int32_t mask0[4];

-+    /*!< mask1[4] Mask of quad 1*/

-+    int32_t mask1[4];

-+    /*!< mask2[4] Mask of quad 2*/

-+    int32_t mask2[4];

-+    /*!< mask3[4] Mask of quad 3*/

-+    int32_t mask3[4];

-+

-+} ia_pal_isp_linearization2_0_t;

-+

-+/*! \isp struct linearization2_0_b

-+Linearization

-+*/

-+typedef struct

-+{

-+    /*!< Linearization2_0_enable Enable Linearization2_0*/

-+    int32_t Linearization2_0_enable;

-+    /*!< glu_base_level0[5] GLU base level offset*/

-+    int32_t glu_base_level0[5];

-+    /*!< glu_base_level1[5] GLU1 base level offset*/

-+    int32_t glu_base_level1[5];

-+    /*!< glu_base_level2[5] GLU2 base level offset*/

-+    int32_t glu_base_level2[5];

-+    /*!< glu_base_level3[5] GLU3 base level offset*/

-+    int32_t glu_base_level3[5];

-+    /*!< glu_base_level4[5] GLU4 base level offset*/

-+    int32_t glu_base_level4[5];

-+    /*!< glu_base_level5[5] GLU5 base level offset*/

-+    int32_t glu_base_level5[5];

-+    /*!< glu_base_level6[5] GLU6 base level offset*/

-+    int32_t glu_base_level6[5];

-+    /*!< glu_base_level7[5] GLU7 base level offset*/

-+    int32_t glu_base_level7[5];

-+    /*!< glu_step0[5] GLU step amount per stage*/

-+    int32_t glu_step0[5];

-+    /*!< glu_step1[5] GLU1 step amount per stage*/

-+    int32_t glu_step1[5];

-+    /*!< glu_step2[5] GLU2 step amount per stage*/

-+    int32_t glu_step2[5];

-+    /*!< glu_step3[5] GLU3 step amount per stage*/

-+    int32_t glu_step3[5];

-+    /*!< glu_step4[5] GLU4 step amount per stage*/

-+    int32_t glu_step4[5];

-+    /*!< glu_step5[5] GLU5 step amount per stage*/

-+    int32_t glu_step5[5];

-+    /*!< glu_step6[5] GLU6 step amount per stage*/

-+    int32_t glu_step6[5];

-+    /*!< glu_step7[5] GLU7 step amount per stage*/

-+    int32_t glu_step7[5];

-+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin0[5];

-+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

-+    int32_t glu_start_bin1[5];

-+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

-+    int32_t glu_start_bin2[5];

-+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

-+    int32_t glu_start_bin3[5];

-+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

-+    int32_t glu_start_bin4[5];

-+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

-+    int32_t glu_start_bin5[5];

-+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

-+    int32_t glu_start_bin6[5];

-+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

-+    int32_t glu_start_bin7[5];

-+    /*!< glu_gen_lut_size0 Utilized LUT size*/

-+    int32_t glu_gen_lut_size0;

-+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

-+    int32_t glu_gen_lut_size1;

-+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

-+    int32_t glu_gen_lut_size2;

-+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

-+    int32_t glu_gen_lut_size3;

-+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

-+    int32_t glu_gen_lut_size4;

-+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

-+    int32_t glu_gen_lut_size5;

-+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

-+    int32_t glu_gen_lut_size6;

-+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

-+    int32_t glu_gen_lut_size7;

-+    /*!< glu_gen_lut0[512] LUT samples*/

-+    int32_t glu_gen_lut0[512];

-+    /*!< glu_gen_lut1[512] LUT1 samples*/

-+    int32_t glu_gen_lut1[512];

-+    /*!< glu_gen_lut2[512] LUT2 samples*/

-+    int32_t glu_gen_lut2[512];

-+    /*!< glu_gen_lut3[512] LUT3 samples*/

-+    int32_t glu_gen_lut3[512];

-+    /*!< glu_gen_lut4[512] LUT4 samples*/

-+    int32_t glu_gen_lut4[512];

-+    /*!< glu_gen_lut5[512] LUT5 samples*/

-+    int32_t glu_gen_lut5[512];

-+    /*!< glu_gen_lut6[512] LUT6 samples*/

-+    int32_t glu_gen_lut6[512];

-+    /*!< glu_gen_lut7[512] LUT7 samples*/

-+    int32_t glu_gen_lut7[512];

-+    /*!< mask0[4] Mask of quad 0*/

-+    int32_t mask0[4];

-+    /*!< mask1[4] Mask of quad 1*/

-+    int32_t mask1[4];

-+    /*!< mask2[4] Mask of quad 2*/

-+    int32_t mask2[4];

-+    /*!< mask3[4] Mask of quad 3*/

-+    int32_t mask3[4];

-+

-+} ia_pal_isp_linearization2_0_b_t;

-+

-+/*! \isp struct linearization2_0_c

-+Linearization

-+*/

-+typedef struct

-+{

-+    /*!< Linearization2_0_enable Enable Linearization2_0*/

-+    int32_t Linearization2_0_enable;

-+    /*!< glu_base_level0[5] GLU base level offset*/

-+    int32_t glu_base_level0[5];

-+    /*!< glu_base_level1[5] GLU1 base level offset*/

-+    int32_t glu_base_level1[5];

-+    /*!< glu_base_level2[5] GLU2 base level offset*/

-+    int32_t glu_base_level2[5];

-+    /*!< glu_base_level3[5] GLU3 base level offset*/

-+    int32_t glu_base_level3[5];

-+    /*!< glu_base_level4[5] GLU4 base level offset*/

-+    int32_t glu_base_level4[5];

-+    /*!< glu_base_level5[5] GLU5 base level offset*/

-+    int32_t glu_base_level5[5];

-+    /*!< glu_base_level6[5] GLU6 base level offset*/

-+    int32_t glu_base_level6[5];

-+    /*!< glu_base_level7[5] GLU7 base level offset*/

-+    int32_t glu_base_level7[5];

-+    /*!< glu_step0[5] GLU step amount per stage*/

-+    int32_t glu_step0[5];

-+    /*!< glu_step1[5] GLU1 step amount per stage*/

-+    int32_t glu_step1[5];

-+    /*!< glu_step2[5] GLU2 step amount per stage*/

-+    int32_t glu_step2[5];

-+    /*!< glu_step3[5] GLU3 step amount per stage*/

-+    int32_t glu_step3[5];

-+    /*!< glu_step4[5] GLU4 step amount per stage*/

-+    int32_t glu_step4[5];

-+    /*!< glu_step5[5] GLU5 step amount per stage*/

-+    int32_t glu_step5[5];

-+    /*!< glu_step6[5] GLU6 step amount per stage*/

-+    int32_t glu_step6[5];

-+    /*!< glu_step7[5] GLU7 step amount per stage*/

-+    int32_t glu_step7[5];

-+    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin0[5];

-+    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

-+    int32_t glu_start_bin1[5];

-+    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

-+    int32_t glu_start_bin2[5];

-+    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

-+    int32_t glu_start_bin3[5];

-+    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

-+    int32_t glu_start_bin4[5];

-+    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

-+    int32_t glu_start_bin5[5];

-+    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

-+    int32_t glu_start_bin6[5];

-+    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

-+    int32_t glu_start_bin7[5];

-+    /*!< glu_gen_lut_size0 Utilized LUT size*/

-+    int32_t glu_gen_lut_size0;

-+    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

-+    int32_t glu_gen_lut_size1;

-+    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

-+    int32_t glu_gen_lut_size2;

-+    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

-+    int32_t glu_gen_lut_size3;

-+    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

-+    int32_t glu_gen_lut_size4;

-+    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

-+    int32_t glu_gen_lut_size5;

-+    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

-+    int32_t glu_gen_lut_size6;

-+    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

-+    int32_t glu_gen_lut_size7;

-+    /*!< glu_gen_lut0[512] LUT samples*/

-+    int32_t glu_gen_lut0[512];

-+    /*!< glu_gen_lut1[512] LUT1 samples*/

-+    int32_t glu_gen_lut1[512];

-+    /*!< glu_gen_lut2[512] LUT2 samples*/

-+    int32_t glu_gen_lut2[512];

-+    /*!< glu_gen_lut3[512] LUT3 samples*/

-+    int32_t glu_gen_lut3[512];

-+    /*!< glu_gen_lut4[512] LUT4 samples*/

-+    int32_t glu_gen_lut4[512];

-+    /*!< glu_gen_lut5[512] LUT5 samples*/

-+    int32_t glu_gen_lut5[512];

-+    /*!< glu_gen_lut6[512] LUT6 samples*/

-+    int32_t glu_gen_lut6[512];

-+    /*!< glu_gen_lut7[512] LUT7 samples*/

-+    int32_t glu_gen_lut7[512];

-+    /*!< mask0[4] Mask of quad 0*/

-+    int32_t mask0[4];

-+    /*!< mask1[4] Mask of quad 1*/

-+    int32_t mask1[4];

-+    /*!< mask2[4] Mask of quad 2*/

-+    int32_t mask2[4];

-+    /*!< mask3[4] Mask of quad 3*/

-+    int32_t mask3[4];

-+

-+} ia_pal_isp_linearization2_0_c_t;

-+

-+/*! \isp struct linearization2hdr

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass */

-+    int32_t bypass;

-+    /*!< lut_vec_00[128] */

-+    int32_t lut_vec_00[128];

-+    /*!< lut_vec_01[128] */

-+    int32_t lut_vec_01[128];

-+    /*!< lut_vec_10[128] */

-+    int32_t lut_vec_10[128];

-+    /*!< lut_vec_11[128] */

-+    int32_t lut_vec_11[128];

-+    /*!< base_level[16] */

-+    int32_t base_level[16];

-+    /*!< start_bin[16] */

-+    int32_t start_bin[16];

-+    /*!< step[16] */

-+    int32_t step[16];

-+    /*!< slope_vec_00[128] */

-+    int32_t slope_vec_00[128];

-+    /*!< slope_vec_01[128] */

-+    int32_t slope_vec_01[128];

-+    /*!< slope_vec_10[128] */

-+    int32_t slope_vec_10[128];

-+    /*!< slope_vec_11[128] */

-+    int32_t slope_vec_11[128];

-+    /*!< slope_resolution[16] */

-+    int32_t slope_resolution[16];

-+

-+} ia_pal_isp_linearization2hdr_t;

-+

-+/*! \isp struct linearizationdg_dss

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< linc00[65] linearization grid table*/

-+    int32_t linc00[65];

-+    /*!< linc01[65] linearization grid table*/

-+    int32_t linc01[65];

-+    /*!< linc02[65] linearization grid table*/

-+    int32_t linc02[65];

-+    /*!< linc03[65] linearization grid table*/

-+    int32_t linc03[65];

-+    /*!< linc10[65] linearization grid table*/

-+    int32_t linc10[65];

-+    /*!< linc11[65] linearization grid table*/

-+    int32_t linc11[65];

-+    /*!< linc12[65] linearization grid table*/

-+    int32_t linc12[65];

-+    /*!< linc13[65] linearization grid table*/

-+    int32_t linc13[65];

-+    /*!< linc20[65] linearization grid table*/

-+    int32_t linc20[65];

-+    /*!< linc21[65] linearization grid table*/

-+    int32_t linc21[65];

-+    /*!< linc22[65] linearization grid table*/

-+    int32_t linc22[65];

-+    /*!< linc23[65] linearization grid table*/

-+    int32_t linc23[65];

-+    /*!< linc30[65] linearization grid table*/

-+    int32_t linc30[65];

-+    /*!< linc31[65] linearization grid table*/

-+    int32_t linc31[65];

-+    /*!< linc32[65] linearization grid table*/

-+    int32_t linc32[65];

-+    /*!< linc33[65] linearization grid table*/

-+    int32_t linc33[65];

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_linearizationdg_dss_t;

-+

-+/*! \isp struct linearizationwb_dss

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< linc00[65] linearization grid table*/

-+    int32_t linc00[65];

-+    /*!< linc01[65] linearization grid table*/

-+    int32_t linc01[65];

-+    /*!< linc02[65] linearization grid table*/

-+    int32_t linc02[65];

-+    /*!< linc03[65] linearization grid table*/

-+    int32_t linc03[65];

-+    /*!< linc10[65] linearization grid table*/

-+    int32_t linc10[65];

-+    /*!< linc11[65] linearization grid table*/

-+    int32_t linc11[65];

-+    /*!< linc12[65] linearization grid table*/

-+    int32_t linc12[65];

-+    /*!< linc13[65] linearization grid table*/

-+    int32_t linc13[65];

-+    /*!< linc20[65] linearization grid table*/

-+    int32_t linc20[65];

-+    /*!< linc21[65] linearization grid table*/

-+    int32_t linc21[65];

-+    /*!< linc22[65] linearization grid table*/

-+    int32_t linc22[65];

-+    /*!< linc23[65] linearization grid table*/

-+    int32_t linc23[65];

-+    /*!< linc30[65] linearization grid table*/

-+    int32_t linc30[65];

-+    /*!< linc31[65] linearization grid table*/

-+    int32_t linc31[65];

-+    /*!< linc32[65] linearization grid table*/

-+    int32_t linc32[65];

-+    /*!< linc33[65] linearization grid table*/

-+    int32_t linc33[65];

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_linearizationwb_dss_t;

-+

-+/*! \isp struct lossycomp_1_0

-+Lossy compression for DDR

-+*/

-+typedef struct

-+{

-+    /*!< enable enable the lossy compression*/

-+    int32_t enable;

-+

-+} ia_pal_isp_lossycomp_1_0_t;

-+

-+/*! \isp struct lossydecomp_1_0

-+Lossy decompression for DDR

-+*/

-+typedef struct

-+{

-+    /*!< enable enable the lossy decompression*/

-+    int32_t enable;

-+

-+} ia_pal_isp_lossydecomp_1_0_t;

-+

-+/*! \isp struct lsc_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< lsclog2gridwidth log2 width of each subplane*/

-+    int32_t lsclog2gridwidth;

-+    /*!< lsclog2gridheight log2 height of each subplane*/

-+    int32_t lsclog2gridheight;

-+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_col_start;

-+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_row_start;

-+    /*!< lsc_exp resolution modifier of the lsc tables*/

-+    int32_t lsc_exp;

-+    /*!< lsc_grid_tablec00[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec00[4096];

-+    /*!< lsc_grid_tablec01[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec01[4096];

-+    /*!< lsc_grid_tablec02[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec02[4096];

-+    /*!< lsc_grid_tablec03[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec03[4096];

-+    /*!< lsc_grid_tablec10[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec10[4096];

-+    /*!< lsc_grid_tablec11[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec11[4096];

-+    /*!< lsc_grid_tablec12[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec12[4096];

-+    /*!< lsc_grid_tablec13[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec13[4096];

-+    /*!< lsc_grid_tablec20[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec20[4096];

-+    /*!< lsc_grid_tablec21[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec21[4096];

-+    /*!< lsc_grid_tablec22[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec22[4096];

-+    /*!< lsc_grid_tablec23[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec23[4096];

-+    /*!< lsc_grid_tablec30[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec30[4096];

-+    /*!< lsc_grid_tablec31[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec31[4096];

-+    /*!< lsc_grid_tablec32[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec32[4096];

-+    /*!< lsc_grid_tablec33[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec33[4096];

-+    /*!< lsc_table_width table width*/

-+    int32_t lsc_table_width;

-+    /*!< lsc_table_height table height*/

-+    int32_t lsc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+    /*!< bypass_compression bypass for the compression/decompression*/

-+    int32_t bypass_compression;

-+    /*!< cu_compression_x[8] U.20 cu_compression_x*/

-+    int32_t cu_compression_x[8];

-+    /*!< cu_compression_y[7] U.15 cu_compression_y*/

-+    int32_t cu_compression_y[7];

-+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit)*/

-+    int32_t cu_compression_slope[7];

-+    /*!< cu_decompression_x[8] U.15 cu_decompression_y*/

-+    int32_t cu_decompression_x[8];

-+    /*!< cu_decompression_y[7] U.20 cu_decompression_x*/

-+    int32_t cu_decompression_y[7];

-+    /*!< cu_decompression_slope[7] U.8.6 cu_decompression_slope (14 bit)*/

-+    int32_t cu_decompression_slope[7];

-+

-+} ia_pal_isp_lsc_1_1_t;

-+

-+/*! \isp struct lsc_1_2

-+Lens shading correction up to 24 bit

-+*/

-+typedef struct

-+{

-+    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

-+    int32_t cfa_type;

-+    /*!< lsclog2gridwidth log2 width of each subplane*/

-+    int32_t lsclog2gridwidth;

-+    /*!< lsclog2gridheight log2 height of each subplane*/

-+    int32_t lsclog2gridheight;

-+    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_col_start;

-+    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

-+    int32_t lsc_row_start;

-+    /*!< lsc_exp resolution modifier of the lsc tables*/

-+    int32_t lsc_exp;

-+    /*!< lsc_grid_tablec00[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec00[4096];

-+    /*!< lsc_grid_tablec01[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec01[4096];

-+    /*!< lsc_grid_tablec02[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec02[4096];

-+    /*!< lsc_grid_tablec03[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec03[4096];

-+    /*!< lsc_grid_tablec10[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec10[4096];

-+    /*!< lsc_grid_tablec11[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec11[4096];

-+    /*!< lsc_grid_tablec12[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec12[4096];

-+    /*!< lsc_grid_tablec13[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec13[4096];

-+    /*!< lsc_grid_tablec20[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec20[4096];

-+    /*!< lsc_grid_tablec21[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec21[4096];

-+    /*!< lsc_grid_tablec22[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec22[4096];

-+    /*!< lsc_grid_tablec23[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec23[4096];

-+    /*!< lsc_grid_tablec30[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec30[4096];

-+    /*!< lsc_grid_tablec31[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec31[4096];

-+    /*!< lsc_grid_tablec32[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec32[4096];

-+    /*!< lsc_grid_tablec33[4096] lsc grid table*/

-+    int32_t lsc_grid_tablec33[4096];

-+    /*!< lsc_table_width table width*/

-+    int32_t lsc_table_width;

-+    /*!< lsc_table_height table height*/

-+    int32_t lsc_table_height;

-+    /*!< bypass bypass for the filter*/

-+    int32_t bypass;

-+    /*!< enable_compand enable for the (de)companding*/

-+    int32_t enable_compand;

-+    /*!< cu_compression_x[13] U.24 linear, default log-limited*/

-+    int32_t cu_compression_x[13];

-+    /*!< cu_compression_y[12] U.15 companded output*/

-+    int32_t cu_compression_y[12];

-+    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/

-+    int32_t cu_compression_slope[12];

-+    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/

-+    int32_t cu_decompression_x[13];

-+    /*!< cu_decompression_y[12] U.24 linear*/

-+    int32_t cu_decompression_y[12];

-+    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/

-+    int32_t cu_decompression_slope[12];

-+    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/

-+    int32_t linear_pedestal;

-+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

-+    int32_t use_pedestal;

-+

-+} ia_pal_isp_lsc_1_2_t;

-+

-+/*! \isp struct ltm_cd_1_0

-+Local Tone Maping Coarse Detail Extruction

-+*/

-+typedef struct

-+{

-+    /*!< enable enabling the block. If enable == false, Output is zero*/

-+    int32_t enable;

-+    /*!< LTM_Power_8 Power gain for 1/8 band*/

-+    int32_t LTM_Power_8;

-+    /*!< LTM_Power_16 Power gain for 1/16 band*/

-+    int32_t LTM_Power_16;

-+    /*!< cu_thr8_x[15] threshold for variance - x values*/

-+    int32_t cu_thr8_x[15];

-+    /*!< cu_thr8_y[14] threshold for variance - y values*/

-+    int32_t cu_thr8_y[14];

-+    /*!< cu_thr8_slopes[14] threshold for variance - slopes values*/

-+    int32_t cu_thr8_slopes[14];

-+    /*!< cu_thr16_x[15] threshold for variance - x values*/

-+    int32_t cu_thr16_x[15];

-+    /*!< cu_thr16_y[14] threshold for variance - y values*/

-+    int32_t cu_thr16_y[14];

-+    /*!< cu_thr16_slopes[14] threshold for variance - slopes values*/

-+    int32_t cu_thr16_slopes[14];

-+    /*!< cu_sqrt_x[15] sqrt-x values*/

-+    int32_t cu_sqrt_x[15];

-+    /*!< cu_sqrt_y[14] sqrt-y values*/

-+    int32_t cu_sqrt_y[14];

-+    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/

-+    int32_t cu_sqrt_slopes[14];

-+    /*!< cu_gtm_x[15] gtm-x values*/

-+    int32_t cu_gtm_x[15];

-+    /*!< cu_gtm_y[14] gtm-y values*/

-+    int32_t cu_gtm_y[14];

-+    /*!< cu_gtm_slopes[14] gtm-slopes values*/

-+    int32_t cu_gtm_slopes[14];

-+    /*!< gradual_saturation_on enable gradual saturaion*/

-+    int32_t gradual_saturation_on;

-+    /*!< frame_width width of current frame*/

-+    int32_t frame_width;

-+    /*!< frame_height only for HW purposes*/

-+    int32_t frame_height;

-+    /*!< luma_correction_on enable luma correction*/

-+    int32_t luma_correction_on;

-+

-+} ia_pal_isp_ltm_cd_1_0_t;

-+

-+/*! \isp struct ltm_de_gamma_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable for the filter*/

-+    int32_t enable;

-+    /*!< enable_decomp enabling the tone mapping*/

-+    int32_t enable_decomp;

-+    /*!< enable_gtm enabling the tone mapping*/

-+    int32_t enable_gtm;

-+    /*!< enable_df enabling the ltm*/

-+    int32_t enable_df;

-+    /*!< enable_gamma enabling the gamma*/

-+    int32_t enable_gamma;

-+    /*!< gamma_lut_base_level[8] base level for gamma lut*/

-+    int32_t gamma_lut_base_level[8];

-+    /*!< gamma_lut_step[8] step for gamma lut*/

-+    int32_t gamma_lut_step[8];

-+    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/

-+    int32_t gamma_lut_start_bin[8];

-+    /*!< gamma_lut_size gamma lut size*/

-+    int32_t gamma_lut_size;

-+    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/

-+    int32_t gamma_lut_gen_lut[1537];

-+    /*!< tm_lut_base_level[7] base level for  tone mapping lut*/

-+    int32_t tm_lut_base_level[7];

-+    /*!< tm_lut_start_bin[7] start bin for  tone mapping lut*/

-+    int32_t tm_lut_start_bin[7];

-+    /*!< tm_lut_size tone mapping lut size*/

-+    int32_t tm_lut_size;

-+    /*!< tm_lut_step[7] step size for generalized LUT*/

-+    int32_t tm_lut_step[7];

-+    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut. The lut is with the fixed point format 9.10*/

-+    int32_t tm_lut_gen_lut[2049];

-+    /*!< gtm_gain_shift shift for gain*/

-+    int32_t gtm_gain_shift;

-+    /*!< cu_decompand_x[13] cu_decompand_x*/

-+    int32_t cu_decompand_x[13];

-+    /*!< cu_decompand_y[12] cu_decompand_y*/

-+    int32_t cu_decompand_y[12];

-+    /*!< cu_decompand_slopes[12] cu_decompand_slopes*/

-+    int32_t cu_decompand_slopes[12];

-+    /*!< linear_pedestal Pedestal subtracted in linear domain*/

-+    int32_t linear_pedestal;

-+    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

-+    int32_t use_pedestal;

-+

-+} ia_pal_isp_ltm_de_gamma_1_0_t;

-+

-+/*! \isp struct ltm_fd_1_0

-+Local Tone Maping Fine Detail Extruction

-+*/

-+typedef struct

-+{

-+    /*!< enable enabling the block. If enable == false, Output is zero*/

-+    int32_t enable;

-+    /*!< LTM_Power_4 Power gain for 1/4 band*/

-+    int32_t LTM_Power_4;

-+    /*!< LTM_Power_2 Power gain for 1/2 band*/

-+    int32_t LTM_Power_2;

-+    /*!< LTM_Power_1 Power gain for full band*/

-+    int32_t LTM_Power_1;

-+    /*!< cu_thr1_x[15] threshold for variance - x values*/

-+    int32_t cu_thr1_x[15];

-+    /*!< cu_thr1_y[14] threshold for variance - y values*/

-+    int32_t cu_thr1_y[14];

-+    /*!< cu_thr1_slopes[14] threshold for variance - slopes values*/

-+    int32_t cu_thr1_slopes[14];

-+    /*!< cu_thr2_x[15] threshold for variance - x values*/

-+    int32_t cu_thr2_x[15];

-+    /*!< cu_thr2_y[14] threshold for variance - y values*/

-+    int32_t cu_thr2_y[14];

-+    /*!< cu_thr2_slopes[14] threshold for variance - slopes values*/

-+    int32_t cu_thr2_slopes[14];

-+    /*!< cu_thr4_x[15] threshold for variance - x values*/

-+    int32_t cu_thr4_x[15];

-+    /*!< cu_thr4_y[14] threshold for variance - y values*/

-+    int32_t cu_thr4_y[14];

-+    /*!< cu_thr4_slopes[14] threshold for variance - slopes values*/

-+    int32_t cu_thr4_slopes[14];

-+    /*!< cu_sqrt_x[15] sqrt-x values*/

-+    int32_t cu_sqrt_x[15];

-+    /*!< cu_sqrt_y[14] sqrt-y values*/

-+    int32_t cu_sqrt_y[14];

-+    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/

-+    int32_t cu_sqrt_slopes[14];

-+    /*!< cu_gtm_x[15] gtm-x values*/

-+    int32_t cu_gtm_x[15];

-+    /*!< cu_gtm_y[14] gtm-y values*/

-+    int32_t cu_gtm_y[14];

-+    /*!< cu_gtm_slopes[14] gtm-slopes values*/

-+    int32_t cu_gtm_slopes[14];

-+    /*!< gradual_saturation_on enable gradual saturaion*/

-+    int32_t gradual_saturation_on;

-+    /*!< luma_correction_on enable luma correction*/

-+    int32_t luma_correction_on;

-+    /*!< cu_norm_x[15] norm-x values*/

-+    int32_t cu_norm_x[15];

-+    /*!< cu_norm_y[14] norm-y values*/

-+    int32_t cu_norm_y[14];

-+    /*!< cu_norm_slopes[14] norm-slopes values*/

-+    int32_t cu_norm_slopes[14];

-+    /*!< frame_height frame height - only for HW needs*/

-+    int32_t frame_height;

-+    /*!< frame_width frame width - only for HW needs*/

-+    int32_t frame_width;

-+

-+} ia_pal_isp_ltm_fd_1_0_t;

-+

-+/*! \isp struct ltm_vrt_ctrl

-+vertical controller for LTM complex

-+*/

-+typedef struct

-+{

-+    /*!< enable enabling the block. If enable == false, Output is zero*/

-+    int32_t enable;

-+    /*!< frame_height height of current frame*/

-+    int32_t frame_height;

-+    /*!< frame_width width of current frame*/

-+    int32_t frame_width;

-+

-+} ia_pal_isp_ltm_vrt_ctrl_t;

-+

-+/*! \isp struct mas

-+Motion artifact suppression ofr IMX185

-+*/

-+typedef struct

-+{

-+    /*!< gain_motion Threshold for MapMotion*/

-+    int32_t gain_motion;

-+    /*!< th_low_r Threshold for MapRange Rmin*/

-+    int32_t th_low_r;

-+    /*!< th_high_r Threshold for MapRange Gmax*/

-+    int32_t th_high_r;

-+    /*!< th_low_g Threshold for MapRange Gmin*/

-+    int32_t th_low_g;

-+    /*!< th_high_g Threshold for MapRange Gmax*/

-+    int32_t th_high_g;

-+    /*!< th_low_b Threshold for MapRange Bmin*/

-+    int32_t th_low_b;

-+    /*!< th_high_b Threshold for MapRange Bmax*/

-+    int32_t th_high_b;

-+    /*!< index_color Gain for MapColor*/

-+    int32_t index_color;

-+    /*!< offset_color Offset for MapColor*/

-+    int32_t offset_color;

-+    /*!< th_map Threshold for Map*/

-+    int32_t th_map;

-+    /*!< enable enable:1, bypass:0*/

-+    int32_t enable;

-+    /*!< frame_id first frame:0, second or after:1*/

-+    int32_t frame_id;

-+    /*!< flag_by Flag for color map. 0:magenta/green, 1:blue/yellow*/

-+    int32_t flag_by;

-+

-+} ia_pal_isp_mas_t;

-+

-+/*! \isp struct mrc_1_0

-+Motion refinement and compensation - standalone algorithm

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< reference_image_bittage bittage of reference input image*/

-+    int32_t reference_image_bittage;

-+    /*!< low_res_search_range_y low res search range - bottom*/

-+    int32_t low_res_search_range_y;

-+    /*!< low_res_search_range_x low res search range - left*/

-+    int32_t low_res_search_range_x;

-+    /*!< invalid_search_edge_y motion refinement range - bottom*/

-+    int32_t invalid_search_edge_y;

-+    /*!< invalid_search_edge_x motion refinement range - left*/

-+    int32_t invalid_search_edge_x;

-+    /*!< SAD_chroma_weight weight of chroma in SAD calculation*/

-+    int32_t SAD_chroma_weight;

-+    /*!< std_thr_flat confidenceSTD lower limit (dY below this value considered flat)*/

-+    int32_t std_thr_flat;

-+    /*!< std_thr_info confidenceSTD upper limit (dY above this value considered informative)*/

-+    int32_t std_thr_info;

-+    /*!< alpha_confidence bla bla*/

-+    int32_t alpha_confidence;

-+    /*!< center_motion_bias_LUT[18] bla bla*/

-+    int32_t center_motion_bias_LUT[18];

-+    /*!< neighbor_motion_bias_LUT[18] bla bla*/

-+    int32_t neighbor_motion_bias_LUT[18];

-+    /*!< full_res_center_bias_LUT[18] bla bla*/

-+    int32_t full_res_center_bias_LUT[18];

-+    /*!< full_res_neighbor_bias_LUT[18] bla bla*/

-+    int32_t full_res_neighbor_bias_LUT[18];

-+    /*!< motion_magnitude_low bla bla*/

-+    int32_t motion_magnitude_low;

-+    /*!< motion_magnitude_coeff bla bla*/

-+    int32_t motion_magnitude_coeff;

-+    /*!< motion_magnitude_platau bla bla*/

-+    int32_t motion_magnitude_platau;

-+    /*!< rad_sqr_prec_reduction Bit shift bumber to calculate index for nm_R_xcu*/

-+    int32_t rad_sqr_prec_reduction;

-+    /*!< ry_initial Opical center y coordinate in chroma resolution*/

-+    int32_t ry_initial;

-+    /*!< rx_initial Opical center x coordinate in chroma resolution*/

-+    int32_t rx_initial;

-+    /*!< nm_R_xcu[128] LUT for radial noise model*/

-+    int32_t nm_R_xcu[128];

-+    /*!< nm_Y_xcu[128] LUT for C noise model – Y dependency*/

-+    int32_t nm_Y_xcu[128];

-+    /*!< nm_C_xcu[128] LUT for C noise model – C dependency*/

-+    int32_t nm_C_xcu[128];

-+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

-+    int32_t nm_Y_log_est_min;

-+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

-+    int32_t nm_Y_log_est_max;

-+    /*!< nm_C_log_est_min Min value for log space C noise model*/

-+    int32_t nm_C_log_est_min;

-+    /*!< nm_C_log_est_max Max value for log space C noise model*/

-+    int32_t nm_C_log_est_max;

-+    /*!< nm_lut_frac Fractional bit for noise model LUT*/

-+    int32_t nm_lut_frac;

-+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

-+    int32_t nm_idx_frac;

-+    /*!< nm_pow[64] LUT for power function*/

-+    int32_t nm_pow[64];

-+    /*!< nm_pow_frac Fractional bit for POW LUT*/

-+    int32_t nm_pow_frac;

-+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

-+    int32_t nm_shift_num;

-+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

-+    int32_t nm_Y_alpha;

-+    /*!< nm_C_alpha Scaling coefficient for C noise model*/

-+    int32_t nm_C_alpha;

-+    /*!< co_var_thres Variance threshold*/

-+    int32_t co_var_thres;

-+    /*!< co_var_gain Variance gain*/

-+    int32_t co_var_gain;

-+    /*!< alignment_control Control alignement confidence*/

-+    int32_t alignment_control;

-+    /*!< alignment_confidence_control Control alignement confidence*/

-+    int32_t alignment_confidence_control;

-+    /*!< min_normed_sad minimal normed y sad value*/

-+    int32_t min_normed_sad;

-+    /*!< max_normed_sad maximal normed y sad value*/

-+    int32_t max_normed_sad;

-+    /*!< min_normed_sad_c minimal normed c sad value*/

-+    int32_t min_normed_sad_c;

-+    /*!< max_normed_sad_c maximal normed c sad value*/

-+    int32_t max_normed_sad_c;

-+    /*!< input_bpp bit reduction in feedback loop*/

-+    int32_t input_bpp;

-+    /*!< output_bpp bit reduction in feedback loop*/

-+    int32_t output_bpp;

-+

-+} ia_pal_isp_mrc_1_0_t;

-+

-+/*! \isp struct norm_lin_dss

-+

-+*/

-+typedef struct

-+{

-+    /*!< lut[257] Normalization lut*/

-+    int32_t lut[257];

-+    /*!< lin_en Linearization enable*/

-+    int32_t lin_en;

-+    /*!< lshift The size of normalized shift (signed)*/

-+    int32_t lshift;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+

-+} ia_pal_isp_norm_lin_dss_t;

-+

-+/*! \isp struct nrf_6_00

-+

-+*/

-+typedef struct

-+{

-+    /*!< Bypass iBypass*/

-+    int32_t Bypass;

-+    /*!< GNE_consistency_check iGNE consistency check*/

-+    int32_t GNE_consistency_check;

-+    /*!< GNE_luma_threshold_for_consistency_check iGNE luma threshold for consistency check*/

-+    int32_t GNE_luma_threshold_for_consistency_check;

-+    /*!< GNE_chroma_threshold_for_consistency_check iGNE chroma threshold for consistency check*/

-+    int32_t GNE_chroma_threshold_for_consistency_check;

-+    /*!< Block_Noise_Estimate_Edge_Threshold iBlock Noise Estimate Edge Threshold (u14)*/

-+    int32_t Block_Noise_Estimate_Edge_Threshold;

-+    /*!< Block_Noise_Estimate_Noise_Threshold iBlock Noise Estimate Noise Threshold (u14)*/

-+    int32_t Block_Noise_Estimate_Noise_Threshold;

-+    /*!< Eight_edge_Threshold iEight-edge Threshold (u16)*/

-+    int32_t Eight_edge_Threshold;

-+    /*!< Valid_Pixel_Range iValid Pixel Range (u12)*/

-+    int32_t Valid_Pixel_Range;

-+    /*!< Small_Sobel_Threshold iSmall Sobel Threshold (u14)*/

-+    int32_t Small_Sobel_Threshold;

-+    /*!< Large_Sobel_Threshold iLarge Sobel Threshold (u14)*/

-+    int32_t Large_Sobel_Threshold;

-+    /*!< Number_of_Large_Sobel_Threshold iNumber of Large Sobel Threshold (u6)*/

-+    int32_t Number_of_Large_Sobel_Threshold;

-+    /*!< Number_of_Mediam_Sobel_Threshold iNumber of Mediam Sobel Threshold (u6)*/

-+    int32_t Number_of_Mediam_Sobel_Threshold;

-+    /*!< Number_of_Small_Sobel_Threshold iNumber of Small Sobel Threshold (u6)*/

-+    int32_t Number_of_Small_Sobel_Threshold;

-+    /*!< Block_Sigma_Diff_Threshold iBlock Sigma Diff Threshold (u14)*/

-+    int32_t Block_Sigma_Diff_Threshold;

-+    /*!< Max_Sobel_Threshold iMax Sobel Threshold (u14)*/

-+    int32_t Max_Sobel_Threshold;

-+    /*!< Denoise_Maximum_History iDenoise Maximum History (u8)*/

-+    int32_t Denoise_Maximum_History;

-+    /*!< Denoise_History_Increase iDenoise History Increase (u4)*/

-+    int32_t Denoise_History_Increase;

-+    /*!< Denoise_Moving_Pixel_Threshold iDenoise Moving Pixel Threshold (u5)*/

-+    int32_t Denoise_Moving_Pixel_Threshold;

-+    /*!< Denoise_Threshold_for_Sum_of_Complexity_Measure iDenoise Threshold for Sum of Complexity Measure (u12)*/

-+    int32_t Denoise_Threshold_for_Sum_of_Complexity_Measure;

-+    /*!< Denoise_ASD_Threshold iDenoise ASD Threshold (u12)*/

-+    int32_t Denoise_ASD_Threshold;

-+    /*!< Progressive_DN iProgressive DN (0, 1)*/

-+    int32_t Progressive_DN;

-+    /*!< Initial_Denoise_History iInitial Denoise History (u6)*/

-+    int32_t Initial_Denoise_History;

-+    /*!< Denoise_STAD_Threshold iDenoise STAD Threshold (u15)*/

-+    int32_t Denoise_STAD_Threshold;

-+    /*!< Temporal_Difference_Threshold iTemporal Difference Threshold (u12)*/

-+    int32_t Temporal_Difference_Threshold;

-+    /*!< Low_Temporal_Difference_Threshold iLow Temporal Difference Threshold (u12)*/

-+    int32_t Low_Temporal_Difference_Threshold;

-+    /*!< Chroma_Denoise_Enable iChroma Denoise Enable*/

-+    int32_t Chroma_Denoise_Enable;

-+    /*!< Chroma_Denoise_Moving_Pixel_Threshold iChroma Denoise Moving Pixel Threshold (u5)*/

-+    int32_t Chroma_Denoise_Moving_Pixel_Threshold;

-+    /*!< Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure iChroma Denoise Threshold for Sum of Complexity Measure (u12)*/

-+    int32_t Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure;

-+    /*!< Chroma_Denoise_ASD_Threshold iChroma Denoise ASD Threshold (u12)*/

-+    int32_t Chroma_Denoise_ASD_Threshold;

-+    /*!< Chroma_Denoise_Temporal_Difference_Threshold iChroma Denoise Temporal Difference Threshold (u12)*/

-+    int32_t Chroma_Denoise_Temporal_Difference_Threshold;

-+    /*!< Chroma_Low_Temporal_Difference_Threshold iChroma Low Temporal Difference Threshold (u12)*/

-+    int32_t Chroma_Low_Temporal_Difference_Threshold;

-+    /*!< Chroma_Denoise_STAD_Threshold iChroma Denoise STAD Threshold (u15)*/

-+    int32_t Chroma_Denoise_STAD_Threshold;

-+    /*!< Low_Noise_Level iLow Noise Level*/

-+    int32_t Low_Noise_Level;

-+    /*!< Strong_Noise_Level iStrong Noise Level*/

-+    int32_t Strong_Noise_Level;

-+    /*!< DnY_prt0 iDnY_prt0 (RangeThreshold 0, u13)*/

-+    int32_t DnY_prt0;

-+    /*!< DnY_prt1 iDnY_prt1 (RangeThreshold 1, u13)*/

-+    int32_t DnY_prt1;

-+    /*!< DnY_prt2 iDnY_prt2 (RangeThreshold 2, u13)*/

-+    int32_t DnY_prt2;

-+    /*!< DnY_prt3 iDnY_prt3 (RangeThreshold 3, u13)*/

-+    int32_t DnY_prt3;

-+    /*!< DnY_prt4 iDnY_prt4 (RangeThreshold 4, u13)*/

-+    int32_t DnY_prt4;

-+    /*!< DnY_prt5 iDnY_prt5 (RangeThreshold 5, u13)*/

-+    int32_t DnY_prt5;

-+    /*!< DnY_Wr0 iDnY_Wr0 (RangeWgt0, u5)*/

-+    int32_t DnY_Wr0;

-+    /*!< DnY_Wr1 iDnY_Wr1 (RangeWgt1, u5)*/

-+    int32_t DnY_Wr1;

-+    /*!< DnY_Wr2 iDnY_Wr2 (RangeWgt2, u5)*/

-+    int32_t DnY_Wr2;

-+    /*!< DnY_Wr3 iDnY_Wr3 (RangeWgt3, u5)*/

-+    int32_t DnY_Wr3;

-+    /*!< DnY_Wr4 iDnY_Wr4 (RangeWgt4, u5)*/

-+    int32_t DnY_Wr4;

-+    /*!< DnY_Wr5 iDnY_Wr5 (RangeWgt5, u5)*/

-+    int32_t DnY_Wr5;

-+    /*!< DnY_wd00 iDnY_wd00 (DistWeight[0][0], u5)*/

-+    int32_t DnY_wd00;

-+    /*!< DnY_wd01 iDnY_wd01 (DistWeight[0][1], u5)*/

-+    int32_t DnY_wd01;

-+    /*!< DnY_wd02 iDnY_wd02 (DistWeight[0][2], u5)*/

-+    int32_t DnY_wd02;

-+    /*!< DnY_wd10 iDnY_wd10 (DistWeight[1][0], u5)*/

-+    int32_t DnY_wd10;

-+    /*!< DnY_wd11 iDnY_wd11 (DistWeight[1][1], u5)*/

-+    int32_t DnY_wd11;

-+    /*!< DnY_wd12 iDnY_wd12 (DistWeight[1][2], u5)*/

-+    int32_t DnY_wd12;

-+    /*!< DnY_wd20 iDnY_wd20 (DistWeight[2][0], u5)*/

-+    int32_t DnY_wd20;

-+    /*!< DnY_wd21 iDnY_wd21 (DistWeight[2][1], u5)*/

-+    int32_t DnY_wd21;

-+    /*!< DnY_wd22 iDnY_wd22 (DistWeight[2][2], u5)*/

-+    int32_t DnY_wd22;

-+    /*!< DnY_dyn_thmin iDnY_dyn_thmin (Min Dynamic Threshold, u13)*/

-+    int32_t DnY_dyn_thmin;

-+    /*!< DnY_thmin iDnY_thmin (Min Threshold Value for luma, u13)*/

-+    int32_t DnY_thmin;

-+    /*!< DnY_thmax iDnY_thmax (Max Threshold Value for luma, u13)*/

-+    int32_t DnY_thmax;

-+    /*!< DnU_prt0 iDnU_prt0 (U RangeThreshold 0, u13)*/

-+    int32_t DnU_prt0;

-+    /*!< DnU_prt1 iDnU_prt1 (U RangeThreshold 1, u13)*/

-+    int32_t DnU_prt1;

-+    /*!< DnU_prt2 iDnU_prt2 (U RangeThreshold 2, u13)*/

-+    int32_t DnU_prt2;

-+    /*!< DnU_prt3 iDnU_prt3 (U RangeThreshold 3, u13)*/

-+    int32_t DnU_prt3;

-+    /*!< DnU_prt4 iDnU_prt4 (U RangeThreshold 4, u13)*/

-+    int32_t DnU_prt4;

-+    /*!< DnU_prt5 iDnU_prt5 (U RangeThreshold 5, u13)*/

-+    int32_t DnU_prt5;

-+    /*!< DnU_Wr0 iDnU_Wr0 (U RangeWgt0, u5)*/

-+    int32_t DnU_Wr0;

-+    /*!< DnU_Wr1 iDnU_Wr1 (U RangeWgt1, u5)*/

-+    int32_t DnU_Wr1;

-+    /*!< DnU_Wr2 iDnU_Wr2 (U RangeWgt2, u5)*/

-+    int32_t DnU_Wr2;

-+    /*!< DnU_Wr3 iDnU_Wr3 (U RangeWgt3, u5)*/

-+    int32_t DnU_Wr3;

-+    /*!< DnU_Wr4 iDnU_Wr4 (U RangeWgt4, u5)*/

-+    int32_t DnU_Wr4;

-+    /*!< DnU_Wr5 iDnU_Wr5 (U RangeWgt5, u5)*/

-+    int32_t DnU_Wr5;

-+    /*!< DnU_wd00 iDnU_wd00 (U DistWeight[0][0], u5)*/

-+    int32_t DnU_wd00;

-+    /*!< DnU_wd01 iDnU_wd01 (U DistWeight[0][1], u5)*/

-+    int32_t DnU_wd01;

-+    /*!< DnU_wd02 iDnU_wd02 (U DistWeight[0][2], u5)*/

-+    int32_t DnU_wd02;

-+    /*!< DnU_wd10 iDnU_wd10 (U DistWeight[1][0], u5)*/

-+    int32_t DnU_wd10;

-+    /*!< DnU_wd11 iDnU_wd11 (U DistWeight[1][1], u5)*/

-+    int32_t DnU_wd11;

-+    /*!< DnU_wd12 iDnU_wd12 (U DistWeight[1][2], u5)*/

-+    int32_t DnU_wd12;

-+    /*!< DnU_wd20 iDnU_wd20 (U DistWeight[2][0], u5)*/

-+    int32_t DnU_wd20;

-+    /*!< DnU_wd21 iDnU_wd21 (U DistWeight[2][1], u5)*/

-+    int32_t DnU_wd21;

-+    /*!< DnU_wd22 iDnU_wd22 (U DistWeight[2][2], u5)*/

-+    int32_t DnU_wd22;

-+    /*!< DnU_dyn_thmin iDnU_dyn_thmin (U Min Dynamic Threshold, u13)*/

-+    int32_t DnU_dyn_thmin;

-+    /*!< DnU_thmin iDnU_thmin (Min Threshold Value for U, u13)*/

-+    int32_t DnU_thmin;

-+    /*!< DnU_thmax iDnU_thmax (Max Threshold Value for U, u13)*/

-+    int32_t DnU_thmax;

-+    /*!< DnV_prt0 iDnV_prt0 (V RangeThreshold 0, u13)*/

-+    int32_t DnV_prt0;

-+    /*!< DnV_prt1 iDnV_prt1 (V RangeThreshold 1, u13)*/

-+    int32_t DnV_prt1;

-+    /*!< DnV_prt2 iDnV_prt2 (V RangeThreshold 2, u13)*/

-+    int32_t DnV_prt2;

-+    /*!< DnV_prt3 iDnV_prt3 (V RangeThreshold 3, u13)*/

-+    int32_t DnV_prt3;

-+    /*!< DnV_prt4 iDnV_prt4 (V RangeThreshold 4, u13)*/

-+    int32_t DnV_prt4;

-+    /*!< DnV_prt5 iDnV_prt5 (V RangeThreshold 5, u13)*/

-+    int32_t DnV_prt5;

-+    /*!< DnV_Wr0 iDnV_Wr0 (V RangeWgt0, u5)*/

-+    int32_t DnV_Wr0;

-+    /*!< DnV_Wr1 iDnV_Wr1 (V RangeWgt1, u5)*/

-+    int32_t DnV_Wr1;

-+    /*!< DnV_Wr2 iDnV_Wr2 (V RangeWgt2, u5)*/

-+    int32_t DnV_Wr2;

-+    /*!< DnV_Wr3 iDnV_Wr3 (V RangeWgt3, u5)*/

-+    int32_t DnV_Wr3;

-+    /*!< DnV_Wr4 iDnV_Wr4 (V RangeWgt4, u5)*/

-+    int32_t DnV_Wr4;

-+    /*!< DnV_Wr5 iDnV_Wr5 (V RangeWgt5, u5)*/

-+    int32_t DnV_Wr5;

-+    /*!< DnV_wd00 iDnV_wd00 (V DistWeight[0][0], u5)*/

-+    int32_t DnV_wd00;

-+    /*!< DnV_wd01 iDnV_wd01 (V DistWeight[0][1], u5)*/

-+    int32_t DnV_wd01;

-+    /*!< DnV_wd02 iDnV_wd02 (V DistWeight[0][2], u5)*/

-+    int32_t DnV_wd02;

-+    /*!< DnV_wd10 iDnV_wd10 (V DistWeight[1][0], u5)*/

-+    int32_t DnV_wd10;

-+    /*!< DnV_wd11 iDnV_wd11 (V DistWeight[1][1], u5)*/

-+    int32_t DnV_wd11;

-+    /*!< DnV_wd12 iDnV_wd12 (V DistWeight[1][2], u5)*/

-+    int32_t DnV_wd12;

-+    /*!< DnV_wd20 iDnV_wd20 (V DistWeight[2][0], u5)*/

-+    int32_t DnV_wd20;

-+    /*!< DnV_wd21 iDnV_wd21 (V DistWeight[2][1], u5)*/

-+    int32_t DnV_wd21;

-+    /*!< DnV_wd22 iDnV_wd22 (V DistWeight[2][2], u5)*/

-+    int32_t DnV_wd22;

-+    /*!< DnV_dyn_thmin iDnV_dyn_thmin (V Min Dynamic Threshold, u13)*/

-+    int32_t DnV_dyn_thmin;

-+    /*!< DnV_thmin iDnV_thmin (Min Threshold Value for V, u13)*/

-+    int32_t DnV_thmin;

-+    /*!< DnV_thmax iDnV_thmax (Max Threshold Value for V, u13)*/

-+    int32_t DnV_thmax;

-+    /*!< Y_RangeThr_Adp2NLvl iY RangeThr Adp2NLvl {0/1}*/

-+    int32_t Y_RangeThr_Adp2NLvl;

-+    /*!< Y_RangeThr_Adp2NLvl_Min iY RangeThr Adp2NLvl Min*/

-+    int32_t Y_RangeThr_Adp2NLvl_Min;

-+    /*!< Y_RangeThr_Adp2NLvl_Max iY RangeThr Adp2NLvl Max*/

-+    int32_t Y_RangeThr_Adp2NLvl_Max;

-+    /*!< Y_RangeThrNLvlMaxIncr0 iY RangeThrNLvlMaxIncr0*/

-+    int32_t Y_RangeThrNLvlMaxIncr0;

-+    /*!< Y_RangeThrNLvlMaxIncr1 iY RangeThrNLvlMaxIncr1*/

-+    int32_t Y_RangeThrNLvlMaxIncr1;

-+    /*!< Y_RangeThrNLvlMaxIncr2 iY RangeThrNLvlMaxIncr2*/

-+    int32_t Y_RangeThrNLvlMaxIncr2;

-+    /*!< Y_RangeThrNLvlMaxIncr3 iY RangeThrNLvlMaxIncr3*/

-+    int32_t Y_RangeThrNLvlMaxIncr3;

-+    /*!< Y_RangeThrNLvlMaxIncr4 iY RangeThrNLvlMaxIncr4*/

-+    int32_t Y_RangeThrNLvlMaxIncr4;

-+    /*!< Y_RangeThrNLvlMaxIncr5 iY RangeThrNLvlMaxIncr5*/

-+    int32_t Y_RangeThrNLvlMaxIncr5;

-+    /*!< U_RangeThr_Adp2NLvl iU RangeThr Adp2NLvl {0/1}*/

-+    int32_t U_RangeThr_Adp2NLvl;

-+    /*!< U_RangeThr_Adp2NLvl_Min iU RangeThr Adp2NLvl Min*/

-+    int32_t U_RangeThr_Adp2NLvl_Min;

-+    /*!< U_RangeThr_Adp2NLvl_Max iU RangeThr Adp2NLvl Max*/

-+    int32_t U_RangeThr_Adp2NLvl_Max;

-+    /*!< U_RangeThrNLvlMaxIncr0 iU RangeThrNLvlMaxIncr0*/

-+    int32_t U_RangeThrNLvlMaxIncr0;

-+    /*!< U_RangeThrNLvlMaxIncr1 iU RangeThrNLvlMaxIncr1*/

-+    int32_t U_RangeThrNLvlMaxIncr1;

-+    /*!< U_RangeThrNLvlMaxIncr2 iU RangeThrNLvlMaxIncr2*/

-+    int32_t U_RangeThrNLvlMaxIncr2;

-+    /*!< U_RangeThrNLvlMaxIncr3 iU RangeThrNLvlMaxIncr3*/

-+    int32_t U_RangeThrNLvlMaxIncr3;

-+    /*!< U_RangeThrNLvlMaxIncr4 iU RangeThrNLvlMaxIncr4*/

-+    int32_t U_RangeThrNLvlMaxIncr4;

-+    /*!< U_RangeThrNLvlMaxIncr5 iU RangeThrNLvlMaxIncr5*/

-+    int32_t U_RangeThrNLvlMaxIncr5;

-+    /*!< V_RangeThr_Adp2NLvl iV RangeThr Adp2NLvl {0/1}*/

-+    int32_t V_RangeThr_Adp2NLvl;

-+    /*!< V_RangeThr_Adp2NLvl_Min iV RangeThr Adp2NLvl Min*/

-+    int32_t V_RangeThr_Adp2NLvl_Min;

-+    /*!< V_RangeThr_Adp2NLvl_Max iV RangeThr Adp2NLvl Max*/

-+    int32_t V_RangeThr_Adp2NLvl_Max;

-+    /*!< V_RangeThrNLvlMaxIncr0 iV RangeThrNLvlMaxIncr0*/

-+    int32_t V_RangeThrNLvlMaxIncr0;

-+    /*!< V_RangeThrNLvlMaxIncr1 iV RangeThrNLvlMaxIncr1*/

-+    int32_t V_RangeThrNLvlMaxIncr1;

-+    /*!< V_RangeThrNLvlMaxIncr2 iV RangeThrNLvlMaxIncr2*/

-+    int32_t V_RangeThrNLvlMaxIncr2;

-+    /*!< V_RangeThrNLvlMaxIncr3 iV RangeThrNLvlMaxIncr3*/

-+    int32_t V_RangeThrNLvlMaxIncr3;

-+    /*!< V_RangeThrNLvlMaxIncr4 iV RangeThrNLvlMaxIncr4*/

-+    int32_t V_RangeThrNLvlMaxIncr4;

-+    /*!< V_RangeThrNLvlMaxIncr5 iV RangeThrNLvlMaxIncr5*/

-+    int32_t V_RangeThrNLvlMaxIncr5;

-+    /*!< Hot_Pixel_Enable iHot Pixel Enable (0,1)*/

-+    int32_t Hot_Pixel_Enable;

-+    /*!< Hot_Pixel_Y_Threshold iHot Pixel Y Threshold (u8)*/

-+    int32_t Hot_Pixel_Y_Threshold;

-+    /*!< Hot_Pixel_Y_Count iHot Pixel Y Count (u4)*/

-+    int32_t Hot_Pixel_Y_Count;

-+    /*!< Hot_Pixel_U_Threshold iHot Pixel U Threshold (u8)*/

-+    int32_t Hot_Pixel_U_Threshold;

-+    /*!< Hot_Pixel_U_Count iHot Pixel U Count (u4)*/

-+    int32_t Hot_Pixel_U_Count;

-+    /*!< Hot_Pixel_V_Threshold iHot Pixel V Threshold (u8)*/

-+    int32_t Hot_Pixel_V_Threshold;

-+    /*!< Hot_Pixel_V_Count iHot Pixel V Count (u4)*/

-+    int32_t Hot_Pixel_V_Count;

-+    /*!< Validation_mode iValidation mode*/

-+    int32_t Validation_mode;

-+    /*!< Block_Width iBlock Width*/

-+    int32_t Block_Width;

-+    /*!< Block_Height iBlock Height*/

-+    int32_t Block_Height;

-+    /*!< Block_Size iBlock Size*/

-+    int32_t Block_Size;

-+    /*!< Chroma_Denoise_Block_Size_H iChroma Denoise Block Size H*/

-+    int32_t Chroma_Denoise_Block_Size_H;

-+    /*!< Chroma_Denoise_Block_Size_V iChroma Denoise Block Size V*/

-+    int32_t Chroma_Denoise_Block_Size_V;

-+    /*!< Bayer_input_for_capture_pipe iBayer input for capture pipe*/

-+    int32_t Bayer_input_for_capture_pipe;

-+    /*!< RGB_input iRGB input*/

-+    int32_t RGB_input;

-+    /*!< Right_Edge iRight Edge*/

-+    int32_t Right_Edge;

-+    /*!< Left_Edge iLeft Edge*/

-+    int32_t Left_Edge;

-+    /*!< PADDING_X_MARGIN_LEFT iPADDING X_MARGIN_LEFT*/

-+    int32_t PADDING_X_MARGIN_LEFT;

-+    /*!< PADDING_X_MARGIN_RIGHT iPADDING X_MARGIN_RIGHT*/

-+    int32_t PADDING_X_MARGIN_RIGHT;

-+    /*!< PADDING_Y_MARGIN_TOP iPADDING Y_MARGIN_TOP*/

-+    int32_t PADDING_Y_MARGIN_TOP;

-+    /*!< PADDING_Y_MARGIN_BOTTOM iPADDING Y_MARGIN_BOTTOM*/

-+    int32_t PADDING_Y_MARGIN_BOTTOM;

-+    /*!< Bayer_Partial_Column_Padding iBayer Partial Column Padding*/

-+    int32_t Bayer_Partial_Column_Padding;

-+    /*!< Bayer_Partial_Row_Padding iBayer Partial Row Padding*/

-+    int32_t Bayer_Partial_Row_Padding;

-+    /*!< Enable_CUI_Manual_Bar iEnable CUI Manual Bar*/

-+    int32_t Enable_CUI_Manual_Bar;

-+    /*!< CUI_Strength_Value iCUI Strength Value[0 - 64]*/

-+    int32_t CUI_Strength_Value;

-+    /*!< Monochrome_Support_Force_Zero_UV_OUTPUT iMonochrome Support : Force Zero UV OUTPUT*/

-+    int32_t Monochrome_Support_Force_Zero_UV_OUTPUT;

-+    /*!< Only_enable_spatial_denoise iOnly enable spatial denoise*/

-+    int32_t Only_enable_spatial_denoise;

-+    /*!< Treat_frame_as_first_frame_for_still_image_sequence iTreat frame as first frame for still image sequence*/

-+    int32_t Treat_frame_as_first_frame_for_still_image_sequence;

-+    /*!< Fulsim_Output_Bit_Precision iFulsim Output Bit Precision*/

-+    int32_t Fulsim_Output_Bit_Precision;

-+

-+} ia_pal_isp_nrf_6_00_t;

-+

-+/*! \isp struct nv12reader

-+

-+*/

-+typedef struct

-+{

-+    /*!< im_width input image width*/

-+    int32_t im_width;

-+    /*!< im_height input image height*/

-+    int32_t im_height;

-+    /*!< input_bpp input image bpp*/

-+    int32_t input_bpp;

-+    /*!< output_bpp output image bpp*/

-+    int32_t output_bpp;

-+    /*!< input_pixel_container input pixel container (in bits)*/

-+    int32_t input_pixel_container;

-+

-+} ia_pal_isp_nv12reader_t;

-+

-+/*! \isp struct nv12writer

-+

-+*/

-+typedef struct

-+{

-+    /*!< output_bpp output image bpp*/

-+    int32_t output_bpp;

-+    /*!< input_pixel_container input pixel container (in bits)*/

-+    int32_t input_pixel_container;

-+

-+} ia_pal_isp_nv12writer_t;

-+

-+/*! \isp struct ofa_1_dp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_dp;

-+    /*!< pack_mode_dp pack mode for packer*/

-+    int32_t pack_mode_dp;

-+    /*!< enable_flip_dp bypass flip*/

-+    int32_t enable_flip_dp;

-+    /*!< enable_mirror_dp bypass mirror*/

-+    int32_t enable_mirror_dp;

-+    /*!< enable_reduced_range_dp bypass reduced range*/

-+    int32_t enable_reduced_range_dp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_dp display pin is active*/

-+    int32_t enable_dp;

-+

-+} ia_pal_isp_ofa_1_dp_t;

-+

-+/*! \isp struct ofa_1_mp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_mp;

-+    /*!< pack_mode_mp pack mode for packer*/

-+    int32_t pack_mode_mp;

-+    /*!< enable_flip_mp bypass flip*/

-+    int32_t enable_flip_mp;

-+    /*!< enable_mirror_mp bypass mirror*/

-+    int32_t enable_mirror_mp;

-+    /*!< enable_reduced_range_mp bypass reduced range*/

-+    int32_t enable_reduced_range_mp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_mp main pin is active*/

-+    int32_t enable_mp;

-+

-+} ia_pal_isp_ofa_1_mp_t;

-+

-+/*! \isp struct ofa_1_ppp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_ppp;

-+    /*!< pack_mode_ppp pack mode for packer*/

-+    int32_t pack_mode_ppp;

-+    /*!< enable_flip_ppp bypass flip*/

-+    int32_t enable_flip_ppp;

-+    /*!< enable_mirror_ppp bypass mirror*/

-+    int32_t enable_mirror_ppp;

-+    /*!< enable_reduced_range_ppp bypass reduced range*/

-+    int32_t enable_reduced_range_ppp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_ppp post proc. Pin is active*/

-+    int32_t enable_ppp;

-+

-+} ia_pal_isp_ofa_1_ppp_t;

-+

-+/*! \isp struct ofa_2_dp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_dp;

-+    /*!< input_bpp_dp input bpp parameter for OFA*/

-+    int32_t input_bpp_dp;

-+    /*!< pack_mode_dp pack mode for packer*/

-+    int32_t pack_mode_dp;

-+    /*!< enable_flip_dp bypass flip*/

-+    int32_t enable_flip_dp;

-+    /*!< enable_mirror_dp bypass mirror*/

-+    int32_t enable_mirror_dp;

-+    /*!< enable_reduced_range_dp bypass reduced range*/

-+    int32_t enable_reduced_range_dp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_dp display pin is active*/

-+    int32_t enable_dp;

-+    /*!< input_left_crop_pixels_dp left pixels to crop*/

-+    int32_t input_left_crop_pixels_dp;

-+    /*!< input_top_crop_pixels_dp top pixels to crop*/

-+    int32_t input_top_crop_pixels_dp;

-+    /*!< output_height_dp output height after padding*/

-+    int32_t output_height_dp;

-+    /*!< output_width_dp output width after padding*/

-+    int32_t output_width_dp;

-+

-+} ia_pal_isp_ofa_2_dp_t;

-+

-+/*! \isp struct ofa_2_mp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_mp;

-+    /*!< input_bpp_mp input bpp parameter for OFA*/

-+    int32_t input_bpp_mp;

-+    /*!< pack_mode_mp pack mode for packer*/

-+    int32_t pack_mode_mp;

-+    /*!< enable_flip_mp bypass flip*/

-+    int32_t enable_flip_mp;

-+    /*!< enable_mirror_mp bypass mirror*/

-+    int32_t enable_mirror_mp;

-+    /*!< enable_reduced_range_mp bypass reduced range*/

-+    int32_t enable_reduced_range_mp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_mp main pin is active*/

-+    int32_t enable_mp;

-+    /*!< input_left_crop_pixels_mp left pixels to crop*/

-+    int32_t input_left_crop_pixels_mp;

-+    /*!< input_top_crop_pixels_mp top pixels to crop*/

-+    int32_t input_top_crop_pixels_mp;

-+    /*!< output_height_mp output height after padding*/

-+    int32_t output_height_mp;

-+    /*!< output_width_mp output width after padding*/

-+    int32_t output_width_mp;

-+

-+} ia_pal_isp_ofa_2_mp_t;

-+

-+/*! \isp struct ofa_2_ppp

-+Output Fornatting Accelerator

-+*/

-+typedef struct

-+{

-+    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/

-+    int32_t y_tiling_ppp;

-+    /*!< input_bpp_ppp input bpp parameter for OFA*/

-+    int32_t input_bpp_ppp;

-+    /*!< pack_mode_ppp pack mode for packer*/

-+    int32_t pack_mode_ppp;

-+    /*!< enable_flip_ppp bypass flip*/

-+    int32_t enable_flip_ppp;

-+    /*!< enable_mirror_ppp bypass mirror*/

-+    int32_t enable_mirror_ppp;

-+    /*!< enable_reduced_range_ppp bypass reduced range*/

-+    int32_t enable_reduced_range_ppp;

-+    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_0;

-+    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

-+    int32_t p_e_1;

-+    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_0;

-+    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

-+    int32_t p_o_1;

-+    /*!< enable_ppp post proc. Pin is active*/

-+    int32_t enable_ppp;

-+    /*!< input_left_crop_pixels_ppp left pixels to crop*/

-+    int32_t input_left_crop_pixels_ppp;

-+    /*!< input_top_crop_pixels_ppp top pixels to crop*/

-+    int32_t input_top_crop_pixels_ppp;

-+    /*!< output_height_pp output height after padding*/

-+    int32_t output_height_pp;

-+    /*!< output_width_pp output width after padding*/

-+    int32_t output_width_pp;

-+

-+} ia_pal_isp_ofa_2_ppp_t;

-+

-+/*! \isp struct outputscaler_2_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable scaling filter*/

-+    int32_t enable;

-+    /*!< scaling_ratio U5.16 , downscale - greater than 1*/

-+    int32_t scaling_ratio;

-+    /*!< horizontal_offset_luma S13.16,Position of first output pixel luma channel for scaler*/

-+    int32_t horizontal_offset_luma;

-+    /*!< vertical_offset_luma S13.16, Position of first output line luma channel for scaler*/

-+    int32_t vertical_offset_luma;

-+    /*!< horizontal_offset_chroma S13.16, Position of first output pixel chroma channel for scaler*/

-+    int32_t horizontal_offset_chroma;

-+    /*!< vertical_offset_chroma S13.16, Position of first output line chroma channel for scaler*/

-+    int32_t vertical_offset_chroma;

-+    /*!< output_height U13.0, Height of output image Y plane for scaler (even)*/

-+    int32_t output_height;

-+    /*!< output_width U13.0, Width of output image Y plane for scaler (even)*/

-+    int32_t output_width;

-+    /*!< kernel_LUT[129] S1.10 Y channel Interpolation vertical kernel coefficients for scaler*/

-+    int32_t kernel_LUT[129];

-+    /*!< chroma_kernel_LUT[129] S1.10 UV channel Interpolation vertical kernel coefficients for scaler*/

-+    int32_t chroma_kernel_LUT[129];

-+

-+} ia_pal_isp_outputscaler_2_0_t;

-+

-+/*! \isp struct packer_isa_bayer_a

-+Bayer Planar output formatter

-+*/

-+typedef struct

-+{

-+    /*!< format Output format: 0 - Bayer planar, 1 - Bayer packed*/

-+    int32_t format;

-+

-+} ia_pal_isp_packer_isa_bayer_a_t;

-+

-+/*! \isp struct packer_isa_yuv_a

-+NV12 output formatter

-+*/

-+typedef struct

-+{

-+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

-+    int32_t format;

-+

-+} ia_pal_isp_packer_isa_yuv_a_t;

-+

-+/*! \isp struct packer_isa_yuv_b

-+NV12 output formatter

-+*/

-+typedef struct

-+{

-+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

-+    int32_t format;

-+

-+} ia_pal_isp_packer_isa_yuv_b_t;

-+

-+/*! \isp struct packer_isa_yuv_c

-+NV12 output formatter

-+*/

-+typedef struct

-+{

-+    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

-+    int32_t format;

-+

-+} ia_pal_isp_packer_isa_yuv_c_t;

-+

-+/*! \isp struct padder_bayer_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< Padder_en 0- disable filter. 1- enable filter.*/

-+    int32_t Padder_en;

-+    /*!< sol_pad Left side padding quad number.*/

-+    int32_t sol_pad;

-+    /*!< eol_pad Right side padding quad number.*/

-+    int32_t eol_pad;

-+    /*!< Frame_width The width of the frame in number of quads.*/

-+    int32_t Frame_width;

-+    /*!< Strm_format 0- YUV. 1- Bayer.*/

-+    int32_t Strm_format;

-+

-+} ia_pal_isp_padder_bayer_a_t;

-+

-+/*! \isp struct padder_yuv_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< Padder_en 0- disable filter. 1- enable filter.*/

-+    int32_t Padder_en;

-+    /*!< sol_pad Left side padding quad number.*/

-+    int32_t sol_pad;

-+    /*!< eol_pad Right side padding quad number.*/

-+    int32_t eol_pad;

-+    /*!< Frame_width The width of the frame in number of quads.*/

-+    int32_t Frame_width;

-+    /*!< Strm_format 0- YUV. 1- Bayer.*/

-+    int32_t Strm_format;

-+

-+} ia_pal_isp_padder_yuv_a_t;

-+

-+/*! \isp struct padder_yuv_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< Padder_en 0- disable filter. 1- enable filter.*/

-+    int32_t Padder_en;

-+    /*!< sol_pad Left side padding quad number.*/

-+    int32_t sol_pad;

-+    /*!< eol_pad Right side padding quad number.*/

-+    int32_t eol_pad;

-+    /*!< Frame_width The width of the frame in number of quads.*/

-+    int32_t Frame_width;

-+    /*!< Strm_format 0- YUV. 1- Bayer.*/

-+    int32_t Strm_format;

-+

-+} ia_pal_isp_padder_yuv_b_t;

-+

-+/*! \isp struct padder_yuv_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< Padder_en 0- disable filter. 1- enable filter.*/

-+    int32_t Padder_en;

-+    /*!< sol_pad Left side padding quad number.*/

-+    int32_t sol_pad;

-+    /*!< eol_pad Right side padding quad number.*/

-+    int32_t eol_pad;

-+    /*!< Frame_width The width of the frame in number of quads.*/

-+    int32_t Frame_width;

-+    /*!< Strm_format 0- YUV. 1- Bayer.*/

-+    int32_t Strm_format;

-+

-+} ia_pal_isp_padder_yuv_c_t;

-+

-+/*! \isp struct pafstatistics_1

-+PAF Statistics

-+*/

-+typedef struct

-+{

-+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

-+    int32_t paf_en;

-+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

-+    int32_t paf_frame_width;

-+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

-+    int32_t paf_frame_height;

-+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

-+    int32_t skip_horizontal_start;

-+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

-+    int32_t skip_vertical_start;

-+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

-+    int32_t block_width;

-+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

-+    int32_t block_height;

-+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

-+    int32_t accum_horizontal;

-+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

-+    int32_t skip_horizontal;

-+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

-+    int32_t accum_vertical;

-+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

-+    int32_t skip_vertical;

-+    /*!< min_shift minimum evaluation shift in steps*/

-+    int32_t min_shift;

-+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

-+    int32_t shift_steps;

-+    /*!< paf_shift_step_size phase evaluation step size in pixels*/

-+    int32_t paf_shift_step_size;

-+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

-+    int32_t paf_shifter;

-+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

-+    int32_t split_accross_multiple_lines;

-+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

-+    int32_t pixels_per_line;

-+    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/

-+    int32_t input_modes;

-+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

-+    int32_t input_bpp;

-+    /*!< int_prec internal precision of PAF pixels*/

-+    int32_t int_prec;

-+    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/

-+    int32_t paf_blacklevel;

-+    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/

-+    int32_t shading_coeff_l[192];

-+    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/

-+    int32_t shading_coeff_r[192];

-+    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/

-+    int32_t paf_abs_shifter;

-+

-+} ia_pal_isp_pafstatistics_1_t;

-+

-+/*! \isp struct pafstatistics_1_1

-+PAF Statistics

-+*/

-+typedef struct

-+{

-+    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

-+    int32_t paf_en;

-+    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

-+    int32_t paf_frame_width;

-+    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

-+    int32_t paf_frame_height;

-+    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

-+    int32_t skip_horizontal_start;

-+    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

-+    int32_t skip_vertical_start;

-+    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

-+    int32_t block_width;

-+    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

-+    int32_t block_height;

-+    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

-+    int32_t accum_horizontal;

-+    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

-+    int32_t skip_horizontal;

-+    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

-+    int32_t accum_vertical;

-+    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

-+    int32_t skip_vertical;

-+    /*!< min_shift minimum evaluation shift in steps*/

-+    int32_t min_shift;

-+    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

-+    int32_t shift_steps;

-+    /*!< paf_shift_step_size phase evaluation step size in pixels*/

-+    int32_t paf_shift_step_size;

-+    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

-+    int32_t paf_shifter;

-+    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

-+    int32_t split_accross_multiple_lines;

-+    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

-+    int32_t pixels_per_line;

-+    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/

-+    int32_t input_modes;

-+    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

-+    int32_t input_bpp;

-+    /*!< int_prec internal precision of PAF pixels*/

-+    int32_t int_prec;

-+    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/

-+    int32_t paf_blacklevel;

-+    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/

-+    int32_t shading_coeff_l[192];

-+    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/

-+    int32_t shading_coeff_r[192];

-+    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/

-+    int32_t paf_abs_shifter;

-+

-+} ia_pal_isp_pafstatistics_1_1_t;

-+

-+/*! \isp struct pext_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

-+    int32_t paf_output_mode;

-+    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

-+    int32_t swapping1stbc;

-+    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping1stcd;

-+    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

-+    int32_t swapping2ndbc;

-+    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

-+    int32_t swapping2ndcd;

-+    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

-+    int32_t pdaf_width;

-+    /*!< pdaf_height Height in units of pdaf lines*/

-+    int32_t pdaf_height;

-+    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

-+    int32_t drop_pattern[32];

-+    /*!< drop_period Period of the drop pattern*/

-+    int32_t drop_period;

-+

-+} ia_pal_isp_pext_1_0_t;

-+

-+/*! \isp struct pix_crop_ir_md

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for IR MD output*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pix_crop_ir_md_t;

-+

-+/*! \isp struct pixcomp_1_0

-+Input system pixel compression

-+*/

-+typedef struct

-+{

-+    /*!< pixcomp_enable Enable PixComp*/

-+    int32_t pixcomp_enable;

-+    /*!< glu_base_level[6] GLU base level offset*/

-+    int32_t glu_base_level[6];

-+    /*!< glu_step[6] GLU step amount per stage*/

-+    int32_t glu_step[6];

-+    /*!< glu_start_bin[6] GLU stage start offset in LUT*/

-+    int32_t glu_start_bin[6];

-+    /*!< glu_gen_lut_size Utilized LUT size*/

-+    int32_t glu_gen_lut_size;

-+    /*!< glu_gen_lut[128] LUT samples*/

-+    int32_t glu_gen_lut[128];

-+

-+} ia_pal_isp_pixcomp_1_0_t;

-+

-+/*! \isp struct pixelformatter

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_ColRemoval col removal- for setting bayer pattern*/

-+    int32_t m_ColRemoval;

-+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_xstart;

-+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_ystart;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+

-+} ia_pal_isp_pixelformatter_t;

-+

-+/*! \isp struct pixelformatter_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_ColRemoval col removal- for setting bayer pattern*/

-+    int32_t m_ColRemoval;

-+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_xstart;

-+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_ystart;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+

-+} ia_pal_isp_pixelformatter_b_t;

-+

-+/*! \isp struct pixelformatter_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass     {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_ColRemoval col removal- for setting bayer pattern*/

-+    int32_t m_ColRemoval;

-+    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_xstart;

-+    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

-+    int32_t m_ystart;

-+    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_xsize;

-+    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

-+    int32_t m_ysize;

-+

-+} ia_pal_isp_pixelformatter_c_t;

-+

-+/*! \isp struct pixprecadapter_post_sis

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_pixprecadapter_post_sis_t;

-+

-+/*! \isp struct pixprecadapter_s2v_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_pixprecadapter_s2v_c_t;

-+

-+/*! \isp struct pixprecadapter_v2s_4

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_pixprecadapter_v2s_4_t;

-+

-+/*! \isp struct pme_1_0

-+PME for 'standalone TNR6'

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< frame_height frame height*/

-+    int32_t frame_height;

-+    /*!< frame_width frame width*/

-+    int32_t frame_width;

-+    /*!< search_range_y search range - bottom*/

-+    int32_t search_range_y;

-+    /*!< search_range_x search range - left*/

-+    int32_t search_range_x;

-+    /*!< dest_block_size_max_y[4] maximal block size - vertical*/

-+    int32_t dest_block_size_max_y[4];

-+    /*!< dest_block_size_max_x maximal block size - horizontal*/

-+    int32_t dest_block_size_max_x;

-+    /*!< iy_dest_image_min the first row of the destination image available in the DDR buffer*/

-+    int32_t iy_dest_image_min;

-+    /*!< ix_dest_image_min the first column of the destination image available in the DDR buffer*/

-+    int32_t ix_dest_image_min;

-+    /*!< homography_matrix_0[4] homography base->destination; elements 1,2,4,5 [S2.20]*/

-+    int32_t homography_matrix_0[4];

-+    /*!< homography_matrix_1[2] homography base->destination; elements 7, 8 [S0.31, only 25 LSBs used]*/

-+    int32_t homography_matrix_1[2];

-+    /*!< homography_matrix_2[3] homography base->destination; elements 3, 6, 9 [S15.16]*/

-+    int32_t homography_matrix_2[3];

-+    /*!< homography_confidence the confidence of the homography model*/

-+    int32_t homography_confidence;

-+    /*!< no_motion_confidence the confidence of the no-motion model*/

-+    int32_t no_motion_confidence;

-+    /*!< motion_complexity[2176] bypass*/

-+    int32_t motion_complexity[2176];

-+    /*!< motion_complexity_bin_exp_y motion-complexity read configuration*/

-+    int32_t motion_complexity_bin_exp_y;

-+

-+} ia_pal_isp_pme_1_0_t;

-+

-+/*! \isp struct pxl_crop_bayer_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for bayer output A*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_bayer_a_t;

-+

-+/*! \isp struct pxl_crop_psa

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for bayer output A*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_psa_t;

-+

-+/*! \isp struct pxl_crop_sis_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable post SIS Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_sis_a_t;

-+

-+/*! \isp struct pxl_crop_sis_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable post SIS Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_sis_b_t;

-+

-+/*! \isp struct pxl_crop_yuv_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for YUV output A*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_yuv_a_t;

-+

-+/*! \isp struct pxl_crop_yuv_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for YUV output B*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_yuv_b_t;

-+

-+/*! \isp struct pxl_crop_yuv_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable Crop for YUV output C*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_pxl_crop_yuv_c_t;

-+

-+/*! \isp struct rgb_ir_2_0

-+RGB-IR

-+*/

-+typedef struct

-+{

-+    /*!< Bypass Bypass (0,1)*/

-+    int32_t Bypass;

-+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

-+    int32_t CFArgbir[16];

-+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

-+    int32_t CFAbayer[4];

-+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

-+    int32_t SensorDim[2];

-+    /*!< ImageDim[2] Image dimensions (height,width)*/

-+    int32_t ImageDim[2];

-+    /*!< IRimageDim[2] IR image dimensions (height,width)*/

-+    int32_t IRimageDim[2];

-+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

-+    int32_t IRtype;

-+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

-+    int32_t IRrefloc;

-+    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights11[25];

-+    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights12[25];

-+    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights13[25];

-+    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights14[25];

-+    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights21[25];

-+    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights22[25];

-+    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights23[25];

-+    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights24[25];

-+    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights31[25];

-+    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights32[25];

-+    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights33[25];

-+    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights34[25];

-+    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights41[25];

-+    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights42[25];

-+    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights43[25];

-+    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights44[25];

-+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

-+    int32_t LumaWeightSums[16];

-+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors11[8];

-+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors12[8];

-+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors13[8];

-+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors14[8];

-+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors21[8];

-+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors22[8];

-+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors23[8];

-+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors24[8];

-+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors31[8];

-+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors32[8];

-+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors33[8];

-+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors34[8];

-+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors41[8];

-+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors42[8];

-+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors43[8];

-+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors44[8];

-+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestLuma;

-+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestWeights;

-+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

-+    int32_t IRspatialOffset[2];

-+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

-+    int32_t IRbinningFactor[2];

-+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

-+    int32_t IRcormode;

-+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

-+    int32_t IRmodelSigma[3];

-+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

-+    int32_t IRmodelOffset[3];

-+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

-+    int32_t IRmodelHeight[3];

-+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

-+    int32_t IRmodelWidth[3];

-+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

-+    int32_t IRmodelMax[3];

-+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

-+    int32_t IRmodelCUxR[12];

-+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

-+    int32_t IRmodelCUaR[11];

-+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

-+    int32_t IRmodelCUbR[11];

-+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

-+    int32_t IRmodelCUxG[12];

-+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

-+    int32_t IRmodelCUaG[11];

-+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

-+    int32_t IRmodelCUbG[11];

-+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

-+    int32_t IRmodelCUxB[12];

-+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

-+    int32_t IRmodelCUaB[11];

-+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

-+    int32_t IRmodelCUbB[11];

-+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

-+    int32_t IRinterpNeighbors11[12];

-+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

-+    int32_t IRinterpNeighbors12[12];

-+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

-+    int32_t IRinterpNeighbors13[12];

-+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

-+    int32_t IRinterpNeighbors14[12];

-+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

-+    int32_t IRinterpNeighbors21[12];

-+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

-+    int32_t IRinterpNeighbors22[12];

-+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

-+    int32_t IRinterpNeighbors23[12];

-+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

-+    int32_t IRinterpNeighbors24[12];

-+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

-+    int32_t IRinterpNeighbors31[12];

-+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

-+    int32_t IRinterpNeighbors32[12];

-+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

-+    int32_t IRinterpNeighbors33[12];

-+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

-+    int32_t IRinterpNeighbors34[12];

-+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

-+    int32_t IRinterpNeighbors41[12];

-+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

-+    int32_t IRinterpNeighbors42[12];

-+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

-+    int32_t IRinterpNeighbors43[12];

-+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

-+    int32_t IRinterpNeighbors44[12];

-+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

-+    int32_t IRscaledSensorDim[2];

-+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

-+    int32_t IRscaledModelSigma[3];

-+

-+} ia_pal_isp_rgb_ir_2_0_t;

-+

-+/*! \isp struct rgb_ir_2_1

-+RGB-IR

-+*/

-+typedef struct

-+{

-+    /*!< Bypass Bypass (0,1)*/

-+    int32_t Bypass;

-+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

-+    int32_t CFArgbir[16];

-+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

-+    int32_t CFAbayer[4];

-+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

-+    int32_t SensorDim[2];

-+    /*!< ImageDim[2] Image dimensions (height,width)*/

-+    int32_t ImageDim[2];

-+    /*!< IRimageDim[2] IR image dimensions (height,width)*/

-+    int32_t IRimageDim[2];

-+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

-+    int32_t IRtype;

-+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

-+    int32_t IRrefloc;

-+    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights11[25];

-+    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights12[25];

-+    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights13[25];

-+    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights14[25];

-+    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights21[25];

-+    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights22[25];

-+    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights23[25];

-+    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights24[25];

-+    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights31[25];

-+    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights32[25];

-+    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights33[25];

-+    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights34[25];

-+    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights41[25];

-+    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights42[25];

-+    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights43[25];

-+    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights44[25];

-+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

-+    int32_t LumaWeightSums[16];

-+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors11[8];

-+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors12[8];

-+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors13[8];

-+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors14[8];

-+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors21[8];

-+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors22[8];

-+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors23[8];

-+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors24[8];

-+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors31[8];

-+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors32[8];

-+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors33[8];

-+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors34[8];

-+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors41[8];

-+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors42[8];

-+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors43[8];

-+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors44[8];

-+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestLuma;

-+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestWeights;

-+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

-+    int32_t IRspatialOffset[2];

-+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

-+    int32_t IRbinningFactor[2];

-+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

-+    int32_t IRcormode;

-+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

-+    int32_t IRmodelSigma[3];

-+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

-+    int32_t IRmodelOffset[3];

-+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

-+    int32_t IRmodelHeight[3];

-+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

-+    int32_t IRmodelWidth[3];

-+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

-+    int32_t IRmodelMax[3];

-+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

-+    int32_t IRmodelCUxR[12];

-+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

-+    int32_t IRmodelCUaR[11];

-+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

-+    int32_t IRmodelCUbR[11];

-+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

-+    int32_t IRmodelCUxG[12];

-+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

-+    int32_t IRmodelCUaG[11];

-+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

-+    int32_t IRmodelCUbG[11];

-+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

-+    int32_t IRmodelCUxB[12];

-+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

-+    int32_t IRmodelCUaB[11];

-+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

-+    int32_t IRmodelCUbB[11];

-+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

-+    int32_t IRinterpNeighbors11[12];

-+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

-+    int32_t IRinterpNeighbors12[12];

-+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

-+    int32_t IRinterpNeighbors13[12];

-+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

-+    int32_t IRinterpNeighbors14[12];

-+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

-+    int32_t IRinterpNeighbors21[12];

-+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

-+    int32_t IRinterpNeighbors22[12];

-+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

-+    int32_t IRinterpNeighbors23[12];

-+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

-+    int32_t IRinterpNeighbors24[12];

-+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

-+    int32_t IRinterpNeighbors31[12];

-+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

-+    int32_t IRinterpNeighbors32[12];

-+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

-+    int32_t IRinterpNeighbors33[12];

-+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

-+    int32_t IRinterpNeighbors34[12];

-+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

-+    int32_t IRinterpNeighbors41[12];

-+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

-+    int32_t IRinterpNeighbors42[12];

-+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

-+    int32_t IRinterpNeighbors43[12];

-+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

-+    int32_t IRinterpNeighbors44[12];

-+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

-+    int32_t IRscaledSensorDim[2];

-+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

-+    int32_t IRscaledModelSigma[3];

-+    /*!< NormLinLshift NormLin lshift*/

-+    int32_t NormLinLshift;

-+    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/

-+    int32_t BL[16];

-+    /*!< DPCmode DPC mode (0: disable, 1: enable)*/

-+    int32_t DPCmode;

-+    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/

-+    int32_t DPCneighbors11[16];

-+    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/

-+    int32_t DPCneighbors12[16];

-+    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/

-+    int32_t DPCneighbors13[16];

-+    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/

-+    int32_t DPCneighbors14[16];

-+    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/

-+    int32_t DPCneighbors21[16];

-+    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/

-+    int32_t DPCneighbors22[16];

-+    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/

-+    int32_t DPCneighbors23[16];

-+    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/

-+    int32_t DPCneighbors24[16];

-+    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/

-+    int32_t DPCneighbors31[16];

-+    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/

-+    int32_t DPCneighbors32[16];

-+    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/

-+    int32_t DPCneighbors33[16];

-+    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/

-+    int32_t DPCneighbors34[16];

-+    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/

-+    int32_t DPCneighbors41[16];

-+    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/

-+    int32_t DPCneighbors42[16];

-+    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/

-+    int32_t DPCneighbors43[16];

-+    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/

-+    int32_t DPCneighbors44[16];

-+    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/

-+    int32_t DPCnoiseModel[2];

-+    /*!< DPCnorm[5] DPC normalization*/

-+    int32_t DPCnorm[5];

-+    /*!< IRblocksize_log2 log2 of IR Block size*/

-+    int32_t IRblocksize_log2;

-+    /*!< IRgridX IR grid width*/

-+    int32_t IRgridX;

-+    /*!< IRgridY IR grid height*/

-+    int32_t IRgridY;

-+    /*!< IRweightsR[170] IR weights (R channel)*/

-+    int32_t IRweightsR[170];

-+    /*!< IRweightsG[170] IR weights (G channel)*/

-+    int32_t IRweightsG[170];

-+    /*!< IRweightsB[170] IR weights (B channel)*/

-+    int32_t IRweightsB[170];

-+

-+} ia_pal_isp_rgb_ir_2_1_t;

-+

-+/*! \isp struct rgb_ir_2_1_bbb

-+RGB-IR_BBB Filter

-+*/

-+typedef struct

-+{

-+    /*!< Bypass Bypass (0,1)*/

-+    int32_t Bypass;

-+    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

-+    int32_t CFArgbir[16];

-+    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

-+    int32_t CFAbayer[4];

-+    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

-+    int32_t SensorDim[2];

-+    /*!< ImageDim[2] Image dimensions (height,width)*/

-+    int32_t ImageDim[2];

-+    /*!< IRimageDim[2] IR image dimensions (height,width)*/

-+    int32_t IRimageDim[2];

-+    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

-+    int32_t IRtype;

-+    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

-+    int32_t IRrefloc;

-+    /*!< LumaWeights11[9] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights11[9];

-+    /*!< LumaWeights12[9] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights12[9];

-+    /*!< LumaWeights13[9] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights13[9];

-+    /*!< LumaWeights14[9] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights14[9];

-+    /*!< LumaWeights21[9] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights21[9];

-+    /*!< LumaWeights22[9] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights22[9];

-+    /*!< LumaWeights23[9] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights23[9];

-+    /*!< LumaWeights24[9] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights24[9];

-+    /*!< LumaWeights31[9] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights31[9];

-+    /*!< LumaWeights32[9] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights32[9];

-+    /*!< LumaWeights33[9] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights33[9];

-+    /*!< LumaWeights34[9] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights34[9];

-+    /*!< LumaWeights41[9] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights41[9];

-+    /*!< LumaWeights42[9] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights42[9];

-+    /*!< LumaWeights43[9] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights43[9];

-+    /*!< LumaWeights44[9] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

-+    int32_t LumaWeights44[9];

-+    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

-+    int32_t LumaWeightSums[16];

-+    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors11[8];

-+    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors12[8];

-+    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors13[8];

-+    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors14[8];

-+    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors21[8];

-+    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors22[8];

-+    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors23[8];

-+    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors24[8];

-+    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors31[8];

-+    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors32[8];

-+    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors33[8];

-+    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors34[8];

-+    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors41[8];

-+    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors42[8];

-+    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors43[8];

-+    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

-+    int32_t BayerRestNeighbors44[8];

-+    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestLuma;

-+    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

-+    int32_t BayerRestWeights;

-+    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

-+    int32_t IRspatialOffset[2];

-+    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

-+    int32_t IRbinningFactor[2];

-+    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

-+    int32_t IRcormode;

-+    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

-+    int32_t IRmodelSigma[3];

-+    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

-+    int32_t IRmodelOffset[3];

-+    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

-+    int32_t IRmodelHeight[3];

-+    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

-+    int32_t IRmodelWidth[3];

-+    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

-+    int32_t IRmodelMax[3];

-+    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

-+    int32_t IRmodelCUxR[12];

-+    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

-+    int32_t IRmodelCUaR[11];

-+    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

-+    int32_t IRmodelCUbR[11];

-+    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

-+    int32_t IRmodelCUxG[12];

-+    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

-+    int32_t IRmodelCUaG[11];

-+    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

-+    int32_t IRmodelCUbG[11];

-+    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

-+    int32_t IRmodelCUxB[12];

-+    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

-+    int32_t IRmodelCUaB[11];

-+    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

-+    int32_t IRmodelCUbB[11];

-+    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

-+    int32_t IRinterpNeighbors11[12];

-+    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

-+    int32_t IRinterpNeighbors12[12];

-+    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

-+    int32_t IRinterpNeighbors13[12];

-+    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

-+    int32_t IRinterpNeighbors14[12];

-+    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

-+    int32_t IRinterpNeighbors21[12];

-+    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

-+    int32_t IRinterpNeighbors22[12];

-+    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

-+    int32_t IRinterpNeighbors23[12];

-+    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

-+    int32_t IRinterpNeighbors24[12];

-+    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

-+    int32_t IRinterpNeighbors31[12];

-+    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

-+    int32_t IRinterpNeighbors32[12];

-+    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

-+    int32_t IRinterpNeighbors33[12];

-+    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

-+    int32_t IRinterpNeighbors34[12];

-+    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

-+    int32_t IRinterpNeighbors41[12];

-+    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

-+    int32_t IRinterpNeighbors42[12];

-+    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

-+    int32_t IRinterpNeighbors43[12];

-+    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

-+    int32_t IRinterpNeighbors44[12];

-+    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

-+    int32_t IRscaledSensorDim[2];

-+    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

-+    int32_t IRscaledModelSigma[3];

-+    /*!< NormLinLshift NormLin lshift*/

-+    int32_t NormLinLshift;

-+    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/

-+    int32_t BL[16];

-+    /*!< DPCmode DPC mode (0: disable, 1: enable)*/

-+    int32_t DPCmode;

-+    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/

-+    int32_t DPCneighbors11[16];

-+    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/

-+    int32_t DPCneighbors12[16];

-+    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/

-+    int32_t DPCneighbors13[16];

-+    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/

-+    int32_t DPCneighbors14[16];

-+    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/

-+    int32_t DPCneighbors21[16];

-+    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/

-+    int32_t DPCneighbors22[16];

-+    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/

-+    int32_t DPCneighbors23[16];

-+    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/

-+    int32_t DPCneighbors24[16];

-+    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/

-+    int32_t DPCneighbors31[16];

-+    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/

-+    int32_t DPCneighbors32[16];

-+    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/

-+    int32_t DPCneighbors33[16];

-+    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/

-+    int32_t DPCneighbors34[16];

-+    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/

-+    int32_t DPCneighbors41[16];

-+    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/

-+    int32_t DPCneighbors42[16];

-+    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/

-+    int32_t DPCneighbors43[16];

-+    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/

-+    int32_t DPCneighbors44[16];

-+    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/

-+    int32_t DPCnoiseModel[2];

-+    /*!< IRbinningH Horizontal binning IR output (0 no-binning, 1 2x horizontal binning)*/

-+    int32_t IRbinningH;

-+    /*!< IRbinningV Vertical binning IR output (0 no-binning, 1 2x vertical binning)*/

-+    int32_t IRbinningV;

-+    /*!< OutputMode Output Mode (0 bayer, 1 ir)*/

-+    int32_t OutputMode;

-+    /*!< block_dim Block_dimension (WxH). Log2 block dimension of each grid cell (8x8,16x16,32x32,64x64,128x128, 256x256)*/

-+    int32_t block_dim;

-+    /*!< awb_en Enable IR AWB statistics output (0 disable, 1 enable)*/

-+    int32_t awb_en;

-+    /*!< shftr_val Shift right average value. Derived from log2 number of pixels in a cell). Note: 1) RGB_IR_2_1 AWB works internally with U11 input. 2) Val will be clipped to U15 after shift*/

-+    int32_t shftr_val;

-+    /*!< shftr_sat Shift right saturation. Represents log2(num of pixels in cell). Note: Sat value will be clipped to U8 after shift.*/

-+    int32_t shftr_sat;

-+    /*!< rgbs_thr Threshold value for IR saturation calculation. Note: RGB_IR_2_1 AWB works internally with U11 input, so limit max value to (1<<11)-1'))*/

-+    int32_t rgbs_thr;

-+    /*!< DPCnorm[5] DPC normalization*/

-+    int32_t DPCnorm[5];

-+    /*!< IRblocksize_log2 log2 of IR Block size*/

-+    int32_t IRblocksize_log2;

-+    /*!< IRgridX IR grid width*/

-+    int32_t IRgridX;

-+    /*!< IRgridY IR grid height*/

-+    int32_t IRgridY;

-+    /*!< IRweightsR[170] IR weights (R channel)*/

-+    int32_t IRweightsR[170];

-+    /*!< IRweightsG[170] IR weights (G channel)*/

-+    int32_t IRweightsG[170];

-+    /*!< IRweightsB[170] IR weights (B channel)*/

-+    int32_t IRweightsB[170];

-+

-+} ia_pal_isp_rgb_ir_2_1_bbb_t;

-+

-+/*! \isp struct rgbs_grid_1_0

-+RGBS grid (AWB statistics)

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

-+    int32_t block_height;

-+    /*!< min_out_bytes_per_cell Minimum bytes per grid cell in output buffer (pad with '0's in MSB side if not met otherwise)*/

-+    int32_t min_out_bytes_per_cell;

-+    /*!< rgbs_en 0: FF will not write to the RGBS array; 1: FF will write*/

-+    int32_t rgbs_en;

-+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

-+    int32_t rgbs_incl_sat;

-+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

-+    int32_t rgbs_thr_cx[8];

-+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

-+    int32_t shftr_val_cx[8];

-+    /*!< shftr_sat represents log2(num of pixels in cell)*/

-+    int32_t shftr_sat;

-+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

-+    int32_t output_packed;

-+    /*!< copy_out_components bit0: copy_enable_colorid0, bit1..3: copy_src_colorid, bit4: copy_enable_colorid1, bit5..7: copy_src_colorid, ... , bit28: copy_enable_colorid7, bit29..31: copy_src_colorid*/

-+    uint32_t copy_out_components;

-+

-+} ia_pal_isp_rgbs_grid_1_0_t;

-+

-+/*! \isp struct rgbs_statistics_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< grid_width represents number of horizontal grid cells*/

-+    int32_t grid_width;

-+    /*!< grid_height represents number of vertical grid cells*/

-+    int32_t grid_height;

-+    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

-+    int32_t block_width;

-+    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

-+    int32_t block_height;

-+    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/

-+    int32_t grid_height_per_slice;

-+    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

-+    int32_t awb_en;

-+    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

-+    int32_t rgbs_incl_sat;

-+    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

-+    int32_t x_start;

-+    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

-+    int32_t y_start;

-+    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

-+    int32_t x_end;

-+    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

-+    int32_t y_end;

-+    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

-+    int32_t sensor_mode;

-+    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_00;

-+    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_01;

-+    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_02;

-+    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_03;

-+    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_10;

-+    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_11;

-+    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_12;

-+    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_13;

-+    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_20;

-+    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_21;

-+    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_22;

-+    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_23;

-+    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_30;

-+    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_31;

-+    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_32;

-+    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

-+    int32_t pat_33;

-+    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

-+    int32_t rgbs_thr_cx[8];

-+    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

-+    int32_t shftr_val_cx[8];

-+    /*!< shftr_sat Shifter for saturation grid. Represents log2(num of pixels in cell) + 1. In SVE/RGB-IR use cases represent the shifter for saturation grid 0. In SVE, this correspond to long exposure colorIDs[0-3]. In RGB-IR this correspond to RGB colorID[0-2]*/

-+    int32_t shftr_sat;

-+    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

-+    int32_t output_packed;

-+    /*!< output_sat_packed Enabling Saturation Output packing for SVE & RGB-IR so that two saturation grids can be used to represent short/long in SVE and  RGB/IR in RGB-IR use cases.*/

-+    int32_t output_sat_packed;

-+    /*!< cx_sat_id mapping of ColorIDs 0-7 to saturation grid 0(long exp) or 1(short exp/IR)*/

-+    int32_t cx_sat_id;

-+    /*!< shftr_sat_1 Shifter for saturation grid 1. Used only in SVE & RGB-IR. In SVE, this correspond to short exposure colorIDs[4-7]. In RGB-IR this correspond to IR colorID[3]. Represents log2(num of pixels in cell) + 1.*/

-+    int32_t shftr_sat_1;

-+

-+} ia_pal_isp_rgbs_statistics_1_0_t;

-+

-+/*! \isp struct sc_iefd

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Block bypass for HW use*/

-+    int32_t bypass;

-+    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/

-+    int32_t horver_diag_coeff;

-+    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/

-+    int32_t ed_horver_diag_coeff;

-+    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/

-+    int32_t dir_far_sharp_w;

-+    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/

-+    int32_t dir_far_dns_w;

-+    /*!< ndir_dns_power Power of non-direct denoising*/

-+    int32_t ndir_dns_power;

-+    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/

-+    int32_t shrpn_posi_lmt_dir;

-+    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/

-+    int32_t shrpn_nega_lmt_dir;

-+    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/

-+    int32_t shrpn_posi_lmt_txt;

-+    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/

-+    int32_t shrpn_nega_lmt_txt;

-+    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/

-+    int32_t clamp_stitch;

-+    /*!< denoise_en Denoise enable flag*/

-+    int32_t denoise_en;

-+    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/

-+    int32_t cu6_ndir_shrpn_pwr;

-+    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/

-+    int32_t cuunsharpen_power;

-+    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/

-+    int32_t unsharp_weight;

-+    /*!< unsharp_amount Unsharp-mask extra sharpening power*/

-+    int32_t unsharp_amount;

-+    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/

-+    int32_t direct_metric_update;

-+    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/

-+    int32_t directional_smooth_en;

-+    /*!< rad_enable Enable radial dependency flag*/

-+    int32_t rad_enable;

-+    /*!< rad_xreset Radial reset of  x (width)*/

-+    int32_t rad_xreset;

-+    /*!< rad_yreset Radial reset of y (height)*/

-+    int32_t rad_yreset;

-+    /*!< rad_x2reset Radial reset of x^2 (width^2)*/

-+    int32_t rad_x2reset;

-+    /*!< rad_y2reset Radial reset of y^2 (height^2)*/

-+    int32_t rad_y2reset;

-+    /*!< rad_nf Scaling down factor of radius^2*/

-+    int32_t rad_nf;

-+    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/

-+    int32_t rad_inv_r2;

-+    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/

-+    int32_t rad_dir_far_sharp_w;

-+    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/

-+    int32_t rad_cu6_ndir_shrpn_pwr;

-+    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/

-+    int32_t rad_cuun_shrpn_pwr;

-+    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/

-+    int32_t rad_cu6_x1;

-+    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/

-+    int32_t rad_cuunshrp_x1;

-+    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/

-+    int32_t rad_dir_far_dns_w;

-+    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/

-+    int32_t rad_ndir_dns_power;

-+    /*!< vssnlm_enable Enable of edge denoising flag*/

-+    int32_t vssnlm_enable;

-+    /*!< vs_x0 Edge denoising LUT x0*/

-+    int32_t vs_x0;

-+    /*!< vs_x1 Edge denoising LUT x1*/

-+    int32_t vs_x1;

-+    /*!< vs_x2 Edge denoising LUT x2*/

-+    int32_t vs_x2;

-+    /*!< vs_y1 Edge denoising LUT y0*/

-+    int32_t vs_y1;

-+    /*!< vs_y2 Edge denoising LUT y1*/

-+    int32_t vs_y2;

-+    /*!< vs_y3 Edge denoising LUT y2*/

-+    int32_t vs_y3;

-+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

-+    int32_t unsharpfilter[15];

-+    /*!< denoisefilter[6] Denoising filter coefficients*/

-+    int32_t denoisefilter[6];

-+    /*!< configunit1_x[2] CU1 x points*/

-+    int32_t configunit1_x[2];

-+    /*!< configunit1_slope[1] CU1 slope vlaues*/

-+    int32_t configunit1_slope[1];

-+    /*!< configunit3_x[2] CU3 x points*/

-+    int32_t configunit3_x[2];

-+    /*!< configunit3_slope[1] CU3 slope vlaues*/

-+    int32_t configunit3_slope[1];

-+    /*!< configunit5_x[2] CU5 x points*/

-+    int32_t configunit5_x[2];

-+    /*!< configunit5_y[1] CU5 y points*/

-+    int32_t configunit5_y[1];

-+    /*!< configunit5_slope[1] CU5 x slope values*/

-+    int32_t configunit5_slope[1];

-+    /*!< configunit6_opt_x[4] CU6 x points*/

-+    int32_t configunit6_opt_x[4];

-+    /*!< configunit6_opt_y[3] CU6 y points*/

-+    int32_t configunit6_opt_y[3];

-+    /*!< configunit6_opt_slope[3] CU6 slope values*/

-+    int32_t configunit6_opt_slope[3];

-+    /*!< configunit7_x[2] CU7 x points*/

-+    int32_t configunit7_x[2];

-+    /*!< configunit7_slope[1] CU7 slope vlaues*/

-+    int32_t configunit7_slope[1];

-+    /*!< configunited_x[6] CU_ED x points*/

-+    int32_t configunited_x[6];

-+    /*!< configunited_y[5] CU_ED y points*/

-+    int32_t configunited_y[5];

-+    /*!< configunited_slope[5] CU_ED slope vlaues*/

-+    int32_t configunited_slope[5];

-+    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/

-+    int32_t configunitunsharp_opt_x[4];

-+    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/

-+    int32_t configunitunsharp_opt_y[3];

-+    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope vlaues*/

-+    int32_t configunitunsharp_opt_slope[3];

-+    /*!< configunitradial_x[6] CU_RAD x points*/

-+    int32_t configunitradial_x[6];

-+    /*!< configunitradial_y[5] CU_RAD y points*/

-+    int32_t configunitradial_y[5];

-+    /*!< configunitradial_slope[5] CU_RAD slope vlaues*/

-+    int32_t configunitradial_slope[5];

-+    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/

-+    int32_t configunitvssnlm_x[2];

-+    /*!< configunitvssnlm_slope[1] C_VSSNLM slope vlaues*/

-+    int32_t configunitvssnlm_slope[1];

-+

-+} ia_pal_isp_sc_iefd_t;

-+

-+/*! \isp struct sc_iefd_v2

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Block enable for HW use*/

-+    int32_t enable;

-+    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/

-+    int32_t horver_diag_coeff;

-+    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/

-+    int32_t ed_horver_diag_coeff;

-+    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/

-+    int32_t dir_far_sharp_w;

-+    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/

-+    int32_t dir_far_dns_w;

-+    /*!< ndir_dns_power Power of non-direct denoising*/

-+    int32_t ndir_dns_power;

-+    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/

-+    int32_t shrpn_posi_lmt_dir;

-+    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/

-+    int32_t shrpn_nega_lmt_dir;

-+    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/

-+    int32_t shrpn_posi_lmt_txt;

-+    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/

-+    int32_t shrpn_nega_lmt_txt;

-+    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/

-+    int32_t clamp_stitch;

-+    /*!< denoise_en Denoise enable flag*/

-+    int32_t denoise_en;

-+    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/

-+    int32_t cu6_ndir_shrpn_pwr;

-+    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/

-+    int32_t cuunsharpen_power;

-+    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/

-+    int32_t unsharp_weight;

-+    /*!< unsharp_amount Unsharp-mask extra sharpening power*/

-+    int32_t unsharp_amount;

-+    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/

-+    int32_t direct_metric_update;

-+    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/

-+    int32_t directional_smooth_en;

-+    /*!< rad_enable Enable radial dependency flag*/

-+    int32_t rad_enable;

-+    /*!< rad_xreset Radial reset of  x (width)*/

-+    int32_t rad_xreset;

-+    /*!< rad_yreset Radial reset of y (height)*/

-+    int32_t rad_yreset;

-+    /*!< rad_x2reset Radial reset of x^2 (width^2)*/

-+    int32_t rad_x2reset;

-+    /*!< rad_y2reset Radial reset of y^2 (height^2)*/

-+    int32_t rad_y2reset;

-+    /*!< rad_nf Scaling down factor of radius^2*/

-+    int32_t rad_nf;

-+    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/

-+    int32_t rad_inv_r2;

-+    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/

-+    int32_t rad_dir_far_sharp_w;

-+    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/

-+    int32_t rad_cu6_ndir_shrpn_pwr;

-+    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/

-+    int32_t rad_cuun_shrpn_pwr;

-+    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/

-+    int32_t rad_cu6_x1;

-+    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/

-+    int32_t rad_cuunshrp_x1;

-+    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/

-+    int32_t rad_dir_far_dns_w;

-+    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/

-+    int32_t rad_ndir_dns_power;

-+    /*!< vssnlm_enable Enable of edge denoising flag*/

-+    int32_t vssnlm_enable;

-+    /*!< vs_x0 Edge denoising LUT x0*/

-+    int32_t vs_x0;

-+    /*!< vs_x1 Edge denoising LUT x1*/

-+    int32_t vs_x1;

-+    /*!< vs_x2 Edge denoising LUT x2*/

-+    int32_t vs_x2;

-+    /*!< vs_y1 Edge denoising LUT y0*/

-+    int32_t vs_y1;

-+    /*!< vs_y2 Edge denoising LUT y1*/

-+    int32_t vs_y2;

-+    /*!< vs_y3 Edge denoising LUT y2*/

-+    int32_t vs_y3;

-+    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

-+    int32_t unsharpfilter[15];

-+    /*!< denoisefilter[6] Denoising filter coefficients*/

-+    int32_t denoisefilter[6];

-+    /*!< configunit1_x[2] CU1 x points*/

-+    int32_t configunit1_x[2];

-+    /*!< configunit1_slope[1] CU1 slope values*/

-+    int32_t configunit1_slope[1];

-+    /*!< configunit3_x[2] CU3 x points*/

-+    int32_t configunit3_x[2];

-+    /*!< configunit3_slope[1] CU3 slope values*/

-+    int32_t configunit3_slope[1];

-+    /*!< configunit5_x[2] CU5 x points*/

-+    int32_t configunit5_x[2];

-+    /*!< configunit5_y[1] CU5 y points*/

-+    int32_t configunit5_y[1];

-+    /*!< configunit5_slope[1] CU5 x slope values*/

-+    int32_t configunit5_slope[1];

-+    /*!< configunit6_opt_x[4] CU6 x points*/

-+    int32_t configunit6_opt_x[4];

-+    /*!< configunit6_opt_y[3] CU6 y points*/

-+    int32_t configunit6_opt_y[3];

-+    /*!< configunit6_opt_slope[3] CU6 slope values*/

-+    int32_t configunit6_opt_slope[3];

-+    /*!< configunit7_x[2] CU7 x points*/

-+    int32_t configunit7_x[2];

-+    /*!< configunit7_slope[1] CU7 slope vlaues*/

-+    int32_t configunit7_slope[1];

-+    /*!< configunited_x[6] CU_ED x points*/

-+    int32_t configunited_x[6];

-+    /*!< configunited_y[5] CU_ED y points*/

-+    int32_t configunited_y[5];

-+    /*!< configunited_slope[5] CU_ED slope values*/

-+    int32_t configunited_slope[5];

-+    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/

-+    int32_t configunitunsharp_opt_x[4];

-+    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/

-+    int32_t configunitunsharp_opt_y[3];

-+    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope values*/

-+    int32_t configunitunsharp_opt_slope[3];

-+    /*!< configunitradial_x[6] CU_RAD x points*/

-+    int32_t configunitradial_x[6];

-+    /*!< configunitradial_y[5] CU_RAD y points*/

-+    int32_t configunitradial_y[5];

-+    /*!< configunitradial_slope[5] CU_RAD slope values*/

-+    int32_t configunitradial_slope[5];

-+    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/

-+    int32_t configunitvssnlm_x[2];

-+    /*!< configunitvssnlm_slope[1] CU_VSSNLM slope values*/

-+    int32_t configunitvssnlm_slope[1];

-+    /*!< configunitusmpownorm_x[6] CU_USM_POW x points*/

-+    int32_t configunitusmpownorm_x[6];

-+    /*!< configunitusmpownorm_y[5] CU_USM_POW y points*/

-+    int32_t configunitusmpownorm_y[5];

-+    /*!< configunitusmpownorm_slope[5] CU_USM_POW slope values*/

-+    int32_t configunitusmpownorm_slope[5];

-+    /*!< unsharpmet Enable gradient protection*/

-+    int32_t unsharpmet;

-+    /*!< gradth Threshold for zeroing derivative*/

-+    int32_t gradth;

-+

-+} ia_pal_isp_sc_iefd_v2_t;

-+

-+/*! \isp struct sc_outputscaler_dp

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass the scaler*/

-+    int32_t bypass;

-+    /*!< block_width Horizontal size of output block*/

-+    int32_t block_width;

-+    /*!< block_height Vertical size of output block*/

-+    int32_t block_height;

-+    /*!< chunk_width Horizontal size of input chunk*/

-+    int32_t chunk_width;

-+    /*!< chunk_height Vertical size of input chunk*/

-+    int32_t chunk_height;

-+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_y_start_column;

-+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_uv_start_column;

-+    /*!< in_width_y Width of the input image Y plane (in pixels)*/

-+    int32_t in_width_y;

-+    /*!< in_height_y Height of the input image Y plane (in pixels)*/

-+    int32_t in_height_y;

-+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

-+    int32_t in_width_uv;

-+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

-+    int32_t in_height_uv;

-+    /*!< out_width_y Width of the output image Y plane (in pixels)*/

-+    int32_t out_width_y;

-+    /*!< out_height_y Height of the output image Y plane (in pixels)*/

-+    int32_t out_height_y;

-+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

-+    int32_t out_width_uv;

-+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

-+    int32_t out_height_uv;

-+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

-+    int32_t updown_sel;

-+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

-+    int32_t coeff_lut_y[128];

-+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

-+    int32_t coeff_lut_uv[64];

-+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

-+    int32_t scaling_ratio;

-+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

-+    int32_t phase_init_y_top;

-+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

-+    int32_t phase_init_y_left;

-+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

-+    int32_t phase_init_uv_top;

-+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

-+    int32_t phase_init_uv_left;

-+    /*!< pad_left_y Image left padding: Y component*/

-+    int32_t pad_left_y;

-+    /*!< pad_left_uv Image left padding: U/V components*/

-+    int32_t pad_left_uv;

-+    /*!< pad_right_y Image right padding: Y component*/

-+    int32_t pad_right_y;

-+    /*!< pad_right_uv Image right padding: U/V components*/

-+    int32_t pad_right_uv;

-+    /*!< pad_top_y Image top padding: Y component*/

-+    int32_t pad_top_y;

-+    /*!< pad_top_uv Image top padding: U/V components*/

-+    int32_t pad_top_uv;

-+    /*!< pad_bttm_y Image bottom padding: Y component*/

-+    int32_t pad_bttm_y;

-+    /*!< pad_bttm_uv Image bottom padding: U/V components*/

-+    int32_t pad_bttm_uv;

-+    /*!< exp_shift Scaling filter coefficients exponent shift*/

-+    int32_t exp_shift;

-+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

-+    int32_t output0_out_y_left_crop;

-+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_left_crop;

-+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

-+    int32_t output0_out_y_top_crop;

-+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_top_crop;

-+

-+} ia_pal_isp_sc_outputscaler_dp_t;

-+

-+/*! \isp struct sc_outputscaler_dp_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass the scaler*/

-+    int32_t bypass;

-+    /*!< block_width Horizontal size of output block*/

-+    int32_t block_width;

-+    /*!< block_height Vertical size of output block*/

-+    int32_t block_height;

-+    /*!< chunk_width Horizontal size of input chunk*/

-+    int32_t chunk_width;

-+    /*!< chunk_height Vertical size of input chunk*/

-+    int32_t chunk_height;

-+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_y_start_column;

-+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_uv_start_column;

-+    /*!< in_width_y Width of the input image Y plane (in pixels)*/

-+    int32_t in_width_y;

-+    /*!< in_height_y Height of the input image Y plane (in pixels)*/

-+    int32_t in_height_y;

-+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

-+    int32_t in_width_uv;

-+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

-+    int32_t in_height_uv;

-+    /*!< out_width_y Width of the output image Y plane (in pixels)*/

-+    int32_t out_width_y;

-+    /*!< out_height_y Height of the output image Y plane (in pixels)*/

-+    int32_t out_height_y;

-+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

-+    int32_t out_width_uv;

-+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

-+    int32_t out_height_uv;

-+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

-+    int32_t updown_sel;

-+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

-+    int32_t coeff_lut_y[128];

-+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

-+    int32_t coeff_lut_uv[64];

-+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

-+    int32_t scaling_ratio;

-+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

-+    int32_t phase_init_y_top;

-+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

-+    int32_t phase_init_y_left;

-+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

-+    int32_t phase_init_uv_top;

-+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

-+    int32_t phase_init_uv_left;

-+    /*!< pad_left_y Image left padding: Y component*/

-+    int32_t pad_left_y;

-+    /*!< pad_left_uv Image left padding: U/V components*/

-+    int32_t pad_left_uv;

-+    /*!< pad_right_y Image right padding: Y component*/

-+    int32_t pad_right_y;

-+    /*!< pad_right_uv Image right padding: U/V components*/

-+    int32_t pad_right_uv;

-+    /*!< pad_top_y Image top padding: Y component*/

-+    int32_t pad_top_y;

-+    /*!< pad_top_uv Image top padding: U/V components*/

-+    int32_t pad_top_uv;

-+    /*!< pad_bttm_y Image bottom padding: Y component*/

-+    int32_t pad_bttm_y;

-+    /*!< pad_bttm_uv Image bottom padding: U/V components*/

-+    int32_t pad_bttm_uv;

-+    /*!< exp_shift Scaling filter coefficients exponent shift*/

-+    int32_t exp_shift;

-+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

-+    int32_t output0_out_y_left_crop;

-+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_left_crop;

-+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

-+    int32_t output0_out_y_top_crop;

-+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_top_crop;

-+    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/

-+    int32_t input_bpp;

-+

-+} ia_pal_isp_sc_outputscaler_dp_1_1_t;

-+

-+/*! \isp struct sc_outputscaler_ppp

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass the scaler*/

-+    int32_t bypass;

-+    /*!< block_width Horizontal size of output block*/

-+    int32_t block_width;

-+    /*!< block_height Vertical size of output block*/

-+    int32_t block_height;

-+    /*!< chunk_width Horizontal size of input chunk*/

-+    int32_t chunk_width;

-+    /*!< chunk_height Vertical size of input chunk*/

-+    int32_t chunk_height;

-+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_y_start_column;

-+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_uv_start_column;

-+    /*!< in_width_y Width of the input image Y plane (in pixels)*/

-+    int32_t in_width_y;

-+    /*!< in_height_y Height of the input image Y plane (in pixels)*/

-+    int32_t in_height_y;

-+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

-+    int32_t in_width_uv;

-+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

-+    int32_t in_height_uv;

-+    /*!< out_width_y Width of the output image Y plane (in pixels)*/

-+    int32_t out_width_y;

-+    /*!< out_height_y Height of the output image Y plane (in pixels)*/

-+    int32_t out_height_y;

-+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

-+    int32_t out_width_uv;

-+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

-+    int32_t out_height_uv;

-+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

-+    int32_t updown_sel;

-+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

-+    int32_t coeff_lut_y[128];

-+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

-+    int32_t coeff_lut_uv[64];

-+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

-+    int32_t scaling_ratio;

-+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

-+    int32_t phase_init_y_top;

-+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

-+    int32_t phase_init_y_left;

-+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

-+    int32_t phase_init_uv_top;

-+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

-+    int32_t phase_init_uv_left;

-+    /*!< pad_left_y Image left padding: Y component*/

-+    int32_t pad_left_y;

-+    /*!< pad_left_uv Image left padding: U/V components*/

-+    int32_t pad_left_uv;

-+    /*!< pad_right_y Image right padding: Y component*/

-+    int32_t pad_right_y;

-+    /*!< pad_right_uv Image right padding: U/V components*/

-+    int32_t pad_right_uv;

-+    /*!< pad_top_y Image top padding: Y component*/

-+    int32_t pad_top_y;

-+    /*!< pad_top_uv Image top padding: U/V components*/

-+    int32_t pad_top_uv;

-+    /*!< pad_bttm_y Image bottom padding: Y component*/

-+    int32_t pad_bttm_y;

-+    /*!< pad_bttm_uv Image bottom padding: U/V components*/

-+    int32_t pad_bttm_uv;

-+    /*!< exp_shift Scaling filter coefficients exponent shift*/

-+    int32_t exp_shift;

-+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

-+    int32_t output0_out_y_left_crop;

-+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_left_crop;

-+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

-+    int32_t output0_out_y_top_crop;

-+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_top_crop;

-+

-+} ia_pal_isp_sc_outputscaler_ppp_t;

-+

-+/*! \isp struct sc_outputscaler_ppp_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass the scaler*/

-+    int32_t bypass;

-+    /*!< block_width Horizontal size of output block*/

-+    int32_t block_width;

-+    /*!< block_height Vertical size of output block*/

-+    int32_t block_height;

-+    /*!< chunk_width Horizontal size of input chunk*/

-+    int32_t chunk_width;

-+    /*!< chunk_height Vertical size of input chunk*/

-+    int32_t chunk_height;

-+    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_y_start_column;

-+    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

-+    int32_t input_image_uv_start_column;

-+    /*!< in_width_y Width of the input image Y plane (in pixels)*/

-+    int32_t in_width_y;

-+    /*!< in_height_y Height of the input image Y plane (in pixels)*/

-+    int32_t in_height_y;

-+    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

-+    int32_t in_width_uv;

-+    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

-+    int32_t in_height_uv;

-+    /*!< out_width_y Width of the output image Y plane (in pixels)*/

-+    int32_t out_width_y;

-+    /*!< out_height_y Height of the output image Y plane (in pixels)*/

-+    int32_t out_height_y;

-+    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

-+    int32_t out_width_uv;

-+    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

-+    int32_t out_height_uv;

-+    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

-+    int32_t updown_sel;

-+    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

-+    int32_t coeff_lut_y[128];

-+    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

-+    int32_t coeff_lut_uv[64];

-+    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

-+    int32_t scaling_ratio;

-+    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

-+    int32_t phase_init_y_top;

-+    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

-+    int32_t phase_init_y_left;

-+    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

-+    int32_t phase_init_uv_top;

-+    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

-+    int32_t phase_init_uv_left;

-+    /*!< pad_left_y Image left padding: Y component*/

-+    int32_t pad_left_y;

-+    /*!< pad_left_uv Image left padding: U/V components*/

-+    int32_t pad_left_uv;

-+    /*!< pad_right_y Image right padding: Y component*/

-+    int32_t pad_right_y;

-+    /*!< pad_right_uv Image right padding: U/V components*/

-+    int32_t pad_right_uv;

-+    /*!< pad_top_y Image top padding: Y component*/

-+    int32_t pad_top_y;

-+    /*!< pad_top_uv Image top padding: U/V components*/

-+    int32_t pad_top_uv;

-+    /*!< pad_bttm_y Image bottom padding: Y component*/

-+    int32_t pad_bttm_y;

-+    /*!< pad_bttm_uv Image bottom padding: U/V components*/

-+    int32_t pad_bttm_uv;

-+    /*!< exp_shift Scaling filter coefficients exponent shift*/

-+    int32_t exp_shift;

-+    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

-+    int32_t output0_out_y_left_crop;

-+    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_left_crop;

-+    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

-+    int32_t output0_out_y_top_crop;

-+    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

-+    int32_t output0_out_uv_top_crop;

-+    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/

-+    int32_t input_bpp;

-+

-+} ia_pal_isp_sc_outputscaler_ppp_1_1_t;

-+

-+/*! \isp struct sc_ylpf

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Block Bypass. Must be set to 0 for operatinal mode*/

-+    int32_t m_bypass;

-+    /*!< m_vec_kernels[8] configuration DS kernel vector*/

-+    int32_t m_vec_kernels[8];

-+    /*!< m_decimationmode decimationMode{0.m444,1.m422,2.m420}*/

-+    int32_t m_decimationmode;

-+

-+} ia_pal_isp_sc_ylpf_t;

-+

-+/*! \isp struct sdp_rec

-+

-+*/

-+typedef struct

-+{

-+    /*!< vblank */

-+    uint32_t vblank;

-+    /*!< right_offset */

-+    uint32_t right_offset;

-+    /*!< pacing_sclk_count register value plus 5 is number of sclks per pixel*/

-+    uint32_t pacing_sclk_count;

-+    /*!< input_line_count extra input lines buffered*/

-+    uint32_t input_line_count;

-+    /*!< halt_line_margin number of lines (times four) between write and read buffer locations to restart data flow, enter ignore vdf_halt.*/

-+    uint32_t halt_line_margin;

-+    /*!< halt_line_hysteresis number of lines (times four) between write and read buffer locations to exit ignore vdf_halt.*/

-+    uint32_t halt_line_hysteresis;

-+    /*!< m_on_frame_count number of frames the Rec processes*/

-+    uint32_t m_on_frame_count;

-+    /*!< n_off_frame_count number of frames the Rec skips*/

-+    uint32_t n_off_frame_count;

-+    /*!< a11_l */

-+    uint32_t a11_l;

-+    /*!< a12_l */

-+    uint32_t a12_l;

-+    /*!< a13_l */

-+    uint32_t a13_l;

-+    /*!< a21_l */

-+    uint32_t a21_l;

-+    /*!< a22_l */

-+    uint32_t a22_l;

-+    /*!< a23_l */

-+    uint32_t a23_l;

-+    /*!< a31_l */

-+    uint32_t a31_l;

-+    /*!< a32_l */

-+    uint32_t a32_l;

-+    /*!< a33_l */

-+    uint32_t a33_l;

-+    /*!< k0_l */

-+    uint32_t k0_l;

-+    /*!< k1_l */

-+    uint32_t k1_l;

-+    /*!< k2_l */

-+    uint32_t k2_l;

-+    /*!< k3_l */

-+    uint32_t k3_l;

-+    /*!< k4_l */

-+    uint32_t k4_l;

-+    /*!< f0_l */

-+    uint32_t f0_l;

-+    /*!< f1_l */

-+    uint32_t f1_l;

-+    /*!< c0_l */

-+    uint32_t c0_l;

-+    /*!< c1_l */

-+    uint32_t c1_l;

-+    /*!< a11_r */

-+    uint32_t a11_r;

-+    /*!< a12_r */

-+    uint32_t a12_r;

-+    /*!< a13_r */

-+    uint32_t a13_r;

-+    /*!< a21_r */

-+    uint32_t a21_r;

-+    /*!< a22_r */

-+    uint32_t a22_r;

-+    /*!< a23_r */

-+    uint32_t a23_r;

-+    /*!< a31_r */

-+    uint32_t a31_r;

-+    /*!< a32_r */

-+    uint32_t a32_r;

-+    /*!< a33_r */

-+    uint32_t a33_r;

-+    /*!< k0_r */

-+    uint32_t k0_r;

-+    /*!< k1_r */

-+    uint32_t k1_r;

-+    /*!< k2_r */

-+    uint32_t k2_r;

-+    /*!< k3_r */

-+    uint32_t k3_r;

-+    /*!< k4_r */

-+    uint32_t k4_r;

-+    /*!< f0_r */

-+    uint32_t f0_r;

-+    /*!< f1_r */

-+    uint32_t f1_r;

-+    /*!< c0_r */

-+    uint32_t c0_r;

-+    /*!< c1_r */

-+    uint32_t c1_r;

-+    /*!< splerp 1=Splerp mode, 0=Bilerp mode*/

-+    uint32_t splerp;

-+    /*!< color_mode 1=Color mode, use RGB Interpolation and Bayer demosaicing; 0 = Monochrome cameras bypass Bayer demosaicing and set RGB to constant.*/

-+    uint32_t color_mode;

-+    /*!< zero_coefficients Force address coefficients to register values in address generation for identity mode.*/

-+    uint32_t zero_coefficients;

-+    /*!< rcolumn Bayer pattern orientation, 1=red column, 0=blue column*/

-+    uint32_t rcolumn;

-+    /*!< rrow Bayer pattern orientation, 1=red row, 0=blue row*/

-+    uint32_t rrow;

-+    /*!< brown_model 0: A0 functionality; 1: select BrownModel, use val6 and val7 instead of val17 and val18*/

-+    uint32_t brown_model;

-+    /*!< identity_left_xcoeff */

-+    uint32_t identity_left_xcoeff;

-+    /*!< identity_left_ycoeff */

-+    uint32_t identity_left_ycoeff;

-+    /*!< identity_right_xcoeff */

-+    uint32_t identity_right_xcoeff;

-+    /*!< identity_right_ycoeff */

-+    uint32_t identity_right_ycoeff;

-+    /*!< pixels_per_line_rec Pixels per line in the rectified output image.*/

-+    uint32_t pixels_per_line_rec;

-+    /*!< lines_per_frame_rec Lines per frame in the rectified output image.*/

-+    uint32_t lines_per_frame_rec;

-+    /*!< pixels_per_line_in Pixels per line in the input image.*/

-+    uint32_t pixels_per_line_in;

-+    /*!< lines_per_frame_in Lines per frame in the input image.*/

-+    uint32_t lines_per_frame_in;

-+    /*!< exposuretopedge Top Edge limit for exposure control*/

-+    uint32_t exposuretopedge;

-+    /*!< exposurebottomedge Bottom Edge limit for exposure control*/

-+    uint32_t exposurebottomedge;

-+    /*!< exposureleftedge Left Edge limit for exposure control*/

-+    uint32_t exposureleftedge;

-+    /*!< exposurerightedge Right Edge limit for exposure control*/

-+    uint32_t exposurerightedge;

-+    /*!< exposureleftdarkthreshold Left camera dark threshold*/

-+    uint32_t exposureleftdarkthreshold;

-+    /*!< exposureleftbright_threshold Left camera maximum value*/

-+    uint32_t exposureleftbright_threshold;

-+    /*!< exposurerightdarkthreshold Right camera minimum value*/

-+    uint32_t exposurerightdarkthreshold;

-+    /*!< exposurerightbrightthreshold Right camera maximum value*/

-+    uint32_t exposurerightbrightthreshold;

-+    /*!< yuv_matrix_entry_00 */

-+    uint32_t yuv_matrix_entry_00;

-+    /*!< yuv_matrix_entry_10 */

-+    uint32_t yuv_matrix_entry_10;

-+    /*!< yuv_matrix_entry_20 */

-+    uint32_t yuv_matrix_entry_20;

-+    /*!< yuv_matrix_entry_30 */

-+    uint32_t yuv_matrix_entry_30;

-+    /*!< yuv_matrix_entry_01 */

-+    uint32_t yuv_matrix_entry_01;

-+    /*!< yuv_matrix_entry_11 */

-+    uint32_t yuv_matrix_entry_11;

-+    /*!< yuv_matrix_entry_21 */

-+    uint32_t yuv_matrix_entry_21;

-+    /*!< yuv_matrix_entry_31 */

-+    uint32_t yuv_matrix_entry_31;

-+    /*!< yuv_matrix_entry_02 */

-+    uint32_t yuv_matrix_entry_02;

-+    /*!< yuv_matrix_entry_12 */

-+    uint32_t yuv_matrix_entry_12;

-+    /*!< yuv_matrix_entry_22 */

-+    uint32_t yuv_matrix_entry_22;

-+    /*!< yuv_matrix_entry_32 */

-+    uint32_t yuv_matrix_entry_32;

-+    /*!< yuv_vector_0 */

-+    uint32_t yuv_vector_0;

-+    /*!< yuv_vector_1 */

-+    uint32_t yuv_vector_1;

-+    /*!< yuv_vector_2 */

-+    uint32_t yuv_vector_2;

-+

-+} ia_pal_isp_sdp_rec_t;

-+

-+/*! \isp struct sdp_scp

-+

-+*/

-+typedef struct

-+{

-+    /*!< remove_thresh Threshold for Outlier removal in RSM. 8bit integer (8.0)*/

-+    uint32_t remove_thresh;

-+    /*!< slo_rau_diff_thresh Threshold for SLO and RAU disparity difference in RSM. Fixed point 7bit (2.5)*/

-+    uint32_t slo_rau_diff_thresh;

-+    /*!< diff_thresh Threshold for SLO disparity difference to Center in RSM. Fixed point 8bit (3.5)*/

-+    uint32_t diff_thresh;

-+    /*!< rsm_bypass RSM Bypass mode. 1=Bypass (default). At Bypass mode, SLO disparity input will be bypassed to RSM disparity output.*/

-+    uint32_t rsm_bypass;

-+    /*!< rsm_bypass_cg Clock gate control for the block which is not used at RSM Bypass mode. 1=Clock gate. 0=Clock enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition.*/

-+    uint32_t rsm_bypass_cg;

-+    /*!< rsm_bypass_sd SRAM shutdown control for SRAM1 which is not used at RSM Bypass mode in RSM. 1=Shutdown. 0=Enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition. Also need to not read/write SRAM for 30 sclk cycle when SD goes low (waking up)*/

-+    uint32_t rsm_bypass_sd;

-+    /*!< additional_vblank Define number of scan line to add to 4 scan line censusPipeStall for V blank. When set N at this additional_vblank, censusPipeStall will be high for 4 + N scan line period for V blank. N can be set as 0 (default) to 15. For RSM bypass mode, please set 3. For RSM mode, please set 9.*/

-+    uint32_t additional_vblank;

-+    /*!< en_scp_local_clk_gate Enable SCP local clock gate for DS5-B0. 1=Enable (default). 0=Disable.*/

-+    uint32_t en_scp_local_clk_gate;

-+    /*!< en One bit per census pixel*/

-+    uint32_t en;

-+    /*!< width Number of pixels per line in the input/output images. Valid values 256 to 1280*/

-+    uint32_t width;

-+    /*!< height Number of lines in the input/output images. Valid values 40 to 1024*/

-+    uint32_t height;

-+    /*!< plus_increment This value is added to the running-median estimate of the estimate is below the sequentially-sampled correlation score.*/

-+    uint32_t plus_increment;

-+    /*!< minus_decrement This value is subtracted from the running-median estimate of the estimate is above the sequentially-sampled correlation score.*/

-+    uint32_t minus_decrement;

-+    /*!< score_thresh_a Contains a 10-bit binary number used directly as a threshold for the winning Left-Right score. Interest operator bit 0 asserts if the winning score is greater than or equal Score Thresh A .*/

-+    uint32_t score_thresh_a;

-+    /*!< score_thresh_b Contains a 12-bit binary threshold for the winning Left-Right score. Interest operator bit 1 asserts if the winning score is greater than Score Thresh B.*/

-+    uint32_t score_thresh_b;

-+    /*!< deepsea_neighbor_threshold Contains a 10-bit binary number compared against the difference of the pre (and post) score and the winning score. Interest operator bit 2 asserts if the post score is greater than Neighbor Threshold. Interest operator bit 3 asserts if the pre score is greater than Neighbor Threshold.*/

-+    uint32_t deepsea_neighbor_threshold;

-+    /*!< lr_agree_threshold Contain an 11-bit binary number used directly as LR threshold. Interest operator bit 8 asserts if difference between the LR and RL disparities are less than threshold.*/

-+    uint32_t lr_agree_threshold;

-+    /*!< lr_score_average_disable Disables the averaging of LR and RL scores when set.*/

-+    uint32_t lr_score_average_disable;

-+    /*!< texture_difference_threshold Bits 0..11 of the {Texture Thresh} configuration register contain a 12-bit binary number which is used directly. This value defines the threshold to use in the the Texture operator difference calculation.*/

-+    uint32_t texture_difference_threshold;

-+    /*!< texture_count_threshold Bits 12..17 of the {Texture Thresh} configuration register contain a 5-bit binary number which is used directly to compare to the count of the number of significantly different pixel locations in the active census kernel neighborhood.*/

-+    uint32_t texture_count_threshold;

-+    /*!< deepsea_second_peak_threshold Second Peak Threshold*/

-+    uint32_t deepsea_second_peak_threshold;

-+    /*!< deepsea_median_threshold Median Threshold*/

-+    uint32_t deepsea_median_threshold;

-+    /*!< or_mask_bits_zencoder0 Bits [15:0] are ORed with the Z output data to generate prs_dout*/

-+    uint32_t or_mask_bits_zencoder0;

-+    /*!< and_mask_bits_zencoder0 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/

-+    uint32_t and_mask_bits_zencoder0;

-+    /*!< or_mask_bits_zencoder1 Bits [15:0] are ORed with the Z output data to generate prs_dout*/

-+    uint32_t or_mask_bits_zencoder1;

-+    /*!< and_mask_bits_zencoder1 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/

-+    uint32_t and_mask_bits_zencoder1;

-+    /*!< minwest Sets the left Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minWest defines the west offset for a fixed region.*/

-+    uint32_t minwest;

-+    /*!< mineast Sets the right Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minEast defines the east offset for a fixed region.*/

-+    uint32_t mineast;

-+    /*!< minwesum Sets the horizontal sum minimum, usually leftMin + rightMin +1. Valid values 3 through 15.*/

-+    uint32_t minwesum;

-+    /*!< minnorth Sets the up vertical minimimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minNorth defines the north offset for a fixed region.*/

-+    uint32_t minnorth;

-+    /*!< minsouth Sets the down Vertical Minimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minSouth defines the south offset for a fixed region.*/

-+    uint32_t minsouth;

-+    /*!< minnssum Sets the vertical sum minimum- usually upMin+downMin+1. Valid values 1 through 7.*/

-+    uint32_t minnssum;

-+    /*!< ushrink Sets the horizontal shrink factor. Valid values 0 through 4.*/

-+    uint32_t ushrink;

-+    /*!< vshrink Sets the vertical shrink factor. Valid values 0 and 1.*/

-+    uint32_t vshrink;

-+    /*!< disablesadcolor Disables Sum of Absolute Differences function*/

-+    uint32_t disablesadcolor;

-+    /*!< disableraucolor disable RAU color function and use region defined by minimum support vectors*/

-+    uint32_t disableraucolor;

-+    /*!< disableslorightcolor disable SLO right image color function and use default penalties*/

-+    uint32_t disableslorightcolor;

-+    /*!< disablesloleftcolor disable SLO left image color function and use default penalties*/

-+    uint32_t disablesloleftcolor;

-+    /*!< disablesadnormalize In the SAD function, disable normalization and use the unmodified RGB values.*/

-+    uint32_t disablesadnormalize;

-+    /*!< raudiffthresholdred Sets the RAU color difference comparison threshold for the Red component.*/

-+    uint32_t raudiffthresholdred;

-+    /*!< raudiffthresholdgreen Sets the RAU color difference comparison threshold for the Green component.*/

-+    uint32_t raudiffthresholdgreen;

-+    /*!< raudiffthresholdblue Sets the RAU color difference comparison threshold for the Blue component.*/

-+    uint32_t raudiffthresholdblue;

-+    /*!< diffthresholdred Sets the SLO color difference comparison threshold for the Red component.*/

-+    uint32_t diffthresholdred;

-+    /*!< diffthresholdgreen Sets the SLO color difference comparison threshold for the Green component.*/

-+    uint32_t diffthresholdgreen;

-+    /*!< diffthresholdblue Sets the SLO color difference comparison threshold for the Blue component.*/

-+    uint32_t diffthresholdblue;

-+    /*!< k1penalty Sets the SLO K1 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

-+    uint32_t k1penalty;

-+    /*!< k2penalty Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

-+    uint32_t k2penalty;

-+    /*!< k1penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

-+    uint32_t k1penaltymod1;

-+    /*!< k1penaltymod2 Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

-+    uint32_t k1penaltymod2;

-+    /*!< k2penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

-+    uint32_t k2penaltymod1;

-+    /*!< k2penaltymod2 Sets the SLO K2 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

-+    uint32_t k2penaltymod2;

-+    /*!< data_range_lookup[16384] Data is the 16 bit range value*/

-+    uint32_t data_range_lookup[16384];

-+

-+} ia_pal_isp_sdp_scp_t;

-+

-+/*! \isp struct see

-+

-+*/

-+typedef struct

-+{

-+    /*!< Alpha_LUT[64] edge enhance gain*/

-+    int32_t Alpha_LUT[64];

-+    /*!< Edge_Max max edge value for clamping*/

-+    int32_t Edge_Max;

-+    /*!< Edge_Thres threshold for coring*/

-+    int32_t Edge_Thres;

-+

-+} ia_pal_isp_see_t;

-+

-+/*! \isp struct see2

-+

-+*/

-+typedef struct

-+{

-+    /*!< Alpha_LUT[64] edge enhance gain*/

-+    int32_t Alpha_LUT[64];

-+    /*!< Edge_Max max edge value for clamping*/

-+    int32_t Edge_Max;

-+    /*!< Edge_Thres threshold for coring*/

-+    int32_t Edge_Thres;

-+

-+} ia_pal_isp_see2_t;

-+

-+/*! \isp struct sharpening_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable sharpening*/

-+    int32_t enable;

-+

-+} ia_pal_isp_sharpening_1_0_t;

-+

-+/*! \isp struct sie_vcsc1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< csc_enable csc_bypass*/

-+    int32_t csc_enable;

-+    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

-+    int32_t csc_matrix[9];

-+    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

-+    int32_t csc_matrix_norm;

-+    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

-+    int32_t csc_bias_vec[3];

-+    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

-+    int32_t cds_coeff_array[8];

-+    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

-+    int32_t cds_coeff_array_norm;

-+

-+} ia_pal_isp_sie_vcsc1_1_t;

-+

-+/*! \isp struct sis_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable 0- disable filter. 1- enable filter.*/

-+    int32_t enable;

-+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

-+    int32_t DSF;

-+

-+} ia_pal_isp_sis_1_t;

-+

-+/*! \isp struct sis_1_0_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable 0- disable filter. 1- enable filter.*/

-+    int32_t enable;

-+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

-+    int32_t DSF;

-+

-+} ia_pal_isp_sis_1_0_a_t;

-+

-+/*! \isp struct sis_1_0_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable 0- disable filter. 1- enable filter.*/

-+    int32_t enable;

-+    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

-+    int32_t DSF;

-+

-+} ia_pal_isp_sis_1_0_b_t;

-+

-+/*! \isp struct spa_sis_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixinprec;

-+    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixoutprec;

-+    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

-+    int32_t m_pixminprec;

-+    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

-+    int32_t m_isbayer;

-+    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

-+    int32_t m_cliptous;

-+    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

-+    int32_t m_shiftlen;

-+    /*!< m_shiftval Shift Value {0..7}*/

-+    int32_t m_shiftval;

-+

-+} ia_pal_isp_spa_sis_a_t;

-+

-+/*! \isp struct stream2mmio

-+Stream2mmio

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass bypass*/

-+    int32_t m_bypass;

-+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

-+    int32_t m_TopCrop;

-+

-+} ia_pal_isp_stream2mmio_t;

-+

-+/*! \isp struct stream2mmio_b

-+Stream2mmio

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass bypass*/

-+    int32_t m_bypass;

-+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

-+    int32_t m_TopCrop;

-+

-+} ia_pal_isp_stream2mmio_b_t;

-+

-+/*! \isp struct stream2mmio_c

-+Stream2mmio

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass bypass*/

-+    int32_t m_bypass;

-+    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

-+    int32_t m_TopCrop;

-+

-+} ia_pal_isp_stream2mmio_c_t;

-+

-+/*! \isp struct strm_crop_psa

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_t;

-+

-+/*! \isp struct strm_crop_psa_c

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA C Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_c_t;

-+

-+/*! \isp struct strm_crop_psa_d

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA D Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_d_t;

-+

-+/*! \isp struct strm_crop_psa_e

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA E Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_e_t;

-+

-+/*! \isp struct strm_crop_psa_f

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA J Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_f_t;

-+

-+/*! \isp struct strm_crop_psa_g

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA G Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_g_t;

-+

-+/*! \isp struct strm_crop_psa_h

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable PSA H Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_psa_h_t;

-+

-+/*! \isp struct strm_crop_sis_a

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable pre SIS crop*/

-+    int32_t enable;

-+    /*!< crop_col_start crop_col_start*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_sis_a_t;

-+

-+/*! \isp struct strm_crop_sis_b

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable post SIS Crop*/

-+    int32_t enable;

-+    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

-+    int32_t crop_col_start;

-+    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

-+    int32_t crop_row_start;

-+    /*!< crop_col_end End column of image data (excess will be cropped)*/

-+    int32_t crop_col_end;

-+    /*!< crop_row_end End line of image data (excess will be cropped)*/

-+    int32_t crop_row_end;

-+

-+} ia_pal_isp_strm_crop_sis_b_t;

-+

-+/*! \isp struct sve_1_0

-+SVE

-+*/

-+typedef struct

-+{

-+    /*!< enable enable*/

-+    int32_t enable;

-+    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/

-+    int32_t sve_bayer_pattern_cropped_mask_bit[16];

-+    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/

-+    int32_t label_long_pixels_mask;

-+    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/

-+    int32_t max_saturation_val;

-+    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/

-+    int32_t wb_multiplied_etr[16];

-+    /*!< max_input_val U.0.20 - max value of input pixel*/

-+    int32_t max_input_val;

-+    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta0[16];

-+    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta1[16];

-+    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta2[16];

-+    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/

-+    int32_t wb_etr_post_noise_clip_negative[16];

-+    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/

-+    int32_t etr_noise_norm_shift[16];

-+    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/

-+    int32_t sve_bayer_pattern_cropped_mask[16];

-+    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/

-+    int32_t interp_kernels_arr[64];

-+    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/

-+    int32_t interp_max_weight_th;

-+    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/

-+    int32_t interp_bayer_pattern_mask;

-+    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t short_blur_kernels_arr[144];

-+    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/

-+    int32_t short_blur_sow_th;

-+    /*!< short_blur_power U.1.7 power for pixel blur*/

-+    int32_t short_blur_power;

-+    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t content_short_kernels_arr[144];

-+    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t content_long_kernels_arr[144];

-+    /*!< motion_short_g_th U.0.15 threshold for content*/

-+    int32_t motion_short_g_th;

-+    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/

-+    int32_t motion_detector_gain;

-+    /*!< motion_detector_power U.1.7 motion detector power for content*/

-+    int32_t motion_detector_power;

-+    /*!< signal_detector_power U.1.7 signal detector power for content*/

-+    int32_t signal_detector_power;

-+    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/

-+    int32_t signal_detector_gain;

-+    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/

-+    int32_t enable_wh_interp;

-+    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/

-+    int32_t enable_wv_interp;

-+    /*!< cu_blend_x[4] U.20 cu_blend_x*/

-+    int32_t cu_blend_x[4];

-+    /*!< cu_blend_y[3] U.11 cu_compression_y*/

-+    int32_t cu_blend_y[3];

-+    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/

-+    int32_t cu_blend_slope[3];

-+    /*!< cu_compression_x[8] U.20 cu_compression_x*/

-+    int32_t cu_compression_x[8];

-+    /*!< cu_compression_y[7] U.15 cu_compression_y*/

-+    int32_t cu_compression_y[7];

-+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/

-+    int32_t cu_compression_slope[7];

-+    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/

-+    int32_t long_burnt_dilut_mode;

-+    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/

-+    int32_t max_resolution_quantization_th;

-+    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/

-+    int32_t rad_enable;

-+    /*!< rad_x_center U.13.0 rad_x_center*/

-+    int32_t rad_x_center;

-+    /*!< rad_y_center U.13.0 rad_y_center*/

-+    int32_t rad_y_center;

-+    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/

-+    int32_t rad_norm_shift;

-+    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/

-+    int32_t rad_lut_4_channels[256];

-+

-+} ia_pal_isp_sve_1_0_t;

-+

-+/*! \isp struct sve_1_1

-+SVE

-+*/

-+typedef struct

-+{

-+    /*!< enable enable*/

-+    int32_t enable;

-+    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/

-+    int32_t sve_bayer_pattern_cropped_mask_bit[16];

-+    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/

-+    int32_t label_long_pixels_mask;

-+    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/

-+    int32_t max_saturation_val;

-+    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/

-+    int32_t wb_multiplied_etr[16];

-+    /*!< max_input_val U.0.20 - max value of input pixel*/

-+    int32_t max_input_val;

-+    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta0[16];

-+    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta1[16];

-+    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/

-+    int32_t wb_etr_post_noise_beta2[16];

-+    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/

-+    int32_t wb_etr_post_noise_clip_negative[16];

-+    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/

-+    int32_t etr_noise_norm_shift[16];

-+    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/

-+    int32_t sve_bayer_pattern_cropped_mask[16];

-+    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/

-+    int32_t interp_kernels_arr[64];

-+    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/

-+    int32_t interp_max_weight_th;

-+    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/

-+    int32_t interp_bayer_pattern_mask;

-+    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t short_blur_kernels_arr[144];

-+    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/

-+    int32_t short_blur_sow_th;

-+    /*!< short_blur_power U.1.7 power for pixel blur*/

-+    int32_t short_blur_power;

-+    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t content_short_kernels_arr[144];

-+    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

-+    int32_t content_long_kernels_arr[144];

-+    /*!< motion_short_g_th U.0.15 threshold for content*/

-+    int32_t motion_short_g_th;

-+    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/

-+    int32_t motion_detector_gain;

-+    /*!< motion_detector_power U.1.7 motion detector power for content*/

-+    int32_t motion_detector_power;

-+    /*!< signal_detector_power U.1.7 signal detector power for content*/

-+    int32_t signal_detector_power;

-+    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/

-+    int32_t signal_detector_gain;

-+    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/

-+    int32_t enable_wh_interp;

-+    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/

-+    int32_t enable_wv_interp;

-+    /*!< cu_blend_x[4] U.20 cu_blend_x*/

-+    int32_t cu_blend_x[4];

-+    /*!< cu_blend_y[3] U.11 cu_compression_y*/

-+    int32_t cu_blend_y[3];

-+    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/

-+    int32_t cu_blend_slope[3];

-+    /*!< cu_compression_x[8] U.20 cu_compression_x*/

-+    int32_t cu_compression_x[8];

-+    /*!< cu_compression_y[7] U.15 cu_compression_y*/

-+    int32_t cu_compression_y[7];

-+    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/

-+    int32_t cu_compression_slope[7];

-+    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/

-+    int32_t long_burnt_dilut_mode;

-+    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/

-+    int32_t max_resolution_quantization_th;

-+    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/

-+    int32_t rad_enable;

-+    /*!< rad_x_center U.13.0 rad_x_center*/

-+    int32_t rad_x_center;

-+    /*!< rad_y_center U.13.0 rad_y_center*/

-+    int32_t rad_y_center;

-+    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/

-+    int32_t rad_norm_shift;

-+    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/

-+    int32_t rad_lut_4_channels[256];

-+    /*!< enable_four_cell U.1 Allows the block to work in 4Cell mode*/

-+    int32_t enable_four_cell;

-+    /*!< four_cell_pattern[16] 4Cell pattern of CFA and exposures, 0-3 - RGGB short, 4-7 - RGGB long*/

-+    int32_t four_cell_pattern[16];

-+

-+} ia_pal_isp_sve_1_1_t;

-+

-+/*! \isp struct tnr_6_0

-+Hardware fixed-function temporal noise reduction

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< feedback_image_bittage bit reduction in feedback loop*/

-+    int32_t feedback_image_bittage;

-+    /*!< spatial_luma_kernel[25] Spatial filtering spatial kernel (Luma, 5x5)*/

-+    int32_t spatial_luma_kernel[25];

-+    /*!< spatial_chroma_kernel[9] Spatial filtering spatial kernel (Chroma, 3x3)*/

-+    int32_t spatial_chroma_kernel[9];

-+    /*!< spatial_luma_denoise_control Control weight deviation in Luma spatial denoising*/

-+    int32_t spatial_luma_denoise_control;

-+    /*!< spatial_chroma_denoise_luma_control Control weight deviation in Chroma spatial denoising*/

-+    int32_t spatial_chroma_denoise_luma_control;

-+    /*!< spatial_chroma_denoise_chroma_control Control weight deviation in Chroma spatial denoising*/

-+    int32_t spatial_chroma_denoise_chroma_control;

-+    /*!< blending_inlier_th_motion blending:*/

-+    int32_t blending_inlier_th_motion;

-+    /*!< blending_inlier_th_static blending:*/

-+    int32_t blending_inlier_th_static;

-+    /*!< blending_inlier_gain blending:*/

-+    int32_t blending_inlier_gain;

-+    /*!< blending_da_rec_sim_motion_knees[2] blending:*/

-+    int32_t blending_da_rec_sim_motion_knees[2];

-+    /*!< blending_da_rec_sim_motion_a[2] blending:*/

-+    int32_t blending_da_rec_sim_motion_a[2];

-+    /*!< blending_da_rec_sim_motion_b[2] blending:*/

-+    int32_t blending_da_rec_sim_motion_b[2];

-+    /*!< blending_da_rec_sim_static_knees[2] blending:*/

-+    int32_t blending_da_rec_sim_static_knees[2];

-+    /*!< blending_da_rec_sim_static_a[2] blending:*/

-+    int32_t blending_da_rec_sim_static_a[2];

-+    /*!< blending_da_rec_sim_static_b[2] blending:*/

-+    int32_t blending_da_rec_sim_static_b[2];

-+    /*!< blending_da_winp_knees[2] blending:*/

-+    int32_t blending_da_winp_knees[2];

-+    /*!< blending_da_winp_a[2] blending:*/

-+    int32_t blending_da_winp_a[2];

-+    /*!< blending_da_winp_b[2] blending:*/

-+    int32_t blending_da_winp_b[2];

-+    /*!< sharpening_rec_sim_damp sharpening: rec-sim based damping*/

-+    int32_t sharpening_rec_sim_damp;

-+    /*!< sharpening_texture_coeff_norm sharpening: texture metric normalization power*/

-+    int32_t sharpening_texture_coeff_norm;

-+    /*!< sharpening_texture_undershoot sharpening: allowed undershoot for textured pixels*/

-+    int32_t sharpening_texture_undershoot;

-+    /*!< sharpening_edge_undershoot sharpening: allowed undershoot for edge pixels*/

-+    int32_t sharpening_edge_undershoot;

-+    /*!< sharpening_texture_overshoot sharpening: allowed overshoot for textured pixels*/

-+    int32_t sharpening_texture_overshoot;

-+    /*!< sharpening_edge_overshoot sharpening: allowed overshoot for edge pixels*/

-+    int32_t sharpening_edge_overshoot;

-+    /*!< sharpening_undershoot_power sharpening: undershoot enhancement. To enhance use positive, to weaken use a negative.*/

-+    int32_t sharpening_undershoot_power;

-+    /*!< sharpening_overshoot_power sharpening: overshoot enhancement. To enhance use positive, to weaken use a negative.*/

-+    int32_t sharpening_overshoot_power;

-+    /*!< sharpening_cu_x_points_pos_th[6] sharpening: x points for overshoot config unit*/

-+    int32_t sharpening_cu_x_points_pos_th[6];

-+    /*!< sharpening_cu_a_points_pos_th[5] sharpening: a points for overshoot config unit*/

-+    int32_t sharpening_cu_a_points_pos_th[5];

-+    /*!< sharpening_cu_b_points_pos_th[5] sharpening: b points for overshoot config unit*/

-+    int32_t sharpening_cu_b_points_pos_th[5];

-+    /*!< sharpening_cu_x_points_neg_th[6] sharpening: x points for undershoot config unit*/

-+    int32_t sharpening_cu_x_points_neg_th[6];

-+    /*!< sharpening_cu_a_points_neg_th[5] sharpening: a points for undershoot config unit*/

-+    int32_t sharpening_cu_a_points_neg_th[5];

-+    /*!< sharpening_cu_b_points_neg_th[5] sharpening: b points for undershoot config unit*/

-+    int32_t sharpening_cu_b_points_neg_th[5];

-+    /*!< sharpening_cu_x_points_pixval_th[6] sharpening: x points for pixel value config unit*/

-+    int32_t sharpening_cu_x_points_pixval_th[6];

-+    /*!< sharpening_cu_a_points_pixval_th[5] sharpening: a points for pixel value config unit*/

-+    int32_t sharpening_cu_a_points_pixval_th[5];

-+    /*!< sharpening_cu_b_points_pixval_th[5] sharpening: b points for pixel value config unit*/

-+    int32_t sharpening_cu_b_points_pixval_th[5];

-+    /*!< sharpening_cu_x_points_noise_th[6] sharpening: x points for noise th config unit*/

-+    int32_t sharpening_cu_x_points_noise_th[6];

-+    /*!< sharpening_cu_a_points_noise_th[5] sharpening: a  points for noise th config unit*/

-+    int32_t sharpening_cu_a_points_noise_th[5];

-+    /*!< sharpening_cu_b_points_noise_th[5] sharpening: b  points for noise th config unit*/

-+    int32_t sharpening_cu_b_points_noise_th[5];

-+    /*!< sharpening_kernel_coeffs[6] sharpening: kernel coefficients*/

-+    int32_t sharpening_kernel_coeffs[6];

-+    /*!< op_fragment_width fragmentation*/

-+    int32_t op_fragment_width;

-+    /*!< op_fragment_height fragmentation*/

-+    int32_t op_fragment_height;

-+    /*!< start_block_id_X fragmentation*/

-+    int32_t start_block_id_X;

-+    /*!< start_block_id_Y fragmentation*/

-+    int32_t start_block_id_Y;

-+    /*!< frame_width fragmentation*/

-+    int32_t frame_width;

-+    /*!< frame_height fragmentation*/

-+    int32_t frame_height;

-+    /*!< tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type bit reduction in feedback loop*/

-+    int32_t tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type;

-+    /*!< output_bpp bit reduction in feedback loop*/

-+    int32_t output_bpp;

-+

-+} ia_pal_isp_tnr_6_0_t;

-+

-+/*! \isp struct tnr_scale_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enable TNR_SCALE_1_0 filter*/

-+    int32_t enable;

-+    /*!< inWidth Number of pixels per row at output*/

-+    int32_t inWidth;

-+    /*!< inHeight Number of rows at output*/

-+    int32_t inHeight;

-+    /*!< bitReductionBypass bypass of bit reduction of input pixels*/

-+    int32_t bitReductionBypass;

-+    /*!< inputShift shift on input pixels*/

-+    int32_t inputShift;

-+    /*!< cu_bit_reduce_x[6] input bit reduction config unit - x values*/

-+    int32_t cu_bit_reduce_x[6];

-+    /*!< cu_bit_reduce_y[5] input bit reduction config unit - y values*/

-+    int32_t cu_bit_reduce_y[5];

-+    /*!< cu_bit_reduce_slope[5] input bit reduction config unit - slope values*/

-+    int32_t cu_bit_reduce_slope[5];

-+

-+} ia_pal_isp_tnr_scale_1_0_t;

-+

-+/*! \isp struct tnr5_21

-+

-+*/

-+typedef struct

-+{

-+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

-+    int32_t NM_Rad2_Shift;

-+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

-+    int32_t nm_radial_y_center;

-+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_R_xcu[128] LUT for radial noise model*/

-+    int32_t nm_R_xcu[128];

-+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

-+    int32_t nm_YY_xcu[64];

-+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

-+    int32_t nm_YC_xcu[64];

-+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

-+    int32_t nm_CY_xcu[64];

-+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

-+    int32_t nm_CC_xcu[64];

-+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

-+    int32_t nm_Y_log_est_min;

-+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

-+    int32_t nm_Y_log_est_max;

-+    /*!< nm_C_log_est_min Min value for log space C noise model*/

-+    int32_t nm_C_log_est_min;

-+    /*!< nm_C_log_est_max Max value for log space C noise model*/

-+    int32_t nm_C_log_est_max;

-+    /*!< nm_lut_frac Fractional bit for noise model LUT*/

-+    int32_t nm_lut_frac;

-+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

-+    int32_t nm_idx_frac;

-+    /*!< nm_pow[64] LUT for power function*/

-+    int32_t nm_pow[64];

-+    /*!< nm_pow_frac Fractional bit for POW LUT*/

-+    int32_t nm_pow_frac;

-+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

-+    int32_t nm_shift_num;

-+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

-+    int32_t nm_Y_alpha;

-+    /*!< nm_C_alpha Scaling coefficient for C noise model*/

-+    int32_t nm_C_alpha;

-+    /*!< co_var_thres Variance threshold*/

-+    int32_t co_var_thres;

-+    /*!< co_var_gain Variance gain*/

-+    int32_t co_var_gain;

-+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

-+    int32_t tbd_sad_Y_gain;

-+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

-+    int32_t tbd_sim_arg_gain_m;

-+    /*!< tbd_con_thres Content level threshold*/

-+    int32_t tbd_con_thres;

-+    /*!< tbd_con_gain Content level gain*/

-+    int32_t tbd_con_gain;

-+    /*!< tbd_sim_lut[64] Similarity LUT*/

-+    int32_t tbd_sim_lut[64];

-+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

-+    int32_t tbd_rec_sim_thres;

-+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

-+    int32_t tbd_rec_gain0;

-+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

-+    int32_t tbd_rec_gain1;

-+    /*!< pb_weight_in input weight*/

-+    int32_t pb_weight_in;

-+    /*!< pb_weight_pre_max max weight of temporal filter output*/

-+    int32_t pb_weight_pre_max;

-+    /*!< pb_weight_sp_thres Spatial filter weight threshold*/

-+    int32_t pb_weight_sp_thres;

-+    /*!< pb_weight_sp_gain Spatial filter weight gain*/

-+    int32_t pb_weight_sp_gain;

-+    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/

-+    int32_t pb_weight_sp_max0;

-+    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/

-+    int32_t pb_weight_sp_max1;

-+    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/

-+    int32_t NS_weight_LUT[64];

-+    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/

-+    int32_t NS_ConLv_w_LUT[64];

-+    /*!< NS_out_max Max value for clipping noise stream*/

-+    int32_t NS_out_max;

-+    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/

-+    int32_t NS_Norm_bias;

-+    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/

-+    int32_t NS_Norm_coef;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< framenumber frame number*/

-+    int32_t framenumber;

-+    /*!< g_mv_x global  MV_X*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y*/

-+    int32_t g_mv_y;

-+    /*!< bypass_NS bypass noise stream*/

-+    int32_t bypass_NS;

-+

-+} ia_pal_isp_tnr5_21_t;

-+

-+/*! \isp struct tnr5_22

-+

-+*/

-+typedef struct

-+{

-+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

-+    int32_t NM_Rad2_Shift;

-+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

-+    int32_t nm_radial_y_center;

-+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_R_xcu[128] LUT for radial noise model*/

-+    int32_t nm_R_xcu[128];

-+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

-+    int32_t nm_YY_xcu[64];

-+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

-+    int32_t nm_YC_xcu[64];

-+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

-+    int32_t nm_CY_xcu[64];

-+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

-+    int32_t nm_CC_xcu[64];

-+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

-+    int32_t nm_Y_log_est_min;

-+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

-+    int32_t nm_Y_log_est_max;

-+    /*!< nm_C_log_est_min Min value for log space C noise model*/

-+    int32_t nm_C_log_est_min;

-+    /*!< nm_C_log_est_max Max value for log space C noise model*/

-+    int32_t nm_C_log_est_max;

-+    /*!< nm_lut_frac Fractional bit for noise model LUT*/

-+    int32_t nm_lut_frac;

-+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

-+    int32_t nm_idx_frac;

-+    /*!< nm_pow_Y[64] LUT for power function for Y*/

-+    int32_t nm_pow_Y[64];

-+    /*!< nm_pow_C[64] LUT for power function for C*/

-+    int32_t nm_pow_C[64];

-+    /*!< nm_pow_frac Fractional bit for POW LUT*/

-+    int32_t nm_pow_frac;

-+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

-+    int32_t nm_shift_num;

-+    /*!< co_var_thres Variance threshold*/

-+    int32_t co_var_thres;

-+    /*!< co_var_gain Variance gain*/

-+    int32_t co_var_gain;

-+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

-+    int32_t tbd_sad_Y_gain;

-+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

-+    int32_t tbd_sim_arg_gain_m;

-+    /*!< tbd_con_thres Content level threshold*/

-+    int32_t tbd_con_thres;

-+    /*!< tbd_con_gain Content level gain*/

-+    int32_t tbd_con_gain;

-+    /*!< tbd_sim_lut[64] Similarity LUT*/

-+    int32_t tbd_sim_lut[64];

-+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

-+    int32_t tbd_rec_sim_thres;

-+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

-+    int32_t tbd_rec_gain0;

-+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

-+    int32_t tbd_rec_gain1;

-+    /*!< pb_weight_in input weight*/

-+    int32_t pb_weight_in;

-+    /*!< pb_weight_pre_max max weight of temporal filter output*/

-+    int32_t pb_weight_pre_max;

-+    /*!< pb_weight_sp_thres Spatial filter weight threshold*/

-+    int32_t pb_weight_sp_thres;

-+    /*!< pb_weight_sp_gain Spatial filter weight gain*/

-+    int32_t pb_weight_sp_gain;

-+    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/

-+    int32_t pb_weight_sp_max0;

-+    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/

-+    int32_t pb_weight_sp_max1;

-+    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/

-+    int32_t NS_weight_LUT[64];

-+    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/

-+    int32_t NS_ConLv_w_LUT[64];

-+    /*!< NS_out_max Max value for clipping noise stream*/

-+    int32_t NS_out_max;

-+    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/

-+    int32_t NS_Norm_bias;

-+    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/

-+    int32_t NS_Norm_coef;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< framenumber frame number*/

-+    int32_t framenumber;

-+    /*!< g_mv_x global  MV_X*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y*/

-+    int32_t g_mv_y;

-+    /*!< bypass_NS bypass noise stream*/

-+    int32_t bypass_NS;

-+

-+} ia_pal_isp_tnr5_22_t;

-+

-+/*! \isp struct tnr5_25

-+

-+*/

-+typedef struct

-+{

-+    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

-+    int32_t NM_Rad2_Shift;

-+    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

-+    int32_t nm_radial_y_center;

-+    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_R_xcu[128] LUT for radial noise model*/

-+    int32_t nm_R_xcu[128];

-+    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

-+    int32_t nm_YY_xcu[64];

-+    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

-+    int32_t nm_YC_xcu[64];

-+    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

-+    int32_t nm_CY_xcu[64];

-+    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

-+    int32_t nm_CC_xcu[64];

-+    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

-+    int32_t nm_Y_log_est_min;

-+    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

-+    int32_t nm_Y_log_est_max;

-+    /*!< nm_C_log_est_min Min value for log space C noise model*/

-+    int32_t nm_C_log_est_min;

-+    /*!< nm_C_log_est_max Max value for log space C noise model*/

-+    int32_t nm_C_log_est_max;

-+    /*!< nm_lut_frac Fractional bit for noise model LUT*/

-+    int32_t nm_lut_frac;

-+    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

-+    int32_t nm_idx_frac;

-+    /*!< nm_pow[64] LUT for power function*/

-+    int32_t nm_pow[64];

-+    /*!< nm_pow_frac Fractional bit for POW LUT*/

-+    int32_t nm_pow_frac;

-+    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

-+    int32_t nm_shift_num;

-+    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

-+    int32_t nm_Y_alpha;

-+    /*!< nm_C_alpha Scaling coefficient for C noise model*/

-+    int32_t nm_C_alpha;

-+    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

-+    int32_t tbd_sad_Y_gain;

-+    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

-+    int32_t tbd_sim_arg_gain_m;

-+    /*!< tbd_sim_lut[64] Similarity LUT*/

-+    int32_t tbd_sim_lut[64];

-+    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

-+    int32_t tbd_rec_sim_thres;

-+    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

-+    int32_t tbd_rec_gain0;

-+    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

-+    int32_t tbd_rec_gain1;

-+    /*!< pb_weight_in input weight*/

-+    int32_t pb_weight_in;

-+    /*!< pb_weight_pre_max max weight of temporal filter output*/

-+    int32_t pb_weight_pre_max;

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< framenumber frame number*/

-+    int32_t framenumber;

-+    /*!< g_mv_x global  MV_X*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y*/

-+    int32_t g_mv_y;

-+

-+} ia_pal_isp_tnr5_25_t;

-+

-+/*! \isp struct tnr5_3

-+

-+*/

-+typedef struct

-+{

-+    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/

-+    int32_t nm_luma_lut[256];

-+    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/

-+    int32_t nm_chroma_lut[256];

-+    /*!< nm_radial_lut[128] Noise model radial Lut*/

-+    int32_t nm_radial_lut[128];

-+    /*!< nm_radial_r2_shift Noise model radial shift*/

-+    int32_t nm_radial_r2_shift;

-+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

-+    int32_t nm_radial_y_center;

-+    /*!< co_max_content maximal value for the content*/

-+    int32_t co_max_content;

-+    /*!< co_content_shift shift right for content*/

-+    int32_t co_content_shift;

-+    /*!< fm_bma_sad_shift shift value for the BMA*/

-+    int32_t fm_bma_sad_shift;

-+    /*!< fm_chroma_shift shift value for chroma in fmve*/

-+    int32_t fm_chroma_shift;

-+    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/

-+    int32_t fm_sim_lut[256];

-+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

-+    int32_t fm_dist_weights[128];

-+    /*!< mvd_sim_lut[256] MVD Similarity LUT*/

-+    int32_t mvd_sim_lut[256];

-+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

-+    int32_t mvd_sad_shift;

-+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

-+    int32_t mvd_arg_g_static;

-+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

-+    int32_t mvd_arg_g_static_local;

-+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

-+    int32_t mvd_arg_g_move;

-+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

-+    int32_t mvd_arg_g_move_local;

-+    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/

-+    int32_t mvd_chroma_l_shift;

-+    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/

-+    int32_t mvd_central_pix_l_shift;

-+    /*!< spnr_range_lut[7] range lut for the BFA*/

-+    int32_t spnr_range_lut[7];

-+    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/

-+    int32_t spnr_spatial_lut[25];

-+    /*!< spnr_shift shift value for the BFA*/

-+    int32_t spnr_shift;

-+    /*!< spnr_nm_shift shift value for the noise model of SPNR*/

-+    int32_t spnr_nm_shift;

-+    /*!< pb_weight_pre_max maximal spTNR weight*/

-+    int32_t pb_weight_pre_max;

-+    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/

-+    int32_t pb_weight_spnr_max;

-+    /*!< g_mv_x global  MV_X. Should be in PAL*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y. Should be in PAL*/

-+    int32_t g_mv_y;

-+

-+} ia_pal_isp_tnr5_3_t;

-+

-+/*! \isp struct tnr5_3_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/

-+    int32_t nm_luma_lut[256];

-+    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/

-+    int32_t nm_chroma_lut[256];

-+    /*!< nm_radial_lut[128] Noise model radial Lut*/

-+    int32_t nm_radial_lut[128];

-+    /*!< nm_radial_r2_shift Noise model radial shift*/

-+    int32_t nm_radial_r2_shift;

-+    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

-+    int32_t nm_radial_x_center;

-+    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

-+    int32_t nm_radial_y_center;

-+    /*!< co_max_content maximal value for the content*/

-+    int32_t co_max_content;

-+    /*!< co_content_shift shift right for content*/

-+    int32_t co_content_shift;

-+    /*!< fm_bma_sad_shift shift value for the BMA*/

-+    int32_t fm_bma_sad_shift;

-+    /*!< fm_chroma_shift shift value for chroma in fmve*/

-+    int32_t fm_chroma_shift;

-+    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/

-+    int32_t fm_sim_lut[256];

-+    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

-+    int32_t fm_dist_weights[128];

-+    /*!< mvd_sim_lut[256] MVD Similarity LUT*/

-+    int32_t mvd_sim_lut[256];

-+    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

-+    int32_t mvd_sad_shift;

-+    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

-+    int32_t mvd_arg_g_static;

-+    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

-+    int32_t mvd_arg_g_static_local;

-+    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

-+    int32_t mvd_arg_g_move;

-+    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

-+    int32_t mvd_arg_g_move_local;

-+    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/

-+    int32_t mvd_chroma_l_shift;

-+    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/

-+    int32_t mvd_central_pix_l_shift;

-+    /*!< spnr_range_lut[7] range lut for the BFA*/

-+    int32_t spnr_range_lut[7];

-+    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/

-+    int32_t spnr_spatial_lut[25];

-+    /*!< spnr_shift shift value for the BFA*/

-+    int32_t spnr_shift;

-+    /*!< spnr_nm_shift shift value for the noise model of SPNR*/

-+    int32_t spnr_nm_shift;

-+    /*!< pb_weight_pre_max maximal spTNR weight*/

-+    int32_t pb_weight_pre_max;

-+    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/

-+    int32_t pb_weight_spnr_max;

-+    /*!< g_mv_x global  MV_X. Should be in PAL*/

-+    int32_t g_mv_x;

-+    /*!< g_mv_y global  MV_Y. Should be in PAL*/

-+    int32_t g_mv_y;

-+

-+} ia_pal_isp_tnr5_3_1_t;

-+

-+/*! \isp struct tnr7_bc_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable block enable*/

-+    int32_t enable;

-+    /*!< is_first_frame If first frame, ignore input rec-sim*/

-+    int32_t is_first_frame;

-+    /*!< do_update Limit of S&R parameter update mechanism*/

-+    int32_t do_update;

-+    /*!< coeffs[3] Per-region mult-and-clamp coefficients*/

-+    int32_t coeffs[3];

-+    /*!< coeffs_user[3] Per-region mult-and-clamp coefficients (specified by user during offline calibration)*/

-+    int32_t coeffs_user[3];

-+    /*!< gpu_mode meta parameter controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/

-+    int32_t gpu_mode;

-+    /*!< tune_sensitivity user tuning - alignment-conf sensitivity*/

-+    int32_t tune_sensitivity;

-+

-+} ia_pal_isp_tnr7_bc_1_0_t;

-+

-+/*! \isp struct tnr7_blend_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable TNR7 blend*/

-+    int32_t enable;

-+    /*!< enable_main_output Enable blend main output*/

-+    int32_t enable_main_output;

-+    /*!< enable_vision_output Enable blend computer vision output*/

-+    int32_t enable_vision_output;

-+    /*!< single_output_mode Both outputs use the same blend*/

-+    int32_t single_output_mode;

-+    /*!< spatial_weight_coeff Spatial weight coeff to be used in single_output_mode*/

-+    int32_t spatial_weight_coeff;

-+    /*!< max_recursive_similarity Maximum value of recursive similarity*/

-+    int32_t max_recursive_similarity;

-+    /*!< spatial_alpha Use of spatial filtering in the feedback output*/

-+    int32_t spatial_alpha;

-+    /*!< w_out_prev_LUT[32] Weight of reference in the main output*/

-+    int32_t w_out_prev_LUT[32];

-+    /*!< w_out_spl_LUT[32] Weight of spatial in the main output*/

-+    int32_t w_out_spl_LUT[32];

-+    /*!< output_cu_x[6] output config unit - x values*/

-+    int32_t output_cu_x[6];

-+    /*!< output_cu_a[5] output config unit - slope values*/

-+    int32_t output_cu_a[5];

-+    /*!< output_cu_b[5] output config unit - b values*/

-+    int32_t output_cu_b[5];

-+    /*!< max_recursive_similarity_vsn Vision - Maximum value of recursive similarity*/

-+    int32_t max_recursive_similarity_vsn;

-+    /*!< w_vsn_out_prev_LUT[32] Vision - Weight of reference in the main output*/

-+    int32_t w_vsn_out_prev_LUT[32];

-+    /*!< w_vsn_out_spl_LUT[32] Vision - Weight of spatial in the main output*/

-+    int32_t w_vsn_out_spl_LUT[32];

-+

-+} ia_pal_isp_tnr7_blend_1_0_t;

-+

-+/*! \isp struct tnr7_cme_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable TNR7 CME (Course Motion Estimation)*/

-+    int32_t enable;

-+    /*!< input_width Input Base and Dest Image Width*/

-+    int32_t input_width;

-+    /*!< input_height Input Base and Dest Image Height*/

-+    int32_t input_height;

-+    /*!< hor_search_enable Enable Horizontal MV Estimation*/

-+    int32_t hor_search_enable;

-+    /*!< ver_search_enable Enable Vertical MV Estimation*/

-+    int32_t ver_search_enable;

-+    /*!< half_pel_enable Enable Half-Pixel MV Estimation*/

-+    int32_t half_pel_enable;

-+    /*!< quarter_pel_enable Enable Quarter-Pixel MV Estimation*/

-+    int32_t quarter_pel_enable;

-+    /*!< search_range_x Integer MV Search Displacement X*/

-+    int32_t search_range_x;

-+    /*!< search_range_y Integer MV Search Displacement Y*/

-+    int32_t search_range_y;

-+    /*!< spatial_reg_mod_factor Spatial Noise Level to Regularization Factor*/

-+    int32_t spatial_reg_mod_factor;

-+    /*!< temporal_reg_mod_factor Temporal Noise Level to Regularization Factor*/

-+    int32_t temporal_reg_mod_factor;

-+    /*!< noise_confidence_factor Confidence Base Noise Scale Factor*/

-+    int32_t noise_confidence_factor;

-+    /*!< confidence_thr High Confidence Model Minimum Threshold*/

-+    int32_t confidence_thr;

-+    /*!< model_confidence_deadzone Valid Confidence Model Minimum Threshold*/

-+    int32_t model_confidence_deadzone;

-+    /*!< noise_thr_est_enable Enable Automatic Noise Level Estimation*/

-+    int32_t noise_thr_est_enable;

-+    /*!< noise_thr Characterization Specified Noise Level*/

-+    int32_t noise_thr;

-+    /*!< noise_apu_min Noise APU Minimum Threshold*/

-+    int32_t noise_apu_min;

-+    /*!< noise_apu_alpha_limit Noise APU Alpha Limit*/

-+    int32_t noise_apu_alpha_limit;

-+    /*!< noise_apu_alpha_power Noise APU Alpha Power*/

-+    int32_t noise_apu_alpha_power;

-+    /*!< predictor_enable Enable Predictor (Parametric Model)*/

-+    int32_t predictor_enable;

-+    /*!< model_valid SaveRestore Predictor Model Valid*/

-+    int32_t model_valid;

-+    /*!< model_confidence SaveRestore Predictor Model Confidence*/

-+    int32_t model_confidence;

-+    /*!< model_ax0 SaveRestore Predictor Model X Component Shift*/

-+    int32_t model_ax0;

-+    /*!< model_ay0 SaveRestore Predictor Model Y Component Shift*/

-+    int32_t model_ay0;

-+    /*!< model_ax1 SaveRestore Predictor Model X Component Scale*/

-+    int32_t model_ax1;

-+    /*!< model_ay1 SaveRestore Predictor Model Y Component Scale*/

-+    int32_t model_ay1;

-+    /*!< noise_estimator_level_valid SaveRestore Noise Estimator Level Valid*/

-+    int32_t noise_estimator_level_valid;

-+    /*!< noise_estimator_level SaveRestore Noise Estimator Level*/

-+    int32_t noise_estimator_level;

-+

-+} ia_pal_isp_tnr7_cme_1_0_t;

-+

-+/*! \isp struct tnr7_ims_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable block enable*/

-+    int32_t enable;

-+    /*!< update_limit Limit of S&R parameter update mechanism*/

-+    int32_t update_limit;

-+    /*!< update_coeff S&R parameter update coefficient*/

-+    int32_t update_coeff;

-+    /*!< do_update Enables S&R update mechanism for distance log-likelihood distribution*/

-+    int32_t do_update;

-+    /*!< d_ml[16] Maximum-likelihood of distance distribution*/

-+    int32_t d_ml[16];

-+    /*!< d_slopes[16] Distance log-likelihood slopes*/

-+    int32_t d_slopes[16];

-+    /*!< d_top[16] Distance log-likelihood constants*/

-+    int32_t d_top[16];

-+    /*!< outofbounds[16] Is ml value out-of-hostogram-bounds?*/

-+    int32_t outofbounds[16];

-+    /*!< d_ml_user[16] Maximum-likelihood of distance distribution (specified by user during offline calibration)*/

-+    int32_t d_ml_user[16];

-+    /*!< d_slopes_user[16] Distance log-likelihood slopes (specified by user during offline calibration)*/

-+    int32_t d_slopes_user[16];

-+    /*!< d_top_user[16] Distance log-likelihood constants (specified by user during offline calibration)*/

-+    int32_t d_top_user[16];

-+    /*!< gpu_mode meta parameter for controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/

-+    int32_t gpu_mode;

-+    /*!< mbd_enable Enable bit of motion boundary detection submodule*/

-+    int32_t mbd_enable;

-+    /*!< mbd_sensitivity Gradient threshold sensitivity modifer parameter U3.6*/

-+    int32_t mbd_sensitivity;

-+    /*!< mbd_gradient_threshold Automatically estimated gradient threshold U1.8*/

-+    int32_t mbd_gradient_threshold;

-+    /*!< mbd_global_mag Automatically estimated global motion vector magnitude U9.3*/

-+    int32_t mbd_global_mag;

-+    /*!< mbd_stationary_mag_offset Global motion soft threshold - offset U9.3*/

-+    int32_t mbd_stationary_mag_offset;

-+    /*!< mbd_stationary_mag_slope Global motion soft threshold - slope S+3.10*/

-+    int32_t mbd_stationary_mag_slope;

-+    /*!< mbd_gradient_percentile Gradient CDF search threshold U0.7*/

-+    int32_t mbd_gradient_percentile;

-+    /*!< mbd_gradient_thr_user 1) When > 0, statically specified gradient threshold 2) When == 0, dynamic threshold estimated from histogram U1.8*/

-+    int32_t mbd_gradient_thr_user;

-+    /*!< mbd_gradient_thr_update Gradient estimate update rate U1.6*/

-+    int32_t mbd_gradient_thr_update;

-+    /*!< mbd_threshold_slope Slope of normalized gradient mult&clamp curve*/

-+    int32_t mbd_threshold_slope;

-+    /*!< mbd_mag_alpha_limit Global magnitude APU alpha limit*/

-+    int32_t mbd_mag_alpha_limit;

-+    /*!< mbd_mag_alpha_power Global magnitude alpha power*/

-+    int32_t mbd_mag_alpha_power;

-+    /*!< mbd_safe_pixel_thr IMS threshold for rejecting safe pixels based on MBS score Rejected pixels are > mbd_safe_pixel_thr*/

-+    int32_t mbd_safe_pixel_thr;

-+

-+} ia_pal_isp_tnr7_ims_1_0_t;

-+

-+/*! \isp struct tnr7_mc_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< passThrough Passthrough (set the motion vectors to zero when enabled)*/

-+    int32_t passThrough;

-+    /*!< imageHeightFR Height (pixels) of the full-resolution image*/

-+    int32_t imageHeightFR;

-+    /*!< imageWidthFR Width (pixels) of the full-resolution image*/

-+    int32_t imageWidthFR;

-+    /*!< imageHeightDS Height (pixels) of the small-resoltion image*/

-+    int32_t imageHeightDS;

-+    /*!< imageWidthDS Width (pixels) of the small-resoltion image*/

-+    int32_t imageWidthDS;

-+

-+} ia_pal_isp_tnr7_mc_1_0_t;

-+

-+/*! \isp struct tnr7_rme_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< rme16_image_height The height of base16y_in*/

-+    int32_t rme16_image_height;

-+    /*!< rme16_image_width The width of base16y_in*/

-+    int32_t rme16_image_width;

-+    /*!< rme4_image_height The height of base4y_in*/

-+    int32_t rme4_image_height;

-+    /*!< rme4_image_width The width of base4y_in*/

-+    int32_t rme4_image_width;

-+    /*!< rme_mv64_grid_height The height of the input motion grid*/

-+    int32_t rme_mv64_grid_height;

-+    /*!< rme_mv64_grid_width The width of the input motion grid*/

-+    int32_t rme_mv64_grid_width;

-+    /*!< rme_mv16y_max Maximal |mv16y| value*/

-+    int32_t rme_mv16y_max;

-+    /*!< rme_mv16x_max Maximal |mv16x| value*/

-+    int32_t rme_mv16x_max;

-+    /*!< rme16_band_height The height of the band update by rem16. Valid values: 1, 2, 4*/

-+    int32_t rme16_band_height;

-+    /*!< rme16_n_iterations Number of update iterations for each window location of the rme16 run. 0 = bypass update stage.*/

-+    int32_t rme16_n_iterations;

-+    /*!< rme4_n_iterations Number of update iterations for each window location of the rme4 run. 0 = bypass update stage.*/

-+    int32_t rme4_n_iterations;

-+    /*!< rme16_sv_wd_int Motion regulation parameter for rme16: SvWd*/

-+    int32_t rme16_sv_wd_int;

-+    /*!< rme4_sv_wd_int Motion regulation parameter for rme4: SvWd*/

-+    int32_t rme4_sv_wd_int;

-+    /*!< rme16_sv2_inv_man_int Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/

-+    int32_t rme16_sv2_inv_man_int;

-+    /*!< rme4_sv2_inv_man_int Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/

-+    int32_t rme4_sv2_inv_man_int;

-+    /*!< rme16_sv2_inv_exp Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/

-+    int32_t rme16_sv2_inv_exp;

-+    /*!< rme4_sv2_inv_exp Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/

-+    int32_t rme4_sv2_inv_exp;

-+    /*!< rme16_median_enable Enable median for rme16, when rme is not in pass-through mode*/

-+    int32_t rme16_median_enable;

-+    /*!< rme4_median_enable Enable median for rme4, when rme is not in pass-through mode*/

-+    int32_t rme4_median_enable;

-+    /*!< rme_out_resample_enable enable down-sampling of the final output, when resampling is enabled. 0: disabled, base4 density. 1: enabled, base16 density*/

-+    int32_t rme_out_resample_enable;

-+    /*!< rme_out_down_sample_enable down-sampling ratio of the final output, when resampling is enabled. 0 means no down-sampling, i.e. base4 density. 1 means down sampling x4, i.e. base 16 density*/

-+    int32_t rme_out_down_sample_enable;

-+    /*!< rme16_mc_pass_through motion compensation in pass through mode during rme16 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/

-+    int32_t rme16_mc_pass_through;

-+    /*!< rme4_mc_pass_through motion compensation in pass through mode during rme4 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/

-+    int32_t rme4_mc_pass_through;

-+

-+} ia_pal_isp_tnr7_rme_1_0_t;

-+

-+/*! \isp struct tnr7_spatial_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable Enable TNR7 spatial fallback filter*/

-+    int32_t enable;

-+    /*!< noise_model_radius Controls noise model radius*/

-+    int32_t noise_model_radius;

-+    /*!< iir_luma_power iir luma filtering strength (0-only fir, 64-only iir)*/

-+    int32_t iir_luma_power;

-+    /*!< iir_chroma_power iir chroma filtering strength (0-only fir, 64-only iir)*/

-+    int32_t iir_chroma_power;

-+    /*!< luma_strength blending coef for luma channel (blend with input)*/

-+    int32_t luma_strength;

-+    /*!< chroma_strength blending coef for chroma channel (blend with input)*/

-+    int32_t chroma_strength;

-+    /*!< lumaLUT_v[16] self calibrating noise model (NM) state variables, luma*/

-+    int32_t lumaLUT_v[16];

-+    /*!< lumaLUT_v_bins[16] self calibrating noise model (NM) state variables, luma*/

-+    int32_t lumaLUT_v_bins[16];

-+    /*!< lumaLUT_v_limits[2] vertical luma NM limnits*/

-+    int32_t lumaLUT_v_limits[2];

-+    /*!< nmGain_h_limits[2] horizontal luma NM limnits*/

-+    int32_t nmGain_h_limits[2];

-+    /*!< nmGain_iir_limits[2] iir luma NM limnits*/

-+    int32_t nmGain_iir_limits[2];

-+    /*!< nmGain_h horizontal NM gain*/

-+    int32_t nmGain_h;

-+    /*!< nmGain_iir iir NM gain*/

-+    int32_t nmGain_iir;

-+    /*!< update_limit update rate of N lut (0-no update, 256-current frame only)*/

-+    int32_t update_limit;

-+    /*!< update_coeff slope of the update rate as a function of #samples*/

-+    int32_t update_coeff;

-+

-+} ia_pal_isp_tnr7_spatial_1_0_t;

-+

-+/*! \isp struct tvs_1_0

-+Trainable visual scaler

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass TVS*/

-+    int32_t bypass;

-+    /*!< ds_bypass Bypass downscale computation in TVS*/

-+    int32_t ds_bypass;

-+    /*!< metadata_bypass Bypass metadata of TVS output*/

-+    int32_t metadata_bypass;

-+    /*!< ds_factor_hor_int Integer part of downscale factor in horizontal*/

-+    int32_t ds_factor_hor_int;

-+    /*!< ds_factor_hor_frac Fractional part of downscale factor in horizontal (Must be 0 when ds_factor_hor_int=1)*/

-+    int32_t ds_factor_hor_frac;

-+    /*!< ds_factor_ver_int Integer part of downscale factor in vertical*/

-+    int32_t ds_factor_ver_int;

-+    /*!< ds_factor_ver_frac Fractional part of downscale factor in vertical (Must be 0 when ds_factor_ver_int=1)*/

-+    int32_t ds_factor_ver_frac;

-+    /*!< input_frame_width Input frame width (must be even number)*/

-+    int32_t input_frame_width;

-+    /*!< input_frame_height Input frame height (must be even number)*/

-+    int32_t input_frame_height;

-+    /*!< csc_kernels[9] CSC layer kernel weights*/

-+    int32_t csc_kernels[9];

-+    /*!< csc_kernels_shift CSC layer kernels fixed point value shift*/

-+    int32_t csc_kernels_shift;

-+    /*!< csc_biases[3] CSC layer bias weights*/

-+    int32_t csc_biases[3];

-+    /*!< csc_biases_shift_offset CSC layer biases fixed point value shift offset compared with csc_kernels_shift*/

-+    int32_t csc_biases_shift_offset;

-+    /*!< csc_data_shift CSC layer output data value shift*/

-+    int32_t csc_data_shift;

-+    /*!< conv_depth_kernels[588] Conv layer deptheise kernel weights*/

-+    int32_t conv_depth_kernels[588];

-+    /*!< conv_depth_kernels_shift Conv layer depthwise kernels fixed point value shift*/

-+    int32_t conv_depth_kernels_shift;

-+    /*!< conv_point_kernels[360] Conv layer pointwise kernel weights*/

-+    int32_t conv_point_kernels[360];

-+    /*!< conv_point_kernels_shift Conv layer pointwise kernels fixed point value shift*/

-+    int32_t conv_point_kernels_shift;

-+    /*!< conv_biases[30] Conv layer bias weights*/

-+    int32_t conv_biases[30];

-+    /*!< conv_biases_shift_offset Conv layer biases fixed point value shift offset compared with conv_point_kernels_shift*/

-+    int32_t conv_biases_shift_offset;

-+    /*!< conv_data_shift Conv layer output data value shift*/

-+    int32_t conv_data_shift;

-+    /*!< cu_act_func_x[15] Activation function ConfigUnit x vector*/

-+    int32_t cu_act_func_x[15];

-+    /*!< cu_act_func_y[14] Activation function ConfigUnit y vector*/

-+    int32_t cu_act_func_y[14];

-+    /*!< cu_act_func_slope[14] Activation function ConfigUnit slope vector*/

-+    int32_t cu_act_func_slope[14];

-+    /*!< act_func_output_offset Offset after Activation function*/

-+    int32_t act_func_output_offset;

-+    /*!< avg_weights[30] Avg layer weights*/

-+    int32_t avg_weights[30];

-+    /*!< avg_weights_shift[3] Avg layer weights fixed point value shift for each output channel*/

-+    int32_t avg_weights_shift[3];

-+    /*!< avg_biases[3] Avg layer biases*/

-+    int32_t avg_biases[3];

-+    /*!< avg_biases_shift_offset[3] Avg layer biases fixed point value shift offet compared with avg_weights_shift for each output channel*/

-+    int32_t avg_biases_shift_offset[3];

-+    /*!< avg_data_shift[3] Weighted averaging fixed point value shift for each output channel*/

-+    int32_t avg_data_shift[3];

-+    /*!< output_format_420 Output data format (0: YUV444; 1: YUV420. It will be forced to 1 if either ds_bypass or bypass is enabled)*/

-+    int32_t output_format_420;

-+    /*!< output_bpp_scale Bit precision scale of output data (1: 2bpp; 2: 4bpp; 3:8bpp)*/

-+    int32_t output_bpp_scale;

-+    /*!< metadata_avg_factor Division approximated factor for metadata average*/

-+    int32_t metadata_avg_factor;

-+    /*!< metadata_avg_shift Division approximated shift for metadata average*/

-+    int32_t metadata_avg_shift;

-+

-+} ia_pal_isp_tvs_1_0_t;

-+

-+/*! \isp struct vcr_3_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< enable enables the filter (YUV420 --> RGB444)*/

-+    int32_t enable;

-+    /*!< nb1 offset 1 yuv2rgb conversion, rgb = m * yuv + nb*/

-+    int32_t nb1;

-+    /*!< nb2 offset 2 yuv2rgb conversion, rgb = m * yuv + nb*/

-+    int32_t nb2;

-+    /*!< nb3 offset 3 yuv2rgb conversion, rgb = m * yuv + nb*/

-+    int32_t nb3;

-+    /*!< yuv2rgb_matrix[9] yuv to rgb conversion matrix, S4.11*/

-+    int32_t yuv2rgb_matrix[9];

-+

-+} ia_pal_isp_vcr_3_1_t;

-+

-+/*! \isp struct vcr3

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass_0_1 Bypass VCR2*/

-+    int32_t bypass_0_1;

-+    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/

-+    int32_t input_format_420;

-+

-+} ia_pal_isp_vcr3_t;

-+

-+/*! \isp struct vcsc_2_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< csc_c_matrix_arr[9] CSC Matrix components (S0.15)*/

-+    int32_t csc_c_matrix_arr[9];

-+    /*!< csc_b_vec_arr[3] CSC Vector components (S0.15)*/

-+    int32_t csc_b_vec_arr[3];

-+    /*!< chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/

-+    int32_t chroma_ds_coeff_arr[8];

-+    /*!< chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/

-+    int32_t chroma_ds_nf;

-+    /*!< enable Bypassing CSC. Outputting RGB to the Chroma downscale*/

-+    int32_t enable;

-+    /*!< uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/

-+    int32_t uv_bin_output;

-+

-+} ia_pal_isp_vcsc_2_0_t;

-+

-+/*! \isp struct vertical_padding_1_0

-+padding

-+*/

-+typedef struct

-+{

-+    /*!< padding_top lines padding top*/

-+    int32_t padding_top;

-+    /*!< padding_bottom lines padding bottom*/

-+    int32_t padding_bottom;

-+

-+} ia_pal_isp_vertical_padding_1_0_t;

-+

-+/*! \isp struct vltm_1_0

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass bypass*/

-+    int32_t bypass;

-+    /*!< alpha U4.12 boost factor*/

-+    int32_t alpha;

-+    /*!< alpha_shift_factor U4.0 shift_factor for fixed point conversion*/

-+    int32_t alpha_shift_factor;

-+    /*!< cu_vltm_x[6] U12.0 cu_vltm_x*/

-+    int32_t cu_vltm_x[6];

-+    /*!< cu_vltm_y[5] U12.0 cu_vltm_y*/

-+    int32_t cu_vltm_y[5];

-+    /*!< cu_vltm_slope[5] S.12.4 cu_vltm_slope (16 bits including sign)*/

-+    int32_t cu_vltm_slope[5];

-+

-+} ia_pal_isp_vltm_1_0_t;

-+

-+/*! \isp struct wb_1_1

-+

-+*/

-+typedef struct

-+{

-+    /*!< bypass Bypass            {0,1}*/

-+    int32_t bypass;

-+    /*!< gainch0 Gain Channel0 (Gr) (U8.12)*/

-+    int32_t gainch0;

-+    /*!< gainch1 Gain Channel1 (Gb) (U8.12)*/

-+    int32_t gainch1;

-+    /*!< gainch2 Gain Channel2 (G)  (U8.12)*/

-+    int32_t gainch2;

-+    /*!< gainch3 Gain Channel3 (B)  (U8.12)*/

-+    int32_t gainch3;

-+    /*!< gainch4 Gain Channel4 (R)  (U8.12)*/

-+    int32_t gainch4;

-+    /*!< gainch5 Gain Channel5 (W)  (U8.12)*/

-+    int32_t gainch5;

-+    /*!< gainch6 Gain Channel6 (U8.12)*/

-+    int32_t gainch6;

-+    /*!< gainch7 Gain Channel7 (U8.12)*/

-+    int32_t gainch7;

-+    /*!< sensormode Sensor CFA size: 1x1 (0), 2x2 (1), 4x4 (2)*/

-+    int32_t sensormode;

-+    /*!< wbindmat[16] Vector WB matrix*/

-+    int32_t wbindmat[16];

-+

-+} ia_pal_isp_wb_1_1_t;

-+

-+/*! \isp struct wb_sis

-+

-+*/

-+typedef struct

-+{

-+    /*!< m_bypass Bypass            {0,1}*/

-+    int32_t m_bypass;

-+    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

-+    int32_t m_gainch0;

-+    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

-+    int32_t m_gainch1;

-+    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

-+    int32_t m_gainch2;

-+    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

-+    int32_t m_gainch3;

-+    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

-+    int32_t m_gainch4;

-+    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

-+    int32_t m_gainch5;

-+    /*!< m_gainch6 Gain Channel6 (U4.12)*/

-+    int32_t m_gainch6;

-+    /*!< m_gainch7 Gain Channel7 (U4.12)*/

-+    int32_t m_gainch7;

-+    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

-+    int32_t m_sensormode;

-+    /*!< m_wbindmat[16] Vector WB matrix*/

-+    int32_t m_wbindmat[16];

-+

-+} ia_pal_isp_wb_sis_t;

-+

-+/*! \isp struct x2i_md_1_0

-+Monocular Depth

-+*/

-+typedef struct

-+{

-+    /*!< bypass by pass*/

-+    int32_t bypass;

-+    /*!< ver_bin_bypass bypass vertical binning when input is 2x4 PDAF*/

-+    int32_t ver_bin_bypass;

-+    /*!< bin_only do binning only and not calculate depth information*/

-+    int32_t bin_only;

-+    /*!< depth_map_bypass bypass depth map generation*/

-+    int32_t depth_map_bypass;

-+    /*!< bayer2y_bypass bypass bayer2y estimation when input is single channel phase disparity*/

-+    int32_t bayer2y_bypass;

-+    /*!< is_sve is input sve signal? If not, use simple Y computation; otherwise, use special Y computation*/

-+    int32_t is_sve;

-+    /*!< ver_bin_by_averaging whether to do vertical binning by averaging (0: by adding; 1: by averaging)*/

-+    int32_t ver_bin_by_averaging;

-+    /*!< hor_bin_by_averaging whether to do horizontal binning by averaging (0: by adding; 1: by averaging)*/

-+    int32_t hor_bin_by_averaging;

-+    /*!< win_width sliding window width for SAD computation*/

-+    int32_t win_width;

-+    /*!< min_shift minimum possible phase shift that estimation process will search*/

-+    int32_t min_shift;

-+    /*!< max_shift maximum possible phase shift that estimation process will search*/

-+    int32_t max_shift;

-+    /*!< shift_steps phase shift candidate steps*/

-+    int32_t shift_steps;

-+    /*!< y_compute_weights[16] Weights for y computation 3x3 filter (row by row, 6th, 7th, 8th, 10th, 11th, 12th, 14th, 15th, and 16th elements are used) in 2PD/4PD mode or 4x4 filter (row by row) in SVE mode. Sum of weights should be power of 2.*/

-+    int32_t y_compute_weights[16];

-+    /*!< y_compute_shift_0 shift scale of weight value for y computation at first stage  (the shift before saving to local buffer). The bit precision in local buffer is S18.*/

-+    int32_t y_compute_shift_0;

-+    /*!< y_compute_shift_1 shift scale of weight value for y computation at second stage (the shift before outputing final value)*/

-+    int32_t y_compute_shift_1;

-+    /*!< min_depth minimum depth showed in depth map (uint: mm) for visualization purpose*/

-+    int32_t min_depth;

-+    /*!< max_depth maximum depth showed in depth map (uint: mm) for visualization purpose*/

-+    int32_t max_depth;

-+    /*!< mono_radius number of neighbors at each side of SAD minimum point is monotonously increasing to be regarded as valid estimation result*/

-+    int32_t mono_radius;

-+    /*!< sad_diff_thresh_scale local SAD difference threshold dividing factor of power 2*/

-+    int32_t sad_diff_thresh_scale;

-+    /*!< min_sad_diff_thresh minimum SAD difference threshold to be considered as valid point*/

-+    int32_t min_sad_diff_thresh;

-+    /*!< max_sad_diff_thresh maximum SAD difference threshold to be considered as valid point*/

-+    int32_t max_sad_diff_thresh;

-+    /*!< interp_div_value_shift shift scale of division result used in equi-angle v interpolation*/

-+    int32_t interp_div_value_shift;

-+    /*!< vcm_value_shift shift scale of VCM value*/

-+    int32_t vcm_value_shift;

-+    /*!< phase_vcm_mapping_grid_width grid width of phase shift vs VCM mapping slope table in power of 2*/

-+    int32_t phase_vcm_mapping_grid_width;

-+    /*!< phase_vcm_mapping_grid_height grid height of phase shift vs VCM mapping slope table in power of 2*/

-+    int32_t phase_vcm_mapping_grid_height;

-+    /*!< phase_vcm_mapping_grid_block_num_hor horizontal block number in grid of phase shift vs VCM mapping slope table*/

-+    int32_t phase_vcm_mapping_grid_block_num_hor;

-+    /*!< phase_vcm_mapping_grid_block_num_ver vertical block number in grid of phase shift vs VCM mapping slope table*/

-+    int32_t phase_vcm_mapping_grid_block_num_ver;

-+    /*!< phase_vcm_mapping_slope[256] phase shift vs VCM mapping slope table*/

-+    int32_t phase_vcm_mapping_slope[256];

-+    /*!< current_vcm current VCM value*/

-+    int32_t current_vcm;

-+    /*!< phase_value_shift shift scale of phase shift value*/

-+    int32_t phase_value_shift;

-+    /*!< depth_lut_size size of depth look-up table*/

-+    int32_t depth_lut_size;

-+    /*!< depth_lutbase_levels[2] base levels of depth look-up table*/

-+    int32_t depth_lutbase_levels[2];

-+    /*!< depth_lut_start_bins[2] number of bins in depth look-up table*/

-+    int32_t depth_lut_start_bins[2];

-+    /*!< depth_lut_steps[2] step sizes of bins in depth look-up table in power of 2*/

-+    int32_t depth_lut_steps[2];

-+    /*!< depth_lut_values[187] value of depth look-up tables*/

-+    int32_t depth_lut_values[187];

-+

-+} ia_pal_isp_x2i_md_1_0_t;

-+

-+/*! \isp struct xnr_5_1

-+Low Frequency Chroma Denoiser

-+*/

-+typedef struct

-+{

-+    /*!< top_frame_width XNR5 input frame width*/

-+    int32_t top_frame_width;

-+    /*!< top_frame_height XNR5 input frame height*/

-+    int32_t top_frame_height;

-+    /*!< top_xnr_bypass Bypass entire xnr*/

-+    int32_t top_xnr_bypass;

-+    /*!< vhf_frame_width XNR5 input frame width*/

-+    int32_t vhf_frame_width;

-+    /*!< vhf_frame_height XNR5 input frame height*/

-+    int32_t vhf_frame_height;

-+    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t vhf_low_band_disable;

-+    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t vhf_low_band_only;

-+    /*!< hf_frame_width XNR5 input frame width*/

-+    int32_t hf_frame_width;

-+    /*!< hf_frame_height XNR5 input frame height*/

-+    int32_t hf_frame_height;

-+    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t hf_low_band_disable;

-+    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t hf_low_band_only;

-+    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t hf_nr_bypass;

-+    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t hf_se_bypass;

-+    /*!< hf_se_bypass_val SE bypass value*/

-+    int32_t hf_se_bypass_val;

-+    /*!< mf_frame_width XNR5 input frame width*/

-+    int32_t mf_frame_width;

-+    /*!< mf_frame_height XNR5 input frame height*/

-+    int32_t mf_frame_height;

-+    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t mf_low_band_disable;

-+    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t mf_low_band_only;

-+    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t mf_nr_bypass;

-+    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t mf_se_bypass;

-+    /*!< mf_se_bypass_val SE bypass value*/

-+    int32_t mf_se_bypass_val;

-+    /*!< lf_frame_width XNR5 input frame width*/

-+    int32_t lf_frame_width;

-+    /*!< lf_frame_height XNR5 input frame height*/

-+    int32_t lf_frame_height;

-+    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t lf_low_band_disable;

-+    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t lf_low_band_only;

-+    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t lf_nr_bypass;

-+    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t lf_se_bypass;

-+    /*!< lf_se_bypass_val SE bypass value*/

-+    int32_t lf_se_bypass_val;

-+    /*!< vlf_frame_width XNR5 input frame width*/

-+    int32_t vlf_frame_width;

-+    /*!< vlf_frame_height XNR5 input frame height*/

-+    int32_t vlf_frame_height;

-+    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t vlf_low_band_disable;

-+    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t vlf_low_band_only;

-+    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t vlf_nr_bypass;

-+    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t vlf_se_bypass;

-+    /*!< vlf_se_bypass_val SE bypass value*/

-+    int32_t vlf_se_bypass_val;

-+    /*!< Bypass Deprecated bypass parameter - to be removed!*/

-+    int32_t Bypass;

-+    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/

-+    int32_t top_viir_coefs_b[3];

-+    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/

-+    int32_t top_viir_coefs_a[2];

-+    /*!< top_viir_offset Param_Top_VIIR_offset*/

-+    int32_t top_viir_offset;

-+    /*!< top_viir_alpha Param_Top_VIIR_alpha*/

-+    int32_t top_viir_alpha;

-+    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/

-+    int32_t top_hus_vlf_image_coefs[9];

-+    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/

-+    int32_t top_hus_vlf_delta_coefs[9];

-+    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/

-+    int32_t top_hus_lf_image_coefs[5];

-+    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/

-+    int32_t top_hus_lf_delta_coefs[5];

-+    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/

-+    int32_t top_hus_mf_image_coefs[5];

-+    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/

-+    int32_t top_hus_mf_delta_coefs[5];

-+    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/

-+    int32_t hf_blf_2dfir_filter_length;

-+    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/

-+    int32_t hf_blf_2dfir_dcdc_bypass_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;

-+    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/

-+    int32_t hf_blf_2dfir_dcdc_bypass_uv;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;

-+    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/

-+    int32_t hf_blf_colorspace;

-+    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t hf_blf_noisemodel_weight_uv_y;

-+    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t hf_blf_noisemodel_weight_uv_u;

-+    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t hf_blf_noisemodel_weight_uv_v;

-+    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t hf_blf_noisemodel_radialdependent_bypass;

-+    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t hf_blf_noisemodel_colordependent_bypass;

-+    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t hf_blf_noisemodel_graydependent_bypass;

-+    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t hf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t hf_blf_noisemodel_radialdependent_x0;

-+    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t hf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t hf_blf_noisemodel_radialdependent_y0;

-+    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/

-+    int32_t hf_blf_noisemodel_colordependent_a[32];

-+    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/

-+    int32_t hf_blf_noisemodel_colordependent_b[32];

-+    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/

-+    int32_t hf_blf_noisemodel_colordependent_c[32];

-+    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t hf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_y;

-+    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_u;

-+    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_v;

-+    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/

-+    int32_t hf_blf_snrm_bypass;

-+    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/

-+    int32_t hf_blf_snrm_slope_uv;

-+    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/

-+    int32_t hf_blf_snrm_xoffset_uv;

-+    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/

-+    int32_t hf_blf_snrm_maxval_uv;

-+    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/

-+    int32_t hf_blf_snrm_minval_uv;

-+    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/

-+    int32_t hf_afc_bypass;

-+    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/

-+    int32_t hf_afc_weight_snr;

-+    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/

-+    int32_t hf_afc_weight_chroma;

-+    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/

-+    int32_t hf_min_distance_clamp;

-+    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/

-+    int32_t mf_blf_2dfir_filter_length;

-+    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/

-+    int32_t mf_blf_2dfir_luma_coefs[10];

-+    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/

-+    int32_t mf_blf_2dfir_luma_denom_bits;

-+    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/

-+    int32_t mf_blf_2dfir_dcdc_bypass_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;

-+    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/

-+    int32_t mf_blf_2dfir_dcdc_bypass_uv;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;

-+    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/

-+    int32_t mf_blf_2dfir_bypass_snr_y;

-+    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/

-+    int32_t mf_blf_colorspace;

-+    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t mf_blf_noisemodel_weight_y_y;

-+    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t mf_blf_noisemodel_weight_y_u;

-+    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t mf_blf_noisemodel_weight_y_v;

-+    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t mf_blf_noisemodel_weight_uv_y;

-+    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t mf_blf_noisemodel_weight_uv_u;

-+    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t mf_blf_noisemodel_weight_uv_v;

-+    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t mf_blf_noisemodel_radialdependent_bypass;

-+    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t mf_blf_noisemodel_colordependent_bypass;

-+    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t mf_blf_noisemodel_graydependent_bypass;

-+    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t mf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t mf_blf_noisemodel_radialdependent_x0;

-+    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t mf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t mf_blf_noisemodel_radialdependent_y0;

-+    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t mf_blf_noisemodel_colordependent_a[32];

-+    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t mf_blf_noisemodel_colordependent_b[32];

-+    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t mf_blf_noisemodel_colordependent_c[32];

-+    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t mf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t mf_blf_noisemodel_normfactor_y_y;

-+    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t mf_blf_noisemodel_normfactor_y_u;

-+    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t mf_blf_noisemodel_normfactor_y_v;

-+    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_y;

-+    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_u;

-+    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_v;

-+    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/

-+    int32_t mf_blf_snrm_bypass;

-+    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/

-+    int32_t mf_blf_snrm_bypass_y;

-+    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/

-+    int32_t mf_blf_snrm_slope_y;

-+    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/

-+    int32_t mf_blf_snrm_xoffset_y;

-+    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/

-+    int32_t mf_blf_snrm_maxval_y;

-+    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/

-+    int32_t mf_blf_snrm_minval_y;

-+    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/

-+    int32_t mf_blf_snrm_slope_uv;

-+    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/

-+    int32_t mf_blf_snrm_xoffset_uv;

-+    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/

-+    int32_t mf_blf_snrm_maxval_uv;

-+    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/

-+    int32_t mf_blf_snrm_minval_uv;

-+    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/

-+    int32_t mf_afc_bypass;

-+    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/

-+    int32_t mf_afc_weight_snr;

-+    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/

-+    int32_t mf_afc_weight_chroma;

-+    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/

-+    int32_t mf_min_distance_clamp;

-+    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/

-+    int32_t lf_blf_fir_filter_length;

-+    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/

-+    int32_t lf_blf_fir_luma_coefs[6];

-+    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/

-+    int32_t lf_blf_fir_luma_denom_bits;

-+    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/

-+    int32_t lf_blf_fir_bypass_snr_y;

-+    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/

-+    int32_t lf_blf_colorspace;

-+    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t lf_blf_noisemodel_weight_y_y;

-+    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t lf_blf_noisemodel_weight_y_u;

-+    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t lf_blf_noisemodel_weight_y_v;

-+    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t lf_blf_noisemodel_weight_uv_y;

-+    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t lf_blf_noisemodel_weight_uv_u;

-+    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t lf_blf_noisemodel_weight_uv_v;

-+    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t lf_blf_noisemodel_radialdependent_bypass;

-+    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t lf_blf_noisemodel_colordependent_bypass;

-+    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t lf_blf_noisemodel_graydependent_bypass;

-+    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t lf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t lf_blf_noisemodel_radialdependent_x0;

-+    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t lf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t lf_blf_noisemodel_radialdependent_y0;

-+    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t lf_blf_noisemodel_colordependent_a[32];

-+    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t lf_blf_noisemodel_colordependent_b[32];

-+    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t lf_blf_noisemodel_colordependent_c[32];

-+    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t lf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t lf_blf_noisemodel_normfactor_y_y;

-+    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t lf_blf_noisemodel_normfactor_y_u;

-+    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t lf_blf_noisemodel_normfactor_y_v;

-+    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_y;

-+    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_u;

-+    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_v;

-+    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/

-+    int32_t lf_blf_snrm_bypass;

-+    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/

-+    int32_t lf_blf_snrm_bypass_y;

-+    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/

-+    int32_t lf_blf_snrm_slope_y;

-+    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/

-+    int32_t lf_blf_snrm_xoffset_y;

-+    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/

-+    int32_t lf_blf_snrm_maxval_y;

-+    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/

-+    int32_t lf_blf_snrm_minval_y;

-+    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/

-+    int32_t lf_blf_snrm_slope_uv;

-+    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/

-+    int32_t lf_blf_snrm_xoffset_uv;

-+    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/

-+    int32_t lf_blf_snrm_maxval_uv;

-+    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/

-+    int32_t lf_blf_snrm_minval_uv;

-+    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/

-+    int32_t lf_blf_iir_alpha_y;

-+    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/

-+    int32_t lf_blf_iir_alpha_uv;

-+    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/

-+    int32_t lf_cs_bypass;

-+    /*!< lf_cs_coef Param_LF_CS_coef*/

-+    int32_t lf_cs_coef;

-+    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/

-+    int32_t lf_min_distance_clamp;

-+    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/

-+    int32_t vlf_blf_fir_filter_length;

-+    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/

-+    int32_t vlf_blf_fir_luma_coefs[6];

-+    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/

-+    int32_t vlf_blf_fir_luma_denom_bits;

-+    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/

-+    int32_t vlf_blf_fir_bypass_snr_y;

-+    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/

-+    int32_t vlf_blf_colorspace;

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t vlf_blf_noisemodel_weight_y_y;

-+    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t vlf_blf_noisemodel_weight_y_u;

-+    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t vlf_blf_noisemodel_weight_y_v;

-+    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t vlf_blf_noisemodel_weight_uv_y;

-+    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t vlf_blf_noisemodel_weight_uv_u;

-+    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t vlf_blf_noisemodel_weight_uv_v;

-+    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t vlf_blf_noisemodel_radialdependent_bypass;

-+    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t vlf_blf_noisemodel_colordependent_bypass;

-+    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t vlf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t vlf_blf_noisemodel_radialdependent_x0;

-+    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t vlf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t vlf_blf_noisemodel_radialdependent_y0;

-+    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t vlf_blf_noisemodel_colordependent_a[32];

-+    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t vlf_blf_noisemodel_colordependent_b[32];

-+    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t vlf_blf_noisemodel_colordependent_c[32];

-+    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t vlf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_y;

-+    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_u;

-+    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_v;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_y;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_u;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_v;

-+    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/

-+    int32_t vlf_blf_iir_alpha_y;

-+    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/

-+    int32_t vlf_blf_iir_alpha_uv;

-+    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/

-+    int32_t vlf_cs_bypass;

-+    /*!< vlf_cs_coef Param_VLF_CS_coef*/

-+    int32_t vlf_cs_coef;

-+    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/

-+    int32_t vlf_min_distance_clamp;

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t vhf_blf_noisemodel_weight_y_y;

-+    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t vhf_blf_noisemodel_radialdependent_bypass;

-+    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t vhf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t vhf_blf_noisemodel_radialdependent_x0;

-+    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t vhf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t vhf_blf_noisemodel_radialdependent_y0;

-+    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t vhf_blf_noisemodel_normfactor_y_y;

-+    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/

-+    int32_t vhf_blf_bypass;

-+    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/

-+    int32_t vhf_min_distance_clamp;

-+

-+} ia_pal_isp_xnr_5_1_t;

-+

-+/*! \isp struct xnr_5_2

-+Low Frequency Chroma Denoiser

-+*/

-+typedef struct

-+{

-+    /*!< top_frame_width XNR5 input frame width*/

-+    int32_t top_frame_width;

-+    /*!< top_frame_height XNR5 input frame height*/

-+    int32_t top_frame_height;

-+    /*!< top_xnr_bypass Bypass entire xnr*/

-+    int32_t top_xnr_bypass;

-+    /*!< vhf_frame_width XNR5 input frame width*/

-+    int32_t vhf_frame_width;

-+    /*!< vhf_frame_height XNR5 input frame height*/

-+    int32_t vhf_frame_height;

-+    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t vhf_low_band_disable;

-+    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t vhf_low_band_only;

-+    /*!< hf_frame_width XNR5 input frame width*/

-+    int32_t hf_frame_width;

-+    /*!< hf_frame_height XNR5 input frame height*/

-+    int32_t hf_frame_height;

-+    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t hf_low_band_disable;

-+    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t hf_low_band_only;

-+    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t hf_nr_bypass;

-+    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t hf_se_bypass;

-+    /*!< hf_se_bypass_val SE bypass value*/

-+    int32_t hf_se_bypass_val;

-+    /*!< mf_frame_width XNR5 input frame width*/

-+    int32_t mf_frame_width;

-+    /*!< mf_frame_height XNR5 input frame height*/

-+    int32_t mf_frame_height;

-+    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t mf_low_band_disable;

-+    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t mf_low_band_only;

-+    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t mf_nr_bypass;

-+    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t mf_se_bypass;

-+    /*!< mf_se_bypass_val SE bypass value*/

-+    int32_t mf_se_bypass_val;

-+    /*!< lf_frame_width XNR5 input frame width*/

-+    int32_t lf_frame_width;

-+    /*!< lf_frame_height XNR5 input frame height*/

-+    int32_t lf_frame_height;

-+    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t lf_low_band_disable;

-+    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t lf_low_band_only;

-+    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t lf_nr_bypass;

-+    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t lf_se_bypass;

-+    /*!< lf_se_bypass_val SE bypass value*/

-+    int32_t lf_se_bypass_val;

-+    /*!< vlf_frame_width XNR5 input frame width*/

-+    int32_t vlf_frame_width;

-+    /*!< vlf_frame_height XNR5 input frame height*/

-+    int32_t vlf_frame_height;

-+    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/

-+    int32_t vlf_low_band_disable;

-+    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

-+    int32_t vlf_low_band_only;

-+    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/

-+    int32_t vlf_nr_bypass;

-+    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/

-+    int32_t vlf_se_bypass;

-+    /*!< vlf_se_bypass_val SE bypass value*/

-+    int32_t vlf_se_bypass_val;

-+    /*!< Bypass Deprecated bypass parameter - to be removed!*/

-+    int32_t Bypass;

-+    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/

-+    int32_t top_viir_coefs_b[3];

-+    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/

-+    int32_t top_viir_coefs_a[2];

-+    /*!< top_viir_offset Param_Top_VIIR_offset*/

-+    int32_t top_viir_offset;

-+    /*!< top_viir_alpha Param_Top_VIIR_alpha*/

-+    int32_t top_viir_alpha;

-+    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/

-+    int32_t top_hus_vlf_image_coefs[9];

-+    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/

-+    int32_t top_hus_vlf_delta_coefs[9];

-+    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/

-+    int32_t top_hus_lf_image_coefs[5];

-+    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/

-+    int32_t top_hus_lf_delta_coefs[5];

-+    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/

-+    int32_t top_hus_mf_image_coefs[5];

-+    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/

-+    int32_t top_hus_mf_delta_coefs[5];

-+    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/

-+    int32_t hf_blf_2dfir_filter_length;

-+    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/

-+    int32_t hf_blf_2dfir_dcdc_bypass_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;

-+    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;

-+    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/

-+    int32_t hf_blf_2dfir_dcdc_bypass_uv;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;

-+    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/

-+    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;

-+    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/

-+    int32_t hf_blf_colorspace;

-+    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t hf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t hf_blf_noisemodel_weight_uv_y;

-+    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t hf_blf_noisemodel_weight_uv_u;

-+    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t hf_blf_noisemodel_weight_uv_v;

-+    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t hf_blf_noisemodel_radialdependent_bypass;

-+    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t hf_blf_noisemodel_colordependent_bypass;

-+    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t hf_blf_noisemodel_graydependent_bypass;

-+    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t hf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t hf_blf_noisemodel_radialdependent_x0;

-+    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t hf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t hf_blf_noisemodel_radialdependent_y0;

-+    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/

-+    int32_t hf_blf_noisemodel_colordependent_a[32];

-+    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/

-+    int32_t hf_blf_noisemodel_colordependent_b[32];

-+    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/

-+    int32_t hf_blf_noisemodel_colordependent_c[32];

-+    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t hf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_y;

-+    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_u;

-+    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t hf_blf_noisemodel_normfactor_uv_v;

-+    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/

-+    int32_t hf_blf_snrm_bypass;

-+    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/

-+    int32_t hf_blf_snrm_slope_uv;

-+    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/

-+    int32_t hf_blf_snrm_xoffset_uv;

-+    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/

-+    int32_t hf_blf_snrm_maxval_uv;

-+    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/

-+    int32_t hf_blf_snrm_minval_uv;

-+    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/

-+    int32_t hf_afc_bypass;

-+    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/

-+    int32_t hf_afc_weight_snr;

-+    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/

-+    int32_t hf_afc_weight_chroma;

-+    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/

-+    int32_t hf_min_distance_clamp;

-+    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/

-+    int32_t mf_blf_2dfir_filter_length;

-+    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/

-+    int32_t mf_blf_2dfir_luma_coefs[10];

-+    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/

-+    int32_t mf_blf_2dfir_luma_denom_bits;

-+    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/

-+    int32_t mf_blf_2dfir_dcdc_bypass_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;

-+    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;

-+    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/

-+    int32_t mf_blf_2dfir_dcdc_bypass_uv;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;

-+    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/

-+    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;

-+    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/

-+    int32_t mf_blf_2dfir_bypass_snr_y;

-+    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/

-+    int32_t mf_blf_colorspace;

-+    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t mf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t mf_blf_noisemodel_weight_y_y;

-+    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t mf_blf_noisemodel_weight_y_u;

-+    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t mf_blf_noisemodel_weight_y_v;

-+    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t mf_blf_noisemodel_weight_uv_y;

-+    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t mf_blf_noisemodel_weight_uv_u;

-+    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t mf_blf_noisemodel_weight_uv_v;

-+    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t mf_blf_noisemodel_radialdependent_bypass;

-+    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t mf_blf_noisemodel_colordependent_bypass;

-+    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t mf_blf_noisemodel_graydependent_bypass;

-+    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t mf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t mf_blf_noisemodel_radialdependent_x0;

-+    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t mf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t mf_blf_noisemodel_radialdependent_y0;

-+    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t mf_blf_noisemodel_colordependent_a[32];

-+    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t mf_blf_noisemodel_colordependent_b[32];

-+    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t mf_blf_noisemodel_colordependent_c[32];

-+    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t mf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t mf_blf_noisemodel_normfactor_y_y;

-+    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t mf_blf_noisemodel_normfactor_y_u;

-+    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t mf_blf_noisemodel_normfactor_y_v;

-+    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_y;

-+    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_u;

-+    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t mf_blf_noisemodel_normfactor_uv_v;

-+    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/

-+    int32_t mf_blf_snrm_bypass;

-+    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/

-+    int32_t mf_blf_snrm_bypass_y;

-+    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/

-+    int32_t mf_blf_snrm_slope_y;

-+    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/

-+    int32_t mf_blf_snrm_xoffset_y;

-+    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/

-+    int32_t mf_blf_snrm_maxval_y;

-+    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/

-+    int32_t mf_blf_snrm_minval_y;

-+    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/

-+    int32_t mf_blf_snrm_slope_uv;

-+    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/

-+    int32_t mf_blf_snrm_xoffset_uv;

-+    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/

-+    int32_t mf_blf_snrm_maxval_uv;

-+    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/

-+    int32_t mf_blf_snrm_minval_uv;

-+    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/

-+    int32_t mf_afc_bypass;

-+    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/

-+    int32_t mf_afc_weight_snr;

-+    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/

-+    int32_t mf_afc_weight_chroma;

-+    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/

-+    int32_t mf_min_distance_clamp;

-+    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/

-+    int32_t lf_blf_fir_filter_length;

-+    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/

-+    int32_t lf_blf_fir_luma_coefs[6];

-+    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/

-+    int32_t lf_blf_fir_luma_denom_bits;

-+    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/

-+    int32_t lf_blf_fir_bypass_snr_y;

-+    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/

-+    int32_t lf_blf_colorspace;

-+    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t lf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t lf_blf_noisemodel_weight_y_y;

-+    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t lf_blf_noisemodel_weight_y_u;

-+    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t lf_blf_noisemodel_weight_y_v;

-+    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t lf_blf_noisemodel_weight_uv_y;

-+    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t lf_blf_noisemodel_weight_uv_u;

-+    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t lf_blf_noisemodel_weight_uv_v;

-+    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t lf_blf_noisemodel_radialdependent_bypass;

-+    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t lf_blf_noisemodel_colordependent_bypass;

-+    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/

-+    int32_t lf_blf_noisemodel_graydependent_bypass;

-+    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t lf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t lf_blf_noisemodel_radialdependent_x0;

-+    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t lf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t lf_blf_noisemodel_radialdependent_y0;

-+    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t lf_blf_noisemodel_colordependent_a[32];

-+    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t lf_blf_noisemodel_colordependent_b[32];

-+    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t lf_blf_noisemodel_colordependent_c[32];

-+    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t lf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/

-+    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;

-+    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/

-+    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;

-+    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t lf_blf_noisemodel_normfactor_y_y;

-+    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t lf_blf_noisemodel_normfactor_y_u;

-+    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t lf_blf_noisemodel_normfactor_y_v;

-+    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_y;

-+    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_u;

-+    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t lf_blf_noisemodel_normfactor_uv_v;

-+    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/

-+    int32_t lf_blf_snrm_bypass;

-+    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/

-+    int32_t lf_blf_snrm_bypass_y;

-+    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/

-+    int32_t lf_blf_snrm_slope_y;

-+    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/

-+    int32_t lf_blf_snrm_xoffset_y;

-+    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/

-+    int32_t lf_blf_snrm_maxval_y;

-+    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/

-+    int32_t lf_blf_snrm_minval_y;

-+    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/

-+    int32_t lf_blf_snrm_slope_uv;

-+    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/

-+    int32_t lf_blf_snrm_xoffset_uv;

-+    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/

-+    int32_t lf_blf_snrm_maxval_uv;

-+    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/

-+    int32_t lf_blf_snrm_minval_uv;

-+    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/

-+    int32_t lf_blf_iir_alpha_y;

-+    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/

-+    int32_t lf_blf_iir_alpha_uv;

-+    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/

-+    int32_t lf_cs_bypass;

-+    /*!< lf_cs_coef Param_LF_CS_coef*/

-+    int32_t lf_cs_coef;

-+    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/

-+    int32_t lf_min_distance_clamp;

-+    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/

-+    int32_t vlf_blf_fir_filter_length;

-+    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/

-+    int32_t vlf_blf_fir_luma_coefs[6];

-+    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/

-+    int32_t vlf_blf_fir_luma_denom_bits;

-+    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/

-+    int32_t vlf_blf_fir_bypass_snr_y;

-+    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/

-+    int32_t vlf_blf_colorspace;

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_u_wbg;

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];

-+    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/

-+    int32_t vlf_blf_noisemodel_basefunc_v_wbg;

-+    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t vlf_blf_noisemodel_weight_y_y;

-+    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/

-+    int32_t vlf_blf_noisemodel_weight_y_u;

-+    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/

-+    int32_t vlf_blf_noisemodel_weight_y_v;

-+    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/

-+    int32_t vlf_blf_noisemodel_weight_uv_y;

-+    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/

-+    int32_t vlf_blf_noisemodel_weight_uv_u;

-+    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/

-+    int32_t vlf_blf_noisemodel_weight_uv_v;

-+    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t vlf_blf_noisemodel_radialdependent_bypass;

-+    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/

-+    int32_t vlf_blf_noisemodel_colordependent_bypass;

-+    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t vlf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t vlf_blf_noisemodel_radialdependent_x0;

-+    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t vlf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t vlf_blf_noisemodel_radialdependent_y0;

-+    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/

-+    int32_t vlf_blf_noisemodel_colordependent_a[32];

-+    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/

-+    int32_t vlf_blf_noisemodel_colordependent_b[32];

-+    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/

-+    int32_t vlf_blf_noisemodel_colordependent_c[32];

-+    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/

-+    int32_t vlf_blf_noisemodel_colordependent_norm_offset;

-+    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];

-+    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];

-+    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

-+    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];

-+    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

-+    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];

-+    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_y;

-+    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_u;

-+    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/

-+    int32_t vlf_blf_noisemodel_normfactor_y_v;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_y;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_u;

-+    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/

-+    int32_t vlf_blf_noisemodel_normfactor_uv_v;

-+    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/

-+    int32_t vlf_blf_iir_alpha_y;

-+    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/

-+    int32_t vlf_blf_iir_alpha_uv;

-+    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/

-+    int32_t vlf_cs_bypass;

-+    /*!< vlf_cs_coef Param_VLF_CS_coef*/

-+    int32_t vlf_cs_coef;

-+    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/

-+    int32_t vlf_min_distance_clamp;

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];

-+    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];

-+    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/

-+    int32_t vhf_blf_noisemodel_basefunc_y_wbg;

-+    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/

-+    int32_t vhf_blf_noisemodel_weight_y_y;

-+    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/

-+    int32_t vhf_blf_noisemodel_radialdependent_bypass;

-+    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/

-+    int32_t vhf_blf_noisemodel_radialdependent_x0_square;

-+    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/

-+    int32_t vhf_blf_noisemodel_radialdependent_x0;

-+    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/

-+    int32_t vhf_blf_noisemodel_radialdependent_y0_square;

-+    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/

-+    int32_t vhf_blf_noisemodel_radialdependent_y0;

-+    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

-+    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];

-+    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

-+    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];

-+    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/

-+    int32_t vhf_blf_noisemodel_normfactor_y_y;

-+    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/

-+    int32_t vhf_blf_bypass;

-+    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/

-+    int32_t vhf_min_distance_clamp;

-+    /*!< hf_lcs_cu_slope[5] PARAM_HFC_LCS_CU_SLOPE*/

-+    int32_t hf_lcs_cu_slope[5];

-+    /*!< hf_lcs_cu_x[6] PARAM_HFC_LCS_CU_X*/

-+    int32_t hf_lcs_cu_x[6];

-+    /*!< hf_lcs_cu_y[5] PARAM_HFC_LCS_CU_Y*/

-+    int32_t hf_lcs_cu_y[5];

-+    /*!< hf_lcs_bypass Param_HFC_LCS_bypass*/

-+    int32_t hf_lcs_bypass;

-+    /*!< hf_lcs_thresh_high HFC_LCS_THRESHOLD_HIGH*/

-+    uint32_t hf_lcs_thresh_high;

-+    /*!< hf_lcs_thresh_low PARAM_HFC_LCS_THRESH_LOW*/

-+    uint32_t hf_lcs_thresh_low;

-+    /*!< hf_lcs_chm_gain PARAM_HFC_LCS_CHM_GAIN*/

-+    uint32_t hf_lcs_chm_gain;

-+    /*!< hf_lcs_ylocal_size ylocal filter size 0 - 5x5, 1 - 7x7*/

-+    uint32_t hf_lcs_ylocal_size;

-+    /*!< hf_lcs_chm_size chroma metric filter size 0 - 5x5, 1 - 7x7*/

-+    uint32_t hf_lcs_chm_size;

-+    /*!< vlf_power_uv VLF denoise power chroma*/

-+    int32_t vlf_power_uv;

-+    /*!< vlf_power_y VLF denoise power luma*/

-+    int32_t vlf_power_y;

-+    /*!< lf_power_uv LF denoise power chroma*/

-+    int32_t lf_power_uv;

-+    /*!< lf_power_y VLF denoise power luma*/

-+    int32_t lf_power_y;

-+    /*!< mf_power_uv MF denoise power chroma*/

-+    int32_t mf_power_uv;

-+    /*!< mf_power_y MF denoise power luma*/

-+    int32_t mf_power_y;

-+    /*!< hf_power_uv HF denoise power chroma*/

-+    int32_t hf_power_uv;

-+    /*!< vhf_power_y VHF denoise power luma*/

-+    int32_t vhf_power_y;

-+    /*!< top_ds_2x_coefs[5] 1:2 downscaling filter coefficients*/

-+    int32_t top_ds_2x_coefs[5];

-+    /*!< top_ds_4x_coefs[7] 1:4 downscaling filter coefficients*/

-+    int32_t top_ds_4x_coefs[7];

-+

-+} ia_pal_isp_xnr_5_2_t;

-+

-+/*! \isp struct xnr_dss

-+Scalable Chroma and Luma Denoise, Medium and High Frequency

-+*/

-+typedef struct

-+{

-+    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

-+    int32_t jbl_mf_bypass_y;

-+    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

-+    int32_t jbl_mf_bypass_c;

-+    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

-+    int32_t noise_sigma_mf_y_y;

-+    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

-+    int32_t noise_sigma_mf_y_s;

-+    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

-+    int32_t noise_sigma_mf_c_y;

-+    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

-+    int32_t noise_sigma_mf_c_u;

-+    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

-+    int32_t noise_sigma_mf_c_v;

-+    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_y_y;

-+    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

-+    int32_t rad_noise_sigma_mf_y_s;

-+    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

-+    int32_t rad_noise_sigma_mf_c_y;

-+    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

-+    int32_t rad_noise_sigma_mf_c_u;

-+    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

-+    int32_t rad_noise_sigma_mf_c_v;

-+    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_y_y;

-+    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

-+    int32_t noise_epsilon_mf_c_y;

-+    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

-+    int32_t noise_epsilon_mf_c_u;

-+    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

-+    int32_t noise_epsilon_mf_c_v;

-+    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_y_y;

-+    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_y;

-+    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_u;

-+    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

-+    int32_t rad_noise_epsilon_mf_c_v;

-+    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_y;

-+    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

-+    int32_t jbl_weight_th_mf_c;

-+    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

-+    int32_t lpf_mf_coef_y[49];

-+    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

-+    int32_t lpf_mf_coef_c[49];

-+    /*!< range_weight_lut[7] JBL range Weight LUT*/

-+    int32_t range_weight_lut[7];

-+    /*!< blend_mf_power_y MF denoise blending power y*/

-+    int32_t blend_mf_power_y;

-+    /*!< blend_mf_power_c MF denoise blending power chroma*/

-+    int32_t blend_mf_power_c;

-+    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

-+    int32_t rad_blend_mf_power_y;

-+    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

-+    int32_t rad_blend_mf_power_c;

-+    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

-+    int32_t noise_beta_y_0;

-+    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

-+    int32_t noise_beta_u_0;

-+    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

-+    int32_t noise_beta_u_1;

-+    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

-+    int32_t noise_beta_v_0;

-+    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

-+    int32_t noise_beta_v_2;

-+    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_x;

-+    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

-+    int32_t rad_center_y;

-+    /*!< rad_exp Radial scale bit into the Lut*/

-+    int32_t rad_exp;

-+    /*!< rad_lut[128] Radial LUT*/

-+    int32_t rad_lut[128];

-+    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

-+    int32_t one_div_64_lut[64];

-+    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

-+    int32_t xcu_divsqrt_exp;

-+    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

-+    int32_t xcu_divsqrt_slp_a_res;

-+    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

-+    int32_t xcu_divsqrt_offset[16];

-+    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

-+    int32_t xcu_divsqrt_slope[16];

-+    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

-+    int32_t xcu_divsqrt_x[17];

-+    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/

-+    int32_t lcs_th_low;

-+    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/

-+    int32_t lcs_th_high_delta;

-+    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/

-+    int32_t rad_lcs_th_low;

-+    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/

-+    int32_t rad_lcs_th_high_delta;

-+    /*!< xcu_lcs_exp XCU ed exponent*/

-+    int32_t xcu_lcs_exp;

-+    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/

-+    int32_t xcu_lcs_slp_a_res;

-+    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/

-+    int32_t xcu_lcs_offset[32];

-+    /*!< xcu_lcs_slope[32] XCU ed slope vector*/

-+    int32_t xcu_lcs_slope[32];

-+    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/

-+    int32_t xcu_lcs_x[33];

-+    /*!< hf_luma_power HF Luma denoise power, Q15*/

-+    int32_t hf_luma_power;

-+    /*!< blend_hf_power_y HF blending power luma*/

-+    int32_t blend_hf_power_y;

-+    /*!< blend_hf_power_c HF blending power chroma*/

-+    int32_t blend_hf_power_c;

-+

-+} ia_pal_isp_xnr_dss_t;

-+

-+

-+

-+#pragma pack(push, 4)

-+

-+/*! \system api struct io_buffer

-+

-+*/

-+typedef struct

-+{

-+    /*!< block_height buffer block height configuration in lines*/

-+    uint16_t block_height;

-+    /*!< block_width buffer block width configuration in pixels*/

-+    uint16_t block_width;

-+    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/

-+    uint8_t buffer_1d_enable;

-+    /*!< burst_align 0-each request should be aligned to burst size except first request in line (alignment done at first request since the burst size is power of 2),  1-each request should be at burst size except page boundry and EOL*/

-+    uint8_t burst_align;

-+    /*!< chroma_base_conversion chroma converted from zero-based to half-based or vice versa*/

-+    uint8_t chroma_base_conversion;

-+    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/

-+    uint8_t chroma_duplication;

-+    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/

-+    uint8_t chroma_planes_order;

-+    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/

-+    uint8_t component_in_valid_pixel;

-+    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/

-+    uint8_t component_precision;

-+    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/

-+    uint8_t compression_mode;

-+    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

-+    uint8_t dpa_bypass;

-+    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/

-+    uint16_t first_row_blocks_height;

-+    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/

-+    uint16_t granularity_pointer_update;

-+    /*!< in_chroma_signed chroma in input is signed (1) or unsigned (0)*/

-+    uint8_t in_chroma_signed;

-+    /*!< in_luma_signed luma in input is signed (1) or unsigned (0)*/

-+    uint8_t in_luma_signed;

-+    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/

-+    uint16_t last_row_blocks_height;

-+    /*!< local_link_id indicates the stream used at the current connectlon*/

-+    uint8_t local_link_id;

-+    /*!< luma_base_conversion luma converted from zero-based to half-based or vice versa*/

-+    uint8_t luma_base_conversion;

-+    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/

-+    uint32_t max_credits;

-+    /*!< max_stride provides the maximum stride value to be used at the connection*/

-+    uint16_t max_stride;

-+    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/

-+    uint8_t middle_ack_enable;

-+    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/

-+    uint16_t middle_ack_line_number;

-+    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/

-+    uint8_t middle_ack_mode_stall;

-+    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

-+    uint8_t mipi_csi_eof;

-+    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/

-+    uint8_t num_of_planes;

-+    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/

-+    uint8_t num_of_queues;

-+    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/

-+    uint8_t onep_pixel_order;

-+    /*!< out_chroma_signed chroma in output is signed (1) or unsigned (0)*/

-+    uint8_t out_chroma_signed;

-+    /*!< out_luma_signed luma in output is signed (1) or unsigned (0)*/

-+    uint8_t out_luma_signed;

-+    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/

-+    uint16_t pace_message_pace_line;

-+    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/

-+    uint16_t pace_message_ref_line;

-+    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/

-+    uint8_t pixels_in_valid_cycle;

-+    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/

-+    uint8_t plane_horiz_subsample_config[3];

-+    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/

-+    uint8_t plane_max_burst_size[3];

-+    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

-+    uint32_t plane_offset_end_address[3];

-+    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

-+    uint32_t plane_offset_start_address[3];

-+    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/

-+    uint32_t plane_stride[3];

-+    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/

-+    uint8_t plane_tile_height[3];

-+    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/

-+    uint8_t plane_tile_width[3];

-+    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/

-+    uint8_t plane_vert_subsample_config[3];

-+    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/

-+    uint8_t plane_zlr_granularity[3];

-+    /*!< ppc provides the amount of pixel per cycle*/

-+    uint8_t ppc;

-+    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/

-+    uint8_t proc_ff_bypass;

-+    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/

-+    uint16_t progress_message_line;

-+    /*!< sif_user_info2 information to be given by FW and used in the pipeline (driven by IFD). Read bus width defined by HWP*/

-+    uint32_t sif_user_info2;

-+    /*!< stream_dt stream data type as need to be used by the MIPI*/

-+    uint8_t stream_dt;

-+    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/

-+    uint8_t stream_vc;

-+    /*!< stream_wc stream word count as need to be used by the MIPI*/

-+    uint16_t stream_wc;

-+    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/

-+    uint8_t streaming_mode;

-+    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/

-+    uint8_t streaming_sw_managed;

-+    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/

-+    uint8_t stride_ratio;

-+    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/

-+    uint8_t subsample_YUV444_to_YUV422;

-+    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/

-+    uint8_t tile_mode;

-+    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/

-+    uint8_t tiling_type;

-+    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/

-+    uint8_t unpack_alignment;

-+    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/

-+    uint8_t vector_format;

-+    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/

-+    uint8_t vertical_ordering_enable;

-+    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/

-+    uint8_t vertical_ordering_sub_line;

-+    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/

-+    uint8_t zlr_transaction_enable;

-+

-+} ia_pal_system_api_io_buffer_t;

-+

-+

-+

-+#pragma pack(pop)

-+

-+#ifdef __cplusplus

-+}

-+#endif

-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
-new file mode 100644
-index 000000000000..4e7dd56f846c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
-@@ -0,0 +1,111 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_STATISTICS_TYPES_H_
-+#define __IA_STATISTICS_TYPES_H_
-+
-+#include "ia_types.h"
-+#include "ia_configuration.h"
-+
-+#define IA_RGBS_GRID_SIZE (IA_RGBS_GRID_WIDTH * IA_RGBS_GRID_HEIGHT)
-+
-+ /*!
-+ * \brief Bayer color channels grouped into one structure.
-+ */
-+typedef struct
-+{
-+    unsigned char gr;
-+    unsigned char r;
-+    unsigned char b;
-+    unsigned char gb;
-+} ia_color_channels;
-+
-+/*!
-+ * \brief Statistics grid with averaged RGBS color channels and saturation percentage.
-+ * Total size of each color channel array is defined by width * height of the grid.
-+ */
-+typedef struct
-+{
-+    unsigned int grid_width;                        /*!< Mandatory. Width of RGBYS grids. */
-+    unsigned int grid_height;                       /*!< Mandatory. Height of RGBYS grids. */
-+    ia_color_channels avg[IA_RGBS_GRID_SIZE];       /*!< Mandatory. Averaged R, Gr, Gb and B channel data. */
-+    unsigned char sat[IA_RGBS_GRID_SIZE];           /*!< Mandatory. Saturation percentage of pixels within collected data. [0, 255] = [0, 100]%. */
-+} ia_rgbs_grid;
-+
-+#define IA_FILTER_RESPONSE_GRID_SIZE (IA_FILTER_RESPONSE_GRID_WIDTH * IA_FILTER_RESPONSE_GRID_HEIGHT)
-+
-+/*!
-+ * \brief Filter responses interleaved.
-+ */
-+typedef struct
-+{
-+    int filter_1;    /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
-+    int filter_2;    /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
-+} ia_filter_response;
-+
-+/*!
-+ * \brief Convolution filter respose statistics
-+ * As defined in the AIQ statistics specification.
-+ */
-+typedef struct
-+{
-+    unsigned int grid_width;                                    /*!< Number of block elements horizontally in a grid. */
-+    unsigned int grid_height;                                   /*!< Number of block elements vertically in a grid. */
-+    ia_filter_response responses[IA_FILTER_RESPONSE_GRID_SIZE]; /*!< Interleaved filter responses. */
-+} ia_filter_response_grid;
-+
-+typedef struct
-+{
-+    unsigned int element_count;                     /*!< Number of elements in the histogram. */
-+    unsigned int bins[IA_HISTOGRAM_SIZE];           /*!< Histogram data. */
-+} ia_histogram;
-+
-+typedef struct
-+{
-+    ia_rectangle   face_area;                 /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
-+    int32_t        tracking_id;               /*!< Tracking id of the face. */
-+    int32_t        confidence;                /*!< Confidence in face detection result. */
-+    ia_coordinate  mouth;                     /*!< Mid-point of the mouth. */
-+    ia_coordinate  left_eye;                  /*!< Left eye */
-+    ia_coordinate  right_eye;                 /*!< Right eye */
-+    bool           eye_validity;              /*!< Indicates whether a face was processed to get eye positions */
-+    float          skin_type_dark_likelihood; /*!< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
-+    bool           skin_type_validity;        /*!< Validity of the Skin Likelihood */
-+} ia_face_roi;
-+
-+
-+#define IA_DEPTH_GRID_SIZE (IA_DEPTH_GRID_WIDTH * IA_DEPTH_GRID_HEIGHT)
-+
-+typedef enum
-+{
-+    ia_depth_data_type_vcm,     /*!< VCM units */
-+    ia_depth_data_type_mm,      /*!< Distance to the object in mm */
-+} ia_depth_data_type;
-+
-+/*!
-+ * Depth statistics grid.
-+ */
-+typedef struct
-+{
-+    unsigned int grid_width;                      /*!< Number of grid elements horizontally */
-+    unsigned int grid_height;                     /*!< Number of grid elements vertically */
-+    ia_depth_data_type type;                      /*!< Data type (VCM units/mm)*/
-+    ia_rectangle grid_rect;                       /*!< ROI for the grid */
-+    int depth_data[IA_DEPTH_GRID_SIZE];           /*!< Depth data (type of data is defined by ia_depth_data_type) */
-+    unsigned char confidence[IA_DEPTH_GRID_SIZE]; /*!< Confidence level */
-+} ia_depth_grid;
-+
-+#endif /* __IA_STATISTICS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
-new file mode 100644
-index 000000000000..33a8998baff5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
-@@ -0,0 +1,309 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_TYPES_H_
-+#define _IA_TYPES_H_
-+
-+#include <stdlib.h>
-+#include <stdarg.h>
-+#include <stdint.h>
-+
-+#if defined(_MSC_VER)
-+    #if !defined(__BOOL_DEFINED)
-+        #if _MSC_VER >= 1800 /* stdbool.h is available starting from VS2013. */
-+            #include <stdbool.h>
-+        #else /* Fallback for older VS versions. */
-+            typedef unsigned char bool;
-+            #define true 1
-+            #define false 0
-+        #endif
-+    #endif
-+#else
-+    #include <stdbool.h>
-+#endif
-+
-+#ifdef _WIN32
-+    #ifndef BUILD_SHARED_LIBS
-+        #define LIBEXPORT
-+    #else
-+        #ifdef BUILD_SHARED_LIBS
-+            #define LIBEXPORT __declspec(dllexport)
-+        #else
-+            #define LIBEXPORT __declspec(dllimport)
-+        #endif
-+    #endif
-+#else
-+    #define LIBEXPORT
-+#endif
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ *  \brief Bundles binary data pointer with size.
-+ */
-+typedef struct
-+{
-+    void        *data;
-+    unsigned int size;
-+} ia_binary_data;
-+
-+/**
-+ *  \brief Defines a common record header.
-+ */
-+typedef struct
-+{
-+    unsigned int uuid;
-+    unsigned int size;
-+} ia_record_header;
-+
-+typedef struct {
-+    int major;
-+    int minor;
-+} ia_version;
-+
-+typedef enum {
-+    CAPTURE_OUTPUT,
-+    CAPTURE_VFPP,
-+    PREVIEW_VFPP,
-+    ACC_QOS
-+} ia_acceleration_fw_dst;
-+
-+typedef struct {
-+    void *isp;
-+    void *(*open_firmware)     (const char *fw_path, unsigned *size);
-+    int   (*load_firmware)     (void *isp, void *fw, unsigned size, unsigned *handle);
-+    int   (*unload_firmware)   (void *isp, unsigned handle);
-+    int   (*map_firmware_arg)  (void *isp, void *usr_ptr, size_t size, unsigned long *css_ptr);
-+    int   (*unmap_firmware_arg)(void *isp, unsigned long css_ptr, size_t size);
-+    int   (*set_firmware_arg)  (void *isp, unsigned handle, unsigned num, void *val, size_t size);
-+    int   (*set_mapped_arg)    (void *isp, unsigned handle, unsigned mem, unsigned long css_ptr, size_t size);
-+    int   (*start_firmware)    (void *isp, unsigned handle);
-+    int   (*wait_for_firmware) (void *isp, unsigned handle);
-+    int   (*abort_firmware)    (void *isp, unsigned handle, unsigned timeout);
-+    ia_version version_isp;
-+    ia_version version_css;
-+    int   (*set_stage_state)   (void *isp, unsigned int handle, bool enable);
-+    int   (*wait_stage_update) (void *isp, unsigned int handle);
-+    int   (*load_firmware_ext) (void *isp, void *fw, unsigned size, unsigned *handle, int fw_dst);
-+} ia_acceleration;
-+
-+typedef enum {
-+    ia_frame_format_nv12,       /* 12 bit YUV 420, Y, UV plane */
-+    ia_frame_format_yuv420,     /* 12 bit YUV 420, Y, U, V plane */
-+    ia_frame_format_yuv444,     /* 24 bit YUV 444, Y, U, V plane */
-+    ia_frame_format_raw,        /* RAW, 1 plane */
-+    ia_frame_format_rgba32,     /* RGBA 8 bits per channel */
-+    ia_frame_format_yuy2,       /* 16 bit YUV 422, YUYV plane */
-+    ia_frame_format_raw16,      /* 16 bit RAW, 1 plane */
-+    ia_frame_format_rgb16p,     /* 16 bits per channel, 3 planes */
-+    ia_frame_format_yuv420sp16, /* 24 bit YUV 420, Y, UV plane */
-+    ia_frame_format_yuv420p16,  /* 24 bit YUV 420, Y, U, V plane */
-+    ia_frame_format_yuv444p16,  /* 48 bit YUV 444, Y, U, V plane */
-+} ia_frame_format;
-+
-+typedef struct {
-+    void           *data;     /**< Pointer to the image data */
-+    int             size;     /**< Total number of bytes in data*/
-+    int             width;    /**< Width of the frame in pixels */
-+    int             height;   /**< Height of the frame in lines */
-+    ia_frame_format format;   /**< Frame format */
-+    int             stride;   /**< Stride, bytes per line*/
-+    int             rotation; /**< degrees 0-360 */
-+} ia_frame;
-+
-+/*!
-+* \brief Raw image data format.
-+*/
-+typedef enum
-+{
-+    ia_image_data_format_rawplain16,             /*!< Data is 16 bits per pixel. */
-+    ia_image_data_format_rawplain8,              /*!< Data is 8 bits per pixel. */
-+    ia_image_data_format_rgb16,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 16 bits per pixel. */
-+    ia_image_data_format_smia10,                 /*!< SMIA 10 format groups 4 pixels: MSBs of four pixels in 4 bytes + LSBs of same 4 pixels in 1 byte. */
-+    ia_image_data_format_nv12,                   /*!< Data is 12 bit YUV 420, Y, UV plane. */
-+    ia_image_data_format_yuv420_planar,          /*!< Data is YUV 420 planar. */
-+    ia_image_data_format_rawplain16_interleaved, /*!< Data is 16 bits per pixel interleaved so that all bayer quad pixels are one after another. Example: GRBGGRBG...*/
-+    ia_image_data_format_rawplain32,             /*!< Data is 32 bits per pixel. */
-+    ia_image_data_format_rgb32,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 32 bits per pixel. */
-+    ia_image_data_format_ov20bit                 /*!< Data is in as 2x10bit pixels [13 12 11 10 f e d c][x x x x x x b a] [9 8 7 6 5 4 3 2][x x x x x x 1 0]*/
-+} ia_image_data_format;
-+
-+/*!
-+* \brief Raw image essential information.
-+* If raw image data doesn't contain any extra bytes/lines/columns, the image can be decoded with this info.
-+* For all signed values in the structs below, negative value indicates N/A.
-+*/
-+typedef struct
-+{
-+    unsigned char data_format;   /*!< RawPlain16, RawPlain8 etc. as defined in the enum ia_image_data_format */
-+    char bayer_order;            /*!< GRBG, RGGB, BGGR or GBRG as defined in the enum cmc_bayer_order. -1 if N/A */
-+    char data_format_bpp;        /*!< Bits per pixel for a given data_format. eg. 16 for RawPlain16 etc. -1 if N/A*/
-+    char data_bpp;               /*!< Bits per pixel used by the image data. -1 if N/A */
-+    unsigned int width_cols;     /*!< Visible image width (640, 800, 1280, 1600, etc.) */
-+    unsigned int height_lines;   /*!< Visible image height (480, 600, 960, 1200, etc.) */
-+} ia_image_info;
-+
-+/*!
-+* \brief Raw image info with additional details about extra bytes/lines/columns to skip when decoding the raw image.
-+* This structure is stored inside header of Intel raw (IRAW) image as a makernote record. If a raw capture consists of multiple sub-images
-+* (for example from multiple exposures or cameras), each sub-image needs to have own makernote record (with different name id).
-+* image_start_offset defines start location of particular sub-image in the IRAW buffer/file.
-+*/
-+typedef struct
-+{
-+    ia_image_info raw_image;            /*!< Essential information needed to decode the image. */
-+    unsigned int header_size_bytes;     /*!< Variable size header */
-+    unsigned int footer_size_bytes;     /*!< Variable size footer */
-+
-+    unsigned short extra_bytes_left;    /*!< e.g. CCP sync codes */
-+    unsigned short extra_bytes_right;   /*!< e.g. CCP sync codes */
-+
-+    unsigned short extra_lines_top;     /*!< Non-image data, e.g. embedded data lines */
-+    unsigned short extra_cols_left;     /*!< Non-image data, extra columns at left */
-+    unsigned short extra_cols_right;    /*!< Non-image data, extra columns at right */
-+    unsigned short extra_lines_bottom;  /*!< Non-image data, e.g. embedded data lines */
-+
-+    char byte_order_xor;                /*!< 0, 1 or 3 (for the cases when byte order has been modified for whatever reason) */
-+    char spatial_sampling;              /*!< 0 or 1 = Bayer or Co-sited */
-+    unsigned short reserved;            /*!< Reserved to padding for 32 bit boundary. */
-+    unsigned int image_start_offset;    /*!< Offset to beginning of image buffer. 0 if one image is present in the RAW image buffer. */
-+} ia_image_full_info;
-+
-+/** Floating point range struct. */
-+typedef struct {
-+    float min;
-+    float max;
-+} ia_float_range;
-+
-+/*!
-+ * Needs to be agreed with ia_imaging error codes.
-+ * \brief Error codes.
-+*/
-+typedef enum {
-+    ia_err_none     =  0,       /*!< No errors*/
-+    ia_err_general  = (1 << 1), /*!< General error*/
-+    ia_err_nomemory = (1 << 2), /*!< Out of memory*/
-+    ia_err_data     = (1 << 3), /*!< Corrupted data*/
-+    ia_err_internal = (1 << 4), /*!< Error in code*/
-+    ia_err_argument = (1 << 5), /*!< Invalid argument for a function*/
-+    ia_err_disabled = (1 << 6)  /*!< Functionality is disabled*/
-+} ia_err;
-+
-+typedef struct {
-+    int left;
-+    int top;
-+    int right;
-+    int bottom;
-+} ia_rectangle;
-+
-+/** Vector, used for image stabilization. */
-+typedef struct {
-+    int x;
-+    int y;
-+} ia_vector;
-+
-+/** Coordinate, used in red-eye correction. */
-+typedef struct {
-+    int x;
-+    int y;
-+} ia_coordinate;
-+
-+typedef struct {
-+    void (*vdebug)(const char *fmt, va_list ap);
-+    void (*verror)(const char *fmt, va_list ap);
-+    void (*vinfo)(const char *fmt, va_list ap);
-+} ia_env;
-+
-+typedef struct {
-+    void *(*alloc) (void *isp, size_t size);
-+    void  (*free)  (void *isp, void *usr_ptr, size_t size);
-+} ia_mem_env;
-+
-+
-+/*!
-+* \brief Structure describes the media formats which AIC supports
-+*/
-+typedef enum
-+{
-+    media_format_legacy                = 0x00,    //ipu4 default
-+    media_format_bt601_8b              = 0x20,    //bt601
-+    media_format_bt601_8b_narrow       = 0x22,    //bt601
-+    media_format_bt709_8b              = 0x30,    //bt709
-+    media_format_bt709_8b_narrow       = 0x32,    //bt709
-+    media_format_bt709_10b             = 0x40,    //bt709
-+    media_format_bt709_10b_narrow      = 0x42,    //bt709
-+    media_format_bt2020_10b            = 0x50,    //bt2020
-+    media_format_bt2020_10b_narrow     = 0x52,    //bt2020
-+    media_format_bt2020_12b            = 0x51,    //bt2020
-+    media_format_bt2020_12b_narrow     = 0x53,    //bt2020
-+    media_format_bt2100_10b            = 0x60,    //bt2100
-+    media_format_bt2100_10b_narrow     = 0x62,    //bt2100
-+    media_format_bt2100_12b            = 0x61,    //bt2100
-+    media_format_bt2100_12b_narrow     = 0x63,    //bt2100
-+    media_format_bt2100_10b_cl         = 0x64,    //bt2100
-+    media_format_bt2100_10b_cl_narrow  = 0x66,    //bt2100
-+    media_format_bt2100_12b_cl         = 0x65,    //bt2100
-+    media_format_bt2100_12b_cl_narrow  = 0x67,    //bt2100
-+    media_format_srgb_jpeg             = 0x80,    //srgb_jpeg
-+    media_format_linear_mono           = 0xE0,    //linear gamma with "mono-srgb" space for e.g. IR mode.
-+    media_format_custom                = 0xF0     //custom
-+} ia_media_format;
-+
-+/** @brief Representing eyes.
-+ * This structure represents the eye position and the blink state.
-+ */
-+typedef struct {
-+    ia_coordinate position;                  /**< Position of the eye. */
-+    int32_t       blink_confidence;          /**< Blink status in [0..100] range where 0 means wide open eye and 100 means fully closed eye.
-+                                             negative integer means blink result is invalid (based on invalid ED position result) */
-+} ia_atbx_eye;
-+
-+typedef struct {
-+    ia_rectangle   face_area;                /**< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
-+    int32_t        rip_angle;                /**< RIP (rotation in plane) angle in degrees. */
-+    int32_t        rop_angle;                /**< ROP (rotation out of plane) angle in degrees. */
-+    int32_t        tracking_id;              /**< Tracking id of the face. */
-+    int32_t        confidence;               /**< Confidence in face detection result. */
-+    int32_t        person_id;                /**< Person id (typically positive number) of the face. Filled after face recognition. -1 if not recognized. */
-+    int32_t        similarity;               /**< Similarity value between this face and the face in the database which was recognized as the person. */
-+    int32_t        best_ratio;               /**< Indicates the ratio between the most similar face and the 2nd similar face. */
-+    int32_t        face_condition;           /**< Indicates the light condition of the face. Not used at this moment. */
-+    int32_t        smile_state;              /**< Smile state of the face. -1 : invalid info (based on invalid ED position result)
-+                                             0 : Non-smile, 1 : Smile, 2 : Start of the smile. Auxiliary variable for smile shutter. */
-+    int32_t        smile_score;              /**< Smile score in the range of [0..100] where 0 is non-smile state and 100 is full smile state. */
-+    ia_coordinate  mouth;                    /**< Mid-point of the mouth. */
-+    ia_atbx_eye    left_eye;                 /**< Left eye */
-+    ia_atbx_eye    right_eye;                /**< Right eye */
-+    int32_t        eye_validity;             /**< Indicates whether a face was processed to get eye positions */
-+    int32_t        skin_type_dark_likelihood;/**< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
-+    int32_t        skin_type_validity;       /**< Validity of the Skin Likelihood */
-+} ia_atbx_face;
-+
-+/** @brief Face state data.
-+ * This structure is used to hold inputs and outputs of functions and also works as a handle of the engine instance.
-+ */
-+typedef struct {
-+    int32_t        num_faces;                /**< Number of faces in the recently processed input frame. */
-+    ia_atbx_face  *faces;                    /**< Array of face information. */
-+} ia_atbx_face_state;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _IA_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
-new file mode 100644
-index 000000000000..b452ada462ad
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
-@@ -0,0 +1,163 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __IA_VIEW_H__
-+#define __IA_VIEW_H__
-+
-+
-+#include "ia_view_types.h"
-+#include "ia_cmc_types.h"
-+
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*! \brief Initialize the view module.
-+ *
-+ * \param[out]  view_handle    handle maintaining the view instance
-+ * \param[in]  cmc    The CMC parameters
-+ * \return                        0 for no error, others for error.
-+ *
-+ * This function initializes the view module. This is expected to be called before any
-+ * other ia_view* function.
-+ */
-+LIBEXPORT ia_err
-+ia_view_init(ia_view_handle *view_handle, const ia_cmc_t *cmc);
-+
-+
-+/*! \brief Deinitialize the view module.
-+ *
-+ * \param[in]  ia_view_handle    handle maintaining the view instance
-+ *
-+ * This function deinitilizes the view module and frees internal memory
-+ */
-+LIBEXPORT ia_err
-+ia_view_deinit(ia_view_handle *view_handle);
-+
-+
-+/*! \brief Set configuration parameters
-+*
-+* \param[in]  ia_view_handle   handle maintaining the view instance
-+* \param[in]  config           Sets the basic configuration for the view
-+*
-+* This function sets the basic configurations parameters
-+*/
-+LIBEXPORT ia_err
-+ia_view_set_configuration(ia_view_handle view_handle,
-+    const ia_view_config_t *config);
-+
-+
-+/*! \brief Get configuration parameters
-+*
-+* \param[in]  ia_view_handle   handle maintaining the view instance
-+* \param[out] config           Sets the basic configuration for the view
-+*
-+* This function gets the basic configurations parameters
-+*/
-+LIBEXPORT ia_err
-+ia_view_get_configuration(ia_view_handle view_handle,
-+    ia_view_config_t *config);
-+
-+/*! \brief Run the view parameter calculation
-+*
-+* \param[in]  ia_view_handle   handle maintaining the view instance
-+* \param[in]  camera_rotation  camera rotation matrix from DVS
-+*
-+* This function does the calculation of parameters
-+*/
-+LIBEXPORT ia_err
-+ia_view_run(ia_view_handle view_handle,
-+    const float camera_rotation[3][3]);
-+
-+/*! \brief Get the last calculated view parameters
-+*
-+* \param[in]  ia_view_handle   handle maintaining the view instance
-+* \param[out] view_params      Get calculated view parameters
-+*
-+* This function returns the view parameters
-+*/
-+LIBEXPORT ia_err
-+ia_view_get_view_parameters(ia_view_handle view_handle,
-+    ia_view_params_t *view_params);
-+
-+
-+/*! \brief Set view rotation
-+*
-+* \param[in]  ia_view_handle    handle maintaining the view instance
-+* \param[in]  view_rotation     New rotation to apply
-+*
-+* This function sets the new view rotation
-+*/
-+LIBEXPORT ia_err
-+ia_view_set_view_rotation(ia_view_handle view_handle,
-+    const ia_view_rotation_t *view_rotation);
-+
-+/*! \brief Set camera rotation
-+*
-+* \param[in]  ia_view_handle    handle maintaining the view instance
-+* \param[in]  view_rotation     New rotation to apply
-+*
-+* This function sets the new camera rotation
-+*/
-+LIBEXPORT ia_err
-+ia_view_set_camera_rotation(ia_view_handle view_handle,
-+    const ia_view_rotation_t *camera_rotation);
-+
-+/*! \brief Get view rotation
-+*
-+* \param[in]  ia_view_handle    handle maintaining the view instance
-+* \param[out] view_rotation    The current rotation settings
-+*
-+* This function get the current view rotation
-+*/
-+LIBEXPORT ia_err
-+ia_view_get_view_rotation(ia_view_handle view_handle,
-+     ia_view_rotation_t *view_rotation);
-+
-+
-+/*! \brief Set window adjustment parameters
-+*
-+* \param[in] ia_view_handle    handle maintaining the view instance
-+* \param[in] fine_adjustments  Set the window adjustment parameters
-+*
-+* This function sets the window adjustment
-+*/
-+LIBEXPORT ia_err
-+ia_view_set_fine_adjustments(ia_view_handle view_handle,
-+    const ia_view_fine_adjustments_t *fine_adjustments);
-+
-+
-+/*! \brief Get window adjustment parameters
-+*
-+* \param[in]  ia_view_handle   handle maintaining the view instance
-+* \param[out] fine_adjustments Get the window adjustment parameters
-+*
-+* This function gets the current window adjustment
-+*/
-+LIBEXPORT ia_err
-+ia_view_get_fine_adjustments(ia_view_handle view_handle,
-+    ia_view_fine_adjustments_t *fine_adjustments);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* __IA_VIEW_H__ */
-+
-+
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
-new file mode 100644
-index 000000000000..923e060f0967
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
-@@ -0,0 +1,220 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __IA_VIEW_TYPES_H_
-+#define __IA_VIEW_TYPES_H_
-+
-+#include <stdint.h>
-+#include "ia_types.h"
-+
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/*!< ia_view_status_t: ia_view enable/disable and configure status */
-+typedef enum {
-+    ia_view_bypass=0,
-+    ia_view_user_input_configured,
-+    ia_view_resolution_configured,
-+} ia_view_status_t;
-+
-+/*!< ia_view_proc_enabled_t: The processing blocks enabled in GDC. Used in PAL*/
-+typedef enum {
-+    ia_view_proc_enabled_none=0,
-+    ia_view_proc_enabled_pre_affine=(1<<0),
-+    ia_view_proc_enabled_rotation=(1<<1),
-+    ia_view_proc_enabled_post_affine=(1<<2),
-+} ia_view_proc_enabled_t;
-+
-+
-+/*!< ia_view_resolution_params_t: The frame resolutions at various points in the pipe*/
-+typedef enum {
-+    ia_view_resolution_at_sensor_output=0, /*Resolution at sensor output */
-+    ia_view_resolution_at_gdc_input,       /*Resolution at gdc input */
-+    ia_view_resolution_at_gdc_output,      /*Resolution at gdc output */
-+    ia_view_resolution_at_pipe_output,     /*Resolution at pipe output */
-+    ia_view_resolution_max,
-+} ia_view_resolution_params_t;
-+
-+
-+/*!< Invalid coordinate size: Number of color channels possible to be specified.*/
-+#define IA_VIEW_INVALID_COORD_SIZE      (4)
-+
-+/*!< ia_view_projection_type_t: User controllable projection type*/
-+typedef enum {
-+    ia_view_projection_rectilinear,
-+    ia_view_projection_conical,
-+    ia_view_projection_equirectangular,
-+    ia_view_projection_2Dbowl,
-+    ia_view_projection_cylindrical
-+} ia_view_projection_type_t;
-+
-+/*!< ia_view_camera_mount_type_t: User controllable camera mount type*/
-+typedef enum {
-+    ia_view_wall_mounted,
-+    ia_view_ceiling_mounted,
-+} ia_view_camera_mount_type_t;
-+
-+/*!< ia_view_fine_adjustments_t: Control fine adjustments of the viewing window*/
-+typedef struct
-+{
-+    float horizontal_shift;    /*!< Horizontal shift in pixels*/
-+    float vertical_shift;      /*!< Vertical shift in pixels*/
-+    float window_rotation;     /*!< Rotate the window, angle in degrees*/
-+    float vertical_stretch;    /*!< Vertical stretch factor*/
-+} ia_view_fine_adjustments_t;
-+
-+
-+/*!< ia_view_rotation_t: Set view rotation in x, y, z axis*/
-+typedef struct
-+{
-+    float pitch;   /*!< pitch angle in degrees: rotation along X axis*/
-+    float yaw;     /*!< yaw angle in degrees: rotation along Y axis*/
-+    float roll;    /*!< roll angle in degrees: rotation along Z axis*/
-+} ia_view_rotation_t;
-+
-+
-+/*!< ia_view_resolution_t: The resolution required for view*/
-+typedef struct
-+{
-+    int width;      /*!< Resolution width */
-+    int height;     /*!< Resolution height */
-+    int horz_offset;    /*!< Horizontal offset */
-+    int vert_offset;    /*!< Vertical offset */
-+    float scale_factor; /*!< Scale factor */
-+} ia_view_resolution_t;
-+
-+/*!< translation array size*/
-+#define IA_VIEW_3D_TRANSLATION_SIZE (3)
-+
-+/*!< ia_view_config_t: Set view parameters*/
-+typedef struct
-+{
-+    ia_view_projection_type_t type;   /*!< type: The projection type desired*/
-+    float zoom;                       /*!< zoom: Zoom configuration*/
-+    float cone_angle;                 /*!< cone_angle used only for ia_view_projection_conical*/
-+    double bowl_radius_sqr;            /*!< bowl_radius_sqr used only for ia_view_projection_2Dbowl*/
-+    double bowl_scale;                 /*!< bowl_scale used only for ia_view_projection_2Dbowl*/
-+    ia_view_camera_mount_type_t camera_mount_type; /*! camera mount type: The mounting position of the camera: wall, ceiling*/
-+    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE]; /*!< Used to fill for each color channel when coordinates falls out of bounds */
-+
-+    ia_view_rotation_t          camera_rotation;     /*(< Camera rotation configuration */
-+    ia_view_rotation_t          view_rotation;       /*!< View rotation configuration */
-+    float translation[IA_VIEW_3D_TRANSLATION_SIZE];  /*!< Translation3D vector for Bowl projection*/
-+    ia_view_fine_adjustments_t  fine_adjustments;    /*!< Fine adjustment configuration */
-+} ia_view_config_t, *ia_isp_bxt_view_params_t;
-+
-+/*!< ia_view_mbr_limits_t: Set mbr limits for view parameters*/
-+typedef struct
-+{
-+    /*!< Min Zooming on projection*/
-+    float  zoom;
-+    /*!< max pitch of view*/
-+    float pitch;
-+    /*!< max yaw of view*/
-+    float yaw;
-+    /*!< max roll view*/
-+    float roll;
-+    /*!<  max Window rotation*/
-+    float winrotation;
-+    /*!< max vertical scale*/
-+    float vertical_stretch;
-+    /*!< max horizontal shift*/
-+    float horizontal_shift;
-+    /*!< max vertical shift*/
-+    float vertical_shift;
-+} ia_view_limits_t;
-+
-+typedef struct
-+{
-+    ia_view_limits_t cylindrical;
-+    ia_view_limits_t equirectangular;
-+    ia_view_limits_t rectilinear;
-+    ia_view_limits_t conical_m40;
-+    ia_view_limits_t conical_m20;
-+    ia_view_limits_t conical_p20;
-+    ia_view_limits_t conical_p40;
-+}ia_view_mbr_limits_t,ia_isp_bxt_gdc_limits;
-+
-+
-+
-+/*!< ia_view_projection_t: Calculated parameter used in PAL*/
-+typedef struct
-+{
-+    ia_view_projection_type_t type; /*!< type: Projection type to be used*/
-+    double scale_factor_1[2];   /*!< scale_factor_1: Internal scale factor calculated*/
-+    double scale_factor_2[2];   /*!< scale_factor_2: Internal scale factor calculated*/
-+    double inv_f_pi;            /*!< inv_f_pi is inverse focal lenght pi: Internal parameter*/
-+    double bowl_radius_sqr;
-+    double bowl_scale;
-+} ia_view_projection_t;
-+
-+
-+/*!< ia_view_params_t: Calculated parameter to be used in PAL*/
-+typedef struct
-+{
-+    /*!< Mask indicating what parameters are enabled*/
-+    int32_t enabled_mask;
-+
-+    /*!< Projections the view */
-+    ia_view_projection_t projection;
-+
-+    /*!< Pre Affine Matrix: Window rotatoin and scale*/
-+    float pre_affine_scale_matrix[2][2];
-+
-+    /*!< Pre Affine Matrix: Translation*/
-+    double pre_affine_translation_matrix[2];
-+
-+    /*!< Rotation Matrix combines camera and view rotations */
-+    float rotation_matrix[3][3];
-+
-+    /*!< Translation3D Matrix for Bowl Projection*/
-+    float translation_matrix[IA_VIEW_3D_TRANSLATION_SIZE];
-+
-+    /*!< Post Affine Matrix */
-+    float post_affine_scale_matrix[2][2];
-+
-+    /*!< Post Affine Matrix */
-+    double post_affine_translation_matrix[2];
-+
-+    /*!< Invalid coordinate mask for each color channel */
-+    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE];
-+
-+} ia_view_params_t;
-+
-+typedef struct
-+{
-+    ia_view_status_t is_configured;
-+    ia_view_config_t config;
-+    ia_view_resolution_t resolution[ia_view_resolution_max]; /*!< View resolution at different stages in the pipe */
-+    float cmc_affine_scale_matrix[2][2];
-+    double cmc_affine_translation_matrix[2];
-+    float cmc_focal_length;
-+
-+    ia_view_params_t isp_params;
-+} ia_view_t;
-+
-+typedef ia_view_t* ia_view_handle;
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* __IA_VIEW_TYPES_H_ */
-+
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
-new file mode 100644
-index 000000000000..9371d41aa8d8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
-@@ -0,0 +1,213 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_BLINK_DETECTION_H__
-+#define __PVL_BLINK_DETECTION_H__
-+
-+/** @file    pvl_blink_detection.h
-+ *  @brief   This file declares the structures and native APIs of blink detection component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_blink_detection_get_parameters() and pvl_blink_detection_set_parameters() respectively.
-+ */
-+struct pvl_blink_detection_parameters
-+{
-+    int32_t threshold;                      /**< A threshold value which is the determinant of the blink. If the given blink score on the eye is
-+                                                 greater than or equal to this value, the state of the eye will be estimated as 'closed'. */
-+};
-+typedef struct pvl_blink_detection_parameters pvl_blink_detection_parameters;
-+
-+
-+/** @brief The enumerated values to represent the blink state of an eye.
-+ */
-+enum pvl_blink_detection_state
-+{
-+    pvl_blink_detection_state_open    = 0,   /**< The state representing the eye open. */
-+    pvl_blink_detection_state_closed  = 1    /**< The state representing the eye closed. */
-+};
-+typedef enum pvl_blink_detection_state pvl_blink_detection_state;
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_blink_detection_result
-+{
-+    int32_t left_score;                     /**< The blink score on the left eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
-+    pvl_blink_detection_state left_state;   /**< The blink state on the left eye. */
-+    int32_t right_score;                    /**< The blink score on the right eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
-+    pvl_blink_detection_state right_state;  /**< The blink state on the right eye. */
-+};
-+typedef struct pvl_blink_detection_result pvl_blink_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the blink detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_blink_detection
-+{
-+    const pvl_version version;          /**< The version information. */
-+
-+    const int32_t default_threshold;    /**< The default threshold value recommended. */
-+    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
-+                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
-+};
-+typedef struct pvl_blink_detection pvl_blink_detection;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the blink detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the blink detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] bd      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_create(const pvl_config *config, pvl_blink_detection **bd);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  bd   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_blink_detection_destroy(pvl_blink_detection *bd);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  bd  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_reset(pvl_blink_detection *bd);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_blink_detection_get_parameters() before setting something.
-+ *
-+ *  @param[in]  bd      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_set_parameters(pvl_blink_detection *bd, const pvl_blink_detection_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_blink_detection_set_parameters().
-+ *
-+ *  @param[in]  bd      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_get_parameters(pvl_blink_detection *bd, pvl_blink_detection_parameters *params);
-+
-+
-+/** @brief Detect blink on the face in the input image.
-+ *
-+ *  This function runs blink detection on the face in the given image.
-+ *  It runs on both eyes. It's not allowed to run with only one eye.
-+ *  The caller is responsible for allocating the buffer for the result.
-+ *
-+ *  @param[in]  bd          The handle of the blink detection component.
-+ *  @param[in]  image       The input image. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  left_eye    The center point on the left eye of the face.
-+ *  @param[in]  right_eye   The center point on the right eye of the face.
-+ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_blink_detection_run(pvl_blink_detection *bd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
-+                        pvl_blink_detection_result *result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example face_detection_sample.cpp
-+ *  Sample of Face  Detection
-+ */
-+
-+#endif /* __PVL_BLINK_DETECTION_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
-new file mode 100644
-index 000000000000..06779366375c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
-@@ -0,0 +1,88 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_CONFIG_H__
-+#define __PVL_CONFIG_H__
-+
-+/** @file   pvl_config.h
-+ *  @brief  This file defines common data structures for configuration of components.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include "pvl_types.h"
-+
-+
-+/** @brief A structure to hold HW acceleration contexts.
-+ *  This structure is not actively used now and subjected to change for the future release.
-+ */
-+struct pvl_acceleration {
-+    const pvl_bool is_supporting_gpu;   /**< The supportability of the GPU acceleration by the component. The value should be defined by each component. */
-+    const pvl_bool is_supporting_ipu;   /**< The supportability of the IPU acceleration by the component. The value should be defined by each component. */
-+
-+    pvl_bool enable_gpu;                /**< GPU acceleration switch. Setting pvl_true enables the GPU acceleration mode of the component.
-+                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_gpu'. */
-+    pvl_bool enable_ipu;                /**< IPU acceleration switch. Setting pvl_true enables the IPU acceleration mode of the component.
-+                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_ipu'. */
-+
-+    void *gpu_context;                  /**< The user-provided GPU acceleration context data. */
-+    void *ipu_context;                  /**< The user-provided IPU acceleration context data. */
-+};
-+typedef struct pvl_acceleration pvl_acceleration;
-+
-+
-+/** @brief A structure to hold default or user-provided log functions.
-+ *  This structure is not actively used now and subject to change in future release.
-+ */
-+struct pvl_log_apis {
-+    void (*debug)(const char *fmt, va_list ap);             /**< The logging function for debugging. */
-+    void (*error)(const char *fmt, va_list ap);             /**< The logging function for error reporting. */
-+    void (*warning)(const char *fmt, va_list ap);           /**< The logging function for warning message. */
-+    void (*info)(const char *fmt, va_list ap);              /**< The logging function for information. */
-+    void (*dump)(int32_t id, uint8_t *data, uint32_t size); /**< The logging function for dumping binary data. */
-+};
-+typedef struct pvl_log_apis pvl_log_apis;
-+
-+
-+/**
-+ * @brief A structure to hold the configuration of the component.
-+ *
-+ * This structure is used as a parameter for the initial configuration of the component.
-+ *
-+ * @code
-+ * // Sample usage
-+ * pvl_err pvl_xxx_get_default_config(pvl_config* config);
-+ * pvl_err pvl_xxx_create(const pvl_config* config, pvl_xxx** component);
-+ * @endcode
-+ *
-+ */
-+struct pvl_config {
-+    const pvl_version version;      /**< The version information of the component (non-modifiable). */
-+    pvl_acceleration acceleration;  /**< The configuration of the HW acceleration. The user can enable or disable the HW acceleration via this structure */
-+    pvl_log_apis log_apis;          /**< The logging functions. The users can dispatch logging messages via this structure. */
-+};
-+typedef struct pvl_config pvl_config;
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+
-+#endif // __PVL_TYPES_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
-new file mode 100644
-index 000000000000..85da6b0fa814
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
-@@ -0,0 +1,156 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_EYE_DETECTION_H__
-+#define __PVL_EYE_DETECTION_H__
-+
-+/** @file    pvl_eye_detection.h
-+ *  @brief   This file declares the structures and native APIs of eye detection component.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_eye_detection_result
-+{
-+    pvl_point left_eye;         /**< The center position on the left eye (in the view of the observer).
-+                                     The origin (0,0) of the point is the upper-left corner of the input image. */
-+    pvl_point right_eye;        /**< The center position on the right eye (in the view of the observer). */
-+    int32_t confidence;         /**< The confidence value of the detected eyes. The value is negative if the eye detection failed. */
-+};
-+typedef struct pvl_eye_detection_result pvl_eye_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the eye detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_eye_detection
-+{
-+    const pvl_version version;              /**< The version information. */
-+
-+    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the eye distance,
-+                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two eyes).
-+                                                 The eye detection accuracy will be dropped if the estimated face region (as the parameter of pvl_eye_detection_run) is too large compared to the actual face size. */
-+    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
-+                                                 The eye detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
-+};
-+typedef struct pvl_eye_detection pvl_eye_detection;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the eye detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_eye_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the eye detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] ed      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_eye_detection_create(const pvl_config *config, pvl_eye_detection **ed);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  ed   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_eye_detection_destroy(pvl_eye_detection *ed);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  ed  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_eye_detection_reset(pvl_eye_detection *ed);
-+
-+
-+/** @brief Detect left and right eye positions from a region of faces in the image.
-+ *
-+ *  This function will do the eye detection in the given a region of faces in the image.
-+ *  The function caller is responsible for allocation of the buffer for result.
-+ *
-+ *  @param[in]  ed          The handle of the eye detection component.
-+ *  @param[in]  image       The input image for detecting the positions of eyes. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  face_region The struct of rectangular regions of faces.
-+ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
-+ *  @param[out] result      The result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_eye_detection_run(pvl_eye_detection *ed, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_eye_detection_result *result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+/** @example face_detection_sample.cpp
-+ *  Sample of Eye Detection
-+ */
-+
-+#endif // __PVL_EYE_DETECTION_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
-new file mode 100644
-index 000000000000..b0de801ee45a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
-@@ -0,0 +1,270 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __FD_PVL_FACE_DETECTION_H__
-+#define __FD_PVL_FACE_DETECTION_H__
-+
-+/** @file    pvl_face_detection.h
-+ *  @brief   This file declares the structures and native APIs of face detection component.
-+ */
-+
-+#include "pvl_config.h"
-+#include "pvl_types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/** @brief A enum to present usage modes.
-+ *
-+ * Will help to choose best parameters for needed work.
-+ */
-+enum pvl_mode {
-+    normal,     /**< Most accurate face detection. */
-+    low_power,  /**< Accuracy is sacrificed to get CPU load to minimun. */
-+    high_accuracy = normal,
-+};
-+
-+typedef pvl_mode pvl_accuracy; // for backwards compatibility
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_face_detection_get_parameters() and pvl_face_detection_set_parameters() respectively,
-+ */
-+struct pvl_face_detection_parameters {
-+    uint32_t max_num_faces;            /**< The maximum number of detectable faces in one frame.
-+                                            max_supported_num_faces in pvl_face_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
-+                                            The default value is set to maximum when the component is created. */
-+
-+    float min_face_ratio;              /**< The ratio of minimum detectable face size to the shorter side of the input image.
-+                                            The value has the range between 0.0 and 1.0.
-+                                            The smallest detectable face size is calculated as min_face_ratio * min(image width, image height).
-+                                            The faces smaller than the minimum size may not be detected. */
-+
-+    uint16_t rip_range;                /**< The degree of RIP (Rotation In-Plane) ranges, representing [-rip_range, +rip_range]. */
-+
-+    uint16_t rop_range;                /**< The degree of ROP (Rotation Out-of-Plane) ranges, representing [-rop_range, +rop_range]. */
-+
-+    uint32_t num_rollover_frames;      /**< The number of rollover frames indicating how many frames the entire scanning will be distributed.
-+                                            The value works in the preview mode, only. */
-+};
-+typedef struct pvl_face_detection_parameters pvl_face_detection_parameters;
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_face_detection_result {
-+    pvl_rect rect;                     /**< The rectangular region of the detected face. */
-+    int32_t confidence;                /**< The confidence value of the detected face [0, 100]. */
-+    int32_t rip_angle;                 /**< The approximated value of RIP angle (in degree) of the detected face. */
-+    int32_t rop_angle;                 /**< The approximated of ROP angle (in degree) of the detected face. */
-+    int32_t tracking_id;               /**< The tracking id of the face. Only valid in preview mode.
-+                                            The value will be unique throughout the component life cycle, unless pvl_face_detection_reset() is called. */
-+};
-+typedef struct pvl_face_detection_result pvl_face_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the face detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_face_detection {
-+    const pvl_version version;                  /**< The version information. */
-+
-+    const uint32_t max_supported_num_faces;     /**< The maximum number of faces supported by this component. */
-+    const uint32_t min_face_size;               /**< The minimum size in pixel of detectable faces of this component. */
-+
-+    const uint16_t rip_range_max;               /**< The maximum value of RIP range (in degree). */
-+    const int16_t rip_range_resolution;         /**< The resolution of RIP range value. RIP range should be multiple of this value. */
-+
-+    const uint16_t rop_range_max;               /**< The maximum value of ROP range (in degree). */
-+    const int16_t rop_range_resolution;         /**< The resolution of ROP range value. ROP range should be multiple of this value. */
-+};
-+typedef struct pvl_face_detection pvl_face_detection;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the face detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_face_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the face detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] fd      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_face_detection_create(const pvl_config *config, pvl_face_detection **fd);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  fd   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_face_detection_destroy(pvl_face_detection *fd);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states including face tracking information and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  fd  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_face_detection_reset(pvl_face_detection *fd);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
-+ *
-+ *  @param[in]  fd      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
-+ */
-+PVLAPI pvl_err
-+pvl_face_detection_set_parameters(pvl_face_detection *fd, const pvl_face_detection_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_face_detection_set_parameters().
-+ *
-+ *  @param[in]  fd      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_face_detection_get_parameters(pvl_face_detection *fd, pvl_face_detection_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+*
-+*  Get the predefined parameters.
-+*  This function can be used to get good values for diffent needs.
-+*
-+*  @param[in]  mode     The requested usage mode.
-+*  @param[out] params   The buffer which will hold parameters. Its allocation must be managed by the caller.
-+*
-+*  @return     On success, @ref pvl_success.
-+*
-+*  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+*/
-+PVLAPI pvl_err
-+pvl_face_detection_default_parameters(pvl_mode mode, pvl_face_detection_parameters *params);
-+
-+
-+/** @brief Detect faces from the input image.
-+ *
-+ *  This function will run the face detection in the given image.
-+ *  The caller is responsible for allocating the buffer for the result.
-+ *
-+ *  @param[in]  fd          The handle of the face detection component.
-+ *  @param[in]  image       The input image. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[out] result      The result buffer.
-+ *  @param[in]  max_result  The number of results that the buffers can hold.
-+ *
-+ *  @return     On success, the number of detected faces.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of fd or non-positive max_result.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI int32_t
-+pvl_face_detection_run_in_image(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
-+
-+
-+/** @brief Detect faces from the gray image, a part of the sequence of preview frame.
-+ *
-+ *  This function performs the face detection to the given image, assuming that the image is a part of the sequence of preview or video frames.
-+ *  The function re-uses the result of the previous frames to detect faces faster, i.e. the result will be affected by previous calls of this function,
-+ *  whereas each call of pvl_face_detection_run_in_image() works independently.
-+ *  The caller is responsible for allocating the result buffer.
-+ *
-+ *  @param[in]  fd          The handle of the face detection component.
-+ *  @param[in]  image       The input image. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[out] result      The result buffer.
-+ *  @param[in]  max_result  The number of results that the buffer can hold.
-+ *
-+ *  @return     On success, the number of detected faces, which is non-negative value.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or non-positive max_result.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI int32_t
-+pvl_face_detection_run_in_preview(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif   // __cplusplus
-+
-+/** @example face_detection_sample.cpp
-+ *  Sample of Face Detection
-+ */
-+
-+#endif   // __FD_PVL_FACE_DETECTION_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
-new file mode 100644
-index 000000000000..d5d678a269e3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
-@@ -0,0 +1,473 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_FACE_RECOGNITION_H__
-+#define __PVL_FACE_RECOGNITION_H__
-+
-+/** @file    pvl_face_recognition.h
-+ *  @brief   This file declares the structures and native APIs of face recognition component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define FACE_RECOGNIZER_UNKNOWN_PERSON_ID   (-10000)   /**< The "unknown person", which will be assigned to person_id of the structure, 'pvl_face_recognition_facedata'. */
-+
-+
-+/** @brief A structure to hold a set of data representing a face which is used in face recognition.
-+ *
-+ *  The user is recommended to use the struct returned from pvl_face_recognition_run_in_image() when registering the facedata
-+ *  with assigning unique positive number to person_id field.
-+ */
-+struct pvl_face_recognition_facedata{
-+    uint64_t face_id;       /**< The unique id of the face data. */
-+    int32_t  person_id;     /**< The unique id of the person associated with the face data. The valid person will have positive person_id (i.e. person_id > 0). */
-+    uint32_t time_stamp;    /**< The timestamp when the face data was generated. */
-+    int32_t  condition;     /**< The environmental information of the face. Reserved for future use. */
-+    int32_t  checksum;      /**< The checksum value of the face data. */
-+    uint8_t  *data;         /**< The pointer to the actual face data. Face data is essentially a binary encoded representation of the face generated from the gray face image.
-+                                 The size will be stored in facedata_size of the structure 'pvl_face_recognition'. */
-+};
-+typedef struct pvl_face_recognition_facedata pvl_face_recognition_facedata;
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_face_recognition_get_parameters() and pvl_face_recognition_set_parameters() respectively.
-+ */
-+struct pvl_face_recognition_parameters{
-+    uint32_t max_faces_in_preview;  /**< The maximum number of recognizable faces in one frame.
-+                                         The maximum allowable value is 'max_supported_faces_in_preview' in the structure 'pvl_face_recognition',
-+                                         and the minimum allowable value is 1. The default value is set to maximum while the component created.
-+                                         (i.e. 1 <= max_faces_inpreview <= max_supported_faces_in_preview) */
-+};
-+typedef struct pvl_face_recognition_parameters pvl_face_recognition_parameters;
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_face_recognition_result{
-+    pvl_face_recognition_facedata facedata;     /**< The extracted face data from the face. If recognition succeeded, a valid person-id will be allocated in the field 'person_id'. */
-+    int32_t similarity;                         /**< The estimated similarity between the input face and the faces in the database. The biggest value will be assigned. */
-+};
-+typedef struct pvl_face_recognition_result pvl_face_recognition_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the blink detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_face_recognition{
-+    const pvl_version version;                      /**< The version information. */
-+
-+    const uint32_t max_supported_faces_in_preview;  /**< The maximum number of faces supported by this component. */
-+    const uint32_t max_faces_in_database;           /**< The maximum number of faces that the database can hold in the current version. */
-+    const uint32_t max_persons_in_database;         /**< The maximum number of persons that the database can hold in the current version. */
-+    const uint32_t max_faces_per_person;            /**< The maximum number of faces per person in the current version. */
-+    const uint32_t facedata_size;                   /**< The fixed size of the face data (in bytes) for the current version. */
-+};
-+typedef struct pvl_face_recognition pvl_face_recognition;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the face recognition component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the face recognition component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] fr      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_nomem               Failed in allocating the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_create(const pvl_config *config, pvl_face_recognition **fr);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  fr   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_face_recognition_destroy(pvl_face_recognition *fr);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states, the internal database and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  fr  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or database.
-+ *  @retval     pvl_err_nomem               Failed in re-allocating the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_reset(pvl_face_recognition *fr);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_face_recognition_get_parameters() before setting something.
-+ *
-+ *  @param[in]  fr      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in re-allocating the memory for parameter changes.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_set_parameters(pvl_face_recognition *fr, const pvl_face_recognition_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  @param[in]  fr      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Memory needs to be managed by caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_get_parameters(pvl_face_recognition *fr, pvl_face_recognition_parameters *params);
-+
-+
-+/** @brief The main function that run the face recognition for the faces in image.
-+ *
-+ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
-+ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
-+ *  If the recognition succeeded, person_id field at corresponding index of the result will be filled with valid (+) person_id.
-+ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
-+ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
-+ *  the positive person_id does not guarantee that the recognition result is correct.
-+ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_image_with_rect instead.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
-+ *  @param[in]  left_eyes   The array of the center points on the left eyes of faces to be recognized.
-+ *  @param[in]  right_eyes  The array of the center points on the right eyes of faces to be recognized.
-+ *  @param[out] results     The array of the result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
-+ */
-+DEPRECATED_PVLAPI pvl_err
-+pvl_face_recognition_run_in_image(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
-+                                  const pvl_point *left_eyes, const pvl_point *right_eyes,
-+                                  pvl_face_recognition_result *results);
-+
-+
-+/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
-+ *
-+ *  This function is basically the same as pvl_face_recognition_run_in_image(), but assuming that the input image is the part of the sequence of preview or video frames.
-+ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
-+ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_preview_with_rect instead.
-+ *
-+ *  @param[in]  fr              The handle of the face recognition component.
-+ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
-+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
-+ *  @param[in]  left_eyes       The array of the center points on the left eyes of faces to be recognized.
-+ *  @param[in]  right_eyes      The array of the center points on the right eyes of faces to be recognized.
-+ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
-+ *  @param[out] results         The array of the result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
-+ */
-+DEPRECATED_PVLAPI pvl_err
-+pvl_face_recognition_run_in_preview(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
-+                                    const pvl_point *left_eyes, const pvl_point *right_eyes, const int32_t *tracking_ids,
-+                                    pvl_face_recognition_result *results);
-+
-+/** @brief The main function that run the face recognition for the faces in image.
-+ *
-+ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
-+ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
-+ *  If the recognition succeeded, person_ids at corresponding index will be filled with valid (+) person_id.
-+ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
-+ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
-+ *  the positive person_id does not guarantee that the recognition result is correct.
-+ *  This function need face rectangle and face angle instead of eye position.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
-+ *  @param[in]  face_rect   The array of the rectangle of detected faces to be recognized.
-+ *  @param[in]  face_angle  The array of RIP (Rotation in Plane) value of the faces in degree.
-+ *  @param[out] results     The array of the result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_run_in_image_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
-+                                            const pvl_rect* face_rect, const int32_t* face_angle, pvl_face_recognition_result *results);
-+
-+
-+/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
-+ *
-+ *  This function is basically the same as pvl_face_recognition_run_in_image_with_rect(), but assuming that the input image is the part of the sequence of preview or video frames.
-+ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
-+ *  This function need face rectangle and face angle instead of eye position.
-+ *
-+ *  @param[in]  fr              The handle of the face recognition component.
-+ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
-+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
-+ *  @param[in]  face_rect       The array of the rectangle of detected faces to be recognized.
-+ *  @param[in]  face_angle      The array of RIP (Rotation in Plane) value of the faces in degree.
-+ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
-+ *  @param[out] results         The array of the result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_run_in_preview_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
-+                                              const pvl_rect* face_rect, const int32_t* face_angle, const int32_t *tracking_ids, pvl_face_recognition_result *results);
-+
-+
-+/** @brief Register one face data to the internal database of the component.
-+ *
-+ *  This function registers the given face data into the internal database.
-+ *  It is common practice for the user to read face data from the external database (e.g. SQLite, MySQL, file system, etc.) and register each face data to the internal database.
-+ *  Before using pvl_face_recognition_run_in_image() or pvl_face_recognition_run_in_preview(),
-+ *  the user should call this function to register faces to the database.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  facedata    A face data instance to be registered.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or wrong facedata.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
-+ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_register_facedata(pvl_face_recognition *fr, const pvl_face_recognition_facedata *facedata);
-+
-+
-+/** @brief Unregister the face from the internal database.
-+ *
-+ *  This function deletes the face data from internal database.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  face_id     Face id to be unregistered.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
-+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_unregister_facedata(pvl_face_recognition *fr, uint64_t face_id);
-+
-+
-+/** @brief Unregister all faces associated with the person_id.
-+ *
-+ *  This function is used to remove all registered faces of specified person.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  person_id   Person id to be unregistered.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given person_id.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_unregister_person(pvl_face_recognition *fr, int32_t person_id);
-+
-+
-+/** @brief Update person_id of specified face data.
-+ *
-+ *  This function is used to modify person id of specific face data. Usually used to assign a person id to unknown face or incorrectly recognized face.
-+ *
-+ *  @param[in]  fr              The handle of the face recognition component.
-+ *  @param[in]  face_id         Face id to modify.
-+ *  @param[in]  new_person_id   Person id to update with.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id/new_person_id.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
-+ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_update_person(pvl_face_recognition *fr, uint64_t face_id, int32_t new_person_id);
-+
-+
-+/** @brief Get number of faces in the internal database.
-+ *
-+ *  This function returns the number of faces registered in the internal database.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *
-+ *  @return     On success, returns number of faces (non-negative value.)
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI int32_t
-+pvl_face_recognition_get_num_faces_in_database(pvl_face_recognition *fr);
-+
-+
-+/** @brief Get number of persons in the internal database.
-+ *
-+ *  This function returns the number of persons registered in the internal database.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *
-+ *  @return     On success, returns number of persons (non-negative value.)
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI int32_t
-+pvl_face_recognition_get_num_persons_in_database(pvl_face_recognition *fr);
-+
-+
-+/** @brief Get number of faces of a specific person_id in the internal database.
-+ *
-+ *  This function returns the number of faces of a specific person_id registered in the internal database.
-+ *
-+ *  @param[in]  fr          The handle of the face recognition component.
-+ *  @param[in]  person_id   Person id to retrieve number of faces.
-+ *
-+ *  @return     On success, returns number of faces (non-negative value.)
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI int32_t
-+pvl_face_recognition_get_num_faces_of_person_in_database(pvl_face_recognition *fr, int32_t person_id);
-+
-+
-+/** @brief Allocate the memory of result buffers.
-+ *
-+ *  This function is used to allocate memory for the result buffers which contain the array of face feature data.
-+ *  The memory for result buffers should be allocated in the form of the array of 'pvl_face_recognition_result' before
-+ *   the functions which conduct face recognition are called.
-+ *  This function conducts the memory allocation for the output buffers.
-+ *
-+ *  @param[in]  fr            The handle of the face recognition component.
-+ *  @param[in]  max_faces     The maximum number of recognizable faces, which is used for allocating results buffer.
-+ *  @param[out] fr_results    The initialized array of the result buffer.
-+ *
-+ *  @return     On success,   @ref pvl_success.
-+ *  @return     On failure,   @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr or fr_results parameter, or negative value to the max_faces.
-+ *  @retval     pvl_err_out_of_bound        Parameters or condition for the allocation is not acceptable.
-+ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
-+ */
-+PVLAPI pvl_err
-+pvl_face_recognition_create_result_buffer(pvl_face_recognition *fr, int max_faces, pvl_face_recognition_result **fr_results);
-+
-+
-+/** @brief Destroy the memory buffer.
-+ *
-+ * This function releases internal allocated buffers and destroys the data.
-+ *
-+ *  @param[in]  fr_results   The handle of the result buffer to be destroyed.
-+ *
-+ */
-+PVLAPI void
-+pvl_face_recognition_destroy_result_buffer(pvl_face_recognition_result *fr_results);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example face_recognition_sample.cpp
-+ *  Sample of Face Recognition
-+ */
-+
-+#endif /* __PVL_FACE_RECOGNITION_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
-new file mode 100644
-index 000000000000..115690861e14
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
-@@ -0,0 +1,229 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_IMAGE_MONTAGE_H__
-+#define __PVL_IMAGE_MONTAGE_H__
-+
-+/** @file    pvl_image_montage.h
-+ *  @brief   This file declares the structures and native APIs of image montage component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_image_montage_get_parameters() and pvl_image_montage_set_parameters() respectively.
-+ */
-+struct pvl_image_montage_parameters
-+{
-+    int search_region_margin_percentage;    /**< The percentage of the region to be searched to the entire sub image (default: 20). */
-+};
-+typedef struct pvl_image_montage_parameters pvl_image_montage_parameters;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the image montage instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_image_montage
-+{
-+    const pvl_version version;              /**< The version information. */
-+
-+    const int default_search_region_margin; /**< The default percentage of the region to be search to the entire sub image (recommended to use) */
-+};
-+typedef struct pvl_image_montage pvl_image_montage;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the image montage component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the image montage component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] im      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_create(const pvl_config *config, pvl_image_montage **im);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  im   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_image_montage_destroy(pvl_image_montage *im);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  im  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_reset(pvl_image_montage *im);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_image_montage_get_parameters() before setting something.
-+
-+ *  @param[in]  im      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_set_parameters(pvl_image_montage *im, const pvl_image_montage_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_image_montage_set_parameters().
-+ *
-+ *  @param[in]  im      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_get_parameters(pvl_image_montage *im, pvl_image_montage_parameters *params);
-+
-+
-+/** @brief Set the main image.
-+ *
-+ *  This functions stores information about the main image.
-+ *  The main image is labelled as the "background" of image montage.
-+ *  Input image data and an array of the objects coordinates which have been stored into internal
-+ *  memory by this function could be used when the function pvl_image_montage_run() runs.
-+ *
-+ *  @param[in]  im           The handle of the image montage component.
-+ *  @param[in]  main_img     The main image. Currently, only pvl_image_format_rgba32 is supported.
-+ *  @param[in]  objects      The coordinates of the objects.
-+ *  @param[in]  num_objects  The number of objects.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_set_main_image(pvl_image_montage *im, const pvl_image *main_img, pvl_rect *objects, int num_objects);
-+
-+
-+/** @brief Set the sub image where the object patches come from.
-+ *
-+ *  This functions stores information about the sub image.
-+ *  The sub image contains the target objects which would be fetched in composing function.
-+ *  Input image data and an array of the objects coordinates which have been stored by this
-+ *  function could be used when the function pvl_image_montage_run() runs.
-+ *
-+ *  @param[in]  im           The handle of the image montage component.
-+ *  @param[in]  sub_img      The sub image. Currently, only pvl_image_format_rgba32 is supported.
-+ *  @param[in]  objects      The coordinates of the objects.
-+ *  @param[in]  num_objects  The number of objects.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_set_sub_image(pvl_image_montage *im, const pvl_image *sub_img, pvl_rect *objects, int num_objects);
-+
-+
-+/** @brief Compose the montage on the main image, cropping the patch from the sub image.
-+ *
-+ *  This function is to combine two images(main,sub), cropping an object image patch which is placed on the N-th coordinate
-+ *  of object array in the sub image, overlaying the patch onto the N-th coordinate of objects array in the main image.
-+ *
-+ *  @param[in]  im           The handle of the image montage component.
-+ *  @param[in]  idx_on_main  The index of the object on the main image.
-+ *  @param[in]  idx_on_sub   The index of the object on the sub image.
-+ *  @param[out] result       The composed image. Must allocate memory big enough as the main image size to data field of 'result' before this function is called.
-+ *                           The image format should be same as the formats of main/sub images, which is currently pvl_image_format_rgba32 only.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_image_montage_run(pvl_image_montage *im, int idx_on_main, int idx_on_sub, pvl_image *result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example image_montage_sample.c
-+ *  Sample of Image Montage
-+ */
-+
-+#endif /* __PVL_IMAGE_MONTAGE_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
-new file mode 100644
-index 000000000000..dea500b6726a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
-@@ -0,0 +1,135 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_LANDMARK_DETECTION_H__
-+#define __PVL_LANDMARK_DETECTION_H__
-+
-+/** @file    pvl_landmark_detection.h
-+ *  @brief   This file declares the structures and native APIs of facial landmark detection component.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+/** @brief The enumerated values to specify the facial landmark shape points.
-+*/
-+enum pvl_facial_landmark_shape_point_num {
-+    pvl_facial_landmark_shape27 = 27,           /**< 27 point */
-+    pvl_facial_landmark_shape50 = 50,           /**< 50 point */
-+    pvl_facial_landmark_shape78 = 78,           /**< 78 point */
-+};
-+typedef enum pvl_facial_landmark_shape_point_num pvl_facial_landmark_shape_point_num;
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_facial_landmark_detection_result
-+{
-+    float points[pvl_facial_landmark_shape78 * 2];
-+};
-+typedef struct pvl_facial_landmark_detection_result pvl_facial_landmark_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the facial landmark detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_facial_landmark_detection
-+{
-+    const pvl_version version;              /**< The version information. */
-+    pvl_facial_landmark_shape_point_num shape_point_num;
-+};
-+typedef struct pvl_facial_landmark_detection pvl_facial_landmark_detection_context;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the facial landmark detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_facial_landmark_detection_get_default_config(pvl_config* config);
-+
-+
-+/** @brief Create an instance of the facial landmark detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] ed      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_facial_landmark_detection_create(const pvl_config* config, pvl_facial_landmark_detection_context** fld, const pvl_facial_landmark_shape_point_num point_num = pvl_facial_landmark_shape78);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  ed   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_facial_landmark_detection_destroy(pvl_facial_landmark_detection_context* fld);
-+
-+/** @brief Detect facial landmark positions from one of face in the image.
-+ *
-+ *  This function will do the facial landmark detection in the given face in the image.
-+ *  The function caller is responsible for allocation of the buffer for result.
-+ *
-+ *  @param[in]  fld             The handle of the facial landmark detection component.
-+ *  @param[in]  image           The input image for detecting the positions of facial landmark detection. All image formats are supported.
-+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  face_regions    The struct of rectangular region of the face.
-+ *  @param[in]  rip_angles      The value of RIP (Rotation in Plane) of the face in degree.
-+ *  @param[out] result          The result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+
-+PVLAPI pvl_err pvl_facial_landmark_detection_run(pvl_facial_landmark_detection_context* fld,
-+    const pvl_image* image, pvl_rect face_region, int32_t rip_angle,
-+    pvl_facial_landmark_detection_result* result);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif // __PVL_LANDMARK_DETECTION_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
-new file mode 100644
-index 000000000000..d07c5a28f480
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
-@@ -0,0 +1,154 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_MOUTH_DETECTION_H__
-+#define __PVL_MOUTH_DETECTION_H__
-+
-+/** @file    pvl_mouth_detection.h
-+ *  @brief   This file declares the structures and native APIs of mouth detection component.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_mouth_detection_result
-+{
-+    pvl_point mouth;
-+    int32_t confidence;
-+};
-+typedef struct pvl_mouth_detection_result pvl_mouth_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the mouth detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_mouth_detection
-+{
-+    const pvl_version version;              /**< The version information. */
-+
-+    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the mouth distance,
-+                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two mouths).
-+                                                 The mouth detection accuracy will be dropped if the estimated face region (as the parameter of pvl_mouth_detection_run) is too large compared to the actual face size. */
-+    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
-+                                                 The mouth detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
-+};
-+typedef struct pvl_mouth_detection pvl_mouth_detection;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the mouth detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_mouth_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the mouth detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] md      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_mouth_detection_create(const pvl_config *config, pvl_mouth_detection **md);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  md   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_mouth_detection_destroy(pvl_mouth_detection *md);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  md  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_mouth_detection_reset(pvl_mouth_detection *md);
-+
-+
-+/** @brief Detect left and right mouth positions from a region of faces in the image.
-+ *
-+ *  This function will do the mouth detection in the given a region of faces in the image.
-+ *  The function caller is responsible for allocation of the buffer for result.
-+ *
-+ *  @param[in]  md          The handle of the mouth detection component.
-+ *  @param[in]  image       The input image for detecting the positions of mouths. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  face_region The struct of rectangular regions of faces.
-+ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
-+ *  @param[out] result      The result buffer.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_mouth_detection_run(pvl_mouth_detection *md, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_mouth_detection_result *result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+/** @example face_detection_sample.cpp
-+ *  Sample of Mouth Detection
-+ */
-+
-+#endif // __PVL_MOUTH_DETECTION_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
-new file mode 100644
-index 000000000000..4de86bddaaf0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
-@@ -0,0 +1,238 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_OBJECT_TRACKING_H__
-+#define __PVL_OBJECT_TRACKING_H__
-+
-+/** @file    pvl_object_tracking.h
-+ *  @brief   This file declares the structure and native APIs of object tracking component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *  The variables in this structure will be retrieved and asigned, via pvl_object_tracking_get_parameters() and pvl_object_tracking_set_parameters() respectively,
-+ */
-+struct pvl_object_tracking_parameters
-+{
-+    int32_t num_concurrent_tracking;                      /**< the number of maximum tracking context inside the handle */
-+    int32_t tracking_type;                                /**< the options about how the tracking started. Reserved for future usage. */
-+};
-+
-+typedef struct pvl_object_tracking_parameters pvl_object_tracking_parameters;
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_object_tracking_result
-+{
-+    pvl_bool is_tracking_succeed;        /**< The tracking state of the object. */
-+    int32_t tracking_id;                 /**< The ID for a certain object starting at 1. This is unique among the sessions until the handle is destroyed. */
-+    int32_t score;                       /**< The tracking score of the object in the range of 0 to 100, where 0 means it doesn't like the object at all, and 100 means quite sure of that object. */
-+    pvl_rect tracked_region;             /**< The tracking area */
-+};
-+
-+typedef struct pvl_object_tracking_result pvl_object_tracking_result;
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the object tracking instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_object_tracking
-+{
-+    const pvl_version version;                /**< The version information. */
-+
-+    const int32_t max_supported_num_object;   /**< The maximum number of objects supported by this component. */
-+};
-+
-+typedef struct pvl_object_tracking pvl_object_tracking;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the face detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_get_default_config(pvl_config* config);
-+
-+
-+/** @brief Create an instance of the object tracking component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config      The configuration information of the component.
-+ *  @param[out] ot          A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_create(const pvl_config* config, pvl_object_tracking **ot);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  ot  The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_object_tracking_destroy(pvl_object_tracking *ot);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states including object tracking information and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  ot  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_reset(pvl_object_tracking *ot);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
-+ *
-+ *  @param[in]  ot      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_set_parameters(pvl_object_tracking *ot, const pvl_object_tracking_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_face_detection_set_parameters().
-+ *
-+ *  @param[in]  ot      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_get_parameters(pvl_object_tracking *ot, pvl_object_tracking_parameters *params);
-+
-+
-+/** @brief Specify the start ROI for a new tracking session.
-+ *
-+ *  This function will initialize the object tracking in the input image.
-+ *  The tracking context will be created and kept in the handle, which is supposed to be used at next OT processing.
-+ *
-+ *  Caller is responsible for allocating the the buffer for the result.
-+ *
-+ *  @param[in]  ot          The handle of this component.
-+ *  @param[in]  image       The input image. Currently, only pvl_image_format_nv12 is supported.
-+ *  @param[in]  the_object  The ROI of the object to track.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or image or the object.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_out_of_bound        Current number of tracking object is already full.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_add_object(pvl_object_tracking *ot, const pvl_image *image, const pvl_rect *the_object);
-+
-+
-+/** @brief Remove specified object from object tracking.
-+ *
-+ *  This function will stop tracking the object which have same tracking id with the input parameter.
-+ *  The tracking context will be removed in the handle.
-+ *
-+ *  Caller is responsible for allocating the pvl_rect.
-+ *
-+ *  @param[in]  ot          The handle of this component.
-+ *  @param[in]  tracking_id Tracking id of the object which will be removed.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or non-positive tracking_id.
-+ *  @retval     pvl_err_no_such_item        Failed to find tracking object having tracking_id.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_object_tracking_remove_object(pvl_object_tracking *ot, const int32_t tracking_id);
-+
-+
-+/** @brief Main function to run object tracking on all of the object in the input image as a part of preview or video frames.
-+ *
-+ *  This function will run object tracking on the input image with the tracking context held inside the OT handle.
-+ *  As this is a tracking component, there's an assumption this frame has temporal correlation with previous and next input images.
-+ *  The tracking result will be stored up to max_result, no matter how many contexts are inside handle.
-+ *
-+ *  Caller is responsible for allocating the buffer for result.
-+ *
-+ *  @param[in]  ot             The handle of this component.
-+ *  @param[in]  image          The input image. Currently, only pvl_image_format_n12 is supported.
-+ *  @param[out] result         Buffer to write the result back. Must have enough memory to hold the result.
-+ *  @param[in]  max_result     The number of results that the buffers can hold.
-+ *
-+ *  @return     On success, the number of current tracking objects.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or result, or non-positive max_result.
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI int32_t
-+pvl_object_tracking_run(pvl_object_tracking *ot, const pvl_image *image, pvl_object_tracking_result *result, int32_t max_result);
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example object_tracking_sample.cpp
-+*  Sample of Object Tracking
-+*/
-+
-+#endif /* __PVL_OBJECT_TRACKING_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
-new file mode 100644
-index 000000000000..9cf7d703da13
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
-@@ -0,0 +1,262 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_PANORAMA_H__
-+#define __PVL_PANORAMA_H__
-+
-+/** @file    pvl_panorama.h
-+ *  @brief   This file declares the structures and native APIs of panorama component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/** @brief The enumerated values to specify the 1D panning direction of panoramic stitch.
-+ */
-+enum pvl_panorama_direction {
-+    pvl_panorama_direction_still,           /**< No direction - still */
-+    pvl_panorama_direction_right,           /**< Left to right panning */
-+    pvl_panorama_direction_left,            /**< Right to left panning */
-+    pvl_panorama_direction_down,            /**< Downward panning */
-+    pvl_panorama_direction_up,              /**< Upward panning */
-+    pvl_panorama_direction_preview_auto     /**< The direction of panning is automatically detected in preview mode. */
-+};
-+typedef enum pvl_panorama_direction pvl_panorama_direction;
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_panorama_get_parameters() and pvl_panorama_set_parameters() respectively.
-+ */
-+struct pvl_panorama_parameters {
-+    uint32_t overlapping_ratio;         /**< The expected overlapping ratio between adjacent input images (in percent).
-+                                             Smaller value results in larger FoV and also larger output image and vice versa.
-+                                             In addition, however, larger value tends to result in more accurate alignments.
-+                                             The min/max and default values are defined in pvl_panorama structure in runtime. */
-+
-+    pvl_panorama_direction direction;   /**< The assumed panning direction of input images. If pvl_panorama_direction_preview_auto is set
-+                                             the direction would be automatically estimated while processing preview.(See pvl_parnorama_detect_frame_to_stitch()
-+                                             Otherwise, the direction is assumed to be explicitly specified. */
-+};
-+typedef struct pvl_panorama_parameters pvl_panorama_parameters;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the panorama instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_panorama {
-+    const pvl_version version;                  /**< The version information. */
-+
-+    const uint32_t max_supported_num_images;    /**< The maximum number of input images supported by this component. */
-+
-+    const uint32_t min_overlapping_ratio;       /**< The minimum configurable value of overlapping ratio (in percent) */
-+    const uint32_t max_overlapping_ratio;       /**< The maximum configurable value of overlapping ratio. (in percent) */
-+    const uint32_t default_overlapping_ratio;   /**< The default value of overlapping ratio. (in percent) */
-+};
-+typedef struct pvl_panorama pvl_panorama;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the panorama component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the panorama component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] pano    A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration or fail to load MDF program.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_create(const pvl_config *config, pvl_panorama **pano);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  pano The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_panorama_destroy(pvl_panorama *pano);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states, the stitched images, the composed output image and context will be reset except the run-time parameters set by user.
-+ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
-+ *
-+ *  @param[in]  pano    The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_reset(pvl_panorama *pano);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_panorama_get_parameters() before setting something.
-+ *
-+ *  @param[in]  pano    The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_set_parameters(pvl_panorama *pano, const pvl_panorama_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_panorama_set_parameters().
-+ *
-+ *  @param[in]  pano    The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_get_parameters(const pvl_panorama *pano, pvl_panorama_parameters *params);
-+
-+
-+/** @brief Detect preview frames to capture.
-+ *
-+ *  This function will detect preview frames that matches well with the imaginary frame the component is expecting.
-+ *  The overlapping_ratio parameter affects the offset of expecting scene projected from the last stitched image.
-+ *  This function should be called after the first image is stitched.
-+ *
-+ *  In normal scenario this function returns...
-+ *  @verbatim
-+    0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 ...
-+              |                 |           |                     |
-+              2nd image         3rd image   4th image             5th image ... @endverbatim
-+ *
-+ *  @param[in]  pano            The handle of the panorama component.
-+ *  @param[in]  preview_frame   The input preview frame. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
-+ *  @param[out] offset          The 2D offset of input frame from the last stitched image.
-+ *  @param[out] direction       The direction(left/right/up/down) to which input image is moving.
-+ *
-+ *  @return     On success, the stitch order, or equivalently the stitch index(>0) where the image to be captured stitched at.
-+ *                  0(= pvl_success) means that 'successful but not detected yet'.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of pano, preview_frame or offset.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI int32_t
-+pvl_panorama_detect_frame_to_stitch(pvl_panorama *pano, const pvl_image *preview_frame, pvl_point *offset, pvl_panorama_direction *direction);
-+
-+
-+/** @brief Stitch a input image at the tail of stitched images so far
-+ *
-+ *  This function will stitch a input image with the last stitched image using given offset as an initial guess.
-+ *  The series of input images are assumed to be given in the right order in terms of the panning direction.
-+ *  If it's the first image this function just register it and return.
-+ *  The maximum number of registerable images is bounded by 'max_supported_num_images' attribute of pvl_panorama structure.
-+ *
-+ *  @param[in]  pano            The handle of the panorama component.
-+ *  @param[in]  input_image     The input image to be stitched. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
-+ *  @param[in]  offset          (Optional) The 2D offset of input image from the previous image. If NULL is given the offset values will be estimated.
-+ *                                         If it's the first image the offset parameter will be ignored.
-+ *
-+ *  @return     On success, @ref pvl_success
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or input_image.
-+ *  @retval     pvl_err_out_of_bound        stitch_index < 0 or stitch_index >= max_supported_num_image
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_stitch_one_image(pvl_panorama *pano, pvl_image *input_image, const pvl_point *offset);
-+
-+
-+/** @brief Compose all the stitched image so far into the final output image.
-+ *
-+ *  This function will compose all the stitched images and allocate internal image buffer to save the final output image.
-+ *
-+ *  @param[in]  pano            The handle of the panorama component.
-+ *  @param[out] output_image    The final output image. The component manages the memory. Do not free the internal data buffer.
-+ *                              After resetting or destroying the component handle this data would be not reachable.
-+ *                              If panorama direction are up or down, rotation value of output image has 90 degree. otherwise, it has 0 degree.
-+ *
-+ *  @return     On success, @ref pvl_success
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or output_image.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or no stitched images.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_panorama_run(pvl_panorama *pano, pvl_image *output_image);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example panorama_sample.c
-+ *  Sample of Panorama
-+ */
-+
-+#endif /* __PVL_PANORAMA_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
-new file mode 100644
-index 000000000000..4e8647c831fc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
-@@ -0,0 +1,222 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PD_PVL_PEDESTRIAN_DETECTION_H__
-+#define __PD_PVL_PEDESTRIAN_DETECTION_H__
-+
-+/** @file    pvl_pedestrian_detection.h
-+ *  @brief   This file declares the structure and native APIs of pedestrian detection component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned via pvl_pedestrian_detection_get_parameters() and pvl_pedestrian_detection_set_parameters() respectively.
-+ */
-+struct pvl_pedestrian_detection_parameters
-+{
-+    int32_t max_num_pedestrians;                /* The maximum number of detectable pedestrian in one frame.
-+                                                max_supported_pedestrians in pvl_pedestrian_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
-+                                                The default value is set to maximum when the component is created. */
-+
-+    int32_t min_pedestrian_height;              /* The minimum height(pixel)size of detectable pedestrian on preview mode.
-+                                                It should be bigger than 'default_pedestrian_height'.
-+                                                It should be smaller than 'default_pedestrian_height'*2. */
-+};
-+typedef struct pvl_pedestrian_detection_parameters pvl_pedestrian_detection_parameters;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the pedestrian_detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_pedestrian_detection_context
-+{
-+    const pvl_version version;                      /**< The version information. */
-+
-+    const int32_t max_supported_num_pedestrians;    /**< The maximum number of pedestrians supported by this component. */
-+    const int32_t default_pedestrian_height;        /**< The default value of minimum detectable height(pixel) size.
-+                                                    Current version: 128 */
-+};
-+typedef struct pvl_pedestrian_detection_context pvl_pedestrian_detection_context;
-+
-+/** @brief A structure to hold the outcomes from the Pedestrian Detection component.
-+*/
-+struct pvl_pedestrian_detection_result {
-+    pvl_rect rect;                  /**< The rectangular region of the detected pedestrian. */
-+
-+    int32_t  confidence;            /**< The confidence value of the detected pedestrian. (0~100) */
-+
-+    int32_t  tracking_id;           /**< The tracking id of the pedestrian. Only valid in the outcomes of pvl_pedestrian_detection_process_frame().
-+                                    The value will be unique throughout the component life cycle, unless pvl_pedestrian_detection_reset() is called. */
-+};
-+typedef struct pvl_pedestrian_detection_result pvl_pedestrian_detection_result;
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the pedestrina detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_pedestrian_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the pedestrina detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] pd      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_pedestrian_detection_create(const pvl_config *config, pvl_pedestrian_detection_context **pd);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  pd   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_pedestrian_detection_destroy(pvl_pedestrian_detection_context *pd);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  pd  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_pedestrian_detection_reset(pvl_pedestrian_detection_context *pd);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_pedestrian_detection_get_parameters() before setting something.
-+ *
-+ *  @param[in]  pd      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_pedestrian_detection_set_parameters(pvl_pedestrian_detection_context *pd, const pvl_pedestrian_detection_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_pedestrian_detection_set_parameters().
-+ *
-+ *  @param[in]  pd      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_pedestrian_detection_get_parameters(pvl_pedestrian_detection_context *pd, pvl_pedestrian_detection_parameters *params);
-+
-+
-+/** @brief Detect pedestrian from an input image.
-+*
-+*  This function will conduct pedestrian detection.
-+*
-+*  @param[in]  pd          The handle of the pedestrian detection component.
-+*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
-+*  @param[out] result      The result buffer.
-+*  @param[in]  max_result  The number of 'result' that the buffers can hold.
-+*
-+*  @return     On success, @ref integer    Number of the detected pedestrians from the input image(positive integer).
-+*  @return     On failure, @ref pvl_err    Error code(negative integer), which will be the one of the following return value(s).
-+*
-+*  @retval     pvl_err_not_supported       Unsupported image format specified.
-+*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
-+*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+*/
-+PVLAPI int32_t
-+pvl_pedestrian_detection_process_image(pvl_pedestrian_detection_context *pd, const pvl_image* image, pvl_pedestrian_detection_result* result, int max_result);
-+
-+
-+/** @brief process continuous frames for conducting pedestrian detection.
-+*
-+*  This function will conduct pedestrian detection.
-+*
-+*  @param[in]  pd           The handle of the pedestrian detection component.
-+*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
-+*  @param[out] result      The result buffer.
-+*  @param[in]  max_result  The number of 'result' that the buffer can hold.
-+*
-+*  @return     On success, @ref integer.   The number of the detected pedestrians at the current input frame(positive integer).
-+*  @return     On failure, @ref pvl_err    Error code, which will be the one of the following return value(s).
-+*
-+*  @retval     pvl_err_not_supported       Unsupported image format specified.
-+*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
-+*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+*/
-+PVLAPI int32_t
-+pvl_pedestrian_detection_process_frame(pvl_pedestrian_detection_context *pd, const pvl_image *image, pvl_pedestrian_detection_result* result, int max_result);
-+
-+#ifdef __cplusplus
-+}
-+#endif  // __cplusplus
-+
-+/** @example pedestrian_detection_sample.cpp
-+ *  Sample of Pedestrian Detection
-+ */
-+
-+#endif  // __PD_PVL_PEDESTRIAN_DETECTION_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
-new file mode 100644
-index 000000000000..b76c06eeb91f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
-@@ -0,0 +1,408 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_PERSPECTIVE_CONTROL_H__
-+#define __PVL_PERSPECTIVE_CONTROL_H__
-+
-+/** @file    pvl_perspective_control.h
-+ *  @brief   This file declares the structures and native APIs of perspective control component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define MAX_VANISHING_POINT 3
-+#define MAX_VERTEX_POINT 4
-+
-+/** @brief The enumerated values to specify correcting mode
-+ *
-+ *  This enumeration indicates setting of how the perspective_control engine conducts image warping.
-+ */
-+typedef enum {
-+    PC_SCAN_MODE = 0,   /**< Suitable for using indoor scenes */
-+    PC_BUILDING_MODE,   /**< Suitable for using outdoor scenes */
-+    NUM_PC_MODES
-+} pvl_perspective_control_mode;
-+
-+typedef enum
-+{
-+    PC_ORI_VERTICAL = 0,    /**< The orientation for the vertical direction */
-+    PC_ORI_HORIZONTAL,      /**< The orientation for the horizontal direction */
-+    NUM_ORI
-+} pvl_pc_orientation;
-+
-+struct pvl_pc_correction_range
-+{
-+    float min_vertical;     /**< The minimum value of available correction range in vertical orientation */
-+    float max_vertical;     /**< The maximum value of available correction range in vertical orientation */
-+    float min_horizontal;   /**< The minimum value of available correction range in horizontal orientation */
-+    float max_horizontal;   /**< The maximum value of available correction range in horizontal orientation */
-+};
-+typedef struct pvl_pc_correction_range pvl_pc_correction_range;
-+
-+/** @Deprecated
-+ * @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_perspective_control_get_parameters() and pvl_perspective_control_set_parameters() respectively.
-+ */
-+struct pvl_perspective_control_parameters {
-+
-+    pvl_perspective_control_mode  control_mode;
-+                                      /* To choose mode of perspective control(the PC engine recommends direction and intensity)
-+                                         If a user wants to use this engine for indoor usage, then set this parameter PC_SCAN_MODE.
-+                                         If a user wants to change the intensity or to choose a certain direction(a certain direction among vanishig points), then set this paramter PC_MANUAL_OUTDOOR_MODE.
-+                                         [Default : PC_AUTO_OUTDOOR_MODE]
-+                                      */
-+    // Intensity and orientation of perspective correction ('correction_range' parameters will be applied only if 'control_mode' is PC_MANUAL_OUTPUT_MODE)
-+    float vertical_correction_range;         /* For vertical direction
-+                                              [Valid Range: -1.0 ~ 1.0] [Default: 0]
-+                                              -1 means full perspective control for the case that the vanishing point is located down direction.
-+                                               0 means no perspective control to maintain input image.
-+                                               1 means full perspective control for the case that the vanishing point is located up direction.
-+                                              */
-+    float horizontal_correction_range;       /* For horizontal direction
-+                                               [Valid Range: -1.0 ~ 1.0] [Default: 0]
-+                                              -1 means full perspective control for the case that the vanishing point is located left direction.
-+                                               0 means no perspective control to maintain input image.
-+                                               1 means full perspective control for the case that the vanishing point is located right direction.
-+                                              */
-+};
-+typedef struct pvl_perspective_control_parameters pvl_perspective_control_parameters;
-+
-+/** @brief A structure to supply the public information of this component.
-+ *
-+ *  This structure represents the perspective_control instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant context information.
-+ */
-+struct pvl_perspective_control {
-+    const pvl_version                  version;                   /**< The version information. */
-+    const int                          max_vanishing_point;       /**< The maximum configurable value of the number of vanishing point from input image.
-+                                                                          Refers to MAX_VANISHING_POINT. (This value is not modifiable in any purpose) */
-+    const pvl_perspective_control_mode  default_control_mode;      /**< Default value of the 'PC_AUTO_OUTDOOR_MODE' */
-+    const int                          default_limit_angle;       /**< Default value of limited angle: 20 degree */
-+};
-+typedef struct pvl_perspective_control pvl_perspective_control;
-+
-+
-+/** @ Deprecated
-+ * @brief A structure to hold the analysis data of vanishing points from input image.
-+ */
-+struct pvl_vanishing_orientation {
-+    int       angle;                                /**< (To divide an input image into 4 quadrants and locate the origin on the centre point of the image.)
-+                                                       The value is degree of each vanishing point in a counter-clockwise rotation from X axis.*/
-+    pvl_bool  is_outside;                           /**< This value is related to how far each vanishing point is from the centre point.
-+                                                         'pvl_true' means this vanishing point is located outside of an image.
-+                                                         'pvl_true' means this vanishing point is located inside of an image.
-+                                                         if this value is false, then the image warping based on this target VaP can cause too severe image warping*/
-+};
-+typedef struct pvl_vanishing_orientation pvl_vanishing_orientation;
-+
-+struct pvl_perspective_data {
-+    int                       num_vanishing_points;                        /**< The number of vanishing point of the input image */
-+    pvl_vanishing_orientation vanishing_point[MAX_VANISHING_POINT];        /**< Information of each vanishing point.
-+                                                                            Users can choose the vanishing point based on angle. */
-+};
-+typedef struct pvl_perspective_data pvl_perspective_data;
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_perspective_control_result{
-+    pvl_image         output_image;        /**< The final output image. The component manages the memory. Do not free the internal data buffer of this structure.
-+                                                 After resetting or destroying the 'perspective_control' component handle, this data would not be reachable. */
-+    pvl_rect crop_hint;
-+    float v_correction_value;
-+    float h_correction_value;
-+};
-+typedef struct pvl_perspective_control_result pvl_perspective_control_result;
-+
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the perspective_control component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_perspective_control_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the perspective_control component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] pc      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle. Failure in loading run-time library related to GPU or IPU acceleration.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_perspective_control_create(const pvl_config *config, pvl_perspective_control **pc);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  pc   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_perspective_control_destroy(pvl_perspective_control *pc);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states, the analysis information, the composed output image and context will be reset except the run-time parameters set by user.
-+ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
-+ *
-+ *  @param[in]  pc      The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_perspective_control_reset(pvl_perspective_control *pc);
-+
-+/** @brief Set the perspective control mode for the given instance.
-+ *
-+ *  Current control mode of given instance will be changed to the designated control mode.
-+ *  If the input mode is same with the previous mode, it will return pvl_success without changing the internal status of current instance.
-+ *  but if it's changed, it will reset all internal states. so user should perform the process_image() or process_frame() with new input image.
-+ *
-+ *  @param[in]  pc      The handle of perspective control instance.
-+ *  @parma[in]  mode    The new perspective mode want to set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       Passing not supported perspective control mode.
-+ */
-+PVLAPI pvl_err pvl_perspective_control_set_control_mode(pvl_perspective_control* pc, pvl_perspective_control_mode mode);
-+
-+/** @brief Set and analyze input image for the perspective control.
-+ *
-+ *  Given image will be set as source image and perform analysis to detect characteristics depending on the current control mode.
-+ *  If the current control mode is PC_SCAN_MODE, it will try to find quadrangle points from the input image.
-+ *  And if the control mode is PC_BUILDING_MODE, it will try to find primary lines in both vertical and horizontal orientations.
-+ *  By calling this, user can get corresponding characteristics such as quadrangle points and primary lines using other APIs.
-+ *
-+ *  @param[in]  pc          The handle of perspective control instance.
-+ *  @parma[in]  input_image The image that want to be used as source image to the perspective control.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
-+ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
-+ */
-+PVLAPI pvl_err pvl_perspective_control_process_image(pvl_perspective_control* pc, pvl_image* input_image);
-+
-+/** @brief Set and analyze input image for the perspective control.
-+ *
-+ *  The most of funtionality is same with process_image(). but it is designed to use for the preview processing.
-+ *  In the input image analysis phase, it will try to detect characteristics using the sequance of input frames.
-+ *  It means that the input image analysis will be performed partially. so the corresponding characteristics could not be retrived
-+ *  after calling this API.
-+ *
-+ *  @param[in]  pc          The handle of perspective control instance.
-+ *  @param[in]  input_frame The image that want to be used as source image to analyze characteristics for the perspective control.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
-+ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
-+ */
-+PVLAPI pvl_err pvl_perspective_control_process_frame(pvl_perspective_control* pc, pvl_image* input_frame);
-+
-+/** @brief Get perspective corrected image with selected 'control_mode'.
-+ *
-+ *  This API will produce perspective-corrected output image using the configured parameters.
-+ *  In PC_SCAN_MODE, detected quadrangle points or configured one by user will be used for the image warping.
-+ *  And horizontal/vertical correction values and primary lines will be used for the correction of PC_BUILDING_MODE.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  The output image could have blank area since source image will be warped in vertical and/or horizontal direction.
-+ *  so, the crop_hint in the result structure could be used to get the soild image from the output image by cutting out the blank area.
-+ *
-+ *  @param[in]  pc      The handle of perspective control instance.
-+ *  @param[out]  result  The final output contains an output image. The component manages the memory. Do not allocate or free the internal 'data' buffer in 'output_image'.
-+ *                      After resetting or destroying the component handle this data would be not reachable.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
-+ *                                          Supported image format is only @refs pvl_image_format_rgba32
-+ */
-+PVLAPI pvl_err pvl_perspective_control_get_warped_image(pvl_perspective_control* pc, pvl_perspective_control_result* result);
-+
-+/** @brief Get the detected quadrangle points.
-+ *
-+ *  As a result of the process_image() or process_frame under the PC_SCAN_MODE, this API will return the detected quadrangle points.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_SCAN_MODE.
-+ *
-+ *  @param[in]  pc      The handle of perspective control instance.
-+ *  @parma[out] points  The array of pvl_point struct to be filled with detected quadrangle's points.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ *  @retval     pvl_err_no_such_item        There is no detcted quadrangle from the latest result of process_image() or process_frame().
-+ */
-+PVLAPI pvl_err pvl_perspective_control_get_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
-+
-+/** @brief Set the user customized quadrangle points.
-+ *
-+ *  If the output coodinates of get_quadrangle() API are not correct, user can adjust them using this API.
-+ *  Once quadrangle points were configured by this API, those coodinates will be used for the final processing of the perspective contorl
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_SCAN_MODE.
-+ *
-+ *  @param[in]  pc      The handle of perspective control instance.
-+ *  @param[in]  points  The array of pvl_point struct which contains user-customized quadrangle points.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ */
-+PVLAPI pvl_err pvl_perspective_control_set_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
-+
-+/** @brief Get the available orientation of the input image.
-+ *
-+ *  As a result of process_image() or process_frame() in the PC_BUILDING_MODE, perspective control engine will detect available
-+ *  orientation of perspective correction. it will be represented to the available correction range and filled to the correction_range structure.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_BUILDING_MODE.
-+ *
-+ *  @param[in]  pc              The handle of perspective control instance.
-+ *  @param[out] available_range The correction range structure which will be filled with available correction range values.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ */
-+PVLAPI pvl_err pvl_perspective_control_get_available_correction_range(pvl_perspective_control* pc, pvl_pc_correction_range* available_range);
-+
-+/** @brief Set the correction value for the given orientation.
-+ *
-+ *  To set the valid correction value, user should refer the result of get_available_correction_range() API.
-+ *  Valid range of 'value' is [pvl_pc_correction_range::min_vertical, pvl_pc_correction_range::max_vertical] where 'ori' is PC_ORI_VERTICAL,
-+ *  and [pvl_pc_correction_range::min_horizontal, pvl_pc_correction_range::min_horizontal] where 'ori' is PC_ORI_HORIZONTAL.
-+ *  Note taht tha zero value means no correction and 1.0 or -1.0 means the maximum correction.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_BUILDING_MODE.
-+ *
-+ *  @param[in]  pc      The handle of perspective control instance.
-+ *  @parma[in]  ori     The orientation for the correction value.
-+ *  @param[in]  value   The correction value to the given orientation.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
-+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE or 'value' is out of avaliable range.
-+ */
-+PVLAPI pvl_err pvl_perspective_control_set_correction_value(pvl_perspective_control* pc, pvl_pc_orientation ori, float value);
-+
-+/** @brief Get the information of primary lines.
-+ *
-+ *  If the available range have non-zero value for the vertical/horizontal orientation, user can get the primary lines for that orientation
-+ *  to provide guide-line to the user using this API.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_BUILDING_MODE.
-+ *
-+ *  @param[in]  pc      The handle of the perspective_control component.
-+ *  @param[in]  ori     The orientation for the primary lines.
-+ *  @param[out] line1   The array of pvl_point to be represented a line with two points.
-+ *  @param[out] line2   The array of pvl_point to be represented a line with two points.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ *  @retval     pvl_err_no_such_item        There is no detected primary line from the source image.
-+ *                                          The source image may not have any vanishing point at the given orientation.
-+ */
-+PVLAPI pvl_err pvl_perspective_control_get_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
-+
-+/** @brief Set the customized primary lines for the given orientation.
-+ *
-+ *  User can mannually customize primary lines for the perspective correction using this API.
-+ *  This API should be called after calling process_image() or process_frame().
-+ *  And available only for the PC_BUILDING_MODE.
-+ *
-+ *  @param[in]  pc      The handle of the perspective_control component.
-+ *  @param[in]  ori     The orientation for the primary lines.
-+ *  @param[in]  line1   The array of pvl_point to be represented a line with two points.
-+ *  @param[in]  line2   The array of pvl_point to be represented a line with two points.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
-+ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
-+ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
-+ */
-+PVLAPI pvl_err pvl_perspective_control_set_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
-+
-+PVLAPI pvl_err
-+pvl_perspective_control_enhance_contrast(pvl_perspective_control *pc, pvl_image *image);
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example perspective_control_sample.c
-+ *  Sample of Perspective_control
-+ */
-+
-+#endif /* __PVL_PERSPECTIVE_CONTROL_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
-new file mode 100644
-index 000000000000..fe4cbd8421ce
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
-@@ -0,0 +1,242 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_SMILE_DETECTION_H__
-+#define __PVL_SMILE_DETECTION_H__
-+
-+/** @file    pvl_smile_detection.h
-+ *  @brief   This file declares the structure and native APIs of smile detection component.
-+ */
-+
-+#include "pvl_types.h"
-+#include "pvl_config.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+
-+/** @brief A structure to hold run-time configurable parameters for this component.
-+ *
-+ *  The variables in this structure will be retrieved and assigned, via pvl_smile_detection_get_parameters() and pvl_smile_detection_set_parameters() respectively.
-+ */
-+struct pvl_smile_detection_parameters
-+{
-+    int32_t threshold;                  /**< The threshold value that evaluates the status smile or not if the score greater than or equal to this threshold.
-+                                             The range of the value may be in [0..100], though, recommended to use the default value set in the structure pvl_smile_detection. */
-+};
-+typedef struct pvl_smile_detection_parameters pvl_smile_detection_parameters;
-+
-+
-+/** @brief The enumerated values to represent smile state of each face.
-+ */
-+enum pvl_smile_detection_state
-+{
-+    pvl_smile_detection_state_not_smiling   = 0,    /**< The state representing the face is 'NOT smiling'. */
-+    pvl_smile_detection_state_smiling       = 1,    /**< The state representing the face is 'smiling'. */
-+};
-+typedef enum pvl_smile_detection_state pvl_smile_detection_state;
-+
-+
-+/** @brief A structure to hold the outcomes from this component.
-+ */
-+struct pvl_smile_detection_result
-+{
-+    int32_t score;                      /**< The smile score of the face in the range of 0 to 100, where 0 means non-smile and 100 means full smile. */
-+    pvl_smile_detection_state state;    /**< The state of the smile of the face. */
-+};
-+typedef struct pvl_smile_detection_result pvl_smile_detection_result;
-+
-+
-+/** @brief A structure to hold the run-time context of this component.
-+ *
-+ *  This structure represents the smile detection instance which is used as the handle over most of API.
-+ *  It holds its own properties, constant parameters and internal context inside.
-+ */
-+struct pvl_smile_detection
-+{
-+    const pvl_version version;          /**< The version information. */
-+
-+    const int32_t default_threshold;    /**< The default threshold value recommended. */
-+    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
-+                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
-+};
-+typedef struct pvl_smile_detection pvl_smile_detection;
-+
-+
-+/** @brief Get default configuration of this component.
-+ *
-+ *  This function returns default configuration of the smile detection component.
-+ *  The returned configuration could be customized as per its usage.
-+ *
-+ *  @param[out] config  The structure to load default configuration.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_get_default_config(pvl_config *config);
-+
-+
-+/** @brief Create an instance of the smile detection component.
-+ *
-+ *  This function initializes and returns an instance of this component.
-+ *  Multiple instances are allowed to be created concurrently.
-+ *
-+ *  @param[in]  config  The configuration information of the component.
-+ *  @param[out] sd      A pointer to indicate the handle newly created.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported configuration.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_create(const pvl_config *config, pvl_smile_detection **sd);
-+
-+
-+/** @brief Destroy the instance of this component.
-+ *
-+ *  @param[in]  sd   The handle of this component to be destroyed.
-+ */
-+PVLAPI void
-+pvl_smile_detection_destroy(pvl_smile_detection *sd);
-+
-+
-+/** @brief Reset the instance of this component.
-+ *
-+ *  All the internal states and context will be reset except the run-time parameters set by user.
-+ *
-+ *  @param[in]  sd  The handle of this component.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_reset(pvl_smile_detection *sd);
-+
-+
-+/** @brief Set run-time parameters of this component.
-+ *
-+ *  Set given parameters to the handle.
-+ *  It is required to get proper parameters instance by pvl_smile_detection_get_parameters() before setting something.
-+ *
-+ *  @param[in]  sd      The handle of this component.
-+ *  @param[in]  params  The parameters to be set.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_set_parameters(pvl_smile_detection *sd, const pvl_smile_detection_parameters *params);
-+
-+
-+/** @brief Get current run-time parameters of this component.
-+ *
-+ *  Get the parameters from the handle.
-+ *  This function should be called before calling pvl_smile_detection_set_parameters().
-+ *
-+ *  @param[in]  sd      The handle of this component.
-+ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_get_parameters(pvl_smile_detection *sd, pvl_smile_detection_parameters *params);
-+
-+
-+/** @brief Detect smile on the face in the input image.
-+ *
-+ *  This function runs smile detection on the face in the given image.
-+ *  In contrast with pvl_smile_detection_run_in_preview(), temporal correlation with previous input images will not be considered.
-+ *  The caller is responsible for allocating the buffer for the result.
-+ *
-+ *  @param[in]  sd          The handle of the smile detection component.
-+ *  @param[in]  image       The input image. All image formats are supported.
-+ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  left_eye    The center point of the left eye of the face.
-+ *  @param[in]  right_eye   The center point of the right eye of the face.
-+ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_run_in_image(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
-+                                 pvl_smile_detection_result *result);
-+
-+
-+/** @brief Detect smile on the faces in the input image which is the part of the preview or the video frames.
-+ *
-+ *  This function will run smile detection on the faces in the input image assuming that the input image is the part of preview or video frames,
-+ *  meaning this frame has temporal correlation with previous and next input frames.
-+ *  Using the information from the previous frame may show better result in terms of the jitter or the noise.
-+ *
-+ *  The caller is responsible for allocating the buffer for result.
-+ *
-+ *  @param[in]  sd              The handle of the smile detection component.
-+ *  @param[in]  image           The input image. All image formats are supported.
-+ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
-+ *  @param[in]  left_eye        The center point of the left eye of the face.
-+ *  @param[in]  right_eye       The center point of the right eye of the face.
-+ *  @param[in]  tracking_id     The tracking-id returned from face detection component. Use pvl_smile_detection_run_in_image() if tracking-id is not available.
-+ *  @param[out] result          The result of the component. Must have enough memory to hold the result.
-+ *
-+ *  @return     On success, @ref pvl_success.
-+ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
-+ *
-+ *  @retval     pvl_err_not_supported       Unsupported image format specified.
-+ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
-+ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
-+ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
-+ */
-+PVLAPI pvl_err
-+pvl_smile_detection_run_in_preview(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
-+                                   int32_t tracking_id, pvl_smile_detection_result *result);
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif // __cplusplus
-+
-+/** @example face_detection_sample.cpp
-+ *  Sample of Smile Detection
-+ */
-+
-+#endif /* __PVL_SMILE_DETECTION_H__ */
-diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
-new file mode 100644
-index 000000000000..e94636536b96
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+
-+#ifndef __PVL_TYPES_H__
-+#define __PVL_TYPES_H__
-+
-+/**
-+ * @file    pvl_types.h
-+ * @brief   This file declares common structures for PVL.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include <stdint.h>
-+#include <stdarg.h>
-+
-+#if (defined (_WIN32) || defined (WIN32)) && !defined (DISABLE_PVLAPI)
-+    #if defined (PVL_EXPORT)
-+        #define DEPRECATED_PVLAPI __declspec(dllexport, deprecated)
-+        #define DEPRECATED __declspec(deprecated)
-+        #define PVLAPI __declspec(dllexport)
-+    #else
-+        #define DEPRECATED_PVLAPI __declspec(dllimport, deprecated)
-+        #define DEPRECATED __declspec(deprecated)
-+        #define PVLAPI __declspec(dllimport)
-+    #endif
-+#elif defined (__linux__) || defined (__linux) || defined (linux)
-+    #define DEPRECATED_PVLAPI __attribute__((visibility("default"), deprecated))
-+    #define DEPRECATED __attribute__((deprecated))
-+    #define PVLAPI __attribute__((visibility("default")))
-+#else
-+    #define DEPRECATED_PVLAPI
-+    #define DEPRECATED
-+    #define PVLAPI
-+#endif
-+
-+
-+/**
-+ * @brief A structure to represent a rectangle.
-+ */
-+struct pvl_rect {
-+    int32_t left;
-+    int32_t top;
-+    int32_t right;
-+    int32_t bottom;
-+};
-+typedef struct pvl_rect pvl_rect;
-+
-+
-+/**
-+ * @brief A structure to represent a 2D point.
-+ */
-+struct pvl_point {
-+    int32_t x;
-+    int32_t y;
-+};
-+typedef struct pvl_point pvl_point;
-+
-+
-+/**
-+ * @brief A structure to represent a size.
-+ */
-+struct pvl_size {
-+    int32_t width;
-+    int32_t height;
-+};
-+typedef struct pvl_size pvl_size;
-+
-+
-+/**
-+ * @brief A structure to represent 2D vector type composed with single precision floating types.
-+ */
-+struct pvl_vector2d {
-+    float x;
-+    float y;
-+};
-+typedef struct pvl_vector2d pvl_vector2d;
-+
-+
-+/**
-+ * @brief The enumerated values of the definitions of the error codes.
-+ */
-+enum pvl_err {
-+    pvl_success                 =  0,   /**< Successfully completed. */
-+    pvl_err_general             = -1,   /**< Function returned with unspecified error which does not fit to any other error codes. */
-+    pvl_err_not_supported       = -2,   /**< Specified parameter is not supported by the library. */
-+    pvl_err_invalid_argument    = -3,   /**< At least one function parameter is not valid. */
-+    pvl_err_out_of_bound        = -4,   /**< Specified parameter exceeds limit of allowed value. */
-+    pvl_err_interrupted         = -5,   /**< Function was interrupted due to change in internal state (usually caused by another thread.) */
-+    pvl_err_invalid_status      = -6,   /**< Operation cannot be completed because precondition is not met or information is insufficient. */
-+    pvl_err_nomem               = -7,   /**< Memory allocation has failed. */
-+    pvl_err_database_full       = -8,   /**< Internal database is full. */
-+    pvl_err_no_such_item        = -9,   /**< Requested item to look up was not found in the internal database. */
-+};
-+typedef enum pvl_err pvl_err;
-+
-+
-+/**
-+ * @brief The enumerated values of the definition of the boolean type.
-+ */
-+enum pvl_bool {
-+    pvl_false   = 0,
-+    pvl_true    = 1
-+};
-+typedef enum pvl_bool pvl_bool;
-+
-+
-+/**
-+ * @brief A structure to represent a version information.
-+ */
-+struct pvl_version {
-+    const uint16_t major;
-+    const uint16_t minor;
-+    const uint16_t patch;
-+    const char *description;
-+};
-+typedef struct pvl_version pvl_version;
-+
-+
-+/**
-+ * @brief The enumerated values of the definitions of possible image types.
-+ */
-+enum pvl_image_format {
-+    pvl_image_format_nv12,     /**< 12 bit YUV 420, Y plane first followed by UV-interleaved plane. e.g. YYYYYYYY UVUV */
-+    pvl_image_format_yv12,     /**< 12 bit YUV 420, Y plane first, U plane and then V plane. e.g. YYYYYYYY UU VV */
-+    pvl_image_format_gray,     /**< 8 bit, Y plane only. */
-+    pvl_image_format_rgba32,   /**< 32 bit RGBA, 8 bits per channel. e.g. RGBA RGBA RGBA  */
-+    pvl_image_format_yuy2,     /**< 16 bit YUV 422, YUYV interleaved. e.g. YUYV YUYV YUYV */
-+    pvl_image_format_nv21,     /**< 12 bit YUV 420, Y plane first followed by VU-interleaved plane. e.g. YYYYYYYY VUVU */
-+    pvl_image_format_bgr,
-+    pvl_image_format_rgb,
-+};
-+typedef enum pvl_image_format pvl_image_format;
-+
-+
-+/**
-+ * @brief A structure to represent the image for PVL engines.
-+ */
-+struct pvl_image {
-+    uint8_t *data;             /**< The pointer to the image data */
-+    uint32_t size;             /**< The total number of bytes of the data */
-+    int32_t width;             /**< The width of the image in pixels */
-+    int32_t height;            /**< The height of the image in lines */
-+    pvl_image_format format;   /**< The format of the image */
-+    int32_t stride;            /**< The stride that represents the number of bytes per row. */
-+    int32_t rotation;          /**< The rotation of the image. (in degree, [0..360])
-+                                     It rotates in a clockwise direction. */
-+};
-+typedef struct pvl_image pvl_image;
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif // #ifndef __PVL_TYPES_H__
-diff --git a/camera/hal/intel/ipu6/include/ia_tools/css_types.h b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
-new file mode 100644
-index 000000000000..4150dbf7e628
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
-@@ -0,0 +1,57 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __CSS_TYPES_H__
-+#define __CSS_TYPES_H__
-+
-+#include <stdint.h>
-+#include <stdbool.h>
-+
-+/*!
-+ * \brief Error codes.
-+ * \ingroup ia_tools
-+*/
-+typedef int32_t css_err_t;
-+#define css_err_none     0         /*!< No errors*/
-+#define css_err_general  (-(1 << 1))  /*!< General error*/
-+#define css_err_nomemory (-(1 << 2))  /*!< Out of memory*/
-+#define css_err_data     (-(1 << 3))  /*!< Corrupted data*/
-+#define css_err_internal (-(1 << 4))  /*!< Error in code*/
-+#define css_err_argument (-(1 << 5))  /*!< Invalid argument for a function*/
-+#define css_err_noentry  (-(1 << 6))  /*!< No such entry/entity/file */
-+#define css_err_timeout  (-(1 << 7))  /*!< Time out*/
-+#define css_err_end      (-(1 << 8))  /*!< End of values*/
-+#define css_err_full     (-(1 << 9))  /*!< Exchange full */
-+#define css_err_again    (-(1 << 10)) /*!< Operation requires additional call */
-+#define css_err_nimpl    (-(1 << 11)) /*!< Not implemented */
-+
-+#ifndef __cplusplus
-+
-+/* Define bool type as int for strict C89 */
-+#ifndef __bool_true_false_are_defined
-+#define bool int
-+#define false 0
-+#define true 1
-+#endif
-+
-+/* inline keyword compliance for ansi */
-+#if (__STDC_VERSION__ < 199901L)
-+#define inline
-+#endif
-+
-+#endif /* __cplusplus */
-+
-+#endif /* _CSS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/include/ia_tools/ia_list.h b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
-new file mode 100644
-index 000000000000..a9a258ea4b80
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
-@@ -0,0 +1,111 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_LIST_H_
-+#define _IA_LIST_H_
-+
-+#include <stdbool.h>
-+#include <ia_tools/css_types.h>
-+
-+/**
-+ * \ingroup ia_tools
-+ */
-+typedef struct ia_list {
-+    void *data;
-+    struct ia_list *next;
-+} ia_list_t;
-+
-+/**
-+ * Create a ia_list
-+ * \ingroup ia_tools
-+ * \return pointer to the list. NULL if failed.
-+ */
-+ia_list_t *
-+ia_list_create(void);
-+
-+/**
-+ * Destroy a ia_list
-+ * \ingroup ia_tools
-+ * \param *list the list
-+ */
-+void
-+ia_list_destroy(ia_list_t *list);
-+
-+/**
-+ * Add a new element to a list head. If *list is NULL, a new ia_list element is
-+ * allocated and inserted to *list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer
-+ * \param *data the data for the list element
-+ * \return css_err_none on success
-+ * Add data to a ia_list
-+ */
-+css_err_t
-+ia_list_prepend(ia_list_t **list, void *data);
-+
-+/**
-+ * Add a new element to a list tail. If *list is NULL, a new ia_list element is
-+ * allocated and inserted to *list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer
-+ * \param *data the data for the list element
-+ * \return css_err_none on success
-+ * Add data to a ia_list
-+ */
-+css_err_t
-+ia_list_append(ia_list_t **list, void *data);
-+
-+/**
-+ * Tell whether data is in the list
-+ * \ingroup ia_tools
-+ * \param *list handle to the list object
-+ * \param *data the data pointer
-+ * \return true if data is in the list, false otherwise
-+ */
-+bool
-+ia_list_contains(const ia_list_t *list, void *data);
-+
-+/**
-+ * Remove data if it exists in the list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer.
-+ * \param *data the data to remove from list.
-+ * \return true if data was removed. False otherwise.
-+ */
-+bool
-+ia_list_remove(ia_list_t **list, void *data);
-+
-+/**
-+ * Tell the length of the list.
-+ * \ingroup ia_tools
-+ * \param *list a pointer to the list.
-+ * \return length of the list.
-+ */
-+uint32_t
-+ia_list_length(const ia_list_t *list);
-+
-+/**
-+ * Return data at an index of the list.
-+ * \ingroup ia_tools
-+ * \param *list a pointer to the list.
-+ * \param index element index
-+ * \return pointer to the data at the element at the distance "index" from the
-+ * given list element
-+ */
-+void*
-+ia_list_data_at(const ia_list_t *list, uint32_t index);
-+
-+#endif /* _IA_LIST_H_ */
-diff --git a/camera/hal/intel/ipu6/include/linux/ipu-isys.h b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
-new file mode 100644
-index 000000000000..7ecf35c49040
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/linux/ipu-isys.h
-@@ -0,0 +1,51 @@
-+/****************************************************************************
-+ * Copyright (C) 2019 Intel Corporation.
-+ ****************************************************************************
-+ ***
-+ ***   This header was automatically generated from a Linux kernel header
-+ ***   of the same name, to make information necessary for userspace to
-+ ***   call into the kernel available to libc.  It contains only constants,
-+ ***   structures, and macros generated from the original header, and thus,
-+ ***   contains no copyrightable information.
-+ ***
-+ ***   To edit the content of this header, modify the corresponding
-+ ***   source file (e.g. under external/kernel-headers/original/) then
-+ ***   run bionic/libc/kernel/tools/update_all.py
-+ ***
-+ ***   Any manual change here will be lost the next time this script will
-+ ***   be run. You've been warned!
-+ ***
-+ ****************************************************************************
-+ ****************************************************************************/
-+#ifndef UAPI_LINUX_IPU_ISYS_H
-+#define UAPI_LINUX_IPU_ISYS_H
-+#define V4L2_CID_IPU_BASE (V4L2_CID_USER_BASE + 0x1080)
-+#define V4L2_CID_IPU_ISA_EN (V4L2_CID_IPU_BASE + 1)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define V4L2_CID_IPU_STORE_CSI2_HEADER (V4L2_CID_IPU_BASE + 2)
-+#define V4L2_CID_IPU_ISYS_COMPRESSION  (V4L2_CID_IPU_BASE + 3)
-+#define V4L2_IPU_ISA_EN_BLC (1 << 0)
-+#define V4L2_IPU_ISA_EN_LSC (1 << 1)
-+#define V4L2_IPU_ISA_EN_DPC (1 << 2)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define V4L2_IPU_ISA_EN_SCALER (1 << 3)
-+#define V4L2_IPU_ISA_EN_AWB (1 << 4)
-+#define V4L2_IPU_ISA_EN_AF (1 << 5)
-+#define V4L2_IPU_ISA_EN_AE (1 << 6)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define NR_OF_IPU_ISA_CFG 7
-+#define V4L2_FMT_IPU_ISA_CFG v4l2_fourcc('i', 'p', '4', 'c')
-+#define V4L2_FMT_IPU_ISYS_META v4l2_fourcc('i', 'p', '4', 'm')
-+#ifdef IPU_OTF_SUPPORT
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+struct ipu_frame_counter {
-+  uint32_t frame_counter;
-+  uint32_t index;
-+} __attribute__((packed));
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define VIDIOC_IPU_SET_LINK_ID _IOWR('v', BASE_VIDIOC_PRIVATE + 1, uint8_t)
-+#define VIDIOC_IPU_SET_FRAME_COUNTER _IOWR('v', BASE_VIDIOC_PRIVATE + 2, struct ipu_frame_counter)
-+#endif
-+#define VIDIOC_IPU_GET_DRIVER_VERSION _IOWR('v', BASE_VIDIOC_PRIVATE + 3, uint32_t)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#endif
-diff --git a/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
-new file mode 100644
-index 000000000000..043f60f0743e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/include/utils/ScopedAtrace.h
-@@ -0,0 +1,73 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <unistd.h>
-+
-+namespace icamera {
-+
-+/**
-+ * Following macros PERF_CAMERA_ATRACE_XXX() can be called in the function
-+ * we are scoping. Environment variable "camPerf" is need to be set as "16"
-+ * or "128", to enalbe atrace profiling:
-+ * 1. When "16" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_OS is
-+ * enalbed.
-+ * 2. When "128" is set, ATRACE with level of CAMERA_DEBUG_LOG_ATRACE_IMAGING
-+ * is enabled.
-+ */
-+class ScopedAtrace {
-+      public:
-+          ScopedAtrace(const int level, const char* func, const char* tag,
-+                       const char* note = NULL, long value = -1,
-+                       const char* note2 = NULL, int value2 = -1,
-+                       const char* note3 = NULL, int value3 = -1);
-+          ~ScopedAtrace();
-+          static void setTraceLevel(int);
-+      private:
-+          bool mEnableAtraceEnd;
-+};
-+
-+#define CAMERA_DEBUG_LOG_ATRACE_OS (1<<4)
-+#define CAMERA_DEBUG_LOG_ATRACE_IMAGING (1<<7)
-+
-+#define PERF_CAMERA_ATRACE() ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, \
-+                                                 __func__, LOG_TAG);
-+#define PERF_CAMERA_ATRACE_PARAM1(note, value) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, \
-+                                LOG_TAG, note, value);
-+#define PERF_CAMERA_ATRACE_PARAM2(note, value, note2, value2) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
-+                                note, value, note2, value2);
-+#define PERF_CAMERA_ATRACE_PARAM3(note, value, note2, value2, note3, value3) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_OS, __func__, LOG_TAG, \
-+                                note, value, note2, value2, note3, value3);
-+
-+#define PERF_CAMERA_ATRACE_IMAGING() \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
-+                                LOG_TAG);
-+#define PERF_CAMERA_ATRACE_PARAM1_IMAGING(note, value) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
-+                                LOG_TAG, note, value);
-+#define PERF_CAMERA_ATRACE_PARAM2_IMAGING(note, value, note2, value2) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
-+                                LOG_TAG, note, value, note2, value2);
-+#define PERF_CAMERA_ATRACE_PARAM3_IMAGING(note, value, note2, value2, note3, \
-+                                          value3) \
-+            ScopedAtrace atrace(CAMERA_DEBUG_LOG_ATRACE_IMAGING, __func__, \
-+                                LOG_TAG, note, value, note2, value2, note3, \
-+                                value3);
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
-new file mode 100644
-index 000000000000..c3227edb14c3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.cpp
-@@ -0,0 +1,136 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAiq"
-+
-+#include "modules/algowrapper/IntelAiq.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelAiq::IntelAiq() :
-+    mAiq(nullptr) {
-+    LOG2("@%s", __func__);
-+}
-+
-+IntelAiq::~IntelAiq() {
-+    LOG2("@%s", __func__);
-+}
-+
-+ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData,
-+                       const ia_binary_data* nvmData,
-+                       const ia_binary_data* aiqdData,
-+                       unsigned int statsMaxWidth,
-+                       unsigned int statsMaxHeight,
-+                       unsigned int maxNumStatsIn,
-+                       ia_cmc_t* cmc,
-+                       ia_mkn* mkn) {
-+    LOG2("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
-+
-+    mAiq = ia_aiq_init(aiqbData, nvmData, aiqdData,
-+                       statsMaxWidth, statsMaxHeight, maxNumStatsIn, cmc, mkn);
-+
-+    return mAiq;
-+}
-+
-+ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_ae_run(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_af_run(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_awb_run(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
-+                         ia_aiq_gbce_results** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_gbce_run(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
-+                         ia_aiq_pa_results_v1** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_pa_run_v1(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
-+                         ia_aiq_sa_results_v1** results) {
-+    LOG2("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    return ia_aiq_sa_run_v2(mAiq, inputParams, results);
-+}
-+
-+ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
-+    LOG2("@%s, inputParams:%p", __func__, inputParams);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+
-+    return ia_aiq_statistics_set_v4(mAiq, inputParams);
-+}
-+
-+ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
-+    LOG2("@%s, outData:%p", __func__, outData);
-+    CheckError(!mAiq, ia_err_argument, "@%s, mAiq is nullptr", __func__);
-+    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
-+
-+    return ia_aiq_get_aiqd_data(mAiq, outData);
-+}
-+
-+void IntelAiq::deinit() {
-+    LOG2("@%s", __func__);
-+    CheckError(!mAiq, VOID_VALUE, "@%s, mAiq is nullptr", __func__);
-+
-+    ia_aiq_deinit(mAiq);
-+}
-+
-+void IntelAiq::getVersion(std::string* version) {
-+    LOG2("@%s", __func__);
-+
-+    *version = std::string(ia_aiq_get_version());
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
-new file mode 100644
-index 000000000000..4ff9deffa6eb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelAiq.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_aiq.h>
-+#include <ia_types.h>
-+
-+#include <string>
-+
-+namespace icamera {
-+class IntelAiq {
-+ public:
-+    IntelAiq();
-+    virtual ~IntelAiq();
-+
-+    // the return pointer (ia_aiq*) is just valid in the sandboxing process.
-+    ia_aiq* init(const ia_binary_data* aiqbData,
-+                 const ia_binary_data* nvmData,
-+                 const ia_binary_data* aiqdData,
-+                 unsigned int statsMaxWidth,
-+                 unsigned int statsMaxHeight,
-+                 unsigned int maxNumStatsIn,
-+                 ia_cmc_t* cmc,
-+                 ia_mkn* mkn);
-+    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
-+    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
-+    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
-+    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
-+    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
-+    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
-+    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
-+    ia_err getAiqdData(ia_binary_data* outData);
-+    void deinit();
-+    void getVersion(std::string* version);
-+
-+ private:
-+    ia_aiq* mAiq;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
-new file mode 100644
-index 000000000000..949e5e306df4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.cpp
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelCmc"
-+
-+#include "modules/algowrapper/IntelCmc.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelCmc::IntelCmc() :
-+    mHandle(nullptr) {
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelCmc::~IntelCmc() {
-+    LOG1("@%s", __func__);
-+}
-+
-+bool IntelCmc::init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData) {
-+    LOG1("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
-+    CheckError(!aiqbData, false, "aiqbData is nullptr");
-+    CheckError(nvmData, false, "nvmData is not nullptr");  // it doesn't support nvmData currently.
-+
-+    mHandle = ia_cmc_parser_init_v1(aiqbData, nvmData);
-+    LOG1("@%s, mHandle:%p", __func__, mHandle);
-+
-+    return true;
-+}
-+
-+ia_cmc_t* IntelCmc::getCmc() const {
-+    LOG1("@%s, mHandle:%p", __func__, mHandle);
-+
-+    return mHandle;
-+}
-+
-+uintptr_t IntelCmc::getCmcHandle() const {
-+    LOG1("@%s", __func__);
-+
-+    return reinterpret_cast<uintptr_t>(mHandle);
-+}
-+
-+void IntelCmc::deinit() {
-+    LOG1("@%s", __func__);
-+    CheckError(!mHandle, VOID_VALUE, "mHandle is nullptr");
-+
-+    ia_cmc_parser_deinit(mHandle);
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
-new file mode 100644
-index 000000000000..0e7391bca181
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelCmc.h
-@@ -0,0 +1,37 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_cmc_parser.h>
-+#include <ia_cmc_types.h>
-+
-+namespace icamera {
-+class IntelCmc {
-+ public:
-+    IntelCmc();
-+    ~IntelCmc();
-+
-+    bool init(const ia_binary_data* aiqbData, const ia_binary_data* nvmData);
-+
-+    ia_cmc_t* getCmc() const;
-+    uintptr_t getCmcHandle() const;
-+
-+    void deinit();
-+ private:
-+    ia_cmc_t* mHandle;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
-new file mode 100644
-index 000000000000..2bb061f84411
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.cpp
-@@ -0,0 +1,190 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelDvs"
-+
-+#include "modules/algowrapper/IntelDvs.h"
-+
-+#include "AiqUtils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelDvs::IntelDvs() {
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelDvs::~IntelDvs() {
-+    LOG1("@%s", __func__);
-+}
-+
-+ia_err IntelDvs::init(const ia_binary_data &aiqTuningBinary,
-+                      const ia_cmc_t *cmc, ia_dvs_state **dvsHandle) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_init(dvsHandle, &aiqTuningBinary, cmc);
-+    CheckError(err != ia_err_none, ia_err_general, "@%s, Failed to init dvs lib", __func__);
-+    return err;
-+}
-+
-+void IntelDvs::deinit(ia_dvs_state *dvsHandle) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_dvs_deinit(dvsHandle);
-+}
-+
-+ia_err IntelDvs::config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(!config, ia_err_general, "@%s, config is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_config(dvsHandle, config, zoomRatio);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_config fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_non_blank_ratio(dvsHandle, nonBlankingRatio);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_non_blank_ratio fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_digital_zoom_mode(dvsHandle, zoomMode);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_mode fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(!zoomRegion, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_digital_zoom_region(dvsHandle, zoomRegion);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_region fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state *dvsHandle,
-+                                          ia_coordinate *zoomCoordinate) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(!zoomCoordinate, ia_err_general, "@%s, zoomCoordinate is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_digital_zoom_coordinate(dvsHandle, zoomCoordinate);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_coordinate fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_digital_zoom_magnitude(dvsHandle, zoomRatio);
-+    CheckError(err != ia_err_none, err, "@%s, ia_dvs_set_digital_zoom_magnitude fails", __func__);
-+    return err;
-+}
-+
-+void IntelDvs::freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
-+    LOG1("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
-+    CheckError(!morphTable, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
-+
-+    ia_dvs_free_morph_table(morphTable);
-+}
-+
-+ia_dvs_morph_table *IntelDvs::allocateMorphTalbe(ia_dvs_state *dvsHandle) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, nullptr, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_dvs_morph_table *morphTable = nullptr;
-+    ia_err err = ia_dvs_allocate_morph_table(dvsHandle, &morphTable);
-+    CheckError((!morphTable || err != ia_err_none), nullptr,
-+               "@%s, ia_dvs_allocate_morph_table fails", __func__);
-+    return morphTable;
-+}
-+
-+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
-+    LOG2("@%s", __func__);
-+    CheckError(!dvsHandle, UNKNOWN_ERROR,  "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(!morphTable, UNKNOWN_ERROR,  "@%s, morphTable is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_get_morph_table(dvsHandle, morphTable);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
-+               "@%s, ia_dvs_get_morph_table fails, err:%d",  __func__, err);
-+
-+    return OK;
-+}
-+
-+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle,
-+                            ia_dvs_morph_table *morphTable, DvsResult *result) {
-+    LOG2("@%s", __func__);
-+
-+    int ret = getMorphTable(dvsHandle, morphTable);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, getMorphTable fails",  __func__);
-+
-+    ret = DvsResult::deepCopyDvsResults(*morphTable, &result->mMorphTable);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails",  __func__);
-+
-+    return OK;
-+}
-+
-+ia_err IntelDvs::setStatistics(ia_dvs_state *dvsHandle,
-+                               const ia_dvs_statistics *statistics,
-+                               const ia_aiq_ae_results *aeResults,
-+                               const ia_aiq_af_results *afResults,
-+                               const ia_aiq_sensor_events *sensorEvents,
-+                               uint64_t frameReadoutStart,
-+                               uint64_t frameReadoutEnd) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_set_statistics(dvsHandle, statistics, aeResults,
-+                                       afResults, sensorEvents,
-+                                       frameReadoutStart, frameReadoutEnd);
-+    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_set_statistics fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::execute(ia_dvs_state *dvsHandle, uint16_t focusPosition) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_execute(dvsHandle, focusPosition);
-+    CheckError(err != ia_err_none, ia_err_general, "@%s, ia_dvs_execute fails", __func__);
-+    return err;
-+}
-+
-+ia_err IntelDvs::getImageTransformation(ia_dvs_state *dvsHandle,
-+                                        ia_dvs_image_transformation *imageTransformation) {
-+    LOG1("@%s", __func__);
-+    CheckError(!dvsHandle, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(!imageTransformation, ia_err_general,
-+               "@%s, imageTransformation is nullptr", __func__);
-+
-+    ia_err err = ia_dvs_get_image_transformation(dvsHandle, imageTransformation);
-+    CheckError(err != ia_err_none, ia_err_general,
-+               "@%s, ia_dvs_get_image_transformation fails", __func__);
-+    return err;
-+}
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
-new file mode 100644
-index 000000000000..27f35f7d195c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelDvs.h
-@@ -0,0 +1,57 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_dvs.h>
-+#include <ia_dvs_types.h>
-+#include <ia_isp_bxt.h>
-+
-+#include "iutils/Thread.h"
-+#include "iutils/Errors.h"
-+
-+#include "CameraEvent.h"
-+#include "DvsResult.h"
-+
-+namespace icamera {
-+class IntelDvs {
-+ public:
-+    IntelDvs();
-+    ~IntelDvs();
-+
-+    ia_err init(const ia_binary_data &aiqTuningBinary,
-+                const ia_cmc_t *cmc, ia_dvs_state **dvsHandle);
-+    void deinit(ia_dvs_state *dvsHandle);
-+    ia_err config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio);
-+    ia_err setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio);
-+    ia_err setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode);
-+    ia_err setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion);
-+    ia_err setDigitalZoomCoordinate(ia_dvs_state *dvsHandle, ia_coordinate *zoomCoordinate);
-+    ia_err setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio);
-+    void freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
-+    ia_dvs_morph_table *allocateMorphTalbe(ia_dvs_state *dvsHandle);
-+    int getMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
-+    int getMorphTable(ia_dvs_state *dvsHandle,
-+                      ia_dvs_morph_table *morphTable, DvsResult *result);
-+    ia_err setStatistics(ia_dvs_state *dvsHandle, const ia_dvs_statistics *statistics,
-+                         const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
-+                         const ia_aiq_sensor_events *sensorEvents, uint64_t frameReadoutStart,
-+                         uint64_t frameReadoutEnd);
-+    ia_err execute(ia_dvs_state *dvsHandle, uint16_t focusPosition);
-+    ia_err getImageTransformation(ia_dvs_state *dvsHandle,
-+                                  ia_dvs_image_transformation *imageTransformation);
-+};
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
-new file mode 100644
-index 000000000000..dd31a6983acd
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.cpp
-@@ -0,0 +1,149 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelFaceDetection"
-+#include "modules/algowrapper/IntelFaceDetection.h"
-+
-+#include <string.h>
-+#include <algorithm>
-+
-+#include "AiqUtils.h"
-+#include "iutils/CameraLog.h"
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+IntelFaceDetection::IntelFaceDetection() :
-+    mFDHandle(nullptr),
-+    mMaxFacesNum(0) {
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelFaceDetection::~IntelFaceDetection() {
-+    LOG1("@%s", __func__);
-+}
-+
-+status_t IntelFaceDetection::init(FaceDetectionInitParams *pData,
-+                                  int dataSize) {
-+    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "pData is nullptr");
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
-+               UNKNOWN_ERROR, "buffer is small");
-+
-+    mMaxFacesNum = std::min(pData->max_face_num,
-+                            static_cast<unsigned int>(MAX_FACES_DETECTABLE));
-+    LOG2("@%s, mMaxFacesNum:%d", __func__, mMaxFacesNum);
-+
-+    pvl_err faceRet = pvl_face_detection_create(nullptr, &mFDHandle);
-+    if (faceRet == pvl_success) {
-+        return OK;
-+    }
-+
-+    LOGE("@%s, faceRet:%d", __func__, faceRet);
-+    return UNKNOWN_ERROR;
-+}
-+
-+status_t IntelFaceDetection::deinit() {
-+    LOG1("@%s", __func__);
-+
-+    if (mFDHandle) {
-+        pvl_face_detection_destroy(mFDHandle);
-+        mFDHandle = nullptr;
-+    }
-+    return OK;
-+}
-+
-+void IntelFaceDetection::convertCoordinate(int faceId, int width,
-+                                           int height, const pvl_rect &src,
-+                                           pvl_rect *dst) {
-+    CheckError(!dst, VOID_VALUE, "dst is nullptr");
-+
-+    const camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
-+                                                     IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
-+    const camera_coordinate_system_t faceCoordinate = {0, 0, width, height};
-+
-+    camera_coordinate_t topLeft =
-+        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.left, src.top});
-+    camera_coordinate_t bottomRight =
-+        AiqUtils::convertCoordinateSystem(faceCoordinate, iaCoordinate, {src.right, src.bottom});
-+
-+    *dst = {topLeft.x, topLeft.y, bottomRight.x, bottomRight.y};
-+    LOG2("@%s, face:%d, dst left:%d, top:%d, right:%d, bottom:%d", __func__,
-+         faceId, dst->left, dst->top, dst->right, dst->bottom);
-+}
-+
-+FaceDetectionRunParams *IntelFaceDetection::prepareRunBuffer(unsigned int index) {
-+    LOG1("@%s", __func__);
-+    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr,
-+               "@%s, index is error %d", __func__, index);
-+    CheckError(!mFDHandle, nullptr, "mFDHandle is nullptr");
-+
-+    return &mMemRunBufs[index];
-+}
-+
-+status_t IntelFaceDetection::run(pvl_image *pImage, FaceDetectionResult *fdResults) {
-+    LOG1("@%s, pImage:%p", __func__, pImage);
-+    CheckError(!pImage, UNKNOWN_ERROR, "pData is nullptr");
-+    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
-+
-+    int32_t fdRet = pvl_face_detection_run_in_preview(mFDHandle, pImage,
-+                                                      fdResults->faceResults, mMaxFacesNum);
-+    fdResults->faceNum = (fdRet > 0) ? fdRet : 0;
-+    LOG1("@%s, fdRet:%d, detected face number:%d, w:%d, h:%d",
-+         __func__, fdRet, fdResults->faceNum, pImage->width, pImage->height);
-+    for (int i = 0; i < fdResults->faceNum; i++) {
-+        LOG2("@%s, face:%d rect, left:%d, top:%d, right:%d, bottom:%d", __func__, i,
-+             fdResults->faceResults[i].rect.left,
-+             fdResults->faceResults[i].rect.top,
-+             fdResults->faceResults[i].rect.right,
-+             fdResults->faceResults[i].rect.bottom);
-+        LOG2("@%s, confidence:%d, rip_angle:%d, rop_angle:%d, tracking_id:%d", __func__,
-+             fdResults->faceResults[i].confidence,
-+             fdResults->faceResults[i].rip_angle,
-+             fdResults->faceResults[i].rop_angle,
-+             fdResults->faceResults[i].tracking_id);
-+    }
-+
-+    for (int i = 0; i < fdResults->faceNum; i++) {
-+        convertCoordinate(i, pImage->width, pImage->height, fdResults->faceResults[i].rect,
-+                          &fdResults->faceResults[i].rect);
-+    }
-+
-+    return OK;
-+}
-+
-+status_t IntelFaceDetection::run(FaceDetectionRunParams *fdRunParams, int dataSize, void *addr) {
-+    LOG1("@%s, fdRunParams:%p, dataSize:%d, addr:%p", __func__, fdRunParams, dataSize, addr);
-+    CheckError(!fdRunParams, UNKNOWN_ERROR, "pData is nullptr");
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
-+               UNKNOWN_ERROR, "buffer is small");
-+    CheckError(!mFDHandle, UNKNOWN_ERROR, "mFDHandle is nullptr");
-+
-+    pvl_image image;
-+    image.size = fdRunParams->size;
-+    image.width = fdRunParams->width;
-+    image.height = fdRunParams->height;
-+    image.format = fdRunParams->format;
-+    image.stride = fdRunParams->stride;
-+    image.rotation = fdRunParams->rotation;
-+    if (addr) {
-+        image.data = const_cast<uint8_t*>(static_cast<uint8_t*>(addr));
-+    } else {
-+        image.data = const_cast<uint8_t*>(fdRunParams->data);
-+    }
-+
-+    return run(&image, &fdRunParams->results);
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
-new file mode 100644
-index 000000000000..b990dd684504
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelFaceDetection.h
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+#include <memory>
-+
-+#include "FaceBase.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+class IntelFaceDetection {
-+ public:
-+    IntelFaceDetection();
-+    ~IntelFaceDetection();
-+
-+    status_t init(FaceDetectionInitParams *initData, int dataSize);
-+    status_t deinit();
-+    status_t run(pvl_image *pImage, FaceDetectionResult *fdResults);
-+    status_t run(FaceDetectionRunParams *fdRunParams, int dataSize, void *addr = nullptr);
-+    FaceDetectionRunParams *prepareRunBuffer(unsigned int index);
-+
-+ private:
-+    pvl_face_detection *mFDHandle;
-+    unsigned int mMaxFacesNum;
-+    FaceDetectionRunParams mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
-+    void convertCoordinate(int faceId, int width, int height, const pvl_rect &src, pvl_rect *dst);
-+
-+    DISALLOW_COPY_AND_ASSIGN(IntelFaceDetection);
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
-new file mode 100644
-index 000000000000..827af3cf8a2a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.cpp
-@@ -0,0 +1,139 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelIspParamAdaptor"
-+
-+#include "modules/algowrapper/IntelIspParamAdaptor.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+IntelIspParamAdaptor::IntelIspParamAdaptor() {
-+    LOG2("@%s", __func__);
-+}
-+
-+IntelIspParamAdaptor::~IntelIspParamAdaptor() {
-+    LOG2("@%s", __func__);
-+}
-+
-+ia_isp_bxt *IntelIspParamAdaptor::init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
-+                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
-+                                       unsigned int maxNumStatsIn, ia_mkn *iaMkn) {
-+    LOG2("@%s", __func__);
-+    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
-+    LOG1("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u",
-+         __func__, ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
-+
-+    return ia_isp_bxt_init(ispData, iaCmc, maxStatsWidth, maxStatsHeight, maxNumStatsIn, iaMkn);
-+}
-+
-+void IntelIspParamAdaptor::deInit(ia_isp_bxt *ispBxtHandle) {
-+    LOG2("@%s", __func__);
-+    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
-+
-+    ia_isp_bxt_deinit(ispBxtHandle);
-+}
-+
-+int IntelIspParamAdaptor::getPalDataSize(ia_isp_bxt_program_group *programGroup) {
-+    LOG2("@%s", __func__);
-+    CheckError(!programGroup, -1, "%s programGroup is nullptr", __func__);
-+
-+    return ia_isp_bxt_get_output_size(programGroup);
-+}
-+
-+void IntelIspParamAdaptor::freePalBuffer(void *addr) {
-+    LOG2("@%s addr: %p", __func__, addr);
-+    free(addr);
-+}
-+
-+void *IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
-+    LOG2("@%s index: %d, streamId: %d, size: %d", __func__, index, streamId, palDataSize);
-+
-+    return calloc(1, palDataSize);
-+}
-+
-+status_t IntelIspParamAdaptor::runPal(ia_isp_bxt *ispBxtHandle,
-+                                      const ia_isp_bxt_input_params_v2 *inputParams,
-+                                      ia_binary_data *outputData) {
-+    LOG2("@%s", __func__);
-+    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
-+               "%s, ispBxtHandle or inputParams is nullptr", __func__);
-+    CheckError((!outputData || !outputData->data || outputData->size <= 0),
-+               UNKNOWN_ERROR, "%s, Wrong pal data buffer", __func__);
-+
-+    ia_err ret = ia_isp_bxt_run_v2(ispBxtHandle, inputParams, outputData);
-+    CheckError(ret != ia_err_none, UNKNOWN_ERROR,
-+               "%s, isp parameters adaptor run failed %d", __func__, ret);
-+    LOG1("%s, The pal result size: %d", __func__, outputData->size);
-+
-+    return OK;
-+}
-+
-+status_t IntelIspParamAdaptor::queryAndConvertStats(
-+        ia_isp_bxt *ispBxtHandle,
-+        ConvertInputParam *inputParams, ConvertResult *result) {
-+    LOG2("@%s", __func__);
-+    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
-+    CheckError(!inputParams || !result,
-+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
-+    CheckError(!inputParams->dvsReso || !inputParams->aeResults,
-+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
-+    CheckError((!inputParams->statsBuffer ||
-+               !inputParams->statsBuffer->data || inputParams->statsBuffer->size <= 0),
-+               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
-+    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
-+
-+    ia_err ret = ia_isp_bxt_statistics_query(ispBxtHandle,
-+                                             inputParams->statsBuffer, result->queryResults);
-+    CheckError(ret != ia_err_none, UNKNOWN_ERROR, "%s, Query statistice failed %d", __func__, ret);
-+
-+    // Decode DVS statistics
-+    if (result->queryResults->dvs_stats) {
-+        if (inputParams->dvsReso->width == 0 || inputParams->dvsReso->height == 0) {
-+            LOGW("%s, The gdc resolution for DVS isn't correct", __func__);
-+        } else {
-+            ret = ia_isp_bxt_statistics_convert_dvs_from_binary(
-+                    ispBxtHandle, inputParams->statsBuffer, inputParams->dvsReso->width,
-+                    inputParams->dvsReso->height, &(result->dvsStats));
-+            CheckWarning((ret != ia_err_none || !result->dvsStats), UNKNOWN_ERROR,
-+                         "%s, Failed to convert DVS statistics %d", __func__, ret);
-+            LOG3A("%s, DVS stat vector_count: %u", __func__, result->dvsStats->vector_count);
-+        }
-+    }
-+
-+    // Decode psa rgbs and af statistics
-+    if (result->queryResults->rgbs_grid &&
-+        result->queryResults->af_grid && !inputParams->multiExpo) {
-+        ret = ia_isp_bxt_statistics_convert_awb_from_binary_v3(
-+                  ispBxtHandle, inputParams->statsBuffer, nullptr,
-+                  inputParams->aeResults, inputParams->bcompResult, result->rgbsGrid, nullptr);
-+
-+        ia_aiq_rgbs_grid *rgbs = *(result->rgbsGrid);
-+        CheckWarning((ret != ia_err_none || !rgbs), UNKNOWN_ERROR,
-+                      "%s, Failed to convert psa RGBS statistics %d", __func__, ret);
-+        LOG3A("%s, RGBS stat grid %dx%d", __func__, rgbs->grid_width, rgbs->grid_height);
-+
-+        ret = ia_isp_bxt_statistics_convert_af_from_binary(
-+                  ispBxtHandle, inputParams->statsBuffer, &(result->afGrid));
-+        CheckWarning((ret != ia_err_none || !result->afGrid), UNKNOWN_ERROR,
-+                     "%s, Failed to convert psa AF statistics %d", __func__, ret);
-+        LOG3A("%s, AF stat grid %dx%d", __func__,
-+              result->afGrid->grid_width, result->afGrid->grid_height);
-+    }
-+
-+    return OK;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
-new file mode 100644
-index 000000000000..56af85d76800
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelIspParamAdaptor.h
-@@ -0,0 +1,45 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "modules/algowrapper/StatsTypes.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+
-+class IntelIspParamAdaptor {
-+ public:
-+    IntelIspParamAdaptor();
-+    virtual ~IntelIspParamAdaptor();
-+
-+    ia_isp_bxt *init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
-+                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
-+                     unsigned int maxNumStatsIn, ia_mkn *iaMkn);
-+    void deInit(ia_isp_bxt *ispBxtHandle);
-+    int getPalDataSize(ia_isp_bxt_program_group *programGroup);
-+
-+    void *allocatePalBuffer(int streamId, int index, int palDataSize);
-+    void freePalBuffer(void *addr);
-+    status_t runPal(ia_isp_bxt *ispBxtHandle,
-+                    const ia_isp_bxt_input_params_v2 *inputParams, ia_binary_data *outputData);
-+    status_t queryAndConvertStats(ia_isp_bxt *ispBxtHandle,
-+                                  ConvertInputParam *inputParams, ConvertResult *result);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
-new file mode 100644
-index 000000000000..d1bf016f103f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.cpp
-@@ -0,0 +1,71 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelLard"
-+
-+#include "modules/algowrapper/IntelLard.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelLard::IntelLard() {
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelLard::~IntelLard() {
-+    LOG1("@%s", __func__);
-+}
-+
-+ia_lard* IntelLard::init(const ia_binary_data *lard_data_ptr) {
-+    LOG1("@%s", __func__);
-+    CheckError(!lard_data_ptr, nullptr, "lard_data_ptr is nullptr");
-+    LOG1("@%s, lard_data_ptr, data:%p, size:%d",
-+         __func__, lard_data_ptr->data, lard_data_ptr->size);
-+
-+    ia_lard* lard = ia_lard_init(lard_data_ptr);
-+    LOG1("@%s, lard:%p", __func__, lard);
-+
-+    return lard;
-+}
-+
-+ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
-+                             unsigned int* num_tags, const unsigned int** tags) {
-+    LOG1("@%s", __func__);
-+    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
-+    CheckError(!num_tags, ia_err_general, "num_tags is nullptr");
-+    CheckError(!tags, ia_err_general, "tags is nullptr");
-+
-+    return ia_lard_get_tag_list(ia_lard_ptr, mode_tag, num_tags, tags);
-+}
-+
-+ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
-+                      ia_lard_results** lard_results_ptr) {
-+    LOG1("@%s", __func__);
-+    CheckError(!ia_lard_ptr, ia_err_general, "ia_lard_ptr is nullptr");
-+    CheckError(!lard_input_params_ptr, ia_err_general, "lard_input_params_ptr is nullptr");
-+    CheckError(!lard_results_ptr, ia_err_general, "lard_results_ptr is nullptr");
-+
-+    return ia_lard_run(ia_lard_ptr, lard_input_params_ptr, lard_results_ptr);
-+}
-+
-+void IntelLard::deinit(ia_lard* ia_lard_ptr) {
-+    LOG1("@%s", __func__);
-+    CheckError(!ia_lard_ptr, VOID_VALUE, "ia_lard_ptr is nullptr");
-+
-+    ia_lard_deinit(ia_lard_ptr);
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
-new file mode 100644
-index 000000000000..f9a15f22a1a9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLard.h
-@@ -0,0 +1,34 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_lard.h>
-+
-+namespace icamera {
-+class IntelLard {
-+ public:
-+  IntelLard();
-+  ~IntelLard();
-+
-+  ia_lard* init(const ia_binary_data* lard_data_ptr);
-+  ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
-+                    unsigned int* num_tags, const unsigned int** tags);
-+  ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
-+             ia_lard_results** lard_results_ptr);
-+  void deinit(ia_lard* ia_lard_ptr);
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
-new file mode 100644
-index 000000000000..7859c4d6db36
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.cpp
-@@ -0,0 +1,65 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelLtm"
-+
-+#include "modules/algowrapper/IntelLtm.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IntelLtm::IntelLtm() {
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelLtm::~IntelLtm() {
-+    LOG1("@%s", __func__);
-+}
-+
-+ia_ltm *IntelLtm::init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn) {
-+    LOG1("%s", __func__);
-+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
-+
-+    ia_ltm *ltm = ia_ltm_init(lard_data_ptr, mkn);
-+    CheckError(!ltm , nullptr, "@%s, ia_ltm_init fails", __func__);
-+
-+    return ltm;
-+}
-+
-+void IntelLtm::deinit(ia_ltm *ltm) {
-+    LOG1("%s", __func__);
-+    CheckError(!ltm, VOID_VALUE, "@%s, ltm is null", __func__);
-+
-+    ia_ltm_deinit(ltm);
-+}
-+
-+ia_err IntelLtm::run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
-+                     ia_ltm_results **ltmResults,
-+                     ia_ltm_drc_params **drcResults) {
-+    LOG1("%s", __func__);
-+    CheckError(!ltm, ia_err_general, "@%s, ltm is null", __func__);
-+    CheckError(!inputParams, ia_err_general, "@%s, inputParams is null", __func__);
-+    CheckError(!ltmResults, ia_err_general, "@%s, ltmResults is null", __func__);
-+    CheckError(!drcResults, ia_err_general, "@%s, drcResults is null", __func__);
-+
-+    ia_err ret = ia_ltm_run(ltm, inputParams, ltmResults, drcResults);
-+
-+    return ret;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
-new file mode 100644
-index 000000000000..9199b869e57f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelLtm.h
-@@ -0,0 +1,33 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_ltm.h>
-+
-+namespace icamera {
-+class IntelLtm {
-+ public:
-+    IntelLtm();
-+    virtual ~IntelLtm();
-+
-+    ia_ltm *init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn);
-+    ia_err run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
-+               ia_ltm_results **ltmResults,
-+               ia_ltm_drc_params **drcResults);
-+    void deinit(ia_ltm *ltm);
-+};
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
-new file mode 100644
-index 000000000000..e3c99cf9d058
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.cpp
-@@ -0,0 +1,70 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelMkn"
-+
-+#include "modules/algowrapper/IntelMkn.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IntelMkn::IntelMkn() {
-+    LOG1("%s", __func__);
-+}
-+
-+IntelMkn::~IntelMkn() {
-+    LOG1("%s", __func__);
-+}
-+
-+ia_mkn *IntelMkn::init(ia_mkn_config_bits mkn_config_bits,
-+                       size_t mkn_section_1_size,
-+                       size_t mkn_section_2_size) {
-+    LOG1("%s", __func__);
-+
-+    return ia_mkn_init(mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
-+}
-+
-+int IntelMkn::enable(ia_mkn *pMkn, bool enable_data_collection) {
-+    LOG1("%s", __func__);
-+    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
-+
-+    ia_err err = ia_mkn_enable(pMkn, enable_data_collection);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, call ia_mkn_enable() fails", __func__);
-+
-+    return OK;
-+}
-+
-+void IntelMkn::deinit(ia_mkn *pMkn) {
-+    LOG1("%s", __func__);
-+    CheckError(!pMkn, VOID_VALUE, "@%s, pMkn is null", __func__);
-+
-+    ia_mkn_uninit(pMkn);
-+}
-+
-+int IntelMkn::prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *binaryData) {
-+    LOG1("%s", __func__);
-+    CheckError(!pMkn, BAD_VALUE, "@%s, pMkn is null", __func__);
-+
-+    *binaryData = ia_mkn_prepare(pMkn, data_target);
-+    CheckError(binaryData->size == 0 || binaryData->data == nullptr, NO_MEMORY,
-+               "@%s, binaryData->size:%d, binaryData->data:%p, error!", __func__,
-+               binaryData->size, binaryData->data);
-+
-+    return OK;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
-new file mode 100644
-index 000000000000..62a556b2085e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelMkn.h
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_mkn_types.h>
-+#include <ia_mkn_encoder.h>
-+
-+namespace icamera {
-+class IntelMkn {
-+ public:
-+    IntelMkn();
-+    ~IntelMkn();
-+
-+    ia_mkn *init(ia_mkn_config_bits mkn_config_bits,
-+                 size_t mkn_section_1_size,
-+                 size_t mkn_section_2_size);
-+    void deinit(ia_mkn *pMkn);
-+    int prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *binaryData);
-+    int enable(ia_mkn *pMkn, bool enable_data_collection);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
-new file mode 100644
-index 000000000000..3595573e1e88
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
-@@ -0,0 +1,1266 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelPGParam"
-+
-+#include "modules/algowrapper/IntelPGParam.h"
-+
-+#include <algorithm>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+IntelPGParam::IntelPGParam(int pgId) :
-+        mPgId(pgId),
-+        mTerminalCount(0),
-+        mFragmentCount(0),
-+        mFragmentDesc(nullptr),
-+        mFragmentConfig(nullptr),
-+        mP2pHandle(nullptr),
-+        mPgManifest(nullptr),
-+        mProcessGroup(nullptr),
-+        mProgramControlInitTerminalIndex(-1),
-+        mProcessGroupMemory(nullptr) {
-+    CLEAR(mP2pCacheBuffer);
-+    CLEAR(mPgReqs);
-+    CLEAR(mParamPayloads);
-+}
-+
-+IntelPGParam::~IntelPGParam() {
-+    if (mFragmentDesc) {
-+        delete []mFragmentDesc;
-+    }
-+    if (mFragmentConfig) {
-+        delete mFragmentConfig;
-+    }
-+
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        if (mPgReqs.terminals[i].kernelOrder) {
-+            delete[] mPgReqs.terminals[i].kernelOrder;
-+        }
-+    }
-+
-+    destroyPayloads();
-+    destroyPGBuffer();
-+}
-+
-+int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
-+    mP2pHandle = ia_p2p_init(platform);
-+    CheckError(!mP2pHandle, UNKNOWN_ERROR, "ia_p2p_init has failed");
-+
-+    mP2pCacheBuffer.size = ia_p2p_get_cache_buffer_size(mP2pHandle);
-+    mP2pCacheBuffer.data = IA_CIPR_CALLOC(1, mP2pCacheBuffer.size);
-+    LOG1("%s: mP2pCacheBuffer.size=%d", __func__, mP2pCacheBuffer.size);
-+    CheckError(!mP2pCacheBuffer.data, UNKNOWN_ERROR, "Failed to allocate P2P cache buffer.");
-+
-+    mPgManifest = pgConfig.pgManifest;
-+    mDisableDataTermials = pgConfig.disableDataTermials;
-+    mTerminalCount = ia_css_program_group_manifest_get_terminal_count(mPgManifest);
-+
-+    mFragmentCount = pgConfig.fragmentCount;
-+    mInputMainFrame = pgConfig.inputMainFrame;
-+    mOutputMainFrame = pgConfig.outputMainFrame;
-+
-+    return OK;
-+}
-+
-+int IntelPGParam::calcFragmentDescriptors(int fragmentCount,
-+                                          const PgFrameDesc& inputMainFrame,
-+                                          const PgFrameDesc& outputMainFrame,
-+                                          const ia_css_rbm_t* rbm) {
-+    if (mFragmentDesc) {
-+        delete []mFragmentDesc;
-+        mFragmentDesc = nullptr;
-+    }
-+
-+    delete mFragmentConfig;
-+    mFragmentConfig = nullptr;
-+
-+    mFragmentDesc = new ia_p2p_fragment_desc[FRAG_TERM_TYPE_COUNT * fragmentCount];
-+    memset(mFragmentDesc, 0x0, sizeof(ia_p2p_fragment_desc) * FRAG_TERM_TYPE_COUNT * fragmentCount);
-+    if (fragmentCount <= 1) {
-+        ia_p2p_fragment_desc desc;
-+        desc.fragment_width = inputMainFrame.width;
-+        desc.fragment_height = inputMainFrame.height;
-+        desc.fragment_start_x = 0;
-+        desc.fragment_start_y = 0;
-+        for (int i = 0; i < FRAG_TERM_TYPE_COUNT; i++) {
-+            mFragmentDesc[i] = desc;
-+        }
-+    }
-+
-+    mFragmentConfig = new ia_p2p_fragment_configuration_t;
-+    CLEAR(*mFragmentConfig);
-+    int ret = ia_p2p_calculate_fragments_rbm(mP2pHandle,
-+                                             mPgId,
-+                                             (unsigned int)fragmentCount,
-+                                             rbm,
-+                                             nullptr,  // only for IA_P2P_PLATFORM_IPU6 now
-+                                             mFragmentConfig);
-+
-+    dumpFragmentDesc(fragmentCount);
-+    return ret;
-+}
-+
-+static int kernel_id_ffs(ia_css_kernel_bitmap_t bitmap) {
-+    int n = 0;
-+    if (ia_css_is_kernel_bitmap_empty(bitmap))
-+        return -1;
-+    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)n))
-+        n++;
-+    return n;
-+}
-+
-+int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
-+    CheckError(descCount < mTerminalCount * mFragmentCount, BAD_VALUE,
-+               "descCount is small", descCount);
-+
-+    int descLen = sizeof(ia_p2p_fragment_desc) * mFragmentCount;
-+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    for (int i = 0; i < terminalCount; i++) {
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
-+        int termIdx = terminal->tm_index;
-+        if ((mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_OUT) &&
-+            (mPgReqs.terminals[termIdx].type != IA_CSS_TERMINAL_TYPE_DATA_IN)) {
-+            continue;
-+        }
-+
-+        if (mFragmentConfig) {
-+            int kernelId = kernel_id_ffs(mPgReqs.terminals[termIdx].kernelBitmap);
-+            CheckError((kernelId < 0 || kernelId >= IA_CSS_KERNEL_BITMAP_BITS), -1,
-+                       "error terminal %d", termIdx);
-+            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
-+                     mFragmentConfig->pixel_fragment_descs[kernelId], descLen);
-+            LOG2("PG %d: Terminal %d: selected fragment desc (<%d,%d> %dx%d) with kernel id %d",
-+                 mPgId,
-+                 termIdx,
-+                 descs[termIdx].fragment_start_x,
-+                 descs[termIdx].fragment_start_y,
-+                 descs[termIdx].fragment_width,
-+                 descs[termIdx].fragment_height,
-+                 kernelId);
-+        } else {
-+            /* PG uses legacy fragment calculation logic */
-+            MEMCPY_S(&descs[termIdx * mFragmentCount], descLen,
-+                     mPgReqs.terminals[termIdx].fragment_descs, descLen);
-+            LOG2("PG %d: Terminal %d: selected legacy fragment descriptor (<%d,%d> %dx%d)",
-+                 mPgId,
-+                 termIdx,
-+                 descs[termIdx].fragment_start_x,
-+                 descs[termIdx].fragment_start_y,
-+                 descs[termIdx].fragment_width,
-+                 descs[termIdx].fragment_height);
-+        }
-+    }
-+    return mFragmentCount;
-+}
-+
-+int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
-+                          ia_css_kernel_bitmap_t* bitmap) {
-+    CheckError(ipuParameters == nullptr || bitmap == nullptr, BAD_VALUE,
-+               "The input paramter is nullptr.");
-+
-+    ia_css_terminal_type_t terminalType;
-+    int8_t termIndex;
-+    int kernelId = 0;
-+
-+    ia_err err = ia_p2p_parse(mP2pHandle, ipuParameters, mP2pCacheBuffer.data);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
-+
-+    int ret = calcFragmentDescriptors(mFragmentCount, mInputMainFrame, mOutputMainFrame, rbm);
-+    CheckError(ret != OK, ret, "Failed to calc fragment desc.");
-+
-+    int outputDataTerminalCount = FRAG_TERM_TYPE_OUTPUT_START;
-+    for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
-+        ia_css_terminal_manifest_t* terminalManifest =
-+            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)termIndex);
-+        CheckError(!terminalManifest, css_err_internal,
-+                   "No terminal manifest for terminal %d", termIndex);
-+
-+        terminalType = ia_css_terminal_manifest_get_type(terminalManifest);
-+        mPgReqs.terminals[termIndex].type = terminalType;
-+        mPgReqs.terminals[termIndex].kernelOrder = nullptr;
-+        size_t kernelInfoSize = PSYS_MAX_KERNELS_PER_PG * sizeof(IpuPgTerminalKernelInfo);
-+
-+        switch (terminalType) {
-+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
-+                ia_css_param_terminal_manifest_t* paramMani =
-+                    reinterpret_cast<ia_css_param_terminal_manifest_t*>(terminalManifest);
-+                mPgReqs.terminals[termIndex].kernelOrder =
-+                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
-+                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
-+                ret = getKernelOrderForParamCachedInTerm(paramMani,
-+                                                    mPgReqs.terminals[termIndex].kernelOrder);
-+                CheckError(ret != css_err_none, ret,
-+                           "getKernelOrderForParamCachedInTerm failed");
-+                 break;
-+            }
-+            case IA_CSS_TERMINAL_TYPE_PROGRAM: {
-+                ia_css_program_terminal_manifest_t* proMani =
-+                    reinterpret_cast<ia_css_program_terminal_manifest_t*>(terminalManifest);
-+                mPgReqs.terminals[termIndex].kernelOrder =
-+                    new IpuPgTerminalKernelInfo[PSYS_MAX_KERNELS_PER_PG];
-+                memset(mPgReqs.terminals[termIndex].kernelOrder, UINT8_MAX, kernelInfoSize);
-+                ret = getKernelOrderForProgramTerm(proMani,
-+                                                   mPgReqs.terminals[termIndex].kernelOrder);
-+                CheckError(ret != css_err_none, ret, "getKernelOrderForProgramTerm failed");
-+                break;
-+            }
-+            case IA_CSS_TERMINAL_TYPE_DATA_IN: {
-+                ia_css_data_terminal_manifest_t* dataMani =
-+                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
-+                /**
-+                 *Save the kernel bitmaps so that it can later be determined
-+                 * whether the terminals are disabled or not.
-+                 */
-+                mPgReqs.terminals[termIndex].kernelBitmap =
-+                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
-+                if (!mFragmentConfig) {
-+                    mPgReqs.terminals[termIndex].fragment_descs =
-+                        &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount];
-+                }
-+                break;
-+            }
-+            case IA_CSS_TERMINAL_TYPE_DATA_OUT: {
-+                ia_css_data_terminal_manifest_t* dataMani =
-+                    reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest);
-+                /**
-+                 * Save the kernel bitmaps so that it can later be determined
-+                 * whether the terminals are disabled or not.
-+                 */
-+                mPgReqs.terminals[termIndex].kernelBitmap =
-+                    ia_css_data_terminal_manifest_get_kernel_bitmap(dataMani);
-+                if (!mFragmentConfig) {
-+                    mPgReqs.terminals[termIndex].fragment_descs =
-+                        &mFragmentDesc[outputDataTerminalCount * mFragmentCount];
-+                    outputDataTerminalCount++;
-+                }
-+                break;
-+            }
-+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
-+                ia_css_spatial_param_terminal_manifest_t* paramMani =
-+                    reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>
-+                    (terminalManifest);
-+                kernelId = (int32_t)(paramMani->kernel_id);
-+                mPgReqs.terminals[termIndex].kernelBitmap =
-+                    ia_css_kernel_bit_mask((uint32_t)kernelId);
-+                break;
-+            }
-+            case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+                /* Calculate the payload later when the final bitmask is known,
-+                 * in imaging_pipe_ctrl_identify_property, where it is actually
-+                 * needed. Just save here the index to the terminal. */
-+                mProgramControlInitTerminalIndex = termIndex;
-+                break;
-+            default:
-+                break;
-+        }
-+    }
-+
-+    mPgReqs.terminalCount = mTerminalCount;
-+
-+    ia_css_kernel_bitmap_t kernelBitmap = ia_p2p_get_kernel_bitmap(mP2pHandle, mPgId);
-+    kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
-+        ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest));
-+
-+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
-+        kernelId = getKernelIdByBitmap(kernelBitmap);
-+        CheckError((kernelId < 0 || kernelId >= PSYS_MAX_KERNELS_PER_PG), ia_err_internal,
-+                   "kernelId is out of range! %d", kernelId);
-+
-+        /* Get terminal requirements */
-+        ret = ia_p2p_get_kernel_terminal_requirements(mP2pHandle, mPgId,
-+                                               (uint32_t) kernelId, &mKernel.mSections[kernelId]);
-+        CheckError(ret != ia_err_none, ret, "%s: failed to get requirements for pg %d kernel %d",
-+            __func__, mPgId, kernelId);
-+
-+        /* Get payload descriptor */
-+        ret = ia_p2p_get_kernel_payload_desc(mP2pHandle, mPgId, (uint32_t) kernelId,
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+                          1,
-+#else
-+                          mFragmentCount,
-+#endif
-+                          (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                                           : &mFragmentDesc[FRAG_TERM_TYPE_INPUT * mFragmentCount]),
-+                          &mKernel.mPayloads[kernelId]);
-+        CheckError(ret != ia_err_none, ret, "%s: failed to get payload for pg %d kernel %d, ret %d",
-+            __func__, mPgId, kernelId, ret);
-+
-+        uint8_t kernelOrder = 0;
-+        termIndex = -1;
-+        if (mKernel.mSections[kernelId].param_in_section_count) {
-+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN;
-+
-+            /* P2P assumes single CACHED IN, cumulate to first */
-+            termIndex = terminalEnumerateByType(&mPgReqs, terminalType, 0);
-+            CheckError(termIndex < 0, ia_err_internal, "No PARAM_CACHED_IN according to manifest!");
-+            if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
-+                if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections
-+                    != mKernel.mSections[kernelId].param_in_section_count) {
-+                    LOGW("%s: p2p cached in section count differs (kernel_id:%i p2p:%d vs pg:%d)",
-+                         __func__, kernelId,
-+                         mKernel.mSections[kernelId].param_in_section_count,
-+                         mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
-+                    /* Overwrite P2P requirements with manifest */
-+                    mKernel.mSections[kernelId].param_in_section_count =
-+                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
-+                    mKernel.mPayloads[kernelId].param_in_payload_size =
-+                        std::max(mKernel.mPayloads[kernelId].param_in_payload_size,
-+                            mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
-+                    mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
-+                }
-+                processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
-+            }
-+        }
-+
-+        if (mKernel.mSections[kernelId].param_out_section_count_per_fragment) {
-+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
-+            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
-+                if (mPgReqs.terminals[termIndex].type != terminalType) {
-+                    continue;
-+                }
-+
-+                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
-+                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
-+                }
-+            }
-+        }
-+
-+        if (mKernel.mSections[kernelId].program_section_count_per_fragment) {
-+            terminalType = IA_CSS_TERMINAL_TYPE_PROGRAM;
-+            for (termIndex = 0; termIndex < mTerminalCount; termIndex++) {
-+                if (mPgReqs.terminals[termIndex].type != terminalType) {
-+                    continue;
-+                }
-+                if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, &kernelOrder)) {
-+                    if (mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections !=
-+                        mKernel.mSections[kernelId].program_section_count_per_fragment) {
-+                        LOGW("%s: p2p program section count differs (kernel_id:%i p2p:%d vs pg:%d)",
-+                             __func__, kernelId,
-+                             mKernel.mSections[kernelId].program_section_count_per_fragment,
-+                             mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections);
-+                        /* Overwrite P2P requirements with manifest */
-+                        mKernel.mSections[kernelId].program_section_count_per_fragment =
-+                            mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].sections;
-+                        mKernel.mPayloads[kernelId].program_payload_size =
-+                            std::max(mKernel.mPayloads[kernelId].program_payload_size,
-+                                mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].size);
-+                        mPgReqs.terminals[termIndex].kernelOrder[kernelOrder].initialize = true;
-+                    }
-+                    processTerminalKernelRequirements(&mPgReqs, termIndex, terminalType, kernelId);
-+                }
-+            }
-+        }
-+
-+        /* P2P assumes each spatial kernel parameter has its own terminal */
-+        if (mKernel.mSections[kernelId].spatial_param_in_section_count) {
-+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN;
-+            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
-+                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
-+            if (termIndex < 0) {
-+                LOG1("%s: No PARAM_SPATIAL_IN for kernel id %d according to manifest!",
-+                     __func__, kernelId);
-+            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
-+                 mPgReqs.terminals[termIndex].sectionCount +=
-+                     mKernel.mSections[kernelId].spatial_param_in_section_count;
-+                 mPgReqs.terminals[termIndex].payloadSize +=
-+                     mKernel.mPayloads[kernelId].spatial_param_in_payload_size;
-+                mPgReqs.terminals[termIndex].kernelBitmap =
-+                     ia_css_kernel_bit_mask((uint32_t)kernelId);
-+             }
-+        }
-+
-+        if (mKernel.mSections[kernelId].spatial_param_out_section_count) {
-+            terminalType = IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
-+            termIndex = terminalEnumerateByBitmap(&mPgReqs, terminalType,
-+                                                  ia_css_kernel_bit_mask((uint32_t)kernelId));
-+            if (termIndex < 0) {
-+                LOG1("%s: No PARAM_SPATIAL_OUT for kernel id %d according to manifest!",
-+                     __func__, kernelId);
-+            } else if (isKernelIdInKernelOrder(&mPgReqs, termIndex, kernelId, nullptr)) {
-+                 mPgReqs.terminals[termIndex].sectionCount +=
-+                     mKernel.mSections[kernelId].spatial_param_out_section_count;
-+                 mPgReqs.terminals[termIndex].payloadSize +=
-+                     mKernel.mPayloads[kernelId].spatial_param_out_payload_size;
-+                mPgReqs.terminals[termIndex].kernelBitmap =
-+                     ia_css_kernel_bit_mask((uint32_t)kernelId);
-+             }
-+        }
-+
-+        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, (uint32_t)kernelId);
-+    }
-+
-+    /* get all kernel bits back */
-+    kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mPgManifest);
-+
-+    /* get disabled kernels from p2p and remove them */
-+    kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
-+            ia_css_kernel_bitmap_complement(ia_p2p_get_kernel_disable_bitmap(mP2pHandle, mPgId)));
-+
-+    /* get disabled data terminal kernels and remove them */
-+    for (auto& item : mDisableDataTermials) {
-+        ia_css_terminal_manifest_t *terminalManifest =
-+            ia_css_program_group_manifest_get_term_mnfst(mPgManifest, (unsigned int)item);
-+        ia_css_kernel_bitmap_t dataTerminalKernelBitmap =
-+            ia_css_data_terminal_manifest_get_kernel_bitmap(
-+            reinterpret_cast<ia_css_data_terminal_manifest_t*>(terminalManifest));
-+        kernelBitmap = ia_css_kernel_bitmap_intersection(kernelBitmap,
-+            ia_css_kernel_bitmap_complement(dataTerminalKernelBitmap));
-+    }
-+
-+    /* disable params terminals which payload size are zero */
-+    ret = disableZeroSizedTerminals(&kernelBitmap);
-+    CheckError(ret != OK, ret, "%s: failed to disable zero size terminals", __func__);
-+
-+    *bitmap = kernelBitmap;
-+    return ret;
-+}
-+
-+void* IntelPGParam::allocatePGBuffer(int pgSize) {
-+    destroyPGBuffer();
-+    void* memory = IA_CIPR_ALLOC_ALIGNED(PAGE_ALIGN(pgSize), IA_CIPR_PAGESIZE());
-+    mProcessGroupMemory = reinterpret_cast<ia_css_process_group_t*>(memory);
-+    return mProcessGroupMemory;
-+}
-+
-+void IntelPGParam::destroyPGBuffer() {
-+    if (mProcessGroupMemory) {
-+        IA_CIPR_FREE(mProcessGroupMemory);
-+        mProcessGroupMemory = nullptr;
-+    }
-+}
-+
-+int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
-+    CheckError(!pg, UNKNOWN_ERROR, "input pg nullptr!");
-+    mProcessGroup = pg;
-+
-+    int ret = OK;
-+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    for (int i = 0; i < terminalCount; i++) {
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
-+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
-+        int termIdx = terminal->tm_index;
-+
-+        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+            unsigned int payloadSize = 0;
-+            ret = pg_control_init_get_payload_size(pg, &payloadSize);
-+            CheckError(ret != OK, UNKNOWN_ERROR, "call pg_control_init_get_payload_size fail");
-+            mPgReqs.terminals[termIdx].payloadSize = payloadSize;
-+
-+            ret = pg_control_init_terminal_init(mProcessGroup,
-+                             reinterpret_cast<ia_css_program_control_init_terminal_t*>(terminal));
-+            CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_terminal_init.");
-+        }
-+
-+        if (mPgReqs.terminals[termIdx].type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
-+            if (mFragmentConfig) {
-+                ret = ia_p2p_program_terminal_init_v2(
-+                        mP2pHandle,
-+                        mPgId,
-+                        mFragmentConfig,
-+                        reinterpret_cast<ia_css_program_terminal_t*>(terminal));
-+            } else {
-+                ret = ia_p2p_program_terminal_init(
-+                        mP2pHandle,
-+                        mPgId,
-+                        mFragmentCount,
-+                        mFragmentDesc,
-+                        reinterpret_cast<ia_css_program_terminal_t*>(terminal));
-+            }
-+            CheckError(ret != ia_err_none, ret, "Failed to init program terminal.");
-+        }
-+    }
-+    return OK;
-+}
-+
-+int IntelPGParam::getPayloadSizes(int payloadCount, ia_binary_data* payloads) {
-+    CheckError(payloadCount < mTerminalCount || !payloads, BAD_VALUE, "Can't get payload sizes!");
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        payloads[termIdx].size = mPgReqs.terminals[termIdx].payloadSize;
-+    }
-+    return mTerminalCount;
-+}
-+
-+int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
-+    destroyPayloads();
-+    int count = getPayloadSizes(mTerminalCount, mParamPayloads);
-+    CheckError(payloadCount < count || !payloads, 0, "payloads error");
-+
-+    for (int idx = 0; idx < count; idx++) {
-+        if (mParamPayloads[idx].size == 0) {
-+            continue;
-+        }
-+        mParamPayloads[idx].data = IA_CIPR_ALLOC_ALIGNED(PAGE_ALIGN(mParamPayloads[idx].size),
-+                                                         IA_CIPR_PAGESIZE());
-+    }
-+    MEMCPY_S(payloads, count * sizeof(ia_binary_data),
-+             mParamPayloads, count * sizeof(ia_binary_data));
-+
-+    return count;
-+}
-+
-+void IntelPGParam::destroyPayloads() {
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        if (mParamPayloads[termIdx].data) {
-+            IA_CIPR_FREE(mParamPayloads[termIdx].data);
-+            mParamPayloads[termIdx].data = nullptr;
-+        }
-+    }
-+    CLEAR(mParamPayloads);
-+}
-+
-+int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParams,
-+                                     int payloadCount, ia_binary_data* payloads) {
-+    ia_err err = ia_p2p_parse(mP2pHandle, ipuParams, mP2pCacheBuffer.data);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Failed to parse PAL data.");
-+
-+    CheckError(!payloads, UNKNOWN_ERROR, "no payloads for encode.");
-+    CheckError(payloadCount < mTerminalCount, UNKNOWN_ERROR,
-+               "small payload count %d, should be %d", payloadCount, mTerminalCount);
-+    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't encode due to null pg.");
-+
-+    int ret = OK;
-+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    ia_css_terminal_t* programControlInitTerminal = nullptr;
-+    for (int i = 0; i < terminalCount; i++) {
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
-+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
-+        if (!payloads[terminal->tm_index].data) {
-+            continue;
-+        }
-+
-+        // Encode that terminal at last
-+        if (terminal->tm_index == mProgramControlInitTerminalIndex) {
-+            programControlInitTerminal = terminal;
-+            continue;
-+        }
-+
-+        ret = encodeTerminal(terminal, payloads[terminal->tm_index]);
-+        CheckError(ret != OK, ret, "Failed to encode for terminal %d.", terminal->tm_index);
-+    }
-+    if (programControlInitTerminal) {
-+        ret = encodeTerminal(programControlInitTerminal,
-+                             payloads[programControlInitTerminal->tm_index]);
-+        CheckError(ret != OK, ret, "Failed to encode for program control init terminal %d.",
-+                   programControlInitTerminal->tm_index);
-+    }
-+
-+    return ret;
-+}
-+
-+int IntelPGParam::encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
-+    int ret = OK;
-+
-+    int terminalIndex = terminal->tm_index;
-+    if (mPgReqs.terminals[terminalIndex].type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+        unsigned int kupSize = 0;
-+        ret = ia_p2p_get_kernel_user_parameter_size(mP2pHandle, mPgId, mFragmentCount, &kupSize);
-+        CheckError(ret != ia_err_none, ret,
-+                   "Failed to call ia_p2p_get_kernel_user_parameter_size.");
-+        if (kupSize != mPgReqs.terminals[terminalIndex].userParamSize) {
-+            mPgReqs.terminals[terminalIndex].userParamSize = kupSize;
-+            mPgReqs.terminals[terminalIndex].userParamAddress = \
-+                                               std::unique_ptr<uint8_t[]>(new uint8_t[kupSize]);
-+        }
-+
-+        if (mFragmentConfig) {
-+            ret = ia_p2p_get_kernel_user_parameters_v2(mP2pHandle,
-+                                          mPgId,
-+                                          mFragmentCount,
-+                                          mFragmentConfig,
-+                                          mPgReqs.terminals[terminalIndex].userParamAddress.get());
-+            CheckError(ret != ia_err_none, ret,
-+                       "Failed to call ia_p2p_get_kernel_user_parameters_v2.");
-+        } else {
-+            ret = ia_p2p_get_kernel_user_parameters(mP2pHandle,
-+                                          mPgId,
-+                                          mFragmentCount,
-+                                          mFragmentDesc,
-+                                          mPgReqs.terminals[terminalIndex].userParamAddress.get());
-+            CheckError(ret != ia_err_none, ret,
-+                       "Failed to call ia_p2p_get_kernel_user_parameters.");
-+        }
-+
-+        ia_css_kernel_user_param_t* userParam = \
-+                       reinterpret_cast<ia_css_kernel_user_param_t*> \
-+                       (mPgReqs.terminals[terminalIndex].userParamAddress.get());
-+        ret = pg_control_init_fill_payload(mProcessGroup, userParam, payload.data);
-+        CheckError(ret != ia_err_none, ret, "Failed to call pg_control_init_fill_payload.");
-+        return ret;
-+    }
-+
-+    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminalIndex].kernelBitmap;
-+    uint16_t kernelId = 0;
-+    uint8_t kernelIndex = 0;
-+    unsigned int curSection = 0;
-+    unsigned int curOffset = 0;
-+    ia_p2p_payload_desc tmpPayloadDesc;
-+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
-+        /* Use specific ordering of kernels when available */
-+        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
-+            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
-+            if (kernelId >= PSYS_MAX_KERNELS_PER_PG) {
-+                /* All the kernels have now been encoded. */
-+                break;
-+            }
-+            /* Initialize parameter payload for current kernel with zeros in
-+             * case P2P has reported less sections for the kernel */
-+            if (mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex - 1].initialize) {
-+                LOG2("%s: initializing kernel %d payload in terminal %d (offset:%d, size:%d)",
-+                          __func__, kernelId, terminalIndex, curOffset,
-+                          mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex-1].size);
-+                unsigned char* start = reinterpret_cast<unsigned char*>(payload.data);
-+                memset(start + curOffset, 0,
-+                    mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex-1].size);
-+            }
-+        } else {
-+            kernelId = getKernelIdByBitmap(kernelBitmap);
-+        }
-+
-+        /* Sanity check sections sizes and return the size to be used */
-+        css_err_t result = payloadSectionSizeSanityTest(&tmpPayloadDesc,
-+                                  kernelId,
-+                                  terminalIndex,
-+                                  curOffset,
-+                                  payload.size);
-+        CheckError((result != css_err_none), UNKNOWN_ERROR,
-+                   "Failed sanity check of terminal payload sizes");
-+
-+        switch (mPgReqs.terminals[terminalIndex].type) {
-+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+                ret = ia_p2p_param_in_terminal_encode(mP2pHandle,
-+                                  mPgId,
-+                                  kernelId,
-+                                  reinterpret_cast<ia_css_param_terminal_t*>(terminal),
-+                                  curSection,
-+                                  reinterpret_cast<uint8_t*>(payload.data),
-+                                  payload.size,
-+                                  curOffset);
-+                CheckError(ret != ia_err_none, ret, "Failed to encode param in terminal.");
-+
-+                curSection += mKernel.mSections[kernelId].param_in_section_count;
-+                curOffset += tmpPayloadDesc.param_in_payload_size;
-+                break;
-+
-+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+                ret = ia_p2p_param_out_terminal_prepare(mP2pHandle,
-+                                  mPgId,
-+                                  kernelId,
-+                                  mFragmentCount,
-+                                  reinterpret_cast<ia_css_param_terminal_t*>(terminal),
-+                                  curSection,
-+                                  mPgReqs.terminals[terminalIndex].sectionCount,
-+                                  payload.size,
-+                                  curOffset);
-+                CheckError(ret != ia_err_none, ret, "Failed to prepare param out terminal.");
-+
-+                curSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
-+                curOffset += tmpPayloadDesc.param_out_payload_size;
-+                break;
-+
-+            case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+                reinterpret_cast<ia_css_program_terminal_t*>(terminal)->payload_fragment_stride =
-+                    mPgReqs.terminals[terminalIndex].payloadSize / mFragmentCount;
-+#endif
-+                ret = ia_p2p_program_terminal_encode(mP2pHandle,
-+                                  mPgId,
-+                                  kernelId,
-+                                  mFragmentCount,
-+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                                                   : mFragmentDesc),
-+                                  reinterpret_cast<ia_css_program_terminal_t*>(terminal),
-+                                  curSection,
-+                                  mPgReqs.terminals[terminalIndex].sectionCount,
-+                                  reinterpret_cast<uint8_t*>(payload.data),
-+                                  payload.size,
-+                                  curOffset);
-+                CheckError(ret != ia_err_none, ret, "Failed to encode program terminal.");
-+
-+                curSection += mKernel.mSections[kernelId].program_section_count_per_fragment;
-+                curOffset += tmpPayloadDesc.program_payload_size;
-+                break;
-+
-+           case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+                 /* TODO: ensure program terminal gets encoded first */
-+                 ret = ia_p2p_spatial_param_in_terminal_encode(mP2pHandle,
-+                                  mPgId,
-+                                  kernelId,
-+                                  mFragmentCount,
-+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                                                   : mFragmentDesc),
-+                                  reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
-+                                  curSection,
-+                                  reinterpret_cast<uint8_t*>(payload.data),
-+                                  payload.size,
-+                                  curOffset);
-+                 CheckError(ret != ia_err_none, ret, "Failed to encode spatial in terminal.");
-+
-+                 curOffset += tmpPayloadDesc.spatial_param_in_payload_size;
-+                 curSection += mKernel.mSections[kernelId].spatial_param_in_section_count;
-+                 break;
-+
-+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+                 ret = ia_p2p_spatial_param_out_terminal_prepare(mP2pHandle,
-+                                  mPgId,
-+                                  kernelId,
-+                                  mFragmentCount,
-+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                                                   : mFragmentDesc),
-+                                  reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
-+                                  curSection,
-+                                  payload.size,
-+                                  curOffset);
-+                 CheckError(ret != ia_err_none, ret, "Failed to prepare spatial out terminal.");
-+
-+                 curOffset += tmpPayloadDesc.spatial_param_out_payload_size;
-+                 curSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
-+                 break;
-+
-+            case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+            case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+                 /* No encode done for frame terminals */
-+                 break;
-+
-+            default:
-+                LOGE("%s: terminal type %d encode not implemented", __func__,
-+                     mPgReqs.terminals[terminalIndex].type);
-+                return UNKNOWN_ERROR;
-+        }
-+
-+        if (!mPgReqs.terminals[terminalIndex].kernelOrder) {
-+            kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
-+        }
-+    }
-+
-+    return ret;
-+}
-+
-+int IntelPGParam::decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics) {
-+    CheckError(!mProcessGroup, INVALID_OPERATION, "Can't decode due to null pg.");
-+    CheckError(!payload, INVALID_OPERATION, "nullptr payload.");
-+
-+    int ret = OK;
-+    int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    for (int i = 0; i < terminalCount; i++) {
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
-+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
-+        if ((terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) &&
-+            (terminal->terminal_type != IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
-+            continue;
-+        }
-+        CheckError(terminal->tm_index >= payloadCount, UNKNOWN_ERROR,
-+                   "no payload for term %d decoding", terminal->tm_index);
-+        ret = decodeTerminal(terminal, payload[terminal->tm_index]);
-+        CheckError(ret != OK, ret, "%s, call p2p decode fail", __func__);
-+    }
-+
-+    return serializeDecodeCache(statistics);
-+}
-+
-+int IntelPGParam::decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload) {
-+    int ret = OK;
-+    int terminalIndex = terminal->tm_index;
-+    unsigned int currentSection = 0;
-+    int kernelIndex = 0;
-+    uint16_t kernelId;
-+    ia_css_kernel_bitmap_t kernelBitmap = mPgReqs.terminals[terminal->tm_index].kernelBitmap;
-+    while (!ia_css_is_kernel_bitmap_empty(kernelBitmap)) {
-+        /* Use specific ordering of kernels when available */
-+        if (mPgReqs.terminals[terminalIndex].kernelOrder) {
-+            kernelId = mPgReqs.terminals[terminalIndex].kernelOrder[kernelIndex++].id;
-+            CheckError(kernelId >= PSYS_MAX_KERNELS_PER_PG, css_err_internal,
-+                "%s: Kernel bitmap for terminal %d covers more kernels than in manifest",
-+                __func__, terminalIndex);
-+        } else {
-+            kernelId = getKernelIdByBitmap(kernelBitmap);
-+        }
-+
-+        switch (mPgReqs.terminals[terminalIndex].type) {
-+            case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+                ret = ia_p2p_param_out_terminal_decode(
-+                        mP2pHandle,
-+                        mPgId,
-+                        kernelId,
-+                        mFragmentCount,
-+                        reinterpret_cast<ia_css_param_terminal_t*>(terminal),
-+                        currentSection,
-+                        mPgReqs.terminals[terminalIndex].sectionCount,
-+                        reinterpret_cast<unsigned char*>(payload.data),
-+                        payload.size);
-+                currentSection += mKernel.mSections[kernelId].param_out_section_count_per_fragment;
-+                break;
-+            case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+                ret = ia_p2p_spatial_param_out_terminal_decode_v2(
-+                        mP2pHandle,
-+                        mPgId,
-+                        kernelId,
-+                        mFragmentCount,
-+                        (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                                         : mFragmentDesc),
-+                        reinterpret_cast<ia_css_spatial_param_terminal_t*>(terminal),
-+                        currentSection,
-+                        (unsigned char*)payload.data,
-+                        payload.size,
-+                        mP2pCacheBuffer.data);
-+                currentSection += mKernel.mSections[kernelId].spatial_param_out_section_count;
-+                break;
-+            default:
-+                LOGE("%s: terminal type %d decode not implemented",
-+                    __func__, mPgReqs.terminals[terminalIndex].type);
-+                return UNKNOWN_ERROR;
-+        }
-+
-+        CheckError(ret != ia_err_none, ret, "%s: failed to decode terminal %d",
-+                   __func__, terminalIndex);
-+        kernelBitmap = ia_css_kernel_bitmap_unset(kernelBitmap, kernelId);
-+    }
-+
-+    return ret;
-+}
-+
-+int IntelPGParam::serializeDecodeCache(ia_binary_data* result) {
-+    CheckError(!result, UNKNOWN_ERROR, "The statistics buffer is nullptr");
-+
-+    ia_err ia_ret = ia_p2p_serialize_statistics(mP2pHandle, result, nullptr);
-+    CheckError(ia_ret != ia_err_none, UNKNOWN_ERROR, "Serializ statistics fail");
-+
-+    return OK;
-+}
-+
-+void IntelPGParam::deinit() {
-+    ia_p2p_deinit(mP2pHandle);
-+    if (mP2pCacheBuffer.data) {
-+        IA_CIPR_FREE(mP2pCacheBuffer.data);
-+    }
-+}
-+
-+int IntelPGParam::getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap) {
-+    int kernelId = 0;
-+    CheckError(ia_css_is_kernel_bitmap_empty(bitmap), BAD_VALUE, "The bitmap is empty");
-+    while (!ia_css_is_kernel_bitmap_set(bitmap, (unsigned int)kernelId)) {
-+        kernelId++;
-+    }
-+
-+    return kernelId;
-+}
-+
-+ia_css_kernel_bitmap_t
-+IntelPGParam::getCachedTerminalKernelBitmap(ia_css_param_terminal_manifest_t* manifest) {
-+    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
-+    unsigned int section, sectionCount;
-+
-+    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
-+    sectionCount = manifest->param_manifest_section_desc_count;
-+    for (section = 0; section < sectionCount; section++) {
-+        ia_css_param_manifest_section_desc_t* desc =
-+                               ia_css_param_terminal_manifest_get_prm_sct_desc(manifest, section);
-+        CheckError(!desc, kernelBitmap, "failed to get desc");
-+        int index = ia_css_param_manifest_section_desc_get_kernel_id(desc);
-+        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
-+    }
-+
-+    return kernelBitmap;
-+}
-+
-+ia_css_kernel_bitmap_t IntelPGParam::getProgramTerminalKernelBitmap(
-+                                                  ia_css_program_terminal_manifest_t* manifest) {
-+    ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
-+    unsigned int section, sectionCount;
-+
-+    /* Loop through all the sections in manifest and put the kernel ids into the kernel bitmap. */
-+    sectionCount = manifest->fragment_param_manifest_section_desc_count;
-+    for (section = 0; section < sectionCount; section++) {
-+        ia_css_fragment_param_manifest_section_desc_t *desc =
-+            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(manifest, section);
-+        CheckError(!desc, kernelBitmap, "failed to get desc");
-+        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc);
-+        kernelBitmap = ia_css_kernel_bitmap_set(kernelBitmap, index);
-+    }
-+
-+    return kernelBitmap;
-+}
-+
-+int IntelPGParam::disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap) {
-+    int ret = OK;
-+    ia_css_terminal_type_t terminalType;
-+    ia_css_kernel_bitmap_t terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
-+    ia_css_kernel_bitmap_t disabledTerminalKernelsBitmap = ia_css_kernel_bitmap_clear();
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        terminalKernelsBitmap = ia_css_kernel_bitmap_clear();
-+        unsigned int payloadSize = mPgReqs.terminals[i].payloadSize;
-+        ia_css_terminal_manifest_t *manifest =
-+                                   ia_css_program_group_manifest_get_term_mnfst(mPgManifest, i);
-+        terminalType = ia_css_terminal_manifest_get_type(manifest);
-+
-+        if (payloadSize == 0) {
-+            switch (terminalType) {
-+                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+                case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT: {
-+                    /* Spatial terminals are only associated to a single kernel. */
-+                    ia_css_spatial_param_terminal_manifest_t* paramMani =
-+                        reinterpret_cast<ia_css_spatial_param_terminal_manifest_t*>(manifest);
-+                    terminalKernelsBitmap = ia_css_kernel_bitmap_set(
-+                            terminalKernelsBitmap, paramMani->kernel_id);
-+                    break;
-+                }
-+                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+                case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT: {
-+                    ia_css_param_terminal_manifest_t* paramMani =
-+                        reinterpret_cast<ia_css_param_terminal_manifest_t*>(manifest);
-+                    terminalKernelsBitmap = getCachedTerminalKernelBitmap(paramMani);
-+                    break;
-+                }
-+                case IA_CSS_TERMINAL_TYPE_PROGRAM: {
-+                    ia_css_program_terminal_manifest_t* proMani =
-+                        reinterpret_cast<ia_css_program_terminal_manifest_t*>(manifest);
-+                        terminalKernelsBitmap = getProgramTerminalKernelBitmap(proMani);
-+                    break;
-+                }
-+                case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+                    LOG1("%s: program control init terminal is always enabled.", __func__);
-+                    break;
-+                default:
-+                    break;
-+            }
-+            disabledTerminalKernelsBitmap =
-+                ia_css_kernel_bitmap_union(disabledTerminalKernelsBitmap, terminalKernelsBitmap);
-+        }
-+    }
-+
-+    *kernelBitmap = ia_css_kernel_bitmap_intersection(*kernelBitmap,
-+                                   ia_css_kernel_bitmap_complement(disabledTerminalKernelsBitmap));
-+    return ret;
-+}
-+
-+css_err_t IntelPGParam::getKernelOrderForParamCachedInTerm(
-+                                              ia_css_param_terminal_manifest_t* terminalManifest,
-+                                              IpuPgTerminalKernelInfo* kernelOrder) {
-+    CheckError((!terminalManifest || !kernelOrder), ia_err_argument, "No manifest or order info");
-+
-+    uint16_t sectionCount = terminalManifest->param_manifest_section_desc_count;
-+    CheckError(sectionCount == 0, css_err_argument, "No static sections in manifest");
-+    uint8_t kernelCount = 0;
-+
-+    for (uint16_t section = 0; section < sectionCount; section++) {
-+        ia_css_param_manifest_section_desc_t* param =
-+            ia_css_param_terminal_manifest_get_prm_sct_desc(terminalManifest, section);
-+        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
-+
-+        /* there is agreement that sections of the same kernel are
-+         * encoded in a row. Here, skipping sections of the same kernel
-+         * based on this assumption.
-+         */
-+        /* info: Indication of the kernel this parameter belongs to,
-+         * may stand for mem_type, region and kernel_id for ipu6
-+         */
-+        int index = ia_css_param_manifest_section_desc_get_kernel_id(param);
-+        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
-+            ++kernelOrder[kernelCount - 1].sections;
-+            kernelOrder[kernelCount - 1].size += param->max_mem_size;
-+            continue;
-+        }
-+        kernelOrder[kernelCount].id = (uint8_t) index;
-+        kernelOrder[kernelCount].sections = 1;
-+        kernelOrder[kernelCount].size = param->max_mem_size;
-+        kernelOrder[kernelCount].initialize = false;
-+        kernelCount++;
-+    }
-+
-+    return css_err_none;
-+}
-+
-+css_err_t IntelPGParam::getKernelOrderForProgramTerm(
-+                                              ia_css_program_terminal_manifest_t* terminalManifest,
-+                                              IpuPgTerminalKernelInfo* kernelOrder) {
-+    CheckError((!terminalManifest || !kernelOrder), css_err_argument, "No manifest or order info");
-+    uint16_t sectionCount = terminalManifest->fragment_param_manifest_section_desc_count;
-+    CheckError(sectionCount == 0, ia_err_internal, "No static sections in manifest");
-+    uint8_t kernelCount = 0;
-+
-+    for (uint16_t section = 0; section < sectionCount; section++) {
-+        ia_css_fragment_param_manifest_section_desc_t* param =
-+            ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(terminalManifest, section);
-+        CheckError(!param, css_err_internal, "Failed to get param from terminal manifest!");
-+
-+        /* there is agreement that sections of the same kernel are
-+         * encoded in a row. Here, skipping sections of the same kernel
-+         * based on this assumption.
-+         */
-+        /* info: Indication of the kernel this parameter belongs to,
-+         * may stand for mem_type, region and kernel_id for ipu6
-+         */
-+        int index = ia_css_fragment_param_manifest_section_desc_get_kernel_id(param);
-+        if (kernelCount > 0 && kernelOrder[kernelCount - 1].id == index) {
-+            ++kernelOrder[kernelCount - 1].sections;
-+            kernelOrder[kernelCount - 1].size += param->max_mem_size;
-+            continue;
-+        }
-+        kernelOrder[kernelCount].id = (uint8_t) index;
-+        kernelOrder[kernelCount].sections = 1;
-+        kernelOrder[kernelCount].size = param->max_mem_size;
-+        kernelOrder[kernelCount].initialize = false;
-+        kernelCount++;
-+    }
-+
-+    return css_err_none;
-+}
-+
-+int8_t IntelPGParam::terminalEnumerateByType(IpuPgRequirements* reqs,
-+                                             ia_css_terminal_type_t terminalType, uint8_t num) {
-+    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
-+
-+    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
-+        if (reqs->terminals[terminal].type == terminalType) {
-+            if (num)
-+                num--;
-+            else
-+                return (int8_t)terminal;
-+        }
-+    }
-+
-+    return -1;
-+}
-+
-+int8_t IntelPGParam::terminalEnumerateByBitmap(IpuPgRequirements* reqs,
-+                                               ia_css_terminal_type_t terminal_type,
-+                                               ia_css_kernel_bitmap_t bitmap) {
-+    CheckError(reqs->terminalCount == 0, -1, "%s: no terminals!", __func__);
-+
-+    for (uint8_t terminal = 0; terminal < reqs->terminalCount; terminal++) {
-+        if (reqs->terminals[terminal].type == terminal_type &&
-+            ia_css_is_kernel_bitmap_equal(reqs->terminals[terminal].kernelBitmap, bitmap)) {
-+            return (int8_t)terminal;
-+        }
-+    }
-+
-+    return -1;
-+}
-+
-+bool IntelPGParam::isKernelIdInKernelOrder(IpuPgRequirements* reqs,
-+                                           int8_t termIndex, int kernelId, uint8_t* orderedIndex) {
-+    /* No kernel order, return true always */
-+    if (!reqs->terminals[termIndex].kernelOrder)
-+        return true;
-+
-+    /* Check if the kernel_id can be found from the kernelOrder */
-+    for (uint8_t i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
-+        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
-+            if (orderedIndex)
-+                *orderedIndex = i;
-+            return true;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+uint32_t IntelPGParam::getKernelCountFromKernelOrder(IpuPgRequirements* reqs,
-+                                                     int8_t termIndex, int kernelId) {
-+    if (!reqs->terminals[termIndex].kernelOrder) {
-+        /* If no kernel order is present, assuming kernel appears once. */
-+        return 1;
-+    }
-+
-+    uint32_t count = 0;
-+    for (int i = 0; i < PSYS_MAX_KERNELS_PER_PG; i++) {
-+        if (reqs->terminals[termIndex].kernelOrder[i].id == kernelId) {
-+            ++count;
-+        }
-+    }
-+
-+    return count;
-+}
-+
-+void IntelPGParam::processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
-+                                                     ia_css_terminal_type_t terminalType,
-+                                                     int kernelId) {
-+    uint32_t kernelCount = getKernelCountFromKernelOrder(reqs, termIndex, kernelId);
-+    uint32_t sectionCount = 0, payloadSize = 0;
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+    uint32_t multiplier = 1;
-+#endif
-+    for (unsigned int i = 0; i < kernelCount; ++i) {
-+        switch (terminalType) {
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+            sectionCount = mKernel.mSections[kernelId].param_in_section_count;
-+            payloadSize = mKernel.mPayloads[kernelId].param_in_payload_size;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+            sectionCount = mKernel.mSections[kernelId].param_out_section_count_per_fragment;
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+            payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size * mFragmentCount;
-+#else
-+            payloadSize = mKernel.mPayloads[kernelId].param_out_payload_size;
-+#endif
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+            sectionCount = mKernel.mSections[kernelId].program_section_count_per_fragment;
-+            payloadSize = mKernel.mPayloads[kernelId].program_payload_size;
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+            multiplier = mFragmentCount;
-+#endif
-+            break;
-+        default:
-+            LOG1("%s: terminal type %d encode not implemented", __func__, terminalType);
-+            break;
-+        }
-+        reqs->terminals[termIndex].sectionCount += sectionCount;
-+
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+        reqs->terminals[termIndex].payloadSize += multiplier * payloadSize;
-+#else
-+        reqs->terminals[termIndex].payloadSize += payloadSize;
-+#endif
-+
-+        mKernel.mPayloadSize = reqs->terminals[termIndex].payloadSize;
-+    }
-+
-+    reqs->terminals[termIndex].kernelBitmap =
-+        ia_css_kernel_bitmap_set(reqs->terminals[termIndex].kernelBitmap, (unsigned int)kernelId);
-+}
-+
-+css_err_t IntelPGParam::payloadSectionSizeSanityTest(ia_p2p_payload_desc* current,
-+                                                     uint16_t kernelId, uint8_t terminalIndex,
-+                                                     uint32_t currentOffset, size_t payloadSize) {
-+    size_t nextPayloadSize = 0;
-+    ia_p2p_payload_desc init = mKernel.mPayloads[kernelId];
-+    /* calculate again the memory requirements for each kernel
-+     * and compare it with what we stored at init time. */
-+    ia_err ia_ret = ia_p2p_get_kernel_payload_desc(
-+            mP2pHandle,
-+            mPgId,
-+            kernelId,
-+#if defined(IPU_SYSVER_IPU6) && defined(UNIFIED_PROG_TERM_FRAG_DESC)
-+            1,
-+#else
-+            mFragmentCount,
-+#endif
-+            (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
-+                             : mFragmentDesc),
-+            current);
-+    CheckError(ia_ret != ia_err_none, css_err_internal,
-+        "Failed to get payload description during sanity check (kernel %d)", kernelId);
-+
-+    switch (mPgReqs.terminals[terminalIndex].type) {
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+        if (current->param_in_payload_size > init.param_in_payload_size) {
-+            LOGW("%s: param-in section size mismatch in pg[%d] kernel[%d]"
-+                               " p2p size %d pg_die size %d",
-+                               __func__,
-+                               mPgId,
-+                               kernelId,
-+                               current->param_in_payload_size,
-+                               init.param_in_payload_size);
-+        } else {
-+            current->param_in_payload_size = init.param_in_payload_size;
-+        }
-+        nextPayloadSize = current->param_in_payload_size;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+        if (current->param_out_payload_size > init.param_out_payload_size) {
-+            LOGW("%s: param-out section size mismatch in pg[%d] kernel[%d]"
-+                               " p2p size %d pg_die size %d",
-+                               __func__,
-+                               mPgId,
-+                               kernelId,
-+                               current->param_out_payload_size,
-+                               init.param_out_payload_size);
-+        } else {
-+            current->param_out_payload_size = init.param_out_payload_size;
-+        }
-+        nextPayloadSize = current->param_out_payload_size;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+        if (current->program_payload_size > init.program_payload_size) {
-+            LOG1("%s: program section size mismatch in pg[%d] kernel[%d]"
-+                               " p2p size %d pg_die size %d",
-+                               __func__,
-+                               mPgId,
-+                               kernelId,
-+                               current->program_payload_size,
-+                               init.program_payload_size);
-+        } else {
-+            current->program_payload_size = init.program_payload_size;
-+        }
-+        nextPayloadSize = current->program_payload_size;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+        if (current->spatial_param_in_payload_size > init.spatial_param_in_payload_size) {
-+            LOGW("%s: spatial-in section size mismatch in pg[%d] kernel[%d]"
-+                           " p2p size %d pg_die size %d",
-+                           __func__,
-+                           mPgId,
-+                           kernelId,
-+                           current->spatial_param_in_payload_size,
-+                           init.spatial_param_in_payload_size);
-+        } else {
-+            current->spatial_param_in_payload_size = init.spatial_param_in_payload_size;
-+        }
-+        nextPayloadSize = current->spatial_param_in_payload_size;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+        if (current->spatial_param_out_payload_size > init.spatial_param_out_payload_size) {
-+            LOGW("%s: spatial-out section size mismatch in pg[%d] kernel[%d]"
-+                           " p2p size %d pg_die size %d",
-+                           __func__,
-+                           mPgId,
-+                           kernelId,
-+                           current->spatial_param_out_payload_size,
-+                           init.spatial_param_out_payload_size);
-+        } else {
-+            current->spatial_param_out_payload_size = init.spatial_param_out_payload_size;
-+        }
-+        nextPayloadSize = current->spatial_param_out_payload_size;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+        /* No check done for frame terminals */
-+        break;
-+    default:
-+        LOGE("%s: terminal type %d payload check not implemented",
-+            __func__, mPgReqs.terminals[terminalIndex].type);
-+        return css_err_argument;
-+    }
-+
-+    CheckError((currentOffset + nextPayloadSize > payloadSize), css_err_nomemory,
-+        "pg %d terminal %d payload size small, encoding for kernel %d will exceed size by %u bytes",
-+        mPgId, terminalIndex, kernelId, currentOffset + nextPayloadSize - payloadSize);
-+    return css_err_none;
-+}
-+
-+void IntelPGParam::dumpFragmentDesc(int fragmentCount) {
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
-+
-+    LOG2("%s: pg %d get frag count %d (new api)", __func__, mPgId, fragmentCount);
-+    for (int kernel = 0; kernel < IA_P2P_MAX_KERNELS_PER_PG; kernel++) {
-+        for (int frag = 0; frag < fragmentCount; frag++) {
-+            LOG2("   kernel %d, frag %d: [%d %d %d %d]", kernel, frag,
-+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_width,
-+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_height,
-+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_x,
-+                 mFragmentConfig->pixel_fragment_descs[kernel][frag].fragment_start_y);
-+        }
-+    }
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
-new file mode 100644
-index 000000000000..0a29400b9807
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.h
-@@ -0,0 +1,247 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+extern "C" {
-+#include <ia_isp_types.h>
-+#include <ia_isp_bxt.h>
-+
-+#include <ia_pal_types_isp_ids_autogen.h>
-+
-+#include <ia_p2p_types.h>
-+#include <ia_p2p.h>
-+
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_terminal.h>
-+#include <ia_css_terminal_types.h>
-+#include <ia_css_terminal_manifest_types.h>
-+
-+#include <pg_control_init_framework.h>
-+}
-+
-+#include <map>
-+#include <memory>
-+#include <vector>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "modules/ia_cipr/include/ia_cipr_psys.h"
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory.h"
-+#include "modules/ia_cipr/include/css_types.h"
-+#include "src/core/psysprocessor/PGUtils.h"
-+
-+namespace icamera {
-+
-+#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
-+
-+/**
-+ * \class IntelPGParam
-+ *
-+ * \brief This is a version P2P implementation which is used to encode parameter terminal
-+ *        and decode statistic terminal for PSYS pipeline.
-+ *
-+ * The call sequence as follows:
-+ * 1. init();
-+ * 2. prepare();
-+ * 3. allocatePGBuffer() (optional);
-+ * 4. setPGAndPrepareProgram();
-+ * 5. allocatePayloads();
-+ * 6. getFragmentDescriptors();
-+ * 7. loop frame {
-+ *      updatePALAndEncode();
-+ *      decode();
-+ *    }
-+ * 8. deinit();
-+ */
-+class IntelPGParam {
-+ public:
-+    explicit IntelPGParam(int pgId);
-+    ~IntelPGParam();
-+
-+    /**
-+     * Use to init and config P2P handle.
-+     */
-+    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
-+
-+    /**
-+     * Query and save the requirement for each terminal, calculate the final kernel bitmap.
-+     */
-+    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
-+                ia_css_kernel_bitmap_t* bitmap);
-+
-+    /**
-+     * Allocate PG buffer for caller
-+     */
-+    void* allocatePGBuffer(int pgSize);
-+
-+    /**
-+     * Accept pg outside and init program_control_init terminal.
-+     */
-+    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
-+
-+    /**
-+     * Allocate payload memory for terminals, and return valid terminals count.
-+     */
-+    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
-+
-+    /**
-+     * Update PAL and encode payload data for all terminals. Will skip inactive terminals.
-+     */
-+    int updatePALAndEncode(const ia_binary_data* ipuParams,
-+                           int payloadCount, ia_binary_data* payloads);
-+
-+    /**
-+     * Decode payload data for all related terminals.
-+     */
-+    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
-+
-+    /**
-+     * Use to deinit P2P handle.
-+     */
-+    void deinit();
-+
-+    /**
-+     * Get fragment descriptors calculated according to PAL data
-+     * Called after prepare().
-+     */
-+    int getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs);
-+
-+    /**
-+     * Get payload size for all terminals, and return valid payloads number.
-+     */
-+    int getPayloadSizes(int payloadCount, ia_binary_data* payloads);
-+
-+ private:
-+    enum FragmentDataTerminalType {
-+        FRAG_TERM_TYPE_INPUT = 0,
-+        FRAG_TERM_TYPE_OUTPUT_START,  // Mapping to data out terminal in order for all postgdc pgs.
-+        FRAG_TERM_TYPE_DISPALY_OUTPUT = FRAG_TERM_TYPE_OUTPUT_START,
-+        FRAG_TERM_TYPE_MAIN_OUTPUT,
-+        FRAG_TERM_TYPE_PP_OUTPUT,
-+        FRAG_TERM_TYPE_COUNT,
-+    };
-+
-+    int mPgId;
-+    int mTerminalCount;
-+    PgFrameDesc mInputMainFrame;
-+    PgFrameDesc mOutputMainFrame;
-+
-+    uint8_t mFragmentCount;
-+    ia_p2p_fragment_desc* mFragmentDesc;
-+    ia_p2p_fragment_configuration_t* mFragmentConfig;
-+                             // for pg fragment with new api:
-+                             // ia_p2p_calculate_fragments_rbm
-+                             // Instead of mFragmentDesc
-+    ia_p2p_handle mP2pHandle;
-+    ia_binary_data mP2pCacheBuffer;
-+
-+    ia_css_program_group_manifest_t* mPgManifest;
-+    std::vector<int> mDisableDataTermials;
-+    ia_css_process_group_t* mProcessGroup;
-+    int mProgramControlInitTerminalIndex;
-+
-+    struct IpuPgTerminalKernelInfo {
-+        IpuPgTerminalKernelInfo() {}
-+        uint8_t  id = 0;
-+        uint8_t  sections = 0;
-+        uint32_t size = 0;
-+        bool     initialize = false;
-+    };
-+
-+    struct IpuPgTerminaRequirements {
-+        IpuPgTerminaRequirements() { kernelBitmap = ia_css_kernel_bitmap_clear(); }
-+        ia_css_terminal_type_t type = IA_CSS_N_TERMINAL_TYPES;
-+        uint32_t payloadSize = 0;
-+        ia_css_kernel_bitmap_t kernelBitmap;
-+        uint32_t sectionCount = 0;
-+        IpuPgTerminalKernelInfo* kernelOrder = nullptr;
-+        ia_p2p_fragment_desc* fragment_descs = nullptr;
-+
-+        // Use for program_control_init
-+        uint32_t userParamSize;
-+        std::unique_ptr<uint8_t[]> userParamAddress;
-+    };
-+
-+    struct IpuPgRequirements {
-+        IpuPgRequirements() {}
-+        uint32_t terminalCount = 0;
-+        IpuPgTerminaRequirements terminals[IPU_MAX_TERMINAL_COUNT];
-+    };
-+
-+    struct KernelRequirement {
-+        KernelRequirement() { mKernelBitmap = ia_css_kernel_bitmap_clear(); }
-+        ia_p2p_terminal_requirements_t mSections[PSYS_MAX_KERNELS_PER_PG];
-+        ia_p2p_payload_desc mPayloads[PSYS_MAX_KERNELS_PER_PG];
-+        int mPayloadSize = 0;
-+        ia_css_kernel_bitmap_t mKernelBitmap;
-+    };
-+
-+    KernelRequirement mKernel;
-+    IpuPgRequirements mPgReqs;
-+
-+    // Allocate them here, for sandboxing case (shared memory)
-+    ia_binary_data __attribute__((aligned(PG_PAGE_SIZE)))mParamPayloads[IPU_MAX_TERMINAL_COUNT];
-+    void* mProcessGroupMemory;
-+
-+ private:
-+    int getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap);
-+    ia_css_kernel_bitmap_t getCachedTerminalKernelBitmap(
-+                                                      ia_css_param_terminal_manifest_t* manifest);
-+    ia_css_kernel_bitmap_t getProgramTerminalKernelBitmap(
-+                                                      ia_css_program_terminal_manifest_t* manifest);
-+    int disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap);
-+    css_err_t getKernelOrderForProgramTerm(ia_css_program_terminal_manifest_t* terminalManifest,
-+                                           IpuPgTerminalKernelInfo* kernelOrder);
-+    css_err_t getKernelOrderForParamCachedInTerm(ia_css_param_terminal_manifest_t* terminalManifest,
-+                                                 IpuPgTerminalKernelInfo* kernelOrder);
-+    int8_t terminalEnumerateByType(IpuPgRequirements* reqs,
-+                                   ia_css_terminal_type_t terminalType,
-+                                   uint8_t num);
-+    int8_t terminalEnumerateByBitmap(IpuPgRequirements* reqs,
-+                                     ia_css_terminal_type_t terminal_type,
-+                                     ia_css_kernel_bitmap_t bitmap);
-+    bool isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex,
-+                                 int kernelId, uint8_t* orderedIndex);
-+    uint32_t getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId);
-+    void processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
-+                                           ia_css_terminal_type_t terminalType, int kernelId);
-+    css_err_t payloadSectionSizeSanityTest(ia_p2p_payload_desc* current,
-+                                           uint16_t kernelId, uint8_t terminalIndex,
-+                                           uint32_t currentOffset, size_t payloadSize);
-+
-+    int calcFragmentDescriptors(int fragmentCount,
-+                                const PgFrameDesc& inputMainFrame,
-+                                const PgFrameDesc& outputMainFrame,
-+                                const ia_css_rbm_t* rbm);
-+
-+    void dumpFragmentDesc(int fragmentCount);
-+    int encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
-+    int decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
-+    int serializeDecodeCache(ia_binary_data* result);
-+
-+    void destroyPayloads();
-+    void destroyPGBuffer();
-+
-+    DISALLOW_COPY_AND_ASSIGN(IntelPGParam);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
-new file mode 100644
-index 000000000000..9645c0f298e7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/StatsTypes.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_aiq_types.h>
-+#include <ia_isp_bxt.h>
-+#include <ia_isp_bxt_types.h>
-+#include <ia_dvs_types.h>
-+#include <ia_bcomp_types.h>
-+#include <ia_isp_bxt_statistics_types.h>
-+
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+#define MAX_EXPOSURES_COUNT 3
-+
-+struct ConvertInputParam {
-+    bool multiExpo;
-+    ia_binary_data *statsBuffer;
-+    camera_resolution_t *dvsReso;
-+    const ia_aiq_ae_results *aeResults;
-+    ia_bcomp_results *bcompResult;
-+};
-+
-+struct ConvertResult {
-+    ia_isp_bxt_statistics_query_results_t *queryResults;
-+    ia_aiq_rgbs_grid *rgbsGrid[MAX_EXPOSURES_COUNT];
-+    ia_aiq_af_grid *afGrid;
-+    ia_dvs_statistics *dvsStats;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
-new file mode 100644
-index 000000000000..a484f42738a7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.cpp
-@@ -0,0 +1,876 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "GraphConfigImpl"
-+
-+#include "modules/algowrapper/graph/GraphConfigImpl.h"
-+
-+#include <graph_query_manager.h>
-+#include <algorithm>
-+#include <unordered_map>
-+#include <GCSSParser.h>
-+
-+#include "FormatUtils.h"
-+#include "GraphUtils.h"
-+#include "iutils/CameraLog.h"
-+
-+using GCSS::GraphQueryManager;
-+using GCSS::ItemUID;
-+using GCSS::GCSSParser;
-+using GCSS::GraphConfigNode;
-+using std::vector;
-+using std::map;
-+using std::string;
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+#define DISPERSED_MAX_OUTPUTS 2
-+
-+Mutex GraphConfigImpl::sLock;
-+std::unordered_map<int32_t, GraphConfigNodes*> GraphConfigImpl::mGraphNode;
-+
-+GraphConfigNodes::GraphConfigNodes() :
-+        mDesc(nullptr),
-+        mSettings(nullptr) {
-+}
-+
-+GraphConfigNodes::~GraphConfigNodes() {
-+    delete mDesc;
-+    delete mSettings;
-+}
-+
-+GraphConfigImpl::GraphConfigImpl() :
-+    mCameraId(-1),
-+    mGraphQueryManager(nullptr),
-+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
-+    mType(COUPLED),
-+    mMcId(-1) {
-+}
-+
-+GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type) :
-+    mCameraId(camId),
-+    mGraphQueryManager(new GraphQueryManager()),
-+    mConfigMode(mode),
-+    mType(type),
-+    mMcId(-1) {
-+    AutoMutex lock(sLock);
-+
-+    GraphConfigNodes *nodes = nullptr;
-+    if (mGraphNode.find(camId) != mGraphNode.end()) {
-+        nodes = mGraphNode[camId];
-+    }
-+    CheckError(!nodes, VOID_VALUE, "Failed to allocate Graph Query Manager");
-+    mGraphQueryManager->setGraphDescriptor(nodes->mDesc);
-+    mGraphQueryManager->setGraphSettings(nodes->mSettings);
-+}
-+
-+GraphConfigImpl::~GraphConfigImpl() {
-+}
-+
-+/**
-+ * Add predefined keys to the map used by the graph config parser.
-+ *
-+ * This method should only be called once.
-+ *
-+ * We do this so that the keys we will use in the queries are already defined
-+ * and we can create the query objects in a more compact way, by using the
-+ * ItemUID initializers.
-+ */
-+void GraphConfigImpl::addCustomKeyMap() {
-+    /**
-+     * Initialize the map with custom specific tags found in the
-+     * Graph Config XML's
-+     */
-+#define GCSS_KEY(key, str) std::make_pair(#str, GCSS_KEY_##key),
-+    map<string, ia_uid> CUSTOM_GRAPH_KEYS = {
-+        #include "custom_gcss_keys.h"
-+    };
-+#undef GCSS_KEY
-+
-+    LOG1("Adding %zu custom specific keys to graph config parser", CUSTOM_GRAPH_KEYS.size());
-+
-+    /*
-+     * add custom specific tags so parser can use them
-+     */
-+    ItemUID::addCustomKeyMap(CUSTOM_GRAPH_KEYS);
-+}
-+
-+/**
-+ * Method to parse the XML graph configurations and settings
-+ *
-+ * Provide the file name with absolute path to this method, and
-+ * save the GraphConfigNodes pointer to static area.
-+ * This method is currently called once per camera
-+ *
-+ * \param[in] graphDescFile: name of the graph descriptor file
-+ * \param[in] settingsFile: name of the graph settings file
-+ */
-+status_t GraphConfigImpl::parse(int cameraId,
-+                                const char *graphDescFile, const char *settingsFile) {
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    GCSSParser parser;
-+    GraphConfigNodes *nodes = new GraphConfigNodes;
-+
-+    parser.parseGCSSXmlFile(graphDescFile, &nodes->mDesc);
-+    if (!nodes->mDesc) {
-+        LOGE("Failed to parse graph descriptor from %s", graphDescFile);
-+        delete nodes;
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    parser.parseGCSSXmlFile(settingsFile, &nodes->mSettings);
-+    if (!nodes->mSettings) {
-+        LOGE("Failed to parse graph settings from %s", settingsFile);
-+        delete nodes;
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    AutoMutex lock(sLock);
-+    // Destory the old item
-+    auto it = mGraphNode.find(cameraId);
-+    if (it != mGraphNode.end()) {
-+        delete it->second;
-+        mGraphNode.erase(it);
-+    }
-+    mGraphNode[cameraId] = nodes;
-+
-+    return OK;
-+}
-+
-+/**
-+ * Method to parse the XML graph configurations and settings
-+ *
-+ * Provide the memory address and size of files to this method,
-+ * and save the GraphConfigNodes pointer to static area.
-+ * This method is currently called once per camera
-+ *
-+ * \param[in] graphDescData: the memory address for graph descriptor
-+ * \param[in] descDataSize: the memory size for graph descriptor
-+ * \param[in] settingsData: the memory address for graph settings
-+ * \param[in] settingsDataSize: the memory size for graph settings
-+ */
-+status_t GraphConfigImpl::parse(int cameraId, char *graphDescData, size_t descDataSize,
-+                                char *settingsData, size_t settingsDataSize) {
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    GCSSParser parser;
-+    GraphConfigNodes *nodes = new GraphConfigNodes;
-+
-+    parser.parseGCSSXmlData(graphDescData, descDataSize, &nodes->mDesc);
-+    if (!nodes->mDesc) {
-+        LOGE("Failed to parse graph descriptor addr: %p, size: %zu", graphDescData, descDataSize);
-+        delete nodes;
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    parser.parseGCSSXmlData(settingsData, settingsDataSize, &nodes->mSettings);
-+    if (!nodes->mSettings) {
-+        LOGE("Failed to parse graph settings addr: %p, size: %zu", settingsData, settingsDataSize);
-+        delete nodes;
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    AutoMutex lock(sLock);
-+    // Destory the old item
-+    auto it = mGraphNode.find(cameraId);
-+    if (it != mGraphNode.end()) {
-+        delete it->second;
-+        mGraphNode.erase(it);
-+    }
-+    mGraphNode[cameraId] = nodes;
-+
-+    return OK;
-+}
-+
-+/*
-+ * Release the graph config nodes of all cameras
-+ */
-+void GraphConfigImpl::releaseGraphNodes() {
-+    AutoMutex lock(sLock);
-+
-+    for (auto &nodes : mGraphNode) {
-+        delete nodes.second;
-+    }
-+    mGraphNode.clear();
-+}
-+
-+/**
-+ * Create the query rule for current stream configuration based
-+ * on stream list and graph setting type.
-+ */
-+status_t GraphConfigImpl::createQueryRule(const vector<HalStream*> &activeStreams) {
-+    mQuery.clear();
-+    mStreamToSinkIdMap.clear();
-+
-+    int videoIndex = 0, stillIndex = 0;
-+    map<GCSS::ItemUID, std::string> videoQuery;
-+    map<GCSS::ItemUID, std::string> stillQuery;
-+    map<HalStream*, uid_t> videoStreamToSinkIdMap;
-+    map<HalStream*, uid_t> stillStreamToSinkIdMap;
-+    vector<AndroidGraphConfigKey> videoStreamKeys =
-+        {GCSS_KEY_VIDEO0, GCSS_KEY_VIDEO1, GCSS_KEY_VIDEO2};
-+    vector<AndroidGraphConfigKey> stillStreamKeys =
-+        {GCSS_KEY_STILL0, GCSS_KEY_STILL1, GCSS_KEY_STILL2};
-+
-+    // Depends on outputs numbers in GC settings
-+    int vOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : videoStreamKeys.size();
-+    int sOutputNum = (mType == DISPERSED) ? DISPERSED_MAX_OUTPUTS : stillStreamKeys.size();
-+    for (auto &stream : activeStreams) {
-+        CheckError(stream->useCase() == USE_CASE_INPUT, UNKNOWN_ERROR,
-+                   "Error: Re-processing not supported with graph config yet.");
-+        /*
-+         * According to the usage to create the query item
-+         */
-+        CheckError(videoIndex >= vOutputNum && stillIndex >= sOutputNum, UNKNOWN_ERROR,
-+                   "%s: no output for new stream! video %d, still %d",
-+                   __func__, videoIndex, stillIndex);
-+        bool isVideo = isVideoStream(stream) ? true : false;
-+        if (videoIndex < vOutputNum) {
-+            isVideo = (isVideo || stillIndex >= sOutputNum);
-+        } else {
-+            isVideo = false;
-+        }
-+        AndroidGraphConfigKey key = (isVideo) ? videoStreamKeys[videoIndex++]
-+                                              : stillStreamKeys[stillIndex++];
-+        map<HalStream*, uid_t> &streamToSinkId =
-+            isVideo ? videoStreamToSinkIdMap : stillStreamToSinkIdMap;
-+        map<GCSS::ItemUID, std::string> &query = isVideo ? videoQuery : stillQuery;
-+        ItemUID w = {key, GCSS_KEY_WIDTH};
-+        ItemUID h = {key, GCSS_KEY_HEIGHT};
-+
-+        query[w] = std::to_string(stream->width());
-+        query[h] = std::to_string(stream->height());
-+        streamToSinkId[stream] = key;
-+        LOG1("Adding stream %p to map %s", stream, ItemUID::key2str(key));
-+    }
-+
-+    if (mType == COUPLED) {
-+        LOG2("Merge the query rule if graph settings type is COUPLED");
-+        /*
-+         * In this case(graph settings type is COUPLED), we need to merge still and
-+         * video together, so there is only one item in mQuery and mStreamToSinkIdMap
-+         * and it is used for both still and video pipe
-+         */
-+
-+        // Merge the query rule
-+        for (auto &still : stillQuery) {
-+            videoQuery.insert(still);
-+        }
-+
-+        // Merge the stream to sink key map
-+        for (auto &stillKey : stillStreamToSinkIdMap) {
-+            videoStreamToSinkIdMap.insert(stillKey);
-+        }
-+
-+        /*
-+         * Add to the query the number of active outputs
-+         * The number of active outputs is video + still
-+         */
-+        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
-+        videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
-+
-+        int useCase = videoQuery.empty() ? 0 : USE_CASE_VIDEO;
-+        useCase |= stillQuery.empty() ? 0 : USE_CASE_STILL_CAPTURE;
-+        mQuery[useCase] = videoQuery;
-+        dumpQuery(useCase, mQuery[useCase]);
-+        mStreamToSinkIdMap[useCase] = videoStreamToSinkIdMap;
-+    } else {
-+        LOG2("Fill each query rule if graph settings type is DISPERSED");
-+        /*
-+         * In this case(graph settings type is DISPERSED), the query item for still
-+         * and video is dispersed, so there are two items in mQuery and mStreamToSinkIdMap
-+         * one is for still pipe and the other is for video pipe
-+         */
-+        ItemUID streamCount = {GCSS_KEY_ACTIVE_OUTPUTS};
-+
-+        // Add active outputs for video
-+        if (!videoStreamToSinkIdMap.empty()) {
-+            LOG2("The video output number: %zu", videoStreamToSinkIdMap.size());
-+            videoQuery[streamCount] = std::to_string(videoStreamToSinkIdMap.size());
-+            mQuery[USE_CASE_VIDEO] = videoQuery;
-+            dumpQuery(USE_CASE_VIDEO, mQuery[USE_CASE_VIDEO]);
-+            mStreamToSinkIdMap[USE_CASE_VIDEO] = videoStreamToSinkIdMap;
-+        }
-+
-+        // Add active outputs for still
-+        if (!stillStreamToSinkIdMap.empty()) {
-+            LOG2("The still output number: %zu", stillStreamToSinkIdMap.size());
-+            stillQuery[streamCount] = std::to_string(stillStreamToSinkIdMap.size());
-+            mQuery[USE_CASE_STILL_CAPTURE] = stillQuery;
-+            dumpQuery(USE_CASE_STILL_CAPTURE, mQuery[USE_CASE_STILL_CAPTURE]);
-+            mStreamToSinkIdMap[USE_CASE_STILL_CAPTURE] = stillStreamToSinkIdMap;
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getRawInputSize(GCSS::IGraphConfig *query, camera_resolution_t *reso) {
-+    CheckError(!reso, UNKNOWN_ERROR, "%s, The reso is nullptr", __func__);
-+    GCSS::IGraphConfig *result = nullptr;
-+    css_err_t ret = mGraphQueryManager->createGraph(query, &result);
-+    if (ret != css_err_none) {
-+        delete result;
-+        return UNKNOWN_ERROR;
-+    }
-+    CheckError(!result, UNKNOWN_ERROR, "%s, Failed to create the graph", __func__);
-+
-+    vector<string> isysOutput = {
-+        "csi_be:output",
-+        "csi_be_soc:output"
-+    };
-+    for (auto &item : isysOutput) {
-+        GCSS::IGraphConfig *isysNode = result->getDescendantByString(item.c_str());
-+        if (isysNode != nullptr) {
-+            GCSS::GraphCameraUtil::getDimensions(isysNode, &(reso->width), &(reso->height));
-+            return OK;
-+        }
-+    }
-+
-+    LOGE("Error: Couldn't get the resolution in isys output");
-+    return UNKNOWN_ERROR;
-+}
-+
-+/*
-+ * According to the stream list to query graph setting and create GraphConfigPipe
-+ */
-+status_t GraphConfigImpl::configStreams(const vector<HalStream*> &activeStreams) {
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    status_t ret = createQueryRule(activeStreams);
-+    CheckError(ret != OK, ret, "Failed to create the query rule");
-+
-+    mQueryResult.clear();
-+    map<int, vector<GCSS::IGraphConfig*> > useCaseToQueryResults;
-+
-+    LOG2("The mQuery size: %zu", mQuery.size());
-+    for (auto &query : mQuery) {
-+        mFirstQueryResults.clear();
-+        dumpQuery(query.first, query.second);
-+        mGraphQueryManager->queryGraphs(query.second, mFirstQueryResults);
-+        CheckError(mFirstQueryResults.empty(), BAD_VALUE,
-+                   "Failed to query the result, please check the settings xml");
-+
-+        // select setting from multiple results
-+        ret = selectSetting(query.first, &useCaseToQueryResults);
-+        CheckError(ret != OK, BAD_VALUE,
-+                   "Failed to select the settings for ConfigMode (0x%x)in results", mConfigMode);
-+    }
-+
-+    CheckError(useCaseToQueryResults.empty(), UNKNOWN_ERROR,
-+               "%s, There isn't matched result after filtering with first query rule", __func__);
-+    // Filter the results with same isys output if there are
-+    // multiple items in useCaseToQueryResults map
-+    if (useCaseToQueryResults.size() > 1) {
-+        ret = OK;
-+        bool matchFound = false;
-+
-+        vector<GCSS::IGraphConfig*> &videoQueryResults =
-+            useCaseToQueryResults.at(USE_CASE_VIDEO);
-+        vector<GCSS::IGraphConfig*> &stillQueryResults =
-+            useCaseToQueryResults.at(USE_CASE_STILL_CAPTURE);
-+        CheckError(videoQueryResults.empty() || stillQueryResults.empty(),
-+                   UNKNOWN_ERROR, "%s, the still or video query results is empty", __func__);
-+
-+        // Filter the video and still query results with same isys ouput resolution.
-+        for (auto &video : videoQueryResults) {
-+            camera_resolution_t videoReso;
-+            ret = getRawInputSize(video, &videoReso);
-+            CheckError(ret != OK, UNKNOWN_ERROR,
-+                       "%s, Failed to get csi ouput resolution for video pipe", __func__);
-+            LOG2("Isys output resolution of video pipe: %dx%d", videoReso.width, videoReso.height);
-+
-+            for (auto &still : stillQueryResults) {
-+                camera_resolution_t stillReso;
-+                ret = getRawInputSize(still, &stillReso);
-+                CheckError(ret != OK, UNKNOWN_ERROR,
-+                           "%s, Failed to get csi ouput resolution for still pipe", __func__);
-+                LOG2("Isys output resolution for still pipe: %dx%d",
-+                     stillReso.width, stillReso.height);
-+
-+                if (videoReso.width == stillReso.width && videoReso.height == stillReso.height) {
-+                    matchFound = true;
-+                    mQueryResult[USE_CASE_VIDEO] = video;
-+                    mQueryResult[USE_CASE_STILL_CAPTURE] = still;
-+                    break;
-+                }
-+            }
-+            if (matchFound)
-+                break;
-+        }
-+
-+        CheckError(!matchFound, UNKNOWN_ERROR,
-+                   "%s, Failed to find the isys ouput for video and still pipe", __func__);
-+    } else {
-+        // Use the query result with smallest isys output if there is only video pipe
-+        int resultIdx = 0;
-+        if (useCaseToQueryResults.begin()->first == USE_CASE_VIDEO) {
-+            camera_resolution_t resultReso;
-+            getRawInputSize((useCaseToQueryResults.begin()->second)[0], &resultReso);
-+            for (size_t idx = 0; idx < (useCaseToQueryResults.begin()->second).size(); idx++) {
-+                camera_resolution_t reso;
-+                getRawInputSize((useCaseToQueryResults.begin()->second)[idx], &reso);
-+                if (resultReso.width > reso.width && resultReso.height > reso.height) {
-+                    resultIdx = idx;
-+                    resultReso = reso;
-+                }
-+            }
-+        }
-+        mQueryResult[useCaseToQueryResults.begin()->first] =
-+            useCaseToQueryResults.begin()->second[resultIdx];
-+    }
-+    CheckError(mQueryResult.empty(), UNKNOWN_ERROR,
-+               "%s, Failed to fill the map into mQueryResult", __func__);
-+
-+    int key = -1;
-+    string mcId, opMode;
-+    mQueryResult.begin()->second->getValue(GCSS_KEY_KEY, key);
-+    mQueryResult.begin()->second->getValue(GCSS_KEY_MC_ID, mcId);
-+    mQueryResult.begin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
-+    LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s",
-+         mCameraId, mQueryResult.begin()->first, key, opMode.c_str());
-+
-+    if (mQueryResult.size() > 1) {
-+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_KEY, key);
-+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_MC_ID, mcId);
-+        mQueryResult.rbegin()->second->getValue(GCSS_KEY_OP_MODE, opMode);
-+        LOG1("CAM[%d]Graph config for pipe: %d SUCCESS, settings id %d, operation mode: %s",
-+             mCameraId, mQueryResult.rbegin()->first, key, opMode.c_str());
-+    }
-+    mMcId = mcId.empty() ? -1 : stoi(mcId);
-+    ret = prepareGraphConfig();
-+    CheckError(ret != OK, ret,
-+               "%s, Failed to prepare graph config: real ConfigMode: %x", __func__, mConfigMode);
-+
-+    return OK;
-+}
-+
-+/**
-+ * Prepare graph config object
-+ *
-+ * Use graph query results as a parameter to getGraph. The result will be given
-+ * to graph config object.
-+ */
-+status_t GraphConfigImpl::prepareGraphConfig() {
-+    status_t status = OK;
-+    mGraphConfigPipe.clear();
-+
-+    for (auto &query : mQueryResult) {
-+        shared_ptr<GraphConfigPipe> graphConfigPipe =
-+                    std::make_shared<GraphConfigPipe>(query.first);
-+        GCSS::IGraphConfig *result = nullptr;
-+        css_err_t ret = mGraphQueryManager->createGraph(query.second, &result);
-+        if (ret != css_err_none) {
-+            delete result;
-+            return UNKNOWN_ERROR;
-+        }
-+        status = graphConfigPipe->prepare(static_cast<GraphConfigNode*>(result),
-+                                          mStreamToSinkIdMap[query.first]);
-+        if (status != OK) {
-+            delete result;
-+            LOGE("Failed to prepare the GraphConfigPipe for pipe: %d", query.first);
-+            return UNKNOWN_ERROR;
-+        }
-+        mGraphConfigPipe[query.first] = graphConfigPipe;
-+        LOG1("Graph config object prepared");
-+    }
-+
-+    return OK;
-+}
-+
-+/*
-+ * Do the secondary filter: configMode and stream format.
-+ */
-+status_t GraphConfigImpl::selectSetting(
-+             int useCase,
-+             std::map<int, std::vector<GCSS::IGraphConfig*> > *queryResults) {
-+    CheckError(!queryResults, UNKNOWN_ERROR, "%s, The queryResults is nullptr", __func__);
-+    string opMode;
-+    vector<GCSS::IGraphConfig*> internalQueryResults;
-+
-+    // Firstly, filter the config mode
-+    for (auto &result : mFirstQueryResults) {
-+        vector<ConfigMode> cfgModes;
-+        result->getValue(GCSS_KEY_OP_MODE, opMode);
-+        LOG1("The operation mode str in xml: %s", opMode.c_str());
-+
-+        CameraUtils::getConfigModeFromString(opMode, cfgModes);
-+        LOG1("The query results supports configModes size: %zu", cfgModes.size());
-+
-+        for (const auto mode : cfgModes) {
-+            if (mConfigMode == mode) {
-+                internalQueryResults.push_back(result);
-+                break;
-+            }
-+        }
-+    }
-+    CheckError(internalQueryResults.size() == 0,
-+               UNKNOWN_ERROR, "Failed to query the results for configMode: %d", mConfigMode);
-+
-+    /*
-+     * May still have multiple graphs after config mode parsing
-+     * Those graphs have same resolution/configMode, but different output formats
-+     * Do second graph query with format/bpp as query condition
-+     */
-+    map<HalStream*, uid_t> &streamToSinkIdMap = mStreamToSinkIdMap[useCase];
-+    vector<GCSS::IGraphConfig*> secondQueryResults;
-+    if (internalQueryResults.size() > 1) {
-+        map<GCSS::ItemUID, std::string> queryItem;
-+        for (auto const& item : streamToSinkIdMap) {
-+            HalStream *s = item.first;
-+            ItemUID formatKey = {(ia_uid)item.second, GCSS_KEY_FORMAT};
-+            string fmt = graphconfig::utils::format2string(s->format());
-+            queryItem[formatKey] = fmt;
-+        }
-+
-+        LOG1("dumpQuery with format condition");
-+        dumpQuery(useCase, queryItem);
-+
-+        /*
-+         * Note: In some projects, there isn't format item in graph setting,
-+         * So the result of this query may be empty, and ignore it.
-+         */
-+        mGraphQueryManager->queryGraphs(queryItem, internalQueryResults, secondQueryResults);
-+        LOG2("The query results size: %zu after filtering format", secondQueryResults.size());
-+    }
-+
-+    // Firstly, select the results with fully filtering
-+    if (secondQueryResults.size() > 0) {
-+        (*queryResults)[useCase] = secondQueryResults;
-+    } else {
-+       (*queryResults)[useCase] = internalQueryResults;
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData *data) {
-+    // The graph id, csi output and sensor mode must be same if there are two graph config pipes
-+    data->graphId = mGraphConfigPipe.begin()->second->getGraphId();
-+    mGraphConfigPipe.begin()->second->getCSIOutputResolution(&(data->csiReso));
-+
-+    data->mcId = mMcId;
-+    getGdcKernelSetting(&(data->gdcKernelId), &(data->gdcReso));
-+
-+    int ret = getPgNames(&(data->pgNames));
-+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get pg names", __func__);
-+    for (auto &pgName : data->pgNames) {
-+        IGraphType::PgInfo info;
-+        info.pgName = pgName;
-+        info.streamId = getStreamIdByPgName(pgName);
-+        info.pgId = getPgIdByPgName(pgName);
-+        getPgRbmValue(pgName, &info.rbmValue);
-+        data->pgInfo.push_back(info);
-+    }
-+
-+    ret = graphGetStreamIds(&(data->streamIds));
-+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get streamIds", __func__);
-+    for (auto &streamId : data->streamIds) {
-+        IGraphType::MbrInfo mBr;
-+        mBr.streamId = streamId;
-+        getMBRData(streamId, &mBr.data);
-+        data->mbrInfo.push_back(mBr);
-+
-+        IGraphType::ProgramGroupInfo info;
-+        info.streamId = streamId;
-+        info.pgPtr = getProgramGroup(streamId);
-+        data->programGroup.push_back(info);
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getGdcKernelSetting(uint32_t *kernelId,
-+                                              camera_resolution_t *resolution) {
-+    CheckError(mGraphConfigPipe.empty(), UNKNOWN_ERROR,
-+               "%s, the mGraphConfigPipe is empty", __func__);
-+    CheckError(!kernelId || !resolution, UNKNOWN_ERROR,
-+               "%s, the kernelId or resolution is nullptr", __func__);
-+
-+    int ret = OK;
-+    if (mGraphConfigPipe.size() == 1) {
-+        ret = mGraphConfigPipe.begin()->second->getGdcKernelSetting(kernelId, resolution);
-+    } else {
-+        // Get the information from video pipe firstly
-+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+        ret = videoGraphPipe->getGdcKernelSetting(kernelId, resolution);
-+        if (ret != OK) {
-+            shared_ptr<GraphConfigPipe> &stillGraphPipe =
-+                mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+            ret = stillGraphPipe->getGdcKernelSetting(kernelId, resolution);
-+        }
-+    }
-+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, NO GDC resolution found in all pipes", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::graphGetStreamIds(std::vector<int32_t> *streamIds) {
-+    CheckError(mGraphConfigPipe.empty(),
-+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
-+    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        mGraphConfigPipe.begin()->second->graphGetStreamIds(streamIds);
-+    } else {
-+        vector<int32_t> stillStreamIds;
-+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+        shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+
-+        videoGraphPipe->graphGetStreamIds(streamIds);
-+        stillGraphPipe->graphGetStreamIds(&stillStreamIds);
-+
-+        for (auto &id : stillStreamIds) {
-+            if (std::find(streamIds->begin(), streamIds->end(), id) == streamIds->end())
-+                streamIds->push_back(id);
-+        }
-+    }
-+
-+    CheckError(streamIds->empty(), UNKNOWN_ERROR,
-+               "%s, Failed to find any streamIds for all pipes", __func__);
-+
-+    return OK;
-+}
-+
-+int GraphConfigImpl::getStreamIdByPgName(std::string pgName) {
-+    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    int streamId = -1;
-+    for (auto &pipe : mGraphConfigPipe) {
-+        streamId = pipe.second->getStreamIdByPgName(pgName);
-+        if (streamId != -1)
-+            break;
-+    }
-+    return streamId;
-+}
-+
-+int GraphConfigImpl::getPgIdByPgName(std::string pgName) {
-+    CheckError(mGraphConfigPipe.empty(), -1, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    int pgId = -1;
-+    for (auto &pipe : mGraphConfigPipe) {
-+        pgId = pipe.second->getPgIdByPgName(pgName);
-+        if (pgId != -1)
-+            break;
-+    }
-+    return pgId;
-+}
-+
-+ia_isp_bxt_program_group* GraphConfigImpl::getProgramGroup(int32_t streamId) {
-+    CheckError(mGraphConfigPipe.empty(), nullptr, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        return mGraphConfigPipe.begin()->second->getProgramGroup(streamId);
-+    }
-+
-+    // Find the streamd id from video graph pipe firstly
-+    vector<int32_t> streamIds;
-+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+    videoGraphPipe->graphGetStreamIds(&streamIds);
-+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
-+        return videoGraphPipe->getProgramGroup(streamId);
-+    }
-+
-+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+    return stillGraphPipe->getProgramGroup(streamId);
-+}
-+
-+int GraphConfigImpl::getProgramGroup(std::string pgName,
-+                                     ia_isp_bxt_program_group* programGroupForPG) {
-+    for (auto &graph : mGraphConfigPipe) {
-+        vector<string> pgNames;
-+        graph.second->getPgNames(&pgNames);
-+        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
-+            return graph.second->getProgramGroup(pgName, programGroupForPG);
-+        }
-+    }
-+
-+    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
-+    return UNKNOWN_ERROR;
-+}
-+
-+status_t GraphConfigImpl::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
-+    CheckError(mGraphConfigPipe.empty(),
-+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        return mGraphConfigPipe.begin()->second->getMBRData(streamId, data);
-+    }
-+
-+    // Find the streamd id from video graph pipe firstly
-+    vector<int32_t> streamIds;
-+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+    videoGraphPipe->graphGetStreamIds(&streamIds);
-+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end()) {
-+        return videoGraphPipe->getMBRData(streamId, data);
-+    }
-+
-+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+    return stillGraphPipe->getMBRData(streamId, data);
-+}
-+
-+status_t GraphConfigImpl::getPgNames(std::vector<std::string>* pgNames) {
-+    CheckError(mGraphConfigPipe.empty(),
-+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        mGraphConfigPipe.begin()->second->getPgNames(pgNames);
-+    } else {
-+        vector<string> stillPgNames;
-+        shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+        shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+
-+        videoGraphPipe->getPgNames(pgNames);
-+        stillGraphPipe->getPgNames(&stillPgNames);
-+
-+        for (auto &pg : stillPgNames) {
-+            if (std::find(pgNames->begin(), pgNames->end(), pg.c_str()) == pgNames->end())
-+                pgNames->push_back(pg);
-+        }
-+    }
-+
-+    CheckError(pgNames->empty(), UNKNOWN_ERROR,
-+               "%s, Failed to get the PG's name for all pipes", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::pipelineGetConnections(
-+                              const std::vector<std::string> &pgList,
-+                              std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+                              std::vector<IGraphType::PipelineConnection> *confVector) {
-+    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
-+    CheckError(mGraphConfigPipe.empty(),
-+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        return mGraphConfigPipe.begin()->second->pipelineGetConnections(pgList,
-+                                                                        scalerInfo, confVector);
-+    }
-+
-+    vector<IGraphType::PipelineConnection> stillConnVector, videoConnVector;
-+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+
-+    std::vector<IGraphType::ScalerInfo> stillScalerInfo, videoScalerInfo;
-+    int ret = videoGraphPipe->pipelineGetConnections(pgList, &videoScalerInfo, &videoConnVector);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from video pipe");
-+    ret = stillGraphPipe->pipelineGetConnections(pgList, &stillScalerInfo, &stillConnVector);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the connetction from still pipe");
-+
-+    LOG2("The connetction in video: %zu, in still: %zu; the scalera in video: %zu, in still: %uz",
-+         videoConnVector.size(), stillConnVector.size(),
-+         videoScalerInfo.size(), stillScalerInfo.size());
-+
-+    if (!stillScalerInfo.empty()) {
-+        for (auto &stillScaler : stillScalerInfo) {
-+            videoScalerInfo.push_back(stillScaler);
-+        }
-+    }
-+    *scalerInfo = videoScalerInfo;
-+
-+    if (videoConnVector.empty()) {
-+        videoConnVector = stillConnVector;
-+    } else {
-+        if (stillConnVector.size() > 0) {
-+            LOG1("Need to merge the two connetction vector: %zu", stillConnVector.size());
-+        }
-+        for (auto &stillConn : stillConnVector) {
-+            bool sameTerminalId = false;
-+            for (auto &conn : videoConnVector) {
-+                if (conn.portFormatSettings.terminalId ==
-+                    stillConn.portFormatSettings.terminalId) {
-+                    sameTerminalId = true;
-+                    if (conn.portFormatSettings.enabled == 0 &&
-+                        stillConn.portFormatSettings.enabled == 1)
-+                        conn = stillConn;
-+                    break;
-+                }
-+            }
-+            if (!sameTerminalId)
-+                videoConnVector.push_back(stillConn);
-+        }
-+    }
-+    CheckError(videoConnVector.empty(), UNKNOWN_ERROR,
-+               "%s, Failed to get connetctions from graph config pipe", __func__);
-+
-+    LOG2("dump the final connetction");
-+    GraphUtils::dumpConnections(videoConnVector);
-+    *confVector = videoConnVector;
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId,
-+                                           const int32_t kernelId, int32_t *pgId) {
-+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
-+    CheckError(mGraphConfigPipe.empty(),
-+               UNKNOWN_ERROR, "%s, the mGraphConfigPipe is empty", __func__);
-+
-+    if (mGraphConfigPipe.size() == 1) {
-+        return mGraphConfigPipe.begin()->second->getPgIdForKernel(streamId, kernelId, pgId);
-+    }
-+
-+    vector<int32_t> streamIds;
-+    shared_ptr<GraphConfigPipe> &videoGraphPipe = mGraphConfigPipe.at(USE_CASE_VIDEO);
-+    videoGraphPipe->graphGetStreamIds(&streamIds);
-+    if (std::find(streamIds.begin(), streamIds.end(), streamId) != streamIds.end())
-+        return videoGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
-+
-+    shared_ptr<GraphConfigPipe> &stillGraphPipe = mGraphConfigPipe.at(USE_CASE_STILL_CAPTURE);
-+    return stillGraphPipe->getPgIdForKernel(streamId, kernelId, pgId);
-+}
-+
-+status_t GraphConfigImpl::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
-+    for (auto &graph : mGraphConfigPipe) {
-+        vector<string> pgNames;
-+        graph.second->getPgNames(&pgNames);
-+        if (std::find(pgNames.begin(), pgNames.end(), pgName) != pgNames.end()) {
-+            return graph.second->getPgRbmValue(pgName, stageAttr);
-+        }
-+    }
-+
-+    LOGE("There isn't this pg: %s in all graph config pipes", pgName.c_str());
-+    return UNKNOWN_ERROR;
-+}
-+
-+/******************************************************************************
-+ *  HELPER METHODS
-+ ******************************************************************************/
-+/**
-+ * Check the gralloc hint flags and decide whether this stream should be served
-+ * by Video Pipe or Still Pipe
-+ */
-+bool GraphConfigImpl::isVideoStream(HalStream *stream) {
-+    if (stream->useCase() == USE_CASE_PREVIEW || stream->useCase() == USE_CASE_VIDEO)
-+        return true;
-+
-+    return false;
-+}
-+
-+void GraphConfigImpl::dumpQuery(int useCase, const map<GCSS::ItemUID, std::string> &query) {
-+    map<GCSS::ItemUID, std::string>::const_iterator it;
-+    it = query.begin();
-+    LOG1("Query Dump --- %d --- Start", useCase);
-+    for ( ; it != query.end(); ++it) {
-+        LOG1("item: %s value %s", it->first.toString().c_str(),
-+                                  it->second.c_str());
-+    }
-+    LOG1("Query Dump --- %d --- End", useCase);
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
-new file mode 100644
-index 000000000000..bcd878b25830
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
-@@ -0,0 +1,185 @@
-+/*
-+ * Copyright (C) 2015-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <gcss.h>
-+
-+#include <map>
-+#include <string>
-+#include <memory>
-+#include <utility>
-+#include <vector>
-+#include <unordered_map>
-+
-+#include "HalStream.h"
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Thread.h"
-+#include "modules/algowrapper/graph/GraphConfigPipe.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \enum AndroidGraphConfigKey
-+ * List of keys that are Android Specific used in queries of settings by
-+ * the GraphConfigImpl.
-+ *
-+ * The enum should not overlap with the enum of tags already predefined by the
-+ * parser, hence the initial offset.
-+ */
-+#define GCSS_KEY(key, str) GCSS_KEY_##key,
-+enum AndroidGraphConfigKey {
-+    GCSS_ANDROID_KEY_START = GCSS_KEY_START_CUSTOM_KEYS,
-+    #include "custom_gcss_keys.h"
-+};
-+#undef GCSS_KEY
-+
-+/**
-+ * Static data for graph settings for given sensor. Used to initialize GraphConfigImpl.
-+ */
-+class GraphConfigNodes {
-+ public:
-+    GraphConfigNodes();
-+    ~GraphConfigNodes();
-+
-+ public:
-+    GCSS::IGraphConfig *mDesc;
-+    GCSS::IGraphConfig *mSettings;
-+
-+ private:
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfigNodes);
-+};
-+
-+/**
-+ * \class GraphConfigImpl
-+ *
-+ * Class to wrap over parsing and executing queries on graph settings.
-+ * It creates the query rule based on graph settings type and stream list
-+ * from user. And filter the final result for current stream config.
-+ * It supports COUPLED and DISPERSED
-+ *
-+ * GraphConfigImpl maintains a GraphConfigPipe map table, each item for one
-+ * pipe. And it provides the public APIs to get the useful information which
-+ * builds PSYS pipe.
-+ *
-+ * At camera open, GraphConfigImpl object is created.
-+ * In stream config period, GraphConfigImpl creates the GraphConfigPipe map which is
-+ * current stream configuration. And HAL can get all the necessary information to
-+ * create PSYS pipe.
-+ */
-+class GraphConfigImpl {
-+ public:
-+    GraphConfigImpl();
-+    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
-+    virtual ~GraphConfigImpl();
-+
-+    /*
-+     * Methods for XML parsing for XML parsing
-+     */
-+    void addCustomKeyMap();
-+    status_t parse(int cameraId, const char *graphDescFile, const char *settingsFile);
-+    status_t parse(int cameraId, char *graphDescData, size_t descDataSize,
-+                   char *settingsData, size_t settingsDataSize);
-+    void releaseGraphNodes();
-+
-+    // These public methods called by GraphConfig
-+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
-+    status_t getGraphConfigData(IGraphType::GraphConfigData *data);
-+
-+    int getProgramGroup(std::string pgName,
-+                        ia_isp_bxt_program_group* programGroupForPG);
-+    status_t getPgIdForKernel(const uint32_t streamId,
-+                              const int32_t kernelId, int32_t *pgId);
-+
-+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
-+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+                                    std::vector<IGraphType::PipelineConnection> *confVector);
-+
-+ private:
-+    status_t prepareGraphConfig();
-+    bool isVideoStream(HalStream *stream);
-+    status_t selectSetting(int useCase,
-+                           std::map<int, std::vector<GCSS::IGraphConfig*> > *queryResults);
-+    status_t createQueryRule(const std::vector<HalStream*> &activeStreams);
-+    status_t getRawInputSize(GCSS::IGraphConfig *query, camera_resolution_t *reso);
-+
-+    status_t getGdcKernelSetting(uint32_t *kernelId, camera_resolution_t *resolution);
-+    status_t graphGetStreamIds(std::vector<int32_t> *streamIds);
-+    int getStreamIdByPgName(std::string pgName);
-+    int getPgIdByPgName(std::string pgName);
-+    ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
-+    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
-+    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
-+    status_t getPgNames(std::vector<std::string>* pgNames);
-+
-+    // Debug helper
-+    void dumpQuery(int useCase, const std::map<GCSS::ItemUID, std::string> &query);
-+
-+ private:
-+    static Mutex sLock;
-+    static std::unordered_map<int32_t, GraphConfigNodes*> mGraphNode;
-+    /**
-+     * Pair of ItemUIDs to store the width and height of a stream
-+     * first item is for width, second for height
-+     */
-+    typedef std::pair<GCSS::ItemUID, GCSS::ItemUID> ResolutionItem;
-+
-+    int32_t mCameraId;
-+    std::unique_ptr<GCSS::GraphQueryManager> mGraphQueryManager;
-+    /*
-+     * The query interface uses types that are actually STL maps and vectors
-+     * to avoid the creation/deletion on the stack for every call we
-+     * have them as member variables.
-+     * - The first item of mQuery is stream useCase(VIDEO or STILL),
-+     * - and the second is an query rule map(GCSS_KEY_, VALUE).
-+     */
-+    std::map<int, std::map<GCSS::ItemUID, std::string> >mQuery;
-+
-+    /**
-+     * Map to get the virtual sink id from a client stream pointer.
-+     * The uid is one of the GCSS keys defined for the virtual sinks, like
-+     * GCSS_KEY_VIDEO0 or GCSS_KEY_STILL1
-+     * From that we can derive the name using the id to string methods from
-+     * ItemUID class
-+     *  - The first item is streams useCase(VIDEO or STILL)
-+     *  - and the second is the stream to virtual sink map
-+     */
-+    std::map<int, std::map<HalStream*, uid_t> > mStreamToSinkIdMap;
-+
-+    /*
-+     * This vector is used to store the first query result.
-+     * After that we also need to filter the results with configMode,
-+     * stream format, and matched isys output resolution.
-+     */
-+    std::vector<GCSS::IGraphConfig*> mFirstQueryResults;
-+
-+    // The stream useCase to result map
-+    std::map<int, GCSS::IGraphConfig*> mQueryResult;
-+
-+    // The stream useCase to GraphConfigPipe map
-+    std::map<int, std::shared_ptr<GraphConfigPipe> > mGraphConfigPipe;
-+
-+    ConfigMode mConfigMode;
-+    GraphSettingType mType;
-+    int mMcId;
-+
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
-new file mode 100644
-index 000000000000..81496b34b855
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
-@@ -0,0 +1,2035 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "GraphConfigPipe"
-+
-+#include <v4l2_device.h>
-+
-+#include <gcss.h>
-+#include <gcss_utils.h>
-+#include <ia_pal_types_isp_ids_autogen.h>
-+#include <GCSSParser.h>
-+
-+#include <algorithm>
-+
-+#include "modules/algowrapper/graph/GraphConfigPipe.h"
-+#include "linux/media-bus-format.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "GraphUtils.h"
-+#include "FormatUtils.h"
-+
-+using std::vector;
-+using std::string;
-+using GCSS::GraphConfigNode;
-+namespace gcu = graphconfig::utils;
-+
-+namespace icamera {
-+#define STRINGIFY1(x) #x
-+#define STRINGIFY(x) STRINGIFY1(x)
-+
-+// TODO: Change the format attribute natively as integer attribute
-+#ifndef VIDEO_RECORDING_FORMAT
-+#define VIDEO_RECORDING_FORMAT TILE
-+#endif
-+
-+const char *SENSOR_PORT_NAME = "sensor:port_0";
-+const char *TPG_PORT_NAME = "tpg:port_0";
-+
-+#define DB_KERNEL_SIZE 2
-+#define PPP_KERNEL_SIZE 2
-+#define DS_KERNEL_SIZE 2
-+uint32_t dpKernel[DB_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_dp,
-+                                     ia_pal_uuid_isp_sc_outputscaler_dp_1_1};
-+uint32_t pppKernel[PPP_KERNEL_SIZE] = {ia_pal_uuid_isp_sc_outputscaler_ppp,
-+                                       ia_pal_uuid_isp_sc_outputscaler_ppp_1_1};
-+uint32_t dsKernel[DS_KERNEL_SIZE] = {ia_pal_uuid_isp_b2i_ds_1_0_0,
-+                                     ia_pal_uuid_isp_b2i_ds_1_0_1};
-+
-+GraphConfigPipe::GraphConfigPipe(int pipeUseCase) :
-+        mSettings(nullptr),
-+        mReqId(0),
-+        mMetaEnabled(false),
-+        mSourceType(SRC_NONE),
-+        mPipeUseCase(pipeUseCase) {
-+    mCsiOutput = {0, 0};
-+}
-+
-+GraphConfigPipe::~GraphConfigPipe() {
-+    fullReset();
-+}
-+/*
-+ * Full reset
-+ * This is called whenever we want to reset the whole object. Currently that
-+ * is only, when GraphConfigPipe object is destroyed.
-+ */
-+void GraphConfigPipe::fullReset() {
-+    mSourcePortName.clear();
-+    mSinkPeerPort.clear();
-+    mStreamToSinkIdMap.clear();
-+    delete mSettings;
-+    mSettings = nullptr;
-+    mReqId = 0;
-+    mStream2TuningMap.clear();
-+    mProgramGroup.clear();
-+}
-+/*
-+ * Reset
-+ * This is called per frame
-+ */
-+void GraphConfigPipe::reset(GraphConfigPipe *me) {
-+    if (me != nullptr) {
-+        me->mReqId = 0;
-+    } else {
-+        LOGE("Trying to reset a null GraphConfigPipe - BUG!");
-+    }
-+}
-+
-+const GCSS::IGraphConfig* GraphConfigPipe::getInterface(Node *node) const {
-+    if (!node)
-+        return nullptr;
-+
-+    return node;
-+}
-+
-+const GCSS::IGraphConfig* GraphConfigPipe::getInterface() const {
-+    return mSettings;
-+}
-+
-+int GraphConfigPipe::getGraphId(void) {
-+    int graphId = -1;
-+    int ret = mSettings->getValue(GCSS_KEY_ID, graphId);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get graphId");
-+        return BAD_VALUE;
-+    }
-+
-+    LOGG("%s: graphId %d", __func__, graphId);
-+    return graphId;
-+}
-+
-+/**
-+ * Per frame initialization of graph config.
-+ * Updates request id
-+ * \param[in] reqId
-+ */
-+void GraphConfigPipe::init(int32_t reqId) {
-+    mReqId = reqId;
-+}
-+
-+/**
-+ * Prepare graph config once per stream config.
-+ * \param[in] manager
-+ * \param[in] settings
-+ * \param[in] streamToSinkIdMap
-+ * \param[in] active
-+ */
-+status_t GraphConfigPipe::prepare(Node *settings, const StreamToSinkMap &streamToSinkIdMap) {
-+    mSettings = settings;
-+    status_t ret = OK;
-+
-+    if (settings == nullptr) {
-+        LOGW("Settings is NULL!! - BUG?");
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ret = analyzeSourceType();
-+    if (ret != OK) {
-+        LOGE("Failed to analyze source type");
-+        return ret;
-+    }
-+
-+    ret = getActiveOutputPorts(streamToSinkIdMap);
-+    if (ret != OK) {
-+        LOGE("Failed to get output ports");
-+        return ret;
-+    }
-+    // Options should be updated before kernel list generation
-+    ret = handleDynamicOptions();
-+    if (ret != OK) {
-+        LOGE("Failed to update options");
-+        return ret;
-+    }
-+
-+    const GCSS::IGraphConfig *gcHandle = getInterface(mSettings);
-+    css_err_t status = mGCSSAicUtil.initAicUtils(gcHandle);
-+    if (status != css_err_none) {
-+        LOGE("Failed to generate kernel list");
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    calculateSinkDependencies();
-+    storeTuningModes();
-+    analyzeCSIOutput();
-+
-+    return ret;
-+}
-+
-+/**
-+ * Store the tuning modes for each stream id into a map that can be used on a
-+ * per frame basis.
-+ * This method is executed once per stream configuration.
-+ * The tuning mode is used by AIC to find the correct tuning tables in CPF.
-+ *
-+ */
-+void GraphConfigPipe::storeTuningModes() {
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+    css_err_t ret = css_err_none;
-+    GraphConfigNode *result = nullptr;
-+    int32_t tuningMode = 0;
-+    int32_t streamId = 0;
-+    mStream2TuningMap.clear();
-+
-+    while (it != mSettings->end()) {
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &result);
-+        if (ret == css_err_none) {
-+            ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
-+            if (ret != css_err_none) {
-+                string pgName;
-+                // This should  not fail
-+                ret = result->getValue(GCSS_KEY_NAME, pgName);
-+                LOGW("Failed to find stream id for PG %s", pgName.c_str());
-+                continue;
-+            }
-+            tuningMode = 0;  // default value in case it is not found
-+            ret = result->getValue(GCSS_KEY_TUNING_MODE, tuningMode);
-+            if (ret != css_err_none) {
-+                string pgName;
-+                // This should  not fail
-+                ret = result->getValue(GCSS_KEY_NAME, pgName);
-+                LOG2("There isn't tuning mode for PG %s, defaulting to %d",
-+                      pgName.c_str(), tuningMode);
-+            }
-+            mStream2TuningMap[streamId] =  tuningMode;
-+        }
-+    }
-+}
-+/**
-+ * Retrieve the tuning mode associated with a given stream id.
-+ *
-+ * The tuning mode is defined by IQ-studio and represent and index to different
-+ * set of tuning parameters in the AIQB (a.k.a CPF)
-+ *
-+ * The tuning mode is an input parameter for AIC.
-+ * \param [in] streamId Identifier for the branch (video/still/isa)
-+ * \return tuning mode, if stream id is not found defaults to 0
-+ */
-+int32_t GraphConfigPipe::getTuningMode(int32_t streamId) {
-+    auto item = mStream2TuningMap.find(streamId);
-+    if (item != mStream2TuningMap.end()) {
-+        return item->second;
-+    }
-+    LOGW("Could not find tuning mode for requested stream id %d", streamId);
-+    return 0;
-+}
-+
-+/*
-+ * According to the node, analyze the source type:
-+ * TPG or sensor
-+ */
-+status_t GraphConfigPipe::analyzeSourceType() {
-+    bool hasSensor = false, hasTPG = false;
-+    Node *inputDevNode = nullptr;
-+    css_err_t ret = mSettings->getDescendant(GCSS_KEY_SENSOR, &inputDevNode);
-+    if (ret == css_err_none) {
-+        mSourceType = SRC_SENSOR;
-+        mSourcePortName = SENSOR_PORT_NAME;
-+        hasSensor = true;
-+    } else {
-+        LOG1("No sensor node from the graph");
-+    }
-+
-+    ret = mSettings->getDescendant(GCSS_KEY_TPG, &inputDevNode);
-+    if (ret == css_err_none) {
-+        mSourceType = SRC_TPG;
-+        mSourcePortName = TPG_PORT_NAME;
-+        hasTPG = true;
-+    } else {
-+        LOG1("No TPG node from the graph");
-+    }
-+
-+    if (hasTPG == hasSensor) {
-+        // failed to analyze source type, reset them
-+        mSourceType = SRC_NONE;
-+        mSourcePortName.clear();
-+        LOGE("Error: Both TPG/Sensor exist or none of TPG/Sensor");
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigPipe::analyzeCSIOutput() {
-+    vector<string> csiBeOutput = {
-+        "csi_be:output",
-+        "csi_be_soc:output"
-+    };
-+    for (auto &item : csiBeOutput) {
-+        GCSS::IGraphConfig *csiBeNode =
-+            static_cast<GCSS::IGraphConfig*>(mSettings)->getDescendantByString(item.c_str());
-+        if (csiBeNode != nullptr) {
-+            GCSS::GraphCameraUtil::getDimensions(csiBeNode, &mCsiOutput.width, &mCsiOutput.height);
-+            return OK;
-+        }
-+    }
-+
-+    LOGE("Error: Couldn't get CSI-BE node");
-+    return UNKNOWN_ERROR;
-+}
-+
-+status_t GraphConfigPipe::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
-+     css_err_t ret = mGCSSAicUtil.getMbrData(streamId, data);
-+     if (ret == css_err_none) {
-+         return OK;
-+     } else {
-+         LOG2("fail to getMBRData for stream id:%d", streamId);
-+         return UNKNOWN_ERROR;
-+     }
-+}
-+/**
-+ * Finds the sink nodes and the output port peer. Use streamToSinkIdMap
-+ * since we are intrested only in sinks that serve a stream. Takes an
-+ * internal copy of streamToSinkIdMap to be used later.
-+ *
-+ * \param[in] streamToSinkIdMap to get the virtual sink id from a client stream pointer
-+ * \return OK in case of success.
-+ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
-+ */
-+status_t GraphConfigPipe::getActiveOutputPorts(const StreamToSinkMap &streamToSinkIdMap) {
-+    status_t status = OK;
-+    css_err_t ret = css_err_none;
-+    std::vector<GCSS::IGraphConfig*> sinks;
-+
-+    mStreamToSinkIdMap.clear();
-+    mStreamToSinkIdMap = streamToSinkIdMap;
-+    mSinkPeerPort.clear();
-+
-+    StreamToSinkMap::const_iterator it;
-+    it = streamToSinkIdMap.begin();
-+
-+    for (; it != streamToSinkIdMap.end(); ++it) {
-+        sinks.clear();
-+        status = GCSS::GraphCameraUtil::graphGetSinksByName(GCSS::ItemUID::key2str(it->second),
-+                                                            mSettings, sinks);
-+        if (status != OK || sinks.empty()) {
-+            string sinkName = GCSS::ItemUID::key2str(it->second);
-+            LOGE("Found %zu sinks, expecting 1 for sink %s", sinks.size(),
-+                 sinkName.c_str());
-+            return BAD_VALUE;
-+        }
-+
-+        Node *sink = static_cast<GraphConfigNode*>(sinks[0]);
-+        Node *outputPort = nullptr;
-+
-+        // Get the sinkname for getting the output port
-+        string sinkName;
-+        ret =  sink->getValue(GCSS_KEY_NAME, sinkName);
-+        if (ret != css_err_none) {
-+            LOGE("Failed to get sink name");
-+            return BAD_VALUE;
-+        }
-+        LOG2("sink name %s", sinkName.c_str());
-+
-+        int32_t streamId = -1;
-+        ret = sink->getValue(GCSS_KEY_STREAM_ID, streamId);
-+        if (ret != css_err_none) {
-+            LOGE("Failed to get stream id");
-+            return BAD_VALUE;
-+        }
-+        LOG2("stream id %d", streamId);
-+
-+        outputPort = getOutputPortForSink(sinkName);
-+        if (outputPort == nullptr) {
-+            LOGE("No output port found for sink");
-+            return UNKNOWN_ERROR;
-+        }
-+
-+        LOG2("output port name %s", NODE_NAME(outputPort));
-+        mSinkPeerPort[sink] = outputPort;
-+    }
-+
-+    return OK;
-+}
-+
-+string GraphConfigPipe::getNodeName(Node * node) {
-+    string nodeName("");
-+    if (node == nullptr) {
-+        LOGE("Node is NULL");
-+        return nodeName;
-+    }
-+
-+    node->getValue(GCSS_KEY_NAME, nodeName);
-+    return nodeName;
-+}
-+
-+/**
-+ * Finds the output port which is the peer to the sink node.
-+ *
-+ * Gets root node, and finds the sink with the given name. Use portGetPeer()
-+ * to find the output port.
-+ * \return GraphConfigNode in case of success.
-+ * \return nullptr in case of fail.
-+ */
-+Node *GraphConfigPipe::getOutputPortForSink(const string &sinkName) {
-+    css_err_t ret = css_err_none;
-+    status_t retErr = OK;
-+    Node *rootNode = nullptr;
-+    Node *portNode = nullptr;
-+    Node *peerNode = nullptr;
-+
-+    rootNode = mSettings->getRootNode();
-+    if (rootNode == nullptr) {
-+        LOGE("Couldn't get root node, BUG!");
-+        return nullptr;
-+    }
-+    ret = rootNode->getDescendantByString(sinkName, &portNode);
-+    if (ret != css_err_none) {
-+        LOGE("Error getting sink");
-+        return nullptr;
-+    }
-+    retErr = portGetPeer(portNode, &peerNode);
-+    if (retErr != OK) {
-+        LOGE("Error getting peer");
-+        return nullptr;
-+    }
-+    return peerNode;
-+}
-+
-+/**
-+ * Update the option-list to the graph tree.
-+ * TODO: Add more options.
-+ * \return OK in case of success
-+ * \return UNKNOWN_ERROR if graph update failed.
-+ */
-+status_t GraphConfigPipe::handleDynamicOptions() {
-+    status_t status = setPortFormats();
-+    if (status != OK) {
-+        LOGE("Failed to update metadata");
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    // TODO add other options
-+    return status;
-+}
-+
-+/**
-+ * Returns true if the given node is used to output a video record
-+ * stream. The sink name is found and used to find client stream from the
-+ * mStreamToSinkIdMap.
-+ * Then the video encoder gralloc flag is checked from the stream flags of the
-+ * client stream.
-+ * \param[in] peer output port to find the sink node of.
-+ * \return true if sink port serves a video record stream.
-+ * \return false if sink port does not serve a video record stream.
-+ */
-+bool GraphConfigPipe::isVideoRecordPort(Node *sink) {
-+    css_err_t ret = css_err_none;
-+    string sinkName;
-+    HalStream* clientStream = nullptr;
-+
-+    if (sink == nullptr) {
-+        LOGE("No sink node provided");
-+        return false;
-+    }
-+
-+    ret = sink->getValue(GCSS_KEY_NAME, sinkName);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get sink name");
-+        return false;
-+    }
-+
-+    // Find the client stream for the sink port
-+    StreamToSinkMap::iterator it1;
-+    it1 = mStreamToSinkIdMap.begin();
-+
-+    for (; it1 != mStreamToSinkIdMap.end(); ++it1) {
-+        if (GCSS::ItemUID::key2str(it1->second) == sinkName) {
-+            clientStream = it1->first;
-+            break;
-+        }
-+    }
-+
-+    if (clientStream == nullptr) {
-+        LOGE("Failed to find client stream");
-+        return false;
-+    }
-+
-+    if (clientStream->useCase() == USE_CASE_VIDEO) {
-+        LOG2("%s is video record port", NODE_NAME(sink));
-+        return true;
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * Takes a stream id, and checks if it exists in the graph.
-+ *
-+ * \param[in] streamId
-+ * \return true if found, false otherwise
-+ */
-+bool GraphConfigPipe::hasStreamInGraph(int streamId) {
-+    status_t status;
-+    StreamsVector streamsFound;
-+
-+    status = graphGetStreamIds(&streamsFound);
-+    if (status != OK)
-+        return false;
-+
-+    for (auto id : streamsFound) {
-+        if (id == streamId)
-+            return true;
-+    }
-+    return false;
-+}
-+
-+/**
-+ * Apply the video recording format for the video record stream handling
-+ * output port.
-+ * \return OK in case of success
-+ * \return UNKNOWN_ERROR if option list apply failed.
-+ */
-+status_t GraphConfigPipe::setPortFormats() {
-+    css_err_t ret = css_err_none;
-+    std::map<Node*, Node*>::iterator it;
-+    it = mSinkPeerPort.begin();
-+
-+    for (; it != mSinkPeerPort.end(); ++it) {
-+        Node *sink = it->first;
-+        Node *peer = it->second;
-+        if (!isVideoRecordPort(sink))
-+            continue;
-+
-+        ret = peer->setValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
-+        if (ret != css_err_none) {
-+            // If format attribute does not exist, create it.
-+            ret = peer->addValue(GCSS_KEY_FORMAT, STRINGIFY(VIDEO_RECORDING_FORMAT));
-+            if (ret != css_err_none) {
-+                LOGE("Failed to update options for video record port");
-+                return UNKNOWN_ERROR;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Returns pointer to kernel list based on given stream id
-+ * \param[in] streamId Return kernel list for this stream id
-+ * \return ia_isp_bxt_program_group
-+ */
-+ia_isp_bxt_program_group *GraphConfigPipe::getProgramGroup(int32_t streamId) {
-+    if (mProgramGroup.find(streamId) == mProgramGroup.end()) {
-+        ia_isp_bxt_program_group programGroup;
-+        CLEAR(programGroup);
-+        mGCSSAicUtil.getProgramGroup(streamId, programGroup);
-+        mProgramGroup[streamId] = programGroup;
-+    }
-+    LOGG("Dump kernel info for stream %d", streamId);
-+    GraphUtils::dumpKernelInfo(mProgramGroup[streamId]);
-+
-+    return &(mProgramGroup[streamId]);
-+}
-+
-+int GraphConfigPipe::getProgramGroup(string pgName,
-+                                     ia_isp_bxt_program_group * programGroupForPG) {
-+    GCSS::NodeIterator iter(mSettings);
-+    GCSS::IGraphConfig *pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
-+    std::string name;
-+    for ( ; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
-+        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
-+        CheckError(ret != css_err_none, BAD_VALUE,
-+                   "Failed to get the name of an existing PG node, BUG");
-+        if (name == pgName) {
-+            break;
-+        }
-+    }
-+    CheckError(pg == nullptr, UNKNOWN_ERROR, "Failed to get program groups, BUG");
-+
-+    mGCSSAicUtil.getProgramGroup(pg, *programGroupForPG);
-+
-+    LOGG("Dump kernel info for %s", pgName.c_str());
-+    GraphUtils::dumpKernelInfo(*programGroupForPG);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigPipe::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
-+    std::string name;
-+    GCSS::NodeIterator iter(mSettings);
-+    GCSS::IGraphConfig *pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP);
-+
-+    for (; pg != nullptr; pg = iter.iterateByType(GCSS_KEY_PROGRAM_GROUP)) {
-+        css_err_t ret = pg->getValue(GCSS_KEY_NAME, name);
-+        CheckError(ret != css_err_none, BAD_VALUE, "Failed to get the name of PG node");
-+        if (name == pgName) {
-+            break;
-+        }
-+    }
-+    CheckError(pg == nullptr, UNKNOWN_ERROR,
-+               "Failed to get program groups for PG: %s", pgName.c_str());
-+
-+    pg = pg->getDescendant(GCSS_KEY_CIPF);
-+    if (pg == nullptr) return NAME_NOT_FOUND;
-+
-+    string rbmString;
-+    css_err_t ret = pg->getValue(GCSS_KEY_RBM, rbmString);
-+    if (ret != css_err_none) return NAME_NOT_FOUND;
-+
-+    GCSS::GraphCameraUtil mGCSSCameraUtil;
-+    stageAttr->rbm = mGCSSCameraUtil.numString2binary(rbmString, &stageAttr->rbm_bytes);
-+    CheckError(!stageAttr->rbm, NO_MEMORY, "%s get rbm value: %s", __func__, rbmString.c_str());
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigPipe::getScalerKernelResolutionRatio(uint32_t *kenerArray,
-+                                                         uint32_t sizeArray,
-+                                                         float *widthRatio, float *heightRatio) {
-+    CheckError(sizeArray > 0, UNKNOWN_ERROR, "%s the array is null", __func__);
-+    CheckError(!widthRatio ||!heightRatio , UNKNOWN_ERROR,
-+               "%s widthRatio or heightRatio is null", __func__);
-+
-+    const ia_isp_bxt_resolution_info_t *resolutionInfo;
-+    resolutionInfo = getScalerKernelResolutionInfo(kenerArray, sizeArray);
-+    CheckError(!resolutionInfo, UNKNOWN_ERROR, "%s getScalerKernelResolutionInfo fails", __func__);
-+
-+    *widthRatio = 1.0;
-+    *heightRatio = 1.0;
-+    if ((resolutionInfo) && ((resolutionInfo->input_width != resolutionInfo->output_width) ||
-+        (resolutionInfo->input_height != resolutionInfo->output_height))) {
-+        *widthRatio = static_cast<float>(resolutionInfo->input_width) /
-+                      static_cast<float>(resolutionInfo->output_width);
-+        *heightRatio = static_cast<float>(resolutionInfo->input_height) /
-+                       static_cast<float>(resolutionInfo->output_height);
-+    }
-+    return OK;
-+}
-+
-+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getScalerKernelResolutionInfo(
-+                                                                        uint32_t *kenerArray,
-+                                                                        uint32_t sizeArray) {
-+    CheckError(sizeArray > 0, nullptr, "%s the array is null", __func__);
-+
-+    std::vector<int32_t> streamIds;
-+    // Get all stream IDs
-+    status_t ret = graphGetStreamIds(&streamIds);
-+    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
-+
-+    uint32_t kernelId = kenerArray[0];
-+    int32_t streamIdTmp = VIDEO_STREAM_ID;
-+
-+    bool hasVideo = false;
-+    for (auto streamId : streamIds) {
-+        for (uint32_t i = 0; i < sizeArray; i++) {
-+            if (isKernelInStream(streamId, kenerArray[i])) {
-+                LOG2("%s, found outputscaler %u from stream %d", __func__, kenerArray[i], streamId);
-+                streamIdTmp = streamId;
-+                kernelId = kenerArray[i];
-+                if (streamId == VIDEO_STREAM_ID) hasVideo = true;
-+
-+                break;
-+            }
-+        }
-+        if (hasVideo) break;
-+    }
-+
-+    // Get resolution as per above kernel and stream
-+    return getKernelResolutionInfo(streamIdTmp, kernelId);
-+}
-+
-+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getGdcKernelResolutionInfo(
-+                                                                           uint32_t *kernelId) {
-+    CheckError(!kernelId , nullptr, "%s the kernelId is nullptr", __func__);
-+
-+    std::vector<int32_t> streamIds;
-+    // Get all stream IDs
-+    status_t ret = graphGetStreamIds(&streamIds);
-+    CheckWarning((ret != OK || streamIds.empty()), nullptr, "Failed to get the PG streamIds");
-+
-+    *kernelId = ia_pal_uuid_isp_gdc3;
-+    LOG1("%s, initalize gdc version 3 as default", __func__);
-+    int32_t gdcStreamId = VIDEO_STREAM_ID;
-+    LOG1("%s, initalize gdc video stream as default", __func__);
-+
-+    // Check video stream for gdc version firstly,
-+    // in case more than one stream contain gdc kernel.
-+    bool hasVideoGdc = false;
-+    for (auto streamId : streamIds) {
-+        if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1)) {
-+            LOG1("%s, found gdc3_1 from stream %d", __func__, streamId);
-+            gdcStreamId = streamId;
-+            *kernelId = ia_pal_uuid_isp_gdc3_1;
-+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
-+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3)) {
-+            LOG1("%s, found gdc3 from stream %d", __func__, streamId);
-+            gdcStreamId = streamId;
-+            *kernelId = ia_pal_uuid_isp_gdc3;
-+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
-+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc3_1_1)) {
-+            LOG1("%s, found gdc3_1_1 from stream %d", __func__, streamId);
-+            gdcStreamId = streamId;
-+            *kernelId = ia_pal_uuid_isp_gdc3_1_1;
-+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
-+        } else if (isKernelInStream(streamId, ia_pal_uuid_isp_gdc5)) {
-+            LOG1("%s, found gdc5 from stream %d", __func__, streamId);
-+            gdcStreamId = streamId;
-+            *kernelId = ia_pal_uuid_isp_gdc5;
-+            if (streamId == VIDEO_STREAM_ID) hasVideoGdc = true;
-+        }
-+        if (hasVideoGdc) break;
-+    }
-+
-+    // Get resolution as per above kernel and stream
-+    return getKernelResolutionInfo(gdcStreamId, *kernelId);
-+}
-+
-+status_t GraphConfigPipe::getGdcKernelSetting(uint32_t *kernelId,
-+                                              camera_resolution_t *resolution) {
-+    CheckError(!kernelId || !resolution, UNKNOWN_ERROR,
-+               "%s the kernelId or resolution is nullptr", __func__);
-+
-+    // Get resolution as per above kernel and stream
-+    const ia_isp_bxt_resolution_info_t *gdcResolution = getGdcKernelResolutionInfo(kernelId);
-+    CheckWarning(!gdcResolution, NO_ENTRY,
-+                 "Couldn't get the GDC resolution in current pipe: %d", mPipeUseCase);
-+
-+    resolution->width = gdcResolution->input_width;
-+    resolution->height = gdcResolution->input_height;
-+    LOGG("%s: kernel %d, res %dx%d", __func__, kernelId, resolution->width, resolution->height);
-+
-+    return OK;
-+}
-+
-+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getKernelResolutionInfo(
-+        uint32_t streamId,
-+        uint32_t kernelId) {
-+    ia_isp_bxt_program_group *programGroup = getProgramGroup(streamId);
-+    if (programGroup == nullptr) {
-+        return nullptr;
-+    }
-+
-+    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
-+        if (programGroup->run_kernels[i].stream_id == streamId &&
-+            programGroup->run_kernels[i].kernel_uuid == kernelId) {
-+            return programGroup->run_kernels[i].resolution_info;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/**
-+ * check whether the kernel is in this stream
-+ *
-+ * \param[in] streamId stream id.
-+ * \param[in] kernelId kernel id.
-+ * \param[out] whether the kernel in this stream
-+ * \return true the kernel is in this stream
-+ * \return false the kernel isn't in this stream.
-+ *
-+ */
-+bool GraphConfigPipe::isKernelInStream(uint32_t streamId, uint32_t kernelId) {
-+    ia_isp_bxt_program_group *programGroup = getProgramGroup(streamId);
-+    if (programGroup == nullptr) {
-+        return false;
-+    }
-+    for (unsigned int i = 0; i < programGroup->kernel_count; i++) {
-+        if (programGroup->run_kernels[i].kernel_uuid == kernelId) {
-+            return true;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * get program group id for some kernel
-+ *
-+ * \param[in] streamId stream id.
-+ * \param[in] kernelId kernel pal uuid.
-+ * \param[out] program group id that contain this kernel with the same stream id
-+ * \return error if can't find the kernel id in any ot the PGs in this stream
-+ */
-+status_t GraphConfigPipe::getPgIdForKernel(const uint32_t streamId,
-+                                           const int32_t kernelId, int32_t *pgId) {
-+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
-+    css_err_t ret = css_err_none;
-+    status_t retErr;
-+    NodesPtrVector programGroups;
-+
-+    // Get all program groups with the stream id
-+    retErr = streamGetProgramGroups(streamId, &programGroups);
-+    if (retErr != OK) {
-+        LOGE("ERROR: couldn't get program groups");
-+        return retErr;
-+    }
-+
-+    // Go through all the program groups with the selected streamID
-+    for (auto & ndVec : programGroups) {
-+        /* Iterate through program group nodes, find kernel and get the PG id */
-+        GCSS::GraphConfigItem::const_iterator it = ndVec->begin();
-+        while (it != ndVec->end()) {
-+            Node *kernelNode = nullptr;
-+            // Look for kernel with the requested uuid
-+            ret = ndVec->getDescendant(GCSS_KEY_PAL_UUID,
-+                                       kernelId,
-+                                       it,
-+                                       &kernelNode);
-+            if (ret != css_err_none)
-+                continue;
-+
-+            ret = ndVec->getValue(GCSS_KEY_PG_ID, *pgId);
-+            if (ret == css_err_none) {
-+                LOG2("got the pgid:%d for kernel id:%d in stream:%d", *pgId, kernelId, streamId);
-+                return OK;
-+            }
-+            LOGE("ERROR: Couldn't get pg id for kernel %d", kernelId);
-+            return BAD_VALUE;
-+        }
-+    }
-+    LOG2("%s: kernel id %d is not found in stream %d", __func__, kernelId, streamId);
-+    return BAD_VALUE;
-+}
-+
-+/**
-+ * This method creates SinkDependency structure for every active sink found in
-+ * the graph. These structs allow quick access to information that is required
-+ * by other methods.
-+ * Active sinks are the ones that have a connection to an active port.
-+ * This list of active sinks(mSinkPeerPort) has to be filled before this method
-+ * is executed.
-+ * For every virtual sink we store the name (as a key) and the terminal id of
-+ * the input port of the stream associated with that stream. This input port
-+ * will be the destination of the buffers from the capture unit.
-+ *
-+ * This method is used during init()
-+ * If we would have different settings per frame then this would be enough
-+ * to detect the active ISA nodes, but we are not there yet. we are still using
-+ * the base graph settings every frame.
-+ */
-+void GraphConfigPipe::calculateSinkDependencies() {
-+    status_t status = OK;
-+    GCSS::IGraphConfig *streamInputPort = nullptr;
-+    std::string sinkName;
-+    SinkDependency aSinkDependency;
-+    ia_uid stageId;  // not needed
-+    mSinkDependencies.clear();
-+    mIsaOutputPort2StreamId.clear();
-+    std::map<Node*, Node*>::iterator sinkIter = mSinkPeerPort.begin();
-+
-+    for (; sinkIter != mSinkPeerPort.end(); ++sinkIter) {
-+        sinkIter->first->getValue(GCSS_KEY_NAME, sinkName);
-+        aSinkDependency.sinkGCKey = GCSS::ItemUID::str2key(sinkName);
-+        sinkIter->first->getValue(GCSS_KEY_STREAM_ID, aSinkDependency.streamId);
-+        status = GCSS::GraphCameraUtil::getInputPort(GCSS_KEY_STREAM_ID, aSinkDependency.streamId,
-+            mSettings, &streamInputPort);
-+        if (status != OK) {
-+            LOGE("Failed to get input port for stream %d associated to sink %s",
-+                aSinkDependency.streamId, sinkName.c_str());
-+            continue;
-+        }
-+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(streamInputPort,
-+            stageId,
-+            aSinkDependency.streamInputPortId);
-+        if (status != OK) {
-+            LOGE("Failed to get stream %d input port 4CC code",
-+                aSinkDependency.streamId);
-+            continue;
-+        }
-+        GCSS::IGraphConfig *temp = nullptr;
-+        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
-+        if (status != OK) {
-+            LOGE("fail to get peer for the port(%s)",
-+                 GCSS::GraphCameraUtil::print(streamInputPort).c_str());
-+            continue;
-+        }
-+        aSinkDependency.peer = static_cast<Node*>(temp);
-+        LOG2("Adding dependency %s stream id %d", sinkName.c_str(), aSinkDependency.streamId);
-+        mSinkDependencies.push_back(aSinkDependency);
-+
-+        // get the output port of capture unit
-+        status = GCSS::GraphCameraUtil::portGetPeer(streamInputPort, &temp);
-+        if (status != OK) {
-+            LOGE("Fail to get isa output port for sink %s", sinkName.c_str());
-+            continue;
-+        }
-+        Node *isaOutPutPort = static_cast<Node*>(temp);
-+        std::string fullName;
-+        status = portGetFullName(isaOutPutPort, &fullName);
-+        if (status != OK) {
-+            LOGE("Fail to get isa output port name");
-+            continue;
-+        }
-+        int32_t streamId = portGetStreamId(isaOutPutPort);
-+        if (streamId != -1 &&
-+            mIsaOutputPort2StreamId.find(fullName) == mIsaOutputPort2StreamId.end())
-+            mIsaOutputPort2StreamId[fullName] = streamId;
-+    }
-+}
-+
-+/**
-+ * This method is used by the GC Manager that has access to the request
-+ * to inform us of what are the active sinks.
-+ * Using the sink dependency information we can then know which ISA ports
-+ * are active for this GC.
-+ *
-+ * Once we have different settings per request then we can incorporate this
-+ * method into calculateSinkDependencies.
-+ *
-+ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
-+ *                        request
-+ */
-+void GraphConfigPipe::setActiveSinks(const std::vector<uid_t> &activeSinks) {
-+    mIsaActiveDestinations.clear();
-+    uid_t activeDest = 0;
-+
-+    for (auto sink : activeSinks) {
-+        for (auto& dependency : mSinkDependencies) {
-+            if (dependency.sinkGCKey == sink) {
-+                activeDest = dependency.streamInputPortId;
-+                mIsaActiveDestinations[activeDest] = activeDest;
-+            }
-+        }
-+    }
-+}
-+
-+/**
-+ * This method is used by the GC Manager that has access to the request
-+ * to inform us of what will the stream id be used.
-+ * Using the sink dependency information we can then know which stream ids
-+ * are active for this GC.
-+ *
-+ * Once we have different settings per request then we can incorporate this
-+ * method into calculateSinkDependencies.
-+ *
-+ * \param[in] activeSinks Vector with GCSS_KEY's of the active sinks in a
-+ *                        request
-+ */
-+void GraphConfigPipe::setActiveStreamId(const std::vector<uid_t> &activeSinks) {
-+    mActiveStreamId.clear();
-+    int32_t activeStreamId = 0;
-+
-+    for (auto sink : activeSinks) {
-+        for (auto& dependency : mSinkDependencies) {
-+            if (dependency.sinkGCKey == sink) {
-+                activeStreamId = dependency.streamId;
-+                mActiveStreamId.insert(activeStreamId);
-+
-+                // get peer's stream Id
-+                activeStreamId = portGetStreamId(dependency.peer);
-+                if (activeStreamId == -1) {
-+                    LOGE("fail to get the stream id for peer port");
-+                    continue;
-+                }
-+                if (mActiveStreamId.find(activeStreamId) == mActiveStreamId.end())
-+                    mActiveStreamId.insert(activeStreamId);
-+            }
-+        }
-+    }
-+}
-+
-+int GraphConfigPipe::getStreamIdByPgName(string pgName) {
-+    css_err_t ret = ia_err_none;
-+    string foundPgName = "invalid";
-+    GraphConfigNode* programGroup = nullptr;
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+
-+    while (it != mSettings->end()) {
-+        programGroup = nullptr;
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
-+        if (ret != ia_err_none || programGroup == nullptr) {
-+            continue;
-+        }
-+
-+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
-+        if (ret != ia_err_none) {
-+            LOGW("%s, failed to get pg name in program group", __func__);
-+            continue;
-+        }
-+
-+        if (foundPgName == pgName)
-+            break;
-+    }
-+
-+    if (foundPgName != pgName || !programGroup) {
-+        LOG2("No matched PG found in pipeUseCase: %d", mPipeUseCase);
-+        return -1;
-+    }
-+
-+    int streamId = -1;
-+    ret = programGroup->getValue(GCSS_KEY_STREAM_ID, streamId);
-+    CheckError(ret != ia_err_none, -1,
-+               "Get streamId failed by name:%s, pipeUseCase: %d", pgName.c_str(), mPipeUseCase);
-+
-+    LOGG("%s: streamId %d", __func__, streamId);
-+    return streamId;
-+}
-+
-+status_t GraphConfigPipe::getPgNames(std::vector<string>* pgNames) {
-+    css_err_t ret = css_err_none;
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+    GraphConfigNode* programGroup = nullptr;
-+
-+    while (it != mSettings->end()) {
-+        programGroup = nullptr;
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
-+        if (ret != css_err_none || programGroup == nullptr) {
-+            continue;
-+        }
-+
-+        string foundPgName;
-+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
-+        if (ret != css_err_none) {
-+            LOGW("%s, failed to get pg name in program group", __func__);
-+            continue;
-+        }
-+
-+        pgNames->push_back(foundPgName);
-+    }
-+
-+    return OK;
-+}
-+
-+bool GraphConfigPipe::containPgs(std::vector<string> pgNames) {
-+    std::vector<string> allPgNames;
-+    getPgNames(&allPgNames);
-+
-+    for (auto &name : pgNames) {
-+        if (std::find(allPgNames.begin(), allPgNames.end(), name.c_str()) == allPgNames.end())
-+            return false;
-+    }
-+    return true;
-+}
-+
-+int GraphConfigPipe::getPgIdByPgName(string pgName) {
-+    css_err_t ret = css_err_none;
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+    GraphConfigNode* programGroup = nullptr;
-+    bool foundMatchedPg = false;
-+
-+    while (it != mSettings->end()) {
-+        programGroup = nullptr;
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group", it, &programGroup);
-+        if (ret != css_err_none || programGroup == nullptr) {
-+            continue;
-+        }
-+
-+        string foundPgName;
-+        ret = programGroup->getValue(GCSS_KEY_NAME, foundPgName);
-+        if (ret != css_err_none) {
-+            LOGW("%s, failed to get pg name in program group", __func__);
-+            continue;
-+        }
-+
-+        if (foundPgName == pgName) {
-+            foundMatchedPg = true;
-+            break;
-+        }
-+    }
-+
-+    if (!foundMatchedPg) {
-+        LOG2("No matched PG found, pgName: %s, pipeUseCase: %d", pgName.c_str(), mPipeUseCase);
-+        return -1;
-+    }
-+
-+    const GCSS::IGraphConfig* gc = getInterface(programGroup);
-+    CheckError(gc == nullptr, -1, "%s, Failed to get graph config interface", __func__);
-+
-+    int pgId = -1;
-+    ret = gc->getValue(GCSS_KEY_PG_ID, pgId);
-+    CheckError(ret != css_err_none, -1, "Get PG ID failed with:%d", ret);
-+
-+    LOGG("%s: pgName %s, pgId %d", __func__, pgName.c_str(), pgId);
-+    return pgId;
-+}
-+
-+status_t GraphConfigPipe::getProgramGroupsByName(const std::vector<std::string> &pgNames,
-+                                                 NodesPtrVector *programGroups) {
-+    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
-+    css_err_t ret = css_err_none;
-+    GraphConfigNode *result;
-+    NodesPtrVector allProgramGroups;
-+    string foundPgName;
-+
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+
-+    while (it != mSettings->end()) {
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
-+                it, &result);
-+        if (ret == css_err_none)
-+            allProgramGroups.push_back(result);
-+    }
-+
-+    CheckError(allProgramGroups.empty(), UNKNOWN_ERROR,
-+               "%s, doesn't find any PG in current pipe: %d", __func__, mPipeUseCase);
-+    for (auto &ndVec : allProgramGroups) {
-+        ret = ndVec->getValue(GCSS_KEY_NAME, foundPgName);
-+        if (ret != css_err_none) {
-+            LOGE("%s, failed to get pg name in program group", __func__);
-+            continue;
-+        }
-+
-+        for (auto &name : pgNames) {
-+            if (foundPgName.find(name) != string::npos) {
-+                programGroups->push_back(ndVec);
-+            }
-+        }
-+    }
-+    if (programGroups->empty()) {
-+        LOG2("%s, doesn't find the matched pg in current pipe: %d", __func__, mPipeUseCase);
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigPipe::pipelineGetConnections(
-+        const std::vector<std::string> &pgList,
-+        std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+        std::vector<IGraphType::PipelineConnection> *confVector) {
-+    CheckError(!confVector, UNKNOWN_ERROR, "%s, the confVector is nullptr", __func__);
-+
-+    NodesPtrVector programGroups;
-+    NodesPtrVector alreadyConnectedPorts;
-+    Node *peerPort = nullptr;
-+    Node *port = nullptr;
-+    IGraphType::PipelineConnection aConnection;
-+    std::map<Node*, IGraphType::PipelineConnection> edgePort2Connection;
-+
-+    status_t status = getProgramGroupsByName(pgList, &programGroups);
-+    CheckError(status != OK, status, "%s, failed to get program groups, BUG", __func__);
-+
-+    for (size_t i = 0; i < programGroups.size(); i++) {
-+        Node::const_iterator it = programGroups[i]->begin();
-+
-+        while (it != programGroups[i]->end()) {
-+            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port",
-+                    it, &port);
-+            if (ret != css_err_none)
-+                continue;
-+
-+            // port for private terminal, no need to connect
-+            int priv = 0;
-+            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
-+            if (ret == css_err_none && priv)
-+                continue;
-+
-+            /*
-+             * Since we are iterating through the ports
-+             * check if this port is already connected to avoid setting
-+             * the connection twice
-+             */
-+            if (std::find(alreadyConnectedPorts.begin(),
-+                        alreadyConnectedPorts.end(),
-+                        port) != alreadyConnectedPorts.end()) {
-+                continue;
-+            }
-+            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
-+
-+            string contentType;
-+            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
-+            if (ret == css_err_none && contentType != "pixel_data") {
-+                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
-+                continue;
-+            }
-+
-+            status = portGetFormat(port, &(aConnection.portFormatSettings));
-+            if (status != OK) {
-+                LOGE("Failed to get port format info in port from PG[%zu]", i);
-+                return BAD_VALUE;
-+            }
-+            if (aConnection.portFormatSettings.enabled == 0) {
-+                LOG1("Port from PG[%zu] disabled", i);
-+                status = portGetOwner(port, &(aConnection.connectionConfig));
-+                CheckError((status != OK), BAD_VALUE,
-+                           "Failed to get ownerfor port from PG[%zu]", i);
-+                confVector->push_back(aConnection);
-+                continue;
-+            } else {
-+                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
-+                        aConnection.portFormatSettings.terminalId,
-+                        aConnection.portFormatSettings.width,
-+                        aConnection.portFormatSettings.height,
-+                        CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
-+                        aConnection.portFormatSettings.bpl,
-+                        aConnection.portFormatSettings.bpp);
-+            }
-+
-+            /*
-+             * for each port get the connection info and pass it
-+             * to the pipeline object
-+             */
-+            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
-+            if (status != OK) {
-+                LOGE("Failed to create connection info in port from PG[%zu]", i);
-+                return BAD_VALUE;
-+            }
-+
-+            aConnection.hasEdgePort = false;
-+            if (isPipeEdgePort(port)) {
-+                int32_t direction = portGetDirection(port);
-+                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
-+                    aConnection.connectionConfig.mConnectionType =
-+                        IGraphType::connection_type_push;
-+                } else {
-+                    HalStream *clientStream = nullptr;
-+                    status = portGetClientStream(peerPort, &clientStream);
-+                    CheckError(status != OK, UNKNOWN_ERROR,
-+                               "Failed to find client stream for v-sink");
-+                    aConnection.stream = clientStream;
-+                    if (clientStream != nullptr) {
-+                        edgePort2Connection[port] = aConnection;
-+                    }
-+                }
-+                aConnection.hasEdgePort = true;
-+            }
-+            confVector->push_back(aConnection);
-+            alreadyConnectedPorts.push_back(port);
-+            alreadyConnectedPorts.push_back(peerPort);
-+        }
-+    }
-+
-+    getScalerByStreamId(edgePort2Connection, scalerInfo);
-+    GraphUtils::dumpConnections(*confVector);
-+
-+    return status;
-+}
-+
-+status_t GraphConfigPipe::getScalerByStreamId(std::map<Node*,
-+                                              IGraphType::PipelineConnection> edgePort2Connection,
-+                                              std::vector<IGraphType::ScalerInfo> *scalerInfo) {
-+    if (edgePort2Connection.empty()) {
-+        return OK;
-+    }
-+    CheckError(!scalerInfo, UNKNOWN_ERROR, "%s, scalerInfo is nullptr", __func__);
-+
-+    for (auto it = edgePort2Connection.begin(); it != edgePort2Connection.end(); ++it) {
-+        const char *portName;
-+        bool mpFLag = false;
-+        bool dpFlag = false;
-+        bool pppFlag = false;
-+        float scalerW = 1;
-+        float scalerH = 1;
-+
-+        IGraphType::PipelineConnection connection = it->second;
-+        portName = NODE_NAME(it->first);
-+        int32_t streamId = connection.stream->streamId();
-+        LOG2("%s, streamId:%d, portName:%s", __func__, streamId, portName);
-+
-+        if (!strcmp("main", portName)) {
-+            mpFLag = true;
-+        } else if (!strcmp("display", portName)) {
-+            dpFlag = true;
-+        } else if (!strcmp("postproc", portName)) {
-+            pppFlag = true;
-+        }
-+        if (!mpFLag && !dpFlag && !pppFlag)
-+            continue;
-+
-+        if (mpFLag) {
-+            scalerInfo->push_back({streamId, 1.0, 1.0});
-+            continue;
-+        }
-+
-+        float osW = 1;
-+        float osH = 1;
-+        if (dpFlag) {
-+            (void)getScalerKernelResolutionRatio(dpKernel, DB_KERNEL_SIZE, &osW, &osH);
-+        } else if (pppFlag) {
-+            (void)getScalerKernelResolutionRatio(pppKernel, PPP_KERNEL_SIZE, &osW, &osH);
-+        }
-+
-+        uint32_t kernelId;
-+        float gdcScalerW = 1;
-+        float gdcScalerH = 1;
-+        const ia_isp_bxt_resolution_info_t *gdcResolution = getGdcKernelResolutionInfo(&kernelId);
-+        if ((gdcResolution) && ((gdcResolution->input_width != gdcResolution->output_width) ||
-+            (gdcResolution->input_height != gdcResolution->output_height))) {
-+            gdcScalerW = static_cast<float>(gdcResolution->input_width) /
-+                         static_cast<float>(gdcResolution->output_width);
-+            gdcScalerH = static_cast<float>(gdcResolution->input_height) /
-+                         static_cast<float>(gdcResolution->output_height);
-+        }
-+
-+        float b2iDsW = 1;
-+        float b2iDsH = 1;
-+        (void)getScalerKernelResolutionRatio(dsKernel, DS_KERNEL_SIZE, &b2iDsW, &b2iDsH);
-+
-+        scalerW = osW * gdcScalerW * b2iDsW;
-+        scalerH = osH * gdcScalerH * b2iDsH;
-+        scalerInfo->push_back({streamId, scalerW, scalerH});
-+        LOG2("%s, scalerW:%f, scalerH:%f", __func__, scalerW, scalerH);
-+    }
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigPipe::portGetOwner(Node *port,
-+                                       IGraphType::ConnectionConfig *connectionInfo) {
-+    int32_t direction = PORT_DIRECTION_INPUT;
-+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
-+    CheckError((ret != css_err_none), BAD_VALUE, "Failed to get port direction");
-+
-+    /*
-+     * Default to pull, it will be amended later,
-+     * Iterations are not used
-+     */
-+    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
-+    connectionInfo->mSinkIteration = 0;
-+    connectionInfo->mSourceIteration = 0;
-+
-+    status_t status = OK;
-+    if (direction == PORT_DIRECTION_INPUT) {
-+        // input port is the sink in a connection
-+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port,
-+                                    connectionInfo->mSinkStage,
-+                                    connectionInfo->mSinkTerminal);
-+        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for sink port");
-+    } else {
-+        // output port is the source in a connection
-+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(*port,
-+                                    connectionInfo->mSourceStage,
-+                                    connectionInfo->mSourceTerminal);
-+        CheckError((status != OK), BAD_VALUE, "Failed to create fourcc info for source port");
-+    }
-+    return status;
-+}
-+
-+/**
-+ * Query the connection info structs for a given pipeline defined by
-+ * stream id.
-+ *
-+ * \param[in] sinkName to be used as key to get pipeline connections
-+ * \param[out] stream id connect with sink
-+ * \param[out] connections for pipeline configuation
-+ * \return OK in case of success.
-+ * \return UNKNOWN_ERROR or BAD_VALUE in case of fail.
-+ * \if sinkName is not supported, NAME_NOT_FOUND is returned.
-+ * \sink name support list as below defined in graph_descriptor.xml
-+ * \<sink name="video0"/>
-+ * \<sink name="video1"/>
-+ * \<sink name="video2"/>
-+ * \<sink name="still0"/>
-+ * \<sink name="still1"/>
-+ * \<sink name="still2"/>
-+ * \<sink name="raw"/>
-+ */
-+status_t GraphConfigPipe::pipelineGetConnections(
-+                              const std::string &sinkName,
-+                              int *streamId,
-+                              std::vector<IGraphType::PipelineConnection> *confVector) {
-+    CheckError(!streamId, UNKNOWN_ERROR, "the streamId is nullptr");
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+
-+    std::vector<GCSS::IGraphConfig*> sinks;
-+    NodesPtrVector programGroups;
-+    NodesPtrVector alreadyConnectedPorts;
-+    Node *peerPort = nullptr;
-+    Node *port = nullptr;
-+    IGraphType::PipelineConnection aConnection;
-+
-+    alreadyConnectedPorts.clear();
-+    status_t status = GCSS::GraphCameraUtil::graphGetSinksByName(sinkName, mSettings, sinks);
-+    if (status != OK || sinks.empty()) {
-+        LOGD("No %s sinks in graph", sinkName.c_str());
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    status = sinks[0]->getValue(GCSS_KEY_STREAM_ID, *streamId);
-+    if (status != css_err_none) {
-+        LOGE("Sink node lacks stream id attribute - fix your config");
-+        return BAD_VALUE;
-+    }
-+
-+    status = streamGetProgramGroups(*streamId, &programGroups);
-+    if (status != OK || programGroups.empty()) {
-+        LOGE("No Program groups associated with stream id %d", *streamId);
-+        return BAD_VALUE;
-+    }
-+
-+    for (size_t i = 0; i < programGroups.size(); i++) {
-+        Node::const_iterator it = programGroups[i]->begin();
-+
-+        while (it != programGroups[i]->end()) {
-+            css_err_t ret = programGroups[i]->getDescendant(GCSS_KEY_TYPE, "port", it, &port);
-+            if (ret != css_err_none)
-+                continue;
-+
-+            // port for private terminal, no need to connect
-+            int priv = 0;
-+            ret = port->getValue(GCSS_KEY_PRIVATE, priv);
-+            if (ret == css_err_none && priv)
-+                continue;
-+
-+            /*
-+             * Since we are iterating through the ports
-+             * check if this port is already connected to avoid setting
-+             * the connection twice
-+             */
-+            if (std::find(alreadyConnectedPorts.begin(),
-+                          alreadyConnectedPorts.end(),
-+                          port) != alreadyConnectedPorts.end()) {
-+                continue;
-+            }
-+            LOG1("Configuring Port from PG[%zu] in line:%d", i, __LINE__);
-+
-+            string contentType;
-+            ret = port->getValue(GCSS_KEY_CONTENT_TYPE, contentType);
-+            if (ret == css_err_none && contentType != "pixel_data") {
-+                LOG2("%s skipped content type %s", NODE_NAME(port), contentType.c_str());
-+                continue;
-+            }
-+
-+            status = portGetFormat(port, &(aConnection.portFormatSettings));
-+            if (status != OK) {
-+                LOGE("Failed to get port format info in port from PG[%zu] "
-+                     "from stream id %d", i, *streamId);
-+                return BAD_VALUE;
-+            }
-+            if (aConnection.portFormatSettings.enabled == 0) {
-+                LOG1("Port from PG[%zu] from stream id %d disabled",
-+                        i, *streamId);
-+                confVector->push_back(aConnection);
-+                continue;
-+            } else {
-+                LOG1("Port: 0x%x format(%dx%d)fourcc: %s bpl: %d bpp: %d",
-+                        aConnection.portFormatSettings.terminalId,
-+                        aConnection.portFormatSettings.width,
-+                        aConnection.portFormatSettings.height,
-+                        CameraUtils::fourcc2String(aConnection.portFormatSettings.fourcc).c_str(),
-+                        aConnection.portFormatSettings.bpl,
-+                        aConnection.portFormatSettings.bpp);
-+            }
-+
-+            /*
-+             * for each port get the connection info and pass it
-+             * to the pipeline object
-+             */
-+            status = portGetConnection(port, &(aConnection.connectionConfig), &peerPort);
-+            if (status != OK) {
-+                LOGE("Failed to create connection info in port from PG[%zu]"
-+                     "from stream id %d", i, *streamId);
-+                return BAD_VALUE;
-+            }
-+
-+            aConnection.hasEdgePort = false;
-+            if (isPipeEdgePort(port)) {
-+                int32_t direction = portGetDirection(port);
-+                if (direction == GraphConfigPipe::PORT_DIRECTION_INPUT) {
-+                    aConnection.connectionConfig.mConnectionType =
-+                                                      IGraphType::connection_type_push;
-+                } else {
-+                    HalStream *clientStream = nullptr;
-+                    status = portGetClientStream(peerPort, &clientStream);
-+                    if (status != OK) {
-+                        LOGE("Failed to find client stream for v-sink");
-+                        return UNKNOWN_ERROR;
-+                    }
-+                    aConnection.stream = clientStream;
-+                }
-+                aConnection.hasEdgePort = true;
-+            }
-+            confVector->push_back(aConnection);
-+            alreadyConnectedPorts.push_back(port);
-+            alreadyConnectedPorts.push_back(peerPort);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Find distinct stream ids from the graph and return them in a vector.
-+ * \param streamIds Vector to be populated with stream ids.
-+ */
-+status_t GraphConfigPipe::graphGetStreamIds(StreamsVector *streamIds) {
-+    CheckError(!streamIds, UNKNOWN_ERROR, "%s, The streamIds is nullptr", __func__);
-+    GraphConfigNode *result;
-+    int32_t streamId = -1;
-+    css_err_t ret;
-+
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+    while (it != mSettings->end()) {
-+        bool found = false;
-+        // Find all program groups
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
-+                                       it, &result);
-+        if (ret != css_err_none)
-+            continue;
-+
-+        ret = result->getValue(GCSS_KEY_STREAM_ID, streamId);
-+        if (ret != css_err_none)
-+            continue;
-+
-+        // If stream id is not yet in vector, add it
-+        StreamsVector::iterator ite = streamIds->begin();
-+        for ( ; ite != streamIds->end(); ++ite) {
-+            if (streamId == *ite) {
-+                found = true;
-+                break;
-+            }
-+        }
-+        if (found)
-+            continue;
-+
-+        streamIds->push_back(streamId);
-+    }
-+
-+    LOGG("%s: stream IDs size %d", __func__, streamIds->size());
-+    return OK;
-+}
-+
-+int32_t GraphConfigPipe::portGetStreamId(Node *port) {
-+    css_err_t ret = css_err_none;
-+    Node *ancestor = nullptr;
-+    int32_t streamId = -1;
-+
-+    if (port == nullptr) {
-+        LOGE("Invalid Node, cannot get the port stream id");
-+        return -1;
-+    }
-+    ret = port->getAncestor(&ancestor);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get port's ancestor");
-+        return -1;
-+    }
-+
-+    ret = ancestor->getValue(GCSS_KEY_STREAM_ID, streamId);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get stream ID");
-+        return -1;
-+    }
-+    return streamId;
-+}
-+
-+/**
-+ * Retrieve a list of program groups that belong to a  given stream id.
-+ * Iterates through the graph configuration storing the program groups
-+ * that match this stream id into the provided vector.
-+ *
-+ * \param[in] streamId Id of the stream to match.
-+ * \param[out] programGroups Vector with the nodes that match the criteria.
-+ */
-+status_t GraphConfigPipe::streamGetProgramGroups(int32_t streamId,
-+                                                 NodesPtrVector *programGroups) {
-+    CheckError(!programGroups, UNKNOWN_ERROR, "%s, The programGroups is nullptr", __func__);
-+    css_err_t ret = css_err_none;
-+    GraphConfigNode *result;
-+    NodesPtrVector allProgramGroups;
-+    int32_t streamIdFound = -1;
-+
-+    GraphConfigNode::const_iterator it = mSettings->begin();
-+
-+    while (it != mSettings->end()) {
-+        ret = mSettings->getDescendant(GCSS_KEY_TYPE, "program_group",
-+                                       it, &result);
-+        if (ret == css_err_none)
-+            allProgramGroups.push_back(result);
-+    }
-+
-+    if (allProgramGroups.empty()) {
-+        LOGE("Failed to find any PG's for stream id %d"
-+             " BUG(check graph config file)", streamId);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    for (auto& pg : allProgramGroups) {
-+        ret = pg->getValue(GCSS_KEY_STREAM_ID, streamIdFound);
-+        if ((ret == css_err_none) && (streamIdFound == streamId)) {
-+            programGroups->push_back(pg);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Retrieve the graph config node of the port that is connected to a given port.
-+ *
-+ * \param[in] port Node with the info of the port that we want to find its peer.
-+ * \param[out] peer Pointer to a node where the peer node reference will be
-+ *                  stored
-+ * \return OK
-+ * \return INVALID_OPERATION if the port is disabled.
-+ * \return BAD_VALUE if any of the graph settings is incorrect.
-+ * \return NO_ENTRY if including "private" attribute which is used for private
-+ *         terminal.
-+ */
-+status_t GraphConfigPipe::portGetPeer(Node *port, Node **peer) {
-+    css_err_t ret = css_err_none;
-+    int32_t enabled = 1, priv = 0;
-+    string peerName;
-+
-+    if (port == nullptr || peer == nullptr) {
-+       LOGE("Invalid Node, cannot get the peer port");
-+       return BAD_VALUE;
-+    }
-+    ret = port->getValue(GCSS_KEY_ENABLED, enabled);
-+    if (ret == css_err_none && !enabled) {
-+        LOG1("This port is disabled, keep on getting the connection");
-+        return INVALID_OPERATION;
-+    }
-+
-+    // port for private terminal, no connection needed
-+    ret = port->getValue(GCSS_KEY_PRIVATE, priv);
-+    if (ret == css_err_none && priv) {
-+        LOG2("NO_ENTRY due to key PRIVATE:%d", priv);
-+        return NO_ENTRY;
-+    }
-+
-+    ret = port->getValue(GCSS_KEY_PEER, peerName);
-+    if (ret != css_err_none) {
-+        LOGE("Error getting peer attribute");
-+        return BAD_VALUE;
-+    }
-+    ret = mSettings->getDescendantByString(peerName, peer);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to find peer by name %s", peerName.c_str());
-+        return BAD_VALUE;
-+    }
-+    return OK;
-+}
-+
-+/**
-+ * Generate the connection configuration information for a given port.
-+ *
-+ * This connection configuration  information is required by CIPF to build
-+ * the pipeline
-+ *
-+ * \param[in] port Pointer to the port node
-+ * \param[out] connectionInfo point to the connection info object
-+ * \param[out] peerPort Reference to the peer port
-+ * \return OK in case of success
-+ * \return BAD_VALUE in case of error while retrieving the information.
-+ * \return INVALID_OPERATION in case of the port being disabled.
-+ */
-+status_t GraphConfigPipe::portGetConnection(Node *port,
-+                                            IGraphType::ConnectionConfig *connectionInfo,
-+                                            Node **peerPort) {
-+    int32_t direction = PORT_DIRECTION_INPUT;
-+
-+    status_t status = portGetPeer(port, peerPort);
-+    if (status == NO_ENTRY) {
-+        LOG2("port for private terminal, no peer");
-+        *peerPort = nullptr;
-+    } else if (status != OK) {
-+        if (status == INVALID_OPERATION) {
-+            LOGE("Port %s disabled, cannot get the connection",
-+                    getNodeName(port).c_str());
-+        } else {
-+            LOGE("Failed to get the peer port for port %s", getNodeName(port).c_str());
-+        }
-+        return status;
-+    }
-+
-+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
-+    if (ret != css_err_none) {
-+       LOGE("Failed to get port direction");
-+       return BAD_VALUE;
-+    }
-+
-+    /*
-+     * Default to pull, it will be amended later,
-+     * Iterations are not used
-+     */
-+    connectionInfo->mConnectionType = IGraphType::connection_type_pull;
-+    connectionInfo->mSinkIteration = 0;
-+    connectionInfo->mSourceIteration = 0;
-+
-+    if (direction == PORT_DIRECTION_INPUT) {
-+        // input port is the sink in a connection
-+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port,
-+                                    connectionInfo->mSinkStage,
-+                                    connectionInfo->mSinkTerminal);
-+        if (status != OK) {
-+            LOGE("Failed to create fourcc info for sink port");
-+            return BAD_VALUE;
-+        }
-+        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
-+            status = GCSS::GraphCameraUtil::portGetFourCCInfo(*peerPort,
-+                                       connectionInfo->mSourceStage,
-+                                       connectionInfo->mSourceTerminal);
-+            if (status != OK) {
-+                LOGE("Failed to create fourcc info for source port");
-+                return BAD_VALUE;
-+            }
-+        } else {
-+            connectionInfo->mSourceStage = 0;
-+            connectionInfo->mSourceTerminal = 0;
-+        }
-+    } else {
-+        // output port is the source in a connection
-+        status = GCSS::GraphCameraUtil::portGetFourCCInfo(port,
-+                                    connectionInfo->mSourceStage,
-+                                    connectionInfo->mSourceTerminal);
-+        if (status != OK) {
-+            LOGE("Failed to create fourcc info for source port");
-+            return BAD_VALUE;
-+        }
-+
-+        if (*peerPort != nullptr && !portIsVirtual(*peerPort)) {
-+            status = GCSS::GraphCameraUtil::portGetFourCCInfo(*peerPort,
-+                                    connectionInfo->mSinkStage,
-+                                    connectionInfo->mSinkTerminal);
-+            if (status != OK) {
-+                LOGE("Failed to create fourcc info for sink port");
-+                return BAD_VALUE;
-+            }
-+        /**
-+         * Because all the connections are used for frame flow , so
-+         * create one implicit rule which sets the mSinkTerminal as
-+         * same as mSourceTerminal to handle the parameter or
-+         * hanging port. And then exclude this connection when binding
-+         * the port of executor.
-+         */
-+        } else if (*peerPort != nullptr && portIsVirtual(*peerPort)
-+                   && getNodeName(*peerPort).find(getNodeName(port)) != string::npos) {
-+            LOG2("%s, found one hanging port: %s, peer port: %s",
-+                 __func__, getNodeName(port).c_str(), getNodeName(*peerPort).c_str());
-+            connectionInfo->mSinkStage = 0;
-+            connectionInfo->mSinkTerminal = connectionInfo->mSourceTerminal;
-+        } else {
-+            connectionInfo->mSinkStage = 0;
-+            connectionInfo->mSinkTerminal = 0;
-+        }
-+    }
-+
-+    return status;
-+}
-+
-+/**
-+ * Retrieve the format information of a port
-+ * if the port doesn't have any format set, it gets the format from the peer
-+ * port (i.e. the port connected to this one)
-+ *
-+ * \param[in] port Port to query the format.
-+ * \param[out] format Format settings for this port.
-+ */
-+status_t GraphConfigPipe::portGetFormat(Node *port,
-+                                        IGraphType::PortFormatSettings *format) {
-+    GraphConfigNode *peerNode = nullptr;  // The peer port node
-+    GraphConfigNode *tmpNode = port;  // The port node node we are interrogating
-+    css_err_t ret = css_err_none;
-+    ia_uid stageId;  // ignored
-+
-+    if (port == nullptr) {
-+        LOGE("Invalid parameter, could not get port format");
-+        return BAD_VALUE;
-+    }
-+
-+    ret = port->getValue(GCSS_KEY_ENABLED, format->enabled);
-+    if (ret != css_err_none) {
-+        // if not present by default is enabled
-+        format->enabled = 1;
-+    }
-+
-+    status_t status = GCSS::GraphCameraUtil::portGetFourCCInfo(tmpNode, stageId,
-+                                                               format->terminalId);
-+    if (status != OK) {
-+        LOGE("Could not get port uid");
-+        return INVALID_OPERATION;
-+    }
-+
-+    // if disabled there is no need to query the format
-+    if (format->enabled == 0) {
-+        return OK;
-+    }
-+
-+    format->width = 0;
-+    format->height = 0;
-+
-+    ret = port->getValue(GCSS_KEY_WIDTH, format->width);
-+    if (ret != css_err_none) {
-+        /*
-+         * It could be the port configuration is not in settings, that is normal
-+         * it means that we need to ask the format from the peer.
-+         */
-+        status = portGetPeer(port, &peerNode);
-+        if (status != OK) {
-+            LOGE("Could not find peer port - Fix your graph");
-+            return BAD_VALUE;
-+        }
-+
-+        tmpNode = peerNode;
-+
-+        ret = tmpNode->getValue(GCSS_KEY_WIDTH, format->width);
-+        if (ret != css_err_none) {
-+            LOGE("Could not find port format info: width (from peer)");
-+            return BAD_VALUE;
-+        }
-+    }
-+
-+    ret = tmpNode->getValue(GCSS_KEY_HEIGHT, format->height);
-+    if (ret != css_err_none) {
-+        LOGE("Could not find port format info: height");
-+        return BAD_VALUE;
-+    }
-+
-+    string fourccFormat;
-+    ret = tmpNode->getValue(GCSS_KEY_FORMAT, fourccFormat);
-+    if (ret != css_err_none) {
-+        LOGE("Could not find port format info: fourcc");
-+        return BAD_VALUE;
-+    }
-+
-+    const char *pFormat = fourccFormat.c_str();
-+    format->fourcc = CameraUtils::string2IaFourccCode(pFormat);
-+    format->bpl = gcu::getBpl(format->fourcc, format->width);
-+    LOG2("bpl set to %d for %s", format->bpl, fourccFormat.c_str());
-+
-+    // if settings are specifying bpl, owerwrite the calculated one
-+    int bplFromSettings = 0;
-+    ret = tmpNode->getValue(GCSS_KEY_BYTES_PER_LINE, bplFromSettings);
-+    if (ret == css_err_none) {
-+        LOG2("Overwriting bpl(%d) from settings %d", format->bpl, bplFromSettings);
-+        format->bpl = bplFromSettings;
-+    }
-+
-+    format->bpp = gcu::getBppFromCommon(format->fourcc);
-+
-+    return OK;
-+}
-+
-+/**
-+ * Return the port direction
-+ *
-+ * \param[in] port Reference to port Graph node
-+ * \return 0 if it is an input port
-+ * \return 1 if it is an output port
-+ */
-+int32_t GraphConfigPipe::portGetDirection(Node *port) {
-+    int32_t direction = 0;
-+    css_err_t ret = port->getValue(GCSS_KEY_DIRECTION, direction);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to retrieve port direction, default to input");
-+    }
-+
-+    return direction;
-+}
-+
-+/**
-+ * Return the port full name
-+ * The port full name is made out from:
-+ * - the name program group it belongs to
-+ * - the name of the port
-+ * separated by ":"
-+ *
-+ * \param[in] port Reference to port Graph node
-+ * \param[out] fullName reference to a string to store the full name
-+ *
-+ * \return OK if everything went fine.
-+ * \return BAD_VALUE if any of the graph queries failed.
-+ */
-+status_t GraphConfigPipe::portGetFullName(Node *port, string *fullName) {
-+    CheckError(!fullName, UNKNOWN_ERROR, "%s, the fullName is nullptr", __func__);
-+    string portName, ancestorName;
-+    Node *ancestor;
-+    css_err_t ret = css_err_none;
-+
-+    if (port == nullptr) {
-+        LOGE("Invalid parameter, could not get port full name");
-+        return BAD_VALUE;
-+    }
-+
-+    ret = port->getAncestor(&ancestor);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to retrieve port ancestor");
-+        return BAD_VALUE;
-+    }
-+    ret = ancestor->getValue(GCSS_KEY_NAME, ancestorName);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get ancestor name for port");
-+        port->dumpNodeTree(port, 1);
-+        return BAD_VALUE;
-+    }
-+
-+    ret = port->getValue(GCSS_KEY_NAME, portName);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to retrieve port name");
-+        return BAD_VALUE;
-+    }
-+
-+    *fullName = ancestorName + ":" + portName;
-+    return OK;
-+}
-+
-+/**
-+ * Perform a reverse lookup on the map that associates client streams to
-+ * virtual sinks.
-+ *
-+ * This method is used during pipeline configuration to find a stream associated
-+ * with the id (GCSS key) of the virtual sink
-+ *
-+ * \param[in] vPortId GCSS key representing one of the virtual sinks in the
-+ *                    graph, like GCSS_KEY_VIDEO1
-+ * \return nullptr if not found
-+ * \return pointer to the client stream associated with that virtual sink.
-+ */
-+HalStream* GraphConfigPipe::getHalStreamByVirtualId(uid_t vPortId) {
-+    for (auto &it : mStreamToSinkIdMap) {
-+        if (it.second == vPortId) {
-+            return it.first;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/**
-+ * Return true if the port is a virtual port, this is the end point
-+ * of the graph.
-+ * Virtual ports are the nodes of type sink.
-+ *
-+ * \param[in] port Reference to port Graph node
-+ * \return true if it is a virtual port
-+ * \return false if it is not a virtual port
-+ */
-+bool GraphConfigPipe::portIsVirtual(Node *port) {
-+    string type;
-+    css_err_t ret = port->getValue(GCSS_KEY_TYPE, type);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to retrieve port type, default to input");
-+    }
-+
-+    return (type == string("sink"));
-+}
-+
-+/**
-+ * retrieve the pointer to the client stream associated with a virtual sink
-+ *
-+ * I.e. access the mapping done at stream config time between the pointers
-+ * to camera3_stream_t and the names video0, video1, still0 etc...
-+ *
-+ * \param[in] port Node to the virtual sink (with name videoX or stillX etc..)
-+ * \param[out] stream Pointer to the client stream associated with that virtual
-+ *                    sink.
-+ * \return OK
-+ * \return BAD_VALUE in case of invalid parameters (null pointers)
-+ * \return INVALID_OPERATION in case the Node is not a virtual sink.
-+ */
-+status_t GraphConfigPipe::portGetClientStream(Node *port, HalStream **stream) {
-+    if (!port || !stream) {
-+        LOGE("Could not get client stream - bad parameters");
-+        return BAD_VALUE;
-+    }
-+
-+    if (!portIsVirtual(port)) {
-+        LOGE("Trying to find the client stream from a non virtual port");
-+        return INVALID_OPERATION;
-+    }
-+
-+    string portName;
-+    css_err_t ret = port->getValue(GCSS_KEY_NAME, portName);
-+    if (ret != css_err_none) {
-+        LOGE("Failed to get name for port");
-+        port->dumpNodeTree(port, 1);
-+        return BAD_VALUE;
-+    }
-+
-+    uid_t vPortId = GCSS::ItemUID::str2key(portName);
-+    *stream = getHalStreamByVirtualId(vPortId);
-+
-+    return OK;
-+}
-+
-+/**
-+ * A port is at the edge of the video stream (pipeline) if its peer's stream id is 0 or -1,
-+ * or if its peer is a virtual sink.
-+ *
-+ * Here we check for both conditions and return true if this port is at either
-+ * edge of a pipeline
-+ */
-+bool GraphConfigPipe::isPipeEdgePort(Node *port) {
-+    CheckError(!port, false, "%s, the port is nullptr", __func__);
-+    Node *peer = nullptr;
-+    Node *peerAncestor = nullptr;
-+    int32_t streamId = -1;
-+    int32_t peerStreamId = -1;
-+    string peerType;
-+
-+    int32_t portDirection = portGetDirection(port);
-+
-+    status_t status = portGetPeer(port, &peer);
-+    if (status == INVALID_OPERATION) {
-+        LOG1("port is disabled, so it is an edge port");
-+        return true;
-+    }
-+    if (status != OK) {
-+        LOGE("Failed to create fourcc info for source port");
-+        return false;
-+    }
-+
-+    streamId = portGetStreamId(port);
-+    if (streamId < 0)
-+        return false;
-+    /*
-+     * get the stream id of the peer port
-+     * we also check the ancestor for that. If the peer is a virtual sink then
-+     * it does not have ancestor.
-+     */
-+    if (!portIsVirtual(peer)) {
-+        css_err_t ret = peer->getAncestor(&peerAncestor);
-+        if (ret != css_err_none) {
-+            LOGE("Failed to get peer's ancestor");
-+            return false;
-+        }
-+        ret = peerAncestor->getValue(GCSS_KEY_STREAM_ID, peerStreamId);
-+        if (ret != css_err_none) {
-+            LOGE("Failed to get stream ID of peer PG");
-+            return false;
-+        }
-+        /*
-+         * Retrieve the type of node the peer ancestor is. It could be is not a
-+         * program group node but a sink or hw block
-+         */
-+        peerAncestor->getValue(GCSS_KEY_TYPE, peerType);
-+    }
-+
-+    LOG1("%s port direction: %d, port stream id:%d, peer stream id:%d",
-+          __func__, portDirection, streamId, peerStreamId);
-+
-+    bool isEdge = false;
-+    if (portDirection == GraphConfigPipe::PORT_DIRECTION_INPUT) {
-+        /*
-+         *  input port,
-+         *  if the peer is a source or hw block then it is on the edge,
-+         *  or its stream id is 0 or -1.
-+         */
-+         isEdge = (peerType == string("hw") || peerStreamId == 0 || peerStreamId == -1);
-+    } else {
-+        /*
-+         *  output port,
-+         *  if the peer is a virtual port, or its stream id is 0 or -1,
-+         *  then it is on the edge,
-+         */
-+         isEdge = (portIsVirtual(peer) || peerStreamId == 0 || peerStreamId == -1);
-+    }
-+
-+    return isEdge;
-+}
-+
-+void GraphConfigPipe::dumpSettings() {
-+    mSettings->dumpNodeTree(mSettings, 2);
-+}
-+
-+GraphConfigPipe::Rectangle::Rectangle(): w(0), h(0), t(0), l(0) {}
-+GraphConfigPipe::SubdevPad::SubdevPad(): Rectangle(), mbusFormat(0) {}
-+GraphConfigPipe::SourceNodeInfo::SourceNodeInfo() : metadataEnabled(false),
-+                                                    interlaced(0) {}
-+}  // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
-new file mode 100644
-index 000000000000..b791ccac2670
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.h
-@@ -0,0 +1,326 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <gcss.h>
-+#include <ia_aiq.h>
-+#include <ia_isp_bxt_types.h>
-+#include <gcss_aic_utils.h>
-+
-+#include <string>
-+#include <memory>
-+#include <vector>
-+#include <map>
-+#include <set>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "src/platformdata/gc/IGraphConfig.h"
-+
-+#define NODE_NAME(x) (getNodeName(x).c_str())
-+
-+namespace icamera {
-+
-+/**
-+ * Stream id associated with the ISA PG that runs on Psys.
-+ */
-+static const int32_t PSYS_ISA_STREAM_ID = 60002;
-+
-+/**
-+ * \class SinkDependency
-+ *
-+ * This class is a container for sink dependency information for each virtual sink.
-+ * This information is useful to determine the connections that preceded the
-+ * virtual sink.
-+ * We do not go all the way up to the sensor (we could), we just store the
-+ * terminal id of the input port of the pipeline that serves a particular sink
-+ * (i.e. the input port of the video pipe or still pipe)
-+ */
-+class SinkDependency {
-+ public:
-+    SinkDependency(): sinkGCKey(0),
-+                      streamId(-1),
-+                      streamInputPortId(0),
-+                      peer(nullptr) {}
-+
-+    uid_t sinkGCKey;    /**< GCSS_KEY that represents a sink, like GCSS_KEY_VIDEO1 */
-+    int32_t streamId;   /**< (a.k.a pipeline id) linked to this sink (ex 60000) */
-+    uid_t streamInputPortId;     /**< 4CC code of that terminal */
-+    GCSS::GraphConfigNode *peer; /**< pointer to peer of this sink */
-+};
-+/**
-+ * \class GraphConfigPipe
-+ *
-+ * Reference and accessor to pipe configuration for specific request.
-+ *
-+ * In general case, at sream-config time there are multiple possible graphs.
-+ * Per each request there is additional intent that can narrow down the
-+ * possibilities to single graph settings: the GraphConfigPipe object.
-+ *
-+ * This class is instantiated by \class GraphConfigManager for each request,
-+ * and passed around HAL (control unit, capture unit, processing unit) via
-+ * shared pointers. The objects are read-only and owned by GCM.
-+ */
-+class GraphConfigPipe {
-+ public:
-+    typedef std::vector<int32_t> StreamsVector;
-+    typedef std::map<int32_t, int32_t> StreamsMap;
-+    typedef std::map<HalStream*, uid_t> StreamToSinkMap;
-+    static const int32_t PORT_DIRECTION_INPUT = 0;
-+    static const int32_t PORT_DIRECTION_OUTPUT = 1;
-+
-+ public:
-+    explicit GraphConfigPipe(int pipeUseCase);
-+    ~GraphConfigPipe();
-+
-+    void init(int32_t reqId);
-+    int getGraphId(void);
-+    void setActiveSinks(const std::vector<uid_t> &activeSinks);
-+    void setActiveStreamId(const std::vector<uid_t> &activeSinks);
-+    /*
-+     * Convert Node to GraphConfig interface
-+     */
-+    const GCSS::IGraphConfig* getInterface(Node *node) const;
-+    const GCSS::IGraphConfig* getInterface() const;
-+    ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
-+    int getProgramGroup(std::string pgName, ia_isp_bxt_program_group * programGroupForPG);
-+    status_t getGdcKernelSetting(uint32_t *kernelId, camera_resolution_t *resolution);
-+    const ia_isp_bxt_resolution_info_t *getKernelResolutionInfo(
-+                                                uint32_t streamId,
-+                                                uint32_t kernelId);
-+    bool hasStreamInGraph(int streamId);
-+    bool isKernelInStream(uint32_t streamId, uint32_t kernelId);
-+    status_t getPgIdForKernel(const uint32_t streamId, const int32_t kernelId,
-+                              int32_t *pgId);
-+    int32_t getTuningMode(int32_t streamId);
-+    status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
-+    status_t prepare(Node *settings, const StreamToSinkMap &streamToSinkIdMap);
-+    bool containPgs(std::vector<std::string> pgNames);
-+
-+   /*
-+    * Find distinct stream ids from the graph
-+    */
-+    status_t graphGetStreamIds(std::vector<int32_t> *streamIds);
-+    /*
-+     * Sink Interrogation methods
-+     */
-+    int32_t portGetStreamId(Node *port);
-+    /*
-+     * Stream Interrogation methods
-+     */
-+    status_t streamGetProgramGroups(int32_t streamId,
-+                                    NodesPtrVector *programGroups);
-+    /*
-+     * Port Interrogation methods
-+     */
-+    status_t portGetFullName(Node *port, std::string *fullName);
-+    status_t portGetPeer(Node *port, Node **peer);
-+    status_t portGetFormat(Node *port, IGraphType::PortFormatSettings *format);
-+    status_t portGetConnection(Node *port,
-+                               IGraphType::ConnectionConfig *connectionInfo,
-+                               Node **peerPort);
-+    status_t portGetClientStream(Node *port, HalStream **stream);
-+    int32_t portGetDirection(Node *port);
-+    bool portIsVirtual(Node *port);
-+    bool isPipeEdgePort(Node *port);  // TODO: should be renamed as portIsEdgePort
-+
-+    bool getSensorEmbeddedMetadataEnabled() const { return mMetaEnabled; }
-+    /*
-+     * Pipeline connection support
-+     */
-+    status_t pipelineGetConnections(
-+                        const std::string &sinkName,
-+                        int *streamId,
-+                        std::vector<IGraphType::PipelineConnection> *confVector);
-+    status_t portGetOwner(Node *port, IGraphType::ConnectionConfig *connectionInfo);
-+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
-+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+                                    std::vector<IGraphType::PipelineConnection> *confVector);
-+
-+    status_t getPgNames(std::vector<std::string>* pgNames);
-+    status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
-+
-+    /**
-+     * Get PG id by given PG name.
-+     * -1 will be returned if cannot find the valid PG id.
-+     */
-+    int getPgIdByPgName(std::string pgName);
-+
-+    /**
-+     * Get PG streamId by given PG name.
-+     * -1 will be returned if cannot find the valid PG id.
-+     */
-+    int getStreamIdByPgName(std::string pgName);
-+    /*
-+     * re-cycler static method
-+     */
-+    static void reset(GraphConfigPipe *me);
-+    void fullReset();
-+    /*
-+     * Debugging support
-+     */
-+    void dumpSettings();
-+    void dumpKernels(int32_t streamId);
-+    std::string getNodeName(Node *node);
-+    void getCSIOutputResolution(camera_resolution_t *reso) { *reso = mCsiOutput; }
-+
-+ private:
-+    struct ResolutionMemPool {
-+        std::vector<ia_isp_bxt_resolution_info_t *> resHistorys;
-+        std::vector<ia_isp_bxt_resolution_info_t *> resInfos;
-+    };
-+    /* Helper structures to access Sensor Node information easily */
-+    class Rectangle {
-+     public:
-+        Rectangle();
-+        int32_t w;  /*<! width */
-+        int32_t h;  /*<! height */
-+        int32_t t;  /*<! top */
-+        int32_t l;  /*<! left */
-+    };
-+    class SubdevPad: public Rectangle {
-+     public:
-+        SubdevPad();
-+        int32_t mbusFormat;
-+    };
-+    struct BinFactor {
-+        int32_t h;
-+        int32_t v;
-+    };
-+    struct ScaleFactor {
-+        int32_t num;
-+        int32_t denom;
-+    };
-+    union RcFactor {  // Resolution Changing factor
-+        BinFactor bin;
-+        ScaleFactor scale;
-+    };
-+    struct SubdevInfo {
-+        std::string name;
-+        SubdevPad in;
-+        SubdevPad out;
-+        RcFactor factor;
-+        SubdevInfo() {
-+            CLEAR(factor);
-+        }
-+    };
-+    class SourceNodeInfo {
-+     public:
-+        SourceNodeInfo();
-+        std::string name;
-+        std::string i2cAddress;
-+        std::string modeId;
-+        bool metadataEnabled;
-+        std::string csiPort;
-+        std::string nativeBayer;
-+        SubdevInfo tpg;
-+        SubdevInfo pa;
-+        SubdevInfo binner;
-+        SubdevInfo scaler;
-+        SubdevPad output;
-+        int32_t interlaced;
-+        std::string verticalFlip;
-+        std::string horizontalFlip;
-+        std::string link_freq;
-+    };
-+    status_t analyzeSourceType();
-+    status_t analyzeCSIOutput();
-+    void calculateSinkDependencies();
-+    void storeTuningModes();
-+    HalStream* getHalStreamByVirtualId(uid_t vPortId);
-+
-+    // Format options methods
-+    status_t getActiveOutputPorts(
-+            const StreamToSinkMap &streamToSinkIdMap);
-+    Node *getOutputPortForSink(const std::string &sinkName);
-+    status_t getSinkFormatOptions();
-+    status_t handleDynamicOptions();
-+    status_t setPortFormats();
-+    bool isVideoRecordPort(Node *sink);
-+    status_t getProgramGroupsByName(const std::vector<std::string> &pgNames,
-+                                    NodesPtrVector *programGroups);
-+    const ia_isp_bxt_resolution_info_t *getGdcKernelResolutionInfo(uint32_t *kernelId);
-+    const ia_isp_bxt_resolution_info_t *getScalerKernelResolutionInfo(uint32_t *kenerArray,
-+                                                                      uint32_t sizeArray);
-+    status_t getScalerKernelResolutionRatio(uint32_t *kenerArray,
-+                                            uint32_t sizeArray,
-+                                            float *widthRatio, float *heightRatio);
-+    status_t getScalerByStreamId(std::map<Node*,
-+                                 IGraphType::PipelineConnection> edgePort2Connection,
-+                                 std::vector<IGraphType::ScalerInfo> *scalerInfo);
-+
-+ private:
-+    GCSS::GraphConfigNode *mSettings;
-+    int32_t mReqId;
-+    std::map<int32_t, ia_isp_bxt_program_group> mProgramGroup;
-+    GCSS::BxtAicUtils mGCSSAicUtil;
-+
-+    bool mMetaEnabled;  // indicates if the specific sensor provides sensor
-+                        // embedded metadata
-+    enum SourceType {
-+        SRC_NONE = 0,
-+        SRC_SENSOR,
-+        SRC_TPG,
-+    };
-+    SourceType mSourceType;
-+    camera_resolution_t mCsiOutput;
-+    std::string mSourcePortName;  // Sensor or TPG port name
-+
-+    /**
-+     * pre-computed state done *per request*.
-+     * This map holds the terminal id's of the ISA's peer ports (this is
-+     * the terminal id's of the input port of the video or still pipe)
-+     * that are required to fulfill a request.
-+     * Ideally this gets initialized during init() call.
-+     * But for now the GcManager will set it via a private method.
-+     * we use a map so that we can handle the case when a request has 2 buffers
-+     * that are generated from the same pipe.
-+     */
-+    std::map<uid_t, uid_t> mIsaActiveDestinations;
-+    std::set<int32_t> mActiveStreamId;
-+    /**
-+     * vector holding one structure per virtual sink that stores the stream id
-+     * (pipeline id) associated with it and the terminal id of the input port
-+     * of that stream.
-+     * This vector is updated once per stream config.
-+     */
-+    std::vector<SinkDependency> mSinkDependencies;
-+    /**
-+     * vector holding the peers to the sink nodes. Map contains pairs of
-+     * {sink, peer}.
-+     * This map is filled at stream config time.
-+     */
-+    std::map<Node*, Node*> mSinkPeerPort;
-+    /**
-+     *copy of the map provided from GraphConfigManager to be used internally.
-+     */
-+    StreamToSinkMap mStreamToSinkIdMap;
-+    std::map<std::string, int32_t> mIsaOutputPort2StreamId;
-+    /**
-+     * Map of tuning modes per stream id
-+     * Key: stream id
-+     * Value: tuning mode
-+     */
-+    std::map<int32_t, int32_t> mStream2TuningMap;
-+    int mPipeUseCase;
-+
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfigPipe);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
-new file mode 100644
-index 000000000000..cb1459fc2fb8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/css_types.h
-@@ -0,0 +1,61 @@
-+/*
-+ * INTEL CONFIDENTIAL
-+ * Copyright (c) 2013-2017 Intel Corporation. All Rights Reserved.
-+ *
-+ * The source code contained or described herein and all documents related to
-+ * the source code ("Material") are owned by Intel Corporation or its suppliers
-+ * or licensors. Title to the Material remains with Intel Corporation or its
-+ * suppliers and licensors. The Material contains trade secrets and proprietary
-+ * and confidential information of Intel or its suppliers and licensors. The
-+ * Material is protected by worldwide copyright and trade secret laws and
-+ * treaty provisions. No part of the Material may be used, copied, reproduced,
-+ * modified, published, uploaded, posted, transmitted, distributed, or
-+ * disclosed in any way without Intel's prior express written permission.
-+ *
-+ * No license under any patent, copyright, trade secret or other intellectual
-+ * property right is granted to or conferred upon you by disclosure or delivery
-+ * of the Materials, either expressly, by implication, inducement, estoppel or
-+ * otherwise. Any license under such intellectual property rights must be
-+ * express and approved by Intel in writing.
-+ */
-+
-+#ifndef __CSS_TYPES_H__
-+#define __CSS_TYPES_H__
-+
-+#include <stdint.h>
-+#include <stdbool.h>
-+
-+/*!
-+ * \brief Error codes.
-+ * \ingroup ia_tools
-+*/
-+typedef int32_t css_err_t;
-+#define css_err_none     0         /*!< No errors*/
-+#define css_err_general  (-(1 << 1))  /*!< General error*/
-+#define css_err_nomemory (-(1 << 2))  /*!< Out of memory*/
-+#define css_err_data     (-(1 << 3))  /*!< Corrupted data*/
-+#define css_err_internal (-(1 << 4))  /*!< Error in code*/
-+#define css_err_argument (-(1 << 5))  /*!< Invalid argument for a function*/
-+#define css_err_noentry  (-(1 << 6))  /*!< No such entry/entity/file */
-+#define css_err_timeout  (-(1 << 7))  /*!< Time out*/
-+#define css_err_end      (-(1 << 8))  /*!< End of values*/
-+#define css_err_full     (-(1 << 9))  /*!< Exchange full */
-+#define css_err_again    (-(1 << 10)) /*!< Operation requires additional call */
-+#define css_err_nimpl    (-(1 << 11)) /*!< Not implemented */
-+
-+#ifndef __cplusplus
-+
-+/* Define bool type as int for strict C89 */
-+#ifndef __bool_true_false_are_defined
-+#define bool int
-+#define false 0
-+#define true 1
-+#endif
-+
-+/* inline keyword compliance for ansi */
-+#if (__STDC_VERSION__ < 199901L)
-+#define inline
-+#endif
-+
-+#endif  /* __cplusplus */
-+#endif  /* _CSS_TYPES_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
-new file mode 100644
-index 000000000000..9ae7f7e28de5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr.h
-@@ -0,0 +1,142 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPR_H_
-+#define _IA_CIPR_H_
-+
-+/**
-+ * TODO: split & get rid of ia_tools
-+ */
-+#include "modules/ia_cipr/include/css_types.h"
-+
-+/** \file ia_cipr.h
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * Common API for Camera Imaging Platform Runtime features
-+ *
-+ * Includes qyery functions with semantics derived from OpenCL Platform Layer.
-+ */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef uint8_t ia_cipr_platform_id_t;
-+typedef uint8_t ia_cipr_device_id_t;
-+typedef uint8_t ia_cipr_device_type_t;
-+
-+typedef enum {
-+    cipr_platform_info_key_na
-+} ia_cipr_platform_info_key_t;
-+
-+typedef enum {
-+    cipr_device_info_key_na
-+} ia_cipr_device_info_key_t;
-+
-+typedef struct _cipr_context* ia_cipr_context_t;
-+
-+/**
-+ * Create and initialize CIPR context
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \return cipr context struct
-+ */
-+ia_cipr_context_t ia_cipr_create(void);
-+
-+/**
-+ * Destroy and deinitialize CIPR context
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \param[in] cipr context struct
-+ */
-+void ia_cipr_destroy(ia_cipr_context_t ctx);
-+
-+/**
-+ * Qyery available platform IDs
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \param[in]   num_entries   number of platform id elements that can be stored
-+ *                            in \p platforms.
-+ * \param[out]  platforms     returns a list of platform IDs available.
-+ * \param[out]  num_platforms returns the number of IDs stored in \p
-+ *                            platforms.
-+ */
-+css_err_t ia_cipr_get_platform_ids(uint32_t num_entries,
-+                                  ia_cipr_platform_id_t *platforms,
-+                                  uint32_t *num_platforms);
-+
-+/**
-+ * Query platform info
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \param[in]   platform      platform ID to query
-+ * \param[in]   key           key for information to query
-+ * \param[in]   value_size    storage size in bytes for \p value
-+ * \param[out]  value         pointer where to store the info
-+ * \param[out]  ret_value_size returns size in bytes written to \p value
-+ */
-+css_err_t ia_cipr_get_platform_info(ia_cipr_platform_id_t platform,
-+                                   ia_cipr_platform_info_key_t key,
-+                                   uint32_t value_size,
-+                                   void *value,
-+                                   uint32_t *ret_value_size);
-+
-+/**
-+ * Qyery available device IDs from platform
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \param[in]   platform      platform ID to query
-+ * \param[in]   device_type   bitfield for device types to query
-+ * \param[in]   num_entries   number of platform id elements that can be stored
-+ *                            in \p platforms.
-+ * \param[out]  devices       a list of device IDs available in platform
-+ * \param[out]  num_devices   returns the number of IDs stored in \p
-+ *                            platforms.
-+ */
-+css_err_t ia_cipr_get_device_ids(ia_cipr_platform_id_t platform,
-+                                ia_cipr_device_type_t device_type,
-+                                uint32_t num_entries,
-+                                ia_cipr_device_id_t *devices,
-+                                uint32_t *num_devices);
-+
-+/**
-+ * Query device info
-+ *
-+ * \ingroup ia_cipr
-+ *
-+ * \param[in]   device        device ID to query
-+ * \param[in]   key           key for information to query
-+ * \param[in]   value_size    storage size in bytes for \p value
-+ * \param[out]  value         pointer where to store the info
-+ * \param[out]  ret_value_size returns size in bytes written to \p value
-+ */
-+css_err_t ia_cipr_get_device_info(ia_cipr_device_id_t device,
-+                                 ia_cipr_device_info_key_t key,
-+                                 uint32_t value_size,
-+                                 void *value,
-+                                 uint32_t *ret_value_size);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* _IA_CIPR_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
-new file mode 100644
-index 000000000000..535a83de8bc1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_alloc.h
-@@ -0,0 +1,152 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef IA_CIPR_ALLOC_H_
-+#define IA_CIPR_ALLOC_H_
-+
-+#include <stdlib.h>
-+
-+/** \file ia_cipr_alloc.h
-+ *
-+ * \brief posix compatible host memory allocation API
-+ */
-+
-+#ifdef RNDBUILD
-+#define IACIPR_FUNC __func__
-+#define IACIPR_FILE __FILE__
-+#define IACIPR_LINE __LINE__
-+#else
-+#define IACIPR_FUNC ""
-+#define IACIPR_FILE ""
-+#define IACIPR_LINE 0
-+#endif
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * wrapper-macro for getting page size.
-+ *
-+ * Note: This is only code style addition to be used with
-+ * _ALLOC_ALIGNED-macro:
-+ * * IA_CIPR_ALLOC_ALIGNED(size, IA_CIPR_PAGESIZE())
-+ */
-+#define IA_CIPR_PAGESIZE() \
-+    ia_cipr_pagesize()
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * malloc wrapper-macro. Logs the caller among other things.
-+ */
-+#define IA_CIPR_MALLOC(size) \
-+    ia_cipr_malloc(size, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * calloc wrapper-macro. Logs the caller among other things.
-+ */
-+#define IA_CIPR_CALLOC(nmemb, size) \
-+    ia_cipr_calloc(nmemb, size, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * alloc_aligned wrapper-macro. Logs the caller among other things.
-+ */
-+#define IA_CIPR_ALLOC_ALIGNED(size, alignment) \
-+    ia_cipr_alloc_aligned(size, alignment, IACIPR_FUNC, IACIPR_FILE, IACIPR_LINE)
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * free wrapper-macro. Logs the caller among other things.
-+ */
-+#define IA_CIPR_FREE(ptr) \
-+    ia_cipr_free(ptr, IACIPR_FUNC)
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ * memcpy wrapper-macro.
-+ */
-+#define IA_CIPR_MEMCOPY(dest, dest_size, src, n) \
-+    ia_cipr_memcopy(dest, dest_size, src, n)
-+
-+/**
-+ * \ingroup ia_cipr_memory
-+ */
-+size_t ia_cipr_pagesize(void);
-+
-+/**
-+ * \param size as in malloc
-+ * \param logmsg entered by macro IA_CIPR_MALLOC. The caller function.
-+ * \ingroup ia_cipr_memory
-+ */
-+void* ia_cipr_malloc(size_t size,
-+                     const char *logmsg,
-+                     const char *file_name,
-+                     int line);
-+
-+/**
-+ * \param nmemb as in calloc
-+ * \param size as in calloc
-+ * \param logmsg entered by macro IA_CIPR_CALLOC. The caller function.
-+ * \ingroup ia_cipr_memory
-+ */
-+void* ia_cipr_calloc(size_t nmemb,
-+                     size_t size,
-+                     const char *logmsg,
-+                     const char *file_name,
-+                     int line);
-+
-+/** Allocate aligned memory (as defined in posix_memalign())
-+ *
-+ * Returns pointer to free()'able memory or zero.
-+ *
-+ * \param size as in malloc
-+ * \param alignment as in posix_memalign
-+ * \param logmsg entered by macro IA_CIPR_CALLOC. The caller function.
-+ * \ingroup ia_cipr_memory
-+ */
-+void* ia_cipr_alloc_aligned(size_t size,
-+                            size_t alignment,
-+                            const char *logmsg,
-+                            const char *file_name,
-+                            int line);
-+
-+/**
-+ * \param *ptr as in free
-+ * \param logmsg entered by macro IA_CIPR_FREE. The caller function.
-+ * \ingroup ia_cipr_memory
-+ */
-+void ia_cipr_free(void *ptr, const char *logmsg);
-+
-+/**
-+ * \param dest as in memcpy
-+ * \param dest_size as in memcpy_s, max number of bytes to modify in destination
-+ * \param src as in memcpy
-+ * \param n as in memcpy
-+ * \ingroup ia_cipr_memory
-+ */
-+void ia_cipr_memcopy(void *dest,
-+                     size_t dest_size,
-+                     const void *src,
-+                     size_t n);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* IA_CIPR_ALLOC_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
-new file mode 100644
-index 000000000000..fbb8455647e9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory.h
-@@ -0,0 +1,210 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPR_MEMORY_H_
-+#define _IA_CIPR_MEMORY_H_
-+
-+/** \file ia_cipr_memory.h
-+ *
-+ * Tentative CIPR Memory Header
-+ *
-+ * \defgroup ia_cipr_memory Memory
-+ * \ingroup ia_cipr
-+ *
-+ * \brief CIPR Memory module defines an abstract buffer object
-+ * ia_cipr_buffer_t that stores data in contiguos memory region. A memory API
-+ * is defined to allow platform implementations to either implicitly or
-+ * explicitly define when the memory being allocated resides in one of the
-+ * supported devices address space of CIPR and when memory is represented with
-+ * implementation defined shared memory handle.
-+ *
-+ * Migrating ia_cipr_buffer_t from device to another shall be supported by
-+ * device interfaces in CIPR. While performing migration, the device agent is
-+ * allowed to alter the information associated with the buffer object.
-+ *
-+ * First device receiving newly created ia_cipr_buffer_t object is responsible
-+ * of carrying out the allocation for host pointer when requested with
-+ * IA_CIPR_DEVICE_MEMORY_ALLOCATE_CPU_PTR flag.
-+ *
-+ * Buffer object also supports user provided and pre-allocated memory. With
-+ * ia_cipr_buffer_create-function, user can provide ia_cipr_memory_t
-+ * descriptor with either host pointer or implementation defined handle.
-+ * Typically, implementation defined handle means OS specific shared memory
-+ * that device agents may choose to support.
-+ *
-+ * Buffer object that is flagged _HW_ONLY is considered "virtual" and does
-+ * not have accessible memory for host.
-+ *
-+ * Mapping operations are implicitly handled by device agents performing
-+ * operations on data. Device agents are also responsible of data integrity
-+ * and are allowed to provide different barriers depending on supported
-+ * granularity.
-+ */
-+
-+/**
-+ * Give indirect dependency for ia_cipr_memory user to our pure posix
-+ * compatible host memory allocation API.
-+ */
-+#include "modules/ia_cipr/include/ia_cipr.h"
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * Opaque ia_cipr_buffer_t-object
-+ *
-+ * \ingroup ia_cipr
-+ */
-+typedef struct _cipr_buffer ia_cipr_buffer_t;
-+
-+/**
-+ * Memory bitfield definitions to specify type, allocation and usage
-+ */
-+typedef uint32_t ia_cipr_memory_flags_t;
-+#define IA_CIPR_MEMORY_CPU_PTR              (uint32_t)(1 << 0)
-+#define IA_CIPR_MEMORY_HANDLE               (uint32_t)(1 << 1)
-+#define IA_CIPR_MEMORY_ALLOCATE_CPU_PTR     (uint32_t)(1 << 2)
-+#define IA_CIPR_MEMORY_COPY_FROM_USER       (uint32_t)(1 << 3)
-+#define IA_CIPR_MEMORY_HW_ONLY              (uint32_t)(1 << 4)
-+#define IA_CIPR_MEMORY_READ_ONLY            (uint32_t)(1 << 5)
-+#define IA_CIPR_MEMORY_WRITE_ONLY           (uint32_t)(1 << 6)
-+#define IA_CIPR_MEMORY_UNCACHED             (uint32_t)(1 << 7)
-+#define IA_CIPR_MEMORY_ALLOC_UNINITIALIZED  (uint32_t)(1 << 8)
-+#define IA_CIPR_MEMORY_SECURED              (uint32_t)(1 << 9)
-+#define IA_CIPR_MEMORY_CPU_ONLY             (uint32_t)(1 << 10)
-+#define IA_CIPR_MEMORY_FLUSH_CPU_CACHE      (uint32_t)(1 << 11)
-+
-+/**
-+ * Memory bitfield definitions for memory state
-+ */
-+#define IA_CIPR_MEMORY_ALLOCATED            (uint32_t)(1 << 13)
-+#define IA_CIPR_MEMORY_FROM_USER            (uint32_t)(1 << 14)
-+#define IA_CIPR_MEMORY_MIGRATED             (uint32_t)(1 << 15)
-+
-+/**
-+ * Device specific implementations in CIPR are allowed to extend memory
-+ * bitfields within their own headers respectively.
-+ *
-+ * All CIPR device specific implementations in a single platform are together
-+ * responsible of integrity.
-+ */
-+#define IA_CIPR_MEMORY_DEVICE_MASK       (uint32_t)0xFFFF0000
-+#define IA_CIPR_MEMORY_DEVICE_FLAG(x)    (uint32_t)(x << 16)
-+
-+/**
-+ * Datatype to represent cipr memory to host.
-+ */
-+typedef struct {
-+        uint32_t size;              /**< size in bytes */
-+        void    *cpu_ptr;           /**< host pointer to allocated data */
-+        uint64_t handle;  /**< implementation defined handle to allocated data */
-+        /**< bitfield specifying allocation and usage information */
-+        ia_cipr_memory_flags_t flags;
-+        ia_cipr_buffer_t *anchor;    /**< anchor to origin buffer object */
-+} ia_cipr_memory_t;
-+
-+/**
-+ * Create specified CIPR buffer object
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   size    amount of memory in bytes
-+ * \param[in]   flags   memory flags for new object
-+ * \param[in]   user_memory  optional user memory to create the buffer from
-+ */
-+ia_cipr_buffer_t*
-+ia_cipr_buffer_create(uint32_t size,
-+                      ia_cipr_memory_flags_t flags,
-+                      ia_cipr_memory_t *user_memory);
-+
-+/**
-+ * Create CIPR sub-buffer object
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   parent buffer object owning the store for the region
-+ * \param[in]   offset offset to start of the region in parent buffer store
-+ * \param[in]   size size of the region
-+ */
-+ia_cipr_buffer_t*
-+ia_cipr_buffer_create_region(ia_cipr_buffer_t *parent,
-+                             uint32_t offset,
-+                             uint32_t size);
-+
-+/**
-+ * Identify if CIPR buffer is of region type
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   parent buffer object
-+ */
-+bool ia_cipr_buffer_is_region(ia_cipr_buffer_t *buffer);
-+
-+/**
-+ * Get CIPR region buffer parent object
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   buffer region buffer object
-+ */
-+ia_cipr_buffer_t* ia_cipr_buffer_get_parent(ia_cipr_buffer_t *buffer);
-+
-+/**
-+ * Allocate memory described by buffer object
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   buffer  buffer object
-+ */
-+css_err_t
-+ia_cipr_buffer_allocate(ia_cipr_buffer_t *buffer);
-+
-+/**
-+ * Get memory accessor and flags of buffer object
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   buffer  buffer object
-+ * \param[out]  memory  host memory access information
-+ */
-+css_err_t
-+ia_cipr_buffer_get_memory(ia_cipr_buffer_t *buffer,
-+                          ia_cipr_memory_t *memory);
-+
-+/**
-+ * Get memory device identifier
-+ *
-+ * \ingroup ia_cipr_memory
-+ *
-+ * \param[in]   buffer  buffer object
-+ */
-+ia_cipr_device_id_t
-+ia_cipr_buffer_get_device_id(ia_cipr_buffer_t *buffer);
-+
-+/**
-+ * Destroy buffer object
-+ *
-+ * \ingroup ia_cipr_memory
-+ */
-+void ia_cipr_buffer_destroy(ia_cipr_buffer_t *buf);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* _IA_CIPR_MEMORY_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
-new file mode 100644
-index 000000000000..91e78fee574d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_memory_device.h
-@@ -0,0 +1,56 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPR_MEMORY_DEVICE_H_
-+#define _IA_CIPR_MEMORY_DEVICE_H_
-+
-+#include "modules/ia_cipr/include/ia_cipr_memory.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * \file ia_cipr_memory_device.h
-+ *
-+ * \brief Tentative definition for memory device interface abstraction
-+ *
-+ * \defgroup ia_cipr_memory_device Memory Device
-+ * \ingroup ia_cipr_memory
-+ */
-+typedef struct _cipr_memory_device_ops  ia_cipr_memory_device_t;
-+
-+/**
-+ * Migrate buffer object with specific memory device
-+ *
-+ * This function lets user to associate in which device address space the
-+ * memory of buffer resides. Actual memory operations done depend on
-+ * allocation and usage information given to \p buffer.
-+ *
-+ * \ingroup ia_cipr_memory_device
-+ *
-+ * \param[in]   memory_device   interface handle of specific memory device
-+ * \param[in]   buffer          buffer object to associate
-+ */
-+css_err_t
-+ia_cipr_memory_device_migrate_buffer(ia_cipr_memory_device_t *memory_device,
-+                                     ia_cipr_buffer_t *buffer);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* _IA_CIPR_MEMORY_DEVICE_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
-new file mode 100644
-index 000000000000..083a37488586
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ia_cipr_psys.h
-@@ -0,0 +1,495 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/** \file ia_cipr_psys.h
-+ *
-+ * CIPR PSYS Command Queue device header
-+ *
-+ * \defgroup ia_cipr_command_queue_device Command Queue Device
-+ * \ingroup ia_cipr
-+ * \brief Command Queue Device abstraction module exists only in documentation
-+ * since there is only PSYS command queue device supported in CIPR.
-+ * \see ia_cipr_psys.
-+ *
-+ * \defgroup ia_cipr_psys Processing System (PSYS)
-+ * \ingroup ia_cipr_command_queue_device
-+ * \brief CIPR PSYS implements command queue interface on top of IPU
-+ * processing system hardware. Interface calls are used to manage compute
-+ * on IPU in atomic units of execution. Each command includes memory objects
-+ * dealt opaquely as indexed array of ia_cipr_buffer_t's.
-+ *
-+ * CIPR PSYS command queue lies on top of low level scheduler that manages
-+ * work from multiple queues of concurrent CIPR clients. Semantics of the
-+ * array and data transmission between compute kernels and CIPR clients is
-+ * further specified by IPU firmware architecture.
-+ *
-+ * \note Current datatypes for the command specification are tentative and
-+ *       expose naming conventions derived from firmware architecture, namely
-+ *       program group manifest and parameters. These are specific to
-+ *       existing IPU4 implementation and subject to change. Conceptually
-+ *       CIPR command is a bundle of buffers that may consist of both memory
-+ *       and program objects.
-+ */
-+
-+#ifndef _IA_CIPR_PSYS_H_
-+#define _IA_CIPR_PSYS_H_
-+
-+#include "modules/ia_cipr/include/css_types.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * CIPR Device ID definition for PSYS device
-+ */
-+#define CIPR_DEVICE_PSYS    (ia_cipr_device_id_t)0xFE
-+
-+/**
-+ * CIPR PSYS initialization flags
-+ * CIPR_PSYS_INIT_FLAG_NONE: normal situation, empty flag
-+ * CIPR_PSYS_INIT_FLAG_DEBUG: initialize cipr in debug
-+ * mode. All cipr frame buffers can get a cpu_ptr in
-+ * debug mode even for HW_ONLY flag buffer
-+ */
-+#define CIPR_PSYS_INIT_FLAG_NONE  (0 << 0)
-+#define CIPR_PSYS_INIT_FLAG_DEBUG (1 << 0)
-+
-+/**
-+ * CIPR Memory device flags
-+ */
-+#ifndef IA_CIPR_MEMORY_NO_FLUSH
-+#define IA_CIPR_MEMORY_NO_FLUSH IA_CIPR_MEMORY_DEVICE_FLAG(1)
-+#endif
-+/** Memory device flag to indicate that buffer uses versioned API datatype
-+ * defined in this header.
-+ * \todo this is used for backward compliance and can be removed once legacy
-+ *       support is dropped.
-+ */
-+#define IA_CIPR_MEMORY_PSYS_API IA_CIPR_MEMORY_DEVICE_FLAG(1<<15)
-+
-+typedef uint32_t ia_cipr_psys_init_flags_t;
-+
-+/**
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct _psys_context* ia_cipr_psys_context_t;
-+
-+/**
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct _psys_command* ia_cipr_psys_command_t;
-+
-+/**
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct _psys_event* ia_cipr_psys_event_t;
-+
-+/**
-+ * Configuration of event object
-+ *
-+ * !DEPRECATION WARNING!
-+ *
-+ * This API has been ambiguous and has caused technical debt. Only user
-+ * configuration of event object is the timeout-field. The rest are fields
-+ * set by the CIPR implementation in ia_cipr_psys_wait_for_event() as
-+ * operation consuming an event from events queue.
-+ *
-+ * Original documentation allows user to specify issue_id to associate a
-+ * blocking call for a specific command issued. This feature was never
-+ * utilized in client code, but has been misunderstood in CIPR implementation
-+ * for Windows - which expects CIPR client to relay association between
-+ * command and event object.
-+ *
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct ia_cipr_psys_event_config {
-+    uint32_t type;      /* TODO create enums for this?*/
-+    uint64_t id; /*!< DEPRECATED */
-+    uint64_t command_token; /*!< Token of command the event is associated with */
-+    uint64_t command_issue_id; /*!< Issue id of command the event is associated with */
-+    /* !< Bitmap of buffer indexes in associated command of which ownership
-+      is passed back to user with this event */
-+    uint64_t buffer_handover_bitmap;
-+    uint32_t error; /*!< Error code in case error occured with associated command */
-+    int32_t timeout; /*!< How long to wait for event before timing out */
-+} ia_cipr_psys_event_config_t;
-+
-+/**
-+ * Command instructions extension buffer
-+ *
-+ * With IPU5 process group has evolved from atomic execution unit into a
-+ * persistent stream processor. It is no longer covering all information needed
-+ * as per command transaction unit from host to embedded processor(s). This
-+ * information needed with persistent process group is also not considered
-+ * final.
-+ *
-+ * Command instructions extension is tentative way to support implementation
-+ * defined versions of per command transaction unit used. Extension
-+ * datatypes defined accordingly must use IA_CIPR_MEMORY_PSYS_API flag to
-+ * indicate that data starts with header defined below. Legacy extension buffer
-+ * is of datatype ia_css_program_group_param_t and must NOT use the flag.
-+ *
-+ * Ideally command types, programs and payload buffers should be enough to
-+ * specify all transactions and operations between CIPR client and embedded
-+ * processors as well as memory primitives, special instructions to control
-+ * low-level scheduler or other attributes of IPU device driver. This approach
-+ * would mimic OpenCL more closely. However, process group and payload buffers
-+ * have special purpose specified in IPU firmware architecture. CIPR avoids
-+ * to overspecify and instead reflects the programmability that exists as
-+ * direct as possible reflected with the key design princible to keep IPU as
-+ * general-purpose command based device.
-+ *
-+ * \todo device attributes query may be used to determine whether extension
-+ *       datatype buffer should be migrated to device (mapped to kernel/ipu
-+ *       address space).
-+ *
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef enum _cmd_ext {
-+    psys_command_ext_na,
-+    psys_command_ext_ppg_0,
-+    psys_command_ext_ppg_1
-+} ia_cipr_psys_cmd_ext_version_t;
-+
-+typedef struct _cmd_ext_header_s {
-+    uint32_t offset; /*!< sizeof(ia_cipr_psys_cmd_ext_header_t) */
-+    uint64_t size; /*!< sizeof buffer carrying the header */
-+    /* !< one of the valid versions from ia_cipr_psys_cmd_ext_version_t */
-+    ia_cipr_psys_cmd_ext_version_t version;
-+} ia_cipr_psys_cmd_ext_header_t;
-+
-+/**
-+ * Persistent process group command extension
-+ *
-+ * Complies with _cmd_ext_header_s::version == psys_command_ext_ppg_0
-+ *
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct ia_cipr_process_group_command_s {
-+    ia_cipr_psys_cmd_ext_header_t header;
-+    uint8_t frame_counter; /*!< Frame synchronization index */
-+    uint8_t queue_id;      /*!< Queue index to use as offset from base in process group */
-+    uint16_t fragment_state; /*!< Fragment of process group to process with command */
-+    /*!< Partial completion events enable bits per terminal. Non-zero for plain command
-+       completion, when partial events not supported */
-+    uint64_t event_req_bitmap;
-+    uint64_t irq_req_bitmap; /*!< Request interrupt on events enabled by event request bitmap */
-+    uint32_t dynamic_kernel_bitmap[4]; /*!< pass dynamic keb to cipr */
-+} ia_cipr_process_group_command_t;
-+
-+/**
-+*  PPG command type
-+*
-+*  Enumeration to specify the different persistent program group commands.
-+*  Used in the ID field of the command config.
-+*/
-+typedef enum _ppg_cmd_type {
-+    ppg_cmd_start,
-+    ppg_cmd_enqueue,
-+    ppg_cmd_stop,
-+    ppg_cmd_stop_eos
-+} ia_cipr_ppg_cmd_type_t;
-+
-+/**
-+ * User configuration of command object
-+ *
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct ia_cipr_psys_command_config {
-+    uint64_t id; /*!< PPG command type */
-+    uint64_t token; /*!< User token (responce events associated) */
-+    uint64_t issue_id; /*!< Issued command identifier(responce events associated) */
-+    uint32_t priority; /*!< Queue priority to use when at head */
-+    uint32_t psys_frequency; /*!< Frequency to apply when interpret */
-+    uint32_t bufcount; /*!< Number of buffers with command */
-+    ia_cipr_buffer_t **buffers; /*!< Buffers array */
-+    ia_cipr_buffer_t *ext_buf; /*!< Command extension buffer */
-+    ia_cipr_buffer_t *pg_params_buf; /*!< DEPRECATED */
-+    /*!< Copy of program group manifest of which the process group in command is assembled */
-+    ia_cipr_buffer_t *pg_manifest_buf;
-+    /*!< Process group to execute with command. Note: With persistent protocol,
-+      after successful start command, this reflects a read only trasaction unit
-+      associated with started process group */
-+    ia_cipr_buffer_t *pg;
-+} ia_cipr_psys_command_config_t;
-+
-+#define CIPR_PSYS_CAP_DRIVER_FIELD_LENGTH        20
-+#define CIPR_PSYS_CAP_DEVMODEL_FIELD_LENGTH      32
-+
-+/**
-+ * \ingroup ia_cipr_psys
-+ */
-+typedef struct ia_cipr_psys_capability_s {
-+    uint32_t version;
-+    uint8_t driver[CIPR_PSYS_CAP_DRIVER_FIELD_LENGTH];
-+    uint8_t dev_model[CIPR_PSYS_CAP_DEVMODEL_FIELD_LENGTH];
-+    uint32_t program_group_count;
-+} ia_cipr_psys_capability_t;
-+
-+/**
-+ * Create PSYS context
-+ *
-+ * Returns handle to PSYS context that can be used to access
-+ * ia_cipr_psys interface. Single command queue gets created
-+ * per each create and following functions are bound to this
-+ * queue:
-+ *
-+ * ia_cipr_psys_queue_command()
-+ *
-+ * ia_cipr_psys_wait_for_event()
-+ *
-+ * The rest of interface operations are independent from the
-+ * queue and for example the buffer objects are interchangeable
-+ * between the contexts of the same process. For memory sharing
-+ * between processes, per process ia_cipr_buffer_t object needs
-+ * to be used in combination with shared memory handle.
-+ *
-+ * \see ia_cipr_memory
-+ *
-+ * \ingroup ia_cipr_psys
-+ */
-+ia_cipr_psys_context_t ia_cipr_psys_create_context(ia_cipr_context_t cipr_ctx);
-+
-+/**
-+ * Destroy PSYS context
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ */
-+
-+void ia_cipr_psys_destroy_context(ia_cipr_psys_context_t ctx);
-+
-+/**
-+ * Get CIPR Memory device handle
-+ *
-+ * Returns ia_cipr_memory_device_t handle that can be used
-+ * with CIPR Memory interface for memory primitives offered
-+ * by the device.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ */
-+ia_cipr_memory_device_t*
-+ia_cipr_psys_get_memory_device(ia_cipr_psys_context_t ctx);
-+
-+/**
-+ * Get CIPR device capabilities
-+ *
-+ * Fills ia_cipr_psys_capability_t with information supported by the
-+ * device.
-+ *
-+ * \todo make this direct query of capability info data, having separate
-+ *       _config_t does not make sense.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ * \param[out] capability pointer to ia_cipr_psys_capability_t
-+ */
-+css_err_t ia_cipr_psys_get_capabilities(ia_cipr_psys_context_t ctx,
-+                                       ia_cipr_psys_capability_t *capability);
-+
-+/**
-+ * Get Program Group manifest
-+ *
-+ * Fills ia_css_program_group_manifest_t for given index.
-+ * Needs to be used to query size of the manifest first using NULL as manifest
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ * \param[in] index index of the manifest in platform
-+ * \param[in,out] size_of_manifest pointer to the size of manifest
-+ *                                 gets filled with correct size in case
-+ *                                 \manifest is NULL.
-+ * \param[in,out] manifest pointer to memory to hold the manifest
-+ */
-+css_err_t ia_cipr_psys_get_manifest(ia_cipr_psys_context_t ctx,
-+                                   uint32_t index,
-+                                   uint32_t *manifest_size,
-+                                   void *manifest);
-+
-+/**
-+ * Queue compute command for PSYS execution
-+ *
-+ * Places the command object in queue to be scheduled and executed
-+ * asynchronously in the PSYS device. Completion of each command issued
-+ * can be tracked with ia_cipr_psys_wait_for_event() using issue-id's.
-+ *
-+ * \todo introduce bitflags to control wakeup events.
-+ *       wakeup control flag can be used also for bundling commands for
-+ *       the l-scheduler.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ * \param[in] cmd ia_cipr_psys_command_t object
-+ */
-+css_err_t ia_cipr_psys_queue_command(ia_cipr_psys_context_t ctx,
-+                                    ia_cipr_psys_command_t cmd);
-+/**
-+ * Cancel compute command
-+ *
-+ * Cancels the compute command or removes the corresponding command
-+ * from command queue in case the command didn't reach execution.
-+ *
-+ * \note Canceling command that has reached execution introduces
-+ *       device dependent latencies. Currently not supported.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ * \param[in] cmd ia_cipr_psys_command_t object
-+ */
-+css_err_t ia_cipr_psys_cancel_command(ia_cipr_psys_context_t ctx,
-+                                     ia_cipr_psys_command_t cmd);
-+/**
-+ * Wait for specific command completion
-+ *
-+ * Returns after the command specified by ia_cipr_psys_event_t
-+ * completes or there was an error in execution.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param ctx ia_cipr_psys_context_t handle
-+ * \param[in,out] event ia_cipr_psys_event_t object
-+ */
-+css_err_t ia_cipr_psys_wait_for_event(ia_cipr_psys_context_t ctx,
-+                                     ia_cipr_psys_event_t event);
-+
-+/**
-+ * Create PSYS event object
-+ *
-+ * Returns ia_cipr_psys_event_t object handle. Object is created based on
-+ * ia_cipr_psys_event_config_t specification and can be further used with
-+ * ia_cipr_psys_wait_for_event()
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param[in] cfg ia_cipr_psys_event_config_t event config specification
-+ */
-+ia_cipr_psys_event_t
-+ia_cipr_psys_create_event(ia_cipr_psys_event_config_t *cfg);
-+
-+/**
-+ * Destroy PSYS event object
-+ *
-+ * \ingroup ia_cipr_psys
-+ * \param[in] event event object handle
-+ */
-+void ia_cipr_psys_destroy_event(ia_cipr_psys_event_t event);
-+
-+/**
-+ * Read event config specification from event object
-+ *
-+ * \ingroup ia_cipr_psys
-+ * \param[in] event event object handle
-+ * \param[in] cfg ia_cipr_psys_event_config_t
-+ */
-+css_err_t
-+ia_cipr_psys_get_event_config(ia_cipr_psys_event_t event,
-+                              ia_cipr_psys_event_config_t *cfg);
-+
-+/**
-+ * Update event config specification of event object
-+ *
-+ * \ingroup ia_cipr_psys
-+ * \param[in] event event object handle
-+ * \param[in] cfg ia_cipr_psys_event_config_t
-+ */
-+css_err_t
-+ia_cipr_psys_set_event_config(ia_cipr_psys_event_t event,
-+                              const ia_cipr_psys_event_config_t *cfg);
-+
-+/**
-+ * Create PSYS command object
-+ *
-+ * Returns ia_cipr_psys_command_t object handle. Object is created based on
-+ * ia_cipr_psys_command_config_t specification and can be further used with
-+ * ia_cipr_psys_queue_command()
-+ *
-+ * A command object created with non-zero buffer count can be re-used to queue
-+ * commands with any number of buffers not exceeding the count used at
-+ * creation phase.
-+ *
-+ * A command object created with zero buffer count can be only used as command
-+ * without buffers. Such command object can contain process group or other
-+ * fixed fields to transmit info with the platform.
-+ *
-+ * IPU5/6 Persistent PG semantics include explicit start and stop commands.
-+ * A command with empty array of buffers with count according to terminal count
-+ * of process group is interpreted as start. A command with buffer count zero
-+ * is interpreted as stop.
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param[in] cfg ia_cipr_psys_command_config_t command config specification
-+ */
-+ia_cipr_psys_command_t
-+ia_cipr_psys_create_command(ia_cipr_psys_command_config_t *cfg);
-+
-+/**
-+ * Destroy PSYS command object
-+ *
-+ * \ingroup ia_cipr_psys
-+ * \param[in] cmd command object handle
-+ */
-+void ia_cipr_psys_destroy_command(ia_cipr_psys_command_t cmd);
-+
-+/**
-+ * Read command config specification from command object
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param[in] cmd command object handle
-+ * \param[out] cfg ia_cipr_psys_command_config_t
-+ */
-+css_err_t
-+ia_cipr_psys_get_command_config(ia_cipr_psys_command_t cmd,
-+                                ia_cipr_psys_command_config_t *cfg);
-+/**
-+ * Update command config specification of command object
-+ *
-+ * \ingroup ia_cipr_psys
-+ *
-+ * \param[in] cmd command object handle
-+ * \param[in] cfg ia_cipr_psys_command_config_t
-+ */
-+css_err_t
-+ia_cipr_psys_set_command_config(ia_cipr_psys_command_t cmd,
-+                                const ia_cipr_psys_command_config_t *cfg);
-+
-+/* obsolete
-+ * \todo replace by memory_device ops
-+ */
-+css_err_t ia_cipr_psys_register_buffer(ia_cipr_psys_context_t ctx,
-+                                      ia_cipr_buffer_t *buffer);
-+
-+/* obsolete
-+ * \todo replace by memory_device ops
-+ */
-+css_err_t ia_cipr_psys_unregister_buffer(ia_cipr_psys_context_t ctx,
-+                                        ia_cipr_buffer_t *buffers);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* _IA_CIPR_PSYS_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
-new file mode 100644
-index 000000000000..657027a5a3ec
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
-@@ -0,0 +1,112 @@
-+/****************************************************************************
-+ * Copyright (C) 2019 Intel Corporation.
-+ ****************************************************************************
-+ ***
-+ ***   This header was automatically generated from a Linux kernel header
-+ ***   of the same name, to make information necessary for userspace to
-+ ***   call into the kernel available to libc.  It contains only constants,
-+ ***   structures, and macros generated from the original header, and thus,
-+ ***   contains no copyrightable information.
-+ ***
-+ ***   To edit the content of this header, modify the corresponding
-+ ***   source file (e.g. under external/kernel-headers/original/) then
-+ ***   run bionic/libc/kernel/tools/update_all.py
-+ ***
-+ ***   Any manual change here will be lost the next time this script will
-+ ***   be run. You've been warned!
-+ ***
-+ ****************************************************************************
-+ ****************************************************************************/
-+#ifndef _UAPI_IPU_PSYS_H
-+#define _UAPI_IPU_PSYS_H
-+#include <linux/types.h>
-+struct ipu_psys_capability {
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t version;
-+  uint8_t driver[20];
-+  uint32_t pg_count;
-+  uint8_t dev_model[32];
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t reserved[17];
-+} __attribute__((packed));
-+struct ipu_psys_event {
-+  uint32_t type;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint64_t user_token;
-+  uint64_t issue_id;
-+  uint32_t buffer_idx;
-+  uint32_t error;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  int32_t reserved[2];
-+} __attribute__((packed));
-+#define IPU_PSYS_EVENT_TYPE_CMD_COMPLETE 1
-+#define IPU_PSYS_EVENT_TYPE_BUFFER_COMPLETE 2
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+struct ipu_psys_buffer {
-+  uint64_t len;
-+  union {
-+    int fd;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+    void* userptr;
-+    uint64_t reserved;
-+  } base;
-+  uint32_t data_offset;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t bytes_used;
-+  uint32_t flags;
-+  uint32_t reserved[2];
-+} __attribute__((packed));
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define IPU_BUFFER_FLAG_INPUT (1 << 0)
-+#define IPU_BUFFER_FLAG_OUTPUT (1 << 1)
-+#define IPU_BUFFER_FLAG_MAPPED (1 << 2)
-+#define IPU_BUFFER_FLAG_NO_FLUSH (1 << 3)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define IPU_BUFFER_FLAG_DMA_HANDLE (1 << 4)
-+#define IPU_BUFFER_FLAG_USERPTR (1 << 5)
-+#define IPU_PSYS_CMD_PRIORITY_HIGH 0
-+#define IPU_PSYS_CMD_PRIORITY_MED 1
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define IPU_PSYS_CMD_PRIORITY_LOW 2
-+#define IPU_PSYS_CMD_PRIORITY_NUM 3
-+struct ipu_psys_command {
-+  uint64_t issue_id;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint64_t user_token;
-+  uint32_t priority;
-+  void* pg_manifest;
-+  struct ipu_psys_buffer* buffers;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  int pg;
-+  uint32_t pg_manifest_size;
-+  uint32_t bufcount;
-+  uint32_t min_psys_freq;
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t frame_counter;
-+  uint32_t kernel_enable_bitmap[4];
-+  uint32_t terminal_enable_bitmap[4];
-+  uint32_t routing_enable_bitmap[4];
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t rbm[5];
-+  uint32_t reserved[2];
-+} __attribute__((packed));
-+struct ipu_psys_manifest {
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+  uint32_t index;
-+  uint32_t size;
-+  void* manifest;
-+  uint32_t reserved[5];
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+} __attribute__((packed));
-+#define IPU_IOC_QUERYCAP _IOR('A', 1, struct ipu_psys_capability)
-+#define IPU_IOC_MAPBUF _IOWR('A', 2, int)
-+#define IPU_IOC_UNMAPBUF _IOWR('A', 3, int)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define IPU_IOC_GETBUF _IOWR('A', 4, struct ipu_psys_buffer)
-+#define IPU_IOC_PUTBUF _IOWR('A', 5, struct ipu_psys_buffer)
-+#define IPU_IOC_QCMD _IOWR('A', 6, struct ipu_psys_command)
-+#define IPU_IOC_DQEVENT _IOWR('A', 7, struct ipu_psys_event)
-+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-+#define IPU_IOC_CMD_CANCEL _IOWR('A', 8, struct ipu_psys_command)
-+#define IPU_IOC_GET_MANIFEST _IOWR('A', 9, struct ipu_psys_manifest)
-+#endif
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
-new file mode 100644
-index 000000000000..9e40c90854a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.cpp
-@@ -0,0 +1,511 @@
-+/*
-+ * Copyright (C) 2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "MEMORY_COMMON"
-+
-+#include <string.h>
-+
-+#include "modules/ia_cipr/src/common/ia_cipr_memory_common.h"
-+#include "modules/ia_cipr/include/ia_cipr.h"
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory.h"
-+#include "modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h"
-+#include "CameraLog.h"
-+
-+using icamera::CAMERA_DEBUG_LOG_ERR;
-+using icamera::CAMERA_DEBUG_LOG_WARNING;
-+
-+void _cipr_memory_common_destroy(ia_cipr_buffer_t *buffer) {
-+    if (buffer
-+        && (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATED)
-+        && (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR)
-+        && buffer->mem.cpu_ptr) {
-+        IA_CIPR_FREE(buffer->mem.cpu_ptr);
-+    }
-+}
-+
-+css_err_t _cipr_memory_common_allocate(ia_cipr_buffer_t *buffer) {
-+    void *cpu_ptr = NULL;
-+
-+    /* In case buffer is explicitly set with device specific flags,
-+     * migration needs to be done before allocation and explicit
-+     * allocate call should not end up here */
-+    if ((buffer->mem.flags & IA_CIPR_MEMORY_DEVICE_MASK)
-+        && buffer->dev_id == 0) {
-+        icamera::LOGE("%s: device memory flags specified, migrate first!", __func__);
-+        return css_err_argument;
-+    }
-+
-+    if (buffer->mem.cpu_ptr
-+        && !(buffer->mem.flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
-+        icamera::LOGE("%s: already allocated", __func__);
-+        return css_err_argument;
-+    }
-+
-+    cpu_ptr = IA_CIPR_MALLOC(buffer->mem.size);
-+    if (!cpu_ptr)
-+        return css_err_nomemory;
-+
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_COPY_FROM_USER) {
-+        if (buffer->mem.cpu_ptr) {
-+            IA_CIPR_MEMCOPY(cpu_ptr,
-+                            buffer->mem.size,
-+                            buffer->mem.cpu_ptr,
-+                            buffer->mem.size);
-+        } else if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE) {
-+            icamera::LOGE("%s: copy from handle to host only memory not implemented", __func__);
-+            goto bail;
-+        }
-+        buffer->mem.flags &= ~IA_CIPR_MEMORY_COPY_FROM_USER;
-+    }
-+
-+    buffer->mem.cpu_ptr = cpu_ptr;
-+    buffer->mem.flags &= ~IA_CIPR_MEMORY_ALLOCATE_CPU_PTR;
-+    buffer->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_ALLOCATED;
-+    buffer->dev_mem.destroy = _cipr_memory_common_destroy;
-+
-+    return css_err_none;
-+bail:
-+    if (cpu_ptr)
-+        IA_CIPR_FREE(cpu_ptr);
-+    return css_err_general;
-+}
-+
-+css_err_t _cipr_memory_common_get_memory(ia_cipr_buffer_t *buffer,
-+                                        ia_cipr_memory_t *memory) {
-+    css_err_t ret;
-+
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR) {
-+        if (buffer->mem.cpu_ptr) {
-+            icamera::LOGE("%s: ALLOCATE_CPU_PTR not handled but pointer exists!", __func__);
-+            return css_err_internal;
-+        }
-+        ret = ia_cipr_buffer_allocate(buffer);
-+        if (ret != css_err_none)
-+            return ret;
-+    }
-+
-+    *memory = buffer->mem;
-+    return css_err_none;
-+}
-+
-+css_err_t _validate_buffer_bitfield(ia_cipr_buffer_t *buffer,
-+                                   ia_cipr_memory_t *memory) {
-+    bool valid = true;
-+    bool have_memory = false;
-+    ia_cipr_memory_t *mem;
-+
-+    if (!buffer)
-+        return css_err_argument;
-+
-+    mem = (memory) ? memory : &buffer->mem;
-+
-+    have_memory = mem->flags & IA_CIPR_MEMORY_ALLOCATED ||
-+                  mem->flags & IA_CIPR_MEMORY_FROM_USER;
-+
-+    if (!(mem->flags & IA_CIPR_MEMORY_CPU_PTR) ^ (mem->cpu_ptr == NULL)) {
-+        icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR (%s) ptr = %p",
-+                      __func__,
-+                      (mem->flags & IA_CIPR_MEMORY_CPU_PTR) ? "set" : "not set",
-+                      mem->cpu_ptr);
-+        valid &= false;
-+    }
-+
-+    if (!(mem->flags & IA_CIPR_MEMORY_HANDLE) ^ (mem->handle == 0)) {
-+        icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE (%s) handle = %llu",
-+                      __func__,
-+                      (mem->flags & IA_CIPR_MEMORY_HANDLE) ? "set" : "not set",
-+                      (uint64_t)mem->handle);
-+        valid &= false;
-+    }
-+
-+    if ((mem->flags & IA_CIPR_MEMORY_CPU_ONLY) && (mem->flags & IA_CIPR_MEMORY_HW_ONLY)) {
-+        icamera::LOGE("%s: Both IA_CIPR_MEMORY_CPU_ONLY and IA_CIPR_MEMORY_HW_ONLY "
-+                      "are set at same time, which is the invalid case.",
-+                      __func__);
-+        valid &= false;
-+    }
-+
-+    /* check that bitflags are set atomically with allocation */
-+    if (!have_memory
-+        && ((mem->flags & IA_CIPR_MEMORY_HANDLE)
-+        || (mem->flags & IA_CIPR_MEMORY_CPU_PTR))) {
-+        icamera::LOGE("%s: memory accessor set before allocation",
-+                      __func__);
-+        valid &= false;
-+    }
-+
-+    if (have_memory
-+        && (mem->flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR)) {
-+        icamera::LOGE("%s: IA_CIPR_MEMORY_ALLOCATE_CPU_PTR needs to be unset "
-+                      "to acknowledge allocation done!",
-+                      __func__);
-+        valid &= false;
-+    }
-+
-+    if (have_memory
-+        && (mem->flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
-+        icamera::LOGE("%s: IA_CIPR_MEMORY_COPY_FROM_USER needs to be unset "
-+                      "to acknowledge copy done!",
-+                      __func__);
-+        valid &= false;
-+    }
-+
-+    if (have_memory
-+        && !((mem->flags & IA_CIPR_MEMORY_HANDLE)
-+        || (mem->flags & IA_CIPR_MEMORY_CPU_PTR)
-+        || (mem->flags & IA_CIPR_MEMORY_HW_ONLY))) {
-+        icamera::LOGE("%s: missing memory accessor or HW_ONLY flag for"
-+                      " allocated memory",
-+                      __func__);
-+        valid &= false;
-+    }
-+
-+    return (valid) ? css_err_none : css_err_general;
-+}
-+
-+/**
-+ * Construct CIPR BUFFER OBJECT
-+ */
-+ia_cipr_buffer_t*
-+ia_cipr_buffer_create(uint32_t size,
-+                      ia_cipr_memory_flags_t flags,
-+                      ia_cipr_memory_t *user_memory) {
-+    ia_cipr_buffer_t *buf;
-+    css_err_t    ret;
-+
-+    if (size == 0)
-+        return NULL;
-+
-+    /* create the object */
-+    buf = reinterpret_cast<ia_cipr_buffer_t *>(IA_CIPR_CALLOC(1, sizeof(*buf)));
-+    if (!buf) {
-+        icamera::LOGE("could not allocate buf");
-+        return NULL;
-+    }
-+    buf->mem.anchor = buf;
-+
-+    /* store size request */
-+    buf->mem.size = size;
-+
-+    /* handle user specified memory
-+     *
-+     * Note: user field in struct _cipr_buffer does not reflect user_memory
-+     *       received here directly. It reflects the state of buffer accessible
-+     *       to user via ia_cipr_buffer_get_memory().
-+     */
-+    if (user_memory) {
-+        if (size < user_memory->size) {
-+            icamera::LOGW("%s: requested bytes to allocate less than "
-+                           "provided user memory in argument, "
-+                           "truncating", __func__);
-+        } else if (user_memory->size < size) {
-+            icamera::LOGE("%s: requested bytes to allocate more than "
-+                           "provided user memory in argument",
-+                           __func__);
-+            goto bail;
-+        }
-+
-+        /* IA_CIPR_MEMORY_CPU_PTR */
-+        if (user_memory->flags & IA_CIPR_MEMORY_CPU_PTR) {
-+            if (!user_memory->cpu_ptr) {
-+                icamera::LOGE("%s: user did not provide pointer with "
-+                              "IA_CIPR_MEMORY_CPU_PTR", __func__);
-+                goto bail;
-+            }
-+            if (user_memory->flags & IA_CIPR_MEMORY_HANDLE) {
-+                icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
-+                              "IA_CIPR_MEMORY_HANDLE", __func__);
-+                goto bail;
-+            }
-+            if (flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
-+                && !(flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
-+                /* Allocate request makes no sense with user memory unless
-+                 * copy-from user pointer is set. */
-+                icamera::LOGE("%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
-+                              "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR", __func__);
-+                goto bail;
-+            }
-+            buf->mem.cpu_ptr = user_memory->cpu_ptr;
-+            buf->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_FROM_USER;
-+        /* IA_CIPR_MEMORY_HANDLE */
-+        } else if (user_memory->flags & IA_CIPR_MEMORY_HANDLE) {
-+            if (!user_memory->handle) {
-+                icamera::LOGE("%s: user did not provide handle with "
-+                              "IA_CIPR_MEMORY_HANDLE", __func__);
-+                goto bail;
-+            }
-+            if (user_memory->flags & IA_CIPR_MEMORY_CPU_PTR) {
-+                icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE conflict with "
-+                              "IA_CIPR_MEMORY_CPU_PTR", __func__);
-+                goto bail;
-+            }
-+            if (flags & IA_CIPR_MEMORY_COPY_FROM_USER) {
-+                icamera::LOGE("%s: IA_CIPR_MEMORY_COPY_FROM_USER conflict! "
-+                              " Copy from user handle not implemented.",
-+                              __func__);
-+                goto bail;
-+            }
-+            if (flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
-+                && !(flags & IA_CIPR_MEMORY_COPY_FROM_USER)) {
-+                /* Allocate request makes no sense with user memory unless
-+                 * copy-from user pointer is set. */
-+                icamera::LOGE("%s: IA_CIPR_MEMORY_HANDLE conflict with "
-+                              "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR", __func__);
-+                goto bail;
-+            }
-+            buf->mem.handle = user_memory->handle;
-+            buf->mem.flags |= IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_FROM_USER;
-+        }
-+
-+        /* TODO: support inheriting object from another */
-+        if (user_memory->anchor) {
-+            icamera::LOGE("%s: inheriting object from another not supported!",
-+                          __func__);
-+            goto bail;
-+        }
-+
-+        if (buf->mem.cpu_ptr == NULL && buf->mem.handle == 0) {
-+            icamera::LOGE("%s: Invalid user memory given as argument!",
-+                          __func__);
-+            goto bail;
-+        }
-+    }
-+
-+    /* merge requested flags */
-+    buf->mem.flags |= flags;
-+
-+    /* assign pure host operations for allocate and get_memory, this is to
-+     * cover pure host memory buffers. Migration with device is expected to
-+     * overwrite the ops */
-+    buf->dev_mem.allocate = _cipr_memory_common_allocate;
-+    buf->dev_mem.get_memory = _cipr_memory_common_get_memory;
-+
-+    ret = _validate_buffer_bitfield(buf, NULL);
-+    if (ret != css_err_none)
-+        goto bail;
-+
-+    return buf;
-+bail:
-+    IA_CIPR_FREE(buf);
-+    return NULL;
-+}
-+
-+ia_cipr_buffer_t*
-+ia_cipr_buffer_create_region(ia_cipr_buffer_t *parent,
-+                             uint32_t offset,
-+                             uint32_t size) {
-+    ia_cipr_buffer_t *buf;
-+    css_err_t ret;
-+
-+    if (!parent || size == 0)
-+        return NULL;
-+
-+    if (parent->mem.size < offset + size) {
-+        icamera::LOGE("%s: parent buffer size %d not enough "
-+                      "for region requested (offset %d, size %d)",
-+                      __func__,
-+                      parent->mem.size,
-+                      offset,
-+                      size);
-+        return NULL;
-+    }
-+
-+    if (ia_cipr_buffer_is_region(parent)) {
-+        icamera::LOGE("%s: nested regions are illecal", __func__);
-+        return NULL;
-+    }
-+
-+    /* create the object */
-+    buf = reinterpret_cast<ia_cipr_buffer_t *>(IA_CIPR_CALLOC(1, sizeof(*buf)));
-+    if (!buf) {
-+        icamera::LOGE("%s: failed to allocate buffer", __func__);
-+        return NULL;
-+    }
-+
-+    buf->mem.size = size;
-+    buf->offset = offset;
-+    buf->mem.anchor = parent;
-+    buf->mem.flags = parent->mem.flags;
-+
-+    ret = ia_list_append(&parent->regions, buf);
-+    if (ret != css_err_none) {
-+        icamera::LOGE("%s: failed to append to parent buffer regions",
-+                      __func__);
-+        IA_CIPR_FREE(buf);
-+        return NULL;
-+    }
-+
-+    return buf;
-+}
-+
-+void ia_cipr_buffer_destroy(ia_cipr_buffer_t *buf) {
-+    ia_list_t *current;
-+
-+    if (!buf) {
-+        icamera::LOGW("%s: NULL pointer given!", __func__);
-+        return;
-+    }
-+
-+    if (ia_cipr_buffer_is_region(buf)) {
-+        if (!buf->mem.anchor) {
-+            icamera::LOGW("%s: parent already released", __func__);
-+        } else if (!ia_list_remove(&buf->mem.anchor->regions, buf)) {
-+            icamera::LOGE("%s: region parent reference missing", __func__);
-+        }
-+    }
-+
-+    if (buf->regions) {
-+        icamera::LOGW("%s: parent buffer destroy leaves stale regions",
-+                       __func__);
-+        current = buf->regions;
-+        while (current) {
-+            ia_cipr_buffer_t *region = reinterpret_cast<ia_cipr_buffer_t *>(current->data);
-+            region->mem.anchor = NULL;
-+            ia_list_t *prev = current;
-+            current = current->next;
-+            ia_list_destroy(prev);
-+        }
-+    }
-+
-+    if (buf->dev_mem.destroy)
-+        buf->dev_mem.destroy(buf);
-+
-+    IA_CIPR_FREE(buf);
-+}
-+
-+bool ia_cipr_buffer_is_region(ia_cipr_buffer_t *buffer) {
-+    return (buffer->mem.anchor != buffer);
-+}
-+
-+ia_cipr_buffer_t* ia_cipr_buffer_get_parent(ia_cipr_buffer_t *buffer) {
-+    if (!ia_cipr_buffer_is_region(buffer)) {
-+        icamera::LOGE("%s: not a child object", __func__);
-+        return NULL;
-+    }
-+
-+    if (!buffer->mem.anchor)
-+        return NULL;
-+    return buffer->mem.anchor;
-+}
-+
-+css_err_t
-+ia_cipr_buffer_allocate(ia_cipr_buffer_t *buffer) {
-+    css_err_t ret;
-+
-+    if (!buffer)
-+        return css_err_argument;
-+
-+    if (!buffer->dev_mem.allocate)
-+        return css_err_internal;
-+
-+    ret = buffer->dev_mem.allocate(buffer);
-+    if (ret != css_err_none) {
-+        icamera::LOGE("%s: allocation failed", __func__);
-+        return ret;
-+    }
-+
-+    ret = _validate_buffer_bitfield(buffer, NULL);
-+    if (ret != css_err_none) {
-+        icamera::LOGE("%s: bitfield validation after allocate failed",
-+                      __func__);
-+        return ret;
-+    }
-+
-+    return css_err_none;
-+}
-+
-+uint8_t
-+ia_cipr_buffer_get_device_id(ia_cipr_buffer_t *buffer) {
-+    if (!buffer)
-+        return 0;
-+
-+    return buffer->dev_id;
-+}
-+
-+css_err_t
-+ia_cipr_buffer_get_memory(ia_cipr_buffer_t *buffer, ia_cipr_memory_t *memory) {
-+    ia_cipr_buffer_t *region = NULL;
-+    css_err_t ret;
-+
-+    if (!buffer || !memory)
-+        return css_err_argument;
-+
-+    if (ia_cipr_buffer_is_region(buffer)) {
-+        /* switch to parent for get memory */
-+        region = buffer;
-+        buffer = buffer->mem.anchor;
-+    }
-+
-+    if (!buffer->dev_mem.get_memory)
-+        return css_err_internal;
-+
-+    ret = buffer->dev_mem.get_memory(buffer, memory);
-+    if (ret != css_err_none) {
-+        icamera::LOGE("%s: operation failed", __func__);
-+        return ret;
-+    }
-+
-+    ret = _validate_buffer_bitfield(buffer, memory);
-+    if (ret != css_err_none) {
-+        icamera::LOGE("%s: bitfield validation failed for memory returned",
-+                      __func__);
-+        return ret;
-+    }
-+
-+    if (region) {
-+        /* Calculate virtual address based on offset region */
-+        if (region->offset + region->mem.size > memory->size) {
-+            icamera::LOGE("%s: memory region doesn't fit in parent store!",
-+                          __func__);
-+            return css_err_internal;
-+        }
-+        if (memory->cpu_ptr)
-+            memory->cpu_ptr = reinterpret_cast<uint8_t*>(memory->cpu_ptr) + region->offset;
-+        memory->size = region->mem.size;
-+        /* Don't expose that region objects have the parent as stored anchor */
-+        memory->anchor = region;
-+    }
-+
-+    return css_err_none;
-+}
-+
-+css_err_t
-+ia_cipr_memory_device_migrate_buffer(ia_cipr_memory_device_t *md,
-+                                     ia_cipr_buffer_t *buffer) {
-+    if (!buffer || !md)
-+        return css_err_argument;
-+
-+    if (buffer->mem.anchor != buffer) {
-+        icamera::LOGE("%s: buffer regions cannot be independently migrated",
-+                      __func__);
-+        return css_err_argument;
-+    }
-+
-+    buffer->dev_mem.allocate =
-+        (md->allocate) ? md->allocate : buffer->dev_mem.allocate;
-+    buffer->dev_mem.migrate =
-+        (md->migrate) ? md->migrate : buffer->dev_mem.migrate;
-+    buffer->dev_mem.get_memory =
-+        (md->get_memory) ? md->get_memory : buffer->dev_mem.get_memory;
-+    buffer->dev_mem.destroy =
-+        (md->destroy) ? md->destroy : buffer->dev_mem.destroy;
-+    buffer->dev_mem.dev_priv = md->dev_priv;
-+
-+    if (!buffer->dev_mem.migrate)
-+        return css_err_argument;
-+    return buffer->dev_mem.migrate(buffer);
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
-new file mode 100644
-index 000000000000..27d88280ac5e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_common.h
-@@ -0,0 +1,34 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPR_MEMORY_COMMON_H_
-+#define _IA_CIPR_MEMORY_COMMON_H_
-+
-+#include "modules/ia_cipr/src/common/ia_list.h"
-+#include "modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
-+
-+/** Datatype for Common CIPR Buffer object */
-+struct _cipr_buffer {
-+    ia_cipr_memory_t        mem;
-+    uint8_t                 dev_id;
-+    uint64_t                dev_priv;
-+    ia_cipr_memory_device_t dev_mem;
-+    uint32_t                offset;
-+    ia_list_t              *regions;
-+};
-+
-+#endif
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
-new file mode 100644
-index 000000000000..440b921a094f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_cipr_memory_device_ops.h
-@@ -0,0 +1,38 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_CIPR_MEMORY_DEVICE_OPS_H_
-+#define _IA_CIPR_MEMORY_DEVICE_OPS_H_
-+
-+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
-+
-+typedef css_err_t    (*_cipr_device_buffer_op)(ia_cipr_buffer_t *);
-+typedef css_err_t    (*_cipr_device_get_memory_op)(ia_cipr_buffer_t *,
-+                                                  ia_cipr_memory_t *);
-+typedef void        (*_cipr_device_destroy_buffer_op)(ia_cipr_buffer_t *);
-+
-+/**
-+ * Memory device interface
-+ */
-+struct _cipr_memory_device_ops {
-+    _cipr_device_buffer_op          allocate;
-+    _cipr_device_buffer_op          migrate;
-+    _cipr_device_get_memory_op      get_memory;
-+    _cipr_device_destroy_buffer_op  destroy;
-+    void*                           dev_priv;
-+};
-+
-+#endif /* _IA_CIPR_MEMORY_DEVICE_OPS_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
-new file mode 100644
-index 000000000000..096e84c9f2ee
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.cpp
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IA_LIST"
-+
-+#include "modules/ia_cipr/src/common/ia_list.h"
-+
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+
-+ia_list_t *ia_list_create(void) {
-+    return reinterpret_cast<ia_list_t *>(IA_CIPR_CALLOC(1, sizeof(ia_list_t)));
-+}
-+
-+void ia_list_destroy(ia_list_t *list) {
-+    if (list)
-+        IA_CIPR_FREE(list);
-+}
-+
-+css_err_t ia_list_prepend(ia_list_t **list, void *data) {
-+    ia_list_t *new_list = ia_list_create();
-+    if (!new_list) {
-+        return css_err_nomemory;
-+    }
-+    new_list->data = data;
-+    new_list->next = *list;
-+    *list = new_list;
-+
-+    return css_err_none;
-+}
-+
-+css_err_t ia_list_append(ia_list_t **list, void *data) {
-+    ia_list_t *new_list = ia_list_create();
-+    if (!new_list) {
-+        return css_err_nomemory;
-+    }
-+    new_list->data = data;
-+    new_list->next = NULL;
-+
-+    if (!*list) {
-+        *list = new_list;
-+    } else {
-+      ia_list_t *last = *list;
-+      while (last && last->next)
-+          last = last->next;
-+      if (last) {
-+          last->next = new_list;
-+      } else {
-+        return css_err_nomemory;
-+      }
-+    }
-+
-+    return css_err_none;
-+}
-+
-+bool ia_list_contains(const ia_list_t *list, void *data) {
-+    const ia_list_t *l;
-+
-+    for (l = list; l; l = l->next) {
-+        if (l->data == data)
-+            break;
-+    }
-+    return l != NULL;
-+}
-+
-+void *ia_list_data_at(const ia_list_t *list, uint32_t index) {
-+    const ia_list_t *l;
-+    for (l = list; l; l = l->next) {
-+        if (index == 0)
-+            return l->data;
-+        index--;
-+    }
-+
-+    return NULL;
-+}
-+
-+bool ia_list_remove(ia_list_t **list, void *data) {
-+    ia_list_t *prev = NULL,
-+            *l = NULL;
-+
-+    if (list)
-+        l = *list;
-+
-+    for (; l; l = l->next) {
-+        if (l->data == data) {
-+            if (prev)
-+                prev->next = l->next;
-+            else
-+                *list = l->next;
-+            ia_list_destroy(l);
-+            break;
-+        }
-+        prev = l;
-+    }
-+    return l != NULL;
-+}
-+
-+uint32_t ia_list_length(const ia_list_t *list) {
-+    uint32_t length = 0;
-+    const ia_list_t *l;
-+
-+    for (l = list; l; l = l->next)
-+        length++;
-+
-+    return length;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
-new file mode 100644
-index 000000000000..5ba389587cce
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/common/ia_list.h
-@@ -0,0 +1,111 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef _IA_LIST_H_
-+#define _IA_LIST_H_
-+
-+#include <stdbool.h>
-+#include "modules/ia_cipr/include/css_types.h"
-+
-+/**
-+ * \ingroup ia_tools
-+ */
-+typedef struct ia_list {
-+    void *data;
-+    struct ia_list *next;
-+} ia_list_t;
-+
-+/**
-+ * Create a ia_list
-+ * \ingroup ia_tools
-+ * \return pointer to the list. NULL if failed.
-+ */
-+extern ia_list_t *
-+ia_list_create(void);
-+
-+/**
-+ * Destroy a ia_list
-+ * \ingroup ia_tools
-+ * \param *list the list
-+ */
-+extern void
-+ia_list_destroy(ia_list_t *list);
-+
-+/**
-+ * Add a new element to a list head. If *list is NULL, a new ia_list element is
-+ * allocated and inserted to *list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer
-+ * \param *data the data for the list element
-+ * \return css_err_none on success
-+ * Add data to a ia_list
-+ */
-+extern css_err_t
-+ia_list_prepend(ia_list_t **list, void *data);
-+
-+/**
-+ * Add a new element to a list tail. If *list is NULL, a new ia_list element is
-+ * allocated and inserted to *list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer
-+ * \param *data the data for the list element
-+ * \return css_err_none on success
-+ * Add data to a ia_list
-+ */
-+extern css_err_t
-+ia_list_append(ia_list_t **list, void *data);
-+
-+/**
-+ * Tell whether data is in the list
-+ * \ingroup ia_tools
-+ * \param *list handle to the list object
-+ * \param *data the data pointer
-+ * \return true if data is in the list, false otherwise
-+ */
-+extern bool
-+ia_list_contains(const ia_list_t *list, void *data);
-+
-+/**
-+ * Remove data if it exists in the list.
-+ * \ingroup ia_tools
-+ * \param **list a pointer to the list pointer.
-+ * \param *data the data to remove from list.
-+ * \return true if data was removed. False otherwise.
-+ */
-+extern bool
-+ia_list_remove(ia_list_t **list, void *data);
-+
-+/**
-+ * Tell the length of the list.
-+ * \ingroup ia_tools
-+ * \param *list a pointer to the list.
-+ * \return length of the list.
-+ */
-+extern uint32_t
-+ia_list_length(const ia_list_t *list);
-+
-+/**
-+ * Return data at an index of the list.
-+ * \ingroup ia_tools
-+ * \param *list a pointer to the list.
-+ * \param index element index
-+ * \return pointer to the data at the element at the distance "index" from the
-+ * given list element
-+ */
-+extern void*
-+ia_list_data_at(const ia_list_t *list, uint32_t index);
-+
-+#endif /* _IA_LIST_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
-new file mode 100644
-index 000000000000..42d59d54b45e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_alloc.cpp
-@@ -0,0 +1,99 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*
-+ * ia_cipr_alloc.c
-+ */
-+#define LOG_TAG "IA_CIPR_ALLOC"
-+
-+#include <unistd.h>
-+
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+#include "CameraLog.h"
-+#include "Utils.h"
-+
-+using icamera::CAMERA_DEBUG_LOG_INFO;
-+using icamera::CAMERA_DEBUG_LOG_WARNING;
-+using icamera::CAMERA_DEBUG_LOG_LEVEL1;
-+using icamera::gLogLevel;
-+
-+size_t ia_cipr_pagesize() {
-+    return (size_t) sysconf(_SC_PAGESIZE);
-+}
-+
-+void* ia_cipr_malloc(size_t size,
-+                     const char *logmsg,
-+                     const char *file_name,
-+                     int line) {
-+    void *resptr = malloc(size);
-+    (void)file_name;
-+    (void)line;
-+    (void)logmsg; /* silence warning if logging is not enabled */
-+    icamera::LOG1("@%s size %lu from %s res ptr: %p", __func__, size, logmsg, resptr);
-+
-+    return resptr;
-+}
-+
-+void* ia_cipr_calloc(size_t nmemb,
-+                     size_t size,
-+                     const char *logmsg,
-+                     const char *file_name,
-+                     int line) {
-+    void *resptr = calloc(nmemb, size);
-+    (void)file_name;
-+    (void)line;
-+    (void)logmsg; /* silence warning if logging is not enabled */
-+
-+    icamera::LOG1("@%s nmemb %lu size %lu from %s res ptr: %p",
-+                  __func__, nmemb, size, logmsg, resptr);
-+
-+    return resptr;
-+}
-+
-+void* ia_cipr_alloc_aligned(size_t size,
-+                            size_t alignment,
-+                            const char *logmsg,
-+                            const char *file_name,
-+                            int line) {
-+    void *resptr = NULL;
-+    int ret = posix_memalign(&resptr, alignment, size);
-+    if (ret)
-+        return NULL;
-+    (void)file_name;
-+    (void)line;
-+    (void)logmsg; /* silence warning if logging is not enabled */
-+    icamera::LOG1("@%s size %ld with alignment %lu from %s res ptr: %p",
-+                  __func__, size, alignment, logmsg, resptr);
-+
-+    return resptr;
-+}
-+
-+void ia_cipr_free(void *ptr, const char *logmsg) {
-+    icamera::LOG1("@%s ptr %p from %s", __func__, ptr, logmsg);
-+    (void)logmsg; /* silence warning if logging is not enabled */
-+
-+    free(ptr);
-+}
-+
-+void ia_cipr_memcopy(void *dest, size_t dest_size, const void *src, size_t n) {
-+    /* perform some basic sanity checks */
-+
-+    if (dest_size < n)
-+        icamera::LOGW("%s: destination size is smaller than source size, potential coding error",
-+                       __func__);
-+
-+    MEMCPY_S(dest, dest_size, src, n);
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
-new file mode 100644
-index 000000000000..d88328575719
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/linux/ia_cipr_psys.cpp
-@@ -0,0 +1,778 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CIPR_PSYS"
-+
-+#include <stdio.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <poll.h>
-+#include <errno.h>
-+#include <string.h>
-+
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+#include "modules/ia_cipr/src/common/ia_cipr_memory_common.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory_device.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory.h"
-+#include "modules/ia_cipr/include/ia_cipr_psys.h"
-+#include "modules/ia_cipr/include/ipu-psys.h"
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#define DRIVER_NAME "/dev/ipu-psys0"
-+
-+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
-+using icamera::CAMERA_DEBUG_LOG_ERR;
-+using icamera::CAMERA_DEBUG_LOG_DBG;
-+using icamera::CAMERA_DEBUG_LOG_WARNING;
-+using icamera::CAMERA_DEBUG_LOG_LEVEL2;
-+using icamera::gLogLevel;
-+
-+extern void _cipr_memory_common_destroy(ia_cipr_buffer_t *buffer);
-+
-+/*
-+ * Definitions of opaque types
-+ */
-+struct _psys_context {
-+    int fd;
-+    uint32_t init_flags;
-+    struct _cipr_memory_device_ops mem_ops;
-+};
-+
-+struct _psys_event {
-+    struct ipu_psys_event event;
-+    int32_t timeout;
-+};
-+
-+struct _psys_command {
-+    struct ipu_psys_command ioc_cmd;
-+    uint32_t         allocated_buffers;
-+    ia_cipr_buffer_t **user_buffers;
-+    ia_cipr_buffer_t *pg;
-+    /* for backward compatibility */
-+    void *pg_params;
-+    uint32_t pg_params_size;
-+    ia_cipr_buffer_t *ext_buf;
-+    ia_cipr_buffer_t *pg_manifest_buf;
-+};
-+
-+css_err_t _psys_ioctl(int fd, int request, void *ptr) {
-+    int res, errno_copy;
-+
-+#ifdef ANDROID
-+    res = ioctl(fd, request, ptr);
-+#else
-+    res = ioctl(fd, (unsigned int)request, ptr);
-+#endif
-+    errno_copy = errno;
-+
-+    /* Check ioctl return value for errors */
-+    if (res < 0) {
-+        icamera::LOGV("ioctl returned error: %s", strerror(errno_copy));
-+        switch (errno_copy) {
-+        case ENOMEM:
-+            return css_err_nomemory;
-+        case EINVAL:
-+            return css_err_argument;
-+        case EFAULT:
-+            return css_err_argument;
-+        case ENOENT:
-+            return css_err_noentry;
-+        default:
-+            return css_err_general;
-+        }
-+    }
-+
-+    return css_err_none;
-+}
-+
-+css_err_t _psys_close(int fd) {
-+    int res, error;
-+
-+    res = close(fd);
-+    error = errno;
-+
-+    /* Check close return value for errors */
-+    if (res < 0) {
-+        icamera::LOGE("close returned error: %s", strerror(error));
-+
-+        switch (error) {
-+        case EBADF:
-+            return css_err_argument;
-+        case EIO:
-+        case EINTR:
-+        default:
-+            return css_err_general;
-+        }
-+    }
-+
-+    return css_err_none;
-+}
-+
-+/*
-+ * PSYS Memory Device Ops
-+ */
-+css_err_t _psys_allocate_buffer(ia_cipr_buffer_t *buffer) {
-+    if (!buffer)
-+        return css_err_argument;
-+
-+    if (buffer->mem.cpu_ptr) {
-+        icamera::LOGE("%s: already has an address!", __func__);
-+        return css_err_argument;
-+    }
-+
-+    buffer->mem.cpu_ptr = IA_CIPR_ALLOC_ALIGNED(buffer->mem.size,
-+                                                IA_CIPR_PAGESIZE());
-+    if (!buffer->mem.cpu_ptr)
-+        return css_err_nomemory;
-+
-+    if (!(buffer->mem.flags & IA_CIPR_MEMORY_ALLOC_UNINITIALIZED))
-+        memset(buffer->mem.cpu_ptr, 0, buffer->mem.size);
-+
-+    buffer->mem.flags &= ~IA_CIPR_MEMORY_ALLOCATE_CPU_PTR;
-+    buffer->mem.flags |= IA_CIPR_MEMORY_CPU_PTR | IA_CIPR_MEMORY_ALLOCATED;
-+    return css_err_none;
-+}
-+
-+css_err_t _psys_migrate_buffer(ia_cipr_buffer_t *buffer) {
-+    css_err_t ret;
-+
-+    if (!buffer || !buffer->dev_mem.dev_priv)
-+        return css_err_argument;
-+
-+    /* handle allocate request implicitly */
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_ALLOCATE_CPU_PTR) {
-+        ret = _psys_allocate_buffer(buffer);
-+        if (ret != css_err_none)
-+            return ret;
-+    }
-+
-+    /* skip memory mapping of API buffer */
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_PSYS_API)
-+        return css_err_none;
-+
-+    return ia_cipr_psys_register_buffer((ia_cipr_psys_context_t)buffer->dev_mem.dev_priv,
-+                                        buffer);
-+}
-+
-+css_err_t _psys_get_memory(ia_cipr_buffer_t *buffer, ia_cipr_memory_t *memory) {
-+    ia_cipr_psys_context_t ctx = NULL;
-+
-+    if (!buffer || !memory)
-+        return css_err_argument;
-+
-+    ctx = (ia_cipr_psys_context_t)buffer->dev_mem.dev_priv;
-+    if (!ctx) {
-+        icamera::LOGE("NULL context!", __func__);
-+        return css_err_general;
-+    }
-+
-+    if (!(ctx->init_flags & CIPR_PSYS_INIT_FLAG_DEBUG) &&
-+            (buffer->mem.flags & IA_CIPR_MEMORY_HW_ONLY)) {
-+        icamera::LOGE("%s: host cannot access HW only memory!", __func__);
-+        return css_err_general;
-+    }
-+
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE
-+        && !(buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR)) {
-+        /* TODO: fallback host access with mmap to buffer that currently has
-+         *       only the dma handle */
-+        icamera::LOGE("%s: fallback host address mapping not implemented!",
-+                      __func__);
-+        return css_err_general;
-+    }
-+
-+    *memory = buffer->mem;
-+
-+    return css_err_none;
-+}
-+
-+void _psys_destroy_buffer(ia_cipr_buffer_t *buffer) {
-+    if (!buffer)
-+        return;
-+
-+    if (buffer->dev_id)
-+        ia_cipr_psys_unregister_buffer((ia_cipr_psys_context_t)buffer->dev_mem.dev_priv,
-+                                       buffer);
-+    _cipr_memory_common_destroy(buffer);
-+}
-+
-+ia_cipr_psys_context_t ia_cipr_psys_create_context(ia_cipr_context_t cipr_ctx) {
-+    struct _psys_context *ctx;
-+    int errno_copy;
-+    (void)cipr_ctx;
-+    (void)errno_copy;  // not used in release builds, but ok
-+
-+    ctx = reinterpret_cast<_psys_context*>(IA_CIPR_MALLOC(sizeof(struct _psys_context)));
-+    if (!ctx)
-+        return NULL;
-+
-+    ctx->fd = open(DRIVER_NAME, 0, O_RDWR | O_NONBLOCK);
-+    errno_copy = errno;
-+
-+    if (ctx->fd < 0) {
-+        icamera::LOGE("%s: Failed to open PSYS device! open returned error: %s",
-+                __func__,
-+                strerror(errno_copy));
-+        IA_CIPR_FREE(ctx);
-+        return NULL;
-+    }
-+
-+    ctx->mem_ops.allocate = _psys_allocate_buffer;
-+    ctx->mem_ops.migrate = _psys_migrate_buffer;
-+    ctx->mem_ops.get_memory = _psys_get_memory;
-+    ctx->mem_ops.destroy = _psys_destroy_buffer;
-+    ctx->mem_ops.dev_priv = ctx;
-+    ctx->init_flags = CIPR_PSYS_INIT_FLAG_NONE;
-+
-+    icamera::LOG2("%s: init_flags:%x", __func__, ctx->init_flags);
-+
-+    return ctx;
-+}
-+
-+void ia_cipr_psys_destroy_context(ia_cipr_psys_context_t ctx) {
-+    int res, errno_copy;
-+    (void)errno_copy;  // not used in release builds, but ok
-+
-+    if (!ctx)
-+        return;
-+
-+    res = close(ctx->fd);
-+    errno_copy = errno;
-+    if (res < 0) {
-+        icamera::LOGE("close returned error: %s", strerror(errno_copy));
-+    }
-+
-+    IA_CIPR_FREE(ctx);
-+}
-+
-+css_err_t
-+ia_cipr_psys_get_capabilities(ia_cipr_psys_context_t ctx,
-+                              ia_cipr_psys_capability_t *capability) {
-+    struct ipu_psys_capability psys_capability;
-+    css_err_t ret;
-+
-+    if (!ctx || !capability)
-+        return css_err_argument;
-+    CLEAR(psys_capability);
-+
-+    ret = _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_QUERYCAP), &psys_capability);
-+    if (ret != css_err_none) {
-+        icamera::LOGV("%s: failed to retrieve capabilities", __func__);
-+        return ret;
-+    }
-+
-+    capability->version = psys_capability.version;
-+    IA_CIPR_MEMCOPY(capability->driver,
-+                    sizeof(capability->driver),
-+                    psys_capability.driver,
-+                    sizeof(psys_capability.driver));
-+    IA_CIPR_MEMCOPY(capability->dev_model,
-+                    sizeof(capability->dev_model),
-+                    psys_capability.dev_model,
-+                    sizeof(psys_capability.dev_model));
-+    capability->program_group_count = psys_capability.pg_count;
-+    return css_err_none;
-+}
-+
-+css_err_t ia_cipr_psys_get_manifest(ia_cipr_psys_context_t ctx,
-+                                   uint32_t index,
-+                                   uint32_t *manifest_size,
-+                                   void *manifest) {
-+    struct ipu_psys_manifest pg_manifest;
-+    css_err_t ret;
-+
-+    if (!ctx || !manifest_size)
-+        return css_err_argument;
-+
-+    CLEAR(pg_manifest);
-+    pg_manifest.index = index;
-+    pg_manifest.size = 0;
-+    pg_manifest.manifest = manifest;
-+
-+    ret = _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_GET_MANIFEST), &pg_manifest);
-+    if (ret != css_err_none) {
-+        icamera::LOGV("%s: failed to retrieve manifest with index %d",
-+                    __func__,
-+                    index);
-+        return ret;
-+    }
-+
-+    *manifest_size = pg_manifest.size;
-+    return css_err_none;
-+}
-+
-+ia_cipr_memory_device_t*
-+ia_cipr_psys_get_memory_device(ia_cipr_psys_context_t ctx) {
-+    if (!ctx)
-+        return NULL;
-+
-+    return &ctx->mem_ops;
-+}
-+
-+css_err_t
-+ia_cipr_psys_register_buffer(ia_cipr_psys_context_t ctx,
-+                             ia_cipr_buffer_t *buffer) {
-+    struct ipu_psys_buffer *ioc_buffer;
-+    css_err_t res;
-+
-+    if (!ctx || !buffer)
-+        return css_err_argument;
-+
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_MIGRATED) {
-+        icamera::LOGE("Buffer already migrated with device (%d)",
-+                      buffer->dev_id);
-+        return css_err_argument;
-+    }
-+
-+    ioc_buffer = reinterpret_cast<ipu_psys_buffer*>(IA_CIPR_CALLOC(1, sizeof(*ioc_buffer)));
-+    if (!ioc_buffer) {
-+        icamera::LOGE("could not create psys buffer");
-+        return css_err_nomemory;
-+    }
-+    /* TODO: - handle late allocation of CPU_PTR when requested
-+     *       - handle copy from user
-+     *       - validation
-+     */
-+    ioc_buffer->len = buffer->mem.size;
-+    if (!(ctx->init_flags & CIPR_PSYS_INIT_FLAG_DEBUG) &&
-+         (buffer->mem.flags & IA_CIPR_MEMORY_NO_FLUSH ||
-+           (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR &&
-+            buffer->mem.flags & IA_CIPR_MEMORY_HW_ONLY))) {
-+        ioc_buffer->flags |= IPU_BUFFER_FLAG_NO_FLUSH;
-+    }
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR) {
-+        /* Create dma-buffer for host pointer */
-+        ioc_buffer->base.userptr = buffer->mem.cpu_ptr;
-+        ioc_buffer->flags |= IPU_BUFFER_FLAG_USERPTR;
-+        res = _psys_ioctl(ctx->fd,
-+                          static_cast<int>(IPU_IOC_GETBUF),
-+                          ioc_buffer);
-+        if (res != css_err_none) {
-+            IA_CIPR_FREE(ioc_buffer);
-+            return res;
-+        }
-+
-+        /* Sanity checks for specified IOC GETBUF behaviour
-+         * Note: Failure includes potential dma_buf leak, check omitted
-+         */
-+        if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
-+            icamera::LOGE("CIPR: IOC_GETBUF succeed but did not return dma handle");
-+            IA_CIPR_FREE(ioc_buffer);
-+            return css_err_internal;
-+        } else if (ioc_buffer->flags & IPU_BUFFER_FLAG_USERPTR) {
-+            icamera::LOGE("CIPR: IOC_GETBUF succeed but did not consume the userptr flag");
-+            IA_CIPR_FREE(ioc_buffer);
-+            return css_err_internal;
-+        }
-+    } else if (buffer->mem.flags & IA_CIPR_MEMORY_HANDLE) {
-+        /* Implementation defined as dma-buffer fd */
-+        ioc_buffer->base.fd = static_cast<int>(buffer->mem.handle);
-+        ioc_buffer->flags |= IPU_BUFFER_FLAG_DMA_HANDLE;
-+    }
-+
-+    /* map pages with ISP IOMMU using dma-buffer handle */
-+    res = _psys_ioctl(ctx->fd,
-+                      static_cast<int>(IPU_IOC_MAPBUF),
-+                      reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
-+    if (res != css_err_none) {
-+        IA_CIPR_FREE(ioc_buffer);
-+        return res;
-+    }
-+
-+    buffer->dev_id = CIPR_DEVICE_PSYS;
-+    buffer->dev_priv = (uintptr_t)ioc_buffer;
-+    buffer->mem.flags |= IA_CIPR_MEMORY_MIGRATED;
-+
-+    icamera::LOG2("%s: registered %p -> fd %d size:%u offset:%u bytes_used:%u",
-+                  __func__, buffer->mem.cpu_ptr, ioc_buffer->base.fd,
-+                  ioc_buffer->len, ioc_buffer->data_offset, ioc_buffer->bytes_used);
-+
-+    return res;
-+}
-+
-+css_err_t
-+ia_cipr_psys_unregister_buffer(ia_cipr_psys_context_t ctx,
-+                               ia_cipr_buffer_t *buffer) {
-+    struct ipu_psys_buffer *ioc_buffer;
-+    css_err_t res;
-+
-+    if (!ctx || !buffer)
-+        return css_err_argument;
-+
-+    if (buffer->dev_priv == 0) {
-+        icamera::LOGE("%s: buffer already unregistered!", __func__);
-+        return css_err_general;
-+    }
-+
-+    ioc_buffer = (struct ipu_psys_buffer *)(uintptr_t)buffer->dev_priv;
-+    if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
-+        icamera::LOGE("Wrong flag!", __func__);
-+        return css_err_general;
-+    }
-+
-+    /* Unmap buffer */
-+    res = _psys_ioctl(ctx->fd,
-+                        static_cast<int>(IPU_IOC_UNMAPBUF),
-+                        reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
-+    if (res != css_err_none) {
-+        icamera::LOGD("%s: cannot unmap buffer fd %d, possibly already unmapped",
-+                  __func__, ioc_buffer->base.fd);
-+        // keep going.
-+    }
-+
-+    /* close buffer fd */
-+    if (buffer->mem.flags & IA_CIPR_MEMORY_CPU_PTR) {
-+        res = _psys_close(ioc_buffer->base.fd);
-+        if (res != css_err_none)
-+            return res;
-+    }
-+
-+    IA_CIPR_FREE(ioc_buffer);
-+
-+    buffer->dev_id = 0;
-+    buffer->dev_priv = 0;
-+
-+    return res;
-+}
-+
-+css_err_t ia_cipr_psys_queue_command(ia_cipr_psys_context_t ctx,
-+                                    ia_cipr_psys_command_t cmd) {
-+    if (!ctx || !cmd)
-+        return css_err_argument;
-+
-+    return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_QCMD), cmd);
-+}
-+
-+css_err_t ia_cipr_psys_cancel_command(ia_cipr_psys_context_t ctx,
-+                                     ia_cipr_psys_command_t cmd) {
-+    if (!ctx || !cmd)
-+        return css_err_argument;
-+
-+    return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_CMD_CANCEL), cmd);
-+}
-+
-+css_err_t ia_cipr_psys_wait_for_event(ia_cipr_psys_context_t ctx,
-+                                     ia_cipr_psys_event_t event) {
-+    int res, errno_copy;
-+    struct pollfd fds;
-+    (void)errno_copy;  // not used in release builds, but ok
-+
-+    if (!ctx || !event)
-+        return css_err_argument;
-+
-+    fds.fd = ctx->fd;
-+    fds.events = POLLIN | POLLHUP | POLLERR;
-+    /* Wait for events */
-+    res = poll(&fds, 1, event->timeout);
-+    errno_copy = errno;
-+    /* Poll return value 1 is success */
-+    if (res == 1) {
-+        return _psys_ioctl(ctx->fd, static_cast<int>(IPU_IOC_DQEVENT), event);
-+    } else if (res == 0) {
-+        return css_err_timeout;
-+    } else {
-+        icamera::LOGE("poll returned error: %s", strerror(errno_copy));
-+        return css_err_general;
-+    }
-+}
-+
-+ia_cipr_psys_event_t
-+ia_cipr_psys_create_event(ia_cipr_psys_event_config_t *cfg) {
-+    /* Create psys event object with given cfg */
-+    struct _psys_event *event;
-+
-+    if (!cfg)
-+        return NULL;
-+
-+    event = reinterpret_cast<_psys_event*>(IA_CIPR_CALLOC(1, sizeof(*event)));
-+    if (!event) {
-+        icamera::LOGE("could not allocate event");
-+        return NULL;
-+    }
-+    if (cfg->id != 0) {
-+        icamera::LOG2("ID-field of CIPR event deprecated!");
-+    }
-+    event->event.type = cfg->type;
-+    event->event.user_token = cfg->command_token;
-+    event->event.issue_id = cfg->command_issue_id;
-+    event->event.buffer_idx = 0;
-+    event->event.error = cfg->error;
-+    event->timeout = cfg->timeout;
-+    /* Return handle for the object */
-+    return event;
-+}
-+
-+void ia_cipr_psys_destroy_event(ia_cipr_psys_event_t event) {
-+    /* Destroy event object */
-+    IA_CIPR_FREE(event);
-+}
-+
-+css_err_t
-+ia_cipr_psys_get_event_config(ia_cipr_psys_event_t event,
-+                              ia_cipr_psys_event_config_t *cfg) {
-+    if (!event || !cfg)
-+        return css_err_argument;
-+
-+    /* Write configs from event object to given cfg */
-+    cfg->type = event->event.type;
-+    cfg->command_token = event->event.user_token;
-+    cfg->command_issue_id = event->event.issue_id;
-+    cfg->buffer_handover_bitmap = UINT64_MAX; /* Not used */
-+    cfg->error = event->event.error;
-+    cfg->timeout = event->timeout;
-+    cfg->id = 0;
-+
-+    return css_err_none;
-+}
-+
-+css_err_t
-+ia_cipr_psys_set_event_config(ia_cipr_psys_event_t event,
-+                              const ia_cipr_psys_event_config_t *cfg) {
-+    if (!event || !cfg)
-+        return css_err_argument;
-+
-+    /* Update configuration from cfg to event object */
-+
-+    /* Note: Linux PSYS Driver DQEVENT IOCTL does not use any of the fields as
-+     *       input */
-+    event->event.type = cfg->type;
-+    event->event.user_token = cfg->command_token;
-+    event->event.issue_id = cfg->command_issue_id;
-+    event->event.buffer_idx = 0;
-+    event->event.error = cfg->error;
-+
-+    /* Used as user configurable device poll timeout */
-+    event->timeout = cfg->timeout;
-+
-+    return css_err_none;
-+}
-+
-+ia_cipr_psys_command_t
-+ia_cipr_psys_create_command(ia_cipr_psys_command_config_t *cfg) {
-+    /* Create psys command object with given cfg */
-+    struct _psys_command *cmd;
-+
-+    if (!cfg)
-+        return NULL;
-+
-+    cmd = reinterpret_cast<_psys_command*>(IA_CIPR_CALLOC(1, sizeof(*cmd)));
-+    if (!cmd) {
-+        icamera::LOGE("could not allocate cmd");
-+        return NULL;
-+    }
-+
-+    if (cfg->bufcount > 0) {
-+        cmd->ioc_cmd.bufcount = cfg->bufcount;
-+        /* Allocate memory for an array of DMA-BUF handles */
-+        cmd->ioc_cmd.buffers = (struct ipu_psys_buffer *)IA_CIPR_CALLOC(
-+                                cfg->bufcount,
-+                                sizeof(struct ipu_psys_buffer));
-+        if (!cmd->ioc_cmd.buffers) {
-+            icamera::LOGE("Could not allocate DMA-BUF handle array");
-+            IA_CIPR_FREE(cmd);
-+            return NULL;
-+        }
-+
-+        /* Allocate memory for cipr buffers that user is expected to provide */
-+        cmd->user_buffers =
-+            reinterpret_cast<ia_cipr_buffer_t **>(IA_CIPR_CALLOC(cfg->bufcount,
-+                                                                 sizeof(ia_cipr_buffer_t*)));
-+        if (!cmd->user_buffers) {
-+            icamera::LOGE("Could not allocate DMA-BUF handle array");
-+            IA_CIPR_FREE(cmd->ioc_cmd.buffers);
-+            IA_CIPR_FREE(cmd);
-+            return NULL;
-+        }
-+
-+        cmd->allocated_buffers = cfg->bufcount;
-+    }
-+
-+    /* Return handle for the object */
-+    return (struct _psys_command*)(cmd);
-+}
-+
-+void ia_cipr_psys_destroy_command(ia_cipr_psys_command_t cmd) {
-+    /* Destroy psys command object */
-+
-+    if (!cmd)
-+        return;
-+
-+    IA_CIPR_FREE(cmd->ioc_cmd.buffers);
-+    IA_CIPR_FREE(cmd->user_buffers);
-+    IA_CIPR_FREE(cmd);
-+}
-+
-+css_err_t
-+ia_cipr_psys_get_command_config(ia_cipr_psys_command_t cmd,
-+                                ia_cipr_psys_command_config_t *cfg) {
-+    if (!cmd || !cfg)
-+        return css_err_argument;
-+
-+    /* Update configs and buffer array for user from command object */
-+    cfg->token = cmd->ioc_cmd.user_token;
-+    cfg->issue_id = cmd->ioc_cmd.issue_id;
-+    cfg->priority = cmd->ioc_cmd.priority;
-+    cfg->psys_frequency = cmd->ioc_cmd.min_psys_freq;
-+    cfg->pg = cmd->pg;
-+    cfg->ext_buf = cmd->ext_buf;
-+    cfg->pg_manifest_buf = cmd->pg_manifest_buf;
-+    cfg->id = 0;
-+
-+    /* fields validated at set command */
-+    cfg->bufcount = cmd->allocated_buffers;
-+    cfg->buffers = cmd->user_buffers;
-+
-+    return css_err_none;
-+}
-+
-+css_err_t
-+ia_cipr_psys_set_command_config(ia_cipr_psys_command_t cmd,
-+                                const ia_cipr_psys_command_config_t *cfg) {
-+    ia_cipr_buffer_t *current;
-+    ia_cipr_memory_t memory;
-+    unsigned int i;
-+    css_err_t ret;
-+
-+    if (!cmd || !cfg) {
-+        icamera::LOGE("Invalid argument!");
-+        return css_err_argument;
-+    }
-+
-+    if (cmd->allocated_buffers < cfg->bufcount) {
-+        icamera::LOGE("Config bufcount cannot be higher than in the command!");
-+        return css_err_argument;
-+    }
-+
-+    if (cfg->buffers && cmd->user_buffers != cfg->buffers) {
-+        icamera::LOGE("Buffer array in command config cannot be altered!");
-+        return css_err_argument;
-+    }
-+
-+    if (!cfg->buffers && cmd->ioc_cmd.buffers) {
-+        icamera::LOGE("To nullify buffers, create command with bufcount 0");
-+        return css_err_argument;
-+    }
-+
-+    /* update command configuration into IOC datatype */
-+    /** \todo set_command_config should not use get_memory() primitive, but
-+     *        just reuse the pre-mapped handle.
-+     *  \todo validate that buffers belong to PSYS device (valid dev_priv)
-+     */
-+    ret = ia_cipr_buffer_get_memory(cfg->pg_manifest_buf, &memory);
-+    if (ret != css_err_none)
-+        return ret;
-+    cmd->ioc_cmd.pg_manifest = memory.cpu_ptr;
-+    cmd->ioc_cmd.pg_manifest_size = memory.size;
-+    cmd->pg_manifest_buf = cfg->pg_manifest_buf;
-+
-+    ret = ia_cipr_buffer_get_memory(cfg->ext_buf, &memory);
-+    if (ret != css_err_none) {
-+        if (cfg->pg_params_buf != NULL) {
-+            icamera::LOGW("pg_params_buf-field of CIPR command deprecated!");
-+            ret = ia_cipr_buffer_get_memory(cfg->pg_params_buf, &memory);
-+            if (ret != css_err_none) {
-+                return ret;
-+            }
-+        }
-+    }
-+
-+    if (memory.flags & IA_CIPR_MEMORY_PSYS_API) {
-+        ia_cipr_process_group_command_t * ppg_command_ext =
-+                            reinterpret_cast<ia_cipr_process_group_command_t*>(memory.cpu_ptr);
-+        if (ppg_command_ext->header.size != memory.size
-+            || ppg_command_ext->header.offset
-+               != sizeof(ia_cipr_psys_cmd_ext_header_t)
-+            || (ppg_command_ext->header.version != psys_command_ext_ppg_0
-+               && ppg_command_ext->header.version != psys_command_ext_ppg_1)) {
-+            icamera::LOGE("Invalid command extension buffer received! (%p)",
-+                          cfg->ext_buf);
-+            return css_err_argument;
-+        }
-+
-+        if (ppg_command_ext->header.version == psys_command_ext_ppg_1) {
-+            IA_CIPR_MEMCOPY(&(cmd->ioc_cmd.kernel_enable_bitmap),
-+                            sizeof(cmd->ioc_cmd.kernel_enable_bitmap),
-+                            ppg_command_ext->dynamic_kernel_bitmap,
-+                            sizeof(ppg_command_ext->dynamic_kernel_bitmap));
-+        }
-+
-+        /** \todo FW defined frame_counter is uint8_t */
-+        cmd->ioc_cmd.frame_counter = (uint32_t) ppg_command_ext->frame_counter;
-+        /** \todo queueing to late-binding queue requires UAPI change for
-+         *        queue-id
-+         *  \todo control of events and interrupts requires UAPI changes
-+         */
-+    } else {
-+        cmd->pg_params = memory.cpu_ptr;
-+        cmd->pg_params_size = memory.size;
-+    }
-+    cmd->ext_buf = cfg->ext_buf;
-+    if (cfg->id != 0) {
-+        icamera::LOG2("ID-field of CIPR command deprecated!");
-+    }
-+    cmd->ioc_cmd.user_token = cfg->token;
-+    cmd->ioc_cmd.issue_id = cfg->issue_id;
-+    cmd->ioc_cmd.priority = cfg->priority;
-+    cmd->ioc_cmd.min_psys_freq = cfg->psys_frequency;
-+    cmd->ioc_cmd.bufcount = cfg->bufcount;
-+    cmd->pg = cfg->pg;
-+    if (cfg->pg && cfg->pg->dev_priv) {
-+        /** \todo the fd should be in memory.handle */
-+        if (!(((struct ipu_psys_buffer *)(uintptr_t)cfg->pg->dev_priv)->flags &
-+                        IPU_BUFFER_FLAG_DMA_HANDLE)) {
-+            icamera::LOGE("Wrong flag!", __func__);
-+            return css_err_general;
-+        }
-+        cmd->ioc_cmd.pg = ((struct ipu_psys_buffer *)
-+                           (uintptr_t)cfg->pg->dev_priv)->base.fd;
-+    }
-+
-+    if (!cmd->ioc_cmd.buffers)
-+        return css_err_none;
-+
-+    for (i = 0; i < cfg->bufcount; i++) {
-+        current = cfg->buffers[i];
-+        if (!current) {
-+            memset(&cmd->ioc_cmd.buffers[i], 0,
-+                   sizeof(cmd->ioc_cmd.buffers[i]));
-+            continue;
-+        } else if (!current->dev_priv && ia_cipr_buffer_is_region(current)) {
-+            current = ia_cipr_buffer_get_parent(current);
-+            if (!current) {
-+                icamera::LOGE("Cannot find the parent of buffer:%p", cfg->buffers[i]);
-+                return css_err_argument;
-+            }
-+        }
-+        if (!current->dev_priv || !(current->mem.flags & IA_CIPR_MEMORY_MIGRATED)) {
-+            icamera::LOGE("Cannot queue buffer object %p that is not migrated with the device!",
-+                  current);
-+            return css_err_argument;
-+        }
-+        /* dma-buf handle from buffer object */
-+        cmd->ioc_cmd.buffers[i] = *(struct ipu_psys_buffer *)
-+                                   (uintptr_t)current->dev_priv;
-+        /* offset and size from region object */
-+        cmd->ioc_cmd.buffers[i].data_offset = current->offset;
-+        cmd->ioc_cmd.buffers[i].bytes_used = current->mem.size;
-+    }
-+
-+    return css_err_none;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
-new file mode 100644
-index 000000000000..aa1724c75c1e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
-@@ -0,0 +1,210 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __ASSERT_SUPPORT_H
-+#define __ASSERT_SUPPORT_H
-+
-+/* This file provides support for run-time assertions
-+ * and compile-time assertions.
-+ *
-+ * Run-time asstions are provided via the following syntax:
-+ *     assert(condition)
-+ * Run-time assertions are disabled using the NDEBUG flag.
-+ *
-+ * Compile time assertions are provided via the following syntax:
-+ *     COMPILATION_ERROR_IF(condition);
-+ * A compile-time assertion will fail to compile if the condition is false.
-+ * The condition must be constant, such that it can be evaluated
-+ * at compile time.
-+ *
-+ * OP___assert is deprecated.
-+ */
-+
-+#define IA_CSS_ASSERT(expr) assert(expr)
-+
-+#ifdef __KLOCWORK__
-+/* Klocwork does not see that assert will lead to abortion
-+ * as there is no good way to tell this to KW and the code
-+ * should not depend on assert to function (actually the assert
-+ * could be disabled in a release build) it was decided to
-+ * disable the assert for KW scans (by defining NDEBUG)
-+ * see also:
-+ * http://www.klocwork.com/products/documentation/current/
-+ * Tuning_C/C%2B%2B_analysis#Assertions
-+ */
-+#define NDEBUG
-+#endif /* __KLOCWORK__ */
-+
-+/**
-+ * The following macro can help to test the size of a struct at compile
-+ * time rather than at run-time. It does not work for all compilers; see
-+ * below.
-+ *
-+ * Depending on the value of 'condition', the following macro is expanded to:
-+ * - condition==true:
-+ *     an expression containing an array declaration with negative size,
-+ *     usually resulting in a compilation error
-+ * - condition==false:
-+ *     (void) 1; // C statement with no effect
-+ *
-+ * example:
-+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
-+ *            SIZE_OF_HOST_SP_QUEUES_STRUCT);
-+ *
-+ * verify that the macro indeed triggers a compilation error with your compiler:
-+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
-+ *            (sizeof(struct host_sp_queues)+1) );
-+ *
-+ * Not all compilers will trigger an error with this macro;
-+ * use a search engine to search for BUILD_BUG_ON to find other methods.
-+ */
-+#ifdef __XTENSA_FW__
-+
-+#include "assert_support_xtensa.h"
-+
-+#else
-+
-+#define COMPILATION_ERROR_IF(condition) \
-+((void)sizeof(char[1 - 2*!!(condition)]))
-+
-+#endif
-+/* Compile time assertion */
-+#ifndef CT_ASSERT
-+#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
-+#endif /* CT_ASSERT */
-+
-+#ifdef NDEBUG
-+
-+#define assert(cnd) ((void)0)
-+
-+#else
-+
-+#include "storage_class.h"
-+
-+#if defined(_MSC_VER)
-+#ifdef _KERNEL_MODE
-+/* Windows kernel mode compilation */
-+#include <ntddk.h>
-+#define assert(cnd) ASSERT(cnd)
-+#else
-+/* Windows usermode compilation */
-+#include <assert.h>
-+#endif
-+
-+#elif defined(__XTENSA_FW__)
-+/* assert added in assert_support_xtensa*/
-+#elif defined(__HIVECC)
-+
-+/*
-+ * target: assert disabled
-+ * sched: assert enabled only when SCHED_DEBUG is defined
-+ * unsched: assert enabled
-+ */
-+#if defined(HRT_HW)
-+#define assert(cnd) ((void)0)
-+#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
-+#define assert(cnd) ((void)0)
-+#elif defined(PIPE_GENERATION)
-+#define assert(cnd) ((void)0)
-+#else
-+#include <hive/support.h>
-+#define assert(cnd) OP___csim_assert(cnd)
-+#endif
-+
-+#elif defined(__KERNEL__)
-+#include <linux/bug.h>
-+
-+#ifndef KERNEL_ASSERT_TO_BUG
-+#ifndef KERNEL_ASSERT_TO_BUG_ON
-+#ifndef KERNEL_ASSERT_TO_WARN_ON
-+#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
-+#ifndef KERNEL_ASSERT_UNDEFINED
-+/* Default */
-+#define KERNEL_ASSERT_TO_BUG
-+#endif /*KERNEL_ASSERT_UNDEFINED*/
-+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
-+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
-+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
-+#endif /*KERNEL_ASSERT_TO_BUG*/
-+
-+#ifdef KERNEL_ASSERT_TO_BUG
-+/* TODO: it would be cleaner to use this:
-+ * #define assert(cnd) BUG_ON(cnd)
-+ * but that causes many compiler warnings (==errors) under Android
-+ * because it seems that the BUG_ON() macro is not seen as a check by
-+ * gcc like the BUG() macro is. */
-+#define assert(cnd)                            \
-+    do {                                \
-+        if (!(cnd)) {                        \
-+            BUG();                        \
-+        }                            \
-+    } while (0)
-+#endif /*KERNEL_ASSERT_TO_BUG*/
-+
-+#ifdef KERNEL_ASSERT_TO_BUG_ON
-+#define assert(cnd) BUG_ON(!(cnd))
-+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
-+
-+#ifdef KERNEL_ASSERT_TO_WARN_ON
-+#define assert(cnd) WARN_ON(!(cnd))
-+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
-+
-+#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
-+#define assert(cnd)                            \
-+    do {                                \
-+        int not_cnd = !(cnd);                    \
-+        WARN_ON(not_cnd);                    \
-+        if (not_cnd) {                        \
-+            for (;;) {                    \
-+            }                        \
-+        }                            \
-+    } while (0)
-+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
-+
-+#ifdef KERNEL_ASSERT_UNDEFINED
-+#include KERNEL_ASSERT_DEFINITION_FILESTRING
-+#endif /*KERNEL_ASSERT_UNDEFINED*/
-+
-+#elif defined(__FIST__) || defined(__GNUC__)
-+
-+#include "assert.h"
-+
-+#else /* default is for unknown environments */
-+#define assert(cnd) ((void)0)
-+#endif
-+
-+#endif /* NDEBUG */
-+#ifndef PIPE_GENERATION
-+/* Deprecated OP___assert, this is still used in ~1000 places
-+ * in the code. This will be removed over time.
-+ * The implementation for the pipe generation tool is in see support.isp.h */
-+#define OP___assert(cnd) assert(cnd)
-+
-+#ifdef C_RUN
-+#define compile_time_assert(cond) OP___assert(cond)
-+#else
-+#include "storage_class.h"
-+extern void _compile_time_assert(void);
-+STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
-+{
-+    /* Call undefined function if cond is false */
-+    if (!cond)
-+        _compile_time_assert();
-+}
-+#endif
-+#endif /* PIPE_GENERATION */
-+
-+#endif /* __ASSERT_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
-new file mode 100644
-index 000000000000..98fd104f05a8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
-@@ -0,0 +1,239 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __CPU_MEM_SUPPORT_H
-+#define __CPU_MEM_SUPPORT_H
-+
-+#include "storage_class.h"
-+#include "assert_support.h"
-+#include "type_support.h"
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
-+{
-+    /* memcpy cannot be used in in Windows (function is not allowed),
-+     * and the safer function memcpy_s is not available on other platforms.
-+     * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
-+     * but sub-optimal way.
-+     */
-+    unsigned int i;
-+
-+    assert(dst != NULL && src != NULL);
-+
-+    if (!(dst != NULL && src != NULL)) {
-+        return NULL;
-+    }
-+    for (i = 0; i < size; i++) {
-+        ((char *)dst)[i] = ((char *)src)[i];
-+    }
-+    return dst;
-+}
-+
-+#if defined(__KERNEL__)
-+
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <asm/cacheflush.h>
-+
-+/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
-+ * error checking code added to SDK that uses calls to exit function
-+ */
-+#define exit(a) return
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+    return kmalloc(size, GFP_KERNEL);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+    return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
-+{
-+    /* nothing here yet */
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+    return memset(dst, 0, size); /* available in kernel in linux/string.h */
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+    kfree(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+    /* parameter check here */
-+    if (ptr == NULL)
-+        return;
-+
-+    clflush_cache_range(ptr, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+    /* for now same as flush */
-+    ia_css_cpu_mem_cache_flush(ptr, size);
-+}
-+
-+#elif defined(_MSC_VER)
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stddef.h>
-+
-+extern void *hrt_malloc(size_t bytes, int zero_mem);
-+extern void *hrt_free(void *ptr);
-+extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
-+extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
-+
-+#define malloc(a)    hrt_malloc(a, 1)
-+#define free(a)        hrt_free(a)
-+
-+#define CSS_PAGE_SIZE    (1<<12)
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+    return malloc(size);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+    unsigned int buffer_size = size;
-+
-+    /* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
-+     * to request system memory. If the number of bytes is equal or bigger
-+     * than the page size, then the returned address is page aligned,
-+     * but if it's smaller it's not necessarily page-aligned We agreed
-+     * with Windows team that we allocate a full page
-+     * if it's less than page size
-+    */
-+    if (buffer_size < CSS_PAGE_SIZE)
-+        buffer_size = CSS_PAGE_SIZE;
-+
-+    return ia_css_cpu_mem_alloc(buffer_size);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+    return memset(dst, 0, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+    free(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+#ifdef _KERNEL_MODE
-+    hrt_mem_cache_flush(ptr, size);
-+#else
-+    (void)ptr;
-+    (void)size;
-+#endif
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+#ifdef _KERNEL_MODE
-+    hrt_mem_cache_invalidate(ptr, size);
-+#else
-+    (void)ptr;
-+    (void)size;
-+#endif
-+}
-+
-+#else
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stddef.h>
-+/* Needed for the MPROTECT */
-+#include <unistd.h>
-+#include <sys/types.h>
-+
-+/* For host only, not fw */
-+#ifndef __XTENSA_FW__
-+#include <sys/mman.h>
-+#include <malloc.h>
-+#endif
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+    return malloc(size);
-+}
-+
-+#ifdef _SC_PAGE_SIZE
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+    int pagesize;
-+
-+    pagesize = sysconf(_SC_PAGE_SIZE);
-+    return memalign(pagesize, size);
-+}
-+#endif /*_SC_PAGE_SIZE*/
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+    return memset(dst, 0, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+    free(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+    /* not needed in simulation */
-+    (void)ptr;
-+    (void)size;
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+    /* not needed in simulation */
-+    (void)ptr;
-+    (void)size;
-+}
-+
-+#endif
-+#endif /* __CPU_MEM_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
-new file mode 100644
-index 000000000000..54d3496d6635
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __ERROR_SUPPORT_H
-+#define __ERROR_SUPPORT_H
-+
-+#if defined(__KERNEL__)
-+#include <linux/errno.h>
-+#else
-+#include <errno.h>
-+#endif
-+#include <assert_support.h>
-+
-+/* OS-independent definition of IA_CSS errno values */
-+/* #define IA_CSS_EINVAL 1 */
-+/* #define IA_CSS_EFAULT 2 */
-+
-+#ifdef __HIVECC
-+#define ERR_EMBEDDED 1
-+#else
-+#define ERR_EMBEDDED 0
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define DECLARE_ERRVAL
-+#else
-+#define DECLARE_ERRVAL \
-+    int _errval = 0;
-+#endif
-+
-+/* Use "owl" in while to prevent compiler warnings in Windows */
-+#define ALWAYS_FALSE ((void)0, 0)
-+
-+#define verifret(cond, error_type) \
-+do {                               \
-+    if (!(cond)) {             \
-+        return error_type; \
-+    }                          \
-+} while (ALWAYS_FALSE)
-+
-+#define verifjmp(cond, error_tag)    \
-+do {                                \
-+    if (!(cond)) {                   \
-+        goto error_tag;             \
-+    }                               \
-+} while (ALWAYS_FALSE)
-+
-+#define verifexit(cond)  \
-+do {                               \
-+    if (!(cond)) {              \
-+        goto EXIT;         \
-+    }                          \
-+} while (ALWAYS_FALSE)
-+
-+#if ERR_EMBEDDED
-+#define verifexitval(cond, error_tag) \
-+do {                               \
-+    assert(cond);           \
-+} while (ALWAYS_FALSE)
-+#else
-+#define verifexitval(cond, error_tag) \
-+do {                               \
-+    if (!(cond)) {              \
-+        _errval = (error_tag); \
-+        goto EXIT;         \
-+    }                          \
-+} while (ALWAYS_FALSE)
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define haserror(error_tag) (0)
-+#else
-+#define haserror(error_tag) \
-+    (_errval == (error_tag))
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define noerror() (1)
-+#else
-+#define noerror() \
-+    (_errval == 0)
-+#endif
-+
-+#define verifjmpexit(cond)         \
-+do {                               \
-+    if (!(cond)) {             \
-+        goto EXIT;         \
-+    }                          \
-+} while (ALWAYS_FALSE)
-+
-+#define verifjmpexitsetretval(cond, retval)         \
-+do {                               \
-+    if (!(cond)) {              \
-+        retval = -1;       \
-+        goto EXIT;         \
-+    }                          \
-+} while (ALWAYS_FALSE)
-+
-+#endif /* __ERROR_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
-new file mode 100644
-index 000000000000..b5120abe45fb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __FRAME_SUPPORT_H
-+#define __FRAME_SUPPORT_H
-+
-+#define INTERLEAVED_FRAME_TYPE_NUM_PLANES    1
-+#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES    2
-+#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES    3
-+#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES    4
-+
-+/* genpipe doesn't support B = A in enum definition */
-+#ifndef PIPE_GENERATION
-+
-+enum image_iterator_planes {
-+    IMG_ITER_PLANE_0 = 0,
-+    IMG_ITER_PLANE_1,
-+    IMG_ITER_PLANE_2,
-+    IMG_ITER_PLANE_3,
-+    IMG_ITER_MAX_NUM_PLANES
-+};
-+
-+enum interleaved_frames_types_planes {
-+    INTERLEAVED_FRAME_MAIN_PLANE = 0,
-+    INTERLEAVED_FRAME_NUM_PLANES
-+};
-+
-+enum yuv_semi_planar_frame_types_planes {
-+    YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
-+    YUV_SEMI_PLANAR_FRAME_UV_PLANE,
-+    YUV_SEMI_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+enum yuv_planar_frame_types_planes {
-+    YUV_PLANAR_FRAME_Y_PLANE = 0,
-+    YUV_PLANAR_FRAME_U_PLANE,
-+    YUV_PLANAR_FRAME_V_PLANE,
-+    YUV_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+enum bayer_planar_frame_types_planes {
-+    BAYER_PLANAR_FRAME_GR_PLANE = 0,
-+    BAYER_PLANAR_FRAME_R_PLANE,
-+    BAYER_PLANAR_FRAME_B_PLANE,
-+    BAYER_PLANAR_FRAME_GB_PLANE,
-+    BAYER_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+#endif /* PIPE_GENERATION */
-+#endif    /* __FRAME_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
-new file mode 100644
-index 000000000000..8a8af09ea279
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_BASE_TYPES_H
-+#define __IA_CSS_BASE_TYPES_H
-+
-+#include "type_support.h"
-+
-+#define VIED_VADDRESS_BITS                32
-+
-+#define DEVICE_DESCRIPTOR_ID_BITS            32
-+
-+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
-+    (2 * IA_CSS_UINT32_T_BITS + \
-+    VIED_VADDRESS_BITS + \
-+    2 * IA_CSS_UINT16_T_BITS)
-+
-+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
-+    (2 * IA_CSS_UINT32_T_BITS + \
-+    VIED_VADDRESS_BITS + \
-+    2 * IA_CSS_UINT16_T_BITS)
-+
-+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
-+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
-+
-+typedef uint32_t vied_vaddress_t;
-+
-+typedef struct {
-+    uint8_t device_id;
-+    uint8_t instance_id;
-+    uint8_t channel_id;
-+    uint8_t section_id;
-+} device_descriptor_fields_t;
-+
-+typedef union {
-+    device_descriptor_fields_t fields;
-+    uint32_t data;
-+} device_descriptor_id_t;
-+
-+typedef uint16_t ia_css_process_id_t;
-+
-+#endif /* __IA_CSS_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
-new file mode 100644
-index 000000000000..683c2f5d23e1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
-@@ -0,0 +1,789 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
-+#define __IA_CSS_ISA_PARAMETER_DEFS_H
-+
-+#include "ia_css_isa_parameter_defs_dep.h"
-+
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL            (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL        (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN            (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC            (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS            (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF        (1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM        (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE        (1)
-+
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE            (0)
-+
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF        (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE        (0)
-+
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_INL                (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC                (1)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS                (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE            (0)
-+
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC            (1)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE            (0)
-+
-+/* ==================== INL specs - START ==================== */
-+/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT                        (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0                        (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0                    (0x204)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1                        (0x204)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1                    (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT                        (0)
-+
-+/* Spatial Parameter Terminal In does not exist for INL */
-+
-+/* Spatial Parameter Terminal Out does not exist for INL */
-+
-+/* Sliced Parameter Terminal In does not exist for INL */
-+
-+/* Sliced Parameter Terminal Out does not exist for INL */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT                            (0)
-+/* ==================== INL specs - END ==================== */
-+
-+/* ==================== BLC_GLOBAL specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0                    (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0                    (0xC08)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1                    (0x20)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1                    (0xC0C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT                    (0)
-+
-+/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (0)
-+/* ==================== BLC_GLOBAL specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT                (0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT            (4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (8)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT                (0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT            (4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT                (0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT            (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4    (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5    (0x380)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6    (0x680)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7        (0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7    (0x980)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7        (0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+/* ==================== PCLN specs - START ==================== */
-+/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT                        (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0                        (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0                    (0x820)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1                        (0x820)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1                    (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT                        (0)
-+
-+/* Spatial Parameter Terminal In does not exist for PCLN */
-+
-+/* Spatial Parameter Terminal Out does not exist for PCLN */
-+
-+/* Sliced Parameter Terminal In does not exist for PCLN */
-+
-+/* Sliced Parameter Terminal Out does not exist for PCLN */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT                            (0)
-+/* ==================== PCLN specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
-+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+/* ==================== BNR specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
-+/* ==================== BNR specs - END ==================== */
-+
-+/* ==================== ISA_DM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
-+
-+/* ==================== ISA_DM specs - END ==================== */
-+
-+/* ==================== IDS specs - START ==================== */
-+/* IDS is HW revision dependent */
-+/* ==================== IDS specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AWB specs - START ==================== */
-+/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
-+/* ==================== 3A_STAT_AWB specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AF specs - START ==================== */
-+/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0x88)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x40C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                    (0)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                (2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM            (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE        (32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH        (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH        (32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT        (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT        (32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0            (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0            (0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1            (0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1            (0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1        (0x200)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0xC)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x400)
-+/* ==================== 3A_STAT_AF specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0                (0x7C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0                (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
-+
-+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
-+/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AE specs - START ==================== */
-+/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
-+   found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x18C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0                (0x2000)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0                (0x200)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
-+
-+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (2)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x180)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1                    (0x180)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1                    (0x0)
-+/* ==================== 3A_STAT_AE specs - END ==================== */
-+
-+/* TODO: REMOVE BACKWARD COMPATIBILITY */
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
-+
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
-+/* END OF TODO */
-+
-+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
-new file mode 100644
-index 000000000000..3de76b774bba
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
-@@ -0,0 +1,580 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
-+#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
-+
-+#include "ia_css_ff_awb_statistics_param_defs.h"
-+
-+/*
-+ * TODO: Adapt this file for IPU6!
-+ */
-+
-+/* ==================== DPC_V2 specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2            (1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2            (1)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2            (1)
-+
-+/* ==================== PDAF specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF                (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF            (1)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF                (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF                (0)
-+
-+/* ==================== DPC_PEXT specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT            (0)
-+
-+/* ==================== SIS specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS            (0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS            (0)
-+
-+/* ==================== STREAM_CROP specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP            (0)
-+
-+/* ========== PIFCONV_A_INPUT specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT        (0)
-+
-+/* ========== PIFCONV_B_INPUT specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT        (0)
-+
-+/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
-+
-+/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED        (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED        (0)
-+
-+/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS            (0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS            (0)
-+
-+/* ==================== IDS specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT                        (5)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                    (0x0C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x00)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1                    (0x10)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1                    (0x14)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2                    (0x18)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2                    (0x50)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3                    (0x20C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3                    (0x68)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4                    (0x24)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4                    (0x274)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT                        (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                        (0x08)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x0C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT                    (0)
-+
-+/* Spatial Parameter Terminal In does not exist for IDS */
-+
-+/* Spatial Parameter Terminal Out does not exist for IDS */
-+
-+/* Sliced Parameter Terminal In does not exist for IDS */
-+
-+/* Sliced Parameter Terminal Out does not exist for IDS */
-+
-+/* ==================== IDS specs - END ==================== */
-+
-+/* ==================== DPC specs used in PSYS - START ==================== */
-+/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT                        (5)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4                    (0x8)        /* AF Statistics pixels */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4                    (0x34D4)    /* AF Statistics pixels */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT                        (4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (0)
-+
-+/* Spatial Parameter Terminal In does not exist for DPC */
-+
-+/* Spatial Parameter Terminal Out does not exist for DPC */
-+
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT                    (2)
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x3380)    /* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x1000)    /* DPC static LUT */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x0)        /* DPC static LUT */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x1000)    /* DPC static LUT */
-+
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (2)
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x34CC)    /* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x800)        /* AF Pixels metadata */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x2000)    /* AF Pixels metadata */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x800)        /* AF Pixels metadata */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT                        (3)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                        (0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x337C) /* DPC Control */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                        (0x1B8)        /* CfgUnitMapping */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x31C0)    /* CfgUnitMapping */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                        (0x100)        /* AF pixels grid cfg */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3388)    /* AF pixels grid cfg */
-+
-+/* ==================== DPC specs - END ==================== */
-+
-+/* ==================== DPC_PEXT specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT                        (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0                    (0x8)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0                    (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1                    (0x8)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1                    (0xC)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT                    (0)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT                        (0)
-+/* ==================== DPC_PEXT specs - END ==================== */
-+
-+/* TODO check ae values */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
-+
-+/* todo check gddpc_pext values when enabling this terminal */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
-+
-+/* ==================== PAF specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT                            (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0                        (0x18)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0                        (0x0)
-+
-+/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1                        (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1                        (-0xB0)
-+
-+#define    IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                        (0)
-+/* Number of PAF blocks = 12*16 PAF blocks
-+ * Max number of phase steps in each block: 11 steps (0-10)
-+ *     for step 10, only the LSB values are valid and MSB 2bytes are reserved
-+ *     Hence for each block height, we will have to read in 12 steps
-+ * Size of each phase value =  2 bytes
-+ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
-+ * */
-+
-+/* Spatial Parameter Terminal In does not exist for PAF*/
-+
-+/* Spatial Parameter Terminal Out for PAF*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                    (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM                (1)    /**/
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0                (0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0                (0x18)    /*Size of each phase output in a grid*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0            (0x200)    /*FF register offset from kernel base*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0            (0x180)    /*Determines the next FF location*/
-+
-+/* Sliced Parameter Terminal In does not exist for PAF*/
-+
-+/* Sliced Parameter Terminal Out does not exist for PAF*/
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT                            (0)
-+/* ==================== PAF specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x20)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT            IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
-+
-+/* ==================== LCA specs -- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT            (6)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0    (0xc) /* 0x0 to 0xb */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1    (0xcc) /* 0x10 to 0xdb */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1    (0x10)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2    (0x510) /* 0x100 to 0x60f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2    (0x100)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3    (0x510) /* 0x6c0 to 0xbcf */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3    (0x6c0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4    (0x510) /* 0xc80 to 0x118f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4    (0xc80)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5    (0x510) /* 0x1240 to 0x174f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5    (0x1240)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT        (0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0        (4) /* 0x1800 to 0x1803*/
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x1800)
-+/* ==================== LCA specs -- END ==================== */
-+
-+/* ==================== WBA_WBA specs - START ==================== */
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
-+/* ==================== WBA_WBA specs - END ==================== */
-+
-+/* leave those for now to pass isys compilation */
-+/* ==================== SIS_WB_SIS specs - START ==================== */
-+/* This device is similar to the WBA device in the PSA (with respect to registermap) */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
-+
-+/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
-+
-+/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
-+/* ==================== SIS_WB_SIS specs - END ==================== */
-+
-+/* ==================== SIS_SIS specs - START ==================== */
-+/* TODO: The SIS device does not yet expose the functionality for cropping */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
-+
-+/* Spatial Parameter Terminal In does not exist for SIS_SIS */
-+
-+/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
-+/* ==================== SIS_SIS specs - END ==================== */
-+
-+/* ==================== STREAM_CROP specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT    (0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x4)
-+/* ==================== STREAM_CROP specs - END ==================== */
-+
-+/* ==================== BNR specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
-+/* ==================== BNR specs - END ==================== */
-+
-+/* ==================== ISA_DM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
-+
-+/* ==================== ISA_DM specs - END ==================== */
-+
-+/* ====================  specs PIFCONV_SIS_A- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0        (0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT        (0)
-+/* ====================  specs PIFCONV_SIS_A- END ==================== */
-+
-+/* ====================  specs PIFCONV_SIS_B- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0        (0x12)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT        (0)
-+/* ====================  specs PIFCONV_SIS_B- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0        (0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT        (0)
-+/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0        (0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT        (0)
-+/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0        (0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT        (0)
-+/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0        (0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT        (0)
-+/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT            (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0        (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT        (0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT            (2)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0        (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1        (0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1        (0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
-+/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
-+
-+/* ==================== PIXEL FORMATTER specs - START ==================== */
-+/* The base address of the Pixel Formatter device is 0x271000 */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0    (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT        (0x0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0        (0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
-+                                            and base address of size register in the Pixel Formatter device is 0x24. */
-+
-+/* TODO: REMOVE BACKWARD COMPATIBILITY */
-+/* NOT USED defs - needed for legacy*/
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
-+/* END OF TODO */
-+
-+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
-new file mode 100644
-index 000000000000..508ca278ba65
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
-@@ -0,0 +1,262 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_H
-+#define __IA_CSS_KERNEL_BITMAP_H
-+
-+/*! \file */
-+
-+/** @file ia_css_kernel_bitmap.h
-+ *
-+ * The types and operations to make logic decisions given kernel bitmaps
-+ * "ia_css_kernel_bitmap_t" can be larger than native types
-+ */
-+
-+#include <type_support.h>
-+#include "vied_nci_psys_resource_model.h"
-+#include "ia_css_kernel_bitmap_storage_class.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
-+#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
-+    (sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
-+#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
-+    ((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
-+
-+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
-+ * problems in the compiler.
-+ */
-+typedef struct {
-+    IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
-+} ia_css_kernel_bitmap_elems_t;
-+
-+/** Users should make no assumption about the actual type of
-+ * ia_css_kernel_bitmap_t.
-+ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
-+ * case they erroneously assume that this type is uint64_t and they
-+ * cannot change their implementation.
-+ */
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
-+#else
-+typedef uint64_t ia_css_kernel_bitmap_t;
-+#if IA_CSS_KERNEL_BITMAP_BITS > 64
-+#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
-+    with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+#endif
-+#endif
-+
-+/*! Print the bits of a kernel bitmap
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_kernel_bitmap_print(
-+    const ia_css_kernel_bitmap_t    bitmap,
-+    void                *fid);
-+
-+/*! Create an empty kernel bitmap
-+
-+ @return bitmap = 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
-+
-+/*! Creates the complement of a kernel bitmap
-+ * @param    [in] bitmap kernel bitmap
-+ * @return ~bitmap
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
-+    const ia_css_kernel_bitmap_t bitmap);
-+
-+/*! Create the union of two kernel bitmaps
-+
-+ @param    [in] bitmap0                    kernel bitmap 0
-+ @param    [in] bitmap1                    kernel bitmap 1
-+
-+ @return bitmap0 | bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1);
-+
-+/*! Create the intersection of two kernel bitmaps
-+
-+ @param    [in] bitmap0                    kernel bitmap 0
-+ @param    [in] bitmap1                    kernel bitmap 1
-+
-+ @return bitmap0 & bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1);
-+
-+/*! Check if the kernel bitmaps is empty
-+
-+ @param    [in] bitmap                    kernel bitmap
-+
-+ @return bitmap == 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_empty(
-+    const ia_css_kernel_bitmap_t            bitmap);
-+
-+/*! Check if the intersection of two kernel bitmaps is empty
-+
-+ @param    [in] bitmap0                    kernel bitmap 0
-+ @param    [in] bitmap1                    kernel bitmap 1
-+
-+ @return (bitmap0 & bitmap1) == 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_intersection_empty(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1);
-+
-+/*! Check if the second kernel bitmap is a subset of the first (or equal)
-+
-+ @param    [in] bitmap0                    kernel bitmap 0
-+ @param    [in] bitmap1                    kernel bitmap 1
-+
-+ Note: An empty set is always a subset, this function
-+ returns true if bitmap 1 is empty
-+
-+ @return (bitmap0 & bitmap1) == bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_subset(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1);
-+
-+/*! Check if the kernel bitmaps are equal
-+
-+ @param    [in] bitmap0                    kernel bitmap 0
-+ @param    [in] bitmap1                    kernel bitmap 1
-+
-+ @return bitmap0 == bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_equal(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1);
-+
-+/*! Right shift kernel bitmap
-+
-+ @param    [in] bitmap                    kernel bitmap 0
-+
-+ @return bitmap >> 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
-+    const ia_css_kernel_bitmap_t            bitmap);
-+
-+/*! Check if the kernel bitmaps contains only a single element
-+
-+ @param    [in] bitmap                    kernel bitmap
-+
-+ @return weight(bitmap) == 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_onehot(
-+    const ia_css_kernel_bitmap_t            bitmap);
-+
-+/*! Checks whether a specific kernel bit is set
-+ * @return bitmap[index] == 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+int ia_css_is_kernel_bitmap_set(
-+    const ia_css_kernel_bitmap_t    bitmap,
-+    const unsigned int        index);
-+
-+/*! Create the union of a kernel bitmap with a onehot bitmap
-+ * with a bit set at index
-+
-+ @return bitmap[index] |= 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
-+    const ia_css_kernel_bitmap_t            bitmap,
-+    const unsigned int                        index);
-+
-+/*! Set elem_index-th 32-bit element of the bitmap
-+ * to elem_value
-+
-+ @return updated bitmap
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
-+    ia_css_kernel_bitmap_t            bitmap,
-+    const unsigned int            elem_index,
-+    const uint32_t                elem_value);
-+
-+/*! Creates kernel bitmap using a uint64 value.
-+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
-+    const uint64_t    value);
-+
-+/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
-+ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
-+ *  are returned.
-+ *  @return uint64_t representation of value
-+*/
-+extern uint64_t ia_css_kernel_bitmap_to_uint64(
-+    const ia_css_kernel_bitmap_t value);
-+
-+/*! Creates a kernel bitmap with the bit at index 'index' removed.
-+ * @return ~(1 << index) & bitmap
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
-+    const ia_css_kernel_bitmap_t    bitmap,
-+    const unsigned int        index);
-+
-+/*! Set a previously clear field of a kernel bitmap at index
-+
-+ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
-+    const ia_css_kernel_bitmap_t            bitmap,
-+    const unsigned int                        index);
-+
-+/*! Create a onehot kernel bitmap with a bit set at index
-+
-+ @return bitmap[index] = 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
-+    const unsigned int                        index);
-+
-+/*! Create a random bitmap
-+
-+ @return bitmap[index] = 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
-+
-+/*! @} */
-+
-+#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#include "ia_css_kernel_bitmap_impl.h"
-+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
-new file mode 100644
-index 000000000000..45dbcda2da4d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
-@@ -0,0 +1,340 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
-+#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
-+
-+#include <ia_css_kernel_bitmap.h>
-+#include <type_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include "math_support.h"
-+#include "ia_css_psys_kernel_trace.h"
-+#include "ia_css_kernel_bitmap_storage_class.h"
-+
-+STORAGE_CLASS_INLINE
-+int ia_css_kernel_bitmap_compute_weight(
-+    const ia_css_kernel_bitmap_t            bitmap)
-+{
-+    ia_css_kernel_bitmap_t    loc_bitmap;
-+    int    weight = 0;
-+    int    i;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_compute_weight(): enter:\n");
-+
-+    loc_bitmap = bitmap;
-+
-+    /* In fact; do not need the iterator "i" */
-+    for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
-+            !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
-+        weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
-+        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
-+    }
-+
-+    return weight;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_intersection_empty(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1)
-+{
-+    ia_css_kernel_bitmap_t intersection;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
-+
-+    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
-+    return ia_css_is_kernel_bitmap_empty(intersection);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_empty(
-+    const ia_css_kernel_bitmap_t            bitmap)
-+{
-+    unsigned int i;
-+    bool is_empty = true;
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_is_kernel_bitmap_empty(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        is_empty &= bitmap.data[i] == 0;
-+    }
-+#else
-+    NOT_USED(i);
-+    is_empty = (bitmap == 0);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return is_empty;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_equal(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1)
-+{
-+    unsigned int i;
-+    bool is_equal = true;
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_is_kernel_bitmap_equal(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
-+    }
-+#else
-+    NOT_USED(i);
-+    is_equal = (bitmap0 == bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return is_equal;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_onehot(
-+    const ia_css_kernel_bitmap_t            bitmap)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_is_kernel_bitmap_onehot(): enter:\n");
-+    return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_subset(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1)
-+{
-+    ia_css_kernel_bitmap_t intersection;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_is_kernel_bitmap_subset(): enter:\n");
-+
-+    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
-+    return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
-+{
-+    unsigned int i;
-+    ia_css_kernel_bitmap_t bitmap = {{0} };
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_clear(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        bitmap.data[i] = 0;
-+    }
-+#else
-+    NOT_USED(i);
-+    bitmap = 0;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return bitmap;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
-+    const ia_css_kernel_bitmap_t bitmap)
-+{
-+    unsigned int i;
-+    ia_css_kernel_bitmap_t result = {{0} };
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_complement(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        result.data[i] = ~bitmap.data[i];
-+    }
-+#else
-+    NOT_USED(i);
-+    result = ~bitmap;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1)
-+{
-+    unsigned int i;
-+    ia_css_kernel_bitmap_t result = {{0} };
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_union(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
-+    }
-+#else
-+    NOT_USED(i);
-+    result = (bitmap0 | bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
-+    const ia_css_kernel_bitmap_t            bitmap0,
-+    const ia_css_kernel_bitmap_t            bitmap1)
-+{
-+    unsigned int i;
-+    ia_css_kernel_bitmap_t result = {{0} };
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_intersection(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
-+    }
-+#else
-+    NOT_USED(i);
-+    result = (bitmap0 & bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
-+    const ia_css_kernel_bitmap_t            bitmap,
-+    const unsigned int                        index)
-+{
-+    ia_css_kernel_bitmap_t    bit_mask;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_set(): enter:\n");
-+
-+    bit_mask = ia_css_kernel_bit_mask(index);
-+    return ia_css_kernel_bitmap_union(bitmap, bit_mask);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
-+    const ia_css_kernel_bitmap_t    bitmap,
-+    const unsigned int        index)
-+{
-+    ia_css_kernel_bitmap_t result;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_unset(): enter:\n");
-+
-+    result = ia_css_kernel_bit_mask(index);
-+    result = ia_css_kernel_bitmap_complement(result);
-+    return ia_css_kernel_bitmap_intersection(bitmap, result);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
-+    const ia_css_kernel_bitmap_t            bitmap,
-+    const unsigned int                        index)
-+{
-+    ia_css_kernel_bitmap_t    ret;
-+    ia_css_kernel_bitmap_t    bit_mask;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_set_unique(): enter:\n");
-+
-+    ret = ia_css_kernel_bitmap_clear();
-+    bit_mask = ia_css_kernel_bit_mask(index);
-+
-+    if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
-+            && !ia_css_is_kernel_bitmap_empty(bit_mask)) {
-+        ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
-+    }
-+    return ret;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
-+    const unsigned int                        index)
-+{
-+    unsigned int elem_index;
-+    unsigned int elem_bit_index;
-+    ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
-+
-+    /* Assert disabled for staging, because some PGs do not satisfy this condition */
-+    /* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bit_mask(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
-+        elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+        elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+        assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
-+
-+        bit_mask.data[elem_index] = 1 << elem_bit_index;
-+    }
-+#else
-+    NOT_USED(elem_index);
-+    NOT_USED(elem_bit_index);
-+    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
-+        bit_mask = (ia_css_kernel_bitmap_t)1 << index;
-+    }
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return bit_mask;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+int ia_css_is_kernel_bitmap_set(
-+    const ia_css_kernel_bitmap_t    bitmap,
-+    const unsigned int                index)
-+{
-+    unsigned int elem_index;
-+    unsigned int elem_bit_index;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_is_kernel_bitmap_set(): enter:\n");
-+
-+    assert(index < IA_CSS_KERNEL_BITMAP_BITS);
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+    elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+    assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
-+    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
-+#else
-+    NOT_USED(elem_index);
-+    NOT_USED(elem_bit_index);
-+    return (((bitmap >> index) & 0x1) == 1);
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
-+    const ia_css_kernel_bitmap_t            bitmap)
-+{
-+    int i;
-+    unsigned int lsb_current_elem = 0;
-+    unsigned int lsb_previous_elem = 0;
-+    ia_css_kernel_bitmap_t loc_bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+               "ia_css_kernel_bitmap_shift(): enter:\n");
-+
-+    loc_bitmap = bitmap;
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
-+        lsb_current_elem = bitmap.data[i] & 0x01;
-+        loc_bitmap.data[i] >>= 1;
-+        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
-+        lsb_previous_elem = lsb_current_elem;
-+    }
-+#else
-+    NOT_USED(i);
-+    NOT_USED(lsb_current_elem);
-+    NOT_USED(lsb_previous_elem);
-+    loc_bitmap >>= 1;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+    return loc_bitmap;
-+}
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
-new file mode 100644
-index 000000000000..8b7cd391bd1b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
-new file mode 100644
-index 000000000000..bf02f187c1b4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
-@@ -0,0 +1,88 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
-+#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
-+
-+#include "type_support.h"
-+
-+#define KERNEL_USER_PARAM_S_PADDING 4
-+
-+#define SIZE_OF_KERNEL_USER_PARAM_S ( \
-+	  (1 * IA_CSS_UINT64_T_BITS) \
-+	+ (1 * IA_CSS_UINT32_T_BITS) \
-+	+ (4 * IA_CSS_UINT16_T_BITS) \
-+	+ (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
-+
-+/** \brief A kernel user parameter object.
-+ * Always use ia_css_kernel_user_param_get_descriptor_size or
-+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
-+ * appropriate size for the kernel user parameter object.
-+ *
-+ * Use an init function like ia_css_kernel_user_param_init to initialize
-+ * the kernel user parameter object.
-+ *
-+ * Never instantiate this struct in a different way.
-+ */
-+typedef struct ia_css_kernel_user_param_s {
-+	/* Parameter buffer handle attached to the terminal */
-+	union {
-+		void *p;
-+		uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
-+	} payload_buffer;
-+	/* Buffer size */
-+	uint32_t payload_buffer_size;
-+	/* Points to the variable array of ia_css_kernel_user_param_desc_s */
-+	uint16_t kernel_desc_offset;
-+	/* Number of kernels in program group */
-+	uint16_t kernel_count;
-+	/* Number of fragments in frame */
-+	uint16_t fragment_count;
-+	/* Fragment stride in bytes */
-+	uint16_t fragment_stride;
-+	/* padding */
-+	uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
-+} ia_css_kernel_user_param_t;
-+
-+typedef struct ia_css_kernel_user_param_kernel_desc_s {
-+	/* kernel identifier */
-+	uint32_t kernel_id;
-+	/* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
-+	uint16_t cfg_desc_offset;
-+	/* Number of configurations for this kernel */
-+	uint16_t cfg_desc_count;
-+} ia_css_kernel_user_param_kernel_desc_t;
-+
-+typedef struct ia_css_kernel_user_param_cfg_desc_s {
-+	/* Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/* Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+} ia_css_kernel_user_param_cfg_desc_t;
-+
-+/*!
-+ * Construction information to construct a kernel user param object.
-+ * This type is only used for ia_css_kernel_user_param_init and
-+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
-+ */
-+typedef struct ia_css_kernel_user_param_kernel_info_s {
-+	uint32_t kernel_id;
-+	uint16_t section_count;
-+	uint32_t *section_sizes; /**< Array of size section_count. Each element
-+		encode the size in bytes or a kernel config (section). */
-+} ia_css_kernel_user_param_kernel_info_t;
-+
-+#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
-new file mode 100644
-index 000000000000..6716c1ec30f2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
-+#define __IA_CSS_PARAM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __INLINE_PARAMETERS__
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
-new file mode 100644
-index 000000000000..fc1cd1ce94e0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
-@@ -0,0 +1,449 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_H
-+
-+#include "ia_css_psys_data_storage_class.h"
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_data.h
-+ *
-+ * Define the data objects that are passed to the process groups
-+ * i.e. frames and matrices with their sub-structures
-+ *
-+ * The data objects are separate from the process group terminal,
-+ * although they are stored by value rather than by reference and
-+ * make the process group terminal dependendent on its definition
-+ *
-+ * This frame definition overloads the current CSS frame definition
-+ * they are the same object, just a slightly different implementation
-+ */
-+
-+#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
-+
-+#include <type_support.h>
-+#include "ia_css_program_group_data_defs.h"    /* ia_css_frame_format_type */
-+
-+#include "ia_css_terminal_defs.h"
-+
-+/**
-+ * Frame buffer state used for sequencing
-+ * (see FAS 5.5.3)
-+ *
-+ * The buffer can be in DDR or a handle to a stream
-+ */
-+typedef enum ia_css_buffer_state {
-+    IA_CSS_BUFFER_NULL = 0,
-+    IA_CSS_BUFFER_UNDEFINED,
-+    IA_CSS_BUFFER_EMPTY,
-+    IA_CSS_BUFFER_NONEMPTY,
-+    IA_CSS_BUFFER_FULL,
-+    IA_CSS_N_BUFFER_STATES
-+} ia_css_buffer_state_t;
-+
-+#define IA_CSS_BUFFER_STATE_IN_BITS    32
-+
-+/**
-+ * Pointer state used to signal MMU invalidation
-+ */
-+typedef enum ia_css_pointer_state {
-+    IA_CSS_POINTER_INVALID = 0,
-+    IA_CSS_POINTER_VALID,
-+    IA_CSS_N_POINTER_STATES
-+} ia_css_pointer_state_t;
-+
-+#define IA_CSS_POINTER_STATE_IN_BITS    32
-+
-+/**
-+ * Access direction needed to select the access port
-+ *
-+ * @note No known use of any literal in this
-+ * enumeration.
-+ */
-+typedef enum ia_css_access_type {
-+    IA_CSS_ACCESS_LOCKED = 0,
-+    IA_CSS_ACCESS_READ,
-+    IA_CSS_ACCESS_WRITE,
-+    IA_CSS_ACCESS_MODIFY,
-+    IA_CSS_N_ACCESS_TYPES
-+} ia_css_access_type_t;
-+
-+#define IA_CSS_ACCESS_TYPE_IN_BITS    32
-+
-+/**
-+ * Access attribute needed to select the access port
-+ *    - public : snooped
-+ *    - private: non-snooped
-+ * Naming is a bit awkward, lack of inspiration
-+ *
-+ * @note No known use of any literal in this
-+ * enumeration.
-+ */
-+typedef enum ia_css_access_scope {
-+    IA_CSS_ACCESS_PRIVATE = 0,
-+    IA_CSS_ACCESS_PUBLIC,
-+    IA_CSS_N_ACCESS_SCOPES
-+} ia_css_access_scopes_t;
-+
-+#define IA_CSS_ACCESS_SCOPES_IN_BITS    32
-+
-+#define IA_CSS_N_FRAME_PLANES            6
-+
-+#define IA_CSS_FRAME_FORMAT_BITMAP_BITS    64
-+
-+typedef uint64_t ia_css_frame_format_bitmap_t;
-+
-+typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
-+typedef struct ia_css_param_frame_s        ia_css_param_frame_t;
-+
-+typedef struct ia_css_frame_descriptor_s    ia_css_frame_descriptor_t;
-+typedef struct ia_css_frame_s                ia_css_frame_t;
-+typedef struct ia_css_fragment_descriptor_s    ia_css_fragment_descriptor_t;
-+
-+typedef struct ia_css_stream_s            ia_css_stream_t;
-+
-+#define    N_UINT64_IN_STREAM_STRUCT            1
-+
-+#define    IA_CSS_STREAM_STRUCT_BITS \
-+    (N_UINT64_IN_STREAM_STRUCT * 64)
-+
-+struct ia_css_stream_s {
-+    uint64_t dummy;
-+};
-+
-+struct ia_css_param_frame_descriptor_s {
-+    uint16_t    size;        /**< Size of the descriptor */
-+    uint32_t    buffer_count;    /**< Number of parameter buffers */
-+};
-+
-+struct ia_css_param_frame_s {
-+    /** Base virtual addresses to parameters in subsystem virtual
-+     * memory space
-+     */
-+    vied_vaddress_t *data;
-+};
-+
-+#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
-+
-+#define N_UINT32_IN_FRAME_DESC_STRUCT \
-+    (1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
-+#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
-+#define N_UINT8_IN_FRAME_DESC_STRUCT 4
-+#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
-+
-+#define    IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
-+    (IA_CSS_FRAME_FORMAT_TYPE_BITS \
-+    + (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
-+    + (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
-+    + (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
-+    + (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
-+
-+/**
-+ * Structure defining the frame (size and access) properties for
-+ * inbuild types only.
-+ *
-+ * The inbuild types like FourCC, MIPI and CSS private types are supported
-+ * by FW all other types are custom types which interpretation must be encoded
-+ * on the buffer itself or known by the source and sink
-+ */
-+struct ia_css_frame_descriptor_s {
-+    /** Indicates if this is a generic type or inbuild with
-+      * variable size descriptor.
-+      */
-+    ia_css_frame_format_type_t frame_format_type;
-+    /** Number of data planes (pointers) */
-+    uint32_t plane_count;
-+    /** Plane offsets accounting for fragments */
-+    uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
-+    /** Physical size aspects */
-+    uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
-+    /** Tile status buffer offsets for DEC400 compression */
-+    uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
-+    /** Logical dimensions */
-+    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
-+    /** Size of this descriptor */
-+    uint16_t size;
-+    /** Bits per pixel (meaningful bits, AKA precision) */
-+    uint8_t bpp;
-+    /** Bits per element (bits required for storage of the pixel in memory) */
-+    uint8_t bpe;
-+    /** 1 if terminal uses compressed datatype, 0 otherwise */
-+    uint8_t is_compressed;
-+    /** 1 if pixel data is signed, 0 otherwise */
-+    uint8_t is_signed;
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
-+};
-+
-+#define    N_UINT32_IN_FRAME_STRUCT        2
-+#define    N_PADDING_UINT8_IN_FRAME_STRUCT    4
-+
-+#define    IA_CSS_FRAME_STRUCT_BITS \
-+    (IA_CSS_BUFFER_STATE_IN_BITS \
-+    + IA_CSS_ACCESS_TYPE_IN_BITS \
-+    + IA_CSS_POINTER_STATE_IN_BITS \
-+    + IA_CSS_ACCESS_SCOPES_IN_BITS \
-+    + VIED_VADDRESS_BITS \
-+    + (N_UINT32_IN_FRAME_STRUCT * 32) \
-+    + (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
-+
-+/**
-+ * Main frame structure holding the main store and auxilary access properties
-+ * the "pointer_state" and "access_scope" should be encoded on the
-+ * "vied_vaddress_t" type
-+ *
-+ * @note A number of fields in this structure are either no longer
-+ * used, or their use is trivialized, in the current code base.  This is
-+ * due to the Persistent Program Group (PPG) concept which separated the
-+ * attatchment of frame buffers into a separate structure, the buffer set.
-+ * @par Set all unused fields to zero, unless otherwise noted.
-+ * @see ia_css_buffer_set_s
-+ */
-+struct ia_css_frame_s {
-+    /** State of the frame for purpose of sequencing.
-+     *
-+     *  @note This field is apparently a leftover from the pre-PPG
-+     *  type of program group and no longer has any real use.
-+     *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
-+     *  IA_CSS_BUFFER_EMPTY for output frames */
-+    ia_css_buffer_state_t buffer_state;
-+    /** Access direction, may change when buffer state changes.
-+     *
-+     *  @note Cannot find any use of this. */
-+    ia_css_access_type_t access_type;
-+    /** State of the pointer for purpose of embedded MMU coherency
-+     * @note No known non-trivial use of the field.
-+     */
-+    ia_css_pointer_state_t pointer_state;
-+    /** Access to the pointer for purpose of host cache coherency
-+    *  @note Cannot find any use of this. */
-+    ia_css_access_scopes_t access_scope;
-+    /** Base virtual address to data in IPU subsystem virtual memory space.
-+     *  @note No longer used for PPG's */
-+    vied_vaddress_t data;
-+    /** Index into the array of buffer addresses within the buffer set structure
-+     *  which is sent separately. The value at that location replaces the
-+     *  "data" field in this structure.  */
-+    uint32_t data_index;
-+    /** Total buffer allocation size in bytes */
-+    uint32_t data_bytes;
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
-+};
-+
-+#define    N_UINT16_IN_FRAGMENT_DESC_STRUCT    (3 * IA_CSS_N_DATA_DIMENSION)
-+#define    N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
-+
-+#define    IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
-+    ((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
-+    + (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
-+
-+/**
-+ * Structure defining the fragment (size and access) properties.
-+ *
-+ * All cropping and padding effects are described by the difference between
-+ * the frame size and its location and the fragment size(s) and location(s)
-+ */
-+struct ia_css_fragment_descriptor_s {
-+    /** Logical dimensions of the fragment */
-+    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
-+    /** Logical location of the fragment in the frame */
-+    uint16_t index[IA_CSS_N_DATA_DIMENSION];
-+    /** Fractional start (phase) of the fragment in the access unit */
-+    uint16_t offset[IA_CSS_N_DATA_DIMENSION];
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
-+};
-+
-+/*! Print the frame object to file/stream
-+
-+ @param    frame[in]            frame object
-+ @param    fid[out]            file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_print(
-+    const ia_css_frame_t *frame, void *fid);
-+
-+/*! Get the data buffer handle from the frame object
-+
-+@param    frame[in]            frame object
-+
-+@return buffer pointer, VIED_NULL on error
-+*/
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
-+    const ia_css_frame_t *frame);
-+
-+/*! Get the data buffer handle from the frame object
-+
-+ @param    frame[in]            frame object
-+
-+ @return buffer pointer, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer handle on the frame object
-+
-+ @param    frame[in]            frame object
-+ @param    buffer[in]            buffer pointer
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_buffer(
-+    ia_css_frame_t *frame, vied_vaddress_t buffer);
-+
-+/*! Get the data buffer index in the frame object
-+
-+ @param    frame[in]            frame object
-+
-+ @return data buffer index on success, -1 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_get_data_index(
-+    const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer index in the frame object
-+
-+ @param    frame[in]            frame object
-+ @param    data_index[in]            data buffer index
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_data_index(
-+    ia_css_frame_t *frame,
-+    unsigned int data_index);
-+
-+/*! Set the data buffer size on the frame object
-+
-+ @param    frame[in]            frame object
-+ @param    size[in]            number of data bytes
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_data_bytes(
-+    ia_css_frame_t *frame, unsigned size);
-+
-+/*! Get the data buffer state from the frame object
-+
-+ @param    frame[in]            frame object
-+
-+ @return buffer state, limit value on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
-+    const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer state of the frame object
-+
-+ @param    frame[in]            frame object
-+ @param    buffer_state[in]        buffer state
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
-+    const ia_css_buffer_state_t buffer_state);
-+
-+/*! Get the data pointer state from the frame object
-+
-+ @param    frame[in]            frame object
-+
-+ @return pointer state, limit value on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
-+    const ia_css_frame_t *frame);
-+
-+/*! Set the data pointer state of the frame object
-+
-+ @param    frame[in]            frame object
-+ @param    pointer_state[in]        pointer state
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
-+    const ia_css_pointer_state_t pointer_state);
-+
-+/*! Print the frame descriptor object to file/stream
-+
-+ @param    frame_descriptor[in]    frame descriptor object
-+ @param    fid[out]        file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_descriptor_print(
-+    const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
-+
-+/*! Print the fragment descriptor object to file/stream
-+
-+ @param    fragment_descriptor[in]    fragment descriptor object
-+ @param    fid[out]        file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_fragment_descriptor_print(
-+    const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
-+
-+/*! Compute the bitmap for the frame format type
-+
-+ @param    frame_format_type[in]    frame format type
-+
-+ @return 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
-+    const ia_css_frame_format_type_t frame_format_type);
-+
-+/*! clear frame format bitmap
-+
-+ @return cleared bitmap
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
-+
-+/*! Compute the size of storage required for the data descriptor object
-+ * on a terminal
-+ *@param       plane_count[in]    The number of data planes in the buffer
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+size_t ia_css_sizeof_frame_descriptor(
-+        const uint8_t plane_count);
-+/*! Compute the size of storage required for the kernel parameter descriptor
-+ * object on a terminal
-+
-+ @param    section_count[in]    The number of parameter sections in the buffer
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_kernel_param_descriptor(
-+    const uint16_t section_count);
-+
-+#ifdef __IA_CSS_PSYS_DATA_INLINE__
-+#include "ia_css_program_group_data_impl.h"
-+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
-new file mode 100644
-index 000000000000..9d1ddac9d25c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
-+
-+#include "frame_support.h"
-+
-+/**
-+ * Pre-defined frame format
-+ *
-+ * Those formats have inbuild support of traffic
-+ * and access functions
-+ *
-+ * Note that the formats are for terminals, so there
-+ * is no distinction between input and output formats
-+ *    - Custom formats with ot without descriptor
-+ *    - 4CC formats such as YUV variants
-+ *    - MIPI (line) formats as produced by CSI receivers
-+ *    - MIPI (sensor) formats such as Bayer or RGBC
-+ *    - CSS internal formats (private types)
-+ *  - CSS parameters (type 1 - 6)
-+ */
-+#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
-+typedef enum ia_css_frame_format_type {
-+    IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
-+    IA_CSS_DATA_CUSTOM,
-+
-+    /** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV11,
-+    /** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
-+    IA_CSS_DATA_FORMAT_YUV420,
-+    /** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_YV12,
-+    /** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV12,
-+    /** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV12_16,
-+    /** 12 bit YUV 420, Intel proprietary tiled format, TileY */
-+    IA_CSS_DATA_FORMAT_NV12_TILEY,
-+    /** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV21,
-+    /** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
-+    IA_CSS_DATA_FORMAT_YUV422,
-+    /** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_YV16,
-+    /** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV16,
-+    /** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_NV61,
-+    /** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_UYVY,
-+    /** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_YUYV,
-+    /** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
-+    IA_CSS_DATA_FORMAT_YUV444,
-+    /** 8 bit monochrome plane */
-+    IA_CSS_DATA_FORMAT_Y800,
-+
-+    /** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
-+    IA_CSS_DATA_FORMAT_RGB565,
-+    /** 24 bit RGB, 3 planes  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_RGB888,
-+    /** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_RGBA888,
-+
-+    /** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_BAYER_GRBG,
-+    /** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_BAYER_RGGB,
-+    /** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_BAYER_BGGR,
-+    /** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_BAYER_GBRG,
-+
-+    /** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
-+     * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
-+     */
-+    IA_CSS_DATA_FORMAT_YUV420_LINE,
-+    /** Deprecated RAW, 1 plane */
-+    IA_CSS_DATA_FORMAT_RAW,
-+    /** Deprecated RAW, 1 plane, packed */
-+    IA_CSS_DATA_FORMAT_RAW_PACKED,
-+    /** Internal, for advanced ISP */
-+    IA_CSS_DATA_FORMAT_QPLANE6,
-+    /** 1D byte stream, used for jpeg 1-plane */
-+    IA_CSS_DATA_FORMAT_BINARY_8,
-+    /** Deprecated MIPI frame, 1D byte stream 1 plane */
-+    IA_CSS_DATA_FORMAT_MIPI,
-+    /** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
-+     * (8 bit per element)
-+     */
-+    IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
-+    /** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
-+     * (10 bit per element)
-+     */
-+    IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
-+    /** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
-+    IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
-+
-+    /** Type 1-5 parameter, not fragmentable */
-+    IA_CSS_DATA_GENERIC_PARAMETER,
-+    /** Video stabilisation Type 6 parameter, fragmentable */
-+    IA_CSS_DATA_DVS_PARAMETER,
-+    /** Video stabilisation Type 6 parameter, coordinates */
-+    IA_CSS_DATA_DVS_COORDINATES,
-+    /** Dead Pixel correction Type 6 parameter, fragmentable */
-+    IA_CSS_DATA_DPC_PARAMETER,
-+    /** Lens Shading Correction Type 6 parameter, fragmentable */
-+    IA_CSS_DATA_LSC_PARAMETER,
-+    /** 3A statistics output HI. */
-+    IA_CSS_DATA_S3A_STATISTICS_HI,
-+    /** 3A statistics output LO. */
-+    IA_CSS_DATA_S3A_STATISTICS_LO,
-+    /** histogram output */
-+    IA_CSS_DATA_S3A_HISTOGRAM,
-+    /** GammaStar grid */
-+    IA_CSS_DATA_GAMMASTAR_GRID,
-+
-+    /** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
-+    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
-+    /** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
-+    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
-+    /** Gr R B Gb 4-planes */
-+    IA_CSS_DATA_FORMAT_BAYER_PLANAR,
-+    /** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
-+    IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
-+
-+    /** 16 bit YUV 420, Y even plane, Y uneven plane,
-+     * UV plane vector interleaved
-+     */
-+    IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
-+    /** 16 bit YUV 420, YYUVYY vector interleaved */
-+    IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
-+
-+    /** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
-+    IA_CSS_DATA_FORMAT_NV12_TILEYF,
-+
-+    /** Y samples appear first in the memory. All Y samples are array of WORDs;
-+    * even number of lines ;
-+    * Surface stride can be larger than the width of Y plane.
-+    * This array is followed immediately by chroma array.
-+    * Chroma array is an array of WORDs, with interleaved U/V samples.
-+    * If the interleaved U/V plane is addresses as an * array of DWORDs,
-+    * the least significant word contains U sample. The stride of the
-+    * interleaved U/V plane is equal to Y plane. 10 bit data.
-+    */
-+    IA_CSS_DATA_FORMAT_P010,
-+
-+    /** MSB aligned version of P010*/
-+    IA_CSS_DATA_FORMAT_P010_MSB,
-+
-+    /** P016/P012 Y samples appear first in the memory.
-+    * All Y samples are array of WORDs;
-+    * even number of lines ;
-+    * Surface stride can be larger than the width of Y plane.
-+    * This array is followed immediately by chroma array.
-+    * Chroma array is an array of WORDs, with interleaved U/V samples.
-+    * If the interleaved U/V plane is addresses as an * array of DWORDs,
-+    * the least significant word contains U sample. The stride of the
-+    * interleaved U/V plane is equal to Y plane. 12 bit data.
-+    */
-+    IA_CSS_DATA_FORMAT_P016,
-+
-+    /** MSB aligned version of P016*/
-+    IA_CSS_DATA_FORMAT_P016_MSB,
-+
-+    /** TILEY representation of P010 LSB-aligned format */
-+    IA_CSS_DATA_FORMAT_P010_TILEY,
-+
-+    /** TILEY representation of P010 MSB-aligned format */
-+    IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
-+
-+    /** TILEY representation of P016 LSB-aligned format */
-+    IA_CSS_DATA_FORMAT_P016_TILEY,
-+
-+    /** TILEY representation of P016 MSB-aligned format*/
-+    IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
-+
-+    /** TILEYf representation of P010*/
-+    IA_CSS_DATA_FORMAT_P010_TILEYF,
-+
-+    /** TILEYf representation of P010 MSB aligned*/
-+    IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
-+
-+    /** TILEYf representation of P016*/
-+    IA_CSS_DATA_FORMAT_P016_TILEYF,
-+
-+    /** TILEYf representation of P016 MSB aligned*/
-+    IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
-+
-+    /** consists of L and R PDAF pixel line pairs.
-+     * If line n is L pixel line, n+1 will be R pixel line.
-+     * Depending on mode - First line can be L or R pixel line and
-+     * the line pair sequence can also alternate. 1-plane (bpp == bpe)
-+     */
-+    IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
-+
-+    /** consists of L and R PDAF pixel pairs.
-+         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
-+         * alternating between the above two as well. 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
-+
-+    /** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
-+    IA_CSS_DATA_FORMAT_IR,
-+
-+    /** MSB aligned version of P012*/
-+    IA_CSS_DATA_FORMAT_P012_MSB,
-+
-+    /* Each tile is stored in consecutive addresses in DDR.
-+     * The scanning walking order within a tile is raster order
-+     * (line-by-line).
-+     */
-+    /* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
-+     * followed by an interleaved 8 bit U/V
-+     * samples plane.
-+     */
-+    IA_CSS_DATA_FORMAT_NV12_TILE,
-+    /*P010 is similar to NV12, but with 10 bit values,
-+     * each stored in a 16b container (msb aligned, 6 lsb are zero).
-+     */
-+    IA_CSS_DATA_FORMAT_P010_TILE,
-+    /* P012 is similar to P010, but with 12 bit values,
-+     * each stored in a 16b containers (msb aligned, 4 lsb are zero).
-+     */
-+    IA_CSS_DATA_FORMAT_P012_TILE,
-+
-+    IA_CSS_N_FRAME_FORMAT_TYPES
-+} ia_css_frame_format_type_t;
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
-new file mode 100644
-index 000000000000..5f1a2856ead4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
-@@ -0,0 +1,461 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
-+
-+#include "ia_css_program_group_data.h"
-+#include "ia_css_psys_data_trace.h"
-+#include <error_support.h>    /* for verifexit */
-+#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
-+#include <misc_support.h>    /* for NOT_USED */
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_print(
-+    const ia_css_frame_t *frame, void *fid)
-+{
-+    int retval = -1;
-+
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
-+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
-+     * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
-+     */
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+           "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
-+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
-+     * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
-+     */
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tdata_bytes = %d\n", frame->data_bytes);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
-+    const ia_css_frame_t *frame) {
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    return &(frame->data);
-+
-+EXIT:
-+    if (NULL == frame) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+            "ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
-+    }
-+    return NULL;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+vied_vaddress_t    ia_css_frame_get_buffer(
-+    const ia_css_frame_t *frame)
-+{
-+    vied_vaddress_t    buffer = VIED_NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_get_buffer(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    buffer = frame->data;
-+
-+EXIT:
-+    if (NULL == frame) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+               "ia_css_frame_get_buffer invalid argument\n");
-+    }
-+    return buffer;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_buffer(
-+    ia_css_frame_t *frame,
-+    vied_vaddress_t buffer)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_set_buffer(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    frame->data = buffer;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_set_buffer failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_get_data_index(
-+    const ia_css_frame_t *frame)
-+{
-+    int data_index = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_get_data_index(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+
-+    data_index = frame->data_index;
-+
-+EXIT:
-+    if (NULL == frame) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+               "ia_css_frame_get_data_index invalid argument\n");
-+    }
-+    return data_index;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_data_index(
-+    ia_css_frame_t *frame,
-+    unsigned int data_index)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_set_data_index(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+
-+    frame->data_index = data_index;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_set_data_index failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_data_bytes(
-+    ia_css_frame_t *frame,
-+    unsigned int size)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_set_data_bytes(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    frame->data_bytes = size;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_set_data_bytes failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
-+    const ia_css_frame_t *frame)
-+{
-+    ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_get_buffer_state(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    buffer_state = frame->buffer_state;
-+
-+EXIT:
-+    if (NULL == frame) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+            "ia_css_frame_get_buffer_state invalid argument\n");
-+    }
-+    return buffer_state;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_buffer_state(
-+    ia_css_frame_t *frame,
-+    const ia_css_buffer_state_t buffer_state)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_set_buffer_state(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    frame->buffer_state = buffer_state;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_set_buffer_state failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
-+    const ia_css_frame_t *frame)
-+{
-+    ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_get_pointer_state(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    pointer_state = frame->pointer_state;
-+
-+EXIT:
-+    if (NULL == frame) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+            "ia_css_frame_get_pointer_state invalid argument\n");
-+    }
-+    return pointer_state;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_pointer_state(
-+    ia_css_frame_t *frame,
-+    const ia_css_pointer_state_t pointer_state)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_set_pointer_state(): enter:\n");
-+
-+    verifexit(frame != NULL);
-+    frame->pointer_state = pointer_state;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_set_pointer_state failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_descriptor_print(
-+    const ia_css_frame_descriptor_t *frame_descriptor,
-+    void *fid)
-+{
-+    int retval = -1;
-+    int i;
-+    uint8_t frame_plane_count;
-+
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+        "ia_css_frame_descriptor_print(): enter:\n");
-+
-+    COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
-+
-+    verifexit(frame_descriptor != NULL);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+        "ia_css_frame_descriptor_print(): enter:\n");
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tframe_format_type = %d\n",
-+        frame_descriptor->frame_format_type);
-+    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
-+     * ia_css_frame_format_string(frame_descriptor->frame_format_type));
-+     */
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tbpp = %d\n", frame_descriptor->bpp);
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tbpe = %d\n", frame_descriptor->bpe);
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tis_compressed = %d\n", frame_descriptor->is_compressed);
-+
-+    frame_plane_count = IA_CSS_N_FRAME_PLANES;
-+    /* frame_plane_count =
-+     * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
-+     */
-+
-+    verifexit(frame_plane_count > 0);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tplane_offsets[%d]: [\n", frame_plane_count);
-+    for (i = 0; i < (int)frame_plane_count - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", frame_descriptor->plane_offsets[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d ]\n", frame_descriptor->plane_offsets[i]);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tts_offsets[%d]: [\n", frame_plane_count);
-+    for (i = 0; i < (int)frame_plane_count - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", frame_descriptor->ts_offsets[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d ]\n", frame_descriptor->ts_offsets[i]);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", frame_descriptor->dimension[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d }\n", frame_descriptor->dimension[i]);
-+
-+    COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
-+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", frame_descriptor->stride[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d }\n", frame_descriptor->stride[i]);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+            "ia_css_frame_descriptor_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_fragment_descriptor_print(
-+    const ia_css_fragment_descriptor_t *fragment_descriptor,
-+    void *fid)
-+{
-+    int retval = -1;
-+    int i;
-+
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+        "ia_css_fragment_descriptor_print(): enter:\n");
-+
-+    verifexit(fragment_descriptor != NULL);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", fragment_descriptor->dimension[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d }\n", fragment_descriptor->dimension[i]);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", fragment_descriptor->index[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "\t%4d }\n", fragment_descriptor->index[i]);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+        "offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+            "\t%4d,\n", fragment_descriptor->offset[i]);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
-+        fragment_descriptor->offset[i]);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+              "ia_css_fragment_descriptor_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
-+    const ia_css_frame_format_type_t frame_format_type)
-+{
-+    ia_css_frame_format_bitmap_t bit_mask = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+        "ia_css_frame_format_bit_mask(): enter:\n");
-+
-+    if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
-+        bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+            "ia_css_frame_format_bit_mask invalid argument\n");
-+    }
-+
-+    return bit_mask;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+               "ia_css_frame_format_bitmap_clear(): enter:\n");
-+
-+    return 0;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+size_t ia_css_sizeof_frame_descriptor(
-+        const uint8_t plane_count)
-+{
-+    size_t size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+               "ia_css_sizeof_frame_descriptor(): enter:\n");
-+
-+    verifexit(plane_count > 0);
-+    size += sizeof(ia_css_frame_descriptor_t);
-+    size += plane_count * sizeof(uint32_t);
-+
-+EXIT:
-+    if (0 == plane_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+            "ia_css_sizeof_frame_descriptor invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
-new file mode 100644
-index 000000000000..a8a155223430
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
-@@ -0,0 +1,295 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param.h
-+ *
-+ * Define the methods on the program group parameter object that are not part
-+ * of a single interface
-+ */
-+#include <ia_css_program_group_param_types.h>
-+
-+#include <ia_css_program_group_param.sim.h>
-+
-+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
-+
-+#include <type_support.h>
-+
-+/*! Get the stored size of the program group parameter object
-+
-+ @param    param[in]            program group parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_program_group_param_get_size(
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! initialize program_group_param
-+
-+ @param    blob[in]    program group parameter object
-+ @param    program_count[in]        number of  terminals.
-+ @param    terminal_count[in]        number of  terminals.
-+ @param    fragment_count[in]        number of  terminals.
-+
-+ @return 0 if success, else failure.
-+ */
-+extern int ia_css_program_group_param_init(
-+    ia_css_program_group_param_t *blob,
-+    const uint8_t    program_count,
-+    const uint8_t    terminal_count,
-+    const uint16_t    fragment_count,
-+    const enum ia_css_frame_format_type *frame_format_types);
-+/*! Get the program parameter object from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+ @param    i[in]                program parameter index
-+
-+ @return program parameter pointer, NULL on error
-+ */
-+extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
-+    const ia_css_program_group_param_t *param,
-+    const int i);
-+
-+/*! Get the terminal parameter object from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+ @param    i[in]                terminal parameter index
-+
-+ @return terminal parameter pointer, NULL on error
-+ */
-+extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
-+    const ia_css_program_group_param_t *param,
-+    const int i);
-+
-+/*! Get the fragment count from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return fragment count, 0 on error
-+ */
-+extern uint16_t ia_css_program_group_param_get_fragment_count(
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Get the program count from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return program count, 0 on error
-+ */
-+extern uint8_t ia_css_program_group_param_get_program_count(
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Get the terminal count from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return terminal count, 0 on error
-+ */
-+extern uint8_t ia_css_program_group_param_get_terminal_count(
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Set the protocol version in a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+ @param    protocol_version[in]        protocol version
-+
-+ @return nonzero on error
-+*/
-+extern int
-+ia_css_program_group_param_set_protocol_version(
-+    ia_css_program_group_param_t *param,
-+    uint8_t protocol_version);
-+
-+/*! Get the protocol version from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return protocol version
-+*/
-+extern uint8_t
-+ia_css_program_group_param_get_protocol_version(
-+    const ia_css_program_group_param_t *param);
-+
-+/*! Set the kernel enable bitmap from a program group parameter object
-+
-+ @param    param[in]            program group parameter object
-+ @param    bitmap[in]            kernel enable bitmap
-+
-+ @return non-zero on error
-+ */
-+extern int ia_css_program_group_param_set_kernel_enable_bitmap(
-+    ia_css_program_group_param_t    *param,
-+    const ia_css_kernel_bitmap_t    bitmap);
-+
-+/*! Get the kernel enable bitmap from a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return kernel enable bitmap, 0 on error
-+*/
-+extern ia_css_kernel_bitmap_t
-+ia_css_program_group_param_get_kernel_enable_bitmap(
-+    const ia_css_program_group_param_t *param);
-+
-+/*! Get the stored size of the program parameter object
-+
-+ @param    param[in]            program parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_program_param_get_size(
-+    const ia_css_program_param_t            *param);
-+
-+/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
-+
-+ @param    program_param[in]        program parameter object
-+ @param    bitmap[in]            kernel enable bitmap
-+
-+ @return non-zero on error
-+ */
-+extern int ia_css_program_param_set_kernel_enable_bitmap(
-+    ia_css_program_param_t    *program_param,
-+    const ia_css_kernel_bitmap_t    bitmap);
-+
-+/*! Get the kernel enable bitmap from a program parameter object
-+
-+ @param    program_param[in]        program parameter object DEPRECATED
-+
-+ Note: This function returns in fact the kernel enable of the program group
-+      parameters
-+
-+ @return kernel enable bitmap, 0 on error
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
-+    const ia_css_program_param_t            *param);
-+
-+/*! Get the stored size of the terminal parameter object
-+
-+ @param    param[in]            terminal parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_terminal_param_get_size(
-+    const ia_css_terminal_param_t            *param);
-+
-+/*! Get the kernel enable bitmap from a terminal parameter object
-+
-+ @param    terminal_param[in]        terminal parameter object
-+
-+ Note: This function returns in fact the kernel enable of the program group
-+       parameters
-+
-+ @return kernel enable bitmap, 0 on error
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
-+    const ia_css_terminal_param_t            *param);
-+
-+/*! Get the parent object for this terminal param.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+
-+ @return parent program group param object
-+ */
-+extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
-+    const ia_css_terminal_param_t            *param);
-+
-+/*! Get the data format type associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+
-+ @return data format type (ia_css_data_format_type_t)
-+ */
-+extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
-+    const ia_css_terminal_param_t    *terminal_param);
-+
-+/*! Set the data format type associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+ @param data_format_type[in]        data format type
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_frame_format_type(
-+    ia_css_terminal_param_t    *terminal_param,
-+    const ia_css_frame_format_type_t data_format_type);
-+
-+/*! Get bits per pixel on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+
-+ @return bits per pixel
-+ */
-+extern uint8_t ia_css_terminal_param_get_bpp(
-+    const ia_css_terminal_param_t    *terminal_param);
-+
-+/*! Set bits per pixel on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+ @param bpp[in]                bits per pixel
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_bpp(
-+    ia_css_terminal_param_t    *terminal_param,
-+    const uint8_t bpp);
-+
-+/*! Get dimensions on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+ @param    dimensions[out]            dimension array
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_get_dimensions(
-+    const ia_css_terminal_param_t    *terminal_param,
-+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set dimensions on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+ @param    dimensions[in]            dimension array
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_dimensions(
-+    ia_css_terminal_param_t    *terminal_param,
-+    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get stride on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+
-+ @return stride of the frame to be attached.
-+ */
-+extern uint32_t ia_css_terminal_param_get_stride(
-+    const ia_css_terminal_param_t    *terminal_param);
-+
-+/*! Set stride on the frame associated with the terminal.
-+
-+ @param    terminal_param[in]        terminal parameter object
-+ @param    stride[in]                stride
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_stride(
-+    ia_css_terminal_param_t    *terminal_param,
-+    const uint32_t stride);
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
-new file mode 100644
-index 000000000000..820ac6109b81
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
-@@ -0,0 +1,155 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param.sim.h
-+ *
-+ * Define the methods on the program group parameter object: Simulation only
-+ */
-+#include <ia_css_program_group_param_types.h>
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>
-+
-+/* Simulation */
-+
-+/*! Create a program group parameter object from specification
-+
-+ @param    specification[in]        specification (index)
-+ @param    manifest[in]            program group manifest
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_create(
-+    const unsigned int            specification,
-+    const ia_css_program_group_manifest_t    *manifest);
-+
-+/*! Destroy the program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
-+    ia_css_program_group_param_t            *param);
-+
-+/*! Compute the size of storage required for allocating
-+ * the program group parameter object
-+
-+ @param    program_count[in]    Number of programs in the process group
-+ @param    terminal_count[in]    Number of terminals on the process group
-+ @param    fragment_count[in]    Number of fragments on the terminals of
-+                the process group
-+
-+ @return 0 on error
-+ */
-+size_t ia_css_sizeof_program_group_param(
-+    const uint8_t    program_count,
-+    const uint8_t    terminal_count,
-+    const uint16_t    fragment_count);
-+
-+/*! Allocate (the store of) a program group parameter object
-+
-+ @param    program_count[in]    Number of programs in the process group
-+ @param    terminal_count[in]    Number of terminals on the process group
-+ @param    fragment_count[in]    Number of fragments on the terminals of
-+                the process group
-+
-+ @return program group parameter pointer, NULL on error
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
-+    const uint8_t    program_count,
-+    const uint8_t    terminal_count,
-+    const uint16_t    fragment_count);
-+
-+/*! Free (the store of) a program group parameter object
-+
-+ @param    program_group_param[in]        program group parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_free(
-+    ia_css_program_group_param_t            *param);
-+
-+/*! Print the program group parameter object to file/stream
-+
-+ @param    param[in]    program group parameter object
-+ @param    fid[out]    file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_param_print(
-+    const ia_css_program_group_param_t    *param,
-+    void                    *fid);
-+
-+/*! Allocate (the store of) a program parameter object
-+
-+ @return program parameter pointer, NULL on error
-+ */
-+extern ia_css_program_param_t *ia_css_program_param_alloc(void);
-+
-+/*! Free (the store of) a program parameter object
-+
-+ @param    param[in]    program parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_param_t *ia_css_program_param_free(
-+    ia_css_program_param_t                    *param);
-+
-+/*! Print the program parameter object to file/stream
-+
-+ @param    param[in]                    program parameter object
-+ @param    fid[out]                    file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_param_print(
-+    const ia_css_program_param_t    *param,
-+    void                *fid);
-+
-+/*! Allocate (the store of) a terminal parameter object
-+
-+ @return terminal parameter pointer, NULL on error
-+ */
-+extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
-+
-+/*! Free (the store of) a terminal parameter object
-+
-+ @param    param[in]    terminal parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_param_t *ia_css_terminal_param_free(
-+    ia_css_terminal_param_t                    *param);
-+
-+/*! Print the terminal parameter object to file/stream
-+
-+ @param    param[in]    terminal parameter object
-+ @param    fid[out]    file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_terminal_param_print(
-+    const ia_css_terminal_param_t    *param,
-+    void                *fid);
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
-new file mode 100644
-index 000000000000..b03f27c97f3d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
-+
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_kernel_bitmap.h>
-+#include <ia_css_program_group_data.h>
-+#include <type_support.h>
-+
-+#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
-+#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
-+    (IA_CSS_KERNEL_BITMAP_BITS \
-+    + (3 * IA_CSS_UINT32_T_BITS) \
-+    + IA_CSS_UINT16_T_BITS \
-+    + (3 * IA_CSS_UINT8_T_BITS) \
-+    + (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/* tentative; co-design with ISP algorithm */
-+struct ia_css_program_group_param_s {
-+    /** The enable bits for each individual kernel */
-+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+    /** Size of this structure */
-+    uint32_t size;
-+    /** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
-+    uint32_t program_param_offset;
-+    /** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
-+    uint32_t terminal_param_offset;
-+    /** Number of (explicit) fragments to use in a frame */
-+    uint16_t fragment_count;
-+    /** Number of active programs */
-+    uint8_t program_count;
-+    /** Number of active terminals */
-+    uint8_t terminal_count;
-+    /** Program group protocol version */
-+    uint8_t protocol_version;
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
-+};
-+
-+#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
-+    (IA_CSS_KERNEL_BITMAP_BITS \
-+    + IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_INT32_T_BITS)
-+
-+/* private */
-+struct ia_css_program_param_s {
-+    /** Bitmap of kernel encapsulated by this program.  If all of these kernels are
-+     *  disabled, the program will be disabled too. */
-+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+    /** Size of this structure */
-+    uint32_t size;
-+    /** Offset to add to reach parent. This is negative value.*/
-+    int32_t parent_offset;
-+};
-+
-+#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
-+    (IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_FRAME_FORMAT_TYPE_BITS \
-+    + IA_CSS_INT32_T_BITS \
-+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+    + IA_CSS_INT32_T_BITS \
-+    + IA_CSS_UINT16_T_BITS \
-+    + IA_CSS_UINT8_T_BITS \
-+    + (IA_CSS_UINT8_T_BITS * 1))
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
-new file mode 100644
-index 000000000000..816882cb466f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
-@@ -0,0 +1,66 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param_types.h
-+ *
-+ * Define the parameter objects that are necessary to create the process
-+ * groups i.e. enable parameters and parameters to set-up frame descriptors
-+ */
-+
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
-+#include <ia_css_terminal_defs.h>
-+
-+#include <type_support.h>
-+/*! make this public so that driver can populate,
-+ * size, bpp, dimensions for all terminals.
-+ *
-+ * Currently one API is provided to get frame_format_type.
-+ *
-+ * frame_format_type is set during ia_css_terminal_param_init().
-+ * Value for that is const and binary specific.
-+ */
-+struct ia_css_terminal_param_s {
-+    uint32_t size;    /**< Size of this structure */
-+    /** Indicates if this is a generic type or inbuild
-+     * with variable size descriptor
-+     */
-+    ia_css_frame_format_type_t frame_format_type;
-+    /** offset to add to reach parent. This is negative value.*/
-+    int32_t parent_offset;
-+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
-+    /** Mapping to the index field of the terminal descriptor */
-+    uint16_t index[IA_CSS_N_DATA_DIMENSION];
-+    /** Logical fragment dimension,
-+     * TODO: fragment dimensions can be different per fragment
-+     */
-+    uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
-+    uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
-+    uint16_t offset;/**< Offset in bytes to first fragment */
-+    uint8_t bpp;    /**< Bits per pixel.  The number of bits with significant data. */
-+    uint8_t bpe;    /**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
-+};
-+
-+typedef struct ia_css_program_group_param_s    ia_css_program_group_param_t;
-+typedef struct ia_css_program_param_s        ia_css_program_param_t;
-+typedef struct ia_css_terminal_param_s        ia_css_terminal_param_t;
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
-new file mode 100644
-index 000000000000..8e5816c6fd7f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
-@@ -0,0 +1,290 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_BUFFER_SET_H
-+#define __IA_CSS_PSYS_BUFFER_SET_H
-+
-+#include "ia_css_base_types.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_process_types.h"
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_kernel_bitmap.h"
-+#include "ia_css_rbm.h"
-+
-+#define N_UINT64_IN_BUFFER_SET_STRUCT        1
-+#define N_UINT16_IN_BUFFER_SET_STRUCT        1
-+#define N_UINT8_IN_BUFFER_SET_STRUCT        1
-+#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT    1
-+#define SIZE_OF_BUFFER_SET \
-+    (N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
-+    + IA_CSS_KERNEL_BITMAP_BITS \
-+    + IA_CSS_KERNEL_BITMAP_BITS \
-+    + IA_CSS_KERNEL_BITMAP_BITS \
-+    + IA_CSS_RBM_BITS \
-+    + VIED_VADDRESS_BITS \
-+    + VIED_VADDRESS_BITS \
-+    + N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
-+    + N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
-+
-+struct ia_css_buffer_set_s {
-+    /** Token for user context reference */
-+    uint64_t token;
-+    /** Enable bits for each individual kernel
-+     * For integration, all 0's should be treated as uninitialized and
-+     * assume all processes are enabled */
-+    ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+    /** Enable bits for each individual terminals per call */
-+    ia_css_kernel_bitmap_t terminal_enable_bitmap;
-+    /** Enable bits for each individual routing per call */
-+    ia_css_kernel_bitmap_t routing_enable_bitmap;
-+    /** Enable bits for routing per call */
-+    ia_css_rbm_t rbm;
-+    /** IPU virtual address of this buffer set */
-+    vied_vaddress_t ipu_virtual_address;
-+    /** IPU virtual address of the process group corresponding to this buffer set */
-+    vied_vaddress_t process_group_handle;
-+    /** Number of terminal buffer addresses in this structure */
-+    uint16_t terminal_count;
-+    /** Frame id to associate with this buffer set */
-+    uint8_t frame_counter;
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
-+};
-+
-+#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT    3
-+#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
-+    VIED_VADDRESS_BITS \
-+    + ( 1 * IA_CSS_UINT8_T_BITS) \
-+    + ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
-+struct ia_css_dynamic_terminal_descriptor_s {
-+    /** Terminal buffer virtual address */
-+    vied_vaddress_t virtual_buffer_address;
-+    /** Per-frame compression control, boolean semantics */
-+    uint8_t enable_compression;
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
-+};
-+
-+/*! Construct a buffer set object at specified location
-+
-+ @param    buffer_set_mem[in]    memory location to create buffer set object
-+ @param    process_group[in]    process group corresponding to this buffer set
-+ @param    frame_counter[in]    frame number for this buffer set object
-+
-+ @return pointer to buffer set object on success, NULL on error
-+ */
-+ia_css_buffer_set_t *ia_css_buffer_set_create(
-+    void *buffer_set_mem,
-+    const ia_css_process_group_t *process_group,
-+    const unsigned int frame_counter);
-+
-+/*! Compute size (in bytes) required for full buffer set object
-+
-+ @param    process_group[in]    process group corresponding to this buffer set
-+
-+ @return size in bytes of buffer set object on success, 0 on error
-+ */
-+size_t ia_css_sizeof_buffer_set(
-+    const ia_css_process_group_t *process_group);
-+
-+/*! Set a buffer address in a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to set buffer in
-+ @param    terminal_index[in]    terminal index to use as a reference between
-+                buffer and terminal
-+ @param    buffer[in]        buffer address to store
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_buffer(
-+    ia_css_buffer_set_t *buffer_set,
-+    const unsigned int terminal_index,
-+    const vied_vaddress_t buffer);
-+
-+/*! Get virtual buffer address from a buffer set object and terminal object by
-+   resolving the index used
-+
-+ @param    buffer_set[in]        buffer set object to get buffer from
-+ @param    terminal[in]        terminal object to get buffer of
-+
-+ @return virtual buffer address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_buffer(
-+    const ia_css_buffer_set_t *buffer_set,
-+    const ia_css_terminal_t *terminal);
-+
-+/*! Set ipu virtual address of a buffer set object within the buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to set ipu address in
-+ @param    ipu_vaddress[in]    ipu virtual address of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_ipu_address(
-+    ia_css_buffer_set_t *buffer_set,
-+    const vied_vaddress_t ipu_vaddress);
-+
-+/*! Get ipu virtual address from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get ipu address from
-+
-+ @return virtual buffer set address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_ipu_address(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set kernel enable bitmap of a buffer set object within the buffer set object
-+
-+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
-+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_kernel_enable_bitmap(
-+    ia_css_buffer_set_t *buffer_set,
-+    const ia_css_kernel_bitmap_t kernel_enable_bitmap);
-+
-+/*! Get kernel enable bitmap from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set kernel enable bitmap on success, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set terminal enable bitmap of a buffer set object within the buffer set object
-+
-+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
-+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_terminal_enable_bitmap(
-+    ia_css_buffer_set_t *buffer_set,
-+    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
-+
-+/*! Get terminal enable bitmap from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set terminal enable bitmap on success, 0 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_routing_enable_bitmap(
-+    ia_css_buffer_set_t *buffer_set,
-+    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set Routing BitMap of a buffer set object within the buffer set object
-+
-+ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
-+ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_rbm(
-+    ia_css_buffer_set_t *buffer_set,
-+    const ia_css_rbm_t rbm);
-+
-+/*! Get Routing BitMap from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set terminal enable bitmap on success, 0 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_buffer_set_get_rbm(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set process group handle in a buffer set object
-+
-+ @param    buffer_set[in]            buffer set object to set handle in
-+ @param    process_group_handle[in]    process group handle of the buffer set
-+                    object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_process_group_handle(
-+    ia_css_buffer_set_t *buffer_set,
-+    const vied_vaddress_t process_group_handle);
-+
-+/*! Get process group handle from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get handle from
-+
-+ @return virtual process group address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set token of a buffer set object within the buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to set ipu address in
-+ @param    token[in]        token of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_token(
-+    ia_css_buffer_set_t *buffer_set,
-+    const uint64_t token);
-+
-+/*! Get token from a buffer set object
-+
-+ @param    buffer_set[in]        buffer set object to get token from
-+
-+ @return token on success, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint64_t ia_css_buffer_set_get_token(
-+    const ia_css_buffer_set_t *buffer_set);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_buffer_set_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
-new file mode 100644
-index 000000000000..5721d46d2cff
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_DATA_INLINE__
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
-new file mode 100644
-index 000000000000..fc2e10251601
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DATA_TRACE_H
-+#define __IA_CSS_PSYS_DATA_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
-+     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_DATA_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_DATA_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_DATA_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_DATA_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_DATA_TRACE_METHOD \
-+        PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+        PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+        PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+        PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+        PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+        PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+        PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
-new file mode 100644
-index 000000000000..4aab0d4b9916
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
-new file mode 100644
-index 000000000000..5c3323d24546
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
-+#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
-+     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
-+        PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+        PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+        PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+        PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+        PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+        PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+        PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+        PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
-new file mode 100644
-index 000000000000..2a90e8121a34
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
-+#define __IA_CSS_PSYS_KERNEL_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
-+     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
-+        PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_KERNEL_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_KERNEL_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_KERNEL_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_KERNEL_TRACE_METHOD \
-+        PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+        PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+        PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+        PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+        PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+        PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+        PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
-new file mode 100644
-index 000000000000..bd7bf4eec326
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
-@@ -0,0 +1,108 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
-+#define __IA_CSS_PSYS_MANIFEST_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_manifest_types.h
-+ *
-+ * The types belonging to the terminal/program/
-+ * program group manifest static module
-+ */
-+
-+#include <type_support.h>
-+#include "vied_nci_psys_resource_model.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+/** This value is used in the manifest to indicate that the resource
-+ * offset field must be ignored and the resource is relocatable
-+ */
-+#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
-+
-+#define IA_CSS_CONNECTION_BITMAP_BITS 8
-+typedef uint8_t ia_css_connection_bitmap_t;
-+
-+#define IA_CSS_CONNECTION_TYPE_BITS 32
-+
-+/** Describes the tranfer method of data between terminals */
-+typedef enum ia_css_connection_type {
-+    /** The data buffer must be fully written to main memory by the producer
-+     *  before it can be read by the consumer */
-+    IA_CSS_CONNECTION_MEMORY = 0,
-+    /** The data transfer is a (watermark) queued stream over main memory.
-+     *  The consumer may begin reading data before the data
-+     *  buffer is completely written in a controlled manner. */
-+    IA_CSS_CONNECTION_MEMORY_STREAM,
-+    /** The data transfer is via device ports connected such that no data
-+     *  is read or written to main memory. */
-+    IA_CSS_CONNECTION_STREAM,
-+    IA_CSS_N_CONNECTION_TYPES
-+} ia_css_connection_type_t;
-+
-+#define IA_CSS_PROGRAM_TYPE_BITS 8
-+typedef enum ia_css_program_type {
-+    IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
-+    IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
-+    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
-+    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
-+    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
-+/*
-+ * Future extension; A bitmap coding starts making more sense
-+ *
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
-+    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
-+ */
-+    IA_CSS_N_PROGRAM_TYPES
-+} ia_css_program_type_t;
-+
-+#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
-+typedef uint32_t ia_css_program_group_ID_t;
-+#define IA_CSS_PROGRAM_ID_BITS 8
-+typedef uint8_t ia_css_program_ID_t;
-+
-+#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
-+#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
-+
-+typedef struct ia_css_program_group_manifest_s
-+ia_css_program_group_manifest_t;
-+typedef struct ia_css_program_manifest_s
-+ia_css_program_manifest_t;
-+typedef struct ia_css_program_manifest_ext_s
-+ia_css_program_manifest_ext_t;
-+typedef struct ia_css_data_terminal_manifest_s
-+ia_css_data_terminal_manifest_t;
-+
-+/* ============ Program Control Init Terminal Manifest - START ============ */
-+typedef struct ia_css_program_control_init_manifest_program_desc_s
-+    ia_css_program_control_init_manifest_program_desc_t;
-+
-+typedef struct ia_css_program_control_init_terminal_manifest_s
-+    ia_css_program_control_init_terminal_manifest_t;
-+/* ============ Program Control Init Terminal Manifest - END ============ */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
-new file mode 100644
-index 000000000000..688ccd0ad23a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
-+#define __IA_CSS_PSYS_PARAM_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
-+     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_PARAM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_PARAM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_PARAM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_PARAM_TRACE_METHOD \
-+        PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+        PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+        PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+        PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+        PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+        PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+        PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
-new file mode 100644
-index 000000000000..743de9d9edf3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
-+#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
-+
-+#include "ipu_device_acb_devices.h"
-+#include "ipu_device_gp_devices.h"
-+#include "type_support.h"
-+
-+#define PRIV_CONF_INVALID    0xFF
-+#define MAX_INPUT_BUFFER    (2)
-+#define MAX_OUTPUT_BUFFER    (2)
-+
-+struct ia_css_psys_pg_buffer_information_s {
-+    unsigned int link_id; /* Terminal the buffer is connected to */
-+    unsigned int buffer_base_addr;
-+    unsigned int bpe;
-+    unsigned int buffer_width;
-+    unsigned int buffer_height;
-+    unsigned int num_of_buffers;
-+    unsigned int dfm_port_addr;
-+};
-+
-+typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
-+
-+typedef struct {
-+    uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
-+    uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
-+} ia_css_psys_private_pg_data_acb_t;
-+
-+struct ia_css_psys_private_pg_data {
-+    ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
-+    uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
-+    uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
-+    ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
-+    ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
-+};
-+
-+#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
-new file mode 100644
-index 000000000000..1e2b04e6269f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
-@@ -0,0 +1,395 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_H
-+#define __IA_CSS_PSYS_PROCESS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process.h
-+ *
-+ * Define the methods on the process object that are not part of
-+ * a single interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_dynamic_storage_class.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>                    /* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_process.hsys.user.h>
-+
-+/*
-+ * Internal resources
-+ */
-+#include <ia_css_psys_process.hsys.kernel.h>
-+
-+/*
-+ * Process manager
-+ */
-+#include <ia_css_psys_process.psys.h>
-+
-+/*
-+ * Command processor
-+ */
-+
-+/*! Execute a command locally or send it to be processed remotely
-+
-+ @param    process[in]    process object
-+ @param    cmd[in]        command
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_cmd(
-+    ia_css_process_t *process,
-+    const ia_css_process_cmd_t cmd);
-+
-+/*! Get the internal memory offset of the process object
-+
-+ @param    process[in]    process object
-+ @param    mem_id[in]    memory id
-+
-+ @return internal memory offset,
-+    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
-+    const ia_css_process_t *process,
-+    const vied_nci_mem_type_ID_t mem_id);
-+
-+/*! Get the external memory offset of the process object
-+
-+ @param    process[in]    process object
-+ @param    mem_id[in]    memory id
-+
-+ @return external memory offset,
-+    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
-+    const ia_css_process_t *process,
-+    const vied_nci_mem_type_ID_t mem_type_id);
-+
-+/*! Get the stored size of the process object
-+
-+ @param    process[in]    process object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_process_get_size(const ia_css_process_t *process);
-+
-+/*! Get the (pointer to) the process group parent of the process object
-+
-+ @param    process[in]    process object
-+
-+ @return the pointer to the parent, NULL on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_t *ia_css_process_get_parent(
-+    const ia_css_process_t *process);
-+
-+/*! Set the (pointer to) the process group parent of the process object
-+
-+ @param    process[in]    process object
-+ @param    parent[in]    (pointer to the) process group parent object
-+
-+ @return < 0 on invalid argument(s)
-+ */
-+extern int ia_css_process_set_parent(
-+    ia_css_process_t *process,
-+    ia_css_process_group_t *parent);
-+
-+/*! Get the unique ID of program used by the process object
-+
-+ @param    process[in]    process object
-+
-+ @return ID, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_ID_t ia_css_process_get_program_ID(
-+    const ia_css_process_t *process);
-+
-+/*! Get the state of the process object
-+
-+ @param    process[in]    process object
-+
-+ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_state_t ia_css_process_get_state(
-+    const ia_css_process_t *process);
-+
-+/*! Set the state of the process object
-+
-+ @param    process[in]    process object
-+ @param    state[in]    state of the process
-+
-+ @return < 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_set_state(
-+    ia_css_process_t *process,
-+    ia_css_process_state_t state);
-+
-+/*! Get the assigned cell of the the process object
-+
-+ @param    process[in]    process object
-+
-+ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_cell_ID_t ia_css_process_get_cell(
-+    const ia_css_process_t *process);
-+
-+/*! Get the number of cells the process object depends on
-+
-+ @param    process[in]    process object
-+
-+ @return number of cells
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_cell_dependency_count(
-+    const ia_css_process_t *process);
-+
-+/*! Get the number of terminals the process object depends on
-+
-+ @param    process[in]    process object
-+
-+ @return number of terminals
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_terminal_dependency_count(
-+    const ia_css_process_t *process);
-+
-+/*! Set n-th cell dependency of a process object
-+
-+ @param    process[in]    Process object
-+ @param    dep_index[in]    dep index
-+ @param    id[in]        dep id
-+
-+ @return < 0 on invalid process argument
-+ */
-+extern int ia_css_process_set_cell_dependency(
-+    const ia_css_process_t *process,
-+    const unsigned int dep_index,
-+    const vied_nci_resource_id_t id);
-+
-+/*! Get n-th cell dependency of a process object
-+
-+ @param    process[in]    Process object
-+ @param    cell_num[in]    n-th cell
-+
-+ @return n-th cell dependency,
-+    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
-+    const ia_css_process_t *process,
-+    const unsigned int cell_num);
-+
-+/*! Set n-th terminal dependency of a process object
-+
-+ @param    process[in]    Process object
-+ @param    dep_index[in]    dep index
-+ @param    id[in]        dep id
-+
-+ @return < 0 on on invalid argument(s)
-+ */
-+extern int ia_css_process_set_terminal_dependency(
-+    const ia_css_process_t *process,
-+    const unsigned int dep_index,
-+    const vied_nci_resource_id_t id);
-+
-+/*! Get n-th terminal dependency of a process object
-+
-+ @param    process[in]        Process object
-+ @param    terminal_num[in]    n-th cell
-+
-+ @return n-th terminal dependency,
-+    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_terminal_dependency(
-+    const ia_css_process_t *process,
-+    const unsigned int terminal_num);
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
-+    ia_css_process_t *process);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
-+    ia_css_process_t *process);
-+#endif
-+
-+/*! Get the cells bitmap of the the process object
-+
-+ @param    process[in]    process object
-+
-+ @return process cells bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
-+    const ia_css_process_t *process);
-+
-+/*! Sets the dfm device resource allocation bitmap of
-+ * the process object
-+
-+ @param    process[in]    process object
-+ @param    dfm_dev_id[in]    dfm device id
-+ @param bitmap[in]    resource bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dfm_port_bitmap(
-+    ia_css_process_t *process,
-+    const vied_nci_dev_dfm_id_t dfm_dev_id,
-+    const vied_nci_resource_bitmap_t bitmap);
-+
-+/*! Sets the active dfm ports bitmap of
-+ * the process object
-+
-+ @param    process[in]    process object
-+ @param    dfm_dev_id[in]    dfm device id
-+ @param bitmap[in]    active ports bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dfm_active_port_bitmap(
-+    ia_css_process_t *process,
-+    const vied_nci_dev_dfm_id_t dfm_dev_id,
-+    const vied_nci_resource_bitmap_t bitmap);
-+
-+#if HAS_DFM
-+/*! Get the dfm port bitmap of the the process object
-+
-+ @param    process[in]    process object
-+ @param    dfm_res_id    dfm resource id
-+
-+ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
-+    const ia_css_process_t *process,
-+    vied_nci_dev_dfm_id_t  dfm_res_id);
-+#endif
-+/*! Get the dfm active port bitmap of the the process object
-+
-+ @param    process[in]    process object
-+ @param    dfm_res_id[in]    dfm resource id
-+
-+ @return bitmap of all active DFM ports used by the process, corresponding to the input
-+ dfm resource id
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
-+    const ia_css_process_t *process,
-+    vied_nci_dev_dfm_id_t  dfm_res_id);
-+
-+/*! Sets the cells bitmap of
-+ * the process object
-+
-+ @param    process[in]    process object
-+ @param bitmap[in]    bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_cells_bitmap(
-+    ia_css_process_t *process,
-+    const vied_nci_resource_bitmap_t bitmap);
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+/*! Get the device channel id-n resource allocation offset of the process object
-+
-+ @param    process[in]    process object
-+ @param    dev_chn_id[in]    channel id
-+
-+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_dev_chn(
-+    const ia_css_process_t *process,
-+    const vied_nci_dev_chn_ID_t dev_chn_id);
-+#endif
-+/*! Get the ext mem type-n resource id of the the process object
-+
-+ @param    process[in]    process object
-+ @param    mem_type[in]    mem type
-+
-+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
-+    const ia_css_process_t *process,
-+    const vied_nci_mem_type_ID_t mem_type);
-+
-+/*! Sets the device channel id-n resource allocation offset of
-+ * the process object
-+
-+ @param    process[in]    process object
-+ @param    dev_chn_id[in]    channel id
-+ @param offset[in]    resource offset
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dev_chn(
-+    ia_css_process_t *process,
-+    const vied_nci_dev_chn_ID_t dev_chn_id,
-+    const vied_nci_resource_size_t offset);
-+
-+/*! Boolean test if the process object type is valid
-+
-+ @param    process[in]    process object
-+ @param    p_manifest[in]    program manifest
-+
-+ @return true if the process object is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_process_valid(
-+    const ia_css_process_t *process,
-+    const ia_css_program_manifest_t *p_manifest);
-+
-+/*! Gets the program_idx from the process object
-+
-+ @param    process[in] process object
-+
-+ @return program index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_get_program_idx(
-+    const ia_css_process_t *process);
-+
-+/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
-+ * @param process[in] process object
-+ * @return process entension, NULL if there is none.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_ext_t *ia_css_process_get_extension(
-+    const ia_css_process_t *process);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
-new file mode 100644
-index 000000000000..2ef42d15aef7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
-@@ -0,0 +1,159 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
-+
-+/**
-+ * @file ia_css_psys_process.hsys.kernel.h
-+ *
-+ * Define the methods on the process object: Hsys kernel interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+/*
-+ * Internal resources
-+ */
-+
-+/*!
-+ * @brief Clear all resource (offset) specifications
-+ *
-+ * @param[in]    process                process object
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_all(ia_css_process_t *process);
-+
-+/*!
-+ * @brief Set the cell ID resource specification
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    cell_id                cell ID
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_cell(
-+    ia_css_process_t                    *process,
-+    const vied_nci_cell_ID_t                cell_id);
-+
-+/*!
-+ * @brief Clear cell ID resource specification
-+ *
-+ * @param[in]    process                process object
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_cell(ia_css_process_t *process);
-+
-+/*!
-+ * @brief Set the memory resource (offset) specification for a memory
-+ * that belongs to the cell that is assigned to the process.
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    mem_type_id            mem type ID
-+ * @param[in]    offset                offset
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_int_mem(
-+    ia_css_process_t        *process,
-+    const    vied_nci_mem_type_ID_t    mem_type_id,
-+    const vied_nci_resource_size_t    offset);
-+
-+/*!
-+ * @brief Clear the memory resource (offset) specification for a memory
-+ * type that belongs to the cell that is assigned to the process.
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    mem_id                mem ID
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_int_mem(
-+    ia_css_process_t        *process,
-+    const vied_nci_mem_type_ID_t    mem_type_id);
-+
-+/*!
-+ * @brief Set the memory resource (offset) specification for a memory
-+ * that does not belong to the cell that is assigned to the process.
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    mem_type_id                mem type ID
-+ * @param[in]    offset                offset
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_ext_mem(
-+    ia_css_process_t        *process,
-+    const vied_nci_mem_ID_t        mem_id,
-+    const vied_nci_resource_size_t    offset);
-+
-+/*!
-+ * @brief Clear the memory resource (offset) specification for a memory
-+ * type that does not belong to the cell that is assigned to the process.
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    mem_id                mem ID
-+ *
-+ * Precondition: The cell ID must be set
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_ext_mem(
-+    ia_css_process_t        *process,
-+    const vied_nci_mem_type_ID_t    mem_type_id);
-+
-+/*!
-+ * @brief Set a device channel resource (offset) specification.
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    dev_chn_id            device channel ID
-+ * @param[in]    offset                offset
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_dev_chn(
-+    ia_css_process_t        *process,
-+    const vied_nci_dev_chn_ID_t    dev_chn_id,
-+    const vied_nci_resource_size_t    offset);
-+
-+/*!
-+ * @brief Clear a device channel resource (offset) specification
-+ *
-+ * @param[in]    process                process object
-+ * @param[in]    dev_chn_id            device channel ID
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_dev_chn(
-+    ia_css_process_t        *process,
-+    const vied_nci_dev_chn_ID_t    dev_chn_id);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
-new file mode 100644
-index 000000000000..8c45d7735ea2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
-@@ -0,0 +1,94 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
-+
-+/**
-+ *  @file ia_css_psys_process.hsys.user.h
-+ *
-+ *  Define the methods on the process object: Hsys user interface
-+ */
-+
-+#include <ia_css_program_group_param.h>        /* ia_css_program_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>                    /* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+
-+/*!
-+ * @brief Compute the size of storage required for allocating the process object.
-+ *
-+ * @param [in]    manifest            program manifest
-+ * @param [in]    param                program parameters
-+ *
-+ * @return 0 on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern size_t ia_css_sizeof_process(
-+    const ia_css_program_manifest_t            *manifest,
-+    const ia_css_program_param_t            *param);
-+
-+/*!
-+ * @brief Create the process object
-+ *
-+ * @param [in]    raw_mem                pre allocated memory
-+ * @param [in]    manifest            program manifest
-+ * @param [in]    param                program parameters
-+ *
-+ * @return NULL on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern ia_css_process_t *ia_css_process_create(
-+    void                *raw_mem,
-+    const ia_css_program_manifest_t    *manifest,
-+    const ia_css_program_param_t    *param,
-+    const uint32_t            program_idx);
-+
-+/*!
-+ * @brief Destroy (the storage of) the process object
-+ *
-+ * @param [in]    process                process object
-+ *
-+ * @return NULL
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern ia_css_process_t *ia_css_process_destroy(
-+    ia_css_process_t    *process);
-+
-+/*
-+ * Access functions
-+ */
-+
-+/*!
-+ * @brief Print the process object to file/stream
-+ *
-+ * @param [in]    process                process object
-+ * @param [out]    fid                file/stream handle
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern int ia_css_process_print(
-+    const ia_css_process_t    *process,
-+    void            *fid);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
-new file mode 100644
-index 000000000000..a208fdff1d61
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
-@@ -0,0 +1,54 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
-+#define __IA_CSS_PSYS_PROCESS_PSYS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process.psys.h
-+ *
-+ * Define the methods on the process object: Psys embedded interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+/*
-+ * Process manager
-+ */
-+
-+/*! Acquire the resources specificed in process object
-+
-+ @param    process[in]                process object
-+
-+ Postcondition: This is a try process if any of the
-+ resources is not available, all succesfully acquired
-+ ones will be release and the function will return an
-+ error
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_acquire(ia_css_process_t *process);
-+
-+/*! Release the resources specificed in process object
-+
-+ @param    process[in]                process object
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_release(ia_css_process_t *process);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
-new file mode 100644
-index 000000000000..6bcea8925adf
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
-@@ -0,0 +1,487 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.h
-+ *
-+ * Define the methods on the process object that are not part of
-+ * a single interface
-+ */
-+#include "ia_css_rbm.h"
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_dynamic_storage_class.h>
-+
-+#include <type_support.h>                    /* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_process_group.hsys.user.h>
-+
-+/*
-+ * Registration of user contexts / callback info
-+ * External resources
-+ * Sequencing resources
-+ */
-+#include <ia_css_psys_process_group.hsys.kernel.h>
-+
-+/*
-+ * Dispatcher
-+ */
-+#include <ia_css_psys_process_group.psys.h>
-+
-+/*
-+ * Access to sub-structure handles / fields
-+ */
-+
-+#include "ia_css_terminal.h"
-+
-+#include "ia_css_terminal_manifest_base_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+/*! Get the number of fragments on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ Note: Future change is to have a fragment count per
-+ independent subgraph
-+
-+ @return the fragment count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_process_group_get_fragment_count(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the fragment state on the process group
-+
-+ @param     process_group[in]        process group object
-+ @param     fragment_state[in]        current fragment of processing
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_get_fragment_state(
-+    const ia_css_process_group_t        *process_group,
-+    uint16_t                *fragment_state);
-+
-+/*! Set the fragment state on the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    fragment_state[in]        current fragment of processing
-+
-+ @return -1 on error
-+  */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_fragment_state(
-+    ia_css_process_group_t            *process_group,
-+    uint16_t                fragment_state);
-+
-+/*! Get the number of processes on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return the process count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_process_count(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the number of terminals on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ Note: Future change is to have a terminal count per
-+ independent subgraph
-+
-+ @return the terminal count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_terminal_count(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the PSYS server init time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PSYS server init time, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_psys_server_init_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! \deprecated this is old and will get removed */
-+/*! Get the PG load start timestamp
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG load start timestamp, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_load_start_ts(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the PG load time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG load time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_load_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the PG init time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG init time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_init_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the PG processing time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_processing_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the PG next frame init time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the PG complete time in cycles
-+
-+ @param    process_group[in]        process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_complete_cycles(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Get the (pointer to) the <terminal type> terminal of the process group object
-+
-+ @param    process_group[in]               process group object
-+ @param    terminal_type[in]               terminal type of terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
-+        const ia_css_process_group_t *process_group,
-+        const ia_css_terminal_type_t terminal_type);
-+
-+/*! Get the (pointer to) the <terminal type> terminal of the process group object
-+ * for terminals which have only a single instance
-+ * (cached in, cached out, program, program_ctrl_init)
-+
-+ @param    process_group[in]               process group object
-+ @param    terminal_type[in]               terminal type of terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
-+    const ia_css_process_group_t     *process_group,
-+    ia_css_terminal_type_t        term_type);
-+
-+/*! Get the (pointer to) the manifest indexed terminal of the process group object
-+
-+ @param    process_group[in]        process group object
-+ @param    manifest_idx[in]        index of the terminal in manifest
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
-+    const ia_css_process_group_t *process_grp,
-+    const unsigned int manifest_idx);
-+
-+/*! Get the (pointer to) the indexed terminal of the process group object
-+
-+ @param    process_group[in]        process group object
-+ @param    terminal_index[in]        index of the terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_terminal(
-+    const ia_css_process_group_t        *process_group,
-+    const unsigned int            terminal_index);
-+
-+/*! Get the (pointer to) the indexed process of the process group object
-+
-+ @param    process_group[in]        process group object
-+ @param    process_index[in]        index of the process
-+
-+ @return the pointer to the process, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_t *ia_css_process_group_get_process(
-+    const ia_css_process_group_t        *process_group,
-+    const unsigned int            process_index);
-+
-+/*! Get the stored size of the process group object
-+
-+ @param    process_group[in]                process group object
-+
-+ @return size, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_process_group_get_size(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the state of the the process group object
-+
-+ @param    process_group[in]        process group object
-+
-+ @return state, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_state_t ia_css_process_group_get_state(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the unique ID of program group used by the process group object
-+
-+ @param    process_group[in]        process group object
-+
-+ @return ID, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Get the resource bitmap of the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return the reource bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
-+    const ia_css_process_group_t        *process_group);
-+
-+/*! Set the resource bitmap of the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    resource_bitmap[in]        the resource bitmap
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_resource_bitmap(
-+    ia_css_process_group_t            *process_group,
-+    const vied_nci_resource_bitmap_t    resource_bitmap);
-+
-+/*! Get the kernel bitmap of the the process group object
-+
-+ @param    process_group[in] process group object
-+
-+ @return process group kernel bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
-+    const ia_css_process_group_t *process_group);
-+
-+/*! Get the routing bitmap of the process group
-+
-+ @param    process_group[in]   process group object
-+
-+ @return routing bitmap (pointer)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
-+    const ia_css_process_group_t *process_group);
-+
-+/*! Set the routing bitmap of the process group
-+
-+ @param    process_group[in]   process group object
-+ @param    rbm[in]                routing bitmap
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_routing_bitmap(
-+    ia_css_process_group_t *process_group,
-+    const ia_css_rbm_t rbm);
-+
-+/*! Get IPU virtual address of process group
-+
-+ @param     process_group[in]        process group object
-+ @param     ipu_vaddress[in/out]    process group ipu virtual address
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_get_ipu_vaddress(
-+    const ia_css_process_group_t        *process_group,
-+    vied_vaddress_t            *ipu_vaddress);
-+
-+/*! Set IPU virtual address of process group
-+
-+ @param    process_group[in]        process group object
-+ @param    ipu_vaddress[in]        process group ipu address
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_ipu_vaddress(
-+    ia_css_process_group_t            *process_group,
-+    vied_vaddress_t            ipu_vaddress);
-+
-+/*! Get protocol version used by a process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return invalid protocol version on error
-+
-+ @todo Add new protocol version for IPU7.  Defer this for now,
-+ because it will create a LOT of disruption.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_protocol_version(
-+    const ia_css_process_group_t *process_group);
-+
-+/*! Get base queue id used by a process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_base_queue_id(
-+    ia_css_process_group_t *process_group);
-+
-+/*! Set base queue id used by a process group
-+
-+ @param    process_group[in]        process group object
-+ @param    queue_id[in]            process group queue id
-+
-+ @return invalid queue id on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_base_queue_id(
-+    ia_css_process_group_t *process_group,
-+    uint8_t queue_id);
-+
-+/*! Get number of queues used by a process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return invalid number of queues (0) on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_num_queues(
-+    ia_css_process_group_t *process_group);
-+
-+/*! Set number of queues used by a process group
-+
-+ @param    process_group[in]        process group object
-+ @param    num_queues[in]            process group number of queues
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_num_queues(
-+    ia_css_process_group_t *process_group,
-+    uint8_t num_queues);
-+
-+/*! Set error handling enable flag used by process group
-+
-+ @param    process_group[in]        process group object
-+ @param    error_handling_enable[in]    flag to control error handling
-+
-+ @return -1 on error, 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_error_handling_enable(
-+    ia_css_process_group_t *process_group,
-+    const bool error_handling_enable);
-+
-+/*! Get the error handling enable flag associated to the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_error_handling_enable(
-+    const ia_css_process_group_t *process_group);
-+
-+/** Return true if the process group requires vector processor (i.e. DSP)
-+ *  resources  */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
-+
-+/*! Check if terminal is enabled based on kernel enable bitmap
-+
-+ @param    terminal_manifest[in]        terminal manifest object
-+ @param    enable_bitmap[in]        kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_terminal_enabled(
-+    const ia_css_terminal_manifest_t *terminal_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Check if data terminal is enabled based on kernel enable bitmap
-+
-+ @param    data_term_manifest[in]        data terminal manifest object
-+ @param    enable_bitmap[in]        kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_data_terminal_enabled(
-+    const ia_css_data_terminal_manifest_t    *data_term_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Check if spatial terminal is enabled based on kernel enable bitmap
-+
-+ @param    spatial_term_man[in]    spatial    terminal manifest object
-+ @param    enable_bitmap[in]        kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_spatial_terminal_enabled(
-+    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
-+    ia_css_kernel_bitmap_t enable_bitmap);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_group_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
-new file mode 100644
-index 000000000000..3c43d58580e5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
-@@ -0,0 +1,379 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.hsys.kernel.h
-+ *
-+ * Define the methods on the process group object: Hsys kernel interface
-+ *
-+ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
-+ *  defines the functions required to manage the lifetime of a process group.
-+ *
-+ * Sequence for settup up and queueing processing tasks with a persistent program group
-+ * to IPU is:
-+ *
-+ * # Get Program Group manifest by ID
-+ * # Create process group object based on that program group manifest
-+ * # Configure process group
-+ * ## Set kernel and terminal enables
-+ * ## Set terminal attributes
-+ * # Submit processs group
-+ * # Start process group
-+ * # Disown process group
-+ * # Frame/Fragment processing loop
-+ * ## Enqueue buffer sets - This sends the terminal buffers to FW
-+ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
-+ * process group will process any available buffer sets until suspended or stopped, pending
-+ * available resources.
-+ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
-+ * processing of one group, which allows another PG to run with the same resources. Buffer
-+ * sets for the suspended PG may continue to be queued, but will not be processed until
-+ * the PG is resumed.  The decision when to suspend/resume is scheduling.
-+ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
-+ *
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+#include <ia_css_psys_buffer_set.h>
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>                    /* uint8_t */
-+
-+/*
-+ * Registration of user contexts / callback info
-+ */
-+
-+/*! Get the user (callback) token as registered in the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @return 0 on error
-+ */
-+extern uint64_t ia_css_process_group_get_token(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Set (register) a user (callback) token in the process group
-+
-+ The token value shall be non-zero. This token is
-+ returned in each return message related to the process
-+ group the token is registered with.
-+
-+ @param    process_group[in]        process group object
-+ @param    token[in]                user token
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_set_token(
-+    ia_css_process_group_t                    *process_group,
-+    const uint64_t                            token);
-+
-+/*
-+ * Passing of a (fragment) watermark
-+ */
-+
-+/*! Get the fragment progress limit of the process group
-+
-+ @see ia_css_process_group_set_fragment_limit()
-+
-+ @param    process_group[in]        process group object
-+
-+ @return 0 on error
-+
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_process_group_get_fragment_limit(
-+    const ia_css_process_group_t                *process_group);
-+
-+/*! Set the new fragment progress limit of the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    fragment_limit[in]        New limit value
-+
-+ @note The limit value must be less or equal to the fragment
-+ count value. The process group will not make progress beyond
-+ the limit value. The limit value can be modified asynchronously
-+ If the limit value is reached before an update happens, the
-+ process group will suspend and will not automatically resume.
-+
-+ The limit is monotonically increasing. The default value is
-+ equal to the fragment count
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_fragment_limit(
-+    ia_css_process_group_t                *process_group,
-+    const uint16_t                    fragment_limit);
-+
-+/*! Clear the fragment progress limit of the process group
-+
-+ @see ia_css_process_group_set_fragment_limit()
-+
-+ @param    process_group[in]        process group object
-+
-+ @note This function sets the fragment limit to zero.
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_clear_fragment_limit(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*
-+ * Commands
-+ */
-+
-+/*! Perform the start command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Start is an action of the l-Scheduler it makes the
-+ process group eligible for execution.
-+ For PPG's, execution will not occur until the resume
-+ command is issued.  See ia_css_process_group_resume()
-+
-+ @par For persistent program/process groups () the start
-+ command must be called once per stream instance,
-+ at stream creation.
-+
-+ @par Precondition: The external resources that are attached to
-+ the process group must be in the correct state, i.e. input
-+ buffers are not-empty and output buffers not-full
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_start(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Perform the suspend command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Suspend indicates that the process group execution
-+ is halted at the next fragment boundary. The process group
-+ will not automatically resume
-+
-+ @par Precondition: The process group must be running
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_suspend(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Perform the resume command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Resume indicates that the process group is again
-+ eligible for execution
-+
-+ @par Precondition: The process group must be started
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_resume(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Perform the reset command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Return the process group to the started state
-+
-+ @par Precondition: The process group must be running or stopped
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_reset(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Perform the abort command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Force the process group to the stopped state
-+
-+ @par Precondition: The process group must be running or started
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_abort(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Release ownership of the process group
-+
-+  For PPG's, this is the last step required before buffer
-+  sets can be enqueued.
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Release notifies PSYS and hands over ownership of the
-+ process group from SW to FW.
-+
-+ @par Precondition: The process group must be in the started state
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_disown(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*
-+ * External resources
-+ */
-+
-+/*! Set (register) a data buffer to the indexed terminal in the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    buffer[in]            buffer handle
-+ @param    buffer_state[in]        state of the buffer
-+ @param    terminal_index[in]        index of the terminal
-+
-+ @note For legacy program groups (== non-PPG), the buffer handle
-+ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
-+
-+ @par For PPG's, buffer is ignored as the buffers will be sent
-+ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
-+ called before ia_css_process_group_submit() as sets up some internal bookeeping.
-+
-+ @note The buffer can be in memory or streaming over memory
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_attach_buffer(
-+    ia_css_process_group_t            *process_group,
-+    vied_vaddress_t                buffer,
-+    const ia_css_buffer_state_t        buffer_state,
-+    const unsigned int            terminal_index);
-+
-+/*! Get (unregister) the data buffer on the indexed terminal of
-+ * the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    terminal_index[in]        index of the terminal
-+
-+ @note Precondition: The process group must be stopped
-+
-+ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
-+ state to BUFFER_NULL
-+
-+ @par This function is meaningless for PPG's
-+
-+ @return VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_process_group_detach_buffer(
-+    ia_css_process_group_t            *process_group,
-+    const unsigned int            terminal_index);
-+
-+/*! Set (register) a data buffer to the indexed terminal in the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    stream[in]                stream handle
-+ @param    buffer_state[in]        state of the buffer
-+ @param    terminal_index[in]        index of the terminal
-+
-+ @note The stream handle shall not be zero, the buffer
-+ state can be undefined; BUFFER_UNDEFINED
-+
-+ @note The stream is used exclusive to a buffer; the latter can be in memory
-+ or streaming over memory
-+
-+ @todo Unclear what this function is for.  Clarify!
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_attach_stream(
-+    ia_css_process_group_t            *process_group,
-+    uint32_t                stream,
-+    const ia_css_buffer_state_t        buffer_state,
-+    const unsigned int            terminal_index);
-+
-+/*! Get (unregister) the stream handle on the indexed terminal of
-+ * the process group
-+
-+ @param    process_group[in]        process group object
-+ @param    terminal_index[in]        index of the terminal
-+
-+ @par Precondition: The process group must be stopped
-+
-+ @par Postcondition: The stream handle shall be reset to zero, the buffer
-+ state to BUFFER_NULL
-+
-+ @todo Unclear what this function is for.  Clarify!
-+
-+ @return 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_detach_stream(
-+    ia_css_process_group_t            *process_group,
-+    const unsigned int            terminal_index);
-+
-+/*
-+ * Sequencing resources
-+ */
-+
-+/*! Set (an artificial) blocking resource (barrier) in
-+ * the process group resource map
-+
-+ @param    process_group[in]        process group object
-+ @param    barrier_index[in]        index of the barrier
-+
-+ @note The barriers have to be set to force sequence between started
-+ process groups
-+
-+ @return < 0 on error
-+
-+ @todo Seems this function no longer has any use.  Clarify!
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_barrier(
-+    ia_css_process_group_t                    *process_group,
-+    const vied_nci_barrier_ID_t                barrier_index);
-+
-+/*! Clear a previously set blocking resource (barrier) in
-+ * the process group resource map
-+
-+ @param    process_group[in]        process group object
-+ @param    barrier_index[in]        index of the barrier
-+
-+ @par Precondition: The barriers must have been set
-+
-+ @return < 0 on error
-+
-+ @todo Seems this function no longer has any use.  Clarify!
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_clear_barrier(
-+    ia_css_process_group_t                    *process_group,
-+    const vied_nci_barrier_ID_t                barrier_index);
-+
-+/*! Boolean test if the process group preconditions for start are satisfied
-+
-+ @param    process_group[in]        process group object
-+
-+ @return true if the process group can be started
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_process_group_start(
-+    const ia_css_process_group_t            *process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
-new file mode 100644
-index 000000000000..e166c5b4e283
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
-@@ -0,0 +1,224 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.hsys.user.h
-+ *
-+ * Define the methods on the process group object: Hsys user interface
-+ *
-+ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
-+ *  defines the functions required to manage the lifetime of a process group.
-+ */
-+
-+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_buffer_set.h>
-+
-+#include "ia_css_psys_dynamic_storage_class.h"
-+
-+#include <type_support.h>                    /* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+
-+/*! Compute the size of storage required for allocating the process group object
-+
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]            program group parameters
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_process_group(
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t    *param);
-+
-+/*! Checks whether a certain program is enabled.
-+ *   FUNCTION IS PRIVATE TO THIS MODULE
-+
-+ @param    program_manifest[in] program manifest
-+ @param    enable_bitmap[in]   kernel enable bitmap corresponding to process group
-+
-+ @return true if program is enabled (and process will be instantiated)
-+ */
-+extern bool ia_css_process_group_is_program_enabled(
-+    const ia_css_program_manifest_t *program_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Create (the storage for) the process group object
-+
-+ @param    process_grp_mem[in/out]    raw memory for process group
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]            program group parameters
-+
-+ @return NULL on error
-+ */
-+extern ia_css_process_group_t *ia_css_process_group_create(
-+    void                    *process_grp_mem,
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t    *param);
-+
-+/*! Destroy (the storage of) the process group object
-+
-+ @param    process_group[in]        process group object
-+
-+ @return NULL
-+ */
-+extern ia_css_process_group_t *ia_css_process_group_destroy(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Print the process group object to file/stream in
-+  textual format
-+
-+ @param    process_group[in]        process group object
-+ @param    fid[out]                file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_print(
-+    const ia_css_process_group_t        *process_group,
-+    void                    *fid);
-+
-+/*
-+ * Commands
-+ */
-+
-+/*! Perform the submit command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ @note Submit is an action of the h-Scheduler it makes the
-+ process group eligible for the l-Scheduler
-+
-+ @par Precondition : The external resources must be attached to
-+ the process group
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_submit(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Boolean test if the process group object type is valid
-+
-+ @param    process_group[in]        process group object
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]                program group parameters
-+
-+ @return true if the process group is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_process_group_valid(
-+    const ia_css_process_group_t        *process_group,
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t    *param);
-+
-+/*! Boolean test if the process group preconditions for submit are satisfied
-+
-+ @param    process_group[in]        process group object
-+
-+ @return true if the process group can be submitted
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_process_group_submit(
-+    const ia_css_process_group_t            *process_group);
-+
-+/*! Boolean test if the preconditions on process group and buffer set are
-+    satisfied for enqueuing buffer set
-+
-+ @param    process_group[in]        process group object
-+ @param    buffer_set[in]            buffer set object
-+
-+ @return true if the buffer set can be enqueued
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_enqueue_buffer_set(
-+    const ia_css_process_group_t            *process_group,
-+    const ia_css_buffer_set_t            *buffer_set);
-+
-+/*! Compute the cyclecount required for executing the process group object
-+
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]                program group parameters
-+
-+ @return 0 on error
-+
-+ @note Current implementation is trivial
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_compute_cycle_count(
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t    *param);
-+
-+/*! Compute the number of processes required for
-+ * executing the process group object
-+
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]                program group parameters
-+
-+ @return 0 on error
-+ */
-+extern uint8_t ia_css_process_group_compute_process_count(
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Compute the number of terminals required for
-+ * executing the process group object
-+
-+ @param    manifest[in]            program group manifest
-+ @param    param[in]                program group parameters
-+
-+ @return 0 on error
-+ */
-+extern uint8_t ia_css_process_group_compute_terminal_count(
-+    const ia_css_program_group_manifest_t    *manifest,
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Get private token as registered in the process group by the implementation
-+
-+ @note The token value shall be non-zero. This token is private
-+ to the implementation. This is in addition to the user token.
-+ See ia_css_process_group_set_token()
-+
-+ @param    process_group[in]        process group object
-+
-+ @return 0 on error
-+ */
-+extern uint64_t ia_css_process_group_get_private_token(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Set private token in the process group as needed by the implementation
-+
-+ @param    process_group[in]        process group object
-+ @param    token[in]                user token
-+
-+ @note The token value shall be non-zero. This token is private
-+ to the implementation. This is in addition to the user token.
-+ see ia_css_process_group_get_token()
-+
-+ @return < 0 on error, 0 on success
-+ */
-+extern int ia_css_process_group_set_private_token(
-+    ia_css_process_group_t                    *process_group,
-+    const uint64_t                            token);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
-new file mode 100644
-index 000000000000..49c04df55d7d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
-@@ -0,0 +1,61 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.psys.h
-+ *
-+ * Define the methods on the process group object: Psys embedded interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+/*
-+ * Dispatcher
-+ */
-+
-+/*! Perform the run command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ Note: Run indicates that the process group will execute
-+
-+ Precondition: The process group must be started or
-+ suspended and the processes have acquired the necessary
-+ internal resources
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_run(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*! Perform the stop command on the process group
-+
-+ @param    process_group[in]        process group object
-+
-+ Note: Stop indicates that the process group has completed execution
-+
-+ Postcondition: The external resoruces can now be detached
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_stop(
-+    ia_css_process_group_t                    *process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
-new file mode 100644
-index 000000000000..de0b78f71aeb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
-@@ -0,0 +1,280 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
-+
-+#include "type_support.h"
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+#define N_UINT64_IN_PROCESS_GROUP_STRUCT    2
-+#define N_UINT32_IN_PROCESS_GROUP_STRUCT    8
-+#define N_UINT16_IN_PROCESS_GROUP_STRUCT    5
-+#define N_UINT8_IN_PROCESS_GROUP_STRUCT        8
-+#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT    2
-+
-+#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
-+    (IA_CSS_RBM_BITS \
-+    + IA_CSS_KERNEL_BITMAP_BITS \
-+    + N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
-+    + N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_PROGRAM_GROUP_ID_BITS \
-+    + IA_CSS_PROCESS_GROUP_STATE_BITS \
-+    + VIED_VADDRESS_BITS \
-+    + VIED_NCI_RESOURCE_BITMAP_BITS \
-+    + N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
-+    + N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/** Process group object describing an instance of a Program Group
-+ *
-+ *  This is the root structure passed in a number of PG commands via
-+ *  the syscom queuing interface to firmware from the host.  A pointer
-+ *  to this structure in main memroy is passed in the following
-+ *  PG commands: start, resume, suspend, stop, abort.
-+ *
-+ *  A process group is created based on a program group specification
-+ *  described in the program group manifest.  Briefly, a program group
-+ *  contains programs which in turn contain kernels.  A program group
-+ *  also has terminals, which connect it to the outside world.  Each
-+ *  terminal represents either parameters or image data flowing in or
-+ *  out of the group.  Terminals come in different types and may have
-+ *  addtional attributes.  For example, a data termainal will have
-+ *  a frame format attribute.
-+ *  @see ia_css_process_group_create()
-+ *  @see ia_css_program_group_manifest_t and related API and:
-+ *  @see ia_css_pkg_dir_entry_get_type() and
-+ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
-+ *  ia_css_pkg_dir* functions) for how to get the program group manifest
-+ *  array from the binary release package.
-+ *
-+ *  @note Some of the fields within are used internally within the
-+ *  firmware only, after the firmware copies the process group structure
-+ *  to its internel cache.  The original in main memory is not updated.
-+ *  All such fields should be initialized to zero, unless otherwise
-+ *  noted.
-+ *  See the individual field descriptions for which fields are "internal".
-+ */
-+struct ia_css_process_group_s {
-+    /** User (callback) token / user context reference,
-+     * zero is an error value
-+     */
-+    uint64_t token;
-+    /** private token / context reference, zero is an error value */
-+    uint64_t private_token;
-+    /** PG routing bitmap used to set connection between program group
-+     *  components */
-+    ia_css_rbm_t routing_bitmap;
-+    /** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
-+     *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
-+    ia_css_kernel_bitmap_t kernel_bitmap;
-+    /** Size of this structure in bytes */
-+    uint32_t size;
-+    /** The timestamp when PG load starts
-+     *  @note Internal firmware use only. */
-+    /**< PSYS server init time in cycless */
-+    uint32_t psys_server_init_cycles;
-+    /**< The timestamp when PG load starts */
-+    uint32_t pg_load_start_ts;
-+    /** PG load time in cycles
-+     *  @note Internal firmware use only. */
-+    uint32_t pg_load_cycles;
-+    /** PG init time in cycles
-+     *  @note Internal firmware use only. */
-+    uint32_t pg_init_cycles;
-+    /** PG processing time in cycles
-+     *  @note Internal firmware use only. */
-+    uint32_t pg_processing_cycles;
-+    /** Referral ID to program group FW.  This identifies the "type" of the process group
-+     *  and associcates the process group with the program group defined in the manifest. */
-+    /**< PG next frame init time in cycles */
-+    uint32_t pg_next_frame_init_cycles;
-+    /**< PG complete time in cycles */
-+    uint32_t pg_complete_cycles;
-+    /**< Referral ID to program group FW */
-+    ia_css_program_group_ID_t ID;
-+    /** State of the process group FSM */
-+    ia_css_process_group_state_t state;
-+    /** Virtual address of process group in the IPU address space */
-+    vied_vaddress_t ipu_virtual_address;
-+    /** Bitmap of the compute resources used by the process group  */
-+    vied_nci_resource_bitmap_t resource_bitmap;
-+    /** Number of fragments offered on each terminal */
-+    uint16_t fragment_count;
-+    /** Current fragment of processing */
-+    uint16_t fragment_state;
-+    /** Watermark to control fragment processing.  Set to the same value as "fragment_count"
-+     *  unless you know what you are doing.
-+     *  @see  fragment_count in this structure. */
-+    uint16_t fragment_limit;
-+    /** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
-+     *  Must be aligned to a 64 bit boundary.
-+     *  process_offset_table is an array of size "process_count", containing offsets to process objects
-+     *  (each an instance of ia_css_process_t) belonging to this process group.
-+     *  @see process_count in this structure.
-+     *
-+     *  Usually follows this process group structure. */
-+    uint16_t processes_offset;
-+    /** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
-+     *  Must be aligned to a 64 bit boundary.
-+     *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
-+     *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
-+     *  @see terminal_count in this structure.
-+     *
-+     *  Usually follows process_offset_table, aligned to 64-bit boundary. */
-+    uint16_t terminals_offset;
-+    /** Parameter dependent number of processes in this process group, determined at process
-+     *  group creation taking into account the enabled kernels. That is, if all of a program's
-+     *  associcated kernels are disabled, then no process is instantiated for that program and
-+     *  it must not be counted in the process count.
-+     *
-+     *  @see processes_offset in this structure
-+     *  @see ia_css_program_group_manifest_get_program_count()
-+     *  @see ia_css_program_manifest_get_kernel_bitmap()
-+     *  @see ia_css_process_group_compute_process_count() */
-+    uint8_t process_count;
-+    /** Parameter dependent number of terminals on this process group, determined at process
-+     *  group creation.  Must not be greater than the terminal count as defined in the manifest,
-+     *  but taking into account the enabled kernels.  That is, for those terminal types that have
-+     *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
-+     *  Execptions by terminal type:
-+     *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
-+     *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
-+     *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
-+     *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
-+     *
-+     *  @see terminals_offset in this structure
-+     *  @see ia_css_program_group_manifest_get_terminal_count()
-+     *  @see ia_css_program_manifest_get_kernel_bitmap()
-+     *  @see ia_css_process_group_is_terminal_enabled()
-+     *  @see ia_css_process_group_compute_terminal_count() */
-+    uint8_t terminal_count;
-+    /** Parameter dependent number of independent subgraphs in
-+     * this process group.
-+     * @note Apparently no longer used.
-+     */
-+    uint8_t subgraph_count;
-+    /** Process group protocol version.  Identifies the state machine and
-+     *  message protocol for this process group. */
-+    uint8_t protocol_version;
-+    /** Dedicated base queue id used for enqueueing payload buffer sets.
-+     *  Each buffer set is either a frame (or fragment) processing request,
-+     *  or an opportunistic parameter update (AKA "late binding")
-+     *  This queue is enabled once the process group start command has
-+     *  been issued. */
-+    uint8_t base_queue_id;
-+    /** Number of dedicated queues used */
-+    uint8_t num_queues;
-+    /**< Mask the send_pg_done IRQ */
-+    uint8_t mask_irq;
-+    /** Error handling enable\disable flag */
-+    uint8_t error_handling_enable;
-+#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
-+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
-+#endif
-+};
-+
-+/*! Callback after process group is created. Implementations can provide
-+ * suitable actions needed when process group is created.
-+
-+ @param    process_group[in]            process group object
-+ @param    program_group_manifest[in]        program group manifest
-+ @param    program_group_param[in]            program group parameters
-+
-+ @return 0 on success and non-zero on failure
-+ */
-+extern int ia_css_process_group_on_create(
-+    ia_css_process_group_t            *process_group,
-+    const ia_css_program_group_manifest_t    *program_group_manifest,
-+    const ia_css_program_group_param_t    *program_group_param);
-+
-+/*! Callback before process group is about to be destoyed. Any implementation
-+ * specific cleanups can be done here.
-+
-+ @param    process_group[in]                process group object
-+
-+ @return 0 on success and non-zero on failure
-+ */
-+extern int ia_css_process_group_on_destroy(
-+    ia_css_process_group_t                    *process_group);
-+
-+/*
-+ * Command processor
-+ */
-+
-+/*! Execute a command locally or send it to be processed remotely
-+
-+ @param    process_group[in]        process group object
-+ @param    cmd[in]                    command
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_exec_cmd(
-+    ia_css_process_group_t                *process_group,
-+    const ia_css_process_group_cmd_t        cmd);
-+
-+/*! Enqueue a buffer set corresponding to a persistent program group by
-+ * sending a command to subsystem.
-+
-+ @param    process_group[in]        process group object
-+ @param    buffer_set[in]            buffer set
-+ @param    queue_offset[in]        offset to be used from the queue id
-+                    specified in the process group object
-+                    (0 for first buffer set for frame, 1
-+                    for late binding)
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_enqueue_buffer_set(
-+    ia_css_process_group_t                *process_group,
-+    ia_css_buffer_set_t                *buffer_set,
-+    unsigned int                    queue_offset);
-+
-+/*! Enqueue a parameter buffer set corresponding to a persistent program
-+ *  group by sending a command to subsystem.  This allows for
-+    opportunistic late parameters update, AKA "late binding".
-+
-+ @param    process_group[in]        process group object
-+ @param    buffer_set[in]            parameter buffer set
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_enqueue_param_buffer_set(
-+    ia_css_process_group_t                *process_group,
-+    ia_css_buffer_set_t                *buffer_set);
-+
-+/*! Need to store the 'secure' mode for each PG for FW test app only
-+ *
-+ * @param    process_group[in]        process group object
-+ * @param    secure[in]            parameter buffer set
-+ *
-+ * @return < 0 on error
-+ */
-+extern int ia_css_process_group_store(
-+    ia_css_process_group_t                *process_group,
-+    bool                        secure);
-+
-+/*! Need to get the right context for each PG for FW test app only
-+ *
-+ * @param    process_group[in]        process group object
-+ *
-+ * @return    psys_syscom context
-+ */
-+extern struct ia_css_syscom_context *ia_css_process_group_get_context(
-+    ia_css_process_group_t *process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
-new file mode 100644
-index 000000000000..4ada788bed49
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
-@@ -0,0 +1,1846 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
-+
-+#include <ia_css_psysapi_fw_version.h>
-+#include <ia_css_psys_process_group.h>
-+#include "ia_css_psys_process_group_cmd_impl.h"
-+#include <ia_css_psys_terminal.h>
-+#include <ia_css_psys_transport.h>
-+#include <ia_css_psys_process.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include "ia_css_rbm.h"
-+
-+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
-+
-+#include <vied_nci_psys_system_global.h>
-+#include <ia_css_program_group_data.h>
-+#include "ia_css_rbm_manifest_types.h"
-+#include <type_support.h>
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <math_support.h>
-+
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_terminal_manifest.h"
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_data_terminal_enabled(
-+    const ia_css_data_terminal_manifest_t    *data_term_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+    bool is_terminal_enabled = false;
-+
-+    ia_css_kernel_bitmap_t term_bitmap =
-+        ia_css_data_terminal_manifest_get_kernel_bitmap(
-+                data_term_manifest);
-+    /*
-+     * Terminals depend on a kernel,
-+     * if the kernel is present the program it contains and
-+     * the terminal the program depends on are active
-+     */
-+    is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
-+            enable_bitmap,
-+            term_bitmap);
-+    return is_terminal_enabled;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_spatial_terminal_enabled(
-+    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
-+    ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+    bool is_terminal_enabled = false;
-+    ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+
-+    term_kernel_bitmap =
-+        ia_css_kernel_bitmap_set(
-+            term_kernel_bitmap,
-+            spatial_term_man->kernel_id);
-+    is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+            enable_bitmap, term_kernel_bitmap);
-+    return is_terminal_enabled;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_terminal_enabled(
-+    const ia_css_terminal_manifest_t *terminal_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+    ia_css_terminal_type_t terminal_type;
-+    bool is_terminal_enabled = false;
-+
-+    verifjmpexit(NULL != terminal_manifest);
-+    terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
-+
-+    if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
-+        ia_css_data_terminal_manifest_t    *data_term_manifest =
-+                        (ia_css_data_terminal_manifest_t *)terminal_manifest;
-+        is_terminal_enabled =
-+                ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
-+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+                terminal_manifest)) {
-+        ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
-+            (ia_css_spatial_param_terminal_manifest_t *)
-+            terminal_manifest;
-+         is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
-+            enable_bitmap);
-+    } else if (ia_css_is_terminal_manifest_parameter_terminal(
-+            terminal_manifest) && terminal_type ==
-+            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
-+        /*
-+         * For parameter out and program control terminals, we
-+         * disable the terminals if ALL the corresponding kernels
-+         * are disabled, for parameter in terminals we cannot do this;
-+         * even if kernels are disabled, it may be required that
-+         * (HW) parameters must be supplied via the parameter
-+         * in terminal (e.g. bypass bits).
-+         */
-+        is_terminal_enabled = true;
-+
-+    } else if (ia_css_is_terminal_manifest_parameter_terminal(
-+            terminal_manifest) && terminal_type ==
-+            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+        ia_css_param_terminal_manifest_t *param_term_man =
-+            (ia_css_param_terminal_manifest_t *)terminal_manifest;
-+        ia_css_param_manifest_section_desc_t *section_desc;
-+        unsigned int section = 0;
-+        uint8_t kernel_id;
-+
-+        for (section = 0; section < param_term_man->
-+                param_manifest_section_desc_count; section++) {
-+            section_desc =
-+        ia_css_param_terminal_manifest_get_prm_sct_desc(
-+                        param_term_man, section);
-+            verifjmpexit(section_desc != NULL);
-+            kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
-+            term_kernel_bitmap = ia_css_kernel_bitmap_set(
-+                    term_kernel_bitmap,
-+                    kernel_id);
-+        }
-+
-+        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+                    enable_bitmap, term_kernel_bitmap);
-+    } else if (ia_css_is_terminal_manifest_program_terminal(
-+                terminal_manifest)) {
-+        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+        ia_css_program_terminal_manifest_t *prog_term_man =
-+            (ia_css_program_terminal_manifest_t *)terminal_manifest;
-+        unsigned int section = 0;
-+
-+        for (section = 0;
-+            section < prog_term_man->fragment_param_manifest_section_desc_count;
-+            section++) {
-+            ia_css_fragment_param_manifest_section_desc_t *desc =
-+                ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+                    prog_term_man,
-+                    section);
-+            verifjmpexit(desc != NULL);
-+
-+            term_kernel_bitmap = ia_css_kernel_bitmap_set(
-+                    term_kernel_bitmap,
-+                    ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
-+        }
-+
-+        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+                    enable_bitmap, term_kernel_bitmap);
-+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+                terminal_manifest)) {
-+        is_terminal_enabled = true;
-+    }
-+    return is_terminal_enabled;
-+EXIT:
-+    return false;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_process_group_get_fragment_limit(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint16_t fragment_limit = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_fragment_limit(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    fragment_limit = process_group->fragment_limit;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_limit invalid argument\n");
-+    }
-+    return fragment_limit;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_fragment_limit(
-+    ia_css_process_group_t *process_group,
-+    const uint16_t fragment_limit)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    uint16_t fragment_state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_fragment_limit(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    retval = ia_css_process_group_get_fragment_state(process_group,
-+        &fragment_state);
-+
-+    verifexitval(retval == 0, EINVAL);
-+    verifexitval(fragment_limit > fragment_state, EINVAL);
-+    verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
-+                process_group), EINVAL);
-+
-+    process_group->fragment_limit = fragment_limit;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_limit invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_limit failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_clear_fragment_limit(
-+    ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_clear_fragment_limit(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    process_group->fragment_limit = 0;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_clear_fragment_limit failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_attach_buffer(
-+    ia_css_process_group_t *process_group,
-+    vied_vaddress_t buffer,
-+    const ia_css_buffer_state_t buffer_state,
-+    const unsigned int terminal_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    ia_css_terminal_t *terminal = NULL;
-+
-+    NOT_USED(buffer_state);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_attach_buffer(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    terminal = ia_css_process_group_get_terminal(
-+                process_group, terminal_index);
-+
-+    verifexitval(terminal != NULL, EINVAL);
-+    verifexitval(ia_css_process_group_get_state(process_group) ==
-+        IA_CSS_PROCESS_GROUP_READY, EINVAL);
-+    verifexitval(process_group->protocol_version ==
-+        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
-+        process_group->protocol_version ==
-+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
-+
-+    if (process_group->protocol_version ==
-+        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
-+        /*
-+         * Legacy flow:
-+         * Terminal address is part of the process group structure
-+         */
-+        retval = ia_css_terminal_set_buffer(
-+            terminal, buffer);
-+    } else if (process_group->protocol_version ==
-+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
-+        /*
-+         * PPG flow:
-+         * Terminal address is part of external buffer set structure
-+         */
-+        retval = ia_css_terminal_set_terminal_index(
-+            terminal, terminal_index);
-+    }
-+    verifexitval(retval == 0, EFAULT);
-+
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+        "\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
-+
-+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+        ia_css_frame_t *frame =
-+            ia_css_data_terminal_get_frame(
-+                (ia_css_data_terminal_t *)terminal);
-+        verifexitval(frame != NULL, EINVAL);
-+
-+        retval = ia_css_frame_set_buffer_state(frame, buffer_state);
-+        verifexitval(retval == 0, EINVAL);
-+    }
-+
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_attach_buffer invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_attach_buffer failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_vaddress_t ia_css_process_group_detach_buffer(
-+    ia_css_process_group_t *process_group,
-+    const unsigned int terminal_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    vied_vaddress_t buffer = VIED_NULL;
-+
-+    ia_css_terminal_t *terminal = NULL;
-+    ia_css_process_group_state_t state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_detach_buffer(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    terminal =
-+        ia_css_process_group_get_terminal(
-+                process_group, terminal_index);
-+    state = ia_css_process_group_get_state(process_group);
-+
-+    verifexitval(terminal != NULL, EINVAL);
-+    verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
-+
-+    buffer = ia_css_terminal_get_buffer(terminal);
-+
-+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+        ia_css_frame_t *frame =
-+            ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+        verifexitval(frame != NULL, EINVAL);
-+
-+        retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
-+        verifexitval(retval == 0, EINVAL);
-+    }
-+    ia_css_terminal_set_buffer(terminal, VIED_NULL);
-+
-+    retval = 0;
-+EXIT:
-+    /*
-+     * buffer pointer will appear on output,
-+     * regardless of subsequent fails to avoid memory leaks
-+     */
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_detach_buffer invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_detach_buffer failed (%i)\n",
-+            retval);
-+    }
-+    return buffer;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_attach_stream(
-+    ia_css_process_group_t *process_group,
-+    uint32_t stream,
-+    const ia_css_buffer_state_t buffer_state,
-+    const unsigned int terminal_index)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_attach_stream(): enter:\n");
-+
-+    NOT_USED(process_group);
-+    NOT_USED(stream);
-+    NOT_USED(buffer_state);
-+    NOT_USED(terminal_index);
-+
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_attach_stream failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_detach_stream(
-+    ia_css_process_group_t *process_group,
-+    const unsigned int terminal_index)
-+{
-+    int retval = -1;
-+    uint32_t stream = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_detach_stream(): enter:\n");
-+
-+    NOT_USED(process_group);
-+    NOT_USED(terminal_index);
-+
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_detach_stream failed (%i)\n",
-+            retval);
-+    }
-+    return stream;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_barrier(
-+    ia_css_process_group_t *process_group,
-+    const vied_nci_barrier_ID_t barrier_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    vied_nci_resource_bitmap_t bit_mask;
-+    vied_nci_resource_bitmap_t resource_bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_barrier(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    resource_bitmap =
-+        ia_css_process_group_get_resource_bitmap(process_group);
-+
-+    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
-+
-+    verifexitval(bit_mask != 0, EINVAL);
-+    verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
-+
-+    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
-+
-+    retval =
-+        ia_css_process_group_set_resource_bitmap(
-+            process_group, resource_bitmap);
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_barrier invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_barrier failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_clear_barrier(
-+    ia_css_process_group_t *process_group,
-+    const vied_nci_barrier_ID_t barrier_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_clear_barrier(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    resource_bitmap =
-+        ia_css_process_group_get_resource_bitmap(process_group);
-+
-+    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
-+
-+    verifexitval(bit_mask != 0, EINVAL);
-+    verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
-+
-+    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
-+
-+    retval =
-+        ia_css_process_group_set_resource_bitmap(
-+                process_group, resource_bitmap);
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_clear_barrier invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_clear_barrier failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_print(
-+    const ia_css_process_group_t *process_group,
-+    void *fid)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    int i;
-+
-+    uint8_t    process_count;
-+    uint8_t terminal_count;
-+    vied_vaddress_t ipu_vaddress = VIED_NULL;
-+    ia_css_rbm_t routing_bitmap;
-+
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_print(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
-+    verifexitval(retval == 0, EINVAL);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "=============== Process group print start ===============\n");
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\tipu_virtual_address = %x\n", ipu_vaddress);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\tsizeof(process_group) = %d\n",
-+        (int)ia_css_process_group_get_size(process_group));
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\tfragment_count = %d\n",
-+        (int)ia_css_process_group_get_fragment_count(process_group));
-+
-+    routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
-+    for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+            "\trouting_bitmap[index = %d] = 0x%X\n",
-+            i, (int)routing_bitmap.data[i]);
-+    }
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\tprogram_group(process_group) = %d\n",
-+        (int)ia_css_process_group_get_program_group_ID(process_group));
-+    process_count = ia_css_process_group_get_process_count(process_group);
-+    terminal_count =
-+        ia_css_process_group_get_terminal_count(process_group);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\t%d processes\n", (int)process_count);
-+    for (i = 0; i < (int)process_count; i++) {
-+        ia_css_process_t *process =
-+            ia_css_process_group_get_process(process_group, i);
-+
-+        retval = ia_css_process_print(process, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\t%d terminals\n", (int)terminal_count);
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_t *terminal =
-+            ia_css_process_group_get_terminal(process_group, i);
-+
-+        retval = ia_css_terminal_print(terminal, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "\terror_handling_enable = %u\n", process_group->error_handling_enable);
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "=============== Process group print end ===============\n");
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_print invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_process_group_valid(
-+    const ia_css_process_group_t *process_group,
-+    const ia_css_program_group_manifest_t *pg_manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    DECLARE_ERRVAL
-+    bool invalid_flag = false;
-+    uint8_t proc_idx;
-+    uint8_t proc_term_idx;
-+    uint8_t    process_count;
-+    uint8_t    program_count;
-+    uint8_t terminal_count;
-+    uint8_t man_terminal_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_process_group_valid(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    verifexitval(pg_manifest != NULL, EFAULT);
-+    NOT_USED(param);
-+
-+    process_count = process_group->process_count;
-+    terminal_count = process_group->terminal_count;
-+    program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
-+    man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
-+
-+    /* Validate process group */
-+    invalid_flag = invalid_flag ||
-+        !(program_count >= process_count) ||
-+        !(man_terminal_count >= terminal_count) ||
-+        !(process_group->size > process_group->processes_offset) ||
-+        !(process_group->size > process_group->terminals_offset);
-+
-+    /* Validate processes */
-+    for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
-+        const ia_css_process_t *process;
-+        ia_css_program_manifest_t *p_manifest = NULL;
-+        ia_css_program_ID_t prog_id;
-+        bool no_match_found = true;
-+
-+        process = ia_css_process_group_get_process(process_group, proc_idx);
-+        verifexitval(NULL != process, EFAULT);
-+        prog_id = ia_css_process_get_program_ID(process);
-+        p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
-+                                       ia_css_process_get_program_idx(process));
-+        verifexitval(NULL != p_manifest, EFAULT);
-+
-+        if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
-+            invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
-+            no_match_found = false;
-+        }
-+
-+        invalid_flag = invalid_flag || no_match_found;
-+    }
-+
-+    /* Validate terminals */
-+    for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
-+        int man_term_idx;
-+        const ia_css_terminal_t *terminal;
-+        const ia_css_terminal_manifest_t *terminal_manifest;
-+
-+        terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
-+        verifexitval(NULL != terminal, EFAULT);
-+        man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
-+        terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
-+
-+        invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_process_group_valid() invalid argument\n");
-+        return false;
-+    } else {
-+        return (!invalid_flag);
-+    }
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_process_group_submit(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    int i;
-+    bool can_submit = false;
-+    int retval = -1;
-+    uint8_t    terminal_count =
-+        ia_css_process_group_get_terminal_count(process_group);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_can_process_group_submit(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_t *terminal =
-+            ia_css_process_group_get_terminal(process_group, i);
-+        vied_vaddress_t buffer;
-+        ia_css_buffer_state_t buffer_state;
-+
-+        verifexitval(terminal != NULL, EINVAL);
-+
-+        if (process_group->protocol_version ==
-+            IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
-+            /*
-+             * For legacy pg flow, buffer addresses are contained inside
-+             * the process group structure, so these need to be validated
-+             * on process group submission.
-+             */
-+            buffer = ia_css_terminal_get_buffer(terminal);
-+            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+                "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
-+                i, (unsigned long int)terminal, buffer);
-+        }
-+
-+        /* buffer_state is applicable only for data terminals*/
-+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+            ia_css_frame_t *frame =
-+                ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+
-+            verifexitval(frame != NULL, EINVAL);
-+            buffer_state = ia_css_frame_get_buffer_state(frame);
-+            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
-+                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
-+                break;
-+            }
-+        } else if (
-+            (ia_css_is_terminal_parameter_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_program_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_program_control_init_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_spatial_parameter_terminal(
-+                terminal) != true)) {
-+            /* neither data nor parameter terminal, so error.*/
-+            break;
-+        }
-+
-+    }
-+    /* Only true if no check failed */
-+    can_submit = (i == terminal_count);
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_process_group_submit invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_process_group_submit failed (%i)\n",
-+            retval);
-+    }
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_can_process_group_submit(): leave:\n");
-+    return can_submit;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_enqueue_buffer_set(
-+    const ia_css_process_group_t *process_group,
-+    const ia_css_buffer_set_t *buffer_set)
-+{
-+    DECLARE_ERRVAL
-+    int i;
-+    bool can_enqueue = false;
-+    int retval = -1;
-+    uint8_t    terminal_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_can_enqueue_buffer_set(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    verifexitval(buffer_set != NULL, EFAULT);
-+
-+    terminal_count =
-+        ia_css_process_group_get_terminal_count(process_group);
-+
-+    /*
-+     * For ppg flow, buffer addresses are contained in the
-+     * external buffer set structure, so these need to be
-+     * validated before enqueueing.
-+     */
-+    verifexitval(process_group->protocol_version ==
-+        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
-+
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_t *terminal =
-+            ia_css_process_group_get_terminal(process_group, i);
-+        vied_vaddress_t buffer;
-+        ia_css_buffer_state_t buffer_state;
-+
-+        verifexitval(terminal != NULL, EINVAL);
-+
-+        buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
-+        IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+            "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
-+            i, (unsigned long int)terminal, buffer);
-+
-+        /* buffer_state is applicable only for data terminals*/
-+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+            ia_css_frame_t *frame =
-+                ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+
-+            verifexitval(frame != NULL, EINVAL);
-+            buffer_state = ia_css_frame_get_buffer_state(frame);
-+            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
-+                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
-+                break;
-+            }
-+        } else if (
-+            (ia_css_is_terminal_parameter_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_program_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_program_control_init_terminal(terminal)
-+                != true) &&
-+            (ia_css_is_terminal_spatial_parameter_terminal(
-+                terminal) != true)) {
-+            /* neither data nor parameter terminal, so error.*/
-+            break;
-+        }
-+    }
-+    /* Only true if no check failed */
-+    can_enqueue = (i == terminal_count);
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_enqueue_buffer_set invalid argument\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_enqueue_buffer_set failed (%i)\n",
-+            retval);
-+    }
-+    return can_enqueue;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_process_group_start(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    int i;
-+    bool can_start = false;
-+    int retval = -1;
-+    uint8_t    terminal_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_can_process_group_start(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    terminal_count =
-+        ia_css_process_group_get_terminal_count(process_group);
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_t *terminal =
-+            ia_css_process_group_get_terminal(process_group, i);
-+        ia_css_buffer_state_t buffer_state;
-+        bool ok = false;
-+
-+        verifexitval(terminal != NULL, EINVAL);
-+        if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+            /*
-+             * buffer_state is applicable only for data terminals
-+             */
-+            ia_css_frame_t *frame =
-+                ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+            bool is_input = ia_css_is_terminal_input(terminal);
-+            /*
-+             * check for NULL here.
-+             * then invoke next 2 statements
-+             */
-+            verifexitval(frame != NULL, EINVAL);
-+            IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
-+                "\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
-+                i, frame->buffer_state, frame->access_type,
-+                frame->data_bytes, frame->data);
-+            buffer_state = ia_css_frame_get_buffer_state(frame);
-+
-+            ok = ((is_input &&
-+                (buffer_state == IA_CSS_BUFFER_FULL)) ||
-+                    (!is_input && (buffer_state ==
-+                            IA_CSS_BUFFER_EMPTY)));
-+
-+        } else if (ia_css_is_terminal_parameter_terminal(terminal) ==
-+                true) {
-+            /*
-+             * FIXME:
-+             * is there any pre-requisite for param_terminal?
-+             */
-+            ok = true;
-+        } else if (ia_css_is_terminal_program_terminal(terminal) ==
-+                true) {
-+            ok = true;
-+        } else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
-+                true) {
-+            ok = true;
-+        } else if (ia_css_is_terminal_spatial_parameter_terminal(
-+                    terminal) == true) {
-+            ok = true;
-+        } else {
-+            /* neither data nor parameter terminal, so error.*/
-+            break;
-+        }
-+
-+        if (!ok)
-+            break;
-+    }
-+    /* Only true if no check failed */
-+    can_start = (i == terminal_count);
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_process_group_submit invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_can_process_group_start failed (%i)\n",
-+            retval);
-+    }
-+    return can_start;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_process_group_get_size(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    size_t size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_size(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    size = process_group->size;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_size invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_state_t ia_css_process_group_get_state(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_state(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    state = process_group->state;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_state invalid argument\n");
-+    }
-+    return state;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_group_get_kernel_bitmap(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    bitmap = process_group->kernel_bitmap;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
-+    }
-+    return bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    const ia_css_rbm_t *rbm = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_routing_bitmap(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    rbm = &(process_group->routing_bitmap);
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_routing_bitmap invalid argument\n");
-+    }
-+    return rbm;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_process_group_get_fragment_count(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint16_t fragment_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_fragment_count(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    fragment_count = process_group->fragment_count;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_count invalid argument\n");
-+    }
-+    return fragment_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_process_count(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t process_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_process_count(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    process_count = process_group->process_count;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_process_count invalid argument\n");
-+    }
-+    return process_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_terminal_count(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t terminal_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_terminal_count(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    terminal_count = process_group->terminal_count;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_terminal_count invalid argument\n");
-+    }
-+    return terminal_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_psys_server_init_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t psys_server_init_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    psys_server_init_cycles = process_group->psys_server_init_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
-+    }
-+    return psys_server_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_load_start_ts(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_load_start_ts = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_load_start_ts(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_load_start_ts = process_group->pg_load_start_ts;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_load_start_ts invalid argument\n");
-+    }
-+    return pg_load_start_ts;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_load_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_load_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_load_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_load_cycles = process_group->pg_load_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_load_cycles invalid argument\n");
-+    }
-+    return pg_load_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_init_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_init_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_init_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_init_cycles = process_group->pg_init_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_init_cycles invalid argument\n");
-+    }
-+    return pg_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_processing_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_processing_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_processing_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_processing_cycles = process_group->pg_processing_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_processing_cycles invalid argument\n");
-+    }
-+    return pg_processing_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_next_frame_init_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
-+    }
-+    return pg_next_frame_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_complete_cycles(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t pg_complete_cycles = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_pg_complete_cycles(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    pg_complete_cycles = process_group->pg_complete_cycles;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_pg_complete_cycles invalid argument\n");
-+    }
-+    return pg_complete_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
-+        const ia_css_process_group_t *process_group,
-+        const ia_css_terminal_type_t terminal_type)
-+{
-+    unsigned int proc_cnt;
-+    ia_css_terminal_t *terminal = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+            "ia_css_process_group_get_terminal_from_type(): enter:\n");
-+
-+    for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
-+        terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
-+        if (terminal == NULL) {
-+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+                    "ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
-+            goto EXIT;
-+        }
-+        if (ia_css_terminal_get_type(terminal) == terminal_type) {
-+            return terminal;
-+        }
-+        terminal = NULL; /* If not the expected type, return NULL */
-+    }
-+EXIT:
-+    return terminal;
-+}
-+
-+/* Returns the terminal or NULL if it was not found
-+   For some of those maybe valid to not exist at all in the process group */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
-+    const ia_css_process_group_t     *process_group,
-+    ia_css_terminal_type_t        term_type)
-+{
-+    int i, term_count;
-+
-+    assert(process_group != NULL);
-+
-+    /* Those below have at most one instance per process group */
-+    assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+        term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
-+        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
-+        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+
-+    term_count = ia_css_process_group_get_terminal_count(process_group);
-+
-+    for (i = 0; i < term_count; i++) {
-+        const ia_css_terminal_t    *terminal = ia_css_process_group_get_terminal(process_group, i);
-+
-+        if (ia_css_terminal_get_type(terminal) == term_type) {
-+            /* Only one parameter terminal per process group */
-+            return terminal;
-+        }
-+    }
-+
-+    return NULL;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
-+    const ia_css_process_group_t *process_grp,
-+    const unsigned int manifest_idx)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t i = 0;
-+    uint8_t terminal_count;
-+
-+    terminal_count =
-+        ia_css_process_group_get_terminal_count(process_grp);
-+
-+    for ( i = 0; i < terminal_count;
-+            i++) {
-+        unsigned int man_term_idx;
-+        ia_css_terminal_t *terminal;
-+
-+        terminal =
-+            ia_css_process_group_get_terminal(
-+                    process_grp, i);
-+        verifexitval(NULL != terminal, EFAULT);
-+        man_term_idx =
-+            ia_css_terminal_get_terminal_manifest_index(terminal);
-+        if (man_term_idx == manifest_idx)
-+            return terminal;
-+    }
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_manifest_idx_terminal Error\n");
-+    }
-+    return NULL;
-+
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_terminal(
-+    const ia_css_process_group_t *process_grp,
-+    const unsigned int terminal_num)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_t *terminal_ptr = NULL;
-+    uint16_t *terminal_offset_table;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_terminal(): enter:\n");
-+
-+    verifexitval(process_grp != NULL, EFAULT);
-+    verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
-+
-+    terminal_offset_table =
-+        (uint16_t *)((char *)process_grp +
-+                process_grp->terminals_offset);
-+    terminal_ptr =
-+        (ia_css_terminal_t *)((char *)process_grp +
-+                terminal_offset_table[terminal_num]);
-+
-+    verifexitval(terminal_ptr != NULL, EFAULT);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_terminal invalid argument\n");
-+    }
-+    return terminal_ptr;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_t *ia_css_process_group_get_process(
-+    const ia_css_process_group_t *process_grp,
-+    const unsigned int process_num)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_t *process_ptr = NULL;
-+    uint16_t *process_offset_table;
-+
-+    verifexitval(process_grp != NULL, EFAULT);
-+    verifexitval(process_num < process_grp->process_count, EINVAL);
-+
-+    process_offset_table =
-+        (uint16_t *)((char *)process_grp +
-+                process_grp->processes_offset);
-+    process_ptr =
-+        (ia_css_process_t *)((char *)process_grp +
-+                process_offset_table[process_num]);
-+
-+    verifexitval(process_ptr != NULL, EFAULT);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_process invalid argument\n");
-+    }
-+    return process_ptr;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_group_ID_t id = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_program_group_ID(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    id = process_group->ID;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_program_group_ID invalid argument\n");
-+    }
-+    return id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t resource_bitmap = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_resource_bitmap(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    resource_bitmap = process_group->resource_bitmap;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_resource_bitmap invalid argument\n");
-+    }
-+    return resource_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_resource_bitmap(
-+    ia_css_process_group_t *process_group,
-+    const vied_nci_resource_bitmap_t resource_bitmap)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_resource_bitmap(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    process_group->resource_bitmap = resource_bitmap;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_resource_bitmap failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_routing_bitmap(
-+    ia_css_process_group_t *process_group,
-+    const ia_css_rbm_t rbm)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_routing_bitmap(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    process_group->routing_bitmap = rbm;
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_routing_bitmap failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_compute_cycle_count(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t cycle_count = 0;
-+
-+    NOT_USED(manifest);
-+    NOT_USED(param);
-+
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(param != NULL, EFAULT);
-+
-+    cycle_count = 1;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_compute_cycle_count invalid argument\n");
-+    }
-+    return cycle_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_fragment_state(
-+    ia_css_process_group_t *process_group,
-+    uint16_t fragment_state)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_set_fragment_state(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
-+                process_group), EINVAL);
-+
-+    process_group->fragment_state = fragment_state;
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_fragment_state invalid argument process_group\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_fragment_state failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_get_fragment_state(
-+    const ia_css_process_group_t *process_group,
-+    uint16_t *fragment_state)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_fragment_state(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    verifexitval(fragment_state != NULL, EFAULT);
-+
-+    *fragment_state = process_group->fragment_state;
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_state invalid argument\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_fragment_state failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_get_ipu_vaddress(
-+    const ia_css_process_group_t *process_group,
-+    vied_vaddress_t *ipu_vaddress)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_ipu_vaddress(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+    verifexitval(ipu_vaddress != NULL, EFAULT);
-+
-+    *ipu_vaddress = process_group->ipu_virtual_address;
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_ipu_vaddress invalid argument\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_ipu_vaddress failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_ipu_vaddress(
-+    ia_css_process_group_t *process_group,
-+    vied_vaddress_t ipu_vaddress)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_ipu_vaddress(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    process_group->ipu_virtual_address = ipu_vaddress;
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_ipu_vaddress invalid argument\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_ipu_vaddress failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_protocol_version(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_protocol_version(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    protocol_version = process_group->protocol_version;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_protocol_version invalid argument\n");
-+    }
-+    return protocol_version;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_base_queue_id(
-+    ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_base_queue_id(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    queue_id = process_group->base_queue_id;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_base_queue_id invalid argument\n");
-+    }
-+    return queue_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_base_queue_id(
-+    ia_css_process_group_t *process_group,
-+    uint8_t queue_id)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_base_queue_id(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    /* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
-+    if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
-+        process_group->base_queue_id = queue_id;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
-+                       queue_id, (unsigned long int)process_group);
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_base_queue_id invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_num_queues(
-+    ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t num_queues = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_num_queues(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    num_queues = process_group->num_queues;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_num_queues invalid argument\n");
-+    }
-+    return num_queues;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_num_queues(
-+    ia_css_process_group_t *process_group,
-+    uint8_t num_queues)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_num_queues(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    process_group->num_queues = num_queues;
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_num_queues invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_error_handling_enable(
-+    ia_css_process_group_t *process_group,
-+    const bool error_handling_enable)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_error_handling_enable(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
-+    retval = 0;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_error_handling_enable invalid argument\n");
-+    }
-+
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_error_handling_enable(
-+    const ia_css_process_group_t *process_group)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t error_handling_enable = UINT8_MAX;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_error_handling_enable(): enter:\n");
-+
-+    verifexitval(process_group != NULL, EFAULT);
-+
-+    /* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
-+    assert(process_group->error_handling_enable <= (uint8_t)1);
-+    error_handling_enable = process_group->error_handling_enable;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_get_error_handling_enable invalid argument\n");
-+    }
-+
-+    return error_handling_enable;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
-+{
-+#if NUM_OF_VP_CELLS > 0
-+    bool has_vp = false;
-+#ifdef HAS_VP
-+    uint32_t i;
-+
-+    uint8_t process_count = ia_css_process_group_get_process_count(process_group);
-+
-+    for (i = 0; i < process_count; i++) {
-+        ia_css_process_t *process;
-+        vied_nci_cell_ID_t cell_id;
-+
-+        process = ia_css_process_group_get_process(process_group, i);
-+        cell_id = ia_css_process_get_cell(process);
-+
-+        if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
-+            has_vp = true;
-+            break;
-+        }
-+    }
-+#else /* not HAS_VP */
-+        NOT_USED(process_group);
-+#endif /* HAS_VP */
-+
-+    return has_vp;
-+#else
-+    NOT_USED(process_group);
-+    return false;
-+#endif
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
-new file mode 100644
-index 000000000000..de5719c70522
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
-@@ -0,0 +1,694 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_IMPL_H
-+
-+#include <ia_css_psys_process.h>
-+
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_program_manifest.h>
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_psys_process_private_types.h"
-+
-+/** Function only to be used in FW */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
-+{
-+    DECLARE_ERRVAL
-+    verifexitval(process != NULL, EFAULT);
-+    if (process->process_extension_offset != 0) {
-+        return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_get_extension invalid argument\n");
-+    }
-+    return NULL;
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
-+STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
-+{
-+    assert(index < IA_CSS_PROCESS_MAX_CELLS);
-+    return process->cells[index];
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
-+STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
-+{
-+    assert(index < IA_CSS_PROCESS_MAX_CELLS);
-+    process->cells[index] = cell_id;
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
-+STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
-+{
-+    int i;
-+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
-+    }
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_cell_ID_t ia_css_process_get_cell(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_cell_ID_t    cell_id = VIED_NCI_N_CELL_ID;
-+    int i = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_cell(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+    }
-+    cell_id = ia_css_process_cells_get_cell(process, 0);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_cell invalid argument\n");
-+    }
-+    return cell_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
-+    const ia_css_process_t        *process,
-+    const vied_nci_mem_type_ID_t    mem_type)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_ext_mem(): enter:\n");
-+
-+    verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_ext_mem invalid argument\n");
-+        return IA_CSS_PROCESS_INVALID_OFFSET;
-+    }
-+    return process_ext->ext_mem_id[mem_type];
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_get_program_idx(
-+    const ia_css_process_t        *process)
-+{
-+    DECLARE_ERRVAL
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_program_idx(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_program_idx invalid argument\n");
-+        return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
-+    }
-+    return process->program_idx;
-+}
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_dev_chn(
-+    const ia_css_process_t        *process,
-+    const vied_nci_dev_chn_ID_t    dev_chn_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_dev_chn(): enter:\n");
-+    verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_dev_chn(): invalid arguments\n");
-+        return IA_CSS_PROCESS_INVALID_OFFSET;
-+    }
-+    return process_ext->dev_chn_offset[dev_chn_id];
-+}
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
-+    const ia_css_process_t                *process,
-+    const vied_nci_mem_type_ID_t            mem_id)
-+{
-+    (void)process;
-+    (void)mem_id;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_get_int_mem_offset always returns 0"
-+        "(internally memory feature not used).\n");
-+    return 0;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
-+    const ia_css_process_t                *process,
-+    const vied_nci_mem_type_ID_t            mem_type_id)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_ext_mem_offset(): enter:\n");
-+
-+    verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+    if (noerror()) {
-+        ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_ext_mem_offset invalid argument\n");
-+    }
-+
-+    return ext_mem_offset;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_process_get_size(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_size(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+    if (noerror()) {
-+        size = process->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                   "ia_css_process_get_size invalid argument\n");
-+    }
-+
-+    return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_state_t ia_css_process_get_state(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_state_t    state = IA_CSS_N_PROCESS_STATES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_state(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+    if (noerror()) {
-+        state = (ia_css_process_state_t)process->state;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                   "ia_css_process_get_state invalid argument\n");
-+    }
-+
-+    return state;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_set_state(
-+    ia_css_process_t                    *process,
-+    ia_css_process_state_t                state)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_state(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+    assert(state <= UINT8_MAX);
-+    process->state = state;
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_state invalid argument\n");
-+    }
-+
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_cell_dependency_count(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t    cell_dependency_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_cell_dependency_count(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    cell_dependency_count = process->cell_dependency_count;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+        "ia_css_process_get_cell_dependency_count invalid argument\n");
-+    }
-+    return cell_dependency_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_terminal_dependency_count(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t    terminal_dependency_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_terminal_dependency_count(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    terminal_dependency_count = process->terminal_dependency_count;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_terminal_dependency_count invalid argument process\n");
-+    }
-+    return terminal_dependency_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_t *ia_css_process_get_parent(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_group_t    *parent = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_parent(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    if (process->parent_offset == 0) {
-+        return NULL;
-+    };
-+    parent =
-+    (ia_css_process_group_t *) ((char *)process + process->parent_offset);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_parent invalid argument process\n");
-+    }
-+    return parent;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_ID_t ia_css_process_get_program_ID(
-+    const ia_css_process_t                    *process)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_ID_t        id = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_program_ID(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+    id = process->ID;
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_get_program_ID invalid argument process\n");
-+    }
-+    return id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
-+    const ia_css_process_t *process,
-+    const unsigned int cell_num)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_id_t cell_dependency =
-+        IA_CSS_PROCESS_INVALID_DEPENDENCY;
-+    vied_nci_resource_id_t *cell_dep_ptr = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_get_cell_dependency(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    verifexitval(cell_num < process->cell_dependency_count, EFAULT);
-+
-+    cell_dep_ptr =
-+        (vied_nci_resource_id_t *)
-+        ((char *)process + process->cell_dependencies_offset);
-+    cell_dependency = *(cell_dep_ptr + cell_num);
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+               "ia_css_process_get_cell_dependency invalid argument\n");
-+    }
-+    return cell_dependency;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_terminal_dependency(
-+    const ia_css_process_t                    *process,
-+    const unsigned int                    terminal_num)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t *ter_dep_ptr = NULL;
-+    uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
-+
-+    verifexitval(process != NULL, EFAULT);
-+    verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
-+
-+    ter_dep_ptr = (uint8_t *) ((char *)process +
-+                   process->terminal_dependencies_offset);
-+
-+    ter_dep = *(ter_dep_ptr + terminal_num);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+               "ia_css_process_get_terminal_dependency invalid argument\n");
-+    }
-+    return ter_dep;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
-+    const ia_css_process_t *process)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t bitmap = 0;
-+    vied_nci_cell_ID_t cell_id;
-+    int i = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_cell_bitmap(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+
-+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        cell_id = ia_css_process_cells_get_cell(process, i);
-+        if (VIED_NCI_N_CELL_ID != cell_id) {
-+            bitmap |= (1 << cell_id);
-+        }
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_get_cells_bitmap invalid argument process\n");
-+    }
-+
-+    return bitmap;
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
-+    ia_css_process_t *process)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t *p_bitmap = NULL;
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return NULL;
-+    }
-+
-+    p_bitmap = &process_ext->dfm_port_bitmap[0];
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+    }
-+
-+    return p_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
-+    ia_css_process_t *process)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t *p_bitmap = NULL;
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return NULL;
-+    }
-+
-+    p_bitmap = &process_ext->dfm_active_port_bitmap[0];
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+    }
-+
-+    return p_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
-+    const ia_css_process_t *process,
-+    vied_nci_dev_dfm_id_t  dfm_res_id)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t bitmap = 0;
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return 0;
-+    }
-+    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+    bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+    }
-+
-+    return bitmap;
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
-+    const ia_css_process_t *process,
-+    vied_nci_dev_dfm_id_t  dfm_res_id)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t bitmap = 0;
-+    ia_css_process_ext_t *process_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
-+
-+    verifexitval(process != NULL, EFAULT);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return 0;
-+    }
-+#if HAS_DFM
-+    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+    bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
-+#else
-+    NOT_USED(dfm_res_id);
-+#endif
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+         "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
-+    }
-+    return bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_process_valid(
-+    const ia_css_process_t        *process,
-+    const ia_css_program_manifest_t    *p_manifest)
-+{
-+    DECLARE_ERRVAL
-+    bool invalid_flag = false;
-+    ia_css_program_ID_t prog_id;
-+
-+    verifexitval(NULL != process, EFAULT);
-+    verifexitval(NULL != p_manifest, EFAULT);
-+
-+    prog_id = ia_css_process_get_program_ID(process);
-+    verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
-+
-+    invalid_flag = (process->size <= process->cell_dependencies_offset) ||
-+           (process->size <= process->terminal_dependencies_offset);
-+
-+    if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
-+        vied_nci_cell_ID_t cell_id;
-+
-+        cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
-+        invalid_flag = invalid_flag ||
-+                (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
-+    }
-+    invalid_flag = invalid_flag ||
-+        ((process->cell_dependency_count +
-+          process->terminal_dependency_count) == 0) ||
-+        (process->cell_dependency_count !=
-+    ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
-+        (process->terminal_dependency_count !=
-+    ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
-+
-+    /* TODO: to be removed once all PGs pass validation */
-+    if (invalid_flag == true) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+            "ia_css_is_process_valid(): false\n");
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_process_valid() invalid argument\n");
-+        return false;
-+    } else {
-+        return (!invalid_flag);
-+    }
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_cmd(
-+    ia_css_process_t                    *process,
-+    const ia_css_process_cmd_t                cmd)
-+{
-+    int    retval = -1;
-+    ia_css_process_state_t    state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
-+
-+    verifexit(process != NULL);
-+
-+    state = ia_css_process_get_state(process);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
-+
-+    verifexit(state != IA_CSS_PROCESS_ERROR);
-+    verifexit(state < IA_CSS_N_PROCESS_STATES);
-+
-+    switch (cmd) {
-+    case IA_CSS_PROCESS_CMD_NOP:
-+        break;
-+    case IA_CSS_PROCESS_CMD_ACQUIRE:
-+        verifexit(state == IA_CSS_PROCESS_READY);
-+        break;
-+    case IA_CSS_PROCESS_CMD_RELEASE:
-+        verifexit(state == IA_CSS_PROCESS_READY);
-+        break;
-+    case IA_CSS_PROCESS_CMD_START:
-+        verifexit((state == IA_CSS_PROCESS_READY)
-+              || (state == IA_CSS_PROCESS_STOPPED));
-+        process->state = IA_CSS_PROCESS_STARTED;
-+        break;
-+    case IA_CSS_PROCESS_CMD_LOAD:
-+        verifexit((state == IA_CSS_PROCESS_STARTED)
-+                || (state == IA_CSS_PROCESS_READY)
-+                || (state == IA_CSS_PROCESS_STOPPED));
-+        process->state = IA_CSS_PROCESS_RUNNING;
-+        break;
-+    case IA_CSS_PROCESS_CMD_STOP:
-+        verifexit((state == IA_CSS_PROCESS_RUNNING)
-+              || (state == IA_CSS_PROCESS_SUSPENDED));
-+        process->state = IA_CSS_PROCESS_STOPPED;
-+        break;
-+    case IA_CSS_PROCESS_CMD_SUSPEND:
-+        verifexit(state == IA_CSS_PROCESS_RUNNING);
-+        process->state = IA_CSS_PROCESS_SUSPENDED;
-+        break;
-+    case IA_CSS_PROCESS_CMD_RESUME:
-+        verifexit(state == IA_CSS_PROCESS_SUSPENDED);
-+        process->state = IA_CSS_PROCESS_RUNNING;
-+        break;
-+    case IA_CSS_N_PROCESS_CMDS:    /* Fall through */
-+    default:
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
-+        goto EXIT;
-+    }
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_cmd invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_cmd failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
-new file mode 100644
-index 000000000000..e2252295212e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
-@@ -0,0 +1,135 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
-+#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
-+
-+#include "ia_css_psys_process_types.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+#define    N_UINT32_IN_PROCESS_STRUCT                0
-+#define    N_UINT16_IN_PROCESS_STRUCT                1
-+#define    N_UINT8_IN_PROCESS_STRUCT                8
-+
-+#if IA_CSS_PROCESS_STATE_BITS != 8
-+#error IA_CSS_PROCESS_STATE_BITS expected to be 8
-+#endif
-+
-+#define SIZE_OF_PROCESS_EXTENSION \
-+     ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
-+    + (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
-+    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
-+    + (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
-+
-+/** Extended process attributes describing more resource requirements
-+ *  (and some DFM handling details ) beyond those covered in
-+ *  ia_css_process_s.
-+ */
-+struct ia_css_process_ext_s {
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+    /** DFM port allocated to this process */
-+    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+    /** Active DFM ports which need a kick */
-+    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+    /** (external) Memory allocation offset given to this process */
-+    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+    /** Device channel allocation offset given to this process */
-+    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+    /** (external) Memory ID */
-+    vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
-+    /** Number of processes (mapped on cells) this process depends on */
-+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
-+#endif
-+};
-+
-+#define SIZE_OF_PROCESS_STRUCT_BITS \
-+    ((N_UINT32_IN_PROCESS_STRUCT * 32) \
-+    + (IA_CSS_PROGRAM_ID_BITS) \
-+    + (N_UINT16_IN_PROCESS_STRUCT * 16) \
-+    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
-+    + (N_UINT8_IN_PROCESS_STRUCT * 8) \
-+    + ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
-+
-+/** Process attributes describing the instantiation of a single Program
-+ *  within a Program Group.
-+ */
-+struct ia_css_process_s {
-+    /** Reference to the containing process group */
-+    int16_t parent_offset;
-+    /** Size of this structure */
-+    uint8_t size;
-+    /** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
-+     *  of the cells that provide input to this process.
-+     *  Align to 64 bit boundary.
-+     *  Set to zero if dependency_count is zero.
-+     *  @see cell_dependency_count in this structure */
-+    uint8_t cell_dependencies_offset;
-+    /** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
-+     *  of connected terminals (that is, the terminals that are associated with this process).
-+     *  Each index is a key into to the process group terminal list.
-+     *  Set to zero if dependency_count is zero.
-+     *  @see terminal_dependency_count in this structure
-+     *  @see ia_css_process_group_get_terminal() */
-+    uint8_t terminal_dependencies_offset;
-+    /** Offset in bytes to process extension structure, ia_css_process_ext_s
-+     *  Align to 32 bit boundary.
-+     *  Set to zero if extension is not used. The manifest must be queried to
-+     *  find out if the extensino is necessary.
-+     *  @see ia_css_program_manifest_process_requires_extension() */
-+    uint8_t process_extension_offset;
-+    /** Referal ID to a specific program.  This ID is unique across PG's and
-+     *  can be used to retreive program meta data (AKA "program descriptor")
-+     *  from the client package, including the program manifest and even
-+     *  firmware program code, if the program is to be executed on a DSP. */
-+    ia_css_program_ID_t ID;
-+    /** Program index into the list of programs in the containing PG */
-+    uint8_t program_idx;
-+    /** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
-+     *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
-+     *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
-+     *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
-+    uint8_t state;
-+    /** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
-+    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
-+    /** Size of the array of dependent cells pointed at by cell_dependencies_offset
-+     *  Value must be set to the corresponding value from the manifest entry for this program.
-+     *  As each program implies a cell (logically, if not physically) to execute the program,
-+     *  the dependent cell count value in the process is the same as the dependent program count.
-+     *  @see ia_css_program_manifest_get_program_dependency_count() */
-+    uint8_t cell_dependency_count;
-+    /** Number of terminals this process depends on.  This is the size of the array
-+     *  pointed at by terminal_dependencies_offset
-+     *  Value must be set to the corresponding value from the manifest entry for this program.
-+     *  @see ia_css_program_manifest_get_terminal_dependency_count()
-+     */
-+    uint8_t terminal_dependency_count;
-+#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
-+    /** Padding bytes for 64bit alignment*/
-+    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
-+#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
-+};
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
-new file mode 100644
-index 000000000000..748db439fd8e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
-@@ -0,0 +1,98 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
-+#define __IA_CSS_PSYS_PROCESS_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_types.h
-+ *
-+ * The types belonging to the terminal/process/process group dynamic module
-+ */
-+
-+#include <type_support.h>
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
-+
-+/* private */
-+typedef enum ia_css_process_group_cmd {
-+    IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
-+    IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
-+    IA_CSS_PROCESS_GROUP_CMD_ATTACH,
-+    IA_CSS_PROCESS_GROUP_CMD_DETACH,
-+    IA_CSS_PROCESS_GROUP_CMD_START,
-+    IA_CSS_PROCESS_GROUP_CMD_DISOWN,
-+    IA_CSS_PROCESS_GROUP_CMD_RUN,
-+    IA_CSS_PROCESS_GROUP_CMD_STOP,
-+    IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
-+    IA_CSS_PROCESS_GROUP_CMD_RESUME,
-+    IA_CSS_PROCESS_GROUP_CMD_ABORT,
-+    IA_CSS_PROCESS_GROUP_CMD_RESET,
-+    IA_CSS_N_PROCESS_GROUP_CMDS
-+} ia_css_process_group_cmd_t;
-+
-+/* private */
-+#define IA_CSS_PROCESS_GROUP_STATE_BITS    32
-+typedef enum ia_css_process_group_state {
-+    IA_CSS_PROCESS_GROUP_ERROR = 0,
-+    IA_CSS_PROCESS_GROUP_CREATED,
-+    IA_CSS_PROCESS_GROUP_READY,
-+    IA_CSS_PROCESS_GROUP_BLOCKED,
-+    IA_CSS_PROCESS_GROUP_STARTED,
-+    IA_CSS_PROCESS_GROUP_RUNNING,
-+    IA_CSS_PROCESS_GROUP_STALLED,
-+    IA_CSS_PROCESS_GROUP_STOPPED,
-+    IA_CSS_N_PROCESS_GROUP_STATES
-+} ia_css_process_group_state_t;
-+
-+/* private */
-+typedef enum ia_css_process_cmd {
-+    IA_CSS_PROCESS_CMD_NOP = 0,
-+    IA_CSS_PROCESS_CMD_ACQUIRE,
-+    IA_CSS_PROCESS_CMD_RELEASE,
-+    IA_CSS_PROCESS_CMD_START,
-+    IA_CSS_PROCESS_CMD_LOAD,
-+    IA_CSS_PROCESS_CMD_STOP,
-+    IA_CSS_PROCESS_CMD_SUSPEND,
-+    IA_CSS_PROCESS_CMD_RESUME,
-+    IA_CSS_N_PROCESS_CMDS
-+} ia_css_process_cmd_t;
-+
-+/* private */
-+#define IA_CSS_PROCESS_STATE_BITS    8
-+typedef enum ia_css_process_state {
-+    IA_CSS_PROCESS_ERROR = 0,
-+    IA_CSS_PROCESS_CREATED,
-+    IA_CSS_PROCESS_READY,
-+    IA_CSS_PROCESS_STARTED,
-+    IA_CSS_PROCESS_RUNNING,
-+    IA_CSS_PROCESS_STOPPED,
-+    IA_CSS_PROCESS_SUSPENDED,
-+    IA_CSS_N_PROCESS_STATES
-+} ia_css_process_state_t;
-+
-+/* public */
-+typedef struct ia_css_process_group_s    ia_css_process_group_t;
-+typedef struct ia_css_process_s        ia_css_process_t;
-+typedef struct ia_css_process_ext_s    ia_css_process_ext_t;
-+
-+typedef struct ia_css_data_terminal_s    ia_css_data_terminal_t;
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
-new file mode 100644
-index 000000000000..9a06e995aa88
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
-@@ -0,0 +1,320 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
-+
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.h
-+ *
-+ * Define the methods on the program group manifest object that are not part of
-+ * a single interface.
-+ *
-+ * Set functions in this file are for not for production use by the
-+ * users (testing/simulation only).
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>            /* uint8_t */
-+
-+#include <ia_css_psys_program_group_manifest.sim.h>
-+
-+#include <ia_css_psys_program_group_manifest.hsys.user.h>
-+
-+#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT        ((uint8_t)(-1))
-+
-+/*! Get the stored size of the program group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_program_group_manifest_get_size(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the program group ID of the program group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_ID_t
-+ia_css_program_group_manifest_get_program_group_ID(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the program group ID of the program group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @param program group ID
-+
-+ @return 0 on success, -1 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_program_group_manifest_set_program_group_ID(
-+    ia_css_program_group_manifest_t *manifest,
-+    ia_css_program_group_ID_t id);
-+
-+/*! Get the storage alignment constraint of the program group binary data
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
-+    argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_alignment(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the storage alignment constraint of the program group binary data
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    alignment[in]            alignment desired
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_program_group_manifest_set_alignment(
-+    ia_css_program_group_manifest_t *manifest,
-+    const uint8_t alignment);
-+
-+/*! Get the kernel enable bitmap of the program group
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return bitmap, 0 on invalid manifest argument
-+ */
-+extern ia_css_kernel_bitmap_t
-+ia_css_program_group_manifest_get_kernel_bitmap(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the kernel enable bitmap of the program group
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    kernel bitmap[in]        kernel enable bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_group_manifest_set_kernel_bitmap(
-+    ia_css_program_group_manifest_t *manifest,
-+    const ia_css_kernel_bitmap_t bitmap);
-+
-+/*! Get the number of programs in the program group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return program count, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_program_count(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the number of terminals in the program group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return terminal count, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_terminal_count(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) private data blob in the manifest
-+
-+  Private data is used by FW and is opauque to the SW stack
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return private data blob, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+void *ia_css_program_group_manifest_get_private_data(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) routing bitmap (rbm) manifest
-+
-+ @param    manifest[in]            program group manifest object
-+
-+ @return rbm manifest, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_rbm_manifest_t *
-+ia_css_program_group_manifest_get_rbm_manifest(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) indexed program manifest in the program group manifest
-+ * object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the program manifest object
-+
-+ @return program manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_manifest_t *
-+ia_css_program_group_manifest_get_prgrm_mnfst(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int program_index);
-+
-+/*! Get the (pointer to) indexed terminal manifest in the program group
-+ * manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the terminal manifest object
-+
-+ @return terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_manifest_t *
-+ia_css_program_group_manifest_get_term_mnfst(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed data terminal manifest in the program group
-+ * manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the terminal manifest object
-+
-+ @return data terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_data_terminal_manifest_t *
-+ia_css_program_group_manifest_get_data_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed parameter terminal manifest in the program
-+ * group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the terminal manifest object
-+
-+ @return parameter terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed spatial param terminal manifest in the program
-+ * group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the terminal manifest object
-+
-+ @return spatial param terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_spatial_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed sliced param terminal manifest in the program
-+ * group manifest object
-+
-+ @param    manifest[in]            program group manifest object
-+ @param    program_index[in]        index of the terminal manifest object
-+
-+ @return sliced param terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_sliced_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed program terminal manifest in the program group
-+ * manifest object
-+
-+ @parammanifest[in]program group manifest object
-+ @paramprogram_index[in]index of the terminal manifest object
-+
-+ @return program terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_terminal_manifest_t *
-+ia_css_program_group_manifest_get_program_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index);
-+
-+/*!    initialize program group manifest
-+
-+ @param    manifest[in]        program group manifest object
-+ @param    program_count[in]    number of programs.
-+ @param    terminal_count[in]    number of terminals.
-+ @param program_needs_extension[in] Array[program count]
-+ @param    program_deps[in]    program dependencies for programs in pg.
-+ @param    terminal_deps[in]    terminal dependencies for programs in pg.
-+ @param    terminal_type[in]    array of terminal types, binary specific
-+                static frame data
-+ @param    cached_in_param_section_count[in]Number of parameter terminal sections
-+ @param cached_out_param_section_count[in]    Number of parameter out terminal
-+ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
-+                        with sections per cached out
-+                        terminal
-+ @param sliced_in_param_section_count[in]    Array[sliced_in_terminal_count]
-+                        with sections per sliced in
-+                        terminal
-+ @param sliced_out_param_section_count[in]    Array[sliced_out_terminal_count]
-+                        with sections per sliced out
-+                        terminal
-+ @param    fragment_param_section_count[in]    Number of fragment parameter
-+                        sections of the program init
-+                        terminal,
-+ @param    kernel_fragment_seq_count[in]        Number of kernel fragment
-+                        seqence info.
-+ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
-+                        sections (size of array is program_count)
-+ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
-+                        sections (size of array is program_count)
-+ @return none;
-+ */
-+extern void ia_css_program_group_manifest_init(
-+    ia_css_program_group_manifest_t *blob,
-+    const uint8_t program_count,
-+    const uint8_t terminal_count,
-+    const uint8_t *program_needs_extension,
-+    const uint8_t *program_dependencies,
-+    const uint8_t *terminal_dependencies,
-+    const ia_css_terminal_type_t *terminal_type,
-+    const uint16_t *cached_in_param_section_count,
-+    const uint16_t *cached_out_param_section_count,
-+    const uint16_t *spatial_param_section_count,
-+    const uint16_t *fragment_param_section_count,
-+    const uint16_t *sliced_in_param_section_count,
-+    const uint16_t *sliced_out_param_section_count,
-+    const uint16_t *kernel_fragment_seq_count,
-+    const uint16_t *progctrlinit_load_section_counts,
-+    const uint16_t *progctrlinit_connect_section_counts);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_group_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..dc79168a38d7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.hsys.user.h
-+ *
-+ * Define the methods on the program group manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>    /* bool */
-+
-+/*! Print the program group manifest object to file/stream
-+    in textual format
-+
-+ @param    manifest[in]        program group manifest object
-+ @param    fid[out]        file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_manifest_print(
-+    const ia_css_program_group_manifest_t *manifest,
-+    void *fid);
-+
-+/*! Read the program group manifest object from file/stream
-+  in binary format.
-+
-+ @see ia_css_program_group_manifest_write()
-+
-+ @param    fid[in]            file/stream handle
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
-+    void *fid);
-+
-+/*! Write the program group manifest object to file/stream
-+  in binary format
-+
-+ @see ia_css_program_group_manifest_read()
-+
-+ @param    manifest[in]        program group manifest object
-+ @param    fid[out]        file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_manifest_write(
-+    const ia_css_program_group_manifest_t *manifest,
-+    void *fid);
-+
-+/*! Boolean test if the program group manifest is valid
-+
-+ @param    manifest[in]        program group manifest
-+
-+ @return true if program group manifest is correct, false on error
-+ */
-+extern bool ia_css_is_program_group_manifest_valid(
-+    const ia_css_program_group_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
-new file mode 100644
-index 000000000000..98d6a0235f3d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
-@@ -0,0 +1,131 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.sim.h
-+ *
-+ * Define the methods on the program group manifest object: Simulation only
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>    /* uint8_t */
-+#include "ia_css_terminal_defs.h"
-+
-+/*! Create a program group manifest object from specification
-+
-+ @param    specification[in]        specification (index)
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
-+    const unsigned int specification);
-+
-+/*! Destroy the program group manifest object
-+
-+ @param    manifest[in]            program group manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
-+    ia_css_program_group_manifest_t            *manifest);
-+
-+/*! Compute the size of storage required for allocating
-+ * the program group (PG) manifest object
-+
-+ @param    program_count[in]            Number of programs in the PG
-+ @param    terminal_count[in]            Number of terminals on the PG
-+ @param program_needs_extension[in]        Array[program count]
-+ @param    program_dependency_count[in]        Array[program_count] with the PG
-+ @param    terminal_dependency_count[in]        Array[program_count] with the
-+                        terminal dependencies
-+ @param    terminal_type[in]            Array[terminal_count] with the
-+                        terminal type
-+ @param    cached_in_param_section_count[in]    Number of parameter
-+                        in terminal sections
-+ @param    cached_out_param_section_count[in]    Number of parameter
-+                        out terminal sections
-+ @param    sliced_param_section_count[in]        Array[sliced_terminal_count]
-+                        with sections per
-+                        sliced in terminal
-+ @param    sliced_out_param_section_count[in]    Array[sliced_terminal_count]
-+                        with sections per
-+                        sliced out terminal
-+ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
-+                        with sections per
-+                        spatial terminal
-+ @param    fragment_param_section_count[in]    Number of fragment parameter
-+                        sections of the
-+                        program init terminal,
-+ @param    kernel_fragment_seq_count[in]        Number of
-+                        kernel_fragment_seq_count.
-+ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
-+                        sections (size of array is program_count)
-+ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
-+                        sections (size of array is program_count)
-+ @return 0 on error
-+ */
-+size_t ia_css_sizeof_program_group_manifest(
-+    const uint8_t            program_count,
-+    const uint8_t            terminal_count,
-+    const uint8_t            *program_needs_extension,
-+    const uint8_t            *program_dependency_count,
-+    const uint8_t            *terminal_dependency_count,
-+    const ia_css_terminal_type_t    *terminal_type,
-+    const uint16_t            *cached_in_param_section_count,
-+    const uint16_t            *cached_out_param_section_count,
-+    const uint16_t            *spatial_param_section_count,
-+    const uint16_t            *fragment_param_section_count,
-+    const uint16_t            *sliced_param_section_count,
-+    const uint16_t            *sliced_out_param_section_count,
-+    const uint16_t            *kernel_fragment_seq_count,
-+    const uint16_t            *progctrlinit_load_section_counts,
-+    const uint16_t            *progctrlinit_connect_section_counts);
-+
-+/*! Create (the storage for) the program group manifest object
-+
-+ @param    program_count[in]        Number of programs in the program group
-+ @param    terminal_count[in]        Number of terminals on the program group
-+ @param    program_dependency_count[in]    Array[program_count] with the
-+                    program dependencies
-+ @param    terminal_dependency_count[in]    Array[program_count] with the
-+                    terminal dependencies
-+ @param    terminal_type[in]        Array[terminal_count] with the
-+                    terminal type
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
-+    const uint8_t            program_count,
-+    const uint8_t            terminal_count,
-+    const uint8_t            *program_dependency_count,
-+    const uint8_t            *terminal_dependency_count,
-+    const ia_css_terminal_type_t    *terminal_type);
-+
-+/*! Free (the storage of) the program group manifest object
-+
-+ @param    manifest[in]            program group manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
-+    ia_css_program_group_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
-new file mode 100644
-index 000000000000..e86ff93995e6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
-@@ -0,0 +1,417 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_kernel_bitmap.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_psys_private_pg_data.h"
-+#include <vied_nci_psys_system_global.h>    /* Safer bit mask functions */
-+#include "ia_css_psys_static_trace.h"
-+#include "ia_css_rbm_manifest_types.h"
-+#include <error_support.h>
-+#include <assert_support.h>
-+#include <misc_support.h>
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_program_group_manifest_get_size(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    size_t size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_size(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        size = manifest->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_size invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_ID_t
-+ia_css_program_group_manifest_get_program_group_ID(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        id = manifest->ID;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
-+    }
-+    return id;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_program_group_manifest_set_program_group_ID(
-+    ia_css_program_group_manifest_t *manifest,
-+    ia_css_program_group_ID_t id)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->ID = id;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_program_group_manifest_set_alignment(
-+    ia_css_program_group_manifest_t *manifest,
-+    const uint8_t alignment)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_set_alignment(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->alignment = alignment;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_set_alignment invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_alignment(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    uint8_t alignment = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_alignment(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        alignment = manifest->alignment;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_alignment invalid argument\n");
-+    }
-+    return alignment;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+void *ia_css_program_group_manifest_get_private_data(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    void *private_data = NULL;
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_private_data(%p): enter:\n",
-+        manifest);
-+
-+    verifexit(manifest != NULL);
-+
-+    private_data = (void *)((const char *)manifest +
-+                manifest->private_data_offset);
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_private_data invalid argument\n");
-+    }
-+    return private_data;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    ia_css_rbm_manifest_t *rbm_manifest = NULL;
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
-+        manifest);
-+
-+    verifexit(manifest != NULL);
-+
-+    rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
-+                manifest->rbm_manifest_offset);
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
-+    }
-+    return rbm_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_manifest_t *
-+ia_css_program_group_manifest_get_prgrm_mnfst(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int program_index)
-+{
-+    ia_css_program_manifest_t *prg_manifest_base;
-+    uint8_t *program_manifest = NULL;
-+    uint8_t program_count;
-+    unsigned int i;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
-+        manifest, program_index);
-+
-+    program_count =
-+        ia_css_program_group_manifest_get_program_count(manifest);
-+
-+    verifexit(manifest != NULL);
-+    verifexit(program_index < program_count);
-+
-+    prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
-+        manifest->program_manifest_offset);
-+    if (program_index < program_count) {
-+        program_manifest = (uint8_t *)prg_manifest_base;
-+        for (i = 0; i < program_index; i++) {
-+            program_manifest += ((ia_css_program_manifest_t *)
-+                    program_manifest)->size;
-+        }
-+    }
-+
-+EXIT:
-+    if (NULL == manifest || program_index >= program_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
-+    }
-+    return (ia_css_program_manifest_t *)program_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_data_terminal_manifest_t *
-+ia_css_program_group_manifest_get_data_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    terminal_manifest =
-+        ia_css_program_group_manifest_get_term_mnfst(manifest,
-+            terminal_index);
-+
-+    verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
-+
-+    data_terminal_manifest =
-+        (ia_css_data_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+    return data_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    terminal_manifest =
-+        ia_css_program_group_manifest_get_term_mnfst(manifest,
-+            terminal_index);
-+
-+    verifexit(ia_css_is_terminal_manifest_parameter_terminal(
-+            terminal_manifest));
-+    param_terminal_manifest =
-+        (ia_css_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+    return param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_spatial_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_spatial_param_terminal_manifest_t *
-+        spatial_param_terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    terminal_manifest =
-+        ia_css_program_group_manifest_get_term_mnfst(manifest,
-+            terminal_index);
-+
-+    verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+            terminal_manifest));
-+
-+    spatial_param_terminal_manifest =
-+        (ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+    return spatial_param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_sliced_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_sliced_param_terminal_manifest_t *
-+        sliced_param_terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    terminal_manifest =
-+        ia_css_program_group_manifest_get_term_mnfst(manifest,
-+            terminal_index);
-+
-+    verifexit(ia_css_is_terminal_manifest_sliced_terminal(
-+            terminal_manifest));
-+
-+    sliced_param_terminal_manifest =
-+        (ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+    return sliced_param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_terminal_manifest_t *
-+ia_css_program_group_manifest_get_program_terminal_manifest(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    terminal_manifest =
-+        ia_css_program_group_manifest_get_term_mnfst(manifest,
-+            terminal_index);
-+
-+    verifexit(ia_css_is_terminal_manifest_program_terminal(
-+            terminal_manifest));
-+
-+    program_terminal_manifest =
-+        (ia_css_program_terminal_manifest_t *)terminal_manifest;
-+ EXIT:
-+    return program_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_manifest_t *
-+ia_css_program_group_manifest_get_term_mnfst(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const unsigned int terminal_index)
-+{
-+    ia_css_terminal_manifest_t *terminal_manifest = NULL;
-+    ia_css_terminal_manifest_t *terminal_manifest_base;
-+    uint8_t terminal_count;
-+    uint8_t i = 0;
-+    uint32_t offset;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
-+        manifest, (int)terminal_index);
-+
-+    verifexit(manifest != NULL);
-+
-+    terminal_count =
-+        ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+    verifexit(terminal_index < terminal_count);
-+
-+    terminal_manifest_base =
-+        (ia_css_terminal_manifest_t *)((char *)manifest +
-+        manifest->terminal_manifest_offset);
-+    terminal_manifest = terminal_manifest_base;
-+    while (i < terminal_index) {
-+        offset =
-+        (uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
-+        terminal_manifest = (ia_css_terminal_manifest_t *)
-+                ((char *)terminal_manifest + offset);
-+        i++;
-+    }
-+EXIT:
-+    return terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_program_count(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    uint8_t program_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_program_count(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        program_count = manifest->program_count;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_program_count invalid argument\n");
-+    }
-+    return program_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_terminal_count(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    uint8_t terminal_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_terminal_count(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        terminal_count = manifest->terminal_count;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_terminal_count invalid argument\n");
-+    }
-+    return terminal_count;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
-new file mode 100644
-index 000000000000..04c826a3164b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
-@@ -0,0 +1,278 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
-+
-+#include "ia_css_psys_manifest_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_kernel_bitmap.h"
-+#include "ia_css_program_group_data.h"
-+#include "vied_nci_psys_resource_model.h"
-+#include "ia_css_rbm_manifest_types.h"
-+#include <type_support.h>
-+#include <math_support.h>
-+#include <platform_support.h>
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
-+    ((IA_CSS_KERNEL_BITMAP_BITS) \
-+    + (IA_CSS_PROGRAM_GROUP_ID_BITS) \
-+    + (5 * IA_CSS_UINT16_T_BITS) \
-+    + (5 * IA_CSS_UINT8_T_BITS) \
-+    + (5 * IA_CSS_UINT8_T_BITS))
-+
-+/** @brief Meta-data for a program group
-+ *
-+ * Describes the contents and layout of the program group
-+ * components in memory.
-+ *
-+ * Offsets are relative to the base address of the program group
-+ * manifest object.
-+ */
-+struct ia_css_program_group_manifest_s {
-+    /** Indicate kernels are present in this program group */
-+    ia_css_kernel_bitmap_t kernel_bitmap;
-+    /** Referral ID to program group FW */
-+    ia_css_program_group_ID_t ID;
-+    /** Offset to program manifest list.  One entry for each program. */
-+    uint16_t program_manifest_offset;
-+    /** Offset to terminal manifest list.  One entry for each terminal. */
-+    uint16_t terminal_manifest_offset;
-+    /** Offset to private data (not part of the official API) */
-+    uint16_t private_data_offset;
-+    /** Offset to RBM manifest */
-+    uint16_t rbm_manifest_offset;
-+    /** Size of this structure */
-+    uint16_t size;
-+    /** Storage alignment requirement (in uint8_t) */
-+    uint8_t alignment;
-+    /** Total number of kernels in this program group */
-+    uint8_t kernel_count;
-+    /** Total number of program in this program group */
-+    uint8_t program_count;
-+    /** Total number of terminals on this program group */
-+    uint8_t terminal_count;
-+    /** Total number of independent subgraphs in this program group */
-+    uint8_t subgraph_count;
-+    /** Padding; esnures that rbm_manifest starts on 64bit alignment */
-+    uint8_t reserved[5];
-+};
-+
-+#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
-+    ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
-+    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
-+    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
-+    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
-+    + (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
-+    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
-+
-+/** "Extended" meta-data for a single program
-+ *
-+ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
-+ */
-+struct ia_css_program_manifest_ext_s {
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+    /** DFM port allocation of this program */
-+    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+    /** Active DFM ports which need a kick
-+     * If an empty port is configured to run in active mode, the empty
-+     * port and the corresponding full port(s) in the stream must be kicked.
-+     * The empty port must always be kicked after the full port.
-+     */
-+    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+    /** (external) Memory allocation size needs of this program */
-+    vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+    /** Device channel allocation size needs of this program */
-+    vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
-+    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
-+#endif
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+    /** DFM ports are relocatable if value is set to 1.
-+     * The flag is per dfm port type.
-+     * This will not be supported for now.
-+     */
-+    uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+    /** DEC compression flush service entry, describing which streams
-+     *  require flush service handling for decompression (input).
-+     *  @note stream ID's are the ID's used by the MMU
-+     */
-+    uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
-+    /** Association of streams in dec_resources_input with the terminal
-+     *  they belong to.
-+     */
-+    uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
-+#endif
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+    /** DEC compression flush service entry, describing which streams
-+     *  require flush service handling for compression (output).
-+     *  @note stream ID's are the ID's used by the MMU
-+     */
-+    uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
-+    /** Association of streams in dec_resources_output with the terminal
-+     *  they belong to.
-+     */
-+    uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
-+#endif
-+/** Padding bytes for 32bit alignment*/
-+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
-+#endif
-+};
-+
-+#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
-+    (IA_CSS_KERNEL_BITMAP_BITS \
-+    + IA_CSS_PROGRAM_ID_BITS \
-+    + IA_CSS_PROGRAM_TYPE_BITS \
-+    + (1 * IA_CSS_UINT16_T_BITS) \
-+    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
-+    + (VIED_NCI_RESOURCE_ID_BITS) \
-+    + (6 * IA_CSS_UINT8_T_BITS) \
-+    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
-+
-+/** Meta-data for a single program
-+ *
-+ * This structure contains only the information required for resource
-+ * management and construction of the process group.
-+ */
-+struct ia_css_program_manifest_s {
-+    /** Indicate which kernels lead to this program being used */
-+    ia_css_kernel_bitmap_t kernel_bitmap;
-+    /** offset to add to reach parent. This is negative value.*/
-+    int16_t parent_offset;
-+    uint8_t program_dependency_offset;
-+    uint8_t terminal_dependency_offset;
-+    /** Size of this structure */
-+    uint8_t size;
-+    /** offset to ia_css_program_manifest_ext_s, 0 if there is none */
-+    uint8_t program_extension_offset;
-+    /** Specification of for exclusive or parallel programs */
-+    uint8_t program_type; /* ia_css_program_type_t */
-+    /** Referral ID to a specific program FW, valid ID's != 0 */
-+    ia_css_program_ID_t ID;
-+    /** Array of all the cells this program needs */
-+    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
-+    /** (exclusive) indication of a cell type to be used by this program */
-+    vied_nci_resource_id_t cell_type_id;
-+    /** Number of programs this program depends on */
-+    uint8_t program_dependency_count;
-+    /** Number of terminals this program depends on */
-+    uint8_t terminal_dependency_count;
-+    /** Padding bytes for 32bit alignment*/
-+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
-+#endif
-+};
-+
-+/*
-+ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
-+ */
-+#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    + IA_CSS_FRAME_FORMAT_BITMAP_BITS \
-+    + IA_CSS_CONNECTION_BITMAP_BITS \
-+    + IA_CSS_KERNEL_BITMAP_BITS \
-+    + (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
-+    + IA_CSS_UINT16_T_BITS \
-+    + IA_CSS_UINT8_T_BITS \
-+    + (4*IA_CSS_UINT8_T_BITS))
-+
-+/** Meta-data specific for a data terminal
-+ *
-+ * Contains mostly capability and constraints information
-+ */
-+struct ia_css_data_terminal_manifest_s {
-+    /** Data terminal base */
-+    ia_css_terminal_manifest_t base;
-+    /** Supported (4CC / MIPI / parameter) formats */
-+    ia_css_frame_format_bitmap_t frame_format_bitmap;
-+    /** Indicate which kernels lead to this terminal being used */
-+    ia_css_kernel_bitmap_t kernel_bitmap;
-+    /** Minimum size of the frame */
-+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
-+    /** Maximum size of the frame */
-+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
-+    /** Minimum size of a fragment that the program port can accept */
-+    uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
-+    /** Maximum size of a fragment that the program port can accept */
-+    uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
-+    /** Indicate if this terminal is derived from a principal terminal
-+     *  @note Can't find meaningful use of this field. */
-+    uint16_t terminal_dependency;
-+    /** Indicate what (streaming) interface types this terminal supports */
-+    ia_css_connection_bitmap_t connection_bitmap;
-+    /** Indicates if compression is supported on the data associated with
-+     * this terminal. '1' indicates compression is supported,
-+     * '0' otherwise
-+     */
-+    uint8_t compression_support;
-+    uint8_t reserved[4];
-+};
-+
-+/* ============  Program Control Init Terminal Manifest - START ============ */
-+#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
-+struct ia_css_program_control_init_manifest_program_desc_s {
-+    uint16_t load_section_count;
-+    uint16_t connect_section_count;
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
-+};
-+
-+#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
-+/** Meta-data specific for a program control init terminal
-+ *
-+ * Program control init terminals have parameters related
-+ * to system device (i.e. non-algorithmic devices, like DMA's)
-+ * configuration.
-+ */
-+struct ia_css_program_control_init_terminal_manifest_s {
-+    ia_css_terminal_manifest_t base;
-+    /** Number of programs in program group.  This terminal can contain
-+     * parameters for each program.  Also size of the array at program_desc_offset.
-+    */
-+    uint32_t program_count;
-+    /**
-+     * Points to array of ia_css_program_control_init_manifest_program_desc_t
-+     * with size program_count.  The descriptor describes the format of the
-+     * parameter payload, which is sent separately.
-+     */
-+    uint16_t program_desc_offset;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
-+};
-+/* ============  Program Control Init Terminal Manifest - END ============ */
-+
-+extern void ia_css_program_manifest_init(
-+    ia_css_program_manifest_t    *blob,
-+    const uint8_t    program_needs_extension,
-+    const uint8_t    program_dependency_count,
-+    const uint8_t    terminal_dependency_count);
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
-new file mode 100644
-index 000000000000..db426f95c3a4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
-@@ -0,0 +1,679 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.h
-+ *
-+ * Define the methods on the program manifest object that are not part of a
-+ * single interface.
-+ *
-+ * @note The "set" functions here are for testing simulation only.
-+ * Real manifests are generated in advance and must be considered read-only from
-+ * the production user's perspective.
-+ */
-+
-+#include "ia_css_psys_static_storage_class.h"
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>            /* uint8_t */
-+
-+#include <ia_css_psys_program_manifest.sim.h>
-+
-+#include <ia_css_psys_program_manifest.hsys.user.h>
-+
-+#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
-+
-+/*
-+ * Resources needs
-+ */
-+#include <ia_css_psys_program_manifest.hsys.kernel.h>
-+
-+#define IA_CSS_PROGRAM_INVALID_DEPENDENCY    ((uint8_t)(-1))
-+#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG    ((uint8_t)(-1))
-+
-+/** Retrieve extended manifest information generally not visible
-+ *  to the SW stack
-+ *
-+ *  @see ia_css_program_manifest_ext_t
-+ *  @note Function only to be used in FW
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
-+
-+/*! Check if the program manifest object specifies a fixed cell allocation
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return has_fixed_cell, false on invalid argument
-+ */
-+extern bool ia_css_has_program_manifest_fixed_cell(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the stored size of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_program_manifest_get_size(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the program ID of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Set the program ID of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @param program ID
-+
-+ @return 0 on success, -1 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_program_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    ia_css_program_ID_t id);
-+
-+/*! Get the (pointer to) the program *group* manifest which contains
-+ * this program manifest
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return the pointer to the parent, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Set the offset to the beginning of the program *group* manifest
-+ * which contains this program manifest
-+
-+ @param    manifest[in]            program manifest object
-+ @param    program_offset[in]        this program's offset from
-+                    program_group_manifest's base address.
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_parent_offset(
-+    ia_css_program_manifest_t            *manifest,
-+    int32_t program_offset);
-+
-+/*! Get the type of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
-+    argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_type_t ia_css_program_manifest_get_type(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Set the type of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+ @param    program_type[in]        program type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_type(
-+    ia_css_program_manifest_t            *manifest,
-+    const ia_css_program_type_t            program_type);
-+
-+/*! Set the cell id of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+ @param    program_cell_id[in]        program cell id
-+
-+ @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_program_manifest_set_cell_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_cell_ID_t            cell_id);
-+
-+/*! Set the cell type of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+ @param    program_cell_type[in]        program cell type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_cell_type_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_cell_type_ID_t            cell_type_id);
-+
-+/*!
-+ * Get input terminal id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ *
-+ * @return registered terminal_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_input_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                   idx);
-+
-+/*!
-+ * Get output terminal id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ *
-+ * @return registered terminal_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_output_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                    idx);
-+
-+/*!
-+ * Set output terminal id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ * @param    val[in]            value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_output_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    uint8_t                    idx,
-+    uint8_t                    val);
-+
-+/*!
-+ * Set input terminal id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ * @param    val[in]            value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_input_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    uint8_t                    idx,
-+    uint8_t                    val);
-+
-+/*!
-+ * Get compression input MMU stream id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ *
-+ * @return registered stream_id for idx
-+ */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_input_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                   idx);
-+
-+/*!
-+ * Get compression output MMU stream id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ *
-+ * @return registered stream_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_output_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                    idx);
-+
-+/*!
-+ * Set compression output MMU stream id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ * @param    val[in]            value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_output_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    uint8_t                    idx,
-+    uint8_t                    val);
-+
-+/*!
-+ * Set *compression* input MMU stream id [val] at [idx]
-+ *
-+ * @param    manifest[in]        program manifest object
-+ * @param    idx[in]            index
-+ * @param    val[in]            value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_input_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    uint8_t                    idx,
-+    uint8_t                    val);
-+
-+/*! Set cells bitmap for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    bitmap[in]                bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_cells_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_resource_bitmap_t    bitmap);
-+
-+/*! Get cells bitmap for the program
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Set DFM port bitmap for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+ @param    bitmap[in]                bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dfm_port_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id,
-+    const vied_nci_resource_bitmap_t    bitmap);
-+#if HAS_DFM
-+/*! Get bitmap of DFM ports requested for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+
-+ @return DFM port bitmap
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id);
-+#endif
-+
-+/*! Set active DFM port specification bitmap for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+ @param    bitmap[in]                bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id,
-+    const vied_nci_resource_bitmap_t    bitmap);
-+
-+#if HAS_DFM
-+/*! Get active DFM port specification bitmap for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id);
-+#endif
-+
-+/*! Set DFM device relocatability specification for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+ @param is_relocatable[in]        1 if dfm device ports are relocatable, 0 otherwise
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_is_dfm_relocatable(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id,
-+    const uint8_t                        is_relocatable);
-+
-+#if HAS_DFM
-+/*! Get DFM device relocatability specification for the program
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dfm_type_id[in]            DFM resource type ID
-+
-+ @return 1 if dfm device ports are relocatable, 0 otherwise
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t            dfm_type_id);
-+#endif
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+
-+ @deprecated Implementation is trival (returns 0) and
-+ no known users or known intention for future use.
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id);
-+
-+/*! Set the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type id
-+ @param    int_mem_size[in]        internal memory size
-+
-+ @return < 0 on invalid arguments
-+ @deprecated see ia_css_program_manifest_get_int_mem_size()
-+ */
-+extern int ia_css_program_manifest_set_int_mem_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            int_mem_size);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id);
-+
-+/*! Set the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type id
-+ @param    ext_mem_size[in]        external memory size
-+
-+ @return < 0 on invalid arguments
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+ */
-+extern int ia_css_program_manifest_set_ext_mem_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            ext_mem_size);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (size) specification
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dev_chn_id[in]            device channel ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t            dev_chn_id);
-+#endif
-+
-+/*! Set a device channel resource (size) specification
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dev_chn_id[in]            device channel ID
-+ @param    dev_chn_size[in]        device channel size
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dev_chn_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t            dev_chn_id,
-+    const vied_nci_resource_size_t            dev_chn_size);
-+
-+/*! Set a device channel resource (offset) specification
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dev_chn_id[in]            device channel ID
-+ @param    dev_chn_offset[in]        device channel offset
-+
-+ @see ia_css_program_manifest_get_dev_chn_offset()
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dev_chn_offset(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t            dev_chn_id,
-+    const vied_nci_resource_size_t            dev_chn_offset);
-+
-+/*! Set the memory resource (offset) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type id
-+ @param    ext_mem_offset[in]        external memory offset
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_ext_mem_offset(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            ext_mem_offset);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (offset) specification
-+
-+ Used to define a resource dependency on devices that support
-+ parallel users via channel multiplexing within the device.
-+
-+ Channel resources can be "relocatable". That is, some channel
-+ is required, but the exact channel is not important and
-+ can be assigned at runtime.
-+
-+ Other channel resources are static "fixed" in advance.  Either
-+ each channel is customized for a particular need such that
-+ the exact channel needs to be specified.  Alternatively, there
-+ are enough channels resources available for the worst case
-+ system requirement such that the channels can be statically
-+ assigned in advance "fixed" channels.
-+
-+ Both kinds of resource dependency specification are supported here.
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dev_chn_id[in]            device channel ID
-+
-+ @return Valid fixed offset (if value is greater or equal to 0) or
-+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
-+  is relocatable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t                dev_chn_id);
-+#endif
-+
-+/*! Get the memory resource (offset) specification for a memory
-+ that does not belong to the cell where the program will be mapped.
-+
-+ Memory specified here is typically SRAM within IPU used for
-+ intermediate storage during data transfer between processing
-+ stages/main memory or as computation scratch space.
-+
-+ The offset specified essentially defines the location of the memory
-+ within the memory device.  It can be fixed in advance (static allocation)
-+ or left to the system to determine at runtime.
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type ID
-+
-+ @return Valid fixed offset (if value is greater or equal to 0) or
-+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
-+  is relocatable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id);
-+
-+/*! Get the kernel composition of the program manifest object
-+
-+  The collection of kernels described in the bitmap is defined
-+  at the program group level. This function returns the subset
-+  of kernels that are part of this program.
-+ @param    manifest[in]            program manifest object
-+
-+ @return bitmap, 0 on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Set the kernel dependency of the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+ @param    kernel_bitmap[in]        kernel composition bitmap
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_kernel_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const ia_css_kernel_bitmap_t            kernel_bitmap);
-+
-+/*! Get the number of programs this programs depends on from the program group
-+ * manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program dependency count
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_program_dependency_count(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the index of the program which the programs at this index depends on
-+    from the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program dependency,
-+    IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
-+    */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_program_dependency(
-+    const ia_css_program_manifest_t            *manifest,
-+    const unsigned int                index);
-+
-+/*! Set the index of the program which the programs at this index depends on
-+    in the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program dependency
-+ */
-+extern int ia_css_program_manifest_set_program_dependency(
-+    ia_css_program_manifest_t            *manifest,
-+    const uint8_t                    program_dependency,
-+    const unsigned int                index);
-+
-+/*! Get the number of terminals this programs depends on from the program group
-+ * manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return program dependency count
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the index of the terminal which the programs at this index depends on
-+    from the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_terminal_dependency(
-+    const ia_css_program_manifest_t            *manifest,
-+    const unsigned int                index);
-+
-+/*! Set the index of the terminal which the programs at this index depends on
-+    in the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_terminal_dependency(
-+    ia_css_program_manifest_t            *manifest,
-+    const uint8_t                    terminal_dependency,
-+    const unsigned int                index);
-+
-+/*! Check if the program manifest object specifies a subnode program
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return is_subnode, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+extern bool ia_css_is_program_manifest_subnode_program_type(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Check if the program manifest object specifies a supernode program
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return is_supernode, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+extern bool ia_css_is_program_manifest_supernode_program_type(
-+    const ia_css_program_manifest_t            *manifest);
-+/*! Check if the program manifest object specifies a singular program
-+
-+ @param    manifest[in]            program manifest object
-+
-+ @return is_singular, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_program_manifest_singular_program_type(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
-new file mode 100644
-index 000000000000..30e31d22579b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.hsys.kernel.h
-+ *
-+ * Define the methods on the program manifest object: Hsys kernel interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>                    /* uint8_t */
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*
-+ * Resources needs
-+ */
-+
-+/*! Get the cell ID from the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ Note: If the cell ID is specified, the program this manifest belongs to
-+ must be mapped on that instance. If the cell ID is invalid (limit value)
-+ then the cell type ID must be specified instead
-+
-+ @return cell ID, limit value if not specified
-+ */
-+extern
-+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the cell type ID from the program manifest object
-+
-+ @param    manifest[in]            program manifest object
-+
-+ Note: If the cell type ID is specified, the program this manifest belongs
-+ to can be mapped on any instance of this clee type. If the cell type ID is
-+ invalid (limit value) then a specific cell ID must be specified instead
-+
-+ @return cell ID, limit value if not specified
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
-+    const ia_css_program_manifest_t            *manifest);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param    manifest[in]            program manifest object
-+ @param    mem_type_id[in]            mem type ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (size) specification
-+
-+ @param    manifest[in]            program manifest object
-+ @param    dev_chn_id[in]            device channel ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+    const ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t                dev_chn_id);
-+#endif
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..12a777003226
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.hsys.user.h
-+ *
-+ * Define the methods on the program manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+/*! Print the program manifest object to file/stream
-+    in textual format
-+
-+ @param    manifest[in]            program manifest object
-+ @param    fid[out]                file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_manifest_print(
-+    const ia_css_program_manifest_t    *manifest,
-+    void                *fid);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
-new file mode 100644
-index 000000000000..50ecd3ee8611
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
-@@ -0,0 +1,65 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.sim.h
-+ *
-+ * Define the methods on the program manifest object: Simulation only
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>    /* uint8_t */
-+
-+/*! Compute the size of storage required for allocating
-+ * the program manifest object
-+
-+ @param program_needs_extension[in]    ==1 if program manifest needs an extension struct
-+ @param    program_dependency_count[in]    Number of programs this one depends on
-+ @param    terminal_dependency_count[in]    Number of terminals this one depends on
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_program_manifest(
-+    const uint8_t    program_needs_extension,
-+    const uint8_t    program_dependency_count,
-+    const uint8_t    terminal_dependency_count);
-+
-+/*! Create (the storage for) the program manifest object
-+
-+ @param    program_dependency_count[in]    Number of programs this one depends on
-+ @param    terminal_dependency_count[in]    Number of terminals this one depends on
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
-+    const uint8_t    program_dependency_count,
-+    const uint8_t    terminal_dependency_count);
-+
-+/*! Destroy (the storage of) the program manifest object
-+
-+ @param    manifest[in]            program manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_manifest_t *ia_css_program_manifest_free(
-+    ia_css_program_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
-new file mode 100644
-index 000000000000..04803a3812e3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_psys_static_trace.h"
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <storage_class.h>
-+#include <math_support.h>
-+
-+/** Function only to be used in FW */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
-+{
-+    DECLARE_ERRVAL
-+    verifexitval(program != NULL, EFAULT);
-+    if (program->program_extension_offset != 0) {
-+        return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_extension invalid argument\n");
-+    }
-+    return NULL;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+    (void)manifest;
-+    (void)mem_type_id;
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+                   "ia_css_program_manifest_get_int_mem_size always returns 0"
-+                   "(internally memory feature not used).\n");
-+    return 0;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_input_terminal_id(
-+    ia_css_program_manifest_t *manifest,
-+    unsigned char              idx)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+    return manifest_ext->dec_resources_input_terminal[idx];
-+#else
-+    (void) idx;
-+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_output_terminal_id(
-+    ia_css_program_manifest_t *manifest,
-+    unsigned char              idx)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+    return manifest_ext->dec_resources_output_terminal[idx];
-+#else
-+    (void) idx;
-+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_input_stream_id(
-+    ia_css_program_manifest_t  *manifest,
-+    unsigned char               idx)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+    return manifest_ext->dec_resources_input[idx];
-+#else
-+    (void) idx;
-+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_output_stream_id(
-+    ia_css_program_manifest_t *manifest,
-+    unsigned char              idx)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_output_stream_id(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+    }
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+    return manifest_ext->dec_resources_output[idx];
-+#else
-+    (void) idx;
-+    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_dev_dfm_id_t      dfm_type_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
-+        return 0;
-+    }
-+    return manifest_ext->is_dfm_relocatable[dfm_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
-+    const ia_css_program_manifest_t  *manifest,
-+    const vied_nci_dev_dfm_id_t       dfm_type_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
-+        return 0;
-+    }
-+    return manifest_ext->dfm_port_bitmap[dfm_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
-+    const ia_css_program_manifest_t  *manifest,
-+    const vied_nci_dev_dfm_id_t       dfm_type_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
-+        return 0;
-+    }
-+    return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
-+        return 0;
-+    }
-+    return manifest_ext->ext_mem_size[mem_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
-+         return 0;
-+    }
-+    return manifest_ext->ext_mem_offset[mem_type_id];
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_dev_chn_ID_t      dev_chn_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_dev_chn_size(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
-+        return 0;
-+    }
-+    return manifest_ext->dev_chn_size[dev_chn_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
-+    const ia_css_program_manifest_t *manifest,
-+    const vied_nci_dev_chn_ID_t      dev_chn_id)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
-+         return 0;
-+    }
-+    return manifest_ext->dev_chn_offset[dev_chn_id];
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_program_manifest_get_size(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_size(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_size invalid argument\n");
-+        return 0;
-+    }
-+
-+    return manifest->size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_program_ID(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_program_ID invalid argument\n");
-+        return IA_CSS_PROGRAM_INVALID_ID;
-+    }
-+    return manifest->ID;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+    char *base = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_parent(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+
-+    base = (char *)((char *)manifest + manifest->parent_offset);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_parent invalid argument\n");
-+        return NULL;
-+    }
-+    return (ia_css_program_group_manifest_t *)(base);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_cell_type_ID(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
-+        return VIED_NCI_N_CELL_TYPE_ID;
-+    }
-+    return manifest->cell_type_id;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_type_t ia_css_program_manifest_get_type(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_type(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_type invalid argument\n");
-+        return IA_CSS_N_PROGRAM_TYPES;
-+    }
-+    return manifest->program_type;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
-+        return 0;
-+    }
-+    return manifest->terminal_dependency_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_terminal_dependency(
-+    const ia_css_program_manifest_t *manifest,
-+    const unsigned int index)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t *terminal_dep_ptr = NULL;
-+    uint8_t terminal_dependency_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_terminal_dependency(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+    terminal_dependency_count =
-+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+    verifexitval(index < terminal_dependency_count, EFAULT);
-+
-+    terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+            manifest->terminal_dependency_offset + index);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_terminal_dependency invalid argument\n");
-+        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
-+    }
-+    return *terminal_dep_ptr;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_program_manifest_singular_program_type(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    ia_css_program_type_t        program_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_is_program_manifest_singular_program_type(): enter:\n");
-+
-+    program_type = ia_css_program_manifest_get_type(manifest);
-+
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+    return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_program_dependency_count(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
-+        return 0;
-+    }
-+    return manifest->program_dependency_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_program_dependency(
-+    const ia_css_program_manifest_t *manifest,
-+    const unsigned int index)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t *program_dep_ptr = NULL;
-+    uint8_t program_dependency_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_program_dependency(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+
-+    program_dependency_count =
-+        ia_css_program_manifest_get_program_dependency_count(manifest);
-+
-+    verifexitval(index < program_dependency_count, EFAULT);
-+    program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
-+            manifest->program_dependency_offset +
-+            index * sizeof(uint8_t));
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                       "ia_css_program_manifest_get_program_dependency invalid argument\n");
-+        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
-+    }
-+    return *program_dep_ptr;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+                   "ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
-+    verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+          "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
-+        return ia_css_kernel_bitmap_clear();
-+    }
-+    return manifest->kernel_bitmap;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
-new file mode 100644
-index 000000000000..f1ef454e6890
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_SIM_INLINE__
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
-new file mode 100644
-index 000000000000..a5cf6f78aa0e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
-@@ -0,0 +1,97 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_SIM_TRACE_H
-+#define __IA_CSS_PSYS_SIM_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
-+     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_SIM_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_SIM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_SIM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_SIM_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_SIM_TRACE_METHOD    PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT    PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_SIM_TRACE_LEVEL_ERROR    PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_SIM_TRACE_LEVEL_WARNING    PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_SIM_TRACE_LEVEL_INFO    PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG    PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE    PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
-new file mode 100644
-index 000000000000..b6a4bd600c5b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
-new file mode 100644
-index 000000000000..03c355b350fb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
-+#define __IA_CSS_PSYS_STATIC_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
-+     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
-+    PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
-+    /* Module/sub-module specific trace setting */
-+    #if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_STATIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_STATIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_STATIC_TRACE_METHOD \
-+            IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+            IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_DATA Tracing level defined"
-+    #endif
-+#else
-+    /* Inherit Module trace setting */
-+    #define PSYSAPI_STATIC_TRACE_METHOD \
-+        PSYSAPI_TRACE_METHOD
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+        PSYSAPI_TRACE_LEVEL_ASSERT
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+        PSYSAPI_TRACE_LEVEL_ERROR
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+        PSYSAPI_TRACE_LEVEL_WARNING
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+        PSYSAPI_TRACE_LEVEL_INFO
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+        PSYSAPI_TRACE_LEVEL_DEBUG
-+    #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+        PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
-new file mode 100644
-index 000000000000..1dcb3b3c828f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
-@@ -0,0 +1,403 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_H
-+#define __IA_CSS_PSYS_TERMINAL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.h
-+ *
-+ * Define the methods on the terminal object that are not part of
-+ * a single interface
-+ */
-+
-+#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
-+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>        /* bool */
-+#include <print_support.h>        /* FILE */
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_terminal.hsys.user.h>
-+
-+/*! Boolean test if the terminal object type is input
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return true if the terminal is input, false otherwise or on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_input(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! Get the stored size of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return size, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_terminal_get_size(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! Get the type of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the type of the terminal, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_type_t ia_css_terminal_get_type(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! Set the type of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+ @param    terminal_type[in]        type of the terminal
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_type(
-+    ia_css_terminal_t        *terminal,
-+    const ia_css_terminal_type_t    terminal_type);
-+
-+/*! Get the index of the terminal manifest object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the index of the terminal manifest object, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_terminal_get_terminal_manifest_index(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! Set the index of the terminal manifest object
-+
-+ @param    terminal[in]            terminal object
-+ @param    tm_index[in]            terminal manifest index
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_terminal_manifest_index(
-+    ia_css_terminal_t    *terminal,
-+    const uint16_t        tm_index);
-+
-+/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_terminal_get_payload_size(
-+    const ia_css_terminal_t *terminal);
-+
-+/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
-+
-+ @param    terminal[in]            terminal object
-+ @param    payload_size[in]        Size of buffer that will be supplied to the terminal
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_payload_size(
-+    ia_css_terminal_t *terminal,
-+    uint32_t payload_size);
-+
-+/*! Get id of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_get_ID(
-+    const ia_css_terminal_t            *terminal);
-+
-+/*! Get compressed byte of the data terminal object
-+
-+ @param    dterminal[in]            data terminal object
-+ @param val[out]            is_compressed value
-+
-+ @@return < 0 on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_is_compressed(
-+    const ia_css_data_terminal_t *dterminal,
-+    uint8_t *val);
-+
-+/*! Get kernel id of the data terminal object
-+
-+ @param    dterminal[in]            data terminal object
-+
-+ @return kernel id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_get_kernel_id(
-+    const ia_css_data_terminal_t            *dterminal);
-+
-+/*! Get the connection type from the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return buffer type, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
-+    const ia_css_data_terminal_t    *dterminal);
-+
-+/*! Set the connection type of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+ @param    connection_type[in]        connection type
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_connection_type(
-+    ia_css_data_terminal_t                *dterminal,
-+    const ia_css_connection_type_t            connection_type);
-+
-+/*! Get link id of the data terminal object
-+
-+ @param    dterminal[in]            data terminal object
-+
-+ @return link id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_get_link_id(
-+    const ia_css_data_terminal_t            *dterminal);
-+
-+/*! Set link id of the terminal object
-+
-+ @param    terminal[in]            data terminal object
-+ @param    link_id[in]            synchronization link id
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_link_id(
-+    ia_css_data_terminal_t                *dterminal,
-+    const uint8_t                    link_id);
-+
-+/*! Set stream2gen buffer size used in stream to GEN connection
-+ * This function should be called, in case we are in streaming use-case, and
-+ * we need to configure the stream2gen_buffer_size to be less than full image's height.
-+ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
-+ * during terminal_create function.
-+
-+ * @param    terminal[in]            data terminal object
-+ * @param    stream2gen_buffer_size[in]        Buffer size (Size's units are lines)
-+
-+ * @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_stream2gen_buffer_size(
-+    ia_css_data_terminal_t *dterminal,
-+    const uint16_t stream2gen_buffer_size);
-+
-+/*! Get the (pointer to) the process group parent of the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the pointer to the parent, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_t *ia_css_terminal_get_parent(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! Set the (pointer to) the process group parent of the terminal object
-+
-+ @param    terminal[in]    terminal object
-+ @param    parent[in]    (pointer to the) process group parent object
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_parent(
-+    ia_css_terminal_t    *terminal,
-+    ia_css_process_group_t    *parent);
-+
-+/*! Boolean test if the terminal object type is valid
-+
-+ @param    terminal[in]            process terminal object
-+ @param    terminal_manifest[in]        program terminal manifest
-+
-+ @return true if the process terminal object is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_valid(
-+    const ia_css_terminal_t         *terminal,
-+    const ia_css_terminal_manifest_t *terminal_manifest);
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+
-+/*!
-+ * Gets the program init terminal descripor size
-+ * @param manifest[in]        program control init terminal manifest
-+ * @param pg_manifest[in]    program group manifest
-+ * @param kernel_bitmap[in]    kernel enable bitmap
-+ * @return size, error if < 0.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int
-+ia_css_program_control_init_terminal_get_descriptor_size(
-+    const ia_css_program_control_init_terminal_manifest_t *manifest,
-+    const ia_css_program_group_manifest_t *pg_manifest,
-+    ia_css_kernel_bitmap_t kernel_bitmap);
-+
-+/*!
-+ * Initialize program control init terminal
-+ * @param nof_fragments[in]    Number of fragments
-+ * @param terminal[in]        program control init terminal
-+ * @param manifest[in]        program control init terminal manifest
-+ * @param pg_manifest[in]    program group manifest
-+ * @param kernel_bitmap[in]    kernel enable bitmap
-+ * @return < 0 on erro
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int
-+ia_css_program_control_init_terminal_init(
-+    ia_css_program_control_init_terminal_t *terminal,
-+    const ia_css_program_control_init_terminal_manifest_t *manifest,
-+    const ia_css_program_group_manifest_t *pg_manifest,
-+    ia_css_kernel_bitmap_t kernel_bitmap);
-+
-+/*!
-+ * Get a program desc for a program control init terminal
-+  * @param terminal[in]        program control init terminal
-+ * @param manifest[in]        program control init terminal manifest
-+ * @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_program_desc_t *
-+ia_css_program_control_init_terminal_get_program_desc(
-+    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
-+    const unsigned int program_index
-+);
-+
-+/*!
-+ * Pretty prints the program control init termnial
-+ * @param terminal[in]        program control init terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+void ia_css_program_control_init_terminal_print(
-+    const ia_css_program_control_init_terminal_t *terminal);
-+
-+/*!
-+ * Returns the number of connect sections per program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return number of connect sections
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
-+    const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Returns the number of connect sections per program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return number of connect sections
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
-+    const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Returns the memory offset of the first load section in the program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return memory offset
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
-+    const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Gets a load section desc for a program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]        program control init terminal program desc
-+ * @param load_section_index[in]    section index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_load_section_desc_t *
-+ia_css_program_control_init_terminal_get_load_section_desc(
-+    const ia_css_program_control_init_program_desc_t *program_desc,
-+    const unsigned int load_section_index
-+);
-+
-+/*!
-+ * Gets process_id from program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]        program control init terminal program desc
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
-+    const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Set control info of program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]    program control init terminal program desc
-+ * @param process_id         unique process id used to identify the process
-+ * among all active process
-+ * @param num_done_events     number of events required to close the process
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+void ia_css_program_control_init_terminal_set_control_info(
-+    ia_css_program_control_init_program_desc_t *program_desc,
-+    ia_css_process_id_t process_id,
-+    uint8_t num_done_events);
-+
-+/*!
-+ * Gets num_done_events value from program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]        program control init terminal program desc
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
-+    const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Gets a connect section desc for a program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]        program control init terminal program desc
-+ * @param connect_section_index[in]    section index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_connect_section_desc_t *
-+ia_css_program_control_init_terminal_get_connect_section_desc(
-+    const ia_css_program_control_init_program_desc_t *program_desc,
-+    const unsigned int connect_section_index
-+);
-+
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_terminal_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
-new file mode 100644
-index 000000000000..5abd321174df
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
-@@ -0,0 +1,257 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
-+#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.hsys.user.h
-+ *
-+ * Define the methods on the terminal object: Hsys user interface
-+ */
-+
-+#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
-+#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>                    /* bool */
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_kernel_bitmap.h"
-+
-+/*
-+ * Creation
-+ */
-+
-+/*
-+ * This source file is created with the intention of sharing and
-+ * compiled for host and firmware. Since there is no native 64bit
-+ * data type support for firmware this wouldn't compile for SP
-+ * tile. The part of the file that is not compilable are marked
-+ * with the following __VIED_CELL marker and this comment. Once we
-+ * come up with a solution to address this issue this will be
-+ * removed.
-+ */
-+#if !defined(__VIED_CELL)
-+/*! Compute the size of storage required for allocating the terminal object
-+
-+ @param    manifest[in]            terminal manifest
-+ @param    param[in]                program group parameters
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_terminal(
-+    const ia_css_terminal_manifest_t        *manifest,
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! Create the terminal object
-+
-+ @param    raw_mem[in]                pre allocated memory
-+ @param    manifest[in]            terminal manifest
-+ @param    terminal_param[in]        terminal parameter
-+ @param enable_bitmap            program group enable bitmap
-+
-+ @return NULL on error
-+ */
-+extern ia_css_terminal_t *ia_css_terminal_create(
-+    void *raw_mem,
-+    const ia_css_terminal_manifest_t        *manifest,
-+    const ia_css_terminal_param_t            *terminal_param,
-+    ia_css_kernel_bitmap_t                enable_bitmap);
-+
-+/*! Destroy (the storage of) the process object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_t *ia_css_terminal_destroy(
-+    ia_css_terminal_t *terminal);
-+#endif /* !defined(__VIED_CELL) */
-+
-+/*! Print the terminal object to file/stream
-+
-+ @param    terminal[in]            terminal object
-+ @param    fid[out]                file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_print(
-+    const ia_css_terminal_t                    *terminal,
-+    void *fid);
-+
-+/*! Get the (pointer to) the frame object in the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the pointer to the frame, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_frame_t *ia_css_data_terminal_get_frame(
-+    const ia_css_data_terminal_t        *terminal);
-+
-+/*! Get the (pointer to) the frame descriptor object in the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the pointer to the frame descriptor, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
-+    const ia_css_data_terminal_t        *dterminal);
-+
-+/*! Get the (pointer to) the fragment descriptor object in the terminal object
-+
-+ @param    terminal[in]            terminal object
-+
-+@return the pointer to the fragment descriptor, NULL on error
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_fragment_descriptor_t
-+    *ia_css_data_terminal_get_fragment_descriptor(
-+        const ia_css_data_terminal_t        *dterminal,
-+        const unsigned int            fragment_index);
-+
-+/*! Get the number of fragments on the terminal
-+
-+ @param    terminal[in]            terminal object
-+
-+ @return the fragment count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_data_terminal_get_fragment_count(
-+    const ia_css_data_terminal_t        *dterminal);
-+
-+/*! Get the number of section on the (param)terminal
-+ @param    manifest[in]            terminal manifest
-+ @param    terminal_param[in]        terminal parameter
-+
-+ @return the section count, 0 on error
-+ */
-+extern uint16_t ia_css_param_terminal_compute_section_count(
-+    const ia_css_terminal_manifest_t    *manifest,
-+    const ia_css_program_group_param_t    *param);
-+
-+/*! Get the number of planes on the (data)terminal
-+ @param    manifest[in]            terminal manifest
-+ @param    terminal_param[in]        terminal parameter
-+
-+ @return the plane count, 1(default) on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_compute_plane_count(
-+    const ia_css_terminal_manifest_t        *manifest,
-+    const ia_css_program_group_param_t        *param);
-+
-+/*! check if given terminal is parameter terminal.
-+
-+ @param    terminal[in]            (base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_parameter_terminal(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! check if given terminal is program terminal.
-+
-+ @program    terminal[in]            (base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_program_terminal(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! check if given terminal is program control init terminal.
-+
-+ @program control init    terminal[in]            (base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_program_control_init_terminal(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! check if given terminal is spatial parameter terminal.
-+
-+ @spatial    terminal[in]            (base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_spatial_parameter_terminal(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! check if given terminal is data terminal.
-+
-+ @param    terminal[in]            (base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_data_terminal(
-+    const ia_css_terminal_t                    *terminal);
-+
-+/*! obtain buffer out of terminal(both data & param terminals can call this)
-+
-+ @param    terminal[in]    (base)terminal object of either data or param terminal.
-+
-+ @return vied address of buffer stored in terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t  ia_css_terminal_get_buffer(
-+        const ia_css_terminal_t *terminal);
-+
-+/*!store a buffer in the terminal.
-+
-+ @param    terminal[in]    (base)terminal object of either data or param terminal.
-+ @param buffer[in]    buffer in vied (hrt address) space.
-+
-+ @return 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
-+                vied_vaddress_t buffer);
-+
-+/*! Obtain terminal buffer index out of terminal object
-+
-+ @param    terminal[in]    (base)terminal object of either data or param terminal.
-+
-+ @return terminal buffer index stored in terminal object on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_get_terminal_index(
-+    const ia_css_terminal_t *terminal);
-+
-+/*! Store a terminal buffer index in the terminal object
-+
-+ @param    terminal[in]        (base)terminal object of either data or param terminal.
-+ @param terminal_index[in]    terminal buffer index
-+
-+ @return 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_index(
-+    ia_css_terminal_t *terminal,
-+    unsigned int terminal_index);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
-new file mode 100644
-index 000000000000..5a9657945524
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
-@@ -0,0 +1,2053 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
-+#define __IA_CSS_PSYS_TERMINAL_IMPL_H
-+
-+#include <ia_css_psys_terminal.h>
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_program_group_param.h>
-+
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_process_group.hsys.user.h>
-+
-+#include <type_support.h>
-+#include <error_support.h>    /* for verifexit, verifjmpexit */
-+#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
-+#include <misc_support.h>    /* for NOT_USED */
-+#include "ia_css_psys_terminal_private_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_psys_manifest_types.h"
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_types.h"
-+
-+STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
-+    void *fid) {
-+
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    int i;
-+    ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
-+    uint16_t fragment_count =
-+        ia_css_data_terminal_get_fragment_count(dterminal);
-+    verifexitval(fragment_count != 0, EINVAL);
-+
-+    retval = ia_css_frame_descriptor_print(
-+        ia_css_data_terminal_get_frame_descriptor(dterminal),
-+        fid);
-+    verifexitval(retval == 0, EINVAL);
-+
-+    retval = ia_css_frame_print(
-+        ia_css_data_terminal_get_frame(dterminal), fid);
-+    verifexitval(retval == 0, EINVAL);
-+
-+    for (i = 0; i < (int)fragment_count; i++) {
-+        retval = ia_css_fragment_descriptor_print(
-+            ia_css_data_terminal_get_fragment_descriptor(
-+                dterminal, i), fid);
-+        verifexitval(retval == 0, EINVAL);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
-+
-+    retval = 0;
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_print(
-+    const ia_css_terminal_t *terminal,
-+    void *fid)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_terminal_print(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+        "\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
-+        (unsigned long int)terminal,
-+        (int)ia_css_terminal_get_size(terminal),
-+        (int)ia_css_terminal_get_type(terminal),
-+        (unsigned long int)ia_css_terminal_get_parent(terminal));
-+
-+    switch (term_type) {
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+        ia_css_program_control_init_terminal_print(
-+            (ia_css_program_control_init_terminal_t *)terminal);
-+    break;
-+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+        ia_css_data_terminal_print(terminal, fid);
-+    break;
-+    default:
-+        /* other terminal prints are currently not supported */
-+    break;
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_print invalid argument terminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_input(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    bool is_input = false;
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_input(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+    switch (terminal_type) {
-+    case IA_CSS_TERMINAL_TYPE_DATA_IN:        /* Fall through */
-+    case IA_CSS_TERMINAL_TYPE_STATE_IN:        /* Fall through */
-+    case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:        /* Fall through */
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+        is_input = true;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:        /* Fall through */
-+    case IA_CSS_TERMINAL_TYPE_STATE_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+        is_input = false;
-+        break;
-+    default:
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_input: Unknown terminal type (%d)\n",
-+            terminal_type);
-+        goto EXIT;
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_input invalid argument\n");
-+    }
-+    return is_input;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_terminal_get_size(
-+    const ia_css_terminal_t    *terminal)
-+{
-+    DECLARE_ERRVAL
-+    size_t size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_size(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    size = terminal->size;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_size invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_type_t ia_css_terminal_get_type(
-+    const ia_css_terminal_t    *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_type(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    terminal_type = terminal->terminal_type;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_type invalid argument\n");
-+    }
-+    return terminal_type;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_type(
-+    ia_css_terminal_t *terminal,
-+    const ia_css_terminal_type_t terminal_type)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_type(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    terminal->terminal_type = terminal_type;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_type invalid argument terminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_type failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_terminal_get_terminal_manifest_index(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    uint16_t terminal_manifest_index;
-+
-+    terminal_manifest_index = 0xffff;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_terminal_manifest_index(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    terminal_manifest_index = terminal->tm_index;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
-+    }
-+    return terminal_manifest_index;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_manifest_index(
-+    ia_css_terminal_t *terminal,
-+    const uint16_t terminal_manifest_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_terminal_manifest_index(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+    terminal->tm_index = terminal_manifest_index;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_terminal_get_payload_size(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    uint32_t payload_size;
-+
-+    payload_size = 0;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_payload_size(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    payload_size = terminal->payload_size;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_payload_size: invalid argument\n");
-+    }
-+    return payload_size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_payload_size(
-+    ia_css_terminal_t *terminal,
-+    uint32_t payload_size)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_payload_size(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+    terminal->payload_size = payload_size;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_payload_size: invalid argument terminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_payload_size: failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_ID_t ia_css_terminal_get_ID(
-+    const ia_css_terminal_t    *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_ID(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    retval = terminal->ID;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_ID invalid argument\n");
-+        retval = 0;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_get_kernel_id(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_kernel_id(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    retval = dterminal->kernel_id;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_kernel_id: invalid argument\n");
-+        retval =  0;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_is_compressed(
-+    const ia_css_data_terminal_t *dterminal,
-+    uint8_t *val)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    const ia_css_frame_descriptor_t *frame_descriptor;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_is_compressed enter\n");
-+
-+    frame_descriptor =
-+        ia_css_data_terminal_get_frame_descriptor(dterminal);
-+
-+    verifexitval(frame_descriptor != NULL, EFAULT);
-+
-+    *val = frame_descriptor->is_compressed;
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_is_compressed: Null frame descriptor\n");
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_connection_type(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    connection_type = dterminal->connection_type;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_connection_type: invalid argument\n");
-+    }
-+    return connection_type;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_get_link_id(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t link_id = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_link_id(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    link_id = dterminal->link_id;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_link_id: invalid argument\n");
-+    }
-+    return link_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_link_id(
-+    ia_css_data_terminal_t *dterminal,
-+    const uint8_t link_id)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_set_link_id(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+    dterminal->link_id = link_id;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_link_id: invalid argument terminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_link_id: failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_connection_type(
-+    ia_css_data_terminal_t *dterminal,
-+    const ia_css_connection_type_t connection_type)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_set_connection_type(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    dterminal->connection_type = connection_type;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_connection_type failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_stream2gen_buffer_size(
-+    ia_css_data_terminal_t *dterminal,
-+    const uint16_t stream2gen_buffer_size)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
-+        "ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
-+    dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
-+            retval);
-+    }
-+
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_t *ia_css_terminal_get_parent(
-+    const ia_css_terminal_t    *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_group_t *parent = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_parent(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+    if (terminal->parent_offset == 0) {
-+        return NULL;
-+    }
-+
-+    parent = (ia_css_process_group_t *) ((char *)terminal +
-+                    terminal->parent_offset);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_parent invalid argument\n");
-+    }
-+    return parent;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_parent(
-+    ia_css_terminal_t *terminal,
-+    ia_css_process_group_t *parent)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_parent(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+    verifexitval(parent != NULL, EFAULT);
-+
-+    terminal->parent_offset = (uint16_t) ((char *)parent -
-+                        (char *)terminal);
-+
-+    retval = 0;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_parent invalid argument\n");
-+    }
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_parent failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_frame_t *ia_css_data_terminal_get_frame(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_frame_t *frame = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_frame(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    frame = (ia_css_frame_t    *)(&(dterminal->frame));
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_frame invalid argument\n");
-+    }
-+    return frame;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_frame_descriptor_t *frame_descriptor = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+
-+    frame_descriptor =
-+        (ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
-+    }
-+    return frame_descriptor;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
-+    const ia_css_data_terminal_t *dterminal,
-+    const unsigned int fragment_index)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
-+    uint16_t fragment_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
-+
-+    fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+    verifexitval(fragment_count != 0, EINVAL);
-+    verifexitval(fragment_index < fragment_count, EINVAL);
-+
-+    fragment_descriptor = (ia_css_fragment_descriptor_t *)
-+        ((char *)dterminal + dterminal->fragment_descriptor_offset);
-+
-+    fragment_descriptor += fragment_index;
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
-+    }
-+    return fragment_descriptor;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_data_terminal_get_fragment_count(
-+    const ia_css_data_terminal_t *dterminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_process_group_t *parent;
-+    uint16_t fragment_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_get_fragment_count(): enter:\n");
-+
-+    parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
-+
-+    verifexitval(dterminal != NULL, EFAULT);
-+    verifexitval(parent != NULL, EFAULT);
-+
-+    fragment_count = ia_css_process_group_get_fragment_count(parent);
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_get_fragment_count: invalid argument\n");
-+    }
-+    return fragment_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_parameter_terminal(
-+    const ia_css_terminal_t    *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_parameter_terminal(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    /* will return an error value on error */
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_parameter_terminal: invalid argument\n");
-+    }
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_data_terminal(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_data_terminal(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    /* will return an error value on error */
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_data_terminal invalid argument\n");
-+    }
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
-+            terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_program_terminal(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_program_terminal(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    /* will return an error value on error */
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_program_terminal: invalid argument\n");
-+    }
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_program_control_init_terminal(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_program_control_init_terminal(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    /* will return an error value on error */
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
-+    }
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_spatial_parameter_terminal(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    /* will return an error value on error */
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
-+    }
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_compute_plane_count(
-+    const ia_css_terminal_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    DECLARE_ERRVAL
-+    uint8_t    plane_count = 1;
-+
-+    NOT_USED(manifest);
-+    NOT_USED(param);
-+
-+    verifexitval(manifest != NULL, EFAULT);
-+    verifexitval(param != NULL, EFAULT);
-+    /* TODO: Implementation Missing*/
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_data_terminal_compute_plane_count(): enter:\n");
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_data_terminal_compute_plane_count: invalid argument\n");
-+    }
-+    return plane_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_vaddress_t  ia_css_terminal_get_buffer(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    vied_vaddress_t buffer = VIED_NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_buffer(): enter:\n");
-+
-+    verifexitval(terminal != NULL, EFAULT);
-+    if (ia_css_is_terminal_data_terminal(terminal)) {
-+        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+
-+        verifexitval(frame != NULL, EFAULT);
-+        buffer = ia_css_frame_get_buffer(frame);
-+    } else if (ia_css_is_terminal_parameter_terminal(terminal)) {
-+        const ia_css_param_terminal_t *param_terminal =
-+            (const ia_css_param_terminal_t *)terminal;
-+
-+        verifexitval(param_terminal != NULL, EFAULT);
-+        buffer = param_terminal->param_payload.buffer;
-+    }  else if (ia_css_is_terminal_program_terminal(terminal)) {
-+        const ia_css_program_terminal_t *program_terminal =
-+            (const ia_css_program_terminal_t *)terminal;
-+
-+        verifexitval(program_terminal != NULL, EFAULT);
-+        buffer = program_terminal->param_payload.buffer;
-+    }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
-+        const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
-+            (const ia_css_program_control_init_terminal_t *)terminal;
-+
-+        verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
-+        buffer = program_ctrl_init_terminal->param_payload.buffer;
-+    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
-+        const ia_css_spatial_param_terminal_t *spatial_terminal =
-+            (const ia_css_spatial_param_terminal_t *)terminal;
-+
-+        verifexitval(spatial_terminal != NULL, EFAULT);
-+        buffer = spatial_terminal->param_payload.buffer;
-+    }
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_buffer: invalid argument terminal\n");
-+    }
-+    return buffer;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_buffer(
-+    ia_css_terminal_t *terminal,
-+    vied_vaddress_t buffer)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+    ia_css_param_terminal_t *pterminal = NULL;
-+    ia_css_program_terminal_t *prog_terminal = NULL;
-+    ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
-+    ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_buffer(): enter:\n");
-+
-+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+        /* Currently using Frames inside data terminal ,
-+         * TODO: start directly using data.
-+         */
-+        ia_css_data_terminal_t *dterminal =
-+            (ia_css_data_terminal_t *)terminal;
-+        ia_css_frame_t *frame =
-+            ia_css_data_terminal_get_frame(dterminal);
-+
-+        verifexitval(frame != NULL, EFAULT);
-+        retval = ia_css_frame_set_buffer(frame, buffer);
-+        verifexitval(retval == 0, EINVAL);
-+    } else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
-+        pterminal = (ia_css_param_terminal_t *)terminal;
-+        verifexitval(pterminal != NULL, EFAULT);
-+        pterminal->param_payload.buffer = buffer;
-+        retval = 0;
-+    } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
-+        prog_terminal = (ia_css_program_terminal_t *)terminal;
-+        verifexitval(prog_terminal != NULL, EFAULT);
-+        prog_terminal->param_payload.buffer = buffer;
-+        retval = 0;
-+    } else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
-+        progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
-+        verifexitval(progctrl_terminal != NULL, EFAULT);
-+        progctrl_terminal->param_payload.buffer = buffer;
-+        retval = 0;
-+    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
-+            true) {
-+        spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
-+        verifexitval(spatial_terminal != NULL, EFAULT);
-+        spatial_terminal->param_payload.buffer = buffer;
-+        retval = 0;
-+    } else {
-+        return retval;
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_buffer failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_get_terminal_index(
-+    const ia_css_terminal_t *terminal)
-+{
-+    DECLARE_ERRVAL
-+    int terminal_index = -1;
-+    verifexitval(terminal != NULL, EFAULT);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_get_terminal_index(): enter:\n");
-+
-+    if (ia_css_is_terminal_data_terminal(terminal)) {
-+        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
-+                    (ia_css_data_terminal_t *)terminal);
-+
-+        verifexitval(frame != NULL, EFAULT);
-+        terminal_index = ia_css_frame_get_data_index(frame);
-+    } else {
-+        if (ia_css_is_terminal_parameter_terminal(terminal)) {
-+            const ia_css_param_terminal_t *param_terminal =
-+                (const ia_css_param_terminal_t *)terminal;
-+            verifexitval(param_terminal != NULL, EFAULT);
-+            terminal_index = param_terminal->param_payload.terminal_index;
-+        }  else if (ia_css_is_terminal_program_terminal(terminal)) {
-+            const ia_css_program_terminal_t *program_terminal =
-+                (const ia_css_program_terminal_t *)terminal;
-+            verifexitval(program_terminal != NULL, EFAULT);
-+            terminal_index = program_terminal->param_payload.terminal_index;
-+        }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
-+            const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
-+                (const ia_css_program_control_init_terminal_t *)terminal;
-+            verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
-+            terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
-+        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
-+            const ia_css_spatial_param_terminal_t *spatial_terminal =
-+                (const ia_css_spatial_param_terminal_t *)terminal;
-+            verifexitval(spatial_terminal != NULL, EFAULT);
-+            terminal_index = spatial_terminal->param_payload.terminal_index;
-+        } else {
-+            verifjmpexit(0);
-+        }
-+    }
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_get_terminal_index: invalid argument\n");
-+    }
-+    return terminal_index;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_index(
-+    ia_css_terminal_t *terminal,
-+    unsigned int terminal_index)
-+{
-+    DECLARE_ERRVAL
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_terminal_set_terminal_index(): enter:\n");
-+
-+    if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+        /* Currently using Frames inside data terminal ,
-+         * TODO: start directly using data.
-+         */
-+        ia_css_data_terminal_t *dterminal =
-+            (ia_css_data_terminal_t *)terminal;
-+        ia_css_frame_t *frame =
-+            ia_css_data_terminal_get_frame(dterminal);
-+
-+        verifexitval(frame != NULL, EFAULT);
-+        retval = ia_css_frame_set_data_index(frame, terminal_index);
-+        verifexitval(retval == 0, EINVAL);
-+    } else {
-+        if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
-+            ia_css_param_terminal_t *pterminal =
-+                (ia_css_param_terminal_t *)terminal;
-+
-+            pterminal->param_payload.terminal_index = terminal_index;
-+            retval = 0;
-+        } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
-+            ia_css_program_terminal_t *pterminal =
-+                (ia_css_program_terminal_t *)terminal;
-+
-+            pterminal->param_payload.terminal_index = terminal_index;
-+            retval = 0;
-+        } else if (ia_css_is_terminal_program_control_init_terminal(terminal)
-+                == true) {
-+            ia_css_program_control_init_terminal_t *pterminal =
-+                (ia_css_program_control_init_terminal_t *)terminal;
-+
-+            pterminal->param_payload.terminal_index = terminal_index;
-+            retval = 0;
-+        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
-+                true) {
-+            ia_css_spatial_param_terminal_t *pterminal =
-+                (ia_css_spatial_param_terminal_t *)terminal;
-+
-+            pterminal->param_payload.terminal_index = terminal_index;
-+            retval = 0;
-+        } else {
-+            return retval;
-+        }
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_set_terminal_index failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
-+    const ia_css_terminal_t *terminal,
-+    const ia_css_terminal_manifest_t *terminal_manifest,
-+    const uint16_t nof_fragments)
-+{
-+    DECLARE_ERRVAL
-+    bool invalid_flag = false;
-+
-+    const ia_css_data_terminal_t *dterminal =
-+        (ia_css_data_terminal_t *)terminal;
-+    const ia_css_data_terminal_manifest_t *dt_manifest =
-+        (ia_css_data_terminal_manifest_t *)terminal_manifest;
-+    const ia_css_frame_descriptor_t *frame_descriptor;
-+    ia_css_frame_format_bitmap_t man_frame_format_bitmap;
-+    ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
-+    uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
-+    uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_data_terminal_valid enter\n");
-+
-+    frame_descriptor =
-+        ia_css_data_terminal_get_frame_descriptor(dterminal);
-+    verifexitval(frame_descriptor != NULL, EFAULT);
-+    man_frame_format_bitmap =
-+        ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+                    dt_manifest);
-+    proc_frame_format_bitmap =
-+        ia_css_frame_format_bit_mask(
-+                frame_descriptor->frame_format_type);
-+    /*
-+     * TODO: Replace by 'validation of frame format type'.
-+     * Currently frame format type is not correctly set by manifest,
-+     * waiting for HSD 1804260604
-+     */
-+    if (man_frame_format_bitmap > 0) {
-+        if ((man_frame_format_bitmap &
-+                    proc_frame_format_bitmap) == 0) {
-+            uint32_t *bitmap_arr =
-+                (uint32_t *)&man_frame_format_bitmap;
-+
-+            NOT_USED(bitmap_arr);
-+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+                "Frame format type not defined in manifest\n");
-+            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+                " man bitmap_arr[]: %d,%d\n",
-+                bitmap_arr[1], bitmap_arr[0]);
-+            bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
-+            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+                " proc bitmap_arr[]: %d,%d\n",
-+                bitmap_arr[1], bitmap_arr[0]);
-+        }
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "Frame format bitmap not defined in manifest\n");
-+    }
-+    ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
-+    /*
-+     * TODO: Replace by validation of Minimal frame column dimensions.
-+     *  Currently not correctly set by manifest yet,
-+     *  waiting for HSD 1804260604
-+     */
-+    if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
-+        min_value[IA_CSS_COL_DIMENSION])) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "Minimal frame column dimensions not set correctly (by manifest)\n");
-+    }
-+    /*
-+     * TODO: Replace by validation of Minimal frame row dimensions.
-+     * Currently not correctly set by manifest yet,
-+     * waiting for HSD 1804260604
-+     */
-+    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
-+        min_value[IA_CSS_ROW_DIMENSION]) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "Minimal frame row dimensions not set correctly (by manifest)\n");
-+    }
-+
-+    ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
-+    /*
-+     * TODO: Replace by validation of Maximal frame column dimensions.
-+     * Currently not correctly set by manifest yet,
-+     * waiting for HSD 1804260604
-+     */
-+    if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
-+        max_value[IA_CSS_COL_DIMENSION]) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "Maximal frame column dimensions not set correctly (by manifest)\n");
-+    }
-+    /*
-+     * TODO: Replace by validation of Maximal frame row dimensions.
-+     * Currently not correctly set by manifest yet,
-+     * waiting for HSD 1804260604
-+     */
-+    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
-+        max_value[IA_CSS_ROW_DIMENSION]) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "Maximal frame row dimensions not set correctly (by manifest)\n");
-+    }
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
-+        min_value[IA_CSS_COL_DIMENSION],
-+        min_value[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
-+        max_value[IA_CSS_COL_DIMENSION],
-+        max_value[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
-+        frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
-+        frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
-+    /*
-+     * TODO: Add validation of fragment dimensions.
-+     * Currently not set by manifest yet, waiting for HSD 1804260604
-+     */
-+    NOT_USED(nof_fragments);
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_data_terminal_valid() invalid argument\n");
-+        return false;
-+    } else {
-+        return (!invalid_flag);
-+    }
-+}
-+
-+STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
-+    const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
-+        *man_seq_info_desc,
-+    const ia_css_kernel_fragment_sequencer_info_desc_t
-+        *term_seq_info_desc)
-+{
-+    NOT_USED(man_seq_info_desc);
-+    NOT_USED(term_seq_info_desc);
-+
-+    /* slice dimension column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_slice_dimension: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_slice_dimension: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_slice_dimension: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+
-+    /* slice dimension row */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_slice_dimension: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_slice_dimension: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_slice_dimension: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+
-+    /* slice count column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_slice_count: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_slice_count: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_slice_count: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+
-+    /* slice count row */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_slice_count: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_slice_count: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_slice_count: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+
-+    /* decimation factor column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_point_decimation_factor: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_point_decimation_factor: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
-+        );
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_point_decimation_factor: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
-+        );
-+
-+    /* decimation factor row */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_point_decimation_factor: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_point_decimation_factor: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_point_decimation_factor[
-+                    IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_point_decimation_factor: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_point_decimation_factor[
-+                    IA_CSS_ROW_DIMENSION]);
-+
-+    /* index column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+    /* index row */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+
-+    /* dimension column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_overlay_pixel_dimension: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_overlay_pixel_dimension: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_overlay_pixel_dimension: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+    /* dimension column */
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "fragment_grid_overlay_pixel_dimension: %d\n",
-+        term_seq_info_desc->
-+        fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "max_fragment_grid_overlay_pixel_dimension: %d\n",
-+        man_seq_info_desc->
-+        max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+        "min_fragment_grid_overlay_pixel_dimension: %d\n",
-+        man_seq_info_desc->
-+        min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
-+    const ia_css_terminal_t    *terminal,
-+    const ia_css_terminal_manifest_t *terminal_manifest,
-+    const uint16_t nof_fragments)
-+{
-+    DECLARE_ERRVAL
-+    bool invalid_flag = false;
-+    uint16_t frag_idx;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_program_terminal_valid enter\n");
-+
-+    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
-+        uint16_t frag_seq_info_count, seq_idx;
-+        const ia_css_program_terminal_t *prog_term;
-+        const ia_css_program_terminal_manifest_t *prog_term_man;
-+
-+        prog_term = (const ia_css_program_terminal_t *)terminal;
-+        prog_term_man =
-+            (const ia_css_program_terminal_manifest_t *)
-+            terminal_manifest;
-+        frag_seq_info_count =
-+            prog_term_man->
-+            kernel_fragment_sequencer_info_manifest_info_count;
-+
-+        for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
-+            const ia_css_kernel_fragment_sequencer_info_desc_t
-+            *term_seq_info_desc;
-+            const
-+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+            man_seq_info_desc;
-+
-+            term_seq_info_desc =
-+        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+                    prog_term, frag_idx, seq_idx,
-+                    frag_seq_info_count);
-+            verifexitval(term_seq_info_desc != NULL, EFAULT);
-+            man_seq_info_desc =
-+        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
-+                    (prog_term_man, seq_idx);
-+            verifexitval(man_seq_info_desc != NULL, EFAULT);
-+
-+            ia_css_program_terminal_seq_info_print(
-+                man_seq_info_desc, term_seq_info_desc);
-+            /* slice dimension column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+            /* slice dimension row */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+
-+            /* slice count column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+            /* slice count row */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION]);
-+
-+            /* decimation factor column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+            /* decimation factor row */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION]);
-+
-+            /* index column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+            /* index row */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+
-+            /* dimension column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION]);
-+
-+            /* dimension column */
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION] >
-+                man_seq_info_desc->
-+                max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+            invalid_flag = invalid_flag ||
-+                (term_seq_info_desc->
-+                fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION] <
-+                man_seq_info_desc->
-+                min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+        }
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_program_terminal_valid() invalid argument\n");
-+        return false;
-+    }
-+    if (invalid_flag == true) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_is_program_terminal_valid(): validation failed\n");
-+        /* TODO: program terminal parameters not correctly defined,
-+         * disable validation result until issues has been solved
-+         */
-+        return true;
-+    }
-+    return (!invalid_flag);
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
-+    const ia_css_terminal_t *terminal,
-+    const ia_css_terminal_manifest_t *terminal_manifest,
-+    const uint16_t nof_fragments)
-+{
-+    DECLARE_ERRVAL
-+    bool invalid_flag = false;
-+    uint16_t frag_idx;
-+
-+    uint16_t slice_idx, section_idx;
-+
-+    const ia_css_sliced_param_terminal_t *sliced_term =
-+        (const ia_css_sliced_param_terminal_t *)terminal;
-+    verifexitval(sliced_term != NULL, EFAULT);
-+    const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
-+        (const ia_css_sliced_param_terminal_manifest_t *)
-+        terminal_manifest;
-+    verifexitval(sliced_term_man != NULL, EFAULT);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_sliced_terminal_valid enter\n");
-+
-+    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
-+        const ia_css_fragment_slice_desc_t *fragment_slice_desc =
-+            ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+                sliced_term, frag_idx);
-+
-+        verifexitval(fragment_slice_desc != NULL, EFAULT);
-+
-+        for (slice_idx = 0;
-+            slice_idx < fragment_slice_desc->slice_count;
-+            slice_idx++) {
-+            for (section_idx = 0;
-+                section_idx <
-+                sliced_term_man->sliced_param_section_count;
-+                section_idx++) {
-+                const
-+                ia_css_sliced_param_manifest_section_desc_t *
-+                    slice_man_section_desc;
-+                const ia_css_slice_param_section_desc_t *
-+                    slice_section_desc;
-+
-+                slice_man_section_desc =
-+        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+                        sliced_term_man, section_idx);
-+                slice_section_desc =
-+        ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+                        sliced_term, frag_idx,
-+                        slice_idx, section_idx,
-+                        sliced_term_man->
-+                        sliced_param_section_count);
-+                verifexitval(slice_man_section_desc != NULL, EFAULT);
-+                verifexitval(slice_section_desc != NULL, EFAULT);
-+
-+                invalid_flag = invalid_flag ||
-+                    (slice_section_desc->mem_size >
-+                    slice_man_section_desc->max_mem_size);
-+            }
-+        }
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                "ia_css_is_sliced_terminal_valid() invalid argument\n");
-+        return false;
-+    } else {
-+        return (!invalid_flag);
-+    }
-+
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_valid(
-+    const ia_css_terminal_t    *terminal,
-+    const ia_css_terminal_manifest_t *terminal_manifest)
-+{
-+    DECLARE_ERRVAL
-+    bool is_valid = false;
-+    uint16_t nof_fragments;
-+    ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
-+
-+    verifexitval(NULL != terminal, EFAULT);
-+    verifexitval(NULL != terminal_manifest, EFAULT);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_is_terminal_valid enter\n");
-+
-+    nof_fragments = ia_css_data_terminal_get_fragment_count(
-+                (const ia_css_data_terminal_t *)terminal);
-+    terminal_type = ia_css_terminal_get_type(terminal);
-+
-+    switch (terminal_type) {
-+    case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+        is_valid = ia_css_is_data_terminal_valid(terminal,
-+                terminal_manifest, nof_fragments);
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+        is_valid = ia_css_is_program_terminal_valid(terminal,
-+                terminal_manifest, nof_fragments);
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+        /* Nothing to be validated for cached and spatial
-+        *  parameters, return valid
-+        */
-+        is_valid = true;
-+        break;
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+        is_valid = ia_css_is_sliced_terminal_valid(terminal,
-+                terminal_manifest, nof_fragments);
-+        break;
-+    default:
-+        /* Terminal type unknown, return invalid */
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_is_terminal_valid() Terminal type %x unknown\n",
-+            (int)terminal_type);
-+        is_valid = false;
-+        break;
-+    }
-+
-+EXIT:
-+    if (haserror(EFAULT)) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_is_terminal_valid() invalid argument\n");
-+        return false;
-+    }
-+    /* TODO: to be removed once all PGs pass validation */
-+    if (is_valid == false) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "ia_css_is_terminal_valid(): type: %d validation failed\n",
-+            terminal_type);
-+    }
-+    return is_valid;
-+}
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int
-+ia_css_program_control_init_terminal_init(
-+    ia_css_program_control_init_terminal_t *terminal,
-+    const ia_css_program_control_init_terminal_manifest_t *manifest,
-+    const ia_css_program_group_manifest_t *pg_manifest,
-+    ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+    int retval = -1;
-+    unsigned int i;
-+    unsigned int base_load_sec;
-+    unsigned int base_connect_sec;
-+    unsigned int load_index = 0;
-+    unsigned int connect_index = 0;
-+    unsigned int load_section_count = 0;
-+    unsigned int connect_section_count = 0;
-+
-+    ia_css_program_control_init_manifest_program_desc_t *man_progs;
-+    ia_css_program_manifest_t *prog_manifest;
-+
-+    verifjmpexit(terminal != NULL);
-+
-+    man_progs =
-+    ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
-+    verifjmpexit(man_progs != NULL);
-+
-+    for (i = 0; i < manifest->program_count; i++) {
-+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+        verifjmpexit(prog_manifest != NULL);
-+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+            continue;
-+        }
-+        load_section_count += man_progs[i].load_section_count;
-+        connect_section_count += man_progs[i].connect_section_count;
-+    }
-+
-+    terminal->program_count = manifest->program_count;
-+    terminal->program_section_desc_offset =
-+        sizeof(ia_css_program_control_init_terminal_t);
-+
-+    base_load_sec = /* base_load_sec relative to first program */
-+        terminal->program_count *
-+        sizeof(ia_css_program_control_init_program_desc_t);
-+
-+    base_connect_sec = base_load_sec +
-+        load_section_count *
-+        sizeof(ia_css_program_control_init_load_section_desc_t);
-+
-+    for (i = 0; i < terminal->program_count; i++) {
-+        ia_css_program_control_init_program_desc_t *prog;
-+
-+        prog = ia_css_program_control_init_terminal_get_program_desc(
-+                terminal, i);
-+        verifjmpexit(prog != NULL);
-+
-+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+        verifjmpexit(prog_manifest != NULL);
-+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+            prog->load_section_count = 0;
-+            prog->connect_section_count = 0;
-+            prog->load_section_desc_offset = 0;
-+            prog->connect_section_desc_offset  = 0;
-+            continue;
-+        }
-+
-+        prog->load_section_count = man_progs[i].load_section_count;
-+        prog->connect_section_count = man_progs[i].connect_section_count;
-+
-+        prog->load_section_desc_offset =
-+            base_load_sec +
-+            load_index *
-+            sizeof(ia_css_program_control_init_load_section_desc_t) -
-+            i * sizeof(ia_css_program_control_init_program_desc_t);
-+        prog->connect_section_desc_offset =
-+            base_connect_sec +
-+            connect_index *
-+            sizeof(ia_css_program_control_init_connect_section_desc_t) -
-+            i * sizeof(ia_css_program_control_init_program_desc_t);
-+
-+        load_index += man_progs[i].load_section_count;
-+        connect_index += man_progs[i].connect_section_count;
-+    }
-+    retval = 0;
-+EXIT:
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int
-+ia_css_program_control_init_terminal_get_descriptor_size(
-+        const ia_css_program_control_init_terminal_manifest_t *manifest,
-+        const ia_css_program_group_manifest_t *pg_manifest,
-+        ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+    unsigned int i;
-+    unsigned size = 0;
-+    unsigned load_section_count = 0;
-+    unsigned connect_section_count = 0;
-+    ia_css_program_control_init_manifest_program_desc_t *man_progs;
-+    ia_css_program_manifest_t *prog_manifest;
-+    verifjmpexit(manifest != NULL);
-+
-+    man_progs =
-+        ia_css_program_control_init_terminal_manifest_get_program_desc(
-+            manifest, 0);
-+    verifjmpexit(man_progs != NULL);
-+
-+    for (i = 0; i < manifest->program_count; i++) {
-+        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+        verifjmpexit(prog_manifest != NULL);
-+        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+            continue;
-+        }
-+        load_section_count += man_progs[i].load_section_count;
-+        connect_section_count += man_progs[i].connect_section_count;
-+    }
-+
-+    size = sizeof(ia_css_program_control_init_terminal_t) +
-+        manifest->program_count *
-+        sizeof(struct ia_css_program_control_init_program_desc_s) +
-+        load_section_count *
-+        sizeof(struct ia_css_program_control_init_load_section_desc_s) +
-+        connect_section_count  *
-+        sizeof(struct ia_css_program_control_init_connect_section_desc_s);
-+EXIT:
-+    return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+void ia_css_program_control_init_terminal_print(
-+    const ia_css_program_control_init_terminal_t *terminal)
-+{
-+    unsigned int prog_idx, sec_idx;
-+    ia_css_program_control_init_program_desc_t *prog;
-+    ia_css_program_control_init_load_section_desc_t *load_sec;
-+    ia_css_program_control_init_connect_section_desc_t *connect_sec;
-+    unsigned mem_offset;
-+    verifjmpexit(terminal != NULL);
-+
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+        "program_count: %d, payload_fragment_stride: %d\n",
-+        terminal->program_count,
-+        terminal->payload_fragment_stride);
-+
-+    for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
-+        prog = ia_css_program_control_init_terminal_get_program_desc(
-+            terminal, prog_idx);
-+        verifjmpexit(prog != NULL);
-+        mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
-+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
-+            prog->control_info.process_id,
-+            prog->control_info.num_done_events);
-+
-+        if (prog->load_section_count > 0) {
-+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
-+        }
-+        for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
-+            load_sec =
-+                ia_css_program_control_init_terminal_get_load_section_desc(
-+                    prog, sec_idx);
-+            verifjmpexit(load_sec != NULL);
-+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+                "\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
-+                "mem_size: %d, mode_bitmask: %x\n",
-+                load_sec->device_descriptor_id.data,
-+                mem_offset,
-+                load_sec->mem_size,
-+                load_sec->mode_bitmask);
-+            mem_offset += load_sec->mem_size;
-+        }
-+        if (prog->connect_section_count > 0) {
-+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
-+        }
-+        for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
-+            connect_sec =
-+                ia_css_program_control_init_terminal_get_connect_section_desc(
-+                    prog, sec_idx);
-+            verifjmpexit(connect_sec != NULL);
-+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+                "\t\tdevice_descriptor_id: 0x%08x, "
-+                "connect_terminal_ID: %d, connect_section_idx: %d, "
-+                "mode_bitmask: %x\n",
-+                connect_sec->device_descriptor_id.data,
-+                connect_sec->connect_terminal_ID,
-+                connect_sec->connect_section_idx,
-+                connect_sec->mode_bitmask);
-+        }
-+    }
-+EXIT:
-+    return;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_program_desc_t *
-+ia_css_program_control_init_terminal_get_program_desc(
-+    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
-+    const unsigned int program_index)
-+{
-+    ia_css_program_control_init_program_desc_t *program_desc_base;
-+    ia_css_program_control_init_program_desc_t *program_desc = NULL;
-+
-+    verifjmpexit(prog_ctrl_init_terminal != NULL);
-+    verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
-+
-+    program_desc_base = (ia_css_program_control_init_program_desc_t *)
-+        (((const char *)prog_ctrl_init_terminal) +
-+         prog_ctrl_init_terminal->program_section_desc_offset);
-+    program_desc = &(program_desc_base[program_index]);
-+
-+EXIT:
-+    return program_desc;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
-+    const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+    ia_css_process_id_t process_id = 0;
-+
-+    verifjmpexit(program_desc != NULL);
-+
-+    process_id = program_desc->control_info.process_id;
-+
-+EXIT:
-+    return process_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
-+    const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+    uint8_t num_done_events = 0;
-+
-+    verifjmpexit(program_desc != NULL);
-+
-+    num_done_events = program_desc->control_info.num_done_events;
-+
-+EXIT:
-+    return num_done_events;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+void ia_css_program_control_init_terminal_set_control_info(
-+    ia_css_program_control_init_program_desc_t *program_desc,
-+    ia_css_process_id_t process_id,
-+    uint8_t num_done_events)
-+{
-+    verifjmpexit(program_desc != NULL);
-+
-+    program_desc->control_info.process_id = process_id;
-+    program_desc->control_info.num_done_events = num_done_events;
-+
-+EXIT:
-+    return;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
-+    const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+    assert(program_desc != NULL);
-+    return program_desc->connect_section_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
-+    const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+    assert(program_desc != NULL);
-+    return program_desc->load_section_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
-+    const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+    assert(program_desc != NULL);
-+    return program_desc->load_section_mem_offset;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_load_section_desc_t *
-+ia_css_program_control_init_terminal_get_load_section_desc(
-+    const ia_css_program_control_init_program_desc_t *program_desc,
-+    const unsigned int load_section_index)
-+{
-+    ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
-+    ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
-+
-+    verifjmpexit(program_desc != NULL);
-+    verifjmpexit(load_section_index < program_desc->load_section_count);
-+
-+    load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
-+        (((const char *)program_desc) +
-+         program_desc->load_section_desc_offset);
-+    load_section_desc = &(load_section_desc_base[load_section_index]);
-+
-+EXIT:
-+    return load_section_desc;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_connect_section_desc_t *
-+ia_css_program_control_init_terminal_get_connect_section_desc(
-+    const ia_css_program_control_init_program_desc_t *program_desc,
-+    const unsigned int connect_section_index)
-+{
-+    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
-+    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
-+
-+    verifjmpexit(program_desc != NULL);
-+    verifjmpexit(connect_section_index < program_desc->connect_section_count);
-+
-+    connect_sec_desc_base =
-+        (ia_css_program_control_init_connect_section_desc_t *)
-+        (((const char *)program_desc) +
-+         program_desc->connect_section_desc_offset);
-+    connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
-+
-+EXIT:
-+    return connect_sec_desc;
-+}
-+
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
-new file mode 100644
-index 000000000000..3255e10f9f7e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
-@@ -0,0 +1,621 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal_manifest.h
-+ *
-+ * Define the methods on the terminal manifest object that are not part of a
-+ * single interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <ia_css_psys_terminal_manifest.sim.h>
-+
-+#include <ia_css_psys_terminal_manifest.hsys.user.h>
-+
-+#include <ia_css_program_group_data.h>    /* ia_css_frame_format_bitmap_t */
-+#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
-+
-+#include <type_support.h>        /* size_t */
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*!
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+/*! Check if the terminal manifest object specifies a spatial param terminal
-+ * type
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Check if the terminal manifest object specifies a program terminal type
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_program_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Check if the terminal manifest object specifies a program control init terminal type
-+ *
-+ * @param [in]    manifest            terminal manifest object
-+ *
-+ * @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_program_control_init_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Check if the terminal manifest object specifies a (cached) parameter
-+ * terminal type
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_parameter_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Check if the terminal manifest object specifies a (sliced) parameter
-+ * terminal type
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_sliced_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Check if the terminal manifest object specifies a data terminal type
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return is_data_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_data_terminal(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Get the broad terminal category
-+
-+ @param    manifest[in]            terminal manifest object
-+
-+ @return Terminal category enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the broad terminal category
-+
-+ @param    manifest[in]            terminal manifest object
-+ @param    category[in]            terminal category
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_category(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_cat_t category);
-+
-+/*! Get the direction of data flow for the terminal payload
-+
-+ @param    manifest[in]            terminal manifest object
-+
-+ @return Terminal direction enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the direction of data flow for the terminal payload
-+
-+ @param    manifest[in]            terminal manifest object
-+ @param    direction[in]            terminal direction
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_direction(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_dir_t direction);
-+
-+/*! Get the Rate Of Update (ROU) for the terminal payload
-+
-+ @param    manifest[in]            terminal manifest object
-+
-+ @return Terminal rate-of-update enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the Rate Of Update (ROU) for the terminal payload
-+
-+ @param    manifest[in]            terminal manifest object
-+ @param    rate_of_update[in]        terminal rate of update
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_rate_of_update(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_rou_t rate_of_update);
-+
-+/*! Get the buffer type for the connect terminal pointer
-+
-+ This function is intended for connect terminals only.  If called
-+ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
-+
-+ @param    manifest[in]            terminal manifest object
-+
-+ @return Connect terminal buffer type enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the buffer type for the connect terminal pointer
-+
-+  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
-+
-+ @param    manifest[in]            terminal manifest object
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_buffer_type(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_connect_buf_type_t connect_buf_type);
-+
-+/*! Get the stored size of the terminal manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return size, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_terminal_manifest_get_size(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Get the (pointer to) the program group manifest parent of the terminal
-+ * manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return the pointer to the parent, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the (pointer to) the program group manifest parent of the terminal
-+ * manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+ @param    [in]    terminal_offset        this terminal's offset from
-+                    program_group_manifest base address.
-+
-+ @return < 0 on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_parent_offset(
-+    ia_css_terminal_manifest_t            *manifest,
-+    int32_t                        terminal_offset);
-+
-+/*! Get the type of the terminal manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
-+    manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the type of the terminal manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+ @param    [in]    terminal_type        terminal type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_type(
-+    ia_css_terminal_manifest_t            *manifest,
-+    const ia_css_terminal_type_t            terminal_type);
-+
-+/*! Set the ID of the terminal manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+ @param    [in]    ID                terminal ID
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_ID(
-+    ia_css_terminal_manifest_t            *manifest,
-+    const ia_css_terminal_ID_t            ID);
-+
-+/*! Get the type of the terminal manifest object
-+
-+ @param [in]    manifest            terminal manifest object
-+
-+ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Get the ID of the associated connection terminal
-+
-+  Only valid for load terminals.
-+
-+  @param    manifest[in]            terminal manifest object
-+
-+  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
-+  OR if there is no associated connect terminal
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
-+    const ia_css_terminal_manifest_t        *manifest);
-+
-+/*! Set the ID of the associated connection terminal
-+
-+  Only valid for load terminals.
-+
-+  @param    manifest[in]            terminal manifest object
-+  @param    ID[in]                terminal ID
-+
-+  @return < 0 on invalid manifest argument (including when
-+  manifest describes a connect terminal, unless ID is
-+  IA_CSS_TERMINAL_INVALID_ID)
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_ID(
-+    ia_css_terminal_manifest_t            *manifest,
-+    const ia_css_terminal_ID_t            ID);
-+
-+/*! Returns the maximum payload size for an instance of the terminal
-+   described in a manifest entry.
-+
-+   The payload size is the sum of the sizes of all
-+   parameter sections for load terminals, or the maximum buffer size
-+   for connect terminals.
-+
-+   @param manifest[in] Terminal manifest handle
-+
-+   @return Maximum size in bytes of the terminal payload
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_terminal_manifest_get_max_payload_size(
-+    const ia_css_terminal_manifest_t *manifest);
-+
-+/*! Returns the maximum payload size for an instance of the terminal
-+   described in a manifest entry.
-+
-+   The payload size is the sum of the sizes of all
-+   parameter sections for load terminals, or the maximum buffer size
-+   for connect terminals.
-+
-+   @param manifest[in] Terminal manifest handle
-+   @param max_payload_size[in] Maximum payload size
-+
-+  @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_max_payload_size(
-+    ia_css_terminal_manifest_t            *manifest,
-+    uint32_t                             max_payload_size);
-+
-+/*! Get the supported frame types of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+
-+ @return frame format bitmap, 0 on invalid manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t
-+    ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+        const ia_css_data_terminal_manifest_t        *manifest);
-+
-+/*! Set the chosen frame type for the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    bitmap            frame format bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
-+    ia_css_data_terminal_manifest_t            *manifest,
-+    ia_css_frame_format_bitmap_t            bitmap);
-+
-+/*! Check if the (data) terminal manifest object supports compression
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+
-+ @return compression_support, true if compression is supported
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_data_terminal_manifest_can_support_compression(
-+    const ia_css_data_terminal_manifest_t        *manifest);
-+
-+/*! Set the compression support feature of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    compression_support        set true to support compression
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_compression_support(
-+    ia_css_data_terminal_manifest_t            *manifest,
-+    bool                        compression_support);
-+
-+/*! Set the supported connection types of the terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    bitmap            connection bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_connection_bitmap(
-+    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
-+
-+/*! Get the connection bitmap of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+
-+ @return connection bitmap, 0 on invalid manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
-+        const ia_css_data_terminal_manifest_t        *manifest);
-+
-+/*! Get the kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+
-+ @return kernel bitmap, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
-+    const ia_css_data_terminal_manifest_t        *manifest);
-+
-+/*! Set the kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    kernel_bitmap        kernel dependency bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_kernel_bitmap(
-+    ia_css_data_terminal_manifest_t            *manifest,
-+    const ia_css_kernel_bitmap_t            kernel_bitmap);
-+
-+/*! Set the unique kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    index            kernel dependency bitmap index
-+
-+ @return < 0 on invalid argument(s)
-+ */
-+extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
-+    ia_css_data_terminal_manifest_t            *manifest,
-+    const unsigned int                index);
-+
-+/*! Set the min size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    min_size            Minimum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_set_min_size(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the max size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    max_size            Maximum size of the frame array
-+
-+  @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_data_terminal_manifest_set_max_size(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the min size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    min_size            Minimum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_min_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the max size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    max_size            Maximum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_max_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the min fragment size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    min_size            Minimum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_set_min_fragment_size(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the max fragment size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    max_size            Maximum size of the fragment array
-+
-+  @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_data_terminal_manifest_set_max_fragment_size(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the min fragment size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    min_size            Minimum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_min_fragment_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the max fragment size of the (data) terminal manifest object
-+
-+ @param [in]    manifest            (data) terminal manifest object
-+ @param    [in]    max_size            Maximum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_max_fragment_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*!
-+ * Get the program control init connect section count for program prog.
-+ * @param [in] prog program control init terminal program desc
-+ * @return number of connect section for program prog.
-+ */
-+
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
-+    const ia_css_program_control_init_manifest_program_desc_t *prog);
-+
-+/*!
-+ * Get the program control init load section count for program prog.
-+ * @param [in] prog program control init terminal program desc
-+ * @return number of load section for program prog.
-+ */
-+
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
-+    const ia_css_program_control_init_manifest_program_desc_t *prog);
-+
-+/*!
-+ * Get the program control init terminal manifest size.
-+ * @param [in] nof_programs        Number of programs.
-+ * @param [in] nof_load_sections        Array of size nof_programs,
-+ *                    encoding the number of load sections.
-+ * @param [in] nof_connect_sections    Array of size nof_programs,
-+ *                    encoding the number of connect sections.
-+ * @return < 0 on invalid manifest argument
-+ */
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
-+    const uint16_t nof_programs,
-+    const uint16_t *nof_load_sections,
-+    const uint16_t *nof_connect_sections);
-+
-+/*!
-+ * Get the program control init terminal manifest program desc.
-+ * @param [in] terminal        Program control init terminal.
-+ * @param [in] program        Number of programs.
-+ * @return program control init terminal program desc (or NULL if error).
-+ */
-+extern
-+ia_css_program_control_init_manifest_program_desc_t *
-+ia_css_program_control_init_terminal_manifest_get_program_desc(
-+    const ia_css_program_control_init_terminal_manifest_t *terminal,
-+    unsigned int program);
-+
-+/*!
-+ * Initialize the program control init terminal manifest.
-+ * @param [in] nof_programs        Number of programs
-+ * @param [in] nof_load_sections        Array of size nof_programs,
-+ *                    encoding the number of load sections.
-+ * @param [in] nof_connect_sections    Array of size nof_programs,
-+ *                    encoding the number of connect sections.
-+ * @return < 0 on invalid manifest argument
-+ */
-+extern
-+int ia_css_program_control_init_terminal_manifest_init(
-+    ia_css_program_control_init_terminal_manifest_t *terminal,
-+    const uint16_t nof_programs,
-+    const uint16_t *nof_load_sections,
-+    const uint16_t *nof_connect_sections);
-+
-+/*!
-+ * Pretty prints the program control init terminal manifest.
-+ * @param [in] terminal        Program control init terminal.
-+ */
-+extern
-+void ia_css_program_control_init_terminal_manifest_print(
-+    ia_css_program_control_init_terminal_manifest_t *terminal);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_terminal_manifest_impl.h"
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..1a7b7995a848
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.hsys.user.h
-+ *
-+ * Define the methods on the termianl manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+/*! Print the terminal manifest object to file/stream
-+
-+ @param    manifest[in]            terminal manifest object
-+ @param    fid[out]                file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_terminal_manifest_print(
-+    const ia_css_terminal_manifest_t    *manifest,
-+    void                    *fid);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
-new file mode 100644
-index 000000000000..22c40422fce7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal_manifest.sim.h
-+ *
-+ * Define the methods on the terminal manifest object: Simulation only
-+ */
-+
-+#include <type_support.h>                    /* size_t */
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_defs.h"
-+
-+/*! Create (the storage for) the terminal manifest object
-+
-+ @param    terminal_type[in]    type of the terminal manifest {parameter, data}
-+
-+ @return NULL on error
-+ */
-+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
-+    const ia_css_terminal_type_t            terminal_type);
-+
-+/*! Destroy (the storage of) the terminal manifest object
-+
-+ @param    manifest[in]            terminal manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
-+    ia_css_terminal_manifest_t                *manifest);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
-new file mode 100644
-index 000000000000..8c99fa5d0782
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
-@@ -0,0 +1,745 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+/* Data object types on the terminals */
-+#include <ia_css_program_group_data.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include <error_support.h>
-+#include <print_support.h>
-+#include <misc_support.h>
-+#include "ia_css_psys_static_trace.h"
-+#include "ia_css_psys_static_storage_class.h"
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_program_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_program_control_init_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_parameter_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    /* will return an error value on error */
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_data_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    /* will return an error value on error */
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_data_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+        (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_sliced_terminal(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_type_t terminal_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
-+
-+    terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
-+        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_terminal_manifest_get_size(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    size_t size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_size(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        size = manifest->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_terminal_manifest_get_size: invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_type(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        terminal_type = manifest->terminal_type;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_terminal_manifest_get_type: invalid argument\n");
-+    }
-+    return terminal_type;
-+}
-+
-+/** Temporary implementation of attributes based on terminal type ID
-+ *
-+ *  A later implementation in the PG manifest generator tool will
-+ *  replace this and thus remove the dependency on the legacy
-+ *  terminal type.
-+ */
-+static void ia_css_terminal_manifest_set_attributes_by_type(
-+    ia_css_terminal_manifest_t *manifest,
-+    const ia_css_terminal_type_t terminal_type)
-+{
-+    /* Set defaults for most cases, and change in the later code for the rest. */
-+    ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
-+    ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
-+    ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
-+    ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
-+
-+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
-+        category = IA_CSS_TERMINAL_CAT_CONNECT;
-+    }
-+    ia_css_terminal_manifest_set_category(manifest, category);
-+
-+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
-+        direction = IA_CSS_TERMINAL_DIR_OUT;
-+    }
-+    ia_css_terminal_manifest_set_direction(manifest, direction);
-+
-+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
-+        rou = IA_CSS_TERMINAL_ROU_FRAG;
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+            rou = IA_CSS_TERMINAL_ROU_STREAM;
-+    }
-+    ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
-+
-+    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
-+        connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
-+    } else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+             (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
-+            connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
-+    }
-+    ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
-+}
-+
-+/** Temporary implementation for new fields until the manfifest generator
-+ *  tool will be enhance to set values directly.
-+ *
-+ *  - Attibutes are set to meaningful values by mapping terminal type to
-+ *  attributes
-+ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
-+ *  - max_payload_size is set to UINT32_MAX
-+ */
-+static void ia_css_terminal_manifest_set_new_fields(
-+    ia_css_terminal_manifest_t *manifest,
-+    const ia_css_terminal_type_t terminal_type)
-+{
-+    ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
-+    assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
-+    assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_type(
-+    ia_css_terminal_manifest_t *manifest,
-+    const ia_css_terminal_type_t terminal_type)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_type(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->terminal_type = terminal_type;
-+        ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_type failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_ID(
-+    ia_css_terminal_manifest_t *manifest,
-+    const ia_css_terminal_ID_t ID)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->ID = ID;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_ID failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_ID_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = manifest->ID;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_ID failed\n");
-+        retval = IA_CSS_TERMINAL_INVALID_ID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
-+    const ia_css_terminal_manifest_t        *manifest)
-+{
-+    ia_css_terminal_ID_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_connect_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = manifest->assoc_ID;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_connect_ID failed\n");
-+        retval = IA_CSS_TERMINAL_INVALID_ID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
-+    const ia_css_terminal_manifest_t        *manifest)
-+{
-+    ia_css_terminal_cat_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_category(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = (ia_css_terminal_cat_t)manifest->attributes.category;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_category failed\n");
-+        retval = IA_CSS_TERMINAL_CAT_INVALID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_category(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_cat_t category)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_category(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->attributes.category = category;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_category failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
-+    const ia_css_terminal_manifest_t        *manifest)
-+{
-+    ia_css_terminal_dir_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_direction(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_direction failed\n");
-+        retval = IA_CSS_TERMINAL_DIR_INVALID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_direction(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_dir_t direction)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_direction(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->attributes.direction = direction;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_direction failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
-+    const ia_css_terminal_manifest_t        *manifest)
-+{
-+    ia_css_terminal_rou_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_rate_of_update failed\n");
-+        retval = IA_CSS_TERMINAL_ROU_INVALID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_rate_of_update(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_terminal_rou_t rate_of_update)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->attributes.rou = rate_of_update;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
-+    const ia_css_terminal_manifest_t        *manifest)
-+{
-+    ia_css_connect_buf_type_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_connect_buffer_type failed\n");
-+        retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_buffer_type(
-+    ia_css_terminal_manifest_t        *manifest,
-+    ia_css_connect_buf_type_t connect_buf_type)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->attributes.connect_buf_type = connect_buf_type;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_ID(
-+    ia_css_terminal_manifest_t            *manifest,
-+    const ia_css_terminal_ID_t            ID)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_connect_ID(): enter:\n");
-+
-+    if (manifest != NULL &&
-+        ((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
-+        (IA_CSS_TERMINAL_INVALID_ID == ID))) {
-+        manifest->assoc_ID = ID;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_terminal_manifest_get_max_payload_size(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_terminal_ID_t retval;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        retval = manifest->max_payload_size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_get_max_payload_size failed\n");
-+        retval = IA_CSS_TERMINAL_INVALID_ID;
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_max_payload_size(
-+    ia_css_terminal_manifest_t            *manifest,
-+    uint32_t                             max_payload_size)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->max_payload_size = max_payload_size;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
-+    const ia_css_terminal_manifest_t *manifest)
-+{
-+    ia_css_program_group_manifest_t    *parent = NULL;
-+    char *base;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_get_parent(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    base = (char *)((char *)manifest + manifest->parent_offset);
-+
-+    parent = (ia_css_program_group_manifest_t *)(base);
-+EXIT:
-+    return parent;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_parent_offset(
-+    ia_css_terminal_manifest_t *manifest,
-+    int32_t terminal_offset)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_terminal_manifest_set_parent_offset(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    /* parent is at negative offset away from current terminal offset*/
-+    manifest->parent_offset = -terminal_offset;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
-+ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+    const ia_css_data_terminal_manifest_t *manifest)
-+{
-+    ia_css_frame_format_bitmap_t bitmap = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        bitmap = manifest->frame_format_bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    ia_css_frame_format_bitmap_t bitmap)
-+{
-+    int ret = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->frame_format_bitmap = bitmap;
-+        ret = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
-+            ret);
-+    }
-+
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_data_terminal_manifest_can_support_compression(
-+    const ia_css_data_terminal_manifest_t *manifest)
-+{
-+    bool compression_support = false;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        /* compression_support is used boolean encoded in uint8_t.
-+         * So we only need to check
-+         * if this is non-zero
-+         */
-+        compression_support = (manifest->compression_support != 0);
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
-+    }
-+
-+    return compression_support;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_compression_support(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    bool compression_support)
-+{
-+    int ret = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->compression_support =
-+            (compression_support == true) ? 1 : 0;
-+        ret = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
-+            ret);
-+    }
-+
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
-+    const ia_css_data_terminal_manifest_t *manifest)
-+{
-+    ia_css_connection_bitmap_t connection_bitmap = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        connection_bitmap = manifest->connection_bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
-+    }
-+    return connection_bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_connection_bitmap(
-+    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
-+{
-+    int ret = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
-+        assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
-+
-+        manifest->connection_bitmap = bitmap;
-+        ret = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
-+    }
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
-+    const ia_css_data_terminal_manifest_t *manifest)
-+{
-+    ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        kernel_bitmap = manifest->kernel_bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
-+    }
-+    return kernel_bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_kernel_bitmap(
-+    ia_css_data_terminal_manifest_t    *manifest,
-+    const ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->kernel_bitmap = kernel_bitmap;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
-+            retval);
-+    }
-+
-+    return retval;
-+}
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
-new file mode 100644
-index 000000000000..ef3b79157d43
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
-@@ -0,0 +1,102 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
-+#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
-+
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_program_group_data.h"
-+#include "ia_css_psys_manifest_types.h"
-+
-+#define    N_UINT16_IN_DATA_TERMINAL_STRUCT    2
-+#define    N_UINT8_IN_DATA_TERMINAL_STRUCT        3
-+#define    N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT    1
-+
-+/* ========================= Data terminal - START ========================= */
-+
-+#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
-+    + IA_CSS_FRAME_STRUCT_BITS \
-+    + IA_CSS_STREAM_STRUCT_BITS \
-+    + IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_CONNECTION_TYPE_BITS \
-+    + (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
-+    + (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)    \
-+    + (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
-+
-+/**
-+ * The (data) terminal can be attached to a buffer or a stream.
-+ * The stream interface is not necessarily limited to strict in-order access.
-+ * For a stream the restriction is that contrary to a buffer it cannot be
-+ * addressed directly, i.e. it behaves as a port,
-+ * but it may support stream_pos() and/or seek() operations
-+ */
-+struct ia_css_data_terminal_s {
-+    /** Data terminal base class */
-+    ia_css_terminal_t base;
-+    /** Properties of the image data attached to the terminal */
-+    ia_css_frame_descriptor_t frame_descriptor;
-+    /** Data buffer handle attached to the terminal */
-+    ia_css_frame_t frame;
-+    /** (exclusive) Data stream handle attached to the terminal
-+     * if the data is sourced over a device port
-+     *
-+     * @note No known use of the field.
-+     */
-+    ia_css_stream_t stream;
-+    /** Reserved
-+    * @note No known intent for this reservation field. */
-+    uint32_t reserved;
-+    /** Tranfer method for send/receving data to/from this terminal. */
-+    ia_css_connection_type_t connection_type;
-+    /** Offset in bytes from the start of this structure to a Array[fragment_count] of
-+     *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
-+     *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
-+     */
-+    uint16_t fragment_descriptor_offset;
-+    /** Size of streaming to GEN buffer in lines. This field will be used only
-+     *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
-+     */
-+    uint16_t stream2gen_buffer_size;
-+    /** Kernel id that this terminal is associated with.  If that kernel
-+     *  is disabled, this terminal is considered disabled as well.
-+     *  Must be set the single kernel defined in the manifest for this terminal's
-+     *  ID (ia_css_terminal_s::ID). */
-+    uint8_t kernel_id;
-+    /** Indicate to which subgraph this terminal belongs
-+     * for common constraints
-+     *
-+     * @note No known use.
-+     */
-+    uint8_t subgraph_id;
-+    /** Link ID of the data terminal.  Two terminals can optionally be
-+     *  marked as linked to each other by setting the same link ID.
-+     *  Hardware topology or logical or algorithmic constraints may restrict the
-+     *  terminal that can be so linked.
-+     *  In current practice, link ID's have special meaning related to
-+     *  the connection type (see "connection_type" field in this structure) or
-+     *  synchronization of program groups.
-+     *  @see ia_css_isys_link_id_t
-+     *  @see ia_css_data_barrier_link_id_t
-+     *  @see ia_css_stream2gen_link_id_t */
-+    uint8_t link_id;
-+    /** Padding for 64bit alignment */
-+    uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
-+};
-+/* ========================== Data terminal - END ========================== */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
-new file mode 100644
-index 000000000000..23f84fd981be
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TRANSPORT_H
-+#define __IA_CSS_PSYS_TRANSPORT_H
-+
-+#include <ia_css_psys_transport_dep.h>        /* ia_css_psys_cmd_queues */
-+#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
-+
-+#include <type_support.h>
-+
-+typedef enum ia_css_psys_event_queues {
-+    /** The in-order queue for event returns */
-+    IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
-+    IA_CSS_N_PSYS_EVENT_QUEUE_ID
-+} ia_css_psys_event_queue_ID_t;
-+
-+typedef enum ia_css_psys_event_types {
-+    /** No error to report. */
-+    IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
-+    /** Unknown unhandled error */
-+    IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
-+    /* Retrieving remote object: */
-+    /** Object ID not found */
-+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
-+    /** Objects too big, or size is zero. */
-+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
-+    /** Failed to load whole process group from tproxy/dma  */
-+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
-+    /** The proper package could not be found */
-+    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
-+    /* Process group: */
-+    /** Failed to run, error while loading frame */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
-+    /** Failed to run, error while loading fragment */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
-+    /** The process count of the process group is zero */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
-+    /** Process(es) initialization */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
-+    /** Aborted (after host request) */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
-+    /** NULL pointer in the process group */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
-+    /** Process group validation failed */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
-+    /** Error handling- invalid frame detected by CSI (ISYS) */
-+    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
-+} ia_css_psys_event_type_t;
-+
-+#define IA_CSS_PSYS_CMD_BITS    64
-+struct ia_css_psys_cmd_s {
-+    /** The command issued to the process group */
-+    uint16_t    command;
-+    /** Message field of the command */
-+    uint16_t    msg;
-+    /** The context reference (process group/buffer set/...) */
-+    uint32_t    context_handle;
-+};
-+
-+#define IA_CSS_PSYS_EVENT_BITS    128
-+typedef struct ia_css_psys_event_s {
-+    /** The (return) status of the command issued to
-+     * the process group this event refers to
-+     */
-+    uint16_t    status;
-+    /** The command issued to the process group this event refers to */
-+    uint16_t    command;
-+    /** The context reference (process group/buffer set/...) */
-+    uint32_t    context_handle;
-+    /** This token (size) must match the token registered
-+     * in a process group
-+     */
-+    uint64_t    token;
-+} ia_css_psys_event_s_t;
-+
-+struct ia_css_psys_buffer_s {
-+    /** The in-order queue for scheduled process groups */
-+    void        *host_buffer;
-+    vied_vaddress_t    *isp_buffer;
-+};
-+
-+#endif /* __IA_CSS_PSYS_TRANSPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
-new file mode 100644
-index 000000000000..5010c5b7a7e7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
-@@ -0,0 +1,66 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
-+#define __IA_CSS_PSYS_TRANSPORT_DEP_H
-+
-+/*
-+ * The ID's of the Psys specific queues.
-+ */
-+typedef enum ia_css_psys_cmd_queues {
-+    /**< The in-order queue for scheduled process groups */
-+    IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
-+    /**< The in-order queue for commands changing psys or
-+     * process group state
-+     */
-+    IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
-+    /**< All in-order queues for dedicated PPG commands */
-+    IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG6_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG7_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG8_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG9_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG10_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG11_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG12_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG13_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG14_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG15_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG16_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG17_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG18_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG19_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG20_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG21_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG22_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG23_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG24_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG25_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG26_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG27_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG28_COMMAND_ID,
-+    IA_CSS_PSYS_CMD_QUEUE_PPG29_COMMAND_ID,
-+    IA_CSS_N_PSYS_CMD_QUEUE_ID
-+} ia_css_psys_cmd_queue_ID_t;
-+
-+#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
-+
-+#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
-new file mode 100644
-index 000000000000..9033b8d1a19a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
-@@ -0,0 +1,25 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_H
-+#define __IA_CSS_PSYSAPI_H
-+
-+#include <ia_css_psys_process.hsys.user.h>
-+#include <ia_css_psys_process.hsys.kernel.h>
-+#include <ia_css_psys_process_group.hsys.user.h>
-+#include <ia_css_psys_process_group.hsys.kernel.h>
-+
-+#endif /* __IA_CSS_PSYSAPI_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
-new file mode 100644
-index 000000000000..89c63a75c817
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
-@@ -0,0 +1,35 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
-+#define __IA_CSS_PSYSAPI_FW_VERSION_H
-+
-+/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
-+#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
-+
-+enum ia_css_process_group_protocol_version {
-+    /**
-+     * Legacy protocol
-+     */
-+    IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
-+    /**
-+     * Persistent process group support protocol
-+     */
-+    IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
-+    IA_CSS_PROCESS_GROUP_N_PROTOCOLS
-+};
-+
-+#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
-new file mode 100644
-index 000000000000..a98c47c3ecf4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
-@@ -0,0 +1,80 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_TRACE_H
-+#define __IA_CSS_PSYSAPI_TRACE_H
-+
-+#include "ia_css_trace.h"
-+
-+#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
-+#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
-+#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
-+
-+/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
-+ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
-+ * psysapi.mk fill it will be set by default to no trace
-+ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
-+ */
-+#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+#if !defined(PSYSAPI_TRACE_CONFIG)
-+    #define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
-+#endif
-+
-+/* Module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_TRACE_CONFIG))
-+    /* Module specific trace setting */
-+    #if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
-+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
-+    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
-+        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
-+    #else
-+        #error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
-+    #endif
-+#else
-+    #error "PSYSAPI_TRACE_CONFIG not defined"
-+#endif
-+
-+/* Overriding submodules in PSYSAPI with a specific tracing level */
-+/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
-+
-+#endif /* __IA_CSS_PSYSAPI_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
-new file mode 100644
-index 000000000000..fbe6222a4e0a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
-@@ -0,0 +1,199 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_H
-+#define __IA_CSS_RBM_H
-+
-+#include "ia_css_rbm_storage_class.h"
-+#include <type_support.h>
-+
-+/*
-+ * IPU6 adds a lot of mux/demux/blk,
-+ * 96 bits is not enough
-+ * need 160 bits (has to multiply of 32 bits)
-+ * after X2B / DOL / PAF enabled in isa_lb PG
-+ */
-+#define IA_CSS_RBM_BITS 160
-+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
-+ * problems in the compiler.
-+ */
-+#define IA_CSS_RBM_ELEM_TYPE uint32_t
-+#define IA_CSS_RBM_ELEM_BITS \
-+    (sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
-+#define IA_CSS_RBM_NOF_ELEMS \
-+    ((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
-+
-+/** Users should make no assumption about the actual type of
-+ * ia_css_rbm_t.
-+ */
-+typedef struct {
-+    IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
-+} ia_css_rbm_elems_t;
-+typedef ia_css_rbm_elems_t ia_css_rbm_t;
-+
-+/** Print the bits of a routing bitmap
-+ * @return < 0 on error
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_rbm_print(
-+    const ia_css_rbm_t    bitmap,
-+    void *fid);
-+
-+/** Create an empty routing bitmap
-+ * @return bitmap = 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_clear(void);
-+
-+/** Creates the complement of a routing bitmap
-+ * @param    bitmap[in] routing bitmap
-+ * @return ~bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_complement(
-+    const ia_css_rbm_t bitmap);
-+
-+/** Create the union of two routing bitmaps
-+ * @param    bitmap0[in]    routing bitmap 0
-+ * @param    bitmap1[in]    routing bitmap 1
-+ * @return bitmap0 | bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_union(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1);
-+
-+/** Create the intersection of two routing bitmaps
-+ * @param    bitmap0[in]    routing bitmap 0
-+ * @param    bitmap1[in] routing bitmap 1
-+ * @return bitmap0 & bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_intersection(
-+    const ia_css_rbm_t            bitmap0,
-+    const ia_css_rbm_t            bitmap1);
-+
-+/** Check if the routing bitmaps is empty
-+ * @param bitmap[in] routing bitmap
-+ * @return bitmap == 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_empty(
-+    const ia_css_rbm_t bitmap);
-+
-+/** Check if the intersection of two routing bitmaps is empty
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in] routing bitmap 1
-+ * @return (bitmap0 & bitmap1) == 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_intersection_empty(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1);
-+
-+/** Check if the second routing bitmap is a subset of the first (or equal)
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in routing bitmap 1
-+ * Note: An empty set is always a subset, this function
-+ * returns true if bitmap 1 is empty
-+ * @return (bitmap0 & bitmap1) == bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_subset(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1);
-+
-+/** Check if the routing bitmaps are equal
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in] routing bitmap 1
-+ * @return bitmap0 == bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_equal(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1);
-+
-+/** Checks whether a specific kernel bit is set
-+ * @return bitmap[index] == 1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_is_rbm_set(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index);
-+
-+/** Returns range of bits as integer
-+ * @return bitmap[index, index+size]
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_rbm_range_val(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index,
-+    const unsigned int size);
-+
-+/** Create the union of a routing bitmap with a onehot bitmap
-+ * with a bit set at index
-+ * @return bitmap[index] |= 1
-+*/
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_set(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index);
-+
-+/*! Set elem_index-th 32-bit element of the bitmap to elem_value
-+ * @return updated bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int elem_index,
-+    const uint32_t     elem_value);
-+
-+/** Creates routing bitmap using a uint64 value.
-+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_create_from_uint64(
-+    const uint64_t    value);
-+
-+/** Converts an ia_css_rbm_t type to uint64_t. Note that if
-+ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
-+ *  are returned.
-+ *  @return uint64_t representation of value
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+uint64_t ia_css_rbm_to_uint64(
-+    const ia_css_rbm_t value);
-+
-+/** Creates a routing bitmap with the bit at index 'index' removed.
-+ * @return ~(1 << index) & bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_unset(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index);
-+
-+/** Create a onehot routing bitmap with a bit set at index
-+ * @return bitmap[index] = 1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_bit_mask(
-+    const unsigned int index);
-+
-+#ifdef __IA_CSS_RBM_INLINE__
-+#include "ia_css_rbm_impl.h"
-+#endif /* __IA_CSS_RBM_INLINE__ */
-+
-+#endif /* __IA_CSS_RBM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
-new file mode 100644
-index 000000000000..0ed5684219c7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
-@@ -0,0 +1,410 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_rbm.h"
-+#include "type_support.h"
-+#include "misc_support.h"
-+#include "assert_support.h"
-+#include "math_support.h"
-+#include "ia_css_rbm_trace.h"
-+
-+STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
-+    const ia_css_rbm_t bitmap);
-+
-+STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
-+    const ia_css_rbm_t bitmap);
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_intersection_empty(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1)
-+{
-+    ia_css_rbm_t intersection;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_is_rbm_intersection_empty(): enter:\n");
-+
-+    intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
-+    return ia_css_is_rbm_empty(intersection);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_empty(
-+    const ia_css_rbm_t bitmap)
-+{
-+    unsigned int i;
-+    bool is_empty = true;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_is_rbm_empty(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        is_empty &= bitmap.data[i] == 0;
-+    }
-+    return is_empty;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_equal(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1)
-+{
-+    unsigned int i;
-+    bool is_equal = true;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_is_rbm_equal(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
-+    }
-+    return is_equal;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_subset(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1)
-+{
-+    unsigned int i;
-+    bool is_subset = true;
-+
-+    /* checks if bitmap1 is subset of bitmap 0 */
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_is_rbm_subset(): enter:\n");
-+
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
-+    }
-+
-+    return is_subset;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_clear(void)
-+{
-+    unsigned int i;
-+    ia_css_rbm_t bitmap = {{0} };
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_clear(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        bitmap.data[i] = 0;
-+    }
-+    return bitmap;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_complement(
-+    const ia_css_rbm_t bitmap)
-+{
-+    unsigned int i;
-+    ia_css_rbm_t result = {{0} };
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_complement(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        result.data[i] = ~bitmap.data[i];
-+    }
-+    return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_union(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1)
-+{
-+    unsigned int i;
-+    ia_css_rbm_t result = {{0} };
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_union(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
-+    }
-+    return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_intersection(
-+    const ia_css_rbm_t bitmap0,
-+    const ia_css_rbm_t bitmap1)
-+{
-+    unsigned int i;
-+    ia_css_rbm_t result = {{0} };
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_intersection(): enter:\n");
-+    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
-+    }
-+    return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_set(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index)
-+{
-+    ia_css_rbm_t bit_mask;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_set(): enter:\n");
-+
-+    bit_mask = ia_css_rbm_bit_mask(index);
-+    return ia_css_rbm_union(bitmap, bit_mask);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int elem_index,
-+    const uint32_t     elem_value)
-+{
-+    ia_css_rbm_t result = bitmap;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_set_element_from_uint32(): enter:\n");
-+
-+    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
-+
-+    if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
-+        result.data[elem_index] = elem_value;
-+    } else {
-+        assert(0);
-+    }
-+
-+    return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_create_from_uint64(
-+    const uint64_t value)
-+{
-+    unsigned int i;
-+    ia_css_rbm_t result;
-+    const unsigned int bits64 = sizeof(uint64_t) * 8;
-+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_create_from_uint64(): enter:\n");
-+
-+    result = ia_css_rbm_clear();
-+    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
-+        /* masking is done implictly, the MSB bits of casting will be chopped off */
-+        result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
-+            (value >> (i * IA_CSS_RBM_ELEM_BITS));
-+    }
-+
-+    return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+uint64_t ia_css_rbm_to_uint64(
-+    const ia_css_rbm_t value)
-+{
-+    const unsigned int bits64 = sizeof(uint64_t) * 8;
-+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
-+    unsigned int i;
-+    uint64_t res = 0;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_to_uint64(): enter:\n");
-+
-+    assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
-+    assert(nof_elems_bits64 > 0);
-+
-+    for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
-+        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
-+    }
-+    for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+        assert(value.data[i] == 0);
-+    }
-+    return res;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_unset(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index)
-+{
-+    ia_css_rbm_t result;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_unset(): enter:\n");
-+
-+    result = ia_css_rbm_bit_mask(index);
-+    result = ia_css_rbm_complement(result);
-+    return ia_css_rbm_intersection(bitmap, result);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_bit_mask(
-+    const unsigned int index)
-+{
-+    unsigned int elem_index;
-+    unsigned int elem_bit_index;
-+    ia_css_rbm_t bit_mask = ia_css_rbm_clear();
-+
-+    assert(index < IA_CSS_RBM_BITS);
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_bit_mask(): enter:\n");
-+    if (index < IA_CSS_RBM_BITS) {
-+        elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+        elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+        assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+
-+        bit_mask.data[elem_index] = 1 << elem_bit_index;
-+    }
-+    return bit_mask;
-+}
-+
-+STORAGE_CLASS_INLINE
-+int ia_css_rbm_compute_weight(
-+    const ia_css_rbm_t bitmap)
-+{
-+    ia_css_rbm_t loc_bitmap;
-+    int weight = 0;
-+    int i;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_compute_weight(): enter:\n");
-+
-+    loc_bitmap = bitmap;
-+
-+    /* In fact; do not need the iterator "i" */
-+    for (i = 0; (i < IA_CSS_RBM_BITS) &&
-+        !ia_css_is_rbm_empty(loc_bitmap); i++) {
-+        weight += ia_css_is_rbm_set(loc_bitmap, 0);
-+        loc_bitmap = ia_css_rbm_shift(loc_bitmap);
-+    }
-+
-+    return weight;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_rbm_range_val(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index,
-+    const unsigned int size)
-+{
-+    unsigned int elem_index;
-+    unsigned int elem_bit_index;
-+    unsigned int res;
-+    unsigned int elem_index_end;
-+    unsigned int mask;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
-+    assert(index < IA_CSS_RBM_BITS);
-+    /* Extract the bit range from the data array relevane entry */
-+    elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+    elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
-+    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+    mask =  (1 << size) - 1;
-+    res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
-+    /* In case that the bit range is divided between 2 different data array entries */
-+    if (elem_index != elem_index_end) {
-+        unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
-+        unsigned int second_elem_size = size - first_elem_size;
-+
-+        mask = (1 << second_elem_size) - 1;
-+        res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
-+    }
-+    return res;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_is_rbm_set(
-+    const ia_css_rbm_t bitmap,
-+    const unsigned int index)
-+{
-+    unsigned int elem_index;
-+    unsigned int elem_bit_index;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_is_rbm_set(): enter:\n");
-+
-+    assert(index < IA_CSS_RBM_BITS);
-+
-+    elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
-+}
-+
-+STORAGE_CLASS_INLINE
-+ia_css_rbm_t ia_css_rbm_shift(
-+    const ia_css_rbm_t bitmap)
-+{
-+    int i;
-+    unsigned int lsb_current_elem = 0;
-+    unsigned int lsb_previous_elem = 0;
-+    ia_css_rbm_t loc_bitmap;
-+
-+    IA_CSS_TRACE_0(RBM, VERBOSE,
-+        "ia_css_rbm_shift(): enter:\n");
-+
-+    loc_bitmap = bitmap;
-+
-+    for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
-+        lsb_current_elem = bitmap.data[i] & 0x01;
-+        loc_bitmap.data[i] >>= 1;
-+        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
-+        lsb_previous_elem = lsb_current_elem;
-+    }
-+    return loc_bitmap;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_rbm_print(
-+    const ia_css_rbm_t bitmap,
-+    void               *fid)
-+{
-+    int i;
-+    const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
-+
-+    NOT_USED(fid);
-+
-+    CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
-+    CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
-+
-+    if (IA_CSS_RBM_NOF_ELEMS == 1) {
-+        IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
-+            data[0]);
-+
-+    } else if (IA_CSS_RBM_NOF_ELEMS == 2) {
-+        IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
-+            data[1], data[0]);
-+
-+    } else if (IA_CSS_RBM_NOF_ELEMS == 3) {
-+        IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
-+            data[2], data[1], data[0]);
-+
-+    } else if (IA_CSS_RBM_NOF_ELEMS == 4) {
-+        IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
-+            data[3], data[2], data[1], data[0]);
-+
-+    } else {
-+        IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
-+
-+        for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
-+            IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
-+        }
-+        IA_CSS_TRACE_0(RBM, INFO, "}\n");
-+    }
-+
-+    return 0;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
-new file mode 100644
-index 000000000000..3145e0e10f2e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
-@@ -0,0 +1,146 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_H
-+#define __IA_CSS_RBM_MANIFEST_H
-+
-+#include "type_support.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+/** Returns the descriptor size of the RBM manifest.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_size(void);
-+
-+/** Initializes the RBM manifest.
-+ * @param rbm[in] Routing bitmap.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+void
-+ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
-+
-+/** Returns a pointer to the array of mux descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_mux_desc_t *
-+ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns the size of mux descriptors array.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns a pointer to the array of validation descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_validation_rule_t *
-+ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns the size of the validation descriptor array.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns a pointer to the array of terminal routing descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_terminal_routing_desc_t *
-+ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
-+
-+/** \brief Returns the size of the terminal routing descriptor array.
-+ * Note: pretty printing differs from on host and on IPU.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Pretty prints the routing bitmap manifest.
-+ * @param manifest[in] Routing bitmap manifest.
-+ */
-+void
-+ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
-+
-+/** \brief Pretty prints a RBM (routing bitmap).
-+ * Note: pretty printing differs from on host and on IPU.
-+ * @param rbm[in]             Routing bitmap.
-+ * @param mux[in]             List of mux descriptors corresponding to rbm.
-+ * @param mux_desc_count[in]  Number of muxes in list mux.
-+ */
-+void
-+ia_css_rbm_pretty_print(
-+    const ia_css_rbm_t *rbm,
-+    const ia_css_rbm_mux_desc_t *mux,
-+    unsigned int mux_desc_count);
-+
-+/** \brief check for the validity of a routing bitmap.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @param rbm[in]      Routing bitmap
-+ * @return true on match.
-+ */
-+bool
-+ia_css_rbm_manifest_check_rbm_validity(
-+    const ia_css_rbm_manifest_t *manifest,
-+    const ia_css_rbm_t *rbm);
-+
-+/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
-+ * @param rbm[in]             Routing bitmap.
-+ * @param mux[in]             List of mux descriptors corresponding to rbm.
-+ * @param mux_count[in]       Number of muxes in list mux.
-+ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
-+ * @param mux_id[in]          ID of mux to set configuration for.
-+ * @param value[in]           Value of the mux.
-+ * @return routing bitmap.
-+ */
-+ia_css_rbm_t
-+ia_css_rbm_set_mux(
-+    ia_css_rbm_t rbm,
-+    ia_css_rbm_mux_desc_t *mux,
-+    unsigned int mux_count,
-+    unsigned int gp_dev_id,
-+    unsigned int mux_id,
-+    unsigned int value);
-+
-+/** \brief Gets the value of a mux.
-+ * @param rbm      routing bitmap
-+ * @param mux_desc mux descriptor
-+ * @return Mux value corresponding to mux_desc, -1 on error.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+int
-+ia_css_rbm_get_mux_value(
-+    const ia_css_rbm_t *rbm,
-+    const ia_css_rbm_mux_desc_t *mux_desc);
-+
-+#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
-+#include "ia_css_rbm_manifest_impl.h"
-+#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
-+
-+#endif /* __IA_CSS_RBM_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
-new file mode 100644
-index 000000000000..662b9ef342fb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
-+#define __IA_CSS_RBM_MANIFEST_TYPES_H
-+
-+#include "ia_css_rbm.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
-+#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
-+#endif
-+#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
-+#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
-+#endif
-+#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
-+#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
-+#endif
-+#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
-+#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
-+#endif
-+
-+#define SIZE_OF_RBM_MUX_DESC_S ( \
-+    (4 * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_mux_desc_s {
-+    uint8_t gp_dev_id;
-+    uint8_t mux_id;
-+    uint8_t offset;
-+    uint8_t size_bits;
-+} ia_css_rbm_mux_desc_t;
-+
-+#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
-+      (1 * IA_CSS_RBM_BITS) \
-+    + (1 * IA_CSS_UINT32_T_BITS))
-+
-+typedef struct ia_css_rbm_validation_rule_s {
-+    ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
-+    uint32_t expected_value;
-+} ia_css_rbm_validation_rule_t;
-+
-+#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
-+    (4 * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_terminal_routing_desc_s {
-+    uint8_t terminal_id;
-+    uint8_t connection_state;
-+    uint8_t mux_id;
-+    uint8_t state;
-+} ia_css_rbm_terminal_routing_desc_t;
-+
-+#define SIZE_OF_RBM_MANIFEST_S ( \
-+      (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
-+    + (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
-+    + (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
-+    + (3 * IA_CSS_UINT16_T_BITS) \
-+    + (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_manifest_s {
-+#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
-+    ia_css_rbm_validation_rule_t
-+        validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
-+#endif
-+    uint16_t mux_desc_count;
-+    uint16_t validation_rule_count;
-+    uint16_t terminal_routing_desc_count;
-+
-+#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
-+    ia_css_rbm_mux_desc_t
-+        mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
-+#endif
-+
-+#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
-+    ia_css_rbm_terminal_routing_desc_t
-+        terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
-+#endif
-+
-+#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
-+    uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
-+#endif
-+} ia_css_rbm_manifest_t;
-+
-+#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
-new file mode 100644
-index 000000000000..5f72bd1736f5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
-@@ -0,0 +1,38 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
-+#define __IA_CSS_RBM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_RBM_INLINE__
-+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_RBM_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
-new file mode 100644
-index 000000000000..80086ca502f8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
-@@ -0,0 +1,79 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_TRACE_H
-+#define __IA_CSS_RBM_TRACE_H
-+
-+#include "ia_css_trace.h"
-+
-+/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
-+* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
-+*/
-+#define RBM_TRACE_LOG_LEVEL_OFF 1
-+#define RBM_TRACE_LOG_LEVEL_NORMAL 2
-+#define RBM_TRACE_LOG_LEVEL_DEBUG 3
-+
-+#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
-+
-+#if !defined(RBM_TRACE_CONFIG)
-+#    define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
-+#endif
-+
-+/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
-+#ifdef __HIVECC
-+#    ifndef HRT_CSIM
-+#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
-+#    else
-+#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+#    endif
-+#else
-+#    define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+#endif
-+
-+#if (defined(RBM_TRACE_CONFIG))
-+/* Module specific trace setting */
-+#    if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
-+/* RBM_TRACE_LOG_LEVEL_OFF */
-+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
-+#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
-+/* RBM_TRACE_LOG_LEVEL_NORMAL */
-+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
-+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
-+#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
-+/* RBM_TRACE_LOG_LEVEL_DEBUG */
-+#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_ENABLED
-+#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_ENABLED
-+#    else
-+#        error "No RBM_TRACE_CONFIG Tracing level defined"
-+#    endif
-+#else
-+#    error "RBM_TRACE_CONFIG not defined"
-+#endif
-+
-+#endif /* __RBM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
-new file mode 100644
-index 000000000000..9959c01f6dcc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
-@@ -0,0 +1,187 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_H
-+#define __IA_CSS_TERMINAL_H
-+
-+#include "type_support.h"
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_param_storage_class.h"
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_in_terminal_get_descriptor_size(
-+    const unsigned int nof_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_section_desc_t *
-+ia_css_param_in_terminal_get_param_section_desc(
-+    const ia_css_param_terminal_t *param_terminal,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_out_terminal_get_descriptor_size(
-+    const unsigned int nof_sections,
-+    const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_section_desc_t *
-+ia_css_param_out_terminal_get_param_section_desc(
-+    const ia_css_param_terminal_t *param_terminal,
-+    const unsigned int section_index,
-+    const unsigned int nof_sections,
-+    const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_param_terminal_create(
-+    ia_css_param_terminal_t *param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+    const unsigned int nof_frame_param_sections,
-+    const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_grid_desc_t *
-+ia_css_spatial_param_terminal_get_fragment_grid_desc(
-+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_frame_grid_param_section_desc_t *
-+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
-+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_spatial_param_terminal_create(
-+    ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal,
-+    const unsigned int nof_fragments,
-+    const uint32_t kernel_id
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
-+    const unsigned int nof_slice_param_sections,
-+    const unsigned int nof_slices[],
-+    const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_slice_desc_t *
-+ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_slice_param_section_desc_t *
-+ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int slice_index,
-+    const unsigned int section_index,
-+    const unsigned int nof_slice_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_sliced_param_terminal_create(
-+    ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal,
-+    const unsigned int nof_slice_param_sections,
-+    const unsigned int nof_slices[],
-+    const unsigned int nof_fragments,
-+    const uint32_t kernel_id
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_program_terminal_get_descriptor_size(
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_fragment_param_sections,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int nof_command_objs
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_param_section_desc_t *
-+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int section_index,
-+    const unsigned int nof_fragment_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_kernel_fragment_sequencer_info_desc_t *
-+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int info_index,
-+    const unsigned int nof_kernel_fragment_sequencer_infos
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_create(
-+    ia_css_program_terminal_t *program_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int nof_command_objs
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_get_command_base_offset(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int commands_slots_used,
-+    uint16_t *command_desc_offset
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+uint16_t *ia_css_program_terminal_get_line_count(
-+    const ia_css_kernel_fragment_sequencer_command_desc_t
-+    *kernel_fragment_sequencer_command_desc_base,
-+    const unsigned int set_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+    const unsigned int nof_frame_param_sections,
-+    const unsigned int nof_fragments
-+);
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "ia_css_terminal_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-+
-+#endif /* __IA_CSS_TERMINAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
-new file mode 100644
-index 000000000000..91dfc139ea9d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
-+#define __IA_CSS_TERMINAL_BASE_TYPES_H
-+
-+#include "type_support.h"
-+#include "ia_css_terminal_defs.h"
-+
-+#define N_UINT16_IN_TERMINAL_STRUCT        3
-+#define N_UINT32_IN_TERMINAL_STRUCT        1
-+#define N_PADDING_UINT8_IN_TERMINAL_STRUCT    1
-+
-+#define SIZE_OF_TERMINAL_STRUCT_BITS \
-+    (IA_CSS_TERMINAL_TYPE_BITS \
-+    + N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_TERMINAL_ID_BITS  \
-+    + N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/* ==================== Base Terminal - START ==================== */
-+/** Base structure for all terminal types.
-+ *
-+ *  Terminals describe an opening between a program group and the outside world.
-+ *  They come in various types (data, statisitics, parameters, etc.) which may have
-+ *  extensions specific to those types.  This structure is the base for all of those and
-+ *  must be the first field in any  subclassed terminal structure type.
-+ */
-+struct ia_css_terminal_s {                        /**< Base terminal */
-+    ia_css_terminal_type_t            terminal_type;        /**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
-+    uint32_t                payload_size;    /**< Size of buffer passed in buffer set for this terminal */
-+    int16_t                    parent_offset;        /**< Offset to the containing process group */
-+    uint16_t                size;            /**< Size of this whole terminal layout-structure, including subclassed extensions. */
-+    uint16_t                tm_index;        /**< Index of the terminal manifest object in the program group manifest. */
-+    ia_css_terminal_ID_t            ID;            /**< Absolute referal ID for this terminal, valid ID's != 0 */
-+    uint8_t                    padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
-+};
-+/* ==================== Base Terminal - END ==================== */
-+
-+#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
-new file mode 100644
-index 000000000000..0766c323681f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
-@@ -0,0 +1,209 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_DEFS_H
-+#define __IA_CSS_TERMINAL_DEFS_H
-+
-+#include "type_support.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define IA_CSS_TERMINAL_ID_BITS        8
-+typedef uint8_t                ia_css_terminal_ID_t;
-+#define IA_CSS_TERMINAL_INVALID_ID    ((ia_css_terminal_ID_t)(-1))
-+
-+/**
-+ * Terminal category
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_cat {
-+    IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
-+    IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
-+    IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_cat_t;
-+#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
-+
-+/**
-+ * Terminal direction
-+ *
-+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
-+ * output generated by IPU.
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_dir {
-+    IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
-+    IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
-+    IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_dir_t;
-+#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
-+
-+/**
-+ * Terminal Rate Of Update (ROU)
-+ *
-+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
-+ * output generated by IPU.
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_rou {
-+    IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
-+    IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
-+    IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
-+    IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_rou_t;
-+#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
-+
-+/**
-+ * Connect terminal payload content type
-+ *
-+ * Defines the broad usage of the buffers defined in connect terminals
-+ */
-+typedef enum ia_css_connect_buf_type {
-+    IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
-+    IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
-+    IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
-+    IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
-+} ia_css_connect_buf_type_t;
-+
-+/** Unknown or irrelevant buffer type */
-+#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
-+
-+/**
-+ * Terminal type identifier
-+ *
-+ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
-+ * and ia_css_connect_buf_type_t
-+ * To stage the changes, this type will remain - for now...
-+ *
-+ * Inital type to attribute mapping table for staging:
-+ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
-+ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
-+ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
-+ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
-+ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
-+ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
-+ */
-+typedef enum ia_css_terminal_type {
-+    /** Data input */
-+    IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
-+    /** Data output */
-+    IA_CSS_TERMINAL_TYPE_DATA_OUT,
-+    /** Type 6 parameter input */
-+    IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
-+    /** Type 1-5 parameter input.  Constant for all fragments in a frame. */
-+    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
-+    /** Type 1-5 parameter output */
-+    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
-+    /** Represent the new type of terminal for the
-+     * "spatial dependent parameters", when params go in
-+     */
-+    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
-+    /** Represent the new type of terminal for the
-+     * "spatial dependent parameters", when params go out
-+     */
-+    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
-+    /** Represent the new type of terminal for the
-+     * explicit slicing, when params go in
-+     */
-+    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
-+    /** Represent the new type of terminal for the
-+     * explicit slicing, when params go out
-+     */
-+    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
-+    /** State (private data) input */
-+    IA_CSS_TERMINAL_TYPE_STATE_IN,
-+    /** State (private data) output */
-+    IA_CSS_TERMINAL_TYPE_STATE_OUT,
-+    /** Program parameters, may change per fragment */
-+    IA_CSS_TERMINAL_TYPE_PROGRAM,
-+    /** Program control parameters.  Non-alogrithmic parameters for system devices. */
-+    IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
-+    IA_CSS_N_TERMINAL_TYPES
-+} ia_css_terminal_type_t;
-+
-+#define IA_CSS_TERMINAL_TYPE_BITS                32
-+
-+/* Temporary redirection needed to facilicate merging with the drivers
-+   in a backwards compatible manner */
-+#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
-+
-+/**
-+ * Dimensions of the data objects. Note that a C-style
-+ * data order is assumed. Data stored by row.
-+ */
-+typedef enum ia_css_dimension {
-+    /** The number of columns, i.e. the size of the row */
-+    IA_CSS_COL_DIMENSION = 0,
-+    /** The number of rows, i.e. the size of the column */
-+    IA_CSS_ROW_DIMENSION = 1,
-+    IA_CSS_N_DATA_DIMENSION = 2
-+} ia_css_dimension_t;
-+
-+#define IA_CSS_N_COMMAND_COUNT (4)
-+
-+#ifndef PIPE_GENERATION
-+/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
-+/**
-+ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
-+ */
-+typedef enum ia_css_isys_link_id {
-+    IA_CSS_ISYS_LINK_OFFLINE = 0,
-+    IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
-+    IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
-+} ia_css_isys_link_id_t;
-+#define N_IA_CSS_ISYS_LINK_ID    (IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
-+
-+/**
-+ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
-+ */
-+typedef enum ia_css_data_barrier_link_id {
-+    IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
-+    IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
-+    IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
-+    IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
-+    IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
-+    N_IA_CSS_DATA_BARRIER_LINK_ID
-+} ia_css_data_barrier_link_id_t;
-+
-+/**
-+ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
-+ * support.
-+ */
-+typedef enum ia_css_stream2gen_link_id {
-+    IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
-+    IA_CSS_STREAM2GEN_LINK_ID_1,
-+    IA_CSS_STREAM2GEN_LINK_ID_2,
-+    IA_CSS_STREAM2GEN_LINK_ID_3,
-+    N_IA_CSS_STREAM2GEN_LINK_ID
-+} ia_css_stream2gen_link_id_t;
-+
-+#endif /* #ifndef PIPE_GENERATION */
-+/** @} */
-+#endif /* __IA_CSS_TERMINAL_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
-new file mode 100644
-index 000000000000..ff6ff35c5bb8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
-@@ -0,0 +1,497 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_IMPL_H
-+#define __IA_CSS_TERMINAL_IMPL_H
-+
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_types.h"
-+#include "error_support.h"
-+#include "assert_support.h"
-+#include "storage_class.h"
-+#include "misc_support.h" /* for NOT_USED */
-+
-+/* Param Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_in_terminal_get_descriptor_size(
-+    const unsigned int nof_sections)
-+{
-+    return sizeof(ia_css_param_terminal_t) +
-+        nof_sections*sizeof(ia_css_param_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
-+    const ia_css_param_terminal_t *param_terminal,
-+    const unsigned int section_index)
-+{
-+    ia_css_param_section_desc_t *param_section_base;
-+    ia_css_param_section_desc_t *param_section_desc = NULL;
-+
-+    verifjmpexit(param_terminal != NULL);
-+
-+    param_section_base =
-+        (ia_css_param_section_desc_t *)
-+        (((const char *)param_terminal) +
-+                param_terminal->param_section_desc_offset);
-+    param_section_desc = &(param_section_base[section_index]);
-+
-+EXIT:
-+    return param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_out_terminal_get_descriptor_size(
-+    const unsigned int nof_sections,
-+    const unsigned int nof_fragments)
-+{
-+    return sizeof(ia_css_param_terminal_t) +
-+        nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
-+    const ia_css_param_terminal_t *param_terminal,
-+    const unsigned int section_index,
-+    const unsigned int nof_sections,
-+    const unsigned int fragment_index)
-+{
-+    ia_css_param_section_desc_t *param_section_base;
-+    ia_css_param_section_desc_t *param_section_desc = NULL;
-+
-+    verifjmpexit(param_terminal != NULL);
-+
-+    param_section_base =
-+        (ia_css_param_section_desc_t *)
-+            (((const char *)param_terminal) +
-+                param_terminal->param_section_desc_offset);
-+    param_section_desc =
-+        &(param_section_base[(nof_sections * fragment_index) +
-+                section_index]);
-+
-+EXIT:
-+    return param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_param_terminal_create(
-+    ia_css_param_terminal_t *param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal)
-+{
-+    if (param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    if (terminal_offset > (1<<15)) {
-+        return -EINVAL;
-+    }
-+
-+    param_terminal->base.terminal_type =
-+        is_input_terminal ?
-+        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
-+        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
-+    param_terminal->base.parent_offset =
-+        0 - ((int16_t)terminal_offset);
-+    param_terminal->base.size = terminal_size;
-+    param_terminal->param_section_desc_offset =
-+        sizeof(ia_css_param_terminal_t);
-+
-+    return 0;
-+}
-+
-+/* Spatial Param Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+    const unsigned int nof_frame_param_sections,
-+    const unsigned int nof_fragments)
-+{
-+    return sizeof(ia_css_spatial_param_terminal_t) +
-+        nof_frame_param_sections * sizeof(
-+                ia_css_frame_grid_param_section_desc_t) +
-+        nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_grid_desc_t *
-+ia_css_spatial_param_terminal_get_fragment_grid_desc(
-+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const unsigned int fragment_index)
-+{
-+    ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
-+    ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
-+
-+    verifjmpexit(spatial_param_terminal != NULL);
-+
-+    fragment_grid_desc_base =
-+        (ia_css_fragment_grid_desc_t *)
-+            (((const char *)spatial_param_terminal) +
-+            spatial_param_terminal->fragment_grid_desc_offset);
-+    fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
-+
-+EXIT:
-+    return fragment_grid_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_frame_grid_param_section_desc_t *
-+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
-+    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const unsigned int section_index)
-+{
-+    ia_css_frame_grid_param_section_desc_t *
-+        frame_grid_param_section_base;
-+    ia_css_frame_grid_param_section_desc_t *
-+        frame_grid_param_section_desc = NULL;
-+
-+    verifjmpexit(spatial_param_terminal != NULL);
-+
-+    frame_grid_param_section_base =
-+        (ia_css_frame_grid_param_section_desc_t *)
-+            (((const char *)spatial_param_terminal) +
-+        spatial_param_terminal->frame_grid_param_section_desc_offset);
-+    frame_grid_param_section_desc =
-+        &(frame_grid_param_section_base[section_index]);
-+
-+EXIT:
-+    return frame_grid_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_spatial_param_terminal_create(
-+    ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal,
-+    const unsigned int nof_fragments,
-+    const uint32_t kernel_id)
-+{
-+    if (spatial_param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    if (terminal_offset > (1<<15)) {
-+        return -EINVAL;
-+    }
-+
-+    spatial_param_terminal->base.terminal_type =
-+        is_input_terminal ?
-+        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
-+        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
-+    spatial_param_terminal->base.parent_offset =
-+        0 - ((int16_t)terminal_offset);
-+    spatial_param_terminal->base.size = terminal_size;
-+    spatial_param_terminal->kernel_id = kernel_id;
-+    spatial_param_terminal->fragment_grid_desc_offset =
-+        sizeof(ia_css_spatial_param_terminal_t);
-+    spatial_param_terminal->frame_grid_param_section_desc_offset =
-+        spatial_param_terminal->fragment_grid_desc_offset +
-+        (nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
-+
-+    return 0;
-+}
-+
-+/* Sliced terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
-+    const unsigned int nof_slice_param_sections,
-+    const unsigned int nof_slices[],
-+    const unsigned int nof_fragments)
-+{
-+    unsigned int descriptor_size = 0;
-+    unsigned int fragment_index;
-+    unsigned int nof_slices_total = 0;
-+
-+    verifjmpexit(nof_slices != NULL);
-+
-+    for (fragment_index = 0;
-+            fragment_index < nof_fragments; fragment_index++) {
-+        nof_slices_total += nof_slices[fragment_index];
-+    }
-+
-+    descriptor_size =
-+        sizeof(ia_css_sliced_param_terminal_t) +
-+        nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
-+        nof_slices_total*nof_slice_param_sections*sizeof(
-+            ia_css_fragment_param_section_desc_t);
-+
-+EXIT:
-+    return descriptor_size;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_slice_desc_t *
-+ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const unsigned int fragment_index
-+)
-+{
-+    ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
-+    ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
-+
-+    verifjmpexit(sliced_param_terminal != NULL);
-+
-+    fragment_slice_desc_base =
-+        (ia_css_fragment_slice_desc_t *)
-+            (((const char *)sliced_param_terminal) +
-+            sliced_param_terminal->fragment_slice_desc_offset);
-+    fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
-+
-+EXIT:
-+    return fragment_slice_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_slice_param_section_desc_t *
-+ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int slice_index,
-+    const unsigned int section_index,
-+    const unsigned int nof_slice_param_sections)
-+{
-+    ia_css_fragment_slice_desc_t *fragment_slice_desc;
-+    ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
-+    ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
-+
-+    fragment_slice_desc =
-+        ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+            sliced_param_terminal,
-+            fragment_index
-+            );
-+    verifjmpexit(fragment_slice_desc != NULL);
-+
-+    slice_param_section_desc_base =
-+        (ia_css_slice_param_section_desc_t *)
-+        (((const char *)sliced_param_terminal) +
-+        fragment_slice_desc->slice_section_desc_offset);
-+    slice_param_section_desc =
-+        &(slice_param_section_desc_base[(
-+            slice_index * nof_slice_param_sections) +
-+                section_index]);
-+
-+EXIT:
-+    return slice_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_sliced_param_terminal_create(
-+    ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const uint16_t is_input_terminal,
-+    const unsigned int nof_slice_param_sections,
-+    const unsigned int nof_slices[],
-+    const unsigned int nof_fragments,
-+    const uint32_t kernel_id)
-+{
-+    unsigned int fragment_index;
-+    unsigned int nof_slices_total = 0;
-+
-+    if (sliced_param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    if (terminal_offset > (1<<15)) {
-+        return -EINVAL;
-+    }
-+
-+    sliced_param_terminal->base.terminal_type =
-+        is_input_terminal ?
-+        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
-+        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
-+    sliced_param_terminal->base.parent_offset =
-+        0 - ((int16_t)terminal_offset);
-+    sliced_param_terminal->base.size = terminal_size;
-+    sliced_param_terminal->kernel_id = kernel_id;
-+    /* set here to use below to find the pointer */
-+    sliced_param_terminal->fragment_slice_desc_offset =
-+        sizeof(ia_css_sliced_param_terminal_t);
-+    for (fragment_index = 0;
-+            fragment_index < nof_fragments; fragment_index++) {
-+        ia_css_fragment_slice_desc_t *fragment_slice_desc =
-+            ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+                sliced_param_terminal,
-+                fragment_index);
-+        /*
-+         * Error handling not required at this point
-+         * since everything has been constructed/validated just above
-+         */
-+        fragment_slice_desc->slice_count = nof_slices[fragment_index];
-+        fragment_slice_desc->slice_section_desc_offset =
-+            sliced_param_terminal->fragment_slice_desc_offset +
-+            (nof_fragments * sizeof(
-+                    ia_css_fragment_slice_desc_t)) +
-+            (nof_slices_total * nof_slice_param_sections * sizeof(
-+                    ia_css_slice_param_section_desc_t));
-+        nof_slices_total += nof_slices[fragment_index];
-+    }
-+
-+    return 0;
-+}
-+
-+/* Program terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_program_terminal_get_descriptor_size(
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_fragment_param_sections,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int nof_command_objs)
-+{
-+    /*only one fragment used*/
-+    return sizeof(ia_css_program_terminal_t) +
-+        nof_fragment_param_sections *
-+        sizeof(ia_css_fragment_param_section_desc_t) +
-+        nof_fragments * nof_kernel_fragment_sequencer_infos *
-+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
-+        nof_command_objs * sizeof(
-+            ia_css_kernel_fragment_sequencer_command_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_param_section_desc_t *
-+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int section_index,
-+    const unsigned int nof_fragment_param_sections)
-+{
-+    ia_css_fragment_param_section_desc_t *
-+        fragment_param_section_desc_base;
-+    ia_css_fragment_param_section_desc_t *
-+        fragment_param_section_desc = NULL;
-+    NOT_USED(fragment_index);
-+
-+    verifjmpexit(program_terminal != NULL);
-+    verifjmpexit(section_index < nof_fragment_param_sections);
-+
-+    fragment_param_section_desc_base =
-+        (ia_css_fragment_param_section_desc_t *)
-+            (((const char *)program_terminal) +
-+            program_terminal->fragment_param_section_desc_offset);
-+    fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
-+EXIT:
-+    return fragment_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_kernel_fragment_sequencer_info_desc_t *
-+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int fragment_index,
-+    const unsigned int info_index,
-+    const unsigned int nof_kernel_fragment_sequencer_infos)
-+{
-+    ia_css_kernel_fragment_sequencer_info_desc_t *
-+        kernel_fragment_sequencer_info_desc_base;
-+    ia_css_kernel_fragment_sequencer_info_desc_t *
-+        kernel_fragment_sequencer_info_desc = NULL;
-+
-+    verifjmpexit(program_terminal != NULL);
-+    if (nof_kernel_fragment_sequencer_infos > 0) {
-+        verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
-+    }
-+
-+    kernel_fragment_sequencer_info_desc_base =
-+        (ia_css_kernel_fragment_sequencer_info_desc_t *)
-+        (((const char *)program_terminal) +
-+        program_terminal->kernel_fragment_sequencer_info_desc_offset);
-+    kernel_fragment_sequencer_info_desc =
-+        &(kernel_fragment_sequencer_info_desc_base[(fragment_index *
-+            nof_kernel_fragment_sequencer_infos) + info_index]);
-+
-+EXIT:
-+    return kernel_fragment_sequencer_info_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_create(
-+    ia_css_program_terminal_t *program_terminal,
-+    const uint16_t terminal_offset,
-+    const uint16_t terminal_size,
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int nof_command_objs)
-+{
-+    if (program_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    if (terminal_offset > (1<<15)) {
-+        return -EINVAL;
-+    }
-+
-+    program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
-+    program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
-+    program_terminal->base.size = terminal_size;
-+    program_terminal->kernel_fragment_sequencer_info_desc_offset =
-+        sizeof(ia_css_program_terminal_t);
-+    program_terminal->fragment_param_section_desc_offset =
-+        program_terminal->kernel_fragment_sequencer_info_desc_offset +
-+        (nof_fragments * nof_kernel_fragment_sequencer_infos *
-+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+        (nof_command_objs * sizeof(
-+            ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_get_command_base_offset(
-+    const ia_css_program_terminal_t *program_terminal,
-+    const unsigned int nof_fragments,
-+    const unsigned int nof_kernel_fragment_sequencer_infos,
-+    const unsigned int commands_slots_used,
-+    uint16_t *command_desc_offset)
-+{
-+    if (command_desc_offset == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    *command_desc_offset = 0;
-+
-+    if (program_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    *command_desc_offset =
-+        program_terminal->kernel_fragment_sequencer_info_desc_offset +
-+        (nof_fragments * nof_kernel_fragment_sequencer_infos *
-+        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+        (commands_slots_used * sizeof(
-+            ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint16_t *ia_css_program_terminal_get_line_count(
-+    const ia_css_kernel_fragment_sequencer_command_desc_t
-+    *kernel_fragment_sequencer_command_desc_base,
-+    const unsigned int set_count)
-+{
-+    uint16_t *line_count = NULL;
-+
-+    verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
-+    line_count =
-+        (uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
-+            set_count >> 2].line_count[set_count & 0x00000003]);
-+EXIT:
-+    return line_count;
-+}
-+
-+#endif /* __IA_CSS_TERMINAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
-new file mode 100644
-index 000000000000..1868b15708b7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
-@@ -0,0 +1,233 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_H
-+#define __IA_CSS_TERMINAL_MANIFEST_H
-+
-+#include "type_support.h"
-+#include "ia_css_param_storage_class.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
-+#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
-+#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
-+#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
-+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
-+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
-+
-+/** Returns the size in bytes required to store this
-+ *  terminal's manifest entry.
-+ *
-+ *  Used as part of binary manifest generation. It helps
-+ *  to determine the amount of memory required
-+ *  to store a parameter terminal manifest entry for
-+ *  allocation before initialization
-+ *
-+ *  @param [in] nof_sections Number of sections (==
-+ *  number of descriptors)
-+ *
-+ *  @return Size in bytes required for an entry.
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_terminal_manifest_get_size(
-+    const unsigned int nof_sections
-+);
-+
-+/** Initialize a parameter terminal manifest entry.
-+ *
-+ *  Used as part of binary manifest generation.
-+ *
-+ *  @param param_terminal Terminal entry to initialize.  Must
-+ *  have been allocated with the size determined by
-+ *  ia_css_param_terminal_manifest_get_size().
-+ *
-+ *  @return 0 on success, -EFAULT if param_terminal is NULL.
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_param_terminal_manifest_init(
-+    ia_css_param_terminal_manifest_t *param_terminal,
-+    const uint16_t section_count
-+);
-+
-+/** Returns a section descriptor for a parameter terminal.
-+ *
-+ *  @param param_terminal_manifest Parameter terminal manifest handle
-+ *  @param section_index Index of descriptor.  Must be smaller than the
-+ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
-+ *
-+ *  @return Pointer to a descriptor structure
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_manifest_section_desc_t *
-+ia_css_param_terminal_manifest_get_prm_sct_desc(
-+    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
-+    const unsigned int nof_frame_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_spatial_param_terminal_manifest_init(
-+    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
-+    const uint16_t section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_frame_grid_param_manifest_section_desc_t *
-+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+    const ia_css_spatial_param_terminal_manifest_t *
-+        spatial_param_terminal_manifest,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
-+    const unsigned int nof_slice_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_sliced_param_terminal_manifest_init(
-+    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
-+    const uint16_t section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_sliced_param_manifest_section_desc_t *
-+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+    const ia_css_sliced_param_terminal_manifest_t *
-+        sliced_param_terminal_manifest,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_program_terminal_manifest_get_size(
-+    const unsigned int nof_fragment_param_sections,
-+    const unsigned int nof_kernel_fragment_sequencer_infos
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_manifest_init(
-+    ia_css_program_terminal_manifest_t *program_terminal,
-+    const uint16_t fragment_param_section_count,
-+    const uint16_t kernel_fragment_seq_info_section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_param_manifest_section_desc_t *
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+    const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
-+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+    const unsigned int info_index
-+);
-+
-+/*! Getter for kernel id
-+
-+  The function return the kernel id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] param manifest section desc
-+
-+ @return kernel_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
-+ia_css_param_manifest_section_desc_get_kernel_id(
-+    const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for  region_id
-+
-+  The function return the region_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] param manifest section desc
-+
-+ @return region_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_region_id(
-+    const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for mem_type_id
-+
-+  The function return the mem_type_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] param manifest section desc
-+
-+ @return mem_type_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
-+    const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for kernel id
-+
-+  The function return the kernel id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] fragment manifest section desc
-+
-+ @return kernel_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+/*! Getter for  region_id
-+
-+  The function return the region_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] fragment manifest section desc
-+
-+ @return region_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+/*! Getter for mem_type_id
-+
-+  The function return the mem_type_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param    [in] fragment manifest section desc
-+
-+ @return mem_type_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "ia_css_terminal_manifest_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
-new file mode 100644
-index 000000000000..bf4f46c80b91
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
-+#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
-+
-+#include "ia_css_terminal_defs.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+typedef struct ia_css_terminal_manifest_attributes_t {
-+    uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
-+    uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
-+    uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
-+    uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
-+    uint16_t reserved:10;
-+    } ia_css_terminal_manifest_attributes_t;
-+#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
-+
-+#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT    0
-+#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    (IA_CSS_TERMINAL_TYPE_BITS \
-+    + IA_CSS_UINT32_T_BITS \
-+    + IA_CSS_UINT16_T_BITS \
-+    + IA_CSS_UINT16_T_BITS \
-+    + IA_CSS_TERMINAL_ATTRIBUTE_BITS \
-+    + IA_CSS_TERMINAL_ID_BITS \
-+    + IA_CSS_TERMINAL_ID_BITS \
-+    + (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
-+
-+/* ==================== Base Terminal Manifest - START ==================== */
-+struct ia_css_terminal_manifest_s {
-+    ia_css_terminal_type_t                terminal_type;        /**< Type ia_css_terminal_type_t */
-+    /**  Max size of payload buffer for instances of this terminal
-+     *
-+     *   For load terminals, this is the size of all sections, as defined in the manifest
-+     *   descriptors.  For connect terminals, this is the max buffer size.
-+     */
-+    uint32_t                    max_payload_size;
-+    int16_t                        parent_offset;        /**< Offset to the program group manifest */
-+    uint16_t                    size;            /**< Size of this whole terminal-manifest layout-structure */
-+    ia_css_terminal_manifest_attributes_t    attributes; /**< Bit fields describing the terminal attributes */
-+    ia_css_terminal_ID_t                ID; /**< The unique identifier of this terminal in the PG */
-+    /** The unique identifier of another terminal in the PG, associated with this one.
-+     *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
-+    ia_css_terminal_ID_t                assoc_ID;
-+#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
-+    uint8_t                        padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
-+#endif
-+};
-+
-+typedef struct ia_css_terminal_manifest_s
-+    ia_css_terminal_manifest_t;
-+
-+/* ==================== Base Terminal Manifest - END ==================== */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
-new file mode 100644
-index 000000000000..450a4b290434
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
-@@ -0,0 +1,391 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
-+#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
-+
-+#include "ia_css_terminal_manifest.h"
-+#include "error_support.h"
-+#include "assert_support.h"
-+#include "storage_class.h"
-+
-+STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
-+{
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_param_manifest_section_desc_t) %
-+            sizeof(uint32_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_spatial_param_terminal_manifest_t) %
-+            sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(
-+            ia_css_frame_grid_param_manifest_section_desc_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
-+            sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(
-+            ia_css_fragment_param_manifest_section_desc_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_fragment_param_manifest_section_desc_t) %
-+            sizeof(uint32_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(
-+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
-+        );
-+
-+    COMPILATION_ERROR_IF(0 != sizeof(
-+        ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
-+            sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_sliced_param_terminal_manifest_t) %
-+            sizeof(uint64_t));
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+        (CHAR_BIT * sizeof
-+            (ia_css_sliced_param_manifest_section_desc_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+        sizeof(ia_css_sliced_param_manifest_section_desc_t) %
-+            sizeof(uint64_t));
-+}
-+
-+/* Parameter Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_terminal_manifest_get_size(
-+    const unsigned int nof_sections)
-+{
-+
-+    return sizeof(ia_css_param_terminal_manifest_t) +
-+        nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_param_terminal_manifest_init(
-+    ia_css_param_terminal_manifest_t *param_terminal,
-+    const uint16_t section_count)
-+{
-+    if (param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    param_terminal->param_manifest_section_desc_count = section_count;
-+    param_terminal->param_manifest_section_desc_offset = sizeof(
-+                ia_css_param_terminal_manifest_t);
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_manifest_section_desc_t *
-+ia_css_param_terminal_manifest_get_prm_sct_desc(
-+    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
-+    const unsigned int section_index)
-+{
-+    ia_css_param_manifest_section_desc_t *param_manifest_section_base;
-+    ia_css_param_manifest_section_desc_t *
-+        param_manifest_section_desc = NULL;
-+
-+    verifjmpexit(param_terminal_manifest != NULL);
-+
-+    param_manifest_section_base =
-+        (ia_css_param_manifest_section_desc_t *)
-+        (((const char *)param_terminal_manifest)
-+        + param_terminal_manifest->param_manifest_section_desc_offset);
-+
-+    param_manifest_section_desc =
-+        &(param_manifest_section_base[section_index]);
-+
-+EXIT:
-+    return param_manifest_section_desc;
-+}
-+
-+/* Spatial Parameter Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
-+    const unsigned int nof_frame_param_sections)
-+{
-+    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
-+        nof_frame_param_sections * sizeof(
-+            ia_css_frame_grid_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_spatial_param_terminal_manifest_init(
-+    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
-+    const uint16_t section_count)
-+{
-+    if (spatial_param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    spatial_param_terminal->
-+        frame_grid_param_manifest_section_desc_count = section_count;
-+    spatial_param_terminal->
-+        frame_grid_param_manifest_section_desc_offset =
-+        sizeof(ia_css_spatial_param_terminal_manifest_t);
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_frame_grid_param_manifest_section_desc_t *
-+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+    const ia_css_spatial_param_terminal_manifest_t *
-+        spatial_param_terminal_manifest,
-+    const unsigned int section_index)
-+{
-+    ia_css_frame_grid_param_manifest_section_desc_t *
-+        frame_param_manifest_section_base;
-+    ia_css_frame_grid_param_manifest_section_desc_t *
-+        frame_param_manifest_section_desc = NULL;
-+
-+    verifjmpexit(spatial_param_terminal_manifest != NULL);
-+
-+    frame_param_manifest_section_base =
-+        (ia_css_frame_grid_param_manifest_section_desc_t *)
-+        (((const char *)spatial_param_terminal_manifest) +
-+            spatial_param_terminal_manifest->
-+            frame_grid_param_manifest_section_desc_offset);
-+    frame_param_manifest_section_desc =
-+        &(frame_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+    return frame_param_manifest_section_desc;
-+}
-+
-+/* Sliced Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
-+    const unsigned int nof_slice_param_sections)
-+{
-+    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
-+        nof_slice_param_sections *
-+        sizeof(ia_css_sliced_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_sliced_param_terminal_manifest_init(
-+    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
-+    const uint16_t section_count)
-+{
-+    if (sliced_param_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    sliced_param_terminal->sliced_param_section_count = section_count;
-+    sliced_param_terminal->sliced_param_section_offset =
-+        sizeof(ia_css_sliced_param_terminal_manifest_t);
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_sliced_param_manifest_section_desc_t *
-+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+    const ia_css_sliced_param_terminal_manifest_t *
-+        sliced_param_terminal_manifest,
-+    const unsigned int section_index)
-+{
-+    ia_css_sliced_param_manifest_section_desc_t *
-+        sliced_param_manifest_section_base;
-+    ia_css_sliced_param_manifest_section_desc_t *
-+        sliced_param_manifest_section_desc = NULL;
-+
-+    verifjmpexit(sliced_param_terminal_manifest != NULL);
-+
-+    sliced_param_manifest_section_base =
-+        (ia_css_sliced_param_manifest_section_desc_t *)
-+        (((const char *)sliced_param_terminal_manifest) +
-+            sliced_param_terminal_manifest->
-+            sliced_param_section_offset);
-+    sliced_param_manifest_section_desc =
-+        &(sliced_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+    return sliced_param_manifest_section_desc;
-+}
-+
-+/* Program Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_program_terminal_manifest_get_size(
-+    const unsigned int nof_fragment_param_sections,
-+    const unsigned int nof_kernel_fragment_sequencer_infos)
-+{
-+    return sizeof(ia_css_program_terminal_manifest_t) +
-+        nof_fragment_param_sections *
-+        sizeof(ia_css_fragment_param_manifest_section_desc_t) +
-+        nof_kernel_fragment_sequencer_infos *
-+        sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_manifest_init(
-+    ia_css_program_terminal_manifest_t *program_terminal,
-+    const uint16_t fragment_param_section_count,
-+    const uint16_t kernel_fragment_seq_info_section_count)
-+{
-+    if (program_terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    program_terminal->fragment_param_manifest_section_desc_count =
-+        fragment_param_section_count;
-+    program_terminal->fragment_param_manifest_section_desc_offset =
-+        sizeof(ia_css_program_terminal_manifest_t);
-+
-+    program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
-+        kernel_fragment_seq_info_section_count;
-+    program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
-+        sizeof(ia_css_program_terminal_manifest_t) +
-+        fragment_param_section_count*sizeof(
-+            ia_css_fragment_param_manifest_section_desc_t);
-+
-+    return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_param_manifest_section_desc_t *
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+    const unsigned int section_index)
-+{
-+    ia_css_fragment_param_manifest_section_desc_t *
-+        fragment_param_manifest_section_base;
-+    ia_css_fragment_param_manifest_section_desc_t *
-+        fragment_param_manifest_section = NULL;
-+
-+    verifjmpexit(program_terminal_manifest != NULL);
-+
-+    fragment_param_manifest_section_base =
-+        (ia_css_fragment_param_manifest_section_desc_t *)
-+        (((const char *)program_terminal_manifest) +
-+        program_terminal_manifest->
-+        fragment_param_manifest_section_desc_offset);
-+    fragment_param_manifest_section =
-+        &(fragment_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+    return fragment_param_manifest_section;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
-+    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+    const unsigned int info_index)
-+{
-+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+        kernel_manifest_fragment_sequencer_info_manifest_desc_base;
-+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+        kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
-+
-+    verifjmpexit(program_terminal_manifest != NULL);
-+
-+    kernel_manifest_fragment_sequencer_info_manifest_desc_base =
-+        (ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
-+        (((const char *)program_terminal_manifest) +
-+        program_terminal_manifest->
-+        kernel_fragment_sequencer_info_manifest_info_offset);
-+
-+    kernel_manifest_fragment_sequencer_info_manifest_desc =
-+        &(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
-+                info_index]);
-+
-+EXIT:
-+    return kernel_manifest_fragment_sequencer_info_manifest_desc;
-+}
-+
-+/* Start ...*/
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
-+    const ia_css_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_region_id(
-+    const ia_css_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
-+    const ia_css_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
-+    const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
-+}
-+
-+/* End ...*/
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
-new file mode 100644
-index 000000000000..220ac9b3faa8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
-@@ -0,0 +1,349 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
-+#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
-+
-+#include "ia_css_terminal_defs.h"
-+#include "type_support.h"
-+#include "ia_css_base_types.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
-+    (2 * IA_CSS_UINT16_T_BITS)
-+
-+/* =============== Cached Param Terminal Manifest - START ============== */
-+/** Descriptor for a single manifest parameter section.
-+ *
-+ * Each descriptor describes a single contiguous parameter payload that will
-+ * be written to hardware registers or other memory.  It defines the maximum
-+ * size of the section payload (critical for allocation and security), the device the
-+ * section belongs to, and the target memory type (usually device registers).
-+ *
-+ * A region ID allows specifying multiple sections for a single device when a
-+ * device's configuration registers are not all contigous.
-+ */
-+struct ia_css_param_manifest_section_desc_s {
-+    /** Maximum size of the related parameter region */
-+    uint16_t max_mem_size;
-+    /** mem_type, region and kernel_id
-+      * - mem_type - Memory targeted by this section
-+      * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+      * - Region - subsection id within the specified memory
-+      * - kernel_id - Indication of the kernel/device this parameter belongs to */
-+    uint16_t info;
-+};
-+
-+typedef struct ia_css_param_manifest_section_desc_s
-+    ia_css_param_manifest_section_desc_t;
-+
-+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
-+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    + (2*IA_CSS_UINT16_T_BITS) \
-+    + (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/** Frame constant parameters terminal manifest
-+ *
-+ * This is the "header" for a list of parameter sections described by
-+ * ia_css_param_manifest_section_desc_s.
-+ */
-+struct ia_css_param_terminal_manifest_s {
-+    /** Parameter terminal manifest base */
-+    ia_css_terminal_manifest_t base;
-+    /**
-+     * Number of cached parameter sections, coming from manifest
-+     * but also shared by the terminal
-+     */
-+    uint16_t param_manifest_section_desc_count;
-+    /**
-+     * Points to the variable array of
-+     * struct ia_css_param_section_desc_s
-+     */
-+    uint16_t param_manifest_section_desc_offset;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_param_terminal_manifest_s
-+    ia_css_param_terminal_manifest_t;
-+/* ================= Cached Param Terminal Manifest - End ================ */
-+
-+/* ================= Spatial Param Terminal Manifest - START ============= */
-+
-+#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
-+    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
-+    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
-+
-+struct ia_css_fragment_grid_manifest_desc_s {
-+    /* Min resolution width/height of the spatial parameters
-+     * for the fragment measured in compute units
-+     */
-+    uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /* Max resolution width/height of the spatial parameters
-+     * for the fragment measured in compute units
-+     */
-+    uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_fragment_grid_manifest_desc_s
-+    ia_css_fragment_grid_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
-+#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+    (1 * IA_CSS_UINT32_T_BITS \
-+    + 3 * IA_CSS_UINT8_T_BITS \
-+    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_frame_grid_param_manifest_section_desc_s {
-+    /* Maximum buffer total size allowed for
-+     * this frame of parameters
-+     */
-+    uint32_t max_mem_size;
-+    /* Memory space targeted by this section
-+     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+     */
-+    uint8_t mem_type_id;
-+    /* Region id within the specified memory space */
-+    uint8_t region_id;
-+    /* size in bytes of each compute unit for
-+     * the specified memory space and region
-+     */
-+    uint8_t elem_size;
-+    /* align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
-+};
-+
-+typedef struct ia_css_frame_grid_param_manifest_section_desc_s
-+    ia_css_frame_grid_param_manifest_section_desc_t;
-+
-+#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
-+    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
-+    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
-+
-+struct ia_css_frame_grid_manifest_desc_s {
-+    /* Min resolution width/height of the spatial parameters for
-+     * the frame measured in compute units
-+     */
-+    uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /* Max resolution width/height of the spatial parameters for
-+     * the frame measured in compute units
-+     */
-+    uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_frame_grid_manifest_desc_s
-+    ia_css_frame_grid_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
-+#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
-+    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
-+    + (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
-+    + (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
-+    + (2 * IA_CSS_UINT16_T_BITS) \
-+    + (2 * IA_CSS_UINT8_T_BITS) \
-+    + (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
-+    IA_CSS_UINT8_T_BITS))
-+
-+/** Spatial parameters terminal manifest */
-+struct ia_css_spatial_param_terminal_manifest_s {
-+    /** terminal manifest base object */
-+    ia_css_terminal_manifest_t base;
-+    /** Contains limits for the frame spatial parameters */
-+    ia_css_frame_grid_manifest_desc_t frame_grid_desc;
-+    /**
-+     * Constains limits for the fragment spatial parameters
-+     * - COMMON AMONG FRAGMENTS
-+     */
-+    ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
-+    /**
-+     * Number of frame spatial parameter sections, they are set
-+     * in slice-steps through frame processing
-+     */
-+    uint16_t frame_grid_param_manifest_section_desc_count;
-+    /**
-+     * Points to the variable array of
-+     * ia_css_frame_spatial_param_manifest_section_desc_t
-+     */
-+    uint16_t frame_grid_param_manifest_section_desc_offset;
-+    /**
-+     * Indication of the kernel this spatial parameter terminal belongs to
-+     * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
-+     */
-+    uint8_t kernel_id;
-+    /**
-+     * Groups together compute units in order to achieve alignment
-+     * requirements for transfes and to achieve canonical frame
-+     * representation
-+     */
-+    uint8_t compute_units_p_elem;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_spatial_param_terminal_manifest_s
-+    ia_css_spatial_param_terminal_manifest_t;
-+
-+/* ================= Spatial Param Terminal Manifest - END ================ */
-+
-+/* ================= Sliced Param Terminal Manifest - START =============== */
-+
-+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
-+#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+    (1 * IA_CSS_UINT32_T_BITS \
-+    + 2 * IA_CSS_UINT8_T_BITS \
-+    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_sliced_param_manifest_section_desc_s {
-+    /** Maximum size of the related parameter region */
-+    uint32_t max_mem_size;
-+    /**
-+     * Memory targeted by this section
-+     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+     */
-+    uint8_t mem_type_id;
-+    /** Region id within the specified memory */
-+    uint8_t region_id;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
-+};
-+
-+typedef struct ia_css_sliced_param_manifest_section_desc_s
-+    ia_css_sliced_param_manifest_section_desc_t;
-+
-+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
-+#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+    + 2 * IA_CSS_UINT16_T_BITS \
-+    + 1 * IA_CSS_UINT8_T_BITS \
-+    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/* Frame constant parameters terminal manifest */
-+struct ia_css_sliced_param_terminal_manifest_s {
-+    /** terminal manifest base object */
-+    ia_css_terminal_manifest_t base;
-+    /**
-+     * Number of the array elements
-+     * sliced_param_section_offset points to
-+     */
-+    uint16_t sliced_param_section_count;
-+    /**
-+     * Points to array of ia_css_sliced_param_manifest_section_desc_s
-+     * which constain info for the slicing of the parameters
-+     */
-+    uint16_t sliced_param_section_offset;
-+    /** Kernel identifier */
-+    uint8_t kernel_id;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
-+};
-+
-+typedef struct ia_css_sliced_param_terminal_manifest_s
-+    ia_css_sliced_param_terminal_manifest_t;
-+
-+/* ================= Slice Param Terminal Manifest - End =============== */
-+
-+/* ================= Program Terminal Manifest - START ================= */
-+
-+#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+    (2 * IA_CSS_UINT16_T_BITS)
-+
-+/** Fragment constant parameters manifest */
-+struct ia_css_fragment_param_manifest_section_desc_s {
-+    /** Maximum size of the related parameter region */
-+    uint16_t max_mem_size;
-+    /** (mem_type, region and kernel_id) */
-+    uint16_t info;
-+};
-+
-+typedef struct ia_css_fragment_param_manifest_section_desc_s
-+    ia_css_fragment_param_manifest_section_desc_t;
-+
-+#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
-+    (10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
-+    /* Slice dimensions */
-+    uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /* Slice dimensions */
-+    uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /* Nof slices */
-+    uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+    /* Nof slices */
-+    uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+    /* Grid point decimation factor */
-+    uint16_t
-+    min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+    /* Grid point decimation factor */
-+    uint16_t
-+    max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+    /* Relative position of grid origin to pixel origin */
-+    int16_t
-+    min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+    /* Relative position of grid origin to pixel origin */
-+    int16_t
-+    max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+    /* Dimension of grid */
-+    int16_t
-+    min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /* Dimension of grid */
-+    int16_t
-+    max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
-+    ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
-+#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
-+    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
-+    + (IA_CSS_UINT32_T_BITS) \
-+    + (5*IA_CSS_UINT16_T_BITS) \
-+    + (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/** Program parameters terminal */
-+struct ia_css_program_terminal_manifest_s {
-+    /** terminal manifest base object */
-+    ia_css_terminal_manifest_t base;
-+    /** Connection manager passes seq info as single blob at the moment */
-+    uint32_t sequencer_info_kernel_id;
-+    /** Maximum number of command secriptors supported
-+     * by the program group
-+     */
-+    uint16_t max_kernel_fragment_sequencer_command_desc;
-+    /** The total count of prog-init parameter descriptors */
-+    uint16_t fragment_param_manifest_section_desc_count;
-+    /** The offset of the manifest section descriptor from the base of this structure */
-+    uint16_t fragment_param_manifest_section_desc_offset;
-+    uint16_t kernel_fragment_sequencer_info_manifest_info_count;
-+    uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
-+    /** align to 64 */
-+    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_program_terminal_manifest_s
-+    ia_css_program_terminal_manifest_t;
-+
-+/* ==================== Program Terminal Manifest - END ==================== */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
-new file mode 100644
-index 000000000000..7e6350820f22
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
-@@ -0,0 +1,477 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_TYPES_H
-+#define __IA_CSS_TERMINAL_TYPES_H
-+
-+#include "type_support.h"
-+#include "ia_css_base_types.h"
-+#include "ia_css_terminal_base_types.h"
-+
-+typedef struct ia_css_program_control_init_load_section_desc_s
-+    ia_css_program_control_init_load_section_desc_t;
-+typedef struct ia_css_program_control_init_connect_section_desc_s
-+    ia_css_program_control_init_connect_section_desc_t;
-+typedef struct ia_css_program_control_init_program_desc_s
-+    ia_css_program_control_init_program_desc_t;
-+typedef struct ia_css_program_control_init_terminal_s
-+    ia_css_program_control_init_terminal_t;
-+
-+typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
-+typedef struct ia_css_fragment_param_section_desc_s
-+    ia_css_fragment_param_section_desc_t;
-+typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
-+    ia_css_kernel_fragment_sequencer_info_desc_t;
-+typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
-+    ia_css_kernel_fragment_sequencer_command_desc_t;
-+
-+typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
-+typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
-+typedef struct ia_css_slice_param_section_desc_s
-+    ia_css_slice_param_section_desc_t;
-+
-+typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
-+typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
-+typedef struct ia_css_frame_grid_param_section_desc_s
-+    ia_css_frame_grid_param_section_desc_t;
-+typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
-+
-+typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
-+typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
-+
-+typedef struct ia_css_param_payload_s ia_css_param_payload_t;
-+typedef struct ia_css_terminal_s ia_css_terminal_t;
-+
-+/* =================== Generic Parameter Payload - START =================== */
-+#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT    1
-+#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT    1
-+
-+#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    (N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
-+    + VIED_VADDRESS_BITS \
-+    + N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+struct ia_css_param_payload_s {
-+    /**
-+     * Temporary variable holding the host address of the parameter buffer
-+     * as PSYS is handling the parameters on the host side for the moment
-+     */
-+    uint64_t host_buffer;
-+    /**
-+     * Base virtual addresses to parameters in subsystem virtual
-+     * memory space
-+     * NOTE: Used in legacy pg flow
-+     */
-+    vied_vaddress_t buffer;
-+    /**
-+     * Offset to buffer address within external buffer set structure
-+     * NOTE: Used in ppg flow
-+     */
-+    uint32_t terminal_index;
-+};
-+/* =================== Generic Parameter Payload - End ==================== */
-+
-+/* ==================== Cached Param Terminal - START ==================== */
-+#define N_UINT32_IN_PARAM_SEC_STRUCT 2
-+
-+#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
-+    (N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** Parameters section */
-+struct ia_css_param_section_desc_s {
-+    /** Offset of the parameter allocation in memory */
-+    uint32_t mem_offset;
-+    /** Memory allocation size needs of this parameter */
-+    uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_PARAM_TERMINAL_STRUCT        1
-+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT    6
-+
-+#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    + N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/** "Cached" parameters terminal for parameter that do not change
-+ * at frame scope.
-+ */
-+struct ia_css_param_terminal_s {
-+    /** Parameter terminal base */
-+    ia_css_terminal_t base;
-+    /** Helps to identify the parameter buffer when sent later on with the buffer set  */
-+    ia_css_param_payload_t param_payload;
-+    /** Points to the variable array of ia_css_param_section_desc_t */
-+    uint16_t param_section_desc_offset;
-+    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
-+};
-+/* ==================== Cached Param Terminal - End ==================== */
-+
-+/* ==================== Spatial Param Terminal - START ==================== */
-+#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
-+
-+#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
-+    (N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_fragment_grid_desc_s {
-+    /**
-+     * Offset width/height of the top-left compute unit of the
-+     * fragment compared to the frame
-+     */
-+    uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
-+    /**
-+     * Resolution width/height of the spatial parameters that
-+     * correspond to the fragment measured in compute units
-+     */
-+    uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT        3
-+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT    4
-+
-+#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
-+    (N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
-+    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/**
-+ * A plane of parameters with spatial aspect
-+ * (compute units correlated to pixel data)
-+ */
-+struct ia_css_frame_grid_param_section_desc_s {
-+    /** Offset of the parameter allocation in memory */
-+    uint32_t mem_offset;
-+    /** Memory allocation size needs of this parameter */
-+    uint32_t mem_size;
-+    /**
-+     * stride in bytes of each line of compute units for
-+     * the specified memory space and region
-+     */
-+    uint32_t stride;
-+    uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
-+};
-+
-+#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
-+#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
-+
-+#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
-+    (N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_frame_grid_desc_s {
-+    /** Resolution width/height of the frame of
-+     * spatial parameters measured in compute units
-+     */
-+    uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
-+};
-+
-+#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
-+#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
-+
-+#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    + SIZE_OF_FRAME_GRID_STRUCT_BITS \
-+    + N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
-+    + N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_spatial_param_terminal_s {
-+    /** Spatial Parameter terminal base */
-+    ia_css_terminal_t base;
-+    /** Spatial Parameter buffer handle attached to the terminal */
-+    ia_css_param_payload_t param_payload;
-+    /** Contains info for the frame of spatial parameters */
-+    ia_css_frame_grid_desc_t frame_grid_desc;
-+    /** Kernel identifier */
-+    uint32_t kernel_id;
-+    /**
-+     * Points to the variable array of
-+     * ia_css_frame_grid_param_section_desc_t
-+     */
-+    uint16_t frame_grid_param_section_desc_offset;
-+    /**
-+     * Points to array of ia_css_fragment_spatial_desc_t
-+     * which constain info for the fragments of spatial parameters
-+     */
-+    uint16_t fragment_grid_desc_offset;
-+};
-+/* ==================== Spatial Param Terminal - END ==================== */
-+
-+/* ==================== Sliced Param Terminal - START ==================== */
-+#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
-+
-+#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
-+    (N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** A Slice of parameters ready to be trasferred from/to registers */
-+struct ia_css_slice_param_section_desc_s {
-+    /** Offset of the parameter allocation in memory */
-+    uint32_t mem_offset;
-+    /** Memory allocation size needs of this parameter */
-+    uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT        2
-+#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT    4
-+
-+#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
-+    (N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_fragment_slice_desc_s {
-+    /**
-+     * Points to array of ia_css_slice_param_section_desc_t
-+     * which constain info for each prameter slice
-+     */
-+    uint16_t slice_section_desc_offset;
-+    /** Number of slices for the parameters for this fragment */
-+    uint16_t slice_count;
-+    uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
-+};
-+
-+#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT    1
-+#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT    1
-+#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT    2
-+
-+#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    + N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
-+    + N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_sliced_param_terminal_s {
-+    /** Spatial Parameter terminal base */
-+    ia_css_terminal_t base;
-+    /** Spatial Parameter buffer handle attached to the terminal */
-+    ia_css_param_payload_t param_payload;
-+    /** Kernel identifier */
-+    uint32_t kernel_id;
-+    /**
-+     * Points to array of ia_css_fragment_slice_desc_t
-+     * which constain info for the slicing of the parameters
-+     */
-+    uint16_t fragment_slice_desc_offset;
-+    uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
-+};
-+/* ==================== Sliced Param Terminal - END ==================== */
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS    \
-+    (DEVICE_DESCRIPTOR_ID_BITS    \
-+    + (2 * IA_CSS_UINT16_T_BITS)    \
-+    )
-+struct ia_css_program_control_init_load_section_desc_s {
-+    /** Device descriptor */
-+    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
-+    /** Memory allocation size needs of this parameter */
-+    uint16_t mem_size;
-+    /** (Applicable to) mode bitmask */
-+    uint16_t mode_bitmask;
-+};
-+
-+#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
-+#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
-+#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
-+#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
-+#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
-+#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
-+#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
-+
-+struct connect_section_idx_bitfields_s {
-+    uint16_t plane_id : 4;
-+    uint16_t bottom_lines : 6;
-+    uint16_t top_lines : 6;
-+};
-+
-+union connect_section_idx_t {
-+    struct connect_section_idx_bitfields_s as_bitfield;
-+    uint16_t as_uint_16;
-+};
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS    \
-+    (DEVICE_DESCRIPTOR_ID_BITS    \
-+    + (1 * IA_CSS_UINT16_T_BITS)    \
-+    + (1 * IA_CSS_UINT8_T_BITS)    \
-+    + IA_CSS_TERMINAL_ID_BITS    \
-+    )
-+struct ia_css_program_control_init_connect_section_desc_s {
-+    /** Device descriptor */
-+    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
-+    /** Connected terminal section (plane) index */
-+    uint16_t connect_section_idx;
-+    /** (Applicable to) mode bitmask */
-+    uint8_t mode_bitmask;
-+    /** Absolute referral ID for the connected terminal */
-+    ia_css_terminal_ID_t connect_terminal_ID;
-+};
-+
-+#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO    (1)
-+#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
-+#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
-+    (1 * IA_CSS_UINT16_T_BITS)    \
-+    + (1 * IA_CSS_UINT8_T_BITS)    \
-+    + (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS    \
-+    (4 * IA_CSS_UINT16_T_BITS)    \
-+    + (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
-+    + (2 * IA_CSS_UINT8_T_BITS) \
-+    + (1 * IA_CSS_UINT16_T_BITS) \
-+    + (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
-+        IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_program_desc_control_info_s {
-+    /** 12-bit process identifier */
-+    ia_css_process_id_t process_id;
-+    /** number of done acks required to close the process */
-+    uint8_t num_done_events;
-+    uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
-+};
-+
-+struct ia_css_program_control_init_program_desc_s {
-+    /** Number of load sections in this program */
-+    uint16_t load_section_count;
-+    /** Points to variable size array of
-+     * ia_css_program_control_init_load_section_desc_s
-+     * in relation to its program_desc
-+     */
-+    uint16_t load_section_desc_offset;
-+    /** Number of connect sections in this program */
-+    uint16_t connect_section_count;
-+    /** Points to variable size array of
-+     * ia_css_program_control_init_connect_section_desc_s
-+     * in relation to its program_desc
-+     */
-+    uint16_t connect_section_desc_offset;
-+    struct ia_css_program_desc_control_info_s control_info;
-+    /** number of load sections that are filled */
-+    uint8_t filled_load_sections;
-+    /** number of connect sections that are filled */
-+    uint8_t filled_connect_sections;
-+    /** mem_offset for the first load section */
-+    uint16_t load_section_mem_offset;
-+    /* align to 64 bits */
-+    /* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
-+};
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    + (1 * IA_CSS_UINT32_T_BITS) \
-+    + (2 * IA_CSS_UINT16_T_BITS) \
-+    )
-+struct ia_css_program_control_init_terminal_s {
-+    /** Parameter terminal base */
-+    ia_css_terminal_t base;
-+    /** Parameter buffer handle attached to the terminal */
-+    ia_css_param_payload_t param_payload;
-+    /** Fragment stride for the payload, used to find the base
-+     * of the payload for a given fragment
-+     */
-+    uint32_t payload_fragment_stride;
-+    /** Points to the variable array of
-+     * ia_css_program_control_init_program_desc_s
-+     */
-+    uint16_t program_section_desc_offset;
-+    /** Number of instantiated programs in program group (processes) */
-+    uint16_t program_count;
-+};
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+/* ==================== Program Terminal - START ==================== */
-+
-+#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
-+
-+#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
-+    (N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** Fragment constant parameters section */
-+struct ia_css_fragment_param_section_desc_s {
-+    /** Offset of the parameter allocation in memory */
-+    uint32_t mem_offset;
-+    /** Memory allocation size needs of this parameter */
-+    uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
-+
-+#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
-+    (N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+/** 4 commands packe together to save memory space */
-+struct ia_css_kernel_fragment_sequencer_command_desc_s {
-+    /** Contains the "(command_index%4) == index" command desc */
-+    uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
-+};
-+
-+#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
-+
-+#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
-+    (N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_kernel_fragment_sequencer_info_desc_s {
-+    /** Slice dimensions */
-+    uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /** Nof slices */
-+    uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+    /** Grid point decimation factor */
-+    uint16_t
-+    fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+    /** Relative position of grid origin to pixel origin */
-+    int16_t
-+    fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+    /** Size of active fragment region */
-+    int16_t
-+    fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+    /** If >0 it overrides the standard fragment sequencer info */
-+    uint16_t command_count;
-+    /**
-+     * To be used only if command_count>0, points to the descriptors
-+     * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
-+     */
-+    uint16_t command_desc_offset;
-+};
-+
-+#define N_UINT16_IN_PROG_TERM_STRUCT        2
-+#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT    0
-+#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
-+#define UNIFIED_PROG_TERM_FRAG_DESC
-+
-+#define SIZE_OF_PROG_TERM_STRUCT_BITS \
-+    (SIZE_OF_TERMINAL_STRUCT_BITS \
-+    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+    + N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
-+    + N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_program_terminal_s {
-+    /** Program terminal base */
-+    ia_css_terminal_t base;
-+    /** Program terminal buffer handle attached to the terminal */
-+    ia_css_param_payload_t param_payload;
-+    /** Points to array of ia_css_fragment_param_desc_s */
-+    uint16_t fragment_param_section_desc_offset;
-+    /** Points to array of ia_css_kernel_fragment_sequencer_info_s */
-+    uint16_t kernel_fragment_sequencer_info_desc_offset;
-+    /* stride to next fragment*/
-+    uint32_t payload_fragment_stride;
-+    /** align to 64 */
-+    /*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
-+};
-+/* ==================== Program Terminal - END ==================== */
-+
-+#endif /* __IA_CSS_TERMINAL_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
-new file mode 100644
-index 000000000000..6ab5e289b096
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
-@@ -0,0 +1,1002 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*! \file */
-+
-+#ifndef __IA_CSS_TRACE_H
-+#define __IA_CSS_TRACE_H
-+
-+/*
-+** Configurations
-+*/
-+
-+/**
-+ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
-+ *         Where:
-+ *             {Module Name} is the name of the targeted module.
-+ *
-+ *         Example:
-+ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+ */
-+
-+/**< Use whatever method of tracing that best suits the platform
-+ * this code is compiled for.
-+ */
-+#define IA_CSS_TRACE_METHOD_NATIVE  1
-+/**< Use the Tracing NCI. */
-+#define IA_CSS_TRACE_METHOD_TRACE   2
-+
-+/**
-+ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
-+ *         Where:
-+ *             {Module Name} is the name of the targeted module.
-+ *             {Level}, in decreasing order of severity, is one of the
-+ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
-+ *                       VERBOSE, FATAL}.
-+ *         Example:
-+ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
-+ */
-+/**< Disables the corresponding trace level. */
-+#define IA_CSS_TRACE_LEVEL_DISABLED 0
-+/**< Enables the corresponding trace level. */
-+#define IA_CSS_TRACE_LEVEL_ENABLED  1
-+
-+/*
-+ * Used in macro definition with do-while loop
-+ * for removing checkpatch warnings
-+ */
-+#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
-+
-+/**
-+ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
-+ * line printed with every log message.
-+ *
-+ *       Example:
-+ *           #define IA_CSS_TRACE_PRINT_FILE_LINE
-+ */
-+
-+/*
-+** Interface
-+*/
-+
-+/*
-+** Static
-+*/
-+
-+/**
-+ * Logs a message with zero arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @param module The targeted module.
-+ * @param severity The severity level of the trace message. In decreasing order:
-+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
-+ * @param format The message to be traced.
-+ */
-+#define IA_CSS_TRACE_0(module, severity, format) \
-+    IA_CSS_TRACE_IMPL(module, 0, severity, format)
-+
-+/**
-+ * Logs a message with one argument if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_1(module, severity, format, a1) \
-+    IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
-+
-+/**
-+ * Logs a message with two arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
-+    IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
-+
-+/**
-+ * Logs a message with three arguments if the targeted severity level
-+ * is enabled at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
-+    IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
-+
-+/**
-+ * Logs a message with four arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
-+    IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
-+
-+/**
-+ * Logs a message with five arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
-+    IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
-+
-+/**
-+ * Logs a message with six arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
-+    IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
-+
-+/**
-+ * Logs a message with seven arguments if the targeted severity level
-+ * is enabled at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
-+    IA_CSS_TRACE_IMPL(module, 7, severity, format, \
-+                    a1, a2, a3, a4, a5, a6, a7)
-+
-+/*
-+** Dynamic
-+*/
-+
-+/**
-+* Declares, but does not define, dynamic tracing functions and variables
-+* for module \p module.  For each module, place an instance of this macro
-+* in the compilation unit in which you want to use dynamic tracing facility
-+* so as to inform the compiler of the declaration of the available functions.
-+* An invocation of this function does not enable any of the available tracing
-+* levels.  Do not place a semicolon after a call to this macro.
-+* @see IA_CSS_TRACE_DYNAMIC_DEFINE
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
-+    IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
-+/**
-+* Declares the configuration function for the dynamic api seperatly, if one
-+* wants to use it.
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
-+    IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
-+
-+/**
-+* Defines dynamic tracing functions and variables for module \p module.
-+* For each module, place an instance of this macro in one, and only one,
-+* of your SOURCE files so as to allow the linker resolve the related symbols.
-+* An invocation of this macro does not enable any of the available tracing
-+* levels.  Do not place a semicolon after a call to this macro.
-+* @see IA_CSS_TRACE_DYNAMIC_DECLARE
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
-+    IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
-+/**
-+* Defines the configuration function for the dynamic api seperatly, if one
-+* wants to use it.
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
-+    IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
-+
-+/**
-+ * Logs a message with zero arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @param module The targeted module.
-+ * @param severity The severity level of the trace message. In decreasing order:
-+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
-+ * @param format The message to be traced.
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
-+
-+/**
-+ * Logs a message with one argument if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
-+
-+/**
-+ * Logs a message with two arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
-+
-+/**
-+ * Logs a message with three arguments if the targeted severity level
-+ * is enabled both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
-+
-+/**
-+ * Logs a message with four arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
-+
-+/**
-+ * Logs a message with five arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
-+                        a1, a2, a3, a4, a5)
-+
-+/**
-+ * Logs a message with six arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
-+                        a1, a2, a3, a4, a5, a6)
-+
-+/**
-+ * Logs a message with seven arguments if the targeted severity level
-+ * is enabled both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+    IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
-+                        a1, a2, a3, a4, a5, a6, a7)
-+
-+/*
-+** Implementation
-+*/
-+
-+/* CAT */
-+#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
-+#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
-+
-+/* Bridge */
-+#if defined(__HIVECC) || defined(__GNUC__)
-+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
-+    IA_CSS_TRACE_CAT( \
-+        IA_CSS_TRACE_CAT( \
-+            IA_CSS_TRACE_CAT( \
-+                IA_CSS_TRACE_CAT( \
-+                    IA_CSS_TRACE_CAT( \
-+                        IA_CSS_TRACE_, \
-+                        argument_count \
-+                    ), \
-+                    _ \
-+                ), \
-+                IA_CSS_TRACE_CAT( \
-+                    module, \
-+                    _TRACE_METHOD \
-+                ) \
-+            ), \
-+            _ \
-+        ), \
-+        IA_CSS_TRACE_CAT( \
-+            IA_CSS_TRACE_CAT( \
-+                module, \
-+                _TRACE_LEVEL_ \
-+            ), \
-+            severity \
-+        ) \
-+        ( \
-+            IA_CSS_TRACE_CAT( \
-+                IA_CSS_TRACE_CAT( \
-+                    IA_CSS_TRACE_CAT( \
-+                        IA_CSS_TRACE_SEVERITY_, \
-+                        severity \
-+                    ), \
-+                    _ \
-+                ), \
-+                IA_CSS_TRACE_CAT( \
-+                    module, \
-+                    _TRACE_METHOD \
-+                ) \
-+            ), \
-+            #module, \
-+            ## arguments \
-+        ) \
-+    )
-+
-+/* Bridge */
-+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
-+                            arguments ...) \
-+    do { \
-+        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
-+                            severity)) { \
-+            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
-+                            ## arguments); \
-+        } \
-+    } while (0)
-+#elif defined(_MSC_VER)
-+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
-+    IA_CSS_TRACE_CAT( \
-+        IA_CSS_TRACE_CAT( \
-+            IA_CSS_TRACE_CAT( \
-+                IA_CSS_TRACE_CAT( \
-+                    IA_CSS_TRACE_CAT( \
-+                        IA_CSS_TRACE_, \
-+                        argument_count \
-+                    ), \
-+                    _ \
-+                ), \
-+                IA_CSS_TRACE_CAT( \
-+                    module, \
-+                    _TRACE_METHOD \
-+                ) \
-+            ), \
-+            _ \
-+        ), \
-+        IA_CSS_TRACE_CAT( \
-+            IA_CSS_TRACE_CAT( \
-+                module, \
-+                _TRACE_LEVEL_ \
-+            ), \
-+            severity \
-+        ) \
-+        ( \
-+            IA_CSS_TRACE_CAT( \
-+                IA_CSS_TRACE_CAT( \
-+                    IA_CSS_TRACE_CAT( \
-+                        IA_CSS_TRACE_SEVERITY_, \
-+                        severity \
-+                    ), \
-+                    _ \
-+                ), \
-+                IA_CSS_TRACE_CAT( \
-+                    module, \
-+                    _TRACE_METHOD \
-+                ) \
-+            ), \
-+            #module, \
-+            __VA_ARGS__  \
-+        ) \
-+    )
-+
-+/* Bridge */
-+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
-+    do { \
-+        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
-+                            severity)) { \
-+            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
-+                            __VA_ARGS__); \
-+        } \
-+    } while (0)
-+#endif
-+
-+/*
-+** Native Backend
-+*/
-+
-+#if defined(__HIVECC)
-+    #define IA_CSS_TRACE_PLATFORM_CELL
-+#elif defined(__XTENSA__)
-+    #define IA_CSS_TRACE_PLATFORM_XTENSA
-+#elif defined(XTENSA_HOST)
-+    #define IA_CSS_TRACE_PLATFORM_XTENSA
-+#elif defined(__GNUC__)
-+    #define IA_CSS_TRACE_PLATFORM_HOST
-+
-+    #define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
-+    do { \
-+        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+        PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
-+                        format),  ## arguments); \
-+    } while (0)
-+    /* TODO: In case Host Side tracing is needed to be mapped to the
-+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+     * PRINT to vied_nci_tunit_print function calls
-+    */
-+    #define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
-+    do { \
-+        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+        PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
-+                        format),  ## arguments); \
-+    } while (0)
-+
-+#elif defined(_MSC_VER)
-+    #define IA_CSS_TRACE_PLATFORM_HOST
-+
-+#ifdef _KERNEL_MODE
-+    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
-+        do { \
-+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+            P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
-+                    module, format),  __VA_ARGS__); \
-+        } while (0)
-+    /* TODO: In case Host Side tracing is needed to be mapped to the
-+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+     * PRINT to vied_nci_tunit_print function calls
-+    */
-+    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
-+        do { \
-+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+            P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
-+                    module, format),  __VA_ARGS__); \
-+        } while (0)
-+#else
-+    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
-+        do { \
-+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+            PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
-+                    module, format),  __VA_ARGS__); \
-+        } while (0)
-+    /* TODO: In case Host Side tracing is needed to be mapped to the
-+     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+     * PRINT to vied_nci_tunit_print function calls
-+    */
-+    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
-+        do { \
-+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+            PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
-+                    module, format),  __VA_ARGS__); \
-+        } while (0)
-+#endif
-+#else
-+    #error Unsupported platform!
-+#endif /* Platform */
-+
-+#if defined(IA_CSS_TRACE_PLATFORM_CELL)
-+    #include <hive/attributes.h> /* VOLATILE */
-+
-+    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
-+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
-+            do { \
-+                OP___printstring(__FILE__":") VOLATILE; \
-+                OP___printdec(__LINE__) VOLATILE; \
-+                OP___printstring("\n") VOLATILE; \
-+            } while (0)
-+    #else
-+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
-+    #endif
-+
-+    #define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
-+        do { \
-+            IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
-+            OP___printstring("["module"]:["severity"]:") \
-+            VOLATILE; \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
-+        do { \
-+            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+            OP___printstring("["module"]:["severity"]: "format) \
-+            VOLATILE; \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
-+        do { \
-+            IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
-+            OP___dump(i, value) VOLATILE; \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+        IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
-+
-+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+                        a1, a2, a3, a4) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
-+        } while (0)
-+
-+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+        do { \
-+            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
-+            IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
-+        } while (0)
-+    /*
-+    ** Tracing Backend
-+    */
-+#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
-+    #include "vied_nci_tunit.h"
-+#endif
-+    #define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
-+        "[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
-+
-+    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
-+        vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity)
-+
-+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
-+        vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1)
-+
-+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
-+        vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2)
-+
-+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
-+        vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2, a3)
-+
-+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
-+        vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2, a3, a4)
-+
-+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+        vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2, a3, a4, a5)
-+
-+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+        vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2, a3, a4, a5, a6)
-+
-+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+        vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+                                module), \
-+            severity, a1, a2, a3, a4, a5, a6, a7)
-+
-+#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
-+    #include "print_support_xtensa.h"
-+
-+    /* TODO: Tunit tracing is not yet supported on Xtensa platforms,
-+     * proper Trace functions will be created once supported.
-+     */
-+
-+    #define IA_CSS_TRACE_TRACE_0(severity, module, format)
-+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
-+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
-+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
-+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
-+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
-+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
-+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#ifdef __XTENSA_FW__
-+    #define SOURCE "FW"
-+#else
-+    #define SOURCE "HOST"
-+#endif
-+
-+#if defined(XTENSA_PRINT_USE_SIMCALL)
-+
-+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+    simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
-+
-+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+    simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
-+
-+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+    simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
-+
-+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+    simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
-+
-+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+                        a1, a2, a3, a4) \
-+    simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
-+
-+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+    simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
-+
-+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+    simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
-+
-+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+    simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#elif defined(XTENSA_PRINT_USE_PRINTF)
-+
-+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
-+
-+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
-+
-+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
-+
-+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
-+
-+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+                        a1, a2, a3, a4) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
-+
-+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
-+
-+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
-+
-+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#endif
-+#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
-+    #include "print_support.h"
-+
-+    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
-+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
-+                PRINT("%s:%d:\n", __FILE__, __LINE__)
-+    #else
-+        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
-+    #endif
-+
-+    #define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
-+            "[" module "]:[" severity "]: " format
-+
-+    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format)
-+
-+    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, a1)
-+
-+    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
-+
-+    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
-+
-+    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+                        a1, a2, a3, a4) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
-+
-+    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, \
-+                        a1, a2, a3, a4, a5)
-+
-+    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6)
-+
-+    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+        IA_CSS_TRACE_NATIVE(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7)
-+
-+    #define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
-+            "["module"]:["severity"]: "format
-+
-+    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
-+        IA_CSS_TRACE_TRACE(severity, module, format)
-+
-+    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, a1)
-+
-+    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
-+
-+    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
-+
-+    #define IA_CSS_TRACE_TRACE_4(severity, module, format, \
-+                        a1, a2, a3, a4) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
-+
-+    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
-+                        a1, a2, a3, a4, a5) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, \
-+                        a1, a2, a3, a4, a5)
-+
-+    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6)
-+
-+    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7) \
-+        IA_CSS_TRACE_TRACE(severity, module, format, \
-+                        a1, a2, a3, a4, a5, a6, a7)
-+#endif
-+
-+/* Disabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_1_0(severity, module, format)
-+#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
-+#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
-+#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
-+#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
-+#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5)
-+#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5, arg6)
-+#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5, arg6, arg7)
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
-+#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
-+#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
-+#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
-+#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
-+#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
-+#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
-+#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
-+
-+#if defined(_MSC_VER) && defined(_KERNEL_MODE)
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
-+#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
-+#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
-+#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
-+#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
-+#else
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
-+#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
-+#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
-+#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
-+#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
-+#endif
-+/* Disabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_2_0(severity, module, format)
-+#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
-+#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
-+#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
-+#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
-+#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5)
-+#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5, arg6)
-+#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+                            arg5, arg6, arg7)
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
-+#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
-+#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
-+#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
-+#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
-+#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
-+#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
-+#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
-+#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
-+#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
-+#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
-+
-+/*
-+** Dynamicism
-+*/
-+
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
-+    do { \
-+        void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
-+        void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
-+    } while (0)
-+
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
-+    do { \
-+        IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
-+        void IA_CSS_TRACE_CAT(module, _trace_configure)\
-+            (int argc, const char *const *argv); \
-+    } while (0)
-+
-+#include "platform_support.h"
-+#include "type_support.h"
-+
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
-+    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
-+    } \
-+    \
-+    void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
-+    { \
-+        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
-+    }
-+
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
-+void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
-+                const char *const *const argv) \
-+{ \
-+    int i = 1; \
-+    const char *levels = 0; \
-+    \
-+    while (i < argc) { \
-+        if (!strcmp(argv[i], "-" #module "_trace")) { \
-+            ++i; \
-+            \
-+            if (i < argc) { \
-+                levels = argv[i]; \
-+                \
-+                while (*levels) { \
-+                    switch (*levels++) { \
-+                    case 'a': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_assert_enable)(); \
-+                        break; \
-+                        \
-+                    case 'e': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_error_enable)(); \
-+                        break; \
-+                        \
-+                    case 'w': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_warning_enable)(); \
-+                        break; \
-+                        \
-+                    case 'i': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_info_enable)(); \
-+                        break; \
-+                        \
-+                    case 'd': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_debug_enable)(); \
-+                        break; \
-+                        \
-+                    case 'v': \
-+                        IA_CSS_TRACE_CAT \
-+                    (module, _trace_verbose_enable)(); \
-+                        break; \
-+                        \
-+                    default: \
-+                    } \
-+                } \
-+            } \
-+        } \
-+        \
-+    ++i; \
-+    } \
-+}
-+
-+#endif /* __IA_CSS_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
-new file mode 100644
-index 000000000000..0fc17cca1a74
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IPU_DEVICE_ACB_DEVICES_H
-+#define __IPU_DEVICE_ACB_DEVICES_H
-+
-+enum ipu_device_acb_id {
-+    /* PSA accelerators */
-+    IPU_DEVICE_ACB_RYNR_ID = 0,
-+    IPU_DEVICE_ACB_DEMOSAIC_ID,
-+    IPU_DEVICE_ACB_VCSC_ID,
-+    IPU_DEVICE_ACB_GLTM_ID,
-+    IPU_DEVICE_ACB_XNR_ID,
-+    IPU_DEVICE_ACB_ACM_ID, /* ACM is called VCA in HW */
-+    IPU_DEVICE_ACB_GAMMASTAR_ID,
-+    IPU_DEVICE_ACB_GTC_ID,
-+    IPU_DEVICE_ACB_YUV1_ID,
-+    IPU_DEVICE_ACB_DVS_ID,
-+    /* ISA accelerators */
-+    IPU_DEVICE_ACB_X2B_MD_ID,
-+    IPU_DEVICE_ACB_X2B_SVE_RGBIR_ID,
-+    IPU_DEVICE_ACB_B2B_ID,
-+    IPU_DEVICE_ACB_B2R_ID,
-+    IPU_DEVICE_ACB_ICA_ID,
-+    IPU_DEVICE_ACB_LSC_ID,
-+    IPU_DEVICE_ACB_DPC_ID,
-+    IPU_DEVICE_ACB_R2I_SIE_ID,
-+    IPU_DEVICE_ACB_R2I_DS_A_ID,
-+    IPU_DEVICE_ACB_R2I_DS_B_ID,
-+    IPU_DEVICE_ACB_AWB_ID,
-+    IPU_DEVICE_ACB_AF_ID,
-+    IPU_DEVICE_ACB_PAF_ID,
-+    IPU_DEVICE_ACB_AE_ID,
-+    IPU_DEVICE_ACB_SIS_A_ID,
-+    IPU_DEVICE_ACB_SIS_B_ID,
-+    IPU_DEVICE_ACB_ICA_S_ID,
-+    IPU_DEVICE_ACB_ICA_M_ID,
-+    IPU_DEVICE_ACB_DOL_ID,
-+    IPU_DEVICE_ACB_NUM_ACB
-+};
-+
-+#define IPU_DEVICE_ACB_NUM_PSA_ACB (IPU_DEVICE_ACB_DVS_ID + 1)
-+#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB - IPU_DEVICE_ACB_NUM_PSA_ACB)
-+
-+#endif /* __IPU_DEVICE_ACB_DEVICES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
-new file mode 100644
-index 000000000000..a531352bc640
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
-@@ -0,0 +1,205 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IPU_DEVICE_GP_DEVICES_H
-+#define __IPU_DEVICE_GP_DEVICES_H
-+#include "math_support.h"
-+#include "type_support.h"
-+
-+enum ipu_device_gp_id {
-+    IPU_DEVICE_GP_PSA = 0,
-+    IPU_DEVICE_GP_ISA_STATIC,
-+    IPU_DEVICE_GP_ISA_RUNTIME,
-+    IPU_DEVICE_GP_NUM_GP
-+};
-+
-+/* The PSA_* naming in the enum members refers to the internal separation of
-+ * the PSA. Using it this way should make this change transparent
-+ * to higher layers.
-+ *
-+ * For details on the values and usage of the muxes see Figures 3-1
-+ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
-+ * Fixed Function MAS. Additionally, refer to the respective description
-+ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
-+ * or isa_ps_system.rdl).
-+ */
-+enum ipu_device_gp_psa_mux_id {
-+    /* Mux/demuxes */
-+    /* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
-+    IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
-+    /* 0 - To XNR; 1 - WB/DM */
-+    IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
-+    /* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
-+    IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
-+    /* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
-+    IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
-+    /* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
-+    IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
-+    /* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
-+    IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
-+    /* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
-+    IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
-+    /* Device blockers */
-+    /* BNLM pixel output block enable */
-+    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
-+    /* BNLM pixel output block enable */
-+    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
-+    /* BNLM delta output block enable */
-+    IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
-+    /* Block pixel stream to gltm from vcsc */
-+    IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
-+    /* Block pixel stream to gltm from bnlm */
-+    IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
-+    /* Frame size reg for strmCrop H */
-+    IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
-+    IPU_DEVICE_GP_PSA_MUX_NUM_MUX
-+};
-+
-+enum ipu_device_gp_isa_static_mux_id {
-+    /* Muxes/demuxes */
-+    /* 0 - to ISL.S2V; 1 - to PSA */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
-+    /* 0 - to ISL.S2V; 1 - to PSA */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
-+    /* 0 - Input Correction; 1 - B2B mux */
-+    IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
-+    /* 0 - Input Correction; 1 - B2B mux */
-+    IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
-+    /* 0 - Input Correction; 1 - B2B mux */
-+    IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
-+    /* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
-+    /* 0 - Input correction; 1 - Dpc; 2 - X2b */
-+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
-+    /* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
-+    IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
-+    /* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
-+    IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
-+    /* 0 - Lsc; 1 - Input correction; 2 - X2b */
-+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
-+    /* 0 - Lsc; 1 - X2b; 2 - Input correction */
-+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
-+    /* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
-+    IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
-+    /* 0 - Lsc; 1 - Dpc; 2 - X2b */
-+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
-+    /* 0 - Through X2B SVE RGBIR; 1 - Bypass */
-+    IPU_DEVICE_GP_ISA_STATIC_SVE_RGBIR_BP_MUX_DEMUX_SEL,
-+    /* 0 - X2B SVE RGBIR; 1- X2B MD */
-+    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_MUX_SEL,
-+    /* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
-+    IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
-+    /* 0 - to Dol mux; 1 - to Dol */
-+    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
-+    /* 0 - Main input; 1 - Dol */
-+    IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
-+    /* Blockers */
-+    /* ISA input correction Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
-+    /* AWB Mux input correction Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
-+    /* AE Mux input correction Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
-+    /* AF Mux input correction Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
-+    /* AWB Mux B2B Mux Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
-+    /* AE Mux B2B Mux Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
-+    /* AF Mux B2B Mux Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
-+    /* PAF stream sync configuration */
-+    IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
-+    /* Paf Mux gddpc Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
-+    /* Paf Mux input isa Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
-+    /* Paf Mux X2B Port block */
-+    IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
-+    /* SIS A port block */
-+    IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
-+    /* SIS B port block */
-+    IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
-+    /* Lsc mux Input Corr demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+    /* Dpc mux Lsc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+    /* Dpc mux Lsc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
-+    /* Dpc mux X2b demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
-+    /* Dpc mux Lsc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
-+    /* Lsc mux X2b demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
-+    /* X2b mux Lsc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
-+    /* X2b mux Dpc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
-+    /* X2b mux Input Corr demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+    /* B2b mux Lsc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
-+    /* B2b mux X2b demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
-+    /* B2b mux Dpc demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
-+    /* B2b B2b mux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
-+    /* Stat B2b mux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
-+    /* Stat Input correction mux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
-+    /* Sis A B2b port block */
-+    IPU_DEVICE_GP_ISA_STATIC_SIS_A_B2B_PORT_BLK,
-+    /* Sis B B2b port block */
-+    IPU_DEVICE_GP_ISA_STATIC_SIS_B_B2B_PORT_BLK,
-+    /* ISA Orig B2b port block */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
-+    /* B2r B2b port block */
-+    IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
-+    /* ISA Scaled A Out R2i port block */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
-+    /* ISA Scaled B Out R2i port block */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
-+    /* ISA Full Out R2i port block */
-+    IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
-+    /* Ir Depth Out X2b port block */
-+    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_OUT_X2B_PORT_BLK,
-+    /* Main input Dol demux port block */
-+    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
-+    /* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
-+    IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
-+    IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
-+};
-+
-+enum ipu_device_gp_isa_runtime_mux_id {
-+    /* frame dim */
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
-+    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
-+    IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
-+};
-+
-+/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
-+#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
-+
-+#endif /* __IPU_DEVICE_GP_DEVICES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
-new file mode 100644
-index 000000000000..05180a3b927f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
-@@ -0,0 +1,328 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __MATH_SUPPORT_H
-+#define __MATH_SUPPORT_H
-+
-+#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
-+#include "type_support.h"
-+#include "assert_support.h"
-+
-+/* in case we have min/max/MIN/MAX macro's undefine them */
-+#ifdef min
-+#undef min
-+#endif
-+#ifdef max
-+#undef max
-+#endif
-+#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
-+#undef MIN
-+#endif
-+#ifdef MAX
-+#undef MAX
-+#endif
-+
-+#ifndef INT8_MIN
-+#define INT8_MIN        (-127 - 1)
-+#endif
-+
-+#ifndef INT8_MAX
-+#define INT8_MAX        (127)
-+#endif
-+
-+#ifndef UINT8_MAX
-+#define UINT8_MAX       (0xffUL)
-+#endif
-+
-+#ifndef UINT16_MAX
-+#define UINT16_MAX       (0xffffUL)
-+#endif
-+
-+#ifndef UINT32_MAX
-+#define UINT32_MAX       (0xffffffffUL)
-+#endif
-+
-+#define IS_ODD(a) ((a) & 0x1)
-+#define IS_EVEN(a) (!IS_ODD(a))
-+#define IS_POWER2(a) (!((a)&((a)-1)))
-+#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
-+#define IS_MASK_BITS_SET(a, b)    ((a & b) != 0)
-+
-+/*To Find next power of 2 number from x */
-+#define bit2(x)            ((x)      | ((x) >> 1))
-+#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
-+#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
-+#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
-+#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
-+#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
-+
-+/* force a value to a lower even value */
-+#define EVEN_FLOOR(x)    ((x) & ~1UL)
-+
-+/* A => B */
-+#define IMPLIES(a, b) (!(a) || (b))
-+
-+/* The ORIG_BITS th bit is the sign bit */
-+/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
-+/* By type casting it can relimited to any valid type-size
-+ * (32-bit signed or 16-bit or 8-bit)
-+ */
-+/* By masking it can be transformed to any arbitrary bit size */
-+#define SIGN_EXTEND(VAL, ORIG_BITS) \
-+((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
-+
-+#define EXTRACT_BIT(a, b)    ((a >> b) & 1)
-+
-+/* for preprocessor and array sizing use MIN and MAX
-+   otherwise use min and max */
-+#define MAX(a, b)        (((a) > (b)) ? (a) : (b))
-+#define MIN(a, b)        (((a) < (b)) ? (a) : (b))
-+#define CLIP(a, b, c)        MIN((MAX((a), (b))), (c))
-+/* Integer round-down division of a with b */
-+#define FLOOR_DIV(a, b)        ((b) ? ((a) / (b)) : 0)
-+/* Align a to the lower multiple of b */
-+#define FLOOR_MUL(a, b)        (FLOOR_DIV(a, b) * (b))
-+/* Integer round-up division of a with b */
-+#define CEIL_DIV(a, b)        ((b) ? (((a) + (b) - 1) / (b)) : 0)
-+/* Align a to the upper multiple of b */
-+#define CEIL_MUL(a, b)        (CEIL_DIV(a, b) * (b))
-+/* Align a to the upper multiple of b - fast implementation
-+ * for cases when b=pow(2,n)
-+ */
-+#define CEIL_MUL2(a, b)        (((a) + (b) - 1) & ~((b) - 1))
-+/* integer round-up division of a with pow(2,b) */
-+#define CEIL_SHIFT(a, b)    (((a) + (1UL << (b)) - 1) >> (b))
-+/* Align a to the upper multiple of pow(2,b) */
-+#define CEIL_SHIFT_MUL(a, b)    (CEIL_SHIFT(a, b) << (b))
-+/* Absolute difference of a and b */
-+#define ABS_DIF(a, b)        (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
-+#define ABS(a) ABS_DIF(a, 0)
-+/* Square of x */
-+#define SQR(x)            ((x)*(x))
-+/* Integer round-half-down division of a nad b */
-+#define ROUND_HALF_DOWN_DIV(a, b)    ((b) ? ((a) + (b / 2) - 1) / (b) : 0)
-+/* Align a to the round-half-down multiple of b */
-+#define ROUND_HALF_DOWN_MUL(a, b)    (ROUND_HALF_DOWN_DIV(a, b) * (b))
-+
-+#define MAX3(a, b, c)        MAX((a), MAX((b), (c)))
-+#define MIN3(a, b, c)        MIN((a), MIN((b), (c)))
-+#define MAX4(a, b, c, d)    MAX((MAX((a), (b))), (MAX((c), (d))))
-+#define MIN4(a, b, c, d)    MIN((MIN((a), (b))), (MIN((c), (d))))
-+
-+/* min and max should not be macros as they will evaluate their arguments twice.
-+   if you really need a macro (e.g. for CPP or for initializing an array)
-+   use MIN() and MAX(), otherwise use min() and max() */
-+
-+#ifndef ARRAY_SIZE
-+#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
-+#endif
-+
-+#ifndef BYTES
-+#define BYTES(bit) (((bit)+7)/8)
-+#endif
-+
-+#if !defined(PIPE_GENERATION)
-+STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
-+{
-+    return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
-+}
-+STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
-+{
-+    return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
-+}
-+STORAGE_CLASS_INLINE int max(int a, int b)
-+{
-+    return MAX(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int min(int a, int b)
-+{
-+    return MIN(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int clip(int a, int b, int c)
-+{
-+    return min(max(a, b), c);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
-+{
-+    return MAX(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
-+{
-+    return MIN(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
-+                    unsigned int c)
-+{
-+    return umin(umax(a, b), c);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
-+{
-+    return CEIL_DIV(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
-+{
-+    return CEIL_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
-+{
-+    return CEIL_MUL2(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
-+{
-+    return CEIL_SHIFT(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
-+{
-+    return CEIL_SHIFT_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int abs_dif(int a, int b)
-+{
-+    return ABS_DIF(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
-+{
-+    return ABS_DIF(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
-+        unsigned int b)
-+{
-+    return ROUND_HALF_DOWN_DIV(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
-+        unsigned int b)
-+{
-+    return ROUND_HALF_DOWN_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
-+{
-+    unsigned int retval = 0;
-+
-+    if (IS_POWER2(a)) {
-+        retval =  (unsigned int)a;
-+    } else {
-+        unsigned int v = a;
-+
-+        v |= v>>1;
-+        v |= v>>2;
-+        v |= v>>4;
-+        v |= v>>8;
-+        v |= v>>16;
-+        retval =  (unsigned int)(v+1);
-+    }
-+    return retval;
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
-+{
-+    static const uint8_t de_bruijn[] = {
-+        0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
-+        8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
-+    };
-+    uint32_t v = a;
-+
-+    v |= v>>1;
-+    v |= v>>2;
-+    v |= v>>4;
-+    v |= v>>8;
-+    v |= v>>16;
-+    return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
-+}
-+
-+/* Divide by small power of two */
-+STORAGE_CLASS_INLINE unsigned int
-+udiv2_small_i(uint32_t a, uint32_t b)
-+{
-+    assert(b <= 2);
-+    return a >> (b-1);
-+}
-+
-+/* optimized divide for small results
-+ * a will be divided by b
-+ * outbits is the number of bits needed for the result
-+ * the smaller the cheaper the function will be.
-+ * if the result doesn't fit in the number of output bits
-+ * the result is incorrect and the function will assert
-+ */
-+STORAGE_CLASS_INLINE unsigned int
-+udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
-+{
-+    int bit;
-+    unsigned res = 0;
-+    unsigned mask;
-+
-+#ifdef VOLCANO
-+#pragma ipu unroll
-+#endif
-+    for (bit = outbits-1 ; bit >= 0; bit--) {
-+        mask = 1<<bit;
-+        if (a >= (b<<bit)) {
-+            res |= mask; /* set the bit */
-+            a = a - (b<<bit);
-+        }
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+    }
-+    /* check if the remainder is smaller than the divisor.
-+     * if not we didn't produce enough output bits
-+     */
-+    assert(a < b);
-+    return res;
-+}
-+
-+#if !defined(__VIED_CELL)
-+/*
-+ * For SP and ISP, SDK provides the definition of OP_std_modadd.
-+ * We need it only for host
-+ */
-+STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
-+{
-+    return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
-+}
-+
-+/*
-+ * For SP and ISP, SDK provides the definition of OP_asp_slor.
-+ * We need it only for host
-+ */
-+STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
-+{
-+    return ((a << c) | b);
-+}
-+#else
-+#include "hive/customops.h"
-+#endif /* !defined(__VIED_CELL) */
-+
-+#endif /* !defined(PIPE_GENERATION) */
-+#if !defined(__KERNEL__)
-+#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
-+#endif /* !defined(__KERNEL__) */
-+
-+#endif /* __MATH_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
-new file mode 100644
-index 000000000000..c7b2debe8bcb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __MISC_SUPPORT_H
-+#define __MISC_SUPPORT_H
-+
-+/* suppress compiler warnings on unused variables */
-+#ifndef NOT_USED
-+#define NOT_USED(a) ((void)(a))
-+#endif
-+
-+/* Calculate the  total bytes for pow(2) byte alignment */
-+#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
-+    ((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
-+
-+/* Display the macro value given a string */
-+#define _STR(x) #x
-+#define STR(x) _STR(x)
-+
-+/* Concatenate */
-+#ifndef CAT /* also defined in <hive/attributes.h> */
-+#define _CAT(a, b)    a ## b
-+#define CAT(a, b)    _CAT(a, b)
-+#endif
-+
-+#define _CAT3(a, b, c)    a ## b ## c
-+#define CAT3(a, b, c)    _CAT3(a, b, c)
-+
-+/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
-+#ifndef __HIVECC
-+#ifndef NO_HOIST
-+#define NO_HOIST
-+#endif
-+#ifndef NO_CSE
-+#define NO_CSE
-+#endif
-+#ifndef NO_ALIAS
-+#define NO_ALIAS
-+#endif
-+#endif
-+
-+enum hive_method_id {
-+    HIVE_METHOD_ID_CRUN,
-+    HIVE_METHOD_ID_UNSCHED,
-+    HIVE_METHOD_ID_SCHED,
-+    HIVE_METHOD_ID_TARGET
-+};
-+
-+/* Derive METHOD */
-+#if defined(C_RUN)
-+    #define HIVE_METHOD "crun"
-+    #define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
-+#elif defined(HRT_UNSCHED)
-+    #define HIVE_METHOD "unsched"
-+    #define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
-+#elif defined(HRT_SCHED)
-+    #define HIVE_METHOD "sched"
-+    #define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
-+#else
-+    #define HIVE_METHOD "target"
-+    #define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
-+    #define HRT_TARGET 1
-+#endif
-+
-+#endif /* __MISC_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
-new file mode 100644
-index 000000000000..4f3b03093984
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
-+#define __PG_CONTROL_INIT_FRAMEWORK_H
-+
-+#include <type_support.h>
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_terminal_types.h>
-+#include <ia_css_kernel_user_param_types.h>
-+
-+#pragma GCC visibility push(default)
-+
-+enum pg_control_init_ret_type {
-+	PG_CONTROL_INIT_SUCCESS  = 0,
-+	PG_CONTROL_INIT_FAILURE = (1 << 0)
-+};
-+
-+/*
-+ * @brief  Fill the program control init desc.
-+ *
-+ * @param[in]  process_group Process group.
-+ * @param[out] terminal      Program control init terminal.
-+ *
-+ * @retval  0  Successful.
-+ * @retval  1  Error.
-+ */
-+
-+int pg_control_init_terminal_init(
-+		ia_css_process_group_t *process_group,
-+		ia_css_program_control_init_terminal_t *terminal);
-+
-+/**
-+ * @brief  Fill the program control init payload.
-+ *
-+ * @param[in]  process_group    Process group.
-+ * @param[in]  params           Kernel user parameters object.
-+ * @param[in]  payload_address  Host address in payload.
-+ *
-+ * @retval 0   Successful.
-+ * @retval 1  Error.
-+ */
-+
-+int pg_control_init_fill_payload(
-+	const ia_css_process_group_t *process_group,
-+	const ia_css_kernel_user_param_t *params,
-+	void *payload_address);
-+
-+/**
-+ * @brief  Get the payload size
-+ *
-+ * @param[in]   process_group Process group
-+ * @param[out]  payload_size  Payload size to be allocated for the process.
-+ *
-+ * @retval 0   Successful.
-+ * @retval 1  Error.
-+ */
-+
-+int pg_control_init_get_payload_size(
-+	const ia_css_process_group_t *process_group,
-+	unsigned int *payload_size);
-+
-+#pragma GCC visibility pop
-+
-+#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
-new file mode 100644
-index 000000000000..4f779ef53241
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
-@@ -0,0 +1,194 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PLATFORM_SUPPORT_H
-+#define __PLATFORM_SUPPORT_H
-+
-+#include "storage_class.h"
-+
-+#define MSEC_IN_SEC 1000
-+#define NSEC_IN_MSEC 1000000
-+
-+#define NUM_SLEEP_MSEC_WA_XTENSA 1
-+
-+#if defined(_MSC_VER)
-+#include <string.h>
-+
-+#define IA_CSS_EXTERN
-+#define SYNC_WITH(x)
-+#define CSS_ALIGN(d, a) _declspec(align(a)) d
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    /* Placeholder for driver team*/
-+}
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+    /* Placeholder for driver team*/
-+    (void)delay_time_ms;
-+}
-+
-+#elif defined(__HIVECC)
-+#include <string.h>
-+#include <hive/support.h>
-+#include <hive/attributes.h>
-+
-+#define IA_CSS_EXTERN extern
-+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    OP___schedule();
-+}
-+
-+#elif defined(__KERNEL__)
-+#include <linux/string.h>
-+#include <linux/delay.h>
-+
-+#define IA_CSS_EXTERN
-+#define CSS_ALIGN(d, a) d __aligned(a)
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    usleep_range(1, 50);
-+}
-+#elif defined(__XTENSA_FW__)
-+
-+#include <hive/support.h>
-+
-+#define ALIAS_ATTR(target) __attribute__((alias(#target)))
-+#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
-+
-+#elif defined(__GNUC__)
-+#include <string.h>
-+
-+#define IA_CSS_EXTERN
-+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
-+
-+/* Define some __HIVECC specific macros to nothing to allow host code compilation */
-+#ifndef NO_ALIAS
-+#define NO_ALIAS
-+#endif
-+
-+#ifndef SYNC_WITH
-+#define SYNC_WITH(x)
-+#endif
-+
-+#if defined(HRT_CSIM)
-+#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    /* For the SDK still using hrt_sleep */
-+    hrt_sleep();
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+    /* For the SDK still using hrt_sleep */
-+    unsigned int long i = 0;
-+
-+    for (i = 0; i < delay_time_ms; i++) {
-+        hrt_sleep();
-+    }
-+}
-+#elif defined(__XTENSA_FW__) /* XTENSA FW */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    /* do nothing */
-+}
-+#elif defined(IPUSIM_SLEEP)
-+#include "hrt/host.h"
-+#include "misc_support.h" /* for NOT_USED macro */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    hrt_sleep();
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+    /* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
-+     * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
-+     * This is because ia_css_sleep_msec is used thousands of times (BUG).
-+     * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
-+     */
-+    NOT_USED(delay_time_ms);
-+    hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
-+}
-+#else
-+#include <time.h>
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+    struct timespec delay_time;
-+
-+    delay_time.tv_sec = 0;
-+    delay_time.tv_nsec = 10;
-+    nanosleep(&delay_time, NULL);
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+    struct timespec delay_time;
-+
-+    if (delay_time_ms >= MSEC_IN_SEC) {
-+        delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
-+        delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
-+    } else {
-+        delay_time.tv_sec = 0;
-+        delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
-+    }
-+    nanosleep(&delay_time, NULL);
-+}
-+#endif
-+
-+#else
-+
-+#if defined(__XTENSA_FW__)
-+
-+#define CSS_ALIGN(d, a) d
-+
-+#define ia_css_sleep()
-+
-+#if defined(__XTENSA_EL__)
-+#define __IEEE_LITTLE_ENDIAN
-+#else
-+#define __IEEE_BIG_ENDIAN
-+#endif
-+
-+#endif
-+#include <string.h>
-+#endif
-+
-+/*needed for the include in stdint.h for various environments */
-+#include "type_support.h"
-+#include "storage_class.h"
-+
-+#define MAX_ALIGNMENT            8
-+#define aligned_uint8(type, obj)    CSS_ALIGN(uint8_t obj, 1)
-+#define aligned_int8(type, obj)        CSS_ALIGN(int8_t obj, 1)
-+#define aligned_uint16(type, obj)    CSS_ALIGN(uint16_t obj, 2)
-+#define aligned_int16(type, obj)    CSS_ALIGN(int16_t obj, 2)
-+#define aligned_uint32(type, obj)    CSS_ALIGN(uint32_t obj, 4)
-+#define aligned_int32(type, obj)    CSS_ALIGN(int32_t obj, 4)
-+
-+/* needed as long as hivecc does not define the type (u)int64_t */
-+#if defined(__HIVECC)
-+#define aligned_uint64(type, obj)    CSS_ALIGN(unsigned long long obj, 8)
-+#define aligned_int64(type, obj)    CSS_ALIGN(signed long long obj, 8)
-+#else
-+#define aligned_uint64(type, obj)    CSS_ALIGN(uint64_t obj, 8)
-+#define aligned_int64(type, obj)    CSS_ALIGN(int64_t obj, 8)
-+#endif
-+#define aligned_enum(enum_type, obj)    CSS_ALIGN(uint32_t obj, 4)
-+#define aligned_struct(struct_type, obj)    struct_type obj
-+
-+#endif /* __PLATFORM_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
-new file mode 100644
-index 000000000000..9ddffb4b5c41
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PRINT_SUPPORT_H
-+#define __PRINT_SUPPORT_H
-+
-+#if defined(_MSC_VER)
-+#ifdef _KERNEL_MODE
-+
-+/* TODO: Windows driver team to provide tracing mechanism for kernel mode
-+ * e.g. DbgPrint and DbgPrintEx
-+ */
-+extern void FwTracePrintPWARN(const char *fmt, ...);
-+extern void FwTracePrintPRINT(const char *fmt, ...);
-+extern void FwTracePrintPERROR(const char *fmt, ...);
-+extern void FwTracePrintPDEBUG(const char *fmt, ...);
-+extern void FwTracePrintPFATAL(const char *fmt, ...);
-+
-+#define PWARN(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
-+#define PWARNING(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
-+#define PRINT(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PINFO(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PERROR(format, ...)    FwTracePrintPERROR(format, __VA_ARGS__)
-+#define PDEBUG(format, ...)    FwTracePrintPDEBUG(format, __VA_ARGS__)
-+#define PVERBOSE(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PFATAL(format, ...)    FwTracePrintPFATAL(format, __VA_ARGS__)
-+
-+#else
-+/* Windows usermode compilation */
-+#include <stdio.h>
-+
-+/* To change the defines below, communicate with Windows team first
-+ * to ensure they will not get flooded with prints
-+ */
-+/* This is temporary workaround to avoid flooding userspace
-+ * Windows driver with prints
-+ */
-+
-+#define PWARN(format, ...)
-+#define PWARNING(format, ...)
-+#define PRINT(format, ...)
-+#define PINFO(format, ...)
-+#define PERROR(format, ...)    printf("error: " format, __VA_ARGS__)
-+#define PDEBUG(format, ...)
-+#define PVERBOSE(format, ...)
-+#define PFATAL(format, ...)
-+
-+#endif /* _KERNEL_MODE */
-+#elif defined(__HIVECC)
-+#include <hive/support.h>
-+/* To be revised
-+
-+#define PWARN(format)
-+#define PRINT(format)                OP___printstring(format)
-+#define PERROR(variable)            OP___dump(9999, arguments)
-+#define PDEBUG(variable)            OP___dump(__LINE__, arguments)
-+
-+*/
-+
-+#define PRINTSTRING(str) OP___printstring(str)
-+
-+#elif defined(__KERNEL__)
-+#include <linux/kernel.h>
-+#include <linux/printk.h>
-+
-+#define PWARN(format, arguments...)    pr_debug(format, ##arguments)
-+#define PRINT(format, arguments...)    pr_debug(format, ##arguments)
-+#define PERROR(format, arguments...)    pr_debug(format, ##arguments)
-+#define PDEBUG(format, arguments...)    pr_debug(format, ##arguments)
-+
-+#elif defined(__XTENSA_FW__)
-+
-+#include "print_support_xtensa.h"
-+
-+#elif defined(XTENSA_HOST)
-+
-+#include "print_support_xtensa.h"
-+
-+#else
-+
-+#include <stdio.h>
-+
-+#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
-+
-+/** WA_1507432540 - Limit prints to PERROR only
-+ * Workaround to avoid flooding host with prints.
-+ */
-+#ifdef HOST_LOGLEVEL_ERROR_ONLY
-+
-+/* The trailing "" allows the edge case of printing single string */
-+#define PWARN(...)
-+#define PRINT(...)
-+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
-+#define PDEBUG(...)
-+
-+#else
-+
-+/* The trailing "" allows the edge case of printing single string */
-+#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
-+#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
-+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
-+#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
-+
-+#endif
-+#define PRINTSTRING(str) PRINT(str)
-+
-+#endif
-+#endif /* __PRINT_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
-new file mode 100644
-index 000000000000..72eb0cf5bc09
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
-@@ -0,0 +1,504 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
-+#define __PSYS_SYSTEM_GLOBAL_IMPL_H
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include "ia_css_psys_sim_trace.h"
-+#include <assert_support.h>
-+
-+/* Use vied_bits instead, however for test purposes we uses explicit type
-+ * checking
-+ */
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bit_mask(
-+    const unsigned int                        index)
-+{
-+    vied_nci_resource_bitmap_t    bit_mask = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
-+
-+    if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
-+        bit_mask = (vied_nci_resource_bitmap_t)1 << index;
-+
-+    return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask)
-+{
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
-+
-+/*
-+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+    return bitmap | bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask)
-+{
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_bitmap_clear(): enter:\n");
-+
-+/*
-+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+    return bitmap & (~bit_mask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
-+        const unsigned int position,
-+        const unsigned int size)
-+{
-+    vied_nci_resource_bitmap_t    bit_mask = 0;
-+    vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+               "vied_nci_bitfield_mask(): enter:\n");
-+
-+    if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
-+        bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
-+
-+    return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const unsigned int                        index,
-+    const unsigned int                        size)
-+{
-+    vied_nci_resource_bitmap_t    ret = 0;
-+    vied_nci_resource_bitmap_t    bit_mask = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+               "vied_nci_bit_mask_set_bitfield(): enter:\n");
-+
-+    bit_mask = vied_nci_bitfield_mask(index, size);
-+    ret = vied_nci_bitmap_set(bitmap, bit_mask);
-+
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask)
-+{
-+    vied_nci_resource_bitmap_t    ret = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_bitmap_set_unique(): enter:\n");
-+
-+    if ((bitmap & bit_mask) == 0)
-+        ret = bitmap | bit_mask;
-+
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const unsigned int                        index)
-+{
-+    vied_nci_resource_bitmap_t    ret = 0;
-+    vied_nci_resource_bitmap_t    bit_mask;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+               "vied_nci_bit_mask_set_unique(): enter:\n");
-+
-+    bit_mask = vied_nci_bit_mask(index);
-+
-+    if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
-+        ret = bitmap | bit_mask;
-+
-+    return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_empty(
-+    const vied_nci_resource_bitmap_t        bitmap)
-+{
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_bitmap_empty(): enter:\n");
-+
-+    return (bitmap == 0);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_set(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask)
-+{
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_bitmap_set(): enter:\n");
-+
-+/*
-+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+    return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bit_set_in_bitmap(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const unsigned int        index)
-+{
-+
-+    vied_nci_resource_bitmap_t bitmask;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_bit_set_in_bitmap(): enter:\n");
-+    bitmask = vied_nci_bit_mask(index);
-+    return vied_nci_is_bitmap_set(bitmap, bitmask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_clear(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask)
-+{
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_bitmap_clear(): enter:\n");
-+
-+/*
-+    assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+    return ((bitmap & bit_mask) == 0);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+int vied_nci_bitmap_compute_weight(
-+    const vied_nci_resource_bitmap_t        bitmap)
-+{
-+    vied_nci_resource_bitmap_t    loc_bitmap = bitmap;
-+    int    weight = 0;
-+    int    i;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_bitmap_compute_weight(): enter:\n");
-+
-+    /* Do not need the iterator "i" */
-+    for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
-+            (loc_bitmap != 0); i++) {
-+        weight += loc_bitmap & 0x01;
-+        loc_bitmap >>= 1;
-+    }
-+
-+    return weight;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
-+    const vied_nci_resource_bitmap_t    bitmap0,
-+    const vied_nci_resource_bitmap_t    bitmap1)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_bitmap_union(): enter:\n");
-+    return (bitmap0 | bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
-+    const vied_nci_resource_bitmap_t        bitmap0,
-+    const vied_nci_resource_bitmap_t        bitmap1)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "ia_css_kernel_bitmap_intersection(): enter:\n");
-+    return (bitmap0 & bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
-+    const vied_nci_resource_bitmap_t        bitmap0,
-+    const vied_nci_resource_bitmap_t        bitmap1)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
-+    return (bitmap0 ^ bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
-+    const vied_nci_cell_ID_t        cell_id)
-+{
-+    vied_nci_resource_bitmap_t    bit_mask = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_cell_bit_mask(): enter:\n");
-+
-+    if (cell_id < VIED_NCI_N_CELL_ID) {
-+        bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
-+    }
-+    return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
-+    const vied_nci_barrier_ID_t        barrier_id)
-+{
-+    vied_nci_resource_bitmap_t    bit_mask = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_barrier_bit_mask(): enter:\n");
-+
-+    if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
-+        bit_mask = (vied_nci_resource_bitmap_t)1 <<
-+                (barrier_id + VIED_NCI_N_CELL_ID);
-+    }
-+    return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
-+    const vied_nci_cell_ID_t        cell_id)
-+{
-+    vied_nci_cell_type_ID_t    cell_type = VIED_NCI_N_CELL_TYPE_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_cell_get_type(): enter:\n");
-+
-+    if (cell_id < VIED_NCI_N_CELL_ID) {
-+        cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+            "vied_nci_cell_get_type(): invalid argument\n");
-+    }
-+
-+    return cell_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
-+    const vied_nci_mem_type_ID_t        mem_type)
-+{
-+    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_ext_mem_get_id_from_type(): enter:\n");
-+
-+    if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
-+        mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+            "vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
-+    }
-+
-+    return mem_id;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
-+    const vied_nci_mem_ID_t            mem_id)
-+{
-+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_mem_get_type(): enter:\n");
-+
-+    if (mem_id < VIED_NCI_N_MEM_ID) {
-+        mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+            "vied_nci_mem_get_type(): invalid argument\n");
-+    }
-+
-+    return mem_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_mem_get_size(
-+    const vied_nci_mem_ID_t            mem_id)
-+{
-+    uint16_t    mem_size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_mem_get_size(): enter:\n");
-+
-+    if (mem_id < VIED_NCI_N_MEM_ID) {
-+        mem_size = vied_nci_mem_size[mem_id];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+            "vied_nci_mem_get_size(): invalid argument\n");
-+    }
-+
-+    return mem_size;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_dev_chn_get_size(
-+    const vied_nci_dev_chn_ID_t        dev_chn_id)
-+{
-+    uint16_t    dev_chn_size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_dev_chn_get_size(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+    if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+        dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+            "vied_nci_dev_chn_get_size(): invalid argument\n");
-+    }
-+#else
-+    ((void)(dev_chn_id)); /* not used in ipu7 */
-+#endif
-+    return dev_chn_size;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_cell_of_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const vied_nci_cell_type_ID_t    cell_type_id)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_cell_of_type(): enter:\n");
-+
-+    return ((vied_nci_cell_get_type(cell_id) ==
-+         cell_type_id) && (cell_type_id !=
-+         VIED_NCI_N_CELL_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_mem_of_type(
-+    const vied_nci_mem_ID_t            mem_id,
-+    const vied_nci_mem_type_ID_t    mem_type_id)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_mem_of_type(): enter:\n");
-+
-+    return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
-+        (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_cell_mem_of_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index,
-+    const vied_nci_mem_type_ID_t    mem_type_id)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_is_cell_mem_of_type(): enter:\n");
-+
-+    return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
-+        && (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_has_cell_mem_of_id(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const vied_nci_mem_ID_t            mem_id)
-+{
-+    uint16_t        mem_index;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_has_cell_mem_of_id(): enter:\n");
-+
-+    for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
-+        if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
-+            (mem_id != VIED_NCI_N_MEM_ID)) {
-+            break;
-+        }
-+    }
-+
-+    return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_cell_get_mem_count(
-+    const vied_nci_cell_ID_t        cell_id)
-+{
-+    uint16_t    mem_count = 0;
-+    vied_nci_cell_type_ID_t    cell_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_cell_get_mem_count(): enter:\n");
-+
-+    cell_type = vied_nci_cell_get_type(cell_id);
-+
-+    if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
-+        mem_count = vied_nci_N_cell_mem[cell_type];
-+
-+    return mem_count;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index)
-+{
-+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_cell_get_mem_type(): enter:\n");
-+
-+    if ((cell_id < VIED_NCI_N_CELL_ID) &&
-+        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
-+                vied_nci_cell_get_type(cell_id)][mem_index]);
-+    }
-+
-+    return mem_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_ID_t vied_nci_cell_get_mem(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index)
-+{
-+    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+        "vied_nci_cell_get_mem(): enter:\n");
-+
-+    if ((cell_id < VIED_NCI_N_CELL_ID) &&
-+        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+        mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
-+    }
-+
-+    return mem_id;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
-+    const vied_nci_cell_type_ID_t    cell_type_id,
-+    const uint16_t                    mem_index)
-+{
-+    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+               "vied_nci_cell_type_get_mem_type(): enter:\n");
-+
-+    if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
-+            && (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
-+    }
-+
-+    return mem_type;
-+}
-+
-+#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
-new file mode 100644
-index 000000000000..aeb9ffb3b367
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __STORAGE_CLASS_H
-+#define __STORAGE_CLASS_H
-+
-+#define STORAGE_CLASS_EXTERN \
-+extern
-+
-+#if defined(_MSC_VER)
-+#define STORAGE_CLASS_INLINE \
-+static __inline
-+#elif defined(__HIVECC)
-+#define STORAGE_CLASS_INLINE \
-+static inline
-+#elif defined(__XTENSA_FW__)
-+#include "storage_class_xtensa.h"
-+#else
-+#define STORAGE_CLASS_INLINE \
-+static inline
-+#endif
-+
-+/* Register struct */
-+#ifndef __register
-+#if defined(__HIVECC) && !defined(PIPE_GENERATION)
-+#define __register register
-+#else
-+#define __register
-+#endif
-+#endif
-+
-+/* Memory attribute */
-+#ifndef MEM
-+#ifdef PIPE_GENERATION
-+#elif defined(__HIVECC)
-+#include <hive/attributes.h>
-+#else
-+#define MEM(any_mem)
-+#endif
-+#endif
-+
-+#endif /* __STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
-new file mode 100644
-index 000000000000..57fea54527a8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
-@@ -0,0 +1,82 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __TYPE_SUPPORT_H
-+#define __TYPE_SUPPORT_H
-+
-+/* Per the DLI spec, types are in "type_support.h" and
-+ * "platform_support.h" is for unclassified/to be refactored
-+ * platform specific definitions.
-+ */
-+#define IA_CSS_UINT8_T_BITS    8
-+#define IA_CSS_UINT16_T_BITS    16
-+#define IA_CSS_UINT32_T_BITS    32
-+#define IA_CSS_INT32_T_BITS    32
-+#define IA_CSS_UINT64_T_BITS    64
-+
-+#if defined(_MSC_VER)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#if defined(_M_X64)
-+#define HOST_ADDRESS(x) (unsigned long long)(x)
-+#else
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+#endif
-+
-+#elif defined(PARAM_GENERATION)
-+/* Nothing */
-+#elif defined(__HIVECC)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+typedef long long int64_t;
-+typedef unsigned long long uint64_t;
-+
-+#elif defined(__XTENSA_FW__)
-+#include "type_support_xtensa.h"
-+#elif defined(__KERNEL__)
-+#include <linux/types.h>
-+#include <linux/limits.h>
-+
-+#define CHAR_BIT (8)
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#elif defined(__GNUC__)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#else /* default is for the FIST environment */
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#endif
-+#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
-+/* genpipe cannot handle the void* syntax */
-+typedef void *HANDLE;
-+#endif
-+
-+#endif /* __TYPE_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
-new file mode 100644
-index 000000000000..3ceb0c70c2db
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
-+#define VIED_NCI_ACB_ROUTE_TYPE_H_
-+
-+#include "type_support.h"
-+
-+typedef enum {
-+    NCI_ACB_PORT_ISP = 0,
-+    NCI_ACB_PORT_ACC = 1,
-+    NCI_ACB_PORT_INVALID = 0xFF
-+} nci_acb_port_t;
-+
-+typedef struct {
-+    /* 0 = ISP, 1 = Acc */
-+    nci_acb_port_t in_select;
-+    /* 0 = ISP, 1 = Acc */
-+    nci_acb_port_t out_select;
-+    /* When set, Ack will be sent only when Eof arrives */
-+    uint32_t ignore_line_num;
-+    /* Fork adapter to enable streaming to both output
-+     * (next acb out and isp out)
-+     */
-+    uint32_t fork_acb_output;
-+} nci_acb_route_t;
-+
-+#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
-new file mode 100644
-index 000000000000..6d649617c16b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
-@@ -0,0 +1,380 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
-+#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
-+
-+#include "type_support.h"
-+#include "storage_class.h"
-+
-+#define HAS_DFM                 1
-+#define HAS_DMA_INTERNAL        1
-+#define NON_RELOC_RESOURCE_SUPPORT    1
-+#define IA_CSS_KERNEL_BITMAP_BITS     128
-+
-+/* Defines for the routing bitmap in the program group manifest.
-+ */
-+#define VIED_NCI_RBM_MAX_MUX_COUNT            46
-+#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT        17
-+#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT        4
-+#define N_PADDING_UINT8_IN_RBM_MANIFEST            2
-+
-+/* The amount of padding bytes needed to make
-+ * ia_css_process_s/ia_css_process_ext_s/
-+ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
-+ * structures 32 bit aligned (source files have check on this)
-+ */
-+#define    N_PADDING_UINT8_IN_PROCESS_STRUCT        0
-+#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT        0
-+#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST        0
-+#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT        2
-+
-+/*
-+ * Cell IDs
-+ */
-+typedef enum {
-+    VIED_NCI_SP0_ID = 0,
-+    VIED_NCI_VP0_ID,
-+    VIED_NCI_PSA_ACC_BNLM_ID,
-+    VIED_NCI_PSA_ACC_DM_ID,
-+    VIED_NCI_PSA_ACC_ACM_ID,
-+    VIED_NCI_PSA_ACC_GTC_YUV1_ID,
-+    VIED_NCI_BB_ACC_OFS_PIN_MAIN_ID,
-+    VIED_NCI_BB_ACC_OFS_PIN_DISPLAY_ID,
-+    VIED_NCI_BB_ACC_OFS_PIN_PP_ID,
-+    VIED_NCI_PSA_ACC_GAMMASTAR_ID,
-+    VIED_NCI_PSA_ACC_GLTM_ID,
-+    VIED_NCI_PSA_ACC_XNR_ID,
-+    VIED_NCI_PSA_VCSC_ID,    /* VCSC */
-+    VIED_NCI_ISA_ICA_ID,
-+    VIED_NCI_ISA_LSC_ID,
-+    VIED_NCI_ISA_DPC_ID,
-+    VIED_NCI_ISA_SIS_A_ID,
-+    VIED_NCI_ISA_SIS_B_ID,
-+    VIED_NCI_ISA_B2B_ID,
-+    VIED_NCI_ISA_B2R_R2I_SIE_ID,
-+    VIED_NCI_ISA_R2I_DS_A_ID,
-+    VIED_NCI_ISA_R2I_DS_B_ID,
-+    VIED_NCI_ISA_AWB_ID,
-+    VIED_NCI_ISA_AE_ID,
-+    VIED_NCI_ISA_AF_ID,
-+    VIED_NCI_ISA_DOL_ID,
-+    VIED_NCI_ISA_ICA_MEDIUM_ID,
-+    VIED_NCI_ISA_X2B_MD_ID,
-+    VIED_NCI_ISA_X2B_SVE_RGBIR_ID,
-+    VIED_NCI_ISA_PAF_ID,
-+    VIED_NCI_BB_ACC_GDC0_ID,
-+    VIED_NCI_BB_ACC_TNR_ID,
-+} vied_nci_cell_ID_t;
-+
-+#define VIED_NCI_N_CELL_ID (VIED_NCI_BB_ACC_TNR_ID + 1)
-+
-+/*
-+ * In several places we don't need to size the look up tables for the full amount of cells
-+ * because they are only used for the VP and SP cells and not for the accelerator cells.
-+ * It is important that these cells are in the beginning of the LUT
-+ */
-+#define VIED_NCI_N_PROG_CELLS (VIED_NCI_VP0_ID + 1)
-+
-+/*
-+ * Barrier bits (to model process group dependencies)
-+ * todo verify that this is valid for ipu6
-+ */
-+typedef enum {
-+    VIED_NCI_BARRIER0_ID,
-+    VIED_NCI_BARRIER1_ID,
-+    VIED_NCI_BARRIER2_ID,
-+    VIED_NCI_BARRIER3_ID,
-+    VIED_NCI_BARRIER4_ID,
-+    VIED_NCI_BARRIER5_ID,
-+    VIED_NCI_BARRIER6_ID,
-+    VIED_NCI_BARRIER7_ID
-+} vied_nci_barrier_ID_t;
-+
-+#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
-+/*
-+ * Cell types
-+ */
-+typedef enum {
-+    VIED_NCI_SP_CTRL_TYPE_ID = 0,
-+    VIED_NCI_SP_SERVER_TYPE_ID,
-+    VIED_NCI_VP_TYPE_ID,
-+    VIED_NCI_ACC_PSA_TYPE_ID,
-+    VIED_NCI_ACC_ISA_TYPE_ID,
-+    VIED_NCI_ACC_OSA_TYPE_ID,
-+    VIED_NCI_GDC_TYPE_ID,
-+    VIED_NCI_TNR_TYPE_ID,
-+    VIED_NCI_N_CELL_TYPE_ID
-+} vied_nci_cell_type_ID_t;
-+
-+/*
-+ * Memory IDs
-+ */
-+typedef enum {
-+    VIED_NCI_VMEM0_ID = 0, /* ISP0 VMEM */
-+    VIED_NCI_TRANSFER_VMEM0_ID, /* TRANSFER VMEM 0 */
-+    VIED_NCI_TRANSFER_VMEM1_ID, /* TRANSFER VMEM 1 */
-+    VIED_NCI_LB_VMEM_ID, /* LB VMEM */
-+    VIED_NCI_BAMEM0_ID, /* ISP0 BAMEM */
-+    VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
-+    VIED_NCI_DMEM1_ID, /* SPP0 Dmem */
-+    VIED_NCI_DMEM2_ID, /* SPP1 Dmem */
-+    VIED_NCI_DMEM3_ID, /* ISP0 Dmem */
-+    VIED_NCI_PMEM0_ID  /* ISP0 PMEM */
-+} vied_nci_mem_ID_t;
-+
-+#define VIED_NCI_N_MEM_ID (VIED_NCI_PMEM0_ID + 1)
-+/*
-+ * Memory types
-+ */
-+typedef enum {
-+    VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
-+    VIED_NCI_TRANSFER_VMEM1_TYPE_ID,
-+    VIED_NCI_LB_VMEM_TYPE_ID,
-+    VIED_NCI_DMEM_TYPE_ID,
-+    VIED_NCI_VMEM_TYPE_ID,
-+    VIED_NCI_BAMEM_TYPE_ID,
-+    VIED_NCI_PMEM_TYPE_ID
-+} vied_nci_mem_type_ID_t;
-+
-+#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
-+/******************************************************/
-+
-+/* Excluding PMEM */
-+#define VIED_NCI_N_DATA_MEM_TYPE_ID     6 /* = MAX(vied_nci_mem_type_ID_t) */
-+
-+#define VIED_NCI_N_SP_CTRL_MEM        2
-+#define VIED_NCI_N_SP_SERVER_MEM    2
-+#define VIED_NCI_N_VP_MEM        4
-+#define VIED_NCI_N_ACC_PSA_MEM        0
-+#define VIED_NCI_N_ACC_ISA_MEM        0
-+#define VIED_NCI_N_ACC_OSA_MEM        0
-+#define VIED_NCI_N_GDC_MEM        0
-+#define VIED_NCI_N_TNR_MEM        0
-+
-+#define VIED_NCI_N_VP_CELL        1
-+#define VIED_NCI_N_ACC_CELL        13
-+/******************************************************/
-+/*
-+ * Device IDs
-+ * todo verify that this is valid for ipu6
-+ */
-+typedef enum {
-+    VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0,
-+    VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID,
-+    VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID,
-+    VIED_NCI_DEV_CHN_DMA_INTERNAL_ID,
-+    VIED_NCI_DEV_CHN_DMA_ISA_ID,
-+} vied_nci_dev_chn_ID_t;
-+
-+#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
-+
-+/*
-+ * DFM devices
-+ */
-+typedef enum {
-+    VIED_NCI_DEV_DFM_BB_FULL_PORT_ID = 0,
-+    VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID,
-+    VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID,
-+    VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID,
-+    VIED_NCI_DEV_DFM_LB_FULL_PORT_ID,
-+    VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID
-+} vied_nci_dev_dfm_id_t;
-+
-+#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID + 1)
-+
-+/*
-+ * Link IDs
-+ */
-+typedef enum {
-+    VIED_NCI_LINK_OTF_OFFLINE = 0,
-+    VIED_NCI_LINK_OTF_MAIN_OUTPUT,
-+    VIED_NCI_LINK_OTF_PDAF_OUTPUT,
-+    VIED_NCI_LINK_DATA_BARRIER_0,
-+    VIED_NCI_LINK_DATA_BARRIER_1,
-+    VIED_NCI_LINK_DATA_BARRIER_2,
-+    VIED_NCI_LINK_DATA_BARRIER_3,
-+    VIED_NCI_LINK_DATA_BARRIER_4,
-+    VIED_NCI_N_LINK_ID
-+} vied_nci_link_ID_t;
-+
-+/*
-+ * Psys server local object caches space
-+ */
-+typedef enum {
-+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
-+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
-+    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_2,
-+    VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
-+} vied_nci_psys_server_local_object_cache_t;
-+
-+/******************************************************/
-+/*todo verify  for ipu6*/
-+/*
-+ * Memory size (previously in vied_nci_psys_system.c)
-+ * VMEM: in words, 64 Byte per word.
-+ * TRANSFER VMEM0: in words, 64 Byte per word
-+ * TRANSFER VMEM1: in words, 64 Byte per word
-+ * LB VMEM: in words, 64 Byte per word.
-+ * BAMEM: in words, 64 Byte per word
-+ * DMEM: in words, 4 Byte per word.
-+ * PMEM: in words, 64 Byte per word.
-+ */
-+#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
-+#define VIED_NCI_TRANSFER_VMEM1_WORD_SIZE     64
-+#define VIED_NCI_LB_VMEM_WORD_SIZE     64
-+#define VIED_NCI_DMEM_WORD_SIZE      4
-+#define VIED_NCI_VMEM_WORD_SIZE     64
-+#define VIED_NCI_BAMEM_WORD_SIZE    64
-+#define VIED_NCI_PMEM_WORD_SIZE     64
-+
-+/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
-+#define VIED_NCI_VMEM0_MAX_SIZE            (0x0800)
-+#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE    (0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
-+#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE    (0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
-+#define VIED_NCI_LB_VMEM_MAX_SIZE        (0x0400) /* LB VMEM words */
-+/* ISP BAMEM words $HIVECORES/idsp/include/hive/cell_params.h */
-+#define VIED_NCI_BAMEM0_MAX_SIZE        (0x0800)
-+#define VIED_NCI_DMEM0_MAX_SIZE            (0x4000)
-+#define VIED_NCI_DMEM1_MAX_SIZE            (0x1000)
-+#define VIED_NCI_DMEM2_MAX_SIZE            (0x1000)
-+#define VIED_NCI_DMEM3_MAX_SIZE            (0x1000)
-+#define VIED_NCI_PMEM0_MAX_SIZE            (0x0500)
-+
-+/*
-+ * Number of channels per device
-+ */
-+#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE        (30)
-+#define VIED_NCI_DEV_CHN_GDC_MAX_SIZE            (0)
-+#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE        (30)
-+/*
-+ NOTE: once FW code will support DMA with one unit
-+ descriptor #channels will be cut but half (36->18).
-+*/
-+#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE    (37)
-+#define VIED_NCI_DEV_CHN_DMA_INTERNAL_MAX_SIZE        (8)
-+#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE        (0)
-+#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE        (2)
-+
-+/*
-+ * Number of ports per DFM device
-+ */
-+#define VIED_NCI_DEV_DFM_BB_FULL_PORT_ID_MAX_SIZE        (32)
-+#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE        (32)
-+#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE        (32)
-+#define VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID_MAX_SIZE        (32)
-+#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE        (32)
-+#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE        (32)
-+/******************************************************/
-+
-+/*
-+ * Storage of the resource and resource type enumerators
-+ */
-+#define VIED_NCI_RESOURCE_ID_BITS    8
-+typedef uint8_t                vied_nci_resource_id_t;
-+
-+#define VIED_NCI_RESOURCE_SIZE_BITS    16
-+typedef uint16_t            vied_nci_resource_size_t;
-+
-+#define VIED_NCI_RESOURCE_BITMAP_BITS    32
-+typedef uint32_t            vied_nci_resource_bitmap_t;
-+
-+#define IA_CSS_PROCESS_INVALID_DEPENDENCY    ((vied_nci_resource_id_t)(-1))
-+#define IA_CSS_PROCESS_INVALID_OFFSET        ((vied_nci_resource_size_t)(-1))
-+#define IA_CSS_PROCESS_MAX_CELLS        1
-+
-+#define IA_CSS_MAX_INPUT_DEC_RESOURCES        4
-+#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES        4
-+/*
-+ * Resource specifications
-+ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
-+ * these are called internal/external memory.
-+ */
-+
-+/* resource spec for internal (local) memory */
-+struct vied_nci_resource_spec_int_mem_s {
-+    vied_nci_resource_id_t        type_id;
-+    vied_nci_resource_size_t    size;
-+    vied_nci_resource_size_t    offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_int_mem_s
-+    vied_nci_resource_spec_int_mem_t;
-+
-+/* resource spec for external (remote) memory */
-+struct vied_nci_resource_spec_ext_mem_s {
-+    vied_nci_resource_id_t        type_id;
-+    vied_nci_resource_size_t    size;
-+    vied_nci_resource_size_t    offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_ext_mem_s
-+    vied_nci_resource_spec_ext_mem_t;
-+
-+/* resource spec for device channel */
-+struct vied_nci_resource_spec_dev_chn_s {
-+    vied_nci_resource_id_t        type_id;
-+    vied_nci_resource_size_t    size;
-+    vied_nci_resource_size_t    offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_dev_chn_s
-+    vied_nci_resource_spec_dev_chn_t;
-+
-+/* resource spec for DFM port */
-+struct vied_nci_resource_spec_dfm_port_s {
-+    vied_nci_resource_id_t        type_id;
-+    vied_nci_resource_bitmap_t    bitmask;
-+};
-+
-+typedef struct vied_nci_resource_spec_dfm_port_s
-+    vied_nci_resource_spec_dfm_port_t;
-+
-+/* resource spec for all contiguous resources */
-+struct vied_nci_resource_spec_s {
-+    vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
-+    vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+    vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
-+};
-+
-+typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
-+
-+#ifndef PIPE_GENERATION
-+
-+extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
-+extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
-+extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_type_ID_t */
-+    vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_ID_t */
-+    vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_ID_t */
-+    vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
-+extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
-+extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
-+
-+STORAGE_CLASS_INLINE
-+uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+    return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
-+        (mem_type_id == VIED_NCI_TRANSFER_VMEM1_TYPE_ID) ||
-+        (mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
-+}
-+
-+#endif /* PIPE_GENERATION */
-+#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
-new file mode 100644
-index 000000000000..5597ab02a4f2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
-@@ -0,0 +1,186 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
-+#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
-+
-+#include <type_support.h>
-+#include "ia_css_base_types.h"
-+#include "ia_css_psys_sim_storage_class.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+/*
-+ * Key system types
-+ */
-+/* Subsystem internal physical address */
-+#define VIED_ADDRESS_BITS 32
-+
-+/* typedef uint32_t vied_address_t; */
-+
-+/* Subsystem internal virtual address */
-+
-+/* Subsystem internal data bus */
-+#define VIED_DATA_BITS 32
-+typedef uint32_t vied_data_t;
-+
-+#define VIED_NULL ((vied_vaddress_t)0)
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bit_mask(
-+    const unsigned                    index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_empty(
-+    const vied_nci_resource_bitmap_t        bitmap);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_set(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bit_set_in_bitmap(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const unsigned int        index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_clear(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+int vied_nci_bitmap_compute_weight(
-+    const vied_nci_resource_bitmap_t        bitmap);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
-+    const vied_nci_resource_bitmap_t        bitmap0,
-+    const vied_nci_resource_bitmap_t        bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
-+    const vied_nci_resource_bitmap_t        bitmap0,
-+    const vied_nci_resource_bitmap_t        bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
-+    const vied_nci_resource_bitmap_t        bitmap0,
-+    const vied_nci_resource_bitmap_t        bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const vied_nci_resource_bitmap_t        bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
-+        const unsigned int position,
-+        const unsigned int size);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
-+const vied_nci_resource_bitmap_t        bitmap,
-+const unsigned int                        index,
-+const unsigned int                        size);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
-+    const vied_nci_resource_bitmap_t        bitmap,
-+    const unsigned                    index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
-+    const vied_nci_cell_ID_t        cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
-+    const vied_nci_barrier_ID_t        barrier_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
-+    const vied_nci_cell_ID_t        cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
-+    const vied_nci_mem_type_ID_t        mem_type);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
-+    const vied_nci_mem_ID_t            mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_mem_get_size(
-+    const vied_nci_mem_ID_t            mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_dev_chn_get_size(
-+    const vied_nci_dev_chn_ID_t        dev_chn_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_cell_of_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const vied_nci_cell_type_ID_t    cell_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_mem_of_type(
-+    const vied_nci_mem_ID_t            mem_id,
-+    const vied_nci_mem_type_ID_t    mem_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_cell_mem_of_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index,
-+    const vied_nci_mem_type_ID_t    mem_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_has_cell_mem_of_id(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const vied_nci_mem_ID_t            mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_cell_get_mem_count(
-+    const vied_nci_cell_ID_t        cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_ID_t vied_nci_cell_get_mem(
-+    const vied_nci_cell_ID_t        cell_id,
-+    const uint16_t                    mem_index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
-+    const vied_nci_cell_type_ID_t    cell_type_id,
-+    const uint16_t                    mem_index);
-+
-+#ifdef __IA_CSS_PSYS_SIM_INLINE__
-+#include "psys_system_global_impl.h"
-+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
-+
-+#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
-new file mode 100644
-index 000000000000..35a1dcc78de2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_kernel_bitmap.h>
-+#include <type_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include "math_support.h"
-+#include "ia_css_psys_kernel_trace.h"
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#include "ia_css_kernel_bitmap_impl.h"
-+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
-+
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
-+    ia_css_kernel_bitmap_t                bitmap,
-+    const unsigned int                elem_index,
-+    const uint32_t                    elem_value)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
-+
-+    if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
-+        bitmap.data[elem_index] = elem_value;
-+    } else {
-+        assert(0);
-+    }
-+#else
-+    COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
-+
-+    bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
-+                            (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+    bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
-+#endif
-+
-+    return bitmap;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
-+    const uint64_t value)
-+{
-+    const unsigned int bits64 = sizeof(uint64_t) * 8;
-+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+    unsigned int i;
-+    ia_css_kernel_bitmap_t result;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    result = ia_css_kernel_bitmap_clear();
-+    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
-+        /* masking is done implictly, the MSB bits of casting will bel chopped off */
-+        result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
-+            (value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+    }
-+
-+#if IA_CSS_KERNEL_BITMAP_BITS < 64
-+    if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
-+            "ia_css_kernel_bitmap_create_from_uint64(): "
-+            "kernel bitmap is not wide enough to encode value\n");
-+        assert(0);
-+    }
-+#endif
-+#else
-+    NOT_USED(i);
-+    NOT_USED(nof_elems_bits64);
-+    result = value;
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+    return result;
-+}
-+
-+uint64_t ia_css_kernel_bitmap_to_uint64(
-+    const ia_css_kernel_bitmap_t value)
-+{
-+    const unsigned int bits64 = sizeof(uint64_t) * 8;
-+    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+    unsigned int i;
-+    uint64_t res = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+        "ia_css_kernel_bitmap_to_uint64(): enter:\n");
-+
-+    assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
-+    assert(nof_elems_bits64 > 0);
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+    for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
-+        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+    }
-+    for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+        assert(value.data[i] == 0);
-+    }
-+    return res;
-+#else
-+    (void)i;
-+    (void)res;
-+    (void)nof_elems_bits64;
-+    return (uint64_t)value;
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+}
-+
-+int ia_css_kernel_bitmap_print(
-+    const ia_css_kernel_bitmap_t            bitmap,
-+    void                        *fid)
-+{
-+    int retval = -1;
-+    int bit;
-+    unsigned int bit_index = 0;
-+    ia_css_kernel_bitmap_t loc_bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
-+        "ia_css_kernel_bitmap_print(): enter:\n");
-+
-+    NOT_USED(fid);
-+    NOT_USED(bit);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
-+
-+    loc_bitmap = bitmap;
-+
-+    for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
-+        !ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
-+
-+        bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
-+        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
-+        IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
-+    }
-+    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
-+
-+    retval = 0;
-+    return retval;
-+}
-+
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
-new file mode 100644
-index 000000000000..62369e7d8308
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_data_storage_class.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifdef __IA_CSS_PSYS_DATA_INLINE__
-+STORAGE_CLASS_INLINE int
-+__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __IA_CSS_PSYS_DATA_INLINE__ */
-+#include "ia_css_program_group_data_impl.h"
-+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
-new file mode 100644
-index 000000000000..e4ab5b901a4a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
-@@ -0,0 +1,769 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_program_group_param_private.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psysapi_fw_version.h>
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include <type_support.h>
-+#include <print_support.h>
-+
-+#include "ia_css_psys_param_trace.h"
-+
-+static int
-+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
-+               uint32_t offset,
-+               enum ia_css_frame_format_type frame_format_type);
-+
-+static int
-+ia_css_program_param_init(ia_css_program_param_t *program_param,
-+                int32_t offset);
-+
-+size_t ia_css_sizeof_program_group_param(
-+    const uint8_t program_count,
-+    const uint8_t terminal_count,
-+    const uint16_t fragment_count)
-+{
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_sizeof_program_group_param(): enter:\n");
-+
-+    verifexit(program_count != 0);
-+    verifexit(terminal_count != 0);
-+    verifexit(fragment_count != 0);
-+
-+    size += sizeof(ia_css_program_group_param_t);
-+    size += program_count * fragment_count * sizeof(ia_css_program_param_t);
-+    size += terminal_count * sizeof(ia_css_terminal_param_t);
-+EXIT:
-+    if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_sizeof_program_group_param invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+size_t ia_css_program_group_param_get_size(
-+    const ia_css_program_group_param_t        *program_group_param)
-+{
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+               "ia_css_program_group_param_get_size(): enter:\n");
-+
-+    if (program_group_param != NULL) {
-+        size = program_group_param->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+              "ia_css_program_group_param_get_size invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+size_t ia_css_program_param_get_size(
-+    const ia_css_program_param_t            *param)
-+{
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+               "ia_css_program_param_get_size(): enter:\n");
-+
-+    if (param != NULL) {
-+        size = param->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_param_get_size invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+ia_css_program_param_t *ia_css_program_group_param_get_program_param(
-+    const ia_css_program_group_param_t *param,
-+    const int i)
-+{
-+    ia_css_program_param_t    *program_param = NULL;
-+    ia_css_program_param_t    *program_param_base;
-+    int program_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_program_group_param_get_program_param(): enter:\n");
-+
-+    verifexit(param != NULL);
-+
-+    program_count =
-+        (int)ia_css_program_group_param_get_program_count(param);
-+
-+    verifexit(i < program_count);
-+
-+    program_param_base = (ia_css_program_param_t *)
-+            (((char *)param) + param->program_param_offset);
-+
-+    program_param = &program_param_base[i];
-+
-+EXIT:
-+    if (NULL == param || i >= program_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_program_param invalid argument\n");
-+    }
-+    return program_param;
-+}
-+
-+size_t ia_css_terminal_param_get_size(
-+    const ia_css_terminal_param_t            *param)
-+{
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_get_size(): enter:\n");
-+
-+    if (param != NULL) {
-+        size = param->size;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_terminal_param_get_size invalid argument\n");
-+    }
-+
-+    return size;
-+}
-+
-+ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
-+    const ia_css_program_group_param_t        *param,
-+    const int        i)
-+{
-+    ia_css_terminal_param_t    *terminal_param = NULL;
-+    ia_css_terminal_param_t    *terminal_param_base;
-+    int program_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_program_group_param_get_terminal_param(): enter:\n");
-+
-+    verifexit(param != NULL);
-+
-+    program_count =
-+        (int)ia_css_program_group_param_get_terminal_count(param);
-+
-+    verifexit(i < program_count);
-+
-+    terminal_param_base = (ia_css_terminal_param_t *)
-+            (((char *)param) + param->terminal_param_offset);
-+    terminal_param = &terminal_param_base[i];
-+EXIT:
-+    if (NULL == param || i >= program_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_terminal_param invalid argument\n");
-+    }
-+    return terminal_param;
-+}
-+
-+uint8_t ia_css_program_group_param_get_program_count(
-+    const ia_css_program_group_param_t        *param)
-+{
-+    uint8_t    program_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_program_group_param_get_program_count(): enter:\n");
-+
-+    if (param != NULL) {
-+        program_count = param->program_count;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_program_count invalid argument\n");
-+    }
-+    return program_count;
-+}
-+
-+uint8_t ia_css_program_group_param_get_terminal_count(
-+    const ia_css_program_group_param_t        *param)
-+{
-+    uint8_t    terminal_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_program_group_param_get_terminal_count(): enter:\n");
-+
-+    if (param != NULL) {
-+        terminal_count = param->terminal_count;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_terminal_count invalid argument\n");
-+    }
-+    return terminal_count;
-+}
-+
-+uint16_t ia_css_program_group_param_get_fragment_count(
-+    const ia_css_program_group_param_t        *param)
-+{
-+    uint8_t    fragment_count = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_program_group_param_get_fragment_count(): enter:\n");
-+
-+    if (param != NULL) {
-+        fragment_count = (uint8_t)param->fragment_count;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_fragment_count invalid argument\n");
-+    }
-+    return fragment_count;
-+}
-+
-+int ia_css_program_group_param_set_protocol_version(
-+    ia_css_program_group_param_t *param,
-+    uint8_t protocol_version)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+         "ia_css_program_group_param_set_protocol_version(): enter:\n");
-+
-+    if (param != NULL) {
-+        param->protocol_version = protocol_version;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_program_group_param_set_protocol_version failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+uint8_t ia_css_program_group_param_get_protocol_version(
-+    const ia_css_program_group_param_t *param)
-+{
-+    uint8_t protocol_version = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+         "ia_css_program_group_param_get_protocol_version(): enter:\n");
-+
-+    if (param != NULL) {
-+        protocol_version = param->protocol_version;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_protocol_version invalid argument\n");
-+    }
-+    return protocol_version;
-+}
-+
-+int ia_css_program_group_param_set_kernel_enable_bitmap(
-+    ia_css_program_group_param_t    *param,
-+    const ia_css_kernel_bitmap_t    bitmap)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+         "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
-+
-+    if (param != NULL) {
-+        param->kernel_enable_bitmap = bitmap;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
-+    const ia_css_program_group_param_t        *param)
-+{
-+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+         "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
-+
-+    if (param != NULL) {
-+        bitmap = param->kernel_enable_bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+int ia_css_program_param_set_kernel_enable_bitmap(
-+    ia_css_program_param_t        *program_param,
-+    const ia_css_kernel_bitmap_t    bitmap)
-+{
-+    assert(0);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+        "ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
-+
-+    if (program_param != NULL) {
-+        program_param->kernel_enable_bitmap = bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+            "ia_css_program_param_set_kernel_enable_bitmap failed\n");
-+    }
-+    return -1;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
-+    const ia_css_program_param_t    *program_param)
-+{
-+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
-+    char *base;
-+
-+    assert(0);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+        "ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
-+
-+    verifexit(program_param != NULL);
-+    verifexit(program_param->parent_offset != 0);
-+
-+    base = (char *)((char *)program_param + program_param->parent_offset);
-+    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
-+EXIT:
-+    if (NULL == program_param || 0 == program_param->parent_offset)    {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
-+    const ia_css_terminal_param_t            *param)
-+{
-+    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
-+    char *base;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
-+
-+    verifexit(param != NULL);
-+    verifexit(param->parent_offset != 0);
-+
-+    base = (char *)((char *)param + param->parent_offset);
-+    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
-+EXIT:
-+    if (NULL == param || 0 == param->parent_offset) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
-+    const ia_css_terminal_param_t    *param)
-+{
-+    ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_get_frame_format_type(): enter:\n");
-+
-+    verifexit(param != NULL);
-+
-+    ft = param->frame_format_type;
-+EXIT:
-+    if (NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_terminal_param_get_frame_format_type invalid argument\n");
-+    }
-+    return ft;
-+}
-+
-+int ia_css_terminal_param_set_frame_format_type(
-+    ia_css_terminal_param_t        *param,
-+    const ia_css_frame_format_type_t    data_format_type)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_set_frame_format_type(): enter:\n");
-+
-+    if (param != NULL) {
-+        param->frame_format_type = data_format_type;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_terminal_param_set_frame_format_type failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+uint8_t ia_css_terminal_param_get_bpp(
-+    const ia_css_terminal_param_t    *param)
-+{
-+    uint8_t bpp = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+               "ia_css_terminal_param_get_bpp(): enter:\n");
-+
-+    verifexit(param != NULL);
-+
-+    bpp = param->bpp;
-+
-+EXIT:
-+    if (NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_terminal_param_get_bpp invalid argument\n");
-+    }
-+    return bpp;
-+}
-+
-+int ia_css_terminal_param_set_bpp(
-+    ia_css_terminal_param_t    *param,
-+    const uint8_t bpp)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+               "ia_css_terminal_param_set_bpp(): enter:\n");
-+
-+    if (param != NULL) {
-+        param->bpp = bpp;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_terminal_param_set_bpp failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_terminal_param_get_dimensions(
-+    const ia_css_terminal_param_t    *param,
-+    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_get_dimensions(): enter:\n");
-+
-+    if (param != NULL) {
-+        dimensions[IA_CSS_COL_DIMENSION] =
-+            param->dimensions[IA_CSS_COL_DIMENSION];
-+        dimensions[IA_CSS_ROW_DIMENSION] =
-+            param->dimensions[IA_CSS_ROW_DIMENSION];
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+          "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_terminal_param_set_dimensions(
-+    ia_css_terminal_param_t    *param,
-+    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+        "ia_css_terminal_param_set_dimensions(): enter:\n");
-+
-+    if (param != NULL) {
-+        param->dimensions[IA_CSS_COL_DIMENSION] =
-+                dimensions[IA_CSS_COL_DIMENSION];
-+        param->dimensions[IA_CSS_ROW_DIMENSION] =
-+                dimensions[IA_CSS_ROW_DIMENSION];
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+          "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_terminal_param_set_stride(
-+    ia_css_terminal_param_t        *param,
-+    const uint32_t stride)
-+{
-+    int retval = -1;
-+
-+    verifexit(param != NULL);
-+    param->stride = stride;
-+    retval = 0;
-+
-+EXIT:
-+    return retval;
-+}
-+
-+uint32_t ia_css_terminal_param_get_stride(
-+    const ia_css_terminal_param_t    *param)
-+{
-+    uint32_t stride = 0;
-+
-+    verifexit(param != NULL);
-+    stride = param->stride;
-+
-+EXIT:
-+    return stride;
-+}
-+
-+static int ia_css_program_param_init(
-+        ia_css_program_param_t *program_param,
-+        int32_t offset)
-+{
-+    int retval = -1;
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
-+                (CHAR_BIT * sizeof(ia_css_program_param_t)));
-+    verifexit(program_param != NULL);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+        "ia_css_program_param_init(): enter:\n");
-+
-+    program_param->size = sizeof(ia_css_program_param_t);
-+    /* parent is at negative offset from current program.*/
-+    program_param->parent_offset = -offset;
-+    /*TODO: Kernel_bitmap setting. ?*/
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_program_param_init failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+static int
-+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
-+            uint32_t offset,
-+            enum ia_css_frame_format_type frame_format_type)
-+{
-+    int retval = -1;
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_terminal_param_t)));
-+    verifexit(terminal_param != NULL);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+        "ia_css_terminal_param_init(): enter:\n");
-+
-+    terminal_param->size = sizeof(ia_css_terminal_param_t);
-+    /* parent is at negative offset from current program.*/
-+    terminal_param->parent_offset = -((int32_t)offset);
-+    /*TODO: Kernel_bitmap setting. ?*/
-+    terminal_param->frame_format_type = frame_format_type;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_terminal_param_init failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+ia_css_program_group_param_t *
-+ia_css_terminal_param_get_parent(
-+    const ia_css_terminal_param_t            *param)
-+{
-+    ia_css_program_group_param_t *parent = NULL;
-+    char *base;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+               "ia_css_terminal_param_get_parent(): enter:\n");
-+
-+    verifexit(NULL != param);
-+
-+    base = (char *)((char *)param + param->parent_offset);
-+
-+    parent = (ia_css_program_group_param_t *)(base);
-+EXIT:
-+    if (NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+            "ia_css_terminal_param_get_parent invalid argument\n");
-+    }
-+    return parent;
-+}
-+
-+int ia_css_program_group_param_init(
-+    ia_css_program_group_param_t *blob,
-+    const uint8_t    program_count,
-+    const uint8_t    terminal_count,
-+    const uint16_t    fragment_count,
-+    const enum ia_css_frame_format_type *frame_format_types)
-+{
-+    int i = 0;
-+    char *param_base;
-+    uint32_t offset;
-+    int  retval = -1;
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_program_group_param_t)));
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+        "ia_css_program_group_param_init(): enter:\n");
-+
-+    assert(blob != 0);
-+
-+    verifexit(blob != NULL);
-+    verifexit(frame_format_types != NULL);
-+
-+    blob->program_count = program_count;
-+    blob->fragment_count = fragment_count;
-+    blob->terminal_count = terminal_count;
-+    blob->program_param_offset = sizeof(ia_css_program_group_param_t);
-+    blob->terminal_param_offset = blob->program_param_offset +
-+                sizeof(ia_css_program_param_t) * program_count;
-+
-+    param_base = (char *)((char *)blob + blob->program_param_offset);
-+    offset = blob->program_param_offset;
-+
-+    for (i = 0; i < program_count; i++) {
-+        ia_css_program_param_init(
-+            (ia_css_program_param_t *)param_base, offset);
-+        offset += sizeof(ia_css_program_param_t);
-+        param_base += sizeof(ia_css_program_param_t);
-+    }
-+
-+    param_base = (char *)((char *)blob + blob->terminal_param_offset);
-+    offset = blob->terminal_param_offset;
-+
-+    for (i = 0; i < terminal_count; i++) {
-+        ia_css_terminal_param_init(
-+            (ia_css_terminal_param_t *)param_base,
-+            offset,
-+            frame_format_types[i]);
-+
-+        offset += sizeof(ia_css_terminal_param_t);
-+        param_base += sizeof(ia_css_terminal_param_t);
-+    }
-+
-+    /*
-+     * For now, set legacy flow by default. This can be removed as soon
-+     * as all hosts/drivers explicitly set the protocol version.
-+     */
-+    blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
-+
-+    blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
-+                                terminal_count,
-+                                fragment_count);
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+               "ia_css_program_group_param_init failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_group_param_print(
-+    const ia_css_program_group_param_t        *param,
-+    void                        *fid)
-+{
-+    int    retval = -1;
-+    int        i;
-+    uint8_t    program_count, terminal_count;
-+    ia_css_kernel_bitmap_t    bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+               "ia_css_program_group_param_print(): enter:\n");
-+
-+    verifexit(param != NULL);
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+        "sizeof(program_group_param) = %d\n",
-+        (int)ia_css_program_group_param_get_size(param));
-+
-+    program_count = ia_css_program_group_param_get_program_count(param);
-+    terminal_count = ia_css_program_group_param_get_terminal_count(param);
-+
-+    bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+        "%d program params\n", (int)program_count);
-+    for (i = 0; i < (int)program_count; i++) {
-+        ia_css_program_param_t *program_param =
-+            ia_css_program_group_param_get_program_param(param, i);
-+
-+        retval = ia_css_program_param_print(program_param, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
-+               (int)terminal_count);
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_param_t    *terminal_param =
-+            ia_css_program_group_param_get_terminal_param(param, i);
-+
-+        retval = ia_css_terminal_param_print(terminal_param, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+              "ia_css_program_group_param_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_terminal_param_print(
-+    const ia_css_terminal_param_t            *param,
-+    void                        *fid)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+        "ia_css_terminal_param_print(): enter:\n");
-+
-+    verifexit(param != NULL);
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+        "sizeof(terminal_param) = %d\n",
-+        (int)ia_css_terminal_param_get_size(param));
-+
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+        "\tframe_format_type = %d\n", param->frame_format_type);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_terminal_param_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_param_print(
-+    const ia_css_program_param_t            *param,
-+    void                        *fid)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+        "ia_css_program_param_print(): enter:\n");
-+
-+    verifexit(param != NULL);
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
-+               (int)ia_css_program_param_get_size(param));
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+            "ia_css_program_param_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
-new file mode 100644
-index 000000000000..a05e1075a48f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
-@@ -0,0 +1,1038 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_process_private_types.h"
-+#include "ia_css_program_group_param_private.h"
-+#include "math_support.h"
-+
-+/* *****************************************************
-+ * Functions to possibly inline
-+ * ******************************************************/
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/* *****************************************************
-+ * Functions not to inline and not available to firmware
-+ * ******************************************************/
-+#if !defined(__HIVECC)
-+STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
-+    const ia_css_program_manifest_t            *manifest)
-+{
-+    int i;
-+    bool requires_extension = false;
-+
-+    verifexit(manifest != NULL);
-+
-+    for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
-+        requires_extension |=
-+            (ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
-+    }
-+
-+#if HAS_DFM
-+    for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
-+        requires_extension |=
-+            (ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
-+    }
-+    for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
-+        requires_extension |=
-+            (ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
-+        requires_extension |=
-+            (ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
-+    }
-+#endif /* HAS_DFM */
-+EXIT:
-+    return requires_extension;
-+}
-+
-+size_t ia_css_sizeof_process(
-+    const ia_css_program_manifest_t            *manifest,
-+    const ia_css_program_param_t            *param)
-+{
-+    size_t    size = 0;
-+
-+    uint8_t    program_dependency_count;
-+    uint8_t terminal_dependency_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_sizeof_process(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    size += sizeof(ia_css_process_t);
-+
-+    if (ia_css_program_manifest_process_requires_extension(manifest)) {
-+        /* align start of extension to 32 bit */
-+        size = CEIL_MUL(size, sizeof(uint32_t));
-+        size += sizeof(ia_css_process_ext_t);
-+    }
-+
-+    program_dependency_count =
-+        ia_css_program_manifest_get_program_dependency_count(manifest);
-+    terminal_dependency_count =
-+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+
-+    size += program_dependency_count*sizeof(vied_nci_resource_id_t);
-+    size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
-+
-+    /* align whole structure to 32 bit */
-+    size = CEIL_MUL(size, sizeof(uint32_t));
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_sizeof_process invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+ia_css_process_t *ia_css_process_create(
-+    void                    *raw_mem,
-+    const ia_css_program_manifest_t        *manifest,
-+    const ia_css_program_param_t        *param,
-+    const uint32_t                program_idx)
-+{
-+    int retval = -1, size = 0;
-+    ia_css_process_t *process = NULL;
-+    bool create_extension;
-+
-+    uint8_t    program_dependency_count;
-+    uint8_t    terminal_dependency_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_create(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+    verifexit(raw_mem != NULL);
-+
-+    process = (ia_css_process_t *)raw_mem;;
-+    verifexit(process != NULL);
-+    create_extension = ia_css_program_manifest_process_requires_extension(manifest);
-+
-+    process->state = IA_CSS_PROCESS_CREATED;
-+
-+    program_dependency_count =
-+        ia_css_program_manifest_get_program_dependency_count(manifest);
-+    terminal_dependency_count =
-+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+
-+    /* A process requires at least one input or output */
-+    verifexit((program_dependency_count +
-+           terminal_dependency_count) != 0);
-+
-+    size += sizeof(ia_css_process_t);
-+
-+    if (create_extension == true) {
-+        /* align start of extension to 32 bit */
-+        size = CEIL_MUL(size, sizeof(uint32_t));
-+        process->process_extension_offset = (uint8_t)size;
-+        size += sizeof(ia_css_process_ext_t);
-+    } else {
-+        process->process_extension_offset = 0;
-+    }
-+    if (program_dependency_count != 0) {
-+        process->cell_dependencies_offset = (uint8_t)size;
-+        size += program_dependency_count * sizeof(vied_nci_resource_id_t);
-+    } else {
-+        process->cell_dependencies_offset = 0;
-+    }
-+    if (terminal_dependency_count != 0) {
-+        process->terminal_dependencies_offset = (uint8_t)size;;
-+        size += terminal_dependency_count * sizeof(uint8_t);
-+    } else {
-+        process->terminal_dependencies_offset = 0;
-+    }
-+
-+    /* align whole structure to 32 bit */
-+    size = CEIL_MUL(size, sizeof(uint32_t));
-+
-+    process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
-+    assert((size_t)size == process->size);
-+    /* The following assert also implies that:
-+     * process->terminal_dependencies_offset,
-+     * process->cell_dependencies_offset,
-+     * process->process_extension_offset,
-+     * are <= UINT8_MAX
-+     */
-+    assert(size <= UINT8_MAX);
-+
-+    process->ID = ia_css_program_manifest_get_program_ID(manifest);
-+    verifexit(process->ID != 0);
-+    assert(program_idx <= UINT8_MAX);
-+    process->program_idx = program_idx;
-+
-+    process->cell_dependency_count = program_dependency_count;
-+    process->terminal_dependency_count = terminal_dependency_count;
-+
-+    process->parent_offset = 0;
-+    verifexit(ia_css_process_clear_all(process) == 0);
-+
-+    process->state = IA_CSS_PROCESS_READY;
-+    retval = 0;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
-+        (unsigned long int)process, process->ID);
-+
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_create invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_create failed (%i)\n", retval);
-+        process = ia_css_process_destroy(process);
-+    }
-+    return process;
-+}
-+
-+ia_css_process_t *ia_css_process_destroy(
-+    ia_css_process_t *process)
-+{
-+
-+    return process;
-+}
-+
-+int ia_css_process_set_cell(
-+    ia_css_process_t                    *process,
-+    const vied_nci_cell_ID_t                cell_id)
-+{
-+    int    retval = -1;
-+    vied_nci_resource_bitmap_t        bit_mask;
-+    vied_nci_resource_bitmap_t        resource_bitmap;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_set_cell(): enter:\n");
-+
-+    verifexit(process != NULL);
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+    state = ia_css_process_get_state(process);
-+
-+/* Some programs are mapped on a fixed cell,
-+ * when the process group is created
-+ */
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
-+        /* If the process group has already been created, but no VP cell
-+         * has been assigned to this process (i.e. not fixed in
-+         * manifest), then we need to set the cell of this process
-+         * while its parent state is READY (the ready state is set at
-+         * the end of ia_css_process_group_create)
-+         */
-+        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+/* Some programs are mapped on a fixed cell, thus check is not secure,
-+ * but it will detect a preset, the process manager will do the secure check
-+ */
-+    verifexit(ia_css_process_get_cell(process) ==
-+          VIED_NCI_N_CELL_ID);
-+
-+    bit_mask = vied_nci_cell_bit_mask(cell_id);
-+    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
-+
-+    verifexit(bit_mask != 0);
-+    verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
-+
-+    ia_css_process_cells_clear(process);
-+    ia_css_process_cells_set_cell(process, 0, cell_id);
-+
-+    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
-+
-+    retval = ia_css_process_group_set_resource_bitmap(
-+            parent, resource_bitmap);
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_cell invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_cell failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_clear_cell(
-+    ia_css_process_t *process)
-+{
-+    int    retval = -1;
-+    vied_nci_cell_ID_t                cell_id;
-+    ia_css_process_group_t            *parent;
-+    vied_nci_resource_bitmap_t        resource_bitmap;
-+    vied_nci_resource_bitmap_t        bit_mask;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_clear_cell(): enter:\n");
-+    verifexit(process != NULL);
-+
-+    cell_id = ia_css_process_get_cell(process);
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+    state = ia_css_process_get_state(process);
-+
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
-+           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    bit_mask = vied_nci_cell_bit_mask(cell_id);
-+    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
-+
-+    verifexit(bit_mask != 0);
-+    verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
-+
-+    ia_css_process_cells_clear(process);
-+
-+    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
-+
-+    retval = ia_css_process_group_set_resource_bitmap(
-+            parent, resource_bitmap);
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_clear_cell invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_clear_cell failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_set_int_mem(
-+    ia_css_process_t                *process,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            offset)
-+{
-+    (void)process;
-+    (void)mem_type_id;
-+    (void)offset;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+        "ia_css_process_set_int_mem should not be called"
-+        "(internally memory feature not used).\n");
-+    return 0;
-+}
-+
-+int ia_css_process_clear_int_mem(
-+    ia_css_process_t *process,
-+    const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+    (void)process;
-+    (void)mem_type_id;
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+        "ia_css_process_clear_int_mem should not be called"
-+        "(internally memory feature not used).\n");
-+    return 0;
-+}
-+
-+int ia_css_process_set_ext_mem(
-+    ia_css_process_t *process,
-+    const vied_nci_mem_ID_t mem_id,
-+    const vied_nci_resource_size_t offset)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t    *parent;
-+    vied_nci_cell_ID_t    cell_id;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t    state;
-+    vied_nci_mem_type_ID_t mem_type_id;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_ext_mem(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+    verifexit(process_ext != NULL);
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    cell_id = ia_css_process_get_cell(process);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+    state = ia_css_process_get_state(process);
-+
-+    /* TODO : separate process group start and run from
-+    *      process_group_exec_cmd()
-+    */
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    /* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
-+    * will return false on error
-+    */
-+
-+    mem_type_id = vied_nci_mem_get_type(mem_id);
-+#ifdef HAS_PMEM
-+    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
-+        (mem_type_id != VIED_NCI_PMEM_TYPE_ID))
-+        || vied_nci_mem_is_ext_type(mem_type_id)) &&
-+        (mem_id < VIED_NCI_N_MEM_ID)) {
-+
-+        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+        process_ext->ext_mem_id[mem_type_id] = mem_id;
-+        process_ext->ext_mem_offset[mem_type_id] = offset;
-+        retval = 0;
-+    }
-+#else /* not HAS_PMEM */
-+    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
-+            || vied_nci_mem_is_ext_type(mem_type_id)) &&
-+            (mem_id < VIED_NCI_N_MEM_ID)) {
-+
-+        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+        process_ext->ext_mem_id[mem_type_id] = mem_id;
-+        process_ext->ext_mem_offset[mem_type_id] = offset;
-+        retval = 0;
-+    }
-+#endif /* HAS_PMEM */
-+
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_ext_mem invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_ext_mem failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_clear_ext_mem(
-+    ia_css_process_t *process,
-+    const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_clear_ext_mem(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return 0;
-+    }
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    state = ia_css_process_get_state(process);
-+
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+
-+    process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
-+    process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_clear_ext_mem invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_clear_ext_mem failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_set_cells_bitmap(
-+    ia_css_process_t *process,
-+    const vied_nci_resource_bitmap_t bitmap)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    int array_index = 0;
-+    int bit_index;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_cells_bitmap(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    state = ia_css_process_get_state(process);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
-+        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
-+        if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
-+            verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
-+            ia_css_process_cells_set_cell(process,
-+                array_index, (vied_nci_cell_ID_t)bit_index);
-+            array_index++;
-+        }
-+    }
-+    for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
-+        ia_css_process_cells_set_cell(process,
-+            array_index, VIED_NCI_N_CELL_ID);
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_cells_bitmap invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_cells_bitmap failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+int ia_css_process_set_dev_chn(
-+    ia_css_process_t *process,
-+    const vied_nci_dev_chn_ID_t dev_chn_id,
-+    const vied_nci_resource_size_t offset)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_dev_chn(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
-+    process_ext = ia_css_process_get_extension(process);
-+    verifexit(process_ext != NULL);
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    state = ia_css_process_get_state(process);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+
-+    /* TODO : separate process group start and run from
-+    *      process_group_exec_cmd()
-+    */
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    process_ext->dev_chn_offset[dev_chn_id] = offset;
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_dev_chn invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                    "ia_css_process_set_dev_chn invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_clear_dev_chn(
-+    ia_css_process_t *process,
-+    const vied_nci_dev_chn_ID_t dev_chn_id)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_clear_dev_chn(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL) {
-+        return 0;
-+    }
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+    state = ia_css_process_get_state(process);
-+
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
-+           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
-+
-+    process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+             "ia_css_process_clear_dev_chn invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_clear_dev_chn failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+
-+#if HAS_DFM
-+int ia_css_process_set_dfm_port_bitmap(
-+    ia_css_process_t                 *process,
-+    const vied_nci_dev_dfm_id_t      dfm_dev_id,
-+    const vied_nci_resource_bitmap_t bitmap)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_dfm_port(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL && bitmap == 0) {
-+        return 0;
-+    }
-+    verifexit(process_ext != NULL);
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    state = ia_css_process_get_state(process);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+
-+    /* TODO : separate process group start and run from
-+    *      process_group_exec_cmd()
-+    */
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
-+    process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_dfm_port invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_set_dfm_active_port_bitmap(
-+    ia_css_process_t                 *process,
-+    const vied_nci_dev_dfm_id_t      dfm_dev_id,
-+    const vied_nci_resource_bitmap_t bitmap)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+    if (process_ext == NULL && bitmap == 0) {
-+        return 0;
-+    }
-+    verifexit(process_ext != NULL);
-+
-+    parent = ia_css_process_get_parent(process);
-+    verifexit(parent != NULL);
-+    state = ia_css_process_get_state(process);
-+
-+    parent_state = ia_css_process_group_get_state(parent);
-+
-+    /* TODO : separate process group start and run from
-+    *      process_group_exec_cmd()
-+    */
-+    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
-+    process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
-+    }
-+    return retval;
-+}
-+#endif /* HAS_DFM */
-+
-+int ia_css_process_clear_all(
-+    ia_css_process_t *process)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_t            *parent;
-+    ia_css_process_group_state_t    parent_state;
-+    ia_css_process_state_t            state;
-+    ia_css_process_ext_t *process_ext;
-+    int    mem_index;
-+    int    dev_chn_index;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_clear_all(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+
-+    state = ia_css_process_get_state(process);
-+
-+    parent = ia_css_process_get_parent(process);
-+    if (parent != NULL) {
-+        parent_state = ia_css_process_group_get_state(parent);
-+    } else {
-+        parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
-+    }
-+
-+/* Resource clear can only be called in excluded states contrary to set */
-+    verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
-+           (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
-+    verifexit((state == IA_CSS_PROCESS_CREATED) ||
-+          (state == IA_CSS_PROCESS_READY));
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+    if (process_ext != NULL) {
-+        for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
-+            dev_chn_index++) {
-+            process_ext->dev_chn_offset[dev_chn_index] =
-+                IA_CSS_PROCESS_INVALID_OFFSET;
-+        }
-+    }
-+#else
-+    NOT_USED(dev_chn_index);
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+    if (process_ext != NULL) {
-+        /* No difference whether a cell_id has been set or not, clear all */
-+        for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
-+            mem_index++) {
-+            process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
-+            process_ext->ext_mem_offset[mem_index] =
-+                IA_CSS_PROCESS_INVALID_OFFSET;
-+        }
-+    }
-+
-+    ia_css_process_cells_clear(process);
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_clear_all invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_clear_all failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_acquire(
-+    ia_css_process_t *process)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_acquire(): enter:\n");
-+
-+    verifexit(process != NULL);
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_acquire invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_acquire failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_release(
-+    ia_css_process_t *process)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_release(): enter:\n");
-+
-+    verifexit(process != NULL);
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_t invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_release failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_print(const ia_css_process_t *process, void *fid)
-+{
-+    int        retval = -1;
-+    int        i, dev_chn_index;
-+    uint16_t mem_index;
-+    uint8_t    cell_dependency_count, terminal_dependency_count;
-+    ia_css_process_ext_t *process_ext;
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
-+
-+    verifexit(process != NULL);
-+    process_ext = ia_css_process_get_extension(process);
-+
-+    IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
-+    "\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
-+        (unsigned long int)process,
-+        (int)ia_css_process_get_size(process),
-+        (int)ia_css_process_get_program_idx(process),
-+        (int)ia_css_process_get_program_ID(process),
-+        (int)ia_css_process_get_state(process),
-+        (unsigned long int)ia_css_process_get_parent(process),
-+        (int)ia_css_process_get_cell(process));
-+
-+    if (process_ext != NULL) {
-+        for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
-+            mem_index++) {
-+            /* TODO: in case of an cells_bitmap = [],
-+            * vied_nci_cell_get_mem_type will return a wrong result.
-+            */
-+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+                "\texternal index %d, type %d, id %d offset 0x%x\n",
-+                mem_index,
-+                (int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
-+                                mem_index),
-+                (int)(process_ext->ext_mem_id[mem_index]),
-+                process_ext->ext_mem_offset[mem_index]);
-+        }
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
-+            dev_chn_index++) {
-+            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+                "\tdevice channel index %d, type %d, offset 0x%x\n",
-+                dev_chn_index,
-+                (int)dev_chn_index,
-+                process_ext->dev_chn_offset[dev_chn_index]);
-+        }
-+#else
-+        NOT_USED(dev_chn_index);
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+#if HAS_DFM
-+        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
-+            dev_chn_index++) {
-+            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+                "\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
-+                dev_chn_index, dev_chn_index,
-+                process_ext->dfm_port_bitmap[dev_chn_index],
-+                process_ext->dfm_active_port_bitmap[dev_chn_index]);
-+        }
-+#endif
-+    }
-+
-+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+            "\tcells[%d] = 0x%x\n",
-+            i, ia_css_process_cells_get_cell(process, i));
-+    }
-+
-+    cell_dependency_count =
-+        ia_css_process_get_cell_dependency_count(process);
-+    if (cell_dependency_count == 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "\tcell_dependencies[%d] {};\n", cell_dependency_count);
-+    } else {
-+        vied_nci_resource_id_t cell_dependency;
-+
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "\tcell_dependencies[%d] {", cell_dependency_count);
-+        for (i = 0; i < (int)cell_dependency_count - 1; i++) {
-+            cell_dependency =
-+                ia_css_process_get_cell_dependency(process, i);
-+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+                "%4d, ", cell_dependency);
-+        }
-+        cell_dependency =
-+            ia_css_process_get_cell_dependency(process, i);
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "%4d}\n", cell_dependency);
-+        (void)cell_dependency;
-+    }
-+
-+    terminal_dependency_count =
-+        ia_css_process_get_terminal_dependency_count(process);
-+    if (terminal_dependency_count == 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "\tterminal_dependencies[%d] {};\n",
-+            terminal_dependency_count);
-+    } else {
-+        uint8_t terminal_dependency;
-+
-+        terminal_dependency_count =
-+            ia_css_process_get_terminal_dependency_count(process);
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "\tterminal_dependencies[%d] {",
-+            terminal_dependency_count);
-+        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
-+            terminal_dependency =
-+                 ia_css_process_get_terminal_dependency(process, i);
-+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+                "%4d, ", terminal_dependency);
-+        }
-+        terminal_dependency =
-+            ia_css_process_get_terminal_dependency(process, i);
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+            "%4d}\n", terminal_dependency);
-+        (void)terminal_dependency;
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_print invalid argument process\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_set_parent(
-+    ia_css_process_t                    *process,
-+    ia_css_process_group_t                    *parent)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+               "ia_css_process_set_parent(): enter:\n");
-+
-+    verifexit(process != NULL);
-+    verifexit(parent != NULL);
-+
-+    process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
-+    retval = 0;
-+EXIT:
-+    if (NULL == process || NULL == parent) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_set_parent invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_set_parent failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_process_set_cell_dependency(
-+    const ia_css_process_t                    *process,
-+    const unsigned int                    dep_index,
-+    const vied_nci_resource_id_t                id)
-+{
-+    int retval = -1;
-+    uint8_t *process_dep_ptr;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_set_cell_dependency(): enter:\n");
-+    verifexit(process != NULL);
-+
-+    process_dep_ptr =
-+        (uint8_t *)process + process->cell_dependencies_offset +
-+               dep_index*sizeof(vied_nci_resource_id_t);
-+
-+    *process_dep_ptr = id;
-+    retval = 0;
-+EXIT:
-+    return retval;
-+}
-+
-+int ia_css_process_set_terminal_dependency(
-+    const ia_css_process_t                *process,
-+    const unsigned int                dep_index,
-+    const vied_nci_resource_id_t        id)
-+{
-+    int retval = -1;
-+    uint8_t *terminal_dep_ptr;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_set_terminal_dependency(): enter:\n");
-+    verifexit(process != NULL);
-+    verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
-+
-+    terminal_dep_ptr =
-+        (uint8_t *)process + process->terminal_dependencies_offset +
-+               dep_index*sizeof(uint8_t);
-+
-+    *terminal_dep_ptr = id;
-+    retval = 0;
-+EXIT:
-+    return retval;
-+}
-+
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
-new file mode 100644
-index 000000000000..5b3c65023bb7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
-@@ -0,0 +1,826 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_program_group_param_private.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_group_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/* This header is need for cpu memset to 0
-+* and process groups are not created in SP
-+*/
-+#if !defined(__VIED_CELL)
-+#include "cpu_mem_support.h"
-+#endif
-+
-+/* This source file is created with the intention of sharing and
-+* compiled for host and firmware. Since there is no native 64bit
-+* data type support for firmware this wouldn't compile for SP
-+* tile. The part of the file that is not compilable are marked
-+* with the following __VIED_CELL marker and this comment. Once we
-+* come up with a solution to address this issue this will be
-+* removed.
-+*/
-+#if !defined(__VIED_CELL)
-+
-+/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
-+bool ia_css_process_group_is_program_enabled(
-+    const ia_css_program_manifest_t *program_manifest,
-+    ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+    ia_css_kernel_bitmap_t program_bitmap =
-+        ia_css_program_manifest_get_kernel_bitmap(program_manifest);
-+    ia_css_program_type_t program_type =
-+        ia_css_program_manifest_get_type(program_manifest);
-+    ia_css_kernel_bitmap_t program_enable_bitmap;
-+
-+    if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
-+                program_bitmap)) {
-+
-+        if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
-+            program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
-+            program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+            /*
-+             * EXCLUSIVE_SUB programs are subsets of
-+             * EXCLUSIVE_SUPER so the bits of the enable_bitmap
-+             * that refer to those are those of their
-+             * EXCLUSIVE_SUPER program (on which the depend) and
-+             * not the subset that their own program_bitmap has
-+             */
-+            if (program_type ==
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
-+                    program_type ==
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+                ia_css_kernel_bitmap_t super_program_bitmap;
-+
-+                const ia_css_program_group_manifest_t *
-+                    prog_group_manifest =
-+            ia_css_program_manifest_get_parent(program_manifest);
-+                uint8_t super_prog_idx =
-+                ia_css_program_manifest_get_program_dependency(
-+                        program_manifest, 0);
-+                const ia_css_program_manifest_t    *
-+                    super_program_manifest =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                    prog_group_manifest, super_prog_idx);
-+
-+                verifexit(super_program_manifest != NULL);
-+                if (((program_type ==
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+                    (ia_css_program_manifest_get_type(
-+                    super_program_manifest) !=
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
-+                    || ((program_type ==
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
-+                    (ia_css_program_manifest_get_type(
-+                    super_program_manifest) !=
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
-+                    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                        "ia_css_process_group_is_program_enabled(): Error\n");
-+                    verifexit(0);
-+                }
-+
-+                super_program_bitmap =
-+                ia_css_program_manifest_get_kernel_bitmap(
-+                        super_program_manifest);
-+                program_enable_bitmap =
-+                    ia_css_kernel_bitmap_intersection(
-+                        enable_bitmap,
-+                        super_program_bitmap);
-+            } else {
-+                program_enable_bitmap =
-+                    ia_css_kernel_bitmap_intersection(
-+                        enable_bitmap, program_bitmap);
-+            }
-+
-+            if (ia_css_is_kernel_bitmap_equal(
-+                program_enable_bitmap, program_bitmap)) {
-+                return true;
-+            }
-+        } else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
-+            /*
-+             * Virtual super programs are not selectable
-+             * only the virtual sub programs
-+             */
-+            return false;
-+        } else {
-+            return true;
-+        }
-+    }
-+
-+EXIT:
-+    return false;
-+}
-+
-+size_t ia_css_sizeof_process_group(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    size_t size = 0, tmp_size;
-+    int i, error_val = -1;
-+    uint8_t    process_count, process_num;
-+    uint8_t terminal_count;
-+    ia_css_kernel_bitmap_t enable_bitmap;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_sizeof_process_group(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_process_group_t)));
-+
-+    COMPILATION_ERROR_IF(0 !=
-+            sizeof(ia_css_process_group_t) % sizeof(uint64_t));
-+
-+    process_count =
-+        ia_css_process_group_compute_process_count(manifest, param);
-+    terminal_count =
-+        ia_css_process_group_compute_terminal_count(manifest, param);
-+
-+    verifexit(process_count != 0);
-+    verifexit(terminal_count != 0);
-+
-+    size += sizeof(ia_css_process_group_t);
-+
-+    tmp_size = process_count * sizeof(uint16_t);
-+    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
-+
-+    tmp_size = terminal_count * sizeof(uint16_t);
-+    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
-+
-+    enable_bitmap =
-+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+    process_num = 0;
-+    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
-+                manifest); i++) {
-+        ia_css_program_manifest_t *program_manifest =
-+        ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
-+        ia_css_program_param_t *program_param =
-+            ia_css_program_group_param_get_program_param(param, i);
-+
-+        if (ia_css_process_group_is_program_enabled(
-+                    program_manifest, enable_bitmap)) {
-+            verifexit(process_num < process_count);
-+            size += ia_css_sizeof_process(
-+                    program_manifest, program_param);
-+            process_num++;
-+        }
-+    }
-+
-+    verifexit(process_num == process_count);
-+
-+    for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
-+                manifest); i++) {
-+        ia_css_terminal_manifest_t *terminal_manifest =
-+            ia_css_program_group_manifest_get_term_mnfst(
-+                    manifest, i);
-+
-+        if (ia_css_process_group_is_terminal_enabled(
-+                    terminal_manifest, enable_bitmap)) {
-+            size += ia_css_sizeof_terminal(
-+                    terminal_manifest, param);
-+        }
-+    }
-+
-+    error_val = 0;
-+
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_sizeof_process_group invalid argument\n");
-+    }
-+    if (error_val != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_sizeof_process_group ERROR(%d)\n", error_val);
-+    }
-+    return error_val ? 0 : size;
-+}
-+
-+ia_css_process_group_t *ia_css_process_group_create(
-+    void *process_grp_mem,
-+    const ia_css_program_group_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    size_t size = ia_css_sizeof_process_group(manifest, param);
-+    int retval = -1;
-+    int ret;
-+    int i;
-+    ia_css_process_group_t *process_group = NULL;
-+    uint8_t process_count, process_num;
-+    uint8_t    terminal_count, terminal_num;
-+    uint16_t fragment_count;
-+    char *process_grp_raw_ptr;
-+    uint16_t *process_tab_ptr, *terminal_tab_ptr;
-+    ia_css_kernel_bitmap_t enable_bitmap;
-+    uint8_t manifest_terminal_count;
-+
-+    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
-+        process_grp_mem, manifest, param);
-+
-+    verifexit(process_grp_mem != NULL);
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+    verifexit(size != 0);
-+
-+    process_group = (ia_css_process_group_t    *)process_grp_mem;
-+    ia_css_cpu_mem_set_zero(process_group, size);
-+    process_grp_raw_ptr = (char *) process_group;
-+
-+    process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
-+
-+    process_group->protocol_version =
-+        ia_css_program_group_param_get_protocol_version(param);
-+
-+    fragment_count = ia_css_program_group_param_get_fragment_count(param);
-+    process_count =
-+        ia_css_process_group_compute_process_count(manifest, param);
-+    terminal_count =
-+        ia_css_process_group_compute_terminal_count(manifest, param);
-+    enable_bitmap =
-+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+    process_group->fragment_count = fragment_count;
-+    process_group->process_count = process_count;
-+    process_group->terminal_count = terminal_count;
-+    process_group->kernel_bitmap = enable_bitmap;
-+
-+    process_grp_raw_ptr += sizeof(ia_css_process_group_t);
-+    process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
-+    process_group->processes_offset =
-+        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
-+
-+    process_grp_raw_ptr += tot_bytes_for_pow2_align(
-+            sizeof(uint64_t), process_count * sizeof(uint16_t));
-+    terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
-+    process_group->terminals_offset =
-+        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
-+
-+    /* Move raw pointer to the first process */
-+    process_grp_raw_ptr += tot_bytes_for_pow2_align(
-+            sizeof(uint64_t), terminal_count * sizeof(uint16_t));
-+
-+    /* Set default */
-+    verifexit(ia_css_process_group_set_fragment_limit(
-+                process_group, fragment_count) == 0);
-+
-+    /* Set process group terminal dependency list */
-+    /* This list is used during creating the process dependency list */
-+    manifest_terminal_count =
-+        ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+    terminal_num = 0;
-+    for (i = 0; i < (int)manifest_terminal_count; i++) {
-+        ia_css_terminal_manifest_t *t_manifest =
-+            ia_css_program_group_manifest_get_term_mnfst(
-+                    manifest, i);
-+
-+        verifexit(NULL != t_manifest);
-+
-+        if (ia_css_process_group_is_terminal_enabled(
-+                    t_manifest, enable_bitmap)) {
-+            ia_css_terminal_t *terminal = NULL;
-+            ia_css_terminal_param_t *terminal_param =
-+                ia_css_program_group_param_get_terminal_param(
-+                        param, i);
-+
-+            verifexit(NULL != terminal_param);
-+            terminal_tab_ptr[terminal_num] =
-+                (uint16_t)(process_grp_raw_ptr -
-+                        (char *)process_group);
-+            terminal = ia_css_terminal_create(
-+                    process_grp_raw_ptr, t_manifest,
-+                    terminal_param, enable_bitmap);
-+            verifexit(terminal != NULL);
-+            verifexit((ia_css_terminal_set_parent(
-+                    terminal, process_group) == 0));
-+            verifexit((ia_css_terminal_set_terminal_manifest_index(
-+                    terminal, i) == 0));
-+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+                "ia_css_process_group_create: terminal_manifest_index %d\n",
-+                i);
-+
-+            process_grp_raw_ptr += ia_css_terminal_get_size(
-+                            terminal);
-+            terminal_num++;
-+        } else {
-+            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
-+        }
-+    }
-+    verifexit(terminal_num == terminal_count);
-+
-+    process_num = 0;
-+    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
-+                manifest); i++) {
-+        ia_css_process_t *process = NULL;
-+        ia_css_program_manifest_t *program_manifest =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                    manifest, i);
-+        ia_css_program_param_t *program_param =
-+            ia_css_program_group_param_get_program_param(param, i);
-+        unsigned int prog_dep_index, proc_dep_index;
-+        unsigned int term_dep_index, term_index;
-+
-+        verifexit(program_manifest != 0);
-+        verifexit(program_param    != NULL);
-+
-+        if (ia_css_process_group_is_program_enabled(
-+                    program_manifest, enable_bitmap)) {
-+
-+            verifexit(process_num < process_count);
-+
-+            process_tab_ptr[process_num] =
-+                (uint16_t)(process_grp_raw_ptr -
-+                        (char *)process_group);
-+
-+            /* instead of using program_param,
-+             * we can provide this directly to ia_css_process_create.
-+             * The corresponding public setter function is deprecated and will assert
-+             * upon use. */
-+            program_param->kernel_enable_bitmap =
-+                ia_css_kernel_bitmap_intersection(
-+                        ia_css_program_manifest_get_kernel_bitmap(program_manifest),
-+                        /*pg*/enable_bitmap);
-+
-+            process = ia_css_process_create(
-+                    process_grp_raw_ptr,
-+                    program_manifest,
-+                    program_param,
-+                    i);
-+            verifexit(process != NULL);
-+
-+            ia_css_process_set_parent(process, process_group);
-+            if (ia_css_has_program_manifest_fixed_cell(
-+                        program_manifest)) {
-+                vied_nci_cell_ID_t cell_id =
-+                    ia_css_program_manifest_get_cell_ID(
-+                            program_manifest);
-+
-+                IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+                    "ia_css_process_group_create: cell_id %d\n",
-+                    cell_id);
-+                ia_css_process_set_cell(process, cell_id);
-+            }
-+
-+            process_grp_raw_ptr += ia_css_process_get_size(
-+                    process);
-+            /*
-+             * Set process dependencies of process derived
-+             * from program manifest
-+             */
-+            for (prog_dep_index = 0; prog_dep_index <
-+            ia_css_program_manifest_get_program_dependency_count(
-+                program_manifest); prog_dep_index++) {
-+                uint8_t dep_prog_idx =
-+                ia_css_program_manifest_get_program_dependency(
-+                    program_manifest, prog_dep_index);
-+                const ia_css_program_manifest_t *
-+                dep_prg_manifest =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                    manifest, dep_prog_idx);
-+                ia_css_program_ID_t id =
-+                ia_css_program_manifest_get_program_ID(
-+                        dep_prg_manifest);
-+
-+                verifexit(id != 0);
-+                for (proc_dep_index = 0;
-+                        proc_dep_index < process_num;
-+                        proc_dep_index++) {
-+                    ia_css_process_t *dep_process =
-+                    ia_css_process_group_get_process(
-+                            process_group,
-+                            proc_dep_index);
-+
-+                    ia_css_process_set_cell_dependency(
-+                            process,
-+                            prog_dep_index, 0);
-+
-+                if (ia_css_process_get_program_ID(
-+                        dep_process) == id) {
-+                    ia_css_process_set_cell_dependency(
-+                            process,
-+                            prog_dep_index,
-+                            proc_dep_index);
-+                        break;
-+                    }
-+                }
-+            }
-+            process_num++;
-+
-+            /*
-+             * Set terminal dependencies of process derived
-+             * from program manifest
-+             */
-+            for (term_dep_index = 0; term_dep_index <
-+            ia_css_program_manifest_get_terminal_dependency_count(
-+                program_manifest); term_dep_index++) {
-+                uint8_t pm_term_index =
-+                ia_css_program_manifest_get_terminal_dependency
-+                    (program_manifest, term_dep_index);
-+
-+                verifexit(pm_term_index < manifest_terminal_count);
-+                IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+                    "ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
-+                    term_dep_index, pm_term_index);
-+                for (term_index = 0;
-+                    term_index < terminal_count;
-+                    term_index++) {
-+                    ia_css_terminal_t *terminal =
-+                    ia_css_process_group_get_terminal(
-+                            process_group,
-+                            term_index);
-+
-+                if (ia_css_terminal_get_terminal_manifest_index
-+                        (terminal) == pm_term_index) {
-+                    ia_css_process_set_terminal_dependency(
-+                            process,
-+                            term_dep_index,
-+                            term_index);
-+                    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+                        "ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
-+                        i, term_dep_index, term_index);
-+
-+                        break;
-+                    }
-+                }
-+            }
-+        }
-+    }
-+    verifexit(process_num == process_count);
-+
-+    process_group->size =
-+        (uint32_t)ia_css_sizeof_process_group(manifest, param);
-+    process_group->ID =
-+        ia_css_program_group_manifest_get_program_group_ID(manifest);
-+
-+    /* Initialize performance measurement fields to zero */
-+    process_group->pg_load_start_ts        = 0;
-+    process_group->pg_load_cycles        = 0;
-+    process_group->pg_init_cycles        = 0;
-+    process_group->pg_processing_cycles    = 0;
-+    process_group->pg_complete_cycles    = 0;
-+
-+    process_group->error_handling_enable = 0;
-+
-+    verifexit(process_group->size != 0);
-+    verifexit(process_group->ID != 0);
-+
-+    ret = ia_css_process_group_on_create(process_group, manifest, param);
-+    verifexit(ret == 0);
-+
-+    process_group->state = IA_CSS_PROCESS_GROUP_READY;
-+    retval = 0;
-+
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
-+        process_group->ID);
-+
-+EXIT:
-+    if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_create invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_create failed (%i)\n", retval);
-+        process_group = ia_css_process_group_destroy(process_group);
-+    }
-+    return process_group;
-+}
-+
-+ia_css_process_group_t *ia_css_process_group_destroy(
-+    ia_css_process_group_t *process_group)
-+{
-+    if (process_group != NULL) {
-+        ia_css_process_group_on_destroy(process_group);
-+        process_group = NULL;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_destroy invalid argument\n");
-+    }
-+    return process_group;
-+}
-+
-+int ia_css_process_group_submit(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_submit(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
-+}
-+
-+int ia_css_process_group_start(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_start(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_START);
-+}
-+
-+int ia_css_process_group_stop(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_stop(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_STOP);
-+}
-+
-+int ia_css_process_group_run(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_run(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_RUN);
-+}
-+
-+int ia_css_process_group_suspend(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_suspend(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
-+}
-+
-+int ia_css_process_group_resume(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_resume(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_RESUME);
-+}
-+
-+int ia_css_process_group_reset(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_reset(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_RESET);
-+}
-+
-+int ia_css_process_group_abort(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_abort(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_ABORT);
-+}
-+
-+int ia_css_process_group_disown(
-+    ia_css_process_group_t *process_group)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_process_group_disown(): enter:\n");
-+
-+    return ia_css_process_group_exec_cmd(process_group,
-+        IA_CSS_PROCESS_GROUP_CMD_DISOWN);
-+}
-+
-+uint64_t ia_css_process_group_get_token(
-+    ia_css_process_group_t *process_group)
-+{
-+    uint64_t token = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_token(): enter:\n");
-+
-+    verifexit(process_group != NULL);
-+
-+    token = process_group->token;
-+
-+EXIT:
-+    if (NULL == process_group) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_get_token invalid argument\n");
-+    }
-+    return token;
-+}
-+
-+int ia_css_process_group_set_token(
-+    ia_css_process_group_t *process_group,
-+    const uint64_t token)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_token(): enter:\n");
-+
-+    verifexit(process_group != NULL);
-+    verifexit(token != 0);
-+
-+    process_group->token = token;
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process_group || 0 == token) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_set_token invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_token failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+uint64_t ia_css_process_group_get_private_token(
-+    ia_css_process_group_t *process_group)
-+{
-+    uint64_t token = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_get_private_token(): enter:\n");
-+
-+    verifexit(process_group != NULL);
-+
-+    token = process_group->private_token;
-+
-+EXIT:
-+    if (NULL == process_group) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_get_private_token invalid argument\n");
-+    }
-+    return token;
-+}
-+
-+int ia_css_process_group_set_private_token(
-+    ia_css_process_group_t *process_group,
-+    const uint64_t token)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_set_private_token(): enter:\n");
-+
-+    verifexit(process_group != NULL);
-+    verifexit(token != 0);
-+
-+    process_group->private_token = token;
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == process_group || 0 == token) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_set_private_token invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_process_group_set_private_token failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+uint8_t ia_css_process_group_compute_process_count(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    uint8_t process_count = 0;
-+    ia_css_kernel_bitmap_t total_bitmap;
-+    ia_css_kernel_bitmap_t enable_bitmap;
-+    int i;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_compute_process_count(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    total_bitmap =
-+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+    enable_bitmap =
-+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
-+    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
-+
-+    for (i = 0; i <
-+        (int)ia_css_program_group_manifest_get_program_count(manifest);
-+            i++) {
-+        ia_css_program_manifest_t *program_manifest =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                    manifest, i);
-+        ia_css_kernel_bitmap_t program_bitmap =
-+            ia_css_program_manifest_get_kernel_bitmap(
-+                    program_manifest);
-+        /*
-+         * Programs can be orthogonal,
-+         * a mutually exclusive subset,
-+         * or a concurrent subset
-+         */
-+        if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
-+                    program_bitmap)) {
-+            ia_css_program_type_t program_type =
-+                ia_css_program_manifest_get_type(
-+                        program_manifest);
-+            /*
-+             * An exclusive subnode < exclusive supernode,
-+             * so simply don't count it
-+             */
-+            if (program_type !=
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
-+                program_type !=
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+                process_count++;
-+            }
-+        }
-+    }
-+
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_compute_process_count invalid argument\n");
-+    }
-+    return process_count;
-+}
-+
-+uint8_t ia_css_process_group_compute_terminal_count(
-+    const ia_css_program_group_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    uint8_t terminal_count = 0;
-+    ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
-+    int i;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_process_group_compute_terminal_count(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    total_bitmap =
-+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+    enable_bitmap =
-+        ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+    verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
-+    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
-+
-+    for (i = 0; i <
-+        (int)ia_css_program_group_manifest_get_terminal_count(
-+            manifest); i++) {
-+        ia_css_terminal_manifest_t *tmanifest =
-+            ia_css_program_group_manifest_get_term_mnfst(
-+                    manifest, i);
-+
-+        if (ia_css_process_group_is_terminal_enabled(
-+                    tmanifest, enable_bitmap)) {
-+            terminal_count++;
-+        }
-+    }
-+
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_process_group_compute_terminal_count invalid argument\n");
-+    }
-+    return terminal_count;
-+}
-+#endif /* !defined(__VIED_CELL) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
-new file mode 100644
-index 000000000000..07c42c7c10c9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
-@@ -0,0 +1,137 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process_group_cmd_impl.h"
-+#include "ia_css_psysapi.h"
-+#include "ia_css_psys_process.h"
-+#include "ia_css_psys_process.psys.h"
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_psys_process_group.psys.h"
-+#include "error_support.h"
-+#include "vied_nci_psys_system_global.h"
-+#include "misc_support.h"
-+
-+#include "ia_css_psys_sim_trace.h"
-+
-+/* Dummy implementation for sim */
-+int ia_css_process_group_on_create(
-+    ia_css_process_group_t                    *process_group,
-+    const ia_css_program_group_manifest_t    *program_group_manifest,
-+    const ia_css_program_group_param_t        *program_group_param)
-+{
-+    NOT_USED(process_group);
-+    NOT_USED(program_group_manifest);
-+    NOT_USED(program_group_param);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
-+
-+    return 0;
-+}
-+
-+/* Dummy implementation for sim */
-+int ia_css_process_group_on_destroy(
-+    ia_css_process_group_t                    *process_group)
-+{
-+    NOT_USED(process_group);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
-+
-+    return 0;
-+}
-+
-+int ia_css_process_group_exec_cmd(
-+    ia_css_process_group_t                    *process_group,
-+    const ia_css_process_group_cmd_t        cmd)
-+{
-+    int    retval = -1;
-+    ia_css_process_group_state_t    state;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
-+
-+    state = ia_css_process_group_get_state(process_group);
-+
-+    verifexit(process_group != NULL);
-+    verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
-+    verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
-+
-+    switch (cmd) {
-+    case IA_CSS_PROCESS_GROUP_CMD_NOP:
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+
-+/* External resource availability checks */
-+        verifexit(ia_css_can_process_group_submit(process_group));
-+
-+        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_DETACH:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_START:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
-+
-+/* External resource state checks */
-+        verifexit(ia_css_can_process_group_start(process_group));
-+
-+        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
-+
-+        /* empty call to match API ownership change between host and firmware */
-+
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_RUN:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
-+        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_STOP:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
-+        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
-+        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_RESUME:
-+        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
-+        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_ABORT:
-+        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
-+        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
-+        break;
-+    case IA_CSS_PROCESS_GROUP_CMD_RESET:
-+/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
-+        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
-+        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
-+        break;
-+    case IA_CSS_N_PROCESS_GROUP_CMDS:    /* Fall through */
-+    default:
-+        verifexit(false);
-+        break;
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
-new file mode 100644
-index 000000000000..c8f33b2b6211
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
-@@ -0,0 +1,1081 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_static_storage_class.h"
-+#include "ia_css_psys_program_group_manifest.h"
-+#include "ia_css_rbm_manifest.h"
-+
-+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
-+#include "vied_nci_acb_route_type.h" /* only used for printing. */
-+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_group_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/*
-+ * We need to refactor those files in order to
-+ * build in the firmware only what is needed,
-+ * switches are put current to workaround compilation problems
-+ * in the firmware (for example lack of uint64_t support)
-+ * supported in the firmware
-+ */
-+#if !defined(__HIVECC)
-+size_t ia_css_sizeof_program_group_manifest(
-+    const uint8_t program_count,
-+    const uint8_t terminal_count,
-+    const uint8_t *program_needs_extension,
-+    const uint8_t *program_dependency_count,
-+    const uint8_t *terminal_dependency_count,
-+    const ia_css_terminal_type_t *terminal_type,
-+    const uint16_t *cached_in_param_section_count,
-+    const uint16_t *cached_out_param_section_count,
-+    const uint16_t *spatial_param_section_count,
-+    const uint16_t *fragment_param_section_count,
-+    const uint16_t *sliced_param_section_count,
-+    const uint16_t *sliced_out_param_section_count,
-+    const uint16_t *kernel_fragment_seq_count,
-+    const uint16_t *progctrlinit_load_section_counts,
-+    const uint16_t *progctrlinit_connect_section_counts)
-+{
-+    size_t size = 0;
-+    int i = 0;
-+    int j = 0;
-+    int k = 0;
-+    int l = 0;
-+    int m = 0;
-+    int n = 0;
-+    int o = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_sizeof_program_group_manifest(): enter:\n");
-+
-+    verifexit(program_count != 0);
-+    verifexit(program_dependency_count != NULL);
-+    verifexit(terminal_dependency_count != NULL);
-+
-+    size += sizeof(ia_css_program_group_manifest_t);
-+
-+    /* Private payload in the program group manifest */
-+    size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
-+                sizeof(uint64_t));
-+    /* RBM manifest in the program group manifest */
-+    size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
-+                sizeof(uint64_t));
-+
-+    for (i = 0; i < (int)program_count; i++) {
-+        size += ia_css_sizeof_program_manifest(
-+                program_needs_extension[i],
-+                program_dependency_count[i],
-+                terminal_dependency_count[i]);
-+    }
-+
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        switch (terminal_type[i]) {
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+            size += ia_css_param_terminal_manifest_get_size(
-+                    cached_in_param_section_count[j]);
-+            j++;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+            size += ia_css_param_terminal_manifest_get_size(
-+                    cached_out_param_section_count[k]);
-+            k++;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+            size += ia_css_spatial_param_terminal_manifest_get_size(
-+                    spatial_param_section_count[l]);
-+            l++;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+            size += ia_css_program_terminal_manifest_get_size(
-+                    fragment_param_section_count[m],
-+                    kernel_fragment_seq_count[m]);
-+            m++;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+            size += ia_css_program_control_init_terminal_manifest_get_size(
-+                program_count,
-+                progctrlinit_load_section_counts,
-+                progctrlinit_connect_section_counts);
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+            size += sizeof(ia_css_data_terminal_manifest_t);
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+            size += ia_css_sliced_param_terminal_manifest_get_size(
-+                    sliced_param_section_count[n]);
-+            n++;
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+            size += ia_css_sliced_param_terminal_manifest_get_size(
-+                sliced_out_param_section_count[o]);
-+            o++;
-+            break;
-+        default:
-+            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                "ia_css_sizeof_program_group_manifest invalid argument\n");
-+        }
-+    }
-+
-+EXIT:
-+    if (0 == program_count || 0 == terminal_count ||
-+        NULL == program_dependency_count ||
-+        NULL == terminal_dependency_count) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_sizeof_program_group_manifest invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+/*
-+ * Currently, the design of XNR kernel inside the *_pregdc program group,
-+ * does not fit the exact model as is being asserted on in
-+ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
-+ * Further investigation is needed to determine whether *_pregdc program group
-+ * can be canged or that the model must be changed.
-+ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
-+ * connected to the same terminal, and it allows a kernel be mapped over
-+ * multiple programs.
-+ */
-+#define USE_SIMPLIFIED_GRAPH_MODEL 1
-+
-+/*
-+ * Model and/or check refinements
-+ * - Parallel programs do not yet have mutual exclusive alternatives
-+ * - The pgram dependencies do not need to be acyclic
-+ * - Parallel programs need to have an equal kernel requirement
-+ */
-+bool ia_css_is_program_group_manifest_valid(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    int i;
-+    bool is_valid = false;
-+    uint8_t terminal_count;
-+    uint8_t program_count;
-+    ia_css_kernel_bitmap_t total_bitmap;
-+    ia_css_kernel_bitmap_t check_bitmap;
-+    ia_css_kernel_bitmap_t terminal_bitmap;
-+    /*
-+     * Use a standard bitmap type for the minimum logic to check the DAG,
-+     * generic functions can be used for the kernel enable bitmaps; Later
-+     */
-+    vied_nci_resource_bitmap_t resource_bitmap;
-+    int terminal_bitmap_weight;
-+    int num_parameter_terminal_in = 0;
-+    int num_parameter_terminal_out = 0;
-+    int num_program_terminal = 0;
-+    int num_program_terminal_sequencer_info = 0;
-+    bool has_program_control_init_terminal = false;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_program_group_manifest_valid(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
-+    verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
-+    verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
-+
-+    terminal_count =
-+        ia_css_program_group_manifest_get_terminal_count(manifest);
-+    program_count =
-+        ia_css_program_group_manifest_get_program_count(manifest);
-+    total_bitmap =
-+        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+    check_bitmap = ia_css_kernel_bitmap_clear();
-+    resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
-+    terminal_bitmap = ia_css_kernel_bitmap_clear();
-+
-+    verifexit(program_count != 0);
-+    verifexit(terminal_count != 0);
-+    verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
-+    verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
-+
-+    /* Check the kernel bitmaps for terminals */
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_manifest_t *terminal_manifest_i =
-+            ia_css_program_group_manifest_get_term_mnfst(
-+                manifest, i);
-+        bool is_parameter_in =
-+            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
-+            ia_css_terminal_manifest_get_type(
-+                terminal_manifest_i));
-+        bool is_parameter_out =
-+            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
-+            ia_css_terminal_manifest_get_type(
-+                terminal_manifest_i));
-+        bool is_data =
-+            ia_css_is_terminal_manifest_data_terminal(
-+                terminal_manifest_i);
-+        bool is_program =
-+            ia_css_is_terminal_manifest_program_terminal(
-+                terminal_manifest_i);
-+        bool is_spatial_param =
-+            ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+                terminal_manifest_i);
-+        bool is_program_control_init =
-+            ia_css_is_terminal_manifest_program_control_init_terminal(
-+                terminal_manifest_i);
-+
-+        if (is_parameter_in) {
-+            num_parameter_terminal_in = is_parameter_in;
-+        } else if (is_parameter_out) {
-+            num_parameter_terminal_out = is_parameter_out;
-+        } else if (is_data) {
-+            ia_css_data_terminal_manifest_t *dterminal_manifest_i =
-+                (ia_css_data_terminal_manifest_t *)
-+                terminal_manifest_i;
-+            ia_css_kernel_bitmap_t terminal_bitmap_i =
-+                ia_css_data_terminal_manifest_get_kernel_bitmap(
-+                    dterminal_manifest_i);
-+            /*
-+             * A terminal must depend on kernels that are a subset
-+             * of the total, correction, it can only depend on one
-+             * kernel
-+             */
-+            verifexit(!ia_css_is_kernel_bitmap_empty(
-+                    terminal_bitmap_i));
-+            verifexit(ia_css_is_kernel_bitmap_subset(
-+                    total_bitmap, terminal_bitmap_i));
-+            verifexit(ia_css_is_kernel_bitmap_onehot(
-+                    terminal_bitmap_i));
-+        } else if (is_program) {
-+            verifexit(terminal_manifest_i);
-+            num_program_terminal += is_program;
-+            num_program_terminal_sequencer_info +=
-+                ((ia_css_program_terminal_manifest_t *)
-+                terminal_manifest_i)->
-+            kernel_fragment_sequencer_info_manifest_info_count;
-+        } else if (is_program_control_init) {
-+            has_program_control_init_terminal = is_program_control_init;
-+        } else {
-+            const ia_css_spatial_param_terminal_manifest_t
-+                *spatial_param_man =
-+            (const ia_css_spatial_param_terminal_manifest_t *)
-+                terminal_manifest_i;
-+            verifexit(spatial_param_man);
-+            verifexit(is_spatial_param);
-+
-+            terminal_bitmap =
-+                ia_css_kernel_bitmap_set(terminal_bitmap,
-+                spatial_param_man->kernel_id);
-+            verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
-+            verifexit(ia_css_is_kernel_bitmap_subset(
-+                    total_bitmap, terminal_bitmap));
-+        }
-+    }
-+
-+    /* Check the kernel bitmaps for programs */
-+    for (i = 0; i < (int)program_count; i++) {
-+        int j;
-+        ia_css_program_manifest_t *program_manifest_i =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                manifest, i);
-+        ia_css_program_type_t program_type_i =
-+            ia_css_program_manifest_get_type(program_manifest_i);
-+        ia_css_kernel_bitmap_t program_bitmap_i =
-+            ia_css_program_manifest_get_kernel_bitmap(
-+                program_manifest_i);
-+        uint8_t program_dependency_count_i =
-+            ia_css_program_manifest_get_program_dependency_count(
-+                program_manifest_i);
-+        uint8_t terminal_dependency_count_i =
-+            ia_css_program_manifest_get_terminal_dependency_count(
-+                program_manifest_i);
-+        uint8_t program_dependency_i0 =
-+            ia_css_program_manifest_get_program_dependency(
-+                program_manifest_i, 0);
-+        bool is_sub_i =
-+            ia_css_is_program_manifest_subnode_program_type(
-+                program_manifest_i);
-+        bool is_exclusive_sub_i =
-+            (program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
-+        bool is_virtual_sub_i =
-+            (program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+        bool is_super_i =
-+            ia_css_is_program_manifest_supernode_program_type(
-+                program_manifest_i);
-+
-+        /*
-+         * A program must have kernels that
-+         * are a subset of the total
-+         */
-+        verifexit(!ia_css_is_kernel_bitmap_empty(
-+                program_bitmap_i));
-+        verifexit(ia_css_is_kernel_bitmap_subset(
-+                total_bitmap, program_bitmap_i));
-+        verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
-+        verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
-+        /*
-+         * Checks for subnodes
-+         * - Parallel subnodes cannot depend on terminals
-+         * - Exclusive subnodes must depend on
-+         *   fewer terminals than the supernode
-+         * - Subnodes only depend on a supernode of the same type
-+         * - Must have a subset of the supernode's kernels
-+         *   (but not equal)
-+         * - This tests only positive cases
-+         * Checks for singular or supernodes
-+         * - Cannot depend on exclusive subnodes
-+         * - No intersection between kernels
-+         *   (too strict for multiple instances ?)
-+         */
-+        if (is_sub_i) {
-+            /* Subnode */
-+            ia_css_program_manifest_t *program_manifest_k =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                manifest, program_dependency_i0);
-+            ia_css_program_type_t program_type_k =
-+                ia_css_program_manifest_get_type(
-+                    program_manifest_k);
-+            ia_css_kernel_bitmap_t program_bitmap_k =
-+                ia_css_program_manifest_get_kernel_bitmap(
-+                    program_manifest_k);
-+
-+            verifexit(program_dependency_count_i == 1);
-+            if (is_exclusive_sub_i || is_virtual_sub_i) {
-+                verifexit(terminal_dependency_count_i <=
-+                    ia_css_program_manifest_get_terminal_dependency_count(
-+                        program_manifest_k));
-+            } else{
-+                verifexit(terminal_dependency_count_i == 0);
-+            }
-+            verifexit(program_type_k ==
-+                (is_exclusive_sub_i ?
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
-+                is_virtual_sub_i ?
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
-+                    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
-+            verifexit(!ia_css_is_kernel_bitmap_equal(
-+                    program_bitmap_k, program_bitmap_i));
-+            verifexit(ia_css_is_kernel_bitmap_subset(
-+                    program_bitmap_k, program_bitmap_i));
-+        } else {
-+            /* Singular or Supernode */
-+            int k;
-+            ia_css_kernel_bitmap_t program_bitmap_k;
-+
-+            for (k = 0; k < program_dependency_count_i; k++) {
-+                uint8_t program_dependency_k =
-+                ia_css_program_manifest_get_program_dependency(
-+                    program_manifest_i, k);
-+                ia_css_program_manifest_t *program_manifest_k =
-+                ia_css_program_group_manifest_get_prgrm_mnfst(
-+                manifest, (int)program_dependency_k);
-+                ia_css_program_type_t program_type_k =
-+                ia_css_program_manifest_get_type(
-+                    program_manifest_k);
-+                program_bitmap_k =
-+                ia_css_program_manifest_get_kernel_bitmap(
-+                    program_manifest_k);
-+
-+                verifexit(program_dependency_k <
-+                    program_count);
-+                verifexit((program_type_k !=
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+                    (program_type_k !=
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
-+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+                ia_css_is_kernel_bitmap_intersection_empty(
-+                    program_bitmap_i, program_bitmap_k));
-+            }
-+        }
-+
-+        /* Check for relations */
-+        for (j = 0; j < (int)program_count; j++) {
-+            int k;
-+            ia_css_program_manifest_t *program_manifest_j =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                manifest, j);
-+            ia_css_program_type_t program_type_j =
-+            ia_css_program_manifest_get_type(program_manifest_j);
-+            ia_css_kernel_bitmap_t program_bitmap_j =
-+            ia_css_program_manifest_get_kernel_bitmap(
-+                program_manifest_j);
-+            uint8_t program_dependency_count_j =
-+            ia_css_program_manifest_get_program_dependency_count(
-+                program_manifest_j);
-+            uint8_t program_dependency_j0 =
-+            ia_css_program_manifest_get_program_dependency(
-+                program_manifest_j, 0);
-+            bool is_sub_j =
-+            ia_css_is_program_manifest_subnode_program_type(
-+                program_manifest_j);
-+            bool is_super_j =
-+            ia_css_is_program_manifest_supernode_program_type(
-+                program_manifest_j);
-+            bool is_virtual_sub_j =
-+            (program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+            bool is_j_subset_i =
-+            ia_css_is_kernel_bitmap_subset(
-+                program_bitmap_i, program_bitmap_j);
-+            bool is_i_subset_j =
-+            ia_css_is_kernel_bitmap_subset(
-+                program_bitmap_j, program_bitmap_i);
-+
-+            /* Test below would fail for i==j */
-+            if (i == j)
-+                continue;
-+
-+            /* Empty sets are always subsets, but meaningless */
-+            verifexit(!ia_css_is_kernel_bitmap_empty(
-+                    program_bitmap_j));
-+
-+            /*
-+             * Checks for mutual subnodes
-+             * - Parallel subnodes must have an equal
-+             *   set of kernels
-+             * - Exclusive and virtual subnodes must
-+             *   have an unequal set of kernels
-+             * Checks for subnodes
-+             * - Subnodes must have a subset of kernels
-+             */
-+            if (((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
-+                ((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
-+                ((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
-+
-+                verifexit(program_dependency_count_j == 1);
-+                verifexit(program_dependency_i0 != i);
-+                verifexit(program_dependency_j0 != i);
-+
-+                if (program_dependency_i0 ==
-+                    program_dependency_j0) {
-+                    verifexit(is_sub_i);
-+                    /*
-+                     * Subnodes are subsets,
-+                     * not for virtual nodes
-+                     */
-+                    if (!is_virtual_sub_i)
-+                        verifexit(
-+                            ((is_j_subset_i ||
-+                            is_i_subset_j)));
-+                    /*
-+                     * That must be equal for
-+                     * parallel subnodes,
-+                     * must be unequal for
-+                     * exlusive and virtual subnodes
-+                     */
-+                    verifexit(
-+                    ((is_j_subset_i && is_i_subset_j) ^
-+                    (is_exclusive_sub_i |
-+                    is_virtual_sub_i)));
-+
-+                }
-+                if (is_j_subset_i || is_i_subset_j) {
-+                    /* One being subset of the other does not necessarily mean that they are part
-+                     * of the same "cluster" (i.e. having same super dependency).
-+                     */
-+                    /* verifexit(program_dependency_i0 ==
-+                     *    program_dependency_j0);
-+                     */
-+                }
-+                /* If subnodes are the same, they need different program dependency. */
-+                if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
-+                    verifexit(program_dependency_i0 != program_dependency_j0);
-+                }
-+            }
-+
-+            if (((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
-+                ((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
-+                ((program_type_i ==
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
-+                (program_type_j ==
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
-+
-+                verifexit(program_dependency_count_j == 1);
-+                verifexit(!is_i_subset_j);
-+
-+                if (program_dependency_j0 == i) {
-+                    verifexit(program_dependency_i0 !=
-+                        program_dependency_j0);
-+                    verifexit(is_super_i);
-+                    verifexit(is_j_subset_i);
-+
-+                }
-+                if (is_j_subset_i) {
-+                    /* verifexit(program_dependency_j0 == i); */
-+                    /* A sub that is subset of a super, is not necessarily dependent to it. */
-+                }
-+            }
-+
-+            /*
-+             * Checks for dependent nodes
-+             * - Cannot depend on exclusive subnodes
-+             * - No intersection between kernels
-+             *   (too strict for multiple instances ?)
-+             *   unless a subnode
-+             */
-+            for (k = 0; k < (int)program_dependency_count_j; k++) {
-+                uint8_t program_dependency_k =
-+                ia_css_program_manifest_get_program_dependency(
-+                    program_manifest_j, k);
-+
-+                verifexit((program_dependency_k <
-+                    program_count));
-+                if (program_dependency_k == i) {
-+                    /* program[j] depends on program[i] */
-+                    verifexit((i != j));
-+                    verifexit((program_type_i !=
-+                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+                    (program_type_i !=
-+                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
-+                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+                (ia_css_is_kernel_bitmap_intersection_empty(
-+                program_bitmap_i, program_bitmap_j) ^ is_sub_j));
-+                }
-+            }
-+
-+            /*
-+             * Checks for supernodes and subnodes
-+             * - Detect nodes that kernel-wise are subsets,
-+             *   but not connected to the correct supernode
-+             * - We do not (yet) detect if programs properly
-+             *   depend on all parallel nodes
-+             */
-+            if (!ia_css_is_kernel_bitmap_intersection_empty(
-+                program_bitmap_i, program_bitmap_j)) {
-+                /*
-+                 * This test will pass if
-+                 * the program manifest is NULL,
-+                 * but that's no concern here
-+                 */
-+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+            !ia_css_is_program_manifest_singular_program_type(
-+                program_manifest_i));
-+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+            !ia_css_is_program_manifest_singular_program_type(
-+                program_manifest_j));
-+                if (!is_virtual_sub_j)
-+                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+                    (is_j_subset_i || is_i_subset_j));
-+                if (is_super_i) {
-+                    /* verifexit(is_sub_j); */
-+                    /* verifexit(program_dependency_j0 == i); */
-+                }
-+                if (is_super_j) {
-+                    /* verifexit(is_sub_i); */
-+                    /* verifexit(program_dependency_i0 == j); */
-+                }
-+                if (is_super_i && is_super_j) {
-+                    /* Allow two supernodes to intersect as long as they are different */
-+                    verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
-+                }
-+                /* A bitmap intersect does not necessarily need to mean super and sub. */
-+                /* A sub that intersects with a super, is not necessarily dependent to it. */
-+            }
-+        }
-+        check_bitmap = ia_css_kernel_bitmap_union(
-+                    check_bitmap, program_bitmap_i);
-+        /*
-+         * A terminal can be bound to only a single
-+         * (of multiple concurrent) program(s),
-+         * i.e. the one that holds the iterator to control it
-+         * Only singular and super nodes can depend on a terminal.
-+         * This loop accumulates all terminal
-+         * dependencies over all programs
-+         */
-+        for (j = 0; j < (int)terminal_dependency_count_i; j++) {
-+            uint8_t terminal_dependency =
-+            ia_css_program_manifest_get_terminal_dependency(
-+                    program_manifest_i, j);
-+
-+            verifexit(terminal_dependency < terminal_count);
-+            if ((program_type_i !=
-+                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+                (program_type_i !=
-+                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
-+                /* If the subnode always came after the */
-+                /* supernode we could check for presence */
-+                resource_bitmap =
-+                    vied_nci_bit_mask_set_unique(
-+                        resource_bitmap,
-+                        terminal_dependency);
-+                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+                    !vied_nci_is_bitmap_empty(
-+                        resource_bitmap));
-+            }
-+        }
-+    }
-+    verifexit(ia_css_is_kernel_bitmap_equal(
-+            total_bitmap, check_bitmap));
-+
-+    terminal_bitmap_weight =
-+        vied_nci_bitmap_compute_weight(resource_bitmap);
-+    verifexit(terminal_bitmap_weight >= 0);
-+    if (num_parameter_terminal_in ||
-+        num_parameter_terminal_out ||
-+        num_program_terminal ||
-+        has_program_control_init_terminal) {
-+        int skip_terminal_count = 0;
-+
-+        skip_terminal_count += num_parameter_terminal_in;
-+        skip_terminal_count += num_parameter_terminal_out;
-+        skip_terminal_count += num_program_terminal;
-+        skip_terminal_count -= num_program_terminal_sequencer_info;
-+        if (has_program_control_init_terminal) {
-+            skip_terminal_count++;
-+        }
-+        verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+            (terminal_bitmap_weight ==
-+            (terminal_count - skip_terminal_count)));
-+    } else
-+        verifexit((terminal_bitmap_weight == terminal_count));
-+
-+    is_valid = true;
-+EXIT:
-+    if (is_valid == false) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_is_program_group_manifest_valid: failed\n");
-+    }
-+    return is_valid;
-+}
-+
-+#if !defined(__HIVECC)
-+int ia_css_program_group_manifest_set_kernel_bitmap(
-+    ia_css_program_group_manifest_t *manifest,
-+    const ia_css_kernel_bitmap_t bitmap)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->kernel_bitmap = bitmap;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
-+    }
-+    return retval;
-+}
-+#endif
-+
-+ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
-+    const ia_css_program_group_manifest_t *manifest)
-+{
-+    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        bitmap = manifest->kernel_bitmap;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+#if !defined(__HIVECC)
-+void ia_css_program_group_manifest_init(
-+    ia_css_program_group_manifest_t *blob,
-+    const uint8_t program_count,
-+    const uint8_t terminal_count,
-+    const uint8_t *program_needs_extension,
-+    const uint8_t *program_dependencies,
-+    const uint8_t *terminal_dependencies,
-+    const ia_css_terminal_type_t *terminal_type,
-+    const uint16_t *cached_in_param_section_count,
-+    const uint16_t *cached_out_param_section_count,
-+    const uint16_t *spatial_param_section_count,
-+    const uint16_t *fragment_param_section_count,
-+    const uint16_t *sliced_in_param_section_count,
-+    const uint16_t *sliced_out_param_section_count,
-+    const uint16_t *kernel_fragment_seq_count,
-+    const uint16_t *progctrlinit_load_section_counts,
-+    const uint16_t *progctrlinit_connect_section_counts)
-+{
-+    int i = 0;
-+    int j = 0;
-+    int k = 0;
-+    int l = 0;
-+    int m = 0;
-+    int n = 0;
-+    int o = 0;
-+    int result;
-+    uint32_t offset = 0;
-+    char *prg_manifest_base, *terminal_manifest_base;
-+    size_t program_size = 0;
-+
-+    /*
-+     * assert(blob != NULL);
-+     */
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
-+            (CHAR_BIT * sizeof(ia_css_program_manifest_t)));
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
-+            (CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
-+
-+    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
-+    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+        "ia_css_program_group_manifest_init(): enter:\n");
-+
-+    for (i = 0; i < (int)program_count; i++) {
-+        program_size +=
-+            ia_css_sizeof_program_manifest(
-+                program_needs_extension[i],
-+                program_dependencies[i],
-+                terminal_dependencies[i]);
-+    }
-+
-+    /* A program group ID cannot be zero */
-+    blob->ID = 1;
-+    blob->program_count = program_count;
-+    blob->terminal_count = terminal_count;
-+    blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
-+    blob->terminal_manifest_offset =
-+        (uint32_t)blob->program_manifest_offset + program_size;
-+
-+    prg_manifest_base = (char *)
-+        (((char *)blob) + blob->program_manifest_offset);
-+    offset = blob->program_manifest_offset;
-+    for (i = 0; i < (int)program_count; i++) {
-+        ia_css_program_manifest_init(
-+            (ia_css_program_manifest_t *)prg_manifest_base,
-+            program_needs_extension[i],
-+            program_dependencies[i], terminal_dependencies[i]);
-+        ia_css_program_manifest_set_parent_offset(
-+            (ia_css_program_manifest_t *)prg_manifest_base, offset);
-+        program_size =
-+            ia_css_sizeof_program_manifest(
-+                program_needs_extension[i],
-+                program_dependencies[i],
-+                terminal_dependencies[i]);
-+        prg_manifest_base += program_size;
-+        offset += (uint32_t)program_size;
-+    }
-+
-+    offset = blob->terminal_manifest_offset;
-+    terminal_manifest_base = (char *) (((char *)blob) + offset);
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        size_t terminal_size = 0;
-+        ia_css_terminal_manifest_t *term_manifest =
-+            (ia_css_terminal_manifest_t *)terminal_manifest_base;
-+
-+        ia_css_terminal_manifest_set_parent_offset(
-+                (ia_css_terminal_manifest_t *)
-+                terminal_manifest_base,
-+                offset);
-+        switch (terminal_type[i]) {
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+            result = ia_css_param_terminal_manifest_init(
-+                (ia_css_param_terminal_manifest_t *)
-+                term_manifest,
-+                cached_in_param_section_count[j]);
-+            if (0 == result) {
-+                terminal_size =
-+                ia_css_param_terminal_manifest_get_size(
-+                    cached_in_param_section_count[j]);
-+                j++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_param_terminal_manifest_init failed in cached in terminal\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+            result = ia_css_param_terminal_manifest_init(
-+                (ia_css_param_terminal_manifest_t *)
-+                term_manifest,
-+                cached_out_param_section_count[k]);
-+            if (0 == result) {
-+                terminal_size =
-+                ia_css_param_terminal_manifest_get_size(
-+                    cached_out_param_section_count[k]);
-+                k++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_param_terminal_manifest_init failed\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+            result = ia_css_spatial_param_terminal_manifest_init(
-+                (ia_css_spatial_param_terminal_manifest_t *)
-+                term_manifest,
-+                spatial_param_section_count[l]);
-+            if (0 == result) {
-+                terminal_size =
-+            ia_css_spatial_param_terminal_manifest_get_size(
-+                spatial_param_section_count[l]);
-+                l++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+            result = ia_css_program_terminal_manifest_init(
-+                (ia_css_program_terminal_manifest_t *)
-+                term_manifest,
-+                fragment_param_section_count[m],
-+                kernel_fragment_seq_count[m]);
-+            if (0 == result) {
-+                terminal_size =
-+                ia_css_program_terminal_manifest_get_size(
-+                    fragment_param_section_count[m],
-+                    kernel_fragment_seq_count[m]);
-+                m++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_program_terminal_manifest_init failed in program terminal\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+            result = ia_css_program_control_init_terminal_manifest_init(
-+                (ia_css_program_control_init_terminal_manifest_t *)
-+                term_manifest,
-+                program_count,
-+                progctrlinit_load_section_counts,
-+                progctrlinit_connect_section_counts);
-+            if (0 == result) {
-+                terminal_size =
-+                ia_css_program_control_init_terminal_manifest_get_size(
-+                    program_count,
-+                    NULL,
-+                    NULL);
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_program_control_init_terminal_manifest_init failed\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+            terminal_size = sizeof(ia_css_data_terminal_manifest_t);
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+            result = ia_css_sliced_param_terminal_manifest_init(
-+                (ia_css_sliced_param_terminal_manifest_t *)
-+                term_manifest,
-+                sliced_in_param_section_count[n]);
-+            if (0 == result) {
-+                terminal_size =
-+            ia_css_sliced_param_terminal_manifest_get_size(
-+                sliced_in_param_section_count[n]);
-+                n++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_param_terminal_manifest_init in sliced terminal failed\n");
-+            }
-+            break;
-+        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+            result = ia_css_sliced_param_terminal_manifest_init(
-+                (ia_css_sliced_param_terminal_manifest_t *)
-+                term_manifest,
-+                sliced_out_param_section_count[o]);
-+            if (0 == result) {
-+                terminal_size =
-+                ia_css_sliced_param_terminal_manifest_get_size(
-+                    sliced_out_param_section_count[o]);
-+                n++;
-+            } else {
-+                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+                    "ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
-+            }
-+            break;
-+        default:
-+            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                "ia_css_program_group_manifest_init invalid argument\n");
-+        }
-+        term_manifest->size = (uint16_t)terminal_size;
-+        /* index: i equal to terminal ID due to sorted of the terminals array */
-+        term_manifest->ID = i;
-+        term_manifest->terminal_type = terminal_type[i];
-+        terminal_manifest_base += terminal_size;
-+        offset += (uint32_t)terminal_size;
-+    }
-+
-+    /* Set the private program group manifest blob offset */
-+    blob->private_data_offset = offset;
-+    offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
-+                sizeof(uint64_t));
-+
-+    /* Set the RBM manifest blob offset */
-+    blob->rbm_manifest_offset = offset;
-+    offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
-+                sizeof(uint64_t));
-+
-+    assert(offset <= UINT16_MAX);
-+    blob->size = (uint16_t)offset;
-+}
-+#endif
-+
-+int ia_css_program_group_manifest_print(
-+    const ia_css_program_group_manifest_t *manifest,
-+    void *fid)
-+{
-+    int retval = -1;
-+    int i;
-+    uint8_t program_count, terminal_count;
-+    ia_css_kernel_bitmap_t bitmap;
-+    struct ia_css_psys_private_pg_data *priv_data;
-+    ia_css_rbm_manifest_t *rbm_manifest;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+        "ia_css_program_group_manifest_print(): enter:\n");
-+
-+    NOT_USED(fid);
-+
-+    verifexit(manifest != NULL);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "sizeof(manifest) = %d\n",
-+        (int)ia_css_program_group_manifest_get_size(manifest));
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "alignment(manifest) = %d\n",
-+        (int)ia_css_program_group_manifest_get_alignment(manifest));
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "program group ID = %d\n",
-+        (int)ia_css_program_group_manifest_get_program_group_ID(
-+            manifest));
-+
-+    program_count =
-+        ia_css_program_group_manifest_get_program_count(manifest);
-+    terminal_count =
-+        ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+    bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "%d program manifests\n", (int)program_count);
-+    for (i = 0; i < (int)program_count; i++) {
-+        ia_css_program_manifest_t *program_manifest =
-+            ia_css_program_group_manifest_get_prgrm_mnfst(
-+                manifest, i);
-+
-+        retval = ia_css_program_manifest_print(program_manifest, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "%d terminal manifests\n", (int)terminal_count);
-+    for (i = 0; i < (int)terminal_count; i++) {
-+        ia_css_terminal_manifest_t *terminal_manifest =
-+            ia_css_program_group_manifest_get_term_mnfst(
-+                manifest, i);
-+
-+        retval = ia_css_terminal_manifest_print(
-+                terminal_manifest, fid);
-+        verifjmpexit(retval == 0);
-+    }
-+
-+    priv_data =
-+        (struct ia_css_psys_private_pg_data *)
-+        ia_css_program_group_manifest_get_private_data(manifest);
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+        "private_data_offset %d\n", manifest->private_data_offset);
-+
-+    for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+            "PSA MUX id %d mux val %d\n", i,
-+            priv_data->psa_mux_conf[i]);
-+
-+    }
-+
-+    for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+            "ISA MUX id %d mux val %d\n", i,
-+            priv_data->isa_mux_conf[i]);
-+
-+    }
-+
-+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
-+    for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
-+
-+        if (priv_data->acb_route[i].in_select !=
-+            NCI_ACB_PORT_INVALID) {
-+
-+            assert(priv_data->acb_route[i].in_select !=
-+                NCI_ACB_PORT_INVALID &&
-+                priv_data->acb_route[i].out_select !=
-+                NCI_ACB_PORT_INVALID);
-+
-+            IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
-+                "Route Cell id %d In %d Out %d\n", i,
-+                priv_data->acb_route[i].in_select,
-+                priv_data->acb_route[i].out_select);
-+        }
-+
-+    }
-+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
-+
-+    for (i = 0; i < MAX_INPUT_BUFFER; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
-+                priv_data->input_buffer_info[i].link_id);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
-+                priv_data->input_buffer_info[i].buffer_base_addr);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
-+                priv_data->input_buffer_info[i].bpe);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
-+                priv_data->input_buffer_info[i].buffer_width);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
-+                priv_data->input_buffer_info[i].buffer_height);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
-+                priv_data->input_buffer_info[i].num_of_buffers);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
-+                priv_data->input_buffer_info[i].dfm_port_addr);
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
-+    }
-+
-+    rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
-+    ia_css_rbm_manifest_print(rbm_manifest);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_group_manifest_print failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
-new file mode 100644
-index 000000000000..185baec014aa
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
-@@ -0,0 +1,972 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_psys_static_trace.h"
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <storage_class.h>
-+#include <math_support.h>
-+
-+/* *****************************************************
-+ * Functions to possibly inline
-+ * ******************************************************/
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+/* *****************************************************
-+ * Functions not to inline and available to firmware
-+ * ******************************************************/
-+bool ia_css_has_program_manifest_fixed_cell(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+    bool has_fixed_cell = false;
-+    vied_nci_cell_ID_t cell_id;
-+    vied_nci_cell_type_ID_t    cell_type_id;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_has_program_manifest_fixed_cell(): enter:\n");
-+
-+    verifexitval(manifest != NULL, EFAULT);
-+
-+    cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
-+    cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
-+
-+    has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
-+              (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+           "ia_css_has_program_manifest_fixed_cell invalid argument\n");
-+        return false;
-+    }
-+    return has_fixed_cell;
-+}
-+
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
-+    const ia_css_program_manifest_t            *manifest)
-+{
-+    DECLARE_ERRVAL
-+    vied_nci_resource_bitmap_t    bitmap = 0;
-+    int i = 0;
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_get_cells_bitmap(): enter:\n");
-+
-+    verifexitval(manifest != NULL, EFAULT);
-+
-+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
-+            bitmap |= (1 << manifest->cells[i]);
-+        }
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+    }
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
-+    }
-+    return bitmap;
-+}
-+
-+bool ia_css_is_program_manifest_subnode_program_type(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    ia_css_program_type_t        program_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_is_program_manifest_subnode_program_type(): enter:\n");
-+
-+    program_type = ia_css_program_manifest_get_type(manifest);
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
-+            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
-+            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+}
-+
-+bool ia_css_is_program_manifest_supernode_program_type(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    ia_css_program_type_t program_type;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+           "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
-+
-+    program_type = ia_css_program_manifest_get_type(manifest);
-+
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
-+            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
-+            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
-+}
-+
-+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
-+    const ia_css_program_manifest_t *manifest)
-+{
-+    DECLARE_ERRVAL
-+
-+    vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
-+    int i = 0;
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_get_cell_ID(): enter:\n");
-+
-+    verifexitval(manifest != NULL, EFAULT);
-+
-+    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+    }
-+    cell_id = manifest->cells[0];
-+EXIT:
-+    if (!noerror()) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+          "ia_css_program_manifest_get_cell_ID invalid argument\n");
-+        return VIED_NCI_N_CELL_ID;
-+    }
-+    return cell_id;
-+}
-+
-+/* *****************************************************
-+ * Functions not to inline and not available to firmware
-+ * ******************************************************/
-+#if !defined(__HIVECC)
-+size_t ia_css_sizeof_program_manifest(
-+    const uint8_t program_needs_extension,
-+    const uint8_t program_dependency_count,
-+    const uint8_t terminal_dependency_count)
-+{
-+    size_t    size = 0;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_sizeof_program_manifest(): enter:\n");
-+
-+    size += sizeof(ia_css_program_manifest_t);
-+    if (program_needs_extension == 1) {
-+        /* align manifest extension to 32 bit */
-+        size = CEIL_MUL(size, sizeof(uint32_t));
-+        size += sizeof(ia_css_program_manifest_ext_t);
-+    }
-+    size += program_dependency_count * sizeof(uint8_t);
-+    size += terminal_dependency_count * sizeof(uint8_t);
-+    /* align whole structure to 32 bit */
-+    size = ceil_mul(size, sizeof(uint32_t));
-+
-+    return size;
-+}
-+
-+int ia_css_program_manifest_set_program_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    ia_css_program_ID_t id)
-+{
-+    int ret = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_program_ID(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
-+        manifest->ID = id;
-+        ret = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+           "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
-+    }
-+    return ret;
-+}
-+
-+int ia_css_program_manifest_set_parent_offset(
-+    ia_css_program_manifest_t    *manifest,
-+    int32_t program_offset)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_parent_offset(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    /* parent is at negative offset away from current program offset*/
-+    assert((int16_t)(-program_offset) == -program_offset);
-+    manifest->parent_offset = (int16_t)(-program_offset);
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_parent_offset failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_type(
-+    ia_css_program_manifest_t                *manifest,
-+    const ia_css_program_type_t                program_type)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_type(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
-+        manifest->program_type = (ia_css_program_type_t)program_type;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+              "ia_css_program_manifest_set_type failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_kernel_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const ia_css_kernel_bitmap_t            kernel_bitmap)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        manifest->kernel_bitmap = kernel_bitmap;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_cell_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_cell_ID_t            cell_id)
-+{
-+    int    retval = -1;
-+    int i = 0;
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_cell_ID(): enter:\n");
-+    if (manifest != NULL) {
-+        manifest->cells[0] = cell_id;
-+        for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+            manifest->cells[i] = VIED_NCI_N_CELL_ID;
-+        }
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+           "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_cell_type_ID(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_cell_type_ID_t            cell_type_id)
-+{
-+    int    retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_cell_type_ID(): enter:\n");
-+    if (manifest != NULL) {
-+        manifest->cell_type_id = cell_type_id;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+void ia_css_program_manifest_set_input_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                   idx,
-+    unsigned char                   val)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
-+    if (manifest != NULL) {
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+        if (manifest_ext == NULL) {
-+            return;
-+        }
-+        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
-+        manifest_ext->dec_resources_input_terminal[idx] = val;
-+#else
-+        (void) idx;
-+        (void) val;
-+#endif
-+    }
-+}
-+
-+void ia_css_program_manifest_set_output_terminal_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                    idx,
-+    unsigned char                    val)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
-+    if (manifest != NULL) {
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+        if (manifest_ext == NULL) {
-+            return;
-+        }
-+        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
-+        manifest_ext->dec_resources_output_terminal[idx] = val;
-+#else
-+        (void) idx;
-+        (void) val;
-+        (void) manifest_ext;
-+#endif
-+    }
-+}
-+
-+void ia_css_program_manifest_set_input_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                   idx,
-+    unsigned char                   val)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_input_stream_id(): enter:\n");
-+    if (manifest != NULL) {
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+        if (manifest_ext == NULL) {
-+            return;
-+        }
-+        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
-+        manifest_ext->dec_resources_input[idx] = val;
-+#else
-+        (void) idx;
-+        (void) val;
-+#endif
-+    }
-+}
-+
-+void ia_css_program_manifest_set_output_stream_id(
-+    ia_css_program_manifest_t   *manifest,
-+    unsigned char                    idx,
-+    unsigned char                    val)
-+{
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_output_stream_id(): enter:\n");
-+    if (manifest != NULL) {
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+        ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+        manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+        if (manifest_ext == NULL) {
-+            return;
-+        }
-+        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
-+        manifest_ext->dec_resources_output[idx] = val;
-+#else
-+        (void) idx;
-+        (void) val;
-+#endif
-+    }
-+}
-+
-+int ia_css_program_manifest_set_cells_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_resource_bitmap_t    bitmap)
-+{
-+    int retval = -1;
-+    int array_index = 0;
-+    int bit_index;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
-+            if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
-+                verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
-+                manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
-+                array_index++;
-+            }
-+        }
-+        for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
-+            manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
-+        }
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
-+    }
-+EXIT:
-+    return retval;
-+}
-+
-+#if HAS_DFM
-+int ia_css_program_manifest_set_dfm_port_bitmap(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_dfm_id_t          dfm_type_id,
-+    const vied_nci_resource_bitmap_t     bitmap)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && bitmap == 0) {
-+        return 0;
-+    }
-+    verifexit(manifest_ext != NULL);
-+    manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
-+    retval = 0;
-+
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                "ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_dfm_active_port_bitmap(
-+    ia_css_program_manifest_t           *manifest,
-+    const vied_nci_dev_dfm_id_t          dfm_type_id,
-+    const vied_nci_resource_bitmap_t     bitmap)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+            "ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && bitmap == 0) {
-+        return 0;
-+    }
-+    verifexit(manifest_ext != NULL);
-+    manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
-+    retval = 0;
-+
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                "ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_is_dfm_relocatable(
-+    ia_css_program_manifest_t       *manifest,
-+    const vied_nci_dev_dfm_id_t      dfm_type_id,
-+    const uint8_t                    is_relocatable)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+            "ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL) {
-+        return 0;
-+    }
-+    manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
-+    retval = 0;
-+
-+    EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+                "ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
-+    }
-+
-+    return retval;
-+}
-+#endif /* HAS_DFM */
-+
-+int ia_css_program_manifest_set_int_mem_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            int_mem_size)
-+{
-+    (void)manifest;
-+    (void)mem_type_id;
-+    if (int_mem_size != 0) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_int_mem_size should not be called"
-+            "(internally memory feature not used).\n");
-+        return -1;
-+    }
-+    return 0;
-+}
-+
-+int ia_css_program_manifest_set_ext_mem_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            ext_mem_size)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    if (manifest == NULL) {
-+        return retval;
-+    }
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && ext_mem_size == 0) {
-+        return 0;
-+    } else if (manifest_ext == NULL) {
-+        return retval;
-+    }
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
-+
-+    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+        manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
-+    }
-+
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_ext_mem_offset(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_mem_type_ID_t            mem_type_id,
-+    const vied_nci_resource_size_t            ext_mem_offset)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    if (manifest == NULL) {
-+        return retval;
-+    }
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && ext_mem_offset ==
-+        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
-+        return 0;
-+    } else if (manifest_ext == NULL) {
-+        return retval;
-+    }
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
-+
-+    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+        manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
-+    }
-+
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_dev_chn_size(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t            dev_chn_id,
-+    const vied_nci_resource_size_t            dev_chn_size)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    if (manifest == NULL) {
-+        return retval;
-+    }
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && dev_chn_size == 0) {
-+        return 0;
-+    } else if (manifest_ext == NULL) {
-+        return retval;
-+    }
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+        manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
-+    }
-+#else
-+    NOT_USED(dev_chn_id);
-+#endif
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_dev_chn_offset(
-+    ia_css_program_manifest_t            *manifest,
-+    const vied_nci_dev_chn_ID_t            dev_chn_id,
-+    const vied_nci_resource_size_t            dev_chn_offset)
-+{
-+    int retval = -1;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    if (manifest == NULL) {
-+        return retval;
-+    }
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext == NULL && dev_chn_offset ==
-+        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
-+        return 0;
-+    } else if (manifest_ext == NULL) {
-+        return retval;
-+    }
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+               "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+        manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
-+        retval = 0;
-+    } else {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+         "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
-+    }
-+#else
-+    NOT_USED(dev_chn_id);
-+#endif
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_program_dependency(
-+    ia_css_program_manifest_t    *manifest,
-+    const uint8_t            program_dependency,
-+    const unsigned int        index)
-+{
-+    int    retval = -1;
-+    uint8_t *program_dep_ptr;
-+    uint8_t    program_dependency_count;
-+    uint8_t    program_count;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_program_dependency(): enter:\n");
-+
-+    program_dependency_count =
-+        ia_css_program_manifest_get_program_dependency_count(manifest);
-+    program_count =
-+        ia_css_program_group_manifest_get_program_count(
-+            ia_css_program_manifest_get_parent(manifest));
-+
-+    if ((index < program_dependency_count) &&
-+        (program_dependency < program_count)) {
-+        program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+                  manifest->program_dependency_offset +
-+                  index*sizeof(uint8_t));
-+         *program_dep_ptr = program_dependency;
-+        retval = 0;
-+    }
-+
-+    if (retval != 0) {
-+        IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
-+            program_dependency, index, retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_program_manifest_set_terminal_dependency(
-+    ia_css_program_manifest_t            *manifest,
-+    const uint8_t                    terminal_dependency,
-+    const unsigned int                index)
-+{
-+    int    retval = -1;
-+    uint8_t *terminal_dep_ptr;
-+    uint8_t terminal_dependency_count =
-+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+    uint8_t terminal_count =
-+        ia_css_program_group_manifest_get_terminal_count(
-+            ia_css_program_manifest_get_parent(manifest));
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_program_manifest_set_terminal_dependency(): enter:\n");
-+
-+    if ((index < terminal_dependency_count) &&
-+            (terminal_dependency < terminal_count)) {
-+        terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+                  manifest->terminal_dependency_offset + index);
-+         *terminal_dep_ptr = terminal_dependency;
-+        retval = 0;
-+    }
-+
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+void ia_css_program_manifest_init(
-+    ia_css_program_manifest_t    *blob,
-+    const uint8_t    program_needs_extension,
-+    const uint8_t    program_dependency_count,
-+    const uint8_t    terminal_dependency_count)
-+{
-+    size_t size = 0;
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+        "ia_css_program_manifest_init(): enter:\n");
-+
-+    /*TODO: add assert*/
-+    if (!blob)
-+        return;
-+
-+    blob->ID = 1;
-+    blob->program_dependency_count = program_dependency_count;
-+    blob->terminal_dependency_count = terminal_dependency_count;
-+
-+    size += sizeof(ia_css_program_manifest_t);
-+    if (program_needs_extension == 1) {
-+        /* align start of extension to 32 bit */
-+        size = CEIL_MUL(size, sizeof(uint32_t));
-+        blob->program_extension_offset = size;
-+        size += sizeof(ia_css_program_manifest_ext_t);
-+    } else {
-+        blob->program_extension_offset = 0;
-+    }
-+    blob->program_dependency_offset = size;
-+    size += sizeof(uint8_t) * program_dependency_count;
-+    blob->terminal_dependency_offset = size;
-+    size += sizeof(uint8_t) * terminal_dependency_count;
-+    /* align whole structure to 32 bit */
-+    size = CEIL_MUL(size, sizeof(uint32_t));
-+
-+    blob->size = (uint8_t)ia_css_sizeof_program_manifest(
-+        program_needs_extension,
-+        program_dependency_count,
-+        terminal_dependency_count);
-+
-+    assert(blob->size == size);
-+    /* The following assert also implies that:
-+     * blob->program_extension_offset,
-+     * blob->program_dependency_offset,
-+     * blob->terminal_dependency_offset,
-+     * are <= UINT8_MAX
-+     */
-+    assert(size <= UINT8_MAX);
-+}
-+
-+int ia_css_program_manifest_print(
-+    const ia_css_program_manifest_t *manifest,
-+    void *fid)
-+{
-+    int            retval = -1;
-+    int            i, mem_index, dev_chn_index;
-+
-+    vied_nci_cell_type_ID_t    cell_type_id;
-+    uint8_t                    program_dependency_count;
-+    uint8_t                    terminal_dependency_count;
-+    ia_css_kernel_bitmap_t    bitmap;
-+    ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+               "ia_css_program_manifest_print(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    NOT_USED(fid);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
-+        (int)ia_css_program_manifest_get_size(manifest));
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
-+        (int)ia_css_program_manifest_get_program_ID(manifest));
-+
-+    bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
-+    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+    if (ia_css_has_program_manifest_fixed_cell(manifest)) {
-+        vied_nci_cell_ID_t cell_id =
-+                  ia_css_program_manifest_get_cell_ID(manifest);
-+
-+        cell_type_id = vied_nci_cell_get_type(cell_id);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
-+            (int)cell_id);
-+    } else {
-+        cell_type_id =
-+            ia_css_program_manifest_get_cell_type_ID(manifest);
-+    }
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
-+        (int)cell_type_id);
-+
-+    manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+    if (manifest_ext != NULL) {
-+    for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
-+         mem_index++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(internal mem) type = %d\n",
-+        (int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
-+    }
-+
-+    for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
-+         mem_index++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(external mem) type = %d\n",
-+            (int)(vied_nci_mem_type_ID_t)mem_index);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(external mem) size = %d\n",
-+            manifest_ext->ext_mem_size[mem_index]);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(external mem) offset = %d\n",
-+            manifest_ext->ext_mem_offset[mem_index]);
-+    }
-+#if HAS_DFM
-+    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
-+         dev_chn_index++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(device channel) type = %d\n",
-+            (int)dev_chn_index);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(device channel) size = %d\n",
-+            manifest_ext->dev_chn_size[dev_chn_index]);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(device channel) offset = %d\n",
-+            manifest_ext->dev_chn_offset[dev_chn_index]);
-+    }
-+    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
-+        dev_chn_index++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(dfm port) type = %d\n",
-+            (int)dev_chn_index);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(dfm port) port_bitmap = %x\n",
-+            manifest_ext->dfm_port_bitmap[dev_chn_index]);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(dfm port) active_port_bitmap = %x\n",
-+            manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(dfm port) is_dfm_relocatable = %d\n",
-+            manifest_ext->is_dfm_relocatable[dev_chn_index]);
-+    }
-+#else
-+    NOT_USED(dev_chn_index);
-+#endif /* HAS_DFM */
-+#ifdef USE_DEC400
-+    for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+            "\tEncoder stream id for idx = %d is: %d \n",
-+            i,
-+            manifest_ext->dec_resources_input[i]);
-+
-+    }
-+    for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
-+        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+            "\tDecoder stream id for idx: = %d is: %d\n",
-+            i,
-+            manifest_ext->dec_resources_output[i]);
-+
-+    }
-+#endif
-+    }
-+
-+    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\ttype(cells) bitmap = %d\n",
-+            manifest->cells[i]);
-+    }
-+    program_dependency_count =
-+        ia_css_program_manifest_get_program_dependency_count(manifest);
-+    if (program_dependency_count == 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "program_dependencies[%d] {};\n",
-+            program_dependency_count);
-+    } else {
-+        uint8_t prog_dep;
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "program_dependencies[%d] {\n",
-+            program_dependency_count);
-+        for (i = 0; i < (int)program_dependency_count - 1; i++) {
-+            prog_dep =
-+            ia_css_program_manifest_get_program_dependency(
-+                manifest, i);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "\t %4d,\n", prog_dep);
-+        }
-+        prog_dep =
-+        ia_css_program_manifest_get_program_dependency(manifest, i);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
-+        (void)prog_dep;
-+    }
-+
-+    terminal_dependency_count =
-+        ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+    if (terminal_dependency_count == 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "terminal_dependencies[%d] {};\n",
-+            terminal_dependency_count);
-+    } else {
-+        uint8_t term_dep;
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "terminal_dependencies[%d] {\n",
-+            terminal_dependency_count);
-+        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
-+            term_dep =
-+            ia_css_program_manifest_get_terminal_dependency(
-+                manifest, i);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "\t %4d,\n", term_dep);
-+        }
-+        term_dep =
-+           ia_css_program_manifest_get_terminal_dependency(manifest, i);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
-+        (void)term_dep;
-+    }
-+    (void)cell_type_id;
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_program_manifest_print failed (%i)\n", retval);
-+    }
-+    return retval;
-+}
-+
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
-new file mode 100644
-index 000000000000..c71219549595
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
-@@ -0,0 +1,534 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_terminal_private_types.h"
-+#include "ia_css_terminal_types.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_terminal_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/*
-+ * This source file is created with the intention of sharing and
-+ * compiled for host and firmware. Since there is no native 64bit
-+ * data type support for firmware this wouldn't compile for SP
-+ * tile. The part of the file that is not compilable are marked
-+ * with the following __VIED_CELL marker and this comment. Once we
-+ * come up with a solution to address this issue this will be
-+ * removed.
-+ */
-+#if !defined(__VIED_CELL)
-+size_t ia_css_sizeof_terminal(
-+    const ia_css_terminal_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param)
-+{
-+    size_t size = 0;
-+    uint16_t fragment_count =
-+        ia_css_program_group_param_get_fragment_count(param);
-+
-+    COMPILATION_ERROR_IF(
-+        SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
-+        (CHAR_BIT * sizeof(ia_css_data_terminal_t)));
-+
-+    COMPILATION_ERROR_IF(
-+        0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_sizeof_terminal(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
-+        const ia_css_param_terminal_manifest_t *param_term_man =
-+            (const ia_css_param_terminal_manifest_t *)manifest;
-+        verifexit(param_term_man != NULL);
-+        if (ia_css_terminal_manifest_get_type(manifest) ==
-+                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
-+            size = ia_css_param_in_terminal_get_descriptor_size(
-+            param_term_man->param_manifest_section_desc_count);
-+        } else if (ia_css_terminal_manifest_get_type(manifest) ==
-+                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+            size = ia_css_param_out_terminal_get_descriptor_size(
-+            param_term_man->param_manifest_section_desc_count,
-+            fragment_count);
-+        } else {
-+            assert(NULL == "Invalid parameter terminal type");
-+            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+                "ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
-+            verifjmpexit(0);
-+        }
-+    } else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
-+        size += sizeof(ia_css_data_terminal_t);
-+        size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
-+    } else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
-+        ia_css_program_terminal_manifest_t *prog_term_man =
-+            (ia_css_program_terminal_manifest_t *)manifest;
-+
-+        size = ia_css_program_terminal_get_descriptor_size(
-+            fragment_count,
-+            prog_term_man->
-+            fragment_param_manifest_section_desc_count,
-+            prog_term_man->
-+            kernel_fragment_sequencer_info_manifest_info_count,
-+            (fragment_count * prog_term_man->
-+            max_kernel_fragment_sequencer_command_desc));
-+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+                manifest)) {
-+        ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
-+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
-+        size = ia_css_spatial_param_terminal_get_descriptor_size(
-+        spatial_param_term->
-+        frame_grid_param_manifest_section_desc_count,
-+            fragment_count);
-+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+                manifest)) {
-+        ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
-+            (ia_css_program_control_init_terminal_manifest_t *)manifest;
-+        ia_css_program_group_manifest_t *pg_manifest =
-+            ia_css_terminal_manifest_get_parent(manifest);
-+        ia_css_kernel_bitmap_t kernel_bitmap =
-+            ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+        verifjmpexit(pg_manifest != NULL);
-+        size = ia_css_program_control_init_terminal_get_descriptor_size(
-+            progctrlinit_term_man, pg_manifest, kernel_bitmap);
-+    }
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_sizeof_terminal invalid argument\n");
-+    }
-+    return size;
-+}
-+
-+ia_css_terminal_t *ia_css_terminal_create(
-+    void *raw_mem,
-+    const ia_css_terminal_manifest_t *manifest,
-+    const ia_css_terminal_param_t *terminal_param,
-+    ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+    char *terminal_raw_ptr;
-+    ia_css_terminal_t *terminal = NULL;
-+    uint16_t fragment_count;
-+    int i, j;
-+    int retval = -1;
-+    ia_css_program_group_param_t *param;
-+
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
-+        manifest, terminal_param);
-+
-+    param = ia_css_terminal_param_get_parent(terminal_param);
-+    fragment_count = ia_css_program_group_param_get_fragment_count(param);
-+
-+    verifexit(manifest != NULL);
-+    verifexit(param != NULL);
-+
-+    terminal_raw_ptr = (char *) raw_mem;
-+
-+    terminal = (ia_css_terminal_t *) terminal_raw_ptr;
-+    verifexit(terminal != NULL);
-+
-+    terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
-+    verifexit(ia_css_terminal_set_type(
-+        terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
-+
-+    terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
-+
-+    verifexit(ia_css_terminal_set_buffer(terminal,
-+                VIED_NULL) == 0);
-+
-+    if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
-+        ia_css_data_terminal_t *dterminal =
-+            (ia_css_data_terminal_t *)terminal;
-+        ia_css_frame_t *frame =
-+            ia_css_data_terminal_get_frame(dterminal);
-+        ia_css_kernel_bitmap_t intersection =
-+            ia_css_kernel_bitmap_intersection(enable_bitmap,
-+            ia_css_data_terminal_manifest_get_kernel_bitmap(
-+            (const ia_css_data_terminal_manifest_t *)manifest));
-+
-+        verifexit(frame != NULL);
-+        verifexit(ia_css_frame_set_buffer_state(
-+                frame, IA_CSS_BUFFER_NULL) == 0);
-+        verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
-+                    true);
-+
-+        terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
-+        dterminal->fragment_descriptor_offset =
-+            (uint16_t) (terminal_raw_ptr - (char *)terminal);
-+
-+        dterminal->kernel_id = 0;
-+        while (!ia_css_is_kernel_bitmap_empty(intersection)) {
-+            intersection = ia_css_kernel_bitmap_shift(
-+                    intersection);
-+            dterminal->kernel_id++;
-+        }
-+        assert(dterminal->kernel_id > 0);
-+        dterminal->kernel_id -= 1;
-+
-+        /* some terminal and fragment initialization */
-+        dterminal->frame_descriptor.frame_format_type =
-+            terminal_param->frame_format_type;
-+        for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
-+            dterminal->frame_descriptor.dimension[i] =
-+                terminal_param->dimensions[i];
-+        }
-+        dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
-+            terminal_param->stride;
-+        dterminal->frame_descriptor.bpp = terminal_param->bpp;
-+        dterminal->frame_descriptor.bpe = terminal_param->bpe;
-+        switch (dterminal->frame_descriptor.frame_format_type) {
-+        case IA_CSS_DATA_FORMAT_UYVY:
-+        case IA_CSS_DATA_FORMAT_YUYV:
-+        case IA_CSS_DATA_FORMAT_YUV420_LINE:
-+        case IA_CSS_DATA_FORMAT_Y800:
-+        case IA_CSS_DATA_FORMAT_RGB565:
-+        case IA_CSS_DATA_FORMAT_RGBA888:
-+        case IA_CSS_DATA_FORMAT_BAYER_GRBG:
-+        case IA_CSS_DATA_FORMAT_BAYER_RGGB:
-+        case IA_CSS_DATA_FORMAT_BAYER_BGGR:
-+        case IA_CSS_DATA_FORMAT_BAYER_GBRG:
-+        case IA_CSS_DATA_FORMAT_RAW:
-+        case IA_CSS_DATA_FORMAT_RAW_PACKED:
-+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
-+        case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
-+        case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
-+        case IA_CSS_DATA_FORMAT_IR:
-+            dterminal->frame_descriptor.plane_count = 1;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            break;
-+        case IA_CSS_DATA_FORMAT_NV12:
-+        case IA_CSS_DATA_FORMAT_NV21:
-+        case IA_CSS_DATA_FORMAT_NV16:
-+        case IA_CSS_DATA_FORMAT_NV61:
-+        case IA_CSS_DATA_FORMAT_P010:
-+        case IA_CSS_DATA_FORMAT_P010_MSB:
-+        case IA_CSS_DATA_FORMAT_P016:
-+        case IA_CSS_DATA_FORMAT_P016_MSB:
-+        case IA_CSS_DATA_FORMAT_P012_MSB:
-+            dterminal->frame_descriptor.plane_count = 2;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            dterminal->frame_descriptor.plane_offsets[1] =
-+                dterminal->frame_descriptor.plane_offsets[0] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+            break;
-+        case IA_CSS_DATA_FORMAT_P010_TILEY:
-+        case IA_CSS_DATA_FORMAT_P016_TILEY:
-+        case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
-+        case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
-+        case IA_CSS_DATA_FORMAT_NV12_TILEY:
-+            dterminal->frame_descriptor.plane_count = 2;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            dterminal->frame_descriptor.plane_offsets[1] =
-+                dterminal->frame_descriptor.plane_offsets[0] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+                CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
-+            break;
-+        case IA_CSS_DATA_FORMAT_YUV444:
-+        case IA_CSS_DATA_FORMAT_RGB888:
-+        case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
-+            dterminal->frame_descriptor.plane_count = 3;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            dterminal->frame_descriptor.plane_offsets[1] =
-+                dterminal->frame_descriptor.plane_offsets[0] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+            dterminal->frame_descriptor.plane_offsets[2] =
-+                dterminal->frame_descriptor.plane_offsets[1] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+            break;
-+        case IA_CSS_DATA_FORMAT_YUV420:
-+        case IA_CSS_DATA_FORMAT_YV12:
-+            dterminal->frame_descriptor.plane_count = 3;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            dterminal->frame_descriptor.plane_offsets[1] =
-+                dterminal->frame_descriptor.plane_offsets[0] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+            dterminal->frame_descriptor.plane_offsets[2] =
-+                dterminal->frame_descriptor.plane_offsets[1] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+            break;
-+        case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
-+            dterminal->frame_descriptor.plane_count = 4;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            dterminal->frame_descriptor.plane_offsets[1] =
-+                dterminal->frame_descriptor.plane_offsets[0] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+            dterminal->frame_descriptor.plane_offsets[2] =
-+                dterminal->frame_descriptor.plane_offsets[1] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
-+            dterminal->frame_descriptor.plane_offsets[3] =
-+                dterminal->frame_descriptor.plane_offsets[2] +
-+                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+            break;
-+        default:
-+            /* Unset, resulting in potential terminal connect issues */
-+            dterminal->frame_descriptor.plane_count = 1;
-+            dterminal->frame_descriptor.plane_offsets[0] = 0;
-+            break;
-+        }
-+        /*
-+         * Initial solution for single fragment initialization
-+         * TODO:
-+         * where to get the fragment description params from???
-+         */
-+        if (fragment_count > 0) {
-+            ia_css_fragment_descriptor_t *fragment_descriptor =
-+                (ia_css_fragment_descriptor_t *)
-+                terminal_raw_ptr;
-+
-+            fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
-+                terminal_param->index[IA_CSS_COL_DIMENSION];
-+            fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
-+                terminal_param->index[IA_CSS_ROW_DIMENSION];
-+            fragment_descriptor->offset[0] =
-+                terminal_param->offset;
-+            for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
-+                fragment_descriptor->dimension[i] =
-+                    terminal_param->fragment_dimensions[i];
-+            }
-+        }
-+        /* end fragment stuff */
-+
-+        /* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
-+        dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+    } else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
-+            true) {
-+        ia_css_param_terminal_t *pterminal =
-+            (ia_css_param_terminal_t *)terminal;
-+        uint16_t section_count =
-+            ((const ia_css_param_terminal_manifest_t *)manifest)->
-+            param_manifest_section_desc_count;
-+        size_t curr_offset = 0;
-+
-+        pterminal->param_section_desc_offset =
-+            sizeof(ia_css_param_terminal_t);
-+
-+        for (i = 0; i < section_count; i++) {
-+            ia_css_param_section_desc_t *section =
-+            ia_css_param_in_terminal_get_param_section_desc(
-+                    pterminal, i);
-+            const ia_css_param_manifest_section_desc_t *
-+                man_section =
-+        ia_css_param_terminal_manifest_get_prm_sct_desc(
-+            (const ia_css_param_terminal_manifest_t *)manifest, i);
-+
-+            verifjmpexit(man_section != NULL);
-+            verifjmpexit(section != NULL);
-+
-+            section->mem_size = man_section->max_mem_size;
-+            section->mem_offset = curr_offset;
-+            curr_offset += man_section->max_mem_size;
-+        }
-+    } else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
-+            true &&
-+        ia_css_terminal_manifest_get_type(manifest) ==
-+        IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
-+        ia_css_program_terminal_t *prog_terminal =
-+            (ia_css_program_terminal_t *)terminal;
-+        const ia_css_program_terminal_manifest_t *prog_terminal_man =
-+            (const ia_css_program_terminal_manifest_t *)manifest;
-+        verifjmpexit(prog_terminal_man != NULL);
-+
-+        ia_css_kernel_fragment_sequencer_info_desc_t
-+        *sequencer_info_desc_base = NULL;
-+        uint16_t section_count = prog_terminal_man->
-+        fragment_param_manifest_section_desc_count;
-+        uint16_t manifest_info_count =
-+            prog_terminal_man->
-+            kernel_fragment_sequencer_info_manifest_info_count;
-+        /* information needs to come from user or manifest once
-+         * the size sizeof function is updated.
-+         */
-+        uint16_t nof_command_objs = 0;
-+        size_t curr_offset = 0;
-+
-+        prog_terminal->kernel_fragment_sequencer_info_desc_offset =
-+            sizeof(ia_css_program_terminal_t);
-+        prog_terminal->fragment_param_section_desc_offset =
-+            prog_terminal->
-+            kernel_fragment_sequencer_info_desc_offset +
-+            (fragment_count * manifest_info_count *
-+            sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+            (nof_command_objs *
-+            sizeof(
-+            ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+        NOT_USED(sequencer_info_desc_base);
-+        /*Save fragments set fragment_count to 1*/
-+        fragment_count = 1;
-+        for (i = 0; i < fragment_count; i++) {
-+            for (j = 0; j < section_count; j++) {
-+                ia_css_fragment_param_section_desc_t *section =
-+            ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+                    prog_terminal, i, j, section_count);
-+            const ia_css_fragment_param_manifest_section_desc_t *
-+            man_section =
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
-+                (prog_terminal_man, j);
-+
-+                verifjmpexit(man_section != NULL);
-+                verifjmpexit(section != NULL);
-+
-+                section->mem_size = man_section->max_mem_size;
-+                section->mem_offset = curr_offset;
-+                curr_offset += man_section->max_mem_size;
-+            }
-+
-+            sequencer_info_desc_base =
-+        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+                    prog_terminal, i, 0,
-+                    manifest_info_count);
-+        prog_terminal->payload_fragment_stride = curr_offset;
-+
-+            /*
-+             * This offset cannot be initialized properly
-+             * since the number of commands in every sequencer
-+             * is not known at this point
-+             */
-+            /*for (j = 0; j < manifest_info_count; j++) {
-+                sequencer_info_desc_base[j].
-+                    command_desc_offset =
-+                prog_terminal->
-+                kernel_fragment_sequencer_info_desc_offset +
-+                (manifest_info_count *
-+                sizeof(
-+                ia_css_kernel_fragment_sequencer_info_desc_t) +
-+                (nof_command_objs *
-+                sizeof(
-+                ia_css_kernel_fragment_sequencer_command_desc_t
-+                ));
-+            }*/
-+        }
-+    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+                manifest) == true) {
-+        ia_css_spatial_param_terminal_t *spatial_param_terminal =
-+            (ia_css_spatial_param_terminal_t *)terminal;
-+        ia_css_spatial_param_terminal_manifest_t *
-+            spatia_param_terminal_man =
-+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
-+
-+        /* Initialize the spatial terminal structure */
-+        spatial_param_terminal->fragment_grid_desc_offset =
-+            sizeof(ia_css_spatial_param_terminal_t);
-+        spatial_param_terminal->frame_grid_param_section_desc_offset =
-+            spatial_param_terminal->fragment_grid_desc_offset +
-+            (fragment_count * sizeof(ia_css_fragment_grid_desc_t));
-+        spatial_param_terminal->kernel_id =
-+            spatia_param_terminal_man->kernel_id;
-+    } else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
-+            true) {
-+        ia_css_sliced_param_terminal_t *sliced_param_terminal =
-+            (ia_css_sliced_param_terminal_t *)terminal;
-+        ia_css_sliced_param_terminal_manifest_t
-+        *sliced_param_terminal_man =
-+            (ia_css_sliced_param_terminal_manifest_t *)manifest;
-+
-+        /* Initialize the sliced terminal structure */
-+        sliced_param_terminal->fragment_slice_desc_offset =
-+            sizeof(ia_css_sliced_param_terminal_t);
-+        sliced_param_terminal->kernel_id =
-+            sliced_param_terminal_man->kernel_id;
-+    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+            manifest) == true) {
-+        ia_css_program_group_manifest_t *pg_manifest =
-+            ia_css_terminal_manifest_get_parent(manifest);
-+        ia_css_program_group_param_t *pg_param =
-+            ia_css_terminal_param_get_parent(terminal_param);
-+        ia_css_kernel_bitmap_t kernel_bitmap;
-+
-+        verifjmpexit(pg_manifest != NULL && pg_param != NULL);
-+        kernel_bitmap =
-+            ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
-+
-+        verifjmpexit(ia_css_program_control_init_terminal_init(
-+            (ia_css_program_control_init_terminal_t *)
-+            terminal,
-+            (const ia_css_program_control_init_terminal_manifest_t *)
-+            manifest, pg_manifest, kernel_bitmap) == 0);
-+    } else {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
-+            EFAULT);
-+        goto EXIT;
-+    }
-+
-+    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+                   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
-+                   terminal->ID);
-+
-+    retval = 0;
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_terminal_create invalid argument\n");
-+    }
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+            "ia_css_terminal_create failed (%i)\n", retval);
-+        terminal = ia_css_terminal_destroy(terminal);
-+    }
-+    return terminal;
-+}
-+
-+ia_css_terminal_t *ia_css_terminal_destroy(
-+    ia_css_terminal_t *terminal)
-+{
-+    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+        "ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
-+    return terminal;
-+}
-+
-+uint16_t ia_css_param_terminal_compute_section_count(
-+    const ia_css_terminal_manifest_t *manifest,
-+    const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
-+{
-+    uint16_t section_count = 0;
-+
-+    NOT_USED(param);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+        "ia_css_param_terminal_compute_section_count(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
-+                param_manifest_section_desc_count;
-+EXIT:
-+    if (NULL == manifest || NULL == param) {
-+        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+            "ia_css_param_terminal_compute_section_count: invalid argument\n");
-+    }
-+    return section_count;
-+}
-+#endif /* !defined(__VIED_CELL) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
-new file mode 100644
-index 000000000000..dcb58a915aca
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
-@@ -0,0 +1,776 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+/* Data object types on the terminals */
-+#include <ia_css_program_group_data.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include <error_support.h>
-+#include <print_support.h>
-+#include <misc_support.h>
-+#include "ia_css_psys_static_trace.h"
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_terminal_manifest_impl.h"
-+#endif
-+#include "ia_css_terminal_manifest.h"
-+
-+/* We need to refactor those files in order to build in the firmware only
-+   what is needed, switches are put current to workaround compilation problems
-+   in the firmware (for example lack of uint64_t support)
-+   supported in the firmware
-+  */
-+#if !defined(__HIVECC)
-+static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
-+    "IA_CSS_TERMINAL_TYPE_DATA_IN",
-+    "IA_CSS_TERMINAL_TYPE_DATA_OUT",
-+    "IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
-+    /**< Type 1-5 parameter input */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
-+    /**< Type 1-5 parameter output */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
-+    /**< Represent the new type of terminal for
-+     * the "spatial dependent parameters", when params go in
-+     */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
-+    /**< Represent the new type of terminal for
-+     * the "spatial dependent parameters", when params go out
-+     */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
-+    /**< Represent the new type of terminal for
-+     * the explicit slicing, when params go in
-+     */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
-+    /**< Represent the new type of terminal for
-+     * the explicit slicing, when params go out
-+     */
-+    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
-+    /**< State (private data) input */
-+    "IA_CSS_TERMINAL_TYPE_STATE_IN",
-+    /**< State (private data) output */
-+    "IA_CSS_TERMINAL_TYPE_STATE_OUT",
-+    "IA_CSS_TERMINAL_TYPE_PROGRAM",
-+    "IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
-+    "UNDEFINED_TERMINAL_TYPE"};
-+
-+int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
-+    ia_css_data_terminal_manifest_t *manifest,
-+    const unsigned int index)
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
-+
-+    if (manifest != NULL) {
-+        ia_css_kernel_bitmap_t kernel_bitmap =
-+                    ia_css_kernel_bitmap_clear();
-+
-+        kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
-+        verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
-+        verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
-+                manifest, kernel_bitmap) == 0);
-+        retval = 0;
-+    }
-+
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_min_size(
-+    ia_css_data_terminal_manifest_t    *manifest,
-+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_min_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    manifest->min_size[IA_CSS_COL_DIMENSION] =
-+        min_size[IA_CSS_COL_DIMENSION];
-+    manifest->min_size[IA_CSS_ROW_DIMENSION] =
-+        min_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_max_size(
-+    ia_css_data_terminal_manifest_t    *manifest,
-+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_max_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    manifest->max_size[IA_CSS_COL_DIMENSION] =
-+        max_size[IA_CSS_COL_DIMENSION];
-+    manifest->max_size[IA_CSS_ROW_DIMENSION] =
-+        max_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
-+    }
-+    return retval;
-+}
-+#endif
-+
-+int ia_css_data_terminal_manifest_get_min_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_min_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    min_size[IA_CSS_COL_DIMENSION] =
-+        manifest->min_size[IA_CSS_COL_DIMENSION];
-+    min_size[IA_CSS_ROW_DIMENSION] =
-+        manifest->min_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_get_max_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_max_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    max_size[IA_CSS_COL_DIMENSION] =
-+        manifest->max_size[IA_CSS_COL_DIMENSION];
-+    max_size[IA_CSS_ROW_DIMENSION] =
-+        manifest->max_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+#if !defined(__HIVECC)
-+int ia_css_data_terminal_manifest_set_min_fragment_size(
-+    ia_css_data_terminal_manifest_t    *manifest,
-+    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
-+        min_size[IA_CSS_COL_DIMENSION];
-+    manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
-+        min_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_max_fragment_size(
-+    ia_css_data_terminal_manifest_t    *manifest,
-+    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
-+        max_size[IA_CSS_COL_DIMENSION];
-+    manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
-+        max_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
-+    }
-+    return retval;
-+}
-+#endif
-+
-+int ia_css_data_terminal_manifest_get_min_fragment_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    min_size[IA_CSS_COL_DIMENSION] =
-+        manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
-+    min_size[IA_CSS_ROW_DIMENSION] =
-+        manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_get_max_fragment_size(
-+    const ia_css_data_terminal_manifest_t *manifest,
-+    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+    int retval = -1;
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+        "ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+
-+    max_size[IA_CSS_COL_DIMENSION] =
-+        manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
-+    max_size[IA_CSS_ROW_DIMENSION] =
-+        manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
-+    retval = 0;
-+
-+EXIT:
-+    if (NULL == manifest) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+            "ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
-+    }
-+    return retval;
-+}
-+
-+/* We need to refactor those files in order to build in the firmware only
-+   what is needed, switches are put current to workaround compilation problems
-+   in the firmware (for example lack of uint64_t support)
-+   supported in the firmware
-+  */
-+#if !defined(__HIVECC)
-+
-+#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
-+    INFO, "%s:\t%d %d\n", \
-+    (name), \
-+    (var)[IA_CSS_COL_DIMENSION], \
-+    (var)[IA_CSS_ROW_DIMENSION])
-+
-+int ia_css_terminal_manifest_print(
-+    const ia_css_terminal_manifest_t *manifest,
-+    void *fid)
-+{
-+    int retval = -1;
-+    ia_css_terminal_type_t terminal_type =
-+        ia_css_terminal_manifest_get_type(manifest);
-+
-+    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+        "ia_css_terminal_manifest_print(): enter:\n");
-+
-+    verifexit(manifest != NULL);
-+    NOT_USED(fid);
-+    NOT_USED(terminal_type_strings);
-+
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
-+        (int)ia_css_terminal_manifest_get_size(manifest));
-+#ifndef __XTENSA_FW__
-+    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
-+            terminal_type_strings[terminal_type]);
-+#endif
-+    if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+        ia_css_param_terminal_manifest_t *pterminal_manifest =
-+            (ia_css_param_terminal_manifest_t *)manifest;
-+        uint16_t section_count =
-+            pterminal_manifest->param_manifest_section_desc_count;
-+        int    i;
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "sections(manifest) = %d\n", (int)section_count);
-+        for (i = 0; i < section_count; i++) {
-+            const ia_css_param_manifest_section_desc_t *manifest =
-+        ia_css_param_terminal_manifest_get_prm_sct_desc(
-+            pterminal_manifest, i);
-+            verifjmpexit(manifest != NULL);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "mem_type_id = %d\n",
-+                (int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "max_mem_size = %d\n",
-+                (int)manifest->max_mem_size);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "region_id = %d\n",
-+                (int)ia_css_param_manifest_section_desc_get_region_id(manifest));
-+        }
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
-+        ia_css_sliced_param_terminal_manifest_t
-+        *sliced_terminal_manifest =
-+            (ia_css_sliced_param_terminal_manifest_t *)manifest;
-+        uint32_t kernel_id;
-+        uint16_t section_count;
-+        uint16_t section_idx;
-+
-+        kernel_id = sliced_terminal_manifest->kernel_id;
-+        section_count =
-+            sliced_terminal_manifest->sliced_param_section_count;
-+
-+        NOT_USED(kernel_id);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "kernel_id = %d\n", (int)kernel_id);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "section_count = %d\n", (int)section_count);
-+
-+        for (section_idx = 0; section_idx < section_count;
-+            section_idx++) {
-+            ia_css_sliced_param_manifest_section_desc_t
-+                *sliced_param_manifest_section_desc;
-+
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "section %d\n", (int)section_idx);
-+            sliced_param_manifest_section_desc =
-+        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+                sliced_terminal_manifest, section_idx);
-+            verifjmpexit(sliced_param_manifest_section_desc !=
-+                NULL);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "mem_type_id = %d\n",
-+            (int)sliced_param_manifest_section_desc->mem_type_id);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "region_id = %d\n",
-+            (int)sliced_param_manifest_section_desc->region_id);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "max_mem_size = %d\n",
-+            (int)sliced_param_manifest_section_desc->max_mem_size);
-+        }
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
-+        ia_css_program_terminal_manifest_t *program_terminal_manifest =
-+            (ia_css_program_terminal_manifest_t *)manifest;
-+        uint32_t sequencer_info_kernel_id;
-+        uint16_t max_kernel_fragment_sequencer_command_desc;
-+        uint16_t kernel_fragment_sequencer_info_manifest_info_count;
-+        uint16_t seq_info_idx;
-+        uint16_t section_count =
-+            program_terminal_manifest->fragment_param_manifest_section_desc_count;
-+        uint16_t sec_idx;
-+
-+        sequencer_info_kernel_id =
-+            program_terminal_manifest->sequencer_info_kernel_id;
-+        max_kernel_fragment_sequencer_command_desc =
-+            program_terminal_manifest->
-+            max_kernel_fragment_sequencer_command_desc;
-+        kernel_fragment_sequencer_info_manifest_info_count =
-+            program_terminal_manifest->
-+            kernel_fragment_sequencer_info_manifest_info_count;
-+
-+        NOT_USED(sequencer_info_kernel_id);
-+        NOT_USED(max_kernel_fragment_sequencer_command_desc);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "sequencer_info_kernel_id = %d\n",
-+            (int)sequencer_info_kernel_id);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "max_kernel_fragment_sequencer_command_desc = %d\n",
-+            (int)max_kernel_fragment_sequencer_command_desc);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "kernel_fragment_sequencer_info_manifest_info_count = %d\n",
-+            (int)
-+            kernel_fragment_sequencer_info_manifest_info_count);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
-+        for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
-+            const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
-+        ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+            program_terminal_manifest, sec_idx);
-+            NOT_USED(ptmanifest);
-+            verifjmpexit(manifest != NULL);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "mem_type_id = %d\n",
-+                (int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "max_mem_size = %d\n",
-+                (int)ptmanifest->max_mem_size);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "region_id = %d\n",
-+                (int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
-+        }
-+        for (seq_info_idx = 0; seq_info_idx <
-+            kernel_fragment_sequencer_info_manifest_info_count;
-+                seq_info_idx++) {
-+            ia_css_kernel_fragment_sequencer_info_manifest_desc_t
-+                *sequencer_info_manifest_desc;
-+
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "sequencer info %d\n", (int)seq_info_idx);
-+            sequencer_info_manifest_desc =
-+        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
-+                (program_terminal_manifest, seq_info_idx);
-+            verifjmpexit(sequencer_info_manifest_desc != NULL);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "min_fragment_grid_slice_dimension[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "max_fragment_grid_slice_dimension[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_slice_dimension[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_slice_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "min_fragment_grid_slice_count[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "max_fragment_grid_slice_count[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_slice_count[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_slice_count[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_point_decimation_factor[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_point_decimation_factor[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+            min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+            min_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+            max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+            max_fragment_grid_overlay_pixel_topleft_index[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                min_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+                "max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_COL_DIMENSION],
-+                (int)sequencer_info_manifest_desc->
-+                max_fragment_grid_overlay_pixel_dimension[
-+                        IA_CSS_ROW_DIMENSION]);
-+        }
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+        ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
-+            (ia_css_program_control_init_terminal_manifest_t *)manifest;
-+        ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
-+
-+        ia_css_data_terminal_manifest_t *dterminal_manifest =
-+            (ia_css_data_terminal_manifest_t *)manifest;
-+        int i;
-+
-+        NOT_USED(dterminal_manifest);
-+
-+        verifexit(ia_css_kernel_bitmap_print(
-+            ia_css_data_terminal_manifest_get_kernel_bitmap(
-+                dterminal_manifest), fid) == 0);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "formats(manifest) = %04x\n",
-+        (int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+            dterminal_manifest));
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "connection(manifest) = %04x\n",
-+        (int)ia_css_data_terminal_manifest_get_connection_bitmap(
-+            dterminal_manifest));
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "dependent(manifest) = %d\n",
-+            (int)dterminal_manifest->terminal_dependency);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\tmin_size[%d]   = {\n",
-+            IA_CSS_N_DATA_DIMENSION);
-+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "\t\t%4d,\n", dterminal_manifest->min_size[i]);
-+        }
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\t\t%4d }\n", dterminal_manifest->min_size[i]);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
-+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\t\t%4d,\n", dterminal_manifest->max_size[i]);
-+        }
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\t\t%4d }\n", dterminal_manifest->max_size[i]);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\tmin_fragment_size[%d]   = {\n",
-+            IA_CSS_N_DATA_DIMENSION);
-+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "\t\t%4d,\n",
-+                dterminal_manifest->min_fragment_size[i]);
-+        }
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\t\t%4d }\n",
-+            dterminal_manifest->min_fragment_size[i]);
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\tmax_fragment_size[%d]   = {\n",
-+            IA_CSS_N_DATA_DIMENSION);
-+        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+                "\t\t%4d,\n",
-+                dterminal_manifest->max_fragment_size[i]);
-+        }
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+            "\t\t%4d }\n",
-+            dterminal_manifest->max_fragment_size[i]);
-+
-+    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
-+        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
-+
-+        ia_css_spatial_param_terminal_manifest_t *stm =
-+            (ia_css_spatial_param_terminal_manifest_t *)manifest;
-+        ia_css_frame_grid_param_manifest_section_desc_t *sec;
-+        int sec_count =
-+            stm->frame_grid_param_manifest_section_desc_count;
-+        int sec_index;
-+
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
-+            stm->kernel_id);
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
-+            stm->compute_units_p_elem);
-+#ifndef __XTENSA_FW__
-+        PRINT_DIMENSION("min_fragment_grid_dimension",
-+            stm->common_fragment_grid_desc.min_fragment_grid_dimension);
-+        PRINT_DIMENSION("max_fragment_grid_dimension",
-+            stm->common_fragment_grid_desc.max_fragment_grid_dimension);
-+        PRINT_DIMENSION("min_frame_grid_dimension",
-+            stm->frame_grid_desc.min_frame_grid_dimension);
-+        PRINT_DIMENSION("max_frame_grid_dimension",
-+            stm->frame_grid_desc.max_frame_grid_dimension);
-+#endif
-+        for (sec_index = 0; sec_index < sec_count; sec_index++) {
-+            sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+                stm, sec_index);
-+            verifjmpexit(sec != NULL);
-+
-+            IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
-+                sec->mem_type_id);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
-+                sec->region_id);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
-+                sec->elem_size);
-+            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
-+                sec->max_mem_size);
-+        }
-+    } else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
-+        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+            "terminal type can not be pretty printed, not supported\n");
-+    }
-+
-+    retval = 0;
-+EXIT:
-+    if (retval != 0) {
-+        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+            "ia_css_terminal_manifest_print failed (%i)\n",
-+            retval);
-+    }
-+    return retval;
-+}
-+
-+/* Program control init Terminal */
-+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
-+    const ia_css_program_control_init_manifest_program_desc_t *prog)
-+{
-+    assert(prog);
-+    return prog->connect_section_count;
-+}
-+
-+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
-+    const ia_css_program_control_init_manifest_program_desc_t *prog)
-+{
-+    assert(prog);
-+    return prog->load_section_count;
-+}
-+
-+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
-+    const uint16_t nof_programs,
-+    const uint16_t *nof_load_sections,
-+    const uint16_t *nof_connect_sections)
-+{
-+    (void)nof_load_sections; /* might be needed in future */
-+    (void)nof_connect_sections; /* might be needed in future */
-+
-+    return sizeof(ia_css_program_control_init_terminal_manifest_t) +
-+        nof_programs *
-+        sizeof(ia_css_program_control_init_manifest_program_desc_t);
-+}
-+
-+ia_css_program_control_init_manifest_program_desc_t *
-+ia_css_program_control_init_terminal_manifest_get_program_desc(
-+    const ia_css_program_control_init_terminal_manifest_t *terminal,
-+    unsigned int program)
-+{
-+    ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+    assert(terminal != NULL);
-+    assert(program < terminal->program_count);
-+
-+    progs = (ia_css_program_control_init_manifest_program_desc_t *)
-+        ((const char *)terminal + terminal->program_desc_offset);
-+
-+    return &progs[program];
-+}
-+
-+int ia_css_program_control_init_terminal_manifest_init(
-+    ia_css_program_control_init_terminal_manifest_t *terminal,
-+    const uint16_t nof_programs,
-+    const uint16_t *nof_load_sections,
-+    const uint16_t *nof_connect_sections)
-+{
-+    unsigned int i;
-+    ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+    if (terminal == NULL) {
-+        return -EFAULT;
-+    }
-+
-+    terminal->program_count = nof_programs;
-+    terminal->program_desc_offset =
-+        sizeof(ia_css_program_control_init_terminal_manifest_t);
-+
-+    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
-+        terminal, 0);
-+
-+    for (i = 0; i < nof_programs; i++) {
-+        progs[i].load_section_count = nof_load_sections[i];
-+        progs[i].connect_section_count = nof_connect_sections[i];
-+    }
-+    return 0;
-+}
-+
-+void ia_css_program_control_init_terminal_manifest_print(
-+    ia_css_program_control_init_terminal_manifest_t *terminal)
-+{
-+    unsigned int i;
-+
-+    ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
-+        terminal, 0);
-+
-+    assert(progs);
-+    (void)progs;
-+
-+    for (i = 0; i < terminal->program_count; i++) {
-+        IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
-+            "program index: %d, load sec: %d, connect sec: %d\n",
-+            i,
-+            progs[i].load_section_count,
-+            progs[i].connect_section_count);
-+    }
-+}
-+
-+#endif
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
-new file mode 100644
-index 000000000000..85982fb184a4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
-@@ -0,0 +1,19 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_INLINE__
-+#include "ia_css_rbm_impl.h"
-+#endif /* __IA_CSS_RBM_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
-new file mode 100644
-index 000000000000..4a124962fefb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "storage_class.h"
-+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __INLINE_PARAMETERS__ */
-+#include "ia_css_terminal_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
-new file mode 100644
-index 000000000000..d051f1d38657
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "storage_class.h"
-+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __INLINE_PARAMETERS__ */
-+#include "ia_css_terminal_manifest_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
-new file mode 100644
-index 000000000000..8d69d999c9ba
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_sim_storage_class.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifdef __IA_CSS_PSYS_SIM_INLINE__
-+STORAGE_CLASS_INLINE int
-+__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __IA_CSS_PSYS_SIM_INLINE__ */
-+#include "psys_system_global_impl.h"
-+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
-new file mode 100644
-index 000000000000..1cd354e845a1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
-@@ -0,0 +1,210 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __ASSERT_SUPPORT_H
-+#define __ASSERT_SUPPORT_H
-+
-+/* This file provides support for run-time assertions
-+ * and compile-time assertions.
-+ *
-+ * Run-time asstions are provided via the following syntax:
-+ *     assert(condition)
-+ * Run-time assertions are disabled using the NDEBUG flag.
-+ *
-+ * Compile time assertions are provided via the following syntax:
-+ *     COMPILATION_ERROR_IF(condition);
-+ * A compile-time assertion will fail to compile if the condition is false.
-+ * The condition must be constant, such that it can be evaluated
-+ * at compile time.
-+ *
-+ * OP___assert is deprecated.
-+ */
-+
-+#define IA_CSS_ASSERT(expr) assert(expr)
-+
-+#ifdef __KLOCWORK__
-+/* Klocwork does not see that assert will lead to abortion
-+ * as there is no good way to tell this to KW and the code
-+ * should not depend on assert to function (actually the assert
-+ * could be disabled in a release build) it was decided to
-+ * disable the assert for KW scans (by defining NDEBUG)
-+ * see also:
-+ * http://www.klocwork.com/products/documentation/current/
-+ * Tuning_C/C%2B%2B_analysis#Assertions
-+ */
-+#define NDEBUG
-+#endif /* __KLOCWORK__ */
-+
-+/**
-+ * The following macro can help to test the size of a struct at compile
-+ * time rather than at run-time. It does not work for all compilers; see
-+ * below.
-+ *
-+ * Depending on the value of 'condition', the following macro is expanded to:
-+ * - condition==true:
-+ *     an expression containing an array declaration with negative size,
-+ *     usually resulting in a compilation error
-+ * - condition==false:
-+ *     (void) 1; // C statement with no effect
-+ *
-+ * example:
-+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
-+ *			SIZE_OF_HOST_SP_QUEUES_STRUCT);
-+ *
-+ * verify that the macro indeed triggers a compilation error with your compiler:
-+ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
-+ *			(sizeof(struct host_sp_queues)+1) );
-+ *
-+ * Not all compilers will trigger an error with this macro;
-+ * use a search engine to search for BUILD_BUG_ON to find other methods.
-+ */
-+#ifdef __XTENSA_FW__
-+
-+#include "assert_support_xtensa.h"
-+
-+#else
-+
-+#define COMPILATION_ERROR_IF(condition) \
-+((void)sizeof(char[1 - 2*!!(condition)]))
-+
-+#endif
-+/* Compile time assertion */
-+#ifndef CT_ASSERT
-+#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
-+#endif /* CT_ASSERT */
-+
-+#ifdef NDEBUG
-+
-+#define assert(cnd) ((void)0)
-+
-+#else
-+
-+#include "storage_class.h"
-+
-+#if defined(_MSC_VER)
-+#ifdef _KERNEL_MODE
-+/* Windows kernel mode compilation */
-+#include <ntddk.h>
-+#define assert(cnd) ASSERT(cnd)
-+#else
-+/* Windows usermode compilation */
-+#include <assert.h>
-+#endif
-+
-+#elif defined(__XTENSA_FW__)
-+/* assert added in assert_support_xtensa*/
-+#elif defined(__HIVECC)
-+
-+/*
-+ * target: assert disabled
-+ * sched: assert enabled only when SCHED_DEBUG is defined
-+ * unsched: assert enabled
-+ */
-+#if defined(HRT_HW)
-+#define assert(cnd) ((void)0)
-+#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
-+#define assert(cnd) ((void)0)
-+#elif defined(PIPE_GENERATION)
-+#define assert(cnd) ((void)0)
-+#else
-+#include <hive/support.h>
-+#define assert(cnd) OP___csim_assert(cnd)
-+#endif
-+
-+#elif defined(__KERNEL__)
-+#include <linux/bug.h>
-+
-+#ifndef KERNEL_ASSERT_TO_BUG
-+#ifndef KERNEL_ASSERT_TO_BUG_ON
-+#ifndef KERNEL_ASSERT_TO_WARN_ON
-+#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
-+#ifndef KERNEL_ASSERT_UNDEFINED
-+/* Default */
-+#define KERNEL_ASSERT_TO_BUG
-+#endif /*KERNEL_ASSERT_UNDEFINED*/
-+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
-+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
-+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
-+#endif /*KERNEL_ASSERT_TO_BUG*/
-+
-+#ifdef KERNEL_ASSERT_TO_BUG
-+/* TODO: it would be cleaner to use this:
-+ * #define assert(cnd) BUG_ON(cnd)
-+ * but that causes many compiler warnings (==errors) under Android
-+ * because it seems that the BUG_ON() macro is not seen as a check by
-+ * gcc like the BUG() macro is. */
-+#define assert(cnd)							\
-+	do {								\
-+		if (!(cnd)) {						\
-+			BUG();						\
-+		}							\
-+	} while (0)
-+#endif /*KERNEL_ASSERT_TO_BUG*/
-+
-+#ifdef KERNEL_ASSERT_TO_BUG_ON
-+#define assert(cnd) BUG_ON(!(cnd))
-+#endif /*KERNEL_ASSERT_TO_BUG_ON*/
-+
-+#ifdef KERNEL_ASSERT_TO_WARN_ON
-+#define assert(cnd) WARN_ON(!(cnd))
-+#endif /*KERNEL_ASSERT_TO_WARN_ON*/
-+
-+#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
-+#define assert(cnd)							\
-+	do {								\
-+		int not_cnd = !(cnd);					\
-+		WARN_ON(not_cnd);					\
-+		if (not_cnd) {						\
-+			for (;;) {					\
-+			}						\
-+		}							\
-+	} while (0)
-+#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
-+
-+#ifdef KERNEL_ASSERT_UNDEFINED
-+#include KERNEL_ASSERT_DEFINITION_FILESTRING
-+#endif /*KERNEL_ASSERT_UNDEFINED*/
-+
-+#elif defined(__FIST__) || defined(__GNUC__)
-+
-+#include "assert.h"
-+
-+#else /* default is for unknown environments */
-+#define assert(cnd) ((void)0)
-+#endif
-+
-+#endif /* NDEBUG */
-+#ifndef PIPE_GENERATION
-+/* Deprecated OP___assert, this is still used in ~1000 places
-+ * in the code. This will be removed over time.
-+ * The implementation for the pipe generation tool is in see support.isp.h */
-+#define OP___assert(cnd) assert(cnd)
-+
-+#ifdef C_RUN
-+#define compile_time_assert(cond) OP___assert(cond)
-+#else
-+#include "storage_class.h"
-+extern void _compile_time_assert(void);
-+STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
-+{
-+	/* Call undefined function if cond is false */
-+	if (!cond)
-+		_compile_time_assert();
-+}
-+#endif
-+#endif /* PIPE_GENERATION */
-+
-+#endif /* __ASSERT_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
-new file mode 100644
-index 000000000000..88ef0971fed8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
-@@ -0,0 +1,239 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __CPU_MEM_SUPPORT_H
-+#define __CPU_MEM_SUPPORT_H
-+
-+#include "storage_class.h"
-+#include "assert_support.h"
-+#include "type_support.h"
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
-+{
-+	/* memcpy cannot be used in in Windows (function is not allowed),
-+	 * and the safer function memcpy_s is not available on other platforms.
-+	 * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
-+	 * but sub-optimal way.
-+	 */
-+	unsigned int i;
-+
-+	assert(dst != NULL && src != NULL);
-+
-+	if (!(dst != NULL && src != NULL)) {
-+		return NULL;
-+	}
-+	for (i = 0; i < size; i++) {
-+		((char *)dst)[i] = ((char *)src)[i];
-+	}
-+	return dst;
-+}
-+
-+#if defined(__KERNEL__)
-+
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <asm/cacheflush.h>
-+
-+/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
-+ * error checking code added to SDK that uses calls to exit function
-+ */
-+#define exit(a) return
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+	return kmalloc(size, GFP_KERNEL);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+	return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
-+{
-+	/* nothing here yet */
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+	return memset(dst, 0, size); /* available in kernel in linux/string.h */
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+	kfree(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+	/* parameter check here */
-+	if (ptr == NULL)
-+		return;
-+
-+	clflush_cache_range(ptr, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+	/* for now same as flush */
-+	ia_css_cpu_mem_cache_flush(ptr, size);
-+}
-+
-+#elif defined(_MSC_VER)
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stddef.h>
-+
-+extern void *hrt_malloc(size_t bytes, int zero_mem);
-+extern void *hrt_free(void *ptr);
-+extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
-+extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
-+
-+#define malloc(a)	hrt_malloc(a, 1)
-+#define free(a)		hrt_free(a)
-+
-+#define CSS_PAGE_SIZE	(1<<12)
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+	return malloc(size);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+	unsigned int buffer_size = size;
-+
-+	/* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
-+	 * to request system memory. If the number of bytes is equal or bigger
-+	 * than the page size, then the returned address is page aligned,
-+	 * but if it's smaller it's not necessarily page-aligned We agreed
-+	 * with Windows team that we allocate a full page
-+	 * if it's less than page size
-+	*/
-+	if (buffer_size < CSS_PAGE_SIZE)
-+		buffer_size = CSS_PAGE_SIZE;
-+
-+	return ia_css_cpu_mem_alloc(buffer_size);
-+}
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+	return memset(dst, 0, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+	free(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+#ifdef _KERNEL_MODE
-+	hrt_mem_cache_flush(ptr, size);
-+#else
-+	(void)ptr;
-+	(void)size;
-+#endif
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+#ifdef _KERNEL_MODE
-+	hrt_mem_cache_invalidate(ptr, size);
-+#else
-+	(void)ptr;
-+	(void)size;
-+#endif
-+}
-+
-+#else
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stddef.h>
-+/* Needed for the MPROTECT */
-+#include <unistd.h>
-+#include <sys/types.h>
-+
-+/* For host only, not fw */
-+#ifndef __XTENSA_FW__
-+#include <sys/mman.h>
-+#include <malloc.h>
-+#endif
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc(unsigned int size)
-+{
-+	return malloc(size);
-+}
-+
-+#ifdef _SC_PAGE_SIZE
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
-+{
-+	int pagesize;
-+
-+	pagesize = sysconf(_SC_PAGE_SIZE);
-+	return memalign(pagesize, size);
-+}
-+#endif /*_SC_PAGE_SIZE*/
-+
-+STORAGE_CLASS_INLINE void*
-+ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
-+{
-+	return memset(dst, 0, size);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_free(void *ptr)
-+{
-+	free(ptr);
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
-+{
-+	/* not needed in simulation */
-+	(void)ptr;
-+	(void)size;
-+}
-+
-+STORAGE_CLASS_INLINE void
-+ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
-+{
-+	/* not needed in simulation */
-+	(void)ptr;
-+	(void)size;
-+}
-+
-+#endif
-+#endif /* __CPU_MEM_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
-new file mode 100644
-index 000000000000..ede5d846e67e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __ERROR_SUPPORT_H
-+#define __ERROR_SUPPORT_H
-+
-+#if defined(__KERNEL__)
-+#include <linux/errno.h>
-+#else
-+#include <errno.h>
-+#endif
-+#include <assert_support.h>
-+
-+/* OS-independent definition of IA_CSS errno values */
-+/* #define IA_CSS_EINVAL 1 */
-+/* #define IA_CSS_EFAULT 2 */
-+
-+#ifdef __HIVECC
-+#define ERR_EMBEDDED 1
-+#else
-+#define ERR_EMBEDDED 0
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define DECLARE_ERRVAL
-+#else
-+#define DECLARE_ERRVAL \
-+	int _errval = 0;
-+#endif
-+
-+/* Use "owl" in while to prevent compiler warnings in Windows */
-+#define ALWAYS_FALSE ((void)0, 0)
-+
-+#define verifret(cond, error_type) \
-+do {                               \
-+	if (!(cond)) {             \
-+		return error_type; \
-+	}                          \
-+} while (ALWAYS_FALSE)
-+
-+#define verifjmp(cond, error_tag)    \
-+do {                                \
-+	if (!(cond)) {                   \
-+		goto error_tag;             \
-+	}                               \
-+} while (ALWAYS_FALSE)
-+
-+#define verifexit(cond)  \
-+do {                               \
-+	if (!(cond)) {              \
-+		goto EXIT;         \
-+	}                          \
-+} while (ALWAYS_FALSE)
-+
-+#if ERR_EMBEDDED
-+#define verifexitval(cond, error_tag) \
-+do {                               \
-+	assert(cond);		   \
-+} while (ALWAYS_FALSE)
-+#else
-+#define verifexitval(cond, error_tag) \
-+do {                               \
-+	if (!(cond)) {              \
-+		_errval = (error_tag); \
-+		goto EXIT;         \
-+	}                          \
-+} while (ALWAYS_FALSE)
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define haserror(error_tag) (0)
-+#else
-+#define haserror(error_tag) \
-+	(_errval == (error_tag))
-+#endif
-+
-+#if ERR_EMBEDDED
-+#define noerror() (1)
-+#else
-+#define noerror() \
-+	(_errval == 0)
-+#endif
-+
-+#define verifjmpexit(cond)         \
-+do {                               \
-+	if (!(cond)) {             \
-+		goto EXIT;         \
-+	}                          \
-+} while (ALWAYS_FALSE)
-+
-+#define verifjmpexitsetretval(cond, retval)         \
-+do {                               \
-+	if (!(cond)) {              \
-+		retval = -1;	   \
-+		goto EXIT;         \
-+	}                          \
-+} while (ALWAYS_FALSE)
-+
-+#endif /* __ERROR_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
-new file mode 100644
-index 000000000000..6142ecb43058
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __FRAME_SUPPORT_H
-+#define __FRAME_SUPPORT_H
-+
-+#define INTERLEAVED_FRAME_TYPE_NUM_PLANES	1
-+#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES	2
-+#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES	3
-+#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES	4
-+
-+/* genpipe doesn't support B = A in enum definition */
-+#ifndef PIPE_GENERATION
-+
-+enum image_iterator_planes {
-+	IMG_ITER_PLANE_0 = 0,
-+	IMG_ITER_PLANE_1,
-+	IMG_ITER_PLANE_2,
-+	IMG_ITER_PLANE_3,
-+	IMG_ITER_MAX_NUM_PLANES
-+};
-+
-+enum interleaved_frames_types_planes {
-+	INTERLEAVED_FRAME_MAIN_PLANE = 0,
-+	INTERLEAVED_FRAME_NUM_PLANES
-+};
-+
-+enum yuv_semi_planar_frame_types_planes {
-+	YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
-+	YUV_SEMI_PLANAR_FRAME_UV_PLANE,
-+	YUV_SEMI_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+enum yuv_planar_frame_types_planes {
-+	YUV_PLANAR_FRAME_Y_PLANE = 0,
-+	YUV_PLANAR_FRAME_U_PLANE,
-+	YUV_PLANAR_FRAME_V_PLANE,
-+	YUV_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+enum bayer_planar_frame_types_planes {
-+	BAYER_PLANAR_FRAME_GR_PLANE = 0,
-+	BAYER_PLANAR_FRAME_R_PLANE,
-+	BAYER_PLANAR_FRAME_B_PLANE,
-+	BAYER_PLANAR_FRAME_GB_PLANE,
-+	BAYER_PLANAR_FRAME_NUM_PLANES
-+};
-+
-+#endif /* PIPE_GENERATION */
-+#endif	/* __FRAME_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
-new file mode 100644
-index 000000000000..d0de17c1e224
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_BASE_TYPES_H
-+#define __IA_CSS_BASE_TYPES_H
-+
-+#include "type_support.h"
-+
-+#define VIED_VADDRESS_BITS				32
-+
-+#define DEVICE_DESCRIPTOR_ID_BITS			32
-+
-+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
-+	(2 * IA_CSS_UINT32_T_BITS + \
-+	VIED_VADDRESS_BITS + \
-+	2 * IA_CSS_UINT16_T_BITS)
-+
-+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
-+	(2 * IA_CSS_UINT32_T_BITS + \
-+	VIED_VADDRESS_BITS + \
-+	2 * IA_CSS_UINT16_T_BITS)
-+
-+#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
-+#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
-+
-+typedef uint32_t vied_vaddress_t;
-+
-+typedef struct {
-+	uint8_t device_id;
-+	uint8_t instance_id;
-+	uint8_t channel_id;
-+	uint8_t section_id;
-+} device_descriptor_fields_t;
-+
-+typedef union {
-+	device_descriptor_fields_t fields;
-+	uint32_t data;
-+} device_descriptor_id_t;
-+
-+typedef uint16_t ia_css_process_id_t;
-+
-+#endif /* __IA_CSS_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
-new file mode 100644
-index 000000000000..b4a152592471
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
-@@ -0,0 +1,789 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
-+#define __IA_CSS_ISA_PARAMETER_DEFS_H
-+
-+#include "ia_css_isa_parameter_defs_dep.h"
-+
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL			(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL		(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN			(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC			(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS			(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF		(1)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM		(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE		(1)
-+
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE			(0)
-+
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF		(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE		(0)
-+
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_INL				(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC				(1)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS				(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE			(0)
-+
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC			(1)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE			(0)
-+
-+/* ==================== INL specs - START ==================== */
-+/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT						(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0						(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0					(0x204)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1						(0x204)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1					(0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT						(0)
-+
-+/* Spatial Parameter Terminal In does not exist for INL */
-+
-+/* Spatial Parameter Terminal Out does not exist for INL */
-+
-+/* Sliced Parameter Terminal In does not exist for INL */
-+
-+/* Sliced Parameter Terminal Out does not exist for INL */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT							(0)
-+/* ==================== INL specs - END ==================== */
-+
-+/* ==================== BLC_GLOBAL specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0					(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0					(0xC08)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1					(0x20)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1					(0xC0C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT					(0)
-+
-+/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(0)
-+/* ==================== BLC_GLOBAL specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT				(0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT			(4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(8)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT				(0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT			(4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT				(0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT			(8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4	(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5	(0x380)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6	(0x680)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7		(0x80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7	(0x980)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7		(0x100)
-+
-+/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+/* ==================== PCLN specs - START ==================== */
-+/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT						(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0						(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0					(0x820)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1						(0x820)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1					(0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT						(0)
-+
-+/* Spatial Parameter Terminal In does not exist for PCLN */
-+
-+/* Spatial Parameter Terminal Out does not exist for PCLN */
-+
-+/* Sliced Parameter Terminal In does not exist for PCLN */
-+
-+/* Sliced Parameter Terminal Out does not exist for PCLN */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT							(0)
-+/* ==================== PCLN specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
-+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+/* ==================== BNR specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
-+/* ==================== BNR specs - END ==================== */
-+
-+/* ==================== ISA_DM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
-+
-+/* ==================== ISA_DM specs - END ==================== */
-+
-+/* ==================== IDS specs - START ==================== */
-+/* IDS is HW revision dependent */
-+/* ==================== IDS specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AWB specs - START ==================== */
-+/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
-+/* ==================== 3A_STAT_AWB specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AF specs - START ==================== */
-+/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0x88)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x40C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT					(0)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT				(2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM			(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE		(32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH		(16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH		(32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT		(16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT		(32)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0			(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0			(0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1			(0x100)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1			(0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1		(0x200)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0xC)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x400)
-+/* ==================== 3A_STAT_AF specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0				(0x7C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0				(0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT					(0)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
-+
-+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(0)
-+/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
-+
-+/* ==================== 3A_STAT_AE specs - START ==================== */
-+/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
-+   found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT						(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x18C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0				(0x2000)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0				(0x200)
-+
-+/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
-+
-+/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
-+
-+/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
-+
-+/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT						(2)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x180)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1					(0x180)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1					(0x0)
-+/* ==================== 3A_STAT_AE specs - END ==================== */
-+
-+/* TODO: REMOVE BACKWARD COMPATIBILITY */
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
-+
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
-+#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
-+/* END OF TODO */
-+
-+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
-new file mode 100644
-index 000000000000..4310e41192f4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
-@@ -0,0 +1,580 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
-+#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
-+
-+#include "ia_css_ff_awb_statistics_param_defs.h"
-+
-+/*
-+ * TODO: Adapt this file for IPU6!
-+ */
-+
-+/* ==================== DPC_V2 specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2			(1)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2			(1)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2			(1)
-+
-+/* ==================== PDAF specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF				(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF			(1)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF				(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF				(0)
-+
-+/* ==================== DPC_PEXT specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT			(0)
-+
-+/* ==================== SIS specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS			(0)
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS			(0)
-+
-+/* ==================== STREAM_CROP specific properties ==================== */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP			(0)
-+
-+/* ========== PIFCONV_A_INPUT specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT		(0)
-+
-+/* ========== PIFCONV_B_INPUT specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT		(0)
-+
-+/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
-+
-+/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED		(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED		(0)
-+
-+/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
-+#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS			(0)
-+#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS			(0)
-+
-+/* ==================== IDS specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT						(5)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0					(0x0C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x00)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1					(0x10)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1					(0x14)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2					(0x18)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2					(0x50)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3					(0x20C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3					(0x68)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4					(0x24)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4					(0x274)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT						(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0						(0x08)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x0C)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT					(0)
-+
-+/* Spatial Parameter Terminal In does not exist for IDS */
-+
-+/* Spatial Parameter Terminal Out does not exist for IDS */
-+
-+/* Sliced Parameter Terminal In does not exist for IDS */
-+
-+/* Sliced Parameter Terminal Out does not exist for IDS */
-+
-+/* ==================== IDS specs - END ==================== */
-+
-+/* ==================== DPC specs used in PSYS - START ==================== */
-+/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT						(5)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4					(0x8)		/* AF Statistics pixels */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4					(0x34D4)	/* AF Statistics pixels */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT						(4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(0)
-+
-+/* Spatial Parameter Terminal In does not exist for DPC */
-+
-+/* Spatial Parameter Terminal Out does not exist for DPC */
-+
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT					(2)
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x3380)	/* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* DPC static LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x1000)	/* DPC static LUT */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x0)		/* DPC static LUT */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x1000)	/* DPC static LUT */
-+
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(2)
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x34CC)	/* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* AF LUT limit */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x800)		/* AF Pixels metadata */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x2000)	/* AF Pixels metadata */
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x800)		/* AF Pixels metadata */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT						(3)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0						(0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x337C) /* DPC Control */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1						(0x1B8)		/* CfgUnitMapping */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x31C0)	/* CfgUnitMapping */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2						(0x100)		/* AF pixels grid cfg */
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3388)	/* AF pixels grid cfg */
-+
-+/* ==================== DPC specs - END ==================== */
-+
-+/* ==================== DPC_PEXT specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT						(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0					(0x8)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0					(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1					(0x8)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1					(0xC)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT					(0)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT						(0)
-+/* ==================== DPC_PEXT specs - END ==================== */
-+
-+/* TODO check ae values */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
-+
-+/* todo check gddpc_pext values when enabling this terminal */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
-+
-+/* ==================== PAF specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT							(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0						(0x18)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0						(0x0)
-+
-+/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1						(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1						(-0xB0)
-+
-+#define	IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT						(0)
-+/* Number of PAF blocks = 12*16 PAF blocks
-+ * Max number of phase steps in each block: 11 steps (0-10)
-+ * 	for step 10, only the LSB values are valid and MSB 2bytes are reserved
-+ * 	Hence for each block height, we will have to read in 12 steps
-+ * Size of each phase value =  2 bytes
-+ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
-+ * */
-+
-+/* Spatial Parameter Terminal In does not exist for PAF*/
-+
-+/* Spatial Parameter Terminal Out for PAF*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT					(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM				(1)	/**/
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0				(0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0				(0x18)	/*Size of each phase output in a grid*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0			(0x200)	/*FF register offset from kernel base*/
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0			(0x180)	/*Determines the next FF location*/
-+
-+/* Sliced Parameter Terminal In does not exist for PAF*/
-+
-+/* Sliced Parameter Terminal Out does not exist for PAF*/
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT							(0)
-+/* ==================== PAF specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
-+/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(2)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
-+/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x8)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
-+/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
-+
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x400)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x20)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
-+
-+/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
-+
-+/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT			IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
-+
-+/* ==================== LCA specs -- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT			(6)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0	(0xc) /* 0x0 to 0xb */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1	(0xcc) /* 0x10 to 0xdb */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1	(0x10)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2	(0x510) /* 0x100 to 0x60f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2	(0x100)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3	(0x510) /* 0x6c0 to 0xbcf */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3	(0x6c0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4	(0x510) /* 0xc80 to 0x118f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4	(0xc80)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5	(0x510) /* 0x1240 to 0x174f */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5	(0x1240)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT		(0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0		(4) /* 0x1800 to 0x1803*/
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x1800)
-+/* ==================== LCA specs -- END ==================== */
-+
-+/* ==================== WBA_WBA specs - START ==================== */
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
-+#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
-+/* ==================== WBA_WBA specs - END ==================== */
-+
-+/* leave those for now to pass isys compilation */
-+/* ==================== SIS_WB_SIS specs - START ==================== */
-+/* This device is similar to the WBA device in the PSA (with respect to registermap) */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
-+
-+/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
-+
-+/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
-+/* ==================== SIS_WB_SIS specs - END ==================== */
-+
-+/* ==================== SIS_SIS specs - START ==================== */
-+/* TODO: The SIS device does not yet expose the functionality for cropping */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
-+
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
-+
-+/* Spatial Parameter Terminal In does not exist for SIS_SIS */
-+
-+/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
-+/* ==================== SIS_SIS specs - END ==================== */
-+
-+/* ==================== STREAM_CROP specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT	(0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x4)
-+/* ==================== STREAM_CROP specs - END ==================== */
-+
-+/* ==================== BNR specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
-+/* ==================== BNR specs - END ==================== */
-+
-+/* ==================== ISA_DM specs - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
-+
-+/* ==================== ISA_DM specs - END ==================== */
-+
-+/* ====================  specs PIFCONV_SIS_A- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0		(0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT		(0)
-+/* ====================  specs PIFCONV_SIS_A- END ==================== */
-+
-+/* ====================  specs PIFCONV_SIS_B- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0		(0x12)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT		(0)
-+/* ====================  specs PIFCONV_SIS_B- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0		(0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT		(0)
-+/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0		(0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT		(0)
-+/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0		(0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT		(0)
-+/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0		(0xc)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT		(0)
-+/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
-+
-+/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT			(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0		(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x0)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT		(0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT			(2)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0		(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1		(0x4)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1		(0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
-+/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
-+
-+/* ==================== PIXEL FORMATTER specs - START ==================== */
-+/* The base address of the Pixel Formatter device is 0x271000 */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0	(0x4)
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT		(0x0)
-+
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0		(0x8)
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
-+											and base address of size register in the Pixel Formatter device is 0x24. */
-+
-+/* TODO: REMOVE BACKWARD COMPATIBILITY */
-+/* NOT USED defs - needed for legacy*/
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
-+#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
-+#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
-+#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
-+/* END OF TODO */
-+
-+#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
-new file mode 100644
-index 000000000000..8670a1c80d4c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
-@@ -0,0 +1,262 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_H
-+#define __IA_CSS_KERNEL_BITMAP_H
-+
-+/*! \file */
-+
-+/** @file ia_css_kernel_bitmap.h
-+ *
-+ * The types and operations to make logic decisions given kernel bitmaps
-+ * "ia_css_kernel_bitmap_t" can be larger than native types
-+ */
-+
-+#include <type_support.h>
-+#include "vied_nci_psys_resource_model.h"
-+#include "ia_css_kernel_bitmap_storage_class.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
-+#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
-+	(sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
-+#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
-+	((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
-+
-+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
-+ * problems in the compiler.
-+ */
-+typedef struct {
-+	IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
-+} ia_css_kernel_bitmap_elems_t;
-+
-+/** Users should make no assumption about the actual type of
-+ * ia_css_kernel_bitmap_t.
-+ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
-+ * case they erroneously assume that this type is uint64_t and they
-+ * cannot change their implementation.
-+ */
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
-+#else
-+typedef uint64_t ia_css_kernel_bitmap_t;
-+#if IA_CSS_KERNEL_BITMAP_BITS > 64
-+#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
-+	with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+#endif
-+#endif
-+
-+/*! Print the bits of a kernel bitmap
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_kernel_bitmap_print(
-+	const ia_css_kernel_bitmap_t	bitmap,
-+	void				*fid);
-+
-+/*! Create an empty kernel bitmap
-+
-+ @return bitmap = 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
-+
-+/*! Creates the complement of a kernel bitmap
-+ * @param	[in] bitmap kernel bitmap
-+ * @return ~bitmap
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
-+	const ia_css_kernel_bitmap_t bitmap);
-+
-+/*! Create the union of two kernel bitmaps
-+
-+ @param	[in] bitmap0					kernel bitmap 0
-+ @param	[in] bitmap1					kernel bitmap 1
-+
-+ @return bitmap0 | bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1);
-+
-+/*! Create the intersection of two kernel bitmaps
-+
-+ @param	[in] bitmap0					kernel bitmap 0
-+ @param	[in] bitmap1					kernel bitmap 1
-+
-+ @return bitmap0 & bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1);
-+
-+/*! Check if the kernel bitmaps is empty
-+
-+ @param	[in] bitmap					kernel bitmap
-+
-+ @return bitmap == 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_empty(
-+	const ia_css_kernel_bitmap_t			bitmap);
-+
-+/*! Check if the intersection of two kernel bitmaps is empty
-+
-+ @param	[in] bitmap0					kernel bitmap 0
-+ @param	[in] bitmap1					kernel bitmap 1
-+
-+ @return (bitmap0 & bitmap1) == 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_intersection_empty(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1);
-+
-+/*! Check if the second kernel bitmap is a subset of the first (or equal)
-+
-+ @param	[in] bitmap0					kernel bitmap 0
-+ @param	[in] bitmap1					kernel bitmap 1
-+
-+ Note: An empty set is always a subset, this function
-+ returns true if bitmap 1 is empty
-+
-+ @return (bitmap0 & bitmap1) == bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_subset(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1);
-+
-+/*! Check if the kernel bitmaps are equal
-+
-+ @param	[in] bitmap0					kernel bitmap 0
-+ @param	[in] bitmap1					kernel bitmap 1
-+
-+ @return bitmap0 == bitmap1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_equal(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1);
-+
-+/*! Right shift kernel bitmap
-+
-+ @param	[in] bitmap					kernel bitmap 0
-+
-+ @return bitmap >> 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
-+	const ia_css_kernel_bitmap_t			bitmap);
-+
-+/*! Check if the kernel bitmaps contains only a single element
-+
-+ @param	[in] bitmap					kernel bitmap
-+
-+ @return weight(bitmap) == 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+bool ia_css_is_kernel_bitmap_onehot(
-+	const ia_css_kernel_bitmap_t			bitmap);
-+
-+/*! Checks whether a specific kernel bit is set
-+ * @return bitmap[index] == 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+int ia_css_is_kernel_bitmap_set(
-+	const ia_css_kernel_bitmap_t	bitmap,
-+	const unsigned int		index);
-+
-+/*! Create the union of a kernel bitmap with a onehot bitmap
-+ * with a bit set at index
-+
-+ @return bitmap[index] |= 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
-+	const ia_css_kernel_bitmap_t			bitmap,
-+	const unsigned int						index);
-+
-+/*! Set elem_index-th 32-bit element of the bitmap
-+ * to elem_value
-+
-+ @return updated bitmap
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
-+	ia_css_kernel_bitmap_t			bitmap,
-+	const unsigned int			elem_index,
-+	const uint32_t				elem_value);
-+
-+/*! Creates kernel bitmap using a uint64 value.
-+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
-+	const uint64_t	value);
-+
-+/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
-+ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
-+ *  are returned.
-+ *  @return uint64_t representation of value
-+*/
-+extern uint64_t ia_css_kernel_bitmap_to_uint64(
-+	const ia_css_kernel_bitmap_t value);
-+
-+/*! Creates a kernel bitmap with the bit at index 'index' removed.
-+ * @return ~(1 << index) & bitmap
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
-+	const ia_css_kernel_bitmap_t	bitmap,
-+	const unsigned int		index);
-+
-+/*! Set a previously clear field of a kernel bitmap at index
-+
-+ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
-+	const ia_css_kernel_bitmap_t			bitmap,
-+	const unsigned int						index);
-+
-+/*! Create a onehot kernel bitmap with a bit set at index
-+
-+ @return bitmap[index] = 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
-+	const unsigned int						index);
-+
-+/*! Create a random bitmap
-+
-+ @return bitmap[index] = 1
-+ */
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
-+
-+/*! @} */
-+
-+#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#include "ia_css_kernel_bitmap_impl.h"
-+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
-new file mode 100644
-index 000000000000..b0b9ea9c0add
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
-@@ -0,0 +1,340 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
-+#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
-+
-+#include <ia_css_kernel_bitmap.h>
-+#include <type_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include "math_support.h"
-+#include "ia_css_psys_kernel_trace.h"
-+#include "ia_css_kernel_bitmap_storage_class.h"
-+
-+STORAGE_CLASS_INLINE
-+int ia_css_kernel_bitmap_compute_weight(
-+	const ia_css_kernel_bitmap_t			bitmap)
-+{
-+	ia_css_kernel_bitmap_t	loc_bitmap;
-+	int	weight = 0;
-+	int	i;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_compute_weight(): enter:\n");
-+
-+	loc_bitmap = bitmap;
-+
-+	/* In fact; do not need the iterator "i" */
-+	for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
-+		    !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
-+		weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
-+		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
-+	}
-+
-+	return weight;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_intersection_empty(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1)
-+{
-+	ia_css_kernel_bitmap_t intersection;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
-+
-+	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
-+	return ia_css_is_kernel_bitmap_empty(intersection);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_empty(
-+	const ia_css_kernel_bitmap_t			bitmap)
-+{
-+	unsigned int i;
-+	bool is_empty = true;
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_is_kernel_bitmap_empty(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		is_empty &= bitmap.data[i] == 0;
-+	}
-+#else
-+	NOT_USED(i);
-+	is_empty = (bitmap == 0);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return is_empty;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_equal(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1)
-+{
-+	unsigned int i;
-+	bool is_equal = true;
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_is_kernel_bitmap_equal(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
-+	}
-+#else
-+	NOT_USED(i);
-+	is_equal = (bitmap0 == bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return is_equal;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_onehot(
-+	const ia_css_kernel_bitmap_t			bitmap)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_is_kernel_bitmap_onehot(): enter:\n");
-+	return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+bool ia_css_is_kernel_bitmap_subset(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1)
-+{
-+	ia_css_kernel_bitmap_t intersection;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_is_kernel_bitmap_subset(): enter:\n");
-+
-+	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
-+	return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
-+{
-+	unsigned int i;
-+	ia_css_kernel_bitmap_t bitmap = {{0} };
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_clear(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		bitmap.data[i] = 0;
-+	}
-+#else
-+	NOT_USED(i);
-+	bitmap = 0;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return bitmap;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
-+	const ia_css_kernel_bitmap_t bitmap)
-+{
-+	unsigned int i;
-+	ia_css_kernel_bitmap_t result = {{0} };
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_complement(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		result.data[i] = ~bitmap.data[i];
-+	}
-+#else
-+	NOT_USED(i);
-+	result = ~bitmap;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1)
-+{
-+	unsigned int i;
-+	ia_css_kernel_bitmap_t result = {{0} };
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_union(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
-+	}
-+#else
-+	NOT_USED(i);
-+	result = (bitmap0 | bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
-+	const ia_css_kernel_bitmap_t			bitmap0,
-+	const ia_css_kernel_bitmap_t			bitmap1)
-+{
-+	unsigned int i;
-+	ia_css_kernel_bitmap_t result = {{0} };
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_intersection(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
-+	}
-+#else
-+	NOT_USED(i);
-+	result = (bitmap0 & bitmap1);
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return result;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
-+	const ia_css_kernel_bitmap_t			bitmap,
-+	const unsigned int						index)
-+{
-+	ia_css_kernel_bitmap_t	bit_mask;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_set(): enter:\n");
-+
-+	bit_mask = ia_css_kernel_bit_mask(index);
-+	return ia_css_kernel_bitmap_union(bitmap, bit_mask);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
-+	const ia_css_kernel_bitmap_t	bitmap,
-+	const unsigned int		index)
-+{
-+	ia_css_kernel_bitmap_t result;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_unset(): enter:\n");
-+
-+	result = ia_css_kernel_bit_mask(index);
-+	result = ia_css_kernel_bitmap_complement(result);
-+	return ia_css_kernel_bitmap_intersection(bitmap, result);
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
-+	const ia_css_kernel_bitmap_t			bitmap,
-+	const unsigned int						index)
-+{
-+	ia_css_kernel_bitmap_t	ret;
-+	ia_css_kernel_bitmap_t	bit_mask;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_set_unique(): enter:\n");
-+
-+	ret = ia_css_kernel_bitmap_clear();
-+	bit_mask = ia_css_kernel_bit_mask(index);
-+
-+	if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
-+			&& !ia_css_is_kernel_bitmap_empty(bit_mask)) {
-+		ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
-+	}
-+	return ret;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
-+	const unsigned int						index)
-+{
-+	unsigned int elem_index;
-+	unsigned int elem_bit_index;
-+	ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
-+
-+	/* Assert disabled for staging, because some PGs do not satisfy this condition */
-+	/* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bit_mask(): enter:\n");
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
-+		elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+		elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+		assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
-+
-+		bit_mask.data[elem_index] = 1 << elem_bit_index;
-+	}
-+#else
-+	NOT_USED(elem_index);
-+	NOT_USED(elem_bit_index);
-+	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
-+		bit_mask = (ia_css_kernel_bitmap_t)1 << index;
-+	}
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return bit_mask;
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+int ia_css_is_kernel_bitmap_set(
-+	const ia_css_kernel_bitmap_t	bitmap,
-+	const unsigned int				index)
-+{
-+	unsigned int elem_index;
-+	unsigned int elem_bit_index;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_is_kernel_bitmap_set(): enter:\n");
-+
-+	assert(index < IA_CSS_KERNEL_BITMAP_BITS);
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+	elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+	assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
-+	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
-+#else
-+	NOT_USED(elem_index);
-+	NOT_USED(elem_bit_index);
-+	return (((bitmap >> index) & 0x1) == 1);
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+}
-+
-+IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
-+	const ia_css_kernel_bitmap_t			bitmap)
-+{
-+	int i;
-+	unsigned int lsb_current_elem = 0;
-+	unsigned int lsb_previous_elem = 0;
-+	ia_css_kernel_bitmap_t loc_bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		       "ia_css_kernel_bitmap_shift(): enter:\n");
-+
-+	loc_bitmap = bitmap;
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
-+		lsb_current_elem = bitmap.data[i] & 0x01;
-+		loc_bitmap.data[i] >>= 1;
-+		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
-+		lsb_previous_elem = lsb_current_elem;
-+	}
-+#else
-+	NOT_USED(i);
-+	NOT_USED(lsb_current_elem);
-+	NOT_USED(lsb_previous_elem);
-+	loc_bitmap >>= 1;
-+#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
-+	return loc_bitmap;
-+}
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
-new file mode 100644
-index 000000000000..8b7cd391bd1b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
-new file mode 100644
-index 000000000000..bf02f187c1b4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
-@@ -0,0 +1,88 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
-+#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
-+
-+#include "type_support.h"
-+
-+#define KERNEL_USER_PARAM_S_PADDING 4
-+
-+#define SIZE_OF_KERNEL_USER_PARAM_S ( \
-+	  (1 * IA_CSS_UINT64_T_BITS) \
-+	+ (1 * IA_CSS_UINT32_T_BITS) \
-+	+ (4 * IA_CSS_UINT16_T_BITS) \
-+	+ (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
-+
-+/** \brief A kernel user parameter object.
-+ * Always use ia_css_kernel_user_param_get_descriptor_size or
-+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
-+ * appropriate size for the kernel user parameter object.
-+ *
-+ * Use an init function like ia_css_kernel_user_param_init to initialize
-+ * the kernel user parameter object.
-+ *
-+ * Never instantiate this struct in a different way.
-+ */
-+typedef struct ia_css_kernel_user_param_s {
-+	/* Parameter buffer handle attached to the terminal */
-+	union {
-+		void *p;
-+		uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
-+	} payload_buffer;
-+	/* Buffer size */
-+	uint32_t payload_buffer_size;
-+	/* Points to the variable array of ia_css_kernel_user_param_desc_s */
-+	uint16_t kernel_desc_offset;
-+	/* Number of kernels in program group */
-+	uint16_t kernel_count;
-+	/* Number of fragments in frame */
-+	uint16_t fragment_count;
-+	/* Fragment stride in bytes */
-+	uint16_t fragment_stride;
-+	/* padding */
-+	uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
-+} ia_css_kernel_user_param_t;
-+
-+typedef struct ia_css_kernel_user_param_kernel_desc_s {
-+	/* kernel identifier */
-+	uint32_t kernel_id;
-+	/* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
-+	uint16_t cfg_desc_offset;
-+	/* Number of configurations for this kernel */
-+	uint16_t cfg_desc_count;
-+} ia_css_kernel_user_param_kernel_desc_t;
-+
-+typedef struct ia_css_kernel_user_param_cfg_desc_s {
-+	/* Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/* Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+} ia_css_kernel_user_param_cfg_desc_t;
-+
-+/*!
-+ * Construction information to construct a kernel user param object.
-+ * This type is only used for ia_css_kernel_user_param_init and
-+ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
-+ */
-+typedef struct ia_css_kernel_user_param_kernel_info_s {
-+	uint32_t kernel_id;
-+	uint16_t section_count;
-+	uint32_t *section_sizes; /**< Array of size section_count. Each element
-+		encode the size in bytes or a kernel config (section). */
-+} ia_css_kernel_user_param_kernel_info_t;
-+
-+#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
-new file mode 100644
-index 000000000000..6716c1ec30f2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
-+#define __IA_CSS_PARAM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __INLINE_PARAMETERS__
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
-new file mode 100644
-index 000000000000..a12da5873188
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
-@@ -0,0 +1,449 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_H
-+
-+#include "ia_css_psys_data_storage_class.h"
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_data.h
-+ *
-+ * Define the data objects that are passed to the process groups
-+ * i.e. frames and matrices with their sub-structures
-+ *
-+ * The data objects are separate from the process group terminal,
-+ * although they are stored by value rather than by reference and
-+ * make the process group terminal dependendent on its definition
-+ *
-+ * This frame definition overloads the current CSS frame definition
-+ * they are the same object, just a slightly different implementation
-+ */
-+
-+#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
-+
-+#include <type_support.h>
-+#include "ia_css_program_group_data_defs.h"	/* ia_css_frame_format_type */
-+
-+#include "ia_css_terminal_defs.h"
-+
-+/**
-+ * Frame buffer state used for sequencing
-+ * (see FAS 5.5.3)
-+ *
-+ * The buffer can be in DDR or a handle to a stream
-+ */
-+typedef enum ia_css_buffer_state {
-+	IA_CSS_BUFFER_NULL = 0,
-+	IA_CSS_BUFFER_UNDEFINED,
-+	IA_CSS_BUFFER_EMPTY,
-+	IA_CSS_BUFFER_NONEMPTY,
-+	IA_CSS_BUFFER_FULL,
-+	IA_CSS_N_BUFFER_STATES
-+} ia_css_buffer_state_t;
-+
-+#define IA_CSS_BUFFER_STATE_IN_BITS	32
-+
-+/**
-+ * Pointer state used to signal MMU invalidation
-+ */
-+typedef enum ia_css_pointer_state {
-+	IA_CSS_POINTER_INVALID = 0,
-+	IA_CSS_POINTER_VALID,
-+	IA_CSS_N_POINTER_STATES
-+} ia_css_pointer_state_t;
-+
-+#define IA_CSS_POINTER_STATE_IN_BITS	32
-+
-+/**
-+ * Access direction needed to select the access port
-+ *
-+ * @note No known use of any literal in this
-+ * enumeration.
-+ */
-+typedef enum ia_css_access_type {
-+	IA_CSS_ACCESS_LOCKED = 0,
-+	IA_CSS_ACCESS_READ,
-+	IA_CSS_ACCESS_WRITE,
-+	IA_CSS_ACCESS_MODIFY,
-+	IA_CSS_N_ACCESS_TYPES
-+} ia_css_access_type_t;
-+
-+#define IA_CSS_ACCESS_TYPE_IN_BITS	32
-+
-+/**
-+ * Access attribute needed to select the access port
-+ *	- public : snooped
-+ *	- private: non-snooped
-+ * Naming is a bit awkward, lack of inspiration
-+ *
-+ * @note No known use of any literal in this
-+ * enumeration.
-+ */
-+typedef enum ia_css_access_scope {
-+	IA_CSS_ACCESS_PRIVATE = 0,
-+	IA_CSS_ACCESS_PUBLIC,
-+	IA_CSS_N_ACCESS_SCOPES
-+} ia_css_access_scopes_t;
-+
-+#define IA_CSS_ACCESS_SCOPES_IN_BITS	32
-+
-+#define IA_CSS_N_FRAME_PLANES			6
-+
-+#define IA_CSS_FRAME_FORMAT_BITMAP_BITS	64
-+
-+typedef uint64_t ia_css_frame_format_bitmap_t;
-+
-+typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
-+typedef struct ia_css_param_frame_s		ia_css_param_frame_t;
-+
-+typedef struct ia_css_frame_descriptor_s	ia_css_frame_descriptor_t;
-+typedef struct ia_css_frame_s				ia_css_frame_t;
-+typedef struct ia_css_fragment_descriptor_s	ia_css_fragment_descriptor_t;
-+
-+typedef struct ia_css_stream_s			ia_css_stream_t;
-+
-+#define	N_UINT64_IN_STREAM_STRUCT			1
-+
-+#define	IA_CSS_STREAM_STRUCT_BITS \
-+	(N_UINT64_IN_STREAM_STRUCT * 64)
-+
-+struct ia_css_stream_s {
-+	uint64_t dummy;
-+};
-+
-+struct ia_css_param_frame_descriptor_s {
-+	uint16_t	size;		/**< Size of the descriptor */
-+	uint32_t	buffer_count;	/**< Number of parameter buffers */
-+};
-+
-+struct ia_css_param_frame_s {
-+	/** Base virtual addresses to parameters in subsystem virtual
-+	 * memory space
-+	 */
-+	vied_vaddress_t *data;
-+};
-+
-+#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
-+
-+#define N_UINT32_IN_FRAME_DESC_STRUCT \
-+	(1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
-+#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
-+#define N_UINT8_IN_FRAME_DESC_STRUCT 4
-+#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
-+
-+#define	IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
-+	(IA_CSS_FRAME_FORMAT_TYPE_BITS \
-+	+ (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
-+	+ (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
-+	+ (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
-+	+ (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
-+
-+/**
-+ * Structure defining the frame (size and access) properties for
-+ * inbuild types only.
-+ *
-+ * The inbuild types like FourCC, MIPI and CSS private types are supported
-+ * by FW all other types are custom types which interpretation must be encoded
-+ * on the buffer itself or known by the source and sink
-+ */
-+struct ia_css_frame_descriptor_s {
-+	/** Indicates if this is a generic type or inbuild with
-+	  * variable size descriptor.
-+	  */
-+	ia_css_frame_format_type_t frame_format_type;
-+	/** Number of data planes (pointers) */
-+	uint32_t plane_count;
-+	/** Plane offsets accounting for fragments */
-+	uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
-+	/** Physical size aspects */
-+	uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
-+	/** Tile status buffer offsets for DEC400 compression */
-+	uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
-+	/** Logical dimensions */
-+	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
-+	/** Size of this descriptor */
-+	uint16_t size;
-+	/** Bits per pixel (meaningful bits, AKA precision) */
-+	uint8_t bpp;
-+	/** Bits per element (bits required for storage of the pixel in memory) */
-+	uint8_t bpe;
-+	/** 1 if terminal uses compressed datatype, 0 otherwise */
-+	uint8_t is_compressed;
-+	/** 1 if pixel data is signed, 0 otherwise */
-+	uint8_t is_signed;
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
-+};
-+
-+#define	N_UINT32_IN_FRAME_STRUCT		2
-+#define	N_PADDING_UINT8_IN_FRAME_STRUCT	4
-+
-+#define	IA_CSS_FRAME_STRUCT_BITS \
-+	(IA_CSS_BUFFER_STATE_IN_BITS \
-+	+ IA_CSS_ACCESS_TYPE_IN_BITS \
-+	+ IA_CSS_POINTER_STATE_IN_BITS \
-+	+ IA_CSS_ACCESS_SCOPES_IN_BITS \
-+	+ VIED_VADDRESS_BITS \
-+	+ (N_UINT32_IN_FRAME_STRUCT * 32) \
-+	+ (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
-+
-+/**
-+ * Main frame structure holding the main store and auxilary access properties
-+ * the "pointer_state" and "access_scope" should be encoded on the
-+ * "vied_vaddress_t" type
-+ *
-+ * @note A number of fields in this structure are either no longer
-+ * used, or their use is trivialized, in the current code base.  This is
-+ * due to the Persistent Program Group (PPG) concept which separated the
-+ * attatchment of frame buffers into a separate structure, the buffer set.
-+ * @par Set all unused fields to zero, unless otherwise noted.
-+ * @see ia_css_buffer_set_s
-+ */
-+struct ia_css_frame_s {
-+	/** State of the frame for purpose of sequencing.
-+	 *
-+	 *  @note This field is apparently a leftover from the pre-PPG
-+	 *  type of program group and no longer has any real use.
-+	 *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
-+	 *  IA_CSS_BUFFER_EMPTY for output frames */
-+	ia_css_buffer_state_t buffer_state;
-+	/** Access direction, may change when buffer state changes.
-+	 *
-+	 *  @note Cannot find any use of this. */
-+	ia_css_access_type_t access_type;
-+	/** State of the pointer for purpose of embedded MMU coherency
-+	 * @note No known non-trivial use of the field.
-+	 */
-+	ia_css_pointer_state_t pointer_state;
-+	/** Access to the pointer for purpose of host cache coherency
-+	*  @note Cannot find any use of this. */
-+	ia_css_access_scopes_t access_scope;
-+	/** Base virtual address to data in IPU subsystem virtual memory space.
-+	 *  @note No longer used for PPG's */
-+	vied_vaddress_t data;
-+	/** Index into the array of buffer addresses within the buffer set structure
-+	 *  which is sent separately. The value at that location replaces the
-+	 *  "data" field in this structure.  */
-+	uint32_t data_index;
-+	/** Total buffer allocation size in bytes */
-+	uint32_t data_bytes;
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
-+};
-+
-+#define	N_UINT16_IN_FRAGMENT_DESC_STRUCT	(3 * IA_CSS_N_DATA_DIMENSION)
-+#define	N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
-+
-+#define	IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
-+	((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
-+	+ (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
-+
-+/**
-+ * Structure defining the fragment (size and access) properties.
-+ *
-+ * All cropping and padding effects are described by the difference between
-+ * the frame size and its location and the fragment size(s) and location(s)
-+ */
-+struct ia_css_fragment_descriptor_s {
-+	/** Logical dimensions of the fragment */
-+	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
-+	/** Logical location of the fragment in the frame */
-+	uint16_t index[IA_CSS_N_DATA_DIMENSION];
-+	/** Fractional start (phase) of the fragment in the access unit */
-+	uint16_t offset[IA_CSS_N_DATA_DIMENSION];
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
-+};
-+
-+/*! Print the frame object to file/stream
-+
-+ @param	frame[in]			frame object
-+ @param	fid[out]			file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_print(
-+	const ia_css_frame_t *frame, void *fid);
-+
-+/*! Get the data buffer handle from the frame object
-+
-+@param	frame[in]			frame object
-+
-+@return buffer pointer, VIED_NULL on error
-+*/
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
-+	const ia_css_frame_t *frame);
-+
-+/*! Get the data buffer handle from the frame object
-+
-+ @param	frame[in]			frame object
-+
-+ @return buffer pointer, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer handle on the frame object
-+
-+ @param	frame[in]			frame object
-+ @param	buffer[in]			buffer pointer
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_buffer(
-+	ia_css_frame_t *frame, vied_vaddress_t buffer);
-+
-+/*! Get the data buffer index in the frame object
-+
-+ @param	frame[in]			frame object
-+
-+ @return data buffer index on success, -1 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_get_data_index(
-+	const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer index in the frame object
-+
-+ @param	frame[in]			frame object
-+ @param	data_index[in]			data buffer index
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_data_index(
-+	ia_css_frame_t *frame,
-+	unsigned int data_index);
-+
-+/*! Set the data buffer size on the frame object
-+
-+ @param	frame[in]			frame object
-+ @param	size[in]			number of data bytes
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_data_bytes(
-+	ia_css_frame_t *frame, unsigned size);
-+
-+/*! Get the data buffer state from the frame object
-+
-+ @param	frame[in]			frame object
-+
-+ @return buffer state, limit value on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
-+	const ia_css_frame_t *frame);
-+
-+/*! Set the data buffer state of the frame object
-+
-+ @param	frame[in]			frame object
-+ @param	buffer_state[in]		buffer state
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
-+	const ia_css_buffer_state_t buffer_state);
-+
-+/*! Get the data pointer state from the frame object
-+
-+ @param	frame[in]			frame object
-+
-+ @return pointer state, limit value on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
-+	const ia_css_frame_t *frame);
-+
-+/*! Set the data pointer state of the frame object
-+
-+ @param	frame[in]			frame object
-+ @param	pointer_state[in]		pointer state
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
-+	const ia_css_pointer_state_t pointer_state);
-+
-+/*! Print the frame descriptor object to file/stream
-+
-+ @param	frame_descriptor[in]	frame descriptor object
-+ @param	fid[out]		file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_frame_descriptor_print(
-+	const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
-+
-+/*! Print the fragment descriptor object to file/stream
-+
-+ @param	fragment_descriptor[in]	fragment descriptor object
-+ @param	fid[out]		file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+int ia_css_fragment_descriptor_print(
-+	const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
-+
-+/*! Compute the bitmap for the frame format type
-+
-+ @param	frame_format_type[in]	frame format type
-+
-+ @return 0 on error
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
-+	const ia_css_frame_format_type_t frame_format_type);
-+
-+/*! clear frame format bitmap
-+
-+ @return cleared bitmap
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
-+
-+/*! Compute the size of storage required for the data descriptor object
-+ * on a terminal
-+ *@param       plane_count[in]	The number of data planes in the buffer
-+ */
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+size_t ia_css_sizeof_frame_descriptor(
-+		const uint8_t plane_count);
-+/*! Compute the size of storage required for the kernel parameter descriptor
-+ * object on a terminal
-+
-+ @param	section_count[in]	The number of parameter sections in the buffer
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_kernel_param_descriptor(
-+	const uint16_t section_count);
-+
-+#ifdef __IA_CSS_PSYS_DATA_INLINE__
-+#include "ia_css_program_group_data_impl.h"
-+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
-new file mode 100644
-index 000000000000..6033eee6d191
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
-+
-+#include "frame_support.h"
-+
-+/**
-+ * Pre-defined frame format
-+ *
-+ * Those formats have inbuild support of traffic
-+ * and access functions
-+ *
-+ * Note that the formats are for terminals, so there
-+ * is no distinction between input and output formats
-+ *	- Custom formats with ot without descriptor
-+ *	- 4CC formats such as YUV variants
-+ *	- MIPI (line) formats as produced by CSI receivers
-+ *	- MIPI (sensor) formats such as Bayer or RGBC
-+ *	- CSS internal formats (private types)
-+ *  - CSS parameters (type 1 - 6)
-+ */
-+#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
-+typedef enum ia_css_frame_format_type {
-+	IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
-+	IA_CSS_DATA_CUSTOM,
-+
-+	/** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV11,
-+	/** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
-+	IA_CSS_DATA_FORMAT_YUV420,
-+	/** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_YV12,
-+	/** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV12,
-+	/** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV12_16,
-+	/** 12 bit YUV 420, Intel proprietary tiled format, TileY */
-+	IA_CSS_DATA_FORMAT_NV12_TILEY,
-+	/** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV21,
-+	/** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
-+	IA_CSS_DATA_FORMAT_YUV422,
-+	/** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_YV16,
-+	/** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV16,
-+	/** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_NV61,
-+	/** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_UYVY,
-+	/** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_YUYV,
-+	/** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
-+	IA_CSS_DATA_FORMAT_YUV444,
-+	/** 8 bit monochrome plane */
-+	IA_CSS_DATA_FORMAT_Y800,
-+
-+	/** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
-+	IA_CSS_DATA_FORMAT_RGB565,
-+	/** 24 bit RGB, 3 planes  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_RGB888,
-+	/** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_RGBA888,
-+
-+	/** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_BAYER_GRBG,
-+	/** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_BAYER_RGGB,
-+	/** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_BAYER_BGGR,
-+	/** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_BAYER_GBRG,
-+
-+	/** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
-+	 * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
-+	 */
-+	IA_CSS_DATA_FORMAT_YUV420_LINE,
-+	/** Deprecated RAW, 1 plane */
-+	IA_CSS_DATA_FORMAT_RAW,
-+	/** Deprecated RAW, 1 plane, packed */
-+	IA_CSS_DATA_FORMAT_RAW_PACKED,
-+	/** Internal, for advanced ISP */
-+	IA_CSS_DATA_FORMAT_QPLANE6,
-+	/** 1D byte stream, used for jpeg 1-plane */
-+	IA_CSS_DATA_FORMAT_BINARY_8,
-+	/** Deprecated MIPI frame, 1D byte stream 1 plane */
-+	IA_CSS_DATA_FORMAT_MIPI,
-+	/** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
-+	 * (8 bit per element)
-+	 */
-+	IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
-+	/** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
-+	 * (10 bit per element)
-+	 */
-+	IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
-+	/** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
-+	IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
-+
-+	/** Type 1-5 parameter, not fragmentable */
-+	IA_CSS_DATA_GENERIC_PARAMETER,
-+	/** Video stabilisation Type 6 parameter, fragmentable */
-+	IA_CSS_DATA_DVS_PARAMETER,
-+	/** Video stabilisation Type 6 parameter, coordinates */
-+	IA_CSS_DATA_DVS_COORDINATES,
-+	/** Dead Pixel correction Type 6 parameter, fragmentable */
-+	IA_CSS_DATA_DPC_PARAMETER,
-+	/** Lens Shading Correction Type 6 parameter, fragmentable */
-+	IA_CSS_DATA_LSC_PARAMETER,
-+	/** 3A statistics output HI. */
-+	IA_CSS_DATA_S3A_STATISTICS_HI,
-+	/** 3A statistics output LO. */
-+	IA_CSS_DATA_S3A_STATISTICS_LO,
-+	/** histogram output */
-+	IA_CSS_DATA_S3A_HISTOGRAM,
-+	/** GammaStar grid */
-+	IA_CSS_DATA_GAMMASTAR_GRID,
-+
-+	/** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
-+	IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
-+	/** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
-+	IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
-+	/** Gr R B Gb 4-planes */
-+	IA_CSS_DATA_FORMAT_BAYER_PLANAR,
-+	/** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
-+	IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
-+
-+	/** 16 bit YUV 420, Y even plane, Y uneven plane,
-+	 * UV plane vector interleaved
-+	 */
-+	IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
-+	/** 16 bit YUV 420, YYUVYY vector interleaved */
-+	IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
-+
-+	/** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
-+	IA_CSS_DATA_FORMAT_NV12_TILEYF,
-+
-+	/** Y samples appear first in the memory. All Y samples are array of WORDs;
-+	* even number of lines ;
-+	* Surface stride can be larger than the width of Y plane.
-+	* This array is followed immediately by chroma array.
-+	* Chroma array is an array of WORDs, with interleaved U/V samples.
-+	* If the interleaved U/V plane is addresses as an * array of DWORDs,
-+	* the least significant word contains U sample. The stride of the
-+	* interleaved U/V plane is equal to Y plane. 10 bit data.
-+	*/
-+	IA_CSS_DATA_FORMAT_P010,
-+
-+	/** MSB aligned version of P010*/
-+	IA_CSS_DATA_FORMAT_P010_MSB,
-+
-+	/** P016/P012 Y samples appear first in the memory.
-+	* All Y samples are array of WORDs;
-+	* even number of lines ;
-+	* Surface stride can be larger than the width of Y plane.
-+	* This array is followed immediately by chroma array.
-+	* Chroma array is an array of WORDs, with interleaved U/V samples.
-+	* If the interleaved U/V plane is addresses as an * array of DWORDs,
-+	* the least significant word contains U sample. The stride of the
-+	* interleaved U/V plane is equal to Y plane. 12 bit data.
-+	*/
-+	IA_CSS_DATA_FORMAT_P016,
-+
-+	/** MSB aligned version of P016*/
-+	IA_CSS_DATA_FORMAT_P016_MSB,
-+
-+	/** TILEY representation of P010 LSB-aligned format */
-+	IA_CSS_DATA_FORMAT_P010_TILEY,
-+
-+	/** TILEY representation of P010 MSB-aligned format */
-+	IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
-+
-+	/** TILEY representation of P016 LSB-aligned format */
-+	IA_CSS_DATA_FORMAT_P016_TILEY,
-+
-+	/** TILEY representation of P016 MSB-aligned format*/
-+	IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
-+
-+	/** TILEYf representation of P010*/
-+	IA_CSS_DATA_FORMAT_P010_TILEYF,
-+
-+	/** TILEYf representation of P010 MSB aligned*/
-+	IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
-+
-+	/** TILEYf representation of P016*/
-+	IA_CSS_DATA_FORMAT_P016_TILEYF,
-+
-+	/** TILEYf representation of P016 MSB aligned*/
-+	IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
-+
-+	/** consists of L and R PDAF pixel line pairs.
-+	 * If line n is L pixel line, n+1 will be R pixel line.
-+	 * Depending on mode - First line can be L or R pixel line and
-+	 * the line pair sequence can also alternate. 1-plane (bpp == bpe)
-+	 */
-+	IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
-+
-+	/** consists of L and R PDAF pixel pairs.
-+         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
-+         * alternating between the above two as well. 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
-+
-+	/** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
-+	IA_CSS_DATA_FORMAT_IR,
-+
-+	/** MSB aligned version of P012*/
-+	IA_CSS_DATA_FORMAT_P012_MSB,
-+
-+	/* Each tile is stored in consecutive addresses in DDR.
-+	 * The scanning walking order within a tile is raster order
-+	 * (line-by-line).
-+	 */
-+	/* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
-+	 * followed by an interleaved 8 bit U/V
-+	 * samples plane.
-+	 */
-+	IA_CSS_DATA_FORMAT_NV12_TILE,
-+	/*P010 is similar to NV12, but with 10 bit values,
-+	 * each stored in a 16b container (msb aligned, 6 lsb are zero).
-+	 */
-+	IA_CSS_DATA_FORMAT_P010_TILE,
-+	/* P012 is similar to P010, but with 12 bit values,
-+	 * each stored in a 16b containers (msb aligned, 4 lsb are zero).
-+	 */
-+	IA_CSS_DATA_FORMAT_P012_TILE,
-+
-+	IA_CSS_N_FRAME_FORMAT_TYPES
-+} ia_css_frame_format_type_t;
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
-new file mode 100644
-index 000000000000..461e29bfef5f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
-@@ -0,0 +1,461 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
-+#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
-+
-+#include "ia_css_program_group_data.h"
-+#include "ia_css_psys_data_trace.h"
-+#include <error_support.h>	/* for verifexit */
-+#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
-+#include <misc_support.h>	/* for NOT_USED */
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_print(
-+	const ia_css_frame_t *frame, void *fid)
-+{
-+	int retval = -1;
-+
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
-+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
-+	 * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
-+	 */
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+	       "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
-+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
-+	 * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
-+	 */
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tdata_bytes = %d\n", frame->data_bytes);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
-+	const ia_css_frame_t *frame) {
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	return &(frame->data);
-+
-+EXIT:
-+	if (NULL == frame) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+			"ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
-+	}
-+	return NULL;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+vied_vaddress_t	ia_css_frame_get_buffer(
-+	const ia_css_frame_t *frame)
-+{
-+	vied_vaddress_t	buffer = VIED_NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_get_buffer(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	buffer = frame->data;
-+
-+EXIT:
-+	if (NULL == frame) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+		       "ia_css_frame_get_buffer invalid argument\n");
-+	}
-+	return buffer;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_buffer(
-+	ia_css_frame_t *frame,
-+	vied_vaddress_t buffer)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_set_buffer(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	frame->data = buffer;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_set_buffer failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_get_data_index(
-+	const ia_css_frame_t *frame)
-+{
-+	int data_index = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_get_data_index(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+
-+	data_index = frame->data_index;
-+
-+EXIT:
-+	if (NULL == frame) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+		       "ia_css_frame_get_data_index invalid argument\n");
-+	}
-+	return data_index;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_data_index(
-+	ia_css_frame_t *frame,
-+	unsigned int data_index)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_set_data_index(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+
-+	frame->data_index = data_index;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_set_data_index failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_data_bytes(
-+	ia_css_frame_t *frame,
-+	unsigned int size)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_set_data_bytes(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	frame->data_bytes = size;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_set_data_bytes failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_buffer_state_t ia_css_frame_get_buffer_state(
-+	const ia_css_frame_t *frame)
-+{
-+	ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_get_buffer_state(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	buffer_state = frame->buffer_state;
-+
-+EXIT:
-+	if (NULL == frame) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+			"ia_css_frame_get_buffer_state invalid argument\n");
-+	}
-+	return buffer_state;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_buffer_state(
-+	ia_css_frame_t *frame,
-+	const ia_css_buffer_state_t buffer_state)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_set_buffer_state(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	frame->buffer_state = buffer_state;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_set_buffer_state failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_pointer_state_t ia_css_frame_get_pointer_state(
-+	const ia_css_frame_t *frame)
-+{
-+	ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_get_pointer_state(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	pointer_state = frame->pointer_state;
-+
-+EXIT:
-+	if (NULL == frame) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+			"ia_css_frame_get_pointer_state invalid argument\n");
-+	}
-+	return pointer_state;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_set_pointer_state(
-+	ia_css_frame_t *frame,
-+	const ia_css_pointer_state_t pointer_state)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_set_pointer_state(): enter:\n");
-+
-+	verifexit(frame != NULL);
-+	frame->pointer_state = pointer_state;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_set_pointer_state failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_frame_descriptor_print(
-+	const ia_css_frame_descriptor_t *frame_descriptor,
-+	void *fid)
-+{
-+	int retval = -1;
-+	int i;
-+	uint8_t frame_plane_count;
-+
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+		"ia_css_frame_descriptor_print(): enter:\n");
-+
-+	COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
-+
-+	verifexit(frame_descriptor != NULL);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+		"ia_css_frame_descriptor_print(): enter:\n");
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tframe_format_type = %d\n",
-+		frame_descriptor->frame_format_type);
-+	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
-+	 * ia_css_frame_format_string(frame_descriptor->frame_format_type));
-+	 */
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tbpp = %d\n", frame_descriptor->bpp);
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tbpe = %d\n", frame_descriptor->bpe);
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tis_compressed = %d\n", frame_descriptor->is_compressed);
-+
-+	frame_plane_count = IA_CSS_N_FRAME_PLANES;
-+	/* frame_plane_count =
-+	 * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
-+	 */
-+
-+	verifexit(frame_plane_count > 0);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tplane_offsets[%d]: [\n", frame_plane_count);
-+	for (i = 0; i < (int)frame_plane_count - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", frame_descriptor->plane_offsets[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d ]\n", frame_descriptor->plane_offsets[i]);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tts_offsets[%d]: [\n", frame_plane_count);
-+	for (i = 0; i < (int)frame_plane_count - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", frame_descriptor->ts_offsets[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d ]\n", frame_descriptor->ts_offsets[i]);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", frame_descriptor->dimension[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d }\n", frame_descriptor->dimension[i]);
-+
-+	COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
-+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", frame_descriptor->stride[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d }\n", frame_descriptor->stride[i]);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+			"ia_css_frame_descriptor_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+int ia_css_fragment_descriptor_print(
-+	const ia_css_fragment_descriptor_t *fragment_descriptor,
-+	void *fid)
-+{
-+	int retval = -1;
-+	int i;
-+
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
-+		"ia_css_fragment_descriptor_print(): enter:\n");
-+
-+	verifexit(fragment_descriptor != NULL);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", fragment_descriptor->dimension[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d }\n", fragment_descriptor->dimension[i]);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", fragment_descriptor->index[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"\t%4d }\n", fragment_descriptor->index[i]);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+		"offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
-+	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
-+			"\t%4d,\n", fragment_descriptor->offset[i]);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
-+		fragment_descriptor->offset[i]);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
-+		      "ia_css_fragment_descriptor_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
-+	const ia_css_frame_format_type_t frame_format_type)
-+{
-+	ia_css_frame_format_bitmap_t bit_mask = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		"ia_css_frame_format_bit_mask(): enter:\n");
-+
-+	if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
-+		bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+			"ia_css_frame_format_bit_mask invalid argument\n");
-+	}
-+
-+	return bit_mask;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		       "ia_css_frame_format_bitmap_clear(): enter:\n");
-+
-+	return 0;
-+}
-+
-+IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+size_t ia_css_sizeof_frame_descriptor(
-+		const uint8_t plane_count)
-+{
-+	size_t size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
-+		       "ia_css_sizeof_frame_descriptor(): enter:\n");
-+
-+	verifexit(plane_count > 0);
-+	size += sizeof(ia_css_frame_descriptor_t);
-+	size += plane_count * sizeof(uint32_t);
-+
-+EXIT:
-+	if (0 == plane_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
-+			"ia_css_sizeof_frame_descriptor invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
-new file mode 100644
-index 000000000000..94d5ff4555df
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
-@@ -0,0 +1,295 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param.h
-+ *
-+ * Define the methods on the program group parameter object that are not part
-+ * of a single interface
-+ */
-+#include <ia_css_program_group_param_types.h>
-+
-+#include <ia_css_program_group_param.sim.h>
-+
-+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
-+
-+#include <type_support.h>
-+
-+/*! Get the stored size of the program group parameter object
-+
-+ @param	param[in]			program group parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_program_group_param_get_size(
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! initialize program_group_param
-+
-+ @param	blob[in]	program group parameter object
-+ @param	program_count[in]		number of  terminals.
-+ @param	terminal_count[in]		number of  terminals.
-+ @param	fragment_count[in]		number of  terminals.
-+
-+ @return 0 if success, else failure.
-+ */
-+extern int ia_css_program_group_param_init(
-+	ia_css_program_group_param_t *blob,
-+	const uint8_t	program_count,
-+	const uint8_t	terminal_count,
-+	const uint16_t	fragment_count,
-+	const enum ia_css_frame_format_type *frame_format_types);
-+/*! Get the program parameter object from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+ @param	i[in]				program parameter index
-+
-+ @return program parameter pointer, NULL on error
-+ */
-+extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
-+	const ia_css_program_group_param_t *param,
-+	const int i);
-+
-+/*! Get the terminal parameter object from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+ @param	i[in]				terminal parameter index
-+
-+ @return terminal parameter pointer, NULL on error
-+ */
-+extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
-+	const ia_css_program_group_param_t *param,
-+	const int i);
-+
-+/*! Get the fragment count from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return fragment count, 0 on error
-+ */
-+extern uint16_t ia_css_program_group_param_get_fragment_count(
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Get the program count from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return program count, 0 on error
-+ */
-+extern uint8_t ia_css_program_group_param_get_program_count(
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Get the terminal count from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return terminal count, 0 on error
-+ */
-+extern uint8_t ia_css_program_group_param_get_terminal_count(
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Set the protocol version in a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+ @param	protocol_version[in]		protocol version
-+
-+ @return nonzero on error
-+*/
-+extern int
-+ia_css_program_group_param_set_protocol_version(
-+	ia_css_program_group_param_t *param,
-+	uint8_t protocol_version);
-+
-+/*! Get the protocol version from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return protocol version
-+*/
-+extern uint8_t
-+ia_css_program_group_param_get_protocol_version(
-+	const ia_css_program_group_param_t *param);
-+
-+/*! Set the kernel enable bitmap from a program group parameter object
-+
-+ @param	param[in]			program group parameter object
-+ @param	bitmap[in]			kernel enable bitmap
-+
-+ @return non-zero on error
-+ */
-+extern int ia_css_program_group_param_set_kernel_enable_bitmap(
-+	ia_css_program_group_param_t	*param,
-+	const ia_css_kernel_bitmap_t	bitmap);
-+
-+/*! Get the kernel enable bitmap from a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return kernel enable bitmap, 0 on error
-+*/
-+extern ia_css_kernel_bitmap_t
-+ia_css_program_group_param_get_kernel_enable_bitmap(
-+	const ia_css_program_group_param_t *param);
-+
-+/*! Get the stored size of the program parameter object
-+
-+ @param	param[in]			program parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_program_param_get_size(
-+	const ia_css_program_param_t			*param);
-+
-+/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
-+
-+ @param	program_param[in]		program parameter object
-+ @param	bitmap[in]			kernel enable bitmap
-+
-+ @return non-zero on error
-+ */
-+extern int ia_css_program_param_set_kernel_enable_bitmap(
-+	ia_css_program_param_t	*program_param,
-+	const ia_css_kernel_bitmap_t	bitmap);
-+
-+/*! Get the kernel enable bitmap from a program parameter object
-+
-+ @param	program_param[in]		program parameter object DEPRECATED
-+
-+ Note: This function returns in fact the kernel enable of the program group
-+      parameters
-+
-+ @return kernel enable bitmap, 0 on error
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
-+	const ia_css_program_param_t			*param);
-+
-+/*! Get the stored size of the terminal parameter object
-+
-+ @param	param[in]			terminal parameter object
-+
-+ @return size, 0 on error
-+ */
-+extern size_t ia_css_terminal_param_get_size(
-+	const ia_css_terminal_param_t			*param);
-+
-+/*! Get the kernel enable bitmap from a terminal parameter object
-+
-+ @param	terminal_param[in]		terminal parameter object
-+
-+ Note: This function returns in fact the kernel enable of the program group
-+       parameters
-+
-+ @return kernel enable bitmap, 0 on error
-+ */
-+extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
-+	const ia_css_terminal_param_t			*param);
-+
-+/*! Get the parent object for this terminal param.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+
-+ @return parent program group param object
-+ */
-+extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
-+	const ia_css_terminal_param_t			*param);
-+
-+/*! Get the data format type associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+
-+ @return data format type (ia_css_data_format_type_t)
-+ */
-+extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
-+	const ia_css_terminal_param_t	*terminal_param);
-+
-+/*! Set the data format type associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+ @param data_format_type[in]		data format type
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_frame_format_type(
-+	ia_css_terminal_param_t	*terminal_param,
-+	const ia_css_frame_format_type_t data_format_type);
-+
-+/*! Get bits per pixel on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+
-+ @return bits per pixel
-+ */
-+extern uint8_t ia_css_terminal_param_get_bpp(
-+	const ia_css_terminal_param_t	*terminal_param);
-+
-+/*! Set bits per pixel on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+ @param bpp[in]				bits per pixel
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_bpp(
-+	ia_css_terminal_param_t	*terminal_param,
-+	const uint8_t bpp);
-+
-+/*! Get dimensions on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+ @param	dimensions[out]			dimension array
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_get_dimensions(
-+	const ia_css_terminal_param_t	*terminal_param,
-+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set dimensions on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+ @param	dimensions[in]			dimension array
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_dimensions(
-+	ia_css_terminal_param_t	*terminal_param,
-+	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get stride on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+
-+ @return stride of the frame to be attached.
-+ */
-+extern uint32_t ia_css_terminal_param_get_stride(
-+	const ia_css_terminal_param_t	*terminal_param);
-+
-+/*! Set stride on the frame associated with the terminal.
-+
-+ @param	terminal_param[in]		terminal parameter object
-+ @param	stride[in]				stride
-+
-+ @return non-zero on error.
-+ */
-+extern int ia_css_terminal_param_set_stride(
-+	ia_css_terminal_param_t	*terminal_param,
-+	const uint32_t stride);
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
-new file mode 100644
-index 000000000000..3b98832312e1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
-@@ -0,0 +1,155 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param.sim.h
-+ *
-+ * Define the methods on the program group parameter object: Simulation only
-+ */
-+#include <ia_css_program_group_param_types.h>
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>
-+
-+/* Simulation */
-+
-+/*! Create a program group parameter object from specification
-+
-+ @param	specification[in]		specification (index)
-+ @param	manifest[in]			program group manifest
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_create(
-+	const unsigned int			specification,
-+	const ia_css_program_group_manifest_t	*manifest);
-+
-+/*! Destroy the program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
-+	ia_css_program_group_param_t			*param);
-+
-+/*! Compute the size of storage required for allocating
-+ * the program group parameter object
-+
-+ @param	program_count[in]	Number of programs in the process group
-+ @param	terminal_count[in]	Number of terminals on the process group
-+ @param	fragment_count[in]	Number of fragments on the terminals of
-+				the process group
-+
-+ @return 0 on error
-+ */
-+size_t ia_css_sizeof_program_group_param(
-+	const uint8_t	program_count,
-+	const uint8_t	terminal_count,
-+	const uint16_t	fragment_count);
-+
-+/*! Allocate (the store of) a program group parameter object
-+
-+ @param	program_count[in]	Number of programs in the process group
-+ @param	terminal_count[in]	Number of terminals on the process group
-+ @param	fragment_count[in]	Number of fragments on the terminals of
-+				the process group
-+
-+ @return program group parameter pointer, NULL on error
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
-+	const uint8_t	program_count,
-+	const uint8_t	terminal_count,
-+	const uint16_t	fragment_count);
-+
-+/*! Free (the store of) a program group parameter object
-+
-+ @param	program_group_param[in]		program group parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_param_t *ia_css_program_group_param_free(
-+	ia_css_program_group_param_t			*param);
-+
-+/*! Print the program group parameter object to file/stream
-+
-+ @param	param[in]	program group parameter object
-+ @param	fid[out]	file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_param_print(
-+	const ia_css_program_group_param_t	*param,
-+	void					*fid);
-+
-+/*! Allocate (the store of) a program parameter object
-+
-+ @return program parameter pointer, NULL on error
-+ */
-+extern ia_css_program_param_t *ia_css_program_param_alloc(void);
-+
-+/*! Free (the store of) a program parameter object
-+
-+ @param	param[in]	program parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_program_param_t *ia_css_program_param_free(
-+	ia_css_program_param_t					*param);
-+
-+/*! Print the program parameter object to file/stream
-+
-+ @param	param[in]					program parameter object
-+ @param	fid[out]					file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_param_print(
-+	const ia_css_program_param_t	*param,
-+	void				*fid);
-+
-+/*! Allocate (the store of) a terminal parameter object
-+
-+ @return terminal parameter pointer, NULL on error
-+ */
-+extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
-+
-+/*! Free (the store of) a terminal parameter object
-+
-+ @param	param[in]	terminal parameter object
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_param_t *ia_css_terminal_param_free(
-+	ia_css_terminal_param_t					*param);
-+
-+/*! Print the terminal parameter object to file/stream
-+
-+ @param	param[in]	terminal parameter object
-+ @param	fid[out]	file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_terminal_param_print(
-+	const ia_css_terminal_param_t	*param,
-+	void				*fid);
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
-new file mode 100644
-index 000000000000..6b8bdb23fc10
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
-+
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_kernel_bitmap.h>
-+#include <ia_css_program_group_data.h>
-+#include <type_support.h>
-+
-+#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
-+#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
-+	(IA_CSS_KERNEL_BITMAP_BITS \
-+	+ (3 * IA_CSS_UINT32_T_BITS) \
-+	+ IA_CSS_UINT16_T_BITS \
-+	+ (3 * IA_CSS_UINT8_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/* tentative; co-design with ISP algorithm */
-+struct ia_css_program_group_param_s {
-+	/** The enable bits for each individual kernel */
-+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+	/** Size of this structure */
-+	uint32_t size;
-+	/** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
-+	uint32_t program_param_offset;
-+	/** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
-+	uint32_t terminal_param_offset;
-+	/** Number of (explicit) fragments to use in a frame */
-+	uint16_t fragment_count;
-+	/** Number of active programs */
-+	uint8_t program_count;
-+	/** Number of active terminals */
-+	uint8_t terminal_count;
-+	/** Program group protocol version */
-+	uint8_t protocol_version;
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
-+};
-+
-+#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
-+	(IA_CSS_KERNEL_BITMAP_BITS \
-+	+ IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_INT32_T_BITS)
-+
-+/* private */
-+struct ia_css_program_param_s {
-+	/** Bitmap of kernel encapsulated by this program.  If all of these kernels are
-+	 *  disabled, the program will be disabled too. */
-+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+	/** Size of this structure */
-+	uint32_t size;
-+	/** Offset to add to reach parent. This is negative value.*/
-+	int32_t parent_offset;
-+};
-+
-+#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
-+	(IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_FRAME_FORMAT_TYPE_BITS \
-+	+ IA_CSS_INT32_T_BITS \
-+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
-+	+ IA_CSS_INT32_T_BITS \
-+	+ IA_CSS_UINT16_T_BITS \
-+	+ IA_CSS_UINT8_T_BITS \
-+	+ (IA_CSS_UINT8_T_BITS * 1))
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
-new file mode 100644
-index 000000000000..4d81cca96eb4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
-@@ -0,0 +1,66 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
-+#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_program_group_param_types.h
-+ *
-+ * Define the parameter objects that are necessary to create the process
-+ * groups i.e. enable parameters and parameters to set-up frame descriptors
-+ */
-+
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
-+#include <ia_css_terminal_defs.h>
-+
-+#include <type_support.h>
-+/*! make this public so that driver can populate,
-+ * size, bpp, dimensions for all terminals.
-+ *
-+ * Currently one API is provided to get frame_format_type.
-+ *
-+ * frame_format_type is set during ia_css_terminal_param_init().
-+ * Value for that is const and binary specific.
-+ */
-+struct ia_css_terminal_param_s {
-+	uint32_t size;	/**< Size of this structure */
-+	/** Indicates if this is a generic type or inbuild
-+	 * with variable size descriptor
-+	 */
-+	ia_css_frame_format_type_t frame_format_type;
-+	/** offset to add to reach parent. This is negative value.*/
-+	int32_t parent_offset;
-+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
-+	/** Mapping to the index field of the terminal descriptor */
-+	uint16_t index[IA_CSS_N_DATA_DIMENSION];
-+	/** Logical fragment dimension,
-+	 * TODO: fragment dimensions can be different per fragment
-+	 */
-+	uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
-+	uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
-+	uint16_t offset;/**< Offset in bytes to first fragment */
-+	uint8_t bpp;	/**< Bits per pixel.  The number of bits with significant data. */
-+	uint8_t bpe;	/**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
-+};
-+
-+typedef struct ia_css_program_group_param_s	ia_css_program_group_param_t;
-+typedef struct ia_css_program_param_s		ia_css_program_param_t;
-+typedef struct ia_css_terminal_param_s		ia_css_terminal_param_t;
-+
-+#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
-new file mode 100644
-index 000000000000..27ae62d79211
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
-@@ -0,0 +1,290 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_BUFFER_SET_H
-+#define __IA_CSS_PSYS_BUFFER_SET_H
-+
-+#include "ia_css_base_types.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_process_types.h"
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_kernel_bitmap.h"
-+#include "ia_css_rbm.h"
-+
-+#define N_UINT64_IN_BUFFER_SET_STRUCT		1
-+#define N_UINT16_IN_BUFFER_SET_STRUCT		1
-+#define N_UINT8_IN_BUFFER_SET_STRUCT		1
-+#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT	1
-+#define SIZE_OF_BUFFER_SET \
-+	(N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
-+	+ IA_CSS_KERNEL_BITMAP_BITS \
-+	+ IA_CSS_KERNEL_BITMAP_BITS \
-+	+ IA_CSS_KERNEL_BITMAP_BITS \
-+	+ IA_CSS_RBM_BITS \
-+	+ VIED_VADDRESS_BITS \
-+	+ VIED_VADDRESS_BITS \
-+	+ N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
-+	+ N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
-+
-+struct ia_css_buffer_set_s {
-+	/** Token for user context reference */
-+	uint64_t token;
-+	/** Enable bits for each individual kernel
-+	 * For integration, all 0's should be treated as uninitialized and
-+	 * assume all processes are enabled */
-+	ia_css_kernel_bitmap_t kernel_enable_bitmap;
-+	/** Enable bits for each individual terminals per call */
-+	ia_css_kernel_bitmap_t terminal_enable_bitmap;
-+	/** Enable bits for each individual routing per call */
-+	ia_css_kernel_bitmap_t routing_enable_bitmap;
-+	/** Enable bits for routing per call */
-+	ia_css_rbm_t rbm;
-+	/** IPU virtual address of this buffer set */
-+	vied_vaddress_t ipu_virtual_address;
-+	/** IPU virtual address of the process group corresponding to this buffer set */
-+	vied_vaddress_t process_group_handle;
-+	/** Number of terminal buffer addresses in this structure */
-+	uint16_t terminal_count;
-+	/** Frame id to associate with this buffer set */
-+	uint8_t frame_counter;
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
-+};
-+
-+#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT	3
-+#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
-+	VIED_VADDRESS_BITS \
-+	+ ( 1 * IA_CSS_UINT8_T_BITS) \
-+	+ ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
-+struct ia_css_dynamic_terminal_descriptor_s {
-+	/** Terminal buffer virtual address */
-+	vied_vaddress_t virtual_buffer_address;
-+	/** Per-frame compression control, boolean semantics */
-+	uint8_t enable_compression;
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
-+};
-+
-+/*! Construct a buffer set object at specified location
-+
-+ @param	buffer_set_mem[in]	memory location to create buffer set object
-+ @param	process_group[in]	process group corresponding to this buffer set
-+ @param	frame_counter[in]	frame number for this buffer set object
-+
-+ @return pointer to buffer set object on success, NULL on error
-+ */
-+ia_css_buffer_set_t *ia_css_buffer_set_create(
-+	void *buffer_set_mem,
-+	const ia_css_process_group_t *process_group,
-+	const unsigned int frame_counter);
-+
-+/*! Compute size (in bytes) required for full buffer set object
-+
-+ @param	process_group[in]	process group corresponding to this buffer set
-+
-+ @return size in bytes of buffer set object on success, 0 on error
-+ */
-+size_t ia_css_sizeof_buffer_set(
-+	const ia_css_process_group_t *process_group);
-+
-+/*! Set a buffer address in a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to set buffer in
-+ @param	terminal_index[in]	terminal index to use as a reference between
-+				buffer and terminal
-+ @param	buffer[in]		buffer address to store
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_buffer(
-+	ia_css_buffer_set_t *buffer_set,
-+	const unsigned int terminal_index,
-+	const vied_vaddress_t buffer);
-+
-+/*! Get virtual buffer address from a buffer set object and terminal object by
-+   resolving the index used
-+
-+ @param	buffer_set[in]		buffer set object to get buffer from
-+ @param	terminal[in]		terminal object to get buffer of
-+
-+ @return virtual buffer address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_buffer(
-+	const ia_css_buffer_set_t *buffer_set,
-+	const ia_css_terminal_t *terminal);
-+
-+/*! Set ipu virtual address of a buffer set object within the buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to set ipu address in
-+ @param	ipu_vaddress[in]	ipu virtual address of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_ipu_address(
-+	ia_css_buffer_set_t *buffer_set,
-+	const vied_vaddress_t ipu_vaddress);
-+
-+/*! Get ipu virtual address from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get ipu address from
-+
-+ @return virtual buffer set address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_ipu_address(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set kernel enable bitmap of a buffer set object within the buffer set object
-+
-+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
-+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_kernel_enable_bitmap(
-+	ia_css_buffer_set_t *buffer_set,
-+	const ia_css_kernel_bitmap_t kernel_enable_bitmap);
-+
-+/*! Get kernel enable bitmap from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set kernel enable bitmap on success, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set terminal enable bitmap of a buffer set object within the buffer set object
-+
-+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
-+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_terminal_enable_bitmap(
-+	ia_css_buffer_set_t *buffer_set,
-+	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
-+
-+/*! Get terminal enable bitmap from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set terminal enable bitmap on success, 0 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_routing_enable_bitmap(
-+	ia_css_buffer_set_t *buffer_set,
-+	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set Routing BitMap of a buffer set object within the buffer set object
-+
-+ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
-+ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_rbm(
-+	ia_css_buffer_set_t *buffer_set,
-+	const ia_css_rbm_t rbm);
-+
-+/*! Get Routing BitMap from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
-+
-+ @return buffer set terminal enable bitmap on success, 0 on error
-+
-+ @todo New for POC
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_buffer_set_get_rbm(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set process group handle in a buffer set object
-+
-+ @param	buffer_set[in]			buffer set object to set handle in
-+ @param	process_group_handle[in]	process group handle of the buffer set
-+					object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_process_group_handle(
-+	ia_css_buffer_set_t *buffer_set,
-+	const vied_vaddress_t process_group_handle);
-+
-+/*! Get process group handle from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get handle from
-+
-+ @return virtual process group address on success, VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+/*! Set token of a buffer set object within the buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to set ipu address in
-+ @param	token[in]		token of the buffer set object
-+
-+ @return 0 on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_buffer_set_set_token(
-+	ia_css_buffer_set_t *buffer_set,
-+	const uint64_t token);
-+
-+/*! Get token from a buffer set object
-+
-+ @param	buffer_set[in]		buffer set object to get token from
-+
-+ @return token on success, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint64_t ia_css_buffer_set_get_token(
-+	const ia_css_buffer_set_t *buffer_set);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_buffer_set_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
-new file mode 100644
-index 000000000000..5721d46d2cff
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_DATA_INLINE__
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
-new file mode 100644
-index 000000000000..9905be3794a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DATA_TRACE_H
-+#define __IA_CSS_PSYS_DATA_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
-+     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_DATA_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_DATA_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_DATA_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_DATA_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_DATA_TRACE_METHOD \
-+		PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
-+		PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
-+		PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
-+		PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
-+		PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
-+		PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
-+		PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
-new file mode 100644
-index 000000000000..4aab0d4b9916
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
-new file mode 100644
-index 000000000000..fc31bb79adbe
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
-+#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
-+     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
-+		PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_DYNAMIC_TRACE_METHOD \
-+		PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
-+		PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
-+		PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
-+		PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
-+		PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
-+		PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
-+		PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
-new file mode 100644
-index 000000000000..f0f23d9895dc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
-+#define __IA_CSS_PSYS_KERNEL_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
-+     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
-+		PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_KERNEL_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_KERNEL_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_KERNEL_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_KERNEL_TRACE_METHOD \
-+		PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
-+		PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
-+		PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
-+		PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
-+		PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
-+		PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
-+		PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
-new file mode 100644
-index 000000000000..b4512e603a2a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
-@@ -0,0 +1,108 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
-+#define __IA_CSS_PSYS_MANIFEST_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_manifest_types.h
-+ *
-+ * The types belonging to the terminal/program/
-+ * program group manifest static module
-+ */
-+
-+#include <type_support.h>
-+#include "vied_nci_psys_resource_model.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+/** This value is used in the manifest to indicate that the resource
-+ * offset field must be ignored and the resource is relocatable
-+ */
-+#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
-+
-+#define IA_CSS_CONNECTION_BITMAP_BITS 8
-+typedef uint8_t ia_css_connection_bitmap_t;
-+
-+#define IA_CSS_CONNECTION_TYPE_BITS 32
-+
-+/** Describes the tranfer method of data between terminals */
-+typedef enum ia_css_connection_type {
-+	/** The data buffer must be fully written to main memory by the producer
-+	 *  before it can be read by the consumer */
-+	IA_CSS_CONNECTION_MEMORY = 0,
-+	/** The data transfer is a (watermark) queued stream over main memory.
-+	 *  The consumer may begin reading data before the data
-+	 *  buffer is completely written in a controlled manner. */
-+	IA_CSS_CONNECTION_MEMORY_STREAM,
-+	/** The data transfer is via device ports connected such that no data
-+	 *  is read or written to main memory. */
-+	IA_CSS_CONNECTION_STREAM,
-+	IA_CSS_N_CONNECTION_TYPES
-+} ia_css_connection_type_t;
-+
-+#define IA_CSS_PROGRAM_TYPE_BITS 8
-+typedef enum ia_css_program_type {
-+	IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
-+	IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
-+	IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
-+	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
-+	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
-+/*
-+ * Future extension; A bitmap coding starts making more sense
-+ *
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
-+	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
-+ */
-+	IA_CSS_N_PROGRAM_TYPES
-+} ia_css_program_type_t;
-+
-+#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
-+typedef uint32_t ia_css_program_group_ID_t;
-+#define IA_CSS_PROGRAM_ID_BITS 8
-+typedef uint8_t ia_css_program_ID_t;
-+
-+#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
-+#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
-+
-+typedef struct ia_css_program_group_manifest_s
-+ia_css_program_group_manifest_t;
-+typedef struct ia_css_program_manifest_s
-+ia_css_program_manifest_t;
-+typedef struct ia_css_program_manifest_ext_s
-+ia_css_program_manifest_ext_t;
-+typedef struct ia_css_data_terminal_manifest_s
-+ia_css_data_terminal_manifest_t;
-+
-+/* ============ Program Control Init Terminal Manifest - START ============ */
-+typedef struct ia_css_program_control_init_manifest_program_desc_s
-+	ia_css_program_control_init_manifest_program_desc_t;
-+
-+typedef struct ia_css_program_control_init_terminal_manifest_s
-+	ia_css_program_control_init_terminal_manifest_t;
-+/* ============ Program Control Init Terminal Manifest - END ============ */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
-new file mode 100644
-index 000000000000..834e02663334
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
-+#define __IA_CSS_PSYS_PARAM_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
-+     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_PARAM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_PARAM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_PARAM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_PARAM_TRACE_METHOD \
-+		PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
-+		PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
-+		PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
-+		PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
-+		PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
-+		PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
-+		PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
-new file mode 100644
-index 000000000000..7c2af2cfb6f8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
-+#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
-+
-+#include "ipu_device_acb_devices.h"
-+#include "ipu_device_gp_devices.h"
-+#include "type_support.h"
-+
-+#define PRIV_CONF_INVALID	0xFF
-+#define MAX_INPUT_BUFFER	(2)
-+#define MAX_OUTPUT_BUFFER	(2)
-+
-+struct ia_css_psys_pg_buffer_information_s {
-+	unsigned int link_id; /* Terminal the buffer is connected to */
-+	unsigned int buffer_base_addr;
-+	unsigned int bpe;
-+	unsigned int buffer_width;
-+	unsigned int buffer_height;
-+	unsigned int num_of_buffers;
-+	unsigned int dfm_port_addr;
-+};
-+
-+typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
-+
-+typedef struct {
-+	uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
-+	uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
-+} ia_css_psys_private_pg_data_acb_t;
-+
-+struct ia_css_psys_private_pg_data {
-+	ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
-+	uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
-+	uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
-+	ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
-+	ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
-+};
-+
-+#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
-new file mode 100644
-index 000000000000..39122a072ceb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
-@@ -0,0 +1,395 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_H
-+#define __IA_CSS_PSYS_PROCESS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process.h
-+ *
-+ * Define the methods on the process object that are not part of
-+ * a single interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_dynamic_storage_class.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>					/* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_process.hsys.user.h>
-+
-+/*
-+ * Internal resources
-+ */
-+#include <ia_css_psys_process.hsys.kernel.h>
-+
-+/*
-+ * Process manager
-+ */
-+#include <ia_css_psys_process.psys.h>
-+
-+/*
-+ * Command processor
-+ */
-+
-+/*! Execute a command locally or send it to be processed remotely
-+
-+ @param	process[in]	process object
-+ @param	cmd[in]		command
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_cmd(
-+	ia_css_process_t *process,
-+	const ia_css_process_cmd_t cmd);
-+
-+/*! Get the internal memory offset of the process object
-+
-+ @param	process[in]	process object
-+ @param	mem_id[in]	memory id
-+
-+ @return internal memory offset,
-+	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
-+	const ia_css_process_t *process,
-+	const vied_nci_mem_type_ID_t mem_id);
-+
-+/*! Get the external memory offset of the process object
-+
-+ @param	process[in]	process object
-+ @param	mem_id[in]	memory id
-+
-+ @return external memory offset,
-+	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
-+	const ia_css_process_t *process,
-+	const vied_nci_mem_type_ID_t mem_type_id);
-+
-+/*! Get the stored size of the process object
-+
-+ @param	process[in]	process object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_process_get_size(const ia_css_process_t *process);
-+
-+/*! Get the (pointer to) the process group parent of the process object
-+
-+ @param	process[in]	process object
-+
-+ @return the pointer to the parent, NULL on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_t *ia_css_process_get_parent(
-+	const ia_css_process_t *process);
-+
-+/*! Set the (pointer to) the process group parent of the process object
-+
-+ @param	process[in]	process object
-+ @param	parent[in]	(pointer to the) process group parent object
-+
-+ @return < 0 on invalid argument(s)
-+ */
-+extern int ia_css_process_set_parent(
-+	ia_css_process_t *process,
-+	ia_css_process_group_t *parent);
-+
-+/*! Get the unique ID of program used by the process object
-+
-+ @param	process[in]	process object
-+
-+ @return ID, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_ID_t ia_css_process_get_program_ID(
-+	const ia_css_process_t *process);
-+
-+/*! Get the state of the process object
-+
-+ @param	process[in]	process object
-+
-+ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_state_t ia_css_process_get_state(
-+	const ia_css_process_t *process);
-+
-+/*! Set the state of the process object
-+
-+ @param	process[in]	process object
-+ @param	state[in]	state of the process
-+
-+ @return < 0 on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_set_state(
-+	ia_css_process_t *process,
-+	ia_css_process_state_t state);
-+
-+/*! Get the assigned cell of the the process object
-+
-+ @param	process[in]	process object
-+
-+ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_cell_ID_t ia_css_process_get_cell(
-+	const ia_css_process_t *process);
-+
-+/*! Get the number of cells the process object depends on
-+
-+ @param	process[in]	process object
-+
-+ @return number of cells
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_cell_dependency_count(
-+	const ia_css_process_t *process);
-+
-+/*! Get the number of terminals the process object depends on
-+
-+ @param	process[in]	process object
-+
-+ @return number of terminals
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_terminal_dependency_count(
-+	const ia_css_process_t *process);
-+
-+/*! Set n-th cell dependency of a process object
-+
-+ @param	process[in]	Process object
-+ @param	dep_index[in]	dep index
-+ @param	id[in]		dep id
-+
-+ @return < 0 on invalid process argument
-+ */
-+extern int ia_css_process_set_cell_dependency(
-+	const ia_css_process_t *process,
-+	const unsigned int dep_index,
-+	const vied_nci_resource_id_t id);
-+
-+/*! Get n-th cell dependency of a process object
-+
-+ @param	process[in]	Process object
-+ @param	cell_num[in]	n-th cell
-+
-+ @return n-th cell dependency,
-+	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
-+	const ia_css_process_t *process,
-+	const unsigned int cell_num);
-+
-+/*! Set n-th terminal dependency of a process object
-+
-+ @param	process[in]	Process object
-+ @param	dep_index[in]	dep index
-+ @param	id[in]		dep id
-+
-+ @return < 0 on on invalid argument(s)
-+ */
-+extern int ia_css_process_set_terminal_dependency(
-+	const ia_css_process_t *process,
-+	const unsigned int dep_index,
-+	const vied_nci_resource_id_t id);
-+
-+/*! Get n-th terminal dependency of a process object
-+
-+ @param	process[in]		Process object
-+ @param	terminal_num[in]	n-th cell
-+
-+ @return n-th terminal dependency,
-+	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_get_terminal_dependency(
-+	const ia_css_process_t *process,
-+	const unsigned int terminal_num);
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
-+	ia_css_process_t *process);
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
-+	ia_css_process_t *process);
-+#endif
-+
-+/*! Get the cells bitmap of the the process object
-+
-+ @param	process[in]	process object
-+
-+ @return process cells bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
-+	const ia_css_process_t *process);
-+
-+/*! Sets the dfm device resource allocation bitmap of
-+ * the process object
-+
-+ @param	process[in]	process object
-+ @param	dfm_dev_id[in]	dfm device id
-+ @param bitmap[in]	resource bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dfm_port_bitmap(
-+	ia_css_process_t *process,
-+	const vied_nci_dev_dfm_id_t dfm_dev_id,
-+	const vied_nci_resource_bitmap_t bitmap);
-+
-+/*! Sets the active dfm ports bitmap of
-+ * the process object
-+
-+ @param	process[in]	process object
-+ @param	dfm_dev_id[in]	dfm device id
-+ @param bitmap[in]	active ports bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dfm_active_port_bitmap(
-+	ia_css_process_t *process,
-+	const vied_nci_dev_dfm_id_t dfm_dev_id,
-+	const vied_nci_resource_bitmap_t bitmap);
-+
-+#if HAS_DFM
-+/*! Get the dfm port bitmap of the the process object
-+
-+ @param	process[in]	process object
-+ @param	dfm_res_id	dfm resource id
-+
-+ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
-+	const ia_css_process_t *process,
-+	vied_nci_dev_dfm_id_t  dfm_res_id);
-+#endif
-+/*! Get the dfm active port bitmap of the the process object
-+
-+ @param	process[in]	process object
-+ @param	dfm_res_id[in]	dfm resource id
-+
-+ @return bitmap of all active DFM ports used by the process, corresponding to the input
-+ dfm resource id
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
-+	const ia_css_process_t *process,
-+	vied_nci_dev_dfm_id_t  dfm_res_id);
-+
-+/*! Sets the cells bitmap of
-+ * the process object
-+
-+ @param	process[in]	process object
-+ @param bitmap[in]	bitmap
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_cells_bitmap(
-+	ia_css_process_t *process,
-+	const vied_nci_resource_bitmap_t bitmap);
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+/*! Get the device channel id-n resource allocation offset of the process object
-+
-+ @param	process[in]	process object
-+ @param	dev_chn_id[in]	channel id
-+
-+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_process_get_dev_chn(
-+	const ia_css_process_t *process,
-+	const vied_nci_dev_chn_ID_t dev_chn_id);
-+#endif
-+/*! Get the ext mem type-n resource id of the the process object
-+
-+ @param	process[in]	process object
-+ @param	mem_type[in]	mem type
-+
-+ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
-+	const ia_css_process_t *process,
-+	const vied_nci_mem_type_ID_t mem_type);
-+
-+/*! Sets the device channel id-n resource allocation offset of
-+ * the process object
-+
-+ @param	process[in]	process object
-+ @param	dev_chn_id[in]	channel id
-+ @param offset[in]	resource offset
-+
-+ @return < 0 on invalid argument(s) or process state
-+ */
-+int ia_css_process_set_dev_chn(
-+	ia_css_process_t *process,
-+	const vied_nci_dev_chn_ID_t dev_chn_id,
-+	const vied_nci_resource_size_t offset);
-+
-+/*! Boolean test if the process object type is valid
-+
-+ @param	process[in]	process object
-+ @param	p_manifest[in]	program manifest
-+
-+ @return true if the process object is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_process_valid(
-+	const ia_css_process_t *process,
-+	const ia_css_program_manifest_t *p_manifest);
-+
-+/*! Gets the program_idx from the process object
-+
-+ @param	process[in] process object
-+
-+ @return program index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_get_program_idx(
-+	const ia_css_process_t *process);
-+
-+/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
-+ * @param process[in] process object
-+ * @return process entension, NULL if there is none.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_ext_t *ia_css_process_get_extension(
-+	const ia_css_process_t *process);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
-new file mode 100644
-index 000000000000..0ffff491156a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
-@@ -0,0 +1,159 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
-+
-+/**
-+ * @file ia_css_psys_process.hsys.kernel.h
-+ *
-+ * Define the methods on the process object: Hsys kernel interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+/*
-+ * Internal resources
-+ */
-+
-+/*!
-+ * @brief Clear all resource (offset) specifications
-+ *
-+ * @param[in]	process				process object
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_all(ia_css_process_t *process);
-+
-+/*!
-+ * @brief Set the cell ID resource specification
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	cell_id				cell ID
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_cell(
-+	ia_css_process_t					*process,
-+	const vied_nci_cell_ID_t				cell_id);
-+
-+/*!
-+ * @brief Clear cell ID resource specification
-+ *
-+ * @param[in]	process				process object
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_cell(ia_css_process_t *process);
-+
-+/*!
-+ * @brief Set the memory resource (offset) specification for a memory
-+ * that belongs to the cell that is assigned to the process.
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	mem_type_id			mem type ID
-+ * @param[in]	offset				offset
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_int_mem(
-+	ia_css_process_t		*process,
-+	const	vied_nci_mem_type_ID_t	mem_type_id,
-+	const vied_nci_resource_size_t	offset);
-+
-+/*!
-+ * @brief Clear the memory resource (offset) specification for a memory
-+ * type that belongs to the cell that is assigned to the process.
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	mem_id				mem ID
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_int_mem(
-+	ia_css_process_t		*process,
-+	const vied_nci_mem_type_ID_t	mem_type_id);
-+
-+/*!
-+ * @brief Set the memory resource (offset) specification for a memory
-+ * that does not belong to the cell that is assigned to the process.
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	mem_type_id				mem type ID
-+ * @param[in]	offset				offset
-+ *
-+ * @pre The cell ID must be set
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_ext_mem(
-+	ia_css_process_t		*process,
-+	const vied_nci_mem_ID_t		mem_id,
-+	const vied_nci_resource_size_t	offset);
-+
-+/*!
-+ * @brief Clear the memory resource (offset) specification for a memory
-+ * type that does not belong to the cell that is assigned to the process.
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	mem_id				mem ID
-+ *
-+ * Precondition: The cell ID must be set
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_ext_mem(
-+	ia_css_process_t		*process,
-+	const vied_nci_mem_type_ID_t	mem_type_id);
-+
-+/*!
-+ * @brief Set a device channel resource (offset) specification.
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	dev_chn_id			device channel ID
-+ * @param[in]	offset				offset
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_set_dev_chn(
-+	ia_css_process_t		*process,
-+	const vied_nci_dev_chn_ID_t	dev_chn_id,
-+	const vied_nci_resource_size_t	offset);
-+
-+/*!
-+ * @brief Clear a device channel resource (offset) specification
-+ *
-+ * @param[in]	process				process object
-+ * @param[in]	dev_chn_id			device channel ID
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_kernel
-+ */
-+extern int ia_css_process_clear_dev_chn(
-+	ia_css_process_t		*process,
-+	const vied_nci_dev_chn_ID_t	dev_chn_id);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
-new file mode 100644
-index 000000000000..119ae30af523
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
-@@ -0,0 +1,94 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
-+
-+/**
-+ *  @file ia_css_psys_process.hsys.user.h
-+ *
-+ *  Define the methods on the process object: Hsys user interface
-+ */
-+
-+#include <ia_css_program_group_param.h>		/* ia_css_program_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>					/* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+
-+/*!
-+ * @brief Compute the size of storage required for allocating the process object.
-+ *
-+ * @param [in]	manifest			program manifest
-+ * @param [in]	param				program parameters
-+ *
-+ * @return 0 on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern size_t ia_css_sizeof_process(
-+	const ia_css_program_manifest_t			*manifest,
-+	const ia_css_program_param_t			*param);
-+
-+/*!
-+ * @brief Create the process object
-+ *
-+ * @param [in]	raw_mem				pre allocated memory
-+ * @param [in]	manifest			program manifest
-+ * @param [in]	param				program parameters
-+ *
-+ * @return NULL on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern ia_css_process_t *ia_css_process_create(
-+	void				*raw_mem,
-+	const ia_css_program_manifest_t	*manifest,
-+	const ia_css_program_param_t	*param,
-+	const uint32_t			program_idx);
-+
-+/*!
-+ * @brief Destroy (the storage of) the process object
-+ *
-+ * @param [in]	process				process object
-+ *
-+ * @return NULL
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern ia_css_process_t *ia_css_process_destroy(
-+	ia_css_process_t	*process);
-+
-+/*
-+ * Access functions
-+ */
-+
-+/*!
-+ * @brief Print the process object to file/stream
-+ *
-+ * @param [in]	process				process object
-+ * @param [out]	fid				file/stream handle
-+ *
-+ * @return < 0 on error
-+ * @ingroup group_psysapi_process_host_user
-+ */
-+extern int ia_css_process_print(
-+	const ia_css_process_t	*process,
-+	void			*fid);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
-new file mode 100644
-index 000000000000..fd1ca0c6d288
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
-@@ -0,0 +1,54 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
-+#define __IA_CSS_PSYS_PROCESS_PSYS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process.psys.h
-+ *
-+ * Define the methods on the process object: Psys embedded interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+/*
-+ * Process manager
-+ */
-+
-+/*! Acquire the resources specificed in process object
-+
-+ @param	process[in]				process object
-+
-+ Postcondition: This is a try process if any of the
-+ resources is not available, all succesfully acquired
-+ ones will be release and the function will return an
-+ error
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_acquire(ia_css_process_t *process);
-+
-+/*! Release the resources specificed in process object
-+
-+ @param	process[in]				process object
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_release(ia_css_process_t *process);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
-new file mode 100644
-index 000000000000..1966f6d31ebc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
-@@ -0,0 +1,487 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.h
-+ *
-+ * Define the methods on the process object that are not part of
-+ * a single interface
-+ */
-+#include "ia_css_rbm.h"
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_dynamic_storage_class.h>
-+
-+#include <type_support.h>					/* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_process_group.hsys.user.h>
-+
-+/*
-+ * Registration of user contexts / callback info
-+ * External resources
-+ * Sequencing resources
-+ */
-+#include <ia_css_psys_process_group.hsys.kernel.h>
-+
-+/*
-+ * Dispatcher
-+ */
-+#include <ia_css_psys_process_group.psys.h>
-+
-+/*
-+ * Access to sub-structure handles / fields
-+ */
-+
-+#include "ia_css_terminal.h"
-+
-+#include "ia_css_terminal_manifest_base_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+/*! Get the number of fragments on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ Note: Future change is to have a fragment count per
-+ independent subgraph
-+
-+ @return the fragment count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_process_group_get_fragment_count(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the fragment state on the process group
-+
-+ @param	 process_group[in]		process group object
-+ @param	 fragment_state[in]		current fragment of processing
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_get_fragment_state(
-+	const ia_css_process_group_t		*process_group,
-+	uint16_t				*fragment_state);
-+
-+/*! Set the fragment state on the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	fragment_state[in]		current fragment of processing
-+
-+ @return -1 on error
-+  */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_fragment_state(
-+	ia_css_process_group_t			*process_group,
-+	uint16_t				fragment_state);
-+
-+/*! Get the number of processes on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return the process count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_process_count(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the number of terminals on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ Note: Future change is to have a terminal count per
-+ independent subgraph
-+
-+ @return the terminal count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_terminal_count(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the PSYS server init time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PSYS server init time, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_psys_server_init_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! \deprecated this is old and will get removed */
-+/*! Get the PG load start timestamp
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG load start timestamp, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_load_start_ts(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the PG load time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG load time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_load_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the PG init time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG init time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_init_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the PG processing time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_processing_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the PG next frame init time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the PG complete time in cycles
-+
-+ @param	process_group[in]		process group object
-+
-+ @return PG processing time in cycles, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_get_pg_complete_cycles(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Get the (pointer to) the <terminal type> terminal of the process group object
-+
-+ @param	process_group[in]               process group object
-+ @param	terminal_type[in]               terminal type of terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
-+		const ia_css_process_group_t *process_group,
-+		const ia_css_terminal_type_t terminal_type);
-+
-+/*! Get the (pointer to) the <terminal type> terminal of the process group object
-+ * for terminals which have only a single instance
-+ * (cached in, cached out, program, program_ctrl_init)
-+
-+ @param	process_group[in]               process group object
-+ @param	terminal_type[in]               terminal type of terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
-+	const ia_css_process_group_t 	*process_group,
-+	ia_css_terminal_type_t		term_type);
-+
-+/*! Get the (pointer to) the manifest indexed terminal of the process group object
-+
-+ @param	process_group[in]		process group object
-+ @param	manifest_idx[in]		index of the terminal in manifest
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
-+	const ia_css_process_group_t *process_grp,
-+	const unsigned int manifest_idx);
-+
-+/*! Get the (pointer to) the indexed terminal of the process group object
-+
-+ @param	process_group[in]		process group object
-+ @param	terminal_index[in]		index of the terminal
-+
-+ @return the pointer to the terminal, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_t *ia_css_process_group_get_terminal(
-+	const ia_css_process_group_t		*process_group,
-+	const unsigned int			terminal_index);
-+
-+/*! Get the (pointer to) the indexed process of the process group object
-+
-+ @param	process_group[in]		process group object
-+ @param	process_index[in]		index of the process
-+
-+ @return the pointer to the process, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_t *ia_css_process_group_get_process(
-+	const ia_css_process_group_t		*process_group,
-+	const unsigned int			process_index);
-+
-+/*! Get the stored size of the process group object
-+
-+ @param	process_group[in]				process group object
-+
-+ @return size, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_process_group_get_size(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the state of the the process group object
-+
-+ @param	process_group[in]		process group object
-+
-+ @return state, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_state_t ia_css_process_group_get_state(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the unique ID of program group used by the process group object
-+
-+ @param	process_group[in]		process group object
-+
-+ @return ID, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Get the resource bitmap of the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return the reource bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
-+	const ia_css_process_group_t		*process_group);
-+
-+/*! Set the resource bitmap of the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	resource_bitmap[in]		the resource bitmap
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_resource_bitmap(
-+	ia_css_process_group_t			*process_group,
-+	const vied_nci_resource_bitmap_t	resource_bitmap);
-+
-+/*! Get the kernel bitmap of the the process group object
-+
-+ @param	process_group[in] process group object
-+
-+ @return process group kernel bitmap
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
-+	const ia_css_process_group_t *process_group);
-+
-+/*! Get the routing bitmap of the process group
-+
-+ @param	process_group[in]   process group object
-+
-+ @return routing bitmap (pointer)
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
-+	const ia_css_process_group_t *process_group);
-+
-+/*! Set the routing bitmap of the process group
-+
-+ @param	process_group[in]   process group object
-+ @param	rbm[in]		        routing bitmap
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_routing_bitmap(
-+	ia_css_process_group_t *process_group,
-+	const ia_css_rbm_t rbm);
-+
-+/*! Get IPU virtual address of process group
-+
-+ @param	 process_group[in]		process group object
-+ @param	 ipu_vaddress[in/out]	process group ipu virtual address
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_get_ipu_vaddress(
-+	const ia_css_process_group_t		*process_group,
-+	vied_vaddress_t			*ipu_vaddress);
-+
-+/*! Set IPU virtual address of process group
-+
-+ @param	process_group[in]		process group object
-+ @param	ipu_vaddress[in]		process group ipu address
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_ipu_vaddress(
-+	ia_css_process_group_t			*process_group,
-+	vied_vaddress_t			ipu_vaddress);
-+
-+/*! Get protocol version used by a process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return invalid protocol version on error
-+
-+ @todo Add new protocol version for IPU7.  Defer this for now,
-+ because it will create a LOT of disruption.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_protocol_version(
-+	const ia_css_process_group_t *process_group);
-+
-+/*! Get base queue id used by a process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_base_queue_id(
-+	ia_css_process_group_t *process_group);
-+
-+/*! Set base queue id used by a process group
-+
-+ @param	process_group[in]		process group object
-+ @param	queue_id[in]			process group queue id
-+
-+ @return invalid queue id on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_base_queue_id(
-+	ia_css_process_group_t *process_group,
-+	uint8_t queue_id);
-+
-+/*! Get number of queues used by a process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return invalid number of queues (0) on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_num_queues(
-+	ia_css_process_group_t *process_group);
-+
-+/*! Set number of queues used by a process group
-+
-+ @param	process_group[in]		process group object
-+ @param	num_queues[in]			process group number of queues
-+
-+ @return -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_num_queues(
-+	ia_css_process_group_t *process_group,
-+	uint8_t num_queues);
-+
-+/*! Set error handling enable flag used by process group
-+
-+ @param	process_group[in]		process group object
-+ @param	error_handling_enable[in]	flag to control error handling
-+
-+ @return -1 on error, 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_error_handling_enable(
-+	ia_css_process_group_t *process_group,
-+	const bool error_handling_enable);
-+
-+/*! Get the error handling enable flag associated to the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_process_group_get_error_handling_enable(
-+	const ia_css_process_group_t *process_group);
-+
-+/** Return true if the process group requires vector processor (i.e. DSP)
-+ *  resources  */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
-+
-+/*! Check if terminal is enabled based on kernel enable bitmap
-+
-+ @param	terminal_manifest[in]		terminal manifest object
-+ @param	enable_bitmap[in]		kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_terminal_enabled(
-+	const ia_css_terminal_manifest_t *terminal_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Check if data terminal is enabled based on kernel enable bitmap
-+
-+ @param	data_term_manifest[in]		data terminal manifest object
-+ @param	enable_bitmap[in]		kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_data_terminal_enabled(
-+	const ia_css_data_terminal_manifest_t	*data_term_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Check if spatial terminal is enabled based on kernel enable bitmap
-+
-+ @param	spatial_term_man[in]	spatial	terminal manifest object
-+ @param	enable_bitmap[in]		kernel enable bitmap
-+
-+ @return true if enabled, false if not enabled
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_process_group_is_spatial_terminal_enabled(
-+	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
-+	ia_css_kernel_bitmap_t enable_bitmap);
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_group_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
-new file mode 100644
-index 000000000000..87f127c8ed76
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
-@@ -0,0 +1,379 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.hsys.kernel.h
-+ *
-+ * Define the methods on the process group object: Hsys kernel interface
-+ *
-+ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
-+ *  defines the functions required to manage the lifetime of a process group.
-+ *
-+ * Sequence for settup up and queueing processing tasks with a persistent program group
-+ * to IPU is:
-+ *
-+ * # Get Program Group manifest by ID
-+ * # Create process group object based on that program group manifest
-+ * # Configure process group
-+ * ## Set kernel and terminal enables
-+ * ## Set terminal attributes
-+ * # Submit processs group
-+ * # Start process group
-+ * # Disown process group
-+ * # Frame/Fragment processing loop
-+ * ## Enqueue buffer sets - This sends the terminal buffers to FW
-+ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
-+ * process group will process any available buffer sets until suspended or stopped, pending
-+ * available resources.
-+ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
-+ * processing of one group, which allows another PG to run with the same resources. Buffer
-+ * sets for the suspended PG may continue to be queued, but will not be processed until
-+ * the PG is resumed.  The decision when to suspend/resume is scheduling.
-+ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
-+ *
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+#include <ia_css_psys_buffer_set.h>
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>					/* uint8_t */
-+
-+/*
-+ * Registration of user contexts / callback info
-+ */
-+
-+/*! Get the user (callback) token as registered in the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @return 0 on error
-+ */
-+extern uint64_t ia_css_process_group_get_token(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Set (register) a user (callback) token in the process group
-+
-+ The token value shall be non-zero. This token is
-+ returned in each return message related to the process
-+ group the token is registered with.
-+
-+ @param	process_group[in]		process group object
-+ @param	token[in]				user token
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_set_token(
-+	ia_css_process_group_t					*process_group,
-+	const uint64_t							token);
-+
-+/*
-+ * Passing of a (fragment) watermark
-+ */
-+
-+/*! Get the fragment progress limit of the process group
-+
-+ @see ia_css_process_group_set_fragment_limit()
-+
-+ @param	process_group[in]		process group object
-+
-+ @return 0 on error
-+
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_process_group_get_fragment_limit(
-+	const ia_css_process_group_t				*process_group);
-+
-+/*! Set the new fragment progress limit of the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	fragment_limit[in]		New limit value
-+
-+ @note The limit value must be less or equal to the fragment
-+ count value. The process group will not make progress beyond
-+ the limit value. The limit value can be modified asynchronously
-+ If the limit value is reached before an update happens, the
-+ process group will suspend and will not automatically resume.
-+
-+ The limit is monotonically increasing. The default value is
-+ equal to the fragment count
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_fragment_limit(
-+	ia_css_process_group_t				*process_group,
-+	const uint16_t					fragment_limit);
-+
-+/*! Clear the fragment progress limit of the process group
-+
-+ @see ia_css_process_group_set_fragment_limit()
-+
-+ @param	process_group[in]		process group object
-+
-+ @note This function sets the fragment limit to zero.
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_clear_fragment_limit(
-+	ia_css_process_group_t					*process_group);
-+
-+/*
-+ * Commands
-+ */
-+
-+/*! Perform the start command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Start is an action of the l-Scheduler it makes the
-+ process group eligible for execution.
-+ For PPG's, execution will not occur until the resume
-+ command is issued.  See ia_css_process_group_resume()
-+
-+ @par For persistent program/process groups () the start
-+ command must be called once per stream instance,
-+ at stream creation.
-+
-+ @par Precondition: The external resources that are attached to
-+ the process group must be in the correct state, i.e. input
-+ buffers are not-empty and output buffers not-full
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_start(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Perform the suspend command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Suspend indicates that the process group execution
-+ is halted at the next fragment boundary. The process group
-+ will not automatically resume
-+
-+ @par Precondition: The process group must be running
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_suspend(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Perform the resume command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Resume indicates that the process group is again
-+ eligible for execution
-+
-+ @par Precondition: The process group must be started
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_resume(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Perform the reset command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Return the process group to the started state
-+
-+ @par Precondition: The process group must be running or stopped
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_reset(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Perform the abort command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Force the process group to the stopped state
-+
-+ @par Precondition: The process group must be running or started
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_abort(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Release ownership of the process group
-+
-+  For PPG's, this is the last step required before buffer
-+  sets can be enqueued.
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Release notifies PSYS and hands over ownership of the
-+ process group from SW to FW.
-+
-+ @par Precondition: The process group must be in the started state
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_disown(
-+	ia_css_process_group_t					*process_group);
-+
-+/*
-+ * External resources
-+ */
-+
-+/*! Set (register) a data buffer to the indexed terminal in the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	buffer[in]			buffer handle
-+ @param	buffer_state[in]		state of the buffer
-+ @param	terminal_index[in]		index of the terminal
-+
-+ @note For legacy program groups (== non-PPG), the buffer handle
-+ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
-+
-+ @par For PPG's, buffer is ignored as the buffers will be sent
-+ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
-+ called before ia_css_process_group_submit() as sets up some internal bookeeping.
-+
-+ @note The buffer can be in memory or streaming over memory
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_attach_buffer(
-+	ia_css_process_group_t			*process_group,
-+	vied_vaddress_t				buffer,
-+	const ia_css_buffer_state_t		buffer_state,
-+	const unsigned int			terminal_index);
-+
-+/*! Get (unregister) the data buffer on the indexed terminal of
-+ * the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	terminal_index[in]		index of the terminal
-+
-+ @note Precondition: The process group must be stopped
-+
-+ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
-+ state to BUFFER_NULL
-+
-+ @par This function is meaningless for PPG's
-+
-+ @return VIED_NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t ia_css_process_group_detach_buffer(
-+	ia_css_process_group_t			*process_group,
-+	const unsigned int			terminal_index);
-+
-+/*! Set (register) a data buffer to the indexed terminal in the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	stream[in]				stream handle
-+ @param	buffer_state[in]		state of the buffer
-+ @param	terminal_index[in]		index of the terminal
-+
-+ @note The stream handle shall not be zero, the buffer
-+ state can be undefined; BUFFER_UNDEFINED
-+
-+ @note The stream is used exclusive to a buffer; the latter can be in memory
-+ or streaming over memory
-+
-+ @todo Unclear what this function is for.  Clarify!
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_attach_stream(
-+	ia_css_process_group_t			*process_group,
-+	uint32_t				stream,
-+	const ia_css_buffer_state_t		buffer_state,
-+	const unsigned int			terminal_index);
-+
-+/*! Get (unregister) the stream handle on the indexed terminal of
-+ * the process group
-+
-+ @param	process_group[in]		process group object
-+ @param	terminal_index[in]		index of the terminal
-+
-+ @par Precondition: The process group must be stopped
-+
-+ @par Postcondition: The stream handle shall be reset to zero, the buffer
-+ state to BUFFER_NULL
-+
-+ @todo Unclear what this function is for.  Clarify!
-+
-+ @return 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_detach_stream(
-+	ia_css_process_group_t			*process_group,
-+	const unsigned int			terminal_index);
-+
-+/*
-+ * Sequencing resources
-+ */
-+
-+/*! Set (an artificial) blocking resource (barrier) in
-+ * the process group resource map
-+
-+ @param	process_group[in]		process group object
-+ @param	barrier_index[in]		index of the barrier
-+
-+ @note The barriers have to be set to force sequence between started
-+ process groups
-+
-+ @return < 0 on error
-+
-+ @todo Seems this function no longer has any use.  Clarify!
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_barrier(
-+	ia_css_process_group_t					*process_group,
-+	const vied_nci_barrier_ID_t				barrier_index);
-+
-+/*! Clear a previously set blocking resource (barrier) in
-+ * the process group resource map
-+
-+ @param	process_group[in]		process group object
-+ @param	barrier_index[in]		index of the barrier
-+
-+ @par Precondition: The barriers must have been set
-+
-+ @return < 0 on error
-+
-+ @todo Seems this function no longer has any use.  Clarify!
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_clear_barrier(
-+	ia_css_process_group_t					*process_group,
-+	const vied_nci_barrier_ID_t				barrier_index);
-+
-+/*! Boolean test if the process group preconditions for start are satisfied
-+
-+ @param	process_group[in]		process group object
-+
-+ @return true if the process group can be started
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_process_group_start(
-+	const ia_css_process_group_t			*process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
-new file mode 100644
-index 000000000000..fcae13370148
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
-@@ -0,0 +1,224 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.hsys.user.h
-+ *
-+ * Define the methods on the process group object: Hsys user interface
-+ *
-+ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
-+ *  defines the functions required to manage the lifetime of a process group.
-+ */
-+
-+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_buffer_set.h>
-+
-+#include "ia_css_psys_dynamic_storage_class.h"
-+
-+#include <type_support.h>					/* uint8_t */
-+
-+/*
-+ * Creation
-+ */
-+
-+/*! Compute the size of storage required for allocating the process group object
-+
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]			program group parameters
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_process_group(
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t	*param);
-+
-+/*! Checks whether a certain program is enabled.
-+ *   FUNCTION IS PRIVATE TO THIS MODULE
-+
-+ @param	program_manifest[in] program manifest
-+ @param	enable_bitmap[in]   kernel enable bitmap corresponding to process group
-+
-+ @return true if program is enabled (and process will be instantiated)
-+ */
-+extern bool ia_css_process_group_is_program_enabled(
-+	const ia_css_program_manifest_t *program_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap);
-+
-+/*! Create (the storage for) the process group object
-+
-+ @param	process_grp_mem[in/out]	raw memory for process group
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]			program group parameters
-+
-+ @return NULL on error
-+ */
-+extern ia_css_process_group_t *ia_css_process_group_create(
-+	void					*process_grp_mem,
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t	*param);
-+
-+/*! Destroy (the storage of) the process group object
-+
-+ @param	process_group[in]		process group object
-+
-+ @return NULL
-+ */
-+extern ia_css_process_group_t *ia_css_process_group_destroy(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Print the process group object to file/stream in
-+  textual format
-+
-+ @param	process_group[in]		process group object
-+ @param	fid[out]				file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_print(
-+	const ia_css_process_group_t		*process_group,
-+	void					*fid);
-+
-+/*
-+ * Commands
-+ */
-+
-+/*! Perform the submit command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ @note Submit is an action of the h-Scheduler it makes the
-+ process group eligible for the l-Scheduler
-+
-+ @par Precondition : The external resources must be attached to
-+ the process group
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_submit(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Boolean test if the process group object type is valid
-+
-+ @param	process_group[in]		process group object
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]				program group parameters
-+
-+ @return true if the process group is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_process_group_valid(
-+	const ia_css_process_group_t		*process_group,
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t	*param);
-+
-+/*! Boolean test if the process group preconditions for submit are satisfied
-+
-+ @param	process_group[in]		process group object
-+
-+ @return true if the process group can be submitted
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_process_group_submit(
-+	const ia_css_process_group_t			*process_group);
-+
-+/*! Boolean test if the preconditions on process group and buffer set are
-+    satisfied for enqueuing buffer set
-+
-+ @param	process_group[in]		process group object
-+ @param	buffer_set[in]			buffer set object
-+
-+ @return true if the buffer set can be enqueued
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_can_enqueue_buffer_set(
-+	const ia_css_process_group_t			*process_group,
-+	const ia_css_buffer_set_t			*buffer_set);
-+
-+/*! Compute the cyclecount required for executing the process group object
-+
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]				program group parameters
-+
-+ @return 0 on error
-+
-+ @note Current implementation is trivial
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_process_group_compute_cycle_count(
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t	*param);
-+
-+/*! Compute the number of processes required for
-+ * executing the process group object
-+
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]				program group parameters
-+
-+ @return 0 on error
-+ */
-+extern uint8_t ia_css_process_group_compute_process_count(
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Compute the number of terminals required for
-+ * executing the process group object
-+
-+ @param	manifest[in]			program group manifest
-+ @param	param[in]				program group parameters
-+
-+ @return 0 on error
-+ */
-+extern uint8_t ia_css_process_group_compute_terminal_count(
-+	const ia_css_program_group_manifest_t	*manifest,
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Get private token as registered in the process group by the implementation
-+
-+ @note The token value shall be non-zero. This token is private
-+ to the implementation. This is in addition to the user token.
-+ See ia_css_process_group_set_token()
-+
-+ @param	process_group[in]		process group object
-+
-+ @return 0 on error
-+ */
-+extern uint64_t ia_css_process_group_get_private_token(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Set private token in the process group as needed by the implementation
-+
-+ @param	process_group[in]		process group object
-+ @param	token[in]				user token
-+
-+ @note The token value shall be non-zero. This token is private
-+ to the implementation. This is in addition to the user token.
-+ see ia_css_process_group_get_token()
-+
-+ @return < 0 on error, 0 on success
-+ */
-+extern int ia_css_process_group_set_private_token(
-+	ia_css_process_group_t					*process_group,
-+	const uint64_t							token);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
-new file mode 100644
-index 000000000000..a1c47ae83066
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
-@@ -0,0 +1,61 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_group.psys.h
-+ *
-+ * Define the methods on the process group object: Psys embedded interface
-+ */
-+
-+#include <ia_css_psys_process_types.h>
-+
-+/*
-+ * Dispatcher
-+ */
-+
-+/*! Perform the run command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ Note: Run indicates that the process group will execute
-+
-+ Precondition: The process group must be started or
-+ suspended and the processes have acquired the necessary
-+ internal resources
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_run(
-+	ia_css_process_group_t					*process_group);
-+
-+/*! Perform the stop command on the process group
-+
-+ @param	process_group[in]		process group object
-+
-+ Note: Stop indicates that the process group has completed execution
-+
-+ Postcondition: The external resoruces can now be detached
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_stop(
-+	ia_css_process_group_t					*process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
-new file mode 100644
-index 000000000000..ea4464e13d9c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
-@@ -0,0 +1,280 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
-+
-+#include "type_support.h"
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+#define N_UINT64_IN_PROCESS_GROUP_STRUCT	2
-+#define N_UINT32_IN_PROCESS_GROUP_STRUCT	8
-+#define N_UINT16_IN_PROCESS_GROUP_STRUCT	5
-+#define N_UINT8_IN_PROCESS_GROUP_STRUCT		8
-+#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT	2
-+
-+#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
-+	(IA_CSS_RBM_BITS \
-+	+ IA_CSS_KERNEL_BITMAP_BITS \
-+	+ N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
-+	+ N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_PROGRAM_GROUP_ID_BITS \
-+	+ IA_CSS_PROCESS_GROUP_STATE_BITS \
-+	+ VIED_VADDRESS_BITS \
-+	+ VIED_NCI_RESOURCE_BITMAP_BITS \
-+	+ N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
-+	+ N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/** Process group object describing an instance of a Program Group
-+ *
-+ *  This is the root structure passed in a number of PG commands via
-+ *  the syscom queuing interface to firmware from the host.  A pointer
-+ *  to this structure in main memroy is passed in the following
-+ *  PG commands: start, resume, suspend, stop, abort.
-+ *
-+ *  A process group is created based on a program group specification
-+ *  described in the program group manifest.  Briefly, a program group
-+ *  contains programs which in turn contain kernels.  A program group
-+ *  also has terminals, which connect it to the outside world.  Each
-+ *  terminal represents either parameters or image data flowing in or
-+ *  out of the group.  Terminals come in different types and may have
-+ *  addtional attributes.  For example, a data termainal will have
-+ *  a frame format attribute.
-+ *  @see ia_css_process_group_create()
-+ *  @see ia_css_program_group_manifest_t and related API and:
-+ *  @see ia_css_pkg_dir_entry_get_type() and
-+ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
-+ *  ia_css_pkg_dir* functions) for how to get the program group manifest
-+ *  array from the binary release package.
-+ *
-+ *  @note Some of the fields within are used internally within the
-+ *  firmware only, after the firmware copies the process group structure
-+ *  to its internel cache.  The original in main memory is not updated.
-+ *  All such fields should be initialized to zero, unless otherwise
-+ *  noted.
-+ *  See the individual field descriptions for which fields are "internal".
-+ */
-+struct ia_css_process_group_s {
-+	/** User (callback) token / user context reference,
-+	 * zero is an error value
-+	 */
-+	uint64_t token;
-+	/** private token / context reference, zero is an error value */
-+	uint64_t private_token;
-+	/** PG routing bitmap used to set connection between program group
-+	 *  components */
-+	ia_css_rbm_t routing_bitmap;
-+	/** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
-+	 *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
-+	ia_css_kernel_bitmap_t kernel_bitmap;
-+	/** Size of this structure in bytes */
-+	uint32_t size;
-+	/** The timestamp when PG load starts
-+	 *  @note Internal firmware use only. */
-+	/**< PSYS server init time in cycless */
-+	uint32_t psys_server_init_cycles;
-+	/**< The timestamp when PG load starts */
-+	uint32_t pg_load_start_ts;
-+	/** PG load time in cycles
-+	 *  @note Internal firmware use only. */
-+	uint32_t pg_load_cycles;
-+	/** PG init time in cycles
-+	 *  @note Internal firmware use only. */
-+	uint32_t pg_init_cycles;
-+	/** PG processing time in cycles
-+	 *  @note Internal firmware use only. */
-+	uint32_t pg_processing_cycles;
-+	/** Referral ID to program group FW.  This identifies the "type" of the process group
-+	 *  and associcates the process group with the program group defined in the manifest. */
-+	/**< PG next frame init time in cycles */
-+	uint32_t pg_next_frame_init_cycles;
-+	/**< PG complete time in cycles */
-+	uint32_t pg_complete_cycles;
-+	/**< Referral ID to program group FW */
-+	ia_css_program_group_ID_t ID;
-+	/** State of the process group FSM */
-+	ia_css_process_group_state_t state;
-+	/** Virtual address of process group in the IPU address space */
-+	vied_vaddress_t ipu_virtual_address;
-+	/** Bitmap of the compute resources used by the process group  */
-+	vied_nci_resource_bitmap_t resource_bitmap;
-+	/** Number of fragments offered on each terminal */
-+	uint16_t fragment_count;
-+	/** Current fragment of processing */
-+	uint16_t fragment_state;
-+	/** Watermark to control fragment processing.  Set to the same value as "fragment_count"
-+	 *  unless you know what you are doing.
-+	 *  @see  fragment_count in this structure. */
-+	uint16_t fragment_limit;
-+	/** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
-+	 *  Must be aligned to a 64 bit boundary.
-+	 *  process_offset_table is an array of size "process_count", containing offsets to process objects
-+	 *  (each an instance of ia_css_process_t) belonging to this process group.
-+	 *  @see process_count in this structure.
-+	 *
-+	 *  Usually follows this process group structure. */
-+	uint16_t processes_offset;
-+	/** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
-+	 *  Must be aligned to a 64 bit boundary.
-+	 *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
-+	 *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
-+	 *  @see terminal_count in this structure.
-+	 *
-+	 *  Usually follows process_offset_table, aligned to 64-bit boundary. */
-+	uint16_t terminals_offset;
-+	/** Parameter dependent number of processes in this process group, determined at process
-+	 *  group creation taking into account the enabled kernels. That is, if all of a program's
-+	 *  associcated kernels are disabled, then no process is instantiated for that program and
-+	 *  it must not be counted in the process count.
-+	 *
-+	 *  @see processes_offset in this structure
-+	 *  @see ia_css_program_group_manifest_get_program_count()
-+	 *  @see ia_css_program_manifest_get_kernel_bitmap()
-+	 *  @see ia_css_process_group_compute_process_count() */
-+	uint8_t process_count;
-+	/** Parameter dependent number of terminals on this process group, determined at process
-+	 *  group creation.  Must not be greater than the terminal count as defined in the manifest,
-+	 *  but taking into account the enabled kernels.  That is, for those terminal types that have
-+	 *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
-+	 *  Execptions by terminal type:
-+	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
-+	 *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
-+	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
-+	 *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
-+	 *
-+	 *  @see terminals_offset in this structure
-+	 *  @see ia_css_program_group_manifest_get_terminal_count()
-+	 *  @see ia_css_program_manifest_get_kernel_bitmap()
-+	 *  @see ia_css_process_group_is_terminal_enabled()
-+	 *  @see ia_css_process_group_compute_terminal_count() */
-+	uint8_t terminal_count;
-+	/** Parameter dependent number of independent subgraphs in
-+	 * this process group.
-+	 * @note Apparently no longer used.
-+	 */
-+	uint8_t subgraph_count;
-+	/** Process group protocol version.  Identifies the state machine and
-+	 *  message protocol for this process group. */
-+	uint8_t protocol_version;
-+	/** Dedicated base queue id used for enqueueing payload buffer sets.
-+	 *  Each buffer set is either a frame (or fragment) processing request,
-+	 *  or an opportunistic parameter update (AKA "late binding")
-+	 *  This queue is enabled once the process group start command has
-+	 *  been issued. */
-+	uint8_t base_queue_id;
-+	/** Number of dedicated queues used */
-+	uint8_t num_queues;
-+	/**< Mask the send_pg_done IRQ */
-+	uint8_t mask_irq;
-+	/** Error handling enable\disable flag */
-+	uint8_t error_handling_enable;
-+#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
-+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
-+#endif
-+};
-+
-+/*! Callback after process group is created. Implementations can provide
-+ * suitable actions needed when process group is created.
-+
-+ @param	process_group[in]			process group object
-+ @param	program_group_manifest[in]		program group manifest
-+ @param	program_group_param[in]			program group parameters
-+
-+ @return 0 on success and non-zero on failure
-+ */
-+extern int ia_css_process_group_on_create(
-+	ia_css_process_group_t			*process_group,
-+	const ia_css_program_group_manifest_t	*program_group_manifest,
-+	const ia_css_program_group_param_t	*program_group_param);
-+
-+/*! Callback before process group is about to be destoyed. Any implementation
-+ * specific cleanups can be done here.
-+
-+ @param	process_group[in]				process group object
-+
-+ @return 0 on success and non-zero on failure
-+ */
-+extern int ia_css_process_group_on_destroy(
-+	ia_css_process_group_t					*process_group);
-+
-+/*
-+ * Command processor
-+ */
-+
-+/*! Execute a command locally or send it to be processed remotely
-+
-+ @param	process_group[in]		process group object
-+ @param	cmd[in]					command
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_process_group_exec_cmd(
-+	ia_css_process_group_t				*process_group,
-+	const ia_css_process_group_cmd_t		cmd);
-+
-+/*! Enqueue a buffer set corresponding to a persistent program group by
-+ * sending a command to subsystem.
-+
-+ @param	process_group[in]		process group object
-+ @param	buffer_set[in]			buffer set
-+ @param	queue_offset[in]		offset to be used from the queue id
-+					specified in the process group object
-+					(0 for first buffer set for frame, 1
-+					for late binding)
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_enqueue_buffer_set(
-+	ia_css_process_group_t				*process_group,
-+	ia_css_buffer_set_t				*buffer_set,
-+	unsigned int					queue_offset);
-+
-+/*! Enqueue a parameter buffer set corresponding to a persistent program
-+ *  group by sending a command to subsystem.  This allows for
-+    opportunistic late parameters update, AKA "late binding".
-+
-+ @param	process_group[in]		process group object
-+ @param	buffer_set[in]			parameter buffer set
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_enqueue_param_buffer_set(
-+	ia_css_process_group_t				*process_group,
-+	ia_css_buffer_set_t				*buffer_set);
-+
-+/*! Need to store the 'secure' mode for each PG for FW test app only
-+ *
-+ * @param	process_group[in]		process group object
-+ * @param	secure[in]			parameter buffer set
-+ *
-+ * @return < 0 on error
-+ */
-+extern int ia_css_process_group_store(
-+	ia_css_process_group_t				*process_group,
-+	bool						secure);
-+
-+/*! Need to get the right context for each PG for FW test app only
-+ *
-+ * @param	process_group[in]		process group object
-+ *
-+ * @return	psys_syscom context
-+ */
-+extern struct ia_css_syscom_context *ia_css_process_group_get_context(
-+	ia_css_process_group_t *process_group);
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
-new file mode 100644
-index 000000000000..5e074b71f932
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
-@@ -0,0 +1,1846 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
-+
-+#include <ia_css_psysapi_fw_version.h>
-+#include <ia_css_psys_process_group.h>
-+#include "ia_css_psys_process_group_cmd_impl.h"
-+#include <ia_css_psys_terminal.h>
-+#include <ia_css_psys_transport.h>
-+#include <ia_css_psys_process.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include "ia_css_rbm.h"
-+
-+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
-+
-+#include <vied_nci_psys_system_global.h>
-+#include <ia_css_program_group_data.h>
-+#include "ia_css_rbm_manifest_types.h"
-+#include <type_support.h>
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <math_support.h>
-+
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_terminal_manifest.h"
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_data_terminal_enabled(
-+	const ia_css_data_terminal_manifest_t	*data_term_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+	bool is_terminal_enabled = false;
-+
-+	ia_css_kernel_bitmap_t term_bitmap =
-+		ia_css_data_terminal_manifest_get_kernel_bitmap(
-+				data_term_manifest);
-+	/*
-+	 * Terminals depend on a kernel,
-+	 * if the kernel is present the program it contains and
-+	 * the terminal the program depends on are active
-+	 */
-+	is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
-+			enable_bitmap,
-+			term_bitmap);
-+	return is_terminal_enabled;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_spatial_terminal_enabled(
-+	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
-+	ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+	bool is_terminal_enabled = false;
-+	ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+
-+	term_kernel_bitmap =
-+		ia_css_kernel_bitmap_set(
-+			term_kernel_bitmap,
-+			spatial_term_man->kernel_id);
-+	is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+			enable_bitmap, term_kernel_bitmap);
-+	return is_terminal_enabled;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_is_terminal_enabled(
-+	const ia_css_terminal_manifest_t *terminal_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+	ia_css_terminal_type_t terminal_type;
-+	bool is_terminal_enabled = false;
-+
-+	verifjmpexit(NULL != terminal_manifest);
-+	terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
-+
-+	if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
-+		ia_css_data_terminal_manifest_t	*data_term_manifest =
-+						(ia_css_data_terminal_manifest_t *)terminal_manifest;
-+		is_terminal_enabled =
-+				ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
-+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+				terminal_manifest)) {
-+		ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
-+			(ia_css_spatial_param_terminal_manifest_t *)
-+			terminal_manifest;
-+		 is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
-+			enable_bitmap);
-+	} else if (ia_css_is_terminal_manifest_parameter_terminal(
-+			terminal_manifest) && terminal_type ==
-+			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
-+		/*
-+		 * For parameter out and program control terminals, we
-+		 * disable the terminals if ALL the corresponding kernels
-+		 * are disabled, for parameter in terminals we cannot do this;
-+		 * even if kernels are disabled, it may be required that
-+		 * (HW) parameters must be supplied via the parameter
-+		 * in terminal (e.g. bypass bits).
-+		 */
-+		is_terminal_enabled = true;
-+
-+	} else if (ia_css_is_terminal_manifest_parameter_terminal(
-+			terminal_manifest) && terminal_type ==
-+			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+		ia_css_param_terminal_manifest_t *param_term_man =
-+			(ia_css_param_terminal_manifest_t *)terminal_manifest;
-+		ia_css_param_manifest_section_desc_t *section_desc;
-+		unsigned int section = 0;
-+		uint8_t kernel_id;
-+
-+		for (section = 0; section < param_term_man->
-+				param_manifest_section_desc_count; section++) {
-+			section_desc =
-+		ia_css_param_terminal_manifest_get_prm_sct_desc(
-+						param_term_man, section);
-+			verifjmpexit(section_desc != NULL);
-+			kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
-+			term_kernel_bitmap = ia_css_kernel_bitmap_set(
-+					term_kernel_bitmap,
-+					kernel_id);
-+		}
-+
-+		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+					enable_bitmap, term_kernel_bitmap);
-+	} else if (ia_css_is_terminal_manifest_program_terminal(
-+				terminal_manifest)) {
-+		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
-+		ia_css_program_terminal_manifest_t *prog_term_man =
-+			(ia_css_program_terminal_manifest_t *)terminal_manifest;
-+		unsigned int section = 0;
-+
-+		for (section = 0;
-+			section < prog_term_man->fragment_param_manifest_section_desc_count;
-+			section++) {
-+			ia_css_fragment_param_manifest_section_desc_t *desc =
-+				ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+					prog_term_man,
-+					section);
-+			verifjmpexit(desc != NULL);
-+
-+			term_kernel_bitmap = ia_css_kernel_bitmap_set(
-+					term_kernel_bitmap,
-+					ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
-+		}
-+
-+		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
-+					enable_bitmap, term_kernel_bitmap);
-+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+				terminal_manifest)) {
-+		is_terminal_enabled = true;
-+	}
-+	return is_terminal_enabled;
-+EXIT:
-+	return false;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_process_group_get_fragment_limit(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint16_t fragment_limit = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_fragment_limit(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	fragment_limit = process_group->fragment_limit;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_limit invalid argument\n");
-+	}
-+	return fragment_limit;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_fragment_limit(
-+	ia_css_process_group_t *process_group,
-+	const uint16_t fragment_limit)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	uint16_t fragment_state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_fragment_limit(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	retval = ia_css_process_group_get_fragment_state(process_group,
-+		&fragment_state);
-+
-+	verifexitval(retval == 0, EINVAL);
-+	verifexitval(fragment_limit > fragment_state, EINVAL);
-+	verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
-+				process_group), EINVAL);
-+
-+	process_group->fragment_limit = fragment_limit;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_limit invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_limit failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_clear_fragment_limit(
-+	ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_clear_fragment_limit(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	process_group->fragment_limit = 0;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_clear_fragment_limit failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_attach_buffer(
-+	ia_css_process_group_t *process_group,
-+	vied_vaddress_t buffer,
-+	const ia_css_buffer_state_t buffer_state,
-+	const unsigned int terminal_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	ia_css_terminal_t *terminal = NULL;
-+
-+	NOT_USED(buffer_state);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_attach_buffer(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	terminal = ia_css_process_group_get_terminal(
-+				process_group, terminal_index);
-+
-+	verifexitval(terminal != NULL, EINVAL);
-+	verifexitval(ia_css_process_group_get_state(process_group) ==
-+		IA_CSS_PROCESS_GROUP_READY, EINVAL);
-+	verifexitval(process_group->protocol_version ==
-+		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
-+		process_group->protocol_version ==
-+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
-+
-+	if (process_group->protocol_version ==
-+		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
-+		/*
-+		 * Legacy flow:
-+		 * Terminal address is part of the process group structure
-+		 */
-+		retval = ia_css_terminal_set_buffer(
-+			terminal, buffer);
-+	} else if (process_group->protocol_version ==
-+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
-+		/*
-+		 * PPG flow:
-+		 * Terminal address is part of external buffer set structure
-+		 */
-+		retval = ia_css_terminal_set_terminal_index(
-+			terminal, terminal_index);
-+	}
-+	verifexitval(retval == 0, EFAULT);
-+
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+		"\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
-+
-+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+		ia_css_frame_t *frame =
-+			ia_css_data_terminal_get_frame(
-+				(ia_css_data_terminal_t *)terminal);
-+		verifexitval(frame != NULL, EINVAL);
-+
-+		retval = ia_css_frame_set_buffer_state(frame, buffer_state);
-+		verifexitval(retval == 0, EINVAL);
-+	}
-+
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_attach_buffer invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_attach_buffer failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_vaddress_t ia_css_process_group_detach_buffer(
-+	ia_css_process_group_t *process_group,
-+	const unsigned int terminal_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	vied_vaddress_t buffer = VIED_NULL;
-+
-+	ia_css_terminal_t *terminal = NULL;
-+	ia_css_process_group_state_t state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_detach_buffer(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	terminal =
-+		ia_css_process_group_get_terminal(
-+				process_group, terminal_index);
-+	state = ia_css_process_group_get_state(process_group);
-+
-+	verifexitval(terminal != NULL, EINVAL);
-+	verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
-+
-+	buffer = ia_css_terminal_get_buffer(terminal);
-+
-+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+		ia_css_frame_t *frame =
-+			ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+		verifexitval(frame != NULL, EINVAL);
-+
-+		retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
-+		verifexitval(retval == 0, EINVAL);
-+	}
-+	ia_css_terminal_set_buffer(terminal, VIED_NULL);
-+
-+	retval = 0;
-+EXIT:
-+	/*
-+	 * buffer pointer will appear on output,
-+	 * regardless of subsequent fails to avoid memory leaks
-+	 */
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_detach_buffer invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_detach_buffer failed (%i)\n",
-+			retval);
-+	}
-+	return buffer;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_attach_stream(
-+	ia_css_process_group_t *process_group,
-+	uint32_t stream,
-+	const ia_css_buffer_state_t buffer_state,
-+	const unsigned int terminal_index)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_attach_stream(): enter:\n");
-+
-+	NOT_USED(process_group);
-+	NOT_USED(stream);
-+	NOT_USED(buffer_state);
-+	NOT_USED(terminal_index);
-+
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_attach_stream failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_detach_stream(
-+	ia_css_process_group_t *process_group,
-+	const unsigned int terminal_index)
-+{
-+	int retval = -1;
-+	uint32_t stream = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_detach_stream(): enter:\n");
-+
-+	NOT_USED(process_group);
-+	NOT_USED(terminal_index);
-+
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_detach_stream failed (%i)\n",
-+			retval);
-+	}
-+	return stream;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_barrier(
-+	ia_css_process_group_t *process_group,
-+	const vied_nci_barrier_ID_t barrier_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	vied_nci_resource_bitmap_t bit_mask;
-+	vied_nci_resource_bitmap_t resource_bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_barrier(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	resource_bitmap =
-+		ia_css_process_group_get_resource_bitmap(process_group);
-+
-+	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
-+
-+	verifexitval(bit_mask != 0, EINVAL);
-+	verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
-+
-+	resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
-+
-+	retval =
-+		ia_css_process_group_set_resource_bitmap(
-+			process_group, resource_bitmap);
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_barrier invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_barrier failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_clear_barrier(
-+	ia_css_process_group_t *process_group,
-+	const vied_nci_barrier_ID_t barrier_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_clear_barrier(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	resource_bitmap =
-+		ia_css_process_group_get_resource_bitmap(process_group);
-+
-+	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
-+
-+	verifexitval(bit_mask != 0, EINVAL);
-+	verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
-+
-+	resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
-+
-+	retval =
-+		ia_css_process_group_set_resource_bitmap(
-+				process_group, resource_bitmap);
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_clear_barrier invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_clear_barrier failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_print(
-+	const ia_css_process_group_t *process_group,
-+	void *fid)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	int i;
-+
-+	uint8_t	process_count;
-+	uint8_t terminal_count;
-+	vied_vaddress_t ipu_vaddress = VIED_NULL;
-+	ia_css_rbm_t routing_bitmap;
-+
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_print(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
-+	verifexitval(retval == 0, EINVAL);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"=============== Process group print start ===============\n");
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\tipu_virtual_address = %x\n", ipu_vaddress);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\tsizeof(process_group) = %d\n",
-+		(int)ia_css_process_group_get_size(process_group));
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\tfragment_count = %d\n",
-+		(int)ia_css_process_group_get_fragment_count(process_group));
-+
-+	routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
-+	for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+			"\trouting_bitmap[index = %d] = 0x%X\n",
-+			i, (int)routing_bitmap.data[i]);
-+	}
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\tprogram_group(process_group) = %d\n",
-+		(int)ia_css_process_group_get_program_group_ID(process_group));
-+	process_count = ia_css_process_group_get_process_count(process_group);
-+	terminal_count =
-+		ia_css_process_group_get_terminal_count(process_group);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\t%d processes\n", (int)process_count);
-+	for (i = 0; i < (int)process_count; i++) {
-+		ia_css_process_t *process =
-+			ia_css_process_group_get_process(process_group, i);
-+
-+		retval = ia_css_process_print(process, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\t%d terminals\n", (int)terminal_count);
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_t *terminal =
-+			ia_css_process_group_get_terminal(process_group, i);
-+
-+		retval = ia_css_terminal_print(terminal, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"\terror_handling_enable = %u\n", process_group->error_handling_enable);
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"=============== Process group print end ===============\n");
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_print invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_process_group_valid(
-+	const ia_css_process_group_t *process_group,
-+	const ia_css_program_group_manifest_t *pg_manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	DECLARE_ERRVAL
-+	bool invalid_flag = false;
-+	uint8_t proc_idx;
-+	uint8_t proc_term_idx;
-+	uint8_t	process_count;
-+	uint8_t	program_count;
-+	uint8_t terminal_count;
-+	uint8_t man_terminal_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_process_group_valid(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	verifexitval(pg_manifest != NULL, EFAULT);
-+	NOT_USED(param);
-+
-+	process_count = process_group->process_count;
-+	terminal_count = process_group->terminal_count;
-+	program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
-+	man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
-+
-+	/* Validate process group */
-+	invalid_flag = invalid_flag ||
-+		!(program_count >= process_count) ||
-+		!(man_terminal_count >= terminal_count) ||
-+		!(process_group->size > process_group->processes_offset) ||
-+		!(process_group->size > process_group->terminals_offset);
-+
-+	/* Validate processes */
-+	for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
-+		const ia_css_process_t *process;
-+		ia_css_program_manifest_t *p_manifest = NULL;
-+		ia_css_program_ID_t prog_id;
-+		bool no_match_found = true;
-+
-+		process = ia_css_process_group_get_process(process_group, proc_idx);
-+		verifexitval(NULL != process, EFAULT);
-+		prog_id = ia_css_process_get_program_ID(process);
-+		p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
-+									   ia_css_process_get_program_idx(process));
-+		verifexitval(NULL != p_manifest, EFAULT);
-+
-+		if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
-+			invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
-+			no_match_found = false;
-+		}
-+
-+		invalid_flag = invalid_flag || no_match_found;
-+	}
-+
-+	/* Validate terminals */
-+	for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
-+		int man_term_idx;
-+		const ia_css_terminal_t *terminal;
-+		const ia_css_terminal_manifest_t *terminal_manifest;
-+
-+		terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
-+		verifexitval(NULL != terminal, EFAULT);
-+		man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
-+		terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
-+
-+		invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_process_group_valid() invalid argument\n");
-+		return false;
-+	} else {
-+		return (!invalid_flag);
-+	}
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_process_group_submit(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	int i;
-+	bool can_submit = false;
-+	int retval = -1;
-+	uint8_t	terminal_count =
-+		ia_css_process_group_get_terminal_count(process_group);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_can_process_group_submit(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_t *terminal =
-+			ia_css_process_group_get_terminal(process_group, i);
-+		vied_vaddress_t buffer;
-+		ia_css_buffer_state_t buffer_state;
-+
-+		verifexitval(terminal != NULL, EINVAL);
-+
-+		if (process_group->protocol_version ==
-+			IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
-+			/*
-+			 * For legacy pg flow, buffer addresses are contained inside
-+			 * the process group structure, so these need to be validated
-+			 * on process group submission.
-+			 */
-+			buffer = ia_css_terminal_get_buffer(terminal);
-+			IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+				"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
-+				i, (unsigned long int)terminal, buffer);
-+		}
-+
-+		/* buffer_state is applicable only for data terminals*/
-+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+			ia_css_frame_t *frame =
-+				ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+
-+			verifexitval(frame != NULL, EINVAL);
-+			buffer_state = ia_css_frame_get_buffer_state(frame);
-+			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
-+				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
-+				break;
-+			}
-+		} else if (
-+			(ia_css_is_terminal_parameter_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_program_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_program_control_init_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_spatial_parameter_terminal(
-+				terminal) != true)) {
-+			/* neither data nor parameter terminal, so error.*/
-+			break;
-+		}
-+
-+	}
-+	/* Only true if no check failed */
-+	can_submit = (i == terminal_count);
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_process_group_submit invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_process_group_submit failed (%i)\n",
-+			retval);
-+	}
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_can_process_group_submit(): leave:\n");
-+	return can_submit;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_enqueue_buffer_set(
-+	const ia_css_process_group_t *process_group,
-+	const ia_css_buffer_set_t *buffer_set)
-+{
-+	DECLARE_ERRVAL
-+	int i;
-+	bool can_enqueue = false;
-+	int retval = -1;
-+	uint8_t	terminal_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_can_enqueue_buffer_set(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	verifexitval(buffer_set != NULL, EFAULT);
-+
-+	terminal_count =
-+		ia_css_process_group_get_terminal_count(process_group);
-+
-+	/*
-+	 * For ppg flow, buffer addresses are contained in the
-+	 * external buffer set structure, so these need to be
-+	 * validated before enqueueing.
-+	 */
-+	verifexitval(process_group->protocol_version ==
-+		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
-+
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_t *terminal =
-+			ia_css_process_group_get_terminal(process_group, i);
-+		vied_vaddress_t buffer;
-+		ia_css_buffer_state_t buffer_state;
-+
-+		verifexitval(terminal != NULL, EINVAL);
-+
-+		buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
-+		IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+			"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
-+			i, (unsigned long int)terminal, buffer);
-+
-+		/* buffer_state is applicable only for data terminals*/
-+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+			ia_css_frame_t *frame =
-+				ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+
-+			verifexitval(frame != NULL, EINVAL);
-+			buffer_state = ia_css_frame_get_buffer_state(frame);
-+			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
-+				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
-+				break;
-+			}
-+		} else if (
-+			(ia_css_is_terminal_parameter_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_program_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_program_control_init_terminal(terminal)
-+				!= true) &&
-+			(ia_css_is_terminal_spatial_parameter_terminal(
-+				terminal) != true)) {
-+			/* neither data nor parameter terminal, so error.*/
-+			break;
-+		}
-+	}
-+	/* Only true if no check failed */
-+	can_enqueue = (i == terminal_count);
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_enqueue_buffer_set invalid argument\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_enqueue_buffer_set failed (%i)\n",
-+			retval);
-+	}
-+	return can_enqueue;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_can_process_group_start(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	int i;
-+	bool can_start = false;
-+	int retval = -1;
-+	uint8_t	terminal_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_can_process_group_start(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	terminal_count =
-+		ia_css_process_group_get_terminal_count(process_group);
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_t *terminal =
-+			ia_css_process_group_get_terminal(process_group, i);
-+		ia_css_buffer_state_t buffer_state;
-+		bool ok = false;
-+
-+		verifexitval(terminal != NULL, EINVAL);
-+		if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+			/*
-+			 * buffer_state is applicable only for data terminals
-+			 */
-+			ia_css_frame_t *frame =
-+				ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+			bool is_input = ia_css_is_terminal_input(terminal);
-+			/*
-+			 * check for NULL here.
-+			 * then invoke next 2 statements
-+			 */
-+			verifexitval(frame != NULL, EINVAL);
-+			IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
-+				"\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
-+				i, frame->buffer_state, frame->access_type,
-+				frame->data_bytes, frame->data);
-+			buffer_state = ia_css_frame_get_buffer_state(frame);
-+
-+			ok = ((is_input &&
-+				(buffer_state == IA_CSS_BUFFER_FULL)) ||
-+					(!is_input && (buffer_state ==
-+							IA_CSS_BUFFER_EMPTY)));
-+
-+		} else if (ia_css_is_terminal_parameter_terminal(terminal) ==
-+				true) {
-+			/*
-+			 * FIXME:
-+			 * is there any pre-requisite for param_terminal?
-+			 */
-+			ok = true;
-+		} else if (ia_css_is_terminal_program_terminal(terminal) ==
-+				true) {
-+			ok = true;
-+		} else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
-+				true) {
-+			ok = true;
-+		} else if (ia_css_is_terminal_spatial_parameter_terminal(
-+					terminal) == true) {
-+			ok = true;
-+		} else {
-+			/* neither data nor parameter terminal, so error.*/
-+			break;
-+		}
-+
-+		if (!ok)
-+			break;
-+	}
-+	/* Only true if no check failed */
-+	can_start = (i == terminal_count);
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_process_group_submit invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_can_process_group_start failed (%i)\n",
-+			retval);
-+	}
-+	return can_start;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_process_group_get_size(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	size_t size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_size(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	size = process_group->size;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_size invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_state_t ia_css_process_group_get_state(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_state(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	state = process_group->state;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_state invalid argument\n");
-+	}
-+	return state;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_group_get_kernel_bitmap(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	bitmap = process_group->kernel_bitmap;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
-+	}
-+	return bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	const ia_css_rbm_t *rbm = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_routing_bitmap(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	rbm = &(process_group->routing_bitmap);
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_routing_bitmap invalid argument\n");
-+	}
-+	return rbm;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_process_group_get_fragment_count(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint16_t fragment_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_fragment_count(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	fragment_count = process_group->fragment_count;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_count invalid argument\n");
-+	}
-+	return fragment_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_process_count(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t process_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_process_count(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	process_count = process_group->process_count;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_process_count invalid argument\n");
-+	}
-+	return process_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_terminal_count(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t terminal_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_terminal_count(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	terminal_count = process_group->terminal_count;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_terminal_count invalid argument\n");
-+	}
-+	return terminal_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_psys_server_init_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t psys_server_init_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	psys_server_init_cycles = process_group->psys_server_init_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
-+	}
-+	return psys_server_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_load_start_ts(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_load_start_ts = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_load_start_ts(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_load_start_ts = process_group->pg_load_start_ts;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_load_start_ts invalid argument\n");
-+	}
-+	return pg_load_start_ts;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_load_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_load_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_load_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_load_cycles = process_group->pg_load_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_load_cycles invalid argument\n");
-+	}
-+	return pg_load_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_init_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_init_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_init_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_init_cycles = process_group->pg_init_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_init_cycles invalid argument\n");
-+	}
-+	return pg_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_processing_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_processing_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_processing_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_processing_cycles = process_group->pg_processing_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_processing_cycles invalid argument\n");
-+	}
-+	return pg_processing_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_next_frame_init_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
-+	}
-+	return pg_next_frame_init_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_get_pg_complete_cycles(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t pg_complete_cycles = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_pg_complete_cycles(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	pg_complete_cycles = process_group->pg_complete_cycles;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_pg_complete_cycles invalid argument\n");
-+	}
-+	return pg_complete_cycles;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
-+		const ia_css_process_group_t *process_group,
-+		const ia_css_terminal_type_t terminal_type)
-+{
-+	unsigned int proc_cnt;
-+	ia_css_terminal_t *terminal = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+			"ia_css_process_group_get_terminal_from_type(): enter:\n");
-+
-+	for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
-+		terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
-+		if (terminal == NULL) {
-+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+					"ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
-+			goto EXIT;
-+		}
-+		if (ia_css_terminal_get_type(terminal) == terminal_type) {
-+			return terminal;
-+		}
-+		terminal = NULL; /* If not the expected type, return NULL */
-+	}
-+EXIT:
-+	return terminal;
-+}
-+
-+/* Returns the terminal or NULL if it was not found
-+   For some of those maybe valid to not exist at all in the process group */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
-+	const ia_css_process_group_t 	*process_group,
-+	ia_css_terminal_type_t		term_type)
-+{
-+	int i, term_count;
-+
-+	assert(process_group != NULL);
-+
-+	/* Those below have at most one instance per process group */
-+	assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+		term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
-+		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
-+		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+
-+	term_count = ia_css_process_group_get_terminal_count(process_group);
-+
-+	for (i = 0; i < term_count; i++) {
-+		const ia_css_terminal_t	*terminal = ia_css_process_group_get_terminal(process_group, i);
-+
-+		if (ia_css_terminal_get_type(terminal) == term_type) {
-+			/* Only one parameter terminal per process group */
-+			return terminal;
-+		}
-+	}
-+
-+	return NULL;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
-+	const ia_css_process_group_t *process_grp,
-+	const unsigned int manifest_idx)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t i = 0;
-+	uint8_t terminal_count;
-+
-+	terminal_count =
-+		ia_css_process_group_get_terminal_count(process_grp);
-+
-+	for ( i = 0; i < terminal_count;
-+			i++) {
-+		unsigned int man_term_idx;
-+		ia_css_terminal_t *terminal;
-+
-+		terminal =
-+			ia_css_process_group_get_terminal(
-+					process_grp, i);
-+		verifexitval(NULL != terminal, EFAULT);
-+		man_term_idx =
-+			ia_css_terminal_get_terminal_manifest_index(terminal);
-+		if (man_term_idx == manifest_idx)
-+			return terminal;
-+	}
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_manifest_idx_terminal Error\n");
-+	}
-+	return NULL;
-+
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_t *ia_css_process_group_get_terminal(
-+	const ia_css_process_group_t *process_grp,
-+	const unsigned int terminal_num)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_t *terminal_ptr = NULL;
-+	uint16_t *terminal_offset_table;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_terminal(): enter:\n");
-+
-+	verifexitval(process_grp != NULL, EFAULT);
-+	verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
-+
-+	terminal_offset_table =
-+		(uint16_t *)((char *)process_grp +
-+				process_grp->terminals_offset);
-+	terminal_ptr =
-+		(ia_css_terminal_t *)((char *)process_grp +
-+				terminal_offset_table[terminal_num]);
-+
-+	verifexitval(terminal_ptr != NULL, EFAULT);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_terminal invalid argument\n");
-+	}
-+	return terminal_ptr;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_t *ia_css_process_group_get_process(
-+	const ia_css_process_group_t *process_grp,
-+	const unsigned int process_num)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_t *process_ptr = NULL;
-+	uint16_t *process_offset_table;
-+
-+	verifexitval(process_grp != NULL, EFAULT);
-+	verifexitval(process_num < process_grp->process_count, EINVAL);
-+
-+	process_offset_table =
-+		(uint16_t *)((char *)process_grp +
-+				process_grp->processes_offset);
-+	process_ptr =
-+		(ia_css_process_t *)((char *)process_grp +
-+				process_offset_table[process_num]);
-+
-+	verifexitval(process_ptr != NULL, EFAULT);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_process invalid argument\n");
-+	}
-+	return process_ptr;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_group_ID_t id = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_program_group_ID(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	id = process_group->ID;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_program_group_ID invalid argument\n");
-+	}
-+	return id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t resource_bitmap = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_resource_bitmap(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	resource_bitmap = process_group->resource_bitmap;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_resource_bitmap invalid argument\n");
-+	}
-+	return resource_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_resource_bitmap(
-+	ia_css_process_group_t *process_group,
-+	const vied_nci_resource_bitmap_t resource_bitmap)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_resource_bitmap(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	process_group->resource_bitmap = resource_bitmap;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_resource_bitmap failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_routing_bitmap(
-+	ia_css_process_group_t *process_group,
-+	const ia_css_rbm_t rbm)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_routing_bitmap(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	process_group->routing_bitmap = rbm;
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_routing_bitmap failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_group_compute_cycle_count(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t cycle_count = 0;
-+
-+	NOT_USED(manifest);
-+	NOT_USED(param);
-+
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(param != NULL, EFAULT);
-+
-+	cycle_count = 1;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_compute_cycle_count invalid argument\n");
-+	}
-+	return cycle_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_fragment_state(
-+	ia_css_process_group_t *process_group,
-+	uint16_t fragment_state)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_set_fragment_state(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
-+				process_group), EINVAL);
-+
-+	process_group->fragment_state = fragment_state;
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_fragment_state invalid argument process_group\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_fragment_state failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_get_fragment_state(
-+	const ia_css_process_group_t *process_group,
-+	uint16_t *fragment_state)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_fragment_state(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	verifexitval(fragment_state != NULL, EFAULT);
-+
-+	*fragment_state = process_group->fragment_state;
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_state invalid argument\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_fragment_state failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_get_ipu_vaddress(
-+	const ia_css_process_group_t *process_group,
-+	vied_vaddress_t *ipu_vaddress)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_ipu_vaddress(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+	verifexitval(ipu_vaddress != NULL, EFAULT);
-+
-+	*ipu_vaddress = process_group->ipu_virtual_address;
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_ipu_vaddress invalid argument\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_ipu_vaddress failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_ipu_vaddress(
-+	ia_css_process_group_t *process_group,
-+	vied_vaddress_t ipu_vaddress)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_ipu_vaddress(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	process_group->ipu_virtual_address = ipu_vaddress;
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_ipu_vaddress invalid argument\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_ipu_vaddress failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_protocol_version(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_protocol_version(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	protocol_version = process_group->protocol_version;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_protocol_version invalid argument\n");
-+	}
-+	return protocol_version;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_base_queue_id(
-+	ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_base_queue_id(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	queue_id = process_group->base_queue_id;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_base_queue_id invalid argument\n");
-+	}
-+	return queue_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_base_queue_id(
-+	ia_css_process_group_t *process_group,
-+	uint8_t queue_id)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_base_queue_id(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	/* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
-+	if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
-+		process_group->base_queue_id = queue_id;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
-+					   queue_id, (unsigned long int)process_group);
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_base_queue_id invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_num_queues(
-+	ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t num_queues = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_num_queues(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	num_queues = process_group->num_queues;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_num_queues invalid argument\n");
-+	}
-+	return num_queues;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_group_set_num_queues(
-+	ia_css_process_group_t *process_group,
-+	uint8_t num_queues)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_num_queues(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	process_group->num_queues = num_queues;
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_num_queues invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_process_group_set_error_handling_enable(
-+	ia_css_process_group_t *process_group,
-+	const bool error_handling_enable)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_error_handling_enable(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
-+	retval = 0;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_error_handling_enable invalid argument\n");
-+	}
-+
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_group_get_error_handling_enable(
-+	const ia_css_process_group_t *process_group)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t error_handling_enable = UINT8_MAX;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_error_handling_enable(): enter:\n");
-+
-+	verifexitval(process_group != NULL, EFAULT);
-+
-+	/* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
-+	assert(process_group->error_handling_enable <= (uint8_t)1);
-+	error_handling_enable = process_group->error_handling_enable;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_get_error_handling_enable invalid argument\n");
-+	}
-+
-+	return error_handling_enable;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
-+{
-+#if NUM_OF_VP_CELLS > 0
-+	bool has_vp = false;
-+#ifdef HAS_VP
-+	uint32_t i;
-+
-+	uint8_t process_count = ia_css_process_group_get_process_count(process_group);
-+
-+	for (i = 0; i < process_count; i++) {
-+		ia_css_process_t *process;
-+		vied_nci_cell_ID_t cell_id;
-+
-+		process = ia_css_process_group_get_process(process_group, i);
-+		cell_id = ia_css_process_get_cell(process);
-+
-+		if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
-+			has_vp = true;
-+			break;
-+		}
-+	}
-+#else /* not HAS_VP */
-+		NOT_USED(process_group);
-+#endif /* HAS_VP */
-+
-+	return has_vp;
-+#else
-+	NOT_USED(process_group);
-+	return false;
-+#endif
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
-new file mode 100644
-index 000000000000..feb0e166dfda
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
-@@ -0,0 +1,694 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
-+#define __IA_CSS_PSYS_PROCESS_IMPL_H
-+
-+#include <ia_css_psys_process.h>
-+
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_program_manifest.h>
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_psys_process_private_types.h"
-+
-+/** Function only to be used in FW */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
-+{
-+	DECLARE_ERRVAL
-+	verifexitval(process != NULL, EFAULT);
-+	if (process->process_extension_offset != 0) {
-+		return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_get_extension invalid argument\n");
-+	}
-+	return NULL;
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
-+STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
-+{
-+	assert(index < IA_CSS_PROCESS_MAX_CELLS);
-+	return process->cells[index];
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
-+STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
-+{
-+	assert(index < IA_CSS_PROCESS_MAX_CELLS);
-+	process->cells[index] = cell_id;
-+}
-+
-+/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
-+STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
-+{
-+	int i;
-+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
-+	}
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_cell_ID_t ia_css_process_get_cell(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_cell_ID_t	cell_id = VIED_NCI_N_CELL_ID;
-+	int i = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_cell(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+	}
-+	cell_id = ia_css_process_cells_get_cell(process, 0);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_cell invalid argument\n");
-+	}
-+	return cell_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
-+	const ia_css_process_t		*process,
-+	const vied_nci_mem_type_ID_t	mem_type)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_ext_mem(): enter:\n");
-+
-+	verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_ext_mem invalid argument\n");
-+		return IA_CSS_PROCESS_INVALID_OFFSET;
-+	}
-+	return process_ext->ext_mem_id[mem_type];
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_process_get_program_idx(
-+	const ia_css_process_t		*process)
-+{
-+	DECLARE_ERRVAL
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_program_idx(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_program_idx invalid argument\n");
-+		return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
-+	}
-+	return process->program_idx;
-+}
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_dev_chn(
-+	const ia_css_process_t		*process,
-+	const vied_nci_dev_chn_ID_t	dev_chn_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_dev_chn(): enter:\n");
-+	verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_dev_chn(): invalid arguments\n");
-+		return IA_CSS_PROCESS_INVALID_OFFSET;
-+	}
-+	return process_ext->dev_chn_offset[dev_chn_id];
-+}
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
-+	const ia_css_process_t				*process,
-+	const vied_nci_mem_type_ID_t			mem_id)
-+{
-+	(void)process;
-+	(void)mem_id;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_get_int_mem_offset always returns 0"
-+		"(internally memory feature not used).\n");
-+	return 0;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
-+	const ia_css_process_t				*process,
-+	const vied_nci_mem_type_ID_t			mem_type_id)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_ext_mem_offset(): enter:\n");
-+
-+	verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	verifexitval(process_ext != NULL, EFAULT);
-+
-+EXIT:
-+	if (noerror()) {
-+		ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_ext_mem_offset invalid argument\n");
-+	}
-+
-+	return ext_mem_offset;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_process_get_size(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_size(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+	if (noerror()) {
-+		size = process->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			       "ia_css_process_get_size invalid argument\n");
-+	}
-+
-+	return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_state_t ia_css_process_get_state(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_state_t	state = IA_CSS_N_PROCESS_STATES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_state(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+EXIT:
-+	if (noerror()) {
-+		state = (ia_css_process_state_t)process->state;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			       "ia_css_process_get_state invalid argument\n");
-+	}
-+
-+	return state;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_set_state(
-+	ia_css_process_t					*process,
-+	ia_css_process_state_t				state)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_state(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+	assert(state <= UINT8_MAX);
-+	process->state = state;
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_state invalid argument\n");
-+	}
-+
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_cell_dependency_count(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t	cell_dependency_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_cell_dependency_count(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	cell_dependency_count = process->cell_dependency_count;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		"ia_css_process_get_cell_dependency_count invalid argument\n");
-+	}
-+	return cell_dependency_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_terminal_dependency_count(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t	terminal_dependency_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_terminal_dependency_count(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	terminal_dependency_count = process->terminal_dependency_count;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_terminal_dependency_count invalid argument process\n");
-+	}
-+	return terminal_dependency_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_t *ia_css_process_get_parent(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_group_t	*parent = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_parent(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	if (process->parent_offset == 0) {
-+		return NULL;
-+	};
-+	parent =
-+	(ia_css_process_group_t *) ((char *)process + process->parent_offset);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_get_parent invalid argument process\n");
-+	}
-+	return parent;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_ID_t ia_css_process_get_program_ID(
-+	const ia_css_process_t					*process)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_ID_t		id = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_program_ID(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+	id = process->ID;
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		    "ia_css_process_get_program_ID invalid argument process\n");
-+	}
-+	return id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_id_t ia_css_process_get_cell_dependency(
-+	const ia_css_process_t *process,
-+	const unsigned int cell_num)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_id_t cell_dependency =
-+		IA_CSS_PROCESS_INVALID_DEPENDENCY;
-+	vied_nci_resource_id_t *cell_dep_ptr = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_get_cell_dependency(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	verifexitval(cell_num < process->cell_dependency_count, EFAULT);
-+
-+	cell_dep_ptr =
-+		(vied_nci_resource_id_t *)
-+		((char *)process + process->cell_dependencies_offset);
-+	cell_dependency = *(cell_dep_ptr + cell_num);
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		       "ia_css_process_get_cell_dependency invalid argument\n");
-+	}
-+	return cell_dependency;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_process_get_terminal_dependency(
-+	const ia_css_process_t					*process,
-+	const unsigned int					terminal_num)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t *ter_dep_ptr = NULL;
-+	uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
-+
-+	verifexitval(process != NULL, EFAULT);
-+	verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
-+
-+	ter_dep_ptr = (uint8_t *) ((char *)process +
-+				   process->terminal_dependencies_offset);
-+
-+	ter_dep = *(ter_dep_ptr + terminal_num);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		       "ia_css_process_get_terminal_dependency invalid argument\n");
-+	}
-+	return ter_dep;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
-+	const ia_css_process_t *process)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t bitmap = 0;
-+	vied_nci_cell_ID_t cell_id;
-+	int i = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_cell_bitmap(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+
-+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		cell_id = ia_css_process_cells_get_cell(process, i);
-+		if (VIED_NCI_N_CELL_ID != cell_id) {
-+			bitmap |= (1 << cell_id);
-+		}
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_get_cells_bitmap invalid argument process\n");
-+	}
-+
-+	return bitmap;
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
-+	ia_css_process_t *process)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t *p_bitmap = NULL;
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return NULL;
-+	}
-+
-+	p_bitmap = &process_ext->dfm_port_bitmap[0];
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+	}
-+
-+	return p_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
-+	ia_css_process_t *process)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t *p_bitmap = NULL;
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return NULL;
-+	}
-+
-+	p_bitmap = &process_ext->dfm_active_port_bitmap[0];
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+	}
-+
-+	return p_bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
-+	const ia_css_process_t *process,
-+	vied_nci_dev_dfm_id_t  dfm_res_id)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t bitmap = 0;
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return 0;
-+	}
-+	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+	bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
-+	}
-+
-+	return bitmap;
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
-+	const ia_css_process_t *process,
-+	vied_nci_dev_dfm_id_t  dfm_res_id)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t bitmap = 0;
-+	ia_css_process_ext_t *process_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
-+
-+	verifexitval(process != NULL, EFAULT);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return 0;
-+	}
-+#if HAS_DFM
-+	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+	bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
-+#else
-+	NOT_USED(dfm_res_id);
-+#endif
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+		 "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
-+	}
-+	return bitmap;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_process_valid(
-+	const ia_css_process_t		*process,
-+	const ia_css_program_manifest_t	*p_manifest)
-+{
-+	DECLARE_ERRVAL
-+	bool invalid_flag = false;
-+	ia_css_program_ID_t prog_id;
-+
-+	verifexitval(NULL != process, EFAULT);
-+	verifexitval(NULL != p_manifest, EFAULT);
-+
-+	prog_id = ia_css_process_get_program_ID(process);
-+	verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
-+
-+	invalid_flag = (process->size <= process->cell_dependencies_offset) ||
-+		   (process->size <= process->terminal_dependencies_offset);
-+
-+	if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
-+		vied_nci_cell_ID_t cell_id;
-+
-+		cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
-+		invalid_flag = invalid_flag ||
-+			    (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
-+	}
-+	invalid_flag = invalid_flag ||
-+		((process->cell_dependency_count +
-+		  process->terminal_dependency_count) == 0) ||
-+		(process->cell_dependency_count !=
-+	ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
-+		(process->terminal_dependency_count !=
-+	ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
-+
-+	/* TODO: to be removed once all PGs pass validation */
-+	if (invalid_flag == true) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+			"ia_css_is_process_valid(): false\n");
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_process_valid() invalid argument\n");
-+		return false;
-+	} else {
-+		return (!invalid_flag);
-+	}
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_process_cmd(
-+	ia_css_process_t					*process,
-+	const ia_css_process_cmd_t				cmd)
-+{
-+	int	retval = -1;
-+	ia_css_process_state_t	state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
-+
-+	verifexit(process != NULL);
-+
-+	state = ia_css_process_get_state(process);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
-+
-+	verifexit(state != IA_CSS_PROCESS_ERROR);
-+	verifexit(state < IA_CSS_N_PROCESS_STATES);
-+
-+	switch (cmd) {
-+	case IA_CSS_PROCESS_CMD_NOP:
-+		break;
-+	case IA_CSS_PROCESS_CMD_ACQUIRE:
-+		verifexit(state == IA_CSS_PROCESS_READY);
-+		break;
-+	case IA_CSS_PROCESS_CMD_RELEASE:
-+		verifexit(state == IA_CSS_PROCESS_READY);
-+		break;
-+	case IA_CSS_PROCESS_CMD_START:
-+		verifexit((state == IA_CSS_PROCESS_READY)
-+			  || (state == IA_CSS_PROCESS_STOPPED));
-+		process->state = IA_CSS_PROCESS_STARTED;
-+		break;
-+	case IA_CSS_PROCESS_CMD_LOAD:
-+		verifexit((state == IA_CSS_PROCESS_STARTED)
-+				|| (state == IA_CSS_PROCESS_READY)
-+				|| (state == IA_CSS_PROCESS_STOPPED));
-+		process->state = IA_CSS_PROCESS_RUNNING;
-+		break;
-+	case IA_CSS_PROCESS_CMD_STOP:
-+		verifexit((state == IA_CSS_PROCESS_RUNNING)
-+			  || (state == IA_CSS_PROCESS_SUSPENDED));
-+		process->state = IA_CSS_PROCESS_STOPPED;
-+		break;
-+	case IA_CSS_PROCESS_CMD_SUSPEND:
-+		verifexit(state == IA_CSS_PROCESS_RUNNING);
-+		process->state = IA_CSS_PROCESS_SUSPENDED;
-+		break;
-+	case IA_CSS_PROCESS_CMD_RESUME:
-+		verifexit(state == IA_CSS_PROCESS_SUSPENDED);
-+		process->state = IA_CSS_PROCESS_RUNNING;
-+		break;
-+	case IA_CSS_N_PROCESS_CMDS:	/* Fall through */
-+	default:
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
-+		goto EXIT;
-+	}
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_cmd invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_cmd failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
-new file mode 100644
-index 000000000000..d8d58835c1e6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
-@@ -0,0 +1,135 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
-+#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
-+
-+#include "ia_css_psys_process_types.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+#define	N_UINT32_IN_PROCESS_STRUCT				0
-+#define	N_UINT16_IN_PROCESS_STRUCT				1
-+#define	N_UINT8_IN_PROCESS_STRUCT				8
-+
-+#if IA_CSS_PROCESS_STATE_BITS != 8
-+#error IA_CSS_PROCESS_STATE_BITS expected to be 8
-+#endif
-+
-+#define SIZE_OF_PROCESS_EXTENSION \
-+	 ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
-+	+ (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
-+	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
-+	+ (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
-+
-+/** Extended process attributes describing more resource requirements
-+ *  (and some DFM handling details ) beyond those covered in
-+ *  ia_css_process_s.
-+ */
-+struct ia_css_process_ext_s {
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+	/** DFM port allocated to this process */
-+	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+	/** Active DFM ports which need a kick */
-+	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+	/** (external) Memory allocation offset given to this process */
-+	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+	/** Device channel allocation offset given to this process */
-+	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+	/** (external) Memory ID */
-+	vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
-+	/** Number of processes (mapped on cells) this process depends on */
-+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
-+#endif
-+};
-+
-+#define SIZE_OF_PROCESS_STRUCT_BITS \
-+	((N_UINT32_IN_PROCESS_STRUCT * 32) \
-+	+ (IA_CSS_PROGRAM_ID_BITS) \
-+	+ (N_UINT16_IN_PROCESS_STRUCT * 16) \
-+	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
-+	+ (N_UINT8_IN_PROCESS_STRUCT * 8) \
-+	+ ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
-+
-+/** Process attributes describing the instantiation of a single Program
-+ *  within a Program Group.
-+ */
-+struct ia_css_process_s {
-+	/** Reference to the containing process group */
-+	int16_t parent_offset;
-+	/** Size of this structure */
-+	uint8_t size;
-+	/** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
-+	 *  of the cells that provide input to this process.
-+	 *  Align to 64 bit boundary.
-+	 *  Set to zero if dependency_count is zero.
-+	 *  @see cell_dependency_count in this structure */
-+	uint8_t cell_dependencies_offset;
-+	/** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
-+	 *  of connected terminals (that is, the terminals that are associated with this process).
-+	 *  Each index is a key into to the process group terminal list.
-+	 *  Set to zero if dependency_count is zero.
-+	 *  @see terminal_dependency_count in this structure
-+	 *  @see ia_css_process_group_get_terminal() */
-+	uint8_t terminal_dependencies_offset;
-+	/** Offset in bytes to process extension structure, ia_css_process_ext_s
-+	 *  Align to 32 bit boundary.
-+	 *  Set to zero if extension is not used. The manifest must be queried to
-+	 *  find out if the extensino is necessary.
-+	 *  @see ia_css_program_manifest_process_requires_extension() */
-+	uint8_t process_extension_offset;
-+	/** Referal ID to a specific program.  This ID is unique across PG's and
-+	 *  can be used to retreive program meta data (AKA "program descriptor")
-+	 *  from the client package, including the program manifest and even
-+	 *  firmware program code, if the program is to be executed on a DSP. */
-+	ia_css_program_ID_t ID;
-+	/** Program index into the list of programs in the containing PG */
-+	uint8_t program_idx;
-+	/** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
-+	 *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
-+	 *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
-+	 *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
-+	uint8_t state;
-+	/** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
-+	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
-+	/** Size of the array of dependent cells pointed at by cell_dependencies_offset
-+	 *  Value must be set to the corresponding value from the manifest entry for this program.
-+	 *  As each program implies a cell (logically, if not physically) to execute the program,
-+	 *  the dependent cell count value in the process is the same as the dependent program count.
-+	 *  @see ia_css_program_manifest_get_program_dependency_count() */
-+	uint8_t cell_dependency_count;
-+	/** Number of terminals this process depends on.  This is the size of the array
-+	 *  pointed at by terminal_dependencies_offset
-+	 *  Value must be set to the corresponding value from the manifest entry for this program.
-+	 *  @see ia_css_program_manifest_get_terminal_dependency_count()
-+	 */
-+	uint8_t terminal_dependency_count;
-+#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
-+	/** Padding bytes for 64bit alignment*/
-+	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
-+#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
-+};
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
-new file mode 100644
-index 000000000000..d8f2ac4ebafc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
-@@ -0,0 +1,98 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
-+#define __IA_CSS_PSYS_PROCESS_TYPES_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_process_types.h
-+ *
-+ * The types belonging to the terminal/process/process group dynamic module
-+ */
-+
-+#include <type_support.h>
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
-+
-+/* private */
-+typedef enum ia_css_process_group_cmd {
-+	IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
-+	IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
-+	IA_CSS_PROCESS_GROUP_CMD_ATTACH,
-+	IA_CSS_PROCESS_GROUP_CMD_DETACH,
-+	IA_CSS_PROCESS_GROUP_CMD_START,
-+	IA_CSS_PROCESS_GROUP_CMD_DISOWN,
-+	IA_CSS_PROCESS_GROUP_CMD_RUN,
-+	IA_CSS_PROCESS_GROUP_CMD_STOP,
-+	IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
-+	IA_CSS_PROCESS_GROUP_CMD_RESUME,
-+	IA_CSS_PROCESS_GROUP_CMD_ABORT,
-+	IA_CSS_PROCESS_GROUP_CMD_RESET,
-+	IA_CSS_N_PROCESS_GROUP_CMDS
-+} ia_css_process_group_cmd_t;
-+
-+/* private */
-+#define IA_CSS_PROCESS_GROUP_STATE_BITS	32
-+typedef enum ia_css_process_group_state {
-+	IA_CSS_PROCESS_GROUP_ERROR = 0,
-+	IA_CSS_PROCESS_GROUP_CREATED,
-+	IA_CSS_PROCESS_GROUP_READY,
-+	IA_CSS_PROCESS_GROUP_BLOCKED,
-+	IA_CSS_PROCESS_GROUP_STARTED,
-+	IA_CSS_PROCESS_GROUP_RUNNING,
-+	IA_CSS_PROCESS_GROUP_STALLED,
-+	IA_CSS_PROCESS_GROUP_STOPPED,
-+	IA_CSS_N_PROCESS_GROUP_STATES
-+} ia_css_process_group_state_t;
-+
-+/* private */
-+typedef enum ia_css_process_cmd {
-+	IA_CSS_PROCESS_CMD_NOP = 0,
-+	IA_CSS_PROCESS_CMD_ACQUIRE,
-+	IA_CSS_PROCESS_CMD_RELEASE,
-+	IA_CSS_PROCESS_CMD_START,
-+	IA_CSS_PROCESS_CMD_LOAD,
-+	IA_CSS_PROCESS_CMD_STOP,
-+	IA_CSS_PROCESS_CMD_SUSPEND,
-+	IA_CSS_PROCESS_CMD_RESUME,
-+	IA_CSS_N_PROCESS_CMDS
-+} ia_css_process_cmd_t;
-+
-+/* private */
-+#define IA_CSS_PROCESS_STATE_BITS	8
-+typedef enum ia_css_process_state {
-+	IA_CSS_PROCESS_ERROR = 0,
-+	IA_CSS_PROCESS_CREATED,
-+	IA_CSS_PROCESS_READY,
-+	IA_CSS_PROCESS_STARTED,
-+	IA_CSS_PROCESS_RUNNING,
-+	IA_CSS_PROCESS_STOPPED,
-+	IA_CSS_PROCESS_SUSPENDED,
-+	IA_CSS_N_PROCESS_STATES
-+} ia_css_process_state_t;
-+
-+/* public */
-+typedef struct ia_css_process_group_s	ia_css_process_group_t;
-+typedef struct ia_css_process_s		ia_css_process_t;
-+typedef struct ia_css_process_ext_s	ia_css_process_ext_t;
-+
-+typedef struct ia_css_data_terminal_s	ia_css_data_terminal_t;
-+
-+#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
-new file mode 100644
-index 000000000000..4657c82bba05
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
-@@ -0,0 +1,320 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
-+
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.h
-+ *
-+ * Define the methods on the program group manifest object that are not part of
-+ * a single interface.
-+ *
-+ * Set functions in this file are for not for production use by the
-+ * users (testing/simulation only).
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>			/* uint8_t */
-+
-+#include <ia_css_psys_program_group_manifest.sim.h>
-+
-+#include <ia_css_psys_program_group_manifest.hsys.user.h>
-+
-+#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT		((uint8_t)(-1))
-+
-+/*! Get the stored size of the program group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_program_group_manifest_get_size(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the program group ID of the program group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_ID_t
-+ia_css_program_group_manifest_get_program_group_ID(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the program group ID of the program group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @param program group ID
-+
-+ @return 0 on success, -1 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_program_group_manifest_set_program_group_ID(
-+	ia_css_program_group_manifest_t *manifest,
-+	ia_css_program_group_ID_t id);
-+
-+/*! Get the storage alignment constraint of the program group binary data
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
-+	argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_alignment(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the storage alignment constraint of the program group binary data
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	alignment[in]			alignment desired
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_program_group_manifest_set_alignment(
-+	ia_css_program_group_manifest_t *manifest,
-+	const uint8_t alignment);
-+
-+/*! Get the kernel enable bitmap of the program group
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return bitmap, 0 on invalid manifest argument
-+ */
-+extern ia_css_kernel_bitmap_t
-+ia_css_program_group_manifest_get_kernel_bitmap(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Set the kernel enable bitmap of the program group
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	kernel bitmap[in]		kernel enable bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_group_manifest_set_kernel_bitmap(
-+	ia_css_program_group_manifest_t *manifest,
-+	const ia_css_kernel_bitmap_t bitmap);
-+
-+/*! Get the number of programs in the program group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return program count, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_program_count(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the number of terminals in the program group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return terminal count, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_group_manifest_get_terminal_count(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) private data blob in the manifest
-+
-+  Private data is used by FW and is opauque to the SW stack
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return private data blob, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+void *ia_css_program_group_manifest_get_private_data(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) routing bitmap (rbm) manifest
-+
-+ @param	manifest[in]			program group manifest object
-+
-+ @return rbm manifest, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_rbm_manifest_t *
-+ia_css_program_group_manifest_get_rbm_manifest(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+/*! Get the (pointer to) indexed program manifest in the program group manifest
-+ * object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the program manifest object
-+
-+ @return program manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_manifest_t *
-+ia_css_program_group_manifest_get_prgrm_mnfst(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int program_index);
-+
-+/*! Get the (pointer to) indexed terminal manifest in the program group
-+ * manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the terminal manifest object
-+
-+ @return terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_manifest_t *
-+ia_css_program_group_manifest_get_term_mnfst(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed data terminal manifest in the program group
-+ * manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the terminal manifest object
-+
-+ @return data terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_data_terminal_manifest_t *
-+ia_css_program_group_manifest_get_data_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed parameter terminal manifest in the program
-+ * group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the terminal manifest object
-+
-+ @return parameter terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed spatial param terminal manifest in the program
-+ * group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the terminal manifest object
-+
-+ @return spatial param terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_spatial_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed sliced param terminal manifest in the program
-+ * group manifest object
-+
-+ @param	manifest[in]			program group manifest object
-+ @param	program_index[in]		index of the terminal manifest object
-+
-+ @return sliced param terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_sliced_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*! Get the (pointer to) indexed program terminal manifest in the program group
-+ * manifest object
-+
-+ @parammanifest[in]program group manifest object
-+ @paramprogram_index[in]index of the terminal manifest object
-+
-+ @return program terminal manifest, NULL on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_terminal_manifest_t *
-+ia_css_program_group_manifest_get_program_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index);
-+
-+/*!	initialize program group manifest
-+
-+ @param	manifest[in]		program group manifest object
-+ @param	program_count[in]	number of programs.
-+ @param	terminal_count[in]	number of terminals.
-+ @param program_needs_extension[in] Array[program count]
-+ @param	program_deps[in]	program dependencies for programs in pg.
-+ @param	terminal_deps[in]	terminal dependencies for programs in pg.
-+ @param	terminal_type[in]	array of terminal types, binary specific
-+				static frame data
-+ @param	cached_in_param_section_count[in]Number of parameter terminal sections
-+ @param cached_out_param_section_count[in]	Number of parameter out terminal
-+ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
-+						with sections per cached out
-+						terminal
-+ @param sliced_in_param_section_count[in]	Array[sliced_in_terminal_count]
-+						with sections per sliced in
-+						terminal
-+ @param sliced_out_param_section_count[in]	Array[sliced_out_terminal_count]
-+						with sections per sliced out
-+						terminal
-+ @param	fragment_param_section_count[in]	Number of fragment parameter
-+						sections of the program init
-+						terminal,
-+ @param	kernel_fragment_seq_count[in]		Number of kernel fragment
-+						seqence info.
-+ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
-+						sections (size of array is program_count)
-+ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
-+						sections (size of array is program_count)
-+ @return none;
-+ */
-+extern void ia_css_program_group_manifest_init(
-+	ia_css_program_group_manifest_t *blob,
-+	const uint8_t program_count,
-+	const uint8_t terminal_count,
-+	const uint8_t *program_needs_extension,
-+	const uint8_t *program_dependencies,
-+	const uint8_t *terminal_dependencies,
-+	const ia_css_terminal_type_t *terminal_type,
-+	const uint16_t *cached_in_param_section_count,
-+	const uint16_t *cached_out_param_section_count,
-+	const uint16_t *spatial_param_section_count,
-+	const uint16_t *fragment_param_section_count,
-+	const uint16_t *sliced_in_param_section_count,
-+	const uint16_t *sliced_out_param_section_count,
-+	const uint16_t *kernel_fragment_seq_count,
-+	const uint16_t *progctrlinit_load_section_counts,
-+	const uint16_t *progctrlinit_connect_section_counts);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_group_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..787a4f67f4de
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.hsys.user.h
-+ *
-+ * Define the methods on the program group manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>	/* bool */
-+
-+/*! Print the program group manifest object to file/stream
-+    in textual format
-+
-+ @param	manifest[in]		program group manifest object
-+ @param	fid[out]		file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_manifest_print(
-+	const ia_css_program_group_manifest_t *manifest,
-+	void *fid);
-+
-+/*! Read the program group manifest object from file/stream
-+  in binary format.
-+
-+ @see ia_css_program_group_manifest_write()
-+
-+ @param	fid[in]			file/stream handle
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
-+	void *fid);
-+
-+/*! Write the program group manifest object to file/stream
-+  in binary format
-+
-+ @see ia_css_program_group_manifest_read()
-+
-+ @param	manifest[in]		program group manifest object
-+ @param	fid[out]		file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_group_manifest_write(
-+	const ia_css_program_group_manifest_t *manifest,
-+	void *fid);
-+
-+/*! Boolean test if the program group manifest is valid
-+
-+ @param	manifest[in]		program group manifest
-+
-+ @return true if program group manifest is correct, false on error
-+ */
-+extern bool ia_css_is_program_group_manifest_valid(
-+	const ia_css_program_group_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
-new file mode 100644
-index 000000000000..997755e3e842
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
-@@ -0,0 +1,131 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_group_manifest.sim.h
-+ *
-+ * Define the methods on the program group manifest object: Simulation only
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>	/* uint8_t */
-+#include "ia_css_terminal_defs.h"
-+
-+/*! Create a program group manifest object from specification
-+
-+ @param	specification[in]		specification (index)
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
-+	const unsigned int specification);
-+
-+/*! Destroy the program group manifest object
-+
-+ @param	manifest[in]			program group manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
-+	ia_css_program_group_manifest_t			*manifest);
-+
-+/*! Compute the size of storage required for allocating
-+ * the program group (PG) manifest object
-+
-+ @param	program_count[in]			Number of programs in the PG
-+ @param	terminal_count[in]			Number of terminals on the PG
-+ @param program_needs_extension[in]		Array[program count]
-+ @param	program_dependency_count[in]		Array[program_count] with the PG
-+ @param	terminal_dependency_count[in]		Array[program_count] with the
-+						terminal dependencies
-+ @param	terminal_type[in]			Array[terminal_count] with the
-+						terminal type
-+ @param	cached_in_param_section_count[in]	Number of parameter
-+						in terminal sections
-+ @param	cached_out_param_section_count[in]	Number of parameter
-+						out terminal sections
-+ @param	sliced_param_section_count[in]		Array[sliced_terminal_count]
-+						with sections per
-+						sliced in terminal
-+ @param	sliced_out_param_section_count[in]	Array[sliced_terminal_count]
-+						with sections per
-+						sliced out terminal
-+ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
-+						with sections per
-+						spatial terminal
-+ @param	fragment_param_section_count[in]	Number of fragment parameter
-+						sections of the
-+						program init terminal,
-+ @param	kernel_fragment_seq_count[in]		Number of
-+						kernel_fragment_seq_count.
-+ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
-+						sections (size of array is program_count)
-+ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
-+						sections (size of array is program_count)
-+ @return 0 on error
-+ */
-+size_t ia_css_sizeof_program_group_manifest(
-+	const uint8_t			program_count,
-+	const uint8_t			terminal_count,
-+	const uint8_t			*program_needs_extension,
-+	const uint8_t			*program_dependency_count,
-+	const uint8_t			*terminal_dependency_count,
-+	const ia_css_terminal_type_t	*terminal_type,
-+	const uint16_t			*cached_in_param_section_count,
-+	const uint16_t			*cached_out_param_section_count,
-+	const uint16_t			*spatial_param_section_count,
-+	const uint16_t			*fragment_param_section_count,
-+	const uint16_t			*sliced_param_section_count,
-+	const uint16_t			*sliced_out_param_section_count,
-+	const uint16_t			*kernel_fragment_seq_count,
-+	const uint16_t			*progctrlinit_load_section_counts,
-+	const uint16_t			*progctrlinit_connect_section_counts);
-+
-+/*! Create (the storage for) the program group manifest object
-+
-+ @param	program_count[in]		Number of programs in the program group
-+ @param	terminal_count[in]		Number of terminals on the program group
-+ @param	program_dependency_count[in]	Array[program_count] with the
-+					program dependencies
-+ @param	terminal_dependency_count[in]	Array[program_count] with the
-+					terminal dependencies
-+ @param	terminal_type[in]		Array[terminal_count] with the
-+					terminal type
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
-+	const uint8_t			program_count,
-+	const uint8_t			terminal_count,
-+	const uint8_t			*program_dependency_count,
-+	const uint8_t			*terminal_dependency_count,
-+	const ia_css_terminal_type_t	*terminal_type);
-+
-+/*! Free (the storage of) the program group manifest object
-+
-+ @param	manifest[in]			program group manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
-+	ia_css_program_group_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
-new file mode 100644
-index 000000000000..d37e5caa2611
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
-@@ -0,0 +1,417 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_kernel_bitmap.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_psys_private_pg_data.h"
-+#include <vied_nci_psys_system_global.h>	/* Safer bit mask functions */
-+#include "ia_css_psys_static_trace.h"
-+#include "ia_css_rbm_manifest_types.h"
-+#include <error_support.h>
-+#include <assert_support.h>
-+#include <misc_support.h>
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_program_group_manifest_get_size(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	size_t size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_size(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		size = manifest->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_size invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_ID_t
-+ia_css_program_group_manifest_get_program_group_ID(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		id = manifest->ID;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
-+	}
-+	return id;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_program_group_manifest_set_program_group_ID(
-+	ia_css_program_group_manifest_t *manifest,
-+	ia_css_program_group_ID_t id)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->ID = id;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_program_group_manifest_set_alignment(
-+	ia_css_program_group_manifest_t *manifest,
-+	const uint8_t alignment)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_set_alignment(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->alignment = alignment;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_set_alignment invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_alignment(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	uint8_t alignment = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_alignment(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		alignment = manifest->alignment;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_alignment invalid argument\n");
-+	}
-+	return alignment;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+void *ia_css_program_group_manifest_get_private_data(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	void *private_data = NULL;
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_private_data(%p): enter:\n",
-+		manifest);
-+
-+	verifexit(manifest != NULL);
-+
-+	private_data = (void *)((const char *)manifest +
-+				manifest->private_data_offset);
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_private_data invalid argument\n");
-+	}
-+	return private_data;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	ia_css_rbm_manifest_t *rbm_manifest = NULL;
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
-+		manifest);
-+
-+	verifexit(manifest != NULL);
-+
-+	rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
-+				manifest->rbm_manifest_offset);
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
-+	}
-+	return rbm_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_manifest_t *
-+ia_css_program_group_manifest_get_prgrm_mnfst(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int program_index)
-+{
-+	ia_css_program_manifest_t *prg_manifest_base;
-+	uint8_t *program_manifest = NULL;
-+	uint8_t program_count;
-+	unsigned int i;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
-+		manifest, program_index);
-+
-+	program_count =
-+		ia_css_program_group_manifest_get_program_count(manifest);
-+
-+	verifexit(manifest != NULL);
-+	verifexit(program_index < program_count);
-+
-+	prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
-+		manifest->program_manifest_offset);
-+	if (program_index < program_count) {
-+		program_manifest = (uint8_t *)prg_manifest_base;
-+		for (i = 0; i < program_index; i++) {
-+			program_manifest += ((ia_css_program_manifest_t *)
-+					program_manifest)->size;
-+		}
-+	}
-+
-+EXIT:
-+	if (NULL == manifest || program_index >= program_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
-+	}
-+	return (ia_css_program_manifest_t *)program_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_data_terminal_manifest_t *
-+ia_css_program_group_manifest_get_data_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	terminal_manifest =
-+		ia_css_program_group_manifest_get_term_mnfst(manifest,
-+			terminal_index);
-+
-+	verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
-+
-+	data_terminal_manifest =
-+		(ia_css_data_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+	return data_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	terminal_manifest =
-+		ia_css_program_group_manifest_get_term_mnfst(manifest,
-+			terminal_index);
-+
-+	verifexit(ia_css_is_terminal_manifest_parameter_terminal(
-+			terminal_manifest));
-+	param_terminal_manifest =
-+		(ia_css_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+	return param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_spatial_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_spatial_param_terminal_manifest_t *
-+		spatial_param_terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	terminal_manifest =
-+		ia_css_program_group_manifest_get_term_mnfst(manifest,
-+			terminal_index);
-+
-+	verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+			terminal_manifest));
-+
-+	spatial_param_terminal_manifest =
-+		(ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+	return spatial_param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_sliced_param_terminal_manifest_t *
-+ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_sliced_param_terminal_manifest_t *
-+		sliced_param_terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	terminal_manifest =
-+		ia_css_program_group_manifest_get_term_mnfst(manifest,
-+			terminal_index);
-+
-+	verifexit(ia_css_is_terminal_manifest_sliced_terminal(
-+			terminal_manifest));
-+
-+	sliced_param_terminal_manifest =
-+		(ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
-+EXIT:
-+	return sliced_param_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_terminal_manifest_t *
-+ia_css_program_group_manifest_get_program_terminal_manifest(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	terminal_manifest =
-+		ia_css_program_group_manifest_get_term_mnfst(manifest,
-+			terminal_index);
-+
-+	verifexit(ia_css_is_terminal_manifest_program_terminal(
-+			terminal_manifest));
-+
-+	program_terminal_manifest =
-+		(ia_css_program_terminal_manifest_t *)terminal_manifest;
-+ EXIT:
-+	return program_terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_manifest_t *
-+ia_css_program_group_manifest_get_term_mnfst(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const unsigned int terminal_index)
-+{
-+	ia_css_terminal_manifest_t *terminal_manifest = NULL;
-+	ia_css_terminal_manifest_t *terminal_manifest_base;
-+	uint8_t terminal_count;
-+	uint8_t i = 0;
-+	uint32_t offset;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
-+		manifest, (int)terminal_index);
-+
-+	verifexit(manifest != NULL);
-+
-+	terminal_count =
-+		ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+	verifexit(terminal_index < terminal_count);
-+
-+	terminal_manifest_base =
-+		(ia_css_terminal_manifest_t *)((char *)manifest +
-+		manifest->terminal_manifest_offset);
-+	terminal_manifest = terminal_manifest_base;
-+	while (i < terminal_index) {
-+		offset =
-+		(uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
-+		terminal_manifest = (ia_css_terminal_manifest_t *)
-+				((char *)terminal_manifest + offset);
-+		i++;
-+	}
-+EXIT:
-+	return terminal_manifest;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_program_count(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	uint8_t program_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_program_count(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		program_count = manifest->program_count;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_program_count invalid argument\n");
-+	}
-+	return program_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_group_manifest_get_terminal_count(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	uint8_t terminal_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_terminal_count(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		terminal_count = manifest->terminal_count;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_terminal_count invalid argument\n");
-+	}
-+	return terminal_count;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
-new file mode 100644
-index 000000000000..482a5c994bd0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
-@@ -0,0 +1,278 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
-+#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
-+
-+#include "ia_css_psys_manifest_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_kernel_bitmap.h"
-+#include "ia_css_program_group_data.h"
-+#include "vied_nci_psys_resource_model.h"
-+#include "ia_css_rbm_manifest_types.h"
-+#include <type_support.h>
-+#include <math_support.h>
-+#include <platform_support.h>
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
-+	((IA_CSS_KERNEL_BITMAP_BITS) \
-+	+ (IA_CSS_PROGRAM_GROUP_ID_BITS) \
-+	+ (5 * IA_CSS_UINT16_T_BITS) \
-+	+ (5 * IA_CSS_UINT8_T_BITS) \
-+	+ (5 * IA_CSS_UINT8_T_BITS))
-+
-+/** @brief Meta-data for a program group
-+ *
-+ * Describes the contents and layout of the program group
-+ * components in memory.
-+ *
-+ * Offsets are relative to the base address of the program group
-+ * manifest object.
-+ */
-+struct ia_css_program_group_manifest_s {
-+	/** Indicate kernels are present in this program group */
-+	ia_css_kernel_bitmap_t kernel_bitmap;
-+	/** Referral ID to program group FW */
-+	ia_css_program_group_ID_t ID;
-+	/** Offset to program manifest list.  One entry for each program. */
-+	uint16_t program_manifest_offset;
-+	/** Offset to terminal manifest list.  One entry for each terminal. */
-+	uint16_t terminal_manifest_offset;
-+	/** Offset to private data (not part of the official API) */
-+	uint16_t private_data_offset;
-+	/** Offset to RBM manifest */
-+	uint16_t rbm_manifest_offset;
-+	/** Size of this structure */
-+	uint16_t size;
-+	/** Storage alignment requirement (in uint8_t) */
-+	uint8_t alignment;
-+	/** Total number of kernels in this program group */
-+	uint8_t kernel_count;
-+	/** Total number of program in this program group */
-+	uint8_t program_count;
-+	/** Total number of terminals on this program group */
-+	uint8_t terminal_count;
-+	/** Total number of independent subgraphs in this program group */
-+	uint8_t subgraph_count;
-+	/** Padding; esnures that rbm_manifest starts on 64bit alignment */
-+	uint8_t reserved[5];
-+};
-+
-+#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
-+	((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
-+	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
-+	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
-+	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
-+	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
-+	+ (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
-+	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
-+
-+/** "Extended" meta-data for a single program
-+ *
-+ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
-+ */
-+struct ia_css_program_manifest_ext_s {
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+	/** DFM port allocation of this program */
-+	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+	/** Active DFM ports which need a kick
-+	 * If an empty port is configured to run in active mode, the empty
-+	 * port and the corresponding full port(s) in the stream must be kicked.
-+	 * The empty port must always be kicked after the full port.
-+	 */
-+	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
-+	/** (external) Memory allocation size needs of this program */
-+	vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+#endif
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+	/** Device channel allocation size needs of this program */
-+	vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
-+	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
-+#endif
-+#if VIED_NCI_N_DEV_DFM_ID > 0
-+	/** DFM ports are relocatable if value is set to 1.
-+	 * The flag is per dfm port type.
-+	 * This will not be supported for now.
-+	 */
-+	uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
-+#endif
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+	/** DEC compression flush service entry, describing which streams
-+	 *  require flush service handling for decompression (input).
-+	 *  @note stream ID's are the ID's used by the MMU
-+	 */
-+	uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
-+	/** Association of streams in dec_resources_input with the terminal
-+	 *  they belong to.
-+	 */
-+	uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
-+#endif
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+	/** DEC compression flush service entry, describing which streams
-+	 *  require flush service handling for compression (output).
-+	 *  @note stream ID's are the ID's used by the MMU
-+	 */
-+	uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
-+	/** Association of streams in dec_resources_output with the terminal
-+	 *  they belong to.
-+	 */
-+	uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
-+#endif
-+/** Padding bytes for 32bit alignment*/
-+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
-+#endif
-+};
-+
-+#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
-+	(IA_CSS_KERNEL_BITMAP_BITS \
-+	+ IA_CSS_PROGRAM_ID_BITS \
-+	+ IA_CSS_PROGRAM_TYPE_BITS \
-+	+ (1 * IA_CSS_UINT16_T_BITS) \
-+	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
-+	+ (VIED_NCI_RESOURCE_ID_BITS) \
-+	+ (6 * IA_CSS_UINT8_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
-+
-+/** Meta-data for a single program
-+ *
-+ * This structure contains only the information required for resource
-+ * management and construction of the process group.
-+ */
-+struct ia_css_program_manifest_s {
-+	/** Indicate which kernels lead to this program being used */
-+	ia_css_kernel_bitmap_t kernel_bitmap;
-+	/** offset to add to reach parent. This is negative value.*/
-+	int16_t parent_offset;
-+	uint8_t program_dependency_offset;
-+	uint8_t terminal_dependency_offset;
-+	/** Size of this structure */
-+	uint8_t size;
-+	/** offset to ia_css_program_manifest_ext_s, 0 if there is none */
-+	uint8_t program_extension_offset;
-+	/** Specification of for exclusive or parallel programs */
-+	uint8_t program_type; /* ia_css_program_type_t */
-+	/** Referral ID to a specific program FW, valid ID's != 0 */
-+	ia_css_program_ID_t ID;
-+	/** Array of all the cells this program needs */
-+	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
-+	/** (exclusive) indication of a cell type to be used by this program */
-+	vied_nci_resource_id_t cell_type_id;
-+	/** Number of programs this program depends on */
-+	uint8_t program_dependency_count;
-+	/** Number of terminals this program depends on */
-+	uint8_t terminal_dependency_count;
-+	/** Padding bytes for 32bit alignment*/
-+#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
-+#endif
-+};
-+
-+/*
-+ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
-+ */
-+#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	+ IA_CSS_FRAME_FORMAT_BITMAP_BITS \
-+	+ IA_CSS_CONNECTION_BITMAP_BITS \
-+	+ IA_CSS_KERNEL_BITMAP_BITS \
-+	+ (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
-+	+ IA_CSS_UINT16_T_BITS \
-+	+ IA_CSS_UINT8_T_BITS \
-+	+ (4*IA_CSS_UINT8_T_BITS))
-+
-+/** Meta-data specific for a data terminal
-+ *
-+ * Contains mostly capability and constraints information
-+ */
-+struct ia_css_data_terminal_manifest_s {
-+	/** Data terminal base */
-+	ia_css_terminal_manifest_t base;
-+	/** Supported (4CC / MIPI / parameter) formats */
-+	ia_css_frame_format_bitmap_t frame_format_bitmap;
-+	/** Indicate which kernels lead to this terminal being used */
-+	ia_css_kernel_bitmap_t kernel_bitmap;
-+	/** Minimum size of the frame */
-+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
-+	/** Maximum size of the frame */
-+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
-+	/** Minimum size of a fragment that the program port can accept */
-+	uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
-+	/** Maximum size of a fragment that the program port can accept */
-+	uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
-+	/** Indicate if this terminal is derived from a principal terminal
-+	 *  @note Can't find meaningful use of this field. */
-+	uint16_t terminal_dependency;
-+	/** Indicate what (streaming) interface types this terminal supports */
-+	ia_css_connection_bitmap_t connection_bitmap;
-+	/** Indicates if compression is supported on the data associated with
-+	 * this terminal. '1' indicates compression is supported,
-+	 * '0' otherwise
-+	 */
-+	uint8_t compression_support;
-+	uint8_t reserved[4];
-+};
-+
-+/* ============  Program Control Init Terminal Manifest - START ============ */
-+#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
-+struct ia_css_program_control_init_manifest_program_desc_s {
-+	uint16_t load_section_count;
-+	uint16_t connect_section_count;
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
-+};
-+
-+#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
-+/** Meta-data specific for a program control init terminal
-+ *
-+ * Program control init terminals have parameters related
-+ * to system device (i.e. non-algorithmic devices, like DMA's)
-+ * configuration.
-+ */
-+struct ia_css_program_control_init_terminal_manifest_s {
-+	ia_css_terminal_manifest_t base;
-+	/** Number of programs in program group.  This terminal can contain
-+	 * parameters for each program.  Also size of the array at program_desc_offset.
-+	*/
-+	uint32_t program_count;
-+	/**
-+	 * Points to array of ia_css_program_control_init_manifest_program_desc_t
-+	 * with size program_count.  The descriptor describes the format of the
-+	 * parameter payload, which is sent separately.
-+	 */
-+	uint16_t program_desc_offset;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
-+};
-+/* ============  Program Control Init Terminal Manifest - END ============ */
-+
-+extern void ia_css_program_manifest_init(
-+	ia_css_program_manifest_t	*blob,
-+	const uint8_t	program_needs_extension,
-+	const uint8_t	program_dependency_count,
-+	const uint8_t	terminal_dependency_count);
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
-new file mode 100644
-index 000000000000..778e387c5b73
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
-@@ -0,0 +1,679 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.h
-+ *
-+ * Define the methods on the program manifest object that are not part of a
-+ * single interface.
-+ *
-+ * @note The "set" functions here are for testing simulation only.
-+ * Real manifests are generated in advance and must be considered read-only from
-+ * the production user's perspective.
-+ */
-+
-+#include "ia_css_psys_static_storage_class.h"
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>			/* uint8_t */
-+
-+#include <ia_css_psys_program_manifest.sim.h>
-+
-+#include <ia_css_psys_program_manifest.hsys.user.h>
-+
-+#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
-+
-+/*
-+ * Resources needs
-+ */
-+#include <ia_css_psys_program_manifest.hsys.kernel.h>
-+
-+#define IA_CSS_PROGRAM_INVALID_DEPENDENCY	((uint8_t)(-1))
-+#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG	((uint8_t)(-1))
-+
-+/** Retrieve extended manifest information generally not visible
-+ *  to the SW stack
-+ *
-+ *  @see ia_css_program_manifest_ext_t
-+ *  @note Function only to be used in FW
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
-+
-+/*! Check if the program manifest object specifies a fixed cell allocation
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return has_fixed_cell, false on invalid argument
-+ */
-+extern bool ia_css_has_program_manifest_fixed_cell(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the stored size of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return size, 0 on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_program_manifest_get_size(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the program ID of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Set the program ID of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @param program ID
-+
-+ @return 0 on success, -1 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_program_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	ia_css_program_ID_t id);
-+
-+/*! Get the (pointer to) the program *group* manifest which contains
-+ * this program manifest
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return the pointer to the parent, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Set the offset to the beginning of the program *group* manifest
-+ * which contains this program manifest
-+
-+ @param	manifest[in]			program manifest object
-+ @param	program_offset[in]		this program's offset from
-+					program_group_manifest's base address.
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_parent_offset(
-+	ia_css_program_manifest_t			*manifest,
-+	int32_t program_offset);
-+
-+/*! Get the type of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
-+	argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_type_t ia_css_program_manifest_get_type(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Set the type of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+ @param	program_type[in]		program type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_type(
-+	ia_css_program_manifest_t			*manifest,
-+	const ia_css_program_type_t			program_type);
-+
-+/*! Set the cell id of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+ @param	program_cell_id[in]		program cell id
-+
-+ @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_program_manifest_set_cell_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_cell_ID_t			cell_id);
-+
-+/*! Set the cell type of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+ @param	program_cell_type[in]		program cell type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_program_manifest_set_cell_type_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_cell_type_ID_t			cell_type_id);
-+
-+/*!
-+ * Get input terminal id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ *
-+ * @return registered terminal_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_input_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                   idx);
-+
-+/*!
-+ * Get output terminal id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ *
-+ * @return registered terminal_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_output_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                    idx);
-+
-+/*!
-+ * Set output terminal id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ * @param	val[in]			value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_output_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	uint8_t                    idx,
-+	uint8_t                    val);
-+
-+/*!
-+ * Set input terminal id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ * @param	val[in]			value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_input_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	uint8_t                    idx,
-+	uint8_t                    val);
-+
-+/*!
-+ * Get compression input MMU stream id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ *
-+ * @return registered stream_id for idx
-+ */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_input_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                   idx);
-+
-+/*!
-+ * Get compression output MMU stream id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ *
-+ * @return registered stream_id for idx
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_output_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                    idx);
-+
-+/*!
-+ * Set compression output MMU stream id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ * @param	val[in]			value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_output_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	uint8_t                    idx,
-+	uint8_t                    val);
-+
-+/*!
-+ * Set *compression* input MMU stream id [val] at [idx]
-+ *
-+ * @param	manifest[in]		program manifest object
-+ * @param	idx[in]			index
-+ * @param	val[in]			value
-+ *
-+ */
-+extern void ia_css_program_manifest_set_input_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	uint8_t                    idx,
-+	uint8_t                    val);
-+
-+/*! Set cells bitmap for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	bitmap[in]				bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_cells_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_resource_bitmap_t	bitmap);
-+
-+/*! Get cells bitmap for the program
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Set DFM port bitmap for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+ @param	bitmap[in]				bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dfm_port_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id,
-+	const vied_nci_resource_bitmap_t	bitmap);
-+#if HAS_DFM
-+/*! Get bitmap of DFM ports requested for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+
-+ @return DFM port bitmap
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id);
-+#endif
-+
-+/*! Set active DFM port specification bitmap for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+ @param	bitmap[in]				bitmap
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id,
-+	const vied_nci_resource_bitmap_t	bitmap);
-+
-+#if HAS_DFM
-+/*! Get active DFM port specification bitmap for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id);
-+#endif
-+
-+/*! Set DFM device relocatability specification for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+ @param is_relocatable[in]		1 if dfm device ports are relocatable, 0 otherwise
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_is_dfm_relocatable(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id,
-+	const uint8_t						is_relocatable);
-+
-+#if HAS_DFM
-+/*! Get DFM device relocatability specification for the program
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dfm_type_id[in]			DFM resource type ID
-+
-+ @return 1 if dfm device ports are relocatable, 0 otherwise
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_dfm_id_t			dfm_type_id);
-+#endif
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+
-+ @deprecated Implementation is trival (returns 0) and
-+ no known users or known intention for future use.
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id);
-+
-+/*! Set the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type id
-+ @param	int_mem_size[in]		internal memory size
-+
-+ @return < 0 on invalid arguments
-+ @deprecated see ia_css_program_manifest_get_int_mem_size()
-+ */
-+extern int ia_css_program_manifest_set_int_mem_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			int_mem_size);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id);
-+
-+/*! Set the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type id
-+ @param	ext_mem_size[in]		external memory size
-+
-+ @return < 0 on invalid arguments
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+ */
-+extern int ia_css_program_manifest_set_ext_mem_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			ext_mem_size);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (size) specification
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dev_chn_id[in]			device channel ID
-+
-+ @return 0 when not applicable and/or invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t			dev_chn_id);
-+#endif
-+
-+/*! Set a device channel resource (size) specification
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dev_chn_id[in]			device channel ID
-+ @param	dev_chn_size[in]		device channel size
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dev_chn_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t			dev_chn_id,
-+	const vied_nci_resource_size_t			dev_chn_size);
-+
-+/*! Set a device channel resource (offset) specification
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dev_chn_id[in]			device channel ID
-+ @param	dev_chn_offset[in]		device channel offset
-+
-+ @see ia_css_program_manifest_get_dev_chn_offset()
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_dev_chn_offset(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t			dev_chn_id,
-+	const vied_nci_resource_size_t			dev_chn_offset);
-+
-+/*! Set the memory resource (offset) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type id
-+ @param	ext_mem_offset[in]		external memory offset
-+
-+ @see ia_css_program_manifest_get_ext_mem_offset()
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_ext_mem_offset(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			ext_mem_offset);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (offset) specification
-+
-+ Used to define a resource dependency on devices that support
-+ parallel users via channel multiplexing within the device.
-+
-+ Channel resources can be "relocatable". That is, some channel
-+ is required, but the exact channel is not important and
-+ can be assigned at runtime.
-+
-+ Other channel resources are static "fixed" in advance.  Either
-+ each channel is customized for a particular need such that
-+ the exact channel needs to be specified.  Alternatively, there
-+ are enough channels resources available for the worst case
-+ system requirement such that the channels can be statically
-+ assigned in advance "fixed" channels.
-+
-+ Both kinds of resource dependency specification are supported here.
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dev_chn_id[in]			device channel ID
-+
-+ @return Valid fixed offset (if value is greater or equal to 0) or
-+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
-+  is relocatable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t				dev_chn_id);
-+#endif
-+
-+/*! Get the memory resource (offset) specification for a memory
-+ that does not belong to the cell where the program will be mapped.
-+
-+ Memory specified here is typically SRAM within IPU used for
-+ intermediate storage during data transfer between processing
-+ stages/main memory or as computation scratch space.
-+
-+ The offset specified essentially defines the location of the memory
-+ within the memory device.  It can be fixed in advance (static allocation)
-+ or left to the system to determine at runtime.
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type ID
-+
-+ @return Valid fixed offset (if value is greater or equal to 0) or
-+  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
-+  is relocatable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id);
-+
-+/*! Get the kernel composition of the program manifest object
-+
-+  The collection of kernels described in the bitmap is defined
-+  at the program group level. This function returns the subset
-+  of kernels that are part of this program.
-+ @param	manifest[in]			program manifest object
-+
-+ @return bitmap, 0 on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Set the kernel dependency of the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+ @param	kernel_bitmap[in]		kernel composition bitmap
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_kernel_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const ia_css_kernel_bitmap_t			kernel_bitmap);
-+
-+/*! Get the number of programs this programs depends on from the program group
-+ * manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program dependency count
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_program_dependency_count(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the index of the program which the programs at this index depends on
-+    from the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program dependency,
-+	IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
-+	*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_program_dependency(
-+	const ia_css_program_manifest_t			*manifest,
-+	const unsigned int				index);
-+
-+/*! Set the index of the program which the programs at this index depends on
-+    in the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program dependency
-+ */
-+extern int ia_css_program_manifest_set_program_dependency(
-+	ia_css_program_manifest_t			*manifest,
-+	const uint8_t					program_dependency,
-+	const unsigned int				index);
-+
-+/*! Get the number of terminals this programs depends on from the program group
-+ * manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return program dependency count
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the index of the terminal which the programs at this index depends on
-+    from the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_manifest_get_terminal_dependency(
-+	const ia_css_program_manifest_t			*manifest,
-+	const unsigned int				index);
-+
-+/*! Set the index of the terminal which the programs at this index depends on
-+    in the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return < 0 on invalid arguments
-+ */
-+extern int ia_css_program_manifest_set_terminal_dependency(
-+	ia_css_program_manifest_t			*manifest,
-+	const uint8_t					terminal_dependency,
-+	const unsigned int				index);
-+
-+/*! Check if the program manifest object specifies a subnode program
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return is_subnode, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+extern bool ia_css_is_program_manifest_subnode_program_type(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Check if the program manifest object specifies a supernode program
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return is_supernode, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+extern bool ia_css_is_program_manifest_supernode_program_type(
-+	const ia_css_program_manifest_t			*manifest);
-+/*! Check if the program manifest object specifies a singular program
-+
-+ @param	manifest[in]			program manifest object
-+
-+ @return is_singular, false on invalid argument
-+ @deprecated for IPU7
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_program_manifest_singular_program_type(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
-new file mode 100644
-index 000000000000..25e7bdf40cdb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.hsys.kernel.h
-+ *
-+ * Define the methods on the program manifest object: Hsys kernel interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include <type_support.h>					/* uint8_t */
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*
-+ * Resources needs
-+ */
-+
-+/*! Get the cell ID from the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ Note: If the cell ID is specified, the program this manifest belongs to
-+ must be mapped on that instance. If the cell ID is invalid (limit value)
-+ then the cell type ID must be specified instead
-+
-+ @return cell ID, limit value if not specified
-+ */
-+extern
-+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the cell type ID from the program manifest object
-+
-+ @param	manifest[in]			program manifest object
-+
-+ Note: If the cell type ID is specified, the program this manifest belongs
-+ to can be mapped on any instance of this clee type. If the cell type ID is
-+ invalid (limit value) then a specific cell ID must be specified instead
-+
-+ @return cell ID, limit value if not specified
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
-+	const ia_css_program_manifest_t			*manifest);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that belongs to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id);
-+
-+/*! Get the memory resource (size) specification for a memory
-+ that does not belong to the cell where the program will be mapped
-+
-+ @param	manifest[in]			program manifest object
-+ @param	mem_type_id[in]			mem type ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id);
-+
-+#if HAS_DFM
-+/*! Get a device channel resource (size) specification
-+
-+ @param	manifest[in]			program manifest object
-+ @param	dev_chn_id[in]			device channel ID
-+
-+ @return 0 when not applicable
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+	const ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t				dev_chn_id);
-+#endif
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..96a87f52fabb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.hsys.user.h
-+ *
-+ * Define the methods on the program manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+/*! Print the program manifest object to file/stream
-+    in textual format
-+
-+ @param	manifest[in]			program manifest object
-+ @param	fid[out]				file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_program_manifest_print(
-+	const ia_css_program_manifest_t	*manifest,
-+	void				*fid);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
-new file mode 100644
-index 000000000000..83000ad4eb97
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
-@@ -0,0 +1,65 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_program_manifest.sim.h
-+ *
-+ * Define the methods on the program manifest object: Simulation only
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>	/* uint8_t */
-+
-+/*! Compute the size of storage required for allocating
-+ * the program manifest object
-+
-+ @param program_needs_extension[in]	==1 if program manifest needs an extension struct
-+ @param	program_dependency_count[in]	Number of programs this one depends on
-+ @param	terminal_dependency_count[in]	Number of terminals this one depends on
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_program_manifest(
-+	const uint8_t	program_needs_extension,
-+	const uint8_t	program_dependency_count,
-+	const uint8_t	terminal_dependency_count);
-+
-+/*! Create (the storage for) the program manifest object
-+
-+ @param	program_dependency_count[in]	Number of programs this one depends on
-+ @param	terminal_dependency_count[in]	Number of terminals this one depends on
-+
-+ @return NULL on error
-+ */
-+extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
-+	const uint8_t	program_dependency_count,
-+	const uint8_t	terminal_dependency_count);
-+
-+/*! Destroy (the storage of) the program manifest object
-+
-+ @param	manifest[in]			program manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_program_manifest_t *ia_css_program_manifest_free(
-+	ia_css_program_manifest_t *manifest);
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
-new file mode 100644
-index 000000000000..abbc0900d23e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_psys_static_trace.h"
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <storage_class.h>
-+#include <math_support.h>
-+
-+/** Function only to be used in FW */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
-+{
-+	DECLARE_ERRVAL
-+	verifexitval(program != NULL, EFAULT);
-+	if (program->program_extension_offset != 0) {
-+		return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_manifest_get_extension invalid argument\n");
-+	}
-+	return NULL;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+	(void)manifest;
-+	(void)mem_type_id;
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+			"ia_css_program_manifest_get_int_mem_size always returns 0"
-+			"(internally memory feature not used).\n");
-+	return 0;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_input_terminal_id(
-+	ia_css_program_manifest_t *manifest,
-+	unsigned char              idx)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+	return manifest_ext->dec_resources_input_terminal[idx];
-+#else
-+	(void) idx;
-+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_output_terminal_id(
-+	ia_css_program_manifest_t *manifest,
-+	unsigned char              idx)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+	return manifest_ext->dec_resources_output_terminal[idx];
-+#else
-+	(void) idx;
-+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_input_stream_id(
-+	ia_css_program_manifest_t  *manifest,
-+	unsigned char               idx)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+	return manifest_ext->dec_resources_input[idx];
-+#else
-+	(void) idx;
-+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_output_stream_id(
-+	ia_css_program_manifest_t *manifest,
-+	unsigned char              idx)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_output_stream_id(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+	}
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+	return manifest_ext->dec_resources_output[idx];
-+#else
-+	(void) idx;
-+	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
-+#endif
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_dev_dfm_id_t      dfm_type_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
-+		return 0;
-+	}
-+	return manifest_ext->is_dfm_relocatable[dfm_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
-+	const ia_css_program_manifest_t  *manifest,
-+	const vied_nci_dev_dfm_id_t       dfm_type_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
-+		return 0;
-+	}
-+	return manifest_ext->dfm_port_bitmap[dfm_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
-+	const ia_css_program_manifest_t  *manifest,
-+	const vied_nci_dev_dfm_id_t       dfm_type_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
-+		return 0;
-+	}
-+	return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
-+		return 0;
-+	}
-+	return manifest_ext->ext_mem_size[mem_type_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_mem_type_ID_t     mem_type_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
-+		 return 0;
-+	}
-+	return manifest_ext->ext_mem_offset[mem_type_id];
-+}
-+
-+#if HAS_DFM
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_dev_chn_ID_t      dev_chn_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_dev_chn_size(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
-+		return 0;
-+	}
-+	return manifest_ext->dev_chn_size[dev_chn_id];
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
-+	const ia_css_program_manifest_t *manifest,
-+	const vied_nci_dev_chn_ID_t      dev_chn_id)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
-+		 return 0;
-+	}
-+	return manifest_ext->dev_chn_offset[dev_chn_id];
-+}
-+#endif /* HAS_DFM */
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_program_manifest_get_size(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_size(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_manifest_get_size invalid argument\n");
-+		return 0;
-+	}
-+
-+	return manifest->size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_program_ID(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_program_ID invalid argument\n");
-+		return IA_CSS_PROGRAM_INVALID_ID;
-+	}
-+	return manifest->ID;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+	char *base = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_parent(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+
-+	base = (char *)((char *)manifest + manifest->parent_offset);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_parent invalid argument\n");
-+		return NULL;
-+	}
-+	return (ia_css_program_group_manifest_t *)(base);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_cell_type_ID(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
-+		return VIED_NCI_N_CELL_TYPE_ID;
-+	}
-+	return manifest->cell_type_id;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_type_t ia_css_program_manifest_get_type(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_type(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_type invalid argument\n");
-+		return IA_CSS_N_PROGRAM_TYPES;
-+	}
-+	return manifest->program_type;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_terminal_dependency_count(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
-+		return 0;
-+	}
-+	return manifest->terminal_dependency_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_terminal_dependency(
-+	const ia_css_program_manifest_t *manifest,
-+	const unsigned int index)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t *terminal_dep_ptr = NULL;
-+	uint8_t terminal_dependency_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_terminal_dependency(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+	terminal_dependency_count =
-+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+	verifexitval(index < terminal_dependency_count, EFAULT);
-+
-+	terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+			manifest->terminal_dependency_offset + index);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_manifest_get_terminal_dependency invalid argument\n");
-+		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
-+	}
-+	return *terminal_dep_ptr;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_program_manifest_singular_program_type(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	ia_css_program_type_t		program_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_program_manifest_singular_program_type(): enter:\n");
-+
-+	program_type = ia_css_program_manifest_get_type(manifest);
-+
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+	return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_program_dependency_count(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+	    "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
-+		return 0;
-+	}
-+	return manifest->program_dependency_count;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_manifest_get_program_dependency(
-+	const ia_css_program_manifest_t *manifest,
-+	const unsigned int index)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t *program_dep_ptr = NULL;
-+	uint8_t program_dependency_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_program_dependency(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+
-+	program_dependency_count =
-+		ia_css_program_manifest_get_program_dependency_count(manifest);
-+
-+	verifexitval(index < program_dependency_count, EFAULT);
-+	program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
-+			manifest->program_dependency_offset +
-+			index * sizeof(uint8_t));
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_program_dependency invalid argument\n");
-+		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
-+	}
-+	return *program_dep_ptr;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
-+	verifexitval(manifest != NULL, EFAULT);
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
-+		return ia_css_kernel_bitmap_clear();
-+	}
-+	return manifest->kernel_bitmap;
-+}
-+
-+#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
-new file mode 100644
-index 000000000000..f1ef454e6890
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_SIM_INLINE__
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
-new file mode 100644
-index 000000000000..e65e354397df
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
-@@ -0,0 +1,97 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_SIM_TRACE_H
-+#define __IA_CSS_PSYS_SIM_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
-+     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_SIM_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_SIM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_SIM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_SIM_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_SIM_TRACE_METHOD	PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT	PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_SIM_TRACE_LEVEL_ERROR	PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_SIM_TRACE_LEVEL_WARNING	PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_SIM_TRACE_LEVEL_INFO	PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG	PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE	PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
-new file mode 100644
-index 000000000000..b6a4bd600c5b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
-new file mode 100644
-index 000000000000..4cf50b81ed52
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
-+#define __IA_CSS_PSYS_STATIC_TRACE_H
-+
-+#include "ia_css_psysapi_trace.h"
-+
-+#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+/* Default sub-module tracing config */
-+#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
-+     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
-+	PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
-+#endif
-+
-+/* Module/sub-module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
-+	/* Module/sub-module specific trace setting */
-+	#if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_STATIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_STATIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_STATIC_TRACE_METHOD \
-+			IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+			IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_DATA Tracing level defined"
-+	#endif
-+#else
-+	/* Inherit Module trace setting */
-+	#define PSYSAPI_STATIC_TRACE_METHOD \
-+		PSYSAPI_TRACE_METHOD
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
-+		PSYSAPI_TRACE_LEVEL_ASSERT
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
-+		PSYSAPI_TRACE_LEVEL_ERROR
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
-+		PSYSAPI_TRACE_LEVEL_WARNING
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
-+		PSYSAPI_TRACE_LEVEL_INFO
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
-+		PSYSAPI_TRACE_LEVEL_DEBUG
-+	#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
-+		PSYSAPI_TRACE_LEVEL_VERBOSE
-+#endif
-+
-+#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
-new file mode 100644
-index 000000000000..f6d2cc43c2b6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
-@@ -0,0 +1,403 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_H
-+#define __IA_CSS_PSYS_TERMINAL_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.h
-+ *
-+ * Define the methods on the terminal object that are not part of
-+ * a single interface
-+ */
-+
-+#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
-+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>		/* bool */
-+#include <print_support.h>		/* FILE */
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+
-+/*
-+ * Creation
-+ */
-+#include <ia_css_psys_terminal.hsys.user.h>
-+
-+/*! Boolean test if the terminal object type is input
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return true if the terminal is input, false otherwise or on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_input(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! Get the stored size of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return size, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+size_t ia_css_terminal_get_size(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! Get the type of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the type of the terminal, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_type_t ia_css_terminal_get_type(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! Set the type of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+ @param	terminal_type[in]		type of the terminal
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_type(
-+	ia_css_terminal_t		*terminal,
-+	const ia_css_terminal_type_t	terminal_type);
-+
-+/*! Get the index of the terminal manifest object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the index of the terminal manifest object, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_terminal_get_terminal_manifest_index(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! Set the index of the terminal manifest object
-+
-+ @param	terminal[in]			terminal object
-+ @param	tm_index[in]			terminal manifest index
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_terminal_manifest_index(
-+	ia_css_terminal_t	*terminal,
-+	const uint16_t		tm_index);
-+
-+/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint32_t ia_css_terminal_get_payload_size(
-+	const ia_css_terminal_t *terminal);
-+
-+/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
-+
-+ @param	terminal[in]			terminal object
-+ @param	payload_size[in]		Size of buffer that will be supplied to the terminal
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_payload_size(
-+	ia_css_terminal_t *terminal,
-+	uint32_t payload_size);
-+
-+/*! Get id of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_get_ID(
-+	const ia_css_terminal_t			*terminal);
-+
-+/*! Get compressed byte of the data terminal object
-+
-+ @param	dterminal[in]			data terminal object
-+ @param val[out]			is_compressed value
-+
-+ @@return < 0 on error
-+ */
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_is_compressed(
-+	const ia_css_data_terminal_t *dterminal,
-+	uint8_t *val);
-+
-+/*! Get kernel id of the data terminal object
-+
-+ @param	dterminal[in]			data terminal object
-+
-+ @return kernel id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_get_kernel_id(
-+	const ia_css_data_terminal_t			*dterminal);
-+
-+/*! Get the connection type from the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return buffer type, limit value on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
-+	const ia_css_data_terminal_t	*dterminal);
-+
-+/*! Set the connection type of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+ @param	connection_type[in]		connection type
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_connection_type(
-+	ia_css_data_terminal_t				*dterminal,
-+	const ia_css_connection_type_t			connection_type);
-+
-+/*! Get link id of the data terminal object
-+
-+ @param	dterminal[in]			data terminal object
-+
-+ @return link id of terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_get_link_id(
-+	const ia_css_data_terminal_t			*dterminal);
-+
-+/*! Set link id of the terminal object
-+
-+ @param	terminal[in]			data terminal object
-+ @param	link_id[in]			synchronization link id
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_link_id(
-+	ia_css_data_terminal_t				*dterminal,
-+	const uint8_t					link_id);
-+
-+/*! Set stream2gen buffer size used in stream to GEN connection
-+ * This function should be called, in case we are in streaming use-case, and
-+ * we need to configure the stream2gen_buffer_size to be less than full image's height.
-+ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
-+ * during terminal_create function.
-+
-+ * @param	terminal[in]			data terminal object
-+ * @param	stream2gen_buffer_size[in]		Buffer size (Size's units are lines)
-+
-+ * @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_set_stream2gen_buffer_size(
-+	ia_css_data_terminal_t *dterminal,
-+	const uint16_t stream2gen_buffer_size);
-+
-+/*! Get the (pointer to) the process group parent of the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the pointer to the parent, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_process_group_t *ia_css_terminal_get_parent(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! Set the (pointer to) the process group parent of the terminal object
-+
-+ @param	terminal[in]	terminal object
-+ @param	parent[in]	(pointer to the) process group parent object
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_parent(
-+	ia_css_terminal_t	*terminal,
-+	ia_css_process_group_t	*parent);
-+
-+/*! Boolean test if the terminal object type is valid
-+
-+ @param	terminal[in]			process terminal object
-+ @param	terminal_manifest[in]		program terminal manifest
-+
-+ @return true if the process terminal object is correct, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_valid(
-+	const ia_css_terminal_t		 *terminal,
-+	const ia_css_terminal_manifest_t *terminal_manifest);
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+
-+/*!
-+ * Gets the program init terminal descripor size
-+ * @param manifest[in]		program control init terminal manifest
-+ * @param pg_manifest[in]	program group manifest
-+ * @param kernel_bitmap[in]	kernel enable bitmap
-+ * @return size, error if < 0.
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int
-+ia_css_program_control_init_terminal_get_descriptor_size(
-+	const ia_css_program_control_init_terminal_manifest_t *manifest,
-+	const ia_css_program_group_manifest_t *pg_manifest,
-+	ia_css_kernel_bitmap_t kernel_bitmap);
-+
-+/*!
-+ * Initialize program control init terminal
-+ * @param nof_fragments[in]	Number of fragments
-+ * @param terminal[in]		program control init terminal
-+ * @param manifest[in]		program control init terminal manifest
-+ * @param pg_manifest[in]	program group manifest
-+ * @param kernel_bitmap[in]	kernel enable bitmap
-+ * @return < 0 on erro
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int
-+ia_css_program_control_init_terminal_init(
-+	ia_css_program_control_init_terminal_t *terminal,
-+	const ia_css_program_control_init_terminal_manifest_t *manifest,
-+	const ia_css_program_group_manifest_t *pg_manifest,
-+	ia_css_kernel_bitmap_t kernel_bitmap);
-+
-+/*!
-+ * Get a program desc for a program control init terminal
-+  * @param terminal[in]		program control init terminal
-+ * @param manifest[in]		program control init terminal manifest
-+ * @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_program_desc_t *
-+ia_css_program_control_init_terminal_get_program_desc(
-+	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
-+	const unsigned int program_index
-+);
-+
-+/*!
-+ * Pretty prints the program control init termnial
-+ * @param terminal[in]		program control init terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+void ia_css_program_control_init_terminal_print(
-+	const ia_css_program_control_init_terminal_t *terminal);
-+
-+/*!
-+ * Returns the number of connect sections per program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return number of connect sections
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
-+	const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Returns the number of connect sections per program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return number of connect sections
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
-+	const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Returns the memory offset of the first load section in the program
-+ * @param program_desc[in] program control init terminal program desc
-+ * @return memory offset
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
-+	const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Gets a load section desc for a program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]		program control init terminal program desc
-+ * @param load_section_index[in]	section index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_load_section_desc_t *
-+ia_css_program_control_init_terminal_get_load_section_desc(
-+	const ia_css_program_control_init_program_desc_t *program_desc,
-+	const unsigned int load_section_index
-+);
-+
-+/*!
-+ * Gets process_id from program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]		program control init terminal program desc
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
-+	const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Set control info of program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]	program control init terminal program desc
-+ * @param process_id 		unique process id used to identify the process
-+ * among all active process
-+ * @param num_done_events 	number of events required to close the process
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+void ia_css_program_control_init_terminal_set_control_info(
-+	ia_css_program_control_init_program_desc_t *program_desc,
-+	ia_css_process_id_t process_id,
-+	uint8_t num_done_events);
-+
-+/*!
-+ * Gets num_done_events value from program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]		program control init terminal program desc
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
-+	const ia_css_program_control_init_program_desc_t *program_desc);
-+
-+/*!
-+ * Gets a connect section desc for a program desc
-+ * of a program control init terminal
-+ * @param program_desc[in]		program control init terminal program desc
-+ * @param connect_section_index[in]	section index
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_program_control_init_connect_section_desc_t *
-+ia_css_program_control_init_terminal_get_connect_section_desc(
-+	const ia_css_program_control_init_program_desc_t *program_desc,
-+	const unsigned int connect_section_index
-+);
-+
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_terminal_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
-new file mode 100644
-index 000000000000..11db05fb9191
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
-@@ -0,0 +1,257 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
-+#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.hsys.user.h
-+ *
-+ * Define the methods on the terminal object: Hsys user interface
-+ */
-+
-+#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
-+#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <type_support.h>					/* bool */
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_kernel_bitmap.h"
-+
-+/*
-+ * Creation
-+ */
-+
-+/*
-+ * This source file is created with the intention of sharing and
-+ * compiled for host and firmware. Since there is no native 64bit
-+ * data type support for firmware this wouldn't compile for SP
-+ * tile. The part of the file that is not compilable are marked
-+ * with the following __VIED_CELL marker and this comment. Once we
-+ * come up with a solution to address this issue this will be
-+ * removed.
-+ */
-+#if !defined(__VIED_CELL)
-+/*! Compute the size of storage required for allocating the terminal object
-+
-+ @param	manifest[in]			terminal manifest
-+ @param	param[in]				program group parameters
-+
-+ @return 0 on error
-+ */
-+extern size_t ia_css_sizeof_terminal(
-+	const ia_css_terminal_manifest_t		*manifest,
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! Create the terminal object
-+
-+ @param	raw_mem[in]				pre allocated memory
-+ @param	manifest[in]			terminal manifest
-+ @param	terminal_param[in]		terminal parameter
-+ @param enable_bitmap			program group enable bitmap
-+
-+ @return NULL on error
-+ */
-+extern ia_css_terminal_t *ia_css_terminal_create(
-+	void *raw_mem,
-+	const ia_css_terminal_manifest_t		*manifest,
-+	const ia_css_terminal_param_t			*terminal_param,
-+	ia_css_kernel_bitmap_t				enable_bitmap);
-+
-+/*! Destroy (the storage of) the process object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_t *ia_css_terminal_destroy(
-+	ia_css_terminal_t *terminal);
-+#endif /* !defined(__VIED_CELL) */
-+
-+/*! Print the terminal object to file/stream
-+
-+ @param	terminal[in]			terminal object
-+ @param	fid[out]				file/stream handle
-+
-+ @return < 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_print(
-+	const ia_css_terminal_t					*terminal,
-+	void *fid);
-+
-+/*! Get the (pointer to) the frame object in the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the pointer to the frame, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_frame_t *ia_css_data_terminal_get_frame(
-+	const ia_css_data_terminal_t		*terminal);
-+
-+/*! Get the (pointer to) the frame descriptor object in the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the pointer to the frame descriptor, NULL on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
-+	const ia_css_data_terminal_t		*dterminal);
-+
-+/*! Get the (pointer to) the fragment descriptor object in the terminal object
-+
-+ @param	terminal[in]			terminal object
-+
-+@return the pointer to the fragment descriptor, NULL on error
-+*/
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+ia_css_fragment_descriptor_t
-+	*ia_css_data_terminal_get_fragment_descriptor(
-+		const ia_css_data_terminal_t		*dterminal,
-+		const unsigned int			fragment_index);
-+
-+/*! Get the number of fragments on the terminal
-+
-+ @param	terminal[in]			terminal object
-+
-+ @return the fragment count, 0 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint16_t ia_css_data_terminal_get_fragment_count(
-+	const ia_css_data_terminal_t		*dterminal);
-+
-+/*! Get the number of section on the (param)terminal
-+ @param	manifest[in]			terminal manifest
-+ @param	terminal_param[in]		terminal parameter
-+
-+ @return the section count, 0 on error
-+ */
-+extern uint16_t ia_css_param_terminal_compute_section_count(
-+	const ia_css_terminal_manifest_t	*manifest,
-+	const ia_css_program_group_param_t	*param);
-+
-+/*! Get the number of planes on the (data)terminal
-+ @param	manifest[in]			terminal manifest
-+ @param	terminal_param[in]		terminal parameter
-+
-+ @return the plane count, 1(default) on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+uint8_t ia_css_data_terminal_compute_plane_count(
-+	const ia_css_terminal_manifest_t		*manifest,
-+	const ia_css_program_group_param_t		*param);
-+
-+/*! check if given terminal is parameter terminal.
-+
-+ @param	terminal[in]			(base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_parameter_terminal(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! check if given terminal is program terminal.
-+
-+ @program	terminal[in]			(base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_program_terminal(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! check if given terminal is program control init terminal.
-+
-+ @program control init	terminal[in]			(base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_program_control_init_terminal(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! check if given terminal is spatial parameter terminal.
-+
-+ @spatial	terminal[in]			(base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_spatial_parameter_terminal(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! check if given terminal is data terminal.
-+
-+ @param	terminal[in]			(base)terminal object
-+
-+ @return true on success, false on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_data_terminal(
-+	const ia_css_terminal_t					*terminal);
-+
-+/*! obtain buffer out of terminal(both data & param terminals can call this)
-+
-+ @param	terminal[in]	(base)terminal object of either data or param terminal.
-+
-+ @return vied address of buffer stored in terminal
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+vied_vaddress_t  ia_css_terminal_get_buffer(
-+		const ia_css_terminal_t *terminal);
-+
-+/*!store a buffer in the terminal.
-+
-+ @param	terminal[in]	(base)terminal object of either data or param terminal.
-+ @param buffer[in]	buffer in vied (hrt address) space.
-+
-+ @return 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
-+int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
-+				vied_vaddress_t buffer);
-+
-+/*! Obtain terminal buffer index out of terminal object
-+
-+ @param	terminal[in]	(base)terminal object of either data or param terminal.
-+
-+ @return terminal buffer index stored in terminal object on success, -1 on error
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_get_terminal_index(
-+	const ia_css_terminal_t *terminal);
-+
-+/*! Store a terminal buffer index in the terminal object
-+
-+ @param	terminal[in]		(base)terminal object of either data or param terminal.
-+ @param terminal_index[in]	terminal buffer index
-+
-+ @return 0 on success
-+ */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_index(
-+	ia_css_terminal_t *terminal,
-+	unsigned int terminal_index);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
-new file mode 100644
-index 000000000000..2ca5d1901b95
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
-@@ -0,0 +1,2053 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
-+#define __IA_CSS_PSYS_TERMINAL_IMPL_H
-+
-+#include <ia_css_psys_terminal.h>
-+
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_program_group_param.h>
-+
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_process_group.hsys.user.h>
-+
-+#include <type_support.h>
-+#include <error_support.h>	/* for verifexit, verifjmpexit */
-+#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
-+#include <misc_support.h>	/* for NOT_USED */
-+#include "ia_css_psys_terminal_private_types.h"
-+#include "ia_css_terminal_manifest_types.h"
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_psys_manifest_types.h"
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_types.h"
-+
-+STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
-+	void *fid) {
-+
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	int i;
-+	ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
-+	uint16_t fragment_count =
-+		ia_css_data_terminal_get_fragment_count(dterminal);
-+	verifexitval(fragment_count != 0, EINVAL);
-+
-+	retval = ia_css_frame_descriptor_print(
-+		ia_css_data_terminal_get_frame_descriptor(dterminal),
-+		fid);
-+	verifexitval(retval == 0, EINVAL);
-+
-+	retval = ia_css_frame_print(
-+		ia_css_data_terminal_get_frame(dterminal), fid);
-+	verifexitval(retval == 0, EINVAL);
-+
-+	for (i = 0; i < (int)fragment_count; i++) {
-+		retval = ia_css_fragment_descriptor_print(
-+			ia_css_data_terminal_get_fragment_descriptor(
-+				dterminal, i), fid);
-+		verifexitval(retval == 0, EINVAL);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
-+
-+	retval = 0;
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_print(
-+	const ia_css_terminal_t *terminal,
-+	void *fid)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_terminal_print(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+		"\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
-+		(unsigned long int)terminal,
-+		(int)ia_css_terminal_get_size(terminal),
-+		(int)ia_css_terminal_get_type(terminal),
-+		(unsigned long int)ia_css_terminal_get_parent(terminal));
-+
-+	switch (term_type) {
-+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+		ia_css_program_control_init_terminal_print(
-+			(ia_css_program_control_init_terminal_t *)terminal);
-+	break;
-+	case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+		ia_css_data_terminal_print(terminal, fid);
-+	break;
-+	default:
-+		/* other terminal prints are currently not supported */
-+	break;
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_print invalid argument terminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_input(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	bool is_input = false;
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_input(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+	switch (terminal_type) {
-+	case IA_CSS_TERMINAL_TYPE_DATA_IN:		/* Fall through */
-+	case IA_CSS_TERMINAL_TYPE_STATE_IN:		/* Fall through */
-+	case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:		/* Fall through */
-+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+	case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+		is_input = true;
-+		break;
-+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:		/* Fall through */
-+	case IA_CSS_TERMINAL_TYPE_STATE_OUT:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+		is_input = false;
-+		break;
-+	default:
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_input: Unknown terminal type (%d)\n",
-+			terminal_type);
-+		goto EXIT;
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_input invalid argument\n");
-+	}
-+	return is_input;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+size_t ia_css_terminal_get_size(
-+	const ia_css_terminal_t	*terminal)
-+{
-+	DECLARE_ERRVAL
-+	size_t size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_size(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	size = terminal->size;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_size invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_type_t ia_css_terminal_get_type(
-+	const ia_css_terminal_t	*terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_type(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	terminal_type = terminal->terminal_type;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_type invalid argument\n");
-+	}
-+	return terminal_type;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_type(
-+	ia_css_terminal_t *terminal,
-+	const ia_css_terminal_type_t terminal_type)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_type(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	terminal->terminal_type = terminal_type;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_type invalid argument terminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_type failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_terminal_get_terminal_manifest_index(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	uint16_t terminal_manifest_index;
-+
-+	terminal_manifest_index = 0xffff;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_terminal_manifest_index(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	terminal_manifest_index = terminal->tm_index;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
-+	}
-+	return terminal_manifest_index;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_manifest_index(
-+	ia_css_terminal_t *terminal,
-+	const uint16_t terminal_manifest_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_terminal_manifest_index(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+	terminal->tm_index = terminal_manifest_index;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint32_t ia_css_terminal_get_payload_size(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	uint32_t payload_size;
-+
-+	payload_size = 0;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_payload_size(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	payload_size = terminal->payload_size;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_payload_size: invalid argument\n");
-+	}
-+	return payload_size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_payload_size(
-+	ia_css_terminal_t *terminal,
-+	uint32_t payload_size)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_payload_size(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+	terminal->payload_size = payload_size;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_payload_size: invalid argument terminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_payload_size: failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_terminal_ID_t ia_css_terminal_get_ID(
-+	const ia_css_terminal_t	*terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_ID(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	retval = terminal->ID;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_ID invalid argument\n");
-+		retval = 0;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_get_kernel_id(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_kernel_id(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	retval = dterminal->kernel_id;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_kernel_id: invalid argument\n");
-+		retval =  0;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_is_compressed(
-+	const ia_css_data_terminal_t *dterminal,
-+	uint8_t *val)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	const ia_css_frame_descriptor_t *frame_descriptor;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_is_compressed enter\n");
-+
-+	frame_descriptor =
-+		ia_css_data_terminal_get_frame_descriptor(dterminal);
-+
-+	verifexitval(frame_descriptor != NULL, EFAULT);
-+
-+	*val = frame_descriptor->is_compressed;
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_is_compressed: Null frame descriptor\n");
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_connection_type(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	connection_type = dterminal->connection_type;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_connection_type: invalid argument\n");
-+	}
-+	return connection_type;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_get_link_id(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t link_id = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_link_id(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	link_id = dterminal->link_id;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_link_id: invalid argument\n");
-+	}
-+	return link_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_link_id(
-+	ia_css_data_terminal_t *dterminal,
-+	const uint8_t link_id)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_set_link_id(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+	dterminal->link_id = link_id;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_link_id: invalid argument terminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_link_id: failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_connection_type(
-+	ia_css_data_terminal_t *dterminal,
-+	const ia_css_connection_type_t connection_type)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_set_connection_type(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	dterminal->connection_type = connection_type;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_connection_type failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_set_stream2gen_buffer_size(
-+	ia_css_data_terminal_t *dterminal,
-+	const uint16_t stream2gen_buffer_size)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
-+		"ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
-+	dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
-+			retval);
-+	}
-+
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_group_t *ia_css_terminal_get_parent(
-+	const ia_css_terminal_t	*terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_group_t *parent = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_parent(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+	if (terminal->parent_offset == 0) {
-+		return NULL;
-+	}
-+
-+	parent = (ia_css_process_group_t *) ((char *)terminal +
-+					terminal->parent_offset);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_parent invalid argument\n");
-+	}
-+	return parent;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_parent(
-+	ia_css_terminal_t *terminal,
-+	ia_css_process_group_t *parent)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_parent(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+	verifexitval(parent != NULL, EFAULT);
-+
-+	terminal->parent_offset = (uint16_t) ((char *)parent -
-+						(char *)terminal);
-+
-+	retval = 0;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_parent invalid argument\n");
-+	}
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_parent failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_frame_t *ia_css_data_terminal_get_frame(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_frame_t *frame = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_frame(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	frame = (ia_css_frame_t	*)(&(dterminal->frame));
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_frame invalid argument\n");
-+	}
-+	return frame;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_frame_descriptor_t *frame_descriptor = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+
-+	frame_descriptor =
-+		(ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
-+	}
-+	return frame_descriptor;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
-+	const ia_css_data_terminal_t *dterminal,
-+	const unsigned int fragment_index)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
-+	uint16_t fragment_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
-+
-+	fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+	verifexitval(fragment_count != 0, EINVAL);
-+	verifexitval(fragment_index < fragment_count, EINVAL);
-+
-+	fragment_descriptor = (ia_css_fragment_descriptor_t *)
-+		((char *)dterminal + dterminal->fragment_descriptor_offset);
-+
-+	fragment_descriptor += fragment_index;
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
-+	}
-+	return fragment_descriptor;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint16_t ia_css_data_terminal_get_fragment_count(
-+	const ia_css_data_terminal_t *dterminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_process_group_t *parent;
-+	uint16_t fragment_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_get_fragment_count(): enter:\n");
-+
-+	parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
-+
-+	verifexitval(dterminal != NULL, EFAULT);
-+	verifexitval(parent != NULL, EFAULT);
-+
-+	fragment_count = ia_css_process_group_get_fragment_count(parent);
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_get_fragment_count: invalid argument\n");
-+	}
-+	return fragment_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_parameter_terminal(
-+	const ia_css_terminal_t	*terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_parameter_terminal(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	/* will return an error value on error */
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_parameter_terminal: invalid argument\n");
-+	}
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_data_terminal(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_data_terminal(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	/* will return an error value on error */
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_data_terminal invalid argument\n");
-+	}
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
-+			terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_program_terminal(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_program_terminal(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	/* will return an error value on error */
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_program_terminal: invalid argument\n");
-+	}
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_program_control_init_terminal(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_program_control_init_terminal(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	/* will return an error value on error */
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
-+	}
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_spatial_parameter_terminal(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	/* will return an error value on error */
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
-+	}
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_data_terminal_compute_plane_count(
-+	const ia_css_terminal_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	DECLARE_ERRVAL
-+	uint8_t	plane_count = 1;
-+
-+	NOT_USED(manifest);
-+	NOT_USED(param);
-+
-+	verifexitval(manifest != NULL, EFAULT);
-+	verifexitval(param != NULL, EFAULT);
-+	/* TODO: Implementation Missing*/
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_data_terminal_compute_plane_count(): enter:\n");
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_data_terminal_compute_plane_count: invalid argument\n");
-+	}
-+	return plane_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+vied_vaddress_t  ia_css_terminal_get_buffer(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	vied_vaddress_t buffer = VIED_NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_buffer(): enter:\n");
-+
-+	verifexitval(terminal != NULL, EFAULT);
-+	if (ia_css_is_terminal_data_terminal(terminal)) {
-+		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+
-+		verifexitval(frame != NULL, EFAULT);
-+		buffer = ia_css_frame_get_buffer(frame);
-+	} else if (ia_css_is_terminal_parameter_terminal(terminal)) {
-+		const ia_css_param_terminal_t *param_terminal =
-+			(const ia_css_param_terminal_t *)terminal;
-+
-+		verifexitval(param_terminal != NULL, EFAULT);
-+		buffer = param_terminal->param_payload.buffer;
-+	}  else if (ia_css_is_terminal_program_terminal(terminal)) {
-+		const ia_css_program_terminal_t *program_terminal =
-+			(const ia_css_program_terminal_t *)terminal;
-+
-+		verifexitval(program_terminal != NULL, EFAULT);
-+		buffer = program_terminal->param_payload.buffer;
-+	}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
-+		const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
-+			(const ia_css_program_control_init_terminal_t *)terminal;
-+
-+		verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
-+		buffer = program_ctrl_init_terminal->param_payload.buffer;
-+	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
-+		const ia_css_spatial_param_terminal_t *spatial_terminal =
-+			(const ia_css_spatial_param_terminal_t *)terminal;
-+
-+		verifexitval(spatial_terminal != NULL, EFAULT);
-+		buffer = spatial_terminal->param_payload.buffer;
-+	}
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_buffer: invalid argument terminal\n");
-+	}
-+	return buffer;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_buffer(
-+	ia_css_terminal_t *terminal,
-+	vied_vaddress_t buffer)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+	ia_css_param_terminal_t *pterminal = NULL;
-+	ia_css_program_terminal_t *prog_terminal = NULL;
-+	ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
-+	ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_buffer(): enter:\n");
-+
-+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+		/* Currently using Frames inside data terminal ,
-+		 * TODO: start directly using data.
-+		 */
-+		ia_css_data_terminal_t *dterminal =
-+			(ia_css_data_terminal_t *)terminal;
-+		ia_css_frame_t *frame =
-+			ia_css_data_terminal_get_frame(dterminal);
-+
-+		verifexitval(frame != NULL, EFAULT);
-+		retval = ia_css_frame_set_buffer(frame, buffer);
-+		verifexitval(retval == 0, EINVAL);
-+	} else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
-+		pterminal = (ia_css_param_terminal_t *)terminal;
-+		verifexitval(pterminal != NULL, EFAULT);
-+		pterminal->param_payload.buffer = buffer;
-+		retval = 0;
-+	} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
-+		prog_terminal = (ia_css_program_terminal_t *)terminal;
-+		verifexitval(prog_terminal != NULL, EFAULT);
-+		prog_terminal->param_payload.buffer = buffer;
-+		retval = 0;
-+	} else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
-+		progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
-+		verifexitval(progctrl_terminal != NULL, EFAULT);
-+		progctrl_terminal->param_payload.buffer = buffer;
-+		retval = 0;
-+	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
-+			true) {
-+		spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
-+		verifexitval(spatial_terminal != NULL, EFAULT);
-+		spatial_terminal->param_payload.buffer = buffer;
-+		retval = 0;
-+	} else {
-+		return retval;
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_buffer failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_get_terminal_index(
-+	const ia_css_terminal_t *terminal)
-+{
-+	DECLARE_ERRVAL
-+	int terminal_index = -1;
-+	verifexitval(terminal != NULL, EFAULT);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_get_terminal_index(): enter:\n");
-+
-+	if (ia_css_is_terminal_data_terminal(terminal)) {
-+		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
-+					(ia_css_data_terminal_t *)terminal);
-+
-+		verifexitval(frame != NULL, EFAULT);
-+		terminal_index = ia_css_frame_get_data_index(frame);
-+	} else {
-+		if (ia_css_is_terminal_parameter_terminal(terminal)) {
-+			const ia_css_param_terminal_t *param_terminal =
-+				(const ia_css_param_terminal_t *)terminal;
-+			verifexitval(param_terminal != NULL, EFAULT);
-+			terminal_index = param_terminal->param_payload.terminal_index;
-+		}  else if (ia_css_is_terminal_program_terminal(terminal)) {
-+			const ia_css_program_terminal_t *program_terminal =
-+				(const ia_css_program_terminal_t *)terminal;
-+			verifexitval(program_terminal != NULL, EFAULT);
-+			terminal_index = program_terminal->param_payload.terminal_index;
-+		}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
-+			const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
-+				(const ia_css_program_control_init_terminal_t *)terminal;
-+			verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
-+			terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
-+		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
-+			const ia_css_spatial_param_terminal_t *spatial_terminal =
-+				(const ia_css_spatial_param_terminal_t *)terminal;
-+			verifexitval(spatial_terminal != NULL, EFAULT);
-+			terminal_index = spatial_terminal->param_payload.terminal_index;
-+		} else {
-+			verifjmpexit(0);
-+		}
-+	}
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_get_terminal_index: invalid argument\n");
-+	}
-+	return terminal_index;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int ia_css_terminal_set_terminal_index(
-+	ia_css_terminal_t *terminal,
-+	unsigned int terminal_index)
-+{
-+	DECLARE_ERRVAL
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_terminal_set_terminal_index(): enter:\n");
-+
-+	if (ia_css_is_terminal_data_terminal(terminal) == true) {
-+		/* Currently using Frames inside data terminal ,
-+		 * TODO: start directly using data.
-+		 */
-+		ia_css_data_terminal_t *dterminal =
-+			(ia_css_data_terminal_t *)terminal;
-+		ia_css_frame_t *frame =
-+			ia_css_data_terminal_get_frame(dterminal);
-+
-+		verifexitval(frame != NULL, EFAULT);
-+		retval = ia_css_frame_set_data_index(frame, terminal_index);
-+		verifexitval(retval == 0, EINVAL);
-+	} else {
-+		if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
-+			ia_css_param_terminal_t *pterminal =
-+				(ia_css_param_terminal_t *)terminal;
-+
-+			pterminal->param_payload.terminal_index = terminal_index;
-+			retval = 0;
-+		} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
-+			ia_css_program_terminal_t *pterminal =
-+				(ia_css_program_terminal_t *)terminal;
-+
-+			pterminal->param_payload.terminal_index = terminal_index;
-+			retval = 0;
-+		} else if (ia_css_is_terminal_program_control_init_terminal(terminal)
-+				== true) {
-+			ia_css_program_control_init_terminal_t *pterminal =
-+				(ia_css_program_control_init_terminal_t *)terminal;
-+
-+			pterminal->param_payload.terminal_index = terminal_index;
-+			retval = 0;
-+		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
-+				true) {
-+			ia_css_spatial_param_terminal_t *pterminal =
-+				(ia_css_spatial_param_terminal_t *)terminal;
-+
-+			pterminal->param_payload.terminal_index = terminal_index;
-+			retval = 0;
-+		} else {
-+			return retval;
-+		}
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_set_terminal_index failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
-+	const ia_css_terminal_t *terminal,
-+	const ia_css_terminal_manifest_t *terminal_manifest,
-+	const uint16_t nof_fragments)
-+{
-+	DECLARE_ERRVAL
-+	bool invalid_flag = false;
-+
-+	const ia_css_data_terminal_t *dterminal =
-+		(ia_css_data_terminal_t *)terminal;
-+	const ia_css_data_terminal_manifest_t *dt_manifest =
-+		(ia_css_data_terminal_manifest_t *)terminal_manifest;
-+	const ia_css_frame_descriptor_t *frame_descriptor;
-+	ia_css_frame_format_bitmap_t man_frame_format_bitmap;
-+	ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
-+	uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
-+	uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_data_terminal_valid enter\n");
-+
-+	frame_descriptor =
-+		ia_css_data_terminal_get_frame_descriptor(dterminal);
-+	verifexitval(frame_descriptor != NULL, EFAULT);
-+	man_frame_format_bitmap =
-+		ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+					dt_manifest);
-+	proc_frame_format_bitmap =
-+		ia_css_frame_format_bit_mask(
-+				frame_descriptor->frame_format_type);
-+	/*
-+	 * TODO: Replace by 'validation of frame format type'.
-+	 * Currently frame format type is not correctly set by manifest,
-+	 * waiting for HSD 1804260604
-+	 */
-+	if (man_frame_format_bitmap > 0) {
-+		if ((man_frame_format_bitmap &
-+					proc_frame_format_bitmap) == 0) {
-+			uint32_t *bitmap_arr =
-+				(uint32_t *)&man_frame_format_bitmap;
-+
-+			NOT_USED(bitmap_arr);
-+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+				"Frame format type not defined in manifest\n");
-+			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+				" man bitmap_arr[]: %d,%d\n",
-+				bitmap_arr[1], bitmap_arr[0]);
-+			bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
-+			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+				" proc bitmap_arr[]: %d,%d\n",
-+				bitmap_arr[1], bitmap_arr[0]);
-+		}
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"Frame format bitmap not defined in manifest\n");
-+	}
-+	ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
-+	/*
-+	 * TODO: Replace by validation of Minimal frame column dimensions.
-+	 *  Currently not correctly set by manifest yet,
-+	 *  waiting for HSD 1804260604
-+	 */
-+	if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
-+		min_value[IA_CSS_COL_DIMENSION])) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"Minimal frame column dimensions not set correctly (by manifest)\n");
-+	}
-+	/*
-+	 * TODO: Replace by validation of Minimal frame row dimensions.
-+	 * Currently not correctly set by manifest yet,
-+	 * waiting for HSD 1804260604
-+	 */
-+	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
-+		min_value[IA_CSS_ROW_DIMENSION]) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"Minimal frame row dimensions not set correctly (by manifest)\n");
-+	}
-+
-+	ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
-+	/*
-+	 * TODO: Replace by validation of Maximal frame column dimensions.
-+	 * Currently not correctly set by manifest yet,
-+	 * waiting for HSD 1804260604
-+	 */
-+	if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
-+		max_value[IA_CSS_COL_DIMENSION]) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"Maximal frame column dimensions not set correctly (by manifest)\n");
-+	}
-+	/*
-+	 * TODO: Replace by validation of Maximal frame row dimensions.
-+	 * Currently not correctly set by manifest yet,
-+	 * waiting for HSD 1804260604
-+	 */
-+	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
-+		max_value[IA_CSS_ROW_DIMENSION]) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"Maximal frame row dimensions not set correctly (by manifest)\n");
-+	}
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
-+		min_value[IA_CSS_COL_DIMENSION],
-+		min_value[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
-+		max_value[IA_CSS_COL_DIMENSION],
-+		max_value[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
-+		frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
-+		frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
-+	/*
-+	 * TODO: Add validation of fragment dimensions.
-+	 * Currently not set by manifest yet, waiting for HSD 1804260604
-+	 */
-+	NOT_USED(nof_fragments);
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_data_terminal_valid() invalid argument\n");
-+		return false;
-+	} else {
-+		return (!invalid_flag);
-+	}
-+}
-+
-+STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
-+	const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
-+		*man_seq_info_desc,
-+	const ia_css_kernel_fragment_sequencer_info_desc_t
-+		*term_seq_info_desc)
-+{
-+	NOT_USED(man_seq_info_desc);
-+	NOT_USED(term_seq_info_desc);
-+
-+	/* slice dimension column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_slice_dimension: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_slice_dimension: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_slice_dimension: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
-+
-+	/* slice dimension row */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_slice_dimension: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_slice_dimension: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_slice_dimension: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
-+
-+	/* slice count column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_slice_count: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_slice_count: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_slice_count: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
-+
-+	/* slice count row */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_slice_count: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_slice_count: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_slice_count: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
-+
-+	/* decimation factor column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_point_decimation_factor: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_point_decimation_factor: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
-+		);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_point_decimation_factor: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
-+		);
-+
-+	/* decimation factor row */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_point_decimation_factor: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_point_decimation_factor: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_point_decimation_factor[
-+					IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_point_decimation_factor: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_point_decimation_factor[
-+					IA_CSS_ROW_DIMENSION]);
-+
-+	/* index column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION]);
-+
-+	/* index row */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+
-+	/* dimension column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_overlay_pixel_dimension: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_overlay_pixel_dimension: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_overlay_pixel_dimension: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+
-+	/* dimension column */
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"fragment_grid_overlay_pixel_dimension: %d\n",
-+		term_seq_info_desc->
-+		fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"max_fragment_grid_overlay_pixel_dimension: %d\n",
-+		man_seq_info_desc->
-+		max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
-+		"min_fragment_grid_overlay_pixel_dimension: %d\n",
-+		man_seq_info_desc->
-+		min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
-+	const ia_css_terminal_t	*terminal,
-+	const ia_css_terminal_manifest_t *terminal_manifest,
-+	const uint16_t nof_fragments)
-+{
-+	DECLARE_ERRVAL
-+	bool invalid_flag = false;
-+	uint16_t frag_idx;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_program_terminal_valid enter\n");
-+
-+	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
-+		uint16_t frag_seq_info_count, seq_idx;
-+		const ia_css_program_terminal_t *prog_term;
-+		const ia_css_program_terminal_manifest_t *prog_term_man;
-+
-+		prog_term = (const ia_css_program_terminal_t *)terminal;
-+		prog_term_man =
-+			(const ia_css_program_terminal_manifest_t *)
-+			terminal_manifest;
-+		frag_seq_info_count =
-+			prog_term_man->
-+			kernel_fragment_sequencer_info_manifest_info_count;
-+
-+		for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
-+			const ia_css_kernel_fragment_sequencer_info_desc_t
-+			*term_seq_info_desc;
-+			const
-+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+			man_seq_info_desc;
-+
-+			term_seq_info_desc =
-+		ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+					prog_term, frag_idx, seq_idx,
-+					frag_seq_info_count);
-+			verifexitval(term_seq_info_desc != NULL, EFAULT);
-+			man_seq_info_desc =
-+		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
-+					(prog_term_man, seq_idx);
-+			verifexitval(man_seq_info_desc != NULL, EFAULT);
-+
-+			ia_css_program_terminal_seq_info_print(
-+				man_seq_info_desc, term_seq_info_desc);
-+			/* slice dimension column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+
-+			/* slice dimension row */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+
-+			/* slice count column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION]);
-+
-+			/* slice count row */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION]);
-+
-+			/* decimation factor column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION]);
-+
-+			/* decimation factor row */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION]);
-+
-+			/* index column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION]);
-+
-+			/* index row */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+
-+			/* dimension column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION]);
-+
-+			/* dimension column */
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION] >
-+				man_seq_info_desc->
-+				max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+			invalid_flag = invalid_flag ||
-+				(term_seq_info_desc->
-+				fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION] <
-+				man_seq_info_desc->
-+				min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+		}
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_program_terminal_valid() invalid argument\n");
-+		return false;
-+	}
-+	if (invalid_flag == true) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_is_program_terminal_valid(): validation failed\n");
-+		/* TODO: program terminal parameters not correctly defined,
-+		 * disable validation result until issues has been solved
-+		 */
-+		return true;
-+	}
-+	return (!invalid_flag);
-+}
-+
-+STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
-+	const ia_css_terminal_t *terminal,
-+	const ia_css_terminal_manifest_t *terminal_manifest,
-+	const uint16_t nof_fragments)
-+{
-+	DECLARE_ERRVAL
-+	bool invalid_flag = false;
-+	uint16_t frag_idx;
-+
-+	uint16_t slice_idx, section_idx;
-+
-+	const ia_css_sliced_param_terminal_t *sliced_term =
-+		(const ia_css_sliced_param_terminal_t *)terminal;
-+	verifexitval(sliced_term != NULL, EFAULT);
-+	const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
-+		(const ia_css_sliced_param_terminal_manifest_t *)
-+		terminal_manifest;
-+	verifexitval(sliced_term_man != NULL, EFAULT);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_sliced_terminal_valid enter\n");
-+
-+	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
-+		const ia_css_fragment_slice_desc_t *fragment_slice_desc =
-+			ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+				sliced_term, frag_idx);
-+
-+		verifexitval(fragment_slice_desc != NULL, EFAULT);
-+
-+		for (slice_idx = 0;
-+			slice_idx < fragment_slice_desc->slice_count;
-+			slice_idx++) {
-+			for (section_idx = 0;
-+				section_idx <
-+				sliced_term_man->sliced_param_section_count;
-+				section_idx++) {
-+				const
-+				ia_css_sliced_param_manifest_section_desc_t *
-+					slice_man_section_desc;
-+				const ia_css_slice_param_section_desc_t *
-+					slice_section_desc;
-+
-+				slice_man_section_desc =
-+		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+						sliced_term_man, section_idx);
-+				slice_section_desc =
-+		ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+						sliced_term, frag_idx,
-+						slice_idx, section_idx,
-+						sliced_term_man->
-+						sliced_param_section_count);
-+				verifexitval(slice_man_section_desc != NULL, EFAULT);
-+				verifexitval(slice_section_desc != NULL, EFAULT);
-+
-+				invalid_flag = invalid_flag ||
-+					(slice_section_desc->mem_size >
-+					slice_man_section_desc->max_mem_size);
-+			}
-+		}
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+				"ia_css_is_sliced_terminal_valid() invalid argument\n");
-+		return false;
-+	} else {
-+		return (!invalid_flag);
-+	}
-+
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_valid(
-+	const ia_css_terminal_t	*terminal,
-+	const ia_css_terminal_manifest_t *terminal_manifest)
-+{
-+	DECLARE_ERRVAL
-+	bool is_valid = false;
-+	uint16_t nof_fragments;
-+	ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
-+
-+	verifexitval(NULL != terminal, EFAULT);
-+	verifexitval(NULL != terminal_manifest, EFAULT);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_is_terminal_valid enter\n");
-+
-+	nof_fragments = ia_css_data_terminal_get_fragment_count(
-+				(const ia_css_data_terminal_t *)terminal);
-+	terminal_type = ia_css_terminal_get_type(terminal);
-+
-+	switch (terminal_type) {
-+	case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+		is_valid = ia_css_is_data_terminal_valid(terminal,
-+				terminal_manifest, nof_fragments);
-+		break;
-+	case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+		is_valid = ia_css_is_program_terminal_valid(terminal,
-+				terminal_manifest, nof_fragments);
-+		break;
-+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+		/* Nothing to be validated for cached and spatial
-+		*  parameters, return valid
-+		*/
-+		is_valid = true;
-+		break;
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+		is_valid = ia_css_is_sliced_terminal_valid(terminal,
-+				terminal_manifest, nof_fragments);
-+		break;
-+	default:
-+		/* Terminal type unknown, return invalid */
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_is_terminal_valid() Terminal type %x unknown\n",
-+			(int)terminal_type);
-+		is_valid = false;
-+		break;
-+	}
-+
-+EXIT:
-+	if (haserror(EFAULT)) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_is_terminal_valid() invalid argument\n");
-+		return false;
-+	}
-+	/* TODO: to be removed once all PGs pass validation */
-+	if (is_valid == false) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"ia_css_is_terminal_valid(): type: %d validation failed\n",
-+			terminal_type);
-+	}
-+	return is_valid;
-+}
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+int
-+ia_css_program_control_init_terminal_init(
-+	ia_css_program_control_init_terminal_t *terminal,
-+	const ia_css_program_control_init_terminal_manifest_t *manifest,
-+	const ia_css_program_group_manifest_t *pg_manifest,
-+	ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+	int retval = -1;
-+	unsigned int i;
-+	unsigned int base_load_sec;
-+	unsigned int base_connect_sec;
-+	unsigned int load_index = 0;
-+	unsigned int connect_index = 0;
-+	unsigned int load_section_count = 0;
-+	unsigned int connect_section_count = 0;
-+
-+	ia_css_program_control_init_manifest_program_desc_t *man_progs;
-+	ia_css_program_manifest_t *prog_manifest;
-+
-+	verifjmpexit(terminal != NULL);
-+
-+	man_progs =
-+	ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
-+	verifjmpexit(man_progs != NULL);
-+
-+	for (i = 0; i < manifest->program_count; i++) {
-+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+		verifjmpexit(prog_manifest != NULL);
-+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+			continue;
-+		}
-+		load_section_count += man_progs[i].load_section_count;
-+		connect_section_count += man_progs[i].connect_section_count;
-+	}
-+
-+	terminal->program_count = manifest->program_count;
-+	terminal->program_section_desc_offset =
-+		sizeof(ia_css_program_control_init_terminal_t);
-+
-+	base_load_sec = /* base_load_sec relative to first program */
-+		terminal->program_count *
-+		sizeof(ia_css_program_control_init_program_desc_t);
-+
-+	base_connect_sec = base_load_sec +
-+		load_section_count *
-+		sizeof(ia_css_program_control_init_load_section_desc_t);
-+
-+	for (i = 0; i < terminal->program_count; i++) {
-+		ia_css_program_control_init_program_desc_t *prog;
-+
-+		prog = ia_css_program_control_init_terminal_get_program_desc(
-+				terminal, i);
-+		verifjmpexit(prog != NULL);
-+
-+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+		verifjmpexit(prog_manifest != NULL);
-+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+			prog->load_section_count = 0;
-+			prog->connect_section_count = 0;
-+			prog->load_section_desc_offset = 0;
-+			prog->connect_section_desc_offset  = 0;
-+			continue;
-+		}
-+
-+		prog->load_section_count = man_progs[i].load_section_count;
-+		prog->connect_section_count = man_progs[i].connect_section_count;
-+
-+		prog->load_section_desc_offset =
-+			base_load_sec +
-+			load_index *
-+			sizeof(ia_css_program_control_init_load_section_desc_t) -
-+			i * sizeof(ia_css_program_control_init_program_desc_t);
-+		prog->connect_section_desc_offset =
-+			base_connect_sec +
-+			connect_index *
-+			sizeof(ia_css_program_control_init_connect_section_desc_t) -
-+			i * sizeof(ia_css_program_control_init_program_desc_t);
-+
-+		load_index += man_progs[i].load_section_count;
-+		connect_index += man_progs[i].connect_section_count;
-+	}
-+	retval = 0;
-+EXIT:
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int
-+ia_css_program_control_init_terminal_get_descriptor_size(
-+		const ia_css_program_control_init_terminal_manifest_t *manifest,
-+		const ia_css_program_group_manifest_t *pg_manifest,
-+		ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+	unsigned int i;
-+	unsigned size = 0;
-+	unsigned load_section_count = 0;
-+	unsigned connect_section_count = 0;
-+	ia_css_program_control_init_manifest_program_desc_t *man_progs;
-+	ia_css_program_manifest_t *prog_manifest;
-+	verifjmpexit(manifest != NULL);
-+
-+	man_progs =
-+		ia_css_program_control_init_terminal_manifest_get_program_desc(
-+			manifest, 0);
-+	verifjmpexit(man_progs != NULL);
-+
-+	for (i = 0; i < manifest->program_count; i++) {
-+		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
-+		verifjmpexit(prog_manifest != NULL);
-+		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
-+			continue;
-+		}
-+		load_section_count += man_progs[i].load_section_count;
-+		connect_section_count += man_progs[i].connect_section_count;
-+	}
-+
-+	size = sizeof(ia_css_program_control_init_terminal_t) +
-+		manifest->program_count *
-+		sizeof(struct ia_css_program_control_init_program_desc_s) +
-+		load_section_count *
-+		sizeof(struct ia_css_program_control_init_load_section_desc_s) +
-+		connect_section_count  *
-+		sizeof(struct ia_css_program_control_init_connect_section_desc_s);
-+EXIT:
-+	return size;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+void ia_css_program_control_init_terminal_print(
-+	const ia_css_program_control_init_terminal_t *terminal)
-+{
-+	unsigned int prog_idx, sec_idx;
-+	ia_css_program_control_init_program_desc_t *prog;
-+	ia_css_program_control_init_load_section_desc_t *load_sec;
-+	ia_css_program_control_init_connect_section_desc_t *connect_sec;
-+	unsigned mem_offset;
-+	verifjmpexit(terminal != NULL);
-+
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+		"program_count: %d, payload_fragment_stride: %d\n",
-+		terminal->program_count,
-+		terminal->payload_fragment_stride);
-+
-+	for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
-+		prog = ia_css_program_control_init_terminal_get_program_desc(
-+			terminal, prog_idx);
-+		verifjmpexit(prog != NULL);
-+		mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
-+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
-+			prog->control_info.process_id,
-+			prog->control_info.num_done_events);
-+
-+		if (prog->load_section_count > 0) {
-+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
-+		}
-+		for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
-+			load_sec =
-+				ia_css_program_control_init_terminal_get_load_section_desc(
-+					prog, sec_idx);
-+			verifjmpexit(load_sec != NULL);
-+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+				"\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
-+				"mem_size: %d, mode_bitmask: %x\n",
-+				load_sec->device_descriptor_id.data,
-+				mem_offset,
-+				load_sec->mem_size,
-+				load_sec->mode_bitmask);
-+			mem_offset += load_sec->mem_size;
-+		}
-+		if (prog->connect_section_count > 0) {
-+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
-+		}
-+		for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
-+			connect_sec =
-+				ia_css_program_control_init_terminal_get_connect_section_desc(
-+					prog, sec_idx);
-+			verifjmpexit(connect_sec != NULL);
-+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+				"\t\tdevice_descriptor_id: 0x%08x, "
-+				"connect_terminal_ID: %d, connect_section_idx: %d, "
-+				"mode_bitmask: %x\n",
-+				connect_sec->device_descriptor_id.data,
-+				connect_sec->connect_terminal_ID,
-+				connect_sec->connect_section_idx,
-+				connect_sec->mode_bitmask);
-+		}
-+	}
-+EXIT:
-+	return;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_program_desc_t *
-+ia_css_program_control_init_terminal_get_program_desc(
-+	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
-+	const unsigned int program_index)
-+{
-+	ia_css_program_control_init_program_desc_t *program_desc_base;
-+	ia_css_program_control_init_program_desc_t *program_desc = NULL;
-+
-+	verifjmpexit(prog_ctrl_init_terminal != NULL);
-+	verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
-+
-+	program_desc_base = (ia_css_program_control_init_program_desc_t *)
-+		(((const char *)prog_ctrl_init_terminal) +
-+		 prog_ctrl_init_terminal->program_section_desc_offset);
-+	program_desc = &(program_desc_base[program_index]);
-+
-+EXIT:
-+	return program_desc;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
-+	const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+	ia_css_process_id_t process_id = 0;
-+
-+	verifjmpexit(program_desc != NULL);
-+
-+	process_id = program_desc->control_info.process_id;
-+
-+EXIT:
-+	return process_id;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+uint8_t ia_css_program_control_init_terminal_get_num_done_events(
-+	const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+	uint8_t num_done_events = 0;
-+
-+	verifjmpexit(program_desc != NULL);
-+
-+	num_done_events = program_desc->control_info.num_done_events;
-+
-+EXIT:
-+	return num_done_events;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+void ia_css_program_control_init_terminal_set_control_info(
-+	ia_css_program_control_init_program_desc_t *program_desc,
-+	ia_css_process_id_t process_id,
-+	uint8_t num_done_events)
-+{
-+	verifjmpexit(program_desc != NULL);
-+
-+	program_desc->control_info.process_id = process_id;
-+	program_desc->control_info.num_done_events = num_done_events;
-+
-+EXIT:
-+	return;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
-+	const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+	assert(program_desc != NULL);
-+	return program_desc->connect_section_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_load_section_count(
-+	const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+	assert(program_desc != NULL);
-+	return program_desc->load_section_count;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
-+	const ia_css_program_control_init_program_desc_t *program_desc)
-+{
-+	assert(program_desc != NULL);
-+	return program_desc->load_section_mem_offset;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_load_section_desc_t *
-+ia_css_program_control_init_terminal_get_load_section_desc(
-+	const ia_css_program_control_init_program_desc_t *program_desc,
-+	const unsigned int load_section_index)
-+{
-+	ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
-+	ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
-+
-+	verifjmpexit(program_desc != NULL);
-+	verifjmpexit(load_section_index < program_desc->load_section_count);
-+
-+	load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
-+		(((const char *)program_desc) +
-+		 program_desc->load_section_desc_offset);
-+	load_section_desc = &(load_section_desc_base[load_section_index]);
-+
-+EXIT:
-+	return load_section_desc;
-+}
-+
-+IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
-+ia_css_program_control_init_connect_section_desc_t *
-+ia_css_program_control_init_terminal_get_connect_section_desc(
-+	const ia_css_program_control_init_program_desc_t *program_desc,
-+	const unsigned int connect_section_index)
-+{
-+	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
-+	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
-+
-+	verifjmpexit(program_desc != NULL);
-+	verifjmpexit(connect_section_index < program_desc->connect_section_count);
-+
-+	connect_sec_desc_base =
-+		(ia_css_program_control_init_connect_section_desc_t *)
-+		(((const char *)program_desc) +
-+		 program_desc->connect_section_desc_offset);
-+	connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
-+
-+EXIT:
-+	return connect_sec_desc;
-+}
-+
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
-new file mode 100644
-index 000000000000..7eb387fb5066
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
-@@ -0,0 +1,621 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal_manifest.h
-+ *
-+ * Define the methods on the terminal manifest object that are not part of a
-+ * single interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+#include <ia_css_psys_terminal_manifest.sim.h>
-+
-+#include <ia_css_psys_terminal_manifest.hsys.user.h>
-+
-+#include <ia_css_program_group_data.h>	/* ia_css_frame_format_bitmap_t */
-+#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
-+
-+#include <type_support.h>		/* size_t */
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+#include "ia_css_psys_static_storage_class.h"
-+
-+/*!
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+/*! Check if the terminal manifest object specifies a spatial param terminal
-+ * type
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Check if the terminal manifest object specifies a program terminal type
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_program_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Check if the terminal manifest object specifies a program control init terminal type
-+ *
-+ * @param [in]	manifest			terminal manifest object
-+ *
-+ * @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_program_control_init_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Check if the terminal manifest object specifies a (cached) parameter
-+ * terminal type
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_parameter_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Check if the terminal manifest object specifies a (sliced) parameter
-+ * terminal type
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return is_parameter_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_sliced_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Check if the terminal manifest object specifies a data terminal type
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return is_data_terminal, false on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_is_terminal_manifest_data_terminal(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Get the broad terminal category
-+
-+ @param	manifest[in]			terminal manifest object
-+
-+ @return Terminal category enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the broad terminal category
-+
-+ @param	manifest[in]			terminal manifest object
-+ @param	category[in]			terminal category
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_category(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_cat_t category);
-+
-+/*! Get the direction of data flow for the terminal payload
-+
-+ @param	manifest[in]			terminal manifest object
-+
-+ @return Terminal direction enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the direction of data flow for the terminal payload
-+
-+ @param	manifest[in]			terminal manifest object
-+ @param	direction[in]			terminal direction
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_direction(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_dir_t direction);
-+
-+/*! Get the Rate Of Update (ROU) for the terminal payload
-+
-+ @param	manifest[in]			terminal manifest object
-+
-+ @return Terminal rate-of-update enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the Rate Of Update (ROU) for the terminal payload
-+
-+ @param	manifest[in]			terminal manifest object
-+ @param	rate_of_update[in]		terminal rate of update
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_rate_of_update(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_rou_t rate_of_update);
-+
-+/*! Get the buffer type for the connect terminal pointer
-+
-+ This function is intended for connect terminals only.  If called
-+ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
-+
-+ @param	manifest[in]			terminal manifest object
-+
-+ @return Connect terminal buffer type enum
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the buffer type for the connect terminal pointer
-+
-+  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
-+
-+ @param	manifest[in]			terminal manifest object
-+
-+ @return < 0 on invalid arguments
-+
-+  @note New for IPU7 POC
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_buffer_type(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_connect_buf_type_t connect_buf_type);
-+
-+/*! Get the stored size of the terminal manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return size, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+size_t ia_css_terminal_manifest_get_size(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Get the (pointer to) the program group manifest parent of the terminal
-+ * manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return the pointer to the parent, NULL on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the (pointer to) the program group manifest parent of the terminal
-+ * manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+ @param	[in]	terminal_offset		this terminal's offset from
-+					program_group_manifest base address.
-+
-+ @return < 0 on invalid arguments
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_parent_offset(
-+	ia_css_terminal_manifest_t			*manifest,
-+	int32_t						terminal_offset);
-+
-+/*! Get the type of the terminal manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
-+	manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the type of the terminal manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+ @param	[in]	terminal_type		terminal type
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_type(
-+	ia_css_terminal_manifest_t			*manifest,
-+	const ia_css_terminal_type_t			terminal_type);
-+
-+/*! Set the ID of the terminal manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+ @param	[in]	ID				terminal ID
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_ID(
-+	ia_css_terminal_manifest_t			*manifest,
-+	const ia_css_terminal_ID_t			ID);
-+
-+/*! Get the type of the terminal manifest object
-+
-+ @param [in]	manifest			terminal manifest object
-+
-+ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Get the ID of the associated connection terminal
-+
-+  Only valid for load terminals.
-+
-+  @param	manifest[in]			terminal manifest object
-+
-+  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
-+  OR if there is no associated connect terminal
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
-+	const ia_css_terminal_manifest_t		*manifest);
-+
-+/*! Set the ID of the associated connection terminal
-+
-+  Only valid for load terminals.
-+
-+  @param	manifest[in]			terminal manifest object
-+  @param	ID[in]				terminal ID
-+
-+  @return < 0 on invalid manifest argument (including when
-+  manifest describes a connect terminal, unless ID is
-+  IA_CSS_TERMINAL_INVALID_ID)
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_ID(
-+	ia_css_terminal_manifest_t			*manifest,
-+	const ia_css_terminal_ID_t			ID);
-+
-+/*! Returns the maximum payload size for an instance of the terminal
-+   described in a manifest entry.
-+
-+   The payload size is the sum of the sizes of all
-+   parameter sections for load terminals, or the maximum buffer size
-+   for connect terminals.
-+
-+   @param manifest[in] Terminal manifest handle
-+
-+   @return Maximum size in bytes of the terminal payload
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_terminal_manifest_get_max_payload_size(
-+	const ia_css_terminal_manifest_t *manifest);
-+
-+/*! Returns the maximum payload size for an instance of the terminal
-+   described in a manifest entry.
-+
-+   The payload size is the sum of the sizes of all
-+   parameter sections for load terminals, or the maximum buffer size
-+   for connect terminals.
-+
-+   @param manifest[in] Terminal manifest handle
-+   @param max_payload_size[in] Maximum payload size
-+
-+  @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_max_payload_size(
-+	ia_css_terminal_manifest_t			*manifest,
-+	uint32_t 							max_payload_size);
-+
-+/*! Get the supported frame types of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+
-+ @return frame format bitmap, 0 on invalid manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_frame_format_bitmap_t
-+	ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+		const ia_css_data_terminal_manifest_t		*manifest);
-+
-+/*! Set the chosen frame type for the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	bitmap			frame format bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
-+	ia_css_data_terminal_manifest_t			*manifest,
-+	ia_css_frame_format_bitmap_t			bitmap);
-+
-+/*! Check if the (data) terminal manifest object supports compression
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+
-+ @return compression_support, true if compression is supported
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+bool ia_css_data_terminal_manifest_can_support_compression(
-+	const ia_css_data_terminal_manifest_t		*manifest);
-+
-+/*! Set the compression support feature of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	compression_support		set true to support compression
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_compression_support(
-+	ia_css_data_terminal_manifest_t			*manifest,
-+	bool						compression_support);
-+
-+/*! Set the supported connection types of the terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	bitmap			connection bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_connection_bitmap(
-+	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
-+
-+/*! Get the connection bitmap of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+
-+ @return connection bitmap, 0 on invalid manifest argument
-+*/
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
-+		const ia_css_data_terminal_manifest_t		*manifest);
-+
-+/*! Get the kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+
-+ @return kernel bitmap, 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
-+	const ia_css_data_terminal_manifest_t		*manifest);
-+
-+/*! Set the kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	kernel_bitmap		kernel dependency bitmap
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_data_terminal_manifest_set_kernel_bitmap(
-+	ia_css_data_terminal_manifest_t			*manifest,
-+	const ia_css_kernel_bitmap_t			kernel_bitmap);
-+
-+/*! Set the unique kernel dependency of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	index			kernel dependency bitmap index
-+
-+ @return < 0 on invalid argument(s)
-+ */
-+extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
-+	ia_css_data_terminal_manifest_t			*manifest,
-+	const unsigned int				index);
-+
-+/*! Set the min size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	min_size			Minimum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_set_min_size(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the max size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	max_size			Maximum size of the frame array
-+
-+  @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_data_terminal_manifest_set_max_size(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the min size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	min_size			Minimum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_min_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the max size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	max_size			Maximum size of the frame array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_max_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the min fragment size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	min_size			Minimum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_set_min_fragment_size(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Set the max fragment size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	max_size			Maximum size of the fragment array
-+
-+  @return < 0 on invalid manifest argument
-+  */
-+extern int ia_css_data_terminal_manifest_set_max_fragment_size(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the min fragment size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	min_size			Minimum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_min_fragment_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*! Get the max fragment size of the (data) terminal manifest object
-+
-+ @param [in]	manifest			(data) terminal manifest object
-+ @param	[in]	max_size			Maximum size of the fragment array
-+
-+ @return < 0 on invalid manifest argument
-+ */
-+extern int ia_css_data_terminal_manifest_get_max_fragment_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
-+
-+/*!
-+ * Get the program control init connect section count for program prog.
-+ * @param [in] prog program control init terminal program desc
-+ * @return number of connect section for program prog.
-+ */
-+
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
-+	const ia_css_program_control_init_manifest_program_desc_t *prog);
-+
-+/*!
-+ * Get the program control init load section count for program prog.
-+ * @param [in] prog program control init terminal program desc
-+ * @return number of load section for program prog.
-+ */
-+
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
-+	const ia_css_program_control_init_manifest_program_desc_t *prog);
-+
-+/*!
-+ * Get the program control init terminal manifest size.
-+ * @param [in] nof_programs		Number of programs.
-+ * @param [in] nof_load_sections		Array of size nof_programs,
-+ *					encoding the number of load sections.
-+ * @param [in] nof_connect_sections	Array of size nof_programs,
-+ *					encoding the number of connect sections.
-+ * @return < 0 on invalid manifest argument
-+ */
-+extern
-+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
-+	const uint16_t nof_programs,
-+	const uint16_t *nof_load_sections,
-+	const uint16_t *nof_connect_sections);
-+
-+/*!
-+ * Get the program control init terminal manifest program desc.
-+ * @param [in] terminal		Program control init terminal.
-+ * @param [in] program		Number of programs.
-+ * @return program control init terminal program desc (or NULL if error).
-+ */
-+extern
-+ia_css_program_control_init_manifest_program_desc_t *
-+ia_css_program_control_init_terminal_manifest_get_program_desc(
-+	const ia_css_program_control_init_terminal_manifest_t *terminal,
-+	unsigned int program);
-+
-+/*!
-+ * Initialize the program control init terminal manifest.
-+ * @param [in] nof_programs		Number of programs
-+ * @param [in] nof_load_sections		Array of size nof_programs,
-+ *					encoding the number of load sections.
-+ * @param [in] nof_connect_sections	Array of size nof_programs,
-+ *					encoding the number of connect sections.
-+ * @return < 0 on invalid manifest argument
-+ */
-+extern
-+int ia_css_program_control_init_terminal_manifest_init(
-+	ia_css_program_control_init_terminal_manifest_t *terminal,
-+	const uint16_t nof_programs,
-+	const uint16_t *nof_load_sections,
-+	const uint16_t *nof_connect_sections);
-+
-+/*!
-+ * Pretty prints the program control init terminal manifest.
-+ * @param [in] terminal		Program control init terminal.
-+ */
-+extern
-+void ia_css_program_control_init_terminal_manifest_print(
-+	ia_css_program_control_init_terminal_manifest_t *terminal);
-+
-+#ifdef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_terminal_manifest_impl.h"
-+#endif
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
-new file mode 100644
-index 000000000000..9994318d4e33
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal.hsys.user.h
-+ *
-+ * Define the methods on the termianl manifest object: Hsys user interface
-+ */
-+
-+#include <ia_css_psys_manifest_types.h>
-+
-+/*! Print the terminal manifest object to file/stream
-+
-+ @param	manifest[in]			terminal manifest object
-+ @param	fid[out]				file/stream handle
-+
-+ @return < 0 on error
-+ */
-+extern int ia_css_terminal_manifest_print(
-+	const ia_css_terminal_manifest_t	*manifest,
-+	void					*fid);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
-new file mode 100644
-index 000000000000..7c1c6849b1c9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
-+
-+/*! \file */
-+
-+/** @file ia_css_psys_terminal_manifest.sim.h
-+ *
-+ * Define the methods on the terminal manifest object: Simulation only
-+ */
-+
-+#include <type_support.h>					/* size_t */
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_defs.h"
-+
-+/*! Create (the storage for) the terminal manifest object
-+
-+ @param	terminal_type[in]	type of the terminal manifest {parameter, data}
-+
-+ @return NULL on error
-+ */
-+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
-+	const ia_css_terminal_type_t			terminal_type);
-+
-+/*! Destroy (the storage of) the terminal manifest object
-+
-+ @param	manifest[in]			terminal manifest
-+
-+ @return NULL
-+ */
-+extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
-+	ia_css_terminal_manifest_t				*manifest);
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
-new file mode 100644
-index 000000000000..eb30acd7045d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
-@@ -0,0 +1,745 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
-+#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
-+
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+/* Data object types on the terminals */
-+#include <ia_css_program_group_data.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include <error_support.h>
-+#include <print_support.h>
-+#include <misc_support.h>
-+#include "ia_css_psys_static_trace.h"
-+#include "ia_css_psys_static_storage_class.h"
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_program_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_program_control_init_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_parameter_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	/* will return an error value on error */
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_data_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	/* will return an error value on error */
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_data_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+		(terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_is_terminal_manifest_sliced_terminal(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_type_t terminal_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
-+
-+	terminal_type = ia_css_terminal_manifest_get_type(manifest);
-+
-+	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
-+		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+size_t ia_css_terminal_manifest_get_size(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	size_t size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_size(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		size = manifest->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_terminal_manifest_get_size: invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_type(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		terminal_type = manifest->terminal_type;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_terminal_manifest_get_type: invalid argument\n");
-+	}
-+	return terminal_type;
-+}
-+
-+/** Temporary implementation of attributes based on terminal type ID
-+ *
-+ *  A later implementation in the PG manifest generator tool will
-+ *  replace this and thus remove the dependency on the legacy
-+ *  terminal type.
-+ */
-+static void ia_css_terminal_manifest_set_attributes_by_type(
-+	ia_css_terminal_manifest_t *manifest,
-+	const ia_css_terminal_type_t terminal_type)
-+{
-+	/* Set defaults for most cases, and change in the later code for the rest. */
-+	ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
-+	ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
-+	ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
-+	ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
-+
-+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
-+		category = IA_CSS_TERMINAL_CAT_CONNECT;
-+	}
-+	ia_css_terminal_manifest_set_category(manifest, category);
-+
-+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
-+		direction = IA_CSS_TERMINAL_DIR_OUT;
-+	}
-+	ia_css_terminal_manifest_set_direction(manifest, direction);
-+
-+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
-+		rou = IA_CSS_TERMINAL_ROU_FRAG;
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+			rou = IA_CSS_TERMINAL_ROU_STREAM;
-+	}
-+	ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
-+
-+	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
-+		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
-+		connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
-+	} else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
-+			 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
-+			connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
-+	}
-+	ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
-+}
-+
-+/** Temporary implementation for new fields until the manfifest generator
-+ *  tool will be enhance to set values directly.
-+ *
-+ *  - Attibutes are set to meaningful values by mapping terminal type to
-+ *  attributes
-+ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
-+ *  - max_payload_size is set to UINT32_MAX
-+ */
-+static void ia_css_terminal_manifest_set_new_fields(
-+	ia_css_terminal_manifest_t *manifest,
-+	const ia_css_terminal_type_t terminal_type)
-+{
-+	ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
-+	assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
-+	assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_type(
-+	ia_css_terminal_manifest_t *manifest,
-+	const ia_css_terminal_type_t terminal_type)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_type(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->terminal_type = terminal_type;
-+		ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_type failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_ID(
-+	ia_css_terminal_manifest_t *manifest,
-+	const ia_css_terminal_ID_t ID)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->ID = ID;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_ID failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_ID_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = manifest->ID;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_ID failed\n");
-+		retval = IA_CSS_TERMINAL_INVALID_ID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
-+	const ia_css_terminal_manifest_t		*manifest)
-+{
-+	ia_css_terminal_ID_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_connect_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = manifest->assoc_ID;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_connect_ID failed\n");
-+		retval = IA_CSS_TERMINAL_INVALID_ID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
-+	const ia_css_terminal_manifest_t		*manifest)
-+{
-+	ia_css_terminal_cat_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_category(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = (ia_css_terminal_cat_t)manifest->attributes.category;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_category failed\n");
-+		retval = IA_CSS_TERMINAL_CAT_INVALID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_category(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_cat_t category)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_category(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->attributes.category = category;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_category failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
-+	const ia_css_terminal_manifest_t		*manifest)
-+{
-+	ia_css_terminal_dir_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_direction(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_direction failed\n");
-+		retval = IA_CSS_TERMINAL_DIR_INVALID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_direction(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_dir_t direction)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_direction(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->attributes.direction = direction;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_direction failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
-+	const ia_css_terminal_manifest_t		*manifest)
-+{
-+	ia_css_terminal_rou_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_rate_of_update failed\n");
-+		retval = IA_CSS_TERMINAL_ROU_INVALID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_rate_of_update(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_terminal_rou_t rate_of_update)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->attributes.rou = rate_of_update;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
-+	const ia_css_terminal_manifest_t		*manifest)
-+{
-+	ia_css_connect_buf_type_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_connect_buffer_type failed\n");
-+		retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_buffer_type(
-+	ia_css_terminal_manifest_t		*manifest,
-+	ia_css_connect_buf_type_t connect_buf_type)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->attributes.connect_buf_type = connect_buf_type;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_connect_ID(
-+	ia_css_terminal_manifest_t			*manifest,
-+	const ia_css_terminal_ID_t			ID)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_connect_ID(): enter:\n");
-+
-+	if (manifest != NULL &&
-+		((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
-+		(IA_CSS_TERMINAL_INVALID_ID == ID))) {
-+		manifest->assoc_ID = ID;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_terminal_manifest_get_max_payload_size(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_terminal_ID_t retval;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		retval = manifest->max_payload_size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_get_max_payload_size failed\n");
-+		retval = IA_CSS_TERMINAL_INVALID_ID;
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
-+int ia_css_terminal_manifest_set_max_payload_size(
-+	ia_css_terminal_manifest_t			*manifest,
-+	uint32_t 							max_payload_size)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->max_payload_size = max_payload_size;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
-+	const ia_css_terminal_manifest_t *manifest)
-+{
-+	ia_css_program_group_manifest_t	*parent = NULL;
-+	char *base;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_get_parent(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	base = (char *)((char *)manifest + manifest->parent_offset);
-+
-+	parent = (ia_css_program_group_manifest_t *)(base);
-+EXIT:
-+	return parent;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_terminal_manifest_set_parent_offset(
-+	ia_css_terminal_manifest_t *manifest,
-+	int32_t terminal_offset)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_terminal_manifest_set_parent_offset(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	/* parent is at negative offset away from current terminal offset*/
-+	manifest->parent_offset = -terminal_offset;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
-+ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+	const ia_css_data_terminal_manifest_t *manifest)
-+{
-+	ia_css_frame_format_bitmap_t bitmap = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		bitmap = manifest->frame_format_bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_frame_format_bitmap(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	ia_css_frame_format_bitmap_t bitmap)
-+{
-+	int ret = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->frame_format_bitmap = bitmap;
-+		ret = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
-+			ret);
-+	}
-+
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+bool ia_css_data_terminal_manifest_can_support_compression(
-+	const ia_css_data_terminal_manifest_t *manifest)
-+{
-+	bool compression_support = false;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		/* compression_support is used boolean encoded in uint8_t.
-+		 * So we only need to check
-+		 * if this is non-zero
-+		 */
-+		compression_support = (manifest->compression_support != 0);
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
-+	}
-+
-+	return compression_support;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_compression_support(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	bool compression_support)
-+{
-+	int ret = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->compression_support =
-+			(compression_support == true) ? 1 : 0;
-+		ret = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
-+			ret);
-+	}
-+
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
-+	const ia_css_data_terminal_manifest_t *manifest)
-+{
-+	ia_css_connection_bitmap_t connection_bitmap = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		connection_bitmap = manifest->connection_bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
-+	}
-+	return connection_bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_connection_bitmap(
-+	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
-+{
-+	int ret = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
-+		assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
-+
-+		manifest->connection_bitmap = bitmap;
-+		ret = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
-+	}
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
-+	const ia_css_data_terminal_manifest_t *manifest)
-+{
-+	ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		kernel_bitmap = manifest->kernel_bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
-+	}
-+	return kernel_bitmap;
-+}
-+
-+IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
-+int ia_css_data_terminal_manifest_set_kernel_bitmap(
-+	ia_css_data_terminal_manifest_t	*manifest,
-+	const ia_css_kernel_bitmap_t kernel_bitmap)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->kernel_bitmap = kernel_bitmap;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
-+			retval);
-+	}
-+
-+	return retval;
-+}
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
-new file mode 100644
-index 000000000000..366623cdd72d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
-@@ -0,0 +1,102 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
-+#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
-+
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_program_group_data.h"
-+#include "ia_css_psys_manifest_types.h"
-+
-+#define	N_UINT16_IN_DATA_TERMINAL_STRUCT	2
-+#define	N_UINT8_IN_DATA_TERMINAL_STRUCT		3
-+#define	N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT	1
-+
-+/* ========================= Data terminal - START ========================= */
-+
-+#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
-+	+ IA_CSS_FRAME_STRUCT_BITS \
-+	+ IA_CSS_STREAM_STRUCT_BITS \
-+	+ IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_CONNECTION_TYPE_BITS \
-+	+ (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
-+	+ (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)	\
-+	+ (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
-+
-+/**
-+ * The (data) terminal can be attached to a buffer or a stream.
-+ * The stream interface is not necessarily limited to strict in-order access.
-+ * For a stream the restriction is that contrary to a buffer it cannot be
-+ * addressed directly, i.e. it behaves as a port,
-+ * but it may support stream_pos() and/or seek() operations
-+ */
-+struct ia_css_data_terminal_s {
-+	/** Data terminal base class */
-+	ia_css_terminal_t base;
-+	/** Properties of the image data attached to the terminal */
-+	ia_css_frame_descriptor_t frame_descriptor;
-+	/** Data buffer handle attached to the terminal */
-+	ia_css_frame_t frame;
-+	/** (exclusive) Data stream handle attached to the terminal
-+	 * if the data is sourced over a device port
-+	 *
-+	 * @note No known use of the field.
-+	 */
-+	ia_css_stream_t stream;
-+	/** Reserved
-+	* @note No known intent for this reservation field. */
-+	uint32_t reserved;
-+	/** Tranfer method for send/receving data to/from this terminal. */
-+	ia_css_connection_type_t connection_type;
-+	/** Offset in bytes from the start of this structure to a Array[fragment_count] of
-+	 *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
-+	 *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
-+	 */
-+	uint16_t fragment_descriptor_offset;
-+	/** Size of streaming to GEN buffer in lines. This field will be used only
-+	 *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
-+	 */
-+	uint16_t stream2gen_buffer_size;
-+	/** Kernel id that this terminal is associated with.  If that kernel
-+	 *  is disabled, this terminal is considered disabled as well.
-+	 *  Must be set the single kernel defined in the manifest for this terminal's
-+	 *  ID (ia_css_terminal_s::ID). */
-+	uint8_t kernel_id;
-+	/** Indicate to which subgraph this terminal belongs
-+	 * for common constraints
-+	 *
-+	 * @note No known use.
-+	 */
-+	uint8_t subgraph_id;
-+	/** Link ID of the data terminal.  Two terminals can optionally be
-+	 *  marked as linked to each other by setting the same link ID.
-+	 *  Hardware topology or logical or algorithmic constraints may restrict the
-+	 *  terminal that can be so linked.
-+	 *  In current practice, link ID's have special meaning related to
-+	 *  the connection type (see "connection_type" field in this structure) or
-+	 *  synchronization of program groups.
-+	 *  @see ia_css_isys_link_id_t
-+	 *  @see ia_css_data_barrier_link_id_t
-+	 *  @see ia_css_stream2gen_link_id_t */
-+	uint8_t link_id;
-+	/** Padding for 64bit alignment */
-+	uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
-+};
-+/* ========================== Data terminal - END ========================== */
-+
-+#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
-new file mode 100644
-index 000000000000..da96da317016
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TRANSPORT_H
-+#define __IA_CSS_PSYS_TRANSPORT_H
-+
-+#include <ia_css_psys_transport_dep.h>		/* ia_css_psys_cmd_queues */
-+#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
-+
-+#include <type_support.h>
-+
-+typedef enum ia_css_psys_event_queues {
-+	/** The in-order queue for event returns */
-+	IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
-+	IA_CSS_N_PSYS_EVENT_QUEUE_ID
-+} ia_css_psys_event_queue_ID_t;
-+
-+typedef enum ia_css_psys_event_types {
-+	/** No error to report. */
-+	IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
-+	/** Unknown unhandled error */
-+	IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
-+	/* Retrieving remote object: */
-+	/** Object ID not found */
-+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
-+	/** Objects too big, or size is zero. */
-+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
-+	/** Failed to load whole process group from tproxy/dma  */
-+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
-+	/** The proper package could not be found */
-+	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
-+	/* Process group: */
-+	/** Failed to run, error while loading frame */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
-+	/** Failed to run, error while loading fragment */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
-+	/** The process count of the process group is zero */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
-+	/** Process(es) initialization */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
-+	/** Aborted (after host request) */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
-+	/** NULL pointer in the process group */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
-+	/** Process group validation failed */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
-+	/** Error handling- invalid frame detected by CSI (ISYS) */
-+	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
-+} ia_css_psys_event_type_t;
-+
-+#define IA_CSS_PSYS_CMD_BITS	64
-+struct ia_css_psys_cmd_s {
-+	/** The command issued to the process group */
-+	uint16_t	command;
-+	/** Message field of the command */
-+	uint16_t	msg;
-+	/** The context reference (process group/buffer set/...) */
-+	uint32_t	context_handle;
-+};
-+
-+#define IA_CSS_PSYS_EVENT_BITS	128
-+typedef struct ia_css_psys_event_s {
-+	/** The (return) status of the command issued to
-+	 * the process group this event refers to
-+	 */
-+	uint16_t	status;
-+	/** The command issued to the process group this event refers to */
-+	uint16_t	command;
-+	/** The context reference (process group/buffer set/...) */
-+	uint32_t	context_handle;
-+	/** This token (size) must match the token registered
-+	 * in a process group
-+	 */
-+	uint64_t	token;
-+} ia_css_psys_event_s_t;
-+
-+struct ia_css_psys_buffer_s {
-+	/** The in-order queue for scheduled process groups */
-+	void		*host_buffer;
-+	vied_vaddress_t	*isp_buffer;
-+};
-+
-+#endif /* __IA_CSS_PSYS_TRANSPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
-new file mode 100644
-index 000000000000..3c8e1abe41e1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
-+#define __IA_CSS_PSYS_TRANSPORT_DEP_H
-+
-+/*
-+ * The ID's of the Psys specific queues.
-+ */
-+typedef enum ia_css_psys_cmd_queues {
-+	/**< The in-order queue for scheduled process groups */
-+	IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
-+	/**< The in-order queue for commands changing psys or
-+	 * process group state
-+	 */
-+	IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
-+	/**< An in-order queue for dedicated PPG commands */
-+	IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
-+	IA_CSS_N_PSYS_CMD_QUEUE_ID
-+} ia_css_psys_cmd_queue_ID_t;
-+
-+#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
-+
-+#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
-new file mode 100644
-index 000000000000..9033b8d1a19a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
-@@ -0,0 +1,25 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_H
-+#define __IA_CSS_PSYSAPI_H
-+
-+#include <ia_css_psys_process.hsys.user.h>
-+#include <ia_css_psys_process.hsys.kernel.h>
-+#include <ia_css_psys_process_group.hsys.user.h>
-+#include <ia_css_psys_process_group.hsys.kernel.h>
-+
-+#endif /* __IA_CSS_PSYSAPI_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
-new file mode 100644
-index 000000000000..f9c30a40a5dc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
-@@ -0,0 +1,35 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
-+#define __IA_CSS_PSYSAPI_FW_VERSION_H
-+
-+/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
-+#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
-+
-+enum ia_css_process_group_protocol_version {
-+	/**
-+	 * Legacy protocol
-+	 */
-+	IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
-+	/**
-+	 * Persistent process group support protocol
-+	 */
-+	IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
-+	IA_CSS_PROCESS_GROUP_N_PROTOCOLS
-+};
-+
-+#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
-new file mode 100644
-index 000000000000..0369bcfe9388
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
-@@ -0,0 +1,80 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_PSYSAPI_TRACE_H
-+#define __IA_CSS_PSYSAPI_TRACE_H
-+
-+#include "ia_css_trace.h"
-+
-+#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
-+#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
-+#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
-+
-+/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
-+ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
-+ * psysapi.mk fill it will be set by default to no trace
-+ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
-+ */
-+#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
-+
-+#if !defined(PSYSAPI_TRACE_CONFIG)
-+	#define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
-+#endif
-+
-+/* Module specific trace setting will be used if
-+ * the trace level is not specified from the module or
-+  PSYSAPI_TRACING_OVERRIDE is defined
-+ */
-+#if (defined(PSYSAPI_TRACE_CONFIG))
-+	/* Module specific trace setting */
-+	#if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
-+		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
-+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
-+		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
-+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
-+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
-+	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
-+		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
-+		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
-+		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
-+	#else
-+		#error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
-+	#endif
-+#else
-+	#error "PSYSAPI_TRACE_CONFIG not defined"
-+#endif
-+
-+/* Overriding submodules in PSYSAPI with a specific tracing level */
-+/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
-+
-+#endif /* __IA_CSS_PSYSAPI_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
-new file mode 100644
-index 000000000000..06ccb0738415
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
-@@ -0,0 +1,199 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_H
-+#define __IA_CSS_RBM_H
-+
-+#include "ia_css_rbm_storage_class.h"
-+#include <type_support.h>
-+
-+/*
-+ * IPU6 adds a lot of mux/demux/blk,
-+ * 96 bits is not enough
-+ * need 160 bits (has to multiply of 32 bits)
-+ * after X2B / DOL / PAF enabled in isa_lb PG
-+ */
-+#define IA_CSS_RBM_BITS 160
-+/** An element is a 32 bit unsigned integer. 64 bit integers might cause
-+ * problems in the compiler.
-+ */
-+#define IA_CSS_RBM_ELEM_TYPE uint32_t
-+#define IA_CSS_RBM_ELEM_BITS \
-+	(sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
-+#define IA_CSS_RBM_NOF_ELEMS \
-+	((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
-+
-+/** Users should make no assumption about the actual type of
-+ * ia_css_rbm_t.
-+ */
-+typedef struct {
-+	IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
-+} ia_css_rbm_elems_t;
-+typedef ia_css_rbm_elems_t ia_css_rbm_t;
-+
-+/** Print the bits of a routing bitmap
-+ * @return < 0 on error
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_rbm_print(
-+	const ia_css_rbm_t	bitmap,
-+	void *fid);
-+
-+/** Create an empty routing bitmap
-+ * @return bitmap = 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_clear(void);
-+
-+/** Creates the complement of a routing bitmap
-+ * @param	bitmap[in] routing bitmap
-+ * @return ~bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_complement(
-+	const ia_css_rbm_t bitmap);
-+
-+/** Create the union of two routing bitmaps
-+ * @param	bitmap0[in]	routing bitmap 0
-+ * @param	bitmap1[in]	routing bitmap 1
-+ * @return bitmap0 | bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_union(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1);
-+
-+/** Create the intersection of two routing bitmaps
-+ * @param	bitmap0[in]	routing bitmap 0
-+ * @param	bitmap1[in] routing bitmap 1
-+ * @return bitmap0 & bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_intersection(
-+	const ia_css_rbm_t			bitmap0,
-+	const ia_css_rbm_t			bitmap1);
-+
-+/** Check if the routing bitmaps is empty
-+ * @param bitmap[in] routing bitmap
-+ * @return bitmap == 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_empty(
-+	const ia_css_rbm_t bitmap);
-+
-+/** Check if the intersection of two routing bitmaps is empty
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in] routing bitmap 1
-+ * @return (bitmap0 & bitmap1) == 0
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_intersection_empty(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1);
-+
-+/** Check if the second routing bitmap is a subset of the first (or equal)
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in routing bitmap 1
-+ * Note: An empty set is always a subset, this function
-+ * returns true if bitmap 1 is empty
-+ * @return (bitmap0 & bitmap1) == bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_subset(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1);
-+
-+/** Check if the routing bitmaps are equal
-+ * @param bitmap0[in] routing bitmap 0
-+ * @param bitmap1[in] routing bitmap 1
-+ * @return bitmap0 == bitmap1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+bool ia_css_is_rbm_equal(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1);
-+
-+/** Checks whether a specific kernel bit is set
-+ * @return bitmap[index] == 1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_is_rbm_set(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index);
-+
-+/** Returns range of bits as integer
-+ * @return bitmap[index, index+size]
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+int ia_css_rbm_range_val(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index,
-+	const unsigned int size);
-+
-+/** Create the union of a routing bitmap with a onehot bitmap
-+ * with a bit set at index
-+ * @return bitmap[index] |= 1
-+*/
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_set(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index);
-+
-+/*! Set elem_index-th 32-bit element of the bitmap to elem_value
-+ * @return updated bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int elem_index,
-+	const uint32_t     elem_value);
-+
-+/** Creates routing bitmap using a uint64 value.
-+ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_create_from_uint64(
-+	const uint64_t	value);
-+
-+/** Converts an ia_css_rbm_t type to uint64_t. Note that if
-+ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
-+ *  are returned.
-+ *  @return uint64_t representation of value
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+uint64_t ia_css_rbm_to_uint64(
-+	const ia_css_rbm_t value);
-+
-+/** Creates a routing bitmap with the bit at index 'index' removed.
-+ * @return ~(1 << index) & bitmap
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_unset(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index);
-+
-+/** Create a onehot routing bitmap with a bit set at index
-+ * @return bitmap[index] = 1
-+ */
-+IA_CSS_RBM_STORAGE_CLASS_H
-+ia_css_rbm_t ia_css_rbm_bit_mask(
-+	const unsigned int index);
-+
-+#ifdef __IA_CSS_RBM_INLINE__
-+#include "ia_css_rbm_impl.h"
-+#endif /* __IA_CSS_RBM_INLINE__ */
-+
-+#endif /* __IA_CSS_RBM_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
-new file mode 100644
-index 000000000000..26bf5bad63e4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
-@@ -0,0 +1,410 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_rbm.h"
-+#include "type_support.h"
-+#include "misc_support.h"
-+#include "assert_support.h"
-+#include "math_support.h"
-+#include "ia_css_rbm_trace.h"
-+
-+STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
-+	const ia_css_rbm_t bitmap);
-+
-+STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
-+	const ia_css_rbm_t bitmap);
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_intersection_empty(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1)
-+{
-+	ia_css_rbm_t intersection;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_is_rbm_intersection_empty(): enter:\n");
-+
-+	intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
-+	return ia_css_is_rbm_empty(intersection);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_empty(
-+	const ia_css_rbm_t bitmap)
-+{
-+	unsigned int i;
-+	bool is_empty = true;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_is_rbm_empty(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		is_empty &= bitmap.data[i] == 0;
-+	}
-+	return is_empty;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_equal(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1)
-+{
-+	unsigned int i;
-+	bool is_equal = true;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_is_rbm_equal(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
-+	}
-+	return is_equal;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+bool ia_css_is_rbm_subset(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1)
-+{
-+	unsigned int i;
-+	bool is_subset = true;
-+
-+	/* checks if bitmap1 is subset of bitmap 0 */
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_is_rbm_subset(): enter:\n");
-+
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
-+	}
-+
-+	return is_subset;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_clear(void)
-+{
-+	unsigned int i;
-+	ia_css_rbm_t bitmap = {{0} };
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_clear(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		bitmap.data[i] = 0;
-+	}
-+	return bitmap;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_complement(
-+	const ia_css_rbm_t bitmap)
-+{
-+	unsigned int i;
-+	ia_css_rbm_t result = {{0} };
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_complement(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		result.data[i] = ~bitmap.data[i];
-+	}
-+	return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_union(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1)
-+{
-+	unsigned int i;
-+	ia_css_rbm_t result = {{0} };
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_union(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
-+	}
-+	return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_intersection(
-+	const ia_css_rbm_t bitmap0,
-+	const ia_css_rbm_t bitmap1)
-+{
-+	unsigned int i;
-+	ia_css_rbm_t result = {{0} };
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_intersection(): enter:\n");
-+	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
-+	}
-+	return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_set(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index)
-+{
-+	ia_css_rbm_t bit_mask;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_set(): enter:\n");
-+
-+	bit_mask = ia_css_rbm_bit_mask(index);
-+	return ia_css_rbm_union(bitmap, bit_mask);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int elem_index,
-+	const uint32_t     elem_value)
-+{
-+	ia_css_rbm_t result = bitmap;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_set_element_from_uint32(): enter:\n");
-+
-+	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
-+
-+	if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
-+		result.data[elem_index] = elem_value;
-+	} else {
-+		assert(0);
-+	}
-+
-+	return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_create_from_uint64(
-+	const uint64_t value)
-+{
-+	unsigned int i;
-+	ia_css_rbm_t result;
-+	const unsigned int bits64 = sizeof(uint64_t) * 8;
-+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_create_from_uint64(): enter:\n");
-+
-+	result = ia_css_rbm_clear();
-+	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
-+		/* masking is done implictly, the MSB bits of casting will be chopped off */
-+		result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
-+			(value >> (i * IA_CSS_RBM_ELEM_BITS));
-+	}
-+
-+	return result;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+uint64_t ia_css_rbm_to_uint64(
-+	const ia_css_rbm_t value)
-+{
-+	const unsigned int bits64 = sizeof(uint64_t) * 8;
-+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
-+	unsigned int i;
-+	uint64_t res = 0;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_to_uint64(): enter:\n");
-+
-+	assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
-+	assert(nof_elems_bits64 > 0);
-+
-+	for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
-+		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
-+	}
-+	for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
-+		assert(value.data[i] == 0);
-+	}
-+	return res;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_unset(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index)
-+{
-+	ia_css_rbm_t result;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_unset(): enter:\n");
-+
-+	result = ia_css_rbm_bit_mask(index);
-+	result = ia_css_rbm_complement(result);
-+	return ia_css_rbm_intersection(bitmap, result);
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+ia_css_rbm_t ia_css_rbm_bit_mask(
-+	const unsigned int index)
-+{
-+	unsigned int elem_index;
-+	unsigned int elem_bit_index;
-+	ia_css_rbm_t bit_mask = ia_css_rbm_clear();
-+
-+	assert(index < IA_CSS_RBM_BITS);
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_bit_mask(): enter:\n");
-+	if (index < IA_CSS_RBM_BITS) {
-+		elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+		elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+		assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+
-+		bit_mask.data[elem_index] = 1 << elem_bit_index;
-+	}
-+	return bit_mask;
-+}
-+
-+STORAGE_CLASS_INLINE
-+int ia_css_rbm_compute_weight(
-+	const ia_css_rbm_t bitmap)
-+{
-+	ia_css_rbm_t loc_bitmap;
-+	int weight = 0;
-+	int i;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_compute_weight(): enter:\n");
-+
-+	loc_bitmap = bitmap;
-+
-+	/* In fact; do not need the iterator "i" */
-+	for (i = 0; (i < IA_CSS_RBM_BITS) &&
-+		!ia_css_is_rbm_empty(loc_bitmap); i++) {
-+		weight += ia_css_is_rbm_set(loc_bitmap, 0);
-+		loc_bitmap = ia_css_rbm_shift(loc_bitmap);
-+	}
-+
-+	return weight;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_rbm_range_val(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index,
-+	const unsigned int size)
-+{
-+	unsigned int elem_index;
-+	unsigned int elem_bit_index;
-+	unsigned int res;
-+	unsigned int elem_index_end;
-+	unsigned int mask;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
-+	assert(index < IA_CSS_RBM_BITS);
-+	/* Extract the bit range from the data array relevane entry */
-+	elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+	elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
-+	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+	mask =  (1 << size) - 1;
-+	res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
-+	/* In case that the bit range is divided between 2 different data array entries */
-+	if (elem_index != elem_index_end) {
-+		unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
-+		unsigned int second_elem_size = size - first_elem_size;
-+
-+		mask = (1 << second_elem_size) - 1;
-+		res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
-+	}
-+	return res;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_is_rbm_set(
-+	const ia_css_rbm_t bitmap,
-+	const unsigned int index)
-+{
-+	unsigned int elem_index;
-+	unsigned int elem_bit_index;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_is_rbm_set(): enter:\n");
-+
-+	assert(index < IA_CSS_RBM_BITS);
-+
-+	elem_index = index / IA_CSS_RBM_ELEM_BITS;
-+	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
-+	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
-+	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
-+}
-+
-+STORAGE_CLASS_INLINE
-+ia_css_rbm_t ia_css_rbm_shift(
-+	const ia_css_rbm_t bitmap)
-+{
-+	int i;
-+	unsigned int lsb_current_elem = 0;
-+	unsigned int lsb_previous_elem = 0;
-+	ia_css_rbm_t loc_bitmap;
-+
-+	IA_CSS_TRACE_0(RBM, VERBOSE,
-+		"ia_css_rbm_shift(): enter:\n");
-+
-+	loc_bitmap = bitmap;
-+
-+	for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
-+		lsb_current_elem = bitmap.data[i] & 0x01;
-+		loc_bitmap.data[i] >>= 1;
-+		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
-+		lsb_previous_elem = lsb_current_elem;
-+	}
-+	return loc_bitmap;
-+}
-+
-+IA_CSS_RBM_STORAGE_CLASS_C
-+int ia_css_rbm_print(
-+	const ia_css_rbm_t bitmap,
-+	void               *fid)
-+{
-+	int i;
-+	const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
-+
-+	NOT_USED(fid);
-+
-+	CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
-+	CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
-+
-+	if (IA_CSS_RBM_NOF_ELEMS == 1) {
-+		IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
-+			data[0]);
-+
-+	} else if (IA_CSS_RBM_NOF_ELEMS == 2) {
-+		IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
-+			data[1], data[0]);
-+
-+	} else if (IA_CSS_RBM_NOF_ELEMS == 3) {
-+		IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
-+			data[2], data[1], data[0]);
-+
-+	} else if (IA_CSS_RBM_NOF_ELEMS == 4) {
-+		IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
-+			data[3], data[2], data[1], data[0]);
-+
-+	} else {
-+		IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
-+
-+		for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
-+			IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
-+		}
-+		IA_CSS_TRACE_0(RBM, INFO, "}\n");
-+	}
-+
-+	return 0;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
-new file mode 100644
-index 000000000000..d3c2423e7d02
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
-@@ -0,0 +1,146 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_H
-+#define __IA_CSS_RBM_MANIFEST_H
-+
-+#include "type_support.h"
-+#include "ia_css_rbm_manifest_types.h"
-+
-+/** Returns the descriptor size of the RBM manifest.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_size(void);
-+
-+/** Initializes the RBM manifest.
-+ * @param rbm[in] Routing bitmap.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+void
-+ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
-+
-+/** Returns a pointer to the array of mux descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_mux_desc_t *
-+ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns the size of mux descriptors array.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns a pointer to the array of validation descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_validation_rule_t *
-+ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns the size of the validation descriptor array.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Returns a pointer to the array of terminal routing descriptors.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return NULL on error
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+ia_css_rbm_terminal_routing_desc_t *
-+ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
-+
-+/** \brief Returns the size of the terminal routing descriptor array.
-+ * Note: pretty printing differs from on host and on IPU.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @return size
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+unsigned int
-+ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
-+
-+/** Pretty prints the routing bitmap manifest.
-+ * @param manifest[in] Routing bitmap manifest.
-+ */
-+void
-+ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
-+
-+/** \brief Pretty prints a RBM (routing bitmap).
-+ * Note: pretty printing differs from on host and on IPU.
-+ * @param rbm[in]             Routing bitmap.
-+ * @param mux[in]             List of mux descriptors corresponding to rbm.
-+ * @param mux_desc_count[in]  Number of muxes in list mux.
-+ */
-+void
-+ia_css_rbm_pretty_print(
-+	const ia_css_rbm_t *rbm,
-+	const ia_css_rbm_mux_desc_t *mux,
-+	unsigned int mux_desc_count);
-+
-+/** \brief check for the validity of a routing bitmap.
-+ * @param manifest[in] Routing bitmap manifest.
-+ * @param rbm[in]      Routing bitmap
-+ * @return true on match.
-+ */
-+bool
-+ia_css_rbm_manifest_check_rbm_validity(
-+	const ia_css_rbm_manifest_t *manifest,
-+	const ia_css_rbm_t *rbm);
-+
-+/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
-+ * @param rbm[in]             Routing bitmap.
-+ * @param mux[in]             List of mux descriptors corresponding to rbm.
-+ * @param mux_count[in]       Number of muxes in list mux.
-+ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
-+ * @param mux_id[in]          ID of mux to set configuration for.
-+ * @param value[in]           Value of the mux.
-+ * @return routing bitmap.
-+ */
-+ia_css_rbm_t
-+ia_css_rbm_set_mux(
-+	ia_css_rbm_t rbm,
-+	ia_css_rbm_mux_desc_t *mux,
-+	unsigned int mux_count,
-+	unsigned int gp_dev_id,
-+	unsigned int mux_id,
-+	unsigned int value);
-+
-+/** \brief Gets the value of a mux.
-+ * @param rbm      routing bitmap
-+ * @param mux_desc mux descriptor
-+ * @return Mux value corresponding to mux_desc, -1 on error.
-+ */
-+IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
-+int
-+ia_css_rbm_get_mux_value(
-+	const ia_css_rbm_t *rbm,
-+	const ia_css_rbm_mux_desc_t *mux_desc);
-+
-+#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
-+#include "ia_css_rbm_manifest_impl.h"
-+#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
-+
-+#endif /* __IA_CSS_RBM_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
-new file mode 100644
-index 000000000000..45f77dbb89dc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
-+#define __IA_CSS_RBM_MANIFEST_TYPES_H
-+
-+#include "ia_css_rbm.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
-+#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
-+#endif
-+#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
-+#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
-+#endif
-+#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
-+#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
-+#endif
-+#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
-+#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
-+#endif
-+
-+#define SIZE_OF_RBM_MUX_DESC_S ( \
-+	(4 * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_mux_desc_s {
-+	uint8_t gp_dev_id;
-+	uint8_t mux_id;
-+	uint8_t offset;
-+	uint8_t size_bits;
-+} ia_css_rbm_mux_desc_t;
-+
-+#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
-+	  (1 * IA_CSS_RBM_BITS) \
-+	+ (1 * IA_CSS_UINT32_T_BITS))
-+
-+typedef struct ia_css_rbm_validation_rule_s {
-+	ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
-+	uint32_t expected_value;
-+} ia_css_rbm_validation_rule_t;
-+
-+#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
-+	(4 * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_terminal_routing_desc_s {
-+	uint8_t terminal_id;
-+	uint8_t connection_state;
-+	uint8_t mux_id;
-+	uint8_t state;
-+} ia_css_rbm_terminal_routing_desc_t;
-+
-+#define SIZE_OF_RBM_MANIFEST_S ( \
-+	  (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
-+	+ (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
-+	+ (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
-+	+ (3 * IA_CSS_UINT16_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
-+
-+typedef struct ia_css_rbm_manifest_s {
-+#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
-+	ia_css_rbm_validation_rule_t
-+		validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
-+#endif
-+	uint16_t mux_desc_count;
-+	uint16_t validation_rule_count;
-+	uint16_t terminal_routing_desc_count;
-+
-+#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
-+	ia_css_rbm_mux_desc_t
-+		mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
-+#endif
-+
-+#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
-+	ia_css_rbm_terminal_routing_desc_t
-+		terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
-+#endif
-+
-+#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
-+	uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
-+#endif
-+} ia_css_rbm_manifest_t;
-+
-+#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
-new file mode 100644
-index 000000000000..5f72bd1736f5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
-@@ -0,0 +1,38 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
-+#define __IA_CSS_RBM_STORAGE_CLASS_H
-+
-+#include "storage_class.h"
-+
-+#ifndef __IA_CSS_RBM_INLINE__
-+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_RBM_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
-+#else
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
-+#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
-+#endif
-+
-+#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
-new file mode 100644
-index 000000000000..bcffc10c6e32
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
-@@ -0,0 +1,79 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_TRACE_H
-+#define __IA_CSS_RBM_TRACE_H
-+
-+#include "ia_css_trace.h"
-+
-+/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
-+* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
-+*/
-+#define RBM_TRACE_LOG_LEVEL_OFF 1
-+#define RBM_TRACE_LOG_LEVEL_NORMAL 2
-+#define RBM_TRACE_LOG_LEVEL_DEBUG 3
-+
-+#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
-+
-+#if !defined(RBM_TRACE_CONFIG)
-+#	define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
-+#endif
-+
-+/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
-+#ifdef __HIVECC
-+#	ifndef HRT_CSIM
-+#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
-+#	else
-+#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+#	endif
-+#else
-+#	define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+#endif
-+
-+#if (defined(RBM_TRACE_CONFIG))
-+/* Module specific trace setting */
-+#	if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
-+/* RBM_TRACE_LOG_LEVEL_OFF */
-+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
-+#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
-+/* RBM_TRACE_LOG_LEVEL_NORMAL */
-+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
-+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
-+#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
-+/* RBM_TRACE_LOG_LEVEL_DEBUG */
-+#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_ENABLED
-+#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_ENABLED
-+#	else
-+#		error "No RBM_TRACE_CONFIG Tracing level defined"
-+#	endif
-+#else
-+#	error "RBM_TRACE_CONFIG not defined"
-+#endif
-+
-+#endif /* __RBM_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
-new file mode 100644
-index 000000000000..4c0af262a13b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
-@@ -0,0 +1,187 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_H
-+#define __IA_CSS_TERMINAL_H
-+
-+#include "type_support.h"
-+#include "ia_css_terminal_types.h"
-+#include "ia_css_param_storage_class.h"
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_in_terminal_get_descriptor_size(
-+	const unsigned int nof_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_section_desc_t *
-+ia_css_param_in_terminal_get_param_section_desc(
-+	const ia_css_param_terminal_t *param_terminal,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_out_terminal_get_descriptor_size(
-+	const unsigned int nof_sections,
-+	const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_section_desc_t *
-+ia_css_param_out_terminal_get_param_section_desc(
-+	const ia_css_param_terminal_t *param_terminal,
-+	const unsigned int section_index,
-+	const unsigned int nof_sections,
-+	const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_param_terminal_create(
-+	ia_css_param_terminal_t *param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+	const unsigned int nof_frame_param_sections,
-+	const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_grid_desc_t *
-+ia_css_spatial_param_terminal_get_fragment_grid_desc(
-+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_frame_grid_param_section_desc_t *
-+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
-+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_spatial_param_terminal_create(
-+	ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal,
-+	const unsigned int nof_fragments,
-+	const uint32_t kernel_id
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
-+	const unsigned int nof_slice_param_sections,
-+	const unsigned int nof_slices[],
-+	const unsigned int nof_fragments
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_slice_desc_t *
-+ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const unsigned int fragment_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_slice_param_section_desc_t *
-+ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int slice_index,
-+	const unsigned int section_index,
-+	const unsigned int nof_slice_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_sliced_param_terminal_create(
-+	ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal,
-+	const unsigned int nof_slice_param_sections,
-+	const unsigned int nof_slices[],
-+	const unsigned int nof_fragments,
-+	const uint32_t kernel_id
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_program_terminal_get_descriptor_size(
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_fragment_param_sections,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int nof_command_objs
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_param_section_desc_t *
-+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int section_index,
-+	const unsigned int nof_fragment_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_kernel_fragment_sequencer_info_desc_t *
-+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int info_index,
-+	const unsigned int nof_kernel_fragment_sequencer_infos
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_create(
-+	ia_css_program_terminal_t *program_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int nof_command_objs
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_get_command_base_offset(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int commands_slots_used,
-+	uint16_t *command_desc_offset
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+uint16_t *ia_css_program_terminal_get_line_count(
-+	const ia_css_kernel_fragment_sequencer_command_desc_t
-+	*kernel_fragment_sequencer_command_desc_base,
-+	const unsigned int set_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+	const unsigned int nof_frame_param_sections,
-+	const unsigned int nof_fragments
-+);
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "ia_css_terminal_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-+
-+#endif /* __IA_CSS_TERMINAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
-new file mode 100644
-index 000000000000..9a78969c4fcc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
-+#define __IA_CSS_TERMINAL_BASE_TYPES_H
-+
-+#include "type_support.h"
-+#include "ia_css_terminal_defs.h"
-+
-+#define N_UINT16_IN_TERMINAL_STRUCT		3
-+#define N_UINT32_IN_TERMINAL_STRUCT		1
-+#define N_PADDING_UINT8_IN_TERMINAL_STRUCT	1
-+
-+#define SIZE_OF_TERMINAL_STRUCT_BITS \
-+	(IA_CSS_TERMINAL_TYPE_BITS \
-+	+ N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_TERMINAL_ID_BITS  \
-+	+ N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/* ==================== Base Terminal - START ==================== */
-+/** Base structure for all terminal types.
-+ *
-+ *  Terminals describe an opening between a program group and the outside world.
-+ *  They come in various types (data, statisitics, parameters, etc.) which may have
-+ *  extensions specific to those types.  This structure is the base for all of those and
-+ *  must be the first field in any  subclassed terminal structure type.
-+ */
-+struct ia_css_terminal_s {						/**< Base terminal */
-+	ia_css_terminal_type_t			terminal_type;		/**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
-+	uint32_t				payload_size;	/**< Size of buffer passed in buffer set for this terminal */
-+	int16_t					parent_offset;		/**< Offset to the containing process group */
-+	uint16_t				size;			/**< Size of this whole terminal layout-structure, including subclassed extensions. */
-+	uint16_t				tm_index;		/**< Index of the terminal manifest object in the program group manifest. */
-+	ia_css_terminal_ID_t			ID;			/**< Absolute referal ID for this terminal, valid ID's != 0 */
-+	uint8_t					padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
-+};
-+/* ==================== Base Terminal - END ==================== */
-+
-+#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
-new file mode 100644
-index 000000000000..3ce4184e9c78
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
-@@ -0,0 +1,209 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_DEFS_H
-+#define __IA_CSS_TERMINAL_DEFS_H
-+
-+#include "type_support.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define IA_CSS_TERMINAL_ID_BITS		8
-+typedef uint8_t				ia_css_terminal_ID_t;
-+#define IA_CSS_TERMINAL_INVALID_ID	((ia_css_terminal_ID_t)(-1))
-+
-+/**
-+ * Terminal category
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_cat {
-+	IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
-+	IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
-+	IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_cat_t;
-+#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
-+
-+/**
-+ * Terminal direction
-+ *
-+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
-+ * output generated by IPU.
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_dir {
-+	IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
-+	IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
-+	IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_dir_t;
-+#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
-+
-+/**
-+ * Terminal Rate Of Update (ROU)
-+ *
-+ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
-+ * output generated by IPU.
-+ *
-+ * @todo New for IPU7 POC
-+ */
-+typedef enum ia_css_terminal_rou {
-+	IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
-+	IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
-+	IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
-+	IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
-+} ia_css_terminal_rou_t;
-+#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
-+
-+/**
-+ * Connect terminal payload content type
-+ *
-+ * Defines the broad usage of the buffers defined in connect terminals
-+ */
-+typedef enum ia_css_connect_buf_type {
-+	IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
-+	IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
-+	IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
-+	IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
-+} ia_css_connect_buf_type_t;
-+
-+/** Unknown or irrelevant buffer type */
-+#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
-+
-+/**
-+ * Terminal type identifier
-+ *
-+ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
-+ * and ia_css_connect_buf_type_t
-+ * To stage the changes, this type will remain - for now...
-+ *
-+ * Inital type to attribute mapping table for staging:
-+ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
-+ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
-+ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
-+ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
-+ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
-+ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
-+ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
-+ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
-+ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
-+ */
-+typedef enum ia_css_terminal_type {
-+	/** Data input */
-+	IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
-+	/** Data output */
-+	IA_CSS_TERMINAL_TYPE_DATA_OUT,
-+	/** Type 6 parameter input */
-+	IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
-+	/** Type 1-5 parameter input.  Constant for all fragments in a frame. */
-+	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
-+	/** Type 1-5 parameter output */
-+	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
-+	/** Represent the new type of terminal for the
-+	 * "spatial dependent parameters", when params go in
-+	 */
-+	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
-+	/** Represent the new type of terminal for the
-+	 * "spatial dependent parameters", when params go out
-+	 */
-+	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
-+	/** Represent the new type of terminal for the
-+	 * explicit slicing, when params go in
-+	 */
-+	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
-+	/** Represent the new type of terminal for the
-+	 * explicit slicing, when params go out
-+	 */
-+	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
-+	/** State (private data) input */
-+	IA_CSS_TERMINAL_TYPE_STATE_IN,
-+	/** State (private data) output */
-+	IA_CSS_TERMINAL_TYPE_STATE_OUT,
-+	/** Program parameters, may change per fragment */
-+	IA_CSS_TERMINAL_TYPE_PROGRAM,
-+	/** Program control parameters.  Non-alogrithmic parameters for system devices. */
-+	IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
-+	IA_CSS_N_TERMINAL_TYPES
-+} ia_css_terminal_type_t;
-+
-+#define IA_CSS_TERMINAL_TYPE_BITS				32
-+
-+/* Temporary redirection needed to facilicate merging with the drivers
-+   in a backwards compatible manner */
-+#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
-+
-+/**
-+ * Dimensions of the data objects. Note that a C-style
-+ * data order is assumed. Data stored by row.
-+ */
-+typedef enum ia_css_dimension {
-+	/** The number of columns, i.e. the size of the row */
-+	IA_CSS_COL_DIMENSION = 0,
-+	/** The number of rows, i.e. the size of the column */
-+	IA_CSS_ROW_DIMENSION = 1,
-+	IA_CSS_N_DATA_DIMENSION = 2
-+} ia_css_dimension_t;
-+
-+#define IA_CSS_N_COMMAND_COUNT (4)
-+
-+#ifndef PIPE_GENERATION
-+/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
-+/**
-+ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
-+ */
-+typedef enum ia_css_isys_link_id {
-+	IA_CSS_ISYS_LINK_OFFLINE = 0,
-+	IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
-+	IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
-+} ia_css_isys_link_id_t;
-+#define N_IA_CSS_ISYS_LINK_ID	(IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
-+
-+/**
-+ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
-+ */
-+typedef enum ia_css_data_barrier_link_id {
-+	IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
-+	IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
-+	IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
-+	IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
-+	IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
-+	N_IA_CSS_DATA_BARRIER_LINK_ID
-+} ia_css_data_barrier_link_id_t;
-+
-+/**
-+ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
-+ * support.
-+ */
-+typedef enum ia_css_stream2gen_link_id {
-+	IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
-+	IA_CSS_STREAM2GEN_LINK_ID_1,
-+	IA_CSS_STREAM2GEN_LINK_ID_2,
-+	IA_CSS_STREAM2GEN_LINK_ID_3,
-+	N_IA_CSS_STREAM2GEN_LINK_ID
-+} ia_css_stream2gen_link_id_t;
-+
-+#endif /* #ifndef PIPE_GENERATION */
-+/** @} */
-+#endif /* __IA_CSS_TERMINAL_DEFS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
-new file mode 100644
-index 000000000000..94b535735836
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
-@@ -0,0 +1,497 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_IMPL_H
-+#define __IA_CSS_TERMINAL_IMPL_H
-+
-+#include "ia_css_terminal.h"
-+#include "ia_css_terminal_types.h"
-+#include "error_support.h"
-+#include "assert_support.h"
-+#include "storage_class.h"
-+#include "misc_support.h" /* for NOT_USED */
-+
-+/* Param Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_in_terminal_get_descriptor_size(
-+	const unsigned int nof_sections)
-+{
-+	return sizeof(ia_css_param_terminal_t) +
-+		nof_sections*sizeof(ia_css_param_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
-+	const ia_css_param_terminal_t *param_terminal,
-+	const unsigned int section_index)
-+{
-+	ia_css_param_section_desc_t *param_section_base;
-+	ia_css_param_section_desc_t *param_section_desc = NULL;
-+
-+	verifjmpexit(param_terminal != NULL);
-+
-+	param_section_base =
-+		(ia_css_param_section_desc_t *)
-+		(((const char *)param_terminal) +
-+				param_terminal->param_section_desc_offset);
-+	param_section_desc = &(param_section_base[section_index]);
-+
-+EXIT:
-+	return param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_out_terminal_get_descriptor_size(
-+	const unsigned int nof_sections,
-+	const unsigned int nof_fragments)
-+{
-+	return sizeof(ia_css_param_terminal_t) +
-+		nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
-+	const ia_css_param_terminal_t *param_terminal,
-+	const unsigned int section_index,
-+	const unsigned int nof_sections,
-+	const unsigned int fragment_index)
-+{
-+	ia_css_param_section_desc_t *param_section_base;
-+	ia_css_param_section_desc_t *param_section_desc = NULL;
-+
-+	verifjmpexit(param_terminal != NULL);
-+
-+	param_section_base =
-+		(ia_css_param_section_desc_t *)
-+			(((const char *)param_terminal) +
-+				param_terminal->param_section_desc_offset);
-+	param_section_desc =
-+		&(param_section_base[(nof_sections * fragment_index) +
-+				section_index]);
-+
-+EXIT:
-+	return param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_param_terminal_create(
-+	ia_css_param_terminal_t *param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal)
-+{
-+	if (param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	if (terminal_offset > (1<<15)) {
-+		return -EINVAL;
-+	}
-+
-+	param_terminal->base.terminal_type =
-+		is_input_terminal ?
-+		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
-+		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
-+	param_terminal->base.parent_offset =
-+		0 - ((int16_t)terminal_offset);
-+	param_terminal->base.size = terminal_size;
-+	param_terminal->param_section_desc_offset =
-+		sizeof(ia_css_param_terminal_t);
-+
-+	return 0;
-+}
-+
-+/* Spatial Param Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
-+	const unsigned int nof_frame_param_sections,
-+	const unsigned int nof_fragments)
-+{
-+	return sizeof(ia_css_spatial_param_terminal_t) +
-+		nof_frame_param_sections * sizeof(
-+				ia_css_frame_grid_param_section_desc_t) +
-+		nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_grid_desc_t *
-+ia_css_spatial_param_terminal_get_fragment_grid_desc(
-+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const unsigned int fragment_index)
-+{
-+	ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
-+	ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
-+
-+	verifjmpexit(spatial_param_terminal != NULL);
-+
-+	fragment_grid_desc_base =
-+		(ia_css_fragment_grid_desc_t *)
-+			(((const char *)spatial_param_terminal) +
-+			spatial_param_terminal->fragment_grid_desc_offset);
-+	fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
-+
-+EXIT:
-+	return fragment_grid_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_frame_grid_param_section_desc_t *
-+ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
-+	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const unsigned int section_index)
-+{
-+	ia_css_frame_grid_param_section_desc_t *
-+		frame_grid_param_section_base;
-+	ia_css_frame_grid_param_section_desc_t *
-+		frame_grid_param_section_desc = NULL;
-+
-+	verifjmpexit(spatial_param_terminal != NULL);
-+
-+	frame_grid_param_section_base =
-+		(ia_css_frame_grid_param_section_desc_t *)
-+			(((const char *)spatial_param_terminal) +
-+		spatial_param_terminal->frame_grid_param_section_desc_offset);
-+	frame_grid_param_section_desc =
-+		&(frame_grid_param_section_base[section_index]);
-+
-+EXIT:
-+	return frame_grid_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_spatial_param_terminal_create(
-+	ia_css_spatial_param_terminal_t *spatial_param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal,
-+	const unsigned int nof_fragments,
-+	const uint32_t kernel_id)
-+{
-+	if (spatial_param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	if (terminal_offset > (1<<15)) {
-+		return -EINVAL;
-+	}
-+
-+	spatial_param_terminal->base.terminal_type =
-+		is_input_terminal ?
-+		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
-+		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
-+	spatial_param_terminal->base.parent_offset =
-+		0 - ((int16_t)terminal_offset);
-+	spatial_param_terminal->base.size = terminal_size;
-+	spatial_param_terminal->kernel_id = kernel_id;
-+	spatial_param_terminal->fragment_grid_desc_offset =
-+		sizeof(ia_css_spatial_param_terminal_t);
-+	spatial_param_terminal->frame_grid_param_section_desc_offset =
-+		spatial_param_terminal->fragment_grid_desc_offset +
-+		(nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
-+
-+	return 0;
-+}
-+
-+/* Sliced terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
-+	const unsigned int nof_slice_param_sections,
-+	const unsigned int nof_slices[],
-+	const unsigned int nof_fragments)
-+{
-+	unsigned int descriptor_size = 0;
-+	unsigned int fragment_index;
-+	unsigned int nof_slices_total = 0;
-+
-+	verifjmpexit(nof_slices != NULL);
-+
-+	for (fragment_index = 0;
-+			fragment_index < nof_fragments; fragment_index++) {
-+		nof_slices_total += nof_slices[fragment_index];
-+	}
-+
-+	descriptor_size =
-+		sizeof(ia_css_sliced_param_terminal_t) +
-+		nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
-+		nof_slices_total*nof_slice_param_sections*sizeof(
-+			ia_css_fragment_param_section_desc_t);
-+
-+EXIT:
-+	return descriptor_size;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_slice_desc_t *
-+ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const unsigned int fragment_index
-+)
-+{
-+	ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
-+	ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
-+
-+	verifjmpexit(sliced_param_terminal != NULL);
-+
-+	fragment_slice_desc_base =
-+		(ia_css_fragment_slice_desc_t *)
-+			(((const char *)sliced_param_terminal) +
-+			sliced_param_terminal->fragment_slice_desc_offset);
-+	fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
-+
-+EXIT:
-+	return fragment_slice_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_slice_param_section_desc_t *
-+ia_css_sliced_param_terminal_get_slice_param_section_desc(
-+	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int slice_index,
-+	const unsigned int section_index,
-+	const unsigned int nof_slice_param_sections)
-+{
-+	ia_css_fragment_slice_desc_t *fragment_slice_desc;
-+	ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
-+	ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
-+
-+	fragment_slice_desc =
-+		ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+			sliced_param_terminal,
-+			fragment_index
-+			);
-+	verifjmpexit(fragment_slice_desc != NULL);
-+
-+	slice_param_section_desc_base =
-+		(ia_css_slice_param_section_desc_t *)
-+		(((const char *)sliced_param_terminal) +
-+		fragment_slice_desc->slice_section_desc_offset);
-+	slice_param_section_desc =
-+		&(slice_param_section_desc_base[(
-+			slice_index * nof_slice_param_sections) +
-+				section_index]);
-+
-+EXIT:
-+	return slice_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_sliced_param_terminal_create(
-+	ia_css_sliced_param_terminal_t *sliced_param_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const uint16_t is_input_terminal,
-+	const unsigned int nof_slice_param_sections,
-+	const unsigned int nof_slices[],
-+	const unsigned int nof_fragments,
-+	const uint32_t kernel_id)
-+{
-+	unsigned int fragment_index;
-+	unsigned int nof_slices_total = 0;
-+
-+	if (sliced_param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	if (terminal_offset > (1<<15)) {
-+		return -EINVAL;
-+	}
-+
-+	sliced_param_terminal->base.terminal_type =
-+		is_input_terminal ?
-+		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
-+		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
-+	sliced_param_terminal->base.parent_offset =
-+		0 - ((int16_t)terminal_offset);
-+	sliced_param_terminal->base.size = terminal_size;
-+	sliced_param_terminal->kernel_id = kernel_id;
-+	/* set here to use below to find the pointer */
-+	sliced_param_terminal->fragment_slice_desc_offset =
-+		sizeof(ia_css_sliced_param_terminal_t);
-+	for (fragment_index = 0;
-+			fragment_index < nof_fragments; fragment_index++) {
-+		ia_css_fragment_slice_desc_t *fragment_slice_desc =
-+			ia_css_sliced_param_terminal_get_fragment_slice_desc(
-+				sliced_param_terminal,
-+				fragment_index);
-+		/*
-+		 * Error handling not required at this point
-+		 * since everything has been constructed/validated just above
-+		 */
-+		fragment_slice_desc->slice_count = nof_slices[fragment_index];
-+		fragment_slice_desc->slice_section_desc_offset =
-+			sliced_param_terminal->fragment_slice_desc_offset +
-+			(nof_fragments * sizeof(
-+					ia_css_fragment_slice_desc_t)) +
-+			(nof_slices_total * nof_slice_param_sections * sizeof(
-+					ia_css_slice_param_section_desc_t));
-+		nof_slices_total += nof_slices[fragment_index];
-+	}
-+
-+	return 0;
-+}
-+
-+/* Program terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_program_terminal_get_descriptor_size(
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_fragment_param_sections,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int nof_command_objs)
-+{
-+	/*only one fragment used*/
-+	return sizeof(ia_css_program_terminal_t) +
-+		nof_fragment_param_sections *
-+		sizeof(ia_css_fragment_param_section_desc_t) +
-+		nof_fragments * nof_kernel_fragment_sequencer_infos *
-+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
-+		nof_command_objs * sizeof(
-+			ia_css_kernel_fragment_sequencer_command_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_param_section_desc_t *
-+ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int section_index,
-+	const unsigned int nof_fragment_param_sections)
-+{
-+	ia_css_fragment_param_section_desc_t *
-+		fragment_param_section_desc_base;
-+	ia_css_fragment_param_section_desc_t *
-+		fragment_param_section_desc = NULL;
-+	NOT_USED(fragment_index);
-+
-+	verifjmpexit(program_terminal != NULL);
-+	verifjmpexit(section_index < nof_fragment_param_sections);
-+
-+	fragment_param_section_desc_base =
-+		(ia_css_fragment_param_section_desc_t *)
-+			(((const char *)program_terminal) +
-+			program_terminal->fragment_param_section_desc_offset);
-+	fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
-+EXIT:
-+	return fragment_param_section_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_kernel_fragment_sequencer_info_desc_t *
-+ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int fragment_index,
-+	const unsigned int info_index,
-+	const unsigned int nof_kernel_fragment_sequencer_infos)
-+{
-+	ia_css_kernel_fragment_sequencer_info_desc_t *
-+		kernel_fragment_sequencer_info_desc_base;
-+	ia_css_kernel_fragment_sequencer_info_desc_t *
-+		kernel_fragment_sequencer_info_desc = NULL;
-+
-+	verifjmpexit(program_terminal != NULL);
-+	if (nof_kernel_fragment_sequencer_infos > 0) {
-+		verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
-+	}
-+
-+	kernel_fragment_sequencer_info_desc_base =
-+		(ia_css_kernel_fragment_sequencer_info_desc_t *)
-+		(((const char *)program_terminal) +
-+		program_terminal->kernel_fragment_sequencer_info_desc_offset);
-+	kernel_fragment_sequencer_info_desc =
-+		&(kernel_fragment_sequencer_info_desc_base[(fragment_index *
-+			nof_kernel_fragment_sequencer_infos) + info_index]);
-+
-+EXIT:
-+	return kernel_fragment_sequencer_info_desc;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_create(
-+	ia_css_program_terminal_t *program_terminal,
-+	const uint16_t terminal_offset,
-+	const uint16_t terminal_size,
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int nof_command_objs)
-+{
-+	if (program_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	if (terminal_offset > (1<<15)) {
-+		return -EINVAL;
-+	}
-+
-+	program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
-+	program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
-+	program_terminal->base.size = terminal_size;
-+	program_terminal->kernel_fragment_sequencer_info_desc_offset =
-+		sizeof(ia_css_program_terminal_t);
-+	program_terminal->fragment_param_section_desc_offset =
-+		program_terminal->kernel_fragment_sequencer_info_desc_offset +
-+		(nof_fragments * nof_kernel_fragment_sequencer_infos *
-+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+		(nof_command_objs * sizeof(
-+			ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_get_command_base_offset(
-+	const ia_css_program_terminal_t *program_terminal,
-+	const unsigned int nof_fragments,
-+	const unsigned int nof_kernel_fragment_sequencer_infos,
-+	const unsigned int commands_slots_used,
-+	uint16_t *command_desc_offset)
-+{
-+	if (command_desc_offset == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	*command_desc_offset = 0;
-+
-+	if (program_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	*command_desc_offset =
-+		program_terminal->kernel_fragment_sequencer_info_desc_offset +
-+		(nof_fragments * nof_kernel_fragment_sequencer_infos *
-+		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+		(commands_slots_used * sizeof(
-+			ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint16_t *ia_css_program_terminal_get_line_count(
-+	const ia_css_kernel_fragment_sequencer_command_desc_t
-+	*kernel_fragment_sequencer_command_desc_base,
-+	const unsigned int set_count)
-+{
-+	uint16_t *line_count = NULL;
-+
-+	verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
-+	line_count =
-+		(uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
-+			set_count >> 2].line_count[set_count & 0x00000003]);
-+EXIT:
-+	return line_count;
-+}
-+
-+#endif /* __IA_CSS_TERMINAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
-new file mode 100644
-index 000000000000..0000610e945c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
-@@ -0,0 +1,233 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_H
-+#define __IA_CSS_TERMINAL_MANIFEST_H
-+
-+#include "type_support.h"
-+#include "ia_css_param_storage_class.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
-+#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
-+#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
-+#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
-+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
-+#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
-+
-+/** Returns the size in bytes required to store this
-+ *  terminal's manifest entry.
-+ *
-+ *  Used as part of binary manifest generation. It helps
-+ *  to determine the amount of memory required
-+ *  to store a parameter terminal manifest entry for
-+ *  allocation before initialization
-+ *
-+ *  @param [in] nof_sections Number of sections (==
-+ *  number of descriptors)
-+ *
-+ *  @return Size in bytes required for an entry.
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_param_terminal_manifest_get_size(
-+	const unsigned int nof_sections
-+);
-+
-+/** Initialize a parameter terminal manifest entry.
-+ *
-+ *  Used as part of binary manifest generation.
-+ *
-+ *  @param param_terminal Terminal entry to initialize.  Must
-+ *  have been allocated with the size determined by
-+ *  ia_css_param_terminal_manifest_get_size().
-+ *
-+ *  @return 0 on success, -EFAULT if param_terminal is NULL.
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_param_terminal_manifest_init(
-+	ia_css_param_terminal_manifest_t *param_terminal,
-+	const uint16_t section_count
-+);
-+
-+/** Returns a section descriptor for a parameter terminal.
-+ *
-+ *  @param param_terminal_manifest Parameter terminal manifest handle
-+ *  @param section_index Index of descriptor.  Must be smaller than the
-+ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
-+ *
-+ *  @return Pointer to a descriptor structure
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_param_manifest_section_desc_t *
-+ia_css_param_terminal_manifest_get_prm_sct_desc(
-+	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
-+	const unsigned int nof_frame_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_spatial_param_terminal_manifest_init(
-+	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
-+	const uint16_t section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_frame_grid_param_manifest_section_desc_t *
-+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+	const ia_css_spatial_param_terminal_manifest_t *
-+		spatial_param_terminal_manifest,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
-+	const unsigned int nof_slice_param_sections
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_sliced_param_terminal_manifest_init(
-+	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
-+	const uint16_t section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_sliced_param_manifest_section_desc_t *
-+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+	const ia_css_sliced_param_terminal_manifest_t *
-+		sliced_param_terminal_manifest,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+unsigned int ia_css_program_terminal_manifest_get_size(
-+	const unsigned int nof_fragment_param_sections,
-+	const unsigned int nof_kernel_fragment_sequencer_infos
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+int ia_css_program_terminal_manifest_init(
-+	ia_css_program_terminal_manifest_t *program_terminal,
-+	const uint16_t fragment_param_section_count,
-+	const uint16_t kernel_fragment_seq_info_section_count
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_fragment_param_manifest_section_desc_t *
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+	const unsigned int section_index
-+);
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_H
-+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
-+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+	const unsigned int info_index
-+);
-+
-+/*! Getter for kernel id
-+
-+  The function return the kernel id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] param manifest section desc
-+
-+ @return kernel_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
-+ia_css_param_manifest_section_desc_get_kernel_id(
-+	const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for  region_id
-+
-+  The function return the region_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] param manifest section desc
-+
-+ @return region_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_region_id(
-+	const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for mem_type_id
-+
-+  The function return the mem_type_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] param manifest section desc
-+
-+ @return mem_type_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
-+	const ia_css_param_manifest_section_desc_t *section);
-+
-+/*! Getter for kernel id
-+
-+  The function return the kernel id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] fragment manifest section desc
-+
-+ @return kernel_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+/*! Getter for  region_id
-+
-+  The function return the region_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] fragment manifest section desc
-+
-+ @return region_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+/*! Getter for mem_type_id
-+
-+  The function return the mem_type_id
-+  field from the section
-+  This field shouldn't accessed directly
-+  only with the getter function
-+ @param	[in] fragment manifest section desc
-+
-+ @return mem_type_id
-+ */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section);
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "ia_css_terminal_manifest_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
-new file mode 100644
-index 000000000000..5b3226bbf9b0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
-+#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
-+
-+#include "ia_css_terminal_defs.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+typedef struct ia_css_terminal_manifest_attributes_t {
-+	uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
-+	uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
-+	uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
-+	uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
-+	uint16_t reserved:10;
-+	} ia_css_terminal_manifest_attributes_t;
-+#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
-+
-+#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT	0
-+#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	(IA_CSS_TERMINAL_TYPE_BITS \
-+	+ IA_CSS_UINT32_T_BITS \
-+	+ IA_CSS_UINT16_T_BITS \
-+	+ IA_CSS_UINT16_T_BITS \
-+	+ IA_CSS_TERMINAL_ATTRIBUTE_BITS \
-+	+ IA_CSS_TERMINAL_ID_BITS \
-+	+ IA_CSS_TERMINAL_ID_BITS \
-+	+ (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
-+
-+/* ==================== Base Terminal Manifest - START ==================== */
-+struct ia_css_terminal_manifest_s {
-+	ia_css_terminal_type_t				terminal_type;		/**< Type ia_css_terminal_type_t */
-+	/**  Max size of payload buffer for instances of this terminal
-+	 *
-+	 *   For load terminals, this is the size of all sections, as defined in the manifest
-+	 *   descriptors.  For connect terminals, this is the max buffer size.
-+	 */
-+	uint32_t					max_payload_size;
-+	int16_t						parent_offset;		/**< Offset to the program group manifest */
-+	uint16_t					size;			/**< Size of this whole terminal-manifest layout-structure */
-+	ia_css_terminal_manifest_attributes_t	attributes; /**< Bit fields describing the terminal attributes */
-+	ia_css_terminal_ID_t				ID; /**< The unique identifier of this terminal in the PG */
-+	/** The unique identifier of another terminal in the PG, associated with this one.
-+	 *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
-+	ia_css_terminal_ID_t				assoc_ID;
-+#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
-+	uint8_t						padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
-+#endif
-+};
-+
-+typedef struct ia_css_terminal_manifest_s
-+	ia_css_terminal_manifest_t;
-+
-+/* ==================== Base Terminal Manifest - END ==================== */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
-new file mode 100644
-index 000000000000..207bb7502208
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
-@@ -0,0 +1,391 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
-+#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
-+
-+#include "ia_css_terminal_manifest.h"
-+#include "error_support.h"
-+#include "assert_support.h"
-+#include "storage_class.h"
-+
-+STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
-+{
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_param_manifest_section_desc_t) %
-+			sizeof(uint32_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_spatial_param_terminal_manifest_t) %
-+			sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(
-+			ia_css_frame_grid_param_manifest_section_desc_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
-+			sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(
-+			ia_css_fragment_param_manifest_section_desc_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_fragment_param_manifest_section_desc_t) %
-+			sizeof(uint32_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(
-+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
-+		);
-+
-+	COMPILATION_ERROR_IF(0 != sizeof(
-+		ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
-+			sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_sliced_param_terminal_manifest_t) %
-+			sizeof(uint64_t));
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
-+		(CHAR_BIT * sizeof
-+			(ia_css_sliced_param_manifest_section_desc_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+		sizeof(ia_css_sliced_param_manifest_section_desc_t) %
-+			sizeof(uint64_t));
-+}
-+
-+/* Parameter Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_param_terminal_manifest_get_size(
-+	const unsigned int nof_sections)
-+{
-+
-+	return sizeof(ia_css_param_terminal_manifest_t) +
-+		nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_param_terminal_manifest_init(
-+	ia_css_param_terminal_manifest_t *param_terminal,
-+	const uint16_t section_count)
-+{
-+	if (param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	param_terminal->param_manifest_section_desc_count = section_count;
-+	param_terminal->param_manifest_section_desc_offset = sizeof(
-+				ia_css_param_terminal_manifest_t);
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_param_manifest_section_desc_t *
-+ia_css_param_terminal_manifest_get_prm_sct_desc(
-+	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
-+	const unsigned int section_index)
-+{
-+	ia_css_param_manifest_section_desc_t *param_manifest_section_base;
-+	ia_css_param_manifest_section_desc_t *
-+		param_manifest_section_desc = NULL;
-+
-+	verifjmpexit(param_terminal_manifest != NULL);
-+
-+	param_manifest_section_base =
-+		(ia_css_param_manifest_section_desc_t *)
-+		(((const char *)param_terminal_manifest)
-+		+ param_terminal_manifest->param_manifest_section_desc_offset);
-+
-+	param_manifest_section_desc =
-+		&(param_manifest_section_base[section_index]);
-+
-+EXIT:
-+	return param_manifest_section_desc;
-+}
-+
-+/* Spatial Parameter Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_spatial_param_terminal_manifest_get_size(
-+	const unsigned int nof_frame_param_sections)
-+{
-+	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
-+		nof_frame_param_sections * sizeof(
-+			ia_css_frame_grid_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_spatial_param_terminal_manifest_init(
-+	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
-+	const uint16_t section_count)
-+{
-+	if (spatial_param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	spatial_param_terminal->
-+		frame_grid_param_manifest_section_desc_count = section_count;
-+	spatial_param_terminal->
-+		frame_grid_param_manifest_section_desc_offset =
-+		sizeof(ia_css_spatial_param_terminal_manifest_t);
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_frame_grid_param_manifest_section_desc_t *
-+ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+	const ia_css_spatial_param_terminal_manifest_t *
-+		spatial_param_terminal_manifest,
-+	const unsigned int section_index)
-+{
-+	ia_css_frame_grid_param_manifest_section_desc_t *
-+		frame_param_manifest_section_base;
-+	ia_css_frame_grid_param_manifest_section_desc_t *
-+		frame_param_manifest_section_desc = NULL;
-+
-+	verifjmpexit(spatial_param_terminal_manifest != NULL);
-+
-+	frame_param_manifest_section_base =
-+		(ia_css_frame_grid_param_manifest_section_desc_t *)
-+		(((const char *)spatial_param_terminal_manifest) +
-+			spatial_param_terminal_manifest->
-+			frame_grid_param_manifest_section_desc_offset);
-+	frame_param_manifest_section_desc =
-+		&(frame_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+	return frame_param_manifest_section_desc;
-+}
-+
-+/* Sliced Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_sliced_param_terminal_manifest_get_size(
-+	const unsigned int nof_slice_param_sections)
-+{
-+	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
-+		nof_slice_param_sections *
-+		sizeof(ia_css_sliced_param_manifest_section_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_sliced_param_terminal_manifest_init(
-+	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
-+	const uint16_t section_count)
-+{
-+	if (sliced_param_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	sliced_param_terminal->sliced_param_section_count = section_count;
-+	sliced_param_terminal->sliced_param_section_offset =
-+		sizeof(ia_css_sliced_param_terminal_manifest_t);
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_sliced_param_manifest_section_desc_t *
-+ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+	const ia_css_sliced_param_terminal_manifest_t *
-+		sliced_param_terminal_manifest,
-+	const unsigned int section_index)
-+{
-+	ia_css_sliced_param_manifest_section_desc_t *
-+		sliced_param_manifest_section_base;
-+	ia_css_sliced_param_manifest_section_desc_t *
-+		sliced_param_manifest_section_desc = NULL;
-+
-+	verifjmpexit(sliced_param_terminal_manifest != NULL);
-+
-+	sliced_param_manifest_section_base =
-+		(ia_css_sliced_param_manifest_section_desc_t *)
-+		(((const char *)sliced_param_terminal_manifest) +
-+			sliced_param_terminal_manifest->
-+			sliced_param_section_offset);
-+	sliced_param_manifest_section_desc =
-+		&(sliced_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+	return sliced_param_manifest_section_desc;
-+}
-+
-+/* Program Terminal */
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+unsigned int ia_css_program_terminal_manifest_get_size(
-+	const unsigned int nof_fragment_param_sections,
-+	const unsigned int nof_kernel_fragment_sequencer_infos)
-+{
-+	return sizeof(ia_css_program_terminal_manifest_t) +
-+		nof_fragment_param_sections *
-+		sizeof(ia_css_fragment_param_manifest_section_desc_t) +
-+		nof_kernel_fragment_sequencer_infos *
-+		sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+int ia_css_program_terminal_manifest_init(
-+	ia_css_program_terminal_manifest_t *program_terminal,
-+	const uint16_t fragment_param_section_count,
-+	const uint16_t kernel_fragment_seq_info_section_count)
-+{
-+	if (program_terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	program_terminal->fragment_param_manifest_section_desc_count =
-+		fragment_param_section_count;
-+	program_terminal->fragment_param_manifest_section_desc_offset =
-+		sizeof(ia_css_program_terminal_manifest_t);
-+
-+	program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
-+		kernel_fragment_seq_info_section_count;
-+	program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
-+		sizeof(ia_css_program_terminal_manifest_t) +
-+		fragment_param_section_count*sizeof(
-+			ia_css_fragment_param_manifest_section_desc_t);
-+
-+	return 0;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_fragment_param_manifest_section_desc_t *
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+	const unsigned int section_index)
-+{
-+	ia_css_fragment_param_manifest_section_desc_t *
-+		fragment_param_manifest_section_base;
-+	ia_css_fragment_param_manifest_section_desc_t *
-+		fragment_param_manifest_section = NULL;
-+
-+	verifjmpexit(program_terminal_manifest != NULL);
-+
-+	fragment_param_manifest_section_base =
-+		(ia_css_fragment_param_manifest_section_desc_t *)
-+		(((const char *)program_terminal_manifest) +
-+		program_terminal_manifest->
-+		fragment_param_manifest_section_desc_offset);
-+	fragment_param_manifest_section =
-+		&(fragment_param_manifest_section_base[section_index]);
-+
-+EXIT:
-+	return fragment_param_manifest_section;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
-+	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
-+	const unsigned int info_index)
-+{
-+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+		kernel_manifest_fragment_sequencer_info_manifest_desc_base;
-+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
-+		kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
-+
-+	verifjmpexit(program_terminal_manifest != NULL);
-+
-+	kernel_manifest_fragment_sequencer_info_manifest_desc_base =
-+		(ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
-+		(((const char *)program_terminal_manifest) +
-+		program_terminal_manifest->
-+		kernel_fragment_sequencer_info_manifest_info_offset);
-+
-+	kernel_manifest_fragment_sequencer_info_manifest_desc =
-+		&(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
-+				info_index]);
-+
-+EXIT:
-+	return kernel_manifest_fragment_sequencer_info_manifest_desc;
-+}
-+
-+/* Start ...*/
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
-+	const ia_css_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_region_id(
-+	const ia_css_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
-+	const ia_css_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
-+}
-+
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
-+}
-+IA_CSS_PARAMETERS_STORAGE_CLASS_C
-+uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
-+	const ia_css_fragment_param_manifest_section_desc_t *section)
-+{
-+	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
-+}
-+
-+/* End ...*/
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
-new file mode 100644
-index 000000000000..41ec4ccf3ee9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
-@@ -0,0 +1,349 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
-+#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
-+
-+#include "ia_css_terminal_defs.h"
-+#include "type_support.h"
-+#include "ia_css_base_types.h"
-+#include "ia_css_terminal_manifest_base_types.h"
-+
-+/**
-+ * @addtogroup group_psysapi
-+ * @{
-+ */
-+
-+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
-+	(2 * IA_CSS_UINT16_T_BITS)
-+
-+/* =============== Cached Param Terminal Manifest - START ============== */
-+/** Descriptor for a single manifest parameter section.
-+ *
-+ * Each descriptor describes a single contiguous parameter payload that will
-+ * be written to hardware registers or other memory.  It defines the maximum
-+ * size of the section payload (critical for allocation and security), the device the
-+ * section belongs to, and the target memory type (usually device registers).
-+ *
-+ * A region ID allows specifying multiple sections for a single device when a
-+ * device's configuration registers are not all contigous.
-+ */
-+struct ia_css_param_manifest_section_desc_s {
-+	/** Maximum size of the related parameter region */
-+	uint16_t max_mem_size;
-+	/** mem_type, region and kernel_id
-+	  * - mem_type - Memory targeted by this section
-+	  * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+	  * - Region - subsection id within the specified memory
-+	  * - kernel_id - Indication of the kernel/device this parameter belongs to */
-+	uint16_t info;
-+};
-+
-+typedef struct ia_css_param_manifest_section_desc_s
-+	ia_css_param_manifest_section_desc_t;
-+
-+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
-+#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	+ (2*IA_CSS_UINT16_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/** Frame constant parameters terminal manifest
-+ *
-+ * This is the "header" for a list of parameter sections described by
-+ * ia_css_param_manifest_section_desc_s.
-+ */
-+struct ia_css_param_terminal_manifest_s {
-+	/** Parameter terminal manifest base */
-+	ia_css_terminal_manifest_t base;
-+	/**
-+	 * Number of cached parameter sections, coming from manifest
-+	 * but also shared by the terminal
-+	 */
-+	uint16_t param_manifest_section_desc_count;
-+	/**
-+	 * Points to the variable array of
-+	 * struct ia_css_param_section_desc_s
-+	 */
-+	uint16_t param_manifest_section_desc_offset;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_param_terminal_manifest_s
-+	ia_css_param_terminal_manifest_t;
-+/* ================= Cached Param Terminal Manifest - End ================ */
-+
-+/* ================= Spatial Param Terminal Manifest - START ============= */
-+
-+#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
-+	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
-+	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
-+
-+struct ia_css_fragment_grid_manifest_desc_s {
-+	/* Min resolution width/height of the spatial parameters
-+	 * for the fragment measured in compute units
-+	 */
-+	uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/* Max resolution width/height of the spatial parameters
-+	 * for the fragment measured in compute units
-+	 */
-+	uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_fragment_grid_manifest_desc_s
-+	ia_css_fragment_grid_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
-+#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+	(1 * IA_CSS_UINT32_T_BITS \
-+	+ 3 * IA_CSS_UINT8_T_BITS \
-+	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_frame_grid_param_manifest_section_desc_s {
-+	/* Maximum buffer total size allowed for
-+	 * this frame of parameters
-+	 */
-+	uint32_t max_mem_size;
-+	/* Memory space targeted by this section
-+	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+	 */
-+	uint8_t mem_type_id;
-+	/* Region id within the specified memory space */
-+	uint8_t region_id;
-+	/* size in bytes of each compute unit for
-+	 * the specified memory space and region
-+	 */
-+	uint8_t elem_size;
-+	/* align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
-+};
-+
-+typedef struct ia_css_frame_grid_param_manifest_section_desc_s
-+	ia_css_frame_grid_param_manifest_section_desc_t;
-+
-+#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
-+	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
-+	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
-+
-+struct ia_css_frame_grid_manifest_desc_s {
-+	/* Min resolution width/height of the spatial parameters for
-+	 * the frame measured in compute units
-+	 */
-+	uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/* Max resolution width/height of the spatial parameters for
-+	 * the frame measured in compute units
-+	 */
-+	uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_frame_grid_manifest_desc_s
-+	ia_css_frame_grid_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
-+#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
-+	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
-+	+ (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
-+	+ (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
-+	+ (2 * IA_CSS_UINT16_T_BITS) \
-+	+ (2 * IA_CSS_UINT8_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
-+	IA_CSS_UINT8_T_BITS))
-+
-+/** Spatial parameters terminal manifest */
-+struct ia_css_spatial_param_terminal_manifest_s {
-+	/** terminal manifest base object */
-+	ia_css_terminal_manifest_t base;
-+	/** Contains limits for the frame spatial parameters */
-+	ia_css_frame_grid_manifest_desc_t frame_grid_desc;
-+	/**
-+	 * Constains limits for the fragment spatial parameters
-+	 * - COMMON AMONG FRAGMENTS
-+	 */
-+	ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
-+	/**
-+	 * Number of frame spatial parameter sections, they are set
-+	 * in slice-steps through frame processing
-+	 */
-+	uint16_t frame_grid_param_manifest_section_desc_count;
-+	/**
-+	 * Points to the variable array of
-+	 * ia_css_frame_spatial_param_manifest_section_desc_t
-+	 */
-+	uint16_t frame_grid_param_manifest_section_desc_offset;
-+	/**
-+	 * Indication of the kernel this spatial parameter terminal belongs to
-+	 * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
-+	 */
-+	uint8_t kernel_id;
-+	/**
-+	 * Groups together compute units in order to achieve alignment
-+	 * requirements for transfes and to achieve canonical frame
-+	 * representation
-+	 */
-+	uint8_t compute_units_p_elem;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_spatial_param_terminal_manifest_s
-+	ia_css_spatial_param_terminal_manifest_t;
-+
-+/* ================= Spatial Param Terminal Manifest - END ================ */
-+
-+/* ================= Sliced Param Terminal Manifest - START =============== */
-+
-+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
-+#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+	(1 * IA_CSS_UINT32_T_BITS \
-+	+ 2 * IA_CSS_UINT8_T_BITS \
-+	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_sliced_param_manifest_section_desc_s {
-+	/** Maximum size of the related parameter region */
-+	uint32_t max_mem_size;
-+	/**
-+	 * Memory targeted by this section
-+	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
-+	 */
-+	uint8_t mem_type_id;
-+	/** Region id within the specified memory */
-+	uint8_t region_id;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
-+};
-+
-+typedef struct ia_css_sliced_param_manifest_section_desc_s
-+	ia_css_sliced_param_manifest_section_desc_t;
-+
-+#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
-+#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
-+	+ 2 * IA_CSS_UINT16_T_BITS \
-+	+ 1 * IA_CSS_UINT8_T_BITS \
-+	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/* Frame constant parameters terminal manifest */
-+struct ia_css_sliced_param_terminal_manifest_s {
-+	/** terminal manifest base object */
-+	ia_css_terminal_manifest_t base;
-+	/**
-+	 * Number of the array elements
-+	 * sliced_param_section_offset points to
-+	 */
-+	uint16_t sliced_param_section_count;
-+	/**
-+	 * Points to array of ia_css_sliced_param_manifest_section_desc_s
-+	 * which constain info for the slicing of the parameters
-+	 */
-+	uint16_t sliced_param_section_offset;
-+	/** Kernel identifier */
-+	uint8_t kernel_id;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
-+};
-+
-+typedef struct ia_css_sliced_param_terminal_manifest_s
-+	ia_css_sliced_param_terminal_manifest_t;
-+
-+/* ================= Slice Param Terminal Manifest - End =============== */
-+
-+/* ================= Program Terminal Manifest - START ================= */
-+
-+#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
-+	(2 * IA_CSS_UINT16_T_BITS)
-+
-+/** Fragment constant parameters manifest */
-+struct ia_css_fragment_param_manifest_section_desc_s {
-+	/** Maximum size of the related parameter region */
-+	uint16_t max_mem_size;
-+	/** (mem_type, region and kernel_id) */
-+	uint16_t info;
-+};
-+
-+typedef struct ia_css_fragment_param_manifest_section_desc_s
-+	ia_css_fragment_param_manifest_section_desc_t;
-+
-+#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
-+	(10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
-+	/* Slice dimensions */
-+	uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/* Slice dimensions */
-+	uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/* Nof slices */
-+	uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+	/* Nof slices */
-+	uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+	/* Grid point decimation factor */
-+	uint16_t
-+	min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+	/* Grid point decimation factor */
-+	uint16_t
-+	max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+	/* Relative position of grid origin to pixel origin */
-+	int16_t
-+	min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+	/* Relative position of grid origin to pixel origin */
-+	int16_t
-+	max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+	/* Dimension of grid */
-+	int16_t
-+	min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/* Dimension of grid */
-+	int16_t
-+	max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
-+	ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
-+
-+#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
-+#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
-+	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
-+	+ (IA_CSS_UINT32_T_BITS) \
-+	+ (5*IA_CSS_UINT16_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
-+
-+/** Program parameters terminal */
-+struct ia_css_program_terminal_manifest_s {
-+	/** terminal manifest base object */
-+	ia_css_terminal_manifest_t base;
-+	/** Connection manager passes seq info as single blob at the moment */
-+	uint32_t sequencer_info_kernel_id;
-+	/** Maximum number of command secriptors supported
-+	 * by the program group
-+	 */
-+	uint16_t max_kernel_fragment_sequencer_command_desc;
-+	/** The total count of prog-init parameter descriptors */
-+	uint16_t fragment_param_manifest_section_desc_count;
-+	/** The offset of the manifest section descriptor from the base of this structure */
-+	uint16_t fragment_param_manifest_section_desc_offset;
-+	uint16_t kernel_fragment_sequencer_info_manifest_info_count;
-+	uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
-+	/** align to 64 */
-+	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
-+};
-+
-+typedef struct ia_css_program_terminal_manifest_s
-+	ia_css_program_terminal_manifest_t;
-+
-+/* ==================== Program Terminal Manifest - END ==================== */
-+
-+/** @} */
-+
-+#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
-new file mode 100644
-index 000000000000..2eb9c88468dc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
-@@ -0,0 +1,477 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_TERMINAL_TYPES_H
-+#define __IA_CSS_TERMINAL_TYPES_H
-+
-+#include "type_support.h"
-+#include "ia_css_base_types.h"
-+#include "ia_css_terminal_base_types.h"
-+
-+typedef struct ia_css_program_control_init_load_section_desc_s
-+	ia_css_program_control_init_load_section_desc_t;
-+typedef struct ia_css_program_control_init_connect_section_desc_s
-+	ia_css_program_control_init_connect_section_desc_t;
-+typedef struct ia_css_program_control_init_program_desc_s
-+	ia_css_program_control_init_program_desc_t;
-+typedef struct ia_css_program_control_init_terminal_s
-+	ia_css_program_control_init_terminal_t;
-+
-+typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
-+typedef struct ia_css_fragment_param_section_desc_s
-+	ia_css_fragment_param_section_desc_t;
-+typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
-+	ia_css_kernel_fragment_sequencer_info_desc_t;
-+typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
-+	ia_css_kernel_fragment_sequencer_command_desc_t;
-+
-+typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
-+typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
-+typedef struct ia_css_slice_param_section_desc_s
-+	ia_css_slice_param_section_desc_t;
-+
-+typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
-+typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
-+typedef struct ia_css_frame_grid_param_section_desc_s
-+	ia_css_frame_grid_param_section_desc_t;
-+typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
-+
-+typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
-+typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
-+
-+typedef struct ia_css_param_payload_s ia_css_param_payload_t;
-+typedef struct ia_css_terminal_s ia_css_terminal_t;
-+
-+/* =================== Generic Parameter Payload - START =================== */
-+#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT	1
-+#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT	1
-+
-+#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	(N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
-+	+ VIED_VADDRESS_BITS \
-+	+ N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+struct ia_css_param_payload_s {
-+	/**
-+	 * Temporary variable holding the host address of the parameter buffer
-+	 * as PSYS is handling the parameters on the host side for the moment
-+	 */
-+	uint64_t host_buffer;
-+	/**
-+	 * Base virtual addresses to parameters in subsystem virtual
-+	 * memory space
-+	 * NOTE: Used in legacy pg flow
-+	 */
-+	vied_vaddress_t buffer;
-+	/**
-+	 * Offset to buffer address within external buffer set structure
-+	 * NOTE: Used in ppg flow
-+	 */
-+	uint32_t terminal_index;
-+};
-+/* =================== Generic Parameter Payload - End ==================== */
-+
-+/* ==================== Cached Param Terminal - START ==================== */
-+#define N_UINT32_IN_PARAM_SEC_STRUCT 2
-+
-+#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
-+	(N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** Parameters section */
-+struct ia_css_param_section_desc_s {
-+	/** Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/** Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_PARAM_TERMINAL_STRUCT		1
-+#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT	6
-+
-+#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	+ N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/** "Cached" parameters terminal for parameter that do not change
-+ * at frame scope.
-+ */
-+struct ia_css_param_terminal_s {
-+	/** Parameter terminal base */
-+	ia_css_terminal_t base;
-+	/** Helps to identify the parameter buffer when sent later on with the buffer set  */
-+	ia_css_param_payload_t param_payload;
-+	/** Points to the variable array of ia_css_param_section_desc_t */
-+	uint16_t param_section_desc_offset;
-+	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
-+};
-+/* ==================== Cached Param Terminal - End ==================== */
-+
-+/* ==================== Spatial Param Terminal - START ==================== */
-+#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
-+
-+#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
-+	(N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_fragment_grid_desc_s {
-+	/**
-+	 * Offset width/height of the top-left compute unit of the
-+	 * fragment compared to the frame
-+	 */
-+	uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
-+	/**
-+	 * Resolution width/height of the spatial parameters that
-+	 * correspond to the fragment measured in compute units
-+	 */
-+	uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+};
-+
-+#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT		3
-+#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT	4
-+
-+#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
-+	(N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
-+	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+/**
-+ * A plane of parameters with spatial aspect
-+ * (compute units correlated to pixel data)
-+ */
-+struct ia_css_frame_grid_param_section_desc_s {
-+	/** Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/** Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+	/**
-+	 * stride in bytes of each line of compute units for
-+	 * the specified memory space and region
-+	 */
-+	uint32_t stride;
-+	uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
-+};
-+
-+#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
-+#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
-+
-+#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
-+	(N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_frame_grid_desc_s {
-+	/** Resolution width/height of the frame of
-+	 * spatial parameters measured in compute units
-+	 */
-+	uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
-+	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
-+};
-+
-+#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
-+#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
-+
-+#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	+ SIZE_OF_FRAME_GRID_STRUCT_BITS \
-+	+ N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
-+	+ N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_spatial_param_terminal_s {
-+	/** Spatial Parameter terminal base */
-+	ia_css_terminal_t base;
-+	/** Spatial Parameter buffer handle attached to the terminal */
-+	ia_css_param_payload_t param_payload;
-+	/** Contains info for the frame of spatial parameters */
-+	ia_css_frame_grid_desc_t frame_grid_desc;
-+	/** Kernel identifier */
-+	uint32_t kernel_id;
-+	/**
-+	 * Points to the variable array of
-+	 * ia_css_frame_grid_param_section_desc_t
-+	 */
-+	uint16_t frame_grid_param_section_desc_offset;
-+	/**
-+	 * Points to array of ia_css_fragment_spatial_desc_t
-+	 * which constain info for the fragments of spatial parameters
-+	 */
-+	uint16_t fragment_grid_desc_offset;
-+};
-+/* ==================== Spatial Param Terminal - END ==================== */
-+
-+/* ==================== Sliced Param Terminal - START ==================== */
-+#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
-+
-+#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
-+	(N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** A Slice of parameters ready to be trasferred from/to registers */
-+struct ia_css_slice_param_section_desc_s {
-+	/** Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/** Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT		2
-+#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT	4
-+
-+#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
-+	(N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_fragment_slice_desc_s {
-+	/**
-+	 * Points to array of ia_css_slice_param_section_desc_t
-+	 * which constain info for each prameter slice
-+	 */
-+	uint16_t slice_section_desc_offset;
-+	/** Number of slices for the parameters for this fragment */
-+	uint16_t slice_count;
-+	uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
-+};
-+
-+#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT	1
-+#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT	1
-+#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT	2
-+
-+#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	+ N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
-+	+ N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_sliced_param_terminal_s {
-+	/** Spatial Parameter terminal base */
-+	ia_css_terminal_t base;
-+	/** Spatial Parameter buffer handle attached to the terminal */
-+	ia_css_param_payload_t param_payload;
-+	/** Kernel identifier */
-+	uint32_t kernel_id;
-+	/**
-+	 * Points to array of ia_css_fragment_slice_desc_t
-+	 * which constain info for the slicing of the parameters
-+	 */
-+	uint16_t fragment_slice_desc_offset;
-+	uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
-+};
-+/* ==================== Sliced Param Terminal - END ==================== */
-+
-+/* ================= Program Control Init Terminal - START ================= */
-+#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS	\
-+	(DEVICE_DESCRIPTOR_ID_BITS	\
-+	+ (2 * IA_CSS_UINT16_T_BITS)	\
-+	)
-+struct ia_css_program_control_init_load_section_desc_s {
-+	/** Device descriptor */
-+	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
-+	/** Memory allocation size needs of this parameter */
-+	uint16_t mem_size;
-+	/** (Applicable to) mode bitmask */
-+	uint16_t mode_bitmask;
-+};
-+
-+#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
-+#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
-+#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
-+#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
-+#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
-+#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
-+#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
-+
-+struct connect_section_idx_bitfields_s {
-+	uint16_t plane_id : 4;
-+	uint16_t bottom_lines : 6;
-+	uint16_t top_lines : 6;
-+};
-+
-+union connect_section_idx_t {
-+	struct connect_section_idx_bitfields_s as_bitfield;
-+	uint16_t as_uint_16;
-+};
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS	\
-+	(DEVICE_DESCRIPTOR_ID_BITS	\
-+	+ (1 * IA_CSS_UINT16_T_BITS)	\
-+	+ (1 * IA_CSS_UINT8_T_BITS)	\
-+	+ IA_CSS_TERMINAL_ID_BITS	\
-+	)
-+struct ia_css_program_control_init_connect_section_desc_s {
-+	/** Device descriptor */
-+	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
-+	/** Connected terminal section (plane) index */
-+	uint16_t connect_section_idx;
-+	/** (Applicable to) mode bitmask */
-+	uint8_t mode_bitmask;
-+	/** Absolute referral ID for the connected terminal */
-+	ia_css_terminal_ID_t connect_terminal_ID;
-+};
-+
-+#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO	(1)
-+#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
-+#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
-+	(1 * IA_CSS_UINT16_T_BITS)	\
-+	+ (1 * IA_CSS_UINT8_T_BITS)	\
-+	+ (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS	\
-+	(4 * IA_CSS_UINT16_T_BITS)	\
-+	+ (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
-+	+ (2 * IA_CSS_UINT8_T_BITS) \
-+	+ (1 * IA_CSS_UINT16_T_BITS) \
-+	+ (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
-+		IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_program_desc_control_info_s {
-+	/** 12-bit process identifier */
-+	ia_css_process_id_t process_id;
-+	/** number of done acks required to close the process */
-+	uint8_t num_done_events;
-+	uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
-+};
-+
-+struct ia_css_program_control_init_program_desc_s {
-+	/** Number of load sections in this program */
-+	uint16_t load_section_count;
-+	/** Points to variable size array of
-+	 * ia_css_program_control_init_load_section_desc_s
-+	 * in relation to its program_desc
-+	 */
-+	uint16_t load_section_desc_offset;
-+	/** Number of connect sections in this program */
-+	uint16_t connect_section_count;
-+	/** Points to variable size array of
-+	 * ia_css_program_control_init_connect_section_desc_s
-+	 * in relation to its program_desc
-+	 */
-+	uint16_t connect_section_desc_offset;
-+	struct ia_css_program_desc_control_info_s control_info;
-+	/** number of load sections that are filled */
-+	uint8_t filled_load_sections;
-+	/** number of connect sections that are filled */
-+	uint8_t filled_connect_sections;
-+	/** mem_offset for the first load section */
-+	uint16_t load_section_mem_offset;
-+	/* align to 64 bits */
-+	/* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
-+};
-+
-+#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	+ (1 * IA_CSS_UINT32_T_BITS) \
-+	+ (2 * IA_CSS_UINT16_T_BITS) \
-+	)
-+struct ia_css_program_control_init_terminal_s {
-+	/** Parameter terminal base */
-+	ia_css_terminal_t base;
-+	/** Parameter buffer handle attached to the terminal */
-+	ia_css_param_payload_t param_payload;
-+	/** Fragment stride for the payload, used to find the base
-+	 * of the payload for a given fragment
-+	 */
-+	uint32_t payload_fragment_stride;
-+	/** Points to the variable array of
-+	 * ia_css_program_control_init_program_desc_s
-+	 */
-+	uint16_t program_section_desc_offset;
-+	/** Number of instantiated programs in program group (processes) */
-+	uint16_t program_count;
-+};
-+/* ================= Program Control Init Terminal - END ================= */
-+
-+/* ==================== Program Terminal - START ==================== */
-+
-+#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
-+
-+#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
-+	(N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
-+
-+/** Fragment constant parameters section */
-+struct ia_css_fragment_param_section_desc_s {
-+	/** Offset of the parameter allocation in memory */
-+	uint32_t mem_offset;
-+	/** Memory allocation size needs of this parameter */
-+	uint32_t mem_size;
-+};
-+
-+#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
-+
-+#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
-+	(N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+/** 4 commands packe together to save memory space */
-+struct ia_css_kernel_fragment_sequencer_command_desc_s {
-+	/** Contains the "(command_index%4) == index" command desc */
-+	uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
-+};
-+
-+#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
-+
-+#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
-+	(N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
-+
-+struct ia_css_kernel_fragment_sequencer_info_desc_s {
-+	/** Slice dimensions */
-+	uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/** Nof slices */
-+	uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
-+	/** Grid point decimation factor */
-+	uint16_t
-+	fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
-+	/** Relative position of grid origin to pixel origin */
-+	int16_t
-+	fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
-+	/** Size of active fragment region */
-+	int16_t
-+	fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
-+	/** If >0 it overrides the standard fragment sequencer info */
-+	uint16_t command_count;
-+	/**
-+	 * To be used only if command_count>0, points to the descriptors
-+	 * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
-+	 */
-+	uint16_t command_desc_offset;
-+};
-+
-+#define N_UINT16_IN_PROG_TERM_STRUCT		2
-+#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT	0
-+#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
-+#define UNIFIED_PROG_TERM_FRAG_DESC
-+
-+#define SIZE_OF_PROG_TERM_STRUCT_BITS \
-+	(SIZE_OF_TERMINAL_STRUCT_BITS \
-+	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
-+	+ N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
-+	+ N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
-+
-+struct ia_css_program_terminal_s {
-+	/** Program terminal base */
-+	ia_css_terminal_t base;
-+	/** Program terminal buffer handle attached to the terminal */
-+	ia_css_param_payload_t param_payload;
-+	/** Points to array of ia_css_fragment_param_desc_s */
-+	uint16_t fragment_param_section_desc_offset;
-+	/** Points to array of ia_css_kernel_fragment_sequencer_info_s */
-+	uint16_t kernel_fragment_sequencer_info_desc_offset;
-+	/* stride to next fragment*/
-+	uint32_t payload_fragment_stride;
-+	/** align to 64 */
-+	/*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
-+};
-+/* ==================== Program Terminal - END ==================== */
-+
-+#endif /* __IA_CSS_TERMINAL_TYPES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
-new file mode 100644
-index 000000000000..1fe223af1bd7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
-@@ -0,0 +1,1002 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/*! \file */
-+
-+#ifndef __IA_CSS_TRACE_H
-+#define __IA_CSS_TRACE_H
-+
-+/*
-+** Configurations
-+*/
-+
-+/**
-+ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
-+ *         Where:
-+ *             {Module Name} is the name of the targeted module.
-+ *
-+ *         Example:
-+ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
-+ */
-+
-+/**< Use whatever method of tracing that best suits the platform
-+ * this code is compiled for.
-+ */
-+#define IA_CSS_TRACE_METHOD_NATIVE  1
-+/**< Use the Tracing NCI. */
-+#define IA_CSS_TRACE_METHOD_TRACE   2
-+
-+/**
-+ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
-+ *         Where:
-+ *             {Module Name} is the name of the targeted module.
-+ *             {Level}, in decreasing order of severity, is one of the
-+ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
-+ *                       VERBOSE, FATAL}.
-+ *         Example:
-+ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
-+ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
-+ */
-+/**< Disables the corresponding trace level. */
-+#define IA_CSS_TRACE_LEVEL_DISABLED 0
-+/**< Enables the corresponding trace level. */
-+#define IA_CSS_TRACE_LEVEL_ENABLED  1
-+
-+/*
-+ * Used in macro definition with do-while loop
-+ * for removing checkpatch warnings
-+ */
-+#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
-+
-+/**
-+ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
-+ * line printed with every log message.
-+ *
-+ *	   Example:
-+ *	       #define IA_CSS_TRACE_PRINT_FILE_LINE
-+ */
-+
-+/*
-+** Interface
-+*/
-+
-+/*
-+** Static
-+*/
-+
-+/**
-+ * Logs a message with zero arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @param module The targeted module.
-+ * @param severity The severity level of the trace message. In decreasing order:
-+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
-+ * @param format The message to be traced.
-+ */
-+#define IA_CSS_TRACE_0(module, severity, format) \
-+	IA_CSS_TRACE_IMPL(module, 0, severity, format)
-+
-+/**
-+ * Logs a message with one argument if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_1(module, severity, format, a1) \
-+	IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
-+
-+/**
-+ * Logs a message with two arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
-+	IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
-+
-+/**
-+ * Logs a message with three arguments if the targeted severity level
-+ * is enabled at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
-+	IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
-+
-+/**
-+ * Logs a message with four arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
-+	IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
-+
-+/**
-+ * Logs a message with five arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
-+	IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
-+
-+/**
-+ * Logs a message with six arguments if the targeted severity level is enabled
-+ * at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
-+	IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
-+
-+/**
-+ * Logs a message with seven arguments if the targeted severity level
-+ * is enabled at compile-time.
-+ * @see IA_CSS_TRACE_0
-+ */
-+#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
-+	IA_CSS_TRACE_IMPL(module, 7, severity, format, \
-+					a1, a2, a3, a4, a5, a6, a7)
-+
-+/*
-+** Dynamic
-+*/
-+
-+/**
-+* Declares, but does not define, dynamic tracing functions and variables
-+* for module \p module.  For each module, place an instance of this macro
-+* in the compilation unit in which you want to use dynamic tracing facility
-+* so as to inform the compiler of the declaration of the available functions.
-+* An invocation of this function does not enable any of the available tracing
-+* levels.  Do not place a semicolon after a call to this macro.
-+* @see IA_CSS_TRACE_DYNAMIC_DEFINE
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
-+	IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
-+/**
-+* Declares the configuration function for the dynamic api seperatly, if one
-+* wants to use it.
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
-+	IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
-+
-+/**
-+* Defines dynamic tracing functions and variables for module \p module.
-+* For each module, place an instance of this macro in one, and only one,
-+* of your SOURCE files so as to allow the linker resolve the related symbols.
-+* An invocation of this macro does not enable any of the available tracing
-+* levels.  Do not place a semicolon after a call to this macro.
-+* @see IA_CSS_TRACE_DYNAMIC_DECLARE
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
-+	IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
-+/**
-+* Defines the configuration function for the dynamic api seperatly, if one
-+* wants to use it.
-+*/
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
-+	IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
-+
-+/**
-+ * Logs a message with zero arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @param module The targeted module.
-+ * @param severity The severity level of the trace message. In decreasing order:
-+ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
-+ * @param format The message to be traced.
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
-+
-+/**
-+ * Logs a message with one argument if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
-+
-+/**
-+ * Logs a message with two arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
-+
-+/**
-+ * Logs a message with three arguments if the targeted severity level
-+ * is enabled both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
-+
-+/**
-+ * Logs a message with four arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
-+
-+/**
-+ * Logs a message with five arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
-+						a1, a2, a3, a4, a5)
-+
-+/**
-+ * Logs a message with six arguments if the targeted severity level is enabled
-+ * both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
-+						a1, a2, a3, a4, a5, a6)
-+
-+/**
-+ * Logs a message with seven arguments if the targeted severity level
-+ * is enabled both at compile-time, and run-time.
-+ * @see IA_CSS_TRACE_DYNAMIC_0
-+ */
-+#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+	IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
-+						a1, a2, a3, a4, a5, a6, a7)
-+
-+/*
-+** Implementation
-+*/
-+
-+/* CAT */
-+#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
-+#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
-+
-+/* Bridge */
-+#if defined(__HIVECC) || defined(__GNUC__)
-+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
-+	IA_CSS_TRACE_CAT( \
-+		IA_CSS_TRACE_CAT( \
-+			IA_CSS_TRACE_CAT( \
-+				IA_CSS_TRACE_CAT( \
-+					IA_CSS_TRACE_CAT( \
-+						IA_CSS_TRACE_, \
-+						argument_count \
-+					), \
-+					_ \
-+				), \
-+				IA_CSS_TRACE_CAT( \
-+					module, \
-+					_TRACE_METHOD \
-+				) \
-+			), \
-+			_ \
-+		), \
-+		IA_CSS_TRACE_CAT( \
-+			IA_CSS_TRACE_CAT( \
-+				module, \
-+				_TRACE_LEVEL_ \
-+			), \
-+			severity \
-+		) \
-+		( \
-+			IA_CSS_TRACE_CAT( \
-+				IA_CSS_TRACE_CAT( \
-+					IA_CSS_TRACE_CAT( \
-+						IA_CSS_TRACE_SEVERITY_, \
-+						severity \
-+					), \
-+					_ \
-+				), \
-+				IA_CSS_TRACE_CAT( \
-+					module, \
-+					_TRACE_METHOD \
-+				) \
-+			), \
-+			#module, \
-+			## arguments \
-+		) \
-+	)
-+
-+/* Bridge */
-+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
-+							arguments ...) \
-+	do { \
-+		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
-+							severity)) { \
-+			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
-+							## arguments); \
-+		} \
-+	} while (0)
-+#elif defined(_MSC_VER)
-+#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
-+	IA_CSS_TRACE_CAT( \
-+		IA_CSS_TRACE_CAT( \
-+			IA_CSS_TRACE_CAT( \
-+				IA_CSS_TRACE_CAT( \
-+					IA_CSS_TRACE_CAT( \
-+						IA_CSS_TRACE_, \
-+						argument_count \
-+					), \
-+					_ \
-+				), \
-+				IA_CSS_TRACE_CAT( \
-+					module, \
-+					_TRACE_METHOD \
-+				) \
-+			), \
-+			_ \
-+		), \
-+		IA_CSS_TRACE_CAT( \
-+			IA_CSS_TRACE_CAT( \
-+				module, \
-+				_TRACE_LEVEL_ \
-+			), \
-+			severity \
-+		) \
-+		( \
-+			IA_CSS_TRACE_CAT( \
-+				IA_CSS_TRACE_CAT( \
-+					IA_CSS_TRACE_CAT( \
-+						IA_CSS_TRACE_SEVERITY_, \
-+						severity \
-+					), \
-+					_ \
-+				), \
-+				IA_CSS_TRACE_CAT( \
-+					module, \
-+					_TRACE_METHOD \
-+				) \
-+			), \
-+			#module, \
-+			__VA_ARGS__  \
-+		) \
-+	)
-+
-+/* Bridge */
-+#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
-+	do { \
-+		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
-+							severity)) { \
-+			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
-+							__VA_ARGS__); \
-+		} \
-+	} while (0)
-+#endif
-+
-+/*
-+** Native Backend
-+*/
-+
-+#if defined(__HIVECC)
-+	#define IA_CSS_TRACE_PLATFORM_CELL
-+#elif defined(__XTENSA__)
-+	#define IA_CSS_TRACE_PLATFORM_XTENSA
-+#elif defined(XTENSA_HOST)
-+	#define IA_CSS_TRACE_PLATFORM_XTENSA
-+#elif defined(__GNUC__)
-+	#define IA_CSS_TRACE_PLATFORM_HOST
-+
-+	#define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
-+	do { \
-+		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+		PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
-+						format),  ## arguments); \
-+	} while (0)
-+	/* TODO: In case Host Side tracing is needed to be mapped to the
-+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+	 * PRINT to vied_nci_tunit_print function calls
-+	*/
-+	#define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
-+	do { \
-+		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+		PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
-+						format),  ## arguments); \
-+	} while (0)
-+
-+#elif defined(_MSC_VER)
-+	#define IA_CSS_TRACE_PLATFORM_HOST
-+
-+#ifdef _KERNEL_MODE
-+	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
-+		do { \
-+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+			P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
-+					module, format),  __VA_ARGS__); \
-+		} while (0)
-+	/* TODO: In case Host Side tracing is needed to be mapped to the
-+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+	 * PRINT to vied_nci_tunit_print function calls
-+	*/
-+	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
-+		do { \
-+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+			P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
-+					module, format),  __VA_ARGS__); \
-+		} while (0)
-+#else
-+	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
-+		do { \
-+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+			PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
-+					module, format),  __VA_ARGS__); \
-+		} while (0)
-+	/* TODO: In case Host Side tracing is needed to be mapped to the
-+	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
-+	 * PRINT to vied_nci_tunit_print function calls
-+	*/
-+	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
-+		do { \
-+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+			PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
-+					module, format),  __VA_ARGS__); \
-+		} while (0)
-+#endif
-+#else
-+	#error Unsupported platform!
-+#endif /* Platform */
-+
-+#if defined(IA_CSS_TRACE_PLATFORM_CELL)
-+	#include <hive/attributes.h> /* VOLATILE */
-+
-+	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
-+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
-+			do { \
-+				OP___printstring(__FILE__":") VOLATILE; \
-+				OP___printdec(__LINE__) VOLATILE; \
-+				OP___printstring("\n") VOLATILE; \
-+			} while (0)
-+	#else
-+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
-+	#endif
-+
-+	#define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
-+		do { \
-+			IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
-+			OP___printstring("["module"]:["severity"]:") \
-+			VOLATILE; \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
-+		do { \
-+			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
-+			OP___printstring("["module"]:["severity"]: "format) \
-+			VOLATILE; \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
-+		do { \
-+			IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
-+			OP___dump(i, value) VOLATILE; \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+		IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
-+
-+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+						a1, a2, a3, a4) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
-+		} while (0)
-+
-+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+		do { \
-+			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
-+			IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
-+		} while (0)
-+	/*
-+	** Tracing Backend
-+	*/
-+#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
-+	#include "vied_nci_tunit.h"
-+#endif
-+	#define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
-+		"[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
-+
-+	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
-+		vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity)
-+
-+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
-+		vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1)
-+
-+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
-+		vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2)
-+
-+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
-+		vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2, a3)
-+
-+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
-+		vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2, a3, a4)
-+
-+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+		vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2, a3, a4, a5)
-+
-+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+		vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2, a3, a4, a5, a6)
-+
-+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+		vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
-+								module), \
-+			severity, a1, a2, a3, a4, a5, a6, a7)
-+
-+#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
-+	#include "print_support_xtensa.h"
-+
-+	/* TODO: Tunit tracing is not yet supported on Xtensa platforms,
-+	 * proper Trace functions will be created once supported.
-+	 */
-+
-+	#define IA_CSS_TRACE_TRACE_0(severity, module, format)
-+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
-+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
-+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
-+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
-+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
-+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
-+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#ifdef __XTENSA_FW__
-+	#define SOURCE "FW"
-+#else
-+	#define SOURCE "HOST"
-+#endif
-+
-+#if defined(XTENSA_PRINT_USE_SIMCALL)
-+
-+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+	simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
-+
-+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+	simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
-+
-+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+	simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
-+
-+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+	simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
-+
-+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+						a1, a2, a3, a4) \
-+	simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
-+
-+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+	simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
-+
-+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+	simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
-+
-+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+	simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#elif defined(XTENSA_PRINT_USE_PRINTF)
-+
-+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
-+
-+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
-+
-+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
-+
-+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
-+
-+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+						a1, a2, a3, a4) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
-+
-+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
-+
-+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
-+
-+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
-+
-+#endif
-+#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
-+	#include "print_support.h"
-+
-+	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
-+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
-+				PRINT("%s:%d:\n", __FILE__, __LINE__)
-+	#else
-+		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
-+	#endif
-+
-+	#define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
-+			"[" module "]:[" severity "]: " format
-+
-+	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format)
-+
-+	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, a1)
-+
-+	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
-+
-+	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
-+
-+	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
-+						a1, a2, a3, a4) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
-+
-+	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, \
-+						a1, a2, a3, a4, a5)
-+
-+	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6)
-+
-+	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+		IA_CSS_TRACE_NATIVE(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7)
-+
-+	#define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
-+			"["module"]:["severity"]: "format
-+
-+	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
-+		IA_CSS_TRACE_TRACE(severity, module, format)
-+
-+	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, a1)
-+
-+	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
-+
-+	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
-+
-+	#define IA_CSS_TRACE_TRACE_4(severity, module, format, \
-+						a1, a2, a3, a4) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
-+
-+	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
-+						a1, a2, a3, a4, a5) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, \
-+						a1, a2, a3, a4, a5)
-+
-+	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6)
-+
-+	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7) \
-+		IA_CSS_TRACE_TRACE(severity, module, format, \
-+						a1, a2, a3, a4, a5, a6, a7)
-+#endif
-+
-+/* Disabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_1_0(severity, module, format)
-+#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
-+#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
-+#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
-+#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
-+#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5)
-+#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5, arg6)
-+#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5, arg6, arg7)
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
-+#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
-+#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
-+#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
-+#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
-+#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
-+#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
-+#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
-+
-+#if defined(_MSC_VER) && defined(_KERNEL_MODE)
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
-+#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
-+#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
-+#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
-+#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
-+#else
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
-+#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
-+#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
-+#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
-+#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
-+#endif
-+/* Disabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_2_0(severity, module, format)
-+#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
-+#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
-+#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
-+#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
-+#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5)
-+#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5, arg6)
-+#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
-+							arg5, arg6, arg7)
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
-+#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
-+#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
-+#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
-+#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
-+#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
-+#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
-+#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
-+#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
-+
-+/* Enabled */
-+/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
-+#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
-+#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
-+#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
-+#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
-+#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
-+#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
-+
-+/*
-+** Dynamicism
-+*/
-+
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
-+	do { \
-+		void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
-+		void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
-+	} while (0)
-+
-+#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
-+	do { \
-+		IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
-+		void IA_CSS_TRACE_CAT(module, _trace_configure)\
-+			(int argc, const char *const *argv); \
-+	} while (0)
-+
-+#include "platform_support.h"
-+#include "type_support.h"
-+
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
-+	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
-+	} \
-+	\
-+	void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
-+	{ \
-+		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
-+	}
-+
-+#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
-+void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
-+				const char *const *const argv) \
-+{ \
-+	int i = 1; \
-+	const char *levels = 0; \
-+	\
-+	while (i < argc) { \
-+		if (!strcmp(argv[i], "-" #module "_trace")) { \
-+			++i; \
-+			\
-+			if (i < argc) { \
-+				levels = argv[i]; \
-+				\
-+				while (*levels) { \
-+					switch (*levels++) { \
-+					case 'a': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_assert_enable)(); \
-+						break; \
-+						\
-+					case 'e': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_error_enable)(); \
-+						break; \
-+						\
-+					case 'w': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_warning_enable)(); \
-+						break; \
-+						\
-+					case 'i': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_info_enable)(); \
-+						break; \
-+						\
-+					case 'd': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_debug_enable)(); \
-+						break; \
-+						\
-+					case 'v': \
-+						IA_CSS_TRACE_CAT \
-+					(module, _trace_verbose_enable)(); \
-+						break; \
-+						\
-+					default: \
-+					} \
-+				} \
-+			} \
-+		} \
-+		\
-+	++i; \
-+	} \
-+}
-+
-+#endif /* __IA_CSS_TRACE_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
-new file mode 100644
-index 000000000000..d8bff58ee178
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IPU_DEVICE_ACB_DEVICES_H
-+#define __IPU_DEVICE_ACB_DEVICES_H
-+
-+enum ipu_device_acb_id {
-+	IPU_DEVICE_ACB_B2B_ID,
-+	IPU_DEVICE_ACB_RYNR_ID,
-+	IPU_DEVICE_ACB_DEMOSAIC_ID,
-+	IPU_DEVICE_ACB_ICA_ID,
-+	IPU_DEVICE_ACB_LSC_ID,
-+	IPU_DEVICE_ACB_DPC_ID,
-+	IPU_DEVICE_ACB_R2I_SIE_ID,
-+	IPU_DEVICE_ACB_R2I_DS_A_ID,
-+	IPU_DEVICE_ACB_R2I_DS_B_ID,
-+	IPU_DEVICE_ACB_AWB_ID,
-+	IPU_DEVICE_ACB_AF_ID,
-+	IPU_DEVICE_ACB_PAF_ID,
-+	IPU_DEVICE_ACB_AE_ID,
-+	IPU_DEVICE_ACB_NUM_ACB
-+};
-+
-+#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB)
-+
-+#endif /* __IPU_DEVICE_ACB_DEVICES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
-new file mode 100644
-index 000000000000..df91edd7a91f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
-@@ -0,0 +1,195 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IPU_DEVICE_GP_DEVICES_H
-+#define __IPU_DEVICE_GP_DEVICES_H
-+#include "math_support.h"
-+#include "type_support.h"
-+
-+enum ipu_device_gp_id {
-+	IPU_DEVICE_GP_PSA = 0,
-+	IPU_DEVICE_GP_ISA_STATIC,
-+	IPU_DEVICE_GP_ISA_RUNTIME,
-+	IPU_DEVICE_GP_NUM_GP
-+};
-+
-+/* The PSA_* naming in the enum members refers to the internal separation of
-+ * the PSA. Using it this way should make this change transparent
-+ * to higher layers.
-+ *
-+ * For details on the values and usage of the muxes see Figures 3-1
-+ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
-+ * Fixed Function MAS. Additionally, refer to the respective description
-+ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
-+ * or isa_ps_system.rdl).
-+ */
-+enum ipu_device_gp_psa_mux_id {
-+	/* Mux/demuxes */
-+	/* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
-+	IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
-+	/* 0 - To XNR; 1 - WB/DM */
-+	IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
-+	/* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
-+	IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
-+	/* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
-+	IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
-+	/* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
-+	IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
-+	/* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
-+	IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
-+	/* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
-+	IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
-+	/* Device blockers */
-+	/* BNLM pixel output block enable */
-+	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
-+	/* BNLM pixel output block enable */
-+	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
-+	/* BNLM delta output block enable */
-+	IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
-+	/* Block pixel stream to gltm from vcsc */
-+	IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
-+	/* Block pixel stream to gltm from bnlm */
-+	IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
-+	/* Frame size reg for strmCrop H */
-+	IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
-+	IPU_DEVICE_GP_PSA_MUX_NUM_MUX
-+};
-+
-+enum ipu_device_gp_isa_static_mux_id {
-+	/* Muxes/demuxes */
-+	/* 0 - to ISL.S2V; 1 - to PSA */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
-+	/* 0 - to ISL.S2V; 1 - to PSA */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
-+	/* 0 - Input Correction; 1 - B2B mux */
-+	IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
-+	/* 0 - Input Correction; 1 - B2B mux */
-+	IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
-+	/* 0 - Input Correction; 1 - B2B mux */
-+	IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
-+	/* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
-+	/* 0 - Input correction; 1 - Dpc; 2 - X2b */
-+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
-+	/* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
-+	IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
-+	/* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
-+	IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
-+	/* 0 - Lsc; 1 - Input correction; 2 - X2b */
-+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
-+	/* 0 - Lsc; 1 - X2b; 2 - Input correction */
-+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
-+	/* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
-+	IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
-+	/* 0 - Lsc; 1 - Dpc; 2 - X2b */
-+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
-+	/* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
-+	IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
-+	/* 0 - to Dol mux; 1 - to Dol */
-+	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
-+	/* 0 - Main input; 1 - Dol */
-+	IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
-+	/* Blockers */
-+	/* ISA input correction Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
-+	/* AWB Mux input correction Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
-+	/* AE Mux input correction Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
-+	/* AF Mux input correction Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
-+	/* AWB Mux B2B Mux Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
-+	/* AE Mux B2B Mux Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
-+	/* AF Mux B2B Mux Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
-+	/* PAF stream sync configuration */
-+	IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
-+	/* Paf Mux gddpc Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
-+	/* Paf Mux input isa Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
-+	/* Paf Mux X2B Port block */
-+	IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
-+	/* SIS A port block */
-+	IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
-+	/* SIS B port block */
-+	IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
-+	/* Lsc mux Input Corr demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+	/* Dpc mux Lsc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+	/* Dpc mux Lsc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
-+	/* Dpc mux X2b demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
-+	/* Dpc mux Lsc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
-+	/* Lsc mux X2b demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
-+	/* X2b mux Lsc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
-+	/* X2b mux Dpc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
-+	/* X2b mux Input Corr demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
-+	/* B2b mux Lsc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
-+	/* B2b mux X2b demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
-+	/* B2b mux Dpc demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
-+	/* B2b B2b mux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
-+	/* Stat B2b mux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
-+	/* Stat Input correction mux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
-+	/* ISA Orig B2b port block */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
-+	/* B2r B2b port block */
-+	IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
-+	/* ISA Scaled A Out R2i port block */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
-+	/* ISA Scaled B Out R2i port block */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
-+	/* ISA Full Out R2i port block */
-+	IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
-+	/* Main input Dol demux port block */
-+	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
-+	/* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
-+	IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
-+	IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
-+};
-+
-+enum ipu_device_gp_isa_runtime_mux_id {
-+	/* frame dim */
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
-+	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
-+	IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
-+};
-+
-+/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
-+#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
-+
-+#endif /* __IPU_DEVICE_GP_DEVICES_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
-new file mode 100644
-index 000000000000..4c756f1ffb24
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
-@@ -0,0 +1,328 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __MATH_SUPPORT_H
-+#define __MATH_SUPPORT_H
-+
-+#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
-+#include "type_support.h"
-+#include "assert_support.h"
-+
-+/* in case we have min/max/MIN/MAX macro's undefine them */
-+#ifdef min
-+#undef min
-+#endif
-+#ifdef max
-+#undef max
-+#endif
-+#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
-+#undef MIN
-+#endif
-+#ifdef MAX
-+#undef MAX
-+#endif
-+
-+#ifndef INT8_MIN
-+#define INT8_MIN        (-127 - 1)
-+#endif
-+
-+#ifndef INT8_MAX
-+#define INT8_MAX        (127)
-+#endif
-+
-+#ifndef UINT8_MAX
-+#define UINT8_MAX       (0xffUL)
-+#endif
-+
-+#ifndef UINT16_MAX
-+#define UINT16_MAX       (0xffffUL)
-+#endif
-+
-+#ifndef UINT32_MAX
-+#define UINT32_MAX       (0xffffffffUL)
-+#endif
-+
-+#define IS_ODD(a) ((a) & 0x1)
-+#define IS_EVEN(a) (!IS_ODD(a))
-+#define IS_POWER2(a) (!((a)&((a)-1)))
-+#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
-+#define IS_MASK_BITS_SET(a, b)	((a & b) != 0)
-+
-+/*To Find next power of 2 number from x */
-+#define bit2(x)            ((x)      | ((x) >> 1))
-+#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
-+#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
-+#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
-+#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
-+#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
-+
-+/* force a value to a lower even value */
-+#define EVEN_FLOOR(x)	((x) & ~1UL)
-+
-+/* A => B */
-+#define IMPLIES(a, b) (!(a) || (b))
-+
-+/* The ORIG_BITS th bit is the sign bit */
-+/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
-+/* By type casting it can relimited to any valid type-size
-+ * (32-bit signed or 16-bit or 8-bit)
-+ */
-+/* By masking it can be transformed to any arbitrary bit size */
-+#define SIGN_EXTEND(VAL, ORIG_BITS) \
-+((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
-+
-+#define EXTRACT_BIT(a, b)	((a >> b) & 1)
-+
-+/* for preprocessor and array sizing use MIN and MAX
-+   otherwise use min and max */
-+#define MAX(a, b)		(((a) > (b)) ? (a) : (b))
-+#define MIN(a, b)		(((a) < (b)) ? (a) : (b))
-+#define CLIP(a, b, c)		MIN((MAX((a), (b))), (c))
-+/* Integer round-down division of a with b */
-+#define FLOOR_DIV(a, b)		((b) ? ((a) / (b)) : 0)
-+/* Align a to the lower multiple of b */
-+#define FLOOR_MUL(a, b)		(FLOOR_DIV(a, b) * (b))
-+/* Integer round-up division of a with b */
-+#define CEIL_DIV(a, b)		((b) ? (((a) + (b) - 1) / (b)) : 0)
-+/* Align a to the upper multiple of b */
-+#define CEIL_MUL(a, b)		(CEIL_DIV(a, b) * (b))
-+/* Align a to the upper multiple of b - fast implementation
-+ * for cases when b=pow(2,n)
-+ */
-+#define CEIL_MUL2(a, b)		(((a) + (b) - 1) & ~((b) - 1))
-+/* integer round-up division of a with pow(2,b) */
-+#define CEIL_SHIFT(a, b)	(((a) + (1UL << (b)) - 1) >> (b))
-+/* Align a to the upper multiple of pow(2,b) */
-+#define CEIL_SHIFT_MUL(a, b)	(CEIL_SHIFT(a, b) << (b))
-+/* Absolute difference of a and b */
-+#define ABS_DIF(a, b)		(((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
-+#define ABS(a) ABS_DIF(a, 0)
-+/* Square of x */
-+#define SQR(x)			((x)*(x))
-+/* Integer round-half-down division of a nad b */
-+#define ROUND_HALF_DOWN_DIV(a, b)	((b) ? ((a) + (b / 2) - 1) / (b) : 0)
-+/* Align a to the round-half-down multiple of b */
-+#define ROUND_HALF_DOWN_MUL(a, b)	(ROUND_HALF_DOWN_DIV(a, b) * (b))
-+
-+#define MAX3(a, b, c)		MAX((a), MAX((b), (c)))
-+#define MIN3(a, b, c)		MIN((a), MIN((b), (c)))
-+#define MAX4(a, b, c, d)	MAX((MAX((a), (b))), (MAX((c), (d))))
-+#define MIN4(a, b, c, d)	MIN((MIN((a), (b))), (MIN((c), (d))))
-+
-+/* min and max should not be macros as they will evaluate their arguments twice.
-+   if you really need a macro (e.g. for CPP or for initializing an array)
-+   use MIN() and MAX(), otherwise use min() and max() */
-+
-+#ifndef ARRAY_SIZE
-+#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
-+#endif
-+
-+#ifndef BYTES
-+#define BYTES(bit) (((bit)+7)/8)
-+#endif
-+
-+#if !defined(PIPE_GENERATION)
-+STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
-+{
-+	return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
-+}
-+STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
-+{
-+	return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
-+}
-+STORAGE_CLASS_INLINE int max(int a, int b)
-+{
-+	return MAX(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int min(int a, int b)
-+{
-+	return MIN(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int clip(int a, int b, int c)
-+{
-+	return min(max(a, b), c);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
-+{
-+	return MAX(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
-+{
-+	return MIN(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
-+					unsigned int c)
-+{
-+	return umin(umax(a, b), c);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
-+{
-+	return CEIL_DIV(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
-+{
-+	return CEIL_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
-+{
-+	return CEIL_MUL2(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
-+{
-+	return CEIL_SHIFT(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
-+{
-+	return CEIL_SHIFT_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE int abs_dif(int a, int b)
-+{
-+	return ABS_DIF(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
-+{
-+	return ABS_DIF(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
-+		unsigned int b)
-+{
-+	return ROUND_HALF_DOWN_DIV(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
-+		unsigned int b)
-+{
-+	return ROUND_HALF_DOWN_MUL(a, b);
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
-+{
-+	unsigned int retval = 0;
-+
-+	if (IS_POWER2(a)) {
-+		retval =  (unsigned int)a;
-+	} else {
-+		unsigned int v = a;
-+
-+		v |= v>>1;
-+		v |= v>>2;
-+		v |= v>>4;
-+		v |= v>>8;
-+		v |= v>>16;
-+		retval =  (unsigned int)(v+1);
-+	}
-+	return retval;
-+}
-+
-+STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
-+{
-+	static const uint8_t de_bruijn[] = {
-+		0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
-+		8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
-+	};
-+	uint32_t v = a;
-+
-+	v |= v>>1;
-+	v |= v>>2;
-+	v |= v>>4;
-+	v |= v>>8;
-+	v |= v>>16;
-+	return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
-+}
-+
-+/* Divide by small power of two */
-+STORAGE_CLASS_INLINE unsigned int
-+udiv2_small_i(uint32_t a, uint32_t b)
-+{
-+	assert(b <= 2);
-+	return a >> (b-1);
-+}
-+
-+/* optimized divide for small results
-+ * a will be divided by b
-+ * outbits is the number of bits needed for the result
-+ * the smaller the cheaper the function will be.
-+ * if the result doesn't fit in the number of output bits
-+ * the result is incorrect and the function will assert
-+ */
-+STORAGE_CLASS_INLINE unsigned int
-+udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
-+{
-+	int bit;
-+	unsigned res = 0;
-+	unsigned mask;
-+
-+#ifdef VOLCANO
-+#pragma ipu unroll
-+#endif
-+	for (bit = outbits-1 ; bit >= 0; bit--) {
-+		mask = 1<<bit;
-+		if (a >= (b<<bit)) {
-+			res |= mask; /* set the bit */
-+			a = a - (b<<bit);
-+		}
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+	}
-+	/* check if the remainder is smaller than the divisor.
-+	 * if not we didn't produce enough output bits
-+	 */
-+	assert(a < b);
-+	return res;
-+}
-+
-+#if !defined(__VIED_CELL)
-+/*
-+ * For SP and ISP, SDK provides the definition of OP_std_modadd.
-+ * We need it only for host
-+ */
-+STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
-+{
-+	return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
-+}
-+
-+/*
-+ * For SP and ISP, SDK provides the definition of OP_asp_slor.
-+ * We need it only for host
-+ */
-+STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
-+{
-+	return ((a << c) | b);
-+}
-+#else
-+#include "hive/customops.h"
-+#endif /* !defined(__VIED_CELL) */
-+
-+#endif /* !defined(PIPE_GENERATION) */
-+#if !defined(__KERNEL__)
-+#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
-+#endif /* !defined(__KERNEL__) */
-+
-+#endif /* __MATH_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
-new file mode 100644
-index 000000000000..1d6c2c6e765e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __MISC_SUPPORT_H
-+#define __MISC_SUPPORT_H
-+
-+/* suppress compiler warnings on unused variables */
-+#ifndef NOT_USED
-+#define NOT_USED(a) ((void)(a))
-+#endif
-+
-+/* Calculate the  total bytes for pow(2) byte alignment */
-+#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
-+	((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
-+
-+/* Display the macro value given a string */
-+#define _STR(x) #x
-+#define STR(x) _STR(x)
-+
-+/* Concatenate */
-+#ifndef CAT /* also defined in <hive/attributes.h> */
-+#define _CAT(a, b)	a ## b
-+#define CAT(a, b)	_CAT(a, b)
-+#endif
-+
-+#define _CAT3(a, b, c)	a ## b ## c
-+#define CAT3(a, b, c)	_CAT3(a, b, c)
-+
-+/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
-+#ifndef __HIVECC
-+#ifndef NO_HOIST
-+#define NO_HOIST
-+#endif
-+#ifndef NO_CSE
-+#define NO_CSE
-+#endif
-+#ifndef NO_ALIAS
-+#define NO_ALIAS
-+#endif
-+#endif
-+
-+enum hive_method_id {
-+	HIVE_METHOD_ID_CRUN,
-+	HIVE_METHOD_ID_UNSCHED,
-+	HIVE_METHOD_ID_SCHED,
-+	HIVE_METHOD_ID_TARGET
-+};
-+
-+/* Derive METHOD */
-+#if defined(C_RUN)
-+	#define HIVE_METHOD "crun"
-+	#define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
-+#elif defined(HRT_UNSCHED)
-+	#define HIVE_METHOD "unsched"
-+	#define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
-+#elif defined(HRT_SCHED)
-+	#define HIVE_METHOD "sched"
-+	#define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
-+#else
-+	#define HIVE_METHOD "target"
-+	#define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
-+	#define HRT_TARGET 1
-+#endif
-+
-+#endif /* __MISC_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
-new file mode 100644
-index 000000000000..4f3b03093984
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
-+#define __PG_CONTROL_INIT_FRAMEWORK_H
-+
-+#include <type_support.h>
-+#include <ia_css_psys_process_types.h>
-+#include <ia_css_terminal_types.h>
-+#include <ia_css_kernel_user_param_types.h>
-+
-+#pragma GCC visibility push(default)
-+
-+enum pg_control_init_ret_type {
-+	PG_CONTROL_INIT_SUCCESS  = 0,
-+	PG_CONTROL_INIT_FAILURE = (1 << 0)
-+};
-+
-+/*
-+ * @brief  Fill the program control init desc.
-+ *
-+ * @param[in]  process_group Process group.
-+ * @param[out] terminal      Program control init terminal.
-+ *
-+ * @retval  0  Successful.
-+ * @retval  1  Error.
-+ */
-+
-+int pg_control_init_terminal_init(
-+		ia_css_process_group_t *process_group,
-+		ia_css_program_control_init_terminal_t *terminal);
-+
-+/**
-+ * @brief  Fill the program control init payload.
-+ *
-+ * @param[in]  process_group    Process group.
-+ * @param[in]  params           Kernel user parameters object.
-+ * @param[in]  payload_address  Host address in payload.
-+ *
-+ * @retval 0   Successful.
-+ * @retval 1  Error.
-+ */
-+
-+int pg_control_init_fill_payload(
-+	const ia_css_process_group_t *process_group,
-+	const ia_css_kernel_user_param_t *params,
-+	void *payload_address);
-+
-+/**
-+ * @brief  Get the payload size
-+ *
-+ * @param[in]   process_group Process group
-+ * @param[out]  payload_size  Payload size to be allocated for the process.
-+ *
-+ * @retval 0   Successful.
-+ * @retval 1  Error.
-+ */
-+
-+int pg_control_init_get_payload_size(
-+	const ia_css_process_group_t *process_group,
-+	unsigned int *payload_size);
-+
-+#pragma GCC visibility pop
-+
-+#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
-new file mode 100644
-index 000000000000..e8146f385362
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
-@@ -0,0 +1,194 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PLATFORM_SUPPORT_H
-+#define __PLATFORM_SUPPORT_H
-+
-+#include "storage_class.h"
-+
-+#define MSEC_IN_SEC 1000
-+#define NSEC_IN_MSEC 1000000
-+
-+#define NUM_SLEEP_MSEC_WA_XTENSA 1
-+
-+#if defined(_MSC_VER)
-+#include <string.h>
-+
-+#define IA_CSS_EXTERN
-+#define SYNC_WITH(x)
-+#define CSS_ALIGN(d, a) _declspec(align(a)) d
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	/* Placeholder for driver team*/
-+}
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+	/* Placeholder for driver team*/
-+	(void)delay_time_ms;
-+}
-+
-+#elif defined(__HIVECC)
-+#include <string.h>
-+#include <hive/support.h>
-+#include <hive/attributes.h>
-+
-+#define IA_CSS_EXTERN extern
-+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	OP___schedule();
-+}
-+
-+#elif defined(__KERNEL__)
-+#include <linux/string.h>
-+#include <linux/delay.h>
-+
-+#define IA_CSS_EXTERN
-+#define CSS_ALIGN(d, a) d __aligned(a)
-+
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	usleep_range(1, 50);
-+}
-+#elif defined(__XTENSA_FW__)
-+
-+#include <hive/support.h>
-+
-+#define ALIAS_ATTR(target) __attribute__((alias(#target)))
-+#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
-+
-+#elif defined(__GNUC__)
-+#include <string.h>
-+
-+#define IA_CSS_EXTERN
-+#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
-+
-+/* Define some __HIVECC specific macros to nothing to allow host code compilation */
-+#ifndef NO_ALIAS
-+#define NO_ALIAS
-+#endif
-+
-+#ifndef SYNC_WITH
-+#define SYNC_WITH(x)
-+#endif
-+
-+#if defined(HRT_CSIM)
-+#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	/* For the SDK still using hrt_sleep */
-+	hrt_sleep();
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+	/* For the SDK still using hrt_sleep */
-+	unsigned int long i = 0;
-+
-+	for (i = 0; i < delay_time_ms; i++) {
-+		hrt_sleep();
-+	}
-+}
-+#elif defined(__XTENSA_FW__) /* XTENSA FW */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	/* do nothing */
-+}
-+#elif defined(IPUSIM_SLEEP)
-+#include "hrt/host.h"
-+#include "misc_support.h" /* for NOT_USED macro */
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	hrt_sleep();
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+	/* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
-+	 * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
-+	 * This is because ia_css_sleep_msec is used thousands of times (BUG).
-+	 * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
-+	 */
-+	NOT_USED(delay_time_ms);
-+	hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
-+}
-+#else
-+#include <time.h>
-+STORAGE_CLASS_INLINE void ia_css_sleep(void)
-+{
-+	struct timespec delay_time;
-+
-+	delay_time.tv_sec = 0;
-+	delay_time.tv_nsec = 10;
-+	nanosleep(&delay_time, NULL);
-+}
-+STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
-+{
-+	struct timespec delay_time;
-+
-+	if (delay_time_ms >= MSEC_IN_SEC) {
-+		delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
-+		delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
-+	} else {
-+		delay_time.tv_sec = 0;
-+		delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
-+	}
-+	nanosleep(&delay_time, NULL);
-+}
-+#endif
-+
-+#else
-+
-+#if defined(__XTENSA_FW__)
-+
-+#define CSS_ALIGN(d, a) d
-+
-+#define ia_css_sleep()
-+
-+#if defined(__XTENSA_EL__)
-+#define __IEEE_LITTLE_ENDIAN
-+#else
-+#define __IEEE_BIG_ENDIAN
-+#endif
-+
-+#endif
-+#include <string.h>
-+#endif
-+
-+/*needed for the include in stdint.h for various environments */
-+#include "type_support.h"
-+#include "storage_class.h"
-+
-+#define MAX_ALIGNMENT			8
-+#define aligned_uint8(type, obj)	CSS_ALIGN(uint8_t obj, 1)
-+#define aligned_int8(type, obj)		CSS_ALIGN(int8_t obj, 1)
-+#define aligned_uint16(type, obj)	CSS_ALIGN(uint16_t obj, 2)
-+#define aligned_int16(type, obj)	CSS_ALIGN(int16_t obj, 2)
-+#define aligned_uint32(type, obj)	CSS_ALIGN(uint32_t obj, 4)
-+#define aligned_int32(type, obj)	CSS_ALIGN(int32_t obj, 4)
-+
-+/* needed as long as hivecc does not define the type (u)int64_t */
-+#if defined(__HIVECC)
-+#define aligned_uint64(type, obj)	CSS_ALIGN(unsigned long long obj, 8)
-+#define aligned_int64(type, obj)	CSS_ALIGN(signed long long obj, 8)
-+#else
-+#define aligned_uint64(type, obj)	CSS_ALIGN(uint64_t obj, 8)
-+#define aligned_int64(type, obj)	CSS_ALIGN(int64_t obj, 8)
-+#endif
-+#define aligned_enum(enum_type, obj)	CSS_ALIGN(uint32_t obj, 4)
-+#define aligned_struct(struct_type, obj)	struct_type obj
-+
-+#endif /* __PLATFORM_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
-new file mode 100644
-index 000000000000..b36b67e5030a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PRINT_SUPPORT_H
-+#define __PRINT_SUPPORT_H
-+
-+#if defined(_MSC_VER)
-+#ifdef _KERNEL_MODE
-+
-+/* TODO: Windows driver team to provide tracing mechanism for kernel mode
-+ * e.g. DbgPrint and DbgPrintEx
-+ */
-+extern void FwTracePrintPWARN(const char *fmt, ...);
-+extern void FwTracePrintPRINT(const char *fmt, ...);
-+extern void FwTracePrintPERROR(const char *fmt, ...);
-+extern void FwTracePrintPDEBUG(const char *fmt, ...);
-+extern void FwTracePrintPFATAL(const char *fmt, ...);
-+
-+#define PWARN(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
-+#define PWARNING(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
-+#define PRINT(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PINFO(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PERROR(format, ...)	FwTracePrintPERROR(format, __VA_ARGS__)
-+#define PDEBUG(format, ...)	FwTracePrintPDEBUG(format, __VA_ARGS__)
-+#define PVERBOSE(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
-+#define PFATAL(format, ...)	FwTracePrintPFATAL(format, __VA_ARGS__)
-+
-+#else
-+/* Windows usermode compilation */
-+#include <stdio.h>
-+
-+/* To change the defines below, communicate with Windows team first
-+ * to ensure they will not get flooded with prints
-+ */
-+/* This is temporary workaround to avoid flooding userspace
-+ * Windows driver with prints
-+ */
-+
-+#define PWARN(format, ...)
-+#define PWARNING(format, ...)
-+#define PRINT(format, ...)
-+#define PINFO(format, ...)
-+#define PERROR(format, ...)	printf("error: " format, __VA_ARGS__)
-+#define PDEBUG(format, ...)
-+#define PVERBOSE(format, ...)
-+#define PFATAL(format, ...)
-+
-+#endif /* _KERNEL_MODE */
-+#elif defined(__HIVECC)
-+#include <hive/support.h>
-+/* To be revised
-+
-+#define PWARN(format)
-+#define PRINT(format)				OP___printstring(format)
-+#define PERROR(variable)			OP___dump(9999, arguments)
-+#define PDEBUG(variable)			OP___dump(__LINE__, arguments)
-+
-+*/
-+
-+#define PRINTSTRING(str) OP___printstring(str)
-+
-+#elif defined(__KERNEL__)
-+#include <linux/kernel.h>
-+#include <linux/printk.h>
-+
-+#define PWARN(format, arguments...)	pr_debug(format, ##arguments)
-+#define PRINT(format, arguments...)	pr_debug(format, ##arguments)
-+#define PERROR(format, arguments...)	pr_debug(format, ##arguments)
-+#define PDEBUG(format, arguments...)	pr_debug(format, ##arguments)
-+
-+#elif defined(__XTENSA_FW__)
-+
-+#include "print_support_xtensa.h"
-+
-+#elif defined(XTENSA_HOST)
-+
-+#include "print_support_xtensa.h"
-+
-+#else
-+
-+#include <stdio.h>
-+
-+#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
-+
-+/** WA_1507432540 - Limit prints to PERROR only
-+ * Workaround to avoid flooding host with prints.
-+ */
-+#ifdef HOST_LOGLEVEL_ERROR_ONLY
-+
-+/* The trailing "" allows the edge case of printing single string */
-+#define PWARN(...)
-+#define PRINT(...)
-+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
-+#define PDEBUG(...)
-+
-+#else
-+
-+/* The trailing "" allows the edge case of printing single string */
-+#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
-+#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
-+#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
-+#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
-+
-+#endif
-+#define PRINTSTRING(str) PRINT(str)
-+
-+#endif
-+#endif /* __PRINT_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
-new file mode 100644
-index 000000000000..7c1279347537
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
-@@ -0,0 +1,504 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
-+#define __PSYS_SYSTEM_GLOBAL_IMPL_H
-+
-+#include <vied_nci_psys_system_global.h>
-+
-+#include "ia_css_psys_sim_trace.h"
-+#include <assert_support.h>
-+
-+/* Use vied_bits instead, however for test purposes we uses explicit type
-+ * checking
-+ */
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bit_mask(
-+	const unsigned int						index)
-+{
-+	vied_nci_resource_bitmap_t	bit_mask = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
-+
-+	if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
-+		bit_mask = (vied_nci_resource_bitmap_t)1 << index;
-+
-+	return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask)
-+{
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
-+
-+/*
-+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+	return bitmap | bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask)
-+{
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_bitmap_clear(): enter:\n");
-+
-+/*
-+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+	return bitmap & (~bit_mask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
-+		const unsigned int position,
-+		const unsigned int size)
-+{
-+	vied_nci_resource_bitmap_t	bit_mask = 0;
-+	vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		       "vied_nci_bitfield_mask(): enter:\n");
-+
-+	if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
-+		bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
-+
-+	return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const unsigned int						index,
-+	const unsigned int						size)
-+{
-+	vied_nci_resource_bitmap_t	ret = 0;
-+	vied_nci_resource_bitmap_t	bit_mask = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		       "vied_nci_bit_mask_set_bitfield(): enter:\n");
-+
-+	bit_mask = vied_nci_bitfield_mask(index, size);
-+	ret = vied_nci_bitmap_set(bitmap, bit_mask);
-+
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask)
-+{
-+	vied_nci_resource_bitmap_t	ret = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_bitmap_set_unique(): enter:\n");
-+
-+	if ((bitmap & bit_mask) == 0)
-+		ret = bitmap | bit_mask;
-+
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const unsigned int						index)
-+{
-+	vied_nci_resource_bitmap_t	ret = 0;
-+	vied_nci_resource_bitmap_t	bit_mask;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		       "vied_nci_bit_mask_set_unique(): enter:\n");
-+
-+	bit_mask = vied_nci_bit_mask(index);
-+
-+	if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
-+		ret = bitmap | bit_mask;
-+
-+	return ret;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_empty(
-+	const vied_nci_resource_bitmap_t		bitmap)
-+{
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_bitmap_empty(): enter:\n");
-+
-+	return (bitmap == 0);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_set(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask)
-+{
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_bitmap_set(): enter:\n");
-+
-+/*
-+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+	return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bit_set_in_bitmap(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const unsigned int		index)
-+{
-+
-+	vied_nci_resource_bitmap_t bitmask;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_bit_set_in_bitmap(): enter:\n");
-+	bitmask = vied_nci_bit_mask(index);
-+	return vied_nci_is_bitmap_set(bitmap, bitmask);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_bitmap_clear(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask)
-+{
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_bitmap_clear(): enter:\n");
-+
-+/*
-+	assert(vied_nci_is_bitmap_one_hot(bit_mask));
-+*/
-+	return ((bitmap & bit_mask) == 0);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+int vied_nci_bitmap_compute_weight(
-+	const vied_nci_resource_bitmap_t		bitmap)
-+{
-+	vied_nci_resource_bitmap_t	loc_bitmap = bitmap;
-+	int	weight = 0;
-+	int	i;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_bitmap_compute_weight(): enter:\n");
-+
-+	/* Do not need the iterator "i" */
-+	for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
-+		    (loc_bitmap != 0); i++) {
-+		weight += loc_bitmap & 0x01;
-+		loc_bitmap >>= 1;
-+	}
-+
-+	return weight;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
-+	const vied_nci_resource_bitmap_t	bitmap0,
-+	const vied_nci_resource_bitmap_t	bitmap1)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_bitmap_union(): enter:\n");
-+	return (bitmap0 | bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
-+	const vied_nci_resource_bitmap_t		bitmap0,
-+	const vied_nci_resource_bitmap_t		bitmap1)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"ia_css_kernel_bitmap_intersection(): enter:\n");
-+	return (bitmap0 & bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
-+	const vied_nci_resource_bitmap_t		bitmap0,
-+	const vied_nci_resource_bitmap_t		bitmap1)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
-+	return (bitmap0 ^ bitmap1);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
-+	const vied_nci_cell_ID_t		cell_id)
-+{
-+	vied_nci_resource_bitmap_t	bit_mask = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_cell_bit_mask(): enter:\n");
-+
-+	if (cell_id < VIED_NCI_N_CELL_ID) {
-+		bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
-+	}
-+	return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
-+	const vied_nci_barrier_ID_t		barrier_id)
-+{
-+	vied_nci_resource_bitmap_t	bit_mask = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_barrier_bit_mask(): enter:\n");
-+
-+	if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
-+		bit_mask = (vied_nci_resource_bitmap_t)1 <<
-+				(barrier_id + VIED_NCI_N_CELL_ID);
-+	}
-+	return bit_mask;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
-+	const vied_nci_cell_ID_t		cell_id)
-+{
-+	vied_nci_cell_type_ID_t	cell_type = VIED_NCI_N_CELL_TYPE_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_cell_get_type(): enter:\n");
-+
-+	if (cell_id < VIED_NCI_N_CELL_ID) {
-+		cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+			"vied_nci_cell_get_type(): invalid argument\n");
-+	}
-+
-+	return cell_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
-+	const vied_nci_mem_type_ID_t		mem_type)
-+{
-+	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_ext_mem_get_id_from_type(): enter:\n");
-+
-+	if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
-+		mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+			"vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
-+	}
-+
-+	return mem_id;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
-+	const vied_nci_mem_ID_t			mem_id)
-+{
-+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_mem_get_type(): enter:\n");
-+
-+	if (mem_id < VIED_NCI_N_MEM_ID) {
-+		mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+			"vied_nci_mem_get_type(): invalid argument\n");
-+	}
-+
-+	return mem_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_mem_get_size(
-+	const vied_nci_mem_ID_t			mem_id)
-+{
-+	uint16_t	mem_size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_mem_get_size(): enter:\n");
-+
-+	if (mem_id < VIED_NCI_N_MEM_ID) {
-+		mem_size = vied_nci_mem_size[mem_id];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+			"vied_nci_mem_get_size(): invalid argument\n");
-+	}
-+
-+	return mem_size;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_dev_chn_get_size(
-+	const vied_nci_dev_chn_ID_t		dev_chn_id)
-+{
-+	uint16_t	dev_chn_size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_dev_chn_get_size(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+	if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+		dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
-+			"vied_nci_dev_chn_get_size(): invalid argument\n");
-+	}
-+#else
-+	((void)(dev_chn_id)); /* not used in ipu7 */
-+#endif
-+	return dev_chn_size;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_cell_of_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const vied_nci_cell_type_ID_t	cell_type_id)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_cell_of_type(): enter:\n");
-+
-+	return ((vied_nci_cell_get_type(cell_id) ==
-+		 cell_type_id) && (cell_type_id !=
-+		 VIED_NCI_N_CELL_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_mem_of_type(
-+	const vied_nci_mem_ID_t			mem_id,
-+	const vied_nci_mem_type_ID_t	mem_type_id)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_mem_of_type(): enter:\n");
-+
-+	return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
-+		(mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_is_cell_mem_of_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index,
-+	const vied_nci_mem_type_ID_t	mem_type_id)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_is_cell_mem_of_type(): enter:\n");
-+
-+	return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
-+		&& (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+bool vied_nci_has_cell_mem_of_id(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const vied_nci_mem_ID_t			mem_id)
-+{
-+	uint16_t		mem_index;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_has_cell_mem_of_id(): enter:\n");
-+
-+	for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
-+		if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
-+		    (mem_id != VIED_NCI_N_MEM_ID)) {
-+			break;
-+		}
-+	}
-+
-+	return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+uint16_t vied_nci_cell_get_mem_count(
-+	const vied_nci_cell_ID_t		cell_id)
-+{
-+	uint16_t	mem_count = 0;
-+	vied_nci_cell_type_ID_t	cell_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_cell_get_mem_count(): enter:\n");
-+
-+	cell_type = vied_nci_cell_get_type(cell_id);
-+
-+	if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
-+		mem_count = vied_nci_N_cell_mem[cell_type];
-+
-+	return mem_count;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index)
-+{
-+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_cell_get_mem_type(): enter:\n");
-+
-+	if ((cell_id < VIED_NCI_N_CELL_ID) &&
-+	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
-+				vied_nci_cell_get_type(cell_id)][mem_index]);
-+	}
-+
-+	return mem_type;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_ID_t vied_nci_cell_get_mem(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index)
-+{
-+	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		"vied_nci_cell_get_mem(): enter:\n");
-+
-+	if ((cell_id < VIED_NCI_N_CELL_ID) &&
-+	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+		mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
-+	}
-+
-+	return mem_id;
-+}
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_C
-+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
-+	const vied_nci_cell_type_ID_t	cell_type_id,
-+	const uint16_t					mem_index)
-+{
-+	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
-+		       "vied_nci_cell_type_get_mem_type(): enter:\n");
-+
-+	if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
-+			&& (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
-+		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
-+	}
-+
-+	return mem_type;
-+}
-+
-+#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
-new file mode 100644
-index 000000000000..aeb9ffb3b367
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __STORAGE_CLASS_H
-+#define __STORAGE_CLASS_H
-+
-+#define STORAGE_CLASS_EXTERN \
-+extern
-+
-+#if defined(_MSC_VER)
-+#define STORAGE_CLASS_INLINE \
-+static __inline
-+#elif defined(__HIVECC)
-+#define STORAGE_CLASS_INLINE \
-+static inline
-+#elif defined(__XTENSA_FW__)
-+#include "storage_class_xtensa.h"
-+#else
-+#define STORAGE_CLASS_INLINE \
-+static inline
-+#endif
-+
-+/* Register struct */
-+#ifndef __register
-+#if defined(__HIVECC) && !defined(PIPE_GENERATION)
-+#define __register register
-+#else
-+#define __register
-+#endif
-+#endif
-+
-+/* Memory attribute */
-+#ifndef MEM
-+#ifdef PIPE_GENERATION
-+#elif defined(__HIVECC)
-+#include <hive/attributes.h>
-+#else
-+#define MEM(any_mem)
-+#endif
-+#endif
-+
-+#endif /* __STORAGE_CLASS_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
-new file mode 100644
-index 000000000000..4078711380ec
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
-@@ -0,0 +1,82 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __TYPE_SUPPORT_H
-+#define __TYPE_SUPPORT_H
-+
-+/* Per the DLI spec, types are in "type_support.h" and
-+ * "platform_support.h" is for unclassified/to be refactored
-+ * platform specific definitions.
-+ */
-+#define IA_CSS_UINT8_T_BITS	8
-+#define IA_CSS_UINT16_T_BITS	16
-+#define IA_CSS_UINT32_T_BITS	32
-+#define IA_CSS_INT32_T_BITS	32
-+#define IA_CSS_UINT64_T_BITS	64
-+
-+#if defined(_MSC_VER)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#if defined(_M_X64)
-+#define HOST_ADDRESS(x) (unsigned long long)(x)
-+#else
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+#endif
-+
-+#elif defined(PARAM_GENERATION)
-+/* Nothing */
-+#elif defined(__HIVECC)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+typedef long long int64_t;
-+typedef unsigned long long uint64_t;
-+
-+#elif defined(__XTENSA_FW__)
-+#include "type_support_xtensa.h"
-+#elif defined(__KERNEL__)
-+#include <linux/types.h>
-+#include <linux/limits.h>
-+
-+#define CHAR_BIT (8)
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#elif defined(__GNUC__)
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#else /* default is for the FIST environment */
-+#include <stdint.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <limits.h>
-+#define HOST_ADDRESS(x) (unsigned long)(x)
-+
-+#endif
-+#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
-+/* genpipe cannot handle the void* syntax */
-+typedef void *HANDLE;
-+#endif
-+
-+#endif /* __TYPE_SUPPORT_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
-new file mode 100644
-index 000000000000..da5866cca46b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
-+#define VIED_NCI_ACB_ROUTE_TYPE_H_
-+
-+#include "type_support.h"
-+
-+typedef enum {
-+	NCI_ACB_PORT_ISP = 0,
-+	NCI_ACB_PORT_ACC = 1,
-+	NCI_ACB_PORT_INVALID = 0xFF
-+} nci_acb_port_t;
-+
-+typedef struct {
-+	/* 0 = ISP, 1 = Acc */
-+	nci_acb_port_t in_select;
-+	/* 0 = ISP, 1 = Acc */
-+	nci_acb_port_t out_select;
-+	/* When set, Ack will be sent only when Eof arrives */
-+	uint32_t ignore_line_num;
-+	/* Fork adapter to enable streaming to both output
-+	 * (next acb out and isp out)
-+	 */
-+	uint32_t fork_acb_output;
-+} nci_acb_route_t;
-+
-+#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
-new file mode 100644
-index 000000000000..0aaa15614421
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
-@@ -0,0 +1,342 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
-+#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
-+
-+#include "type_support.h"
-+#include "storage_class.h"
-+
-+#define HAS_DFM					1
-+#define HAS_DMA_INTERNAL		0
-+#define NON_RELOC_RESOURCE_SUPPORT	1
-+#define IA_CSS_KERNEL_BITMAP_BITS 	128
-+
-+/* Defines for the routing bitmap in the program group manifest.
-+ */
-+#define VIED_NCI_RBM_MAX_MUX_COUNT			60
-+#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT		27
-+#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT		4
-+#define N_PADDING_UINT8_IN_RBM_MANIFEST			2
-+
-+/* The amount of padding bytes needed to make
-+ * ia_css_process_s/ia_css_process_ext_s/
-+ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
-+ * structures 32 bit aligned (source files have check on this)
-+ */
-+#define	N_PADDING_UINT8_IN_PROCESS_STRUCT		0
-+#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT	1
-+#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST		0
-+#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT	2
-+
-+/*
-+ * Cell IDs
-+ */
-+typedef enum {
-+	VIED_NCI_SP0_ID = 0,
-+	VIED_NCI_ISA_ICA_ID,
-+	VIED_NCI_ISA_LSC_ID,
-+	VIED_NCI_ISA_DPC_ID,
-+	VIED_NCI_ISA_B2B_ID,
-+#if defined(IPU_SYSVER_ipu6v2)
-+	VIED_NCI_ISA_B2R_R2I_SIE_ID,
-+#elif defined(IPU_SYSVER_ipu6v3) || defined(IPU_SYSVER_ipu6v4)
-+	VIED_NCI_ISA_BNLM_ID,
-+	VIED_NCI_ISA_DM_ID,
-+	VIED_NCI_ISA_R2I_SIE_ID,
-+#else
-+	#error assert 0
-+#endif
-+	VIED_NCI_ISA_R2I_DS_A_ID,
-+	VIED_NCI_ISA_R2I_DS_B_ID,
-+	VIED_NCI_ISA_AWB_ID,
-+	VIED_NCI_ISA_AE_ID,
-+	VIED_NCI_ISA_AF_ID,
-+	VIED_NCI_ISA_PAF_ID,
-+} vied_nci_cell_ID_t;
-+
-+#define VIED_NCI_N_CELL_ID (VIED_NCI_ISA_PAF_ID + 1)
-+
-+/*
-+ * In several places we don't need to size the look up tables for the full amount of cells
-+ * because they are only used for the VP and SP cells and not for the accelerator cells.
-+ * It is important that these cells are in the beginning of the LUT
-+ */
-+#define VIED_NCI_N_PROG_CELLS (VIED_NCI_SP0_ID + 1)
-+
-+/*
-+ * Barrier bits (to model process group dependencies)
-+ * todo verify that this is valid for ipu6
-+ */
-+typedef enum {
-+	VIED_NCI_BARRIER0_ID,
-+	VIED_NCI_BARRIER1_ID,
-+	VIED_NCI_BARRIER2_ID,
-+	VIED_NCI_BARRIER3_ID,
-+	VIED_NCI_BARRIER4_ID,
-+	VIED_NCI_BARRIER5_ID,
-+	VIED_NCI_BARRIER6_ID,
-+	VIED_NCI_BARRIER7_ID
-+} vied_nci_barrier_ID_t;
-+
-+#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
-+/*
-+ * Cell types
-+ */
-+typedef enum {
-+	VIED_NCI_SP_CTRL_TYPE_ID = 0,
-+	VIED_NCI_SP_SERVER_TYPE_ID,
-+	VIED_NCI_ACC_ISA_TYPE_ID,
-+	VIED_NCI_N_CELL_TYPE_ID
-+} vied_nci_cell_type_ID_t;
-+
-+/* Not used cell types */
-+#define VIED_NCI_ACC_PSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
-+#define VIED_NCI_ACC_OSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
-+#define VIED_NCI_GDC_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
-+
-+/*
-+ * Memory IDs
-+ */
-+typedef enum {
-+	VIED_NCI_TRANSFER_VMEM0_ID = 0, /* TRANSFER VMEM 0 */
-+	VIED_NCI_LB_VMEM_ID, /* LB VMEM */
-+	VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
-+	VIED_NCI_DMEM1_ID /* SPP0 Dmem */
-+} vied_nci_mem_ID_t;
-+
-+#define VIED_NCI_N_MEM_ID (VIED_NCI_DMEM1_ID + 1)
-+/*
-+ * Memory types
-+ */
-+typedef enum {
-+	VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
-+	VIED_NCI_LB_VMEM_TYPE_ID,
-+	VIED_NCI_DMEM_TYPE_ID,
-+	VIED_NCI_VMEM_TYPE_ID,
-+	VIED_NCI_BAMEM_TYPE_ID,
-+	VIED_NCI_PMEM_TYPE_ID
-+} vied_nci_mem_type_ID_t;
-+
-+#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
-+/******************************************************/
-+
-+/* Excluding PMEM */
-+#define VIED_NCI_N_DATA_MEM_TYPE_ID	 5 /* = MAX(vied_nci_mem_type_ID_t) */
-+
-+#define VIED_NCI_N_SP_CTRL_MEM		2
-+#define VIED_NCI_N_SP_SERVER_MEM	2
-+#define VIED_NCI_N_VP_MEM			0
-+#define VIED_NCI_N_ACC_PSA_MEM		0
-+#define VIED_NCI_N_ACC_ISA_MEM		0
-+#define VIED_NCI_N_ACC_OSA_MEM		0
-+#define VIED_NCI_N_GDC_MEM			0
-+#define VIED_NCI_N_TNR_MEM			0
-+
-+#define VIED_NCI_N_VP_CELL		0
-+#define VIED_NCI_N_ACC_CELL		13
-+/******************************************************/
-+/*
-+ * Device IDs
-+ */
-+typedef enum {
-+	VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0, /*DMA lb*/
-+	VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID, /*DMA hbfx*/
-+	VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID, /*DMA hbtx*/
-+	VIED_NCI_DEV_CHN_DMA_ISA_ID,
-+} vied_nci_dev_chn_ID_t;
-+
-+#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
-+
-+/*
-+ * DFM devices
-+ */
-+typedef enum {
-+	VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID = 0,
-+	VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID
-+} vied_nci_dev_dfm_id_t;
-+
-+#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID + 1)
-+
-+/*
-+ * Link IDs
-+ */
-+typedef enum {
-+	VIED_NCI_LINK_OTF_OFFLINE = 0,
-+	VIED_NCI_LINK_OTF_MAIN_OUTPUT,
-+	VIED_NCI_LINK_OTF_PDAF_OUTPUT,
-+	VIED_NCI_LINK_DATA_BARRIER_0,
-+	VIED_NCI_LINK_DATA_BARRIER_1,
-+	VIED_NCI_LINK_DATA_BARRIER_2,
-+	VIED_NCI_LINK_DATA_BARRIER_3,
-+	VIED_NCI_LINK_DATA_BARRIER_4,
-+	VIED_NCI_N_LINK_ID
-+} vied_nci_link_ID_t;
-+
-+/*
-+ * Psys server local object caches space
-+ */
-+typedef enum {
-+	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
-+	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
-+	VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
-+} vied_nci_psys_server_local_object_cache_t;
-+
-+/******************************************************/
-+/*todo verify  for ipu6*/
-+/*
-+ * Memory size (previously in vied_nci_psys_system.c)
-+ * VMEM: in words, 64 Byte per word.
-+ * TRANSFER VMEM0: in words, 64 Byte per word
-+ * LB VMEM: in words, 64 Byte per word.
-+ * DMEM: in words, 4 Byte per word.
-+ */
-+#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
-+#define VIED_NCI_LB_VMEM_WORD_SIZE     64
-+#define VIED_NCI_DMEM_WORD_SIZE      4
-+#define VIED_NCI_VMEM_WORD_SIZE     64
-+
-+/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
-+#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE	(0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
-+#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE	(0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
-+#define VIED_NCI_LB_VMEM_MAX_SIZE		(0x0400) /* LB VMEM words */
-+#define VIED_NCI_DMEM0_MAX_SIZE			(0x4000)
-+#define VIED_NCI_DMEM1_MAX_SIZE			(0x1000)
-+
-+/*
-+ * Number of channels per device
-+ */
-+/*
-+ * NOTE: once FW code will support DMA with one unit
-+ * descriptor #channels will be cut but half (36->18).
-+*/
-+
-+/* 3 defines below are inferred from pg/ipu6s_isa/src/ipu6s_isa.manifest.cpp */
-+/* plus some orbitrary number - a safety margin */
-+
-+#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE			(22)
-+#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE		(22)
-+#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE	(22)
-+
-+#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE		(0)
-+#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE		(2)
-+
-+/*
-+ * Number of ports per DFM device
-+ */
-+#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE		(32)
-+#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE		(32)
-+#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE		(32)
-+#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE		(32)
-+/******************************************************/
-+
-+/*
-+ * Storage of the resource and resource type enumerators
-+ */
-+#define VIED_NCI_RESOURCE_ID_BITS	8
-+typedef uint8_t				vied_nci_resource_id_t;
-+
-+#define VIED_NCI_RESOURCE_SIZE_BITS	16
-+typedef uint16_t			vied_nci_resource_size_t;
-+
-+#define VIED_NCI_RESOURCE_BITMAP_BITS	32
-+typedef uint32_t			vied_nci_resource_bitmap_t;
-+
-+#define IA_CSS_PROCESS_INVALID_DEPENDENCY	((vied_nci_resource_id_t)(-1))
-+#define IA_CSS_PROCESS_INVALID_OFFSET		((vied_nci_resource_size_t)(-1))
-+#define IA_CSS_PROCESS_MAX_CELLS		1
-+
-+#define IA_CSS_MAX_INPUT_DEC_RESOURCES		4
-+#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES		4
-+/*
-+ * Resource specifications
-+ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
-+ * these are called internal/external memory.
-+ */
-+
-+/* resource spec for internal (local) memory */
-+struct vied_nci_resource_spec_int_mem_s {
-+	vied_nci_resource_id_t		type_id;
-+	vied_nci_resource_size_t	size;
-+	vied_nci_resource_size_t	offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_int_mem_s
-+	vied_nci_resource_spec_int_mem_t;
-+
-+/* resource spec for external (remote) memory */
-+struct vied_nci_resource_spec_ext_mem_s {
-+	vied_nci_resource_id_t		type_id;
-+	vied_nci_resource_size_t	size;
-+	vied_nci_resource_size_t	offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_ext_mem_s
-+	vied_nci_resource_spec_ext_mem_t;
-+
-+/* resource spec for device channel */
-+struct vied_nci_resource_spec_dev_chn_s {
-+	vied_nci_resource_id_t		type_id;
-+	vied_nci_resource_size_t	size;
-+	vied_nci_resource_size_t	offset;
-+};
-+
-+typedef struct vied_nci_resource_spec_dev_chn_s
-+	vied_nci_resource_spec_dev_chn_t;
-+
-+/* resource spec for DFM port */
-+struct vied_nci_resource_spec_dfm_port_s {
-+	vied_nci_resource_id_t		type_id;
-+	vied_nci_resource_bitmap_t	bitmask;
-+};
-+
-+typedef struct vied_nci_resource_spec_dfm_port_s
-+	vied_nci_resource_spec_dfm_port_t;
-+
-+/* resource spec for all contiguous resources */
-+struct vied_nci_resource_spec_s {
-+	vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
-+	vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+	vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
-+};
-+
-+typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
-+
-+#ifndef PIPE_GENERATION
-+
-+extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
-+extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
-+extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_type_ID_t */
-+	vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_ID_t */
-+	vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint8_t /* vied_nci_mem_ID_t */
-+	vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
-+extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
-+extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
-+extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
-+extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
-+
-+STORAGE_CLASS_INLINE
-+uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+	return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
-+		(mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
-+}
-+
-+#endif /* PIPE_GENERATION */
-+#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
-new file mode 100644
-index 000000000000..d96f3605cb07
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
-@@ -0,0 +1,186 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
-+#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
-+
-+#include <type_support.h>
-+#include "ia_css_base_types.h"
-+#include "ia_css_psys_sim_storage_class.h"
-+#include "vied_nci_psys_resource_model.h"
-+
-+/*
-+ * Key system types
-+ */
-+/* Subsystem internal physical address */
-+#define VIED_ADDRESS_BITS 32
-+
-+/* typedef uint32_t vied_address_t; */
-+
-+/* Subsystem internal virtual address */
-+
-+/* Subsystem internal data bus */
-+#define VIED_DATA_BITS 32
-+typedef uint32_t vied_data_t;
-+
-+#define VIED_NULL ((vied_vaddress_t)0)
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bit_mask(
-+	const unsigned					index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_empty(
-+	const vied_nci_resource_bitmap_t		bitmap);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_set(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bit_set_in_bitmap(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const unsigned int		index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_bitmap_clear(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+int vied_nci_bitmap_compute_weight(
-+	const vied_nci_resource_bitmap_t		bitmap);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_union(
-+	const vied_nci_resource_bitmap_t		bitmap0,
-+	const vied_nci_resource_bitmap_t		bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
-+	const vied_nci_resource_bitmap_t		bitmap0,
-+	const vied_nci_resource_bitmap_t		bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
-+	const vied_nci_resource_bitmap_t		bitmap0,
-+	const vied_nci_resource_bitmap_t		bitmap1);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const vied_nci_resource_bitmap_t		bit_mask);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
-+		const unsigned int position,
-+		const unsigned int size);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
-+const vied_nci_resource_bitmap_t		bitmap,
-+const unsigned int						index,
-+const unsigned int						size);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
-+	const vied_nci_resource_bitmap_t		bitmap,
-+	const unsigned					index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
-+	const vied_nci_cell_ID_t		cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
-+	const vied_nci_barrier_ID_t		barrier_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_cell_type_ID_t vied_nci_cell_get_type(
-+	const vied_nci_cell_ID_t		cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
-+	const vied_nci_mem_type_ID_t		mem_type);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_mem_get_type(
-+	const vied_nci_mem_ID_t			mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_mem_get_size(
-+	const vied_nci_mem_ID_t			mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_dev_chn_get_size(
-+	const vied_nci_dev_chn_ID_t		dev_chn_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_cell_of_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const vied_nci_cell_type_ID_t	cell_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_mem_of_type(
-+	const vied_nci_mem_ID_t			mem_id,
-+	const vied_nci_mem_type_ID_t	mem_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_is_cell_mem_of_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index,
-+	const vied_nci_mem_type_ID_t	mem_type_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+bool vied_nci_has_cell_mem_of_id(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const vied_nci_mem_ID_t			mem_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+uint16_t vied_nci_cell_get_mem_count(
-+	const vied_nci_cell_ID_t		cell_id);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_ID_t vied_nci_cell_get_mem(
-+	const vied_nci_cell_ID_t		cell_id,
-+	const uint16_t					mem_index);
-+
-+IA_CSS_PSYS_SIM_STORAGE_CLASS_H
-+vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
-+	const vied_nci_cell_type_ID_t	cell_type_id,
-+	const uint16_t					mem_index);
-+
-+#ifdef __IA_CSS_PSYS_SIM_INLINE__
-+#include "psys_system_global_impl.h"
-+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
-+
-+#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
-new file mode 100644
-index 000000000000..191f13d8e75e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_kernel_bitmap.h>
-+#include <type_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include "math_support.h"
-+#include "ia_css_psys_kernel_trace.h"
-+
-+#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
-+#include "ia_css_kernel_bitmap_impl.h"
-+#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
-+
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
-+	ia_css_kernel_bitmap_t				bitmap,
-+	const unsigned int				elem_index,
-+	const uint32_t					elem_value)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
-+
-+	if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
-+		bitmap.data[elem_index] = elem_value;
-+	} else {
-+		assert(0);
-+	}
-+#else
-+	COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
-+
-+	bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
-+							(elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+	bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
-+#endif
-+
-+	return bitmap;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
-+	const uint64_t value)
-+{
-+	const unsigned int bits64 = sizeof(uint64_t) * 8;
-+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+	unsigned int i;
-+	ia_css_kernel_bitmap_t result;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	result = ia_css_kernel_bitmap_clear();
-+	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
-+		/* masking is done implictly, the MSB bits of casting will bel chopped off */
-+		result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
-+			(value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+	}
-+
-+#if IA_CSS_KERNEL_BITMAP_BITS < 64
-+	if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
-+			"ia_css_kernel_bitmap_create_from_uint64(): "
-+			"kernel bitmap is not wide enough to encode value\n");
-+		assert(0);
-+	}
-+#endif
-+#else
-+	NOT_USED(i);
-+	NOT_USED(nof_elems_bits64);
-+	result = value;
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+	return result;
-+}
-+
-+uint64_t ia_css_kernel_bitmap_to_uint64(
-+	const ia_css_kernel_bitmap_t value)
-+{
-+	const unsigned int bits64 = sizeof(uint64_t) * 8;
-+	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
-+	unsigned int i;
-+	uint64_t res = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
-+		"ia_css_kernel_bitmap_to_uint64(): enter:\n");
-+
-+	assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
-+	assert(nof_elems_bits64 > 0);
-+
-+#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
-+	for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
-+		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
-+	}
-+	for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
-+		assert(value.data[i] == 0);
-+	}
-+	return res;
-+#else
-+	(void)i;
-+	(void)res;
-+	(void)nof_elems_bits64;
-+	return (uint64_t)value;
-+#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
-+}
-+
-+int ia_css_kernel_bitmap_print(
-+	const ia_css_kernel_bitmap_t			bitmap,
-+	void						*fid)
-+{
-+	int retval = -1;
-+	int bit;
-+	unsigned int bit_index = 0;
-+	ia_css_kernel_bitmap_t loc_bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
-+		"ia_css_kernel_bitmap_print(): enter:\n");
-+
-+	NOT_USED(fid);
-+	NOT_USED(bit);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
-+
-+	loc_bitmap = bitmap;
-+
-+	for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
-+		!ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
-+
-+		bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
-+		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
-+		IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
-+	}
-+	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
-+
-+	retval = 0;
-+	return retval;
-+}
-+
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
-new file mode 100644
-index 000000000000..62369e7d8308
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_data_storage_class.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifdef __IA_CSS_PSYS_DATA_INLINE__
-+STORAGE_CLASS_INLINE int
-+__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __IA_CSS_PSYS_DATA_INLINE__ */
-+#include "ia_css_program_group_data_impl.h"
-+#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
-new file mode 100644
-index 000000000000..24802a648bb8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
-@@ -0,0 +1,769 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_program_group_param_private.h>
-+#include <ia_css_psys_manifest_types.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psysapi_fw_version.h>
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <assert_support.h>
-+#include <type_support.h>
-+#include <print_support.h>
-+
-+#include "ia_css_psys_param_trace.h"
-+
-+static int
-+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
-+			   uint32_t offset,
-+			   enum ia_css_frame_format_type frame_format_type);
-+
-+static int
-+ia_css_program_param_init(ia_css_program_param_t *program_param,
-+				int32_t offset);
-+
-+size_t ia_css_sizeof_program_group_param(
-+	const uint8_t program_count,
-+	const uint8_t terminal_count,
-+	const uint16_t fragment_count)
-+{
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_sizeof_program_group_param(): enter:\n");
-+
-+	verifexit(program_count != 0);
-+	verifexit(terminal_count != 0);
-+	verifexit(fragment_count != 0);
-+
-+	size += sizeof(ia_css_program_group_param_t);
-+	size += program_count * fragment_count * sizeof(ia_css_program_param_t);
-+	size += terminal_count * sizeof(ia_css_terminal_param_t);
-+EXIT:
-+	if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_sizeof_program_group_param invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+size_t ia_css_program_group_param_get_size(
-+	const ia_css_program_group_param_t		*program_group_param)
-+{
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		       "ia_css_program_group_param_get_size(): enter:\n");
-+
-+	if (program_group_param != NULL) {
-+		size = program_group_param->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+		      "ia_css_program_group_param_get_size invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+size_t ia_css_program_param_get_size(
-+	const ia_css_program_param_t			*param)
-+{
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		       "ia_css_program_param_get_size(): enter:\n");
-+
-+	if (param != NULL) {
-+		size = param->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_param_get_size invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+ia_css_program_param_t *ia_css_program_group_param_get_program_param(
-+	const ia_css_program_group_param_t *param,
-+	const int i)
-+{
-+	ia_css_program_param_t	*program_param = NULL;
-+	ia_css_program_param_t	*program_param_base;
-+	int program_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_program_group_param_get_program_param(): enter:\n");
-+
-+	verifexit(param != NULL);
-+
-+	program_count =
-+		(int)ia_css_program_group_param_get_program_count(param);
-+
-+	verifexit(i < program_count);
-+
-+	program_param_base = (ia_css_program_param_t *)
-+			(((char *)param) + param->program_param_offset);
-+
-+	program_param = &program_param_base[i];
-+
-+EXIT:
-+	if (NULL == param || i >= program_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_program_param invalid argument\n");
-+	}
-+	return program_param;
-+}
-+
-+size_t ia_css_terminal_param_get_size(
-+	const ia_css_terminal_param_t			*param)
-+{
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_get_size(): enter:\n");
-+
-+	if (param != NULL) {
-+		size = param->size;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_terminal_param_get_size invalid argument\n");
-+	}
-+
-+	return size;
-+}
-+
-+ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
-+	const ia_css_program_group_param_t		*param,
-+	const int		i)
-+{
-+	ia_css_terminal_param_t	*terminal_param = NULL;
-+	ia_css_terminal_param_t	*terminal_param_base;
-+	int program_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_program_group_param_get_terminal_param(): enter:\n");
-+
-+	verifexit(param != NULL);
-+
-+	program_count =
-+		(int)ia_css_program_group_param_get_terminal_count(param);
-+
-+	verifexit(i < program_count);
-+
-+	terminal_param_base = (ia_css_terminal_param_t *)
-+			(((char *)param) + param->terminal_param_offset);
-+	terminal_param = &terminal_param_base[i];
-+EXIT:
-+	if (NULL == param || i >= program_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_terminal_param invalid argument\n");
-+	}
-+	return terminal_param;
-+}
-+
-+uint8_t ia_css_program_group_param_get_program_count(
-+	const ia_css_program_group_param_t		*param)
-+{
-+	uint8_t	program_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_program_group_param_get_program_count(): enter:\n");
-+
-+	if (param != NULL) {
-+		program_count = param->program_count;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_program_count invalid argument\n");
-+	}
-+	return program_count;
-+}
-+
-+uint8_t ia_css_program_group_param_get_terminal_count(
-+	const ia_css_program_group_param_t		*param)
-+{
-+	uint8_t	terminal_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_program_group_param_get_terminal_count(): enter:\n");
-+
-+	if (param != NULL) {
-+		terminal_count = param->terminal_count;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_terminal_count invalid argument\n");
-+	}
-+	return terminal_count;
-+}
-+
-+uint16_t ia_css_program_group_param_get_fragment_count(
-+	const ia_css_program_group_param_t		*param)
-+{
-+	uint8_t	fragment_count = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_program_group_param_get_fragment_count(): enter:\n");
-+
-+	if (param != NULL) {
-+		fragment_count = (uint8_t)param->fragment_count;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_fragment_count invalid argument\n");
-+	}
-+	return fragment_count;
-+}
-+
-+int ia_css_program_group_param_set_protocol_version(
-+	ia_css_program_group_param_t *param,
-+	uint8_t protocol_version)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+	     "ia_css_program_group_param_set_protocol_version(): enter:\n");
-+
-+	if (param != NULL) {
-+		param->protocol_version = protocol_version;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_program_group_param_set_protocol_version failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+uint8_t ia_css_program_group_param_get_protocol_version(
-+	const ia_css_program_group_param_t *param)
-+{
-+	uint8_t protocol_version = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+	     "ia_css_program_group_param_get_protocol_version(): enter:\n");
-+
-+	if (param != NULL) {
-+		protocol_version = param->protocol_version;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_protocol_version invalid argument\n");
-+	}
-+	return protocol_version;
-+}
-+
-+int ia_css_program_group_param_set_kernel_enable_bitmap(
-+	ia_css_program_group_param_t	*param,
-+	const ia_css_kernel_bitmap_t	bitmap)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+	     "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
-+
-+	if (param != NULL) {
-+		param->kernel_enable_bitmap = bitmap;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
-+	const ia_css_program_group_param_t		*param)
-+{
-+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+	     "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
-+
-+	if (param != NULL) {
-+		bitmap = param->kernel_enable_bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+int ia_css_program_param_set_kernel_enable_bitmap(
-+	ia_css_program_param_t		*program_param,
-+	const ia_css_kernel_bitmap_t	bitmap)
-+{
-+	assert(0);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+		"ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
-+
-+	if (program_param != NULL) {
-+		program_param->kernel_enable_bitmap = bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+			"ia_css_program_param_set_kernel_enable_bitmap failed\n");
-+	}
-+	return -1;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
-+	const ia_css_program_param_t	*program_param)
-+{
-+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
-+	char *base;
-+
-+	assert(0);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
-+		"ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
-+
-+	verifexit(program_param != NULL);
-+	verifexit(program_param->parent_offset != 0);
-+
-+	base = (char *)((char *)program_param + program_param->parent_offset);
-+	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
-+EXIT:
-+	if (NULL == program_param || 0 == program_param->parent_offset)	{
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
-+	const ia_css_terminal_param_t			*param)
-+{
-+	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
-+	char *base;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
-+
-+	verifexit(param != NULL);
-+	verifexit(param->parent_offset != 0);
-+
-+	base = (char *)((char *)param + param->parent_offset);
-+	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
-+EXIT:
-+	if (NULL == param || 0 == param->parent_offset) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
-+	const ia_css_terminal_param_t	*param)
-+{
-+	ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_get_frame_format_type(): enter:\n");
-+
-+	verifexit(param != NULL);
-+
-+	ft = param->frame_format_type;
-+EXIT:
-+	if (NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_terminal_param_get_frame_format_type invalid argument\n");
-+	}
-+	return ft;
-+}
-+
-+int ia_css_terminal_param_set_frame_format_type(
-+	ia_css_terminal_param_t		*param,
-+	const ia_css_frame_format_type_t	data_format_type)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_set_frame_format_type(): enter:\n");
-+
-+	if (param != NULL) {
-+		param->frame_format_type = data_format_type;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_terminal_param_set_frame_format_type failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+uint8_t ia_css_terminal_param_get_bpp(
-+	const ia_css_terminal_param_t	*param)
-+{
-+	uint8_t bpp = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		       "ia_css_terminal_param_get_bpp(): enter:\n");
-+
-+	verifexit(param != NULL);
-+
-+	bpp = param->bpp;
-+
-+EXIT:
-+	if (NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_terminal_param_get_bpp invalid argument\n");
-+	}
-+	return bpp;
-+}
-+
-+int ia_css_terminal_param_set_bpp(
-+	ia_css_terminal_param_t	*param,
-+	const uint8_t bpp)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		       "ia_css_terminal_param_set_bpp(): enter:\n");
-+
-+	if (param != NULL) {
-+		param->bpp = bpp;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_terminal_param_set_bpp failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_terminal_param_get_dimensions(
-+	const ia_css_terminal_param_t	*param,
-+	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_get_dimensions(): enter:\n");
-+
-+	if (param != NULL) {
-+		dimensions[IA_CSS_COL_DIMENSION] =
-+			param->dimensions[IA_CSS_COL_DIMENSION];
-+		dimensions[IA_CSS_ROW_DIMENSION] =
-+			param->dimensions[IA_CSS_ROW_DIMENSION];
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+		  "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_terminal_param_set_dimensions(
-+	ia_css_terminal_param_t	*param,
-+	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		"ia_css_terminal_param_set_dimensions(): enter:\n");
-+
-+	if (param != NULL) {
-+		param->dimensions[IA_CSS_COL_DIMENSION] =
-+				dimensions[IA_CSS_COL_DIMENSION];
-+		param->dimensions[IA_CSS_ROW_DIMENSION] =
-+				dimensions[IA_CSS_ROW_DIMENSION];
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+		  "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_terminal_param_set_stride(
-+	ia_css_terminal_param_t		*param,
-+	const uint32_t stride)
-+{
-+	int retval = -1;
-+
-+	verifexit(param != NULL);
-+	param->stride = stride;
-+	retval = 0;
-+
-+EXIT:
-+	return retval;
-+}
-+
-+uint32_t ia_css_terminal_param_get_stride(
-+	const ia_css_terminal_param_t	*param)
-+{
-+	uint32_t stride = 0;
-+
-+	verifexit(param != NULL);
-+	stride = param->stride;
-+
-+EXIT:
-+	return stride;
-+}
-+
-+static int ia_css_program_param_init(
-+		ia_css_program_param_t *program_param,
-+		int32_t offset)
-+{
-+	int retval = -1;
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
-+				(CHAR_BIT * sizeof(ia_css_program_param_t)));
-+	verifexit(program_param != NULL);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		"ia_css_program_param_init(): enter:\n");
-+
-+	program_param->size = sizeof(ia_css_program_param_t);
-+	/* parent is at negative offset from current program.*/
-+	program_param->parent_offset = -offset;
-+	/*TODO: Kernel_bitmap setting. ?*/
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_program_param_init failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+static int
-+ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
-+			uint32_t offset,
-+			enum ia_css_frame_format_type frame_format_type)
-+{
-+	int retval = -1;
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_terminal_param_t)));
-+	verifexit(terminal_param != NULL);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		"ia_css_terminal_param_init(): enter:\n");
-+
-+	terminal_param->size = sizeof(ia_css_terminal_param_t);
-+	/* parent is at negative offset from current program.*/
-+	terminal_param->parent_offset = -((int32_t)offset);
-+	/*TODO: Kernel_bitmap setting. ?*/
-+	terminal_param->frame_format_type = frame_format_type;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_terminal_param_init failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+ia_css_program_group_param_t *
-+ia_css_terminal_param_get_parent(
-+	const ia_css_terminal_param_t			*param)
-+{
-+	ia_css_program_group_param_t *parent = NULL;
-+	char *base;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
-+		       "ia_css_terminal_param_get_parent(): enter:\n");
-+
-+	verifexit(NULL != param);
-+
-+	base = (char *)((char *)param + param->parent_offset);
-+
-+	parent = (ia_css_program_group_param_t *)(base);
-+EXIT:
-+	if (NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
-+			"ia_css_terminal_param_get_parent invalid argument\n");
-+	}
-+	return parent;
-+}
-+
-+int ia_css_program_group_param_init(
-+	ia_css_program_group_param_t *blob,
-+	const uint8_t	program_count,
-+	const uint8_t	terminal_count,
-+	const uint16_t	fragment_count,
-+	const enum ia_css_frame_format_type *frame_format_types)
-+{
-+	int i = 0;
-+	char *param_base;
-+	uint32_t offset;
-+	int  retval = -1;
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_program_group_param_t)));
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		"ia_css_program_group_param_init(): enter:\n");
-+
-+	assert(blob != 0);
-+
-+	verifexit(blob != NULL);
-+	verifexit(frame_format_types != NULL);
-+
-+	blob->program_count = program_count;
-+	blob->fragment_count = fragment_count;
-+	blob->terminal_count = terminal_count;
-+	blob->program_param_offset = sizeof(ia_css_program_group_param_t);
-+	blob->terminal_param_offset = blob->program_param_offset +
-+				sizeof(ia_css_program_param_t) * program_count;
-+
-+	param_base = (char *)((char *)blob + blob->program_param_offset);
-+	offset = blob->program_param_offset;
-+
-+	for (i = 0; i < program_count; i++) {
-+		ia_css_program_param_init(
-+			(ia_css_program_param_t *)param_base, offset);
-+		offset += sizeof(ia_css_program_param_t);
-+		param_base += sizeof(ia_css_program_param_t);
-+	}
-+
-+	param_base = (char *)((char *)blob + blob->terminal_param_offset);
-+	offset = blob->terminal_param_offset;
-+
-+	for (i = 0; i < terminal_count; i++) {
-+		ia_css_terminal_param_init(
-+			(ia_css_terminal_param_t *)param_base,
-+			offset,
-+			frame_format_types[i]);
-+
-+		offset += sizeof(ia_css_terminal_param_t);
-+		param_base += sizeof(ia_css_terminal_param_t);
-+	}
-+
-+	/*
-+	 * For now, set legacy flow by default. This can be removed as soon
-+	 * as all hosts/drivers explicitly set the protocol version.
-+	 */
-+	blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
-+
-+	blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
-+								terminal_count,
-+								fragment_count);
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+		       "ia_css_program_group_param_init failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_group_param_print(
-+	const ia_css_program_group_param_t		*param,
-+	void						*fid)
-+{
-+	int	retval = -1;
-+	int		i;
-+	uint8_t	program_count, terminal_count;
-+	ia_css_kernel_bitmap_t	bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		       "ia_css_program_group_param_print(): enter:\n");
-+
-+	verifexit(param != NULL);
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+		"sizeof(program_group_param) = %d\n",
-+		(int)ia_css_program_group_param_get_size(param));
-+
-+	program_count = ia_css_program_group_param_get_program_count(param);
-+	terminal_count = ia_css_program_group_param_get_terminal_count(param);
-+
-+	bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+		"%d program params\n", (int)program_count);
-+	for (i = 0; i < (int)program_count; i++) {
-+		ia_css_program_param_t *program_param =
-+			ia_css_program_group_param_get_program_param(param, i);
-+
-+		retval = ia_css_program_param_print(program_param, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
-+		       (int)terminal_count);
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_param_t	*terminal_param =
-+			ia_css_program_group_param_get_terminal_param(param, i);
-+
-+		retval = ia_css_terminal_param_print(terminal_param, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+		      "ia_css_program_group_param_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_terminal_param_print(
-+	const ia_css_terminal_param_t			*param,
-+	void						*fid)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		"ia_css_terminal_param_print(): enter:\n");
-+
-+	verifexit(param != NULL);
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+		"sizeof(terminal_param) = %d\n",
-+		(int)ia_css_terminal_param_get_size(param));
-+
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
-+		"\tframe_format_type = %d\n", param->frame_format_type);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_terminal_param_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_param_print(
-+	const ia_css_program_param_t			*param,
-+	void						*fid)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
-+		"ia_css_program_param_print(): enter:\n");
-+
-+	verifexit(param != NULL);
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
-+		       (int)ia_css_program_param_get_size(param));
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
-+			"ia_css_program_param_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
-new file mode 100644
-index 000000000000..6ec87f336b86
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
-@@ -0,0 +1,1038 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_process_private_types.h"
-+#include "ia_css_program_group_param_private.h"
-+#include "math_support.h"
-+
-+/* *****************************************************
-+ * Functions to possibly inline
-+ * ******************************************************/
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/* *****************************************************
-+ * Functions not to inline and not available to firmware
-+ * ******************************************************/
-+#if !defined(__HIVECC)
-+STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
-+	const ia_css_program_manifest_t			*manifest)
-+{
-+	int i;
-+	bool requires_extension = false;
-+
-+	verifexit(manifest != NULL);
-+
-+	for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
-+		requires_extension |=
-+			(ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
-+	}
-+
-+#if HAS_DFM
-+	for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
-+		requires_extension |=
-+			(ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
-+	}
-+	for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
-+		requires_extension |=
-+			(ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
-+		requires_extension |=
-+			(ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
-+	}
-+#endif /* HAS_DFM */
-+EXIT:
-+	return requires_extension;
-+}
-+
-+size_t ia_css_sizeof_process(
-+	const ia_css_program_manifest_t			*manifest,
-+	const ia_css_program_param_t			*param)
-+{
-+	size_t	size = 0;
-+
-+	uint8_t	program_dependency_count;
-+	uint8_t terminal_dependency_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_sizeof_process(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	size += sizeof(ia_css_process_t);
-+
-+	if (ia_css_program_manifest_process_requires_extension(manifest)) {
-+		/* align start of extension to 32 bit */
-+		size = CEIL_MUL(size, sizeof(uint32_t));
-+		size += sizeof(ia_css_process_ext_t);
-+	}
-+
-+	program_dependency_count =
-+		ia_css_program_manifest_get_program_dependency_count(manifest);
-+	terminal_dependency_count =
-+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+
-+	size += program_dependency_count*sizeof(vied_nci_resource_id_t);
-+	size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
-+
-+	/* align whole structure to 32 bit */
-+	size = CEIL_MUL(size, sizeof(uint32_t));
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_sizeof_process invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+ia_css_process_t *ia_css_process_create(
-+	void					*raw_mem,
-+	const ia_css_program_manifest_t		*manifest,
-+	const ia_css_program_param_t		*param,
-+	const uint32_t				program_idx)
-+{
-+	int retval = -1, size = 0;
-+	ia_css_process_t *process = NULL;
-+	bool create_extension;
-+
-+	uint8_t	program_dependency_count;
-+	uint8_t	terminal_dependency_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_create(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+	verifexit(raw_mem != NULL);
-+
-+	process = (ia_css_process_t *)raw_mem;;
-+	verifexit(process != NULL);
-+	create_extension = ia_css_program_manifest_process_requires_extension(manifest);
-+
-+	process->state = IA_CSS_PROCESS_CREATED;
-+
-+	program_dependency_count =
-+		ia_css_program_manifest_get_program_dependency_count(manifest);
-+	terminal_dependency_count =
-+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+
-+	/* A process requires at least one input or output */
-+	verifexit((program_dependency_count +
-+		   terminal_dependency_count) != 0);
-+
-+	size += sizeof(ia_css_process_t);
-+
-+	if (create_extension == true) {
-+		/* align start of extension to 32 bit */
-+		size = CEIL_MUL(size, sizeof(uint32_t));
-+		process->process_extension_offset = (uint8_t)size;
-+		size += sizeof(ia_css_process_ext_t);
-+	} else {
-+		process->process_extension_offset = 0;
-+	}
-+	if (program_dependency_count != 0) {
-+		process->cell_dependencies_offset = (uint8_t)size;
-+		size += program_dependency_count * sizeof(vied_nci_resource_id_t);
-+	} else {
-+		process->cell_dependencies_offset = 0;
-+	}
-+	if (terminal_dependency_count != 0) {
-+		process->terminal_dependencies_offset = (uint8_t)size;;
-+		size += terminal_dependency_count * sizeof(uint8_t);
-+	} else {
-+		process->terminal_dependencies_offset = 0;
-+	}
-+
-+	/* align whole structure to 32 bit */
-+	size = CEIL_MUL(size, sizeof(uint32_t));
-+
-+	process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
-+	assert((size_t)size == process->size);
-+	/* The following assert also implies that:
-+	 * process->terminal_dependencies_offset,
-+	 * process->cell_dependencies_offset,
-+	 * process->process_extension_offset,
-+	 * are <= UINT8_MAX
-+	 */
-+	assert(size <= UINT8_MAX);
-+
-+	process->ID = ia_css_program_manifest_get_program_ID(manifest);
-+	verifexit(process->ID != 0);
-+	assert(program_idx <= UINT8_MAX);
-+	process->program_idx = program_idx;
-+
-+	process->cell_dependency_count = program_dependency_count;
-+	process->terminal_dependency_count = terminal_dependency_count;
-+
-+	process->parent_offset = 0;
-+	verifexit(ia_css_process_clear_all(process) == 0);
-+
-+	process->state = IA_CSS_PROCESS_READY;
-+	retval = 0;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
-+		(unsigned long int)process, process->ID);
-+
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_create invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_create failed (%i)\n", retval);
-+		process = ia_css_process_destroy(process);
-+	}
-+	return process;
-+}
-+
-+ia_css_process_t *ia_css_process_destroy(
-+	ia_css_process_t *process)
-+{
-+
-+	return process;
-+}
-+
-+int ia_css_process_set_cell(
-+	ia_css_process_t					*process,
-+	const vied_nci_cell_ID_t				cell_id)
-+{
-+	int	retval = -1;
-+	vied_nci_resource_bitmap_t		bit_mask;
-+	vied_nci_resource_bitmap_t		resource_bitmap;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_set_cell(): enter:\n");
-+
-+	verifexit(process != NULL);
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+	state = ia_css_process_get_state(process);
-+
-+/* Some programs are mapped on a fixed cell,
-+ * when the process group is created
-+ */
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		(parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		(parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
-+		/* If the process group has already been created, but no VP cell
-+		 * has been assigned to this process (i.e. not fixed in
-+		 * manifest), then we need to set the cell of this process
-+		 * while its parent state is READY (the ready state is set at
-+		 * the end of ia_css_process_group_create)
-+		 */
-+		(parent_state == IA_CSS_PROCESS_GROUP_READY)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+/* Some programs are mapped on a fixed cell, thus check is not secure,
-+ * but it will detect a preset, the process manager will do the secure check
-+ */
-+	verifexit(ia_css_process_get_cell(process) ==
-+		  VIED_NCI_N_CELL_ID);
-+
-+	bit_mask = vied_nci_cell_bit_mask(cell_id);
-+	resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
-+
-+	verifexit(bit_mask != 0);
-+	verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
-+
-+	ia_css_process_cells_clear(process);
-+	ia_css_process_cells_set_cell(process, 0, cell_id);
-+
-+	resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
-+
-+	retval = ia_css_process_group_set_resource_bitmap(
-+			parent, resource_bitmap);
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_cell invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_cell failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_clear_cell(
-+	ia_css_process_t *process)
-+{
-+	int	retval = -1;
-+	vied_nci_cell_ID_t				cell_id;
-+	ia_css_process_group_t			*parent;
-+	vied_nci_resource_bitmap_t		resource_bitmap;
-+	vied_nci_resource_bitmap_t		bit_mask;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_clear_cell(): enter:\n");
-+	verifexit(process != NULL);
-+
-+	cell_id = ia_css_process_get_cell(process);
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+	state = ia_css_process_get_state(process);
-+
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
-+		   || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	bit_mask = vied_nci_cell_bit_mask(cell_id);
-+	resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
-+
-+	verifexit(bit_mask != 0);
-+	verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
-+
-+	ia_css_process_cells_clear(process);
-+
-+	resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
-+
-+	retval = ia_css_process_group_set_resource_bitmap(
-+			parent, resource_bitmap);
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_clear_cell invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_clear_cell failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_set_int_mem(
-+	ia_css_process_t				*process,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			offset)
-+{
-+	(void)process;
-+	(void)mem_type_id;
-+	(void)offset;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+		"ia_css_process_set_int_mem should not be called"
-+		"(internally memory feature not used).\n");
-+	return 0;
-+}
-+
-+int ia_css_process_clear_int_mem(
-+	ia_css_process_t *process,
-+	const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+	(void)process;
-+	(void)mem_type_id;
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+		"ia_css_process_clear_int_mem should not be called"
-+		"(internally memory feature not used).\n");
-+	return 0;
-+}
-+
-+int ia_css_process_set_ext_mem(
-+	ia_css_process_t *process,
-+	const vied_nci_mem_ID_t mem_id,
-+	const vied_nci_resource_size_t offset)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t	*parent;
-+	vied_nci_cell_ID_t	cell_id;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t	state;
-+	vied_nci_mem_type_ID_t mem_type_id;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_ext_mem(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+	verifexit(process_ext != NULL);
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	cell_id = ia_css_process_get_cell(process);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+	state = ia_css_process_get_state(process);
-+
-+	/* TODO : separate process group start and run from
-+	*	  process_group_exec_cmd()
-+	*/
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	/* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
-+	* will return false on error
-+	*/
-+
-+	mem_type_id = vied_nci_mem_get_type(mem_id);
-+#ifdef HAS_PMEM
-+	if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
-+		(mem_type_id != VIED_NCI_PMEM_TYPE_ID))
-+		|| vied_nci_mem_is_ext_type(mem_type_id)) &&
-+		(mem_id < VIED_NCI_N_MEM_ID)) {
-+
-+		verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+		process_ext->ext_mem_id[mem_type_id] = mem_id;
-+		process_ext->ext_mem_offset[mem_type_id] = offset;
-+		retval = 0;
-+	}
-+#else /* not HAS_PMEM */
-+	if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
-+			|| vied_nci_mem_is_ext_type(mem_type_id)) &&
-+			(mem_id < VIED_NCI_N_MEM_ID)) {
-+
-+		verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+		process_ext->ext_mem_id[mem_type_id] = mem_id;
-+		process_ext->ext_mem_offset[mem_type_id] = offset;
-+		retval = 0;
-+	}
-+#endif /* HAS_PMEM */
-+
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_ext_mem invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_ext_mem failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_clear_ext_mem(
-+	ia_css_process_t *process,
-+	const vied_nci_mem_type_ID_t mem_type_id)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_clear_ext_mem(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return 0;
-+	}
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	state = ia_css_process_get_state(process);
-+
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+
-+	process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
-+	process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_clear_ext_mem invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_clear_ext_mem failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_set_cells_bitmap(
-+	ia_css_process_t *process,
-+	const vied_nci_resource_bitmap_t bitmap)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	int array_index = 0;
-+	int bit_index;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_cells_bitmap(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	state = ia_css_process_get_state(process);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		(parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		(parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
-+		(parent_state == IA_CSS_PROCESS_GROUP_READY)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
-+		if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
-+			verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
-+			ia_css_process_cells_set_cell(process,
-+				array_index, (vied_nci_cell_ID_t)bit_index);
-+			array_index++;
-+		}
-+	}
-+	for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
-+		ia_css_process_cells_set_cell(process,
-+			array_index, VIED_NCI_N_CELL_ID);
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_cells_bitmap invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_cells_bitmap failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+int ia_css_process_set_dev_chn(
-+	ia_css_process_t *process,
-+	const vied_nci_dev_chn_ID_t dev_chn_id,
-+	const vied_nci_resource_size_t offset)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_dev_chn(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
-+	process_ext = ia_css_process_get_extension(process);
-+	verifexit(process_ext != NULL);
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	state = ia_css_process_get_state(process);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+
-+	/* TODO : separate process group start and run from
-+	*	  process_group_exec_cmd()
-+	*/
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	process_ext->dev_chn_offset[dev_chn_id] = offset;
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_dev_chn invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+					"ia_css_process_set_dev_chn invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_clear_dev_chn(
-+	ia_css_process_t *process,
-+	const vied_nci_dev_chn_ID_t dev_chn_id)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_clear_dev_chn(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL) {
-+		return 0;
-+	}
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+	state = ia_css_process_get_state(process);
-+
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
-+		   || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
-+
-+	process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+		     "ia_css_process_clear_dev_chn invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_clear_dev_chn failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+
-+#if HAS_DFM
-+int ia_css_process_set_dfm_port_bitmap(
-+	ia_css_process_t                 *process,
-+	const vied_nci_dev_dfm_id_t      dfm_dev_id,
-+	const vied_nci_resource_bitmap_t bitmap)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_dfm_port(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL && bitmap == 0) {
-+		return 0;
-+	}
-+	verifexit(process_ext != NULL);
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	state = ia_css_process_get_state(process);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+
-+	/* TODO : separate process group start and run from
-+	*	  process_group_exec_cmd()
-+	*/
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+
-+	verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
-+	process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_dfm_port invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_set_dfm_active_port_bitmap(
-+	ia_css_process_t                 *process,
-+	const vied_nci_dev_dfm_id_t      dfm_dev_id,
-+	const vied_nci_resource_bitmap_t bitmap)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+	if (process_ext == NULL && bitmap == 0) {
-+		return 0;
-+	}
-+	verifexit(process_ext != NULL);
-+
-+	parent = ia_css_process_get_parent(process);
-+	verifexit(parent != NULL);
-+	state = ia_css_process_get_state(process);
-+
-+	parent_state = ia_css_process_group_get_state(parent);
-+
-+	/* TODO : separate process group start and run from
-+	*	  process_group_exec_cmd()
-+	*/
-+	verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
-+		   (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
-+	verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
-+	verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
-+	process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
-+	}
-+	return retval;
-+}
-+#endif /* HAS_DFM */
-+
-+int ia_css_process_clear_all(
-+	ia_css_process_t *process)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_t			*parent;
-+	ia_css_process_group_state_t	parent_state;
-+	ia_css_process_state_t			state;
-+	ia_css_process_ext_t *process_ext;
-+	int	mem_index;
-+	int	dev_chn_index;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_clear_all(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+
-+	state = ia_css_process_get_state(process);
-+
-+	parent = ia_css_process_get_parent(process);
-+	if (parent != NULL) {
-+		parent_state = ia_css_process_group_get_state(parent);
-+	} else {
-+		parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
-+	}
-+
-+/* Resource clear can only be called in excluded states contrary to set */
-+	verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
-+		   (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
-+	verifexit((state == IA_CSS_PROCESS_CREATED) ||
-+		  (state == IA_CSS_PROCESS_READY));
-+
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+	if (process_ext != NULL) {
-+		for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
-+			dev_chn_index++) {
-+			process_ext->dev_chn_offset[dev_chn_index] =
-+				IA_CSS_PROCESS_INVALID_OFFSET;
-+		}
-+	}
-+#else
-+	NOT_USED(dev_chn_index);
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+	if (process_ext != NULL) {
-+		/* No difference whether a cell_id has been set or not, clear all */
-+		for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
-+			mem_index++) {
-+			process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
-+			process_ext->ext_mem_offset[mem_index] =
-+				IA_CSS_PROCESS_INVALID_OFFSET;
-+		}
-+	}
-+
-+	ia_css_process_cells_clear(process);
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_clear_all invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_clear_all failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_acquire(
-+	ia_css_process_t *process)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_acquire(): enter:\n");
-+
-+	verifexit(process != NULL);
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_acquire invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_acquire failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_release(
-+	ia_css_process_t *process)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_release(): enter:\n");
-+
-+	verifexit(process != NULL);
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_t invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_release failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_print(const ia_css_process_t *process, void *fid)
-+{
-+	int		retval = -1;
-+	int		i, dev_chn_index;
-+	uint16_t mem_index;
-+	uint8_t	cell_dependency_count, terminal_dependency_count;
-+	ia_css_process_ext_t *process_ext;
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
-+
-+	verifexit(process != NULL);
-+	process_ext = ia_css_process_get_extension(process);
-+
-+	IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
-+	"\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
-+		(unsigned long int)process,
-+		(int)ia_css_process_get_size(process),
-+		(int)ia_css_process_get_program_idx(process),
-+		(int)ia_css_process_get_program_ID(process),
-+		(int)ia_css_process_get_state(process),
-+		(unsigned long int)ia_css_process_get_parent(process),
-+		(int)ia_css_process_get_cell(process));
-+
-+	if (process_ext != NULL) {
-+		for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
-+			mem_index++) {
-+			/* TODO: in case of an cells_bitmap = [],
-+			* vied_nci_cell_get_mem_type will return a wrong result.
-+			*/
-+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+				"\texternal index %d, type %d, id %d offset 0x%x\n",
-+				mem_index,
-+				(int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
-+								mem_index),
-+				(int)(process_ext->ext_mem_id[mem_index]),
-+				process_ext->ext_mem_offset[mem_index]);
-+		}
-+#if VIED_NCI_N_DEV_CHN_ID > 0
-+		for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
-+			dev_chn_index++) {
-+			IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+				"\tdevice channel index %d, type %d, offset 0x%x\n",
-+				dev_chn_index,
-+				(int)dev_chn_index,
-+				process_ext->dev_chn_offset[dev_chn_index]);
-+		}
-+#else
-+		NOT_USED(dev_chn_index);
-+#endif /* VIED_NCI_N_DEV_CHN_ID */
-+#if HAS_DFM
-+		for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
-+			dev_chn_index++) {
-+			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
-+				"\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
-+				dev_chn_index, dev_chn_index,
-+				process_ext->dfm_port_bitmap[dev_chn_index],
-+				process_ext->dfm_active_port_bitmap[dev_chn_index]);
-+		}
-+#endif
-+	}
-+
-+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+			"\tcells[%d] = 0x%x\n",
-+			i, ia_css_process_cells_get_cell(process, i));
-+	}
-+
-+	cell_dependency_count =
-+		ia_css_process_get_cell_dependency_count(process);
-+	if (cell_dependency_count == 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"\tcell_dependencies[%d] {};\n", cell_dependency_count);
-+	} else {
-+		vied_nci_resource_id_t cell_dependency;
-+
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"\tcell_dependencies[%d] {", cell_dependency_count);
-+		for (i = 0; i < (int)cell_dependency_count - 1; i++) {
-+			cell_dependency =
-+				ia_css_process_get_cell_dependency(process, i);
-+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+				"%4d, ", cell_dependency);
-+		}
-+		cell_dependency =
-+			ia_css_process_get_cell_dependency(process, i);
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"%4d}\n", cell_dependency);
-+		(void)cell_dependency;
-+	}
-+
-+	terminal_dependency_count =
-+		ia_css_process_get_terminal_dependency_count(process);
-+	if (terminal_dependency_count == 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"\tterminal_dependencies[%d] {};\n",
-+			terminal_dependency_count);
-+	} else {
-+		uint8_t terminal_dependency;
-+
-+		terminal_dependency_count =
-+			ia_css_process_get_terminal_dependency_count(process);
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"\tterminal_dependencies[%d] {",
-+			terminal_dependency_count);
-+		for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
-+			terminal_dependency =
-+			     ia_css_process_get_terminal_dependency(process, i);
-+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+				"%4d, ", terminal_dependency);
-+		}
-+		terminal_dependency =
-+			ia_css_process_get_terminal_dependency(process, i);
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+			"%4d}\n", terminal_dependency);
-+		(void)terminal_dependency;
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_print invalid argument process\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_set_parent(
-+	ia_css_process_t					*process,
-+	ia_css_process_group_t					*parent)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		       "ia_css_process_set_parent(): enter:\n");
-+
-+	verifexit(process != NULL);
-+	verifexit(parent != NULL);
-+
-+	process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
-+	retval = 0;
-+EXIT:
-+	if (NULL == process || NULL == parent) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_set_parent invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_set_parent failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_process_set_cell_dependency(
-+	const ia_css_process_t					*process,
-+	const unsigned int					dep_index,
-+	const vied_nci_resource_id_t				id)
-+{
-+	int retval = -1;
-+	uint8_t *process_dep_ptr;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_set_cell_dependency(): enter:\n");
-+	verifexit(process != NULL);
-+
-+	process_dep_ptr =
-+		(uint8_t *)process + process->cell_dependencies_offset +
-+			   dep_index*sizeof(vied_nci_resource_id_t);
-+
-+	*process_dep_ptr = id;
-+	retval = 0;
-+EXIT:
-+	return retval;
-+}
-+
-+int ia_css_process_set_terminal_dependency(
-+	const ia_css_process_t				*process,
-+	const unsigned int				dep_index,
-+	const vied_nci_resource_id_t		id)
-+{
-+	int retval = -1;
-+	uint8_t *terminal_dep_ptr;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_set_terminal_dependency(): enter:\n");
-+	verifexit(process != NULL);
-+	verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
-+
-+	terminal_dep_ptr =
-+		(uint8_t *)process + process->terminal_dependencies_offset +
-+			   dep_index*sizeof(uint8_t);
-+
-+	*terminal_dep_ptr = id;
-+	retval = 0;
-+EXIT:
-+	return retval;
-+}
-+
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
-new file mode 100644
-index 000000000000..f03eb53bc12f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
-@@ -0,0 +1,826 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_dynamic_trace.h"
-+#include "ia_css_program_group_param_private.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_process_group_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/* This header is need for cpu memset to 0
-+* and process groups are not created in SP
-+*/
-+#if !defined(__VIED_CELL)
-+#include "cpu_mem_support.h"
-+#endif
-+
-+/* This source file is created with the intention of sharing and
-+* compiled for host and firmware. Since there is no native 64bit
-+* data type support for firmware this wouldn't compile for SP
-+* tile. The part of the file that is not compilable are marked
-+* with the following __VIED_CELL marker and this comment. Once we
-+* come up with a solution to address this issue this will be
-+* removed.
-+*/
-+#if !defined(__VIED_CELL)
-+
-+/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
-+bool ia_css_process_group_is_program_enabled(
-+	const ia_css_program_manifest_t *program_manifest,
-+	ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+	ia_css_kernel_bitmap_t program_bitmap =
-+		ia_css_program_manifest_get_kernel_bitmap(program_manifest);
-+	ia_css_program_type_t program_type =
-+		ia_css_program_manifest_get_type(program_manifest);
-+	ia_css_kernel_bitmap_t program_enable_bitmap;
-+
-+	if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
-+				program_bitmap)) {
-+
-+		if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
-+			program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
-+			program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+			/*
-+			 * EXCLUSIVE_SUB programs are subsets of
-+			 * EXCLUSIVE_SUPER so the bits of the enable_bitmap
-+			 * that refer to those are those of their
-+			 * EXCLUSIVE_SUPER program (on which the depend) and
-+			 * not the subset that their own program_bitmap has
-+			 */
-+			if (program_type ==
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
-+					program_type ==
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+				ia_css_kernel_bitmap_t super_program_bitmap;
-+
-+				const ia_css_program_group_manifest_t *
-+					prog_group_manifest =
-+			ia_css_program_manifest_get_parent(program_manifest);
-+				uint8_t super_prog_idx =
-+				ia_css_program_manifest_get_program_dependency(
-+						program_manifest, 0);
-+				const ia_css_program_manifest_t	*
-+					super_program_manifest =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+					prog_group_manifest, super_prog_idx);
-+
-+				verifexit(super_program_manifest != NULL);
-+				if (((program_type ==
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+					(ia_css_program_manifest_get_type(
-+					super_program_manifest) !=
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
-+					|| ((program_type ==
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
-+					(ia_css_program_manifest_get_type(
-+					super_program_manifest) !=
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
-+					IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+						"ia_css_process_group_is_program_enabled(): Error\n");
-+					verifexit(0);
-+				}
-+
-+				super_program_bitmap =
-+				ia_css_program_manifest_get_kernel_bitmap(
-+						super_program_manifest);
-+				program_enable_bitmap =
-+					ia_css_kernel_bitmap_intersection(
-+						enable_bitmap,
-+						super_program_bitmap);
-+			} else {
-+				program_enable_bitmap =
-+					ia_css_kernel_bitmap_intersection(
-+						enable_bitmap, program_bitmap);
-+			}
-+
-+			if (ia_css_is_kernel_bitmap_equal(
-+				program_enable_bitmap, program_bitmap)) {
-+				return true;
-+			}
-+		} else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
-+			/*
-+			 * Virtual super programs are not selectable
-+			 * only the virtual sub programs
-+			 */
-+			return false;
-+		} else {
-+			return true;
-+		}
-+	}
-+
-+EXIT:
-+	return false;
-+}
-+
-+size_t ia_css_sizeof_process_group(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	size_t size = 0, tmp_size;
-+	int i, error_val = -1;
-+	uint8_t	process_count, process_num;
-+	uint8_t terminal_count;
-+	ia_css_kernel_bitmap_t enable_bitmap;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_sizeof_process_group(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_process_group_t)));
-+
-+	COMPILATION_ERROR_IF(0 !=
-+			sizeof(ia_css_process_group_t) % sizeof(uint64_t));
-+
-+	process_count =
-+		ia_css_process_group_compute_process_count(manifest, param);
-+	terminal_count =
-+		ia_css_process_group_compute_terminal_count(manifest, param);
-+
-+	verifexit(process_count != 0);
-+	verifexit(terminal_count != 0);
-+
-+	size += sizeof(ia_css_process_group_t);
-+
-+	tmp_size = process_count * sizeof(uint16_t);
-+	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
-+
-+	tmp_size = terminal_count * sizeof(uint16_t);
-+	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
-+
-+	enable_bitmap =
-+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+	process_num = 0;
-+	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
-+				manifest); i++) {
-+		ia_css_program_manifest_t *program_manifest =
-+		ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
-+		ia_css_program_param_t *program_param =
-+			ia_css_program_group_param_get_program_param(param, i);
-+
-+		if (ia_css_process_group_is_program_enabled(
-+					program_manifest, enable_bitmap)) {
-+			verifexit(process_num < process_count);
-+			size += ia_css_sizeof_process(
-+					program_manifest, program_param);
-+			process_num++;
-+		}
-+	}
-+
-+	verifexit(process_num == process_count);
-+
-+	for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
-+				manifest); i++) {
-+		ia_css_terminal_manifest_t *terminal_manifest =
-+			ia_css_program_group_manifest_get_term_mnfst(
-+					manifest, i);
-+
-+		if (ia_css_process_group_is_terminal_enabled(
-+					terminal_manifest, enable_bitmap)) {
-+			size += ia_css_sizeof_terminal(
-+					terminal_manifest, param);
-+		}
-+	}
-+
-+	error_val = 0;
-+
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_sizeof_process_group invalid argument\n");
-+	}
-+	if (error_val != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_sizeof_process_group ERROR(%d)\n", error_val);
-+	}
-+	return error_val ? 0 : size;
-+}
-+
-+ia_css_process_group_t *ia_css_process_group_create(
-+	void *process_grp_mem,
-+	const ia_css_program_group_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	size_t size = ia_css_sizeof_process_group(manifest, param);
-+	int retval = -1;
-+	int ret;
-+	int i;
-+	ia_css_process_group_t *process_group = NULL;
-+	uint8_t process_count, process_num;
-+	uint8_t	terminal_count, terminal_num;
-+	uint16_t fragment_count;
-+	char *process_grp_raw_ptr;
-+	uint16_t *process_tab_ptr, *terminal_tab_ptr;
-+	ia_css_kernel_bitmap_t enable_bitmap;
-+	uint8_t manifest_terminal_count;
-+
-+	IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
-+		process_grp_mem, manifest, param);
-+
-+	verifexit(process_grp_mem != NULL);
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+	verifexit(size != 0);
-+
-+	process_group = (ia_css_process_group_t	*)process_grp_mem;
-+	ia_css_cpu_mem_set_zero(process_group, size);
-+	process_grp_raw_ptr = (char *) process_group;
-+
-+	process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
-+
-+	process_group->protocol_version =
-+		ia_css_program_group_param_get_protocol_version(param);
-+
-+	fragment_count = ia_css_program_group_param_get_fragment_count(param);
-+	process_count =
-+		ia_css_process_group_compute_process_count(manifest, param);
-+	terminal_count =
-+		ia_css_process_group_compute_terminal_count(manifest, param);
-+	enable_bitmap =
-+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+	process_group->fragment_count = fragment_count;
-+	process_group->process_count = process_count;
-+	process_group->terminal_count = terminal_count;
-+	process_group->kernel_bitmap = enable_bitmap;
-+
-+	process_grp_raw_ptr += sizeof(ia_css_process_group_t);
-+	process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
-+	process_group->processes_offset =
-+		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
-+
-+	process_grp_raw_ptr += tot_bytes_for_pow2_align(
-+			sizeof(uint64_t), process_count * sizeof(uint16_t));
-+	terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
-+	process_group->terminals_offset =
-+		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
-+
-+	/* Move raw pointer to the first process */
-+	process_grp_raw_ptr += tot_bytes_for_pow2_align(
-+			sizeof(uint64_t), terminal_count * sizeof(uint16_t));
-+
-+	/* Set default */
-+	verifexit(ia_css_process_group_set_fragment_limit(
-+				process_group, fragment_count) == 0);
-+
-+	/* Set process group terminal dependency list */
-+	/* This list is used during creating the process dependency list */
-+	manifest_terminal_count =
-+		ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+	terminal_num = 0;
-+	for (i = 0; i < (int)manifest_terminal_count; i++) {
-+		ia_css_terminal_manifest_t *t_manifest =
-+			ia_css_program_group_manifest_get_term_mnfst(
-+					manifest, i);
-+
-+		verifexit(NULL != t_manifest);
-+
-+		if (ia_css_process_group_is_terminal_enabled(
-+					t_manifest, enable_bitmap)) {
-+			ia_css_terminal_t *terminal = NULL;
-+			ia_css_terminal_param_t *terminal_param =
-+				ia_css_program_group_param_get_terminal_param(
-+						param, i);
-+
-+			verifexit(NULL != terminal_param);
-+			terminal_tab_ptr[terminal_num] =
-+				(uint16_t)(process_grp_raw_ptr -
-+						(char *)process_group);
-+			terminal = ia_css_terminal_create(
-+					process_grp_raw_ptr, t_manifest,
-+					terminal_param, enable_bitmap);
-+			verifexit(terminal != NULL);
-+			verifexit((ia_css_terminal_set_parent(
-+					terminal, process_group) == 0));
-+			verifexit((ia_css_terminal_set_terminal_manifest_index(
-+					terminal, i) == 0));
-+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+				"ia_css_process_group_create: terminal_manifest_index %d\n",
-+				i);
-+
-+			process_grp_raw_ptr += ia_css_terminal_get_size(
-+							terminal);
-+			terminal_num++;
-+		} else {
-+			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
-+		}
-+	}
-+	verifexit(terminal_num == terminal_count);
-+
-+	process_num = 0;
-+	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
-+				manifest); i++) {
-+		ia_css_process_t *process = NULL;
-+		ia_css_program_manifest_t *program_manifest =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+					manifest, i);
-+		ia_css_program_param_t *program_param =
-+			ia_css_program_group_param_get_program_param(param, i);
-+		unsigned int prog_dep_index, proc_dep_index;
-+		unsigned int term_dep_index, term_index;
-+
-+		verifexit(program_manifest != 0);
-+		verifexit(program_param    != NULL);
-+
-+		if (ia_css_process_group_is_program_enabled(
-+					program_manifest, enable_bitmap)) {
-+
-+			verifexit(process_num < process_count);
-+
-+			process_tab_ptr[process_num] =
-+				(uint16_t)(process_grp_raw_ptr -
-+						(char *)process_group);
-+
-+			/* instead of using program_param,
-+			 * we can provide this directly to ia_css_process_create.
-+			 * The corresponding public setter function is deprecated and will assert
-+			 * upon use. */
-+			program_param->kernel_enable_bitmap =
-+				ia_css_kernel_bitmap_intersection(
-+						ia_css_program_manifest_get_kernel_bitmap(program_manifest),
-+						/*pg*/enable_bitmap);
-+
-+			process = ia_css_process_create(
-+					process_grp_raw_ptr,
-+					program_manifest,
-+					program_param,
-+					i);
-+			verifexit(process != NULL);
-+
-+			ia_css_process_set_parent(process, process_group);
-+			if (ia_css_has_program_manifest_fixed_cell(
-+						program_manifest)) {
-+				vied_nci_cell_ID_t cell_id =
-+					ia_css_program_manifest_get_cell_ID(
-+							program_manifest);
-+
-+				IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+					"ia_css_process_group_create: cell_id %d\n",
-+					cell_id);
-+				ia_css_process_set_cell(process, cell_id);
-+			}
-+
-+			process_grp_raw_ptr += ia_css_process_get_size(
-+					process);
-+			/*
-+			 * Set process dependencies of process derived
-+			 * from program manifest
-+			 */
-+			for (prog_dep_index = 0; prog_dep_index <
-+			ia_css_program_manifest_get_program_dependency_count(
-+				program_manifest); prog_dep_index++) {
-+				uint8_t dep_prog_idx =
-+				ia_css_program_manifest_get_program_dependency(
-+					program_manifest, prog_dep_index);
-+				const ia_css_program_manifest_t *
-+				dep_prg_manifest =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+					manifest, dep_prog_idx);
-+				ia_css_program_ID_t id =
-+				ia_css_program_manifest_get_program_ID(
-+						dep_prg_manifest);
-+
-+				verifexit(id != 0);
-+				for (proc_dep_index = 0;
-+						proc_dep_index < process_num;
-+						proc_dep_index++) {
-+					ia_css_process_t *dep_process =
-+					ia_css_process_group_get_process(
-+							process_group,
-+							proc_dep_index);
-+
-+					ia_css_process_set_cell_dependency(
-+							process,
-+							prog_dep_index, 0);
-+
-+				if (ia_css_process_get_program_ID(
-+						dep_process) == id) {
-+					ia_css_process_set_cell_dependency(
-+							process,
-+							prog_dep_index,
-+							proc_dep_index);
-+						break;
-+					}
-+				}
-+			}
-+			process_num++;
-+
-+			/*
-+			 * Set terminal dependencies of process derived
-+			 * from program manifest
-+			 */
-+			for (term_dep_index = 0; term_dep_index <
-+			ia_css_program_manifest_get_terminal_dependency_count(
-+				program_manifest); term_dep_index++) {
-+				uint8_t pm_term_index =
-+				ia_css_program_manifest_get_terminal_dependency
-+					(program_manifest, term_dep_index);
-+
-+				verifexit(pm_term_index < manifest_terminal_count);
-+				IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+					"ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
-+					term_dep_index, pm_term_index);
-+				for (term_index = 0;
-+					term_index < terminal_count;
-+					term_index++) {
-+					ia_css_terminal_t *terminal =
-+					ia_css_process_group_get_terminal(
-+							process_group,
-+							term_index);
-+
-+				if (ia_css_terminal_get_terminal_manifest_index
-+						(terminal) == pm_term_index) {
-+					ia_css_process_set_terminal_dependency(
-+							process,
-+							term_dep_index,
-+							term_index);
-+					IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
-+						"ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
-+						i, term_dep_index, term_index);
-+
-+						break;
-+					}
-+				}
-+			}
-+		}
-+	}
-+	verifexit(process_num == process_count);
-+
-+	process_group->size =
-+		(uint32_t)ia_css_sizeof_process_group(manifest, param);
-+	process_group->ID =
-+		ia_css_program_group_manifest_get_program_group_ID(manifest);
-+
-+	/* Initialize performance measurement fields to zero */
-+	process_group->pg_load_start_ts		= 0;
-+	process_group->pg_load_cycles		= 0;
-+	process_group->pg_init_cycles		= 0;
-+	process_group->pg_processing_cycles	= 0;
-+	process_group->pg_complete_cycles	= 0;
-+
-+	process_group->error_handling_enable = 0;
-+
-+	verifexit(process_group->size != 0);
-+	verifexit(process_group->ID != 0);
-+
-+	ret = ia_css_process_group_on_create(process_group, manifest, param);
-+	verifexit(ret == 0);
-+
-+	process_group->state = IA_CSS_PROCESS_GROUP_READY;
-+	retval = 0;
-+
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
-+		process_group->ID);
-+
-+EXIT:
-+	if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_create invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_create failed (%i)\n", retval);
-+		process_group = ia_css_process_group_destroy(process_group);
-+	}
-+	return process_group;
-+}
-+
-+ia_css_process_group_t *ia_css_process_group_destroy(
-+	ia_css_process_group_t *process_group)
-+{
-+	if (process_group != NULL) {
-+		ia_css_process_group_on_destroy(process_group);
-+		process_group = NULL;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_destroy invalid argument\n");
-+	}
-+	return process_group;
-+}
-+
-+int ia_css_process_group_submit(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_submit(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
-+}
-+
-+int ia_css_process_group_start(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_start(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_START);
-+}
-+
-+int ia_css_process_group_stop(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_stop(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_STOP);
-+}
-+
-+int ia_css_process_group_run(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_run(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_RUN);
-+}
-+
-+int ia_css_process_group_suspend(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_suspend(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
-+}
-+
-+int ia_css_process_group_resume(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_resume(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_RESUME);
-+}
-+
-+int ia_css_process_group_reset(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_reset(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_RESET);
-+}
-+
-+int ia_css_process_group_abort(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_abort(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_ABORT);
-+}
-+
-+int ia_css_process_group_disown(
-+	ia_css_process_group_t *process_group)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_process_group_disown(): enter:\n");
-+
-+	return ia_css_process_group_exec_cmd(process_group,
-+		IA_CSS_PROCESS_GROUP_CMD_DISOWN);
-+}
-+
-+uint64_t ia_css_process_group_get_token(
-+	ia_css_process_group_t *process_group)
-+{
-+	uint64_t token = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_token(): enter:\n");
-+
-+	verifexit(process_group != NULL);
-+
-+	token = process_group->token;
-+
-+EXIT:
-+	if (NULL == process_group) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_get_token invalid argument\n");
-+	}
-+	return token;
-+}
-+
-+int ia_css_process_group_set_token(
-+	ia_css_process_group_t *process_group,
-+	const uint64_t token)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_token(): enter:\n");
-+
-+	verifexit(process_group != NULL);
-+	verifexit(token != 0);
-+
-+	process_group->token = token;
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process_group || 0 == token) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_set_token invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_token failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+uint64_t ia_css_process_group_get_private_token(
-+	ia_css_process_group_t *process_group)
-+{
-+	uint64_t token = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_get_private_token(): enter:\n");
-+
-+	verifexit(process_group != NULL);
-+
-+	token = process_group->private_token;
-+
-+EXIT:
-+	if (NULL == process_group) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_get_private_token invalid argument\n");
-+	}
-+	return token;
-+}
-+
-+int ia_css_process_group_set_private_token(
-+	ia_css_process_group_t *process_group,
-+	const uint64_t token)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_set_private_token(): enter:\n");
-+
-+	verifexit(process_group != NULL);
-+	verifexit(token != 0);
-+
-+	process_group->private_token = token;
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == process_group || 0 == token) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_set_private_token invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_process_group_set_private_token failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+uint8_t ia_css_process_group_compute_process_count(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	uint8_t process_count = 0;
-+	ia_css_kernel_bitmap_t total_bitmap;
-+	ia_css_kernel_bitmap_t enable_bitmap;
-+	int i;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_compute_process_count(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	total_bitmap =
-+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+	enable_bitmap =
-+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
-+	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
-+
-+	for (i = 0; i <
-+		(int)ia_css_program_group_manifest_get_program_count(manifest);
-+			i++) {
-+		ia_css_program_manifest_t *program_manifest =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+					manifest, i);
-+		ia_css_kernel_bitmap_t program_bitmap =
-+			ia_css_program_manifest_get_kernel_bitmap(
-+					program_manifest);
-+		/*
-+		 * Programs can be orthogonal,
-+		 * a mutually exclusive subset,
-+		 * or a concurrent subset
-+		 */
-+		if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
-+					program_bitmap)) {
-+			ia_css_program_type_t program_type =
-+				ia_css_program_manifest_get_type(
-+						program_manifest);
-+			/*
-+			 * An exclusive subnode < exclusive supernode,
-+			 * so simply don't count it
-+			 */
-+			if (program_type !=
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
-+				program_type !=
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
-+				process_count++;
-+			}
-+		}
-+	}
-+
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_compute_process_count invalid argument\n");
-+	}
-+	return process_count;
-+}
-+
-+uint8_t ia_css_process_group_compute_terminal_count(
-+	const ia_css_program_group_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	uint8_t terminal_count = 0;
-+	ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
-+	int i;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_process_group_compute_terminal_count(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	total_bitmap =
-+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+	enable_bitmap =
-+		ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+	verifexit(ia_css_is_program_group_manifest_valid(manifest));
-+	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
-+	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
-+
-+	for (i = 0; i <
-+		(int)ia_css_program_group_manifest_get_terminal_count(
-+			manifest); i++) {
-+		ia_css_terminal_manifest_t *tmanifest =
-+			ia_css_program_group_manifest_get_term_mnfst(
-+					manifest, i);
-+
-+		if (ia_css_process_group_is_terminal_enabled(
-+					tmanifest, enable_bitmap)) {
-+			terminal_count++;
-+		}
-+	}
-+
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_process_group_compute_terminal_count invalid argument\n");
-+	}
-+	return terminal_count;
-+}
-+#endif /* !defined(__VIED_CELL) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
-new file mode 100644
-index 000000000000..7ee4448a894d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
-@@ -0,0 +1,137 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_process_group_cmd_impl.h"
-+#include "ia_css_psysapi.h"
-+#include "ia_css_psys_process.h"
-+#include "ia_css_psys_process.psys.h"
-+#include "ia_css_psys_process_group.h"
-+#include "ia_css_psys_process_group.psys.h"
-+#include "error_support.h"
-+#include "vied_nci_psys_system_global.h"
-+#include "misc_support.h"
-+
-+#include "ia_css_psys_sim_trace.h"
-+
-+/* Dummy implementation for sim */
-+int ia_css_process_group_on_create(
-+	ia_css_process_group_t					*process_group,
-+	const ia_css_program_group_manifest_t	*program_group_manifest,
-+	const ia_css_program_group_param_t		*program_group_param)
-+{
-+	NOT_USED(process_group);
-+	NOT_USED(program_group_manifest);
-+	NOT_USED(program_group_param);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
-+
-+	return 0;
-+}
-+
-+/* Dummy implementation for sim */
-+int ia_css_process_group_on_destroy(
-+	ia_css_process_group_t					*process_group)
-+{
-+	NOT_USED(process_group);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
-+
-+	return 0;
-+}
-+
-+int ia_css_process_group_exec_cmd(
-+	ia_css_process_group_t					*process_group,
-+	const ia_css_process_group_cmd_t		cmd)
-+{
-+	int	retval = -1;
-+	ia_css_process_group_state_t	state;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
-+
-+	state = ia_css_process_group_get_state(process_group);
-+
-+	verifexit(process_group != NULL);
-+	verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
-+	verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
-+
-+	switch (cmd) {
-+	case IA_CSS_PROCESS_GROUP_CMD_NOP:
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+
-+/* External resource availability checks */
-+		verifexit(ia_css_can_process_group_submit(process_group));
-+
-+		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_DETACH:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_START:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
-+
-+/* External resource state checks */
-+		verifexit(ia_css_can_process_group_start(process_group));
-+
-+		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
-+
-+		/* empty call to match API ownership change between host and firmware */
-+
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_RUN:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
-+		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_STOP:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
-+		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
-+		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_RESUME:
-+		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
-+		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_ABORT:
-+		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
-+		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
-+		break;
-+	case IA_CSS_PROCESS_GROUP_CMD_RESET:
-+/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
-+		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
-+		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
-+		break;
-+	case IA_CSS_N_PROCESS_GROUP_CMDS:	/* Fall through */
-+	default:
-+		verifexit(false);
-+		break;
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
-new file mode 100644
-index 000000000000..d67493b83832
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
-@@ -0,0 +1,1081 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_static_storage_class.h"
-+#include "ia_css_psys_program_group_manifest.h"
-+#include "ia_css_rbm_manifest.h"
-+
-+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
-+#include "vied_nci_acb_route_type.h" /* only used for printing. */
-+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_group_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/*
-+ * We need to refactor those files in order to
-+ * build in the firmware only what is needed,
-+ * switches are put current to workaround compilation problems
-+ * in the firmware (for example lack of uint64_t support)
-+ * supported in the firmware
-+ */
-+#if !defined(__HIVECC)
-+size_t ia_css_sizeof_program_group_manifest(
-+	const uint8_t program_count,
-+	const uint8_t terminal_count,
-+	const uint8_t *program_needs_extension,
-+	const uint8_t *program_dependency_count,
-+	const uint8_t *terminal_dependency_count,
-+	const ia_css_terminal_type_t *terminal_type,
-+	const uint16_t *cached_in_param_section_count,
-+	const uint16_t *cached_out_param_section_count,
-+	const uint16_t *spatial_param_section_count,
-+	const uint16_t *fragment_param_section_count,
-+	const uint16_t *sliced_param_section_count,
-+	const uint16_t *sliced_out_param_section_count,
-+	const uint16_t *kernel_fragment_seq_count,
-+	const uint16_t *progctrlinit_load_section_counts,
-+	const uint16_t *progctrlinit_connect_section_counts)
-+{
-+	size_t size = 0;
-+	int i = 0;
-+	int j = 0;
-+	int k = 0;
-+	int l = 0;
-+	int m = 0;
-+	int n = 0;
-+	int o = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_sizeof_program_group_manifest(): enter:\n");
-+
-+	verifexit(program_count != 0);
-+	verifexit(program_dependency_count != NULL);
-+	verifexit(terminal_dependency_count != NULL);
-+
-+	size += sizeof(ia_css_program_group_manifest_t);
-+
-+	/* Private payload in the program group manifest */
-+	size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
-+				sizeof(uint64_t));
-+	/* RBM manifest in the program group manifest */
-+	size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
-+				sizeof(uint64_t));
-+
-+	for (i = 0; i < (int)program_count; i++) {
-+		size += ia_css_sizeof_program_manifest(
-+				program_needs_extension[i],
-+				program_dependency_count[i],
-+				terminal_dependency_count[i]);
-+	}
-+
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		switch (terminal_type[i]) {
-+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+			size += ia_css_param_terminal_manifest_get_size(
-+					cached_in_param_section_count[j]);
-+			j++;
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+			size += ia_css_param_terminal_manifest_get_size(
-+					cached_out_param_section_count[k]);
-+			k++;
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+			size += ia_css_spatial_param_terminal_manifest_get_size(
-+					spatial_param_section_count[l]);
-+			l++;
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+			size += ia_css_program_terminal_manifest_get_size(
-+					fragment_param_section_count[m],
-+					kernel_fragment_seq_count[m]);
-+			m++;
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+			size += ia_css_program_control_init_terminal_manifest_get_size(
-+				program_count,
-+				progctrlinit_load_section_counts,
-+				progctrlinit_connect_section_counts);
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+			size += sizeof(ia_css_data_terminal_manifest_t);
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+			size += ia_css_sliced_param_terminal_manifest_get_size(
-+					sliced_param_section_count[n]);
-+			n++;
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+			size += ia_css_sliced_param_terminal_manifest_get_size(
-+				sliced_out_param_section_count[o]);
-+			o++;
-+			break;
-+		default:
-+			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+				"ia_css_sizeof_program_group_manifest invalid argument\n");
-+		}
-+	}
-+
-+EXIT:
-+	if (0 == program_count || 0 == terminal_count ||
-+		NULL == program_dependency_count ||
-+		NULL == terminal_dependency_count) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_sizeof_program_group_manifest invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+/*
-+ * Currently, the design of XNR kernel inside the *_pregdc program group,
-+ * does not fit the exact model as is being asserted on in
-+ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
-+ * Further investigation is needed to determine whether *_pregdc program group
-+ * can be canged or that the model must be changed.
-+ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
-+ * connected to the same terminal, and it allows a kernel be mapped over
-+ * multiple programs.
-+ */
-+#define USE_SIMPLIFIED_GRAPH_MODEL 1
-+
-+/*
-+ * Model and/or check refinements
-+ * - Parallel programs do not yet have mutual exclusive alternatives
-+ * - The pgram dependencies do not need to be acyclic
-+ * - Parallel programs need to have an equal kernel requirement
-+ */
-+bool ia_css_is_program_group_manifest_valid(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	int i;
-+	bool is_valid = false;
-+	uint8_t terminal_count;
-+	uint8_t program_count;
-+	ia_css_kernel_bitmap_t total_bitmap;
-+	ia_css_kernel_bitmap_t check_bitmap;
-+	ia_css_kernel_bitmap_t terminal_bitmap;
-+	/*
-+	 * Use a standard bitmap type for the minimum logic to check the DAG,
-+	 * generic functions can be used for the kernel enable bitmaps; Later
-+	 */
-+	vied_nci_resource_bitmap_t resource_bitmap;
-+	int terminal_bitmap_weight;
-+	int num_parameter_terminal_in = 0;
-+	int num_parameter_terminal_out = 0;
-+	int num_program_terminal = 0;
-+	int num_program_terminal_sequencer_info = 0;
-+	bool has_program_control_init_terminal = false;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_program_group_manifest_valid(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
-+	verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
-+	verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
-+
-+	terminal_count =
-+		ia_css_program_group_manifest_get_terminal_count(manifest);
-+	program_count =
-+		ia_css_program_group_manifest_get_program_count(manifest);
-+	total_bitmap =
-+		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+	check_bitmap = ia_css_kernel_bitmap_clear();
-+	resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
-+	terminal_bitmap = ia_css_kernel_bitmap_clear();
-+
-+	verifexit(program_count != 0);
-+	verifexit(terminal_count != 0);
-+	verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
-+	verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
-+
-+	/* Check the kernel bitmaps for terminals */
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_manifest_t *terminal_manifest_i =
-+			ia_css_program_group_manifest_get_term_mnfst(
-+				manifest, i);
-+		bool is_parameter_in =
-+			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
-+			ia_css_terminal_manifest_get_type(
-+				terminal_manifest_i));
-+		bool is_parameter_out =
-+			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
-+			ia_css_terminal_manifest_get_type(
-+				terminal_manifest_i));
-+		bool is_data =
-+			ia_css_is_terminal_manifest_data_terminal(
-+				terminal_manifest_i);
-+		bool is_program =
-+			ia_css_is_terminal_manifest_program_terminal(
-+				terminal_manifest_i);
-+		bool is_spatial_param =
-+			ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+				terminal_manifest_i);
-+		bool is_program_control_init =
-+			ia_css_is_terminal_manifest_program_control_init_terminal(
-+				terminal_manifest_i);
-+
-+		if (is_parameter_in) {
-+			num_parameter_terminal_in = is_parameter_in;
-+		} else if (is_parameter_out) {
-+			num_parameter_terminal_out = is_parameter_out;
-+		} else if (is_data) {
-+			ia_css_data_terminal_manifest_t *dterminal_manifest_i =
-+				(ia_css_data_terminal_manifest_t *)
-+				terminal_manifest_i;
-+			ia_css_kernel_bitmap_t terminal_bitmap_i =
-+				ia_css_data_terminal_manifest_get_kernel_bitmap(
-+					dterminal_manifest_i);
-+			/*
-+			 * A terminal must depend on kernels that are a subset
-+			 * of the total, correction, it can only depend on one
-+			 * kernel
-+			 */
-+			verifexit(!ia_css_is_kernel_bitmap_empty(
-+					terminal_bitmap_i));
-+			verifexit(ia_css_is_kernel_bitmap_subset(
-+					total_bitmap, terminal_bitmap_i));
-+			verifexit(ia_css_is_kernel_bitmap_onehot(
-+					terminal_bitmap_i));
-+		} else if (is_program) {
-+			verifexit(terminal_manifest_i);
-+			num_program_terminal += is_program;
-+			num_program_terminal_sequencer_info +=
-+				((ia_css_program_terminal_manifest_t *)
-+				terminal_manifest_i)->
-+			kernel_fragment_sequencer_info_manifest_info_count;
-+		} else if (is_program_control_init) {
-+			has_program_control_init_terminal = is_program_control_init;
-+		} else {
-+			const ia_css_spatial_param_terminal_manifest_t
-+				*spatial_param_man =
-+			(const ia_css_spatial_param_terminal_manifest_t *)
-+				terminal_manifest_i;
-+			verifexit(spatial_param_man);
-+			verifexit(is_spatial_param);
-+
-+			terminal_bitmap =
-+				ia_css_kernel_bitmap_set(terminal_bitmap,
-+				spatial_param_man->kernel_id);
-+			verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
-+			verifexit(ia_css_is_kernel_bitmap_subset(
-+					total_bitmap, terminal_bitmap));
-+		}
-+	}
-+
-+	/* Check the kernel bitmaps for programs */
-+	for (i = 0; i < (int)program_count; i++) {
-+		int j;
-+		ia_css_program_manifest_t *program_manifest_i =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+				manifest, i);
-+		ia_css_program_type_t program_type_i =
-+			ia_css_program_manifest_get_type(program_manifest_i);
-+		ia_css_kernel_bitmap_t program_bitmap_i =
-+			ia_css_program_manifest_get_kernel_bitmap(
-+				program_manifest_i);
-+		uint8_t program_dependency_count_i =
-+			ia_css_program_manifest_get_program_dependency_count(
-+				program_manifest_i);
-+		uint8_t terminal_dependency_count_i =
-+			ia_css_program_manifest_get_terminal_dependency_count(
-+				program_manifest_i);
-+		uint8_t program_dependency_i0 =
-+			ia_css_program_manifest_get_program_dependency(
-+				program_manifest_i, 0);
-+		bool is_sub_i =
-+			ia_css_is_program_manifest_subnode_program_type(
-+				program_manifest_i);
-+		bool is_exclusive_sub_i =
-+			(program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
-+		bool is_virtual_sub_i =
-+			(program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+		bool is_super_i =
-+			ia_css_is_program_manifest_supernode_program_type(
-+				program_manifest_i);
-+
-+		/*
-+		 * A program must have kernels that
-+		 * are a subset of the total
-+		 */
-+		verifexit(!ia_css_is_kernel_bitmap_empty(
-+				program_bitmap_i));
-+		verifexit(ia_css_is_kernel_bitmap_subset(
-+				total_bitmap, program_bitmap_i));
-+		verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
-+		verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
-+		/*
-+		 * Checks for subnodes
-+		 * - Parallel subnodes cannot depend on terminals
-+		 * - Exclusive subnodes must depend on
-+		 *   fewer terminals than the supernode
-+		 * - Subnodes only depend on a supernode of the same type
-+		 * - Must have a subset of the supernode's kernels
-+		 *   (but not equal)
-+		 * - This tests only positive cases
-+		 * Checks for singular or supernodes
-+		 * - Cannot depend on exclusive subnodes
-+		 * - No intersection between kernels
-+		 *   (too strict for multiple instances ?)
-+		 */
-+		if (is_sub_i) {
-+			/* Subnode */
-+			ia_css_program_manifest_t *program_manifest_k =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+				manifest, program_dependency_i0);
-+			ia_css_program_type_t program_type_k =
-+				ia_css_program_manifest_get_type(
-+					program_manifest_k);
-+			ia_css_kernel_bitmap_t program_bitmap_k =
-+				ia_css_program_manifest_get_kernel_bitmap(
-+					program_manifest_k);
-+
-+			verifexit(program_dependency_count_i == 1);
-+			if (is_exclusive_sub_i || is_virtual_sub_i) {
-+				verifexit(terminal_dependency_count_i <=
-+					ia_css_program_manifest_get_terminal_dependency_count(
-+						program_manifest_k));
-+			} else{
-+				verifexit(terminal_dependency_count_i == 0);
-+			}
-+			verifexit(program_type_k ==
-+				(is_exclusive_sub_i ?
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
-+				is_virtual_sub_i ?
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
-+					IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
-+			verifexit(!ia_css_is_kernel_bitmap_equal(
-+					program_bitmap_k, program_bitmap_i));
-+			verifexit(ia_css_is_kernel_bitmap_subset(
-+					program_bitmap_k, program_bitmap_i));
-+		} else {
-+			/* Singular or Supernode */
-+			int k;
-+			ia_css_kernel_bitmap_t program_bitmap_k;
-+
-+			for (k = 0; k < program_dependency_count_i; k++) {
-+				uint8_t program_dependency_k =
-+				ia_css_program_manifest_get_program_dependency(
-+					program_manifest_i, k);
-+				ia_css_program_manifest_t *program_manifest_k =
-+				ia_css_program_group_manifest_get_prgrm_mnfst(
-+				manifest, (int)program_dependency_k);
-+				ia_css_program_type_t program_type_k =
-+				ia_css_program_manifest_get_type(
-+					program_manifest_k);
-+				program_bitmap_k =
-+				ia_css_program_manifest_get_kernel_bitmap(
-+					program_manifest_k);
-+
-+				verifexit(program_dependency_k <
-+					program_count);
-+				verifexit((program_type_k !=
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+					(program_type_k !=
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
-+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+				ia_css_is_kernel_bitmap_intersection_empty(
-+					program_bitmap_i, program_bitmap_k));
-+			}
-+		}
-+
-+		/* Check for relations */
-+		for (j = 0; j < (int)program_count; j++) {
-+			int k;
-+			ia_css_program_manifest_t *program_manifest_j =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+				manifest, j);
-+			ia_css_program_type_t program_type_j =
-+			ia_css_program_manifest_get_type(program_manifest_j);
-+			ia_css_kernel_bitmap_t program_bitmap_j =
-+			ia_css_program_manifest_get_kernel_bitmap(
-+				program_manifest_j);
-+			uint8_t program_dependency_count_j =
-+			ia_css_program_manifest_get_program_dependency_count(
-+				program_manifest_j);
-+			uint8_t program_dependency_j0 =
-+			ia_css_program_manifest_get_program_dependency(
-+				program_manifest_j, 0);
-+			bool is_sub_j =
-+			ia_css_is_program_manifest_subnode_program_type(
-+				program_manifest_j);
-+			bool is_super_j =
-+			ia_css_is_program_manifest_supernode_program_type(
-+				program_manifest_j);
-+			bool is_virtual_sub_j =
-+			(program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+			bool is_j_subset_i =
-+			ia_css_is_kernel_bitmap_subset(
-+				program_bitmap_i, program_bitmap_j);
-+			bool is_i_subset_j =
-+			ia_css_is_kernel_bitmap_subset(
-+				program_bitmap_j, program_bitmap_i);
-+
-+			/* Test below would fail for i==j */
-+			if (i == j)
-+				continue;
-+
-+			/* Empty sets are always subsets, but meaningless */
-+			verifexit(!ia_css_is_kernel_bitmap_empty(
-+					program_bitmap_j));
-+
-+			/*
-+			 * Checks for mutual subnodes
-+			 * - Parallel subnodes must have an equal
-+			 *   set of kernels
-+			 * - Exclusive and virtual subnodes must
-+			 *   have an unequal set of kernels
-+			 * Checks for subnodes
-+			 * - Subnodes must have a subset of kernels
-+			 */
-+			if (((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
-+				((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
-+				((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
-+
-+				verifexit(program_dependency_count_j == 1);
-+				verifexit(program_dependency_i0 != i);
-+				verifexit(program_dependency_j0 != i);
-+
-+				if (program_dependency_i0 ==
-+					program_dependency_j0) {
-+					verifexit(is_sub_i);
-+					/*
-+					 * Subnodes are subsets,
-+					 * not for virtual nodes
-+					 */
-+					if (!is_virtual_sub_i)
-+						verifexit(
-+							((is_j_subset_i ||
-+							is_i_subset_j)));
-+					/*
-+					 * That must be equal for
-+					 * parallel subnodes,
-+					 * must be unequal for
-+					 * exlusive and virtual subnodes
-+					 */
-+					verifexit(
-+					((is_j_subset_i && is_i_subset_j) ^
-+					(is_exclusive_sub_i |
-+					is_virtual_sub_i)));
-+
-+				}
-+				if (is_j_subset_i || is_i_subset_j) {
-+					/* One being subset of the other does not necessarily mean that they are part
-+					 * of the same "cluster" (i.e. having same super dependency).
-+					 */
-+					/* verifexit(program_dependency_i0 ==
-+					 *	program_dependency_j0);
-+					 */
-+				}
-+				/* If subnodes are the same, they need different program dependency. */
-+				if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
-+					verifexit(program_dependency_i0 != program_dependency_j0);
-+				}
-+			}
-+
-+			if (((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
-+				((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
-+				((program_type_i ==
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
-+				(program_type_j ==
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
-+
-+				verifexit(program_dependency_count_j == 1);
-+				verifexit(!is_i_subset_j);
-+
-+				if (program_dependency_j0 == i) {
-+					verifexit(program_dependency_i0 !=
-+						program_dependency_j0);
-+					verifexit(is_super_i);
-+					verifexit(is_j_subset_i);
-+
-+				}
-+				if (is_j_subset_i) {
-+					/* verifexit(program_dependency_j0 == i); */
-+					/* A sub that is subset of a super, is not necessarily dependent to it. */
-+				}
-+			}
-+
-+			/*
-+			 * Checks for dependent nodes
-+			 * - Cannot depend on exclusive subnodes
-+			 * - No intersection between kernels
-+			 *   (too strict for multiple instances ?)
-+			 *   unless a subnode
-+			 */
-+			for (k = 0; k < (int)program_dependency_count_j; k++) {
-+				uint8_t program_dependency_k =
-+				ia_css_program_manifest_get_program_dependency(
-+					program_manifest_j, k);
-+
-+				verifexit((program_dependency_k <
-+					program_count));
-+				if (program_dependency_k == i) {
-+					/* program[j] depends on program[i] */
-+					verifexit((i != j));
-+					verifexit((program_type_i !=
-+					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+					(program_type_i !=
-+					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
-+					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+				(ia_css_is_kernel_bitmap_intersection_empty(
-+				program_bitmap_i, program_bitmap_j) ^ is_sub_j));
-+				}
-+			}
-+
-+			/*
-+			 * Checks for supernodes and subnodes
-+			 * - Detect nodes that kernel-wise are subsets,
-+			 *   but not connected to the correct supernode
-+			 * - We do not (yet) detect if programs properly
-+			 *   depend on all parallel nodes
-+			 */
-+			if (!ia_css_is_kernel_bitmap_intersection_empty(
-+				program_bitmap_i, program_bitmap_j)) {
-+				/*
-+				 * This test will pass if
-+				 * the program manifest is NULL,
-+				 * but that's no concern here
-+				 */
-+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+			!ia_css_is_program_manifest_singular_program_type(
-+				program_manifest_i));
-+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+			!ia_css_is_program_manifest_singular_program_type(
-+				program_manifest_j));
-+				if (!is_virtual_sub_j)
-+					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+					(is_j_subset_i || is_i_subset_j));
-+				if (is_super_i) {
-+					/* verifexit(is_sub_j); */
-+					/* verifexit(program_dependency_j0 == i); */
-+				}
-+				if (is_super_j) {
-+					/* verifexit(is_sub_i); */
-+					/* verifexit(program_dependency_i0 == j); */
-+				}
-+				if (is_super_i && is_super_j) {
-+					/* Allow two supernodes to intersect as long as they are different */
-+					verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
-+				}
-+				/* A bitmap intersect does not necessarily need to mean super and sub. */
-+				/* A sub that intersects with a super, is not necessarily dependent to it. */
-+			}
-+		}
-+		check_bitmap = ia_css_kernel_bitmap_union(
-+					check_bitmap, program_bitmap_i);
-+		/*
-+		 * A terminal can be bound to only a single
-+		 * (of multiple concurrent) program(s),
-+		 * i.e. the one that holds the iterator to control it
-+		 * Only singular and super nodes can depend on a terminal.
-+		 * This loop accumulates all terminal
-+		 * dependencies over all programs
-+		 */
-+		for (j = 0; j < (int)terminal_dependency_count_i; j++) {
-+			uint8_t terminal_dependency =
-+			ia_css_program_manifest_get_terminal_dependency(
-+					program_manifest_i, j);
-+
-+			verifexit(terminal_dependency < terminal_count);
-+			if ((program_type_i !=
-+				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
-+				(program_type_i !=
-+				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
-+				/* If the subnode always came after the */
-+				/* supernode we could check for presence */
-+				resource_bitmap =
-+					vied_nci_bit_mask_set_unique(
-+						resource_bitmap,
-+						terminal_dependency);
-+				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+					!vied_nci_is_bitmap_empty(
-+						resource_bitmap));
-+			}
-+		}
-+	}
-+	verifexit(ia_css_is_kernel_bitmap_equal(
-+			total_bitmap, check_bitmap));
-+
-+	terminal_bitmap_weight =
-+		vied_nci_bitmap_compute_weight(resource_bitmap);
-+	verifexit(terminal_bitmap_weight >= 0);
-+	if (num_parameter_terminal_in ||
-+		num_parameter_terminal_out ||
-+		num_program_terminal ||
-+		has_program_control_init_terminal) {
-+		int skip_terminal_count = 0;
-+
-+		skip_terminal_count += num_parameter_terminal_in;
-+		skip_terminal_count += num_parameter_terminal_out;
-+		skip_terminal_count += num_program_terminal;
-+		skip_terminal_count -= num_program_terminal_sequencer_info;
-+		if (has_program_control_init_terminal) {
-+			skip_terminal_count++;
-+		}
-+		verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
-+			(terminal_bitmap_weight ==
-+			(terminal_count - skip_terminal_count)));
-+	} else
-+		verifexit((terminal_bitmap_weight == terminal_count));
-+
-+	is_valid = true;
-+EXIT:
-+	if (is_valid == false) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_is_program_group_manifest_valid: failed\n");
-+	}
-+	return is_valid;
-+}
-+
-+#if !defined(__HIVECC)
-+int ia_css_program_group_manifest_set_kernel_bitmap(
-+	ia_css_program_group_manifest_t *manifest,
-+	const ia_css_kernel_bitmap_t bitmap)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->kernel_bitmap = bitmap;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
-+	}
-+	return retval;
-+}
-+#endif
-+
-+ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
-+	const ia_css_program_group_manifest_t *manifest)
-+{
-+	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		bitmap = manifest->kernel_bitmap;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+#if !defined(__HIVECC)
-+void ia_css_program_group_manifest_init(
-+	ia_css_program_group_manifest_t *blob,
-+	const uint8_t program_count,
-+	const uint8_t terminal_count,
-+	const uint8_t *program_needs_extension,
-+	const uint8_t *program_dependencies,
-+	const uint8_t *terminal_dependencies,
-+	const ia_css_terminal_type_t *terminal_type,
-+	const uint16_t *cached_in_param_section_count,
-+	const uint16_t *cached_out_param_section_count,
-+	const uint16_t *spatial_param_section_count,
-+	const uint16_t *fragment_param_section_count,
-+	const uint16_t *sliced_in_param_section_count,
-+	const uint16_t *sliced_out_param_section_count,
-+	const uint16_t *kernel_fragment_seq_count,
-+	const uint16_t *progctrlinit_load_section_counts,
-+	const uint16_t *progctrlinit_connect_section_counts)
-+{
-+	int i = 0;
-+	int j = 0;
-+	int k = 0;
-+	int l = 0;
-+	int m = 0;
-+	int n = 0;
-+	int o = 0;
-+	int result;
-+	uint32_t offset = 0;
-+	char *prg_manifest_base, *terminal_manifest_base;
-+	size_t program_size = 0;
-+
-+	/*
-+	 * assert(blob != NULL);
-+	 */
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
-+			(CHAR_BIT * sizeof(ia_css_program_manifest_t)));
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
-+			(CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
-+
-+	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
-+	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+		"ia_css_program_group_manifest_init(): enter:\n");
-+
-+	for (i = 0; i < (int)program_count; i++) {
-+		program_size +=
-+			ia_css_sizeof_program_manifest(
-+				program_needs_extension[i],
-+				program_dependencies[i],
-+				terminal_dependencies[i]);
-+	}
-+
-+	/* A program group ID cannot be zero */
-+	blob->ID = 1;
-+	blob->program_count = program_count;
-+	blob->terminal_count = terminal_count;
-+	blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
-+	blob->terminal_manifest_offset =
-+		(uint32_t)blob->program_manifest_offset + program_size;
-+
-+	prg_manifest_base = (char *)
-+		(((char *)blob) + blob->program_manifest_offset);
-+	offset = blob->program_manifest_offset;
-+	for (i = 0; i < (int)program_count; i++) {
-+		ia_css_program_manifest_init(
-+			(ia_css_program_manifest_t *)prg_manifest_base,
-+			program_needs_extension[i],
-+			program_dependencies[i], terminal_dependencies[i]);
-+		ia_css_program_manifest_set_parent_offset(
-+			(ia_css_program_manifest_t *)prg_manifest_base, offset);
-+		program_size =
-+			ia_css_sizeof_program_manifest(
-+				program_needs_extension[i],
-+				program_dependencies[i],
-+				terminal_dependencies[i]);
-+		prg_manifest_base += program_size;
-+		offset += (uint32_t)program_size;
-+	}
-+
-+	offset = blob->terminal_manifest_offset;
-+	terminal_manifest_base = (char *) (((char *)blob) + offset);
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		size_t terminal_size = 0;
-+		ia_css_terminal_manifest_t *term_manifest =
-+			(ia_css_terminal_manifest_t *)terminal_manifest_base;
-+
-+		ia_css_terminal_manifest_set_parent_offset(
-+				(ia_css_terminal_manifest_t *)
-+				terminal_manifest_base,
-+				offset);
-+		switch (terminal_type[i]) {
-+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
-+			result = ia_css_param_terminal_manifest_init(
-+				(ia_css_param_terminal_manifest_t *)
-+				term_manifest,
-+				cached_in_param_section_count[j]);
-+			if (0 == result) {
-+				terminal_size =
-+				ia_css_param_terminal_manifest_get_size(
-+					cached_in_param_section_count[j]);
-+				j++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_param_terminal_manifest_init failed in cached in terminal\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
-+			result = ia_css_param_terminal_manifest_init(
-+				(ia_css_param_terminal_manifest_t *)
-+				term_manifest,
-+				cached_out_param_section_count[k]);
-+			if (0 == result) {
-+				terminal_size =
-+				ia_css_param_terminal_manifest_get_size(
-+					cached_out_param_section_count[k]);
-+				k++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_param_terminal_manifest_init failed\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
-+			result = ia_css_spatial_param_terminal_manifest_init(
-+				(ia_css_spatial_param_terminal_manifest_t *)
-+				term_manifest,
-+				spatial_param_section_count[l]);
-+			if (0 == result) {
-+				terminal_size =
-+			ia_css_spatial_param_terminal_manifest_get_size(
-+				spatial_param_section_count[l]);
-+				l++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PROGRAM:
-+			result = ia_css_program_terminal_manifest_init(
-+				(ia_css_program_terminal_manifest_t *)
-+				term_manifest,
-+				fragment_param_section_count[m],
-+				kernel_fragment_seq_count[m]);
-+			if (0 == result) {
-+				terminal_size =
-+				ia_css_program_terminal_manifest_get_size(
-+					fragment_param_section_count[m],
-+					kernel_fragment_seq_count[m]);
-+				m++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_program_terminal_manifest_init failed in program terminal\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
-+			result = ia_css_program_control_init_terminal_manifest_init(
-+				(ia_css_program_control_init_terminal_manifest_t *)
-+				term_manifest,
-+				program_count,
-+				progctrlinit_load_section_counts,
-+				progctrlinit_connect_section_counts);
-+			if (0 == result) {
-+				terminal_size =
-+				ia_css_program_control_init_terminal_manifest_get_size(
-+					program_count,
-+					NULL,
-+					NULL);
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_program_control_init_terminal_manifest_init failed\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_DATA_IN:
-+		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
-+			terminal_size = sizeof(ia_css_data_terminal_manifest_t);
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
-+			result = ia_css_sliced_param_terminal_manifest_init(
-+				(ia_css_sliced_param_terminal_manifest_t *)
-+				term_manifest,
-+				sliced_in_param_section_count[n]);
-+			if (0 == result) {
-+				terminal_size =
-+			ia_css_sliced_param_terminal_manifest_get_size(
-+				sliced_in_param_section_count[n]);
-+				n++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_param_terminal_manifest_init in sliced terminal failed\n");
-+			}
-+			break;
-+		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
-+			result = ia_css_sliced_param_terminal_manifest_init(
-+				(ia_css_sliced_param_terminal_manifest_t *)
-+				term_manifest,
-+				sliced_out_param_section_count[o]);
-+			if (0 == result) {
-+				terminal_size =
-+				ia_css_sliced_param_terminal_manifest_get_size(
-+					sliced_out_param_section_count[o]);
-+				n++;
-+			} else {
-+				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+					"ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
-+			}
-+			break;
-+		default:
-+			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+				"ia_css_program_group_manifest_init invalid argument\n");
-+		}
-+		term_manifest->size = (uint16_t)terminal_size;
-+		/* index: i equal to terminal ID due to sorted of the terminals array */
-+		term_manifest->ID = i;
-+		term_manifest->terminal_type = terminal_type[i];
-+		terminal_manifest_base += terminal_size;
-+		offset += (uint32_t)terminal_size;
-+	}
-+
-+	/* Set the private program group manifest blob offset */
-+	blob->private_data_offset = offset;
-+	offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
-+				sizeof(uint64_t));
-+
-+	/* Set the RBM manifest blob offset */
-+	blob->rbm_manifest_offset = offset;
-+	offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
-+				sizeof(uint64_t));
-+
-+	assert(offset <= UINT16_MAX);
-+	blob->size = (uint16_t)offset;
-+}
-+#endif
-+
-+int ia_css_program_group_manifest_print(
-+	const ia_css_program_group_manifest_t *manifest,
-+	void *fid)
-+{
-+	int retval = -1;
-+	int i;
-+	uint8_t program_count, terminal_count;
-+	ia_css_kernel_bitmap_t bitmap;
-+	struct ia_css_psys_private_pg_data *priv_data;
-+	ia_css_rbm_manifest_t *rbm_manifest;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+		"ia_css_program_group_manifest_print(): enter:\n");
-+
-+	NOT_USED(fid);
-+
-+	verifexit(manifest != NULL);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"sizeof(manifest) = %d\n",
-+		(int)ia_css_program_group_manifest_get_size(manifest));
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"alignment(manifest) = %d\n",
-+		(int)ia_css_program_group_manifest_get_alignment(manifest));
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"program group ID = %d\n",
-+		(int)ia_css_program_group_manifest_get_program_group_ID(
-+			manifest));
-+
-+	program_count =
-+		ia_css_program_group_manifest_get_program_count(manifest);
-+	terminal_count =
-+		ia_css_program_group_manifest_get_terminal_count(manifest);
-+
-+	bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
-+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"%d program manifests\n", (int)program_count);
-+	for (i = 0; i < (int)program_count; i++) {
-+		ia_css_program_manifest_t *program_manifest =
-+			ia_css_program_group_manifest_get_prgrm_mnfst(
-+				manifest, i);
-+
-+		retval = ia_css_program_manifest_print(program_manifest, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"%d terminal manifests\n", (int)terminal_count);
-+	for (i = 0; i < (int)terminal_count; i++) {
-+		ia_css_terminal_manifest_t *terminal_manifest =
-+			ia_css_program_group_manifest_get_term_mnfst(
-+				manifest, i);
-+
-+		retval = ia_css_terminal_manifest_print(
-+				terminal_manifest, fid);
-+		verifjmpexit(retval == 0);
-+	}
-+
-+	priv_data =
-+		(struct ia_css_psys_private_pg_data *)
-+		ia_css_program_group_manifest_get_private_data(manifest);
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+		"private_data_offset %d\n", manifest->private_data_offset);
-+
-+	for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+			"PSA MUX id %d mux val %d\n", i,
-+			priv_data->psa_mux_conf[i]);
-+
-+	}
-+
-+	for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+			"ISA MUX id %d mux val %d\n", i,
-+			priv_data->isa_mux_conf[i]);
-+
-+	}
-+
-+#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
-+	for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
-+
-+		if (priv_data->acb_route[i].in_select !=
-+			NCI_ACB_PORT_INVALID) {
-+
-+			assert(priv_data->acb_route[i].in_select !=
-+				NCI_ACB_PORT_INVALID &&
-+				priv_data->acb_route[i].out_select !=
-+				NCI_ACB_PORT_INVALID);
-+
-+			IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
-+				"Route Cell id %d In %d Out %d\n", i,
-+				priv_data->acb_route[i].in_select,
-+				priv_data->acb_route[i].out_select);
-+		}
-+
-+	}
-+#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
-+
-+	for (i = 0; i < MAX_INPUT_BUFFER; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
-+				priv_data->input_buffer_info[i].link_id);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
-+				priv_data->input_buffer_info[i].buffer_base_addr);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
-+				priv_data->input_buffer_info[i].bpe);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
-+				priv_data->input_buffer_info[i].buffer_width);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
-+				priv_data->input_buffer_info[i].buffer_height);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
-+				priv_data->input_buffer_info[i].num_of_buffers);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
-+				priv_data->input_buffer_info[i].dfm_port_addr);
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
-+	}
-+
-+	rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
-+	ia_css_rbm_manifest_print(rbm_manifest);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_group_manifest_print failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
-new file mode 100644
-index 000000000000..9a279b28c019
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
-@@ -0,0 +1,972 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_psys_program_manifest.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include <vied_nci_psys_system_global.h>
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_psys_static_trace.h"
-+
-+#include <error_support.h>
-+#include <misc_support.h>
-+#include <storage_class.h>
-+#include <math_support.h>
-+
-+/* *****************************************************
-+ * Functions to possibly inline
-+ * ******************************************************/
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_program_manifest_impl.h"
-+#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
-+
-+/* *****************************************************
-+ * Functions not to inline and available to firmware
-+ * ******************************************************/
-+bool ia_css_has_program_manifest_fixed_cell(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+	bool has_fixed_cell = false;
-+	vied_nci_cell_ID_t cell_id;
-+	vied_nci_cell_type_ID_t	cell_type_id;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_has_program_manifest_fixed_cell(): enter:\n");
-+
-+	verifexitval(manifest != NULL, EFAULT);
-+
-+	cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
-+	cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
-+
-+	has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
-+			  (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		   "ia_css_has_program_manifest_fixed_cell invalid argument\n");
-+		return false;
-+	}
-+	return has_fixed_cell;
-+}
-+
-+vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
-+	const ia_css_program_manifest_t			*manifest)
-+{
-+	DECLARE_ERRVAL
-+	vied_nci_resource_bitmap_t	bitmap = 0;
-+	int i = 0;
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_cells_bitmap(): enter:\n");
-+
-+	verifexitval(manifest != NULL, EFAULT);
-+
-+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
-+			bitmap |= (1 << manifest->cells[i]);
-+		}
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+	}
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
-+	}
-+	return bitmap;
-+}
-+
-+bool ia_css_is_program_manifest_subnode_program_type(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	ia_css_program_type_t		program_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_is_program_manifest_subnode_program_type(): enter:\n");
-+
-+	program_type = ia_css_program_manifest_get_type(manifest);
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
-+			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
-+			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
-+}
-+
-+bool ia_css_is_program_manifest_supernode_program_type(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	ia_css_program_type_t program_type;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+	       "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
-+
-+	program_type = ia_css_program_manifest_get_type(manifest);
-+
-+/* The error return is the limit value, so no need to check on the manifest
-+ * pointer
-+ */
-+	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
-+			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
-+			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
-+}
-+
-+vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
-+	const ia_css_program_manifest_t *manifest)
-+{
-+	DECLARE_ERRVAL
-+
-+	vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
-+	int i = 0;
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_get_cell_ID(): enter:\n");
-+
-+	verifexitval(manifest != NULL, EFAULT);
-+
-+	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
-+#ifdef __HIVECC
-+#pragma hivecc unroll
-+#endif
-+	}
-+	cell_id = manifest->cells[0];
-+EXIT:
-+	if (!noerror()) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		  "ia_css_program_manifest_get_cell_ID invalid argument\n");
-+		return VIED_NCI_N_CELL_ID;
-+	}
-+	return cell_id;
-+}
-+
-+/* *****************************************************
-+ * Functions not to inline and not available to firmware
-+ * ******************************************************/
-+#if !defined(__HIVECC)
-+size_t ia_css_sizeof_program_manifest(
-+	const uint8_t program_needs_extension,
-+	const uint8_t program_dependency_count,
-+	const uint8_t terminal_dependency_count)
-+{
-+	size_t	size = 0;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_sizeof_program_manifest(): enter:\n");
-+
-+	size += sizeof(ia_css_program_manifest_t);
-+	if (program_needs_extension == 1) {
-+		/* align manifest extension to 32 bit */
-+		size = CEIL_MUL(size, sizeof(uint32_t));
-+		size += sizeof(ia_css_program_manifest_ext_t);
-+	}
-+	size += program_dependency_count * sizeof(uint8_t);
-+	size += terminal_dependency_count * sizeof(uint8_t);
-+	/* align whole structure to 32 bit */
-+	size = ceil_mul(size, sizeof(uint32_t));
-+
-+	return size;
-+}
-+
-+int ia_css_program_manifest_set_program_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	ia_css_program_ID_t id)
-+{
-+	int ret = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_program_ID(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
-+		manifest->ID = id;
-+		ret = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+		   "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
-+	}
-+	return ret;
-+}
-+
-+int ia_css_program_manifest_set_parent_offset(
-+	ia_css_program_manifest_t	*manifest,
-+	int32_t program_offset)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_parent_offset(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	/* parent is at negative offset away from current program offset*/
-+	assert((int16_t)(-program_offset) == -program_offset);
-+	manifest->parent_offset = (int16_t)(-program_offset);
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_parent_offset failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_type(
-+	ia_css_program_manifest_t				*manifest,
-+	const ia_css_program_type_t				program_type)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_type(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
-+		manifest->program_type = (ia_css_program_type_t)program_type;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+		      "ia_css_program_manifest_set_type failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_kernel_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const ia_css_kernel_bitmap_t			kernel_bitmap)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		manifest->kernel_bitmap = kernel_bitmap;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_cell_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_cell_ID_t			cell_id)
-+{
-+	int	retval = -1;
-+	int i = 0;
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_cell_ID(): enter:\n");
-+	if (manifest != NULL) {
-+		manifest->cells[0] = cell_id;
-+		for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+			manifest->cells[i] = VIED_NCI_N_CELL_ID;
-+		}
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+		   "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_cell_type_ID(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_cell_type_ID_t			cell_type_id)
-+{
-+	int	retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_cell_type_ID(): enter:\n");
-+	if (manifest != NULL) {
-+		manifest->cell_type_id = cell_type_id;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+void ia_css_program_manifest_set_input_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                   idx,
-+	unsigned char                   val)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
-+	if (manifest != NULL) {
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+		if (manifest_ext == NULL) {
-+			return;
-+		}
-+		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
-+		manifest_ext->dec_resources_input_terminal[idx] = val;
-+#else
-+		(void) idx;
-+		(void) val;
-+#endif
-+	}
-+}
-+
-+void ia_css_program_manifest_set_output_terminal_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                    idx,
-+	unsigned char                    val)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
-+	if (manifest != NULL) {
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+		if (manifest_ext == NULL) {
-+			return;
-+		}
-+		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
-+		manifest_ext->dec_resources_output_terminal[idx] = val;
-+#else
-+		(void) idx;
-+		(void) val;
-+		(void) manifest_ext;
-+#endif
-+	}
-+}
-+
-+void ia_css_program_manifest_set_input_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                   idx,
-+	unsigned char                   val)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_input_stream_id(): enter:\n");
-+	if (manifest != NULL) {
-+#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
-+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+		if (manifest_ext == NULL) {
-+			return;
-+		}
-+		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
-+		manifest_ext->dec_resources_input[idx] = val;
-+#else
-+		(void) idx;
-+		(void) val;
-+#endif
-+	}
-+}
-+
-+void ia_css_program_manifest_set_output_stream_id(
-+	ia_css_program_manifest_t   *manifest,
-+	unsigned char                    idx,
-+	unsigned char                    val)
-+{
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_output_stream_id(): enter:\n");
-+	if (manifest != NULL) {
-+#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
-+		ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+		manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+		if (manifest_ext == NULL) {
-+			return;
-+		}
-+		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
-+		manifest_ext->dec_resources_output[idx] = val;
-+#else
-+		(void) idx;
-+		(void) val;
-+#endif
-+	}
-+}
-+
-+int ia_css_program_manifest_set_cells_bitmap(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_resource_bitmap_t	bitmap)
-+{
-+	int retval = -1;
-+	int array_index = 0;
-+	int bit_index;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
-+			if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
-+				verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
-+				manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
-+				array_index++;
-+			}
-+		}
-+		for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
-+			manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
-+		}
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
-+	}
-+EXIT:
-+	return retval;
-+}
-+
-+#if HAS_DFM
-+int ia_css_program_manifest_set_dfm_port_bitmap(
-+	ia_css_program_manifest_t            *manifest,
-+	const vied_nci_dev_dfm_id_t          dfm_type_id,
-+	const vied_nci_resource_bitmap_t     bitmap)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && bitmap == 0) {
-+		return 0;
-+	}
-+	verifexit(manifest_ext != NULL);
-+	manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
-+	retval = 0;
-+
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+				"ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_dfm_active_port_bitmap(
-+	ia_css_program_manifest_t           *manifest,
-+	const vied_nci_dev_dfm_id_t          dfm_type_id,
-+	const vied_nci_resource_bitmap_t     bitmap)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+			"ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && bitmap == 0) {
-+		return 0;
-+	}
-+	verifexit(manifest_ext != NULL);
-+	manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
-+	retval = 0;
-+
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+				"ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_is_dfm_relocatable(
-+	ia_css_program_manifest_t       *manifest,
-+	const vied_nci_dev_dfm_id_t      dfm_type_id,
-+	const uint8_t                    is_relocatable)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+			"ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL) {
-+		return 0;
-+	}
-+	manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
-+	retval = 0;
-+
-+	EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+				"ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
-+	}
-+
-+	return retval;
-+}
-+#endif /* HAS_DFM */
-+
-+int ia_css_program_manifest_set_int_mem_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			int_mem_size)
-+{
-+	(void)manifest;
-+	(void)mem_type_id;
-+	if (int_mem_size != 0) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_int_mem_size should not be called"
-+			"(internally memory feature not used).\n");
-+		return -1;
-+	}
-+	return 0;
-+}
-+
-+int ia_css_program_manifest_set_ext_mem_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			ext_mem_size)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	if (manifest == NULL) {
-+		return retval;
-+	}
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && ext_mem_size == 0) {
-+		return 0;
-+	} else if (manifest_ext == NULL) {
-+		return retval;
-+	}
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
-+
-+	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+		manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
-+	}
-+
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_ext_mem_offset(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_mem_type_ID_t			mem_type_id,
-+	const vied_nci_resource_size_t			ext_mem_offset)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	if (manifest == NULL) {
-+		return retval;
-+	}
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && ext_mem_offset ==
-+		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
-+		return 0;
-+	} else if (manifest_ext == NULL) {
-+		return retval;
-+	}
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
-+
-+	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
-+		manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
-+	}
-+
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_dev_chn_size(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t			dev_chn_id,
-+	const vied_nci_resource_size_t			dev_chn_size)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	if (manifest == NULL) {
-+		return retval;
-+	}
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && dev_chn_size == 0) {
-+		return 0;
-+	} else if (manifest_ext == NULL) {
-+		return retval;
-+	}
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+		manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
-+	}
-+#else
-+	NOT_USED(dev_chn_id);
-+#endif
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_dev_chn_offset(
-+	ia_css_program_manifest_t			*manifest,
-+	const vied_nci_dev_chn_ID_t			dev_chn_id,
-+	const vied_nci_resource_size_t			dev_chn_offset)
-+{
-+	int retval = -1;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	if (manifest == NULL) {
-+		return retval;
-+	}
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext == NULL && dev_chn_offset ==
-+		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
-+		return 0;
-+	} else if (manifest_ext == NULL) {
-+		return retval;
-+	}
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		       "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
-+#ifndef IPU_SYSVER_ipu7v1
-+	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
-+		manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
-+		retval = 0;
-+	} else {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+		 "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
-+	}
-+#else
-+	NOT_USED(dev_chn_id);
-+#endif
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_program_dependency(
-+	ia_css_program_manifest_t	*manifest,
-+	const uint8_t			program_dependency,
-+	const unsigned int		index)
-+{
-+	int	retval = -1;
-+	uint8_t *program_dep_ptr;
-+	uint8_t	program_dependency_count;
-+	uint8_t	program_count;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_program_dependency(): enter:\n");
-+
-+	program_dependency_count =
-+		ia_css_program_manifest_get_program_dependency_count(manifest);
-+	program_count =
-+		ia_css_program_group_manifest_get_program_count(
-+			ia_css_program_manifest_get_parent(manifest));
-+
-+	if ((index < program_dependency_count) &&
-+	    (program_dependency < program_count)) {
-+		program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+				  manifest->program_dependency_offset +
-+				  index*sizeof(uint8_t));
-+		 *program_dep_ptr = program_dependency;
-+		retval = 0;
-+	}
-+
-+	if (retval != 0) {
-+		IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
-+			program_dependency, index, retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_program_manifest_set_terminal_dependency(
-+	ia_css_program_manifest_t			*manifest,
-+	const uint8_t					terminal_dependency,
-+	const unsigned int				index)
-+{
-+	int	retval = -1;
-+	uint8_t *terminal_dep_ptr;
-+	uint8_t terminal_dependency_count =
-+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+	uint8_t terminal_count =
-+		ia_css_program_group_manifest_get_terminal_count(
-+			ia_css_program_manifest_get_parent(manifest));
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_program_manifest_set_terminal_dependency(): enter:\n");
-+
-+	if ((index < terminal_dependency_count) &&
-+			(terminal_dependency < terminal_count)) {
-+		terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
-+				  manifest->terminal_dependency_offset + index);
-+		 *terminal_dep_ptr = terminal_dependency;
-+		retval = 0;
-+	}
-+
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+void ia_css_program_manifest_init(
-+	ia_css_program_manifest_t	*blob,
-+	const uint8_t	program_needs_extension,
-+	const uint8_t	program_dependency_count,
-+	const uint8_t	terminal_dependency_count)
-+{
-+	size_t size = 0;
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+		"ia_css_program_manifest_init(): enter:\n");
-+
-+	/*TODO: add assert*/
-+	if (!blob)
-+		return;
-+
-+	blob->ID = 1;
-+	blob->program_dependency_count = program_dependency_count;
-+	blob->terminal_dependency_count = terminal_dependency_count;
-+
-+	size += sizeof(ia_css_program_manifest_t);
-+	if (program_needs_extension == 1) {
-+		/* align start of extension to 32 bit */
-+		size = CEIL_MUL(size, sizeof(uint32_t));
-+		blob->program_extension_offset = size;
-+		size += sizeof(ia_css_program_manifest_ext_t);
-+	} else {
-+		blob->program_extension_offset = 0;
-+	}
-+	blob->program_dependency_offset = size;
-+	size += sizeof(uint8_t) * program_dependency_count;
-+	blob->terminal_dependency_offset = size;
-+	size += sizeof(uint8_t) * terminal_dependency_count;
-+	/* align whole structure to 32 bit */
-+	size = CEIL_MUL(size, sizeof(uint32_t));
-+
-+	blob->size = (uint8_t)ia_css_sizeof_program_manifest(
-+		program_needs_extension,
-+		program_dependency_count,
-+		terminal_dependency_count);
-+
-+	assert(blob->size == size);
-+	/* The following assert also implies that:
-+	 * blob->program_extension_offset,
-+	 * blob->program_dependency_offset,
-+	 * blob->terminal_dependency_offset,
-+	 * are <= UINT8_MAX
-+	 */
-+	assert(size <= UINT8_MAX);
-+}
-+
-+int ia_css_program_manifest_print(
-+	const ia_css_program_manifest_t *manifest,
-+	void *fid)
-+{
-+	int			retval = -1;
-+	int			i, mem_index, dev_chn_index;
-+
-+	vied_nci_cell_type_ID_t	cell_type_id;
-+	uint8_t					program_dependency_count;
-+	uint8_t					terminal_dependency_count;
-+	ia_css_kernel_bitmap_t	bitmap;
-+	ia_css_program_manifest_ext_t *manifest_ext = NULL;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+		       "ia_css_program_manifest_print(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	NOT_USED(fid);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
-+		(int)ia_css_program_manifest_get_size(manifest));
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
-+		(int)ia_css_program_manifest_get_program_ID(manifest));
-+
-+	bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
-+	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
-+
-+	if (ia_css_has_program_manifest_fixed_cell(manifest)) {
-+		vied_nci_cell_ID_t cell_id =
-+				  ia_css_program_manifest_get_cell_ID(manifest);
-+
-+		cell_type_id = vied_nci_cell_get_type(cell_id);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
-+			(int)cell_id);
-+	} else {
-+		cell_type_id =
-+			ia_css_program_manifest_get_cell_type_ID(manifest);
-+	}
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
-+		(int)cell_type_id);
-+
-+	manifest_ext = ia_css_program_manifest_get_extension(manifest);
-+	if (manifest_ext != NULL) {
-+	for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
-+	     mem_index++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(internal mem) type = %d\n",
-+		(int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
-+	}
-+
-+	for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
-+	     mem_index++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(external mem) type = %d\n",
-+			(int)(vied_nci_mem_type_ID_t)mem_index);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(external mem) size = %d\n",
-+			manifest_ext->ext_mem_size[mem_index]);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(external mem) offset = %d\n",
-+			manifest_ext->ext_mem_offset[mem_index]);
-+	}
-+#if HAS_DFM
-+	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
-+	     dev_chn_index++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(device channel) type = %d\n",
-+			(int)dev_chn_index);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(device channel) size = %d\n",
-+			manifest_ext->dev_chn_size[dev_chn_index]);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(device channel) offset = %d\n",
-+			manifest_ext->dev_chn_offset[dev_chn_index]);
-+	}
-+	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
-+		dev_chn_index++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(dfm port) type = %d\n",
-+			(int)dev_chn_index);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(dfm port) port_bitmap = %x\n",
-+			manifest_ext->dfm_port_bitmap[dev_chn_index]);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(dfm port) active_port_bitmap = %x\n",
-+			manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(dfm port) is_dfm_relocatable = %d\n",
-+			manifest_ext->is_dfm_relocatable[dev_chn_index]);
-+	}
-+#else
-+	NOT_USED(dev_chn_index);
-+#endif /* HAS_DFM */
-+#ifdef USE_DEC400
-+	for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+			"\tEncoder stream id for idx = %d is: %d \n",
-+			i,
-+			manifest_ext->dec_resources_input[i]);
-+
-+	}
-+	for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
-+		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+			"\tDecoder stream id for idx: = %d is: %d\n",
-+			i,
-+			manifest_ext->dec_resources_output[i]);
-+
-+	}
-+#endif
-+	}
-+
-+	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\ttype(cells) bitmap = %d\n",
-+			manifest->cells[i]);
-+	}
-+	program_dependency_count =
-+		ia_css_program_manifest_get_program_dependency_count(manifest);
-+	if (program_dependency_count == 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"program_dependencies[%d] {};\n",
-+			program_dependency_count);
-+	} else {
-+		uint8_t prog_dep;
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"program_dependencies[%d] {\n",
-+			program_dependency_count);
-+		for (i = 0; i < (int)program_dependency_count - 1; i++) {
-+			prog_dep =
-+			ia_css_program_manifest_get_program_dependency(
-+				manifest, i);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"\t %4d,\n", prog_dep);
-+		}
-+		prog_dep =
-+		ia_css_program_manifest_get_program_dependency(manifest, i);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
-+		(void)prog_dep;
-+	}
-+
-+	terminal_dependency_count =
-+		ia_css_program_manifest_get_terminal_dependency_count(manifest);
-+	if (terminal_dependency_count == 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"terminal_dependencies[%d] {};\n",
-+			terminal_dependency_count);
-+	} else {
-+		uint8_t term_dep;
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"terminal_dependencies[%d] {\n",
-+			terminal_dependency_count);
-+		for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
-+			term_dep =
-+			ia_css_program_manifest_get_terminal_dependency(
-+				manifest, i);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"\t %4d,\n", term_dep);
-+		}
-+		term_dep =
-+		   ia_css_program_manifest_get_terminal_dependency(manifest, i);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
-+		(void)term_dep;
-+	}
-+	(void)cell_type_id;
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_program_manifest_print failed (%i)\n", retval);
-+	}
-+	return retval;
-+}
-+
-+#endif /* !defined(__HIVECC) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
-new file mode 100644
-index 000000000000..27f0cbfd3100
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
-@@ -0,0 +1,534 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_dynamic_storage_class.h"
-+#include "ia_css_psys_terminal_private_types.h"
-+#include "ia_css_terminal_types.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
-+#include "ia_css_psys_terminal_impl.h"
-+#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
-+
-+/*
-+ * Functions not to inline
-+ */
-+
-+/*
-+ * This source file is created with the intention of sharing and
-+ * compiled for host and firmware. Since there is no native 64bit
-+ * data type support for firmware this wouldn't compile for SP
-+ * tile. The part of the file that is not compilable are marked
-+ * with the following __VIED_CELL marker and this comment. Once we
-+ * come up with a solution to address this issue this will be
-+ * removed.
-+ */
-+#if !defined(__VIED_CELL)
-+size_t ia_css_sizeof_terminal(
-+	const ia_css_terminal_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param)
-+{
-+	size_t size = 0;
-+	uint16_t fragment_count =
-+		ia_css_program_group_param_get_fragment_count(param);
-+
-+	COMPILATION_ERROR_IF(
-+		SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
-+		(CHAR_BIT * sizeof(ia_css_data_terminal_t)));
-+
-+	COMPILATION_ERROR_IF(
-+		0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_sizeof_terminal(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
-+		const ia_css_param_terminal_manifest_t *param_term_man =
-+			(const ia_css_param_terminal_manifest_t *)manifest;
-+		verifexit(param_term_man != NULL);
-+		if (ia_css_terminal_manifest_get_type(manifest) ==
-+				IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
-+			size = ia_css_param_in_terminal_get_descriptor_size(
-+			param_term_man->param_manifest_section_desc_count);
-+		} else if (ia_css_terminal_manifest_get_type(manifest) ==
-+				IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+			size = ia_css_param_out_terminal_get_descriptor_size(
-+			param_term_man->param_manifest_section_desc_count,
-+			fragment_count);
-+		} else {
-+			assert(NULL == "Invalid parameter terminal type");
-+			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
-+				"ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
-+			verifjmpexit(0);
-+		}
-+	} else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
-+		size += sizeof(ia_css_data_terminal_t);
-+		size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
-+	} else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
-+		ia_css_program_terminal_manifest_t *prog_term_man =
-+			(ia_css_program_terminal_manifest_t *)manifest;
-+
-+		size = ia_css_program_terminal_get_descriptor_size(
-+			fragment_count,
-+			prog_term_man->
-+			fragment_param_manifest_section_desc_count,
-+			prog_term_man->
-+			kernel_fragment_sequencer_info_manifest_info_count,
-+			(fragment_count * prog_term_man->
-+			max_kernel_fragment_sequencer_command_desc));
-+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+				manifest)) {
-+		ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
-+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
-+		size = ia_css_spatial_param_terminal_get_descriptor_size(
-+		spatial_param_term->
-+		frame_grid_param_manifest_section_desc_count,
-+			fragment_count);
-+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+				manifest)) {
-+		ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
-+			(ia_css_program_control_init_terminal_manifest_t *)manifest;
-+		ia_css_program_group_manifest_t *pg_manifest =
-+			ia_css_terminal_manifest_get_parent(manifest);
-+		ia_css_kernel_bitmap_t kernel_bitmap =
-+			ia_css_program_group_param_get_kernel_enable_bitmap(param);
-+
-+		verifjmpexit(pg_manifest != NULL);
-+		size = ia_css_program_control_init_terminal_get_descriptor_size(
-+			progctrlinit_term_man, pg_manifest, kernel_bitmap);
-+	}
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_sizeof_terminal invalid argument\n");
-+	}
-+	return size;
-+}
-+
-+ia_css_terminal_t *ia_css_terminal_create(
-+	void *raw_mem,
-+	const ia_css_terminal_manifest_t *manifest,
-+	const ia_css_terminal_param_t *terminal_param,
-+	ia_css_kernel_bitmap_t enable_bitmap)
-+{
-+	char *terminal_raw_ptr;
-+	ia_css_terminal_t *terminal = NULL;
-+	uint16_t fragment_count;
-+	int i, j;
-+	int retval = -1;
-+	ia_css_program_group_param_t *param;
-+
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
-+		manifest, terminal_param);
-+
-+	param = ia_css_terminal_param_get_parent(terminal_param);
-+	fragment_count = ia_css_program_group_param_get_fragment_count(param);
-+
-+	verifexit(manifest != NULL);
-+	verifexit(param != NULL);
-+
-+	terminal_raw_ptr = (char *) raw_mem;
-+
-+	terminal = (ia_css_terminal_t *) terminal_raw_ptr;
-+	verifexit(terminal != NULL);
-+
-+	terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
-+	verifexit(ia_css_terminal_set_type(
-+		terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
-+
-+	terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
-+
-+	verifexit(ia_css_terminal_set_buffer(terminal,
-+				VIED_NULL) == 0);
-+
-+	if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
-+		ia_css_data_terminal_t *dterminal =
-+			(ia_css_data_terminal_t *)terminal;
-+		ia_css_frame_t *frame =
-+			ia_css_data_terminal_get_frame(dterminal);
-+		ia_css_kernel_bitmap_t intersection =
-+			ia_css_kernel_bitmap_intersection(enable_bitmap,
-+			ia_css_data_terminal_manifest_get_kernel_bitmap(
-+			(const ia_css_data_terminal_manifest_t *)manifest));
-+
-+		verifexit(frame != NULL);
-+		verifexit(ia_css_frame_set_buffer_state(
-+				frame, IA_CSS_BUFFER_NULL) == 0);
-+		verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
-+					true);
-+
-+		terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
-+		dterminal->fragment_descriptor_offset =
-+			(uint16_t) (terminal_raw_ptr - (char *)terminal);
-+
-+		dterminal->kernel_id = 0;
-+		while (!ia_css_is_kernel_bitmap_empty(intersection)) {
-+			intersection = ia_css_kernel_bitmap_shift(
-+					intersection);
-+			dterminal->kernel_id++;
-+		}
-+		assert(dterminal->kernel_id > 0);
-+		dterminal->kernel_id -= 1;
-+
-+		/* some terminal and fragment initialization */
-+		dterminal->frame_descriptor.frame_format_type =
-+			terminal_param->frame_format_type;
-+		for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
-+			dterminal->frame_descriptor.dimension[i] =
-+				terminal_param->dimensions[i];
-+		}
-+		dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
-+			terminal_param->stride;
-+		dterminal->frame_descriptor.bpp = terminal_param->bpp;
-+		dterminal->frame_descriptor.bpe = terminal_param->bpe;
-+		switch (dterminal->frame_descriptor.frame_format_type) {
-+		case IA_CSS_DATA_FORMAT_UYVY:
-+		case IA_CSS_DATA_FORMAT_YUYV:
-+		case IA_CSS_DATA_FORMAT_YUV420_LINE:
-+		case IA_CSS_DATA_FORMAT_Y800:
-+		case IA_CSS_DATA_FORMAT_RGB565:
-+		case IA_CSS_DATA_FORMAT_RGBA888:
-+		case IA_CSS_DATA_FORMAT_BAYER_GRBG:
-+		case IA_CSS_DATA_FORMAT_BAYER_RGGB:
-+		case IA_CSS_DATA_FORMAT_BAYER_BGGR:
-+		case IA_CSS_DATA_FORMAT_BAYER_GBRG:
-+		case IA_CSS_DATA_FORMAT_RAW:
-+		case IA_CSS_DATA_FORMAT_RAW_PACKED:
-+		case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
-+		case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
-+		case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
-+		case IA_CSS_DATA_FORMAT_IR:
-+			dterminal->frame_descriptor.plane_count = 1;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			break;
-+		case IA_CSS_DATA_FORMAT_NV12:
-+		case IA_CSS_DATA_FORMAT_NV21:
-+		case IA_CSS_DATA_FORMAT_NV16:
-+		case IA_CSS_DATA_FORMAT_NV61:
-+		case IA_CSS_DATA_FORMAT_P010:
-+		case IA_CSS_DATA_FORMAT_P010_MSB:
-+		case IA_CSS_DATA_FORMAT_P016:
-+		case IA_CSS_DATA_FORMAT_P016_MSB:
-+		case IA_CSS_DATA_FORMAT_P012_MSB:
-+			dterminal->frame_descriptor.plane_count = 2;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			dterminal->frame_descriptor.plane_offsets[1] =
-+				dterminal->frame_descriptor.plane_offsets[0] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+			break;
-+		case IA_CSS_DATA_FORMAT_P010_TILEY:
-+		case IA_CSS_DATA_FORMAT_P016_TILEY:
-+		case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
-+		case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
-+		case IA_CSS_DATA_FORMAT_NV12_TILEY:
-+			dterminal->frame_descriptor.plane_count = 2;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			dterminal->frame_descriptor.plane_offsets[1] =
-+				dterminal->frame_descriptor.plane_offsets[0] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+				CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
-+			break;
-+		case IA_CSS_DATA_FORMAT_YUV444:
-+		case IA_CSS_DATA_FORMAT_RGB888:
-+		case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
-+			dterminal->frame_descriptor.plane_count = 3;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			dterminal->frame_descriptor.plane_offsets[1] =
-+				dterminal->frame_descriptor.plane_offsets[0] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+			dterminal->frame_descriptor.plane_offsets[2] =
-+				dterminal->frame_descriptor.plane_offsets[1] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+			break;
-+		case IA_CSS_DATA_FORMAT_YUV420:
-+		case IA_CSS_DATA_FORMAT_YV12:
-+			dterminal->frame_descriptor.plane_count = 3;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			dterminal->frame_descriptor.plane_offsets[1] =
-+				dterminal->frame_descriptor.plane_offsets[0] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+			dterminal->frame_descriptor.plane_offsets[2] =
-+				dterminal->frame_descriptor.plane_offsets[1] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+			break;
-+		case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
-+			dterminal->frame_descriptor.plane_count = 4;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			dterminal->frame_descriptor.plane_offsets[1] =
-+				dterminal->frame_descriptor.plane_offsets[0] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+			dterminal->frame_descriptor.plane_offsets[2] =
-+				dterminal->frame_descriptor.plane_offsets[1] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
-+			dterminal->frame_descriptor.plane_offsets[3] =
-+				dterminal->frame_descriptor.plane_offsets[2] +
-+				dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
-+				dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
-+			break;
-+		default:
-+			/* Unset, resulting in potential terminal connect issues */
-+			dterminal->frame_descriptor.plane_count = 1;
-+			dterminal->frame_descriptor.plane_offsets[0] = 0;
-+			break;
-+		}
-+		/*
-+		 * Initial solution for single fragment initialization
-+		 * TODO:
-+		 * where to get the fragment description params from???
-+		 */
-+		if (fragment_count > 0) {
-+			ia_css_fragment_descriptor_t *fragment_descriptor =
-+				(ia_css_fragment_descriptor_t *)
-+				terminal_raw_ptr;
-+
-+			fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
-+				terminal_param->index[IA_CSS_COL_DIMENSION];
-+			fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
-+				terminal_param->index[IA_CSS_ROW_DIMENSION];
-+			fragment_descriptor->offset[0] =
-+				terminal_param->offset;
-+			for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
-+				fragment_descriptor->dimension[i] =
-+					terminal_param->fragment_dimensions[i];
-+			}
-+		}
-+		/* end fragment stuff */
-+
-+		/* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
-+		dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
-+	} else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
-+			true) {
-+		ia_css_param_terminal_t *pterminal =
-+			(ia_css_param_terminal_t *)terminal;
-+		uint16_t section_count =
-+			((const ia_css_param_terminal_manifest_t *)manifest)->
-+			param_manifest_section_desc_count;
-+		size_t curr_offset = 0;
-+
-+		pterminal->param_section_desc_offset =
-+			sizeof(ia_css_param_terminal_t);
-+
-+		for (i = 0; i < section_count; i++) {
-+			ia_css_param_section_desc_t *section =
-+			ia_css_param_in_terminal_get_param_section_desc(
-+					pterminal, i);
-+			const ia_css_param_manifest_section_desc_t *
-+				man_section =
-+		ia_css_param_terminal_manifest_get_prm_sct_desc(
-+			(const ia_css_param_terminal_manifest_t *)manifest, i);
-+
-+			verifjmpexit(man_section != NULL);
-+			verifjmpexit(section != NULL);
-+
-+			section->mem_size = man_section->max_mem_size;
-+			section->mem_offset = curr_offset;
-+			curr_offset += man_section->max_mem_size;
-+		}
-+	} else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
-+			true &&
-+		ia_css_terminal_manifest_get_type(manifest) ==
-+		IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
-+		ia_css_program_terminal_t *prog_terminal =
-+			(ia_css_program_terminal_t *)terminal;
-+		const ia_css_program_terminal_manifest_t *prog_terminal_man =
-+			(const ia_css_program_terminal_manifest_t *)manifest;
-+		verifjmpexit(prog_terminal_man != NULL);
-+
-+		ia_css_kernel_fragment_sequencer_info_desc_t
-+		*sequencer_info_desc_base = NULL;
-+		uint16_t section_count = prog_terminal_man->
-+		fragment_param_manifest_section_desc_count;
-+		uint16_t manifest_info_count =
-+			prog_terminal_man->
-+			kernel_fragment_sequencer_info_manifest_info_count;
-+		/* information needs to come from user or manifest once
-+		 * the size sizeof function is updated.
-+		 */
-+		uint16_t nof_command_objs = 0;
-+		size_t curr_offset = 0;
-+
-+		prog_terminal->kernel_fragment_sequencer_info_desc_offset =
-+			sizeof(ia_css_program_terminal_t);
-+		prog_terminal->fragment_param_section_desc_offset =
-+			prog_terminal->
-+			kernel_fragment_sequencer_info_desc_offset +
-+			(fragment_count * manifest_info_count *
-+			sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
-+			(nof_command_objs *
-+			sizeof(
-+			ia_css_kernel_fragment_sequencer_command_desc_t));
-+
-+		NOT_USED(sequencer_info_desc_base);
-+		/*Save fragments set fragment_count to 1*/
-+		fragment_count = 1;
-+		for (i = 0; i < fragment_count; i++) {
-+			for (j = 0; j < section_count; j++) {
-+				ia_css_fragment_param_section_desc_t *section =
-+			ia_css_program_terminal_get_frgmnt_prm_sct_desc(
-+					prog_terminal, i, j, section_count);
-+			const ia_css_fragment_param_manifest_section_desc_t *
-+			man_section =
-+ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
-+				(prog_terminal_man, j);
-+
-+				verifjmpexit(man_section != NULL);
-+				verifjmpexit(section != NULL);
-+
-+				section->mem_size = man_section->max_mem_size;
-+				section->mem_offset = curr_offset;
-+				curr_offset += man_section->max_mem_size;
-+			}
-+
-+			sequencer_info_desc_base =
-+		ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
-+					prog_terminal, i, 0,
-+					manifest_info_count);
-+		prog_terminal->payload_fragment_stride = curr_offset;
-+
-+			/*
-+			 * This offset cannot be initialized properly
-+			 * since the number of commands in every sequencer
-+			 * is not known at this point
-+			 */
-+			/*for (j = 0; j < manifest_info_count; j++) {
-+				sequencer_info_desc_base[j].
-+					command_desc_offset =
-+				prog_terminal->
-+				kernel_fragment_sequencer_info_desc_offset +
-+				(manifest_info_count *
-+				sizeof(
-+				ia_css_kernel_fragment_sequencer_info_desc_t) +
-+				(nof_command_objs *
-+				sizeof(
-+				ia_css_kernel_fragment_sequencer_command_desc_t
-+				));
-+			}*/
-+		}
-+	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
-+				manifest) == true) {
-+		ia_css_spatial_param_terminal_t *spatial_param_terminal =
-+			(ia_css_spatial_param_terminal_t *)terminal;
-+		ia_css_spatial_param_terminal_manifest_t *
-+			spatia_param_terminal_man =
-+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
-+
-+		/* Initialize the spatial terminal structure */
-+		spatial_param_terminal->fragment_grid_desc_offset =
-+			sizeof(ia_css_spatial_param_terminal_t);
-+		spatial_param_terminal->frame_grid_param_section_desc_offset =
-+			spatial_param_terminal->fragment_grid_desc_offset +
-+			(fragment_count * sizeof(ia_css_fragment_grid_desc_t));
-+		spatial_param_terminal->kernel_id =
-+			spatia_param_terminal_man->kernel_id;
-+	} else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
-+			true) {
-+		ia_css_sliced_param_terminal_t *sliced_param_terminal =
-+			(ia_css_sliced_param_terminal_t *)terminal;
-+		ia_css_sliced_param_terminal_manifest_t
-+		*sliced_param_terminal_man =
-+			(ia_css_sliced_param_terminal_manifest_t *)manifest;
-+
-+		/* Initialize the sliced terminal structure */
-+		sliced_param_terminal->fragment_slice_desc_offset =
-+			sizeof(ia_css_sliced_param_terminal_t);
-+		sliced_param_terminal->kernel_id =
-+			sliced_param_terminal_man->kernel_id;
-+	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
-+			manifest) == true) {
-+		ia_css_program_group_manifest_t *pg_manifest =
-+			ia_css_terminal_manifest_get_parent(manifest);
-+		ia_css_program_group_param_t *pg_param =
-+			ia_css_terminal_param_get_parent(terminal_param);
-+		ia_css_kernel_bitmap_t kernel_bitmap;
-+
-+		verifjmpexit(pg_manifest != NULL && pg_param != NULL);
-+		kernel_bitmap =
-+			ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
-+
-+		verifjmpexit(ia_css_program_control_init_terminal_init(
-+			(ia_css_program_control_init_terminal_t *)
-+			terminal,
-+			(const ia_css_program_control_init_terminal_manifest_t *)
-+			manifest, pg_manifest, kernel_bitmap) == 0);
-+	} else {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
-+			EFAULT);
-+		goto EXIT;
-+	}
-+
-+	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
-+				   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
-+				   terminal->ID);
-+
-+	retval = 0;
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_terminal_create invalid argument\n");
-+	}
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
-+			"ia_css_terminal_create failed (%i)\n", retval);
-+		terminal = ia_css_terminal_destroy(terminal);
-+	}
-+	return terminal;
-+}
-+
-+ia_css_terminal_t *ia_css_terminal_destroy(
-+	ia_css_terminal_t *terminal)
-+{
-+	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
-+		"ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
-+	return terminal;
-+}
-+
-+uint16_t ia_css_param_terminal_compute_section_count(
-+	const ia_css_terminal_manifest_t *manifest,
-+	const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
-+{
-+	uint16_t section_count = 0;
-+
-+	NOT_USED(param);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
-+		"ia_css_param_terminal_compute_section_count(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
-+				param_manifest_section_desc_count;
-+EXIT:
-+	if (NULL == manifest || NULL == param) {
-+		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
-+			"ia_css_param_terminal_compute_section_count: invalid argument\n");
-+	}
-+	return section_count;
-+}
-+#endif /* !defined(__VIED_CELL) */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
-new file mode 100644
-index 000000000000..f0eb795707e7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
-@@ -0,0 +1,776 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <ia_css_psys_terminal_manifest.h>
-+
-+/* Data object types on the terminals */
-+#include <ia_css_program_group_data.h>
-+/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
-+#include <ia_css_kernel_bitmap.h>
-+
-+#include "ia_css_psys_program_group_private.h"
-+#include "ia_css_terminal_manifest.h"
-+#include "ia_css_terminal_manifest_types.h"
-+
-+#include <error_support.h>
-+#include <print_support.h>
-+#include <misc_support.h>
-+#include "ia_css_psys_static_trace.h"
-+
-+#ifndef __IA_CSS_PSYS_STATIC_INLINE__
-+#include "ia_css_psys_terminal_manifest_impl.h"
-+#endif
-+#include "ia_css_terminal_manifest.h"
-+
-+/* We need to refactor those files in order to build in the firmware only
-+   what is needed, switches are put current to workaround compilation problems
-+   in the firmware (for example lack of uint64_t support)
-+   supported in the firmware
-+  */
-+#if !defined(__HIVECC)
-+static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
-+	"IA_CSS_TERMINAL_TYPE_DATA_IN",
-+	"IA_CSS_TERMINAL_TYPE_DATA_OUT",
-+	"IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
-+	/**< Type 1-5 parameter input */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
-+	/**< Type 1-5 parameter output */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
-+	/**< Represent the new type of terminal for
-+	 * the "spatial dependent parameters", when params go in
-+	 */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
-+	/**< Represent the new type of terminal for
-+	 * the "spatial dependent parameters", when params go out
-+	 */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
-+	/**< Represent the new type of terminal for
-+	 * the explicit slicing, when params go in
-+	 */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
-+	/**< Represent the new type of terminal for
-+	 * the explicit slicing, when params go out
-+	 */
-+	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
-+	/**< State (private data) input */
-+	"IA_CSS_TERMINAL_TYPE_STATE_IN",
-+	/**< State (private data) output */
-+	"IA_CSS_TERMINAL_TYPE_STATE_OUT",
-+	"IA_CSS_TERMINAL_TYPE_PROGRAM",
-+	"IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
-+	"UNDEFINED_TERMINAL_TYPE"};
-+
-+int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
-+	ia_css_data_terminal_manifest_t *manifest,
-+	const unsigned int index)
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
-+
-+	if (manifest != NULL) {
-+		ia_css_kernel_bitmap_t kernel_bitmap =
-+					ia_css_kernel_bitmap_clear();
-+
-+		kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
-+		verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
-+		verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
-+				manifest, kernel_bitmap) == 0);
-+		retval = 0;
-+	}
-+
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_min_size(
-+	ia_css_data_terminal_manifest_t	*manifest,
-+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_min_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	manifest->min_size[IA_CSS_COL_DIMENSION] =
-+		min_size[IA_CSS_COL_DIMENSION];
-+	manifest->min_size[IA_CSS_ROW_DIMENSION] =
-+		min_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_max_size(
-+	ia_css_data_terminal_manifest_t	*manifest,
-+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_max_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	manifest->max_size[IA_CSS_COL_DIMENSION] =
-+		max_size[IA_CSS_COL_DIMENSION];
-+	manifest->max_size[IA_CSS_ROW_DIMENSION] =
-+		max_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
-+	}
-+	return retval;
-+}
-+#endif
-+
-+int ia_css_data_terminal_manifest_get_min_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_min_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	min_size[IA_CSS_COL_DIMENSION] =
-+		manifest->min_size[IA_CSS_COL_DIMENSION];
-+	min_size[IA_CSS_ROW_DIMENSION] =
-+		manifest->min_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_get_max_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_max_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	max_size[IA_CSS_COL_DIMENSION] =
-+		manifest->max_size[IA_CSS_COL_DIMENSION];
-+	max_size[IA_CSS_ROW_DIMENSION] =
-+		manifest->max_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+#if !defined(__HIVECC)
-+int ia_css_data_terminal_manifest_set_min_fragment_size(
-+	ia_css_data_terminal_manifest_t	*manifest,
-+	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
-+		min_size[IA_CSS_COL_DIMENSION];
-+	manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
-+		min_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_set_max_fragment_size(
-+	ia_css_data_terminal_manifest_t	*manifest,
-+	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
-+		max_size[IA_CSS_COL_DIMENSION];
-+	manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
-+		max_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
-+	}
-+	return retval;
-+}
-+#endif
-+
-+int ia_css_data_terminal_manifest_get_min_fragment_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	min_size[IA_CSS_COL_DIMENSION] =
-+		manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
-+	min_size[IA_CSS_ROW_DIMENSION] =
-+		manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+int ia_css_data_terminal_manifest_get_max_fragment_size(
-+	const ia_css_data_terminal_manifest_t *manifest,
-+	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
-+{
-+	int retval = -1;
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
-+		"ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+
-+	max_size[IA_CSS_COL_DIMENSION] =
-+		manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
-+	max_size[IA_CSS_ROW_DIMENSION] =
-+		manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
-+	retval = 0;
-+
-+EXIT:
-+	if (NULL == manifest) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
-+			"ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
-+	}
-+	return retval;
-+}
-+
-+/* We need to refactor those files in order to build in the firmware only
-+   what is needed, switches are put current to workaround compilation problems
-+   in the firmware (for example lack of uint64_t support)
-+   supported in the firmware
-+  */
-+#if !defined(__HIVECC)
-+
-+#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
-+	INFO, "%s:\t%d %d\n", \
-+	(name), \
-+	(var)[IA_CSS_COL_DIMENSION], \
-+	(var)[IA_CSS_ROW_DIMENSION])
-+
-+int ia_css_terminal_manifest_print(
-+	const ia_css_terminal_manifest_t *manifest,
-+	void *fid)
-+{
-+	int retval = -1;
-+	ia_css_terminal_type_t terminal_type =
-+		ia_css_terminal_manifest_get_type(manifest);
-+
-+	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
-+		"ia_css_terminal_manifest_print(): enter:\n");
-+
-+	verifexit(manifest != NULL);
-+	NOT_USED(fid);
-+	NOT_USED(terminal_type_strings);
-+
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
-+		(int)ia_css_terminal_manifest_get_size(manifest));
-+#ifndef __XTENSA_FW__
-+	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
-+			terminal_type_strings[terminal_type]);
-+#endif
-+	if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
-+		ia_css_param_terminal_manifest_t *pterminal_manifest =
-+			(ia_css_param_terminal_manifest_t *)manifest;
-+		uint16_t section_count =
-+			pterminal_manifest->param_manifest_section_desc_count;
-+		int	i;
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"sections(manifest) = %d\n", (int)section_count);
-+		for (i = 0; i < section_count; i++) {
-+			const ia_css_param_manifest_section_desc_t *manifest =
-+		ia_css_param_terminal_manifest_get_prm_sct_desc(
-+			pterminal_manifest, i);
-+			verifjmpexit(manifest != NULL);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"mem_type_id = %d\n",
-+				(int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"max_mem_size = %d\n",
-+				(int)manifest->max_mem_size);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"region_id = %d\n",
-+				(int)ia_css_param_manifest_section_desc_get_region_id(manifest));
-+		}
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
-+		ia_css_sliced_param_terminal_manifest_t
-+		*sliced_terminal_manifest =
-+			(ia_css_sliced_param_terminal_manifest_t *)manifest;
-+		uint32_t kernel_id;
-+		uint16_t section_count;
-+		uint16_t section_idx;
-+
-+		kernel_id = sliced_terminal_manifest->kernel_id;
-+		section_count =
-+			sliced_terminal_manifest->sliced_param_section_count;
-+
-+		NOT_USED(kernel_id);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"kernel_id = %d\n", (int)kernel_id);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"section_count = %d\n", (int)section_count);
-+
-+		for (section_idx = 0; section_idx < section_count;
-+			section_idx++) {
-+			ia_css_sliced_param_manifest_section_desc_t
-+				*sliced_param_manifest_section_desc;
-+
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"section %d\n", (int)section_idx);
-+			sliced_param_manifest_section_desc =
-+		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
-+				sliced_terminal_manifest, section_idx);
-+			verifjmpexit(sliced_param_manifest_section_desc !=
-+				NULL);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"mem_type_id = %d\n",
-+			(int)sliced_param_manifest_section_desc->mem_type_id);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"region_id = %d\n",
-+			(int)sliced_param_manifest_section_desc->region_id);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"max_mem_size = %d\n",
-+			(int)sliced_param_manifest_section_desc->max_mem_size);
-+		}
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
-+		ia_css_program_terminal_manifest_t *program_terminal_manifest =
-+			(ia_css_program_terminal_manifest_t *)manifest;
-+		uint32_t sequencer_info_kernel_id;
-+		uint16_t max_kernel_fragment_sequencer_command_desc;
-+		uint16_t kernel_fragment_sequencer_info_manifest_info_count;
-+		uint16_t seq_info_idx;
-+		uint16_t section_count =
-+			program_terminal_manifest->fragment_param_manifest_section_desc_count;
-+		uint16_t sec_idx;
-+
-+		sequencer_info_kernel_id =
-+			program_terminal_manifest->sequencer_info_kernel_id;
-+		max_kernel_fragment_sequencer_command_desc =
-+			program_terminal_manifest->
-+			max_kernel_fragment_sequencer_command_desc;
-+		kernel_fragment_sequencer_info_manifest_info_count =
-+			program_terminal_manifest->
-+			kernel_fragment_sequencer_info_manifest_info_count;
-+
-+		NOT_USED(sequencer_info_kernel_id);
-+		NOT_USED(max_kernel_fragment_sequencer_command_desc);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"sequencer_info_kernel_id = %d\n",
-+			(int)sequencer_info_kernel_id);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"max_kernel_fragment_sequencer_command_desc = %d\n",
-+			(int)max_kernel_fragment_sequencer_command_desc);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"kernel_fragment_sequencer_info_manifest_info_count = %d\n",
-+			(int)
-+			kernel_fragment_sequencer_info_manifest_info_count);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
-+		for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
-+			const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
-+		ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
-+			program_terminal_manifest, sec_idx);
-+			NOT_USED(ptmanifest);
-+			verifjmpexit(manifest != NULL);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"mem_type_id = %d\n",
-+				(int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"max_mem_size = %d\n",
-+				(int)ptmanifest->max_mem_size);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"region_id = %d\n",
-+				(int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
-+		}
-+		for (seq_info_idx = 0; seq_info_idx <
-+			kernel_fragment_sequencer_info_manifest_info_count;
-+				seq_info_idx++) {
-+			ia_css_kernel_fragment_sequencer_info_manifest_desc_t
-+				*sequencer_info_manifest_desc;
-+
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"sequencer info %d\n", (int)seq_info_idx);
-+			sequencer_info_manifest_desc =
-+		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
-+				(program_terminal_manifest, seq_info_idx);
-+			verifjmpexit(sequencer_info_manifest_desc != NULL);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"min_fragment_grid_slice_dimension[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"max_fragment_grid_slice_dimension[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_slice_dimension[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_slice_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"min_fragment_grid_slice_count[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"max_fragment_grid_slice_count[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_slice_count[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_slice_count[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_point_decimation_factor[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_point_decimation_factor[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+			min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+			min_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+			max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+			max_fragment_grid_overlay_pixel_topleft_index[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				min_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
-+				"max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_COL_DIMENSION],
-+				(int)sequencer_info_manifest_desc->
-+				max_fragment_grid_overlay_pixel_dimension[
-+						IA_CSS_ROW_DIMENSION]);
-+		}
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
-+		ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
-+			(ia_css_program_control_init_terminal_manifest_t *)manifest;
-+		ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
-+
-+		ia_css_data_terminal_manifest_t *dterminal_manifest =
-+			(ia_css_data_terminal_manifest_t *)manifest;
-+		int i;
-+
-+		NOT_USED(dterminal_manifest);
-+
-+		verifexit(ia_css_kernel_bitmap_print(
-+			ia_css_data_terminal_manifest_get_kernel_bitmap(
-+				dterminal_manifest), fid) == 0);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"formats(manifest) = %04x\n",
-+		(int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
-+			dterminal_manifest));
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"connection(manifest) = %04x\n",
-+		(int)ia_css_data_terminal_manifest_get_connection_bitmap(
-+			dterminal_manifest));
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"dependent(manifest) = %d\n",
-+			(int)dterminal_manifest->terminal_dependency);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\tmin_size[%d]   = {\n",
-+			IA_CSS_N_DATA_DIMENSION);
-+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"\t\t%4d,\n", dterminal_manifest->min_size[i]);
-+		}
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\t\t%4d }\n", dterminal_manifest->min_size[i]);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
-+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\t\t%4d,\n", dterminal_manifest->max_size[i]);
-+		}
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\t\t%4d }\n", dterminal_manifest->max_size[i]);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\tmin_fragment_size[%d]   = {\n",
-+			IA_CSS_N_DATA_DIMENSION);
-+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"\t\t%4d,\n",
-+				dterminal_manifest->min_fragment_size[i]);
-+		}
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\t\t%4d }\n",
-+			dterminal_manifest->min_fragment_size[i]);
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\tmax_fragment_size[%d]   = {\n",
-+			IA_CSS_N_DATA_DIMENSION);
-+		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+				"\t\t%4d,\n",
-+				dterminal_manifest->max_fragment_size[i]);
-+		}
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
-+			"\t\t%4d }\n",
-+			dterminal_manifest->max_fragment_size[i]);
-+
-+	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
-+		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
-+
-+		ia_css_spatial_param_terminal_manifest_t *stm =
-+			(ia_css_spatial_param_terminal_manifest_t *)manifest;
-+		ia_css_frame_grid_param_manifest_section_desc_t *sec;
-+		int sec_count =
-+			stm->frame_grid_param_manifest_section_desc_count;
-+		int sec_index;
-+
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
-+			stm->kernel_id);
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
-+			stm->compute_units_p_elem);
-+#ifndef __XTENSA_FW__
-+		PRINT_DIMENSION("min_fragment_grid_dimension",
-+			stm->common_fragment_grid_desc.min_fragment_grid_dimension);
-+		PRINT_DIMENSION("max_fragment_grid_dimension",
-+			stm->common_fragment_grid_desc.max_fragment_grid_dimension);
-+		PRINT_DIMENSION("min_frame_grid_dimension",
-+			stm->frame_grid_desc.min_frame_grid_dimension);
-+		PRINT_DIMENSION("max_frame_grid_dimension",
-+			stm->frame_grid_desc.max_frame_grid_dimension);
-+#endif
-+		for (sec_index = 0; sec_index < sec_count; sec_index++) {
-+			sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
-+				stm, sec_index);
-+			verifjmpexit(sec != NULL);
-+
-+			IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
-+				sec->mem_type_id);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
-+				sec->region_id);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
-+				sec->elem_size);
-+			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
-+				sec->max_mem_size);
-+		}
-+	} else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
-+		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
-+			"terminal type can not be pretty printed, not supported\n");
-+	}
-+
-+	retval = 0;
-+EXIT:
-+	if (retval != 0) {
-+		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
-+			"ia_css_terminal_manifest_print failed (%i)\n",
-+			retval);
-+	}
-+	return retval;
-+}
-+
-+/* Program control init Terminal */
-+unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
-+	const ia_css_program_control_init_manifest_program_desc_t *prog)
-+{
-+	assert(prog);
-+	return prog->connect_section_count;
-+}
-+
-+unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
-+	const ia_css_program_control_init_manifest_program_desc_t *prog)
-+{
-+	assert(prog);
-+	return prog->load_section_count;
-+}
-+
-+unsigned int ia_css_program_control_init_terminal_manifest_get_size(
-+	const uint16_t nof_programs,
-+	const uint16_t *nof_load_sections,
-+	const uint16_t *nof_connect_sections)
-+{
-+	(void)nof_load_sections; /* might be needed in future */
-+	(void)nof_connect_sections; /* might be needed in future */
-+
-+	return sizeof(ia_css_program_control_init_terminal_manifest_t) +
-+		nof_programs *
-+		sizeof(ia_css_program_control_init_manifest_program_desc_t);
-+}
-+
-+ia_css_program_control_init_manifest_program_desc_t *
-+ia_css_program_control_init_terminal_manifest_get_program_desc(
-+	const ia_css_program_control_init_terminal_manifest_t *terminal,
-+	unsigned int program)
-+{
-+	ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+	assert(terminal != NULL);
-+	assert(program < terminal->program_count);
-+
-+	progs = (ia_css_program_control_init_manifest_program_desc_t *)
-+		((const char *)terminal + terminal->program_desc_offset);
-+
-+	return &progs[program];
-+}
-+
-+int ia_css_program_control_init_terminal_manifest_init(
-+	ia_css_program_control_init_terminal_manifest_t *terminal,
-+	const uint16_t nof_programs,
-+	const uint16_t *nof_load_sections,
-+	const uint16_t *nof_connect_sections)
-+{
-+	unsigned int i;
-+	ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+	if (terminal == NULL) {
-+		return -EFAULT;
-+	}
-+
-+	terminal->program_count = nof_programs;
-+	terminal->program_desc_offset =
-+		sizeof(ia_css_program_control_init_terminal_manifest_t);
-+
-+	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
-+		terminal, 0);
-+
-+	for (i = 0; i < nof_programs; i++) {
-+		progs[i].load_section_count = nof_load_sections[i];
-+		progs[i].connect_section_count = nof_connect_sections[i];
-+	}
-+	return 0;
-+}
-+
-+void ia_css_program_control_init_terminal_manifest_print(
-+	ia_css_program_control_init_terminal_manifest_t *terminal)
-+{
-+	unsigned int i;
-+
-+	ia_css_program_control_init_manifest_program_desc_t *progs;
-+
-+	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
-+		terminal, 0);
-+
-+	assert(progs);
-+	(void)progs;
-+
-+	for (i = 0; i < terminal->program_count; i++) {
-+		IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
-+			"program index: %d, load sec: %d, connect sec: %d\n",
-+			i,
-+			progs[i].load_section_count,
-+			progs[i].connect_section_count);
-+	}
-+}
-+
-+#endif
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
-new file mode 100644
-index 000000000000..85982fb184a4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
-@@ -0,0 +1,19 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifndef __IA_CSS_RBM_INLINE__
-+#include "ia_css_rbm_impl.h"
-+#endif /* __IA_CSS_RBM_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
-new file mode 100644
-index 000000000000..4a124962fefb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "storage_class.h"
-+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __INLINE_PARAMETERS__ */
-+#include "ia_css_terminal_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
-new file mode 100644
-index 000000000000..d051f1d38657
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
-@@ -0,0 +1,22 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#ifdef __INLINE_PARAMETERS__
-+#include "storage_class.h"
-+STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __INLINE_PARAMETERS__ */
-+#include "ia_css_terminal_manifest_impl.h"
-+#endif /* __INLINE_PARAMETERS__ */
-diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
-new file mode 100644
-index 000000000000..8d69d999c9ba
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
-@@ -0,0 +1,28 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "ia_css_psys_sim_storage_class.h"
-+
-+/*
-+ * Functions to possibly inline
-+ */
-+
-+#ifdef __IA_CSS_PSYS_SIM_INLINE__
-+STORAGE_CLASS_INLINE int
-+__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
-+#else /* __IA_CSS_PSYS_SIM_INLINE__ */
-+#include "psys_system_global_impl.h"
-+#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
-diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
-new file mode 100644
-index 000000000000..b3227fb3ddd6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.cpp
-@@ -0,0 +1,133 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Camera3BufferPool"
-+
-+#include "HALv3Utils.h"
-+#include "iutils/Utils.h"
-+#include "Camera3BufferPool.h"
-+
-+namespace camera3 {
-+
-+Camera3BufferPool::Camera3BufferPool()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+Camera3BufferPool::~Camera3BufferPool()
-+{
-+    LOG1("@%s", __func__);
-+    destroyBufferPool();
-+}
-+
-+// Create the buffer pool with HEAP buffer
-+icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs, const icamera::stream_t &stream)
-+{
-+    LOG1("@%s number of buffers:%d", __func__, numBufs);
-+    std::lock_guard<std::mutex> l(mLock);
-+    mBuffers.clear();
-+
-+    for (uint32_t i = 0; i < numBufs; i++) {
-+        std::shared_ptr<Camera3Buffer> buffer = MemoryUtils::allocateHeapBuffer(stream.width, stream.height, stream.stride,
-+                                                                           stream.format, cameraId, stream.size);
-+        if (!buffer) {
-+            mBuffers.clear();
-+            LOGE("failed to alloc %d internal buffers", i);
-+            return icamera::NO_MEMORY;
-+        }
-+
-+        // Initialize the buffer status to free
-+        mBuffers[buffer] = false;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+// Create the buffer pool with GFX handle buffer
-+icamera::status_t Camera3BufferPool::createBufferPool(int cameraId, uint32_t numBufs, int width,
-+                                                      int height, int gfxFmt, int usage)
-+{
-+    LOG1("@%s number of buffers:%d", __func__, numBufs);
-+    std::lock_guard<std::mutex> l(mLock);
-+    mBuffers.clear();
-+
-+    for (uint32_t i = 0; i < numBufs; i++) {
-+        std::shared_ptr<Camera3Buffer> buffer = MemoryUtils::allocateHandleBuffer(width, height, gfxFmt,
-+                                                                             usage, cameraId);
-+        if (!buffer || buffer->lock() != icamera::OK) {
-+            mBuffers.clear();
-+            LOGE("failed to alloc %d internal buffers", i);
-+            return icamera::NO_MEMORY;
-+        }
-+
-+        // Initialize the buffer status to free
-+        mBuffers[buffer] = false;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+void Camera3BufferPool::destroyBufferPool()
-+{
-+    LOG1("@%s Internal buffers size:%zu", __func__, mBuffers.size());
-+
-+    std::lock_guard<std::mutex> l(mLock);
-+    mBuffers.clear();
-+}
-+
-+std::shared_ptr<Camera3Buffer> Camera3BufferPool::acquireBuffer()
-+{
-+    std::lock_guard<std::mutex> l(mLock);
-+    for (auto &buf : mBuffers) {
-+        if (!buf.second) {
-+            buf.second = true;
-+            LOG2("%s addr:%p", __func__, buf.first->data());
-+            return buf.first;
-+        }
-+    }
-+
-+    LOGE("%s all the internal buffers are busy", __func__);
-+    return nullptr;
-+}
-+
-+void Camera3BufferPool::returnBuffer(std::shared_ptr<Camera3Buffer> buffer)
-+{
-+    std::lock_guard<std::mutex> l(mLock);
-+    for (auto &buf : mBuffers) {
-+        if (buf.second && buf.first == buffer) {
-+            LOG2("%s addr:%p", __func__, buffer->data());
-+            buf.second = false;
-+            return;
-+        }
-+    }
-+
-+    LOGE("%s, the internal buffer addr:%p not found", __func__, buffer->data());
-+}
-+
-+std::shared_ptr<Camera3Buffer> Camera3BufferPool::findBuffer(void *memAddr)
-+{
-+    std::lock_guard<std::mutex> l(mLock);
-+    for (auto &buf : mBuffers) {
-+        if (buf.second && buf.first->data() == memAddr) {
-+            LOG2("%s addr:%p", __func__, memAddr);
-+            return buf.first;
-+        }
-+    }
-+
-+    LOGE("%s, Failed to find the internal buffer addr: %p", __func__, memAddr);
-+    return nullptr;
-+}
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
-new file mode 100644
-index 000000000000..8a986b449c6d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/memory/Camera3BufferPool.h
-@@ -0,0 +1,51 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <mutex>
-+#include <unordered_map>
-+#include "Camera3Buffer.h"
-+
-+namespace camera3 {
-+
-+/**
-+ * \class Camera3BufferPool
-+ *
-+ * This class is used to manage a memory pool based on Camera3Buffer
-+ * It needs to follow the calling sequence:
-+ * createBufferPool -> acquireBuffer -> findBuffer -> returnBuffer
-+ */
-+class Camera3BufferPool {
-+
-+public:
-+    Camera3BufferPool();
-+    ~Camera3BufferPool();
-+
-+    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs, const icamera::stream_t &stream);
-+    icamera::status_t createBufferPool(int cameraId, uint32_t numBufs, int width, int height, int gfxFmt, int usage);
-+
-+    void destroyBufferPool();
-+    std::shared_ptr<Camera3Buffer> acquireBuffer();
-+    void returnBuffer(std::shared_ptr<Camera3Buffer> buffer);
-+    std::shared_ptr<Camera3Buffer> findBuffer(void *memAddr);
-+
-+private:
-+    std::unordered_map<std::shared_ptr<Camera3Buffer>, bool> mBuffers;
-+                      // first: camera3Buffer, second: true as buffer in used
-+    std::mutex mLock; // lock the mBuffers
-+};
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
-new file mode 100644
-index 000000000000..580387eddcc3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.cpp
-@@ -0,0 +1,555 @@
-+/*
-+ * Copyright (C) 2013-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Camera3Buffer"
-+
-+#include <sys/mman.h>
-+#include <unistd.h>
-+#include <sync/sync.h>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Utils.h"
-+#include "HALv3Utils.h"
-+#include "Camera3Buffer.h"
-+#include "Camera3Stream.h"
-+
-+using namespace icamera;
-+
-+namespace camera3 {
-+////////////////////////////////////////////////////////////////////
-+// PUBLIC METHODS
-+////////////////////////////////////////////////////////////////////
-+
-+/**
-+ * Camera3Buffer
-+ *
-+ * Default constructor
-+ * This constructor is used when we pre-allocate the Camera3Buffer object
-+ * The initialization will be done as a second stage wit the method
-+ * init(), where we initialize the wrapper with the gralloc buffer provided by
-+ * the framework
-+ */
-+Camera3Buffer::Camera3Buffer() :
-+    mFormat(0),
-+    mInit(false),
-+    mLocked(false),
-+    mType(BUF_TYPE_HANDLE),
-+    mHandlePtr(nullptr),
-+    mCameraId(0),
-+    mRegistered(false),
-+    mGbmBufferManager(nullptr)
-+{
-+    CLEAR(mHalBuffer);
-+    LOG1("%s default constructor for buf %p", __func__, this);
-+}
-+
-+/**
-+ * Camera3Buffer
-+ *
-+ * Constructor for buffers allocated using MemoryUtils::allocateHeapBuffer
-+ *
-+ * \param w [IN] width
-+ * \param h [IN] height
-+ * \param s [IN] stride
-+ * \param v4l2fmt [IN] V4l2 format
-+ * \param usrPtr [IN] Data pointer
-+ * \param cameraId [IN] id of camera being used
-+ * \param dataSizeOverride [IN] buffer size input. Default is 0 and frameSize()
-+                                is used in that case.
-+ */
-+Camera3Buffer::Camera3Buffer(int w, int h, int stride, int v4l2fmt,
-+                             void* usrPtr, int cameraId, int dataSizeOverride):
-+    mFormat(0),
-+    mInit(false),
-+    mLocked(true),
-+    mType(BUF_TYPE_MALLOC),
-+    mHandlePtr(nullptr),
-+    mCameraId(cameraId)
-+
-+{
-+    LOG1("%s create malloc camera buffer %p", __func__, this);
-+
-+    CLEAR(mHalBuffer);
-+    mHalBuffer.s.format = v4l2fmt;
-+    mHalBuffer.s.width = w;
-+    mHalBuffer.s.height = h;
-+    mHalBuffer.s.stride = stride;
-+    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
-+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
-+
-+    if (usrPtr != nullptr) {
-+        mHalBuffer.addr = usrPtr;
-+        mInit = true;
-+        mHalBuffer.s.size = dataSizeOverride ? dataSizeOverride :
-+                            CameraUtils::getFrameSize(v4l2fmt, stride, h);
-+    } else {
-+        LOGE("Tried to initialize a buffer with nullptr ptr!!");
-+    }
-+}
-+
-+Camera3Buffer::~Camera3Buffer()
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    if (mInit) {
-+        switch(mType) {
-+        case BUF_TYPE_MALLOC:
-+            free(mHalBuffer.addr);
-+            mHalBuffer.addr = nullptr;
-+            break;
-+        case BUF_TYPE_MMAP:
-+            if (mHalBuffer.addr != nullptr)
-+                munmap(mHalBuffer.addr, mHalBuffer.s.size);
-+            mHalBuffer.addr = nullptr;
-+            mHalBuffer.s.size = 0;
-+            close(mHalBuffer.dmafd);
-+            break;
-+        case BUF_TYPE_HANDLE:
-+            // Allocated by the HAL
-+            if (!(mUserBuffer.stream)) {
-+                LOG1("release internal buffer");
-+                // For HAL buffer, need to unlock before free it
-+                unlock();
-+                mGbmBufferManager->Free(mHandle);
-+            }
-+            break;
-+        default:
-+            break;
-+        }
-+    }
-+    LOG1("%s destroying buf %p", __func__, this);
-+}
-+
-+/**
-+ * init
-+ *
-+ * Construct to wrap a camera3_stream_buffer
-+ *
-+ * \param aBuffer [IN] camera3_stream_buffer buffer
-+ */
-+icamera::status_t Camera3Buffer::init(const camera3_stream_buffer *aBuffer, int cameraId)
-+{
-+    mType = BUF_TYPE_HANDLE;
-+    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
-+    mHandle = *aBuffer->buffer;
-+    mHandlePtr = aBuffer->buffer;
-+    mHalBuffer.s.width = aBuffer->stream->width;
-+    mHalBuffer.s.height = aBuffer->stream->height;
-+    mFormat = aBuffer->stream->format;
-+    mHalBuffer.s.memType = mFormat == HAL_PIXEL_FORMAT_RAW_OPAQUE ?
-+        V4L2_MEMORY_USERPTR : V4L2_MEMORY_DMABUF;
-+    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
-+    // Use actual width from platform native handle for stride
-+    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(*aBuffer->buffer, 0);
-+    mHalBuffer.s.size = CameraUtils::getFrameSize(mHalBuffer.s.format,
-+                                                  mHalBuffer.s.stride, mHalBuffer.s.height);
-+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
-+    mLocked = false;
-+    mInit = true;
-+    mHalBuffer.addr = nullptr;
-+    mUserBuffer = *aBuffer;
-+    mUserBuffer.release_fence = -1;
-+    mCameraId = cameraId;
-+    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d, size: %d",
-+         __func__, mHandle, mFormat, mHalBuffer.s.width, mHalBuffer.s.height,
-+         mHalBuffer.s.stride, mHalBuffer.s.size);
-+
-+    if (mHandle == nullptr) {
-+        LOGE("@%s: invalid buffer handle", __func__);
-+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
-+        return BAD_VALUE;
-+    }
-+
-+    mHalBuffer.dmafd = mHandle->data[0];
-+    int ret = registerBuffer();
-+    if (ret) {
-+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    /* TODO: add some consistency checks here and return an error */
-+    return icamera::OK;
-+}
-+
-+icamera::status_t Camera3Buffer::init(const camera3_stream_t* stream,
-+                                      buffer_handle_t handle, int cameraId)
-+{
-+    mType = BUF_TYPE_HANDLE;
-+    mGbmBufferManager = cros::CameraBufferManager::GetInstance();
-+    mHandle = handle;
-+    mHalBuffer.s.width = stream->width;
-+    mHalBuffer.s.height = stream->height;
-+    mFormat = stream->format;
-+    mHalBuffer.s.memType = V4L2_MEMORY_USERPTR;
-+    mHalBuffer.s.format = mGbmBufferManager->GetV4L2PixelFormat(mHandle);
-+    // Use actual width from platform native handle for stride
-+    mHalBuffer.s.stride = mGbmBufferManager->GetPlaneStride(handle, 0);
-+    mHalBuffer.s.size = 0;
-+    mHalBuffer.flags = camera_buffer_flags_t::BUFFER_FLAG_SW_WRITE;
-+    mLocked = false;
-+    mInit = true;
-+    mHalBuffer.addr = nullptr;
-+    mCameraId = cameraId;
-+    LOG2("@%s, mHandle:%p, mFormat:%d, width:%d, height:%d, stride:%d",
-+         __func__, mHandle, mFormat, mHalBuffer.s.width, mHalBuffer.s.height, mHalBuffer.s.stride);
-+
-+    return icamera::OK;
-+}
-+
-+icamera::status_t Camera3Buffer::deinit()
-+{
-+    return deregisterBuffer();
-+}
-+
-+icamera::status_t Camera3Buffer::waitOnAcquireFence()
-+{
-+    const int BUFFER_READY = -1;
-+    if (mUserBuffer.acquire_fence != BUFFER_READY) {
-+        LOG2("%s: Fence in HAL is %d", __func__, mUserBuffer.acquire_fence);
-+        const int WAIT_TIME_OUT_MS = 300;
-+        int ret = sync_wait(mUserBuffer.acquire_fence, WAIT_TIME_OUT_MS);
-+        if (ret) {
-+            mUserBuffer.release_fence = mUserBuffer.acquire_fence;
-+            mUserBuffer.acquire_fence = -1;
-+            mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
-+            LOGE("Buffer sync_wait fail!");
-+            return TIMED_OUT;
-+        } else {
-+            close(mUserBuffer.acquire_fence);
-+        }
-+        mUserBuffer.acquire_fence = BUFFER_READY;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+/**
-+ * getFence
-+ *
-+ * return the fecne to request result
-+ */
-+icamera::status_t Camera3Buffer::getFence(camera3_stream_buffer* buf)
-+{
-+    if (!buf)
-+        return BAD_VALUE;
-+
-+    buf->acquire_fence = mUserBuffer.acquire_fence;
-+    buf->release_fence = mUserBuffer.release_fence;
-+
-+    return icamera::OK;
-+}
-+
-+icamera::status_t Camera3Buffer::registerBuffer()
-+{
-+    int ret = mGbmBufferManager->Register(mHandle);
-+    if (ret) {
-+        LOGE("@%s: call Register fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    mRegistered = true;
-+    return icamera::OK;
-+}
-+
-+icamera::status_t Camera3Buffer::deregisterBuffer()
-+{
-+    if (mRegistered) {
-+        int ret = mGbmBufferManager->Deregister(mHandle);
-+        if (ret) {
-+            LOGE("@%s: call Deregister fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
-+            return UNKNOWN_ERROR;
-+        }
-+        mRegistered = false;
-+    }
-+
-+    return icamera::OK;
-+}
-+
-+/**
-+ * lock
-+ *
-+ * lock the gralloc buffer with specified flags
-+ *
-+ * \param aBuffer [IN] int flags
-+ */
-+icamera::status_t Camera3Buffer::lock(int flags)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    mHalBuffer.addr = nullptr;
-+    mHalBuffer.s.size = 0;
-+    int ret = 0;
-+    uint32_t planeNum = mGbmBufferManager->GetNumPlanes(mHandle);
-+    LOG2("@%s, planeNum:%d, mHandle:%p, mFormat:%d", __func__, planeNum, mHandle, mFormat);
-+
-+    if (planeNum == 1) {
-+        void* data = nullptr;
-+        ret = (mFormat == HAL_PIXEL_FORMAT_BLOB)
-+              ? mGbmBufferManager->Lock(mHandle, 0, 0, 0, mHalBuffer.s.stride, 1, &data)
-+              : mGbmBufferManager->Lock(mHandle, 0, 0, 0,
-+                                        mHalBuffer.s.width, mHalBuffer.s.height, &data);
-+        mHalBuffer.addr = data;
-+    } else if (planeNum > 1) {
-+        struct android_ycbcr ycbrData;
-+        ret = mGbmBufferManager->LockYCbCr(mHandle, 0, 0, 0,
-+                                           mHalBuffer.s.width, mHalBuffer.s.height, &ycbrData);
-+        mHalBuffer.addr = ycbrData.y;
-+    } else {
-+        LOGE("ERROR @%s: planeNum is 0", __func__);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    CheckError(ret, UNKNOWN_ERROR,
-+               "@%s: Failed to lock buffer, mHandle:%p planeNum: %d", __func__, mHandle, planeNum);
-+
-+    for (uint32_t i = 0; i < planeNum; i++) {
-+        mHalBuffer.s.size += mGbmBufferManager->GetPlaneSize(mHandle, i);
-+    }
-+
-+    LOG2("@%s, addr:%p, size:%d", __func__, mHalBuffer.addr, mHalBuffer.s.size);
-+    CheckError(!mHalBuffer.s.size, UNKNOWN_ERROR,
-+               "ERROR @%s: Failed to GetPlaneSize, it's 0", __func__);
-+
-+    mLocked = true;
-+
-+    return icamera::OK;
-+}
-+
-+icamera::status_t Camera3Buffer::lock()
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    icamera::status_t status;
-+    int lockMode;
-+
-+    if (!mInit) {
-+        LOGE("@%s: Error: Cannot lock now this buffer, not initialized", __func__);
-+        return INVALID_OPERATION;
-+    }
-+
-+    if (mType != BUF_TYPE_HANDLE) {
-+         mLocked = true;
-+         return icamera::OK;
-+    }
-+
-+    if (mLocked) {
-+        LOGE("@%s: Error: Cannot lock buffer, already locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+
-+    int usage = 0x20003;  // TODO: hard code the usage, fix to get the usage from stream later
-+    lockMode = usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK |
-+               GRALLOC_USAGE_HW_CAMERA_MASK);
-+    if (!lockMode) {
-+        LOGW("@%s:trying to lock a buffer with no flags", __func__);
-+        return INVALID_OPERATION;
-+    }
-+
-+    status = lock(lockMode);
-+    if (status != icamera::OK) {
-+        mUserBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
-+    }
-+
-+    return status;
-+}
-+
-+icamera::status_t Camera3Buffer::unlock()
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    if (mLocked && mType != BUF_TYPE_HANDLE) {
-+         mLocked = false;
-+         return icamera::OK;
-+    }
-+
-+    if (mLocked) {
-+        LOG2("@%s, mHandle:%p, mFormat:%d", __func__, mHandle, mFormat);
-+        int ret = mGbmBufferManager->Unlock(mHandle);
-+        if (ret) {
-+            LOGE("@%s: call Unlock fail, mHandle:%p, ret:%d", __func__, mHandle, ret);
-+            return UNKNOWN_ERROR;
-+        }
-+
-+        mLocked = false;
-+        return icamera::OK;
-+    }
-+    LOG1("@%s:trying to unlock a buffer that is not locked", __func__);
-+    return INVALID_OPERATION;
-+}
-+
-+void Camera3Buffer::dump()
-+{
-+    if (mInit) {
-+        LOG1("Buffer dump: handle %p: locked :%d: dataPtr:%p",
-+             static_cast<void*>(&mHandle), mLocked, mHalBuffer.addr);
-+    } else {
-+        LOG1("Buffer dump: Buffer not initialized");
-+    }
-+}
-+
-+void Camera3Buffer::dumpImage(int frameNumber, const int type, int format)
-+{
-+    if (!CameraDump::isDumpTypeEnable(type)) {
-+        return;
-+    }
-+
-+    dumpImage(mHalBuffer.addr, frameNumber, mHalBuffer.s.size,
-+              mHalBuffer.s.width, mHalBuffer.s.height, format);
-+}
-+
-+void Camera3Buffer::dumpImage(const void *data, int frameNumber,
-+                              const int size, int width, int height,
-+                              int format) const
-+{
-+#ifdef DUMP_IMAGE
-+    static unsigned int count = 0;
-+    count++;
-+
-+    std::string fileName(gDumpPath);
-+    fileName += "dump_" + std::to_string(width) +"x" + std::to_string(height)
-+                             + "_frame#" + std::to_string(count)
-+                             + "_req#" + std::to_string(frameNumber)
-+                             + "." + CameraUtils::format2string(format).c_str();
-+    LOG2("%s filename is %s", __func__, fileName.data());
-+
-+    FILE *fp = fopen (fileName.data(), "w+");
-+    if (fp == nullptr) {
-+        LOGE("open file failed");
-+        return;
-+    }
-+    LOG1("Begin write image %s", fileName.data());
-+
-+    if ((fwrite(data, size, 1, fp)) != 1)
-+        LOGW("Error or short count writing %d bytes to %s", size, fileName.data());
-+    fclose (fp);
-+#endif
-+}
-+
-+int Camera3Buffer::v4L2Fmt2GFXFmt(int v4l2Fmt)
-+{
-+    int gfxFmt = -1;
-+
-+    switch (v4l2Fmt) {
-+    case V4L2_PIX_FMT_JPEG:
-+        gfxFmt = HAL_PIXEL_FORMAT_BLOB;
-+        break;
-+    case V4L2_PIX_FMT_SBGGR8:
-+    case V4L2_PIX_FMT_SRGGB8:
-+    case V4L2_PIX_FMT_SGRBG8:
-+    case V4L2_PIX_FMT_SRGGB10:
-+    case V4L2_PIX_FMT_SGRBG10:
-+    case V4L2_PIX_FMT_SGRBG12:
-+    case V4L2_PIX_FMT_SBGGR10:
-+    case V4L2_PIX_FMT_SBGGR10P:
-+    case V4L2_PIX_FMT_SGBRG10P:
-+    case V4L2_PIX_FMT_SGRBG10P:
-+    case V4L2_PIX_FMT_SRGGB10P:
-+    case V4L2_PIX_FMT_SBGGR12:
-+    case V4L2_PIX_FMT_SGBRG12:
-+    case V4L2_PIX_FMT_SRGGB12:
-+        gfxFmt = HAL_PIXEL_FORMAT_RAW16;
-+        break;
-+    case V4L2_PIX_FMT_YVU420:
-+        gfxFmt = HAL_PIXEL_FORMAT_YV12;
-+        break;
-+    case V4L2_PIX_FMT_NV21:
-+        gfxFmt = HAL_PIXEL_FORMAT_YCrCb_420_SP;
-+        break;
-+    case V4L2_PIX_FMT_NV12:
-+        LOGW("Current there is no gfx format for V4L2_PIX_FMT_NV12.");
-+        break;
-+    case V4L2_PIX_FMT_YUYV:
-+        gfxFmt = HAL_PIXEL_FORMAT_YCbCr_422_I;
-+        break;
-+    default:
-+        LOGE("%s: no gfx format for v4l2 0x%x, %s!", __func__,
-+             v4l2Fmt, CameraUtils::format2string(v4l2Fmt).c_str());
-+        break;
-+    }
-+
-+    return gfxFmt;
-+}
-+
-+/**
-+ * Utility methods to allocate Camera3Buffer from HEAP or Gfx memory
-+ */
-+namespace MemoryUtils {
-+
-+/**
-+ * Allocates the memory needed to store the image described by the parameters
-+ * passed during construction
-+ */
-+std::shared_ptr<Camera3Buffer>
-+allocateHeapBuffer(int w,
-+                   int h,
-+                   int stride,
-+                   int v4l2Fmt,
-+                   int cameraId,
-+                   int dataSizeOverride)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    void *dataPtr;
-+
-+    int dataSize = dataSizeOverride ? PAGE_ALIGN(dataSizeOverride) : CameraUtils::getFrameSize(v4l2Fmt, stride, h);
-+    LOG1("@%s, dataSize:%d", __func__, dataSize);
-+
-+    int ret = posix_memalign(&dataPtr, sysconf(_SC_PAGESIZE), dataSize);
-+    if (dataPtr == nullptr || ret != 0) {
-+        LOGE("Could not allocate heap camera buffer of size %d", dataSize);
-+        return nullptr;
-+    }
-+
-+    return std::shared_ptr<Camera3Buffer>(new Camera3Buffer(w, h, stride, v4l2Fmt, dataPtr, cameraId, dataSize));
-+}
-+
-+/**
-+ * Allocates internal GBM buffer
-+ */
-+std::shared_ptr<Camera3Buffer>
-+allocateHandleBuffer(int w,
-+                     int h,
-+                     int gfxFmt,
-+                     int usage,
-+                     int cameraId)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    cros::CameraBufferManager* bufManager = cros::CameraBufferManager::GetInstance();
-+    buffer_handle_t handle;
-+    uint32_t stride = 0;
-+
-+    LOG1("%s, [wxh] = [%dx%d], format 0x%x, usage 0x%x",
-+          __func__, w, h, gfxFmt, usage);
-+    int ret = bufManager->Allocate(w, h, gfxFmt, usage, cros::GRALLOC, &handle, &stride);
-+    if (ret != 0) {
-+        LOGE("Allocate handle failed! %d", ret);
-+        return nullptr;
-+    }
-+
-+    std::shared_ptr<Camera3Buffer> buffer(new Camera3Buffer());
-+    camera3_stream_t stream{};
-+    stream.width = w;
-+    stream.height = h;
-+    stream.format = gfxFmt;
-+    stream.usage = usage;
-+    ret = buffer->init(&stream, handle, cameraId);
-+    if (ret != icamera::OK) {
-+        // buffer handle will free in Camera3Buffer destructure function
-+        return nullptr;
-+    }
-+
-+    return buffer;
-+}
-+
-+}
-+} // namespace camera3
-diff --git a/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
-new file mode 100644
-index 000000000000..518f1417bd19
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/memory/chrome/Camera3Buffer.h
-@@ -0,0 +1,169 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <hardware/camera3.h>
-+#include <cros-camera/camera_buffer_manager.h>
-+#include <memory>
-+#include "iutils/Errors.h"
-+
-+#include "iutils/Errors.h"
-+#include "Parameters.h"
-+
-+namespace camera3 {
-+
-+// Forward declaration to  avoid extra include
-+class Camera3Stream;
-+
-+enum Camera3BufferType {
-+    BUF_TYPE_HANDLE,
-+    BUF_TYPE_MALLOC,
-+    BUF_TYPE_MMAP,
-+};
-+
-+/**
-+ * \class Camera3Buffer
-+ *
-+ * This class is the buffer abstraction in the HAL. It can store buffers
-+ * provided by the framework or buffers allocated by the HAL.
-+ * Allocation in the HAL can be done via gralloc, malloc or mmap
-+ * in case of mmap the memory cannot be freed
-+ */
-+class Camera3Buffer {
-+public:
-+    /**
-+     * default constructor
-+     * Used for buffers coming from the framework. The wrapper is initialized
-+     * using the method init
-+     */
-+    Camera3Buffer();
-+
-+    /**
-+     * no need to delete a buffer since it is RefBase'd. Buffer will be deleted
-+     * when no reference to it exist.
-+     */
-+    ~Camera3Buffer();
-+
-+    /**
-+     * constructor for the HAL-allocated buffer
-+     * These are used via the utility methods in the MemoryUtils namespace
-+     */
-+    Camera3Buffer(int w, int h, int stride, int v4l2fmt, void* usrPtr,
-+                  int cameraId, int dataSizeOverride = 0);
-+
-+    /**
-+     * initialization for the wrapper around the framework buffers
-+     */
-+    icamera::status_t init(const camera3_stream_buffer *aBuffer, int cameraId);
-+
-+    /**
-+     * initialization for the fake framework buffer (allocated by the HAL)
-+     */
-+    icamera::status_t init(const camera3_stream_t* stream,
-+                           buffer_handle_t buffer, int cameraId);
-+    /**
-+     * deinitialization for the wrapper around the framework buffers
-+     */
-+    icamera::status_t deinit();
-+
-+    /**
-+     * dump functions
-+     */
-+    void dump();
-+    void dumpImage(int frameNumber, const int type, int format);
-+    void dumpImage(const void *data, int frameNumber, const int size, int width, int height,
-+                   int format) const;
-+
-+    /**
-+     * lock the buffer and get buffer addr from handle
-+     */
-+    icamera::status_t lock();
-+    icamera::status_t unlock();
-+
-+    /**
-+     * Fence
-+     */
-+    icamera::status_t waitOnAcquireFence();
-+    icamera::status_t getFence(camera3_stream_buffer* buf);
-+
-+    /**
-+     * Convert the GFX format to v4l2 format
-+     */
-+    int v4L2Fmt2GFXFmt(int v4l2Fmt);
-+
-+    /**
-+     * APIs for getting private member
-+     */
-+    int width() {return mHalBuffer.s.width;}
-+    int height() {return mHalBuffer.s.height;}
-+    int stride() {return mHalBuffer.s.stride;}
-+    unsigned int size() {return mHalBuffer.s.size;}
-+    int v4l2Fmt() {return mHalBuffer.s.format;}
-+    void *data() {return mHalBuffer.addr;}
-+    uint64_t getTimeStamp() {return mHalBuffer.timestamp;}
-+    void setTimeStamp(uint64_t timestamp) {mHalBuffer.timestamp = timestamp;}
-+    int format() {return mFormat;}
-+    buffer_handle_t *getBufferHandle() {return mHandlePtr;}
-+    bool isLocked() const {return mLocked;}
-+    int dmaBufFd() {return mType == BUF_TYPE_HANDLE ? mHandle->data[0] : mHalBuffer.dmafd;}
-+    int status() {return mUserBuffer.status;}
-+    camera3_stream_t* getStream() {return mUserBuffer.stream;}
-+    icamera::camera_buffer_t getHalBuffer() {return mHalBuffer;}
-+
-+private:
-+    icamera::status_t lock(int flags);
-+    icamera::status_t registerBuffer();
-+    icamera::status_t deregisterBuffer();
-+
-+private:
-+     /*!< Original structure passed by request */
-+    camera3_stream_buffer_t mUserBuffer = {0, 0, 0, -1, -1};
-+    int             mFormat;         /*!<  HAL PIXEL fmt */
-+    bool            mInit;           /*!< Boolean to check the integrity of the
-+                                          buffer when it is created*/
-+    bool            mLocked;         /*!< Use to track the lock status */
-+    Camera3BufferType mType;
-+
-+    buffer_handle_t mHandle = {};
-+    buffer_handle_t* mHandlePtr;
-+    int mCameraId;
-+    icamera::camera_buffer_t mHalBuffer;
-+
-+private:
-+    bool            mRegistered;     /*!< Use to track the buffer register status */
-+    cros::CameraBufferManager* mGbmBufferManager;
-+};
-+
-+namespace MemoryUtils {
-+
-+std::shared_ptr<Camera3Buffer>
-+allocateHeapBuffer(int w,
-+                   int h,
-+                   int stride,
-+                   int v4l2Fmt,
-+                   int cameraId,
-+                   int dataSizeOverride = 0);
-+
-+std::shared_ptr<Camera3Buffer>
-+allocateHandleBuffer(int w,
-+                     int h,
-+                     int gfxFmt,
-+                     int usage,
-+                     int cameraId);
-+};
-+
-+}
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
-new file mode 100644
-index 000000000000..f965fb001493
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
-@@ -0,0 +1,108 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+
-+#include <iostream>
-+#include <string>
-+
-+namespace icamera {
-+const char* IntelAlgoIpcCmdToString(IPC_CMD cmd) {
-+    static const char* gIpcCmdMapping[] = {
-+        "unknown",
-+        "IPC_LARD_INIT",
-+        "IPC_LARD_GET_TAG_LIST",
-+        "IPC_LARD_RUN",
-+        "IPC_LARD_DEINIT",
-+        "IPC_FD_INIT",
-+        "IPC_FD_RUN",
-+        "IPC_FD_DEINIT",
-+        "IPC_GRAPH_ADD_KEY",
-+        "IPC_GRAPH_PARSE",
-+        "IPC_GRAPH_RELEASE_NODES",
-+        "IPC_GRAPH_CONFIG_STREAMS",
-+        "IPC_GRAPH_GET_CONFIG_DATA",
-+        "IPC_GRAPH_GET_CONNECTION",
-+        "IPC_GRAPH_GET_PG_ID",
-+        "IPC_CMC_INIT",
-+        "IPC_CMC_DEINIT",
-+        "IPC_MKN_INIT",
-+        "IPC_MKN_ENABLE",
-+        "IPC_MKN_PREPARE",
-+        "IPC_MKN_DEINIT",
-+        "IPC_LTM_INIT",
-+        "IPC_LTM_RUN",
-+        "IPC_LTM_DEINIT",
-+        "IPC_AIQ_INIT",
-+        "IPC_AIQ_AE_RUN",
-+        "IPC_AIQ_AF_RUN",
-+        "IPC_AIQ_AWB_RUN",
-+        "IPC_AIQ_GBCE_RUN",
-+        "IPC_AIQ_PA_RUN_V1",
-+        "IPC_AIQ_SA_RUN_V2",
-+        "IPC_AIQ_STATISTICS_SET_V4",
-+        "IPC_AIQ_GET_AIQD_DATA",
-+        "IPC_AIQ_DEINIT",
-+        "IPC_AIQ_GET_VERSION",
-+        "IPC_DVS_INIT",
-+        "IPC_DVS_CONFIG",
-+        "IPC_DVS_SET_NONE_BLANK_RATION",
-+        "IPC_DVS_SET_DIGITAL_ZOOM_MODE",
-+        "IPC_DVS_SET_DIGITAL_ZOOM_REGION",
-+        "IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE",
-+        "IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE",
-+        "IPC_DVS_FREE_MORPH_TABLE",
-+        "IPC_DVS_ALLOCATE_MORPH_TABLE",
-+        "IPC_DVS_GET_MORPH_TABLE",
-+        "IPC_DVS_SET_STATISTICS",
-+        "IPC_DVS_EXECUTE",
-+        "IPC_DVS_GET_IMAGE_TRANSFORMATION",
-+        "IPC_DVS_DEINIT",
-+        "IPC_ISP_ADAPTOR_INIT",
-+        "IPC_ISP_ADAPTOR_DEINIT",
-+        "IPC_ISP_GET_PAL_SIZE",
-+        "IPC_ISP_CONVERT_STATS",
-+        "IPC_ISP_RUN_PAL",
-+        "IPC_PG_PARAM_INIT",
-+        "IPC_PG_PARAM_PREPARE",
-+        "IPC_PG_PARAM_ALLOCATE_PG",
-+        "IPC_PG_PARAM_GET_FRAG_DESCS",
-+        "IPC_PG_PARAM_PREPARE_PROGRAM",
-+        "IPC_PG_PARAM_ALLOCATE_PAYLOADS",
-+        "IPC_PG_PARAM_ENCODE",
-+        "IPC_PG_PARAM_DECODE",
-+        "IPC_PG_PARAM_DEINIT"
-+    };
-+
-+    unsigned int num = sizeof(gIpcCmdMapping) / sizeof(gIpcCmdMapping[0]);
-+    return cmd < num ? gIpcCmdMapping[cmd] : gIpcCmdMapping[0];
-+}
-+
-+IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd) {
-+    IPC_GROUP group = IPC_GROUP_OTHER;
-+    if (cmd >= IPC_AIQ_INIT && cmd <= IPC_AIQ_GET_VERSION) {
-+        group = IPC_GROUP_AIQ;
-+    } else if (cmd >= IPC_PG_PARAM_INIT && cmd <= IPC_PG_PARAM_DEINIT) {
-+        group = IPC_GROUP_PSYS;
-+    } else if (cmd >= IPC_FD_INIT && cmd <= IPC_FD_DEINIT) {
-+        group = IPC_GROUP_FD;
-+    } else {
-+        group = IPC_GROUP_OTHER;
-+    }
-+
-+    return group;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
-new file mode 100644
-index 000000000000..92a5852be7b1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_cmc_types.h>
-+#include <ia_types.h>
-+#include <ia_aiq_types.h>
-+
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+#define IPC_MATCHING_KEY 0x56  // the value is randomly chosen
-+#define IPC_REQUEST_HEADER_USED_NUM 1
-+#define SHM_NAME "shm"
-+
-+enum IPC_CMD {
-+    IPC_LARD_INIT = 1,
-+    IPC_LARD_GET_TAG_LIST,
-+    IPC_LARD_RUN,
-+    IPC_LARD_DEINIT,
-+    IPC_FD_INIT,
-+    IPC_FD_RUN,
-+    IPC_FD_DEINIT,
-+    IPC_GRAPH_ADD_KEY,
-+    IPC_GRAPH_PARSE,
-+    IPC_GRAPH_RELEASE_NODES,
-+    IPC_GRAPH_CONFIG_STREAMS,
-+    IPC_GRAPH_GET_CONFIG_DATA,
-+    IPC_GRAPH_GET_CONNECTION,
-+    IPC_GRAPH_GET_PG_ID,
-+    IPC_CMC_INIT,
-+    IPC_CMC_DEINIT,
-+    IPC_MKN_INIT,
-+    IPC_MKN_ENABLE,
-+    IPC_MKN_PREPARE,
-+    IPC_MKN_DEINIT,
-+    IPC_LTM_INIT,
-+    IPC_LTM_RUN,
-+    IPC_LTM_DEINIT,
-+    IPC_AIQ_INIT,
-+    IPC_AIQ_AE_RUN,
-+    IPC_AIQ_AF_RUN,
-+    IPC_AIQ_AWB_RUN,
-+    IPC_AIQ_GBCE_RUN,
-+    IPC_AIQ_PA_RUN_V1,
-+    IPC_AIQ_SA_RUN_V2,
-+    IPC_AIQ_STATISTICS_SET_V4,
-+    IPC_AIQ_GET_AIQD_DATA,
-+    IPC_AIQ_DEINIT,
-+    IPC_AIQ_GET_VERSION,
-+    IPC_DVS_INIT,
-+    IPC_DVS_CONFIG,
-+    IPC_DVS_SET_NONE_BLANK_RATION,
-+    IPC_DVS_SET_DIGITAL_ZOOM_MODE,
-+    IPC_DVS_SET_DIGITAL_ZOOM_REGION,
-+    IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE,
-+    IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE,
-+    IPC_DVS_FREE_MORPH_TABLE,
-+    IPC_DVS_ALLOCATE_MORPH_TABLE,
-+    IPC_DVS_GET_MORPH_TABLE,
-+    IPC_DVS_SET_STATISTICS,
-+    IPC_DVS_EXECUTE,
-+    IPC_DVS_GET_IMAGE_TRANSFORMATION,
-+    IPC_DVS_DEINIT,
-+    IPC_ISP_ADAPTOR_INIT,
-+    IPC_ISP_ADAPTOR_DEINIT,
-+    IPC_ISP_GET_PAL_SIZE,
-+    IPC_ISP_CONVERT_STATS,
-+    IPC_ISP_RUN_PAL,
-+    IPC_PG_PARAM_INIT,
-+    IPC_PG_PARAM_PREPARE,
-+    IPC_PG_PARAM_ALLOCATE_PG,
-+    IPC_PG_PARAM_GET_FRAG_DESCS,
-+    IPC_PG_PARAM_PREPARE_PROGRAM,
-+    IPC_PG_PARAM_ALLOCATE_PAYLOADS,
-+    IPC_PG_PARAM_ENCODE,
-+    IPC_PG_PARAM_DECODE,
-+    IPC_PG_PARAM_DEINIT
-+};
-+
-+#define MAX_IA_BINARY_DATA_SIZE 800000
-+struct ia_binary_data_mod {
-+    unsigned int size;
-+    char data[MAX_IA_BINARY_DATA_SIZE];
-+};
-+
-+const char* IntelAlgoIpcCmdToString(IPC_CMD cmd);
-+
-+enum IPC_GROUP {
-+    IPC_GROUP_AIQ,
-+    IPC_GROUP_PSYS,
-+    IPC_GROUP_FD,
-+    IPC_GROUP_OTHER
-+};
-+#define IPC_GROUP_NUM (IPC_GROUP_OTHER + 1)
-+
-+IPC_GROUP IntelAlgoIpcCmdToGroup(IPC_CMD cmd);
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
-new file mode 100644
-index 000000000000..45faca4f17ed
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.cpp
-@@ -0,0 +1,495 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_GRAPH_CONFIG"
-+
-+#include "modules/sandboxing/IPCGraphConfig.h"
-+
-+#include <sys/stat.h>
-+#include <memory>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IPCGraphConfig::IPCGraphConfig() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCGraphConfig::~IPCGraphConfig() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+status_t IPCGraphConfig::readDataFromXml(const char *fileName,
-+                                         char *dataPtr, size_t *dataSize, int maxSize) {
-+    CheckError(!dataSize || !fileName || !dataPtr,
-+               UNKNOWN_ERROR, "%s, invalid argument", __func__);
-+
-+    struct stat statBuf;
-+    int ret = stat(fileName, &statBuf);
-+    CheckError((ret != 0), UNKNOWN_ERROR, "Failed to query the size of file: %s!", fileName);
-+    CheckError(statBuf.st_size > maxSize, BAD_VALUE,
-+               "The memory size less than file size: %s", fileName);
-+
-+    *dataSize = static_cast<size_t>(statBuf.st_size);
-+    LOGIPC("%s, fileName: %s, size: %zu", __func__, fileName, *dataSize);
-+
-+    FILE *file = fopen(fileName, "rb");
-+    CheckError(!file, NAME_NOT_FOUND, "%s, Failed to open file: %s", __func__, fileName);
-+
-+    size_t len = fread(dataPtr, 1, *dataSize, file);
-+    fclose(file);
-+
-+    CheckError((len != *dataSize), UNKNOWN_ERROR,
-+               "%s, Failed to read data from file: %s", __func__, fileName);
-+
-+    return OK;
-+}
-+
-+bool IPCGraphConfig::clientFlattenParse(void *pData, uint32_t size, int cameraId,
-+                                        const char *graphDescFile, const char *settingsFile) {
-+    LOGIPC("@%s, pData:%p, size: %zu, cameraId: %d", __func__, pData, size, cameraId);
-+
-+    CheckError(!pData || !graphDescFile || !settingsFile, false,
-+               "@%s, pData, graphDescFile or settingsFile is nullptr", __func__);
-+    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphParseParams *params = static_cast<GraphParseParams*>(pData);
-+    CLEAR(*params);
-+
-+    params->cameraId = cameraId;
-+    int ret = readDataFromXml(graphDescFile, params->GD,
-+                              &(params->gdSize), MAX_GRAPH_DESCRIPTOR_SIZE);
-+    CheckError(ret != OK, false, "Failed to read the graph descriptor file: %s", graphDescFile);
-+
-+    ret = readDataFromXml(settingsFile, params->GS,
-+                          &(params->gsSize), MAX_GRAPH_SETTINGS_SIZE);
-+    CheckError(ret != OK, false, "Failed to read the graph settings file: %s", settingsFile);
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverUnflattenParse(void *pData, uint32_t size,
-+                                          GraphParseParams **parseParam) {
-+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphParseParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!parseParam, false, "@%s, parseParam is nullptr", __func__);
-+
-+    GraphParseParams *params = static_cast<GraphParseParams*>(pData);
-+    *parseParam = params;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientFlattenConfigStreams(void *pData, uint32_t size,
-+                                                GraphBaseInfo info, GraphSettingType type,
-+                                                const std::vector<HalStream*> &streams) {
-+    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d",
-+           __func__, pData, info.cameraId, info.configMode);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphConfigStreamParams),
-+               false, "@%s, buffer is small", __func__);
-+    CheckError(streams.empty(), false, "@%s, stream vector is empty", __func__);
-+
-+    GraphConfigStreamParams *params = static_cast<GraphConfigStreamParams*>(pData);
-+    CLEAR(*params);
-+
-+    params->baseInfo = info;
-+    params->type = type;
-+    for (size_t i = 0; i < streams.size(); ++i) {
-+        params->streamCfg[i] = *(streams[i]);
-+        params->streamPriv[i] = *(static_cast<stream_t*>(streams[i]->mPrivate));
-+        params->streamNum++;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverUnflattenConfigStreams(void *pData, uint32_t size,
-+                                                  GraphBaseInfo *info, GraphSettingType *type,
-+                                                  std::vector<HalStream*> *streams) {
-+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphConfigStreamParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!info || !type || !streams, false,
-+               "%s, the info, type or streams is nullptr", __func__);
-+
-+    GraphConfigStreamParams *params = static_cast<GraphConfigStreamParams*>(pData);
-+
-+    *info = params->baseInfo;
-+    *type = params->type;
-+    for (uint32_t i = 0; i < params->streamNum; ++i) {
-+        params->streamCfg[i].mPrivate = static_cast<void *>(&(params->streamPriv[i]));
-+        streams->push_back(&(params->streamCfg[i]));
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientFlattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo info) {
-+    LOGIPC("@%s, pData:%p, cameraId: %d, configMode: %d",
-+           __func__, pData, info.cameraId, info.configMode);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
-+    CLEAR(*params);
-+
-+    params->baseInfo = info;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverUnflattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo *info) {
-+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
-+
-+    CheckError(!pData || !info, false, "@%s, pData or info is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
-+    *info = params->baseInfo;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverFlattenGetGraphData(void *pData, uint32_t size,
-+                                               IGraphType::GraphConfigData graphData) {
-+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
-+
-+    params->mcId = graphData.mcId;
-+    params->graphId = graphData.graphId;
-+    params->gdcKernelId = graphData.gdcKernelId;
-+
-+    params->csiReso = graphData.csiReso;
-+    params->gdcReso = graphData.gdcReso;
-+
-+    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d",
-+           __func__, params->mcId, params->graphId, params->gdcKernelId);
-+
-+    params->streamIdNum = graphData.streamIds.size();
-+    for (size_t i = 0; i < graphData.streamIds.size(); ++i) {
-+        params->streamIdData[i] = graphData.streamIds[i];
-+    }
-+
-+    params->pgInfoNum = graphData.pgInfo.size();
-+    for (size_t i = 0; i < graphData.pgInfo.size(); ++i) {
-+        size_t len = graphData.pgInfo[i].pgName.copy(params->pgInfoData[i].pgName, MAX_NAME_LENGTH);
-+        params->pgInfoData[i].pgName[len] = '\0';
-+        params->pgInfoData[i].pgId = graphData.pgInfo[i].pgId;
-+        params->pgInfoData[i].streamId = graphData.pgInfo[i].streamId;
-+        params->pgInfoData[i].rbmByte = graphData.pgInfo[i].rbmValue.rbm_bytes;
-+
-+        if (params->pgInfoData[i].rbmByte > 0) {
-+            MEMCPY_S(params->pgInfoData[i].rbmData, MAX_NAME_LENGTH,
-+                     graphData.pgInfo[i].rbmValue.rbm, graphData.pgInfo[i].rbmValue.rbm_bytes);
-+        }
-+    }
-+
-+    params->mBrInfoNum = graphData.mbrInfo.size();
-+    for (size_t i = 0; i < graphData.mbrInfo.size(); ++i) {
-+        params->mBrInfoData[i].streamId = graphData.mbrInfo[i].streamId;
-+        params->mBrInfoData[i].mBrData = graphData.mbrInfo[i].data;
-+    }
-+
-+    params->pgNamesNum = graphData.pgNames.size();
-+    for (size_t i = 0; i < params->pgNamesNum; ++i) {
-+        size_t len = graphData.pgNames[i].copy(params->pgNames[i], MAX_NAME_LENGTH);
-+        params->pgNames[i][len] = '\0';
-+    }
-+
-+    params->kernelArrayNum = graphData.programGroup.size();
-+    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
-+        params->kernelArray[i].streamId = graphData.programGroup[i].streamId;
-+        ia_isp_bxt_program_group *pgPtr = graphData.programGroup[i].pgPtr;
-+        params->kernelArray[i].group = *pgPtr;
-+
-+        for (unsigned int j = 0; j < params->kernelArray[i].group.kernel_count; ++j) {
-+            params->kernelArray[i].runKernels[j] = pgPtr->run_kernels[j];
-+            if (pgPtr->run_kernels[j].resolution_info) {
-+                params->kernelArray[i].resoInfo[j] = *(pgPtr->run_kernels[j].resolution_info);
-+                params->kernelArray[i].runKernels[j].resolution_info =
-+                    &(params->kernelArray[i].resoInfo[j]);
-+            } else {
-+                params->kernelArray[i].runKernels[j].resolution_info = nullptr;
-+            }
-+
-+            if (pgPtr->run_kernels[j].resolution_history) {
-+                params->kernelArray[i].resoHistory[j] =
-+                    *(pgPtr->run_kernels[j].resolution_history);
-+                params->kernelArray[i].runKernels[j].resolution_history =
-+                    &(params->kernelArray[i].resoHistory[j]);
-+            } else {
-+                params->kernelArray[i].runKernels[j].resolution_history = nullptr;
-+            }
-+        }
-+        params->kernelArray[i].group.run_kernels = params->kernelArray[i].runKernels;
-+
-+        if (pgPtr->pipe) {
-+            params->kernelArray[i].pipeInfo = *(pgPtr->pipe);
-+            params->kernelArray[i].group.pipe = &(params->kernelArray[i].pipeInfo);
-+        } else {
-+            params->kernelArray[i].group.pipe = nullptr;
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientUnflattenGetGraphData(void *pData, uint32_t size,
-+                                                 IGraphType::GraphConfigData *graphData) {
-+    LOGIPC("@%s, pData:%p, size: %zu", __func__, pData, size);
-+
-+    CheckError(!pData || !graphData, false, "@%s, pData or graphData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetDataParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetDataParams *params = static_cast<GraphGetDataParams*>(pData);
-+
-+    graphData->mcId = params->mcId;
-+    graphData->graphId = params->graphId;
-+    graphData->gdcKernelId = params->gdcKernelId;
-+
-+    graphData->csiReso = params->csiReso;
-+    graphData->gdcReso = params->gdcReso;
-+
-+    LOGIPC("%s, mcId: %d, graphId: %d, gdcKernelId: %d",
-+           __func__, params->mcId, params->graphId, params->gdcKernelId);
-+
-+    for (size_t i = 0; i < params->streamIdNum; ++i) {
-+        graphData->streamIds.push_back(params->streamIdData[i]);
-+    }
-+
-+    for (size_t i = 0; i < params->pgInfoNum; ++i) {
-+        IGraphType::PgInfo info;
-+        info.pgName = params->pgInfoData[i].pgName;
-+        info.pgId = params->pgInfoData[i].pgId;
-+        info.streamId = params->pgInfoData[i].streamId;
-+        if (params->pgInfoData[i].rbmByte > 0) {
-+            info.rbmValue.rbm_bytes = params->pgInfoData[i].rbmByte;
-+            info.rbmValue.rbm = params->pgInfoData[i].rbmData;
-+        } else {
-+            info.rbmValue.rbm = nullptr;
-+            info.rbmValue.rbm_bytes = 0;
-+        }
-+        graphData->pgInfo.push_back(info);
-+    }
-+
-+    for (size_t i = 0; i < params->mBrInfoNum; ++i) {
-+        IGraphType::MbrInfo info;
-+        info.streamId = params->mBrInfoData[i].streamId;
-+        info.data = params->mBrInfoData[i].mBrData;
-+        graphData->mbrInfo.push_back(info);
-+    }
-+
-+    for (size_t i = 0; i < params->pgNamesNum; ++i) {
-+        graphData->pgNames.push_back(params->pgNames[i]);
-+    }
-+
-+    for (size_t i = 0; i < params->kernelArrayNum; ++i) {
-+        IGraphType::ProgramGroupInfo info;
-+
-+        info.streamId = params->kernelArray[i].streamId;
-+        info.pgPtr = &(params->kernelArray[i].group);
-+
-+        info.pgPtr->run_kernels = params->kernelArray[i].runKernels;
-+        for (unsigned j = 0; j < info.pgPtr->kernel_count; ++j) {
-+            if (params->kernelArray[i].runKernels[j].resolution_info) {
-+                info.pgPtr->run_kernels[j].resolution_info = &(params->kernelArray[i].resoInfo[j]);
-+            } else {
-+                info.pgPtr->run_kernels[j].resolution_info = nullptr;
-+            }
-+
-+            if (params->kernelArray[i].runKernels[j].resolution_history) {
-+                info.pgPtr->run_kernels[j].resolution_history =
-+                    &(params->kernelArray[i].resoHistory[j]);
-+            } else {
-+                info.pgPtr->run_kernels[j].resolution_history = nullptr;
-+            }
-+        }
-+
-+        if (params->kernelArray[i].group.pipe) {
-+            info.pgPtr->pipe = &(params->kernelArray[i].pipeInfo);
-+        } else {
-+            info.pgPtr->pipe = nullptr;
-+        }
-+
-+        graphData->programGroup.push_back(info);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo info,
-+                                          const int streamId, const int kernelId) {
-+    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, streamId: %d, kernelId: %d",
-+           __func__, pData, size, info.cameraId, info.configMode, streamId, kernelId);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
-+    CLEAR(*params);
-+
-+    params->baseInfo = info;
-+    params->streamId = streamId;
-+    params->kernelId = kernelId;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverUnFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo *info,
-+                                            uint32_t *streamId, int32_t *kernelId) {
-+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!info || !streamId || !kernelId, false,
-+               "@%s, info, streamId or kernelId is nullptr", __func__);
-+
-+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
-+
-+    *info = params->baseInfo;
-+    *streamId = params->streamId;
-+    *kernelId = params->kernelId;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverFlattenGetPgId(void *pData, uint32_t size, int32_t pgId) {
-+    LOGIPC("@%s, pData:%p, size:%u, pgId: %d", __func__, pData, size, pgId);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
-+    params->pgId = pgId;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientUnFlattenGetPgId(void *pData, uint32_t size, int32_t *pgId) {
-+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
-+
-+    CheckError(!pData || !pgId, false, "@%s, pData or pgId is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetPgIdParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetPgIdParams *params = static_cast<GraphGetPgIdParams*>(pData);
-+    *pgId = params->pgId;
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientFlattenGetConnection(void *pData, uint32_t size, GraphBaseInfo info,
-+                                                const std::vector<std::string> &pgList) {
-+    LOGIPC("@%s, pData:%p, size:%u, cameraId :%d, config mode:%d, pgName size: %zu",
-+           __func__, pData, size, info.cameraId, info.configMode, pgList.size());
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
-+    CLEAR(*params);
-+
-+    params->baseInfo = info;
-+    params->pgListNum = pgList.size();
-+    for (size_t i = 0; i < pgList.size(); ++i) {
-+        size_t len = pgList[i].copy(params->pgList[i], MAX_NAME_LENGTH);
-+        params->pgList[i][len] = '\0';
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverUnFlattenGetConnection(void *pData, uint32_t size, GraphBaseInfo *info,
-+                                                  std::vector<std::string> *pgList) {
-+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
-+
-+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!pData || !info || !pgList, false,
-+               "@%s, pData, info or pgList is nullptr", __func__);
-+
-+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
-+
-+    *info = params->baseInfo;
-+    for (size_t i = 0; i < params->pgListNum; ++i) {
-+        pgList->push_back(params->pgList[i]);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::serverFlattenGetConnection(
-+         void *pData, uint32_t size,
-+         const std::vector<IGraphType::ScalerInfo> &scalerInfo,
-+         const std::vector<IGraphType::PipelineConnection> &confVector) {
-+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
-+
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
-+
-+    params->connectionArraySize = confVector.size();
-+    for (size_t i = 0; i < confVector.size(); ++i) {
-+        params->connectionArray[i].connection = confVector[i];
-+        if (params->connectionArray[i].connection.stream) {
-+            params->connectionArray[i].stream = *(confVector[i].stream);
-+        }
-+    }
-+
-+    params->scalerInfoNum = scalerInfo.size();
-+    for (size_t i = 0; i < scalerInfo.size(); ++i) {
-+        params->scalerInfoArray[i] = scalerInfo[i];
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCGraphConfig::clientUnFlattenGetConnection(
-+         void *pData, uint32_t size,
-+         std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+         std::vector<IGraphType::PipelineConnection> *confVector) {
-+    LOGIPC("@%s, pData:%p, size:%u", __func__, pData, size);
-+
-+    CheckError(!pData || !confVector, false, "@%s, pData or confVector is nullptr", __func__);
-+    CheckError(size < sizeof(GraphGetConnectionParams), false, "@%s, buffer is small", __func__);
-+
-+    GraphGetConnectionParams *params = static_cast<GraphGetConnectionParams*>(pData);
-+
-+    for (size_t i = 0; i < params->connectionArraySize; ++i) {
-+        if (params->connectionArray[i].connection.stream) {
-+            params->connectionArray[i].connection.stream = &(params->connectionArray[i].stream);
-+        }
-+        confVector->push_back(params->connectionArray[i].connection);
-+    }
-+
-+    for (size_t i = 0; i < params->scalerInfoNum; ++i) {
-+        scalerInfo->push_back(params->scalerInfoArray[i]);
-+    }
-+
-+    return true;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
-new file mode 100644
-index 000000000000..e8e531c967dd
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCGraphConfig.h
-@@ -0,0 +1,171 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string>
-+#include <vector>
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "src/platformdata/gc/IGraphConfig.h"
-+
-+namespace icamera {
-+
-+#define MAX_STREAM                (4)                // Max stream number
-+#define MAX_GRAPH_SETTINGS_SIZE   (2 * 1024 * 1024)  // Max graph settings file size
-+#define MAX_GRAPH_DESCRIPTOR_SIZE (512 * 1024)       // Max graph descriptor file size
-+#define MAX_PG_NUMBER             (10)               // Max pg number
-+#define MAX_NAME_LENGTH           (128)              // Max length for name
-+#define MAX_CONNECTION_COUNT      (64)               // Max connection count
-+#define MAX_STREAM_KERNEL_COUNT   (500)              // Max kernels info per one stream
-+
-+struct GraphBaseInfo {
-+    int cameraId;
-+    ConfigMode configMode;
-+
-+    bool operator< (const GraphBaseInfo &b) const {
-+        return (cameraId < b.cameraId) ? true : (configMode < b.configMode ? true : false);
-+    }
-+};
-+
-+struct GraphPgInfo {
-+    char pgName[MAX_NAME_LENGTH];
-+    uint32_t pgId;
-+    int streamId;
-+    uint32_t rbmByte;
-+    char rbmData[MAX_NAME_LENGTH];
-+};
-+
-+struct GraphMbrInfo {
-+    int32_t streamId;
-+    ia_isp_bxt_gdc_limits mBrData;
-+};
-+
-+struct GraphKernelArray {
-+    int32_t streamId;
-+    ia_isp_bxt_program_group group;
-+    ia_isp_bxt_run_kernels_t runKernels[MAX_STREAM_KERNEL_COUNT];
-+    ia_isp_bxt_resolution_info_t resoInfo[MAX_STREAM_KERNEL_COUNT];
-+    ia_isp_bxt_resolution_info_t resoHistory[MAX_STREAM_KERNEL_COUNT];
-+    ia_isp_bxt_pipe_t pipeInfo;
-+};
-+
-+struct GraphParseParams {
-+    int cameraId;
-+    size_t gdSize;
-+    char GD[MAX_GRAPH_DESCRIPTOR_SIZE];
-+    size_t gsSize;
-+    char GS[MAX_GRAPH_SETTINGS_SIZE];
-+};
-+
-+struct GraphConfigStreamParams {
-+    GraphBaseInfo baseInfo;
-+    GraphSettingType type;
-+    uint32_t streamNum;
-+    HalStream streamCfg[MAX_STREAM];
-+    stream_t streamPriv[MAX_STREAM];
-+};
-+
-+struct GraphGetDataParams {
-+    GraphBaseInfo baseInfo;
-+
-+    int mcId;
-+    int graphId;
-+    uint32_t gdcKernelId;
-+
-+    camera_resolution_t csiReso;
-+    camera_resolution_t gdcReso;
-+
-+    uint32_t streamIdNum;
-+    int32_t streamIdData[MAX_STREAM];
-+
-+    uint32_t pgInfoNum;
-+    GraphPgInfo pgInfoData[MAX_PG_NUMBER];
-+
-+    uint32_t mBrInfoNum;
-+    GraphMbrInfo mBrInfoData[MAX_STREAM];
-+
-+    uint32_t pgNamesNum;
-+    char pgNames[MAX_PG_NUMBER][MAX_NAME_LENGTH];
-+
-+    uint32_t kernelArrayNum;
-+    GraphKernelArray kernelArray[MAX_STREAM];
-+};
-+
-+struct GraphGetPgIdParams {
-+    GraphBaseInfo baseInfo;
-+    uint32_t streamId;
-+    int32_t kernelId;
-+    int32_t pgId;
-+};
-+
-+struct GraphConnection {
-+    IGraphType::PipelineConnection connection;
-+    HalStream stream;
-+};
-+
-+struct GraphGetConnectionParams {
-+    GraphBaseInfo baseInfo;
-+    uint32_t pgListNum;
-+    char pgList[MAX_PG_NUMBER][MAX_NAME_LENGTH];
-+    uint32_t connectionArraySize;
-+    GraphConnection connectionArray[MAX_CONNECTION_COUNT];
-+    uint32_t scalerInfoNum;
-+    IGraphType::ScalerInfo scalerInfoArray[MAX_STREAM];
-+};
-+
-+class IPCGraphConfig {
-+ public:
-+    IPCGraphConfig();
-+    virtual ~IPCGraphConfig();
-+
-+    bool clientFlattenParse(void* pData, uint32_t size, int cameraId,
-+                            const char *graphDescFile, const char *settingsFile);
-+    bool serverUnflattenParse(void* pData, uint32_t size, GraphParseParams **parseParam);
-+    bool clientFlattenConfigStreams(void *pData, uint32_t size, GraphBaseInfo info,
-+                                    GraphSettingType type, const std::vector<HalStream*> &streams);
-+    bool serverUnflattenConfigStreams(void* pData, uint32_t size, GraphBaseInfo *info,
-+                                      GraphSettingType *type, std::vector<HalStream*> *streams);
-+    bool clientFlattenGetGraphData(void *pData, uint32_t size, GraphBaseInfo info);
-+    bool serverUnflattenGetGraphData(void* pData, uint32_t size, GraphBaseInfo *info);
-+    bool serverFlattenGetGraphData(void* pData, uint32_t size,
-+                                   IGraphType::GraphConfigData graphData);
-+    bool clientUnflattenGetGraphData(void *pData, uint32_t size,
-+                                     IGraphType::GraphConfigData *graphData);
-+    bool clientFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo info,
-+                              const int streamId, const int kernelId);
-+    bool serverUnFlattenGetPgId(void *pData, uint32_t size, GraphBaseInfo *info,
-+                                uint32_t *streamId, int32_t *kernelId);
-+    bool serverFlattenGetPgId(void *pData, uint32_t size, int32_t pgId);
-+    bool clientUnFlattenGetPgId(void *pData, uint32_t size, int32_t *pgId);
-+    bool clientFlattenGetConnection(void *pData, uint32_t size,
-+                                    GraphBaseInfo info, const std::vector<std::string> &pgList);
-+    bool serverUnFlattenGetConnection(void *pData, uint32_t size,
-+                                      GraphBaseInfo *info, std::vector<std::string> *pgList);
-+    bool serverFlattenGetConnection(void *pData, uint32_t size,
-+                                    const std::vector<IGraphType::ScalerInfo> &scalerInfo,
-+                                    const std::vector<IGraphType::PipelineConnection> &confVector);
-+    bool clientUnFlattenGetConnection(void *pData, uint32_t size,
-+                                      std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+                                      std::vector<IGraphType::PipelineConnection> *confVector);
-+
-+ private:
-+    status_t readDataFromXml(const char *fileName, char *dataPtr, size_t *dataSize, int maxSize);
-+
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(IPCGraphConfig);
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
-new file mode 100644
-index 000000000000..33d528f97cb3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.cpp
-@@ -0,0 +1,1167 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPCIntelAiq"
-+
-+#include "modules/sandboxing/IPCIntelAiq.h"
-+
-+#include <ia_types.h>
-+
-+namespace icamera {
-+IPCIntelAiq::IPCIntelAiq() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelAiq::~IPCIntelAiq() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+// init
-+bool IPCIntelAiq::clientFlattenInit(const ia_binary_data* aiqbData,
-+                                    const ia_binary_data* nvmData,
-+                                    const ia_binary_data* aiqdData,
-+                                    unsigned int statsMaxWidth,
-+                                    unsigned int statsMaxHeight,
-+                                    unsigned int maxNumStatsIn,
-+                                    uintptr_t cmc,
-+                                    uintptr_t mkn,
-+                                    uint8_t* pData, unsigned int size) {
-+    LOGIPC("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+
-+    uint8_t* ptr = pData;
-+    memset(ptr, 0, size);
-+
-+    aiq_init_params* params = reinterpret_cast<aiq_init_params*>(ptr);
-+    params->aiqb_size = aiqbData ? aiqbData->size : 0;
-+    params->nvm_size = nvmData ? nvmData->size : 0;
-+    params->aiqd_size = aiqdData ? aiqdData->size : 0;
-+    params->stats_max_width = statsMaxWidth;
-+    params->stats_max_height = statsMaxHeight;
-+    params->max_num_stats_in = maxNumStatsIn;
-+    params->ia_mkn = mkn;
-+    params->cmcRemoteHandle = cmc;
-+
-+    ptr += sizeof(aiq_init_params);
-+    if (aiqbData) {
-+        MEMCPY_S(ptr, aiqbData->size, aiqbData->data, aiqbData->size);
-+    }
-+
-+    ptr += params->aiqb_size;
-+    if (nvmData) {
-+        MEMCPY_S(ptr, nvmData->size, nvmData->data, nvmData->size);
-+    }
-+
-+    ptr += params->nvm_size;
-+    if (aiqdData) {
-+        MEMCPY_S(ptr, aiqdData->size, aiqdData->data, aiqdData->size);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenInit(const void* pData, int dataSize,
-+                                      ia_binary_data* aiqbData,
-+                                      ia_binary_data* nvmData,
-+                                      ia_binary_data* aiqdData) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__,
-+           pData, dataSize, aiqbData, nvmData, aiqdData);
-+    CheckError(dataSize < sizeof(aiq_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
-+    CheckError(!nvmData, false, "@%s, nvmData is nullptr", __func__);
-+    CheckError(!aiqdData, false, "@%s, aiqdData is nullptr", __func__);
-+
-+    const aiq_init_params* params = static_cast<const aiq_init_params*>(pData);
-+
-+    LOGIPC("@%s, aiqb_size:%d, nvm_size:%d, aiqd_size:%d", __func__,
-+           params->aiqb_size, params->nvm_size, params->aiqd_size);
-+
-+    int totalMemSize =
-+        sizeof(aiq_init_params) + params->aiqb_size + params->nvm_size + params->aiqd_size;
-+    CheckError(dataSize < totalMemSize, false,
-+               "@%s, dataSize:%d is too small", __func__, dataSize);
-+
-+    const aiq_init_params* p = static_cast<const aiq_init_params*>(pData) + 1;
-+    uint8_t* ptr = reinterpret_cast<uint8_t*>(const_cast<aiq_init_params*>(p));
-+    aiqbData->size = params->aiqb_size;
-+    aiqbData->data = aiqbData->size > 0 ? ptr : nullptr;
-+
-+    ptr += params->aiqb_size;
-+    nvmData->size = params->nvm_size;
-+    nvmData->data = nvmData->size > 0 ? ptr : nullptr;
-+
-+    ptr += params->nvm_size;
-+    aiqdData->size = params->aiqd_size;
-+    aiqdData->data = aiqdData->size > 0 ? ptr : nullptr;
-+
-+    return true;
-+}
-+
-+// ae
-+bool IPCIntelAiq::clientFlattenAe(uintptr_t aiq,
-+                                  const ia_aiq_ae_input_params& inParams,
-+                                  ae_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+
-+    params->base = inParams;
-+    const ia_aiq_ae_input_params* base = &params->base;
-+
-+    if (base->aec_features) {
-+        params->aec_features = *inParams.aec_features;
-+    }
-+
-+    if (base->exposure_coordinate) {
-+        params->exposure_coordinate = *inParams.exposure_coordinate;
-+    }
-+
-+    if (base->exposure_window) {
-+        params->exposure_window = *inParams.exposure_window;
-+    }
-+
-+    if (inParams.num_exposures > 1) {
-+        LOGE("@%s, BUG: num_exposures:%d > 1. Copying only first.",
-+             __func__, inParams.num_exposures);
-+    }
-+
-+    if (base->sensor_descriptor) {
-+        params->sensor_descriptor = *inParams.sensor_descriptor;
-+    }
-+
-+    if (base->manual_exposure_time_us) {
-+        params->manual_exposure_time_us = *inParams.manual_exposure_time_us;
-+    }
-+
-+    if (base->manual_analog_gain) {
-+        params->manual_analog_gain = *inParams.manual_analog_gain;
-+    }
-+
-+    if (base->manual_iso) {
-+        params->manual_iso = *inParams.manual_iso;
-+    }
-+
-+    if (base->manual_limits) {
-+        params->manual_limits = *inParams.manual_limits;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenAe(ae_run_params* inParams,
-+                                    ia_aiq_ae_input_params** params) {
-+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
-+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_ae_input_params* base = &inParams->base;
-+    if (base->aec_features) {
-+        base->aec_features = &inParams->aec_features;
-+    }
-+
-+    if (base->exposure_coordinate) {
-+        base->exposure_coordinate = &inParams->exposure_coordinate;
-+    }
-+
-+    if (base->exposure_window) {
-+        base->exposure_window = &inParams->exposure_window;
-+    }
-+
-+    if (base->sensor_descriptor) {
-+        base->sensor_descriptor = &inParams->sensor_descriptor;
-+    }
-+
-+    if (base->manual_exposure_time_us) {
-+        base->manual_exposure_time_us = &inParams->manual_exposure_time_us;
-+    }
-+
-+    if (base->manual_analog_gain) {
-+        base->manual_analog_gain = &inParams->manual_analog_gain;
-+    }
-+
-+    if (base->manual_iso) {
-+        base->manual_iso = &inParams->manual_iso;
-+    }
-+
-+    if (base->manual_limits) {
-+        base->manual_limits = &inParams->manual_limits;
-+    }
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results) {
-+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    ae_run_params_results* res = &params->res;
-+    bool ret = unflattenAeResults(res);
-+    CheckError((ret == false), false, "@%s, unflattenAeResults fails", __func__);
-+
-+    *results = &res->base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    bool ret = flattenAeResults(aeResults, &params->res);
-+    CheckError(ret == false, false, "@%s, flattenAeResults fails", __func__);
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::flattenAeResults(const ia_aiq_ae_results& aeResults,
-+                                   ae_run_params_results* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    res->base = aeResults;
-+    const ia_aiq_ae_results* base = &res->base;
-+
-+    if (base->exposures && base->num_exposures > 0) {
-+        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
-+                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
-+
-+        for (unsigned int i = 0; i < base->num_exposures; i++) {
-+            res->exposures[i] = aeResults.exposures[i];
-+
-+            if (res->exposures[i].exposure) {
-+                res->exposure[i] = *aeResults.exposures[i].exposure;
-+            }
-+            if (res->exposures[i].sensor_exposure) {
-+                res->sensor_exposure[i] = *aeResults.exposures[i].sensor_exposure;
-+            }
-+            if (res->exposures[i].exposure_plan_ids) {
-+                CheckError(base->exposures->num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS, false,
-+                           "@%s, base->exposures->num_exposure_plan:% is too big", __func__,
-+                           base->exposures->num_exposure_plan);
-+                MEMCPY_S(res->exposure_plan_ids[i],
-+                         sizeof(unsigned int) * MAX_NUM_OF_EXPOSURE_PLANS,
-+                         aeResults.exposures[i].exposure_plan_ids,
-+                         sizeof(unsigned int) * aeResults.exposures[i].num_exposure_plan);
-+            }
-+        }
-+    }
-+
-+    if (base->weight_grid) {
-+        res->weight_grid = *aeResults.weight_grid;
-+
-+        if (res->weight_grid.weights) {
-+            unsigned int gridElements =
-+                aeResults.weight_grid->width * aeResults.weight_grid->height;
-+            gridElements = CLIP(gridElements, MAX_SIZE_WEIGHT_GRID, 1);
-+            MEMCPY_S(res->weights, sizeof(res->weights),
-+                aeResults.weight_grid->weights, gridElements * sizeof(unsigned char));
-+        }
-+    }
-+
-+    if (base->flashes) {
-+        // Valgrind will give warning from here in the first round. It should be fine.
-+        if (aeResults.num_flashes > 0) {
-+            MEMCPY_S(res->flashes, sizeof(res->flashes),
-+                aeResults.flashes, MAX_NUM_FLASHES * sizeof(ia_aiq_flash_parameters));
-+        }
-+    }
-+
-+    if (base->aperture_control) {
-+        res->aperture_control = *aeResults.aperture_control;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::unflattenAeResults(ae_run_params_results* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    ia_aiq_ae_results* base = &res->base;
-+
-+    if (base->exposures) {
-+        base->exposures = res->exposures;
-+
-+        CheckError(base->num_exposures > MAX_NUM_EXPOSURES, false,
-+                   "@%s, base->num_exposures:% is too big", __func__, base->num_exposures);
-+
-+        for (unsigned int i = 0; i < base->num_exposures; i++) {
-+            if (base->exposures[i].exposure) {
-+                base->exposures[i].exposure = &res->exposure[i];
-+            }
-+            if (base->exposures[i].sensor_exposure) {
-+                base->exposures[i].sensor_exposure = &res->sensor_exposure[i];
-+            }
-+            if (base->exposures[i].exposure_plan_ids) {
-+                base->exposures[i].exposure_plan_ids = res->exposure_plan_ids[i];
-+            }
-+        }
-+    }
-+
-+    if (base->weight_grid) {
-+        base->weight_grid = &res->weight_grid;
-+        if (base->weight_grid->weights) {
-+            base->weight_grid->weights = res->weights;
-+        }
-+    }
-+
-+    if (base->flashes) {
-+        base->flashes = res->flashes;
-+    }
-+
-+    if (base->aperture_control) {
-+        base->aperture_control = &res->aperture_control;
-+    }
-+
-+    return true;
-+}
-+
-+// af
-+bool IPCIntelAiq::clientFlattenAf(uintptr_t aiq,
-+                                  const ia_aiq_af_input_params& inParams,
-+                                  af_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+
-+    params->base = inParams;
-+    ia_aiq_af_input_params* base = &params->base;
-+    if (base->focus_rect) {
-+        params->focus_rect = *inParams.focus_rect;
-+    }
-+    if (base->manual_focus_parameters) {
-+        params->manual_focus_parameters = *inParams.manual_focus_parameters;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results) {
-+    LOGIPC("@%s, results:%p", __func__, results);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    *results = const_cast<ia_aiq_af_results*>(&params.results);
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenAf(af_run_params* inParams,
-+                                    ia_aiq_af_input_params** params) {
-+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
-+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_af_input_params* base = &inParams->base;
-+    if (base->focus_rect) {
-+        base->focus_rect = &inParams->focus_rect;
-+    }
-+    if (base->manual_focus_parameters) {
-+        base->manual_focus_parameters = &inParams->manual_focus_parameters;
-+    }
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_af_results* results = &params->results;
-+    *results = afResults;
-+
-+    LOGIPC("af results->status:%d", results->status);
-+    LOGIPC("af results->current_focus_distance:%d", results->current_focus_distance);
-+    LOGIPC("af results->next_lens_position:%d", results->next_lens_position);
-+    LOGIPC("af results->lens_driver_action:%d", results->lens_driver_action);
-+    LOGIPC("af results->use_af_assist:%d", results->use_af_assist);
-+    LOGIPC("af results->final_lens_position_reached:%d", results->final_lens_position_reached);
-+
-+    return true;
-+}
-+
-+// awb
-+bool IPCIntelAiq::clientFlattenAwb(uintptr_t aiq,
-+                                   const ia_aiq_awb_input_params& inParams,
-+                                   awb_run_params* params) {
-+    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+
-+    params->base = inParams;
-+    const ia_aiq_awb_input_params* base = &params->base;
-+
-+    if (base->manual_cct_range) {
-+        params->manual_cct_range = *inParams.manual_cct_range;
-+    }
-+
-+    if (base->manual_white_coordinate) {
-+        params->manual_white_coordinate = *inParams.manual_white_coordinate;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenAwb(const awb_run_params& inParams,
-+                                     ia_aiq_awb_results** results) {
-+    LOGIPC("@%s, results:%p", __func__, results);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    *results = const_cast<ia_aiq_awb_results*>(&inParams.results);
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenAwb(awb_run_params* inParams,
-+                                     ia_aiq_awb_input_params** params) {
-+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
-+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_awb_input_params* base = &inParams->base;
-+
-+    if (base->manual_cct_range) {
-+        base->manual_cct_range = &inParams->manual_cct_range;
-+    }
-+
-+    if (base->manual_white_coordinate) {
-+        base->manual_white_coordinate = &inParams->manual_white_coordinate;
-+    }
-+
-+    LOGIPC("@%s, manual_cct_range:%p, manual_white_coordinate:%p", __func__,
-+           base->manual_cct_range, base->manual_white_coordinate);
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_awb_results* results = &params->results;
-+    *results = awbResults;
-+
-+    LOGIPC("awb results->accurate_r_per_g:%f", results->accurate_r_per_g);
-+    LOGIPC("awb results->accurate_b_per_g:%f", results->accurate_b_per_g);
-+    LOGIPC("awb results->final_r_per_g:%f", results->final_r_per_g);
-+    LOGIPC("awb results->final_b_per_g:%f", results->final_b_per_g);
-+    LOGIPC("awb results->cct_estimate:%d", results->cct_estimate);
-+    LOGIPC("awb results->distance_from_convergence:%f", results->distance_from_convergence);
-+
-+    return true;
-+}
-+
-+// gbce
-+bool IPCIntelAiq::clientFlattenGbce(uintptr_t aiq,
-+                                    const ia_aiq_gbce_input_params& inParams,
-+                                    gbce_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__,  params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+    params->base = inParams;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenGbce(gbce_run_params* params,
-+                                      ia_aiq_gbce_results** results) {
-+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    gbce_results_params* res = &params->res;
-+    bool ret = unflattenGbceResults(res);
-+    CheckError(!ret, false, "@%s, unflattenGbceResults fails", __func__);
-+
-+    *results = &res->base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenGbce(const ia_aiq_gbce_results& gbceResults,
-+                                    gbce_run_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    return flattenGbceResults(gbceResults, &params->res);
-+}
-+
-+bool IPCIntelAiq::flattenGbceResults(const ia_aiq_gbce_results& gbceResults,
-+                                     gbce_results_params* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    size_t size = gbceResults.gamma_lut_size * sizeof(*gbceResults.g_gamma_lut);
-+    LOGIPC("@%s, gamma_lut_size:%d, size:%zu, tone_map_lut_size:%d", __func__,
-+           gbceResults.gamma_lut_size, size, gbceResults.tone_map_lut_size);
-+
-+    res->base = gbceResults;
-+
-+    const ia_aiq_gbce_results* base = &res->base;
-+
-+    if (base->r_gamma_lut) {
-+        MEMCPY_S(res->r_gamma_lut, sizeof(res->r_gamma_lut), gbceResults.r_gamma_lut, size);
-+    }
-+
-+    if (base->b_gamma_lut) {
-+        MEMCPY_S(res->b_gamma_lut, sizeof(res->b_gamma_lut), gbceResults.b_gamma_lut, size);
-+    }
-+
-+    if (base->g_gamma_lut) {
-+        MEMCPY_S(res->g_gamma_lut, sizeof(res->g_gamma_lut), gbceResults.g_gamma_lut, size);
-+    }
-+
-+    if (base->tone_map_lut) {
-+        MEMCPY_S(res->tone_map_lut, sizeof(res->tone_map_lut),
-+                 gbceResults.tone_map_lut,
-+                 gbceResults.tone_map_lut_size * sizeof(*gbceResults.tone_map_lut));
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::unflattenGbceResults(gbce_results_params* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    ia_aiq_gbce_results* base = &res->base;
-+
-+    LOGIPC("@%s, gamma_lut_size:%d", __func__, base->gamma_lut_size);
-+    LOGIPC("@%s, tone_map_lut_size:%d", __func__, base->tone_map_lut_size);
-+    CheckError(base->gamma_lut_size > MAX_NUM_GAMMA_LUTS, false,
-+               "@%s, gamma_lut_size:%d is too big", __func__, base->gamma_lut_size);
-+    CheckError((base->tone_map_lut_size > MAX_NUM_TOME_MAP_LUTS), false,
-+               "@%s, tone_map_lut_size:%d is too big", __func__, base->tone_map_lut_size);
-+
-+    if (base->r_gamma_lut) {
-+        base->r_gamma_lut = res->r_gamma_lut;
-+    }
-+
-+    if (base->b_gamma_lut) {
-+        base->b_gamma_lut = res->b_gamma_lut;
-+    }
-+
-+    if (base->g_gamma_lut) {
-+        base->g_gamma_lut = res->g_gamma_lut;
-+    }
-+
-+    if (base->tone_map_lut) {
-+        base->tone_map_lut = res->tone_map_lut;
-+    }
-+
-+    return true;
-+}
-+
-+// pa
-+bool IPCIntelAiq::clientFlattenPaV1(uintptr_t aiq,
-+                                    const ia_aiq_pa_input_params& inParams,
-+                                    pa_run_v1_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+
-+    params->base = inParams;
-+    ia_aiq_pa_input_params* base = &params->base;
-+
-+    if (base->awb_results) {
-+        params->awb_results = *base->awb_results;
-+    }
-+
-+    if (base->exposure_params) {
-+        params->exposure_params = *base->exposure_params;
-+    }
-+
-+    if (base->color_gains) {
-+        params->color_gains = *base->color_gains;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenPaV1(pa_run_v1_params* params,
-+                                      ia_aiq_pa_results_v1** results) {
-+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    pa_run_params_results_v1* res = &params->res;
-+    bool ret = unflattenPaResultsV1(res);
-+    CheckError((ret == false), false, "@%s, unflattenPaResultsV1 fails", __func__);
-+
-+    *results = &res->base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenPaV1(pa_run_v1_params* inParams,
-+                                      ia_aiq_pa_input_params** params) {
-+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
-+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_pa_input_params* base = &inParams->base;
-+
-+    if (base->awb_results) {
-+        base->awb_results = &inParams->awb_results;
-+    }
-+
-+    if (base->exposure_params) {
-+        base->exposure_params = &inParams->exposure_params;
-+    }
-+
-+    if (base->color_gains) {
-+        base->color_gains = &inParams->color_gains;
-+    }
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults,
-+                                    pa_run_v1_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    bool ret = flattenPaResultsV1(paResults, &params->res);
-+    CheckError(ret == false, false, "@%s, flattenPaResultsV1 fails", __func__);
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults,
-+                                     pa_run_params_results_v1* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    res->base = paResults;
-+    ia_aiq_pa_results_v1* base = &res->base;
-+
-+    ia_aiq_color_channels_lut* linearization = &base->linearization;
-+    CheckError((MAX_NUM_LUTS < linearization->size), false,
-+               "@%s, linearization:%d is too big", __func__, linearization->size);
-+    if (linearization->gr) {
-+        MEMCPY_S(res->gr, sizeof(res->gr),
-+            linearization->gr, sizeof(*linearization->gr) * linearization->size);
-+    }
-+    if (linearization->r) {
-+        MEMCPY_S(res->r, sizeof(res->r),
-+            linearization->r, sizeof(*linearization->r) * linearization->size);
-+    }
-+    if (linearization->b) {
-+        MEMCPY_S(res->b, sizeof(res->b),
-+            linearization->b, sizeof(*linearization->b) * linearization->size);
-+    }
-+    if (linearization->gb) {
-+        MEMCPY_S(res->gb, sizeof(res->gb),
-+            linearization->gb, sizeof(*linearization->gb) * linearization->size);
-+    }
-+
-+    ia_aiq_advanced_ccm_t* preferred_acm = base->preferred_acm;
-+    if (preferred_acm) {
-+        CheckError((MAX_SECTOR_COUNT < preferred_acm->sector_count), false,
-+                   "@%s, sector_count:%d is too big", __func__, preferred_acm->sector_count);
-+
-+        res->preferred_acm = *preferred_acm;
-+
-+        if (preferred_acm->hue_of_sectors) {
-+            MEMCPY_S(res->hue_of_sectors, sizeof(res->hue_of_sectors),
-+                     preferred_acm->hue_of_sectors,
-+                     sizeof(*preferred_acm->hue_of_sectors) * preferred_acm->sector_count);
-+        }
-+
-+        if (preferred_acm->advanced_color_conversion_matrices) {
-+            MEMCPY_S(res->advanced_color_conversion_matrices,
-+                     sizeof(res->advanced_color_conversion_matrices),
-+                     preferred_acm->advanced_color_conversion_matrices,
-+                     (sizeof(*preferred_acm->advanced_color_conversion_matrices)
-+                         * preferred_acm->sector_count));
-+        }
-+    }
-+
-+    ia_aiq_ir_weight_t* ir_weight = base->ir_weight;
-+    if (ir_weight) {
-+        res->ir_weight = *ir_weight;
-+
-+        if (ir_weight->ir_weight_grid_R) {
-+            MEMCPY_S(res->ir_weight_grid_R, sizeof(res->ir_weight_grid_R),
-+                     ir_weight->ir_weight_grid_R,
-+                     sizeof(*ir_weight->ir_weight_grid_R) * ir_weight->height * ir_weight->width);
-+        }
-+
-+        if (ir_weight->ir_weight_grid_G) {
-+            MEMCPY_S(res->ir_weight_grid_G, sizeof(res->ir_weight_grid_G),
-+                     ir_weight->ir_weight_grid_G,
-+                     sizeof(*ir_weight->ir_weight_grid_G) * ir_weight->height * ir_weight->width);
-+        }
-+
-+        if (ir_weight->ir_weight_grid_B) {
-+            MEMCPY_S(res->ir_weight_grid_B, sizeof(res->ir_weight_grid_B),
-+                     ir_weight->ir_weight_grid_B,
-+                     sizeof(*ir_weight->ir_weight_grid_B) * ir_weight->height * ir_weight->width);
-+        }
-+    }
-+
-+    ia_aiq_rgbir_t* rgbir = base->rgbir;
-+    if (rgbir) {
-+        res->rgbir = *rgbir;
-+
-+        CheckError(rgbir->n_models > MAX_NUM_IR_MODES, false,
-+                   "@%s, rgbir->n_models:%d is too big", __func__, rgbir->n_models);
-+
-+        if (rgbir->models && rgbir->n_models > 0) {
-+            for (unsigned int i = 0; i < rgbir->n_models; i++) {
-+                res->models[i] = rgbir->models[i];
-+            }
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::unflattenPaResultsV1(pa_run_params_results_v1* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    ia_aiq_pa_results_v1* base = &res->base;
-+
-+    if (base->linearization.gr) {
-+        base->linearization.gr = res->gr;
-+    }
-+    if (base->linearization.r) {
-+        base->linearization.r = res->r;
-+    }
-+    if (base->linearization.b) {
-+        base->linearization.b = res->b;
-+    }
-+    if (base->linearization.gb) {
-+        base->linearization.gb = res->gb;
-+    }
-+
-+    if (base->preferred_acm) {
-+        base->preferred_acm = &res->preferred_acm;
-+
-+        if (base->preferred_acm->hue_of_sectors) {
-+            base->preferred_acm->hue_of_sectors = res->hue_of_sectors;
-+        }
-+
-+        if (base->preferred_acm->advanced_color_conversion_matrices) {
-+            base->preferred_acm->advanced_color_conversion_matrices =
-+                static_cast<float(*)[3][3]>(res->advanced_color_conversion_matrices);
-+        }
-+    }
-+
-+    if (base->ir_weight) {
-+        base->ir_weight = &res->ir_weight;
-+
-+        if (base->ir_weight->ir_weight_grid_R) {
-+            base->ir_weight->ir_weight_grid_R = res->ir_weight_grid_R;
-+        }
-+        if (base->ir_weight->ir_weight_grid_G) {
-+            base->ir_weight->ir_weight_grid_G = res->ir_weight_grid_G;
-+        }
-+        if (base->ir_weight->ir_weight_grid_B) {
-+            base->ir_weight->ir_weight_grid_B = res->ir_weight_grid_B;
-+        }
-+    }
-+
-+    if (base->rgbir) {
-+        base->rgbir = &res->rgbir;
-+
-+        ia_aiq_rgbir_t* resRgbir = &res->rgbir;
-+        if (resRgbir->models && resRgbir->n_models > 0) {
-+            resRgbir->models = res->models;
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+// sa
-+bool IPCIntelAiq::clientFlattenSaV2(uintptr_t aiq,
-+                                    const ia_aiq_sa_input_params_v1& inParams,
-+                                    sa_run_v2_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->aiq_handle = aiq;
-+
-+    params->base = inParams;
-+    const ia_aiq_sa_input_params_v1* base = &params->base;
-+
-+    if (base->sensor_frame_params) {
-+        params->sensor_frame_params = *inParams.sensor_frame_params;
-+    }
-+
-+    if (base->awb_results) {
-+        params->awb_results = *inParams.awb_results;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::clientUnflattenSaV2(sa_run_v2_params* params,
-+                                      ia_aiq_sa_results_v1** results) {
-+    LOGIPC("@%s, params:%p, results:%p", __func__, params, results);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!results, false, "@%s, results is nullptr", __func__);
-+
-+    sa_run_v2_params_results* res = &params->res;
-+    bool ret = unflattenSaResultsV2(res);
-+    CheckError(ret == false, false, "@%s, unflattenSaResultsV2 fails", __func__);
-+
-+    *results = &res->base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenSaV2(const sa_run_v2_params& inParams,
-+                                      ia_aiq_sa_input_params_v1** params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    ia_aiq_sa_input_params_v1* base = const_cast<ia_aiq_sa_input_params_v1*>(&inParams.base);
-+
-+    if (base->sensor_frame_params) {
-+        base->sensor_frame_params =
-+            const_cast<ia_aiq_frame_params*>(&inParams.sensor_frame_params);
-+    }
-+
-+    if (base->awb_results) {
-+        base->awb_results = const_cast<ia_aiq_awb_results*>(&inParams.awb_results);
-+    }
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults,
-+                                    sa_run_v2_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, results is nullptr", __func__);
-+
-+    bool ret = flattenSaResultsV2(saResults, &params->res);
-+    CheckError(ret == false, false, "@%s, flattenSaResultsV2 fails", __func__);
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults,
-+                                     sa_run_v2_params_results* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    res->base = saResults;
-+    ia_aiq_sa_results_v1* base = &res->base;
-+
-+    LOGIPC("sa_results: width:%d, height:%d, lsc_update:%d",
-+           base->width, base->height, base->lsc_update);
-+
-+    if (base->width && base->height) {
-+        size_t size = base->width * base->height * sizeof(unsigned short);
-+        for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
-+            for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
-+                lsc_grid_content* lgc = &res->lsc_grid[i][j];
-+                if (base->lsc_grid[i][j]) {
-+                    MEMCPY_S(lgc->content, sizeof(lgc->content), base->lsc_grid[i][j], size);
-+                }
-+            }
-+        }
-+    } else if (base->lsc_update) {
-+        LOGE("@%s, Error: LSC table size is 0", __func__);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::unflattenSaResultsV2(sa_run_v2_params_results* res) {
-+    LOGIPC("@%s, res:%p", __func__, res);
-+    CheckError(!res, false, "@%s, res is nullptr", __func__);
-+
-+    ia_aiq_sa_results_v1* base = &res->base;
-+
-+    LOGIPC("sa_results_data:height:%d, width:%d", base->height, base->width);
-+
-+    for (int i = 0; i < LSC_MAX_BAYER_ORDER_NUM; i++) {
-+        for (int j = 0; j < LSC_MAX_BAYER_ORDER_NUM; j++) {
-+            lsc_grid_content* lgc = &res->lsc_grid[i][j];
-+            base->lsc_grid[i][j] = lgc->content;
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+// statistics
-+bool IPCIntelAiq::clientFlattenStatSetV4(uintptr_t aiq,
-+                                         const ia_aiq_statistics_input_params_v4& inParams,
-+                                         set_statistics_set_v4_params* params) {
-+    LOGIPC("@%s, aiq:0x%, params:%p", __func__, aiq, params);
-+    CheckError(reinterpret_cast<ia_aiq*>(aiq) == nullptr, false,
-+               "@%s, aiq is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->ia_aiq = aiq;
-+
-+    set_statistics_params_data* input = &params->input;
-+    input->base = inParams;
-+    ia_aiq_statistics_input_params_v4* base = &input->base;
-+
-+    if (base->frame_ae_parameters) {
-+        flattenAeResults(*base->frame_ae_parameters, &input->frame_ae_parameters);
-+    }
-+
-+    if (base->frame_af_parameters) {
-+        input->frame_af_parameters = *base->frame_af_parameters;
-+    }
-+
-+    if (base->rgbs_grids) {
-+        CheckError((base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS), false,
-+                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d",
-+                   __func__, base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
-+
-+        for (int i = 0; i < MAX_NUMBER_OF_GRIDS; i++) {
-+            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
-+            rgbs_grids->base = *base->rgbs_grids[i];
-+
-+            CheckError(rgbs_grids->base.grid_width * rgbs_grids->base.grid_height > MAX_NUM_BLOCKS,
-+                       false, "@%s, grid_width:%d * grid_height:%d is too big", __func__,
-+                       rgbs_grids->base.grid_width, rgbs_grids->base.grid_height);
-+
-+            MEMCPY_S(rgbs_grids->blocks_ptr,
-+                     sizeof(rgbs_grids->blocks_ptr),
-+                     rgbs_grids->base.blocks_ptr,
-+                     rgbs_grids->base.grid_width
-+                        * rgbs_grids->base.grid_height
-+                        * sizeof(*rgbs_grids->base.blocks_ptr));
-+        }
-+    }
-+
-+    if (base->hdr_rgbs_grid) {
-+        ia_aiq_hdr_rgbs_grid_data* hdr_rgbs_grid = &input->hdr_rgbs_grid;
-+        hdr_rgbs_grid->base = *base->hdr_rgbs_grid;
-+        MEMCPY_S(hdr_rgbs_grid->blocks_ptr,
-+                 sizeof(hdr_rgbs_grid->blocks_ptr),
-+                 hdr_rgbs_grid->base.blocks_ptr,
-+                 hdr_rgbs_grid->base.grid_width
-+                    * hdr_rgbs_grid->base.grid_height
-+                    * sizeof(*hdr_rgbs_grid->base.blocks_ptr));
-+    }
-+
-+    if (base->af_grids) {
-+        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
-+                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d",
-+                   __func__, base->num_af_grids, MAX_NUMBER_OF_AF_GRIDS);
-+
-+        for (int i = 0; i < MAX_NUMBER_OF_AF_GRIDS; i++) {
-+            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
-+            af_grids->base = *base->af_grids[i];
-+            MEMCPY_S(af_grids->filter_response_1,
-+                     sizeof(af_grids->filter_response_1),
-+                     af_grids->base.filter_response_1,
-+                     af_grids->base.grid_width
-+                        * af_grids->base.grid_height
-+                        * sizeof(*af_grids->base.filter_response_1));
-+            MEMCPY_S(af_grids->filter_response_2,
-+                     sizeof(af_grids->filter_response_2),
-+                     af_grids->base.filter_response_2,
-+                     af_grids->base.grid_width
-+                        * af_grids->base.grid_height
-+                        * sizeof(*af_grids->base.filter_response_2));
-+        }
-+    }
-+
-+    if (base->frame_pa_parameters) {
-+        flattenPaResultsV1(*base->frame_pa_parameters, &input->frame_pa_parameters);
-+    }
-+
-+    if (base->faces) {
-+        input->faces.base = *base->faces;
-+        for (int i = 0; i < base->faces->num_faces; i++) {
-+            input->faces.faces[i] = *(base->faces->faces + i);
-+        }
-+    }
-+
-+    if (base->awb_results) {
-+        input->awb_results = *base->awb_results;
-+    }
-+
-+    if (base->frame_sa_parameters) {
-+        flattenSaResultsV2(*base->frame_sa_parameters, &input->frame_sa_parameters);
-+    }
-+
-+    if (base->depth_grids) {
-+        CheckError(base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS, false,
-+                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d", __func__,
-+                   base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
-+
-+        for (int i = 0; i < MAX_NUMBER_OF_DEPTH_GRIDS; i++) {
-+            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
-+            depth_grids->base = *base->depth_grids[i];
-+            MEMCPY_S(depth_grids->grid_rect,
-+                     sizeof(depth_grids->grid_rect),
-+                     depth_grids->base.grid_rect,
-+                     depth_grids->base.grid_height
-+                        * depth_grids->base.grid_width
-+                        * sizeof(*depth_grids->base.grid_rect));
-+            MEMCPY_S(depth_grids->depth_data,
-+                     sizeof(depth_grids->depth_data),
-+                     depth_grids->base.depth_data,
-+                     depth_grids->base.grid_height
-+                        * depth_grids->base.grid_width
-+                        * sizeof(*depth_grids->base.depth_data));
-+            MEMCPY_S(depth_grids->confidence,
-+                     sizeof(depth_grids->confidence),
-+                     depth_grids->base.confidence,
-+                     depth_grids->base.grid_height
-+                        * depth_grids->base.grid_width
-+                        * sizeof(*depth_grids->base.confidence));
-+        }
-+    }
-+
-+    if (base->ir_grid) {
-+        input->ir_grid = *base->ir_grid;
-+        MEMCPY_S(input->ir_grid_data,
-+                 MAX_IR_WEIGHT_GRID_DATA_SIZE * sizeof(unsigned short),
-+                 base->ir_grid->data,
-+                 base->ir_grid->width * base->ir_grid->height * sizeof(unsigned short));
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelAiq::serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
-+                                           ia_aiq_statistics_input_params_v4** params) {
-+    LOGIPC("@%s, inParams:%p, params:%p", __func__, inParams, params);
-+    CheckError(!inParams, false, "@%s, inParams is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    set_statistics_params_data* input = &inParams->input;
-+    ia_aiq_statistics_input_params_v4* base = &input->base;
-+
-+    if (base->frame_ae_parameters) {
-+        unflattenAeResults(&input->frame_ae_parameters);
-+        base->frame_ae_parameters = &input->frame_ae_parameters.base;
-+    }
-+
-+    if (base->frame_af_parameters) {
-+        base->frame_af_parameters = &input->frame_af_parameters;
-+    }
-+
-+    if (base->rgbs_grids) {
-+        CheckError(base->num_rgbs_grids > MAX_NUMBER_OF_GRIDS, false,
-+                   "@%s, num_rgbs_grids:%d > MAX_NUMBER_OF_GRIDS:%d",
-+                   __func__, base->num_rgbs_grids, MAX_NUMBER_OF_GRIDS);
-+
-+        for (int i = 0; i < base->num_rgbs_grids; i++) {
-+            ia_aiq_rgbs_grid_data* rgbs_grids = &input->rgbs_grids[i];
-+            rgbs_grids->base.blocks_ptr = rgbs_grids->blocks_ptr;
-+
-+            input->rgbs_grids_array[i] = &rgbs_grids->base;
-+        }
-+        base->rgbs_grids = (input->rgbs_grids_array);
-+    }
-+
-+    if (base->hdr_rgbs_grid) {
-+        input->hdr_rgbs_grid.base.blocks_ptr = input->hdr_rgbs_grid.blocks_ptr;
-+        base->hdr_rgbs_grid = &input->hdr_rgbs_grid.base;
-+    }
-+
-+    if (base->af_grids) {
-+        CheckError((base->num_af_grids > MAX_NUMBER_OF_AF_GRIDS), false,
-+                   "@%s, num_af_grids:%d > MAX_NUMBER_OF_AF_GRIDS:%d",
-+                   __func__, base->num_af_grids, MAX_NUMBER_OF_AF_GRIDS);
-+
-+        for (int i = 0; i < base->num_af_grids; i++) {
-+            ia_aiq_af_grid_data* af_grids = &input->af_grids[i];
-+            af_grids->base.filter_response_1 = af_grids->filter_response_1;
-+            af_grids->base.filter_response_2 = af_grids->filter_response_2;
-+
-+            input->af_grids_array[i] = &af_grids->base;
-+        }
-+        base->af_grids = input->af_grids_array;
-+    }
-+
-+    if (base->frame_pa_parameters) {
-+        unflattenPaResultsV1(&input->frame_pa_parameters);
-+        base->frame_pa_parameters = &input->frame_pa_parameters.base;
-+    }
-+
-+    if (base->faces) {
-+        input->faces.base.faces = input->faces.faces;
-+        base->faces = &input->faces.base;
-+    }
-+
-+    if (base->awb_results) {
-+        base->awb_results = &input->awb_results;
-+    }
-+
-+    if (base->frame_sa_parameters) {
-+        unflattenSaResultsV2(&input->frame_sa_parameters);
-+        base->frame_sa_parameters = &input->frame_sa_parameters.base;
-+    }
-+
-+    if (base->depth_grids) {
-+        CheckError((base->num_depth_grids > MAX_NUMBER_OF_DEPTH_GRIDS), false,
-+                   "@%s, num_depth_grids:%d > MAX_NUMBER_OF_DEPTH_GRIDS:%d",
-+                   __func__, base->num_depth_grids, MAX_NUMBER_OF_DEPTH_GRIDS);
-+
-+        for (int i = 0; i < base->num_depth_grids; i++) {
-+            ia_aiq_depth_grid_data* depth_grids = &input->depth_grids[i];
-+            depth_grids->base.grid_rect = depth_grids->grid_rect;
-+            depth_grids->base.depth_data = depth_grids->depth_data;
-+            depth_grids->base.confidence = depth_grids->confidence;
-+
-+            input->depth_grids_array[i] = &depth_grids->base;
-+        }
-+        base->depth_grids = input->depth_grids_array;
-+    }
-+
-+    if (base->ir_grid) {
-+        input->ir_grid.data = input->ir_grid_data;
-+        base->ir_grid = &input->ir_grid;
-+    }
-+
-+    *params = base;
-+
-+    return true;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
-new file mode 100644
-index 000000000000..931300bbce79
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelAiq.h
-@@ -0,0 +1,367 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_aiq.h>
-+
-+#include "FaceBase.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+struct aiq_init_params {
-+    unsigned int aiqb_size;
-+    unsigned int nvm_size;
-+    unsigned int aiqd_size;
-+    unsigned int stats_max_width;
-+    unsigned int stats_max_height;
-+    unsigned int max_num_stats_in;
-+    uintptr_t ia_mkn;
-+    uintptr_t cmcRemoteHandle;
-+    uintptr_t results;
-+};
-+
-+struct aiq_deinit_params {
-+    uintptr_t aiq_handle;
-+};
-+
-+struct af_run_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_af_input_params base;
-+    ia_rectangle focus_rect;
-+    ia_aiq_manual_focus_parameters manual_focus_parameters;
-+
-+    ia_aiq_af_results results;
-+};
-+
-+#define MAX_NUM_GAMMA_LUTS 2048
-+#define MAX_NUM_TOME_MAP_LUTS 2048
-+struct gbce_results_params {
-+    ia_aiq_gbce_results base;
-+
-+    float r_gamma_lut[MAX_NUM_GAMMA_LUTS];
-+    float b_gamma_lut[MAX_NUM_GAMMA_LUTS];
-+    float g_gamma_lut[MAX_NUM_GAMMA_LUTS];
-+    float tone_map_lut[MAX_NUM_TOME_MAP_LUTS];
-+};
-+struct gbce_run_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_gbce_input_params base;
-+
-+    gbce_results_params res;
-+};
-+
-+#define MAX_NUM_EXPOSURES 3
-+#define MAX_NUM_FLASHES 1
-+#define MAX_NUM_OF_EXPOSURE_PLANS 4
-+#define MAX_SIZE_WEIGHT_GRID (128 * 128)
-+struct ae_run_params_results {
-+    ia_aiq_ae_results base;
-+
-+    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
-+    ia_aiq_hist_weight_grid weight_grid;
-+    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES];
-+    ia_aiq_aperture_control aperture_control;
-+
-+    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
-+    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES];
-+    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES];
-+    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES][MAX_NUM_OF_EXPOSURE_PLANS];
-+
-+    // the below is in ia_aiq_hist_weight_grid weight_grid;
-+    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
-+};
-+
-+struct ae_run_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_ae_input_params base;
-+    ia_aiq_exposure_sensor_descriptor sensor_descriptor;
-+    ia_rectangle exposure_window;
-+    ia_coordinate exposure_coordinate;
-+    long manual_exposure_time_us;
-+    float manual_analog_gain;
-+    short manual_iso;
-+    ia_aiq_ae_features aec_features;
-+    ia_aiq_ae_manual_limits manual_limits;
-+
-+    ae_run_params_results res;
-+};
-+
-+struct awb_run_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_awb_input_params base;
-+    ia_aiq_awb_manual_cct_range manual_cct_range;
-+    ia_coordinate manual_white_coordinate;
-+
-+    ia_aiq_awb_results results;
-+};
-+
-+#define MAX_NUM_LUTS 128
-+#define MAX_SECTOR_COUNT 128
-+#define MAX_IR_WIDTH 128
-+#define MAX_IR_HEIGHT 128
-+#define MAX_NUM_IR_BLOCKS (MAX_IR_WIDTH * MAX_IR_HEIGHT)
-+#define MAX_NUM_IR_MODES 5
-+struct pa_run_params_results_v1 {
-+    ia_aiq_pa_results_v1 base;
-+
-+    ia_aiq_advanced_ccm_t preferred_acm;
-+    ia_aiq_ir_weight_t ir_weight;
-+    ia_aiq_rgbir_t rgbir;
-+
-+    // for ia_aiq_color_channels_lut linearization
-+    float gr[MAX_NUM_LUTS];
-+    float r[MAX_NUM_LUTS];
-+    float b[MAX_NUM_LUTS];
-+    float gb[MAX_NUM_LUTS];
-+
-+    // for ia_aiq_advanced_ccm_t *preferred_acm
-+    unsigned int hue_of_sectors[MAX_SECTOR_COUNT];
-+    float advanced_color_conversion_matrices[MAX_SECTOR_COUNT][3][3];
-+
-+    // for ia_aiq_ir_weight_t *ir_weight
-+    uint16_t ir_weight_grid_R[MAX_NUM_IR_BLOCKS];
-+    uint16_t ir_weight_grid_G[MAX_NUM_IR_BLOCKS];
-+    uint16_t ir_weight_grid_B[MAX_NUM_IR_BLOCKS];
-+
-+    // for ia_aiq_rgbir_t *rgbir
-+    ia_aiq_rgbir_model_t models[MAX_NUM_IR_MODES];
-+};
-+
-+struct ia_atbx_face_state_data {
-+    ia_atbx_face_state base;
-+
-+    ia_atbx_face faces[MAX_FACES_DETECTABLE];
-+};
-+
-+struct pa_run_v1_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_pa_input_params base;
-+    ia_aiq_awb_results awb_results;
-+    ia_aiq_exposure_parameters exposure_params;
-+    ia_aiq_color_channels color_gains;
-+
-+    pa_run_params_results_v1 res;
-+};
-+
-+#define LSC_MAX_BAYER_ORDER_NUM 4
-+#define LSC_TABLE_MAX_WIDTH 100
-+#define LSC_TABLE_MAX_HEIGHT 100
-+#define LSC_TABLE_MAX_SIZE (LSC_TABLE_MAX_WIDTH * LSC_TABLE_MAX_HEIGHT)
-+struct lsc_grid_content {
-+    uint16_t content[LSC_TABLE_MAX_SIZE];
-+};
-+struct sa_run_v2_params_results {
-+    ia_aiq_sa_results_v1 base;
-+
-+    lsc_grid_content lsc_grid[LSC_MAX_BAYER_ORDER_NUM][LSC_MAX_BAYER_ORDER_NUM];
-+};
-+
-+struct sa_run_v2_params {
-+    uintptr_t aiq_handle;
-+
-+    ia_aiq_sa_input_params_v1 base;
-+    ia_aiq_frame_params sensor_frame_params;
-+    ia_aiq_awb_results awb_results;
-+
-+    sa_run_v2_params_results res;
-+};
-+
-+#define MAX_IA_BINARY_DATA_PARAMS_SIZE 500000
-+struct ia_binary_data_params {
-+    uintptr_t aiq_handle;
-+    uint8_t data[MAX_IA_BINARY_DATA_PARAMS_SIZE];
-+    unsigned int size;
-+};
-+
-+#define MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE 100
-+struct ia_aiq_version_params {
-+    uintptr_t aiq_handle;
-+    char data[MAX_IA_AIQ_VERSION_PARAMS_DATA_SIZE];
-+    unsigned int size;
-+};
-+
-+#define MAX_WIDTH 96
-+#define MAX_HEIGHT 72
-+#define MAX_NUM_BLOCKS (MAX_WIDTH * MAX_HEIGHT)
-+struct ia_aiq_rgbs_grid_data {
-+    ia_aiq_rgbs_grid base;
-+
-+    rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
-+};
-+
-+struct ia_aiq_hdr_rgbs_grid_data {
-+    ia_aiq_hdr_rgbs_grid base;
-+
-+    hdr_rgbs_grid_block blocks_ptr[MAX_NUM_BLOCKS];
-+};
-+
-+#define MAX_AF_GRID_WIDTH 96
-+#define MAX_AF_GRID_HEIGHT 72
-+#define MAX_AF_GRID_SIZE (MAX_AF_GRID_HEIGHT * MAX_AF_GRID_WIDTH)
-+struct ia_aiq_af_grid_data {
-+    ia_aiq_af_grid base;
-+
-+    int filter_response_1[MAX_AF_GRID_SIZE];
-+    int filter_response_2[MAX_AF_GRID_SIZE];
-+};
-+
-+#define MAX_DEPTH_GRID_WIDHT 128
-+#define MAX_DEPTH_GRID_HEIGHT 128
-+#define MAX_DEPTH_GRID_SIZE (MAX_DEPTH_GRID_WIDHT * MAX_DEPTH_GRID_HEIGHT)
-+struct ia_aiq_depth_grid_data {
-+    ia_aiq_depth_grid base;
-+
-+    ia_rectangle grid_rect[MAX_DEPTH_GRID_SIZE];
-+    int depth_data[MAX_DEPTH_GRID_SIZE];
-+    unsigned char confidence[MAX_DEPTH_GRID_SIZE];
-+};
-+
-+#define MAX_NUMBER_OF_GRIDS 1
-+#define MAX_NUMBER_OF_AF_GRIDS 1
-+#define MAX_NUMBER_OF_HISTROGRAMS 1
-+#define MAX_NUMBER_OF_DEPTH_GRIDS 1
-+#define MAX_IR_WEIGHT_GRID_DATA_SIZE 480
-+struct set_statistics_params_data {
-+    ia_aiq_statistics_input_params_v4 base;
-+
-+    ae_run_params_results frame_ae_parameters;
-+
-+    ia_aiq_af_results frame_af_parameters;
-+
-+    const ia_aiq_rgbs_grid* rgbs_grids_array[MAX_NUMBER_OF_GRIDS];
-+    ia_aiq_rgbs_grid_data rgbs_grids[MAX_NUMBER_OF_GRIDS];
-+
-+    ia_aiq_hdr_rgbs_grid_data hdr_rgbs_grid;
-+
-+    const ia_aiq_af_grid* af_grids_array[MAX_NUMBER_OF_AF_GRIDS];
-+    ia_aiq_af_grid_data af_grids[MAX_NUMBER_OF_AF_GRIDS];
-+
-+    pa_run_params_results_v1 frame_pa_parameters;
-+
-+    ia_atbx_face_state_data faces;
-+
-+    ia_aiq_awb_results awb_results;
-+
-+    sa_run_v2_params_results frame_sa_parameters;
-+
-+    const ia_aiq_depth_grid* depth_grids_array[MAX_NUMBER_OF_DEPTH_GRIDS];
-+    ia_aiq_depth_grid_data depth_grids[MAX_NUMBER_OF_DEPTH_GRIDS];
-+
-+    ia_aiq_grid ir_grid;
-+    unsigned short ir_grid_data[MAX_IR_WEIGHT_GRID_DATA_SIZE];
-+};
-+
-+struct set_statistics_set_v4_params {
-+    uintptr_t ia_aiq;
-+    set_statistics_params_data input;
-+};
-+
-+class IPCIntelAiq {
-+ public:
-+    IPCIntelAiq();
-+    virtual ~IPCIntelAiq();
-+
-+    // for init
-+    bool clientFlattenInit(const ia_binary_data* aiqbData,
-+                           const ia_binary_data* nvmData,
-+                           const ia_binary_data* aiqdData,
-+                           unsigned int statsMaxWidth,
-+                           unsigned int statsMaxHeight,
-+                           unsigned int maxNumStatsIn,
-+                           uintptr_t cmc,
-+                           uintptr_t mkn,
-+                           uint8_t* pData, unsigned int size);
-+    bool serverUnflattenInit(const void* pData, int dataSize,
-+                             ia_binary_data* aiqbData,
-+                             ia_binary_data* nvmData,
-+                             ia_binary_data* aiqdData);
-+
-+    // for ae
-+    bool clientFlattenAe(uintptr_t aiq,
-+                         const ia_aiq_ae_input_params& inParams,
-+                         ae_run_params* params);
-+    bool clientUnflattenAe(ae_run_params* params, ia_aiq_ae_results** results);
-+    bool serverUnflattenAe(ae_run_params* inParams, ia_aiq_ae_input_params** params);
-+    bool serverFlattenAe(const ia_aiq_ae_results& aeResults, ae_run_params* params);
-+
-+    bool flattenAeResults(const ia_aiq_ae_results& aeResults, ae_run_params_results* res);
-+    bool unflattenAeResults(ae_run_params_results* res);
-+
-+    // for af
-+    bool clientFlattenAf(uintptr_t aiq,
-+                         const ia_aiq_af_input_params& inParams,
-+                         af_run_params* params);
-+    bool clientUnflattenAf(const af_run_params& params, ia_aiq_af_results** results);
-+    bool serverUnflattenAf(af_run_params* inParams, ia_aiq_af_input_params** params);
-+    bool serverFlattenAf(const ia_aiq_af_results& afResults, af_run_params* params);
-+
-+    // for awb
-+    bool clientFlattenAwb(uintptr_t aiq,
-+                          const ia_aiq_awb_input_params& inParams,
-+                          awb_run_params* params);
-+    bool clientUnflattenAwb(const awb_run_params& inParams, ia_aiq_awb_results** results);
-+    bool serverUnflattenAwb(awb_run_params* inParams, ia_aiq_awb_input_params** params);
-+    bool serverFlattenAwb(const ia_aiq_awb_results& awbResults, awb_run_params* params);
-+
-+    // for gbce
-+    bool clientFlattenGbce(uintptr_t aiq,
-+                           const ia_aiq_gbce_input_params& inParams,
-+                           gbce_run_params* params);
-+    bool clientUnflattenGbce(gbce_run_params* params, ia_aiq_gbce_results** results);
-+    bool serverFlattenGbce(const ia_aiq_gbce_results& gbceResults, gbce_run_params* params);
-+
-+    bool flattenGbceResults(const ia_aiq_gbce_results& gbceResults, gbce_results_params* res);
-+    bool unflattenGbceResults(gbce_results_params* res);
-+
-+    // for pa
-+    bool clientFlattenPaV1(uintptr_t aiq,
-+                           const ia_aiq_pa_input_params& inParams,
-+                           pa_run_v1_params* params);
-+    bool clientUnflattenPaV1(pa_run_v1_params* params, ia_aiq_pa_results_v1** results);
-+    bool serverUnflattenPaV1(pa_run_v1_params* inParams, ia_aiq_pa_input_params** params);
-+    bool serverFlattenPaV1(const ia_aiq_pa_results_v1& paResults, pa_run_v1_params* params);
-+
-+    bool flattenPaResultsV1(const ia_aiq_pa_results_v1& paResults,
-+                            pa_run_params_results_v1* res);
-+    bool unflattenPaResultsV1(pa_run_params_results_v1* res);
-+
-+    // for sa
-+    bool clientFlattenSaV2(uintptr_t aiq,
-+                           const ia_aiq_sa_input_params_v1& inParams,
-+                           sa_run_v2_params* params);
-+    bool clientUnflattenSaV2(sa_run_v2_params* params, ia_aiq_sa_results_v1** results);
-+    bool serverUnflattenSaV2(const sa_run_v2_params& inParams, ia_aiq_sa_input_params_v1** params);
-+    bool serverFlattenSaV2(const ia_aiq_sa_results_v1& saResults, sa_run_v2_params* params);
-+
-+    bool flattenSaResultsV2(const ia_aiq_sa_results_v1& saResults,
-+                            sa_run_v2_params_results* res);
-+    bool unflattenSaResultsV2(sa_run_v2_params_results* res);
-+
-+    // for statistics
-+    bool clientFlattenStatSetV4(uintptr_t aiq,
-+                                const ia_aiq_statistics_input_params_v4& inParams,
-+                                set_statistics_set_v4_params* params);
-+    bool serverUnflattenStatSetV4(set_statistics_set_v4_params* inParams,
-+                                  ia_aiq_statistics_input_params_v4** params);
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
-new file mode 100644
-index 000000000000..b751ebdf60ac
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.cpp
-@@ -0,0 +1,259 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_INTEL_CMC"
-+
-+#include "modules/sandboxing/IPCIntelCmc.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelCmc::IPCIntelCmc() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelCmc::~IPCIntelCmc() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIntelCmc::clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params) {
-+    LOGIPC("@%s, aiqb: data:%p, size:%d, params:%p", __func__, aiqb.data, aiqb.size, params);
-+
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!aiqb.data, false, "@%s, aiqb.data is nullptr", __func__);
-+    CheckError(aiqb.size == 0, false, "@%s, aiqb.size is 0", __func__);
-+    CheckError(aiqb.size > sizeof(params->input.data), false,
-+               "@%s, aiqb:%d is too big", __func__, aiqb.size);
-+
-+    ia_binary_data_mod* input = &params->input;
-+    MEMCPY_S(input->data, sizeof(input->data), aiqb.data, aiqb.size);
-+    input->size = aiqb.size;
-+
-+    return true;
-+}
-+
-+bool IPCIntelCmc::clientUnflattenInit(const cmc_init_params& params,
-+                                      ia_cmc_t** cmc,
-+                                      uintptr_t* cmcRemoteHandle) {
-+    LOGIPC("@%s, cmc:%p", __func__, cmc);
-+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
-+
-+    int ret = unflattenCmcData(const_cast<ia_cmc_data*>(&params.results));
-+    CheckError(ret == false, false, "%s, unflattenCmcData fails", __func__);
-+
-+    *cmc = const_cast<ia_cmc_t*>(&params.results.base);
-+    *cmcRemoteHandle = params.results.cmcRemoteHandle;
-+
-+    return true;
-+}
-+
-+bool IPCIntelCmc::serverUnflattenInit(const cmc_init_params& params, ia_binary_data* aiqb) {
-+    LOGIPC("@%s, aiqb:%p", __func__, aiqb);
-+    CheckError(aiqb == nullptr, false, "@%s, aiqb is nullptr", __func__);
-+
-+    ia_binary_data_mod* input = const_cast<ia_binary_data_mod*>(&params.input);
-+    aiqb->data = input->data;
-+    aiqb->size = input->size;
-+
-+    return true;
-+}
-+
-+bool IPCIntelCmc::serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    int ret = flattenCmcData(&cmc, &params->results);
-+    CheckError(ret == false, false, "%s flattenCmcData fails", __func__);
-+
-+    return true;
-+}
-+
-+bool IPCIntelCmc::flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results) {
-+    CheckError(!cmc || !results, false, "%s, cmc or results is nullptr", __func__);
-+
-+    results->base = *cmc;
-+    results->cmcRemoteHandle = reinterpret_cast<uintptr_t>(cmc);
-+
-+    ia_cmc_t* base = &results->base;
-+    if (base->cmc_general_data) {
-+        results->cmc_general_data = *base->cmc_general_data;
-+    }
-+
-+    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
-+    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
-+    if (baseBL->cmc_black_level) {
-+        retBL->cmc_black_level = *baseBL->cmc_black_level;
-+    }
-+    if (baseBL->cmc_black_level_luts) {
-+        retBL->cmc_black_level_luts = *baseBL->cmc_black_level_luts;
-+    }
-+
-+    if (base->cmc_saturation_level) {
-+        results->cmc_saturation_level = *base->cmc_saturation_level;
-+    }
-+
-+    if (base->cmc_sensitivity) {
-+        results->cmc_sensitivity = *base->cmc_sensitivity;
-+    }
-+
-+    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
-+    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
-+    if (baseLS->cmc_lens_shading) {
-+        retLS->cmc_lens_shading = *baseLS->cmc_lens_shading;
-+    }
-+    if (baseLS->cmc_lsc_grids) {
-+        retLS->cmc_lsc_grids = *baseLS->cmc_lsc_grids;
-+    }
-+    if (baseLS->lsc_grids) {
-+        retLS->lsc_grids = *baseLS->lsc_grids;
-+    }
-+    if (baseLS->cmc_lsc_rg_bg_ratios) {
-+        retLS->cmc_lsc_rg_bg_ratios = *baseLS->cmc_lsc_rg_bg_ratios;
-+    }
-+
-+    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
-+    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
-+    if (baseOptics->cmc_optomechanics) {
-+        retOptics->cmc_optomechanics = *baseOptics->cmc_optomechanics;
-+    }
-+    if (baseOptics->lut_apertures) {
-+        retOptics->lut_apertures = *baseOptics->lut_apertures;
-+    }
-+
-+    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
-+    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
-+    if (baseCM->cmc_color_matrices) {
-+        retCM->cmc_color_matrices = *baseCM->cmc_color_matrices;
-+    }
-+    if (baseCM->cmc_color_matrix) {
-+        // fix asan issue:base->cmc_parsed_color_matrices.cmc_color_matrix is not 4 aligned
-+        // use memcpy instead of *
-+        MEMCPY_S(&retCM->cmc_color_matrix, sizeof(retCM->cmc_color_matrix),
-+                 baseCM->cmc_color_matrix, sizeof(cmc_color_matrix_t));
-+    }
-+    if (baseCM->ccm_estimate_method) {
-+        retCM->ccm_estimate_method = *baseCM->ccm_estimate_method;
-+    }
-+
-+    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
-+    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
-+    if (baseAGC->cmc_analog_gain_conversion) {
-+        retAGC->cmc_analog_gain_conversion = *baseAGC->cmc_analog_gain_conversion;
-+
-+        CheckError(baseAGC->cmc_analog_gain_conversion->num_segments > MAX_NUM_SEGMENTS,
-+                   false, "@%s, num_segments:%d is too big", __func__,
-+                   baseAGC->cmc_analog_gain_conversion->num_segments);
-+        CheckError(baseAGC->cmc_analog_gain_conversion->num_pairs > MAX_NUM_ANALOG_PAIRS,
-+                   false, "@%s, num_pairs:%d is too big", __func__,
-+                   baseAGC->cmc_analog_gain_conversion->num_pairs);
-+
-+        if (baseAGC->cmc_analog_gain_segments) {
-+            MEMCPY_S(retAGC->cmc_analog_gain_segments, sizeof(retAGC->cmc_analog_gain_segments),
-+                     baseAGC->cmc_analog_gain_segments,
-+                     (sizeof(*baseAGC->cmc_analog_gain_segments)
-+                     * baseAGC->cmc_analog_gain_conversion->num_segments));
-+        }
-+        if (baseAGC->cmc_analog_gain_pairs) {
-+            MEMCPY_S(retAGC->cmc_analog_gain_pairs, sizeof(retAGC->cmc_analog_gain_pairs),
-+                     baseAGC->cmc_analog_gain_pairs,
-+                     (sizeof(*baseAGC->cmc_analog_gain_pairs)
-+                     * baseAGC->cmc_analog_gain_conversion->num_pairs));
-+        }
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelCmc::unflattenCmcData(ia_cmc_data* results) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!results, false, "%s, results is nullptr", __func__);
-+
-+    ia_cmc_t* base = &results->base;
-+
-+    if (base->cmc_general_data) {
-+        base->cmc_general_data = &results->cmc_general_data;
-+    }
-+
-+    cmc_parsed_black_level_t* baseBL = &base->cmc_parsed_black_level;
-+    cmc_parsed_black_level_data* retBL = &results->cmc_parsed_black_level;
-+    if (baseBL->cmc_black_level) {
-+        baseBL->cmc_black_level = &retBL->cmc_black_level;
-+    }
-+    if (baseBL->cmc_black_level_luts) {
-+        baseBL->cmc_black_level_luts = &retBL->cmc_black_level_luts;
-+    }
-+
-+    if (base->cmc_saturation_level) {
-+        base->cmc_saturation_level = &results->cmc_saturation_level;
-+    }
-+
-+    if (base->cmc_sensitivity) {
-+        base->cmc_sensitivity = &results->cmc_sensitivity;
-+    }
-+
-+    cmc_parsed_lens_shading_t* baseLS = &base->cmc_parsed_lens_shading;
-+    cmc_parsed_lens_shading_data* retLS = &results->cmc_parsed_lens_shading;
-+    if (baseLS->cmc_lens_shading) {
-+        baseLS->cmc_lens_shading = &retLS->cmc_lens_shading;
-+    }
-+    if (baseLS->cmc_lsc_grids) {
-+        baseLS->cmc_lsc_grids = &retLS->cmc_lsc_grids;
-+    }
-+    if (baseLS->lsc_grids) {
-+        baseLS->lsc_grids = &retLS->lsc_grids;
-+    }
-+    if (baseLS->cmc_lsc_rg_bg_ratios) {
-+        baseLS->cmc_lsc_rg_bg_ratios = &retLS->cmc_lsc_rg_bg_ratios;
-+    }
-+
-+    cmc_parsed_optics_t* baseOptics = &base->cmc_parsed_optics;
-+    cmc_parsed_optics_data* retOptics = &results->cmc_parsed_optics;
-+    if (baseOptics->cmc_optomechanics) {
-+        baseOptics->cmc_optomechanics = &retOptics->cmc_optomechanics;
-+    }
-+    if (baseOptics->lut_apertures) {
-+        baseOptics->lut_apertures = &retOptics->lut_apertures;
-+    }
-+
-+    cmc_parsed_color_matrices_t* baseCM = &base->cmc_parsed_color_matrices;
-+    cmc_parsed_color_matrices_data* retCM = &results->cmc_parsed_color_matrices;
-+    if (baseCM->cmc_color_matrices) {
-+        baseCM->cmc_color_matrices = &retCM->cmc_color_matrices;
-+    }
-+    if (baseCM->cmc_color_matrix) {
-+        baseCM->cmc_color_matrix = &retCM->cmc_color_matrix;
-+    }
-+    if (baseCM->ccm_estimate_method) {
-+        baseCM->ccm_estimate_method = &retCM->ccm_estimate_method;
-+    }
-+
-+    cmc_parsed_analog_gain_conversion_t* baseAGC = &base->cmc_parsed_analog_gain_conversion;
-+    cmc_parsed_analog_gain_conversion_data* retAGC = &results->cmc_parsed_analog_gain_conversion;
-+    if (baseAGC->cmc_analog_gain_conversion) {
-+        baseAGC->cmc_analog_gain_conversion = &retAGC->cmc_analog_gain_conversion;
-+
-+        if (baseAGC->cmc_analog_gain_segments) {
-+            baseAGC->cmc_analog_gain_segments = retAGC->cmc_analog_gain_segments;
-+        }
-+        if (baseAGC->cmc_analog_gain_pairs) {
-+            baseAGC->cmc_analog_gain_pairs = retAGC->cmc_analog_gain_pairs;
-+        }
-+    }
-+
-+    return true;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
-new file mode 100644
-index 000000000000..bc57ca06c16b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelCmc.h
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_types.h>
-+#include <ia_cmc_types.h>
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+
-+namespace icamera {
-+typedef struct {
-+    cmc_black_level_t cmc_black_level;
-+    cmc_black_level_lut_t cmc_black_level_luts;
-+} cmc_parsed_black_level_data;
-+
-+typedef struct {
-+    cmc_lens_shading_t cmc_lens_shading;
-+    cmc_lsc_grid_t cmc_lsc_grids;
-+    uint16_t lsc_grids;
-+    chromaticity_t cmc_lsc_rg_bg_ratios;
-+} cmc_parsed_lens_shading_data;
-+
-+typedef struct {
-+    cmc_optomechanics_t cmc_optomechanics;
-+    uint16_t lut_apertures;
-+} cmc_parsed_optics_data;
-+
-+typedef struct {
-+    cmc_color_matrices_t cmc_color_matrices;
-+    cmc_color_matrix_t cmc_color_matrix;
-+    uint16_t ccm_estimate_method;
-+} cmc_parsed_color_matrices_data;
-+
-+#define MAX_NUM_SEGMENTS 512
-+#define MAX_NUM_ANALOG_PAIRS 1024
-+typedef struct {
-+    cmc_analog_gain_conversion_t cmc_analog_gain_conversion;
-+    cmc_analog_gain_segment_t cmc_analog_gain_segments[MAX_NUM_SEGMENTS];
-+    cmc_analog_gain_pair_t cmc_analog_gain_pairs[MAX_NUM_ANALOG_PAIRS];
-+} cmc_parsed_analog_gain_conversion_data;
-+
-+struct ia_cmc_data {
-+    ia_cmc_t base;
-+
-+    cmc_general_data_t cmc_general_data;
-+    cmc_parsed_black_level_data cmc_parsed_black_level;
-+    cmc_saturation_level_t cmc_saturation_level;
-+    cmc_sensitivity_t cmc_sensitivity;
-+    cmc_parsed_lens_shading_data cmc_parsed_lens_shading;
-+    cmc_parsed_optics_data cmc_parsed_optics;
-+    cmc_parsed_color_matrices_data cmc_parsed_color_matrices;
-+    cmc_parsed_analog_gain_conversion_data cmc_parsed_analog_gain_conversion;
-+
-+    uintptr_t cmcRemoteHandle;  // it stores the remote cmc pointer.
-+};
-+
-+struct cmc_init_params {
-+    ia_binary_data_mod input;
-+    ia_cmc_data results;
-+};
-+
-+struct cmc_deinit_params {
-+    uintptr_t cmc_handle;
-+};
-+
-+class IPCIntelCmc {
-+ public:
-+    IPCIntelCmc();
-+    virtual ~IPCIntelCmc();
-+
-+    // for init
-+    bool clientFlattenInit(const ia_binary_data& aiqb, cmc_init_params* params);
-+    bool clientUnflattenInit(const cmc_init_params& params,
-+                             ia_cmc_t** cmc,
-+                             uintptr_t* cmcRemoteHandle);
-+    bool serverFlattenInit(const ia_cmc_t& cmc, cmc_init_params* params);
-+    bool serverUnflattenInit(const cmc_init_params& pData, ia_binary_data* aiqb);
-+
-+    bool flattenCmcData(const ia_cmc_t* cmc, ia_cmc_data* results);
-+    bool unflattenCmcData(ia_cmc_data* results);
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
-new file mode 100644
-index 000000000000..aa86cb613fe9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
-@@ -0,0 +1,724 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_INTEL_DVS"
-+
-+#include "modules/sandboxing/IPCIntelDvs.h"
-+
-+#include <ia_types.h>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelDvs::IPCIntelDvs() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelDvs::~IPCIntelDvs() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIntelDvs::clientFlattenInit(void *pData, unsigned int size,
-+                                    const ia_binary_data *dvsDataPtr, const ia_cmc_t *cmc) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p",
-+           __func__, pData, size, dvsDataPtr, cmc);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
-+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
-+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
-+    CheckError(dvsDataPtr->size > MAX_DVS_DATA_SIZE, false,
-+               "@%s, data:%d is too small", __func__, dvsDataPtr->size);
-+
-+    DvsInitParams *params = static_cast<DvsInitParams*>(pData);
-+    params->base.size = dvsDataPtr->size;
-+    params->base.data = params->data;
-+    MEMCPY_S(params->data, MAX_DVS_DATA_SIZE, dvsDataPtr->data, dvsDataPtr->size);
-+
-+    params->cmcHandle = reinterpret_cast<uintptr_t>(cmc);
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenInit(void *pData, int size,
-+                                      ia_binary_data **dvsDataPtr, ia_cmc_t **cmc) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvsDataPtr:%p, cmc:%p",
-+           __func__, pData, size, dvsDataPtr, cmc);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvsDataPtr, false, "@%s, dvsDataPtr is nullptr", __func__);
-+    CheckError(!cmc, false, "@%s, cmc is nullptr", __func__);
-+
-+    DvsInitParams *params = reinterpret_cast<DvsInitParams*>(pData);
-+    params->base.data = params->data;
-+
-+    *dvsDataPtr = &params->base;
-+    *cmc = reinterpret_cast<ia_cmc_t *>(params->cmcHandle);
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverFlattenInit(void *pData, unsigned int size, ia_dvs_state *dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
-+
-+    DvsInitParams *params = static_cast<DvsInitParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientUnflattenInit(const void *pData, unsigned int size, ia_dvs_state **dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsInitParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    const DvsInitParams *params = static_cast<const DvsInitParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenDeinit(void *pData, unsigned int size, ia_dvs_state *dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsDeinitParams* params = static_cast<DvsDeinitParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenDeinit(const void *pData, unsigned int size, ia_dvs_state **dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDeinitParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    const DvsDeinitParams* params = static_cast<const DvsDeinitParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenConfig(void *pData, unsigned int size, ia_dvs_state *dvs,
-+                                      const ia_dvs_configuration *config, float zoomRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f",
-+           __func__, pData, size, dvs, config, zoomRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!config, false, "@%s, config is nullptr", __func__);
-+
-+    DvsConfigParams *params = static_cast<DvsConfigParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    MEMCPY_S(&params->configData, sizeof(ia_dvs_configuration),
-+             config, sizeof(ia_dvs_configuration));
-+    params->zoomRatio = zoomRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenConfig(const void *pData, unsigned int size, ia_dvs_state **dvs,
-+                                        ia_dvs_configuration **config, float *zoomRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, config:%p, zoomRatio:%f",
-+           __func__, pData, size, dvs, config, zoomRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsConfigParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!config, false, "@%s, config is nullptr", __func__);
-+    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
-+
-+    DvsConfigParams *params =
-+                       const_cast<DvsConfigParams*>(static_cast<const DvsConfigParams*>(pData));
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *config = &params->configData;
-+    *zoomRatio = params->zoomRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenNoneBlanckRation(void *pData, unsigned int size,
-+                                                ia_dvs_state *dvs, float nonBlankingRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f",
-+           __func__, pData, size, dvs, nonBlankingRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsNoneBlankRatioParams *params = static_cast<DvsNoneBlankRatioParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->nonBlankingRatio = nonBlankingRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenNoneBlanckRation(const void *pData, unsigned int size,
-+                                                  ia_dvs_state **dvs, float *nonBlankingRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, nonBlankingRatio:%f",
-+           __func__, pData, size, dvs, nonBlankingRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsNoneBlankRatioParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!nonBlankingRatio, false, "@%s, nonBlankingRatio is nullptr", __func__);
-+
-+    const DvsNoneBlankRatioParams *params = static_cast<const DvsNoneBlankRatioParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *nonBlankingRatio = params->nonBlankingRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenDigitalZoomMode(void *pData, unsigned int size,
-+                                               ia_dvs_state *dvs, ia_dvs_zoom_mode zoomMode) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsDigitalZoomMode *params = static_cast<DvsDigitalZoomMode*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->zoomMode = zoomMode;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenDigitalZoomMode(const void *pData, unsigned int size,
-+                                                 ia_dvs_state **dvs,
-+                                                 ia_dvs_zoom_mode *zoomMode) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomMode:%d", __func__, pData, size, dvs, zoomMode);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomMode), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomMode, false, "@%s, zoomMode is nullptr", __func__);
-+
-+    const DvsDigitalZoomMode *params = static_cast<const DvsDigitalZoomMode*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *zoomMode = params->zoomMode;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenDigitalZoomRegion(void *pData, unsigned int size,
-+                                                 ia_dvs_state *dvs, ia_rectangle *zoomRegion) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p",
-+           __func__, pData, size, dvs, zoomRegion);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
-+
-+    DvsDigitalZoomRegion *params = static_cast<DvsDigitalZoomRegion*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->zoomRegion = *zoomRegion;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenDigitalZoomRegion(const void *pData, unsigned int size,
-+                                                   ia_dvs_state **dvs,
-+                                                   ia_rectangle **zoomRegion) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRegion:%p",
-+           __func__, pData, size, dvs, zoomRegion);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomRegion), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomRegion, false, "@%s, zoomRegion is nullptr", __func__);
-+
-+    DvsDigitalZoomRegion *params =
-+              const_cast<DvsDigitalZoomRegion*>(static_cast<const DvsDigitalZoomRegion*>(pData));
-+    *dvs = reinterpret_cast<ia_dvs_state *>(params->dvsHandle);
-+    *zoomRegion = &params->zoomRegion;
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenDigitalZoomCoordinate(void *pData, unsigned int size,
-+                                                     ia_dvs_state *dvs,
-+                                                     ia_coordinate *zoomCoordinate) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p",
-+           __func__, pData, size, dvs, zoomCoordinate);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
-+
-+    DvsDigitalZoomCoordinate *params = static_cast<DvsDigitalZoomCoordinate*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->zoomCoordinate = *zoomCoordinate;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenDigitalZoomCoordinate(const void *pData, unsigned int size,
-+                                                       ia_dvs_state **dvs,
-+                                                       ia_coordinate **zoomCoordinate) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomCoordinate:%p",
-+           __func__, pData, size, dvs, zoomCoordinate);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomCoordinate), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomCoordinate, false, "@%s, zoomCoordinate is nullptr", __func__);
-+
-+    DvsDigitalZoomCoordinate *params =
-+       const_cast<DvsDigitalZoomCoordinate*>(static_cast<const DvsDigitalZoomCoordinate*>(pData));
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *zoomCoordinate = &params->zoomCoordinate;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenDigitalZoomMagnitude(void *pData, unsigned int size,
-+                                                    ia_dvs_state *dvs, float zoomRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f",
-+           __func__, pData, size, dvs, zoomRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsDigitalZoomMagnitude *params = static_cast<DvsDigitalZoomMagnitude*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->zoomRatio = zoomRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenDigitalZoomMagnitude(const void *pData, unsigned int size,
-+                                                      ia_dvs_state **dvs, float *zoomRatio) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, zoomRatio:%f",
-+           __func__, pData, size, dvs, zoomRatio);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsDigitalZoomMagnitude), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!zoomRatio, false, "@%s, zoomRatio is nullptr", __func__);
-+
-+    const DvsDigitalZoomMagnitude *params = static_cast<const DvsDigitalZoomMagnitude*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *zoomRatio = params->zoomRatio;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenFreeMorphTable(void *pData, unsigned int size,
-+                                              ia_dvs_state *dvs,
-+                                              ia_dvs_morph_table *morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    DvsFreeMorphParams *params = static_cast<DvsFreeMorphParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenFreeMorphTable(const void *pData, unsigned int size,
-+                                                ia_dvs_state **dvs,
-+                                                ia_dvs_morph_table **morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsFreeMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    const DvsFreeMorphParams *params = static_cast<const DvsFreeMorphParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenAllocateMorphTable(void *pData, unsigned int size,
-+                                                  ia_dvs_state *dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
-+                                                    ia_dvs_state **dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverFlattenAllocateMorphTalbe(void *pData, unsigned int size,
-+                                                  ia_dvs_morph_table *morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, morphRemote:%p", __func__, pData, size, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
-+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
-+                                                    ia_dvs_morph_table **morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
-+
-+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
-+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenGetMorphTable(void *pData, unsigned int size,
-+                                             ia_dvs_state *dvs,
-+                                             ia_dvs_morph_table *morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->morphHandle = reinterpret_cast<uintptr_t>(morphTable);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenGetMorphTalbe(const void *pData, unsigned int size,
-+                                               ia_dvs_state **dvs,
-+                                               ia_dvs_morph_table **morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, morphTable:%p",
-+           __func__, pData, size, dvs, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    const DvsMorphParams *params = static_cast<const DvsMorphParams*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *morphTable = reinterpret_cast<ia_dvs_morph_table*>(params->morphHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::flattenMorphTable(const ia_dvs_morph_table *morphTable, DvsMorphParams *params) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!morphTable->xcoords_y || !morphTable->ycoords_y,
-+               false, "@%s, y coords is nullptr", __func__);
-+    CheckError(!morphTable->xcoords_uv || !morphTable->ycoords_uv,
-+               false, "@%s, uv coords is nullptr", __func__);
-+    CheckError(!morphTable->xcoords_uv_float || !morphTable->ycoords_uv_float,
-+               false, "@%s, uv coords float is nullptr", __func__);
-+
-+    unsigned int SizeY = morphTable->width_y * morphTable->height_y * sizeof(int32_t);
-+    unsigned int SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(int32_t);
-+    unsigned int SizeYLocal = MAX_DVS_COORDS_Y_SIZE * sizeof(int32_t);
-+    unsigned int SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(int32_t);
-+    CheckError(SizeY > SizeYLocal, false, "@%s, coords_y data is small", __func__);
-+    CheckError(SizeUV > SizeUVLocal, false, "@%s, coords_uv data is small", __func__);
-+    MEMCPY_S(params->xcoordsY, SizeYLocal, morphTable->xcoords_y, SizeY);
-+    MEMCPY_S(params->ycoordsY, SizeYLocal, morphTable->ycoords_y, SizeY);
-+    MEMCPY_S(params->xcoordsUV, SizeUVLocal, morphTable->xcoords_uv, SizeUV);
-+    MEMCPY_S(params->ycoordsUV, SizeUVLocal, morphTable->ycoords_uv, SizeUV);
-+
-+    SizeUV = morphTable->width_uv * morphTable->height_uv * sizeof(float);
-+    SizeUVLocal = MAX_DVS_COORDS_UV_SIZE * sizeof(float);
-+    CheckError(SizeUV > SizeUVLocal, false,
-+               "@%s, coords_uv data of float type is small", __func__);
-+    MEMCPY_S(params->xcoordsUVFloat, SizeUVLocal, morphTable->xcoords_uv_float, SizeUV);
-+    MEMCPY_S(params->ycoordsUVFloat, SizeUVLocal, morphTable->ycoords_uv_float, SizeUV);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverFlattenGetMorphTalbe(void *pData, unsigned int size,
-+                                             ia_dvs_morph_table *morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d, morphTable:%p", __func__, pData, size, morphTable);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!morphTable, false, "@%s, morphTable is nullptr", __func__);
-+
-+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
-+    params->morphTable = *morphTable;
-+
-+    return flattenMorphTable(morphTable, params);
-+}
-+
-+bool IPCIntelDvs::unflattenMorphTalbe(DvsMorphParams *params) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    params->morphTable.xcoords_y = params->xcoordsY;
-+    params->morphTable.ycoords_y = params->ycoordsY;
-+    params->morphTable.xcoords_uv = params->xcoordsUV;
-+    params->morphTable.ycoords_uv = params->ycoordsUV;
-+    params->morphTable.xcoords_uv_float = params->xcoordsUVFloat;
-+    params->morphTable.ycoords_uv_float = params->ycoordsUVFloat;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientUnflattenGetMorphTalbe(void *pData, unsigned int size,
-+                                               ia_dvs_morph_table **morphTable) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsMorphParams), false, "@%s, buffer is small", __func__);
-+    CheckError(!morphTable, false, "@%s, morphLocal is nullptr", __func__);
-+
-+    DvsMorphParams *params = static_cast<DvsMorphParams*>(pData);
-+    bool ret = unflattenMorphTalbe(params);
-+    CheckError(!ret, false, "@%s, unflattenMorphTalbe fails", __func__);
-+    *morphTable = &params->morphTable;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenSetStatistics(void *pData, unsigned int size,
-+                                             ia_dvs_state *dvs,
-+                                             const ia_dvs_statistics *statistics,
-+                                             const ia_aiq_ae_results *aeResults,
-+                                             const ia_aiq_af_results *afResults,
-+                                             const ia_aiq_sensor_events *sensorEvents,
-+                                             uint64_t frameReadoutStart,
-+                                             uint64_t frameReadoutEnd) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsStatistcs), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsStatistcs *params = static_cast<DvsStatistcs*>(pData);
-+    CLEAR(*params);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+
-+    if (statistics) {
-+        params->statisticsFlag = true;
-+        CheckError(MV_ENTRIE_COUNT < statistics->vector_count,
-+                   false, "statistics buffer is small");
-+        params->statistics.vector_count = statistics->vector_count;
-+        MEMCPY_S(params->motion_vectors,
-+                 MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
-+                 statistics->motion_vectors,
-+                 statistics->vector_count * sizeof(ia_dvs_motion_vector));
-+    }
-+
-+    if (aeResults) {
-+        params->aeResultsFlag = true;
-+        int ret = mIpcAiq.flattenAeResults(*aeResults, &params->aeResultsBase);
-+        CheckError(ret != OK, false, "failed to copy ae result");
-+    }
-+
-+    if (afResults) {
-+        params->afResultsFlag = true;
-+        params->afResultsBase = *afResults;
-+    }
-+
-+    if (sensorEvents) {
-+        params->sensorEventsFlag = true;
-+        size_t sensorDataLen = sizeof(ia_aiq_sensor_data);
-+        size_t sensorEventLen = sensorDataLen * MAX_MOTION_SENSOR_COUNT_DVS;
-+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_accelerometer_events, false,
-+                   "accelerometer_events buffer is small");
-+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gravity_events, false,
-+                   "gravity_events buffer is small");
-+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_gyroscope_events, false,
-+                   "gyroscope_events buffer is small");
-+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_ambient_light_events, false,
-+                   "ambient_light_events buffer is small");
-+        CheckError(MAX_MOTION_SENSOR_COUNT_DVS < sensorEvents->num_dmd_events, false,
-+                   "dmd_events buffer is small");
-+        MEMCPY_S(params->sensorEvents.accelerometer_events, sensorEventLen,
-+                 sensorEvents->accelerometer_events,
-+                 sensorEvents->num_accelerometer_events * sensorDataLen);
-+        MEMCPY_S(params->sensorEvents.gravity_events, sensorEventLen,
-+                 sensorEvents->gravity_events, sensorEvents->num_gravity_events * sensorDataLen);
-+        MEMCPY_S(params->sensorEvents.gyroscope_events, sensorEventLen,
-+                 sensorEvents->gyroscope_events,
-+                 sensorEvents->num_gyroscope_events * sensorDataLen);
-+        MEMCPY_S(params->sensorEvents.ambient_light_events,
-+                 sizeof(params->sensorEvents.ambient_light_events),
-+                 sensorEvents->ambient_light_events,
-+                 sensorEvents->num_ambient_light_events * sizeof(ia_aiq_ambient_light_events));
-+        MEMCPY_S(params->sensorEvents.dmd_events, sizeof(params->sensorEvents.dmd_events),
-+                 sensorEvents->dmd_events,
-+                 sensorEvents->num_dmd_events * sizeof(ia_aiq_dmd_sensor_events));
-+        params->sensorEventsBase = *sensorEvents;
-+    }
-+    params->frameReadoutStart = frameReadoutStart;
-+    params->frameReadoutEnd = frameReadoutEnd;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenSetStatistics(void *pData, unsigned int size,
-+                                               ia_dvs_state **dvs,
-+                                               ia_dvs_statistics **statistics,
-+                                               ia_aiq_ae_results **aeResults,
-+                                               ia_aiq_af_results **afResults,
-+                                               ia_aiq_sensor_events **sensorEvents,
-+                                               uint64_t *frameReadoutStart,
-+                                               uint64_t *frameReadoutEnd) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+
-+    DvsStatistcs *params = static_cast<DvsStatistcs*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+
-+    *statistics = nullptr;
-+    if (params->statisticsFlag) {
-+        params->statistics.motion_vectors = params->motion_vectors;
-+        *statistics = &params->statistics;
-+    }
-+
-+    *aeResults = nullptr;
-+    if (params->aeResultsFlag) {
-+        bool ret = mIpcAiq.unflattenAeResults(&params->aeResultsBase);
-+        CheckError(!ret, false, "@%s, unflattenAeResults fails", __func__);
-+        *aeResults = &params->aeResultsBase.base;
-+    }
-+
-+    *afResults = nullptr;
-+    if (params->afResultsFlag) {
-+        *afResults = &params->afResultsBase;
-+    }
-+
-+    *sensorEvents = nullptr;
-+    if (params->sensorEventsFlag) {
-+        if (params->sensorEventsBase.num_accelerometer_events != 0) {
-+            params->sensorEventsBase.accelerometer_events =
-+                                                     params->sensorEvents.accelerometer_events;
-+        }
-+        if (params->sensorEventsBase.num_gravity_events != 0) {
-+            params->sensorEventsBase.gravity_events = params->sensorEvents.gravity_events;
-+        }
-+        if (params->sensorEventsBase.num_gyroscope_events != 0) {
-+            params->sensorEventsBase.gyroscope_events = params->sensorEvents.gyroscope_events;
-+        }
-+        if (params->sensorEventsBase.num_ambient_light_events != 0) {
-+            params->sensorEventsBase.ambient_light_events =
-+                                                     params->sensorEvents.ambient_light_events;
-+        }
-+        if (params->sensorEventsBase.num_dmd_events != 0) {
-+            params->sensorEventsBase.dmd_events = params->sensorEvents.dmd_events;
-+        }
-+        *sensorEvents = &params->sensorEventsBase;
-+    }
-+
-+    *frameReadoutStart = params->frameReadoutStart;
-+    *frameReadoutEnd = params->frameReadoutEnd;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenExecute(void *pData, unsigned int size,
-+                                       ia_dvs_state *dvs, uint16_t focusPosition) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%d",
-+           __func__, pData, size, dvs, focusPosition);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsExecute *params = static_cast<DvsExecute*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+    params->focusPosition = focusPosition;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenExecute(const void *pData, unsigned int size,
-+                                         ia_dvs_state **dvs, uint16_t *focusPosition) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p, focusPosition:%p",
-+           __func__, pData, size, dvs, focusPosition);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsExecute), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+    CheckError(!focusPosition, false, "@%s, focusPosition is nullptr", __func__);
-+
-+    const DvsExecute *params = static_cast<const DvsExecute*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+    *focusPosition = params->focusPosition;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientFlattenImageTransformation(void *pData, unsigned int size,
-+                                                   ia_dvs_state *dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
-+    params->dvsHandle = reinterpret_cast<uintptr_t>(dvs);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverUnflattenImageTransformation(void *pData, unsigned int size,
-+                                                    ia_dvs_state **dvs) {
-+    LOGIPC("@%s, pData:%p, size:%d, dvs:%p", __func__, pData, size, dvs);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
-+    CheckError(!dvs, false, "@%s, dvs is nullptr", __func__);
-+
-+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
-+    *dvs = reinterpret_cast<ia_dvs_state*>(params->dvsHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::serverFlattenImageTransformation(void *pData, unsigned int size,
-+                                            ia_dvs_image_transformation *imageTransformation) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
-+    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
-+
-+    DvsImageTransformation *params = static_cast<DvsImageTransformation*>(pData);
-+    params->imageTransformation = *imageTransformation;
-+
-+    return true;
-+}
-+
-+bool IPCIntelDvs::clientUnflattenImageTransformation(const void *pData, unsigned int size,
-+                                           ia_dvs_image_transformation **imageTransformation) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(DvsImageTransformation), false, "@%s, buffer is small", __func__);
-+    CheckError(!imageTransformation, false, "@%s, imageTransformation is nullptr", __func__);
-+
-+    DvsImageTransformation *params =
-+           const_cast<DvsImageTransformation*>(static_cast<const DvsImageTransformation*>(pData));
-+    *imageTransformation = &params->imageTransformation;
-+
-+    return true;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
-new file mode 100644
-index 000000000000..cb1fa6309387
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.h
-@@ -0,0 +1,247 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_dvs.h>
-+#include <ia_dvs_types.h>
-+#include <ia_isp_bxt.h>
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "modules/sandboxing/IPCIntelAiq.h"
-+#include "DvsResult.h"
-+
-+namespace icamera {
-+#define MAX_DVS_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
-+
-+struct DvsInitParams {
-+    ia_binary_data base;
-+    unsigned char data[MAX_DVS_DATA_SIZE];
-+    uintptr_t cmcHandle;
-+
-+    // the below is returned
-+    uintptr_t dvsHandle;
-+};
-+
-+struct DvsDeinitParams {
-+    uintptr_t dvsHandle;
-+};
-+
-+struct DvsConfigParams {
-+    uintptr_t dvsHandle;
-+    ia_dvs_configuration configData;
-+    float zoomRatio;
-+};
-+
-+struct DvsNoneBlankRatioParams {
-+    uintptr_t dvsHandle;
-+    float nonBlankingRatio;
-+};
-+
-+struct DvsDigitalZoomMode {
-+    uintptr_t dvsHandle;
-+    ia_dvs_zoom_mode zoomMode;
-+};
-+
-+struct DvsDigitalZoomRegion {
-+    uintptr_t dvsHandle;
-+    ia_rectangle zoomRegion;
-+};
-+
-+struct DvsDigitalZoomCoordinate {
-+    uintptr_t dvsHandle;
-+    ia_coordinate zoomCoordinate;
-+};
-+
-+struct DvsDigitalZoomMagnitude {
-+    uintptr_t dvsHandle;
-+    float zoomRatio;
-+};
-+
-+struct DvsFreeMorphParams {
-+    uintptr_t dvsHandle;
-+    uintptr_t morphHandle;
-+};
-+
-+struct DvsMorphParams {
-+    uintptr_t dvsHandle;
-+    uintptr_t morphHandle;  // save remote morph table pointer
-+
-+    ia_dvs_morph_table morphTable;  // used by client
-+    uint32_t xcoordsY[MAX_DVS_COORDS_Y_SIZE];
-+    uint32_t ycoordsY[MAX_DVS_COORDS_Y_SIZE];
-+    uint32_t xcoordsUV[MAX_DVS_COORDS_UV_SIZE];
-+    uint32_t ycoordsUV[MAX_DVS_COORDS_UV_SIZE];
-+    float xcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
-+    float ycoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
-+};
-+
-+struct DvsExecute {
-+    uintptr_t dvsHandle;
-+    uint16_t focusPosition;
-+};
-+
-+struct DvsImageTransformation {
-+    uintptr_t dvsHandle;
-+    ia_dvs_image_transformation imageTransformation;
-+};
-+
-+#define MAX_MOTION_SENSOR_COUNT_DVS 100
-+struct DvsSensorEvents {
-+    ia_aiq_sensor_data accelerometer_events[MAX_MOTION_SENSOR_COUNT_DVS];
-+    ia_aiq_sensor_data gravity_events[MAX_MOTION_SENSOR_COUNT_DVS];
-+    ia_aiq_sensor_data gyroscope_events[MAX_MOTION_SENSOR_COUNT_DVS];
-+    ia_aiq_ambient_light_events ambient_light_events[MAX_MOTION_SENSOR_COUNT_DVS];
-+    ia_aiq_dmd_sensor_events dmd_events[MAX_MOTION_SENSOR_COUNT_DVS];
-+};
-+
-+#define MV_ENTRIE_COUNT 5000
-+struct DvsStatistcs {
-+    uintptr_t dvsHandle;
-+
-+    bool statisticsFlag;
-+    ia_dvs_statistics statistics;
-+    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
-+
-+    bool aeResultsFlag;
-+    ae_run_params_results aeResultsBase;
-+
-+    bool afResultsFlag;
-+    ia_aiq_af_results afResultsBase;
-+
-+    bool sensorEventsFlag;
-+    ia_aiq_sensor_events sensorEventsBase;
-+    DvsSensorEvents sensorEvents;
-+
-+    uint64_t frameReadoutStart;
-+    uint64_t frameReadoutEnd;
-+};
-+
-+class IPCIntelDvs {
-+ public:
-+    IPCIntelDvs();
-+    ~IPCIntelDvs();
-+
-+    // for DvsInitParams
-+    bool clientFlattenInit(void *pData, unsigned int size,
-+                           const ia_binary_data *dvsDataPtr, const ia_cmc_t *cmc);
-+    bool serverUnflattenInit(void *pData, int size,
-+                             ia_binary_data **dvsDataPtr, ia_cmc_t **cmc);
-+    bool serverFlattenInit(void *pData, unsigned int size, ia_dvs_state *dvs);
-+    bool clientUnflattenInit(const void *pData, unsigned int size, ia_dvs_state **dvs);
-+
-+    // for DvsDeinitParams
-+    bool clientFlattenDeinit(void *pData, unsigned int size, ia_dvs_state *dvs);
-+    bool serverUnflattenDeinit(const void *pData, unsigned int size, ia_dvs_state **dvs);
-+
-+    // for DvsConfigParams
-+    bool clientFlattenConfig(void *pData, unsigned int size, ia_dvs_state *dvs,
-+                             const ia_dvs_configuration *config, float zoomRatio);
-+    bool serverUnflattenConfig(const void *pData, unsigned int size, ia_dvs_state **dvs,
-+                               ia_dvs_configuration **config, float *zoomRatio);
-+
-+    // for DvsNoneBlankRatioParams
-+    bool clientFlattenNoneBlanckRation(void *pData, unsigned int size,
-+                                       ia_dvs_state *dvs, float nonBlankingRatio);
-+    bool serverUnflattenNoneBlanckRation(const void *pData, unsigned int size,
-+                                         ia_dvs_state **dvs, float *nonBlankingRatio);
-+
-+    // for DvsDigitalZoomMode
-+    bool clientFlattenDigitalZoomMode(void *pData, unsigned int size,
-+                                      ia_dvs_state *dvs, ia_dvs_zoom_mode zoomMode);
-+    bool serverUnflattenDigitalZoomMode(const void *pData, unsigned int size,
-+                                        ia_dvs_state **dvs, ia_dvs_zoom_mode *zoomMode);
-+
-+    // for DvsDigitalZoomRegion
-+    bool clientFlattenDigitalZoomRegion(void *pData, unsigned int size,
-+                                        ia_dvs_state *dvs, ia_rectangle *zoomRegion);
-+    bool serverUnflattenDigitalZoomRegion(const void *pData, unsigned int size,
-+                                          ia_dvs_state **dvs, ia_rectangle **zoomRegion);
-+
-+    // for DvsDigitalZoomCoordinate
-+    bool clientFlattenDigitalZoomCoordinate(void *pData, unsigned int size, ia_dvs_state *dvs,
-+                                            ia_coordinate *zoomCoordinate);
-+    bool serverUnflattenDigitalZoomCoordinate(const void *pData, unsigned int size,
-+                                              ia_dvs_state **dvs,
-+                                              ia_coordinate **zoomCoordinate);
-+
-+    // for DvsDigitalZoomMagnitude
-+    bool clientFlattenDigitalZoomMagnitude(void *pData, unsigned int size,
-+                                           ia_dvs_state *dvs, float zoomRatio);
-+    bool serverUnflattenDigitalZoomMagnitude(const void *pData, unsigned int size,
-+                                             ia_dvs_state **dvs, float *zoomRatio);
-+
-+    // for DvsFreeMorphParams
-+    bool clientFlattenFreeMorphTable(void *pData, unsigned int size,
-+                                     ia_dvs_state *dvs,
-+                                     ia_dvs_morph_table *morphTable);
-+    bool serverUnflattenFreeMorphTable(const void *pData, unsigned int size,
-+                                       ia_dvs_state **dvs,
-+                                       ia_dvs_morph_table **morphTable);
-+
-+    // for DvsMorphParams
-+    bool clientFlattenAllocateMorphTable(void *pData, unsigned int size, ia_dvs_state *dvs);
-+    bool serverUnflattenAllocateMorphTalbe(const void *pData,
-+                                           unsigned int size, ia_dvs_state **dvs);
-+    bool serverFlattenAllocateMorphTalbe(void *pData, unsigned int size,
-+                                         ia_dvs_morph_table *morphTable);
-+    bool clientUnflattenAllocateMorphTalbe(const void *pData, unsigned int size,
-+                                           ia_dvs_morph_table **morphTable);
-+    bool clientFlattenGetMorphTable(void *pData, unsigned int size,
-+                                    ia_dvs_state *dvs, ia_dvs_morph_table *morphTable);
-+    bool serverUnflattenGetMorphTalbe(const void *pData, unsigned int size,
-+                                      ia_dvs_state **dvs, ia_dvs_morph_table **morphTable);
-+    bool serverFlattenGetMorphTalbe(void *pData, unsigned int size,
-+                                    ia_dvs_morph_table *morphTable);
-+    bool clientUnflattenGetMorphTalbe(void *pData, unsigned int size,
-+                                      ia_dvs_morph_table **morphTable);
-+    bool unflattenMorphTalbe(DvsMorphParams *params);
-+    bool flattenMorphTable(const ia_dvs_morph_table *morphTable, DvsMorphParams *params);
-+
-+    // for DvsStatistcs
-+    bool clientFlattenSetStatistics(void *pData, unsigned int size, ia_dvs_state *dvs,
-+                                    const ia_dvs_statistics *statistics,
-+                                    const ia_aiq_ae_results *aeResults,
-+                                    const ia_aiq_af_results *afResults,
-+                                    const ia_aiq_sensor_events *sensorEvents,
-+                                    uint64_t frameReadoutStart, uint64_t frameReadoutEnd);
-+    bool serverUnflattenSetStatistics(void *pData, unsigned int size, ia_dvs_state **dvs,
-+                                      ia_dvs_statistics **statistics,
-+                                      ia_aiq_ae_results **aeResults,
-+                                      ia_aiq_af_results **afResults,
-+                                      ia_aiq_sensor_events **sensorEvents,
-+                                      uint64_t *frameReadoutStart, uint64_t *frameReadoutEnd);
-+
-+    // for DvsExecute
-+    bool clientFlattenExecute(void *pData, unsigned int size,
-+                              ia_dvs_state *dvs, uint16_t focusPosition);
-+    bool serverUnflattenExecute(const void *pData, unsigned int size,
-+                                ia_dvs_state **dvs, uint16_t *focusPosition);
-+
-+    // for DvsImageTransformation
-+    bool clientFlattenImageTransformation(void *pData, unsigned int size,
-+                                          ia_dvs_state *dvs);
-+    bool serverUnflattenImageTransformation(void *pData, unsigned int size,
-+                                            ia_dvs_state **dvs);
-+    bool serverFlattenImageTransformation(void *pData, unsigned int size,
-+                                          ia_dvs_image_transformation *imageTransformation);
-+    bool clientUnflattenImageTransformation(const void *pData, unsigned int size,
-+                                            ia_dvs_image_transformation **imageTransformation);
-+
-+ private:
-+    IPCIntelAiq mIpcAiq;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
-new file mode 100644
-index 000000000000..b9b9314d0cc2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.cpp
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_FACE_DETECTION"
-+
-+#include "modules/sandboxing/IPCIntelFD.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelFD::IPCIntelFD() {
-+    LOG1("@%s", __func__);
-+}
-+
-+IPCIntelFD::~IPCIntelFD() {
-+    LOG1("@%s", __func__);
-+}
-+
-+bool IPCIntelFD::clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams *params) {
-+    LOG1("@%s, params:%p", __func__, params);
-+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
-+
-+    params->max_face_num = max_face_num;
-+
-+    return true;
-+}
-+
-+bool IPCIntelFD::serverUnflattenRun(const FaceDetectionRunParams &inParams,
-+                                    void *imageData, pvl_image *image) {
-+    LOG1("@%s, image:%p", __func__, image);
-+    CheckError(image == nullptr, false, "@%s, iamge is nullptr", __func__);
-+
-+    image->size = inParams.size;
-+    image->width = inParams.width;
-+    image->height = inParams.height;
-+    image->format = inParams.format;
-+    image->stride = inParams.stride;
-+    image->rotation = inParams.rotation;
-+
-+    if (imageData) {
-+        image->data = const_cast<uint8_t*>(static_cast<uint8_t*>(imageData));
-+    } else {
-+        image->data = const_cast<uint8_t*>(inParams.data);
-+    }
-+
-+    return true;
-+}
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
-new file mode 100644
-index 000000000000..b58f2139cbe4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelFD.h
-@@ -0,0 +1,32 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "FaceBase.h"
-+
-+namespace icamera {
-+class IPCIntelFD {
-+ public:
-+    IPCIntelFD();
-+    virtual ~IPCIntelFD();
-+
-+    bool clientFlattenInit(unsigned int max_face_num, FaceDetectionInitParams *params);
-+    bool serverUnflattenRun(const FaceDetectionRunParams &inParams,
-+                            void *imageData, pvl_image *image);
-+};
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
-new file mode 100644
-index 000000000000..b2981a4016cb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.cpp
-@@ -0,0 +1,298 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_INTEL_LARD"
-+
-+#include "modules/sandboxing/IPCIntelLard.h"
-+
-+#include <ia_types.h>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelLard::IPCIntelLard() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelLard::~IPCIntelLard() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIntelLard::clientFlattenInit(void* pData, unsigned int size,
-+                                     const ia_binary_data* lard_data_ptr) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard_data_ptr:%p", __func__, pData, size, lard_data_ptr);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard_data_ptr, false, "@%s, lard_data_ptr is nullptr", __func__);
-+
-+    lard_init_params *params = static_cast<lard_init_params*>(pData);
-+    params->base = *lard_data_ptr;
-+
-+    CheckError(params->base.size > MAX_LARD_DATA_SIZE, false,
-+               "@%s, data:%d is too small", __func__, params->base.size);
-+    MEMCPY_S(params->data, MAX_LARD_DATA_SIZE, params->base.data, params->base.size);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr) {
-+    LOGIPC("@%s, pData:%p, size:%d, binaryData:%p", __func__, pData, size, lard_data_ptr);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard_data_ptr, false, "@%s, binaryData is nullptr", __func__);
-+
-+    lard_init_params* params = static_cast<lard_init_params*>(pData);
-+    params->base.data = static_cast<void*>(params->data);
-+    *lard_data_ptr = params->base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverFlattenInit(void* pData, int size, ia_lard* lard) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+
-+    lard_init_params* params = static_cast<lard_init_params*>(pData);
-+
-+    params->results = reinterpret_cast<uintptr_t>(lard);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+
-+    lard_init_params* params = static_cast<lard_init_params*>(pData);
-+    *lard = reinterpret_cast<ia_lard*>(params->results);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientFlattenGetTagList(void* pData, unsigned int size,
-+                                           ia_lard* lard, unsigned int mode_tag) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%d", __func__, pData, size, lard, mode_tag);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+
-+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
-+    params->lard = reinterpret_cast<uintptr_t>(lard);
-+    params->mode_tag = mode_tag;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverUnflattenGetTagList(void* pData, unsigned int size,
-+                                             ia_lard** lard, unsigned int* mode_tag) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, mode_tag:%p", __func__, pData, size, lard, mode_tag);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+    CheckError(!mode_tag, false, "@%s, mode_tag is nullptr", __func__);
-+
-+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
-+    *lard = reinterpret_cast<ia_lard*>(params->lard);
-+    *mode_tag = params->mode_tag;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverFlattenGetTagList(void* pData, unsigned int size,
-+                                           unsigned int num_tags, const unsigned int* tags) {
-+    LOGIPC("@%s, pData:%p, size:%d, num_tags:%d, tags:%p", __func__, pData, size, num_tags, tags);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
-+
-+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
-+    int tagsSize = num_tags * sizeof(unsigned int);
-+
-+    CheckError(tagsSize > MAX_LARD_DATA_SIZE, false, "@%s, tags:%d is small", __func__, tagsSize);
-+    switch (params->mode_tag) {
-+        case LCMC_TAG:
-+            params->num_cmc_tags = num_tags;
-+            MEMCPY_S(params->cmc_tags_list, tagsSize, tags, tagsSize);
-+            break;
-+        case LAIQ_TAG:
-+            params->num_aiq_tags = num_tags;
-+            MEMCPY_S(params->aiq_tags_list, tagsSize, tags, tagsSize);
-+            break;
-+        case LISP_TAG:
-+            params->num_isp_tags = num_tags;
-+            MEMCPY_S(params->isp_tags_list, tagsSize, tags, tagsSize);
-+            break;
-+        case LTHR_TAG:
-+            params->num_others_tags = num_tags;
-+            MEMCPY_S(params->others_tags_list, tagsSize, tags, tagsSize);
-+            break;
-+        default:
-+            return false;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
-+                                             unsigned int* num_tags, const unsigned int** tags) {
-+    LOGIPC("@%s, pData:%p, size:%d, mode_tag:%d, num_tags:%p, tags:%p", __func__,
-+          pData, size, mode_tag, num_tags, tags);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_get_tag_list_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!num_tags, false, "@%s, num_tags is nullptr", __func__);
-+    CheckError(!tags, false, "@%s, tags is nullptr", __func__);
-+
-+    lard_get_tag_list_params* params = static_cast<lard_get_tag_list_params*>(pData);
-+
-+    switch (mode_tag) {
-+        case LCMC_TAG:
-+            *num_tags = params->num_cmc_tags;
-+            *tags = params->cmc_tags_list;
-+            break;
-+        case LAIQ_TAG:
-+            *num_tags = params->num_aiq_tags;
-+            *tags = params->aiq_tags_list;
-+            break;
-+        case LISP_TAG:
-+            *num_tags = params->num_isp_tags;
-+            *tags = params->isp_tags_list;
-+            break;
-+        case LTHR_TAG:
-+            *num_tags = params->num_others_tags;
-+            *tags = params->others_tags_list;
-+            break;
-+        default:
-+            return false;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientFlattenRun(void* pData, unsigned int size,
-+                                    ia_lard* lard, ia_lard_input_params* inputParams) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__,
-+          pData, size, lard, inputParams);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
-+
-+    lard_run_params* params = static_cast<lard_run_params*>(pData);
-+    params->lard = reinterpret_cast<uintptr_t>(lard);
-+    params->inputParams = *inputParams;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverUnflattenRun(void* pData, unsigned int size,
-+                                      ia_lard** lard, ia_lard_input_params** inputParams) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p, inputParams:%p", __func__,
-+          pData, size, lard, inputParams);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
-+
-+    lard_run_params* params = static_cast<lard_run_params*>(pData);
-+    *lard = reinterpret_cast<ia_lard*>(params->lard);
-+    *inputParams = &params->inputParams;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result) {
-+    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!result, false, "@%s, result is nullptr", __func__);
-+
-+    lard_run_params* params = static_cast<lard_run_params*>(pData);
-+
-+    lard_run_params_results* results = &params->results;
-+    ia_lard_results* base = &results->base;
-+    *base = *result;
-+
-+    CheckError(base->aiqb_cmc_data.size > MAX_LARD_DATA_SIZE, false,
-+               "@%s, cmc:%d is too big", __func__, base->aiqb_cmc_data.size);
-+    CheckError(base->aiqb_aiq_data.size > MAX_LARD_DATA_SIZE, false,
-+               "@%s, aiq:%d is too big", __func__, base->aiqb_aiq_data.size);
-+    CheckError(base->aiqb_isp_data.size > MAX_LARD_DATA_SIZE, false,
-+               "@%s, isp:%d is too big", __func__, base->aiqb_isp_data.size);
-+    CheckError(base->aiqb_other_data.size > MAX_LARD_DATA_SIZE, false,
-+               "@%s, other:%d is too big", __func__, base->aiqb_other_data.size);
-+
-+    MEMCPY_S(results->cmc_tags_list, MAX_LARD_DATA_SIZE,
-+             base->aiqb_cmc_data.data, base->aiqb_cmc_data.size);
-+    MEMCPY_S(results->aiq_tags_list, MAX_LARD_DATA_SIZE,
-+             base->aiqb_aiq_data.data, base->aiqb_aiq_data.size);
-+    MEMCPY_S(results->isp_tags_list, MAX_LARD_DATA_SIZE,
-+             base->aiqb_isp_data.data, base->aiqb_isp_data.size);
-+    MEMCPY_S(results->others_tags_list, MAX_LARD_DATA_SIZE,
-+             base->aiqb_other_data.data, base->aiqb_other_data.size);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result) {
-+    LOGIPC("@%s, pData:%p, size:%d, result:%p", __func__, pData, size, result);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_run_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!result, false, "@%s, result is nullptr", __func__);
-+
-+    lard_run_params* params = static_cast<lard_run_params*>(pData);
-+    lard_run_params_results* results = &params->results;
-+    ia_lard_results* base = &results->base;
-+
-+    base->aiqb_cmc_data.data = results->cmc_tags_list;
-+    base->aiqb_aiq_data.data = results->aiq_tags_list;
-+    base->aiqb_isp_data.data = results->isp_tags_list;
-+    base->aiqb_other_data.data = results->others_tags_list;
-+
-+    *result = base;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+
-+    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
-+    params->lard = reinterpret_cast<uintptr_t>(lard);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLard::serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard) {
-+    LOGIPC("@%s, pData:%p, size:%d, lard:%p", __func__, pData, size, lard);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(lard_deinit_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!lard, false, "@%s, lard is nullptr", __func__);
-+
-+    lard_deinit_params* params = static_cast<lard_deinit_params*>(pData);
-+    *lard = reinterpret_cast<ia_lard*>(params->lard);
-+
-+    return true;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
-new file mode 100644
-index 000000000000..00fe7adb44ef
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLard.h
-@@ -0,0 +1,103 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_lard.h>
-+#include "modules/sandboxing/IPCCommon.h"
-+
-+namespace icamera {
-+
-+#define MAX_LARD_DATA_SIZE MAX_IA_BINARY_DATA_SIZE
-+
-+struct lard_init_params {
-+    ia_binary_data base;
-+    unsigned char data[MAX_LARD_DATA_SIZE];
-+
-+    // the below is returned
-+    uintptr_t results;
-+};
-+
-+struct lard_get_tag_list_params {
-+    uintptr_t lard;
-+    unsigned int mode_tag;
-+
-+    // the below is returned
-+    unsigned int num_cmc_tags;
-+    unsigned int num_aiq_tags;
-+    unsigned int num_isp_tags;
-+    unsigned int num_others_tags;
-+    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
-+};
-+
-+struct lard_run_params_results {
-+    ia_lard_results base;
-+
-+    unsigned int cmc_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int aiq_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int isp_tags_list[MAX_LARD_DATA_SIZE];
-+    unsigned int others_tags_list[MAX_LARD_DATA_SIZE];
-+};
-+
-+struct lard_run_params {
-+    uintptr_t lard;
-+    ia_lard_input_params inputParams;
-+
-+    // the below is returned
-+    lard_run_params_results results;
-+};
-+
-+struct lard_deinit_params {
-+    uintptr_t lard;
-+};
-+
-+class IPCIntelLard {
-+ public:
-+    IPCIntelLard();
-+    virtual ~IPCIntelLard();
-+
-+    // for ia_lard_init
-+    bool clientFlattenInit(void* pData, unsigned int size, const ia_binary_data* lard_data_ptr);
-+    bool serverUnflattenInit(void* pData, int size, ia_binary_data* lard_data_ptr);
-+    bool serverFlattenInit(void* pData, int size, ia_lard* lard);
-+    bool clientUnflattenInit(void* pData, unsigned int size, ia_lard** lard);
-+
-+    // for ia_lard_get_tag_list
-+    bool clientFlattenGetTagList(void* pData, unsigned int size,
-+                                 ia_lard* lard, unsigned int mode_tag);
-+    bool serverUnflattenGetTagList(void* pData, unsigned int size,
-+                                   ia_lard** lard, unsigned int* mode_tag);
-+    bool serverFlattenGetTagList(void* pData, unsigned int size,
-+                                 unsigned int num_tags, const unsigned int* tags);
-+    bool clientUnflattenGetTagList(void* pData, unsigned int size, unsigned int mode_tag,
-+                                   unsigned int* num_tags, const unsigned int** tags);
-+
-+    // ia_lard_run
-+    bool clientFlattenRun(void* pData, unsigned int size, ia_lard* lard,
-+                          ia_lard_input_params* inputParams);
-+    bool serverUnflattenRun(void* pData, unsigned int size,
-+                            ia_lard** lard, ia_lard_input_params** inputParams);
-+    bool serverFlattenRun(void* pData, unsigned int size, ia_lard_results* result);
-+    bool clientUnflattenRun(void* pData, unsigned int size, ia_lard_results** result);
-+
-+    // ia_lard_deinit
-+    bool clientFlattenDeinit(void* pData, unsigned int size, ia_lard* lard);
-+    bool serverUnflattenDeinit(void* pData, unsigned int size, ia_lard** lard);
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
-new file mode 100644
-index 000000000000..62fc07f316b7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.cpp
-@@ -0,0 +1,337 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_INTEL_LTM"
-+
-+#include "modules/sandboxing/IPCIntelLtm.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelLtm::IPCIntelLtm() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelLtm::~IPCIntelLtm() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIntelLtm::clientFlattenInit(const ia_binary_data &inData,
-+                                    uintptr_t mkn_hanlde,
-+                                    LtmInitParams *params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
-+    params->binary_data.data = params->data;
-+    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
-+    params->binary_data.size = inData.size;
-+    params->mkn_handle = mkn_hanlde;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::serverUnflattenInit(LtmInitParams *params,
-+                                      ia_binary_data *inData,
-+                                      uintptr_t *mkn_hanlde) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!inData , false, "@%s, inData is nullptr", __func__);
-+    CheckError(!mkn_hanlde, false, "@%s, mkn_hanlde is nullptr", __func__);
-+
-+    params->binary_data.data = params->data;
-+    *inData = params->binary_data;
-+    *mkn_hanlde = params->mkn_handle;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::serverFlattenInit(LtmInitParams *params, ia_ltm *ltm_handle) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
-+
-+    params->results = reinterpret_cast<uintptr_t>(ltm_handle);
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::clientUnflattenInit(LtmInitParams *params, ia_ltm **ltm_handle) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+    CheckError(!ltm_handle, false, "@%s, ltm_handle is nullptr", __func__);
-+
-+    *ltm_handle = reinterpret_cast<ia_ltm*> (params->results);
-+    return true;
-+}
-+
-+int IPCIntelLtm::deepCopyAeResults(const ia_aiq_ae_results &src, LtmInputAeResult *params) {
-+    LOGIPC("@%s", __func__);
-+
-+    params->aeResultsBase = src;
-+
-+    if (src.exposures) {
-+        CheckError(src.num_exposures > MAX_NUM_EXPOSURES_LTM,
-+                   BAD_VALUE, "exposure buffer is small");
-+        for (unsigned int i = 0; i < src.num_exposures; i++) {
-+            params->exposures[i].exposure_index = src.exposures[i].exposure_index;
-+            params->exposures[i].distance_from_convergence =
-+                                                    src.exposures[i].distance_from_convergence;
-+            params->exposures[i].converged = src.exposures[i].converged;
-+            if (src.exposures[i].exposure) {
-+                params->exposure[i] = *src.exposures[i].exposure;
-+            }
-+            if (src.exposures[i].sensor_exposure) {
-+                params->sensor_exposure[i] = *src.exposures[i].sensor_exposure;
-+            }
-+            params->exposures[i].num_exposure_plan = src.exposures[i].num_exposure_plan;
-+            if (src.exposures[i].exposure_plan_ids) {
-+                CheckError(src.exposures[i].num_exposure_plan > MAX_NUM_OF_EXPOSURE_PLANS_LTM,
-+                           BAD_VALUE, "exposures[%d].exposure_plan_ids buffer is small", i);
-+                MEMCPY_S(params->exposure_plan_ids[i],
-+                         MAX_NUM_OF_EXPOSURE_PLANS_LTM * sizeof(unsigned int),
-+                         src.exposures[i].exposure_plan_ids,
-+                         src.exposures[i].num_exposure_plan * sizeof(unsigned int));
-+            }
-+        }
-+    }
-+
-+    if (src.weight_grid) {
-+        params->weightGrid = *src.weight_grid;
-+        unsigned int gridElements  = src.weight_grid->width * src.weight_grid->height;
-+        CheckError(MAX_SIZE_WEIGHT_GRID_LTM < gridElements,
-+                   false, "weight_grid buffer is small");
-+        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID_LTM * sizeof(char),
-+                 src.weight_grid->weights, gridElements * sizeof(char));
-+    }
-+
-+    if (src.flashes) {
-+        CheckError(src.num_flashes > MAX_NUM_FLASHES_LTM, BAD_VALUE, "flash buffer is small");
-+        MEMCPY_S(params->flashes, MAX_NUM_FLASHES_LTM * sizeof(ia_aiq_flash_parameters),
-+                 src.flashes, src.num_flashes * sizeof(ia_aiq_flash_parameters));
-+    }
-+
-+    if (src.aperture_control) {
-+        params->apertureControl = *src.aperture_control;
-+    }
-+    return OK;
-+}
-+
-+int IPCIntelLtm::deepCopyRgbsGridData(const ia_aiq_rgbs_grid &src, ia_aiq_rgbs_grid *dst) {
-+    LOGIPC("%s", __func__);
-+
-+    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0,
-+               BAD_VALUE, "Failed to deep copy Rgbs grid data - invalid source");
-+    CheckError(!dst || !dst->blocks_ptr,
-+               BAD_VALUE, "Failed to deep copy Rgbs grid data - invalid destination");
-+
-+    size_t gridSize = src.grid_width * src.grid_height;
-+    size_t gridSizeLocal = MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS;
-+    CheckError(gridSizeLocal < gridSize, false, "rgbs_grid buffer is small");
-+    dst->grid_width = src.grid_width;
-+    dst->grid_height = src.grid_height;
-+    dst->shading_correction = src.shading_correction;
-+    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(rgbs_grid_block),
-+             src.blocks_ptr, gridSize * sizeof(rgbs_grid_block));
-+
-+    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
-+    return OK;
-+}
-+
-+int IPCIntelLtm::deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid &src,
-+                                         ia_aiq_hdr_rgbs_grid *dst) {
-+    LOGIPC("%s", __func__);
-+
-+    CheckError(!src.blocks_ptr || src.grid_width == 0 || src.grid_height == 0,
-+               BAD_VALUE, "Failed to deep copy HDR Rgbs grid data - invalid source");
-+    CheckError(!dst || !dst->blocks_ptr,
-+               BAD_VALUE, "Failed to deep copy HDR Rgbs grid data - invalid destination");
-+
-+    size_t gridSize = src.grid_width * src.grid_height;
-+    size_t gridSizeLocal = BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT;
-+    CheckError(gridSizeLocal < gridSize, false, "hdr_rgbs_grid buffer is small");
-+
-+    dst->grid_width = src.grid_width;
-+    dst->grid_height = src.grid_height;
-+    dst->grid_data_bit_depth = src.grid_data_bit_depth;
-+    dst->shading_correction = src.shading_correction;
-+    MEMCPY_S(dst->blocks_ptr, gridSizeLocal * sizeof(hdr_rgbs_grid_block),
-+             src.blocks_ptr, gridSize * sizeof(hdr_rgbs_grid_block));
-+
-+    LOGIPC("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
-+    return OK;
-+}
-+
-+bool IPCIntelLtm::clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params &ltmParams,
-+                                   int imageDataSize, void *paramsAddr) {
-+    LOGIPC("@%s, paramsAddr:%p", __func__, paramsAddr);
-+    CheckError(!paramsAddr, false, "@%s, paramsAddr is nullptr", __func__);
-+
-+    LtmRunParams* params = static_cast<LtmRunParams*>(paramsAddr);
-+    params->ltm_handle = ltm;
-+    params->inputParamsBase = ltmParams;
-+    LtmRunInputParams *inputParams = &params->inputParams;
-+
-+    int ret = UNKNOWN_ERROR;
-+    if (ltmParams.ae_results) {
-+        ret = deepCopyAeResults(*ltmParams.ae_results, &inputParams->aeResult);
-+        CheckError(ret != OK, false, "@%s, Failed to deepCopyAeResult", __func__);
-+    }
-+
-+    if (ltmParams.yv_grid) {
-+        MEMCPY_S(&inputParams->yvGrid, sizeof(ia_isp_bxt_hdr_yv_grid_t),
-+                 ltmParams.yv_grid, sizeof(ia_isp_bxt_hdr_yv_grid_t));
-+    }
-+
-+    if (ltmParams.rgbs_grid_ptr) {
-+        inputParams->rgbsGrid.rgbsGridbase.blocks_ptr = inputParams->rgbsGrid.blocks;
-+        ret = deepCopyRgbsGridData(*ltmParams.rgbs_grid_ptr, &inputParams->rgbsGrid.rgbsGridbase);
-+        CheckError(ret != OK, false, "@%s, Failed to deepCopyRgbsGridData", __func__);
-+    }
-+
-+    if (ltmParams.hdr_rgbs_grid_ptr) {
-+        inputParams->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = inputParams->hdrRgbsGrid.blocks;
-+        ret = deepCopyHdrRgbsGridData(*ltmParams.hdr_rgbs_grid_ptr,
-+                                      &inputParams->hdrRgbsGrid.hdrRgbsGridBase);
-+        CheckError(ret != OK, false, "@%s, Failed to deepCopyHdrRgbsGridData", __func__);
-+    }
-+
-+    if (ltmParams.input_image_ptr) {
-+        inputParams->inputImage = *ltmParams.input_image_ptr;
-+        if (ltmParams.input_image_ptr->image_data) {
-+            CheckError(imageDataSize < ltmParams.input_image_ptr->image_data->size,
-+                        false, "image_data buffer is small");
-+            CheckError(ltmParams.input_image_ptr->image_data->size != 0 &&
-+                       !ltmParams.input_image_ptr->image_data->data, false, "image_data error");
-+            inputParams->imageData = *ltmParams.input_image_ptr->image_data;
-+            void *imageData =
-+                     static_cast<void*>(static_cast<char*>(paramsAddr) + sizeof(LtmRunParams));
-+            MEMCPY_S(imageData, imageDataSize,
-+                     ltmParams.input_image_ptr->image_data->data,
-+                     ltmParams.input_image_ptr->image_data->size);
-+        }
-+    }
-+
-+    if (ltmParams.gtm_input_params_ptr) {
-+        MEMCPY_S(&inputParams->gtmInputParams, sizeof(ia_ltm_gtm_input_params),
-+                 ltmParams.gtm_input_params_ptr, sizeof(ia_ltm_gtm_input_params));
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::serverUnflattenRun(void *pData, ia_ltm **ltm,
-+                                     ia_ltm_input_params **inputParams) {
-+    LOGIPC("@%s, pData:%p", __func__, pData);
-+    CheckError(!pData, false, "@%s, params is nullptr", __func__);
-+    CheckError(!ltm, false, "@%s, ltm is nullptr", __func__);
-+    CheckError(!inputParams, false, "@%s, inputParams is nullptr", __func__);
-+
-+    LtmRunParams *params = static_cast<LtmRunParams*>(pData);
-+    LtmRunInputParams *paramsTmp = &params->inputParams;
-+    if (params->inputParamsBase.ae_results) {
-+        LtmInputAeResult *aeResult = &paramsTmp->aeResult;
-+        params->inputParamsBase.ae_results = &aeResult->aeResultsBase;
-+        if (aeResult->aeResultsBase.exposures) {
-+            aeResult->aeResultsBase.exposures = aeResult->exposures;
-+            for (unsigned int i = 0; i < aeResult->aeResultsBase.num_exposures; i++) {
-+                if (aeResult->exposures[i].exposure) {
-+                    aeResult->exposures[i].exposure = &aeResult->exposure[i];
-+                }
-+                if (aeResult->exposures[i].sensor_exposure) {
-+                    aeResult->exposures[i].sensor_exposure = &aeResult->sensor_exposure[i];
-+                }
-+                if (aeResult->exposures[i].exposure_plan_ids) {
-+                    aeResult->exposures[i].exposure_plan_ids = aeResult->exposure_plan_ids[i];
-+                }
-+            }
-+        }
-+
-+        if (aeResult->aeResultsBase.weight_grid) {
-+            aeResult->aeResultsBase.weight_grid = &aeResult->weightGrid;
-+            aeResult->weightGrid.weights = aeResult->weights;
-+        }
-+
-+        if (aeResult->aeResultsBase.flashes) {
-+            aeResult->aeResultsBase.flashes = aeResult->flashes;
-+        }
-+        if (aeResult->aeResultsBase.aperture_control) {
-+            aeResult->aeResultsBase.aperture_control = &aeResult->apertureControl;
-+        }
-+    }
-+
-+    if (params->inputParamsBase.yv_grid) {
-+        params->inputParamsBase.yv_grid = &paramsTmp->yvGrid;
-+    }
-+
-+    if (params->inputParamsBase.rgbs_grid_ptr) {
-+        paramsTmp->rgbsGrid.rgbsGridbase.blocks_ptr = paramsTmp->rgbsGrid.blocks;
-+        params->inputParamsBase.rgbs_grid_ptr = &paramsTmp->rgbsGrid.rgbsGridbase;
-+    }
-+
-+    if (params->inputParamsBase.hdr_rgbs_grid_ptr) {
-+        paramsTmp->hdrRgbsGrid.hdrRgbsGridBase.blocks_ptr = paramsTmp->hdrRgbsGrid.blocks;
-+        params->inputParamsBase.hdr_rgbs_grid_ptr = &paramsTmp->hdrRgbsGrid.hdrRgbsGridBase;
-+    }
-+
-+    if (params->inputParamsBase.input_image_ptr) {
-+        params->inputParamsBase.input_image_ptr = &paramsTmp->inputImage;
-+        if (paramsTmp->inputImage.image_data) {
-+            paramsTmp->inputImage.image_data = &paramsTmp->imageData;
-+            if (paramsTmp->imageData.size != 0) {
-+                const_cast<ia_binary_data *>(paramsTmp->inputImage.image_data)->data =
-+                            static_cast<void*>(static_cast<char*>(pData) + sizeof(LtmRunParams));
-+            }
-+        }
-+    }
-+
-+    if (params->inputParamsBase.gtm_input_params_ptr) {
-+        params->inputParamsBase.gtm_input_params_ptr = &paramsTmp->gtmInputParams;
-+    }
-+
-+    *ltm = reinterpret_cast<ia_ltm *>(params->ltm_handle);
-+    *inputParams = &params->inputParamsBase;
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::serverFlattenRun(const ia_ltm_results &ltmResults,
-+                                   const ia_ltm_drc_params &drcResults,
-+                                   ia_ltm *ltm_handle, LtmRunParams *params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    MEMCPY_S(&params->ltmResult, sizeof(ia_ltm_results), &ltmResults, sizeof(ia_ltm_results));
-+    MEMCPY_S(&params->drcResult, sizeof(ia_ltm_drc_params),
-+             &drcResults, sizeof(ia_ltm_results));
-+
-+    return true;
-+}
-+
-+bool IPCIntelLtm::clientUnflattenRun(LtmRunParams *params,
-+                                     ia_ltm_results **ltmResults,
-+                                     ia_ltm_drc_params **drcResults) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!params, false, "@%s, params is nullptr", __func__);
-+
-+    *ltmResults = &params->ltmResult;
-+    *drcResults = &params->drcResult;
-+    return true;
-+}
-+
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
-new file mode 100644
-index 000000000000..8ba966e2048e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelLtm.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_ltm.h>
-+
-+#include "IPCCommon.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+struct LtmInitParams {
-+    ia_binary_data binary_data;
-+    unsigned char data[MAX_IA_BINARY_DATA_SIZE];
-+    uintptr_t mkn_handle;
-+    uintptr_t results;
-+};
-+
-+struct LtmDeinitParams {
-+    uintptr_t ltm_handle;
-+};
-+
-+#define MAX_NUM_EXPOSURES_LTM 10
-+#define MAX_NUM_FLASHES_LTM 2
-+#define MAX_NUM_OF_EXPOSURE_PLANS_LTM 4
-+#define MAX_SIZE_WEIGHT_GRID_LTM 2048
-+
-+struct LtmInputAeResult {
-+    ia_aiq_ae_results aeResultsBase;
-+
-+    ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES_LTM];
-+    ia_aiq_hist_weight_grid weightGrid;
-+    ia_aiq_flash_parameters flashes[MAX_NUM_FLASHES_LTM];
-+    ia_aiq_aperture_control apertureControl;
-+
-+    // the below is in ia_aiq_ae_exposure_result exposures[MAX_NUM_EXPOSURES];
-+    ia_aiq_exposure_parameters exposure[MAX_NUM_EXPOSURES_LTM];
-+    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_NUM_EXPOSURES_LTM];
-+    unsigned int exposure_plan_ids[MAX_NUM_EXPOSURES_LTM][MAX_NUM_OF_EXPOSURE_PLANS_LTM];
-+
-+    // the below is in ia_aiq_hist_weight_grid weight_grid;
-+    unsigned char weights[MAX_SIZE_WEIGHT_GRID_LTM];
-+};
-+
-+#define MAX_WIDTH_STATISTICS 24
-+#define MAX_HEIGHT_STATISTICS 16
-+struct LtmInputRgbSGrid {
-+    ia_aiq_rgbs_grid rgbsGridbase;
-+    rgbs_grid_block blocks[MAX_WIDTH_STATISTICS * MAX_HEIGHT_STATISTICS];
-+};
-+
-+#define BXT_RGBS_GRID_MAX_WIDTH 96
-+#define BXT_RGBS_GRID_MAX_HEIGHT 72
-+struct LtmInputHdrRgbsGrid {
-+    ia_aiq_hdr_rgbs_grid hdrRgbsGridBase;
-+    hdr_rgbs_grid_block blocks[BXT_RGBS_GRID_MAX_WIDTH * BXT_RGBS_GRID_MAX_HEIGHT];
-+};
-+
-+struct LtmRunInputParams {
-+    LtmInputAeResult aeResult;
-+    ia_isp_bxt_hdr_yv_grid_t yvGrid;
-+    LtmInputRgbSGrid rgbsGrid;
-+    LtmInputHdrRgbsGrid hdrRgbsGrid;
-+    ia_ltm_input_image inputImage;
-+    ia_binary_data imageData;
-+    ia_ltm_gtm_input_params gtmInputParams;
-+};
-+
-+struct LtmRunParams {
-+    uintptr_t ltm_handle;
-+    ia_ltm_input_params inputParamsBase;
-+    LtmRunInputParams inputParams;
-+
-+    ia_ltm_results ltmResult;
-+    ia_ltm_drc_params drcResult;
-+};
-+
-+class IPCIntelLtm {
-+ public:
-+    IPCIntelLtm();
-+    virtual ~IPCIntelLtm();
-+
-+    // for init
-+    bool clientFlattenInit(const ia_binary_data &inData,
-+                           uintptr_t mkn_hanlde, LtmInitParams *params);
-+    bool serverUnflattenInit(LtmInitParams *params,
-+                             ia_binary_data *inData, uintptr_t *mkn_hanlde);
-+    bool serverFlattenInit(LtmInitParams *params, ia_ltm *ltm_handle);
-+    bool clientUnflattenInit(LtmInitParams *params, ia_ltm **ltm_handle);
-+
-+    // for run
-+    bool clientFlattenRun(uintptr_t ltm, const ia_ltm_input_params &ltmParams,
-+                          int imageDataSize, void *paramsAddr);
-+    bool serverUnflattenRun(void *pData, ia_ltm **ltm, ia_ltm_input_params **inputParams);
-+    bool serverFlattenRun(const ia_ltm_results &ltmResults, const ia_ltm_drc_params &drcResults,
-+                          ia_ltm *ltm_handle, LtmRunParams *params);
-+    bool clientUnflattenRun(LtmRunParams *params,
-+                            ia_ltm_results **ltmResults, ia_ltm_drc_params **drcResults);
-+
-+ private:
-+    int deepCopyAeResults(const ia_aiq_ae_results &src, LtmInputAeResult *params);
-+    int deepCopyRgbsGridData(const ia_aiq_rgbs_grid &src, ia_aiq_rgbs_grid *dst);
-+    int deepCopyHdrRgbsGridData(const ia_aiq_hdr_rgbs_grid &src, ia_aiq_hdr_rgbs_grid *dst);
-+};
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
-new file mode 100644
-index 000000000000..1c880d5d5ea2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.cpp
-@@ -0,0 +1,81 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_INTEL_MKN"
-+
-+#include "modules/sandboxing/IPCIntelMkn.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IPCIntelMkn::IPCIntelMkn() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIntelMkn::~IPCIntelMkn() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIntelMkn::clientFlattenInit(ia_mkn_config_bits mkn_config_bits,
-+                                    size_t mkn_section_1_size,
-+                                    size_t mkn_section_2_size,
-+                                    MknInitParams *params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
-+
-+    params->mkn_config_bits = mkn_config_bits;
-+    params->mkn_section_1_size = mkn_section_1_size;
-+    params->mkn_section_2_size = mkn_section_2_size;
-+
-+    return true;
-+}
-+
-+bool IPCIntelMkn::clientFlattenPrepare(uintptr_t mkn,
-+                                       ia_mkn_trg data_target, MknPrepareParams *params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
-+
-+    params->mkn_handle = mkn;
-+    params->data_target = data_target;
-+
-+    return true;
-+}
-+
-+bool IPCIntelMkn::clientUnflattenPrepare(MknPrepareParams *params, ia_binary_data *mknData) {
-+    LOGIPC("@%s, mknData:%p", __func__, mknData);
-+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
-+    CheckError(mknData == nullptr, false, "@%s, mknData is nullptr", __func__);
-+
-+    params->results.data = static_cast<void *>(params->data);
-+    *mknData = params->results;
-+
-+    LOGIPC("@%s, mknData.size:%d", __func__, mknData->size);
-+
-+    return true;
-+}
-+
-+bool IPCIntelMkn::serverFlattenPrepare(const ia_binary_data &inData, MknPrepareParams *params) {
-+    LOGIPC("@%s, params:%p", __func__, params);
-+    CheckError(params == nullptr, false, "@%s, params is nullptr", __func__);
-+    CheckError(sizeof(params->data) < inData.size, false, "@%s, buffer is small", __func__);
-+
-+    params->results.size = inData.size;
-+    MEMCPY_S(params->data, sizeof(params->data), inData.data, inData.size);
-+
-+    return true;
-+}
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
-new file mode 100644
-index 000000000000..e5aa119f0f1a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelMkn.h
-@@ -0,0 +1,64 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_mkn_encoder.h>
-+
-+#include "IPCCommon.h"
-+#include "iutils/Utils.h"
-+
-+struct MknInitParams {
-+    ia_mkn_config_bits mkn_config_bits;
-+    size_t mkn_section_1_size;
-+    size_t mkn_section_2_size;
-+    uintptr_t results;
-+};
-+
-+struct MknPrepareParams {
-+    uintptr_t mkn_handle;
-+    ia_mkn_trg data_target;
-+    ia_binary_data results;
-+    char data[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
-+};
-+
-+struct MknDeinitParams {
-+    uintptr_t mkn_handle;
-+};
-+
-+struct MknEnableParams {
-+    uintptr_t mkn_handle;
-+    bool enable_data_collection;
-+};
-+
-+namespace icamera {
-+class IPCIntelMkn {
-+ public:
-+    IPCIntelMkn();
-+    virtual ~IPCIntelMkn();
-+
-+    // for init
-+    bool clientFlattenInit(ia_mkn_config_bits mkn_config_bits,
-+                           size_t mkn_section_1_size,
-+                           size_t mkn_section_2_size,
-+                           MknInitParams* params);
-+
-+    // for prepare
-+    bool clientFlattenPrepare(uintptr_t mkn, ia_mkn_trg data_target, MknPrepareParams *params);
-+    bool clientUnflattenPrepare(MknPrepareParams *params, ia_binary_data *mknData);
-+    bool serverFlattenPrepare(const ia_binary_data &inData, MknPrepareParams *results);
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
-new file mode 100644
-index 000000000000..bf75977dba39
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
-@@ -0,0 +1,478 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPCIntelPGParam"
-+
-+#include "modules/sandboxing/IPCIntelPGParam.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+bool IPCIntelPGParam::clientFlattenInit(void* pData, int dataSize,
-+                                        int pgId, uintptr_t client, ia_p2p_platform_t platform,
-+                                        const PgConfiguration& pgConfig) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, dataSize is small", __func__);
-+
-+    pg_param_init_params *params = static_cast<pg_param_init_params*>(pData);
-+    CheckError(pgConfig.pgManifestSize > sizeof(params->pgManifestData),
-+               false, "@%s, manifest buffer is small", __func__);
-+
-+    params->pgId = pgId;
-+    params->client = client;
-+    params->platform = platform;
-+
-+    params->pgConfig.fragmentCount = pgConfig.fragmentCount;
-+    params->pgConfig.inputMainFrame = pgConfig.inputMainFrame;
-+    params->pgConfig.outputMainFrame = pgConfig.outputMainFrame;
-+
-+    params->pgConfig.pgManifestSize = pgConfig.pgManifestSize;
-+    MEMCPY_S(params->pgManifestData, sizeof(params->pgManifestData),
-+             pgConfig.pgManifest, pgConfig.pgManifestSize);
-+
-+    params->disableDataTermialsCount = pgConfig.disableDataTermials.size();
-+    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
-+               "@%s, disableDataTermials is big", __func__);
-+    memset(params->disableDataTermialsData, -1, sizeof(params->disableDataTermialsData));
-+    for (int i = 0; i < params->disableDataTermialsCount; i++) {
-+        params->disableDataTermialsData[i] = pgConfig.disableDataTermials[i];
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenInit(void* pData, int dataSize,
-+                                          int* pgId, uintptr_t* client,
-+                                          ia_p2p_platform_t* platform,
-+                                          PgConfiguration* pgConfig) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_init_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!pgId || !client, false, "@%s, nullptr client", __func__);
-+    CheckError(!platform || !pgConfig, false, "@%s, nullptr config", __func__);
-+
-+    pg_param_init_params *params = static_cast<pg_param_init_params*>(pData);
-+    *pgId = params->pgId;
-+    *client = params->client;
-+    *platform = params->platform;
-+
-+    pgConfig->fragmentCount = params->pgConfig.fragmentCount;
-+    pgConfig->inputMainFrame = params->pgConfig.inputMainFrame;
-+    pgConfig->outputMainFrame = params->pgConfig.outputMainFrame;
-+    pgConfig->pgManifestSize = params->pgConfig.pgManifestSize;
-+    void* dataPtr = static_cast<void*>(params->pgManifestData);
-+    pgConfig->pgManifest = static_cast<ia_css_program_group_manifest_t*>(dataPtr);
-+
-+    pgConfig->disableDataTermials.clear();
-+    CheckError(params->disableDataTermialsCount > IPU_MAX_TERMINAL_COUNT, false,
-+               "@%s, disableDataTermials is big", __func__);
-+    for (int i = 0; i < params->disableDataTermialsCount; i++) {
-+        pgConfig->disableDataTermials.push_back(params->disableDataTermialsData[i]);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
-+                                           unsigned int ipuParamSize, int32_t ipuParamHandle,
-+                                           const ia_css_rbm_t* rbm) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
-+
-+    pg_param_prepare_params *params = static_cast<pg_param_prepare_params*>(pData);
-+    params->client = client;
-+    params->ipuParamSize = ipuParamSize;
-+    params->ipuParamHandle = ipuParamHandle;
-+
-+    if (rbm) {
-+        params->rbm = &params->rbmData;
-+        MEMCPY_S(&params->rbmData, sizeof(params->rbmData), rbm, sizeof(*rbm));
-+    } else {
-+        params->rbm = nullptr;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client,
-+                                             void* palDataAddr, ia_binary_data* ipuParameters,
-+                                             ia_css_rbm_t** rbm, ia_css_kernel_bitmap_t** bitmap) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+    CheckError(!ipuParameters || !rbm || !bitmap, false, "@%s, nullptr outputs", __func__);
-+    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
-+
-+    pg_param_prepare_params *params = static_cast<pg_param_prepare_params*>(pData);
-+    *client = params->client;
-+    ipuParameters->size = params->ipuParamSize;
-+    ipuParameters->data = palDataAddr;
-+    *rbm = params->rbm ? &params->rbmData : nullptr;
-+    *bitmap = &params->bitmapData;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientUnflattenPrepare(const void* pData, int dataSize,
-+                                             ia_css_kernel_bitmap_t* bitmap) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_params), false, "@%s, buffer is small", __func__);
-+    CheckError(!bitmap, false, "@%s, bitmap is nullptr", __func__);
-+
-+    const pg_param_prepare_params *params = static_cast<const pg_param_prepare_params*>(pData);
-+    MEMCPY_S(bitmap, sizeof(*bitmap), &params->bitmapData, sizeof(params->bitmapData));
-+    return true;
-+}
-+
-+int IPCIntelPGParam::getTotalPGBufferSize(int pgSize) {
-+    int size = sizeof(pg_param_allocate_pg_params);
-+    size += PAGE_ALIGN(pgSize);
-+    return size;
-+}
-+
-+bool IPCIntelPGParam::assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < pgSize, false, "@%s, buffer is small", __func__);
-+    CheckError(!pgBuffer, false, "@%s, payloads is nullptr", __func__);
-+
-+    uintptr_t pgAddr = reinterpret_cast<uintptr_t>(pData);
-+    CheckError(pgAddr & ((getpagesize() - 1)), false, "@%s, pg addr is not aligned", __func__);
-+    *pgBuffer = pData;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenAllocatePGBuffer(void* pData, int dataSize,
-+                                                    uintptr_t client, int pgSize) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
-+                          - sizeof(pg_param_allocate_pg_params);
-+    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + pgSize, false,
-+               "@%s, dataSize is small", __func__);
-+
-+    pg_param_allocate_pg_params *params =
-+        reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
-+    params->client = client;
-+    params->pgSize = pgSize;
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenAllocatePGBuffer(const void* pData, int dataSize,
-+                                                      uintptr_t* client, int* pgSize) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_allocate_pg_params), false,
-+               "@%s, buffer is small", __func__);
-+    CheckError(!client || !pgSize, false, "@%s, nullptr input", __func__);
-+
-+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
-+                          - sizeof(pg_param_allocate_pg_params);
-+    pg_param_allocate_pg_params *params =
-+        reinterpret_cast<pg_param_allocate_pg_params*>(paramAddr);
-+    CheckError(paramAddr < reinterpret_cast<uintptr_t>(pData) + params->pgSize, false,
-+               "@%s, dataSize is small", __func__);
-+    *client = params->client;
-+    *pgSize = params->pgSize;
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client,
-+                                                int descCount) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
-+               "@%s, dataSize is small", __func__);
-+
-+    pg_param_get_fragment_desc_params *params =
-+        static_cast<pg_param_get_fragment_desc_params*>(pData);
-+    CheckError(descCount > sizeof(params->descsData), false, "@%s, descCount is big", __func__);
-+
-+    params->client = client;
-+    params->descCount = descCount;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenGetFragDescs(void* pData, int dataSize,
-+                                                  uintptr_t* client,
-+                                                  int* descCount, ia_p2p_fragment_desc** descs) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+    CheckError(!descCount || !descs, false, "@%s, nullptr outputs", __func__);
-+
-+    pg_param_get_fragment_desc_params *params =
-+        static_cast<pg_param_get_fragment_desc_params*>(pData);
-+    *client = params->client;
-+    *descCount = params->descCount;
-+    *descs = params->descsData;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverFlattenGetFragDescs(void* pData, int dataSize, int count) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
-+               "@%s, dataSize is small", __func__);
-+
-+    pg_param_get_fragment_desc_params *params =
-+        static_cast<pg_param_get_fragment_desc_params*>(pData);
-+    params->returnCount = count;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientUnflattenGetFragDescs(const void* pData, int dataSize,
-+                                                  int* count, ia_p2p_fragment_desc* descs) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_get_fragment_desc_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!count || !descs, false, "@%s, nullptr outputs", __func__);
-+
-+    const pg_param_get_fragment_desc_params *params =
-+        static_cast<const pg_param_get_fragment_desc_params*>(pData);
-+    *count = params->returnCount;
-+    MEMCPY_S(descs, sizeof(ia_p2p_fragment_desc) * params->descCount,
-+             params->descsData, sizeof(params->descsData));
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
-+               "@%s, dataSize is small", __func__);
-+
-+    pg_param_prepare_program_params *params = static_cast<pg_param_prepare_program_params*>(pData);
-+    params->client = client;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenPrepareProgram(const void* pData, int dataSize,
-+                                                    uintptr_t* client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+
-+    const pg_param_prepare_program_params *params =
-+                          static_cast<const pg_param_prepare_program_params*>(pData);
-+    *client = params->client;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverFlattenPrepareProgram(void* pData, int dataSize,
-+                                                  int payloadCount,
-+                                                  const ia_binary_data* payloads) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, payloadCount is big", __func__);
-+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
-+
-+    pg_param_prepare_program_params *params = static_cast<pg_param_prepare_program_params*>(pData);
-+    params->payloadCount = payloadCount;
-+    MEMCPY_S(params->payloads, sizeof(ia_binary_data) * payloadCount,
-+             payloads, sizeof(ia_binary_data) * payloadCount);
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientUnflattenPrepareProgram(const void* pData, int dataSize,
-+                                                    int* payloadCount, ia_binary_data* payloads) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_prepare_program_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
-+
-+    const pg_param_prepare_program_params *params =
-+                                static_cast<const pg_param_prepare_program_params*>(pData);
-+
-+    CheckError(*payloadCount < params->payloadCount, false,
-+               "@%s, payloadCount is small", __func__);
-+    *payloadCount = params->payloadCount;
-+    for (int i = 0; i < params->payloadCount; i++) {
-+        payloads[i].size = params->payloads[i].size;
-+        payloads[i].data = nullptr;
-+    }
-+    return true;
-+}
-+
-+int IPCIntelPGParam::getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads) {
-+    CheckError(!payloads, 0, "@%s, payloads is nullptr", __func__);
-+    int size = sizeof(pg_param_allocate_payloads_params);
-+    for (int i = 0; i < payloadCount; i++) {
-+        if (payloads[i].size) {
-+            size += PAGE_ALIGN(payloads[i].size);
-+        }
-+    }
-+    return size;
-+}
-+
-+bool IPCIntelPGParam::assignPayloads(void* pData, int dataSize,
-+                                     int payloadCount, ia_binary_data* payloads) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
-+
-+    uintptr_t payloadAddr = reinterpret_cast<uintptr_t>(pData);
-+    CheckError(payloadAddr & ((getpagesize() - 1)), false,
-+               "@%s, payload addr is not aligned", __func__);
-+    for (int i = 0; i < payloadCount; i++) {
-+        if (payloads[i].size > 0) {
-+            CheckError(payloadAddr > reinterpret_cast<uintptr_t>(pData) + dataSize, false,
-+                       "@%s, buffer is small", __func__);
-+            payloads[i].data = reinterpret_cast<void*>(payloadAddr);
-+            payloadAddr += PAGE_ALIGN(payloads[i].size);
-+        }
-+    }
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenAllocatePayloads(void* pData, int dataSize,
-+                                                    uintptr_t client, int payloadCount,
-+                                                    const ia_binary_data* payloads) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
-+
-+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
-+                          - sizeof(pg_param_allocate_payloads_params);
-+    pg_param_allocate_payloads_params *params =
-+        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
-+    params->client = client;
-+    params->payloadCount = payloadCount;
-+    for (int i = 0; i < payloadCount; i++) {
-+        params->payloads[i].size = payloads[i].size;
-+        params->payloads[i].data = payloads[i].data;
-+        CheckError(reinterpret_cast<uintptr_t>(payloads[i].data) > paramAddr, false,
-+                   "@%s, buffer is small", __func__);
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenAllocatePayloads(void* pData, int dataSize,
-+                                                      uintptr_t* client, int* payloadCount,
-+                                                      ia_binary_data** payloads) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_allocate_payloads_params), false,
-+               "@%s, dataSize is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+    CheckError(!payloads, false, "@%s, payloads is nullptr", __func__);
-+    CheckError(!payloadCount || !payloads, false, "@%s, nullptr outputs", __func__);
-+
-+    uintptr_t paramAddr = reinterpret_cast<uintptr_t>(pData) + dataSize
-+                          - sizeof(pg_param_allocate_payloads_params);
-+    pg_param_allocate_payloads_params *params =
-+        reinterpret_cast<pg_param_allocate_payloads_params*>(paramAddr);
-+    *client = params->client;
-+    *payloadCount = params->payloadCount;
-+    *payloads = params->payloads;  // Copy directly and ignore client pointers
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
-+                                          unsigned int ipuParamSize, int32_t ipuParamHandle) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, buffer is small", __func__);
-+
-+    pg_param_encode_params *params = static_cast<pg_param_encode_params*>(pData);
-+    params->client = client;
-+    params->ipuParamSize = ipuParamSize;
-+    params->ipuParamHandle = ipuParamHandle;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
-+                                            void* palDataAddr, ia_binary_data* ipuParameters) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, small dataSize", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+    CheckError(!ipuParameters, false, "@%s, nullptr output", __func__);
-+    CheckError(!palDataAddr, false, "%s, palDataAddr is nullptr", __func__);
-+
-+    pg_param_encode_params *params = static_cast<pg_param_encode_params*>(pData);
-+    *client = params->client;
-+    ipuParameters->size = params->ipuParamSize;
-+    ipuParameters->data = palDataAddr;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenDecode(void* pData, int dataSize, uintptr_t client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
-+
-+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
-+    params->client = client;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenDecode(const void* pData, int dataSize,
-+                                            uintptr_t* client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+
-+    const pg_param_decode_params *params = static_cast<const pg_param_decode_params*>(pData);
-+    *client = params->client;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverFlattenDecode(void* pData, int dataSize,
-+                                          const ia_binary_data& statistics) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
-+
-+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
-+    params->statistics.size = statistics.size;
-+    params->statistics.data = params->statisticsData;
-+    MEMCPY_S(params->statisticsData, sizeof(params->statisticsData),
-+             statistics.data, statistics.size);
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientUnflattenDecode(void* pData, int dataSize,
-+                                            ia_binary_data* statistics) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
-+    CheckError(!statistics, false, "@%s, statistics is nullptr", __func__);
-+
-+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
-+    statistics->size = params->statistics.size;
-+    statistics->data = params->statisticsData;
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::clientFlattenDeinit(void* pData, int dataSize, uintptr_t client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, buffer is small", __func__);
-+
-+    pg_param_deinit_params *params = static_cast<pg_param_deinit_params*>(pData);
-+    params->client = client;
-+
-+    return true;
-+}
-+
-+bool IPCIntelPGParam::serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client) {
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pg_param_deinit_params), false, "@%s, size is small", __func__);
-+    CheckError(!client, false, "@%s, nullptr client", __func__);
-+
-+    const pg_param_deinit_params *params = static_cast<const pg_param_deinit_params*>(pData);
-+    *client = params->client;
-+
-+    return true;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
-new file mode 100644
-index 000000000000..23cf71b5a017
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
-@@ -0,0 +1,160 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "src/core/psysprocessor/PGUtils.h"
-+
-+namespace icamera {
-+
-+#define MAX_PROCESS_GROUP_SIZE 8192
-+#define MAX_PAL_SIZE           0x800000  // 8M
-+#define MAX_STATISTICS_SIZE    MAX_IA_BINARY_DATA_SIZE
-+
-+struct pg_param_init_params {
-+    int pgId;
-+    uintptr_t client;
-+    ia_p2p_platform_t platform;
-+    PgConfiguration pgConfig;
-+    unsigned char pgManifestData[MAX_PROCESS_GROUP_SIZE];
-+    int disableDataTermialsData[IPU_MAX_TERMINAL_COUNT];
-+    int disableDataTermialsCount;
-+};
-+
-+struct pg_param_prepare_params {
-+    uintptr_t client;
-+    uint32_t ipuParamSize;
-+    int32_t ipuParamHandle;
-+    ia_css_rbm_t* rbm;
-+    ia_css_rbm_t rbmData;
-+
-+    // Output
-+    ia_css_kernel_bitmap_t bitmapData;
-+};
-+
-+// Shared memory: pg + struct
-+// as pg memory addr should be page size aligned
-+struct pg_param_allocate_pg_params {
-+    uintptr_t client;
-+    int pgSize;
-+};
-+
-+struct pg_param_get_fragment_desc_params {
-+    uintptr_t client;
-+    int descCount;
-+
-+    // Output
-+    int returnCount;
-+    ia_p2p_fragment_desc descsData[IPU_MAX_TERMINAL_COUNT * IA_P2P_MAX_FRAGMENTS];
-+};
-+
-+struct pg_param_prepare_program_params {
-+    uintptr_t client;
-+
-+    // Output
-+    int payloadCount;
-+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
-+};
-+
-+// Shared memory: payloads + struct
-+// as payload memory addr should be page size aligned
-+struct pg_param_allocate_payloads_params {
-+    uintptr_t client;
-+    int payloadCount;
-+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];  // save size of payloads
-+};
-+
-+struct pg_param_encode_params {
-+    uintptr_t client;
-+    uint32_t ipuParamSize;
-+    int32_t ipuParamHandle;
-+};
-+
-+struct pg_param_decode_params {
-+    uintptr_t client;
-+
-+    // Output
-+    ia_binary_data statistics;
-+    unsigned char statisticsData[MAX_STATISTICS_SIZE];
-+};
-+
-+struct pg_param_deinit_params {
-+    uintptr_t client;
-+};
-+
-+class IPCIntelPGParam {
-+ public:
-+    IPCIntelPGParam() {}
-+    virtual ~IPCIntelPGParam() {}
-+
-+    bool clientFlattenInit(void* pData, int dataSize, int pgId, uintptr_t client,
-+                            ia_p2p_platform_t platform, const PgConfiguration& pgConfig);
-+    bool serverUnflattenInit(void* pData, int dataSize, int* pgId, uintptr_t* client,
-+                             ia_p2p_platform_t* platform, PgConfiguration* pgConfig);
-+
-+    bool clientFlattenPrepare(void* pData, int dataSize, uintptr_t client,
-+                              unsigned int ipuParamSize, int32_t ipuParamHandle,
-+                              const ia_css_rbm_t* rbm);
-+    bool serverUnflattenPrepare(void* pData, int dataSize, uintptr_t* client,
-+                                void* palDataAddr, ia_binary_data* ipuParameters,
-+                                ia_css_rbm_t** rbm, ia_css_kernel_bitmap_t** bitmap);
-+    bool clientUnflattenPrepare(const void* pData, int dataSize, ia_css_kernel_bitmap_t* bitmap);
-+
-+    int getTotalPGBufferSize(int pgSize);
-+    bool assignPGBuffer(void* pData, int dataSize, int pgSize, void** pgBuffer);
-+    bool clientFlattenAllocatePGBuffer(void* pData, int dataSize, uintptr_t client, int pgSize);
-+    bool serverUnflattenAllocatePGBuffer(const void* pData, int dataSize,
-+                                         uintptr_t* client, int* pgSize);
-+
-+    bool clientFlattenGetFragDescs(void* pData, int dataSize, uintptr_t client, int descCount);
-+    bool serverUnflattenGetFragDescs(void* pData, int dataSize, uintptr_t* client,
-+                                     int* descCount, ia_p2p_fragment_desc** descs);
-+    bool serverFlattenGetFragDescs(void* pData, int dataSize, int count);
-+    bool clientUnflattenGetFragDescs(const void* pData, int dataSize,
-+                                     int* count, ia_p2p_fragment_desc* descs);
-+
-+    bool clientFlattenPrepareProgram(void* pData, int dataSize, uintptr_t client);
-+    bool serverUnflattenPrepareProgram(const void* pData, int dataSize, uintptr_t* client);
-+    bool serverFlattenPrepareProgram(void* pData, int dataSize,
-+                                     int payloadCount, const ia_binary_data* payloads);
-+    bool clientUnflattenPrepareProgram(const void* pData, int dataSize,
-+                                       int* payloadCount, ia_binary_data* payloads);
-+
-+    int getTotalPayloadSize(int payloadCount, const ia_binary_data* payloads);
-+    bool assignPayloads(void* pData, int dataSize, int payloadCount, ia_binary_data* payloads);
-+    bool clientFlattenAllocatePayloads(void* pData, int dataSize, uintptr_t client,
-+                                       int payloadCount, const ia_binary_data* payloads);
-+    bool serverUnflattenAllocatePayloads(void* pData, int dataSize, uintptr_t* client,
-+                                         int* payloadCount, ia_binary_data** payloads);
-+
-+    bool clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
-+                             unsigned int ipuParamSize, int32_t ipuParamHandle);
-+    bool serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
-+                               void* palDataAddr, ia_binary_data* ipuParameters);
-+
-+    bool clientFlattenDecode(void* pData, int dataSize, uintptr_t client);
-+    bool serverUnflattenDecode(const void* pData, int dataSize, uintptr_t* client);
-+    bool serverFlattenDecode(void* pData, int dataSize, const ia_binary_data& statistics);
-+    bool clientUnflattenDecode(void* pData, int dataSize, ia_binary_data* statistics);
-+
-+    bool clientFlattenDeinit(void* pData, int dataSize, uintptr_t client);
-+    bool serverUnflattenDeinit(const void* pData, int dataSize, uintptr_t* client);
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
-new file mode 100644
-index 000000000000..b01d4a041b28
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.cpp
-@@ -0,0 +1,558 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IPC_ISP_PARAM_ADAPTOR"
-+
-+#include "modules/sandboxing/IPCIspParamAdaptor.h"
-+
-+#include <memory>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IPCIspParamAdaptor::IPCIspParamAdaptor() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IPCIspParamAdaptor::~IPCIspParamAdaptor() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IPCIspParamAdaptor::clientFlattenInit(void *pData, uint32_t size,
-+                                           const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
-+                                           uint32_t maxStatsWidth, uint32_t maxStatsHeight,
-+                                           uint32_t maxNumStatsIn, ia_mkn *iaMkn) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData || !ispData || !iaCmc, false,
-+               "@%s, pData, ispData or iaCmc is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
-+    CheckError(ispData->size > MAX_IA_BINARY_DATA_SIZE,
-+               false, "%s, the buffer of isp data is too small", __func__);
-+
-+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(pData);
-+    params->iaIsp = *ispData;
-+    if (params->iaIsp.data) {
-+        MEMCPY_S(params->ispAiqbData, sizeof(params->ispAiqbData), ispData->data, ispData->size);
-+    }
-+
-+    params->iaCmcHandle = reinterpret_cast<uintptr_t>(iaCmc);
-+    params->maxStatsWidth = maxStatsWidth;
-+    params->maxStatsHeight = maxStatsHeight;
-+    params->maxStatsIn = maxNumStatsIn;
-+    params->iaMkn = nullptr;  // Not used in current
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverUnflattenInit(IspBxtInitParam *pData, uint32_t size,
-+                                             ia_binary_data **Isp, ia_cmc_t **Cmc) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtInitParam), false, "@%s, buffer is small", __func__);
-+    CheckError(!Isp || !Cmc, false, "@%s, Isp or Cmc is nullptr", __func__);
-+
-+    if (pData->iaIsp.data) {
-+        CheckError(pData->iaIsp.size > MAX_IA_BINARY_DATA_SIZE,
-+                   false, "%s, the buffer of isp data is too small", __func__);
-+        pData->iaIsp.data = pData->ispAiqbData;
-+    }
-+    *Isp = &pData->iaIsp;
-+    *Cmc = reinterpret_cast<ia_cmc_t*>(pData->iaCmcHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::clientFlattenDeInit(void *pData, uint32_t size,
-+                                             const ia_isp_bxt *ispHandle) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
-+
-+    IspBxtDeInitParam *params = static_cast<IspBxtDeInitParam*>(pData);
-+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverUnflattenDeInit(const void *pData, uint32_t size,
-+                                               ia_isp_bxt **ispHandle) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle, false, "@%s, ispHandle is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtDeInitParam), false, "@%s, buffer is small", __func__);
-+
-+    const IspBxtDeInitParam *params = static_cast<const IspBxtDeInitParam*>(pData);
-+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::clientFlattenGetPalSize(void *pData, uint32_t size,
-+                                                 const ia_isp_bxt_program_group *programGroup) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
-+    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
-+
-+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
-+
-+    bool ret = flattenProgramGroup(programGroup, &params->programGroup);
-+    CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverUnflattenGetPalSize(void *pData, uint32_t size,
-+                                                   ia_isp_bxt_program_group **programGroup) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!programGroup, false, "@%s, programGroup is nullptr", __func__);
-+    CheckError(size < sizeof(PalDataSizeParam), false, "@%s, buffer is small", __func__);
-+
-+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
-+
-+    bool ret = unflattenProgramGroup(&params->programGroup);
-+    CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
-+
-+    *programGroup = &params->programGroup.group;
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::clientFlattenConvertStats(void *pData, uint32_t size,
-+                                                   const ia_isp_bxt *ispHandle,
-+                                                   const ConvertInputParam *inputParams) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle || !inputParams, false,
-+               "@%s, ispHandle or inputParams is nullptr", __func__);
-+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
-+
-+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
-+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
-+    params->multiExpo = inputParams->multiExpo;
-+
-+    params->statsBuffer = *inputParams->statsBuffer;
-+    if (params->statsBuffer.size > 0) {
-+        CheckError(params->statsBuffer.size > MAX_IA_BINARY_DATA_SIZE,
-+                   false, "%s, the buffer of stats is too small", __func__);
-+        MEMCPY_S(params->statsData, MAX_IA_BINARY_DATA_SIZE,
-+                 inputParams->statsBuffer->data, inputParams->statsBuffer->size);
-+    }
-+
-+    bool ret = mIpcAiq.flattenAeResults(*inputParams->aeResults, &params->aeResults);
-+    CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
-+
-+    params->dvsReso = *inputParams->dvsReso;
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverUnflattenConvertStats(void *pData, uint32_t size,
-+                                                     ia_isp_bxt **ispHandle,
-+                                                     ConvertInputParam *inputParams,
-+                                                     ConvertResult *result) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle || !inputParams || !result, false,
-+               "@%s, ispHandle, inputParams or result is nullptr", __func__);
-+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
-+
-+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
-+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
-+    inputParams->multiExpo = params->multiExpo;
-+
-+    inputParams->statsBuffer = &params->statsBuffer;
-+    if (params->statsBuffer.size > 0) {
-+        params->statsBuffer.data = params->statsData;
-+    }
-+
-+    inputParams->dvsReso = &params->dvsReso;
-+    ae_run_params_results *res = &params->aeResults;
-+
-+    bool ret = mIpcAiq.unflattenAeResults(res);
-+    CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
-+    inputParams->aeResults = &res->base;
-+
-+    CLEAR(params->queryResults);
-+    result->queryResults = &params->queryResults;
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverFlattenConvertStats(void *pData, uint32_t size,
-+                                                   const ConvertResult &result) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
-+
-+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
-+    // the queryResults uses SHM
-+
-+    // flatten rgbs grid
-+    CLEAR(params->rgbsGridArray);
-+    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
-+        ia_aiq_rgbs_grid *rgbs = result.rgbsGrid[i];
-+        if (rgbs) {
-+            params->rgbsGrid[i].base = *rgbs;
-+            size_t rgbsSize = rgbs->grid_width * rgbs->grid_height * sizeof(rgbs_grid_block);
-+            size_t memSize = sizeof(params->rgbsGrid[i].blocks_ptr);
-+            CheckError(memSize < rgbsSize, false, "%s, memory for rgbs is too small", __func__);
-+            MEMCPY_S(params->rgbsGrid[i].blocks_ptr, memSize, rgbs->blocks_ptr, rgbsSize);
-+            params->rgbsGridArray[i] = &params->rgbsGrid[i].base;
-+        }
-+    }
-+
-+    // flatten af grid
-+    params->afGridPtr = nullptr;
-+    if (result.afGrid) {
-+        params->afGrid.base = *result.afGrid;
-+        size_t afSize = result.afGrid->grid_width * result.afGrid->grid_height * sizeof(int);
-+        size_t memSize = sizeof(params->afGrid.filter_response_1);
-+        CheckError(memSize < afSize, false, "%s, memory for af grid is too small", __func__);
-+        MEMCPY_S(params->afGrid.filter_response_1, memSize,
-+                 result.afGrid->filter_response_1, afSize);
-+        MEMCPY_S(params->afGrid.filter_response_2, memSize,
-+                 result.afGrid->filter_response_2, afSize);
-+        params->afGridPtr = &params->afGrid.base;
-+    }
-+
-+    // flatten dvs grid
-+    params->dvsStatsPtr = nullptr;
-+    if (result.dvsStats) {
-+        params->dvsStats.base = *result.dvsStats;
-+        CheckError(MV_ENTRIE_COUNT < result.dvsStats->vector_count, false,
-+                   "%s, memory for dvs statistics is too small", __func__);
-+        MEMCPY_S(params->dvsStats.motion_vectors,
-+                 MV_ENTRIE_COUNT * sizeof(ia_dvs_motion_vector),
-+                 result.dvsStats->motion_vectors,
-+                 result.dvsStats->vector_count * sizeof(ia_dvs_motion_vector));
-+        params->dvsStatsPtr = &params->dvsStats.base;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::clientUnflattenConvertStats(void *pData, uint32_t size,
-+                                                     ConvertResult *result) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData || !result, false, "@%s, pData or result is nullptr", __func__);
-+    CheckError(size < sizeof(ConvertStatsParam), false, "@%s, buffer is small", __func__);
-+
-+    ConvertStatsParam *params = static_cast<ConvertStatsParam*>(pData);
-+    *result->queryResults = params->queryResults;
-+
-+    for (int i = 0; i < MAX_NUM_EXPOSURES; ++i) {
-+        if (params->rgbsGridArray[i]) {
-+            params->rgbsGrid[i].base.blocks_ptr = params->rgbsGrid[i].blocks_ptr;
-+            result->rgbsGrid[i] = &params->rgbsGrid[i].base;
-+        }
-+    }
-+
-+    if (params->afGridPtr) {
-+        params->afGrid.base.filter_response_1 = params->afGrid.filter_response_1;
-+        params->afGrid.base.filter_response_2 = params->afGrid.filter_response_2;
-+        result->afGrid = &params->afGrid.base;
-+    }
-+
-+    if (params->dvsStatsPtr) {
-+        params->dvsStats.base.motion_vectors = params->dvsStats.motion_vectors;
-+        result->dvsStats = &params->dvsStats.base;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::clientFlattenRunPal(void *pData, uint32_t size,
-+                                             const ia_isp_bxt *ispHandle,
-+                                             const ia_isp_bxt_input_params_v2 *inputParams,
-+                                             const ia_binary_data *outputData,
-+                                             const int32_t palDataHandle) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle || !inputParams || !outputData, false,
-+               "@%s, ispHandle, inputParams or outputData is nullptr", __func__);
-+    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
-+
-+    RunPalParam *params = static_cast<RunPalParam*>(pData);
-+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
-+    params->inputParamsBase = *inputParams;
-+    ia_isp_bxt_input_params_v2 *base = &params->inputParamsBase;
-+
-+    if (base->sensor_frame_params) {
-+        params->frameParam = *inputParams->sensor_frame_params;
-+    }
-+
-+    if (base->awb_results) {
-+        params->awbResult = *inputParams->awb_results;
-+    }
-+
-+    bool ret = true;
-+    if (base->gbce_results) {
-+        ret = mIpcAiq.flattenGbceResults(*inputParams->gbce_results, &params->gbceResult);
-+        CheckError(ret == false, false, "%s, flattenGbceResults fails", __func__);
-+    }
-+
-+    if (base->ae_results) {
-+        ret = mIpcAiq.flattenAeResults(*inputParams->ae_results, &params->aeResults);
-+        CheckError(ret == false, false, "%s, flattenAeResults fails", __func__);
-+    }
-+
-+    if (base->pa_results) {
-+        ret = mIpcAiq.flattenPaResultsV1(*inputParams->pa_results, &params->paResult);
-+        CheckError(ret == false, false, "%s, flattenPaResultsV1 fails", __func__);
-+    }
-+
-+    if (base->sa_results) {
-+        mIpcAiq.flattenSaResultsV2(*inputParams->sa_results, &params->saResult);
-+        CheckError(ret == false, false, "%s, flattenSaResultsV2 fails", __func__);
-+    }
-+
-+    if (base->weight_grid) {
-+        params->weightGrid = *inputParams->weight_grid;
-+        size_t weightSize = (inputParams->weight_grid->width *
-+                            inputParams->weight_grid->height * sizeof(unsigned char));
-+        CheckError(weightSize > MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char),
-+                   false, "%s, the buffer for weight grid is too small", __func__);
-+        MEMCPY_S(params->weights, MAX_SIZE_WEIGHT_GRID * sizeof(unsigned char),
-+                 inputParams->weight_grid->weights, weightSize);
-+        params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
-+    }
-+
-+    if (base->program_group) {
-+        CLEAR(params->programGroup);
-+        ret = flattenProgramGroup(inputParams->program_group, &params->programGroup);
-+        CheckError(ret == false, false, "%s, flattenProgramGroup fails", __func__);
-+    }
-+
-+    if (base->dvs_morph_table) {
-+        ret = mIpcDvs.flattenMorphTable(inputParams->dvs_morph_table, &params->dvsResult);
-+        CheckError(ret == false, false, "%s, flattenMorphTable fails", __func__);
-+    }
-+
-+    if (base->custom_controls) {
-+        params->customControl = *inputParams->custom_controls;
-+
-+        size_t customCtlSize = inputParams->custom_controls->count * sizeof(float);
-+        size_t maxCtlSize = MAX_CUSTOM_CONTROLS_SIZE * sizeof(float);
-+        CheckError(customCtlSize > maxCtlSize, false,
-+                   "%s, the buffer for custom controls is too small", __func__);
-+        if (inputParams->custom_controls->parameters) {
-+            MEMCPY_S(params->customCtlParams, maxCtlSize,
-+                     inputParams->custom_controls->parameters, customCtlSize);
-+            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
-+        }
-+    }
-+
-+    if (base->pal_override) {
-+        params->palOverride = *inputParams->pal_override;
-+        if (inputParams->pal_override->size > 0) {
-+            MEMCPY_S(params->overrideData, sizeof(params->overrideData),
-+                     inputParams->pal_override->data, inputParams->pal_override->size);
-+            params->palOverride.data = static_cast<void*>(params->overrideData);
-+        }
-+    }
-+
-+    if (base->ltm_results) {
-+        params->ltmResult = *inputParams->ltm_results;
-+    }
-+
-+    if (base->ltm_drc_params) {
-+        params->drcResult = *inputParams->ltm_drc_params;
-+    }
-+
-+    if (base->gdc_transformation) {
-+        params->gdcTransform = *inputParams->gdc_transformation;
-+    }
-+
-+    if (base->view_params) {
-+        MEMCPY_S(&params->viewConfig, sizeof(params->viewConfig),
-+                 inputParams->view_params, sizeof(ia_view_config_t));
-+    }
-+
-+    if (base->bcomp_results) {
-+        params->bcompResult = *inputParams->bcomp_results;
-+    }
-+
-+    if (base->gdc_mbr_limits) {
-+        params->gdcLimit = *inputParams->gdc_mbr_limits;
-+    }
-+
-+    if (outputData) {
-+        params->palOutput = *outputData;
-+        params->palDataHandle = palDataHandle;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::serverUnflattenRunPal(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
-+                                               ia_isp_bxt_input_params_v2 **paramsRes,
-+                                               ia_binary_data **palOutput) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
-+    CheckError(!ispHandle || !paramsRes || !palOutput, false,
-+               "@%s, ispHandle paramsRes or palOutput is nullptr", __func__);
-+    CheckError(size < sizeof(RunPalParam), false, "@%s, buffer is small", __func__);
-+
-+    RunPalParam *params = static_cast<RunPalParam*>(pData);
-+    ia_isp_bxt_input_params_v2 *base = &params->inputParamsBase;
-+
-+    if (base->sensor_frame_params) {
-+        base->sensor_frame_params = &params->frameParam;
-+    }
-+
-+    if (base->awb_results) {
-+        base->awb_results = &params->awbResult;
-+    }
-+
-+    bool ret = true;
-+    if (base->gbce_results) {
-+        ret = mIpcAiq.unflattenGbceResults(&params->gbceResult);
-+        CheckError(ret == false, false, "%s, unflattenGbceResults fails", __func__);
-+        base->gbce_results = &params->gbceResult.base;
-+    }
-+
-+    if (base->ae_results) {
-+        ret = mIpcAiq.unflattenAeResults(&params->aeResults);
-+        CheckError(ret == false, false, "%s, unflattenAeResults fails", __func__);
-+        base->ae_results = &params->aeResults.base;
-+    }
-+
-+    if (base->pa_results) {
-+        ret = mIpcAiq.unflattenPaResultsV1(&params->paResult);
-+        CheckError(ret == false, false, "%s, unflattenPaResultsV1 fails", __func__);
-+        base->pa_results = &params->paResult.base;
-+    }
-+
-+    if (base->sa_results) {
-+        ret = mIpcAiq.unflattenSaResultsV2(&params->saResult);
-+        CheckError(ret == false, false, "%s, unflattenSaResultsV2 fails", __func__);
-+        base->sa_results = &params->saResult.base;
-+    }
-+
-+    if (base->weight_grid) {
-+        if (params->weightGrid.weights) {
-+            params->weightGrid.weights = const_cast<unsigned char*>(params->weights);
-+        }
-+        base->weight_grid = &params->weightGrid;
-+    }
-+
-+    if (base->program_group) {
-+        ret = unflattenProgramGroup(&params->programGroup);
-+        CheckError(ret == false, false, "%s, unflattenProgramGroup fails", __func__);
-+        base->program_group = &params->programGroup.group;
-+    }
-+
-+    if (base->dvs_morph_table) {
-+        ret = mIpcDvs.unflattenMorphTalbe(&params->dvsResult);
-+        CheckError(ret == false, false, "%s, unflattenMorphTalbe fails", __func__);
-+        base->dvs_morph_table = &params->dvsResult.morphTable;
-+    }
-+
-+    if (base->custom_controls) {
-+        if (params->customControl.parameters) {
-+            params->customControl.parameters = const_cast<float*>(params->customCtlParams);
-+        }
-+        base->custom_controls = &params->customControl;
-+    }
-+
-+    if (base->pal_override) {
-+        if (params->palOverride.data) {
-+            params->palOverride.data = static_cast<void*>(params->overrideData);
-+        }
-+        base->pal_override = &params->palOverride;
-+    }
-+
-+    if (base->ltm_results) {
-+        base->ltm_results = &params->ltmResult;
-+    }
-+
-+    if (base->ltm_drc_params) {
-+        base->ltm_drc_params = &params->drcResult;
-+    }
-+
-+    if (base->gdc_transformation) {
-+        base->gdc_transformation = &params->gdcTransform;
-+    }
-+
-+    if (base->view_params) {
-+        base->view_params = reinterpret_cast<ia_isp_bxt_view_params_t *>(&params->viewConfig);
-+    }
-+
-+    if (base->bcomp_results) {
-+        base->bcomp_results = &params->bcompResult;
-+    }
-+
-+    if (base->gdc_mbr_limits) {
-+        base->gdc_mbr_limits = &params->gdcLimit;
-+    }
-+
-+    *ispHandle = reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
-+    *paramsRes = &params->inputParamsBase;
-+    *palOutput = &params->palOutput;
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::flattenProgramGroup(const ia_isp_bxt_program_group *src,
-+                                             GraphKernelArray *res) {
-+    CheckError(!src || !res, false, "@%s, src or dst is nullptr", __func__);
-+    CheckError(src->kernel_count > MAX_STREAM_KERNEL_COUNT, false,
-+               "%s the buffer of kernel array is tool small", __func__);
-+
-+    res->group = *src;
-+    for (unsigned int j = 0; j < res->group.kernel_count; ++j) {
-+        res->runKernels[j] = src->run_kernels[j];
-+        if (res->runKernels[j].resolution_info) {
-+            res->resoInfo[j] = *src->run_kernels[j].resolution_info;
-+        }
-+        if (res->runKernels[j].resolution_history) {
-+            res->resoHistory[j] = *src->run_kernels[j].resolution_history;
-+        }
-+    }
-+    if (res->group.pipe) {
-+        res->pipeInfo = *src->pipe;
-+    }
-+
-+    return true;
-+}
-+
-+bool IPCIspParamAdaptor::unflattenProgramGroup(GraphKernelArray *result) {
-+    CheckError(!result, false, "@%s, result is nullptr", __func__);
-+    CheckError(result->group.kernel_count > MAX_STREAM_KERNEL_COUNT,
-+               false, "%s, the buffer of kernel array is too small", __func__);
-+
-+    result->group.run_kernels = result->runKernels;
-+    for (unsigned j = 0; j < result->group.kernel_count; ++j) {
-+        if (result->runKernels[j].resolution_info) {
-+            result->runKernels[j].resolution_info = &result->resoInfo[j];
-+        }
-+
-+        if (result->runKernels[j].resolution_history) {
-+            result->runKernels[j].resolution_history = &result->resoHistory[j];
-+        }
-+    }
-+    if (result->group.pipe) {
-+        result->group.pipe = &result->pipeInfo;
-+    }
-+
-+    return true;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
-new file mode 100644
-index 000000000000..22520dd7f33b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIspParamAdaptor.h
-@@ -0,0 +1,170 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "modules/algowrapper/StatsTypes.h"
-+
-+#include "modules/sandboxing/IPCGraphConfig.h"
-+#include "modules/sandboxing/IPCIntelAiq.h"
-+#include "modules/sandboxing/IPCIntelDvs.h"
-+
-+namespace icamera {
-+
-+struct IspBxtInitParam {
-+    ia_binary_data iaIsp;
-+    int8_t ispAiqbData[MAX_IA_BINARY_DATA_SIZE];
-+    uintptr_t iaCmcHandle;
-+    uint32_t maxStatsWidth;
-+    uint32_t maxStatsHeight;
-+    uint32_t maxStatsIn;
-+    ia_mkn *iaMkn;  // hal always passes nullptr to ia_bxt_isp
-+
-+    uintptr_t ispRemoteHandle;
-+};
-+
-+struct IspBxtDeInitParam {
-+    uintptr_t ispRemoteHandle;
-+};
-+
-+struct PalDataSizeParam {
-+    GraphKernelArray programGroup;
-+    int palDataSize;
-+};
-+
-+struct DvsStatsParam {
-+    ia_dvs_statistics base;
-+    ia_dvs_motion_vector motion_vectors[MV_ENTRIE_COUNT];
-+};
-+
-+struct ConvertStatsParam {
-+    uintptr_t ispRemoteHandle;
-+
-+    // Input params
-+    bool multiExpo;
-+    ia_binary_data statsBuffer;
-+    int8_t statsData[MAX_IA_BINARY_DATA_SIZE];
-+    camera_resolution_t dvsReso;
-+    ae_run_params_results aeResults;
-+
-+    // Output result
-+    ia_isp_bxt_statistics_query_results_t queryResults;
-+
-+    ia_aiq_rgbs_grid *rgbsGridArray[MAX_NUM_EXPOSURES];
-+    ia_aiq_rgbs_grid_data rgbsGrid[MAX_NUM_EXPOSURES];
-+
-+    ia_aiq_af_grid *afGridPtr;
-+    ia_aiq_af_grid_data afGrid;
-+
-+    ia_dvs_statistics *dvsStatsPtr;
-+    DvsStatsParam dvsStats;
-+};
-+
-+#define MAX_CUSTOM_CONTROLS_SIZE  1024
-+struct RunPalParam {
-+    ia_isp_bxt_input_params_v2 inputParamsBase;
-+
-+    // sensor frame parameters
-+    ia_aiq_frame_params frameParam;
-+
-+    // for 3a result
-+    ia_aiq_awb_results awbResult;
-+    gbce_results_params gbceResult;
-+
-+    ae_run_params_results aeResults;
-+    pa_run_params_results_v1 paResult;
-+    sa_run_v2_params_results saResult;
-+
-+    ia_aiq_hist_weight_grid weightGrid;
-+    unsigned char weights[MAX_SIZE_WEIGHT_GRID];
-+
-+    GraphKernelArray programGroup;
-+    DvsMorphParams dvsResult;
-+
-+    // for custom control
-+    ia_isp_custom_controls customControl;
-+    float customCtlParams[MAX_CUSTOM_CONTROLS_SIZE];
-+
-+    // for pal override
-+    ia_binary_data palOverride;
-+    int8_t overrideData[MAX_IA_BINARY_DATA_SIZE];
-+
-+    // for ltm result
-+    ia_ltm_results ltmResult;
-+    ia_ltm_drc_params drcResult;
-+
-+    ia_dvs_image_transformation gdcTransform;
-+
-+    ia_view_config_t viewConfig;
-+    ia_bcomp_results bcompResult;
-+    ia_isp_bxt_gdc_limits gdcLimit;
-+
-+    ia_binary_data palOutput;
-+    int32_t palDataHandle;
-+
-+    uintptr_t ispRemoteHandle;
-+};
-+
-+class IPCIspParamAdaptor {
-+ public:
-+    IPCIspParamAdaptor();
-+    virtual ~IPCIspParamAdaptor();
-+
-+    // init
-+    bool clientFlattenInit(void *pData, uint32_t size, const ia_binary_data *ispData,
-+                           const ia_cmc_t *iaCmc, uint32_t maxStatsWidth,
-+                           uint32_t maxStatsHeight, uint32_t maxNumStatsIn, ia_mkn *iaMkn);
-+    bool serverUnflattenInit(IspBxtInitParam *pData, uint32_t size,
-+                             ia_binary_data **Isp, ia_cmc_t **Cmc);
-+
-+    // deinit
-+    bool clientFlattenDeInit(void *pData, uint32_t size, const ia_isp_bxt *ispHandle);
-+    bool serverUnflattenDeInit(const void *pData, uint32_t size, ia_isp_bxt **ispHandle);
-+
-+    // get pal data size
-+    bool clientFlattenGetPalSize(void *pData, uint32_t size,
-+                                 const ia_isp_bxt_program_group *programGroup);
-+    bool serverUnflattenGetPalSize(void *pData, uint32_t size,
-+                                   ia_isp_bxt_program_group **programGroup);
-+
-+    // convert stats
-+    bool clientFlattenConvertStats(void *pData, uint32_t size, const ia_isp_bxt *ispHandle,
-+                                   const ConvertInputParam *inputParams);
-+    bool serverUnflattenConvertStats(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
-+                                     ConvertInputParam *inputParams, ConvertResult *result);
-+    bool serverFlattenConvertStats(void *pData, uint32_t size, const ConvertResult &result);
-+    bool clientUnflattenConvertStats(void *pData, uint32_t size, ConvertResult *result);
-+
-+    // run pal
-+    bool clientFlattenRunPal(void *pData, uint32_t size, const ia_isp_bxt *ispHandle,
-+                             const ia_isp_bxt_input_params_v2 *inputParams,
-+                             const ia_binary_data *outputData, const int32_t palDataHandle);
-+    bool serverUnflattenRunPal(void *pData, uint32_t size, ia_isp_bxt **ispHandle,
-+                               ia_isp_bxt_input_params_v2 **paramsRes, ia_binary_data **palOutput);
-+
-+ private:
-+    bool flattenProgramGroup(const ia_isp_bxt_program_group *src, GraphKernelArray *res);
-+    bool unflattenProgramGroup(GraphKernelArray *result);
-+
-+ private:
-+    IPCIntelAiq mIpcAiq;
-+    IPCIntelDvs mIpcDvs;
-+
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(IPCIspParamAdaptor);
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
-new file mode 100644
-index 000000000000..58fa90f623d6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.cpp
-@@ -0,0 +1,189 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ClientGraphConfigImpl"
-+
-+#include "modules/sandboxing/client/GraphConfigImpl.h"
-+#include "iutils/CameraLog.h"
-+
-+using std::vector;
-+using std::map;
-+using std::string;
-+
-+namespace icamera {
-+
-+GraphConfigImpl::GraphConfigImpl() :
-+    mCameraId(-1),
-+    mInitialized(false) {
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string parseName = "/graphParse" + std::to_string(personal) + "Shm";
-+
-+    mMems = {{parseName.c_str(), sizeof(GraphParseParams), &mMemParse, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done, cameraId: %d", __func__, mCameraId);
-+    mInitialized = true;
-+}
-+
-+GraphConfigImpl::GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type) :
-+    mCameraId(camId),
-+    mConfigMode(mode),
-+    mType(type),
-+    mInitialized(false) {
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string configStreamsName = "/graphConfigStreams" + std::to_string(personal) + "Shm";
-+    std::string getGraphDataName = "/graphGetData" + std::to_string(personal) + "Shm";
-+    std::string getPgIdName = "/graphGetPgId" + std::to_string(personal) + "Shm";
-+    std::string getConnection = "/graphGetConnection" + std::to_string(personal) + "Shm";
-+
-+    mMems = {{configStreamsName.c_str(), sizeof(GraphConfigStreamParams), &mMemConfig, false},
-+             {getGraphDataName.c_str(), sizeof(GraphGetDataParams), &mMemGetData, false},
-+             {getPgIdName.c_str(), sizeof(GraphGetPgIdParams), &mMemGetPgId, false},
-+             {getConnection.c_str(), sizeof(GraphGetConnectionParams), &mMemGetConnection, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    mInitialized = true;
-+    LOGIPC("@%s, done, cameraId: %d, configMode: %d, type",
-+           __func__, mCameraId, mConfigMode, mType);
-+}
-+
-+GraphConfigImpl::~GraphConfigImpl() {
-+    mInitialized = false;
-+    mCommon.releaseAllShmMems(mMems);
-+    mMems.clear();
-+}
-+
-+void GraphConfigImpl::addCustomKeyMap() {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mCommon.requestSync(IPC_GRAPH_ADD_KEY);
-+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+status_t GraphConfigImpl::parse(int cameraId,
-+                                const char *graphDescFile, const char *settingsFile) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenParse(mMemParse.mAddr, mMemParse.mSize,
-+                                       cameraId, graphDescFile, settingsFile);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenParse fails", __func__);
-+
-+    status_t rt = mCommon.requestSync(IPC_GRAPH_PARSE, mMemParse.mHandle);
-+    CheckError(!rt, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+void GraphConfigImpl::releaseGraphNodes() {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mCommon.requestSync(IPC_GRAPH_RELEASE_NODES);
-+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+status_t GraphConfigImpl::configStreams(const vector<HalStream*> &activeStreams) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    GraphBaseInfo info = {mCameraId, mConfigMode};
-+    bool ret = mIpc.clientFlattenConfigStreams(mMemConfig.mAddr, mMemConfig.mSize,
-+                                               info, mType, activeStreams);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenConfigStreams fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_GRAPH_CONFIG_STREAMS, mMemConfig.mHandle);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getGraphConfigData(IGraphType::GraphConfigData *data) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    GraphBaseInfo info = {mCameraId, mConfigMode};
-+    bool ret = mIpc.clientFlattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, info);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetGraphData fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_GRAPH_GET_CONFIG_DATA, mMemGetData.mHandle);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenGetGraphData(mMemGetData.mAddr, mMemGetData.mSize, data);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnflattenGetGraphData fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::pipelineGetConnections(
-+        const std::vector<std::string> &pgList,
-+        std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+        std::vector<IGraphType::PipelineConnection> *confVector) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    GraphBaseInfo info = {mCameraId, mConfigMode};
-+    bool ret = mIpc.clientFlattenGetConnection(mMemGetConnection.mAddr,
-+                                               mMemGetConnection.mSize, info, pgList);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetConnection fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_GRAPH_GET_CONNECTION, mMemGetConnection.mHandle);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnFlattenGetConnection(mMemGetConnection.mAddr,
-+                                            mMemGetConnection.mSize, scalerInfo, confVector);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetConnection fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getPgIdForKernel(const uint32_t streamId,
-+                                           const int32_t kernelId, int32_t *pgId) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    GraphBaseInfo info = {mCameraId, mConfigMode};
-+    bool ret = mIpc.clientFlattenGetPgId(mMemGetPgId.mAddr,
-+                                         mMemGetPgId.mSize, info, streamId, kernelId);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientFlattenGetPgId fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_GRAPH_GET_PG_ID, mMemGetPgId.mHandle);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnFlattenGetPgId(mMemGetPgId.mAddr, mMemGetPgId.mSize, pgId);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, clientUnFlattenGetPgId fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigImpl::getProgramGroup(std::string pgName,
-+                                          ia_isp_bxt_program_group *programGroup) {
-+    // TODO: Add this API support in the future.
-+    LOGIPC("@%s", __func__);
-+    return OK;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
-new file mode 100644
-index 000000000000..086386332d42
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/GraphConfigImpl.h
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <utility>
-+#include <vector>
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Thread.h"
-+
-+#include "src/platformdata/CameraTypes.h"
-+#include "src/platformdata/gc/IGraphConfig.h"
-+#include "src/platformdata/gc/HalStream.h"
-+#include "modules/sandboxing/IPCGraphConfig.h"
-+#include "IntelAlgoCommon.h"
-+
-+namespace icamera {
-+
-+class GraphConfigImpl {
-+ public:
-+    GraphConfigImpl();
-+    GraphConfigImpl(int32_t camId, ConfigMode mode, GraphSettingType type);
-+    virtual ~GraphConfigImpl();
-+
-+    void addCustomKeyMap();
-+    status_t parse(int cameraId, const char *graphDescFile, const char *settingsFile);
-+    void releaseGraphNodes();
-+
-+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
-+    status_t getGraphConfigData(IGraphType::GraphConfigData *data);
-+
-+    int getProgramGroup(std::string pgName,
-+                        ia_isp_bxt_program_group *programGroupForPG);
-+    status_t getPgIdForKernel(const uint32_t streamId,
-+                              const int32_t kernelId, int32_t *pgId);
-+
-+    status_t pipelineGetConnections(const std::vector<std::string> &pgList,
-+                                    std::vector<IGraphType::ScalerInfo> *scalerInfo,
-+                                    std::vector<IGraphType::PipelineConnection> *confVector);
-+
-+ private:
-+    IPCGraphConfig mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    ShmMemInfo mMemParse;
-+    ShmMemInfo mMemConfig;
-+    ShmMemInfo mMemGetData;
-+    ShmMemInfo mMemGetPgId;
-+    ShmMemInfo mMemGetConnection;
-+
-+    std::vector<ShmMem> mMems;
-+
-+    int mCameraId;
-+    ConfigMode mConfigMode;
-+    GraphSettingType mType;
-+    bool mInitialized;
-+
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfigImpl);
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
-new file mode 100644
-index 000000000000..ff8ce077fc6a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.cpp
-@@ -0,0 +1,317 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAiq"
-+
-+#include "modules/sandboxing/client/IntelAiq.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelAiq::IntelAiq() {
-+    LOG1("@%s", __func__);
-+
-+    mAiq = reinterpret_cast<uintptr_t>(nullptr);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string deinitName = "/aiqDeinitShm" + std::to_string(personal) + "Shm";
-+    std::string aeName = "/aiqAeShm" + std::to_string(personal) + "Shm";
-+    std::string afName = "/aiqAfShm" + std::to_string(personal) + "Shm";
-+    std::string awbName = "/aiqAwbShm" + std::to_string(personal) + "Shm";
-+    std::string gbceName = "/aiqGbceShm" + std::to_string(personal) + "Shm";
-+    std::string aiqdName = "/aiqAiqdShm" + std::to_string(personal) + "Shm";
-+    std::string paName = "/aiqPaShm" + std::to_string(personal) + "Shm";
-+    std::string saName = "/aiqSaShm" + std::to_string(personal) + "Shm";
-+    std::string statName = "/aiqStatShm" + std::to_string(personal) + "Shm";
-+    std::string versionName = "/aiqVersionShm" + std::to_string(personal) + "Shm";
-+
-+    mMems = {
-+        {deinitName.c_str(), sizeof(aiq_deinit_params), &mMemDeinit, false},
-+        {aeName.c_str(), sizeof(ae_run_params), &mMemAe, false},
-+        {afName.c_str(), sizeof(af_run_params), &mMemAf, false},
-+        {awbName.c_str(), sizeof(awb_run_params), &mMemAwb, false},
-+        {gbceName.c_str(), sizeof(gbce_run_params), &mMemGbce, false},
-+        {aiqdName.c_str(), sizeof(ia_binary_data_params), &mMemAiqd, false},
-+        {paName.c_str(), sizeof(pa_run_v1_params), &mMemPa, false},
-+        {saName.c_str(), sizeof(sa_run_v2_params), &mMemSa, false},
-+        {statName.c_str(), sizeof(set_statistics_set_v4_params), &mMemStat, false},
-+        {versionName.c_str(), sizeof(ia_aiq_version_params), &mMemVersion, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOG1("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelAiq::~IntelAiq() {
-+    LOG1("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+ia_aiq* IntelAiq::init(const ia_binary_data* aiqbData,
-+                       const ia_binary_data* nvmData,
-+                       const ia_binary_data* aiqdData,
-+                       unsigned int statsMaxWidth,
-+                       unsigned int statsMaxHeight,
-+                       unsigned int maxNumStatsIn,
-+                       ia_cmc_t* cmc,
-+                       ia_mkn* mkn) {
-+    LOG1("@%s, aiqbData:%p, nvmData:%p, aiqdData:%p", __func__, aiqbData, nvmData, aiqdData);
-+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    unsigned int aiqbSize = aiqbData ? aiqbData->size : 0;
-+    unsigned int nvmSize = nvmData ? nvmData->size : 0;
-+    unsigned int aiqdSize = aiqdData ? aiqdData->size : 0;
-+    unsigned int size = sizeof(aiq_init_params) + aiqbSize + nvmSize + aiqdSize;
-+    LOG2("@%s, aiqbSize:%d, nvmSize:%d, aiqdSize:%d", __func__, aiqbSize, nvmSize, aiqdSize);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string initName = "/aiqInitShm" + std::to_string(personal) + "Shm";
-+    ShmMemInfo shm;
-+    shm.mName = initName.c_str();
-+    shm.mSize = size;
-+    bool ret = mCommon.allocShmMem(shm.mName, shm.mSize, &shm);
-+    CheckError(!ret, nullptr, "@%s, allocShmMem fails", __func__);
-+
-+    ret = mIpc.clientFlattenInit(aiqbData, nvmData, aiqdData,
-+                                 statsMaxWidth, statsMaxHeight, maxNumStatsIn,
-+                                 reinterpret_cast<uintptr_t>(cmc),
-+                                 reinterpret_cast<uintptr_t>(mkn),
-+                                 static_cast<uint8_t*>(shm.mAddr), size);
-+    CheckError(!ret, nullptr, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_INIT, shm.mHandle);
-+    CheckError(!ret, nullptr, "@%s, requestSync fails", __func__);
-+
-+    aiq_init_params* params = static_cast<aiq_init_params*>(shm.mAddr);
-+    mAiq = params->results;
-+    LOG2("@%s, success, aiq:%p\n", __func__, reinterpret_cast<ia_aiq*>(mAiq));
-+
-+    mCommon.freeShmMem(shm);
-+
-+    return reinterpret_cast<ia_aiq*>(mAiq);
-+}
-+
-+ia_err IntelAiq::aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    ae_run_params* params = static_cast<ae_run_params*>(mMemAe.mAddr);
-+
-+    bool ret = mIpc.clientFlattenAe(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAe fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_AE_RUN, mMemAe.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenAe(params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAe fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    af_run_params* params = static_cast<af_run_params*>(mMemAf.mAddr);
-+
-+    bool ret = mIpc.clientFlattenAf(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAf fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_AF_RUN, mMemAf.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenAf(*params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAf fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    awb_run_params* params = static_cast<awb_run_params*>(mMemAwb.mAddr);
-+
-+    bool ret = mIpc.clientFlattenAwb(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenAwb fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_AWB_RUN, mMemAwb.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenAwb(*params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenAwb fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::gbceRun(const ia_aiq_gbce_input_params* inputParams,
-+                         ia_aiq_gbce_results** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    gbce_run_params* params = static_cast<gbce_run_params*>(mMemGbce.mAddr);
-+
-+    bool ret = mIpc.clientFlattenGbce(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenGbce fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_GBCE_RUN, mMemGbce.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenGbce(params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenGbce fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::paRunV1(const ia_aiq_pa_input_params* inputParams,
-+                         ia_aiq_pa_results_v1** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(mMemPa.mAddr);
-+
-+    bool ret = mIpc.clientFlattenPaV1(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenPaV1 fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_PA_RUN_V1, mMemPa.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenPaV1(params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenPaV1 fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::saRunV2(const ia_aiq_sa_input_params_v1* inputParams,
-+                         ia_aiq_sa_results_v1** results) {
-+    LOG1("@%s, inputParams:%p, results:%p", __func__, inputParams, results);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!results, ia_err_argument, "@%s, results is nullptr", __func__);
-+
-+    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(mMemSa.mAddr);
-+
-+    bool ret = mIpc.clientFlattenSaV2(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenSaV2 fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_SA_RUN_V2, mMemSa.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenSaV2(params, results);
-+    CheckError(!ret, ia_err_general, "@%s, clientUnflattenSaV2 fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams) {
-+    LOG1("@%s, inputParams:%p", __func__, inputParams);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_argument, "@%s, inputParams is nullptr", __func__);
-+
-+    set_statistics_set_v4_params* params =
-+        static_cast<set_statistics_set_v4_params*>(mMemStat.mAddr);
-+
-+    bool ret = mIpc.clientFlattenStatSetV4(mAiq, *inputParams, params);
-+    CheckError(!ret, ia_err_general, "@%s, clientFlattenStatSetV4 fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_AIQ_STATISTICS_SET_V4, mMemStat.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelAiq::getAiqdData(ia_binary_data* outData) {
-+    LOG1("@%s, outData:%p", __func__, outData);
-+    CheckError(!mInitialized, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, ia_err_general,
-+               "@%s, mAiq is nullptr", __func__);
-+    CheckError(!outData, ia_err_argument, "@%s, outData is nullptr", __func__);
-+
-+    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(mMemAiqd.mAddr);
-+
-+    params->aiq_handle = mAiq;
-+
-+    int ret = mCommon.requestSync(IPC_AIQ_GET_AIQD_DATA, mMemAiqd.mHandle);
-+    CheckError(!ret, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    outData->data = params->data;
-+    outData->size = params->size;
-+
-+    return ia_err_none;
-+}
-+
-+void IntelAiq::deinit() {
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE,
-+               "@%s, mAiq is nullptr", __func__);
-+
-+    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(mMemDeinit.mAddr);
-+    params->aiq_handle = mAiq;
-+
-+    int ret = mCommon.requestSync(IPC_AIQ_DEINIT, mMemDeinit.mHandle);
-+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
-+
-+    mAiq = reinterpret_cast<uintptr_t>(nullptr);
-+}
-+
-+void IntelAiq::getVersion(std::string* version) {
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(reinterpret_cast<ia_aiq*>(mAiq) == nullptr, VOID_VALUE,
-+               "@%s, mAiq is nullptr", __func__);
-+
-+    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(mMemVersion.mAddr);
-+    params->aiq_handle = mAiq;
-+
-+    int ret = mCommon.requestSync(IPC_AIQ_GET_VERSION, mMemVersion.mHandle);
-+    CheckError(!ret, VOID_VALUE, "@%s, requestSync fails", __func__);
-+
-+    *version = params->data;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
-new file mode 100644
-index 000000000000..ca02d5c4dcf1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAiq.h
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_aiq.h>
-+#include <ia_types.h>
-+
-+#include <string>
-+#include <vector>
-+
-+#include "modules/sandboxing/client/IntelAlgoCommon.h"
-+#include "modules/sandboxing/IPCIntelAiq.h"
-+
-+namespace icamera {
-+class IntelAiq {
-+ public:
-+    IntelAiq();
-+    virtual ~IntelAiq();
-+
-+    ia_aiq* init(const ia_binary_data* aiqbData,
-+                 const ia_binary_data* nvmData,
-+                 const ia_binary_data* aiqdData,
-+                 unsigned int statsMaxWidth,
-+                 unsigned int statsMaxHeight,
-+                 unsigned int maxNumStatsIn,
-+                 ia_cmc_t* cmc,
-+                 ia_mkn* mkn);
-+    ia_err aeRun(const ia_aiq_ae_input_params* inputParams, ia_aiq_ae_results** results);
-+    ia_err afRun(const ia_aiq_af_input_params* inputParams, ia_aiq_af_results** results);
-+    ia_err awbRun(const ia_aiq_awb_input_params* inputParams, ia_aiq_awb_results** results);
-+    ia_err gbceRun(const ia_aiq_gbce_input_params* inputParams, ia_aiq_gbce_results** results);
-+    ia_err paRunV1(const ia_aiq_pa_input_params* inputParams, ia_aiq_pa_results_v1** results);
-+    ia_err saRunV2(const ia_aiq_sa_input_params_v1* inputParams, ia_aiq_sa_results_v1** results);
-+    ia_err statisticsSetV4(const ia_aiq_statistics_input_params_v4* inputParams);
-+    ia_err getAiqdData(ia_binary_data* outData);
-+    void deinit();
-+    void getVersion(std::string* version);
-+
-+ private:
-+    IPCIntelAiq mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    uintptr_t mAiq;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemDeinit;
-+    ShmMemInfo mMemAe;
-+    ShmMemInfo mMemAf;
-+    ShmMemInfo mMemAwb;
-+    ShmMemInfo mMemGbce;
-+    ShmMemInfo mMemAiqd;
-+    ShmMemInfo mMemPa;
-+    ShmMemInfo mMemSa;
-+    ShmMemInfo mMemStat;
-+    ShmMemInfo mMemVersion;
-+
-+    std::vector<ShmMem> mMems;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
-new file mode 100644
-index 000000000000..929018532d40
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.cpp
-@@ -0,0 +1,385 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAlgoClient"
-+
-+#include "modules/sandboxing/client/IntelAlgoClient.h"
-+
-+#include <sys/types.h>
-+#include <sys/mman.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+
-+#include <memory>
-+#include <string>
-+#include <vector>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+IntelAlgoClient::IntelAlgoClient():
-+    mErrCb(nullptr),
-+    mIPCStatus(true),
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    mCallback = base::Bind(&IntelAlgoClient::callbackHandler, base::Unretained(this));
-+    IntelAlgoClient::return_callback = returnCallback;
-+
-+    mNotifyCallback = base::Bind(&IntelAlgoClient::notifyHandler, base::Unretained(this));
-+    IntelAlgoClient::notify = notifyCallback;
-+
-+    mBridge = cros::CameraAlgorithmBridge::CreateInstance(cros::CameraAlgorithmBackend::kVendorCpu);
-+    CheckError(!mBridge, VOID_VALUE, "@%s, mBridge is nullptr", __func__);
-+    CheckError(mBridge->Initialize(this) != 0, VOID_VALUE, "@%s, mBridge init fails", __func__);
-+
-+    for (int i = 0; i < IPC_GROUP_NUM; i++) {
-+        mRunner[i] = std::unique_ptr<Runner>(new Runner(static_cast<IPC_GROUP>(i), mBridge.get()));
-+    }
-+
-+    mInitialized = true;
-+}
-+
-+IntelAlgoClient::~IntelAlgoClient() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IntelAlgoClient::isInitialized() {
-+    LOGIPC("@%s, mInitialized:%d", __func__, mInitialized);
-+
-+    return mInitialized;
-+}
-+
-+bool IntelAlgoClient::isIPCFine() {
-+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
-+    LOGIPC("@%s, mIPCStatus:%d", __func__, mIPCStatus);
-+
-+    return mIPCStatus;
-+}
-+
-+void IntelAlgoClient::registerErrorCallback(const camera_callback_ops_t* errCb) {
-+    LOGIPC("@%s, errCb:%p", __func__, errCb);
-+
-+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
-+    mErrCb = errCb;
-+
-+    if (!mIPCStatus && mErrCb) {
-+        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
-+        mErrCb->notify(mErrCb, data);
-+    }
-+}
-+
-+int IntelAlgoClient::allocateShmMem(const std::string& name, int size, int* fd, void** addr) {
-+    LOGIPC("@%s, name:%s, size:%d", __func__, name.c_str(), size);
-+
-+    *fd = -1;
-+    *addr = nullptr;
-+    int shmFd = -1;
-+    void* shmAddr = nullptr;
-+
-+    shmFd = shm_open(name.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
-+    CheckError((shmFd == -1), UNKNOWN_ERROR, "@%s, call shm_open fail", __func__);
-+
-+    do {
-+        int ret = fcntl(shmFd, F_GETFD);
-+        if (ret == -1) {
-+            LOGE("@%s, call fcntl fail, error %s", __func__, strerror(errno));
-+            break;
-+        }
-+
-+        ret = ftruncate(shmFd, size);
-+        if (ret == -1) {
-+            LOGE("@%s, call ftruncate fail, error %s", __func__, strerror(errno));
-+            break;
-+        }
-+
-+        struct stat sb;
-+        ret = fstat(shmFd, &sb);
-+        if (ret == -1) {
-+            LOGE("@%s, call fstat fail, error %s", __func__, strerror(errno));
-+            break;
-+        }
-+
-+        shmAddr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, shmFd, 0);
-+        if (!shmAddr) {
-+            LOGE("@%s, call mmap fail, error %s", __func__, strerror(errno));
-+            break;
-+        }
-+
-+        *fd = shmFd;
-+        *addr = shmAddr;
-+
-+        return OK;
-+    } while (0);
-+
-+    close(shmFd);
-+    return UNKNOWN_ERROR;
-+}
-+
-+void IntelAlgoClient::releaseShmMem(const std::string& name, int size, int fd, void* addr) {
-+    LOGIPC("@%s, name:%s, size:%d, fd:%d, addr:%p", __func__, name.c_str(), size, fd, addr);
-+
-+    munmap(addr, size);
-+    close(fd);
-+    shm_unlink(name.c_str());
-+}
-+
-+int IntelAlgoClient::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
-+    LOGIPC("@%s, cmd:%d:%s, bufferHandle:%d, mInitialized:%d",
-+         __func__, cmd, IntelAlgoIpcCmdToString(cmd), bufferHandle, mInitialized);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+    CheckError(!isIPCFine(), UNKNOWN_ERROR, "@%s, IPC error happens", __func__);
-+
-+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(cmd);
-+
-+    return mRunner[group]->requestSync(cmd, bufferHandle);
-+}
-+
-+int IntelAlgoClient::requestSync(IPC_CMD cmd) {
-+    return requestSync(cmd, -1);
-+}
-+
-+int32_t IntelAlgoClient::registerBuffer(int bufferFd, void* addr) {
-+    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
-+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
-+    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
-+
-+    int32_t handle = mBridge->RegisterBuffer(bufferFd);
-+    if (handle >= 0) {
-+        std::lock_guard<std::mutex> l(mShmMapMutex);
-+        mShmMap[addr] = handle;
-+    }
-+    return handle;
-+}
-+
-+void IntelAlgoClient::deregisterBuffer(int32_t bufferHandle) {
-+    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
-+
-+    {
-+        std::lock_guard<std::mutex> l(mShmMapMutex);
-+        for (auto &item : mShmMap) {
-+            if (item.second == bufferHandle) {
-+                mShmMap.erase(item.first);
-+                break;
-+            }
-+        }
-+    }
-+    std::vector<int32_t> handles({bufferHandle});
-+    mBridge->DeregisterBuffers(handles);
-+}
-+
-+int32_t IntelAlgoClient::registerGbmBuffer(int bufferFd) {
-+    LOGIPC("@%s, bufferFd:%d, mInitialized:%d", __func__, bufferFd, mInitialized);
-+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
-+    CheckError(!isIPCFine(), -1, "@%s, IPC error happens", __func__);
-+
-+    return mBridge->RegisterBuffer(bufferFd);
-+}
-+
-+void IntelAlgoClient::deregisterGbmBuffer(int32_t bufferHandle) {
-+    LOGIPC("@%s, bufferHandle:%d, mInitialized:%d", __func__, bufferHandle, mInitialized);
-+    CheckError(!mInitialized, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(!isIPCFine(), VOID_VALUE, "@%s, IPC error happens", __func__);
-+
-+    std::vector<int32_t> handles({bufferHandle});
-+    mBridge->DeregisterBuffers(handles);
-+}
-+
-+int32_t IntelAlgoClient::getBufferHandle(void* addr) {
-+    CheckError(!mInitialized, -1, "@%s, mInitialized is false", __func__);
-+    if (!addr) return -1;
-+
-+    std::lock_guard<std::mutex> l(mShmMapMutex);
-+    CheckError(mShmMap.find(addr) == mShmMap.end(), -1, "%s, Invalid client addr", __func__);
-+    return mShmMap[addr];
-+}
-+
-+void IntelAlgoClient::callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle) {
-+    LOGIPC("@%s, req_id:%d, status:%d, buffer_handle:%d",
-+         __func__, req_id, status, buffer_handle);
-+
-+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
-+    mRunner[group]->callbackHandler(status, buffer_handle);
-+}
-+
-+void IntelAlgoClient::notifyHandler(uint32_t msg) {
-+    LOGIPC("@%s, msg:%d", __func__, msg);
-+
-+    if (msg != CAMERA_ALGORITHM_MSG_IPC_ERROR) {
-+        LOGE("@%s, receive msg:%d, not CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__, msg);
-+        return;
-+    }
-+
-+    std::lock_guard<std::mutex> l(mIPCStatusMutex);
-+    mIPCStatus = false;
-+
-+    if (mErrCb) {
-+        camera_msg_data_t data = {CAMERA_IPC_ERROR, {0}};
-+        mErrCb->notify(mErrCb, data);
-+    } else {
-+        LOGE("@%s, mErrCb is nullptr, no device error is sent out", __func__);
-+    }
-+    LOGE("@%s, receive CAMERA_ALGORITHM_MSG_IPC_ERROR", __func__);
-+}
-+
-+void IntelAlgoClient::returnCallback(const camera_algorithm_callback_ops_t* callback_ops,
-+                                     uint32_t req_id,
-+                                     uint32_t status,
-+                                     int32_t buffer_handle) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
-+
-+    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
-+    s->callbackHandler(req_id, status, buffer_handle);
-+}
-+
-+void IntelAlgoClient::notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
-+                                     camera_algorithm_error_msg_code_t msg) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!callback_ops, VOID_VALUE, "@%s, callback_ops is nullptr", __func__);
-+
-+    auto s = const_cast<IntelAlgoClient*>(static_cast<const IntelAlgoClient*>(callback_ops));
-+    s->notifyHandler((uint32_t)msg);
-+}
-+
-+IntelAlgoClient::Runner::Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge):
-+    mGroup(group),
-+    mBridge(bridge),
-+    mIsCallbacked(false),
-+    mCbResult(true),
-+    mInitialized(false) {
-+    LOGIPC("@%s, group:%d", __func__, mGroup);
-+
-+    pthread_condattr_t attr;
-+    int ret = pthread_condattr_init(&attr);
-+    if (ret != 0) {
-+        LOGE("@%s, call pthread_condattr_init fails, ret:%d", __func__, ret);
-+        pthread_condattr_destroy(&attr);
-+        return;
-+    }
-+
-+    ret = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
-+    if (ret != 0) {
-+        LOGE("@%s, call pthread_condattr_setclock fails, ret:%d", __func__, ret);
-+        pthread_condattr_destroy(&attr);
-+        return;
-+    }
-+
-+    ret = pthread_cond_init(&mCbCond, &attr);
-+    if (ret != 0) {
-+        LOGE("@%s, call pthread_cond_init fails, ret:%d", __func__, ret);
-+        pthread_condattr_destroy(&attr);
-+        return;
-+    }
-+
-+    pthread_condattr_destroy(&attr);
-+
-+    ret = pthread_mutex_init(&mCbLock, nullptr);
-+    CheckError(ret != 0, VOID_VALUE, "@%s, call pthread_mutex_init fails, ret:%d", __func__, ret);
-+
-+    mInitialized = true;
-+}
-+
-+IntelAlgoClient::Runner::~Runner() {
-+    LOGIPC("@%s, group:%d", __func__, mGroup);
-+
-+    int ret = pthread_cond_destroy(&mCbCond);
-+    if (ret != 0) {
-+        LOGE("@%s, call pthread_cond_destroy fails, ret:%d", __func__, ret);
-+    }
-+
-+    ret = pthread_mutex_destroy(&mCbLock);
-+    if (ret != 0) {
-+        LOGE("@%s, call pthread_mutex_destroy fails, ret:%d", __func__, ret);
-+    }
-+}
-+
-+int IntelAlgoClient::Runner::requestSync(IPC_CMD cmd, int32_t bufferHandle) {
-+    LOGIPC("@%s, cmd:%d:%s, group:%d, bufferHandle:%d, mInitialized:%d",
-+          __func__, cmd, IntelAlgoIpcCmdToString(cmd), mGroup, bufferHandle, mInitialized);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    std::lock_guard<std::mutex> lck(mMutex);
-+
-+    std::vector<uint8_t> reqHeader(IPC_REQUEST_HEADER_USED_NUM);
-+    reqHeader[0] = IPC_MATCHING_KEY;
-+
-+    // cmd is for request id, no duplicate command will be issued at any given time.
-+    mBridge->Request(cmd, reqHeader, bufferHandle);
-+    int ret = waitCallback();
-+    CheckError((ret != OK), UNKNOWN_ERROR, "@%s, call waitCallback fail", __func__);
-+
-+    LOGIPC("@%s, cmd:%d:%s, group:%d, mCbResult:%d, done!",
-+          __func__, cmd, IntelAlgoIpcCmdToString(cmd), mGroup, mCbResult);
-+
-+    // check callback result
-+    CheckError((mCbResult != true), UNKNOWN_ERROR, "@%s, callback fail", __func__);
-+
-+    return OK;
-+}
-+
-+void IntelAlgoClient::Runner::callbackHandler(uint32_t status, int32_t buffer_handle) {
-+    LOGIPC("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
-+    if (status != 0) {
-+        LOGE("@%s, group:%d, status:%d, buffer_handle:%d", __func__, mGroup, status, buffer_handle);
-+    }
-+    mCbResult = status != 0 ? false : true;
-+
-+    pthread_mutex_lock(&mCbLock);
-+    mIsCallbacked = true;
-+    int ret = pthread_cond_signal(&mCbCond);
-+    pthread_mutex_unlock(&mCbLock);
-+
-+    CheckError(ret != 0, VOID_VALUE,
-+               "@%s, group:%d, call pthread_cond_signal fails, ret:%d", __func__, mGroup, ret);
-+}
-+
-+int IntelAlgoClient::Runner::waitCallback() {
-+    LOGIPC("@%s, group:%d", __func__, mGroup);
-+
-+    nsecs_t startTime = CameraUtils::systemTime();
-+
-+    pthread_mutex_lock(&mCbLock);
-+    if (!mIsCallbacked) {
-+        int ret = 0;
-+        struct timespec ts = {0, 0};
-+        clock_gettime(CLOCK_MONOTONIC, &ts);
-+        ts.tv_sec += 5;  // 5s timeout
-+
-+        while (!mIsCallbacked && !ret) {
-+            ret = pthread_cond_timedwait(&mCbCond, &mCbLock, &ts);
-+        }
-+        if (ret != 0) {
-+            LOGE("@%s, group:%d, call pthread_cond_timedwait fail, ret:%d, it takes %" PRId64 "ms",
-+                  __func__, mGroup, ret, (CameraUtils::systemTime() - startTime) / 1000000);
-+            pthread_mutex_unlock(&mCbLock);
-+            return UNKNOWN_ERROR;
-+        }
-+    }
-+    mIsCallbacked = false;
-+    pthread_mutex_unlock(&mCbLock);
-+
-+    LOGIPC("@%s: group:%d, it takes %" PRId64 "ms", __func__,
-+          mGroup, (CameraUtils::systemTime() - startTime) / 1000000);
-+
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
-new file mode 100644
-index 000000000000..cb536faacd7e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoClient.h
-@@ -0,0 +1,116 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <pthread.h>
-+
-+#include <mutex>
-+#include <memory>
-+#include <string>
-+#include <unordered_map>
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "cros-camera/camera_algorithm_bridge.h"
-+#include "base/bind.h"
-+#include "base/callback.h"
-+#include "CameraLog.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+class IntelAlgoClient : public camera_algorithm_callback_ops_t {
-+ public:
-+    IntelAlgoClient();
-+    virtual ~IntelAlgoClient();
-+
-+    bool isInitialized();
-+    bool isIPCFine();
-+
-+    // when IPC error happens, device error
-+    // will be sent out via the camera_callback_ops_t which belongs to CameraHal.
-+    // before the CameraHal be terminated, set nullptr in the function.
-+    void registerErrorCallback(const camera_callback_ops_t* errCb);
-+
-+    int allocateShmMem(const std::string& name, int size, int* fd, void** addr);
-+    void releaseShmMem(const std::string& name, int size, int fd, void* addr);
-+
-+    int requestSync(IPC_CMD cmd, int32_t bufferHandle);
-+    int requestSync(IPC_CMD cmd);
-+
-+    int32_t registerBuffer(int bufferFd, void* addr);
-+    void deregisterBuffer(int32_t bufferHandle);
-+    int32_t registerGbmBuffer(int bufferFd);
-+    void deregisterGbmBuffer(int32_t bufferHandle);
-+    int32_t getBufferHandle(void* addr);
-+
-+ private:
-+    int waitCallback();
-+
-+    void callbackHandler(uint32_t req_id, uint32_t status, int32_t buffer_handle);
-+    void notifyHandler(uint32_t msg);
-+
-+    // when the request is done, the callback will be received.
-+    static void returnCallback(const camera_algorithm_callback_ops_t* callback_ops,
-+                               uint32_t req_id,
-+                               uint32_t status,
-+                               int32_t buffer_handle);
-+    // when IPC error happens in the bridge, notifyCallback will be called.
-+    static void notifyCallback(const struct camera_algorithm_callback_ops* callback_ops,
-+                               camera_algorithm_error_msg_code_t msg);
-+
-+ private:
-+    const camera_callback_ops_t* mErrCb;
-+
-+    std::unique_ptr<cros::CameraAlgorithmBridge> mBridge;
-+
-+    base::Callback<void(uint32_t, uint32_t, int32_t)> mCallback;
-+    base::Callback<void(uint32_t)> mNotifyCallback;
-+    bool mIPCStatus;  // true: no error happens, false: error happens
-+    std::mutex mIPCStatusMutex;  // the mutex for mIPCStatus
-+
-+    std::unordered_map<void*, int32_t> mShmMap;  // <addr in client, server handle in server>
-+    std::mutex mShmMapMutex;  // the mutex for mShmMap
-+
-+    bool mInitialized;
-+
-+ private:
-+    class Runner {
-+     public:
-+        Runner(IPC_GROUP group, cros::CameraAlgorithmBridge* bridge);
-+        virtual ~Runner();
-+        int requestSync(IPC_CMD cmd, int32_t bufferHandle);
-+        void callbackHandler(uint32_t status, int32_t buffer_handle);
-+
-+     private:
-+        int waitCallback();
-+
-+     private:
-+        IPC_GROUP mGroup;
-+        cros::CameraAlgorithmBridge* mBridge;
-+        pthread_mutex_t mCbLock;
-+        pthread_cond_t mCbCond;
-+        bool mIsCallbacked;
-+        bool mCbResult;  // true: success, false: fail
-+
-+        bool mInitialized;
-+
-+        std::mutex mMutex;  // the mutex for the public method
-+    };
-+
-+    std::unique_ptr<Runner> mRunner[IPC_GROUP_NUM];
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
-new file mode 100644
-index 000000000000..f1a1d4c1553d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
-@@ -0,0 +1,125 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAlgoCommon"
-+
-+#include "modules/sandboxing/client/IntelAlgoCommon.h"
-+
-+#include "CameraLog.h"
-+#include "PlatformData.h"
-+#include <string>
-+#include <vector>
-+
-+namespace icamera {
-+IntelAlgoCommon::IntelAlgoCommon() {
-+    LOGIPC("@%s", __func__);
-+
-+    mClient = PlatformData::getIntelAlgoClient();
-+    LOGIPC("@%s, mClient:%p", __func__, mClient);
-+}
-+
-+IntelAlgoCommon::~IntelAlgoCommon() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+bool IntelAlgoCommon::allocShmMem(const std::string& name, int size, ShmMemInfo* shm) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
-+
-+    shm->mName = name;
-+    shm->mSize = size;
-+    int ret = mClient->allocateShmMem(shm->mName, shm->mSize, &shm->mFd, &shm->mAddr);
-+    CheckError((ret != OK), false, "@%s, call allocateShmMem fail", __func__);
-+
-+    shm->mHandle = mClient->registerBuffer(shm->mFd, shm->mAddr);
-+    CheckError((shm->mHandle < 0), false, "@%s, call mBridge->RegisterBuffer fail", __func__);
-+
-+    return true;
-+}
-+
-+int32_t IntelAlgoCommon::registerGbmBuffer(int bufferFd) {
-+    LOGIPC("@%s, bufferFd:%d", __func__, bufferFd);
-+    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
-+
-+    return mClient->registerGbmBuffer(bufferFd);
-+}
-+
-+void IntelAlgoCommon::deregisterGbmBuffer(int32_t bufferHandle) {
-+    LOGIPC("@%s, bufferHandle:%d", __func__, bufferHandle);
-+    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
-+
-+    mClient->deregisterGbmBuffer(bufferHandle);
-+}
-+
-+bool IntelAlgoCommon::requestSync(IPC_CMD cmd, int32_t handle) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
-+
-+    return mClient->requestSync(cmd, handle) == OK ? true : false;
-+}
-+
-+bool IntelAlgoCommon::requestSync(IPC_CMD cmd) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(mClient == nullptr, false, "@%s, mClient is nullptr", __func__);
-+
-+    return mClient->requestSync(cmd) == OK ? true : false;
-+}
-+
-+void IntelAlgoCommon::freeShmMem(const ShmMemInfo& shm) {
-+    LOGIPC("@%s, mHandle:%d, mFd:%d, mName:%s, mSize:%d, mAddr:%p",
-+        __func__, shm.mHandle, shm.mFd, shm.mName.c_str(), shm.mSize, shm.mAddr);
-+    CheckError(mClient == nullptr, VOID_VALUE, "@%s, mClient is nullptr", __func__);
-+    if (shm.mHandle < 0 || shm.mFd < 0) {
-+        LOGE("@%s, mHandle:%d, mFd:%d, one of them < 0", __func__, shm.mHandle, shm.mFd);
-+        return;
-+    }
-+
-+    mClient->deregisterBuffer(shm.mHandle);
-+    mClient->releaseShmMem(shm.mName, shm.mSize, shm.mFd, shm.mAddr);
-+}
-+
-+bool IntelAlgoCommon::allocateAllShmMems(std::vector<ShmMem>* mems) {
-+    LOGIPC("@%s", __func__);
-+
-+    for (auto& it : *mems) {
-+        ShmMemInfo* mem = it.mem;
-+        mem->mName = it.name;
-+        mem->mSize = it.size;
-+        bool ret = allocShmMem(mem->mName, mem->mSize, mem);
-+        CheckError(!ret, false, "@%s, allocShmMem fails, name:%s, size:%d", __func__,
-+                   mem->mName.c_str(), mem->mSize);
-+        it.allocated = true;
-+    }
-+
-+    return true;
-+}
-+
-+void IntelAlgoCommon::releaseAllShmMems(const std::vector<ShmMem>& mems) {
-+    LOGIPC("@%s", __func__);
-+
-+    for (auto& it : mems) {
-+        if (it.allocated) {
-+            freeShmMem(*it.mem);
-+        }
-+    }
-+}
-+
-+int32_t IntelAlgoCommon::getShmMemHandle(void* addr) {
-+    CheckError(mClient == nullptr, -1, "@%s, mClient is nullptr", __func__);
-+    return mClient->getBufferHandle(addr);
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
-new file mode 100644
-index 000000000000..43c9d47bea84
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.h
-@@ -0,0 +1,67 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "IntelAlgoClient.h"
-+
-+#include <string>
-+#include <vector>
-+
-+namespace icamera {
-+typedef struct ShmMemInfo {
-+    std::string mName;
-+    int mSize;
-+    int mFd;
-+    void* mAddr;
-+    int32_t mHandle;
-+    ShmMemInfo():
-+        mName(""),
-+        mSize(0),
-+        mFd(-1),
-+        mAddr(nullptr),
-+        mHandle(-1) {}
-+}ShmMemInfo;
-+
-+typedef struct ShmMem {
-+    std::string name;
-+    int size;
-+    ShmMemInfo* mem;
-+    bool allocated;
-+} ShmMem;
-+
-+class IntelAlgoCommon {
-+ public:
-+    IntelAlgoCommon();
-+    virtual ~IntelAlgoCommon();
-+
-+    bool allocShmMem(const std::string& name, int size, ShmMemInfo* shm);
-+    int32_t registerGbmBuffer(int bufferFd);
-+    void deregisterGbmBuffer(int32_t bufferHandle);
-+    bool requestSync(IPC_CMD cmd, int32_t handle);
-+    bool requestSync(IPC_CMD cmd);
-+    void freeShmMem(const ShmMemInfo& shm);
-+
-+    bool allocateAllShmMems(std::vector<ShmMem>* mems);
-+    void releaseAllShmMems(const std::vector<ShmMem>& mems);
-+
-+    int32_t getShmMemHandle(void* addr);
-+
-+ private:
-+    IntelAlgoClient* mClient;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
-new file mode 100644
-index 000000000000..bfb8f49fd377
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.cpp
-@@ -0,0 +1,108 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelCmc"
-+
-+#include "modules/sandboxing/client/IntelCmc.h"
-+
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IntelCmc::IntelCmc():
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    mHandle = nullptr;
-+    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string initName = "/cmcInit" + std::to_string(personal) + "Shm";
-+    std::string deinitName = "/cmcDeinit" + std::to_string(personal) + "Shm";
-+
-+    mMems = {{initName.c_str(), sizeof(cmc_init_params), &mMemInit, false},
-+             {deinitName.c_str(), sizeof(cmc_deinit_params), &mMemDeinit, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelCmc::~IntelCmc() {
-+    LOGIPC("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+bool IntelCmc::init(const ia_binary_data *aiqbData, const ia_binary_data *nvmData) {
-+    LOGIPC("@%s, aiqbData:%p, nvmData:%p", __func__, aiqbData, nvmData);
-+    CheckError(nvmData, false, "@%s, nvmData should be nullptr", __func__);
-+
-+    CheckError(mInitialized == false, false, "@%s, mInitialized is false", __func__);
-+    CheckError(!aiqbData, false, "@%s, aiqbData is nullptr", __func__);
-+    CheckError(!aiqbData->data, false, "@%s, aiqbData->data is nullptr", __func__);
-+    CheckError(aiqbData->size == 0, false, "@%s, aiqbData->size is 0", __func__);
-+
-+    cmc_init_params *params = static_cast<cmc_init_params*>(mMemInit.mAddr);
-+
-+    bool ret = mIpc.clientFlattenInit(*aiqbData, params);
-+    CheckError(ret == false, false, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_CMC_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, false, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenInit(*params, &mHandle, &mCmcRemoteHandle);
-+    CheckError(ret == false, false, "@%s, clientUnflattenInit fails", __func__);
-+
-+    return true;
-+}
-+
-+ia_cmc_t* IntelCmc::getCmc() const {
-+    LOGIPC("@%s, mHandle:%p", __func__, mHandle);
-+
-+    return mHandle;
-+}
-+
-+uintptr_t IntelCmc::getCmcHandle() const {
-+    LOGIPC("@%s", __func__);
-+
-+    return mCmcRemoteHandle;
-+}
-+
-+void IntelCmc::deinit() {
-+    LOGIPC("@%s, mCmc:%p", __func__, mHandle);
-+
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(!mHandle, VOID_VALUE, "@%s, mHandle is nullptr", __func__);
-+    CheckError(reinterpret_cast<ia_cmc_t*>(mCmcRemoteHandle) == nullptr,
-+               VOID_VALUE, "@%s, mCmcRemoteHandle is nullptr", __func__);
-+
-+    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(mMemDeinit.mAddr);
-+    params->cmc_handle = mCmcRemoteHandle;
-+
-+    bool ret = mCommon.requestSync(IPC_CMC_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+    mHandle = nullptr;
-+    mCmcRemoteHandle = reinterpret_cast<uintptr_t>(nullptr);
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
-new file mode 100644
-index 000000000000..800ba150a7fb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelCmc.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once
-+
-+#include <ia_cmc_parser.h>
-+
-+#include <vector>
-+
-+#include "IntelAlgoCommon.h"
-+#include "modules/sandboxing/IPCIntelCmc.h"
-+
-+namespace icamera {
-+class IntelCmc {
-+ public:
-+    IntelCmc();
-+    virtual ~IntelCmc();
-+
-+    // the nvmData must be nullptr currently
-+    bool init(const ia_binary_data *aiqbData, const ia_binary_data *nvmData);
-+
-+    ia_cmc_t* getCmc() const;
-+    uintptr_t getCmcHandle() const;
-+
-+    void deinit();
-+
-+ private:
-+    IPCIntelCmc mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemDeinit;
-+
-+    std::vector<ShmMem> mMems;
-+
-+    ia_cmc_t* mHandle;  // it points to the SHM
-+
-+    // the pointer is in another process.
-+    // because the ia_aiq_init() needs the cmc pointer,
-+    // so keep the pinter in the IntelCmc and pass it aiq when init aiq.
-+    // at the same time, it will be used when deinit the cmc.
-+    uintptr_t mCmcRemoteHandle;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
-new file mode 100644
-index 000000000000..e008735d710c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
-@@ -0,0 +1,356 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ClientIntelDvs"
-+
-+#include "modules/sandboxing/client/IntelDvs.h"
-+
-+#include <string>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelDvs::IntelDvs():
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string initName = "/dvsInit" + std::to_string(personal) + SHM_NAME;
-+    std::string deinitName = "/dvsDeinit" + std::to_string(personal) + SHM_NAME;
-+    std::string configName = "/dvsConfig" + std::to_string(personal) + SHM_NAME;
-+    std::string setNonBlankRatioName = "/dvsSetNonBlankRatio" +
-+                                       std::to_string(personal) + SHM_NAME;
-+    std::string setDigitalZoomModeName = "/dvsSetDigitalZoomModeName" +
-+                                         std::to_string(personal) + SHM_NAME;
-+    std::string setDigitalZoomRegionName = "/dvsSetDigitalZoomRegionName" +
-+                                           std::to_string(personal) + SHM_NAME;
-+    std::string setDigitalZoomCoordinateName = "/dvsSetDigitalZoomCoordinateName" +
-+                                              std::to_string(personal) + SHM_NAME;
-+    std::string setDigitalZoomMagnitudeName = "/dvsSetDigitalZoomMagnitudeName" +
-+                                              std::to_string(personal) + SHM_NAME;
-+    std::string freeMorphTableName = "/dvsFreeMorphTableName" +
-+                                     std::to_string(personal) + SHM_NAME;
-+    std::string allocateMorphTalbeName = "/dvsAllocateMorphTalbeName" +
-+                                         std::to_string(personal) + SHM_NAME;
-+    std::string getMorphTableName = "/dvsGetMorphTableName" +
-+                                    std::to_string(personal) + SHM_NAME;
-+    std::string setStatisticsName = "/dvsSetStatisticsName" +
-+                                    std::to_string(personal) + SHM_NAME;
-+    std::string executeName = "/dvsExecuteName" + std::to_string(personal) + SHM_NAME;
-+    std::string getImageTransformationName = "/dvsGetImageTransformationName" +
-+                                             std::to_string(personal) + SHM_NAME;
-+
-+    mMems = {{initName.c_str(), sizeof(DvsInitParams), &mMemInit, false},
-+             {deinitName.c_str(), sizeof(DvsDeinitParams), &mMemDeinit, false},
-+             {configName.c_str(), sizeof(DvsConfigParams), &mMemConfig, false},
-+             {setNonBlankRatioName.c_str(),
-+              sizeof(DvsNoneBlankRatioParams), &mMemNonBlankRatio, false},
-+             {setDigitalZoomModeName.c_str(), sizeof(DvsDigitalZoomMode), &mMemZoomMode, false},
-+             {setDigitalZoomRegionName.c_str(),
-+              sizeof(DvsDigitalZoomRegion), &mMemZoomRegion, false},
-+             {setDigitalZoomCoordinateName.c_str(),
-+              sizeof(DvsDigitalZoomCoordinate), &mMemZoomCoordinate, false},
-+             {setDigitalZoomMagnitudeName.c_str(),
-+              sizeof(DvsDigitalZoomMagnitude), &mMemZoomMagnitude, false},
-+             {freeMorphTableName.c_str(), sizeof(DvsFreeMorphParams), &mMemFreeMorph, false},
-+             {allocateMorphTalbeName.c_str(), sizeof(DvsMorphParams), &mMemAllocateMorph, false},
-+             {getMorphTableName.c_str(), sizeof(DvsMorphParams), &mMemGetMorphTable, false},
-+             {setStatisticsName.c_str(), sizeof(DvsStatistcs), &mMemStatistics, false},
-+             {executeName.c_str(), sizeof(DvsExecute), &mMemExecute, false},
-+             {getImageTransformationName.c_str(),
-+              sizeof(DvsImageTransformation), &mMemImageTransfor, false},
-+            };
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelDvs::~IntelDvs() {
-+    LOGIPC("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+ia_err IntelDvs::init(const ia_binary_data &aiqTuningBinary,
-+                      const ia_cmc_t *cmc, ia_dvs_state **dvsHandle) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(mInitialized == false, ia_err_none, "@%s, mInitialized is false", __func__);
-+    CheckError(aiqTuningBinary.data == nullptr, ia_err_none,
-+               "@%s, aiqTuningBinary.data is nullptr", __func__);
-+    CheckError(aiqTuningBinary.size == 0, ia_err_none,
-+               "@%s, aiqTuningBinary.size is 0", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_none, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, &aiqTuningBinary, cmc);
-+    CheckError(ret == false, ia_err_none, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, ia_err_none, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, dvsHandle);
-+    CheckError(ret == false, ia_err_none, "@%s, clientUnflattenInit fails", __func__);
-+    return ia_err_none;
-+}
-+
-+void IntelDvs::deinit(ia_dvs_state *dvsHandle) {
-+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, dvsHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+ia_err IntelDvs::config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio) {
-+    LOGIPC("@%s, dvsHandle:%p, config:%p, zoomRatio:%f", __func__, dvsHandle, config, zoomRatio);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(config == nullptr, ia_err_general, "@%s, config is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenConfig(mMemConfig.mAddr, mMemConfig.mSize,
-+                                        dvsHandle, config, zoomRatio);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenConfig fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_CONFIG, mMemConfig.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio) {
-+    LOGIPC("@%s, dvsHandle:%p, nonBlankingRatio:%f", __func__, dvsHandle, nonBlankingRatio);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenNoneBlanckRation(mMemNonBlankRatio.mAddr,
-+                                                  mMemNonBlankRatio.mSize,
-+                                                  dvsHandle, nonBlankingRatio);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenNoneBlanckRation fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_NONE_BLANK_RATION, mMemNonBlankRatio.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode) {
-+    LOGIPC("@%s, dvsHandle:%p, zoomMode:%f", __func__, dvsHandle, zoomMode);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDigitalZoomMode(mMemZoomMode.mAddr,
-+                                                 mMemZoomMode.mSize, dvsHandle, zoomMode);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenDigitalZoomMode fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MODE, mMemZoomMode.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion) {
-+    LOGIPC("@%s, dvsHandle:%p, zoomRegion:%p", __func__, dvsHandle, zoomRegion);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(zoomRegion == nullptr, ia_err_general, "@%s, zoomRegion is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDigitalZoomRegion(mMemZoomRegion.mAddr,
-+                                                   mMemZoomRegion.mSize,
-+                                                   dvsHandle, zoomRegion);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenDigitalZoomRegion fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_REGION, mMemZoomRegion.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomCoordinate(ia_dvs_state *dvsHandle,
-+                                          ia_coordinate *zoomCoordinate) {
-+    LOGIPC("@%s, dvsHandle:%p, zoomCoordinate:%p", __func__, dvsHandle, zoomCoordinate);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(zoomCoordinate == nullptr, ia_err_general,
-+               "@%s, zoomCoordinate is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDigitalZoomCoordinate(mMemZoomCoordinate.mAddr,
-+                                                       mMemZoomCoordinate.mSize,
-+                                                       dvsHandle, zoomCoordinate);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenDigitalZoomCoordinate fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE, mMemZoomCoordinate.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio) {
-+    LOGIPC("@%s, dvsHandle:%p, zoomRatio:%f", __func__, dvsHandle, zoomRatio);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDigitalZoomMagnitude(mMemZoomMagnitude.mAddr,
-+                                                      mMemZoomMagnitude.mSize,
-+                                                      dvsHandle, zoomRatio);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenDigitalZoomMagnitude fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE, mMemZoomMagnitude.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+void IntelDvs::freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable) {
-+    LOGIPC("@%s, dvsHandle%p, morphTable:%p", __func__, dvsHandle, morphTable);
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, VOID_VALUE, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(morphTable == nullptr, VOID_VALUE, "@%s, morphTable is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenFreeMorphTable(mMemFreeMorph.mAddr, mMemFreeMorph.mSize,
-+                                                dvsHandle, morphTable);
-+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenFreeMorphTable fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_FREE_MORPH_TABLE, mMemFreeMorph.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+ia_dvs_morph_table *IntelDvs::allocateMorphTalbe(ia_dvs_state *dvsHandle) {
-+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, nullptr, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenAllocateMorphTable(mMemAllocateMorph.mAddr,
-+                                                    mMemAllocateMorph.mSize, dvsHandle);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocateMorphTable fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_ALLOCATE_MORPH_TABLE, mMemAllocateMorph.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    ia_dvs_morph_table *morphTable = nullptr;
-+    ret = mIpc.clientUnflattenAllocateMorphTalbe(mMemAllocateMorph.mAddr,
-+                                                 mMemAllocateMorph.mSize, &morphTable);
-+    CheckError(ret == false, nullptr, "@%s, clientUnflattenAllocateMorphTalbe fails", __func__);
-+
-+    return morphTable;
-+}
-+
-+int IntelDvs::getMorphTable(ia_dvs_state *dvsHandle,
-+                            ia_dvs_morph_table *morphTable, DvsResult *result) {
-+    LOGIPC("@%s, dvsHandle:%p, morphTable:%p", __func__, dvsHandle, morphTable);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, UNKNOWN_ERROR, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(morphTable == nullptr, UNKNOWN_ERROR, "@%s, morphTable is nullptr", __func__);
-+    CheckError(result == nullptr, UNKNOWN_ERROR, "@%s, result is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenGetMorphTable(mMemGetMorphTable.mAddr,
-+                                               mMemGetMorphTable.mSize,
-+                                               dvsHandle, morphTable);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetMorphTable fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_GET_MORPH_TABLE, mMemGetMorphTable.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ia_dvs_morph_table *morphTableTmp = nullptr;
-+    ret = mIpc.clientUnflattenGetMorphTalbe(mMemGetMorphTable.mAddr,
-+                                            mMemGetMorphTable.mSize, &morphTableTmp);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, clientUnflattenGetMorphTalbe fails", __func__);
-+
-+    int err = DvsResult::deepCopyDvsResults(*morphTableTmp, &result->mMorphTable);
-+    CheckError(err != OK, UNKNOWN_ERROR, "@%s, deepCopyDvsResults fails", __func__);
-+
-+    return OK;
-+}
-+
-+ia_err IntelDvs::setStatistics(ia_dvs_state *dvsHandle,
-+                               const ia_dvs_statistics *statistics,
-+                               const ia_aiq_ae_results *aeResults,
-+                               const ia_aiq_af_results *afResults,
-+                               const ia_aiq_sensor_events *sensorEvents,
-+                               uint64_t frameReadoutStart,
-+                               uint64_t frameReadoutEnd) {
-+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenSetStatistics(mMemStatistics.mAddr, mMemStatistics.mSize,
-+                                               dvsHandle, statistics, aeResults,
-+                                               afResults, sensorEvents,
-+                                               frameReadoutStart, frameReadoutEnd);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenSetStatistics fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_SET_STATISTICS, mMemStatistics.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::execute(ia_dvs_state *dvsHandle, uint16_t focusPosition) {
-+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenExecute(mMemExecute.mAddr, mMemExecute.mSize,
-+                                         dvsHandle, focusPosition);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetMorphTable fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_EXECUTE, mMemExecute.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelDvs::getImageTransformation(ia_dvs_state *dvsHandle,
-+                                        ia_dvs_image_transformation *imageTransformation) {
-+    LOGIPC("@%s, dvsHandle:%p", __func__, dvsHandle);
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(dvsHandle == nullptr, ia_err_general, "@%s, dvsHandle is nullptr", __func__);
-+    CheckError(imageTransformation == nullptr, ia_err_general,
-+                "@%s, imageTransformation is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenImageTransformation(mMemImageTransfor.mAddr,
-+                                                     mMemImageTransfor.mSize, dvsHandle);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientFlattenImageTransformation fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_DVS_GET_IMAGE_TRANSFORMATION, mMemImageTransfor.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ia_dvs_image_transformation *info = nullptr;
-+    ret = mIpc.clientUnflattenImageTransformation(mMemGetMorphTable.mAddr,
-+                                                  mMemGetMorphTable.mSize, &info);
-+    CheckError(ret == false, ia_err_general,
-+               "@%s, clientUnflattenImageTransformation fails", __func__);
-+
-+    MEMCPY_S(imageTransformation, sizeof(ia_dvs_image_transformation),
-+             info, sizeof(ia_dvs_image_transformation));
-+    return ia_err_none;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
-new file mode 100644
-index 000000000000..76c1781a9c88
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.h
-@@ -0,0 +1,79 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_dvs.h>
-+#include <ia_dvs_types.h>
-+#include <ia_isp_bxt.h>
-+
-+#include <vector>
-+
-+#include "modules/sandboxing/IPCIntelDvs.h"
-+#include "DvsResult.h"
-+#include "IntelAlgoCommon.h"
-+
-+namespace icamera {
-+class IntelDvs {
-+ public:
-+    IntelDvs();
-+    virtual ~IntelDvs();
-+
-+    ia_err init(const ia_binary_data &aiqTuningBinary,
-+                const ia_cmc_t *cmc, ia_dvs_state **dvsHandle);
-+    void deinit(ia_dvs_state *dvsHandle);
-+    ia_err config(ia_dvs_state *dvsHandle, ia_dvs_configuration *config, float zoomRatio);
-+    ia_err setNonBlankRatio(ia_dvs_state *dvsHandle, float nonBlankingRatio);
-+    ia_err setDigitalZoomMode(ia_dvs_state *dvsHandle, ia_dvs_zoom_mode zoomMode);
-+    ia_err setDigitalZoomRegion(ia_dvs_state *dvsHandle, ia_rectangle *zoomRegion);
-+    ia_err setDigitalZoomCoordinate(ia_dvs_state *dvsHandle, ia_coordinate *zoomCoordinate);
-+    ia_err setDigitalZoomMagnitude(ia_dvs_state *dvsHandle, float zoomRatio);
-+    void freeMorphTable(ia_dvs_state *dvsHandle, ia_dvs_morph_table *morphTable);
-+    ia_dvs_morph_table *allocateMorphTalbe(ia_dvs_state *dvsHandle);
-+    int getMorphTable(ia_dvs_state *dvsHandle,
-+                      ia_dvs_morph_table *morphTable, DvsResult *result);
-+    ia_err setStatistics(ia_dvs_state *dvsHandle, const ia_dvs_statistics *statistics,
-+                         const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
-+                         const ia_aiq_sensor_events *sensorEvents, uint64_t frameReadoutStart,
-+                         uint64_t frameReadoutEnd);
-+    ia_err execute(ia_dvs_state *dvsHandle, uint16_t focusPosition);
-+    ia_err getImageTransformation(ia_dvs_state *dvsHandle,
-+                                  ia_dvs_image_transformation *imageTransformation);
-+
-+ private:
-+    IPCIntelDvs mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemDeinit;
-+    ShmMemInfo mMemConfig;
-+    ShmMemInfo mMemNonBlankRatio;
-+    ShmMemInfo mMemZoomMode;
-+    ShmMemInfo mMemZoomRegion;
-+    ShmMemInfo mMemZoomCoordinate;
-+    ShmMemInfo mMemZoomMagnitude;
-+    ShmMemInfo mMemFreeMorph;
-+    ShmMemInfo mMemAllocateMorph;
-+    ShmMemInfo mMemGetMorphTable;
-+    ShmMemInfo mMemStatistics;
-+    ShmMemInfo mMemExecute;
-+    ShmMemInfo mMemImageTransfor;
-+
-+    std::vector<ShmMem> mMems;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
-new file mode 100644
-index 000000000000..25ff3f46bda7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.cpp
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ClientIntelFaceDetection"
-+
-+#include "modules/sandboxing/client/IntelFaceDetection.h"
-+
-+#include <algorithm>
-+#include "FaceBase.h"
-+
-+namespace icamera {
-+IntelFaceDetection::IntelFaceDetection() :
-+    mInitialized(false) {
-+    LOG1("@%s", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    mMems = {{("/faceDetectionInit" + std::to_string(personal) + "Shm"),
-+              sizeof(FaceDetectionInitParams), &mMemInit, false}};
-+
-+    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
-+        mMems.push_back({("/faceDetectionRun" + std::to_string(i) + std::to_string(personal)
-+                         + "Shm"), sizeof(FaceDetectionRunParams), &mMemRunBufs[i], false});
-+    }
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        LOGE("@%s,Failed to call allocateAllShmMems", __func__);
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOG1("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelFaceDetection::~IntelFaceDetection() {
-+    LOG1("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+status_t IntelFaceDetection::init(FaceDetectionInitParams *initParams, int dataSize) {
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    LOG1("@%s, initParams:%p, dataSize:%d", __func__, initParams, dataSize);
-+    CheckError(initParams == nullptr, UNKNOWN_ERROR, "@%s, initParams is nullptr", __func__);
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    unsigned int maxFacesNum = std::min(initParams->max_face_num,
-+                                        static_cast<unsigned int>(MAX_FACES_DETECTABLE));
-+    LOG2("@%s, maxFacesNum:%d", __func__, maxFacesNum);
-+
-+    FaceDetectionInitParams *params = static_cast<FaceDetectionInitParams*>(mMemInit.mAddr);
-+
-+    bool ret = mIpc.clientFlattenInit(maxFacesNum, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_FD_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelFaceDetection::deinit() {
-+    LOG1("@%s", __func__);
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mCommon.requestSync(IPC_FD_DEINIT);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+FaceDetectionRunParams *IntelFaceDetection::prepareRunBuffer(unsigned int index) {
-+    LOG1("@%s", __func__);
-+    CheckError(index >= MAX_STORE_FACE_DATA_BUF_NUM, nullptr,
-+               "@%s, index is error %d", __func__, index);
-+    CheckError(!mInitialized, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    return static_cast<FaceDetectionRunParams*>(mMemRunBufs[index].mAddr);
-+}
-+
-+status_t IntelFaceDetection::run(FaceDetectionRunParams *runParams, int dataSize, int dmafd) {
-+    CheckError(!mInitialized, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+    CheckError(!runParams, UNKNOWN_ERROR, "@%s,runParams is nullptr", __func__);
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    if (dmafd >= 0) {
-+        runParams->bufferHandle = mCommon.registerGbmBuffer(dmafd);
-+        CheckError((runParams->bufferHandle < 0), false,
-+                   "@%s, call mCommon.registerGbmBuffer", __func__);
-+    }
-+
-+    int32_t runBufHandle = mCommon.getShmMemHandle(static_cast<void *>(runParams));
-+    CheckError(runBufHandle < 0, UNKNOWN_ERROR,
-+               "@%s, getShmMemHandle fails", __func__, runParams);
-+
-+    bool ret = mCommon.requestSync(IPC_FD_RUN, runBufHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    if (dmafd >= 0) {
-+        mCommon.deregisterGbmBuffer(runParams->bufferHandle);
-+    }
-+
-+    return OK;
-+}
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
-new file mode 100644
-index 000000000000..a11130205d79
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelFaceDetection.h
-@@ -0,0 +1,48 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+
-+#include "FaceBase.h"
-+#include "modules/sandboxing/IPCIntelFD.h"
-+#include "IntelAlgoCommon.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+class IntelFaceDetection {
-+ public:
-+    IntelFaceDetection();
-+    virtual ~IntelFaceDetection();
-+
-+    status_t init(FaceDetectionInitParams *initData, int dataSize);
-+    status_t deinit();
-+    status_t run(FaceDetectionRunParams *runParams, int dataSize, int dmafd = -1);
-+    FaceDetectionRunParams *prepareRunBuffer(unsigned int index);
-+
-+ private:
-+    IPCIntelFD mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemRunBufs[MAX_STORE_FACE_DATA_BUF_NUM];
-+    std::vector<ShmMem> mMems;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
-new file mode 100644
-index 000000000000..f1cb479705ef
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.cpp
-@@ -0,0 +1,197 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelIspParamAdaptor"
-+
-+#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
-+
-+#include <string>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+IntelIspParamAdaptor::IntelIspParamAdaptor() :
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string initName = "/adaptorInit" + std::to_string(personal) + SHM_NAME;
-+    std::string deInitName = "/adaptorDeinit" + std::to_string(personal) + SHM_NAME;
-+    std::string getSize = "/adaptorGetSize" + std::to_string(personal) + SHM_NAME;
-+    std::string convertStats = "/adaptorConvertStats" + std::to_string(personal) + SHM_NAME;
-+    std::string runPal = "/adaptorRunPal" + std::to_string(personal) + SHM_NAME;
-+
-+    mMems = {{initName.c_str(), sizeof(IspBxtInitParam), &mMemInit, false},
-+             {deInitName.c_str(), sizeof(IspBxtDeInitParam), &mMemDeinit, false},
-+             {getSize.c_str(), sizeof(PalDataSizeParam), &mMemGetSize, false},
-+             {convertStats.c_str(), sizeof(ConvertStatsParam), &mMemStats, false},
-+             {runPal.c_str(), sizeof(RunPalParam), &mMemRunPal, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelIspParamAdaptor::~IntelIspParamAdaptor() {
-+    LOGIPC("@%s", __func__);
-+    mPalDataMems.clear();
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+ia_isp_bxt *IntelIspParamAdaptor::init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
-+                                       unsigned int maxStatsWidth, unsigned int maxStatsHeight,
-+                                       unsigned int maxNumStatsIn, ia_mkn *iaMkn) {
-+    CheckError(!ispData || !iaCmc, nullptr, "%s, No CPF or CMC data", __func__);
-+    LOGIPC("%s, ispData size: %d, pointer: %p, max width: %u, max height: %u",
-+           __func__, ispData->size, ispData->data, maxStatsWidth, maxStatsHeight);
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, ispData, iaCmc,
-+                                      maxStatsWidth, maxStatsHeight, maxNumStatsIn, iaMkn);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(mMemInit.mAddr);
-+    return reinterpret_cast<ia_isp_bxt*>(params->ispRemoteHandle);
-+}
-+
-+void IntelIspParamAdaptor::deInit(const ia_isp_bxt *ispBxtHandle) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!ispBxtHandle, VOID_VALUE, "%s, ispBxtHandle is nullptr", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenDeInit(mMemDeinit.mAddr, mMemDeinit.mSize, ispBxtHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_ISP_ADAPTOR_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+int IntelIspParamAdaptor::getPalDataSize(const ia_isp_bxt_program_group *programGroup) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(mInitialized == false, -1, "@%s, mInitialized is false", __func__);
-+    CheckError(!programGroup, -1, "%s, programGroup is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenGetPalSize(mMemGetSize.mAddr, mMemGetSize.mSize, programGroup);
-+    CheckError(ret == false, -1, "@%s, clientFlattenGetPalSize fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_ISP_GET_PAL_SIZE, mMemGetSize.mHandle);
-+    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
-+
-+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(mMemGetSize.mAddr);
-+    LOGIPC("@%s, the pal data size is: %d", __func__, params->palDataSize);
-+
-+    return params->palDataSize;
-+}
-+
-+status_t IntelIspParamAdaptor::queryAndConvertStats(const ia_isp_bxt *ispBxtHandle,
-+                                                    const ConvertInputParam *inputParams,
-+                                                    ConvertResult *result) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!ispBxtHandle, UNKNOWN_ERROR, "%s, ispBxtHandle is nullptr", __func__);
-+    CheckError(!inputParams || !result,
-+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
-+    CheckError(!inputParams->dvsReso || !inputParams->aeResults,
-+               UNKNOWN_ERROR, "%s, inputParams or result nullptr", __func__);
-+    CheckError((!inputParams->statsBuffer ||
-+               !inputParams->statsBuffer->data || inputParams->statsBuffer->size <= 0),
-+               UNKNOWN_ERROR, "%s, Wrong statistics buffer", __func__);
-+    CheckError(!result->queryResults, UNKNOWN_ERROR, "%s, queryResults is nullptr", __func__);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenConvertStats(mMemStats.mAddr, mMemStats.mSize,
-+                                              ispBxtHandle, inputParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenConvertStats fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_ISP_CONVERT_STATS, mMemStats.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenConvertStats(mMemStats.mAddr, mMemStats.mSize, result);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenConvertStats fails", __func__);
-+
-+    return OK;
-+}
-+
-+void *IntelIspParamAdaptor::allocatePalBuffer(int streamId, int index, int palDataSize) {
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string palDataName = "/palData" + std::to_string(streamId) +
-+                              std::to_string(index) + std::to_string(personal) + SHM_NAME;
-+
-+    ShmMemInfo memInfo;
-+    CLEAR(memInfo);
-+    bool success = mCommon.allocShmMem(palDataName, palDataSize, &memInfo);
-+    CheckError(success == false, nullptr,
-+               "%s, failed to allocate share memory for pal", __func__);
-+    LOGIPC("%s, the buffer handle: %d, address: %p", __func__, memInfo.mHandle, memInfo.mAddr);
-+
-+    mPalDataMems.push_back(memInfo);
-+
-+    return memInfo.mAddr;
-+}
-+
-+void IntelIspParamAdaptor::freePalBuffer(void *addr) {
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    for (auto &mem : mPalDataMems) {
-+        if (mem.mAddr == addr) {
-+            mCommon.freeShmMem(mem);
-+        }
-+    }
-+}
-+
-+status_t IntelIspParamAdaptor::runPal(ia_isp_bxt *ispBxtHandle,
-+                                      const ia_isp_bxt_input_params_v2 *inputParams,
-+                                      ia_binary_data *outputData) {
-+    LOGIPC("@%s", __func__);
-+    CheckError((!ispBxtHandle || !inputParams), UNKNOWN_ERROR,
-+               "%s, ispBxtHandle or inputParams is nullptr", __func__);
-+    CheckError((!outputData || !outputData->data || outputData->size <= 0),
-+               UNKNOWN_ERROR, "%s, Wrong pal data buffer", __func__);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    int32_t palDataHandle = mCommon.getShmMemHandle(outputData->data);
-+    CheckError(!palDataHandle, UNKNOWN_ERROR,
-+                "%s, the pal buffer(%p) doesn't exist in SHM list", __func__, outputData->data);
-+    LOGIPC("%s, pal buffer address: %p, buffer handle: %d",
-+           __func__, outputData->data, palDataHandle);
-+
-+    bool ret = mIpc.clientFlattenRunPal(mMemRunPal.mAddr, mMemRunPal.mSize,
-+                                        ispBxtHandle, inputParams, outputData, palDataHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenRunPal fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_ISP_RUN_PAL, mMemRunPal.mHandle);
-+    CheckError(ret == false, -1, "@%s, requestSync fails", __func__);
-+
-+    RunPalParam *params = static_cast<RunPalParam*>(mMemRunPal.mAddr);
-+    outputData->size = params->palOutput.size;
-+    LOGIPC("%s, the buffer handle is: %d size: %d ptr: %p after running pal",
-+           __func__, params->palDataHandle, outputData->size, outputData->data);
-+
-+    return OK;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
-new file mode 100644
-index 000000000000..d5bbecaf5dbe
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelIspParamAdaptor.h
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+
-+#include "modules/sandboxing/IPCIspParamAdaptor.h"
-+#include "IntelAlgoCommon.h"
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+
-+class IntelIspParamAdaptor {
-+ public:
-+    IntelIspParamAdaptor();
-+    virtual ~IntelIspParamAdaptor();
-+
-+    ia_isp_bxt *init(const ia_binary_data *ispData, const ia_cmc_t *iaCmc,
-+                     unsigned int maxStatsWidth, unsigned int maxStatsHeight,
-+                     unsigned int maxNumStatsIn, ia_mkn *iaMkn);
-+    void deInit(const ia_isp_bxt *ispBxtHandle);
-+    int getPalDataSize(const ia_isp_bxt_program_group *programGroup);
-+    status_t runPal(ia_isp_bxt *ispBxtHandle,
-+                    const ia_isp_bxt_input_params_v2 *inputParams, ia_binary_data *outputData);
-+    status_t queryAndConvertStats(const ia_isp_bxt *ispBxtHandle,
-+                                  const ConvertInputParam *inputParams, ConvertResult *result);
-+    void *allocatePalBuffer(int streamId, int index, int palDataSize);
-+    void freePalBuffer(void *addr);
-+
-+ private:
-+    IPCIspParamAdaptor mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemDeinit;
-+    ShmMemInfo mMemGetSize;
-+    ShmMemInfo mMemStats;
-+    ShmMemInfo mMemRunPal;
-+    std::vector<ShmMemInfo> mPalDataMems;
-+
-+    std::vector<ShmMem> mMems;
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
-new file mode 100644
-index 000000000000..647325fcec72
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.cpp
-@@ -0,0 +1,138 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelLard"
-+
-+#include "modules/sandboxing/client/IntelLard.h"
-+
-+#include <string>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelLard::IntelLard():
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    std::string initName = "/lardInit" + std::to_string(personal) + SHM_NAME;
-+    std::string getTagListName = "/lardGetTagList" + std::to_string(personal) + SHM_NAME;
-+    std::string runName = "/lardRun" + std::to_string(personal) + SHM_NAME;
-+    std::string deinitName = "/lardDeinit" + std::to_string(personal) + SHM_NAME;
-+
-+    mMems = {{initName.c_str(), sizeof(lard_init_params), &mMemInit, false},
-+             {getTagListName.c_str(), sizeof(lard_get_tag_list_params), &mMemGetTagList, false},
-+             {runName.c_str(), sizeof(lard_run_params), &mMemRun, false},
-+             {deinitName.c_str(), sizeof(lard_deinit_params), &mMemDeinit, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelLard::~IntelLard() {
-+    LOGIPC("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+ia_lard* IntelLard::init(const ia_binary_data* lard_data_ptr) {
-+    LOGIPC("@%s, binaryData:%p", __func__, lard_data_ptr);
-+
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is nullptr", __func__);
-+    CheckError(!lard_data_ptr->data, nullptr, "@%s, lard_data_ptr->data is nullptr", __func__);
-+    CheckError(lard_data_ptr->size == 0, nullptr, "@%s, lard_data_ptr->size is 0", __func__);
-+
-+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize, lard_data_ptr);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LARD_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    ia_lard* lard = nullptr;
-+    ret = mIpc.clientUnflattenInit(mMemInit.mAddr, mMemInit.mSize, &lard);
-+    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
-+
-+    return lard;
-+}
-+
-+ia_err IntelLard::getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
-+                             unsigned int* num_tags, const unsigned int** tags) {
-+    LOGIPC("@%s, ia_lard_ptr:%p, mode_tag:%d", __func__, ia_lard_ptr, mode_tag);
-+
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
-+    CheckError(num_tags == nullptr, ia_err_general, "@%s, num_tags is nullptr", __func__);
-+    CheckError(tags == nullptr, ia_err_general, "@%s, tags is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize,
-+                                            ia_lard_ptr, mode_tag);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenGetTagList fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LARD_GET_TAG_LIST, mMemGetTagList.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenGetTagList(mMemGetTagList.mAddr, mMemGetTagList.mSize,
-+                                         mode_tag, num_tags, tags);
-+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenGetTagList fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+ia_err IntelLard::run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
-+                      ia_lard_results** lard_results_ptr) {
-+    LOGIPC("@%s, ia_lard_ptr:%p, lard_input_params_ptr:%p", __func__,
-+           ia_lard_ptr, lard_input_params_ptr);
-+
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(ia_lard_ptr == nullptr, ia_err_general, "@%s, ia_lard_ptr is nullptr", __func__);
-+    CheckError(lard_input_params_ptr == nullptr, ia_err_general,
-+               "@%s, lard_input_params_ptr is nullptr", __func__);
-+    CheckError(lard_results_ptr == nullptr, ia_err_general,
-+               "@%s, lard_results_ptr is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenRun(mMemRun.mAddr, mMemRun.mSize,
-+                                     ia_lard_ptr, lard_input_params_ptr);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenRun fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LARD_RUN, mMemRun.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenRun(mMemRun.mAddr, mMemRun.mSize, lard_results_ptr);
-+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenRun fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+void IntelLard::deinit(ia_lard* ia_lard_ptr) {
-+    LOGIPC("@%s, ia_lard_ptr:%p", __func__, ia_lard_ptr);
-+
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+    CheckError(ia_lard_ptr == nullptr, VOID_VALUE, "@%s, ia_lard_ptr is nullptr", __func__);
-+
-+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, ia_lard_ptr);
-+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LARD_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
-new file mode 100644
-index 000000000000..7f337a64e280
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLard.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_lard.h>
-+#include "modules/sandboxing/IPCIntelLard.h"
-+#include "IntelAlgoCommon.h"
-+#include <vector>
-+
-+namespace icamera {
-+class IntelLard {
-+ public:
-+    IntelLard();
-+    virtual ~IntelLard();
-+
-+    ia_lard* init(const ia_binary_data* lard_data_ptr);
-+    ia_err getTagList(ia_lard* ia_lard_ptr, unsigned int mode_tag,
-+                      unsigned int* num_tags, const unsigned int** tags);
-+    ia_err run(ia_lard* ia_lard_ptr, ia_lard_input_params* lard_input_params_ptr,
-+               ia_lard_results** lard_results_ptr);
-+    void deinit(ia_lard* ia_lard_ptr);
-+
-+ private:
-+    IPCIntelLard mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemGetTagList;
-+    ShmMemInfo mMemRun;
-+    ShmMemInfo mMemDeinit;
-+
-+    std::vector<ShmMem> mMems;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
-new file mode 100644
-index 000000000000..c7c9c01db465
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.cpp
-@@ -0,0 +1,136 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ClientIntelLtm"
-+
-+#include "modules/sandboxing/client/IntelLtm.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IntelLtm::IntelLtm() :
-+    mInitialized(false),
-+    mRunParamsSize(0) {
-+    LOGIPC("@%s", __func__);
-+
-+    mCaller = reinterpret_cast<uintptr_t>(this);
-+    mMems = {{("/ltmInit" + std::to_string(mCaller) + "Shm"),
-+              sizeof(LtmInitParams), &mMemInit, false},
-+             {("/ltmDeinit" + std::to_string(mCaller) + "Shm"),
-+              sizeof(LtmDeinitParams), &mMemDeinit, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelLtm::~IntelLtm() {
-+    LOGIPC("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+    mCommon.freeShmMem(mMemRun);
-+}
-+
-+ia_ltm *IntelLtm::init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!lard_data_ptr, nullptr, "@%s, lard_data_ptr is null", __func__);
-+    CheckError(!mkn, nullptr, "@%s, mkn is null", __func__);
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    LtmInitParams *params = static_cast<LtmInitParams*>(mMemInit.mAddr);
-+
-+    bool ret = mIpc.clientFlattenInit(*lard_data_ptr, reinterpret_cast<uintptr_t>(mkn), params);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LTM_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    ia_ltm *ltm = nullptr;
-+    ret = mIpc.clientUnflattenInit(params, &ltm);
-+    CheckError(ret == false, nullptr, "@%s, clientUnflattenInit fails", __func__);
-+
-+    return ltm;
-+}
-+
-+void IntelLtm::deinit(ia_ltm *ltm) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!ltm, VOID_VALUE, "@%s, ltm is nullptr", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    LtmDeinitParams *params = static_cast<LtmDeinitParams*>(mMemDeinit.mAddr);
-+    params->ltm_handle = reinterpret_cast<uintptr_t>(ltm);
-+
-+    bool ret = mCommon.requestSync(IPC_LTM_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+int IntelLtm::allocaRunImage(int dataSize) {
-+    mRunParamsSize = 0;
-+    mCommon.freeShmMem(mMemRun);
-+    mMemRun = {};
-+
-+    mMemRun.mName = "/ltmRun" + std::to_string(mCaller) + "Shm";
-+    mMemRun.mSize = dataSize;
-+    bool ret = mCommon.allocShmMem(mMemRun.mName, mMemRun.mSize, &mMemRun);
-+    CheckError(!ret, mRunParamsSize, "@%s, allocShmMem fails", __func__);
-+
-+    mRunParamsSize = dataSize;
-+    return mRunParamsSize;
-+}
-+
-+ia_err IntelLtm::run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
-+                     ia_ltm_results **ltmResults,
-+                     ia_ltm_drc_params **drcResults) {
-+    LOGIPC("@%s", __func__);
-+
-+    CheckError(mInitialized == false, ia_err_general, "@%s, mInitialized is false", __func__);
-+    CheckError(!ltm, ia_err_general, "@%s, ltm is nullptr", __func__);
-+    CheckError(!inputParams, ia_err_general, "@%s, inputParams is nullptr", __func__);
-+    CheckError(!ltmResults, ia_err_general, "@%s, ltmResultsis is nullptr", __func__);
-+    CheckError(!drcResults, ia_err_general, "@%s, drcResults is nullptr", __func__);
-+
-+    int runParamsSize = sizeof(LtmRunParams);
-+    if (inputParams->input_image_ptr && inputParams->input_image_ptr->image_data) {
-+        runParamsSize += inputParams->input_image_ptr->image_data->size;
-+    }
-+
-+    if (mRunParamsSize < runParamsSize) {
-+        LOGIPC("@%s, mRunParamsSize %d, runParamsSize %d", __func__, mRunParamsSize, runParamsSize);
-+        int dataSize = allocaRunImage(runParamsSize);
-+        CheckError(dataSize <= 0, ia_err_general, "@%s, Failed to allocaRunImage", __func__);
-+    }
-+
-+    bool ret = mIpc.clientFlattenRun(reinterpret_cast<uintptr_t>(ltm),
-+                                     *inputParams, mMemRun.mSize, mMemRun.mAddr);
-+    CheckError(ret == false, ia_err_general, "@%s, clientFlattenPrepare fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_LTM_RUN, mMemRun.mHandle);
-+    CheckError(ret == false, ia_err_general, "@%s, requestSync fails", __func__);
-+
-+    LtmRunParams* params = static_cast<LtmRunParams*>(mMemRun.mAddr);
-+    ret = mIpc.clientUnflattenRun(params, ltmResults, drcResults);
-+    CheckError(ret == false, ia_err_general, "@%s, clientUnflattenPrepare fails", __func__);
-+
-+    return ia_err_none;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
-new file mode 100644
-index 000000000000..e5daa4cc40bc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelLtm.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_ltm.h>
-+#include <vector>
-+
-+#include "IntelAlgoCommon.h"
-+#include "modules/sandboxing/IPCIntelLtm.h"
-+
-+namespace icamera {
-+class IntelLtm {
-+ public:
-+    IntelLtm();
-+    virtual ~IntelLtm();
-+
-+    ia_ltm *init(const ia_binary_data *lard_data_ptr, ia_mkn *mkn);
-+    void deinit(ia_ltm *ltm);
-+    ia_err run(ia_ltm *ltm, const ia_ltm_input_params *inputParams,
-+               ia_ltm_results **ltmResults,
-+               ia_ltm_drc_params **drcResults);
-+
-+ private:
-+    int allocaRunImage(int dataSize);
-+
-+ private:
-+    uintptr_t mCaller;
-+    IPCIntelLtm mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+    int mRunParamsSize;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemRun;
-+    ShmMemInfo mMemDeinit;
-+    std::vector<ShmMem> mMems;
-+};
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
-new file mode 100644
-index 000000000000..102de4593317
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.cpp
-@@ -0,0 +1,122 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ClientIntelMkn"
-+
-+#include "modules/sandboxing/client/IntelMkn.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+IntelMkn::IntelMkn():
-+    mInitialized(false) {
-+    LOGIPC("@%s", __func__);
-+
-+    uintptr_t personal = reinterpret_cast<uintptr_t>(this);
-+    mMems = {{("/mknInit" + std::to_string(personal) + "Shm"),
-+              sizeof(MknInitParams), &mMemInit, false},
-+             {("/mknDeinit" + std::to_string(personal) + "Shm"),
-+              sizeof(MknDeinitParams), &mMemDeinit, false},
-+             {("/mknPrepare" + std::to_string(personal) + "Shm"),
-+              sizeof(MknPrepareParams), &mMemPrepare, false},
-+             {("/mknEnable" + std::to_string(personal) + "Shm"),
-+              sizeof(MknEnableParams), &mMemEnable, false}};
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelMkn::~IntelMkn() {
-+    LOGIPC("@%s", __func__);
-+    mCommon.releaseAllShmMems(mMems);
-+}
-+
-+ia_mkn *IntelMkn::init(ia_mkn_config_bits mkn_config_bits,
-+                       size_t mkn_section_1_size,
-+                       size_t mkn_section_2_size) {
-+    LOGIPC("@%s, mkn_config_bits:%d, mkn_section_1_size:%zu, mkn_section_2_size:%zu",
-+           __func__, mkn_config_bits, mkn_section_1_size, mkn_section_2_size);
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    MknInitParams *params = static_cast<MknInitParams*>(mMemInit.mAddr);
-+
-+    bool ret = mIpc.clientFlattenInit(mkn_config_bits, mkn_section_1_size,
-+                                      mkn_section_2_size, params);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_MKN_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    return reinterpret_cast<ia_mkn*> (params->results);
-+}
-+
-+void IntelMkn::deinit(ia_mkn *pMkn) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(pMkn == nullptr, VOID_VALUE, "@%s, mkn is nullptr", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    MknDeinitParams *params = static_cast<MknDeinitParams*>(mMemDeinit.mAddr);
-+    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
-+
-+    bool ret = mCommon.requestSync(IPC_MKN_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+int IntelMkn::prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *pBinaryData) {
-+    LOGIPC("@%s", __func__);
-+
-+    *pBinaryData = {nullptr, 0};
-+    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    MknPrepareParams* params = static_cast<MknPrepareParams*>(mMemPrepare.mAddr);
-+    bool ret = mIpc.clientFlattenPrepare(reinterpret_cast<uintptr_t>(pMkn),
-+                                         data_target, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_MKN_PREPARE, mMemPrepare.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenPrepare(params, pBinaryData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelMkn::enable(ia_mkn *pMkn, bool enable_data_collection) {
-+    LOGIPC("@%s, enable_data_collection:%d", __func__, enable_data_collection);
-+
-+    CheckError(pMkn == nullptr, UNKNOWN_ERROR, "@%s, mkn is nullptr", __func__);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "@%s, mInitialized is false", __func__);
-+
-+    MknEnableParams *params = static_cast<MknEnableParams*>(mMemEnable.mAddr);
-+    params->mkn_handle = reinterpret_cast<uintptr_t>(pMkn);
-+    params->enable_data_collection = enable_data_collection;
-+
-+    bool ret = mCommon.requestSync(IPC_MKN_ENABLE, mMemEnable.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
-new file mode 100644
-index 000000000000..9649432a06da
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelMkn.h
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_types.h>
-+#include <ia_mkn_types.h>
-+#include <ia_mkn_encoder.h>
-+#include <vector>
-+
-+#include "IntelAlgoCommon.h"
-+#include "modules/sandboxing/IPCIntelMkn.h"
-+
-+namespace icamera {
-+class IntelMkn {
-+ public:
-+    IntelMkn();
-+    ~IntelMkn();
-+
-+    ia_mkn *init(ia_mkn_config_bits mkn_config_bits,
-+                 size_t mkn_section_1_size, size_t mkn_section_2_size);
-+    void deinit(ia_mkn *pMkn);
-+
-+    int prepare(ia_mkn *pMkn, ia_mkn_trg data_target, ia_binary_data *pBinaryData);
-+    int enable(ia_mkn *pMkn, bool enable_data_collection);
-+
-+ private:
-+    IPCIntelMkn mIpc;
-+    IntelAlgoCommon mCommon;
-+
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemDeinit;
-+    ShmMemInfo mMemPrepare;
-+    ShmMemInfo mMemEnable;
-+
-+    std::vector<ShmMem> mMems;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
-new file mode 100644
-index 000000000000..f4b03601b4c4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
-@@ -0,0 +1,271 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelPGParamC"
-+
-+#include "modules/sandboxing/client/IntelPGParam.h"
-+
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+IntelPGParam::IntelPGParam(int pgId) :
-+    mInitialized(false),
-+    mPgId(pgId),
-+    mClient(reinterpret_cast<uintptr_t>(this)),
-+    mPayloadCount(0),
-+    mPGBuffer(nullptr) {
-+    std::string initName = "/pgParamInit" + std::to_string(mClient) + SHM_NAME;
-+    std::string prepareName = "/pgParamPrepare" + std::to_string(mClient) + SHM_NAME;
-+    std::string getFragDescsName = "/pgParamGetFragDescs" + std::to_string(mClient) + SHM_NAME;
-+    std::string prepareProgramName = "/pgParamPrepareProgram" + std::to_string(mClient) + SHM_NAME;
-+    std::string encodeName = "/pgParamEncode" + std::to_string(mClient) + SHM_NAME;
-+    std::string decodeName = "/pgParamDecode" + std::to_string(mClient) + SHM_NAME;
-+    std::string deinitName = "/pgParamDeinit" + std::to_string(mClient) + SHM_NAME;
-+
-+    mMems = {{initName.c_str(), sizeof(pg_param_init_params), &mMemInit, false},
-+             {prepareName.c_str(), sizeof(pg_param_prepare_params), &mMemPrepare, false},
-+             {getFragDescsName.c_str(), sizeof(pg_param_get_fragment_desc_params),
-+                                                                    &mMemGetFragDescs, false},
-+             {prepareProgramName.c_str(), sizeof(pg_param_prepare_program_params),
-+                                                                    &mMemPrepareProgram, false},
-+             {encodeName.c_str(), sizeof(pg_param_encode_params), &mMemEncode, false},
-+             {decodeName.c_str(), sizeof(pg_param_decode_params), &mMemDecode, false},
-+             {deinitName.c_str(), sizeof(pg_param_deinit_params), &mMemDeinit, false},
-+            };
-+
-+    bool success = mCommon.allocateAllShmMems(&mMems);
-+    if (!success) {
-+        mCommon.releaseAllShmMems(mMems);
-+        return;
-+    }
-+
-+    // Allocate when use
-+    mMemAllocatePayloads.mName = "/pgParamAllocPayloads" + std::to_string(mClient) + SHM_NAME;
-+    mMemAllocatePayloads.mSize = 0;
-+    mMemAllocatePGBuffer.mName = "/pgParamAllocPG" + std::to_string(mClient) + SHM_NAME;
-+    mMemAllocatePGBuffer.mSize = 0;
-+
-+    LOGIPC("@%s, done", __func__);
-+    mInitialized = true;
-+}
-+
-+IntelPGParam::~IntelPGParam() {
-+    mCommon.releaseAllShmMems(mMems);
-+    if (mMemAllocatePayloads.mSize) {
-+        mCommon.freeShmMem(mMemAllocatePayloads);
-+    }
-+    if (mMemAllocatePGBuffer.mSize) {
-+        mCommon.freeShmMem(mMemAllocatePGBuffer);
-+    }
-+}
-+
-+int IntelPGParam::init(ia_p2p_platform_t platform, const PgConfiguration& pgConfig) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenInit(mMemInit.mAddr, mMemInit.mSize,
-+                                      mPgId, mClient, platform, pgConfig);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenInit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_INIT, mMemInit.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParam::prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
-+                          ia_css_kernel_bitmap_t* bitmap) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
-+
-+    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
-+    bool ret = mIpc.clientFlattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize,
-+                                         mClient, ipuParameters->size, palHandle, rbm);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepare fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE, mMemPrepare.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenPrepare(mMemPrepare.mAddr, mMemPrepare.mSize, bitmap);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenPrepare fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParam::getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize,
-+                                              mClient, descCount);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenGetFragDescs fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_GET_FRAG_DESCS, mMemGetFragDescs.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    int count = 0;
-+    ret = mIpc.clientUnflattenGetFragDescs(mMemGetFragDescs.mAddr, mMemGetFragDescs.mSize,
-+                                           &count, descs);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenGetFragDescs fails", __func__);
-+    return count;
-+}
-+
-+void* IntelPGParam::allocatePGBuffer(int pgSize) {
-+    CheckError(mInitialized == false, nullptr, "@%s, mInitialized is false", __func__);
-+
-+    mPGBuffer = nullptr;
-+    int size = mIpc.getTotalPGBufferSize(pgSize);
-+    if (mMemAllocatePGBuffer.mAddr && mMemAllocatePGBuffer.mSize < size) {
-+        mCommon.freeShmMem(mMemAllocatePGBuffer);
-+        mMemAllocatePGBuffer.mSize = 0;
-+        mMemAllocatePGBuffer.mAddr = nullptr;
-+    }
-+    if (!mMemAllocatePGBuffer.mAddr) {
-+        mMemAllocatePGBuffer.mSize = size;
-+        bool ret = mCommon.allocShmMem(mMemAllocatePGBuffer.mName, mMemAllocatePGBuffer.mSize,
-+                                  &mMemAllocatePGBuffer);
-+        CheckError(ret == false, nullptr, "@%s, allocShmMem fails", __func__);
-+    }
-+
-+    void* pgBuffer = nullptr;
-+    bool ret = mIpc.assignPGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize,
-+                                   pgSize, &pgBuffer);
-+    CheckError(ret == false, nullptr, "@%s, assignPGBuffer fails", __func__);
-+
-+    ret = mIpc.clientFlattenAllocatePGBuffer(mMemAllocatePGBuffer.mAddr, mMemAllocatePGBuffer.mSize,
-+                                                mClient, pgSize);
-+    CheckError(ret == false, nullptr, "@%s, clientFlattenAllocatePGBuffer fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PG, mMemAllocatePGBuffer.mHandle);
-+    CheckError(ret == false, nullptr, "@%s, requestSync fails", __func__);
-+
-+    mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
-+    return mPGBuffer;
-+}
-+
-+int IntelPGParam::setPGAndPrepareProgram(ia_css_process_group_t* pg) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+    CheckError(mPGBuffer != pg, INVALID_OPERATION, "@%s, pg is not recognized", __func__);
-+
-+    bool ret = mIpc.clientFlattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
-+                                                mClient);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenPrepareProgram fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_PREPARE_PROGRAM, mMemPrepareProgram.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    // Get size of payloads
-+    mPayloadCount = ARRAY_SIZE(mPayloads);
-+    ret = mIpc.clientUnflattenPrepareProgram(mMemPrepareProgram.mAddr, mMemPrepareProgram.mSize,
-+                                             &mPayloadCount, mPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnlattenPrepareProgram fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParam::allocatePayloads(int payloadCount, ia_binary_data* payloads) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+    CheckError(payloadCount < mPayloadCount, UNKNOWN_ERROR, "@%s, payloadCount is small", __func__);
-+    CheckError(!payloads, UNKNOWN_ERROR, "@%s, payloads is nullptr", __func__);
-+    bool ret = false;
-+
-+    // Allocate memory
-+    int size = mIpc.getTotalPayloadSize(mPayloadCount, mPayloads);
-+    CheckError(size <= 0, UNKNOWN_ERROR, "@%s, payloads size error", __func__);
-+    if (mMemAllocatePayloads.mAddr && mMemAllocatePayloads.mSize < size) {
-+        mCommon.freeShmMem(mMemAllocatePayloads);
-+        mMemAllocatePayloads.mSize = 0;
-+        mMemAllocatePayloads.mAddr = nullptr;
-+    }
-+    if (!mMemAllocatePayloads.mAddr) {
-+        mMemAllocatePayloads.mSize = size;
-+        ret = mCommon.allocShmMem(mMemAllocatePayloads.mName, mMemAllocatePayloads.mSize,
-+                                  &mMemAllocatePayloads);
-+        CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocShmMem fails", __func__);
-+    }
-+
-+    // Split memory of payloads in client side
-+    ret = mIpc.assignPayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
-+                              mPayloadCount, mPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, allocatePayloads fails", __func__);
-+
-+    ret = mIpc.clientFlattenAllocatePayloads(mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize,
-+                                             mClient, mPayloadCount, mPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenAllocatePayloads fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_ALLOCATE_PAYLOADS, mMemAllocatePayloads.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    MEMCPY_S(payloads, sizeof(ia_binary_data) * mPayloadCount,
-+             mPayloads, sizeof(ia_binary_data) * mPayloadCount);
-+    return mPayloadCount;
-+}
-+
-+int IntelPGParam::updatePALAndEncode(const ia_binary_data* ipuParameters,
-+                           int payloadCount, ia_binary_data* payloads) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+    CheckError(!ipuParameters, INVALID_OPERATION, "@%s, ipuParams error", __func__);
-+    // Check shared memory of payloads
-+    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
-+
-+    if (memcmp(payloads, mPayloads, payloadCount * sizeof(ia_binary_data))) {
-+        LOGE("@%s, payloads are not recognized", __func__);
-+    }
-+
-+    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
-+    bool ret = mIpc.clientFlattenEncode(mMemEncode.mAddr, mMemEncode.mSize, mClient,
-+                                        ipuParameters->size, palHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenEncode fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_ENCODE, mMemEncode.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParam::decode(int payloadCount, ia_binary_data* payloads, ia_binary_data* statistics) {
-+    CheckError(mInitialized == false, INVALID_OPERATION, "@%s, mInitialized is false", __func__);
-+    // Check shared memory of payloads
-+    CheckError(payloadCount != mPayloadCount, BAD_VALUE, "@%s, payloadCount error", __func__);
-+    if (memcmp(payloads, mPayloads, payloadCount * sizeof(ia_binary_data))) {
-+        LOGE("@%s, payloads are not recognized", __func__);
-+    }
-+
-+    bool ret = mIpc.clientFlattenDecode(mMemDecode.mAddr, mMemDecode.mSize, mClient);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientFlattenDecode fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_DECODE, mMemDecode.mHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, requestSync fails", __func__);
-+
-+    ret = mIpc.clientUnflattenDecode(mMemDecode.mAddr, mMemDecode.mSize, statistics);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, clientUnflattenDecode fails", __func__);
-+
-+    return OK;
-+}
-+
-+void IntelPGParam::deinit() {
-+    CheckError(mInitialized == false, VOID_VALUE, "@%s, mInitialized is false", __func__);
-+
-+    bool ret = mIpc.clientFlattenDeinit(mMemDeinit.mAddr, mMemDeinit.mSize, mClient);
-+    CheckError(ret == false, VOID_VALUE, "@%s, clientFlattenDeinit fails", __func__);
-+
-+    ret = mCommon.requestSync(IPC_PG_PARAM_DEINIT, mMemDeinit.mHandle);
-+    CheckError(ret == false, VOID_VALUE, "@%s, requestSync fails", __func__);
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
-new file mode 100644
-index 000000000000..771810199b32
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.h
-@@ -0,0 +1,69 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+#include <memory>
-+
-+#include "modules/sandboxing/IPCIntelPGParam.h"
-+#include "IntelAlgoCommon.h"
-+
-+namespace icamera {
-+
-+class IntelPGParam {
-+ public:
-+    explicit IntelPGParam(int pgId);
-+    ~IntelPGParam();
-+
-+    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);
-+    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
-+                ia_css_kernel_bitmap_t* bitmap);
-+    void* allocatePGBuffer(int pgSize);
-+    int getFragmentDescriptors(int terminalIdx, ia_p2p_fragment_desc* desc);
-+    int setPGAndPrepareProgram(ia_css_process_group_t* pg);
-+    int allocatePayloads(int payloadCount, ia_binary_data* payloads);
-+    int updatePALAndEncode(const ia_binary_data* ipuParams,
-+                           int payloadCount, ia_binary_data* payloads);
-+    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);
-+    void deinit();
-+
-+ private:
-+    IPCIntelPGParam mIpc;
-+    IntelAlgoCommon mCommon;
-+    bool mInitialized;
-+
-+    ShmMemInfo mMemInit;
-+    ShmMemInfo mMemPrepare;
-+    ShmMemInfo mMemGetFragDescs;
-+    ShmMemInfo mMemAllocatePGBuffer;
-+    ShmMemInfo mMemPrepareProgram;
-+    ShmMemInfo mMemAllocatePayloads;
-+    ShmMemInfo mMemEncode;
-+    ShmMemInfo mMemDecode;
-+    ShmMemInfo mMemDeinit;
-+    std::vector<ShmMem> mMems;
-+
-+    int mPgId;
-+    uintptr_t mClient;
-+
-+    // Shared memory in client, to avoid memory copy
-+    int mPayloadCount;
-+    ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];  // save sizes
-+    ia_css_process_group_t* mPGBuffer;
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
-new file mode 100644
-index 000000000000..3786144520b6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.cpp
-@@ -0,0 +1,164 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "GraphConfigServer"
-+
-+#include "modules/sandboxing/server/GraphConfigServer.h"
-+
-+#include <string>
-+#include <vector>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+GraphConfigServer::GraphConfigServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+GraphConfigServer::~GraphConfigServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+void GraphConfigServer::addCustomKeyMap() {
-+    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
-+    graphConfigImpl->addCustomKeyMap();
-+}
-+
-+status_t GraphConfigServer::parse(void *pData, size_t dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    GraphParseParams *parseParam = nullptr;
-+    bool ret = mIpc.serverUnflattenParse(pData, dataSize, &parseParam);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenParse fails", __func__);
-+
-+    std::shared_ptr<GraphConfigImpl> graphConfigImpl = std::make_shared<GraphConfigImpl>();
-+    status_t rt = graphConfigImpl->parse(parseParam->cameraId, parseParam->GD,
-+                                         parseParam->gdSize, parseParam->GS, parseParam->gsSize);
-+    CheckError(rt != OK, UNKNOWN_ERROR, "@%s, Failed to parse the graph xml data", __func__);
-+
-+    return OK;
-+}
-+
-+void GraphConfigServer::releaseGraphNodes() {
-+    if (mGraphConfigMap.empty()) return;
-+    mGraphConfigMap.begin()->second->releaseGraphNodes();
-+}
-+
-+status_t GraphConfigServer::configStreams(void *pData, size_t dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    GraphBaseInfo info;
-+    GraphSettingType type;
-+    std::vector<HalStream*> streams;
-+    bool ret = mIpc.serverUnflattenConfigStreams(pData, dataSize, &info, &type, &streams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfigStreams fails", __func__);
-+
-+    // release the old item
-+    auto it = mGraphConfigMap.find(info);
-+    if (it != mGraphConfigMap.end()) {
-+        mGraphConfigMap.erase(it);
-+    }
-+    std::shared_ptr<GraphConfigImpl> graphConfigImpl =
-+        std::make_shared<GraphConfigImpl>(info.cameraId, info.configMode, type);
-+    status_t rt = graphConfigImpl->configStreams(streams);
-+    CheckError(rt != OK, ret, "@%s, Failed to configStreams, cameraId: %d, configMode: %d",
-+               __func__, info.cameraId, info.configMode);
-+
-+    mGraphConfigMap[info] = graphConfigImpl;
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigServer::getGraphConfigData(void *pData, size_t dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    GraphBaseInfo info;
-+    bool ret = mIpc.serverUnflattenGetGraphData(pData, dataSize, &info);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetGraphData fails", __func__);
-+
-+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
-+
-+    auto it = mGraphConfigMap.find(info);
-+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
-+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
-+
-+    IGraphType::GraphConfigData graphData;
-+    status_t rt = it->second->getGraphConfigData(&graphData);
-+    CheckError(rt != OK, UNKNOWN_ERROR, "%s, Failed to getGraphConfigData: cameraId: %d",
-+               __func__, info.cameraId);
-+
-+    ret = mIpc.serverFlattenGetGraphData(pData, dataSize, graphData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetGraphData fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigServer::getPgIdForKernel(void *pData, size_t dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    uint32_t streamId = -1;
-+    int32_t kernelId = 0;
-+    GraphBaseInfo info;
-+    bool ret = mIpc.serverUnFlattenGetPgId(pData, dataSize, &info, &streamId, &kernelId);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
-+
-+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
-+
-+    auto it = mGraphConfigMap.find(info);
-+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
-+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
-+
-+    int32_t pgId = -1;
-+    it->second->getPgIdForKernel(streamId, kernelId, &pgId);
-+
-+    ret = mIpc.serverFlattenGetPgId(pData, dataSize, pgId);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfigServer::pipelineGetConnections(void *pData, size_t dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%zu", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    GraphBaseInfo info;
-+    std::vector<std::string> pgList;
-+    bool ret = mIpc.serverUnFlattenGetConnection(pData, dataSize, &info, &pgList);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnFlattenGetPgId fails", __func__);
-+
-+    LOGIPC("%s, cameraId: %d, configMode: %d", __func__, info.cameraId, info.configMode);
-+
-+    auto it = mGraphConfigMap.find(info);
-+    CheckError(it == mGraphConfigMap.end(), UNKNOWN_ERROR,
-+               "%s, Failed to find the graph config. cameraId: %d", __func__, info.cameraId);
-+
-+    std::vector<IGraphType::PipelineConnection> confVector;
-+    std::vector<IGraphType::ScalerInfo> scalerInfo;
-+    status_t rt = it->second->pipelineGetConnections(pgList, &scalerInfo, &confVector);
-+    CheckError(rt != OK, UNKNOWN_ERROR,
-+               "%s, Failed to getConnection: cameraId: %d", __func__, info.cameraId);
-+
-+    ret = mIpc.serverFlattenGetConnection(pData, dataSize, scalerInfo, confVector);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetPgId fails", __func__);
-+
-+    return OK;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
-new file mode 100644
-index 000000000000..e3bc0985dee9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/GraphConfigServer.h
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <memory>
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/graph/GraphConfigImpl.h"
-+#include "modules/sandboxing/IPCGraphConfig.h"
-+
-+namespace icamera {
-+class GraphConfigServer {
-+ public:
-+    GraphConfigServer();
-+    virtual ~GraphConfigServer();
-+
-+    void addCustomKeyMap();
-+    status_t parse(void* pData, size_t dataSize);
-+    void releaseGraphNodes();
-+    status_t configStreams(void *pData, size_t dataSize);
-+    status_t getGraphConfigData(void *pData, size_t dataSize);
-+    status_t getPgIdForKernel(void *pData, size_t dataSize);
-+    status_t pipelineGetConnections(void *pData, size_t dataSize);
-+
-+ private:
-+    std::map<GraphBaseInfo, std::shared_ptr<GraphConfigImpl> > mGraphConfigMap;
-+    IPCGraphConfig mIpc;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
-new file mode 100644
-index 000000000000..a45e49f7c8d5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.cpp
-@@ -0,0 +1,337 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAiqServer"
-+
-+#include "modules/sandboxing/server/IntelAiqServer.h"
-+
-+#include <ia_aiq.h>
-+#include <ia_cmc_parser.h>
-+
-+#include <algorithm>
-+#include <memory>
-+#include <string>
-+#include <utility>
-+
-+namespace icamera {
-+IntelAiqServer::IntelAiqServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelAiqServer::~IntelAiqServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+status_t IntelAiqServer::init(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(aiq_init_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    aiq_init_params* params = static_cast<aiq_init_params*>(pData);
-+
-+    ia_binary_data aiqbData = {nullptr, 0};
-+    ia_binary_data nvmData = {nullptr, 0};
-+    ia_binary_data aiqdData = {nullptr, 0};
-+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &aiqbData, &nvmData, &aiqdData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    std::unique_ptr<IntelAiq> intelAiq = std::make_unique<IntelAiq>();
-+
-+    ia_aiq* aiq = intelAiq->init(&aiqbData,
-+                                 &nvmData,
-+                                 &aiqdData,
-+                                 params->stats_max_width,
-+                                 params->stats_max_height,
-+                                 params->max_num_stats_in,
-+                                 reinterpret_cast<ia_cmc_t*>(params->cmcRemoteHandle),
-+                                 reinterpret_cast<ia_mkn*>(params->ia_mkn));
-+    CheckError(!aiq, UNKNOWN_ERROR, "@%s, intelAiq.init fails", __func__);
-+
-+    mIntelAiqs[aiq] = std::move(intelAiq);
-+
-+    params->results = reinterpret_cast<uintptr_t>(aiq);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::aeRun(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(ae_run_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    ae_run_params* params = static_cast<ae_run_params*>(pData);
-+
-+    ia_aiq_ae_input_params* aeParams = nullptr;
-+    bool ret = mIpc.serverUnflattenAe(params, &aeParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAe fails", __func__);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_aiq_ae_results* aeResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->aeRun(aeParams, &aeResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, aeRun fails %d", __func__, err);
-+
-+    ret = mIpc.serverFlattenAe(*aeResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAe fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::afRun(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(af_run_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    af_run_params* params = static_cast<af_run_params*>(pData);
-+
-+    ia_aiq_af_input_params* afParams = nullptr;
-+    bool ret = mIpc.serverUnflattenAf(params, &afParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflatten fails", __func__);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_aiq_af_results* afResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->afRun(afParams, &afResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, afRun fails %d", __func__, err);
-+
-+    ret = mIpc.serverFlattenAf(*afResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlatten fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::awbRun(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(awb_run_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    awb_run_params* params = static_cast<awb_run_params*>(pData);
-+
-+    ia_aiq_awb_input_params* awbParams = nullptr;
-+    bool ret = mIpc.serverUnflattenAwb(params, &awbParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAwb fails", __func__);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_aiq_awb_results *awbResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->awbRun(awbParams, &awbResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, awbRun fails %d", __func__, err);
-+
-+    ret = mIpc.serverFlattenAwb(*awbResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenAwb fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::gbceRun(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(gbce_run_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    gbce_run_params *params = static_cast<gbce_run_params*>(pData);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_aiq_gbce_results* gbceResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->gbceRun(&params->base, &gbceResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, gbceRun fails %d", __func__, err);
-+
-+    bool ret = mIpc.serverFlattenGbce(*gbceResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGbce fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::paRunV1(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(pa_run_v1_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    pa_run_v1_params* params = static_cast<pa_run_v1_params*>(pData);
-+
-+    ia_aiq_pa_input_params* paParams = nullptr;
-+    bool ret = mIpc.serverUnflattenPaV1(params, &paParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPa fails", __func__);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+//    ia_aiq_pa_results
-+    ia_aiq_pa_results_v1* paResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->paRunV1(paParams, &paResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, paRunV1 fails %d", __func__, err);
-+
-+    ret = mIpc.serverFlattenPaV1(*paResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPa fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::saRunV2(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(sa_run_v2_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    sa_run_v2_params* params = static_cast<sa_run_v2_params*>(pData);
-+
-+    ia_aiq_sa_input_params_v1* saParams = nullptr;
-+    bool ret = mIpc.serverUnflattenSaV2(*params, &saParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSaV2 fails", __func__);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_aiq_sa_results_v1* saResults = nullptr;
-+    ia_err err = mIntelAiqs[aiq]->saRunV2(saParams, &saResults);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, saRunV2 fails %d", __func__, err);
-+
-+    ret = mIpc.serverFlattenSaV2(*saResults, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenSaV2 fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::statisticsSetV4(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(set_statistics_set_v4_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    set_statistics_set_v4_params* params = static_cast<set_statistics_set_v4_params*>(pData);
-+
-+    ia_aiq_statistics_input_params_v4* stat = nullptr;
-+    bool ret = mIpc.serverUnflattenStatSetV4(params, &stat);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenStatSetV4 fails", __func__);
-+
-+    if (stat->faces) {
-+        LOGIPC("@%s, num_faces:%d", __func__, stat->faces->num_faces);
-+        if (stat->faces->num_faces > 0) {
-+            ia_rectangle& rect = stat->faces->faces[0].face_area;
-+            LOGIPC("@%s, left:%d, top:%d, right:%d, bottom:%d", __func__,
-+                   rect.left, rect.top, rect.right, rect.bottom);
-+        }
-+    }
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->ia_aiq);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_err err = mIntelAiqs[aiq]->statisticsSetV4(stat);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
-+               "@%s, statisticsSetV4 fails %d", __func__, err);
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::getAiqdData(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(ia_binary_data_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    ia_binary_data binaryData = {nullptr, 0};
-+
-+    ia_binary_data_params* params = static_cast<ia_binary_data_params*>(pData);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_err err = mIntelAiqs[aiq]->getAiqdData(&binaryData);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getAiqdData fails %d", __func__, err);
-+    LOGIPC("@%s, binary_data, data:%p, size:%d", __func__, binaryData.data, binaryData.size);
-+
-+    MEMCPY_S(params->data, sizeof(params->data), binaryData.data, binaryData.size);
-+    params->size = binaryData.size;
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::deinit(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(aiq_deinit_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    aiq_deinit_params* params = static_cast<aiq_deinit_params*>(pData);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    mIntelAiqs[aiq]->deinit();
-+
-+    return OK;
-+}
-+
-+status_t IntelAiqServer::getVersion(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(ia_aiq_version_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    ia_aiq_version_params* params = static_cast<ia_aiq_version_params*>(pData);
-+
-+    ia_aiq* aiq = reinterpret_cast<ia_aiq*>(params->aiq_handle);
-+    if (mIntelAiqs.find(aiq) == mIntelAiqs.end()) {
-+        LOGE("@%s, aiq:%p doesn't exist", __func__, aiq);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    std::string version;
-+    mIntelAiqs[aiq]->getVersion(&version);
-+    snprintf(params->data, sizeof(params->data), "%s", version.c_str());
-+    params->size = std::min(version.size(), sizeof(params->data));
-+    LOGIPC("@%s, aiq version:%s, size:%d", __func__, version.c_str(), params->size);
-+
-+    return OK;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
-new file mode 100644
-index 000000000000..fe4b0bcb9a66
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAiqServer.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "modules/algowrapper/IntelAiq.h"
-+
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "modules/sandboxing/IPCIntelAiq.h"
-+
-+namespace icamera {
-+class IntelAiqServer {
-+ public:
-+    IntelAiqServer();
-+    virtual ~IntelAiqServer();
-+
-+    status_t init(void* pData, int dataSize);
-+    status_t aeRun(void* pData, int dataSize);
-+    status_t afRun(void* pData, int dataSize);
-+    status_t awbRun(void* pData, int dataSize);
-+    status_t gbceRun(void* pData, int dataSize);
-+    status_t paRunV1(void* pData, int dataSize);
-+    status_t saRunV2(void* pData, int dataSize);
-+    status_t statisticsSetV4(void* pData, int dataSize);
-+    status_t getAiqdData(void* pData, int dataSize);
-+    status_t deinit(void* pData, int dataSize);
-+    status_t getVersion(void* pData, int dataSize);
-+
-+ private:
-+    IPCIntelAiq mIpc;
-+    std::unordered_map<ia_aiq*, std::unique_ptr<IntelAiq>> mIntelAiqs;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
-new file mode 100644
-index 000000000000..a8157a05ea71
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.cpp
-@@ -0,0 +1,484 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelAlgoServer"
-+
-+#include "modules/sandboxing/server/IntelAlgoServer.h"
-+
-+#include <ia_log.h>
-+
-+#include <stdlib.h>
-+#include <sys/mman.h>
-+#include <sys/stat.h>
-+
-+#include <base/logging.h>
-+
-+#include <memory>
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+IntelAlgoServer* IntelAlgoServer::mInstance = nullptr;
-+
-+void IntelAlgoServer::init() {
-+    LOGIPC("@%s", __func__);
-+
-+    if (mInstance == nullptr) {
-+        mInstance = new IntelAlgoServer;
-+    }
-+}
-+
-+void IntelAlgoServer::deInit() {
-+    LOGIPC("@%s", __func__);
-+
-+    delete mInstance;
-+    mInstance = nullptr;
-+}
-+
-+IntelAlgoServer::IntelAlgoServer():
-+    mCallback(nullptr) {
-+    LOGIPC("@%s", __func__);
-+
-+    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
-+    ia_log_init(&env);
-+
-+    for (int i = 0; i < IPC_GROUP_NUM; i++) {
-+        std::string name =
-+            std::string("IntelAlgoServer") + std::to_string(i) + std::string(" Thread");
-+        mThreads[i] = std::unique_ptr<base::Thread>(new base::Thread(name));
-+        mThreads[i]->Start();
-+    }
-+
-+    for (int32_t i = 1; i <= HANDLE_INDEX_MAX_VALUE; i++) {
-+        mHandlesQueue.push(i);
-+    }
-+}
-+
-+IntelAlgoServer::~IntelAlgoServer() {
-+    LOGIPC("@%s", __func__);
-+
-+    ia_log_deinit();
-+}
-+
-+int32_t IntelAlgoServer::initialize(const camera_algorithm_callback_ops_t* callback_ops) {
-+    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
-+
-+    CheckError((!callback_ops), -EINVAL, "@%s, the callback_ops is nullptr", __func__);
-+
-+    mCallback = callback_ops;
-+
-+    return 0;
-+}
-+
-+int32_t IntelAlgoServer::registerBuffer(int buffer_fd) {
-+    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
-+
-+    std::lock_guard<std::mutex> l(mRegisterBufMutex);
-+    CheckError((mHandles.find(buffer_fd) != mHandles.end()),
-+                -EINVAL, "@%s, Buffer already registered", __func__);
-+    CheckError(mHandlesQueue.empty(), -EBADFD, "@%s, Failed to get buffer handle index", __func__);
-+
-+    struct stat sb;
-+    int ret = fstat(buffer_fd, &sb);
-+    CheckError((ret == -1), -EBADFD, "@%s, Failed to get buffer status", __func__);
-+
-+    void* addr = mmap(0, sb.st_size, PROT_WRITE, MAP_SHARED, buffer_fd, 0);
-+    CheckError((!addr), -EBADFD, "@%s, Failed to map buffer", __func__);
-+
-+    int32_t handle = mHandlesQueue.front();
-+    mHandlesQueue.pop();
-+    mHandles[buffer_fd] = handle;
-+
-+    mShmInfoMap[handle].fd = buffer_fd;
-+    mShmInfoMap[handle].addr = addr;
-+    mShmInfoMap[handle].size = sb.st_size;
-+
-+    return handle;
-+}
-+
-+int IntelAlgoServer::parseReqHeader(const uint8_t req_header[], uint32_t size) {
-+    LOGIPC("@%s, size:%d", __func__, size);
-+
-+    CheckError(size < IPC_REQUEST_HEADER_USED_NUM || req_header[0] != IPC_MATCHING_KEY, -1,
-+               "@%s, fails, req_header[0]:%d, size:%d", __func__, req_header[0], size);
-+
-+    return 0;
-+}
-+
-+void IntelAlgoServer::returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle) {
-+    LOGIPC("@%s, req_id:%d:%s, status:%d", __func__,
-+         req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)), status);
-+    (*mCallback->return_callback)(mCallback, req_id, (status == OK ? 0 : 1), buffer_handle);
-+}
-+
-+status_t IntelAlgoServer::getShmInfo(const int32_t buffer_handle, ShmInfo *memInfo) {
-+    CheckError(!memInfo, UNKNOWN_ERROR, "%s, memInfo is nullptr", __func__);
-+    if (buffer_handle == -1)
-+        return OK;
-+
-+    CheckError(mShmInfoMap.find(buffer_handle) == mShmInfoMap.end(),
-+               UNKNOWN_ERROR, "%s, Invalid buffer handle", __func__);
-+    *memInfo = mShmInfoMap[buffer_handle];
-+
-+    LOGIPC("@%s, fd:%d, size:%zu, addr: %p",
-+           __func__, memInfo->fd, memInfo->size, memInfo->addr);
-+
-+    return OK;
-+}
-+
-+void IntelAlgoServer::handleRequest(const MsgReq& msg) {
-+    uint32_t req_id = msg.req_id;
-+    int32_t buffer_handle = msg.buffer_handle;
-+
-+    ShmInfo info = {};
-+    status_t status = getShmInfo(buffer_handle, &info);
-+    if (status != OK) {
-+        LOGE("@%s, Invalid buffer handle", __func__);
-+        returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
-+        return;
-+    }
-+
-+    size_t requestSize = info.size;
-+    void *addr = info.addr;
-+    LOGIPC("@%s, req_id:%d:%s, requestSize:%zu, addr:%p, buffer_handle:%d",
-+         __func__, req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)),
-+         requestSize, addr, buffer_handle);
-+
-+    switch (req_id) {
-+        case IPC_LARD_INIT:
-+            status = mLard.init(addr, requestSize);
-+            break;
-+        case IPC_LARD_GET_TAG_LIST:
-+            status = mLard.getTagList(addr, requestSize);
-+            break;
-+        case IPC_LARD_RUN:
-+            status = mLard.run(addr, requestSize);
-+            break;
-+        case IPC_LARD_DEINIT:
-+            status = mLard.deinit(addr, requestSize);
-+            break;
-+        case IPC_FD_INIT:
-+            status = mFaceDetection.init(addr, requestSize);
-+            break;
-+        case IPC_FD_RUN: {
-+            FaceDetectionRunParams *palParams = static_cast<FaceDetectionRunParams*>(addr);
-+            void *addrImage = nullptr;
-+            if (palParams->bufferHandle >= 0) {
-+                ShmInfo imageDataInfo;
-+                status = getShmInfo(palParams->bufferHandle, &imageDataInfo);
-+                if (status != OK) {
-+                    LOGE("%s, the buffer handle for image data is invalid", __func__);
-+                    break;
-+                }
-+                addrImage = imageDataInfo.addr;
-+            }
-+            status = mFaceDetection.run(addr, requestSize, addrImage);
-+            break;
-+        }
-+        case IPC_FD_DEINIT:
-+            status = mFaceDetection.deinit();
-+            break;
-+        case IPC_GRAPH_ADD_KEY:
-+            mGraph.addCustomKeyMap();
-+            break;
-+        case IPC_GRAPH_PARSE:
-+            mGraph.parse(addr, requestSize);
-+            break;
-+        case IPC_GRAPH_RELEASE_NODES:
-+            mGraph.releaseGraphNodes();
-+            break;
-+        case IPC_GRAPH_CONFIG_STREAMS:
-+            mGraph.configStreams(addr, requestSize);
-+            break;
-+        case IPC_GRAPH_GET_CONFIG_DATA:
-+            mGraph.getGraphConfigData(addr, requestSize);
-+            break;
-+        case IPC_GRAPH_GET_CONNECTION:
-+            mGraph.pipelineGetConnections(addr, requestSize);
-+            break;
-+        case IPC_GRAPH_GET_PG_ID:
-+            mGraph.getPgIdForKernel(addr, requestSize);
-+            break;
-+        case IPC_CMC_INIT:
-+            status = mCmc.init(addr, requestSize);
-+            break;
-+        case IPC_CMC_DEINIT:
-+            status = mCmc.deinit(addr, requestSize);
-+            break;
-+        case IPC_MKN_INIT:
-+            status = mMkn.init(addr, requestSize);
-+            break;
-+        case IPC_MKN_ENABLE:
-+            status = mMkn.enable(addr, requestSize);
-+            break;
-+        case IPC_MKN_PREPARE:
-+            status = mMkn.prepare(addr, requestSize);
-+            break;
-+        case IPC_MKN_DEINIT:
-+            status = mMkn.deinit(addr, requestSize);
-+            break;
-+        case IPC_LTM_INIT:
-+            status = mLtm.init(addr, requestSize);
-+            break;
-+        case IPC_LTM_RUN:
-+            status = mLtm.run(addr, requestSize);
-+            break;
-+        case IPC_LTM_DEINIT:
-+            status = mLtm.deinit(addr, requestSize);
-+            break;
-+        case IPC_AIQ_INIT:
-+            status = mAiq.init(addr, requestSize);
-+            break;
-+        case IPC_AIQ_AE_RUN:
-+            status = mAiq.aeRun(addr, requestSize);
-+            break;
-+        case IPC_AIQ_AF_RUN:
-+            status = mAiq.afRun(addr, requestSize);
-+            break;
-+        case IPC_AIQ_AWB_RUN:
-+            status = mAiq.awbRun(addr, requestSize);
-+            break;
-+        case IPC_AIQ_GBCE_RUN:
-+            status = mAiq.gbceRun(addr, requestSize);
-+            break;
-+        case IPC_AIQ_PA_RUN_V1:
-+            status = mAiq.paRunV1(addr, requestSize);
-+            break;
-+        case IPC_AIQ_SA_RUN_V2:
-+            status = mAiq.saRunV2(addr, requestSize);
-+            break;
-+        case IPC_AIQ_STATISTICS_SET_V4:
-+            status = mAiq.statisticsSetV4(addr, requestSize);
-+            break;
-+        case IPC_AIQ_GET_AIQD_DATA:
-+            status = mAiq.getAiqdData(addr, requestSize);
-+            break;
-+        case IPC_AIQ_DEINIT:
-+            status = mAiq.deinit(addr, requestSize);
-+            break;
-+        case IPC_AIQ_GET_VERSION:
-+            status = mAiq.getVersion(addr, requestSize);
-+            break;
-+        case IPC_DVS_INIT:
-+            status = mDvs.init(addr, requestSize);
-+            break;
-+        case IPC_DVS_CONFIG:
-+            status = mDvs.config(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_NONE_BLANK_RATION:
-+            status = mDvs.setNonBlankRatio(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_DIGITAL_ZOOM_MODE:
-+            status = mDvs.setDigitalZoomMode(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_DIGITAL_ZOOM_REGION:
-+            status = mDvs.setDigitalZoomRegion(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_DIGITAL_ZOOM_COORDINATE:
-+            status = mDvs.setDigitalZoomCoordinate(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_DIGITAL_ZOOM_MAGNITUDE:
-+            status = mDvs.setDigitalZoomMagnitude(addr, requestSize);
-+            break;
-+        case IPC_DVS_FREE_MORPH_TABLE:
-+            status = mDvs.freeMorphTable(addr, requestSize);
-+            break;
-+        case IPC_DVS_ALLOCATE_MORPH_TABLE:
-+            status = mDvs.allocateMorphTalbe(addr, requestSize);
-+            break;
-+        case IPC_DVS_GET_MORPH_TABLE:
-+            status = mDvs.getMorphTalbe(addr, requestSize);
-+            break;
-+        case IPC_DVS_SET_STATISTICS:
-+            status = mDvs.setStatistics(addr, requestSize);
-+            break;
-+        case IPC_DVS_EXECUTE:
-+            status = mDvs.execute(addr, requestSize);
-+            break;
-+        case IPC_DVS_GET_IMAGE_TRANSFORMATION:
-+            status = mDvs.getImageTransformation(addr, requestSize);
-+            break;
-+        case IPC_DVS_DEINIT:
-+            status = mDvs.deinit(addr, requestSize);
-+            break;
-+        case IPC_ISP_ADAPTOR_INIT:
-+            status = mIspAdaptor.init(addr, requestSize);
-+            break;
-+        case IPC_ISP_ADAPTOR_DEINIT:
-+            status = mIspAdaptor.deInit(addr, requestSize);
-+            break;
-+        case IPC_ISP_GET_PAL_SIZE:
-+            status = mIspAdaptor.getPalDataSize(addr, requestSize);
-+            break;
-+        case IPC_ISP_CONVERT_STATS:
-+            status = mIspAdaptor.queryAndConvertStats(addr, requestSize);
-+            break;
-+        case IPC_ISP_RUN_PAL: {
-+            RunPalParam *palParams = static_cast<RunPalParam*>(addr);
-+            ShmInfo palDataInfo;
-+            status = getShmInfo(palParams->palDataHandle, &palDataInfo);
-+            if (status != OK) {
-+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
-+                break;
-+            }
-+            LOGIPC("@%s, pal data info: fd:%d, size:%zu, addr: %p",
-+                    __func__, palDataInfo.fd, palDataInfo.size, palDataInfo.addr);
-+
-+            status = mIspAdaptor.runPal(addr, requestSize, palDataInfo.addr);
-+
-+            break;
-+        }
-+        case IPC_PG_PARAM_INIT:
-+            status = mPGParam.init(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_PREPARE: {
-+            pg_param_prepare_params *prepareParams = static_cast<pg_param_prepare_params*>(addr);
-+            ShmInfo palDataInfo = {};
-+            status = getShmInfo(prepareParams->ipuParamHandle, &palDataInfo);
-+            if (status != OK) {
-+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
-+                break;
-+            }
-+
-+            status = mPGParam.prepare(addr, requestSize, palDataInfo.addr);
-+            break;
-+        }
-+        case IPC_PG_PARAM_ALLOCATE_PG:
-+            status = mPGParam.allocatePGBuffer(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_GET_FRAG_DESCS:
-+            status = mPGParam.getFragmentDescriptors(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_PREPARE_PROGRAM:
-+            status = mPGParam.setPGAndPrepareProgram(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_ALLOCATE_PAYLOADS:
-+            status = mPGParam.allocatePayloads(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_ENCODE: {
-+            pg_param_encode_params *encodeParams = static_cast<pg_param_encode_params*>(addr);
-+            ShmInfo palDataInfo = {};
-+            status = getShmInfo(encodeParams->ipuParamHandle, &palDataInfo);
-+            if (status != OK) {
-+                LOGE("%s, the buffer handle for pal data is invalid", __func__);
-+                break;
-+            }
-+
-+            status = mPGParam.updatePALAndEncode(addr, requestSize, palDataInfo.addr);
-+            break;
-+        }
-+        case IPC_PG_PARAM_DECODE:
-+            status = mPGParam.decode(addr, requestSize);
-+            break;
-+        case IPC_PG_PARAM_DEINIT:
-+            mPGParam.deinit(addr, requestSize);
-+            break;
-+        default:
-+            LOGE("@%s, req_id:%d is not defined", __func__, req_id);
-+            status = UNKNOWN_ERROR;
-+            break;
-+    }
-+
-+    returnCallback(req_id, status, buffer_handle);
-+}
-+
-+void IntelAlgoServer::request(uint32_t req_id,
-+                              const uint8_t req_header[],
-+                              uint32_t size,
-+                              int32_t buffer_handle) {
-+    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
-+    LOGIPC("@%s, req_id:%d:%s", __func__,
-+           req_id, IntelAlgoIpcCmdToString(static_cast<IPC_CMD>(req_id)));
-+
-+    IPC_GROUP group = IntelAlgoIpcCmdToGroup(static_cast<IPC_CMD>(req_id));
-+    LOGIPC("@%s, group:%d", __func__, group);
-+
-+    int ret = parseReqHeader(req_header, size);
-+    if (ret != 0) {
-+        returnCallback(req_id, UNKNOWN_ERROR, buffer_handle);
-+        return;
-+    }
-+
-+    MsgReq msg = {req_id, buffer_handle};
-+
-+    mThreads[group]->task_runner()->PostTask(FROM_HERE,
-+        base::Bind(&IntelAlgoServer::handleRequest, base::Unretained(this), msg));
-+}
-+
-+void IntelAlgoServer::deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
-+    LOGIPC("@%s, size:%d", __func__, size);
-+
-+    std::lock_guard<std::mutex> l(mRegisterBufMutex);
-+    for (uint32_t i = 0; i < size; i++) {
-+        int32_t handle = buffer_handles[i];
-+        if (mShmInfoMap.find(handle) == mShmInfoMap.end()) {
-+            continue;
-+        }
-+
-+        mHandles.erase(mShmInfoMap[handle].fd);
-+
-+        munmap(mShmInfoMap[handle].addr, mShmInfoMap[handle].size);
-+        close(mShmInfoMap[handle].fd);
-+        mShmInfoMap.erase(handle);
-+        mHandlesQueue.push(handle);
-+    }
-+}
-+
-+static int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops) {
-+    LOGIPC("@%s, callback_ops:%p", __func__, callback_ops);
-+    return IntelAlgoServer::getInstance()->initialize(callback_ops);
-+}
-+
-+static int32_t registerBuffer(int32_t buffer_fd) {
-+    LOGIPC("@%s, buffer_fd:%d", __func__, buffer_fd);
-+    return IntelAlgoServer::getInstance()->registerBuffer(buffer_fd);
-+}
-+
-+static void request(uint32_t req_id,
-+                    const uint8_t req_header[],
-+                    uint32_t size,
-+                    int32_t buffer_handle) {
-+    LOGIPC("@%s, size:%d, buffer_handle:%d", __func__, size, buffer_handle);
-+    IntelAlgoServer::getInstance()->request(req_id, req_header, size, buffer_handle);
-+}
-+
-+static void deregisterBuffers(const int32_t buffer_handles[], uint32_t size) {
-+    LOGIPC("@%s, size:%d", __func__, size);
-+    return IntelAlgoServer::getInstance()->deregisterBuffers(buffer_handles, size);
-+}
-+
-+extern "C" {
-+camera_algorithm_ops_t CAMERA_ALGORITHM_MODULE_INFO_SYM
-+    __attribute__((__visibility__("default"))) = {
-+        .initialize = initialize,
-+        .register_buffer = registerBuffer,
-+        .request = request,
-+        .deregister_buffers = deregisterBuffers
-+    };
-+}
-+
-+__attribute__((constructor)) void initIntelAlgoServer() {
-+    icamera::Log::setDebugLevel();
-+    IntelAlgoServer::init();
-+}
-+
-+__attribute__((destructor)) void deinitIntelAlgoServer() {
-+    IntelAlgoServer::deInit();
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
-new file mode 100644
-index 000000000000..c5d8844df7bc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelAlgoServer.h
-@@ -0,0 +1,110 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "IntelLardServer.h"
-+#include "IntelFDServer.h"
-+#include "GraphConfigServer.h"
-+#include "IntelCmcServer.h"
-+#include "IntelMknServer.h"
-+#include "IntelLtmServer.h"
-+#include "IntelAiqServer.h"
-+#include "IntelDvsServer.h"
-+#include "IspParamAdaptorServer.h"
-+#include "IntelPGParamServer.h"
-+
-+#include <base/bind.h>
-+#include <base/threading/thread.h>
-+
-+#include <memory>
-+#include <queue>
-+#include <unordered_map>
-+
-+#include "cros-camera/camera_algorithm.h"
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "iutils/Errors.h"
-+#include "CameraLog.h"
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+#define HANDLE_INDEX_MAX_VALUE 1024
-+struct MsgReq {
-+    uint32_t req_id;
-+    int32_t buffer_handle;
-+};
-+
-+class IntelAlgoServer {
-+ public:
-+    static void init();
-+    static void deInit();
-+
-+    static IntelAlgoServer* getInstance() { return mInstance; }
-+
-+    int32_t initialize(const camera_algorithm_callback_ops_t* callback_ops);
-+    int32_t registerBuffer(int buffer_fd);
-+    void request(uint32_t req_id,
-+                 const uint8_t req_header[],
-+                 uint32_t size,
-+                 int32_t buffer_handle);
-+    void deregisterBuffers(const int32_t buffer_handles[], uint32_t size);
-+
-+    void handleRequest(const MsgReq& msg);
-+
-+ private:
-+    IntelAlgoServer();
-+    ~IntelAlgoServer();
-+
-+    typedef struct {
-+        int32_t fd;
-+        void* addr;
-+        size_t size;
-+    } ShmInfo;
-+    status_t getShmInfo(const int32_t buffer_handle, ShmInfo *memInfo);
-+    int parseReqHeader(const uint8_t req_header[], uint32_t size);
-+
-+    void returnCallback(uint32_t req_id, status_t status, int32_t buffer_handle);
-+
-+ private:
-+    static IntelAlgoServer* mInstance;
-+
-+    std::unique_ptr<base::Thread> mThreads[IPC_GROUP_NUM];
-+    const camera_algorithm_callback_ops_t* mCallback;
-+
-+    // key: shared memory fd from client
-+    // value: handle that returns from RegisterBuffer()
-+    std::unordered_map<int32_t, int32_t> mHandles;
-+
-+    // key: handle that returns from RegisterBuffer()
-+    // value: shared memory fd and mapped address
-+    std::unordered_map<int32_t, ShmInfo> mShmInfoMap;
-+    std::queue<int32_t> mHandlesQueue;
-+    std::mutex mRegisterBufMutex;
-+
-+    IntelLardServer mLard;
-+    IntelFDServer mFaceDetection;
-+    GraphConfigServer mGraph;
-+    IntelCmcServer mCmc;
-+    IntelMknServer mMkn;
-+    IntelLtmServer mLtm;
-+    IntelAiqServer mAiq;
-+    IntelDvsServer mDvs;
-+    IspParamAdaptorServer mIspAdaptor;
-+    IntelPGParamServer mPGParam;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
-new file mode 100644
-index 000000000000..5d53f7549da5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.cpp
-@@ -0,0 +1,92 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelCmcServer"
-+
-+#include "modules/sandboxing/server/IntelCmcServer.h"
-+
-+#include <ia_cmc_parser.h>
-+
-+#include <string.h>
-+#include <utility>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+IntelCmcServer::IntelCmcServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelCmcServer::~IntelCmcServer() {
-+    LOGIPC("@%s", __func__);
-+
-+    mIntelCmcs.clear();
-+}
-+
-+status_t IntelCmcServer::init(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(cmc_init_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    cmc_init_params* params = static_cast<cmc_init_params*>(pData);
-+    ia_binary_data aiqbData = {nullptr, 0};
-+
-+    bool ret = mIpc.serverUnflattenInit(*params, &aiqbData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    std::unique_ptr<IntelCmc> intelCmc = std::make_unique<IntelCmc>();
-+
-+    ret = intelCmc->init(&aiqbData, nullptr);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, intelCmc->init fails", __func__);
-+
-+    ia_cmc_t* cmc = intelCmc->getCmc();
-+    CheckError(!cmc, UNKNOWN_ERROR, "@%s, cmc is nullptr", __func__);
-+    LOGIPC("@%s, cmc:%p", __func__, cmc);
-+
-+    ret = mIpc.serverFlattenInit(*cmc, params);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
-+
-+    mIntelCmcs[cmc] = std::move(intelCmc);
-+
-+    return OK;
-+}
-+
-+status_t IntelCmcServer::deinit(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(cmc_deinit_params), UNKNOWN_ERROR,
-+               "@%s, buffer is small", __func__);
-+
-+    cmc_deinit_params* params = static_cast<cmc_deinit_params*>(pData);
-+
-+    ia_cmc_t* cmc = reinterpret_cast<ia_cmc_t*>(params->cmc_handle);
-+    LOGIPC("@%s, cmc:%p", __func__, cmc);
-+
-+    if (mIntelCmcs.find(cmc) == mIntelCmcs.end()) {
-+        LOGE("@%s, cmc:%p doesn't exist", __func__, cmc);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    mIntelCmcs[cmc]->deinit();
-+
-+    mIntelCmcs.erase(cmc);
-+
-+    return OK;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
-new file mode 100644
-index 000000000000..d4ecca2004d4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelCmcServer.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "modules/algowrapper/IntelCmc.h"
-+#include "modules/sandboxing/IPCCommon.h"
-+#include "modules/sandboxing/IPCIntelCmc.h"
-+
-+namespace icamera {
-+class IntelCmcServer {
-+ public:
-+    IntelCmcServer();
-+    virtual ~IntelCmcServer();
-+
-+    status_t init(void* pData, int dataSize);
-+    status_t deinit(void* pData, int dataSize);
-+
-+ private:
-+    std::unordered_map<ia_cmc_t*, std::unique_ptr<IntelCmc>> mIntelCmcs;
-+    IPCIntelCmc mIpc;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
-new file mode 100644
-index 000000000000..92bb4f1cef20
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
-@@ -0,0 +1,317 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelDvsServer"
-+
-+#include "modules/sandboxing/server/IntelDvsServer.h"
-+
-+#include <utility>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelDvsServer::IntelDvsServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelDvsServer::~IntelDvsServer() {
-+    LOGIPC("@%s", __func__);
-+
-+    mIntelDvss.clear();
-+}
-+
-+status_t IntelDvsServer::init(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_binary_data *dvsDataPtr = nullptr;
-+    ia_cmc_t *cmc = nullptr;
-+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &dvsDataPtr, &cmc);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    std::unique_ptr<IntelDvs> intelDvs = std::make_unique<IntelDvs>();
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_err err = intelDvs->init(*dvsDataPtr, cmc, &dvs);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, intelDvs->init fails", __func__);
-+
-+    ret = mIpc.serverFlattenInit(pData, dataSize, dvs);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
-+
-+    mIntelDvss[dvs] = std::move(intelDvs);
-+
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::deinit(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &dvs);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    intelDvs->deinit(dvs);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::config(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_dvs_configuration *config = nullptr;
-+    float zoomRatio = 0;
-+    bool ret = mIpc.serverUnflattenConfig(pData, dataSize, &dvs, &config, &zoomRatio);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConfig fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->config(dvs, config, zoomRatio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, config fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setNonBlankRatio(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    float nonBlankingRatio = 0;
-+    bool ret = mIpc.serverUnflattenNoneBlanckRation(pData, dataSize, &dvs, &nonBlankingRatio);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenNoneBlanckRation fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setNonBlankRatio(dvs, nonBlankingRatio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setNonBlankRatio fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setDigitalZoomMode(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_dvs_zoom_mode zoomMode = ia_dvs_zoom_mode_center;
-+    bool ret = mIpc.serverUnflattenDigitalZoomMode(pData, dataSize, &dvs, &zoomMode);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMode fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setDigitalZoomMode(dvs, zoomMode);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomMode fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setDigitalZoomRegion(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_rectangle *zoomRegion = nullptr;
-+    bool ret = mIpc.serverUnflattenDigitalZoomRegion(pData, dataSize, &dvs, &zoomRegion);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenDigitalZoomRegion fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setDigitalZoomRegion(dvs, zoomRegion);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, setDigitalZoomRegion fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setDigitalZoomCoordinate(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_coordinate *zoomCoordinate = nullptr;
-+    bool ret = mIpc.serverUnflattenDigitalZoomCoordinate(pData, dataSize, &dvs, &zoomCoordinate);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenDigitalZoomCoordinate fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setDigitalZoomCoordinate(dvs, zoomCoordinate);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
-+               "@%s, setDigitalZoomCoordinate fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setDigitalZoomMagnitude(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    float zoomRatio = 0;
-+    bool ret = mIpc.serverUnflattenDigitalZoomMagnitude(pData, dataSize, &dvs, &zoomRatio);
-+    CheckError(ret == false,
-+               UNKNOWN_ERROR, "@%s, serverUnflattenDigitalZoomMagnitude fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setDigitalZoomMagnitude(dvs, zoomRatio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR,
-+               "@%s, setDigitalZoomMagnitude fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::freeMorphTable(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_morph_table *morph = nullptr;
-+    ia_dvs_state *dvs = nullptr;
-+    bool ret = mIpc.serverUnflattenFreeMorphTable(pData, dataSize, &dvs, &morph);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenFreeMorphTable fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    intelDvs->freeMorphTable(dvs, morph);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::allocateMorphTalbe(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    bool ret = mIpc.serverUnflattenAllocateMorphTalbe(pData, dataSize, &dvs);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenAllocateMorphTalbe fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_dvs_morph_table *morph = intelDvs->allocateMorphTalbe(dvs);
-+
-+    ret = mIpc.serverFlattenAllocateMorphTalbe(pData, dataSize, morph);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverFlattenAllocateMorphTalbe fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::getMorphTalbe(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_dvs_morph_table *morph = nullptr;
-+    bool ret = mIpc.serverUnflattenGetMorphTalbe(pData, dataSize, &dvs, &morph);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetMorphTalbe fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    int err = intelDvs->getMorphTable(dvs, morph);
-+    CheckError(err != OK, UNKNOWN_ERROR, "@%s, getMorphTalbe fails", __func__);
-+
-+    ret = mIpc.serverFlattenGetMorphTalbe(pData, dataSize, morph);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetMorphTalbe fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::setStatistics(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_dvs_statistics *statistics = nullptr;
-+    ia_aiq_ae_results *aeResults = nullptr;
-+    ia_aiq_af_results *afResults = nullptr;
-+    ia_aiq_sensor_events *sensorEvents = nullptr;
-+    uint64_t frameReadoutStart = 0;
-+    uint64_t frameReadoutEnd = 0;
-+    bool ret = mIpc.serverUnflattenSetStatistics(pData, dataSize, &dvs, &statistics,
-+                                                 &aeResults, &afResults, &sensorEvents,
-+                                                 &frameReadoutStart, &frameReadoutEnd);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenSetStatistics fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->setStatistics(dvs, statistics, aeResults, afResults, sensorEvents,
-+                                         frameReadoutStart, frameReadoutEnd);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::execute(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    uint16_t focusPosition = 0;
-+    bool ret = mIpc.serverUnflattenExecute(pData, dataSize, &dvs, &focusPosition);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenExecute fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->execute(dvs, focusPosition);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, execute fails", __func__);
-+    return OK;
-+}
-+
-+status_t IntelDvsServer::getImageTransformation(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_dvs_state *dvs = nullptr;
-+    ia_dvs_image_transformation imageTransformation = {0};
-+    bool ret = mIpc.serverUnflattenImageTransformation(pData, dataSize, &dvs);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenImageTransformation fails", __func__);
-+
-+    IntelDvs *intelDvs = getIntelDvs(dvs);
-+    CheckError(intelDvs == nullptr, UNKNOWN_ERROR, "@%s, dvs:%p doesn't exist", __func__, dvs);
-+
-+    ia_err err = intelDvs->getImageTransformation(dvs, &imageTransformation);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "@%s, getImageTransformation fails", __func__);
-+
-+    ret = mIpc.serverFlattenImageTransformation(pData, dataSize, &imageTransformation);
-+    CheckError(ret == false, UNKNOWN_ERROR,
-+               "@%s, serverUnflattenImageTransformation fails", __func__);
-+    return OK;
-+}
-+
-+IntelDvs *IntelDvsServer::getIntelDvs(ia_dvs_state *dvs) {
-+    LOGIPC("@%s, dvs:%p", __func__, dvs);
-+
-+    if (mIntelDvss.find(dvs) == mIntelDvss.end()) {
-+        LOGE("@%s, dvs:%p doesn't exist", __func__, dvs);
-+        return nullptr;
-+    }
-+    IntelDvs *intelMkn = mIntelDvss[dvs].get();
-+
-+    return intelMkn;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
-new file mode 100644
-index 000000000000..a7fd8dee3b7b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.h
-@@ -0,0 +1,54 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelDvs.h"
-+#include "modules/sandboxing/IPCIntelDvs.h"
-+
-+namespace icamera {
-+class IntelDvsServer {
-+ public:
-+    IntelDvsServer();
-+    virtual ~IntelDvsServer();
-+
-+    status_t init(void *pData, int dataSize);
-+    status_t deinit(void *pData, int dataSize);
-+    status_t config(void *pData, int dataSize);
-+    status_t setNonBlankRatio(void *pData, int dataSize);
-+    status_t setDigitalZoomMode(void *pData, int dataSize);
-+    status_t setDigitalZoomRegion(void *pData, int dataSize);
-+    status_t setDigitalZoomCoordinate(void *pData, int dataSize);
-+    status_t setDigitalZoomMagnitude(void *pData, int dataSize);
-+    status_t freeMorphTable(void *pData, int dataSize);
-+    status_t allocateMorphTalbe(void *pData, int dataSize);
-+    status_t getMorphTalbe(void *pData, int dataSize);
-+    status_t setStatistics(void *pData, int dataSize);
-+    status_t execute(void *pData, int dataSize);
-+    status_t getImageTransformation(void *pData, int dataSize);
-+
-+ private:
-+    IntelDvs *getIntelDvs(ia_dvs_state *dvs);
-+
-+ private:
-+    std::unordered_map<ia_dvs_state*, std::unique_ptr<IntelDvs>> mIntelDvss;
-+    IPCIntelDvs mIpc;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
-new file mode 100644
-index 000000000000..44cd4becf048
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.cpp
-@@ -0,0 +1,62 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelFDServer"
-+
-+#include "modules/sandboxing/server/IntelFDServer.h"
-+
-+#include <pvl_types.h>
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelFDServer::IntelFDServer() {
-+    mFaceDetection = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
-+
-+    LOG1("@%s", __func__);
-+}
-+
-+IntelFDServer::~IntelFDServer() {
-+    LOG1("@%s", __func__);
-+}
-+
-+status_t IntelFDServer::init(void *pData, int dataSize) {
-+    LOG1("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionInitParams)),
-+               UNKNOWN_ERROR, "buffer is small");
-+
-+    return mFaceDetection->init(static_cast<FaceDetectionInitParams*>(pData), dataSize);
-+}
-+
-+status_t IntelFDServer::run(void *pData, int dataSize, void *imageData) {
-+    LOG1("@%s, pData:%p, dataSize:%d, imageData:%p", __func__, pData, dataSize, imageData);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < static_cast<int>(sizeof(FaceDetectionRunParams)),
-+               UNKNOWN_ERROR, "buffer is small");
-+
-+    pvl_image image;
-+    FaceDetectionRunParams *pFdRunParams = static_cast<FaceDetectionRunParams*>(pData);
-+    mIpcFD.serverUnflattenRun(*pFdRunParams, imageData, &image);
-+
-+    return mFaceDetection->run(&image, &pFdRunParams->results);
-+}
-+
-+status_t IntelFDServer::deinit() {
-+    LOG1("@%s", __func__);
-+    return mFaceDetection->deinit();
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
-new file mode 100644
-index 000000000000..59102e38fb9f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelFDServer.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelFaceDetection.h"
-+#include "modules/sandboxing/IPCIntelFD.h"
-+
-+namespace icamera {
-+class IntelFDServer {
-+ public:
-+    IntelFDServer();
-+    virtual ~IntelFDServer();
-+
-+    status_t init(void* pData, int dataSize);
-+    status_t run(void* pData, int dataSize, void *imageData);
-+    status_t deinit();
-+
-+ private:
-+    std::unique_ptr<IntelFaceDetection> mFaceDetection;
-+    IPCIntelFD mIpcFD;
-+};
-+}  /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
-new file mode 100644
-index 000000000000..d2b55397afe7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.cpp
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelLardServer"
-+
-+#include "modules/sandboxing/server/IntelLardServer.h"
-+
-+#include <memory>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelLardServer::IntelLardServer() {
-+    mLard = std::unique_ptr<IntelLard>(new IntelLard());
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelLardServer::~IntelLardServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+status_t IntelLardServer::init(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_binary_data binaryData = {nullptr, 0};
-+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &binaryData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    ia_lard* lard = mLard->init(&binaryData);
-+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, mLard.init fails", __func__);
-+
-+    ret = mIpc.serverFlattenInit(pData, dataSize, lard);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverflattenInit fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelLardServer::getTagList(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_lard* lard = nullptr;
-+    unsigned int mode_tag = LCMC_TAG;
-+
-+    bool ret = mIpc.serverUnflattenGetTagList(pData, dataSize, &lard, &mode_tag);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
-+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenGetTagList fails", __func__);
-+
-+    unsigned int num_tags = 0;
-+    const unsigned int* tags = nullptr;
-+
-+    ia_err ret1 = mLard->getTagList(lard, mode_tag, &num_tags, &tags);
-+    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.getTagList fails", __func__);
-+
-+    mIpc.serverFlattenGetTagList(pData, dataSize, num_tags, tags);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
-+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverFlattenGetTagList fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelLardServer::run(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_lard* lard = nullptr;
-+    ia_lard_input_params* inputParams = nullptr;
-+
-+    bool ret = mIpc.serverUnflattenRun(pData, dataSize, &lard, &inputParams);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
-+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
-+    CheckError(inputParams == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
-+
-+    ia_lard_results* result = nullptr;
-+    ia_err ret1 = mLard->run(lard, inputParams, &result);
-+    CheckError(ret1 != ia_err_none, UNKNOWN_ERROR, "@%s, mLard.run fails", __func__);
-+
-+    ret = mIpc.serverFlattenRun(pData, dataSize, result);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IntelLardServer::deinit(void* pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+
-+    ia_lard* lard = nullptr;
-+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &lard);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
-+    CheckError(lard == nullptr, UNKNOWN_ERROR, "@%s, serverUnflattenDeinit fails", __func__);
-+
-+    mLard->deinit(lard);
-+
-+    return OK;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
-new file mode 100644
-index 000000000000..d51c9468dbce
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLardServer.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "memory"
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelLard.h"
-+#include "modules/sandboxing/IPCIntelLard.h"
-+
-+namespace icamera {
-+class IntelLardServer {
-+ public:
-+    IntelLardServer();
-+    virtual ~IntelLardServer();
-+
-+    status_t init(void* pData, int dataSize);
-+    status_t getTagList(void* pData, int dataSize);
-+    status_t run(void* pData, int dataSize);
-+    status_t deinit(void* pData, int dataSize);
-+
-+ private:
-+    std::unique_ptr<IntelLard> mLard;
-+    IPCIntelLard mIpc;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
-new file mode 100644
-index 000000000000..173f2338e1d2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.cpp
-@@ -0,0 +1,108 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelLtmServer"
-+
-+#include "modules/sandboxing/server/IntelLtmServer.h"
-+
-+#include <utility>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelLtmServer::IntelLtmServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelLtmServer::~IntelLtmServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+int IntelLtmServer::init(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(LtmInitParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    LtmInitParams *params = static_cast<LtmInitParams*>(pData);
-+    ia_binary_data inData;
-+    uintptr_t mkn_hanlde;
-+    bool ret = mIpc.serverUnflattenInit(params, &inData, &mkn_hanlde);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    std::unique_ptr<IntelLtm> intelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
-+    ia_mkn *mkn = reinterpret_cast<ia_mkn *>(mkn_hanlde);
-+    ia_ltm *ltm = intelLtm->init(&inData, mkn);
-+
-+    ret = mIpc.serverFlattenInit(params, ltm);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenInit fails", __func__);
-+
-+    mIntelLtms[ltm] = std::move(intelLtm);
-+
-+    return OK;
-+}
-+
-+int IntelLtmServer::deinit(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(LtmDeinitParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    LtmDeinitParams *params = static_cast<LtmDeinitParams*>(pData);
-+    ia_ltm *ltm = reinterpret_cast<ia_ltm*>(params->ltm_handle);
-+    LOGIPC("@%s, params->ltm_handle:%p", __func__, ltm);
-+
-+    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
-+        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    mIntelLtms[ltm]->deinit(ltm);
-+    mIntelLtms.erase(ltm);
-+
-+    return OK;
-+}
-+
-+int IntelLtmServer::run(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(!pData, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(LtmRunParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    ia_ltm_input_params *inputParams = nullptr;
-+    ia_ltm *ltm = nullptr;
-+    bool ret = mIpc.serverUnflattenRun(pData, &ltm, &inputParams);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverUnflattenRun fails", __func__);
-+
-+    ia_ltm_results *ltmResults = nullptr;
-+    ia_ltm_drc_params *drcResults = nullptr;
-+
-+    if (mIntelLtms.find(ltm) == mIntelLtms.end()) {
-+        LOGE("@%s, ltm:%p doesn't exist", __func__, ltm);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    ia_err retErr = mIntelLtms[ltm]->run(ltm, inputParams, &ltmResults, &drcResults);
-+    CheckError(retErr != ia_err_none, UNKNOWN_ERROR, "@%s, mIntelLtms->run fails", __func__);
-+
-+    LtmRunParams *params = static_cast<LtmRunParams*>(pData);
-+    ret = mIpc.serverFlattenRun(*ltmResults, *drcResults, ltm, params);
-+    CheckError(!ret, UNKNOWN_ERROR, "@%s, serverFlattenRun fails", __func__);
-+
-+    return OK;
-+}
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
-new file mode 100644
-index 000000000000..b17b78cb2fee
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelLtmServer.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelLtm.h"
-+#include "modules/sandboxing/IPCIntelLtm.h"
-+
-+namespace icamera {
-+class IntelLtmServer {
-+ public:
-+    IntelLtmServer();
-+    virtual ~IntelLtmServer();
-+
-+    int init(void *pData, int dataSize);
-+    int deinit(void *pData, int dataSize);
-+    int run(void *pData, int dataSize);
-+
-+ private:
-+    std::unordered_map<ia_ltm*, std::unique_ptr<IntelLtm>> mIntelLtms;
-+    IPCIntelLtm mIpc;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
-new file mode 100644
-index 000000000000..271ae9a1db5d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.cpp
-@@ -0,0 +1,128 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelMknServer"
-+
-+#include "modules/sandboxing/server/IntelMknServer.h"
-+
-+#include <utility>
-+
-+#include "CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+IntelMknServer::IntelMknServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IntelMknServer::~IntelMknServer() {
-+    LOGIPC("@%s", __func__);
-+
-+    mIntelMkns.clear();
-+}
-+
-+int IntelMknServer::init(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(MknInitParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    MknInitParams *params = static_cast<MknInitParams*>(pData);
-+
-+    std::unique_ptr<IntelMkn> intelMnk = std::make_unique<IntelMkn>();
-+    ia_mkn *mkn = intelMnk->init(params->mkn_config_bits,
-+                                 params->mkn_section_1_size,
-+                                 params->mkn_section_2_size);
-+    CheckError(mkn == nullptr, UNKNOWN_ERROR, "@%s, mkn.init fails", __func__);
-+
-+    params->results = reinterpret_cast<uintptr_t>(mkn);
-+    LOGIPC("@%s, mkn:%p, params->results:%", __func__, mkn, params->results);
-+
-+    mIntelMkns[mkn] = std::move(intelMnk);
-+
-+    return OK;
-+}
-+
-+int IntelMknServer::deinit(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(MknDeinitParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    MknDeinitParams *params = static_cast<MknDeinitParams*>(pData);
-+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
-+    LOGIPC("@%s, params->mkn_handle:%p", __func__, mkn);
-+
-+    IntelMkn *intelMnk = getIntelMkn(mkn);
-+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
-+
-+    intelMnk->deinit(mkn);
-+    mIntelMkns.erase(mkn);
-+
-+    return OK;
-+}
-+
-+int IntelMknServer::prepare(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(MknPrepareParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    MknPrepareParams *params = static_cast<MknPrepareParams*>(pData);
-+
-+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
-+    ia_binary_data data;
-+
-+    IntelMkn *intelMnk = getIntelMkn(mkn);
-+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
-+
-+    int ret = intelMnk->prepare(mkn, params->data_target, &data);
-+    CheckError(ret != OK, NO_MEMORY, "Failed to prepare makernote");
-+    LOGIPC("@%s, data.size:%d, data.data:%p", __func__, data.size, data.data);
-+
-+    bool retFlag = mIpc.serverFlattenPrepare(data, params);
-+    CheckError(retFlag == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepare fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelMknServer::enable(void *pData, int dataSize) {
-+    LOGIPC("@%s, pData:%p, dataSize:%d", __func__, pData, dataSize);
-+    CheckError(pData == nullptr, UNKNOWN_ERROR, "@%s, pData is nullptr", __func__);
-+    CheckError(dataSize < sizeof(MknEnableParams),
-+               UNKNOWN_ERROR, "@%s, buffer is small", __func__);
-+
-+    MknEnableParams *params = static_cast<MknEnableParams*>(pData);
-+    ia_mkn *mkn = reinterpret_cast<ia_mkn*>(params->mkn_handle);
-+
-+    IntelMkn *intelMnk = getIntelMkn(mkn);
-+    CheckError(intelMnk == nullptr, UNKNOWN_ERROR, "@%s, mkn:%p doesn't exist", __func__, mkn);
-+
-+    return intelMnk->enable(mkn, params->enable_data_collection);
-+}
-+
-+IntelMkn *IntelMknServer::getIntelMkn(ia_mkn *mkn) {
-+    LOGIPC("@%s, mkn:%p", __func__, mkn);
-+
-+    if (mIntelMkns.find(mkn) == mIntelMkns.end()) {
-+        LOGE("@%s, mkn:%p doesn't exist", __func__, mkn);
-+        return nullptr;
-+    }
-+
-+    return mIntelMkns[mkn].get();
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
-new file mode 100644
-index 000000000000..f392dc3fc978
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelMknServer.h
-@@ -0,0 +1,45 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelMkn.h"
-+#include "modules/sandboxing/IPCIntelMkn.h"
-+
-+namespace icamera {
-+class IntelMknServer {
-+ public:
-+    IntelMknServer();
-+    virtual ~IntelMknServer();
-+
-+    int init(void* pData, int dataSize);
-+    int deinit(void* pData, int dataSize);
-+
-+    int enable(void *pData, int dataSize);
-+    int prepare(void *pData, int dataSize);
-+
-+ private:
-+    IntelMkn *getIntelMkn(ia_mkn *mkn);
-+
-+ private:
-+    std::unordered_map<ia_mkn*, std::unique_ptr<IntelMkn>> mIntelMkns;
-+    IPCIntelMkn mIpc;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
-new file mode 100644
-index 000000000000..d3057e0e8619
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
-@@ -0,0 +1,215 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IntelPGParamS"
-+
-+#include "modules/sandboxing/server/IntelPGParamServer.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+IntelPGParamServer::IntelPGParamServer() {
-+}
-+
-+IntelPGParamServer::~IntelPGParamServer() {
-+}
-+
-+int IntelPGParamServer::init(void* pData, int dataSize) {
-+    int pgId = 0;
-+    uintptr_t client = 0;
-+    ia_p2p_platform_t platform = IA_P2P_PLATFORM_IPU6;
-+    PgConfiguration pgConfig;
-+
-+    bool ret = mIpc.serverUnflattenInit(pData, dataSize, &pgId, &client, &platform, &pgConfig);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    PGParamPackage package;
-+    package.pgId = pgId;
-+    package.mPayloadCount = 0;
-+    CLEAR(package.mPayloads);
-+    package.mPGBuffer = nullptr;
-+    mPGParamPackages[client] = package;
-+    mPGParamPackages[client].mPGParamAdapt =
-+                             std::shared_ptr<IntelPGParam>(new IntelPGParam(pgId));
-+    int result = mPGParamPackages[client].mPGParamAdapt->init(platform, pgConfig);
-+    CheckError(result != OK, result, "@%s, init fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::prepare(void* pData, int dataSize, void* palDataAddr) {
-+    uintptr_t client = 0;
-+    ia_binary_data ipuParameters = {nullptr, 0};
-+    ia_css_rbm_t* rbm = nullptr;
-+    ia_css_kernel_bitmap_t* bitmap = nullptr;
-+    bool ret = mIpc.serverUnflattenPrepare(pData, dataSize, &client, palDataAddr,
-+                                           &ipuParameters, &rbm, &bitmap);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepare fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+
-+    int result = mPGParamPackages[client].mPGParamAdapt->prepare(&ipuParameters, rbm, bitmap);
-+    CheckError(result != OK, result, "@%s, prepare fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::allocatePGBuffer(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+    int pgSize = 0;
-+    bool ret = mIpc.serverUnflattenAllocatePGBuffer(pData, dataSize, &client, &pgSize);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePGBuffer fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+
-+    // Get server data pointer of PGBuffer
-+    void* pgBuffer = nullptr;
-+    ret = mIpc.assignPGBuffer(pData, dataSize, pgSize, &pgBuffer);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, assignPGBuffer fails", __func__);
-+
-+    mPGParamPackages[client].mPGBuffer = reinterpret_cast<ia_css_process_group_t*>(pgBuffer);
-+    return OK;
-+}
-+
-+int IntelPGParamServer::getFragmentDescriptors(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+    int descCount = 0;
-+    ia_p2p_fragment_desc* descs = nullptr;
-+    bool ret = mIpc.serverUnflattenGetFragDescs(pData, dataSize, &client, &descCount, &descs);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetFragDescs fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+
-+    int count = mPGParamPackages[client].mPGParamAdapt->getFragmentDescriptors(descCount, descs);
-+    CheckError(count <= 0, count, "@%s, getFragmentDescriptors fails", __func__);
-+
-+    ret = mIpc.serverFlattenGetFragDescs(pData, dataSize, count);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenGetFragDescs fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::setPGAndPrepareProgram(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+    bool ret = mIpc.serverUnflattenPrepareProgram(pData, dataSize, &client);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenPrepareProgram fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+    PGParamPackage& package = mPGParamPackages[client];
-+
-+    int result = package.mPGParamAdapt->setPGAndPrepareProgram(package.mPGBuffer);
-+    CheckError(result != OK, result, "@%s, setPGAndPrepareProgram fails", __func__);
-+
-+    // Get payload size here
-+    package.mPayloadCount = package.mPGParamAdapt->getPayloadSizes(ARRAY_SIZE(package.mPayloads),
-+                                                                   package.mPayloads);
-+    CheckError(!package.mPayloadCount, UNKNOWN_ERROR, "@%s, getPayloadSizes fails", __func__);
-+
-+    ret = mIpc.serverFlattenPrepareProgram(pData, dataSize,
-+                                           package.mPayloadCount, package.mPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenPrepareProgram fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::allocatePayloads(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+    int clientPayloadCount = 0;
-+    ia_binary_data* clientPayloads = nullptr;
-+    bool ret = mIpc.serverUnflattenAllocatePayloads(pData, dataSize, &client,
-+                                                    &clientPayloadCount, &clientPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenAllocatePayloads fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+    PGParamPackage& package = mPGParamPackages[client];
-+
-+    // Check size here only because shared memory is allocated in client
-+    CheckError(clientPayloadCount != package.mPayloadCount, UNKNOWN_ERROR,
-+               "@%s, payloadCount errror", __func__);
-+    for (int i = 0; i < clientPayloadCount; i++) {
-+         CheckError(clientPayloads[i].size != package.mPayloads[i].size, UNKNOWN_ERROR,
-+                    "@%s, payload size error for term %d", __func__, i);
-+    }
-+
-+    // Get server data pointer of payloads
-+    ret = mIpc.assignPayloads(pData, dataSize, package.mPayloadCount, package.mPayloads);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, assignPayloads fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::updatePALAndEncode(void* pData, int dataSize, void* palDataAddr) {
-+    uintptr_t client = 0;
-+    ia_binary_data ipuParameters = {nullptr, 0};
-+
-+    bool ret = mIpc.serverUnflattenEncode(pData, dataSize, &client, palDataAddr, &ipuParameters);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenEncode fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+    PGParamPackage& package = mPGParamPackages[client];
-+
-+    int result = package.mPGParamAdapt->updatePALAndEncode(&ipuParameters,
-+                                                           package.mPayloadCount,
-+                                                           &package.mPayloads[0]);
-+    CheckError(result != OK, result, "@%s, updatePALAndEncode fails", __func__);
-+
-+    return OK;
-+}
-+
-+int IntelPGParamServer::decode(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+    ia_binary_data statistics = {nullptr, 0};
-+
-+    bool ret = mIpc.serverUnflattenDecode(pData, dataSize, &client);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDecode fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               UNKNOWN_ERROR, "%s, the pg doesn't exist in the table", __func__);
-+    PGParamPackage& package = mPGParamPackages[client];
-+
-+    int result = package.mPGParamAdapt->decode(package.mPayloadCount, &package.mPayloads[0],
-+                                               &statistics);
-+    CheckError(result != OK, result, "@%s, decode fails", __func__);
-+
-+    ret = mIpc.serverFlattenDecode(pData, dataSize, statistics);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenDecode fails", __func__);
-+
-+    return OK;
-+}
-+
-+void IntelPGParamServer::deinit(void* pData, int dataSize) {
-+    uintptr_t client = 0;
-+
-+    bool ret = mIpc.serverUnflattenDeinit(pData, dataSize, &client);
-+    CheckError(ret == false, VOID_VALUE, "@%s, serverUnflattenDeinit fails", __func__);
-+
-+    CheckError((mPGParamPackages.find(client) == mPGParamPackages.end()),
-+               VOID_VALUE, "%s, the pg doesn't exist in the table", __func__);
-+
-+    mPGParamPackages[client].mPGParamAdapt->deinit();
-+    mPGParamPackages.erase(client);
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
-new file mode 100644
-index 000000000000..06ac128124d4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "modules/algowrapper/IntelPGParam.h"
-+#include "modules/sandboxing/IPCIntelPGParam.h"
-+
-+namespace icamera {
-+
-+class IntelPGParamServer {
-+ public:
-+    IntelPGParamServer();
-+    ~IntelPGParamServer();
-+
-+    int init(void* pData, int dataSize);
-+    int prepare(void* pData, int dataSize, void* palDataAddr);
-+    int allocatePGBuffer(void* pData, int dataSize);
-+    int getFragmentDescriptors(void* pData, int dataSize);
-+    int setPGAndPrepareProgram(void* pData, int dataSize);
-+    int allocatePayloads(void* pData, int dataSize);
-+    int updatePALAndEncode(void* pData, int dataSize, void* palDataAddr);
-+    int decode(void* pData, int dataSize);
-+    void deinit(void* pData, int dataSize);
-+
-+ private:
-+    struct PGParamPackage {
-+        int pgId;
-+        std::shared_ptr<IntelPGParam> mPGParamAdapt;
-+        ia_binary_data mPayloads[IPU_MAX_TERMINAL_COUNT];
-+        int mPayloadCount;
-+        ia_css_process_group_t* mPGBuffer;
-+    };
-+
-+    IPCIntelPGParam mIpc;
-+    std::unordered_map<uintptr_t, PGParamPackage> mPGParamPackages;
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
-new file mode 100644
-index 000000000000..3ceb99a157fc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.cpp
-@@ -0,0 +1,158 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IspParamAdaptorServer"
-+
-+#include "modules/sandboxing/server/IspParamAdaptorServer.h"
-+
-+#include <utility>
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+IspParamAdaptorServer::IspParamAdaptorServer() {
-+    LOGIPC("@%s", __func__);
-+}
-+
-+IspParamAdaptorServer::~IspParamAdaptorServer() {
-+    LOGIPC("@%s", __func__);
-+    mIspParamAdaptors.clear();
-+}
-+
-+status_t IspParamAdaptorServer::init(void *pData, int size) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtInitParam),
-+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
-+
-+    IspBxtInitParam *params = static_cast<IspBxtInitParam*>(pData);
-+
-+    ia_binary_data *ispData = nullptr;
-+    ia_cmc_t *cmcData = nullptr;
-+    bool ret = mIpc.serverUnflattenInit(params, size, &ispData, &cmcData);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenInit fails", __func__);
-+
-+    std::unique_ptr<IntelIspParamAdaptor> adaptor = std::make_unique<IntelIspParamAdaptor>();
-+    ia_isp_bxt *ispHandle = adaptor->init(ispData, cmcData, params->maxStatsWidth,
-+                                          params->maxStatsHeight,
-+                                          params->maxStatsIn, params->iaMkn);
-+    CheckError(!ispHandle, UNKNOWN_ERROR, "@%s, init isp param adaptor failed", __func__);
-+
-+    params->ispRemoteHandle = reinterpret_cast<uintptr_t>(ispHandle);
-+    LOGIPC("@%s ispHandle %p: %d", __func__, ispHandle, params->ispRemoteHandle);
-+
-+    mIspParamAdaptors[ispHandle] = std::move(adaptor);
-+
-+    return OK;
-+}
-+
-+status_t IspParamAdaptorServer::deInit(void *pData, int size) {
-+    LOGIPC("@%s", __func__);
-+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(IspBxtDeInitParam),
-+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
-+
-+    ia_isp_bxt *ispHandle = nullptr;
-+    bool ret = mIpc.serverUnflattenDeInit(pData, size, &ispHandle);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenDeInit fails", __func__);
-+
-+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
-+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
-+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
-+               "%s, IntelIspParamAdaptor is nullptr", __func__);
-+
-+    mIspParamAdaptors[ispHandle]->deInit(ispHandle);
-+    mIspParamAdaptors.erase(ispHandle);
-+
-+    return OK;
-+}
-+
-+int IspParamAdaptorServer::getPalDataSize(void *pData, int size) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(PalDataSizeParam),
-+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
-+
-+    ia_isp_bxt_program_group *programGroup = nullptr;
-+    bool ret = mIpc.serverUnflattenGetPalSize(pData, size, &programGroup);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenGetPalSize fails", __func__);
-+
-+    CheckError(mIspParamAdaptors.empty(),
-+               UNKNOWN_ERROR, "%s, mIspParamAdaptors is empty", __func__);
-+    int palSize = mIspParamAdaptors.begin()->second->getPalDataSize(programGroup);
-+    LOGIPC("%s, The pal data size: %d", __func__, palSize);
-+
-+    PalDataSizeParam *params = static_cast<PalDataSizeParam*>(pData);
-+    params->palDataSize = palSize;
-+
-+    return OK;
-+}
-+
-+status_t IspParamAdaptorServer::queryAndConvertStats(void *pData, int size) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
-+    CheckError(size < sizeof(ConvertStatsParam),
-+               UNKNOWN_ERROR, "%s, buffer is small", __func__);
-+
-+    ia_isp_bxt *ispHandle = nullptr;
-+    ConvertInputParam inputParams = {};
-+    ConvertResult result = {};
-+
-+    bool ret = mIpc.serverUnflattenConvertStats(pData, size, &ispHandle, &inputParams, &result);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenConvertStats fails", __func__);
-+
-+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
-+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
-+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
-+               "%s, IntelIspParamAdaptor is nullptr", __func__);
-+
-+    int res = mIspParamAdaptors[ispHandle]->queryAndConvertStats(ispHandle, &inputParams, &result);
-+    CheckError(res != OK, res, "%s, Failed to convert the status", __func__);
-+
-+    ret = mIpc.serverFlattenConvertStats(pData, size, result);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverFlattenConvertStats fails", __func__);
-+
-+    return OK;
-+}
-+
-+status_t IspParamAdaptorServer::runPal(void *pData, int size, void *palDataAddr) {
-+    LOGIPC("@%s, pData:%p, size:%d", __func__, pData, size);
-+    CheckError(!pData, UNKNOWN_ERROR, "%s, pData is nullptr", __func__);
-+    CheckError(!palDataAddr, UNKNOWN_ERROR, "%s, palDataAddr is nullptr", __func__);
-+
-+    ia_isp_bxt *ispHandle = nullptr;
-+    ia_isp_bxt_input_params_v2 *inputParams = nullptr;
-+    ia_binary_data *palOutput = nullptr;
-+
-+    bool ret = mIpc.serverUnflattenRunPal(pData, size, &ispHandle, &inputParams, &palOutput);
-+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, serverUnflattenRunPal fails", __func__);
-+    palOutput->data = palDataAddr;
-+    LOGIPC("%s, palDataAddr: %p, size: %d", __func__, palDataAddr, palOutput->size);
-+
-+    CheckError((mIspParamAdaptors.find(ispHandle) == mIspParamAdaptors.end()),
-+               UNKNOWN_ERROR, "%s, the isp handle doesn't exist in the table", __func__);
-+    CheckError(!mIspParamAdaptors[ispHandle], UNKNOWN_ERROR,
-+               "%s, IntelIspParamAdaptor is nullptr", __func__);
-+
-+    int res = mIspParamAdaptors[ispHandle]->runPal(ispHandle, inputParams, palOutput);
-+    CheckError(res != OK, res, "%s, Failed to run pal", __func__);
-+    LOGIPC("%s, the pal data size is: %d after running", __func__, palOutput->size);
-+
-+    return OK;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
-new file mode 100644
-index 000000000000..0d6a5e799433
---- /dev/null
-+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IspParamAdaptorServer.h
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <unordered_map>
-+
-+#include "iutils/Errors.h"
-+#include "modules/algowrapper/IntelIspParamAdaptor.h"
-+#include "modules/sandboxing/IPCIspParamAdaptor.h"
-+
-+namespace icamera {
-+
-+class IspParamAdaptorServer {
-+ public:
-+    IspParamAdaptorServer();
-+    virtual ~IspParamAdaptorServer();
-+
-+    status_t init(void *pData, int size);
-+    status_t deInit(void *pData, int size);
-+    status_t getPalDataSize(void *pData, int size);
-+    status_t runPal(void *pData, int size, void *palDataAddr);
-+    status_t queryAndConvertStats(void *pData, int size);
-+
-+ private:
-+    IPCIspParamAdaptor mIpc;
-+    std::unordered_map<ia_isp_bxt*, std::unique_ptr<IntelIspParamAdaptor> > mIspParamAdaptors;
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.cpp b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
-new file mode 100644
-index 000000000000..cc57591593e6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
-@@ -0,0 +1,982 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqCore"
-+
-+#include <math.h>
-+
-+#include <memory>
-+#include <string>
-+
-+#include "PlatformData.h"
-+#include "MakerNote.h"
-+#include "AiqUtils.h"
-+#include "Parameters.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+#include "AiqCore.h"
-+
-+namespace icamera {
-+#define VALID_COLOR_GAINS(colorGains) (colorGains[0] > 0 && colorGains[1] > 0 && \
-+                                       colorGains[2] > 0 && colorGains[3] > 0)
-+AiqCore::AiqCore(int cameraId) :
-+    mCameraId(cameraId),
-+    mAeForceLock(false),
-+    mAwbForceLock(false),
-+    mAfForceLock(false),
-+    mIntel3AResult(nullptr),
-+    mLastAeResult(nullptr),
-+    mLastAwbResult(nullptr),
-+    mLastAfResult(nullptr),
-+    mAeRunTime(0),
-+    mAwbRunTime(0),
-+    mAiqState(AIQ_NOT_INIT),
-+    mUseManualColorMatrix(false),
-+    mHyperFocalDistance(0.0f),
-+    mTuningMode(TUNING_MODE_MAX),
-+    mShadingMode(SHADING_MODE_FAST),
-+    mLensShadingMapMode(LENS_SHADING_MAP_MODE_OFF) {
-+    LOG3A("@%s", __func__);
-+
-+    mIntel3AParameter = std::unique_ptr<Intel3AParameter>(new Intel3AParameter(cameraId));
-+    mIntel3AResult = std::unique_ptr<Intel3AResult>(new Intel3AResult());
-+
-+    CLEAR(mFrameParams);
-+    CLEAR(mGbceParams);
-+    CLEAR(mPaParams);
-+    CLEAR(mSaParams);
-+    CLEAR(mColorMatrix);
-+    CLEAR(mColorGains);
-+    CLEAR(mIntelAiqHandle);
-+    CLEAR(mIntelAiqHandleStatus);
-+    CLEAR(mPaColorGains);
-+
-+    CLEAR(mResizeLscGridR);
-+    CLEAR(mResizeLscGridGr);
-+    CLEAR(mResizeLscGridGb);
-+    CLEAR(mResizeLscGridB);
-+
-+    // init LscOffGrid to 1.0f
-+    std::fill(std::begin(mLscOffGrid), std::end(mLscOffGrid), 1.0f);
-+
-+}
-+
-+AiqCore::~AiqCore() {
-+    LOG3A("@%s", __func__);
-+
-+    for (int i = 0; i < TUNING_MODE_MAX; i++) {
-+        if (mIntelAiqHandle[i]) {
-+            delete mIntelAiqHandle[i];
-+        }
-+    }
-+}
-+
-+int AiqCore::initAiqPlusParams() {
-+    LOG3A("@%s", __func__);
-+
-+    CLEAR(mFrameParams);
-+    CLEAR(mGbceParams);
-+    CLEAR(mPaParams);
-+    CLEAR(mPaColorGains);
-+    CLEAR(mSaParams);
-+    CLEAR(mColorMatrix);
-+    CLEAR(mColorGains);
-+
-+    mUseManualColorMatrix = false;
-+
-+    mGbceParams.gbce_level = ia_aiq_gbce_level_use_tuning;
-+    mGbceParams.frame_use = ia_aiq_frame_use_video;
-+    mGbceParams.ev_shift = 0;
-+    mGbceParams.tone_map_level = ia_aiq_tone_map_level_use_tuning;
-+
-+    mPaParams.color_gains = nullptr;
-+
-+    mSaParams.sensor_frame_params = &mFrameParams;
-+    /* use convergence time from tunings */
-+    mSaParams.manual_convergence_time = -1.0;
-+
-+    return OK;
-+}
-+
-+int AiqCore::init() {
-+    LOG3A("@%s", __func__);
-+
-+    initAiqPlusParams();
-+
-+#ifndef ENABLE_SANDBOXING
-+    ia_env env = {&Log::ccaPrintDebug, &Log::ccaPrintError, &Log::ccaPrintInfo};
-+    ia_log_init(&env);
-+#endif
-+
-+    mAiqState = AIQ_INIT;
-+
-+    int ret = mIntel3AParameter->init();
-+    CheckError(ret != OK, ret, "@%s, Init 3a parameter failed ret: %d", __func__, ret);
-+
-+    mLastAeResult = nullptr;
-+    mLastAwbResult = nullptr;
-+    mLastAfResult = nullptr;
-+    mAeRunTime = 0;
-+    mAwbRunTime = 0;
-+
-+    return OK;
-+}
-+
-+void AiqCore::deinitIntelAiqHandle() {
-+    LOG3A("@%s", __func__);
-+
-+    for (auto mode = 0; mode < TUNING_MODE_MAX; mode++) {
-+        IntelAiq* aiq = mIntelAiqHandle[mode];
-+        if (!aiq) continue;
-+
-+        if (PlatformData::isAiqdEnabled(mCameraId)) {
-+            ia_binary_data outData = {nullptr, 0};
-+            ia_err iaErr = aiq->getAiqdData(&outData);
-+            if (AiqUtils::convertError(iaErr) == OK) {
-+                AiqdData* aiqdData =
-+                    PlatformData::getAiqdData(mCameraId, static_cast<TuningMode>(mode));
-+                aiqdData->saveAiqdData(&outData);
-+            } else {
-+                LOGW("@%s, failed to get aiqd data, iaErr %d", __func__, iaErr);
-+            }
-+        }
-+        aiq->deinit();
-+        delete aiq;
-+        mIntelAiqHandle[mode] = nullptr;
-+    }
-+    CLEAR(mIntelAiqHandleStatus);
-+}
-+
-+int AiqCore::deinit() {
-+    LOG3A("@%s", __func__);
-+
-+#ifndef ENABLE_SANDBOXING
-+    ia_log_deinit();
-+#endif
-+
-+    deinitIntelAiqHandle();
-+
-+    mAiqState = AIQ_NOT_INIT;
-+
-+    return OK;
-+}
-+
-+int AiqCore::initIntelAiqHandle(const std::vector<TuningMode>& tuningModes) {
-+    LOG3A("@%s", __func__);
-+
-+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
-+    CheckError(!cpf, NO_INIT, "@%s, No CPF for cameraId: %d", __func__, mCameraId);
-+
-+    ia_mkn* mkn = MakerNote::getInstance(mCameraId)->getMknHandle();
-+    CheckError(!mkn, NO_INIT, "@%s, getMknHandle fails", __func__);
-+
-+    ia_binary_data *nvmData = static_cast<ia_binary_data*>(PlatformData::getNvmData(mCameraId));
-+    ia_binary_data aiqData = {nullptr, 0};
-+    // Initialize mIntelAiqHandle array based on different cpf data
-+    for (auto & mode : tuningModes) {
-+        uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
-+        int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr, &cmcHandle, mode);
-+        CheckError(ret != OK, BAD_VALUE, "@%s, getDataAndCmc fails", __func__);
-+
-+        ia_binary_data* aiqd = nullptr;
-+        if (PlatformData::PlatformData::isAiqdEnabled(mCameraId)) {
-+            AiqdData* aiqdData = PlatformData::getAiqdData(mCameraId, mode);
-+            aiqd = aiqdData ? aiqdData->getAiqdData() : nullptr;
-+        }
-+
-+        int statsNum = PlatformData::getExposureNum(mCameraId,
-+                           CameraUtils::isMultiExposureCase(mode));
-+        {
-+            IntelAiq* intelAiq = new IntelAiq();
-+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->init", 1);
-+            ia_aiq* aiq = intelAiq->init(&(aiqData),
-+                                        nvmData,
-+                                        aiqd,
-+                                        MAX_STATISTICS_WIDTH,
-+                                        MAX_STATISTICS_HEIGHT,
-+                                        statsNum,
-+                                        reinterpret_cast<ia_cmc_t*>(cmcHandle),
-+                                        mkn);
-+            if (aiq) {
-+                mIntelAiqHandle[mode] = intelAiq;
-+
-+                std::string aiqVersion;
-+                intelAiq->getVersion(&aiqVersion);
-+                LOGI("@%s, AIQ VERSION: %s", __func__, aiqVersion.c_str());
-+            } else {
-+                mIntelAiqHandle[mode] = nullptr;
-+                delete intelAiq;
-+            }
-+        }
-+        CheckError(!mIntelAiqHandle[mode], NO_INIT, "@%s: init aiq failed!", __func__);
-+        mIntelAiqHandleStatus[mode] = true;
-+    }
-+
-+    return OK;
-+}
-+
-+int AiqCore::configure(const std::vector<ConfigMode>& configModes) {
-+    LOG3A("@%s", __func__);
-+
-+    int ret = OK;
-+    bool allTuningModeConfiged = true;
-+    std::vector<TuningMode> tuningModes;
-+    for (auto cfg : configModes) {
-+        TuningMode mode;
-+        ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, mode);
-+        CheckError(ret != OK, ret, "%s: getTuningModeByConfigMode fails, cfg:%d", __func__, cfg);
-+        tuningModes.push_back(mode);
-+
-+        if (!mIntelAiqHandle[mode]) {
-+            allTuningModeConfiged = false;
-+        }
-+    }
-+
-+    if (mAiqState == AIQ_CONFIGURED && allTuningModeConfiged) {
-+        return OK;
-+    }
-+
-+    deinitIntelAiqHandle();
-+
-+    ret = initIntelAiqHandle(tuningModes);
-+    if (ret == OK) {
-+        mAiqState = AIQ_CONFIGURED;
-+    }
-+
-+    return OK;
-+}
-+
-+int AiqCore::setSensorInfo(const ia_aiq_frame_params &frameParams,
-+                           const ia_aiq_exposure_sensor_descriptor &descriptor) {
-+    LOG3A("@%s", __func__);
-+
-+    mFrameParams = frameParams;
-+    mIntel3AParameter->setSensorInfo(descriptor);
-+
-+    return OK;
-+}
-+
-+/**
-+ *  Hyperfocal distance is the closest distance at which a lens can be focused
-+ *  while keeping objects at infinity acceptably sharp. When the lens is focused
-+ *  at this distance, all objects at distances from half of the hyperfocal
-+ *  distance out to infinity will be acceptably sharp.
-+ *
-+ *  The equation used for this is:
-+ *        f*f
-+ *  H = -------
-+ *        N*c
-+ *
-+ *  where:
-+ *   f is the focal length
-+ *   N is the f-number (f/D for aperture diameter D)
-+ *   c is the Circle Of Confusion (COC)
-+ *
-+ *   the COC is calculated as the pixel width of 2 pixels
-+ *
-+ *  The hyperfocal distance in mm. It is ensured it will never be 0 to
-+ *  avoid division by 0. If any of the required CMC items is missing
-+ *  it will return the default value 5m
-+ */
-+int AiqCore::calculateHyperfocalDistance(TuningMode mode) {
-+    LOG3A("@%s, tuning mode: %d", __func__, mode);
-+
-+    CpfStore *cpf = PlatformData::getCpfStore(mCameraId);
-+    CheckError(!cpf, BAD_VALUE, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
-+    ia_cmc_t *cmcData = nullptr;
-+    int ret = cpf->getDataAndCmc(nullptr, nullptr, nullptr, nullptr, mode, &cmcData);
-+    CheckError(ret != OK || !cmcData, BAD_VALUE, "@%s get cmc data failed", __func__);
-+
-+    float pixelSizeMicro = 100.0f;  // size of pixels in um, default to avoid division by 0
-+    float focalLengthMillis = 0.0f;
-+    const float DEFAULT_HYPERFOCAL_DISTANCE = 5000.0f;
-+
-+    cmc_optomechanics_t *optoInfo = cmcData->cmc_parsed_optics.cmc_optomechanics;
-+    if (optoInfo) {
-+        // Pixel size is stored in CMC in hundreds of micrometers
-+        pixelSizeMicro = optoInfo->sensor_pix_size_h / 100;
-+        // focal length is stored in CMC in hundreds of millimeters
-+        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
-+    }
-+
-+    // fixed aperture, the fn should be divided 100 because the value
-+    // is multiplied 100 in cmc avoid division by 0
-+    if (!cmcData->cmc_parsed_optics.lut_apertures ||
-+        cmcData->cmc_parsed_optics.lut_apertures[0] == 0) {
-+        LOG3A("lut apertures is not provided or zero in the cmc. Using default");
-+        mHyperFocalDistance = DEFAULT_HYPERFOCAL_DISTANCE;
-+        return OK;
-+    }
-+
-+    float fNumber = static_cast<float>(cmcData->cmc_parsed_optics.lut_apertures[0]) / 100;
-+    // assuming square pixel
-+    const int CIRCLE_OF_CONFUSION_IN_PIXELS = 2;
-+    float cocMicros = pixelSizeMicro * CIRCLE_OF_CONFUSION_IN_PIXELS;
-+    float hyperfocalDistanceMillis = 1000 * (focalLengthMillis * focalLengthMillis) /
-+                                     (fNumber * cocMicros);
-+
-+    mHyperFocalDistance = (hyperfocalDistanceMillis == 0.0f) ? DEFAULT_HYPERFOCAL_DISTANCE :
-+                          hyperfocalDistanceMillis;
-+
-+    return OK;
-+}
-+
-+/**
-+ *
-+ * Calculate the Depth of field (DOF) for a given AF Result.
-+ *
-+ * The Formulas to calculate the near and afar DOF are:
-+ *          H * s
-+ * Dn = ---------------
-+ *         H + (s-f)
-+ *
-+ *          H * s
-+ * Df =  ------------
-+ *         H - (s-f)
-+ *
-+ * Where:
-+ * H is the hyperfocal distance (that we get from CPF) (it cannot be 0)
-+ * s is the distance to focused object (current focus distance)
-+ * f is the focal length
-+ *
-+ * \param[in] afResults with current focus distance in mm
-+ * \param[out] dof info: DOF for near and far limit in diopters
-+ */
-+int AiqCore::calculateDepthOfField(const ia_aiq_af_results &afResults,
-+                                   camera_range_t *focusRange) {
-+    LOG3A("@%s, afResults:%p, focusRange:%p", __func__, afResults, focusRange);
-+    CheckError(!focusRange, BAD_VALUE, "@%s, Bad input values", __func__);
-+
-+    const float DEFAULT_DOF = 5000.0f;
-+    focusRange->min = 1000.0f / DEFAULT_DOF;
-+    focusRange->max = 1000.0f / DEFAULT_DOF;
-+
-+    float focusDistance = 1.0f * afResults.current_focus_distance;
-+    if (focusDistance == 0.0f) {
-+        // Not reporting error since this may be normal in fixed focus sensors
-+        return OK;
-+    }
-+
-+    ia_cmc_t *cmcData = nullptr;
-+    cmc_optomechanics_t *optoInfo = nullptr;
-+    CpfStore *cpf = PlatformData::getCpfStore(mCameraId);
-+    if (cpf) {
-+        cpf->getDataAndCmc(nullptr, nullptr, nullptr, nullptr, mTuningMode, &cmcData);
-+    }
-+    if (cmcData) {
-+        optoInfo = cmcData->cmc_parsed_optics.cmc_optomechanics;
-+    }
-+
-+    float focalLengthMillis = 2.3f;
-+    if (optoInfo) {
-+        // focal length is stored in CMC in hundreds of millimeters
-+        focalLengthMillis = static_cast<float>(optoInfo->effect_focal_length) / 100;
-+    }
-+
-+    float num = mHyperFocalDistance * focusDistance;
-+    float denom = (mHyperFocalDistance + focusDistance - focalLengthMillis);
-+    if (denom != 0.0f) {
-+        focusRange->min = num / denom;
-+    }
-+
-+    denom = (mHyperFocalDistance - focusDistance + focalLengthMillis);
-+    if (denom != 0.0f) {
-+        focusRange->max = num / denom;
-+    }
-+
-+    focusRange->min = 1000.0f / focusRange->min;
-+    focusRange->max = 1000.0f / focusRange->max;
-+
-+    return OK;
-+}
-+
-+int AiqCore::updateParameter(const aiq_parameter_t &param) {
-+    LOG3A("@%s", __func__);
-+
-+    mUseManualColorMatrix = (param.awbMode == AWB_MODE_MANUAL_COLOR_TRANSFORM);
-+    mColorMatrix = param.manualColorMatrix;
-+    mColorGains = param.manualColorGains;
-+
-+    if (mTuningMode != param.tuningMode) {
-+        int ret = calculateHyperfocalDistance(param.tuningMode);
-+        CheckError(ret != OK, ret, "%s calculateHyperfocalDistance fails", __func__);
-+        mTuningMode = param.tuningMode;
-+    }
-+    mShadingMode = param.shadingMode;
-+    mLensShadingMapMode = param.lensShadingMapMode;
-+    mLensShadingMapSize = param.lensShadingMapSize;
-+
-+    mGbceParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
-+
-+    // In still frame use force update by setting convergence time to 0.
-+    // in other cases use tunings.
-+    mSaParams.manual_convergence_time = (param.frameUsage == FRAME_USAGE_STILL) ? 0.0 : -1.0;
-+
-+    mIntel3AParameter->updateParameter(param);
-+    mAeForceLock = param.aeForceLock;
-+    mAwbForceLock = param.awbForceLock;
-+    mAfForceLock = mIntel3AParameter->mAfForceLock;
-+
-+    return OK;
-+}
-+
-+int AiqCore::setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) {
-+    LOG3A("@%s, ispStatistics:%p", __func__, ispStatistics);
-+    CheckError(!ispStatistics, BAD_VALUE, "@%s, ispStatistics is nullptr", __func__);
-+
-+    int ret = OK;
-+
-+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("statisticsSetV4", 1);
-+        ia_err iaErr = intelAiq->statisticsSetV4(ispStatistics);
-+        ret = AiqUtils::convertError(iaErr);
-+        CheckError(ret != OK, ret, "Error setting statistics, ret = %d", ret);
-+    }
-+
-+    return ret;
-+}
-+
-+int AiqCore::runAiq(AiqResult *aiqResult) {
-+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
-+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
-+
-+    int ret = run3A(aiqResult);
-+    CheckError(ret != OK, ret, "run3A failed, ret: %d", ret);
-+
-+    ret = runAiqPlus(aiqResult);
-+    CheckError(ret != OK, ret, "runAiqPlus failed, ret: %d", ret);
-+
-+    return OK;
-+}
-+
-+int AiqCore::run3A(AiqResult *aiqResult) {
-+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
-+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
-+
-+    int ret = OK;
-+    int aaaType = IMAGING_ALGO_AE | IMAGING_ALGO_AWB;
-+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
-+        aaaType |= IMAGING_ALGO_AF;
-+    }
-+
-+    if (aaaType & IMAGING_ALGO_AE) {
-+        ret |= runAe(&aiqResult->mAeResults);
-+    }
-+    if (aaaType & IMAGING_ALGO_AWB) {
-+        ret |= runAwb(&aiqResult->mAwbResults);
-+    }
-+    if (aaaType & IMAGING_ALGO_AF) {
-+        ret |= runAf(aiqResult);
-+    }
-+
-+    return ret;
-+}
-+
-+int AiqCore::runAiqPlus(AiqResult *aiqResult) {
-+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
-+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
-+
-+    int algoType = IMAGING_ALGO_GBCE | IMAGING_ALGO_PA | IMAGING_ALGO_SA;
-+
-+    int ret = OK;
-+    if (algoType & IMAGING_ALGO_GBCE) {
-+        ret |= runGbce(&aiqResult->mGbceResults);
-+    }
-+    if (algoType & IMAGING_ALGO_PA) {
-+        ret |= runPa(&aiqResult->mPaResults, &aiqResult->mAwbResults,
-+                     aiqResult->mAeResults.exposures[0].exposure,
-+                     &aiqResult->mPreferredAcm);
-+    }
-+    if ((algoType & IMAGING_ALGO_SA) && (mShadingMode != SHADING_MODE_OFF)) {
-+        ret |= runSa(&aiqResult->mSaResults, &aiqResult->mAwbResults,
-+                     aiqResult->mAiqParam.lensShadingMap);
-+    }
-+
-+    return ret;
-+}
-+
-+int AiqCore::runAe(ia_aiq_ae_results* aeResults) {
-+    LOG3A("@%s, aeResults:%p", __func__, aeResults);
-+    CheckError(!aeResults, BAD_VALUE, "@%s, aeResults is nullptr", __func__);
-+    PERF_CAMERA_ATRACE();
-+
-+    int ret = OK;
-+    ia_aiq_ae_results *newAeResults = mLastAeResult;
-+
-+    if (!mAeForceLock && (mAeRunTime % mIntel3AParameter->mAePerTicks == 0)) {
-+        LOG3A("AEC frame_use: %d", mIntel3AParameter->mAeParams.frame_use);
-+
-+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+        {
-+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->aeRun", 1);
-+            ia_err iaErr = intelAiq->aeRun(&mIntel3AParameter->mAeParams, &newAeResults);
-+            ret = AiqUtils::convertError(iaErr);
-+            CheckError(ret != OK || !newAeResults, ret, "Error running AE, ret: %d", ret);
-+        }
-+    }
-+
-+    mIntel3AParameter->updateAeResult(newAeResults);
-+
-+    ret = mIntel3AResult->deepCopyAeResults(*newAeResults, aeResults);
-+
-+    mLastAeResult = aeResults;
-+    ++mAeRunTime;
-+
-+    return ret;
-+}
-+
-+int AiqCore::runAf(AiqResult *aiqResult) {
-+    LOG3A("@%s, aiqResult:%p", __func__, aiqResult);
-+    CheckError(!aiqResult, BAD_VALUE, "@%s, aiqResult is nullptr", __func__);
-+    PERF_CAMERA_ATRACE();
-+
-+    ia_aiq_af_results *afResults = &aiqResult->mAfResults;
-+    ia_aiq_af_results *newAfResults = mLastAfResult;
-+
-+    int ret = OK;
-+    if (!mAfForceLock) {
-+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+        CheckError(!intelAiq, UNKNOWN_ERROR, "@%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+        {
-+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->afRun", 1);
-+            ia_err iaErr = intelAiq->afRun(&mIntel3AParameter->mAfParams, &newAfResults);
-+            ret = AiqUtils::convertError(iaErr);
-+            CheckError(ret != OK || !newAfResults, ret, "Error running AF, ret: %d", ret);
-+        }
-+    }
-+
-+    focusDistanceResult(newAfResults, &aiqResult->mAfDistanceDiopters, &aiqResult->mFocusRange);
-+    ret = mIntel3AResult->deepCopyAfResults(*newAfResults, afResults);
-+
-+    mLastAfResult = afResults;
-+    mIntel3AParameter->fillAfTriggerResult(newAfResults);
-+    return ret;
-+}
-+
-+void AiqCore::focusDistanceResult(const ia_aiq_af_results *afResults,
-+                                  float *afDistanceDiopters,
-+                                  camera_range_t *focusRange) {
-+    LOG3A("@%s, afResults:%p, afDistanceDiopters:%p, focusRange:%p", __func__,
-+          afResults, afDistanceDiopters, focusRange);
-+    CheckError(!afResults || !afDistanceDiopters || !focusRange, VOID_VALUE,
-+               "@%s, Bad input values", __func__);
-+
-+    *afDistanceDiopters = 1.2f;
-+    if (mIntel3AParameter->mAfParams.focus_mode == ia_aiq_af_operation_mode_infinity) {
-+        // infinity mode is special: we need to report 0.0f (1/inf = 0)
-+        *afDistanceDiopters = 0.0f;
-+    } else if (afResults->current_focus_distance != 0) {
-+        // In AIQ, 'current_focus_distance' is in millimeters
-+        // For rounding multiply by extra 100.
-+        // This allows the diopters to have 2 decimal values
-+        *afDistanceDiopters = 100 * 1000 * (1.0 / afResults->current_focus_distance);
-+        *afDistanceDiopters = ceil(*afDistanceDiopters);
-+        // Divide by 100 for final result.
-+        *afDistanceDiopters = *afDistanceDiopters / 100;
-+    }
-+    LOG3A("%s, Zero focus distance in AF result, reporting %f", __func__, *afDistanceDiopters);
-+
-+    calculateDepthOfField(*afResults, focusRange);
-+    LOG3A("%s, focus distance with diopters: %f %f", __func__, focusRange->min, focusRange->max);
-+}
-+
-+int AiqCore::runAwb(ia_aiq_awb_results* awbResults) {
-+    LOG3A("@%s, awbResults:%p", __func__, awbResults);
-+    CheckError(!awbResults, BAD_VALUE, "@%s, awbResults is nullptr", __func__);
-+    PERF_CAMERA_ATRACE();
-+
-+    int ret = OK;
-+    ia_aiq_awb_results *newAwbResults = mLastAwbResult;
-+
-+    if (!mAwbForceLock && (mAwbRunTime % mIntel3AParameter->mAwbPerTicks == 0)) {
-+        IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+        CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+        {
-+            PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->awbRun", 1);
-+            ia_err iaErr = intelAiq->awbRun(&mIntel3AParameter->mAwbParams, &newAwbResults);
-+            ret = AiqUtils::convertError(iaErr);
-+            CheckError(ret != OK || !newAwbResults, ret, "Error running AWB, ret: %d", ret);
-+        }
-+    }
-+
-+    CheckError(!newAwbResults, BAD_VALUE, "newAwbResults is nullptr");
-+
-+    if (!PlatformData::isIsysEnabled(mCameraId)) {
-+        // Fix AWB gain to 1 for none-ISYS cases
-+        newAwbResults->accurate_r_per_g = 1;
-+        newAwbResults->accurate_b_per_g = 1;
-+        newAwbResults->final_r_per_g = 1;
-+        newAwbResults->final_b_per_g = 1;
-+    }
-+
-+    mIntel3AParameter->updateAwbResult(newAwbResults);
-+
-+    ret = mIntel3AResult->deepCopyAwbResults(*newAwbResults, awbResults);
-+
-+    mLastAwbResult = awbResults;
-+    ++mAwbRunTime;
-+
-+    return ret;
-+}
-+
-+int AiqCore::runGbce(ia_aiq_gbce_results *gbceResults) {
-+    LOG3A("%s, gbceResults:%p", __func__, gbceResults);
-+    CheckError(!gbceResults, BAD_VALUE, "@%s, gbceResults is nullptr", __func__);
-+
-+    PERF_CAMERA_ATRACE();
-+    ia_aiq_gbce_results *newGbceResults = nullptr;
-+
-+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->gbceRun", 1);
-+        ia_err iaErr = intelAiq->gbceRun(&mGbceParams, &newGbceResults);
-+        int ret = AiqUtils::convertError(iaErr);
-+        CheckError(ret != OK, ret, "@%s, gbceRun fails, ret: %d", __func__, ret);
-+    }
-+
-+    return AiqUtils::deepCopyGbceResults(*newGbceResults, gbceResults);
-+}
-+
-+int AiqCore::runPa(ia_aiq_pa_results_v1 *paResults,
-+                   ia_aiq_awb_results *awbResults,
-+                   ia_aiq_exposure_parameters *exposureParams,
-+                   ia_aiq_advanced_ccm_t *preferredAcm) {
-+    LOG3A("%s, paResults:%p, awbResults:%p, exposureParams:%p, preferredAcm:%p", __func__,
-+          paResults, awbResults, exposureParams, preferredAcm);
-+    CheckError(!paResults || !awbResults || !exposureParams || !preferredAcm, BAD_VALUE,
-+               "@%s, Bad input values", __func__);
-+
-+    PERF_CAMERA_ATRACE();
-+    ia_aiq_pa_results_v1 *newPaResults = nullptr;
-+
-+    mPaParams.awb_results = awbResults;
-+    mPaParams.exposure_params = exposureParams;
-+    mPaParams.color_gains = nullptr;
-+
-+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->paRunV1", 1);
-+        ia_err iaErr = intelAiq->paRunV1(&mPaParams, &newPaResults);
-+        int ret = AiqUtils::convertError(iaErr);
-+        CheckError(ret != OK || !newPaResults, ret, "Error running PA, ret: %d", ret);
-+    }
-+
-+    dumpPaResult(newPaResults);
-+
-+    // Override color_conversion_matrix and color_gains
-+    // when application requires manual color transform.
-+    if (mUseManualColorMatrix) {
-+        MEMCPY_S(&newPaResults->color_conversion_matrix,
-+                 sizeof(newPaResults->color_conversion_matrix),
-+                 &mColorMatrix.color_transform,
-+                 sizeof(mColorMatrix.color_transform));
-+
-+        if (VALID_COLOR_GAINS(mColorGains.color_gains_rggb)) {
-+            newPaResults->color_gains.r  = mColorGains.color_gains_rggb[0];
-+            newPaResults->color_gains.gr = mColorGains.color_gains_rggb[1];
-+            newPaResults->color_gains.gb = mColorGains.color_gains_rggb[2];
-+            newPaResults->color_gains.b  = mColorGains.color_gains_rggb[3];
-+        }
-+
-+        // Override advanced color conversion matrix also if it enabled
-+        if (newPaResults->preferred_acm) {
-+            for (unsigned int i = 0; i < newPaResults->preferred_acm->sector_count; i++) {
-+                MEMCPY_S(&newPaResults->preferred_acm->advanced_color_conversion_matrices[i],
-+                         sizeof(newPaResults->preferred_acm->advanced_color_conversion_matrices[0]),
-+                         &mColorMatrix.color_transform,
-+                         sizeof(mColorMatrix.color_transform));
-+            }
-+        }
-+    }
-+
-+    return AiqUtils::deepCopyPaResults(*newPaResults, paResults, preferredAcm);
-+}
-+
-+int AiqCore::checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder) {
-+    LOG3A("@%s, bayerOrder = %d, colorOrder:%p", __func__, bayerOrder, colorOrder);
-+    CheckError(!colorOrder, BAD_VALUE, "@%s, colorOrder is nullptr", __func__);
-+
-+    int ret = OK;
-+    switch (bayerOrder) {
-+    case cmc_bayer_order_grbg:
-+    /* use gr r b gb constitute 2X2 array
-+     * gr    r
-+     * b     gb
-+     * The four channel use x y coordinate to indicate
-+     * gr(0, 0) r(1, 0) b(0, 1) gb(1, 1)
-+    */
-+        colorOrder->r[0] = 1;
-+        colorOrder->r[1] = 0;
-+        colorOrder->b[0] = 0;
-+        colorOrder->b[1] = 1;
-+        colorOrder->gr[0] = 0;
-+        colorOrder->gr[1] = 0;
-+        colorOrder->gb[0] = 1;
-+        colorOrder->gb[1] = 1;
-+        break;
-+    case cmc_bayer_order_rggb:
-+        colorOrder->r[0] = 0;
-+        colorOrder->r[1] = 0;
-+        colorOrder->b[0] = 1;
-+        colorOrder->b[1] = 1;
-+        colorOrder->gr[0] = 1;
-+        colorOrder->gr[1] = 0;
-+        colorOrder->gb[0] = 0;
-+        colorOrder->gb[1] = 1;
-+        break;
-+    case cmc_bayer_order_bggr:
-+        colorOrder->r[0] = 1;
-+        colorOrder->r[1] = 1;
-+        colorOrder->b[0] = 0;
-+        colorOrder->b[1] = 0;
-+        colorOrder->gr[0] = 0;
-+        colorOrder->gr[1] = 1;
-+        colorOrder->gb[0] = 1;
-+        colorOrder->gb[1] = 0;
-+        break;
-+    case cmc_bayer_order_gbrg:
-+        colorOrder->r[0] = 0;
-+        colorOrder->r[1] = 1;
-+        colorOrder->b[0] = 1;
-+        colorOrder->b[1] = 0;
-+        colorOrder->gr[0] = 1;
-+        colorOrder->gr[1] = 1;
-+        colorOrder->gb[0] = 0;
-+        colorOrder->gb[1] = 0;
-+        break;
-+    default:
-+        ret = BAD_VALUE;
-+        break;
-+    }
-+    return ret;
-+}
-+
-+int AiqCore::reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB) {
-+    LOG3A("@%s, width %d, height %d", __func__, inputLscGrid.width, inputLscGrid.height);
-+
-+    CheckError(inputLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
-+               "@%s, Bad input values for lens shading map reformatting", __func__);
-+
-+    // Metadata spec request order [R, Geven, Godd, B]
-+    // the lensShading from ISP is 4 width * height block,
-+    // for ia_aiq_bayer_order_grbg, the four block is G, R, B, G
-+    size_t size = inputLscGrid.height * inputLscGrid.width;
-+    for (size_t i = 0; i < size; i++) {
-+        *dstLscGridRGGB++ = inputLscGrid.gridR[i];
-+        *dstLscGridRGGB++ = inputLscGrid.gridGr[i];
-+        *dstLscGridRGGB++ = inputLscGrid.gridGb[i];
-+        *dstLscGridRGGB++ = inputLscGrid.gridB[i];
-+    }
-+
-+    return OK;
-+}
-+
-+int AiqCore::storeLensShadingMap(const LSCGrid &inputLscGrid,
-+                                 const LSCGrid &resizeLscGrid, float *dstLscGridRGGB) {
-+    LOG3A("@%s", __func__);
-+    CheckError(inputLscGrid.isBad() || resizeLscGrid.isBad() || !dstLscGridRGGB, BAD_VALUE,
-+               "@%s, Bad input values for lens shading map storing", __func__);
-+
-+    int destWidth = resizeLscGrid.width;
-+    int destHeight = resizeLscGrid.height;
-+    int width = inputLscGrid.width;
-+    int height = inputLscGrid.height;
-+
-+    if (width != destWidth || height != destHeight) {
-+        // requests lensShadingMapSize must be smaller than 64*64
-+        // and it is a constant size.
-+        // Our lensShadingMapSize is dynamic based on the resolution, so need
-+        // to do resize for 4 channels separately
-+
-+        AiqUtils::resize2dArray(inputLscGrid.gridR,  width, height,
-+                      resizeLscGrid.gridR,  destWidth, destHeight);
-+        AiqUtils::resize2dArray(inputLscGrid.gridGr,  width, height,
-+                      resizeLscGrid.gridGr,  destWidth, destHeight);
-+        AiqUtils::resize2dArray(inputLscGrid.gridGb,  width, height,
-+                      resizeLscGrid.gridGb,  destWidth, destHeight);
-+        AiqUtils::resize2dArray(inputLscGrid.gridB,  width, height,
-+                      resizeLscGrid.gridB,  destWidth, destHeight);
-+
-+        LOG3A("resize lens shading map from [%d,%d] to [%d,%d]",
-+              width, height, destWidth, destHeight);
-+    } else {
-+        size_t size = destWidth * destHeight * sizeof(resizeLscGrid.gridR[0]);
-+        STDCOPY((int8_t *) resizeLscGrid.gridR,  (int8_t *) inputLscGrid.gridR,  size);
-+        STDCOPY((int8_t *) resizeLscGrid.gridGr, (int8_t *) inputLscGrid.gridGr, size);
-+        STDCOPY((int8_t *) resizeLscGrid.gridGb, (int8_t *) inputLscGrid.gridGb, size);
-+        STDCOPY((int8_t *) resizeLscGrid.gridB,  (int8_t *) inputLscGrid.gridB,  size);
-+    }
-+
-+    return reFormatLensShadingMap(resizeLscGrid, dstLscGridRGGB);
-+}
-+
-+int AiqCore::processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap) {
-+    LOG3A("@%s, saResults:%p, lensShadingMap:%p", __func__, saResults, lensShadingMap);
-+    CheckError(!saResults || !lensShadingMap, BAD_VALUE, "@%s, Bad input values", __func__);
-+
-+    if (!saResults->lsc_update || (mLensShadingMapMode == LENS_SHADING_MAP_MODE_OFF)) {
-+        return OK;
-+    }
-+
-+    ColorOrder co_ind = {};
-+    int ret = checkColorOrder(saResults->color_order, &co_ind);
-+    CheckError(ret != OK, BAD_VALUE, "Failed to checkColorOrder, ret: %d", ret);
-+
-+    LSCGrid inputGrid;
-+    inputGrid.gridB = saResults->lsc_grid[co_ind.b[0]][co_ind.b[1]];
-+    inputGrid.gridR = saResults->lsc_grid[co_ind.r[0]][co_ind.r[1]];
-+    inputGrid.gridGr = saResults->lsc_grid[co_ind.gr[0]][co_ind.gr[1]];
-+    inputGrid.gridGb = saResults->lsc_grid[co_ind.gb[0]][co_ind.gb[1]];
-+    inputGrid.width = saResults->width;
-+    inputGrid.height = saResults->height;
-+
-+    LSCGrid resizeGrid;
-+    resizeGrid.gridB = mResizeLscGridB;
-+    resizeGrid.gridR = mResizeLscGridR;
-+    resizeGrid.gridGr = mResizeLscGridGr;
-+    resizeGrid.gridGb = mResizeLscGridGb;
-+    resizeGrid.width = mLensShadingMapSize.x;
-+    resizeGrid.height = mLensShadingMapSize.y;
-+
-+    float lscGridRGGB[MAX_LSC_GRID_SIZE * 4];
-+    storeLensShadingMap(inputGrid, resizeGrid, lscGridRGGB);
-+
-+    size_t size = resizeGrid.width * resizeGrid.height * 4;
-+    size_t errCount = 0;
-+    for (size_t i = 0; i < size; i++) {
-+        if (lscGridRGGB[i] < 1.0f) {
-+            lscGridRGGB[i] = 1.0f;
-+            errCount++;
-+        }
-+    }
-+    if (errCount) {
-+        LOGW("Error - SA produced too small values (%d/%d)!", errCount, size);
-+    }
-+
-+    float *lsm = (mShadingMode != SHADING_MODE_OFF) ? lscGridRGGB : mLscOffGrid;
-+    for (size_t i = 0; i < size; i++) {
-+        lensShadingMap[i] = lsm[i];
-+    }
-+
-+    return OK;
-+}
-+
-+int AiqCore::runSa(ia_aiq_sa_results_v1 *saResults,
-+                   ia_aiq_awb_results *awbResults,
-+                   float *lensShadingMap) {
-+    LOG3A("%s, saResults:%p, awbResults:%p, lensShadingMap:%p", __func__,
-+          saResults, awbResults, lensShadingMap);
-+    CheckError(!saResults || !awbResults || !lensShadingMap, BAD_VALUE,
-+               "@%s, Bad input values", __func__);
-+
-+    PERF_CAMERA_ATRACE();
-+    int ret = OK;
-+    ia_aiq_sa_results_v1 *newSaResults = nullptr;
-+
-+    mSaParams.awb_results = awbResults;
-+
-+    IntelAiq* intelAiq = mIntelAiqHandle[mTuningMode];
-+    CheckError(!intelAiq, UNKNOWN_ERROR, "%s, aiq is nullptr, mode:%d", __func__, mTuningMode);
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("intelAiq->saRunV2", 1);
-+        ia_err iaErr = intelAiq->saRunV2(&mSaParams, &newSaResults);
-+        ret = AiqUtils::convertError(iaErr);
-+        CheckError(ret != OK || !newSaResults, ret, "intelAiq->saRunV2 fails, ret: %d", ret);
-+    }
-+
-+    dumpSaResult(newSaResults);
-+    ret = AiqUtils::deepCopySaResults(*newSaResults, saResults);
-+    CheckError(ret != OK, ret, "Error deepCopySaResults, ret: %d", ret);
-+
-+    return processSAResults(saResults, lensShadingMap);
-+}
-+
-+int AiqCore::dumpPaResult(const ia_aiq_pa_results_v1 *paResult) {
-+    LOG3A("%s, paResult:%p", __func__, paResult);
-+    CheckError(!paResult, BAD_VALUE, "@%s, paResult is nullptr", __func__);
-+
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
-+
-+    LOG3A("   PA results brightness %f saturation %f",
-+          paResult->brightness_level,
-+          paResult->saturation_factor);
-+    LOG3A("   PA results black level row 0: %f %f %f  %f ",
-+          paResult->black_level_4x4[0][0],
-+          paResult->black_level_4x4[0][1],
-+          paResult->black_level_4x4[0][2],
-+          paResult->black_level_4x4[0][3]);
-+    LOG3A("   PA results black level row 1: %f %f %f  %f ",
-+          paResult->black_level_4x4[1][0],
-+          paResult->black_level_4x4[1][1],
-+          paResult->black_level_4x4[1][2],
-+          paResult->black_level_4x4[1][3]);
-+    LOG3A("   PA results black level row 2: %f %f %f  %f ",
-+          paResult->black_level_4x4[2][0],
-+          paResult->black_level_4x4[2][1],
-+          paResult->black_level_4x4[2][2],
-+          paResult->black_level_4x4[2][3]);
-+    LOG3A("   PA results black level row 3: %f %f %f  %f ",
-+          paResult->black_level_4x4[3][0],
-+          paResult->black_level_4x4[3][1],
-+          paResult->black_level_4x4[3][2],
-+          paResult->black_level_4x4[3][3]);
-+    LOG3A("   PA results color gains %f %f %f  %f ",
-+          paResult->color_gains.r,
-+          paResult->color_gains.gr,
-+          paResult->color_gains.gb,
-+          paResult->color_gains.b);
-+    LOG3A("   PA results linearization table size %d",
-+          paResult->linearization.size);
-+
-+    for (int i = 0; i < 3; i++) {
-+        LOG3A("   PA results color matrix  [%.3f %.3f %.3f] ",
-+              paResult->color_conversion_matrix[i][0],
-+              paResult->color_conversion_matrix[i][1],
-+              paResult->color_conversion_matrix[i][2]);
-+    }
-+
-+    if (paResult->preferred_acm) {
-+        LOG3A("   PA results advanced ccm sector count %d ",
-+              paResult->preferred_acm->sector_count);
-+    }
-+    if (paResult->ir_weight) {
-+        LOG3A("   PA results ir weight grid [ %d x %d ] ",
-+              paResult->ir_weight->width, paResult->ir_weight->height);
-+    }
-+
-+    return OK;
-+}
-+
-+int AiqCore::dumpSaResult(const ia_aiq_sa_results_v1 *saResult) {
-+    LOG3A("%s, saResult:%p", __func__, saResult);
-+    CheckError(!saResult, BAD_VALUE, "@%s, saResult is nullptr", __func__);
-+
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
-+
-+    LOG3A("   SA results lsc Update %d size %dx%d",
-+          saResult->lsc_update, saResult->width,  saResult->height);
-+
-+    return OK;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqCore.h b/camera/hal/intel/ipu6/src/3a/AiqCore.h
-new file mode 100644
-index 000000000000..0d0c03221b4e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.h
-@@ -0,0 +1,213 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+
-+#include "ia_aiq.h"
-+#include "ia_ltm.h"
-+#include "ia_cmc_types.h"
-+#ifndef ENABLE_SANDBOXING
-+#include "ia_log.h"
-+#endif
-+
-+#include "AiqSetting.h"
-+#include "AiqResult.h"
-+
-+#include "Intel3AParameter.h"
-+#include "Intel3AResult.h"
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelAiq.h"
-+#else
-+#include "modules/algowrapper/IntelAiq.h"
-+#endif
-+
-+namespace icamera {
-+
-+/*
-+ * \class AiqCore
-+ * This class is used to set parameter, statistics and run Ae,
-+ * Af, Awb, Gbce, Pa, Sa.
-+ */
-+class AiqCore {
-+
-+public:
-+    AiqCore(int cameraId);
-+    ~AiqCore();
-+
-+    /**
-+     * \brief AiqCore init
-+     *
-+     * Init AiqPlus and AAAObject
-+     */
-+    int init();
-+
-+    /**
-+     * \brief AiqCore deinit
-+     *
-+     * Deinit AiqPlus and AAAObject
-+     */
-+    int deinit();
-+
-+    /**
-+     * \brief AiqCore configure
-+     *
-+     * Configure AiqPlus ConfigMode
-+     */
-+    int configure(const std::vector<ConfigMode>& configModes);
-+
-+    /**
-+     * \brief Set sensor and frame info
-+     *
-+     * \param frameParams: the frame info parameter
-+     * \param descriptor: the sensor info parameter
-+     */
-+    int setSensorInfo(const ia_aiq_frame_params &frameParams,
-+                      const ia_aiq_exposure_sensor_descriptor &descriptor);
-+
-+    /**
-+     * \brief update param and set converge speed
-+     *
-+     * \param param: the parameter update to AiqPlus and Aiq3A or custom 3A
-+     */
-+    int updateParameter(const aiq_parameter_t &param);
-+
-+    /**
-+     * \brief Set ispStatistics to AiqPlus and Aiq3A or custom 3A
-+     */
-+    int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics);
-+
-+    /**
-+     * \brief run 3A and AiqPlus
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int runAiq(AiqResult *aiqResult);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(AiqCore);
-+
-+    // LSC data
-+    typedef struct ColorOrder {
-+        uint8_t r[2];
-+        uint8_t gr[2];
-+        uint8_t gb[2];
-+        uint8_t b[2];
-+    } ColorOrder;
-+
-+    class LSCGrid {
-+     public: /* this was a struct: class just to satisfy a static code scanner */
-+        uint16_t width;
-+        uint16_t height;
-+        uint16_t *gridR;
-+        uint16_t *gridGr;
-+        uint16_t *gridGb;
-+        uint16_t *gridB;
-+
-+        bool isBad() const {
-+            return (gridB == NULL || gridGb == NULL || gridR == NULL ||
-+                    gridGr == NULL || width == 0 || height == 0);
-+        }
-+        LSCGrid(): width(0), height(0), gridR(NULL), gridGr(NULL),
-+            gridGb(NULL), gridB(NULL) {}
-+    };
-+
-+    int run3A(AiqResult *aiqResult);
-+    int runAiqPlus(AiqResult *aiqResult);
-+    int runAe(ia_aiq_ae_results* aeResults);
-+    int runAf(AiqResult *aiqResult);
-+    void focusDistanceResult(const ia_aiq_af_results *afResults,
-+                             float *afDistanceDiopters,
-+                             camera_range_t *focusRange);
-+    int runAwb(ia_aiq_awb_results* awbResults);
-+    int runGbce(ia_aiq_gbce_results *gbceResults);
-+    int runPa(ia_aiq_pa_results_v1 *paResults,
-+              ia_aiq_awb_results *awbResults,
-+              ia_aiq_exposure_parameters *exposureParams,
-+              ia_aiq_advanced_ccm_t *preferredAcm);
-+    int runSa(ia_aiq_sa_results_v1 *saResults,
-+              ia_aiq_awb_results *awbResults,
-+              float *lensShadingMap);
-+    int processSAResults(ia_aiq_sa_results_v1 *saResults, float *lensShadingMap);
-+    int checkColorOrder(cmc_bayer_order bayerOrder, ColorOrder *colorOrder);
-+    int storeLensShadingMap(const LSCGrid &inputLscGrid,
-+                            const LSCGrid &resizeLscGrid, float *dstLscGridRGGB);
-+    int reFormatLensShadingMap(const LSCGrid &inputLscGrid, float *dstLscGridRGGB);
-+
-+    int calculateHyperfocalDistance(TuningMode mode);
-+    int calculateDepthOfField(const ia_aiq_af_results &afResults, camera_range_t *focusRange);
-+    int initAiqPlusParams();
-+    int initIntelAiqHandle(const std::vector<TuningMode>& tuningModes);
-+    void deinitIntelAiqHandle(void);
-+    // debug dumpers
-+    int dumpPaResult(const ia_aiq_pa_results_v1* paResult);
-+    int dumpSaResult(const ia_aiq_sa_results_v1* saResult);
-+
-+private:
-+    int mCameraId;
-+
-+    bool mAeForceLock;
-+    bool mAwbForceLock;
-+    bool mAfForceLock;
-+
-+    std::unique_ptr<Intel3AParameter> mIntel3AParameter;
-+    std::unique_ptr<Intel3AResult> mIntel3AResult;
-+
-+    // Original AeResult class arrays are kept in 3a engine which is safely used here.
-+    ia_aiq_ae_results *mLastAeResult;
-+    ia_aiq_awb_results *mLastAwbResult;
-+    ia_aiq_af_results *mLastAfResult;
-+
-+    int mAeRunTime;
-+    int mAwbRunTime;
-+
-+    IntelAiq *mIntelAiqHandle[TUNING_MODE_MAX];
-+    bool mIntelAiqHandleStatus[TUNING_MODE_MAX];
-+
-+    enum AiqState {
-+        AIQ_NOT_INIT = 0,
-+        AIQ_INIT,
-+        AIQ_CONFIGURED,
-+        AIQ_MAX
-+    } mAiqState;
-+
-+    ia_aiq_frame_params mFrameParams;
-+
-+    ia_aiq_gbce_input_params mGbceParams;
-+    ia_aiq_pa_input_params mPaParams;
-+    ia_aiq_color_channels mPaColorGains;
-+    ia_aiq_sa_input_params_v1 mSaParams;
-+
-+    bool mUseManualColorMatrix;
-+    camera_color_transform_t mColorMatrix;
-+    camera_color_gains_t mColorGains;
-+    float mHyperFocalDistance;  // in millimeters
-+
-+    TuningMode mTuningMode;
-+    camera_shading_mode_t mShadingMode;
-+    camera_lens_shading_map_mode_type_t mLensShadingMapMode;
-+    camera_coordinate_t mLensShadingMapSize;
-+    uint16_t mResizeLscGridR[MAX_LSC_GRID_SIZE];
-+    uint16_t mResizeLscGridGr[MAX_LSC_GRID_SIZE];
-+    uint16_t mResizeLscGridGb[MAX_LSC_GRID_SIZE];
-+    uint16_t mResizeLscGridB[MAX_LSC_GRID_SIZE];
-+    float mLscOffGrid[MAX_LSC_GRID_SIZE * 4];
-+
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
-new file mode 100644
-index 000000000000..f958f87b31d1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
-@@ -0,0 +1,526 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqEngine"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+#include "PlatformData.h"
-+#include "AiqEngine.h"
-+#include "FaceDetection.h"
-+
-+namespace icamera {
-+
-+AiqEngine::AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting) :
-+    mCameraId(cameraId),
-+    mAiqSetting(setting),
-+    mFirstAiqRunning(true),
-+    mFirstExposureSetting(true),
-+    mAiqRunningForPerframe(false),
-+    m3ACadenceSequence(0),
-+    mLastStatsSequence(-1)
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    CLEAR(mRgbsGridArray);
-+    CLEAR(mAfGridArray);
-+
-+    mIntelMkn = MakerNote::getInstance(mCameraId);
-+
-+    mAiqCore = new AiqCore(mCameraId);
-+
-+    mSensorManager = new SensorManager(mCameraId, sensorHw);
-+
-+    mLensManager = new LensManager(mCameraId, lensHw);
-+
-+    // Should consider better place to maintain the life cycle of AiqResultStorage
-+    mAiqResultStorage = AiqResultStorage::getInstance(mCameraId);
-+    mCurrentStatsSequence = 0;
-+}
-+
-+AiqEngine::~AiqEngine()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    delete mLensManager;
-+
-+    delete mSensorManager;
-+
-+    delete mAiqCore;
-+
-+    AiqResultStorage::releaseAiqResultStorage(mCameraId);
-+
-+    MakerNote::releaseMakerNote(mCameraId);
-+}
-+
-+int AiqEngine::init()
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    if (mAiqCore->init() != OK) {
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    mSensorManager->init();
-+
-+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
-+    return OK;
-+}
-+
-+int AiqEngine::deinit()
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    mSensorManager->deinit();
-+
-+    mAiqCore->deinit();
-+
-+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
-+    return OK;
-+}
-+
-+int AiqEngine::configure(const std::vector<ConfigMode>& configModes)
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    mAiqCore->configure(configModes);
-+
-+    return OK;
-+}
-+
-+int AiqEngine::startEngine()
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    mFirstAiqRunning = true;
-+    mFirstExposureSetting = true;
-+
-+    mSensorManager->reset();
-+
-+    mLensManager->start();
-+
-+    m3ACadenceSequence = 0;
-+
-+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
-+
-+    return OK;
-+}
-+
-+int AiqEngine::stopEngine()
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, end mCameraId = %d", __func__, mCameraId);
-+
-+    mLensManager->stop();
-+
-+    return OK;
-+}
-+
-+int AiqEngine::run3A(long *settingSequence)
-+{
-+    LOG3A("%s", __func__);
-+    // Run 3A in call thread
-+    AutoMutex l(mEngineLock);
-+
-+    // Handle 3A cadence logic
-+    int run3ACadence = mAiqParam.run3ACadence;
-+    if (run3ACadence < 1) {
-+        LOGW("Invalid 3A cadence %d, use default 1.", run3ACadence);
-+        run3ACadence = 1;
-+    }
-+    LOG2("%s: run3ACadence is %d", __func__, run3ACadence);
-+
-+    if (m3ACadenceSequence % run3ACadence != 0) {
-+        // Skip 3A per cadence
-+        m3ACadenceSequence ++;
-+        return OK;
-+    }
-+    LOG2("%s: run 3A for cadence sequence %ld", __func__, m3ACadenceSequence);
-+    m3ACadenceSequence ++;
-+
-+    mAiqRunningForPerframe = (settingSequence != nullptr);
-+    AiqState state = prepareInputParam();
-+
-+    AiqResult *aiqResult = mAiqResultStorage->acquireAiqResult();
-+    aiqResult->mTuningMode = mAiqParam.tuningMode;
-+
-+    if (state == AIQ_STATE_RUN) {
-+        state = runAiq(aiqResult);
-+    }
-+    if (state == AIQ_STATE_RESULT_SET) {
-+        state = handleAiqResult(aiqResult);
-+    }
-+    if (state == AIQ_STATE_DONE) {
-+        done(aiqResult);
-+    }
-+
-+    mAiqResultStorage->unLockAiqStatistics();
-+
-+    if (settingSequence) {
-+        *settingSequence = mAiqResultStorage->getAiqResult()->mSequence;
-+        LOG3A("%s, sequence %ld, mLastStatsSequence %ld", __func__, *settingSequence,
-+               mLastStatsSequence);
-+    }
-+
-+    mIntelMkn->saveMakernoteData(mAiqParam.makernoteMode,
-+                                 mAiqResultStorage->getAiqResult()->mSequence);
-+
-+    return (state == AIQ_STATE_DONE || state == AIQ_STATE_WAIT) ? 0 : UNKNOWN_ERROR;
-+}
-+
-+EventListener *AiqEngine::getSofEventListener()
-+{
-+    AutoMutex l(mEngineLock);
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+
-+    return mSensorManager->getSofEventListener();
-+}
-+
-+int AiqEngine::saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst)
-+{
-+    LOG3A("%s", __func__);
-+    if (afGrid == nullptr
-+        || afGrid->filter_response_1 == nullptr
-+        || afGrid->filter_response_2 == nullptr
-+        || afGrid->grid_width == 0
-+        || afGrid->grid_height == 0) {
-+        LOGE("%s, af grids are invalid", __func__);
-+        return BAD_VALUE;
-+    }
-+
-+    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
-+    if (afGrid->grid_width != dst->grid_width || afGrid->grid_height != dst->grid_height) {
-+        if (dst->filter_response_1 != nullptr) {
-+            delete [] dst->filter_response_1;
-+        }
-+        dst->filter_response_1 = new int[gridSize];
-+        if (dst->filter_response_2 != nullptr) {
-+            delete [] dst->filter_response_2;
-+        }
-+        dst->filter_response_2 = new int[gridSize];
-+    }
-+
-+    dst->grid_width = afGrid->grid_width;
-+    dst->grid_height = afGrid->grid_height;
-+    dst->block_width = afGrid->block_width;
-+    dst->block_height = afGrid->block_height;
-+    MEMCPY_S(dst->filter_response_1, gridSize * sizeof(int),
-+             afGrid->filter_response_1, gridSize * sizeof(int));
-+    MEMCPY_S(dst->filter_response_2, gridSize * sizeof(int),
-+             afGrid->filter_response_2, gridSize * sizeof(int));
-+
-+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
-+    return OK;
-+}
-+
-+int AiqEngine::saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst)
-+{
-+    LOG3A("%s", __func__);
-+    if (rgbsGrid == nullptr
-+        || rgbsGrid->blocks_ptr == nullptr
-+        || rgbsGrid->grid_width == 0
-+        || rgbsGrid->grid_height == 0) {
-+        LOGE("%s, rgbs grids are invalid", __func__);
-+        return BAD_VALUE;
-+    }
-+
-+    size_t gridSize = rgbsGrid->grid_width * rgbsGrid->grid_height;
-+    if (rgbsGrid->grid_width != dst->grid_width || rgbsGrid->grid_height != dst->grid_height) {
-+        if (dst->blocks_ptr != nullptr) {
-+            delete [] dst->blocks_ptr;
-+        }
-+        dst->blocks_ptr = new rgbs_grid_block[gridSize];
-+    }
-+
-+    dst->grid_width = rgbsGrid->grid_width;
-+    dst->grid_height = rgbsGrid->grid_height;
-+    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
-+             rgbsGrid->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
-+
-+    dst->shading_correction = rgbsGrid->shading_correction;
-+
-+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
-+    return OK;
-+}
-+
-+int AiqEngine::prepareStats(ia_aiq_statistics_input_params_v4 *statsParam,
-+                            ia_aiq_gbce_results *gbceResults,
-+                            AiqStatistics *aiqStatistics)
-+{
-+    mLastStatsSequence = aiqStatistics->mSequence;
-+    LOG3A("%s, sequence %ld", __func__, aiqStatistics->mSequence);
-+
-+    statsParam->rgbs_grids = mRgbsGridArray;
-+    statsParam->af_grids = mAfGridArray;
-+
-+    int ret = OK;
-+    do {
-+
-+        // The statistics timestamp is incorrect. If possible, use SOF timestamp instead.
-+        unsigned long long timestamp = mSensorManager->getSofTimestamp(aiqStatistics->mSequence);
-+        if (timestamp == 0) {
-+            LOG2("The sof sequence was not found %ld", aiqStatistics->mSequence);
-+            timestamp = aiqStatistics->mTimestamp;
-+        }
-+
-+        statsParam->frame_id = aiqStatistics->mSequence;
-+        statsParam->frame_timestamp = timestamp;
-+        statsParam->num_rgbs_grids = PlatformData::getExposureNum(mCameraId,
-+                                         CameraUtils::isMultiExposureCase(mAiqParam.tuningMode));
-+
-+        if (statsParam->num_rgbs_grids > 1) {
-+            for (unsigned int i = 0; i < statsParam->num_rgbs_grids; i++) {
-+                statsParam->rgbs_grids[i] = &(aiqStatistics->mRgbsGridArray[i]);
-+            }
-+        } else {
-+            statsParam->rgbs_grids[0] = &(aiqStatistics->mRgbsGridArray[0]);
-+        }
-+        statsParam->af_grids[0] = &(aiqStatistics->mAfGridArray[0]);
-+        statsParam->num_af_grids = 1;
-+        statsParam->external_histograms = nullptr;
-+        statsParam->num_external_histograms = 0;
-+        statsParam->camera_orientation = ia_aiq_camera_orientation_unknown;
-+
-+        const AiqResult *feedback = mAiqResultStorage->getAiqResult(aiqStatistics->mSequence);
-+        if (feedback == nullptr) {
-+            LOGW("%s: no feed back result for sequence %ld! use the latest instead",
-+                    __func__, aiqStatistics->mSequence);
-+            feedback = mAiqResultStorage->getAiqResult();
-+        }
-+
-+        statsParam->frame_ae_parameters = &feedback->mAeResults;
-+        statsParam->frame_af_parameters = &feedback->mAfResults;
-+        statsParam->frame_pa_parameters = &feedback->mPaResults;
-+        statsParam->awb_results = &feedback->mAwbResults;
-+        statsParam->frame_sa_parameters = &feedback->mSaResults;
-+
-+        *gbceResults = feedback->mGbceResults;
-+    } while (0);
-+    LOG3A("%s end", __func__);
-+    return ret;
-+}
-+
-+void AiqEngine::setAiqResult(AiqResult *aiqResult, bool skip)
-+{
-+    SensorExpGroup sensorExposures;
-+    for (unsigned int i = 0; i < aiqResult->mAeResults.num_exposures; i++) {
-+        SensorExposure exposure;
-+        exposure.sensorParam = *aiqResult->mAeResults.exposures[i].sensor_exposure;
-+        exposure.realDigitalGain = (aiqResult->mAeResults.exposures[i].exposure)->digital_gain;
-+        sensorExposures.push_back(exposure);
-+    }
-+    bool useSof = !mFirstExposureSetting;
-+    aiqResult->mSequence = mSensorManager->updateSensorExposure(sensorExposures, useSof);
-+    if (mFirstExposureSetting) {
-+        mFirstExposureSetting = false;
-+    }
-+    aiqResult->mSkip = skip;
-+
-+    if (skip) {
-+        LOG3A("%s, skipping frame aiqResult->mSequence = %ld", __func__, aiqResult->mSequence);
-+    }
-+
-+    mLensManager->setLensResult(aiqResult->mAeResults, aiqResult->mAfResults);
-+
-+    aiqResult->mAiqParam = mAiqParam;
-+}
-+
-+int AiqEngine::getSkippingNum(AiqResult *aiqResult)
-+{
-+    LOG3A("%s", __func__);
-+    int skipNum = 0;
-+
-+    if (!mFirstAiqRunning) {
-+        const AiqResult *lastResult = mAiqResultStorage->getAiqResult();
-+        if (lastResult->mTuningMode != aiqResult->mTuningMode) {
-+            // Skip 3 frames when pipe switching
-+            skipNum = 3;
-+        }
-+    } else if (mAiqRunningForPerframe) {
-+        // The 1st result takes effect @ frame (initialSkip) (applied before stream on)
-+        skipNum = PlatformData::getInitialSkipFrame(mCameraId);
-+    }
-+
-+    return skipNum;
-+}
-+
-+bool AiqEngine::needRun3A(AiqStatistics *aiqStatistics)
-+{
-+    LOG3A("%s", __func__);
-+
-+    // Force to run 3a for per-frame control case
-+    if (mAiqRunningForPerframe) {
-+        return true;
-+    }
-+
-+    // Force to run 3a for the first time running
-+    if (mFirstAiqRunning) {
-+        return true;
-+    }
-+
-+    if (aiqStatistics == nullptr) {
-+        LOG3A("no stats and not need to re-run 3A");
-+        return false;
-+    }
-+
-+    if (mLastStatsSequence == aiqStatistics->mSequence) {
-+        LOG3A("no new stats skip, mLastStatsSequence = %ld", mLastStatsSequence);
-+        return false;
-+    } else if (mSensorManager->getCurrentExposureAppliedDelay() > kMaxExposureAppliedDelay) {
-+        LOG3A("exposure setting applied delay is too larger, skip it");
-+        return false;
-+    }
-+
-+    return true;
-+}
-+
-+AiqEngine::AiqState AiqEngine::prepareInputParam(void)
-+{
-+    // set Aiq Params
-+    int ret = mAiqSetting->getAiqParameter(mAiqParam);
-+    if (ret != OK)
-+        return AIQ_STATE_ERROR;
-+
-+    // Update sensor info for the first-run of AIQ
-+    if (mFirstAiqRunning) {
-+        mSensorManager->setFrameRate(mAiqParam.fps);
-+        // set sensor info if needed
-+        ia_aiq_exposure_sensor_descriptor sensorDescriptor;
-+        ia_aiq_frame_params frameParams;
-+        CLEAR(sensorDescriptor);
-+        CLEAR(frameParams);
-+        ret = mSensorManager->getSensorInfo(frameParams, sensorDescriptor);
-+        CheckError((ret != OK), AIQ_STATE_ERROR, "Get sensor info failed:%d", ret);
-+        mAiqCore->setSensorInfo(frameParams, sensorDescriptor);
-+    }
-+
-+    // update lens related parameters
-+    mLensManager->getLensInfo(mAiqParam);
-+
-+    mAiqCore->updateParameter(mAiqParam);
-+    // set Stats
-+    ia_aiq_statistics_input_params_v4 statsParam;
-+    CLEAR(statsParam);
-+    ia_aiq_gbce_results gbceResults;
-+    CLEAR(gbceResults);
-+
-+    AiqStatistics *aiqStats =
-+        const_cast<AiqStatistics*>(mAiqResultStorage->getAndLockAiqStatistics());
-+
-+    if (!needRun3A(aiqStats)) {
-+        return AIQ_STATE_WAIT;
-+    }
-+
-+    if (aiqStats == nullptr) {
-+        LOG3A("%s: run aiq without stats data", __func__);
-+        return AIQ_STATE_RUN;
-+    }
-+
-+    // update face detection related parameters
-+    ia_atbx_face faces[MAX_FACES_DETECTABLE];
-+    ia_atbx_face_state facesState;
-+    if (PlatformData::isFaceAeEnabled(mCameraId)) {
-+        facesState.num_faces = 0;
-+        facesState.faces = faces;
-+        int ret = icamera::FaceDetection::getResult(mCameraId, &facesState);
-+        if (ret == OK && facesState.num_faces > 0) {
-+            ia_rectangle rect = facesState.faces[0].face_area;
-+            LOG3A("@%s, face number:%d, left:%d, top:%d, right:%d, bottom:%d", __func__,
-+                   facesState.num_faces, rect.left, rect.top, rect.right, rect.bottom);
-+            statsParam.faces = &facesState;
-+        }
-+    }
-+
-+    ret = prepareStats(&statsParam, &gbceResults, aiqStats);
-+
-+    if (ret != OK) {
-+        LOG3A("%s: no useful stats", __func__);
-+        return AIQ_STATE_RUN;
-+    }
-+
-+    mAiqCore->setStatistics(&statsParam);
-+
-+    return AIQ_STATE_RUN;
-+}
-+
-+AiqEngine::AiqState AiqEngine::runAiq(AiqResult *aiqResult)
-+{
-+    int ret = mAiqCore->runAiq(aiqResult);
-+    if (ret != OK) {
-+        return AIQ_STATE_ERROR;
-+    }
-+
-+    return AIQ_STATE_RESULT_SET;
-+}
-+
-+AiqEngine::AiqState AiqEngine::handleAiqResult(AiqResult *aiqResult)
-+{
-+    LOG2("%s: aiqResult->mTuningMode = %d", __func__, aiqResult->mTuningMode);
-+
-+    applyManualTonemaps(aiqResult);
-+
-+    return AIQ_STATE_DONE;
-+}
-+
-+int AiqEngine::applyManualTonemaps(AiqResult *aiqResult)
-+{
-+    /*
-+     * Normal use-case is the automatic modes, and we need not do anything here
-+     */
-+    if (mAiqParam.tonemapMode == TONEMAP_MODE_FAST ||
-+        mAiqParam.tonemapMode == TONEMAP_MODE_HIGH_QUALITY) {
-+        return OK;
-+    }
-+
-+    if (mAiqParam.tonemapMode == TONEMAP_MODE_GAMMA_VALUE) {
-+        AiqUtils::applyTonemapGamma(mAiqParam.tonemapGamma, &aiqResult->mGbceResults);
-+    } else if (mAiqParam.tonemapMode == TONEMAP_MODE_PRESET_CURVE) {
-+        if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_SRGB) {
-+            AiqUtils::applyTonemapSRGB(&aiqResult->mGbceResults);
-+        } else if (mAiqParam.tonemapPresetCurve == TONEMAP_PRESET_CURVE_REC709) {
-+            AiqUtils::applyTonemapREC709(&aiqResult->mGbceResults);
-+        }
-+    }
-+    return OK;
-+}
-+
-+AiqEngine::AiqState AiqEngine::done(AiqResult *aiqResult)
-+{
-+    int skipNum = getSkippingNum(aiqResult);
-+    AiqResult *tmp = aiqResult;
-+
-+    for (int i = 0; i < skipNum; i++) {
-+        // Increase the sensor settings sequence id, so for any frame that
-+        // its sequence id is bigger than the user expected id will be discarded.
-+        setAiqResult(tmp, true);
-+        mAiqResultStorage->updateAiqResult(tmp->mSequence);
-+        tmp = mAiqResultStorage->acquireAiqResult();
-+        *tmp = *aiqResult;
-+    }
-+
-+    setAiqResult(tmp, false);
-+    mAiqResultStorage->updateAiqResult(tmp->mSequence);
-+
-+    mFirstAiqRunning = false;
-+    return AIQ_STATE_WAIT;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqEngine.h b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
-new file mode 100644
-index 000000000000..11b96cb46649
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.h
-@@ -0,0 +1,151 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "MakerNote.h"
-+#include "AiqSetting.h"
-+#include "AiqCore.h"
-+#include "AiqResult.h"
-+#include "AiqStatistics.h"
-+#include "AiqResultStorage.h"
-+#include "SensorManager.h"
-+#include "LensManager.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class AiqEngine
-+ * This class is used to parse Stats, control \class AiqEngine
-+ * This class is used to parse Stats, control running AIQ algorithms
-+ * and set result to HW layer.
-+ * This is sub thread class.
-+ */
-+class AiqEngine {
-+
-+public:
-+    AiqEngine(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw, AiqSetting *setting);
-+    ~AiqEngine();
-+
-+    /**
-+     * \brief Init AiqResult, AiqCore and SensorManager
-+     */
-+    int init();
-+
-+    /**
-+     * \brief Deinit AiqResult, AiqCore and SensorManager
-+     */
-+    int deinit();
-+
-+    /**
-+     * \brief configure with ConfigMode
-+     */
-+    int configure(const std::vector<ConfigMode>& configModes);
-+
-+    /**
-+     * \brief Calculate and set frame and sensor info, and run 3a with default setting.
-+     */
-+    int startEngine();
-+
-+    /**
-+     * \brief Run 3a to get new 3a settings.
-+     * Return 0 if the operation succeeds, and output settingSequence to
-+     * indicate the frame that settings are applied.
-+     * settingSequence -1 means uncertain frame for this settings.
-+     */
-+    int run3A(long *settingSequence);
-+
-+    /**
-+     * \brief Stop 3a thrad and LensManager.
-+     */
-+    int stopEngine();
-+
-+    /**
-+     * \brief Get software EventListener
-+     */
-+    EventListener *getSofEventListener();
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(AiqEngine);
-+
-+    int saveAfGridData(const ia_aiq_af_grid* afGrid, ia_aiq_af_grid* dst);
-+    int saveRgbsGridData(const ia_aiq_rgbs_grid* rgbsGrid, ia_aiq_rgbs_grid* dst);
-+
-+    int prepareStats(ia_aiq_statistics_input_params_v4 *statsParami,
-+                     ia_aiq_gbce_results *gbceResults,
-+                     AiqStatistics *aiqStatistics);
-+
-+    void setAiqResult(AiqResult *aiqResult, bool skip);
-+
-+    int getSkippingNum(AiqResult *aiqResult);
-+
-+    bool needRun3A(AiqStatistics *aiqStatistics);
-+
-+    enum AiqState {
-+        AIQ_STATE_IDLE = 0,
-+        AIQ_STATE_WAIT,
-+        AIQ_STATE_INPUT_PREPARE,
-+        AIQ_STATE_RUN,
-+        AIQ_STATE_RESULT_SET,
-+        AIQ_STATE_DONE,
-+        AIQ_STATE_ERROR,
-+        AIQ_STATE_MAX
-+    };
-+
-+    AiqState prepareInputParam(void);
-+    AiqState runAiq(AiqResult *aiqResult);
-+    AiqState handleAiqResult(AiqResult *aiqResult);
-+    AiqState done(AiqResult *aiqResult);
-+
-+    int run();
-+
-+    // For manual ISP settings
-+    int applyManualTonemaps(AiqResult *aiqResult);
-+
-+private:
-+    static const nsecs_t kWaitDuration = 1000000000; //1000ms
-+    static const int kMaxStatisticsDataSize = 3;
-+    static const int kMaxExposureAppliedDelay = 5;
-+
-+private:
-+    int mCameraId;
-+    AiqResultStorage* mAiqResultStorage;
-+    MakerNote *mIntelMkn;
-+    AiqSetting *mAiqSetting;
-+    AiqCore *mAiqCore;
-+    SensorManager *mSensorManager;
-+    LensManager *mLensManager;
-+    bool mFirstAiqRunning;
-+    bool mFirstExposureSetting;
-+    bool mAiqRunningForPerframe;
-+
-+    // Guard for public API of AiqEngine.
-+    Mutex mEngineLock;
-+    Condition mStatsAvailableSignal;
-+
-+    uint32_t mCurrentStatsSequence;
-+
-+    const ia_aiq_rgbs_grid* mRgbsGridArray[MAX_EXPOSURES_NUM];
-+    const ia_aiq_af_grid* mAfGridArray[MAX_EXPOSURES_NUM];
-+
-+    aiq_parameter_t mAiqParam;
-+
-+    long m3ACadenceSequence;
-+    long mLastStatsSequence;
-+};
-+
-+} /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.cpp b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
-new file mode 100644
-index 000000000000..b8d83651b4c6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
-@@ -0,0 +1,176 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqResult"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqResult.h"
-+
-+namespace icamera {
-+
-+AiqResult::AiqResult(int cameraId) :
-+    mCameraId(cameraId),
-+    mSequence(-1),
-+    mTuningMode(TUNING_MODE_VIDEO),
-+    mAfDistanceDiopters(0.0f),
-+    mSkip(false)
-+{
-+    LOG3A("@%s", __func__);
-+
-+    CLEAR(mGrid);
-+    CLEAR(mFlashes);
-+    CLEAR(mRGammaLut);
-+    CLEAR(mGGammaLut);
-+    CLEAR(mBGammaLut);
-+    CLEAR(mToneMapLut);
-+    CLEAR(mHueSectors);
-+    CLEAR(mAdvancedCCM);
-+    CLEAR(mIrWeightGridR);
-+    CLEAR(mIrWeightGridG);
-+    CLEAR(mIrWeightGridB);
-+    CLEAR(mCustomControls);
-+    CLEAR(mCustomControlsParams);
-+    CLEAR(mSaResults);
-+    CLEAR(mAwbResults);
-+    CLEAR(mIrWeight);
-+    CLEAR(mApertureControl);
-+    CLEAR(mGbceResults);
-+    CLEAR(mWeightGrid);
-+    CLEAR(mPreferredAcm);
-+    CLEAR(mPaResults);
-+    CLEAR(mAeResults);
-+    CLEAR(mAfResults);
-+    CLEAR(mFocusRange);
-+}
-+
-+AiqResult::~AiqResult()
-+{
-+    LOG3A("@%s", __func__);
-+    deinit();
-+}
-+
-+int AiqResult::init()
-+{
-+    LOG3A("@%s", __func__);
-+
-+    CLEAR(mAeResults);
-+    CLEAR(mAfResults);
-+    CLEAR(mAwbResults);
-+    CLEAR(mGbceResults);
-+    CLEAR(mSaResults);
-+    CLEAR(mPaResults);
-+
-+    CLEAR(mExposureResults);
-+    CLEAR(mWeightGrid);
-+    CLEAR(mGrid);
-+    CLEAR(mFlashes);
-+    CLEAR(mGenericExposure);
-+    CLEAR(mSensorExposure);
-+    CLEAR(mApertureControl);
-+    CLEAR(mPreferredAcm);
-+    CLEAR(mIrWeight);
-+
-+    mAiqParam.reset();
-+
-+    /*AE results init */
-+    mAeResults.num_exposures = 1;
-+    mAeResults.exposures = mExposureResults;
-+    mAeResults.aperture_control = &mApertureControl;
-+    mAeResults.weight_grid = &mWeightGrid;
-+    mAeResults.weight_grid->weights = mGrid;
-+    mAeResults.flashes = mFlashes;
-+    for (unsigned int i = 0; i< MAX_EXPOSURES_NUM; i++) {
-+        mAeResults.exposures[i].exposure = &mGenericExposure[i];
-+        mAeResults.exposures[i].sensor_exposure = &mSensorExposure[i];
-+    }
-+    /* GBCE results init */
-+    mGbceResults.r_gamma_lut = mRGammaLut;
-+    mGbceResults.g_gamma_lut = mGGammaLut;
-+    mGbceResults.b_gamma_lut = mBGammaLut;
-+    mGbceResults.tone_map_lut = mToneMapLut;
-+
-+    /* SA results init */
-+    mSaResults.width = MAX_LSC_WIDTH;
-+    mSaResults.height = MAX_LSC_HEIGHT;
-+
-+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
-+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
-+            mSaResults.lsc_grid[i][j] = new unsigned short[MAX_LSC_WIDTH * MAX_LSC_HEIGHT];
-+            memset(mSaResults.lsc_grid[i][j], 0,
-+                   sizeof(unsigned short) * MAX_LSC_WIDTH * MAX_LSC_HEIGHT);
-+        }
-+    }
-+
-+    /* PA results init */
-+    mPaResults.ir_weight = &mIrWeight;
-+
-+    mPaResults.ir_weight->ir_weight_grid_R = mIrWeightGridR;
-+    mPaResults.ir_weight->ir_weight_grid_G = mIrWeightGridG;
-+    mPaResults.ir_weight->ir_weight_grid_B = mIrWeightGridB;
-+
-+    mPreferredAcm.hue_of_sectors = mHueSectors;
-+    mPreferredAcm.advanced_color_conversion_matrices = mAdvancedCCM;
-+
-+    /* Custom Controls init */
-+    mCustomControls.parameters = mCustomControlsParams;
-+
-+    return OK;
-+}
-+
-+int AiqResult::deinit()
-+{
-+    LOG3A("@%s", __func__);
-+
-+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
-+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
-+            delete []  mSaResults.lsc_grid[i][j];
-+            mSaResults.lsc_grid[i][j] = nullptr;
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+AiqResult &AiqResult::operator=(const AiqResult &other)
-+{
-+    deepCopyAiqResult(other, this);
-+    mSequence = other.mSequence;
-+    mTuningMode = other.mTuningMode;
-+    mSkip = other.mSkip;
-+    mCustomControls.count = other.mCustomControls.count;
-+    for (int i = 0; i < mCustomControls.count; i++) {
-+        mCustomControlsParams[i] = other.mCustomControlsParams[i];
-+    }
-+    mAiqParam = other.mAiqParam;
-+
-+    return *this;
-+}
-+
-+int AiqResult::deepCopyAiqResult(const AiqResult &src, AiqResult *dst)
-+{
-+    int ret = AiqUtils::deepCopyAeResults(src.mAeResults, &dst->mAeResults);
-+    ret |= AiqUtils::deepCopyAfResults(src.mAfResults, &dst->mAfResults);
-+    ret |= AiqUtils::deepCopyAwbResults(src.mAwbResults, &dst->mAwbResults);
-+    ret |= AiqUtils::deepCopyGbceResults(src.mGbceResults, &dst->mGbceResults);
-+    ret |= AiqUtils::deepCopyPaResults(src.mPaResults, &dst->mPaResults, &dst->mPreferredAcm);
-+    ret |= AiqUtils::deepCopySaResults(src.mSaResults, &dst->mSaResults);
-+
-+    return ret;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqResult.h b/camera/hal/intel/ipu6/src/3a/AiqResult.h
-new file mode 100644
-index 000000000000..eb4b9eee8a74
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.h
-@@ -0,0 +1,106 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_aiq.h"
-+#include "ia_ltm.h"
-+#include "ia_isp_types.h"
-+
-+#include "AiqUtils.h"
-+#include "AiqSetting.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class AiqResult
-+ * The private structs are part of AE, AF, AWB, PA and SA results.
-+ * They need to be separately introduced to store the contents of the results
-+ * that the AIQ algorithms return as pointers.
-+ * Then we can do deep copy of the results
-+ */
-+class AiqResult {
-+
-+public:
-+    AiqResult(int cameraId);
-+    ~AiqResult();
-+
-+    int init();
-+    int deinit();
-+
-+    AiqResult& operator=(const AiqResult& other);
-+
-+private:
-+    int deepCopyAiqResult(const AiqResult &src, AiqResult *dst);
-+
-+public:
-+    int mCameraId;
-+    long mSequence;
-+    TuningMode mTuningMode;
-+    float mAfDistanceDiopters;
-+    bool mSkip;
-+    camera_range_t mFocusRange;
-+
-+    ia_aiq_ae_results mAeResults;
-+    ia_aiq_awb_results mAwbResults;
-+    ia_aiq_af_results mAfResults;
-+    ia_aiq_gbce_results mGbceResults;
-+    ia_aiq_pa_results_v1 mPaResults;
-+    ia_aiq_sa_results_v1 mSaResults;
-+
-+    ia_aiq_advanced_ccm_t mPreferredAcm;
-+
-+    ia_isp_custom_controls mCustomControls;
-+
-+    aiq_parameter_t mAiqParam;
-+
-+private:
-+
-+    /*!< ia_aiq_ae_results pointer contents */
-+    ia_aiq_ae_exposure_result mExposureResults[MAX_EXPOSURES_NUM];
-+    ia_aiq_aperture_control   mApertureControl;
-+    ia_aiq_hist_weight_grid   mWeightGrid;
-+    unsigned char mGrid[MAX_AE_GRID_SIZE];
-+    ia_aiq_flash_parameters   mFlashes[NUM_FLASH_LEDS];
-+
-+    /*!< ia_aiq_ae_exposure_result pointer contents */
-+    ia_aiq_exposure_parameters        mGenericExposure[MAX_EXPOSURES_NUM];
-+    ia_aiq_exposure_sensor_parameters mSensorExposure[MAX_EXPOSURES_NUM];
-+
-+    /*!< ia_aiq_gbce results */
-+    /* The actual size of this table can be calculated by running cold
-+     * GBCE, it will provide those tables.
-+     */
-+    float mRGammaLut[MAX_GAMMA_LUT_SIZE];
-+    float mGGammaLut[MAX_GAMMA_LUT_SIZE];
-+    float mBGammaLut[MAX_GAMMA_LUT_SIZE];
-+    float mToneMapLut[MAX_TONEMAP_LUT_SIZE];
-+
-+    /*!< ia_aiq_pa_results pointer content */
-+    unsigned int mHueSectors[MAX_NUM_SECTORS];
-+    float mAdvancedCCM[MAX_NUM_SECTORS][3][3];
-+    ia_aiq_ir_weight_t mIrWeight;
-+    unsigned short mIrWeightGridR[MAX_IR_WEIGHT_GRID_SIZE];
-+    unsigned short mIrWeightGridG[MAX_IR_WEIGHT_GRID_SIZE];
-+    unsigned short mIrWeightGridB[MAX_IR_WEIGHT_GRID_SIZE];
-+
-+    /*!< ia_isp_custom_controls pointer content */
-+    float mCustomControlsParams[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
-+
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
-new file mode 100644
-index 000000000000..5d98a639c3c4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.cpp
-@@ -0,0 +1,286 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqResultStorage"
-+
-+#include "AiqResultStorage.h"
-+
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+std::map<int, AiqResultStorage*> AiqResultStorage::sInstances;
-+Mutex AiqResultStorage::sLock;
-+
-+AiqResultStorage* AiqResultStorage::getInstance(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    return getInstanceLocked(cameraId);
-+}
-+
-+void AiqResultStorage::releaseAiqResultStorage(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    AiqResultStorage* storage = getInstanceLocked(cameraId);
-+    sInstances.erase(cameraId);
-+    delete storage;
-+}
-+
-+AiqResultStorage::AiqResultStorage(int cameraId) :
-+    mCameraId(cameraId)
-+{
-+    LOG1("AiqResultStorage created for id:%d", mCameraId);
-+
-+    for (int i = 0; i < kStorageSize; i++) {
-+        mAiqResults[i] = new AiqResult(mCameraId);
-+        mAiqResults[i]->init();
-+    }
-+    // INTEL_DVS_S
-+    for (int i = 0; i < kDvsStorageSize; i++) {
-+        mDvsResults[i] = new DvsResult();
-+    }
-+    // INTEL_DVS_E
-+    // LOCAL_TONEMAP_S
-+    for (int i = 0; i < kLtmStorageSize; i++) {
-+        mLtmResults[i] = new ltm_result_t;
-+    }
-+    // LOCAL_TONEMAP_E
-+}
-+
-+AiqResultStorage::~AiqResultStorage()
-+{
-+    LOG1("AiqResultStorage released for id:%d", mCameraId);
-+
-+    for (int i = 0; i < kStorageSize; i++) {
-+        delete mAiqResults[i];
-+    }
-+    // INTEL_DVS_S
-+    for (int i = 0; i < kDvsStorageSize; i++) {
-+        delete mDvsResults[i];
-+    }
-+    // INTEL_DVS_E
-+    // LOCAL_TONEMAP_S
-+    for (int i = 0; i < kLtmStorageSize; i++) {
-+        delete mLtmResults[i];
-+    }
-+    // LOCAL_TONEMAP_E
-+}
-+
-+// LOCAL_TONEMAP_S
-+ltm_result_t* AiqResultStorage::acquireLtmResult()
-+{
-+    AutoWMutex rlock(mDataLock);
-+
-+    int index = mCurrentLtmIndex + 1;
-+    index %= kLtmStorageSize;
-+
-+    mLtmResults[index]->sequence = -1;
-+
-+    return mLtmResults[index];
-+}
-+
-+void AiqResultStorage::updateLtmResult(long sequence)
-+{
-+    AutoWMutex wlock(mDataLock);
-+
-+    mCurrentLtmIndex++;
-+    mCurrentLtmIndex %= kLtmStorageSize;
-+
-+    mLtmResults[mCurrentLtmIndex]->sequence = sequence;
-+}
-+
-+const ltm_result_t* AiqResultStorage::getLtmResult(long sequence)
-+{
-+    AutoRMutex rlock(mDataLock);
-+
-+    if (mCurrentLtmIndex == -1)
-+        return nullptr;
-+
-+    // Sequence is -1 means to get the latest result
-+    if (sequence == -1) {
-+        return mLtmResults[mCurrentLtmIndex];
-+    }
-+
-+    // Try to find the matched result
-+    for (int i = 0; i < kLtmStorageSize; i++) {
-+        int tmpIdx = (mCurrentLtmIndex + kLtmStorageSize - i) % kLtmStorageSize;
-+        if (mLtmResults[tmpIdx]->sequence >= 0 && sequence >= mLtmResults[tmpIdx]->sequence) {
-+            LOG2("%s, find the ltm result (expect: %ld actual: %ld)",
-+                    __func__, sequence, mLtmResults[tmpIdx]->sequence);
-+            return mLtmResults[tmpIdx];
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+// LOCAL_TONEMAP_E
-+
-+// INTEL_DVS_S
-+DvsResult* AiqResultStorage::acquireDvsResult()
-+{
-+    AutoWMutex rlock(mDataLock);
-+
-+    int index = mCurrentDvsIndex + 1;
-+    index %= kDvsStorageSize;
-+
-+    mDvsResults[index]->mSequence = -1;
-+
-+    return mDvsResults[index];
-+}
-+
-+void AiqResultStorage::updateDvsResult(long sequence)
-+{
-+    AutoWMutex wlock(mDataLock);
-+
-+    mCurrentDvsIndex++;
-+    mCurrentDvsIndex %= kDvsStorageSize;
-+
-+    mDvsResults[mCurrentDvsIndex]->mSequence = sequence;
-+}
-+
-+const DvsResult* AiqResultStorage::getDvsResult(long sequence)
-+{
-+    AutoRMutex rlock(mDataLock);
-+
-+    if (mCurrentDvsIndex == -1)
-+        return nullptr;
-+
-+    CheckError(mDvsResults[mCurrentDvsIndex]->mSequence == -1, nullptr, "invalid sequence id -1");
-+
-+    if (sequence == -1)
-+        return mDvsResults[mCurrentDvsIndex];
-+
-+    // Try to find the matched result
-+    for (int i = 0; i < kDvsStorageSize; i++) {
-+        int tmpIdx = (mCurrentDvsIndex + kDvsStorageSize - i) % kDvsStorageSize;
-+        if (mDvsResults[tmpIdx]->mSequence >= 0 && sequence >= mDvsResults[tmpIdx]->mSequence) {
-+            LOG2("%s, find the DVS result (expect: %ld actual: %ld)",
-+                    __func__, sequence, mDvsResults[tmpIdx]->mSequence);
-+            return mDvsResults[tmpIdx];
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+// INTEL_DVS_E
-+
-+AiqStatistics* AiqResultStorage::acquireAiqStatistics()
-+{
-+    AutoWMutex rlock(mDataLock);
-+
-+    int index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
-+    if (mAiqStatistics[index].mInUse) {
-+        // The "next" storage is still in use, skip it.
-+        mCurrentAiqStatsIndex = index;
-+        index = (mCurrentAiqStatsIndex + 1) % kAiqStatsStorageSize;
-+    }
-+
-+    mAiqStatistics[index].mSequence = -1;
-+
-+    return &mAiqStatistics[index];
-+}
-+
-+void AiqResultStorage::updateAiqStatistics(long sequence)
-+{
-+    AutoWMutex wlock(mDataLock);
-+
-+    mCurrentAiqStatsIndex++;
-+    mCurrentAiqStatsIndex %= kAiqStatsStorageSize;
-+
-+    mAiqStatistics[mCurrentAiqStatsIndex].mSequence = sequence;
-+}
-+
-+const AiqStatistics* AiqResultStorage::getAndLockAiqStatistics()
-+{
-+    AutoRMutex rlock(mDataLock);
-+
-+    if (mCurrentAiqStatsIndex == -1)
-+        return nullptr;
-+
-+    CheckError(mAiqStatistics[mCurrentAiqStatsIndex].mSequence == -1,
-+          nullptr, "Invalid sequence id -1 of stored aiq statistics");
-+
-+    mAiqStatistics[mCurrentAiqStatsIndex].mInUse = true;
-+    return &mAiqStatistics[mCurrentAiqStatsIndex];
-+}
-+
-+void AiqResultStorage::unLockAiqStatistics()
-+{
-+    AutoRMutex rlock(mDataLock);
-+    for (int i = 0; i < kAiqStatsStorageSize; i++) {
-+        mAiqStatistics[i].mInUse = false;
-+    }
-+}
-+
-+AiqResult* AiqResultStorage::acquireAiqResult()
-+{
-+    AutoWMutex rlock(mDataLock);
-+
-+    int index = mCurrentIndex + 1;
-+    index %= kStorageSize;
-+
-+    mAiqResults[index]->mSequence = -1;
-+
-+    return mAiqResults[index];
-+}
-+
-+void AiqResultStorage::updateAiqResult(long sequence)
-+{
-+    AutoWMutex wlock(mDataLock);
-+
-+    mCurrentIndex++;
-+    mCurrentIndex %= kStorageSize;
-+
-+    mAiqResults[mCurrentIndex]->mSequence = sequence;
-+}
-+
-+const AiqResult* AiqResultStorage::getAiqResult(long sequence)
-+{
-+    AutoRMutex rlock(mDataLock);
-+
-+    // Sequence id is -1 means user wants get the latest result.
-+    if (sequence == -1) {
-+        // If mCurrentIndex is -1, that means no result is saved to the storage yet,
-+        // just return the first one in this case.
-+        return mAiqResults[(mCurrentIndex == -1) ? 0 : mCurrentIndex];
-+    }
-+
-+    for (int i = 0; i < kStorageSize; i++) {
-+        // Search from the newest result
-+        int tmpIdx = (mCurrentIndex + kStorageSize - i) % kStorageSize;
-+        if (mAiqResults[tmpIdx]->mSequence >= 0 && sequence >= mAiqResults[tmpIdx]->mSequence) {
-+            return mAiqResults[tmpIdx];
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/**
-+ * Private function with no lock in it, must be called with lock protection
-+ */
-+AiqResultStorage* AiqResultStorage::getInstanceLocked(int cameraId)
-+{
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        return sInstances[cameraId];
-+    }
-+
-+    sInstances[cameraId] = new AiqResultStorage(cameraId);
-+    return sInstances[cameraId];
-+}
-+
-+} //namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
-new file mode 100644
-index 000000000000..432ecc1632aa
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqResultStorage.h
-@@ -0,0 +1,246 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+
-+#include "AiqResult.h"
-+
-+// LOCAL_TONEMAP_S
-+#include "Ltm.h"
-+// LOCAL_TONEMAP_E
-+// INTEL_DVS_S
-+#include "Dvs.h"
-+// INTEL_DVS_E
-+#include "AiqStatistics.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Thread.h"
-+#include "iutils/RWLock.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class AiqResultStorage
-+ *
-+ * This class provides interfaces for setting and getting AiqResult, and a storage space
-+ * which is able to contain at most `kStorageSize` AiqResults at same time.
-+ *
-+ * It's a singleton based on camera id, and its life cycle can be maintained by
-+ * its static methods getInstance and releaseAiqResultStorage.
-+ */
-+class AiqResultStorage {
-+public:
-+    /**
-+     * \brief Get internal instance for cameraId.
-+     *
-+     * param[in] int camera id: only one instance for one particular camera id.
-+     *
-+     * return the instance of AiqResultStorage for cameraId
-+     */
-+    static AiqResultStorage* getInstance(int cameraId);
-+
-+    /**
-+     * \brief Release the static instance of AiqResultStorage for cameraId.
-+     */
-+    static void releaseAiqResultStorage(int cameraId);
-+
-+    /**
-+     * \brief Acquire Aiq result.
-+     *
-+     * The function will return one Aiq result pointer which is kept by Aiq algo.
-+     * The sequence id is set to -1 which indicates the Aiq result is invalid.
-+     *
-+     * return Aiq result pointer to be kept by Aiq algo.
-+     */
-+    AiqResult* acquireAiqResult();
-+
-+    /**
-+     * \brief Update mCurrentIndex and set sequence id into internal storage.
-+     */
-+    void updateAiqResult(long sequence);
-+
-+    /**
-+     * \brief Get the pointer of aiq result to internal storage by given sequence id.
-+     *
-+     * The function will return the internal pointer of AiqResult, the caller MUST use this
-+     * pointer quickly, let's say less than 10ms. For any time-consuming operations, it's
-+     * the caller's responsibility to do a deep-copy, otherwise the data in returned AiqResult
-+     * may not be consistent.
-+     *
-+     * param[in] long sequence: specify which aiq result is needed.
-+     *
-+     * return 1. when sequence id is -1 or not provided, the lastest result will be returned.
-+     *        2. when sequence id is larger than -1, the result with gaven sequence id will be returned.
-+     *        3. if cannot find in result storage, it means either sequence id is too old and its
-+     *           result was overrided, or the sequence id is too new, and its result has not been
-+     *           saved into storage yet. For both cases, nullptr will be returned.
-+     */
-+    const AiqResult* getAiqResult(long sequence = -1);
-+
-+    // LOCAL_TONEMAP_S
-+    /**
-+     * \brief Acquire Ltm result.
-+     *
-+     * The function will return one Ltm result pointer which is kept by LTM algo.
-+     * The sequence id is set to -1 which indicates the Ltm result is invalid.
-+     *
-+     * return Ltm result pointer to be kept by LTM algo.
-+     */
-+    ltm_result_t* acquireLtmResult();
-+
-+    /**
-+     * \brief Update mCurrentLtmIndex and set sequence id in internal storage.
-+     */
-+    void updateLtmResult(long sequence);
-+
-+    /**
-+     * \brief Get the pointer of ltm_result_t.
-+     *
-+     * The function will return the latest Ltm result.
-+     *
-+     * return the latest Ltm result.
-+     */
-+    const ltm_result_t* getLtmResult(long sequence = -1);
-+    // LOCAL_TONEMAP_E
-+
-+    // INTEL_DVS_S
-+    /**
-+     * \brief Acquire Dvs result.
-+     *
-+     * The function will return one Dvs result pointer which is kept by Dvs algo.
-+     * The sequence id is set to -1 which indicates the Dvs result is invalid.
-+     *
-+     * return Dvs result pointer to be kept by Dvs algo.
-+     */
-+    DvsResult* acquireDvsResult();
-+
-+    /**
-+     * \brief Update mCurrentDvsIndex and set sequence id in internal storage.
-+     */
-+    void updateDvsResult(long sequence);
-+
-+    /**
-+     * \brief Get the pointer of DvsResult to internal storage.
-+     *
-+     * The function will return the latest DVS result.
-+     *
-+     * param[in] long sequence: specify which aiq result is needed.
-+     *
-+     * return the latest dvs result if sequence is -1, otherwise return the result of sequence.
-+     */
-+    const DvsResult* getDvsResult(long sequence = -1);
-+    // INTEL_DVS_E
-+
-+    /**
-+     * \brief Acquire AIQ statistics.
-+     *
-+     * The function will return one AIQ statistics pointer which is kept by AIQ statistics decoder.
-+     * The sequence id is set to -1 which indicates the AIQ statistics is invalid.
-+     *
-+     * return AIQ statistics pointer to be kept by AIQ statistics decoder..
-+     */
-+    AiqStatistics* acquireAiqStatistics();
-+
-+    /**
-+     * \brief Update mCurrentAiqStatsIndex and set sequence id in internal storage.
-+     */
-+    void updateAiqStatistics(long sequence);
-+
-+    /**
-+     * \brief Get the pointer of AIQ statistics to internal storage.
-+     *
-+     * The function will return the latest AIQ statistics, and set the mInUse flag to true.
-+     *
-+     * return the latest AIQ statistics.
-+     */
-+    const AiqStatistics* getAndLockAiqStatistics();
-+
-+    /**
-+     * \brief Clear the mInUse flag of all the AIQ statitics in internal storage.
-+     */
-+    void unLockAiqStatistics();
-+
-+    /**
-+     * DVS statistics storage.
-+     * A pair of {pointer to ia_dvs_statistics, sequence} is stored.
-+     * The function updateDvsStatistics() is called by PipeExecutor, while getDvsStatistics()
-+     * called by Dvs. They are called in the same thread on PSys statistics available.
-+     */
-+    /**
-+     * \brief Update the dvs statistics in internal storage.
-+     */
-+    void updateDvsStatistics(const DvsStatistics &dvsStats) { mDvsStatistics = dvsStats; }
-+    /**
-+     * \brief Get the pointer of dvs statistics to internal storage.
-+     */
-+    DvsStatistics* getDvsStatistics() { return &mDvsStatistics; }
-+
-+    /**
-+     * LTM statistics storage.
-+     * A pair of {pointer to ia_isp_bxt_hdr_yv_grid_t, sequence} is stored.
-+     * The function updateLtmStatistics() is called by PipeExecutor, while getLtmStatistics()
-+     * called by Ltm. They are called in the same thread on PSys statistics available.
-+     */
-+    /**
-+     * \brief Update the ltm statistics in internal storage.
-+     */
-+    void updateLtmStatistics(const LtmStatistics &ltmStats) { mLtmStatistics = ltmStats; }
-+    /**
-+     * \brief Get the pointer of ltm statistics to internal storage.
-+     */
-+    LtmStatistics* getLtmStatistics() { return &mLtmStatistics; }
-+
-+private:
-+    AiqResultStorage(int cameraId);
-+    ~AiqResultStorage();
-+
-+    static AiqResultStorage* getInstanceLocked(int cameraId);
-+
-+private:
-+    static std::map<int, AiqResultStorage*> sInstances;
-+    // Guard for singleton creation.
-+    static Mutex sLock;
-+
-+    int mCameraId;
-+    RWLock mDataLock;   // lock for all the data storage below
-+
-+    static const int kStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + sensorLag
-+    int mCurrentIndex = -1;
-+    AiqResult* mAiqResults[kStorageSize];
-+
-+    // LOCAL_TONEMAP_S
-+    static const int kLtmStorageSize = MAX_SETTING_COUNT; // Should > MAX_BUFFER_COUNT + ltmLag
-+    int mCurrentLtmIndex = -1;
-+    ltm_result_t* mLtmResults[kLtmStorageSize];
-+    // LOCAL_TONEMAP_E
-+
-+    // INTEL_DVS_S
-+    static const int kDvsStorageSize = MAX_SETTING_COUNT;
-+    int mCurrentDvsIndex = -1;
-+    DvsResult* mDvsResults[kDvsStorageSize];
-+    // INTEL_DVS_E
-+
-+    static const int kAiqStatsStorageSize = 3; // Always use the latest, but may hold for long time
-+    int mCurrentAiqStatsIndex = -1;
-+    AiqStatistics mAiqStatistics[kAiqStatsStorageSize];
-+
-+    DvsStatistics mDvsStatistics;
-+    LtmStatistics mLtmStatistics;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
-new file mode 100644
-index 000000000000..b9b2265ec9e4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
-@@ -0,0 +1,350 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqSetting"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqSetting.h"
-+#include "PlatformData.h"
-+#include "ParameterHelper.h"
-+
-+namespace icamera {
-+
-+AiqSetting::AiqSetting(int cameraId) :
-+    mCameraId(cameraId),
-+    mPipeSwitchFrameCount(0)
-+{
-+    LOG3A("@%s", __func__);
-+}
-+
-+AiqSetting::~AiqSetting()
-+{
-+    LOG3A("@%s", __func__);
-+}
-+
-+int AiqSetting::init(void)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoWMutex wlock(mParamLock);
-+
-+    mPipeSwitchFrameCount = 0;
-+
-+    mAiqParam.reset();
-+
-+    return OK;
-+}
-+
-+int AiqSetting::deinit(void)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoWMutex wlock(mParamLock);
-+
-+    return OK;
-+}
-+
-+int AiqSetting::configure(const stream_config_t *streamList)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoWMutex wlock(mParamLock);
-+
-+    camera_resolution_t resolution = {streamList->streams[0].width, streamList->streams[0].height};
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW) {
-+            resolution = {streamList->streams[i].width, streamList->streams[i].height};
-+            break;
-+        }
-+    }
-+
-+    updateFrameUsage(streamList);
-+
-+    mAiqParam.tuningMode = TUNING_MODE_MAX;
-+    mAiqParam.resolution = resolution;
-+
-+    mTuningModes.clear();
-+    std::vector<ConfigMode> configModes;
-+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
-+    for (auto cfg : configModes) {
-+        TuningMode tuningMode;
-+        if (PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tuningMode) == OK) {
-+            mTuningModes.push_back(tuningMode);
-+        }
-+    }
-+    if (!mTuningModes.empty()) {
-+        mAiqParam.tuningMode = mTuningModes[0];
-+    }
-+    LOG3A("%s, tuningMode %d, configMode %x", __func__, mAiqParam.tuningMode, configModes[0]);
-+
-+    return OK;
-+}
-+
-+void AiqSetting::updateFrameUsage(const stream_config_t *streamList)
-+{
-+    bool preview = false, still = false, video = false;
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        if (streamList->streams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
-+            video = true;
-+        } else if (streamList->streams[i].usage == CAMERA_STREAM_STILL_CAPTURE) {
-+            still = true;
-+        } else if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW
-+                   || streamList->streams[i].usage == CAMERA_STREAM_APP) {
-+            preview = true;
-+        }
-+    }
-+
-+    mAiqParam.frameUsage = FRAME_USAGE_PREVIEW;
-+    if (video) {
-+        mAiqParam.frameUsage = FRAME_USAGE_VIDEO;
-+    } else if (preview && still) {
-+        mAiqParam.frameUsage = FRAME_USAGE_CONTINUOUS;
-+    } else if (still) {
-+        mAiqParam.frameUsage = FRAME_USAGE_STILL;
-+    }
-+}
-+
-+int AiqSetting::setParameters(const Parameters& params)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoWMutex wlock(mParamLock);
-+
-+    // Update AE related parameters
-+    params.getAeMode(mAiqParam.aeMode);
-+    params.getAeLock(mAiqParam.aeForceLock);
-+    params.getExposureTime(mAiqParam.manualExpTimeUs);
-+    params.getSensitivityGain(mAiqParam.manualGain);
-+    params.getBlcAreaMode(mAiqParam.blcAreaMode);
-+    params.getAeRegions(mAiqParam.aeRegions);
-+    params.getAeConvergeSpeedMode(mAiqParam.aeConvergeSpeedMode);
-+    params.getAeConvergeSpeed(mAiqParam.aeConvergeSpeed);
-+    params.getRun3ACadence(mAiqParam.run3ACadence);
-+
-+    int ev = 0;
-+    camera_range_t evRange = {-3, 3};
-+    camera_rational_t evStep = {1, 1};
-+    params.getAeCompensation(ev);
-+    params.getAeCompensationRange(evRange);
-+    params.getAeCompensationStep(evStep);
-+
-+    if (evStep.denominator == 0) {
-+        mAiqParam.evShift = 0.0;
-+    } else {
-+        ev = CLIP(ev, evRange.max, evRange.min);
-+        mAiqParam.evShift = (float)ev * evStep.numerator / evStep.denominator;
-+    }
-+
-+    params.getFrameRate(mAiqParam.fps);
-+    params.getAntiBandingMode(mAiqParam.antibandingMode);
-+    // Update AWB related parameters
-+    params.getAwbMode(mAiqParam.awbMode);
-+    params.getAwbLock(mAiqParam.awbForceLock);
-+    params.getAwbCctRange(mAiqParam.cctRange);
-+    params.getAwbGains(mAiqParam.awbManualGain);
-+    params.getAwbWhitePoint(mAiqParam.whitePoint);
-+    params.getAwbGainShift(mAiqParam.awbGainShift);
-+    params.getColorTransform(mAiqParam.manualColorMatrix);
-+    params.getColorGains(mAiqParam.manualColorGains);
-+    params.getAwbConvergeSpeedMode(mAiqParam.awbConvergeSpeedMode);
-+    params.getAwbConvergeSpeed(mAiqParam.awbConvergeSpeed);
-+
-+    // Update AF related parameters
-+    params.getAfMode(mAiqParam.afMode);
-+    params.getAfRegions(mAiqParam.afRegions);
-+    params.getAfTrigger(mAiqParam.afTrigger);
-+
-+    params.getWeightGridMode(mAiqParam.weightGridMode);
-+    params.getSceneMode(mAiqParam.sceneMode);
-+
-+    params.getAeDistributionPriority(mAiqParam.aeDistributionPriority);
-+
-+    params.getWdrLevel(mAiqParam.ltmStrength);
-+
-+    unsigned int length = sizeof(mAiqParam.customAicParam.data);
-+    if (params.getCustomAicParam(mAiqParam.customAicParam.data, &length) == OK) {
-+        mAiqParam.customAicParam.length = length;
-+    }
-+
-+    params.getYuvColorRangeMode(mAiqParam.yuvColorRangeMode);
-+
-+    params.getExposureTimeRange(mAiqParam.exposureTimeRange);
-+    params.getSensitivityGainRange(mAiqParam.sensitivityGainRange);
-+
-+    params.getVideoStabilizationMode(mAiqParam.videoStabilizationMode);
-+    params.getLdcMode(mAiqParam.ldcMode);
-+    params.getRscMode(mAiqParam.rscMode);
-+    params.getFlipMode(mAiqParam.flipMode);
-+    params.getDigitalZoomRatio(mAiqParam.digitalZoomRatio);
-+
-+    int ret = params.getMakernoteMode(mAiqParam.makernoteMode);
-+    if (ret == NAME_NOT_FOUND) mAiqParam.makernoteMode = MAKERNOTE_MODE_OFF;
-+
-+    CameraMetadata meta;
-+    ParameterHelper::copyMetadata(params, &meta);
-+
-+    uint32_t tag = CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE;
-+    icamera_metadata_entry entry = meta.find(tag);
-+    if (entry.count == 1) {
-+        mAiqParam.minFocusDistance = entry.data.f[0];
-+    }
-+    params.getFocusDistance(mAiqParam.focusDistance);
-+    params.getShadingMode(mAiqParam.shadingMode);
-+    params.getLensShadingMapMode(mAiqParam.lensShadingMapMode);
-+    params.getLensInfoShadingMapSize(mAiqParam.lensShadingMapSize);
-+
-+    params.getTonemapMode(mAiqParam.tonemapMode);
-+    params.getTonemapPresetCurve(mAiqParam.tonemapPresetCurve);
-+    params.getTonemapGamma(mAiqParam.tonemapGamma);
-+
-+    mAiqParam.dump();
-+
-+    return OK;
-+}
-+
-+int AiqSetting::getAiqParameter(aiq_parameter_t &param)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoRMutex rlock(mParamLock);
-+
-+    param = mAiqParam;
-+    return OK;
-+}
-+
-+void aiq_parameter_t::reset()
-+{
-+    frameUsage = FRAME_USAGE_VIDEO;
-+    aeMode = AE_MODE_AUTO;
-+    aeForceLock = false;
-+    awbMode = AWB_MODE_AUTO;
-+    awbForceLock = false;
-+    afMode = AF_MODE_AUTO;
-+    afTrigger = AF_TRIGGER_IDLE;
-+    sceneMode = SCENE_MODE_AUTO;
-+    manualExpTimeUs = -1;
-+    manualGain = -1;
-+    evShift = 0;
-+    fps = 0;
-+    antibandingMode = ANTIBANDING_MODE_AUTO;
-+    cctRange = { 0, 0 };
-+    whitePoint = { 0, 0 };
-+    awbManualGain = { 0, 0, 0 };
-+    awbGainShift = { 0, 0, 0 };
-+    CLEAR(manualColorMatrix);
-+    CLEAR(manualColorGains);
-+    aeRegions.clear();
-+    blcAreaMode = BLC_AREA_MODE_OFF;
-+    aeConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
-+    awbConvergeSpeedMode = CONVERGE_SPEED_MODE_AIQ;
-+    aeConvergeSpeed = CONVERGE_NORMAL;
-+    awbConvergeSpeed = CONVERGE_NORMAL;
-+    run3ACadence = 1;
-+    ltmStrength = 0;
-+    weightGridMode = WEIGHT_GRID_AUTO;
-+    aeDistributionPriority = DISTRIBUTION_AUTO;
-+    CLEAR(customAicParam);
-+    yuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
-+    exposureTimeRange.min = -1;
-+    exposureTimeRange.max = -1;
-+    sensitivityGainRange.min = -1;
-+    sensitivityGainRange.max = -1;
-+    videoStabilizationMode = VIDEO_STABILIZATION_MODE_OFF;
-+    tuningMode = TUNING_MODE_MAX;
-+    ldcMode = LDC_MODE_OFF;
-+    rscMode = RSC_MODE_OFF;
-+    flipMode = FLIP_MODE_NONE;
-+    digitalZoomRatio = 1.0f;
-+
-+    lensPosition = 0;
-+    lensMovementStartTimestamp = 0;
-+    makernoteMode = MAKERNOTE_MODE_OFF;
-+    minFocusDistance = 0.0f;
-+    focusDistance = 0.0f;
-+    shadingMode = SHADING_MODE_FAST;
-+    lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
-+    lensShadingMapSize = {0, 0};
-+    CLEAR(lensShadingMap);
-+
-+    tonemapMode = TONEMAP_MODE_FAST;
-+    tonemapPresetCurve = TONEMAP_PRESET_CURVE_SRGB;
-+    tonemapGamma = 0.0f;
-+
-+    CLEAR(resolution);
-+}
-+
-+void aiq_parameter_t::dump()
-+{
-+    // Log only printed when 3a log enabled.
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return;
-+
-+    LOG3A("Application parameters:");
-+    LOG3A("frame usage mode %d", frameUsage);
-+    LOG3A("ae mode:%d, awb mode:%d, af mode:%d, scene mode:%d", aeMode, awbMode, afMode, sceneMode);
-+    LOG3A("ae lock:%d, awb lock:%d, af trigger:%d", aeForceLock, awbForceLock, afTrigger);
-+    LOG3A("EV:%f, manualExpTimeUs:%ld, manualGain:%f", evShift, manualExpTimeUs, manualGain);
-+    LOG3A("FPS:%f", fps);
-+    LOG3A("Antibanding mode:%d", antibandingMode);
-+    LOG3A("cctRange:(%f-%f)", cctRange.min, cctRange.max);
-+    LOG3A("manual white point:(%d,%d)", whitePoint.x, whitePoint.y);
-+    LOG3A("manual awb gain:(%d,%d,%d)", awbManualGain.r_gain, awbManualGain.g_gain, awbManualGain.b_gain);
-+    LOG3A("manual awb gain shift:(%d,%d,%d)", awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain);
-+    for (int i = 0; i < 3; i++) {
-+        LOG3A("manual color matrix:  [%.3f %.3f %.3f]",
-+            manualColorMatrix.color_transform[i][0],
-+            manualColorMatrix.color_transform[i][1],
-+            manualColorMatrix.color_transform[i][2]);
-+    }
-+    LOG3A("manual color gains in rggb:(%.3f,%.3f,%.3f,%.3f)",
-+        manualColorGains.color_gains_rggb[0], manualColorGains.color_gains_rggb[1],
-+        manualColorGains.color_gains_rggb[2], manualColorGains.color_gains_rggb[3]);
-+    LOG3A("ae region size:%zu, blc area mode:%d", aeRegions.size(), blcAreaMode);
-+    for (auto &region : aeRegions) {
-+        LOG3A("ae region (%d, %d, %d, %d, %d)",
-+            region.left, region.top, region.right, region.bottom, region.weight);
-+    }
-+    LOG3A("af region size:%zu", aeRegions.size());
-+    for (auto &region : afRegions) {
-+        LOG3A("af region (%d, %d, %d, %d, %d)",
-+            region.left, region.top, region.right, region.bottom, region.weight);
-+    }
-+    LOG3A("manual focus distance: %f, min focus distance: %f", focusDistance, minFocusDistance);
-+
-+    LOG3A("ae converge speed mode:(%d) awb converge speed mode:(%d)", aeConvergeSpeedMode, awbConvergeSpeedMode);
-+    LOG3A("ae converge speed:(%d) awb converge speed:(%d)", aeConvergeSpeed, awbConvergeSpeed);
-+    LOG3A("custom AIC parameter length:%d", customAicParam.length);
-+    if (customAicParam.length > 0) {
-+        LOG3A("custom AIC parameter data:%s", customAicParam.data);
-+    }
-+    if (tuningMode != TUNING_MODE_MAX) {
-+        LOG3A("camera mode:%d", tuningMode);
-+    }
-+    LOG3A("ltm strength:(%d)", ltmStrength);
-+    LOG3A("weight grid mode:%d", weightGridMode);
-+    LOG3A("AE Distribution Priority:%d", aeDistributionPriority);
-+    LOG3A("Yuv Color Range Mode:%d", yuvColorRangeMode);
-+    LOG3A("AE exposure time range, min %f, max %f", exposureTimeRange.min, exposureTimeRange.max);
-+    LOG3A("AE sensitivity gain range, min %.2f, max %.2f", sensitivityGainRange.min, sensitivityGainRange.max);
-+    LOG3A("DVS mode %d", videoStabilizationMode);
-+
-+    LOG3A("Focus position %d, start timestamp %llu", lensPosition, lensMovementStartTimestamp);
-+    LOG3A("makernoteMode %d", makernoteMode);
-+    LOG3A("shadingMode %d", shadingMode);
-+    LOG3A("lensShadingMapMode %d", lensShadingMapMode);
-+    LOG3A("lensShadingMapSize x:%d, y:%d", lensShadingMapSize.x, lensShadingMapSize.y);
-+
-+    LOG3A("tonemap mode %d, preset curve %d, gamma %f",
-+          tonemapMode, tonemapPresetCurve, tonemapGamma);
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqSetting.h b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
-new file mode 100644
-index 000000000000..52fc7e38f237
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
-@@ -0,0 +1,149 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Utils.h"
-+#include "iutils/RWLock.h"
-+#include "Parameters.h"
-+
-+#include "AiqUtils.h"
-+
-+namespace icamera {
-+
-+// Imaging algorithms that are supported
-+typedef enum {
-+    IMAGING_ALGO_NONE = 0,
-+    IMAGING_ALGO_AE   = 1,
-+    IMAGING_ALGO_AWB  = 1 << 1,
-+    IMAGING_ALGO_AF   = 1 << 2,
-+    IMAGING_ALGO_GBCE = 1 << 3,
-+    IMAGING_ALGO_PA   = 1 << 4,
-+    IMAGING_ALGO_SA   = 1 << 5
-+} imaging_algorithm_t;
-+
-+typedef struct {
-+    char data[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
-+    unsigned int length;
-+} custom_aic_param_t;
-+
-+typedef enum {
-+    FRAME_USAGE_PREVIEW,
-+    FRAME_USAGE_VIDEO,
-+    FRAME_USAGE_STILL,
-+    FRAME_USAGE_CONTINUOUS,
-+} frame_usage_mode_t;
-+
-+/*
-+ * aiq related parameters
-+ */
-+struct aiq_parameter_t {
-+    frame_usage_mode_t frameUsage;
-+    camera_ae_mode_t aeMode;
-+    bool aeForceLock;
-+    camera_awb_mode_t awbMode;
-+    bool awbForceLock;
-+    camera_af_mode_t afMode;
-+    camera_af_trigger_t afTrigger;
-+    camera_scene_mode_t sceneMode;
-+    int64_t manualExpTimeUs;
-+    float manualGain;
-+    float evShift;
-+    float fps;
-+    camera_antibanding_mode_t antibandingMode;
-+    camera_range_t cctRange;
-+    camera_coordinate_t whitePoint;
-+    camera_awb_gains_t awbManualGain;
-+    camera_awb_gains_t awbGainShift;
-+    camera_color_transform_t manualColorMatrix;
-+    camera_color_gains_t manualColorGains;
-+    camera_window_list_t aeRegions;
-+    camera_window_list_t afRegions;
-+    camera_blc_area_mode_t blcAreaMode;
-+    camera_converge_speed_mode_t aeConvergeSpeedMode;
-+    camera_converge_speed_mode_t awbConvergeSpeedMode;
-+    camera_converge_speed_t aeConvergeSpeed;
-+    camera_converge_speed_t awbConvergeSpeed;
-+    int run3ACadence;
-+    uint8_t ltmStrength;
-+    camera_weight_grid_mode_t weightGridMode;
-+    camera_ae_distribution_priority_t aeDistributionPriority;
-+    custom_aic_param_t customAicParam;
-+    camera_yuv_color_range_mode_t yuvColorRangeMode;
-+    camera_range_t exposureTimeRange;
-+    camera_range_t sensitivityGainRange;
-+    camera_video_stabilization_mode_t videoStabilizationMode;
-+    camera_resolution_t resolution;
-+    camera_ldc_mode_t ldcMode;
-+    camera_rsc_mode_t rscMode;
-+    camera_flip_mode_t flipMode;
-+    float digitalZoomRatio;
-+
-+    TuningMode tuningMode;
-+
-+    int lensPosition;
-+    unsigned long long lensMovementStartTimestamp;
-+    camera_makernote_mode_t makernoteMode;
-+    float minFocusDistance;
-+    float focusDistance;
-+    camera_shading_mode_t shadingMode;
-+    camera_lens_shading_map_mode_type_t lensShadingMapMode;
-+    camera_coordinate_t lensShadingMapSize;
-+    float lensShadingMap[MAX_LSC_GRID_SIZE * 4];
-+
-+    camera_tonemap_mode_t tonemapMode;
-+    camera_tonemap_preset_curve_t tonemapPresetCurve;
-+    float tonemapGamma;
-+
-+    aiq_parameter_t() { reset(); }
-+    void reset();
-+    void dump();
-+};
-+
-+/*
-+ * \class AiqSetting
-+ * This class is used for setting parameters to other aiq class
-+ * and return some useful status of aiq results
-+ */
-+class AiqSetting {
-+
-+public:
-+    AiqSetting(int cameraId);
-+    ~AiqSetting();
-+
-+    int init(void);
-+    int deinit(void);
-+    int configure(const stream_config_t *streamList);
-+
-+    int setParameters(const Parameters& params);
-+
-+    int getAiqParameter(aiq_parameter_t &param);
-+
-+private:
-+    void updateFrameUsage(const stream_config_t *streamList);
-+
-+public:
-+    int mCameraId;
-+
-+private:
-+    std::vector<TuningMode> mTuningModes;
-+    unsigned int mPipeSwitchFrameCount;
-+    aiq_parameter_t mAiqParam;
-+
-+    RWLock mParamLock;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
-new file mode 100644
-index 000000000000..a5e55db45ed0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.cpp
-@@ -0,0 +1,147 @@
-+/*
-+ * Copyright (C) 2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqStatistics"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqStatistics.h"
-+
-+namespace icamera {
-+
-+AiqStatistics::AiqStatistics()
-+{
-+    CLEAR(mRgbsGridArray);
-+    CLEAR(mAfGridArray);
-+}
-+
-+AiqStatistics::~AiqStatistics()
-+{
-+    for (unsigned int i = 0; i < MAX_EXPOSURES_NUM; i++) {
-+        delete [] mRgbsGridArray[i].blocks_ptr;
-+        mRgbsGridArray[i].blocks_ptr = nullptr;
-+
-+        delete [] mAfGridArray[i].filter_response_1;
-+        mAfGridArray[i].filter_response_1 = nullptr;
-+        delete [] mAfGridArray[i].filter_response_2;
-+        mAfGridArray[i].filter_response_2 = nullptr;
-+    }
-+}
-+
-+AiqStatistics &AiqStatistics::operator=(const AiqStatistics &other)
-+{
-+    mSequence = other.mSequence;
-+    mTimestamp = other.mTimestamp;
-+    mTuningMode = other.mTuningMode;
-+
-+    const ia_aiq_rgbs_grid *rgbs_grid[MAX_EXPOSURES_NUM];
-+    for (int i = 0; i < other.mExposureNum; i++) {
-+        rgbs_grid[i] = &other.mRgbsGridArray[i];
-+    }
-+    saveRgbsGridData(rgbs_grid, other.mExposureNum);
-+
-+    saveAfGridData(&other.mAfGridArray[0]);
-+
-+    return *this;
-+}
-+
-+#define GRID_SIZE_UNEQUAL(g1, g2) \
-+        ((g1)->grid_width != (g2)->grid_width || (g1)->grid_height != (g2)->grid_height)
-+
-+int AiqStatistics::saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrids, int exposureNum)
-+{
-+    CheckError(rgbsGrids == nullptr, BAD_VALUE, "Rgbs grid is null");
-+
-+    for (int i = 0; i < exposureNum; i++) {
-+        int ret = copyRgbsGridData(rgbsGrids[i], &mRgbsGridArray[i]);
-+        CheckError(ret != OK, ret, "save Rgbs grid %d failed ret %d", i, ret);
-+    }
-+    mExposureNum = exposureNum;
-+    return OK;
-+}
-+
-+int AiqStatistics::copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst)
-+{
-+    LOG3A("%s", __func__);
-+    CheckError(src == nullptr || dst == nullptr, BAD_VALUE, "src or dst rgbs grid is null");
-+
-+    // Release the old memory if size changes.
-+    if (GRID_SIZE_UNEQUAL(src, dst)) {
-+        if (dst->blocks_ptr) delete [] dst->blocks_ptr;
-+        CLEAR(*dst);
-+    }
-+
-+    if (src->blocks_ptr == nullptr || src->grid_width == 0 || src->grid_height == 0) {
-+        return OK;
-+    }
-+
-+    size_t gridSize = src->grid_width * src->grid_height;
-+    if (dst->blocks_ptr == nullptr) {
-+        dst->blocks_ptr = new rgbs_grid_block[gridSize];
-+    }
-+
-+    dst->grid_width = src->grid_width;
-+    dst->grid_height = src->grid_height;
-+    MEMCPY_S(dst->blocks_ptr, gridSize * sizeof(rgbs_grid_block),
-+             src->blocks_ptr, gridSize * sizeof(rgbs_grid_block));
-+
-+    dst->shading_correction = src->shading_correction;
-+
-+    LOG3A("%s, grid size=[%dx%d]", __func__, dst->grid_width, dst->grid_height);
-+    return OK;
-+}
-+
-+int AiqStatistics::saveAfGridData(const ia_aiq_af_grid *afGrid)
-+{
-+    LOG3A("%s", __func__);
-+    CheckError(afGrid == nullptr, BAD_VALUE, "AF grid is null");
-+
-+    // Release the old memory if size changes.
-+    if (GRID_SIZE_UNEQUAL(afGrid, &mAfGridArray[0])) {
-+        if (mAfGridArray[0].filter_response_1) delete [] mAfGridArray[0].filter_response_1;
-+        if (mAfGridArray[0].filter_response_2) delete [] mAfGridArray[0].filter_response_2;
-+        CLEAR(mAfGridArray);
-+    }
-+
-+    if (afGrid->filter_response_1 == nullptr || afGrid->filter_response_2 == nullptr
-+        || afGrid->grid_width == 0 || afGrid->grid_height == 0) {
-+        return OK;
-+    }
-+
-+    size_t gridSize = afGrid->grid_width * afGrid->grid_height;
-+    if (mAfGridArray[0].filter_response_1 == nullptr) {
-+        mAfGridArray[0].filter_response_1 = new int[gridSize];
-+    }
-+    if (mAfGridArray[0].filter_response_2 == nullptr) {
-+        mAfGridArray[0].filter_response_2 = new int[gridSize];
-+    }
-+
-+    mAfGridArray[0].grid_width = afGrid->grid_width;
-+    mAfGridArray[0].grid_height = afGrid->grid_height;
-+    mAfGridArray[0].block_width = afGrid->block_width;
-+    mAfGridArray[0].block_height = afGrid->block_height;
-+    MEMCPY_S(mAfGridArray[0].filter_response_1, gridSize * sizeof(int),
-+             afGrid->filter_response_1, gridSize * sizeof(int));
-+    MEMCPY_S(mAfGridArray[0].filter_response_2, gridSize * sizeof(int),
-+             afGrid->filter_response_2, gridSize * sizeof(int));
-+
-+    LOG3A("%s, grid size=[%dx%d]", __func__, mAfGridArray[0].grid_width, mAfGridArray[0].grid_height);
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqStatistics.h b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
-new file mode 100644
-index 000000000000..da4a2ec34ef3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqStatistics.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_aiq_types.h"
-+#include "ia_isp_bxt_types.h"
-+#include "ia_dvs_types.h"
-+#include "ia_isp_bxt_statistics_types.h"
-+
-+#include "AiqUtils.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class AiqStatistics
-+ *
-+ * This class is used to envelop AIQ statistics.
-+ */
-+class AiqStatistics {
-+public:
-+    AiqStatistics();
-+    ~AiqStatistics();
-+
-+    AiqStatistics& operator=(const AiqStatistics& other);
-+
-+    int saveRgbsGridData(const ia_aiq_rgbs_grid* const *rgbsGrid, int exposureNum);
-+    int saveAfGridData(const ia_aiq_af_grid *afGrid);
-+
-+private:
-+    int copyRgbsGridData(const ia_aiq_rgbs_grid *src, ia_aiq_rgbs_grid *dst);
-+
-+public:
-+    long mSequence = -1;
-+    unsigned long long mTimestamp = 0;
-+    TuningMode mTuningMode = TUNING_MODE_MAX;
-+    bool mInUse = false;
-+
-+    int mExposureNum = 0;
-+    ia_aiq_rgbs_grid mRgbsGridArray[MAX_EXPOSURES_NUM];
-+    ia_aiq_af_grid mAfGridArray[MAX_EXPOSURES_NUM];
-+};
-+
-+} /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
-new file mode 100644
-index 000000000000..d197d2e68029
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
-@@ -0,0 +1,271 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqUnit"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqUnit.h"
-+
-+namespace icamera {
-+
-+AiqUnit::AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw) :
-+    mCameraId(cameraId),
-+    mAiqUnitState(AIQ_UNIT_NOT_INIT),
-+    // LOCAL_TONEMAP_S
-+    mLtm(nullptr),
-+    // LOCAL_TONEMAP_E
-+    mFirstAiqRunning(true)
-+{
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    mAiqSetting = new AiqSetting(cameraId);
-+
-+    mAiqEngine = new AiqEngine(cameraId, sensorHw, lensHw, mAiqSetting);
-+
-+    // INTEL_DVS_S
-+    mDvs = new Dvs(cameraId, mAiqSetting);
-+    // INTEL_DVS_E
-+    // LOCAL_TONEMAP_S
-+    if (PlatformData::isLtmEnabled(mCameraId)) {
-+        mLtm = new Ltm(cameraId);
-+    }
-+    // LOCAL_TONEMAP_E
-+}
-+
-+AiqUnit::~AiqUnit()
-+{
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    if (mAiqUnitState == AIQ_UNIT_START) {
-+        stop();
-+    }
-+
-+    if (mAiqUnitState == AIQ_UNIT_INIT) {
-+        deinit();
-+    }
-+
-+    // LOCAL_TONEMAP_S
-+    delete mLtm;
-+    // LOCAL_TONEMAP_E
-+    // INTEL_DVS_S
-+    delete mDvs;
-+    // INTEL_DVS_E
-+    delete mAiqEngine;
-+    delete mAiqSetting;
-+}
-+
-+int AiqUnit::init()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    int ret = mAiqSetting->init();
-+    if (ret != OK) {
-+        mAiqSetting->deinit();
-+        return ret;
-+    }
-+
-+    if (mAiqUnitState == AIQ_UNIT_NOT_INIT) {
-+        ret = mAiqEngine->init();
-+        if (ret != OK) {
-+            mAiqEngine->deinit();
-+            return ret;
-+        }
-+
-+        // INTEL_DVS_S
-+        mDvs->init();
-+        // INTEL_DVS_E
-+        // LOCAL_TONEMAP_S
-+        if (mLtm) {
-+            mLtm->init();
-+        }
-+        // LOCAL_TONEMAP_E
-+    }
-+
-+    mAiqUnitState = AIQ_UNIT_INIT;
-+
-+    return OK;
-+}
-+
-+int AiqUnit::deinit()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    // LOCAL_TONEMAP_S
-+    if (mLtm) {
-+        mLtm->deinit();
-+    }
-+    // LOCAL_TONEMAP_E
-+    // INTEL_DVS_S
-+    mDvs->deinit();
-+    // INTEL_DVS_E
-+    mAiqEngine->deinit();
-+
-+    mAiqSetting->deinit();
-+
-+    mAiqUnitState = AIQ_UNIT_NOT_INIT;
-+
-+    return OK;
-+}
-+
-+int AiqUnit::configure(const stream_config_t *streamList)
-+{
-+    CheckError(streamList == nullptr, BAD_VALUE, "streamList is nullptr");
-+
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    if (mAiqUnitState != AIQ_UNIT_INIT && mAiqUnitState != AIQ_UNIT_STOP) {
-+        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
-+        return BAD_VALUE;
-+    }
-+
-+    std::vector<ConfigMode> configModes;
-+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
-+
-+    int ret = mAiqSetting->configure(streamList);
-+    CheckError(ret != OK, ret, "configure AIQ settings error: %d", ret);
-+
-+    ret = mAiqEngine->configure(configModes);
-+    CheckError(ret != OK, ret, "configure AIQ engine error: %d", ret);
-+    // INTEL_DVS_S
-+    ret = mDvs->configure(configModes);
-+    CheckError(ret != OK, ret, "configure DVS engine error: %d", ret);
-+    // INTEL_DVS_E
-+    // LOCAL_TONEMAP_S
-+    if (mLtm) {
-+        ret = mLtm->configure(configModes);
-+        CheckError(ret != OK, ret, "configure LTM engine error: %d", ret);
-+    }
-+    // LOCAL_TONEMAP_E
-+
-+    mAiqUnitState = AIQ_UNIT_CONFIGURED;
-+    return OK;
-+}
-+
-+int AiqUnit::start()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    if (mAiqUnitState != AIQ_UNIT_CONFIGURED && mAiqUnitState != AIQ_UNIT_STOP) {
-+        LOGW("%s: configure in wrong state: %d", __func__, mAiqUnitState);
-+        return BAD_VALUE;
-+    }
-+
-+    // LOCAL_TONEMAP_S
-+    if (mLtm) {
-+        mLtm->start();
-+    }
-+    // LOCAL_TONEMAP_E
-+    int ret = mAiqEngine->startEngine();
-+    if (ret == OK) {
-+        mAiqUnitState = AIQ_UNIT_START;
-+    }
-+
-+    mFirstAiqRunning = true;
-+
-+    return OK;
-+}
-+
-+int AiqUnit::stop()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    if (mAiqUnitState == AIQ_UNIT_START) {
-+        mAiqEngine->stopEngine();
-+        // LOCAL_TONEMAP_S
-+        if (mLtm) {
-+            mLtm->stop();
-+        }
-+        // LOCAL_TONEMAP_E
-+    }
-+
-+    mAiqUnitState = AIQ_UNIT_STOP;
-+
-+    return OK;
-+}
-+
-+int AiqUnit::run3A(long *settingSequence)
-+{
-+    AutoMutex l(mAiqUnitLock);
-+
-+    if (settingSequence)
-+       *settingSequence = -1;
-+
-+    if (mAiqUnitState != AIQ_UNIT_START) {
-+        LOGW("%s: AIQ is not started: %d", __func__, mAiqUnitState);
-+        return BAD_VALUE;
-+    }
-+
-+    int ret = mAiqEngine->run3A(settingSequence);
-+    CheckError(ret != OK, ret, "run 3A failed.");
-+
-+    if (mFirstAiqRunning) {
-+        // LOCAL_TONEMAP_S
-+        if (mLtm) {
-+            aiq_parameter_t aiqParam;
-+            mAiqSetting->getAiqParameter(aiqParam);
-+            // Run Ltm without stat after first AiqResults have been saved
-+            mLtm->handleLtm(nullptr);
-+        }
-+        // LOCAL_TONEMAP_E
-+        mFirstAiqRunning = false;
-+    }
-+
-+    return OK;
-+}
-+
-+std::vector<EventListener*> AiqUnit::getSofEventListener()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    std::vector<EventListener*> eventListenerList;
-+    eventListenerList.push_back(mAiqEngine->getSofEventListener());
-+    return eventListenerList;
-+}
-+
-+std::vector<EventListener*> AiqUnit::getStatsEventListener()
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    std::vector<EventListener*> eventListenerList;
-+    // LOCAL_TONEMAP_S
-+    if (mLtm) {
-+        eventListenerList.push_back(mLtm);
-+    }
-+    // LOCAL_TONEMAP_E
-+    // INTEL_DVS_S
-+    eventListenerList.push_back(mDvs);
-+    // INTEL_DVS_E
-+    return eventListenerList;
-+}
-+
-+int AiqUnit::setParameters(const Parameters &params)
-+{
-+    AutoMutex l(mAiqUnitLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    return mAiqSetting->setParameters(params);
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqUnit.h b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
-new file mode 100644
-index 000000000000..9aac6840480b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
-@@ -0,0 +1,157 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "CameraEvent.h"
-+
-+#include "AiqSetting.h"
-+#include "AiqEngine.h"
-+// INTEL_DVS_S
-+#include "Dvs.h"
-+// INTEL_DVS_E
-+// LOCAL_TONEMAP_S
-+#include "Ltm.h"
-+// LOCAL_TONEMAP_E
-+
-+namespace icamera {
-+
-+class SensorHwCtrl;
-+class LensHw;
-+
-+/*
-+ * \class AiqUnit
-+ * This class is used for upper layer to control 3a engine.
-+ */
-+
-+class AiqUnitBase{
-+
-+public:
-+    AiqUnitBase() {}
-+    virtual ~AiqUnitBase() {}
-+
-+    virtual int init() { return OK; }
-+    virtual int deinit() { return OK; }
-+    virtual int configure(const stream_config_t * /*streamList*/) { return OK; }
-+    virtual int start() { return OK; }
-+    virtual int stop() { return OK; }
-+    virtual int run3A(long * /*settingSequence*/)  { return OK; }
-+
-+    virtual std::vector<EventListener*> getSofEventListener()
-+    {
-+        std::vector<EventListener*> eventListenerList;
-+        return eventListenerList;
-+    }
-+    virtual std::vector<EventListener*> getStatsEventListener()
-+    {
-+        std::vector<EventListener*> eventListenerList;
-+        return eventListenerList;
-+    }
-+
-+    virtual int setParameters(const Parameters & /*params*/) { return OK; }
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(AiqUnitBase);
-+
-+};
-+
-+class AiqUnit : public AiqUnitBase {
-+
-+public:
-+    AiqUnit(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
-+    ~AiqUnit();
-+
-+    /**
-+     * \brief Init 3a related objects
-+     */
-+    int init();
-+
-+    /**
-+     * \brief Deinit 3a related objects
-+     */
-+    int deinit();
-+
-+    /**
-+     * \brief configure 3a engine with stream configuration
-+     */
-+    int configure(const stream_config_t *streamList);
-+
-+    /**
-+     * \brief Start 3a Engine
-+     */
-+    int start();
-+
-+    /**
-+     * \brief Stop 3a Engine
-+     */
-+    int stop();
-+
-+    /**
-+     * \brief Run 3a to get new 3a settings.
-+     * Return 0 if the operation succeeds, and output settingSequence to
-+     * indicate the frame that settings are applied.
-+     * settingSequence -1 means uncertain frame for this settings.
-+     */
-+    int run3A(long *settingSequence);
-+
-+    /**
-+     * \brief Get software EventListener
-+     */
-+    std::vector<EventListener*> getSofEventListener();
-+
-+    /**
-+     * \brief Get stats EventListener
-+     */
-+    std::vector<EventListener*> getStatsEventListener();
-+
-+    /**
-+     * \brief Set 3A Parameters
-+     *
-+     * \param params: the Parameters update to 3A
-+     */
-+    int setParameters(const Parameters &params);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(AiqUnit);
-+
-+private:
-+    int mCameraId;
-+    enum AiqUnitState {
-+        AIQ_UNIT_NOT_INIT = 0,
-+        AIQ_UNIT_INIT,
-+        AIQ_UNIT_CONFIGURED,
-+        AIQ_UNIT_START,
-+        AIQ_UNIT_STOP,
-+        AIQ_UNIT_MAX
-+    } mAiqUnitState;
-+
-+    // INTEL_DVS_S
-+    Dvs *mDvs;
-+    // INTEL_DVS_E
-+    // LOCAL_TONEMAP_S
-+    Ltm *mLtm;
-+    // LOCAL_TONEMAP_E
-+    AiqEngine *mAiqEngine;
-+    AiqSetting *mAiqSetting;
-+
-+    bool mFirstAiqRunning;
-+
-+    // Guard for AiqUnit public API.
-+    Mutex mAiqUnitLock;
-+};
-+
-+} /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
-new file mode 100644
-index 000000000000..83e52afa0d91
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
-@@ -0,0 +1,506 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqUtils"
-+
-+#include <math.h>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+#include "AiqUtils.h"
-+#include "AiqSetting.h"
-+
-+namespace icamera {
-+
-+#define TONEMAP_MIN_POINTS 64
-+
-+int AiqUtils::deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst)
-+{
-+    LOG3A("@%s", __func__);
-+
-+    /**
-+     * lets check that all the pointers are there
-+     * in the source and in the destination
-+     */
-+    CheckError(!dst||!dst->exposures||!dst->flashes||!dst->weight_grid||!dst->weight_grid->weights
-+        ,BAD_VALUE ,"Failed to deep copy AE result- invalid destination");
-+
-+    CheckError(!src.exposures||!src.flashes||!src.weight_grid||!src.weight_grid->weights
-+        ,BAD_VALUE ,"Failed to deep copy AE result- invalid source");
-+
-+    dst->lux_level_estimate = src.lux_level_estimate;
-+    dst->flicker_reduction_mode = src.flicker_reduction_mode;
-+    dst->multiframe = src.multiframe;
-+    dst->num_flashes = src.num_flashes;
-+    dst->num_exposures = src.num_exposures;
-+    if (src.aperture_control) {
-+        *dst->aperture_control = *src.aperture_control;
-+    }
-+    for (unsigned int i = 0; i < dst->num_exposures; i++)
-+    {
-+        dst->exposures[i].converged = src.exposures[i].converged;
-+        dst->exposures[i].distance_from_convergence = src.exposures[i].distance_from_convergence;
-+        dst->exposures[i].exposure_index = src.exposures[i].exposure_index;
-+        if (src.exposures[i].exposure) {
-+            *dst->exposures[i].exposure = *src.exposures[i].exposure;
-+        }
-+        if (src.exposures[i].sensor_exposure) {
-+            *dst->exposures[i].sensor_exposure = *src.exposures[i].sensor_exposure;
-+        }
-+    }
-+
-+    // Copy weight grid
-+    dst->weight_grid->width = src.weight_grid->width;
-+    dst->weight_grid->height = src.weight_grid->height;
-+
-+    unsigned int gridElements  = src.weight_grid->width *
-+                                 src.weight_grid->height;
-+    gridElements = CLIP(gridElements, MAX_AE_GRID_SIZE, 1);
-+    MEMCPY_S(dst->weight_grid->weights, gridElements*sizeof(char),
-+             src.weight_grid->weights, gridElements*sizeof(char));
-+
-+    // Copy the flash info structure
-+    MEMCPY_S(dst->flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters),
-+             src.flashes, NUM_FLASH_LEDS*sizeof(ia_aiq_flash_parameters));
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst)
-+{
-+    LOG3A("@%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE, "Failed to deep copy Af result- invalid destination or Source");
-+
-+    MEMCPY_S(dst, sizeof(ia_aiq_af_results), &src, sizeof(ia_aiq_af_results));
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst)
-+{
-+    LOG3A("@%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE, "Failed to deep copy Awb result- invalid destination or Source");
-+
-+    MEMCPY_S(dst, sizeof(ia_aiq_awb_results), &src, sizeof(ia_aiq_awb_results));
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst||!dst->r_gamma_lut||!dst->g_gamma_lut||!dst->b_gamma_lut||!dst->tone_map_lut
-+        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid destination");
-+    CheckError(!src.r_gamma_lut||!src.g_gamma_lut||!src.b_gamma_lut
-+        ,BAD_VALUE ,"Failed to deep copy GBCE result- invalid source");
-+
-+    MEMCPY_S(dst->r_gamma_lut, src.gamma_lut_size*sizeof(float),
-+             src.r_gamma_lut, src.gamma_lut_size*sizeof(float));
-+
-+    MEMCPY_S(dst->g_gamma_lut, src.gamma_lut_size*sizeof(float),
-+             src.g_gamma_lut, src.gamma_lut_size*sizeof(float));
-+
-+    MEMCPY_S(dst->b_gamma_lut, src.gamma_lut_size*sizeof(float),
-+             src.b_gamma_lut, src.gamma_lut_size*sizeof(float));
-+
-+    dst->gamma_lut_size = src.gamma_lut_size;
-+
-+    // Copy tone mapping table
-+    if (src.tone_map_lut != nullptr)
-+    {
-+        MEMCPY_S(dst->tone_map_lut, src.tone_map_lut_size * sizeof(float),
-+                 src.tone_map_lut, src.tone_map_lut_size * sizeof(float));
-+
-+    }
-+    dst->tone_map_lut_size = src.tone_map_lut_size; // zero indicates GBCE is ineffective.
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
-+                                ia_aiq_advanced_ccm_t* preferredAcm)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy PA result- invalid destination");
-+
-+    MEMCPY_S(dst->color_conversion_matrix, sizeof(dst->color_conversion_matrix),
-+             src.color_conversion_matrix, sizeof(src.color_conversion_matrix));
-+    for (unsigned int i = 0; i < 4; i++)
-+        for (unsigned int j = 0; j < 4; j++)
-+            dst->black_level_4x4[i][j] = src.black_level_4x4[i][j];
-+    dst->color_gains = src.color_gains;
-+    dst->saturation_factor = src.saturation_factor;
-+    dst->brightness_level = src.brightness_level;
-+
-+    if (src.ir_weight) {
-+        unsigned long int irSize = src.ir_weight->width * src.ir_weight->height;
-+        if (irSize) {
-+            LOG3A("%s irSize = %ld", __func__, irSize);
-+            MEMCPY_S(dst->ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short),
-+                     src.ir_weight->ir_weight_grid_R, irSize * sizeof(unsigned short));
-+            MEMCPY_S(dst->ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short),
-+                     src.ir_weight->ir_weight_grid_G, irSize * sizeof(unsigned short));
-+            MEMCPY_S(dst->ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short),
-+                     src.ir_weight->ir_weight_grid_B, irSize * sizeof(unsigned short));
-+            dst->ir_weight->width = src.ir_weight->width;
-+            dst->ir_weight->height = src.ir_weight->height;
-+        }
-+    }
-+
-+    if (src.preferred_acm && src.preferred_acm->sector_count) {
-+        dst->preferred_acm = preferredAcm;
-+
-+        LOG3A("%s advanced ccm sector count = %d", __func__, src.preferred_acm->sector_count);
-+        MEMCPY_S(dst->preferred_acm->hue_of_sectors,
-+                 src.preferred_acm->sector_count * sizeof(unsigned int),
-+                 src.preferred_acm->hue_of_sectors,
-+                 src.preferred_acm->sector_count * sizeof(unsigned int));
-+        MEMCPY_S(dst->preferred_acm->advanced_color_conversion_matrices,
-+                 src.preferred_acm->sector_count * sizeof(float[3][3]),
-+                 src.preferred_acm->advanced_color_conversion_matrices,
-+                 src.preferred_acm->sector_count  * sizeof(float[3][3]));
-+        dst->preferred_acm->sector_count = src.preferred_acm->sector_count;
-+    } else {
-+        dst->preferred_acm = nullptr;
-+    }
-+
-+    /* current linearization.size is zero, set related pointers to nullptr */
-+    dst->linearization.r = nullptr;
-+    dst->linearization.gr = nullptr;
-+    dst->linearization.gb = nullptr;
-+    dst->linearization.b = nullptr;
-+    dst->linearization.size = 0;
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM result- invalid destination");
-+
-+    MEMCPY_S(dst, sizeof(ia_ltm_results), &src, sizeof(ia_ltm_results));
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE ,"Failed to deep copy LTM DRC params- invalid destination");
-+
-+    MEMCPY_S(dst, sizeof(ia_ltm_drc_params), &src, sizeof(ia_ltm_drc_params));
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE, "Failed to deep copy SA result- invalid destination");
-+
-+    const size_t gridSize = src.width * src.height;
-+    if ((size_t)(dst->width * dst->height) < gridSize) {
-+        LOG3A("%s: increases the size of LSC table from %dx%d to %dx%d.",
-+              __func__, dst->width, dst->height, src.width, src.height);
-+
-+        // allocated buffer is too small to accomodate what SA returns.
-+        for (int i = 0; i < MAX_BAYER_ORDER_NUM; ++i) {
-+            for (int j = 0; j < MAX_BAYER_ORDER_NUM; ++j) {
-+                // re-allocate
-+                delete [] dst->lsc_grid[i][j];
-+                dst->lsc_grid[i][j] = new unsigned short[gridSize];
-+
-+                // copy a table
-+                if (src.lsc_grid[i][j]) {
-+                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
-+                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
-+                }
-+            }
-+        }
-+    } else {
-+        // copy tables
-+        for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
-+            for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
-+                if (dst->lsc_grid[i][j] && src.lsc_grid[i][j]) {
-+                    MEMCPY_S(dst->lsc_grid[i][j], gridSize * sizeof(unsigned short),
-+                             src.lsc_grid[i][j], gridSize * sizeof(unsigned short));
-+                }
-+            }
-+        }
-+    }
-+
-+    dst->width = src.width;
-+    dst->height = src.height;
-+    dst->lsc_update = src.lsc_update;
-+    dst->fraction_bits = src.fraction_bits;
-+    dst->color_order = src.color_order;
-+
-+    MEMCPY_S(dst->light_source, sizeof(dst->light_source), src.light_source, sizeof(src.light_source));
-+    MEMCPY_S(&dst->frame_params, sizeof(dst->frame_params), &src.frame_params, sizeof(src.frame_params));
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
-+          || !dst->xcoords_uv || !dst->ycoords_uv
-+          || !dst->xcoords_uv_float || !dst->ycoords_uv_float
-+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
-+
-+    CheckError(!src.xcoords_y || !src.ycoords_y
-+          || !src.xcoords_uv || !src.ycoords_uv
-+          || !src.xcoords_uv_float || !src.ycoords_uv_float
-+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source");
-+
-+    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0
-+          ,BAD_VALUE ,"Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
-+          src.width_y, src.height_y, src.width_uv, src.height_uv);
-+
-+    dst->width_y = src.width_y;
-+    dst->height_y = src.height_y;
-+    dst->width_uv = src.width_uv;
-+    dst->height_uv = src.height_uv;
-+    dst->morph_table_changed = src.morph_table_changed;
-+    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
-+    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
-+    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
-+    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
-+    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
-+    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
-+
-+    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
-+    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
-+    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
-+
-+    return OK;
-+}
-+
-+int AiqUtils::deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst,BAD_VALUE ,"Failed to deep copy DVS result- invalid destination");
-+
-+    dst->num_homography_matrices = src.num_homography_matrices;
-+    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
-+
-+    return OK;
-+}
-+
-+int AiqUtils::convertError(ia_err iaErr)
-+{
-+    LOG3A("%s, iaErr = %d", __func__, iaErr);
-+    switch (iaErr) {
-+    case ia_err_none:
-+        return OK;
-+    case ia_err_general:
-+        return UNKNOWN_ERROR;
-+    case ia_err_nomemory:
-+        return NO_MEMORY;
-+    case ia_err_data:
-+        return BAD_VALUE;
-+    case ia_err_internal:
-+        return INVALID_OPERATION;
-+    case ia_err_argument:
-+        return BAD_VALUE;
-+    default:
-+        return UNKNOWN_ERROR;
-+    }
-+}
-+
-+/**
-+ * Convert SensorFrameParams defined in PlatformData to ia_aiq_frame_params in aiq
-+ */
-+void AiqUtils::convertToAiqFrameParam(const SensorFrameParams &sensor, ia_aiq_frame_params &aiq)
-+{
-+    aiq.cropped_image_height = sensor.cropped_image_height;
-+    aiq.cropped_image_width = sensor.cropped_image_width;
-+    aiq.horizontal_crop_offset = sensor.horizontal_crop_offset;
-+    aiq.horizontal_scaling_denominator = sensor.horizontal_scaling_denominator;
-+    aiq.horizontal_scaling_numerator = sensor.horizontal_scaling_numerator;
-+    aiq.vertical_crop_offset = sensor.vertical_crop_offset;
-+    aiq.vertical_scaling_denominator = sensor.vertical_scaling_denominator;
-+    aiq.vertical_scaling_numerator = sensor.vertical_scaling_numerator;
-+}
-+
-+camera_coordinate_t AiqUtils::convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
-+                                                      const camera_coordinate_system_t& dstSystem,
-+                                                      const camera_coordinate_t& srcCoordinate)
-+{
-+    int dstWidth = dstSystem.right - dstSystem.left;
-+    int dstHeight = dstSystem.bottom - dstSystem.top;
-+    int srcWidth = srcSystem.right - srcSystem.left;
-+    int srcHeight = srcSystem.bottom - srcSystem.top;
-+
-+    camera_coordinate_t result;
-+    result.x = (srcCoordinate.x - srcSystem.left) * dstWidth / srcWidth + dstSystem.left;
-+    result.y = (srcCoordinate.y - srcSystem.top) * dstHeight / srcHeight + dstSystem.top;
-+
-+    return result;
-+}
-+
-+camera_coordinate_t AiqUtils::convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
-+                                                    const camera_coordinate_t& srcCoordinate)
-+{
-+    camera_coordinate_system_t iaCoordinate = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
-+                                               IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
-+
-+    return convertCoordinateSystem(srcSystem, iaCoordinate, srcCoordinate);
-+}
-+
-+camera_window_t AiqUtils::convertToIaWindow(const camera_coordinate_system_t& srcSystem,
-+                                            const camera_window_t& srcWindow)
-+{
-+    camera_coordinate_t leftTop;
-+    camera_coordinate_t rightBottom;
-+    leftTop.x     = srcWindow.left;
-+    leftTop.y     = srcWindow.top;
-+    rightBottom.x = srcWindow.right;
-+    rightBottom.y = srcWindow.bottom;
-+    leftTop       = convertToIaCoordinate(srcSystem, leftTop);
-+    rightBottom   = convertToIaCoordinate(srcSystem, rightBottom);
-+
-+    camera_window_t result;
-+    result.left   = leftTop.x;
-+    result.top    = leftTop.y;
-+    result.right  = rightBottom.x;
-+    result.bottom = rightBottom.y;
-+    result.weight = srcWindow.weight;
-+    return result;
-+}
-+
-+/**
-+ * Map user input manual gain(0, 255) to (AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END)
-+ */
-+float AiqUtils::normalizeAwbGain(int gain)
-+{
-+    gain = CLIP(gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
-+    return AWB_GAIN_NORMALIZED_START + (float)(gain - AWB_GAIN_MIN) * \
-+                                       AWB_GAIN_RANGE_NORMALIZED / AWB_GAIN_RANGE_USER;
-+}
-+
-+int AiqUtils::convertToUserAwbGain(float normalizedGain)
-+{
-+    normalizedGain = CLIP(normalizedGain, AWB_GAIN_NORMALIZED_START, AWB_GAIN_NORMALIZED_END);
-+    return AWB_GAIN_MIN + (normalizedGain - AWB_GAIN_NORMALIZED_START) * \
-+                          AWB_GAIN_RANGE_USER / AWB_GAIN_RANGE_NORMALIZED;
-+}
-+
-+float AiqUtils::convertSpeedModeToTime(camera_converge_speed_t mode)
-+{
-+    float convergenceTime = -1;
-+    /*
-+     * The unit of manual_convergence_time is second, and 3.0 means 3 seconds.
-+     * The default value can be changed based on customer requirement.
-+     */
-+    switch (mode) {
-+        case CONVERGE_MID:
-+            convergenceTime = 3.0;
-+            break;
-+        case CONVERGE_LOW:
-+            convergenceTime = 5.0;
-+            break;
-+        case CONVERGE_NORMAL:
-+        default:
-+            convergenceTime = -1;
-+            break;
-+    }
-+    return convergenceTime;
-+}
-+
-+/*
-+ * Get ia_aiq_frame_use
-+ *
-+ * Convert frame usage to ia_aiq_frame_use
-+ */
-+ia_aiq_frame_use AiqUtils::convertFrameUsageToIaFrameUsage(int frameUsage)
-+{
-+    switch (frameUsage) {
-+        case FRAME_USAGE_VIDEO:
-+            return ia_aiq_frame_use_video;
-+        case FRAME_USAGE_STILL:
-+            return ia_aiq_frame_use_still;
-+        case FRAME_USAGE_CONTINUOUS:
-+            return ia_aiq_frame_use_continuous;
-+    }
-+    return ia_aiq_frame_use_preview;
-+}
-+
-+void AiqUtils::applyTonemapGamma(float gamma, ia_aiq_gbce_results* results) {
-+    CheckError(gamma < EPSILON, VOID_VALUE, "Bad gamma %f", gamma);
-+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
-+
-+    int lutSize = results->gamma_lut_size;
-+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
-+    for (int i = 0; i < lutSize; i++) {
-+        results->g_gamma_lut[i] = pow(i / static_cast<float>(lutSize), 1 / gamma);
-+    }
-+
-+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+}
-+
-+void AiqUtils::applyTonemapSRGB(ia_aiq_gbce_results* results) {
-+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
-+
-+    int lutSize = results->gamma_lut_size;
-+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
-+    for (int i = 0; i < lutSize; i++) {
-+        if (i / (lutSize - 1)  < 0.0031308)
-+            results->g_gamma_lut[i] = 12.92 * (i / (lutSize - 1));
-+        else
-+            results->g_gamma_lut[i] =
-+                    1.055 * pow(i / static_cast<float>(lutSize - 1), 1 / 2.4) - 0.055;
-+    }
-+
-+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+}
-+
-+void AiqUtils::applyTonemapREC709(ia_aiq_gbce_results* results) {
-+    CheckError(!results, VOID_VALUE, "gbce results nullptr");
-+
-+    int lutSize = results->gamma_lut_size;
-+    CheckError(lutSize < TONEMAP_MIN_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize);
-+    for (int i = 0; i < lutSize; i++) {
-+        if (i / (lutSize - 1) < 0.018)
-+            results->g_gamma_lut[i] = 4.5 * (i / (lutSize - 1));
-+        else
-+            results->g_gamma_lut[i] =
-+                    1.099 * pow(i / static_cast<float>(lutSize - 1), 0.45) - 0.099;
-+    }
-+
-+    MEMCPY_S(results->b_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+    MEMCPY_S(results->r_gamma_lut, lutSize * sizeof(float),
-+             results->g_gamma_lut, lutSize * sizeof(float));
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/AiqUtils.h b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
-new file mode 100644
-index 000000000000..cf446fa99876
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
-@@ -0,0 +1,179 @@
-+/*
-+ * Copyright (C) 2015-2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "PlatformData.h"
-+#include "Parameters.h"
-+#include "ia_aiq.h"
-+#include "ia_ltm_types.h"
-+#include "ia_dvs_types.h"
-+#include "ia_isp_bxt_statistics_types.h"
-+
-+namespace icamera {
-+
-+/*!> Top limit for the RGBS grid size */
-+static const unsigned int MAX_AE_GRID_SIZE = 2048;
-+/*!> Number of leds AEC algorithm provides output for */
-+static const unsigned int MAX_EXPOSURES_NUM = 3;
-+static const unsigned int NUM_FLASH_LEDS = 1;
-+static const unsigned int MAX_GAMMA_LUT_SIZE = 2048;
-+static const unsigned int MAX_TONEMAP_LUT_SIZE = 2048;
-+
-+static const unsigned int MAX_STATISTICS_WIDTH = BXT_RGBS_GRID_MAX_WIDTH;
-+static const unsigned int MAX_STATISTICS_HEIGHT = BXT_RGBS_GRID_MAX_HEIGHT;
-+
-+static const unsigned int MAX_LSC_WIDTH = 100;
-+static const unsigned int MAX_LSC_HEIGHT = 100;
-+
-+static const unsigned int MAX_IR_WEIGHT_GRID_SIZE = 480;
-+static const unsigned int MAX_NUM_SECTORS = 36;
-+
-+static const int MAX_BAYER_ORDER_NUM = 4;
-+
-+/*! \brief Definitions of IA imaging coordinate system. */
-+static const unsigned int IA_COORDINATE_TOP = 0;
-+static const unsigned int IA_COORDINATE_LEFT = 0;
-+static const unsigned int IA_COORDINATE_BOTTOM = 8192;
-+static const unsigned int IA_COORDINATE_RIGHT = 8192;
-+static const unsigned int IA_COORDINATE_WIDTH = (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
-+static const unsigned int IA_COORDINATE_HEIGHT = (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
-+
-+/**
-+ *  The normalized awb gain range is (4.0, 1.0) which is just experimental.
-+ *  TODO: Maybe need put them in configuration file later.
-+ */
-+static const int AWB_GAIN_NORMALIZED_START = 4.0;
-+static const int AWB_GAIN_NORMALIZED_END = 1.0;
-+static const int AWB_GAIN_RANGE_NORMALIZED = AWB_GAIN_NORMALIZED_END - AWB_GAIN_NORMALIZED_START;
-+
-+static const float AWB_GAIN_MIN = 0;
-+static const float AWB_GAIN_MAX = 255;
-+static const float AWB_GAIN_RANGE_USER = AWB_GAIN_MAX - AWB_GAIN_MIN;
-+
-+static const int MAX_CUSTOM_CONTROLS_PARAM_SIZE = 1024;
-+
-+namespace AiqUtils {
-+
-+int deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst);
-+int deepCopyAfResults(const ia_aiq_af_results& src, ia_aiq_af_results* dst);
-+int deepCopyAwbResults(const ia_aiq_awb_results& src, ia_aiq_awb_results* dst);
-+int deepCopyGbceResults(const ia_aiq_gbce_results& src, ia_aiq_gbce_results* dst);
-+int deepCopyPaResults(const ia_aiq_pa_results_v1& src, ia_aiq_pa_results_v1* dst,
-+                      ia_aiq_advanced_ccm_t* preferredAcm);
-+int deepCopySaResults(const ia_aiq_sa_results_v1& src, ia_aiq_sa_results_v1* dst);
-+int deepCopyLtmResults(const ia_ltm_results& src, ia_ltm_results* dst);
-+int deepCopyLtmDRCParams(const ia_ltm_drc_params& src, ia_ltm_drc_params* dst);
-+int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
-+int deepCopyDvsResults(const ia_dvs_image_transformation& src, ia_dvs_image_transformation* dst);
-+
-+int convertError(ia_err iaErr);
-+
-+void convertToAiqFrameParam(const SensorFrameParams& sensor, ia_aiq_frame_params& aiq);
-+
-+camera_coordinate_t convertCoordinateSystem(const camera_coordinate_system_t& srcSystem,
-+                                            const camera_coordinate_system_t& dstSystem,
-+                                            const camera_coordinate_t& srcCoordinate);
-+camera_coordinate_t convertToIaCoordinate(const camera_coordinate_system_t& srcSystem,
-+                                          const camera_coordinate_t& srcCoordinate);
-+camera_window_t convertToIaWindow(const camera_coordinate_system_t& srcSystem,
-+                                  const camera_window_t& srcWindow);
-+float normalizeAwbGain(int gain);
-+int convertToUserAwbGain(float normalizedGain);
-+float convertSpeedModeToTime(camera_converge_speed_t mode);
-+
-+ia_aiq_frame_use convertFrameUsageToIaFrameUsage(int frameUsage);
-+
-+void applyTonemapGamma(float gamma, ia_aiq_gbce_results* results);
-+void applyTonemapSRGB(ia_aiq_gbce_results* results);
-+void applyTonemapREC709(ia_aiq_gbce_results* results);
-+
-+// Resize a 2D array with linear interpolation
-+// For some cases, we need to upscale or downscale a 2D array.
-+// For example, Android requests lensShadingMapSize must be smaller than 64*64,
-+// but for some sensors, the lens shading map is bigger than this, so need to do resize.
-+/* Value of 8 is maximum in order to avoid overflow with 16-bit inputs */
-+#define FRAC_BITS_CURR_LOC 8
-+#define FRAC_BASE (short)(1) << FRAC_BITS_CURR_LOC
-+
-+/*!
-+ * \brief Resize a 2D array with linear interpolation.
-+ *
-+ * @param[in,out]
-+ *  in a_src                pointer to input array (width-major)
-+ *  in a_src_w              width of the input array
-+ *  in a_src_h              height of the input array
-+ *  in a_dst                pointer to output array (width-major)
-+ *  in a_dst_w              width of the output array
-+ *  in a_dst_h              height of the output array
-+ */
-+template <typename T> int resize2dArray(
-+    const T* a_src, int a_src_w, int a_src_h,
-+    T* a_dst, int a_dst_w, int a_dst_h) {
-+    int i, j, step_size_w, step_size_h, rounding_term;
-+
-+    if (a_src_w < 2 || a_dst_w < 2 || a_src_h < 2 || a_dst_h < 2) {
-+        return  -1;
-+    }
-+    nsecs_t startTime = CameraUtils::systemTime();
-+    step_size_w = ((a_src_w - 1) << FRAC_BITS_CURR_LOC) / (a_dst_w - 1);
-+    step_size_h = ((a_src_h - 1) << FRAC_BITS_CURR_LOC) / (a_dst_h - 1);
-+    rounding_term = (1 << (2 * FRAC_BITS_CURR_LOC - 1));
-+    for (j = 0; j < a_dst_h; ++j) {
-+        unsigned int curr_loc_h, curr_loc_lower_h;
-+        curr_loc_h = j * step_size_h;
-+        curr_loc_lower_h = (curr_loc_h > 0) ? (curr_loc_h - 1) >> FRAC_BITS_CURR_LOC : 0;
-+
-+        for (i = 0; i < a_dst_w; ++i) {
-+            unsigned int curr_loc_w, curr_loc_lower_w;
-+
-+            curr_loc_w = i * step_size_w;
-+            curr_loc_lower_w = (curr_loc_w > 0) ? (curr_loc_w - 1) >> FRAC_BITS_CURR_LOC : 0;
-+
-+            a_dst[a_dst_w * j + i] =
-+                (a_src[curr_loc_lower_w + curr_loc_lower_h * a_src_w]  *
-+                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
-+                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
-+                a_src[curr_loc_lower_w + 1 + curr_loc_lower_h * a_src_w] *
-+                        (curr_loc_w-((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
-+                        (((curr_loc_lower_h + 1) << FRAC_BITS_CURR_LOC) - curr_loc_h) +
-+                a_src[curr_loc_lower_w + (curr_loc_lower_h + 1) * a_src_w]  *
-+                        (((curr_loc_lower_w + 1) << FRAC_BITS_CURR_LOC) - curr_loc_w) *
-+                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC)) +
-+                a_src[curr_loc_lower_w + 1 + (curr_loc_lower_h + 1) * a_src_w] *
-+                        (curr_loc_w - ((curr_loc_lower_w) << FRAC_BITS_CURR_LOC))   *
-+                        (curr_loc_h - ((curr_loc_lower_h) << FRAC_BITS_CURR_LOC))
-+                + rounding_term) / (FRAC_BASE * FRAC_BASE);
-+        }
-+    }
-+    LOG2("resize the 2D array cost %dus",
-+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000));
-+
-+    return 0;
-+}
-+
-+template int resize2dArray<float>(
-+    const float* a_src, int a_src_w, int a_src_h,
-+    float* a_dst, int a_dst_w, int a_dst_h);
-+template int resize2dArray<unsigned short>(
-+    const unsigned short* a_src, int a_src_w, int a_src_h,
-+    unsigned short* a_dst, int a_dst_w, int a_dst_h);
-+template int resize2dArray<int>(
-+    const int* a_src, int a_src_w, int a_src_h,
-+    int* a_dst, int a_dst_w, int a_dst_h);
-+} // namespace AiqUtils
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.cpp b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
-new file mode 100644
-index 000000000000..87afe9e0975b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
-@@ -0,0 +1,608 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Dvs"
-+#include "src/3a/Dvs.h"
-+
-+#include <ia_cmc_parser.h>
-+#include <ia_pal_types_isp_ids_autogen.h>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Utils.h"
-+#include "PlatformData.h"
-+#include "AiqUtils.h"
-+#include "AiqResultStorage.h"
-+#include "IGraphConfigManager.h"
-+#include "IGraphConfig.h"
-+
-+namespace icamera {
-+
-+const float MAX_DVS2_YUVDS_RATIO = 1.3f;
-+const int DVS_OXDIM_Y = 128;
-+const int DVS_OYDIM_Y = 32;
-+const int DVS_OXDIM_UV  = 64;
-+const int DVS_OYDIM_UV  = 16;
-+
-+const int ENVELOPE_BQ_WIDTH = 192;
-+const int ENVELOPE_BQ_HEIGHT = 96;
-+
-+Dvs::Dvs(int cameraId, AiqSetting *setting) :
-+    mDvsHandle(nullptr),
-+    mDvsEnabled(false),
-+    mLdcEnabled(false),
-+    mRscEnabled(false),
-+    mDigitalZoomRatio(1.0f),
-+    mCameraId(cameraId),
-+    mFps(30),
-+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
-+    mTuningMode(TUNING_MODE_VIDEO),
-+    mAiqSetting(setting),
-+    mKernelId(0),
-+    mMorphTable(nullptr),
-+    mStatistics(nullptr),
-+    mConfigured(false) {
-+    LOG1("@%s", __func__);
-+
-+    CLEAR(mSrcResolution);
-+    CLEAR(mDstResolution);
-+    CLEAR(mImage_transformation);
-+
-+    mIntelDvs = new IntelDvs();
-+}
-+
-+Dvs::~Dvs() {
-+    LOG1("@%s", __func__);
-+    delete mIntelDvs;
-+}
-+
-+int Dvs::initDvsHandle(TuningMode tuningMode) {
-+    int status = OK;
-+
-+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
-+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
-+
-+    ia_binary_data aiqData;
-+    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
-+    int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr, &cmcHandle, tuningMode);
-+    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
-+
-+    ia_err err = mIntelDvs->init(aiqData, reinterpret_cast<ia_cmc_t*>(cmcHandle), &mDvsHandle);
-+    CheckError(err != ia_err_none, NO_INIT, "@%s, Failed to initilize IntelDvs", __func__);
-+
-+    return status;
-+}
-+
-+int Dvs::deinitDvsHandle() {
-+    int status = deInitDVSTable();
-+    if (mDvsHandle) {
-+        mIntelDvs->deinit(mDvsHandle);
-+        mDvsHandle = nullptr;
-+    }
-+
-+    return status;
-+}
-+
-+int Dvs::init() {
-+    LOG1("@%s", __func__);
-+
-+    return OK;
-+}
-+
-+int Dvs::deinit() {
-+    LOG1("@%s", __func__);
-+    AutoMutex l(mLock);
-+
-+    return deinitDvsHandle();
-+}
-+
-+int Dvs::configure(const std::vector<ConfigMode>& configModes) {
-+    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
-+    AutoMutex l(mLock);
-+    mConfigured = false;
-+    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
-+
-+    if (configModes.empty()) {
-+        return UNKNOWN_ERROR;
-+    }
-+    mConfigMode = configModes[0];
-+
-+    TuningMode tuningMode;
-+    if (PlatformData::getTuningModeByConfigMode(mCameraId, mConfigMode, tuningMode) != OK) {
-+        return UNKNOWN_ERROR;
-+    }
-+    mTuningMode = tuningMode;
-+
-+    mKernelId = 0;
-+    CLEAR(mSrcResolution);
-+    CLEAR(mDstResolution);
-+
-+    return reconfigure();
-+}
-+
-+int Dvs::configure(TuningMode tuningMode, uint32_t kernelId,
-+                   int srcWidth, int srcHeight, int dstWidth, int dstHeight) {
-+    LOG1("@%s, isDvsSupported:%d", __func__, PlatformData::isDvsSupported(mCameraId));
-+    AutoMutex l(mLock);
-+    mConfigured = false;
-+    if (!PlatformData::isDvsSupported(mCameraId)) return OK;
-+
-+    mTuningMode = tuningMode;
-+    mKernelId = kernelId;
-+    mSrcResolution.width = srcWidth;
-+    mSrcResolution.height = srcHeight;
-+    mDstResolution.width = dstWidth;
-+    mDstResolution.height = dstHeight;
-+
-+    return reconfigure();
-+}
-+
-+int Dvs::setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config) {
-+    config->num_axis = mDvsEnabled ? ia_dvs_algorithm_6_axis : ia_dvs_algorithm_0_axis;
-+
-+    /* General setting for dvs */
-+    config->source_bq.width_bq = mSrcResolution.width / 2;
-+    config->source_bq.height_bq = mSrcResolution.height / 2;
-+    config->output_bq.width_bq = mSrcResolution.width / 2;
-+    config->output_bq.height_bq = mSrcResolution.height / 2;
-+    // if the DstResolution is valid, the output_bq from dstResolution.
-+    if (mDstResolution.width != 0 && mDstResolution.height != 0) {
-+        config->output_bq.width_bq = mDstResolution.width / 2;
-+        config->output_bq.height_bq = mDstResolution.height / 2;
-+    }
-+    config->ispfilter_bq.width_bq = 0;
-+    config->ispfilter_bq.height_bq = 0;
-+
-+    // config->num_axis = ia_dvs_algorithm_0_axis;
-+    config->gdc_shift_x = 0;
-+    config->gdc_shift_y = 0;
-+
-+    if (kernelId == ia_pal_uuid_isp_gdc3_1) {
-+        config->oxdim_y = DVS_OXDIM_Y;
-+        config->oydim_y = DVS_OYDIM_Y;
-+        config->oxdim_uv = DVS_OXDIM_UV;
-+        config->oydim_uv = DVS_OYDIM_UV;
-+    } else {
-+        config->oxdim_y = DVS_OXDIM_Y / 2;
-+        config->oydim_y = DVS_OYDIM_Y;
-+        config->oxdim_uv = DVS_OXDIM_UV;
-+        config->oydim_uv = DVS_OYDIM_UV;
-+    }
-+
-+    config->hw_config.scan_mode = ia_dvs_gdc_scan_mode_stb;
-+    config->hw_config.interpolation = ia_dvs_gdc_interpolation_bci;
-+    config->hw_config.performance_point = ia_dvs_gdc_performance_point_1x1;
-+
-+    config->gdc_buffer_config.x_offset = 0;
-+    config->gdc_buffer_config.y_offset = 0;
-+    config->gdc_buffer_config.width = config->source_bq.width_bq;
-+    config->gdc_buffer_config.height = config->source_bq.height_bq;
-+    config->frame_rate = mFps;
-+    config->validate_morph_table = false;
-+
-+    /*
-+     * cropping from the active pixel array, needs to be coming from history
-+     */
-+    config->crop_params.horizontal_crop_offset = 0;
-+    config->crop_params.vertical_crop_offset = 0;
-+    config->crop_params.cropped_width = 0;
-+    config->crop_params.cropped_height = 0;
-+
-+    config->envelope_bq.width_bq = ENVELOPE_BQ_WIDTH;
-+    config->envelope_bq.height_bq = ENVELOPE_BQ_HEIGHT;
-+
-+    int bq_max_width = static_cast<int>(MAX_DVS2_YUVDS_RATIO *
-+                                        static_cast<float>(config->output_bq.width_bq));
-+    int bq_max_height = static_cast<int>(MAX_DVS2_YUVDS_RATIO *
-+                                         static_cast<float>(config->output_bq.height_bq));
-+
-+    if (config->source_bq.width_bq - config->envelope_bq.width_bq -
-+        config->ispfilter_bq.width_bq > bq_max_width)
-+        config->envelope_bq.width_bq =
-+            config->source_bq.width_bq - config->ispfilter_bq.width_bq - bq_max_width;
-+
-+    if (config->source_bq.height_bq - config->envelope_bq.height_bq -
-+        config->ispfilter_bq.height_bq > bq_max_height)
-+        config->envelope_bq.height_bq =
-+            config->source_bq.height_bq - config->ispfilter_bq.height_bq - bq_max_height;
-+
-+    if (mLdcEnabled) {
-+        // The crop must be set in LDC function, or there is config dvs fail
-+        config->crop_params.cropped_width = mDstResolution.width / 2;
-+        config->crop_params.cropped_height = mDstResolution.height / 2;
-+        // envelope bq is only for stabilization and it has to be set as 0 when ldc enabled.
-+        // TODO: clear define the envelope_bq when ldc & video stabilization enabled together
-+        config->envelope_bq.width_bq = 0;
-+        config->envelope_bq.height_bq = 0;
-+        config->use_lens_distortion_correction = true;
-+    }
-+
-+    if (mRscEnabled) {
-+        // TODO: set config.nonblanking_ratio to inputReadoutTime/framePeriod.
-+    }
-+    return 0;
-+}
-+
-+int Dvs::reconfigure() {
-+    LOG1("@%s", __func__);
-+
-+    int status = OK;
-+    uint32_t gdcKernelId = mKernelId;
-+
-+    // If parameters are not valid, try to query them in GC.
-+    if (gdcKernelId == 0 || mSrcResolution.width == 0 || mSrcResolution.height == 0) {
-+        // update GC
-+        std::shared_ptr<IGraphConfig> gc = nullptr;
-+
-+        if (PlatformData::getGraphConfigNodes(mCameraId)) {
-+            IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
-+            if (GCM) {
-+                gc = GCM->getGraphConfig(mConfigMode);
-+            }
-+        }
-+        CheckWarning(gc == nullptr, OK, "Failed to get GC in DVS");
-+
-+        // update resolution infomation
-+        status = gc->getGdcKernelSetting(gdcKernelId, mSrcResolution);
-+        CheckWarning(status != OK, OK, "Failed to get GDC kernel setting, DVS disabled");
-+    }
-+    LOG1("%s, GDC kernel setting: id: %u, src resolution: %dx%d, dst resolution: %dx%d",
-+         __func__, gdcKernelId, mSrcResolution.width, mSrcResolution.height,
-+         mDstResolution.width, mDstResolution.height);
-+
-+    if (mDvsHandle) {
-+        deinitDvsHandle();
-+    }
-+    status = initDvsHandle(mTuningMode);
-+
-+    if (!mDvsHandle)
-+        return status;
-+
-+    ia_dvs_configuration config;
-+    CLEAR(config);
-+
-+    setDVSConfiguration(gdcKernelId, &config);
-+    dumpConfiguration(config);
-+
-+    CheckError(mSrcResolution.width <= (config.envelope_bq.width_bq * 2), UNKNOWN_ERROR,
-+               "%s the mSrcResolution width: %d is too small", __func__, mSrcResolution.width);
-+    CheckError(mSrcResolution.height <= (config.envelope_bq.height_bq * 2), UNKNOWN_ERROR,
-+               "%s the mSrcResolution height: %d is too small", __func__, mSrcResolution.height);
-+
-+    float zoomHRatio = mSrcResolution.width /
-+                       (mSrcResolution.width - config.envelope_bq.width_bq * 2);
-+    float zoomVRatio = mSrcResolution.height /
-+                       (mSrcResolution.height - config.envelope_bq.height_bq * 2);
-+    ia_err err = mIntelDvs->config(mDvsHandle, &config,
-+                                   (zoomHRatio > zoomVRatio) ? zoomHRatio : zoomVRatio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "Configure DVS failed %d", err);
-+
-+    LOG2("Configure DVS success");
-+    err = mIntelDvs->setNonBlankRatio(mDvsHandle, config.nonblanking_ratio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set non blank ratio failed %d", err);
-+
-+    status = initDVSTable();
-+    CheckError(status != OK, UNKNOWN_ERROR, "Allocate dvs table failed");
-+    mConfigured = true;
-+
-+    return status;
-+}
-+
-+void Dvs::handleEvent(EventData eventData) {
-+    if (eventData.type != EVENT_PSYS_STATS_BUF_READY) return;
-+    if (!mConfigured) return;
-+
-+    LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
-+    int64_t sequence = eventData.data.statsReady.sequence;
-+
-+    AiqResultStorage* aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
-+    DvsStatistics *dvsStatistics = aiqResultStorage->getDvsStatistics();
-+    if (dvsStatistics->sequence != sequence || dvsStatistics->dvsStats == nullptr) return;
-+
-+    // Set dvs statistics
-+    {
-+    AutoMutex l(mLock);
-+    mStatistics = dvsStatistics->dvsStats;
-+    }
-+
-+    // Run dvs
-+    if (mAiqSetting) {
-+        aiq_parameter_t aiqParam;
-+        mAiqSetting->getAiqParameter(aiqParam);
-+        updateParameter(aiqParam);
-+    }
-+
-+    DvsResult *dvsResult = aiqResultStorage->acquireDvsResult();
-+
-+    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
-+    if (feedback == nullptr) {
-+        LOGW("%s: no aiq result for sequence %ld! use the latest instead", __func__, sequence);
-+        feedback = aiqResultStorage->getAiqResult();
-+    }
-+
-+    const ia_aiq_af_results *afResults = nullptr;
-+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
-+        afResults = &feedback->mAfResults;
-+    }
-+    int ret = run(&feedback->mAeResults, afResults, dvsResult, sequence);
-+    CheckError(ret != OK, VOID_VALUE, "Run DVS fail");
-+
-+    aiqResultStorage->updateDvsResult(sequence);
-+}
-+
-+int Dvs::run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
-+             DvsResult *result, int64_t sequence) {
-+    LOG2("@%s", __func__);
-+    if (!mConfigured) return OK;
-+
-+    PERF_CAMERA_ATRACE_IMAGING();
-+    AutoMutex l(mLock);
-+
-+    runImpl(aeResults, afResults);
-+
-+    int dvsType = PlatformData::getDVSType(mCameraId);
-+    switch (dvsType) {
-+        case MORPH_TABLE: {
-+            return getMorphTable(sequence, result);
-+        }
-+        case IMG_TRANS:
-+            return getImageTrans(sequence, result);
-+        default:
-+            LOGE("not supportted dvs type");
-+            return UNKNOWN_ERROR;
-+    }
-+}
-+
-+int Dvs::configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
-+                              ia_coordinate *zoom_coordinate) {
-+    LOG2("@%s zoom mode:%d", __func__, zoom_mode);
-+    AutoMutex l(mLock);
-+
-+    ia_err err = mIntelDvs->setDigitalZoomMode(mDvsHandle, zoom_mode);
-+    CheckError(err != ia_err_none, BAD_VALUE, "set zoom mode error: %d", err);
-+
-+    if (zoom_mode == ia_dvs_zoom_mode_region) {
-+        err = mIntelDvs->setDigitalZoomRegion(mDvsHandle, zoom_region);
-+    } else if (zoom_mode == ia_dvs_zoom_mode_coordinate) {
-+        err = mIntelDvs->setDigitalZoomCoordinate(mDvsHandle, zoom_coordinate);
-+    }
-+
-+    int ret = AiqUtils::convertError(err);
-+    CheckError(ret != OK, ret, "Error config zoom: %d", ret);
-+
-+    return OK;
-+}
-+
-+int Dvs::setZoomRatio(float zoomRatio) {
-+    LOG2("@%s zoom:%4.2f", __func__, zoomRatio);
-+    AutoMutex l(mLock);
-+
-+    ia_err err = mIntelDvs->setDigitalZoomMagnitude(mDvsHandle, zoomRatio);
-+    CheckError(err != ia_err_none, UNKNOWN_ERROR, "set digital zoom magnitude error: %d", err);
-+
-+    return OK;
-+}
-+
-+/**
-+ * Private function implementations. mLock is assumed to be held.
-+ */
-+
-+int Dvs::initDVSTable() {
-+    LOG1("@%s", __func__);
-+
-+    int dvsType = PlatformData::getDVSType(mCameraId);
-+    switch (dvsType) {
-+        case MORPH_TABLE:
-+            if (mMorphTable) {
-+                mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
-+                mMorphTable = nullptr;
-+            }
-+            if (mDvsHandle) {
-+                mMorphTable = mIntelDvs->allocateMorphTalbe(mDvsHandle);
-+                CheckError(!mMorphTable, UNKNOWN_ERROR, "mMorphTable allocate failed");
-+            }
-+            break;
-+        case IMG_TRANS:
-+            LOG1("not need allocate MorphTable for image_transformation");
-+            break;
-+        default:
-+            LOGE("not supportted dvs type");
-+            return UNKNOWN_ERROR;
-+    }
-+    return OK;
-+}
-+
-+int Dvs::deInitDVSTable() {
-+    int status = OK;
-+    if (mMorphTable) {
-+        mIntelDvs->freeMorphTable(mDvsHandle, mMorphTable);
-+        mMorphTable = nullptr;
-+    }
-+
-+    return status;
-+}
-+
-+int Dvs::runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults) {
-+    LOG2("@%s", __func__);
-+    ia_err err = ia_err_none;
-+    int ret = OK;
-+
-+    if (!mDvsHandle)
-+        return UNKNOWN_ERROR;
-+
-+    if ((mDvsEnabled) && mStatistics && mStatistics->vector_count > 0) {
-+        err = mIntelDvs->setStatistics(mDvsHandle, mStatistics,
-+                                       aeResults, afResults, /*sensor events*/nullptr, 0, 0);
-+        ret = AiqUtils::convertError(err);
-+        CheckError(ret != OK, ret, "DVS set statistics failed: %d", ret);
-+    } else if ((mDvsEnabled) && !mStatistics) {
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    uint16_t focusPosition = 0;
-+    if (afResults) {
-+        focusPosition = static_cast<uint16_t>(afResults->next_lens_position);
-+    }
-+
-+    err = mIntelDvs->execute(mDvsHandle, focusPosition);
-+    ret = AiqUtils::convertError(err);
-+    CheckError(ret != OK, ret, "DVS execution failed: %d", ret);
-+
-+    return OK;
-+}
-+
-+int Dvs::getMorphTable(int64_t sequence, DvsResult *result) {
-+    LOG2("@%s", __func__);
-+    CheckError(!result, UNKNOWN_ERROR, "@%s, result is null", __func__);
-+
-+    int ret = mIntelDvs->getMorphTable(mDvsHandle, mMorphTable, result);
-+    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
-+    return dumpDVSTable(&result->mMorphTable, sequence);
-+}
-+
-+int Dvs::getImageTrans(int64_t sequence, DvsResult *result) {
-+    LOG2("@%s", __func__);
-+
-+    ia_err err = mIntelDvs->getImageTransformation(mDvsHandle, &mImage_transformation);
-+    int ret = AiqUtils::convertError(err);
-+    CheckError(ret != OK, ret, "Error geting DVS result: %d", ret);
-+    dumpDVSTable(&mImage_transformation, sequence);
-+    return AiqUtils::deepCopyDvsResults(mImage_transformation, &result->mTransformation);
-+}
-+
-+int Dvs::updateParameter(const aiq_parameter_t &param) {
-+    LOG2("@%s", __func__);
-+    if (!mConfigured) return OK;
-+
-+    bool dvsEnabled = (param.videoStabilizationMode == VIDEO_STABILIZATION_MODE_ON);
-+    bool ldcEnabled = (param.ldcMode == LDC_MODE_ON);
-+    bool rscEnabled = (param.rscMode == RSC_MODE_ON);
-+    int digitalZoomRatio = param.digitalZoomRatio;
-+
-+    if ((param.fps > 0.01 && param.fps != mFps)
-+        || param.tuningMode != mTuningMode
-+        || dvsEnabled != mDvsEnabled || ldcEnabled != mLdcEnabled
-+        || rscEnabled != mRscEnabled) {
-+        mFps = param.fps > 0.01 ? param.fps : mFps;
-+        mTuningMode = param.tuningMode;
-+        mDvsEnabled = dvsEnabled;
-+        mLdcEnabled = ldcEnabled;
-+        mRscEnabled = rscEnabled;
-+
-+        LOG3A("%s: DVS fps = %f ", __func__, mFps);
-+        LOG3A("%s: DVS tuning Mode = %d ", __func__, mTuningMode);
-+        LOG3A("%s: DVS enabled = %d ", __func__, mDvsEnabled);
-+        LOG3A("%s: LDC enabled = %d ", __func__, mLdcEnabled);
-+        LOG3A("%s: RSC enabled = %d ", __func__, mRscEnabled);
-+
-+        return reconfigure();
-+    }
-+
-+    if (param.digitalZoomRatio > 0 && param.digitalZoomRatio!= mDigitalZoomRatio) {
-+        mDigitalZoomRatio = digitalZoomRatio;
-+        setZoomRatio(mDigitalZoomRatio);
-+        LOG3A("%s: digital zoom ratio = %f ", __func__, mDigitalZoomRatio);
-+    }
-+
-+    return OK;
-+}
-+
-+int Dvs::dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence) {
-+    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
-+
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!table, BAD_VALUE, "%s: morph table is nullptr, and nothing to dump.", __func__);
-+
-+    BinParam_t bParam;
-+    bParam.bType = BIN_TYPE_GENERAL;
-+    bParam.mType = M_PSYS;
-+    bParam.sequence = sequence;
-+    bParam.gParam.appendix = "dvs_morph_table_x_y";
-+    CameraDump::dumpBinary(0, table->xcoords_y,
-+                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
-+    bParam.gParam.appendix = "dvs_morph_table_y_y";
-+    CameraDump::dumpBinary(0, table->ycoords_y,
-+                           table->width_y * table->height_y * sizeof(uint32_t), &bParam);
-+    bParam.gParam.appendix = "dvs_morph_table_x_uv";
-+    CameraDump::dumpBinary(0, table->xcoords_uv,
-+                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
-+    bParam.gParam.appendix = "dvs_morph_table_y_uv";
-+    CameraDump::dumpBinary(0, table->ycoords_uv,
-+                           table->width_uv * table->height_uv * sizeof(uint32_t), &bParam);
-+
-+    LOG3A("%s: DVS morph table y=[%d x %d], uv=[%d x %d] changed=%s", __func__,
-+          table->width_y, table->height_y,
-+          table->width_uv, table->height_uv,
-+          table->morph_table_changed == true ? "TRUE" : "FALSE");
-+    return OK;
-+}
-+
-+int Dvs::dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence) {
-+    if (!CameraDump::isDumpTypeEnable(DUMP_AIQ_DVS_RESULT)) return OK;
-+
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!trans, BAD_VALUE, "%s: trans table is nullptr, and nothing to dump.", __func__);
-+
-+    LOG3A("%s: DVS trans table num_homography_matrices=%d", __func__,
-+            trans->num_homography_matrices);
-+
-+    BinParam_t bParam;
-+    bParam.bType = BIN_TYPE_GENERAL;
-+    bParam.mType = M_PSYS;
-+    bParam.sequence = sequence;
-+    for (int i = 0; i < DVS_HOMOGRAPHY_MATRIX_MAX_COUNT; i++) {
-+        LOG3A("%s: DVS trans table %d start_row=%d", __func__,
-+            i, trans->matrices[i].start_row);
-+        bParam.gParam.appendix = "matrices";
-+        CameraDump::dumpBinary(0, &trans->matrices[i].matrix, 3 * 3 * sizeof(float), &bParam);
-+    }
-+
-+    return OK;
-+}
-+
-+int Dvs::dumpConfiguration(ia_dvs_configuration config) {
-+    LOG3A("%s", __func__);
-+
-+    LOG3A("config.num_axis %d", config.num_axis);
-+    LOG3A("config.nonblanking_ratio %f", config.nonblanking_ratio);
-+    LOG3A("config.source_bq.width_bq %d", config.source_bq.width_bq);
-+    LOG3A("config.source_bq.height_bq %d", config.source_bq.height_bq);
-+    LOG3A("config.output_bq.width_bq %d", config.output_bq.width_bq);
-+    LOG3A("config.output_bq.height_bq %d", config.output_bq.height_bq);
-+    LOG3A("config.envelope_bq.width_bq %d", config.envelope_bq.width_bq);
-+    LOG3A("config.envelope_bq.height_bq %d", config.envelope_bq.height_bq);
-+    LOG3A("config.ispfilter_bq.width_bq %d", config.ispfilter_bq.width_bq);
-+    LOG3A("config.ispfilter_bq.height_bq %d", config.ispfilter_bq.height_bq);
-+    LOG3A("config.gdc_shift_x %d", config.gdc_shift_x);
-+    LOG3A("config.gdc_shift_y %d", config.gdc_shift_y);
-+    LOG3A("config.oxdim_y %d", config.oxdim_y);
-+    LOG3A("config.oydim_y %d", config.oydim_y);
-+    LOG3A("config.oxdim_uv %d", config.oxdim_uv);
-+    LOG3A("config.oydim_uv %d", config.oydim_uv);
-+    LOG3A("config.hw_config.scan_mode %d", config.hw_config.scan_mode);
-+    LOG3A("config.hw_config.interpolation %d", config.hw_config.interpolation);
-+    LOG3A("config.hw_config.performance_point %d", config.hw_config.performance_point);
-+    LOG3A("config.validate_morph_table = %s",
-+          (config.validate_morph_table == true) ? "true" : "false");
-+    LOG3A("config.use_lens_distortion_correction = %s",
-+          (config.use_lens_distortion_correction == true) ? "true" : "false");
-+
-+    return OK;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/Dvs.h b/camera/hal/intel/ipu6/src/3a/Dvs.h
-new file mode 100644
-index 000000000000..ffa6389dcea4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/Dvs.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_dvs.h>
-+#include <ia_dvs_types.h>
-+#include <ia_isp_bxt.h>
-+#include <memory>
-+#include <vector>
-+
-+#include "iutils/Thread.h"
-+#include "iutils/Errors.h"
-+
-+#include "AiqSetting.h"
-+#include "CameraEvent.h"
-+#include "DvsResult.h"
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelDvs.h"
-+#else
-+#include "modules/algowrapper/IntelDvs.h"
-+#endif
-+
-+namespace icamera {
-+struct DvsStatistics {
-+    explicit DvsStatistics(ia_dvs_statistics *dvs = nullptr, int64_t seq = -1) {
-+        dvsStats = dvs;
-+        sequence = seq;
-+    }
-+    ia_dvs_statistics *dvsStats;
-+    int64_t sequence;
-+};
-+
-+/**
-+ * \class Dvs
-+ * Wrapper of the DVSx, provide 2 basic functionalities in video mode:
-+ * 1. zoom (including center and freeform)
-+ * 2. DVS
-+ * The algorithm should generate the morph table to support the
-+ * above functionalities.
-+ */
-+class Dvs : public EventListener {
-+ public:
-+    explicit Dvs(int cameraId, AiqSetting *setting = nullptr);
-+    ~Dvs();
-+
-+    int init();
-+    int deinit();
-+    int configure(const std::vector<ConfigMode>& configMode);
-+    int configure(TuningMode tuningMode, uint32_t kernelId,
-+                  int srcWidth, int srcHeight, int dstWidth, int dstHeight);
-+    int updateParameter(const aiq_parameter_t &param);
-+    void handleEvent(EventData eventData);
-+
-+    int run(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults,
-+            DvsResult *result, int64_t sequence = 0);
-+
-+ private:
-+    int configureDigitalZoom(ia_dvs_zoom_mode zoom_mode, ia_rectangle *zoom_region,
-+                             ia_coordinate *zoom_coordinate);
-+    int setZoomRatio(float zoom);
-+
-+    int initDvsHandle(TuningMode tuningMode);
-+    int deinitDvsHandle();
-+    int initDVSTable();
-+    int deInitDVSTable();
-+    int reconfigure();
-+    int runImpl(const ia_aiq_ae_results *aeResults, const ia_aiq_af_results *afResults);
-+    int getMorphTable(int64_t sequence, DvsResult *result);
-+    int getImageTrans(int64_t sequence, DvsResult *result);
-+    int setDVSConfiguration(uint32_t kernelId, ia_dvs_configuration *config);
-+    int dumpDVSTable(ia_dvs_morph_table *table, int64_t sequence);
-+    int dumpDVSTable(ia_dvs_image_transformation *trans, int64_t sequence);
-+    int dumpConfiguration(ia_dvs_configuration config);
-+
-+ private:
-+    // Guard for class Dvs public API
-+    IntelDvs *mIntelDvs;
-+    Mutex mLock;
-+    ia_dvs_state *mDvsHandle;
-+    bool mDvsEnabled;
-+    bool mLdcEnabled;
-+    bool mRscEnabled;
-+    float mDigitalZoomRatio;
-+    int mCameraId;
-+    float mFps;
-+    ConfigMode mConfigMode;
-+    TuningMode mTuningMode;
-+    AiqSetting *mAiqSetting;
-+
-+    uint32_t mKernelId;
-+    camera_resolution_t mSrcResolution;
-+    camera_resolution_t mDstResolution;
-+
-+    ia_dvs_morph_table *mMorphTable;
-+    ia_dvs_image_transformation mImage_transformation;
-+    ia_dvs_statistics *mStatistics;
-+    bool mConfigured;
-+
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(Dvs);
-+};
-+
-+}  /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.cpp b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
-new file mode 100644
-index 000000000000..c9a80301621e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/DvsResult.cpp
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "DvsResult"
-+
-+#include "src/3a/DvsResult.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+DvsResult::DvsResult() :
-+    mSequence(-1) {
-+    LOG3A("@%s", __func__);
-+
-+    CLEAR(mTransformation);
-+    CLEAR(mMorphTable);
-+    CLEAR(mDvsXcoordsY);
-+    CLEAR(mDvsYcoordsY);
-+    CLEAR(mDvsXcoordsUV);
-+    CLEAR(mDvsYcoordsUV);
-+    CLEAR(mDvsXcoordsUVFloat);
-+    CLEAR(mDvsYcoordsUVFloat);
-+    mMorphTable.xcoords_y = mDvsXcoordsY;
-+    mMorphTable.ycoords_y = mDvsYcoordsY;
-+    mMorphTable.xcoords_uv = mDvsXcoordsUV;
-+    mMorphTable.ycoords_uv = mDvsYcoordsUV;
-+    mMorphTable.xcoords_uv_float = mDvsXcoordsUVFloat;
-+    mMorphTable.ycoords_uv_float = mDvsYcoordsUVFloat;
-+}
-+
-+DvsResult::~DvsResult() {
-+    LOG3A("@%s", __func__);
-+}
-+
-+int DvsResult::deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst) {
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst || !dst->xcoords_y || !dst->ycoords_y
-+               || !dst->xcoords_uv || !dst->ycoords_uv
-+               || !dst->xcoords_uv_float || !dst->ycoords_uv_float,
-+               BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
-+
-+    CheckError(!src.xcoords_y || !src.ycoords_y
-+               || !src.xcoords_uv || !src.ycoords_uv
-+               || !src.xcoords_uv_float || !src.ycoords_uv_float,
-+               BAD_VALUE , "Failed to deep copy DVS result- invalid source");
-+
-+    CheckError(src.width_y == 0 || src.height_y == 0 || src.width_uv == 0 || src.height_uv == 0,
-+               BAD_VALUE , "Failed to deep copy DVS result- invalid source size y[%dx%d] uv[%dx%d]",
-+               src.width_y, src.height_y, src.width_uv, src.height_uv);
-+
-+    dst->width_y = src.width_y;
-+    dst->height_y = src.height_y;
-+    dst->width_uv = src.width_uv;
-+    dst->height_uv = src.height_uv;
-+    dst->morph_table_changed = src.morph_table_changed;
-+    unsigned int SizeY = dst->width_y  * dst->height_y * sizeof(int32_t);
-+    unsigned int SizeUV = dst->width_uv * dst->height_uv * sizeof(int32_t);
-+    MEMCPY_S(dst->xcoords_y, SizeY, src.xcoords_y, SizeY);
-+    MEMCPY_S(dst->ycoords_y, SizeY, src.ycoords_y, SizeY);
-+    MEMCPY_S(dst->xcoords_uv, SizeUV, src.xcoords_uv, SizeUV);
-+    MEMCPY_S(dst->ycoords_uv, SizeUV, src.ycoords_uv, SizeUV);
-+
-+    SizeUV = dst->width_uv * dst->height_uv * sizeof(float);
-+    MEMCPY_S(dst->xcoords_uv_float, SizeUV, src.xcoords_uv_float, SizeUV);
-+    MEMCPY_S(dst->ycoords_uv_float, SizeUV, src.ycoords_uv_float, SizeUV);
-+
-+    return OK;
-+}
-+
-+int DvsResult::deepCopyDvsResults(const ia_dvs_image_transformation& src,
-+                                  ia_dvs_image_transformation* dst) {
-+    LOG3A("%s", __func__);
-+
-+    CheckError(!dst, BAD_VALUE , "Failed to deep copy DVS result- invalid destination");
-+
-+    dst->num_homography_matrices = src.num_homography_matrices;
-+    MEMCPY_S(dst->matrices, sizeof(dst->matrices), src.matrices, sizeof(src.matrices));
-+
-+    return OK;
-+}
-+
-+DvsResult &DvsResult::operator=(const DvsResult &other) {
-+    deepCopyDvsResults(other.mMorphTable, &this->mMorphTable);
-+    deepCopyDvsResults(other.mTransformation, &this->mTransformation);
-+    mSequence = other.mSequence;
-+
-+    return *this;
-+}
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/DvsResult.h b/camera/hal/intel/ipu6/src/3a/DvsResult.h
-new file mode 100644
-index 000000000000..1be7b5b3bec2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/DvsResult.h
-@@ -0,0 +1,48 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <ia_dvs_types.h>
-+
-+namespace icamera {
-+static const int MAX_DVS_COORDS_Y_SIZE = 33 * 69;
-+static const int MAX_DVS_COORDS_UV_SIZE = 33 * 69;
-+
-+class DvsResult {
-+ public:
-+    DvsResult();
-+    ~DvsResult();
-+
-+    DvsResult& operator=(const DvsResult& other);
-+
-+    ia_dvs_morph_table mMorphTable;
-+    ia_dvs_image_transformation mTransformation;
-+    int64_t mSequence;
-+
-+    static int deepCopyDvsResults(const ia_dvs_morph_table& src, ia_dvs_morph_table* dst);
-+    static int deepCopyDvsResults(const ia_dvs_image_transformation& src,
-+                                  ia_dvs_image_transformation* dst);
-+
-+ private:
-+    uint32_t mDvsXcoordsY[MAX_DVS_COORDS_Y_SIZE];
-+    uint32_t mDvsYcoordsY[MAX_DVS_COORDS_Y_SIZE];
-+    uint32_t mDvsXcoordsUV[MAX_DVS_COORDS_UV_SIZE];
-+    uint32_t mDvsYcoordsUV[MAX_DVS_COORDS_UV_SIZE];
-+    float mDvsXcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
-+    float mDvsYcoordsUVFloat[MAX_DVS_COORDS_UV_SIZE];
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
-new file mode 100644
-index 000000000000..8eaac4ab5145
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.cpp
-@@ -0,0 +1,35 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "I3AControlFactory"
-+
-+#include "iutils/CameraLog.h"
-+#include "PlatformData.h"
-+
-+#include "I3AControlFactory.h"
-+
-+namespace icamera {
-+
-+AiqUnitBase *I3AControlFactory::createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw)
-+{
-+    LOG1("@%s cameraId = %d", __func__, cameraId);
-+    if (PlatformData::isEnableAIQ(cameraId)) {
-+        return new AiqUnit(cameraId, sensorHw, lensHw);
-+    }
-+    return new AiqUnitBase();
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
-new file mode 100644
-index 000000000000..93482cc2996c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/I3AControlFactory.h
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "AiqUnit.h"
-+#include "SensorHwCtrl.h"
-+#include "LensHw.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \factory class I3AControlFactory
-+ * This class is used to create the right instance of 3A unit
-+ * automatically based on 3a enabled status
-+ */
-+class I3AControlFactory {
-+public:
-+    /**
-+     * \brief Select the AIQ unit according to config file and compiling option
-+     *
-+     * \param cameraId: the camera id
-+     * \param sensorHw: the hw sensor
-+     * \param lensHw: the hw lens
-+     *
-+     * \return the AIQ unit base class
-+     */
-+    static AiqUnitBase *createI3AControl(int cameraId, SensorHwCtrl *sensorHw, LensHw *lensHw);
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/ImagingControl.h b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
-new file mode 100644
-index 000000000000..74fa2289a34c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/ImagingControl.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Errors.h"
-+#include "AiqSetting.h"
-+#include "AiqResult.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \interface class ImagingControl
-+ * This is an interface class for imaging algorithm controllers.
-+ */
-+class ImagingControl {
-+public:
-+    virtual ~ImagingControl() {}
-+
-+    virtual int init() = 0;
-+    virtual int deinit() = 0;
-+    virtual int run(AiqResult *aiqResult, int algoType) = 0;
-+
-+    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
-+    virtual int updateParameter(const aiq_parameter_t &param) { return OK; }
-+    virtual int setFrameInfo(const ia_aiq_frame_params &frameParams) { return OK; }
-+    virtual int setSensorInfo(const ia_aiq_exposure_sensor_descriptor &descriptor) { return OK; }
-+    virtual int setStatistics(const ia_aiq_statistics_input_params_v4 *ispStatistics) { return OK; }
-+    virtual int getSupportedAlgoType() { return IMAGING_ALGO_NONE; }
-+
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.cpp b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
-new file mode 100644
-index 000000000000..7bc95176543b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/LensManager.cpp
-@@ -0,0 +1,101 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "LensManager"
-+
-+#include "LensManager.h"
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+
-+LensManager::LensManager(int cameraId, LensHw *lensHw) :
-+    mCameraId(cameraId),
-+    mLensHw(lensHw),
-+    mDcIrisCommand(ia_aiq_aperture_control_dc_iris_close),
-+    mFocusPosition(-1)
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+}
-+
-+LensManager::~LensManager()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+}
-+
-+int LensManager::start()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+    AutoMutex l(mLock);
-+
-+    mDcIrisCommand = ia_aiq_aperture_control_dc_iris_close;
-+    mFocusPosition = -1;
-+
-+    return OK;
-+}
-+
-+int LensManager::stop()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+    AutoMutex l(mLock);
-+
-+    if (!mLensHw->isLensSubdevAvailable()) {
-+        return OK;
-+    }
-+
-+    return OK;
-+}
-+
-+int LensManager::setLensResult(const ia_aiq_ae_results &aeResults,
-+                               const ia_aiq_af_results &afResults)
-+{
-+    LOG3A("%s, mCameraId = %d", __func__, mCameraId);
-+    AutoMutex l(mLock);
-+
-+    if (!mLensHw->isLensSubdevAvailable()) {
-+        return OK;
-+    }
-+
-+    int ret = OK;
-+
-+    int lensHwType = PlatformData::getLensHwType(mCameraId);
-+    switch(lensHwType) {
-+        case LENS_VCM_HW:
-+            if (mFocusPosition != afResults.next_lens_position) {
-+                ret = mLensHw->setFocusPosition(afResults.next_lens_position);
-+                mFocusPosition = afResults.next_lens_position;
-+                LOG3A("mFocusPosition = %d, camera id %d", mFocusPosition, mCameraId);
-+                LOG2("SENSORCTRLINFO: vcm_step=%d", mFocusPosition);
-+            }
-+            break;
-+        default:
-+            LOGW("Not supported Lens HW type, lensHwType = %d", lensHwType);
-+            break;
-+    }
-+
-+    return ret;
-+}
-+
-+void LensManager::getLensInfo(aiq_parameter_t &aiqParam) {
-+
-+    if (PlatformData::getLensHwType(mCameraId) == LENS_VCM_HW) {
-+        mLensHw->getLatestPosition(aiqParam.lensPosition, aiqParam.lensMovementStartTimestamp);
-+    }
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/LensManager.h b/camera/hal/intel/ipu6/src/3a/LensManager.h
-new file mode 100644
-index 000000000000..cbd1de401d28
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/LensManager.h
-@@ -0,0 +1,77 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_aiq.h"
-+
-+#include "LensHw.h"
-+#include "AiqSetting.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class LensManager
-+ * This class is used to control focus and aperture related controls.
-+ */
-+class LensManager {
-+
-+public:
-+    LensManager(int cameraId, LensHw *lensHw);
-+    ~LensManager();
-+
-+    /**
-+     * \brief Called when AIQ engine is started
-+     */
-+    int start();
-+
-+    /**
-+     * \brief Called when AIQ engine is stopped.
-+     */
-+    int stop();
-+
-+    /**
-+     * \brief Set Lens results
-+     *
-+     * \param[in] ia_aiq_ae_results includes aperture result
-+     *            and ia_aiq_af_results includes focus result.
-+     *
-+     * \return OK if set successfully.
-+     */
-+    int setLensResult(const ia_aiq_ae_results &aeResults,
-+                      const ia_aiq_af_results &afResults);
-+    /**
-+     * \brief Get Lens info
-+     *
-+     * \param[out] aiqParam: updating lens related parameters.
-+     *
-+     */
-+    void getLensInfo(aiq_parameter_t &aiqParam);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(LensManager);
-+
-+private:
-+    int mCameraId;
-+    LensHw *mLensHw;
-+    ia_aiq_aperture_control_dc_iris_command mDcIrisCommand;
-+    int mFocusPosition;
-+
-+    // Guard for LensManager public API.
-+    Mutex mLock;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.cpp b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
-new file mode 100644
-index 000000000000..fde6a1076cdf
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
-@@ -0,0 +1,550 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Ltm"
-+
-+#include <cmath>
-+#include <memory>
-+
-+#include "Ltm.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "MakerNote.h"
-+#include "PlatformData.h"
-+#include "AiqResultStorage.h"
-+#include "AiqUtils.h"
-+
-+#include "ia_log.h"
-+
-+namespace icamera {
-+
-+Ltm::Ltm(int cameraId) :
-+    mCameraId(cameraId),
-+    mLtm(nullptr),
-+    mTuningMode(TUNING_MODE_MAX),
-+    mLtmState(LTM_NOT_INIT),
-+    mThreadRunning(false),
-+    mInputParamIndex(-1)
-+{
-+    CLEAR(mLtmParams);
-+    CLEAR(mSisBuffer);
-+    CLEAR(mLtmBinParam);
-+
-+    mIntelLtm = std::unique_ptr<IntelLtm>(new IntelLtm());
-+    mLtmThread = new LtmThread(this);
-+    LOG3A("%s", __func__);
-+}
-+
-+Ltm::~Ltm()
-+{
-+    LOG3A("%s", __func__);
-+    mLtmThread->join();
-+    delete mLtmThread;
-+}
-+
-+int Ltm::initLtmParams()
-+{
-+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
-+        mLtmParams[i]->ltmParams.ltm_level = ia_ltm_level_use_tuning;
-+        mLtmParams[i]->ltmParams.frame_use = ia_aiq_frame_use_video;
-+        mLtmParams[i]->ltmParams.ev_shift = 0;
-+        mLtmParams[i]->ltmParams.ltm_strength_manual = 100;
-+        mLtmParams[i]->ltmParams.gtm_input_params_ptr = &(mLtmParams[i]->gtmParams);
-+
-+        mLtmParams[i]->gtmParams.manual_convergence_time = -1;
-+        mLtmParams[i]->gtmParams.manual_gain = -1;
-+        mLtmParams[i]->gtmParams.frame_timestamp = 0;
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::init()
-+{
-+    LOG3A("%s", __func__);
-+
-+    AutoMutex l(mLtmLock);
-+
-+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
-+        mLtmParams[i] = new LtmInputParams;
-+        mSisBuffer[i] = new SisBuffer;
-+    }
-+
-+    initLtmParams();
-+
-+    mLtmState = LTM_INIT;
-+
-+    return OK;
-+}
-+
-+int Ltm::deinit()
-+{
-+    LOG3A("%s", __func__);
-+
-+    deinitIaLtmHandle();
-+
-+    AutoMutex l(mLtmLock);
-+
-+    for (int i = 0; i < kMaxLtmParamsNum; i++) {
-+        if (mSisBuffer[i]->sisImage.data) {
-+            free(mSisBuffer[i]->sisImage.data);
-+            mSisBuffer[i]->sisImage.data = nullptr;
-+        }
-+
-+        if (mLtmParams[i]->ltmParams.input_image_ptr) {
-+            free(mLtmParams[i]->ltmParams.input_image_ptr);
-+            mLtmParams[i]->ltmParams.input_image_ptr = nullptr;
-+        }
-+
-+        delete mSisBuffer[i];
-+        mSisBuffer[i] = nullptr;
-+
-+        delete mLtmParams[i];
-+        mLtmParams[i] = nullptr;
-+    }
-+    mLtmState = LTM_NOT_INIT;
-+
-+    return OK;
-+}
-+
-+int Ltm::initIaLtmHandle(TuningMode tuningMode)
-+{
-+    LOG3A("%s", __func__);
-+
-+    ia_mkn *mkn = MakerNote::getInstance(mCameraId)->getMknHandle();
-+    CheckError((mkn == nullptr), NO_INIT, "Error in initing makernote");
-+
-+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
-+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
-+
-+    ia_binary_data otherData;
-+    int ret = cpf->getDataAndCmc(nullptr, nullptr, &otherData, nullptr, tuningMode);
-+    CheckError(ret != OK, BAD_VALUE, "@%s, Get cpf data failed", __func__);
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_init", 0);
-+        mLtm = mIntelLtm->init(&otherData, mkn);
-+    }
-+    CheckError(mLtm == nullptr, NO_INIT, "Failed to init ltm");
-+
-+    return OK;
-+}
-+
-+int Ltm::deinitIaLtmHandle()
-+{
-+    LOG3A("%s", __func__);
-+
-+    if (mLtm) {
-+        PERF_CAMERA_ATRACE_PARAM1("ia_ltm_deinit", 0);
-+        mIntelLtm->deinit(mLtm);
-+        mLtm = nullptr;
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::configure(const std::vector<ConfigMode>& configModes)
-+{
-+    LOG3A("%s", __func__);
-+
-+    TuningMode tMode = TUNING_MODE_MAX;
-+    for (auto cfg : configModes) {
-+        // Only support the 1st tuning mode if multiple config mode is configured.
-+        if (cfg == CAMERA_STREAM_CONFIGURATION_MODE_NORMAL) {
-+            tMode = TUNING_MODE_VIDEO;
-+            break;
-+        }
-+    }
-+
-+    if (tMode == TUNING_MODE_MAX) {
-+        return OK;
-+    }
-+
-+    if (mLtmState == LTM_CONFIGURED && mTuningMode == tMode) {
-+        return OK;
-+    }
-+
-+    deinitIaLtmHandle();
-+
-+    int ret = initIaLtmHandle(tMode);
-+    CheckError((ret != OK), ret, "%s, configure LTM algo failed %d", __func__, ret);
-+
-+    mTuningMode = tMode;
-+    mLtmState = LTM_CONFIGURED;
-+
-+    updateTuningData();
-+
-+    LOG3A("%s Ltm algo is Configured", __func__);
-+    return OK;
-+}
-+
-+int Ltm::start()
-+{
-+    LOG1("@%s", __func__);
-+    AutoMutex l(mLtmLock);
-+
-+    if (PlatformData::isEnableLtmThread(mCameraId)) {
-+        mThreadRunning = true;
-+        mLtmThread->run("ltm_thread", PRIORITY_NORMAL);
-+    }
-+
-+    return OK;
-+}
-+
-+void Ltm::stop()
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (PlatformData::isEnableLtmThread(mCameraId)) {
-+        mLtmThread->requestExit();
-+        {
-+            AutoMutex l(mLtmLock);
-+            mThreadRunning = false;
-+            mParamAvailableSignal.signal();
-+        }
-+        mLtmThread->requestExitAndWait();
-+    }
-+
-+    while (!mLtmParamsQ.empty()) {
-+        mLtmParamsQ.pop();
-+    }
-+}
-+
-+void Ltm::handleEvent(EventData eventData)
-+{
-+    if (eventData.type == EVENT_PSYS_STATS_BUF_READY) {
-+        LOG3A("%s: handle EVENT_PSYS_STATS_BUF_READY", __func__);
-+        long sequence = eventData.data.statsReady.sequence;
-+        unsigned long long timestamp = TIMEVAL2USECS(eventData.data.statsReady.timestamp);
-+
-+        LtmStatistics *ltmStatistics = AiqResultStorage::getInstance(mCameraId)->getLtmStatistics();
-+        if (ltmStatistics->sequence != sequence || ltmStatistics->yvGrid == nullptr) return;
-+
-+        handleLtm(ltmStatistics->yvGrid, timestamp, sequence);
-+    } else if (eventData.type == EVENT_PSYS_STATS_SIS_BUF_READY) {
-+        LOG3A("%s: handle EVENT_PSYS_STATS_SIS_BUF_READY", __func__);
-+        handleSisLtm(eventData.buffer);
-+    }
-+}
-+
-+AiqResult *Ltm::getAiqResult(long sequence)
-+{
-+    long ltmSequence = sequence;
-+    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
-+    if (ltmSequence > 0) {
-+        ltmSequence += PlatformData::getLtmGainLag(mCameraId);
-+    }
-+
-+    LOG3A("%s, ltmSequence %ld, sequence %ld", __func__, ltmSequence, sequence);
-+    AiqResult* feedback = const_cast<AiqResult*>(resultStorage->getAiqResult(ltmSequence));
-+    if (feedback == nullptr) {
-+        LOGW("%s: no feed back result for sequence %ld! use the latest instead",
-+                __func__, ltmSequence);
-+        feedback = const_cast<AiqResult*>(resultStorage->getAiqResult());
-+    }
-+
-+    return feedback;
-+}
-+
-+int Ltm::handleLtm(ia_isp_bxt_hdr_yv_grid_t* inputYvGrid, unsigned long long timestamp, long sequence)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoMutex l(mLtmLock);
-+
-+    mInputParamIndex++;
-+    mInputParamIndex %= kMaxLtmParamsNum;
-+
-+    if (inputYvGrid) {
-+        mLtmParams[mInputParamIndex]->yvGrid = *inputYvGrid;
-+        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = &(mLtmParams[mInputParamIndex]->yvGrid);
-+    } else {
-+        mLtmParams[mInputParamIndex]->ltmParams.yv_grid = nullptr;
-+    }
-+
-+    AiqResult* feedback = getAiqResult(sequence);
-+    updateParameter(feedback->mAiqParam, timestamp);
-+
-+    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
-+        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
-+        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
-+
-+        runLtm(&(feedback->mAeResults), ltmResult);
-+        resultStorage->updateLtmResult(sequence);
-+        updateTuningData();
-+    } else {
-+        mLtmParams[mInputParamIndex]->sequence = sequence;
-+        bool needSignal = mLtmParamsQ.empty();
-+        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
-+        if (needSignal) {
-+            mParamAvailableSignal.signal();
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer)
-+{
-+    LOG3A("@%s", __func__);
-+    AutoMutex l(mLtmLock);
-+
-+    ia_binary_data* sisFrame = (ia_binary_data*)cameraBuffer->getBufferAddr();
-+    CheckError(sisFrame == nullptr, BAD_VALUE, "sis frame buffer is nullptr!");
-+    int sisWidth = cameraBuffer->getWidth();
-+    int sisHeight = cameraBuffer->getHeight();
-+    int sequence = cameraBuffer->getSequence();
-+
-+    mInputParamIndex++;
-+    mInputParamIndex %= kMaxLtmParamsNum;
-+
-+    AiqResult *feedback = getAiqResult(sequence);
-+
-+    int size = sisFrame->size;
-+    CheckError((size <= 0), BAD_VALUE, "sis data size err!");
-+
-+    void *data = sisFrame->data;
-+    CheckError((data == nullptr), BAD_VALUE, "sis data ptr err!");
-+
-+    ia_ltm_input_image *inputImagePtr = mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr;
-+    if (!inputImagePtr) {
-+        inputImagePtr = (ia_ltm_input_image *)malloc(sizeof(ia_ltm_input_image));
-+        CheckError((inputImagePtr == nullptr), NO_INIT, "Error in initing image ptr");
-+
-+        memset(inputImagePtr, 0, sizeof(ia_ltm_input_image));
-+        mLtmParams[mInputParamIndex]->ltmParams.input_image_ptr = inputImagePtr;
-+
-+        inputImagePtr->image_info.raw_image.data_format = ia_image_data_format_rawplain16_interleaved;
-+        inputImagePtr->image_info.raw_image.bayer_order = cmc_bayer_order_grbg;
-+        inputImagePtr->image_info.raw_image.data_format_bpp = 16;
-+        inputImagePtr->image_info.raw_image.data_bpp = 15;
-+
-+        mSisBuffer[mInputParamIndex]->sisPort = SIS_A;
-+        mSisBuffer[mInputParamIndex]->sisImage.size = size;
-+        mSisBuffer[mInputParamIndex]->sisImage.data = malloc(size);
-+        CheckError((mSisBuffer[mInputParamIndex]->sisImage.data == nullptr),
-+            NO_MEMORY, "sis buffer allocated failed!");
-+
-+        MEMCPY_S(mSisBuffer[mInputParamIndex]->sisImage.data, size, data, size);
-+
-+        inputImagePtr->image_data = &mSisBuffer[mInputParamIndex]->sisImage;
-+        // width_cols and height_lines are quad count, need to divide 2 for them.
-+        inputImagePtr->image_info.raw_image.width_cols = sisWidth / 2;
-+        inputImagePtr->image_info.raw_image.height_lines = sisHeight / 2;
-+
-+        mLtmBinParam.sParam.gridWidth = sisWidth;
-+        mLtmBinParam.sParam.gridHeight = sisHeight;
-+    }
-+
-+    updateParameter(feedback->mAiqParam, 0);
-+
-+    if ((!PlatformData::isEnableLtmThread(mCameraId)) || sequence == 0) {
-+        AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
-+        ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
-+
-+        runLtm(&(feedback->mAeResults), ltmResult);
-+        resultStorage->updateLtmResult(sequence);
-+        updateTuningData();
-+    } else {
-+        mLtmParams[mInputParamIndex]->sequence = sequence;
-+        bool needSignal = mLtmParamsQ.empty();
-+        mLtmParamsQ.push(mLtmParams[mInputParamIndex]);
-+        if (needSignal) {
-+            mParamAvailableSignal.signal();
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::runLtm()
-+{
-+    LtmInputParams *inputParams = NULL;
-+
-+    AiqResultStorage *resultStorage = AiqResultStorage::getInstance(mCameraId);
-+    ConditionLock lock(mLtmLock);
-+
-+    while(mLtmParamsQ.empty()) {
-+        // To prevent possible dead lock during stop of ltm thread.
-+        if (!mThreadRunning) {
-+            LOG2("%s, ltm thread is not active, no need to wait ltm stat", __func__);
-+            return OK;
-+        }
-+
-+        mParamAvailableSignal.wait(lock);
-+
-+        if (!mThreadRunning) {
-+            LOG2("%s, ltm thread is not active while waiting ltm stat", __func__);
-+            return OK;
-+        }
-+    }
-+
-+    CheckError(mLtmParamsQ.empty(), UNKNOWN_ERROR, "Failed to get ltm input params buffers");
-+    inputParams = mLtmParamsQ.front();
-+    mLtmParamsQ.pop();
-+    CheckError(!inputParams, OK, "%s, the inputParams is NULL", __func__);
-+
-+    ltm_result_t *ltmResult = resultStorage->acquireLtmResult();
-+    LOG1("@%s the sequence: %ld", __func__, inputParams->sequence);
-+    AiqResult *feedback = getAiqResult(inputParams->sequence);
-+
-+    mLtmBinParam.sequence = inputParams->sequence;
-+    runLtm(&(feedback->mAeResults), ltmResult, &(inputParams->ltmParams));
-+    resultStorage->updateLtmResult(inputParams->sequence);
-+
-+    updateTuningData();
-+
-+    return OK;
-+}
-+
-+int Ltm::runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams)
-+{
-+    LOG3A("%s", __func__);
-+    PERF_CAMERA_ATRACE();
-+
-+    if (mLtmState != LTM_CONFIGURED) {
-+        return OK;
-+    }
-+
-+    ia_ltm_results *tmpLtmResults = nullptr;
-+    ia_ltm_drc_params *tmpLtmDrcParams = nullptr;
-+    ia_ltm_input_params *tmpLtmParams = ltmParams;
-+
-+    if (tmpLtmParams == NULL) {
-+        tmpLtmParams = &(mLtmParams[mInputParamIndex]->ltmParams);
-+    }
-+
-+    if (!tmpLtmParams->yv_grid) {
-+        // ltm can run without Yv grid and default ltm params will be used.
-+        LOGD("mYvGrid is Null.");
-+    }
-+    tmpLtmParams->ae_results = aeResult;
-+
-+    LOG3A("%s: begin running LTM", __func__);
-+    ia_err iaErr;
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_ltm_run", 0);
-+        iaErr = mIntelLtm->run(mLtm, tmpLtmParams, &tmpLtmResults, &tmpLtmDrcParams);
-+    }
-+
-+    int ret = AiqUtils::convertError(iaErr);
-+    CheckError(ret != OK, ret, "Error running LTM: %d", ret);
-+
-+    LOG3A("%s: LTM GAIN = %lf", __func__, tmpLtmResults->ltm_gain);
-+
-+    dumpLtmDrcParams(tmpLtmDrcParams);
-+    dumpLtmResultsParams(tmpLtmResults);
-+
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmResults", 0);
-+        ret = AiqUtils::deepCopyLtmResults(*tmpLtmResults, &ltmResult->ltmResults);
-+    }
-+    CheckError(ret != OK, ret, "Error on copying LTM results: %d", ret);
-+
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1("deepCopyLtmDRCParams", 0);
-+        ret = AiqUtils::deepCopyLtmDRCParams(*tmpLtmDrcParams, &ltmResult->ltmDrcParams);
-+    }
-+    CheckError(ret != OK, ret, "Error on copying DRC results: %d", ret);
-+
-+    ltmResult->yvGridInfo.width = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_width : 0;
-+    ltmResult->yvGridInfo.height = tmpLtmParams->yv_grid ? tmpLtmParams->yv_grid->grid_height : 0;
-+
-+    return OK;
-+}
-+
-+int Ltm::updateTuningData()
-+{
-+    LOG3A("%s", __func__);
-+
-+    if (mLtmState != LTM_CONFIGURED) {
-+        return INVALID_OPERATION;
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::updateParameter(const aiq_parameter_t &param, unsigned long long timestamp)
-+{
-+    LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
-+
-+    mLtmParams[mInputParamIndex]->ltmParams.ev_shift = param.evShift;
-+    mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual = param.ltmStrength;
-+    mLtmParams[mInputParamIndex]->ltmParams.frame_width = param.resolution.width;
-+    mLtmParams[mInputParamIndex]->ltmParams.frame_height = param.resolution.height;
-+
-+    mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time = -1;
-+
-+    if (param.manualGain >= 0) {
-+        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = pow(10, (param.manualGain / 20));
-+    } else {
-+        mLtmParams[mInputParamIndex]->gtmParams.manual_gain = -1;
-+    }
-+    mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp = timestamp;
-+
-+    LOG3A("%s: Ltm EV shift %f strength %d", __func__,
-+            mLtmParams[mInputParamIndex]->ltmParams.ev_shift,
-+            mLtmParams[mInputParamIndex]->ltmParams.ltm_strength_manual);
-+    LOG3A("%s: Gtm manual gain %f, manual convergence time %f, frame timestamp %llu",
-+            __func__, mLtmParams[mInputParamIndex]->gtmParams.manual_gain,
-+            mLtmParams[mInputParamIndex]->gtmParams.manual_convergence_time,
-+            mLtmParams[mInputParamIndex]->gtmParams.frame_timestamp);
-+
-+    return OK;
-+}
-+
-+int Ltm::dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) return OK;
-+
-+    LOG3A("%s", __func__);
-+
-+    if (!ltmDrcParams){
-+        LOG2("%s: ltmDrcParams is nullptr, and nothing to dump.", __func__);
-+        return BAD_VALUE;
-+    }
-+
-+    //Only dump first 10 values.
-+    for (unsigned int i = 0; i < 10; i++) {
-+       LOG3A("   LTM DRC params matrix gain %u weight %u",
-+            ltmDrcParams->gain_map[i], ltmDrcParams->weight_map[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Ltm::dumpLtmResultsParams(const ia_ltm_results *ltmResults)
-+{
-+    if (!CameraDump::isDumpTypeEnable(DUMP_LTM_OUTPUT)) return OK;
-+
-+    LOG3A("%s", __func__);
-+
-+    if (!ltmResults){
-+        LOG2("%s: ltmResults is nullptr, and nothing to dump.", __func__);
-+        return BAD_VALUE;
-+    }
-+
-+    char fileName[MAX_NAME_LEN] = {'\0'};
-+    snprintf(fileName, (MAX_NAME_LEN-1), "ia_ltm_luts_%ld_w_%d_h_%d.bin",
-+        mLtmBinParam.sequence, mLtmBinParam.sParam.gridWidth, mLtmBinParam.sParam.gridHeight);
-+
-+    CameraDump::writeData(ltmResults->ltm_luts, sizeof(ltmResults->ltm_luts), fileName);
-+
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/Ltm.h b/camera/hal/intel/ipu6/src/3a/Ltm.h
-new file mode 100644
-index 000000000000..1f97e1975f96
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/Ltm.h
-@@ -0,0 +1,185 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <queue>
-+#include <memory>
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelLtm.h"
-+#else
-+#include "modules/algowrapper/IntelLtm.h"
-+#endif
-+
-+#include "CameraEvent.h"
-+#include "AiqSetting.h"
-+#include "AiqResult.h"
-+#include "iutils/Thread.h"
-+#include "iutils/CameraDump.h"
-+
-+namespace icamera {
-+
-+struct ltm_result_t {
-+    ia_ltm_drc_params ltmDrcParams;
-+    ia_ltm_results ltmResults;
-+
-+    camera_resolution_t yvGridInfo;
-+
-+    long sequence;
-+
-+    ltm_result_t() {
-+        CLEAR(ltmDrcParams);
-+        CLEAR(ltmResults);
-+        yvGridInfo = {0, 0};
-+        sequence = -1;
-+    }
-+};
-+
-+struct LtmInputParams {
-+    ia_isp_bxt_hdr_yv_grid_t yvGrid;
-+    ia_ltm_input_params ltmParams;
-+    ia_ltm_gtm_input_params gtmParams;
-+    long sequence;
-+
-+    LtmInputParams() {
-+        CLEAR(yvGrid);
-+        CLEAR(ltmParams);
-+        CLEAR(gtmParams);
-+        sequence = -1;
-+    }
-+};
-+/**
-+ * There are two SIS port, SIS_A is for preview.
-+ * SIS_B is for still and capture.
-+ */
-+enum SisPort
-+{
-+    SIS_A = 0,
-+    SIS_B,
-+    MAX_SIS_NUM
-+};
-+
-+struct SisBuffer
-+{
-+    SisPort sisPort;
-+    ia_binary_data sisImage;
-+
-+    SisBuffer() {
-+        sisPort = SIS_A;
-+        CLEAR(sisImage);
-+    }
-+};
-+
-+struct LtmStatistics {
-+    LtmStatistics(ia_isp_bxt_hdr_yv_grid_t *inputYvGrid = nullptr, long seq = -1) {
-+        yvGrid = inputYvGrid;
-+        sequence = seq;
-+    }
-+    ia_isp_bxt_hdr_yv_grid_t *yvGrid;
-+    long sequence;
-+};
-+
-+/**
-+ * \class Ltm
-+ * This class is used to run Local tone mapping (Ltm) algorithm.
-+ */
-+class Ltm : public EventListener {
-+ public:
-+    Ltm(int cameraId);
-+    ~Ltm();
-+
-+    int init();
-+    int deinit();
-+    int start();
-+    void stop();
-+
-+    int configure(const std::vector<ConfigMode>& configModes);
-+
-+    /**
-+     * \brief handle statistics event
-+     */
-+    void handleEvent(EventData eventData);
-+
-+    int handleLtm(ia_isp_bxt_hdr_yv_grid_t* yvGrid,
-+                  unsigned long long timestamp = 0,
-+                  long sequence = 0);
-+    int handleSisLtm(const std::shared_ptr<CameraBuffer> &cameraBuffer);
-+ private:
-+    DISALLOW_COPY_AND_ASSIGN(Ltm);
-+
-+    int runLtm();
-+    int initLtmParams();
-+    int runLtm(ia_aiq_ae_results* aeResult, ltm_result_t *ltmResult, ia_ltm_input_params *ltmParams = NULL);
-+
-+    int initIaLtmHandle(TuningMode tuningMode);
-+    int deinitIaLtmHandle();
-+
-+    int updateTuningData();
-+    AiqResult *getAiqResult(long sequence);
-+    int updateParameter(const aiq_parameter_t &param, unsigned long long timestamp);
-+
-+    int dumpLtmDrcParams(const ia_ltm_drc_params* ltmDrcParams);
-+    int dumpLtmResultsParams(const ia_ltm_results *ltmResults);
-+
-+ private:
-+    /**
-+     * \brief The ltm thread
-+     */
-+    class LtmThread: public Thread {
-+        Ltm *mLtmHandle;
-+        public:
-+        LtmThread(Ltm *pThis)
-+            : mLtmHandle(pThis) { }
-+
-+        virtual bool threadLoop() {
-+            int ret = mLtmHandle->runLtm();
-+            return (ret == 0);
-+        }
-+    };
-+
-+    int mCameraId;
-+    ia_ltm *mLtm;
-+    TuningMode mTuningMode;
-+
-+    enum LtmState {
-+        LTM_NOT_INIT = 0,
-+        LTM_INIT,
-+        LTM_CONFIGURED,
-+        LTM_MAX
-+    } mLtmState;
-+
-+    // Use it to lock mInputParamIndex and mLtmParams
-+    // And use it for thread condition lock
-+    Mutex  mLtmLock;
-+    LtmThread *mLtmThread;
-+    bool mThreadRunning;
-+    Condition mParamAvailableSignal;
-+    static const nsecs_t kWaitDuration = 2000000000;  // 2000ms
-+    static const int kMaxLtmParamsNum = 2;  // 2 ltm input params
-+
-+    int mInputParamIndex;
-+    LtmInputParams *mLtmParams[kMaxLtmParamsNum];
-+    std::queue<LtmInputParams *> mLtmParamsQ;
-+
-+    SisBuffer *mSisBuffer[kMaxLtmParamsNum];
-+    BinParam_t mLtmBinParam;
-+
-+    std::unique_ptr<IntelLtm> mIntelLtm;
-+};
-+
-+}  /* namespace icamera */
-+
-diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.cpp b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
-new file mode 100644
-index 000000000000..0008866d88a5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
-@@ -0,0 +1,139 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "MakerNote"
-+
-+#include "src/3a/MakerNote.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+std::map<int, MakerNote*> MakerNote::sInstances;
-+Mutex MakerNote::sLock;
-+
-+MakerNote *MakerNote::getInstance(int cameraId) {
-+    AutoMutex lock(sLock);
-+    return getInstanceLocked(cameraId);
-+}
-+
-+void MakerNote::releaseMakerNote(int cameraId) {
-+    AutoMutex lock(sLock);
-+    MakerNote* note = getInstanceLocked(cameraId);
-+
-+    sInstances.erase(cameraId);
-+    delete note;
-+}
-+
-+MakerNote *MakerNote::getInstanceLocked(int cameraId) {
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        return sInstances[cameraId];
-+    }
-+
-+    sInstances[cameraId] = new MakerNote();
-+    LOG1("@%s, create MakerNote instance %d", __func__, cameraId);
-+    return sInstances[cameraId];
-+}
-+
-+MakerNote::MakerNote() :
-+    mMknState(UNINIT),
-+    mMkn(nullptr) {
-+    LOG1("@%s", __func__);
-+
-+    for (int i = 0; i < MAX_MAKER_NOTE_LIST_SIZE; i++) {
-+        std::shared_ptr<MakernoteData> data = std::shared_ptr<MakernoteData>(new MakernoteData());
-+        mMakernoteDataList.push_back(data);
-+    }
-+
-+    mMkn = mIntelMkn.init(ia_mkn_cfg_compression,
-+                          MAKERNOTE_SECTION1_SIZE, MAKERNOTE_SECTION2_SIZE);
-+    CheckError(mMkn == nullptr, VOID_VALUE, "@%s, Failed to init mkn", __func__);
-+
-+    int ret = mIntelMkn.enable(mMkn, true);
-+    CheckError(ret != ia_err_none, VOID_VALUE,
-+               "@%s, Failed to enable mkn ret %d", __func__, ret);
-+
-+    mMknState = INIT;
-+}
-+
-+MakerNote::~MakerNote() {
-+    LOG1("@%s", __func__);
-+
-+    AutoMutex lock(mMknLock);
-+    mIntelMkn.deinit(mMkn);
-+
-+    mMakernoteDataList.clear();
-+}
-+
-+int MakerNote::acquireMakernoteData(int64_t sequence, Parameters *param) {
-+    LOG1("@%s", __func__);
-+
-+    AutoMutex lock(mMknLock);
-+    CheckError(mMknState != INIT, BAD_VALUE, "@%s, mkn isn't initialized", __func__);
-+    CheckError(param == nullptr, BAD_VALUE, "@%s, param is nullptr", __func__);
-+
-+    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
-+        if ((*rit)->sequence >= 0 && sequence >= (*rit)->sequence) {
-+            LOG2("@%s, found sequence %ld for request sequence %ld", __func__,
-+                 (*rit)->sequence, sequence);
-+            param->setMakernoteData((*rit)->section, (*rit)->size);
-+            return OK;
-+        }
-+    }
-+
-+    return UNKNOWN_ERROR;
-+}
-+
-+int MakerNote::saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence) {
-+    LOG1("@%s", __func__);
-+    if (makernoteMode == MAKERNOTE_MODE_OFF) return OK;
-+
-+    AutoMutex lock(mMknLock);
-+    CheckError(mMknState != INIT, BAD_VALUE, "@%s, mkn isn't initialized", __func__);
-+
-+    ia_mkn_trg mknTrg = (makernoteMode == MAKERNOTE_MODE_JPEG ? ia_mkn_trg_section_1 :
-+                                                                ia_mkn_trg_section_2);
-+    ia_binary_data makerNote;
-+    int ret = mIntelMkn.prepare(mMkn, mknTrg, &makerNote);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "@%s, Failed to prepare makernote", __func__);
-+    CheckError((makerNote.data == nullptr), UNKNOWN_ERROR,
-+               "@%s, invalid makernote data pointer", __func__);
-+    CheckError(makerNote.size == 0, UNKNOWN_ERROR, "@%s, 0 size makernote data saved", __func__);
-+
-+    std::shared_ptr<MakernoteData> data = mMakernoteDataList.front();
-+    mMakernoteDataList.pop_front();
-+
-+    MEMCPY_S(data->section, sizeof(char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE),
-+             makerNote.data, makerNote.size);
-+
-+    data->size = makerNote.size;
-+    data->sequence = sequence;
-+    LOG2("@%s, saved makernote %d for sequence %ld", __func__, makernoteMode, sequence);
-+
-+    mMakernoteDataList.push_back(data);
-+    return OK;
-+}
-+
-+ia_mkn *MakerNote::getMknHandle() {
-+    LOG1("@%s", __func__);
-+    AutoMutex lock(mMknLock);
-+    CheckError(mMknState != INIT, nullptr, "@%s, mkn isn't initialized", __func__);
-+
-+    return mMkn;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/MakerNote.h b/camera/hal/intel/ipu6/src/3a/MakerNote.h
-new file mode 100644
-index 000000000000..9aac30499592
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.h
-@@ -0,0 +1,129 @@
-+/*
-+ * Copyright (C) 2018-2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <list>
-+#include <memory>
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelMkn.h"
-+#else
-+#include "modules/algowrapper/IntelMkn.h"
-+#endif
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Thread.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+struct MakernoteData {
-+    int64_t sequence;
-+    unsigned int size;
-+    char section[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
-+
-+    MakernoteData() {
-+        sequence = -1;
-+        size = 0;
-+        CLEAR(section);
-+    }
-+};
-+
-+/**
-+ * \class MakerNote
-+ *
-+ * This class encapsulates Intel Makernotes function, and provides interface
-+ * for enabling and acquiring Makenotes which is called by AiqEngine, Ltm
-+ * and AiqPlus.
-+ *
-+ * It's a singleton based on camera id, and its life cycle can  be maintained
-+ * by its static methods getInstance and releaseMakerNote.
-+ */
-+class MakerNote {
-+ public:
-+    /**
-+     * \brief Get instance for cameraId.
-+     *
-+     * param[in] int camera id.
-+     *
-+     * return the instance of MakerNote for cameraId.
-+     */
-+    static MakerNote *getInstance(int cameraId);
-+
-+    /**
-+     * \brief Release the static instance of MakerNote for cameraId.
-+     */
-+    static void releaseMakerNote(int cameraId);
-+
-+    /**
-+     * \brief acquire Makernote data.
-+     *
-+     * param[in] int64_t sequence: the sequence in frame buffer;
-+     * param[out] param: Makernote data will be saved in Parameters as metadata.
-+     *
-+     * return OK if acquire Makernote successfully, otherwise return ERROR.
-+     */
-+    int acquireMakernoteData(int64_t sequence, Parameters *param);
-+
-+    /**
-+     * \brief Save Makernote by ia_mkn_trg mode
-+     *
-+     * param[in] camera_makernote_mode_t: MAKERNOTE_MODE_JPEG is corresponding
-+     *           to ia_mkn_trg_section_1 for Normal Jpeg capture;
-+     *           MAKERNOTE_MODE_RAW is corresponding to ia_mkn_trg_section_2
-+     *           for Raw image capture.
-+     * param[in] int64_t sequence: the sequence in latest AiqResult
-+     *
-+     * return OK if get Makernote successfully, otherwise return ERROR.
-+     */
-+    int saveMakernoteData(camera_makernote_mode_t makernoteMode, int64_t sequence);
-+
-+    /**
-+     * \brief Get ia_mkn (Makernote) handle.
-+     */
-+    ia_mkn *getMknHandle();
-+
-+ private:
-+    MakerNote();
-+    ~MakerNote();
-+
-+    static MakerNote *getInstanceLocked(int cameraId);
-+
-+ private:
-+    // Should > max request number in processing
-+    static const int MAX_MAKER_NOTE_LIST_SIZE = 10;
-+
-+    enum MknState {
-+        UNINIT,
-+        INIT
-+    } mMknState;
-+
-+    static std::map<int, MakerNote*> sInstances;
-+    // Guard for singleton creation
-+    static Mutex sLock;
-+
-+    // Guard for MakerNote API
-+    Mutex mMknLock;
-+    ia_mkn *mMkn;
-+
-+    IntelMkn mIntelMkn;
-+
-+    std::list<std::shared_ptr<MakernoteData>> mMakernoteDataList;
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.cpp b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
-new file mode 100644
-index 000000000000..1abd08dcdab7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/SensorManager.cpp
-@@ -0,0 +1,327 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SensorManager"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqUtils.h"
-+#include "SensorManager.h"
-+#include "PlatformData.h"
-+
-+using std::vector;
-+
-+namespace icamera {
-+
-+SensorManager::SensorManager(int cameraId, SensorHwCtrl *sensorHw) :
-+    mCameraId(cameraId),
-+    mSensorHwCtrl(sensorHw),
-+    mModeSwitched(false),
-+    mPerframeControl(false),
-+    mLastSofSequence(-1),
-+    mGainDelay(0),
-+    mSensorExposureHistoryIndex(-1)
-+{
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    CLEAR(mWdrModeSetting);
-+
-+    if (PlatformData::getGainLag(mCameraId) > 0) {
-+        mGainDelay = PlatformData::getExposureLag(mCameraId) - PlatformData::getGainLag(mCameraId);
-+    }
-+}
-+
-+SensorManager::~SensorManager()
-+{
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+}
-+
-+int SensorManager::init()
-+{
-+    AutoMutex l(mLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    mSensorExposures.reserve(kMaxSensorExposures);
-+    reset();
-+    return OK;
-+}
-+
-+int SensorManager::deinit()
-+{
-+    AutoMutex l(mLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    return OK;
-+}
-+
-+void SensorManager::reset()
-+{
-+    mPerframeControl = false,
-+    mLastSofSequence = -1;
-+
-+    mModeSwitched = false;
-+
-+    for (int i = 0; i < kMaxExposureHistory; i++) {
-+        mSensorExposureHistory[i].clear();
-+    }
-+
-+    mSensorExposureHistoryIndex = -1;
-+
-+    CLEAR(mWdrModeSetting);
-+    mWdrModeSetting.tuningMode = TUNING_MODE_MAX;
-+
-+    mSofEventInfo.clear();
-+}
-+
-+EventListener *SensorManager::getSofEventListener()
-+{
-+    AutoMutex l(mLock);
-+    LOG1("@%s mCameraId = %d", __func__, mCameraId);
-+
-+    return this;
-+}
-+
-+void SensorManager::handleEvent(EventData eventData)
-+{
-+    AutoMutex l(mLock);
-+    LOG3A("@%s", __func__);
-+
-+    if (eventData.type == EVENT_ISYS_SOF) {
-+        LOG3A("sequence = %ld, timestamp = %ld",
-+                eventData.data.sync.sequence,
-+                TIMEVAL2USECS(eventData.data.sync.timestamp));
-+        handleSensorExposure();
-+        mLastSofSequence = eventData.data.sync.sequence;
-+
-+        SofEventInfo info;
-+        info.sequence = eventData.data.sync.sequence;
-+        info.timestamp = ((long)eventData.data.sync.timestamp.tv_sec) * 1000000
-+                         + eventData.data.sync.timestamp.tv_usec;
-+        if (mSofEventInfo.size() >= kMaxSofEventInfo) {
-+            mSofEventInfo.erase(mSofEventInfo.begin());
-+        }
-+        mSofEventInfo.push_back(info);
-+    }
-+}
-+
-+uint64_t SensorManager::getSofTimestamp(long sequence)
-+{
-+    AutoMutex l(mLock);
-+
-+    for (auto info : mSofEventInfo) {
-+        if (info.sequence == sequence) {
-+            return info.timestamp;
-+        }
-+    }
-+    return 0;
-+}
-+
-+void SensorManager::handleSensorExposure()
-+{
-+    if (!mSensorExposures.empty()) {
-+        SensorExpGroup& exposures = mSensorExposures[0];
-+        setFrameDuration(exposures[0].sensorParam.line_length_pixels, exposures[0].sensorParam.frame_length_lines);
-+        setSensorExposureAndGains(exposures);
-+        mSensorExposures.erase(mSensorExposures.begin());
-+    } else {
-+        if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
-+            // If gain setting is postponed, set last gain setting to sensor driver
-+            int index = mSensorExposureHistoryIndex % kMaxExposureHistory;
-+            setSensorGains(index);
-+        }
-+        mPerframeControl = false;
-+    }
-+}
-+
-+int SensorManager::getCurrentExposureAppliedDelay()
-+{
-+    AutoMutex l(mLock);
-+
-+    return mSensorExposures.size() + PlatformData::getExposureLag(mCameraId);
-+}
-+
-+uint32_t SensorManager::updateSensorExposure(SensorExpGroup sensorExposures, bool useSof)
-+{
-+    AutoMutex l(mLock);
-+
-+    long appliedSeq = mLastSofSequence < 0 ? 0 : \
-+                      mLastSofSequence + PlatformData::getExposureLag(mCameraId);
-+
-+    if (sensorExposures.empty()) {
-+        LOGW("%s: No exposure parameter", __func__);
-+        return ((uint32_t)appliedSeq);
-+    }
-+
-+    if (useSof) {
-+        mSensorExposures.push_back(sensorExposures);
-+        mPerframeControl = true;
-+        appliedSeq += mSensorExposures.size();
-+    } else if (PlatformData::isIsysEnabled(mCameraId)
-+               && !mPerframeControl) {
-+        setFrameDuration(sensorExposures[0].sensorParam.line_length_pixels, sensorExposures[0].sensorParam.frame_length_lines);
-+        setSensorExposureAndGains(sensorExposures);
-+    }
-+
-+    LOG3A("@%s, useSof:%d, mLastSofSequence:%ld, appliedSeq %ld", __func__, useSof,
-+           mLastSofSequence, appliedSeq);
-+    return ((uint32_t)appliedSeq);
-+}
-+
-+void SensorManager::setSensorExposureAndGains(SensorExpGroup sensorExposures)
-+{
-+    mSensorExposureHistoryIndex++;
-+    mSensorExposureHistory[mSensorExposureHistoryIndex % kMaxExposureHistory] = sensorExposures;
-+
-+    vector<int> coarseExposures;
-+    vector<int> fineExposures;
-+    for (auto exp : sensorExposures) {
-+        coarseExposures.push_back(exp.sensorParam.coarse_integration_time);
-+        fineExposures.push_back(exp.sensorParam.fine_integration_time);
-+    }
-+    mSensorHwCtrl->setExposure(coarseExposures, fineExposures);
-+
-+    int64_t index = mSensorExposureHistoryIndex % kMaxExposureHistory;
-+
-+    // If exposure and gain lag are different, gain setting need to be postponed.
-+    if (mGainDelay > 0 && mSensorExposureHistoryIndex >= mGainDelay) {
-+        index = (mSensorExposureHistoryIndex - mGainDelay) % kMaxExposureHistory;
-+    }
-+
-+    setSensorGains(index);
-+}
-+
-+void SensorManager::setSensorGains(int index)
-+{
-+    vector<int> analogGains;
-+    vector<int> digitalGains;
-+    for (auto exp : mSensorExposureHistory[index]) {
-+        analogGains.push_back(exp.sensorParam.analog_gain_code_global);
-+
-+        int digitalGain = exp.sensorParam.digital_gain_global;
-+        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
-+            digitalGain = PlatformData::getSensorDigitalGain(mCameraId, exp.realDigitalGain);
-+        }
-+        digitalGains.push_back(digitalGain);
-+    }
-+
-+    mSensorHwCtrl->setGains(analogGains, digitalGains);
-+}
-+
-+int SensorManager::setFrameDuration(int lineLengthPixels, int frameLengthLines)
-+{
-+    return mSensorHwCtrl->setFrameDuration(lineLengthPixels, frameLengthLines);
-+}
-+
-+int SensorManager::setFrameRate(float fps)
-+{
-+    return mSensorHwCtrl->setFrameRate(fps);
-+}
-+
-+int SensorManager::getSensorInfo(ia_aiq_frame_params &frameParams,
-+                                 ia_aiq_exposure_sensor_descriptor &sensorDescriptor)
-+{
-+    LOG3A("@%s", __func__);
-+    SensorFrameParams sensorFrameParams;
-+    CLEAR(sensorFrameParams);
-+
-+    int ret = PlatformData::calculateFrameParams(mCameraId, sensorFrameParams);
-+    if (ret == OK) {
-+        AiqUtils::convertToAiqFrameParam(sensorFrameParams, frameParams);
-+    }
-+
-+    if (!PlatformData::isIsysEnabled(mCameraId)) {
-+        vector <camera_resolution_t> res;
-+        PlatformData::getSupportedISysSizes(mCameraId, res);
-+
-+        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
-+        // In none-ISYS cases, only take 30 fps into account.
-+        int fps = 30;
-+        float freq = res[0].width * res[0].height * fps / 1000000;
-+        sensorDescriptor = {freq, static_cast<unsigned short>(res[0].width),
-+                            static_cast<unsigned short>(res[0].height), 24, 0,
-+                            static_cast<unsigned short>(res[0].width), 6, 0};
-+        LOG3A("freq %f, width %d, height %d", freq, res[0].width, res[0].height);
-+        return OK;
-+    }
-+
-+    ret |= getSensorModeData(sensorDescriptor);
-+
-+    LOG3A("ia_aiq_frame_params=[%d, %d, %d, %d, %d, %d, %d, %d]",
-+        frameParams.horizontal_crop_offset,
-+        frameParams.vertical_crop_offset,
-+        frameParams.cropped_image_height,
-+        frameParams.cropped_image_width,
-+        frameParams.horizontal_scaling_numerator,
-+        frameParams.horizontal_scaling_denominator,
-+        frameParams.vertical_scaling_numerator,
-+        frameParams.vertical_scaling_denominator);
-+
-+    LOG3A("ia_aiq_exposure_sensor_descriptor=[%f, %d, %d, %d, %d, %d, %d, %d]",
-+        sensorDescriptor.pixel_clock_freq_mhz,
-+        sensorDescriptor.pixel_periods_per_line,
-+        sensorDescriptor.line_periods_per_field,
-+        sensorDescriptor.line_periods_vertical_blanking,
-+        sensorDescriptor.coarse_integration_time_min,
-+        sensorDescriptor.coarse_integration_time_max_margin,
-+        sensorDescriptor.fine_integration_time_min,
-+        sensorDescriptor.fine_integration_time_max_margin);
-+
-+    return ret;
-+}
-+
-+/**
-+ * get sensor mode data (sensor descriptor) from sensor driver
-+ *
-+ * \return OK if successfully.
-+ */
-+int SensorManager::getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData)
-+{
-+    int pixel = 0;
-+    int status =  mSensorHwCtrl->getPixelRate(pixel);
-+    CheckError(status != OK, status, "Failed to get pixel clock ret:%d", status);
-+    sensorData.pixel_clock_freq_mhz = (float)pixel / 1000000;
-+
-+    int width = 0, height = 0, pixelCode = 0;
-+    status = mSensorHwCtrl->getActivePixelArraySize(width, height, pixelCode);
-+    CheckError(status != OK, status, "Failed to get active pixel array size ret:%d", status);
-+
-+    int pixel_periods_per_line, line_periods_per_field;
-+    status = mSensorHwCtrl->getFrameDuration(pixel_periods_per_line, line_periods_per_field);
-+    CheckError(status != OK, status, "Failed to get frame Durations ret:%d", status);
-+
-+    sensorData.pixel_periods_per_line = CLIP(pixel_periods_per_line, USHRT_MAX, 0);
-+    sensorData.line_periods_per_field = CLIP(line_periods_per_field, USHRT_MAX, 0);
-+
-+    int coarse_int_time_min, integration_step = 0, integration_max = 0;
-+    status = mSensorHwCtrl->getExposureRange(coarse_int_time_min, integration_max, integration_step);
-+    CheckError(status != OK, status, "Failed to get Exposure Range ret:%d", status);
-+
-+    sensorData.coarse_integration_time_min = CLIP(coarse_int_time_min, USHRT_MAX, 0);
-+    sensorData.coarse_integration_time_max_margin = PlatformData::getCITMaxMargin(mCameraId);
-+
-+    // fine integration is not supported by v4l2
-+    sensorData.fine_integration_time_min = 0;
-+    sensorData.fine_integration_time_max_margin = sensorData.pixel_periods_per_line;
-+    int vblank;
-+    status = mSensorHwCtrl->getVBlank(vblank);
-+    CheckError(status != OK, status, "Failed to get vblank ret:%d", status);
-+    sensorData.line_periods_vertical_blanking = CLIP(vblank, USHRT_MAX, 0);
-+
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/SensorManager.h b/camera/hal/intel/ipu6/src/3a/SensorManager.h
-new file mode 100644
-index 000000000000..bb42a306ffd3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/SensorManager.h
-@@ -0,0 +1,111 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Thread.h"
-+
-+#include "ia_aiq.h"
-+
-+#include "CameraEvent.h"
-+#include "SensorHwCtrl.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \struct WdrModeSetting
-+ *
-+ * This struct is used to control wdr mode switching.
-+ */
-+typedef struct {
-+    long sequence;
-+    TuningMode tuningMode;
-+} WdrModeSetting;
-+
-+typedef struct {
-+    unsigned short realDigitalGain;
-+    ia_aiq_exposure_sensor_parameters sensorParam;
-+} SensorExposure;
-+
-+typedef struct {
-+    long sequence;
-+    uint64_t timestamp;
-+} SofEventInfo;
-+
-+typedef std::vector <SensorExposure> SensorExpGroup;
-+/*
-+ * \class SensorManager
-+ *
-+ * This class is used to control exposure and gain synchronization mechanism
-+ * and get some sensor info.
-+ */
-+class SensorManager : public EventListener {
-+
-+public:
-+    SensorManager(int cameraId, SensorHwCtrl *sensorHw);
-+    ~SensorManager();
-+
-+    int init();
-+    int deinit();
-+    void reset();
-+
-+    // get EventListener
-+    EventListener *getSofEventListener();
-+
-+    void handleEvent(EventData eventData);
-+    uint32_t updateSensorExposure(SensorExpGroup sensorExposures, bool useSof = true);
-+    int getSensorInfo(ia_aiq_frame_params &frameParams,
-+                      ia_aiq_exposure_sensor_descriptor &sensorDescriptor);
-+
-+    int setFrameRate(float fps);
-+    int getCurrentExposureAppliedDelay();
-+    uint64_t getSofTimestamp(long sequence);
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(SensorManager);
-+
-+    void handleSensorExposure();
-+    int getSensorModeData(ia_aiq_exposure_sensor_descriptor& sensorData);
-+    void setSensorExposureAndGains(SensorExpGroup sensorExposures);
-+    int setFrameDuration(int lineLengthPixels, int frameLengthLines);
-+    void setSensorGains(int index);
-+
-+private:
-+    static const int kMaxSensorExposures = 10;
-+    static const int kMaxExposureHistory = 5;
-+    static const int kMaxSofEventInfo = 10;
-+
-+    int mCameraId;
-+    SensorHwCtrl *mSensorHwCtrl;
-+
-+    bool    mModeSwitched;         // Whether the TuningMode get updated
-+    WdrModeSetting mWdrModeSetting;
-+
-+    bool mPerframeControl;
-+    std::vector<SensorExpGroup> mSensorExposures;
-+
-+    long mLastSofSequence;
-+
-+    // Guard for SensorManager public API.
-+    Mutex mLock;
-+
-+    int mGainDelay;
-+    SensorExpGroup mSensorExposureHistory[kMaxExposureHistory];
-+    int64_t mSensorExposureHistoryIndex;
-+
-+    std::vector<SofEventInfo> mSofEventInfo;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
-new file mode 100644
-index 000000000000..2c1b76461d9f
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
-@@ -0,0 +1,694 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Intel3AParameter"
-+
-+#include <cmath>
-+#include <climits>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "Intel3AParameter.h"
-+#include "AiqUtils.h"
-+
-+namespace icamera {
-+
-+Intel3AParameter::Intel3AParameter(int cameraId) :
-+    mCameraId(cameraId),
-+    mUseManualAwbGain(false),
-+    mWeightGridMode(WEIGHT_GRID_AUTO),
-+    mAePerTicks(1),
-+    mAwbPerTicks(1),
-+    mAfForceLock(false),
-+    mDuringAfTriggerScan(false)
-+{
-+    LOG3A("%s", __func__);
-+
-+    CLEAR(mAeParams);
-+    CLEAR(mAfParams);
-+    CLEAR(mAwbParams);
-+
-+    CLEAR(mManualGains);
-+    CLEAR(mAwbGainShift);
-+
-+    CLEAR(mSensorDescriptor);
-+    CLEAR(mExposureWindow);
-+    CLEAR(mExposureCoordinate);
-+    CLEAR(mAeFeatures);
-+    CLEAR(mAeManualLimits);
-+    CLEAR(mManualFocusParams);
-+    CLEAR(mFocusRect);
-+    CLEAR(mManualCctRange);
-+    CLEAR(mManualWhiteCoordinate);
-+
-+    CLEAR(mManualExposureTimeUs);
-+    CLEAR(mManualAnalogGain);
-+    CLEAR(mManualIso);
-+    mAfTrigger = AF_TRIGGER_IDLE;
-+    mAfMode = AF_MODE_OFF;
-+}
-+
-+Intel3AParameter::~Intel3AParameter()
-+{
-+    LOG3A("%s", __func__);
-+}
-+
-+int Intel3AParameter::init()
-+{
-+    LOG3A("%s", __func__);
-+
-+    mAeParams.sensor_descriptor = &mSensorDescriptor;
-+    mAeParams.exposure_window = &mExposureWindow;
-+    mAeParams.exposure_coordinate = &mExposureCoordinate;
-+    mAeParams.aec_features = &mAeFeatures;
-+    mAeParams.manual_limits = &mAeManualLimits;
-+
-+    mAfParams.focus_rect = &mFocusRect;
-+    mAfParams.manual_focus_parameters = &mManualFocusParams;
-+
-+    mAwbParams.manual_cct_range = &mManualCctRange;
-+    mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
-+
-+    // set default params
-+    initAeParameter();
-+    initAfParameter();
-+    initAwbParameter();
-+
-+    mUseManualAwbGain = false;
-+    mWeightGridMode = WEIGHT_GRID_AUTO;
-+    mAePerTicks = 1;
-+    mAwbPerTicks = 1;
-+
-+    mAfMode = AF_MODE_AUTO;
-+    mAfForceLock = false;
-+    mAfTrigger = AF_TRIGGER_IDLE;
-+    mDuringAfTriggerScan = false;
-+    return OK;
-+}
-+
-+void Intel3AParameter::initAeParameter()
-+{
-+    mAeParams.num_exposures = 1;
-+    mAeParams.frame_use = ia_aiq_frame_use_video;
-+    mAeParams.flash_mode = ia_aiq_flash_mode_off;
-+    mAeParams.operation_mode = ia_aiq_ae_operation_mode_automatic;
-+    mAeParams.metering_mode = ia_aiq_ae_metering_mode_evaluative;
-+    mAeParams.priority_mode = ia_aiq_ae_priority_mode_normal;
-+    mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
-+    mAeParams.ev_shift = 0.0f;
-+    mAeParams.manual_exposure_time_us = nullptr;
-+    mAeParams.manual_analog_gain = nullptr;
-+    mAeParams.manual_iso = nullptr;
-+
-+    mAeParams.exposure_window = nullptr;
-+    mAeParams.exposure_coordinate = nullptr;
-+    mAeParams.aec_features = nullptr;
-+    mAeParams.manual_convergence_time = -1;
-+    mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
-+}
-+
-+void Intel3AParameter::initAfParameter()
-+{
-+    mAfParams.frame_use = ia_aiq_frame_use_video;
-+    mAfParams.lens_position = 0;
-+    mAfParams.lens_movement_start_timestamp = 0;
-+    mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
-+    mAfParams.focus_range = ia_aiq_af_range_extended;
-+    mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
-+    mAfParams.flash_mode = ia_aiq_flash_mode_off;
-+    mAfParams.focus_rect = &mFocusRect;
-+    mAfParams.focus_rect->left = 0;
-+    mAfParams.focus_rect->top = 0;
-+    mAfParams.focus_rect->right = 0;
-+    mAfParams.focus_rect->bottom = 0;
-+    mAfParams.manual_focus_parameters = &mManualFocusParams;
-+    mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
-+    mAfParams.manual_focus_parameters->manual_focus_distance = MAX_FOCUS_DISTANCE;
-+    mAfParams.manual_focus_parameters->manual_lens_position = 0;
-+    mAfParams.trigger_new_search = false;
-+}
-+
-+void Intel3AParameter::initAwbParameter()
-+{
-+    mAwbParams.frame_use = ia_aiq_frame_use_video;
-+    mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
-+    mAwbParams.manual_convergence_time = -1;
-+
-+    mUseManualAwbGain = false;
-+    CLEAR(mManualGains);
-+    CLEAR(mAwbGainShift);
-+}
-+
-+int Intel3AParameter::setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor)
-+{
-+    LOG3A("%s", __func__);
-+
-+    mSensorDescriptor.pixel_clock_freq_mhz = descriptor.pixel_clock_freq_mhz;
-+    mSensorDescriptor.pixel_periods_per_line = descriptor.pixel_periods_per_line;
-+    mSensorDescriptor.line_periods_per_field = descriptor.line_periods_per_field;
-+    mSensorDescriptor.line_periods_vertical_blanking = descriptor.line_periods_vertical_blanking;
-+    mSensorDescriptor.fine_integration_time_min = descriptor.fine_integration_time_min;
-+    mSensorDescriptor.fine_integration_time_max_margin = descriptor.fine_integration_time_max_margin;
-+    mSensorDescriptor.coarse_integration_time_min = descriptor.coarse_integration_time_min;
-+    mSensorDescriptor.coarse_integration_time_max_margin = descriptor.coarse_integration_time_max_margin;
-+
-+    return OK;
-+}
-+
-+int Intel3AParameter::updateParameter(aiq_parameter_t param)
-+{
-+    LOG3A("%s", __func__);
-+
-+    updateAeParameter(param);
-+    updateAwbParameter(param);
-+    updateAfParameter(param);
-+
-+    return OK;
-+}
-+
-+/**
-+ * Override ae result by those settings provided by application
-+ */
-+void Intel3AParameter::updateAeResult(ia_aiq_ae_results* aeResult)
-+{
-+    CheckError(!aeResult || !aeResult->weight_grid, VOID_VALUE, "Invalid aeResult");
-+
-+}
-+
-+float Intel3AParameter::convertdBGainToISO(float sensitivityGain, int baseIso)
-+{
-+    // Convert db Gain to ISO
-+    float manualGain = pow(10, (sensitivityGain / 20));
-+    manualGain *= baseIso;
-+    return manualGain;
-+}
-+
-+void Intel3AParameter::setAeManualLimits(const aiq_parameter_t& param)
-+{
-+    mAeParams.manual_limits = &mAeManualLimits;
-+
-+    mAeManualLimits.manual_exposure_time_max = -1;
-+    mAeManualLimits.manual_exposure_time_min = -1;
-+    mAeManualLimits.manual_iso_min = -1;
-+    mAeManualLimits.manual_iso_max = -1;
-+
-+    if (param.fps > 0.01) {
-+        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.fps;
-+        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.fps;
-+    }
-+
-+    if (param.exposureTimeRange.min > 0 && param.exposureTimeRange.max >= param.exposureTimeRange.min) {
-+        camera_range_t etRange;
-+        CLEAR(etRange);
-+        if (PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange) == OK) {
-+            etRange.min = CLIP(param.exposureTimeRange.min, etRange.max, etRange.min);
-+            etRange.max = CLIP(param.exposureTimeRange.max, etRange.max, etRange.min);
-+        } else {
-+            etRange.min = param.exposureTimeRange.min;
-+            etRange.max = param.exposureTimeRange.max;
-+        }
-+        mAeManualLimits.manual_exposure_time_min = etRange.min;
-+        mAeManualLimits.manual_exposure_time_max = etRange.max;
-+    }
-+
-+    if (param.sensitivityGainRange.min >= 0
-+        && param.sensitivityGainRange.max >= param.sensitivityGainRange.min) {
-+        camera_range_t range;
-+        CLEAR(range);
-+        range.min = param.sensitivityGainRange.min;
-+        range.max = param.sensitivityGainRange.max;
-+
-+        camera_range_t gainRange;
-+        CLEAR(gainRange);
-+        if (PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange) == OK) {
-+            range.min = CLIP(range.min, gainRange.max, gainRange.min);
-+            range.max = CLIP(range.max, gainRange.max, gainRange.min);
-+        }
-+
-+        CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
-+        if (cpf) {
-+            ia_binary_data aiqData;
-+            ia_cmc_t *cmc = nullptr;
-+            int ret = cpf->getDataAndCmc(nullptr, &aiqData, nullptr,
-+                                         nullptr, param.tuningMode, &cmc);
-+            if (ret == OK) {
-+                if (cmc != nullptr && cmc->cmc_sensitivity != nullptr) {
-+                    float isoMin = convertdBGainToISO(range.min, cmc->cmc_sensitivity->base_iso);
-+                    float isoMax = convertdBGainToISO(range.max, cmc->cmc_sensitivity->base_iso);
-+                    if (isoMin <= INT_MAX && isoMax <= INT_MAX) {
-+                        mAeManualLimits.manual_iso_min = static_cast<int>(isoMin);
-+                        mAeManualLimits.manual_iso_max = static_cast<int>(isoMax);
-+                    } else {
-+                        LOGW("ISO limits out of short range, isoMin %f, isoMax %f",
-+                             isoMin, isoMax);
-+                    }
-+                }
-+            }
-+        }
-+    }
-+
-+    LOG3A("%s, manual limited ISO-[%d--%d], expo-[%d--%d], frame time-[%d--%d]", __func__,
-+          mAeManualLimits.manual_iso_min, mAeManualLimits.manual_iso_max,
-+          mAeManualLimits.manual_exposure_time_min, mAeManualLimits.manual_exposure_time_max,
-+          mAeManualLimits.manual_frame_time_us_min, mAeManualLimits.manual_frame_time_us_max);
-+}
-+
-+void Intel3AParameter::setManualExposure(const aiq_parameter_t& param)
-+{
-+    int64_t manualExpTimeUs = param.manualExpTimeUs;
-+    if (manualExpTimeUs <= 0 || param.aeDistributionPriority == DISTRIBUTION_ISO) {
-+        return;
-+    }
-+
-+    camera_range_t etRange;
-+    CLEAR(etRange);
-+    if (PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange) == OK) {
-+         manualExpTimeUs = CLIP(manualExpTimeUs, etRange.max, etRange.min);
-+    }
-+
-+    mAeParams.manual_exposure_time_us = mManualExposureTimeUs;
-+    for (unsigned int i = 0; i < mAeParams.num_exposures - 1; i++) {
-+        mAeParams.manual_exposure_time_us[i] = -1;
-+    }
-+    mAeParams.manual_exposure_time_us[mAeParams.num_exposures - 1] = manualExpTimeUs;
-+    LOG3A("%s, manual exposure %ld", __func__, manualExpTimeUs);
-+}
-+
-+void Intel3AParameter::setManualGain(const aiq_parameter_t& param)
-+{
-+    float manualGain = param.manualGain;
-+    if (manualGain < 0 || param.aeDistributionPriority == DISTRIBUTION_SHUTTER) {
-+        return;
-+    }
-+
-+    camera_range_t gainRange;
-+    CLEAR(gainRange);
-+    if (PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange) == OK) {
-+        manualGain = CLIP(manualGain, gainRange.max, gainRange.min);
-+    }
-+
-+    mAeParams.manual_analog_gain = mManualAnalogGain;
-+    // Convert db to sensor analog gain.
-+    for (unsigned int i = 0; i < mAeParams.num_exposures; i++) {
-+        mAeParams.manual_analog_gain[i] = pow(10, (manualGain / 20));
-+    }
-+    LOG3A("%s, manual gain %f, AG %f", __func__, manualGain, mManualAnalogGain[0]);
-+}
-+
-+void Intel3AParameter::updateAeParameter(const aiq_parameter_t& param)
-+{
-+    mAeParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
-+    mAeParams.num_exposures = PlatformData::getExposureNum(mCameraId,
-+                                  CameraUtils::isMultiExposureCase(param.tuningMode));
-+    setAeManualLimits(param);
-+
-+    switch(param.antibandingMode) {
-+        case ANTIBANDING_MODE_AUTO:
-+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_auto;
-+            break;
-+        case ANTIBANDING_MODE_50HZ:
-+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_50hz;
-+            break;
-+        case ANTIBANDING_MODE_60HZ:
-+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_60hz;
-+            break;
-+        case ANTIBANDING_MODE_OFF:
-+            mAeParams.flicker_reduction_mode = ia_aiq_ae_flicker_reduction_off;
-+            break;
-+    }
-+
-+    switch (param.aeDistributionPriority) {
-+        case DISTRIBUTION_AUTO:
-+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
-+            break;
-+        case DISTRIBUTION_SHUTTER:
-+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_shutter;
-+            break;
-+        case DISTRIBUTION_ISO:
-+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_iso;
-+            break;
-+        case DISTRIBUTION_APERTURE:
-+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_aperture;
-+            break;
-+        default:
-+            mAeParams.exposure_distribution_priority = ia_aiq_ae_exposure_distribution_auto;
-+            break;
-+    }
-+
-+    mAeParams.manual_exposure_time_us = nullptr;
-+    mAeParams.manual_analog_gain = nullptr;
-+
-+    if (param.aeMode == AE_MODE_MANUAL) {
-+        setManualGain(param);
-+        setManualExposure(param);
-+    }
-+
-+    mAeParams.ev_shift = param.evShift;
-+
-+    if (param.aeConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
-+        mAePerTicks = 1;
-+
-+        mAeParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.aeConvergeSpeed);
-+    } else {
-+        mAeParams.manual_convergence_time = -1;
-+
-+        /*
-+         * The unit of mAePerTicks is frame count, 3 means 3 frames.
-+         * The default value can be changed based on customer requirement.
-+         */
-+        switch (param.aeConvergeSpeed) {
-+            case CONVERGE_MID:
-+                mAePerTicks = 30;
-+                break;
-+            case CONVERGE_LOW:
-+                mAePerTicks = 60;
-+                break;
-+            case CONVERGE_NORMAL:
-+            default:
-+                mAePerTicks = 1;
-+                break;
-+        }
-+    }
-+
-+    mAeParams.exposure_coordinate = nullptr;
-+    if (param.blcAreaMode == BLC_AREA_MODE_ON && !param.aeRegions.empty()) {
-+        // Current only one AE metering window is supported, so use the latest one
-+        camera_window_t window = param.aeRegions.back();
-+
-+        if (window.right > window.left && window.bottom > window.top) {
-+            camera_coordinate_t coordinate;
-+            CLEAR(coordinate);
-+            coordinate.x = window.left + (window.right - window.left) / 2;
-+            coordinate.y = window.top + (window.bottom - window.top) / 2;
-+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
-+            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
-+
-+            coordinate = AiqUtils::convertToIaCoordinate(frameCoord, coordinate);
-+            mExposureCoordinate.x = coordinate.x;
-+            mExposureCoordinate.y = coordinate.y;
-+            mAeParams.exposure_coordinate = &mExposureCoordinate;
-+            LOG3A("%s, exposure coordinate = [%d,%d], region = [%d,%d,%d,%d]", __func__,
-+                    mAeParams.exposure_coordinate->x, mAeParams.exposure_coordinate->y,
-+                    window.left, window.top, window.right, window.bottom);
-+        }
-+    }
-+}
-+
-+/**
-+ * Override awb result by AWB gains or gain shift provided by application
-+ */
-+void Intel3AParameter::updateAwbResult(ia_aiq_awb_results* awbResult)
-+{
-+    CheckError((awbResult == nullptr), VOID_VALUE, "No Awb result provided.");
-+
-+    camera_awb_gains_t& gains = mUseManualAwbGain ? mManualGains : mAwbGainShift;
-+    float normalizedR = AiqUtils::normalizeAwbGain(gains.r_gain);
-+    float normalizedG = AiqUtils::normalizeAwbGain(gains.g_gain);
-+    float normalizedB = AiqUtils::normalizeAwbGain(gains.b_gain);
-+
-+    const float MAX_PER_G = AWB_GAIN_NORMALIZED_START / AWB_GAIN_NORMALIZED_END;
-+    const float MIN_PER_G = 1.0 / MAX_PER_G;
-+
-+    if (mUseManualAwbGain) {
-+        awbResult->accurate_b_per_g = CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
-+        awbResult->accurate_r_per_g = CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
-+    } else {
-+        awbResult->accurate_b_per_g *= CLIP((normalizedB / normalizedG), MAX_PER_G, MIN_PER_G);
-+        awbResult->accurate_r_per_g *= CLIP((normalizedR / normalizedG), MAX_PER_G, MIN_PER_G);
-+    }
-+
-+    //Only override final results when manual gain or gain shift applied.
-+    if (mUseManualAwbGain || gains.r_gain != 0 || gains.g_gain != 0
-+        || gains.b_gain != 0) {
-+        LOG3A("%s: override final awb results", __func__);
-+        awbResult->final_b_per_g = awbResult->accurate_b_per_g;
-+        awbResult->final_r_per_g = awbResult->accurate_r_per_g;
-+    }
-+
-+    LOG3A("%s (r,g,b): (%d,%d,%d) -> (b/g, r/g): (%f,%f)",
-+          mUseManualAwbGain ? "Manual gain" : "Gain shift",
-+          gains.r_gain, gains.g_gain, gains.b_gain,
-+          awbResult->accurate_b_per_g, awbResult->accurate_r_per_g);
-+}
-+
-+void Intel3AParameter::updateAwbParameter(const aiq_parameter_t& param)
-+{
-+    mAwbParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
-+
-+    switch (param.awbMode) {
-+        case AWB_MODE_INCANDESCENT:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_incandescent;
-+            break;
-+
-+        case AWB_MODE_FLUORESCENT:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fluorescent;
-+            break;
-+
-+        case AWB_MODE_DAYLIGHT:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_daylight;
-+            break;
-+
-+        case AWB_MODE_FULL_OVERCAST:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_fully_overcast;
-+            break;
-+
-+        case AWB_MODE_PARTLY_OVERCAST:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_partly_overcast;
-+            break;
-+
-+        case AWB_MODE_SUNSET:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_sunset;
-+            break;
-+
-+        case AWB_MODE_VIDEO_CONFERENCE:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_video_conference;
-+            break;
-+
-+        case AWB_MODE_MANUAL_CCT_RANGE:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_cct_range;
-+            mManualCctRange.min_cct = std::min(param.cctRange.min, param.cctRange.max);
-+            mManualCctRange.max_cct = std::max(param.cctRange.min, param.cctRange.max);
-+            mAwbParams.manual_cct_range = &mManualCctRange;
-+            break;
-+
-+        case AWB_MODE_MANUAL_WHITE_POINT:
-+        {
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_manual_white;
-+            mAwbParams.manual_white_coordinate = &mManualWhiteCoordinate;
-+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
-+            LOG3A("%s: frame resolution %dx%d", __func__, param.resolution.width, param.resolution.height);
-+            camera_coordinate_t iaCoord = AiqUtils::convertToIaCoordinate(frameCoord, param.whitePoint);
-+
-+            mManualWhiteCoordinate.x = iaCoord.x;
-+            mManualWhiteCoordinate.y = iaCoord.y;
-+            break;
-+        }
-+        case AWB_MODE_MANUAL_GAIN:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
-+            mManualGains = param.awbManualGain;
-+            break;
-+
-+        default:
-+            mAwbParams.scene_mode = ia_aiq_awb_operation_mode_auto;
-+            break;
-+    }
-+
-+    mUseManualAwbGain = (param.awbMode == AWB_MODE_MANUAL_GAIN);
-+    mAwbGainShift = param.awbGainShift;
-+
-+    if (param.awbConvergeSpeedMode == CONVERGE_SPEED_MODE_AIQ) {
-+        mAwbPerTicks = 1;
-+
-+        mAwbParams.manual_convergence_time = AiqUtils::convertSpeedModeToTime(param.awbConvergeSpeed);
-+    } else {
-+        mAwbParams.manual_convergence_time = -1;
-+
-+        /*
-+         * The unit of mAePerTicks is frame count, 3 means 3 frames.
-+         * The default value can be changed based on customer requirement.
-+         */
-+        switch (param.aeConvergeSpeed) {
-+            case CONVERGE_MID:
-+                mAwbPerTicks = 30;
-+                break;
-+            case CONVERGE_LOW:
-+                mAwbPerTicks = 60;
-+                break;
-+            case CONVERGE_NORMAL:
-+            default:
-+                mAwbPerTicks = 1;
-+                break;
-+        }
-+    }
-+}
-+
-+void Intel3AParameter::updateAfParameter(const aiq_parameter_t& param)
-+{
-+    mAfParams.lens_position = param.lensPosition;
-+    mAfParams.lens_movement_start_timestamp = param.lensMovementStartTimestamp;
-+
-+    LOG3A("%s, Focus position %d, timestamp %llu, afMode %d", __func__, param.lensPosition,
-+            param.lensMovementStartTimestamp, param.afMode);
-+
-+    // Mode
-+    if (mAfMode != param.afMode) {
-+        // Reset af parameter
-+        initAfParameter();
-+
-+        mAfMode = param.afMode;
-+        if (mAfMode == AF_MODE_CONTINUOUS_PICTURE
-+            || mAfMode == AF_MODE_CONTINUOUS_VIDEO) {
-+            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
-+        }
-+        mAfTrigger = AF_TRIGGER_IDLE;
-+        mAfForceLock = false;
-+        mDuringAfTriggerScan = false;
-+    }
-+    mAfParams.frame_use = AiqUtils::convertFrameUsageToIaFrameUsage(param.frameUsage);
-+
-+    // Trigger
-+    mAfParams.trigger_new_search = false;
-+    if (mAfTrigger != AF_TRIGGER_START && param.afTrigger == AF_TRIGGER_START) {
-+        LOG3A("%s: Trigger AF scan, mode %d", __func__, mAfMode);
-+        updateAfParameterForAfTriggerStart();
-+    } else if (mAfTrigger != AF_TRIGGER_CANCEL && param.afTrigger == AF_TRIGGER_CANCEL) {
-+        LOG3A("%s: Cancel AF scan, mode %d", __func__, mAfMode);
-+        updateAfParameterForAfTriggerCancel();
-+    }
-+    mAfTrigger = param.afTrigger;
-+
-+    // Region
-+    mAfParams.focus_rect = nullptr;
-+    if (!param.afRegions.empty()) {
-+        // Current only one AF metering window is supported, so use the latest one
-+        camera_window_t window = param.afRegions.back();
-+        if (window.right > window.left && window.bottom > window.top) {
-+            camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, param.resolution.height};
-+            window = AiqUtils::convertToIaWindow(frameCoord, window);
-+            mFocusRect.left   = window.left;
-+            mFocusRect.top    = window.top;
-+            mFocusRect.right  = window.right;
-+            mFocusRect.bottom = window.bottom;
-+            mAfParams.focus_rect = &mFocusRect;
-+            LOG3A("%s, af region = [%d,%d, %d, %d], window = [%d,%d,%d,%d]", __func__,
-+                    mFocusRect.left, mFocusRect.top, mFocusRect.right, mFocusRect.bottom,
-+                    window.left, window.top, window.right, window.bottom);
-+        }
-+    }
-+
-+    // Manual lens position
-+    if (mAfMode == AF_MODE_OFF) {
-+        mAfParams.manual_focus_parameters = &mManualFocusParams;
-+        mAfParams.focus_mode = ia_aiq_af_operation_mode_manual;
-+        mAfParams.focus_range = ia_aiq_af_range_extended;
-+        mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_auto;
-+
-+        // Set AIQ manual action to 'none' by default
-+        mAfParams.manual_focus_parameters->manual_focus_action = ia_aiq_manual_focus_action_none;
-+
-+        // The focusDistance value from app is diopters, so the focusInMm = 1 / focusDistance
-+        // Clamp focus distance between [0.0, minFocusDistance].
-+        float focusDistance = param.focusDistance;
-+        if (focusDistance > param.minFocusDistance) {
-+            focusDistance = param.minFocusDistance;
-+        } else if (focusDistance < 0.0f) {
-+            focusDistance = 0.0f;
-+        }
-+
-+        unsigned focusInMm = 0;
-+        if (focusDistance != 0.0f) {
-+            focusInMm = 1000 * (1.0f / focusDistance);
-+            mAfParams.manual_focus_parameters->manual_focus_action =
-+                ia_aiq_manual_focus_action_set_distance;
-+        } else {
-+            // 0.0f focus distance means infinity
-+            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
-+        }
-+
-+        mAfParams.manual_focus_parameters->manual_focus_distance = focusInMm;
-+    } else {
-+        mAfParams.manual_focus_parameters = nullptr;
-+    }
-+
-+    LOG3A("%s, afForceLock %d, duringAfTriggerScan %d", __func__, mAfForceLock, mDuringAfTriggerScan);
-+}
-+
-+void Intel3AParameter::updateAfParameterForAfTriggerStart()
-+{
-+    mDuringAfTriggerScan = true;
-+    mAfForceLock = false;
-+
-+    switch (mAfMode) {
-+        case AF_MODE_AUTO:
-+        case AF_MODE_MACRO:
-+            // Start user af scan in this frame.
-+            mAfParams.frame_use = ia_aiq_frame_use_still;
-+            mAfParams.focus_mode = ia_aiq_af_operation_mode_auto;
-+            mAfParams.trigger_new_search = true;
-+            break;
-+        case AF_MODE_CONTINUOUS_VIDEO:
-+            // Lock AF immediately
-+            mAfForceLock = true;
-+            break;
-+        case AF_MODE_CONTINUOUS_PICTURE:
-+            // Continue the current scan and check the af result later
-+            break;
-+        default:
-+            break;
-+    }
-+}
-+
-+void Intel3AParameter::updateAfParameterForAfTriggerCancel()
-+{
-+    mDuringAfTriggerScan = false;
-+    mAfForceLock = false;
-+
-+    switch (mAfMode) {
-+        case AF_MODE_AUTO:
-+        case AF_MODE_MACRO:
-+            // Stop AF scan triggered by user.
-+            mAfParams.focus_mode = ia_aiq_af_operation_mode_infinity;
-+            break;
-+        default:
-+            break;
-+    }
-+}
-+
-+void Intel3AParameter::fillAfTriggerResult(ia_aiq_af_results *afResults)
-+{
-+    if (!afResults || !mAfForceLock) {
-+        return;
-+    }
-+
-+    // Check the result of autofocus triggered by user
-+    switch (mAfMode) {
-+        case AF_MODE_CONTINUOUS_PICTURE:
-+        case AF_MODE_AUTO:
-+        case AF_MODE_MACRO:
-+            // Lock AF after current scan
-+            mAfForceLock = (afResults->status != ia_aiq_af_status_local_search
-+                          && afResults->status != ia_aiq_af_status_extended_search);
-+            break;
-+        default:
-+            break;
-+    }
-+
-+    LOG3A("%s, %d update afForceLock %d", __func__, afResults->status, mAfForceLock);
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
-new file mode 100644
-index 000000000000..3e42003a9805
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
-@@ -0,0 +1,103 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_aiq.h"
-+
-+#include "AiqSetting.h"
-+#include "AiqUtils.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class Intel3AParameter
-+ * This class is used to prepare those parameters for
-+ * 3A running.
-+ */
-+class Intel3AParameter {
-+
-+public:
-+    Intel3AParameter(int cameraId);
-+    ~Intel3AParameter();
-+
-+    int init();
-+    int setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor);
-+    int updateParameter(aiq_parameter_t param);
-+    void updateAeResult(ia_aiq_ae_results* aeResult);
-+    void updateAwbResult(ia_aiq_awb_results* awbResult);
-+
-+    void fillAfTriggerResult(ia_aiq_af_results *afResults);
-+
-+private:
-+    void initAeParameter();
-+    void initAfParameter();
-+    void initAwbParameter();
-+
-+    void updateAeParameter(const aiq_parameter_t& param);
-+    void updateAwbParameter(const aiq_parameter_t& param);
-+    void updateAfParameter(const aiq_parameter_t& param);
-+    void updateAfParameterForAfTriggerStart();
-+    void updateAfParameterForAfTriggerCancel();
-+
-+    float convertdBGainToISO(float sensitivityGain, int baseIso);
-+    void setManualExposure(const aiq_parameter_t& param);
-+    void setManualGain(const aiq_parameter_t& param);
-+    void setAeManualLimits(const aiq_parameter_t& param);
-+public:
-+    int mCameraId;
-+    // aiq 3a parameters
-+    ia_aiq_ae_input_params  mAeParams;
-+    ia_aiq_af_input_params  mAfParams;
-+    ia_aiq_awb_input_params mAwbParams;
-+
-+    bool mUseManualAwbGain;
-+    camera_awb_gains_t mManualGains;
-+    camera_awb_gains_t mAwbGainShift;
-+    camera_weight_grid_mode_t mWeightGridMode;
-+
-+    int mAePerTicks;
-+    int mAwbPerTicks;
-+
-+    bool mAfForceLock; // Lock AF to respond autofocus action triggered by user.
-+private:
-+    static const int MAX_FOCUS_DISTANCE = 5000; // unit is mm
-+
-+    /*!< ia_aiq_ae_input_params pointer contents */
-+    ia_aiq_exposure_sensor_descriptor mSensorDescriptor;
-+    ia_rectangle mExposureWindow;
-+    ia_coordinate mExposureCoordinate;
-+    ia_aiq_ae_features mAeFeatures;
-+    ia_aiq_ae_manual_limits mAeManualLimits;
-+
-+    /*!< ia_aiq_af_input_params pointer contents */
-+    ia_aiq_manual_focus_parameters mManualFocusParams;
-+    ia_rectangle mFocusRect;
-+
-+    /*!< ia_aiq_awb_input_params pointer contents */
-+    ia_aiq_awb_manual_cct_range mManualCctRange;
-+    ia_coordinate mManualWhiteCoordinate;
-+
-+    long mManualExposureTimeUs[MAX_EXPOSURES_NUM];
-+    float mManualAnalogGain[MAX_EXPOSURES_NUM];
-+    short mManualIso[MAX_EXPOSURES_NUM];
-+
-+    camera_af_mode_t mAfMode;
-+    camera_af_trigger_t mAfTrigger;
-+    bool mDuringAfTriggerScan;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
-new file mode 100644
-index 000000000000..03fbf117fe83
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.cpp
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Intel3AResult"
-+
-+#include "Intel3AResult.h"
-+
-+#include <string.h>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "AiqUtils.h"
-+
-+namespace icamera {
-+
-+Intel3AResult::Intel3AResult()
-+{
-+    LOG3A("@%s", __func__);
-+}
-+
-+Intel3AResult::~Intel3AResult()
-+{
-+    LOG3A("@%s", __func__);
-+}
-+
-+int Intel3AResult::deepCopyAeResults(const ia_aiq_ae_results &src, ia_aiq_ae_results *dst)
-+{
-+    dumpAeResults(src);
-+    return AiqUtils::deepCopyAeResults(src, dst);
-+}
-+
-+int Intel3AResult::deepCopyAfResults(const ia_aiq_af_results &src, ia_aiq_af_results *dst)
-+{
-+    dumpAfResults(src);
-+    return AiqUtils::deepCopyAfResults(src, dst);
-+}
-+
-+int Intel3AResult::deepCopyAwbResults(const ia_aiq_awb_results &src, ia_aiq_awb_results *dst)
-+{
-+    dumpAwbResults(src);
-+    return AiqUtils::deepCopyAwbResults(src, dst);
-+}
-+
-+int Intel3AResult::dumpAeResults(const ia_aiq_ae_results &aeResult)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
-+        return OK;
-+    }
-+
-+    LOG3A("@%s", __func__);
-+
-+    if (aeResult.exposures) {
-+        for (unsigned int i = 0; i < aeResult.num_exposures; i++) {
-+            if (aeResult.exposures[i].exposure) {
-+                LOG3A(" AE exp[%d] result ag %2.1f dg %2.1f Fn %2.1f exp time %dus total %d filter[%s] iso %d", i,
-+                        aeResult.exposures[i].exposure->analog_gain,
-+                        aeResult.exposures[i].exposure->digital_gain,
-+                        aeResult.exposures[i].exposure->aperture_fn,
-+                        aeResult.exposures[i].exposure->exposure_time_us,
-+                        aeResult.exposures[i].exposure->total_target_exposure,
-+                        aeResult.exposures[i].exposure->nd_filter_enabled? "YES": "NO",
-+                        aeResult.exposures[i].exposure->iso);
-+            }
-+            if (aeResult.exposures[i].sensor_exposure) {
-+                LOG3A(" AE sensor exp[%d] result ag %d dg %d coarse: %d fine: %d llp:%d fll:%d", i,
-+                        aeResult.exposures[i].sensor_exposure->analog_gain_code_global,
-+                        aeResult.exposures[i].sensor_exposure->digital_gain_global,
-+                        aeResult.exposures[i].sensor_exposure->coarse_integration_time,
-+                        aeResult.exposures[i].sensor_exposure->fine_integration_time,
-+                        aeResult.exposures[i].sensor_exposure->line_length_pixels,
-+                        aeResult.exposures[i].sensor_exposure->frame_length_lines);
-+            }
-+            LOG3A(" AE Converged : %s", aeResult.exposures[i].converged ? "YES" : "NO");
-+        }
-+    } else {
-+        LOGE("nullptr in StatsInputParams->frame_ae_parameters->exposures");
-+    }
-+    LOG3A(" AE bracket mode = %d %s", aeResult.multiframe,
-+               aeResult.multiframe == ia_aiq_bracket_mode_ull ? "ULL" : "none-ULL");
-+
-+    if (aeResult.weight_grid && aeResult.weight_grid->width != 0 &&  aeResult.weight_grid->height != 0) {
-+        LOG3A(" AE weight grid = [%dx%d]", aeResult.weight_grid->width, aeResult.weight_grid->height);
-+        if (aeResult.weight_grid->weights) {
-+            for (int i = 0; i < 5 && i < aeResult.weight_grid->height; i++) {
-+                LOG3A(" AE weight_grid[%d] = %d ", aeResult.weight_grid->width/2,
-+                        aeResult.weight_grid->weights[aeResult.weight_grid->width/2]);
-+            }
-+        }
-+    }
-+
-+    if (aeResult.aperture_control) {
-+        LOG3A(" AE aperture fn = %f, iris command = %d, code = %d", aeResult.aperture_control->aperture_fn,
-+                   aeResult.aperture_control->dc_iris_command, aeResult.aperture_control->code);
-+    }
-+
-+    return OK;
-+}
-+
-+int Intel3AResult::dumpAfResults(const ia_aiq_af_results &afResult)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
-+        return OK;
-+    }
-+
-+    LOG3A("@%s", __func__);
-+
-+    LOG3A("AF results current_focus_distance %d final_position_reached %s",
-+                afResult.current_focus_distance,
-+                afResult.final_lens_position_reached ? "TRUE":"FALSE");
-+    LOG3A("AF results driver_action %d, next_lens_position %d",
-+                afResult.lens_driver_action,
-+                afResult.next_lens_position);
-+    LOG3A("AF results use_af_assist %s",
-+          afResult.use_af_assist? "TRUE":"FALSE");
-+
-+    switch (afResult.status) {
-+    case ia_aiq_af_status_local_search:
-+        LOG3A("AF result state _local_search");
-+        break;
-+    case ia_aiq_af_status_extended_search:
-+        LOG3A("AF result state extended_search");
-+        break;
-+    case ia_aiq_af_status_success:
-+        LOG3A("AF state success");
-+        break;
-+    case ia_aiq_af_status_fail:
-+        LOG3A("AF state fail");
-+        break;
-+    case ia_aiq_af_status_idle:
-+    default:
-+        LOG3A("AF state idle");
-+    }
-+
-+    return OK;
-+}
-+
-+int Intel3AResult::dumpAwbResults(const ia_aiq_awb_results &awbResult)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
-+        return OK;
-+    }
-+
-+    LOG3A("@%s", __func__);
-+
-+    LOG3A("AWB result: accurate_r/g %f, accurate_b/g %f final_r/g %f final_b/g %f",
-+            awbResult.accurate_r_per_g,
-+            awbResult.accurate_b_per_g,
-+            awbResult.final_r_per_g,
-+            awbResult.final_b_per_g);
-+    LOG3A("AWB result: cct_estimate %d, distance_from_convergence %f",
-+            awbResult.cct_estimate,
-+            awbResult.distance_from_convergence);
-+
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
-new file mode 100644
-index 000000000000..54366f2ce300
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AResult.h
-@@ -0,0 +1,45 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_aiq.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class Intel3AResult
-+ * This class is used to do result conversion and result dumping.
-+ * It is an example for third party 3A.
-+ */
-+class Intel3AResult {
-+
-+public:
-+    Intel3AResult();
-+    ~Intel3AResult();
-+
-+    int deepCopyAeResults(const ia_aiq_ae_results &src, ia_aiq_ae_results *dst);
-+    int deepCopyAfResults(const ia_aiq_af_results &src, ia_aiq_af_results *dst);
-+    int deepCopyAwbResults(const ia_aiq_awb_results &src, ia_aiq_awb_results *dst);
-+
-+private:
-+    int dumpAeResults(const ia_aiq_ae_results &aeResult);
-+    int dumpAfResults(const ia_aiq_af_results &afResult);
-+    int dumpAwbResults(const ia_aiq_awb_results &awbResult);
-+
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.cpp b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
-new file mode 100644
-index 000000000000..32c160e46074
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/BufferQueue.cpp
-@@ -0,0 +1,286 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "BufferQueue"
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "BufferQueue.h"
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+
-+BufferProducer::BufferProducer(int memType) : mMemType(memType)
-+{
-+    LOG1("@%s BufferProducer created mMemType: %d", __func__, mMemType);
-+}
-+
-+BufferQueue::BufferQueue() : mBufferProducer(nullptr),
-+                             mProcessThread(nullptr),
-+                             mThreadRunning(false)
-+{
-+    LOG1("@%s BufferQueue created", __func__);
-+}
-+
-+BufferQueue::~BufferQueue()
-+{
-+    LOG1("@%s BufferQueue destroyed", __func__);
-+}
-+
-+int BufferQueue::queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    // If it's not in mInputQueue, then it's not for this processor.
-+    if (mInputQueue.find(port) == mInputQueue.end()) {
-+        return OK;
-+    }
-+
-+    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
-+
-+    CameraBufQ &input = mInputQueue[port];
-+    bool needSignal = input.empty();
-+    input.push(camBuffer);
-+    if (needSignal) {
-+        mFrameAvailableSignal.signal();
-+    }
-+
-+    LOG2("%s Exit", __func__);
-+    return OK;
-+}
-+
-+int BufferQueue::onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    AutoMutex l(mBufferQueueLock);
-+
-+    return queueInputBuffer(port, camBuffer);
-+}
-+
-+void BufferQueue::setBufferProducer(BufferProducer *producer)
-+{
-+    LOG1("%s producer %p", __func__, producer);
-+
-+    AutoMutex l(mBufferQueueLock);
-+    mBufferProducer = producer;
-+
-+    if (producer == nullptr)
-+        return;
-+
-+    mBufferProducer->addFrameAvailableListener(this);
-+}
-+
-+void BufferQueue::addFrameAvailableListener(BufferConsumer *listener)
-+{
-+    LOG1("%s listener %p", __func__, listener);
-+    AutoMutex   l(mBufferQueueLock);
-+    bool isAlreadyAdded = false;
-+    for (auto& consumer : mBufferConsumerList) {
-+        if (consumer == listener) {
-+            isAlreadyAdded = true;
-+            break;
-+        }
-+    }
-+
-+    // If the listener has been already added, then we don't register it again.
-+    if (isAlreadyAdded) {
-+        return;
-+    }
-+    mBufferConsumerList.push_back(listener);
-+}
-+
-+void BufferQueue::removeFrameAvailableListener(BufferConsumer *listener)
-+{
-+    LOG1("%s listener %p", __func__, listener);
-+    AutoMutex   l(mBufferQueueLock);
-+
-+    for (auto it = mBufferConsumerList.begin(); it != mBufferConsumerList.end(); ++it) {
-+        if ((*it) == listener) {
-+            mBufferConsumerList.erase(it);
-+            break;
-+        }
-+    }
-+}
-+
-+int BufferQueue::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    LOG2("%s CameraBuffer %p for port:%d", __func__, camBuffer.get(), port);
-+
-+    //Enqueue buffer to internal pool
-+    AutoMutex   l(mBufferQueueLock);
-+    if (camBuffer != nullptr && camBuffer->getStreamType() == CAMERA_STREAM_INPUT) {
-+        return queueInputBuffer(port, camBuffer);
-+    }
-+
-+    if (mOutputQueue.find(port) == mOutputQueue.end()) {
-+        LOGE("Not supported port:%d", port);
-+        return BAD_VALUE;
-+    }
-+
-+    CameraBufQ &output = mOutputQueue[port];
-+    bool needSignal = output.empty();
-+    output.push(camBuffer);
-+    if (needSignal) {
-+        mOutputAvailableSignal.signal();
-+    }
-+
-+    return OK;
-+}
-+
-+void BufferQueue::clearBufferQueues()
-+{
-+    AutoMutex l(mBufferQueueLock);
-+
-+    mInputQueue.clear();
-+    for (const auto& input : mInputFrameInfo) {
-+        mInputQueue[input.first] = CameraBufQ();
-+    }
-+
-+    mOutputQueue.clear();
-+    for (const auto& output : mOutputFrameInfo) {
-+        mOutputQueue[output.first] = CameraBufQ();
-+    }
-+}
-+
-+void BufferQueue::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
-+                               const std::map<Port, stream_t>& outputInfo)
-+{
-+    mInputFrameInfo = inputInfo;
-+    mOutputFrameInfo = outputInfo;
-+
-+    clearBufferQueues();
-+}
-+
-+void BufferQueue::getFrameInfo(std::map<Port, stream_t>& inputInfo,
-+                               std::map<Port, stream_t>& outputInfo) const
-+{
-+    inputInfo = mInputFrameInfo;
-+    outputInfo = mOutputFrameInfo;
-+}
-+
-+int BufferQueue::waitFreeBuffersInQueue(ConditionLock& lock,
-+                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
-+                                        std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
-+                                        int64_t timeout)
-+{
-+    LOG2("@%s start waiting the input and output buffers", __func__);
-+
-+    if (!mThreadRunning) {
-+        LOG1("@%s: Processor is not active.", __func__);
-+        return OK;
-+    }
-+
-+    int ret = OK;
-+    timeout = (timeout ? timeout : kWaitDuration) * SLOWLY_MULTIPLIER;
-+
-+    for (auto& input: mInputQueue) {
-+        Port port = input.first;
-+        CameraBufQ &inputQueue = input.second;
-+        while (inputQueue.empty()) {
-+            LOG2("%s: wait input port %d", __func__, port);
-+            ret = mFrameAvailableSignal.waitRelative(lock, timeout);
-+
-+            // Thread was stopped during wait
-+            if (!mThreadRunning) {
-+                LOG1("@%s: Processor is not active while waiting for input buffers", __func__);
-+                return OK;
-+            }
-+
-+            if (ret == TIMED_OUT) {
-+                return ret;
-+            }
-+        }
-+        // Wake up from the buffer available
-+        cInBuffer[port] = inputQueue.front();
-+    }
-+
-+    for (auto& output: mOutputQueue) {
-+        Port port = output.first;
-+        CameraBufQ &outputQueue = output.second;
-+        while (outputQueue.empty()) {
-+            LOG2("%s: wait output port %d", __func__, port);
-+            ret = mOutputAvailableSignal.waitRelative(lock, timeout);
-+
-+            // Thread was stopped during wait
-+            if (!mThreadRunning) {
-+                LOG1("@%s: Processor is not active while waiting for output buffers.", __func__);
-+                return OK;
-+            }
-+
-+            if (ret == TIMED_OUT) {
-+                return ret;
-+            }
-+        }
-+
-+        cOutBuffer[port] = outputQueue.front();
-+    }
-+
-+    return ret;
-+}
-+
-+int BufferQueue::allocProducerBuffers(int camId, int bufNum)
-+{
-+    LOG1("%s: buffer queue size %d", __func__, bufNum);
-+
-+    mInternalBuffers.clear();
-+
-+    CheckError(!mBufferProducer, BAD_VALUE ,"@%s: Buffer Producer is nullptr", __func__);
-+
-+    for (const auto& item : mInputFrameInfo) {
-+        Port port = item.first;
-+        int srcFmt = item.second.format;
-+        int srcWidth = item.second.width;
-+        int srcHeight = item.second.height;
-+
-+        LOG1("%s fmt:%s (%dx%d)", __func__,
-+             CameraUtils::format2string(srcFmt).c_str(), srcWidth, srcHeight);
-+
-+        int32_t size = 0;
-+        bool isISYSCompression = PlatformData::getISYSCompression(camId);
-+        if (isISYSCompression)
-+            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight, false, true, true);
-+        else
-+            size = CameraUtils::getFrameSize(srcFmt, srcWidth, srcHeight);
-+        int memType = mBufferProducer->getMemoryType();
-+
-+        for (int i = 0; i < bufNum; i++) {
-+            std::shared_ptr<CameraBuffer> camBuffer;
-+            switch (memType) {
-+            case V4L2_MEMORY_USERPTR:
-+                camBuffer = CameraBuffer::create(camId, BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR,
-+                                                 size, i, srcFmt, srcWidth, srcHeight);
-+                CheckError(!camBuffer, NO_MEMORY, "Allocate producer userptr buffer failed");
-+                break;
-+
-+            case V4L2_MEMORY_MMAP:
-+                camBuffer = std::make_shared<CameraBuffer>(camId, BUFFER_USAGE_PSYS_INPUT,
-+                                                      V4L2_MEMORY_MMAP, size, i, srcFmt);
-+                CheckError(!camBuffer, NO_MEMORY, "Allocate producer mmap buffer failed");
-+                camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
-+                mBufferProducer->allocateMemory(port, camBuffer);
-+                break;
-+
-+            default:
-+                LOGE("Not supported v4l2 memory type:%d", memType);
-+                return BAD_VALUE;
-+            }
-+
-+            mInternalBuffers[port].push_back(camBuffer);
-+            mBufferProducer->qbuf(port, camBuffer);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/BufferQueue.h b/camera/hal/intel/ipu6/src/core/BufferQueue.h
-new file mode 100644
-index 000000000000..a8ab5d337688
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/BufferQueue.h
-@@ -0,0 +1,206 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <vector>
-+#include "iutils/Thread.h"
-+#include "iutils/Errors.h"
-+
-+#include "CameraEvent.h"
-+#include "CameraBuffer.h"
-+
-+/**
-+ * These are the abstract Classes for buffer communication between different class of HAL
-+ */
-+namespace icamera {
-+
-+class BufferProducer;
-+
-+/**
-+ * BufferConsumer listens on the onFrameAvailable event from the producer by
-+ * calling setBufferProducer
-+ */
-+class BufferConsumer {
-+public:
-+    virtual ~BufferConsumer() {};
-+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
-+    virtual void setBufferProducer(BufferProducer *producer) = 0;
-+};
-+
-+/**
-+ * BufferProcuder get the buffers from consumer by "qbuf".
-+ * Notfiy the consumer by calling the onFramAvaible interface of consumer.
-+ * The consumer must be registered by "addFrameAvailableListener" before getting
-+ * any buffer done notification.
-+ */
-+class BufferProducer : public EventSource {
-+public:
-+    BufferProducer(int memType = V4L2_MEMORY_USERPTR);
-+    virtual ~BufferProducer() {};
-+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
-+    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer) = 0;
-+    virtual void addFrameAvailableListener(BufferConsumer *listener) = 0;
-+    virtual void removeFrameAvailableListener(BufferConsumer *listener) = 0;
-+    int getMemoryType(void) const {return mMemType;}
-+
-+private:
-+    int mMemType;
-+};
-+
-+class BufferQueue: public BufferConsumer, public BufferProducer, public EventListener {
-+public:
-+    BufferQueue();
-+    virtual ~BufferQueue();
-+
-+    /**
-+     * \brief the notify when poll one frame buffer
-+     *
-+     * Push the CameraBuffer to InputQueue and send a signal if needed
-+     */
-+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    /**
-+     * \brief Register the BufferProducer
-+     *
-+     * Register the BufferProducer: Psys, software, or captureUnit
-+     */
-+    virtual void setBufferProducer(BufferProducer *producer);
-+
-+    /**
-+     * \brief Queue one buffer to producer
-+     *
-+     * Push this buffer to output queue
-+     */
-+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    /**
-+     * \brief allocate memory
-+     *
-+     * Not support this function in Psys and SWProcessor
-+     */
-+    virtual int allocateMemory(Port port,
-+                               const std::shared_ptr<CameraBuffer> &camBuffer) { return -1; }
-+
-+    /**
-+     * \brief Add the get frame listener
-+     */
-+    virtual void addFrameAvailableListener(BufferConsumer *listener);
-+
-+    /**
-+     * \brief Remove the get frame listener
-+     */
-+    virtual void removeFrameAvailableListener(BufferConsumer *listener);
-+
-+    /**
-+     * \brief Set all frames configuration
-+     *
-+     * Must be called before configure which needs use frame configuration.
-+     */
-+    virtual void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
-+                              const std::map<Port, stream_t>& outputInfo);
-+
-+    /*
-+     * \brief Get all frames configuration
-+     */
-+    virtual void getFrameInfo(std::map<Port, stream_t>& inputInfo,
-+                              std::map<Port, stream_t>& outputInfo) const;
-+
-+    /**
-+     * \brief Register user buffers to processor(PSys)
-+     */
-+    virtual int registerUserOutputBufs(Port port,
-+            const std::shared_ptr<CameraBuffer> &camBuffer) { return OK; }
-+
-+    /**
-+     * \brief Common Interface
-+     */
-+    virtual int start() = 0;
-+    virtual void stop() = 0;
-+    virtual int setParameters(const Parameters& param) { return OK; }
-+    virtual int getParameters(Parameters& param) { return OK; }
-+    virtual int configure(const std::vector<ConfigMode>& configModes) { return OK; }
-+
-+protected:
-+    virtual int processNewFrame() = 0;
-+
-+    /**
-+     * \brief Clear and initialize input and output buffer queues.
-+     */
-+    void clearBufferQueues();
-+    /**
-+     * \brief Wait for available input and output buffers.
-+     *
-+     * Only fetch buffer from the buffer queue, need pop buffer from
-+     * the queue after the buffer is used, and need to be protected by mBufferQueueLock.
-+     */
-+    int waitFreeBuffersInQueue(ConditionLock& lock,
-+                               std::map<Port, std::shared_ptr<CameraBuffer> > &cInBuffer,
-+                               std::map<Port, std::shared_ptr<CameraBuffer> > &cOutBuffer,
-+                               int64_t timeout = 0);
-+    /**
-+     * \brief Buffers allocation for producer
-+     */
-+    int allocProducerBuffers(int camId, int bufNum);
-+
-+protected:
-+    /**
-+     * \brief The process new frame buffer thread
-+     *
-+     * Use this thread listen to the input queue and output queue.
-+     * And do process if these two queues are not empty
-+     */
-+    class ProcessThread: public Thread {
-+        BufferQueue *mProcessor;
-+        public:
-+            ProcessThread(BufferQueue *p)
-+                : mProcessor(p) { }
-+
-+            virtual bool threadLoop() {
-+                int ret = mProcessor->processNewFrame();
-+                return (ret == 0);
-+            }
-+    };
-+    static const nsecs_t kWaitDuration = 10000000000; //10000ms
-+
-+    BufferProducer *mBufferProducer;
-+    std::vector<BufferConsumer*> mBufferConsumerList;
-+
-+    std::map<Port, stream_t> mInputFrameInfo;
-+    std::map<Port, stream_t> mOutputFrameInfo;
-+
-+    std::map<Port, CameraBufQ> mInputQueue;
-+    std::map<Port, CameraBufQ> mOutputQueue;
-+
-+    // For internal buffers allocation for producer
-+    std::map<Port, CameraBufVector> mInternalBuffers;
-+
-+    // Guard for BufferQueue public API
-+    Mutex  mBufferQueueLock;
-+    Condition mFrameAvailableSignal;
-+    Condition mOutputAvailableSignal;
-+
-+    //for the thread loop
-+    ProcessThread* mProcessThread;
-+    bool mThreadRunning;   //state of the processor. true after start and false after stop
-+
-+private:
-+    int queueInputBuffer(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
-new file mode 100644
-index 000000000000..a272944edeba
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.cpp
-@@ -0,0 +1,401 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraBuffer"
-+
-+#include <sys/mman.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <string.h>
-+#include <vector>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#include "PlatformData.h"
-+#include "CameraBuffer.h"
-+
-+namespace icamera {
-+CameraBuffer::CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format) :
-+    mNumPlanes(1),
-+    mAllocatedMemory(false),
-+    mU(nullptr),
-+    mBufferUsage(usage),
-+    mSettingSequence(-1)
-+
-+{
-+    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-+    int num_plane = 1;
-+
-+    LOG1("%s: construct CameraBuffer with cameraId:%d, usage:%d, memory:%d, size:%d, format:%d, index:%d",
-+         __func__, cameraId, usage, memory, size, format, index);
-+
-+    mU = new camera_buffer_t;
-+    CLEAR(*mU);
-+    mU->flags = BUFFER_FLAG_INTERNAL;
-+    mU->sequence = -1;
-+
-+    switch (usage) {
-+        case BUFFER_USAGE_PSYS_INPUT:
-+            //follow through
-+        case BUFFER_USAGE_PSYS_INTERNAL:
-+        case BUFFER_USAGE_GENERAL:
-+            if (PlatformData::isIsysEnabled(cameraId)
-+                && PlatformData::isCSIFrontEndCapture(cameraId)) {
-+                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-+                num_plane = CameraUtils::getNumOfPlanes(format);
-+            } else {
-+                type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-+            }
-+            break;
-+        case BUFFER_USAGE_PSYS_STATS:
-+            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-+            break;
-+        case BUFFER_USAGE_MIPI_CAPTURE:
-+        case BUFFER_USAGE_METADATA:
-+            type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-+            num_plane = CameraUtils::getNumOfPlanes(format);
-+            break;
-+        default:
-+            LOGE("Not supported Usage");
-+    }
-+
-+    CLEAR(mMmapAddrs);
-+    CLEAR(mDmaFd);
-+
-+    initBuffer(memory, type, size, index, num_plane);
-+}
-+
-+CameraBuffer::~CameraBuffer()
-+{
-+    LOG1("Free CameraBuffer");
-+
-+    freeMemory();
-+
-+    if (mU->flags & BUFFER_FLAG_INTERNAL) {
-+        delete mU;
-+    }
-+}
-+
-+void CameraBuffer::initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane)
-+{
-+    mV.SetMemory(memType);
-+    mV.SetIndex(idx);
-+
-+    mV.SetType(bufType);
-+
-+    if (!V4L2_TYPE_IS_MULTIPLANAR(bufType)) {
-+        mV.SetOffset(0, 0);
-+        mV.SetLength(size, 0);
-+        LOGE("SINGLE PLANE!");
-+    } else {
-+        mV.SetLength(num_plane, 0);
-+        mNumPlanes = num_plane;
-+        for (int i = 0; i < mNumPlanes; ++i) {
-+            mV.SetLength(size, i);
-+        }
-+    }
-+
-+    mV.SetFlags(mV.Flags() | V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN);
-+}
-+
-+//Helper function to construct a Internal CameraBuffer
-+std::shared_ptr<CameraBuffer> CameraBuffer::create(int cameraId, int usage, int memory, unsigned int size, int index,
-+                                              int srcFmt, int srcWidth, int srcHeight)
-+{
-+    std::shared_ptr<CameraBuffer> camBuffer = std::make_shared<CameraBuffer>(cameraId, usage, memory, size, index, srcFmt);
-+
-+    CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
-+
-+    camBuffer->setUserBufferInfo(srcFmt, srcWidth, srcHeight);
-+
-+    int ret = camBuffer->allocateMemory();
-+
-+    CheckError(ret != OK, nullptr, "Allocate memory failed ret %d", ret);
-+
-+    return camBuffer;
-+}
-+
-+//Internal frame Buffer
-+void CameraBuffer::setUserBufferInfo(int format, int width, int height)
-+{
-+    LOG1("%s: format:%d, width:%d, height:%d", __func__, format, width, height);
-+    mU->s.width = width;
-+    mU->s.height = height;
-+    mU->s.format = format;
-+    if (format != -1) {
-+        mU->s.stride = CameraUtils::getStride(format, width);
-+    }
-+}
-+
-+//Called when a buffer is from the application
-+void CameraBuffer::setUserBufferInfo(camera_buffer_t *ubuffer)
-+{
-+    CheckError(ubuffer == nullptr, VOID_VALUE, "%s: ubuffer is nullptr", __func__);
-+
-+    if (mU->flags & BUFFER_FLAG_INTERNAL) delete mU;
-+    mU = ubuffer;
-+
-+    LOG1("%s: ubuffer->s.MemType: %d, addr: %p, fd: %d", __func__, ubuffer->s.memType,
-+         ubuffer->addr, ubuffer->dmafd);
-+    //update the v4l2 buffer memory with user infro
-+    switch (ubuffer->s.memType) {
-+        case V4L2_MEMORY_USERPTR:
-+            setAddr(ubuffer->addr, 0);
-+            break;
-+        case V4L2_MEMORY_DMABUF:
-+            setFd(ubuffer->dmafd, 0);
-+            break;
-+        case V4L2_MEMORY_MMAP:
-+            /* do nothing */
-+            break;
-+        default:
-+            LOGE("iomode %d is not supported yet.", mV.Memory());
-+            break;
-+    }
-+
-+    if (mU->s.streamType == CAMERA_STREAM_INPUT || ubuffer->sequence >= 0) {
-+        mV.SetSequence(ubuffer->sequence);
-+        LOG2("%s, input buffer sequence %lld", __func__, ubuffer->sequence);
-+    }
-+}
-+
-+void CameraBuffer::updateV4l2Buffer(const v4l2_buffer_t& v4l2buf)
-+{
-+    mV.SetField(v4l2buf.field);
-+    mV.SetTimestamp(v4l2buf.timestamp);
-+    mV.SetSequence(v4l2buf.sequence);
-+    mV.SetRequestFd(v4l2buf.request_fd);
-+}
-+
-+/*export mmap buffer as dma_buf fd stored in mV and mU*/
-+int CameraBuffer::exportMmapDmabuf(V4L2VideoNode *vDevice)
-+{
-+    std::vector<int> fds;
-+
-+    int ret = vDevice->ExportFrame(mV.Index(), &fds);
-+
-+    CheckError(ret != OK, -1, "exportMmapDmabuf failed, ret %d", ret);
-+
-+    for (size_t i = 0; i < fds.size(); ++i) {
-+        setFd(fds[i], i);
-+    }
-+
-+    if (mU->flags & BUFFER_FLAG_DMA_EXPORT) {
-+        mU->dmafd = getFd(0);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraBuffer::allocateMemory(V4L2VideoNode* vDevice)
-+{
-+    int ret = BAD_VALUE;
-+    LOG1("%s", __func__);
-+    switch(mV.Memory()) {
-+        case V4L2_MEMORY_USERPTR:
-+            ret = allocateUserPtr();
-+            mAllocatedMemory = true;
-+            mU->addr = getAddr();
-+            break;
-+        case V4L2_MEMORY_MMAP:
-+            exportMmapDmabuf(vDevice);
-+            ret = allocateMmap(vDevice);
-+            mU->addr = getAddr();
-+            mAllocatedMemory = true;
-+            break;
-+        default:
-+            LOGE("memory type %d is incorrect for allocateMemory.", mV.Memory());
-+            return BAD_VALUE;
-+    }
-+
-+    return ret;
-+}
-+
-+int CameraBuffer::allocateUserPtr()
-+{
-+    void* buffer = nullptr;
-+    for (int i = 0; i < mNumPlanes; ++i) {
-+        int ret = posix_memalign(&buffer, getpagesize(), mV.Length(i));
-+        CheckError(ret != 0, -1, "%s, posix_memalign fails, ret:%d", __func__, ret);
-+        mV.SetUserptr(reinterpret_cast<uintptr_t>(buffer), i);
-+        mMmapAddrs[i] = buffer;
-+    }
-+    return OK;
-+}
-+
-+void CameraBuffer::freeUserPtr()
-+{
-+    for (int i = 0; i < mNumPlanes; ++i) {
-+        void* ptr = reinterpret_cast<void*>(mV.Userptr(i));
-+        mMmapAddrs[i] = nullptr;
-+        ::free(ptr);
-+        mV.SetUserptr(reinterpret_cast<uintptr_t>(nullptr), i);
-+    }
-+}
-+
-+int CameraBuffer::allocateMmap(V4L2VideoNode* dev)
-+{
-+    std::vector<void*> addrs;
-+    int ret = dev->MapMemory(mV.Index(), PROT_READ | PROT_WRITE,
-+                            MAP_SHARED, &addrs);
-+
-+    CheckError(ret != OK, -1, "allocateMmap failed, ret %d", ret);
-+
-+    for (unsigned int i = 0; i < addrs.size(); ++i) {
-+        if (addrs[i] == MAP_FAILED) {
-+            mMmapAddrs[i] = nullptr;
-+            continue ;
-+        }
-+        mMmapAddrs[i] = addrs[i];
-+    }
-+
-+    return OK;
-+}
-+
-+void* CameraBuffer::getAddr(int plane)
-+{
-+    CheckError(plane < 0 || plane >= mNumPlanes, nullptr, "Wrong plane number %d", plane);
-+
-+    switch (mV.Memory()) {
-+        case V4L2_MEMORY_MMAP:
-+            return mMmapAddrs[plane];
-+        case V4L2_MEMORY_USERPTR:
-+            return reinterpret_cast<void*>(mV.Userptr(plane));
-+        default:
-+            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
-+    }
-+    return nullptr;
-+}
-+
-+void CameraBuffer::setAddr(void *addr, int plane)
-+{
-+    CheckError(plane < 0 || plane >= mNumPlanes, VOID_VALUE,
-+               "Wrong plane number %d", plane);
-+
-+    switch (mV.Memory()) {
-+        case V4L2_MEMORY_MMAP:
-+            mMmapAddrs[plane] = addr;
-+            return;
-+        case V4L2_MEMORY_USERPTR:
-+            mV.SetUserptr(reinterpret_cast<uintptr_t>(addr), plane);
-+            mMmapAddrs[plane] = addr;
-+            return;
-+        default:
-+            LOGE("%s: Not supported memory type %u", __func__, mV.Memory());
-+    }
-+}
-+
-+void CameraBuffer::freeMmap()
-+{
-+    int ret = OK;
-+
-+    for (int i = 0; i < mNumPlanes; i++) {
-+        if (getFd(i) != -1) {
-+            ::close(getFd(i));
-+            setFd(-1, i);
-+        }
-+        if (mMmapAddrs[i]) {
-+            ret = ::munmap(mMmapAddrs[i], mV.Length(i));
-+            CheckError(ret != 0, VOID_VALUE, "failed to munmap buffer %d", i);
-+            mMmapAddrs[i] = nullptr;
-+        }
-+    }
-+}
-+
-+void* CameraBuffer::mapDmaBufferAddr(int fd, unsigned int bufferSize)
-+{
-+    if(fd < 0 || !bufferSize) {
-+        LOGE("%s, fd:0x%x, bufferSize:%u", __func__, fd, bufferSize);
-+        return nullptr;
-+    }
-+    return ::mmap(nullptr, bufferSize, PROT_READ, MAP_SHARED, fd, 0);
-+}
-+
-+void CameraBuffer::unmapDmaBufferAddr(void* addr, unsigned int bufferSize)
-+{
-+    if(addr == nullptr || !bufferSize) {
-+        LOGE("%s, addr:%p, bufferSize:%u", __func__, addr, bufferSize);
-+        return;
-+    }
-+    munmap(addr, bufferSize);
-+}
-+
-+void CameraBuffer::freeMemory()
-+{
-+    if (!mAllocatedMemory) {
-+        LOG2("@%s Memory(in %p) is not allocated by CameraBuffer class. Don't free it.", __func__, this);
-+        return ;
-+    }
-+
-+    switch(mV.Memory()) {
-+        case V4L2_MEMORY_USERPTR:
-+            freeUserPtr();
-+            break;
-+        case V4L2_MEMORY_MMAP:
-+            freeMmap();
-+            break;
-+        default:
-+            LOGE("Free camera buffer failed, due to memory %d type is not implemented yet.", mV.Memory());
-+    }
-+}
-+
-+void CameraBuffer::updateUserBuffer(void)
-+{
-+    mU->timestamp = TIMEVAL2NSECS(getTimestamp());
-+    mU->s.field = getField();
-+
-+    // Use valid setting sequence to align shutter/parameter with buffer
-+    mU->sequence = (mSettingSequence < 0) ? getSequence() : mSettingSequence;
-+}
-+
-+void CameraBuffer::updateFlags(void)
-+{
-+    int flag = V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | V4L2_BUF_FLAG_NO_CACHE_CLEAN;
-+    bool set = true;
-+
-+    //clear the flags if the buffers is accessed by the SW
-+    if ((mU->flags & BUFFER_FLAG_SW_READ) || (mU->flags & BUFFER_FLAG_SW_WRITE)) {
-+        set = false;
-+    }
-+
-+    mV.SetFlags(set ? (mV.Flags() | flag): (mV.Flags() & (~flag)));
-+}
-+
-+bool CameraBuffer::isFlagsSet(int flag)
-+{
-+    return ((mU->flags & flag) ? true : false);
-+}
-+
-+void CameraBuffer::setFd(int val, int plane)
-+{
-+    if (mV.Memory() == V4L2_MEMORY_MMAP) {
-+        mDmaFd[plane] = val;
-+    } else {
-+        mV.SetFd(val, plane);
-+    }
-+}
-+
-+int CameraBuffer::getFd(int plane)
-+{
-+    if (mV.Memory() == V4L2_MEMORY_MMAP) {
-+        return mDmaFd[plane];
-+    }
-+
-+    return mV.Fd(plane);
-+}
-+
-+}//namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/CameraBuffer.h b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
-new file mode 100644
-index 000000000000..909396f3fa25
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraBuffer.h
-@@ -0,0 +1,169 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <queue>
-+#include <vector>
-+
-+#include <linux/videodev2.h>
-+#include <v4l2_device.h>
-+
-+#include "api/Parameters.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+typedef struct v4l2_buffer v4l2_buffer_t;
-+
-+/* CameraBuffer is the core buffers for HAL. The buffer usage is described by the
-+ * BufferUsage. CameraBuffer are constructed based on usage */
-+enum BufferUsage {
-+    BUFFER_USAGE_GENERAL = 0,
-+    BUFFER_USAGE_PSYS_STATS,
-+    BUFFER_USAGE_PSYS_INPUT,
-+    BUFFER_USAGE_MIPI_CAPTURE,
-+    BUFFER_USAGE_METADATA,
-+    BUFFER_USAGE_PSYS_INTERNAL,
-+};
-+
-+class CameraBuffer {
-+public:
-+    //assist function to create frame buffers
-+    static std::shared_ptr<CameraBuffer>
-+    create(int cameraId, int usage, int memory, unsigned int size, int index,
-+           int srcFmt = -1, int srcWidth=-1, int srcHeight=-1);
-+
-+public:
-+    CameraBuffer(int cameraId, int usage, int memory, uint32_t size, int index, int format = -1);
-+    virtual ~CameraBuffer();
-+
-+public:
-+    //user buffer information
-+    int getWidth() const { return mU->s.width; }
-+    int getHeight() const { return mU->s.height; }
-+    int getStride() const { return mU->s.stride; }
-+    int getFormat() const { return mU->s.format; }
-+    int getStreamType() const { return mU->s.streamType; }
-+    int getStreamUsage() const { return mU->s.usage; }
-+    int getStreamId() const { return mU->s.id; }
-+    int getFlags() const { return mU->flags; }
-+
-+    //v4l2 buffer information
-+    uint32_t getIndex(void) const { return mV.Index(); }
-+
-+    uint32_t getSequence(void) const { return mV.Sequence(); }
-+    void setSequence(uint32_t sequence) { mV.SetSequence(sequence); }
-+
-+    uint32_t getField() const { return mV.Field(); }
-+    void setField(uint32_t field) { mV.SetField(field); }
-+
-+    struct timeval getTimestamp(void) const  { return mV.Timestamp(); }
-+    void setTimestamp(struct timeval timestamp) { mV.SetTimestamp(timestamp); }
-+
-+    int getFd(int planeIndex = 0);
-+
-+    uint32_t getMemory(void) const { return mV.Memory(); }
-+
-+    int numPlanes() { return mNumPlanes; }
-+
-+     //For debug only v4l2 buffer information
-+    int getCsi2Port(void) const { return (mV.RequestFd() >> 4) & 0xf; }
-+    int getVirtualChannel(void) const { return mV.RequestFd() & 0xf; }
-+
-+    /* u buffer is used to attach user private structure pointer
-+     * in CameraBuffer.
-+     *
-+     * Now, one of this usage is linking camera_buffer_t to CameraBuffer
-+     * together, so that we can get each pointer by other.
-+     * Notes: Please don't abuse this. It is only used in CameraDevice for user buffer
-+     */
-+    camera_buffer_t *getUserBuffer() { return mU; }
-+    //update the user  buffer with latest v4l2 buffer info from driver
-+    void    updateUserBuffer(void);
-+    //Update the v4l2 flags according to user buffer flag
-+    void    UpdateFlags(void);
-+    void    updateFlags(void);
-+
-+    //Check if the specific flag in "mU->flags" is set or not
-+    bool isFlagsSet(int flag);
-+    //The ubuffer is from application
-+    void setUserBufferInfo(camera_buffer_t *ubuffer);
-+    void setUserBufferInfo(int format, int width, int height);
-+
-+    uint32_t getBufferSize(int planeIndex = 0) { return mV.Length(planeIndex); }
-+    void setBufferSize(unsigned int size, int planeIndex = 0) { mV.SetLength(size, planeIndex); }
-+
-+    unsigned int getBytesused(int planeIndex = 0) { return mV.BytesUsed(planeIndex); }
-+    void setBytesused(unsigned int bytes, int planeIndex = 0) { mV.SetBytesUsed(bytes, planeIndex); }
-+
-+    void* getBufferAddr(int planeIndex = 0) { return getAddr(planeIndex); }
-+    void  setBufferAddr(void *addr, int planeIndex = 0) { return setAddr(addr, planeIndex); }
-+
-+    void updateV4l2Buffer(const v4l2_buffer_t& v4l2buf);
-+
-+    V4L2Buffer& getV4L2Buffer() { return mV; }
-+
-+    int getUsage() const { return mBufferUsage; }
-+
-+    void setSettingSequence(long sequence) { mSettingSequence = sequence; }
-+    long getSettingSequence() const { return mSettingSequence; }
-+
-+    //Buffers are allocated the buffers by Camera
-+    int allocateMemory(V4L2VideoNode *vDevice = nullptr);
-+
-+public:
-+    static void* mapDmaBufferAddr(int fd, unsigned int bufferSize);
-+    static void unmapDmaBufferAddr(void* addr, unsigned int bufferSize);
-+
-+private:
-+    CameraBuffer(const CameraBuffer&);
-+    CameraBuffer& operator=(const CameraBuffer&);
-+
-+    void freeMemory();
-+    int exportMmapDmabuf(V4L2VideoNode *vDevice);
-+
-+    int allocateMmap(V4L2VideoNode* dev);
-+    int allocateUserPtr();
-+    void freeUserPtr();
-+    void freeMmap();
-+    void* getAddr(int plane = 0);
-+    void setAddr(void *userAddr, int plane = 0);
-+    void initBuffer(int memType, v4l2_buf_type bufType, uint32_t size, int idx, int num_plane);
-+
-+    void setFd(int val, int plane);
-+
-+protected:
-+    V4L2Buffer mV;
-+    int mNumPlanes;
-+
-+private:
-+    //To tag whether the memory is allocated by CameraBuffer class. We need to free them
-+    bool mAllocatedMemory;
-+
-+    camera_buffer_t *mU;
-+    int mBufferUsage;
-+    long mSettingSequence;
-+
-+    void* mMmapAddrs[VIDEO_MAX_PLANES];
-+    int mDmaFd[VIDEO_MAX_PLANES];
-+};
-+
-+typedef std::vector<std::shared_ptr<CameraBuffer> > CameraBufVector;
-+typedef std::queue<std::shared_ptr<CameraBuffer> > CameraBufQ;
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.cpp b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
-new file mode 100644
-index 000000000000..ca12298576b3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
-@@ -0,0 +1,1162 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraDevice"
-+
-+#include <vector>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "IGraphConfig.h"
-+#include "ICamera.h"
-+#include "PlatformData.h"
-+#include "CameraDevice.h"
-+#include "V4l2DeviceFactory.h"
-+#include "I3AControlFactory.h"
-+#include "CaptureUnit.h"
-+
-+using std::vector;
-+
-+namespace icamera {
-+
-+CameraDevice::CameraDevice(int cameraId) :
-+    mState(DEVICE_UNINIT),
-+    mCameraId(cameraId),
-+    mStreamNum(0),
-+    mCallback(nullptr)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
-+
-+    CLEAR(mStreams);
-+
-+    V4l2DeviceFactory::createDeviceFactory(mCameraId);
-+    CLEAR(mInputConfig);
-+    mInputConfig.format = -1;
-+
-+    mProducer = createBufferProducer();
-+
-+    mSofSource = new SofSource(mCameraId);
-+
-+    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
-+    LOG2("%s: support perframe %d", __func__, mPerframeControlSupport);
-+    mParamGenerator = new ParameterGenerator(mCameraId);
-+
-+    mLensCtrl = new LensHw(mCameraId);
-+    mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
-+
-+    m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
-+    mRequestThread = new RequestThread(mCameraId, m3AControl, mParamGenerator);
-+    mRequestThread->registerListener(EVENT_PROCESS_REQUEST, this);
-+    mRequestThread->registerListener(EVENT_DEVICE_RECONFIGURE, this);
-+
-+    mProcessorManager = new ProcessorManager(mCameraId);
-+
-+    if (PlatformData::getGraphConfigNodes(mCameraId)) {
-+        mGCM = IGraphConfigManager::getInstance(mCameraId);
-+    } else {
-+        mGCM = nullptr;
-+    }
-+}
-+
-+CameraDevice::~CameraDevice()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+    AutoMutex   m(mDeviceLock);
-+
-+    // Clear the media control when close the device.
-+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
-+    if (mc) {
-+        MediaControl::getInstance()->mediaCtlClear(mCameraId, mc);
-+    }
-+
-+    mRequestThread->removeListener(EVENT_PROCESS_REQUEST, this);
-+    mRequestThread->removeListener(EVENT_DEVICE_RECONFIGURE, this);
-+
-+    delete mProcessorManager;
-+
-+    for (int i = 0; i < MAX_STREAM_NUMBER; i++)
-+        delete mStreams[i];
-+
-+    delete mLensCtrl;
-+    delete m3AControl;
-+    delete mSensorCtrl;
-+    delete mParamGenerator;
-+    delete mSofSource;
-+    delete mProducer;
-+    delete mRequestThread;
-+
-+    V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
-+    IGraphConfigManager::releaseInstance(mCameraId);
-+}
-+
-+int CameraDevice::init()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
-+    AutoMutex   m(mDeviceLock);
-+
-+    int ret = mProducer->init();
-+    CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
-+
-+    ret = mSofSource->init();
-+    CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
-+
-+    initDefaultParameters();
-+
-+    ret = m3AControl->init();
-+    CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
-+
-+    ret = mLensCtrl->init();
-+    CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
-+
-+    mRequestThread->run("RequestThread", PRIORITY_NORMAL);
-+
-+    mState = DEVICE_INIT;
-+    return ret;
-+}
-+
-+void CameraDevice::deinit()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
-+    AutoMutex   m(mDeviceLock);
-+
-+    //deinit should not be call in UNINIT or START STATE
-+    if (mState == DEVICE_UNINIT) {
-+        //Do nothing
-+        return;
-+    }
-+
-+    m3AControl->stop();
-+
-+    if (mState == DEVICE_START) {
-+        //stop first
-+        stopLocked();
-+    }
-+
-+    deleteStreams();
-+
-+    mProcessorManager->deleteProcessors();
-+
-+    m3AControl->deinit();
-+
-+    mSofSource->deinit();
-+
-+    mProducer->deinit();
-+
-+    mRequestThread->requestExit();
-+    mRequestThread->join();
-+
-+    mState = DEVICE_UNINIT;
-+}
-+
-+void CameraDevice::callbackRegister(const camera_callback_ops_t* callback)
-+{
-+    mCallback = const_cast<camera_callback_ops_t*>(callback);
-+}
-+
-+StreamSource* CameraDevice::createBufferProducer()
-+{
-+
-+    return new CaptureUnit(mCameraId);
-+}
-+
-+void CameraDevice::bindListeners()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
-+    for (auto statsListener : statsListenerList) {
-+
-+        for (auto& item : mProcessors) {
-+            // Subscribe PSys statistics.
-+            item->registerListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
-+            item->registerListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
-+
-+                item->registerListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
-+        }
-+    }
-+
-+    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
-+    for (auto sofListener : sofListenerList) {
-+        mSofSource->registerListener(EVENT_ISYS_SOF, sofListener);
-+    }
-+
-+    if (PlatformData::psysAlignWithSof(mCameraId)) {
-+        for (auto& item : mProcessors) {
-+            mSofSource->registerListener(EVENT_ISYS_SOF, item);
-+        }
-+    }
-+
-+    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
-+        mProcessors.back()->registerListener(EVENT_PSYS_FRAME, mRequestThread);
-+    } else {
-+        mProducer->registerListener(EVENT_ISYS_FRAME, mRequestThread);
-+    }
-+
-+    if (!mProcessors.empty()) {
-+        mProcessors.front()->registerListener(EVENT_PSYS_REQUEST_BUF_READY, this);
-+    }
-+}
-+
-+void CameraDevice::unbindListeners()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    vector<EventListener*> statsListenerList = m3AControl->getStatsEventListener();
-+    for (auto statsListener : statsListenerList) {
-+
-+        for (auto& item : mProcessors) {
-+            item->removeListener(EVENT_PSYS_STATS_BUF_READY, statsListener);
-+            item->removeListener(EVENT_PSYS_STATS_SIS_BUF_READY, statsListener);
-+
-+                 item->removeListener(EVENT_PSYS_STATS_BUF_READY, mRequestThread);
-+        }
-+    }
-+
-+    vector<EventListener*> sofListenerList = m3AControl->getSofEventListener();
-+    for (auto sofListener : sofListenerList) {
-+        mSofSource->removeListener(EVENT_ISYS_SOF, sofListener);
-+    }
-+
-+    if (!mProcessors.empty()) {
-+        mProcessors.front()->removeListener(EVENT_PSYS_REQUEST_BUF_READY, this);
-+    }
-+
-+    if (mPerframeControlSupport || !PlatformData::isIsysEnabled(mCameraId)) {
-+        mProcessors.back()->removeListener(EVENT_PSYS_FRAME, mRequestThread);
-+    } else {
-+        mProducer->removeListener(EVENT_ISYS_FRAME, mRequestThread);
-+    }
-+}
-+
-+int CameraDevice::configureInput(const stream_t *inputConfig)
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    AutoMutex lock(mDeviceLock);
-+    mInputConfig = *inputConfig;
-+
-+    return OK;
-+}
-+
-+int CameraDevice::configure(stream_config_t *streamList)
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    int numOfStreams = streamList->num_streams;
-+    CheckError(!streamList->streams, BAD_VALUE, "%s: No valid stream config", __func__);
-+    CheckError(numOfStreams > MAX_STREAM_NUMBER || numOfStreams <= 0, BAD_VALUE,
-+          "%s: The requested stream number(%d) is invalid. Should be between [1-%d]",
-+          __func__, numOfStreams, MAX_STREAM_NUMBER);
-+
-+    AutoMutex lock(mDeviceLock);
-+
-+    CheckError((mState != DEVICE_STOP) && (mState != DEVICE_INIT), INVALID_OPERATION,
-+          "%s: Add streams in wrong state %d", __func__, mState);
-+
-+    mRequestThread->configure(streamList);
-+
-+    // Use concrete ISP mode from request thread for full and auto switch
-+    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
-+        (ConfigMode)(streamList->operation_mode) == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
-+        stream_config_t requestStreamList = mRequestThread->getStreamConfig();
-+        LOG2("%s: for full and auto switch, use concrete config mode %u from request thread.",
-+             __func__, requestStreamList.operation_mode);
-+        return configureL(&requestStreamList);
-+    }
-+
-+    return configureL(streamList);
-+}
-+
-+int CameraDevice::configureL(stream_config_t *streamList, bool clean)
-+{
-+    LOG1("@%s, mCameraId:%d, operation_mode %x", __func__, mCameraId, (ConfigMode)streamList->operation_mode);
-+
-+    int ret = analyzeStream(streamList);
-+    CheckError(ret != OK, ret, "@%s, analyzeStream failed", __func__);
-+
-+    // If configured before, destroy current streams first.
-+    if (mStreamNum > 0 && clean) {
-+        deleteStreams();
-+    }
-+    mProcessorManager->deleteProcessors();
-+
-+    // Clear all previous added listeners.
-+    mProducer->removeAllFrameAvailableListener();
-+    if (clean) {
-+        ret = createStreams(streamList);
-+        CheckError(ret < 0, ret, "@%s create stream failed with %d", __func__, ret);
-+    }
-+
-+    int mcId = -1;
-+    if (mGCM != nullptr) {
-+        ret = mGCM->configStreams(streamList);
-+        CheckError(ret != OK, INVALID_OPERATION, "No matching graph config found");
-+
-+        mcId = mGCM->getSelectedMcId();
-+    }
-+
-+    std::map<Port, stream_t> producerConfigs = selectProducerConfig(streamList, mcId);
-+    CheckError(producerConfigs.empty(), BAD_VALUE, "The config for producer is invalid.");
-+
-+    bool needProcessor = isProcessorNeeded(streamList, producerConfigs[MAIN_PORT]);
-+    for (auto& item : producerConfigs) {
-+        LOG1("Producer config for port:%d, fmt:%s (%dx%d), needProcessor=%d", item.first,
-+             CameraUtils::format2string(item.second.format).c_str(),
-+             item.second.width, item.second.height, needProcessor);
-+        // Only V4L2_MEMORY_MMAP is supported when using post processor
-+        if (needProcessor) {
-+            item.second.memType = V4L2_MEMORY_MMAP;
-+        }
-+    }
-+
-+    vector<ConfigMode> configModes;
-+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
-+
-+    int bufferNum = MAX_BUFFER_COUNT;
-+    const stream_t& tmp = streamList->streams[mSortedStreamIds.back()];
-+    if (tmp.usage == CAMERA_STREAM_OPAQUE_RAW) {
-+        bufferNum = PlatformData::getMaxRawDataNum(mCameraId);
-+    }
-+    ret = mProducer->configure(producerConfigs, configModes, bufferNum);
-+    CheckError(ret < 0, BAD_VALUE, "@%s Device Configure failed", __func__);
-+
-+    ret = mSofSource->configure();
-+    CheckError(ret != OK, ret, "@%s failed to configure SOF source device", __func__);
-+
-+    m3AControl->configure(streamList);
-+
-+    if (needProcessor) {
-+        mProcessors = mProcessorManager->createProcessors(mInputConfig.format, producerConfigs,
-+                                                          mStreamIdToPortMap,
-+                                                          streamList, mParameter, mParamGenerator);
-+        ret = mProcessorManager->configureProcessors(configModes,
-+                                                     mProducer, mParameter);
-+        CheckError(ret != OK, ret, "@%s configure post processor failed with:%d", __func__, ret);
-+    }
-+
-+    ret = bindStreams(streamList);
-+    CheckError(ret < 0, ret, "@%s bind stream failed with %d", __func__, ret);
-+
-+    mState = DEVICE_CONFIGURE;
-+    return OK;
-+}
-+
-+/**
-+ * Select the producer's config from the supported list.
-+ *
-+ * How to decide the producer's config?
-+ * 1. The producer's config can only be one of the combination from ISYS supported format and
-+ *    resolution list.
-+ * 2. Try to use the same config as user's required.
-+ * 3. If the ISYS supported format and resolution cannot satisfy user's requirement, then use
-+ *    the closest one, and let post processor do the conversion.
-+ */
-+std::map<Port, stream_t> CameraDevice::selectProducerConfig(const stream_config_t *streamList, int mcId)
-+{
-+    // Use the biggest stream to configure the producer.
-+    stream_t biggestStream = streamList->streams[mSortedStreamIds[0]];
-+    std::map<Port, stream_t> producerConfigs;
-+
-+    if (!PlatformData::isIsysEnabled(mCameraId)) {
-+        // Input stream id is the last one of mSortedStreamIds
-+        const stream_t& tmp = streamList->streams[mSortedStreamIds.back()];
-+        if (tmp.streamType == CAMERA_STREAM_INPUT) {
-+            producerConfigs[MAIN_PORT] = tmp;
-+            return producerConfigs;
-+        }
-+    }
-+
-+    /*
-+     * According to the stream info and operation mode to select MediaCtlConf.
-+     * and isys output format. If inputFmt is given and supported, we use it as isys output format.
-+     */
-+    int inputFmt = mInputConfig.format;
-+    int iSysFmt = biggestStream.format;
-+    if (inputFmt != -1) {
-+        if (!PlatformData::isISysSupportedFormat(mCameraId, inputFmt)) {
-+            LOGE("The given ISYS format %s is unsupported.", CameraUtils::pixelCode2String(inputFmt));
-+            return producerConfigs;
-+        }
-+        iSysFmt = inputFmt;
-+    }
-+
-+    // Use CSI output to select MC config
-+    vector <ConfigMode> configModes;
-+    PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode,
-+                                             configModes);
-+    stream_t matchedStream = biggestStream;
-+    if (!configModes.empty() && mGCM != nullptr) {
-+        std::shared_ptr<IGraphConfig> gc = mGCM->getGraphConfig(configModes[0]);
-+        if (gc) {
-+            camera_resolution_t csiOutput = {0, 0};
-+            gc->getCSIOutputResolution(csiOutput);
-+            if (csiOutput.width > 0 && csiOutput.height > 0) {
-+                matchedStream.width = csiOutput.width;
-+                matchedStream.height = csiOutput.height;
-+            }
-+        }
-+    }
-+
-+    camera_crop_region_t cropRegion;
-+    int ret = mParameter.getCropRegion(cropRegion);
-+    if ((ret == OK) && (cropRegion.flag == 1)) {
-+        PlatformData::selectMcConf(mCameraId, mInputConfig,
-+                                  (ConfigMode)streamList->operation_mode, mcId);
-+    } else {
-+        PlatformData::selectMcConf(mCameraId, matchedStream,
-+                                  (ConfigMode)streamList->operation_mode, mcId);
-+    }
-+
-+    PlatformData::selectISysFormat(mCameraId, iSysFmt);
-+
-+    // Use the ISYS output if it's provided in media config section of config file.
-+    stream_t mainConfig = PlatformData::getISysOutputByPort(mCameraId, MAIN_PORT);
-+    mainConfig.memType = biggestStream.memType;
-+    mainConfig.field = biggestStream.field;
-+
-+    if (mainConfig.width != 0 && mainConfig.height != 0) {
-+        producerConfigs[MAIN_PORT] = mainConfig;
-+
-+        return producerConfigs;
-+    }
-+
-+    int inputWidth = mInputConfig.width;
-+    int inputHeight = mInputConfig.height;
-+
-+    camera_resolution_t producerRes = {inputWidth, inputHeight};
-+    if (inputWidth == 0 && inputHeight == 0) {
-+        // Only get the ISYS resolution when input config is not specified.
-+        producerRes = PlatformData::getISysBestResolution(mCameraId, biggestStream.width,
-+                                                          biggestStream.height, biggestStream.field);
-+    } else if (!PlatformData::isISysSupportedResolution(mCameraId, producerRes)) {
-+        LOGE("The stream config: (%dx%d) is not supported.", inputWidth, inputHeight);
-+        return producerConfigs;
-+    }
-+
-+    mainConfig.format = PlatformData::getISysFormat(mCameraId);
-+    mainConfig.width = producerRes.width;
-+    // Update the height according to the field.
-+    mainConfig.height = CameraUtils::getInterlaceHeight(mainConfig.field, producerRes.height);
-+
-+    // configuration with main port
-+    producerConfigs[MAIN_PORT] = mainConfig;
-+
-+    return producerConfigs;
-+}
-+
-+/**
-+ * Check if post processor is needed.
-+ * The processor is needed when:
-+ * 1. At least one of the given streams does not match with the producer's output.
-+ * 2. To support specific features such as HW weaving or dewarping.
-+ */
-+bool CameraDevice::isProcessorNeeded(const stream_config_t *streamList,
-+                                     const stream_t &producerConfig)
-+{
-+    camera_crop_region_t cropRegion;
-+    int ret = mParameter.getCropRegion(cropRegion);
-+    if ((ret == OK) && (cropRegion.flag == 1)) return true;
-+
-+    camera_fisheye_dewarping_mode_t dewarping_mode = FISHEYE_DEWARPING_OFF;
-+    mParameter.getFisheyeDewarpingMode(dewarping_mode);
-+    if (dewarping_mode > FISHEYE_DEWARPING_OFF) {
-+        return true;
-+    }
-+
-+    if (producerConfig.field != V4L2_FIELD_ANY) {
-+        camera_deinterlace_mode_t mode = DEINTERLACE_OFF;
-+        mParameter.getDeinterlaceMode(mode);
-+        if (mode == DEINTERLACE_WEAVING) {
-+            return true;
-+        }
-+    }
-+
-+    if (producerConfig.field != V4L2_FIELD_ALTERNATE) {
-+        int streamCounts = streamList->num_streams;
-+        for (int streamId = 0; streamId < streamCounts; streamId++) {
-+            if (producerConfig.width != streamList->streams[streamId].width ||
-+                producerConfig.height != streamList->streams[streamId].height ||
-+                producerConfig.format != streamList->streams[streamId].format) {
-+                return true;
-+            }
-+        }
-+    }
-+
-+    camera_mono_downscale_mode_t monoDsMode = MONO_DS_MODE_OFF;
-+    mParameter.getMonoDsMode(monoDsMode);
-+    if (monoDsMode != MONO_DS_MODE_OFF) {
-+        return true;
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * Return true only if there are both still and video stream configured.
-+ */
-+bool CameraDevice::isStillDuringVideo(const stream_config_t *streamList)
-+{
-+    bool containStill = false;
-+    bool containVideo = false;
-+    for (int streamId = 0; streamId < streamList->num_streams; streamId++) {
-+        switch (streamList->streams[streamId].usage) {
-+        case CAMERA_STREAM_PREVIEW:
-+        case CAMERA_STREAM_VIDEO_CAPTURE:
-+            containVideo = true;
-+            break;
-+        case CAMERA_STREAM_STILL_CAPTURE:
-+            containStill = true;
-+            break;
-+        default:
-+            break;
-+        }
-+    }
-+
-+    return (containStill && containVideo);
-+}
-+
-+int CameraDevice::createStreams(stream_config_t *streamList)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    int streamCounts = streamList->num_streams;
-+    for (int streamId = 0; streamId < streamCounts; streamId++) {
-+        stream_t& streamConf = streamList->streams[streamId];
-+        LOG1("@%s, stream_number:%d, stream configure: format:%s (%dx%d)", __func__, streamCounts,
-+             CameraUtils::pixelCode2String(streamConf.format), streamConf.width, streamConf.height);
-+
-+        streamConf.id = streamId;
-+        streamConf.max_buffers = PlatformData::getMaxRequestsInflight(mCameraId);
-+        CameraStream *stream = new CameraStream(mCameraId, streamId, streamConf);
-+        stream->registerListener(EVENT_FRAME_AVAILABLE, mRequestThread);
-+        mStreams[streamId] = stream;
-+        mStreamNum++;
-+
-+        LOG2("@%s: automation checkpoint: interlaced: %d", __func__, streamConf.field);
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * According resolution to store the streamId in descending order.
-+ * Use this order to bind stream to port, and set output Port mapping
-+ */
-+int CameraDevice::analyzeStream(stream_config_t *streamList)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mSortedStreamIds.clear();
-+    mStreamIdToPortMap.clear();
-+
-+    int inputStreamId = -1;
-+    int opaqueRawStreamId = -1;
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        const stream_t& stream = streamList->streams[i];
-+
-+        if (stream.streamType == CAMERA_STREAM_INPUT) {
-+            CheckError(inputStreamId >= 0, BAD_VALUE, "Don't support two input streams!");
-+            inputStreamId = i;
-+            continue;
-+        }
-+
-+        if (stream.usage == CAMERA_STREAM_OPAQUE_RAW) {
-+            CheckError(opaqueRawStreamId >= 0, BAD_VALUE, "Don't support two RAW streams!");
-+            opaqueRawStreamId = i;
-+            continue;
-+        }
-+
-+        camera_crop_region_t cropRegion;
-+        int ret = mParameter.getCropRegion(cropRegion);
-+        if (ret != OK || cropRegion.flag == 0) {
-+            bool valid = PlatformData::isSupportedStream(mCameraId, stream);
-+            CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
-+                       CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
-+        }
-+
-+        bool saved = false;
-+        // Store the streamId in descending order.
-+        for (size_t j = 0; j < mSortedStreamIds.size(); j++) {
-+            const stream_t& tmp = streamList->streams[mSortedStreamIds[j]];
-+            if (stream.width * stream.height > tmp.width * tmp.height) {
-+                mSortedStreamIds.insert((mSortedStreamIds.begin() + j), i);
-+                saved = true;
-+                break;
-+            }
-+        }
-+        if (!saved)
-+            mSortedStreamIds.push_back(i);
-+    }
-+
-+    // Set opaque RAW stream as last one
-+    if (opaqueRawStreamId >= 0) {
-+        mSortedStreamIds.push_back(opaqueRawStreamId);
-+        // Ignore input raw stream for ZSL case
-+        inputStreamId = -1;
-+    }
-+
-+    const Port kPorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
-+    for (size_t i = 0; i < mSortedStreamIds.size(); i++) {
-+        mStreamIdToPortMap[mSortedStreamIds[i]] = kPorts[i];
-+
-+        // Dump the stream info by descending order.
-+        const stream_t& stream = streamList->streams[mSortedStreamIds[i]];
-+        LOG1("%s  streamId: %d, %dx%d(%s)", __func__, mSortedStreamIds[i],
-+                stream.width, stream.height, CameraUtils::format2string(stream.format).c_str());
-+    }
-+
-+    bool checkInput = !PlatformData::isIsysEnabled(mCameraId);
-+    if (checkInput) {
-+        CheckError(inputStreamId < 0, BAD_VALUE, "Input stream was missing");
-+    }
-+    // Handle input stream
-+    if (inputStreamId >= 0) {
-+        CheckError(mSortedStreamIds.empty(), BAD_VALUE, "There is no output stream!");
-+        // Check if input stream is supported or not
-+        const stream_t& stream = streamList->streams[inputStreamId];
-+        camera_resolution_t inputResolution = {stream.width, stream.height};
-+        bool valid = PlatformData::isISysSupportedResolution(mCameraId, inputResolution);
-+        CheckError(!valid, BAD_VALUE, "Stream config is not supported. format:%s (%dx%d)",
-+                   CameraUtils::pixelCode2String(stream.format), stream.width, stream.height);
-+        // Push input stream index to the end of vector mSortedStreamIds
-+        mSortedStreamIds.push_back(inputStreamId);
-+        // Use MAIN PORT for input stream
-+        mStreamIdToPortMap[inputStreamId] = MAIN_PORT;
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Bind all streams to their producers and to the correct port.
-+ *
-+ * Bind the streams to Port in resolution descending order:
-+ * Stream with max resolution            --> MAIN_PORT
-+ * Stream with intermediate resolution   --> SECOND_PORT
-+ * Stream with min resolution            --> THIRD_PORT
-+ */
-+int CameraDevice::bindStreams(stream_config_t *streamList)
-+{
-+    for (auto& iter : mStreamIdToPortMap) {
-+        mStreams[iter.first]->setPort(iter.second);
-+
-+        // If no post processors, bind the stream to the producer.
-+        if (mProcessors.empty()) {
-+            mStreams[iter.first]->setBufferProducer(mProducer);
-+        } else {
-+            mStreams[iter.first]->setBufferProducer(mProcessors.back());
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraDevice::start()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
-+
-+    // Not protected by mDeviceLock because it is required in qbufL()
-+    mRequestThread->wait1stRequestDone();
-+
-+    AutoMutex   m(mDeviceLock);
-+    CheckError(mState != DEVICE_BUFFER_READY, BAD_VALUE, "start camera in wrong status %d", mState);
-+    CheckError(mStreamNum == 0, BAD_VALUE, "@%s: device doesn't add any stream yet.", __func__);
-+
-+    int ret = startLocked();
-+    if (ret != OK) {
-+        LOGE("Camera device starts failed.");
-+        stopLocked();  // There is error happened, stop all related units.
-+        return INVALID_OPERATION;
-+    }
-+
-+    mState = DEVICE_START;
-+    return OK;
-+}
-+
-+int CameraDevice::stop()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d, mState:%d", __func__, mCameraId, mState);
-+    AutoMutex   m(mDeviceLock);
-+
-+    mRequestThread->clearRequests();
-+
-+    m3AControl->stop();
-+
-+    if (mState == DEVICE_START)
-+        stopLocked();
-+
-+    mState = DEVICE_STOP;
-+
-+    return OK;
-+}
-+
-+//No Lock for this fuction as it doesn't update any class member
-+int CameraDevice::allocateMemory(camera_buffer_t *ubuffer)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE, "@%s: Wrong state id %d", __func__, mState);
-+    CheckError(ubuffer->s.id < 0 || ubuffer->s.id >= mStreamNum, BAD_VALUE,
-+          "@%s: Wrong stream id %d", __func__, ubuffer->s.id);
-+
-+    int ret = mStreams[ubuffer->s.id]->allocateMemory(ubuffer);
-+    CheckError(ret < 0, ret, "@%s: failed, index: %d", __func__, ubuffer->index);
-+
-+    return ret;
-+}
-+
-+/**
-+ * Delegate it to RequestThread, make RequestThread manage all buffer related actions.
-+ */
-+int CameraDevice::dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings)
-+{
-+    CheckError(streamId < 0 || streamId > mStreamNum, BAD_VALUE,
-+          "@%s: the given stream(%d) is invalid.", __func__, streamId);
-+
-+    LOG2("@%s, camera id:%d, stream id:%d", __func__, mCameraId, streamId);
-+
-+    int ret = mRequestThread->waitFrame(streamId, ubuffer);
-+    while (ret == TIMED_OUT)
-+        ret = mRequestThread->waitFrame(streamId, ubuffer);
-+
-+    CheckError(!*ubuffer || ret != OK, BAD_VALUE, "failed to get ubuffer from stream %d", streamId);
-+
-+    // Update and keep latest result, copy to settings when needed.
-+    ret = mParamGenerator->getParameters((*ubuffer)->sequence, &mResultParameter);
-+
-+    if (settings) {
-+        bool still = ((*ubuffer)->s.usage == CAMERA_STREAM_STILL_CAPTURE);
-+        ret = mParamGenerator->getParameters((*ubuffer)->sequence, settings,
-+                                             false, still);
-+    }
-+
-+    return ret;
-+}
-+
-+int CameraDevice::handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence)
-+{
-+    LOG2("@%s, mCameraId:%d, sequence = %ld", __func__, mCameraId, sequence);
-+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
-+
-+    // All streams need to be queued with either a real buffer from user or an empty buffer.
-+    for (int streamId = 0; streamId < mStreamNum; streamId++) {
-+        bool isBufferQueued = false;
-+        CheckError(mStreams[streamId] == nullptr, BAD_VALUE,
-+              "@%s: stream %d is nullptr", __func__, streamId);
-+
-+        // Find if user has queued a buffer for mStreams[streamId].
-+        for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
-+            camera_buffer_t* buffer = ubuffer[bufferId];
-+            int streamIdInBuf = buffer->s.id;
-+            CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
-+                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
-+
-+            if (streamIdInBuf == streamId) {
-+                int ret = mStreams[streamId]->qbuf(buffer, sequence);
-+                CheckError(ret < 0, ret, "@%s: queue buffer:%p failed:%d", __func__, buffer, ret);
-+                isBufferQueued = true;
-+                break;
-+            }
-+        }
-+
-+        // If streamId is not found in buffers queued by user, then we need to queue
-+        // an empty buffer to keep the BufferQueue run.
-+        if (!isBufferQueued) {
-+            int ret = mStreams[streamId]->qbuf(nullptr, sequence);
-+            CheckError(ret < 0, ret, "@%s: queue empty buffer failed:%d", __func__, ret);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraDevice::registerBuffer(camera_buffer_t **ubuffer, int bufferNum)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+    CheckError(mState < DEVICE_CONFIGURE, BAD_VALUE,"@%s: Wrong state id %d", __func__, mState);
-+    if (mProcessors.empty()) return OK;
-+
-+    for (int bufferId = 0; bufferId < bufferNum; bufferId++) {
-+        camera_buffer_t *buffer = ubuffer[bufferId];
-+        CheckError(buffer == nullptr, BAD_VALUE, "@%s, the queue ubuffer %d is NULL", __func__, bufferId);
-+        int streamIdInBuf = buffer->s.id;
-+        CheckError(streamIdInBuf < 0 || streamIdInBuf > mStreamNum, BAD_VALUE,
-+                "@%s: Wrong stream id %d", __func__, streamIdInBuf);
-+        std::shared_ptr<CameraBuffer> camBuffer =
-+            mStreams[streamIdInBuf]->userBufferToCameraBuffer(buffer);
-+        for (auto& iter : mStreamIdToPortMap) {
-+            // Register buffers to the last processor
-+            if (iter.first == streamIdInBuf) {
-+                BufferQueue *processor = mProcessors.back();
-+                processor->registerUserOutputBufs(iter.second, camBuffer);
-+                break;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraDevice::qbuf(camera_buffer_t **ubuffer,
-+                       int bufferNum, const Parameters *settings)
-+{
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    {
-+        AutoMutex   m(mDeviceLock);
-+        if (mState == DEVICE_CONFIGURE || mState == DEVICE_STOP) {
-+            // Start 3A here then the HAL can run 3A for request
-+            int ret = m3AControl->start();
-+            CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
-+
-+            mState = DEVICE_BUFFER_READY;
-+        }
-+    }
-+
-+    if (mState != DEVICE_START && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
-+        registerBuffer(ubuffer, bufferNum);
-+    }
-+
-+    // Make sure request's configure mode is updated by latest result param if no settings
-+    if (!settings) {
-+        mRequestThread->setConfigureModeByParam(mResultParameter);
-+    }
-+
-+    return mRequestThread->processRequest(bufferNum, ubuffer, settings);
-+}
-+
-+int CameraDevice::getParameters(Parameters& param)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
-+    AutoMutex   m(mDeviceLock);
-+
-+    param = mParameter;
-+
-+    for (auto& item : mProcessors) {
-+        item->getParameters(param);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraDevice::setParameters(const Parameters& param)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
-+    AutoMutex   m(mDeviceLock);
-+    return setParametersL(param);
-+}
-+
-+int CameraDevice::setParametersL(const Parameters& param)
-+{
-+    // Merge given param into internal unique mParameter
-+    mParameter.merge(param);
-+
-+    int ret = m3AControl->setParameters(param);
-+    for (auto& item : mProcessors) {
-+        item->setParameters(mParameter);
-+    }
-+
-+    // Set test pattern mode
-+    camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
-+    if (PlatformData::isTestPatternSupported(mCameraId)
-+            && param.getTestPatternMode(testPatternMode) == OK) {
-+        int32_t sensorTestPattern = PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
-+        if (sensorTestPattern > 0) {
-+            ret |= mSensorCtrl->setTestPatternMode(sensorTestPattern);
-+        }
-+    }
-+
-+    return ret;
-+}
-+
-+//Private Functions, these functions are called with device lock hold
-+
-+//Destroy all the streams
-+void CameraDevice::deleteStreams()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s mCameraId:%d, streams:%d", __func__, mCameraId, mStreamNum);
-+
-+    for (int streamId = 0; streamId < mStreamNum; streamId++) {
-+        mStreams[streamId]->stop();
-+        delete mStreams[streamId];
-+        mStreams[streamId] = nullptr;
-+    }
-+    mStreamNum = 0;
-+}
-+
-+// Internal start without lock hold
-+int CameraDevice::startLocked()
-+{
-+    int ret = OK;
-+
-+    bindListeners();
-+
-+    //Start all the streams
-+    for(int i = 0; i < mStreamNum; i++) {
-+        ret = mStreams[i]->start();
-+        CheckError(ret < 0, BAD_VALUE, "Start stream %d failed with ret:%d.", i, ret);
-+    }
-+
-+    for (auto& item : mProcessors) {
-+        ret = item->start();
-+        CheckError((ret < 0), BAD_VALUE, "Start image processor failed with ret:%d.", ret);
-+    }
-+
-+    //Start the CaptureUnit for streamon
-+    ret = mProducer->start();
-+    CheckError((ret < 0), BAD_VALUE, "Start capture unit failed with ret:%d.", ret);
-+
-+    ret = mSofSource->start();
-+    CheckError((ret != OK), BAD_VALUE, "Start SOF event source failed with ret:%d.", ret);
-+
-+    return OK;
-+}
-+
-+// Internal stop without lock hold
-+int CameraDevice::stopLocked()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    unbindListeners();
-+
-+    mSofSource->stop();
-+
-+    //Stop the CaptureUnit for streamon
-+    mProducer->stop();
-+
-+    for (auto& item : mProcessors) {
-+        item->stop();
-+    }
-+
-+    mParamGenerator->reset();
-+
-+    return OK;
-+}
-+
-+int CameraDevice::reconfigure(stream_config_t *streamList)
-+{
-+    AutoMutex   m(mDeviceLock);
-+
-+    int ret = OK;
-+
-+    LOG2("%s: switch type: %d, new mode:%d", __func__,
-+        PlatformData::getAutoSwitchType(mCameraId), streamList->operation_mode);
-+
-+    if (PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL) {
-+        // Wait and return all user buffers in all streams firstly
-+        for (int streamId = 0; streamId < mStreamNum; streamId++) {
-+            mStreams[streamId]->waitToReturnAllUserBufffers();
-+        }
-+
-+        LOG2("%s: all streams stopped", __func__);
-+
-+        // Stop and clean what needed.
-+        m3AControl->stop();
-+
-+        if (mState == DEVICE_START)
-+            stopLocked();
-+
-+        mState = DEVICE_STOP;
-+
-+        for (int streamId = 0; streamId < mStreamNum; streamId++) {
-+            mStreams[streamId]->stop();
-+        }
-+
-+        mProcessorManager->deleteProcessors();
-+
-+        m3AControl->deinit();
-+
-+        mSofSource->deinit();
-+
-+        mProducer->deinit();
-+
-+        /* TODO: Currently kernel have issue and need reopen subdevices
-+         * when stream off and on. Remove below delete and recreate code
-+         * when all kernel issues got fixed.
-+         */
-+        // Delete related components and v4l2 devices
-+        delete mLensCtrl;
-+        delete m3AControl;
-+        delete mSensorCtrl;
-+        delete mSofSource;
-+        delete mProducer;
-+
-+        V4l2DeviceFactory::releaseDeviceFactory(mCameraId);
-+
-+        // Re-create related components and v4l2 devices
-+        mProducer = createBufferProducer();
-+        mSofSource = new SofSource(mCameraId);
-+        mLensCtrl = new LensHw(mCameraId);
-+        mSensorCtrl = SensorHwCtrl::createSensorCtrl(mCameraId);
-+        m3AControl = I3AControlFactory::createI3AControl(mCameraId, mSensorCtrl, mLensCtrl);
-+
-+        // Init and config with new mode
-+        int ret = mProducer->init();
-+        CheckError(ret < 0, ret, "%s: Init capture unit failed", __func__);
-+
-+        ret = mSofSource->init();
-+        CheckError(ret != OK, ret, "@%s: init sync manager failed", __func__);
-+
-+        initDefaultParameters();
-+
-+        ret = m3AControl->init();
-+        CheckError((ret != OK), ret, "%s: Init 3A Unit falied", __func__);
-+
-+        ret = mLensCtrl->init();
-+        CheckError((ret != OK), ret, "%s: Init Lens falied", __func__);
-+
-+        mState = DEVICE_INIT;
-+
-+        // Auto switch do not recreate streams.
-+        configureL(streamList, false);
-+
-+        ret = m3AControl->setParameters(mParameter);
-+        for (auto& item : mProcessors) {
-+            item->setParameters(mParameter);
-+        }
-+        CheckError((ret != OK), ret, "%s: set parameters falied", __func__);
-+
-+        ret = m3AControl->start();
-+        CheckError((ret != OK), BAD_VALUE, "Start 3a unit failed with ret:%d.", ret);
-+
-+        mState = DEVICE_BUFFER_READY;
-+
-+        ret = startLocked();
-+        if (ret != OK) {
-+            LOGE("Camera device starts failed.");
-+            stopLocked();  // There is error happened, stop all related units.
-+            return INVALID_OPERATION;
-+        }
-+
-+        mState = DEVICE_START;
-+
-+        LOG2("%s: reconfigure CameraDevice done", __func__);
-+    } else {
-+
-+        /* TODO: scene mode based psys-only auto switch here will be used to
-+         * replace current auto-switch mechanism in AiqSetting:updateTuningMode,
-+         * which is for non-DOL sensor auto-switch. The switch stabilization
-+         * counting in AiqSetting:updateTuningMode will also be replaced by the
-+         * same mechanism in RequestThread.
-+         */
-+        LOG2("%s: reconfigure CameraDevice to new mode %d with psys-only switch",
-+             __func__, streamList->operation_mode);
-+    }
-+
-+    return ret;
-+}
-+
-+void CameraDevice::handleEvent(EventData eventData)
-+{
-+    LOG2("%s, event type:%d", __func__, eventData.type);
-+
-+    switch (eventData.type) {
-+    case EVENT_PROCESS_REQUEST: {
-+        const EventRequestData& request = eventData.data.request;
-+        if (request.param) {
-+            for (auto& item : mProcessors) {
-+                 item->setParameters(*request.param);
-+            }
-+
-+            // Set test pattern mode
-+            camera_test_pattern_mode_t testPatternMode = TEST_PATTERN_OFF;
-+            if (PlatformData::isTestPatternSupported(mCameraId)
-+                    && request.param->getTestPatternMode(testPatternMode) == OK) {
-+                int32_t sensorTestPattern =
-+                            PlatformData::getSensorTestPattern(mCameraId, testPatternMode);
-+                if (sensorTestPattern > 0) {
-+                    if (mSensorCtrl->setTestPatternMode(sensorTestPattern) < 0) {
-+                        LOGE("%s, set testPatternMode failed", __func__);
-+                    }
-+                }
-+            }
-+        }
-+
-+        handleQueueBuffer(request.bufferNum, request.buffer, request.settingSeq);
-+        break;
-+    }
-+
-+    case EVENT_DEVICE_RECONFIGURE: {
-+        const EventConfigData& config = eventData.data.config;
-+        reconfigure(config.streamList);
-+        break;
-+    }
-+
-+    case EVENT_PSYS_REQUEST_BUF_READY: {
-+        if (mCallback) {
-+            camera_msg_data_t data;
-+            CLEAR(data);
-+            data.type = CAMERA_ISP_BUF_READY;
-+            data.data.buffer_ready.timestamp = eventData.data.requestReady.timestamp;
-+            mCallback->notify(mCallback, data);
-+        }
-+        break;
-+    }
-+
-+    default:
-+        LOGE("Not supported event type:%d", eventData.type);
-+        break;
-+    }
-+}
-+
-+int CameraDevice::initDefaultParameters()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
-+
-+    camera_info_t info;
-+    CLEAR(info);
-+    PlatformData::getCameraInfo(mCameraId, info);
-+
-+    // Init mParameter to camera's capability first and then add some others default settings
-+    mParameter = *info.capability;
-+
-+    // TODO: Figure out a better place to set default parameters since they may be platform specified.
-+    camera_range_t fps = {10, 60};
-+    mParameter.setFpsRange(fps);
-+    mParameter.setFrameRate(30);
-+
-+    camera_image_enhancement_t enhancement;
-+    CLEAR(enhancement); // All use 0 as default
-+    mParameter.setImageEnhancement(enhancement);
-+
-+    mParameter.setWeightGridMode(WEIGHT_GRID_AUTO);
-+
-+    mParameter.setWdrLevel(100);
-+
-+    mParameter.setFlipMode(FLIP_MODE_NONE);
-+
-+    mParameter.setRun3ACadence(1);
-+
-+    mParameter.setYuvColorRangeMode(PlatformData::getYuvColorRangeMode(mCameraId));
-+
-+    mParameter.setTonemapMode(TONEMAP_MODE_FAST);
-+
-+    return OK;
-+}
-+
-+} //namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/CameraDevice.h b/camera/hal/intel/ipu6/src/core/CameraDevice.h
-new file mode 100644
-index 000000000000..82e7afd74fd9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraDevice.h
-@@ -0,0 +1,284 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "CameraStream.h"
-+#include "RequestThread.h"
-+#include "StreamSource.h"
-+#include "AiqUnit.h"
-+#include "Parameters.h"
-+#include "ParameterGenerator.h"
-+#include "SensorHwCtrl.h"
-+#include "SofSource.h"
-+#include "LensHw.h"
-+
-+#include "ProcessorManager.h"
-+
-+#include "gc/IGraphConfigManager.h"
-+
-+namespace icamera {
-+
-+class RequestThread;
-+
-+/**
-+  * CameraDevice : Create elements to construct the streaming pipeline
-+  * Each element must be a producer or a consumer or Both.
-+  *
-+  * These are the typical pipelines:
-+  *
-+  * For a single SOC YUV capture in by pass mode
-+  * StreamSource -> CameraStream
-+  *
-+  * For a single NV12 capture of TPG/Sensor using SwImageProcess
-+  * StreamSource -> SwImageProcessor -> CameraStream
-+  *
-+  * For a single NV12 capture of TPG/Sensor using PSYS processor
-+  * StreamSource -> PsysProcessor -> CameraStream
-+  *
-+  * For a dual streams NV12 video capture of TPG/Sensor using PSYS processor
-+  * StreamSource -> PsysProcessor | -> CameraStream (For video recording)
-+  *                              | -> CameraStream (for Preview)
-+  *
-+  * For a SDV(Snapshot during video) capture of TPG/Sensor uinsg PSYS processor
-+  * StreamSource | -> PsysProcessor | -> CameraStream (For video recording)
-+  *             |                  | -> CameraStream (for Preview)
-+  *             | -> PsysProcessor | -> CameraStream (For still YUV)
-+  *
-+  * The buffer notification between the Class is based on Interface defined
-+  * in BufferQueue. The upstream element use "onFrameAvailable" message to notfiy
-+  * downstream elements that the buffers are ready for further processing
-+  *
-+  * Following singleton instances are created and maintained by CameraDevice
-+  * 1. IGraphConfigManager
-+  * 2. AiqResultStorage
-+  */
-+class CameraDevice : public EventListener {
-+
-+public:
-+    CameraDevice(int cameraId);
-+    ~CameraDevice();
-+
-+    /**
-+     * \brief Camera device class init
-+     *
-+     * 1.Related classes init: StreamSource, SofSource, 3AControl, lensCtrl
-+     * 2.Register listener if enable AIQ
-+     * 3.Set the defualt parameters
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int init();
-+
-+    /**
-+     * \brief Camera device class deinit
-+     *
-+     * 1.Change the state
-+     * 2.Destory the listeners
-+     * 3.Delete the streams
-+     * 4.Deinit the Related classes.
-+     */
-+    void deinit();
-+
-+    /**
-+     * \brief Camera device start
-+     *
-+     * 1. Start all streams
-+     * 2. Related classes start
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int start();
-+
-+    /**
-+     * \brief Camera device stop
-+     *
-+     * 1. Stop all related class module.
-+     * 2. Change the state
-+     */
-+    int stop();
-+
-+    /**
-+     * \brief Allocate momery according to user buffer
-+     *
-+     * 1. Convert user buffer to CameraBuffer and push it into UserBufferQueue
-+     * 2. Calling CameraStream class to allocateMemory.
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int allocateMemory(camera_buffer_t *ubuffer);
-+
-+    /**
-+     * \brief dequeue buffer from cameraStream.
-+     *
-+     * 1. Dequeue one CameraBuffer from CameraStream
-+     * 2. Fill the user buffer base on CameraBuffer
-+     * 3. Fill the settings was used for this buffer if settings is not nullptr
-+     *
-+     * \return 0 if succeed, other value indicates failed
-+     */
-+    int dqbuf(int streamId, camera_buffer_t **ubuffer, Parameters* settings = nullptr);
-+
-+    /**
-+     * \brief Queue one buffer to CameraStream
-+     *
-+     * 1. Get the CameraBuffer base on the ubuffer
-+     * 2. Calling CameraStream to queue one CameraBuffer
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int qbuf(camera_buffer_t **ubuffer, int bufferNum = 1, const Parameters* settings = nullptr);
-+
-+    /**
-+     * \brief Configure the device sensor input
-+     *
-+     *
-+     * \param inputConfig: the Output format/resolution of the isys
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int configureInput(const stream_t *inputConfig);
-+
-+    /**
-+     * \brief Configure the streams, devices and post processor.
-+     *
-+     * Configure the streams according to the streamList info
-+     * Extra processor is needed if the format isn't supported in Psys output
-+     *
-+     * \param streamList: all the streams info
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int configure(stream_config_t *streamList);
-+
-+    /**
-+     * \brief Set the parameters
-+     *
-+     * Merge the param to internal parameters and set them to 3A
-+     * and processor.
-+     *
-+     * \param param: the parameters need to set
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int setParameters(const Parameters& param);
-+
-+    /**
-+     * \brief Get the parameters
-+     *
-+     * Get the internal parameters list
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int getParameters(Parameters& param);
-+
-+    void handleEvent(EventData eventData);
-+
-+    void callbackRegister(const camera_callback_ops_t* callback);
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CameraDevice);
-+
-+    /**
-+     * \brief Reconfigure the streams, devices and post processor.
-+     *
-+     * \param streamList: all the streams info
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int reconfigure(stream_config_t *streamList);
-+
-+    int startLocked();
-+    int stopLocked();
-+    int initDefaultParameters();
-+    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(Port port,
-+                                                                camera_buffer_t *ubuffer);
-+
-+    StreamSource* createBufferProducer();
-+    std::map<Port, stream_t> selectProducerConfig(const stream_config_t *streamList, int mcId);
-+    bool isProcessorNeeded(const stream_config_t *streamList, const stream_t &producerConfig);
-+    bool isStillDuringVideo(const stream_config_t *streamList);
-+    int analyzeStream(stream_config_t *streamList);
-+    int createStreams(stream_config_t *streamList);
-+    int bindStreams(stream_config_t *streamList);
-+    void deleteStreams();
-+
-+    /**
-+     * Bind all event listeners with their source.
-+     */
-+    void bindListeners();
-+
-+    /**
-+     * Unbind all event listeners from their source.
-+     */
-+    void unbindListeners();
-+
-+    long fetchCaptureSettings(const Parameters * params);
-+
-+    // The second phase of qbuf(), done in RequestThread
-+    int handleQueueBuffer(int bufferNum, camera_buffer_t **ubuffer, long sequence);
-+
-+    // No lock protect for internal usage, should be protected by mDeviceLock from outside
-+    int configureL(stream_config_t *streamList, bool clean = true);
-+    int setParametersL(const Parameters& param);
-+
-+    int registerBuffer(camera_buffer_t **ubuffer, int bufferNum);
-+
-+private:
-+    enum {
-+        DEVICE_UNINIT = 0,
-+        DEVICE_INIT,
-+        DEVICE_CONFIGURE, //means stream configured
-+        DEVICE_START,
-+        DEVICE_STOP,
-+        DEVICE_BUFFER_READY, //At least one buffer is queued to ISP
-+    } mState;
-+
-+    // Guard for CameraDevice public API
-+    Mutex mDeviceLock;
-+
-+    static const nsecs_t kWaitDuration = 5000000000; //5000ms
-+
-+    // Pipeline elements
-+    CameraStream* mStreams[MAX_STREAM_NUMBER];
-+    std::map<int, Port> mStreamIdToPortMap;
-+    std::vector<int> mSortedStreamIds; // Used to save sorted stream ids with descending order.
-+    StreamSource *mProducer;
-+
-+    ProcessorManager* mProcessorManager;
-+    std::vector<BufferQueue*> mProcessors;
-+
-+    ParameterGenerator *mParamGenerator;
-+
-+    LensHw *mLensCtrl;
-+    SensorHwCtrl *mSensorCtrl;
-+    SofSource* mSofSource;
-+    AiqUnitBase *m3AControl;
-+
-+    //Internal used variable
-+    int     mCameraId;
-+    int     mStreamNum;
-+    Parameters mParameter;
-+    //The latest result parameters
-+    Parameters mResultParameter;
-+    bool mPerframeControlSupport;
-+
-+    RequestThread* mRequestThread;
-+    IGraphConfigManager *mGCM;
-+    stream_t mInputConfig;
-+    camera_callback_ops_t *mCallback;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.cpp b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
-new file mode 100644
-index 000000000000..6d2a6f10ebc1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraEvent.cpp
-@@ -0,0 +1,83 @@
-+/*
-+ * Copyright (C) 2015-2017 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraEvent"
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "CameraEvent.h"
-+
-+namespace icamera {
-+
-+EventSource::EventSource()
-+{
-+    LOG1("@%s EventSource created", __func__);
-+}
-+
-+EventSource::~EventSource()
-+{
-+    LOG1("@%s EventSource destructed", __func__);
-+}
-+
-+void EventSource::registerListener(EventType eventType, EventListener* eventListener)
-+{
-+    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
-+
-+    CheckError(eventListener == nullptr, VOID_VALUE,
-+          "%s: event listener is nullptr, skip registration.", __func__);
-+
-+    AutoMutex l(mListenersLock);
-+
-+    std::set<EventListener*> listenersOfType;
-+    if (mListeners.find(eventType) != mListeners.end()) {
-+        listenersOfType = mListeners[eventType];
-+    }
-+
-+    listenersOfType.insert(eventListener);
-+    mListeners[eventType] = listenersOfType;
-+}
-+
-+void EventSource::removeListener(EventType eventType, EventListener* eventListener)
-+{
-+    LOG1("@%s eventType: %d, listener: %p", __func__, eventType, eventListener);
-+    AutoMutex l(mListenersLock);
-+
-+    if (mListeners.find(eventType) == mListeners.end()) {
-+        LOG1("%s: no listener found for event type %d", __func__, eventType);
-+        return;
-+    }
-+
-+    std::set<EventListener*> listenersOfType = mListeners[eventType];
-+    listenersOfType.erase(eventListener);
-+}
-+
-+void EventSource::notifyListeners(EventData eventData)
-+{
-+    LOG2("@%s eventType: %d", __func__, eventData.type);
-+    AutoMutex l(mListenersLock);
-+
-+    if (mListeners.find(eventData.type) == mListeners.end()){
-+        LOG2("%s: no listener found for event type %d", __func__, eventData.type);
-+        return;
-+    }
-+
-+    for (auto listener : mListeners[eventData.type]) {
-+        LOG2("%s: send event data to listener %p for event type %d", __func__, listener, eventData.type);
-+        listener->handleEvent(eventData);
-+    }
-+}
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/CameraEvent.h b/camera/hal/intel/ipu6/src/core/CameraEvent.h
-new file mode 100644
-index 000000000000..4a15167cd799
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraEvent.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <set>
-+
-+#include "iutils/Thread.h"
-+#include "CameraEventType.h"
-+
-+namespace icamera {
-+
-+class EventListener
-+{
-+public:
-+    EventListener() {};
-+    virtual ~EventListener() {};
-+    virtual void handleEvent(EventData eventData) {};
-+};
-+
-+class EventSource
-+{
-+private:
-+    std::map<EventType, std::set<EventListener*>> mListeners;
-+
-+    // Guard for EventSource public API to protect mListeners.
-+    Mutex mListenersLock;
-+public:
-+    EventSource();
-+    virtual ~EventSource();
-+    virtual void registerListener(EventType eventType, EventListener* eventListener);
-+    virtual void removeListener(EventType eventType, EventListener* eventListener);
-+    virtual void notifyListeners(EventData eventData);
-+};
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/CameraEventType.h b/camera/hal/intel/ipu6/src/core/CameraEventType.h
-new file mode 100644
-index 000000000000..8f870d4269f3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraEventType.h
-@@ -0,0 +1,110 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+
-+#include "iutils/Utils.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+class CameraBuffer;
-+
-+enum EventType
-+{
-+    EVENT_ISYS_SOF = 0,
-+    EVENT_PSYS_STATS_BUF_READY,
-+    EVENT_PSYS_STATS_SIS_BUF_READY,
-+    EVENT_ISYS_FRAME,
-+    EVENT_PSYS_FRAME,
-+    EVENT_PROCESS_REQUEST,
-+    EVENT_DEVICE_RECONFIGURE,
-+    EVENT_FRAME_AVAILABLE,
-+    EVENT_PSYS_REQUEST_BUF_READY,
-+};
-+
-+struct EventDataStatsReady
-+{
-+    timeval timestamp;
-+    long sequence;
-+};
-+
-+struct EventDataSync
-+{
-+    timeval timestamp;
-+    long sequence;
-+};
-+
-+struct EventDataFrame
-+{
-+    timeval timestamp;
-+    long sequence;
-+};
-+
-+struct EventDataMeta
-+{
-+    timeval timestamp;
-+    long sequence;
-+};
-+
-+struct EventRequestData
-+{
-+    int bufferNum;
-+    camera_buffer_t** buffer;
-+    Parameters* param;
-+
-+    long settingSeq;
-+};
-+
-+struct EventConfigData
-+{
-+    stream_config_t *streamList;
-+};
-+
-+struct EventFrameAvailable
-+{
-+    int streamId;
-+};
-+
-+struct EventRequestBufferReady
-+{
-+    int64_t timestamp;
-+};
-+
-+struct EventData
-+{
-+    EventData() : type(EVENT_ISYS_SOF) {
-+        CLEAR(data);
-+    }
-+
-+    EventType type;
-+    std::shared_ptr<CameraBuffer> buffer;
-+    union
-+    {
-+        EventDataStatsReady statsReady;
-+        EventDataSync sync;
-+        EventDataFrame frame;
-+        EventDataMeta meta;
-+        EventRequestData request;
-+        EventConfigData config;
-+        EventFrameAvailable frameDone;
-+        EventRequestBufferReady requestReady;
-+    } data;
-+};
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.cpp b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
-new file mode 100644
-index 000000000000..6bc8d32c41f0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraStream.cpp
-@@ -0,0 +1,230 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraStream"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+#include "CameraStream.h"
-+#include "PlatformData.h"
-+
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+CameraStream::CameraStream(int cameraId, int streamId, const stream_t& stream)
-+      : mCameraId(cameraId),
-+        mStreamId(streamId),
-+        mPort(MAIN_PORT),
-+        mBufferProducer(nullptr),
-+        mNumHoldingUserBuffers(0),
-+        mIsWaitingBufferReturn(false)
-+{
-+    LOG1("@%s: mCameraId:%d, width:%d, height:%d, format:%s", __func__,
-+          mCameraId, stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
-+          CameraUtils::pixelCode2String(stream.format));
-+    LOG2("@%s: automation checkpoint: WHF: %d,%d,%s", __func__,
-+          stream.width, CameraUtils::getInterlaceHeight(stream.field, stream.height),
-+          CameraUtils::pixelCode2String(stream.format));
-+}
-+
-+CameraStream::~CameraStream()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+}
-+
-+int CameraStream::start()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    return OK;
-+}
-+
-+int CameraStream::stop()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mIsWaitingBufferReturn = false;
-+    mNumHoldingUserBuffers = 0;
-+
-+    if (mBufferProducer != nullptr)
-+        mBufferProducer->removeFrameAvailableListener(this);
-+
-+    AutoMutex poolLock(mBufferPoolLock);
-+    mUserBuffersPool.clear();
-+
-+    return OK;
-+}
-+
-+/*
-+ * Allocate memory to the stream processor which should be
-+ * set by the CameraDevice
-+ */
-+int CameraStream::allocateMemory(camera_buffer_t *ubuffer)
-+{
-+    LOG1("@%s, mCameraId:%d, ubuffer %p", __func__, mCameraId, ubuffer);
-+
-+    int ret = BAD_VALUE;
-+    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
-+    CheckError(!camBuffer, ret, "@%s: fail to alloc CameraBuffer", __func__);
-+
-+    // mBufferProducer will not change after start
-+    if (mBufferProducer)
-+        ret = mBufferProducer->allocateMemory(mPort, camBuffer);
-+
-+    return ret;
-+}
-+
-+shared_ptr<CameraBuffer> CameraStream::userBufferToCameraBuffer(camera_buffer_t *ubuffer)
-+{
-+    if (ubuffer == nullptr) return nullptr;
-+
-+    shared_ptr<CameraBuffer> camBuffer = nullptr;
-+
-+    AutoMutex l(mBufferPoolLock);
-+    for (auto& buffer : mUserBuffersPool) {
-+        if (buffer->getUserBuffer() == ubuffer) {
-+            camBuffer = buffer;
-+            break;
-+        }
-+    }
-+
-+    if (!camBuffer) { // Not found in the pool, so create a new CameraBuffer for it.
-+        ubuffer->index = mUserBuffersPool.size();
-+        camBuffer = std::make_shared<CameraBuffer>(mCameraId, BUFFER_USAGE_GENERAL,
-+                ubuffer->s.memType, ubuffer->s.size, ubuffer->index, ubuffer->s.format);
-+        CheckError(!camBuffer, nullptr, "@%s: fail to alloc CameraBuffer", __func__);
-+        mUserBuffersPool.push_back(camBuffer);
-+    }
-+    camBuffer->setUserBufferInfo(ubuffer);
-+
-+    // Update the v4l2 flags
-+    camBuffer->updateFlags();
-+
-+    return camBuffer;
-+}
-+
-+void CameraStream::waitToReturnAllUserBufffers()
-+{
-+    LOG1("%s: wait for all user buffers to be returned to user", __func__);
-+
-+    ConditionLock lock(mBufferPoolLock);
-+
-+    if (mNumHoldingUserBuffers > 0){
-+        // mIsWaitingBufferReturn flag is used to prevent situation that signal goes before wait
-+        mIsWaitingBufferReturn = true;
-+        int ret = mAllBuffersReturnedSignal.waitRelative(lock,
-+                                                         kWaitDuration * SLOWLY_MULTIPLIER);
-+
-+        if (ret == TIMED_OUT) {
-+            LOGW("@%s, mCameraId:%d, time out happens when waiting return user buffers",
-+                 __func__, mCameraId);
-+            return;
-+        }
-+        mIsWaitingBufferReturn = false;
-+    }
-+
-+    LOG1("%s: all buffers have been returned to user", __func__);
-+
-+    return;
-+}
-+
-+// Q buffers to the stream processor which should be set by the CameraDevice
-+int CameraStream::qbuf(camera_buffer_t *ubuffer, long sequence)
-+{
-+    shared_ptr<CameraBuffer> camBuffer = userBufferToCameraBuffer(ubuffer);
-+    if (camBuffer) {
-+        camBuffer->setSettingSequence(sequence);
-+        LOG2("@%s, mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d, ubuffer:%p, addr:%p",
-+             __func__, mCameraId, mStreamId, camBuffer.get(), mPort, ubuffer, ubuffer->addr);
-+    }
-+
-+    int ret = BAD_VALUE;
-+    // mBufferProducer will not change after start, no lock
-+    if (mBufferProducer != nullptr) {
-+        ret = mBufferProducer->qbuf(mPort, camBuffer);
-+        if (ret == OK) {
-+            mNumHoldingUserBuffers++;
-+        }
-+    }
-+    return ret;
-+}
-+
-+//This function is called in stop status, no lock
-+void CameraStream::setBufferProducer(BufferProducer *producer)
-+{
-+    LOG1("@%s, mCameraId:%d, producer %p", __func__, mCameraId, producer);
-+
-+    mBufferProducer = producer;
-+
-+    if (producer != nullptr)
-+        producer->addFrameAvailableListener(this);
-+}
-+
-+int CameraStream::onFrameAvailable(Port port, const shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    // Ignore if the buffer is not for this stream.
-+    if (mPort != port) return OK;
-+    if (camBuffer->getStreamId() != mStreamId) return OK;
-+
-+    LOG2("@%s: mCameraId:%d, mStreamId:%d, CameraBuffer:%p for port:%d",
-+         __func__, mCameraId, mStreamId, camBuffer.get(), port);
-+
-+    // Update the user buffer info before return back
-+    camBuffer->updateUserBuffer();
-+
-+    EventFrameAvailable frameData;
-+    frameData.streamId = mStreamId;
-+    EventData eventData;
-+    eventData.type = EVENT_FRAME_AVAILABLE;
-+    eventData.buffer = camBuffer;
-+    eventData.data.frameDone = frameData;
-+    notifyListeners(eventData);
-+
-+    camera_buffer_t* ubuffer = camBuffer->getUserBuffer();
-+    LOG2("ubuffer:%p, addr:%p, timestamp:%lu, sequence:%ld",
-+         ubuffer, ubuffer->addr, ubuffer->timestamp, ubuffer->sequence);
-+
-+    LOGVCSYNC("[onFrameDone], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%luus, endl",
-+        CameraUtils::systemTime(),
-+        ubuffer->sequence,
-+        camBuffer->getVirtualChannel(),
-+        ubuffer->timestamp);
-+
-+    PERF_CAMERA_ATRACE_PARAM3("sequence", camBuffer->getSequence(),
-+                              "csi2_port", camBuffer->getCsi2Port(),
-+                              "virtual_channel", camBuffer->getVirtualChannel());
-+
-+    AutoMutex l(mBufferPoolLock);
-+
-+    if (mNumHoldingUserBuffers > 0) {
-+        mNumHoldingUserBuffers--;
-+    }
-+
-+    LOG2("mNumHoldingUserBuffers has already been counted down to %d", mNumHoldingUserBuffers);
-+
-+    // mIsWaitingBufferReturn is used to prevent signal before wait
-+    if (mIsWaitingBufferReturn && mNumHoldingUserBuffers == 0) {
-+        LOG2("%s: all user buffer returned, trigger signal", __func__);
-+        mAllBuffersReturnedSignal.signal();
-+    }
-+
-+    return OK;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/CameraStream.h b/camera/hal/intel/ipu6/src/core/CameraStream.h
-new file mode 100644
-index 000000000000..5ac9472d4254
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CameraStream.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "Parameters.h"
-+#include "CameraBuffer.h"
-+#include "BufferQueue.h"
-+
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+/**
-+  * CameraStream: The HAL represent of the application stream.
-+  * CameraStream implement the BufferConsumer interface.
-+  *
-+  * CameraStream provide the buffer interface to application.
-+  * It gets buffers from producers and returns to the app
-+  *
-+  * Application used the DQ buffer to get the buffers from Camera
-+  * and Q buffer to return the buffers to camera.
-+  */
-+
-+class CameraStream: public BufferConsumer, public EventSource {
-+public:
-+    CameraStream(int cameraId, int streamId, const stream_t& stream);
-+    virtual ~CameraStream();
-+
-+    /**
-+     * \brief Set which port this stream is linked to.
-+     */
-+    void setPort(Port port) { mPort = port; }
-+
-+    /**
-+     * \brief get the port which the stream is linked to.
-+     */
-+    Port getPort() { return mPort; }
-+
-+    /**
-+     * \brief Set the StreamActive state
-+     */
-+    int start();
-+
-+    /**
-+     * \brief Clear streamActive state and clear up
-+     * the buffer queue
-+     */
-+    int stop();
-+
-+    /**
-+     * \brief Push one CameraBuffer to bufferProducer
-+     */
-+    int qbuf(camera_buffer_t *ubuffer, long sequence);
-+
-+    /**
-+     * \brief Calling mBufferProducer to allocate memory
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int allocateMemory(camera_buffer_t *buffer);
-+
-+    std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(camera_buffer_t *ubuffer);
-+
-+    /**
-+     * \brief Wait all user buffers to be returned to user
-+     */
-+    void waitToReturnAllUserBufffers();
-+
-+    /**
-+     * \brief Register the mBufferProducer
-+     */
-+    virtual void setBufferProducer(BufferProducer *producer);
-+
-+    /**
-+     * \brief The notify when polled or processed one frame buffer
-+     */
-+    virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+private:
-+    static const nsecs_t kWaitDuration = 10000000000; //10000ms
-+
-+    int mCameraId;
-+    int mStreamId;
-+    Port mPort;
-+
-+    BufferProducer   *mBufferProducer;
-+
-+    CameraBufVector    mUserBuffersPool;
-+
-+    // Guard for member mUserBuffersPool, used in the qbuf which is critical for FPS
-+    // Prevent qbuf and dqbuf to share the same lock
-+    Mutex mBufferPoolLock;
-+
-+    // Siginal for the situation that all buffers returned to user
-+    Condition mAllBuffersReturnedSignal;
-+
-+    // How many user buffers are currently processing underhood.
-+    int mNumHoldingUserBuffers;
-+
-+    // Flag to indicate that currently waiting for all user buffers to be returned
-+    bool mIsWaitingBufferReturn;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
-new file mode 100644
-index 000000000000..2823ac32488c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CaptureUnit"
-+
-+#include <poll.h>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Utils.h"
-+
-+#include "PlatformData.h"
-+#include "MediaControl.h"
-+#include "CaptureUnit.h"
-+
-+using std::vector;
-+using std::map;
-+
-+namespace icamera {
-+
-+CaptureUnit::CaptureUnit(int cameraId, int memType) :
-+    StreamSource(memType),
-+    mCameraId(cameraId),
-+    mMaxBufferNum(MAX_BUFFER_COUNT),
-+    mState(CAPTURE_UNINIT),
-+    mExitPending(false)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mPollThread = new PollThread(this);
-+
-+    mMaxBuffersInDevice = PlatformData::getExposureLag(mCameraId) + 1;
-+    if (mMaxBuffersInDevice < 2) {
-+        mMaxBuffersInDevice = 2;
-+    }
-+}
-+
-+CaptureUnit::~CaptureUnit()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    delete mPollThread;
-+}
-+
-+int CaptureUnit::init()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mState = CAPTURE_INIT;
-+
-+    return OK;
-+}
-+
-+void CaptureUnit::deinit()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    if (mState == CAPTURE_UNINIT) {
-+        LOG1("%s: deinit without init", __func__);
-+        return;
-+    }
-+
-+    destroyDevices();
-+    mPollThread->join();
-+
-+    mState = CAPTURE_UNINIT;
-+}
-+
-+int CaptureUnit::createDevices()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    destroyDevices();
-+
-+    // Default INVALID_PORT means the device isn't associated with any outside consumers.
-+    const Port kDefaultPort = INVALID_PORT;
-+    Port portOfMainDevice = findDefaultPort(mOutputFrameInfo);
-+    // Use the config for main port as the default one.
-+    const stream_t& kDefaultStream = mOutputFrameInfo.at(portOfMainDevice);
-+    // targetPorts specifies the desired port for the device. But the real port which will be used
-+    // is deciced whether the port is provided by the consumer.
-+    vector<Port> targetPorts;
-+
-+    // Use VIDEO_GENERIC by default.
-+    VideoNodeType nodeType = VIDEO_GENERIC;
-+
-+    mDevices.push_back(new MainDevice(mCameraId, nodeType, this));
-+    targetPorts.push_back(portOfMainDevice);
-+
-+    // Open and configure the devices. The stream and port that are used by the device is
-+    // decided by whether consumer has provided such info, use the default one if not.
-+    for (uint8_t i = 0; i < mDevices.size(); i++) {
-+        DeviceBase* device = mDevices[i];
-+
-+        int ret = device->openDevice();
-+        CheckError(ret != OK, ret, "Open device(%s) failed:%d", device->getName(), ret);
-+
-+        const Port kTargetPort = targetPorts[i];
-+        bool hasPort = mOutputFrameInfo.find(kTargetPort) != mOutputFrameInfo.end();
-+        const stream_t& stream = hasPort ? mOutputFrameInfo.at(kTargetPort) : kDefaultStream;
-+
-+        ret = device->configure(hasPort ? kTargetPort : kDefaultPort, stream, mMaxBufferNum);
-+        CheckError(ret != OK, ret, "Configure device(%s) failed:%d", device->getName(), ret);
-+    }
-+
-+    return OK;
-+}
-+
-+void CaptureUnit::destroyDevices()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    for (auto device : mDevices) {
-+        device->closeDevice();
-+        delete device;
-+    }
-+    mDevices.clear();
-+
-+}
-+
-+/**
-+ * Find the device that can handle the given port.
-+ */
-+DeviceBase* CaptureUnit::findDeviceByPort(Port port)
-+{
-+    for (auto device : mDevices) {
-+        if (device->getPort() == port) {
-+            return device;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+int CaptureUnit::streamOn()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    for (auto device : mDevices) {
-+        int ret = device->streamOn();
-+        CheckError(ret < 0, INVALID_OPERATION, "Device:%s stream on failed.", device->getName());
-+    }
-+
-+    return OK;
-+}
-+
-+int CaptureUnit::start()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    AutoMutex l(mLock);
-+    CheckWarning(mState == CAPTURE_START, OK, "@%s: device already started", __func__);
-+
-+    int ret = streamOn();
-+    if (ret != OK) {
-+        streamOff();
-+        LOGE("Devices stream on failed:%d", ret);
-+        return ret;
-+    }
-+
-+    mPollThread->run("CaptureUnit", PRIORITY_URGENT_AUDIO);
-+    mState = CAPTURE_START;
-+    mExitPending = false;
-+    LOG2("@%s: automation checkpoint: flag: poll_started", __func__);
-+
-+    return OK;
-+}
-+
-+void CaptureUnit::streamOff()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    for (auto device : mDevices) {
-+        device->streamOff();
-+    }
-+}
-+
-+int CaptureUnit::stop()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
-+
-+    if (mState != CAPTURE_START) {
-+        LOGW("@%s: device not started", __func__);
-+        return OK;
-+    }
-+
-+    mExitPending = true;
-+    mPollThread->requestExit();
-+    streamOff();
-+    mPollThread->requestExitAndWait();
-+
-+    AutoMutex   l(mLock);
-+    mState = CAPTURE_STOP;
-+
-+    for (auto device : mDevices) {
-+        device->resetBuffers();
-+    }
-+
-+    LOG2("@%s: automation checkpoint: flag: poll_stopped", __func__);
-+
-+    mExitPending = false; // It's already stopped.
-+
-+    return OK;
-+}
-+
-+/**
-+ * Check if the given outputFrames are different from the previous one.
-+ * Only return false when the config for each port is exactly same.
-+ */
-+bool CaptureUnit::isNewConfiguration(const map<Port, stream_t>& outputFrames)
-+{
-+    for (const auto& item : outputFrames) {
-+        if (mOutputFrameInfo.find(item.first) == mOutputFrameInfo.end()) {
-+            return true;
-+        }
-+
-+        const stream_t& oldStream = mOutputFrameInfo[item.first];
-+        const stream_t& newStream = item.second;
-+
-+        bool isNewConfig = (oldStream.width != newStream.width || oldStream.height != newStream.height
-+               || oldStream.format != newStream.format || oldStream.field != newStream.field
-+               || oldStream.memType != newStream.memType);
-+        if (isNewConfig) {
-+            return true;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+int CaptureUnit::configure(const map<Port, stream_t>& outputFrames,
-+                           const vector<ConfigMode>& configModes,
-+                           uint32_t bufferNum)
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    CheckError(outputFrames.empty(), BAD_VALUE, "No frame info configured.");
-+    CheckError(mState != CAPTURE_CONFIGURE && mState != CAPTURE_INIT && mState != CAPTURE_STOP,
-+          INVALID_OPERATION, "@%s: Configure in wrong state %d", __func__, mState);
-+
-+    Port port = findDefaultPort(outputFrames);
-+    const stream_t& mainStream = outputFrames.at(port);
-+
-+    if (!isNewConfiguration(outputFrames)) {
-+        LOGD("@%s: Configuration is not changed.", __func__);
-+        return OK;
-+    }
-+
-+    for (const auto& item : outputFrames) {
-+        LOG1("%s, mCameraId:%d, port:%d, w:%d, h:%d, f:%s", __func__, mCameraId, item.first,
-+              item.second.width, item.second.height,
-+              CameraUtils::format2string(item.second.format).c_str());
-+    }
-+
-+    mMaxBufferNum = bufferNum;
-+    mConfigModes = configModes;
-+    mOutputFrameInfo = outputFrames;
-+
-+    /* media ctl setup */
-+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(mCameraId);
-+    CheckError(!mc, BAD_VALUE, "get format configuration failed for %s (%dx%d)",
-+               CameraUtils::format2string(mainStream.format).c_str(),
-+               mainStream.width, mainStream.height);
-+
-+    int status = MediaControl::getInstance()->mediaCtlSetup(mCameraId, mc,
-+            mainStream.width, mainStream.height, mainStream.field);
-+    CheckError(status != OK, status, "set up mediaCtl failed");
-+
-+    // Create, open, and configure all of needed devices.
-+    status = createDevices();
-+    CheckError(status != OK, status, "Create devices failed:%d", status);
-+
-+    mState = CAPTURE_CONFIGURE;
-+
-+    // mExitPending should also be set false in configure to make buffers queued before start
-+    mExitPending = false;
-+
-+    return OK;
-+}
-+
-+Port CaptureUnit::findDefaultPort(const map<Port, stream_t>& frames) const
-+{
-+    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT};
-+    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
-+        if (frames.find(availablePorts[i]) != frames.end()) {
-+            return availablePorts[i];
-+        }
-+    }
-+    return INVALID_PORT;
-+}
-+
-+int CaptureUnit::allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    const struct v4l2_buffer* v = camBuffer->getV4L2Buffer().Get();
-+    CheckError(v->index >= mMaxBufferNum, -1
-+        ,"index %d is larger than max count %d", v->index, mMaxBufferNum);
-+    CheckError(v->memory != V4L2_MEMORY_MMAP, -1
-+        ,"Allocating Memory Capture device only supports MMAP mode.");
-+
-+    DeviceBase* device = findDeviceByPort(port);
-+    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
-+
-+    int ret = camBuffer->allocateMemory(device->getV4l2Device());
-+    CheckError(ret < 0, ret, "Failed to allocate memory ret(%d) for port:%d", ret, port);
-+
-+    return OK;
-+}
-+
-+int CaptureUnit::qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    CheckError(camBuffer == nullptr, BAD_VALUE, "Camera buffer is null");
-+    CheckError((mState == CAPTURE_INIT || mState == CAPTURE_UNINIT), INVALID_OPERATION,
-+          "@%s: qbuf in wrong state %d", __func__, mState);
-+
-+    DeviceBase* device = findDeviceByPort(port);
-+    CheckError(!device, BAD_VALUE, "No device available for port:%d", port);
-+
-+    LOG2("@%s, mCameraId:%d, queue CameraBuffer: %p to port:%d",
-+         __func__, mCameraId, camBuffer.get(), port);
-+
-+    device->addPendingBuffer(camBuffer);
-+
-+    return processPendingBuffers();
-+}
-+
-+int CaptureUnit::queueAllBuffers()
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    if (mExitPending) return OK;
-+
-+    long predictSequence = -1;
-+
-+    for (auto device : mDevices) {
-+        int ret = device->queueBuffer(predictSequence);
-+        if (mExitPending) break;
-+        CheckError(ret != OK, ret, "Failed to queue buffer to device:%s, ret=%d",
-+             device->getName(), ret);
-+        if (predictSequence == -1) {
-+            predictSequence = device->getPredictSequence();
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void CaptureUnit::onDequeueBuffer()
-+{
-+    processPendingBuffers();
-+}
-+
-+int CaptureUnit::processPendingBuffers()
-+{
-+    LOG2("%s: buffers in device:%d", __func__, mDevices.front()->getBufferNumInDevice());
-+
-+    while (mDevices.front()->getBufferNumInDevice() < mMaxBuffersInDevice) {
-+        bool hasPendingBuffer = true;
-+        for (auto device : mDevices) {
-+            if (!device->hasPendingBuffer()) {
-+                hasPendingBuffer = false;
-+                break;
-+            }
-+        }
-+        // Do not queue buffer when one of the devices has no pending buffers.
-+        if (!hasPendingBuffer) break;
-+
-+        int ret = queueAllBuffers();
-+
-+        if (mExitPending) break;
-+
-+        CheckError(ret != OK, ret, "Failed to queue buffers, ret=%d", ret);
-+    }
-+
-+    return OK;
-+}
-+
-+int CaptureUnit::poll()
-+{
-+    PERF_CAMERA_ATRACE();
-+    int ret = 0;
-+    const int poll_timeout_count = 10;
-+    const int poll_timeout = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
-+
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    CheckError((mState != CAPTURE_CONFIGURE && mState != CAPTURE_START), INVALID_OPERATION,
-+          "@%s: poll buffer in wrong state %d", __func__, mState);
-+
-+    int timeOutCount = poll_timeout_count;
-+
-+    std::vector<V4L2Device*> pollDevs, readyDevices;
-+    for (const auto& device : mDevices) {
-+        pollDevs.push_back(device->getV4l2Device());
-+        LOG2("@%s: device:%s has %d buffers queued.",
-+              __func__, device->getName(), device->getBufferNumInDevice());
-+    }
-+
-+    while (timeOutCount-- && ret == 0) {
-+        // If stream off, no poll needed.
-+        if (mExitPending) {
-+            LOG2("%s: mExitPending is true, exit", __func__);
-+            //Exiting, no error
-+            return -1;
-+        }
-+
-+        V4L2DevicePoller poller {pollDevs, -1};
-+        ret = poller.Poll(poll_timeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
-+
-+        LOG2("@%s: automation checkpoint: flag: poll_buffer, ret:%d", __func__, ret);
-+    }
-+
-+    //In case poll error after stream off
-+    if (mExitPending) {
-+        LOG2("%s: mExitPending is true, exit", __func__);
-+        //Exiting, no error
-+        return -1;
-+    }
-+
-+    CheckError(ret < 0, UNKNOWN_ERROR, "%s: Poll error, ret:%d", __func__, ret);
-+
-+    if (ret == 0) {
-+        LOG1("%s, cameraId: %d: timeout happens, wait recovery", __func__, mCameraId);
-+        return OK;
-+    }
-+
-+    for (const auto& readyDevice : readyDevices) {
-+        for (auto device : mDevices) {
-+            if (device->getV4l2Device() == readyDevice) {
-+                int ret = device->dequeueBuffer();
-+                if (mExitPending) return -1;
-+
-+                if (ret != OK) {
-+                    LOGE("Device:%s grab frame failed:%d", device->getName(), ret);
-+                }
-+                break;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void CaptureUnit::addFrameAvailableListener(BufferConsumer *listener)
-+{
-+    LOG1("%s camera id:%d", __func__, mCameraId);
-+
-+    AutoMutex   l(mLock);
-+    for (auto device : mDevices) {
-+        device->addFrameListener(listener);
-+    }
-+}
-+
-+void CaptureUnit::removeFrameAvailableListener(BufferConsumer *listener)
-+{
-+    LOG1("%s camera id:%d", __func__, mCameraId);
-+
-+    AutoMutex   l(mLock);
-+    for (auto device : mDevices) {
-+        device->removeFrameListener(listener);
-+    }
-+}
-+
-+void CaptureUnit::removeAllFrameAvailableListener()
-+{
-+    LOG1("%s camera id:%d", __func__, mCameraId);
-+
-+    AutoMutex   l(mLock);
-+    for (auto device : mDevices) {
-+        device->removeAllFrameListeners();
-+    }
-+}
-+
-+void CaptureUnit::registerListener(EventType eventType, EventListener* eventListener)
-+{
-+    for (auto device : mDevices) {
-+        device->registerListener(eventType, eventListener);
-+    }
-+}
-+
-+void CaptureUnit::removeListener(EventType eventType, EventListener* eventListener)
-+{
-+    for (auto device : mDevices) {
-+        device->removeListener(eventType, eventListener);
-+    }
-+}
-+} // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/CaptureUnit.h b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
-new file mode 100644
-index 000000000000..995b57362fe3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
-@@ -0,0 +1,196 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <vector>
-+
-+#include "iutils/Thread.h"
-+
-+#include "StreamSource.h"
-+#include "CameraBuffer.h"
-+#include "DeviceBase.h"
-+#include "IspParamAdaptor.h"
-+
-+namespace icamera {
-+
-+/**
-+  * CaptureUnit abstract the ISYS function.
-+  * It implements the BufferProducer Interface and it is the source of any pipeline
-+  * It hides the v4l2 and media controller to the upper layer.
-+  */
-+class CaptureUnit : public StreamSource, public DeviceCallback {
-+
-+public:
-+    CaptureUnit(int cameraId, int memType = V4L2_MEMORY_MMAP);
-+    virtual ~CaptureUnit();
-+
-+public:
-+    /**
-+     * \brief Queue on buffer to driver
-+     *
-+     * 1. Get the v4l2 buffer form the CameraBuffer
-+     * 2. Queue this v4l2 buffer to driver and save it to one queue.
-+     *
-+     * \param[in] port: Indicates the camBuffer belongs to which port
-+     * \param[in] camBuffer: the cameraBuffer queue to driver
-+     *
-+     * \return 0 if succeed, other value indicates failed
-+     */
-+    virtual int qbuf(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    /**
-+     * \brief allocate memory
-+     *
-+     * 1. Get the v4l2 buffer form the CameraBuffer
-+     * 2. Query the v4l2 buffer to get the offset
-+     * 3. Calling cameraBuffer class to allocate memory
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    virtual int allocateMemory(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    /**
-+     * \brief Add the frame buffer listener
-+     *
-+     * \param listener: the listener need to add
-+     */
-+    virtual void addFrameAvailableListener(BufferConsumer *listener);
-+
-+    /**
-+     * \brief Remove the frame buffer listener
-+     *
-+     * \param listener: the listener need to remove
-+     */
-+    virtual void removeFrameAvailableListener(BufferConsumer *listener);
-+
-+    /**
-+     * \brief Remove all the listeners
-+     */
-+    virtual void removeAllFrameAvailableListener();
-+
-+    /**
-+     * \brief CaptureUnit initialze
-+     */
-+    virtual int init();
-+
-+    /**
-+     * \brief CaptureUnit deinit
-+     *
-+     * 1. Destory all the buffer pool
-+     * 2. Deinit the v4l2 device
-+     * 3. Destory the poll thread
-+     */
-+    virtual void deinit();
-+
-+    /**
-+     * \brief CaptureUnit start
-+     *
-+     * 1. Stream on
-+     * 2. Running the pool Thread
-+     */
-+    virtual int start();
-+
-+    /**
-+     * \brief CaptureUnit stop
-+     *
-+     * 1. Stream off
-+     * 3. Release all the buffer queue
-+     * 3. Stop the pool thread.
-+     */
-+    virtual int stop();
-+
-+    /**
-+     * \brief configure the streams
-+     *
-+     * 1. Setup and reset the MediaControl links
-+     * 2. Set format to Capture Device
-+     *
-+     * \param outputFrames: The output frames' configuration for ISYS.
-+     * \param configModes: ConfigMode types
-+     * \param bufferNum: Buffer Number
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    virtual int configure(const std::map<Port, stream_t>& outputFrames,
-+                          const std::vector<ConfigMode>& configModes,
-+                          uint32_t bufferNum);
-+
-+    // Override EventSource API to delegate the listeners to DeviceBase.
-+    virtual void registerListener(EventType eventType, EventListener* eventListener);
-+    virtual void removeListener(EventType eventType, EventListener* eventListener);
-+
-+    // Overwrite DeviceCallback API
-+    void onDequeueBuffer();
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CaptureUnit);
-+
-+    int createDevices();
-+    void destroyDevices();
-+    DeviceBase* findDeviceByPort(Port port);
-+    Port findDefaultPort(const std::map<Port, stream_t>& frames) const;
-+
-+    int streamOn();
-+    void streamOff();
-+
-+    int poll();
-+
-+    bool isNewConfiguration(const std::map<Port, stream_t>& outputFrames);
-+
-+    int processPendingBuffers();
-+    int queueAllBuffers();
-+
-+private:
-+    /**
-+     * \brief The pool frame buffer thread
-+     */
-+    class PollThread: public Thread {
-+        CaptureUnit *mCaptureU;
-+        public:
-+            PollThread(CaptureUnit *hw) : mCaptureU(hw) { }
-+
-+            virtual bool threadLoop() {
-+                return (mCaptureU->poll() == 0);
-+            }
-+    };
-+
-+    PollThread* mPollThread;
-+
-+    // Guard for mCaptureUnit public API except dqbuf and qbuf
-+    Mutex mLock;
-+
-+    int mCameraId;
-+    int mMaxBuffersInDevice;  // To control the number of buffers enqueued, for per-frame control.
-+
-+    std::vector<ConfigMode> mConfigModes;
-+    std::map<Port, stream_t> mOutputFrameInfo;
-+    std::vector<DeviceBase*> mDevices;
-+    uint32_t mMaxBufferNum;
-+
-+    enum {
-+        CAPTURE_UNINIT,
-+        CAPTURE_INIT,
-+        CAPTURE_CONFIGURE,
-+        CAPTURE_START,
-+        CAPTURE_STOP,
-+    } mState;
-+    bool mExitPending;
-+};
-+
-+} // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.cpp b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
-new file mode 100644
-index 000000000000..8f7e5d2d02c7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
-@@ -0,0 +1,441 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <string>
-+#include <vector>
-+
-+#define LOG_TAG "DeviceBase"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Utils.h"
-+#include "linux/ipu-isys.h"
-+
-+#include "SyncManager.h"
-+#include "PlatformData.h"
-+#include "DeviceBase.h"
-+#include "CameraEventType.h"
-+#include "V4l2DeviceFactory.h"
-+
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+DeviceBase::DeviceBase(int cameraId, VideoNodeType nodeType, VideoNodeDirection nodeDirection,
-+                       DeviceCallback* deviceCB) :
-+        mCameraId(cameraId),
-+        mPort(INVALID_PORT),
-+        mNodeType(nodeType),
-+        mNodeDirection(nodeDirection),
-+        mName(GetNodeName(nodeType)),
-+        mLatestSequence(-1),
-+        mNeedSkipFrame(false),
-+        mDeviceCB(deviceCB),
-+        mMaxBufferNumber(MAX_BUFFER_COUNT)
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
-+
-+    std::string devName;
-+    int ret = PlatformData::getDevNameByType(cameraId, nodeType, devName);
-+    CheckError(ret != OK, VOID_VALUE,
-+               "Failed to get video device name for cameraId: %d, node type: %d",
-+               cameraId, nodeType);
-+
-+    mDevice = new V4L2VideoNode(devName);
-+}
-+
-+DeviceBase::~DeviceBase()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    delete mDevice;
-+}
-+
-+int DeviceBase::openDevice()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    if (PlatformData::isEnableFrameSyncCheck(mCameraId))
-+        SyncManager::getInstance()->updateSyncCamNum();
-+
-+    return mDevice->Open(O_RDWR);
-+}
-+
-+void DeviceBase::closeDevice()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+    {
-+        AutoMutex l(mBufferLock);
-+
-+        std::vector<V4L2Buffer> bufs;
-+        mDevice->SetupBuffers(0, true, mDevice->GetMemoryType(), &bufs);
-+
-+        mPendingBuffers.clear();
-+        mBuffersInDevice.clear();
-+        mAllocatedBuffers.clear();
-+    }
-+
-+    mDevice->Close();
-+}
-+
-+int DeviceBase::configure(Port port, const stream_t& config, uint32_t bufferNum)
-+{
-+    LOG1("%s, camera id:%d device:%s, port:%d", __func__, mCameraId, mName, port);
-+
-+    mPort = port;
-+    mMaxBufferNumber = bufferNum;
-+
-+    int ret = createBufferPool(config);
-+    CheckError(ret != OK, NO_MEMORY, "Failed to create buffer pool:%d", ret);
-+
-+    resetBuffers();
-+
-+    return OK;
-+}
-+
-+int DeviceBase::streamOn()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    mFrameSkipNum = PlatformData::getInitialSkipFrame(mCameraId);
-+
-+    return mDevice->Start();
-+}
-+
-+int DeviceBase::streamOff()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    mDevice->Stop(false);
-+
-+    return OK;
-+}
-+
-+int DeviceBase::queueBuffer(long sequence)
-+{
-+    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    shared_ptr<CameraBuffer> buffer;
-+    AutoMutex l(mBufferLock);
-+    if (mPendingBuffers.empty()) {
-+        LOG2("Device:%s has no pending buffer to be queued.", mName);
-+        return OK;
-+    }
-+    buffer = mPendingBuffers.front();
-+
-+    int ret = onQueueBuffer(sequence, buffer);
-+    CheckError(ret != OK, ret, "Device:%s failed to preprocess the buffer with ret=%d", mName, ret);
-+
-+    ret = mDevice->PutFrame(&buffer->getV4L2Buffer());
-+
-+    if (ret >= 0) {
-+        mPendingBuffers.pop_front();
-+        mBuffersInDevice.push_back(buffer);
-+    }
-+
-+    return ret;
-+}
-+
-+int DeviceBase::dequeueBuffer()
-+{
-+    LOG2("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+
-+    shared_ptr<CameraBuffer> camBuffer = getFirstDeviceBuffer();
-+    CheckError(!camBuffer, UNKNOWN_ERROR, "No buffer in device:%s.", mName);
-+
-+    int ret = OK;
-+    int targetIndex = camBuffer->getIndex();
-+
-+    V4L2Buffer &vbuf = camBuffer->getV4L2Buffer();
-+    int actualIndex = mDevice->GrabFrame(&vbuf);
-+
-+    CheckError(actualIndex < 0, BAD_VALUE, "Device grabFrame failed:%d", actualIndex);
-+    if (actualIndex != targetIndex) {
-+        LOGE("%s, CamBuf index isn't same with index used by kernel", __func__);
-+        ret = BAD_VALUE;
-+    }
-+
-+    mNeedSkipFrame = needQueueBack(camBuffer);
-+    popBufferFromDevice();
-+
-+    // TODO: Will add device name info to distinguish different devices.
-+    PERF_CAMERA_ATRACE_PARAM3("grabFrame SeqID", camBuffer->getSequence(),
-+                              "csi2_port",       camBuffer->getCsi2Port(),
-+                              "virtual_channel", camBuffer->getVirtualChannel());
-+
-+    ret |= onDequeueBuffer(camBuffer);
-+
-+    // Skip initial frames if needed.
-+    if (mFrameSkipNum > 0) {
-+        mFrameSkipNum--;
-+    }
-+    return ret;
-+}
-+
-+int DeviceBase::getBufferNumInDevice()
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    return mBuffersInDevice.size();
-+}
-+
-+void DeviceBase::resetBuffers()
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    mBuffersInDevice.clear();
-+    mPendingBuffers.clear();
-+
-+    for (const auto& buffer : mAllocatedBuffers) {
-+        mPendingBuffers.push_back(buffer);
-+    }
-+}
-+
-+bool DeviceBase::hasPendingBuffer()
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    return !mPendingBuffers.empty();
-+}
-+
-+void DeviceBase::addPendingBuffer(const shared_ptr<CameraBuffer>& buffer)
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    mPendingBuffers.push_back(buffer);
-+}
-+
-+long DeviceBase::getPredictSequence()
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    return mLatestSequence + mFrameSkipNum + mBuffersInDevice.size();
-+}
-+
-+shared_ptr<CameraBuffer> DeviceBase::getFirstDeviceBuffer()
-+{
-+    AutoMutex l(mBufferLock);
-+
-+    return mBuffersInDevice.empty() ? nullptr : mBuffersInDevice.front();
-+}
-+
-+bool DeviceBase::skipFrameAfterSyncCheck(long sequence)
-+{
-+    //For multi-camera sensor, to check whether the frame synced or not
-+    int count = 0;
-+    const int timeoutDuration = gSlowlyRunRatio ? (gSlowlyRunRatio * 1000000) : 1000;
-+    const int maxCheckTimes = 10;  //10 times
-+    while (!SyncManager::getInstance()->isSynced(mCameraId, sequence)) {
-+        usleep(timeoutDuration);
-+        count++;
-+        if (count > maxCheckTimes) {
-+            return true;
-+        }
-+    }
-+    return false;
-+}
-+
-+void DeviceBase::popBufferFromDevice()
-+{
-+    AutoMutex l(mBufferLock);
-+    if (mBuffersInDevice.empty()) {
-+        return;
-+    }
-+
-+    shared_ptr<CameraBuffer> camBuffer = mBuffersInDevice.front();
-+    mBuffersInDevice.pop_front();
-+    mLatestSequence = camBuffer->getSequence();
-+
-+    if (mNeedSkipFrame) {
-+        mPendingBuffers.push_back(camBuffer);
-+    }
-+}
-+
-+void DeviceBase::dumpFrame(const shared_ptr<CameraBuffer>& buffer)
-+{
-+    if (!CameraDump::isDumpTypeEnable(DUMP_ISYS_BUFFER)) return;
-+
-+    LOGD("@%s, ISYS: fmt:%s(%dx%d), stride:%d, len:%d", __func__,
-+         CameraUtils::format2string(buffer->getFormat()).c_str(),
-+         buffer->getWidth(), buffer->getHeight(), buffer->getStride(), buffer->getBufferSize());
-+
-+    CameraDump::dumpImage(mCameraId, buffer, M_ISYS, mPort);
-+}
-+
-+MainDevice::MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB) :
-+        DeviceBase(cameraId, nodeType, INPUT_VIDEO_NODE, deviceCB)
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+}
-+
-+MainDevice::~MainDevice()
-+{
-+    LOG1("%s, camera id:%d device:%s", __func__, mCameraId, mName);
-+}
-+
-+int MainDevice::createBufferPool(const stream_t& config)
-+{
-+    LOG1("%s, camera id:%d, fmt:%s(%dx%d) field:%d", __func__, mCameraId,
-+         CameraUtils::pixelCode2String(config.format), config.width, config.height, config.field);
-+
-+    // Pass down ISYS compression flag to driver, which is CSI-BE output compression
-+    bool isISYSCompression = PlatformData::getISYSCompression(mCameraId);
-+    if (PlatformData::isCSIBackEndCapture(mCameraId)) {
-+        std::string csiBEDeviceNodeName;
-+        int ret = PlatformData::getDevNameByType(mCameraId, VIDEO_GENERIC, csiBEDeviceNodeName);
-+        CheckError(ret != OK, ret, "failed to get CSI-BE device node name, ret=%d", ret);
-+        LOG1("csiBEDeviceNodeName is %s", csiBEDeviceNodeName.c_str());
-+
-+        V4L2Subdevice* csiBESubDev = V4l2DeviceFactory::getSubDev(mCameraId, csiBEDeviceNodeName);
-+        ret = csiBESubDev->SetControl(V4L2_CID_IPU_ISYS_COMPRESSION, isISYSCompression);
-+        LOG2("@%s, set control compression for BE capture, node name: %s, ret:%d",
-+                __func__, csiBEDeviceNodeName.c_str(), ret);
-+    }
-+
-+    bool setWithHeaderCtl = true;
-+    std::string subDeviceNodeName;
-+
-+    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
-+        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
-+        if (PlatformData::isTPGReceiver(mCameraId)) {
-+            LOG1("%s: no need to set csi header ctrl for tpg", __func__);
-+            setWithHeaderCtl = false;
-+        }
-+    } else {
-+        setWithHeaderCtl = false;
-+    }
-+
-+    int withHeader = 1;
-+    struct v4l2_format v4l2fmt;
-+    v4l2fmt.fmt.pix_mp.field = config.field;
-+
-+    if (PlatformData::isCSIFrontEndCapture(mCameraId)) {
-+        int planesNum = CameraUtils::getNumOfPlanes(config.format);
-+        LOG1("@%s Num of planes: %d, mCameraId:%d", __func__, planesNum, mCameraId);
-+
-+        v4l2fmt.fmt.pix_mp.width = config.width;
-+        v4l2fmt.fmt.pix_mp.height = config.height;
-+        v4l2fmt.fmt.pix_mp.num_planes = planesNum;
-+        v4l2fmt.fmt.pix_mp.pixelformat = config.format;
-+        for (int i = 0; i < v4l2fmt.fmt.pix_mp.num_planes; i++) {
-+            v4l2fmt.fmt.pix_mp.plane_fmt[i].bytesperline = config.width;
-+            v4l2fmt.fmt.pix_mp.plane_fmt[i].sizeimage = 0;
-+        }
-+        // The frame data is without header(MIPI STORE MODE) when
-+        // format is YUV/RGB and frame output from CSI-Front-End entity.
-+        if (!CameraUtils::isRaw(config.format)) {
-+            LOG2("@%s, set frame without header for format: %s",
-+                    __func__, CameraUtils::pixelCode2String(config.format));
-+            withHeader = 0;
-+        }
-+    } else {
-+        v4l2fmt.fmt.pix.width = config.width;
-+        v4l2fmt.fmt.pix.height = config.height;
-+        v4l2fmt.fmt.pix.pixelformat = config.format;
-+        v4l2fmt.fmt.pix.bytesperline = config.width;
-+        v4l2fmt.fmt.pix.sizeimage = 0;
-+    }
-+
-+    if (setWithHeaderCtl) {
-+        V4L2Subdevice* receiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
-+        int ret = receiverSubDev->SetControl(V4L2_CID_IPU_STORE_CSI2_HEADER, withHeader);
-+        CheckError(ret != OK, ret, "set v4l2 store csi2 header failed, ret=%d", ret);
-+    }
-+
-+    v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-+    V4L2Format tmpbuf {v4l2fmt};
-+    int ret = mDevice->SetFormat(tmpbuf);
-+    CheckError(ret != OK, ret, "set v4l2 format failed ret=%d", ret);
-+    v4l2fmt = *tmpbuf.Get();
-+
-+    int realBufferSize = v4l2fmt.fmt.pix.sizeimage;
-+    int calcBufferSize = 0;
-+    if (isISYSCompression) {
-+        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height, false, true, true);
-+    } else {
-+        calcBufferSize = CameraUtils::getFrameSize(config.format, config.width, config.height);
-+    }
-+
-+    CheckError(calcBufferSize < realBufferSize, BAD_VALUE,
-+        "realBufferSize %d is larger than calcBufferSize %d.", realBufferSize, calcBufferSize);
-+
-+    LOG2("@%s: compression:%d, realBufSize:%d, calcBufSize:%d",
-+                __func__, isISYSCompression, realBufferSize, calcBufferSize);
-+
-+    std::vector<V4L2Buffer> bufs;
-+    int bufNum = mDevice->SetupBuffers(mMaxBufferNumber, true,
-+                                       static_cast<enum v4l2_memory>(config.memType), &bufs);
-+
-+    CheckError(bufNum < 0, BAD_VALUE, "request buffers failed return=%d", bufNum);
-+
-+    return OK;
-+}
-+
-+int MainDevice::onDequeueBuffer(shared_ptr<CameraBuffer> buffer)
-+{
-+    mDeviceCB->onDequeueBuffer();
-+
-+    if (mNeedSkipFrame) return OK;
-+
-+    LOG2("@%s, sequence:%ld, field:%d, timestamp: sec=%ld, usec=%ld",
-+          __func__, buffer->getSequence(), buffer->getField(),
-+          buffer->getTimestamp().tv_sec, buffer->getTimestamp().tv_usec);
-+
-+    for (auto& consumer : mConsumers) {
-+        consumer->onFrameAvailable(mPort, buffer);
-+    }
-+
-+    EventData frameData;
-+    frameData.type = EVENT_ISYS_FRAME;
-+    frameData.buffer = nullptr;
-+    frameData.data.frame.sequence = buffer->getSequence();
-+    frameData.data.frame.timestamp.tv_sec = buffer->getTimestamp().tv_sec;
-+    frameData.data.frame.timestamp.tv_usec = buffer->getTimestamp().tv_usec;
-+    notifyListeners(frameData);
-+
-+    dumpFrame(buffer);
-+
-+    return OK;
-+}
-+
-+bool MainDevice::needQueueBack(shared_ptr<CameraBuffer> buffer)
-+{
-+    bool needSkipFrame = (mFrameSkipNum > 0);
-+
-+    const V4L2Buffer& vbuf = buffer->getV4L2Buffer();
-+    // Check for STR2MMIO Error from kernel space
-+    if((vbuf.Flags() & V4L2_BUF_FLAG_ERROR) && PlatformData::isSkipFrameOnSTR2MMIOErr(mCameraId)) {
-+        // On STR2MMIO error, enqueue this buffer back to V4L2 before notifying the
-+        // listener/consumer and return
-+        needSkipFrame = true;
-+    }
-+    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
-+        struct camera_buf_info sharedCamBufInfo;
-+        sharedCamBufInfo.sequence = buffer->getSequence();
-+        sharedCamBufInfo.sof_ts = buffer->getTimestamp();
-+        SyncManager::getInstance()->updateCameraBufInfo(mCameraId, &sharedCamBufInfo);
-+        if (skipFrameAfterSyncCheck(buffer->getSequence())) {
-+            LOG1("@%s: CameraID:%d sequence %ld been dropped due to frame not sync",
-+                  __func__, mCameraId, buffer->getSequence());
-+            needSkipFrame = true;
-+        }
-+    }
-+    return needSkipFrame;
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/DeviceBase.h b/camera/hal/intel/ipu6/src/core/DeviceBase.h
-new file mode 100644
-index 000000000000..753604c7550d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/DeviceBase.h
-@@ -0,0 +1,171 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <set>
-+#include <list>
-+#include <atomic>
-+
-+#include "iutils/Thread.h"
-+#include "v4l2/NodeInfo.h"
-+#include "BufferQueue.h"
-+#include "CameraBuffer.h"
-+#include "IspParamAdaptor.h"
-+
-+namespace icamera {
-+
-+enum VideoNodeDirection {
-+    INPUT_VIDEO_NODE,   /*!< input video devices like cameras or capture cards */
-+    OUTPUT_VIDEO_NODE  /*!< output video devices like displays */
-+};
-+
-+class DeviceCallback {
-+public:
-+    DeviceCallback() {};
-+    virtual ~DeviceCallback() {};
-+    virtual void onDequeueBuffer() {};
-+};
-+
-+/**
-+ * DeviceBase is a base class of other devices which are for a particular purpose.
-+ * It provides: general operation of V4l2 devices, and secured buffer management.
-+ *
-+ * There are several virtual functions for subclass to override. The subclass should
-+ * base on what its implementation is to override one or several of them.
-+ */
-+class DeviceBase : public EventSource {
-+public:
-+    DeviceBase(int cameraId, VideoNodeType nodeType,
-+               VideoNodeDirection nodeDirection, DeviceCallback* deviceCB = nullptr);
-+    virtual ~DeviceBase();
-+
-+    int configure(Port port, const stream_t& config, uint32_t bufferNum);
-+
-+    int openDevice();
-+    void closeDevice();
-+
-+    int streamOn();
-+    int streamOff();
-+
-+    int queueBuffer(long sequence);
-+    int dequeueBuffer();
-+
-+    void addFrameListener(BufferConsumer *listener) { mConsumers.insert(listener); }
-+    void removeFrameListener(BufferConsumer *listener) { mConsumers.erase(listener); }
-+    void removeAllFrameListeners() { mConsumers.clear(); }
-+
-+    bool hasPendingBuffer();
-+    void addPendingBuffer(const std::shared_ptr<CameraBuffer>& buffer);
-+    long getPredictSequence();
-+    int getBufferNumInDevice();
-+    void resetBuffers();
-+    bool skipFrameAfterSyncCheck(long sequence);
-+
-+    V4L2VideoNode* getV4l2Device() { return mDevice; }
-+    const char* getName() { return mName; }
-+    Port getPort() { return mPort; }
-+
-+protected:
-+    /**
-+     * Configure the device and request or create(if needed) the buffer pool.
-+     */
-+    virtual int createBufferPool(const stream_t& config) { return OK; }
-+
-+    /**
-+     * Pre-process the buffer which to be queued to the device.
-+     */
-+    virtual int onQueueBuffer(long sequence, std::shared_ptr<CameraBuffer>& buffer) { return OK; }
-+
-+    /**
-+     * Post-process the buffer after it's dequeued from the device.
-+     */
-+    virtual int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer) { return OK; }
-+
-+    /**
-+     * Return whether the buffer needs to be queued back to mPendingBuffers.
-+     */
-+    virtual bool needQueueBack(std::shared_ptr<CameraBuffer> buffer) { return false; }
-+
-+    void dumpFrame(const std::shared_ptr<CameraBuffer>& buffer);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(DeviceBase);
-+
-+    /**
-+     * Get one available buffer from mBuffersInDevice
-+     *
-+     * Return the front buffer of mBuffersInDevice if available, otherwise return nullptr.
-+     */
-+    std::shared_ptr<CameraBuffer> getFirstDeviceBuffer();
-+
-+    /**
-+     * Pop the first buffer in mBuffersInDevice.
-+     * Add the buffer back to mPendingBuffers if needed.
-+     */
-+    void popBufferFromDevice();
-+
-+protected:
-+    int mCameraId;
-+    Port mPort;
-+    VideoNodeType mNodeType;
-+    VideoNodeDirection mNodeDirection;
-+    const char* mName;
-+    V4L2VideoNode* mDevice; // The device used to queue/dequeue buffers.
-+    long mLatestSequence; // Track the latest bufffer sequence from driver.
-+    bool mNeedSkipFrame; // True if the frame/buffer needs to be skipped.
-+    int mFrameSkipNum; // How many frames need to be skipped after stream on.
-+    DeviceCallback* mDeviceCB;
-+    std::set<BufferConsumer*> mConsumers;
-+
-+    /**
-+     * Each device has below three structures to manager its buffers.
-+     * And please note that:
-+     * 1. If the buffer is not allocated inside CaptureUnit, mAllocatedBuffers will be empty.
-+     * 2. Buffer to be queued into drive comes from mPendingBuffers.
-+     * 3. Buffer to be dequeued from driver comes from mBuffersInDevice.
-+     * 4. To make code clean, no null CameraBuffer is allowed to be put into these structures.
-+     * 5. The buffer cannot be in both mPendingBuffers and mBuffersInDevice.
-+     *    We must make the data consistent.
-+     */
-+    std::vector<std::shared_ptr<CameraBuffer>> mAllocatedBuffers;
-+            // Save all buffers allocated internally.
-+    std::list<std::shared_ptr<CameraBuffer>> mPendingBuffers;
-+            // The buffers that are going to be queued.
-+    std::list<std::shared_ptr<CameraBuffer>> mBuffersInDevice; // The buffers that have been queued
-+    Mutex mBufferLock; // The lock for protecting the internal buffers.
-+
-+    uint32_t mMaxBufferNumber;
-+};
-+
-+/**
-+ * MainDevice is a most commonly used device.
-+ * It's usually for producing video frames.
-+ */
-+class MainDevice : public DeviceBase {
-+public:
-+    MainDevice(int cameraId, VideoNodeType nodeType, DeviceCallback* deviceCB);
-+    ~MainDevice();
-+
-+private:
-+    int createBufferPool(const stream_t& config);
-+    int onDequeueBuffer(std::shared_ptr<CameraBuffer> buffer);
-+    bool needQueueBack(std::shared_ptr<CameraBuffer> buffer);
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
-new file mode 100644
-index 000000000000..0d5e659a3298
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
-@@ -0,0 +1,850 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "IspParamAdaptor"
-+
-+#include <stdio.h>
-+
-+#include "IspParamAdaptor.h"
-+
-+#include "3a/AiqResult.h"
-+#include "3a/AiqResultStorage.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Errors.h"
-+#include "PlatformData.h"
-+#include "IGraphConfig.h"
-+
-+#include "ia_pal_types_isp_ids_autogen.h"
-+
-+namespace icamera {
-+
-+IspParamAdaptor::IspParamAdaptor(int cameraId, PgParamType type) :
-+        mIspAdaptorState(ISP_ADAPTOR_NOT_INIT),
-+        mCameraId(cameraId),
-+        mPgParamType(type),
-+        mTuningMode(TUNING_MODE_VIDEO),
-+        mIspAdaptHandle(nullptr),
-+        mBCompResults(nullptr),
-+        mCurIspParamIndex(-1),
-+        mGCM(nullptr),
-+        mAdaptor(nullptr)
-+{
-+    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
-+    CLEAR(mFrameParam);
-+    CLEAR(mCurrentIpuParam);
-+
-+    if (PlatformData::getGraphConfigNodes(cameraId)) {
-+        mGCM = IGraphConfigManager::getInstance(cameraId);
-+    }
-+
-+    mAdaptor = std::unique_ptr<IntelIspParamAdaptor>(new IntelIspParamAdaptor());
-+}
-+
-+IspParamAdaptor::~IspParamAdaptor()
-+{
-+    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
-+}
-+
-+int IspParamAdaptor::init()
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    AutoMutex l(mIspAdaptorLock);
-+
-+    mIspAdaptorState = ISP_ADAPTOR_INIT;
-+    return OK;
-+}
-+
-+int IspParamAdaptor::deinit()
-+{
-+    LOG1("ISP HW param adaptor de-initialized for camera id:%d type:%d", mCameraId, mPgParamType);
-+    AutoMutex l(mIspAdaptorLock);
-+
-+    deinitIspAdaptHandle();
-+
-+    //Release the memory and clear the mapping
-+    for (auto& pgMap: mStreamIdToProgramGroupMap) {
-+        delete[] pgMap.second.run_kernels;
-+    }
-+    mStreamIdToProgramGroupMap.clear();
-+    mStreamIdToPGOutSizeMap.clear();
-+    releaseIspParamBuffers();
-+
-+    CLEAR(mFrameParam);
-+    CLEAR(mCurrentIpuParam);
-+
-+    mIspAdaptorState = ISP_ADAPTOR_NOT_INIT;
-+    return OK;
-+}
-+
-+int IspParamAdaptor::initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode)
-+{
-+    int ret = OK;
-+
-+    if (!PlatformData::isEnableAIQ(mCameraId)) {
-+        return ret;
-+    }
-+
-+    ia_binary_data ispData;
-+    ia_cmc_t *cmcData = nullptr;
-+    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
-+
-+    CpfStore* cpf = PlatformData::getCpfStore(mCameraId);
-+    CheckError((cpf == nullptr), NO_INIT, "@%s, No CPF for cameraId:%d", __func__, mCameraId);
-+    ret = cpf->getDataAndCmc(&ispData, nullptr, nullptr, &cmcHandle, tuningMode, &cmcData);
-+    CheckError(ret != OK, NO_INIT, "get cpf and cmc data failed");
-+
-+    int statsNum = PlatformData::getExposureNum(mCameraId,
-+                                                CameraUtils::isMultiExposureCase(tuningMode));
-+    mIspAdaptHandle = mAdaptor->init(&ispData, reinterpret_cast<ia_cmc_t*>(cmcHandle),
-+                                     MAX_STATISTICS_WIDTH, MAX_STATISTICS_HEIGHT,
-+                                     statsNum, nullptr);
-+    CheckError(!mIspAdaptHandle, NO_INIT, "ISP adaptor failed to initialize");
-+
-+    /*
-+     * The number of streamId is identified in configure stream,
-+     * fill the mStreamIdToProgramGroupMap and allocate the IspParameter memory
-+     */
-+    if (mGCM != nullptr && mGCM->isGcConfigured()) {
-+        ret = initProgramGroupForAllStreams(configMode);
-+        CheckError(ret != OK, ret, "%s, Failed to init programGroup for all streams", __func__);
-+        ret = allocateIspParamBuffers();
-+        CheckError(ret != OK, ret, "%s, Failed to allocate isp parameter buffers", __func__);
-+    }
-+
-+    LOG1("ISP HW param adaptor initialized successfully camera id:%d", mCameraId);
-+
-+    return ret;
-+}
-+
-+void IspParamAdaptor::deinitIspAdaptHandle()
-+{
-+    if (mIspAdaptHandle) {
-+        mAdaptor->deInit(mIspAdaptHandle);
-+        mIspAdaptHandle = nullptr;
-+    }
-+
-+}
-+
-+int IspParamAdaptor::initProgramGroupForAllStreams(ConfigMode configMode)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    std::vector<int32_t> streamIds;
-+
-+    //Release the memory and clear the mapping
-+    for (auto& pgMap: mStreamIdToProgramGroupMap) {
-+        delete[] pgMap.second.run_kernels;
-+    }
-+    mStreamIdToProgramGroupMap.clear();
-+    mStreamIdToPGOutSizeMap.clear();
-+    mStreamIdToMbrDataMap.clear();
-+
-+    std::shared_ptr<IGraphConfig> graphConfig = mGCM->getGraphConfig(configMode);
-+    if(graphConfig == nullptr) {
-+        LOGW("There isn't GraphConfig for camera configMode: %d", configMode);
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    if (mPgParamType == PG_PARAM_ISYS) {
-+        int streamId = 0; // 0 is for PG_PARAM_ISYS
-+        streamIds.push_back(streamId);
-+    } else {
-+        status_t ret = graphConfig->graphGetStreamIds(streamIds);
-+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get the PG streamIds");
-+    }
-+
-+    for (auto id : streamIds) {
-+        ia_isp_bxt_program_group *pgPtr = graphConfig->getProgramGroup(id);
-+        if (pgPtr != nullptr) {
-+            ia_isp_bxt_program_group programGroup;
-+            CLEAR(programGroup);
-+            programGroup.run_kernels = new ia_isp_bxt_run_kernels_t[pgPtr->kernel_count];
-+
-+            // Skip those kernels with 0 uuid which isn't PAL uuid
-+            for (unsigned int i = 0; i < pgPtr->kernel_count; i++) {
-+                if (pgPtr->run_kernels[i].kernel_uuid != 0) {
-+                    MEMCPY_S(&programGroup.run_kernels[programGroup.kernel_count],
-+                             sizeof(ia_isp_bxt_run_kernels_t),
-+                             &pgPtr->run_kernels[i],
-+                             sizeof(ia_isp_bxt_run_kernels_t));
-+                    programGroup.kernel_count++;
-+                } else {
-+                    LOG1("There is 0 uuid found, stream id %d", id);
-+                }
-+            }
-+
-+            // Override the stream id in kernel list with the one in sensor's config file.
-+            // Remove this after the sensor's tuning file uses correct stream id.
-+            int streamId = PlatformData::getStreamIdByConfigMode(mCameraId, configMode);
-+            if (streamId != -1) {
-+                programGroup.run_kernels->stream_id = streamId;
-+            }
-+
-+            mStreamIdToProgramGroupMap[id] = programGroup;
-+            mStreamIdToPGOutSizeMap[id] = mAdaptor->getPalDataSize(&programGroup);
-+            ia_isp_bxt_gdc_limits mbrData;
-+            status_t ret  = graphConfig->getMBRData(id, &mbrData);
-+            if (ret == OK) {
-+                mStreamIdToMbrDataMap[id] = mbrData;
-+                LOG2("get mbr data for stream:%d:%f,%f,%f,%f",
-+                     id, mbrData.rectilinear.zoom, mbrData.rectilinear.pitch,
-+                     mbrData.rectilinear.yaw, mbrData.rectilinear.roll);
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void IspParamAdaptor::initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type)
-+{
-+    CheckError(params == nullptr, VOID_VALUE, "NULL input parameter");
-+
-+    if (type == PG_PARAM_PSYS_ISA) {
-+        params->ee_setting.feature_level = ia_isp_feature_level_low;
-+        params->ee_setting.strength = 0;
-+        LOG2("%s: set initial default edge enhancement setting: level: %d, strengh: %d",
-+            __func__, params->ee_setting.feature_level, params->ee_setting.strength);
-+
-+        params->nr_setting.feature_level = ia_isp_feature_level_high;
-+        params->nr_setting.strength = 0;
-+        LOG2("%s: set initial default noise setting: level: %d, strengh: %d",
-+            __func__, params->nr_setting.feature_level, params->nr_setting.strength);
-+    }
-+}
-+
-+int IspParamAdaptor::postConfigure(int width, int height)
-+{
-+    // The PG wrapper init is done by the imaging controller.
-+    if(mPgParamType == PG_PARAM_PSYS_ISA) {
-+        mIspAdaptorState = ISP_ADAPTOR_CONFIGURED;
-+        return OK; //No need to do anything for P2P. It id done by libiacss
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * configure
-+ *
-+ * (graph config version)
-+ * This is the method used when the spatial parameters change, usually during
-+ * stream configuration.
-+ *
-+ * We initialize the ISP adaptor to produce worst case scenario for memory
-+ * allocation.
-+ *
-+ * At this state we initialize the wrapper code that helps encoding the PG
-+ * descriptor and terminal payloads (i.e. the parameters for the PG).
-+ *
-+ * \param configMode[IN]: The real configure mode.
-+ * \param tuningMode[IN]:  The tuning mode.
-+ * \param stream[IN]: frame info.
-+ * \return OK: everything went ok.
-+ * \return UNKNOWN_ERROR: First run of ISP adaptation failed.
-+ * \return NO_INIT: Initialization of P2P or PG_DIE wrapper failed.
-+ */
-+int IspParamAdaptor::configure(const stream_t &stream,
-+        ConfigMode configMode, TuningMode tuningMode)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    AutoMutex l(mIspAdaptorLock);
-+
-+    mTuningMode = tuningMode;
-+
-+    ia_isp_bxt_input_params_v2 inputParams;
-+    CLEAR(inputParams);
-+    ia_aiq_sa_results_v1 fakeSaResults;
-+    CLEAR(fakeSaResults);
-+
-+    deinitIspAdaptHandle();
-+    int ret = initIspAdaptHandle(configMode, tuningMode);
-+    CheckError(ret != OK, ret, "%s, init Isp Adapt Handle failed %d", __func__, ret);
-+
-+    SensorFrameParams param;
-+    int status = PlatformData::calculateFrameParams(mCameraId, param);
-+    CheckError(status != OK, status, "%s: Failed to calculate frame params", __func__);
-+    AiqUtils::convertToAiqFrameParam(param, mFrameParam);
-+
-+    LOG1("horizontal_crop_offset:%d", mFrameParam.horizontal_crop_offset);
-+    LOG1("vertical_crop_offset:%d", mFrameParam.vertical_crop_offset);
-+    LOG1("cropped_image_width:%d", mFrameParam.cropped_image_width);
-+    LOG1("cropped_image_height:%d", mFrameParam.cropped_image_height);
-+    LOG1("horizontal_scaling_numerator:%d", mFrameParam.horizontal_scaling_numerator);
-+    LOG1("horizontal_scaling_denominator:%d", mFrameParam.horizontal_scaling_denominator);
-+    LOG1("vertical_scaling_numerator:%d", mFrameParam.vertical_scaling_numerator);
-+    LOG1("vertical_scaling_denominator:%d", mFrameParam.vertical_scaling_denominator);
-+
-+    /*
-+     * Construct the dummy Shading Adaptor  results to force the creation of
-+     * the LSC table.
-+     * Assign them to the AIC input parameter structure.
-+     */
-+    unsigned short fakeLscTable[4] = {1,1,1,1};
-+    for (int i = 0; i < MAX_BAYER_ORDER_NUM; i++) {
-+        for (int j = 0; j < MAX_BAYER_ORDER_NUM; j++) {
-+            fakeSaResults.lsc_grid[i][j] = fakeLscTable;
-+        }
-+    }
-+    fakeSaResults.fraction_bits = 0;
-+    fakeSaResults.color_order = cmc_bayer_order_grbg;
-+    fakeSaResults.lsc_update = true;
-+    fakeSaResults.width = 2;
-+    fakeSaResults.height = 2;
-+    inputParams.sa_results = &fakeSaResults;
-+
-+    initInputParams(&inputParams, mPgParamType);
-+
-+    /*
-+     *  IA_ISP_BXT can run without 3A results to produce the defaults for a
-+     *  given sensor configuration.
-+     *  TODO: change the mCurrentIpuParam in the future.
-+     */
-+    mCurIspParamIndex = 0;
-+    IspParameter& ipuParam = mIspParameters[mCurIspParamIndex];
-+
-+    ipuParam.sequence = -1;
-+    for (auto& binaryMap : ipuParam.streamIdToDataMap) {
-+        inputParams.program_group = &(mStreamIdToProgramGroupMap[binaryMap.first]);
-+        inputParams.sensor_frame_params = &mFrameParam;
-+        mCurrentIpuParam = binaryMap.second;
-+        mCurrentIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
-+
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
-+
-+        int ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &mCurrentIpuParam);
-+        CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
-+
-+        binaryMap.second.size = mCurrentIpuParam.size;
-+        ipuParam.dataAvailableMap[binaryMap.first] = true;
-+    }
-+
-+    dumpIspParameter(0);
-+
-+    return postConfigure(stream.width, stream.height);
-+}
-+
-+int IspParamAdaptor::getParameters(Parameters& param)
-+{
-+    AutoMutex l(mIspAdaptorLock);
-+
-+    return OK;
-+}
-+
-+int IspParamAdaptor::decodeStatsData(TuningMode tuningMode,
-+                                     std::shared_ptr<CameraBuffer> statsBuffer,
-+                                     std::shared_ptr<IGraphConfig> graphConfig)
-+{
-+    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED,
-+               INVALID_OPERATION, "%s, wrong state %d", __func__, mIspAdaptorState);
-+
-+    long sequence = statsBuffer->getSequence();
-+    AiqResultStorage *aiqResultStorage = AiqResultStorage::getInstance(mCameraId);
-+
-+    const AiqResult *feedback = aiqResultStorage->getAiqResult(sequence);
-+    if (feedback == nullptr) {
-+        LOGW("No aiq result of sequence %ld! Use the latest instead", sequence);
-+        feedback = aiqResultStorage->getAiqResult();
-+    }
-+
-+    camera_resolution_t dvsReso;
-+    CLEAR(dvsReso);
-+    if (graphConfig) {
-+        uint32_t gdcKernelId;
-+        graphConfig->getGdcKernelSetting(gdcKernelId, dvsReso);
-+    }
-+
-+    ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuffer->getBufferAddr());
-+    ConvertInputParam inputParams = {CameraUtils::isMultiExposureCase(tuningMode),
-+                                     hwStatsData, &dvsReso, &feedback->mAeResults, mBCompResults};
-+
-+    ConvertResult result;
-+    ia_isp_bxt_statistics_query_results_t queryResults;
-+    CLEAR(result);
-+    CLEAR(queryResults);
-+    result.queryResults = &queryResults;
-+
-+    int ret = mAdaptor->queryAndConvertStats(mIspAdaptHandle, &inputParams, &result);
-+    CheckError(ret != OK, ret, "%s, Faield to query and convert statistics", __func__);
-+
-+    // Decode DVS statistics
-+    if (queryResults.dvs_stats) {
-+        if (CameraDump::isDumpTypeEnable(DUMP_PSYS_DECODED_STAT) && hwStatsData != nullptr) {
-+            BinParam_t bParam;
-+            bParam.bType = BIN_TYPE_GENERAL;
-+            bParam.mType = M_PSYS;
-+            bParam.sequence = statsBuffer->getSequence();
-+            bParam.gParam.appendix = "dvs_p2p_decoded_stats";
-+            CameraDump::dumpBinary(mCameraId, hwStatsData->data, hwStatsData->size, &bParam);
-+        }
-+
-+        if (result.dvsStats) {
-+            DvsStatistics dvsStatsStorage(result.dvsStats, statsBuffer->getSequence());
-+            aiqResultStorage->updateDvsStatistics(dvsStatsStorage);
-+        } else {
-+            LOGW("Failed to get GDC kernel setting, DVS stats not decoded");
-+        }
-+    }
-+
-+    if (queryResults.rgbs_grid && queryResults.af_grid) {
-+        int exposureNum = PlatformData::getExposureNum(mCameraId, false);
-+        AiqStatistics *aiqStatistics = aiqResultStorage->acquireAiqStatistics();
-+
-+        if (*(result.rgbsGrid)) {
-+            dumpRgbsStats(*(result.rgbsGrid),
-+                          statsBuffer->getSequence(), feedback->mAeResults.num_exposures);
-+        }
-+        if (result.afGrid) {
-+            dumpAfStats(result.afGrid, statsBuffer->getSequence());
-+        }
-+
-+        aiqStatistics->saveRgbsGridData(result.rgbsGrid, exposureNum);
-+        aiqStatistics->saveAfGridData(result.afGrid);
-+        aiqStatistics->mSequence = sequence;
-+        aiqStatistics->mTimestamp = TIMEVAL2USECS(statsBuffer->getTimestamp());
-+        aiqStatistics->mTuningMode = tuningMode;
-+        aiqResultStorage->updateAiqStatistics(sequence);
-+    }
-+
-+    return OK;
-+}
-+
-+void IspParamAdaptor::updateKernelToggles(ia_isp_bxt_program_group programGroup) {
-+
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_KERNEL_TOGGLE)) return;
-+
-+    const char* ENABLED_KERNELS = "/tmp/enabledKernels";
-+    const char* DISABLED_KERNELS = "/tmp/disabledKernels";
-+    const int FLIE_CONT_MAX_LENGTH = 1024;
-+    ia_isp_bxt_run_kernels_t* curKernel = programGroup.run_kernels;
-+    char enabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
-+    char disabledKernels[FLIE_CONT_MAX_LENGTH] = { 0 };
-+
-+    int enLen = CameraUtils::getFileContent(ENABLED_KERNELS, enabledKernels, FLIE_CONT_MAX_LENGTH - 1);
-+    int disLen = CameraUtils::getFileContent(DISABLED_KERNELS, disabledKernels, FLIE_CONT_MAX_LENGTH - 1);
-+
-+    if (enLen == 0 && disLen == 0) {
-+        LOG2("%s: no explicit kernel toggle.", __func__);
-+        return;
-+    }
-+
-+    LOG2("%s: enabled kernels: %s, disabled kernels %s", __func__,
-+        enabledKernels, disabledKernels);
-+
-+    for (unsigned int i = 0; i < programGroup.kernel_count; i++) {
-+
-+        std::string curKernelUUID = std::to_string(curKernel->kernel_uuid);
-+
-+        LOG2("%s: checking kernel %s", __func__, curKernelUUID.c_str());
-+
-+        if (strstr(enabledKernels, curKernelUUID.c_str()) != nullptr) {
-+            curKernel->enable = 1;
-+            LOG2("%s: kernel %d is explicitly enabled", __func__,
-+                curKernel->kernel_uuid);
-+        }
-+
-+        if (strstr(disabledKernels, curKernelUUID.c_str()) != nullptr) {
-+            curKernel->enable = 0;
-+            LOG2("%s: kernel %d is explicitly disabled", __func__,
-+                curKernel->kernel_uuid);
-+        }
-+
-+        curKernel ++;
-+    }
-+}
-+
-+/**
-+ * runIspAdapt
-+ * Convert the results of the 3A algorithms and parse with P2P.
-+ */
-+int IspParamAdaptor::runIspAdapt(const IspSettings* ispSettings, long settingSequence, int32_t streamId)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    AutoMutex l(mIspAdaptorLock);
-+    CheckError(mIspAdaptorState != ISP_ADAPTOR_CONFIGURED, INVALID_OPERATION, "%s, wrong state %d",
-+          __func__, mIspAdaptorState);
-+
-+    int updateIndex = -1;
-+    // Check if the given sequence is already there, if so we need update it instead of
-+    // updating mCurIspParamIndex and using next buffer.
-+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
-+        if (mIspParameters[i].sequence == settingSequence) {
-+            updateIndex = i;
-+            break;
-+        }
-+    }
-+
-+    bool forceUpdate = false;
-+    if (updateIndex == -1) {
-+        mCurIspParamIndex++;
-+        mCurIspParamIndex = mCurIspParamIndex % ISP_PARAM_QUEUE_SIZE;
-+        updateIndex = mCurIspParamIndex;
-+        forceUpdate = true;
-+        // Only Store the new sequence
-+        LOG2("%s, the sequence list size: %zu", __func__, mSequenceList.size());
-+        if (mSequenceList.size() >= PlatformData::getMaxRawDataNum(mCameraId)) {
-+            mSequenceList.pop_front();
-+        }
-+        mSequenceList.push_back(settingSequence);
-+        mIspParameters[updateIndex].dataAvailableMap.clear();
-+    }
-+
-+    IspParameter& ipuParam = mIspParameters[updateIndex];
-+    LOG2("%s, current isp parameter index:%d, update index:%d, for sequence: %ld, stream %d",
-+         __func__, mCurIspParamIndex, updateIndex, settingSequence, streamId);
-+
-+    ipuParam.sequence = settingSequence;
-+    ia_isp_bxt_gdc_limits* mbrData = nullptr;
-+    for (auto& binaryMap : ipuParam.streamIdToDataMap) {
-+        if (!(streamId == -1 || binaryMap.first == streamId))
-+            continue;
-+        mCurrentIpuParam = binaryMap.second;
-+        mCurrentIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
-+        if (mStreamIdToMbrDataMap.find(binaryMap.first) != mStreamIdToMbrDataMap.end())
-+            mbrData = &(mStreamIdToMbrDataMap[binaryMap.first]);
-+
-+        int ret = runIspAdaptL(mStreamIdToProgramGroupMap[binaryMap.first],
-+                            mbrData, ispSettings, settingSequence, forceUpdate);
-+
-+        binaryMap.second.size = mCurrentIpuParam.size;
-+
-+        CheckError(ret != OK, ret, "run isp adaptor error for streamId %d, sequence: %ld",
-+                               binaryMap.first, settingSequence);
-+        ipuParam.dataAvailableMap[binaryMap.first] = true;
-+    }
-+
-+    return OK;
-+}
-+
-+const ia_binary_data* IspParamAdaptor::getIpuParameter(long sequence, int streamId)
-+{
-+    AutoMutex l(mIspAdaptorLock);
-+
-+    /* For old version.
-+     * TODO: We should get the ipu param according to streamId and
-+     * sequenceId when there are multi-streams in one pipe.
-+     */
-+    if (sequence == -1 && streamId == -1) {
-+        return &mCurrentIpuParam;
-+    }
-+
-+    ia_binary_data* ipuParam = nullptr;
-+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
-+        IspParameter& param = mIspParameters[i];
-+        if (param.sequence == sequence &&
-+            param.streamIdToDataMap.find(streamId) != param.streamIdToDataMap.end()) {
-+            if (param.dataAvailableMap.find(streamId) != param.dataAvailableMap.end()) {
-+                ipuParam = &param.streamIdToDataMap[streamId];
-+            } else {
-+                LOGW("data unavailable for stream %d, sequence %ld", streamId, sequence);
-+            }
-+            break;
-+        }
-+    }
-+
-+    if (ipuParam == nullptr) {
-+        LOGE("Failed to find ISP parameter for stream %d, sequence %ld", streamId, sequence);
-+        ipuParam = &mCurrentIpuParam;
-+    }
-+
-+    return ipuParam;
-+}
-+
-+/*
-+ * Allocate memory for mIspParameters
-+ * TODO: Let PAL to expose the max ia_binary_data buffer size which
-+ * come from mIspAdaptHandle->ia_pal.m_output_isp_parameters_size
-+ */
-+int IspParamAdaptor::allocateIspParamBuffers()
-+{
-+    releaseIspParamBuffers();
-+
-+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
-+        for (auto & pgMap : mStreamIdToProgramGroupMap) {
-+            ia_binary_data ispParam;
-+            int size = mStreamIdToPGOutSizeMap[pgMap.first];
-+            CLEAR(ispParam);
-+            ispParam.size = size;
-+            ispParam.data = mAdaptor->allocatePalBuffer(pgMap.first, i, size);
-+            CheckError(ispParam.data == nullptr, NO_MEMORY, "Faile to calloc the memory for isp parameter");
-+            mIspParameters[i].streamIdToDataMap[pgMap.first] = ispParam;
-+        }
-+        mIspParameters[i].sequence = -1;
-+        mIspParameters[i].dataAvailableMap.clear();
-+    }
-+
-+    return OK;
-+}
-+
-+void IspParamAdaptor::releaseIspParamBuffers()
-+{
-+    for (int i = 0; i < ISP_PARAM_QUEUE_SIZE; i++) {
-+        for (auto& binaryMap : mIspParameters[i].streamIdToDataMap)
-+            mAdaptor->freePalBuffer(binaryMap.second.data);
-+
-+        mIspParameters[i].sequence = -1;
-+        mIspParameters[i].streamIdToDataMap.clear();
-+        mIspParameters[i].dataAvailableMap.clear();
-+    }
-+}
-+
-+int IspParamAdaptor::runIspAdaptL(ia_isp_bxt_program_group programGroup,
-+                                  ia_isp_bxt_gdc_limits *mbrData,
-+                                  const IspSettings* ispSettings, long settingSequence,
-+                                  bool forceUpdate)
-+{
-+    PERF_CAMERA_ATRACE_IMAGING();
-+    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult(settingSequence));
-+    if (aiqResults == nullptr) {
-+        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, settingSequence);
-+        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(mCameraId)->getAiqResult());
-+        CheckError((aiqResults == nullptr), INVALID_OPERATION, "Cannot find available aiq result.");
-+    }
-+    CheckError((aiqResults->mSaResults.width * aiqResults->mSaResults.height == 0),
-+            INVALID_OPERATION, "No invalid aiq result needed to run Generic AIC");
-+
-+    LOG2("%s: device type: %d", __func__, mPgParamType);
-+
-+    ia_isp_bxt_input_params_v2 inputParams;
-+    ia_view_config_t viewConfig;
-+    CLEAR(inputParams);
-+    CLEAR(viewConfig);
-+
-+    // LOCAL_TONEMAP_S
-+    bool hasLtm = PlatformData::isLtmEnabled(mCameraId);
-+
-+    if (hasLtm) {
-+        size_t ltmLag = PlatformData::getLtmGainLag(mCameraId);
-+        long ltmSequence = settingSequence;
-+
-+        // Consider there may be skipped frames, so according to the gain lag and current
-+        // sequence to find the actual ltm sequence in history list.
-+        if (mSequenceList.size() > ltmLag) {
-+            size_t index = 0;
-+            for(auto iter = mSequenceList.begin(); iter != mSequenceList.end(); iter++) {
-+                if (*iter == settingSequence && index >= ltmLag) {
-+                    ltmSequence = *(std::prev(iter, ltmLag));
-+                    break;
-+                }
-+                index++;
-+            }
-+        }
-+        ltm_result_t* ltmResult = const_cast<ltm_result_t*>(AiqResultStorage::getInstance(mCameraId)->getLtmResult(ltmSequence));
-+        if (ltmResult != nullptr) {
-+            LOG2("%s: frame sequence %ld, ltm sequence %ld, actual sequence: %ld",
-+                    __func__, settingSequence, ltmSequence, ltmResult->sequence);
-+            inputParams.ltm_results = &ltmResult->ltmResults;
-+            inputParams.ltm_drc_params = &ltmResult->ltmDrcParams;
-+        }
-+    }
-+    // LOCAL_TONEMAP_E
-+
-+    // update metadata of runnning kernels
-+    if (mPgParamType == PG_PARAM_PSYS_ISA) {
-+        for (unsigned int i=0; i<programGroup.kernel_count; i++) {
-+            switch (programGroup.run_kernels[i].kernel_uuid) {
-+            case ia_pal_uuid_isp_tnr5_21:
-+            case ia_pal_uuid_isp_tnr5_22:
-+            case ia_pal_uuid_isp_tnr5_25:
-+                programGroup.run_kernels[i].metadata[0] = aiqResults->mSequence;
-+                LOG2("ia_pal_uuid_isp_tnr5_2x frame count = %d", programGroup.run_kernels[i].metadata[0]);
-+                break;
-+            case ia_pal_uuid_isp_bxt_ofa_dp:
-+            case ia_pal_uuid_isp_bxt_ofa_mp:
-+            case ia_pal_uuid_isp_bxt_ofa_ppp:
-+                programGroup.run_kernels[i].metadata[2] = aiqResults->mAiqParam.flipMode;
-+                LOG2("%s: flip mode set to %d", __func__, programGroup.run_kernels[i].metadata[2]);
-+
-+                programGroup.run_kernels[i].metadata[3] = aiqResults->mAiqParam.yuvColorRangeMode;
-+                LOG2("ofa yuv color range mode %d", programGroup.run_kernels[i].metadata[3]);
-+                break;
-+            }
-+        }
-+    }
-+
-+    // Enable or disable kernels according to environment variables for debug purpose.
-+    updateKernelToggles(programGroup);
-+
-+    inputParams.program_group = &programGroup;
-+    inputParams.sensor_frame_params = &mFrameParam;
-+
-+    inputParams.ae_results = &aiqResults->mAeResults;
-+    inputParams.gbce_results = &aiqResults->mGbceResults;
-+    inputParams.awb_results = &aiqResults->mAwbResults;
-+    inputParams.pa_results = &aiqResults->mPaResults;
-+    inputParams.sa_results = &aiqResults->mSaResults;
-+    inputParams.weight_grid = aiqResults->mAeResults.weight_grid;
-+
-+    if (aiqResults->mCustomControls.count > 0) {
-+        inputParams.custom_controls = &aiqResults->mCustomControls;
-+    }
-+
-+    if (ispSettings) {
-+        inputParams.nr_setting = ispSettings->nrSetting;
-+        inputParams.ee_setting = ispSettings->eeSetting;
-+        LOG2("%s: ISP NR setting, level: %d, strength: %d",
-+                __func__, (int)ispSettings->nrSetting.feature_level,
-+                (int)ispSettings->nrSetting.strength);
-+        inputParams.effects = ispSettings->effects;
-+        inputParams.manual_brightness = ispSettings->manualSettings.manualBrightness;
-+        inputParams.manual_contrast = ispSettings->manualSettings.manualContrast;
-+        inputParams.manual_hue = ispSettings->manualSettings.manualHue;
-+        inputParams.manual_saturation = ispSettings->manualSettings.manualSaturation;
-+        LOG2("%s: ISP EE setting, level: %d, strength: %d",
-+                __func__, ispSettings->eeSetting.feature_level,
-+                ispSettings->eeSetting.strength);
-+        // INTEL_DVS_S
-+        if (ispSettings->videoStabilization) {
-+            int dvsType = PlatformData::getDVSType(mCameraId);
-+            LOG2("%s: ISP Video Stabilization Mode Enable, dvs type %d", __func__, dvsType);
-+            DvsResult* dvsResult = const_cast<DvsResult*>(AiqResultStorage::getInstance(mCameraId)->getDvsResult());
-+            if (dvsType == MORPH_TABLE) {
-+                inputParams.dvs_morph_table = (dvsResult == nullptr) ? nullptr : &dvsResult->mMorphTable;
-+            } else if (dvsType == IMG_TRANS) {
-+                inputParams.gdc_transformation = (dvsResult == nullptr) ? nullptr : &dvsResult->mTransformation;
-+            }
-+        }
-+        // INTEL_DVS_E
-+
-+        inputParams.pal_override = ispSettings->palOverride;
-+    }
-+
-+    if (CameraUtils::isUllPsysPipe(mTuningMode)) {
-+        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
-+        // The situation that all DG passed to ISP, not sensor.
-+        if (!PlatformData::isUsingSensorDigitalGain(mCameraId)) {
-+            inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
-+        }
-+        // Fine-tune DG passed to ISP if partial ISP DG is needed.
-+        if (PlatformData::isUsingIspDigitalGain(mCameraId)) {
-+            inputParams.manual_digital_gain = PlatformData::getIspDigitalGain(mCameraId,
-+                                aiqResults->mAeResults.exposures[0].exposure->digital_gain);
-+        }
-+
-+        LOG3A("%s: set digital gain for ULL pipe: %f", __func__, inputParams.manual_digital_gain);
-+    } else if (CameraUtils::isMultiExposureCase(mTuningMode) &&
-+               PlatformData::getSensorGainType(mCameraId) == ISP_DG_AND_SENSOR_DIRECT_AG) {
-+        CheckError((aiqResults->mAeResults.exposures[0].exposure == nullptr), BAD_VALUE, "Aiq exposure is NULL.");
-+
-+        LOG3A("%s: all digital gain is passed to ISP, DG(%ld): %f",
-+              __func__, aiqResults->mSequence, aiqResults->mAeResults.exposures[0].exposure->digital_gain);
-+        inputParams.manual_digital_gain = aiqResults->mAeResults.exposures[0].exposure->digital_gain;
-+    }
-+
-+    if (forceUpdate) {
-+        inputParams.sa_results->lsc_update = true;
-+    }
-+
-+    int ret = OK;
-+    {
-+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
-+        ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &mCurrentIpuParam);
-+    }
-+    CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
-+
-+    dumpIspParameter(aiqResults->mSequence);
-+
-+    return OK;
-+}
-+
-+void IspParamAdaptor::dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence)
-+{
-+    if (!afGrid) return;
-+
-+    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT))
-+        return;
-+    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))
-+        return;
-+
-+    BinParam_t bParam;
-+    bParam.bType = BIN_TYPE_STATISTIC;
-+    bParam.mType = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
-+    bParam.sequence = sequence;
-+    bParam.sParam.gridWidth = afGrid->grid_width;
-+    bParam.sParam.gridHeight = afGrid->grid_height;
-+    bParam.sParam.appendix = "af_stats_filter_response_1";
-+    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_1,
-+                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
-+    bParam.sParam.appendix = "af_stats_filter_response_2";
-+    CameraDump::dumpBinary(mCameraId, afGrid->filter_response_2,
-+                           afGrid->grid_width * afGrid->grid_height * sizeof(int), &bParam);
-+}
-+
-+void IspParamAdaptor::dumpRgbsStats(ia_aiq_rgbs_grid *rgbsGrid, long sequence, unsigned int num)
-+{
-+    if (rgbsGrid == nullptr) return;
-+
-+    if (Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_AIQ)) {
-+        for (unsigned int i = 0; i < num; i++ ) {
-+            rgbs_grid_block *rgbsPtr = rgbsGrid[i].blocks_ptr;
-+            int size = rgbsGrid[i].grid_width * rgbsGrid[i].grid_height;
-+            // Print out some value to check if it's reasonable
-+            for (int j = 100; j < 105 && j < size; j++) {
-+                LOG3A("RGBS: [%d]:%d, %d, %d, %d, %d", j, rgbsPtr[j].avg_b, rgbsPtr[j].avg_gb,
-+                            rgbsPtr[j].avg_gr, rgbsPtr[j].avg_r, rgbsPtr[j].sat);
-+            }
-+
-+            // Only print last Rgbs Stats's y_mean for validation purpose
-+            if (i < num - 1) continue;
-+
-+            int sumLuma = 0;
-+            for (int j = 0; j < size; j++) {
-+                sumLuma += (rgbsPtr[j].avg_b + rgbsPtr[j].avg_r + (rgbsPtr[j].avg_gb + rgbsPtr[j].avg_gr) / 2) / 3;
-+            }
-+            LOG3A("RGB stat grid[%d] %dx%d, y_mean %d", i, rgbsGrid[i].grid_width, rgbsGrid[i].grid_height, sumLuma/size);
-+        }
-+    }
-+
-+    if ((mPgParamType == PG_PARAM_PSYS_ISA && CameraDump::isDumpTypeEnable(DUMP_PSYS_AIQ_STAT)) ||
-+        (mPgParamType == PG_PARAM_ISYS && CameraDump::isDumpTypeEnable(DUMP_ISYS_AIQ_STAT))) {
-+        char name[30];
-+        BinParam_t bParam;
-+        bParam.bType    = BIN_TYPE_STATISTIC;
-+        bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
-+        bParam.sequence = sequence;
-+        for (unsigned int i = 0; i < num; i++ ) {
-+            CLEAR(name);
-+            snprintf(name, sizeof(name), "%s_stats_%u_%u",
-+                    mPgParamType == PG_PARAM_PSYS_ISA ? "hdr_rgbs" : "rgbs", num, i);
-+            bParam.sParam.gridWidth  = rgbsGrid[i].grid_width;
-+            bParam.sParam.gridHeight = rgbsGrid[i].grid_height;
-+            bParam.sParam.appendix   = name;
-+            if (rgbsGrid[i].grid_width != 0 && rgbsGrid[i].grid_height != 0) {
-+                CameraDump::dumpBinary(mCameraId, rgbsGrid[i].blocks_ptr,
-+                                       rgbsGrid[i].grid_width * rgbsGrid[i].grid_height * sizeof(rgbs_grid_block),
-+                                       &bParam);
-+            }
-+        }
-+    }
-+}
-+
-+void IspParamAdaptor::dumpIspParameter(long sequence) {
-+    if (mPgParamType == PG_PARAM_PSYS_ISA && !CameraDump::isDumpTypeEnable(DUMP_PSYS_PAL)) return;
-+    if (mPgParamType == PG_PARAM_ISYS && !CameraDump::isDumpTypeEnable(DUMP_ISYS_PAL)) return;
-+
-+    BinParam_t bParam;
-+    bParam.bType    = BIN_TYPE_GENERAL;
-+    bParam.mType    = mPgParamType == PG_PARAM_PSYS_ISA ? M_PSYS : M_ISYS;
-+    bParam.sequence = sequence;
-+    bParam.gParam.appendix = "pal";
-+    CameraDump::dumpBinary(mCameraId, mCurrentIpuParam.data, mCurrentIpuParam.size, &bParam);
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
-new file mode 100644
-index 000000000000..f0b25e4e49df
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
-@@ -0,0 +1,147 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <memory>
-+#include <vector>
-+#include <list>
-+#include <unordered_map>
-+
-+#include "iutils/Errors.h"
-+#include "CameraBuffer.h"
-+#include "CameraTypes.h"
-+
-+#include "NodeInfo.h"
-+
-+extern "C" {
-+#ifndef CAL_BUILD
-+#include "ia_camera/ipu_process_group_wrapper.h"
-+#endif
-+}
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelIspParamAdaptor.h"
-+#else
-+#include "modules/algowrapper/IntelIspParamAdaptor.h"
-+#endif
-+
-+#include "ia_aiq_types.h"
-+#include "ia_isp_bxt_types.h"
-+#include "ia_isp_bxt_statistics_types.h"
-+#include "ia_isp_bxt.h"
-+#include "ia_bcomp_types.h"
-+#include "gc/IGraphConfigManager.h"
-+#include "IspSettings.h"
-+
-+namespace icamera {
-+
-+enum PgParamType {
-+    PG_PARAM_VIDEO = 0,
-+    PG_PARAM_PSYS_ISA,
-+    PG_PARAM_ISYS,
-+    PG_PARAM_STILL_4k,
-+    PG_PARAM_STILL_8m
-+};
-+
-+/**
-+ * This class is for isp parameter converting including:
-+ * 1. Convert hw statistics to aiq statistics
-+ * 2. Convert aiq result to isa config
-+ * 3. Run isp config
-+ * 4. Provide p2p handle
-+ */
-+class IspParamAdaptor {
-+public:
-+    IspParamAdaptor(int cameraId, PgParamType type);
-+    virtual ~IspParamAdaptor();
-+
-+    int init();
-+    int deinit();
-+    int configure(const stream_t &stream, ConfigMode configMode, TuningMode tuningMode);
-+
-+    int getParameters(Parameters& param);
-+    int decodeStatsData(TuningMode tuningMode,
-+                        std::shared_ptr<CameraBuffer> statsBuffer,
-+                        std::shared_ptr<IGraphConfig> graphConfig = nullptr);
-+
-+    int runIspAdapt(const IspSettings* ispSettings, long settingSequence = -1, int32_t streamId = -1);
-+    //Get ISP param from mult-stream ISP param adaptation
-+    const ia_binary_data* getIpuParameter(long sequence = -1, int streamId = -1);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(IspParamAdaptor);
-+
-+    int initProgramGroupForAllStreams(ConfigMode configMode);
-+    int postConfigure(int width, int height);
-+    void initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type);
-+
-+    int initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode);
-+    void deinitIspAdaptHandle();
-+
-+    int runIspAdaptL(ia_isp_bxt_program_group programGroup, ia_isp_bxt_gdc_limits* mbrData,
-+                     const IspSettings* ispSettings, long settingSequence,
-+                     bool forceUpdate = false);
-+
-+    //Allocate memory for mIspParameters
-+    int allocateIspParamBuffers();
-+    //Release memory for mIspParameters
-+    void releaseIspParamBuffers();
-+
-+    // Dumping methods for debugging purposes.
-+    void dumpRgbsStats(ia_aiq_rgbs_grid *rgbs_grid, long sequence, unsigned int num = 1);
-+    void dumpAfStats(const ia_aiq_af_grid *afGrid, long sequence);
-+    void dumpIspParameter(long sequence);
-+    // Enable or disable kernels according to environment variables for debug purpose.
-+    void updateKernelToggles(ia_isp_bxt_program_group programGroup);
-+
-+ private:
-+    enum IspAdaptorState {
-+        ISP_ADAPTOR_NOT_INIT,
-+        ISP_ADAPTOR_INIT,
-+        ISP_ADAPTOR_CONFIGURED
-+    } mIspAdaptorState;
-+
-+    int mCameraId;
-+    PgParamType mPgParamType;
-+    TuningMode mTuningMode;
-+
-+    ia_isp_bxt   *mIspAdaptHandle;
-+    ia_bcomp_results *mBCompResults;
-+
-+    //Guard for IspParamAdaptor public API
-+    Mutex mIspAdaptorLock;
-+    std::map<int, ia_isp_bxt_program_group> mStreamIdToProgramGroupMap;
-+    std::map<int, int> mStreamIdToPGOutSizeMap;
-+    std::map<int, ia_isp_bxt_gdc_limits> mStreamIdToMbrDataMap;
-+    ia_aiq_frame_params mFrameParam;
-+    ia_binary_data mCurrentIpuParam;   // current output from AIC
-+    static const int ISP_PARAM_QUEUE_SIZE = 10;
-+    int mCurIspParamIndex;
-+    struct IspParameter {
-+        long sequence; // frame sequence id
-+        std::map<int, ia_binary_data> streamIdToDataMap; // map from stream id to ia_binary_data
-+        std::unordered_map<int32_t, bool> dataAvailableMap;
-+    } mIspParameters[ISP_PARAM_QUEUE_SIZE];
-+
-+    IGraphConfigManager *mGCM;
-+    std::list<long> mSequenceList;  // Store the sequence history in IspParamAdaptor
-+    std::unique_ptr<IntelIspParamAdaptor> mAdaptor;
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/IspSettings.h b/camera/hal/intel/ipu6/src/core/IspSettings.h
-new file mode 100644
-index 000000000000..803c5bc17c86
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/IspSettings.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2018-2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ia_isp_types.h"
-+#include "iutils/Utils.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+struct IspImageEnhancement{
-+    char manualSharpness;
-+    char manualBrightness;
-+    char manualContrast;
-+    char manualHue;
-+    char manualSaturation;
-+};
-+
-+struct IspSettings {
-+    ia_isp_feature_setting nrSetting;
-+    ia_isp_feature_setting eeSetting;
-+    ia_isp_effect effects;
-+    bool videoStabilization;
-+    IspImageEnhancement manualSettings;
-+    ia_binary_data* palOverride;
-+    float zoom;
-+    camera_mount_type_t sensorMountType;
-+    IspSettings() { CLEAR(*this); zoom = 1.0f; }
-+};
-+
-+} // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/LensHw.cpp b/camera/hal/intel/ipu6/src/core/LensHw.cpp
-new file mode 100644
-index 000000000000..a2588e25a5f2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/LensHw.cpp
-@@ -0,0 +1,159 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "LensHw"
-+
-+#include "LensHw.h"
-+#include "iutils/CameraLog.h"
-+#include "V4l2DeviceFactory.h"
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+
-+LensHw::LensHw(int cameraId):
-+    mCameraId(cameraId),
-+    mLensSubdev(nullptr),
-+    mLastLensPosition(0),
-+    mLensMovementStartTime(0)
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+LensHw::~LensHw() {
-+    LOG1("@%s", __func__);
-+}
-+
-+int LensHw::init()
-+{
-+    LOG1("@%s", __func__);
-+    std::string lensName = PlatformData::getLensName(mCameraId);
-+    if (lensName.empty()) {
-+        LOG1("%s No Lens for camera id:%d ", __func__, mCameraId);
-+        return OK;
-+    }
-+
-+    LOG1("%s camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
-+    std::string subDevName;
-+    CameraUtils::getSubDeviceName(lensName.c_str(), subDevName);
-+    if (!subDevName.empty()) {
-+        mLensSubdev = V4l2DeviceFactory::getSubDev(mCameraId, subDevName);
-+        mLensName=lensName;
-+        return OK;
-+    }
-+
-+    LOGW("%s Fail to init lens for camera id:%d lens name:%s", __func__, mCameraId, lensName.c_str());
-+    return OK;
-+}
-+
-+/**
-+ * focus with absolute value
-+ */
-+int LensHw::setFocusPosition(int position)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    mLastLensPosition = position;
-+
-+    struct timespec t = {};
-+    clock_gettime(CLOCK_MONOTONIC, &t);
-+
-+    mLensMovementStartTime = ((long)t.tv_sec) * 1000000 + (long)t.tv_nsec / 1000;
-+
-+    LOG2("@%s: %d, time %lld", __func__, position, mLensMovementStartTime);
-+    return mLensSubdev->SetControl(V4L2_CID_FOCUS_ABSOLUTE, position);
-+}
-+
-+/**
-+ * focus with  relative value
-+ */
-+int LensHw::setFocusStep(int steps)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->SetControl(V4L2_CID_FOCUS_RELATIVE, steps);
-+}
-+
-+int LensHw::getFocusPosition(int &position)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->GetControl(V4L2_CID_FOCUS_ABSOLUTE, &position);
-+}
-+
-+int LensHw::getFocusStatus(int & /*status*/)
-+{
-+    LOG2("@%s", __func__);
-+    return OK;
-+}
-+
-+int LensHw::startAutoFocus(void)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_START, 1);
-+}
-+
-+int LensHw::stopAutoFocus(void)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_STOP, 0);
-+}
-+
-+int LensHw::getAutoFocusStatus(int &status)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_STATUS,
-+                                    reinterpret_cast<int*>(&status));
-+}
-+
-+int LensHw::setAutoFocusRange(int value)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->SetControl(V4L2_CID_AUTO_FOCUS_RANGE, value);
-+}
-+
-+int LensHw::getAutoFocusRange(int &value)
-+{
-+    CheckError(!mLensSubdev, NO_INIT, "%s: No Lens device inited.", __func__);
-+    LOG2("@%s", __func__);
-+    return mLensSubdev->GetControl(V4L2_CID_AUTO_FOCUS_RANGE, &value);
-+}
-+
-+const char* LensHw::getLensName(void)
-+{
-+    return mLensName.c_str();
-+}
-+
-+/**
-+ * getLatestPosition
-+ *
-+ * returns the latest position commanded to the lens actuator and when this
-+ * was issued.
-+ * This method does not query the driver.
-+ *
-+ * \param: lensPosition[OUT]: lens position last applied
-+ * \param: time[OUT]: time in micro seconds when the lens move command was sent.
-+ */
-+int LensHw::getLatestPosition(int& lensPosition, unsigned long long& time)
-+{
-+    lensPosition = mLastLensPosition;
-+    time = mLensMovementStartTime;
-+    return OK;
-+}
-+
-+}   // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/LensHw.h b/camera/hal/intel/ipu6/src/core/LensHw.h
-new file mode 100644
-index 000000000000..997cc13dcf76
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/LensHw.h
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <string>
-+
-+namespace icamera {
-+
-+typedef ::cros::V4L2Subdevice V4L2Subdevice;
-+
-+/**
-+ * \class LensHw
-+ * This class adds the methods that are needed
-+ * to drive the camera lens using v4l2 commands and custom ioctl.
-+ *
-+ */
-+class LensHw {
-+
-+public:
-+    LensHw(int cameraId);
-+    ~LensHw();
-+
-+    int init();
-+
-+    const char* getLensName(void);
-+
-+    int setFocusPosition(int position);
-+    int setFocusStep(int steps);
-+    int getFocusPosition(int &position);
-+    int getFocusStatus(int &status);
-+    int startAutoFocus(void);
-+    int stopAutoFocus(void);
-+    int getAutoFocusStatus(int &status);
-+    int setAutoFocusRange(int value);
-+    int getAutoFocusRange(int &value);
-+    int getLatestPosition(int& lensPosition, unsigned long long& time);
-+    bool isLensSubdevAvailable() { return (mLensSubdev != nullptr); }
-+
-+private:
-+    int mCameraId;
-+    V4L2Subdevice* mLensSubdev;
-+    std::string mLensName;
-+    int mLastLensPosition;
-+    unsigned long long mLensMovementStartTime; /*!< In microseconds */
-+};  // class LensHW
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
-new file mode 100644
-index 000000000000..b026ad00114b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
-@@ -0,0 +1,860 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PSysProcessor"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/SwImageConverter.h"
-+
-+#include "PlatformData.h"
-+#include "3a/AiqResultStorage.h"
-+#include "ParameterGenerator.h"
-+
-+#include "PSysProcessor.h"
-+
-+/*
-+ * The sof event time margin is a tunning value
-+ * it's based on sensor vblank, psys iterating time
-+ * and thread scheduling
-+ */
-+#define SOF_EVENT_MARGIN (3000000)  // 3ms
-+
-+using std::shared_ptr;
-+
-+namespace icamera {
-+PSysProcessor::PSysProcessor(int cameraId, ParameterGenerator *pGenerator) :
-+        mCameraId(cameraId),
-+        mParameterGenerator(pGenerator),
-+        mCurConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_NORMAL),
-+        mTuningMode(TUNING_MODE_MAX),
-+        mRawPort(INVALID_PORT),
-+        mOpaqueRawPort(INVALID_PORT),
-+        mStatus(PIPELINE_UNCREATED)
-+{
-+    LOG1("@%s camera id:%d", __func__, mCameraId);
-+
-+    mProcessThread = new ProcessThread(this);
-+    CLEAR(mSofTimestamp);
-+}
-+
-+PSysProcessor::~PSysProcessor()
-+{
-+    LOG1("@%s ", __func__);
-+
-+    mProcessThread->join();
-+    delete mProcessThread;
-+}
-+
-+int PSysProcessor::configure(const std::vector<ConfigMode>& configModes)
-+{
-+    //Create PSysDAGs actually
-+    LOG1("@%s ", __func__);
-+    CheckError(mStatus == PIPELINE_CREATED, -1, "@%s mStatus is in wrong status: PIPELINE_CREATED", __func__);
-+    mConfigModes = configModes;
-+
-+    std::map<Port, stream_t> outputFrameInfo;
-+    // Check if it's required to output raw image from ISYS
-+    for (auto &outFrameInfo : mOutputFrameInfo) {
-+        if (outFrameInfo.second.format == V4L2_PIX_FMT_SGRBG12) {
-+            mRawPort = outFrameInfo.first;
-+        } else if (outFrameInfo.second.usage == CAMERA_STREAM_OPAQUE_RAW) {
-+            mOpaqueRawPort = outFrameInfo.first;
-+        } else {
-+            outputFrameInfo[outFrameInfo.first] = outFrameInfo.second;
-+        }
-+    }
-+
-+    int ret = OK;
-+    //Create PSysDAG according to real configure mode
-+    for (auto &cfg : mConfigModes) {
-+        if (mPSysDAGs.find(cfg) != mPSysDAGs.end()) {
-+            continue;
-+        }
-+
-+        TuningConfig tuningConfig;
-+        ret = PlatformData::getTuningConfigByConfigMode(mCameraId, cfg, tuningConfig);
-+        CheckError(ret != OK, ret, "%s: can't get config for mode %d", __func__, cfg);
-+
-+        LOG1("Create PSysDAG for ConfigMode %d", cfg);
-+        shared_ptr<PSysDAG> pSysDAG = shared_ptr<PSysDAG>(new PSysDAG(mCameraId, this));
-+
-+        pSysDAG->setFrameInfo(mInputFrameInfo, outputFrameInfo);
-+        ret = pSysDAG->configure(tuningConfig.configMode, tuningConfig.tuningMode);
-+        CheckError(ret != OK, ret, "@%s configure psys dag failed:%d", __func__, ret);
-+
-+        mPSysDAGs[tuningConfig.configMode] = pSysDAG;
-+
-+        //Update default active config mode
-+        mCurConfigMode = tuningConfig.configMode;
-+        mTuningMode = tuningConfig.tuningMode;
-+    }
-+
-+    if (ret == OK) mStatus = PIPELINE_CREATED;
-+    return ret;
-+
-+}
-+
-+int PSysProcessor::registerUserOutputBufs(Port port, const shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    for (auto psysDAGPair : mPSysDAGs) {
-+        shared_ptr<PSysDAG> psysDAG = psysDAGPair.second;
-+        if (!psysDAG) continue;
-+        int ret = psysDAG->registerUserOutputBufs(port, camBuffer);
-+        CheckError(ret != OK, BAD_VALUE, "%s, register user buffer failed, ret: %d", __func__, ret);
-+    }
-+
-+    return OK;
-+}
-+
-+int PSysProcessor::start()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s", __func__);
-+    AutoMutex   l(mBufferQueueLock);
-+    int rawBufferNum = mOpaqueRawPort != INVALID_PORT ? PlatformData::getMaxRawDataNum(mCameraId) :
-+                       PlatformData::getPreferredBufQSize(mCameraId);
-+
-+    /* Should use MIN_BUFFER_COUNT to optimize frame latency when PSYS processing
-+     * time is slower than ISYS
-+     */
-+    bool needProducerBuffer = PlatformData::isIsysEnabled(mCameraId);
-+
-+    if (needProducerBuffer) {
-+        int ret = allocProducerBuffers(mCameraId, rawBufferNum);
-+        CheckError(ret != OK, NO_MEMORY, "Allocating producer buffer failed:%d", ret);
-+    }
-+
-+    mThreadRunning = true;
-+    mProcessThread->run("PsysProcessor", PRIORITY_NORMAL);
-+    for (auto psysDAGPair : mPSysDAGs) {
-+        shared_ptr<PSysDAG> curPsysDAG = psysDAGPair.second;
-+        if (!curPsysDAG) continue;
-+        curPsysDAG->start();
-+        if (needProducerBuffer && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
-+            curPsysDAG->registerInternalBufs(mInternalBuffers);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void PSysProcessor::stop()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s", __func__);
-+
-+    for (auto psysDAGPair : mPSysDAGs) {
-+        shared_ptr<PSysDAG> curPsysDAG = psysDAGPair.second;
-+        if (!curPsysDAG) continue;
-+        curPsysDAG->stop();
-+    }
-+
-+    mProcessThread->requestExit();
-+    {
-+        AutoMutex l(mBufferQueueLock);
-+        mThreadRunning = false;
-+        //Wakeup the thread to exit
-+        mFrameAvailableSignal.signal();
-+        mOutputAvailableSignal.signal();
-+        mFrameDoneSignal.signal();
-+        AutoMutex lMeta(mMetaQueueLock);
-+        mMetaAvailableSignal.signal();
-+    }
-+    {
-+        AutoMutex l(mSofLock);
-+        mSofCondition.signal();
-+    }
-+
-+    mProcessThread->requestExitAndWait();
-+
-+    // Thread is not running. It is safe to clear the Queue
-+    clearBufferQueues();
-+}
-+
-+int PSysProcessor::setParameters(const Parameters& param)
-+{
-+    LOG1("%s camera id:%d", __func__, mCameraId);
-+    // Process image enhancement related settings.
-+    camera_image_enhancement_t enhancement;
-+    int ret = param.getImageEnhancement(enhancement);
-+    AutoWMutex wl(mIspSettingsLock);
-+    if (ret == OK) {
-+        mIspSettings.manualSettings.manualSharpness = (char)enhancement.sharpness;
-+        mIspSettings.manualSettings.manualBrightness = (char)enhancement.brightness;
-+        mIspSettings.manualSettings.manualContrast = (char)enhancement.contrast;
-+        mIspSettings.manualSettings.manualHue = (char)enhancement.hue;
-+        mIspSettings.manualSettings.manualSaturation = (char)enhancement.saturation;
-+
-+        // TODO: need to consider how to add feature level from user setting.
-+        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_low;
-+        mIspSettings.eeSetting.strength = enhancement.sharpness;
-+    } else {
-+        mIspSettings.eeSetting.feature_level = ia_isp_feature_level_low;
-+        mIspSettings.eeSetting.strength = 0;
-+    }
-+
-+    camera_nr_mode_t manualNrMode;
-+    camera_nr_level_t manualNrLevel;
-+
-+    int manualNrModeSet = param.getNrMode(manualNrMode);
-+    int manualNrLevelSet = param.getNrLevel(manualNrLevel);
-+
-+    if (manualNrModeSet == OK) {
-+        LOG2("%s: manual NR mode set: %d", __func__, manualNrMode);
-+        switch (manualNrMode) {
-+            case NR_MODE_OFF:
-+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_off;
-+                break;
-+            case NR_MODE_AUTO:
-+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
-+                break;
-+            case NR_MODE_MANUAL_NORMAL:
-+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
-+                break;
-+            case NR_MODE_MANUAL_EXPERT:
-+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
-+                break;
-+            default:
-+                mIspSettings.nrSetting.feature_level = ia_isp_feature_level_low;
-+        }
-+
-+    } else {
-+        LOG2("%s: manual NR mode not set, default enabled", __func__);
-+        mIspSettings.nrSetting.feature_level = ia_isp_feature_level_high;
-+    }
-+
-+    if (manualNrLevelSet == OK) {
-+        LOG2("%s: manual NR level set: %d", __func__, manualNrLevel.overall);
-+        mIspSettings.nrSetting.strength = (char)manualNrLevel.overall;
-+    } else {
-+        LOG2("%s: manual NR level not set, default used", __func__);
-+        mIspSettings.nrSetting.strength = (char)0;
-+    }
-+
-+    LOG2("%s: ISP NR setting, level: %d, strength: %d",
-+            __func__, (int)mIspSettings.nrSetting.feature_level,
-+            (int)mIspSettings.nrSetting.strength);
-+
-+    camera_video_stabilization_mode_t stabilizationMode;
-+    ret = param.getVideoStabilizationMode(stabilizationMode);
-+    if (ret == OK) {
-+         mIspSettings.videoStabilization = (stabilizationMode == VIDEO_STABILIZATION_MODE_ON);
-+    } else {
-+         mIspSettings.videoStabilization = false;
-+    }
-+    LOG2("%s: Video stablilization enabled:%d", __func__, mIspSettings.videoStabilization);
-+
-+    return ret;
-+}
-+
-+int PSysProcessor::getParameters(Parameters& param)
-+{
-+    LOG1("@%s ", __func__);
-+    AutoRMutex rl(mIspSettingsLock);
-+    camera_image_enhancement_t enhancement = { mIspSettings.manualSettings.manualSharpness,
-+                                               mIspSettings.manualSettings.manualBrightness,
-+                                               mIspSettings.manualSettings.manualContrast,
-+                                               mIspSettings.manualSettings.manualHue,
-+                                               mIspSettings.manualSettings.manualSaturation };
-+    int ret = param.setImageEnhancement(enhancement);
-+
-+    ret |= mPSysDAGs[mCurConfigMode]->getParameters(param);
-+
-+    return ret;
-+}
-+
-+/**
-+ * Get available setting sequence from outBuf
-+ */
-+long PSysProcessor::getSettingSequence(const CameraBufferPortMap &outBuf)
-+{
-+    long settingSequence = -1;
-+    for (auto& output: outBuf) {
-+        if (output.second) {
-+            settingSequence = output.second->getSettingSequence();
-+            break;
-+        }
-+    }
-+    return settingSequence;
-+}
-+
-+/**
-+ * Check if the input frame should be skipped
-+ *
-+ * If the corresponding mSkip of AiqResult gotten from sequence is true,
-+ * return true; otherwise return false.
-+ */
-+bool PSysProcessor::needSkipOutputFrame(long sequence)
-+{
-+    // Check if need to skip output frame
-+    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
-+    if (aiqResults != nullptr && aiqResults->mSkip) {
-+        LOG1("%s, sequence %ld", __func__, sequence);
-+        return true;
-+    }
-+    return false;
-+}
-+
-+/**
-+ * Check if 'inBuffer' can be used for 'settingSequence' to run PSys pipe.
-+ *
-+ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
-+ * input buffer, so it can run the pipe.
-+ * If 'inputSequence' larger than 'settingSequence', the pipeline needs to
-+ * run as well, otherwise the pipe doesn't need to run and this input buffer needs to
-+ * be skipped.
-+ */
-+bool PSysProcessor::needExecutePipe(long settingSequence, long inputSequence)
-+{
-+    if (settingSequence == -1 || inputSequence >= settingSequence) {
-+        return true;
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * Check if the input buffer need to be reused
-+ *
-+ * If 'settingSequence' is -1, it means the output buffer doesn't require particular
-+ * input buffer, so the input buffer doesn't need to be reused.
-+ * If 'inputSequence' larger than 'settingSequence', means the input buffer
-+ * may be required by following output buffer, so it may be reused later.
-+ */
-+bool PSysProcessor::needHoldOnInputFrame(long settingSequence, long inputSequence)
-+{
-+    if (settingSequence == -1 || inputSequence <= settingSequence) {
-+        return false;
-+    }
-+
-+    return true;
-+}
-+
-+/**
-+ * Check if pipe needs to be switched according to AIQ result.
-+ */
-+bool PSysProcessor::needSwitchPipe(long sequence)
-+{
-+    const AiqResult* aiqResults = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
-+    if (aiqResults == nullptr) {
-+        LOG2("%s: not found sequence %ld in AiqResultStorage, no update for active modes",
-+            __func__, sequence);
-+        return false;
-+    }
-+
-+    TuningMode curTuningMode = aiqResults->mTuningMode;
-+    LOG2("%s: aiqResults->mTuningMode = %d", __func__, curTuningMode);
-+
-+    if (mTuningMode == curTuningMode) {
-+        return false;
-+    }
-+
-+    for (auto cfg : mConfigModes) {
-+        TuningMode tMode;
-+        int ret = PlatformData::getTuningModeByConfigMode(mCameraId, cfg, tMode);
-+        if (ret == OK && tMode == curTuningMode) {
-+            mCurConfigMode = cfg;
-+            mTuningMode = curTuningMode;
-+            return true;
-+        }
-+    }
-+    return false;
-+}
-+
-+void PSysProcessor::handleEvent(EventData eventData)
-+{
-+    LOG2("%s: got event type %d", __func__, eventData.type);
-+    // Process registered events
-+    switch (eventData.type) {
-+        case EVENT_ISYS_SOF:
-+            {
-+                AutoMutex l(mSofLock);
-+                gettimeofday(&mSofTimestamp, nullptr);
-+                LOG2("%s, received SOF event sequence: %ld, timestamp: %ld",
-+                     __func__, eventData.data.sync.sequence, TIMEVAL2USECS(mSofTimestamp));
-+                mSofCondition.signal();
-+            }
-+            break;
-+        default:
-+            LOGW("Unexpected event: %d", eventData.type);
-+            break;
-+    }
-+}
-+
-+// PSysProcessor ThreadLoop
-+int PSysProcessor::processNewFrame() {
-+    PERF_CAMERA_ATRACE();
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    CheckError(!mBufferProducer, INVALID_OPERATION, "No available producer");
-+
-+    int ret = OK;
-+    CameraBufferPortMap srcBuffers, dstBuffers;
-+
-+    if (!PlatformData::psysAlignWithSof(mCameraId)) {
-+        {
-+            ConditionLock lock(mBufferQueueLock);
-+            ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
-+            // Already stopped
-+            if (!mThreadRunning) return -1;
-+
-+            // Wait frame buffer time out should not involve thread exit.
-+            if (ret != OK) {
-+                LOG1("%s, cameraId: %d timeout happen, wait recovery", __func__, mCameraId);
-+                return OK;
-+            }
-+        }
-+
-+        ret = prepareTask(&srcBuffers, &dstBuffers);
-+        CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
-+    } else {
-+        {
-+            ConditionLock lock(mSofLock);
-+
-+            timeval curTime;
-+            gettimeofday(&curTime, nullptr);
-+            int64_t sofInterval = TIMEVAL2NSECS(curTime) - TIMEVAL2NSECS(mSofTimestamp);
-+
-+            // Wait next sof event when missing last one for a long time
-+            if (sofInterval > SOF_EVENT_MARGIN) {
-+                LOG2("%s, need to wait next sof event. sofInterval: %ld", __func__, sofInterval);
-+                ret = mSofCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
-+
-+                // Already stopped
-+                if (!mThreadRunning) return -1;
-+
-+                // Wait sof event time out should not involve thread exit.
-+                if (ret != OK) {
-+                    LOG1("%s, cameraId: %d wait sof event timeout, recovery", __func__, mCameraId);
-+                    return OK;
-+                }
-+            }
-+        }
-+
-+        // push all the pending buffers to task
-+        while (true) {
-+            {
-+                ConditionLock lock(mBufferQueueLock);
-+                ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers, SOF_EVENT_MARGIN);
-+
-+                // Return to wait next sof event if there isn't pending buffer.
-+                if (ret != OK) {
-+                    LOG1("%s, cameraId: %d, there isn't pending buffer, recovery",
-+                         __func__, mCameraId);
-+                    return OK;
-+                }
-+            }
-+
-+            ret = prepareTask(&srcBuffers, &dstBuffers);
-+            CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to process frame", __func__);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void PSysProcessor::handleRawReprocessing(CameraBufferPortMap *srcBuffers,
-+                                          CameraBufferPortMap *dstBuffers, bool *hasYuv,
-+                                          bool *hasRawOutput)
-+{
-+    std::shared_ptr<CameraBuffer> rawOutputBuffer = nullptr;
-+    long settingSequence = -1;
-+    bool hasRawInput = false;
-+
-+    for (const auto& item : *dstBuffers) {
-+        if (item.second) {
-+            if (item.second->getStreamUsage() == CAMERA_STREAM_OPAQUE_RAW) {
-+                rawOutputBuffer = item.second;
-+            } else {
-+                *hasYuv = true;
-+            }
-+            if (item.second->getSettingSequence() >= 0) {
-+                settingSequence = item.second->getSettingSequence();
-+            }
-+        }
-+    }
-+
-+    Port defaultPort = srcBuffers->begin()->first;
-+    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
-+    long inputSequence = mainBuf->getSequence();
-+
-+    if (rawOutputBuffer) {
-+        if (!needExecutePipe(settingSequence, inputSequence)) {
-+            LOG2("%s, inputSequence %ld is smaller than settingSequence %ld, skip sensor frame.",
-+                 __func__, inputSequence, settingSequence);
-+            return;
-+        }
-+        // Return opaque RAW data
-+        uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
-+        sensor_raw_info_t opaqueRawInfo = { inputSequence, timestamp };
-+
-+        rawOutputBuffer->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
-+
-+        MEMCPY_S(rawOutputBuffer->getBufferAddr(), rawOutputBuffer->getBufferSize(),
-+                 &opaqueRawInfo, sizeof(opaqueRawInfo));
-+        LOG2("%s, timestamp %ld, inputSequence %ld, dstBufferSize %d, addr %p", __func__,
-+              timestamp, inputSequence, rawOutputBuffer->getBufferSize(),
-+              rawOutputBuffer->getBufferAddr());
-+
-+        // Return opaque RAW buffer
-+        for (auto &it : mBufferConsumerList) {
-+            it->onFrameAvailable(mOpaqueRawPort, rawOutputBuffer);
-+        }
-+        *hasRawOutput = true;
-+
-+        // Remove from dstBuffers map
-+        dstBuffers->erase(mOpaqueRawPort);
-+
-+        // Save buffer into mRawQueue
-+        CameraBufferPortMap mapBuf;
-+        for (const auto& src : *srcBuffers) {
-+            mapBuf[src.first] = src.second;
-+        }
-+
-+        AutoMutex lock(mRawBufferMapLock);
-+        mRawBufferMap[inputSequence] = mapBuf;
-+    } else if (settingSequence != -1 && inputSequence > settingSequence) {
-+        AutoMutex lock(mRawBufferMapLock);
-+        // Find Raw buffer in mRawBufferMap
-+        if (mRawBufferMap.find(settingSequence) != mRawBufferMap.end()) {
-+            CameraBufferPortMap &mapBuf = mRawBufferMap[settingSequence];
-+            for (const auto& bufPortMap : mapBuf) {
-+                (*srcBuffers)[bufPortMap.first] = bufPortMap.second;
-+            }
-+            hasRawInput = true;
-+        }
-+    }
-+
-+    LOG2("%s, hasRawInput %d, hasRawOutput %d, hasYuv %d, settingSequence %ld, inputSequence %ld",
-+          __func__, hasRawInput, *hasRawOutput, *hasYuv, settingSequence, inputSequence);
-+}
-+
-+bool PSysProcessor::isBufferHoldForRawReprocess(long sequence)
-+{
-+    if (mOpaqueRawPort == INVALID_PORT) return false;
-+
-+    AutoMutex lock(mRawBufferMapLock);
-+    if (mRawBufferMap.find(sequence) == mRawBufferMap.end()) return false;
-+
-+    // If too many buffers are holden in mRawQueue, return back to producer
-+    if (mRawBufferMap.size() >= (PlatformData::getMaxRawDataNum(mCameraId) -
-+                                PlatformData::getMaxRequestsInflight(mCameraId))) {
-+        std::map<long, CameraBufferPortMap>::iterator it = mRawBufferMap.begin();
-+        CameraBufferPortMap &bufferPortMap = it->second;
-+        for (auto &item : bufferPortMap) {
-+            mBufferProducer->qbuf(item.first, item.second);
-+        }
-+        mRawBufferMap.erase(mRawBufferMap.begin());
-+    }
-+    return true;
-+}
-+
-+status_t PSysProcessor::prepareTask(CameraBufferPortMap *srcBuffers,
-+                                    CameraBufferPortMap *dstBuffers) {
-+    CheckError(srcBuffers->empty() || dstBuffers->empty(),
-+               UNKNOWN_ERROR, "%s, the input or output buffer is empty", __func__);
-+
-+    bool hasYuv = false;
-+    bool hasRawOutput = false;
-+    if (mOpaqueRawPort != INVALID_PORT) {
-+        handleRawReprocessing(srcBuffers, dstBuffers, &hasYuv, &hasRawOutput);
-+        if (hasRawOutput && !hasYuv) {
-+            // If no YUV is needed, only RAW output requests
-+            AutoMutex l(mBufferQueueLock);
-+            for (auto& input: mInputQueue) {
-+                input.second.pop();
-+            }
-+            for (auto& output: mOutputQueue) {
-+                output.second.pop();
-+            }
-+            return OK;
-+        }
-+    }
-+
-+    Port defaultPort = srcBuffers->begin()->first;
-+    shared_ptr<CameraBuffer> mainBuf = (*srcBuffers)[defaultPort];
-+    long inputSequence = mainBuf->getSequence();
-+    uint64_t timestamp = TIMEVAL2NSECS(mainBuf->getTimestamp());
-+    LOG2("%s: input buffer sequence %ld timestamp %ld", __func__, inputSequence, timestamp);
-+
-+    // Output raw image
-+    if (mRawPort != INVALID_PORT) {
-+        shared_ptr<CameraBuffer> dstBuf = nullptr;
-+
-+        // Get output buffer and remove it from dstBuffers
-+        for (auto &buffer : *dstBuffers) {
-+            if (buffer.first == mRawPort) {
-+                dstBuf = buffer.second;
-+                CheckError(!dstBuf, UNKNOWN_ERROR, "%s, dstBuf for output raw is null", __func__);
-+                dstBuf->updateV4l2Buffer(*mainBuf->getV4L2Buffer().Get());
-+                dstBuffers->erase(mRawPort);
-+                break;
-+            }
-+        }
-+        outputRawImage(mainBuf, dstBuf);
-+    }
-+
-+    long settingSequence = getSettingSequence(*dstBuffers);
-+    bool needRunPipe = needExecutePipe(settingSequence, inputSequence);
-+    bool holdOnInput = needHoldOnInputFrame(settingSequence, inputSequence);
-+    LOG2("%s: dst sequence = %ld, src sequence = %ld, needRunPipe = %d, needReuseInput = %d",
-+         __func__, settingSequence, inputSequence, needRunPipe, holdOnInput);
-+
-+    {
-+        AutoMutex l(mBufferQueueLock);
-+        if (needRunPipe && !needSkipOutputFrame(inputSequence)) {
-+            for (auto& output: mOutputQueue) {
-+                output.second.pop();
-+            }
-+        }
-+
-+        // If input buffer will be used later, don't pop it from the queue.
-+        if (!holdOnInput) {
-+            for (auto& input: mInputQueue) {
-+                input.second.pop();
-+            }
-+        }
-+    }
-+
-+    if (needRunPipe) {
-+        // Raw output already has been returned back, and don't need to handle again.
-+        if (!hasRawOutput) {
-+            for (const auto& output : *dstBuffers) {
-+                if (output.second && output.second->getUsage() != BUFFER_USAGE_PSYS_INTERNAL) {
-+                    EventData requestReady;
-+                    requestReady.type = EVENT_PSYS_REQUEST_BUF_READY;
-+                    requestReady.buffer = nullptr;
-+                    requestReady.data.requestReady.timestamp = timestamp;
-+                    notifyListeners(requestReady);
-+                    break;
-+                }
-+            }
-+        }
-+        dispatchTask(*srcBuffers, *dstBuffers);
-+    } else if (!holdOnInput && !hasRawOutput) {
-+        for (const auto& src : *srcBuffers) {
-+            mBufferProducer->qbuf(src.first, src.second);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void PSysProcessor::dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf)
-+{
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    long currentSequence = inBuf.begin()->second->getSequence();
-+
-+    {
-+        ConditionLock lock(mBufferQueueLock);
-+
-+        ConfigMode previousMode = mCurConfigMode;
-+        bool needSwitch = needSwitchPipe(currentSequence);
-+
-+        if (needSwitch) {
-+            LOG1("Switch pipe for sequence:%ld, unprocessed buffer number:%zu",
-+                  currentSequence, mSequenceInflight.size());
-+
-+            // Deactive the PSysDag which is no longer used.
-+            mPSysDAGs[previousMode]->pause();
-+
-+            // Before switching, need to wait all buffers in current pipe being processed.
-+            while (!mSequenceInflight.empty()) {
-+                int ret = mFrameDoneSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
-+                if (!mThreadRunning) {
-+                    LOG1("@%s: Processor is not active while waiting for frame done.", __func__);
-+                    return;
-+                }
-+
-+                if (ret == TIMED_OUT) {
-+                    LOGE("Waiting for frame done event timeout");
-+                    return;
-+                }
-+            }
-+
-+            // Activate the current used PSysDag.
-+            mPSysDAGs[mCurConfigMode]->resume();
-+        }
-+        mSequenceInflight.push(currentSequence);
-+    } // End of lock mBufferQueueLock
-+
-+    // Prepare the task input paramerters including input and output buffers, settings etc.
-+    PSysTaskData taskParam;
-+    taskParam.mTuningMode = mTuningMode;
-+    taskParam.mInputBuffers = inBuf;
-+    taskParam.mOutputBuffers = outBuf;
-+
-+    long settingSequence = getSettingSequence(outBuf);
-+    // Handle per-frame settings if output buffer requires
-+    if (settingSequence > -1 && mParameterGenerator) {
-+        Parameters params;
-+        if (mParameterGenerator->getParameters(currentSequence, &params) == OK) {
-+            setParameters(params);
-+        }
-+    }
-+    {
-+        AutoRMutex rl(mIspSettingsLock);
-+        mIspSettings.palOverride = nullptr;
-+        taskParam.mIspSettings = mIspSettings;
-+    }
-+
-+    if (!mThreadRunning) return;
-+
-+    mPSysDAGs[mCurConfigMode]->addTask(taskParam);
-+}
-+
-+void PSysProcessor::registerListener(EventType eventType, EventListener* eventListener)
-+{
-+    // Only delegate stats event registration to deeper layer DAG and PipeExecutor
-+    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
-+        BufferQueue::registerListener(eventType, eventListener);
-+        return;
-+    }
-+
-+    for (auto const& realModeDAGPair: mPSysDAGs) {
-+        realModeDAGPair.second->registerListener(eventType, eventListener);
-+    }
-+}
-+
-+void PSysProcessor::removeListener(EventType eventType, EventListener* eventListener)
-+{
-+    // Only delegate stats event unregistration to deeper layer DAG and PipeExecutor
-+    if ((eventType != EVENT_PSYS_STATS_BUF_READY) && (eventType != EVENT_PSYS_STATS_SIS_BUF_READY)) {
-+        BufferQueue::removeListener(eventType, eventListener);
-+        return;
-+    }
-+
-+    for (auto const& realModeDAGPair: mPSysDAGs) {
-+        realModeDAGPair.second->removeListener(eventType, eventListener);
-+    }
-+}
-+
-+void PSysProcessor::onFrameDone(const PSysTaskData& result)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    EventDataFrame eventDataFrame;
-+    CLEAR(eventDataFrame);
-+    eventDataFrame.sequence = -1;
-+
-+    long sequence = result.mInputBuffers.begin()->second->getSequence();
-+
-+    for (auto& dst : result.mOutputBuffers) {
-+        Port port = dst.first;
-+        shared_ptr<CameraBuffer> outBuf = dst.second;
-+        // If the output buffer is nullptr, that means user doesn't request that buffer,
-+        // so it doesn't need to be handled here.
-+        if (!outBuf) {
-+            continue;
-+        }
-+
-+        if (CameraDump::isDumpTypeEnable(DUMP_PSYS_OUTPUT_BUFFER)) {
-+            CameraDump::dumpImage(mCameraId, outBuf, M_PSYS, port);
-+        }
-+
-+        if (!needSkipOutputFrame(sequence)) {
-+            for (auto &it : mBufferConsumerList) {
-+                it->onFrameAvailable(port, outBuf);
-+            }
-+            eventDataFrame.sequence = outBuf->getSequence();
-+            eventDataFrame.timestamp.tv_sec = outBuf->getTimestamp().tv_sec;
-+            eventDataFrame.timestamp.tv_usec = outBuf->getTimestamp().tv_usec;
-+        } else {
-+            LOG1("Frame %ld is being skipped.", sequence);
-+        }
-+    }
-+
-+    if (eventDataFrame.sequence >= 0) {
-+        EventData frameData;
-+        frameData.type = EVENT_PSYS_FRAME;
-+        frameData.buffer = nullptr;
-+        frameData.data.frame.sequence = eventDataFrame.sequence;
-+        frameData.data.frame.timestamp.tv_sec = eventDataFrame.timestamp.tv_sec;
-+        frameData.data.frame.timestamp.tv_usec = eventDataFrame.timestamp.tv_usec;
-+        notifyListeners(frameData);
-+        LOG2("%s, frame done for sequence: %ld", __func__, sequence);
-+    }
-+
-+    long settingSequence = getSettingSequence(result.mOutputBuffers);
-+    bool holdOnInput = needHoldOnInputFrame(settingSequence, sequence);
-+    bool hasRawOutput = isBufferHoldForRawReprocess(sequence);
-+
-+    // Return buffer only if the buffer is not used in the future.
-+    if (!holdOnInput && mBufferProducer && !hasRawOutput) {
-+        for (const auto& src : result.mInputBuffers) {
-+            mBufferProducer->qbuf(src.first, src.second);
-+
-+            if (src.second->getStreamType() == CAMERA_STREAM_INPUT) {
-+                for (auto &it : mBufferConsumerList) {
-+                    it->onFrameAvailable(src.first, src.second);
-+                }
-+            }
-+        }
-+    }
-+
-+    AutoMutex l(mBufferQueueLock);
-+    long oldest = mSequenceInflight.front();
-+    if (sequence != oldest) {
-+        // The output buffer should always be FIFO.
-+        LOGW("The sequence should be %ld, but it's %ld", oldest, sequence);
-+    }
-+
-+    mSequenceInflight.pop();
-+    if (mSequenceInflight.empty()) {
-+        mFrameDoneSignal.signal();
-+    }
-+}
-+
-+void PSysProcessor::outputRawImage(shared_ptr<CameraBuffer> &srcBuf, shared_ptr<CameraBuffer> &dstBuf)
-+{
-+    if ((srcBuf == nullptr) || (dstBuf == nullptr)) {
-+        return;
-+    }
-+
-+    // Copy from source buffer
-+    int srcBufferSize = srcBuf->getBufferSize();
-+    int srcMemoryType = srcBuf->getMemory();
-+    void* pSrcBuf = (srcMemoryType == V4L2_MEMORY_DMABUF)
-+                    ? CameraBuffer::mapDmaBufferAddr(srcBuf->getFd(), srcBufferSize)
-+                    : srcBuf->getBufferAddr();
-+
-+    int dstBufferSize = dstBuf->getBufferSize();
-+    int dstMemoryType = dstBuf->getMemory();
-+    void* pDstBuf = (dstMemoryType == V4L2_MEMORY_DMABUF)
-+                    ? CameraBuffer::mapDmaBufferAddr(dstBuf->getFd(), dstBufferSize)
-+                    : dstBuf->getBufferAddr();
-+
-+    MEMCPY_S(pDstBuf, dstBufferSize, pSrcBuf, srcBufferSize);
-+
-+    if (srcMemoryType == V4L2_MEMORY_DMABUF) {
-+        CameraBuffer::unmapDmaBufferAddr(pSrcBuf, srcBufferSize);
-+    }
-+
-+    if (dstMemoryType == V4L2_MEMORY_DMABUF) {
-+        CameraBuffer::unmapDmaBufferAddr(pDstBuf, dstBufferSize);
-+    }
-+
-+    // Send output buffer to its consumer
-+    for (auto &it : mBufferConsumerList) {
-+        it->onFrameAvailable(mRawPort, dstBuf);
-+    }
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/PSysProcessor.h b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
-new file mode 100644
-index 000000000000..e2e787b7fbd7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
-@@ -0,0 +1,129 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <queue>
-+
-+#include "BufferQueue.h"
-+#include "iutils/RWLock.h"
-+
-+#include "IspSettings.h"
-+#include "psysprocessor/PSysDAG.h"
-+
-+namespace icamera {
-+
-+class ParameterGenerator;
-+class PSysDAG;
-+
-+typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
-+typedef std::map<ConfigMode, std::shared_ptr<PSysDAG>> PSysDAGConfigModeMap;
-+
-+/**
-+  * PSysProcessor runs the Image Process Alogirhtm in the PSYS.
-+  * It implements the BufferConsumer and BufferProducer Interface
-+  */
-+class PSysProcessor: public BufferQueue, public PSysDagCallback {
-+
-+public:
-+    PSysProcessor(int cameraId, ParameterGenerator *pGenerator);
-+    virtual ~PSysProcessor();
-+    virtual int configure(const std::vector<ConfigMode>& configModes);
-+    virtual int setParameters(const Parameters& param);
-+    virtual int getParameters(Parameters& param);
-+
-+    virtual int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    //Overwrite event source API to delegate related functions
-+    void registerListener(EventType eventType, EventListener* eventListener);
-+    void removeListener(EventType eventType, EventListener* eventListener);
-+
-+    virtual int start();
-+    virtual void stop();
-+
-+    // Overwrite PSysDagCallback API, used for returning back buffers from PSysDAG.
-+    void onFrameDone(const PSysTaskData& result);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PSysProcessor);
-+
-+private:
-+    int processNewFrame();
-+    std::shared_ptr<CameraBuffer> allocStatsBuffer(int index);
-+
-+    status_t prepareTask(CameraBufferPortMap *srcBuffers, CameraBufferPortMap *dstBuffers);
-+    void dispatchTask(CameraBufferPortMap &inBuf, CameraBufferPortMap &outBuf);
-+
-+    void handleEvent(EventData eventData);
-+
-+    long getSettingSequence(const CameraBufferPortMap &outBuf);
-+    bool needSkipOutputFrame(long sequence);
-+    bool needExecutePipe(long settingSequence, long inputSequence);
-+    bool needHoldOnInputFrame(long settingSequence, long inputSequence);
-+    bool needSwitchPipe(long sequence);
-+
-+    void outputRawImage(std::shared_ptr<CameraBuffer> &srcBuf,
-+                        std::shared_ptr<CameraBuffer> &dstBuf);
-+
-+    void handleRawReprocessing(CameraBufferPortMap *srcBuffers,
-+                               CameraBufferPortMap *dstBuffers, bool *hasYuv, bool *hasRawOutput);
-+    bool isBufferHoldForRawReprocess(long sequence);
-+
-+private:
-+    int mCameraId;
-+    static const nsecs_t kWaitDuration = 1000000000; //1000ms
-+    ParameterGenerator *mParameterGenerator;
-+
-+    IspSettings mIspSettings;
-+    RWLock mIspSettingsLock;
-+
-+    //Since the isp settings may be re-used in all modes, so the buffer size of
-+    //isp settings should be equal to frame buffer size.
-+    static const int IA_PAL_CONTROL_BUFFER_SIZE = 10;
-+
-+    Condition mFrameDoneSignal;
-+    std::queue<long> mSequenceInflight; // Save the sequences which are being processed.
-+
-+    std::vector<ConfigMode> mConfigModes;
-+    PSysDAGConfigModeMap mPSysDAGs;
-+    // Active config mode and tuning mode
-+    ConfigMode mCurConfigMode;
-+    TuningMode mTuningMode;
-+
-+    std::queue<EventDataMeta> mMetaQueue;
-+    //Guard for the metadata queue
-+    Mutex  mMetaQueueLock;
-+    Condition mMetaAvailableSignal;
-+
-+    Port mRawPort;
-+
-+    // variables for sof alignment
-+    timeval mSofTimestamp;
-+    Mutex mSofLock;
-+    Condition mSofCondition;
-+
-+    // variables for opaque raw
-+    Port mOpaqueRawPort;
-+    std::mutex mRawBufferMapLock;
-+    std::map<long, CameraBufferPortMap> mRawBufferMap;
-+
-+    enum {
-+        PIPELINE_UNCREATED = 0,
-+        PIPELINE_CREATED
-+    } mStatus;
-+}; // End of class PSysProcessor
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
-new file mode 100644
-index 000000000000..ccb204dbc8b9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.cpp
-@@ -0,0 +1,125 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ProcessorManager"
-+
-+#include "ProcessorManager.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#include "SwImageProcessor.h"
-+#include "PSysProcessor.h"
-+
-+namespace icamera {
-+
-+ProcessorManager::ProcessorManager(int cameraId) :
-+        mCameraId(cameraId),
-+        mPsysUsage(PSYS_NOT_USED)
-+{
-+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
-+}
-+
-+ProcessorManager::~ProcessorManager()
-+{
-+    LOG1("@%s, cameraId:%d", __func__, mCameraId);
-+
-+    deleteProcessors();
-+}
-+
-+std::vector<BufferQueue*> ProcessorManager::createProcessors(int inputFmt,
-+        const std::map<Port, stream_t>& producerConfigs,
-+        const std::map<int, Port>& streamIdToPortMap,
-+        stream_config_t *streamList, const Parameters& param, ParameterGenerator* paramGenerator)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    ProcessorConfig processorItem;
-+    processorItem.mInputConfigs = producerConfigs;
-+    for (const auto& item : streamIdToPortMap) {
-+        if (streamList->streams[item.first].streamType == CAMERA_STREAM_INPUT) continue;
-+        processorItem.mOutputConfigs[item.second] = streamList->streams[item.first];
-+    }
-+
-+    // Check if PSysProcessor can be used.
-+    mPsysUsage = PSYS_NORMAL;
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
-+            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
-+
-+        if (!PlatformData::usePsys(mCameraId, streamList->streams[i].format)) {
-+            mPsysUsage = PSYS_NOT_USED;
-+            break;
-+        }
-+    }
-+
-+    if (mPsysUsage == PSYS_NORMAL) {
-+        LOG1("Using normal Psys to do image processing.");
-+        processorItem.mProcessor = new PSysProcessor(mCameraId, paramGenerator);
-+        mProcessors.push_back(processorItem);
-+    }
-+
-+    if (mPsysUsage == PSYS_NOT_USED) {
-+        LOG1("Using software to do color conversion.");
-+        processorItem.mProcessor = new SwImageProcessor(mCameraId);
-+        mProcessors.push_back(processorItem);
-+    }
-+
-+    std::vector<BufferQueue*> processors;
-+    for (auto& p : mProcessors) {
-+        processors.push_back(p.mProcessor);
-+    }
-+
-+    return processors;
-+}
-+
-+int ProcessorManager::deleteProcessors()
-+{
-+    for (auto& item : mProcessors) {
-+        delete item.mProcessor;
-+    }
-+    mProcessors.clear();
-+
-+    mPsysUsage = PSYS_NOT_USED;
-+
-+    return OK;
-+}
-+
-+/**
-+ * Configure processor with input and output streams
-+ */
-+int ProcessorManager::configureProcessors(const std::vector<ConfigMode>& configModes,
-+                                          BufferProducer* producer,
-+                                          const Parameters& param)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    BufferProducer* preProcess =  nullptr;
-+    for (auto& item : mProcessors) {
-+        BufferQueue* processor = item.mProcessor;
-+        processor->setFrameInfo(item.mInputConfigs, item.mOutputConfigs);
-+        processor->setParameters(param);
-+        int ret = processor->configure(configModes);
-+        CheckError(ret < 0, ret, "Configure processor failed with:%d", ret);
-+
-+        processor->setBufferProducer(preProcess ? preProcess : producer);
-+        preProcess = processor;
-+    }
-+
-+    return OK;
-+}
-+
-+} // end of namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/ProcessorManager.h b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
-new file mode 100644
-index 000000000000..d11cb14877a4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/ProcessorManager.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "BufferQueue.h"
-+
-+namespace icamera {
-+
-+class ParameterGenerator;
-+
-+/**
-+ * \class ProcessorManager
-+ *
-+ * \brief ProcessorManager helps to create and maintain the post processors.
-+ */
-+class ProcessorManager {
-+public:
-+    ProcessorManager(int cameraId);
-+    ~ProcessorManager();
-+
-+    std::vector<BufferQueue*> createProcessors(int inputFmt,
-+                                               const std::map<Port, stream_t>& producerConfigs,
-+                                               const std::map<int, Port>& streamIdToPortMap,
-+                                               stream_config_t *streamList, const Parameters& param,
-+                                               ParameterGenerator* paramGenerator);
-+    int configureProcessors(const std::vector<ConfigMode>& configModes, BufferProducer* producer,
-+                            const Parameters& param);
-+    int deleteProcessors();
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(ProcessorManager);
-+private:
-+    int mCameraId;
-+
-+    enum PSysUsage {
-+        PSYS_NOT_USED = 0,
-+        PSYS_NORMAL,
-+        PSYS_WEAVING,
-+        PSYS_SCALE,
-+        PSYS_CSC,
-+        PSYS_SCALE_CSC,
-+        PSYS_WEAVING_SCALE,
-+        PSYS_WEAVING_SCALE_CSC,
-+        PSYS_FISHEYE,
-+        PSYS_MONO_DS,
-+    } mPsysUsage;
-+
-+    struct ProcessorConfig {
-+        BufferQueue* mProcessor;
-+        std::map<Port, stream_t> mInputConfigs;
-+        std::map<Port, stream_t> mOutputConfigs;
-+    };
-+
-+    std::vector<ProcessorConfig> mProcessors;
-+};
-+
-+} // end of namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.cpp b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
-new file mode 100644
-index 000000000000..b1ee355c67e6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
-@@ -0,0 +1,537 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "RequestThread"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "RequestThread.h"
-+
-+using std::vector;
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+RequestThread::RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen) :
-+    mCameraId(cameraId),
-+    m3AControl(a3AControl),
-+    mParamGenerator(aParamGen),
-+    mPerframeControlSupport(false),
-+    mGet3AStatWithFakeRequest(false),
-+    mRequestsInProcessing(0),
-+    mFirstRequest(true),
-+    mRequestConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
-+    mUserConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_END),
-+    mNeedReconfigPipe(false),
-+    mReconfigPipeScore(0),
-+    mActive(false),
-+    mLastRequestId(-1),
-+    mLastPredictSeq(-1),
-+    mBlockRequest(true)
-+{
-+    CLEAR(mStreamConfig);
-+    CLEAR(mConfiguredStreams);
-+    CLEAR(mFakeReqBuf);
-+
-+    mStreamConfig.operation_mode = CAMERA_STREAM_CONFIGURATION_MODE_END;
-+    mPerframeControlSupport = PlatformData::isFeatureSupported(mCameraId, PER_FRAME_CONTROL);
-+}
-+
-+RequestThread::~RequestThread()
-+{
-+    while (!mReqParamsPool.empty()) {
-+        mReqParamsPool.pop();
-+    }
-+}
-+
-+void RequestThread::requestExit()
-+{
-+    clearRequests();
-+
-+    Thread::requestExit();
-+    AutoMutex l(mPendingReqLock);
-+    mRequestSignal.signal();
-+}
-+
-+void RequestThread::clearRequests()
-+{
-+    LOG1("%s", __func__);
-+
-+    mActive = false;
-+    for (int streamId = 0; streamId < MAX_STREAM_NUMBER; streamId++) {
-+        FrameQueue& frameQueue = mOutputFrames[streamId];
-+        AutoMutex lock(frameQueue.mFrameMutex);
-+        while (!frameQueue.mFrameQueue.empty()) {
-+            frameQueue.mFrameQueue.pop();
-+        }
-+        frameQueue.mFrameAvailableSignal.broadcast();
-+    }
-+
-+    AutoMutex l(mPendingReqLock);
-+    mRequestsInProcessing = 0;
-+    while (!mPendingRequests.empty()) {
-+        mPendingRequests.pop_back();
-+    }
-+
-+    mLastRequestId = -1;
-+    mLastPredictSeq = -1;
-+    mFirstRequest = true;
-+    mBlockRequest = true;
-+}
-+
-+void RequestThread::setConfigureModeByParam(const Parameters& param)
-+{
-+    camera_scene_mode_t sceneMode = SCENE_MODE_MAX;
-+    if (param.getSceneMode(sceneMode) != OK) {
-+        return;
-+    }
-+
-+    ConfigMode configMode = CameraUtils::getConfigModeBySceneMode(sceneMode);
-+    LOG2("@%s, sceneMode %d, configMode %d", __func__, sceneMode, configMode);
-+
-+    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
-+        LOG2("%s: no valid config mode, skip setting", __func__);
-+        return;
-+    }
-+
-+    /* Reset internal mode related settings if requested mode is same as
-+     * the mode currently running for better stability.
-+     */
-+    if (mStreamConfig.operation_mode == configMode) {
-+        LOG2("%s: config mode %d keep unchanged.", __func__, configMode);
-+        mNeedReconfigPipe = false;
-+        mReconfigPipeScore = 0;
-+        mRequestConfigMode = configMode;
-+        return;
-+    }
-+
-+    if (mRequestConfigMode != configMode) {
-+        if (mRequestConfigMode != CAMERA_STREAM_CONFIGURATION_MODE_END) {
-+            mNeedReconfigPipe = true;
-+            mReconfigPipeScore = 0;
-+            LOG2("%s: request configure mode changed, reset score %d", __func__, mReconfigPipeScore);
-+        }
-+        LOG2("%s: mRequestConfigMode updated from %d to %d", __func__, mRequestConfigMode, configMode);
-+        mRequestConfigMode = configMode;
-+    } else if (mReconfigPipeScore < PlatformData::getPipeSwitchDelayFrame(mCameraId)) {
-+        mReconfigPipeScore ++;
-+        LOG2("%s: request configure mode unchanged, current score %d", __func__, mReconfigPipeScore);
-+    }
-+}
-+
-+int RequestThread::configure(const stream_config_t *streamList)
-+{
-+    mGet3AStatWithFakeRequest = mPerframeControlSupport ? PlatformData::isPsysContinueStats(mCameraId) : false;
-+    CLEAR(mFakeReqBuf);
-+    bool hasVideoStream = false;
-+
-+    mStreamConfig.num_streams = streamList->num_streams;
-+    mStreamConfig.operation_mode = streamList->operation_mode;
-+    mUserConfigMode = (ConfigMode)streamList->operation_mode;
-+    int previewStreamIndex = -1;
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        mConfiguredStreams[i] = streamList->streams[i];
-+        if (previewStreamIndex < 0 && mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW) {
-+            previewStreamIndex = i;
-+        }
-+        if (mConfiguredStreams[i].usage == CAMERA_STREAM_PREVIEW ||
-+            mConfiguredStreams[i].usage == CAMERA_STREAM_VIDEO_CAPTURE) {
-+            hasVideoStream = true;
-+        }
-+    }
-+
-+    LOG1("%s: user specified Configmode: %d, hasVideoStream %d", __func__, mUserConfigMode, hasVideoStream);
-+    if (mGet3AStatWithFakeRequest) {
-+        if (previewStreamIndex < 0) {
-+            LOGW("Can't get 3a stats event due to no preview stream");
-+            mGet3AStatWithFakeRequest = false;
-+        } else {
-+            stream_t &stream = mConfiguredStreams[previewStreamIndex];
-+            LOG1("%s: create fake request with stream index %d", __func__, previewStreamIndex);
-+            mFakeBuffer = CameraBuffer::create(mCameraId, BUFFER_USAGE_PSYS_INTERNAL, V4L2_MEMORY_USERPTR,
-+                                               stream.size, 0, stream.format,
-+                                               stream.width, stream.height);
-+
-+            mFakeReqBuf.s = stream;
-+            mFakeReqBuf.s.memType = V4L2_MEMORY_USERPTR;
-+            mFakeReqBuf.addr = mFakeBuffer->getUserBuffer()->addr;
-+        }
-+    }
-+    mStreamConfig.streams = mConfiguredStreams;
-+
-+    // Use concrete mode in RequestThread
-+    if ((ConfigMode)mStreamConfig.operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
-+        vector <ConfigMode> configModes;
-+        int ret = PlatformData::getConfigModesByOperationMode(mCameraId, mStreamConfig.operation_mode, configModes);
-+        CheckError((ret != OK || configModes.empty()), ret, "%s, get real ConfigMode failed %d", __func__, ret);
-+        mRequestConfigMode = configModes[0];
-+        LOG2("%s: use concrete mode %d as default initial mode for auto op mode", __func__, mRequestConfigMode);
-+        mStreamConfig.operation_mode = mRequestConfigMode;
-+    }
-+
-+    // Don't block request handling if no 3A stats (from video pipe)
-+    mBlockRequest = PlatformData::isEnableAIQ(mCameraId) && hasVideoStream;
-+
-+    LOG2("%s: mRequestConfigMode initial value: %d", __func__, mRequestConfigMode);
-+    return OK;
-+}
-+
-+bool RequestThread::blockRequest() {
-+    /**
-+     * Block request processing if:
-+     * 1. mBlockRequest is true (except the 1st request), or
-+     * 2. Too many requests in flight.
-+     */
-+    return ((mBlockRequest && (mLastRequestId >= 0)) ||
-+            mRequestsInProcessing >= PlatformData::getMaxRequestsInflight(mCameraId));
-+}
-+
-+int RequestThread::processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters* params)
-+{
-+    AutoMutex l(mPendingReqLock);
-+    CameraRequest request;
-+    request.mBufferNum = bufferNum;
-+    bool hasVideoBuffer = false;
-+
-+    for (int id = 0; id < bufferNum; id++) {
-+        request.mBuffer[id] = ubuffer[id];
-+        if (ubuffer[id]->s.usage == CAMERA_STREAM_PREVIEW ||
-+            ubuffer[id]->s.usage == CAMERA_STREAM_VIDEO_CAPTURE) {
-+            hasVideoBuffer = true;
-+        }
-+    }
-+
-+    if (mFirstRequest && !hasVideoBuffer) {
-+        LOG2("there is no video buffer in first request, so don't block request processing.");
-+        mBlockRequest = false;
-+    }
-+
-+    request.mParams = copyRequestParams(params);
-+
-+    // Raw reprocessing case, put it on the top.
-+    if (ubuffer[0]->sequence >= 0 && ubuffer[0]->timestamp > 0) {
-+        mPendingRequests.push_front(request);
-+    } else {
-+        mPendingRequests.push_back(request);
-+    }
-+
-+    if (!mActive) {
-+        mActive = true;
-+    }
-+
-+    mRequestSignal.signal();
-+    return OK;
-+}
-+
-+shared_ptr<Parameters>
-+RequestThread::copyRequestParams(const Parameters *srcParams)
-+{
-+    if (srcParams == nullptr)
-+        return nullptr;
-+
-+    if (mReqParamsPool.empty()) {
-+        shared_ptr<Parameters> sParams = std::make_shared<Parameters>();
-+        CheckError(!sParams, nullptr, "%s: no memory!", __func__);
-+        mReqParamsPool.push(sParams);
-+    }
-+
-+    shared_ptr<Parameters> sParams = mReqParamsPool.front();
-+    mReqParamsPool.pop();
-+    *sParams = *srcParams;
-+    return sParams;
-+}
-+
-+int RequestThread::waitFrame(int streamId, camera_buffer_t **ubuffer)
-+{
-+    FrameQueue& frameQueue = mOutputFrames[streamId];
-+    ConditionLock lock(frameQueue.mFrameMutex);
-+
-+    while (frameQueue.mFrameQueue.empty()) {
-+        int ret = frameQueue.mFrameAvailableSignal.waitRelative(
-+                      lock,
-+                      kWaitFrameDuration * SLOWLY_MULTIPLIER);
-+        if (!mActive) return INVALID_OPERATION;
-+
-+        if (ret == TIMED_OUT) {
-+            LOGW("@%s, mCameraId:%d, time out happens, wait recovery", __func__, mCameraId);
-+            return ret;
-+        }
-+    }
-+
-+    shared_ptr<CameraBuffer> camBuffer = frameQueue.mFrameQueue.front();
-+    frameQueue.mFrameQueue.pop();
-+    *ubuffer = camBuffer->getUserBuffer();
-+
-+    LOG2("@%s, frame returned. camera id:%d, stream id:%d", __func__, mCameraId, streamId);
-+
-+    return OK;
-+}
-+
-+int RequestThread::wait1stRequestDone()
-+{
-+    LOG1("%s", __func__);
-+    int ret = OK;
-+    ConditionLock lock(mFirstRequestLock);
-+    if (mFirstRequest) {
-+        LOG1("%s, waiting the first request done", __func__);
-+        ret = mFirstRequestSignal.waitRelative(
-+                  lock,
-+                  kWaitFirstRequestDoneDuration * SLOWLY_MULTIPLIER);
-+        if (ret == TIMED_OUT)
-+            LOGE("@%s: Wait 1st request timed out", __func__);
-+    }
-+
-+    return ret;
-+}
-+
-+void RequestThread::handleEvent(EventData eventData)
-+{
-+    if (!mActive) return;
-+
-+    /* Notes:
-+      * There should be only one of EVENT_ISYS_FRAME
-+      * and EVENT_PSYS_FRAME registered.
-+      * There should be only one of EVENT_xx_STATS_BUF_READY
-+      * registered.
-+      */
-+    switch (eventData.type) {
-+        case EVENT_ISYS_FRAME:
-+        case EVENT_PSYS_FRAME:
-+            {
-+                AutoMutex l(mPendingReqLock);
-+                if (mRequestsInProcessing > 0) {
-+                    mRequestsInProcessing--;
-+                }
-+                // Continue process(that maight be blocked due to many requests in flight).
-+                if (!mPendingRequests.empty()) {
-+                    mRequestSignal.signal();
-+                }
-+            }
-+            break;
-+        case EVENT_PSYS_STATS_BUF_READY:
-+            {
-+                AutoMutex l(mPendingReqLock);
-+                if (mBlockRequest) {
-+                    mBlockRequest = false;
-+                    mRequestSignal.signal();
-+                }
-+            }
-+            break;
-+        case EVENT_FRAME_AVAILABLE:
-+            {
-+                if (eventData.buffer->getUserBuffer() != &mFakeReqBuf) {
-+                    int streamId = eventData.data.frameDone.streamId;
-+                    FrameQueue& frameQueue = mOutputFrames[streamId];
-+
-+                    AutoMutex lock(frameQueue.mFrameMutex);
-+                    bool needSignal = frameQueue.mFrameQueue.empty();
-+                    frameQueue.mFrameQueue.push(eventData.buffer);
-+                    if (needSignal) {
-+                        frameQueue.mFrameAvailableSignal.signal();
-+                    }
-+                } else {
-+                    LOG2("%s: fake request return %ld", __func__, eventData.buffer->getSequence());
-+                }
-+
-+                AutoMutex l(mPendingReqLock);
-+                // Insert fake request if no any request in the HAL to keep 3A running
-+                if (mGet3AStatWithFakeRequest &&
-+                    eventData.buffer->getSequence() >= mLastPredictSeq &&
-+                    mPendingRequests.empty()) {
-+                    LOGW("No request, insert fake req after req %d to keep 3A stats update",
-+                         mLastRequestId);
-+                    CameraRequest fakeRequest;
-+                    fakeRequest.mBufferNum = 1;
-+                    fakeRequest.mBuffer[0] = &mFakeReqBuf;
-+                    mFakeReqBuf.sequence = -1;
-+                    mPendingRequests.push_back(fakeRequest);
-+                    mRequestSignal.signal();
-+                }
-+            }
-+            break;
-+        default:
-+            {
-+                LOGW("Unknown event type %d", eventData.type);
-+            }
-+            break;
-+    }
-+}
-+
-+/**
-+ * Get the next request for processing.
-+ * Return false if no pending requests or it is not ready for reconfiguration.
-+ */
-+bool RequestThread::fetchNextRequest(CameraRequest& request)
-+{
-+    ConditionLock lock(mPendingReqLock);
-+    if (isReconfigurationNeeded() && !isReadyForReconfigure()) {
-+        return false;
-+    }
-+
-+    if (mPendingRequests.empty()) {
-+        return false;
-+    }
-+
-+    request = mPendingRequests.front();
-+    mRequestsInProcessing++;
-+    mPendingRequests.pop_front();
-+    LOG2("@%s, mRequestsInProcessing %d", __func__, mRequestsInProcessing);
-+    return true;
-+}
-+
-+/**
-+ * Check if ConfigMode is changed or not.
-+ * If new ConfigMode is different with previous configured ConfigMode,
-+ * return true.
-+ */
-+bool RequestThread::isReconfigurationNeeded()
-+{
-+    bool needReconfig = (mUserConfigMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO &&
-+                         PlatformData::getAutoSwitchType(mCameraId) == AUTO_SWITCH_FULL &&
-+                         mNeedReconfigPipe &&
-+                         (mReconfigPipeScore >= PlatformData::getPipeSwitchDelayFrame(mCameraId)));
-+    LOG2("%s: need reconfigure %d, score %d, decision %d",
-+         __func__, mNeedReconfigPipe, mReconfigPipeScore, needReconfig);
-+    return needReconfig;
-+}
-+
-+/**
-+ * If reconfiguration is needed, there are 2 extra conditions for reconfiguration:
-+ * 1, there is no buffer in processing; 2, there is buffer in mPendingRequests.
-+ * Return true if reconfiguration is ready.
-+ */
-+bool RequestThread::isReadyForReconfigure()
-+{
-+    return (!mPendingRequests.empty() && mRequestsInProcessing == 0);
-+}
-+
-+bool RequestThread::threadLoop()
-+{
-+    bool restart = false;
-+    {
-+         ConditionLock lock(mPendingReqLock);
-+
-+         bool waitProcessing = blockRequest() || mPendingRequests.empty();
-+         if (waitProcessing) {
-+            int ret = mRequestSignal.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
-+            waitProcessing = blockRequest() || mPendingRequests.empty();
-+            if (ret == TIMED_OUT || waitProcessing) {
-+                LOGW("%s: wait event time out", __func__);
-+                return true;
-+            }
-+        }
-+
-+        restart = isReconfigurationNeeded();
-+    }
-+
-+    if (!mActive) {
-+        return false;
-+    }
-+
-+    CameraRequest request;
-+    if (fetchNextRequest(request)) {
-+        // Update for reconfiguration
-+        if (request.mParams.get()) {
-+            setConfigureModeByParam(*(request.mParams.get()));
-+        }
-+        // Re-check
-+        if (restart && isReconfigurationNeeded()) {
-+            handleReconfig();
-+        }
-+
-+        handleRequest(request);
-+    }
-+    return true;
-+}
-+
-+void RequestThread::handleReconfig()
-+{
-+    LOG1("%s, ConfigMode change from %x to %x", __func__,
-+            mStreamConfig.operation_mode, mRequestConfigMode);
-+    mStreamConfig.operation_mode = mRequestConfigMode;
-+    EventConfigData configData;
-+    configData.streamList = &mStreamConfig;
-+    EventData eventData;
-+    eventData.type = EVENT_DEVICE_RECONFIGURE;
-+    eventData.data.config = configData;
-+    notifyListeners(eventData);
-+    mNeedReconfigPipe = false;
-+    mReconfigPipeScore = 0;
-+    return;
-+}
-+
-+void RequestThread::handleRequest(CameraRequest& request)
-+{
-+    long predictSequence = mLastPredictSeq + 1;
-+    if (mLastPredictSeq < 0) {
-+        predictSequence = PlatformData::getInitialSkipFrame(mCameraId);
-+    }
-+
-+    // Raw reprocessing case, don't run 3A.
-+    if (request.mBuffer[0]->sequence >= 0 && request.mBuffer[0]->timestamp > 0) {
-+        predictSequence = request.mBuffer[0]->sequence;
-+        if (request.mParams.get()) {
-+            mParamGenerator->updateParameters(predictSequence, request.mParams.get());
-+        }
-+    } else {
-+        if (request.mParams.get()) {
-+            m3AControl->setParameters(*request.mParams);
-+        }
-+        m3AControl->run3A(mPerframeControlSupport? &predictSequence : nullptr);
-+
-+        // Check the final prediction value
-+        if (predictSequence <= mLastPredictSeq) {
-+            LOGW("predict %ld error! should > %ld", predictSequence, mLastPredictSeq);
-+            predictSequence = mLastPredictSeq + 1;
-+        }
-+
-+        mLastPredictSeq = predictSequence;
-+        mLastRequestId++;
-+        mParamGenerator->saveParameters(mLastPredictSeq, mLastRequestId, request.mParams.get());
-+    }
-+    LOG2("%s: Process request: %ld:%ld, out buffer %d, param? %s", __func__,
-+          mLastRequestId, predictSequence, request.mBufferNum,
-+          request.mParams.get() ? "true" : "false");
-+
-+    // Sent event to handle request buffers
-+    EventRequestData requestData;
-+    requestData.bufferNum = request.mBufferNum;
-+    requestData.buffer = request.mBuffer;
-+    requestData.param = request.mParams.get();
-+    requestData.settingSeq = predictSequence;
-+    EventData eventData;
-+    eventData.type = EVENT_PROCESS_REQUEST;
-+    eventData.data.request = requestData;
-+    notifyListeners(eventData);
-+
-+    // Recycle params ptr for re-using
-+    if (request.mParams) {
-+        AutoMutex l(mPendingReqLock);
-+        mReqParamsPool.push(request.mParams);
-+    }
-+
-+    {
-+        AutoMutex l(mFirstRequestLock);
-+        if (mFirstRequest) {
-+            LOG1("%s: first request done", __func__);
-+            mFirstRequest = false;
-+            mFirstRequestSignal.signal();
-+        }
-+    }
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/RequestThread.h b/camera/hal/intel/ipu6/src/core/RequestThread.h
-new file mode 100644
-index 000000000000..b4a867b78beb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/RequestThread.h
-@@ -0,0 +1,153 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <deque>
-+
-+#include "iutils/Thread.h"
-+#include "PlatformData.h"
-+#include "Parameters.h"
-+#include "AiqUnit.h"
-+#include "Parameters.h"
-+#include "ParameterGenerator.h"
-+
-+namespace icamera {
-+
-+/*
-+ * The RequestThread is used to assist CameraDevice to handle request(qbuf/dqbuf).
-+ */
-+class RequestThread : public Thread, public EventSource, public EventListener {
-+public:
-+    RequestThread(int cameraId, AiqUnitBase *a3AControl, ParameterGenerator* aParamGen);
-+    ~RequestThread();
-+
-+    bool threadLoop();
-+    void requestExit();
-+
-+    void handleEvent(EventData eventData);
-+
-+    /**
-+     * \Clear pending requests.
-+     */
-+    void clearRequests();
-+
-+    /**
-+     * \Accept requests from user.
-+     */
-+    int processRequest(int bufferNum, camera_buffer_t **ubuffer, const Parameters * params);
-+
-+    int waitFrame(int streamId, camera_buffer_t **ubuffer);
-+
-+    /**
-+     * \Block the caller until the first request is processed.
-+     */
-+    int wait1stRequestDone();
-+
-+    /**
-+     * \brief configure the streams, devices and post processor.
-+     *
-+     * \param streamList: all the streams info
-+     *
-+     * \return OK if succeed and BAD_VALUE if failed
-+     */
-+    int configure(const stream_config_t *streamList);
-+
-+    /**
-+     * \brief get stream config in request thread.
-+     */
-+    stream_config_t getStreamConfig() { return mStreamConfig; };
-+
-+    /**
-+     * \brief set request configure mode by parameters.
-+     */
-+    void setConfigureModeByParam(const Parameters& param);
-+
-+private:
-+    int mCameraId;
-+    AiqUnitBase *m3AControl;
-+    ParameterGenerator *mParamGenerator;
-+    bool mPerframeControlSupport;
-+    bool mGet3AStatWithFakeRequest;
-+    camera_buffer_t mFakeReqBuf;
-+    std::shared_ptr<CameraBuffer> mFakeBuffer;
-+
-+    struct CameraRequest {
-+        CameraRequest() : mBufferNum(0), mParams(nullptr) {
-+            CLEAR(mBuffer);
-+        }
-+
-+        int mBufferNum;
-+        camera_buffer_t *mBuffer[MAX_STREAM_NUMBER];
-+        std::shared_ptr<Parameters> mParams;
-+    };
-+
-+    std::shared_ptr<Parameters> copyRequestParams(const Parameters *params);
-+
-+    /**
-+     * \Fetch one request from pending request Q for processing.
-+     */
-+    bool fetchNextRequest(CameraRequest& request);
-+    bool isReadyForReconfigure();
-+    bool isReconfigurationNeeded();
-+    std::shared_ptr<Parameters> acquireParam();
-+
-+    void handleReconfig();
-+    void handleRequest(CameraRequest& request);
-+    bool blockRequest();
-+
-+    static const int kMaxRequests = MAX_BUFFER_COUNT;
-+    static const nsecs_t kWaitFrameDuration = 5000000000; // 5s
-+    static const nsecs_t kWaitDuration = 2000000000; // 2s
-+    static const nsecs_t kWaitFirstRequestDoneDuration = 1000000000; // 1s
-+
-+    //Guard for all the pending requests
-+    Mutex mPendingReqLock;
-+    Condition mRequestSignal;
-+    std::deque <CameraRequest> mPendingRequests;
-+    std::queue <std::shared_ptr<Parameters> > mReqParamsPool;
-+    int mRequestsInProcessing;
-+
-+    // Guard for the first request.
-+    Mutex mFirstRequestLock;
-+    Condition mFirstRequestSignal;
-+    bool mFirstRequest;
-+
-+    // Internal used for restart function
-+    ConfigMode mRequestConfigMode; // the ConfigMode is gotten from parameters set from user or AE result
-+    ConfigMode mUserConfigMode; // user specified ConfigMode during initial configure
-+    // Whether pipe need to reconfigure
-+    bool mNeedReconfigPipe;
-+    // Score indicate the num of consecutive configure mode settings, to make switch stable.
-+    unsigned int  mReconfigPipeScore;
-+    stream_config_t mStreamConfig;
-+    stream_t mConfiguredStreams[MAX_STREAM_NUMBER];
-+
-+    struct FrameQueue {
-+        Mutex mFrameMutex;
-+        Condition mFrameAvailableSignal;
-+        CameraBufQ mFrameQueue;
-+    };
-+    FrameQueue mOutputFrames[MAX_STREAM_NUMBER];
-+    bool mActive;
-+
-+    long mLastRequestId;
-+    long mLastPredictSeq;
-+    bool mBlockRequest;  // Process the 2nd or 3th request after the 1st 3A event
-+                         // to avoid unstable AWB at the beginning of stream on
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
-new file mode 100644
-index 000000000000..7af50e24b747
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.cpp
-@@ -0,0 +1,331 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SensorHwCtrl"
-+
-+#include <limits.h>
-+
-+#include <linux/types.h>
-+#include <linux/v4l2-controls.h>
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "SensorHwCtrl.h"
-+#include "V4l2DeviceFactory.h"
-+#include "PlatformData.h"
-+
-+using std::vector;
-+
-+namespace icamera {
-+
-+SensorHwCtrl::SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev):
-+        mPixelArraySubdev(pixelArraySubdev),
-+        mSensorOutputSubdev(sensorOutputSubdev),
-+        mCameraId(cameraId),
-+        mHorzBlank(0),
-+        mVertBlank(0),
-+        mCropWidth(0),
-+        mCropHeight(0),
-+        mCurFll(0),
-+        mCalculatingFrameDuration(true)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+}
-+
-+SensorHwCtrl::~SensorHwCtrl()
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+}
-+
-+SensorHwCtrl* SensorHwCtrl::createSensorCtrl(int cameraId)
-+{
-+    if (!PlatformData::isIsysEnabled(cameraId)) {
-+        return new DummySensor(cameraId);
-+    }
-+
-+    std::string subDevName;
-+    SensorHwCtrl* sensorCtrl = nullptr;
-+    int ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_ARRAY, subDevName);
-+    if (ret == OK) {
-+        LOG1("%s ArraySubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
-+        V4L2Subdevice* pixelArraySubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
-+
-+        V4L2Subdevice* pixelOutputSubdev = nullptr;
-+        // Binner and Scaler subdev only exits in CrlModule driver
-+        if (PlatformData::isUsingCrlModule(cameraId)) {
-+            subDevName.clear();
-+            ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_SCALER, subDevName);
-+            if (ret == OK) {
-+                LOG1("%s ScalerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
-+                pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
-+            } else {
-+                subDevName.clear();
-+                ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_BINNER, subDevName);
-+                if (ret == OK) {
-+                    LOG1("%s BinnerSubdev camera id:%d dev name:%s", __func__, cameraId, subDevName.c_str());
-+                    pixelOutputSubdev = V4l2DeviceFactory::getSubDev(cameraId, subDevName);
-+                }
-+            }
-+        }
-+
-+        sensorCtrl = new SensorHwCtrl(cameraId, pixelArraySubdev, pixelOutputSubdev);
-+    } else {
-+        LOG1("%s create a dummy sensor ctrl for camera id:%d", __func__, cameraId);
-+        sensorCtrl = new DummySensor(cameraId);
-+    }
-+    return sensorCtrl;
-+}
-+
-+int SensorHwCtrl::getActivePixelArraySize(int &width, int &height, int &pixelCode)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    int status = mPixelArraySubdev->GetPadFormat(0, &width, &height, &pixelCode);
-+    mCropWidth = width;
-+    mCropHeight = height;
-+
-+    LOG2("@%s, width:%d, height:%d, status:%d", __func__, width, height, status);
-+    return status;
-+}
-+
-+int SensorHwCtrl::getPixelRate(int &pixelRate)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    int ret = mPixelArraySubdev->GetControl(V4L2_CID_PIXEL_RATE, &pixelRate);
-+
-+    LOG2("@%s, pixelRate:%d, ret:%d", __func__, pixelRate, ret);
-+
-+    return ret;
-+}
-+
-+int SensorHwCtrl::setTestPatternMode(int32_t testPatternMode)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    LOG2("@%s, testPatternMode: %d", __func__, testPatternMode);
-+    return mPixelArraySubdev->SetControl(V4L2_CID_TEST_PATTERN, testPatternMode);
-+}
-+
-+int SensorHwCtrl::setExposure(const vector<int>& coarseExposures, const vector<int>& fineExposures)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+    CheckError((coarseExposures.empty() || fineExposures.empty()), BAD_VALUE, "No exposure data!");
-+
-+    LOG2("%s coarseExposure=%d fineExposure=%d", __func__, coarseExposures[0], fineExposures[0]);
-+    LOG2("SENSORCTRLINFO: exposure_value=%d", coarseExposures[0]);
-+    return mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, coarseExposures[0]);
-+}
-+
-+int SensorHwCtrl::setGains(const vector<int>& analogGains, const vector<int>& digitalGains)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+    CheckError((analogGains.empty() || digitalGains.empty()), BAD_VALUE, "No gain data!");
-+
-+	int ret = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, analogGains[0]);
-+	ret |= mPixelArraySubdev->SetControl(V4L2_CID_DIGITAL_GAIN, digitalGains[0]);
-+    return ret;
-+}
-+
-+int SensorHwCtrl::setLineLengthPixels(int llp)
-+{
-+    int status = OK;
-+    LOG2("@%s, llp:%d", __func__, llp);
-+
-+    if (mCalculatingFrameDuration) {
-+        int horzBlank = llp - mCropWidth;
-+        if (mHorzBlank != horzBlank) {
-+            status = mPixelArraySubdev->SetControl(V4L2_CID_HBLANK, horzBlank);
-+        }
-+    }
-+
-+    CheckError(status != OK, status, "failed to set llp.");
-+
-+    mHorzBlank = llp - mCropWidth;
-+    return status;
-+}
-+
-+int SensorHwCtrl::setFrameLengthLines(int fll)
-+{
-+    int status = OK;
-+    LOG2("@%s, fll:%d", __func__, fll);
-+
-+    if (mCalculatingFrameDuration) {
-+        int vertBlank = fll - mCropHeight;
-+        if (mVertBlank != vertBlank) {
-+            status = mPixelArraySubdev->SetControl(V4L2_CID_VBLANK, vertBlank);
-+        }
-+    }
-+
-+    mCurFll = fll;
-+
-+    CheckError(status != OK, status, "failed to set fll.");
-+
-+    mVertBlank = fll - mCropHeight;
-+    return status;
-+}
-+
-+int SensorHwCtrl::setFrameDuration(int llp, int fll)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    int status = OK;
-+    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
-+
-+    /* only set them to driver when llp or fll is not 0 */
-+    if (llp) {
-+        status = setLineLengthPixels(llp);
-+    }
-+
-+    if (fll) {
-+        status |= setFrameLengthLines(fll);
-+    }
-+
-+    return status;
-+}
-+
-+int SensorHwCtrl::getLineLengthPixels(int &llp)
-+{
-+    int status = OK;
-+
-+    if (mCalculatingFrameDuration) {
-+        int horzBlank = 0;
-+        status = mPixelArraySubdev->GetControl(V4L2_CID_HBLANK, &horzBlank);
-+        if (status == OK) {
-+            mHorzBlank = horzBlank;
-+            llp = horzBlank + mCropWidth;
-+        }
-+    }
-+
-+    LOG2("@%s, llp:%d", __func__, llp);
-+    CheckError(status != OK, status, "failed to get llp.");
-+
-+    return status;
-+}
-+
-+int SensorHwCtrl::getFrameLengthLines(int &fll)
-+{
-+    int status = OK;
-+
-+    if (mCalculatingFrameDuration) {
-+        int vertBlank = 0;
-+        status = mPixelArraySubdev->GetControl(V4L2_CID_VBLANK, &vertBlank);
-+        if (status == OK) {
-+            mVertBlank = vertBlank;
-+            fll = vertBlank + mCropHeight;
-+        }
-+    }
-+
-+    LOG2("@%s, fll:%d", __func__, fll);
-+    CheckError(status != OK, status, "failed to get fll.");
-+
-+    return status;
-+}
-+
-+int SensorHwCtrl::getFrameDuration(int &llp, int &fll)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    int status = getLineLengthPixels(llp);
-+
-+    status |= getFrameLengthLines(fll);
-+    LOG2("@%s, llp:%d, fll:%d", __func__, llp, fll);
-+
-+    return status;
-+}
-+
-+int SensorHwCtrl::getVBlank(int &vblank)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    vblank = mVertBlank;
-+    LOG2("@%s, vblank:%d", __func__, vblank);
-+
-+    return OK;
-+}
-+
-+/**
-+ * get exposure range value from sensor driver
-+ *
-+ * \param[OUT] coarse_exposure: exposure min value
-+ * \param[OUT] fine_exposure: exposure max value
-+ * \param[OUT] exposure_step: step of exposure
-+ * V4L2 does not support FINE_EXPOSURE setting
-+ *
-+ * \return OK if successfully.
-+ */
-+int SensorHwCtrl::getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mPixelArraySubdev, NO_INIT, "pixel array sub device is not set");
-+
-+    v4l2_queryctrl exposure = {};
-+    exposure.id = V4L2_CID_EXPOSURE;
-+    int status = mPixelArraySubdev->QueryControl(&exposure);
-+    CheckError(status != OK, status, "Couldn't get exposure Range status:%d", status);
-+
-+    exposureMin = exposure.minimum;
-+    exposureMax = exposure.maximum;
-+    exposureStep = exposure.step;
-+    LOG2("@%s, exposureMin:%d, exposureMax:%d, exposureStep:%d",
-+        __func__, exposureMin, exposureMax, exposureStep);
-+
-+    return status;
-+}
-+
-+int SensorHwCtrl::setFrameRate(float fps)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2);
-+    CheckError(!mSensorOutputSubdev, NO_INIT, "sensor output sub device is not set");
-+
-+    LOG2("%s FPS is: %f", __func__, fps);
-+
-+    struct v4l2_queryctrl query;
-+    CLEAR(query);
-+    query.id = V4L2_CID_LINK_FREQ;
-+    int status = mSensorOutputSubdev->QueryControl(&query);
-+    CheckError(status != OK, status, "Couldn't get V4L2_CID_LINK_FREQ, status:%d", status);
-+
-+    LOG2("@%s, query V4L2_CID_LINK_FREQ:, default_value:%d, maximum:%d, minimum:%d, step:%d",
-+        __func__, query.default_value, query.maximum, query.minimum, query.step);
-+
-+    int mode = 0;
-+    if (query.maximum == query.minimum) {
-+        mode = query.default_value;
-+    } else {
-+        /***********************************************************************************
-+         * WA: This heavily depends on sensor driver implementation, need to find a graceful
-+         * solution.
-+         * imx185:
-+         * When fps larger than 30, should switch to high speed mode, currently only
-+         * 0, 1, 2 are available. 0 means 720p 30fps, 1 means 2M 30fps, and 2 means 2M 60fps.
-+         * imx290:
-+         * 0 and 1 available, for 30 and higher FPS.
-+         ***********************************************************************************/
-+        mode = (fps > 30) ? query.maximum : (query.maximum - 1);
-+    }
-+    LOG2("@%s, set V4L2_CID_LINK_FREQ to %d", __func__, mode);
-+    return mSensorOutputSubdev->SetControl(V4L2_CID_LINK_FREQ, mode);
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
-new file mode 100644
-index 000000000000..c05f5329eff7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SensorHwCtrl.h
-@@ -0,0 +1,99 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <vector>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+/**
-+ * Base class for sensor control might be inherited by ones have different sensor driver
-+ */
-+class SensorHwCtrl {
-+
-+public:
-+    static SensorHwCtrl* createSensorCtrl(int cameraId);
-+    SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev);
-+    virtual ~SensorHwCtrl();
-+
-+    virtual int setTestPatternMode(int32_t testPatternMode);
-+    virtual int getPixelRate(int &pixelRate);
-+    virtual int setExposure(const std::vector<int>& coarseExposures,
-+                            const std::vector<int>& fineExposures);
-+    virtual int setGains(const std::vector<int>& analogGains, const std::vector<int>& digitalGains);
-+    virtual int setFrameDuration(int llp, int fll);
-+    virtual int getFrameDuration(int &llp, int &fll);
-+    virtual int getVBlank(int &vblank);
-+    virtual int getActivePixelArraySize(int &width, int &height, int &pixelCode);
-+    virtual int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep);
-+
-+    virtual int setFrameRate(float fps);
-+private:
-+    int setLineLengthPixels(int llp);
-+    int getLineLengthPixels(int &llp);
-+    int setFrameLengthLines(int fll);
-+    int getFrameLengthLines(int &fll);
-+
-+private:
-+
-+    V4L2Subdevice* mPixelArraySubdev;
-+    V4L2Subdevice* mSensorOutputSubdev;
-+    int mCameraId;
-+    int mHorzBlank;
-+    int mVertBlank;
-+    int mCropWidth;
-+    int mCropHeight;
-+
-+    // Current frame length lines
-+    int mCurFll;
-+
-+    /**
-+     * if mCalculatingFrameDuration is true, it means sensor can't set/get llp/fll directly,
-+     * use HBlank/VBlank to calculate it.
-+     */
-+    bool mCalculatingFrameDuration;
-+}; //class SensorHwCtrl
-+
-+/**
-+ * Dummy sensor hardware ctrl interface for those sensors cannot be controlled.
-+ */
-+class DummySensor : public SensorHwCtrl {
-+public:
-+    DummySensor(int cameraId) : SensorHwCtrl(cameraId, nullptr, nullptr) {}
-+    ~DummySensor() {}
-+
-+    int setTestPatternMode(int32_t testPatternMode) { return OK; }
-+    int setDevice(V4L2Subdevice* pixelArraySubdev) { return OK; }
-+    int getPixelRate(int &pixelRate) { return OK; }
-+    int setExposure(const std::vector<int>& coarseExposures,
-+                    const std::vector<int>& fineExposures) { return OK; }
-+    int setGains(const std::vector<int>& analogGains,
-+                 const std::vector<int>& digitalGains) { return OK; }
-+    int setFrameDuration(int llp, int fll) { return OK; }
-+    int getFrameDuration(int &llp, int &fll) { return OK; }
-+    int getVBlank(int &vblank) { return OK; }
-+    int getActivePixelArraySize(int &width, int &height, int &code) { return OK; }
-+    int getExposureRange(int &exposureMin, int &exposureMax, int &exposureStep) { return OK; }
-+    int setFrameRate(float fps) { return OK; }
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SofSource.cpp b/camera/hal/intel/ipu6/src/core/SofSource.cpp
-new file mode 100644
-index 000000000000..a371314fd9b1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SofSource.cpp
-@@ -0,0 +1,226 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "SofSource"
-+
-+#include <poll.h>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include "V4l2DeviceFactory.h"
-+#include "PlatformData.h"
-+
-+#include "SofSource.h"
-+
-+namespace icamera {
-+
-+SofSource::SofSource(int cameraId) :
-+    mPollThread(nullptr),
-+    mCameraId(cameraId),
-+    mIsysReceiverSubDev(nullptr),
-+    mExitPending(false)
-+{
-+    LOG1("%s: SofSource is constructed", __func__);
-+
-+    mConfiguredDevices.clear();
-+    mSofDisabled = !PlatformData::isEnableAIQ(mCameraId);
-+
-+    mSofDisabled = mSofDisabled || !PlatformData::isIsysEnabled(cameraId);
-+}
-+
-+SofSource::~SofSource()
-+{
-+    LOG1("%s: SofSource is distructed.", __func__);
-+}
-+
-+int SofSource::init()
-+{
-+    if (mSofDisabled) {
-+        return OK;
-+    }
-+
-+    mPollThread = new PollThread(this);
-+
-+    return OK;
-+}
-+
-+int SofSource::deinit()
-+{
-+    if (mSofDisabled) {
-+        return OK;
-+    }
-+
-+    int status = deinitDev();
-+    mPollThread->join();
-+    delete mPollThread;
-+    return status;
-+}
-+
-+int SofSource::initDev()
-+{
-+    //Create and open receiver subdevice.
-+    std::string subDeviceNodeName;
-+
-+    if (PlatformData::getDevNameByType(mCameraId, VIDEO_ISYS_RECEIVER, subDeviceNodeName) == OK) {
-+        LOG1("%s: found ISYS receiver subdevice %s", __func__, subDeviceNodeName.c_str());
-+    }
-+
-+    auto isysReceiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
-+    // if the sub device does not change, do nothing.
-+    if (isysReceiverSubDev == mIsysReceiverSubDev) {
-+        return OK;
-+    }
-+
-+    deinitDev();
-+
-+    mIsysReceiverSubDev = isysReceiverSubDev;
-+    mConfiguredDevices.push_back(mIsysReceiverSubDev);
-+
-+#ifdef CAL_BUILD
-+    int status = mIsysReceiverSubDev->SubscribeEvent(V4L2_EVENT_FRAME_SYNC);
-+    CheckError(status != OK, status, "%s: Failed to subscribe sync event 0", __func__);
-+    LOG1("%s: Using SOF event id 0 for sync", __func__);
-+#else
-+    int id = 0;
-+    int status = mIsysReceiverSubDev->SubscribeEvent(V4L2_EVENT_FRAME_SYNC, id);
-+    CheckError(status != OK, status, "%s: Failed to subscribe sync event %d", __func__, id);
-+    LOG1("%s: Using SOF event id %d for sync", __func__, id);
-+#endif
-+
-+    return OK;
-+}
-+
-+int SofSource::deinitDev()
-+{
-+    if (mIsysReceiverSubDev == nullptr) return OK;
-+
-+    int status = 0;
-+#ifdef CAL_BUILD
-+    status = mIsysReceiverSubDev->UnsubscribeEvent(V4L2_EVENT_FRAME_SYNC);
-+    if (status == OK) {
-+        LOG1("%s: Unsubscribe SOF event id 0 done", __func__);
-+    } else {
-+        LOGE("%s: Failed to unsubscribe SOF event 0, status: %d", __func__, status);
-+    }
-+#else
-+    int id = 0;
-+    status = mIsysReceiverSubDev->UnsubscribeEvent(V4L2_EVENT_FRAME_SYNC, id);
-+    if (status == OK) {
-+        LOG1("%s: Unsubscribe SOF event id %d done", __func__, id);
-+    } else {
-+        LOGE("%s: Failed to unsubscribe SOF event %d", __func__, id);
-+    }
-+#endif
-+
-+    mConfiguredDevices.clear();
-+    return status;
-+}
-+
-+int SofSource::configure()
-+{
-+    if (mSofDisabled) {
-+        return OK;
-+    }
-+
-+    return initDev();
-+}
-+
-+int SofSource::start()
-+{
-+    LOG1("%s", __func__);
-+    if (mSofDisabled) {
-+        return OK;
-+    }
-+
-+    int status = mPollThread->run("SofSource", PRIORITY_URGENT_AUDIO);
-+    mExitPending = false;
-+    return status;
-+
-+}
-+
-+int SofSource::stop()
-+{
-+    LOG1("%s", __func__);
-+    if (mSofDisabled) {
-+        return OK;
-+    }
-+
-+    mExitPending = true;
-+    int status = mPollThread->requestExitAndWait();
-+    return status;
-+
-+}
-+
-+int SofSource::poll()
-+{
-+    int ret = 0;
-+    const int pollTimeoutCount = 10;
-+    const int pollTimeout = 1000;
-+
-+    vector<V4L2Subdevice*> activeDevices;
-+
-+    std::vector<V4L2Device*> pollDevs(mConfiguredDevices.begin(), mConfiguredDevices.end());
-+    V4L2DevicePoller poller {pollDevs, -1};
-+
-+    vector<V4L2Device*> readyDevices;
-+
-+    LOG2("@%s", __func__);
-+
-+    int timeOutCount = pollTimeoutCount;
-+
-+    while (timeOutCount-- && ret == 0) {
-+
-+        ret = poller.Poll(pollTimeout, POLLPRI | POLLIN | POLLOUT | POLLERR, &readyDevices);
-+
-+        if (ret == 0 && mExitPending) {
-+            //timed out
-+            LOGD("@%s: Timedout or thread is not running, ret = %d", __func__, ret);
-+            return BAD_VALUE;
-+        }
-+    }
-+
-+    //handle the poll error
-+    if (ret < 0) {
-+        if (mExitPending) {
-+            //Exiting, no error
-+            return 0;
-+        }
-+
-+        LOGE("%s: Poll error", __func__);
-+        return ret;
-+    } else if (ret == 0) {
-+        LOGD("@%s, Sof poll timeout.", __func__);
-+        return 0;
-+    }
-+
-+    struct v4l2_event event;
-+    CLEAR(event);
-+    mIsysReceiverSubDev->DequeueEvent(&event);
-+
-+    EventDataSync syncData;
-+    syncData.sequence = event.u.frame_sync.frame_sequence;
-+    syncData.timestamp.tv_sec = event.timestamp.tv_sec;
-+    syncData.timestamp.tv_usec = (event.timestamp.tv_nsec / 1000);
-+    LOG2("%s:sof event sequence %ld, event.id %u", __func__, syncData.sequence, event.id);
-+    EventData eventData;
-+    eventData.type = EVENT_ISYS_SOF;
-+    eventData.buffer = nullptr;
-+    eventData.data.sync = syncData;
-+    notifyListeners(eventData);
-+
-+    return 0;
-+}
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/SofSource.h b/camera/hal/intel/ipu6/src/core/SofSource.h
-new file mode 100644
-index 000000000000..bebf85cc4dae
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SofSource.h
-@@ -0,0 +1,64 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <vector>
-+
-+#include "CameraEvent.h"
-+
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+//Event source for SOF event polled from subdevice.
-+class SofSource : public EventSource {
-+public:
-+    SofSource(int cameraId);
-+    ~SofSource();
-+    int init();
-+    int deinit();
-+    int configure();
-+    int start();
-+    int stop();
-+private:
-+    int initDev();
-+    int deinitDev();
-+
-+private:
-+    class PollThread : public Thread {
-+        SofSource *mSofSource;
-+        public:
-+            PollThread(SofSource *sofSource)
-+                    : mSofSource(sofSource) { }
-+
-+            virtual bool threadLoop() {
-+                int ret = mSofSource->poll();
-+                return (ret == 0) ? true : false;
-+            }
-+    };
-+    PollThread* mPollThread;
-+    int mCameraId;
-+    V4L2Subdevice* mIsysReceiverSubDev;
-+    vector<V4L2Subdevice*> mConfiguredDevices;
-+    bool mExitPending;
-+    bool mSofDisabled;
-+
-+    int poll();
-+};
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/StreamSource.h b/camera/hal/intel/ipu6/src/core/StreamSource.h
-new file mode 100644
-index 000000000000..fc1a09c583f1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/StreamSource.h
-@@ -0,0 +1,49 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "BufferQueue.h"
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \interface StreamSource
-+ * It's an abstract interface for buffer producers, like CaptureUnit, FileSource
-+ * or external source producer.
-+ */
-+class StreamSource : public BufferProducer {
-+public:
-+    StreamSource(int memType) : BufferProducer(memType) {}
-+    virtual ~StreamSource() {}
-+    /* Initialize stream source */
-+    virtual int init() = 0;
-+    /* Deinitialize stream source */
-+    virtual void deinit() = 0;
-+    /* Configure stream source */
-+    virtual int configure(const std::map<Port, stream_t>& outputFrames,
-+                          const std::vector<ConfigMode>& configModes,
-+                          uint32_t bufferNum) = 0;
-+    /* Start stream source */
-+    virtual int start() = 0;
-+    /* Stop stream source */
-+    virtual int stop() = 0;
-+    /* Remove all liateners */
-+    virtual void removeAllFrameAvailableListener() = 0;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
-new file mode 100644
-index 000000000000..9652d6558405
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.cpp
-@@ -0,0 +1,158 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SwImageProcessor"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/SwImageConverter.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+
-+#include "PlatformData.h"
-+#include "CameraBuffer.h"
-+
-+#include "SwImageProcessor.h"
-+
-+namespace icamera {
-+
-+SwImageProcessor::SwImageProcessor(int cameraId) : mCameraId(cameraId)
-+{
-+    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
-+    LOG1("@%s camera id:%d", __func__, mCameraId);
-+
-+    mProcessThread = new ProcessThread(this);
-+}
-+
-+SwImageProcessor::~SwImageProcessor()
-+{
-+    LOGW("@%s: You are running the SwProcessor instead of PSYS pipeline. SwProcessor is for debug only", __func__);
-+
-+    mProcessThread->join();
-+    delete mProcessThread;
-+}
-+
-+int SwImageProcessor::start()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s", __func__);
-+    AutoMutex   l(mBufferQueueLock);
-+
-+    int memType = mOutputFrameInfo.begin()->second.memType;
-+    CheckError(memType == V4L2_MEMORY_DMABUF, BAD_VALUE,
-+          "@%s: DMABUF is not supported in SwProcessor as output", __func__);
-+
-+    int ret = allocProducerBuffers(mCameraId, MAX_BUFFER_COUNT);
-+    CheckError(ret != OK, ret, "@%s: Allocate Buffer failed", __func__);
-+    mThreadRunning = true;
-+    mProcessThread->run("SwImageProcessor", PRIORITY_NORMAL);
-+
-+    return 0;
-+}
-+
-+void SwImageProcessor::stop()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("%s", __func__);
-+
-+    mProcessThread->requestExit();
-+    {
-+        AutoMutex l(mBufferQueueLock);
-+        mThreadRunning = false;
-+        //Wakeup the thread to exit
-+        mFrameAvailableSignal.signal();
-+        mOutputAvailableSignal.signal();
-+    }
-+
-+    mProcessThread->requestExitAndWait();
-+
-+    // Thread is not running. It is safe to clear the Queue
-+    clearBufferQueues();
-+}
-+
-+int SwImageProcessor::processNewFrame()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG2("%s", __func__);
-+
-+    int ret = OK;
-+    std::map<Port, std::shared_ptr<CameraBuffer> > srcBuffers, dstBuffers;
-+    std::shared_ptr<CameraBuffer> cInBuffer;
-+    Port inputPort = INVALID_PORT;
-+
-+    { // Auto lock mBufferQueueLock scope
-+    ConditionLock lock(mBufferQueueLock);
-+    ret = waitFreeBuffersInQueue(lock, srcBuffers, dstBuffers);
-+
-+    if (!mThreadRunning) return -1;
-+
-+    CheckError((ret < 0), -1, "@%s: wake up from the wait abnomal such as stop", __func__);
-+
-+    inputPort = srcBuffers.begin()->first;
-+    cInBuffer = srcBuffers[inputPort];
-+
-+    for (auto& output: mOutputQueue) {
-+        output.second.pop();
-+    }
-+
-+    for (auto& input: mInputQueue) {
-+        input.second.pop();
-+    }
-+    } // End of auto lock mBufferQueueLock scope
-+
-+    CheckError(!cInBuffer, BAD_VALUE, "Invalid input buffer.");
-+
-+    for (auto& dst : dstBuffers) {
-+        Port port = dst.first;
-+        std::shared_ptr<CameraBuffer> cOutBuffer = dst.second;
-+        // If the output buffer is nullptr, that means user doesn't request that buffer,
-+        // so it doesn't need to be handled here.
-+        if (!cOutBuffer) {
-+            continue;
-+        }
-+
-+        //No Lock for this function make sure buffers are not freed before the stop
-+        ret = SwImageConverter::convertFormat(cInBuffer->getWidth(), cInBuffer->getHeight(),
-+                (unsigned char *)cInBuffer->getBufferAddr(), cInBuffer->getBufferSize(), cInBuffer->getFormat(),
-+                (unsigned char *)cOutBuffer->getBufferAddr(), cOutBuffer->getBufferSize(), cOutBuffer->getFormat());
-+        CheckError((ret < 0), ret, "format convertion failed with %d", ret);
-+
-+        if (CameraDump::isDumpTypeEnable(DUMP_SW_IMG_PROC_OUTPUT)) {
-+            CameraDump::dumpImage(mCameraId, cOutBuffer, M_SWIPOP);
-+        }
-+
-+        //update the interlaced field, sequence, and timestamp  from the src buf to dst buf
-+        cOutBuffer->updateV4l2Buffer(*cInBuffer->getV4L2Buffer().Get());
-+
-+        //Notify listener: No lock here: mBufferConsumerList will not updated in this state
-+        for (auto &it : mBufferConsumerList) {
-+            it->onFrameAvailable(port, cOutBuffer);
-+        }
-+    }
-+
-+    {
-+        PERF_CAMERA_ATRACE_PARAM3("sof.sequence", cInBuffer->getSequence(), "csi2_port", cInBuffer->getCsi2Port(), \
-+                                    "virtual_channel", cInBuffer->getVirtualChannel());
-+    }
-+
-+    // Return the buffers to the producer
-+    if (mBufferProducer) {
-+        mBufferProducer->qbuf(inputPort, cInBuffer);
-+    }
-+
-+    return OK;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SwImageProcessor.h b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
-new file mode 100644
-index 000000000000..caf832608a73
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SwImageProcessor.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "BufferQueue.h"
-+
-+namespace icamera {
-+
-+/**
-+  * SwImageProcessor runs the Image Process Alogirhtm in the CPU.
-+  * It implements the BufferConsumer and BufferProducer Interface
-+  * This class is for debug purpose when the PsysProcess is not ready.
-+  */
-+class SwImageProcessor: public BufferQueue {
-+public:
-+    SwImageProcessor(int cameraId);
-+    virtual ~SwImageProcessor();
-+
-+    /**
-+     * \brief Buffer producer Interface
-+     */
-+    virtual int     start();
-+    virtual void    stop();
-+
-+private:
-+    int processNewFrame();
-+
-+private:
-+    int mCameraId;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.cpp b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
-new file mode 100644
-index 000000000000..0ebf7d52b471
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SyncManager.cpp
-@@ -0,0 +1,198 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SyncManager"
-+
-+#include <sys/sysinfo.h>
-+#include <math.h>
-+#include "iutils/CameraLog.h"
-+#include "SyncManager.h"
-+
-+namespace icamera {
-+SyncManager *SyncManager::sInstance = nullptr;
-+Mutex  SyncManager::sLock;
-+
-+#define SEC_TO_MS(sec) ((sec) * (1000))
-+#define USEC_TO_MS(usec) ((usec) / (1000))
-+
-+const int max_vc_sync_count = 128;
-+
-+SyncManager* SyncManager::getInstance()
-+{
-+    AutoMutex lock(sLock);
-+    if (sInstance == nullptr) {
-+        sInstance = new SyncManager();
-+    }
-+
-+    return sInstance;
-+}
-+
-+void SyncManager::releaseInstance()
-+{
-+    AutoMutex lock(sLock);
-+    LOG1("@%s", __func__);
-+
-+    if (sInstance) {
-+        delete sInstance;
-+        sInstance = nullptr;
-+    }
-+}
-+
-+SyncManager::SyncManager()
-+{
-+    LOG1("@%s", __func__);
-+    AutoMutex lock(mLock);
-+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
-+       for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
-+           mCameraBufInfo[i][j].sequence = -1;
-+           CLEAR(mCameraBufInfo[i][j].sof_ts);
-+       }
-+    }
-+
-+    mTotalSyncCamNum = 0;
-+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++)
-+        mVcSyncCount[i] = 0;
-+}
-+
-+SyncManager::~SyncManager()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+bool SyncManager::isSynced(int cameraId, long sequence)
-+{
-+    LOG1("@%s", __func__);
-+    const int TIME_DIFF_MS = 2;
-+    bool sync = true;
-+    int index = sequence % MAX_BUFFER_COUNT;
-+
-+    AutoMutex lock(mLock);
-+    camera_buf_info bufInfo = mCameraBufInfo[cameraId][index];
-+
-+    int  syncNum = 0;
-+    bool isSync[MAX_CAMERA_NUMBER];
-+    long frameSyncedMs[MAX_CAMERA_NUMBER];
-+    long curFrameMs = USEC_TO_MS(bufInfo.sof_ts.tv_usec) + SEC_TO_MS(bufInfo.sof_ts.tv_sec);
-+
-+    //first step: To check whether the current frame is synced with others camera channel
-+    //            if timestamp difference <= 2ms, then think the frame is synced
-+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
-+        isSync[i] = false;
-+        frameSyncedMs[i] = 0;
-+        if (mCameraBufInfo[i][0].sequence == -1 || i == cameraId) {
-+            continue;
-+        }
-+        for (int j = 0; j < MAX_BUFFER_COUNT; j++) {
-+            if (mCameraBufInfo[i][j].sequence >= 0) {
-+                camera_buf_info &temp = mCameraBufInfo[i][j];
-+                long tempFrameMs = USEC_TO_MS(temp.sof_ts.tv_usec) + SEC_TO_MS(temp.sof_ts.tv_sec);
-+                if (abs(tempFrameMs - curFrameMs ) <= TIME_DIFF_MS) {
-+                    isSync[syncNum] = true;
-+                    frameSyncedMs[syncNum] = tempFrameMs;
-+                    syncNum++;
-+                    break;
-+                }
-+            }
-+        }
-+    }
-+    //second step: if current frame is synced with frames from other cameraID,
-+    //             to check whether other 3 channel frames synced or not
-+    if (syncNum >= mTotalSyncCamNum - 1) {
-+        for (int i = 0; i < mTotalSyncCamNum - 1; i++) {
-+            if (isSync[i]) {
-+                if ((i + 1 < mTotalSyncCamNum - 1) &&
-+                        abs(frameSyncedMs[i]-frameSyncedMs[i+1]) <= TIME_DIFF_MS) {
-+                    sync &= true;
-+                } else if ((i + 1 == mTotalSyncCamNum - 1) &&
-+                        abs(frameSyncedMs[i]-frameSyncedMs[0]) <= TIME_DIFF_MS) {
-+                    sync &= true;
-+                } else {
-+                    sync &= false;
-+                }
-+            }
-+        }
-+    } else {
-+        sync = false;
-+    }
-+    LOG1("Id:%d, sof_ts:%ldms, sequence:%ld sync %d", cameraId, curFrameMs, sequence, sync);
-+    return sync;
-+}
-+
-+void SyncManager::updateCameraBufInfo(int cameraId, camera_buf_info* info)
-+{
-+    LOG1("@%s", __func__);
-+    int index = info->sequence % MAX_BUFFER_COUNT;
-+    AutoMutex lock(mLock);
-+    mCameraBufInfo[cameraId][index] = *info;
-+}
-+
-+void SyncManager::updateSyncCamNum()
-+{
-+    AutoMutex l(mLock);
-+    CheckError(mTotalSyncCamNum >= MAX_CAMERA_NUMBER, VOID_VALUE,
-+               "%s: sync cameras enough!", __func__);
-+    mTotalSyncCamNum++;
-+}
-+
-+bool SyncManager::vcSynced(int vc)
-+{
-+    CheckError(vc >= MAX_CAMERA_NUMBER, false, "%s: vc %d error!", __func__, vc);
-+
-+    AutoMutex l(mVcSyncLock);
-+    int count = mVcSyncCount[vc];
-+    int minCount = INT_MAX;
-+    int maxCount = 0;
-+
-+    for (int i = 0; i < mTotalSyncCamNum; i++) {
-+        minCount = std::min(minCount, mVcSyncCount[i]);
-+        maxCount = std::max(maxCount, mVcSyncCount[i]);
-+    }
-+
-+    // Check again if status is circling back to 0.
-+    // Most of time handling code won't be executed because condition is false.
-+    if (maxCount - minCount > max_vc_sync_count / 2) {
-+        minCount = max_vc_sync_count;
-+        maxCount = 0;
-+        for (int i = 0; i < mTotalSyncCamNum; i++) {
-+            count = (mVcSyncCount[i] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
-+            minCount = std::min(minCount, count);
-+            maxCount = std::max(maxCount, count);
-+        }
-+        count = (mVcSyncCount[vc] + max_vc_sync_count) % (max_vc_sync_count + max_vc_sync_count / 4);
-+    }
-+
-+    if (count > minCount) {
-+        LOGVCSYNC("vc %d ready: false", vc);
-+        return false;
-+    } else
-+        return true;
-+};
-+
-+void SyncManager::updateVcSyncCount(int vc)
-+{
-+    CheckError(vc >= MAX_CAMERA_NUMBER, VOID_VALUE, "%s: vc %d error!", __func__, vc);
-+    AutoMutex l(mVcSyncLock);
-+    mVcSyncCount[vc] = (mVcSyncCount[vc] + 1) % (max_vc_sync_count + 1);
-+};
-+
-+void SyncManager::printVcSyncCount(void)
-+{
-+    AutoMutex l(mVcSyncLock);
-+    for (int i = 0; i < mTotalSyncCamNum; i++)
-+        LOGVCSYNC("[%d]", mVcSyncCount[i]);
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/SyncManager.h b/camera/hal/intel/ipu6/src/core/SyncManager.h
-new file mode 100644
-index 000000000000..c0a6af883817
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/SyncManager.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+
-+struct camera_buf_info {
-+    long sequence;
-+    struct timeval sof_ts;
-+};
-+class SyncManager {
-+private:
-+    //Prevent to create multiple instances
-+    SyncManager();
-+    ~SyncManager();
-+public:
-+     /**
-+      * releaseInstance
-+      * This function must be called when the hal is destroyed.
-+      */
-+    static void releaseInstance();
-+    static SyncManager* getInstance();
-+
-+    bool isSynced(int cameraId, long sequence);
-+    void updateCameraBufInfo(int cameraId, camera_buf_info* info);
-+
-+    void updateSyncCamNum();
-+
-+    bool vcSynced(int vc);
-+    void updateVcSyncCount(int vc);
-+    void printVcSyncCount();
-+private:
-+    static SyncManager* sInstance;
-+    static Mutex sLock;
-+    Mutex mLock;
-+    struct camera_buf_info mCameraBufInfo[MAX_CAMERA_NUMBER][MAX_BUFFER_COUNT];
-+
-+    int mVcSyncCount[MAX_CAMERA_NUMBER];
-+    Mutex mVcSyncLock;
-+    int mTotalSyncCamNum;
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
-new file mode 100644
-index 000000000000..18cc54ef5f67
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
-@@ -0,0 +1,1224 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PGCommon"
-+
-+#include "PGCommon.h"
-+
-+#include <stdint.h>
-+#include <math.h>
-+#include <utility>
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+
-+namespace icamera {
-+
-+#define IS_VALID_TERMINAL(terminal) (terminal >=0 && terminal < mTerminalCount)
-+
-+int PGCommon::getFrameSize(int format, int width, int height,
-+                           bool needAlignedHeight, bool needExtraSize, bool needCompression)
-+{
-+    int size = 0;
-+    int cssFormat = PGUtils::getCssFmt(format);
-+    int stride = PGUtils::getCssStride(format, width);
-+    switch (cssFormat) {
-+    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:  // CSL6
-+        if (needAlignedHeight) {
-+            height = ALIGN_64(height);
-+        }
-+        size = stride * height * 3 / 2;
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    if (!size) {
-+        size = CameraUtils::getFrameSize(format, width, height,
-+                                         needAlignedHeight, needExtraSize, needCompression);
-+    }
-+    return size;
-+}
-+
-+PGCommon::PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid):
-+    mCtx(nullptr),
-+    mMemoryDevice(nullptr),
-+    mManifestBuffer(nullptr),
-+    mPGParamsBuffer(nullptr),
-+    mPGParamAdapt(nullptr),
-+    mPGId(pgId),
-+    mName(pgName),
-+    mTerminalBaseUid(terminalBaseUid),
-+    mPGCount(0),
-+    mPlatform(IA_P2P_PLATFORM_BXT_B0),
-+    mProgramCount(0),
-+    mTerminalCount(0),
-+    mManifestSize(0),
-+    mKernelBitmap(ia_css_kernel_bitmap_clear()),
-+    mRoutingBitmap(nullptr),
-+    mFragmentCount(1),
-+    mPGBuffer(nullptr),
-+    mProcessGroup(nullptr),
-+    mCmdExtBuffer(nullptr),
-+    mPPG(false),
-+    mPPGStarted(false),
-+    mPPGBuffer(nullptr),
-+    mPPGProcessGroup(nullptr),
-+    mToken(0),
-+    mEvent(nullptr),
-+    mTerminalBuffers(nullptr),
-+    mInputMainTerminal(-1),
-+    mOutputMainTerminal(-1)
-+{
-+    mTnrTerminalPair.inId = -1;
-+    mTnrTerminalPair.outId = -1;
-+    CLEAR(mTnrBuffers);
-+
-+    CLEAR(mCmd);
-+    CLEAR(mPPGCmd);
-+    CLEAR(mPPGCmdExtBuffer);
-+    CLEAR(mParamPayload);
-+    CLEAR(mCmdCfg);
-+}
-+
-+PGCommon::~PGCommon()
-+{
-+}
-+
-+int PGCommon::init()
-+{
-+    mDisableDataTermials.clear();
-+    mPGParamAdapt = std::unique_ptr<IntelPGParam>(new IntelPGParam(mPGId));
-+
-+    mCtx = ia_cipr_psys_create_context(nullptr);
-+    mMemoryDevice = ia_cipr_psys_get_memory_device(mCtx);
-+    int ret = getCapability();
-+    if (ret != OK) return ret;
-+
-+    // create mManifestBuffer
-+    ret = getManifest(mPGId);
-+    if (ret != OK) return ret;
-+
-+    mTerminalBuffers = (ia_cipr_buffer_t**)IA_CIPR_CALLOC(mTerminalCount, sizeof(ia_cipr_buffer_t*));
-+    CheckError(!mTerminalBuffers, NO_MEMORY, "Allocate terminal buffers fail");
-+    memset(mTerminalBuffers, 0, (mTerminalCount * sizeof(ia_cipr_buffer_t*)));
-+
-+    mFrameFormatType = std::unique_ptr<ia_css_frame_format_type[]>(new ia_css_frame_format_type[mTerminalCount]);
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        mFrameFormatType[i] = IA_CSS_N_FRAME_FORMAT_TYPES;
-+    }
-+
-+    mPgTerminals = std::unique_ptr<uint8_t[]>(new uint8_t[mTerminalCount]);
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        mPgTerminals[i] = IPU_MAX_TERMINAL_COUNT;
-+    }
-+
-+    std::vector<TerminalPair> tnrTerminalPairs;
-+    if (PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_TNR, &tnrTerminalPairs)) {
-+        mTnrTerminalPair = tnrTerminalPairs[0];
-+    }
-+    PGUtils::getTerminalPairs(mPGId, PGUtils::TERMINAL_PAIR_DVS, &mDvsTerminalPairs);
-+
-+    return ret;
-+}
-+
-+void PGCommon::deInit()
-+{
-+    if (mPPGStarted) {
-+        stopPPG();
-+        mPPGStarted = false;
-+    }
-+
-+    destoryCommands();
-+
-+    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
-+        if (mTnrBuffers[i]) {
-+            free(mTnrBuffers[i]);
-+            mTnrBuffers[i] = nullptr;
-+        }
-+    }
-+
-+    mDvsTerminalPairs.clear();
-+
-+    mDisableDataTermials.clear();
-+    if (mTerminalBuffers) {
-+        IA_CIPR_FREE(mTerminalBuffers);
-+    }
-+    ia_cipr_buffer_destroy(mManifestBuffer);
-+    ia_cipr_buffer_destroy(mPGParamsBuffer);
-+    ia_cipr_buffer_destroy(mPGBuffer);
-+    if (mPPGBuffer) {
-+        ia_cipr_buffer_destroy(mPPGBuffer);
-+    }
-+    for (auto& item : mBuffers) {
-+        ia_cipr_buffer_destroy(item.ciprBuf);
-+    }
-+
-+    ia_cipr_psys_destroy_context(mCtx);
-+
-+    mPGParamAdapt->deinit();
-+    mRoutingBitmap.reset();
-+}
-+
-+void PGCommon::setInputInfo(const TerminalFrameInfoMap& inputInfos)
-+{
-+    mInputMainTerminal = -1;
-+    int maxFrameSize = 0;
-+    for (const auto& item : inputInfos) {
-+        int terminal = item.first - mTerminalBaseUid;
-+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error input terminal %d", item.first);
-+
-+        FrameInfo frameInfo;
-+        frameInfo.mWidth = item.second.mWidth;
-+        frameInfo.mHeight = item.second.mHeight;
-+        frameInfo.mFormat = item.second.mFormat;
-+        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
-+        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
-+        mTerminalFrameInfos[terminal] = frameInfo;
-+        int size = frameInfo.mWidth * frameInfo.mHeight;
-+        if (maxFrameSize < size) {
-+            maxFrameSize = size;
-+            mInputMainTerminal = terminal;
-+        }
-+    }
-+
-+    // Create frame info for tnr terminals (i.e. data terminals)
-+    FrameInfo config = mTerminalFrameInfos[mInputMainTerminal];
-+    if (config.mHeight % 32) {
-+        LOG1("%s: height %d not multiple of 32, rounding up!", __func__, config.mHeight);
-+        config.mHeight = ((config.mHeight / 32) + 1) * 32;
-+    }
-+
-+    for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
-+        int tnrId = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
-+        if (tnrId < 0) continue;
-+
-+        mFrameFormatType[tnrId] = IA_CSS_DATA_FORMAT_NV12; // for IPU6
-+        mTerminalFrameInfos[tnrId] = config;
-+    }
-+
-+    LOG1("%s:%d use input terminal %d as main", __func__, mPGId, mInputMainTerminal);
-+}
-+
-+void PGCommon::setOutputInfo(const TerminalFrameInfoMap& outputInfos)
-+{
-+    mOutputMainTerminal = -1;
-+    int maxFrameSize = 0;
-+    for (const auto& item : outputInfos) {
-+        int terminal = item.first - mTerminalBaseUid;
-+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error output terminal %d", item.first);
-+
-+        FrameInfo frameInfo;
-+        frameInfo.mWidth = item.second.mWidth;
-+        frameInfo.mHeight = item.second.mHeight;
-+        frameInfo.mFormat = item.second.mFormat;
-+        frameInfo.mBpp = CameraUtils::getBpp(frameInfo.mFormat);
-+        frameInfo.mStride = CameraUtils::getStride(frameInfo.mFormat, frameInfo.mWidth);
-+        mTerminalFrameInfos[terminal] = frameInfo;
-+        int size = frameInfo.mWidth * frameInfo.mHeight;
-+        if (maxFrameSize < size) {
-+            maxFrameSize = size;
-+            mOutputMainTerminal = terminal;
-+        }
-+    }
-+}
-+
-+void PGCommon::setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals)
-+{
-+    for (auto const terminalUid : disabledTerminals) {
-+        int terminal = terminalUid - mTerminalBaseUid;
-+        CheckError(!IS_VALID_TERMINAL(terminal), VOID_VALUE, "error disabled terminal %d", terminalUid);
-+        mDisableDataTermials.push_back(terminal);
-+    }
-+}
-+
-+void PGCommon::setRoutingBitmap(const void* rbm, uint32_t bytes)
-+{
-+    if (!rbm || !bytes) {
-+        return;
-+    }
-+    const unsigned char* rbmData = (const unsigned char*)rbm;
-+
-+    if (mRoutingBitmap.get() == nullptr) {
-+        mRoutingBitmap = std::unique_ptr<ia_css_rbm_t>(new ia_css_rbm_t);
-+    }
-+
-+    ia_css_rbm_t* rbmPtr = mRoutingBitmap.get();
-+    *rbmPtr = ia_css_rbm_clear();
-+    for (uint32_t bit = 0; bit < bytes * 8; bit++) {
-+        if (rbmData[bit / 8] & (1 << (bit %8))) {
-+            *rbmPtr = ia_css_rbm_set(*rbmPtr, bit);
-+        }
-+    }
-+}
-+
-+int PGCommon::prepare(IspParamAdaptor* adaptor, int streamId)
-+{
-+    // Set the data terminal frame format
-+    int ret = configTerminalFormat();
-+    CheckError((ret != OK), ret, "%s, call configTerminal fail", __func__);
-+
-+    // Init and config p2p handle
-+    ret = initParamAdapt();
-+    CheckError((ret != OK), ret, "%s, init p2p fail", __func__);
-+
-+    // Query and save the requirement for each terminal, get the final kernel bitmap
-+    ret = mPGParamAdapt->prepare(adaptor->getIpuParameter(-1, streamId), mRoutingBitmap.get(), &mKernelBitmap);
-+    CheckError((ret != OK), ret, "%s, prepare p2p fail", __func__);
-+
-+    // Init PG parameters
-+    ret = handlePGParams(mFrameFormatType.get());
-+    CheckError((ret != OK), ret, "%s, call handlePGParams fail", __func__);
-+
-+    ret = setKernelBitMap();
-+    CheckError((ret != OK), ret, "%s, call setKernelBitMap fail", __func__);
-+
-+    ret = setTerminalParams(mFrameFormatType.get());
-+    CheckError((ret != OK), ret, "%s, call setTerminalParams fail", __func__);
-+
-+   // Create process group
-+    mProcessGroup = createPG(mPGBuffer);
-+    CheckError(!mProcessGroup, UNKNOWN_ERROR, "%s, create pg fail", __func__);
-+    uint8_t pgTerminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    for (uint8_t termNum = 0 ; termNum < pgTerminalCount; termNum++) {
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, termNum);
-+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
-+        uint16_t termIdx = ia_css_terminal_get_terminal_manifest_index(terminal);
-+        CheckError((termIdx >= IPU_MAX_TERMINAL_COUNT), UNKNOWN_ERROR, "wrong term index for terminal num %d", termNum);
-+        mPgTerminals[termIdx] = termNum;
-+    }
-+
-+    mPGParamAdapt->setPGAndPrepareProgram(mProcessGroup);
-+    int count = mPGParamAdapt->allocatePayloads(mTerminalCount, mParamPayload);
-+    CheckError(count != mTerminalCount, NO_MEMORY, "%s, allocatePayloads fails", __func__);
-+    preparePayloadBuffers();
-+
-+    ret = configureFragmentDesc();
-+    CheckError((ret != OK), ret, "%s, call configureFragmentDesc fail", __func__);
-+
-+    return OK;
-+}
-+
-+ia_css_process_group_t* PGCommon::createPG(ia_cipr_buffer_t*& pgBuffer)
-+{
-+    CheckError(pgBuffer, nullptr, "pg has already created");
-+
-+   // Create process group
-+    ia_css_program_group_param_t* pgParamsBuf =
-+        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
-+    ia_css_program_group_manifest_t* manifestBuf =
-+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
-+
-+    size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
-+    LOG1("%s process group size is %zu", __func__, pgSize);
-+
-+    void* pgMemory = mPGParamAdapt->allocatePGBuffer(pgSize);
-+    CheckError(!pgMemory, nullptr, "allocate PG error");
-+    pgBuffer = createUserPtrCiprBuffer(pgSize, pgMemory);
-+    CheckError(!pgBuffer, nullptr, "%s, call createUserPtrCiprBuffer fail", __func__);
-+
-+    ia_css_process_group_t* pg = ia_css_process_group_create(getCiprBufferPtr(pgBuffer),
-+                   (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer),
-+                   (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer));
-+    CheckError(!pg, nullptr, "Create process group failed.");
-+
-+    if (mPPG) {
-+        ia_css_process_group_set_num_queues(pg, 1);
-+    }
-+
-+    if (mRoutingBitmap.get()) {
-+        ia_css_process_group_set_routing_bitmap(pg, *mRoutingBitmap.get());
-+    }
-+    return pg;
-+}
-+
-+int PGCommon::createCommands()
-+{
-+    int bufCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    int ret = createCommand(mPGBuffer, mCmd, mCmdExtBuffer, bufCount);
-+    CheckError(ret, NO_MEMORY, "create cmd fail!");
-+    if (mPPG) {
-+        ret = createCommand(mPPGBuffer, mPPGCmd[PPG_CMD_TYPE_START], mPPGCmdExtBuffer[PPG_CMD_TYPE_START], bufCount);
-+        CheckError(ret, NO_MEMORY, "create ppg start buffer %d fail");
-+        ret = createCommand(mPPGBuffer, mPPGCmd[PPG_CMD_TYPE_STOP], mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP], 0);
-+        CheckError(ret, NO_MEMORY, "create ppg stop %d fail");
-+    }
-+
-+    ia_cipr_psys_event_config_t eventCfg;
-+    eventCfg.timeout = kEventTimeout;
-+    mEvent = ia_cipr_psys_create_event(&eventCfg);
-+    CheckError(!mEvent, NO_MEMORY, "create event fail");
-+
-+    return OK;
-+}
-+
-+int PGCommon::createCommand(ia_cipr_buffer_t* pg, ia_cipr_psys_command_t& cmd, ia_cipr_buffer_t*& extBuffer, int bufCount)
-+{
-+    ia_cipr_psys_command_config_t cmdCfg;
-+    ia_cipr_memory_t memory;
-+    ia_cipr_process_group_command_t *pgCommand;
-+    css_err_t ret;
-+
-+    // Create command with basic setting
-+    CLEAR(cmdCfg);
-+    cmdCfg.bufcount = bufCount;
-+    cmd = ia_cipr_psys_create_command(&cmdCfg);
-+    CheckError(!cmd, UNKNOWN_ERROR, "%s, call create_command fail", __func__);
-+    ret = ia_cipr_psys_get_command_config(cmd, &cmdCfg);
-+    CheckError(ret, UNKNOWN_ERROR, "%s, call get_command_config fail", __func__);
-+
-+    // Create ext buffer
-+    extBuffer = ia_cipr_buffer_create(sizeof(ia_cipr_process_group_command_t),
-+                                     IA_CIPR_MEMORY_ALLOCATE_CPU_PTR
-+                                     | IA_CIPR_MEMORY_PSYS_API,
-+                                     NULL);
-+    CheckError(!extBuffer, NO_MEMORY, "create cmd buffer fail");
-+
-+    ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, extBuffer);
-+    CheckError(ret, NO_MEMORY, "unable to access extBuffer");
-+    ret = ia_cipr_buffer_get_memory(extBuffer, &memory);
-+    CheckError(ret, NO_MEMORY, "unable to access extBuffer memory");
-+    pgCommand = (ia_cipr_process_group_command_t*)memory.cpu_ptr;
-+    CheckError(!pgCommand, NO_MEMORY, "unable to access memory.cpu_ptr");
-+    pgCommand->header.size = sizeof(ia_cipr_process_group_command_t);
-+    pgCommand->header.offset = sizeof(pgCommand->header);
-+    pgCommand->header.version = psys_command_ext_ppg_1; // for ipu6
-+    if (pgCommand->header.version == psys_command_ext_ppg_1) {
-+        IA_CIPR_MEMCOPY(pgCommand->dynamic_kernel_bitmap, sizeof(ia_css_kernel_bitmap_t),
-+                        &mKernelBitmap, sizeof(ia_css_kernel_bitmap_t));
-+    }
-+
-+    // Update setting and set back to command
-+    cmdCfg.id = mPGId;
-+    cmdCfg.priority = 1;
-+    cmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
-+    cmdCfg.pg_manifest_buf = mManifestBuffer;
-+    cmdCfg.pg = pg;
-+    cmdCfg.ext_buf = extBuffer;
-+    ret = ia_cipr_psys_set_command_config(cmd, &cmdCfg);
-+    CheckError(ret, UNKNOWN_ERROR, "%s, call set_command_config fail", __func__);
-+
-+    return OK;
-+}
-+
-+void PGCommon::destoryCommands()
-+{
-+    ia_cipr_psys_destroy_command(mCmd);
-+    ia_cipr_buffer_destroy(mCmdExtBuffer);
-+
-+    for (int i = 0; i < PPG_CMD_TYPE_COUNT; i++) {
-+        ia_cipr_psys_destroy_command(mPPGCmd[i]);
-+        ia_cipr_buffer_destroy(mPPGCmdExtBuffer[i]);
-+    }
-+
-+    if (mEvent) {
-+        ia_cipr_psys_destroy_event(mEvent);
-+    }
-+}
-+
-+int PGCommon::configTerminalFormat()
-+{
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        if (mTerminalFrameInfos.find(i) != mTerminalFrameInfos.end()) {
-+            mFrameFormatType[i] = PGUtils::getCssFmt(mTerminalFrameInfos[i].mFormat);
-+        }
-+    }
-+    return OK;
-+}
-+
-+int PGCommon::initParamAdapt()
-+{
-+    mFragmentCount = calcFragmentCount();
-+
-+    ia_css_program_group_manifest_t* manifestBuf =
-+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
-+
-+    PgConfiguration config;
-+    config.pgManifest = manifestBuf;
-+    config.pgManifestSize = getCiprBufferSize(mManifestBuffer);
-+    config.disableDataTermials = mDisableDataTermials;
-+    config.fragmentCount = mFragmentCount;
-+
-+    FrameInfo* pgInFrame = nullptr;
-+    FrameInfo* pgOutFrame = nullptr;
-+    if (mInputMainTerminal >= 0) {
-+        pgInFrame = &mTerminalFrameInfos[mInputMainTerminal];
-+    }
-+    if (mOutputMainTerminal >= 0) {
-+        pgOutFrame = &mTerminalFrameInfos[mOutputMainTerminal];
-+    }
-+    if (pgInFrame) {
-+        config.inputMainFrame.width = pgInFrame->mWidth;
-+        config.inputMainFrame.height = pgInFrame->mHeight;
-+        config.inputMainFrame.bpe = pgInFrame->mBpp; //TODO: use bpe
-+    }
-+
-+    if (pgOutFrame) {
-+        config.outputMainFrame.width = pgOutFrame->mWidth;
-+        config.outputMainFrame.height = pgOutFrame->mHeight;
-+        config.outputMainFrame.bpe = pgOutFrame->mBpp; //TODO: use bpe
-+    }
-+
-+    // init and config p2p handle
-+    int ret = mPGParamAdapt->init(mPlatform, config);
-+    return ret;
-+}
-+
-+// Support horizontal fragment only now
-+int PGCommon::calcFragmentCount(int overlap)
-+{
-+    int finalFragmentCount = 0;
-+    ia_css_data_terminal_manifest_t * data_terminal_manifest = nullptr;
-+
-+    const ia_css_program_group_manifest_t *manifest =
-+            (const ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
-+    CheckError(!manifest, 1, "%s, can't get manifest ptr", __func__);
-+
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        // Get max fragement size from manifest (align with 64)
-+        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(manifest, termIdx);
-+        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
-+
-+        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
-+            continue;
-+        }
-+
-+        data_terminal_manifest = ia_css_program_group_manifest_get_data_terminal_manifest(manifest, termIdx);
-+        CheckError(!data_terminal_manifest, -1, "%s, can't get data terminal manifest for term %d", __func__, termIdx);
-+
-+        uint16_t size[IA_CSS_N_DATA_DIMENSION] = {0};
-+        int ret = ia_css_data_terminal_manifest_get_max_size(data_terminal_manifest, size);
-+        CheckError(ret < 0, 1, "%s: get max fragment size error for term %d", __func__, termIdx);
-+
-+        size[IA_CSS_COL_DIMENSION] = ALIGN_64(size[IA_CSS_COL_DIMENSION]);
-+        // Overwrite the max value if need
-+
-+        // Calc fragment count for terminal (only for horizontal direction)
-+        int maxFragmentWidth = size[IA_CSS_COL_DIMENSION];
-+        FrameInfo config;
-+        CLEAR(config);
-+        if (mTerminalFrameInfos.find(termIdx) != mTerminalFrameInfos.end()) {
-+            config = mTerminalFrameInfos[termIdx];
-+        }
-+        int fragmentCovered = maxFragmentWidth;
-+        int fragmentCount = 1;
-+        /*
-+         * Calculate how many fragment frames can cover the whole frame.
-+         * Consider overlap between two fragment frames.
-+         * Example: frame width = 300, max fragment width = 100, overlap = 10
-+         *       0|------------------------------|300
-+         *  f1   0|----------|100
-+         *  f2           90|----------|190
-+         *  f3                   180|----------|280
-+         *  f4                            270|---|300
-+         */
-+        while (fragmentCovered < config.mWidth) {
-+            fragmentCovered += (maxFragmentWidth - overlap);
-+            fragmentCount++;
-+        }
-+
-+        if (finalFragmentCount < fragmentCount) {
-+            finalFragmentCount = fragmentCount;
-+        }
-+    }
-+
-+    LOG2("%s: final fragment count %d for pg %d", __func__, finalFragmentCount, mPGId);
-+    return finalFragmentCount;
-+}
-+
-+int PGCommon::handlePGParams(const ia_css_frame_format_type* frameFormatTypes)
-+{
-+    int pgParamsSize = ia_css_sizeof_program_group_param(mProgramCount, mTerminalCount, mFragmentCount);
-+
-+    mPGParamsBuffer = createUserPtrCiprBuffer(pgParamsSize);
-+    CheckError(!mPGParamsBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
-+
-+    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
-+    int ret = ia_css_program_group_param_init(pgParamsBuf, mProgramCount, mTerminalCount, mFragmentCount, frameFormatTypes);
-+    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_init fail", __func__);
-+
-+    if (mPPG) {
-+        ret = ia_css_program_group_param_set_protocol_version(
-+                pgParamsBuf,
-+                IA_CSS_PROCESS_GROUP_PROTOCOL_PPG);
-+        CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_protocol_version fail", __func__);
-+    }
-+    return ret;
-+}
-+
-+int PGCommon::setKernelBitMap()
-+{
-+    ia_css_program_group_param_t* pgParamsBuf = (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
-+    LOG1("%s: mKernelBitmap: %#018lx", __func__, mKernelBitmap);
-+    int ret = ia_css_program_group_param_set_kernel_enable_bitmap(pgParamsBuf, mKernelBitmap);
-+    CheckError((ret != OK), ret, "%s, call ia_css_program_group_param_set_kernel_enable_bitmap fail", __func__);
-+
-+    return ret;
-+}
-+
-+int PGCommon::setTerminalParams(const ia_css_frame_format_type* frameFormatTypes)
-+{
-+    ia_css_program_group_param_t* pgParamsBuf =
-+        (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
-+    ia_css_program_group_manifest_t* pg_manifest =
-+        (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
-+
-+    for (int i = 0; i < mTerminalCount; i++) {
-+        ia_css_terminal_param_t *terminalParam =
-+            ia_css_program_group_param_get_terminal_param(pgParamsBuf, i);
-+        CheckError(!terminalParam, UNKNOWN_ERROR, "%s, call ia_css_program_group_param_get_terminal_param fail", __func__);
-+        ia_css_terminal_manifest_t *terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, i);
-+        ia_css_terminal_type_t  terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
-+        if (!((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
-+            continue;
-+        }
-+
-+        FrameInfo config = mTerminalFrameInfos[i];
-+        terminalParam->frame_format_type = frameFormatTypes[i];
-+        terminalParam->dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
-+        terminalParam->dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
-+        terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION] = config.mWidth;
-+        terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION] = config.mHeight;
-+
-+        terminalParam->bpp = PGUtils::getCssBpp(config.mFormat);
-+        terminalParam->bpe = terminalParam->bpp;
-+        terminalParam->stride = PGUtils::getCssStride(config.mFormat, config.mWidth);
-+
-+        terminalParam->offset = 0;
-+        terminalParam->index[IA_CSS_COL_DIMENSION] = 0;
-+        terminalParam->index[IA_CSS_ROW_DIMENSION] = 0;
-+
-+        LOG2("%s: setTerminalParams: index=%d, format=%d, w=%d, h=%d, fw=%d, fh=%d, bpp=%d, bpe=%d, stride=%d, offset=%d, col=%d, row=%d",
-+             getName(), i,
-+             terminalParam->frame_format_type,
-+             terminalParam->dimensions[IA_CSS_COL_DIMENSION],
-+             terminalParam->dimensions[IA_CSS_ROW_DIMENSION],
-+             terminalParam->fragment_dimensions[IA_CSS_COL_DIMENSION],
-+             terminalParam->fragment_dimensions[IA_CSS_ROW_DIMENSION],
-+             terminalParam->bpp,
-+             terminalParam->bpe,
-+             terminalParam->stride,
-+             terminalParam->offset,
-+             terminalParam->index[IA_CSS_COL_DIMENSION],
-+             terminalParam->index[IA_CSS_ROW_DIMENSION]);
-+    }
-+
-+    return OK;
-+}
-+
-+int PGCommon::configureFragmentDesc()
-+{
-+    int num = mTerminalCount * mFragmentCount;
-+    std::unique_ptr<ia_p2p_fragment_desc[]> srcFragDesc =
-+                    std::unique_ptr<ia_p2p_fragment_desc[]>(new ia_p2p_fragment_desc[num]);
-+    int count = mPGParamAdapt->getFragmentDescriptors(num, srcFragDesc.get());
-+    CheckError(!count, UNKNOWN_ERROR, "getFragmentDescriptors fails");
-+
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        if (mPgTerminals[termIdx] >= IPU_MAX_TERMINAL_COUNT) {
-+            continue;
-+        }
-+
-+        ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
-+        ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
-+        if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
-+            continue;
-+        }
-+        configureTerminalFragmentDesc(termIdx, &srcFragDesc[termIdx]);
-+    }
-+    return OK;
-+}
-+
-+int PGCommon::configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc)
-+{
-+#define DDR_WORD_BYTES 64
-+    ia_css_terminal_t* terminal = ia_css_process_group_get_terminal(mProcessGroup, mPgTerminals[termIdx]);
-+    ia_css_terminal_type_t terminalType = ia_css_terminal_get_type(terminal);
-+    if (!((terminalType == IA_CSS_TERMINAL_TYPE_DATA_OUT) || (terminalType == IA_CSS_TERMINAL_TYPE_DATA_IN))) {
-+        return OK;
-+    }
-+
-+    bool vectorized = false;
-+    int packed_multiplier = 1;
-+    int packed_divider = 1;
-+    int dimension_bpp = PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat);
-+
-+    switch(mFrameFormatType[termIdx]) {
-+    case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
-+    case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED:
-+        vectorized = true;
-+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
-+        break;
-+    case IA_CSS_DATA_FORMAT_RAW:
-+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
-+        break;
-+    case IA_CSS_DATA_FORMAT_BAYER_GRBG:
-+    case IA_CSS_DATA_FORMAT_BAYER_RGGB:
-+    case IA_CSS_DATA_FORMAT_BAYER_BGGR:
-+    case IA_CSS_DATA_FORMAT_BAYER_GBRG:
-+        dimension_bpp = (uint8_t) ALIGN_8(PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat));
-+        break;
-+    case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
-+        dimension_bpp = (uint8_t) (PGUtils::getCssBpp(mTerminalFrameInfos[termIdx].mFormat) * 3 / 2);
-+        packed_multiplier = 3;
-+        packed_divider = 2;
-+        vectorized = true;
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
-+        ia_css_fragment_descriptor_t* dstFragDesc =
-+                ia_css_data_terminal_get_fragment_descriptor((ia_css_data_terminal_t*)terminal, fragIdx);
-+        CheckError(!dstFragDesc, -1, "%s: Can't get frag desc from terminal", __func__);
-+
-+        dstFragDesc->dimension[IA_CSS_COL_DIMENSION] = srcDesc[fragIdx].fragment_width;
-+        dstFragDesc->dimension[IA_CSS_ROW_DIMENSION] = srcDesc[fragIdx].fragment_height;
-+        dstFragDesc->index[IA_CSS_COL_DIMENSION] = (uint16_t)
-+                (((srcDesc[fragIdx].fragment_start_x * packed_multiplier)
-+                 / packed_divider) * (vectorized ? 2 : 1));
-+        dstFragDesc->index[IA_CSS_ROW_DIMENSION] = (uint16_t)
-+                (srcDesc[fragIdx].fragment_start_y / (vectorized ? 2 : 1));
-+
-+        int colOffset = 0;
-+        int pixels_per_word = 0;
-+        switch (mFrameFormatType[termIdx]) {
-+        case IA_CSS_DATA_FORMAT_YUV420:
-+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
-+        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED:
-+            /** \todo Fragmentation with DMA packed formats is still open, need to
-+             * check this again when it is more clear (see #H1804344344).
-+             */
-+            pixels_per_word = (uint16_t) floor(DDR_WORD_BYTES * 8 / dimension_bpp);
-+            colOffset = (uint16_t) (floor(dstFragDesc->index[IA_CSS_COL_DIMENSION] / pixels_per_word) * DDR_WORD_BYTES);
-+            colOffset = (uint16_t) (colOffset + (((dstFragDesc->index[IA_CSS_COL_DIMENSION] % pixels_per_word) * dimension_bpp) / 8));
-+            break;
-+        default:
-+            colOffset = (uint16_t) (dstFragDesc->index[IA_CSS_COL_DIMENSION] * dimension_bpp / 8);
-+            break;
-+        }
-+
-+        dstFragDesc->offset[IA_CSS_COL_DIMENSION] = (uint16_t)colOffset;
-+        dstFragDesc->offset[IA_CSS_ROW_DIMENSION] = dstFragDesc->index[IA_CSS_ROW_DIMENSION];
-+
-+        LOG2("%s: %d:%d: get frag desc %d (%d, %d, %d, %d)", __func__, mPGId, termIdx, fragIdx,
-+             srcDesc[fragIdx].fragment_width, srcDesc[fragIdx].fragment_height,
-+             srcDesc[fragIdx].fragment_start_x, srcDesc[fragIdx].fragment_start_y);
-+        LOG2("%s: %d:%d:       frag %d: size(%d, %d) index(%d, %d), offset(%d, %d)", __func__, mPGId, termIdx,fragIdx,
-+             dstFragDesc->dimension[IA_CSS_COL_DIMENSION],
-+             dstFragDesc->dimension[IA_CSS_ROW_DIMENSION],
-+             dstFragDesc->index[IA_CSS_COL_DIMENSION],
-+             dstFragDesc->index[IA_CSS_ROW_DIMENSION],
-+             dstFragDesc->offset[IA_CSS_COL_DIMENSION],
-+             dstFragDesc->offset[IA_CSS_ROW_DIMENSION]);
-+    }
-+    return OK;
-+}
-+
-+int PGCommon::iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
-+                      ia_binary_data *statistics, const ia_binary_data *ipuParameters)
-+{
-+    LOG2("%s:%s ++", getName(), __func__);
-+
-+    int ret = prepareTerminalBuffers(ipuParameters, inBufs, outBufs);
-+    CheckError((ret != OK), ret, "%s, prepareTerminalBuffers fail with %d", getName(), ret);
-+
-+    // Create PPG & PPG start/stop commands at the beginning
-+    if (mPPG && !mPPGBuffer) {
-+        ia_css_program_group_param_t* pgParamsBuf =
-+            (ia_css_program_group_param_t*)getCiprBufferPtr(mPGParamsBuffer);
-+        ia_css_program_group_manifest_t* manifestBuf =
-+            (ia_css_program_group_manifest_t*)getCiprBufferPtr(mManifestBuffer);
-+
-+        size_t pgSize = ia_css_sizeof_process_group(manifestBuf, pgParamsBuf);
-+
-+        mPPGBuffer = createUserPtrCiprBuffer(pgSize);
-+        CheckError(!mPPGBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
-+        mPPGProcessGroup = (ia_css_process_group_t*)getCiprBufferPtr(mPPGBuffer);
-+        MEMCPY_S(mPPGProcessGroup, pgSize, mProcessGroup, ia_css_process_group_get_size(mProcessGroup));
-+
-+    }
-+    if (!mCmd) {
-+        ret = createCommands();
-+       CheckError((ret != OK), ret, "%s, call createCommands fail", __func__);
-+    }
-+
-+    if (mPPG && !mPPGStarted) {
-+        ret = startPPG();
-+        CheckError((ret != OK), ret, "%s, startPPG fail", getName());
-+        mPPGStarted = true;
-+    }
-+
-+    ret = executePG();
-+    CheckError((ret != OK), ret, "%s, executePG fail", getName());
-+
-+    if (statistics) {
-+        ret = mPGParamAdapt->decode(mTerminalCount, mParamPayload, statistics);
-+        CheckError((ret != OK), ret, "%s, decode fail", getName());
-+    }
-+
-+    LOG2("%s:%s -- ", getName(), __func__);
-+    return ret;
-+}
-+
-+int PGCommon::preparePayloadBuffers()
-+{
-+    ia_cipr_buffer_t* ciprBuf = nullptr;
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        if (mParamPayload[termIdx].size && mParamPayload[termIdx].data) {
-+            ciprBuf = registerUserBuffer(mParamPayload[termIdx].size, mParamPayload[termIdx].data);
-+            CheckError(!ciprBuf, NO_MEMORY, "%s, register payload buffer %p for term %d fail",
-+                       __func__, mParamPayload[termIdx].data, termIdx);
-+            memset(mParamPayload[termIdx].data, 0, PAGE_ALIGN(mParamPayload[termIdx].size));
-+            mTerminalBuffers[termIdx] = ciprBuf;
-+        }
-+    }
-+
-+    if (mTnrTerminalPair.inId >= 0 && !mTnrBuffers[TNR_BUFFER_IN_INDEX]) {
-+        LOG1("%s:%s allocate the TNR input and output buffers", __func__, getName());
-+        int size = CameraUtils::getFrameSize(mTerminalFrameInfos[mInputMainTerminal].mFormat,
-+                                             mTerminalFrameInfos[mInputMainTerminal].mWidth,
-+                                             mTerminalFrameInfos[mInputMainTerminal].mHeight);
-+
-+        for (int i = TNR_BUFFER_IN_INDEX; i <= TNR_BUFFER_OUT_INDEX; i++) {
-+            int idx = (i == TNR_BUFFER_IN_INDEX) ? mTnrTerminalPair.inId : mTnrTerminalPair.outId;
-+
-+            int ret = posix_memalign((void**)&mTnrBuffers[i], PAGE_SIZE_U, PAGE_ALIGN(size));
-+            CheckError(ret, NO_MEMORY, "%s, alloc tnr %d buf for term %d fails", __func__, i, idx);
-+
-+            ciprBuf = registerUserBuffer(size, mTnrBuffers[i]);
-+            CheckError(!ciprBuf, NO_MEMORY, "%s, register tnr %d buf %p fails", __func__, i,
-+                       mTnrBuffers[i]);
-+            mTerminalBuffers[idx] = ciprBuf;
-+        }
-+    }
-+    return OK;
-+}
-+
-+int PGCommon::prepareTerminalBuffers(const ia_binary_data *ipuParameters,
-+                                     const CameraBufferMap& inBufs, const CameraBufferMap& outBufs)
-+{
-+    ia_cipr_buffer_t* ciprBuf = nullptr;
-+    // Prepare payload
-+    for (int termIdx = 0; termIdx < mTerminalCount; termIdx++) {
-+        // Payload for data terminals
-+        std::shared_ptr<CameraBuffer> buffer;
-+        ia_uid terminalUid = mTerminalBaseUid + termIdx;
-+        if (inBufs.find(terminalUid) != inBufs.end()) {
-+             buffer = inBufs.at(terminalUid);
-+        } else if (outBufs.find(terminalUid) != outBufs.end()) {
-+             buffer = outBufs.at(terminalUid);
-+        }
-+
-+        if (buffer) {
-+            ciprBuf = (buffer->getMemory() == V4L2_MEMORY_DMABUF) \
-+                     ? registerUserBuffer(buffer->getBufferSize(), buffer->getFd()) \
-+                     : registerUserBuffer(buffer->getBufferSize(), buffer->getBufferAddr());
-+            CheckError(!ciprBuf, NO_MEMORY, "%s, register buffer size %d for terminal %d fail",
-+                       __func__, buffer->getBufferSize(), termIdx);
-+            mTerminalBuffers[termIdx] = ciprBuf;
-+        }
-+    }
-+
-+    if (mTnrBuffers[TNR_BUFFER_IN_INDEX] && mTnrBuffers[TNR_BUFFER_OUT_INDEX]) {
-+        std::swap(mTerminalBuffers[mTnrTerminalPair.inId],
-+                  mTerminalBuffers[mTnrTerminalPair.outId]);
-+    }
-+
-+    for (auto& pair : mDvsTerminalPairs) {
-+        std::swap(mTerminalBuffers[pair.inId], mTerminalBuffers[pair.outId]);
-+    }
-+
-+    return mPGParamAdapt->updatePALAndEncode(ipuParameters, mTerminalCount, mParamPayload);
-+}
-+
-+int PGCommon::executePG()
-+{
-+    CheckError((!mCmd), INVALID_OPERATION, "%s, Command is invalid.", __func__);
-+    CheckError((!mProcessGroup), INVALID_OPERATION, "%s, process group is invalid.", __func__);
-+
-+    ia_cipr_psys_get_command_config(mCmd, &mCmdCfg);
-+    int bufferCount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    mCmdCfg.id = mPGId;
-+    mCmdCfg.priority = 1;
-+    mCmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
-+    mCmdCfg.pg_manifest_buf = mManifestBuffer;
-+    mCmdCfg.pg = mPGBuffer;
-+    mCmdCfg.ext_buf = mCmdExtBuffer;
-+    mCmdCfg.bufcount = bufferCount;
-+
-+    for (int i = 0; i < bufferCount; i++) {
-+        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(mProcessGroup, i);
-+        CheckError(!terminal, UNKNOWN_ERROR, "failed to get terminal");
-+        mCmdCfg.buffers[i] = mTerminalBuffers[terminal->tm_index];
-+    }
-+    if (mPPG) {
-+         ia_css_process_group_set_token(mProcessGroup, mToken);
-+    }
-+
-+    for (int fragIdx = 0; fragIdx < mFragmentCount; fragIdx++) {
-+        int ret = ia_css_process_group_set_fragment_state(mProcessGroup, (uint16_t)fragIdx);
-+        CheckError((ret != OK), ret, "%s, set fragment count %d fail %p", getName(), fragIdx, mProcessGroup);
-+        ret = ia_css_process_group_set_fragment_limit(mProcessGroup, (uint16_t)(fragIdx + 1));
-+        CheckError((ret != OK), ret, "%s, set fragment limit %d fail", getName(), fragIdx);
-+
-+        ret = handleCmd(mCmd, mCmdCfg);
-+        CheckError((ret != OK), ret, "%s, call handleCmd fail", getName());
-+    }
-+
-+    return OK;
-+}
-+
-+int PGCommon::startPPG()
-+{
-+    // Get basic command config
-+    ia_cipr_psys_command_config_t cmdCfg;
-+    CLEAR(cmdCfg);
-+    ia_cipr_psys_get_command_config(mPPGCmd[PPG_CMD_TYPE_START], &cmdCfg);
-+
-+    // Update config
-+    cmdCfg.id = mPGId;
-+    cmdCfg.priority = 1;
-+    cmdCfg.pg_params_buf = mPPG ? nullptr : mPGParamsBuffer;
-+    cmdCfg.pg_manifest_buf = mManifestBuffer;
-+    cmdCfg.pg = mPPGBuffer;
-+    cmdCfg.ext_buf = mPPGCmdExtBuffer[PPG_CMD_TYPE_START];
-+    cmdCfg.bufcount = ia_css_process_group_get_terminal_count(mProcessGroup);
-+    memset(cmdCfg.buffers, 0, sizeof(ia_cipr_buffer_t*) * cmdCfg.bufcount);
-+    ia_css_process_group_set_fragment_state(mPPGProcessGroup, 0);
-+    ia_css_process_group_set_fragment_limit(mPPGProcessGroup, 1);
-+
-+    int ret = handleCmd(mPPGCmd[PPG_CMD_TYPE_START], cmdCfg);
-+    mToken = ia_css_process_group_get_token(mPPGProcessGroup);
-+    return ret;
-+}
-+
-+int PGCommon::stopPPG()
-+{
-+    ia_cipr_psys_command_config_t cmdCfg;
-+
-+    CLEAR(cmdCfg);
-+    cmdCfg.bufcount = 0;
-+    ia_cipr_psys_get_command_config(mPPGCmd[PPG_CMD_TYPE_STOP], &cmdCfg);
-+
-+    cmdCfg.id = mCmdCfg.id;
-+    cmdCfg.priority = mCmdCfg.priority;
-+    cmdCfg.pg_params_buf = mPPG ? nullptr : mCmdCfg.pg_params_buf;
-+    cmdCfg.pg_manifest_buf = mCmdCfg.pg_manifest_buf;
-+    cmdCfg.pg = mPPGBuffer;
-+    cmdCfg.ext_buf = mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP];
-+    cmdCfg.bufcount = 0;
-+    cmdCfg.buffers = nullptr;
-+
-+    int ret =  handleCmd(mPPGCmd[PPG_CMD_TYPE_STOP], cmdCfg);
-+    return ret;
-+}
-+
-+int PGCommon::handleCmd(ia_cipr_psys_command_t& cmd, ia_cipr_psys_command_config_t& cmdCfg)
-+{
-+    ia_cipr_psys_event_config_t eventCfg;
-+    ia_cipr_psys_get_event_config(mEvent, &eventCfg);
-+    cmdCfg.issue_id = (uint64_t)(cmd);
-+    eventCfg.command_issue_id = cmdCfg.issue_id;
-+
-+    css_err_t ret = ia_cipr_psys_set_command_config(cmd, &cmdCfg);
-+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_set_command_config fail", __func__);
-+
-+    ret = ia_cipr_psys_get_command_config(cmd, &cmdCfg);
-+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_get_command_config fail", __func__);
-+
-+    ret = ia_cipr_psys_queue_command(mCtx, cmd);
-+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call ia_cipr_psys_queue_command fail %d", __func__, ret);
-+
-+    // Wait event
-+    ret = ia_cipr_psys_wait_for_event(mCtx, mEvent);
-+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call wait_for_event fail, ret: %d", __func__, ret);
-+
-+    ret = ia_cipr_psys_get_event_config(mEvent, &eventCfg);
-+    CheckError((ret != css_err_none), UNKNOWN_ERROR, "%s, call get_event_config fail, ret: %d", __func__, ret);
-+    // Ignore the error in event config since it's not a fatal error.
-+    if (eventCfg.error) {
-+        LOGW("%s, event config error: %d", __func__, eventCfg.error);
-+    }
-+
-+    //ia_cipr_psys_destroy_event(mEvent);
-+
-+    return (eventCfg.error == 0) ? OK : UNKNOWN_ERROR;
-+}
-+
-+int PGCommon::getCapability()
-+{
-+    ia_cipr_psys_capability_t cap;
-+    int ret = OK;
-+    css_err_t err = ia_cipr_psys_get_capabilities(mCtx, &cap);
-+    CheckError((err != css_err_none), UNKNOWN_ERROR, "Call ia_cipr_psys_get_capabilities fail, ret:%d", ret);
-+
-+    LOG1("%s: capability.version:%d", __func__, cap.version);
-+    LOG1("%s: capability.driver:%s", __func__, cap.driver);
-+    LOG1("%s: capability.dev_model:%s", __func__, cap.dev_model);
-+    LOG1("%s: capability.program_group_count:%d", __func__, cap.program_group_count);
-+    mPGCount = cap.program_group_count;
-+
-+    if (strncmp((char *)cap.dev_model, "ipu4p", 5) == 0) {
-+        mPlatform = IA_P2P_PLATFORM_CNL_B0;
-+        LOG1("%s: cnl/icl/ksl shared the same p2p platform id", __func__);
-+    } else if (strncmp((char *)cap.dev_model, "ipu4", 4) == 0) {
-+        switch (cap.dev_model[13]) {
-+            case 'B':
-+                 mPlatform = IA_P2P_PLATFORM_BXT_B0;
-+                 break;
-+            default:
-+                 LOGE("%s: unsupported psys device model :%s", __func__, cap.dev_model);
-+                 ret = BAD_VALUE;
-+                 break;
-+        }
-+    } else if (strncmp((char *)cap.dev_model, "ipu6", 4) == 0) {
-+        mPlatform = IA_P2P_PLATFORM_IPU6;
-+        mPPG = true;
-+    } else {
-+        LOGE("%s: unsupported psys device model : %s", __func__, cap.dev_model);
-+        ret = BAD_VALUE;
-+    }
-+
-+    return ret;
-+}
-+
-+int PGCommon::getManifest(int pgId)
-+{
-+    int i = 0;
-+
-+    for (; i < mPGCount; i++) {
-+        ia_cipr_buffer_t* manifestBuffer = nullptr;
-+        int programCount = 0;
-+        int terminalCount = 0;
-+        int programGroupId = 0;
-+        int manifestSize = 0;
-+        ia_css_kernel_bitmap_t kernelBitmap = ia_css_kernel_bitmap_clear();
-+        uint32_t size = 0;
-+
-+        css_err_t ret = ia_cipr_psys_get_manifest(mCtx, i, &size, nullptr);
-+        if (ret != css_err_none) continue;
-+        CheckError((size == 0), UNKNOWN_ERROR, "%s, the manifest size is 0", __func__);
-+
-+        manifestBuffer = createUserPtrCiprBuffer(size);
-+        CheckError(!manifestBuffer, NO_MEMORY, "%s, call createUserPtrCiprBuffer fail", __func__);
-+
-+        void* manifest = getCiprBufferPtr(manifestBuffer);
-+
-+        ret = ia_cipr_psys_get_manifest(mCtx, i, &size, manifest);
-+        if (ret != css_err_none) {
-+            LOGE("%s, call ia_cipr_psys_get_manifest fail", __func__);
-+            ia_cipr_buffer_destroy(manifestBuffer);
-+            return UNKNOWN_ERROR;
-+        }
-+
-+        LOG1("%s: pg index: %d, manifest size: %u", __func__, i, size);
-+        const ia_css_program_group_manifest_t *mf = (const ia_css_program_group_manifest_t*)manifest;
-+        programCount = ia_css_program_group_manifest_get_program_count(mf);
-+        terminalCount = ia_css_program_group_manifest_get_terminal_count(mf);
-+        programGroupId = ia_css_program_group_manifest_get_program_group_ID(mf);
-+        manifestSize = ia_css_program_group_manifest_get_size(mf);
-+        kernelBitmap = ia_css_program_group_manifest_get_kernel_bitmap(mf);
-+
-+        LOG1("%s: pgIndex: %d, programGroupId: %d, manifestSize: %d, programCount: %d, terminalCount: %d",
-+             __func__, i, programGroupId, manifestSize, programCount, terminalCount);
-+
-+        if (pgId == programGroupId) {
-+            mProgramCount = programCount;
-+            mTerminalCount = terminalCount;
-+            mManifestSize = manifestSize;
-+            mKernelBitmap = kernelBitmap;
-+            mManifestBuffer = manifestBuffer;
-+            break;
-+        }
-+
-+        ia_cipr_buffer_destroy(manifestBuffer);
-+    }
-+
-+    CheckError((i == mPGCount), BAD_VALUE, "%s, Can't found available pg: %d", __func__, pgId);
-+
-+    return OK;
-+}
-+
-+ia_cipr_buffer_t* PGCommon::createDMACiprBuffer(int size, int fd)
-+{
-+    uint32_t deviceFlags = IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_NO_FLUSH;
-+
-+    ia_cipr_memory_t mem;
-+    mem.size = size;
-+    mem.flags = IA_CIPR_MEMORY_HANDLE | IA_CIPR_MEMORY_HW_ONLY;
-+    mem.handle = fd;
-+    mem.cpu_ptr = nullptr;
-+    mem.anchor = nullptr;
-+    ia_cipr_buffer_t* buf = ia_cipr_buffer_create(size, mem.flags | deviceFlags, &mem);
-+    CheckError(!buf, nullptr, "%s, call ia_cipr_buffer_create fail", __func__);
-+
-+    css_err_t ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, buf);
-+    if (ret != css_err_none) {
-+        LOGE("%s, call ia_cipr_memory_device_migrate_buffer fail", __func__);
-+        ia_cipr_buffer_destroy(buf);
-+        return nullptr;
-+    }
-+
-+    return buf;
-+}
-+
-+ia_cipr_buffer_t* PGCommon::createUserPtrCiprBuffer(int size, void* ptr)
-+{
-+    ia_cipr_buffer_t* buf = nullptr;
-+    if (ptr == nullptr) {
-+        buf = ia_cipr_buffer_create(size, IA_CIPR_MEMORY_ALLOCATE_CPU_PTR, nullptr);
-+    } else {
-+        ia_cipr_memory_t mem;
-+        mem.size = size;
-+        mem.flags = IA_CIPR_MEMORY_CPU_PTR;
-+        mem.handle = 0;
-+        mem.cpu_ptr = ptr;
-+        mem.anchor = nullptr;
-+        buf = ia_cipr_buffer_create(size, IA_CIPR_MEMORY_CPU_PTR, &mem);
-+    }
-+
-+    CheckError(!buf, nullptr, "%s, call ia_cipr_buffer_create fail", __func__);
-+
-+    css_err_t ret = ia_cipr_memory_device_migrate_buffer(mMemoryDevice, buf);
-+    if (ret != css_err_none) {
-+        LOGE("%s, call ia_cipr_memory_device_migrate_buffer fail", __func__);
-+        ia_cipr_buffer_destroy(buf);
-+        return nullptr;
-+    }
-+
-+    return buf;
-+}
-+
-+void* PGCommon::getCiprBufferPtr(ia_cipr_buffer_t* buffer)
-+{
-+    CheckError(!buffer, nullptr, "%s, invalid cipr buffer", __func__);
-+
-+    ia_cipr_memory_t memory;
-+
-+    css_err_t ret = ia_cipr_buffer_get_memory(buffer, &memory);
-+    CheckError((ret != css_err_none), nullptr, "%s, call ia_cipr_buffer_get_memory fail", __func__);
-+
-+    return memory.cpu_ptr;
-+}
-+
-+int PGCommon::getCiprBufferSize(ia_cipr_buffer_t* buffer)
-+{
-+    CheckError(!buffer, BAD_VALUE, "%s, invalid cipr buffer", __func__);
-+
-+    ia_cipr_memory_t memory;
-+
-+    css_err_t ret = ia_cipr_buffer_get_memory(buffer, &memory);
-+    CheckError((ret != css_err_none), NO_MEMORY, "%s, call ia_cipr_buffer_get_memory fail", __func__);
-+
-+    return memory.size;
-+}
-+
-+ia_cipr_buffer_t* PGCommon::registerUserBuffer(int size, void* ptr)
-+{
-+    CheckError((size <= 0 || ptr == nullptr), nullptr, "Invalid parameter: size=%d, ptr=%p", size, ptr);
-+
-+    for (auto& item : mBuffers) {
-+        if (ptr == item.userPtr) {
-+            return item.ciprBuf;
-+        }
-+    }
-+
-+    ia_cipr_buffer_t* ciprBuf = createUserPtrCiprBuffer(size, ptr);
-+    CheckError(!ciprBuf, nullptr, "Create cipr buffer for %p failed", ptr);
-+
-+    CiprBufferMapping bufMap;
-+    bufMap.userPtr = ptr;
-+    bufMap.ciprBuf = ciprBuf;
-+    mBuffers.push_back(bufMap);
-+
-+    return ciprBuf;
-+}
-+
-+ia_cipr_buffer_t* PGCommon::registerUserBuffer(int size, int fd)
-+{
-+    CheckError((size <= 0 || fd < 0), nullptr, "Invalid parameter: size: %d, fd: %d", size, fd);
-+
-+    for (auto& item : mBuffers) {
-+        if (fd == item.userFd) {
-+            return item.ciprBuf;
-+        }
-+    }
-+
-+    ia_cipr_buffer_t* ciprBuf = createDMACiprBuffer(size, fd);
-+    CheckError(!ciprBuf, nullptr, "Create cipr buffer for fd %d failed", fd);
-+
-+    CiprBufferMapping bufMap;
-+    bufMap.userFd = fd;
-+    bufMap.ciprBuf = ciprBuf;
-+    mBuffers.push_back(bufMap);
-+
-+    return ciprBuf;
-+}
-+
-+void PGCommon::dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup)
-+{
-+    if (!CameraDump::isDumpTypeEnable(DUMP_PSYS_PG)) return;
-+
-+    char fileName[MAX_NAME_LEN] = {'\0'};
-+    uint32_t pgSize = ia_css_process_group_get_size(pgGroup);
-+    snprintf(fileName, (MAX_NAME_LEN - 1), "hal_pg_%d_%ld.bin", pgId, sequence);
-+
-+    FILE *fp = fopen (fileName, "w+");
-+    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
-+    const unsigned int* printPtr = (const unsigned int*)pgGroup;
-+    fprintf(fp, "::pg dump size %d(0x%x)\n", pgSize, pgSize);
-+    for (unsigned int i = 0; i < pgSize / sizeof(*printPtr); i++) {
-+        fprintf(fp, "%08x\n", printPtr[i]);
-+    }
-+
-+    int terminalCount = ia_css_process_group_get_terminal_count(pgGroup);
-+    for (int i = 0; i < terminalCount; i++) {
-+        ia_css_terminal_t *terminal = ia_css_process_group_get_terminal(pgGroup, i);
-+        CheckError(!terminal, VOID_VALUE, "failed to get terminal");
-+        if (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN
-+            || terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
-+            continue;
-+        }
-+
-+        void* ptr = getCiprBufferPtr(mTerminalBuffers[terminal->tm_index]);
-+        int size = getCiprBufferSize(mTerminalBuffers[terminal->tm_index]);
-+        const char* typeStr = (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ? "DATA_IN"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ? "DATA_OUT"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_STREAM) ? "PARAM_STREAM"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) ? "CACHED_IN"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ? "CACHED_OUT"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ? "SPATIAL_IN"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ? "SPATIAL_OUT"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ? "SLICED_IN"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ? "SLICED_OU"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_IN) ? "STATE_IN"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT) ? "STATE_OUT"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) ? "PROGRAM"
-+                            : (terminal->terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) ? "PROGRAM_CONTROL_INIT"
-+                            :                                                             "UNKNOWN";
-+        printPtr = (const unsigned int*)ptr;
-+        fprintf(fp, "::terminal %d dump size %d(0x%x), line %d, type %s\n", terminal->tm_index, size, size, PAGE_ALIGN(size)/4, typeStr);
-+        for (unsigned int i = 0; i < PAGE_ALIGN(size) / sizeof(*printPtr); i++) {
-+            fprintf(fp, "%08x\n", printPtr[i]);
-+        }
-+    }
-+
-+    fclose (fp);
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
-new file mode 100644
-index 000000000000..5cc588ece333
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
-@@ -0,0 +1,238 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+extern "C" {
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_terminal_manifest.h>
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_program_group_param.h>
-+#include <ia_css_psys_process_group.h>
-+#include <ia_css_psys_terminal.h>
-+#include <ia_css_terminal_types.h>
-+#include <ia_css_terminal_manifest_types.h>
-+#include <ia_css_psysapi_fw_version.h>
-+}
-+
-+#include <vector>
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelPGParam.h"
-+#else
-+#include "modules/algowrapper/IntelPGParam.h"
-+#endif
-+#include "IspParamAdaptor.h"
-+#include "BufferQueue.h"
-+#include "PGUtils.h"
-+#include "modules/ia_cipr/include/ia_cipr_psys.h"
-+#include "modules/ia_cipr/include/ia_cipr_alloc.h"
-+#include "modules/ia_cipr/include/ia_cipr_memory.h"
-+
-+namespace icamera {
-+
-+typedef std::map<ia_uid, FrameInfo> TerminalFrameInfoMap;
-+typedef std::map<ia_uid, std::shared_ptr<CameraBuffer>> CameraBufferMap;
-+
-+#define FRAGMENT_OVERLAP 64
-+
-+/**
-+ * \class PGCommon
-+ *
-+ * \brief This is a version PG implementation which is used to config and run PG.
-+ *
-+ * The call sequence as follows:
-+ * 1. init();
-+ * 2. setInputInfo();setOutputInfo();
-+ * 3. setDisabledTerminals();
-+ * 4. prepare():
-+ *          configTerminalFormat();
-+ *          calcFragmentCount();
-+ *          handlePGParams();
-+ *          setKernelBitMap();
-+ *          setTerminalParams();
-+ *          allocatePGBuffer();
-+ *          setPGAndPrepareProgram();
-+ *          configureFragmentDesc();
-+ * 5. loop frame: iterate():
-+ *          encodeTerminals();
-+ *          handleCmd();
-+ *          handleEvent();
-+ *          decode();
-+ * 6. deInit();
-+ */
-+class PGCommon {
-+public:
-+    static int getFrameSize(int format, int width, int height,
-+                            bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
-+
-+    PGCommon(int pgId, const std::string& pgName, ia_uid terminalBaseUid = 0);
-+    virtual ~PGCommon();
-+
-+    /**
-+     * allocate memory for some variables.
-+     */
-+    int init();
-+
-+    /**
-+     * recycle memory.
-+     */
-+    void deInit();
-+
-+    /**
-+     * set the input buffers info for terminals.
-+     * use ia_fourcc
-+     */
-+    virtual void setInputInfo(const TerminalFrameInfoMap& inputInfos);
-+
-+    /**
-+     * set the output buffers info for terminals.
-+     * use ia_fourcc
-+     */
-+    virtual void setOutputInfo(const TerminalFrameInfoMap& outputInfos);
-+
-+    /**
-+     * set the disabled terminals. Called before prepare()
-+     */
-+    virtual void setDisabledTerminals(const std::vector<ia_uid>& disabledTerminals);
-+
-+    /**
-+     * set routing bitmap. Called before prepare()
-+     */
-+    virtual void setRoutingBitmap(const void* rbm, uint32_t bytes);
-+
-+    /**
-+     * config the data terminals, init, config and prepare p2p, create process group.
-+     */
-+    virtual int prepare(IspParamAdaptor* adaptor, int streamId = -1);
-+
-+    /**
-+     * run p2p to encode the params terminals, execute the PG and run p2p to decode the statistic terminals.
-+     */
-+    virtual int iterate(CameraBufferMap &inBufs, CameraBufferMap &outBufs,
-+                        ia_binary_data *statistics, const ia_binary_data *ipuParameters);
-+
-+    const char* getName() { return mName.c_str(); }
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PGCommon);
-+
-+protected:
-+    int getCapability();
-+    int getManifest(int pgId);
-+
-+    // PG parameters intialization, for prepare()
-+    virtual int configTerminalFormat();
-+    int initParamAdapt();
-+    virtual int calcFragmentCount(int overlap = FRAGMENT_OVERLAP);
-+    int handlePGParams(const ia_css_frame_format_type* frameFormatTypes);
-+    int setKernelBitMap();
-+    virtual int setTerminalParams(const ia_css_frame_format_type* frameFormatTypes);
-+    virtual int configureFragmentDesc();
-+    int configureTerminalFragmentDesc(int termIdx, const ia_p2p_fragment_desc* srcDesc);
-+    ia_css_process_group_t* createPG(ia_cipr_buffer_t*& pgBuffer);
-+    int createCommands();
-+    int createCommand(ia_cipr_buffer_t* pg, ia_cipr_psys_command_t& cmd, ia_cipr_buffer_t*& extBuffer, int bufCount);
-+    void destoryCommands();
-+    int preparePayloadBuffers();
-+
-+    // For iteration
-+    virtual int prepareTerminalBuffers(const ia_binary_data *ipuParameters,
-+                                       const CameraBufferMap& inBufs,
-+                                       const CameraBufferMap& outBufs);
-+    int executePG();
-+    int startPPG();
-+    int stopPPG();
-+    int handleCmd(ia_cipr_psys_command_t& cmd, ia_cipr_psys_command_config_t& cmdCfg);
-+
-+    // Memory helper
-+    ia_cipr_buffer_t* createDMACiprBuffer(int size, int fd);
-+    ia_cipr_buffer_t* createUserPtrCiprBuffer(int size, void* ptr = nullptr);
-+    void* getCiprBufferPtr(ia_cipr_buffer_t* buffer);
-+    ia_cipr_buffer_t* registerUserBuffer(int size, void* ptr);
-+    ia_cipr_buffer_t* registerUserBuffer(int size, int fd);
-+    int getCiprBufferSize(ia_cipr_buffer_t* buffer);
-+    void dumpTerminalPyldAndDesc(int pgId, long sequence, ia_css_process_group_t* pgGroup);
-+
-+protected:
-+    enum PPGCommandType {
-+        PPG_CMD_TYPE_START = 0,
-+        PPG_CMD_TYPE_STOP,
-+        PPG_CMD_TYPE_COUNT
-+    };
-+
-+    struct CiprBufferMapping {
-+        CiprBufferMapping() {}
-+        void* userPtr = nullptr;
-+        int userFd = -1;
-+        ia_cipr_buffer_t* baseCiprBuf = nullptr;
-+        ia_cipr_buffer_t* ciprBuf = nullptr;
-+    };
-+
-+    static const int kEventTimeout = 8000;
-+
-+    ia_cipr_psys_context_t mCtx;
-+    ia_cipr_memory_device_t* mMemoryDevice;
-+    ia_cipr_buffer_t* mManifestBuffer;
-+    ia_cipr_buffer_t* mPGParamsBuffer;
-+    std::unique_ptr<IntelPGParam> mPGParamAdapt;
-+
-+    int mPGId;
-+    std::string mName;  // For debug
-+    ia_uid mTerminalBaseUid;
-+    int mPGCount;
-+    ia_p2p_platform_t mPlatform;
-+    int mProgramCount;
-+    int mTerminalCount;
-+    int mManifestSize;
-+    ia_css_kernel_bitmap_t mKernelBitmap;
-+    std::unique_ptr<ia_css_rbm_t> mRoutingBitmap;
-+    int mFragmentCount;
-+    std::unique_ptr<uint8_t[]> mPgTerminals; // save terminal num in PG for each terminal
-+    std::unique_ptr<ia_css_frame_format_type[]> mFrameFormatType;
-+    std::vector<int> mDisableDataTermials;
-+
-+    ia_binary_data __attribute__ ((aligned (PG_PAGE_SIZE))) mParamPayload[IPU_MAX_TERMINAL_COUNT];
-+
-+    ia_cipr_buffer_t* mPGBuffer;
-+    ia_css_process_group_t* mProcessGroup;
-+    ia_cipr_psys_command_t mCmd;
-+    ia_cipr_buffer_t* mCmdExtBuffer;
-+
-+    bool mPPG;
-+    bool mPPGStarted;
-+    ia_cipr_buffer_t* mPPGBuffer;
-+    ia_css_process_group_t* mPPGProcessGroup;
-+    ia_cipr_psys_command_t mPPGCmd[PPG_CMD_TYPE_COUNT];
-+    ia_cipr_buffer_t* mPPGCmdExtBuffer[PPG_CMD_TYPE_COUNT];
-+    uint64_t mToken;
-+
-+    ia_cipr_psys_command_config_t mCmdCfg;
-+    ia_cipr_psys_event_t mEvent;
-+
-+    ia_cipr_buffer_t** mTerminalBuffers;
-+    std::map<int, FrameInfo> mTerminalFrameInfos; // valid for data terminals only
-+    int mInputMainTerminal;
-+    int mOutputMainTerminal;
-+
-+    std::vector<CiprBufferMapping> mBuffers;
-+
-+    TerminalPair mTnrTerminalPair;
-+    uint8_t* mTnrBuffers[TNR_BUFFER_COUNT];
-+
-+    std::vector<TerminalPair> mDvsTerminalPairs;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
-new file mode 100644
-index 000000000000..eb34b1a3ab66
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.cpp
-@@ -0,0 +1,194 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PGUtils"
-+
-+#include <stdint.h>
-+
-+#include <vector>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "PGUtils.h"
-+
-+namespace icamera {
-+
-+namespace PGUtils {
-+
-+/* ************************************************************
-+ * Common definitions
-+ * ***********************************************************/
-+
-+#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
-+                                 | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
-+
-+struct FormatMap {
-+    int v4l2Fmt;
-+    ia_css_frame_format_type cssFmt;
-+
-+    int cssBpp;
-+};
-+
-+static const FormatMap sFormatMapping[] = {
-+    { V4L2_PIX_FMT_YUYV,   IA_CSS_DATA_FORMAT_YUYV, 12 },
-+    { V4L2_PIX_FMT_UYVY,   IA_CSS_DATA_FORMAT_UYVY, 12 },
-+    { V4L2_PIX_FMT_YUV420, IA_CSS_DATA_FORMAT_YUV420, 16 },
-+    { V4L2_PIX_FMT_NV12,   IA_CSS_DATA_FORMAT_NV12, 8 },
-+    { V4L2_PIX_FMT_NV16,   IA_CSS_DATA_FORMAT_NV16, 12 },
-+    { V4L2_PIX_FMT_RGB565, IA_CSS_DATA_FORMAT_RGB565, 16 },
-+    { V4L2_PIX_FMT_RGB24,  IA_CSS_DATA_FORMAT_RGB888, 24 },
-+    { V4L2_PIX_FMT_RGB32,  IA_CSS_DATA_FORMAT_RGBA888, 24 },
-+    { V4L2_PIX_FMT_SGRBG12, IA_CSS_DATA_FORMAT_RAW, 16 },
-+    { V4L2_PIX_FMT_SGRBG10, IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
-+
-+    { GET_FOURCC_FMT('Y', 'U', 'Y', 'V'), IA_CSS_DATA_FORMAT_YUYV, 12 },
-+    { GET_FOURCC_FMT('U', 'Y', 'V', 'Y'), IA_CSS_DATA_FORMAT_UYVY, 12 },
-+    { GET_FOURCC_FMT('Y', 'U', '1', '2'), IA_CSS_DATA_FORMAT_YUV420, 16 },
-+    { GET_FOURCC_FMT('N', 'V', '1', '2'), IA_CSS_DATA_FORMAT_NV12, 8 },
-+    { GET_FOURCC_FMT('N', 'V', '1', '6'), IA_CSS_DATA_FORMAT_NV16, 12 },
-+    { GET_FOURCC_FMT('R', 'G', 'B', 'P'), IA_CSS_DATA_FORMAT_RGB565, 16 },
-+    { GET_FOURCC_FMT('R', 'G', 'B', '3'), IA_CSS_DATA_FORMAT_RGB888, 24 },
-+    { GET_FOURCC_FMT('R', 'G', 'B', '4'), IA_CSS_DATA_FORMAT_RGBA888, 24 },
-+    { GET_FOURCC_FMT('B', 'A', '1', '2'), IA_CSS_DATA_FORMAT_RAW, 16 },
-+    { GET_FOURCC_FMT('B', 'A', '1', '0'), IA_CSS_DATA_FORMAT_RAW, 16 }, // IA_CSS_DATA_FORMAT_BAYER_GRBG or IA_CSS_DATA_FORMAT_RAW ?
-+    { GET_FOURCC_FMT('y', '0', '3', '2'), IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED, 16 },
-+    { GET_FOURCC_FMT('V', '4', '2', '0'), IA_CSS_DATA_FORMAT_YUV420, 16 },
-+    { GET_FOURCC_FMT('b','V','0','K'),    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED, 16 },
-+    { GET_FOURCC_FMT('C','S','L','6'),    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED, 16},
-+    { GET_FOURCC_FMT('G','R','1','0'),    IA_CSS_DATA_FORMAT_BAYER_GRBG, 16 },
-+    { GET_FOURCC_FMT('I','Y','U','V'),    IA_CSS_DATA_FORMAT_YUV420, 8 },
-+};
-+
-+static int getStride(int cssFmt, int width);
-+
-+ia_css_frame_format_type getCssFmt(int v4l2Fmt) {
-+    int size = ARRAY_SIZE(sFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
-+            return sFormatMapping[i].cssFmt;
-+        }
-+    }
-+
-+    LOG2("%s: unsupported v4l2 pixel format: %s", __func__,
-+         CameraUtils::format2string(v4l2Fmt).c_str());
-+    return IA_CSS_N_FRAME_FORMAT_TYPES;
-+}
-+
-+int getCssStride(int v4l2Fmt, int width) {
-+    int stride = width;
-+    ia_css_frame_format_type cssFmt = getCssFmt(v4l2Fmt);
-+    switch (v4l2Fmt) {
-+        case GET_FOURCC_FMT('I','Y','U','V'):
-+            stride = width;
-+            break;
-+        default:
-+            stride = getStride(cssFmt, width);
-+            break;
-+    }
-+    return stride;
-+}
-+
-+int getCssBpp(int v4l2Fmt) {
-+    int size = ARRAY_SIZE(sFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (sFormatMapping[i].v4l2Fmt == v4l2Fmt) {
-+            return sFormatMapping[i].cssBpp;
-+        }
-+    }
-+
-+    LOG2("%s: unsupported v4l2 pixel format: 0x%x", __func__, v4l2Fmt);
-+    return 8;
-+}
-+
-+int getStride(int cssFmt, int width) {
-+    int stride = width;
-+    switch (cssFmt) {
-+        case IA_CSS_DATA_FORMAT_BAYER_GRBG: // GR10
-+        case IA_CSS_DATA_FORMAT_RAW:        // BA10
-+            stride = ALIGN_64(width * 2);
-+            break;
-+        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED: // y032
-+            stride = width * 6;
-+            break;
-+        case IA_CSS_DATA_FORMAT_BAYER_VECTORIZED: // bv0k
-+        case IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED: // css_fourcc_grbg_12_li
-+            stride = width * 4;
-+            stride = ALIGN_64(stride);
-+            break;
-+        case IA_CSS_DATA_FORMAT_YUV420:
-+            stride = width * 2;
-+            stride = ALIGN_64(stride);
-+            break;
-+        case IA_CSS_DATA_FORMAT_NV12:
-+            stride = width;
-+            break;
-+        default:
-+            LOG2("TODO for format: %d", cssFmt);
-+            break;
-+    }
-+    return stride;
-+}
-+
-+/* ************************************************************
-+ * Difference between PGs
-+ * ***********************************************************/
-+#define PG_PSYS_IPU6_ISA_LB 187
-+#define PG_PSYS_IPU6_BB 189
-+#define PG_PSYS_IPU6_ISL 198
-+
-+// the below terminals belong to PG_PSYS_IPU6_BB
-+#define PG_BB_TERMINAL_ID_TNR_REF_IN 4 // data_terminal
-+#define PG_BB_TERMINAL_ID_TNR_REF_OUT 6 // data_terminal
-+
-+// the below terminals belong to PG_PSYS_IPU6_ISA_LB
-+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L0 21 // program_terminal
-+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L1 22 // program_terminal
-+#define ISA_LB_TERMINAL_ID_DVS_FE_IN_L2 23 // program_terminal
-+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0 24 // param_terminal
-+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1 25 // param_terminal
-+#define ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2 26 // param_terminal
-+
-+bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs) {
-+    LOG2("@%s, pgId:%d, type:%d, pairs:%p", __func__, pgId, type, pairs);
-+    CheckError(!pairs, false, "@%s, pairs is nullptr", __func__);
-+
-+    struct TerminalPairs {
-+        int pgId;
-+        TERMINAL_PAIR_TYPE type;
-+        std::vector<TerminalPair> pairs;
-+    };
-+    static const TerminalPairs tps[] = {
-+        {PG_PSYS_IPU6_BB, TERMINAL_PAIR_TNR,
-+         {{PG_BB_TERMINAL_ID_TNR_REF_IN, PG_BB_TERMINAL_ID_TNR_REF_OUT}}},
-+        {PG_PSYS_IPU6_ISA_LB, TERMINAL_PAIR_DVS,
-+         {{ISA_LB_TERMINAL_ID_DVS_FE_IN_L0, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L0},
-+          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L1, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L1},
-+          {ISA_LB_TERMINAL_ID_DVS_FE_IN_L2, ISA_LB_TERMINAL_ID_DVS_FE_OUT_L2}}}
-+    };
-+
-+    for (unsigned int i = 0; i < ARRAY_SIZE(tps); i++) {
-+        if (tps[i].pgId == pgId && tps[i].type == type) {
-+            *pairs = tps[i].pairs;
-+            return true;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+} // name space PGUtils
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
-new file mode 100644
-index 000000000000..7e8ccfce6b99
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGUtils.h
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+extern "C" {
-+#include <ia_css_program_group_data.h>
-+#include <ia_css_psys_program_group_manifest.h>
-+#include <ia_css_psys_process_group.h>
-+
-+#include <ia_p2p.h>
-+}
-+
-+#include <vector>
-+
-+namespace icamera {
-+#define PG_PAGE_SIZE 4096
-+#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS
-+#define IPU_MAX_TERMINAL_COUNT 40
-+
-+struct PgFrameDesc {
-+    PgFrameDesc() {
-+        width = 0;
-+        height = 0;
-+        bpe = 0;
-+    }
-+    int width;
-+    int height;
-+    int bpe;
-+};
-+
-+struct PgConfiguration {
-+    ia_css_program_group_manifest_t* pgManifest;
-+    int pgManifestSize;
-+    std::vector<int> disableDataTermials;
-+    uint8_t fragmentCount;
-+
-+    // New API, for desc calculation by itself, instead of fragmentDesc
-+    PgFrameDesc inputMainFrame;
-+    PgFrameDesc outputMainFrame;
-+};
-+
-+enum {
-+    TNR_BUFFER_IN_INDEX = 0,
-+    TNR_BUFFER_OUT_INDEX
-+};
-+#define TNR_BUFFER_COUNT (TNR_BUFFER_OUT_INDEX + 1)
-+
-+struct TerminalPair {
-+    int inId;
-+    int outId;
-+};
-+
-+namespace PGUtils {
-+/* ************************************************************
-+ * Common definitions
-+ * ***********************************************************/
-+
-+ia_css_frame_format_type getCssFmt(int v4l2Fmt);
-+int getCssBpp(int v4l2Fmt);
-+int getCssStride(int v4l2Fmt, int width);
-+
-+/* ************************************************************
-+ * Difference between PGs
-+ * ***********************************************************/
-+enum TERMINAL_PAIR_TYPE {
-+    TERMINAL_PAIR_TNR,
-+    TERMINAL_PAIR_DVS
-+};
-+
-+bool getTerminalPairs(int pgId, TERMINAL_PAIR_TYPE type, std::vector<TerminalPair>* pairs);
-+} // name space PGUtils
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
-new file mode 100644
-index 000000000000..2dbd1429f521
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
-@@ -0,0 +1,669 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PSysDAG"
-+
-+#include <algorithm>
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "PSysDAG.h"
-+
-+namespace icamera {
-+PSysDAG::PSysDAG(int cameraId, PSysDagCallback* psysDagCB) :
-+    mCameraId(cameraId),
-+    mPSysDagCB(psysDagCB),
-+    mConfigMode(CAMERA_STREAM_CONFIGURATION_MODE_AUTO),
-+    mTuningMode(TUNING_MODE_MAX),
-+    mDefaultMainInputPort(MAIN_PORT)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    CLEAR(mOngoingSequence);
-+    mPolicyManager = new PolicyManager(mCameraId);
-+    mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
-+}
-+
-+PSysDAG::~PSysDAG()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    releasePipeExecutors();
-+
-+    mIspParamAdaptor->deinit();
-+    delete mIspParamAdaptor;
-+    delete mPolicyManager;
-+}
-+
-+void PSysDAG::setFrameInfo(const std::map<Port, stream_t>& inputInfo,
-+                           const std::map<Port, stream_t>& outputInfo) {
-+    mInputFrameInfo = inputInfo;
-+    mOutputFrameInfo = outputInfo;
-+
-+    mDefaultMainInputPort = inputInfo.begin()->first;
-+    // Select default main input port in priority
-+    Port availablePorts[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
-+    for (unsigned int i = 0; i < ARRAY_SIZE(availablePorts); i++) {
-+        if (mInputFrameInfo.find(availablePorts[i]) != mInputFrameInfo.end()) {
-+            mDefaultMainInputPort = availablePorts[i];
-+            break;
-+        }
-+    }
-+}
-+
-+void PSysDAG::releasePipeExecutors()
-+{
-+    for (auto &executor : mExecutorsPool) {
-+        delete executor;
-+    }
-+    mExecutorsPool.clear();
-+    mExecutorStreamIds.clear();
-+}
-+
-+/*
-+ * According to the policy config to create the executors,
-+ * and use the graph config data to configure the executors.
-+ */
-+int PSysDAG::createPipeExecutors()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    releasePipeExecutors();
-+
-+    // initialize the sequence list to -1
-+    for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
-+        mOngoingSequence[i] = -1;
-+    }
-+
-+    IGraphConfigManager *GCM = IGraphConfigManager::getInstance(mCameraId);
-+    CheckError(!GCM, UNKNOWN_ERROR, "Failed to get GC manager in PSysDAG!");
-+
-+    std::shared_ptr<IGraphConfig> gc = GCM->getGraphConfig(mConfigMode);
-+    CheckError(!gc, UNKNOWN_ERROR, "Failed to get GraphConfig in PSysDAG!");
-+
-+    int graphId = gc->getGraphId();
-+    PolicyConfig* cfg = PlatformData::getExecutorPolicyConfig(graphId);
-+    CheckError(!cfg, UNKNOWN_ERROR, "Failed to get PolicyConfig in PSysDAG!");
-+
-+    std::vector<std::string> pgNames;
-+    gc->getPgNames(&pgNames);
-+    bool hasVideoPipe = false, hasStillPipe = false;
-+
-+    for (auto &item : cfg->pipeExecutorVec) {
-+        int streamId = -1;
-+        bool pgFound = true;
-+
-+        // Not support multiple streamId in one executor,
-+        // so need to the check the streamId of pgList.
-+        for (auto &pgName : item.pgList) {
-+            if (std::find(pgNames.begin(), pgNames.end(), pgName.c_str()) == pgNames.end()) {
-+                pgFound = false;
-+                break;
-+            }
-+            int tmpId = gc->getStreamIdByPgName(pgName);
-+            CheckError(tmpId == -1, BAD_VALUE, "Cannot get streamId for %s", pgName.c_str());
-+            CheckError(((streamId != -1) && (tmpId != streamId)), BAD_VALUE,
-+                    "the streamId: %d for pgName(%s) is different with previous: %d",
-+                    tmpId, pgName.c_str(), streamId);
-+            streamId = tmpId;
-+            LOG1("%s executor:%s pg name:%s streamId: %d",
-+                  __func__, item.exeName.c_str(), pgName.c_str(), streamId);
-+        }
-+        if (!pgFound)
-+            continue;
-+
-+        if (!hasVideoPipe)
-+            hasVideoPipe = (streamId == VIDEO_STREAM_ID);
-+        if (!hasStillPipe)
-+            hasStillPipe = (streamId == STILL_STREAM_ID);
-+
-+        PipeExecutor *executor = new PipeExecutor(mCameraId, item, cfg->exclusivePgs, this, gc);
-+        executor->setIspParamAdaptor(mIspParamAdaptor);
-+        executor->setStreamId(streamId);
-+        executor->setPolicyManager(mPolicyManager);
-+        executor->setNotifyPolicy(item.notifyPolicy);
-+
-+        int ret = executor->initPipe();
-+        if (ret != OK) {
-+            LOGE("Failed to create pipe for executor:%s", executor->getName());
-+            delete executor;
-+            return ret;
-+        }
-+
-+        mExecutorsPool.push_back(executor);
-+        mExecutorStreamIds[executor] = streamId;
-+    }
-+
-+    LOG2("%s, hasVideoPipe: %d, hasStillPipe: %d, enableBundleInSdv: %d",
-+         __func__, hasVideoPipe, hasStillPipe, cfg->enableBundleInSdv);
-+    if (hasStillPipe && hasVideoPipe && !cfg->enableBundleInSdv) return OK;
-+
-+    for (auto &bundle : cfg->bundledExecutorDepths) {
-+        bool foundExecutor = true;
-+        for (auto &executor : bundle.bundledExecutors) {
-+            std::vector<PipeExecutor*>::iterator it = std::find_if(mExecutorsPool.begin(),
-+                    mExecutorsPool.end(), [executor](PipeExecutor* exec) {
-+                        return exec->getName() == executor;
-+                    });
-+            if (it == mExecutorsPool.end()) {
-+                foundExecutor = false;
-+                break;
-+            }
-+        }
-+
-+        if (foundExecutor)
-+            mPolicyManager->addExecutorBundle(bundle.bundledExecutors, bundle.depths);
-+    }
-+
-+    return OK;
-+}
-+
-+int PSysDAG::linkAndConfigExecutors()
-+{
-+    for (auto& consumer : mExecutorsPool) {
-+        std::map<ia_uid, Port> input;
-+
-+        if (consumer->isInputEdge()) {
-+            // Use its own input info due to no executor as producer
-+            consumer->getInputTerminalPorts(input);
-+        } else {
-+            PipeExecutor* producer = findExecutorProducer(consumer);
-+            CheckError(producer == nullptr, BAD_VALUE, "no producer for executor %s!", consumer->getName());
-+            producer->getOutputTerminalPorts(input);
-+
-+            consumer->setBufferProducer(producer);
-+            LOG1("%s: link consumer %s to %s", __func__, consumer->getName(), producer->getName());
-+        }
-+
-+        // Link producer (output) to consumer (input) by terminal
-+        consumer->setInputTerminals(input);
-+
-+        std::vector<ConfigMode> configModes;
-+        configModes.push_back(mConfigMode);
-+        consumer->configure(configModes);
-+    }
-+
-+    return OK;
-+}
-+
-+PipeExecutor* PSysDAG::findExecutorProducer(PipeExecutor* consumer)
-+{
-+    std::map<ia_uid, Port> inputTerminals;
-+    consumer->getInputTerminalPorts(inputTerminals);
-+
-+    for (auto& executor : mExecutorsPool) {
-+        if (executor == consumer) {
-+            continue;
-+        }
-+
-+        for (auto& inputTerminal : inputTerminals) {
-+            // Return if one is matched, because only one producer is supported now.
-+            if (executor->hasOutputTerminal(inputTerminal.first)) {
-+                return executor;
-+            }
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/**
-+ * Bind the port between DAG and its edge executors.
-+ * After the binding we'll know where the task buffer should be queued to.
-+ */
-+int PSysDAG::bindExternalPortsToExecutor()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mInputMaps.clear();
-+    mOutputMaps.clear();
-+
-+   std::map<Port, stream_t> outputInfo;
-+   std::map<Port, stream_t> inputInfo;
-+
-+    // Bind the input ports first.
-+    LOG2("%s, start to bind the input port", __func__);
-+    for (auto& executor : mExecutorsPool) {
-+        if (!executor->isInputEdge()) {
-+            continue;
-+        }
-+        executor->getFrameInfo(inputInfo, outputInfo);
-+
-+        for (auto& frameInfo : mInputFrameInfo) {
-+            for (auto& portInfo : inputInfo) {
-+                // Check if it has been cleared (bound already).
-+                if (!portInfo.second.format) {
-+                    continue;
-+                }
-+                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, false)) {
-+                    PortMapping portMap;
-+                    portMap.mExecutor = executor;
-+                    portMap.mDagPort = frameInfo.first;
-+                    portMap.mExecutorPort = portInfo.first;
-+                    mInputMaps.push_back(portMap);
-+                    // Clear the stream of executor to avoid binding it again.
-+                    CLEAR(portInfo.second);
-+                    LOG2("%s, inputMap executor %p, dagPort %d, execPort %d", __func__,
-+                        executor, frameInfo.first, portInfo.first);
-+                    break;
-+                }
-+            }
-+        }
-+    }
-+
-+    // Then bind the output ports.
-+    LOG2("%s, start to bind the output port", __func__);
-+    for (auto& executor : mExecutorsPool) {
-+        if (!executor->isOutputEdge()) {
-+            continue;
-+        }
-+
-+        executor->getFrameInfo(inputInfo, outputInfo);
-+        for (auto& frameInfo : mOutputFrameInfo) {
-+            for (auto& portInfo : outputInfo) {
-+                // Check if it has been cleared (bound already).
-+                if (!portInfo.second.format) {
-+                    continue;
-+                }
-+                if (executor->isSameStreamConfig(portInfo.second, frameInfo.second, mConfigMode, true)) {
-+                    PortMapping portMap;
-+                    portMap.mExecutor = executor;
-+                    portMap.mDagPort = frameInfo.first;
-+                    portMap.mExecutorPort = portInfo.first;
-+                    mOutputMaps.push_back(portMap);
-+                    // Clear the stream of executor to avoid binding it again.
-+                    CLEAR(portInfo.second);
-+                    break;
-+                }
-+            }
-+        }
-+    }
-+
-+    // Each required port must be mapped to one of (edge) executor's port.
-+    // One input port may be mapped to more of (edge) executor's ports.
-+    CheckError(mInputMaps.size() < mInputFrameInfo.size(), BAD_VALUE, "Failed to bind input ports");
-+    CheckError(mOutputMaps.size() != mOutputFrameInfo.size(), BAD_VALUE, "Failed to bind output ports");
-+
-+    return OK;
-+}
-+
-+int PSysDAG::registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    for (auto& outputMap : mOutputMaps) {
-+        if (port == outputMap.mDagPort) {
-+            outputMap.mExecutor->registerOutBuffers(outputMap.mExecutorPort, camBuffer);
-+            break;
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int PSysDAG::registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs)
-+{
-+    for (auto& portToBuffers : internalBufs) {
-+        for (auto& inputMap : mInputMaps) {
-+            if (inputMap.mDagPort == portToBuffers.first) {
-+                for (auto& inputBuf : portToBuffers.second) {
-+                    inputMap.mExecutor->registerInBuffers(inputMap.mExecutorPort, inputBuf);
-+                }
-+                break;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Queue the buffers in PSysTaskData to the cooresponding executors.
-+ */
-+int PSysDAG::queueBuffers(const PSysTaskData& task)
-+{
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    // Provide the input buffers for the input edge executor.
-+    for (auto& inputFrame : task.mInputBuffers) {
-+        for (auto& inputMap : mInputMaps) {
-+            if (inputMap.mDagPort == inputFrame.first) {
-+                inputMap.mExecutor->onFrameAvailable(inputMap.mExecutorPort, inputFrame.second);
-+                LOG2("%s, executorPort %d, exec %p", __func__,
-+                    inputMap.mExecutorPort, inputMap.mExecutor);
-+            }
-+        }
-+    }
-+
-+    // Provide the output buffers for the output edge executor.
-+    for (auto& outputFrame : task.mOutputBuffers) {
-+        for (auto& outputMap : mOutputMaps) {
-+            if (outputMap.mDagPort == outputFrame.first) {
-+                outputMap.mExecutor->qbuf(outputMap.mExecutorPort, outputFrame.second);
-+                break;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int PSysDAG::configure(ConfigMode configMode, TuningMode tuningMode)
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mConfigMode = configMode;
-+    mTuningMode = tuningMode;
-+
-+    // Configure IspParamAdaptor
-+    int ret = mIspParamAdaptor->init();
-+    CheckError(ret != OK, ret, "Init isp Adaptor failed, tuningMode %d", mTuningMode);
-+
-+    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, mTuningMode);
-+    CheckError(ret != OK, ret, "Configure isp Adaptor failed, tuningMode %d", mTuningMode);
-+
-+    ret = createPipeExecutors();
-+    CheckError(ret != OK, ret, "@%s, create psys executors failed", __func__);
-+
-+    ret = linkAndConfigExecutors();
-+    CheckError(ret != OK, ret, "Link executors failed");
-+
-+    ret = bindExternalPortsToExecutor();
-+    CheckError(ret != OK, ret, "Bind ports failed");
-+
-+    return OK;
-+}
-+
-+int PSysDAG::start()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mPolicyManager->setActive(true);
-+
-+    for (auto& executors : mExecutorsPool) {
-+        executors->start();
-+    }
-+    return OK;
-+}
-+
-+int PSysDAG::stop()
-+{
-+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    mPolicyManager->setActive(false);
-+
-+    for (auto& executors : mExecutorsPool) {
-+        executors->notifyStop();
-+    }
-+
-+    for (auto& executors : mExecutorsPool) {
-+        executors->stop();
-+    }
-+    return OK;
-+}
-+
-+int PSysDAG::resume()
-+{
-+    mPolicyManager->setActive(true);
-+    return OK;
-+}
-+
-+int PSysDAG::pause()
-+{
-+    mPolicyManager->setActive(false);
-+    return OK;
-+}
-+
-+void PSysDAG::addTask(PSysTaskData taskParam)
-+{
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    if (taskParam.mTuningMode != mTuningMode) {
-+        tuningReconfig(taskParam.mTuningMode);
-+    }
-+
-+    // It's too early to runIspAdapt here, and the ipu parameters
-+    // may be incorrect when runPipe.
-+    // TODO: remove this condition when 4k ULL pipe run faster
-+    bool runIspAdaptor = true;
-+    if (runIspAdaptor) {
-+        std::map<int32_t, bool> activeStreamIds;
-+        for (auto& outputFrame : taskParam.mOutputBuffers) {
-+            if (outputFrame.second.get() == nullptr)
-+                continue;
-+            for (auto& outputMap : mOutputMaps) {
-+                if (outputMap.mDagPort == outputFrame.first &&
-+                    mExecutorStreamIds.find(outputMap.mExecutor) != mExecutorStreamIds.end()) {
-+                    activeStreamIds[mExecutorStreamIds[outputMap.mExecutor]] = true;
-+                }
-+            }
-+        }
-+        for (auto& id : activeStreamIds) {
-+            mIspParamAdaptor->runIspAdapt(&taskParam.mIspSettings,
-+                              taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence(),
-+                              id.first);
-+        }
-+    }
-+
-+    {
-+        // Save the task data into mOngoingTasks
-+        TaskInfo task;
-+        task.mTaskData = taskParam;
-+        // Count how many valid output buffers need to be returned.
-+        for (auto& outBuf : taskParam.mOutputBuffers) {
-+            if (outBuf.second) {
-+                task.mNumOfValidBuffers++;
-+            }
-+        }
-+        LOG2("%s:Id:%d push task with %d output buffers, sequence: %ld",
-+                __func__, mCameraId, task.mNumOfValidBuffers,
-+                taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence());
-+        AutoMutex taskLock(mTaskLock);
-+        mOngoingTasks.push_back(task);
-+    }
-+
-+    queueBuffers(taskParam);
-+}
-+
-+int PSysDAG::getParameters(Parameters& param)
-+{
-+    return mIspParamAdaptor->getParameters(param);
-+}
-+
-+TuningMode PSysDAG::getTuningMode(long sequence)
-+{
-+    AutoMutex taskLock(mTaskLock);
-+
-+    TuningMode taskTuningMode = mTuningMode;
-+    bool taskTuningModeFound = false;
-+
-+    for (auto const& task : mOngoingTasks) {
-+        if (sequence == task.mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
-+            taskTuningMode = task.mTaskData.mTuningMode;
-+            taskTuningModeFound = true;
-+            break;
-+        }
-+    }
-+
-+    if (!taskTuningModeFound) {
-+        LOGW("No task tuning mode found for sequence:%ld, use current DAG tuning mode.", sequence);
-+    }
-+
-+    return taskTuningMode;
-+}
-+
-+/**
-+ * Use to handle the frame done event from the executors.
-+ *
-+ * This is for returning output buffers to PSysDAG. And it'll check if all the valid
-+ * output buffer returned, if so, then it'll return the whole corresponding task data to
-+ * PSysProcessor.
-+ */
-+int PSysDAG::onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer)
-+{
-+    LOG2("@%s, mCameraId:%d buffer=%p", __func__, mCameraId, buffer.get());
-+
-+    if (!buffer) return OK; // No need to handle if the buffer is nullptr.
-+
-+    long sequence = buffer->getSequence();
-+    bool needReturn = false;
-+    PSysTaskData result;
-+
-+    {
-+        // Remove the sequence when finish to process it
-+        AutoMutex   l(mSequenceLock);
-+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
-+            if (mOngoingSequence[i] == sequence) {
-+                mOngoingSequence[i] = -1;
-+                break;
-+            }
-+        }
-+    }
-+
-+    {
-+        AutoMutex taskLock(mTaskLock);
-+        for (auto it = mOngoingTasks.begin(); it != mOngoingTasks.end(); it++) {
-+            // Check if the returned buffer belong to the task.
-+            if (sequence != it->mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
-+                continue;
-+            }
-+
-+            it->mNumOfReturnedBuffers++;
-+            if (it->mNumOfReturnedBuffers >= it->mNumOfValidBuffers) {
-+                result = it->mTaskData;
-+                needReturn = true;
-+                LOG2("%s:Id:%d finish task with %d returned output buffers, sequence: %ld", __func__,
-+                        mCameraId, it->mNumOfReturnedBuffers, sequence);
-+                // Remove the task data from mOngoingTasks since it's already processed.
-+                mOngoingTasks.erase(it);
-+            }
-+            // No need check other if other tasks are matched with the returned buffer since
-+            // we already found one.
-+            break;
-+        }
-+    }
-+
-+    if (needReturn) {
-+        returnBuffers(result);
-+    }
-+
-+    return OK;
-+}
-+
-+int PSysDAG::prepareIpuParams(long sequence, bool forceUpdate)
-+{
-+    // Make sure the AIC is executed once.
-+    if (!forceUpdate) {
-+        AutoMutex   l(mSequenceLock);
-+
-+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
-+            // This means aic for the sequence has been executed.
-+            if (mOngoingSequence[i] == sequence) {
-+                return OK;
-+            }
-+        }
-+
-+        // Store the new sequence.
-+        for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
-+            if (mOngoingSequence[i] == -1) {
-+                mOngoingSequence[i] = sequence;
-+                break;
-+            }
-+        }
-+    }
-+
-+    const IspSettings* ispSettings = nullptr;
-+    {
-+        AutoMutex taskLock(mTaskLock);
-+        for (auto const& task : mOngoingTasks) {
-+            if (sequence == task.mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
-+                ispSettings = &task.mTaskData.mIspSettings;
-+                break;
-+            }
-+        }
-+    }
-+
-+    if (ispSettings == nullptr) {
-+        LOGW("Run ISP adaptor with ispSettings is nullptr. This should never happen.");
-+    }
-+    LOG2("%s, Run AIC for sequence: %ld", __func__, sequence);
-+
-+    return mIspParamAdaptor->runIspAdapt(ispSettings, sequence);
-+}
-+
-+int PSysDAG::returnBuffers(PSysTaskData& result)
-+{
-+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
-+
-+    CheckError(!mPSysDagCB, INVALID_OPERATION, "Invalid PSysProcessor");
-+
-+    mPSysDagCB->onFrameDone(result);
-+    return OK;
-+}
-+
-+void PSysDAG::registerListener(EventType eventType, EventListener* eventListener)
-+{
-+    //Pass through event registration to PipeExecutor
-+    for (auto const& executor : mExecutorsPool) {
-+        executor->registerListener(eventType, eventListener);
-+    }
-+}
-+
-+void PSysDAG::removeListener(EventType eventType, EventListener* eventListener)
-+{
-+    //Pass through event unregistration to PipeExecutor
-+    for (auto const& executor : mExecutorsPool) {
-+        executor->removeListener(eventType, eventListener);
-+    }
-+}
-+
-+void PSysDAG::tuningReconfig(TuningMode newTuningMode)
-+{
-+    LOG1("@%s ", __func__);
-+
-+    if (mIspParamAdaptor) {
-+        mIspParamAdaptor->deinit();
-+    } else {
-+        mIspParamAdaptor = new IspParamAdaptor(mCameraId, PG_PARAM_PSYS_ISA);
-+    }
-+
-+    int ret = mIspParamAdaptor->init();
-+    CheckError(ret != OK, VOID_VALUE, "Init isp Adaptor failed, tuningMode %d", newTuningMode);
-+
-+    ret = mIspParamAdaptor->configure(mInputFrameInfo[mDefaultMainInputPort], mConfigMode, newTuningMode);
-+    CheckError(ret != OK, VOID_VALUE, "Failed to reconfig isp Adaptor.");
-+
-+    mTuningMode = newTuningMode;
-+}
-+
-+void PSysDAG::dumpExternalPortMap()
-+{
-+    for (auto& inputMap : mInputMaps) {
-+        if (inputMap.mExecutor) {
-+            LOG2("@%s: Input port %d, executor: %s:%d", __func__, inputMap.mDagPort,
-+                 inputMap.mExecutor->getName(), inputMap.mExecutorPort);
-+        } else {
-+            LOGE("%s: no executro for input port %d!", __func__, inputMap.mDagPort);
-+        }
-+    }
-+    for (auto& outputMap : mOutputMaps) {
-+        if (outputMap.mExecutor) {
-+            LOG2("@%s: Output port %d, executor: %s:%d", __func__, outputMap.mDagPort,
-+                 outputMap.mExecutor->getName(), outputMap.mExecutorPort);
-+        } else {
-+            LOGE("%s: no executro for output port %d!", __func__, outputMap.mDagPort);
-+        }
-+    }
-+}
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
-new file mode 100644
-index 000000000000..274303d05a14
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.h
-@@ -0,0 +1,147 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "Parameters.h"
-+#include "PlatformData.h"
-+#include "CameraBuffer.h"
-+#include "IspParamAdaptor.h"
-+#ifdef USE_PG_LITE_PIPE
-+#include "PipeLiteExecutor.h"
-+#else
-+#include "PipeExecutor.h"
-+#endif
-+#include "PolicyManager.h"
-+
-+/*************************************************
-+ * TODO: currently only consider video stream,
-+ *       will also consider still stream later.
-+ *************************************************/
-+#define VIDEO_STREAM_ID 60001
-+
-+namespace icamera {
-+
-+/**
-+ * Encapsulation of all parameters needed by PSysExecutor to run PSYS pipeline.
-+ */
-+struct PSysTaskData {
-+    IspSettings mIspSettings;
-+    TuningMode mTuningMode;
-+
-+    CameraBufferPortMap mInputBuffers;
-+    CameraBufferPortMap mOutputBuffers;
-+    PSysTaskData() { mTuningMode = TUNING_MODE_MAX; };
-+};
-+
-+class PSysDagCallback {
-+public:
-+    PSysDagCallback() {};
-+    virtual ~PSysDagCallback() {};
-+    virtual void onFrameDone(const PSysTaskData& result) {};
-+};
-+
-+class PSysDAG {
-+
-+public:
-+    PSysDAG(int cameraId, PSysDagCallback* psysDagCB);
-+    virtual ~PSysDAG();
-+    void setFrameInfo(const std::map<Port, stream_t>& inputInfo,
-+                      const std::map<Port, stream_t>& outputInfo);
-+    int configure(ConfigMode configMode, TuningMode tuningMode);
-+    int start();
-+    int stop();
-+
-+    int resume();
-+    int pause();
-+
-+    int registerInternalBufs(std::map<Port, CameraBufVector> &internalBufs);
-+    int registerUserOutputBufs(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+
-+    void addTask(PSysTaskData taskParam);
-+    int getParameters(Parameters& param);
-+
-+    void registerListener(EventType eventType, EventListener* eventListener);
-+    void removeListener(EventType eventType, EventListener* eventListener);
-+
-+    TuningMode getTuningMode(long sequence);
-+    int prepareIpuParams(long sequence, bool forceUpdate = false);
-+
-+    /**
-+     * Use to handle the frame done event from the executors.
-+     */
-+    int onFrameDone(Port port, const std::shared_ptr<CameraBuffer>& buffer);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PSysDAG);
-+
-+    void tuningReconfig(TuningMode newTuningMode);
-+
-+    int createPipeExecutors();
-+    int linkAndConfigExecutors();
-+    int bindExternalPortsToExecutor();
-+    void releasePipeExecutors();
-+
-+    PipeExecutor* findExecutorProducer(PipeExecutor* consumer);
-+
-+    int queueBuffers(const PSysTaskData& task);
-+    int returnBuffers(PSysTaskData& result);
-+
-+    void dumpExternalPortMap();
-+
-+private:
-+    int mCameraId;
-+    PSysDagCallback* mPSysDagCB; //Used to callback notify frame done handling
-+    PolicyManager* mPolicyManager;
-+    ConfigMode mConfigMode; //It is actually real config mode.
-+    TuningMode mTuningMode;
-+    IspParamAdaptor* mIspParamAdaptor;
-+
-+    std::map<Port, stream_t> mInputFrameInfo;
-+    std::map<Port, stream_t> mOutputFrameInfo;
-+    Port mDefaultMainInputPort;
-+
-+    std::vector<PipeExecutor*> mExecutorsPool;
-+    std::map<PipeExecutor*, int32_t> mExecutorStreamIds;
-+
-+    // A lock for protecting task data from being accessed by different threads.
-+    Mutex mTaskLock;
-+    // Used to save all on-processing tasks.
-+    struct TaskInfo {
-+        TaskInfo() : mNumOfValidBuffers(0), mNumOfReturnedBuffers(0) {}
-+        PSysTaskData mTaskData;
-+        int mNumOfValidBuffers;
-+        int mNumOfReturnedBuffers;
-+    };
-+    std::vector<TaskInfo> mOngoingTasks;
-+
-+    long mOngoingSequence[MAX_BUFFER_COUNT];
-+    Mutex mSequenceLock;
-+
-+    /**
-+     * The relationship mapping between DAG's port and executors port.
-+     */
-+    struct PortMapping {
-+        PortMapping() : mExecutor(nullptr), mDagPort(INVALID_PORT), mExecutorPort(INVALID_PORT) {}
-+        PipeExecutor* mExecutor;
-+        Port mDagPort;
-+        Port mExecutorPort;
-+    };
-+
-+    std::vector<PortMapping> mInputMaps;
-+    std::vector<PortMapping> mOutputMaps;
-+};
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
-new file mode 100644
-index 000000000000..c434ebff1af4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
-@@ -0,0 +1,1116 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PipeLiteExecutor"
-+
-+#include <algorithm>
-+
-+#include "PipeLiteExecutor.h"
-+#include "PSysDAG.h"
-+
-+#include "FormatUtils.h"
-+#include "iutils/CameraDump.h"
-+#include "SyncManager.h"
-+
-+// CIPF backends
-+extern "C" {
-+#include <ia_cipf_css/ia_cipf_css.h>
-+#include <ia_pal_types_isp_ids_autogen.h>
-+}
-+
-+using std::vector;
-+using std::string;
-+using std::map;
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+static const int32_t sStatKernels[] = {
-+    ia_pal_uuid_isp_bxt_awbstatistics,
-+    ia_pal_uuid_isp_awbstatistics_2_0,
-+    ia_pal_uuid_isp_bxt_dvsstatistics
-+};
-+
-+static const int32_t sSisKernels[] = {
-+    ia_pal_uuid_isp_sis_1_0_a
-+};
-+
-+PipeLiteExecutor::PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
-+                                   vector<string> exclusivePGs, PSysDAG *psysDag,
-+                                   shared_ptr<IGraphConfig> gc)
-+      : mCameraId(cameraId),
-+        mStreamId(-1),
-+        mName(policy.exeName),
-+        mPGNames(policy.pgList),
-+        mOpModes(policy.opModeList),
-+        mGraphConfig(gc),
-+        mIsInputEdge(false),
-+        mIsOutputEdge(false),
-+        mNotifyPolicy(POLICY_FRAME_FIRST),
-+        mAdaptor(nullptr),
-+        mPolicyManager(nullptr),
-+        mLastStatsSequence(-1),
-+        mExclusivePGs(exclusivePGs),
-+        mPSysDag(psysDag),
-+        mkernelsCountWithStats(0)
-+{
-+    mProcessThread = new ProcessThread(this);
-+}
-+
-+PipeLiteExecutor::~PipeLiteExecutor()
-+{
-+    while (!mPGExecutors.empty()) {
-+        ExecutorUnit& unit = mPGExecutors.back();
-+        if (unit.pg.get()) {
-+            unit.pg->deInit();
-+        }
-+        mPGExecutors.pop_back();
-+    }
-+
-+    releaseBuffers();
-+    delete mProcessThread;
-+}
-+
-+int PipeLiteExecutor::initPipe()
-+{
-+    LOG1("@%s:%s", __func__, getName());
-+    CheckError(mGraphConfig == nullptr, BAD_VALUE, "%s, the graph config is NULL, BUG!", __func__);
-+
-+    NodesPtrVector programGroups;
-+    vector<IGraphType::PipelineConnection> connVector;
-+
-+    int ret = mGraphConfig->pipelineGetConnections(mPGNames, &connVector);
-+    CheckError(connVector.empty(), ret, "Failed to get connections for executor:%s", mName.c_str());
-+
-+    ret = createPGs();
-+    CheckError(ret != OK, ret, "Failed to create PGs for executor: %s", ret, mName.c_str());
-+
-+    ret = analyzeConnections(connVector);
-+    CheckError(ret != OK, ret, "Failed to analyze connections for executor: %s", ret, mName.c_str());
-+
-+    ret = configurePGs();
-+    CheckError(ret != OK, ret, "Failed to configure connections for executor: %s", ret, mName.c_str());
-+
-+    assignDefaultPortsForTerminals();
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::analyzeConnections(const vector<IGraphType::PipelineConnection>& connVector)
-+{
-+    ia_uid firstStageId = mPGExecutors.front().stageId;
-+    ia_uid lastStageId = mPGExecutors.back().stageId;
-+
-+    for (auto const& connection : connVector) {
-+        LOG2("%s: terminal %d (%d): %dx%d, 0x%x", getName(),
-+             connection.portFormatSettings.terminalId, connection.portFormatSettings.enabled,
-+             connection.portFormatSettings.width, connection.portFormatSettings.height,
-+             connection.portFormatSettings.fourcc);
-+        LOG2("%s:     connection source %d, %d, %d, has edge %d", getName(),
-+             connection.connectionConfig.mSourceStage, connection.connectionConfig.mSourceTerminal,
-+             connection.connectionConfig.mSourceIteration, connection.hasEdgePort);
-+        LOG2("%s:     connection sink %d, %d, %d, type %d", getName(),
-+             connection.connectionConfig.mSinkStage, connection.connectionConfig.mSinkTerminal,
-+             connection.connectionConfig.mSinkIteration, connection.connectionConfig.mConnectionType);
-+
-+        storeTerminalInfo(connection);
-+
-+        if (connection.portFormatSettings.enabled == 0) {
-+            // No actions are needed for the disabled connections.
-+            continue;
-+        }
-+
-+        // If the connection's sink stage is same as the first stage/pg id in this executor,
-+        // then it means the connection belongs to input terminal pairs.
-+        if (connection.connectionConfig.mSinkStage == firstStageId && connection.hasEdgePort) {
-+            mIsInputEdge = true;
-+        }
-+
-+        // If the connection's source stage is same as the last stage/pg id in this executor,
-+        // then it means the connection belongs to output terminal pairs.
-+        // SIS is output terminal but it doesn't belong to any stream, so it is not real edge output.
-+        if (connection.connectionConfig.mSourceStage == lastStageId
-+            && connection.hasEdgePort
-+            && connection.connectionConfig.mSourceTerminal != connection.connectionConfig.mSinkTerminal) {
-+            mIsOutputEdge = true;
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::storeTerminalInfo(const IGraphType::PipelineConnection& connection)
-+{
-+    FrameInfo info;
-+    info.mWidth = connection.portFormatSettings.width;
-+    info.mHeight = connection.portFormatSettings.height;
-+    info.mFormat = connection.portFormatSettings.fourcc;
-+
-+    ia_uid curTerminal    = connection.portFormatSettings.terminalId;
-+    ia_uid sinkTerminal   = connection.connectionConfig.mSinkTerminal;
-+    ia_uid sourceTerminal = connection.connectionConfig.mSourceTerminal;
-+    ia_uid sinkStage      = connection.connectionConfig.mSinkStage;
-+    ia_uid sourceStage    = connection.connectionConfig.mSourceStage;
-+
-+    TerminalDescriptor desc;
-+    desc.terminal       = 0;
-+    desc.stageId        = 0;
-+    desc.sinkTerminal   = sinkTerminal;
-+    desc.sourceTerminal = sourceTerminal;
-+    desc.sinkStage      = sinkStage;
-+    desc.sourceStage    = sourceStage;
-+    desc.frameDesc      = info;
-+    desc.enabled        = true;
-+    desc.hasConnection  = true;
-+    desc.assignedPort   = INVALID_PORT;
-+    desc.usrStreamId   = connection.stream ? connection.stream->streamId() : -1;
-+
-+    if (connection.portFormatSettings.enabled) {
-+        mConnectionMap[sinkTerminal]= sourceTerminal;
-+    }
-+
-+    // Check if there is new input terminal
-+    if (sinkStage && mTerminalsDesc.find(sinkTerminal) == mTerminalsDesc.end()) {
-+        ExecutorUnit* unit = findPGExecutor(sinkStage);
-+        if (unit) {
-+            desc.terminal = sinkTerminal;
-+            desc.stageId = sinkStage;
-+            mTerminalsDesc[desc.terminal] = desc;
-+            unit->inputTerminals.push_back(desc.terminal);
-+        }
-+    }
-+    // Check if there is new output terminal
-+    if (sourceStage && mTerminalsDesc.find(sourceTerminal) == mTerminalsDesc.end()) {
-+        ExecutorUnit* unit = findPGExecutor(sourceStage);
-+        if (unit) {
-+            desc.terminal = sourceTerminal;
-+            desc.stageId = sourceStage;
-+            desc.hasConnection = (sinkTerminal != sourceTerminal);
-+            mTerminalsDesc[desc.terminal] = desc;
-+            unit->outputTerminals.push_back(desc.terminal);
-+        }
-+    }
-+
-+    if (mTerminalsDesc.find(curTerminal) != mTerminalsDesc.end()) {
-+        mTerminalsDesc[curTerminal].enabled = connection.portFormatSettings.enabled;
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::createPGs()
-+{
-+    for (auto const& pgName : mPGNames) {
-+        int pgId = mGraphConfig->getPgIdByPgName(pgName);
-+        CheckError(pgId == -1, BAD_VALUE, "Cannot get PG ID for %s", pgName.c_str());
-+
-+        ExecutorUnit pgUnit;
-+        pgUnit.pgId = pgId;
-+        pgUnit.stageId = psys_2600_pg_uid(pgId);
-+        pgUnit.pg = std::shared_ptr<PGCommon>(new PGCommon(pgId, pgName, pgUnit.stageId + 1));
-+        // Please refer to ia_cipf_css.h for terminalBaseUid
-+        mPGExecutors.push_back(pgUnit);
-+        int ret = pgUnit.pg->init();
-+        CheckError(ret != OK, UNKNOWN_ERROR, "create PG %d error", pgId);
-+    }
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::configurePGs()
-+{
-+    mkernelsCountWithStats = 0;
-+    for (auto &unit : mPGExecutors) {
-+        map<ia_uid, FrameInfo> inputInfos;
-+        map<ia_uid, FrameInfo> outputInfos;
-+        vector<ia_uid> disabledTerminals;
-+
-+        getTerminalFrameInfos(unit.inputTerminals, inputInfos);
-+        getTerminalFrameInfos(unit.outputTerminals, outputInfos);
-+        getDisabledTerminalsForPG(unit.stageId, disabledTerminals);
-+
-+        unit.pg->setInputInfo(inputInfos);
-+        unit.pg->setOutputInfo(outputInfos);
-+        unit.pg->setDisabledTerminals(disabledTerminals);
-+
-+        IGraphType::StageAttr stageAttr;
-+        if (mGraphConfig->getPgRbmValue(unit.pg->getName(), &stageAttr) == OK) {
-+            LOG1("%s: Set rbm for pgId %d, pgName: %s bytes %d",
-+                 __func__, unit.pgId, unit.pg->getName(), stageAttr.rbm_bytes);
-+            unit.pg->setRoutingBitmap(stageAttr.rbm, stageAttr.rbm_bytes);
-+        }
-+        unit.pg->prepare(mAdaptor, mStreamId);
-+
-+        int statsCount = getStatKernels(unit.pgId, unit.statKernelUids);
-+        mkernelsCountWithStats += statsCount;
-+
-+        statsCount = getSisKernels(unit.pgId, unit.sisKernelUids);
-+        mkernelsCountWithStats += statsCount;
-+    }
-+
-+    return OK;
-+}
-+
-+/**
-+ * Assign ports for terminals as internal default value
-+ * Input ports may be overwritten with output ports of producer in setInputTerminals()
-+ */
-+int PipeLiteExecutor::assignDefaultPortsForTerminals()
-+{
-+    Port portTable[] = {MAIN_PORT, SECOND_PORT, THIRD_PORT, FORTH_PORT, INVALID_PORT};
-+    for (auto &unit : mPGExecutors) {
-+        int outPortIndex = 0;
-+        for (auto terminal : unit.outputTerminals) {
-+            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
-+            if (termDesc.enabled && termDesc.hasConnection) {
-+                CheckError(portTable[outPortIndex] == INVALID_PORT, BAD_VALUE,
-+                    "Port unavailable for output term %d:%d", unit.pgId, terminal);
-+                termDesc.assignedPort = portTable[outPortIndex];
-+                outPortIndex++;
-+            }
-+        }
-+
-+        int inPortIndex = 0;
-+        for (auto terminal : unit.inputTerminals) {
-+            TerminalDescriptor& termDesc = mTerminalsDesc[terminal];
-+            if (termDesc.enabled && termDesc.hasConnection) {
-+                CheckError(portTable[inPortIndex] == INVALID_PORT, BAD_VALUE,
-+                    "Port unavailable for input term %d", terminal);
-+                termDesc.assignedPort = portTable[inPortIndex];
-+                inPortIndex++;
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void PipeLiteExecutor::getOutputTerminalPorts(std::map<ia_uid, Port>& terminals) const
-+{
-+    getTerminalPorts(mPGExecutors.back().outputTerminals, terminals);
-+}
-+
-+void PipeLiteExecutor::getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const
-+{
-+    getTerminalPorts(mPGExecutors.front().inputTerminals, terminals);
-+}
-+
-+int PipeLiteExecutor::setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals)
-+{
-+    // In edge PGs accepts input ports arrangement from external
-+    ExecutorUnit& inUnit = mPGExecutors.front();
-+    for (auto sinkTerminal : inUnit.inputTerminals) {
-+        if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
-+            continue;
-+        }
-+
-+        ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
-+        if (sourceTerminals.find(sourceTerminal) != sourceTerminals.end()) {
-+            mTerminalsDesc[sinkTerminal].assignedPort = sourceTerminals.at(sourceTerminal);
-+            LOG2("pg %s get external %d -> input %d, port %d", getName(),
-+                 sourceTerminal, sinkTerminal, mTerminalsDesc[sinkTerminal].assignedPort);
-+        }
-+    }
-+
-+    // Link internal PGs (sink PG accepts input ports arrangement from source PG (output ports)
-+    // source PG(output ports) -> (input ports)sink PG
-+    for (unsigned int i = 1; i < mPGExecutors.size(); i++) {
-+        for (auto sinkTerminal : mPGExecutors[i].inputTerminals) {
-+            if (!mTerminalsDesc[sinkTerminal].enabled) {
-+                continue;
-+            }
-+            if (mConnectionMap.find(sinkTerminal) != mConnectionMap.end()) {
-+                ia_uid sourceTerminal = mConnectionMap[sinkTerminal];
-+                mTerminalsDesc[sinkTerminal].assignedPort = mTerminalsDesc[sourceTerminal].assignedPort;
-+            }
-+        }
-+    }
-+
-+    // Set frame info to BufferQueue
-+    map<Port, stream_t> inputInfo;
-+    map<Port, stream_t> outputInfo;
-+    ExecutorUnit& outUnit = mPGExecutors.back();
-+    for (auto terminal : inUnit.inputTerminals) {
-+        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
-+            continue;
-+        }
-+
-+        stream_t inputConfig;
-+        CLEAR(inputConfig);
-+        inputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
-+        inputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
-+        inputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
-+        inputConfig.id = mTerminalsDesc[terminal].usrStreamId;
-+        inputInfo[mTerminalsDesc[terminal].assignedPort] = inputConfig;
-+    }
-+    for (auto terminal : outUnit.outputTerminals) {
-+        if (mTerminalsDesc[terminal].assignedPort == INVALID_PORT) {
-+            continue;
-+        }
-+
-+        stream_t outputConfig;
-+        CLEAR(outputConfig);
-+        outputConfig.width = mTerminalsDesc[terminal].frameDesc.mWidth;
-+        outputConfig.height = mTerminalsDesc[terminal].frameDesc.mHeight;
-+        outputConfig.format = mTerminalsDesc[terminal].frameDesc.mFormat;
-+        outputConfig.id = mTerminalsDesc[terminal].usrStreamId;
-+        outputInfo[mTerminalsDesc[terminal].assignedPort] = outputConfig;
-+    }
-+    BufferQueue::setFrameInfo(inputInfo, outputInfo);
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::start()
-+{
-+    LOG1("%s executor:%s", __func__, mName.c_str());
-+    AutoMutex   l(mBufferQueueLock);
-+
-+    allocBuffers();
-+    dumpPGs();
-+
-+    mLastStatsSequence = -1;
-+
-+    mThreadRunning = true;
-+    mProcessThread->run(mName.c_str(), PRIORITY_NORMAL);
-+
-+    return OK;
-+}
-+
-+void PipeLiteExecutor::stop()
-+{
-+    LOG1("%s executor:%s", __func__, mName.c_str());
-+
-+    mProcessThread->requestExitAndWait();
-+
-+    // Thread is not running. It is safe to clear the Queue
-+    clearBufferQueues();
-+}
-+
-+void PipeLiteExecutor::notifyStop()
-+{
-+    LOG1("%s executor:%s", __func__, mName.c_str());
-+
-+    mProcessThread->requestExit();
-+    {
-+        AutoMutex l(mBufferQueueLock);
-+        mThreadRunning = false;
-+        // Wakeup the thread to exit
-+        mFrameAvailableSignal.signal();
-+        mOutputAvailableSignal.signal();
-+    }
-+}
-+
-+int PipeLiteExecutor::releaseStatsBuffer(const shared_ptr<CameraBuffer> &statsBuf)
-+{
-+    LOG3A("%s executor:%s", __func__, mName.c_str());
-+    AutoMutex lock(mStatsBuffersLock);
-+
-+    mStatsBuffers.push(statsBuf);
-+
-+    return OK;
-+}
-+
-+bool PipeLiteExecutor::hasOutputTerminal(ia_uid sinkTerminal)
-+{
-+    if (mConnectionMap.find(sinkTerminal) == mConnectionMap.end()) {
-+        return false;
-+    }
-+
-+    ExecutorUnit& unit = mPGExecutors.back();
-+    for (auto sourceTerminal : unit.outputTerminals) {
-+        if (mConnectionMap[sinkTerminal] == sourceTerminal) {
-+            return true;
-+        }
-+    }
-+    return false;
-+}
-+
-+int PipeLiteExecutor::getStatKernels(int pgId, vector<ia_uid>& kernels)
-+{
-+    kernels.clear();
-+    for (unsigned int i = 0; i < ARRAY_SIZE(sStatKernels); i++) {
-+        int pgIdOfKernel = -1;
-+        int status = mGraphConfig->getPgIdForKernel(mStreamId, sStatKernels[i], &pgIdOfKernel);
-+        if (status == OK && pgIdOfKernel == pgId) {
-+             kernels.push_back(sStatKernels[i]);
-+        }
-+    }
-+
-+    LOG1("pg %d has %d stat kernels", pgId, kernels.size());
-+    return kernels.size();
-+}
-+
-+int PipeLiteExecutor::getSisKernels(int pgId, vector<ia_uid>& kernels)
-+{
-+    kernels.clear();
-+    for (unsigned int i = 0; i < ARRAY_SIZE(sSisKernels); i++) {
-+        int pgIdOfKernel = -1;
-+        int status = mGraphConfig->getPgIdForKernel(mStreamId, sSisKernels[i], &pgIdOfKernel);
-+        if (status == OK && pgIdOfKernel == pgId) {
-+             kernels.push_back(sSisKernels[i]);
-+        }
-+    }
-+
-+    LOG1("pg %d has %d sis kernels", pgId, kernels.size());
-+    return kernels.size();
-+}
-+
-+bool PipeLiteExecutor::isSameStreamConfig(const stream_t& internal, const stream_t& external,
-+                                          ConfigMode configMode, bool checkStreamId) const
-+{
-+    // The internal format is ia_fourcc based format, so need to convert it to V4L2 format.
-+    int internalFormat = graphconfig::utils::getV4L2Format(internal.format);
-+    int internalStride = CameraUtils::getStride(internalFormat, internal.width);
-+    int externalStride = CameraUtils::getStride(external.format, external.width);
-+
-+    LOG1("%s: %s, id:%d, internal: %s(%dx%d: %d)(id %d), external: %s(%dx%d: %d) (id %d) usage:%d",
-+          __func__, mName.c_str(), mStreamId,
-+          CameraUtils::format2string(internalFormat).c_str(),
-+          internal.width, internal.height, internalStride, internal.id,
-+          CameraUtils::format2string(external.format).c_str(),
-+          external.width, external.height, externalStride, external.id, external.usage);
-+
-+    if (checkStreamId && internal.id >= 0) {
-+        return internal.id == external.id;
-+    }
-+
-+    /*
-+     * WA: PG accept GRBG format but actual input data is of RGGB format,
-+     *     PG use its kernel to crop to GRBG
-+     */
-+    if ((internalFormat == V4L2_PIX_FMT_SGRBG10 || internalFormat == V4L2_PIX_FMT_SGRBG12)
-+         && (external.format == V4L2_PIX_FMT_SRGGB10 || external.format == V4L2_PIX_FMT_SRGGB12)) {
-+         return true;
-+    }
-+
-+    bool sameHeight = internal.height == external.height ||
-+                      internal.height == ALIGN_32(external.height);
-+    if (internalFormat == external.format && sameHeight &&
-+        (internal.width == external.width || internalStride == externalStride)) {
-+        return true;
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * Check if there is any valid buffer(not null) in the given port/buffer pairs.
-+ *
-+ * return true if there is at least one not null buffer.
-+ */
-+bool PipeLiteExecutor::hasValidBuffers(const CameraBufferPortMap& buffers)
-+{
-+    for (const auto& item : buffers) {
-+        if (item.second) return true;
-+    }
-+
-+    return false;
-+}
-+
-+int PipeLiteExecutor::processNewFrame()
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    int ret = OK;
-+    CameraBufferPortMap inBuffers, outBuffers;
-+    // Wait frame buffers.
-+    {
-+        ConditionLock lock(mBufferQueueLock);
-+        ret = waitFreeBuffersInQueue(lock, inBuffers, outBuffers);
-+        // Already stopped
-+        if (!mThreadRunning) return -1;
-+
-+        if (ret != OK) return OK; // Wait frame buffer error should not involve thread exit.
-+
-+        CheckError(inBuffers.empty() || outBuffers.empty(),
-+              UNKNOWN_ERROR, "Failed to get input or output buffers.");
-+
-+        for (auto& output: mOutputQueue) {
-+            output.second.pop();
-+        }
-+
-+        for (auto& input: mInputQueue) {
-+            input.second.pop();
-+        }
-+    }
-+
-+    // Check if the executor needs to run the actual pipeline.
-+    // It only needs to run when there is at least one valid output buffer.
-+    if (!hasValidBuffers(outBuffers)) {
-+        // Return buffers if the executor is NOT an input edge.
-+        if (!mIsInputEdge) {
-+            for (const auto& item : inBuffers) {
-+                mBufferProducer->qbuf(item.first, item.second);
-+            }
-+        }
-+        return OK;
-+    }
-+
-+    // Fill real buffer to run pipe
-+    for (auto &item : outBuffers) {
-+        if (item.second.get() == nullptr) {
-+            item.second = mInternalOutputBuffers[item.first];
-+        }
-+    }
-+
-+    vector<shared_ptr<CameraBuffer>> outStatsBuffers;
-+    vector<EventType> eventType;
-+    // Should find first not none input buffer instead of always use the first one.
-+    shared_ptr<CameraBuffer> inBuf = inBuffers.begin()->second;
-+    CheckError(!inBuf, UNKNOWN_ERROR, "@%s: no valid input buffer", __func__);
-+    long inBufSequence = inBuf->getSequence();
-+    v4l2_buffer_t inV4l2Buf = *inBuf->getV4L2Buffer().Get();
-+    TuningMode tuningMode = mPSysDag->getTuningMode(inBufSequence);
-+
-+    // Enable RAW DUMP to get the MakerNote from jpeg
-+    if (CameraDump::isDumpTypeEnable(DUMP_JPEG_BUFFER)) {
-+        if (mName.find("still") != std::string::npos) {
-+            CameraDump::dumpImage(mCameraId, inBuffers[MAIN_PORT], M_PSYS, MAIN_PORT);
-+        }
-+    }
-+
-+    LOG2("%s:Id:%d run pipe start for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
-+
-+    if (PlatformData::isEnableFrameSyncCheck(mCameraId)) {
-+        shared_ptr<CameraBuffer> cInBuffer = inBuffers[MAIN_PORT];
-+        int vc = cInBuffer->getVirtualChannel();
-+
-+        while ((!SyncManager::getInstance()->vcSynced(vc)) && mThreadRunning)
-+            usleep(1);
-+
-+        if (gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC) {
-+            int seq = cInBuffer->getSequence();
-+            SyncManager::getInstance()->printVcSyncCount();
-+            LOGVCSYNC("[start runPipe], CPU-timestamp:%lu, sequence:%d, vc:%d, kernel-timestamp:%.3lfms, endl",
-+                      CameraUtils::systemTime(),
-+                      seq,
-+                      cInBuffer->getVirtualChannel(),
-+                      cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
-+        }
-+
-+        SyncManager::getInstance()->updateVcSyncCount(vc);
-+
-+        // Run pipe with buffers
-+        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
-+        LOGVCSYNC("[done runPipe], CPU-timestamp:%lu, sequence:%ld, vc:%d, kernel-timestamp:%.3lfms, endl",
-+                  CameraUtils::systemTime(),
-+                  cInBuffer->getSequence(),
-+                  cInBuffer->getVirtualChannel(),
-+                  cInBuffer->getTimestamp().tv_sec*1000.0 + cInBuffer->getTimestamp().tv_usec/1000.0);
-+    } else {
-+        // Run pipe with buffers
-+        ret = runPipe(inBuffers, outBuffers, outStatsBuffers, eventType);
-+    }
-+    CheckError((ret != OK), UNKNOWN_ERROR, "@%s: failed to run pipe", __func__);
-+    LOG2("%s:Id:%d run pipe end for buffer:%ld", mName.c_str(), mCameraId, inBufSequence);
-+
-+    // Remove internal output buffers
-+    for (auto &item : outBuffers) {
-+        if (item.second.get() == mInternalOutputBuffers[item.first].get()) {
-+            item.second = nullptr;
-+        }
-+    }
-+
-+    if (mNotifyPolicy == POLICY_FRAME_FIRST) {
-+        // For general case, notify frame prior to stats to make sure its consumers can get
-+        // the frame buffers as early as possible.
-+        notifyFrameDone(inV4l2Buf, outBuffers);
-+        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
-+    } else if (mNotifyPolicy == POLICY_STATS_FIRST) {
-+        // Notify stats first and then handle frame buffers to make sure the next executor
-+        // can get this executor's IQ result.
-+        notifyStatsDone(tuningMode, inV4l2Buf, outStatsBuffers, eventType);
-+
-+        // After the stats notified, we need to update the IPU parameters as well to get the
-+        // latest AIQ result.
-+        mPSysDag->prepareIpuParams(inBufSequence, true);
-+
-+        notifyFrameDone(inV4l2Buf, outBuffers);
-+    } else {
-+        LOGW("Invalid notify policy:%d, should never happen.", mNotifyPolicy);
-+    }
-+
-+    // Return buffers for the executor which is NOT an input edge
-+    if (!mIsInputEdge) {
-+        for (auto const& portBufferPair : inBuffers) {
-+            // Queue buffer to producer
-+            mBufferProducer->qbuf(portBufferPair.first, portBufferPair.second);
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::registerInBuffers(Port port, const shared_ptr<CameraBuffer> &inBuf)
-+{
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::registerOutBuffers(Port port, const shared_ptr<CameraBuffer> &camBuffer)
-+{
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::runPipe(map<Port, shared_ptr<CameraBuffer> > &inBuffers,
-+                              map<Port, shared_ptr<CameraBuffer> > &outBuffers,
-+                              vector<shared_ptr<CameraBuffer> > &outStatsBuffers,
-+                              vector<EventType> &eventType)
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    CheckError((inBuffers.empty() || outBuffers.empty()), BAD_VALUE,
-+        "Error in pipe iteration input/output bufs");
-+
-+    int ret = OK;
-+    if (mPolicyManager) {
-+        // Check if need to wait other executors.
-+        ret = mPolicyManager->wait(mName);
-+    }
-+
-+    // Accept external buffers for in/out edge PGs
-+    getTerminalBuffersFromExternal(mPGExecutors.front().inputTerminals, inBuffers,
-+                                   mPGExecutors.front().inputBuffers);
-+    getTerminalBuffersFromExternal(mPGExecutors.back().outputTerminals, outBuffers,
-+                                   mPGExecutors.back().outputBuffers);
-+
-+    // Get ISP parameters
-+    const ia_binary_data *ipuParameters = nullptr;
-+    long sequence = inBuffers.begin()->second ? inBuffers.begin()->second->getSequence() : -1;
-+    if (mAdaptor) {
-+        ipuParameters = mAdaptor->getIpuParameter(sequence, mStreamId);
-+    }
-+
-+    LOG2("%s: Executor %s run with input: %zu, output: %zu, sequence: %ld",
-+         __func__, mName.c_str(), inBuffers.size(), outBuffers.size(), sequence);
-+
-+    outStatsBuffers.clear();
-+    eventType.clear();
-+    int statTotalNum = 0;
-+    for (unsigned int pgIndex = 0; pgIndex < mPGExecutors.size(); pgIndex++) {
-+        ExecutorUnit& unit = mPGExecutors[pgIndex];
-+
-+        // Prepare stats buffers for 3A/sis
-+        vector<ia_binary_data*> pgStatsDatas;
-+        // For 3A stats
-+        unsigned int statsCount = unit.statKernelUids.size();
-+        for (unsigned int counter = 0; counter < statsCount; counter++) {
-+            if (mStatsBuffers.empty()) {
-+                LOGW("No available stats buffer.");
-+                break;
-+            }
-+            outStatsBuffers.push_back(mStatsBuffers.front());
-+            eventType.push_back(EVENT_PSYS_STATS_BUF_READY);
-+            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
-+            pgStatsDatas.push_back(buffer);
-+            mStatsBuffers.pop();
-+        }
-+        unsigned int sisCount = unit.sisKernelUids.size();
-+        for (unsigned int counter = 0; counter < sisCount; counter++) {
-+            if (mStatsBuffers.empty()) {
-+                LOGW("No available stats buffer.");
-+                break;
-+            }
-+            outStatsBuffers.push_back(mStatsBuffers.front());
-+            eventType.push_back(EVENT_PSYS_STATS_SIS_BUF_READY);
-+            ia_binary_data* buffer = (ia_binary_data*)mStatsBuffers.front()->getBufferAddr();
-+            pgStatsDatas.push_back(buffer);
-+            mStatsBuffers.pop();
-+        }
-+
-+        // Run PGs
-+        ret = unit.pg->iterate(unit.inputBuffers,
-+                               unit.outputBuffers,
-+                               (statsCount > 0) ? pgStatsDatas[0] : nullptr, // Currently PG handles one stats buffer only
-+                               ipuParameters);
-+        CheckError((ret != OK), ret, "%s: error in pipe iteration with %d", mName.c_str(), ret);
-+
-+        statTotalNum += statsCount;
-+        if (sisCount > 0) {
-+            handleSisStats(unit.outputBuffers, outStatsBuffers[statTotalNum]); // Currently handle one sis output only
-+        }
-+        statTotalNum += sisCount;
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::handleSisStats(map<ia_uid, shared_ptr<CameraBuffer>>& frameBuffers, const shared_ptr<CameraBuffer> &outStatsBuffers)
-+{
-+    LOG2("%s:", __func__);
-+    ia_binary_data* statBuf = (ia_binary_data*)outStatsBuffers->getBufferAddr();
-+    CheckError((statBuf == nullptr), BAD_VALUE, "Error getting buffer for sis a stats");
-+    statBuf->data = nullptr;
-+    statBuf->size = 0;
-+
-+    for (auto iterm : frameBuffers) {
-+        ia_uid uid = iterm.first;
-+        if (uid == psys_ipu6_isa_lb_output_sis_a_uid) {
-+            statBuf->data = iterm.second->getBufferAddr();
-+            statBuf->size = iterm.second->getBufferSize();
-+            outStatsBuffers->setUserBufferInfo(-1, iterm.second->getWidth(), iterm.second->getHeight());
-+            return OK;
-+        }
-+    }
-+
-+    return UNKNOWN_ERROR;
-+}
-+
-+int PipeLiteExecutor::notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf)
-+{
-+    PERF_CAMERA_ATRACE();
-+    for (auto const& portBufferPair : outBuf) {
-+        shared_ptr<CameraBuffer> outBuf = portBufferPair.second;
-+        Port port = portBufferPair.first;
-+        // If the output buffer is nullptr, that means user doesn't request that buffer,
-+        // so it doesn't need to be handled here.
-+        if (!outBuf) continue;
-+
-+        outBuf->updateV4l2Buffer(inV4l2Buf);
-+
-+        // If it's output edge, the buffer should be returned to PSysDag,
-+        // otherwise they should be returned to its consumer.
-+        if (mIsOutputEdge) {
-+            mPSysDag->onFrameDone(port, outBuf);
-+        } else {
-+            for (auto &it : mBufferConsumerList) {
-+                it->onFrameAvailable(port, outBuf);
-+            }
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::notifyStatsDone(TuningMode tuningMode,
-+                                      const v4l2_buffer_t& inV4l2Buf,
-+                                      const vector<shared_ptr<CameraBuffer>> &outStatsBuffers,
-+                                      const vector<EventType> &eventType)
-+{
-+    PERF_CAMERA_ATRACE();
-+
-+    // The executor does not produce stats, so no need to notify.
-+    if (outStatsBuffers.empty()) return OK;
-+
-+    /**
-+     * Notice for EVENT_PSYS_STATS_BUF_READY:
-+     * dvs stat & 3a stat come from different PG, and they are decoded separately
-+     * in decodeStatsData().
-+     * Fortunately stats data are stored in aiqResultStorage separately,
-+     * and user will get them from storage instead of EventData.
-+     * So here we can send one event after all stat buffers are decoded/stored/released.
-+     */
-+    int psysStatBufferCount = 0;
-+    for (auto type : eventType) {
-+        if (type == EVENT_PSYS_STATS_BUF_READY) {
-+            psysStatBufferCount++;
-+        }
-+    }
-+
-+    int statsIndex = 0;
-+    for (auto statsBuf : outStatsBuffers) {
-+        if (!statsBuf) continue;
-+
-+        if (mStreamId == STILL_STREAM_ID) {
-+            LOG2("%s: No statistics data for still pipe in buffer", __func__);
-+            releaseStatsBuffer(statsBuf);
-+            continue;
-+        } else if (inV4l2Buf.sequence <= mLastStatsSequence) {
-+            // Ignore old statistics for Raw reprocessing
-+            LOG2("%s: new sequence %d is less than last sequence %ld", __func__,
-+                 inV4l2Buf.sequence, mLastStatsSequence);
-+            releaseStatsBuffer(statsBuf);
-+            continue;
-+        }
-+
-+        ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuf->getBufferAddr());
-+        if (hwStatsData->data == nullptr || hwStatsData->size == 0) {
-+            LOGW("%s: No statistics data in buffer", __func__);
-+            releaseStatsBuffer(statsBuf);
-+            continue;
-+        }
-+
-+        statsBuf->updateV4l2Buffer(inV4l2Buf);
-+
-+        // Decode the statistics data
-+        if (eventType[statsIndex] == EVENT_PSYS_STATS_BUF_READY) {
-+            mAdaptor->decodeStatsData(tuningMode, statsBuf, mGraphConfig);
-+            psysStatBufferCount--;
-+        }
-+
-+        // Notify listeners after all buffers done for type STATS_BUF_READY
-+        // Notify immediately for other types
-+        if (eventType[statsIndex] != EVENT_PSYS_STATS_BUF_READY
-+            || !psysStatBufferCount) {
-+            EventDataStatsReady statsReadyData;
-+            statsReadyData.sequence = statsBuf->getSequence();
-+            statsReadyData.timestamp.tv_sec = statsBuf->getTimestamp().tv_sec;
-+            statsReadyData.timestamp.tv_usec = statsBuf->getTimestamp().tv_usec;
-+            EventData eventData;
-+            eventData.type = eventType[statsIndex];
-+            eventData.buffer = statsBuf;
-+            eventData.data.statsReady = statsReadyData;
-+            notifyListeners(eventData);
-+        }
-+
-+        releaseStatsBuffer(statsBuf);
-+        statsIndex++;
-+    }
-+
-+    if (mStreamId == VIDEO_STREAM_ID && inV4l2Buf.sequence > mLastStatsSequence) {
-+        mLastStatsSequence = inV4l2Buf.sequence;
-+    }
-+
-+    return OK;
-+}
-+
-+int PipeLiteExecutor::allocBuffers()
-+{
-+    LOG1("%s executor:%s", __func__, mName.c_str());
-+
-+    releaseBuffers();
-+
-+    // Allocate buffer between PGs (internal)
-+    for (auto const& item : mTerminalsDesc) {
-+        const TerminalDescriptor& termDesc = item.second;
-+        if (!termDesc.enabled) {
-+            continue;
-+        }
-+
-+        if (termDesc.assignedPort != INVALID_PORT
-+            && !(findPGExecutor(termDesc.sinkStage) && findPGExecutor(termDesc.sourceStage))) {
-+            // Don't allocate buffer here for external connection (has valid port)
-+            continue;
-+        }
-+
-+        // Allocated already
-+        if (mPGBuffers.find(termDesc.terminal) != mPGBuffers.end()) {
-+            continue;
-+        }
-+
-+        int srcFmt = termDesc.frameDesc.mFormat;
-+        int srcWidth = termDesc.frameDesc.mWidth;
-+        int srcHeight = termDesc.frameDesc.mHeight;
-+        int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
-+        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
-+                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, srcFmt, srcWidth, srcHeight);
-+        CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
-+        mPGBuffers[termDesc.sinkTerminal] = buf;
-+        mPGBuffers[termDesc.sourceTerminal] = buf;
-+    }
-+
-+    for (auto &unit : mPGExecutors) {
-+        // Assign internal buffers for terminals of PGs according to connection
-+        for (auto &terminal : unit.inputTerminals) {
-+            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
-+                unit.inputBuffers[terminal] = mPGBuffers[terminal];
-+            }
-+        }
-+        for (auto &terminal : unit.outputTerminals) {
-+            if (mPGBuffers.find(terminal) != mPGBuffers.end()) {
-+                unit.outputBuffers[terminal] = mPGBuffers[terminal];
-+            }
-+        }
-+
-+        // Allocate stats buffers if needed.
-+        unsigned int statsBufferCount = unit.statKernelUids.size();
-+        if (!statsBufferCount) {
-+            continue;
-+        }
-+        for (unsigned int i = 0; i < MAX_BUFFER_COUNT * statsBufferCount; i++) {
-+            shared_ptr<CameraBuffer> statsBuf = CameraBuffer::create(mCameraId,
-+                         BUFFER_USAGE_PSYS_STATS, V4L2_MEMORY_USERPTR, sizeof(ia_binary_data), i);
-+            CheckError(!statsBuf, NO_MEMORY, "Executor %s: Allocate stats buffer failed", mName.c_str());
-+
-+            AutoMutex lock(mStatsBuffersLock);
-+            mStatsBuffers.push(statsBuf);
-+        }
-+    }
-+
-+    // Allocate buffers for producer executor (external)
-+    // Ignore input edge due to no producer
-+    if (!mIsInputEdge) {
-+        for (auto const& terminal : mPGExecutors.front().inputTerminals) {
-+            Port inputPort = mTerminalsDesc[terminal].assignedPort;
-+
-+            int srcFmt = mTerminalsDesc[terminal].frameDesc.mFormat;
-+            int srcWidth = mTerminalsDesc[terminal].frameDesc.mWidth;
-+            int srcHeight = mTerminalsDesc[terminal].frameDesc.mHeight;
-+            // Get frame size with aligned height taking in count for internal buffers.
-+            // To garantee PSYS kernel like GDC always get enough buffer size to process.
-+            int size = PGCommon::getFrameSize(srcFmt, srcWidth, srcHeight, true);
-+            for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
-+                // Prepare internal frame buffer for its producer.
-+                shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
-+                             BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, i, srcFmt, srcWidth, srcHeight);
-+                CheckError(!buf, NO_MEMORY, "@%s: Allocate producer buffer failed", __func__);
-+                mInternalBuffers[inputPort].push_back(buf);
-+
-+                mBufferProducer->qbuf(inputPort, buf);
-+            }
-+        }
-+    }
-+
-+    // Allocate internal output buffers to support pipe execution without user output buffer
-+    for (auto const &item : mOutputFrameInfo) {
-+        int fmt = item.second.format;
-+        int width = item.second.width;
-+        int height = item.second.height;
-+        int size = CameraUtils::getFrameSize(fmt, width, height, true);
-+        shared_ptr<CameraBuffer> buf = CameraBuffer::create(mCameraId,
-+                     BUFFER_USAGE_PSYS_INPUT, V4L2_MEMORY_USERPTR, size, 0, fmt, width, height);
-+        CheckError(!buf, NO_MEMORY, "@%s: Allocate internal output buffer failed", __func__);
-+        mInternalOutputBuffers[item.first]= buf;
-+    }
-+
-+    return OK;
-+}
-+
-+void PipeLiteExecutor::releaseBuffers()
-+{
-+    LOG1("%s executor:%s", __func__, mName.c_str());
-+
-+    // Release internel frame buffers
-+    mInternalOutputBuffers.clear();
-+    mInternalBuffers.clear();
-+    mPGBuffers.clear();
-+
-+    // Release stats buffers
-+    {
-+        AutoMutex lock(mStatsBuffersLock);
-+        while (!mStatsBuffers.empty()) mStatsBuffers.pop();
-+    }
-+}
-+
-+PipeLiteExecutor::ExecutorUnit* PipeLiteExecutor::findPGExecutor(ia_uid stageId)
-+{
-+    for (unsigned int i = 0; i < mPGExecutors.size(); i++) {
-+        if (mPGExecutors[i].stageId == stageId) {
-+            return &mPGExecutors[i];
-+        }
-+    }
-+    return nullptr;
-+}
-+
-+void PipeLiteExecutor::getTerminalPorts(const vector<ia_uid>& terminals,
-+                                        map<ia_uid, Port>& terminalPortMap) const
-+{
-+    terminalPortMap.clear();
-+    for (auto terminal : terminals) {
-+        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
-+        if (termDesc.enabled && termDesc.assignedPort != INVALID_PORT) {
-+            terminalPortMap[terminal] = termDesc.assignedPort;
-+        }
-+    }
-+}
-+
-+void PipeLiteExecutor::getTerminalFrameInfos(const vector<ia_uid>& terminals,
-+                                             map<ia_uid, FrameInfo>& infoMap) const
-+{
-+    infoMap.clear();
-+    for (auto terminal : terminals) {
-+        const TerminalDescriptor& termDesc = mTerminalsDesc.at(terminal);
-+        if (termDesc.enabled) {
-+            infoMap[terminal] = termDesc.frameDesc;
-+        }
-+    }
-+}
-+
-+void PipeLiteExecutor::getDisabledTerminalsForPG(ia_uid stageId, vector<ia_uid>& terminals) const
-+{
-+    terminals.clear();
-+    for (auto const item : mTerminalsDesc) {
-+        const TerminalDescriptor& termDesc = item.second;
-+        if (termDesc.stageId == stageId && !termDesc.enabled) {
-+            terminals.push_back(termDesc.terminal);
-+        }
-+    }
-+}
-+
-+void PipeLiteExecutor::getTerminalBuffersFromExternal(
-+        const vector<ia_uid>& terminals,
-+        const map<Port, shared_ptr<CameraBuffer> >& externals,
-+        map<ia_uid, shared_ptr<CameraBuffer> >& internals) const
-+{
-+    for (auto &terminal : terminals) {
-+        Port port = mTerminalsDesc.at(terminal).assignedPort;
-+        if (externals.find(port) != externals.end()) {
-+            internals[terminal] = externals.at(port);
-+        }
-+    }
-+}
-+
-+void PipeLiteExecutor::dumpPGs() const
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_LEVEL2)) return;
-+
-+    LOG2("============= dump PGs for executor %s =================", getName());
-+    if (mIsInputEdge) {
-+        LOG2("This is input edge");
-+    }
-+    if (mIsOutputEdge) {
-+        LOG2("This is output edge");
-+    }
-+    for (auto const &unit : mPGExecutors) {
-+        ia_uid stageId = psys_2600_pg_uid(unit.pgId);
-+        LOG2("    PG: %d: %s, stageId %d", unit.pgId, unit.pg->getName(), stageId);
-+
-+        LOG2("        InTerms: %zu", unit.inputTerminals.size());
-+        for (auto const &term : unit.inputTerminals) {
-+            shared_ptr<CameraBuffer> buffer= nullptr;
-+            if (mPGBuffers.find(term) != mPGBuffers.end()) {
-+                buffer = mPGBuffers.at(term);
-+            }
-+
-+            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
-+            if (termDesc.enabled) {
-+                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
-+                     termDesc.terminal - termDesc.stageId - 1,
-+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
-+                     termDesc.frameDesc.mFormat,
-+                     termDesc.assignedPort, buffer.get());
-+            } else {
-+                LOG2("            %d: %dx%d, 0x%x, disabled",
-+                     termDesc.terminal - termDesc.stageId - 1,
-+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
-+                     termDesc.frameDesc.mFormat);
-+            }
-+        }
-+
-+        LOG2("        OutTerms: %zu", unit.outputTerminals.size());
-+        for (auto const &term : unit.outputTerminals) {
-+            shared_ptr<CameraBuffer> buffer= nullptr;
-+            if (mPGBuffers.find(term) != mPGBuffers.end()) {
-+                buffer = mPGBuffers.at(term);
-+            }
-+
-+            const TerminalDescriptor& termDesc = mTerminalsDesc.at(term);
-+            if (termDesc.enabled) {
-+                LOG2("            %d: %dx%d, 0x%x, port %d, buf %p",
-+                     termDesc.terminal - termDesc.stageId - 1,
-+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
-+                     termDesc.frameDesc.mFormat,
-+                     termDesc.assignedPort, buffer.get());
-+            } else {
-+                LOG2("            %d: %dx%d, 0x%x, disabled",
-+                     termDesc.terminal - termDesc.stageId - 1,
-+                     termDesc.frameDesc.mWidth, termDesc.frameDesc.mHeight,
-+                     termDesc.frameDesc.mFormat);
-+            }
-+        }
-+    }
-+    LOG2("============= dump done for %s =================", getName());
-+}
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
-new file mode 100644
-index 000000000000..f6cd6df949c2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.h
-@@ -0,0 +1,193 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <vector>
-+#include <memory>
-+#include <string>
-+#include <utility> // For std::pair, std::make_pair
-+
-+#include "Parameters.h"
-+#include "CameraBuffer.h"
-+#include "BufferQueue.h"
-+#include "psysprocessor/PGCommon.h"
-+#include "PolicyManager.h"
-+#include "IspParamAdaptor.h"
-+#include "GraphConfig.h"
-+
-+namespace icamera {
-+
-+class PSysDAG;
-+
-+typedef std::map<Port, std::shared_ptr<CameraBuffer>> CameraBufferPortMap;
-+
-+class PipeLiteExecutor : public BufferQueue {
-+public:
-+    PipeLiteExecutor(int cameraId, const ExecutorPolicy &policy,
-+                     std::vector<std::string> exclusivePGs,
-+                     PSysDAG *psysDag, std::shared_ptr<IGraphConfig> gc);
-+    ~PipeLiteExecutor();
-+
-+    int start();
-+    void stop();
-+    int initPipe();
-+    void notifyStop();
-+
-+    int releaseStatsBuffer(const std::shared_ptr<CameraBuffer> &statsBuf);
-+
-+    void setStreamId(int streamId) { mStreamId = streamId; }
-+    void setIspParamAdaptor(IspParamAdaptor* adaptor) { mAdaptor = adaptor; }
-+    void setPolicyManager(PolicyManager* policyManager) { mPolicyManager = policyManager; }
-+    void setNotifyPolicy(ExecutorNotifyPolicy notifyPolicy) { mNotifyPolicy = notifyPolicy; }
-+
-+    void getOutputTerminalPorts(std::map<ia_uid, Port>& outputTerminals) const;
-+    void getInputTerminalPorts(std::map<ia_uid, Port>& terminals) const;
-+    bool hasOutputTerminal(ia_uid sinkTerminal);
-+
-+    // Link output terminals of producer to its input terminals
-+    int setInputTerminals(const std::map<ia_uid, Port>& sourceTerminals);
-+    int registerOutBuffers(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
-+    int registerInBuffers(Port port, const std::shared_ptr<CameraBuffer> &inBuf);
-+
-+    /**
-+     * Check if the two given stream configs are the same.
-+     */
-+    bool isSameStreamConfig(const stream_t& internal, const stream_t& external,
-+                            ConfigMode configMode, bool checkStreamId) const;
-+
-+    bool isInputEdge() { return mIsInputEdge; }
-+    bool isOutputEdge() { return mIsOutputEdge; }
-+
-+    const char* getName() const { return mName.c_str(); }
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PipeLiteExecutor);
-+
-+private:
-+    struct TerminalDescriptor{
-+        ia_uid terminal;
-+        ia_uid stageId;
-+
-+        ia_uid sourceTerminal;
-+        ia_uid sinkTerminal;
-+        ia_uid sourceStage;
-+        ia_uid sinkStage;
-+
-+        FrameInfo frameDesc;
-+
-+        bool enabled;
-+        bool hasConnection; // has related sink or source
-+                            // expection: sis output, sink = source
-+        Port assignedPort;  // INVALID_PORT for terminal without connection
-+        int usrStreamId;
-+    };
-+
-+    struct ExecutorUnit {
-+        // Initialized during creation/configuration
-+        int pgId;
-+        ia_uid stageId;
-+        std::shared_ptr<PGCommon> pg;
-+        std::vector<ia_uid> statKernelUids;
-+        std::vector<ia_uid> sisKernelUids;
-+
-+        // Initialized during connection analysis
-+        std::vector<ia_uid> inputTerminals; // including disabled terminals
-+        std::vector<ia_uid> outputTerminals;
-+
-+        // Initialized during buffer allocation
-+        std::map<ia_uid, std::shared_ptr<CameraBuffer>> inputBuffers;
-+        std::map<ia_uid, std::shared_ptr<CameraBuffer>> outputBuffers;
-+    };
-+
-+private:
-+    int processNewFrame();
-+    int runPipe(std::map<Port, std::shared_ptr<CameraBuffer>> &inBuffers,
-+                std::map<Port, std::shared_ptr<CameraBuffer>> &outBuffers,
-+                std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
-+                std::vector<EventType> &eventType);
-+
-+    int notifyFrameDone(const v4l2_buffer_t& inV4l2Buf, const CameraBufferPortMap& outBuf);
-+    int notifyStatsDone(TuningMode tuningMode, const v4l2_buffer_t& inV4l2Buf,
-+                        const std::vector<std::shared_ptr<CameraBuffer>> &outStatsBuffers,
-+                        const std::vector<EventType> &eventType);
-+
-+    int createPGs();
-+    int analyzeConnections(const std::vector<IGraphType::PipelineConnection>& connVector);
-+    int configurePGs();
-+    int assignDefaultPortsForTerminals();
-+    int storeTerminalInfo(const IGraphType::PipelineConnection& connection);
-+
-+    /**
-+     * Check if there is any valid buffer(not null) in the given port/buffer pairs.
-+     */
-+    bool hasValidBuffers(const CameraBufferPortMap& buffers);
-+
-+    int allocBuffers();
-+    void releaseBuffers();
-+
-+    int getStatKernels(int pgId, std::vector<ia_uid>& kernels);
-+    int getSisKernels(int pgId, std::vector<ia_uid>& kernels);
-+    ExecutorUnit* findPGExecutor(ia_uid stageId);
-+    void getDisabledTerminalsForPG(ia_uid stageId, std::vector<ia_uid>& terminals) const;
-+    void getTerminalFrameInfos(const std::vector<ia_uid>& terminals,
-+                               std::map<ia_uid, FrameInfo>& infos) const;
-+    void getTerminalPorts(const std::vector<ia_uid>& terminals,
-+                          std:: map<ia_uid, Port>& terminalPortMap) const;
-+    void getTerminalBuffersFromExternal(
-+                        const std::vector<ia_uid>& terminals,
-+                        const std::map<Port, std::shared_ptr<CameraBuffer> >& externals,
-+                        std::map<ia_uid, std::shared_ptr<CameraBuffer> >& internals) const;
-+
-+    int handleSisStats(std::map<ia_uid, std::shared_ptr<CameraBuffer>>& frameBuffers,
-+                       const std::shared_ptr<CameraBuffer> &outStatsBuffers);
-+
-+    void dumpPGs() const;
-+
-+private:
-+    int mCameraId;
-+    int mStreamId;
-+    std::string mName;
-+    std::vector<std::string> mPGNames;
-+    std::vector<int> mOpModes;
-+    std::shared_ptr<IGraphConfig> mGraphConfig;
-+    bool mIsInputEdge;
-+    bool mIsOutputEdge;
-+    ExecutorNotifyPolicy mNotifyPolicy;
-+
-+    std::vector<ExecutorUnit> mPGExecutors;
-+    IspParamAdaptor* mAdaptor;
-+
-+    PolicyManager* mPolicyManager;
-+
-+    // For internal connections (between PGs)
-+    std::map<ia_uid, std::shared_ptr<CameraBuffer> > mPGBuffers; // Buffers between PGs
-+    std::map<ia_uid, ia_uid> mConnectionMap; // <sink, source>
-+    std::map<ia_uid, TerminalDescriptor> mTerminalsDesc;
-+
-+    int64_t mLastStatsSequence;
-+    CameraBufQ mStatsBuffers;
-+    Mutex mStatsBuffersLock;
-+    std::vector<std::string> mExclusivePGs;
-+    PSysDAG *mPSysDag;
-+
-+    CameraBufferPortMap mInternalOutputBuffers;
-+    int mkernelsCountWithStats;
-+};
-+
-+typedef PipeLiteExecutor PipeExecutor;
-+}
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
-new file mode 100644
-index 000000000000..e51d012daa76
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.cpp
-@@ -0,0 +1,168 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "Camera_PolicyManager"
-+
-+#include "PolicyManager.h"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+
-+using namespace std;
-+
-+namespace icamera {
-+
-+PolicyManager::PolicyManager(int cameraId) : mCameraId(cameraId), mIsActive(false)
-+{
-+    LOG1("@%s: camera id:%d", __func__, mCameraId);
-+}
-+
-+PolicyManager::~PolicyManager()
-+{
-+    LOG1("@%s: camera id:%d", __func__, mCameraId);
-+
-+    releaseBundles();
-+}
-+
-+void PolicyManager::releaseBundles()
-+{
-+    LOG1("@%s: camera id:%d", __func__, mCameraId);
-+
-+    for (const auto& bundle : mBundles) {
-+        delete bundle;
-+    }
-+
-+    mBundles.clear();
-+}
-+
-+void PolicyManager::setActive(bool isActive)
-+{
-+    AutoMutex lock(mPolicyLock);
-+
-+    LOG1("@%s: camera id:%d update active mode from %d to %d",
-+          __func__, mCameraId, mIsActive, isActive);
-+
-+    if (mIsActive == isActive) return; // No action is needed if the mode unchanged.
-+
-+    for (auto& bundle : mBundles) {
-+        AutoMutex lock(bundle->mLock);
-+
-+        bundle->mWaitingCount = 0;
-+        bundle->mIsActive = isActive;
-+        for (auto& executorData : bundle->mExecutorData) {
-+            executorData.second.mRunCount = 0;
-+        }
-+
-+        // Wake up the executors who are waiting for other executors.
-+        if (!bundle->mIsActive) {
-+            bundle->mCondition.broadcast();
-+        }
-+    }
-+
-+    mIsActive = isActive;
-+}
-+
-+int PolicyManager::addExecutorBundle(const vector<string>& executors, const vector<int>& depths)
-+{
-+    LOG1("@%s: camera id:%d", __func__, mCameraId);
-+
-+    AutoMutex lock(mPolicyLock);
-+
-+    uint8_t size = executors.size();
-+    CheckError(size != depths.size(),
-+          BAD_VALUE, "The size for executor and its depth not match");
-+
-+    int maxDepth = 0;
-+    map<string, ExecutorData> executorData;
-+
-+    for (uint8_t i = 0; i < size; i++) {
-+        executorData[executors[i]] = ExecutorData(depths[i]);
-+        if (depths[i] > maxDepth) {
-+            maxDepth = depths[i];
-+        }
-+        LOG1("%s, bundled executor name:%s, depth:%d)", __func__, executors[i].c_str(), depths[i]);
-+    }
-+
-+    ExecutorBundle* bundle = new ExecutorBundle();
-+    bundle->mExecutorData = executorData;
-+    bundle->mExecutorNum = size;
-+    bundle->mMaxDepth = maxDepth;
-+    bundle->mWaitingCount = 0;
-+    bundle->mIsActive = true;
-+
-+    mBundles.push_back(bundle);
-+
-+    return OK;
-+}
-+
-+int PolicyManager::wait(string executorName)
-+{
-+    ExecutorBundle* bundle = nullptr;
-+    {
-+        AutoMutex lock(mPolicyLock);
-+
-+        // No need to wait when it's already inactive.
-+        if (!mIsActive) return OK;
-+
-+        for (const auto& item : mBundles) {
-+            if (item->mExecutorData.find(executorName) != item->mExecutorData.end()) {
-+                bundle = item;
-+                break;
-+            }
-+        }
-+        // If the executor not in mBundles, it means it doesn't need to wait for others.
-+        if (bundle == nullptr) return OK;
-+    }
-+
-+    ConditionLock lock(bundle->mLock);
-+
-+    // If it's already inactive, there is no need to align the executors anymore.
-+    if (!bundle->mIsActive) return OK;
-+
-+    ExecutorData& executorData = bundle->mExecutorData[executorName];
-+    executorData.mRunCount++;
-+
-+    /**
-+     * If an executor's run count plus its depth less than the max depth of all executors,
-+     * it means the executor can run without checking other executors' status, since other
-+     * may wait on this executor's output to reach the precondition of running together.
-+     */
-+    if (executorData.mRunCount + executorData.mDepth <= bundle->mMaxDepth) {
-+        return OK;
-+    }
-+
-+    bundle->mWaitingCount++;
-+
-+    /**
-+     * If waiting count less than total executor number in the bundle, it means
-+     * we need to wait for other executors to run with them together.
-+     */
-+    if (bundle->mWaitingCount < bundle->mExecutorNum) {
-+        LOG2("%s: need wait for other executors.", executorName.c_str());
-+        // the timeout value is 100ms * executor count
-+        int64_t kWaitDuration = 100000000;
-+        kWaitDuration *= bundle->mExecutorNum;
-+        int ret = bundle->mCondition.waitRelative(lock, kWaitDuration * SLOWLY_MULTIPLIER);
-+        CheckWarning(ret == TIMED_OUT, ret, "%s: wait executors timeout", executorName.c_str());
-+    } else {
-+        bundle->mWaitingCount = 0;
-+        bundle->mCondition.broadcast();
-+    }
-+
-+    return OK;
-+}
-+
-+} // end of namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
-new file mode 100644
-index 000000000000..3bef4a8421c3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PolicyManager.h
-@@ -0,0 +1,79 @@
-+/*
-+ * Copyright (C) 2017-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <map>
-+#include <vector>
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+class PolicyManager {
-+public:
-+    PolicyManager(int cameraId);
-+    ~PolicyManager();
-+
-+    /**
-+     * Create a bundle for the given set of executors, and add the bundle into mBundles.
-+     * These executors are guaranteed running at the same time.
-+     */
-+    int addExecutorBundle(const std::vector<std::string>& executors, const std::vector<int>& depths);
-+
-+    void setActive(bool isActive);
-+
-+    /**
-+     * Check whether the given executor can run or not.
-+     * If the executor cannot run then it'll wait for other executors in the same bundle.
-+     * Once all executors are ready to run, then a broadcast will be sent out to wake all
-+     * executors up and then run together.
-+     */
-+    int wait(std::string executorName);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PolicyManager);
-+
-+    void releaseBundles();
-+
-+private:
-+    struct ExecutorData {
-+        ExecutorData(int depth = 0) : mRunCount(0), mDepth(depth) {}
-+        long mRunCount; // How many times the executor has run.
-+        int mDepth;     // Indicates how many direct dependencies the executor has.
-+    };
-+
-+    struct ExecutorBundle {
-+        std::map<std::string, ExecutorData> mExecutorData; // The index of the map is executor name.
-+        int mMaxDepth;     // The max depth among all executors.
-+        int mExecutorNum;  // Indicates how many executors the bundle has.
-+        int mWaitingCount; // How many executors have already waited.
-+        bool mIsActive;
-+        //Guard for the Bundle data
-+        Mutex mLock;
-+        Condition mCondition;
-+    };
-+
-+    int mCameraId;
-+    //Guard for the PolicyManager public API
-+    Mutex mPolicyLock;
-+    std::vector<ExecutorBundle*> mBundles;
-+    bool mIsActive;
-+};
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/fd/FaceBase.h b/camera/hal/intel/ipu6/src/fd/FaceBase.h
-new file mode 100644
-index 000000000000..704090912336
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/fd/FaceBase.h
-@@ -0,0 +1,80 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#ifdef FACE_DETECTION
-+#include <pvl_config.h>
-+#include <pvl_eye_detection.h>
-+#include <pvl_face_detection.h>
-+#include <pvl_mouth_detection.h>
-+#include <pvl_types.h>
-+#endif
-+
-+namespace icamera {
-+
-+#define RECT_SIZE 4
-+#define LM_SIZE 6
-+#define MAX_STORE_FACE_DATA_BUF_NUM 3
-+
-+#define MAX_FACES_DETECTABLE 10
-+#define MAX_FACE_FRAME_WIDTH 1920
-+#define MAX_FACE_FRAME_HEIGHT 1280
-+
-+#define MAX_FACE_FRAME_SIZE (MAX_FACE_FRAME_WIDTH * MAX_FACE_FRAME_HEIGHT * 3 / 2)
-+
-+typedef enum {
-+    FD_MODE_OFF,
-+    FD_MODE_SIMPLE,  /**< Provide face area */
-+    FD_MODE_FULL,    /**< Provide face area, eye and mouth coordinates */
-+} face_detection_mode;
-+
-+/* Face Detection results */
-+typedef struct CVFaceDetectionAbstractResult {
-+    int faceNum;
-+    int faceIds[MAX_FACES_DETECTABLE];
-+    int faceLandmarks[LM_SIZE * MAX_FACES_DETECTABLE];
-+    int faceRect[RECT_SIZE * MAX_FACES_DETECTABLE];
-+    uint8_t faceScores[MAX_FACES_DETECTABLE];
-+} CVFaceDetectionAbstractResult;
-+
-+struct FaceDetectionInitParams {
-+    unsigned int max_face_num;
-+};
-+
-+#ifdef FACE_DETECTION
-+struct FaceDetectionResult {
-+    int faceNum;
-+    pvl_face_detection_result faceResults[MAX_FACES_DETECTABLE];
-+    pvl_eye_detection_result eyeResults[MAX_FACES_DETECTABLE];
-+    pvl_mouth_detection_result mouthResults[MAX_FACES_DETECTABLE];
-+};
-+
-+struct FaceDetectionRunParams {
-+    uint8_t data[MAX_FACE_FRAME_SIZE];
-+    int32_t bufferHandle;
-+    uint32_t size;
-+    int32_t width;
-+    int32_t height;
-+    pvl_image_format format;
-+    int32_t stride;
-+    int32_t rotation;
-+
-+    FaceDetectionResult results;
-+};
-+#endif
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
-new file mode 100644
-index 000000000000..34d45379484d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
-@@ -0,0 +1,529 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "FaceDetection"
-+#include "src/fd/FaceDetection.h"
-+
-+#include <algorithm>
-+#include <fstream>
-+
-+#include "AiqUtils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+std::unordered_map<int, FaceDetection*> FaceDetection::sInstances;
-+Mutex FaceDetection::sLock;
-+FaceDetection *FaceDetection::getInstance(int cameraId) {
-+    LOG1("@%s, cameraId:%d", __func__, cameraId);
-+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
-+               nullptr, "cameraId %d is error", cameraId);
-+
-+    if (sInstances.find(cameraId) == sInstances.end()) {
-+        return nullptr;
-+    }
-+
-+    return sInstances[cameraId];
-+}
-+
-+FaceDetection *FaceDetection::createInstance(int cameraId,
-+                                             unsigned int maxFaceNum, int32_t halStreamId) {
-+    LOG1("@%s, cameraId:%d, maxFaceNum:%u, halStreamId:%u",
-+         __func__, cameraId, maxFaceNum, halStreamId);
-+    CheckError(maxFaceNum > MAX_FACES_DETECTABLE, nullptr,
-+               "maxFaceNum %d is error", maxFaceNum);
-+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
-+               nullptr, "cameraId %d is error", cameraId);
-+
-+    AutoMutex lock(sLock);
-+    if (sInstances.find(cameraId) == sInstances.end()) {
-+        sInstances[cameraId] = new FaceDetection(cameraId, maxFaceNum, halStreamId);
-+    }
-+
-+    return sInstances[cameraId];
-+}
-+
-+void FaceDetection::destoryInstance(int cameraId) {
-+    LOG1("@%s, cameraId:%d", __func__, cameraId);
-+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
-+               VOID_VALUE, "cameraId is error");
-+
-+    AutoMutex lock(sLock);
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        delete sInstances[cameraId];
-+        sInstances.erase(cameraId);
-+    }
-+}
-+
-+FaceDetection::FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId) :
-+    mCameraId(cameraId),
-+    mInitialized(false),
-+    mHalStreamId(halStreamId),
-+    mWidth(0),
-+    mHeight(0) {
-+    LOG1("@%s, cameraId:%d, maxFaceNum:%d", __func__, cameraId, maxFaceNum);
-+    CLEAR(mResult);
-+
-+    /* TODO: we should add CameraOrientationDetector to change the camera orientation */
-+    camera_info_t info;
-+    PlatformData::getCameraInfo(mCameraId, info);
-+    mSensorOrientation = info.orientation;
-+
-+    /* start face engine pthread */
-+    int ret = run("FaceDetection" + std::to_string(cameraId), PRIORITY_NORMAL);
-+    CheckError(ret != OK, VOID_VALUE, "Camera thread failed to start, ret %d", ret);
-+
-+    /* init IntelFaceDetection */
-+    FaceDetectionInitParams params;
-+    params.max_face_num = maxFaceNum;
-+    mFace = std::unique_ptr<IntelFaceDetection>(new IntelFaceDetection());
-+    ret = mFace->init(&params, sizeof(FaceDetectionInitParams));
-+    CheckError(ret != OK, VOID_VALUE, "mFace.init fails, ret %d", ret);
-+
-+    for (int i = 0; i < MAX_STORE_FACE_DATA_BUF_NUM; i++) {
-+        FaceDetectionRunParams *memRunBuf = mFace->prepareRunBuffer(i);
-+        CheckError(!memRunBuf, VOID_VALUE, "prepareRunBuffer fails");
-+        mMemRunPool.push(memRunBuf);
-+    }
-+
-+    mInitialized = true;
-+}
-+
-+FaceDetection::~FaceDetection() {
-+    LOG1("@%s", __func__);
-+    mFace->deinit();
-+    requestExit();
-+
-+    AutoMutex l(mRunBufQueueLock);
-+    mRunCondition.notify_one();
-+}
-+
-+FaceDetectionRunParams *FaceDetection::acquireRunBuf() {
-+    AutoMutex l(mMemRunPoolLock);
-+    LOG2("@%s, mRunPool.size is %zu", __func__, mMemRunPool.size());
-+
-+    FaceDetectionRunParams *runBuffer = nullptr;
-+    if (!mMemRunPool.empty()) {
-+        runBuffer = mMemRunPool.front();
-+        mMemRunPool.pop();
-+        CLEAR(*runBuffer);
-+    }
-+    return runBuffer;
-+}
-+
-+void FaceDetection::returnRunBuf(FaceDetectionRunParams *memRunBuf) {
-+    LOG2("@%s, Push back run face engine buffer", __func__);
-+
-+    AutoMutex l(mMemRunPoolLock);
-+    mMemRunPool.push(memRunBuf);
-+}
-+
-+void FaceDetection::runFaceDetection(const camera_buffer_t &buffer) {
-+    LOG1("@%s", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
-+
-+    if (PlatformData::isFaceEngineSyncRunning(mCameraId)) {
-+        runFaceDetectionBySync(buffer);
-+    } else {
-+        runFaceDetectionByAsync(buffer);
-+    }
-+}
-+
-+void FaceDetection::runFaceDetectionBySync(const camera_buffer_t &buffer) {
-+    LOG1("@%s", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
-+
-+    int size = buffer.s.size;
-+    int width = buffer.s.width;
-+    int height = buffer.s.height;
-+    CheckError(size > MAX_FACE_FRAME_SIZE, VOID_VALUE,
-+               "face frame buffer is too small!, w:%d,h:%d,size:%d", width, height, size);
-+
-+    FaceDetectionRunParams *params = acquireRunBuf();
-+    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
-+
-+    params->size = size;
-+    params->width = width;
-+    params->height = height;
-+    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
-+    params->rotation = mSensorOrientation % 360;
-+    params->format = pvl_image_format_nv12;
-+    params->stride = buffer.s.stride;
-+    params->bufferHandle = -1;
-+
-+    nsecs_t startTime = CameraUtils::systemTime();
-+
-+#ifdef ENABLE_SANDBOXING
-+    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.dmafd);
-+#else
-+    int ret = mFace->run(params, sizeof(FaceDetectionRunParams), buffer.addr);
-+#endif
-+
-+    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
-+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
-+
-+    {
-+        AutoMutex l(mFaceResultLock);
-+        if (ret == OK) {
-+            mResult = params->results;
-+        } else {
-+            CLEAR(mResult);
-+        }
-+    }
-+
-+    returnRunBuf(params);
-+}
-+
-+void FaceDetection::runFaceDetectionByAsync(const camera_buffer_t &buffer) {
-+    LOG1("@%s", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
-+
-+    int size = buffer.s.size;
-+    mWidth = buffer.s.width;
-+    mHeight = buffer.s.height;
-+    CheckError(size > MAX_FACE_FRAME_SIZE, VOID_VALUE,
-+               "face frame buffer is too small!, w:%d,h:%d,size:%d", mWidth, mHeight, size);
-+
-+    FaceDetectionRunParams *params = acquireRunBuf();
-+    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
-+
-+    params->size = size;
-+    MEMCPY_S(params->data, MAX_FACE_FRAME_SIZE, buffer.addr, size);
-+    params->width = mWidth;
-+    params->height = mHeight;
-+    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
-+    params->rotation = mSensorOrientation % 360;
-+    params->format = pvl_image_format_nv12;
-+    params->stride = buffer.s.stride;
-+    params->bufferHandle = -1;
-+
-+    AutoMutex l(mRunBufQueueLock);
-+    mRunBufQueue.push(params);
-+    mRunCondition.notify_one();
-+}
-+
-+bool FaceDetection::threadLoop() {
-+    LOG1("@%s", __func__);
-+
-+    FaceDetectionRunParams *faceParams = nullptr;
-+
-+    {
-+        ConditionLock lock(mRunBufQueueLock);
-+        if (mRunBufQueue.empty()) {
-+            std::cv_status ret = mRunCondition.wait_for(
-+                                     lock,
-+                                     std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
-+            if (ret == std::cv_status::timeout) {
-+                LOGW("@%s, wait request time out", __func__);
-+            }
-+
-+            return true;
-+        }
-+        faceParams = mRunBufQueue.front();
-+        mRunBufQueue.pop();
-+    }
-+
-+    nsecs_t startTime = CameraUtils::systemTime();
-+
-+    int ret = mFace->run(faceParams, sizeof(FaceDetectionRunParams));
-+    LOG2("@%s: ret:%d, it takes need %ums", __func__, ret,
-+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
-+
-+    {
-+        AutoMutex l(mFaceResultLock);
-+        if (ret == OK) {
-+            mResult = faceParams->results;
-+        } else {
-+            CLEAR(mResult);
-+        }
-+    }
-+
-+    returnRunBuf(faceParams);
-+    return true;
-+}
-+
-+int FaceDetection::getFaceNum() {
-+    LOG2("@%s", __func__);
-+    CheckError(mInitialized == false, 0, "mInitialized is false");
-+
-+    AutoMutex l(mFaceResultLock);
-+    return mResult.faceNum;
-+}
-+
-+/* The result is pvl's original reuslt */
-+int FaceDetection::getFaceDetectionResult(FaceDetectionResult *result) {
-+    LOG1("@%s", __func__);
-+    CheckError(mInitialized == false, UNKNOWN_ERROR, "mInitialized is false");
-+    CheckError(!result, UNKNOWN_ERROR, "mResult is nullptr");
-+
-+    AutoMutex l(mFaceResultLock);
-+    MEMCPY_S(result, sizeof(FaceDetectionResult), &mResult, sizeof(FaceDetectionResult));
-+    return OK;
-+}
-+
-+/* Get current frame width and hight */
-+void FaceDetection::getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth) {
-+    LOG2("@%s", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
-+    CheckError(!frameWidth || !frameHigth, VOID_VALUE, "input paramter is error");
-+
-+    *frameWidth = mWidth;
-+    *frameHigth = mHeight;
-+}
-+
-+/* Get current hal stream id */
-+void FaceDetection::getHalStreamId(int32_t *halStreamId) {
-+    LOG2("@%s", __func__);
-+    CheckError(mInitialized == false, VOID_VALUE, "mInitialized is false");
-+    CheckError(!halStreamId, VOID_VALUE, "halStreamId is nullptr");
-+
-+    *halStreamId = mHalStreamId;
-+}
-+
-+/* The result for 3A AE */
-+int FaceDetection::getResult(int cameraId, ia_atbx_face_state *faceState) {
-+    LOG1("@%s", __func__);
-+    CheckError(!faceState, UNKNOWN_ERROR, "faceState is nullptr");
-+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
-+               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
-+
-+    int width = 0;
-+    int height = 0;
-+    int32_t halStreamId = 0;
-+
-+    FaceDetectionResult faceDetectionResult;
-+    {
-+        AutoMutex lock(sLock);
-+        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
-+        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
-+
-+        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
-+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result, ret %d", ret);
-+        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
-+        fdInstance->getHalStreamId(&halStreamId);
-+    }
-+
-+    /*
-+    face rectangle from face lib: (Ln, Tn, Rn, Bn)
-+    3A statistics Surface: ((IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT) *
-+                            (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP))
-+    target coordinate of face rectangle to the 3A lib: (LL, TT, RR, BB)
-+    FOV ratio (which is <= 1): (fovRatioW * fovRatioH)
-+
-+    formular:
-+    LL = Ln * fovRatioW + (1 - fovRatioW) / 2 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT)
-+    TT = Tn * fovRatioH + (1 - fovRatioH) / 2 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP)
-+    RR and BB are the similar.
-+    */
-+
-+    float fovRatioW = 1;
-+    float fovRatioH = 1;
-+    int ret = PlatformData::getScalerInfo(cameraId, halStreamId, &fovRatioW, &fovRatioH);
-+    LOG2("@%s, getScalerInfo ret:%d, fovRatioW:%f, fovRatioH:%f",
-+         __func__, ret, fovRatioW, fovRatioH);
-+
-+    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
-+    float fovRatioWTmp = width / ((activePixelArray.right - activePixelArray.left) * fovRatioW);
-+    float fovRatioHTmp = height / ((activePixelArray.bottom - activePixelArray.top) * fovRatioH);
-+    float offsetW = (1.0 - fovRatioWTmp) / 2.0 * (IA_COORDINATE_RIGHT - IA_COORDINATE_LEFT);
-+    float offsetH = (1.0 - fovRatioHTmp) / 2.0 * (IA_COORDINATE_BOTTOM - IA_COORDINATE_TOP);
-+
-+    LOG1("@%s, faceNum:%d, mHeight:%d, mWidth:%d", __func__,
-+         faceDetectionResult.faceNum, height, width);
-+
-+    faceState->num_faces = faceDetectionResult.faceNum;
-+
-+    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
-+        CLEAR(faceState->faces[i]);
-+        faceState->faces[i].face_area.left =
-+         static_cast<int>(faceDetectionResult.faceResults[i].rect.left * fovRatioWTmp + offsetW);
-+        faceState->faces[i].face_area.top =
-+         static_cast<int>(faceDetectionResult.faceResults[i].rect.top * fovRatioHTmp + offsetH);
-+        faceState->faces[i].face_area.bottom =
-+         static_cast<int>(
-+                         faceDetectionResult.faceResults[i].rect.bottom * fovRatioHTmp + offsetH);
-+        faceState->faces[i].face_area.right =
-+         static_cast<int>(
-+                          faceDetectionResult.faceResults[i].rect.right * fovRatioWTmp + offsetW);
-+        faceState->faces[i].rip_angle = faceDetectionResult.faceResults[i].rip_angle;
-+        faceState->faces[i].rop_angle = faceDetectionResult.faceResults[i].rop_angle;
-+        faceState->faces[i].tracking_id = faceDetectionResult.faceResults[i].tracking_id;
-+        faceState->faces[i].confidence = faceDetectionResult.faceResults[i].confidence;
-+        faceState->faces[i].person_id = -1;
-+        faceState->faces[i].similarity = 0;
-+        faceState->faces[i].best_ratio = 0;
-+        faceState->faces[i].face_condition = 0;
-+
-+        faceState->faces[i].smile_state = 0;
-+        faceState->faces[i].smile_score = 0;
-+        faceState->faces[i].mouth.x =
-+          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.x * fovRatioWTmp + offsetW);
-+         faceState->faces[i].mouth.y =
-+          static_cast<int>(faceDetectionResult.mouthResults[i].mouth.y * fovRatioHTmp + offsetH);
-+
-+        faceState->faces[i].eye_validity = 0;
-+    }
-+
-+    return OK;
-+}
-+
-+/* The result for android statistics metadata */
-+int FaceDetection::getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
-+    LOG1("@%s", __func__);
-+    CheckError(!result, UNKNOWN_ERROR, "result is nullptr");
-+    CheckError(cameraId < 0 || cameraId >= PlatformData::numberOfCameras(),
-+               UNKNOWN_ERROR, "cameraId %d is error", cameraId);
-+
-+    int width = 0;
-+    int height = 0;
-+    FaceDetectionResult faceDetectionResult;
-+    {
-+        AutoMutex lock(sLock);
-+        FaceDetection *fdInstance = FaceDetection::getInstance(cameraId);
-+        CheckError(!fdInstance, UNKNOWN_ERROR, "Failed to get instance");
-+
-+        int ret = fdInstance->getFaceDetectionResult(&faceDetectionResult);
-+        CheckError(ret != OK, UNKNOWN_ERROR, "Failed to get result");
-+        fdInstance->getCurrentFrameWidthAndHight(&width, &height);
-+    }
-+
-+    const camera_coordinate_system_t iaCoord = {IA_COORDINATE_LEFT, IA_COORDINATE_TOP,
-+                                                IA_COORDINATE_RIGHT, IA_COORDINATE_BOTTOM};
-+
-+    // construct android coordinate based on active pixel array
-+    camera_coordinate_system_t activePixelArray = PlatformData::getActivePixelArray(cameraId);
-+
-+    int activeHeight = activePixelArray.bottom - activePixelArray.top;
-+    int activeWidth = activePixelArray.right - activePixelArray.left;
-+    const camera_coordinate_system_t sysCoord = {0, 0,  activeWidth, activeHeight};
-+    camera_coordinate_t srcCoord = {0, 0};
-+    camera_coordinate_t destCoord = {0, 0};
-+
-+    int verticalCrop = 0, horizontalCrop = 0;
-+    bool imageRotationUnchanged = true;
-+
-+    // do extra conversion if the image ratio is not the same ratio with the android coordinate.
-+    if (height * activeWidth != width * activeHeight) {
-+        imageRotationUnchanged = false;
-+        int gap = (width * activeHeight / activeWidth) - height;
-+
-+        if (gap > 0) {
-+            // vertical crop pixel
-+            verticalCrop = gap;
-+        } else if (gap < 0) {
-+            // horizontal crop pixel
-+            horizontalCrop = height * activeWidth / activeHeight - width;
-+        }
-+    }
-+
-+    const camera_coordinate_system_t fillFrameCoord = {0, 0,
-+                                                       width + horizontalCrop,
-+                                                       height + verticalCrop};
-+    const camera_coordinate_system_t frameCoord = {0, 0, width, height};
-+
-+    CLEAR(*result);
-+    for (int i = 0; i < faceDetectionResult.faceNum; i++) {
-+        if (i == MAX_FACES_DETECTABLE)
-+            break;
-+
-+        camera_coordinate_t pointCoord = {0, 0};
-+        result->faceScores[i] = faceDetectionResult.faceResults[i].confidence;
-+        result->faceIds[i] = faceDetectionResult.faceResults[i].tracking_id;
-+
-+        if (imageRotationUnchanged) {
-+            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
-+                        faceDetectionResult.faceResults[i].rect.top};
-+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
-+            result->faceRect[i * 4] = destCoord.x;  // rect.left
-+            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
-+
-+            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
-+                        faceDetectionResult.faceResults[i].rect.bottom};
-+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
-+            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
-+            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
-+
-+            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
-+                        faceDetectionResult.eyeResults[i].left_eye.y};
-+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
-+            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
-+            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
-+
-+            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
-+                        faceDetectionResult.eyeResults[i].right_eye.y};
-+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
-+            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
-+            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
-+
-+            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
-+                        faceDetectionResult.mouthResults[i].mouth.y};
-+            destCoord = AiqUtils::convertCoordinateSystem(iaCoord, sysCoord, srcCoord);
-+            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
-+            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
-+        } else {
-+            srcCoord = {faceDetectionResult.faceResults[i].rect.left,
-+                        faceDetectionResult.faceResults[i].rect.top};
-+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
-+            pointCoord.x += horizontalCrop / 2;
-+            pointCoord.y += verticalCrop / 2;
-+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
-+            result->faceRect[i * 4] = destCoord.x;  // rect.left
-+            result->faceRect[i * 4 + 1] = destCoord.y;  // rect.top
-+
-+            srcCoord = {faceDetectionResult.faceResults[i].rect.right,
-+                        faceDetectionResult.faceResults[i].rect.bottom};
-+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
-+            pointCoord.x += horizontalCrop / 2;
-+            pointCoord.y += verticalCrop / 2;
-+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
-+            result->faceRect[i * 4 + 2] = destCoord.x;  // rect.right
-+            result->faceRect[i * 4 + 3] = destCoord.y;  // rect.bottom
-+
-+            srcCoord = {faceDetectionResult.eyeResults[i].left_eye.x,
-+                        faceDetectionResult.eyeResults[i].left_eye.y};
-+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
-+            pointCoord.x += horizontalCrop / 2;
-+            pointCoord.y += verticalCrop / 2;
-+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
-+            result->faceLandmarks[i * 6] = destCoord.x;  // left_eye.x;
-+            result->faceLandmarks[i * 6 + 1] = destCoord.y;  // left_eye.y;
-+
-+            srcCoord = {faceDetectionResult.eyeResults[i].right_eye.x,
-+                        faceDetectionResult.eyeResults[i].right_eye.y};
-+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
-+            pointCoord.x += horizontalCrop / 2;
-+            pointCoord.y += verticalCrop / 2;
-+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
-+            result->faceLandmarks[i * 6 + 2] = destCoord.x;  // right_eye.x;
-+            result->faceLandmarks[i * 6 + 3] = destCoord.y;  // right_eye.y;
-+
-+            srcCoord = {faceDetectionResult.mouthResults[i].mouth.x,
-+                        faceDetectionResult.mouthResults[i].mouth.y};
-+            pointCoord = AiqUtils::convertCoordinateSystem(iaCoord, frameCoord, srcCoord);
-+            pointCoord.x += horizontalCrop / 2;
-+            pointCoord.y += verticalCrop / 2;
-+            destCoord = AiqUtils::convertCoordinateSystem(fillFrameCoord, sysCoord, pointCoord);
-+            result->faceLandmarks[i * 6 + 4] = destCoord.x;  // mouth.x;
-+            result->faceLandmarks[i * 6 + 5] = destCoord.y;  // mouth.y;
-+        }
-+    }
-+    result->faceNum = (faceDetectionResult.faceNum < MAX_FACES_DETECTABLE ?
-+                       faceDetectionResult.faceNum : MAX_FACES_DETECTABLE);
-+    return OK;
-+}
-+}  // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/fd/FaceDetection.h b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
-new file mode 100644
-index 000000000000..958359409728
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#ifdef FACE_DETECTION
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelFaceDetection.h"
-+#else
-+#include "modules/algowrapper/IntelFaceDetection.h"
-+#endif
-+#include "iutils/Errors.h"
-+#include "iutils/Thread.h"
-+#endif
-+
-+#include <ia_types.h>
-+#include <unordered_map>
-+#include <memory>
-+#include <queue>
-+
-+#include "iutils/Utils.h"
-+#include "Parameters.h"
-+#include "FaceBase.h"
-+
-+namespace icamera {
-+
-+#ifdef FACE_DETECTION
-+class FaceDetection : public Thread {
-+ public:
-+    FaceDetection(int cameraId, unsigned int maxFaceNum, int32_t halStreamId);
-+    ~FaceDetection();
-+
-+    static FaceDetection *createInstance(int cameraId,
-+                                         unsigned int maxFaceNum, int32_t halStreamId);
-+    static void destoryInstance(int cameraId);
-+    static FaceDetection *getInstance(int cameraId);
-+
-+    void runFaceDetection(const camera_buffer_t &buffer);
-+    void runFaceDetectionBySync(const camera_buffer_t &buffer);
-+    void runFaceDetectionByAsync(const camera_buffer_t &buffer);
-+    int getFaceNum();
-+    virtual bool threadLoop();
-+    static int getResult(int cameraId, ia_atbx_face_state *faceState);
-+    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result);
-+
-+ private:
-+    int getFaceDetectionResult(FaceDetectionResult *mResult);
-+    FaceDetectionRunParams *acquireRunBuf();
-+    void returnRunBuf(FaceDetectionRunParams *memRunBuf);
-+    void getCurrentFrameWidthAndHight(int *frameWidth, int *frameHigth);
-+    void getHalStreamId(int32_t *halStreamId);
-+
-+    // Guard for face engine instance
-+    static Mutex sLock;
-+    static std::unordered_map<int, FaceDetection*> sInstances;
-+
-+    int mCameraId;
-+    bool mInitialized;
-+
-+    // Guard for face detection result
-+    std::mutex mFaceResultLock;
-+    FaceDetectionResult mResult;
-+
-+    std::unique_ptr<IntelFaceDetection> mFace;
-+
-+    std::condition_variable mRunCondition;
-+    // Guard for running buffer queue of thread
-+    std::mutex mRunBufQueueLock;
-+    std::queue<FaceDetectionRunParams *> mRunBufQueue;
-+    const uint64_t kMaxDuration = 2000000000;  // 2000ms
-+
-+    // Guard for running buffer pool of face engine
-+    std::mutex mMemRunPoolLock;
-+    std::queue<FaceDetectionRunParams *> mMemRunPool;
-+
-+    int mSensorOrientation;
-+
-+    int32_t mHalStreamId;
-+    int mWidth;
-+    int mHeight;
-+
-+    DISALLOW_COPY_AND_ASSIGN(FaceDetection);
-+};
-+#else
-+class FaceDetection {
-+ public:
-+    static int getResult(int cameraId, ia_atbx_face_state *faceState) {
-+        faceState->num_faces = 0;
-+        return 0;
-+    }
-+    static int getResult(int cameraId, CVFaceDetectionAbstractResult *result) {
-+        CLEAR(*result);
-+        return 0;
-+    }
-+    static FaceDetection *createInstance(int cameraId,
-+                                         unsigned int maxFaceNum, int32_t halStreamId) {
-+        return nullptr;
-+    }
-+    static void destoryInstance(int cameraId) {}
-+    void runFaceDetection(const camera_buffer_t &buffer) {}
-+    int getFaceNum() {return 0;}
-+};
-+#endif
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.cpp b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
-new file mode 100644
-index 000000000000..35e5269eb520
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/hal/CameraHal.cpp
-@@ -0,0 +1,270 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraHal"
-+
-+#include <vector>
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "ICamera.h"
-+#include "PlatformData.h"
-+#include "SyncManager.h"
-+#include "CameraHal.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+#define checkCameraDevice(device, err_code) \
-+    do { \
-+        if (mState == HAL_UNINIT) { \
-+            LOGE("HAL is not init."); \
-+            return err_code; \
-+        } \
-+        if (!(device)) { \
-+            LOGE("device is not open."); \
-+            return err_code; \
-+        } \
-+    } while (0)
-+
-+CameraHal::CameraHal() :
-+    mInitTimes(0),
-+    mState(HAL_UNINIT)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s", __func__);
-+
-+    CLEAR(mCameraDevices);
-+}
-+
-+CameraHal::~CameraHal()
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s", __func__);
-+    SyncManager::releaseInstance();
-+    PlatformData::releaseInstance();
-+}
-+
-+int CameraHal::init()
-+{
-+    LOG1("@%s", __func__);
-+    AutoMutex lock(mLock);
-+
-+    if (mInitTimes++ > 0) {
-+        LOGD("@%s, mInitTimes:%d, return without running", __func__, mInitTimes);
-+        return OK;
-+    }
-+
-+    MediaControl::getInstance()->initEntities();
-+
-+    mState = HAL_INIT;
-+
-+    return OK;
-+}
-+
-+int CameraHal::deinit()
-+{
-+    LOG1("@%s", __func__);
-+    AutoMutex l(mLock);
-+
-+    if (--mInitTimes > 0) {
-+        LOGD("@%s, mInitTimes:%d, return without set state", __func__, mInitTimes);
-+        return OK;
-+    }
-+
-+    MediaControl::getInstance()->clearEntities();
-+
-+    // Because there are many static variables in singleton,
-+    // so we have to release them before exiting the main function.
-+    // Will remove the static variables and singleton in the future.
-+    SyncManager::releaseInstance();
-+    PlatformData::releaseInstance();
-+
-+    mState = HAL_UNINIT;
-+
-+    return OK;
-+}
-+
-+int CameraHal::deviceOpen(int cameraId)
-+{
-+    LOG1("@%s, camera id:%d", __func__, cameraId);
-+    PERF_CAMERA_ATRACE();
-+
-+    AutoMutex l(mLock);
-+    CheckError(mState == HAL_UNINIT, NO_INIT,"HAL is not initialized");
-+
-+    //Create the camera device that will be freed in close
-+    if (mCameraDevices[cameraId]) {
-+        LOGD("@%s: open multi times", __func__);
-+        return INVALID_OPERATION;
-+    }
-+
-+    mCameraOpenNum++;
-+    mCameraDevices[cameraId] = new CameraDevice(cameraId);
-+
-+    if (mCameraOpenNum == 1) {
-+        MediaControl::getInstance()->resetAllLinks();
-+    }
-+
-+    return mCameraDevices[cameraId]->init();
-+}
-+
-+void CameraHal::deviceClose(int cameraId)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, camera id:%d", __func__, cameraId);
-+    AutoMutex l(mLock);
-+
-+    if (mCameraDevices[cameraId]) {
-+        mCameraDevices[cameraId]->deinit();
-+        delete mCameraDevices[cameraId];
-+        mCameraDevices[cameraId] = nullptr;
-+
-+        mCameraOpenNum--;
-+    }
-+}
-+
-+void CameraHal::deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback)
-+{
-+    LOG1("@%s", __func__);
-+    AutoMutex l(mLock);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, VOID_VALUE);
-+#ifdef ENABLE_SANDBOXING
-+    PlatformData::getIntelAlgoClient()->registerErrorCallback(callback);
-+#endif
-+    device->callbackRegister(callback);
-+}
-+
-+// Assume the inputConfig is already checked in upper layer
-+int CameraHal::deviceConfigInput(int cameraId, const stream_t *inputConfig)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, camera id:%d", __func__, cameraId);
-+    AutoMutex lock(mLock);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    device->configureInput(inputConfig);
-+
-+    return OK;
-+}
-+
-+// Assume the streamList is already checked in upper layer
-+int CameraHal::deviceConfigStreams(int cameraId, stream_config_t *streamList)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, camera id:%d", __func__, cameraId);
-+    AutoMutex lock(mLock);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    int ret = device->configure(streamList);
-+    if (ret != OK) {
-+        LOGE("failed to config streams.");
-+        return INVALID_OPERATION;
-+    }
-+
-+    return ret;
-+}
-+
-+int CameraHal::deviceStart(int cameraId)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, cameraId is %d", __func__, cameraId);
-+
-+    ConditionLock lock(mLock);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->start();
-+}
-+
-+int CameraHal::deviceStop(int cameraId)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, cameraId is %d", __func__, cameraId);
-+
-+    AutoMutex lock(mLock);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->stop();
-+}
-+
-+int CameraHal::deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG1("@%s, cameraId is %d", __func__, cameraId);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->allocateMemory(ubuffer);
-+}
-+
-+int CameraHal::streamQbuf(int cameraId, camera_buffer_t **ubuffer,
-+                          int bufferNum, const Parameters* settings)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG2("@%s, cameraId is %d, fd:%d", __func__, cameraId, (*ubuffer)->dmafd);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->qbuf(ubuffer, bufferNum, settings);
-+}
-+
-+int CameraHal::streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
-+                           Parameters* settings)
-+{
-+    PERF_CAMERA_ATRACE();
-+    LOG2("@%s, cameraId is %d, streamId is %d", __func__, cameraId, streamId);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->dqbuf(streamId, ubuffer, settings);
-+}
-+
-+int CameraHal::getParameters(int cameraId, Parameters& param)
-+{
-+    LOG1("@%s, cameraId is %d", __func__, cameraId);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->getParameters(param);
-+}
-+
-+int CameraHal::setParameters(int cameraId, const Parameters& param)
-+{
-+    LOG1("@%s, cameraId is %d", __func__, cameraId);
-+
-+    CameraDevice *device = mCameraDevices[cameraId];
-+    checkCameraDevice(device, BAD_VALUE);
-+
-+    return device->setParameters(param);
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/hal/CameraHal.h b/camera/hal/intel/ipu6/src/hal/CameraHal.h
-new file mode 100644
-index 000000000000..512e337db16e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/hal/CameraHal.h
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "CameraDevice.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+/**
-+ * CameraHal class is the real HAL API.
-+ * There is only one instance of CameraHal which is created when HAL loading
-+ * It creates the CameraDevice based on the camera ID to support multi-cameras.
-+ *
-+ * The main job of the Class is
-+ * 1. Maintain a list of CameraDevice
-+ * 2. Pass the Camera HAL API to the correct CameraDevice based on CameraId
-+ *
-+ * If open dual cameras in different process, the shared memory must be used to
-+ * keep the account of the open times.
-+ *
-+ * The CameraHal create and maintains followings singleton instancs
-+ * 1. MediaControl Instance
-+ * 2. PlatformData Instance
-+ */
-+
-+class CameraHal {
-+//HAL API
-+public:
-+    CameraHal();
-+    ~CameraHal();
-+    int init();
-+    int deinit();
-+
-+//Device API
-+public:
-+    int deviceOpen(int cameraId);
-+    void deviceClose(int cameraId);
-+
-+    void deviceCallbackRegister(int cameraId, const camera_callback_ops_t* callback);
-+    int deviceConfigInput(int cameraId, const stream_t *inputConfig);
-+    int deviceConfigStreams(int cameraId, stream_config_t *streamList);
-+    int deviceStart(int cameraId);
-+    int deviceStop(int cameraId);
-+    int deviceAllocateMemory(int cameraId, camera_buffer_t *ubuffer);
-+//Stream API
-+    int streamQbuf(int cameraId, camera_buffer_t **ubuffer,
-+                   int bufferNum = 1, const Parameters* settings = nullptr);
-+    int streamDqbuf(int cameraId, int streamId, camera_buffer_t **ubuffer,
-+                    Parameters* settings = nullptr);
-+    int setParameters(int cameraId, const Parameters& param);
-+    int getParameters(int cameraId, Parameters& param);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CameraHal);
-+
-+private:
-+    CameraDevice* mCameraDevices[MAX_CAMERA_NUMBER];
-+    int mInitTimes;
-+    // Guard for CameraHal public API.
-+    Mutex mLock;
-+
-+    enum {
-+        HAL_UNINIT,
-+        HAL_INIT
-+    } mState;
-+
-+    int mCameraOpenNum = 0;
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/hal/ICamera.cpp b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
-new file mode 100644
-index 000000000000..56bbd55058f1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/hal/ICamera.cpp
-@@ -0,0 +1,374 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ICamera"
-+
-+#include "iutils/CameraDump.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "ICamera.h"
-+#include "CameraHal.h"
-+#include "PlatformData.h"
-+
-+/**
-+ * This is the wrapper to the CameraHal Class to provide the HAL interface
-+ * Main job of this file
-+ * 1. Check the argument from user
-+ * 2. Transfer HAL API to CameraHal class
-+ * 3. Implement the HAL static function: get_number_of_cameras and get_camera_info
-+ */
-+namespace icamera {
-+
-+static CameraHal * gCameraHal = nullptr;
-+
-+#define CheckCameraId(camera_id, err_code) \
-+    do { \
-+        int max_cam = PlatformData::numberOfCameras(); \
-+        if (((camera_id) < 0) || (camera_id) >= max_cam) { \
-+            LOGE("camera index(%d) is invaild., max_cam:%d", camera_id, max_cam); \
-+            return err_code; \
-+        } \
-+    } while (0)
-+
-+/**
-+ * Return the numbers of camera
-+ * This should be called before any other calls
-+ *
-+ * \return > 0  return camera numbers
-+ * \return == 0 failed to get camera numbers
-+ **/
-+int get_number_of_cameras()
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    return PlatformData::numberOfCameras();
-+}
-+
-+/**
-+ * Get capability related camera info.
-+ * Should be called after get_number_of_cameras
-+ *
-+ * \return error code
-+ */
-+int get_camera_info(int camera_id, camera_info_t& info)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    int ret = PlatformData::getCameraInfo(camera_id, info);
-+
-+    return ret;
-+}
-+
-+/**
-+ * Initialize camera hal
-+ *
-+ * \return error code
-+ **/
-+int camera_hal_init()
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    return gCameraHal->init();
-+}
-+
-+/**
-+ * De-initialize camera hal
-+ *
-+ * \return error code
-+ **/
-+int camera_hal_deinit()
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    return gCameraHal->deinit();
-+}
-+
-+/**
-+ * Register callback function
-+ **/
-+void camera_callback_register(int camera_id, const camera_callback_ops_t* callback)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
-+    gCameraHal->deviceCallbackRegister(camera_id, callback);
-+}
-+
-+/**
-+ * Open one camera device
-+ *
-+ * \param camera_id camera index
-+ *
-+ * \return error code
-+ **/
-+int camera_device_open(int camera_id)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    return gCameraHal->deviceOpen(camera_id);
-+}
-+
-+/**
-+ * Close camera device
-+ *
-+ * \param camera_id The ID that opened before
-+ **/
-+void camera_device_close(int camera_id)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, VOID_VALUE, "camera hal is NULL.");
-+    CheckCameraId(camera_id,);
-+
-+    gCameraHal->deviceClose(camera_id);
-+}
-+
-+/**
-+ * Configure the sensor input of the device
-+ *
-+ * \param camera_id The camera ID that was opened
-+ * \param input_config  sensor input configuration
-+ *
-+ * \return 0 succeed <0 error
-+ **/
-+int camera_device_config_sensor_input(int camera_id, const stream_t *input_config)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckError(!input_config, BAD_VALUE, "camera input_config is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    return gCameraHal->deviceConfigInput(camera_id, input_config);
-+}
-+
-+/**
-+ * Add stream to device
-+ *
-+ * \param camera_id The camera ID that was opened
-+ * \param stream_id
-+ * \param stream_conf stream configuration
-+ *
-+ * \return 0 succeed <0 error
-+ **/
-+int camera_device_config_streams(int camera_id, stream_config_t *stream_list)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckError(!stream_list, BAD_VALUE, "camera stream is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    if (stream_list->operation_mode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE) {
-+        for (int i = 0; i < stream_list->num_streams; i++) {
-+            stream_list->streams[i].usage = CAMERA_STREAM_STILL_CAPTURE;
-+        }
-+    }
-+
-+    return gCameraHal->deviceConfigStreams(camera_id, stream_list);
-+}
-+
-+/**
-+ * Start device
-+ *
-+ * Start all streams in device.
-+ *
-+ * \param camera_id The Caemra ID that opened before
-+ *
-+ * \return error code
-+ **/
-+int camera_device_start(int camera_id)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+    CheckError(!gCameraHal, INVALID_OPERATION ,"camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    return gCameraHal->deviceStart(camera_id);
-+}
-+
-+/**
-+ * Stop device
-+ *
-+ * Stop all streams in device.
-+ *
-+ * \param camera_id The Caemra ID that opened before
-+ *
-+ * \return error code
-+ **/
-+int camera_device_stop(int camera_id)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(1);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    return gCameraHal->deviceStop(camera_id);
-+}
-+
-+/**
-+ * Allocate memory for mmap & dma export io-mode
-+ *
-+ * \param camera_id The camera ID that opened before
-+ * \param camera_buff stream buff
-+ *
-+ * \return error code
-+ **/
-+int camera_device_allocate_memory(int camera_id, camera_buffer_t *buffer)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(2);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+    CheckError(!buffer, BAD_VALUE, "buffer is NULL.");
-+    CheckError(buffer->s.memType != V4L2_MEMORY_MMAP, BAD_VALUE, "memory type %d is not supported.", buffer->s.memType);
-+
-+    return gCameraHal->deviceAllocateMemory(camera_id, buffer);
-+}
-+
-+/**
-+ * Queue a buffer to a stream (deprecated)
-+ *
-+ * \param camera_id The camera ID that opened before
-+ * \param stream_id the stream ID that add to device before
-+ * \param camera_buff stream buff
-+ *
-+ * \return error code
-+ **/
-+int camera_stream_qbuf(int camera_id, int stream_id, camera_buffer_t *buffer,
-+                       int num_buffers, const Parameters* settings)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(2);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    LOGW("camera_stream_qbuf(cam_id, stream_id, *buffer, num_buffers, *settings) is deprecated and will be removed soon.");
-+    LOGW("Please start to use camera_stream_qbuf(cam_id, **buffer, num_buffers, *settings)");
-+
-+    return gCameraHal->streamQbuf(camera_id, &buffer, num_buffers, settings);
-+}
-+
-+/**
-+ * Queue a buffer(or more buffers) to a stream
-+ *
-+ * \param camera_id The camera ID that opened before
-+ * \param buffer The array of pointers to the camera_buffer_t
-+ * \param num_buffers The number of buffers in the array
-+ *
-+ * \return error code
-+ **/
-+int camera_stream_qbuf(int camera_id, camera_buffer_t **buffer,
-+                       int num_buffers, const Parameters* settings)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(2);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+
-+    return gCameraHal->streamQbuf(camera_id, buffer, num_buffers, settings);
-+}
-+
-+/**
-+ * Dequeue a buffer from a stream
-+ *
-+ * \param camera_id The camera ID that opened before
-+ * \param stream_id the stream ID that add to device before
-+ * \param camera_buff stream buff
-+ *
-+ * \return error code
-+ **/
-+int camera_stream_dqbuf(int camera_id, int stream_id, camera_buffer_t **buffer,
-+                        Parameters* settings)
-+{
-+    PERF_CAMERA_ATRACE();
-+    HAL_TRACE_CALL(2);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera hal is NULL.");
-+    CheckCameraId(camera_id, BAD_VALUE);
-+    CheckError(!buffer, BAD_VALUE, "camera stream buffer is null.");
-+
-+    return gCameraHal->streamDqbuf(camera_id, stream_id, buffer, settings);
-+}
-+
-+int camera_set_parameters(int camera_id, const Parameters& param)
-+{
-+    HAL_TRACE_CALL(2);
-+    CheckCameraId(camera_id, BAD_VALUE);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before setting parameters.");
-+
-+    return gCameraHal->setParameters(camera_id, param);
-+}
-+
-+int camera_get_parameters(int camera_id, Parameters& param)
-+{
-+    HAL_TRACE_CALL(2);
-+    CheckCameraId(camera_id, BAD_VALUE);
-+    CheckError(!gCameraHal, INVALID_OPERATION, "camera device is not open before getting parameters.");
-+
-+    return gCameraHal->getParameters(camera_id, param);
-+}
-+
-+int get_frame_size(int camera_id, int format, int width, int height, int field, int *bpp)
-+{
-+    CheckError(width <= 0, BAD_VALUE, "width <=0");
-+    CheckError(height <= 0, BAD_VALUE, "height <=0");
-+    CheckError(field < 0, BAD_VALUE, "field <0");
-+
-+    int frameSize = 0;
-+    bool isOFSCompression = PlatformData::getOFSCompression(camera_id);
-+
-+   *bpp = CameraUtils::getBpp(format);
-+    if(isOFSCompression) {
-+        frameSize = CameraUtils::getFrameSize(format, width, height, false, true, true);
-+    } else {
-+        frameSize = CameraUtils::getFrameSize(format, width, height);
-+    }
-+    LOG2("@%s: output compression frame: %d, frame size from HAL:%d\n",
-+               __func__, isOFSCompression, frameSize);
-+
-+    return frameSize;
-+}
-+
-+//Create the HAL instance from here
-+__attribute__((constructor)) void initCameraHAL() {
-+    Log::setDebugLevel();
-+    CameraDump::setDumpLevel();
-+    gCameraHal = new CameraHal();
-+}
-+
-+__attribute__((destructor)) void deinitCameraHAL() {
-+    if (gCameraHal) {
-+        delete gCameraHal;
-+        gCameraHal = nullptr;
-+    }
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
-new file mode 100644
-index 000000000000..c4b2d2fb8603
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/IImageProcessor.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "Camera3Buffer.h"
-+#include "ProcessType.h"
-+
-+namespace icamera {
-+
-+class IImageProcessor {
-+public:
-+    IImageProcessor() {};
-+    virtual ~IImageProcessor() {};
-+
-+    static std::unique_ptr<IImageProcessor> createImageProcessor();
-+    static bool isProcessingTypeSupported(PostProcessType type);
-+
-+    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                               std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
-+    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
-+    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                 std::shared_ptr<camera3::Camera3Buffer> &output,
-+                                 int angle, std::vector<uint8_t> &rotateBuf) = 0;
-+    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                  std::shared_ptr<camera3::Camera3Buffer> &output) = 0;
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(IImageProcessor);
-+};
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
-new file mode 100644
-index 000000000000..26e393eab7f7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.cpp
-@@ -0,0 +1,798 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ColorConverter"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include <sys/types.h>
-+#include "Errors.h"
-+#include <linux/videodev2.h>
-+#include "ImageConverter.h"
-+
-+namespace icamera {
-+namespace ImageConverter {
-+
-+void YUV420ToRGB565(int width, int height, void *src, void *dst)
-+{
-+    int line, col, linewidth;
-+    int y, u, v, yy, vr, ug, vg, ub;
-+    int r, g, b;
-+    const unsigned char *py, *pu, *pv;
-+    unsigned short *rgbs = (unsigned short *) dst;
-+
-+    linewidth = width >> 1;
-+    py = (unsigned char *) src;
-+    pu = py + (width * height);
-+    pv = pu + (width * height) / 4;
-+
-+    y = *py++;
-+    yy = y << 8;
-+    u = *pu - 128;
-+    ug = 88 * u;
-+    ub = 454 * u;
-+    v = *pv - 128;
-+    vg = 183 * v;
-+    vr = 359 * v;
-+
-+    for (line = 0; line < height; line++) {
-+        for (col = 0; col < width; col++) {
-+            r = (yy + vr) >> 8;
-+            g = (yy - ug - vg) >> 8;
-+            b = (yy + ub ) >> 8;
-+            if (r < 0) r = 0;
-+            if (r > 255) r = 255;
-+            if (g < 0) g = 0;
-+            if (g > 255) g = 255;
-+            if (b < 0) b = 0;
-+            if (b > 255) b = 255;
-+            *rgbs++ = (((unsigned short)r>>3)<<11) | (((unsigned short)g>>2)<<5)
-+                   | (((unsigned short)b>>3)<<0);
-+
-+            y = *py++;
-+            yy = y << 8;
-+            if (col & 1) {
-+                pu++;
-+                pv++;
-+                u = *pu - 128;
-+                ug = 88 * u;
-+                ub = 454 * u;
-+                v = *pv - 128;
-+                vg = 183 * v;
-+                vr = 359 * v;
-+            }
-+        }
-+        if ((line & 1) == 0) {
-+            pu -= linewidth;
-+            pv -= linewidth;
-+        }
-+    }
-+}
-+
-+void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst)
-+{
-+
-+    unsigned char *yuvs = (unsigned char *) src;
-+    unsigned char *rgbs = (unsigned char *) dst;
-+
-+    //the end of the luminance data
-+    int lumEnd = srcStride * height;
-+    int i = 0, j = 0;
-+    for( i=0; i < height; i++) {
-+        //points to the next luminance value pair
-+        int lumPtr = i * srcStride;
-+        //points to the next chromiance value pair
-+        int chrPtr = i / 2 * srcStride + lumEnd;
-+        for ( j=0; j < width; j+=2 ) {
-+            //read the luminance and chromiance values
-+            int Y1 = yuvs[lumPtr++] & 0xff;
-+            int Y2 = yuvs[lumPtr++] & 0xff;
-+            int Cb = (yuvs[chrPtr++] & 0xff) - 128;
-+            int Cr = (yuvs[chrPtr++] & 0xff) - 128;
-+            int R, G, B;
-+
-+            //generate first RGB components
-+            B = Y1 + ((454 * Cb) >> 8);
-+            if(B < 0) B = 0; else if(B > 255) B = 255;
-+            G = Y1 - ((88 * Cb + 183 * Cr) >> 8);
-+            if(G < 0) G = 0; else if(G > 255) G = 255;
-+            R = Y1 + ((359 * Cr) >> 8);
-+            if(R < 0) R = 0; else if(R > 255) R = 255;
-+            //NOTE: this assume little-endian encoding
-+            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
-+            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
-+
-+            //generate second RGB components
-+            B = Y2 + ((454 * Cb) >> 8);
-+            if(B < 0) B = 0; else if(B > 255) B = 255;
-+            G = Y2 - ((88 * Cb + 183 * Cr) >> 8);
-+            if(G < 0) G = 0; else if(G > 255) G = 255;
-+            R = Y2 + ((359 * Cr) >> 8);
-+            if(R < 0) R = 0; else if(R > 255) R = 255;
-+            //NOTE: this assume little-endian encoding
-+            *rgbs++ = (unsigned char) (((G & 0x3c) << 3) | (B >> 3));
-+            *rgbs++ = (unsigned char) ((R & 0xf8) | (G >> 5));
-+        }
-+    }
-+}
-+
-+// covert YV12 (Y plane, V plane, U plane) to NV21 (Y plane, interlaced VU bytes)
-+void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst)
-+{
-+    const int cStride = srcStride>>1;
-+    const int vuStride = dstStride;
-+    const int hhalf = height>>1;
-+    const int whalf = width>>1;
-+
-+    // copy the entire Y plane
-+    unsigned char *srcPtr = (unsigned char *)src;
-+    unsigned char *dstPtr = (unsigned char *)dst;
-+    if (srcStride == dstStride) {
-+        MEMCPY_S(dstPtr, dstStride*height, srcPtr, dstStride*height);
-+    } else {
-+        for (int i = 0; i < height; i++) {
-+            MEMCPY_S(dstPtr, width, srcPtr, width);
-+            srcPtr += srcStride;
-+            dstPtr += dstStride;
-+        }
-+    }
-+
-+    // interlace the VU data
-+    unsigned char *srcPtrV = (unsigned char *)src + height*srcStride;
-+    unsigned char *srcPtrU = srcPtrV + cStride*hhalf;
-+    dstPtr = (unsigned char *)dst + dstStride*height;
-+    for (int i = 0; i < hhalf; ++i) {
-+        unsigned char *pDstVU = dstPtr;
-+        unsigned char *pSrcV = srcPtrV;
-+        unsigned char *pSrcU = srcPtrU;
-+        for (int j = 0; j < whalf; ++j) {
-+            *pDstVU ++ = *pSrcV ++;
-+            *pDstVU ++ = *pSrcU ++;
-+        }
-+        dstPtr += vuStride;
-+        srcPtrV += cStride;
-+        srcPtrU += cStride;
-+    }
-+}
-+
-+// copy YV12 to YV12 (Y plane, V plan, U plan) in case of different stride length
-+void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
-+{
-+    // copy the entire Y plane
-+    if (srcStride == dstStride) {
-+        MEMCPY_S(dst, dstStride * height, src, dstStride * height);
-+    } else {
-+        unsigned char *srcPtrY = (unsigned char *)src;
-+        unsigned char *dstPtrY = (unsigned char *)dst;
-+        for (int i = 0; i < height; i ++) {
-+            MEMCPY_S(dstPtrY, width, srcPtrY, width);
-+            srcPtrY += srcStride;
-+            dstPtrY += dstStride;
-+        }
-+    }
-+
-+    // copy VU plane
-+    const int scStride = srcStride >> 1;
-+    const int dcStride = ALIGN_16(dstStride >> 1); // Android CTS required: U/V plane needs 16 bytes aligned!
-+    if (dcStride == scStride) {
-+        unsigned char *srcPtrVU = (unsigned char *)src + height * srcStride;
-+        unsigned char *dstPtrVU = (unsigned char *)dst + height * dstStride;
-+        MEMCPY_S(dstPtrVU, height * dcStride, srcPtrVU, height * dcStride);
-+    } else {
-+        const int wHalf = width >> 1;
-+        const int hHalf = height >> 1;
-+        unsigned char *srcPtrV = (unsigned char *)src + height * srcStride;
-+        unsigned char *srcPtrU = srcPtrV + scStride * hHalf;
-+        unsigned char *dstPtrV = (unsigned char *)dst + height * dstStride;
-+        unsigned char *dstPtrU = dstPtrV + dcStride * hHalf;
-+        for (int i = 0; i < hHalf; i ++) {
-+            MEMCPY_S(dstPtrU, wHalf, srcPtrU, wHalf);
-+            MEMCPY_S(dstPtrV, wHalf, srcPtrV, wHalf);
-+            dstPtrU += dcStride, srcPtrU += scStride;
-+            dstPtrV += dcStride, srcPtrV += scStride;
-+        }
-+    }
-+}
-+
-+// covert NV12 (Y plane, interlaced UV bytes) to
-+// NV21 (Y plane, interlaced VU bytes) and trim stride width to real width
-+void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst)
-+{
-+    const int ysize = width * height;
-+    unsigned const char *pSrc = (unsigned char *)src;
-+    unsigned char *pDst = (unsigned char *)dst;
-+
-+    // Copy Y component
-+    if (srcStride == width) {
-+        MEMCPY_S(pDst, ysize, pSrc, ysize);
-+    } else if (srcStride > width) {
-+        int j = height;
-+        while(j--) {
-+            MEMCPY_S(pDst, width, pSrc, width);
-+            pSrc += srcStride;
-+            pDst += width;
-+        }
-+    } else {
-+        ALOGE("bad stride value");
-+        return;
-+    }
-+
-+    // Convert UV to VU
-+    pSrc = (unsigned char *)src + srcStride * height;
-+    pDst = (unsigned char *)dst + width * height;
-+    for (int j = 0; j < height / 2; j++) {
-+        if (width >= 16) {
-+            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
-+            uint32_t *ptr1 = (uint32_t *)(pDst);
-+            int bNotLastLine = ((j+1) == (height/2)) ? 0 : 1;
-+            int width_16 = (width + 15 * bNotLastLine) & ~0xf;
-+            if ((((uint64_t)(pSrc)) & 0xf) == 0 && (((uint64_t)(pDst)) & 0xf) == 0) { // 16 bytes aligned for both src and dest
-+                __asm__ volatile(\
-+                                 "movl       %0,  %%eax      \n\t"
-+                                 "movl       %1,  %%edx      \n\t"
-+                                 "movl       %2,  %%ecx      \n\t"
-+                                 "1:     \n\t"
-+                                 "movdqa (%%eax), %%xmm1     \n\t"
-+                                 "movdqa  %%xmm1, %%xmm0     \n\t"
-+                                 "psllw       $8, %%xmm1     \n\t"
-+                                 "psrlw       $8, %%xmm0     \n\t"
-+                                 "por     %%xmm0, %%xmm1     \n\t"
-+                                 "movdqa  %%xmm1, (%%edx)    \n\t"
-+                                 "add        $16, %%eax      \n\t"
-+                                 "add        $16, %%edx      \n\t"
-+                                 "sub        $16, %%ecx      \n\t"
-+                                 "jnz   1b \n\t"
-+                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
-+                                 :
-+                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
-+                                );
-+            }
-+            else { // either src or dest is not 16-bytes aligned
-+                __asm__ volatile(\
-+                                 "movl       %0,  %%eax      \n\t"
-+                                 "movl       %1,  %%edx      \n\t"
-+                                 "movl       %2,  %%ecx      \n\t"
-+                                 "1:     \n\t"
-+                                 "lddqu  (%%eax), %%xmm1     \n\t"
-+                                 "movdqa  %%xmm1, %%xmm0     \n\t"
-+                                 "psllw       $8, %%xmm1     \n\t"
-+                                 "psrlw       $8, %%xmm0     \n\t"
-+                                 "por     %%xmm0, %%xmm1     \n\t"
-+                                 "movdqu  %%xmm1, (%%edx)    \n\t"
-+                                 "add        $16, %%eax      \n\t"
-+                                 "add        $16, %%edx      \n\t"
-+                                 "sub        $16, %%ecx      \n\t"
-+                                 "jnz   1b \n\t"
-+                                 : "+m"(ptr0), "+m"(ptr1), "+m"(width_16)
-+                                 :
-+                                 : "eax", "ecx", "edx", "xmm0", "xmm1"
-+                                );
-+            }
-+
-+            // process remaining data of less than 16 bytes of last row
-+            for (int i = width_16; i < width; i += 2) {
-+                pDst[i] = pSrc[i + 1];
-+                pDst[i + 1] = pSrc[i];
-+            }
-+        }
-+        else if ((((uint64_t)(pSrc)) & 0x3) == 0 && (((uint64_t)(pDst)) & 0x3) == 0){  // 4 bytes aligned for both src and dest
-+            const uint32_t *ptr0 = (const uint32_t *)(pSrc);
-+            uint32_t *ptr1 = (uint32_t *)(pDst);
-+            int width_4 = width & ~3;
-+            for (int i = 0; i < width_4; i += 4) {
-+                uint32_t data0 = *ptr0++;
-+                uint32_t data1 = (data0 >> 8) & 0x00ff00ff;
-+                uint32_t data2 = (data0 << 8) & 0xff00ff00;
-+                *ptr1++ = data1 | data2;
-+            }
-+            // process remaining data of less than 4 bytes at end of each row
-+            for (int i = width_4; i < width; i += 2) {
-+                pDst[i] = pSrc[i + 1];
-+                pDst[i + 1] = pSrc[i];
-+            }
-+        }
-+        else {
-+            unsigned const char *ptr0 = pSrc;
-+            unsigned char *ptr1 = pDst;
-+            for (int i = 0; i < width; i += 2) {
-+                *ptr1++ = ptr0[1];
-+                *ptr1++ = ptr0[0];
-+                ptr0 += 2;
-+            }
-+        }
-+        pDst += width;
-+        pSrc += srcStride;
-+    }
-+}
-+
-+// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
-+// without Y and C 16 bytes aligned
-+void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
-+{
-+    int yStride = width;
-+    size_t ySize = yStride * height;
-+    int cStride = yStride/2;
-+    size_t cSize = cStride * height/2;
-+
-+    unsigned char *srcPtr = (unsigned char *) src;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
-+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
-+
-+    // copy the entire Y plane
-+    if (srcStride == yStride) {
-+        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
-+        srcPtr += ySize;
-+    } else if (srcStride > width) {
-+        for (int i = 0; i < height; i++) {
-+            MEMCPY_S(dstPtr, width, srcPtr, width);
-+            srcPtr += srcStride;
-+            dstPtr += yStride;
-+        }
-+    } else {
-+        ALOGE("bad src stride value");
-+        return;
-+    }
-+
-+    // deinterlace the UV data
-+    int halfHeight = height / 2;
-+    int halfWidth = width / 2;
-+    for ( int i = 0; i < halfHeight; ++i) {
-+        for ( int j = 0; j < halfWidth; ++j) {
-+            dstPtrV[j] = srcPtr[j * 2 + 1];
-+            dstPtrU[j] = srcPtr[j * 2];
-+        }
-+        srcPtr += srcStride;
-+        dstPtrV += cStride;
-+        dstPtrU += cStride;
-+    }
-+}
-+
-+// convert NV12 (Y plane, interlaced UV bytes) to YV12 (Y plane, V plane, U plane)
-+// with Y and C 16 bytes aligned
-+void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst)
-+{
-+    int yStride = ALIGN_16(width);
-+    size_t ySize = yStride * height;
-+    int cStride = ALIGN_16(yStride/2);
-+    size_t cSize = cStride * height/2;
-+
-+    unsigned char *srcPtr = (unsigned char *) src;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
-+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
-+
-+    // copy the entire Y plane
-+    if (srcStride == yStride) {
-+        MEMCPY_S(dstPtr, ySize, srcPtr, ySize);
-+        srcPtr += ySize;
-+    } else if (srcStride > width) {
-+        for (int i = 0; i < height; i++) {
-+            MEMCPY_S(dstPtr, width, srcPtr, width);
-+            srcPtr += srcStride;
-+            dstPtr += yStride;
-+        }
-+    } else {
-+        ALOGE("bad src stride value");
-+        return;
-+    }
-+
-+    // deinterlace the UV data
-+    for ( int i = 0; i < height / 2; ++i) {
-+        for ( int j = 0; j < width / 2; ++j) {
-+            dstPtrV[j] = srcPtr[j * 2 + 1];
-+            dstPtrU[j] = srcPtr[j * 2];
-+        }
-+        srcPtr += srcStride;
-+        dstPtrV += cStride;
-+        dstPtrU += cStride;
-+    }
-+}
-+
-+// P411's Y, U, V are seperated. But the YUY2's Y, U and V are interleaved.
-+void YUY2ToP411(int width, int height, int stride, void *src, void *dst)
-+{
-+    int ySize = width * height;
-+    int cSize = width * height / 4;
-+    int wHalf = width >> 1;
-+
-+    unsigned char *srcPtr = (unsigned char *) src;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+    unsigned char *dstPtrU = (unsigned char *) dst + ySize;
-+    unsigned char *dstPtrV = (unsigned char *) dst + ySize + cSize;
-+
-+    for (int i = 0; i < height; i++) {
-+        //The first line of the source
-+        //Copy first Y Plane first
-+        for (int j=0; j < width; j++) {
-+            dstPtr[j] = srcPtr[j*2];
-+        }
-+
-+        if (i & 1) {
-+            //Copy the V plane
-+            for (int k = 0; k < wHalf; k++) {
-+                dstPtrV[k] = srcPtr[k * 4 + 3];
-+            }
-+            dstPtrV = dstPtrV + wHalf;
-+        } else {
-+            //Copy the U plane
-+            for (int k = 0; k< wHalf; k++) {
-+                dstPtrU[k] = srcPtr[k * 4 + 1];
-+            }
-+            dstPtrU = dstPtrU + wHalf;
-+        }
-+
-+        srcPtr = srcPtr + stride * 2;
-+        dstPtr = dstPtr + width;
-+    }
-+}
-+
-+// P411's Y, U, V are separated. But the NV12's U and V are interleaved.
-+void NV12ToP411Separate(int width, int height, int stride,
-+                                void *srcY, void *srcUV, void *dst)
-+{
-+    int i, j, p, q;
-+    unsigned char *psrcY = (unsigned char *) srcY;
-+    unsigned char *pdstY = (unsigned char *) dst;
-+    unsigned char *pdstU, *pdstV;
-+    unsigned char *psrcUV;
-+
-+    // copy Y data
-+    for (i = 0; i < height; i++) {
-+        MEMCPY_S(pdstY, width, psrcY, width);
-+        pdstY += width;
-+        psrcY += stride;
-+    }
-+
-+    // copy U data and V data
-+    psrcUV = (unsigned char *)srcUV;
-+    pdstU = (unsigned char *)dst + width * height;
-+    pdstV = pdstU + width * height / 4;
-+    p = q = 0;
-+    for (i = 0; i < height / 2; i++) {
-+        for (j = 0; j < width; j++) {
-+            if (j % 2 == 0) {
-+                pdstU[p] = (psrcUV[i * stride + j] & 0xFF);
-+                p++;
-+           } else {
-+                pdstV[q] = (psrcUV[i * stride + j] & 0xFF);
-+                q++;
-+            }
-+        }
-+    }
-+}
-+
-+// P411's Y, U, V are seperated. But the NV12's U and V are interleaved.
-+void NV12ToP411(int width, int height, int stride, void *src, void *dst)
-+{
-+    NV12ToP411Separate(width, height, stride,
-+                    src, (void *)((unsigned char *)src + width * height), dst);
-+}
-+
-+// P411's Y, U, V are separated. But the NV21's U and V are interleaved.
-+void NV21ToP411Separate(int width, int height, int stride,
-+                        void *srcY, void *srcUV, void *dst)
-+{
-+    int i, j, p, q;
-+    unsigned char *psrcY = (unsigned char *) srcY;
-+    unsigned char *pdstY = (unsigned char *) dst;
-+    unsigned char *pdstU, *pdstV;
-+    unsigned char *psrcUV;
-+
-+    // copy Y data
-+    for (i = 0; i < height; i++) {
-+        MEMCPY_S(pdstY, width, psrcY, width);
-+        pdstY += width;
-+        psrcY += stride;
-+    }
-+
-+    // copy U data and V data
-+    psrcUV = (unsigned char *)srcUV;
-+    pdstU = (unsigned char *)dst + width * height;
-+    pdstV = pdstU + width * height / 4;
-+    p = q = 0;
-+    for (i = 0; i < height / 2; i++) {
-+        for (j = 0; j < width; j++) {
-+            if ((j & 1) == 0) {
-+                pdstV[p] = (psrcUV[i * stride + j] & 0xFF);
-+                p++;
-+           } else {
-+                pdstU[q] = (psrcUV[i * stride + j] & 0xFF);
-+                q++;
-+            }
-+        }
-+    }
-+}
-+
-+// P411's Y, U, V are seperated. But the NV21's U and V are interleaved.
-+void NV21ToP411(int width, int height, int stride, void *src, void *dst)
-+{
-+    NV21ToP411Separate(width, height, stride,
-+                       src, (void *)((unsigned char *)src + width * height), dst);
-+}
-+
-+// IMC3 Y, U, V are separated,the stride for U/V is the same as Y.
-+// about IMC3 detail, please refer to http://www.fourcc.org/yuv.php
-+// But the NV12's U and V are interleaved.
-+void NV12ToIMC3(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
-+{
-+    int i, j, p, q;
-+    unsigned char *pdstU, *pdstV;
-+    unsigned char *psrcUV;
-+
-+    // copy Y data even with stride
-+    MEMCPY_S(dst, stride * height, srcY, stride * height);
-+    // copy U data and V data
-+    psrcUV = (unsigned char *)srcUV;
-+    pdstU = (unsigned char *)dst + stride * height;
-+    pdstV = pdstU + stride * height / 2;
-+    p = q = 0;
-+    for (i = 0; i < height / 2; i++) {
-+        for (j = 0; j < width; j++) {
-+            if (j % 2 == 0) {
-+                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
-+                p++;
-+           } else {
-+                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
-+                q++;
-+            }
-+        }
-+        p += stride - width/2;
-+        q += stride - width/2;
-+    }
-+}
-+
-+// IMC1 Y, V,U are separated,the stride for U/V is the same as Y.
-+// IMC's V is before U
-+// But the NV12's U and V are interleaved.
-+void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst)
-+{
-+    int i, j, p, q;
-+    unsigned char *pdstU, *pdstV;
-+    unsigned char *psrcUV;
-+
-+    // copy Y data even with stride
-+    MEMCPY_S(dst, stride * height, srcY, stride * height);
-+    // copy U data and V data
-+    psrcUV = (unsigned char *)srcUV;
-+    pdstV = (unsigned char *)dst + stride * height;
-+    pdstU = pdstV + stride * height / 2;
-+    p = q = 0;
-+    for (i = 0; i < height / 2; i++) {
-+        for (j = 0; j < width; j++) {
-+            if (j % 2 == 0) {
-+                pdstU[p]= (psrcUV[i * stride + j] & 0xFF) ;
-+                p++;
-+           } else {
-+                pdstV[q]= (psrcUV[i * stride + j] & 0xFF);
-+                q++;
-+            }
-+        }
-+        p += stride - width/2;
-+        q += stride - width/2;
-+    }
-+}
-+
-+// Re-pad YUV420 format image, the format can be YV12, YU12 or YUV420 planar.
-+// If buffer size: (height*dstStride*1.5) > (height*srcStride*1.5), src and dst
-+// buffer start addresses are same, the re-padding can be done inplace.
-+void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst)
-+{
-+    unsigned char *dptr;
-+    unsigned char *sptr;
-+    void * (*myCopy)(void *dst, const void *src, size_t n);
-+
-+    const int whalf = width >> 1;
-+    const int hhalf = height >> 1;
-+    const int scStride = srcStride >> 1;
-+    const int dcStride = dstStride >> 1;
-+    const int sySize = height * srcStride;
-+    const int dySize = height * dstStride;
-+    const int scSize = hhalf * scStride;
-+    const int dcSize = hhalf * dcStride;
-+
-+    // directly copy, if (srcStride == dstStride)
-+    if (srcStride == dstStride) {
-+        MEMCPY_S(dst, dySize + 2*dcSize, src, dySize + 2*dcSize);
-+        return;
-+    }
-+
-+    // copy V(YV12 case) or U(YU12 case) plane line by line
-+    sptr = (unsigned char *)src + sySize + 2*scSize - scStride;
-+    dptr = (unsigned char *)dst + dySize + 2*dcSize - dcStride;
-+
-+    // try to avoid overlapped memcpy()
-+    myCopy = (abs(sptr -dptr) > dstStride) ? memcpy : memmove;
-+
-+    for (int i = 0; i < hhalf; i ++) {
-+        myCopy(dptr, sptr, whalf);
-+        sptr -= scStride;
-+        dptr -= dcStride;
-+    }
-+
-+    // copy  V(YV12 case) or U(YU12 case) U/V plane line by line
-+    sptr = (unsigned char *)src + sySize + scSize - scStride;
-+    dptr = (unsigned char *)dst + dySize + dcSize - dcStride;
-+    for (int i = 0; i < hhalf; i ++) {
-+        myCopy(dptr, sptr, whalf);
-+        sptr -= scStride;
-+        dptr -= dcStride;
-+    }
-+
-+    // copy Y plane line by line
-+    sptr = (unsigned char *)src + sySize - srcStride;
-+    dptr = (unsigned char *)dst + dySize - dstStride;
-+    for (int i = 0; i < height; i ++) {
-+        myCopy(dptr, sptr, width);
-+        sptr -= srcStride;
-+        dptr -= dstStride;
-+    }
-+}
-+
-+// covert YUYV(YUY2, YUV422 format) to YV12 (Y plane, V plane, U plane)
-+void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst)
-+{
-+    int ySize = width * height;
-+    int cSize = ALIGN_16(dstStride/2) * height / 2;
-+    int wHalf = width >> 1;
-+
-+    unsigned char *srcPtr = (unsigned char *) src;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+    unsigned char *dstPtrV = (unsigned char *) dst + ySize;
-+    unsigned char *dstPtrU = (unsigned char *) dst + ySize + cSize;
-+
-+    for (int i = 0; i < height; i++) {
-+        //The first line of the source
-+        //Copy first Y Plane first
-+        for (int j=0; j < width; j++) {
-+            dstPtr[j] = srcPtr[j*2];
-+        }
-+
-+        if (i & 1) {
-+            //Copy the V plane
-+            for (int k = 0; k< wHalf; k++) {
-+                dstPtrV[k] = srcPtr[k * 4 + 3];
-+            }
-+            dstPtrV = dstPtrV + ALIGN_16(dstStride>>1);
-+        } else {
-+            //Copy the U plane
-+            for (int k = 0; k< wHalf; k++) {
-+                dstPtrU[k] = srcPtr[k * 4 + 1];
-+            }
-+            dstPtrU = dstPtrU + ALIGN_16(dstStride>>1);
-+        }
-+
-+        srcPtr = srcPtr + srcStride * 2;
-+        dstPtr = dstPtr + width;
-+    }
-+}
-+
-+// covert YUYV(YUY2, YUV422 format) to NV21 (Y plane, interlaced VU bytes)
-+void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst)
-+{
-+    int ySize = width * height;
-+    int u_counter=1, v_counter=0;
-+
-+    unsigned char *srcPtr = (unsigned char *) src;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+    unsigned char *dstPtrUV = (unsigned char *) dst + ySize;
-+
-+    for (int i=0; i < height; i++) {
-+        //The first line of the source
-+        //Copy first Y Plane first
-+        for (int j=0; j < width * 2; j++) {
-+            if (j % 2 == 0)
-+                dstPtr[j/2] = srcPtr[j];
-+            if (i%2) {
-+                if (( j % 4 ) == 3) {
-+                    dstPtrUV[v_counter] = srcPtr[j]; //V plane
-+                    v_counter += 2;
-+                }
-+                if (( j % 4 ) == 1) {
-+                    dstPtrUV[u_counter] = srcPtr[j]; //U plane
-+                    u_counter += 2;
-+                }
-+            }
-+        }
-+
-+        srcPtr = srcPtr + srcStride * 2;
-+        dstPtr = dstPtr + width;
-+    }
-+}
-+
-+void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst)
-+{
-+    int y_counter = 0, u_counter = 1, v_counter = 3, uv_counter = 0;
-+    unsigned char *srcYPtr = (unsigned char *) src;
-+    unsigned char *srcUVPtr = (unsigned char *)src + srcWidth * srcHeight;
-+    unsigned char *dstPtr = (unsigned char *) dst;
-+
-+    for (int i = 0; i < srcHeight; i++) {
-+        for (int k = 0; k < srcWidth; k++) {
-+                dstPtr[y_counter] = srcYPtr[k];
-+                y_counter += 2;
-+                dstPtr[u_counter] = srcUVPtr[uv_counter];
-+                u_counter += 4;
-+                dstPtr[v_counter] = srcUVPtr[uv_counter + 1];
-+                v_counter += 4;
-+                uv_counter += 2;
-+        }
-+        if ((i % 2) == 0) {
-+            srcUVPtr = srcUVPtr + srcStride;
-+        }
-+
-+        dstPtr = dstPtr + 2 * dstStride;
-+        srcYPtr = srcYPtr + srcStride;
-+        u_counter = 1;
-+        v_counter = 3;
-+        y_counter = 0;
-+        uv_counter = 0;
-+    }
-+}
-+
-+void convertBuftoYV12(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst, bool align16)
-+{
-+    switch (format) {
-+    case V4L2_PIX_FMT_NV12:
-+        align16 ? align16ConvertNV12ToYV12(width, height, srcStride, src, dst)
-+            : convertNV12ToYV12(width, height, srcStride, src, dst);
-+        break;
-+    case V4L2_PIX_FMT_YVU420:
-+        copyYV12ToYV12(width, height, srcStride, dstStride, src, dst);
-+        break;
-+    case V4L2_PIX_FMT_YUYV:
-+        convertYUYVToYV12(width, height, srcStride, dstStride, src, dst);
-+        break;
-+    default:
-+        ALOGE("%s: unsupported format %d", __func__, format);
-+        break;
-+    }
-+}
-+
-+void convertBuftoNV21(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst)
-+{
-+    switch (format) {
-+    case V4L2_PIX_FMT_NV12:
-+        trimConvertNV12ToNV21(width, height, srcStride, src, dst);
-+        break;
-+    case V4L2_PIX_FMT_YVU420:
-+        convertYV12ToNV21(width, height, srcStride, dstStride, src, dst);
-+        break;
-+    case V4L2_PIX_FMT_YUYV:
-+        convertYUYVToNV21(width, height, srcStride, src, dst);
-+        break;
-+    default:
-+        ALOGE("%s: unsupported format %d", __func__, format);
-+        break;
-+    }
-+}
-+
-+void convertBuftoYUYV(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst)
-+{
-+    switch (format) {
-+    case V4L2_PIX_FMT_NV12:
-+        convertNV12ToYUYV(width, height, srcStride, dstStride, src, dst);
-+        break;
-+    default:
-+        LOGE("%s: unsupported format %d", __func__, format);
-+        break;
-+    }
-+}
-+} // namespace ImageConverter
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/ImageConverter.h b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
-new file mode 100644
-index 000000000000..f55479a57b63
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/ImageConverter.h
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace icamera {
-+namespace ImageConverter {
-+
-+void YUV420ToRGB565(int width, int height, void *src, void *dst);
-+
-+void trimConvertNV12ToRGB565(int width, int height, int srcStride, void *src, void *dst);
-+
-+void convertYV12ToNV21(int width, int height, int srcStride, int dstStride, void *src, void *dst);
-+void copyYV12ToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
-+
-+void trimConvertNV12ToNV21(int width, int height, int srcStride, void *src, void *dst);
-+
-+void convertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
-+void align16ConvertNV12ToYV12(int width, int height, int srcStride, void *src, void *dst);
-+
-+void NV12ToP411(int width, int height, int stride, void *src, void *dst);
-+void NV21ToP411(int width, int height, int stride, void *src, void *dst);
-+void NV12ToP411Separate(int width, int height, int stride,
-+                                    void *srcY, void *srcUV, void *dst);
-+void NV21ToP411Separate(int width, int height, int stride,
-+                                    void *srcY, void *srcUV, void *dst);
-+
-+void YUY2ToP411(int width, int height, int stride, void *src, void *dst);
-+void NV12ToIMC3(int width, int height, int stride,void *srcY, void *srcUV, void *dst);
-+void NV12ToIMC1(int width, int height, int stride, void *srcY, void *srcUV, void *dst);
-+void convertYUYVToYV12(int width, int height, int srcStride, int dstStride, void *src, void *dst);
-+
-+void convertYUYVToNV21(int width, int height, int srcStride, void *src, void *dst);
-+void convertNV12ToYUYV(int srcWidth, int srcHeight, int srcStride, int dstStride, const void *src, void *dst);
-+
-+void convertBuftoYV12(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst, bool align16 = true);
-+void convertBuftoNV21(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst);
-+void convertBuftoYUYV(int format, int width, int height, int srcStride,
-+                      int dstStride, void *src, void *dst);
-+
-+void repadYUV420(int width, int height, int srcStride, int dstStride, void *src, void *dst);
-+
-+} // namespace ImageConverter
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
-new file mode 100644
-index 000000000000..5b419751a1f6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.cpp
-@@ -0,0 +1,318 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "PostProcessorBase"
-+
-+#include <vector>
-+#include <hardware/camera3.h>
-+#include "stdlib.h"
-+#include "PostProcessorBase.h"
-+#include "iutils/CameraLog.h"
-+
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+PostProcessorBase::PostProcessorBase(std::string processName) :
-+    mName(processName),
-+    mProcessor(nullptr)
-+{
-+    LOG1("@%s PostProcessorBase created", __func__);
-+}
-+
-+PostProcessorBase::~PostProcessorBase()
-+{
-+    LOG1("@%s PostProcessorBase destory", __func__);
-+}
-+
-+ScaleProcess::ScaleProcess() :
-+    PostProcessorBase("Scaler")
-+{
-+    LOG1("@%s create scaler processor", __func__);
-+    mProcessor = IImageProcessor::createImageProcessor();
-+}
-+
-+status_t ScaleProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                        shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    LOG1("@%s processor name: %s", __func__, mName.c_str());
-+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
-+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
-+
-+    int ret = mProcessor->scaleFrame(inBuf, outBuf);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
-+
-+    return OK;
-+}
-+
-+RotateProcess::RotateProcess(int angle) :
-+    PostProcessorBase("Rotate"),
-+    mAngle(angle)
-+{
-+    LOG1("@%s create rotate processor, degree: %d", __func__, mAngle);
-+    mProcessor = IImageProcessor::createImageProcessor();
-+};
-+
-+status_t RotateProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                         shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    LOG1("@%s processor name: %s", __func__, mName.c_str());
-+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
-+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
-+    std::vector<uint8_t> rotateBuf;
-+
-+    int ret = mProcessor->rotateFrame(inBuf, outBuf, mAngle, rotateBuf);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
-+
-+    return OK;
-+}
-+
-+CropProcess::CropProcess() :
-+    PostProcessorBase("Crop")
-+{
-+    LOG1("@%s create crop processor", __func__);
-+    mProcessor = IImageProcessor::createImageProcessor();
-+};
-+
-+status_t CropProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    LOG1("@%s processor name: %s", __func__, mName.c_str());
-+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
-+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
-+
-+    int ret = mProcessor->cropFrame(inBuf, outBuf);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
-+
-+    return OK;
-+}
-+
-+ConvertProcess::ConvertProcess() :
-+    PostProcessorBase("Convert")
-+{
-+    LOG1("@%s create convert processor", __func__);
-+    mProcessor = IImageProcessor::createImageProcessor();
-+};
-+
-+status_t ConvertProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                          shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    LOG1("@%s processor name: %s", __func__, mName.c_str());
-+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
-+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
-+
-+    int ret = mProcessor->convertFrame(inBuf, outBuf);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "Failed to do post processing, name: %s", mName.c_str());
-+
-+    return OK;
-+}
-+
-+JpegProcess::JpegProcess(int cameraId) :
-+    PostProcessorBase("JpegEncode"),
-+    mCameraId(cameraId),
-+    mCropBuffer(nullptr),
-+    mScaleBuffer(nullptr),
-+    mThumbOutput(nullptr),
-+    mExifData(nullptr)
-+{
-+    LOG1("@%s create jpeg encode processor", __func__);
-+
-+    mProcessor = IImageProcessor::createImageProcessor();
-+    mJpegEncoder = IJpegEncoder::createJpegEncoder();
-+    mJpegMaker = std::unique_ptr<JpegMaker>(new JpegMaker());
-+};
-+
-+JpegProcess::~JpegProcess()
-+{
-+}
-+
-+void JpegProcess::attachJpegBlob(const EncodePackage &package)
-+{
-+    LOG2("@%s, encoded data size: %d, exif data size: %d",
-+         __func__, package.encodedDataSize, package.exifDataSize);
-+    uint8_t *resultPtr = static_cast<uint8_t*>(package.outputData) +
-+                         package.outputSize - sizeof(struct camera3_jpeg_blob);
-+
-+    // save jpeg size at the end of file
-+    auto *blob = reinterpret_cast<struct camera3_jpeg_blob*>(resultPtr);
-+    blob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
-+    blob->jpeg_size = package.encodedDataSize + package.exifDataSize;
-+}
-+
-+std::shared_ptr<camera3::Camera3Buffer> JpegProcess::cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
-+                                                                               const shared_ptr<camera3::Camera3Buffer> &inBuf)
-+{
-+    LOG1("@%s, input size: %dx%d, thumbnail info: %dx%d",
-+         __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
-+
-+    if (thumbWidth <= 0 || thumbHeight <= 0) {
-+        LOGW("@%s, skip, thumbWidth:%d, thumbHeight:%d", __func__, thumbWidth, thumbHeight);
-+        return nullptr;
-+    }
-+
-+    int ret = OK;
-+    shared_ptr<camera3::Camera3Buffer> tempBuffer = inBuf;
-+
-+    // Do crop first if needed
-+    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_CROP) &&
-+        inBuf->width() * thumbHeight != inBuf->height() * thumbWidth) {
-+        int width = 0, height = 0;
-+        if (inBuf->width() * thumbHeight < inBuf->height() * thumbWidth) {
-+            width = inBuf->width();
-+            height = inBuf->width() * thumbHeight / thumbWidth;
-+        } else {
-+            width = inBuf->height() * thumbWidth / thumbHeight;
-+            height = inBuf->height();
-+        }
-+
-+        if (mCropBuffer && (mCropBuffer->width() != width || mCropBuffer->height() != height))
-+            mCropBuffer.reset();
-+        if (!mCropBuffer) {
-+            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), width, height);
-+            mCropBuffer = camera3::MemoryUtils::allocateHeapBuffer(width, height,
-+                                                                   width, inBuf->v4l2Fmt(),
-+                                                                   mCameraId, size);
-+            CheckError(!mCropBuffer, nullptr, "%s, Failed to allocate the internal crop buffer", __func__);
-+        }
-+
-+        LOG2("@%s, Crop the main buffer from %dx%d to %dx%d",
-+             __func__, inBuf->width(), inBuf->height(), width, height);
-+        ret = mProcessor->cropFrame(inBuf, mCropBuffer);
-+        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
-+        tempBuffer = mCropBuffer;
-+    }
-+
-+    if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_SCALING)) {
-+        if (mScaleBuffer && (mScaleBuffer->width() != thumbWidth
-+            || mScaleBuffer->height() != thumbHeight))
-+            mScaleBuffer.reset();
-+        if (!mScaleBuffer) {
-+            int size = CameraUtils::getFrameSize(inBuf->v4l2Fmt(), thumbWidth, thumbHeight);
-+            mScaleBuffer = camera3::MemoryUtils::allocateHeapBuffer(thumbWidth, thumbHeight,
-+                                                                    thumbWidth, inBuf->v4l2Fmt(),
-+                                                                    mCameraId, size);
-+            CheckError(!mScaleBuffer, nullptr, "%s, Failed to allocate the internal scale buffer", __func__);
-+        }
-+
-+        LOG2("@%s, Scale the buffer from %dx%d to %dx%d",
-+              __func__, inBuf->width(), inBuf->height(), thumbWidth, thumbHeight);
-+        ret = mProcessor->scaleFrame(tempBuffer, mScaleBuffer);
-+        CheckError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__);
-+        tempBuffer = mScaleBuffer;
-+    }
-+
-+    if (tempBuffer->width() != thumbWidth || tempBuffer->height() != thumbHeight) {
-+        LOGE("%s, Failed to crop & downscale the main buffer to thumbnail buffer", __func__);
-+        return nullptr;
-+    }
-+
-+    return tempBuffer;
-+}
-+
-+void JpegProcess::fillEncodeInfo(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                 const shared_ptr<camera3::Camera3Buffer> &outBuf,
-+                                 EncodePackage &package)
-+{
-+    package.inputWidth = inBuf->width();
-+    package.inputHeight = inBuf->height();
-+    package.inputStride = inBuf->stride();
-+    package.inputFormat = inBuf->v4l2Fmt();
-+    package.inputSize = inBuf->size();
-+    package.inputBufferHandle = static_cast<void*>(inBuf->getBufferHandle());
-+    package.inputData = inBuf->data();
-+
-+    package.outputWidth = outBuf->width();
-+    package.outputHeight = outBuf->height();
-+    package.outputSize = outBuf->size();
-+    package.outputBufferHandle = static_cast<void*>(outBuf->getBufferHandle());
-+    package.outputData = outBuf->data();
-+}
-+
-+status_t JpegProcess::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                       const icamera::Parameters &parameter,
-+                                       shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    LOG1("@%s", __func__);
-+    bool isEncoded = false;
-+
-+    icamera::ExifMetaData exifMetadata;
-+    status_t status = mJpegMaker->setupExifWithMetaData(inBuf->width(), inBuf->height(), parameter, &exifMetadata);
-+    CheckError(status != OK, UNKNOWN_ERROR, "@%s, Setup exif metadata failed.", __func__);
-+    LOG2("@%s: setting exif metadata done!", __func__);
-+
-+    std::shared_ptr<camera3::Camera3Buffer> thumbInput =
-+        cropAndDownscaleThumbnail(exifMetadata.mJpegSetting.thumbWidth,
-+                                  exifMetadata.mJpegSetting.thumbHeight,
-+                                  inBuf);
-+
-+    EncodePackage thumbnailPackage;
-+    if (thumbInput) {
-+        if (mThumbOutput == nullptr ||
-+            mThumbOutput->width() != exifMetadata.mJpegSetting.thumbWidth ||
-+            mThumbOutput->height() != exifMetadata.mJpegSetting.thumbHeight ||
-+            mThumbOutput->v4l2Fmt() != outBuf->v4l2Fmt()) {
-+            mThumbOutput = camera3::MemoryUtils::allocateHeapBuffer(
-+                               exifMetadata.mJpegSetting.thumbWidth, exifMetadata.mJpegSetting.thumbHeight,
-+                               exifMetadata.mJpegSetting.thumbWidth, outBuf->v4l2Fmt(),
-+                               mCameraId,
-+                               exifMetadata.mJpegSetting.thumbWidth * exifMetadata.mJpegSetting.thumbHeight * 3 / 2);
-+            CheckError(!mThumbOutput, NO_MEMORY, "%s, Failed to allocate the mThumbOutput", __func__);
-+        }
-+
-+        // encode thumbnail image
-+        fillEncodeInfo(thumbInput, mThumbOutput, thumbnailPackage);
-+        thumbnailPackage.quality = exifMetadata.mJpegSetting.jpegThumbnailQuality;
-+        // the exifDataSize should be 0 for encoding thumbnail
-+        thumbnailPackage.exifData = nullptr;
-+        thumbnailPackage.exifDataSize = 0;
-+
-+        do {
-+            isEncoded = mJpegEncoder->doJpegEncode(thumbnailPackage);
-+            thumbnailPackage.quality -= 5;
-+        } while (thumbnailPackage.encodedDataSize > THUMBNAIL_SIZE_LIMITATION &&
-+            thumbnailPackage.quality > 0);
-+
-+        if (!isEncoded || thumbnailPackage.quality < 0) {
-+            LOGW("Failed to generate thumbnail, isEncoded: %d, encoded thumbnail size: %d, quality:%d",
-+                 isEncoded, thumbnailPackage.encodedDataSize, thumbnailPackage.quality);
-+        }
-+    }
-+
-+    // save exif data
-+    uint32_t exifBufSize = ENABLE_APP2_MARKER ? EXIF_SIZE_LIMITATION * 2 : EXIF_SIZE_LIMITATION;
-+    if (mExifData == nullptr) {
-+        mExifData = std::unique_ptr<unsigned char[]>(new unsigned char[exifBufSize]);
-+    }
-+    uint8_t* finalExifDataPtr = static_cast<uint8_t*>(mExifData.get());
-+    uint32_t finalExifDataSize = 0;
-+    status = mJpegMaker->getExif(thumbnailPackage, finalExifDataPtr, &finalExifDataSize);
-+    CheckError(status != OK, status, "@%s, Failed to get Exif", __func__);
-+    LOG2("%s, exifBufSize %d, finalExifDataSize %d", __func__, exifBufSize, finalExifDataSize);
-+
-+    // encode main image
-+    EncodePackage finalEncodePackage;
-+    fillEncodeInfo(inBuf, outBuf, finalEncodePackage);
-+    finalEncodePackage.quality = exifMetadata.mJpegSetting.jpegQuality;
-+    finalEncodePackage.exifData = finalExifDataPtr;
-+    finalEncodePackage.exifDataSize = finalExifDataSize;
-+    isEncoded = mJpegEncoder->doJpegEncode(finalEncodePackage);
-+    CheckError(!isEncoded, UNKNOWN_ERROR, "@%s, Failed to encode main image", __func__);
-+    mJpegMaker->writeExifData(finalEncodePackage);
-+
-+    attachJpegBlob(finalEncodePackage);
-+
-+    return OK;
-+}
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
-new file mode 100644
-index 000000000000..2039e38a0080
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorBase.h
-@@ -0,0 +1,118 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "Parameters.h"
-+#include "Camera3Buffer.h"
-+#include "IImageProcessor.h"
-+#include "EXIFMetaData.h"
-+#include "IJpegEncoder.h"
-+#include "JpegMaker.h"
-+
-+namespace icamera {
-+
-+class PostProcessorBase {
-+public:
-+    PostProcessorBase(std::string processName);
-+    virtual ~PostProcessorBase();
-+
-+    std::string getName() { return mName; }
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      const Parameters &parameter,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf) { return OK; }
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PostProcessorBase);
-+
-+protected:
-+    std::string mName;
-+    std::unique_ptr<IImageProcessor> mProcessor;
-+};
-+
-+class ScaleProcess : public PostProcessorBase {
-+public:
-+    ScaleProcess();
-+    ~ScaleProcess() {};
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+};
-+
-+class RotateProcess : public PostProcessorBase {
-+public:
-+    RotateProcess(int angle);
-+    ~RotateProcess() {};
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+private:
-+    int mAngle;
-+};
-+
-+class CropProcess : public PostProcessorBase {
-+public:
-+    CropProcess();
-+    ~CropProcess() {};
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+};
-+
-+class ConvertProcess : public PostProcessorBase {
-+public:
-+    ConvertProcess();
-+    ~ConvertProcess() {};
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+};
-+
-+class JpegProcess : public PostProcessorBase {
-+public:
-+    JpegProcess(int cameraId);
-+    ~JpegProcess();
-+
-+    virtual status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                      const Parameters &parameter,
-+                                      std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+private:
-+    void attachJpegBlob(const EncodePackage &package);
-+    std::shared_ptr<camera3::Camera3Buffer>
-+    cropAndDownscaleThumbnail(int thumbWidth, int thumbHeight,
-+                              const std::shared_ptr<camera3::Camera3Buffer> &inBuf);
-+    void fillEncodeInfo(const std::shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                        const std::shared_ptr<camera3::Camera3Buffer> &outBuf,
-+                        EncodePackage &package);
-+
-+private:
-+    int mCameraId;
-+
-+    std::shared_ptr<camera3::Camera3Buffer> mCropBuffer;
-+    std::shared_ptr<camera3::Camera3Buffer> mScaleBuffer;
-+    std::shared_ptr<camera3::Camera3Buffer> mThumbOutput;
-+
-+    std::unique_ptr<JpegMaker> mJpegMaker;
-+    std::unique_ptr<IJpegEncoder> mJpegEncoder;
-+    std::unique_ptr<unsigned char[]> mExifData;
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
-new file mode 100644
-index 000000000000..ff1c3a2a2238
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.cpp
-@@ -0,0 +1,141 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PostProcessorCore"
-+
-+#include "iutils/CameraLog.h"
-+#include "PostProcessorCore.h"
-+
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+PostProcessorCore::PostProcessorCore(int cameraId) :
-+    mCameraId(cameraId)
-+{
-+    LOG1("@%s, cameraId: %d", __func__, mCameraId);
-+}
-+
-+PostProcessorCore::~PostProcessorCore()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+bool PostProcessorCore::isPostProcessTypeSupported(PostProcessType type)
-+{
-+    return IImageProcessor::isProcessingTypeSupported(type);
-+}
-+
-+status_t PostProcessorCore::createProcessor()
-+{
-+    LOG2("@%s, cameraId: %d", __func__, mCameraId);
-+
-+    mProcessorVector.clear();
-+    for (const auto &order : mProcessorsInfo) {
-+        shared_ptr<PostProcessorBase> processor = nullptr;
-+        switch (order.type) {
-+        case POST_PROCESS_SCALING :
-+            processor = std::make_shared<ScaleProcess>();
-+            break;
-+        case POST_PROCESS_ROTATE :
-+            processor = std::make_shared<RotateProcess>(order.angle);
-+            break;
-+        case POST_PROCESS_CROP :
-+            processor = std::make_shared<CropProcess>();
-+            break;
-+        case POST_PROCESS_CONVERT :
-+            processor = std::make_shared<ConvertProcess>();
-+            break;
-+        case POST_PROCESS_JPEG_ENCODING :
-+            processor = std::make_shared<JpegProcess>(mCameraId);
-+            break;
-+        case POST_PROCESS_NONE:
-+            break;
-+        default:
-+            LOGE("%s, Doesn't support this kind of post-processor");
-+            return UNKNOWN_ERROR;
-+        }
-+
-+        CheckError(!processor, UNKNOWN_ERROR, "%s, Failed to create the post processor: 0x%x", __func__, order.type);
-+        mProcessorVector.push_back(processor);
-+    }
-+
-+    LOG2("%s, the number of post processor unit is %zu", __func__, mProcessorVector.size());
-+    return OK;
-+}
-+
-+status_t PostProcessorCore::allocateBuffers()
-+{
-+    LOG2("@%s,mProcessorVector.size: %zu cameraId: %d", __func__, mProcessorVector.size(), mCameraId);
-+
-+    mInterBuffers.clear();
-+    for (size_t i = 0; i < mProcessorsInfo.size() - 1; i++) {
-+        const stream_t &info = mProcessorsInfo[i].outputInfo;
-+        shared_ptr<camera3::Camera3Buffer> buf = camera3::MemoryUtils::allocateHeapBuffer(info.width, info.height,
-+                                                                                          info.stride, info.format,
-+                                                                                          mCameraId, info.size);
-+        CheckError(!buf, NO_MEMORY, "@%s: Failed to allocate internal buffer: processor: %s",
-+              __func__, mProcessorVector[i]->getName().c_str());
-+        mInterBuffers[mProcessorVector[i]] = buf;
-+    }
-+
-+    return OK;
-+}
-+
-+status_t PostProcessorCore::configure(const std::vector<PostProcessInfo> &processorOrder)
-+{
-+    if (processorOrder.empty())
-+        return OK;
-+
-+    mProcessorsInfo = processorOrder;
-+    int ret = createProcessor();
-+    CheckError(ret != OK, ret, "%s, Failed to create the post processor", __func__);
-+
-+    ret = allocateBuffers();
-+    CheckError(ret != OK, ret, "%s, Failed allocate the internal buffers", __func__);
-+
-+    return OK;
-+}
-+
-+status_t PostProcessorCore::doPostProcessing(const shared_ptr<camera3::Camera3Buffer> &inBuf,
-+                                             const Parameters &parameter,
-+                                             shared_ptr<camera3::Camera3Buffer> &outBuf)
-+{
-+    CheckError(!inBuf, UNKNOWN_ERROR, "%s, the inBuf is nullptr", __func__);
-+    CheckError(!outBuf, UNKNOWN_ERROR, "%s, the outBuf is nullptr", __func__);
-+
-+    shared_ptr<camera3::Camera3Buffer> input = inBuf;
-+    shared_ptr<camera3::Camera3Buffer> output = nullptr;
-+    for (size_t i = 0; i < mProcessorVector.size(); i++) {
-+        if (i == (mProcessorVector.size() - 1)) {
-+            output = outBuf;
-+        } else {
-+            output = mInterBuffers[mProcessorVector[i]];
-+        }
-+
-+        int ret = OK;
-+        if (mProcessorsInfo[i].type == POST_PROCESS_JPEG_ENCODING)
-+            ret = mProcessorVector[i]->doPostProcessing(input, parameter, output);
-+        else
-+            ret = mProcessorVector[i]->doPostProcessing(input, output);
-+        CheckError(ret != OK, ret, "%s, Failed to do post processing: %s", __func__, mProcessorVector[i]->getName().c_str());
-+
-+        input = output;
-+    }
-+
-+    return OK;
-+}
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
-new file mode 100644
-index 000000000000..c686553d987c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/PostProcessorCore.h
-@@ -0,0 +1,68 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+#include <map>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "PostProcessorBase.h"
-+#include "ProcessType.h"
-+
-+namespace icamera {
-+
-+struct PostProcessInfo {
-+    stream_t inputInfo;
-+    stream_t outputInfo;
-+    PostProcessType type;
-+    int angle;
-+    PostProcessInfo() : type(POST_PROCESS_NONE),angle(0) { CLEAR(inputInfo); CLEAR(outputInfo); }
-+};
-+
-+/**
-+ * \class PostProcessorCore
-+ *
-+ * This class is used to encode JPEG and rotate image.
-+ *
-+ */
-+class PostProcessorCore {
-+
-+public:
-+    PostProcessorCore(int cameraId);
-+    virtual ~PostProcessorCore();
-+
-+    bool isPostProcessTypeSupported(PostProcessType type);
-+    status_t configure(const std::vector<PostProcessInfo> &processorOrder);
-+    status_t doPostProcessing(const std::shared_ptr<camera3::Camera3Buffer> &mainBuf,
-+                              const Parameters &parameter,
-+                              std::shared_ptr<camera3::Camera3Buffer> &outBuf);
-+private:
-+    status_t createProcessor();
-+    status_t allocateBuffers();
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(PostProcessorCore);
-+
-+private:
-+    int mCameraId;
-+    std::map<std::shared_ptr<PostProcessorBase>, std::shared_ptr<camera3::Camera3Buffer>>
-+            mInterBuffers;
-+    std::vector<PostProcessInfo> mProcessorsInfo;
-+    std::vector<std::shared_ptr<PostProcessorBase>> mProcessorVector;
-+};
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/ProcessType.h b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
-new file mode 100644
-index 000000000000..d7354ddd1268
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/ProcessType.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace icamera {
-+
-+enum PostProcessType {
-+    POST_PROCESS_NONE = 0,
-+    POST_PROCESS_ROTATE = 1 << 0,
-+    POST_PROCESS_SCALING = 1 << 1,
-+    POST_PROCESS_CROP = 1 << 2,
-+    POST_PROCESS_CONVERT = 1 << 3,
-+    POST_PROCESS_JPEG_ENCODING = 1 << 4
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
-new file mode 100644
-index 000000000000..c3156ddca111
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.cpp
-@@ -0,0 +1,234 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ImageProcessorCore"
-+
-+#include <libyuv.h>
-+#include "iutils/CameraLog.h"
-+#include "ImageProcessorCore.h"
-+#include "ImageConverter.h"
-+
-+namespace icamera {
-+
-+ImageProcessorCore::ImageProcessorCore()
-+{
-+    LOG2("enter %s", __func__);
-+    mRotationMode = {
-+        {0, libyuv::RotationMode::kRotate0},
-+        {90, libyuv::RotationMode::kRotate90},
-+        {180, libyuv::RotationMode::kRotate180},
-+        {270, libyuv::RotationMode::kRotate270}
-+    };
-+}
-+
-+ImageProcessorCore::~ImageProcessorCore()
-+{
-+    LOG2("enter %s", __func__);
-+}
-+
-+std::unique_ptr<IImageProcessor> IImageProcessor::createImageProcessor()
-+{
-+    return std::unique_ptr<ImageProcessorCore>(new ImageProcessorCore());
-+}
-+
-+//If support this kind of post process type in current OS
-+bool IImageProcessor::isProcessingTypeSupported(PostProcessType type)
-+{
-+    int supportedType = POST_PROCESS_ROTATE |
-+                        POST_PROCESS_SCALING |
-+                        POST_PROCESS_CROP |
-+                        POST_PROCESS_CONVERT |
-+                        POST_PROCESS_JPEG_ENCODING;
-+
-+    return supportedType & type;
-+}
-+
-+status_t ImageProcessorCore::cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                       std::shared_ptr<camera3::Camera3Buffer> &output)
-+{
-+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
-+         __func__, input->width(), input->height(), input->v4l2Fmt(),
-+         output->width(), output->height(), output->v4l2Fmt());
-+
-+    int srcW = input->stride();
-+    int srcH = input->height();
-+    int dstW = output->stride();
-+    int dstH = output->height();
-+
-+    std::unique_ptr<uint8_t[]> srcI420Buf;
-+    unsigned int srcI420BufSize = srcW * srcH * 3 / 2;
-+    srcI420Buf.reset(new uint8_t[srcI420BufSize]);
-+
-+    const uint8_t* srcBufY = static_cast<uint8_t*>(input->data());
-+    const uint8_t* srcBufUV = srcBufY + srcW * srcH;
-+    uint8_t* srcI420BufY = static_cast<uint8_t*>(srcI420Buf.get());
-+    uint8_t* srcI420BufU = srcI420BufY + srcW * srcH;
-+    uint8_t* srcI420BufV = srcI420BufU + srcW * srcH / 4;
-+    int ret = libyuv::NV12ToI420(srcBufY, srcW,
-+                                 srcBufUV, srcW,
-+                                 srcI420BufY, srcW,
-+                                 srcI420BufU, srcW / 2,
-+                                 srcI420BufV, srcW / 2,
-+                                 srcW, srcH);
-+    CheckError((ret != 0), UNKNOWN_ERROR, "@%s, NV12ToI420 fails", __func__);
-+
-+    std::unique_ptr<uint8_t[]> dstI420BufUV;
-+    unsigned int dstI420BufUVSize = dstW * dstH / 2;
-+    dstI420BufUV.reset(new uint8_t[dstI420BufUVSize]);
-+
-+    uint8_t* dstI420BufU = static_cast<uint8_t*>(dstI420BufUV.get());
-+    uint8_t* dstI420BufV = dstI420BufU + dstW * dstH / 4;
-+    ret = libyuv::ConvertToI420(static_cast<uint8_t*>(srcI420Buf.get()), srcI420BufSize,
-+                                static_cast<uint8_t*>(output->data()), dstW,
-+                                dstI420BufU, (dstW + 1) / 2,
-+                                dstI420BufV, (dstW + 1) / 2,
-+                                (srcW - dstW) / 2, (srcH - dstH) / 2,
-+                                srcW, srcH, dstW, dstH,
-+                                libyuv::RotationMode::kRotate0, libyuv::FourCC::FOURCC_I420);
-+    CheckError(ret != 0, UNKNOWN_ERROR, "@%s, ConvertToI420 fails", __func__);
-+
-+    uint8_t* dstBufUV = static_cast<uint8_t*>(output->data()) + dstW * dstH;
-+    libyuv::MergeUVPlane(dstI420BufU, (dstW + 1) / 2,
-+                         dstI420BufV, (dstW + 1) / 2,
-+                         dstBufUV, dstW,
-+                         (dstW + 1) / 2, (dstH + 1) / 2);
-+
-+    return OK;
-+}
-+
-+status_t ImageProcessorCore::scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                        std::shared_ptr<camera3::Camera3Buffer> &output)
-+{
-+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
-+         __func__, input->width(), input->height(), input->v4l2Fmt(),
-+         output->width(), output->height(), output->v4l2Fmt());
-+
-+    // Y plane
-+    libyuv::ScalePlane(static_cast<uint8_t*>(input->data()),
-+                       input->stride(),
-+                       input->width(),
-+                       input->height(),
-+                       static_cast<uint8_t*>(output->data()),
-+                       output->stride(),
-+                       output->width(),
-+                       output->height(),
-+                       libyuv::kFilterNone);
-+
-+    // UV plane
-+    int inUVOffsetByte = input->stride() * input->height();
-+    int outUVOffsetByte = output->stride() * output->height();
-+    libyuv::ScalePlane_16(static_cast<uint16_t*>(input->data()) + inUVOffsetByte / sizeof(uint16_t),
-+                          input->stride() / 2,
-+                          input->width() / 2,
-+                          input->height() / 2,
-+                          static_cast<uint16_t*>(output->data()) + outUVOffsetByte / sizeof(uint16_t),
-+                          output->stride() / 2,
-+                          output->width() / 2,
-+                          output->height() / 2,
-+                          libyuv::kFilterNone);
-+
-+    return OK;
-+}
-+
-+status_t ImageProcessorCore::rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                         std::shared_ptr<camera3::Camera3Buffer> &output,
-+                                         int angle, std::vector<uint8_t> &rotateBuf)
-+{
-+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
-+         __func__, input->width(), input->height(), input->v4l2Fmt(),
-+         output->width(), output->height(), output->v4l2Fmt());
-+
-+    CheckError(output->width() != input->height() || output->height() != input->width(),
-+          BAD_VALUE, "output resolution mis-match [%d x %d] -> [%d x %d]",
-+          input->width(), input->height(), output->width(), output->height());
-+    CheckError((angle != 90 && angle != 270), BAD_VALUE, "angle value:%d is wrong", angle);
-+
-+    const uint8_t* inBuffer = static_cast<uint8_t*>(input->data());
-+    uint8_t* outBuffer = static_cast<uint8_t*>(output->data());
-+    int outW = output->width();
-+    int outH = output->height();
-+    int outStride = output->stride();
-+    int inW = input->width();
-+    int inH = input->height();
-+    int inStride = input->stride();
-+    if (rotateBuf.size() < input->size()) {
-+        rotateBuf.resize(input->size());
-+    }
-+
-+    // TODO: find a way to rotate NV12 directly.
-+    uint8_t* I420Buffer = rotateBuf.data();
-+
-+    if (mRotationMode[angle] == libyuv::RotationMode::kRotate0) {
-+        libyuv::CopyPlane(inBuffer, inStride, outBuffer, outStride, inW, inH);
-+        libyuv::CopyPlane(inBuffer + inH * inStride, inStride,
-+                          outBuffer + outH * outStride, outStride,
-+                          inW, inH / 2);
-+    } else {
-+        int ret = libyuv::NV12ToI420Rotate(
-+                      inBuffer, inStride, inBuffer + inH * inStride, inStride,
-+                      I420Buffer, outW,
-+                      I420Buffer + outW * outH, outW / 2,
-+                      I420Buffer + outW * outH * 5 / 4, outW / 2,
-+                      inW, inH, mRotationMode[angle]);
-+        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, rotate fail [%d]!", __func__, ret);
-+
-+        ret = libyuv::I420ToNV12(I420Buffer, outW,
-+                                 I420Buffer + outW * outH, outW / 2,
-+                                 I420Buffer + outW * outH * 5 / 4, outW / 2,
-+                                 outBuffer, outStride,
-+                                 outBuffer +  outStride * outH, outStride,
-+                                 outW, outH);
-+        CheckError((ret < 0), UNKNOWN_ERROR, "@%s, convert fail [%d]!", __func__, ret);
-+    }
-+
-+    return OK;
-+}
-+
-+status_t ImageProcessorCore::convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                          std::shared_ptr<camera3::Camera3Buffer> &output)
-+{
-+    LOG2("%s: src: %dx%d,format 0x%x, dest: %dx%d format 0x%x",
-+         __func__, input->width(), input->height(), input->v4l2Fmt(),
-+         output->width(), output->height(), output->v4l2Fmt());
-+
-+    switch (output->v4l2Fmt()) {
-+        case V4L2_PIX_FMT_YVU420:
-+            // XXX -> YV12
-+            ImageConverter::convertBuftoYV12(input->v4l2Fmt(), input->width(),
-+                                             input->height(), input->stride(),
-+                                             output->stride(), input->data(), output->data());
-+            break;
-+        case V4L2_PIX_FMT_NV21:
-+            // XXX -> NV21
-+            ImageConverter::convertBuftoNV21(input->v4l2Fmt(), input->width(),
-+                                             input->height(), input->stride(),
-+                                             output->stride(), input->data(), output->data());
-+            break;
-+        case V4L2_PIX_FMT_YUYV:
-+            // XXX -> YUYV
-+            ImageConverter::convertBuftoYUYV(input->v4l2Fmt(), input->width(),
-+                                             input->height(), input->stride(),
-+                                             output->stride(), input->data(), output->data());
-+            break;
-+        default:
-+            LOGE("%s: not implement for color conversion 0x%x -> 0x%x!",
-+                 __func__, input->v4l2Fmt(), output->v4l2Fmt());
-+            return UNKNOWN_ERROR;
-+    }
-+
-+    return OK;
-+}
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
-new file mode 100644
-index 000000000000..d874f371a696
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/image_process/chrome/ImageProcessorCore.h
-@@ -0,0 +1,44 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once
-+
-+#include <unordered_map>
-+#include "IImageProcessor.h"
-+
-+namespace icamera {
-+
-+class ImageProcessorCore : public IImageProcessor {
-+public:
-+    ImageProcessorCore();
-+    ~ImageProcessorCore();
-+
-+    virtual status_t cropFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                               std::shared_ptr<camera3::Camera3Buffer> &output);
-+    virtual status_t scaleFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                std::shared_ptr<camera3::Camera3Buffer> &output);
-+    virtual status_t rotateFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                 std::shared_ptr<camera3::Camera3Buffer> &output,
-+                                 int angle, std::vector<uint8_t> &rotateBuf);
-+    virtual status_t convertFrame(const std::shared_ptr<camera3::Camera3Buffer> &input,
-+                                  std::shared_ptr<camera3::Camera3Buffer> &output);
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(ImageProcessorCore);
-+
-+    std::unordered_map<int, libyuv::RotationMode> mRotationMode;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
-new file mode 100644
-index 000000000000..58676a31f0a7
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.cpp
-@@ -0,0 +1,409 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraDump"
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <dirent.h>
-+#include <iostream>
-+#include <fstream>
-+#include <sstream>
-+#include <math.h>
-+
-+#include "PlatformData.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+
-+#include "3a/AiqResult.h"
-+#include "3a/AiqResultStorage.h"
-+
-+using std::string;
-+using std::shared_ptr;
-+
-+namespace icamera {
-+
-+int  gDumpType = 0;
-+int  gDumpFormat = 0;
-+uint32_t gDumpSkipNum = 0;
-+uint32_t gDumpRangeMin = 0;
-+uint32_t gDumpRangeMax = 0;
-+int  gDumpFrequency = 1;
-+char gDumpPath[50];
-+bool gDumpRangeEnabled = false;
-+static const char *ModuleName[] = {
-+    "na",     // not available
-+    "sensor",
-+    "isys",
-+    "psys",
-+    "de-inter",
-+    "swip-op"
-+}; // map to the ModuleType
-+
-+static const char *StreamUsage[] = {
-+    "preview",
-+    "video",
-+    "still",
-+    "app",
-+}; // map to the StreamUsage
-+
-+void CameraDump::setDumpLevel(void)
-+{
-+    const char* PROP_CAMERA_HAL_DUMP      = "cameraDump";
-+    const char* PROP_CAMERA_HAL_DUMP_FORMAT = "cameraDumpFormat";
-+    const char* PROP_CAMERA_HAL_DUMP_PATH = "cameraDumpPath";
-+    const char* PROP_CAMERA_HAL_DUMP_SKIP_NUM = "cameraDumpSkipNum";
-+    const char* PROP_CAMERA_HAL_DUMP_RANGE = "cameraDumpRange";
-+    const char* PROP_CAMERA_HAL_DUMP_FREQUENCY = "cameraDumpFrequency";
-+
-+    // dump, it's used to dump images or some parameters to a file.
-+    char *dumpType = getenv(PROP_CAMERA_HAL_DUMP);
-+    if (dumpType) {
-+        gDumpType = strtoul(dumpType, nullptr, 0);
-+        LOGD("Dump type is 0x%x", gDumpType);
-+    }
-+
-+    char *dumpFormat = getenv(PROP_CAMERA_HAL_DUMP_FORMAT);
-+    if (dumpFormat) {
-+        gDumpFormat = strtoul(dumpFormat, nullptr, 0);
-+        LOGD("Dump format is 0x%x", gDumpFormat);
-+    }
-+
-+    char* cameraDumpPath = getenv(PROP_CAMERA_HAL_DUMP_PATH);
-+    snprintf(gDumpPath, sizeof(gDumpPath), "%s", "./");
-+    if (cameraDumpPath) {
-+        snprintf(gDumpPath, sizeof(gDumpPath), "%s", cameraDumpPath);
-+    }
-+
-+    char* cameraDumpSkipNum = getenv(PROP_CAMERA_HAL_DUMP_SKIP_NUM);
-+    if (cameraDumpSkipNum) {
-+        gDumpSkipNum = strtoul(cameraDumpSkipNum, nullptr, 0);
-+        LOGD("Dump skip num is %d", gDumpSkipNum);
-+    }
-+
-+    char* cameraDumpRange = getenv(PROP_CAMERA_HAL_DUMP_RANGE);
-+    if (cameraDumpRange) {
-+        int sz = strlen(cameraDumpRange);
-+        char dumpRange[sz + 1];
-+        char *savePtr = nullptr, *tablePtr = nullptr;
-+        MEMCPY_S(dumpRange, sz, cameraDumpRange, sz);
-+        dumpRange[sz] = '\0';
-+
-+        tablePtr = strtok_r(dumpRange, ",~-", &savePtr);
-+        if (tablePtr)
-+            gDumpRangeMin = strtoul(tablePtr, nullptr, 0);
-+
-+        tablePtr = strtok_r(nullptr, ",~-", &savePtr);
-+        if (tablePtr)
-+            gDumpRangeMax = strtoul(tablePtr, nullptr, 0);
-+
-+        gDumpRangeEnabled = true;
-+        LOGD("Dump range is %d-%d", gDumpRangeMin, gDumpRangeMax);
-+    }
-+
-+    char* cameraDumpFrequency = getenv(PROP_CAMERA_HAL_DUMP_FREQUENCY);
-+    if (cameraDumpFrequency) {
-+        gDumpFrequency = strtoul(cameraDumpFrequency, nullptr, 0);
-+        if (gDumpFrequency == 0)
-+            gDumpFrequency = 1;
-+        LOGD("Dump frequency is %d", gDumpFrequency);
-+    }
-+
-+    // the PG dump is implemented in libiacss
-+    if (gDumpType & DUMP_PSYS_PG) {
-+        const char* PROP_CAMERA_CSS_DEBUG     = "camera_css_debug";
-+        const char* PROP_CAMERA_CSS_DUMP_PATH = "camera_css_debug_dump_path";
-+
-+        char newCssDebugEnv[16];
-+        char *cssDebugEnv = getenv(PROP_CAMERA_CSS_DEBUG);
-+        int  cssDebugType = cssDebugEnv ? strtoul(cssDebugEnv, nullptr, 0) : 0;
-+        // defined in ia_log.h IA_CSS_LOG_LEVEL_DUMP = 64
-+        const int IA_CSS_LOG_LEVEL_DUMP = 64;
-+        snprintf(newCssDebugEnv, sizeof(newCssDebugEnv), "%d",
-+                (cssDebugType | IA_CSS_LOG_LEVEL_DUMP));
-+        // enable dump env in libiacss
-+        if (setenv(PROP_CAMERA_CSS_DEBUG, newCssDebugEnv, 1)) {
-+            LOGE("setenv error for %s, current value:%d\n", PROP_CAMERA_CSS_DEBUG,
-+                    cssDebugType);
-+        }
-+
-+        const char* cssDumpPath = getenv(PROP_CAMERA_CSS_DUMP_PATH);
-+        // set dump path to hal dump path
-+        if (setenv(PROP_CAMERA_CSS_DUMP_PATH, gDumpPath, 1)) {
-+            LOGE("setenv error for %s, current path:%s\n", PROP_CAMERA_CSS_DUMP_PATH,
-+                    cssDumpPath ? cssDumpPath : "null");
-+        }
-+    }
-+}
-+
-+bool CameraDump::isDumpTypeEnable(int dumpType)
-+{
-+    return gDumpType & dumpType;
-+}
-+
-+bool CameraDump::isDumpFormatEnable(int dumpFormat)
-+{
-+    return gDumpFormat & dumpFormat;
-+}
-+
-+const char* CameraDump::getDumpPath(void)
-+{
-+    return gDumpPath;
-+}
-+
-+void CameraDump::writeData(const void* data, int size, const char* fileName) {
-+    CheckError((data == nullptr || size == 0 || fileName == nullptr), VOID_VALUE, "Nothing needs to be dumped");
-+
-+    FILE *fp = fopen (fileName, "w+");
-+    CheckError(fp == nullptr, VOID_VALUE, "open dump file %s failed", fileName);
-+
-+    LOG1("Write data to file:%s", fileName);
-+    if ((fwrite(data, size, 1, fp)) != 1)
-+        LOGW("Error or short count writing %d bytes to %s", size, fileName);
-+    fclose (fp);
-+}
-+
-+static string getNamePrefix(int cameraId, ModuleType_t type, Port port, int sUsage = 0)
-+{
-+    const char* dumpPath   = CameraDump::getDumpPath();
-+    const char* sensorName = PlatformData::getSensorName(cameraId);
-+    char prefix[MAX_NAME_LEN] = {'\0'};
-+
-+    if ((sUsage >= static_cast<int>(ARRAY_SIZE(StreamUsage))) || (sUsage < 0)) {
-+        sUsage = 0;
-+    }
-+
-+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
-+        snprintf(prefix, (MAX_NAME_LEN - 1), "%s/name#%s_%s", dumpPath, sensorName, StreamUsage[sUsage]);
-+    } else {
-+        if (port == INVALID_PORT) {
-+            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_%s", dumpPath, cameraId,
-+                 sensorName, ModuleName[type], StreamUsage[sUsage]);
-+        } else {
-+            snprintf(prefix, (MAX_NAME_LEN - 1), "%s/cam%d_%s_%s_port%d_%s", dumpPath, cameraId,
-+                 sensorName, ModuleName[type], port, StreamUsage[sUsage]);
-+        }
-+    }
-+
-+    return string(prefix);
-+}
-+
-+static string getAiqSettingAppendix(int cameraId, long sequence)
-+{
-+    char settingAppendix[MAX_NAME_LEN] = {'\0'};
-+
-+    AiqResult* aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult(sequence));
-+    if (aiqResults == nullptr) {
-+        LOGW("%s: no result for sequence %ld! use the latest instead", __func__, sequence);
-+        aiqResults = const_cast<AiqResult*>(AiqResultStorage::getInstance(cameraId)->getAiqResult());
-+        CheckError((aiqResults == nullptr), string(settingAppendix), "Cannot find available aiq result.");
-+    }
-+
-+    ia_aiq_exposure_sensor_parameters *sensorExposure =
-+                                       aiqResults->mAeResults.exposures[0].sensor_exposure;
-+    ia_aiq_exposure_parameters *exposure =
-+                                       aiqResults->mAeResults.exposures[0].exposure;
-+
-+    CheckError((sensorExposure == nullptr || exposure == nullptr), string(settingAppendix), "Cannot find aiq exposures");
-+
-+    double ag = sensorExposure->analog_gain_code_global;
-+    double dg = sensorExposure->digital_gain_global;
-+    float ispDg = 1.0f;
-+
-+    LOG2("%s: original sensorExposure AG: %f, DG: %f, exposure: AG: %f, DG: %f",
-+           __func__, ag, dg, exposure->analog_gain, exposure->digital_gain);
-+
-+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
-+
-+        // Convert AG and DG per sensor for IQ Studio input.
-+        const int nSteps = 256;
-+        const char* sensorName = PlatformData::getSensorName(cameraId);
-+        ispDg = sensorExposure->digital_gain_global;
-+
-+        if (strstr(sensorName, "imx185") != nullptr) {
-+            LOG2("%s: AG and DG conversion made for %s.", __func__, sensorName);
-+            if ((double)sensorExposure->analog_gain_code_global * 0.3 > 24) {
-+                ag = 16.0 * nSteps;
-+                // real gain should be  pwd(10, (db value / 20))
-+                dg = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3 - 24) / 20);
-+            } else {
-+                ag = nSteps * pow(10, ((double)sensorExposure->analog_gain_code_global * 0.3) / 20);
-+                dg = 1.0 * nSteps;
-+            }
-+            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
-+        } else if (strstr(sensorName, "imx274") != nullptr) {
-+            ag = nSteps * exposure->analog_gain;
-+            dg = nSteps * PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
-+            ispDg = nSteps * PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
-+            LOG2("%s: converted AG: %f, DG: %f ispDG: %f for %s", __func__, ag, dg, ispDg, sensorName);
-+        }
-+
-+        if (aiqResults->mAeResults.num_exposures == 2) {
-+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d,%d",
-+                ag, dg, ispDg, exposure->exposure_time_us,
-+                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
-+        } else {
-+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "~ag#%.0f~dg#%.0f~cmnt#ispdg_%.0f~exp#%d",
-+                ag, dg, ispDg, exposure->exposure_time_us);
-+        }
-+    } else {
-+
-+        if (PlatformData::isUsingIspDigitalGain(cameraId)) {
-+            dg = PlatformData::getSensorDigitalGain(cameraId, exposure->digital_gain);
-+            ispDg = PlatformData::getIspDigitalGain(cameraId, exposure->digital_gain);
-+        }
-+
-+        if (aiqResults->mAeResults.num_exposures == 2) {
-+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d,%d",
-+                ag, dg, ispDg, exposure->exposure_time_us,
-+                aiqResults->mAeResults.exposures[1].exposure->exposure_time_us);
-+        } else {
-+            snprintf(settingAppendix, (MAX_NAME_LEN - 1), "_ag#%.0f_dg#%.0f_ispdg#%.3f_exp#%d",
-+                ag, dg, ispDg, exposure->exposure_time_us);
-+        }
-+    }
-+
-+    return string(settingAppendix);
-+}
-+
-+static string formatFrameFileName(const char *prefix,
-+                                  const char *appendix,
-+                                  const char *suffix,
-+                                  long sequence,
-+                                  int width, int height)
-+{
-+    char fileName[MAX_NAME_LEN] = {'\0'};
-+
-+    if (icamera::CameraDump::isDumpFormatEnable(DUMP_FORMAT_IQSTUDIO)) {
-+
-+        if (strstr(suffix, "GRBG") || strstr(suffix, "RGGB")
-+            || strstr(suffix, "GBRG") || strstr(suffix, "BGGR")) {
-+            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.raw",
-+                prefix, appendix, sequence);
-+        } else {
-+            snprintf(fileName, (MAX_NAME_LEN - 1), "%s~rev#v1~type#studio%s~msid#4442075~rep#%ld.%s",
-+                prefix, appendix, sequence, suffix);
-+        }
-+    } else {
-+
-+        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_frame_%04ld_%dx%d%s.%s",
-+             prefix, sequence, width, height, appendix, suffix);
-+    }
-+    return string(fileName);
-+}
-+
-+static string formatBinFileName(int cameraId, const char *prefix, BinParam_t *binParam)
-+{
-+    char fileName[MAX_NAME_LEN] = {'\0'};
-+    string appendix;
-+
-+    switch(binParam->bType) {
-+    case BIN_TYPE_GENERAL:
-+        snprintf(fileName, (MAX_NAME_LEN - 1), "%s_bin_%04ld_%s.bin",
-+                 prefix, binParam->sequence, binParam->gParam.appendix);
-+        break;
-+    case BIN_TYPE_STATISTIC:
-+        snprintf(fileName, (MAX_NAME_LEN - 1),
-+                 "%s_stat_%04ld_grid%dx%d_%s.bin",
-+                 prefix, binParam->sequence,
-+                 binParam->sParam.gridWidth, binParam->sParam.gridHeight,
-+                 binParam->sParam.appendix);
-+        break;
-+    case BIN_TYPE_SENSOR_METADATA:
-+        snprintf(fileName, (MAX_NAME_LEN - 1),
-+                 "%s_metadata_%04ld_%dx%d_plane%d.%s",
-+                 prefix, binParam->sequence,
-+                 binParam->mParam.width, binParam->mParam.height,
-+                 binParam->mParam.planeIdx,
-+                 CameraUtils::format2string(binParam->mParam.metaFormat).c_str());
-+        break;
-+    case BIN_TYPE_BUFFER:
-+        appendix = getAiqSettingAppendix(cameraId, binParam->sequence);
-+        return formatFrameFileName(prefix, appendix.c_str(),
-+                                   CameraUtils::format2string(binParam->bParam.format).c_str(),
-+                                   binParam->sequence,
-+                                   binParam->bParam.width, binParam->bParam.height);
-+
-+    default:
-+        LOGW("Unknow binary type:%d", binParam->bType);
-+        break;
-+    }
-+
-+    return string(fileName);
-+}
-+
-+void CameraDump::dumpImage(int cameraId, const shared_ptr<CameraBuffer> &camBuffer,
-+                           ModuleType_t type, Port port)
-+{
-+    CheckError(camBuffer == nullptr, VOID_VALUE, "invalid param");
-+
-+    if (camBuffer->getSequence() < gDumpSkipNum) return;
-+
-+    if (gDumpRangeEnabled &&
-+        (camBuffer->getSequence() < gDumpRangeMin
-+         || camBuffer->getSequence() > gDumpRangeMax)) {
-+        return;
-+    }
-+
-+    if (camBuffer->getSequence() % gDumpFrequency != 0) return;
-+
-+    string prefix   = getNamePrefix(cameraId, type, port, camBuffer->getUserBuffer()->s.usage);
-+    string appendix = getAiqSettingAppendix(cameraId, camBuffer->getSequence());
-+
-+    string fileName = formatFrameFileName(prefix.c_str(), appendix.c_str(),
-+                                          CameraUtils::format2string(camBuffer->getFormat()).c_str(),
-+                                          camBuffer->getSequence(),
-+                                          camBuffer->getWidth(), camBuffer->getHeight());
-+
-+    int fd = camBuffer->getFd();
-+    int bufferSize = camBuffer->getBufferSize();
-+    int memoryType = camBuffer->getMemory();
-+    void* pBuf = (memoryType == V4L2_MEMORY_DMABUF)
-+                    ? CameraBuffer::mapDmaBufferAddr(fd, bufferSize)
-+                    : camBuffer->getBufferAddr();
-+    LOGD("@%s, fd:%d, buffersize:%d, buf:%p, memoryType:%d, fileName:%s",
-+            __func__, fd, bufferSize, pBuf, memoryType, fileName.c_str());
-+    writeData(pBuf, bufferSize, fileName.c_str());
-+    if (memoryType == V4L2_MEMORY_DMABUF) {
-+        CameraBuffer::unmapDmaBufferAddr(pBuf, bufferSize);
-+    }
-+}
-+
-+void CameraDump::dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam)
-+{
-+    CheckError(binParam == nullptr, VOID_VALUE, "invalid param");
-+
-+    if (binParam->sequence < gDumpSkipNum) return;
-+
-+    if (gDumpRangeEnabled &&
-+        (binParam->sequence < gDumpRangeMin
-+         || binParam->sequence > gDumpRangeMax)) {
-+        return;
-+    }
-+
-+    if (binParam->sequence % gDumpFrequency != 0) return;
-+
-+    string prefix   = getNamePrefix(cameraId, binParam->mType, INVALID_PORT, binParam->sUsage);
-+    string fileName = formatBinFileName(cameraId, prefix.c_str(), binParam);
-+    LOG2("@%s, fileName:%s", __func__, fileName.c_str());
-+    writeData(data, size, fileName.c_str());
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/CameraDump.h b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
-new file mode 100644
-index 000000000000..3b51c84468b9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/CameraDump.h
-@@ -0,0 +1,170 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string.h>
-+#include <vector>
-+#include <string>
-+#include <linux/v4l2-subdev.h>
-+
-+#include "CameraTypes.h"
-+#include "CameraBuffer.h"
-+
-+namespace icamera {
-+
-+/**
-+ * global dump level
-+ * This global variable is set from system properties
-+ * It is used to control the type of frame dump
-+ */
-+extern int gDumpType;
-+extern char gDumpPath[50];
-+
-+// Dump bit mask definition
-+enum {
-+    // ISYS Buffer dump (bit[0-3])
-+    DUMP_ISYS_BUFFER =          1 << 0,
-+    // Reserve bit[1-3] for detailed buffer dump control
-+
-+    DUMP_JPEG_BUFFER =          1 << 3, // JPEG buffer
-+    // ISYS PG/PAL/Stats dump (bit[4-7])
-+    DUMP_ISYS_PAL =             1 << 4, // ISP param binary
-+    DUMP_ISYS_PG =              1 << 5, // ISYS whole PG dump assisted by libiacss
-+    DUMP_ISYS_ENCODED_STAT =    1 << 6, // p2p encoded statistics
-+    DUMP_ISYS_AIQ_STAT =        1 << 7, // rgbs_grid format stats for AIQ use
-+
-+    // PSYS dump (bit[8-11])
-+    DUMP_PSYS_OUTPUT_BUFFER =   1 << 8,
-+    DUMP_PSYS_INTERM_BUFFER =   1 << 9, // dump Psys intermediate buffers like PreGDC output
-+    // Reserve bit[10-11] for detailed buffer dump control
-+
-+    DUMP_AIQ_DVS_RESULT =       1 << 10, // dump dvs result
-+
-+    // PSYS PG/PAL/Stats dump (bit[12-15])
-+    DUMP_PSYS_PAL =             1 << 12, // ISP param binary
-+    DUMP_PSYS_PG =              1 << 13, // PSYS whole PG dump assisted by libiacss
-+    DUMP_PSYS_AIQ_STAT =        1 << 14, // rgbs_grid format stats for AIQ use
-+    DUMP_PSYS_DECODED_STAT =    1 << 15, // p2p decoded statistics
-+
-+    // Other dump
-+    DUMP_MIPI_BUFFER =          1 << 16, // e.g. export cameraDump=0x10000
-+    DUMP_UT_BUFFER =            1 << 17, // e.g. export cameraDump=0x20000
-+    DUMP_EMBEDDED_METADATA =    1 << 18,
-+    DUMP_DEINTERLACED_BUFFER =  1 << 19, // 0x80000  Decimal val 524288
-+    DUMP_SW_IMG_PROC_OUTPUT =   1 << 20, // 0x100000 Decimal val 1048576
-+
-+    // Pipe executors' dump
-+    DUMP_EXECUTOR_OUTPUT =   1 << 21, // 0x200000 Decimal val 2097152
-+
-+    // LTM output's dump
-+    DUMP_LTM_OUTPUT = 1 << 22, // 0x400000 Decimal val 4194304
-+
-+    DUMP_AAL_OUTPUT = 1 << 23, // 0x800000 Decimal val 8388608
-+    DUMP_AAL_INPUT = 1 << 24, // 0x1000000 Decimal val 16777216
-+};
-+
-+enum {
-+    DUMP_FORMAT_NORMAL =          1 << 0,  // Normal format
-+    DUMP_FORMAT_IQSTUDIO =        1 << 1,  // IQStudio format
-+};
-+
-+const int MAX_NAME_LEN = 256;
-+
-+typedef enum {
-+    M_NA,
-+    M_SENSOR, // MIPI frame dump
-+    M_ISYS,   // ISYS param, payload, frame dump
-+    M_PSYS,   // PSYS param, payload, frame dump
-+    M_DEINTR, // De-interlaced frame dump
-+    M_SWIPOP, // Sw Image processor frame dump
-+} ModuleType_t;
-+
-+typedef enum {
-+    BIN_TYPE_GENERAL,
-+    BIN_TYPE_STATISTIC,
-+    BIN_TYPE_SENSOR_METADATA,
-+    BIN_TYPE_BUFFER,
-+} BinType_t;
-+
-+typedef struct {
-+    const char* appendix;
-+} GeneralParam_t;
-+
-+typedef struct {
-+    int gridWidth;
-+    int gridHeight;
-+    const char* appendix;
-+} StatParam_t;
-+
-+typedef struct {
-+    int width;
-+    int height;
-+    int planeIdx;
-+    int metaFormat;
-+} SensorMetadataParam_t;
-+
-+typedef struct {
-+    int width;
-+    int height;
-+    int format;
-+} BufferParam_t;
-+
-+typedef struct {
-+    BinType_t       bType;
-+    ModuleType_t    mType;
-+    long sequence;
-+    union {
-+        GeneralParam_t        gParam;
-+        StatParam_t           sParam;
-+        SensorMetadataParam_t mParam;
-+        BufferParam_t         bParam;
-+    };
-+    int sUsage;
-+} BinParam_t;
-+
-+/**
-+ * Dump files with formated file name, put under getDumpPath()
-+ * Supported dump type:
-+ *   Image(RAW/YUV/RGB)
-+ *   PAL bin
-+ *   Decoded statistics
-+ *   Sensor Metadata
-+ * File name format example:
-+ * Path/cameraId_sensorName_isys(psys)_
-+ *      frame(pal/stats/)_sequence_resolution_appendix.suffix
-+ */
-+namespace CameraDump {
-+    /**
-+     * File dump control functions.
-+     */
-+    void setDumpLevel(void);
-+    bool isDumpTypeEnable(int dumpType);
-+    bool isDumpFormatEnable(int dumpFormat);
-+    void writeData(const void* data, int size, const char* fileName);
-+    const char* getDumpPath(void);
-+    /**
-+     * Dump image according to CameraBuffer properties
-+     */
-+    void dumpImage(int cameraId, const std::shared_ptr<CameraBuffer> &camBuffer,
-+                   ModuleType_t mType = M_NA, Port port = INVALID_PORT);
-+    /**
-+     * Dump any buffer to binary file
-+     */
-+    void dumpBinary(int cameraId, const void *data, int size, BinParam_t *binParam);
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
-new file mode 100644
-index 000000000000..01f7d29c3e11
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.cpp
-@@ -0,0 +1,270 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraLog"
-+
-+#include <sys/time.h>
-+#include <time.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <stdarg.h>
-+
-+#include "iutils/Utils.h"
-+
-+#include "CameraLog.h"
-+#include "Trace.h"
-+
-+namespace icamera {
-+int gLogLevel = 0;
-+char *gLogModules = nullptr;
-+int gPerfLevel = 0;
-+int gEnforceDvs = 0;
-+int gSlowlyRunRatio = 0;
-+bool gIsDumpMediaTopo = false;
-+bool gIsDumpMediaInfo = false;
-+
-+static void getLogTime(char *timeBuf, int bufLen)
-+{
-+    // The format of time is: 01-22 15:24:53.071
-+    struct timeval tv;
-+    gettimeofday(&tv, nullptr);
-+    time_t nowtime = tv.tv_sec;
-+    struct tm* nowtm = localtime(&nowtime);
-+    if (nowtm) { // If nowtm is nullptr, simply print nothing for time info
-+        char tmbuf[bufLen];
-+        CLEAR(tmbuf);
-+        strftime(tmbuf, bufLen, "%m-%d %H:%M:%S", nowtm);
-+        snprintf(timeBuf, bufLen, "%s.%03ld", tmbuf, tv.tv_usec/1000);
-+    }
-+}
-+
-+__attribute__((__format__ (__printf__, 3, 0)))
-+static void printLog(const char *module, const char *level, const char *fmt, va_list ap)
-+{
-+    // Add time into beginning of the log.
-+    const int BUF_LEN = 64;
-+    char timeBuf[BUF_LEN] = {'\0'};
-+
-+    getLogTime(timeBuf, BUF_LEN);
-+
-+    fprintf(stdout, "%s: [%s]: CamHAL_%s:", timeBuf, level, module);
-+    vfprintf(stdout, fmt, ap);
-+    fprintf(stdout, "\n");
-+}
-+
-+namespace Log {
-+
-+void setDebugLevel(void)
-+{
-+    const char* PROP_CAMERA_HAL_DEBUG = "cameraDebug";
-+    const char* PROP_CAMERA_HAL_MODULES = "cameraModules";
-+    const char* PROP_CAMERA_HAL_PERF  = "cameraPerf";
-+    const char* PROP_CAMERA_HAL_DVS = "cameraDvs";
-+    const char* PROP_CAMERA_RUN_RATIO = "cameraRunRatio";
-+
-+    // debug
-+    char *dbgLevel = getenv(PROP_CAMERA_HAL_DEBUG);
-+    if (dbgLevel) {
-+        gLogLevel = strtoul(dbgLevel, nullptr, 0);
-+        LOG1("Debug level is 0x%x", gLogLevel);
-+
-+        // to enable both LOG1 and LOG2 traces
-+        if (gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
-+            gLogLevel |= CAMERA_DEBUG_LOG_LEVEL1;
-+    }
-+
-+    char *slowlyRunRatio = getenv(PROP_CAMERA_RUN_RATIO);
-+    if (slowlyRunRatio) {
-+        gSlowlyRunRatio = strtoul(slowlyRunRatio, nullptr, 0);
-+        LOG1("Slow run ratio is 0x%x", gSlowlyRunRatio);
-+    }
-+
-+    //modules
-+    gLogModules = getenv(PROP_CAMERA_HAL_MODULES);
-+
-+    // performance
-+    char *perfLevel = getenv(PROP_CAMERA_HAL_PERF);
-+    if (perfLevel) {
-+        gPerfLevel = strtoul(perfLevel, nullptr, 0);
-+        LOGD("Performance level is 0x%x", gPerfLevel);
-+
-+        // bitmask of tracing categories
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES) {
-+            LOGD("Perf KPI start/end trace is not yet supported");
-+        }
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN) {
-+            LOGD("Perf KPI breakdown trace is not yet supported");
-+        }
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN) {
-+            LOGD("Perf IOCTL breakdown trace is not yet supported");
-+        }
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_PERF_MEMORY) {
-+            LOGD("Perf memory breakdown trace is not yet supported");
-+        }
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL) {
-+            gIsDumpMediaTopo = true;
-+        }
-+        if (gPerfLevel & CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL) {
-+            gIsDumpMediaInfo = true;
-+        }
-+        ScopedAtrace::setTraceLevel(gPerfLevel);
-+    }
-+
-+    // Enforce DVS for debugging
-+    char *dvs = getenv(PROP_CAMERA_HAL_DVS);
-+    if (dvs) {
-+        gEnforceDvs = strtoul(dvs, nullptr, 0);
-+        LOGD("EnforceDvs level is 0x%x", gEnforceDvs);
-+    }
-+}
-+
-+bool isDebugLevelEnable(int level)
-+{
-+    return gLogLevel & level;
-+}
-+
-+bool isModulePrintAble(const char *module)
-+{
-+    if (gLogModules == nullptr) {
-+        return true;
-+    } else if (strstr(gLogModules, module) != nullptr) {
-+        return true;
-+    } else {
-+        return false;
-+    }
-+}
-+
-+bool isDumpMediaTopo(void)
-+{
-+    return gIsDumpMediaTopo;
-+}
-+
-+bool isDumpMediaInfo(void)
-+{
-+    return gIsDumpMediaInfo;
-+}
-+
-+__attribute__((__format__ (__printf__, 4, 0)))
-+void print_log(bool enable, const char *module, const int level, const char *format, ...)
-+{
-+    if (!enable && (level != CAMERA_DEBUG_LOG_ERR))
-+        return;
-+
-+    if (!isModulePrintAble(module)) {
-+        return;
-+    }
-+
-+    const char *levelStr = nullptr;
-+    va_list arg;
-+    va_start(arg, format);
-+
-+    switch(level) {
-+        case CAMERA_DEBUG_LOG_LEVEL1:
-+            levelStr = "LV1";
-+        break;
-+        case CAMERA_DEBUG_LOG_LEVEL2:
-+            levelStr = "LV2";
-+        break;
-+        case CAMERA_DEBUG_LOG_REQ_STATE:
-+            levelStr = "REQ";
-+        break;
-+        case CAMERA_DEBUG_LOG_AIQ:
-+            levelStr = "AIQ";
-+        break;
-+        case CAMERA_DEBUG_LOG_XML:
-+            levelStr = "XML";
-+        break;
-+        case CAMERA_DEBUG_LOG_DBG:
-+            levelStr = "DBG";
-+        break;
-+        case CAMERA_DEBUG_LOG_INFO:
-+            levelStr = "INF";
-+        break;
-+        case CAMERA_DEBUG_LOG_ERR:
-+            levelStr = "ERR";
-+        break;
-+        case CAMERA_DEBUG_LOG_WARNING:
-+            levelStr = "WAR";
-+        break;
-+        case CAMERA_DEBUG_LOG_VERBOSE:
-+            levelStr = "VER";
-+        break;
-+        case CAMERA_DEBUG_LOG_VC_SYNC:
-+            levelStr = "VCSYNC";
-+        break;
-+        case CAMERA_DEBUG_LOG_GRAPH:
-+            levelStr = "GRAPH";
-+        break;
-+        default:
-+            levelStr = "UKN";
-+        break;
-+    }
-+
-+    printLog(module, levelStr, format, arg);
-+
-+    va_end(arg);
-+}
-+
-+__attribute__((__format__ (__printf__, 1, 0)))
-+void ccaPrintError(const char *fmt, va_list ap)
-+{
-+    printLog("CCA_DEBUG", "ERROR", fmt, ap);
-+}
-+
-+__attribute__((__format__ (__printf__, 1, 0)))
-+void ccaPrintInfo(const char *fmt, va_list ap)
-+{
-+    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
-+        printLog("CCA_DEBUG", "INFO", fmt, ap);
-+    }
-+}
-+
-+__attribute__((__format__ (__printf__, 1, 0)))
-+void ccaPrintDebug(const char *fmt, va_list ap)
-+{
-+    if (gLogLevel & CAMERA_DEBUG_LOG_AIQ) {
-+        printLog("CCA_DEBUG", "DBG", fmt, ap);
-+    }
-+}
-+
-+} // namespace Log
-+
-+#ifdef HAVE_ANDROID_OS
-+
-+void __camera_hal_log(bool condition, int prio, const char *tag,
-+                      const char *fmt, ...)
-+{
-+    if (condition) {
-+        va_list ap;
-+        va_start(ap, fmt);
-+        if (gLogLevel & CAMERA_DEBUG_LOG_PERSISTENT) {
-+            int errnoCopy;
-+            unsigned int maxTries = 20;
-+            do {
-+                errno = 0;
-+                __android_log_vprint(prio, tag, fmt, ap);
-+                errnoCopy = errno;
-+                if (errnoCopy == EAGAIN)
-+                    usleep(2000); /* sleep 2ms */
-+            } while(errnoCopy == EAGAIN && maxTries--);
-+        } else {
-+            __android_log_vprint(prio, tag, fmt, ap);
-+        }
-+    }
-+}
-+
-+#endif //HAVE_ANDROID_OS
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/CameraLog.h b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
-new file mode 100644
-index 000000000000..d45cac77f093
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/CameraLog.h
-@@ -0,0 +1,200 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <stdarg.h>
-+
-+#include "utils/ScopedAtrace.h"
-+#ifdef HAVE_ANDROID_OS
-+#include <log/log.h>
-+#endif
-+
-+namespace icamera {
-+/**
-+ * global log level
-+ * This global variable is set from system properties
-+ * It is used to control the level of verbosity of the traces in logcat
-+ * It is also used to store the status of certain RD features
-+ */
-+extern int gLogLevel;
-+extern int gPerfLevel;
-+extern int gEnforceDvs;
-+extern int gSlowlyRunRatio;
-+
-+/**
-+ * LOG levels
-+ *
-+ * LEVEL 1 is used to track events in the HAL that are relevant during
-+ * the operation of the camera, but are not happening on a per frame basis.
-+ * this ensures that the level of logging is not too verbose
-+ *
-+ * LEVEL 2 is used to track information on a per request basis
-+ *
-+ * REQ_STATE is used to track the state of each request. By state we mean a one
-+ * of the following request properties:
-+ *  - metadata result
-+ *  - buffer
-+ *  - shutter
-+ *  - error
-+ *
-+ * PERF TRACES enable only traces that provide performance metrics on the opera
-+ * tion of the HAL
-+ *
-+ * PERF TRACES BREAKDOWN provides further level of detail on the performance
-+ * metrics
-+ */
-+enum  {
-+    /* verbosity level of general traces */
-+    CAMERA_DEBUG_LOG_LEVEL1 = 1,
-+    CAMERA_DEBUG_LOG_LEVEL2 = 1 << 1,
-+
-+    /* Bitmask to enable a concrete set of traces */
-+    CAMERA_DEBUG_LOG_REQ_STATE = 1 << 2,
-+    CAMERA_DEBUG_LOG_AIQ = 1 << 3,
-+    CAMERA_DEBUG_LOG_XML = 1 << 4,
-+    CAMERA_DEBUG_LOG_VC_SYNC = 1 << 5,
-+    CAMERA_DEBUG_LOG_FPS = 1 << 6,
-+    CAMERA_DEBUG_LOG_KERNEL_TOGGLE = 1 << 8,
-+    CAMERA_DEBUG_LOG_SANDBOXING = 1 << 9,
-+
-+    /* Make logs persistent, retrying if logcat is busy */
-+    CAMERA_DEBUG_LOG_PERSISTENT = 1 << 12, /* 4096 */
-+
-+    /* reserved for any components */
-+    CAMERA_DEBUG_LOG_GRAPH = 1 << 13,
-+
-+    CAMERA_DEBUG_LOG_DBG = 1 <<16,
-+    CAMERA_DEBUG_LOG_INFO = 1 <<17,
-+    CAMERA_DEBUG_LOG_ERR = 1 <<18,
-+    CAMERA_DEBUG_LOG_WARNING = 1 <<19,
-+    CAMERA_DEBUG_LOG_VERBOSE = 1 <<20
-+};
-+
-+enum  {
-+    /* Emit well-formed performance traces */
-+    CAMERA_DEBUG_LOG_PERF_TRACES = 1,
-+
-+    /* Print out detailed timing analysis */
-+    CAMERA_DEBUG_LOG_PERF_TRACES_BREAKDOWN = 2,
-+
-+    /* Print out detailed timing analysis for IOCTL */
-+    CAMERA_DEBUG_LOG_PERF_IOCTL_BREAKDOWN = 1<<2,
-+
-+    /* Print out detailed memory information analysis for IOCTL */
-+    CAMERA_DEBUG_LOG_PERF_MEMORY = 1<<3,
-+
-+    /*enable camera atrace level 0 for camtune-record*/
-+    CAMERA_DEBUG_LOG_ATRACE_LEVEL0 = 1<<4,
-+
-+    /*enable media topology dump*/
-+    CAMERA_DEBUG_LOG_MEDIA_TOPO_LEVEL = 1<<5,
-+
-+    /*enable media controller info dump*/
-+    CAMERA_DEBUG_LOG_MEDIA_CONTROLLER_LEVEL = 1<<6,
-+
-+    /*enable camera imaging atrace level 1 for camtune-record*/
-+    CAMERA_DEBUG_LOG_ATRACE_LEVEL1 = 1<<7,
-+};
-+
-+enum {
-+    CAMERA_POWERBREAKDOWN_DISABLE_PREVIEW = 1<<0,
-+    CAMERA_POWERBREAKDOWN_DISABLE_FDFR = 1<<1,
-+    CAMERA_POWERBREAKDOWN_DISABLE_3A = 1<<2,
-+};
-+
-+namespace Log {
-+void setDebugLevel(void);
-+void print_log(bool enable, const char *module, const int level, const char *format, ...);
-+bool isDebugLevelEnable(int level);
-+bool isModulePrintAble(const char *module);
-+bool isDumpMediaTopo(void);
-+bool isDumpMediaInfo(void);
-+void ccaPrintError(const char *fmt, va_list ap);
-+void ccaPrintInfo(const char *fmt, va_list ap);
-+void ccaPrintDebug(const char *fmt, va_list ap);
-+};
-+
-+#define SLOWLY_MULTIPLIER (gSlowlyRunRatio ? gSlowlyRunRatio : 1)
-+
-+#ifdef HAVE_LINUX_OS //Linux OS
-+#define LOG1(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL1, format, ##args)
-+#define LOG2(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, LOG_TAG, CAMERA_DEBUG_LOG_LEVEL2, format, ##args)
-+#define LOGR(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, LOG_TAG, CAMERA_DEBUG_LOG_REQ_STATE, format, ##args)
-+#define LOG3A(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, LOG_TAG, CAMERA_DEBUG_LOG_AIQ, format, ##args)
-+#define LOGXML(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_XML, LOG_TAG, CAMERA_DEBUG_LOG_XML, format, ##args)
-+#define LOGVCSYNC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, LOG_TAG, CAMERA_DEBUG_LOG_VC_SYNC, format, ##args)
-+#define LOGG(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, LOG_TAG, CAMERA_DEBUG_LOG_GRAPH, format, ##args)
-+#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
-+
-+#define LOGD(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_DBG, format, ##args)
-+#define LOGI(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_INFO, format, ##args)
-+#define LOGE(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_ERR, format, ##args)
-+#define LOGW(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_WARNING, format, ##args)
-+#define LOGV(format, args...) Log::print_log(true, LOG_TAG, CAMERA_DEBUG_LOG_VERBOSE, format, ##args)
-+
-+#define ALOGE LOGE
-+#define ALOGD LOGD
-+#define ALOGI LOGI
-+#define ALOGW LOGW
-+#define ALOGV LOGV
-+#define ALOGW_IF
-+#define LOG_ALWAYS_FATAL_IF
-+#define LOG_FATAL_IF
-+
-+#else //Android OS
-+
-+void __camera_hal_log(bool condition, int prio, const char *tag, const char *fmt, ...);
-+
-+#define LOG1(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL1, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOG2(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGR(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_REQ_STATE, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOG3A(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_AIQ, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGXML(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_XML, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGVCSYNC(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGG(...) __camera_hal_log(gLogLevel & CAMERA_DEBUG_LOG_GRAPH, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGIPC(format, args...) Log::print_log(gLogLevel & CAMERA_DEBUG_LOG_SANDBOXING, LOG_TAG, CAMERA_DEBUG_LOG_SANDBOXING, format, ##args)
-+
-+#define LOGE(...) __camera_hal_log(true, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
-+#define LOGI(...) __camera_hal_log(true, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-+#define LOGD(...) __camera_hal_log(true, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
-+#define LOGW(...) __camera_hal_log(true, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
-+#define LOGV(...) __camera_hal_log(true, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
-+
-+#endif
-+#define HAL_TRACE_NAME(level, name) ScopedTrace ___tracer(level, name )
-+#define HAL_TRACE_CALL(level) HAL_TRACE_NAME(level, __PRETTY_FUNCTION__)
-+
-+class ScopedTrace {
-+    public:
-+        inline ScopedTrace(int level, const char* name) :
-+            mLevel(level),
-+            mName(name) {
-+                if ((mLevel <= gLogLevel) && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
-+                    LOGD("ENTER-%s",name);
-+            }
-+
-+        inline ~ScopedTrace() {
-+                if ((mLevel <= gLogLevel)  && !(gLogLevel & CAMERA_DEBUG_LOG_VC_SYNC))
-+                    LOGD("EXIT-%s", mName);
-+        }
-+
-+    private:
-+        int mLevel;
-+        const char* mName;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/Errors.h b/camera/hal/intel/ipu6/src/iutils/Errors.h
-new file mode 100644
-index 000000000000..8ef824f04fcc
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Errors.h
-@@ -0,0 +1,65 @@
-+/*
-+ * Copyright (C) 2007 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <sys/types.h>
-+#include <errno.h>
-+
-+namespace icamera {
-+
-+typedef int         status_t;
-+
-+/*
-+ * Error codes.
-+ * All error codes are negative values.
-+ */
-+
-+enum {
-+    OK                  = 0,    // Everything's swell.
-+
-+    UNKNOWN_ERROR       = (-2147483647-1), // INT32_MIN value
-+
-+    NO_MEMORY           = -ENOMEM,
-+    INVALID_OPERATION   = -ENOSYS,
-+    BAD_VALUE           = -EINVAL,
-+    BAD_TYPE            = (UNKNOWN_ERROR + 1),
-+    NAME_NOT_FOUND      = -ENOENT,
-+    PERMISSION_DENIED   = -EPERM,
-+    NO_INIT             = -ENODEV,
-+    ALREADY_EXISTS      = -EEXIST,
-+    DEAD_OBJECT         = -EPIPE,
-+    FAILED_TRANSACTION  = (UNKNOWN_ERROR + 2),
-+    JPARKS_BROKE_IT     = -EPIPE,
-+#if !defined(HAVE_MS_C_RUNTIME)
-+    BAD_INDEX           = -EOVERFLOW,
-+    NOT_ENOUGH_DATA     = -ENODATA,
-+    WOULD_BLOCK         = -EWOULDBLOCK,
-+    TIMED_OUT           = -ETIMEDOUT,
-+    UNKNOWN_TRANSACTION = -EBADMSG,
-+#else
-+    BAD_INDEX           = -E2BIG,
-+    NOT_ENOUGH_DATA     = (UNKNOWN_ERROR + 3),
-+    WOULD_BLOCK         = (UNKNOWN_ERROR + 4),
-+    TIMED_OUT           = (UNKNOWN_ERROR + 5),
-+    UNKNOWN_TRANSACTION = (UNKNOWN_ERROR + 6),
-+#endif
-+    FDS_NOT_ALLOWED     = (UNKNOWN_ERROR + 7),
-+    NO_ENTRY            = (UNKNOWN_ERROR + 8),
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/RWLock.h b/camera/hal/intel/ipu6/src/iutils/RWLock.h
-new file mode 100644
-index 000000000000..2082811ec9be
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/RWLock.h
-@@ -0,0 +1,98 @@
-+/*
-+ * Copyright (C) 2007 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "Errors.h"
-+
-+#if defined(HAVE_PTHREADS)
-+#include <pthread.h>
-+#endif
-+
-+// ---------------------------------------------------------------------------
-+namespace icamera {
-+// ---------------------------------------------------------------------------
-+
-+#if defined(HAVE_PTHREADS)
-+
-+/*
-+ * Simple mutex class.  The implementation is system-dependent.
-+ *
-+ * The mutex must be unlocked by the thread that locked it.  They are not
-+ * recursive, i.e. the same thread can't lock it multiple times.
-+ */
-+class RWLock {
-+public:
-+                RWLock() {};
-+                ~RWLock();
-+
-+    status_t    readLock();
-+    status_t    tryReadLock();
-+    status_t    writeLock();
-+    status_t    tryWriteLock();
-+    void        unlock();
-+
-+    class AutoRLock {
-+    public:
-+        inline AutoRLock(RWLock& rwlock) : mLock(rwlock)  { mLock.readLock(); }
-+        inline ~AutoRLock() { mLock.unlock(); }
-+    private:
-+        RWLock& mLock;
-+    };
-+
-+    class AutoWLock {
-+    public:
-+        inline AutoWLock(RWLock& rwlock) : mLock(rwlock)  { mLock.writeLock(); }
-+        inline ~AutoWLock() { mLock.unlock(); }
-+    private:
-+        RWLock& mLock;
-+    };
-+
-+private:
-+    // A RWLock cannot be copied
-+                RWLock(const RWLock&);
-+   RWLock&      operator = (const RWLock&);
-+
-+   pthread_rwlock_t mRWLock = PTHREAD_RWLOCK_INITIALIZER;
-+};
-+
-+inline RWLock::~RWLock() {
-+    pthread_rwlock_destroy(&mRWLock);
-+}
-+inline status_t RWLock::readLock() {
-+    return -pthread_rwlock_rdlock(&mRWLock);
-+}
-+inline status_t RWLock::tryReadLock() {
-+    return -pthread_rwlock_tryrdlock(&mRWLock);
-+}
-+inline status_t RWLock::writeLock() {
-+    return -pthread_rwlock_wrlock(&mRWLock);
-+}
-+inline status_t RWLock::tryWriteLock() {
-+    return -pthread_rwlock_trywrlock(&mRWLock);
-+}
-+inline void RWLock::unlock() {
-+    pthread_rwlock_unlock(&mRWLock);
-+}
-+
-+#endif // HAVE_PTHREADS
-+typedef RWLock::AutoRLock AutoRMutex;
-+typedef RWLock::AutoWLock AutoWMutex;
-+
-+// ---------------------------------------------------------------------------
-+} // namespace icamera
-+// ---------------------------------------------------------------------------
-diff --git a/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
-new file mode 100644
-index 000000000000..13533c7bc43d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/ScopedAtrace.cpp
-@@ -0,0 +1,63 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "utils/ScopedAtrace.h"
-+#include "Trace.h"
-+
-+namespace icamera {
-+
-+const int ATRACE_LEN = 128;
-+int gScopedAtraceLevel = 0;
-+
-+ScopedAtrace::ScopedAtrace(const int level, const char* func, const char* tag,
-+                           const char* note, long value, const char* note2,
-+                           int value2, const char* note3, int value3)
-+{
-+    mEnableAtraceEnd = false;
-+    if(gScopedAtraceLevel & level) {
-+        char buf[ATRACE_LEN];
-+        if (value < 0 || note == nullptr) {
-+            snprintf(buf, ATRACE_LEN, "<%s,%s>", func, tag);
-+            atrace_begin(ATRACE_TAG, buf);
-+        } else if (value2 < 0 || note2 == nullptr) {
-+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld)", func, tag, note, value);
-+            atrace_begin(ATRACE_TAG, buf);
-+        } else if (value3 < 0 || note3 == nullptr) {
-+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d)", func, tag, note,
-+                     value, note2, value2);
-+            atrace_begin(ATRACE_TAG, buf);
-+        } else {
-+            snprintf(buf, ATRACE_LEN, "<%s,%s>:%s(%ld) %s(%d) %s(%d)", func, tag,
-+                     note, value, note2, value2, note3, value3);
-+            atrace_begin(ATRACE_TAG, buf);
-+        }
-+        mEnableAtraceEnd = true;
-+    }
-+}
-+
-+ScopedAtrace::~ScopedAtrace()
-+{
-+    if(mEnableAtraceEnd) {
-+        atrace_end(ATRACE_TAG);
-+    }
-+}
-+
-+void ScopedAtrace::setTraceLevel(int level)
-+{
-+    gScopedAtraceLevel = level;
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
-new file mode 100644
-index 000000000000..a6e63c6beffd
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.cpp
-@@ -0,0 +1,406 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SwImageConverter"
-+
-+#include "Errors.h"
-+#include "Utils.h"
-+#include "CameraLog.h"
-+#include "SwImageConverter.h"
-+
-+namespace icamera {
-+
-+void SwImageConverter::RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
-+     unsigned char *Y, unsigned char *U, unsigned char *V)
-+{
-+    int Rp, Gp, Bp;
-+    int oY, oU, oV;
-+    Rp = R; Gp = G; Bp = B;
-+    oY = (257 * Rp + 504 * Gp + 98 * Bp) / 4000 + 16;
-+    oU = (-148 * Rp - 291 * Gp + 439 * Bp) / 4000 + 128;
-+    oV = (439 * Rp - 368 * Gp - 71 * Bp) / 4000 + 128;
-+    if (oY > 255) oY = 255;
-+    if (oY < 0) oY = 0;
-+    if (oU > 255) oU = 255;
-+    if (oU < 0) oU = 0;
-+    if (oV > 255) oV = 255;
-+    if (oV < 0) oV = 0;
-+    *Y = (unsigned char)oY;
-+    *U = (unsigned char)oU;
-+    *V = (unsigned char)oV;
-+}
-+
-+void SwImageConverter::YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
-+    unsigned short *R, unsigned short *G, unsigned short *B)
-+{
-+    int Yp, Up, Vp, Ypp;
-+    int oR, oG, oB;
-+    Yp = Y - 16;
-+    Up = (U - 128);
-+    Vp = (V - 128);
-+    Ypp = 9535 * Yp;
-+
-+    oB = (Ypp + 16531 * Up) >> 11;
-+    oG = (Ypp - 6660 * Vp - 3203 * Up) >> 11;
-+    oR = (Ypp + 13074 * Vp) >> 11;
-+    if (oR > 1023) oR = 1023;
-+    if (oR < 0) oR = 0;
-+    if (oG > 1023) oG = 1023;
-+    if (oG < 0) oG = 0;
-+    if (oB > 1023) oB = 1023;
-+    if (oB < 0) oB = 0;
-+    *R = (unsigned short)oR;
-+    *G = (unsigned short)oG;
-+    *B = (unsigned short)oB;
-+}
-+
-+void SwImageConverter::convertBayerBlock(unsigned int x, unsigned int y,
-+    unsigned int width, unsigned int height,
-+    unsigned short bayer_data[4], unsigned char *out_buf,
-+    unsigned int src_fmt, unsigned int dst_fmt)
-+{
-+    unsigned char *Ybase;
-+    unsigned char *UVbase;
-+    unsigned char Y, U, V;
-+    unsigned short R, Gr, Gb, B;
-+    switch (src_fmt) {
-+        case V4L2_PIX_FMT_SRGGB8: R = bayer_data[0] << 2; Gr = bayer_data[1] << 2; Gb = bayer_data[2] << 2; B = bayer_data[3] << 2; break;
-+        case V4L2_PIX_FMT_SGRBG8: Gr = bayer_data[0] << 2; R = bayer_data[1] << 2; B = bayer_data[2] << 2; Gb = bayer_data[3] << 2; break;
-+        case V4L2_PIX_FMT_SGBRG8: Gb = bayer_data[0] << 2; B = bayer_data[1] << 2; R = bayer_data[2] << 2; Gr = bayer_data[3] << 2; break;
-+        case V4L2_PIX_FMT_SBGGR8: B = bayer_data[0] << 2; Gb = bayer_data[1] << 2; Gr = bayer_data[2] << 2; R = bayer_data[3] << 2; break;
-+        case V4L2_PIX_FMT_SRGGB10: R = bayer_data[0]; Gr = bayer_data[1]; Gb = bayer_data[2]; B = bayer_data[3]; break;
-+        case V4L2_PIX_FMT_SGRBG10: Gr = bayer_data[0]; R = bayer_data[1]; B = bayer_data[2]; Gb = bayer_data[3]; break;
-+        case V4L2_PIX_FMT_SGBRG10: Gb = bayer_data[0]; B = bayer_data[1]; R = bayer_data[2]; Gr = bayer_data[3]; break;
-+        case V4L2_PIX_FMT_SBGGR10: B = bayer_data[0]; Gb = bayer_data[1]; Gr = bayer_data[2]; R = bayer_data[3]; break;
-+        case V4L2_PIX_FMT_SRGGB12: R = bayer_data[0] >> 2; Gr = bayer_data[1] >> 2; Gb = bayer_data[2] >> 2; B = bayer_data[3] >> 2; break;
-+        case V4L2_PIX_FMT_SGRBG12: Gr = bayer_data[0] >> 2; R = bayer_data[1] >> 2; B = bayer_data[2] >> 2; Gb = bayer_data[3] >> 2; break;
-+        case V4L2_PIX_FMT_SGBRG12: Gb = bayer_data[0] >> 2; B = bayer_data[1] >> 2; R = bayer_data[2] >> 2; Gr = bayer_data[3] >> 2; break;
-+        case V4L2_PIX_FMT_SBGGR12: B = bayer_data[0] >> 2; Gb = bayer_data[1] >> 2; Gr = bayer_data[2] >> 2; R = bayer_data[3] >> 2; break;
-+        default: return;
-+    }
-+
-+    int dstStride = CameraUtils::getStride(dst_fmt, width);
-+    switch(dst_fmt) {
-+        case V4L2_PIX_FMT_SRGGB8:
-+            out_buf[y * dstStride + x] = (R >> 2);
-+            out_buf[y * dstStride + x + 1] = (Gr >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (Gb >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SGRBG8:
-+            out_buf[y * dstStride + x] = (Gr >> 2);
-+            out_buf[y * dstStride + x + 1] = (R >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (B >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (Gb >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SGBRG8:
-+            out_buf[y * dstStride + x] = (Gb >> 2);
-+            out_buf[y * dstStride + x + 1] = (B >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (R >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (Gr >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SBGGR8:
-+            out_buf[y * dstStride + x] = (B >> 2);
-+            out_buf[y * dstStride + x + 1] = (Gb >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (Gr >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SRGGB10:
-+            *((unsigned short *) out_buf + y * dstStride + x) = R;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gr;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gb;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
-+            break;
-+        case V4L2_PIX_FMT_SGRBG10:
-+            *((unsigned short *) out_buf + y * dstStride + x) = Gr;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gb;
-+            break;
-+        case V4L2_PIX_FMT_SGBRG10:
-+            *((unsigned short *) out_buf + y * dstStride + x) = Gb;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = Gr;
-+            break;
-+        case V4L2_PIX_FMT_SBGGR10:
-+            *((unsigned short *) out_buf + y * dstStride + x) = B;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = Gb;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = Gr;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
-+            break;
-+        case V4L2_PIX_FMT_NV12:
-+            Ybase = out_buf;
-+            UVbase = Ybase + dstStride * height;
-+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
-+            Ybase[y * dstStride + x] = Ybase[y * dstStride + x + 1] =
-+                Ybase[(y + 1) * dstStride + x] = Ybase[(y + 1) * dstStride + x + 1] = Y;
-+            UVbase[y / 2 * dstStride + x / 2 * 2] = U;
-+            UVbase[y / 2 * dstStride + x / 2 * 2 + 1] = V;
-+            break;
-+        case V4L2_PIX_FMT_UYVY:
-+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
-+            out_buf[y * dstStride + x * 2] = U;
-+            out_buf[y * dstStride + x * 2 + 1] = Y;
-+            out_buf[y * dstStride + x * 2 + 2] = V;
-+            out_buf[y * dstStride + x * 2 + 3] = Y;
-+            out_buf[(y + 1) * dstStride + x * 2] = U;
-+            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y;
-+            out_buf[(y + 1) * dstStride + x * 2 + 2] = V;
-+            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y;
-+            break;
-+        case V4L2_PIX_FMT_YUYV:
-+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
-+            out_buf[y * dstStride + x * 2] = Y;
-+            out_buf[y * dstStride + x * 2 + 1] = U;
-+            out_buf[y * dstStride + x * 2 + 2] = Y;
-+            out_buf[y * dstStride + x * 2 + 3] = V;
-+            out_buf[(y + 1) * dstStride + x * 2] = Y;
-+            out_buf[(y + 1) * dstStride + x * 2 + 1] = U;
-+            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y;
-+            out_buf[(y + 1) * dstStride + x * 2 + 3] = V;
-+            break;
-+        case V4L2_PIX_FMT_YUV420:
-+        {
-+            RGB2YUV(R, (Gr + Gb) / 2, B, &Y, &U, &V);
-+            Ybase = out_buf;
-+            uint8_t* UBase = out_buf + dstStride * height;
-+            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
-+            Ybase[y * dstStride + x] = Y;
-+            Ybase[y * dstStride + x + 1] = Y;
-+            Ybase[(y + 1) * dstStride + x] = Y;
-+            Ybase[(y + 1) * dstStride + x + 1] = Y;
-+            if (y % 4 == 0) {
-+                UBase[y / 4 * dstStride + x / 2] = U;
-+                VBase[y / 4 * dstStride + x / 2] = V;
-+            } else {
-+                UBase[y / 4 * dstStride + width / 2 + x / 2] = U;
-+                VBase[y / 4 * dstStride + width / 2 + x / 2] = V;
-+            }
-+            break;
-+        }
-+        default:
-+            break;
-+    }
-+}
-+
-+void SwImageConverter::convertYuvBlock(unsigned int x, unsigned int y,
-+    unsigned int width, unsigned int height,
-+    unsigned char *in_buf, unsigned char *out_buf,
-+    unsigned int src_fmt, unsigned int dst_fmt)
-+{
-+    unsigned char *YBase;
-+    unsigned char *UVBase;
-+    unsigned char Y[4];
-+    unsigned char U[4];
-+    unsigned char V[4];
-+    unsigned short R, G, B;
-+    int srcStride = CameraUtils::getStride(src_fmt, width);
-+
-+    switch(src_fmt) {
-+        case V4L2_PIX_FMT_NV12:
-+            YBase = in_buf;
-+            UVBase = in_buf + srcStride * height;
-+            Y[0] = YBase[y * srcStride + x];
-+            Y[1] = YBase[y * srcStride + x + 1];
-+            Y[2] = YBase[(y + 1) * srcStride + x];
-+            Y[3] = YBase[(y + 1) * srcStride + x + 1];
-+            U[0] = U[1] = U[2] = U[3] = UVBase[y / 2 * srcStride + x / 2 * 2];
-+            V[0] = V[1] = V[2] = V[3] = UVBase[y / 2 * srcStride + x / 2 * 2 + 1];
-+            break;
-+        case V4L2_PIX_FMT_UYVY:
-+            Y[0] = in_buf[y * srcStride + x * 2 + 1];
-+            Y[1] = in_buf[y * srcStride + x * 2 + 3];
-+            Y[2] = in_buf[(y + 1) * srcStride + x * 2 + 1];
-+            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
-+            U[0] = U[1] = in_buf[y * srcStride + x * 2];
-+            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2];
-+            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 2];
-+            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
-+            break;
-+        case V4L2_PIX_FMT_YUYV:
-+            Y[0] = in_buf[y * srcStride + x * 2];
-+            Y[1] = in_buf[y * srcStride + x * 2 + 2];
-+            Y[2] = in_buf[(y + 1) * srcStride + x * 2];
-+            Y[3] = in_buf[(y + 1) * srcStride + x * 2 + 2];
-+            U[0] = U[1] = in_buf[y * srcStride + x * 2 + 1];
-+            U[2] = U[3] = in_buf[(y + 1) * srcStride + x * 2 + 1];
-+            V[0] = V[1] = in_buf[y * srcStride + x * 2 + 3];
-+            V[2] = V[3] = in_buf[(y + 1) * srcStride + x * 2 + 3];
-+            break;
-+        default:
-+            return;
-+    }
-+
-+    int dstStride = CameraUtils::getStride(dst_fmt, width);
-+    switch(dst_fmt) {
-+        case V4L2_PIX_FMT_NV12:
-+            YBase = out_buf;
-+            UVBase = out_buf + dstStride * height;
-+            YBase[y * dstStride + x] = Y[0];
-+            YBase[y * dstStride + x + 1] = Y[1];
-+            YBase[(y + 1) * dstStride + x] = Y[2];
-+            YBase[(y + 1) * dstStride + x + 1] = Y[3];
-+            UVBase[y / 2 * dstStride + x / 2 * 2] = U[0];
-+            UVBase[y / 2 * dstStride + x / 2 * 2 + 1] = V[0];
-+            break;
-+        case V4L2_PIX_FMT_UYVY:
-+            out_buf[y * dstStride + x * 2 + 1] = Y[0];
-+            out_buf[y * dstStride + x * 2 + 3] = Y[1];
-+            out_buf[(y + 1) * dstStride + x * 2 + 1] = Y[2];
-+            out_buf[(y + 1) * dstStride + x * 2 + 3] = Y[3];
-+            out_buf[y * dstStride + x * 2] = U[0];
-+            out_buf[(y + 1) * dstStride + x * 2] = U[2];
-+            out_buf[y * dstStride + x * 2 + 2] = V[0];
-+            out_buf[(y + 1) * dstStride + x * 2 + 2] = V[2];
-+            break;
-+        case V4L2_PIX_FMT_YUYV:
-+            out_buf[y * dstStride + x * 2] = Y[0];
-+            out_buf[y * dstStride + x * 2 + 2] = Y[1];
-+            out_buf[(y + 1) * dstStride + x * 2] = Y[2];
-+            out_buf[(y + 1) * dstStride + x * 2 + 2] = Y[3];
-+            out_buf[y * dstStride + x * 2 + 1] = U[0];
-+            out_buf[(y + 1) * dstStride + x * 2 + 1] = U[2];
-+            out_buf[y * dstStride + x * 2 + 3] = V[0];
-+            out_buf[(y + 1) * dstStride + x * 2 + 3] = V[2];
-+            break;
-+        case V4L2_PIX_FMT_YUV420:
-+        {
-+            YBase = out_buf;
-+            uint8_t* UBase = out_buf + dstStride * height;
-+            uint8_t* VBase = out_buf + dstStride * (height + height / 4);
-+            YBase[y * dstStride + x] = Y[0];
-+            YBase[y * dstStride + x + 1] = Y[1];
-+            YBase[(y + 1) * dstStride + x] = Y[2];
-+            YBase[(y + 1) * dstStride + x + 1] = Y[3];
-+            if (y % 4 == 0) {
-+                UBase[y / 4 * dstStride + x / 2] = (U[0] + U[2]) / 2;
-+                VBase[y / 4 * dstStride + x / 2] = (V[0] + V[2]) / 2;
-+            } else {
-+                UBase[y / 4 * dstStride + width / 2 + x / 2] = (U[0] + U[2]) / 2;
-+                VBase[y / 4 * dstStride + width / 2 + x / 2] = (V[0] + V[2]) / 2;
-+            }
-+            break;
-+        }
-+        case V4L2_PIX_FMT_SRGGB8:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            out_buf[y * dstStride + x] = (R >> 2);
-+            out_buf[y * dstStride + x + 1] = (G >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (G >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (B >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SGRBG8:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            out_buf[y * dstStride + x] = (G >> 2);
-+            out_buf[y * dstStride + x + 1] = (R >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (B >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SGBRG8:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            out_buf[y * dstStride + x] = (G >> 2);
-+            out_buf[y * dstStride + x + 1] = (B >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (R >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (G >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SBGGR8:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            out_buf[y * dstStride + x] = (B >> 2);
-+            out_buf[y * dstStride + x + 1] = (G >> 2);
-+            out_buf[(y + 1) * dstStride + x] = (G >> 2);
-+            out_buf[(y + 1) * dstStride + x + 1] = (R >> 2);
-+            break;
-+        case V4L2_PIX_FMT_SRGGB10:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            *((unsigned short *) out_buf + y * dstStride + x) = R;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = B;
-+            break;
-+        case V4L2_PIX_FMT_SGRBG10:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            *((unsigned short *) out_buf + y * dstStride + x) = G;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = R;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = B;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
-+            break;
-+        case V4L2_PIX_FMT_SGBRG10:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            *((unsigned short *) out_buf + y * dstStride + x) = G;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = B;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = R;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = G;
-+            break;
-+        case V4L2_PIX_FMT_SBGGR10:
-+            YUV2RGB(Y[0], U[0], V[0], &R, &G, &B);
-+            *((unsigned short *) out_buf + y * dstStride + x) = B;
-+            *((unsigned short *) out_buf + y * dstStride + x + 1) = G;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x) = G;
-+            *((unsigned short *) out_buf + (y + 1) * dstStride + x + 1) = R;
-+            break;
-+        default:
-+            return;
-+    }
-+}
-+
-+int SwImageConverter::convertFormat(unsigned int width, unsigned int height,
-+                        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
-+                        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt)
-+{
-+    CheckError((inBuf == nullptr || outBuf == nullptr), BAD_VALUE, "Invalid input(%p) or output buffer(%p)", inBuf, outBuf);
-+
-+    unsigned int x, y;
-+    unsigned short bayer_data[4];
-+
-+    LOG2("%s srcFmt %s => dstFmt %s %dx%d", __func__,
-+         CameraUtils::format2string(srcFmt).c_str(),
-+         CameraUtils::format2string(dstFmt).c_str(), width, height);
-+
-+    if (dstFmt == srcFmt) {
-+        // No need do format convertion.
-+        LOG2("No conversion needed");
-+        MEMCPY_S(outBuf, outLength, inBuf, inLength);
-+        return 0;
-+    }
-+
-+    // for not vector raw
-+    int srcStride = CameraUtils::getStride(srcFmt, width);
-+    for(y = 0; y < height; y += 2) {
-+        for(x = 0; x < width; x += 2) {
-+            if(CameraUtils::isRaw(srcFmt)) {
-+                if(CameraUtils::getBpp(srcFmt) == 8) {
-+                    bayer_data[0] = inBuf[y * srcStride + x];
-+                    bayer_data[1] = inBuf[y * srcStride + x + 1];
-+                    bayer_data[2] = inBuf[(y + 1) * srcStride + x];
-+                    bayer_data[3] = inBuf[(y + 1) * srcStride + x + 1];
-+                } else {
-+                    int offset = srcStride / (CameraUtils::getBpp(srcFmt) / 8);
-+                    bayer_data[0] = *((unsigned short *) inBuf + y * offset + x);
-+                    bayer_data[1] = *((unsigned short *) inBuf + y * offset + x + 1);
-+                    bayer_data[2] = *((unsigned short *) inBuf + (y + 1) * offset + x);
-+                    bayer_data[3] =
-+                        *((unsigned short *) inBuf + (y + 1) * offset + x + 1);
-+                }
-+                convertBayerBlock(x, y, width, height, bayer_data, outBuf, srcFmt, dstFmt);
-+            } else {
-+                convertYuvBlock(x, y, width, height, inBuf, outBuf, srcFmt, dstFmt);
-+            }
-+        }
-+    }
-+    return 0;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
-new file mode 100644
-index 000000000000..591f5b4029a8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/SwImageConverter.h
-@@ -0,0 +1,42 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace icamera {
-+
-+namespace SwImageConverter {
-+    void RGB2YUV(unsigned short R, unsigned short G, unsigned short B,
-+         unsigned char *Y, unsigned char *U, unsigned char *V);
-+
-+    void YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
-+        unsigned short *R, unsigned short *G, unsigned short *B);
-+
-+    void convertBayerBlock(unsigned int x, unsigned int y,
-+        unsigned int width, unsigned int height, unsigned short bayer_data[4],
-+        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
-+
-+    void convertYuvBlock(unsigned int x, unsigned int y,
-+        unsigned int width, unsigned int height, unsigned char *in_buf,
-+        unsigned char *out_buf, unsigned int src_fmt, unsigned int dst_fmt);
-+
-+    //convert the buffer from the src_fmt to the dst_fmt
-+    int convertFormat(unsigned int width, unsigned int height,
-+        unsigned char *inBuf, unsigned int inLength, unsigned int srcFmt,
-+        unsigned char *outBuf, unsigned int outLength, unsigned int dstFmt);
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.cpp b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
-new file mode 100644
-index 000000000000..919f5a1cf6e0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Thread.cpp
-@@ -0,0 +1,222 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Thread"
-+
-+#include "Errors.h"
-+#include "Thread.h"
-+#include "CameraLog.h"
-+
-+namespace icamera {
-+
-+int Condition::waitRelative(ConditionLock& lock, int64_t reltime) {
-+    std::cv_status ret = mCondition.wait_for(lock, std::chrono::nanoseconds(reltime));
-+    return ret == std::cv_status::timeout ? TIMED_OUT : OK;
-+}
-+
-+Thread::Thread() : mState(NOT_STARTED), mThread(nullptr), mPriority(PRIORITY_DEFAULT)
-+{
-+    LOG1("%s", __func__);
-+}
-+
-+Thread::~Thread()
-+{
-+    LOG1("%s", __func__);
-+
-+    requestExitAndWait();
-+
-+    delete mThread;
-+}
-+
-+int Thread::run(std::string name, int priority)
-+{
-+    LOG1("%s", __func__);
-+
-+    AutoMutex lock(mLock);
-+
-+    if (mState != NOT_STARTED && mState != EXITED) {
-+        LOGW("Cannot start thread(%s) in state(%d).", name.c_str(), mState);
-+        return INVALID_OPERATION;
-+    }
-+
-+    // Thread can be restarted only if the previous one has exited.
-+    // Release the previous thread first if it's created already.
-+    delete mThread;
-+
-+    mThread = new std::thread(_threadLoop, this);
-+    mThread->detach();
-+    mId = mThread->get_id();
-+    mName = name;
-+    mPriority = priority;
-+    mState = RUNNING;
-+
-+    mStartCondition.signal();
-+
-+    return OK;
-+}
-+
-+void Thread::requestExit()
-+{
-+    LOG1("%s", __func__);
-+
-+    AutoMutex lock(mLock);
-+
-+    if (mState == RUNNING) {
-+        mState = EXITING;
-+    }
-+}
-+
-+int Thread::requestExitAndWait()
-+{
-+    LOG1("%s", __func__);
-+
-+    ConditionLock lock(mLock);
-+
-+    // No need exit if it's not started.
-+    if (mState == NOT_STARTED) {
-+        return NO_INIT;
-+    }
-+
-+    // The function cannot be called by same thread.
-+    if (std::this_thread::get_id() == mId) {
-+        LOGE("The thread itself cannot call its own requestExitAndWait function.");
-+        return WOULD_BLOCK;
-+    }
-+
-+    while (mState != EXITED) {
-+        mState = EXITING;
-+        mExitedCondition.wait(lock);
-+    }
-+
-+    return OK;
-+}
-+
-+int Thread::join()
-+{
-+    LOG1("%s", __func__);
-+
-+    ConditionLock lock(mLock);
-+
-+    // No need join if it's not started.
-+    if (mState == NOT_STARTED) {
-+        return NO_INIT;
-+    }
-+
-+    // The function cannot be called by same thread.
-+    if (std::this_thread::get_id() == mId) {
-+        LOGE("The thread itself cannot call its own join function.");
-+        return WOULD_BLOCK;
-+    }
-+
-+    while (mState != EXITED) {
-+        mExitedCondition.wait(lock);
-+    }
-+
-+    return OK;
-+}
-+
-+bool Thread::isRunning() const
-+{
-+    AutoMutex lock(mLock);
-+    // A thread in EXITING also means it's still running, but it's going to exit.
-+    return mState == RUNNING || mState == EXITING;
-+}
-+
-+bool Thread::isExiting() const
-+{
-+    AutoMutex lock(mLock);
-+    return mState == EXITING;
-+}
-+
-+bool Thread::isExited() const
-+{
-+    AutoMutex lock(mLock);
-+    return mState == EXITED;
-+}
-+
-+void Thread::_threadLoop(Thread* self)
-+{
-+    {
-+        // Wait for function "run" to finish.
-+        // If the thread is going to exit, then no need to wait anymore.
-+        ConditionLock lock(self->mLock);
-+        while (self->mState != RUNNING && self->mState != EXITING) {
-+            self->mStartCondition.wait(lock);
-+        }
-+
-+        if (self->mState == EXITING) {
-+            self->mState = EXITED;
-+            self->mExitedCondition.broadcast();
-+            return;
-+        }
-+
-+        self->setProperty();
-+    }
-+
-+    while (true) {
-+        bool loopAgain = self->threadLoop();
-+
-+        AutoMutex lock(self->mLock);
-+        if (!loopAgain || self->mState == EXITING) {
-+            self->mState = EXITED;
-+            self->mExitedCondition.broadcast();
-+            return;
-+        }
-+    }
-+}
-+
-+// Platform specific implementation.
-+#ifdef HAVE_PTHREADS
-+#include <pthread.h>
-+#include <sys/resource.h>
-+
-+void Thread::setProperty()
-+{
-+    LOG1("%s, name:%s, priority:%d", __func__, mName.c_str(), mPriority);
-+
-+#if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12
-+    // Set thread's name
-+    std::string threadName = mName.empty() ? "NO_NAME" : mName;
-+    if (mName.size() > MAX_THREAD_NAME_LEN) {
-+        threadName = mName.substr(0, MAX_THREAD_NAME_LEN);
-+        LOG2("The thread name(%s) is too long, modify it to %s", mName.c_str(), threadName.c_str());
-+    }
-+    pthread_setname_np(pthread_self(), threadName.c_str());
-+#endif
-+
-+    // Set thread's priority
-+    setpriority(PRIO_PROCESS, 0, mPriority);
-+
-+    const int policy = SCHED_OTHER;
-+    int min = sched_get_priority_min(policy);
-+    int max = sched_get_priority_max(policy);
-+    LOG1("Priority range:(%d-%d)", min, max);
-+
-+    if (mPriority < min) mPriority = min;
-+    if (mPriority > max) mPriority = max;
-+
-+    sched_param param;
-+    param.sched_priority = mPriority;
-+
-+    int ret = pthread_setschedparam(pthread_self(), policy, &param);
-+    LOG1("pthread_setschedparam ret:%d", ret);
-+}
-+#else
-+#warning "Setting thread's property is not implemented yet on this platform."
-+#endif
-+
-+} // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/iutils/Thread.h b/camera/hal/intel/ipu6/src/iutils/Thread.h
-new file mode 100644
-index 000000000000..91623dca8b21
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Thread.h
-@@ -0,0 +1,198 @@
-+/*
-+ * Copyright (C) 2017-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string>
-+#include <thread>
-+#include <mutex>
-+#include <condition_variable>
-+
-+namespace icamera {
-+
-+typedef std::mutex Mutex;
-+typedef std::lock_guard<std::mutex> AutoMutex;
-+typedef std::unique_lock<std::mutex> ConditionLock;
-+
-+enum {
-+    PRIORITY_LOWEST = 19,
-+    PRIORITY_BACKGROUND = 10,
-+    PRIORITY_NORMAL = 0,
-+    PRIORITY_FOREGROUND = -2,
-+    PRIORITY_DISPLAY = -4,
-+    PRIORITY_URGENT_DISPLAY = -8,
-+    PRIORITY_AUDIO = -16,
-+    PRIORITY_URGENT_AUDIO = -19,
-+    PRIORITY_HIGHEST = -20,
-+    PRIORITY_DEFAULT = 0,
-+    PRIORITY_MORE_FAVORABLE = -1,
-+    PRIORITY_LESS_FAVORABLE = 1,
-+};
-+
-+class Condition {
-+public:
-+    Condition() {}
-+    ~Condition() {}
-+
-+    /**
-+     * Wait on the condition variable. MUST be locked with ConditionLock before being called.
-+     *
-+     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
-+     */
-+    void wait(ConditionLock& lock) {
-+        mCondition.wait(lock);
-+    }
-+
-+    /**
-+     * Wait on the condition variable with a period of time.
-+     *
-+     * \param[in] lock: An object of type ConditionLock, which must be locked by the current thread.
-+     * \param[in] reltime: The maximum time to spend waiting.
-+     *
-+     * \return TIMED_OUT if it's not notified to wake up within reltime, otherwise return OK.
-+     */
-+    int waitRelative(ConditionLock& lock, int64_t reltime);
-+
-+    /**
-+     * Wake up one thread that is waiting on the condition variable.
-+     */
-+    void signal() { mCondition.notify_one(); }
-+
-+    /**
-+     * Wake up all threads that are waiting on the condition variable.
-+     */
-+    void broadcast() { mCondition.notify_all(); }
-+
-+private:
-+    Condition(const Condition& other) = delete;
-+    Condition& operator=(const Condition&) = delete;
-+
-+    std::condition_variable mCondition;
-+};
-+
-+/**
-+ * Thread is a wrapper class to std::thread
-+ *
-+ * Thread helps manager the thread's state and make the std::thread is easier to used.
-+ * Thread also hides the platform specific implementation details.
-+ */
-+class Thread {
-+public:
-+    Thread();
-+    virtual ~Thread();
-+
-+    /**
-+     * Start the thread.
-+     */
-+    virtual int run(std::string name = ("nameless"), int priority = PRIORITY_DEFAULT);
-+
-+    /**
-+     * Ask this object's thread to exit. This function is asynchronous, so when it
-+     * returns the thread might still be running.
-+     */
-+    virtual void requestExit();
-+
-+    /**
-+     * Wait until this object's thread exits. Returns immediately if not yet running.
-+     *
-+     * join will not trigger the thread to exit, it just wait for the thread exits.
-+     * Do not call it from this object's thread, will return WOULD_BLOCK in that case.
-+     */
-+    int join();
-+
-+    /**
-+     * Ask this object's thread to exit. This function is synchronous, so when it
-+     * returns the thread must exit already.
-+     * It has same effect with calling requestExit and join combined.
-+     *
-+     * Do not call from this object's thread, will return WOULD_BLOCK in that case.
-+     */
-+    int requestExitAndWait();
-+
-+    /**
-+     * Indicates whether this thread is running or not.
-+     */
-+    bool isRunning() const;
-+
-+    /**
-+     * Indicates whether this thread is going to exit or not.
-+     */
-+    bool isExiting() const;
-+
-+    /**
-+     * Indicates whether this thread exited or not.
-+     */
-+    bool isExited() const;
-+
-+private:
-+
-+    /**
-+     * threadLoop is the function which is called by the thread.
-+     * The derived class MUST override this function. The thread starts its life here.
-+     *
-+     * There are two ways of using the thread object:
-+     * 1. loop: threadLoop will be called again as long as it returns true,
-+     *          and requestExit() wasn't called.
-+     * 2. once: If threadLoop() returns false, the thread will exit upon return.
-+     *
-+     * There are three ways of exiting the thread.
-+     * 1. threadLoop return false.
-+     * 2. requestExit is called.
-+     * 3. requestExitAndWait is called.
-+     */
-+    virtual bool threadLoop() { return false; }
-+
-+private:
-+    Thread(const Thread& other) = delete;
-+    Thread& operator=(const Thread&) = delete;
-+
-+    /**
-+     * The function which is used to create the std::thread.
-+     */
-+    static void _threadLoop(Thread* self);
-+
-+    /**
-+     * Set thread's property such as thread's name or priority.
-+     */
-+    void setProperty();
-+
-+private:
-+    enum {
-+        NOT_STARTED,
-+        RUNNING,
-+        EXITING,
-+        EXITED,
-+    } mState;
-+
-+    // The max length for thread name is 15.
-+    static const int MAX_THREAD_NAME_LEN = 15;
-+    std::thread* mThread;
-+    std::string mName;
-+    std::thread::id mId;
-+    int mPriority;
-+
-+    // A lock used to protect internal data and API accessing.
-+    mutable Mutex mLock;
-+
-+    // To make sure the thread not dead before "run" not finish.
-+    Condition mStartCondition;
-+
-+    // To make sure API like join be able to wait until thread exits.
-+    Condition mExitedCondition;
-+};
-+
-+} // namespace icamera
-+
-diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.cpp b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
-new file mode 100644
-index 000000000000..d50ab513eb2e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Trace.cpp
-@@ -0,0 +1,54 @@
-+/*
-+ * Copyright (C) 2014-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Trace"
-+
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <limits.h>
-+#include <pthread.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <sys/types.h>
-+
-+#include "Trace.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+std::atomic<int>        atrace_is_ready(0);
-+uint64_t                atrace_enabled_tags  = ATRACE_TAG_NOT_READY;
-+int                     atrace_marker_fd     = -1;
-+static pthread_once_t   atrace_once_control  = PTHREAD_ONCE_INIT;
-+
-+static void atrace_init_once()
-+{
-+    atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY);
-+    if (atrace_marker_fd == -1) {
-+        ATRACE_LOGE("atrace %s open error: %s!\n", __func__, strerror(errno));
-+        return;
-+    }
-+    atrace_enabled_tags = ATRACE_TAG_ALWAYS;
-+    atrace_is_ready = 1;
-+}
-+
-+void atrace_setup()
-+{
-+    pthread_once(&atrace_once_control, atrace_init_once);
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/Trace.h b/camera/hal/intel/ipu6/src/iutils/Trace.h
-new file mode 100644
-index 000000000000..849a6f19106b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Trace.h
-@@ -0,0 +1,241 @@
-+/*
-+ * Copyright (C) 2014-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <atomic>
-+
-+#include <inttypes.h>
-+#include <stdbool.h>
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <sys/cdefs.h>
-+#include <sys/types.h>
-+#include <unistd.h>
-+#include <errno.h>
-+#include <string.h>
-+
-+namespace icamera {
-+
-+#ifndef ATRACE_NO_LOG
-+#define ATRACE_LOGE(format, args...) printf(format, ##args)
-+#else
-+#define ATRACE_LOGE()
-+#endif
-+
-+#define CAMERA_PRId32 "d"
-+#define CAMERA_PRId64 "I64d"
-+
-+#define ATRACE_MESSAGE_LENGTH 1024
-+#define PROPERTY_VALUE_MAX 1024
-+/**
-+ * The ATRACE_TAG macro can be defined before including this header to trace
-+ * using one of the tags defined below.  It must be defined to one of the
-+ * following ATRACE_TAG_* macros.  The trace tag is used to filter tracing in
-+ * userland to avoid some of the runtime cost of tracing when it is not desired.
-+ *
-+ * Defining ATRACE_TAG to be ATRACE_TAG_ALWAYS will result in the tracing always
-+ * being enabled - this should ONLY be done for debug code, as userland tracing
-+ * has a performance cost even when the trace is not being recorded.  Defining
-+ * ATRACE_TAG to be ATRACE_TAG_NEVER or leaving ATRACE_TAG undefined will result
-+ * in the tracing always being disabled.
-+ */
-+#define ATRACE_TAG_NEVER            0       // This tag is never enabled.
-+#define ATRACE_TAG_ALWAYS           (1<<0)  // This tag is always enabled.
-+#define ATRACE_TAG_LAST             ATRACE_TAG_ALWAYS
-+
-+// Reserved for initialization.
-+#define ATRACE_TAG_NOT_READY        (1LL<<63)
-+
-+#define ATRACE_TAG_VALID_MASK ((ATRACE_TAG_LAST - 1) | ATRACE_TAG_LAST)
-+
-+// define the ATRACE_TAG to ALWAYS for nestdemo.
-+#define ATRACE_TAG ATRACE_TAG_ALWAYS
-+
-+/**
-+ * Opens the trace file for writing and reads the property for initial tags.
-+ * The atrace.tags.enableflags property sets the tags to trace.
-+ * This function should not be explicitly called, the first call to any normal
-+ * trace function will cause it to be run safely.
-+ */
-+void atrace_setup();
-+
-+/**
-+ * Flag indicating whether setup has been completed, initialized to 0.
-+ * Nonzero indicates setup has completed.
-+ * Note: This does NOT indicate whether or not setup was successful.
-+ */
-+extern std::atomic<int> atrace_is_ready;
-+
-+/**
-+ * Set of ATRACE_TAG flags to trace for, initialized to ATRACE_TAG_NOT_READY.
-+ * A value of zero indicates setup has failed.
-+ * Any other nonzero value indicates setup has succeeded, and tracing is on.
-+ */
-+extern uint64_t atrace_enabled_tags;
-+
-+/**
-+ * Handle to the kernel's trace buffer, initialized to -1.
-+ * Any other value indicates setup has succeeded, and is a valid fd for tracing.
-+ */
-+extern int atrace_marker_fd;
-+
-+/**
-+ * atrace_init readies the process for tracing by opening the trace_marker file.
-+ * Calling any trace function causes this to be run, so calling it is optional.
-+ * This can be explicitly run to avoid setup delay on first trace function.
-+ */
-+#define ATRACE_INIT() atrace_init()
-+static inline void atrace_init()
-+{
-+    if (!atrace_is_ready.load()) {
-+        atrace_setup();
-+    }
-+}
-+
-+/**
-+ * Get the mask of all tags currently enabled.
-+ * It can be used as a guard condition around more expensive trace calculations.
-+ * Every trace function calls this, which ensures atrace_init is run.
-+ */
-+#define ATRACE_GET_ENABLED_TAGS() atrace_get_enabled_tags()
-+static inline uint64_t atrace_get_enabled_tags()
-+{
-+    atrace_init();
-+    return atrace_enabled_tags;
-+}
-+
-+/**
-+ * Test if a given tag is currently enabled.
-+ * Returns nonzero if the tag is enabled, otherwise zero.
-+ * It can be used as a guard condition around more expensive trace calculations.
-+ */
-+#define ATRACE_ENABLED() atrace_is_tag_enabled(ATRACE_TAG)
-+static inline uint64_t atrace_is_tag_enabled(uint64_t tag)
-+{
-+    return atrace_get_enabled_tags() & tag;
-+}
-+
-+/**
-+ * Trace the beginning of a context.  name is used to identify the context.
-+ * This is often used to time function execution.
-+ */
-+#define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name)
-+static inline void atrace_begin(uint64_t tag, const char* name)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char buf[ATRACE_MESSAGE_LENGTH];
-+        ssize_t len;
-+
-+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "B|%d|%s", static_cast<int>(getpid()), name);
-+        if (write(atrace_marker_fd, buf, len) != len)
-+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
-+    }
-+}
-+
-+/**
-+ * Trace the end of a context.
-+ * This should match up (and occur after) a corresponding ATRACE_BEGIN.
-+ */
-+#define ATRACE_END() atrace_end(ATRACE_TAG)
-+static inline void atrace_end(uint64_t tag)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char c = 'E';
-+        if (write(atrace_marker_fd, &c, 1) !=1)
-+            ATRACE_LOGE("atrace %s write error: %s!\n", __func__, strerror(errno));
-+    }
-+}
-+
-+/**
-+ * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END
-+ * contexts, asynchronous events do not need to be nested. The name describes
-+ * the event, and the cookie provides a unique identifier for distinguishing
-+ * simultaneous events. The name and cookie used to begin an event must be
-+ * used to end it.
-+ */
-+#define ATRACE_ASYNC_BEGIN(name, cookie) \
-+    atrace_async_begin(ATRACE_TAG, name, cookie)
-+static inline void atrace_async_begin(uint64_t tag, const char* name,
-+        int32_t cookie)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char buf[ATRACE_MESSAGE_LENGTH];
-+        ssize_t len;
-+
-+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "S|%d|%s|%" CAMERA_PRId32,
-+                       static_cast<int>(getpid()), name, cookie);
-+        if (write(atrace_marker_fd, buf, len) != len)
-+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
-+    }
-+}
-+
-+/**
-+ * Trace the end of an asynchronous event.
-+ * This should have a corresponding ATRACE_ASYNC_BEGIN.
-+ */
-+#define ATRACE_ASYNC_END(name, cookie) atrace_async_end(ATRACE_TAG, name, cookie)
-+static inline void atrace_async_end(uint64_t tag, const char* name,
-+        int32_t cookie)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char buf[ATRACE_MESSAGE_LENGTH];
-+        ssize_t len;
-+
-+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "F|%d|%s|%" CAMERA_PRId32,
-+                       static_cast<int>(getpid()), name, cookie);
-+        if (write(atrace_marker_fd, buf, len) != len)
-+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
-+    }
-+}
-+
-+/**
-+ * Traces an integer counter value.  name is used to identify the counter.
-+ * This can be used to track how a value changes over time.
-+ */
-+#define ATRACE_INT(name, value) atrace_int(ATRACE_TAG, name, value)
-+static inline void atrace_int(uint64_t tag, const char* name, int32_t value)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char buf[ATRACE_MESSAGE_LENGTH];
-+        ssize_t len;
-+
-+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" CAMERA_PRId32,
-+                       static_cast<int>(getpid()), name, value);
-+        if (write(atrace_marker_fd, buf, len) != len)
-+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
-+    }
-+}
-+
-+/**
-+ * Traces a 64-bit integer counter value.  name is used to identify the
-+ * counter. This can be used to track how a value changes over time.
-+ */
-+#define ATRACE_INT64(name, value) atrace_int64(ATRACE_TAG, name, value)
-+static inline void atrace_int64(uint64_t tag, const char* name, int64_t value)
-+{
-+    if (atrace_is_tag_enabled(tag)) {
-+        char buf[ATRACE_MESSAGE_LENGTH];
-+        ssize_t len;
-+
-+        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "C|%d|%s|%" PRId64 " " CAMERA_PRId64,
-+                       static_cast<int>(getpid()), name, value);
-+        if (write(atrace_marker_fd, buf, len) != len)
-+            ATRACE_LOGE("atrace %s write %s error: %s!\n", __func__, buf, strerror(errno));
-+    }
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.cpp b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
-new file mode 100644
-index 000000000000..11dcdfc69e46
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Utils.cpp
-@@ -0,0 +1,740 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Utils"
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <dlfcn.h>
-+#include <dirent.h>
-+#include <iostream>
-+#include <fstream>
-+#include <sstream>
-+
-+#include "PlatformData.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "linux/media-bus-format.h"
-+#include "linux/ipu-isys.h"
-+
-+using std::string;
-+
-+namespace icamera {
-+
-+int CameraUtils::getFileContent(const char* filename, char* buffer, int maxSize) {
-+
-+    std::ifstream stream(filename);
-+
-+    stream.seekg(0, std::ios::end);
-+    long copyLength = stream.tellg();
-+    stream.seekg(0, std::ios::beg);
-+
-+    if (copyLength > maxSize) {
-+        copyLength = maxSize;
-+    }
-+
-+    stream.read(buffer, copyLength);
-+    return copyLength;
-+}
-+
-+#define GET_FOURCC_FMT(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
-+                                   | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
-+
-+enum FormatType {
-+    FORMAT_RAW,
-+    FORMAT_RAW_VEC,
-+    FORMAT_YUV,
-+    FORMAT_YUV_VEC,
-+    FORMAT_RGB,
-+    FORMAT_MBUS,
-+    FORMAT_JPEG,
-+    FORMAT_FOURCC,
-+};
-+
-+struct FormatInfo {
-+    int pixelCode;
-+    const char* fullName;
-+    const char* shortName;
-+    int bpp;
-+    FormatType type;
-+};
-+
-+static const FormatInfo gFormatMapping[] = {
-+    { V4L2_PIX_FMT_GREY, "V4L2_PIX_FMT_GREY", "GREY", 8, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SBGGR8, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG8, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG8, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB8, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SBGGR10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SBGGR12, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG12, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB12, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SBGGR10P, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG10P, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG10P, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB10P, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_NV12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_NV21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_NV16, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YUYV, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
-+    { V4L2_PIX_FMT_UYVY, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
-+
-+    { V4L2_PIX_FMT_YUV420, "V4L2_PIX_FMT_YUV420", "YUV420", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YVU420, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YUV422P, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
-+
-+    { V4L2_PIX_FMT_BGR24, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
-+    { V4L2_PIX_FMT_BGR32, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_RGB24, "V4L2_PIX_FMT_RGB24", "RGB24", 24, FORMAT_RGB },
-+    { V4L2_PIX_FMT_RGB32, "V4L2_PIX_FMT_RGB32", "RGB32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_XBGR32, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_XRGB32, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_RGB565, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
-+
-+    { V4L2_PIX_FMT_JPEG, "V4L2_PIX_FMT_JPEG", "JPG", 0, FORMAT_JPEG },
-+
-+    { V4L2_MBUS_FMT_SBGGR12_1X12, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGBRG12_1X12, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGRBG12_1X12, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SRGGB12_1X12, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS },
-+
-+    { V4L2_MBUS_FMT_SBGGR10_1X10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGBRG10_1X10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGRBG10_1X10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SRGGB10_1X10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS },
-+
-+    { V4L2_MBUS_FMT_SBGGR8_1X8, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGBRG8_1X8, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SGRBG8_1X8, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_SRGGB8_1X8, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS },
-+
-+    { V4L2_MBUS_FMT_UYVY8_1X16, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_YUYV8_1X16, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS },
-+    { V4L2_MBUS_FMT_UYVY8_2X8, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS},
-+
-+    { MEDIA_BUS_FMT_RGB888_1X24, "MEDIA_BUS_FMT_RGB888_1X24", "RGB888_1X24", 0, FORMAT_MBUS },
-+    { MEDIA_BUS_FMT_RGB565_1X16, "MEDIA_BUS_FMT_RGB565_1X16", "RGB565_1X16", 0, FORMAT_MBUS },
-+    { MEDIA_BUS_FMT_YUYV12_1X24, "MEDIA_BUS_FMT_YUYV12_1X24", "YUYV12_1X24", 0, FORMAT_MBUS },
-+    { MEDIA_BUS_FMT_SGRBG10_1X10, "MEDIA_BUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 0, FORMAT_MBUS },
-+
-+    { MEDIA_BUS_FMT_RGB888_1X32_PADHI, "MEDIA_BUS_FMT_RGB888_1X32_PADHI", "RGB888_1X32_PADHI", 0, FORMAT_MBUS },
-+
-+    { V4L2_FMT_IPU_ISYS_META, "V4L2_FMT_IPU_ISYS_META", "META_DATA", 0, FORMAT_MBUS },
-+
-+    { GET_FOURCC_FMT('y','0','3','2'), "y032", "y032", 24, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('N','V','1','2'), "YUV420_8_SP", "NV12", 12, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('I','Y','U','V'), "IYUV", "IYUV", 12, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('b','V','0','K'), "bV0K", "bV0K", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('b','V','0','G'), "bV0G", "bV0G", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('V','4','2','0'), "YUV420_10_PL", "V420", 24, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('B','A','1','0'), "BA10", "BA10", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('B','A','1','2'), "BA12", "BA12", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('G','R','1','0'), "GR10", "GR10", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('C','S','L','6'), "GRBG_12_LI", "CSL6", 15, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('P','0','1','0'), "P010", "P010", 24, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('Y','U','Y','2'), "YUY2", "YUY2", 16, FORMAT_FOURCC },
-+    { GET_FOURCC_FMT('G','R','B','G'), "GRBG", "GRBG", 8, FORMAT_FOURCC },
-+};
-+
-+struct TuningModeStringInfo {
-+    TuningMode mode;
-+    const char *str;
-+};
-+
-+static const TuningModeStringInfo TuningModeStringInfoTable[] = {
-+    { TUNING_MODE_VIDEO,               "VIDEO" },
-+    { TUNING_MODE_VIDEO_ULL,           "VIDEO-ULL" },
-+    { TUNING_MODE_VIDEO_CUSTOM_AIC,    "VIDEO-CUSTOM_AIC" },
-+    { TUNING_MODE_VIDEO_LL,            "VIDEO-LL" },
-+    { TUNING_MODE_VIDEO_REAR_VIEW,     "VIDEO-REAR-VIEW" },
-+    { TUNING_MODE_VIDEO_HITCH_VIEW,    "VIDEO-HITCH-VIEW" },
-+    { TUNING_MODE_STILL_CAPTURE,       "STILL_CAPTURE" },
-+};
-+
-+const char *CameraUtils::tuningMode2String(TuningMode mode)
-+{
-+    int size = ARRAY_SIZE(TuningModeStringInfoTable);
-+    for (int i = 0; i < size; i++) {
-+        if (TuningModeStringInfoTable[i].mode == mode) {
-+            return TuningModeStringInfoTable[i].str;
-+        }
-+    }
-+    LOGW("Invalid TuningMode %d, use string VIDEO as default", mode);
-+    return TuningModeStringInfoTable[0].str;
-+}
-+
-+TuningMode CameraUtils::string2TuningMode(const char *str)
-+{
-+    int size = ARRAY_SIZE(TuningModeStringInfoTable);
-+    for (int i = 0; i < size; i++) {
-+        if (strcmp(TuningModeStringInfoTable[i].str, str) == 0) {
-+            return TuningModeStringInfoTable[i].mode;
-+        }
-+    }
-+    LOGW("Invalid TuningMode string %s, use TUNING_MODE_VIDEO as default", str);
-+    return TuningModeStringInfoTable[0].mode;
-+}
-+
-+const char *CameraUtils::pixelCode2String(int code)
-+{
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (gFormatMapping[i].pixelCode == code) {
-+            return gFormatMapping[i].fullName;
-+        }
-+    }
-+
-+    LOGE("Invalid Pixel Format: %d", code);
-+    return "INVALID FORMAT";
-+}
-+
-+int CameraUtils::string2PixelCode(const char *code)
-+{
-+    CheckError(code == nullptr, -1, "Invalid null pixel format.");
-+
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (strcmp(gFormatMapping[i].fullName, code) == 0) {
-+            return gFormatMapping[i].pixelCode;
-+        }
-+    }
-+
-+    LOGE("Invalid Pixel Format: %s", code);
-+    return -1;
-+}
-+
-+int CameraUtils::string2IaFourccCode(const char *code)
-+{
-+    CheckError(code == nullptr, -1, "Invalid null pixel format.");
-+
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (gFormatMapping[i].type == FORMAT_FOURCC){
-+            if (!strcmp(gFormatMapping[i].fullName, code) ||
-+                 !strcmp(gFormatMapping[i].shortName, code)) {
-+                return gFormatMapping[i].pixelCode;
-+            }
-+        }
-+    }
-+
-+    LOGE("Invalid Pixel Format: %s", code);
-+    return -1;
-+}
-+
-+const string CameraUtils::fourcc2String(int format4cc)
-+{
-+    char fourccBuf[5];
-+    CLEAR(fourccBuf);
-+    snprintf(fourccBuf, sizeof(fourccBuf), "%c%c%c%c", (format4cc >> 24) & 0xff,
-+            (format4cc >> 16) & 0xff, (format4cc >> 8) & 0xff, format4cc & 0xff);
-+
-+    return string(fourccBuf);
-+}
-+
-+std::string CameraUtils::format2string(int format)
-+{
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            return std::string(gFormatMapping[i].shortName);
-+        }
-+    }
-+
-+    LOG2("%s, Not in our format list :%x", __func__, format);
-+    return fourcc2String(format);
-+}
-+
-+unsigned int CameraUtils::fourcc2UL(char *str4cc)
-+{
-+    CheckError(str4cc == nullptr, 0, "Invalid null string.");
-+    CheckError(strlen(str4cc) != 4, 0, "Invalid string %s, should be 4cc.", str4cc);
-+
-+    return FOURCC_TO_UL(str4cc[0], str4cc[1], str4cc[2], str4cc[3]);
-+}
-+
-+bool CameraUtils::isPlanarFormat(int format)
-+{
-+    return (format == V4L2_PIX_FMT_NV12 || format == V4L2_PIX_FMT_NV21
-+         || format == V4L2_PIX_FMT_YUV420 || format == V4L2_PIX_FMT_YVU420
-+         || format == V4L2_PIX_FMT_YUV422P || format == V4L2_PIX_FMT_NV16);
-+}
-+
-+bool CameraUtils::isRaw(int format)
-+{
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            // Both normal raw and vector raw treated as raw here.
-+            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+int CameraUtils::getBpp(int format)
-+{
-+    int size = ARRAY_SIZE(gFormatMapping);
-+    for (int i = 0; i < size; i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            return gFormatMapping[i].bpp;
-+        }
-+    }
-+
-+    LOGE("There is no bpp supplied for format %s", pixelCode2String(format));
-+    return -1;
-+}
-+
-+/**
-+ * Get the stride which is also known as aligned bype per line in some context.
-+ * Mainly used for locate the start of next line.
-+ */
-+int CameraUtils::getStride(int format, int width)
-+{
-+    int bpl = width * getBpp(format) / 8;
-+    if (isPlanarFormat(format)) {
-+        bpl = width;
-+    }
-+    return ALIGN_64(bpl);
-+}
-+
-+/*
-+ * Calc frame size for compression
-+ */
-+int CameraUtils::getCompressedFrameSize(int format, int width, int height)
-+{
-+   int alignedBpl = getStride(format, width);
-+   int alignedHeight, imageBufferSize, frameSize;
-+
-+   switch (format) {
-+       case V4L2_PIX_FMT_SBGGR8:
-+       case V4L2_PIX_FMT_SGBRG8:
-+       case V4L2_PIX_FMT_SGRBG8:
-+       case V4L2_PIX_FMT_SRGGB8:
-+       case V4L2_PIX_FMT_SBGGR10:
-+       case V4L2_PIX_FMT_SGBRG10:
-+       case V4L2_PIX_FMT_SGRBG10:
-+       case V4L2_PIX_FMT_SRGGB10:
-+       {
-+           alignedBpl = ALIGN(alignedBpl, ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES);
-+           alignedHeight = ALIGN(height, ISYS_COMPRESSION_HEIGHT_ALIGNMENT);
-+           imageBufferSize = ALIGN(alignedBpl * alignedHeight, ISYS_COMPRESSION_PAGE_SIZE);
-+           int singlePlanarTileStatusSize = CAMHAL_CEIL_DIV(((alignedBpl * alignedHeight / ISYS_COMPRESSION_TILE_SIZE_BYTES) *
-+                                                                                               ISYS_COMPRESSION_TILE_STATUS_BITS), 8);
-+           int singleTileStatusSize = ALIGN(singlePlanarTileStatusSize, ISYS_COMPRESSION_PAGE_SIZE);
-+           LOG1("@%s: format:%s, aligned stride:%d, buffer height:%d, pixel buffer size:%d, single planner TS size:%d",
-+                __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, singleTileStatusSize);
-+           frameSize = imageBufferSize + singleTileStatusSize;
-+           break;
-+       }
-+       case GET_FOURCC_FMT('V','4','2','0'):
-+       case GET_FOURCC_FMT('I','Y','U','V'):
-+       {
-+           //alignedBpl needs accurate stride, not equivalent value from getStride()
-+           alignedBpl = (format == GET_FOURCC_FMT('V','4','2','0')) ? width * 2 : width;
-+           alignedBpl = ALIGN(alignedBpl, PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT);
-+           alignedHeight = ALIGN(height, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
-+           int alignBplUV = ALIGN(alignedBpl / UV_STRIDE_DIVIDER, PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT);
-+           int alignHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT);
-+           imageBufferSize = ALIGN((alignedBpl * alignedHeight + alignBplUV * alignHeightUV * 2), PSYS_COMPRESSION_PAGE_SIZE);
-+
-+           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeight / TILE_SIZE_YUV420_Y) *
-+                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
-+           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
-+           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignBplUV * alignHeightUV / TILE_SIZE_YUV420_Y) *
-+                                                                                   TILE_STATUS_BITS_YUV420_Y, 8);
-+           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
-+
-+           LOG1("@%s: format:%s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, two tile_status_UV:%d",
-+                       __func__, pixelCode2String(format), alignedBpl, alignedHeight,
-+                       imageBufferSize, planarYTileStatus, planarUVTileStatus*2);
-+           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus * 2;
-+           break;
-+       }
-+       case V4L2_PIX_FMT_NV12:
-+       {
-+           int bpl = width;
-+           alignedBpl = ALIGN(bpl, PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT);
-+           alignedHeight = ALIGN(height, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
-+           int alignedHeightUV = ALIGN(alignedHeight / UV_HEIGHT_DIVIDER, PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT);
-+           int imageBufferSize = ALIGN(alignedBpl * (alignedHeight + alignedHeightUV), PSYS_COMPRESSION_PAGE_SIZE);
-+
-+           int planarYTileStatus = CAMHAL_CEIL_DIV((alignedBpl *  alignedHeight / TILE_SIZE_OFS8_10_LINEAR) *
-+                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
-+           planarYTileStatus = ALIGN(planarYTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
-+           int planarUVTileStatus = CAMHAL_CEIL_DIV((alignedBpl * alignedHeightUV / TILE_SIZE_OFS8_10_LINEAR) *
-+                                                                                   TILE_STATUS_BITS_OFS8_10_LINEAR, 8);
-+           planarUVTileStatus = ALIGN(planarUVTileStatus, PSYS_COMPRESSION_PAGE_SIZE);
-+
-+           LOG1("@%s: format: %s, stride:%d, height:%d, imageSize:%d, tile_status_Y:%d, tile_status_UV:%d",
-+                    __func__, pixelCode2String(format), alignedBpl, alignedHeight, imageBufferSize, planarYTileStatus, planarUVTileStatus);
-+           frameSize = imageBufferSize + planarYTileStatus + planarUVTileStatus;
-+           break;
-+       }
-+       default:
-+           LOGE("@%s: unexpected format 0x%x in string %s, unsupported compression format", __func__, format, pixelCode2String(format));
-+           frameSize = 0;
-+           break;
-+    }
-+
-+    return frameSize;
-+}
-+
-+/*
-+ * Calc frame buffer size.
-+ *
-+ *  Why alignment is 64?
-+ *  The IPU DMA unit must transimit at leat 64 bytes one time.
-+ *
-+ *  Why need extra size? It's due to a hardware issue: the DMA unit is a power of
-+ *  two, and a line should be transferred as few units as possible.
-+ *  The result is that up to line length more data than the image size
-+ *  may be transferred to memory after the image.
-+ *
-+ *  Another limition is the GDA(Global Dynamic Allocator) allocation unit size(1024). For low
-+ *  resolution it gives a bigger number. Use larger one to avoid
-+ *  memory corruption.
-+ *  for example: 320x480 UVVY, which bpl is 640, less than 1024, in this case, driver will
-+ *  allocate 1024 bytes for the last line.
-+ */
-+int CameraUtils::getFrameSize(int format, int width, int height, bool needAlignedHeight, bool needExtraSize, bool needCompression)
-+{
-+    LOG1("@%s get buffer size for %s %dx%d", __func__, pixelCode2String(format), width, height);
-+    LOG1("@%s needAlignedHeight:%d, needExtraSize:%d, needCompression: %d", __func__,
-+              needAlignedHeight, needExtraSize, needCompression);
-+
-+    int alignedBpl = getStride(format, width);
-+
-+    // Get frame size with aligned height taking in count for internal buffers.
-+    // To garantee PSYS kernel like GDC always get enough buffer size to process.
-+    // This is to satisfy the PSYS kernel, like GDC, input alignment requirement.
-+    if (needAlignedHeight) {
-+        height = ALIGN_64(height);
-+        LOG1("@%s buffer aligned height %d", __func__, height);
-+    }
-+    int bufferHeight = isPlanarFormat(format) ? (height * getBpp(format) / 8) : height;
-+
-+    if (!needExtraSize) {
-+        LOG1("%s: no need extra size, frame size is %d", __func__, alignedBpl * bufferHeight);
-+        return alignedBpl * bufferHeight;
-+    }
-+
-+    if (needCompression) {
-+        int compressedFrameSize = getCompressedFrameSize(format, width, height);
-+        LOG1("%s: Compressed frame size %d for original format: %s",
-+                   __func__, compressedFrameSize, pixelCode2String(format));
-+        return compressedFrameSize;
-+    }
-+
-+    // Extra size should be at least one alignedBpl
-+    int extraSize = isPlanarFormat(format) ? alignedBpl * getBpp(format) / 8 : alignedBpl;
-+    extraSize = std::max(extraSize , 1024);
-+
-+    return alignedBpl * bufferHeight + extraSize;
-+}
-+
-+int CameraUtils::getNumOfPlanes(int format)
-+{
-+    switch(format) {
-+        case V4L2_PIX_FMT_NV12:
-+        case V4L2_PIX_FMT_SGRBG8:
-+        case V4L2_FMT_IPU_ISYS_META:
-+            return 1;
-+        //Add more when needed...
-+        default:
-+            return 1;
-+    }
-+}
-+
-+void CameraUtils::getDeviceName(const char* entityName, string& deviceNodeName, bool isSubDev)
-+{
-+
-+    const char *filePrefix = "video";
-+    const char *dirPath = "/sys/class/video4linux/";
-+    if (isSubDev)
-+        filePrefix = "v4l-subdev";
-+
-+    DIR *dp = opendir(dirPath);
-+    CheckError((dp == nullptr), VOID_VALUE, "@%s, Fail open : %s", __func__, dirPath);
-+
-+    struct dirent *dirp = nullptr;
-+    while ((dirp = readdir(dp)) != nullptr) {
-+        if ((dirp->d_type == DT_LNK) && (strncmp(dirp->d_name, filePrefix, strlen(filePrefix)) == 0)) {
-+            string subDeviceName = dirPath;
-+            subDeviceName += dirp->d_name;
-+            subDeviceName += "/name";
-+            int fd = open(subDeviceName.c_str(), O_RDONLY);
-+            CheckError((fd < 0), VOID_VALUE, "@%s, open file %s failed. err: %s",
-+                  __func__, subDeviceName.c_str(), strerror(errno));
-+
-+            char buf[128] = {'\0'};
-+            int len = read(fd, buf, sizeof(buf));
-+            close(fd);
-+            len--; // remove "\n"
-+            if (len == (int)strlen(entityName) && memcmp(buf, entityName, len) == 0) {
-+                deviceNodeName = "/dev/";
-+                deviceNodeName += dirp->d_name;
-+                break;
-+            }
-+        }
-+    }
-+    closedir(dp);
-+}
-+
-+void CameraUtils::getSubDeviceName(const char* entityName, string& deviceNodeName)
-+{
-+     getDeviceName(entityName, deviceNodeName, true);
-+}
-+
-+int CameraUtils::getInterlaceHeight(int field, int height)
-+{
-+    if (SINGLE_FIELD(field))
-+        return height/2;
-+    else
-+        return height;
-+}
-+
-+bool CameraUtils::isMultiExposureCase(TuningMode tuningMode)
-+{
-+    LOG2("%s, tuningMode %d", __func__, tuningMode);
-+
-+    return false;
-+}
-+
-+bool CameraUtils::isUllPsysPipe(TuningMode tuningMode)
-+{
-+    return (tuningMode == TUNING_MODE_VIDEO_ULL ||
-+            tuningMode == TUNING_MODE_VIDEO_CUSTOM_AIC);
-+}
-+
-+ConfigMode CameraUtils::getConfigModeByName(const char* ConfigName)
-+{
-+    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
-+
-+    if (ConfigName == nullptr) {
-+        LOGE("%s, the ConfigName is nullptr", __func__);
-+    } else if (strcmp(ConfigName, "AUTO") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_AUTO;
-+    } else if (strcmp(ConfigName, "ULL") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
-+    } else if (strcmp(ConfigName, "NORMAL") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
-+    } else if (strcmp(ConfigName, "HIGH_SPEED") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CONSTRAINED_HIGH_SPEED;
-+    } else if (strcmp(ConfigName, "CUSTOM_AIC") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
-+    } else if (strcmp(ConfigName, "VIDEO_LL") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
-+    } else if (strcmp(ConfigName, "STILL_CAPTURE") == 0) {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE;
-+    } else if (strcmp(ConfigName, "NONE") == 0) {
-+        LOG1("%s, the detected internal 'NONE' ConfigName", __func__);
-+    } else {
-+        configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
-+        LOG2("%s, the ConfigName %s is not supported, use normal as default", __func__, ConfigName);
-+    }
-+
-+    LOG2("%s, configMode = %d", __func__, configMode);
-+    return configMode;
-+}
-+
-+void CameraUtils::getConfigModeFromString(string str, std::vector<ConfigMode> &cfgModes)
-+{
-+    bool split = true;
-+    ConfigMode mode;
-+    string resultStr, modeStr = str;
-+
-+    while(split) {
-+        size_t pos = 0;
-+        if ((pos = modeStr.find(",")) == string::npos) {
-+            mode = getConfigModeByName(modeStr.c_str());
-+            split = false;
-+        } else {
-+            resultStr = modeStr.substr(0, pos);
-+            modeStr = modeStr.substr(pos + 1);
-+            mode = getConfigModeByName(resultStr.c_str());
-+        }
-+        cfgModes.push_back(mode);
-+    }
-+}
-+
-+ConfigMode CameraUtils::getConfigModeBySceneMode(camera_scene_mode_t sceneMode)
-+{
-+    ConfigMode configMode = CAMERA_STREAM_CONFIGURATION_MODE_END;
-+
-+    switch(sceneMode) {
-+        case SCENE_MODE_NORMAL:
-+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_NORMAL;
-+            break;
-+        case SCENE_MODE_ULL:
-+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_ULL;
-+            break;
-+        case SCENE_MODE_CUSTOM_AIC:
-+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_CUSTOM_AIC;
-+            break;
-+        case SCENE_MODE_VIDEO_LL:
-+            configMode = CAMERA_STREAM_CONFIGURATION_MODE_VIDEO_LL;
-+            break;
-+        default:
-+            // There is no corresponding ConfigMode for some scene.
-+            LOG2("there is no corresponding ConfigMode for scene %d", sceneMode);
-+            break;
-+    }
-+    return configMode;
-+}
-+
-+camera_scene_mode_t CameraUtils::getSceneModeByName(const char* sceneName)
-+{
-+    if (sceneName == nullptr) return SCENE_MODE_MAX;
-+    else if (strcmp(sceneName, "AUTO") == 0) return SCENE_MODE_AUTO;
-+    else if (strcmp(sceneName, "ULL") == 0) return SCENE_MODE_ULL;
-+    else if (strcmp(sceneName, "VIDEO_LL") == 0) return SCENE_MODE_VIDEO_LL;
-+    else if (strcmp(sceneName, "NORMAL") == 0) return SCENE_MODE_NORMAL;
-+    else if (strcmp(sceneName, "CUSTOM_AIC") == 0) return SCENE_MODE_CUSTOM_AIC;
-+
-+    return SCENE_MODE_MAX;
-+}
-+
-+camera_awb_mode_t CameraUtils::getAwbModeByName(const char* awbName)
-+{
-+    if (awbName == nullptr) return AWB_MODE_MAX;
-+    else if (strcmp(awbName, "AUTO") == 0) return AWB_MODE_AUTO;
-+    else if (strcmp(awbName, "INCANDESCENT") == 0) return AWB_MODE_INCANDESCENT;
-+    else if (strcmp(awbName, "FLUORESCENT") == 0) return AWB_MODE_FLUORESCENT;
-+    else if (strcmp(awbName, "DAYLIGHT") == 0) return AWB_MODE_DAYLIGHT;
-+    else if (strcmp(awbName, "FULL_OVERCAST") == 0) return AWB_MODE_FULL_OVERCAST;
-+    else if (strcmp(awbName, "PARTLY_OVERCAST") == 0) return AWB_MODE_PARTLY_OVERCAST;
-+    else if (strcmp(awbName, "SUNSET") == 0) return AWB_MODE_SUNSET;
-+    else if (strcmp(awbName, "VIDEO_CONFERENCE") == 0) return AWB_MODE_VIDEO_CONFERENCE;
-+    else if (strcmp(awbName, "MANUAL_CCT_RANGE") == 0) return AWB_MODE_MANUAL_CCT_RANGE;
-+    else if (strcmp(awbName, "MANUAL_WHITE_POINT") == 0) return AWB_MODE_MANUAL_WHITE_POINT;
-+    else if (strcmp(awbName, "MANUAL_GAIN") == 0) return AWB_MODE_MANUAL_GAIN;
-+    else if (strcmp(awbName, "MANUAL_COLOR_TRANSFORM") == 0) return AWB_MODE_MANUAL_COLOR_TRANSFORM;
-+
-+    return AWB_MODE_MAX;
-+}
-+
-+unsigned int CameraUtils::getMBusFormat(int cameraId, unsigned int isysFmt)
-+{
-+    unsigned int pixelCode = 0;
-+
-+    switch (isysFmt) {
-+    case V4L2_PIX_FMT_UYVY:
-+    case V4L2_PIX_FMT_NV16:
-+        pixelCode = V4L2_MBUS_FMT_UYVY8_1X16;
-+        break;
-+    case V4L2_PIX_FMT_YUYV:
-+        pixelCode = V4L2_MBUS_FMT_YUYV8_1X16;
-+        break;
-+    case V4L2_PIX_FMT_BGR24:
-+    case V4L2_PIX_FMT_XBGR32:
-+        pixelCode = MEDIA_BUS_FMT_RGB888_1X24;
-+        break;
-+    case V4L2_PIX_FMT_RGB565:
-+    case V4L2_PIX_FMT_XRGB32:
-+        pixelCode = MEDIA_BUS_FMT_RGB565_1X16;
-+        break;
-+    case V4L2_PIX_FMT_SGRBG8:
-+        pixelCode = V4L2_MBUS_FMT_SGRBG8_1X8;
-+        break;
-+    default:
-+        LOGE("No input format to match the output: %s", pixelCode2String(isysFmt));
-+        break;
-+    }
-+
-+    return pixelCode;
-+}
-+
-+void* CameraUtils::dlopenLibrary(const char* name, int flags)
-+{
-+    CheckError((name == nullptr), nullptr, "%s, invalid parameters", __func__);
-+
-+    void* handle = dlopen(name, flags);
-+
-+    const char* lError = dlerror();
-+    if (lError) {
-+        if (handle == nullptr) {
-+            LOGW("%s, handle is NULL", __func__);
-+        }
-+        LOGW("%s, dlopen Error: %s", __func__, lError);
-+        return nullptr;
-+    }
-+
-+    LOG1("%s, handle %p, name %s has been opened", __func__, handle, name);
-+    return handle;
-+}
-+
-+void* CameraUtils::dlsymLibrary(void* handle, const char* str)
-+{
-+    CheckError((handle == nullptr || str == nullptr), nullptr, "%s, invalid parameters", __func__);
-+
-+    void* sym = dlsym(handle, str);
-+
-+    const char* lError = dlerror();
-+    if (lError) {
-+        if (sym == nullptr) {
-+            LOGW("%s, symbol is nullptr", __func__);
-+        }
-+        LOGW("%s, dlopen Error: %s", __func__, lError);
-+        return nullptr;
-+    }
-+
-+    LOG1("%s, handle %p, str %s has been found", __func__, handle, str);
-+    return sym;
-+}
-+
-+int CameraUtils::dlcloseLibrary(void* handle)
-+{
-+    CheckError((handle == nullptr), BAD_VALUE, "%s, invalid parameters", __func__);
-+
-+    dlclose(handle);
-+    LOG1("%s, handle %p has been closed", __func__, handle);
-+    return OK;
-+}
-+
-+std::vector<string> CameraUtils::splitString(const char* srcStr, char delim)
-+{
-+    std::vector<string> tokens;
-+    std::stringstream ss(srcStr);
-+    string item;
-+
-+    for (size_t i = 0; std::getline(ss, item, delim); i++) {
-+        tokens.push_back(item);
-+    }
-+
-+    return tokens;
-+}
-+
-+nsecs_t CameraUtils::systemTime()
-+{
-+    struct timespec t;
-+    t.tv_sec = t.tv_nsec = 0;
-+    clock_gettime(CLOCK_MONOTONIC, &t);
-+    return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/iutils/Utils.h b/camera/hal/intel/ipu6/src/iutils/Utils.h
-new file mode 100644
-index 000000000000..0bae788fa802
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/iutils/Utils.h
-@@ -0,0 +1,277 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <linux/videodev2.h>
-+#include <v4l2_device.h>
-+
-+#include <string.h>
-+#include <vector>
-+#include <string>
-+
-+#include "CameraTypes.h"
-+
-+namespace icamera {
-+
-+typedef int64_t nsecs_t;
-+
-+typedef ::cros::V4L2DevicePoller V4L2DevicePoller;
-+typedef ::cros::V4L2Device V4L2Device;
-+typedef ::cros::V4L2VideoNode V4L2VideoNode;
-+typedef ::cros::V4L2Subdevice V4L2Subdevice;
-+typedef ::cros::V4L2Buffer V4L2Buffer;
-+typedef ::cros::V4L2Format V4L2Format;
-+
-+#define ALIGN(val, alignment) (((val)+(alignment)-1) & ~((alignment)-1))
-+#define ALIGN_64(val) ALIGN(val, 64)
-+#define ALIGN_32(val) ALIGN(val, 32)
-+#define ALIGN_16(val) ALIGN(val, 16)
-+#define ALIGN_8(val)  ALIGN(val, 8)
-+
-+#define ARRAY_SIZE(array)    (sizeof(array) / sizeof((array)[0]))
-+
-+#define CLEAR(x) memset (&(x), 0, sizeof (x))
-+
-+// macro CLIP is used to clip the Number value to between the Min and Max
-+#define CLIP(Number, Max, Min)    ((Number) > (Max) ? (Max) : ((Number) < (Min) ? (Min) : (Number)))
-+
-+#ifndef UNUSED
-+#define UNUSED(param) (void)(param)
-+#endif
-+
-+/**
-+ * Align to page boundary
-+ * \ingroup ia_tools
-+ */
-+#ifndef PAGE_ALIGN
-+#define PAGE_SIZE_U (getpagesize())
-+#define PAGE_ALIGN(x)  ALIGN(x, PAGE_SIZE_U)
-+#endif
-+
-+/* Integer round-up division of a with b */
-+#define CEIL_DIV(a, b)  ((b) ? (((a) + (b) - 1) / (b)) : 0)
-+/* Align a to the upper multiple of b */
-+#define CEIL_MUL(a, b)  CEIL_DIV(a, b) * (b)
-+
-+#define SINGLE_FIELD(field) ((field == V4L2_FIELD_TOP) || (field == V4L2_FIELD_BOTTOM) || \
-+                             (field == V4L2_FIELD_ALTERNATE))
-+/**
-+ * Use to check input parameter and if failed, return err_code and print error message
-+ */
-+#define VOID_VALUE
-+#define CheckError(condition, err_code, err_msg, args...) \
-+            do { \
-+                if (condition) { \
-+                    LOGE(err_msg, ##args);\
-+                    return err_code;\
-+                }\
-+            } while (0)
-+
-+#define CheckAndClean(condition, err_code, clean, err_msg, args...) \
-+            do { \
-+                if (condition) { \
-+                    LOGE(err_msg, ##args);\
-+                    clean;\
-+                    return err_code;\
-+                }\
-+            } while (0)
-+
-+/**
-+ * Use to check input parameter and if failed, return err_code and print warning message,
-+ * this should be used for non-vital error checking.
-+ */
-+#define CheckWarning(condition, err_code, err_msg, args...) \
-+            do { \
-+                if (condition) { \
-+                    LOGW(err_msg, ##args);\
-+                    return err_code;\
-+                }\
-+            } while (0)
-+
-+// As above but no return.
-+#define CheckWarningNoReturn(condition, err_msg, args...) \
-+                            do { \
-+                                if (condition) { \
-+                                    LOGW(err_msg, ##args);\
-+                                }\
-+                            } while (0)
-+
-+// macro delete array and set it to null
-+#define DELETE_ARRAY_AND_NULLIFY(var) \
-+    do { \
-+        delete[] (var); \
-+        var = nullptr; \
-+    } while(0)
-+
-+/**
-+ *  \macro TIMEVAL2NSECS
-+ *  Convert timeval struct to value in nanoseconds
-+ *  Helper macro to convert timeval struct to nanosecond values stored in a
-+ *  long long signed value (equivalent to int64_t)
-+ */
-+#define TIMEVAL2NSECS(x) (int64_t)((x).tv_sec*1000000000LL + (x).tv_usec*1000LL)
-+
-+/**
-+ *  \macro TIMEVAL2USECS
-+ *  Convert timeval struct to value in microseconds
-+ *  Helper macro to convert timeval struct to microsecond values stored in a
-+ *  long long signed value (equivalent to int64_t)
-+ */
-+#define TIMEVAL2USECS(x) (int64_t)(((x).tv_sec*1000000000LL + \
-+                                    (x).tv_usec*1000LL)/1000LL)
-+
-+// macro for float comparaion with 0
-+#define EPSILON 0.00001
-+
-+// macro for the MAX FILENAME
-+#define MAX_SYS_NAME 64
-+#define MAX_TARGET_NAME 256
-+
-+// A macro to disallow the copy constructor and operator= functions
-+// This should be used in the private:declarations for a class
-+#ifndef DISALLOW_COPY_AND_ASSIGN
-+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
-+    TypeName(const TypeName&) = delete; \
-+    TypeName& operator=(const TypeName&) = delete
-+#endif
-+
-+/**
-+ *  Maker note maximum sizes
-+ *  Section 1 is used for Normal capture
-+ *  Section 2 is used for RAW captures
-+ */
-+#define MAKERNOTE_SECTION1_SIZE 56000
-+#define MAKERNOTE_SECTION2_SIZE 110592
-+
-+// macro for memcpy
-+#ifndef MEMCPY_S
-+#define MEMCPY_S(dest, dmax, src, smax) memcpy((dest), (src), std::min((size_t)(dmax), (size_t)(smax)))
-+#endif
-+
-+#define STDCOPY(dst, src, size) std::copy((src), ((src) + (size)), (dst))
-+
-+// macro for isys compression width/height calculation
-+#define ISYS_COMPRESSION_STRIDE_ALIGNMENT_BYTES 512
-+#define ISYS_COMPRESSION_HEIGHT_ALIGNMENT 1
-+#define ISYS_COMPRESSION_PAGE_SIZE 0x1000
-+// macro for psys compression width/height calculation
-+#define PSYS_COMPRESSION_PSA_Y_STRIDE_ALIGNMENT 256
-+#define PSYS_COMPRESSION_PSA_UV_STRIDE_ALIGNMENT 256
-+#define PSYS_COMPRESSION_PSA_HEIGHT_ALIGNMENT 2
-+#define PSYS_COMPRESSION_OFS_STRIDE_ALIGNMENT 128
-+#define PSYS_COMPRESSION_OFS_TILE_HEIGHT_ALIGNMENT 32
-+#define PSYS_COMPRESSION_OFS_LINEAR_HEIGHT_ALIGNMENT 2
-+#define PSYS_COMPRESSION_PAGE_SIZE 0x1000
-+#define UV_STRIDE_DIVIDER 2
-+#define UV_HEIGHT_DIVIDER 2
-+// tile size definition
-+#define ISYS_COMPRESSION_TILE_SIZE_BYTES 512
-+#define TILE_SIZE_YUV420_Y 256
-+#define TILE_SIZE_YUV420_UV 128
-+#define TILE_SIZE_OFS10_12_TILEY 256
-+#define TILE_SIZE_OFS8_TILEY 256
-+#define TILE_SIZE_OFS8_10_LINEAR 128
-+
-+//tile status bits definition
-+#define ISYS_COMPRESSION_TILE_STATUS_BITS 4
-+#define TILE_STATUS_BITS_YUV420_Y 2
-+#define TILE_STATUS_BITS_YUV420_UV 1
-+#define TILE_STATUS_BITS_OFS_NV12_TILE_Y	 8
-+#define TILE_STATUS_BITS_OFS_P010_TILE_Y 8
-+#define TILE_STATUS_BITS_OFS8_10_LINEAR 1
-+#define TILE_STATUS_BITS_TNR_NV12_LINEAR 4
-+
-+#define CAMHAL_CEIL_DIV(a,b)   (((a) + (b) - 1) / (b))
-+
-+#define FOURCC_TO_UL(a,b,c,d) \
-+    ((uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24))
-+
-+#define DEFAULT_JPEG_QUALITY   95
-+#define DEFAULT_THUMBNAIL_QUALITY 0
-+
-+//Internal useful tool for format
-+namespace CameraUtils {
-+
-+    int getFileContent(const char* filename, char* buffer, int maxSize);
-+
-+    const char *tuningMode2String(TuningMode mode);
-+
-+    TuningMode string2TuningMode(const char *str);
-+
-+    const char *pixelCode2String(int code);
-+
-+    int string2PixelCode(const char *code);
-+
-+    int string2IaFourccCode(const char *code);
-+
-+    std::string format2string (int format);
-+
-+    int string2format(const char *str);
-+
-+    const std::string fourcc2String(int format4cc);
-+
-+    unsigned int fourcc2UL(char *str4cc);
-+
-+    bool isPlanarFormat(int format);
-+
-+    bool isRaw(int format);
-+
-+    int getBpp(int format);
-+
-+    int getStride (int format, int width);
-+
-+    int getCompressedFrameSize(int format, int width, int height);
-+
-+    int getFrameSize(int format, int width, int height, bool needAlignedHeight = false, bool needExtraSize = true, bool needCompression = false);
-+
-+    int getNumOfPlanes(int format);
-+
-+    void getDeviceName(const char* entityName, std::string& deviceNodeName, bool isSubDev = false);
-+
-+    void getSubDeviceName(const char* entityName, std::string& deviceNodeName);
-+
-+    int getInterlaceHeight(int field, int height);
-+
-+    bool isMultiExposureCase(TuningMode tuningMode);
-+
-+    bool isUllPsysPipe(TuningMode tuningMode);
-+
-+    ConfigMode getConfigModeByName(const char* ConfigName);
-+
-+    ConfigMode getConfigModeBySceneMode(camera_scene_mode_t sceneMode);
-+
-+    void getConfigModeFromString(std::string str, std::vector<ConfigMode> &cfgModes);
-+
-+    camera_scene_mode_t getSceneModeByName(const char* sceneName);
-+
-+    camera_awb_mode_t getAwbModeByName(const char* awbName);
-+
-+    unsigned int getMBusFormat(int cameraId, unsigned int isysFmt);
-+
-+    void* dlopenLibrary(const char* name, int flags);
-+    void* dlsymLibrary(void* handle, const char* str);
-+    int dlcloseLibrary(void* handle);
-+
-+    /**
-+     * Spit the given srcStr by delim into a vector of sub strings.
-+     */
-+    std::vector<std::string> splitString(const char* srcStr, char delim);
-+
-+    nsecs_t systemTime();
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
-new file mode 100644
-index 000000000000..259e69ed2b0a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
-@@ -0,0 +1,540 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "EXIFMaker"
-+
-+#include <limits.h>
-+
-+#include "EXIFMaker.h"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include "ParameterHelper.h"
-+
-+namespace icamera {
-+
-+#define DEFAULT_ISO_SPEED 100
-+
-+EXIFMaker::EXIFMaker() :
-+    mExifSize(-1)
-+    ,mInitialized(false)
-+{
-+    LOG1("@%s", __func__);
-+    CLEAR(mExifAttributes);
-+    mMakernoteSection = new unsigned char[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
-+}
-+
-+EXIFMaker::~EXIFMaker()
-+{
-+    LOG1("@%s", __func__);
-+    delete [] mMakernoteSection;
-+}
-+
-+/**
-+ * Fills EXIF data after a picture has been taken to
-+ * record the active sensor, 3A and ISP state to EXIF metadata.
-+ *
-+ * This function is intented to set EXIF tags belonging
-+ * to the EXIF "Per Picture Camera Setting" group.
-+ *
-+ * @arg params active Android HAL parameters
-+ */
-+void EXIFMaker::pictureTaken(ExifMetaData *exifmetadata)
-+{
-+    LOG1("@%s", __func__);
-+
-+    // brightness, -99.99 to 99.99. FFFFFFFF.H means unknown.
-+    float brightness;
-+    // TODO: The check for getAeManualBrightness of 3A should be moved
-+    //       to MetaData class, because the metadata collection happen
-+    //       at capture time
-+    brightness = 99;
-+    mExifAttributes.brightness.num = static_cast<int>(brightness * 100);
-+    mExifAttributes.brightness.den = 100;
-+    LOG1("EXIF: brightness = %.2f", brightness);
-+
-+    mExifAttributes.contrast   = 0;
-+    mExifAttributes.saturation = 0;
-+    mExifAttributes.sharpness  = 0;
-+    LOG1("EXIF: contrast=%d, saturation=%d, sharpness=%d (0:normal 1:low 2:high)",
-+            mExifAttributes.contrast,
-+            mExifAttributes.saturation,
-+            mExifAttributes.sharpness);
-+
-+    mExifAttributes.exposure_program = EXIF_EXPOSURE_PROGRAM_NORMAL;
-+    LOG1("EXIF: Exposure Program = Normal");
-+    mExifAttributes.exposure_mode = EXIF_EXPOSURE_AUTO;
-+    LOG1("EXIF: Exposure Mode = Auto");
-+
-+    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
-+
-+    LOG1("EXIF: ISO=%d", mExifAttributes.iso_speed_rating);
-+    mExifAttributes.metering_mode = EXIF_METERING_AVERAGE;
-+    mExifAttributes.white_balance = EXIF_WB_AUTO;
-+
-+    mExifAttributes.light_source = EXIF_LIGHT_SOURCE_UNKNOWN;
-+
-+    mExifAttributes.light_source  = EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE;
-+
-+    mExifAttributes.scene_capture_type = EXIF_SCENE_STANDARD;
-+
-+    int rotation = exifmetadata->mJpegSetting.orientation;
-+    mExifAttributes.orientation = EXIF_ORIENTATION_UP;
-+    if (0 == rotation)
-+        mExifAttributes.orientation = EXIF_ORIENTATION_UP;
-+    else if (90 == rotation)
-+        mExifAttributes.orientation = EXIF_ORIENTATION_90;
-+    else if (180 == rotation)
-+        mExifAttributes.orientation = EXIF_ORIENTATION_180;
-+    else if (270 == rotation)
-+        mExifAttributes.orientation = EXIF_ORIENTATION_270;
-+
-+    // Platform has no HW rotation. No swap here
-+    //if (rotation % 180 == 90)
-+    //    swap(mExifAttributes.width, mExifAttributes.height);
-+
-+    mExifAttributes.zoom_ratio.num = exifmetadata->zoomRatio;
-+    mExifAttributes.zoom_ratio.den = 100;
-+    // the unit of subjectDistance is meter, focus distance from 3A is mm.
-+    mExifAttributes.subject_distance.num = 0;
-+    mExifAttributes.subject_distance.den = 1000;
-+    mExifAttributes.custom_rendered = exifmetadata->hdr ?
-+        EXIF_CUSTOM_RENDERED_HDR : EXIF_DEF_CUSTOM_RENDERED;
-+    LOG2("subject_distance is %d", mExifAttributes.subject_distance.num);
-+}
-+
-+/**
-+ * Called when the the camera static configuration is known.
-+ *
-+ * @arg width: width of the main JPEG picture.
-+ * @arg height: height of the main JPEG picture.
-+ */
-+void EXIFMaker::initialize(int width, int height)
-+{
-+    /* We clear the exif attributes, so we won't be using some old values
-+     * from a previous EXIF generation.
-+     */
-+    clear();
-+
-+    // Initialize the mExifAttributes with specific values
-+    // time information
-+    time_t rawtime;
-+    struct tm *timeinfo;
-+    time(&rawtime);
-+    timeinfo = localtime(&rawtime);
-+    if (timeinfo) {
-+        strftime((char *)mExifAttributes.date_time, sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", timeinfo);
-+        // fields: tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday, tm_yday, tm_isdst, tm_gmtoff, tm_zone
-+    } else {
-+        LOGW("nullptr timeinfo from localtime(), using defaults...");
-+        struct tm tmpTime = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "UTC"};
-+        strftime((char *)mExifAttributes.date_time, sizeof(mExifAttributes.date_time), "%Y:%m:%d %H:%M:%S", &tmpTime);
-+    }
-+
-+    // set default subsec time to 1000
-+    const char subsecTime[] = "1000";
-+    MEMCPY_S((char *)mExifAttributes.subsec_time, sizeof(mExifAttributes.subsec_time), subsecTime, sizeof(subsecTime));
-+
-+    // conponents configuration.
-+    // Default = 4 5 6 0(if RGB uncompressed), 1 2 3 0(other cases)
-+    // 0 = does not exist; 1 = Y; 2 = Cb; 3 = Cr; 4 = R; 5 = G; 6 = B; other = reserved
-+    mExifAttributes.components_configuration[0] = 1;
-+    mExifAttributes.components_configuration[1] = 2;
-+    mExifAttributes.components_configuration[2] = 3;
-+    mExifAttributes.components_configuration[3] = 0;
-+
-+    // set default values for fnumber and focal length
-+    // (see EXIFMaker::setDriverData() how to override these)
-+    mExifAttributes.fnumber.num = EXIF_DEF_FNUMBER_NUM;
-+    mExifAttributes.fnumber.den = EXIF_DEF_FNUMBER_DEN;
-+    mExifAttributes.focal_length.num = EXIF_DEF_FOCAL_LEN_NUM;
-+    mExifAttributes.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
-+
-+    // TODO: should ISO be omitted if the value cannot be trusted?
-+    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
-+
-+    mExifAttributes.aperture.den = EXIF_DEF_APEX_DEN;
-+    mExifAttributes.aperture.num = EXIF_DEF_APEX_NUM;
-+    // max aperture. the smallest F number of the lens. unit is APEX value.
-+    mExifAttributes.max_aperture.num = mExifAttributes.aperture.num;
-+    mExifAttributes.max_aperture.den = mExifAttributes.aperture.den;
-+
-+    // subject distance,    0 means distance unknown; (~0) means infinity.
-+    mExifAttributes.subject_distance.num = EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN;
-+    mExifAttributes.subject_distance.den = 1;
-+
-+    // light source, 0 means light source unknown
-+    mExifAttributes.light_source = 0;
-+    // TODO: for awb mode
-+
-+    // gain control, 0 = none;
-+    // 1 = low gain up; 2 = high gain up; 3 = low gain down; 4 = high gain down
-+    mExifAttributes.gain_control = 0;
-+
-+    // contrast, 0 = normal; 1 = soft; 2 = hard; other = reserved
-+    mExifAttributes.contrast = EXIF_CONTRAST_NORMAL;
-+
-+    // saturation, 0 = normal; 1 = Low saturation; 2 = High saturation; other = reserved
-+    mExifAttributes.saturation = EXIF_SATURATION_NORMAL;
-+
-+    // sharpness, 0 = normal; 1 = soft; 2 = hard; other = reserved
-+    mExifAttributes.sharpness = EXIF_SHARPNESS_NORMAL;
-+
-+    // the picture's width and height
-+    mExifAttributes.width = width;
-+    mExifAttributes.height = height;
-+
-+    mExifAttributes.orientation = 1;
-+
-+    mExifAttributes.custom_rendered = EXIF_DEF_CUSTOM_RENDERED;
-+
-+    // metering mode, 0 = normal; 1 = soft; 2 = hard; other = reserved
-+    mExifAttributes.metering_mode = EXIF_METERING_UNKNOWN;
-+    mInitialized = true;
-+}
-+
-+void EXIFMaker::initializeLocation(ExifMetaData* metadata)
-+{
-+    LOG1("@%s", __func__);
-+    // GIS information
-+    bool gpsEnabled = false;
-+    double latitude = metadata->mGpsSetting.latitude;
-+    double longitude = metadata->mGpsSetting.longitude;
-+    double altitude = metadata->mGpsSetting.altitude;
-+    long timestamp = metadata->mGpsSetting.gpsTimeStamp;
-+    char* pprocmethod = metadata->mGpsSetting.gpsProcessingMethod;
-+
-+    //todo: no intel extension for direction, support in future
-+    /*
-+    const char *pimgdirection = params.get(IntelCameraParameters::KEY_GPS_IMG_DIRECTION);
-+    const char *pimgdirectionref = params.get(IntelCameraParameters::KEY_GPS_IMG_DIRECTION_REF);
-+
-+    double imgdirection = 0.0;
-+    if (pimgdirection) {
-+        imgdirection = atof(pimgdirection);
-+        if ((pimgdirectionref == nullptr)
-+            ||((strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_TRUE) != 0)
-+            && (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_MAGNETIC) != 0))
-+            || (imgdirection < 0 || imgdirection > 359.99))
-+            pimgdirection = nullptr;
-+    }
-+     */
-+    // check whether the GIS Information is valid
-+    if(!(latitude >= -EPSILON && latitude <= EPSILON) ||
-+       !(longitude >= -EPSILON && longitude <= EPSILON) ||
-+       !(altitude >= -EPSILON && altitude <= EPSILON) ||
-+       (timestamp != 0) || (strlen(pprocmethod) != 0))
-+        gpsEnabled = true;
-+
-+    mExifAttributes.enableGps = 0;
-+    LOG1("EXIF: gpsEnabled: %d", gpsEnabled);
-+
-+    // the version is given as 2.2.0.0, it is mandatory when GPSInfo tag is present
-+    if(gpsEnabled) {
-+        const unsigned char gpsversion[4] = {0x02, 0x02, 0x00, 0x00};
-+        MEMCPY_S(mExifAttributes.gps_version_id,
-+             sizeof(mExifAttributes.gps_version_id),
-+             gpsversion,
-+             sizeof(gpsversion));
-+    } else {
-+        return;
-+    }
-+
-+    // latitude, for example, 39.904214 degrees, N
-+    if(latitude > 0)
-+        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref),
-+                 "N", sizeof(mExifAttributes.gps_latitude_ref));
-+    else
-+        MEMCPY_S(mExifAttributes.gps_latitude_ref, sizeof(mExifAttributes.gps_latitude_ref),
-+                 "S", sizeof(mExifAttributes.gps_latitude_ref));
-+
-+    latitude = fabs(latitude);
-+    mExifAttributes.gps_latitude[0].num = (uint32_t)latitude;
-+    mExifAttributes.gps_latitude[0].den = 1;
-+    mExifAttributes.gps_latitude[1].num = (uint32_t)((latitude - mExifAttributes.gps_latitude[0].num) * 60);
-+    mExifAttributes.gps_latitude[1].den = 1;
-+    mExifAttributes.gps_latitude[2].num = (uint32_t)(((latitude - mExifAttributes.gps_latitude[0].num) * 60 - mExifAttributes.gps_latitude[1].num) * 60 * 100);
-+    mExifAttributes.gps_latitude[2].den = 100;
-+    mExifAttributes.enableGps |= EXIF_GPS_LATITUDE;
-+    LOG1("EXIF: latitude, ref:%s, dd:%d, mm:%d, ss:%d",
-+         mExifAttributes.gps_latitude_ref, mExifAttributes.gps_latitude[0].num,
-+         mExifAttributes.gps_latitude[1].num, mExifAttributes.gps_latitude[2].num);
-+
-+    // longitude, for example, 116.407413 degrees, E
-+    if(longitude > 0)
-+        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref),
-+                 "E", sizeof(mExifAttributes.gps_longitude_ref));
-+    else
-+        MEMCPY_S(mExifAttributes.gps_longitude_ref, sizeof(mExifAttributes.gps_longitude_ref),
-+                 "W", sizeof(mExifAttributes.gps_longitude_ref));
-+    longitude = fabs(longitude);
-+    mExifAttributes.gps_longitude[0].num = (uint32_t)longitude;
-+    mExifAttributes.gps_longitude[0].den = 1;
-+    mExifAttributes.gps_longitude[1].num = (uint32_t)((longitude - mExifAttributes.gps_longitude[0].num) * 60);
-+    mExifAttributes.gps_longitude[1].den = 1;
-+    mExifAttributes.gps_longitude[2].num = (uint32_t)(((longitude - mExifAttributes.gps_longitude[0].num) * 60 - mExifAttributes.gps_longitude[1].num) * 60 * 100);
-+    mExifAttributes.gps_longitude[2].den = 100;
-+    mExifAttributes.enableGps |= EXIF_GPS_LONGITUDE;
-+    LOG1("EXIF: longitude, ref:%s, dd:%d, mm:%d, ss:%d",
-+         mExifAttributes.gps_longitude_ref, mExifAttributes.gps_longitude[0].num,
-+         mExifAttributes.gps_longitude[1].num, mExifAttributes.gps_longitude[2].num);
-+
-+    // altitude
-+    // altitude, sea level or above sea level, set it to 0; below sea level, set it to 1
-+    mExifAttributes.gps_altitude_ref = ((altitude > 0) ? 0 : 1);
-+    altitude = fabs(altitude);
-+    mExifAttributes.gps_altitude.num = (uint32_t)altitude;
-+    mExifAttributes.gps_altitude.den = 1;
-+    mExifAttributes.enableGps |= EXIF_GPS_ALTITUDE;
-+    LOG1("EXIF: altitude, ref:%d, height:%d", mExifAttributes.gps_altitude_ref, mExifAttributes.gps_altitude.num);
-+
-+    // timestamp
-+    if (timestamp >= LONG_MAX || timestamp <= LONG_MIN)
-+    {
-+        timestamp = 0;
-+        LOGW("invalid timestamp was provided, defaulting to 0 (i.e. 1970)");
-+    }
-+    struct tm time;
-+    gmtime_r(&timestamp, &time);
-+    time.tm_year += 1900;
-+    time.tm_mon += 1;
-+    mExifAttributes.gps_timestamp[0].num = time.tm_hour;
-+    mExifAttributes.gps_timestamp[0].den = 1;
-+    mExifAttributes.gps_timestamp[1].num = time.tm_min;
-+    mExifAttributes.gps_timestamp[1].den = 1;
-+    mExifAttributes.gps_timestamp[2].num = time.tm_sec;
-+    mExifAttributes.gps_timestamp[2].den = 1;
-+    mExifAttributes.enableGps |= EXIF_GPS_TIMESTAMP;
-+
-+    snprintf((char *)mExifAttributes.gps_datestamp, sizeof(mExifAttributes.gps_datestamp), "%04d:%02d:%02d",
-+                time.tm_year, time.tm_mon, time.tm_mday);
-+
-+    LOG1("EXIF: timestamp, year:%d,mon:%d,day:%d,hour:%d,min:%d,sec:%d",
-+            time.tm_year, time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec);
-+
-+    // processing method
-+    MEMCPY_S(mExifAttributes.gps_processing_method,
-+             sizeof(mExifAttributes.gps_processing_method),
-+             metadata->mGpsSetting.gpsProcessingMethod,
-+             sizeof(metadata->mGpsSetting.gpsProcessingMethod));
-+    mExifAttributes.gps_processing_method[sizeof(mExifAttributes.gps_processing_method) - 1] = 0;
-+
-+    mExifAttributes.enableGps |= EXIF_GPS_PROCMETHOD;
-+    LOG1("EXIF: GPS processing method:%s", mExifAttributes.gps_processing_method);
-+
-+    //todo: no intel extension for direction, support in future
-+    /*
-+    if (pimgdirection && pimgdirectionref)  {
-+        if (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_TRUE) == 0)
-+            memcpy(mExifAttributes.gps_img_direction_ref, "T", sizeof(mExifAttributes.gps_img_direction_ref));
-+        else if (strcmp(pimgdirectionref, IntelCameraParameters::GPS_IMG_DIRECTION_REF_MAGNETIC) == 0)
-+            memcpy(mExifAttributes.gps_img_direction_ref, "M", sizeof(mExifAttributes.gps_img_direction_ref));
-+        mExifAttributes.gps_img_direction.num = (uint32_t)(imgdirection*100);
-+        mExifAttributes.gps_img_direction.den = 100;
-+        mExifAttributes.enableGps |= EXIF_GPS_IMG_DIRECTION;
-+        LOG1("EXIF: GPS img direction ref:%s, img direction num:%d, den:%d",
-+            mExifAttributes.gps_img_direction_ref,
-+            mExifAttributes.gps_img_direction.num,
-+            mExifAttributes.gps_img_direction.den);
-+    }
-+    */
-+}
-+
-+void EXIFMaker::setSensorAeConfig()
-+{
-+    LOG1("@%s", __func__);
-+
-+    mExifAttributes.exposure_time.num = 0;
-+    mExifAttributes.exposure_time.den = 1;
-+    mExifAttributes.shutter_speed.num = 0;
-+    mExifAttributes.shutter_speed.den = 1;
-+    mExifAttributes.exposure_bias.num = 0;
-+    mExifAttributes.exposure_bias.den = 100;
-+}
-+
-+/*
-+ * more secure attribute copy routine.
-+ * \param dst pointer to dst buffer
-+ * \param dstSize dst buffer size
-+ * \param src pointer to src character buffer
-+ * \param srcLength src buffer length in characters, not including null byte
-+ */
-+void EXIFMaker::copyAttribute(uint8_t *dst, size_t dstSize,
-+                              const char *src, size_t srcLength)
-+{
-+    size_t dstMaxLength = dstSize - 1; // leave space for null
-+    MEMCPY_S(dst, dstMaxLength, src, srcLength); // copy chars (not null)
-+    // add null termination
-+    size_t len = std::min(dstMaxLength, srcLength);
-+    dst[len] = '\0';
-+}
-+
-+void EXIFMaker::clear()
-+{
-+    LOG1("@%s", __func__);
-+    // Reset all the attributes
-+    CLEAR(mExifAttributes);
-+    // Initialize the common values
-+    mExifAttributes.enableThumb = false;
-+    copyAttribute(mExifAttributes.image_description,
-+                  sizeof(mExifAttributes.image_description),
-+                  EXIF_DEF_IMAGE_DESCRIPTION,
-+                  strlen(EXIF_DEF_IMAGE_DESCRIPTION));
-+
-+    copyAttribute(mExifAttributes.maker,
-+                  sizeof(mExifAttributes.maker),
-+                  "INTEL",
-+                  strlen("INTEL"));
-+
-+    copyAttribute(mExifAttributes.model,
-+                  sizeof(mExifAttributes.model),
-+                  "Chrome",
-+                  strlen("Chrome"));
-+
-+    copyAttribute(mExifAttributes.software,
-+                  sizeof(mExifAttributes.software),
-+                  EXIF_DEF_SOFTWARE,
-+                  strlen(EXIF_DEF_SOFTWARE));
-+
-+    copyAttribute(mExifAttributes.exif_version,
-+                  sizeof(mExifAttributes.exif_version),
-+                  EXIF_DEF_EXIF_VERSION,
-+                  strlen(EXIF_DEF_EXIF_VERSION));
-+
-+    copyAttribute(mExifAttributes.flashpix_version,
-+                  sizeof(mExifAttributes.flashpix_version),
-+                  EXIF_DEF_FLASHPIXVERSION,
-+                  strlen(EXIF_DEF_FLASHPIXVERSION));
-+
-+    // initially, set default flash
-+    mExifAttributes.flash = EXIF_DEF_FLASH;
-+
-+    // normally it is sRGB, 1 means sRGB. FFFF.H means uncalibrated
-+    mExifAttributes.color_space = EXIF_DEF_COLOR_SPACE;
-+
-+    // the number of pixels per ResolutionUnit in the w or h direction
-+    // 72 means the image resolution is unknown
-+    mExifAttributes.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
-+    mExifAttributes.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
-+    mExifAttributes.y_resolution.num = mExifAttributes.x_resolution.num;
-+    mExifAttributes.y_resolution.den = mExifAttributes.x_resolution.den;
-+    // resolution unit, 2 means inch
-+    mExifAttributes.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
-+    // when thumbnail uses JPEG compression, this tag 103H's value is set to 6
-+    mExifAttributes.compression_scheme = EXIF_DEF_COMPRESSION;
-+
-+    // the TIFF default is 1 (centered)
-+    mExifAttributes.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
-+
-+    // Clear the Intel 3A Makernote information
-+    mExifAttributes.makerNoteData = mMakernoteSection;
-+    mExifAttributes.makerNoteDataSize = 0;
-+    mExifAttributes.makernoteToApp2 = ENABLE_APP2_MARKER;
-+
-+    mInitialized = false;
-+}
-+
-+void EXIFMaker::enableFlash(bool enable, int8_t aeMode, int8_t flashMode)
-+{
-+
-+    mExifAttributes.flash = EXIF_DEF_FLASH;
-+
-+}
-+
-+void EXIFMaker::setThumbnail(unsigned char *data, size_t size, int width, int height)
-+{
-+    LOG1("@%s: data = %p, size = %zu", __func__, data, size);
-+    mExifAttributes.enableThumb = true;
-+    mExifAttributes.widthThumb = width;
-+    mExifAttributes.heightThumb = height;
-+    if (mEncoder.setThumbData(data, size) != EXIF_SUCCESS) {
-+        LOGE("Error in setting EXIF thumbnail");
-+    }
-+}
-+
-+bool EXIFMaker::isThumbnailSet() const {
-+    LOG1("@%s", __func__);
-+    return mEncoder.isThumbDataSet();
-+}
-+
-+size_t EXIFMaker::makeExif(unsigned char *data)
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!data, 0, "nullptr passed for EXIF. Cannot generate EXIF!");
-+
-+    if (mEncoder.makeExif(data, &mExifAttributes, &mExifSize) == EXIF_SUCCESS) {
-+        LOG1("Generated EXIF (@%p) of size: %zu", data, mExifSize);
-+        return mExifSize;
-+    }
-+    return 0;
-+}
-+
-+void EXIFMaker::setMaker(const char *data)
-+{
-+    LOG1("@%s: data = %s", __func__, data);
-+
-+    snprintf((char*)mExifAttributes.maker, sizeof(mExifAttributes.maker), "%s", data);
-+}
-+
-+void EXIFMaker::setModel(const char *data)
-+{
-+    LOG1("@%s: data = %s", __func__, data);
-+
-+    snprintf((char*)mExifAttributes.model, sizeof(mExifAttributes.model), "%s", data);
-+}
-+
-+void EXIFMaker::setSoftware(const char *data)
-+{
-+    LOG1("@%s: data = %s", __func__, data);
-+
-+    snprintf((char*)mExifAttributes.software, sizeof(mExifAttributes.software), "%s", data);
-+}
-+
-+void EXIFMaker::saveMakernote(const Parameters &params)
-+{
-+    unsigned int size = sizeof(unsigned char) * (MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE);
-+    if (params.getMakernoteData(mMakernoteSection, &size) == OK) {
-+        mExifAttributes.makerNoteDataSize = size;
-+    }
-+}
-+
-+void EXIFMaker::updateSensorInfo(const Parameters &params)
-+{
-+    float focal = 0.0;
-+    params.getFocalLength(focal);
-+
-+    if (focal < EPSILON) {
-+        // Focal length is not supported, set to default value
-+        icamera::CameraMetadata meta;
-+        icamera::ParameterHelper::copyMetadata(params, &meta);
-+
-+        icamera_metadata_entry entry = meta.find(CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
-+        if (entry.count >= 1) {
-+            focal = entry.data.f[0];
-+        }
-+    }
-+
-+    LOG2("focal length is %f", focal);
-+    mExifAttributes.focal_length.num = focal * mExifAttributes.focal_length.den;
-+    float aperture = 0.0;
-+    params.getAperture(aperture);
-+    mExifAttributes.aperture.num = aperture * mExifAttributes.aperture.den;
-+
-+    mExifAttributes.fnumber.num = aperture * mExifAttributes.aperture.den;
-+    mExifAttributes.fnumber.den = mExifAttributes.aperture.den;
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
-new file mode 100644
-index 000000000000..8227f4b405c3
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
-@@ -0,0 +1,69 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "ExifCreater.h"
-+#include "EXIFMetaData.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class EXIFMaker
-+ *
-+ */
-+class EXIFMaker {
-+
-+public:
-+    EXIFMaker();
-+    ~EXIFMaker();
-+
-+    void initialize(int width, int height);
-+    bool isInitialized() { return mInitialized; }
-+    void initializeLocation(ExifMetaData* metadata);
-+    uint32_t getMakerNoteDataSize() const;
-+    void pictureTaken(ExifMetaData *exifmetadata);
-+    void enableFlash(bool enable, int8_t aeMode, int8_t flashMode);
-+    void setThumbnail(unsigned char *data, size_t size, int width, int height);
-+    bool isThumbnailSet() const;
-+    size_t makeExif(unsigned char *data);
-+    void setMaker(const char *data);
-+    void setModel(const char *data);
-+    void setSoftware(const char *data);
-+    void updateSensorInfo(const Parameters &params);
-+    void saveMakernote(const Parameters &params);
-+    void setSensorAeConfig();
-+
-+private: // member variables
-+    ExifCreater mEncoder;
-+    exif_attribute_t mExifAttributes;
-+    size_t mExifSize;
-+    bool mInitialized;
-+    unsigned char *mMakernoteSection;
-+
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(EXIFMaker);
-+
-+private: // Methods
-+    void copyAttribute(uint8_t *dst, size_t dstSize,
-+                       const char *src, size_t srcLength);
-+
-+    void clear();
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
-new file mode 100644
-index 000000000000..bc10d87454c9
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.cpp
-@@ -0,0 +1,57 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "EXIFMetaData"
-+
-+#include "EXIFMetaData.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+namespace icamera {
-+
-+#define DEFAULT_ISO_SPEED 100
-+
-+ExifMetaData::ExifMetaData():
-+    effectMode(CAM_EFFECT_NONE)
-+    , software(nullptr)
-+    , hdr(false)
-+    , flashFired(false)
-+    , v3AeMode(BAD_VALUE)
-+    , flashMode(BAD_VALUE)
-+    , saveMirrored(false)
-+    , cameraOrientation(0)
-+    , currentOrientation(0)
-+    , zoomRatio(1)
-+{
-+    ALOGI("@%s", __func__);
-+    mJpegSetting.jpegQuality = 90;
-+    mJpegSetting.jpegThumbnailQuality = 90;
-+    mJpegSetting.orientation = 0;
-+    mJpegSetting.thumbWidth = 320;
-+    mJpegSetting.thumbHeight = 240;
-+    mGpsSetting.latitude = 0.0;
-+    mGpsSetting.longitude = 0.0;
-+    mGpsSetting.altitude = 0.0;
-+    CLEAR(mGpsSetting.gpsProcessingMethod);
-+    mGpsSetting.gpsTimeStamp = 0;
-+}
-+
-+ExifMetaData::~ExifMetaData()
-+{
-+
-+}
-+
-+}// namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
-new file mode 100644
-index 000000000000..f65e36db6a3b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMetaData.h
-@@ -0,0 +1,65 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Errors.h"
-+#include "Parameters.h"
-+namespace icamera {
-+
-+#define MAX_NUM_GPS_PROCESSING_METHOD 64
-+
-+/**
-+ * \class ExifMetaData
-+ *
-+ */
-+class ExifMetaData {
-+public:
-+    ExifMetaData();
-+    virtual ~ExifMetaData();
-+
-+    // jpeg info
-+    struct JpegSetting{
-+        uint8_t jpegQuality;
-+        uint8_t jpegThumbnailQuality;
-+        int thumbWidth;
-+        int thumbHeight;
-+        int orientation;
-+    };
-+    // GPS info
-+    struct GpsSetting{
-+        double latitude;
-+        double longitude;
-+        double altitude;
-+        char gpsProcessingMethod[MAX_NUM_GPS_PROCESSING_METHOD];
-+        long gpsTimeStamp;
-+    };
-+    // exif info
-+    JpegSetting mJpegSetting;
-+    GpsSetting mGpsSetting;
-+    camera_effect_mode_t effectMode;
-+    char *software;                            /*!< software string from HAL */
-+    bool hdr;                                  /*!< whether hdr was used */
-+    bool flashFired;                           /*!< whether flash was fired */
-+    int8_t v3AeMode;                           /*!< v3 ae mode (e.g. for flash) */
-+    int8_t flashMode;                          /*!< flash mode (e.g. TORCH,SINGLE,OFF) */
-+    bool saveMirrored;                         /*!< whether to do mirroring */
-+    int cameraOrientation;                     /*!< camera sensor orientation */
-+    int currentOrientation;                    /*!< Current orientation of the device */
-+    int zoomRatio;
-+};
-+
-+}// namespace android
-diff --git a/camera/hal/intel/ipu6/src/jpeg/Exif.h b/camera/hal/intel/ipu6/src/jpeg/Exif.h
-new file mode 100644
-index 000000000000..321ebe898a00
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/Exif.h
-@@ -0,0 +1,344 @@
-+/*
-+ * Copyright Samsung Electronics Co.,LTD.
-+ * Copyright (C) 2010 The Android Open Source Project
-+ * Copyright (C) 2016-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <math.h>
-+
-+#define EXIF_LOG2(x)                    (log((double)(x)) / log(2.0))
-+#define APEX_FNUM_TO_APERTURE(x)        (2 * (EXIF_LOG2((double)(x))))
-+#define APEX_EXPOSURE_TO_SHUTTER(x)     (-1.0 * (EXIF_LOG2((double)(x))))
-+#define APEX_ISO_TO_FILMSENSITIVITY(x)  ((int)(EXIF_LOG2((x) / 3.125) + 0.5))
-+
-+#define NUM_SIZE                    2
-+#define IFD_SIZE                    12
-+#define OFFSET_SIZE                 4
-+
-+#define NUM_0TH_IFD_TIFF            14
-+#define NUM_0TH_IFD_EXIF            36
-+#define NUM_0TH_IFD_GPS             12
-+#define NUM_1TH_IFD_TIFF            9
-+// For QVGA: 320 * 240 * 1.5
-+#define EXIF_SIZE_LIMITATION        0x10000
-+// Limite the thumbnail size to 32k, to make sure the whole exif size does
-+// not exceed the exif size limitation. We guess the total size of all the
-+// other fields is smaller than 32k. (Currently the size is about 26k.)
-+#define THUMBNAIL_SIZE_LIMITATION   0x8000
-+
-+/* Type */
-+#define EXIF_TYPE_BYTE              1
-+#define EXIF_TYPE_ASCII             2
-+#define EXIF_TYPE_SHORT             3
-+#define EXIF_TYPE_LONG              4
-+#define EXIF_TYPE_RATIONAL          5
-+#define EXIF_TYPE_UNDEFINED         7
-+#define EXIF_TYPE_SLONG             9
-+#define EXIF_TYPE_SRATIONAL         10
-+
-+#define EXIF_FILE_SIZE              28800
-+
-+/* 0th IFD TIFF Tags */
-+#define EXIF_TAG_IMAGE_WIDTH                    0x0100
-+#define EXIF_TAG_IMAGE_HEIGHT                   0x0101
-+#define EXIF_TAG_IMAGE_DESCRIPTION              0x010e
-+#define EXIF_TAG_MAKE                           0x010f
-+#define EXIF_TAG_MODEL                          0x0110
-+#define EXIF_TAG_ORIENTATION                    0x0112
-+#define EXIF_TAG_X_RESOLUTION                   0x011A
-+#define EXIF_TAG_Y_RESOLUTION                   0x011B
-+#define EXIF_TAG_RESOLUTION_UNIT                0x0128
-+#define EXIF_TAG_SOFTWARE                       0x0131
-+#define EXIF_TAG_DATE_TIME                      0x0132
-+#define EXIF_TAG_YCBCR_POSITIONING              0x0213
-+#define EXIF_TAG_EXIF_IFD_POINTER               0x8769
-+#define EXIF_TAG_GPS_IFD_POINTER                0x8825
-+
-+/* 0th IFD Exif Private Tags */
-+#define EXIF_TAG_EXPOSURE_TIME                  0x829A
-+#define EXIF_TAG_FNUMBER                        0x829D
-+#define EXIF_TAG_EXPOSURE_PROGRAM               0x8822
-+#define EXIF_TAG_ISO_SPEED_RATING               0x8827
-+#define EXIF_TAG_EXIF_VERSION                   0x9000
-+#define EXIF_TAG_DATE_TIME_ORG                  0x9003
-+#define EXIF_TAG_DATE_TIME_DIGITIZE             0x9004
-+#define EXIF_TAG_COMPONENTS_CONFIGURATION       0x9101
-+#define EXIF_TAG_SHUTTER_SPEED                  0x9201
-+#define EXIF_TAG_APERTURE                       0x9202
-+#define EXIF_TAG_BRIGHTNESS                     0x9203
-+#define EXIF_TAG_EXPOSURE_BIAS                  0x9204
-+#define EXIF_TAG_MAX_APERTURE                   0x9205
-+#define EXIF_TAG_SUBJECT_DISTANCE               0x9206
-+#define EXIF_TAG_METERING_MODE                  0x9207
-+#define EXIF_TAG_LIGHT_SOURCE                   0x9208
-+#define EXIF_TAG_FLASH                          0x9209
-+#define EXIF_TAG_FOCAL_LENGTH                   0x920A
-+#define EXIF_TAG_MAKER_NOTE                     0x927C
-+#define EXIF_TAG_USER_COMMENT                   0x9286
-+#define EXIF_TAG_SUBSEC_TIME                    0x9290
-+#define EXIF_TAG_SUBSEC_TIME_ORIG               0x9291
-+#define EXIF_TAG_SUBSEC_TIME_DIG                0x9292
-+#define EXIF_TAG_FLASH_PIX_VERSION              0xA000
-+#define EXIF_TAG_COLOR_SPACE                    0xA001
-+#define EXIF_TAG_PIXEL_X_DIMENSION              0xA002
-+#define EXIF_TAG_PIXEL_Y_DIMENSION              0xA003
-+#define EXIF_TAG_CUSTOM_RENDERED                0xA401
-+#define EXIF_TAG_EXPOSURE_MODE                  0xA402
-+#define EXIF_TAG_WHITE_BALANCE                  0xA403
-+#define EXIF_TAG_JPEG_ZOOM_RATIO                0XA404
-+#define EXIF_TAG_SCENCE_CAPTURE_TYPE            0xA406
-+#define EXIF_TAG_GAIN_CONTROL                   0xA407
-+#define EXIF_TAG_CONTRAST                       0xA408
-+#define EXIF_TAG_SATURATION                     0xA409
-+#define EXIF_TAG_SHARPNESS                      0xA40A
-+
-+/* 0th IFD GPS Info Tags */
-+#define EXIF_TAG_GPS_VERSION_ID                 0x0000
-+#define EXIF_TAG_GPS_LATITUDE_REF               0x0001
-+#define EXIF_TAG_GPS_LATITUDE                   0x0002
-+#define EXIF_TAG_GPS_LONGITUDE_REF              0x0003
-+#define EXIF_TAG_GPS_LONGITUDE                  0x0004
-+#define EXIF_TAG_GPS_ALTITUDE_REF               0x0005
-+#define EXIF_TAG_GPS_ALTITUDE                   0x0006
-+#define EXIF_TAG_GPS_TIMESTAMP                  0x0007
-+#define EXIF_TAG_GPS_IMG_DIRECTION_REF          0x0010
-+#define EXIF_TAG_GPS_IMG_DIRECTION              0x0011
-+#define EXIF_TAG_GPS_PROCESSING_METHOD          0x001B
-+#define EXIF_TAG_GPS_DATESTAMP                  0x001D
-+
-+/* 1th IFD TIFF Tags */
-+#define EXIF_TAG_COMPRESSION_SCHEME             0x0103
-+/*
-+#define EXIF_TAG_X_RESOLUTION                   0x011A
-+#define EXIF_TAG_Y_RESOLUTION                   0x011B
-+#define EXIF_TAG_RESOLUTION_UNIT                0x0128
-+*/
-+#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT        0x0201
-+#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN    0x0202
-+
-+typedef enum {
-+    EXIF_ORIENTATION_UP     = 1,
-+    EXIF_ORIENTATION_90     = 6,
-+    EXIF_ORIENTATION_180    = 3,
-+    EXIF_ORIENTATION_270    = 8,
-+} ExifOrientationType;
-+
-+typedef enum {
-+    EXIF_SCENE_STANDARD,
-+    EXIF_SCENE_LANDSCAPE,
-+    EXIF_SCENE_PORTRAIT,
-+    EXIF_SCENE_NIGHT,
-+} CamExifSceneCaptureType;
-+
-+typedef enum {
-+    EXIF_METERING_UNKNOWN,
-+    EXIF_METERING_AVERAGE,
-+    EXIF_METERING_CENTER,
-+    EXIF_METERING_SPOT,
-+    EXIF_METERING_MULTISPOT,
-+    EXIF_METERING_PATTERN,
-+    EXIF_METERING_PARTIAL,
-+    EXIF_METERING_OTHER     = 255,
-+} CamExifMeteringModeType;
-+
-+typedef enum {
-+    EXIF_EXPOSURE_AUTO,
-+    EXIF_EXPOSURE_MANUAL,
-+    EXIF_EXPOSURE_AUTO_BRACKET,
-+} CamExifExposureModeType;
-+
-+typedef enum {
-+    EXIF_WB_AUTO,
-+    EXIF_WB_MANUAL,
-+} CamExifWhiteBalanceType;
-+
-+typedef enum
-+{
-+    EXIF_LIGHT_SOURCE_UNKNOWN,
-+    EXIF_LIGHT_SOURCE_DAYLIGHT,
-+    EXIF_LIGHT_SOURCE_FLUORESCENT,
-+    EXIF_LIGHT_SOURCE_TUNGSTEN,
-+    EXIF_LIGHT_SOURCE_FLASH,
-+    EXIF_LIGHT_SOURCE_FINE_WEATHER = 9,
-+    EXIF_LIGHT_SOURCE_CLOUDY_WEATHER,
-+    EXIF_LIGHT_SOURCE_SHADE,
-+    EXIF_LIGHT_SOURCE_DAYLIGHT_FLUORESCENT,
-+    EXIF_LIGHT_SOURCE_DAY_WHITE_FLUORESCENT,
-+    EXIF_LIGHT_SOURCE_COOL_WHITE_FLUORESCENT,
-+    EXIF_LIGHT_SOURCE_WHITE_FLUORESCENT,
-+    EXIF_LIGHT_SOURCE_WARM_WHITE_FLUORESCENT, //value 16 is used in EXIF V2.3, not for EXIF V2.2
-+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_A,
-+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_B,
-+    EXIF_LIGHT_SOURCE_STANDARD_LIGHT_C,
-+    EXIF_LIGHT_SOURCE_D55,
-+    EXIF_LIGHT_SOURCE_D65,
-+    EXIF_LIGHT_SOURCE_D75,
-+    EXIF_LIGHT_SOURCE_D50,
-+    EXIF_LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN,
-+    EXIF_LIGHT_SOURCE_OTHER_LIGHT_SOURCE = 255,
-+} CamExifLightSourceType;
-+
-+typedef enum {
-+    EXIF_EXPOSURE_PROGRAM_MANUAL = 1,
-+    EXIF_EXPOSURE_PROGRAM_NORMAL = 2,
-+    EXIF_EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3,
-+    EXIF_EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4
-+} CamExifExposureProgramType;
-+
-+typedef enum {
-+    EXIF_CONTRAST_NORMAL = 0,
-+    EXIF_CONTRAST_SOFT = 1,
-+    EXIF_CONTRAST_HARD = 2,
-+} CamExifContrastType;
-+
-+typedef enum {
-+    EXIF_SATURATION_NORMAL = 0,
-+    EXIF_SATURATION_LOW = 1,
-+    EXIF_SATURATION_HIGH = 2,
-+} CamExifSaturationType;
-+
-+typedef enum {
-+    EXIF_SHARPNESS_NORMAL = 0,
-+    EXIF_SHARPNESS_SOFT = 1,
-+    EXIF_SHARPNESS_HARD = 2,
-+} CamExifSharpnessType;
-+
-+/* define the flag of enable gps info */
-+const uint8_t   EXIF_GPS_LATITUDE       = 0x01;
-+const uint8_t   EXIF_GPS_LONGITUDE      = 0x02;
-+const uint8_t   EXIF_GPS_ALTITUDE       = 0x04;
-+const uint8_t   EXIF_GPS_TIMESTAMP      = 0x08;
-+const uint8_t   EXIF_GPS_PROCMETHOD     = 0x10;
-+const uint8_t   EXIF_GPS_IMG_DIRECTION  = 0x20;
-+
-+/* Values */
-+#define EXIF_DEF_IMAGE_DESCRIPTION          "Jpeg"
-+#define EXIF_DEF_SOFTWARE       "Android"
-+#define EXIF_DEF_EXIF_VERSION   "0220"
-+#define EXIF_DEF_USERCOMMENTS   "  "
-+#define EXIF_DEF_FLASHPIXVERSION "0100" /* Flashpix Format Version 1.0 */
-+
-+#define EXIF_DEF_YCBCR_POSITIONING  1   /* centered */
-+#define EXIF_DEF_FNUMBER_NUM        26  /* 2.6 */
-+#define EXIF_DEF_FNUMBER_DEN        10
-+#define EXIF_DEF_EXPOSURE_PROGRAM   3   /* aperture priority */
-+#define EXIF_DEF_FOCAL_LEN_NUM      278 /* 2.78mm */
-+#define EXIF_DEF_FOCAL_LEN_DEN      100
-+#define EXIF_DEF_FLASH              0   /* O: off, 1: on*/
-+#define EXIF_FLASH_FORCED_ON        1 << 3; /* mode description */
-+#define EXIF_FLASH_FORCED_OFF       1 << 4; /* mode description */
-+#define EXIF_FLASH_AUTO             1 << 3 | 1 << 4; /* mode description */
-+#define EXIF_FLASH_ON               1   /* O: off, 1: on - fired or not*/
-+#define EXIF_DEF_COLOR_SPACE        1
-+#define EXIF_DEF_CUSTOM_RENDERED    0
-+#define EXIF_CUSTOM_RENDERED_HDR    1
-+#define EXIF_DEF_EXPOSURE_MODE      EXIF_EXPOSURE_AUTO
-+#define EXIF_DEF_APEX_DEN           10
-+#define EXIF_DEF_APEX_NUM           25
-+#define EXIF_DEF_SUBJECT_DISTANCE_UNKNOWN   0
-+
-+#define EXIF_DEF_COMPRESSION        6
-+#define EXIF_DEF_RESOLUTION_NUM     72
-+#define EXIF_DEF_RESOLUTION_DEN     1
-+#define EXIF_DEF_RESOLUTION_UNIT    2   /* inches */
-+
-+typedef struct {
-+    uint32_t num;
-+    uint32_t den;
-+} rational_t;
-+
-+typedef struct {
-+    int32_t num;
-+    int32_t den;
-+} srational_t;
-+
-+typedef struct {
-+    bool enableThumb;
-+
-+    uint8_t image_description[32];
-+    uint8_t flashpix_version[4];
-+    uint8_t components_configuration[4];
-+    uint8_t maker[32];
-+    uint8_t model[32];
-+    uint8_t software[32];
-+    uint8_t exif_version[4];
-+    uint8_t date_time[20];
-+    uint8_t subsec_time[8];
-+    uint8_t user_comment[150];
-+
-+    uint32_t width;
-+    uint32_t height;
-+    uint32_t widthThumb;
-+    uint32_t heightThumb;
-+
-+    uint16_t orientation;
-+    uint16_t ycbcr_positioning;
-+    uint16_t exposure_program;
-+    uint16_t iso_speed_rating;
-+    uint16_t metering_mode;
-+    uint16_t flash;
-+    uint16_t color_space;
-+    uint16_t custom_rendered;
-+    uint16_t exposure_mode;
-+    uint16_t white_balance;
-+    rational_t zoom_ratio;
-+    uint16_t scene_capture_type;
-+    uint16_t light_source;
-+    uint16_t gain_control;
-+    uint16_t contrast;
-+    uint16_t saturation;
-+    uint16_t sharpness;
-+
-+    rational_t exposure_time;
-+    rational_t fnumber;
-+    rational_t aperture;
-+    rational_t max_aperture;
-+    rational_t focal_length;
-+    rational_t subject_distance;
-+
-+    srational_t shutter_speed;
-+    srational_t brightness;
-+    srational_t exposure_bias;
-+
-+    //bit 0~4 indicate whether Gps items latitude, longitude, altitude, timestamp,
-+    //datastamp exist or not.
-+    uint8_t enableGps;
-+    uint8_t gps_latitude_ref[2];
-+    uint8_t gps_longitude_ref[2];
-+
-+    uint8_t gps_version_id[4];
-+    uint8_t gps_altitude_ref;
-+
-+    rational_t gps_latitude[3];
-+    rational_t gps_longitude[3];
-+    rational_t gps_altitude;
-+    rational_t gps_timestamp[3];
-+    uint8_t gps_datestamp[11];
-+    uint8_t gps_processing_method[100];
-+
-+    uint8_t gps_img_direction_ref[2];
-+    rational_t gps_img_direction;
-+
-+    rational_t x_resolution;
-+    rational_t y_resolution;
-+    uint16_t resolution_unit;
-+    uint16_t compression_scheme;
-+
-+    uint16_t makerNoteDataSize;
-+    unsigned char *makerNoteData;
-+    bool makernoteToApp2;
-+} exif_attribute_t;
-diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
-new file mode 100644
-index 000000000000..2cd5b18a3dda
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.cpp
-@@ -0,0 +1,604 @@
-+/*
-+ * Copyright Samsung Electronics Co.,LTD.
-+ * Copyright (C) 2010 The Android Open Source Project
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ *
-+ * JPEG DRIVER MODULE (ExifCreater.cpp)
-+ * Author  : ge.lee       -- initial version
-+ * Date    : 03 June 2010
-+ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
-+ */
-+
-+#define LOG_TAG "ExifCreater"
-+
-+#include <sys/mman.h>
-+#include <fcntl.h>
-+#include "iutils/CameraLog.h"
-+
-+#include "ExifCreater.h"
-+
-+static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
-+
-+namespace icamera {
-+
-+ExifCreater::ExifCreater()
-+{
-+    m_thumbBuf = nullptr;
-+    m_thumbSize = 0;
-+}
-+
-+ExifCreater::~ExifCreater()
-+{
-+}
-+
-+exif_status ExifCreater::setThumbData(const void *thumbBuf, unsigned int thumbSize)
-+{
-+    // TODO: Maybe we should take into account the rest of the EXIF data as well here,
-+    // not just the thumbnail size.
-+    if (thumbSize >= EXIF_SIZE_LIMITATION) {
-+        LOGE("ERROR: Too big thumb size %d (limit: %d)", thumbSize, EXIF_SIZE_LIMITATION);
-+        m_thumbBuf = nullptr;
-+        m_thumbSize = 0;
-+        return EXIF_FAIL;
-+    }
-+
-+    m_thumbBuf = (unsigned char *)thumbBuf;
-+    m_thumbSize = thumbSize;
-+    return EXIF_SUCCESS;
-+}
-+
-+bool ExifCreater::isThumbDataSet() const
-+{
-+    return m_thumbBuf != nullptr;
-+}
-+
-+// if exif tags size + thumbnail size is > 64K, it will disable thumbnail
-+exif_status ExifCreater::makeExif (void *exifOut,
-+                                        exif_attribute_t *exifInfo,
-+                                        size_t *size)
-+{
-+    LOG1("makeExif start");
-+
-+    unsigned char *pCur, *pApp1Start, *pIfdStart, *pGpsIfdPtr, *pNextIfdOffset;
-+    unsigned int tmp, LongerTagOffset = 0, LongerTagOffsetWithoutThumbnail;
-+    pApp1Start = pCur = (unsigned char *)exifOut;
-+
-+    // 2 Exif Identifier Code & TIFF Header
-+    pCur += 4;  // Skip 4 Byte for APP1 marker and length
-+    unsigned char ExifIdentifierCode[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
-+    MEMCPY_S(pCur, sizeof(ExifIdentifierCode), ExifIdentifierCode, sizeof(ExifIdentifierCode));
-+    pCur += 6;
-+
-+    /* Byte Order - little endian, Offset of IFD - 0x00000008.H */
-+    unsigned char TiffHeader[8] = { 0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00 };
-+    MEMCPY_S(pCur, sizeof(TiffHeader), TiffHeader, sizeof(TiffHeader));
-+    pIfdStart = pCur;
-+    pCur += 8;
-+
-+    // 2 0th IFD TIFF Tags
-+    if (exifInfo->enableGps)
-+        tmp = NUM_0TH_IFD_TIFF;
-+    else
-+        tmp = NUM_0TH_IFD_TIFF - 1;
-+
-+    MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
-+    pCur += NUM_SIZE;
-+
-+    LongerTagOffset += 8 + NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-+
-+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-+                 1, exifInfo->width);
-+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-+                 1, exifInfo->height);
-+    writeExifIfd(&pCur, EXIF_TAG_IMAGE_DESCRIPTION, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->image_description) + 1, exifInfo->image_description, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_MAKE, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->maker) + 1, exifInfo->maker, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_MODEL, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->model) + 1, exifInfo->model, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-+                 1, exifInfo->orientation);
-+    writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->x_resolution, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->y_resolution, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
-+                 1, exifInfo->resolution_unit);
-+    writeExifIfd(&pCur, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->software) + 1, exifInfo->software, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII,
-+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_YCBCR_POSITIONING, EXIF_TYPE_SHORT,
-+                 1, exifInfo->ycbcr_positioning);
-+    writeExifIfd(&pCur, EXIF_TAG_EXIF_IFD_POINTER, EXIF_TYPE_LONG,
-+                 1, LongerTagOffset);
-+
-+    pGpsIfdPtr = pCur;
-+    if (exifInfo->enableGps) {
-+        pCur += IFD_SIZE;   // Skip a ifd size for gps IFD pointer
-+    }
-+
-+    pNextIfdOffset = pCur;  // Skip a offset size for next IFD offset
-+    pCur += OFFSET_SIZE;
-+
-+    // 2 0th IFD Exif Private Tags
-+    pCur = pIfdStart + LongerTagOffset;
-+
-+    int drop_num = 0;
-+    if (exifInfo->exposure_time.den == 0)
-+        drop_num++;
-+    if (exifInfo->shutter_speed.den == 0)
-+        drop_num++;
-+    if (exifInfo->makerNoteDataSize == 0 || exifInfo->makernoteToApp2) {
-+        // skip the makernote IFD in APP1, when we don't have any,
-+        // or if we want it to APP2
-+        drop_num++;
-+    }
-+    tmp = NUM_0TH_IFD_EXIF - drop_num;
-+    MEMCPY_S(pCur, NUM_SIZE, &tmp, NUM_SIZE);
-+    pCur += NUM_SIZE;
-+
-+    LongerTagOffset += NUM_SIZE + tmp * IFD_SIZE + OFFSET_SIZE;
-+    if (exifInfo->exposure_time.den != 0) {
-+        writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL,
-+                     1, &exifInfo->exposure_time, &LongerTagOffset, pIfdStart);
-+    }
-+    writeExifIfd(&pCur, EXIF_TAG_FNUMBER, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->fnumber, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_PROGRAM, EXIF_TYPE_SHORT,
-+                 1, exifInfo->exposure_program);
-+    writeExifIfd(&pCur, EXIF_TAG_ISO_SPEED_RATING, EXIF_TYPE_SHORT,
-+                 1, exifInfo->iso_speed_rating);
-+    writeExifIfd(&pCur, EXIF_TAG_EXIF_VERSION, EXIF_TYPE_UNDEFINED,
-+                 4, exifInfo->exif_version);
-+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_ORG, EXIF_TYPE_ASCII,
-+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_DIGITIZE, EXIF_TYPE_ASCII,
-+                 20, exifInfo->date_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_COMPONENTS_CONFIGURATION, EXIF_TYPE_UNDEFINED,
-+                 4, exifInfo->components_configuration);
-+    if (exifInfo->shutter_speed.den != 0) {
-+        writeExifIfd(&pCur, EXIF_TAG_SHUTTER_SPEED, EXIF_TYPE_SRATIONAL,
-+                     1, (rational_t *)&exifInfo->shutter_speed, &LongerTagOffset, pIfdStart);
-+    }
-+    writeExifIfd(&pCur, EXIF_TAG_APERTURE, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->aperture, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_BRIGHTNESS, EXIF_TYPE_SRATIONAL,
-+                 1, (rational_t *)&exifInfo->brightness, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_BIAS, EXIF_TYPE_SRATIONAL,
-+                 1, (rational_t *)&exifInfo->exposure_bias, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_MAX_APERTURE, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->max_aperture, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_SUBJECT_DISTANCE, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->subject_distance, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->metering_mode);
-+    writeExifIfd(&pCur, EXIF_TAG_LIGHT_SOURCE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->light_source);
-+    writeExifIfd(&pCur, EXIF_TAG_FLASH, EXIF_TYPE_SHORT,
-+                 1, exifInfo->flash);
-+    writeExifIfd(&pCur, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL,
-+                 1, &exifInfo->focal_length, &LongerTagOffset, pIfdStart);
-+    char code[8] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00 };
-+    size_t commentsLen = strlen((char *)exifInfo->user_comment) + 1;
-+    if(commentsLen > (sizeof(exifInfo->user_comment) - sizeof(code)))
-+        return EXIF_FAIL;
-+    memmove(exifInfo->user_comment + sizeof(code), exifInfo->user_comment, commentsLen);
-+    MEMCPY_S(exifInfo->user_comment, sizeof(exifInfo->user_comment), code, sizeof(code));
-+    writeExifIfd(&pCur, EXIF_TAG_USER_COMMENT, EXIF_TYPE_UNDEFINED,
-+                 commentsLen + sizeof(code), exifInfo->user_comment, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_ORIG, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_SUBSEC_TIME_DIG, EXIF_TYPE_ASCII,
-+                 strlen((char *)exifInfo->subsec_time)+1, exifInfo->subsec_time, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_FLASH_PIX_VERSION, EXIF_TYPE_UNDEFINED,
-+                 4, exifInfo->flashpix_version);
-+    writeExifIfd(&pCur, EXIF_TAG_COLOR_SPACE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->color_space);
-+    writeExifIfd(&pCur, EXIF_TAG_PIXEL_X_DIMENSION, EXIF_TYPE_LONG,
-+                 1, exifInfo->width);
-+    writeExifIfd(&pCur, EXIF_TAG_PIXEL_Y_DIMENSION, EXIF_TYPE_LONG,
-+                 1, exifInfo->height);
-+    writeExifIfd(&pCur, EXIF_TAG_CUSTOM_RENDERED, EXIF_TYPE_SHORT,
-+                 1, exifInfo->custom_rendered);
-+    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->exposure_mode);
-+    writeExifIfd(&pCur, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->white_balance);
-+    writeExifIfd(&pCur, EXIF_TAG_JPEG_ZOOM_RATIO, EXIF_TYPE_RATIONAL,
-+                1, &exifInfo->zoom_ratio, &LongerTagOffset, pIfdStart);
-+    writeExifIfd(&pCur, EXIF_TAG_SCENCE_CAPTURE_TYPE, EXIF_TYPE_SHORT,
-+                 1, exifInfo->scene_capture_type);
-+    writeExifIfd(&pCur, EXIF_TAG_GAIN_CONTROL, EXIF_TYPE_SHORT,
-+                 1, exifInfo->gain_control);
-+    writeExifIfd(&pCur, EXIF_TAG_CONTRAST, EXIF_TYPE_SHORT,
-+             1, exifInfo->contrast);
-+    writeExifIfd(&pCur, EXIF_TAG_SATURATION, EXIF_TYPE_SHORT,
-+             1, exifInfo->saturation);
-+    writeExifIfd(&pCur, EXIF_TAG_SHARPNESS, EXIF_TYPE_SHORT,
-+             1, exifInfo->sharpness);
-+
-+    // Save MakerNote data to APP1, unless we want it APP2
-+    if (exifInfo->makerNoteDataSize > 0 && !exifInfo->makernoteToApp2) {
-+        writeExifIfd(
-+            &pCur,
-+            EXIF_TAG_MAKER_NOTE,
-+            EXIF_TYPE_UNDEFINED,
-+            exifInfo->makerNoteDataSize,
-+            (unsigned char *)exifInfo->makerNoteData,
-+            &LongerTagOffset,
-+            pIfdStart
-+            );
-+    }
-+
-+    tmp = 0;
-+    MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
-+    pCur += OFFSET_SIZE;
-+
-+    // 2 0th IFD GPS Info Tags
-+    if (exifInfo->enableGps) {
-+        writeExifIfd(&pGpsIfdPtr, EXIF_TAG_GPS_IFD_POINTER, EXIF_TYPE_LONG,
-+                     1, LongerTagOffset); // GPS IFD pointer skipped on 0th IFD
-+
-+        pCur = pIfdStart + LongerTagOffset;
-+
-+        tmp = NUM_0TH_IFD_GPS;
-+        if ((exifInfo->enableGps & EXIF_GPS_LATITUDE) == 0)
-+            tmp -= 2;
-+        if ((exifInfo->enableGps & EXIF_GPS_LONGITUDE) == 0)
-+            tmp -= 2;
-+        if ((exifInfo->enableGps & EXIF_GPS_ALTITUDE) == 0)
-+            tmp -= 2;
-+        if ((exifInfo->enableGps & EXIF_GPS_TIMESTAMP) == 0)
-+            tmp -= 1;
-+        if ((exifInfo->enableGps & EXIF_GPS_PROCMETHOD) == 0)
-+            tmp -= 1;
-+        if ((exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) == 0)
-+            tmp -= 2;
-+
-+        MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
-+        pCur += NUM_SIZE;
-+
-+        LongerTagOffset += NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-+
-+        writeExifIfd(&pCur, EXIF_TAG_GPS_VERSION_ID, EXIF_TYPE_BYTE,
-+                     4, exifInfo->gps_version_id);
-+        if (exifInfo->enableGps & EXIF_GPS_LATITUDE) {
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE_REF, EXIF_TYPE_ASCII,
-+                         2, exifInfo->gps_latitude_ref);
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL,
-+                         3, exifInfo->gps_latitude, &LongerTagOffset, pIfdStart);
-+        }
-+
-+        if (exifInfo->enableGps & EXIF_GPS_LONGITUDE) {
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_TYPE_ASCII,
-+                         2, exifInfo->gps_longitude_ref);
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL,
-+                         3, exifInfo->gps_longitude, &LongerTagOffset, pIfdStart);
-+        }
-+
-+        if (exifInfo->enableGps & EXIF_GPS_ALTITUDE) {
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_TYPE_BYTE,
-+                         1, exifInfo->gps_altitude_ref);
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL,
-+                         1, &exifInfo->gps_altitude, &LongerTagOffset, pIfdStart);
-+        }
-+
-+        if (exifInfo->enableGps & EXIF_GPS_TIMESTAMP) {
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_TIMESTAMP, EXIF_TYPE_RATIONAL,
-+                         3, exifInfo->gps_timestamp, &LongerTagOffset, pIfdStart);
-+        }
-+
-+        if (exifInfo->enableGps & EXIF_GPS_IMG_DIRECTION) {
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION_REF, EXIF_TYPE_ASCII,
-+                         2, exifInfo->gps_img_direction_ref);
-+            writeExifIfd(&pCur, EXIF_TAG_GPS_IMG_DIRECTION, EXIF_TYPE_RATIONAL,
-+                         1, &exifInfo->gps_img_direction, &LongerTagOffset, pIfdStart);
-+        }
-+
-+        if (exifInfo->enableGps & EXIF_GPS_PROCMETHOD) {
-+            tmp = strlen((char*)exifInfo->gps_processing_method);
-+            if (tmp > 0) {
-+                if (tmp > 100) {
-+                    tmp = 100;
-+                }
-+                unsigned char tmp_buf[100+sizeof(ExifAsciiPrefix)];
-+                MEMCPY_S(tmp_buf, sizeof(tmp_buf), ExifAsciiPrefix, sizeof(ExifAsciiPrefix));
-+                MEMCPY_S(&tmp_buf[sizeof(ExifAsciiPrefix)], 100, exifInfo->gps_processing_method, tmp);
-+                writeExifIfd(&pCur, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_TYPE_UNDEFINED,
-+                             tmp+sizeof(ExifAsciiPrefix), tmp_buf, &LongerTagOffset, pIfdStart);
-+            }
-+        }
-+        writeExifIfd(&pCur, EXIF_TAG_GPS_DATESTAMP, EXIF_TYPE_ASCII,
-+                     11, exifInfo->gps_datestamp, &LongerTagOffset, pIfdStart);
-+        tmp = 0;
-+        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
-+        pCur += OFFSET_SIZE;
-+    }
-+
-+    // backup LongerTagOffset, if the total exif size is > 64K, we will use it.
-+    LongerTagOffsetWithoutThumbnail = LongerTagOffset;
-+    if (LongerTagOffsetWithoutThumbnail >= EXIF_SIZE_LIMITATION) {
-+        LOGE("line:%d, in the makeExif, the size exceeds 64K", __LINE__);
-+        return EXIF_FAIL;
-+    }
-+
-+    // 2 1th IFD TIFF Tags
-+    if (exifInfo->enableThumb && (m_thumbBuf != nullptr) && (m_thumbSize > 0)) {
-+        writeThumbData(pIfdStart, pNextIfdOffset, &LongerTagOffset, exifInfo);
-+    } else {
-+        tmp = 0;
-+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-+    }
-+
-+    // fill APP1 maker
-+    unsigned char App1Marker[2] = { 0xff, 0xe1 };
-+    MEMCPY_S(pApp1Start, 2, App1Marker, 2);
-+    pApp1Start += 2;
-+
-+    // calc and fill the APP1 segment total size, 2 is length; 6 is ExifIdentifierCode
-+    *size = 2 + 6 + LongerTagOffset;
-+
-+    writeMarkerSizeToBuf(pApp1Start, *size);
-+
-+    unsigned app2StartOffset = *size;
-+    *size += 2; // APP1 marker size
-+
-+    exif_status status = EXIF_SUCCESS;
-+
-+    if (exifInfo->makernoteToApp2) {
-+        LOG1("Makernote goes to APP2 segment.");
-+        status = makeApp2((pApp1Start + app2StartOffset), *size, exifInfo);
-+    }
-+
-+    if (status != EXIF_SUCCESS)
-+        LOGW("Failed to create EXIF APP2 section");
-+
-+    LOG1("makeExif End");
-+
-+    return EXIF_SUCCESS;
-+}
-+
-+void ExifCreater::writeMarkerSizeToBuf(unsigned char *ptrTo, unsigned int size)
-+{
-+    unsigned char size_mm[2] = {
-+        static_cast<unsigned char>((size >> 8) & 0xFF),
-+        static_cast<unsigned char>(size & 0xFF) };
-+
-+    MEMCPY_S(ptrTo, 2, size_mm, 2);
-+}
-+
-+/**
-+ * makeApp2
-+ *
-+ * Write the makernote to APP2 segment. Use multiple APP2 segments if makernote
-+ * size is more than one segment (64 kb)
-+ *
-+ * \param pStartApp2 [IN] APP2 start address
-+ * \param exifInfo [IN] Data to be written
-+ * \param writeId [IN] Whether to write the Intel Makernote ID string.
-+ * \param size [OUT] Total size after APP2 is written
-+ */
-+exif_status ExifCreater::makeApp2(void* pStartApp2, size_t& size, exif_attribute_t *exifInfo, bool writeId)
-+{
-+    LOG1("@%s", __func__);
-+
-+    // APP2 marker will be written starting from the pos pointed to by
-+    // pStartApp2
-+
-+    if (exifInfo->makerNoteDataSize <= 0)
-+        return EXIF_SUCCESS;
-+
-+    int bytesLeftForSegment = EXIF_SIZE_LIMITATION;
-+    int bytesToWrite = exifInfo->makerNoteDataSize;
-+
-+    unsigned char *pCur = nullptr, *pApp2Start = nullptr;
-+    unsigned char App2Marker[SIZEOF_APP2_MARKER] = { 0xff, 0xe2 };
-+    int writeCount = 0;
-+    unsigned char *toWrite = exifInfo->makerNoteData;
-+
-+    pCur = static_cast<unsigned char*>(pStartApp2);
-+
-+    // Write Makernote up to ~64kB, then split to a new
-+    // APP2 segment, if needed
-+    while (bytesToWrite > 0) {
-+        pApp2Start = pCur;
-+        pCur += 4;  // Skip 4 bytes for APP2 marker and length
-+
-+        if (writeId) {
-+            MEMCPY_S(pCur, sizeof(MAKERNOTE_ID), MAKERNOTE_ID, sizeof(MAKERNOTE_ID));
-+            pCur += sizeof(MAKERNOTE_ID);
-+            size += sizeof(MAKERNOTE_ID);
-+            // ID overhead for one APP2 segment
-+            bytesLeftForSegment -= sizeof(MAKERNOTE_ID);
-+        }
-+
-+        // Overhead for one APP2 segment:
-+        bytesLeftForSegment -= (sizeof(App2Marker) + SIZEOF_LENGTH_FIELD);
-+
-+        if (bytesToWrite > bytesLeftForSegment) {
-+            // More data to write than what fits to one APP2 marker
-+            writeCount = bytesLeftForSegment;
-+        } else {
-+            // All data fits to one APP2 segment
-+            writeCount = bytesToWrite;
-+        }
-+
-+        bytesToWrite -= writeCount;
-+
-+        MEMCPY_S(pCur, writeCount, toWrite, writeCount);
-+        pCur += writeCount;
-+        toWrite += writeCount;
-+        size += writeCount;
-+
-+        // Last, put the APP2 marker to the beginning of the segment
-+        MEMCPY_S(pApp2Start, sizeof(App2Marker), App2Marker, sizeof(App2Marker));
-+        pApp2Start += sizeof(App2Marker);
-+
-+        // Length field goes after the APP2 marker
-+        int app2SegmentSize = writeCount + SIZEOF_LENGTH_FIELD; // Raw data written + overhead
-+        if (writeId)
-+            app2SegmentSize += sizeof(MAKERNOTE_ID);
-+
-+        writeMarkerSizeToBuf(pApp2Start, app2SegmentSize);
-+
-+        // add the 2 bytes for both length field and APP2 marker, the caller has to know the total size
-+        size += sizeof(App2Marker) + SIZEOF_LENGTH_FIELD;
-+
-+        // Reset byte counts for another APP2 segment, if needed
-+        bytesLeftForSegment = EXIF_SIZE_LIMITATION;
-+    }
-+
-+    return EXIF_SUCCESS;
-+}
-+
-+void ExifCreater::writeThumbData(unsigned char *pIfdStart,
-+                                        unsigned char *pNextIfdOffset,
-+                                        unsigned int *LongerTagOffset,
-+                                        exif_attribute_t *exifInfo)
-+{
-+    unsigned char *pCur;
-+    unsigned int tmp;
-+
-+    // firstly calc the exif total size, if it's > 64K, we'll disable the thumbnail
-+    tmp  = 4 + 6 + *LongerTagOffset;  // 4 is APP1 marker and length; 6 is ExifIdentifierCode
-+    tmp += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
-+    tmp += sizeof(exifInfo->x_resolution) + sizeof(exifInfo->y_resolution);
-+    tmp += m_thumbSize;
-+
-+    if(tmp > EXIF_SIZE_LIMITATION) {
-+        LOGD("line:%d, in makeExif, exif total size(%d) > 64K, we'll disable thumbnail.", __LINE__, tmp);
-+        m_thumbSize = 0;
-+        m_thumbBuf = nullptr;
-+        tmp = 0;
-+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-+    } else {
-+        tmp = *LongerTagOffset;
-+        MEMCPY_S(pNextIfdOffset, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-+
-+        pCur = pIfdStart + *LongerTagOffset;
-+
-+        tmp = NUM_1TH_IFD_TIFF;
-+        MEMCPY_S(pCur, NUM_SIZE, (int8_t *) &tmp, NUM_SIZE);
-+        pCur += NUM_SIZE;
-+
-+        *LongerTagOffset += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
-+
-+        writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-+                     1, exifInfo->widthThumb);
-+        writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-+                     1, exifInfo->heightThumb);
-+        writeExifIfd(&pCur, EXIF_TAG_COMPRESSION_SCHEME, EXIF_TYPE_SHORT,
-+                     1, exifInfo->compression_scheme);
-+        writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-+                     1, exifInfo->orientation);
-+        writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
-+                     1, &exifInfo->x_resolution, LongerTagOffset, pIfdStart);
-+        writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
-+                     1, &exifInfo->y_resolution, LongerTagOffset, pIfdStart);
-+        writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
-+                     1, exifInfo->resolution_unit);
-+        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT, EXIF_TYPE_LONG,
-+                     1, *LongerTagOffset);
-+        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN, EXIF_TYPE_LONG,
-+                     1, m_thumbSize);
-+
-+        tmp = 0;
-+        MEMCPY_S(pCur, OFFSET_SIZE, (int8_t *) &tmp, OFFSET_SIZE); // next IFD offset
-+        //pCur += OFFSET_SIZE;
-+
-+        MEMCPY_S(pIfdStart + *LongerTagOffset, m_thumbSize, m_thumbBuf, m_thumbSize);
-+        *LongerTagOffset += m_thumbSize;
-+    }
-+}
-+
-+void ExifCreater::writeExifIfd(unsigned char **pCur,
-+                                         unsigned short tag,
-+                                         unsigned short type,
-+                                         unsigned int count,
-+                                         uint32_t value)
-+{
-+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
-+    *pCur += 4;
-+    MEMCPY_S(*pCur, 4, (int8_t *) &value, 4);
-+    *pCur += 4;
-+}
-+
-+void ExifCreater::writeExifIfd(unsigned char **pCur,
-+                                         unsigned short tag,
-+                                         unsigned short type,
-+                                         unsigned int count,
-+                                         unsigned char *pValue)
-+{
-+    char buf[4] = { 0,};
-+
-+    MEMCPY_S(buf, count, pValue, count);
-+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
-+    *pCur += 4;
-+    MEMCPY_S(*pCur, 4, (int8_t *) buf, 4);
-+    *pCur += 4;
-+}
-+
-+void ExifCreater::writeExifIfd(unsigned char **pCur,
-+                                         unsigned short tag,
-+                                         unsigned short type,
-+                                         unsigned int count,
-+                                         unsigned char *pValue,
-+                                         unsigned int *offset,
-+                                         unsigned char *start)
-+{
-+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
-+    *pCur += 4;
-+    MEMCPY_S(*pCur, 4, (int8_t *) offset, 4);
-+    *pCur += 4;
-+    MEMCPY_S(start + *offset, count, pValue, count);
-+    *offset += count;
-+}
-+
-+void ExifCreater::writeExifIfd(unsigned char **pCur,
-+                                         unsigned short tag,
-+                                         unsigned short type,
-+                                         unsigned int count,
-+                                         rational_t *pValue,
-+                                         unsigned int *offset,
-+                                         unsigned char *start)
-+{
-+    MEMCPY_S(*pCur, 2, (int8_t *) &tag, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 2, (int8_t *) &type, 2);
-+    *pCur += 2;
-+    MEMCPY_S(*pCur, 4, (int8_t *) &count, 4);
-+    *pCur += 4;
-+    MEMCPY_S(*pCur, 4, (int8_t *) offset, 4);
-+    *pCur += 4;
-+    MEMCPY_S(start + *offset, 8 * count, (int8_t *) pValue, 8 * count);
-+    *offset += 8 * count;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
-new file mode 100644
-index 000000000000..406cbffdc8b4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/ExifCreater.h
-@@ -0,0 +1,141 @@
-+/*
-+ * Copyright Samsung Electronics Co.,LTD.
-+ * Copyright (C) 2010 The Android Open Source Project
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ *
-+ * JPEG DRIVER MODULE (JpegEncoder.h)
-+ * Author  : ge.lee       -- initial version
-+ * Date    : 03 June 2010
-+ * Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
-+ */
-+
-+#pragma once
-+
-+#include <stdint.h>
-+#include <sys/ioctl.h>
-+
-+#include "Exif.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+#define MAX_JPG_WIDTH                   4352
-+#define MAX_JPG_HEIGHT                  3264
-+#define MAX_JPG_RESOLUTION              (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
-+
-+#define MAX_JPG_THUMBNAIL_WIDTH         640
-+#define MAX_JPG_THUMBNAIL_HEIGHT        480
-+#define MAX_JPG_THUMBNAIL_RESOLUTION    (MAX_JPG_THUMBNAIL_WIDTH *  \
-+                                            MAX_JPG_THUMBNAIL_HEIGHT)
-+
-+#define MAX_RGB_WIDTH                   800
-+#define MAX_RGB_HEIGHT                  480
-+#define MAX_RGB_RESOLUTION              (MAX_RGB_WIDTH * MAX_RGB_HEIGHT)
-+
-+/*******************************************************************************/
-+/* define JPG & image memory */
-+/* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */
-+#define JPG_STREAM_BUF_SIZE     \
-+        ((MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
-+#define JPG_STREAM_THUMB_BUF_SIZE   \
-+        ((MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
-+#define JPG_FRAME_BUF_SIZE  \
-+        (((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
-+#define JPG_FRAME_THUMB_BUF_SIZE    \
-+        (((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
-+#define JPG_RGB_BUF_SIZE    \
-+        (((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE)
-+
-+#define JPG_TOTAL_BUF_SIZE  (JPG_STREAM_BUF_SIZE + \
-+                             JPG_STREAM_THUMB_BUF_SIZE + \
-+                             JPG_FRAME_BUF_SIZE + \
-+                             JPG_FRAME_THUMB_BUF_SIZE + \
-+                             JPG_RGB_BUF_SIZE)
-+
-+#define JPG_MAIN_START      0x00
-+#define JPG_THUMB_START     JPG_STREAM_BUF_SIZE
-+#define IMG_MAIN_START      (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
-+#define IMG_THUMB_START     (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
-+/*******************************************************************************/
-+
-+const char MAKERNOTE_ID[] = { 0x49, 0x6e, 0x74, 0x65, 0x6c, 0x4d,
-+                              0x6b, 0x6e, 0x6f, 0x74, 0x65, 0x0 /* "IntelMknote\0" */ };
-+
-+const unsigned SIZEOF_LENGTH_FIELD = 2;
-+const unsigned SIZEOF_APP2_MARKER = 2;
-+const unsigned SIZEOF_APP2_OVERHEAD = sizeof(MAKERNOTE_ID) + SIZEOF_APP2_MARKER + SIZEOF_LENGTH_FIELD;
-+const bool ENABLE_APP2_MARKER = true;
-+typedef enum {
-+    EXIF_FAIL = -1,
-+    EXIF_SUCCESS = 0
-+} exif_status;
-+
-+class ExifCreater {
-+public:
-+    ExifCreater();
-+    virtual ~ExifCreater();
-+
-+    exif_status setThumbData(const void *thumbBuf, unsigned int thumbSize);
-+
-+    bool isThumbDataSet() const;
-+
-+    exif_status makeExif(void *exifOut,
-+                               exif_attribute_t *exifInfo,
-+                               size_t *size);
-+
-+private:
-+    exif_status makeApp2(void* pStartApp2, size_t& size, exif_attribute_t *exifInfo, bool writeId = true);
-+    void writeMarkerSizeToBuf(unsigned char *ptrTo, unsigned int size);
-+    /*
-+        Every IFD has 12Bytes.
-+        Tag ID, 2B; Type, 2B; Count, 4B; Value/Offset, 4B;
-+        If it is Value, please use the first two functions.
-+        If it is Offset, please use the last two functions
-+        and store the data in the rear.
-+    */
-+    void writeExifIfd(unsigned char **pCur,
-+                                 unsigned short tag,
-+                                 unsigned short type,
-+                                 unsigned int count,
-+                                 uint32_t value);
-+    void writeExifIfd(unsigned char **pCur,
-+                                 unsigned short tag,
-+                                 unsigned short type,
-+                                 unsigned int count,
-+                                 unsigned char *pValue);
-+    void writeExifIfd(unsigned char **pCur,
-+                                 unsigned short tag,
-+                                 unsigned short type,
-+                                 unsigned int count,
-+                                 rational_t *pValue,
-+                                 unsigned int *offset,
-+                                 unsigned char *start);
-+    void writeExifIfd(unsigned char **pCur,
-+                                 unsigned short tag,
-+                                 unsigned short type,
-+                                 unsigned int count,
-+                                 unsigned char *pValue,
-+                                 unsigned int *offset,
-+                                 unsigned char *start);
-+    void writeThumbData(unsigned char *pIfdStart,
-+                                 unsigned char *pNextIfdOffset,
-+                                 unsigned int *LongerTagOffset,
-+                                 exif_attribute_t *exifInfo);
-+
-+    unsigned char * m_thumbBuf; // MAP: Added to set thumbnail from external data
-+    unsigned int m_thumbSize; // MAP: Added to set thumbnail from external data
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
-new file mode 100644
-index 000000000000..5f76d307052c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/IJpegEncoder.h
-@@ -0,0 +1,76 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace icamera {
-+
-+#define DEFAULT_JPEG_QUALITY 95
-+static const unsigned char mJpegMarkerSOI[2] = {0xFF, 0xD8};
-+
-+struct EncodePackage {
-+    EncodePackage():
-+        inputWidth(0),
-+        inputHeight(0),
-+        inputStride(0),
-+        inputFormat(0),
-+        inputSize(0),
-+        inputBufferHandle(nullptr),
-+        inputData(nullptr),
-+        outputWidth(0),
-+        outputHeight(0),
-+        outputSize(0),
-+        outputBufferHandle(nullptr),
-+        outputData(nullptr),
-+        quality(0),
-+        encodedDataSize(0),
-+        exifData(nullptr),
-+        exifDataSize(0) {}
-+
-+    /* input buffer info */
-+    int inputWidth;
-+    int inputHeight;
-+    int inputStride;
-+    int inputFormat;
-+    unsigned int inputSize;
-+    void *inputBufferHandle;
-+    void *inputData;
-+
-+    /* output buffer info */
-+    int outputWidth;
-+    int outputHeight;
-+    unsigned int outputSize;
-+    void *outputBufferHandle;
-+    void *outputData;
-+
-+    int quality;
-+    uint32_t encodedDataSize;
-+    uint8_t *exifData;
-+    uint32_t exifDataSize;
-+};
-+
-+class IJpegEncoder {
-+
-+public:
-+    IJpegEncoder() {};
-+    virtual ~IJpegEncoder() {};
-+
-+    static std::unique_ptr<IJpegEncoder> createJpegEncoder();
-+    virtual bool doJpegEncode(EncodePackage& package) = 0;
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(IJpegEncoder);
-+};
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
-new file mode 100644
-index 000000000000..117e15716d30
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
-@@ -0,0 +1,233 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "JpegMaker"
-+
-+#include "JpegMaker.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+JpegMaker::JpegMaker()
-+{
-+    LOG2("@%s", __func__);
-+    mExifMaker = std::unique_ptr<EXIFMaker>(new EXIFMaker());
-+}
-+
-+JpegMaker::~JpegMaker()
-+{
-+    LOG2("@%s", __func__);
-+}
-+
-+status_t JpegMaker::setupExifWithMetaData(int bufWidth, int bufHeight,
-+                                          const Parameters &parameter,
-+                                          ExifMetaData *metaData)
-+{
-+    LOG2("@%s", __func__);
-+
-+    status_t status = OK;
-+
-+    status = processJpegSettings(parameter, metaData);
-+    CheckError(status != OK, status, "@%s: Process settngs for JPEG failed!", __func__);
-+
-+    mExifMaker->initialize(bufWidth, bufHeight);
-+    mExifMaker->pictureTaken(metaData);
-+
-+    mExifMaker->enableFlash(metaData->flashFired, metaData->v3AeMode, metaData->flashMode);
-+    mExifMaker->updateSensorInfo(parameter);
-+    mExifMaker->saveMakernote(parameter);
-+
-+    status = processExifSettings(parameter, metaData);
-+    if (status != OK) {
-+        LOGE("@%s: Process settngs for Exif! %d", __func__, status);
-+        return status;
-+    }
-+
-+    mExifMaker->initializeLocation(metaData);
-+    mExifMaker->setSensorAeConfig();
-+
-+    if (metaData->software)
-+        mExifMaker->setSoftware(metaData->software);
-+
-+    return status;
-+}
-+
-+status_t JpegMaker::getExif(const EncodePackage &thumbnailPackage, uint8_t *exifPtr, uint32_t *exifSize)
-+{
-+    if (thumbnailPackage.encodedDataSize > 0 && thumbnailPackage.quality > 0) {
-+        mExifMaker->setThumbnail(static_cast<unsigned char*>(thumbnailPackage.outputData),
-+                                 thumbnailPackage.encodedDataSize,
-+                                 thumbnailPackage.outputWidth, thumbnailPackage.outputHeight);
-+    }
-+    *exifSize = mExifMaker->makeExif(exifPtr);
-+    return *exifSize > 0 ? OK : UNKNOWN_ERROR;
-+}
-+
-+status_t JpegMaker::processExifSettings(const Parameters &params,
-+                                        ExifMetaData *metaData)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    status = processGpsSettings(params, metaData);
-+    status |= processColoreffectSettings(params, metaData);
-+    status |= processScalerCropSettings(params, metaData);
-+    status |= processEvCompensationSettings(params, metaData);
-+
-+    return status;
-+}
-+
-+/* copy exif data into output buffer */
-+void JpegMaker::writeExifData(EncodePackage &package)
-+{
-+    if (package.exifDataSize == 0)
-+        return;
-+
-+    CheckError(!package.outputData, VOID_VALUE, "@%s, outputData is nullptr", __func__);
-+    CheckError(!package.exifData, VOID_VALUE, "@%s, exifData is nullptr", __func__);
-+
-+    unsigned int jSOISize = sizeof(mJpegMarkerSOI);
-+    unsigned char *jpegOut = reinterpret_cast<unsigned char*>(package.outputData);
-+    MEMCPY_S(jpegOut, jSOISize, mJpegMarkerSOI, jSOISize);
-+    jpegOut += jSOISize;
-+
-+    MEMCPY_S(jpegOut, package.exifDataSize,
-+             reinterpret_cast<unsigned char*>(package.exifData), package.exifDataSize);
-+}
-+
-+/**
-+ * processJpegSettings
-+ *
-+ * Store JPEG settings to the exif metadata
-+ *
-+ * \param [IN] jpeg parameters
-+ * \ metaData [out] metadata of the request
-+ *
-+ */
-+status_t JpegMaker::processJpegSettings(const Parameters &params,
-+                                        ExifMetaData *metaData)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    CheckError(!metaData, UNKNOWN_ERROR, "MetaData struct not intialized");
-+
-+    // make jpeg with thumbnail or not
-+    camera_resolution_t thumbSize = {0};
-+    params.getJpegThumbnailSize(thumbSize);
-+    LOG2("%s request thumbname size %dx%d", __func__, thumbSize.width, thumbSize.height);
-+
-+    uint8_t new_jpeg_quality = DEFAULT_JPEG_QUALITY;
-+    int ret = params.getJpegQuality(&new_jpeg_quality);
-+    if (ret != icamera::OK) {
-+        LOGW("cannot find jpeg quality, use default");
-+    }
-+    metaData->mJpegSetting.jpegQuality = new_jpeg_quality;
-+
-+    uint8_t new_jpeg_thumb_quality = DEFAULT_JPEG_QUALITY;
-+    params.getJpegThumbnailQuality(&new_jpeg_thumb_quality);
-+    metaData->mJpegSetting.jpegThumbnailQuality = new_jpeg_thumb_quality;
-+    metaData->mJpegSetting.thumbWidth = thumbSize.width;
-+    metaData->mJpegSetting.thumbHeight = thumbSize.height;
-+
-+    int new_rotation = 0;
-+    params.getJpegRotation(new_rotation);
-+    metaData->mJpegSetting.orientation = new_rotation;
-+
-+    LOG1("jpegQuality=%d,thumbQuality=%d,thumbW=%d,thumbH=%d,orientation=%d",
-+         metaData->mJpegSetting.jpegQuality,
-+         metaData->mJpegSetting.jpegThumbnailQuality,
-+         metaData->mJpegSetting.thumbWidth,
-+         metaData->mJpegSetting.thumbHeight,
-+         metaData->mJpegSetting.orientation);
-+
-+    return status;
-+}
-+
-+/**
-+ * This function will get GPS metadata from request setting
-+ *
-+ * \param[in] settings The Anroid metadata to process GPS settings from
-+ * \param[out] metadata The EXIF data where the GPS setting are written to
-+ */
-+status_t JpegMaker::processGpsSettings(const Parameters &param,
-+                                       ExifMetaData *metadata)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    // gps latitude
-+    double new_gps_latitude = 0.0;
-+    param.getJpegGpsLatitude(new_gps_latitude);
-+    metadata->mGpsSetting.latitude = new_gps_latitude;
-+
-+    double new_gps_longitude = 0.0;
-+    param.getJpegGpsLongitude(new_gps_longitude);
-+    metadata->mGpsSetting.longitude = new_gps_longitude;
-+
-+    double new_gps_altitude = 0.0;
-+    param.getJpegGpsAltitude(new_gps_altitude);
-+    metadata->mGpsSetting.altitude = new_gps_altitude;
-+
-+    // gps timestamp
-+    int64_t new_gps_timestamp = 0;
-+    param.getJpegGpsTimeStamp(new_gps_timestamp);
-+    metadata->mGpsSetting.gpsTimeStamp = new_gps_timestamp;
-+
-+    // gps processing method
-+    char new_gps_processing_method[MAX_NUM_GPS_PROCESSING_METHOD + 1];
-+    CLEAR(new_gps_processing_method);
-+    param.getJpegGpsProcessingMethod(MAX_NUM_GPS_PROCESSING_METHOD, new_gps_processing_method);
-+    if (strlen(new_gps_processing_method) != 0) {
-+        snprintf(metadata->mGpsSetting.gpsProcessingMethod,
-+                 sizeof(metadata->mGpsSetting.gpsProcessingMethod),
-+                 "%s", new_gps_processing_method);
-+    }
-+
-+    return status;
-+}
-+
-+status_t JpegMaker::processColoreffectSettings(const Parameters &param, ExifMetaData *metaData)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    camera_effect_mode_t  new_image_effect = CAM_EFFECT_NONE;
-+    param.getImageEffect(new_image_effect);
-+    metaData->effectMode = new_image_effect;
-+    LOG2("effect mode=%d", metaData->effectMode);
-+
-+    return status;
-+}
-+
-+status_t JpegMaker::processScalerCropSettings(const Parameters &param, ExifMetaData *metaData)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    return status;
-+}
-+
-+status_t JpegMaker::processEvCompensationSettings(const Parameters &param, ExifMetaData *metaData)
-+{
-+    LOG2("@%s:", __func__);
-+    status_t status = OK;
-+
-+    return status;
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
-new file mode 100644
-index 000000000000..e19991c12d69
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+
-+#include "EXIFMaker.h"
-+#include "EXIFMetaData.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "IJpegEncoder.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class JpegMaker
-+ * Does the EXIF header creation and appending to the provided jpeg buffer
-+ *
-+ */
-+class JpegMaker {
-+public: /* Methods */
-+    explicit JpegMaker();
-+    virtual ~JpegMaker();
-+    status_t setupExifWithMetaData(int bufWidth, int bufHeight,
-+                                   const Parameters &parameter,
-+                                   ExifMetaData *metaData);
-+    status_t getExif(const EncodePackage &thumbnailPackage, uint8_t *exifPtr, uint32_t *exifSize);
-+    void writeExifData(EncodePackage &package);
-+
-+private: /* Methods */
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(JpegMaker);
-+
-+    status_t processExifSettings(const Parameters &params, ExifMetaData *metaData);
-+    status_t processJpegSettings(const Parameters &params, ExifMetaData *metaData);
-+    status_t processGpsSettings(const Parameters &params, ExifMetaData *metadata);
-+    status_t processColoreffectSettings(const Parameters &params, ExifMetaData *metaData);
-+    status_t processScalerCropSettings(const Parameters &params, ExifMetaData *metaData);
-+    status_t processEvCompensationSettings(const Parameters &params, ExifMetaData *metaData);
-+
-+private:  /* Members */
-+    std::unique_ptr<EXIFMaker> mExifMaker;
-+};
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
-new file mode 100644
-index 000000000000..fc619f2bde6d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.cpp
-@@ -0,0 +1,76 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "JpegEncoderCore"
-+
-+#include "JpegEncoderCore.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include <linux/videodev2.h>
-+#include <cros-camera/camera_buffer_manager.h>
-+
-+namespace icamera {
-+
-+JpegEncoderCore::JpegEncoderCore()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+JpegEncoderCore::~JpegEncoderCore()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder()
-+{
-+    return std::unique_ptr<JpegEncoderCore>(new JpegEncoderCore());
-+}
-+
-+/**
-+ * doJpegEncode
-+ *
-+ * Do HW / SW JPEG encoding for the main buffer
-+ * Do SW JPEG encoding for the thumbnail buffer
-+ *
-+ * \param package [IN] Information that should be encoded
-+ */
-+bool JpegEncoderCore::doJpegEncode(EncodePackage& package)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+
-+    CheckError(package.inputWidth != package.outputWidth || package.inputHeight != package.outputHeight,
-+          false, "@%s, ImgEncoder::encodeSync failed: input size != output size", __func__);
-+    CheckError(package.inputWidth <= 0 || package.outputWidth <= 0 || package.inputHeight <= 0 || package.outputHeight <= 0,
-+          false, "@%s, inputWidth:%d, outputWidth:%d, inputHeight:%d, outputHeight:%d",
-+          __func__, package.inputWidth, package.outputWidth, package.inputHeight, package.outputHeight);
-+
-+    nsecs_t startTime = CameraUtils::systemTime();
-+    bool ret = mJpegCompressor->CompressImage(*(reinterpret_cast<buffer_handle_t*>(package.inputBufferHandle)),
-+                                              package.inputData,
-+                                              V4L2_PIX_FMT_NV12,
-+                                              *(reinterpret_cast<buffer_handle_t*>(package.outputBufferHandle)),
-+                                              package.outputData,
-+                                              package.outputSize,
-+                                              package.inputWidth, package.inputHeight,
-+                                              package.quality, package.exifData,
-+                                              package.exifDataSize, &package.encodedDataSize);
-+    LOGE("@%s: encoding ret:%d, %dx%d need % ms, jpeg size %u, quality %d)", __func__,
-+         ret, package.outputWidth, package.outputHeight, (CameraUtils::systemTime() - startTime) / 1000000,
-+         package.encodedDataSize, package.quality);
-+    return ret && package.encodedDataSize > 0;
-+}
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
-new file mode 100644
-index 000000000000..50fa39ff738e
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/chrome/JpegEncoderCore.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Utils.h"
-+#include "IJpegEncoder.h"
-+#include <memory>
-+#include <mutex>
-+#include <cros-camera/jpeg_compressor.h>
-+
-+namespace icamera {
-+
-+class JpegEncoderCore : public IJpegEncoder {
-+
-+public:
-+    JpegEncoderCore();
-+    ~JpegEncoderCore();
-+
-+    virtual bool doJpegEncode(EncodePackage& package);
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(JpegEncoderCore);
-+
-+    std::unique_ptr<cros::JpegCompressor> mJpegCompressor;
-+};
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
-new file mode 100644
-index 000000000000..21ea1e81e4a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp
-@@ -0,0 +1,772 @@
-+/*
-+ * Copyright (C) 2011 The Android Open Source Project
-+ * Copyright (C) 2016-2020 Intel Corporation. All Rights Reserved.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "SWJpegEncoder"
-+
-+#include "SWJpegEncoder.h"
-+#include "ImageConverter.h"
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include <string>
-+
-+#define RESOLUTION_1_3MP_WIDTH    1280
-+#define RESOLUTION_1_3MP_HEIGHT   960
-+
-+namespace icamera {
-+
-+SWJpegEncoder::SWJpegEncoder() :
-+    mJpegSize(-1)
-+    ,mTotalWidth(0)
-+    ,mTotalHeight(0)
-+    ,mDstBuf(nullptr)
-+    ,mCPUCoresNum(1)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+}
-+
-+SWJpegEncoder::~SWJpegEncoder()
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+}
-+
-+std::unique_ptr<IJpegEncoder> IJpegEncoder::createJpegEncoder()
-+{
-+    return std::unique_ptr<SWJpegEncoder>(new SWJpegEncoder());
-+}
-+
-+/**
-+ * \param package: encode package for either thumbnail or main image
-+ * \return true if encoding succeeds
-+ * \return false if encoding fails
-+ */
-+bool SWJpegEncoder::doJpegEncode(EncodePackage& package)
-+{
-+    int status = 0;
-+    nsecs_t startTime = CameraUtils::systemTime();
-+
-+    LOG2("@%s:\n\t IN  = {buf:%p, w:%u, h:%u, sz:%u, stride:%d, fmt:%s}" \
-+         "\n\t OUT = {buf:%p, w:%u, h:%u, sz:%u, q:%d}",
-+         __func__,
-+         package.inputData, package.inputWidth, package.inputHeight,
-+         package.inputSize, package.inputStride,
-+         icamera::CameraUtils::format2string(package.inputFormat).c_str(),
-+         package.outputData, package.outputWidth, package.outputHeight,
-+         package.outputSize, package.quality);
-+
-+    if (package.inputWidth == 0 || package.inputHeight== 0 || package.inputFormat == 0) {
-+        ALOGE("Invalid input received!");
-+        mJpegSize = -1;
-+        goto exit;
-+    }
-+
-+    mTotalWidth = package.inputWidth;
-+    mTotalHeight = package.inputHeight;
-+
-+    /*
-+     * For encoding main buffer, need to skip the exif data and SOI header.
-+     * Because the SOI(jpeg maker) is written in the beginning of jpeg data when
-+     * do encode, so only skip the exif data size here, and the SOI will be moved
-+     * to the head of output buffer
-+     */
-+    mDstBuf = reinterpret_cast<unsigned char*>(package.outputData) + package.exifDataSize;
-+
-+    if (useMultiThreadEncoding(package.inputWidth, package.inputHeight))
-+        status = swEncodeMultiThread(package);
-+    else
-+        status = swEncode(package);
-+
-+    if (status < 0)
-+        goto exit;
-+
-+    package.encodedDataSize = mJpegSize;
-+
-+    LOG2("@%s encode, total consume:%ums, encoded jpeg size: %d",
-+         __func__, (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), mJpegSize);
-+
-+    return mJpegSize > 0 ? true : false;
-+exit:
-+    return false;
-+}
-+
-+/**
-+ *  This function will decide if we need to enable the multi thread jpeg encoding.
-+ *  currently, we have two conditions to use the old single jpeg encoding.
-+ *  one is that the resolution is smaller than the 1.3M
-+ *  the other is that the CPU number is 1
-+ *
-+ *  \param width: the Jpeg width
-+ *  \param height: the Jpeg height
-+ *
-+ *  \return false if we don't need multi thread Jpeg encoding
-+ *  \return true if we need multi thread Jpeg encoding
-+ */
-+bool SWJpegEncoder::useMultiThreadEncoding(int width, int height)
-+{
-+    LOG2("@%s, line:%d, width:%d, height:%d", __func__, __LINE__, width, height);
-+    bool ret = false;
-+
-+    /* more conditions could be added to here by according to the request */
-+    if ((width < RESOLUTION_1_3MP_WIDTH && height < RESOLUTION_1_3MP_HEIGHT))
-+        ret = false;
-+    else if (width & 0xf)
-+        ret = false;
-+    else
-+        ret = true;
-+
-+    LOG2("@%s, line:%d, ret:%d", __func__, __LINE__, ret);
-+    return ret;
-+}
-+
-+/**
-+ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
-+ * single thread.
-+ *
-+ * \param package: jpeg encode package
-+ * \return 0 if encoding was successful
-+ * \return -1 if encoding failed
-+ */
-+int SWJpegEncoder::swEncode(const EncodePackage& package)
-+{
-+    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
-+    int status = 0;
-+    Codec encoder;
-+
-+    encoder.init();
-+    encoder.setJpegQuality(package.quality);
-+    status = encoder.configEncoding(package.inputWidth, package.inputHeight,
-+                                    package.inputStride,
-+                                    static_cast<JSAMPLE *>(mDstBuf),
-+                                    (package.outputSize - package.exifDataSize));
-+    const void *uv_buf = static_cast<unsigned char*>(package.inputData) + package.inputStride * package.inputHeight;
-+
-+    if (status)
-+        goto exit;
-+
-+    status = encoder.doJpegEncoding(package.inputData, uv_buf, package.inputFormat);
-+    if (status)
-+        goto exit;
-+
-+exit:
-+    if (status)
-+        mJpegSize = -1;
-+    else
-+        encoder.getJpegSize(&mJpegSize);
-+
-+    encoder.deInit();
-+
-+    return (status ? -1 : 0);
-+}
-+
-+/**
-+ * encode jpeg by calling the SWJpegEncoder which is the libjpeg wrapper
-+ * multi thread.
-+ * the thread number depends on the CPU number.
-+ *
-+ * \param package: jpeg encode package
-+ * \return 0 if encoding was successful
-+ * \return -1 if encoding failed
-+ */
-+int SWJpegEncoder::swEncodeMultiThread(const EncodePackage &package)
-+{
-+    LOG2("@%s, line:%d, use the libjpeg to do sw jpeg encoding", __func__, __LINE__);
-+    int status = 0;
-+
-+    init(mCPUCoresNum);
-+    config(package);
-+
-+    status = doJpegEncodingMultiThread();
-+    if (status)
-+        goto exit;
-+
-+exit:
-+    mJpegSize = status ? -1 : mergeJpeg();
-+    deInit();
-+
-+    return (status ? -1 : 0);
-+}
-+
-+/**
-+ * Initialize for the multi thread jpeg encoding
-+ *
-+ * it will create n CodecWorkerThread by according to the thread number.
-+ */
-+void SWJpegEncoder::init(unsigned int threadNum)
-+{
-+    unsigned int num = CLIP(threadNum, MAX_THREAD_NUM, MIN_THREAD_NUM);
-+    LOG2("@%s, line:%d, thread number, pass:%d, real:%d", __func__, __LINE__, threadNum, num);
-+
-+    for (unsigned int i = 0; i < num; i++) {
-+        std::shared_ptr<CodecWorkerThread> codecWorkerThread(new CodecWorkerThread);
-+        mSwJpegEncoder.push_back(codecWorkerThread);
-+    }
-+}
-+
-+/**
-+ * deInit for the multi thread jpeg encoding
-+ *
-+ * it will release all n CodecWorkerThread
-+ */
-+void SWJpegEncoder::deInit(void)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    for (auto& encoder : mSwJpegEncoder) {
-+        encoder.reset();
-+    }
-+
-+    mSwJpegEncoder.clear();
-+}
-+
-+/**
-+ * configue every thread for multi thread jpeg
-+ *
-+ * \param package: jpeg encode package
-+ */
-+void SWJpegEncoder::config(const EncodePackage &package)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    std::shared_ptr<CodecWorkerThread> encThread;
-+    CodecWorkerThread::CodecConfig cfg;
-+
-+    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
-+        cfg.width = package.inputWidth;
-+        /*
-+            for example, there are 4 threads.
-+            the first 3 threads must align to 16 which is NV12_MCU_SIZE
-+            but for the last thread, it doesn't have this request.
-+        */
-+        cfg.height = ALIGN_16(package.inputHeight / mSwJpegEncoder.size());
-+        cfg.stride = package.inputStride;
-+        /*
-+         * For NV12 format, Y and UV data are independent, total size is width*height*1.5;
-+         * For YUYV format, Y and UV data are crossing, total size is width*height*2;
-+         * So the inBufY and inBufUV should be distinguished base on format.
-+         */
-+        cfg.fourcc = package.inputFormat;
-+        cfg.inBufY = (cfg.fourcc == V4L2_PIX_FMT_YUYV)
-+            ? static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * 2 * i
-+            : static_cast<unsigned char*>(package.inputData) + cfg.stride * cfg.height * i;
-+        cfg.inBufUV = (cfg.fourcc == V4L2_PIX_FMT_NV12 || cfg.fourcc == V4L2_PIX_FMT_NV21)
-+            ? (static_cast<unsigned char*>(package.inputData) + package.inputStride * package.inputHeight + cfg.stride * cfg.height * i / 2)
-+            : nullptr;
-+        cfg.quality = package.quality;
-+        cfg.outBufSize = (package.outputSize - package.exifDataSize - DEST_BUF_OFFSET) / package.inputHeight * cfg.height;
-+        cfg.outBuf = static_cast<unsigned char*>(mDstBuf) + DEST_BUF_OFFSET + cfg.outBufSize * i;
-+        /* update the last thread's height */
-+        if (i == mSwJpegEncoder.size() - 1) {
-+            cfg.height = package.inputHeight - cfg.height * (mSwJpegEncoder.size() - 1);
-+            cfg.outBufSize = package.outputSize - package.exifDataSize - DEST_BUF_OFFSET - cfg.outBufSize * (mSwJpegEncoder.size() - 1);
-+        }
-+
-+        encThread = mSwJpegEncoder[i];
-+        encThread->setConfig(cfg);
-+        LOG2("@%s, line:%d, the %d picture thread cfg", __func__, __LINE__, i);
-+        LOG2("@%s, line:%d, cfg.width:%d, cfg.height:%d", __func__, __LINE__, cfg.width, cfg.height);
-+        LOG2("@%s, line:%d, cfg.fourcc:%d, cfg.quality:%d", __func__, __LINE__, cfg.fourcc, cfg.quality);
-+        LOG2("@%s, line:%d, cfg.inBufY:%p, cfg.inBufUV:%p", __func__, __LINE__, cfg.inBufY, cfg.inBufUV);
-+        LOG2("@%s, line:%d, cfg.outBuf:%p, cfg.outBufSize:%d", __func__, __LINE__, cfg.outBuf, cfg.outBufSize);
-+    }
-+}
-+
-+/**
-+ * the function will trigger the multi jpeg encoding
-+ *
-+ * \return 0 if encoding was successful
-+ * \return -1 if encoding failed
-+ */
-+int SWJpegEncoder::doJpegEncodingMultiThread(void)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    std::shared_ptr<CodecWorkerThread> encThread;
-+    status_t status = OK;
-+    std::string threadName("CamHAL_SWEncodeMultiThread");
-+
-+    /* run all threads */
-+    for (unsigned int i = 0; i <mSwJpegEncoder.size(); i++) {
-+        threadName = threadName + ":" + std::to_string(i);
-+        LOG2("@%s, new sw jpeg thread name:%s", __func__, threadName.c_str());
-+        encThread = mSwJpegEncoder[i];
-+        status = encThread->runThread(threadName.c_str());
-+        if (status != OK) {
-+            ALOGE("@%s, line:%d, start jpeg thread fail, thread name:%s", __func__, __LINE__, threadName.c_str());
-+            return status;
-+        }
-+    }
-+
-+    /* wait all threads to finish */
-+    for (unsigned int i = 0; i < mSwJpegEncoder.size(); i++) {
-+        LOG2("@%s, the %d sw jpeg encoder thread before join!", __func__, i);
-+        encThread = mSwJpegEncoder[i];
-+        encThread->waitThreadFinish();
-+        if (encThread->getJpegDataSize() == -1)
-+            status = UNKNOWN_ERROR;
-+        }
-+
-+    return status;
-+}
-+
-+/**
-+ * the function will merge all jpeg pictures which are generated in multi threads
-+ * to one jpeg picture
-+ *
-+ * \return int the merged jpeg size
-+ */
-+int SWJpegEncoder::mergeJpeg(void)
-+{
-+#define HEADER_TOTAL_LEN 623
-+#define HEADER_SOS_LEN 14
-+#define HEADER_EOI_LEN 2
-+#define HEADER_HEIGHT_POS 163
-+#define HEADER_WIDTH_POS 165
-+#define NV12_MCU_SIZE 16
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    int size = HEADER_TOTAL_LEN - HEADER_SOS_LEN;
-+    CodecWorkerThread::CodecConfig cfg;
-+    nsecs_t startTime;
-+    std::shared_ptr<CodecWorkerThread> encThread = mSwJpegEncoder.at(0);
-+    if (encThread == nullptr) {
-+        ALOGE("encThread is nullptr");
-+        return -1;
-+    }
-+    encThread->getConfig(&cfg);
-+
-+    /* Write the JPEG header */
-+    MEMCPY_S(mDstBuf, size, cfg.outBuf, size);
-+
-+    /* Update the width and height info */
-+    mDstBuf[HEADER_HEIGHT_POS] = (mTotalHeight >> 8) & 0xFF;
-+    mDstBuf[HEADER_HEIGHT_POS+1] = mTotalHeight & 0xFF;
-+    mDstBuf[HEADER_WIDTH_POS] = (mTotalWidth >> 8) & 0xFF;
-+    mDstBuf[HEADER_WIDTH_POS+1] = mTotalWidth & 0xFF;
-+
-+    /* Write the restarting interval */
-+    if (mSwJpegEncoder.size() > 1) {
-+        unsigned int MCUs = (cfg.height / NV12_MCU_SIZE) * (cfg.width / NV12_MCU_SIZE);
-+        mDstBuf[size++] = 0xFF;
-+        mDstBuf[size++] = 0xDD;
-+        mDstBuf[size++] = 0;
-+        mDstBuf[size++] = 4;
-+        mDstBuf[size++] = (MCUs >> 8) & 0xFF;
-+        mDstBuf[size++] = MCUs & 0xFF;
-+    }
-+
-+    /* Write the SOS */
-+    MEMCPY_S((void *)((unsigned long)mDstBuf + size),
-+            HEADER_SOS_LEN,
-+            (void *)((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN - HEADER_SOS_LEN),
-+            HEADER_SOS_LEN);
-+    size += HEADER_SOS_LEN;
-+
-+    /* Write coded segments */
-+    for (unsigned int i = 0; i <mSwJpegEncoder.size(); i++) {
-+        encThread = mSwJpegEncoder[i];
-+        startTime = CameraUtils::systemTime();
-+        encThread->getConfig(&cfg);
-+        memmove((void *)((unsigned long)mDstBuf + size),
-+               (void *)((unsigned long)cfg.outBuf + HEADER_TOTAL_LEN),
-+               (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN));
-+        LOG2("@%s, wr %d segments, size:%d, consume:%ums", __func__, i,
-+             (encThread->getJpegDataSize()- HEADER_TOTAL_LEN - HEADER_EOI_LEN),
-+             (unsigned)((CameraUtils::systemTime() - startTime) / 1000000));
-+        size += (encThread->getJpegDataSize() - HEADER_TOTAL_LEN - HEADER_EOI_LEN);
-+
-+        if (i != (mSwJpegEncoder.size() - 1)) {
-+            mDstBuf[size++] = 0xFF;
-+            mDstBuf[size++] = (i & 0x7) | 0xD0;
-+        }
-+    }
-+
-+    /* Write EOI */
-+    mDstBuf[size++]= 0xFF;
-+    mDstBuf[size++]= 0xD9;
-+
-+    return size;
-+}
-+
-+SWJpegEncoder::CodecWorkerThread::CodecWorkerThread() :
-+    mDataSize(-1)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    CLEAR(mCfg);
-+}
-+
-+SWJpegEncoder::CodecWorkerThread::~CodecWorkerThread()
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+}
-+
-+/**
-+ * run one thread for multi thread jpeg encoding
-+ *
-+ * \param name: the thread name
-+ */
-+status_t SWJpegEncoder::CodecWorkerThread::runThread(const char *name)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    return this->run(name);
-+}
-+
-+/**
-+ * wait one thread until it has finished
-+ *
-+ */
-+void SWJpegEncoder::CodecWorkerThread::waitThreadFinish(void)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    this->join();
-+    this->requestExitAndWait();
-+}
-+
-+/**
-+ * get jpeg size which is done in one thread
-+ *
-+ * \return int the coded jpeg size
-+ */
-+int SWJpegEncoder::CodecWorkerThread::getJpegDataSize(void)
-+{
-+    LOG2("@%s, line:%d", __func__, __LINE__);
-+    return mDataSize;
-+}
-+
-+/**
-+ * the thread exe function for one jpeg thread
-+ * when the encoding has been done, it will return false to terminate the thread
-+ *
-+ * \return false
-+ */
-+bool SWJpegEncoder::CodecWorkerThread::threadLoop()
-+{
-+    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
-+    nsecs_t startTime = CameraUtils::systemTime();
-+    int ret = swEncode();
-+    LOG2("@%s one swEncode done!, consume:%ums, ret:%d", __func__,
-+         (unsigned)((CameraUtils::systemTime() - startTime) / 1000000), ret);
-+
-+    return false;
-+}
-+
-+/**
-+ * this function will call the SWJpegEncoder to encode one jpeg.
-+ * it's the main function of the threadLoop
-+ *
-+ * \return 0 if encoding was successful
-+ * \return -1 if encoding failed
-+ */
-+int SWJpegEncoder::CodecWorkerThread::swEncode(void)
-+{
-+    LOG2("@%s, line:%d, in CodecWorkerThread", __func__, __LINE__);
-+    int status = 0;
-+    Codec encoder;
-+
-+    encoder.init();
-+    encoder.setJpegQuality(mCfg.quality);
-+    status = encoder.configEncoding(mCfg.width, mCfg.height, mCfg.stride,
-+                            (JSAMPLE *)mCfg.outBuf, mCfg.outBufSize);
-+    if (status)
-+        goto exit;
-+
-+    status = encoder.doJpegEncoding(mCfg.inBufY, mCfg.inBufUV, mCfg.fourcc);
-+    if (status)
-+        goto exit;
-+
-+exit:
-+    if (status)
-+        mDataSize = -1;
-+    else
-+        encoder.getJpegSize(&mDataSize);
-+
-+    encoder.deInit();
-+
-+    return (status ? -1 : 0);
-+}
-+
-+SWJpegEncoder::Codec::Codec() :
-+    mStride(-1),
-+    mJpegQuality(DEFAULT_JPEG_QUALITY)
-+{
-+    LOG2("@%s", __func__);
-+    CLEAR(mCInfo);
-+    CLEAR(mJErr);
-+}
-+
-+SWJpegEncoder::Codec::~Codec()
-+{
-+    LOG2("@%s", __func__);
-+}
-+
-+/**
-+ * Init the SW jpeg encoder
-+ *
-+ * It will init the libjpeg library
-+ */
-+void SWJpegEncoder::Codec::init(void)
-+{
-+    LOG2("@%s", __func__);
-+    CLEAR(mCInfo);
-+    mCInfo.err = jpeg_std_error(&mJErr);
-+    jpeg_create_compress(&mCInfo);
-+}
-+
-+/**
-+ * deInit the SW jpeg encoder
-+ *
-+ * It will deinit the libjpeg library
-+ */
-+void SWJpegEncoder::Codec::deInit(void)
-+{
-+    LOG2("@%s", __func__);
-+    jpeg_destroy_compress(&mCInfo);
-+}
-+
-+/**
-+ * Set the jpeg quality
-+ *
-+ * \param quality: one value from 0 to 100
-+ *
-+ */
-+void SWJpegEncoder::Codec::setJpegQuality(int quality)
-+{
-+    LOG2("@%s, quality:%d", __func__, quality);
-+    mJpegQuality = CLIP(quality, 100, 1);
-+}
-+
-+/**
-+ * Config the SW jpeg encoder.
-+ *
-+ * mainly, it will set the destination buffer manager, color space, quality.
-+ *
-+ * \param width: the width of the jpeg dimentions.
-+ * \param height: the height of the jpeg dimentions.
-+ * \param jpegBuf: the dest buffer to store the jpeg data
-+ * \param jpegBufSize: the size of jpegBuf buffer
-+ *
-+ * \return 0 if the configuration is right.
-+ * \return -1 if the configuration fails.
-+*/
-+int SWJpegEncoder::Codec::
-+configEncoding(int width, int height, int stride, void *jpegBuf, int jpegBufSize)
-+{
-+    LOG2("@%s", __func__);
-+
-+    mStride = stride;
-+    mCInfo.input_components = 3;
-+    mCInfo.in_color_space = (J_COLOR_SPACE)SUPPORTED_FORMAT;
-+    mCInfo.image_width = width;
-+    mCInfo.image_height = height;
-+
-+    if(setupJpegDestMgr(&mCInfo, (JSAMPLE *)jpegBuf, jpegBufSize) < 0) {
-+        ALOGE("@%s, line:%d, setupJpegDestMgr fail", __func__, __LINE__);
-+        return -1;
-+    }
-+
-+    jpeg_set_defaults(&mCInfo);
-+    jpeg_set_colorspace(&mCInfo, (J_COLOR_SPACE)SUPPORTED_FORMAT);
-+    jpeg_set_quality(&mCInfo, mJpegQuality, TRUE);
-+    mCInfo.raw_data_in = TRUE;
-+    mCInfo.dct_method = JDCT_ISLOW;
-+    mCInfo.comp_info[0].h_samp_factor = 2;
-+    mCInfo.comp_info[0].v_samp_factor = 2;
-+    mCInfo.comp_info[1].h_samp_factor = 1;
-+    mCInfo.comp_info[1].v_samp_factor = 1;
-+    mCInfo.comp_info[2].h_samp_factor = 1;
-+    mCInfo.comp_info[2].v_samp_factor = 1;
-+    jpeg_start_compress(&mCInfo, TRUE);
-+
-+    return 0;
-+}
-+
-+/**
-+ * Do the SW jpeg encoding.
-+ *
-+ * it will convert the YUV data to P411 and then do jpeg encoding.
-+ *
-+ * \param y_buf: the source buffer for Y data
-+ * \param uv_buf: the source buffer for UV data,
-+ * \it could be nullptr if fourcc is V4L2_PIX_FMT_YUYV
-+ * \return 0 if the encoding is successful.
-+ * \return -1 if the encoding fails.
-+ */
-+int SWJpegEncoder::Codec::
-+doJpegEncoding(const void *y_buf, const void *uv_buf, int fourcc)
-+{
-+    LOG2("@%s", __func__);
-+
-+    unsigned char *srcY = nullptr;
-+    unsigned char *srcUV = nullptr;
-+    unsigned char *p411 = nullptr;
-+    JSAMPROW y[16],u[16],v[16];
-+    JSAMPARRAY data[3];
-+    int i, j, width, height;
-+
-+    width = mCInfo.image_width;
-+    height = mCInfo.image_height;
-+    srcY = (unsigned char*)y_buf;
-+    srcUV = (unsigned char*)uv_buf;
-+    p411 = new unsigned char[width * height * 3 / 2];
-+
-+    switch (fourcc) {
-+    case V4L2_PIX_FMT_YUYV:
-+        ImageConverter::YUY2ToP411(width, height, mStride, srcY, p411);
-+        break;
-+    case V4L2_PIX_FMT_NV12:
-+        ImageConverter::NV12ToP411Separate(width, height, mStride, srcY, srcUV, p411);
-+        break;
-+    case V4L2_PIX_FMT_NV21:
-+        ImageConverter::NV21ToP411Separate(width, height, mStride, srcY, srcUV, p411);
-+        break;
-+    default:
-+        ALOGE("%s Unsupported fourcc %d", __func__, fourcc);
-+        delete [] p411;
-+        return -1;
-+    }
-+
-+    data[0] = y;
-+    data[1] = u;
-+    data[2] = v;
-+    for (i = 0; i < height; i += 16) {
-+        for (j = 0; j < 16 && (i + j) < height; j++) {
-+            y[j] = p411 + width * (j + i);
-+            if (j % 2 == 0) {
-+                u[j / 2] = p411 + width * height + width / 2 * ((j + i) / 2);
-+                v[j / 2] = p411 + width * height + width * height / 4 + width / 2 * ((j + i) / 2);
-+            }
-+        }
-+        jpeg_write_raw_data(&mCInfo, data, 16);
-+    }
-+
-+    jpeg_finish_compress(&mCInfo);
-+
-+    delete [] p411;
-+    p411 = nullptr;
-+
-+    return 0;
-+}
-+
-+/**
-+ * Get the jpeg size.
-+ *
-+ * \param jpegSize: get the real jpeg size, it will be -1, if encoding fails
-+ */
-+void SWJpegEncoder::Codec::getJpegSize(int *jpegSize)
-+{
-+    LOG2("@%s", __func__);
-+
-+    JpegDestMgrPtr dest = (JpegDestMgrPtr)mCInfo.dest;
-+
-+    *jpegSize = (false == dest->encodeSuccess) ? -1 : dest->codedSize;
-+}
-+
-+/**
-+ * Setup the jpeg destination buffer manager
-+ *
-+ * it will convert the YUV data to P411 and then do jpeg encoding.
-+ *
-+ * \param cInfo: the compress pointer
-+ * \param jpegBuf: the buffer pointer for jpeg data
-+ * \param jpegBufSize: the jpegBuf buffer's size
-+ * \return 0 if it's successful.
-+ * \return -1 if it fails.
-+ */
-+int SWJpegEncoder::Codec::
-+setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE *jpegBuf, int jpegBufSize)
-+{
-+    LOG2("@%s", __func__);
-+    JpegDestMgrPtr dest;
-+
-+    if (nullptr == jpegBuf || jpegBufSize <= 0) {
-+        ALOGE("@%s, line:%d, jpegBuf:%p, jpegBufSize:%d", __func__, __LINE__, jpegBuf, jpegBufSize);
-+        return -1;
-+    }
-+
-+    if (cInfo->dest == nullptr) {
-+        cInfo->dest = (struct jpeg_destination_mgr *)
-+                        (*cInfo->mem->alloc_small)((j_common_ptr)cInfo,
-+                            JPOOL_PERMANENT, sizeof(JpegDestMgr));
-+        CLEAR(*cInfo->dest);
-+    }
-+    dest = (JpegDestMgrPtr)cInfo->dest;
-+
-+    dest->pub.init_destination = initDestination;
-+    dest->pub.empty_output_buffer = emptyOutputBuffer;
-+    dest->pub.term_destination = termDestination;
-+    dest->outJpegBuf = jpegBuf;
-+    dest->outJpegBufSize = jpegBufSize;
-+
-+    return 0;
-+}
-+
-+/**
-+ * Init the destination
-+ *
-+ * It's the first function which be called
-+ * among initDestination, emptyOutputBuffer and termDestination
-+ *
-+ * \param cInfo: the compress pointer
-+ */
-+void SWJpegEncoder::Codec::initDestination(j_compress_ptr cInfo)
-+{
-+    LOG2("@%s", __func__);
-+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
-+
-+    dest->pub.next_output_byte = dest->outJpegBuf;
-+    dest->pub.free_in_buffer = dest->outJpegBufSize;
-+    dest->encodeSuccess = true;
-+}
-+
-+/**
-+ * Empty the output buffer
-+ *
-+ * The function should not be called,
-+ * because we should allocate enough memory for the jpeg destination buffer
-+ * If we return FALSE, the libjpeg will terminate, so return TRUE always.
-+ * But when the function is called, the encoding failing will be recorded.
-+ *
-+ * \param cInfo: the compress pointer
-+ * \return TRUE if it is successful.
-+ * \return FALSE if something is wrong
-+ */
-+boolean SWJpegEncoder::Codec::emptyOutputBuffer(j_compress_ptr cInfo)
-+{
-+    LOG2("@%s", __func__);
-+    ALOGE("@%s, line:%d, buffer overflow!", __func__, __LINE__);
-+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
-+
-+    /* re-cfg the buffer info */
-+    dest->pub.next_output_byte = dest->outJpegBuf;
-+    dest->pub.free_in_buffer = dest->outJpegBufSize;
-+    dest->encodeSuccess = false;
-+
-+    return TRUE; /* if return FALSE, the total taking picture will fail */
-+}
-+
-+/**
-+ * Terminate the destination
-+ *
-+ * The function will be called as the last function,
-+ * among initDestination, emptyOutputBuffer and termDestination.
-+ * We can get the encoded jpeg size from it.
-+ *
-+ * \param cInfo: the compress pointer
-+ */
-+void SWJpegEncoder::Codec::termDestination(j_compress_ptr cInfo)
-+{
-+    LOG2("@%s", __func__);
-+    JpegDestMgrPtr dest = (JpegDestMgrPtr)cInfo->dest;
-+
-+    dest->codedSize = dest->outJpegBufSize - dest->pub.free_in_buffer;
-+    LOG2("@%s, line:%d, codedSize:%d", __func__, __LINE__, dest->codedSize);
-+}
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
-new file mode 100644
-index 000000000000..f666a7b71da0
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/jpeg/sw/SWJpegEncoder.h
-@@ -0,0 +1,184 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2016-2019 Intel Corporation. All Rights Reserved.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ *\file SWJpegEncoder.h
-+ *
-+ * Abstracts the SW jpeg encoder
-+ *
-+ * This class calls the libjpeg ditectly. And libskia's performance is poor.
-+ * The SW jpeg encoder is used for the thumbnail encoding mainly.
-+ * But When the HW jpeg encoding fails, it will use the SW jpeg encoder also.
-+ *
-+ */
-+
-+#pragma once
-+
-+#include <stdio.h>
-+#include <vector>
-+
-+#include <linux/videodev2.h>
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Thread.h"
-+#include "IJpegEncoder.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+#include "jpeglib.h"
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+namespace icamera {
-+
-+/**
-+ * \class SWJpegEncoder
-+ *
-+ * This class is used for sw jpeg encoder.
-+ * It will use single or multi thread to do the sw jpeg encoding
-+ * It just support NV12 input currently.
-+ */
-+class SWJpegEncoder : public IJpegEncoder {
-+public:
-+    SWJpegEncoder();
-+    ~SWJpegEncoder();
-+
-+    virtual bool doJpegEncode(EncodePackage &package);
-+
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(SWJpegEncoder);
-+
-+private:
-+    bool useMultiThreadEncoding(int width, int height);
-+    int swEncode(const EncodePackage& package);
-+    int swEncodeMultiThread(const EncodePackage &package);
-+
-+    int mJpegSize; /*!< it's used to store jpeg size */
-+    int mTotalWidth;  /*!< the final jpeg width */
-+    int mTotalHeight;  /*!< the final jpeg height */
-+    unsigned char *mDstBuf; /*!< the dest buffer to store the final jpeg */
-+    unsigned int mCPUCoresNum;  /*!< use to remember the CPU Cores number */
-+
-+private:
-+    /**
-+     * \class CodecWorkerThread
-+     *
-+     * This class will create one thread to do one sw jpeg encoder.
-+     * It will call the SWJpegEncoderWrapper directly.
-+     */
-+    class CodecWorkerThread : public Thread {
-+    public:
-+        struct CodecConfig {
-+            // input buffer configuration
-+            int width;
-+            int height;
-+            int stride;
-+            int fourcc;
-+            void *inBufY;
-+            void *inBufUV;
-+            // output buffer configuration
-+            int quality;
-+            void *outBuf;
-+            int outBufSize;
-+        };
-+
-+        CodecWorkerThread();
-+        ~CodecWorkerThread();
-+
-+        void setConfig(CodecConfig &cfg) {mCfg = cfg;}
-+        void getConfig(CodecConfig *cfg){*cfg = mCfg;}
-+        status_t runThread(const char *name);
-+        void waitThreadFinish(void);
-+        int getJpegDataSize(void);
-+    private:
-+        int mDataSize;  /*!< the jpeg data size in one thread */
-+        CodecConfig mCfg;  /*!< the cfg in one thread */
-+    private:
-+        virtual bool threadLoop();
-+        int swEncode(void);
-+    };
-+
-+private:
-+    void init(unsigned int threadNum = 1);
-+    void deInit(void);
-+    void config(const EncodePackage &package);
-+    int doJpegEncodingMultiThread(void);
-+    int mergeJpeg(void);
-+
-+    std::vector<std::shared_ptr<CodecWorkerThread> > mSwJpegEncoder;
-+    static const unsigned int MAX_THREAD_NUM = 8; /*!< the same as max jpeg restart time */
-+    static const unsigned int MIN_THREAD_NUM = 1;
-+
-+    /*!< it's used to use one buffer to merge the multi jpeg data to one jpeg data */
-+    static const unsigned int DEST_BUF_OFFSET = 1024;
-+
-+private:
-+    /**
-+     * \class Codec
-+     *
-+     * This class is used for sw jpeg encoder.
-+     * It will call the libjpeg directly.
-+     * It just support NV12 input currently.
-+     */
-+    class Codec {
-+    public:
-+        Codec();
-+        ~Codec();
-+
-+        void init(void);
-+        void deInit(void);
-+        void setJpegQuality(int quality);
-+        int configEncoding(int width, int height, int stride,
-+                                    void *jpegBuf, int jpegBufSize);
-+        /*
-+            if fourcc is V4L2_PIX_FMT_NV12, y_buf and uv_buf must be passed
-+            if fourcc is V4L2_PIX_FMT_YUYV, y_buf must be passed, uv_buf could be nullptr
-+        */
-+        int doJpegEncoding(const void* y_buf, const void* uv_buf = nullptr, int fourcc = V4L2_PIX_FMT_NV12);
-+        void getJpegSize(int *jpegSize);
-+
-+    private:
-+        // prevent copy constructor and assignment operator
-+        DISALLOW_COPY_AND_ASSIGN(Codec);
-+
-+    private:
-+        typedef struct {
-+            struct jpeg_destination_mgr pub;
-+            JSAMPLE *outJpegBuf;  /*!< jpeg output buffer */
-+            int outJpegBufSize;  /*!< jpeg output buffer size */
-+            int codedSize;  /*!< the final encoded out jpeg size */
-+            bool encodeSuccess;  /*!< if buffer overflow, it will be set to false */
-+        } JpegDestMgr, *JpegDestMgrPtr;
-+
-+        int mStride;
-+        struct jpeg_compress_struct mCInfo;
-+        struct jpeg_error_mgr mJErr;
-+        int mJpegQuality;
-+        static const unsigned int SUPPORTED_FORMAT = JCS_YCbCr;
-+
-+        int setupJpegDestMgr(j_compress_ptr cInfo, JSAMPLE *jpegBuf, int jpegBufSize);
-+        // the below three functions are for the dest buffer manager.
-+        static void initDestination(j_compress_ptr cInfo);
-+        static boolean emptyOutputBuffer(j_compress_ptr cInfo);
-+        static void termDestination(j_compress_ptr cInfo);
-+    };
-+};
-+
-+}  // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
-new file mode 100644
-index 000000000000..9aa26c9ca706
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.cpp
-@@ -0,0 +1,435 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "CameraMetadata"
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#include "CameraMetadata.h"
-+
-+namespace icamera {
-+
-+CameraMetadata::CameraMetadata() :
-+        mBuffer(NULL), mLocked(false) {
-+}
-+
-+CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
-+        mLocked(false)
-+{
-+    mBuffer = allocate_icamera_metadata(entryCapacity, dataCapacity);
-+}
-+
-+CameraMetadata::CameraMetadata(const CameraMetadata &other) :
-+        mLocked(false) {
-+    mBuffer = clone_icamera_metadata(other.mBuffer);
-+}
-+
-+CameraMetadata::CameraMetadata(icamera_metadata_t *buffer) :
-+        mBuffer(NULL), mLocked(false) {
-+    acquire(buffer);
-+}
-+
-+CameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
-+    return operator=(other.mBuffer);
-+}
-+
-+CameraMetadata &CameraMetadata::operator=(const icamera_metadata_t *buffer) {
-+    if (mLocked) {
-+        LOGE("%s: Assignment to a locked CameraMetadata!", __func__);
-+        return *this;
-+    }
-+
-+    if (buffer != mBuffer) {
-+        icamera_metadata_t *newBuffer = clone_icamera_metadata(buffer);
-+        clear();
-+        mBuffer = newBuffer;
-+    }
-+    return *this;
-+}
-+
-+CameraMetadata::~CameraMetadata() {
-+    mLocked = false;
-+    clear();
-+}
-+
-+const icamera_metadata_t* CameraMetadata::getAndLock() {
-+    mLocked = true;
-+    return mBuffer;
-+}
-+
-+status_t CameraMetadata::unlock(const icamera_metadata_t *buffer) {
-+    if (!mLocked) {
-+        LOGE("%s: Can't unlock a non-locked CameraMetadata!", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if (buffer != mBuffer) {
-+        LOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
-+                __func__);
-+        return BAD_VALUE;
-+    }
-+    mLocked = false;
-+    return OK;
-+}
-+
-+icamera_metadata_t* CameraMetadata::release() {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return NULL;
-+    }
-+    icamera_metadata_t *released = mBuffer;
-+    mBuffer = NULL;
-+    return released;
-+}
-+
-+void CameraMetadata::clear() {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return;
-+    }
-+    if (mBuffer) {
-+        free_icamera_metadata(mBuffer);
-+        mBuffer = NULL;
-+    }
-+}
-+
-+void CameraMetadata::acquire(icamera_metadata_t *buffer) {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return;
-+    }
-+    clear();
-+    mBuffer = buffer;
-+
-+    if (validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
-+        LOGE("%s: Failed to validate metadata structure %p",
-+                 __func__, buffer);
-+    }
-+}
-+
-+void CameraMetadata::acquire(CameraMetadata &other) {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return;
-+    }
-+    acquire(other.release());
-+}
-+
-+status_t CameraMetadata::append(const CameraMetadata &other) {
-+    return append(other.mBuffer);
-+}
-+
-+status_t CameraMetadata::append(const icamera_metadata_t* other) {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    size_t extraEntries = get_icamera_metadata_entry_count(other);
-+    size_t extraData = get_icamera_metadata_data_count(other);
-+    resizeIfNeeded(extraEntries, extraData);
-+
-+    return append_icamera_metadata(mBuffer, other);
-+}
-+
-+size_t CameraMetadata::entryCount() const {
-+    return (mBuffer == NULL) ? 0 :
-+            get_icamera_metadata_entry_count(mBuffer);
-+}
-+
-+bool CameraMetadata::isEmpty() const {
-+    return entryCount() == 0;
-+}
-+
-+status_t CameraMetadata::sort() {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    return sort_icamera_metadata(mBuffer);
-+}
-+
-+status_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
-+    int tagType = get_icamera_metadata_tag_type(tag);
-+    if (tagType == -1 || tagType >= ICAMERA_NUM_TYPES) {
-+        LOGE("Update metadata entry: Unknown tag %d type=%d", tag, tagType);
-+        return INVALID_OPERATION;
-+    }
-+    if (tagType != expectedType) {
-+        LOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
-+                "got type %s data instead ",
-+                get_icamera_metadata_tag_name(tag), tag,
-+                icamera_metadata_type_names[tagType],
-+                icamera_metadata_type_names[expectedType]);
-+        return INVALID_OPERATION;
-+    }
-+    return OK;
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const int32_t *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_INT32)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const uint8_t *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const float *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_FLOAT)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const int64_t *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_INT64)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const double *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_DOUBLE)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const icamera_metadata_rational_t *data, size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_RATIONAL)) != OK) {
-+        return res;
-+    }
-+    return updateImpl(tag, (const void*)data, data_count);
-+}
-+
-+status_t CameraMetadata::update(uint32_t tag,
-+        const std::string &string) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    if ( (res = checkType(tag, ICAMERA_TYPE_BYTE)) != OK) {
-+        return res;
-+    }
-+    // string.size() doesn't count the null termination character.
-+    return updateImpl(tag, (const void*)string.c_str(), string.size() + 1);
-+}
-+
-+status_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
-+        size_t data_count) {
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    int type = get_icamera_metadata_tag_type(tag);
-+    if (type == -1) {
-+        LOGE("%s: Tag %d not found", __func__, tag);
-+        return BAD_VALUE;
-+    }
-+    size_t data_size = calculate_icamera_metadata_entry_data_size(type,
-+            data_count);
-+
-+    res = resizeIfNeeded(1, data_size);
-+
-+    if (res == OK) {
-+        icamera_metadata_entry_t entry;
-+        res = find_icamera_metadata_entry(mBuffer, tag, &entry);
-+        if (res == NAME_NOT_FOUND) {
-+            res = add_icamera_metadata_entry(mBuffer,
-+                    tag, data, data_count);
-+        } else if (res == OK) {
-+            res = update_icamera_metadata_entry(mBuffer,
-+                    entry.index, data, data_count, NULL);
-+        }
-+    }
-+
-+    if (res != OK) {
-+        LOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
-+                __func__, get_icamera_metadata_section_name(tag),
-+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
-+    }
-+
-+    if(validate_icamera_metadata_structure(mBuffer, /*size*/NULL) != OK) {
-+             LOGE("%s: Failed to validate metadata structure after update %p",
-+             __func__, mBuffer);
-+    }
-+
-+    return res;
-+}
-+
-+bool CameraMetadata::exists(uint32_t tag) const {
-+    icamera_metadata_ro_entry entry;
-+    return find_icamera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
-+}
-+
-+icamera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
-+    status_t res;
-+    icamera_metadata_entry entry;
-+    CLEAR(entry);
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        entry.count = 0;
-+        return entry;
-+    }
-+    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
-+    if (res != OK) {
-+        entry.count = 0;
-+        entry.data.u8 = NULL;
-+    }
-+    return entry;
-+}
-+
-+icamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
-+    status_t res;
-+    icamera_metadata_ro_entry entry;
-+    res = find_icamera_metadata_ro_entry(mBuffer, tag, &entry);
-+    if (res != OK) {
-+        entry.count = 0;
-+        entry.data.u8 = NULL;
-+    }
-+    return entry;
-+}
-+
-+status_t CameraMetadata::erase(uint32_t tag) {
-+    icamera_metadata_entry_t entry;
-+    status_t res;
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return INVALID_OPERATION;
-+    }
-+    res = find_icamera_metadata_entry(mBuffer, tag, &entry);
-+    if (res == NAME_NOT_FOUND) {
-+        return OK;
-+    } else if (res != OK) {
-+        LOGE("%s: Error looking for entry %s.%s (%x): %s %d",
-+                __func__,
-+                get_icamera_metadata_section_name(tag),
-+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
-+        return res;
-+    }
-+    res = delete_icamera_metadata_entry(mBuffer, entry.index);
-+    if (res != OK) {
-+        LOGE("%s: Error deleting entry %s.%s (%x): %s %d",
-+                __func__,
-+                get_icamera_metadata_section_name(tag),
-+                get_icamera_metadata_tag_name(tag), tag, strerror(-res), res);
-+    }
-+    return res;
-+}
-+
-+void CameraMetadata::dump(int fd, int verbosity, int indentation) const {
-+    dump_indented_icamera_metadata(mBuffer, fd, verbosity, indentation);
-+}
-+
-+status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
-+    if (mBuffer == NULL) {
-+        mBuffer = allocate_icamera_metadata(extraEntries * 2, extraData * 2);
-+        if (mBuffer == NULL) {
-+            LOGE("%s: Can't allocate larger metadata buffer", __func__);
-+            return NO_MEMORY;
-+        }
-+    } else {
-+        size_t currentEntryCount = get_icamera_metadata_entry_count(mBuffer);
-+        size_t currentEntryCap = get_icamera_metadata_entry_capacity(mBuffer);
-+        size_t newEntryCount = currentEntryCount +
-+                extraEntries;
-+        newEntryCount = (newEntryCount > currentEntryCap) ?
-+                newEntryCount * 2 : currentEntryCap;
-+
-+        size_t currentDataCount = get_icamera_metadata_data_count(mBuffer);
-+        size_t currentDataCap = get_icamera_metadata_data_capacity(mBuffer);
-+        size_t newDataCount = currentDataCount +
-+                extraData;
-+        newDataCount = (newDataCount > currentDataCap) ?
-+                newDataCount * 2 : currentDataCap;
-+
-+        if (newEntryCount > currentEntryCap ||
-+                newDataCount > currentDataCap) {
-+            icamera_metadata_t *oldBuffer = mBuffer;
-+            mBuffer = allocate_icamera_metadata(newEntryCount,
-+                    newDataCount);
-+            if (mBuffer == NULL) {
-+                LOGE("%s: Can't allocate larger metadata buffer", __func__);
-+                return NO_MEMORY;
-+            }
-+            append_icamera_metadata(mBuffer, oldBuffer);
-+            free_icamera_metadata(oldBuffer);
-+        }
-+    }
-+    return OK;
-+}
-+
-+void CameraMetadata::swap(CameraMetadata& other) {
-+    if (mLocked) {
-+        LOGE("%s: CameraMetadata is locked", __func__);
-+        return;
-+    } else if (other.mLocked) {
-+        LOGE("%s: Other CameraMetadata is locked", __func__);
-+        return;
-+    }
-+
-+    icamera_metadata* thisBuf = mBuffer;
-+    icamera_metadata* otherBuf = other.mBuffer;
-+
-+    other.mBuffer = thisBuf;
-+    mBuffer = otherBuf;
-+}
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
-new file mode 100644
-index 000000000000..6acf03e91989
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/CameraMetadata.h
-@@ -0,0 +1,200 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string>
-+
-+#include "icamera_metadata_base.h"
-+#include "iutils/Errors.h"
-+
-+namespace icamera {
-+
-+/**
-+ * A convenience wrapper around the C-based icamera_metadata_t library.
-+ */
-+class CameraMetadata {
-+  public:
-+    /** Creates an empty object; best used when expecting to acquire contents
-+     * from elsewhere */
-+    CameraMetadata();
-+    /** Creates an object with space for entryCapacity entries, with
-+     * dataCapacity extra storage */
-+    CameraMetadata(size_t entryCapacity, size_t dataCapacity = 10);
-+
-+    ~CameraMetadata();
-+
-+    /** Takes ownership of passed-in buffer */
-+    CameraMetadata(icamera_metadata_t *buffer);
-+    /** Clones the metadata */
-+    CameraMetadata(const CameraMetadata &other);
-+
-+    /**
-+     * Assignment clones metadata buffer.
-+     */
-+    CameraMetadata &operator=(const CameraMetadata &other);
-+    CameraMetadata &operator=(const icamera_metadata_t *buffer);
-+
-+    /**
-+     * Get reference to the underlying metadata buffer. Ownership remains with
-+     * the CameraMetadata object, but non-const CameraMetadata methods will not
-+     * work until unlock() is called. Note that the lock has nothing to do with
-+     * thread-safety, it simply prevents the icamera_metadata_t pointer returned
-+     * here from being accidentally invalidated by CameraMetadata operations.
-+     */
-+    const icamera_metadata_t* getAndLock();
-+
-+    /**
-+     * Unlock the CameraMetadata for use again. After this unlock, the pointer
-+     * given from getAndLock() may no longer be used. The pointer passed out
-+     * from getAndLock must be provided to guarantee that the right object is
-+     * being unlocked.
-+     */
-+    status_t unlock(const icamera_metadata_t *buffer);
-+
-+    /**
-+     * Release a raw metadata buffer to the caller. After this call,
-+     * CameraMetadata no longer references the buffer, and the caller takes
-+     * responsibility for freeing the raw metadata buffer (using
-+     * free_camera_metadata()), or for handing it to another CameraMetadata
-+     * instance.
-+     */
-+    icamera_metadata_t* release();
-+
-+    /**
-+     * Clear the metadata buffer and free all storage used by it
-+     */
-+    void clear();
-+
-+    /**
-+     * Acquire a raw metadata buffer from the caller. After this call,
-+     * the caller no longer owns the raw buffer, and must not free or manipulate it.
-+     * If CameraMetadata already contains metadata, it is freed.
-+     */
-+    void acquire(icamera_metadata_t* buffer);
-+
-+    /**
-+     * Acquires raw buffer from other CameraMetadata object. After the call, the argument
-+     * object no longer has any metadata.
-+     */
-+    void acquire(CameraMetadata &other);
-+
-+    /**
-+     * Append metadata from another CameraMetadata object.
-+     */
-+    status_t append(const CameraMetadata &other);
-+
-+    /**
-+     * Append metadata from a raw camera_metadata buffer
-+     */
-+    status_t append(const icamera_metadata* other);
-+
-+    /**
-+     * Number of metadata entries.
-+     */
-+    size_t entryCount() const;
-+
-+    /**
-+     * Is the buffer empty (no entires)
-+     */
-+    bool isEmpty() const;
-+
-+    /**
-+     * Sort metadata buffer for faster find
-+     */
-+    status_t sort();
-+
-+    /**
-+     * Update metadata entry. Will create entry if it doesn't exist already, and
-+     * will reallocate the buffer if insufficient space exists. Overloaded for
-+     * the various types of valid data.
-+     */
-+    status_t update(uint32_t tag,
-+            const uint8_t *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const int32_t *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const float *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const int64_t *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const double *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const icamera_metadata_rational_t *data, size_t data_count);
-+    status_t update(uint32_t tag,
-+            const std::string &string);
-+
-+    /**
-+     * Check if a metadata entry exists for a given tag id
-+     *
-+     */
-+    bool exists(uint32_t tag) const;
-+
-+    /**
-+     * Get metadata entry by tag id
-+     */
-+    icamera_metadata_entry find(uint32_t tag);
-+
-+    /**
-+     * Get metadata entry by tag id, with no editing
-+     */
-+    icamera_metadata_ro_entry find(uint32_t tag) const;
-+
-+    /**
-+     * Delete metadata entry by tag
-+     */
-+    status_t erase(uint32_t tag);
-+
-+    /**
-+     * Swap the underlying camera metadata between this and the other
-+     * metadata object.
-+     */
-+    void swap(CameraMetadata &other);
-+
-+    /**
-+     * Dump contents into FD for debugging. The verbosity levels are
-+     * 0: Tag entry information only, no data values
-+     * 1: Level 0 plus at most 16 data values per entry
-+     * 2: All information
-+     *
-+     * The indentation parameter sets the number of spaces to add to the start
-+     * each line of output.
-+     */
-+    void dump(int fd, int verbosity = 1, int indentation = 0) const;
-+
-+  private:
-+    icamera_metadata_t *mBuffer;
-+    bool               mLocked;
-+
-+    /**
-+     * Check if tag has a given type
-+     */
-+    status_t checkType(uint32_t tag, uint8_t expectedType);
-+
-+    /**
-+     * Base update entry method
-+     */
-+    status_t updateImpl(uint32_t tag, const void *data, size_t data_count);
-+
-+    /**
-+     * Resize metadata buffer if needed by reallocating it and copying it over.
-+     */
-+    status_t resizeIfNeeded(size_t extraEntries, size_t extraData);
-+
-+};
-+
-+} // namespace android
-diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
-new file mode 100644
-index 000000000000..926540f32be5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
-@@ -0,0 +1,313 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ParameterGenerator"
-+
-+#include <math.h>
-+#include <memory>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#include "MakerNote.h"
-+#include "AiqResultStorage.h"
-+#include "AiqUtils.h"
-+#include "ParameterGenerator.h"
-+
-+namespace icamera {
-+
-+#define CHECK_REQUEST_ID(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error request id %ld!", __func__, id);
-+#define CHECK_SEQUENCE(id) CheckError((id < 0), UNKNOWN_ERROR, "%s: error sequence %ld!", __func__, id);
-+
-+ParameterGenerator::ParameterGenerator(int cameraId) :
-+    mCameraId(cameraId),
-+    mLastSequence(-1),
-+    mTonemapMaxCurvePoints(0)
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+    reset();
-+
-+    camera_info_t info;
-+    CLEAR(info);
-+    PlatformData::getCameraInfo(mCameraId, info);
-+    info.capability->getTonemapMaxCurvePoints(mTonemapMaxCurvePoints);
-+    if (mTonemapMaxCurvePoints) {
-+        mTonemapCurveRed = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
-+        mTonemapCurveBlue = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
-+        mTonemapCurveGreen = std::unique_ptr<float[]>(new float[mTonemapMaxCurvePoints * 2]);
-+    }
-+}
-+
-+ParameterGenerator::~ParameterGenerator()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+}
-+
-+int ParameterGenerator::reset()
-+{
-+    LOG1("%s, mCameraId = %d", __func__, mCameraId);
-+    AutoMutex l(mParamsLock);
-+    for (int i = 0; i < kStorageSize; i++) {
-+        mRequestParams[i].reset();
-+    }
-+
-+    mLastSequence = -1;
-+    return OK;
-+}
-+
-+int ParameterGenerator::saveParameters(long sequence, long requestId, const Parameters* param)
-+{
-+    CHECK_REQUEST_ID(requestId);
-+    CHECK_SEQUENCE(sequence);
-+
-+    long index = sequence % kStorageSize;
-+
-+    AutoMutex l(mParamsLock);
-+    mLastSequence = sequence;
-+    if (param)
-+        mLastParam = *param;
-+
-+    LOG2("%s, sequence %ld", __func__, sequence);
-+    mRequestParams[index].sequence = sequence;
-+    mRequestParams[index].requestId = requestId;
-+    mRequestParams[index].param = mLastParam;
-+    return OK;
-+}
-+
-+void ParameterGenerator::updateParameters(long sequence, const Parameters *param)
-+{
-+    CheckError(!param, VOID_VALUE, "The param is nullptr!");
-+
-+    LOG2("%s, sequence %ld", __func__, sequence);
-+    long index = sequence % kStorageSize;
-+
-+    AutoMutex l(mParamsLock);
-+    // Update Jpeg related settings
-+    int rotation = 0;
-+    int ret = param->getJpegRotation(rotation);
-+    if (ret == OK) {
-+        mRequestParams[index].param.setJpegRotation(rotation);
-+    }
-+    camera_resolution_t res;
-+    ret = param->getJpegThumbnailSize(res);
-+    if (ret == OK) {
-+        mRequestParams[index].param.setJpegThumbnailSize(res);
-+    }
-+}
-+
-+int ParameterGenerator::getParameters(long sequence, Parameters *param, bool resultOnly, bool still)
-+{
-+    CheckError((param == nullptr), UNKNOWN_ERROR, "nullptr to get param!");
-+
-+    if (!resultOnly && sequence < 0) {
-+        *param = mLastParam;
-+    } else if (!resultOnly) {
-+        long pos = -1;
-+        for (long seq = sequence; (seq > (sequence - kStorageSize)) && (seq >= 0); seq--) {
-+            long index = seq % kStorageSize;
-+            if (seq == mRequestParams[index].sequence) {
-+                pos = index;
-+                break;
-+            }
-+        }
-+
-+        if (pos >= 0) {
-+            *param = mRequestParams[pos].param;
-+        } else {
-+            LOGE("Can't find settings for seq %ld", sequence);
-+        }
-+    }
-+
-+    if (still) {
-+        MakerNote::getInstance(mCameraId)->acquireMakernoteData(sequence, param);
-+    }
-+    generateParametersL(sequence, param);
-+    return OK;
-+}
-+
-+int ParameterGenerator::getRequestId(long sequence, long& requestId)
-+{
-+    CHECK_SEQUENCE(sequence);
-+    requestId = -1;
-+    long index = sequence % kStorageSize;
-+
-+    AutoMutex l(mParamsLock);
-+    CheckError((sequence != mRequestParams[index].sequence), UNKNOWN_ERROR,
-+        "Can't find requestId for seq %ld, saved %ld:%ld",
-+        sequence, mRequestParams[index].requestId, mRequestParams[index].sequence);
-+
-+    requestId = mRequestParams[index].requestId;
-+    return OK;
-+}
-+
-+int ParameterGenerator::generateParametersL(long sequence, Parameters *params)
-+{
-+    if (PlatformData::isEnableAIQ(mCameraId)) {
-+        updateWithAiqResultsL(sequence, params);
-+        updateTonemapCurve(sequence, params);
-+    }
-+    return OK;
-+}
-+
-+int ParameterGenerator::updateWithAiqResultsL(long sequence, Parameters *params)
-+{
-+    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
-+    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
-+           "%s Aiq result of sequence %ld does not exist", __func__, sequence);
-+
-+    // Update AE related parameters
-+    camera_ae_state_t aeState = aiqResult->mAeResults.exposures[0].converged ?
-+            AE_STATE_CONVERGED : AE_STATE_NOT_CONVERGED;
-+    params->setAeState(aeState);
-+
-+    if (CameraUtils::isMultiExposureCase(aiqResult->mTuningMode) &&
-+        aiqResult->mAeResults.num_exposures > 1 && aiqResult->mAeResults.exposures[1].exposure) {
-+        params->setExposureTime(aiqResult->mAeResults.exposures[1].exposure->exposure_time_us);
-+    } else {
-+        params->setExposureTime(aiqResult->mAeResults.exposures[0].exposure->exposure_time_us);
-+    }
-+    params->setSensitivityGain(log10(aiqResult->mAeResults.exposures[0].exposure->analog_gain)*20.0);
-+
-+    // Update AWB related parameters
-+    updateAwbGainsL(params, aiqResult->mAwbResults);
-+    camera_color_transform_t ccm;
-+    MEMCPY_S(ccm.color_transform, sizeof(ccm.color_transform),
-+             aiqResult->mPaResults.color_conversion_matrix,
-+             sizeof(aiqResult->mPaResults.color_conversion_matrix));
-+    params->setColorTransform(ccm);
-+
-+    camera_color_gains_t colorGains;
-+    colorGains.color_gains_rggb[0] = aiqResult->mPaResults.color_gains.r;
-+    colorGains.color_gains_rggb[1] = aiqResult->mPaResults.color_gains.gr;
-+    colorGains.color_gains_rggb[2] = aiqResult->mPaResults.color_gains.gb;
-+    colorGains.color_gains_rggb[3] = aiqResult->mPaResults.color_gains.b;
-+    params->setColorGains(colorGains);
-+
-+    camera_awb_state_t awbState = (fabs(aiqResult->mAwbResults.distance_from_convergence) < 0.001) ?
-+            AWB_STATE_CONVERGED : AWB_STATE_NOT_CONVERGED;
-+    params->setAwbState(awbState);
-+
-+    // Update AF related parameters
-+    camera_af_state_t afState = \
-+            (aiqResult->mAfResults.status == ia_aiq_af_status_local_search) ? AF_STATE_LOCAL_SEARCH
-+          : (aiqResult->mAfResults.status == ia_aiq_af_status_extended_search) ? AF_STATE_EXTENDED_SEARCH
-+          : (aiqResult->mAfResults.status == ia_aiq_af_status_success) ? AF_STATE_SUCCESS
-+          : (aiqResult->mAfResults.status == ia_aiq_af_status_fail) ? AF_STATE_FAIL
-+          : AF_STATE_IDLE;
-+    params->setAfState(afState);
-+    params->setFocusDistance(aiqResult->mAfDistanceDiopters);
-+    params->setFocusRange(aiqResult->mFocusRange);
-+
-+    bool lensMoving = false;
-+    if (afState == AF_STATE_LOCAL_SEARCH || afState == AF_STATE_EXTENDED_SEARCH) {
-+        lensMoving = (aiqResult->mAfResults.final_lens_position_reached == false);
-+    } else if (aiqResult->mAiqParam.afMode == AF_MODE_OFF) {
-+        lensMoving = (aiqResult->mAfResults.lens_driver_action ? true : false);
-+    }
-+    params->setLensState(lensMoving);
-+
-+    // Update scene mode
-+    camera_scene_mode_t sceneMode = SCENE_MODE_AUTO;
-+    params->getSceneMode(sceneMode);
-+
-+    /* Use direct AE result to update sceneMode to reflect the actual mode AE want to have,
-+     * Besides needed by full pipe auto-switch, this is also necessary when user want to
-+     * switch pipe in user app according to AE result.
-+     */
-+    if (sceneMode == SCENE_MODE_AUTO) {
-+        if (aiqResult->mAeResults.multiframe== ia_aiq_bracket_mode_hdr) {
-+            sceneMode = SCENE_MODE_HDR;
-+        } else if (aiqResult->mAeResults.multiframe == ia_aiq_bracket_mode_ull) {
-+            sceneMode = SCENE_MODE_ULL;
-+        }
-+    }
-+    LOG2("%s, sceneMode:%d", __func__, sceneMode);
-+    params->setSceneMode(sceneMode);
-+
-+    camera_lens_shading_map_mode_type_t lensShadingMapMode = LENS_SHADING_MAP_MODE_OFF;
-+    params->getLensShadingMapMode(lensShadingMapMode);
-+    if (lensShadingMapMode == LENS_SHADING_MAP_MODE_ON) {
-+        size_t size = aiqResult->mAiqParam.lensShadingMapSize.x *
-+                      aiqResult->mAiqParam.lensShadingMapSize.y * 4;
-+        params->setLensShadingMap(aiqResult->mAiqParam.lensShadingMap, size);
-+    }
-+
-+    return OK;
-+}
-+
-+int ParameterGenerator::updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result)
-+{
-+    camera_awb_gains_t awbGains;
-+    CLEAR(awbGains);
-+    float normalizedR, normalizedG, normalizedB;
-+
-+    if (params->getAwbGains(awbGains) == OK) {
-+        // User manual AWB gains
-+        awbGains.g_gain = CLIP(awbGains.g_gain, AWB_GAIN_MAX, AWB_GAIN_MIN);
-+        normalizedG = AiqUtils::normalizeAwbGain(awbGains.g_gain);
-+    } else {
-+        // non-manual AWB gains, try to find a proper G that makes R/G/B all in the gain range.
-+        normalizedG = sqrt((AWB_GAIN_NORMALIZED_START * AWB_GAIN_NORMALIZED_END) / \
-+                           (result.accurate_r_per_g * result.accurate_b_per_g));
-+        awbGains.g_gain = AiqUtils::convertToUserAwbGain(normalizedG);
-+    }
-+
-+    normalizedR = result.accurate_r_per_g * normalizedG;
-+    normalizedB = result.accurate_b_per_g * normalizedG;
-+
-+    awbGains.r_gain = AiqUtils::convertToUserAwbGain(normalizedR);
-+    awbGains.b_gain = AiqUtils::convertToUserAwbGain(normalizedB);
-+
-+    LOG2("awbGains [r, g, b] = [%d, %d, %d]", awbGains.r_gain, awbGains.g_gain, awbGains.b_gain);
-+    params->setAwbGains(awbGains);
-+
-+    // Update the AWB result
-+    camera_awb_result_t awbResult;
-+    awbResult.r_per_g = result.accurate_r_per_g;
-+    awbResult.b_per_g = result.accurate_b_per_g;
-+    LOG2("awb result: %f, %f", awbResult.r_per_g, awbResult.b_per_g);
-+    params->setAwbResult(&awbResult);
-+
-+    return OK;
-+}
-+
-+int ParameterGenerator::updateTonemapCurve(long sequence, Parameters *params)
-+{
-+    if (!mTonemapMaxCurvePoints)
-+        return OK;
-+
-+    const AiqResult *aiqResult = AiqResultStorage::getInstance(mCameraId)->getAiqResult(sequence);
-+    CheckError((aiqResult == nullptr), UNKNOWN_ERROR,
-+               "%s Aiq result of sequence %ld does not exist", __func__, sequence);
-+    const ia_aiq_gbce_results &gbceResults = aiqResult->mGbceResults;
-+
-+    int multiplier = gbceResults.gamma_lut_size / mTonemapMaxCurvePoints;
-+    for (int32_t i=0; i < mTonemapMaxCurvePoints; i++) {
-+        mTonemapCurveRed[i * 2 + 1] = gbceResults.r_gamma_lut[i * multiplier];
-+        mTonemapCurveBlue[i * 2 + 1] = gbceResults.g_gamma_lut[i * multiplier];
-+        mTonemapCurveGreen[i * 2 + 1] = gbceResults.b_gamma_lut[i * multiplier];
-+    }
-+
-+    int count = mTonemapMaxCurvePoints * 2;
-+    camera_tonemap_curves_t curves =
-+            {count, count, count,
-+             mTonemapCurveRed.get(), mTonemapCurveBlue.get(), mTonemapCurveGreen.get()};
-+    params->setTonemapCurves(curves);
-+    return OK;
-+}
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
-new file mode 100644
-index 000000000000..bb06c2e05a20
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+
-+#include "iutils/Thread.h"
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+/*
-+ * \class ParameterGenerator
-+ * This class is used to generator parameter results. It updates the parameters
-+ * with AIQ results, sensor embedded metadata and 3A statistics.
-+ * The parameter results are stored with the frame sequence indicating on which
-+ * frame the parameters are active.
-+ */
-+class ParameterGenerator {
-+public:
-+    ParameterGenerator(int cameraId);
-+    ~ParameterGenerator();
-+
-+    /**
-+     * \brief reset the parameters data.
-+     */
-+    int reset();
-+
-+    /**
-+     * \brief Save parameters with sequence id indicating the active frame.
-+     *           And update the aiq result parameters as well.
-+     */
-+    int saveParameters(long predictSequence, long requestId, const Parameters *param = nullptr);
-+
-+    /**
-+     * \brief Update parameters per sequence id.
-+     */
-+    void updateParameters(long sequence, const Parameters *param);
-+
-+    /**
-+     * \brief Get the parameters for the frame indicated by the sequence id.
-+     */
-+    int getParameters(long sequence, Parameters *param, bool mergeResultOnly = true, bool still = false);
-+    int getRequestId(long predictSequence, long& requestId);
-+
-+private:
-+    ParameterGenerator(const ParameterGenerator& other);
-+    ParameterGenerator& operator=(const ParameterGenerator& other);
-+
-+    int generateParametersL(long sequence, Parameters *params);
-+    int updateWithAiqResultsL(long sequence, Parameters *params);
-+    int updateAwbGainsL(Parameters *params, const ia_aiq_awb_results &result);
-+    int updateTonemapCurve(long sequence, Parameters *params);
-+
-+private:
-+    typedef enum {
-+        RESULT_TYPE_AIQ = 1,
-+        RESULT_TYPE_SENSOR_EMD = 1 << 1,
-+        RESULT_TYPE_STATISTICS = 1 << 2
-+    } ResultType;
-+
-+    class RequestParam {
-+    public:
-+        RequestParam() : sequence(-1), requestId(-1) {}
-+
-+        ~RequestParam() {}
-+
-+        void reset() {
-+            sequence = -1;
-+            requestId = -1;
-+        }
-+
-+        long sequence;
-+        long requestId;
-+        Parameters param;
-+
-+    private:
-+        RequestParam(const RequestParam& other);
-+        RequestParam& operator=(const RequestParam& other);
-+    };
-+
-+private:
-+    int mCameraId;
-+    static const int kStorageSize = MAX_SETTING_COUNT;
-+
-+    // Guard for ParameterGenerator public API.
-+    Mutex mParamsLock;
-+    RequestParam mRequestParams[kStorageSize];
-+    long mLastSequence;
-+    Parameters mLastParam;
-+
-+    std::unique_ptr<float[]> mTonemapCurveRed;
-+    std::unique_ptr<float[]> mTonemapCurveBlue;
-+    std::unique_ptr<float[]> mTonemapCurveGreen;
-+    int32_t mTonemapMaxCurvePoints;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
-new file mode 100644
-index 000000000000..578557f5caca
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.cpp
-@@ -0,0 +1,84 @@
-+/*
-+ * Copyright (C) 2017-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "ParameterHelper"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+
-+#include "Parameters.h"
-+#include "ParameterHelper.h"
-+
-+namespace icamera {
-+
-+void ParameterHelper::merge(const Parameters& src, Parameters* dst)
-+{
-+    AutoRLock rl(src.mData);
-+    merge(getMetadata(src.mData), dst);
-+}
-+
-+void ParameterHelper::merge(const CameraMetadata& metadata, Parameters* dst)
-+{
-+    if (metadata.isEmpty()) {
-+        // Nothing needs to be merged
-+        return;
-+    }
-+
-+    AutoWLock wl(dst->mData);
-+    const icamera_metadata_t* src = const_cast<CameraMetadata*>(&metadata)->getAndLock();
-+    size_t count = metadata.entryCount();
-+    icamera_metadata_ro_entry_t entry;
-+    for (size_t i = 0; i < count; i++) {
-+        CLEAR(entry);
-+        if (get_icamera_metadata_ro_entry(src, i, &entry) != OK) {
-+            continue;
-+        }
-+        switch (entry.type) {
-+        case ICAMERA_TYPE_BYTE:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.u8, entry.count);
-+            break;
-+        case ICAMERA_TYPE_INT32:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.i32, entry.count);
-+            break;
-+        case ICAMERA_TYPE_FLOAT:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.f, entry.count);
-+            break;
-+        case ICAMERA_TYPE_INT64:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.i64, entry.count);
-+            break;
-+        case ICAMERA_TYPE_DOUBLE:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.d, entry.count);
-+            break;
-+        case ICAMERA_TYPE_RATIONAL:
-+            getMetadata(dst->mData).update(entry.tag, entry.data.r, entry.count);
-+            break;
-+        default:
-+            LOGW("Invalid entry type, should never happen");
-+            break;
-+        }
-+    }
-+    const_cast<CameraMetadata*>(&metadata)->unlock(src);
-+}
-+
-+void ParameterHelper::copyMetadata(const Parameters& source, CameraMetadata* metadata)
-+{
-+    CheckError((!metadata), VOID_VALUE, "null metadata to be updated!");
-+
-+    AutoRLock rl(source.mData);
-+    *metadata = getMetadata(source.mData);
-+}
-+
-+} // end of namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
-new file mode 100644
-index 000000000000..8e5cf6e25f81
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/ParameterHelper.h
-@@ -0,0 +1,142 @@
-+/*
-+ * Copyright (C) 2017-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/RWLock.h"
-+#include "CameraMetadata.h"
-+
-+namespace icamera {
-+
-+class Parameters;
-+
-+/**
-+ * \class ParameterHelper
-+ *
-+ * There are two main purposes of this class:
-+ * 1. Provide some wrapper functions for the implementation of Parameters.
-+ * 2. Provide some interface for HAL to access and modify Parameters internal data.
-+ */
-+class ParameterHelper {
-+public:
-+    /**
-+     * \brief Merge and update dst parameter buffer with another parameter instance.
-+     *
-+     * \param[in] Parameters src: the source parameter.
-+     * \param[out] Parameters dst: the parameter to be updated.
-+     *
-+     * \return void
-+     */
-+    static void merge(const Parameters& src, Parameters* dst);
-+
-+    /**
-+     * \brief Merge and update dst parameter buffer by using metadata.
-+     *
-+     * \param[in] CameraMetadata metadata: the source metadata.
-+     * \param[out] Parameters dst: the parameter to be updated.
-+     *
-+     * \return void
-+     */
-+    static void merge(const CameraMetadata& metadata, Parameters* dst);
-+
-+    /**
-+     * \brief Copy metadata from parameter buffer.
-+     *
-+     * Some HAL V3 style parameters are not returned in the getParameter()
-+     * because it is not used inside the HAL.
-+     * Provide this function to assist upperlayer to return metadata
-+     * to applications.
-+     *
-+     * \param[in] Parameters source: the parameter to provide metadata.
-+     * \param[out] CameraMetadata metadata: the metadata to be updated.
-+     *
-+     * \return void
-+     */
-+    static void copyMetadata(const Parameters& source, CameraMetadata* metadata);
-+
-+private:
-+    // The definitions and interfaces in this private section are only for Parameters internal
-+    // use, HAL other code shouldn't and cannot access them.
-+    friend class Parameters;
-+
-+    /**
-+     * \class ParameterData
-+     *
-+     * \brief The definition of Parameters' internal data structure used to hide implementation
-+     *        details of Parameters.
-+     */
-+    class ParameterData {
-+    public:
-+        ParameterData() {}
-+        ~ParameterData() {}
-+
-+        ParameterData(const ParameterData& other) : mMetadata(other.mMetadata) {}
-+        ParameterData& operator=(const ParameterData& other) {
-+            mMetadata = other.mMetadata;
-+            return *this;
-+        }
-+
-+        CameraMetadata mMetadata; // The data structure to save all of the parameters.
-+        RWLock mRwLock;           // Read-write lock to make Parameters class thread-safe
-+    };
-+
-+    // Customized wrappers of RWLock to make the implementation of Parameters much cleaner.
-+    class AutoRLock {
-+    public:
-+        AutoRLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.readLock(); }
-+        ~AutoRLock() { mLock.unlock(); }
-+    private:
-+        RWLock& mLock;
-+    };
-+
-+    class AutoWLock {
-+    public:
-+        AutoWLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.writeLock(); }
-+        ~AutoWLock() { mLock.unlock(); }
-+    private:
-+        RWLock& mLock;
-+    };
-+
-+    static ParameterData& getInternalData(void* data) {
-+        return *reinterpret_cast<ParameterData*>(data);
-+    }
-+
-+    static void* createParameterData() {
-+        return new ParameterData();
-+    }
-+
-+    static void* createParameterData(void* data) {
-+        return new ParameterData(getInternalData(data));
-+    }
-+
-+    static void releaseParameterData(void* data) {
-+        delete &getInternalData(data);
-+    }
-+
-+    static void deepCopy(void* srcData, void* dstData) {
-+        getInternalData(dstData) = getInternalData(srcData);
-+    }
-+
-+    static CameraMetadata& getMetadata(void* data) {
-+        return getInternalData(data).mMetadata;
-+    }
-+
-+    static icamera_metadata_ro_entry_t getMetadataEntry(void* data, uint32_t tag) {
-+        return const_cast<const CameraMetadata*>(&getMetadata(data))->find(tag);
-+    }
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/metadata/Parameters.cpp b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
-new file mode 100644
-index 000000000000..3e76c0f9a799
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
-@@ -0,0 +1,1931 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "Parameters"
-+
-+#include "iutils/Errors.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/CameraDump.h"
-+#include "iutils/Utils.h"
-+
-+#include "PlatformData.h"
-+#include "Parameters.h"
-+#include "ParameterHelper.h"
-+
-+using std::vector;
-+
-+namespace icamera {
-+
-+Parameters::Parameters() : mData(ParameterHelper::createParameterData()) {}
-+
-+Parameters::Parameters(const Parameters& other) :
-+        mData(ParameterHelper::createParameterData(other.mData)) {}
-+
-+Parameters& Parameters::operator=(const Parameters& other)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    ParameterHelper::deepCopy(other.mData, mData);
-+    return *this;
-+}
-+
-+Parameters::~Parameters()
-+{
-+    ParameterHelper::releaseParameterData(mData);
-+    mData = nullptr;
-+}
-+
-+void Parameters::merge(const Parameters& other)
-+{
-+    ParameterHelper::merge(other, this);
-+}
-+
-+int Parameters::setAeMode(camera_ae_mode_t aeMode)
-+{
-+    uint8_t mode = aeMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_MODE, &mode, 1);
-+}
-+
-+int Parameters::getAeMode(camera_ae_mode_t& aeMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    aeMode = (camera_ae_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAeState(camera_ae_state_t aeState)
-+{
-+    uint8_t state = aeState;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_STATE, &state, 1);
-+}
-+
-+int Parameters::getAeState(camera_ae_state_t& aeState) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_STATE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    aeState = (camera_ae_state_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+static int setRegions(CameraMetadata& metadata, camera_window_list_t regions, int tag)
-+{
-+    if (regions.empty()) {
-+        // Nothing to do with an empty parameter.
-+        return INVALID_OPERATION;
-+    }
-+
-+    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
-+    int values[regions.size() * ELEM_NUM];
-+    for (size_t i = 0; i < regions.size(); i++) {
-+        values[i * ELEM_NUM] = regions[i].left;
-+        values[i * ELEM_NUM + 1] = regions[i].top;
-+        values[i * ELEM_NUM + 2] = regions[i].right;
-+        values[i * ELEM_NUM + 3] = regions[i].bottom;
-+        values[i * ELEM_NUM + 4] = regions[i].weight;
-+    }
-+
-+    return metadata.update(tag, values, ARRAY_SIZE(values));
-+}
-+
-+static int getRegions(icamera_metadata_ro_entry_t entry, camera_window_list_t& regions)
-+{
-+    regions.clear();
-+    const int ELEM_NUM = sizeof(camera_window_t) / sizeof(int);
-+    if (entry.count == 0 || entry.count % ELEM_NUM != 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    camera_window_t w;
-+    for (size_t i = 0; i < entry.count; i += ELEM_NUM) {
-+        w.left = entry.data.i32[i];
-+        w.top = entry.data.i32[i + 1];
-+        w.right = entry.data.i32[i + 2];
-+        w.bottom = entry.data.i32[i + 3];
-+        w.weight = entry.data.i32[i + 4];
-+        regions.push_back(w);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::setAeRegions(camera_window_list_t aeRegions)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return setRegions(ParameterHelper::getMetadata(mData), aeRegions, CAMERA_AE_REGIONS);
-+}
-+
-+int Parameters::getAeRegions(camera_window_list_t& aeRegions) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AE_REGIONS), aeRegions);
-+}
-+
-+int Parameters::setAeLock(bool lock)
-+{
-+    uint8_t lockValue = lock ? 1 : 0;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_LOCK, &lockValue, 1);
-+}
-+
-+int Parameters::getAeLock(bool& lock) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    lock = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setExposureTime(int64_t exposureTime)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_EXPOSURE_TIME, &exposureTime, 1);
-+}
-+
-+int Parameters::getExposureTime(int64_t& exposureTime) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_EXPOSURE_TIME);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    exposureTime = entry.data.i64[0];
-+    return OK;
-+}
-+
-+int Parameters::setSensitivityGain(float gain)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN, &gain, 1);
-+}
-+
-+int Parameters::getSensitivityGain(float& gain) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    gain = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setAeCompensation(int ev)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_COMPENSATION, &ev, 1);
-+}
-+
-+int Parameters::getAeCompensation(int& ev) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    ev = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setFrameRate(float fps)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FRAME_RATE, &fps, 1);
-+}
-+
-+int Parameters::getFrameRate(float& fps) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FRAME_RATE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    fps = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setAntiBandingMode(camera_antibanding_mode_t bandingMode)
-+{
-+    uint8_t mode = bandingMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_ANTIBANDING_MODE, &mode, 1);
-+}
-+
-+int Parameters::getAntiBandingMode(camera_antibanding_mode_t& bandingMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_ANTIBANDING_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    bandingMode = (camera_antibanding_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbMode(camera_awb_mode_t awbMode)
-+{
-+    uint8_t mode = awbMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_MODE, &mode, 1);
-+}
-+
-+int Parameters::getAwbMode(camera_awb_mode_t& awbMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    awbMode = (camera_awb_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbState(camera_awb_state_t awbState)
-+{
-+    uint8_t state = awbState;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_STATE, &state, 1);
-+}
-+
-+int Parameters::getAwbState(camera_awb_state_t& awbState) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_STATE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    awbState = (camera_awb_state_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbLock(bool lock)
-+{
-+    uint8_t lockValue = lock ? 1 : 0;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_LOCK, &lockValue, 1);
-+}
-+
-+int Parameters::getAwbLock(bool& lock) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    lock = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbCctRange(camera_range_t cct)
-+{
-+    int range[] = {(int)cct.min, (int)cct.max};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CCT_RANGE, range, ARRAY_SIZE(range));
-+}
-+
-+int Parameters::getAwbCctRange(camera_range_t& cct) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CCT_RANGE);
-+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    cct.min = entry.data.i32[0];
-+    cct.max = entry.data.i32[1];
-+    return OK;
-+}
-+
-+int Parameters::setAwbGains(camera_awb_gains_t awbGains)
-+{
-+    int values[] = {awbGains.r_gain, awbGains.g_gain, awbGains.b_gain};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAINS, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getAwbGains(camera_awb_gains_t& awbGains) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAINS);
-+    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    awbGains.r_gain = entry.data.i32[0];
-+    awbGains.g_gain = entry.data.i32[1];
-+    awbGains.b_gain = entry.data.i32[2];
-+    return OK;
-+}
-+
-+int Parameters::setAwbResult(void* data)
-+{
-+    uint32_t size = sizeof(camera_awb_result_t);
-+    uint32_t tag = CAMERA_AWB_RESULT;
-+    ParameterHelper::AutoWLock wl(mData);
-+
-+    if (data == NULL) {
-+        return ParameterHelper::getMetadata(mData).erase(tag);
-+    }
-+    return ParameterHelper::getMetadata(mData).update(tag, (uint8_t*)data, size);
-+}
-+
-+int Parameters::getAwbResult(void* data) const
-+{
-+    if (data == NULL) {
-+        return BAD_VALUE;
-+    }
-+
-+    uint32_t size = sizeof(camera_awb_result_t);
-+    uint32_t tag = CAMERA_AWB_RESULT;
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    auto entry = ParameterHelper::getMetadataEntry(mData, tag);
-+    if (entry.count != size) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    MEMCPY_S(data, size, entry.data.u8, size);
-+
-+    return OK;
-+}
-+
-+int Parameters::setAwbGainShift(camera_awb_gains_t awbGainShift)
-+{
-+    int values[] = {awbGainShift.r_gain, awbGainShift.g_gain, awbGainShift.b_gain};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_GAIN_SHIFT, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getAwbGainShift(camera_awb_gains_t& awbGainShift) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_GAIN_SHIFT);
-+    const size_t ELEM_NUM = sizeof(camera_awb_gains_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    awbGainShift.r_gain = entry.data.i32[0];
-+    awbGainShift.g_gain = entry.data.i32[1];
-+    awbGainShift.b_gain = entry.data.i32[2];
-+    return OK;
-+}
-+
-+int Parameters::setAwbWhitePoint(camera_coordinate_t whitePoint)
-+{
-+    int values[] = {whitePoint.x, whitePoint.y};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_WHITE_POINT, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getAwbWhitePoint(camera_coordinate_t& whitePoint) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_WHITE_POINT);
-+    const size_t ELEM_NUM = sizeof(camera_coordinate_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    whitePoint.x = entry.data.i32[0];
-+    whitePoint.y = entry.data.i32[1];
-+
-+    return OK;
-+}
-+
-+int Parameters::setColorTransform(camera_color_transform_t colorTransform)
-+{
-+    float* transform = (float*)colorTransform.color_transform;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_TRANSFORM, transform, 3 * 3);
-+}
-+
-+int Parameters::getColorTransform(camera_color_transform_t& colorTransform) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_TRANSFORM);
-+    const size_t ELEM_NUM = 3 * 3;
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    for (size_t i = 0; i < ELEM_NUM; i++) {
-+        colorTransform.color_transform[i / 3][i % 3] = entry.data.f[i];
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::setColorGains(camera_color_gains_t colorGains)
-+{
-+    float* gains = colorGains.color_gains_rggb;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_COLOR_GAINS, gains, 4);
-+}
-+
-+int Parameters::getColorGains(camera_color_gains_t& colorGains) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    icamera_metadata_ro_entry_t entry =
-+        ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_COLOR_GAINS);
-+    const size_t ELEM_NUM = 4;
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    for (size_t i = 0; i < ELEM_NUM; i++) {
-+        colorGains.color_gains_rggb[i] = entry.data.f[i];
-+    }
-+    return OK;
-+}
-+
-+int Parameters::setAwbRegions(camera_window_list_t awbRegions)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return setRegions(ParameterHelper::getMetadata(mData), awbRegions, CAMERA_AWB_REGIONS);
-+}
-+
-+int Parameters::getAwbRegions(camera_window_list_t& awbRegions) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_REGIONS), awbRegions);
-+}
-+
-+int Parameters::setNrMode(camera_nr_mode_t nrMode)
-+{
-+    uint8_t mode = nrMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_MODE, &mode, 1);
-+}
-+
-+int Parameters::getNrMode(camera_nr_mode_t& nrMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    nrMode = (camera_nr_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setNrLevel(camera_nr_level_t level)
-+{
-+    int values [] = {level.overall, level.spatial, level.temporal};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_NR_LEVEL, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getNrLevel(camera_nr_level_t& level) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_NR_LEVEL);
-+    const size_t ELEM_NUM = sizeof(camera_nr_level_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    level.overall = entry.data.i32[0];
-+    level.spatial = entry.data.i32[1];
-+    level.temporal = entry.data.i32[2];
-+    return OK;
-+}
-+
-+int Parameters::setIrisMode(camera_iris_mode_t irisMode)
-+{
-+    uint8_t mode = irisMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_MODE, &mode, 1);
-+}
-+
-+int Parameters::getIrisMode(camera_iris_mode_t& irisMode)
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    irisMode = (camera_iris_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setIrisLevel(int level)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IRIS_LEVEL, &level, 1);
-+}
-+
-+int Parameters::getIrisLevel(int& level)
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IRIS_LEVEL);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    level = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setWdrLevel(uint8_t level)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WDR_LEVEL, &level, 1);
-+}
-+
-+int Parameters::getWdrLevel(uint8_t& level) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WDR_LEVEL);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    level = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setEffectSceneMode(camera_scene_mode_t sceneMode)
-+{
-+    uint8_t mode = sceneMode;
-+    LOGW("Effect scene mode is deprecated. Please use setSceneMode() instead.");
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
-+}
-+
-+int Parameters::getEffectSceneMode(camera_scene_mode_t& sceneMode) const
-+{
-+    LOGW("Effect scene mode is deprecated. Please use getSceneMode() instead.");
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setSceneMode(camera_scene_mode_t sceneMode)
-+{
-+    uint8_t mode = sceneMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SCENE_MODE, &mode, 1);
-+}
-+
-+int Parameters::getSceneMode(camera_scene_mode_t& sceneMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SCENE_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    sceneMode = (camera_scene_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setWeightGridMode(camera_weight_grid_mode_t weightGridMode)
-+{
-+    uint8_t mode = (uint8_t)weightGridMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_WEIGHT_GRID_MODE, &mode, 1);
-+}
-+
-+int Parameters::getWeightGridMode(camera_weight_grid_mode_t& weightGridMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_WEIGHT_GRID_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    weightGridMode = (camera_weight_grid_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setBlcAreaMode(camera_blc_area_mode_t blcAreaMode)
-+{
-+    uint8_t mode = blcAreaMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_BLC_AREA_MODE, &mode, 1);
-+}
-+
-+int Parameters::getBlcAreaMode(camera_blc_area_mode_t& blcAreaMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_BLC_AREA_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    blcAreaMode = (camera_blc_area_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setFpsRange(camera_range_t fpsRange)
-+{
-+    float range[] = {fpsRange.min, fpsRange.max};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AE_TARGET_FPS_RANGE, range, ARRAY_SIZE(range));
-+}
-+
-+int Parameters::getFpsRange(camera_range_t& fpsRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_TARGET_FPS_RANGE);
-+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(float);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+    fpsRange.min = entry.data.f[0];
-+    fpsRange.max = entry.data.f[1];
-+    return OK;
-+}
-+
-+int Parameters::setImageEnhancement(camera_image_enhancement_t effects)
-+{
-+    int values[] = {effects.sharpness, effects.brightness, effects.contrast, effects.hue, effects.saturation};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_IMAGE_ENHANCEMENT, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getImageEnhancement(camera_image_enhancement_t& effects) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_IMAGE_ENHANCEMENT);
-+    size_t number_of_effects = sizeof(camera_image_enhancement_t) / sizeof(int);
-+    if (entry.count != number_of_effects) {
-+        return NAME_NOT_FOUND;
-+    }
-+    effects.sharpness = entry.data.i32[0];
-+    effects.brightness = entry.data.i32[1];
-+    effects.contrast = entry.data.i32[2];
-+    effects.hue = entry.data.i32[3];
-+    effects.saturation = entry.data.i32[4];
-+
-+    return OK;
-+}
-+
-+int Parameters::setDeinterlaceMode(camera_deinterlace_mode_t deinterlaceMode)
-+{
-+    uint8_t mode = deinterlaceMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DEINTERLACE_MODE, &mode, 1);
-+}
-+
-+int Parameters::getDeinterlaceMode(camera_deinterlace_mode_t &deinterlaceMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DEINTERLACE_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    deinterlaceMode = (camera_deinterlace_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::getSupportedVideoStabilizationMode(camera_video_stabilization_list_t &supportedModes) const
-+{
-+    supportedModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedModes.push_back((camera_video_stabilization_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAeMode(vector <camera_ae_mode_t> &supportedAeModes) const
-+{
-+    supportedAeModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedAeModes.push_back((camera_ae_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAwbMode(vector <camera_awb_mode_t> &supportedAwbModes) const
-+{
-+    supportedAwbModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_AVAILABLE_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedAwbModes.push_back((camera_awb_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAfMode(vector <camera_af_mode_t> &supportedAfModes) const
-+{
-+    supportedAfModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_AVAILABLE_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedAfModes.push_back((camera_af_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedSceneMode(vector <camera_scene_mode_t> &supportedSceneModes) const
-+{
-+    supportedSceneModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_AVAILABLE_SCENE_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedSceneModes.push_back((camera_scene_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAntibandingMode(vector <camera_antibanding_mode_t> &supportedAntibindingModes) const
-+{
-+    supportedAntibindingModes.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_ANTIBANDING_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        supportedAntibindingModes.push_back((camera_antibanding_mode_t)entry.data.u8[i]);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedFpsRange(camera_range_array_t& ranges) const
-+{
-+    ranges.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES);
-+    if (entry.count == 0 || entry.count % 2 != 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    camera_range_t fps;
-+    for (size_t i = 0; i < entry.count; i += 2) {
-+        fps.min = entry.data.f[i];
-+        fps.max = entry.data.f[i + 1];
-+        ranges.push_back(fps);
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::getSupportedStreamConfig(supported_stream_config_array_t& config) const
-+{
-+    config.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
-+    const int streamConfMemberNum = sizeof(supported_stream_config_t) / sizeof(int);
-+    if (entry.count == 0 || entry.count % streamConfMemberNum != 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    supported_stream_config_t cfg;
-+    CLEAR(cfg);
-+
-+    for (size_t i = 0; i < entry.count; i += streamConfMemberNum) {
-+        MEMCPY_S(&cfg, sizeof(supported_stream_config_t), &entry.data.i32[i], sizeof(supported_stream_config_t));
-+        cfg.stride = CameraUtils::getStride(cfg.format, cfg.width);
-+        cfg.size   = CameraUtils::getFrameSize(cfg.format, cfg.width, cfg.height);
-+        config.push_back(cfg);
-+    }
-+    return OK;
-+}
-+
-+int Parameters::getSupportedSensorExposureTimeRange(camera_range_t& range) const
-+{
-+    CLEAR(range);
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE);
-+    if (entry.count != 2) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    range.min = (float)(entry.data.i64[0]);
-+    range.max = (float)(entry.data.i64[1]);
-+    return OK;
-+}
-+
-+int Parameters::getSupportedSensorSensitivityRange(camera_range_t& range) const
-+{
-+    CLEAR(range);
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_SENSITIVITY_RANGE);
-+    if (entry.count != 2) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    range.min = entry.data.i32[0];
-+    range.max = entry.data.i32[1];
-+    return OK;
-+}
-+
-+int Parameters::getSupportedFeatures(camera_features_list_t& features) const
-+{
-+    features.clear();
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AVAILABLE_FEATURES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        features.push_back((camera_features)entry.data.u8[i]);
-+    }
-+    return OK;
-+}
-+
-+int Parameters::getAeCompensationRange(camera_range_t& evRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_RANGE);
-+    const size_t ELEM_NUM = sizeof(camera_range_t) / sizeof(int);
-+    if (entry.count != ELEM_NUM) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    evRange.min = entry.data.i32[0];
-+    evRange.max = entry.data.i32[1];
-+    return OK;
-+}
-+
-+int Parameters::getAeCompensationStep(camera_rational_t& evStep) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_COMPENSATION_STEP);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    evStep.numerator = entry.data.r[0].numerator;
-+    evStep.denominator = entry.data.r[0].denominator;
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAeExposureTimeRange(std::vector<camera_ae_exposure_time_range_t> & etRanges) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    const int MEMBER_COUNT = 3;
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_EXPOSURE_TIME_RANGE);
-+    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    camera_ae_exposure_time_range_t range;
-+    CLEAR(range);
-+
-+    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
-+        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
-+        range.et_range.min = entry.data.i32[i + 1];
-+        range.et_range.max = entry.data.i32[i + 2];
-+        etRanges.push_back(range);
-+    }
-+    return OK;
-+}
-+
-+int Parameters::getSupportedAeGainRange(std::vector<camera_ae_gain_range_t>& gainRanges) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    const int MEMBER_COUNT = 3;
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AE_GAIN_RANGE);
-+    if (entry.count == 0 || entry.count % MEMBER_COUNT != 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    camera_ae_gain_range_t range;
-+    CLEAR(range);
-+
-+    for (size_t i = 0; i < entry.count; i += MEMBER_COUNT) {
-+        range.scene_mode = (camera_scene_mode_t)entry.data.i32[i];
-+        // Since we use int to store float, before storing it we multiply min and max by 100,
-+        // so we need to divide 100 when giving them outside.
-+        range.gain_range.min = (float)entry.data.i32[i + 1] / 100.0;
-+        range.gain_range.max = (float)entry.data.i32[i + 2] / 100.0;
-+        gainRanges.push_back(range);
-+    }
-+    return OK;
-+}
-+
-+bool Parameters::getAeLockAvailable() const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AE_LOCK_AVAILABLE);
-+    if (entry.count != 1) {
-+        return false;
-+    }
-+
-+    return (entry.data.u8[0] == CAMERA_AE_LOCK_AVAILABLE_TRUE);
-+}
-+
-+bool Parameters::getAwbLockAvailable() const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_LOCK_AVAILABLE);
-+    if (entry.count != 1) {
-+        return false;
-+    }
-+
-+    return (entry.data.u8[0] == CAMERA_AWB_LOCK_AVAILABLE_TRUE);
-+}
-+
-+int Parameters::setExposureTimeRange(camera_range_t exposureTimeRange)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    const int MEMBER_COUNT = 2;
-+    int values[MEMBER_COUNT] = {(int)exposureTimeRange.min, (int)exposureTimeRange.max};
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_EXPOSURE_TIME_RANGE, values, MEMBER_COUNT);
-+}
-+
-+int Parameters::getExposureTimeRange(camera_range_t& exposureTimeRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    const int MEMBER_COUNT = 2;
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_EXPOSURE_TIME_RANGE);
-+    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    exposureTimeRange.min = entry.data.i32[0];
-+    exposureTimeRange.max = entry.data.i32[1];
-+    return OK;
-+}
-+
-+int Parameters::setSensitivityGainRange(camera_range_t sensitivityGainRange)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    float values[] = {sensitivityGainRange.min, sensitivityGainRange.max};
-+
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_SENSITIVITY_GAIN_RANGE, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getSensitivityGainRange(camera_range_t& sensitivityGainRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    const int MEMBER_COUNT = 2;
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_SENSITIVITY_GAIN_RANGE);
-+    if (entry.count == 0 || entry.count != MEMBER_COUNT) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    sensitivityGainRange.min = entry.data.f[0];
-+    sensitivityGainRange.max = entry.data.f[1];
-+    return OK;
-+}
-+
-+int Parameters::setAeConvergeSpeed(camera_converge_speed_t speed)
-+{
-+    uint8_t aeSpeed = speed;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED, &aeSpeed, 1);
-+}
-+
-+int Parameters::getAeConvergeSpeed(camera_converge_speed_t& speed) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    speed = (camera_converge_speed_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbConvergeSpeed(camera_converge_speed_t speed)
-+{
-+    uint8_t awbSpeed = speed;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED, &awbSpeed, 1);
-+}
-+
-+int Parameters::getAwbConvergeSpeed(camera_converge_speed_t& speed) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    speed = (camera_converge_speed_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAeConvergeSpeedMode(camera_converge_speed_mode_t mode)
-+{
-+    uint8_t speedMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_CONVERGE_SPEED_MODE, &speedMode, 1);
-+}
-+
-+int Parameters::getAeConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_CONVERGE_SPEED_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAwbConvergeSpeedMode(camera_converge_speed_mode_t mode)
-+{
-+    uint8_t speedMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AWB_CONVERGE_SPEED_MODE, &speedMode, 1);
-+}
-+
-+int Parameters::getAwbConvergeSpeedMode(camera_converge_speed_mode_t& mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AWB_CONVERGE_SPEED_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    mode = (camera_converge_speed_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setMakernoteData(const void* data, unsigned int size)
-+{
-+    CheckError(!data || size == 0, BAD_VALUE, "%s, invalid parameters", __func__);
-+    ParameterHelper::AutoWLock wl(mData);
-+
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_DATA, (uint8_t*)data, size);
-+}
-+
-+int Parameters::getMakernoteData(void* data, unsigned int* size) const
-+{
-+    CheckError(!data || !size, BAD_VALUE, "%s, invalid parameters", __func__);
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_DATA);
-+    if (entry.count > 0) {
-+        MEMCPY_S(data, *size, entry.data.u8, entry.count);
-+        *size = entry.count;
-+    } else {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::setCustomAicParam(const void* data, unsigned int length)
-+{
-+    CheckError(!data, BAD_VALUE, "%s, invalid parameters", __func__);
-+    ParameterHelper::AutoWLock wl(mData);
-+
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_CUSTOM_AIC_PARAM, (uint8_t*)data, length);
-+}
-+
-+int Parameters::getCustomAicParam(void* data, unsigned int* length) const
-+{
-+    CheckError(!data || !length, BAD_VALUE, "%s, invalid parameters", __func__);
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_CUSTOM_AIC_PARAM);
-+    if (entry.count > 0) {
-+        MEMCPY_S(data, *length, entry.data.u8, entry.count);
-+        *length = entry.count;
-+    } else {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    return OK;
-+}
-+
-+int Parameters::setMakernoteMode(camera_makernote_mode_t mode)
-+{
-+    uint8_t mknMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MAKERNOTE_MODE, &mknMode, 1);
-+}
-+
-+int Parameters::getMakernoteMode(camera_makernote_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MAKERNOTE_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    mode = (camera_makernote_mode_t)entry.data.u8[0];
-+
-+    return OK;
-+}
-+
-+int Parameters::setDigitalZoomRatio(float ratio)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_DIGITAL_ZOOM_RATIO, &ratio, 1);
-+}
-+
-+int Parameters::getDigitalZoomRatio(float& ratio) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_DIGITAL_ZOOM_RATIO);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    ratio = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setLdcMode(camera_ldc_mode_t mode)
-+{
-+    uint8_t ldcMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_LDC_MODE, &ldcMode, 1);
-+}
-+
-+int Parameters::getLdcMode(camera_ldc_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_LDC_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_ldc_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setRscMode(camera_rsc_mode_t mode)
-+{
-+    uint8_t rscMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RSC_MODE, &rscMode, 1);
-+}
-+
-+int Parameters::getRscMode(camera_rsc_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RSC_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_rsc_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setFlipMode(camera_flip_mode_t mode)
-+{
-+    uint8_t flipMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FLIP_MODE, &flipMode, 1);
-+}
-+
-+int Parameters::getFlipMode(camera_flip_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FLIP_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_flip_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setMonoDsMode(camera_mono_downscale_mode_t mode)
-+{
-+    uint8_t monoDsMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_MONO_DOWNSCALE, &monoDsMode, 1);
-+}
-+
-+int Parameters::getMonoDsMode(camera_mono_downscale_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_MONO_DOWNSCALE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_mono_downscale_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setRun3ACadence(int cadence)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_RUN3_A_CADENCE, &cadence, 1);
-+}
-+
-+int Parameters::getRun3ACadence(int &cadence) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_RUN3_A_CADENCE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    cadence = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t mode)
-+{
-+    uint8_t dewarpingMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_FISHEYE_DEWARPING_MODE, &dewarpingMode, 1);
-+}
-+
-+int Parameters::getFisheyeDewarpingMode(camera_fisheye_dewarping_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_FISHEYE_DEWARPING_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_fisheye_dewarping_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAeDistributionPriority(camera_ae_distribution_priority_t priority)
-+{
-+    uint8_t distributionPriority = priority;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY, &distributionPriority, 1);
-+}
-+
-+int Parameters::getAeDistributionPriority(camera_ae_distribution_priority_t& priority) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    priority = (camera_ae_distribution_priority_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setYuvColorRangeMode(camera_yuv_color_range_mode_t colorRange)
-+{
-+    uint8_t mode = colorRange;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(INTEL_CONTROL_YUV_COLOR_RANGE, &mode, 1);
-+}
-+
-+int Parameters::getYuvColorRangeMode(camera_yuv_color_range_mode_t& colorRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_CONTROL_YUV_COLOR_RANGE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    colorRange = (camera_yuv_color_range_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegQuality(uint8_t quality)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_QUALITY, &quality, 1);
-+}
-+
-+int Parameters::getJpegQuality(uint8_t *quality) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_QUALITY);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    *quality = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegThumbnailQuality(uint8_t quality)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_QUALITY, &quality, 1);
-+}
-+
-+int Parameters::getJpegThumbnailQuality(uint8_t *quality) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_QUALITY);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    *quality = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegThumbnailSize(const camera_resolution_t& res)
-+{
-+    int size[2] = {res.width, res.height};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_THUMBNAIL_SIZE, size, 2);
-+}
-+
-+int Parameters::getJpegThumbnailSize(camera_resolution_t& res) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_THUMBNAIL_SIZE);
-+    if (entry.count != 2) {
-+        return NAME_NOT_FOUND;
-+    }
-+    res.width  = entry.data.i32[0];
-+    res.height = entry.data.i32[1];
-+    return OK;
-+}
-+
-+int Parameters::setJpegRotation(int rotation)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_ORIENTATION, &rotation, 1);
-+}
-+
-+int Parameters::getJpegRotation(int &rotation) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_ORIENTATION);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    rotation = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegGpsCoordinates(const double *coordinates)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_COORDINATES, coordinates, 3);
-+}
-+
-+int Parameters::getJpegGpsLatitude(double &latitude) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
-+    if (entry.count != 3) {
-+        return NAME_NOT_FOUND;
-+    }
-+    latitude = entry.data.d[0];
-+    return OK;
-+}
-+
-+int Parameters::getJpegGpsLongitude(double &longitude) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
-+    if (entry.count != 3) {
-+        return NAME_NOT_FOUND;
-+    }
-+    longitude = entry.data.d[1];
-+    return OK;
-+}
-+
-+int Parameters::getJpegGpsAltitude(double &altitude) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_COORDINATES);
-+    if (entry.count != 3) {
-+        return NAME_NOT_FOUND;
-+    }
-+    altitude = entry.data.d[2];
-+    return OK;
-+}
-+
-+int Parameters::setJpegGpsTimeStamp(int64_t  timestamp)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_TIMESTAMP, &timestamp, 1);
-+}
-+
-+int Parameters::getJpegGpsTimeStamp(int64_t &timestamp) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_TIMESTAMP);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    timestamp = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegGpsProcessingMethod(int processMethod)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, &processMethod, 1);
-+}
-+
-+int Parameters::getJpegGpsProcessingMethod(int &processMethod) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    processMethod = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setJpegGpsProcessingMethod(const char* processMethod)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_JPEG_GPS_PROCESSING_METHOD, (const uint8_t*)processMethod, strlen(processMethod) + 1);
-+}
-+
-+int Parameters::getJpegGpsProcessingMethod(int size, char* processMethod) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_JPEG_GPS_PROCESSING_METHOD);
-+    if (entry.count <= 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+    MEMCPY_S(processMethod, size, entry.data.u8, entry.count);
-+    return OK;
-+}
-+
-+int Parameters::setImageEffect(camera_effect_mode_t  effect)
-+{
-+    uint8_t effectmode = effect;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_EFFECT_MODE, &effectmode, 1);
-+}
-+
-+int Parameters::getImageEffect(camera_effect_mode_t &effect) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_EFFECT_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    effect = (camera_effect_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setVideoStabilizationMode(camera_video_stabilization_mode_t mode)
-+{
-+    uint8_t dvsMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_VIDEO_STABILIZATION_MODE, &dvsMode, 1);
-+}
-+
-+int Parameters::getVideoStabilizationMode(camera_video_stabilization_mode_t &mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_CONTROL_VIDEO_STABILIZATION_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_video_stabilization_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::getFocalLength(float &focal) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCAL_LENGTH);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    focal = (float)entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setFocalLength(float focal)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCAL_LENGTH, &focal, 1);
-+}
-+
-+int Parameters::getAperture(float &aperture) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_APERTURE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    aperture = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setAperture(float aperture)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_APERTURE, &aperture, 1);
-+}
-+
-+int Parameters::getFocusDistance(float &distance) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_DISTANCE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    distance = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::setFocusDistance(float distance) {
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_DISTANCE, &distance, 1);
-+}
-+
-+int Parameters::setFocusRange(const camera_range_t &focusRange)
-+{
-+    float range[] = {focusRange.min, focusRange.max};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_FOCUS_RANGE,
-+                                                      range, ARRAY_SIZE(range));
-+}
-+
-+int Parameters::getFocusRange(camera_range_t& focusRange) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_FOCUS_RANGE);
-+    if (entry.count != (sizeof(camera_range_t) / sizeof(float))) {
-+        return NAME_NOT_FOUND;
-+    }
-+    focusRange.min = entry.data.f[0];
-+    focusRange.max = entry.data.f[1];
-+    return OK;
-+}
-+
-+int Parameters::setAfMode(camera_af_mode_t afMode)
-+{
-+    uint8_t mode = afMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_MODE, &mode, 1);
-+}
-+
-+int Parameters::getAfMode(camera_af_mode_t& afMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    afMode = (camera_af_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAfTrigger(camera_af_trigger_t afTrigger)
-+{
-+    uint8_t trigger = afTrigger;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_TRIGGER, &trigger, 1);
-+}
-+
-+int Parameters::getAfTrigger(camera_af_trigger_t& afTrigger) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_TRIGGER);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    afTrigger = (camera_af_trigger_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setAfRegions(camera_window_list_t afRegions)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return setRegions(ParameterHelper::getMetadata(mData), afRegions, CAMERA_AF_REGIONS);
-+}
-+
-+int Parameters::getAfRegions(camera_window_list_t& afRegions) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    return getRegions(ParameterHelper::getMetadataEntry(mData, CAMERA_AF_REGIONS), afRegions);
-+}
-+
-+int Parameters::setAfState(camera_af_state_t afState)
-+{
-+    uint8_t state = afState;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_AF_STATE, &state, 1);
-+}
-+
-+int Parameters::getAfState(camera_af_state_t& afState) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_AF_STATE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    afState = (camera_af_state_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setLensState(bool lensMoving)
-+{
-+    uint8_t state = (lensMoving) ? 1 : 0;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_LENS_STATE, &state, 1);
-+}
-+
-+int Parameters::getLensState(bool& lensMoving) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_STATE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    lensMoving = (entry.data.u8[0] > 0);
-+    return OK;
-+}
-+
-+int Parameters::getSensorMountType(camera_mount_type_t& sensorMountType) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_SENSOR_MOUNT_TYPE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    sensorMountType = (camera_mount_type_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+// User can set envrionment and then call api to update the debug level.
-+int Parameters::updateDebugLevel()
-+{
-+    Log::setDebugLevel();
-+    CameraDump::setDumpLevel();
-+    return OK;
-+}
-+
-+int Parameters::setTestPatternMode(camera_test_pattern_mode_t mode)
-+{
-+    int32_t testPatterMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_TEST_PATTERN_MODE, &testPatterMode, 1);
-+}
-+
-+int Parameters::getTestPatternMode(camera_test_pattern_mode_t& mode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_TEST_PATTERN_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_test_pattern_mode_t)entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setCropRegion(camera_crop_region_t cropRegion)
-+{
-+    int values[] = {cropRegion.flag, cropRegion.x, cropRegion.y};
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_SCALER_CROP_REGION, values, ARRAY_SIZE(values));
-+}
-+
-+int Parameters::getCropRegion(camera_crop_region_t& cropRegion) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SCALER_CROP_REGION);
-+    if (entry.count <= 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+    cropRegion.flag = entry.data.i32[0];
-+    cropRegion.x = entry.data.i32[1];
-+    cropRegion.y = entry.data.i32[2];
-+    return OK;
-+}
-+
-+int Parameters::setControlSceneMode(uint8_t sceneModeValue)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_CONTROL_SCENE_MODE, &sceneModeValue, 1);
-+}
-+
-+int Parameters::setFaceDetectMode(uint8_t faceDetectMode)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1);
-+}
-+
-+int Parameters::getFaceDetectMode(uint8_t& faceDetectMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_FACE_DETECT_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    faceDetectMode = entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setFaceIds(int *faceIds, int faceNum)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_FACE_IDS, faceIds, faceNum);
-+}
-+
-+int Parameters::getSensorActiveArraySize(camera_coordinate_system_t& arraySize) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
-+    if (entry.count <= 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+    arraySize.left = entry.data.i32[0];
-+    arraySize.top = entry.data.i32[1];
-+    arraySize.right = arraySize.left + entry.data.i32[2]; //width
-+    arraySize.bottom = arraySize.top + entry.data.i32[3]; //height
-+    return OK;
-+}
-+
-+int Parameters::setShadingMode(camera_shading_mode_t shadingMode)
-+{
-+    uint8_t mode = shadingMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_SHADING_MODE, &mode, 1);
-+}
-+
-+int Parameters::getShadingMode(camera_shading_mode_t& shadingMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SHADING_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    shadingMode = (camera_shading_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setLensShadingMapMode(camera_lens_shading_map_mode_type_t lensShadingMapMode)
-+{
-+    uint8_t mode = lensShadingMapMode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,
-+                                                      &mode, 1);
-+}
-+
-+int Parameters::getLensShadingMapMode(
-+                                  camera_lens_shading_map_mode_type_t &lensShadingMapMode) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    lensShadingMapMode = (camera_lens_shading_map_mode_type_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setLensShadingMap(const float *lensShadingMap, size_t lensShadingMapSize)
-+{
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_STATISTICS_LENS_SHADING_MAP,
-+                                                      lensShadingMap, lensShadingMapSize);
-+}
-+
-+int Parameters::getLensShadingMap(float *lensShadingMap, size_t &lensShadingMapSize) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_STATISTICS_LENS_SHADING_MAP);
-+
-+    camera_coordinate_t shadingMapSize;
-+    getLensInfoShadingMapSize(shadingMapSize);
-+    const size_t lsmSize = shadingMapSize.x * shadingMapSize.y * 4;
-+    if (entry.count < lsmSize) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    for (size_t i = 0; i < lsmSize; i++) {
-+        lensShadingMap[i] = entry.data.f[i];
-+    }
-+
-+    lensShadingMapSize = lsmSize;
-+    return OK;
-+}
-+
-+int Parameters::getLensInfoShadingMapSize(camera_coordinate_t &shadingMapSize) const
-+{
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_SHADING_MAP_SIZE);
-+    if (entry.count <= 0) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    shadingMapSize.x = entry.data.i32[0];  // width
-+    shadingMapSize.y = entry.data.i32[1];  // height
-+    return OK;
-+}
-+
-+int Parameters::setTonemapMode(camera_tonemap_mode_t mode) {
-+    uint8_t tMode = mode;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_MODE, &tMode, 1);
-+}
-+
-+int Parameters::getTonemapMode(camera_tonemap_mode_t& mode) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MODE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    mode = (camera_tonemap_mode_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::getSupportedTonemapMode(vector<camera_tonemap_mode_t>& tonemapModes) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES);
-+    for (size_t i = 0; i < entry.count; i++) {
-+        tonemapModes.push_back((camera_tonemap_mode_t)entry.data.u8[i]);
-+    }
-+    return OK;
-+}
-+
-+int Parameters::setTonemapPresetCurve(camera_tonemap_preset_curve_t type) {
-+    uint8_t cType = type;
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_PRESET_CURVE, &cType, 1);
-+}
-+
-+int Parameters::getTonemapPresetCurve(camera_tonemap_preset_curve_t& type) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_PRESET_CURVE);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    type = (camera_tonemap_preset_curve_t)entry.data.u8[0];
-+    return OK;
-+}
-+
-+int Parameters::setTonemapGamma(float gamma) {
-+    ParameterHelper::AutoWLock wl(mData);
-+    return ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_GAMMA, &gamma, 1);
-+}
-+
-+int Parameters::getTonemapGamma(float& gamma) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_GAMMA);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    gamma = entry.data.f[0];
-+    return OK;
-+}
-+
-+int Parameters::getTonemapMaxCurvePoints(int32_t& number) const {
-+    ParameterHelper::AutoRLock rl(mData);
-+
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_MAX_CURVE_POINTS);
-+    if (entry.count != 1) {
-+        return NAME_NOT_FOUND;
-+    }
-+    number = entry.data.i32[0];
-+    return OK;
-+}
-+
-+int Parameters::setTonemapCurves(const camera_tonemap_curves_t& curves) {
-+    ParameterHelper::AutoWLock wl(mData);
-+    int ret = ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_RED,
-+                                                         curves.rCurve, curves.rSize);
-+    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_BLUE,
-+                                                      curves.bCurve, curves.bSize);
-+    ret |= ParameterHelper::getMetadata(mData).update(CAMERA_TONEMAP_CURVE_GREEN,
-+                                                      curves.gCurve, curves.gSize);
-+    return ret;
-+}
-+
-+int Parameters::getTonemapCurves(camera_tonemap_curves_t& curves) const {
-+    curves.rSize = 0;
-+    curves.bSize = 0;
-+    curves.gSize = 0;
-+
-+    ParameterHelper::AutoRLock rl(mData);
-+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_RED);
-+    if (entry.count > 0) {
-+        curves.rSize = entry.count;
-+        curves.rCurve = entry.data.f;
-+    }
-+    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_BLUE);
-+    if (entry.count > 0) {
-+        curves.bSize = entry.count;
-+        curves.bCurve = entry.data.f;
-+    }
-+    entry = ParameterHelper::getMetadataEntry(mData, CAMERA_TONEMAP_CURVE_GREEN);
-+    if (entry.count > 0) {
-+        curves.gSize = entry.count;
-+        curves.gCurve = entry.data.f;
-+    }
-+    return (curves.rSize && curves.bSize && curves.gSize) ? OK : NAME_NOT_FOUND;
-+}
-+
-+} // end of namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
-new file mode 100644
-index 000000000000..52ffd86ded71
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.cpp
-@@ -0,0 +1,976 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "camera_metadata"
-+
-+#include <inttypes.h>
-+#include "icamera_metadata_base.h"
-+#include "iutils/Utils.h"
-+#include <assert.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+
-+// TODO need to find out the correct print function
-+#include <stdio.h>
-+#define ALOGE printf
-+
-+#define OK         0
-+#define ERROR      1
-+#define NOT_FOUND (-ENOENT)
-+
-+/**
-+ * A single metadata entry, storing an array of values of a given type. If the
-+ * array is no larger than 4 bytes in size, it is stored in the data.value[]
-+ * array; otherwise, it can found in the parent's data array at index
-+ * data.offset.
-+ */
-+#define ENTRY_ALIGNMENT ((size_t) 4)
-+typedef struct camera_metadata_buffer_entry {
-+    uint32_t tag;
-+    uint32_t count;
-+    union {
-+        uint32_t offset;
-+        uint8_t  value[4];
-+    } data;
-+    uint8_t  type;
-+    uint8_t  reserved[3];
-+} camera_metadata_buffer_entry_t;
-+
-+typedef uint32_t metadata_uptrdiff_t;
-+typedef uint32_t metadata_size_t;
-+
-+/**
-+ * A packet of metadata. This is a list of entries, each of which may point to
-+ * its values stored at an offset in data.
-+ *
-+ * It is assumed by the utility functions that the memory layout of the packet
-+ * is as follows:
-+ *
-+ *   |-----------------------------------------------|
-+ *   | icamera_metadata_t                             |
-+ *   |                                               |
-+ *   |-----------------------------------------------|
-+ *   | reserved for future expansion                 |
-+ *   |-----------------------------------------------|
-+ *   | camera_metadata_buffer_entry_t #0             |
-+ *   |-----------------------------------------------|
-+ *   | ....                                          |
-+ *   |-----------------------------------------------|
-+ *   | camera_metadata_buffer_entry_t #entry_count-1 |
-+ *   |-----------------------------------------------|
-+ *   | free space for                                |
-+ *   | (entry_capacity-entry_count) entries          |
-+ *   |-----------------------------------------------|
-+ *   | start of camera_metadata.data                 |
-+ *   |                                               |
-+ *   |-----------------------------------------------|
-+ *   | free space for                                |
-+ *   | (data_capacity-data_count) bytes              |
-+ *   |-----------------------------------------------|
-+ *
-+ * With the total length of the whole packet being camera_metadata.size bytes.
-+ *
-+ * In short, the entries and data are contiguous in memory after the metadata
-+ * header.
-+ */
-+#define METADATA_ALIGNMENT ((size_t) 4)
-+struct icamera_metadata {
-+    metadata_size_t          size;
-+    uint32_t                 version;
-+    uint32_t                 flags;
-+    metadata_size_t          entry_count;
-+    metadata_size_t          entry_capacity;
-+    metadata_uptrdiff_t      entries_start; // Offset from camera_metadata
-+    metadata_size_t          data_count;
-+    metadata_size_t          data_capacity;
-+    metadata_uptrdiff_t      data_start; // Offset from camera_metadata
-+    uint8_t                  reserved[];
-+};
-+
-+/**
-+ * A datum of metadata. This corresponds to icamera_metadata_entry_t::data
-+ * with the difference that each element is not a pointer. We need to have a
-+ * non-pointer type description in order to figure out the largest alignment
-+ * requirement for data (DATA_ALIGNMENT).
-+ */
-+#define DATA_ALIGNMENT ((size_t) 8)
-+typedef union camera_metadata_data {
-+    uint8_t u8;
-+    int32_t i32;
-+    float   f;
-+    int64_t i64;
-+    double  d;
-+    icamera_metadata_rational_t r;
-+} camera_metadata_data_t;
-+
-+/**
-+ * The preferred alignment of a packet of camera metadata. In general,
-+ * this is the lowest common multiple of the constituents of a metadata
-+ * package, i.e, of DATA_ALIGNMENT and ENTRY_ALIGNMENT.
-+ */
-+#define MAX_ALIGNMENT(A, B) (((A) > (B)) ? (A) : (B))
-+#define METADATA_PACKET_ALIGNMENT \
-+    MAX_ALIGNMENT(MAX_ALIGNMENT(DATA_ALIGNMENT, METADATA_ALIGNMENT), ENTRY_ALIGNMENT);
-+
-+/** Versioning information */
-+#define CURRENT_METADATA_VERSION 1
-+
-+/** Flag definitions */
-+#define FLAG_SORTED 0x00000001
-+
-+/** Tag information */
-+
-+typedef struct tag_info {
-+    const char *tag_name;
-+    uint8_t     tag_type;
-+} tag_info_t;
-+
-+#include "icamera_metadata_tag_info.c"
-+
-+const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES] = {
-+    sizeof(uint8_t),                    // ICAMERA_TYPE_BYTE
-+    sizeof(int32_t),                    // ICAMERA_TYPE_INT32
-+    sizeof(float),                      // ICAMERA_TYPE_FLOAT
-+    sizeof(int64_t),                    // ICAMERA_TYPE_INT64
-+    sizeof(double),                     // ICAMERA_TYPE_DOUBLE
-+    sizeof(icamera_metadata_rational_t) // ICAMERA_TYPE_RATIONAL
-+};
-+
-+const char *icamera_metadata_type_names[ICAMERA_NUM_TYPES] = {
-+    "byte",                             // ICAMERA_TYPE_BYTE
-+    "int32",                            // ICAMERA_TYPE_INT32
-+    "float",                            // ICAMERA_TYPE_FLOAT
-+    "int64",                            // ICAMERA_TYPE_INT64
-+    "double",                           // ICAMERA_TYPE_DOUBLE
-+    "rational"                          // ICAMERA_TYPE_RATIONAL
-+};
-+
-+static camera_metadata_buffer_entry_t *get_entries(
-+        const icamera_metadata_t *metadata) {
-+    return (camera_metadata_buffer_entry_t*)
-+            ((uint8_t*)metadata + metadata->entries_start);
-+}
-+
-+static uint8_t *get_data(const icamera_metadata_t *metadata) {
-+    return (uint8_t*)metadata + metadata->data_start;
-+}
-+
-+size_t get_icamera_metadata_alignment() {
-+    return METADATA_PACKET_ALIGNMENT;
-+}
-+
-+icamera_metadata_t *allocate_copy_icamera_metadata_checked(
-+        const icamera_metadata_t *src,
-+        size_t src_size) {
-+
-+    if (src == NULL) {
-+        return NULL;
-+    }
-+
-+    void *buffer = malloc(src_size);
-+    MEMCPY_S(buffer, src_size, src, src_size);
-+
-+    icamera_metadata_t *metadata = (icamera_metadata_t*) buffer;
-+    if (validate_icamera_metadata_structure(metadata, &src_size) != OK) {
-+        free(buffer);
-+        return NULL;
-+    }
-+
-+    return metadata;
-+}
-+
-+icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
-+                                              size_t data_capacity) {
-+
-+    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
-+                                                          data_capacity);
-+    void *buffer = malloc(memory_needed);
-+    return place_icamera_metadata(buffer, memory_needed,
-+                                 entry_capacity,
-+                                 data_capacity);
-+}
-+
-+icamera_metadata_t *place_icamera_metadata(void *dst,
-+                                           size_t dst_size,
-+                                           size_t entry_capacity,
-+                                           size_t data_capacity) {
-+    if (dst == NULL) return NULL;
-+
-+    size_t memory_needed = calculate_icamera_metadata_size(entry_capacity,
-+                                                          data_capacity);
-+    if (memory_needed > dst_size) return NULL;
-+
-+    icamera_metadata_t *metadata = (icamera_metadata_t*)dst;
-+    metadata->version = CURRENT_METADATA_VERSION;
-+    metadata->flags = 0;
-+    metadata->entry_count = 0;
-+    metadata->entry_capacity = entry_capacity;
-+    metadata->entries_start =
-+            ALIGN_TO(sizeof(icamera_metadata_t), ENTRY_ALIGNMENT);
-+    metadata->data_count = 0;
-+    metadata->data_capacity = data_capacity;
-+    metadata->size = memory_needed;
-+    size_t data_unaligned = (uint8_t*)(get_entries(metadata) +
-+            metadata->entry_capacity) - (uint8_t*)metadata;
-+    metadata->data_start = ALIGN_TO(data_unaligned, DATA_ALIGNMENT);
-+
-+    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
-+    return metadata;
-+}
-+void free_icamera_metadata(icamera_metadata_t *metadata) {
-+    free(metadata);
-+}
-+
-+size_t calculate_icamera_metadata_size(size_t entry_count,
-+                                       size_t data_count) {
-+    size_t memory_needed = sizeof(icamera_metadata_t);
-+    // Start entry list at aligned boundary
-+    memory_needed = ALIGN_TO(memory_needed, ENTRY_ALIGNMENT);
-+    memory_needed += sizeof(camera_metadata_buffer_entry_t[entry_count]);
-+    // Start buffer list at aligned boundary
-+    memory_needed = ALIGN_TO(memory_needed, DATA_ALIGNMENT);
-+    memory_needed += sizeof(uint8_t[data_count]);
-+    return memory_needed;
-+}
-+
-+size_t get_icamera_metadata_size(const icamera_metadata_t *metadata) {
-+    if (metadata == NULL) return ERROR;
-+
-+    return metadata->size;
-+}
-+
-+size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata) {
-+    if (metadata == NULL) return ERROR;
-+
-+    return calculate_icamera_metadata_size(metadata->entry_count,
-+                                          metadata->data_count);
-+}
-+
-+size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata) {
-+    return metadata->entry_count;
-+}
-+
-+size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata) {
-+    return metadata->entry_capacity;
-+}
-+
-+size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata) {
-+    return metadata->data_count;
-+}
-+
-+size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata) {
-+    return metadata->data_capacity;
-+}
-+
-+icamera_metadata_t* copy_icamera_metadata(void *dst, size_t dst_size,
-+        const icamera_metadata_t *src) {
-+    size_t memory_needed = get_icamera_metadata_compact_size(src);
-+
-+    if (dst == NULL) return NULL;
-+    if (dst_size < memory_needed) return NULL;
-+
-+    icamera_metadata_t *metadata =
-+        place_icamera_metadata(dst, dst_size, src->entry_count, src->data_count);
-+
-+    if (metadata == NULL) {
-+        ALOGE("%s: metadata is null!", __func__);
-+        return NULL;
-+    }
-+    metadata->flags = src->flags;
-+    metadata->entry_count = src->entry_count;
-+    metadata->data_count = src->data_count;
-+
-+    MEMCPY_S(get_entries(metadata),sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]),
-+             get_entries(src), sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]));
-+    MEMCPY_S(get_data(metadata), sizeof(uint8_t[metadata->data_count]),
-+             get_data(src), sizeof(uint8_t[metadata->data_count]));
-+
-+    assert(validate_icamera_metadata_structure(metadata, NULL) == OK);
-+    return metadata;
-+}
-+
-+int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
-+                                        const size_t *expected_size) {
-+
-+    if (metadata == NULL) {
-+        ALOGE("%s: metadata is null!", __func__);
-+        return ERROR;
-+    }
-+
-+    // Check that the metadata pointer is well-aligned first.
-+    {
-+        static const struct {
-+            const char *name;
-+            size_t alignment;
-+        } alignments[] = {
-+            {
-+                .name = "icamera_metadata",
-+                .alignment = METADATA_ALIGNMENT
-+            },
-+            {
-+                .name = "camera_metadata_buffer_entry",
-+                .alignment = ENTRY_ALIGNMENT
-+            },
-+            {
-+                .name = "camera_metadata_data",
-+                .alignment = DATA_ALIGNMENT
-+            },
-+        };
-+
-+        size_t i = 0;
-+        for (i = 0; i < sizeof(alignments)/sizeof(alignments[0]); ++i) {
-+            uintptr_t aligned_ptr = ALIGN_TO(metadata, alignments[i].alignment);
-+
-+            if ((uintptr_t)metadata != aligned_ptr) {
-+                ALOGE("%s: Metadata pointer is not aligned (actual %p, "
-+                      "expected %p) to type %s",
-+                      __func__, metadata,
-+                      (void*)aligned_ptr, alignments[i].name);
-+                return ERROR;
-+            }
-+        }
-+    }
-+
-+    /**
-+     * Check that the metadata contents are correct
-+     */
-+
-+    if (expected_size != NULL && metadata->size > *expected_size) {
-+        ALOGE("%s: Metadata size (%" PRIu32 ") should be <= expected size (%zu)",
-+              __func__, metadata->size, *expected_size);
-+        return ERROR;
-+    }
-+
-+    if (metadata->entry_count > metadata->entry_capacity) {
-+        ALOGE("%s: Entry count (%" PRIu32 ") should be <= entry capacity "
-+              "(%" PRIu32 ")",
-+              __func__, metadata->entry_count, metadata->entry_capacity);
-+        return ERROR;
-+    }
-+
-+    const metadata_uptrdiff_t entries_end =
-+        metadata->entries_start + metadata->entry_capacity;
-+    if (entries_end < metadata->entries_start || // overflow check
-+        entries_end > metadata->data_start) {
-+
-+        ALOGE("%s: Entry start + capacity (%" PRIu32 ") should be <= data start "
-+              "(%" PRIu32 ")",
-+               __func__,
-+              (metadata->entries_start + metadata->entry_capacity),
-+              metadata->data_start);
-+        return ERROR;
-+    }
-+
-+    const metadata_uptrdiff_t data_end =
-+        metadata->data_start + metadata->data_capacity;
-+    if (data_end < metadata->data_start || // overflow check
-+        data_end > metadata->size) {
-+
-+        ALOGE("%s: Data start + capacity (%" PRIu32 ") should be <= total size "
-+              "(%" PRIu32 ")",
-+               __func__,
-+              (metadata->data_start + metadata->data_capacity),
-+              metadata->size);
-+        return ERROR;
-+    }
-+
-+    // Validate each entry
-+    const metadata_size_t entry_count = metadata->entry_count;
-+    camera_metadata_buffer_entry_t *entries = get_entries(metadata);
-+
-+    size_t i = 0;
-+    for (i = 0; i < entry_count; ++i) {
-+
-+        if ((uintptr_t)&entries[i] != ALIGN_TO(&entries[i], ENTRY_ALIGNMENT)) {
-+            ALOGE("%s: Entry index %zu had bad alignment (address %p),"
-+                  " expected alignment %zu",
-+                  __func__, i, &entries[i], ENTRY_ALIGNMENT);
-+            return ERROR;
-+        }
-+
-+        camera_metadata_buffer_entry_t entry = entries[i];
-+
-+        if (entry.type >= ICAMERA_NUM_TYPES) {
-+            ALOGE("%s: Entry index %zu had a bad type %d",
-+                  __func__, i, entry.type);
-+            return ERROR;
-+        }
-+
-+        int tag_type = get_icamera_metadata_tag_type(entry.tag);
-+        if (tag_type != (int)entry.type) {
-+            ALOGE("%s: Entry index %zu had tag type %d, but the type was %d",
-+                  __func__, i, tag_type, entry.type);
-+            return ERROR;
-+        }
-+
-+        size_t data_size =
-+                calculate_icamera_metadata_entry_data_size(entry.type,
-+                                                          entry.count);
-+
-+        if (data_size != 0) {
-+            camera_metadata_data_t *data =
-+                    (camera_metadata_data_t*) (get_data(metadata) +
-+                                               entry.data.offset);
-+
-+            if ((uintptr_t)data != ALIGN_TO(data, DATA_ALIGNMENT)) {
-+                ALOGE("%s: Entry index %zu had bad data alignment (address %p),"
-+                      " expected align %zu, (tag name %s, data size %zu)",
-+                      __func__, i, data, DATA_ALIGNMENT,
-+                      get_icamera_metadata_tag_name(entry.tag) ?: "unknown",
-+                      data_size);
-+                return ERROR;
-+            }
-+
-+            size_t data_entry_end = entry.data.offset + data_size;
-+            if (data_entry_end < entry.data.offset || // overflow check
-+                data_entry_end > metadata->data_capacity) {
-+
-+                ALOGE("%s: Entry index %zu data ends (%zu) beyond the capacity "
-+                      "%" PRIu32, __func__, i, data_entry_end,
-+                      metadata->data_capacity);
-+                return ERROR;
-+            }
-+
-+        } else if (entry.count == 0) {
-+            if (entry.data.offset != 0) {
-+                ALOGE("%s: Entry index %zu had 0 items, but offset was non-0 "
-+                     "(%" PRIu32 "), tag name: %s", __func__, i, entry.data.offset,
-+                        get_icamera_metadata_tag_name(entry.tag) ?: "unknown");
-+                return ERROR;
-+            }
-+        } // else data stored inline, so we look at value which can be anything.
-+    }
-+
-+    return OK;
-+}
-+
-+int append_icamera_metadata(icamera_metadata_t *dst,
-+        const icamera_metadata_t *src) {
-+    if (dst == NULL || src == NULL ) return ERROR;
-+
-+    if (dst->entry_capacity < src->entry_count + dst->entry_count) return ERROR;
-+    if (dst->data_capacity < src->data_count + dst->data_count) return ERROR;
-+
-+    if (dst->entry_capacity - dst->entry_count < src->entry_count) {
-+        ALOGE("%s: Dst available buffer size for entry is smaller than src needed.", __func__);
-+    }
-+    MEMCPY_S(get_entries(dst) + dst->entry_count,
-+             sizeof(camera_metadata_buffer_entry_t) * (dst->entry_capacity - dst->entry_count),
-+             get_entries(src), sizeof(camera_metadata_buffer_entry_t[src->entry_count]));
-+
-+    if (dst->data_capacity - dst->data_count < src->data_count) {
-+        ALOGE("%s: Dst available buffer size for data is smaller than src needed.", __func__);
-+    }
-+    MEMCPY_S(get_data(dst) + dst->data_count, sizeof(uint8_t[dst->data_capacity - dst->data_count]),
-+             get_data(src), sizeof(uint8_t[src->data_count]));
-+    if (dst->data_count != 0) {
-+        camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
-+        size_t i = 0;
-+        for (i = 0; i < src->entry_count; i++, entry++) {
-+            if ( calculate_icamera_metadata_entry_data_size(entry->type,
-+                            entry->count) > 0 ) {
-+                entry->data.offset += dst->data_count;
-+            }
-+        }
-+    }
-+    if (dst->entry_count == 0) {
-+        // Appending onto empty buffer, keep sorted state
-+        dst->flags |= src->flags & FLAG_SORTED;
-+    } else if (src->entry_count != 0) {
-+        // Both src, dst are nonempty, cannot assume sort remains
-+        dst->flags &= ~FLAG_SORTED;
-+    } else {
-+        // Src is empty, keep dst sorted state
-+    }
-+    dst->entry_count += src->entry_count;
-+    dst->data_count += src->data_count;
-+
-+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
-+    return OK;
-+}
-+
-+icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src) {
-+    if (src == NULL) return NULL;
-+    icamera_metadata_t *clone = allocate_icamera_metadata(
-+        get_icamera_metadata_entry_count(src),
-+        get_icamera_metadata_data_count(src));
-+    if (clone != NULL) {
-+        int res = append_icamera_metadata(clone, src);
-+        if (res != OK) {
-+            free_icamera_metadata(clone);
-+            clone = NULL;
-+        }
-+    }
-+    assert(validate_icamera_metadata_structure(clone, NULL) == OK);
-+    return clone;
-+}
-+
-+size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
-+        size_t data_count) {
-+    if (type >= ICAMERA_NUM_TYPES) return 0;
-+    size_t data_bytes = data_count *
-+            icamera_metadata_type_size[type];
-+    return data_bytes <= 4 ? 0 : ALIGN_TO(data_bytes, DATA_ALIGNMENT);
-+}
-+
-+static int add_camera_metadata_entry_raw(icamera_metadata_t *dst,
-+        uint32_t tag,
-+        uint8_t  type,
-+        const void *data,
-+        size_t data_count) {
-+
-+    if (dst == NULL) return ERROR;
-+    if (dst->entry_count == dst->entry_capacity) return ERROR;
-+    if (data == NULL) return ERROR;
-+
-+    size_t data_bytes =
-+            calculate_icamera_metadata_entry_data_size(type, data_count);
-+    if (data_bytes + dst->data_count > dst->data_capacity) return ERROR;
-+
-+    if (type >= ICAMERA_NUM_TYPES) {
-+        ALOGE("%s: Bad type %d", __func__, type);
-+        return ERROR;
-+    }
-+    size_t data_payload_bytes =
-+            data_count * icamera_metadata_type_size[type];
-+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;
-+    memset(entry, 0, sizeof(camera_metadata_buffer_entry_t));
-+    entry->tag = tag;
-+    entry->type = type;
-+    entry->count = data_count;
-+
-+    if (data_bytes == 0) {
-+        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
-+    } else {
-+        entry->data.offset = dst->data_count;
-+        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
-+        dst->data_count += data_bytes;
-+    }
-+    dst->entry_count++;
-+    dst->flags &= ~FLAG_SORTED;
-+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
-+    return OK;
-+}
-+
-+int add_icamera_metadata_entry(icamera_metadata_t *dst,
-+        uint32_t tag,
-+        const void *data,
-+        size_t data_count) {
-+
-+    int type = get_icamera_metadata_tag_type(tag);
-+    if (type == -1) {
-+        ALOGE("%s: Unknown tag %04x.", __func__, tag);
-+        return ERROR;
-+    }
-+
-+    return add_camera_metadata_entry_raw(dst,
-+            tag,
-+            type,
-+            data,
-+            data_count);
-+}
-+
-+static int compare_entry_tags(const void *p1, const void *p2) {
-+    uint32_t tag1 = ((camera_metadata_buffer_entry_t*)p1)->tag;
-+    uint32_t tag2 = ((camera_metadata_buffer_entry_t*)p2)->tag;
-+    return  tag1 < tag2 ? -1 :
-+            tag1 == tag2 ? 0 :
-+            1;
-+}
-+
-+int sort_icamera_metadata(icamera_metadata_t *dst) {
-+    if (dst == NULL) return ERROR;
-+    if (dst->flags & FLAG_SORTED) return OK;
-+
-+    qsort(get_entries(dst), dst->entry_count,
-+            sizeof(camera_metadata_buffer_entry_t),
-+            compare_entry_tags);
-+    dst->flags |= FLAG_SORTED;
-+
-+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
-+    return OK;
-+}
-+
-+int get_icamera_metadata_entry(icamera_metadata_t *src,
-+        size_t index,
-+        icamera_metadata_entry_t *entry) {
-+    if (src == NULL || entry == NULL) return ERROR;
-+    if (index >= src->entry_count) return ERROR;
-+
-+    camera_metadata_buffer_entry_t *buffer_entry = get_entries(src) + index;
-+
-+    entry->index = index;
-+    entry->tag = buffer_entry->tag;
-+    entry->type = buffer_entry->type;
-+    entry->count = buffer_entry->count;
-+    if (buffer_entry->count *
-+            icamera_metadata_type_size[buffer_entry->type] > 4) {
-+        entry->data.u8 = get_data(src) + buffer_entry->data.offset;
-+    } else {
-+        entry->data.u8 = buffer_entry->data.value;
-+    }
-+    return OK;
-+}
-+
-+int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
-+        size_t index,
-+        icamera_metadata_ro_entry_t *entry) {
-+    return get_icamera_metadata_entry((icamera_metadata_t*)src, index,
-+            (icamera_metadata_entry_t*)entry);
-+}
-+
-+int find_icamera_metadata_entry(icamera_metadata_t *src,
-+        uint32_t tag,
-+        icamera_metadata_entry_t *entry) {
-+    if (src == NULL) return ERROR;
-+
-+    uint32_t index;
-+    if (src->flags & FLAG_SORTED) {
-+        // Sorted entries, do a binary search
-+        camera_metadata_buffer_entry_t *search_entry = NULL;
-+        camera_metadata_buffer_entry_t key;
-+        key.tag = tag;
-+        search_entry = (camera_metadata_buffer_entry_t *)bsearch(&key,
-+                get_entries(src),
-+                src->entry_count,
-+                sizeof(camera_metadata_buffer_entry_t),
-+                compare_entry_tags);
-+        if (search_entry == NULL) return NOT_FOUND;
-+        index = search_entry - get_entries(src);
-+    } else {
-+        // Not sorted, linear search
-+        camera_metadata_buffer_entry_t *search_entry = get_entries(src);
-+        for (index = 0; index < src->entry_count; index++, search_entry++) {
-+            if (search_entry->tag == tag) {
-+                break;
-+            }
-+        }
-+        if (index == src->entry_count) return NOT_FOUND;
-+    }
-+
-+    return get_icamera_metadata_entry(src, index,
-+            entry);
-+}
-+
-+int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
-+        uint32_t tag,
-+        icamera_metadata_ro_entry_t *entry) {
-+    return find_icamera_metadata_entry((icamera_metadata_t*)src, tag,
-+            (icamera_metadata_entry_t*)entry);
-+}
-+
-+int delete_icamera_metadata_entry(icamera_metadata_t *dst,
-+        size_t index) {
-+    if (dst == NULL) return ERROR;
-+    if (index >= dst->entry_count) return ERROR;
-+
-+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
-+    size_t data_bytes = calculate_icamera_metadata_entry_data_size(entry->type,
-+            entry->count);
-+
-+    if (data_bytes > 0) {
-+        // Shift data buffer to overwrite deleted data
-+        uint8_t *start = get_data(dst) + entry->data.offset;
-+        uint8_t *end = start + data_bytes;
-+        size_t length = dst->data_count - entry->data.offset - data_bytes;
-+        memmove(start, end, length);
-+
-+        // Update all entry indices to account for shift
-+        camera_metadata_buffer_entry_t *e = get_entries(dst);
-+        size_t i;
-+        for (i = 0; i < dst->entry_count; i++) {
-+            if (calculate_icamera_metadata_entry_data_size(
-+                    e->type, e->count) > 0 &&
-+                    e->data.offset > entry->data.offset) {
-+                e->data.offset -= data_bytes;
-+            }
-+            ++e;
-+        }
-+        dst->data_count -= data_bytes;
-+    }
-+    // Shift entry array
-+    memmove(entry, entry + 1,
-+            sizeof(camera_metadata_buffer_entry_t) *
-+            (dst->entry_count - index - 1) );
-+    dst->entry_count -= 1;
-+
-+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
-+    return OK;
-+}
-+
-+int update_icamera_metadata_entry(icamera_metadata_t *dst,
-+        size_t index,
-+        const void *data,
-+        size_t data_count,
-+        icamera_metadata_entry_t *updated_entry) {
-+    if (dst == NULL) return ERROR;
-+    if (index >= dst->entry_count) return ERROR;
-+
-+    camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;
-+    if (entry->type >= ICAMERA_NUM_TYPES) return ERROR;
-+
-+    size_t data_bytes =
-+            calculate_icamera_metadata_entry_data_size(entry->type,
-+                    data_count);
-+    size_t data_payload_bytes =
-+            data_count * icamera_metadata_type_size[entry->type];
-+
-+    size_t entry_bytes =
-+            calculate_icamera_metadata_entry_data_size(entry->type,
-+                    entry->count);
-+    if (data_bytes != entry_bytes) {
-+        // May need to shift/add to data array
-+        if (dst->data_capacity < dst->data_count + data_bytes - entry_bytes) {
-+            // No room
-+            return ERROR;
-+        }
-+        if (entry_bytes != 0) {
-+            // Remove old data
-+            uint8_t *start = get_data(dst) + entry->data.offset;
-+            uint8_t *end = start + entry_bytes;
-+            size_t length = dst->data_count - entry->data.offset - entry_bytes;
-+            memmove(start, end, length);
-+            dst->data_count -= entry_bytes;
-+
-+            // Update all entry indices to account for shift
-+            camera_metadata_buffer_entry_t *e = get_entries(dst);
-+            size_t i;
-+            for (i = 0; i < dst->entry_count; i++) {
-+                if (calculate_icamera_metadata_entry_data_size(
-+                        e->type, e->count) > 0 &&
-+                        e->data.offset > entry->data.offset) {
-+                    e->data.offset -= entry_bytes;
-+                }
-+                ++e;
-+            }
-+        }
-+
-+        if (data_bytes != 0) {
-+            // Append new data
-+            entry->data.offset = dst->data_count;
-+
-+            MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
-+            dst->data_count += data_bytes;
-+        }
-+    } else if (data_bytes != 0) {
-+        // data size unchanged, reuse same data location
-+        MEMCPY_S(get_data(dst) + entry->data.offset, data_payload_bytes, data, data_payload_bytes);
-+    }
-+
-+    if (data_bytes == 0) {
-+        // Data fits into entry
-+        MEMCPY_S(entry->data.value, data_payload_bytes, data, data_payload_bytes);
-+    }
-+
-+    entry->count = data_count;
-+
-+    if (updated_entry != NULL) {
-+        get_icamera_metadata_entry(dst,
-+                index,
-+                updated_entry);
-+    }
-+
-+    assert(validate_icamera_metadata_structure(dst, NULL) == OK);
-+    return OK;
-+}
-+
-+const char *get_icamera_metadata_section_name(uint32_t tag) {
-+    uint32_t tag_section = tag >> 16;
-+    if (tag_section >= CAMERA_SECTION_COUNT) {
-+        return NULL;
-+    }
-+    return icamera_metadata_section_names[tag_section];
-+}
-+
-+const char *get_icamera_metadata_tag_name(uint32_t tag) {
-+    uint32_t tag_section = tag >> 16;
-+    if (tag_section >= CAMERA_SECTION_COUNT ||
-+        tag >= icamera_metadata_section_bounds[tag_section][1] ) {
-+        return NULL;
-+    }
-+    uint32_t tag_index = tag & 0xFFFF;
-+    return icamera_tag_info[tag_section][tag_index].tag_name;
-+}
-+
-+int get_icamera_metadata_tag_type(uint32_t tag) {
-+    uint32_t tag_section = tag >> 16;
-+    if (tag_section >= CAMERA_SECTION_COUNT ||
-+            tag >= icamera_metadata_section_bounds[tag_section][1] ) {
-+        return -1;
-+    }
-+    uint32_t tag_index = tag & 0xFFFF;
-+    return icamera_tag_info[tag_section][tag_index].tag_type;
-+}
-+
-+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag, int type,
-+        int count,
-+        int indentation);
-+
-+void dump_icamera_metadata(const icamera_metadata_t *metadata,
-+        int fd,
-+        int verbosity) {
-+    dump_indented_icamera_metadata(metadata, fd, verbosity, 0);
-+}
-+
-+void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
-+        int fd,
-+        int verbosity,
-+        int indentation) {
-+    if (metadata == NULL) {
-+        dprintf(fd, "%*sDumping camera metadata array: Not allocated\n",
-+                indentation, "");
-+        return;
-+    }
-+    unsigned int i;
-+    dprintf(fd,
-+            "%*sDumping camera metadata array: %" PRIu32 " / %" PRIu32 " entries, "
-+            "%" PRIu32 " / %" PRIu32 " bytes of extra data.\n", indentation, "",
-+            metadata->entry_count, metadata->entry_capacity,
-+            metadata->data_count, metadata->data_capacity);
-+    dprintf(fd, "%*sVersion: %d, Flags: %08x\n",
-+            indentation + 2, "",
-+            metadata->version, metadata->flags);
-+    camera_metadata_buffer_entry_t *entry = get_entries(metadata);
-+    for (i=0; i < metadata->entry_count; i++, entry++) {
-+
-+        const char *tag_name, *tag_section;
-+        tag_section = get_icamera_metadata_section_name(entry->tag);
-+        if (tag_section == NULL) {
-+            tag_section = "unknownSection";
-+        }
-+        tag_name = get_icamera_metadata_tag_name(entry->tag);
-+        if (tag_name == NULL) {
-+            tag_name = "unknownTag";
-+        }
-+        const char *type_name;
-+        if (entry->type >= ICAMERA_NUM_TYPES) {
-+            type_name = "unknown";
-+        } else {
-+            type_name = icamera_metadata_type_names[entry->type];
-+        }
-+        dprintf(fd, "%*s%s.%s (%05x): %s[%" PRIu32 "]\n",
-+             indentation + 2, "",
-+             tag_section,
-+             tag_name,
-+             entry->tag,
-+             type_name,
-+             entry->count);
-+
-+        if (verbosity < 1) continue;
-+
-+        if (entry->type >= ICAMERA_NUM_TYPES) continue;
-+
-+        size_t type_size = icamera_metadata_type_size[entry->type];
-+        uint8_t *data_ptr;
-+        if ( type_size * entry->count > 4 ) {
-+            if (entry->data.offset >= metadata->data_count) {
-+                ALOGE("%s: Malformed entry data offset: %" PRIu32 " (max %" PRIu32 ")",
-+                        __func__,
-+                        entry->data.offset,
-+                        metadata->data_count);
-+                continue;
-+            }
-+            data_ptr = get_data(metadata) + entry->data.offset;
-+        } else {
-+            data_ptr = entry->data.value;
-+        }
-+        int count = entry->count;
-+        if (verbosity < 2 && count > 16) count = 16;
-+
-+        print_data(fd, data_ptr, entry->tag, entry->type, count, indentation);
-+    }
-+}
-+
-+static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag,
-+        int type, int count, int indentation) {
-+    static int values_per_line[ICAMERA_NUM_TYPES] = {
-+        16,                   // ICAMERA_TYPE_BYTE
-+        4,                    // ICAMERA_TYPE_INT32
-+        8,                    // ICAMERA_TYPE_FLOAT
-+        2,                    // ICAMERA_TYPE_INT64
-+        4,                    // ICAMERA_TYPE_DOUBLE
-+        2,                    // ICAMERA_TYPE_RATIONAL
-+    };
-+    size_t type_size = icamera_metadata_type_size[type];
-+    char value_string_tmp[ICAMERA_METADATA_ENUM_STRING_MAX_SIZE];
-+    int32_t value;
-+
-+    int lines = count / values_per_line[type];
-+    if (count % values_per_line[type] != 0) lines++;
-+
-+    int index = 0;
-+    int j, k;
-+    for (j = 0; j < lines; j++) {
-+        dprintf(fd, "%*s[", indentation + 4, "");
-+        for (k = 0;
-+             k < values_per_line[type] && count > 0;
-+             k++, count--, index += type_size) {
-+
-+            switch (type) {
-+                case ICAMERA_TYPE_BYTE:
-+                    value = *(data_ptr + index);
-+                    if (icamera_metadata_enum_snprint(tag,
-+                                                      value,
-+                                                      value_string_tmp,
-+                                                      sizeof(value_string_tmp))
-+                        == OK) {
-+                        dprintf(fd, "%s ", value_string_tmp);
-+                    } else {
-+                        dprintf(fd, "%hhu ",
-+                                *(data_ptr + index));
-+                    }
-+                    break;
-+                case ICAMERA_TYPE_INT32:
-+                    value =
-+                            *(int32_t*)(data_ptr + index);
-+                    if (icamera_metadata_enum_snprint(tag,
-+                                                      value,
-+                                                      value_string_tmp,
-+                                                      sizeof(value_string_tmp))
-+                        == OK) {
-+                        dprintf(fd, "%s ", value_string_tmp);
-+                    } else {
-+                        dprintf(fd, "%" PRId32 " ",
-+                                *(int32_t*)(data_ptr + index));
-+                    }
-+                    break;
-+                case ICAMERA_TYPE_FLOAT:
-+                    dprintf(fd, "%0.8f ",
-+                            *(float*)(data_ptr + index));
-+                    break;
-+                case ICAMERA_TYPE_INT64:
-+                    dprintf(fd, "%" PRId64 " ",
-+                            *(int64_t*)(data_ptr + index));
-+                    break;
-+                case ICAMERA_TYPE_DOUBLE:
-+                    dprintf(fd, "%0.8f ",
-+                            *(double*)(data_ptr + index));
-+                    break;
-+                case ICAMERA_TYPE_RATIONAL: {
-+                    int32_t numerator = *(int32_t*)(data_ptr + index);
-+                    int32_t denominator = *(int32_t*)(data_ptr + index + 4);
-+                    dprintf(fd, "(%d / %d) ",
-+                            numerator, denominator);
-+                    break;
-+                }
-+                default:
-+                    dprintf(fd, "??? ");
-+            }
-+        }
-+        dprintf(fd, "]\n");
-+    }
-+}
-diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
-new file mode 100644
-index 000000000000..77f02d0ae038
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_base.h
-@@ -0,0 +1,445 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string.h>
-+#include <stdint.h>
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define ALIGN_TO(val, alignment) \
-+    (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1))
-+
-+/**
-+ * Tag hierarchy and enum definitions for camera_metadata_entry
-+ * =============================================================================
-+ */
-+
-+/**
-+ * Main enum definitions are in a separate file to make it easy to
-+ * maintain
-+ */
-+#include "icamera_metadata_tags.h"
-+
-+/**
-+ * Enum range for each top-level category
-+ */
-+
-+extern unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2];
-+
-+extern const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT];
-+
-+/**
-+ * Type definitions for camera_metadata_entry
-+ * =============================================================================
-+ */
-+enum {
-+    // Unsigned 8-bit integer (uint8_t)
-+    ICAMERA_TYPE_BYTE = 0,
-+    // Signed 32-bit integer (int32_t)
-+    ICAMERA_TYPE_INT32 = 1,
-+    // 32-bit float (float)
-+    ICAMERA_TYPE_FLOAT = 2,
-+    // Signed 64-bit integer (int64_t)
-+    ICAMERA_TYPE_INT64 = 3,
-+    // 64-bit float (double)
-+    ICAMERA_TYPE_DOUBLE = 4,
-+    // A 64-bit fraction (camera_metadata_rational_t)
-+    ICAMERA_TYPE_RATIONAL = 5,
-+    // Number of type fields
-+    ICAMERA_NUM_TYPES
-+};
-+
-+typedef struct icamera_metadata_rational {
-+    int32_t numerator;
-+    int32_t denominator;
-+} icamera_metadata_rational_t;
-+
-+/**
-+ * A reference to a metadata entry in a buffer.
-+ *
-+ * The data union pointers point to the real data in the buffer, and can be
-+ * modified in-place if the count does not need to change. The count is the
-+ * number of entries in data of the entry's type, not a count of bytes.
-+ */
-+typedef struct icamera_metadata_entry {
-+    size_t   index;
-+    uint32_t tag;
-+    uint8_t  type;
-+    size_t   count;
-+    union {
-+        uint8_t *u8;
-+        int32_t *i32;
-+        float   *f;
-+        int64_t *i64;
-+        double  *d;
-+        icamera_metadata_rational_t *r;
-+    } data;
-+} icamera_metadata_entry_t;
-+
-+/**
-+ * A read-only reference to a metadata entry in a buffer. Identical to
-+ * camera_metadata_entry in layout
-+ */
-+typedef struct icamera_metadata_ro_entry {
-+    size_t   index;
-+    uint32_t tag;
-+    uint8_t  type;
-+    size_t   count;
-+    union {
-+        const uint8_t *u8;
-+        const int32_t *i32;
-+        const float   *f;
-+        const int64_t *i64;
-+        const double  *d;
-+        const icamera_metadata_rational_t *r;
-+    } data;
-+} icamera_metadata_ro_entry_t;
-+
-+/**
-+ * Size in bytes of each entry type
-+ */
-+extern const size_t icamera_metadata_type_size[ICAMERA_NUM_TYPES];
-+
-+/**
-+ * Human-readable name of each entry type
-+ */
-+extern const char* icamera_metadata_type_names[ICAMERA_NUM_TYPES];
-+
-+/**
-+ * Main definitions for the metadata entry and array structures
-+ * =============================================================================
-+ */
-+
-+/**
-+ * A packet of metadata. This is a list of metadata entries, each of which has
-+ * an integer tag to identify its meaning, 'type' and 'count' field, and the
-+ * data, which contains a 'count' number of entries of type 'type'. The packet
-+ * has a fixed capacity for entries and for extra data.  A new entry uses up one
-+ * entry slot, and possibly some amount of data capacity; the function
-+ * calculate_camera_metadata_entry_data_size() provides the amount of data
-+ * capacity that would be used up by an entry.
-+ *
-+ * Entries are not sorted by default, and are not forced to be unique - multiple
-+ * entries with the same tag are allowed. The packet will not dynamically resize
-+ * when full.
-+ *
-+ * The packet is contiguous in memory, with size in bytes given by
-+ * get_camera_metadata_size(). Therefore, it can be copied safely with memcpy()
-+ * to a buffer of sufficient size. The copy_camera_metadata() function is
-+ * intended for eliminating unused capacity in the destination packet.
-+ */
-+struct icamera_metadata;
-+typedef struct icamera_metadata icamera_metadata_t;
-+
-+/**
-+ * Functions for manipulating camera metadata
-+ * =============================================================================
-+ *
-+ * NOTE: Unless otherwise specified, functions that return type "int"
-+ * return 0 on success, and non-0 value on error.
-+ */
-+
-+/**
-+ * Allocate a new camera_metadata structure, with some initial space for entries
-+ * and extra data. The entry_capacity is measured in entry counts, and
-+ * data_capacity in bytes. The resulting structure is all contiguous in memory,
-+ * and can be freed with free_camera_metadata().
-+ */
-+icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity,
-+        size_t data_capacity);
-+
-+/**
-+ * Get the required alignment of a packet of camera metadata, which is the
-+ * maximal alignment of the embedded camera_metadata, camera_metadata_buffer_entry,
-+ * and camera_metadata_data.
-+ */
-+size_t get_icamera_metadata_alignment();
-+
-+/**
-+ * Allocate a new camera_metadata structure of size src_size. Copy the data,
-+ * ignoring alignment, and then attempt validation. If validation
-+ * fails, free the memory and return NULL. Otherwise return the pointer.
-+ *
-+ * The resulting pointer can be freed with free_camera_metadata().
-+ */
-+icamera_metadata_t *allocate_copy_icamera_metadata_checked(
-+        const icamera_metadata_t *src,
-+        size_t src_size);
-+
-+/**
-+ * Place a camera metadata structure into an existing buffer. Returns NULL if
-+ * the buffer is too small for the requested number of reserved entries and
-+ * bytes of data. The entry_capacity is measured in entry counts, and
-+ * data_capacity in bytes. If the buffer is larger than the required space,
-+ * unused space will be left at the end. If successful, returns a pointer to the
-+ * metadata header placed at the start of the buffer. It is the caller's
-+ * responsibility to free the original buffer; do not call
-+ * free_camera_metadata() with the returned pointer.
-+ */
-+icamera_metadata_t *place_icamera_metadata(void *dst, size_t dst_size,
-+        size_t entry_capacity,
-+        size_t data_capacity);
-+
-+/**
-+ * Free a camera_metadata structure. Should only be used with structures
-+ * allocated with allocate_camera_metadata().
-+ */
-+void free_icamera_metadata(icamera_metadata_t *metadata);
-+
-+/**
-+ * Calculate the buffer size needed for a metadata structure of entry_count
-+ * metadata entries, needing a total of data_count bytes of extra data storage.
-+ */
-+size_t calculate_icamera_metadata_size(size_t entry_count,
-+        size_t data_count);
-+
-+/**
-+ * Get current size of entire metadata structure in bytes, including reserved
-+ * but unused space.
-+ */
-+size_t get_icamera_metadata_size(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Get size of entire metadata buffer in bytes, not including reserved but
-+ * unused space. This is the amount of space needed by copy_camera_metadata for
-+ * its dst buffer.
-+ */
-+size_t get_icamera_metadata_compact_size(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Get the current number of entries in the metadata packet.
-+ *
-+ * metadata packet must be valid, which can be checked before the call with
-+ * validate_camera_metadata_structure().
-+ */
-+size_t get_icamera_metadata_entry_count(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Get the maximum number of entries that could fit in the metadata packet.
-+ */
-+size_t get_icamera_metadata_entry_capacity(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Get the current count of bytes used for value storage in the metadata packet.
-+ */
-+size_t get_icamera_metadata_data_count(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Get the maximum count of bytes that could be used for value storage in the
-+ * metadata packet.
-+ */
-+size_t get_icamera_metadata_data_capacity(const icamera_metadata_t *metadata);
-+
-+/**
-+ * Copy a metadata structure to a memory buffer, compacting it along the
-+ * way. That is, in the copied structure, entry_count == entry_capacity, and
-+ * data_count == data_capacity.
-+ *
-+ * If dst_size > get_camera_metadata_compact_size(), the unused bytes are at the
-+ * end of the buffer. If dst_size < get_camera_metadata_compact_size(), returns
-+ * NULL. Otherwise returns a pointer to the metadata structure header placed at
-+ * the start of dst.
-+ *
-+ * Since the buffer was not allocated by allocate_camera_metadata, the caller is
-+ * responsible for freeing the underlying buffer when needed; do not call
-+ * free_camera_metadata.
-+ */
-+icamera_metadata_t *copy_icamera_metadata(void *dst, size_t dst_size,
-+        const icamera_metadata_t *src);
-+
-+/**
-+ * Validate that a metadata is structurally sane. That is, its internal
-+ * state is such that we won't get buffer overflows or run into other
-+ * 'impossible' issues when calling the other API functions.
-+ *
-+ * This is useful in particular after copying the binary metadata blob
-+ * from an untrusted source, since passing this check means the data is at least
-+ * consistent.
-+ *
-+ * The expected_size argument is optional.
-+ *
-+ * Returns 0 on success. A non-0 value is returned on error.
-+ */
-+int validate_icamera_metadata_structure(const icamera_metadata_t *metadata,
-+                                        const size_t *expected_size);
-+
-+/**
-+ * Append camera metadata in src to an existing metadata structure in dst.  This
-+ * does not resize the destination structure, so if it is too small, a non-zero
-+ * value is returned. On success, 0 is returned. Appending onto a sorted
-+ * structure results in a non-sorted combined structure.
-+ */
-+int append_icamera_metadata(icamera_metadata_t *dst, const icamera_metadata_t *src);
-+
-+/**
-+ * Clone an existing metadata buffer, compacting along the way. This is
-+ * equivalent to allocating a new buffer of the minimum needed size, then
-+ * appending the buffer to be cloned into the new buffer. The resulting buffer
-+ * can be freed with free_camera_metadata(). Returns NULL if cloning failed.
-+ */
-+
-+icamera_metadata_t *clone_icamera_metadata(const icamera_metadata_t *src);
-+/**
-+ * Calculate the number of bytes of extra data a given metadata entry will take
-+ * up. That is, if entry of 'type' with a payload of 'data_count' values is
-+ * added, how much will the value returned by get_camera_metadata_data_count()
-+ * be increased? This value may be zero, if no extra data storage is needed.
-+ */
-+size_t calculate_icamera_metadata_entry_data_size(uint8_t type,
-+        size_t data_count);
-+
-+/**
-+ * Add a metadata entry to a metadata structure. Returns 0 if the addition
-+ * succeeded. Returns a non-zero value if there is insufficient reserved space
-+ * left to add the entry, or if the tag is unknown.  data_count is the number of
-+ * entries in the data array of the tag's type, not a count of
-+ * bytes. Entries are always added to the end of the structure (highest index),
-+ * so after addition, a previously-sorted array will be marked as unsorted.
-+ *
-+ * Returns 0 on success. A non-0 value is returned on error.
-+ */
-+int add_icamera_metadata_entry(icamera_metadata_t *dst,
-+        uint32_t tag,
-+        const void *data,
-+        size_t data_count);
-+
-+/**
-+ * Sort the metadata buffer for fast searching. If already marked as sorted,
-+ * does nothing. Adding or appending entries to the buffer will place the buffer
-+ * back into an unsorted state.
-+ *
-+ * Returns 0 on success. A non-0 value is returned on error.
-+ */
-+int sort_icamera_metadata(icamera_metadata_t *dst);
-+
-+/**
-+ * Get metadata entry at position index in the metadata buffer.
-+ * Index must be less than entry count, which is returned by
-+ * get_icamera_metadata_entry_count().
-+ *
-+ * src and index are inputs; the passed-in entry is updated with the details of
-+ * the entry. The data pointer points to the real data in the buffer, and can be
-+ * updated as long as the data count does not change.
-+ *
-+ * Returns 0 on success. A non-0 value is returned on error.
-+ */
-+int get_icamera_metadata_entry(icamera_metadata_t *src,
-+        size_t index,
-+        icamera_metadata_entry_t *entry);
-+
-+/**
-+ * Get metadata entry at position index, but disallow editing the data.
-+ */
-+int get_icamera_metadata_ro_entry(const icamera_metadata_t *src,
-+        size_t index,
-+        icamera_metadata_ro_entry_t *entry);
-+
-+/**
-+ * Find an entry with given tag value. If not found, returns -ENOENT. Otherwise,
-+ * returns entry contents like get_camera_metadata_entry.
-+ *
-+ * If multiple entries with the same tag exist, does not have any guarantees on
-+ * which is returned. To speed up searching for tags, sort the metadata
-+ * structure first by calling sort_camera_metadata().
-+ */
-+int find_icamera_metadata_entry(icamera_metadata_t *src,
-+        uint32_t tag,
-+        icamera_metadata_entry_t *entry);
-+
-+/**
-+ * Find an entry with given tag value, but disallow editing the data
-+ */
-+int find_icamera_metadata_ro_entry(const icamera_metadata_t *src,
-+        uint32_t tag,
-+        icamera_metadata_ro_entry_t *entry);
-+
-+/**
-+ * Delete an entry at given index. This is an expensive operation, since it
-+ * requires repacking entries and possibly entry data. This also invalidates any
-+ * existing camera_metadata_entry.data pointers to this buffer. Sorting is
-+ * maintained.
-+ */
-+int delete_icamera_metadata_entry(icamera_metadata_t *dst,
-+        size_t index);
-+
-+/**
-+ * Updates a metadata entry with new data. If the data size is changing, may
-+ * need to adjust the data array, making this an O(N) operation. If the data
-+ * size is the same or still fits in the entry space, this is O(1). Maintains
-+ * sorting, but invalidates camera_metadata_entry instances that point to the
-+ * updated entry. If a non-NULL value is passed in to entry, the entry structure
-+ * is updated to match the new buffer state.  Returns a non-zero value if there
-+ * is no room for the new data in the buffer.
-+ */
-+int update_icamera_metadata_entry(icamera_metadata_t *dst,
-+        size_t index,
-+        const void *data,
-+        size_t data_count,
-+        icamera_metadata_entry_t *updated_entry);
-+
-+/**
-+ * Retrieve human-readable name of section the tag is in. Returns NULL if
-+ * no such tag is defined.
-+ */
-+const char *get_icamera_metadata_section_name(uint32_t tag);
-+
-+/**
-+ * Retrieve human-readable name of tag (not including section). Returns NULL if
-+ * no such tag is defined.
-+ */
-+const char *get_icamera_metadata_tag_name(uint32_t tag);
-+
-+/**
-+ * Retrieve the type of a tag. Returns -1 if no such tag is defined.
-+ */
-+int get_icamera_metadata_tag_type(uint32_t tag);
-+
-+/**
-+ * Print fields in the metadata to the log.
-+ * verbosity = 0: Only tag entry information
-+ * verbosity = 1: Tag entry information plus at most 16 data values
-+ * verbosity = 2: All information
-+ */
-+void dump_icamera_metadata(const icamera_metadata_t *metadata,
-+        int fd,
-+        int verbosity);
-+
-+/**
-+ * Print fields in the metadata to the log; adds indentation parameter, which
-+ * specifies the number of spaces to insert before each line of the dump
-+ */
-+void dump_indented_icamera_metadata(const icamera_metadata_t *metadata,
-+        int fd,
-+        int verbosity,
-+        int indentation);
-+
-+/**
-+ * Prints the specified tag value as a string. Only works for enum tags.
-+ * Returns 0 on success, -1 on failure.
-+ */
-+int icamera_metadata_enum_snprint(uint32_t tag,
-+                                  int32_t value,
-+                                  char *dst,
-+                                  size_t size);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
-new file mode 100644
-index 000000000000..3b9b7e8e2b8c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
-@@ -0,0 +1,2630 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ * !! Do not reference this file directly !!
-+ *
-+ * It is logically a part of camera_metadata_base.cpp.  It is broken out for
-+ * ease of maintaining the tag info.
-+ *
-+ * Array assignments are done using specified-index syntax to keep things in
-+ * sync with icamera_metadata_tags.h
-+ */
-+
-+/**
-+ * ! Do not edit this file directly !
-+ *
-+ * Generated automatically from icamera_metadata_tag_info.mako
-+ */
-+
-+const char *icamera_metadata_section_names[CAMERA_SECTION_COUNT] = {
-+    "camera.ae", /* [CAMERA_AE] */
-+    "camera.awb", /* [CAMERA_AWB] */
-+    "camera.af", /* [CAMERA_AF] */
-+    "camera.control", /* [CAMERA_CONTROL] */
-+    "camera.demosaic", /* [CAMERA_DEMOSAIC] */
-+    "camera.edge", /* [CAMERA_EDGE] */
-+    "camera.flash", /* [CAMERA_FLASH] */
-+    "camera.flash.info", /* [CAMERA_FLASH_INFO] */
-+    "camera.hotPixel", /* [CAMERA_HOT_PIXEL] */
-+    "camera.jpeg", /* [CAMERA_JPEG] */
-+    "camera.lens", /* [CAMERA_LENS] */
-+    "camera.lens.info", /* [CAMERA_LENS_INFO] */
-+    "camera.noiseReduction", /* [CAMERA_NOISE_REDUCTION] */
-+    "camera.request", /* [CAMERA_REQUEST] */
-+    "camera.scaler", /* [CAMERA_SCALER] */
-+    "camera.sensor", /* [CAMERA_SENSOR] */
-+    "camera.sensor.info", /* [CAMERA_SENSOR_INFO] */
-+    "camera.shading", /* [CAMERA_SHADING] */
-+    "camera.statistics", /* [CAMERA_STATISTICS] */
-+    "camera.statistics.info", /* [CAMERA_STATISTICS_INFO] */
-+    "camera.tonemap", /* [CAMERA_TONEMAP] */
-+    "camera.led", /* [CAMERA_LED] */
-+    "camera.info", /* [CAMERA_INFO] */
-+    "camera.blackLevel", /* [CAMERA_BLACK_LEVEL] */
-+    "camera.sync", /* [CAMERA_SYNC] */
-+    "camera.reprocess", /* [CAMERA_REPROCESS] */
-+    "intel.info", /* [INTEL_INFO] */
-+    "intel.control", /* [INTEL_CONTROL] */
-+    "intel.control_isp", /* [INTEL_CONTROL_ISP] */
-+};
-+
-+unsigned int icamera_metadata_section_bounds[CAMERA_SECTION_COUNT][2] = {
-+    /* [CAMERA_AE] */
-+    { CAMERA_AE_START, CAMERA_AE_END },
-+    /* [CAMERA_AWB] */
-+    { CAMERA_AWB_START, CAMERA_AWB_END },
-+    /* [CAMERA_AF] */
-+    { CAMERA_AF_START, CAMERA_AF_END },
-+    /* [CAMERA_CONTROL] */
-+    { CAMERA_CONTROL_START, CAMERA_CONTROL_END },
-+    /* [CAMERA_DEMOSAIC] */
-+    { CAMERA_DEMOSAIC_START, CAMERA_DEMOSAIC_END },
-+    /* [CAMERA_EDGE] */
-+    { CAMERA_EDGE_START, CAMERA_EDGE_END },
-+    /* [CAMERA_FLASH] */
-+    { CAMERA_FLASH_START, CAMERA_FLASH_END },
-+    /* [CAMERA_FLASH_INFO] */
-+    { CAMERA_FLASH_INFO_START, CAMERA_FLASH_INFO_END },
-+    /* [CAMERA_HOT_PIXEL] */
-+    { CAMERA_HOT_PIXEL_START, CAMERA_HOT_PIXEL_END },
-+    /* [CAMERA_JPEG] */
-+    { CAMERA_JPEG_START, CAMERA_JPEG_END },
-+    /* [CAMERA_LENS] */
-+    { CAMERA_LENS_START, CAMERA_LENS_END },
-+    /* [CAMERA_LENS_INFO] */
-+    { CAMERA_LENS_INFO_START, CAMERA_LENS_INFO_END },
-+    /* [CAMERA_NOISE_REDUCTION] */
-+    { CAMERA_NOISE_REDUCTION_START, CAMERA_NOISE_REDUCTION_END },
-+    /* [CAMERA_REQUEST] */
-+    { CAMERA_REQUEST_START, CAMERA_REQUEST_END },
-+    /* [CAMERA_SCALER] */
-+    { CAMERA_SCALER_START, CAMERA_SCALER_END },
-+    /* [CAMERA_SENSOR] */
-+    { CAMERA_SENSOR_START, CAMERA_SENSOR_END },
-+    /* [CAMERA_SENSOR_INFO] */
-+    { CAMERA_SENSOR_INFO_START, CAMERA_SENSOR_INFO_END },
-+    /* [CAMERA_SHADING] */
-+    { CAMERA_SHADING_START, CAMERA_SHADING_END },
-+    /* [CAMERA_STATISTICS] */
-+    { CAMERA_STATISTICS_START, CAMERA_STATISTICS_END },
-+    /* [CAMERA_STATISTICS_INFO] */
-+    { CAMERA_STATISTICS_INFO_START, CAMERA_STATISTICS_INFO_END },
-+    /* [CAMERA_TONEMAP] */
-+    { CAMERA_TONEMAP_START, CAMERA_TONEMAP_END },
-+    /* [CAMERA_LED] */
-+    { CAMERA_LED_START, CAMERA_LED_END },
-+    /* [CAMERA_INFO] */
-+    { CAMERA_INFO_START, CAMERA_INFO_END },
-+    /* [CAMERA_BLACK_LEVEL] */
-+    { CAMERA_BLACK_LEVEL_START, CAMERA_BLACK_LEVEL_END },
-+    /* [CAMERA_SYNC] */
-+    { CAMERA_SYNC_START, CAMERA_SYNC_END },
-+    /* [CAMERA_REPROCESS] */
-+    { CAMERA_REPROCESS_START, CAMERA_REPROCESS_END },
-+    /* [INTEL_INFO] */
-+    { INTEL_INFO_START, INTEL_INFO_END },
-+    /* [INTEL_CONTROL] */
-+    { INTEL_CONTROL_START, INTEL_CONTROL_END },
-+    /* [INTEL_CONTROL_ISP] */
-+    { INTEL_CONTROL_ISP_START, INTEL_CONTROL_ISP_END },
-+};
-+
-+static tag_info_t camera_ae[CAMERA_AE_END -
-+        CAMERA_AE_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "lock",                          ICAMERA_TYPE_BYTE   },
-+    { "regions",                       ICAMERA_TYPE_INT32  },
-+    { "antibandingMode",               ICAMERA_TYPE_BYTE   },
-+    { "compensation",                  ICAMERA_TYPE_INT32  },
-+    { "targetFpsRange",                ICAMERA_TYPE_FLOAT  },
-+    { "precaptureTrigger",             ICAMERA_TYPE_BYTE   },
-+    { "state",                         ICAMERA_TYPE_BYTE   },
-+    { "availableModes",                ICAMERA_TYPE_BYTE   },
-+    { "availableAntibandingModes",     ICAMERA_TYPE_BYTE   },
-+    { "compensationStep",              ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "compensationRange",             ICAMERA_TYPE_INT32  },
-+    { "availableTargetFpsRanges",      ICAMERA_TYPE_FLOAT  },
-+    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_awb[CAMERA_AWB_END -
-+        CAMERA_AWB_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "colorTransform",                ICAMERA_TYPE_FLOAT  },
-+    { "colorGains",                    ICAMERA_TYPE_FLOAT  },
-+    { "lock",                          ICAMERA_TYPE_BYTE   },
-+    { "regions",                       ICAMERA_TYPE_INT32  },
-+    { "cctRange",                      ICAMERA_TYPE_INT32  },
-+    { "gains",                         ICAMERA_TYPE_INT32  },
-+    { "gainShift",                     ICAMERA_TYPE_INT32  },
-+    { "whitePoint",                    ICAMERA_TYPE_INT32  },
-+    { "convergeSpeed",                 ICAMERA_TYPE_BYTE   },
-+    { "convergeSpeedMode",             ICAMERA_TYPE_BYTE   },
-+    { "state",                         ICAMERA_TYPE_BYTE   },
-+    { "result",                        ICAMERA_TYPE_BYTE   },
-+    { "availableModes",                ICAMERA_TYPE_BYTE   },
-+    { "lockAvailable",                 ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_af[CAMERA_AF_END -
-+        CAMERA_AF_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "regions",                       ICAMERA_TYPE_INT32  },
-+    { "trigger",                       ICAMERA_TYPE_BYTE   },
-+    { "availableModes",                ICAMERA_TYPE_BYTE   },
-+    { "state",                         ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_control[CAMERA_CONTROL_END -
-+        CAMERA_CONTROL_START] = {
-+    { "effectMode",                    ICAMERA_TYPE_BYTE   },
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
-+    { "videoStabilizationMode",        ICAMERA_TYPE_BYTE   },
-+    { "availableEffects",              ICAMERA_TYPE_BYTE   },
-+    { "availableModes",                ICAMERA_TYPE_BYTE   },
-+    { "availableSceneModes",           ICAMERA_TYPE_BYTE   },
-+    { "availableVideoStabilizationModes",
-+                                        ICAMERA_TYPE_BYTE   },
-+    { "maxRegions",                    ICAMERA_TYPE_INT32  },
-+    { "sceneModeOverrides",            ICAMERA_TYPE_BYTE   },
-+    { "availableHighSpeedVideoConfigurations",
-+                                        ICAMERA_TYPE_INT32  },
-+};
-+
-+static tag_info_t camera_demosaic[CAMERA_DEMOSAIC_END -
-+        CAMERA_DEMOSAIC_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_edge[CAMERA_EDGE_END -
-+        CAMERA_EDGE_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "strength",                      ICAMERA_TYPE_BYTE   },
-+    { "availableEdgeModes",            ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_flash[CAMERA_FLASH_END -
-+        CAMERA_FLASH_START] = {
-+    { "firingPower",                   ICAMERA_TYPE_BYTE   },
-+    { "firingTime",                    ICAMERA_TYPE_INT64  },
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "colorTemperature",              ICAMERA_TYPE_BYTE   },
-+    { "maxEnergy",                     ICAMERA_TYPE_BYTE   },
-+    { "state",                         ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_flash_info[CAMERA_FLASH_INFO_END -
-+        CAMERA_FLASH_INFO_START] = {
-+    { "available",                     ICAMERA_TYPE_BYTE   },
-+    { "chargeDuration",                ICAMERA_TYPE_INT64  },
-+};
-+
-+static tag_info_t camera_hot_pixel[CAMERA_HOT_PIXEL_END -
-+        CAMERA_HOT_PIXEL_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "availableHotPixelModes",        ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_jpeg[CAMERA_JPEG_END -
-+        CAMERA_JPEG_START] = {
-+    { "gpsCoordinates",                ICAMERA_TYPE_DOUBLE },
-+    { "gpsProcessingMethod",           ICAMERA_TYPE_BYTE   },
-+    { "gpsTimestamp",                  ICAMERA_TYPE_INT64  },
-+    { "orientation",                   ICAMERA_TYPE_INT32  },
-+    { "quality",                       ICAMERA_TYPE_BYTE   },
-+    { "thumbnailQuality",              ICAMERA_TYPE_BYTE   },
-+    { "thumbnailSize",                 ICAMERA_TYPE_INT32  },
-+    { "availableThumbnailSizes",       ICAMERA_TYPE_INT32  },
-+    { "maxSize",                       ICAMERA_TYPE_INT32  },
-+    { "size",                          ICAMERA_TYPE_INT32  },
-+};
-+
-+static tag_info_t camera_lens[CAMERA_LENS_END -
-+        CAMERA_LENS_START] = {
-+    { "aperture",                      ICAMERA_TYPE_FLOAT  },
-+    { "filterDensity",                 ICAMERA_TYPE_FLOAT  },
-+    { "focalLength",                   ICAMERA_TYPE_FLOAT  },
-+    { "focusDistance",                 ICAMERA_TYPE_FLOAT  },
-+    { "opticalStabilizationMode",      ICAMERA_TYPE_BYTE   },
-+    { "facing",                        ICAMERA_TYPE_BYTE   },
-+    { "focusRange",                    ICAMERA_TYPE_FLOAT  },
-+    { "state",                         ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_lens_info[CAMERA_LENS_INFO_END -
-+        CAMERA_LENS_INFO_START] = {
-+    { "availableApertures",            ICAMERA_TYPE_FLOAT  },
-+    { "availableFilterDensities",      ICAMERA_TYPE_FLOAT  },
-+    { "availableFocalLengths",         ICAMERA_TYPE_FLOAT  },
-+    { "availableOpticalStabilization", ICAMERA_TYPE_BYTE   },
-+    { "hyperfocalDistance",            ICAMERA_TYPE_FLOAT  },
-+    { "minimumFocusDistance",          ICAMERA_TYPE_FLOAT  },
-+    { "shadingMapSize",                ICAMERA_TYPE_INT32  },
-+    { "focusDistanceCalibration",      ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_noise_reduction[CAMERA_NOISE_REDUCTION_END -
-+        CAMERA_NOISE_REDUCTION_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "strength",                      ICAMERA_TYPE_BYTE   },
-+    { "availableNoiseReductionModes",  ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_request[CAMERA_REQUEST_END -
-+        CAMERA_REQUEST_START] = {
-+    { "id",                            ICAMERA_TYPE_INT32  },
-+    { "metadataMode",                  ICAMERA_TYPE_BYTE   },
-+    { "maxNumOutputStreams",           ICAMERA_TYPE_INT32  },
-+    { "maxNumInputStreams",            ICAMERA_TYPE_INT32  },
-+    { "pipelineDepth",                 ICAMERA_TYPE_BYTE   },
-+    { "pipelineMaxDepth",              ICAMERA_TYPE_BYTE   },
-+    { "partialResultCount",            ICAMERA_TYPE_INT32  },
-+    { "availableCapabilities",         ICAMERA_TYPE_BYTE   },
-+    { "availableRequestKeys",          ICAMERA_TYPE_INT32  },
-+    { "availableResultKeys",           ICAMERA_TYPE_INT32  },
-+    { "availableCharacteristicsKeys",  ICAMERA_TYPE_INT32  },
-+};
-+
-+static tag_info_t camera_scaler[CAMERA_SCALER_END -
-+        CAMERA_SCALER_START] = {
-+    { "cropRegion",                    ICAMERA_TYPE_INT32  },
-+    { "availableJpegSizes",            ICAMERA_TYPE_INT32  },
-+    { "availableMaxDigitalZoom",       ICAMERA_TYPE_FLOAT  },
-+    { "availableInputOutputFormatsMap",
-+                                        ICAMERA_TYPE_INT32  },
-+    { "availableStreamConfigurations", ICAMERA_TYPE_INT32  },
-+    { "availableMinFrameDurations",    ICAMERA_TYPE_INT64  },
-+    { "croppingType",                  ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_sensor[CAMERA_SENSOR_END -
-+        CAMERA_SENSOR_START] = {
-+    { "exposureTime",                  ICAMERA_TYPE_INT64  },
-+    { "frameDuration",                 ICAMERA_TYPE_INT64  },
-+    { "sensitivity",                   ICAMERA_TYPE_INT32  },
-+    { "referenceIlluminant1",          ICAMERA_TYPE_BYTE   },
-+    { "referenceIlluminant2",          ICAMERA_TYPE_BYTE   },
-+    { "calibrationTransform1",         ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "calibrationTransform2",         ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "colorTransform1",               ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "colorTransform2",               ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "forwardMatrix1",                ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "forwardMatrix2",                ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "baseGainFactor",                ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "blackLevelPattern",             ICAMERA_TYPE_INT32  },
-+    { "maxAnalogSensitivity",          ICAMERA_TYPE_INT32  },
-+    { "orientation",                   ICAMERA_TYPE_INT32  },
-+    { "profileHueSatMapDimensions",    ICAMERA_TYPE_INT32  },
-+    { "timestamp",                     ICAMERA_TYPE_INT64  },
-+    { "temperature",                   ICAMERA_TYPE_FLOAT  },
-+    { "neutralColorPoint",             ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "noiseProfile",                  ICAMERA_TYPE_DOUBLE },
-+    { "profileHueSatMap",              ICAMERA_TYPE_FLOAT  },
-+    { "profileToneCurve",              ICAMERA_TYPE_FLOAT  },
-+    { "greenSplit",                    ICAMERA_TYPE_FLOAT  },
-+    { "testPatternData",               ICAMERA_TYPE_INT32  },
-+    { "testPatternMode",               ICAMERA_TYPE_INT32  },
-+    { "availableTestPatternModes",     ICAMERA_TYPE_INT32  },
-+    { "opaqueRawSize",                 ICAMERA_TYPE_INT32  },
-+    { "rollingShutterSkew",            ICAMERA_TYPE_INT64  },
-+};
-+
-+static tag_info_t camera_sensor_info[CAMERA_SENSOR_INFO_END -
-+        CAMERA_SENSOR_INFO_START] = {
-+    { "activeArraySize",               ICAMERA_TYPE_INT32  },
-+    { "sensitivityRange",              ICAMERA_TYPE_INT32  },
-+    { "colorFilterArrangement",        ICAMERA_TYPE_BYTE   },
-+    { "exposureTimeRange",             ICAMERA_TYPE_INT64  },
-+    { "maxFrameDuration",              ICAMERA_TYPE_INT64  },
-+    { "physicalSize",                  ICAMERA_TYPE_FLOAT  },
-+    { "pixelArraySize",                ICAMERA_TYPE_INT32  },
-+    { "whiteLevel",                    ICAMERA_TYPE_INT32  },
-+    { "timestampSource",               ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_shading[CAMERA_SHADING_END -
-+        CAMERA_SHADING_START] = {
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "strength",                      ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_statistics[CAMERA_STATISTICS_END -
-+        CAMERA_STATISTICS_START] = {
-+    { "faceDetectMode",                ICAMERA_TYPE_BYTE   },
-+    { "histogramMode",                 ICAMERA_TYPE_BYTE   },
-+    { "sharpnessMapMode",              ICAMERA_TYPE_BYTE   },
-+    { "hotPixelMapMode",               ICAMERA_TYPE_BYTE   },
-+    { "faceIds",                       ICAMERA_TYPE_INT32  },
-+    { "faceLandmarks",                 ICAMERA_TYPE_INT32  },
-+    { "faceRectangles",                ICAMERA_TYPE_INT32  },
-+    { "faceScores",                    ICAMERA_TYPE_BYTE   },
-+    { "histogram",                     ICAMERA_TYPE_INT32  },
-+    { "sharpnessMap",                  ICAMERA_TYPE_INT32  },
-+    { "lensShadingCorrectionMap",      ICAMERA_TYPE_BYTE   },
-+    { "lensShadingMap",                ICAMERA_TYPE_FLOAT  },
-+    { "predictedColorGains",           ICAMERA_TYPE_FLOAT  },
-+    { "predictedColorTransform",       ICAMERA_TYPE_RATIONAL
-+                        },
-+    { "sceneFlicker",                  ICAMERA_TYPE_BYTE   },
-+    { "hotPixelMap",                   ICAMERA_TYPE_INT32  },
-+    { "lensShadingMapMode",            ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_statistics_info[CAMERA_STATISTICS_INFO_END -
-+        CAMERA_STATISTICS_INFO_START] = {
-+    { "availableFaceDetectModes",      ICAMERA_TYPE_BYTE   },
-+    { "histogramBucketCount",          ICAMERA_TYPE_INT32  },
-+    { "maxFaceCount",                  ICAMERA_TYPE_INT32  },
-+    { "maxHistogramCount",             ICAMERA_TYPE_INT32  },
-+    { "maxSharpnessMapValue",          ICAMERA_TYPE_INT32  },
-+    { "sharpnessMapSize",              ICAMERA_TYPE_INT32  },
-+    { "availableHotPixelMapModes",     ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_tonemap[CAMERA_TONEMAP_END -
-+        CAMERA_TONEMAP_START] = {
-+    { "curveBlue",                     ICAMERA_TYPE_FLOAT  },
-+    { "curveGreen",                    ICAMERA_TYPE_FLOAT  },
-+    { "curveRed",                      ICAMERA_TYPE_FLOAT  },
-+    { "mode",                          ICAMERA_TYPE_BYTE   },
-+    { "maxCurvePoints",                ICAMERA_TYPE_INT32  },
-+    { "availableToneMapModes",         ICAMERA_TYPE_BYTE   },
-+    { "gamma",                         ICAMERA_TYPE_FLOAT  },
-+    { "presetCurve",                   ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_led[CAMERA_LED_END -
-+        CAMERA_LED_START] = {
-+    { "transmit",                      ICAMERA_TYPE_BYTE   },
-+    { "availableLeds",                 ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_info[CAMERA_INFO_END -
-+        CAMERA_INFO_START] = {
-+    { "supportedHardwareLevel",        ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_black_level[CAMERA_BLACK_LEVEL_END -
-+        CAMERA_BLACK_LEVEL_START] = {
-+    { "lock",                          ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t camera_sync[CAMERA_SYNC_END -
-+        CAMERA_SYNC_START] = {
-+    { "frameNumber",                   ICAMERA_TYPE_INT64  },
-+    { "maxLatency",                    ICAMERA_TYPE_INT32  },
-+};
-+
-+static tag_info_t camera_reprocess[CAMERA_REPROCESS_END -
-+        CAMERA_REPROCESS_START] = {
-+    { "maxCaptureStall",               ICAMERA_TYPE_INT32  },
-+};
-+
-+static tag_info_t intel_info[INTEL_INFO_END -
-+        INTEL_INFO_START] = {
-+    { "availableFeatures",             ICAMERA_TYPE_BYTE   },
-+    { "aeExposureTimeRange",           ICAMERA_TYPE_INT32  },
-+    { "aeGainRange",                   ICAMERA_TYPE_INT32  },
-+    { "wfov",                          ICAMERA_TYPE_BYTE   },
-+    { "sensorMountType",               ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t intel_control[INTEL_CONTROL_END -
-+        INTEL_CONTROL_START] = {
-+    { "imageEnhancement",              ICAMERA_TYPE_INT32  },
-+    { "sensitivityGain",               ICAMERA_TYPE_FLOAT  },
-+    { "frameRate",                     ICAMERA_TYPE_FLOAT  },
-+    { "aeConvergeSpeed",               ICAMERA_TYPE_BYTE   },
-+    { "nrMode",                        ICAMERA_TYPE_BYTE   },
-+    { "nrLevel",                       ICAMERA_TYPE_INT32  },
-+    { "irisMode",                      ICAMERA_TYPE_BYTE   },
-+    { "aeDistributionPriority",        ICAMERA_TYPE_BYTE   },
-+    { "irisLevel",                     ICAMERA_TYPE_INT32  },
-+    { "wdrMode",                       ICAMERA_TYPE_BYTE   },
-+    { "wdrLevel",                      ICAMERA_TYPE_BYTE   },
-+    { "blcAreaMode",                   ICAMERA_TYPE_BYTE   },
-+    { "sceneMode",                     ICAMERA_TYPE_BYTE   },
-+    { "weightGridMode",                ICAMERA_TYPE_BYTE   },
-+    { "aeConvergeSpeedMode",           ICAMERA_TYPE_BYTE   },
-+    { "deinterlaceMode",               ICAMERA_TYPE_BYTE   },
-+    { "makernoteData",                 ICAMERA_TYPE_BYTE   },
-+    { "customAicParam",                ICAMERA_TYPE_BYTE   },
-+    { "makernoteMode",                 ICAMERA_TYPE_BYTE   },
-+    { "yuvColorRange",                 ICAMERA_TYPE_BYTE   },
-+    { "sensitivityGainRange",          ICAMERA_TYPE_FLOAT  },
-+    { "exposureTimeRange",             ICAMERA_TYPE_INT32  },
-+    { "fisheyeDewarpingMode",          ICAMERA_TYPE_BYTE   },
-+    { "ltmTuningData",                 ICAMERA_TYPE_BYTE   },
-+    { "digitalZoomRatio",              ICAMERA_TYPE_FLOAT  },
-+    { "ldcMode",                       ICAMERA_TYPE_BYTE   },
-+    { "rscMode",                       ICAMERA_TYPE_BYTE   },
-+    { "flipMode",                      ICAMERA_TYPE_BYTE   },
-+    { "monoDownscale",                 ICAMERA_TYPE_BYTE   },
-+    { "run3ACadence",                  ICAMERA_TYPE_INT32  },
-+    { "viewProjection",                ICAMERA_TYPE_BYTE   },
-+    { "viewRotation",                  ICAMERA_TYPE_BYTE   },
-+    { "viewFineAdjustments",           ICAMERA_TYPE_BYTE   },
-+    { "cameraRotation",                ICAMERA_TYPE_BYTE   },
-+};
-+
-+static tag_info_t intel_control_isp[INTEL_CONTROL_ISP_END -
-+        INTEL_CONTROL_ISP_START] = {
-+    { "supportedCtrlIds",              ICAMERA_TYPE_INT32  },
-+    { "enabledCtrlIds",                ICAMERA_TYPE_INT32  },
-+    { "wb_gains",                      ICAMERA_TYPE_BYTE   },
-+    { "color_correction_matrix",       ICAMERA_TYPE_BYTE   },
-+    { "advanced_color_correction_matrix",
-+                                        ICAMERA_TYPE_BYTE   },
-+    { "bxt_csc",                       ICAMERA_TYPE_BYTE   },
-+    { "bxt_demosaic",                  ICAMERA_TYPE_BYTE   },
-+    { "sc_iefd",                       ICAMERA_TYPE_BYTE   },
-+    { "see",                           ICAMERA_TYPE_BYTE   },
-+    { "bnlm",                          ICAMERA_TYPE_BYTE   },
-+    { "tnr5_21",                       ICAMERA_TYPE_BYTE   },
-+    { "xnr_dss",                       ICAMERA_TYPE_BYTE   },
-+    { "gamma_tone_map",                ICAMERA_TYPE_BYTE   },
-+    { "tnr5_22",                       ICAMERA_TYPE_BYTE   },
-+    { "tnr5_25",                       ICAMERA_TYPE_BYTE   },
-+};
-+
-+tag_info_t *icamera_tag_info[CAMERA_SECTION_COUNT] = {
-+    camera_ae,
-+    camera_awb,
-+    camera_af,
-+    camera_control,
-+    camera_demosaic,
-+    camera_edge,
-+    camera_flash,
-+    camera_flash_info,
-+    camera_hot_pixel,
-+    camera_jpeg,
-+    camera_lens,
-+    camera_lens_info,
-+    camera_noise_reduction,
-+    camera_request,
-+    camera_scaler,
-+    camera_sensor,
-+    camera_sensor_info,
-+    camera_shading,
-+    camera_statistics,
-+    camera_statistics_info,
-+    camera_tonemap,
-+    camera_led,
-+    camera_info,
-+    camera_black_level,
-+    camera_sync,
-+    camera_reprocess,
-+    intel_info,
-+    intel_control,
-+    intel_control_isp,
-+};
-+
-+int icamera_metadata_enum_snprint(uint32_t tag,
-+                                  int32_t value,
-+                                  char *dst,
-+                                  size_t size) {
-+    const char *msg = "error: not an enum";
-+    int ret = -1;
-+
-+    switch(tag) {
-+        case CAMERA_AE_MODE: {
-+            switch (value) {
-+                case CAMERA_AE_MODE_MANUAL:
-+                    msg = "MANUAL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AE_LOCK: {
-+            switch (value) {
-+                case CAMERA_AE_LOCK_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_LOCK_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AE_REGIONS: {
-+            break;
-+        }
-+        case CAMERA_AE_ANTIBANDING_MODE: {
-+            switch (value) {
-+                case CAMERA_AE_ANTIBANDING_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_ANTIBANDING_MODE_50HZ:
-+                    msg = "50HZ";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_ANTIBANDING_MODE_60HZ:
-+                    msg = "60HZ";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_ANTIBANDING_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AE_COMPENSATION: {
-+            break;
-+        }
-+        case CAMERA_AE_TARGET_FPS_RANGE: {
-+            break;
-+        }
-+        case CAMERA_AE_PRECAPTURE_TRIGGER: {
-+            switch (value) {
-+                case CAMERA_AE_PRECAPTURE_TRIGGER_IDLE:
-+                    msg = "IDLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_PRECAPTURE_TRIGGER_START:
-+                    msg = "START";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AE_STATE: {
-+            switch (value) {
-+                case CAMERA_AE_STATE_INACTIVE:
-+                    msg = "INACTIVE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_STATE_SEARCHING:
-+                    msg = "SEARCHING";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_STATE_CONVERGED:
-+                    msg = "CONVERGED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_STATE_LOCKED:
-+                    msg = "LOCKED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_STATE_FLASH_REQUIRED:
-+                    msg = "FLASH_REQUIRED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_STATE_PRECAPTURE:
-+                    msg = "PRECAPTURE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AE_AVAILABLE_MODES: {
-+            break;
-+        }
-+        case CAMERA_AE_AVAILABLE_ANTIBANDING_MODES: {
-+            break;
-+        }
-+        case CAMERA_AE_COMPENSATION_STEP: {
-+            break;
-+        }
-+        case CAMERA_AE_COMPENSATION_RANGE: {
-+            break;
-+        }
-+        case CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES: {
-+            break;
-+        }
-+        case CAMERA_AE_LOCK_AVAILABLE: {
-+            switch (value) {
-+                case CAMERA_AE_LOCK_AVAILABLE_FALSE:
-+                    msg = "FALSE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AE_LOCK_AVAILABLE_TRUE:
-+                    msg = "TRUE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_AWB_MODE: {
-+            switch (value) {
-+                case CAMERA_AWB_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_INCANDESCENT:
-+                    msg = "INCANDESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_FLUORESCENT:
-+                    msg = "FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_DAYLIGHT:
-+                    msg = "DAYLIGHT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_FULL_OVERCAST:
-+                    msg = "FULL_OVERCAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_PARTLY_OVERCAST:
-+                    msg = "PARTLY_OVERCAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_SUNSET:
-+                    msg = "SUNSET";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_VIDEO_CONFERENCE:
-+                    msg = "VIDEO_CONFERENCE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_MANUAL_CCT_RANGE:
-+                    msg = "MANUAL_CCT_RANGE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_MANUAL_WHITE_POINT:
-+                    msg = "MANUAL_WHITE_POINT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_MANUAL_GAIN:
-+                    msg = "MANUAL_GAIN";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM:
-+                    msg = "MANUAL_COLOR_TRANSFORM";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AWB_COLOR_TRANSFORM: {
-+            break;
-+        }
-+        case CAMERA_AWB_COLOR_GAINS: {
-+            break;
-+        }
-+        case CAMERA_AWB_LOCK: {
-+            switch (value) {
-+                case CAMERA_AWB_LOCK_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_LOCK_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AWB_REGIONS: {
-+            break;
-+        }
-+        case CAMERA_AWB_CCT_RANGE: {
-+            break;
-+        }
-+        case CAMERA_AWB_GAINS: {
-+            break;
-+        }
-+        case CAMERA_AWB_GAIN_SHIFT: {
-+            break;
-+        }
-+        case CAMERA_AWB_WHITE_POINT: {
-+            break;
-+        }
-+        case CAMERA_AWB_CONVERGE_SPEED: {
-+            switch (value) {
-+                case CAMERA_AWB_CONVERGE_SPEED_NORMAL:
-+                    msg = "NORMAL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_CONVERGE_SPEED_MID:
-+                    msg = "MID";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_CONVERGE_SPEED_LOW:
-+                    msg = "LOW";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AWB_CONVERGE_SPEED_MODE: {
-+            switch (value) {
-+                case CAMERA_AWB_CONVERGE_SPEED_MODE_HAL:
-+                    msg = "HAL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ:
-+                    msg = "AIQ";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AWB_STATE: {
-+            switch (value) {
-+                case CAMERA_AWB_STATE_INACTIVE:
-+                    msg = "INACTIVE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_STATE_SEARCHING:
-+                    msg = "SEARCHING";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_STATE_CONVERGED:
-+                    msg = "CONVERGED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_STATE_LOCKED:
-+                    msg = "LOCKED";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AWB_RESULT: {
-+            break;
-+        }
-+        case CAMERA_AWB_AVAILABLE_MODES: {
-+            break;
-+        }
-+        case CAMERA_AWB_LOCK_AVAILABLE: {
-+            switch (value) {
-+                case CAMERA_AWB_LOCK_AVAILABLE_FALSE:
-+                    msg = "FALSE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AWB_LOCK_AVAILABLE_TRUE:
-+                    msg = "TRUE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_AF_MODE: {
-+            switch (value) {
-+                case CAMERA_AF_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_MODE_MACRO:
-+                    msg = "MACRO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_MODE_CONTINUOUS_VIDEO:
-+                    msg = "CONTINUOUS_VIDEO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_MODE_CONTINUOUS_PICTURE:
-+                    msg = "CONTINUOUS_PICTURE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_MODE_EDOF:
-+                    msg = "EDOF";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AF_REGIONS: {
-+            break;
-+        }
-+        case CAMERA_AF_TRIGGER: {
-+            switch (value) {
-+                case CAMERA_AF_TRIGGER_IDLE:
-+                    msg = "IDLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_TRIGGER_START:
-+                    msg = "START";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_TRIGGER_CANCEL:
-+                    msg = "CANCEL";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_AF_AVAILABLE_MODES: {
-+            break;
-+        }
-+        case CAMERA_AF_STATE: {
-+            switch (value) {
-+                case CAMERA_AF_STATE_INACTIVE:
-+                    msg = "INACTIVE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_PASSIVE_SCAN:
-+                    msg = "PASSIVE_SCAN";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_PASSIVE_FOCUSED:
-+                    msg = "PASSIVE_FOCUSED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_ACTIVE_SCAN:
-+                    msg = "ACTIVE_SCAN";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_FOCUSED_LOCKED:
-+                    msg = "FOCUSED_LOCKED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_NOT_FOCUSED_LOCKED:
-+                    msg = "NOT_FOCUSED_LOCKED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_AF_STATE_PASSIVE_UNFOCUSED:
-+                    msg = "PASSIVE_UNFOCUSED";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_CONTROL_EFFECT_MODE: {
-+            switch (value) {
-+                case CAMERA_CONTROL_EFFECT_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_MONO:
-+                    msg = "MONO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_NEGATIVE:
-+                    msg = "NEGATIVE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_SOLARIZE:
-+                    msg = "SOLARIZE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_SEPIA:
-+                    msg = "SEPIA";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_POSTERIZE:
-+                    msg = "POSTERIZE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD:
-+                    msg = "WHITEBOARD";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD:
-+                    msg = "BLACKBOARD";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_EFFECT_MODE_AQUA:
-+                    msg = "AQUA";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_CONTROL_MODE: {
-+            switch (value) {
-+                case CAMERA_CONTROL_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_MODE_USE_SCENE_MODE:
-+                    msg = "USE_SCENE_MODE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_MODE_OFF_KEEP_STATE:
-+                    msg = "OFF_KEEP_STATE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_CONTROL_SCENE_MODE: {
-+            switch (value) {
-+                case CAMERA_CONTROL_SCENE_MODE_DISABLED:
-+                    msg = "DISABLED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY:
-+                    msg = "FACE_PRIORITY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_ACTION:
-+                    msg = "ACTION";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_PORTRAIT:
-+                    msg = "PORTRAIT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_LANDSCAPE:
-+                    msg = "LANDSCAPE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_NIGHT:
-+                    msg = "NIGHT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
-+                    msg = "NIGHT_PORTRAIT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_THEATRE:
-+                    msg = "THEATRE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_BEACH:
-+                    msg = "BEACH";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_SNOW:
-+                    msg = "SNOW";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_SUNSET:
-+                    msg = "SUNSET";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO:
-+                    msg = "STEADYPHOTO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_FIREWORKS:
-+                    msg = "FIREWORKS";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_SPORTS:
-+                    msg = "SPORTS";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_PARTY:
-+                    msg = "PARTY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT:
-+                    msg = "CANDLELIGHT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_BARCODE:
-+                    msg = "BARCODE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO:
-+                    msg = "HIGH_SPEED_VIDEO";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_SCENE_MODE_HDR:
-+                    msg = "HDR";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE: {
-+            switch (value) {
-+                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_CONTROL_AVAILABLE_EFFECTS: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_AVAILABLE_MODES: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_AVAILABLE_SCENE_MODES: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_MAX_REGIONS: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_SCENE_MODE_OVERRIDES: {
-+            break;
-+        }
-+        case CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS: {
-+            break;
-+        }
-+
-+        case CAMERA_DEMOSAIC_MODE: {
-+            switch (value) {
-+                case CAMERA_DEMOSAIC_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_DEMOSAIC_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_EDGE_MODE: {
-+            switch (value) {
-+                case CAMERA_EDGE_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_EDGE_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_EDGE_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_EDGE_STRENGTH: {
-+            break;
-+        }
-+        case CAMERA_EDGE_AVAILABLE_EDGE_MODES: {
-+            break;
-+        }
-+
-+        case CAMERA_FLASH_FIRING_POWER: {
-+            break;
-+        }
-+        case CAMERA_FLASH_FIRING_TIME: {
-+            break;
-+        }
-+        case CAMERA_FLASH_MODE: {
-+            switch (value) {
-+                case CAMERA_FLASH_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_MODE_SINGLE:
-+                    msg = "SINGLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_MODE_TORCH:
-+                    msg = "TORCH";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_FLASH_COLOR_TEMPERATURE: {
-+            break;
-+        }
-+        case CAMERA_FLASH_MAX_ENERGY: {
-+            break;
-+        }
-+        case CAMERA_FLASH_STATE: {
-+            switch (value) {
-+                case CAMERA_FLASH_STATE_UNAVAILABLE:
-+                    msg = "UNAVAILABLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_STATE_CHARGING:
-+                    msg = "CHARGING";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_STATE_READY:
-+                    msg = "READY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_STATE_FIRED:
-+                    msg = "FIRED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_STATE_PARTIAL:
-+                    msg = "PARTIAL";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_FLASH_INFO_AVAILABLE: {
-+            switch (value) {
-+                case CAMERA_FLASH_INFO_AVAILABLE_FALSE:
-+                    msg = "FALSE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_FLASH_INFO_AVAILABLE_TRUE:
-+                    msg = "TRUE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_FLASH_INFO_CHARGE_DURATION: {
-+            break;
-+        }
-+
-+        case CAMERA_HOT_PIXEL_MODE: {
-+            switch (value) {
-+                case CAMERA_HOT_PIXEL_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_HOT_PIXEL_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES: {
-+            break;
-+        }
-+
-+        case CAMERA_JPEG_GPS_COORDINATES: {
-+            break;
-+        }
-+        case CAMERA_JPEG_GPS_PROCESSING_METHOD: {
-+            break;
-+        }
-+        case CAMERA_JPEG_GPS_TIMESTAMP: {
-+            break;
-+        }
-+        case CAMERA_JPEG_ORIENTATION: {
-+            break;
-+        }
-+        case CAMERA_JPEG_QUALITY: {
-+            break;
-+        }
-+        case CAMERA_JPEG_THUMBNAIL_QUALITY: {
-+            break;
-+        }
-+        case CAMERA_JPEG_THUMBNAIL_SIZE: {
-+            break;
-+        }
-+        case CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES: {
-+            break;
-+        }
-+        case CAMERA_JPEG_MAX_SIZE: {
-+            break;
-+        }
-+        case CAMERA_JPEG_SIZE: {
-+            break;
-+        }
-+
-+        case CAMERA_LENS_APERTURE: {
-+            break;
-+        }
-+        case CAMERA_LENS_FILTER_DENSITY: {
-+            break;
-+        }
-+        case CAMERA_LENS_FOCAL_LENGTH: {
-+            break;
-+        }
-+        case CAMERA_LENS_FOCUS_DISTANCE: {
-+            break;
-+        }
-+        case CAMERA_LENS_OPTICAL_STABILIZATION_MODE: {
-+            switch (value) {
-+                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_LENS_FACING: {
-+            switch (value) {
-+                case CAMERA_LENS_FACING_FRONT:
-+                    msg = "FRONT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LENS_FACING_BACK:
-+                    msg = "BACK";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_LENS_FOCUS_RANGE: {
-+            break;
-+        }
-+        case CAMERA_LENS_STATE: {
-+            switch (value) {
-+                case CAMERA_LENS_STATE_STATIONARY:
-+                    msg = "STATIONARY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LENS_STATE_MOVING:
-+                    msg = "MOVING";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_LENS_INFO_AVAILABLE_APERTURES: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_SHADING_MAP_SIZE: {
-+            break;
-+        }
-+        case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION: {
-+            switch (value) {
-+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED:
-+                    msg = "UNCALIBRATED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE:
-+                    msg = "APPROXIMATE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED:
-+                    msg = "CALIBRATED";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_NOISE_REDUCTION_MODE: {
-+            switch (value) {
-+                case CAMERA_NOISE_REDUCTION_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_NOISE_REDUCTION_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_NOISE_REDUCTION_STRENGTH: {
-+            break;
-+        }
-+        case CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES: {
-+            break;
-+        }
-+
-+        case CAMERA_REQUEST_ID: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_METADATA_MODE: {
-+            switch (value) {
-+                case CAMERA_REQUEST_METADATA_MODE_NONE:
-+                    msg = "NONE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_METADATA_MODE_FULL:
-+                    msg = "FULL";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_PIPELINE_DEPTH: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_PIPELINE_MAX_DEPTH: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_PARTIAL_RESULT_COUNT: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_AVAILABLE_CAPABILITIES: {
-+            switch (value) {
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:
-+                    msg = "BACKWARD_COMPATIBLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
-+                    msg = "MANUAL_SENSOR";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:
-+                    msg = "MANUAL_POST_PROCESSING";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW:
-+                    msg = "RAW";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL:
-+                    msg = "ZSL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:
-+                    msg = "READ_SENSOR_SETTINGS";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:
-+                    msg = "BURST_CAPTURE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_AVAILABLE_RESULT_KEYS: {
-+            break;
-+        }
-+        case CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: {
-+            break;
-+        }
-+
-+        case CAMERA_SCALER_CROP_REGION: {
-+            break;
-+        }
-+        case CAMERA_SCALER_AVAILABLE_JPEG_SIZES: {
-+            break;
-+        }
-+        case CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM: {
-+            break;
-+        }
-+        case CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP: {
-+            break;
-+        }
-+        case CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS: {
-+            break;
-+        }
-+        case CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS: {
-+            break;
-+        }
-+        case CAMERA_SCALER_CROPPING_TYPE: {
-+            switch (value) {
-+                case CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY:
-+                    msg = "CENTER_ONLY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SCALER_CROPPING_TYPE_FREEFORM:
-+                    msg = "FREEFORM";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_SENSOR_EXPOSURE_TIME: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_FRAME_DURATION: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_SENSITIVITY: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_REFERENCE_ILLUMINANT1: {
-+            switch (value) {
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT:
-+                    msg = "DAYLIGHT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT:
-+                    msg = "FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN:
-+                    msg = "TUNGSTEN";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH:
-+                    msg = "FLASH";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER:
-+                    msg = "FINE_WEATHER";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER:
-+                    msg = "CLOUDY_WEATHER";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE:
-+                    msg = "SHADE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT:
-+                    msg = "DAYLIGHT_FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT:
-+                    msg = "DAY_WHITE_FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT:
-+                    msg = "COOL_WHITE_FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT:
-+                    msg = "WHITE_FLUORESCENT";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A:
-+                    msg = "STANDARD_A";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B:
-+                    msg = "STANDARD_B";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C:
-+                    msg = "STANDARD_C";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55:
-+                    msg = "D55";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65:
-+                    msg = "D65";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75:
-+                    msg = "D75";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50:
-+                    msg = "D50";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN:
-+                    msg = "ISO_STUDIO_TUNGSTEN";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_SENSOR_REFERENCE_ILLUMINANT2: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_CALIBRATION_TRANSFORM1: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_CALIBRATION_TRANSFORM2: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_COLOR_TRANSFORM1: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_COLOR_TRANSFORM2: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_FORWARD_MATRIX1: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_FORWARD_MATRIX2: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_BASE_GAIN_FACTOR: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_BLACK_LEVEL_PATTERN: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_ORIENTATION: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_TIMESTAMP: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_TEMPERATURE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_NEUTRAL_COLOR_POINT: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_NOISE_PROFILE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_PROFILE_HUE_SAT_MAP: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_PROFILE_TONE_CURVE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_GREEN_SPLIT: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_TEST_PATTERN_DATA: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_TEST_PATTERN_MODE: {
-+            switch (value) {
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR:
-+                    msg = "SOLID_COLOR";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS:
-+                    msg = "COLOR_BARS";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY:
-+                    msg = "COLOR_BARS_FADE_TO_GRAY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_PN9:
-+                    msg = "PN9";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1:
-+                    msg = "CUSTOM1";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_OPAQUE_RAW_SIZE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_ROLLING_SHUTTER_SKEW: {
-+            break;
-+        }
-+
-+        case CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_SENSITIVITY_RANGE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT: {
-+            switch (value) {
-+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB:
-+                    msg = "RGGB";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG:
-+                    msg = "GRBG";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG:
-+                    msg = "GBRG";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR:
-+                    msg = "BGGR";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB:
-+                    msg = "RGB";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_MAX_FRAME_DURATION: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_PHYSICAL_SIZE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_WHITE_LEVEL: {
-+            break;
-+        }
-+        case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE: {
-+            switch (value) {
-+                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN:
-+                    msg = "UNKNOWN";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME:
-+                    msg = "REALTIME";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_SHADING_MODE: {
-+            switch (value) {
-+                case CAMERA_SHADING_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SHADING_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SHADING_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_SHADING_STRENGTH: {
-+            break;
-+        }
-+
-+        case CAMERA_STATISTICS_FACE_DETECT_MODE: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_FACE_DETECT_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE:
-+                    msg = "SIMPLE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_FACE_DETECT_MODE_FULL:
-+                    msg = "FULL";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_STATISTICS_HISTOGRAM_MODE: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_HISTOGRAM_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_HISTOGRAM_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_STATISTICS_SHARPNESS_MAP_MODE: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_STATISTICS_FACE_IDS: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_FACE_LANDMARKS: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_FACE_RECTANGLES: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_FACE_SCORES: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_HISTOGRAM: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_SHARPNESS_MAP: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_LENS_SHADING_MAP: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_PREDICTED_COLOR_GAINS: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_SCENE_FLICKER: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_SCENE_FLICKER_NONE:
-+                    msg = "NONE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_SCENE_FLICKER_50HZ:
-+                    msg = "50HZ";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_SCENE_FLICKER_60HZ:
-+                    msg = "60HZ";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_STATISTICS_HOT_PIXEL_MAP: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE: {
-+            switch (value) {
-+                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_MAX_FACE_COUNT: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE: {
-+            break;
-+        }
-+        case CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES: {
-+            break;
-+        }
-+
-+        case CAMERA_TONEMAP_CURVE_BLUE: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_CURVE_GREEN: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_CURVE_RED: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_MODE: {
-+            switch (value) {
-+                case CAMERA_TONEMAP_MODE_CONTRAST_CURVE:
-+                    msg = "CONTRAST_CURVE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_TONEMAP_MODE_FAST:
-+                    msg = "FAST";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_TONEMAP_MODE_HIGH_QUALITY:
-+                    msg = "HIGH_QUALITY";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_TONEMAP_MODE_GAMMA_VALUE:
-+                    msg = "GAMMA_VALUE";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_TONEMAP_MODE_PRESET_CURVE:
-+                    msg = "PRESET_CURVE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_TONEMAP_MAX_CURVE_POINTS: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_GAMMA: {
-+            break;
-+        }
-+        case CAMERA_TONEMAP_PRESET_CURVE: {
-+            switch (value) {
-+                case CAMERA_TONEMAP_PRESET_CURVE_SRGB:
-+                    msg = "SRGB";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_TONEMAP_PRESET_CURVE_REC709:
-+                    msg = "REC709";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_LED_TRANSMIT: {
-+            switch (value) {
-+                case CAMERA_LED_TRANSMIT_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_LED_TRANSMIT_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_LED_AVAILABLE_LEDS: {
-+            switch (value) {
-+                case CAMERA_LED_AVAILABLE_LEDS_TRANSMIT:
-+                    msg = "TRANSMIT";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL: {
-+            switch (value) {
-+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
-+                    msg = "LIMITED";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
-+                    msg = "FULL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
-+                    msg = "LEGACY";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_BLACK_LEVEL_LOCK: {
-+            switch (value) {
-+                case CAMERA_BLACK_LEVEL_LOCK_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_BLACK_LEVEL_LOCK_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_SYNC_FRAME_NUMBER: {
-+            switch (value) {
-+                case CAMERA_SYNC_FRAME_NUMBER_CONVERGING:
-+                    msg = "CONVERGING";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SYNC_FRAME_NUMBER_UNKNOWN:
-+                    msg = "UNKNOWN";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case CAMERA_SYNC_MAX_LATENCY: {
-+            switch (value) {
-+                case CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL:
-+                    msg = "PER_FRAME_CONTROL";
-+                    ret = 0;
-+                    break;
-+                case CAMERA_SYNC_MAX_LATENCY_UNKNOWN:
-+                    msg = "UNKNOWN";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case CAMERA_REPROCESS_MAX_CAPTURE_STALL: {
-+            break;
-+        }
-+
-+        case INTEL_INFO_AVAILABLE_FEATURES: {
-+            switch (value) {
-+                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE:
-+                    msg = "MANUAL_EXPOSURE";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE:
-+                    msg = "MANUAL_WHITE_BALANCE";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT:
-+                    msg = "IMAGE_ENHANCEMENT";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION:
-+                    msg = "NOISE_REDUCTION";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE:
-+                    msg = "SCENE_MODE";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE:
-+                    msg = "WEIGHT_GRID_MODE";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL:
-+                    msg = "PER_FRAME_CONTROL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL:
-+                    msg = "ISP_CONTROL";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_INFO_AE_EXPOSURE_TIME_RANGE: {
-+            break;
-+        }
-+        case INTEL_INFO_AE_GAIN_RANGE: {
-+            break;
-+        }
-+        case INTEL_INFO_WFOV: {
-+            switch (value) {
-+                case INTEL_INFO_WFOV_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_WFOV_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_INFO_SENSOR_MOUNT_TYPE: {
-+            switch (value) {
-+                case INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED:
-+                    msg = "WALL_MOUNTED";
-+                    ret = 0;
-+                    break;
-+                case INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER:
-+                    msg = "CEILING_MOUNTER";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+
-+        case INTEL_CONTROL_IMAGE_ENHANCEMENT: {
-+            break;
-+        }
-+        case INTEL_CONTROL_SENSITIVITY_GAIN: {
-+            break;
-+        }
-+        case INTEL_CONTROL_FRAME_RATE: {
-+            break;
-+        }
-+        case INTEL_CONTROL_AE_CONVERGE_SPEED: {
-+            switch (value) {
-+                case INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL:
-+                    msg = "NORMAL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MID:
-+                    msg = "MID";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_CONVERGE_SPEED_LOW:
-+                    msg = "LOW";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_NR_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_NR_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_NR_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_NR_MODE_MANUAL_NORMAL:
-+                    msg = "MANUAL_NORMAL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_NR_MODE_MANUAL_EXPERT:
-+                    msg = "MANUAL_EXPERT";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_NR_LEVEL: {
-+            break;
-+        }
-+        case INTEL_CONTROL_IRIS_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_IRIS_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_IRIS_MODE_MANUAL:
-+                    msg = "MANUAL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_IRIS_MODE_CUSTOMIZED:
-+                    msg = "CUSTOMIZED";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY: {
-+            switch (value) {
-+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER:
-+                    msg = "SHUTTER";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO:
-+                    msg = "ISO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE:
-+                    msg = "APERTURE";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_IRIS_LEVEL: {
-+            break;
-+        }
-+        case INTEL_CONTROL_WDR_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_WDR_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_WDR_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_WDR_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_WDR_LEVEL: {
-+            break;
-+        }
-+        case INTEL_CONTROL_BLC_AREA_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_BLC_AREA_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_BLC_AREA_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_SCENE_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_SCENE_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_SCENE_MODE_HDR:
-+                    msg = "HDR";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_SCENE_MODE_ULL:
-+                    msg = "ULL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_SCENE_MODE_VIDEO_LL:
-+                    msg = "VIDEO_LL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_SCENE_MODE_HDR2:
-+                    msg = "HDR2";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_WEIGHT_GRID_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO:
-+                    msg = "AUTO";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1:
-+                    msg = "CUSTOM_WEIGHT_GRID1";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2:
-+                    msg = "CUSTOM_WEIGHT_GRID2";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3:
-+                    msg = "CUSTOM_WEIGHT_GRID3";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL:
-+                    msg = "HAL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ:
-+                    msg = "AIQ";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_DEINTERLACE_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_DEINTERLACE_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_DEINTERLACE_MODE_WEAVING:
-+                    msg = "WEAVING";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_MAKERNOTE_DATA: {
-+            break;
-+        }
-+        case INTEL_CONTROL_CUSTOM_AIC_PARAM: {
-+            break;
-+        }
-+        case INTEL_CONTROL_MAKERNOTE_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_MAKERNOTE_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_MAKERNOTE_MODE_JPEG:
-+                    msg = "JPEG";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_MAKERNOTE_MODE_RAW:
-+                    msg = "RAW";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_YUV_COLOR_RANGE: {
-+            switch (value) {
-+                case INTEL_CONTROL_YUV_COLOR_RANGE_FULL:
-+                    msg = "FULL";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED:
-+                    msg = "REDUCED";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_SENSITIVITY_GAIN_RANGE: {
-+            break;
-+        }
-+        case INTEL_CONTROL_EXPOSURE_TIME_RANGE: {
-+            break;
-+        }
-+        case INTEL_CONTROL_FISHEYE_DEWARPING_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW:
-+                    msg = "REARVIEW";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW:
-+                    msg = "HITCHVIEW";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_LTM_TUNING_DATA: {
-+            break;
-+        }
-+        case INTEL_CONTROL_DIGITAL_ZOOM_RATIO: {
-+            break;
-+        }
-+        case INTEL_CONTROL_LDC_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_LDC_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_LDC_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_RSC_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_RSC_MODE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_RSC_MODE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_FLIP_MODE: {
-+            switch (value) {
-+                case INTEL_CONTROL_FLIP_MODE_NONE:
-+                    msg = "NONE";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_FLIP_MODE_VFLIP:
-+                    msg = "VFLIP";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_FLIP_MODE_HFLIP:
-+                    msg = "HFLIP";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_FLIP_MODE_VHFLIP:
-+                    msg = "VHFLIP";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_MONO_DOWNSCALE: {
-+            switch (value) {
-+                case INTEL_CONTROL_MONO_DOWNSCALE_OFF:
-+                    msg = "OFF";
-+                    ret = 0;
-+                    break;
-+                case INTEL_CONTROL_MONO_DOWNSCALE_ON:
-+                    msg = "ON";
-+                    ret = 0;
-+                    break;
-+                default:
-+                    msg = "error: enum value out of range";
-+            }
-+            break;
-+        }
-+        case INTEL_CONTROL_RUN3_A_CADENCE: {
-+            break;
-+        }
-+        case INTEL_CONTROL_VIEW_PROJECTION: {
-+            break;
-+        }
-+        case INTEL_CONTROL_VIEW_ROTATION: {
-+            break;
-+        }
-+        case INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS: {
-+            break;
-+        }
-+        case INTEL_CONTROL_CAMERA_ROTATION: {
-+            break;
-+        }
-+
-+        case INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_ENABLED_CTRL_IDS: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_WB_GAINS: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_BXT_CSC: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_BXT_DEMOSAIC: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_SC_IEFD: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_SEE: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_BNLM: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_TNR5_21: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_XNR_DSS: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_GAMMA_TONE_MAP: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_TNR5_22: {
-+            break;
-+        }
-+        case INTEL_CONTROL_ISP_TNR5_25: {
-+            break;
-+        }
-+
-+    }
-+
-+    snprintf(dst, size, "%s", msg);
-+    dst[size - 1] = '\0';
-+
-+    return ret;
-+}
-+
-+#define ICAMERA_METADATA_ENUM_STRING_MAX_SIZE 24
-diff --git a/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
-new file mode 100644
-index 000000000000..76f0c49b8a8a
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
-@@ -0,0 +1,999 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ * Copyright (C) 2015-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ * !! Do not include this file directly !!
-+ *
-+ * Include icamera_metadata_base.h instead.
-+ */
-+
-+/**
-+ * ! Do not edit this file directly !
-+ *
-+ * Generated automatically from icamera_metadata_tags.mako
-+ */
-+
-+/**
-+ * Top level hierarchy definitions for camera metadata. *_INFO sections are for
-+ * the static metadata that can be retrived without opening the camera device.
-+ * New sections must be added right before CAMERA_SECTION_COUNT to maintain
-+ * existing enumerations.
-+ */
-+typedef enum icamera_metadata_section {
-+    CAMERA_AE,
-+    CAMERA_AWB,
-+    CAMERA_AF,
-+    CAMERA_CONTROL,
-+    CAMERA_DEMOSAIC,
-+    CAMERA_EDGE,
-+    CAMERA_FLASH,
-+    CAMERA_FLASH_INFO,
-+    CAMERA_HOT_PIXEL,
-+    CAMERA_JPEG,
-+    CAMERA_LENS,
-+    CAMERA_LENS_INFO,
-+    CAMERA_NOISE_REDUCTION,
-+    CAMERA_REQUEST,
-+    CAMERA_SCALER,
-+    CAMERA_SENSOR,
-+    CAMERA_SENSOR_INFO,
-+    CAMERA_SHADING,
-+    CAMERA_STATISTICS,
-+    CAMERA_STATISTICS_INFO,
-+    CAMERA_TONEMAP,
-+    CAMERA_LED,
-+    CAMERA_INFO,
-+    CAMERA_BLACK_LEVEL,
-+    CAMERA_SYNC,
-+    CAMERA_REPROCESS,
-+    INTEL_INFO,
-+    INTEL_CONTROL,
-+    INTEL_CONTROL_ISP,
-+    CAMERA_SECTION_COUNT
-+} icamera_metadata_section_t;
-+
-+/**
-+ * Hierarchy positions in enum space.
-+ */
-+typedef enum icamera_metadata_section_start {
-+    CAMERA_AE_START                = CAMERA_AE                 << 16,
-+    CAMERA_AWB_START               = CAMERA_AWB                << 16,
-+    CAMERA_AF_START                = CAMERA_AF                 << 16,
-+    CAMERA_CONTROL_START           = CAMERA_CONTROL            << 16,
-+    CAMERA_DEMOSAIC_START          = CAMERA_DEMOSAIC           << 16,
-+    CAMERA_EDGE_START              = CAMERA_EDGE               << 16,
-+    CAMERA_FLASH_START             = CAMERA_FLASH              << 16,
-+    CAMERA_FLASH_INFO_START        = CAMERA_FLASH_INFO         << 16,
-+    CAMERA_HOT_PIXEL_START         = CAMERA_HOT_PIXEL          << 16,
-+    CAMERA_JPEG_START              = CAMERA_JPEG               << 16,
-+    CAMERA_LENS_START              = CAMERA_LENS               << 16,
-+    CAMERA_LENS_INFO_START         = CAMERA_LENS_INFO          << 16,
-+    CAMERA_NOISE_REDUCTION_START   = CAMERA_NOISE_REDUCTION    << 16,
-+    CAMERA_REQUEST_START           = CAMERA_REQUEST            << 16,
-+    CAMERA_SCALER_START            = CAMERA_SCALER             << 16,
-+    CAMERA_SENSOR_START            = CAMERA_SENSOR             << 16,
-+    CAMERA_SENSOR_INFO_START       = CAMERA_SENSOR_INFO        << 16,
-+    CAMERA_SHADING_START           = CAMERA_SHADING            << 16,
-+    CAMERA_STATISTICS_START        = CAMERA_STATISTICS         << 16,
-+    CAMERA_STATISTICS_INFO_START   = CAMERA_STATISTICS_INFO    << 16,
-+    CAMERA_TONEMAP_START           = CAMERA_TONEMAP            << 16,
-+    CAMERA_LED_START               = CAMERA_LED                << 16,
-+    CAMERA_INFO_START              = CAMERA_INFO               << 16,
-+    CAMERA_BLACK_LEVEL_START       = CAMERA_BLACK_LEVEL        << 16,
-+    CAMERA_SYNC_START              = CAMERA_SYNC               << 16,
-+    CAMERA_REPROCESS_START         = CAMERA_REPROCESS          << 16,
-+    INTEL_INFO_START               = INTEL_INFO                << 16,
-+    INTEL_CONTROL_START            = INTEL_CONTROL             << 16,
-+    INTEL_CONTROL_ISP_START        = INTEL_CONTROL_ISP         << 16,
-+} icamera_metadata_section_start_t;
-+
-+/**
-+ * Main enum for defining camera metadata tags.  New entries must always go
-+ * before the section _END tag to preserve existing enumeration values.  In
-+ * addition, the name and type of the tag needs to be added to
-+ * src/metadata/icamera_metadata_tag_info.c
-+ */
-+typedef enum icamera_metadata_tag {
-+    CAMERA_AE_MODE =                                  // enum         | public
-+            CAMERA_AE_START,
-+    CAMERA_AE_LOCK,                                   // enum         | public
-+    CAMERA_AE_REGIONS,                                // int32[]      | public
-+    CAMERA_AE_ANTIBANDING_MODE,                       // enum         | public
-+    CAMERA_AE_COMPENSATION,                           // int32        | public
-+    CAMERA_AE_TARGET_FPS_RANGE,                       // float[]      | public
-+    CAMERA_AE_PRECAPTURE_TRIGGER,                     // enum         | public
-+    CAMERA_AE_STATE,                                  // enum         | public
-+    CAMERA_AE_AVAILABLE_MODES,                        // byte[]       | public
-+    CAMERA_AE_AVAILABLE_ANTIBANDING_MODES,            // byte[]       | public
-+    CAMERA_AE_COMPENSATION_STEP,                      // rational     | public
-+    CAMERA_AE_COMPENSATION_RANGE,                     // int32[]      | public
-+    CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES,            // float[]      | public
-+    CAMERA_AE_LOCK_AVAILABLE,                         // enum         | public
-+    CAMERA_AE_END,
-+
-+    CAMERA_AWB_MODE =                                 // enum         | public
-+            CAMERA_AWB_START,
-+    CAMERA_AWB_COLOR_TRANSFORM,                       // float[]      | public
-+    CAMERA_AWB_COLOR_GAINS,                           // float[]      | public
-+    CAMERA_AWB_LOCK,                                  // enum         | public
-+    CAMERA_AWB_REGIONS,                               // int32[]      | public
-+    CAMERA_AWB_CCT_RANGE,                             // int32[]      | public
-+    CAMERA_AWB_GAINS,                                 // int32[]      | public
-+    CAMERA_AWB_GAIN_SHIFT,                            // int32[]      | public
-+    CAMERA_AWB_WHITE_POINT,                           // int32[]      | public
-+    CAMERA_AWB_CONVERGE_SPEED,                        // enum         | public
-+    CAMERA_AWB_CONVERGE_SPEED_MODE,                   // enum         | public
-+    CAMERA_AWB_STATE,                                 // enum         | public
-+    CAMERA_AWB_RESULT,                                // byte[]       | public
-+    CAMERA_AWB_AVAILABLE_MODES,                       // byte[]       | public
-+    CAMERA_AWB_LOCK_AVAILABLE,                        // enum         | public
-+    CAMERA_AWB_END,
-+
-+    CAMERA_AF_MODE =                                  // enum         | public
-+            CAMERA_AF_START,
-+    CAMERA_AF_REGIONS,                                // int32[]      | public
-+    CAMERA_AF_TRIGGER,                                // enum         | public
-+    CAMERA_AF_AVAILABLE_MODES,                        // byte[]       | public
-+    CAMERA_AF_STATE,                                  // enum         | public
-+    CAMERA_AF_END,
-+
-+    CAMERA_CONTROL_EFFECT_MODE =                      // enum         | public
-+            CAMERA_CONTROL_START,
-+    CAMERA_CONTROL_MODE,                              // enum         | public
-+    CAMERA_CONTROL_SCENE_MODE,                        // enum         | public
-+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE,          // enum         | public
-+    CAMERA_CONTROL_AVAILABLE_EFFECTS,                 // byte[]       | public
-+    CAMERA_CONTROL_AVAILABLE_MODES,                   // byte[]       | public
-+    CAMERA_CONTROL_AVAILABLE_SCENE_MODES,             // byte[]       | public
-+    CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
-+                                                      // byte[]       | public
-+    CAMERA_CONTROL_MAX_REGIONS,                       // int32[]      | hidden
-+    CAMERA_CONTROL_SCENE_MODE_OVERRIDES,              // byte[]       | system
-+    CAMERA_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS,
-+                                                      // int32[]      | hidden
-+    CAMERA_CONTROL_END,
-+
-+    CAMERA_DEMOSAIC_MODE =                            // enum         | system
-+            CAMERA_DEMOSAIC_START,
-+    CAMERA_DEMOSAIC_END,
-+
-+    CAMERA_EDGE_MODE =                                // enum         | public
-+            CAMERA_EDGE_START,
-+    CAMERA_EDGE_STRENGTH,                             // byte         | system
-+    CAMERA_EDGE_AVAILABLE_EDGE_MODES,                 // byte[]       | public
-+    CAMERA_EDGE_END,
-+
-+    CAMERA_FLASH_FIRING_POWER =                       // byte         | system
-+            CAMERA_FLASH_START,
-+    CAMERA_FLASH_FIRING_TIME,                         // int64        | system
-+    CAMERA_FLASH_MODE,                                // enum         | public
-+    CAMERA_FLASH_COLOR_TEMPERATURE,                   // byte         | system
-+    CAMERA_FLASH_MAX_ENERGY,                          // byte         | system
-+    CAMERA_FLASH_STATE,                               // enum         | public
-+    CAMERA_FLASH_END,
-+
-+    CAMERA_FLASH_INFO_AVAILABLE =                     // enum         | public
-+            CAMERA_FLASH_INFO_START,
-+    CAMERA_FLASH_INFO_CHARGE_DURATION,                // int64        | system
-+    CAMERA_FLASH_INFO_END,
-+
-+    CAMERA_HOT_PIXEL_MODE =                           // enum         | public
-+            CAMERA_HOT_PIXEL_START,
-+    CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,       // byte[]       | public
-+    CAMERA_HOT_PIXEL_END,
-+
-+    CAMERA_JPEG_GPS_COORDINATES =                     // double[]     | hidden
-+            CAMERA_JPEG_START,
-+    CAMERA_JPEG_GPS_PROCESSING_METHOD,                // byte         | hidden
-+    CAMERA_JPEG_GPS_TIMESTAMP,                        // int64        | hidden
-+    CAMERA_JPEG_ORIENTATION,                          // int32        | public
-+    CAMERA_JPEG_QUALITY,                              // byte         | public
-+    CAMERA_JPEG_THUMBNAIL_QUALITY,                    // byte         | public
-+    CAMERA_JPEG_THUMBNAIL_SIZE,                       // int32[]      | public
-+    CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES,            // int32[]      | public
-+    CAMERA_JPEG_MAX_SIZE,                             // int32        | system
-+    CAMERA_JPEG_SIZE,                                 // int32        | system
-+    CAMERA_JPEG_END,
-+
-+    CAMERA_LENS_APERTURE =                            // float        | public
-+            CAMERA_LENS_START,
-+    CAMERA_LENS_FILTER_DENSITY,                       // float        | public
-+    CAMERA_LENS_FOCAL_LENGTH,                         // float        | public
-+    CAMERA_LENS_FOCUS_DISTANCE,                       // float        | public
-+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE,           // enum         | public
-+    CAMERA_LENS_FACING,                               // enum         | public
-+    CAMERA_LENS_FOCUS_RANGE,                          // float[]      | public
-+    CAMERA_LENS_STATE,                                // enum         | public
-+    CAMERA_LENS_END,
-+
-+    CAMERA_LENS_INFO_AVAILABLE_APERTURES =            // float[]      | public
-+            CAMERA_LENS_INFO_START,
-+    CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES,      // float[]      | public
-+    CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,         // float[]      | public
-+    CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, // byte[]       | public
-+    CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE,             // float        | public
-+    CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE,          // float        | public
-+    CAMERA_LENS_INFO_SHADING_MAP_SIZE,                // int32[]      | hidden
-+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,      // enum         | public
-+    CAMERA_LENS_INFO_END,
-+
-+    CAMERA_NOISE_REDUCTION_MODE =                     // enum         | public
-+            CAMERA_NOISE_REDUCTION_START,
-+    CAMERA_NOISE_REDUCTION_STRENGTH,                  // byte         | system
-+    CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
-+                                                      // byte[]       | public
-+    CAMERA_NOISE_REDUCTION_END,
-+
-+    CAMERA_REQUEST_ID =                               // int32        | hidden
-+            CAMERA_REQUEST_START,
-+    CAMERA_REQUEST_METADATA_MODE,                     // enum         | system
-+    CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS,            // int32[]      | hidden
-+    CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS,             // int32        | hidden
-+    CAMERA_REQUEST_PIPELINE_DEPTH,                    // byte         | public
-+    CAMERA_REQUEST_PIPELINE_MAX_DEPTH,                // byte         | public
-+    CAMERA_REQUEST_PARTIAL_RESULT_COUNT,              // int32        | public
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES,            // enum[]       | public
-+    CAMERA_REQUEST_AVAILABLE_REQUEST_KEYS,            // int32[]      | hidden
-+    CAMERA_REQUEST_AVAILABLE_RESULT_KEYS,             // int32[]      | hidden
-+    CAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,    // int32[]      | hidden
-+    CAMERA_REQUEST_END,
-+
-+    CAMERA_SCALER_CROP_REGION =                       // int32[]      | public
-+            CAMERA_SCALER_START,
-+    CAMERA_SCALER_AVAILABLE_JPEG_SIZES,               // int32[]      | hidden
-+    CAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,         // float        | public
-+    CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, // int32[]      | hidden
-+    CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,    // int32[]      | hidden
-+    CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,      // int64[]      | hidden
-+    CAMERA_SCALER_CROPPING_TYPE,                      // enum         | public
-+    CAMERA_SCALER_END,
-+
-+    CAMERA_SENSOR_EXPOSURE_TIME =                     // int64        | public
-+            CAMERA_SENSOR_START,
-+    CAMERA_SENSOR_FRAME_DURATION,                     // int64        | public
-+    CAMERA_SENSOR_SENSITIVITY,                        // int32        | public
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1,              // enum         | public
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT2,              // byte         | public
-+    CAMERA_SENSOR_CALIBRATION_TRANSFORM1,             // rational[]   | public
-+    CAMERA_SENSOR_CALIBRATION_TRANSFORM2,             // rational[]   | public
-+    CAMERA_SENSOR_COLOR_TRANSFORM1,                   // rational[]   | public
-+    CAMERA_SENSOR_COLOR_TRANSFORM2,                   // rational[]   | public
-+    CAMERA_SENSOR_FORWARD_MATRIX1,                    // rational[]   | public
-+    CAMERA_SENSOR_FORWARD_MATRIX2,                    // rational[]   | public
-+    CAMERA_SENSOR_BASE_GAIN_FACTOR,                   // rational     | system
-+    CAMERA_SENSOR_BLACK_LEVEL_PATTERN,                // int32[]      | public
-+    CAMERA_SENSOR_MAX_ANALOG_SENSITIVITY,             // int32        | public
-+    CAMERA_SENSOR_ORIENTATION,                        // int32        | public
-+    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS,     // int32[]      | system
-+    CAMERA_SENSOR_TIMESTAMP,                          // int64        | public
-+    CAMERA_SENSOR_TEMPERATURE,                        // float        | system
-+    CAMERA_SENSOR_NEUTRAL_COLOR_POINT,                // rational[]   | public
-+    CAMERA_SENSOR_NOISE_PROFILE,                      // double[]     | public
-+    CAMERA_SENSOR_PROFILE_HUE_SAT_MAP,                // float[]      | system
-+    CAMERA_SENSOR_PROFILE_TONE_CURVE,                 // float[]      | system
-+    CAMERA_SENSOR_GREEN_SPLIT,                        // float        | public
-+    CAMERA_SENSOR_TEST_PATTERN_DATA,                  // int32[]      | public
-+    CAMERA_SENSOR_TEST_PATTERN_MODE,                  // enum         | public
-+    CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES,       // int32[]      | public
-+    CAMERA_SENSOR_OPAQUE_RAW_SIZE,                    // int32[]      | system
-+    CAMERA_SENSOR_ROLLING_SHUTTER_SKEW,               // int64        | public
-+    CAMERA_SENSOR_END,
-+
-+    CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE =            // int32[]      | public
-+            CAMERA_SENSOR_INFO_START,
-+    CAMERA_SENSOR_INFO_SENSITIVITY_RANGE,             // int32[]      | public
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,      // enum         | public
-+    CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE,           // int64[]      | public
-+    CAMERA_SENSOR_INFO_MAX_FRAME_DURATION,            // int64        | public
-+    CAMERA_SENSOR_INFO_PHYSICAL_SIZE,                 // float[]      | public
-+    CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE,              // int32[]      | public
-+    CAMERA_SENSOR_INFO_WHITE_LEVEL,                   // int32        | public
-+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE,              // enum         | public
-+    CAMERA_SENSOR_INFO_END,
-+
-+    CAMERA_SHADING_MODE =                             // enum         | public
-+            CAMERA_SHADING_START,
-+    CAMERA_SHADING_STRENGTH,                          // byte         | system
-+    CAMERA_SHADING_END,
-+
-+    CAMERA_STATISTICS_FACE_DETECT_MODE =              // enum         | public
-+            CAMERA_STATISTICS_START,
-+    CAMERA_STATISTICS_HISTOGRAM_MODE,                 // enum         | system
-+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE,             // enum         | system
-+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE,             // enum         | public
-+    CAMERA_STATISTICS_FACE_IDS,                       // int32[]      | hidden
-+    CAMERA_STATISTICS_FACE_LANDMARKS,                 // int32[]      | hidden
-+    CAMERA_STATISTICS_FACE_RECTANGLES,                // int32[]      | hidden
-+    CAMERA_STATISTICS_FACE_SCORES,                    // byte[]       | hidden
-+    CAMERA_STATISTICS_HISTOGRAM,                      // int32[]      | system
-+    CAMERA_STATISTICS_SHARPNESS_MAP,                  // int32[]      | system
-+    CAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP,    // byte         | public
-+    CAMERA_STATISTICS_LENS_SHADING_MAP,               // float[]      | hidden
-+    CAMERA_STATISTICS_PREDICTED_COLOR_GAINS,          // float[]      | hidden
-+    CAMERA_STATISTICS_PREDICTED_COLOR_TRANSFORM,      // rational[]   | hidden
-+    CAMERA_STATISTICS_SCENE_FLICKER,                  // enum         | public
-+    CAMERA_STATISTICS_HOT_PIXEL_MAP,                  // int32[]      | public
-+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE,          // enum         | public
-+    CAMERA_STATISTICS_END,
-+
-+    CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES = 
-+                                                      // byte[]       | public
-+            CAMERA_STATISTICS_INFO_START,
-+    CAMERA_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,    // int32        | system
-+    CAMERA_STATISTICS_INFO_MAX_FACE_COUNT,            // int32        | public
-+    CAMERA_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,       // int32        | system
-+    CAMERA_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,   // int32        | system
-+    CAMERA_STATISTICS_INFO_SHARPNESS_MAP_SIZE,        // int32[]      | system
-+    CAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES,
-+                                                      // byte[]       | public
-+    CAMERA_STATISTICS_INFO_END,
-+
-+    CAMERA_TONEMAP_CURVE_BLUE =                       // float[]      | public
-+            CAMERA_TONEMAP_START,
-+    CAMERA_TONEMAP_CURVE_GREEN,                       // float[]      | public
-+    CAMERA_TONEMAP_CURVE_RED,                         // float[]      | public
-+    CAMERA_TONEMAP_MODE,                              // enum         | public
-+    CAMERA_TONEMAP_MAX_CURVE_POINTS,                  // int32        | public
-+    CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES,          // byte[]       | public
-+    CAMERA_TONEMAP_GAMMA,                             // float        | public
-+    CAMERA_TONEMAP_PRESET_CURVE,                      // enum         | public
-+    CAMERA_TONEMAP_END,
-+
-+    CAMERA_LED_TRANSMIT =                             // enum         | hidden
-+            CAMERA_LED_START,
-+    CAMERA_LED_AVAILABLE_LEDS,                        // enum[]       | hidden
-+    CAMERA_LED_END,
-+
-+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL =            // enum         | public
-+            CAMERA_INFO_START,
-+    CAMERA_INFO_END,
-+
-+    CAMERA_BLACK_LEVEL_LOCK =                         // enum         | public
-+            CAMERA_BLACK_LEVEL_START,
-+    CAMERA_BLACK_LEVEL_END,
-+
-+    CAMERA_SYNC_FRAME_NUMBER =                        // enum         | hidden
-+            CAMERA_SYNC_START,
-+    CAMERA_SYNC_MAX_LATENCY,                          // enum         | public
-+    CAMERA_SYNC_END,
-+
-+    CAMERA_REPROCESS_MAX_CAPTURE_STALL =              // int32        | public
-+            CAMERA_REPROCESS_START,
-+    CAMERA_REPROCESS_END,
-+
-+    INTEL_INFO_AVAILABLE_FEATURES =                   // enum[]       | public
-+            INTEL_INFO_START,
-+    INTEL_INFO_AE_EXPOSURE_TIME_RANGE,                // int32[]      | public
-+    INTEL_INFO_AE_GAIN_RANGE,                         // int32[]      | public
-+    INTEL_INFO_WFOV,                                  // enum         | public
-+    INTEL_INFO_SENSOR_MOUNT_TYPE,                     // enum         | public
-+    INTEL_INFO_END,
-+
-+    INTEL_CONTROL_IMAGE_ENHANCEMENT =                 // int32        | public
-+            INTEL_CONTROL_START,
-+    INTEL_CONTROL_SENSITIVITY_GAIN,                   // float        | public
-+    INTEL_CONTROL_FRAME_RATE,                         // float        | public
-+    INTEL_CONTROL_AE_CONVERGE_SPEED,                  // enum         | public
-+    INTEL_CONTROL_NR_MODE,                            // enum         | public
-+    INTEL_CONTROL_NR_LEVEL,                           // int32[]      | public
-+    INTEL_CONTROL_IRIS_MODE,                          // enum         | public
-+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY,           // enum         | public
-+    INTEL_CONTROL_IRIS_LEVEL,                         // int32        | public
-+    INTEL_CONTROL_WDR_MODE,                           // enum         | public
-+    INTEL_CONTROL_WDR_LEVEL,                          // byte         | public
-+    INTEL_CONTROL_BLC_AREA_MODE,                      // enum         | public
-+    INTEL_CONTROL_SCENE_MODE,                         // enum         | public
-+    INTEL_CONTROL_WEIGHT_GRID_MODE,                   // enum         | public
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE,             // enum         | public
-+    INTEL_CONTROL_DEINTERLACE_MODE,                   // enum         | public
-+    INTEL_CONTROL_MAKERNOTE_DATA,                     // byte         | public
-+    INTEL_CONTROL_CUSTOM_AIC_PARAM,                   // byte         | public
-+    INTEL_CONTROL_MAKERNOTE_MODE,                     // enum         | public
-+    INTEL_CONTROL_YUV_COLOR_RANGE,                    // enum         | public
-+    INTEL_CONTROL_SENSITIVITY_GAIN_RANGE,             // float[]      | public
-+    INTEL_CONTROL_EXPOSURE_TIME_RANGE,                // int32[]      | public
-+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE,             // enum         | public
-+    INTEL_CONTROL_LTM_TUNING_DATA,                    // byte[]       | public
-+    INTEL_CONTROL_DIGITAL_ZOOM_RATIO,                 // float        | public
-+    INTEL_CONTROL_LDC_MODE,                           // enum         | public
-+    INTEL_CONTROL_RSC_MODE,                           // enum         | public
-+    INTEL_CONTROL_FLIP_MODE,                          // enum         | public
-+    INTEL_CONTROL_MONO_DOWNSCALE,                     // enum         | public
-+    INTEL_CONTROL_RUN3_A_CADENCE,                     // int32        | public
-+    INTEL_CONTROL_VIEW_PROJECTION,                    // byte[]       | public
-+    INTEL_CONTROL_VIEW_ROTATION,                      // byte[]       | public
-+    INTEL_CONTROL_VIEW_FINE_ADJUSTMENTS,              // byte[]       | public
-+    INTEL_CONTROL_CAMERA_ROTATION,                    // byte[]       | public
-+    INTEL_CONTROL_END,
-+
-+    INTEL_CONTROL_ISP_SUPPORTED_CTRL_IDS =            // int32[]      | public
-+            INTEL_CONTROL_ISP_START,
-+    INTEL_CONTROL_ISP_ENABLED_CTRL_IDS,               // int32[]      | public
-+    INTEL_CONTROL_ISP_WB_GAINS,                       // byte[]       | public
-+    INTEL_CONTROL_ISP_COLOR_CORRECTION_MATRIX,        // byte[]       | public
-+    INTEL_CONTROL_ISP_ADVANCED_COLOR_CORRECTION_MATRIX,
-+                                                      // byte[]       | public
-+    INTEL_CONTROL_ISP_BXT_CSC,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_BXT_DEMOSAIC,                   // byte[]       | public
-+    INTEL_CONTROL_ISP_SC_IEFD,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_SEE,                            // byte[]       | public
-+    INTEL_CONTROL_ISP_BNLM,                           // byte[]       | public
-+    INTEL_CONTROL_ISP_TNR5_21,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_XNR_DSS,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_GAMMA_TONE_MAP,                 // byte[]       | public
-+    INTEL_CONTROL_ISP_TNR5_22,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_TNR5_25,                        // byte[]       | public
-+    INTEL_CONTROL_ISP_END,
-+
-+} icamera_metadata_tag_t;
-+
-+/**
-+ * Enumeration definitions for the various entries that need them
-+ */
-+
-+// CAMERA_AE_MODE
-+typedef enum icamera_metadata_enum_camera_ae_mode {
-+    CAMERA_AE_MODE_MANUAL,
-+    CAMERA_AE_MODE_AUTO,
-+} icamera_metadata_enum_camera_ae_mode_t;
-+
-+// CAMERA_AE_LOCK
-+typedef enum icamera_metadata_enum_camera_ae_lock {
-+    CAMERA_AE_LOCK_OFF,
-+    CAMERA_AE_LOCK_ON,
-+} icamera_metadata_enum_camera_ae_lock_t;
-+
-+// CAMERA_AE_ANTIBANDING_MODE
-+typedef enum icamera_metadata_enum_camera_ae_antibanding_mode {
-+    CAMERA_AE_ANTIBANDING_MODE_AUTO,
-+    CAMERA_AE_ANTIBANDING_MODE_50HZ,
-+    CAMERA_AE_ANTIBANDING_MODE_60HZ,
-+    CAMERA_AE_ANTIBANDING_MODE_OFF,
-+} icamera_metadata_enum_camera_ae_antibanding_mode_t;
-+
-+// CAMERA_AE_PRECAPTURE_TRIGGER
-+typedef enum icamera_metadata_enum_camera_ae_precapture_trigger {
-+    CAMERA_AE_PRECAPTURE_TRIGGER_IDLE,
-+    CAMERA_AE_PRECAPTURE_TRIGGER_START,
-+} icamera_metadata_enum_camera_ae_precapture_trigger_t;
-+
-+// CAMERA_AE_STATE
-+typedef enum icamera_metadata_enum_camera_ae_state {
-+    CAMERA_AE_STATE_INACTIVE,
-+    CAMERA_AE_STATE_SEARCHING,
-+    CAMERA_AE_STATE_CONVERGED,
-+    CAMERA_AE_STATE_LOCKED,
-+    CAMERA_AE_STATE_FLASH_REQUIRED,
-+    CAMERA_AE_STATE_PRECAPTURE,
-+} icamera_metadata_enum_camera_ae_state_t;
-+
-+// CAMERA_AE_LOCK_AVAILABLE
-+typedef enum icamera_metadata_enum_camera_ae_lock_available {
-+    CAMERA_AE_LOCK_AVAILABLE_FALSE,
-+    CAMERA_AE_LOCK_AVAILABLE_TRUE,
-+} icamera_metadata_enum_camera_ae_lock_available_t;
-+
-+// CAMERA_AWB_MODE
-+typedef enum icamera_metadata_enum_camera_awb_mode {
-+    CAMERA_AWB_MODE_AUTO,
-+    CAMERA_AWB_MODE_INCANDESCENT,
-+    CAMERA_AWB_MODE_FLUORESCENT,
-+    CAMERA_AWB_MODE_DAYLIGHT,
-+    CAMERA_AWB_MODE_FULL_OVERCAST,
-+    CAMERA_AWB_MODE_PARTLY_OVERCAST,
-+    CAMERA_AWB_MODE_SUNSET,
-+    CAMERA_AWB_MODE_VIDEO_CONFERENCE,
-+    CAMERA_AWB_MODE_MANUAL_CCT_RANGE,
-+    CAMERA_AWB_MODE_MANUAL_WHITE_POINT,
-+    CAMERA_AWB_MODE_MANUAL_GAIN,
-+    CAMERA_AWB_MODE_MANUAL_COLOR_TRANSFORM,
-+} icamera_metadata_enum_camera_awb_mode_t;
-+
-+// CAMERA_AWB_LOCK
-+typedef enum icamera_metadata_enum_camera_awb_lock {
-+    CAMERA_AWB_LOCK_OFF,
-+    CAMERA_AWB_LOCK_ON,
-+} icamera_metadata_enum_camera_awb_lock_t;
-+
-+// CAMERA_AWB_CONVERGE_SPEED
-+typedef enum icamera_metadata_enum_camera_awb_converge_speed {
-+    CAMERA_AWB_CONVERGE_SPEED_NORMAL,
-+    CAMERA_AWB_CONVERGE_SPEED_MID,
-+    CAMERA_AWB_CONVERGE_SPEED_LOW,
-+} icamera_metadata_enum_camera_awb_converge_speed_t;
-+
-+// CAMERA_AWB_CONVERGE_SPEED_MODE
-+typedef enum icamera_metadata_enum_camera_awb_converge_speed_mode {
-+    CAMERA_AWB_CONVERGE_SPEED_MODE_HAL,
-+    CAMERA_AWB_CONVERGE_SPEED_MODE_AIQ,
-+} icamera_metadata_enum_camera_awb_converge_speed_mode_t;
-+
-+// CAMERA_AWB_STATE
-+typedef enum icamera_metadata_enum_camera_awb_state {
-+    CAMERA_AWB_STATE_INACTIVE,
-+    CAMERA_AWB_STATE_SEARCHING,
-+    CAMERA_AWB_STATE_CONVERGED,
-+    CAMERA_AWB_STATE_LOCKED,
-+} icamera_metadata_enum_camera_awb_state_t;
-+
-+// CAMERA_AWB_LOCK_AVAILABLE
-+typedef enum icamera_metadata_enum_camera_awb_lock_available {
-+    CAMERA_AWB_LOCK_AVAILABLE_FALSE,
-+    CAMERA_AWB_LOCK_AVAILABLE_TRUE,
-+} icamera_metadata_enum_camera_awb_lock_available_t;
-+
-+// CAMERA_AF_MODE
-+typedef enum icamera_metadata_enum_camera_af_mode {
-+    CAMERA_AF_MODE_OFF,
-+    CAMERA_AF_MODE_AUTO,
-+    CAMERA_AF_MODE_MACRO,
-+    CAMERA_AF_MODE_CONTINUOUS_VIDEO,
-+    CAMERA_AF_MODE_CONTINUOUS_PICTURE,
-+    CAMERA_AF_MODE_EDOF,
-+} icamera_metadata_enum_camera_af_mode_t;
-+
-+// CAMERA_AF_TRIGGER
-+typedef enum icamera_metadata_enum_camera_af_trigger {
-+    CAMERA_AF_TRIGGER_IDLE,
-+    CAMERA_AF_TRIGGER_START,
-+    CAMERA_AF_TRIGGER_CANCEL,
-+} icamera_metadata_enum_camera_af_trigger_t;
-+
-+// CAMERA_AF_STATE
-+typedef enum icamera_metadata_enum_camera_af_state {
-+    CAMERA_AF_STATE_INACTIVE,
-+    CAMERA_AF_STATE_PASSIVE_SCAN,
-+    CAMERA_AF_STATE_PASSIVE_FOCUSED,
-+    CAMERA_AF_STATE_ACTIVE_SCAN,
-+    CAMERA_AF_STATE_FOCUSED_LOCKED,
-+    CAMERA_AF_STATE_NOT_FOCUSED_LOCKED,
-+    CAMERA_AF_STATE_PASSIVE_UNFOCUSED,
-+} icamera_metadata_enum_camera_af_state_t;
-+
-+// CAMERA_CONTROL_EFFECT_MODE
-+typedef enum icamera_metadata_enum_camera_control_effect_mode {
-+    CAMERA_CONTROL_EFFECT_MODE_OFF,
-+    CAMERA_CONTROL_EFFECT_MODE_MONO,
-+    CAMERA_CONTROL_EFFECT_MODE_NEGATIVE,
-+    CAMERA_CONTROL_EFFECT_MODE_SOLARIZE,
-+    CAMERA_CONTROL_EFFECT_MODE_SEPIA,
-+    CAMERA_CONTROL_EFFECT_MODE_POSTERIZE,
-+    CAMERA_CONTROL_EFFECT_MODE_WHITEBOARD,
-+    CAMERA_CONTROL_EFFECT_MODE_BLACKBOARD,
-+    CAMERA_CONTROL_EFFECT_MODE_AQUA,
-+} icamera_metadata_enum_camera_control_effect_mode_t;
-+
-+// CAMERA_CONTROL_MODE
-+typedef enum icamera_metadata_enum_camera_control_mode {
-+    CAMERA_CONTROL_MODE_OFF,
-+    CAMERA_CONTROL_MODE_AUTO,
-+    CAMERA_CONTROL_MODE_USE_SCENE_MODE,
-+    CAMERA_CONTROL_MODE_OFF_KEEP_STATE,
-+} icamera_metadata_enum_camera_control_mode_t;
-+
-+// CAMERA_CONTROL_SCENE_MODE
-+typedef enum icamera_metadata_enum_camera_control_scene_mode {
-+    CAMERA_CONTROL_SCENE_MODE_DISABLED                          = 0,
-+    CAMERA_CONTROL_SCENE_MODE_FACE_PRIORITY,
-+    CAMERA_CONTROL_SCENE_MODE_ACTION,
-+    CAMERA_CONTROL_SCENE_MODE_PORTRAIT,
-+    CAMERA_CONTROL_SCENE_MODE_LANDSCAPE,
-+    CAMERA_CONTROL_SCENE_MODE_NIGHT,
-+    CAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT,
-+    CAMERA_CONTROL_SCENE_MODE_THEATRE,
-+    CAMERA_CONTROL_SCENE_MODE_BEACH,
-+    CAMERA_CONTROL_SCENE_MODE_SNOW,
-+    CAMERA_CONTROL_SCENE_MODE_SUNSET,
-+    CAMERA_CONTROL_SCENE_MODE_STEADYPHOTO,
-+    CAMERA_CONTROL_SCENE_MODE_FIREWORKS,
-+    CAMERA_CONTROL_SCENE_MODE_SPORTS,
-+    CAMERA_CONTROL_SCENE_MODE_PARTY,
-+    CAMERA_CONTROL_SCENE_MODE_CANDLELIGHT,
-+    CAMERA_CONTROL_SCENE_MODE_BARCODE,
-+    CAMERA_CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO,
-+    CAMERA_CONTROL_SCENE_MODE_HDR,
-+} icamera_metadata_enum_camera_control_scene_mode_t;
-+
-+// CAMERA_CONTROL_VIDEO_STABILIZATION_MODE
-+typedef enum icamera_metadata_enum_camera_control_video_stabilization_mode {
-+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_OFF,
-+    CAMERA_CONTROL_VIDEO_STABILIZATION_MODE_ON,
-+} icamera_metadata_enum_camera_control_video_stabilization_mode_t;
-+
-+// CAMERA_DEMOSAIC_MODE
-+typedef enum icamera_metadata_enum_camera_demosaic_mode {
-+    CAMERA_DEMOSAIC_MODE_FAST,
-+    CAMERA_DEMOSAIC_MODE_HIGH_QUALITY,
-+} icamera_metadata_enum_camera_demosaic_mode_t;
-+
-+// CAMERA_EDGE_MODE
-+typedef enum icamera_metadata_enum_camera_edge_mode {
-+    CAMERA_EDGE_MODE_OFF,
-+    CAMERA_EDGE_MODE_FAST,
-+    CAMERA_EDGE_MODE_HIGH_QUALITY,
-+} icamera_metadata_enum_camera_edge_mode_t;
-+
-+// CAMERA_FLASH_MODE
-+typedef enum icamera_metadata_enum_camera_flash_mode {
-+    CAMERA_FLASH_MODE_OFF,
-+    CAMERA_FLASH_MODE_SINGLE,
-+    CAMERA_FLASH_MODE_TORCH,
-+} icamera_metadata_enum_camera_flash_mode_t;
-+
-+// CAMERA_FLASH_STATE
-+typedef enum icamera_metadata_enum_camera_flash_state {
-+    CAMERA_FLASH_STATE_UNAVAILABLE,
-+    CAMERA_FLASH_STATE_CHARGING,
-+    CAMERA_FLASH_STATE_READY,
-+    CAMERA_FLASH_STATE_FIRED,
-+    CAMERA_FLASH_STATE_PARTIAL,
-+} icamera_metadata_enum_camera_flash_state_t;
-+
-+// CAMERA_FLASH_INFO_AVAILABLE
-+typedef enum icamera_metadata_enum_camera_flash_info_available {
-+    CAMERA_FLASH_INFO_AVAILABLE_FALSE,
-+    CAMERA_FLASH_INFO_AVAILABLE_TRUE,
-+} icamera_metadata_enum_camera_flash_info_available_t;
-+
-+// CAMERA_HOT_PIXEL_MODE
-+typedef enum icamera_metadata_enum_camera_hot_pixel_mode {
-+    CAMERA_HOT_PIXEL_MODE_OFF,
-+    CAMERA_HOT_PIXEL_MODE_FAST,
-+    CAMERA_HOT_PIXEL_MODE_HIGH_QUALITY,
-+} icamera_metadata_enum_camera_hot_pixel_mode_t;
-+
-+// CAMERA_LENS_OPTICAL_STABILIZATION_MODE
-+typedef enum icamera_metadata_enum_camera_lens_optical_stabilization_mode {
-+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_OFF,
-+    CAMERA_LENS_OPTICAL_STABILIZATION_MODE_ON,
-+} icamera_metadata_enum_camera_lens_optical_stabilization_mode_t;
-+
-+// CAMERA_LENS_FACING
-+typedef enum icamera_metadata_enum_camera_lens_facing {
-+    CAMERA_LENS_FACING_FRONT,
-+    CAMERA_LENS_FACING_BACK,
-+} icamera_metadata_enum_camera_lens_facing_t;
-+
-+// CAMERA_LENS_STATE
-+typedef enum icamera_metadata_enum_camera_lens_state {
-+    CAMERA_LENS_STATE_STATIONARY,
-+    CAMERA_LENS_STATE_MOVING,
-+} icamera_metadata_enum_camera_lens_state_t;
-+
-+// CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
-+typedef enum icamera_metadata_enum_camera_lens_info_focus_distance_calibration {
-+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED,
-+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE,
-+    CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED,
-+} icamera_metadata_enum_camera_lens_info_focus_distance_calibration_t;
-+
-+// CAMERA_NOISE_REDUCTION_MODE
-+typedef enum icamera_metadata_enum_camera_noise_reduction_mode {
-+    CAMERA_NOISE_REDUCTION_MODE_OFF,
-+    CAMERA_NOISE_REDUCTION_MODE_FAST,
-+    CAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY,
-+} icamera_metadata_enum_camera_noise_reduction_mode_t;
-+
-+// CAMERA_REQUEST_METADATA_MODE
-+typedef enum icamera_metadata_enum_camera_request_metadata_mode {
-+    CAMERA_REQUEST_METADATA_MODE_NONE,
-+    CAMERA_REQUEST_METADATA_MODE_FULL,
-+} icamera_metadata_enum_camera_request_metadata_mode_t;
-+
-+// CAMERA_REQUEST_AVAILABLE_CAPABILITIES
-+typedef enum icamera_metadata_enum_camera_request_available_capabilities {
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_RAW,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_ZSL,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS,
-+    CAMERA_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE,
-+} icamera_metadata_enum_camera_request_available_capabilities_t;
-+
-+// CAMERA_SCALER_CROPPING_TYPE
-+typedef enum icamera_metadata_enum_camera_scaler_cropping_type {
-+    CAMERA_SCALER_CROPPING_TYPE_CENTER_ONLY,
-+    CAMERA_SCALER_CROPPING_TYPE_FREEFORM,
-+} icamera_metadata_enum_camera_scaler_cropping_type_t;
-+
-+// CAMERA_SENSOR_REFERENCE_ILLUMINANT1
-+typedef enum icamera_metadata_enum_camera_sensor_reference_illuminant1 {
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT                = 1,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT             = 2,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN                = 3,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FLASH                   = 4,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER            = 9,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER          = 10,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_SHADE                   = 11,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT    = 12,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT   = 13,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT  = 14,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT       = 15,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A              = 17,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B              = 18,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C              = 19,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D55                     = 20,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D65                     = 21,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D75                     = 22,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_D50                     = 23,
-+    CAMERA_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN     = 24,
-+} icamera_metadata_enum_camera_sensor_reference_illuminant1_t;
-+
-+// CAMERA_SENSOR_TEST_PATTERN_MODE
-+typedef enum icamera_metadata_enum_camera_sensor_test_pattern_mode {
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_OFF,
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR,
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS,
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY,
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_PN9,
-+    CAMERA_SENSOR_TEST_PATTERN_MODE_CUSTOM1                     = 256,
-+} icamera_metadata_enum_camera_sensor_test_pattern_mode_t;
-+
-+// CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
-+typedef enum icamera_metadata_enum_camera_sensor_info_color_filter_arrangement {
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB,
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG,
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG,
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR,
-+    CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB,
-+} icamera_metadata_enum_camera_sensor_info_color_filter_arrangement_t;
-+
-+// CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE
-+typedef enum icamera_metadata_enum_camera_sensor_info_timestamp_source {
-+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN,
-+    CAMERA_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME,
-+} icamera_metadata_enum_camera_sensor_info_timestamp_source_t;
-+
-+// CAMERA_SHADING_MODE
-+typedef enum icamera_metadata_enum_camera_shading_mode {
-+    CAMERA_SHADING_MODE_OFF,
-+    CAMERA_SHADING_MODE_FAST,
-+    CAMERA_SHADING_MODE_HIGH_QUALITY,
-+} icamera_metadata_enum_camera_shading_mode_t;
-+
-+// CAMERA_STATISTICS_FACE_DETECT_MODE
-+typedef enum icamera_metadata_enum_camera_statistics_face_detect_mode {
-+    CAMERA_STATISTICS_FACE_DETECT_MODE_OFF,
-+    CAMERA_STATISTICS_FACE_DETECT_MODE_SIMPLE,
-+    CAMERA_STATISTICS_FACE_DETECT_MODE_FULL,
-+} icamera_metadata_enum_camera_statistics_face_detect_mode_t;
-+
-+// CAMERA_STATISTICS_HISTOGRAM_MODE
-+typedef enum icamera_metadata_enum_camera_statistics_histogram_mode {
-+    CAMERA_STATISTICS_HISTOGRAM_MODE_OFF,
-+    CAMERA_STATISTICS_HISTOGRAM_MODE_ON,
-+} icamera_metadata_enum_camera_statistics_histogram_mode_t;
-+
-+// CAMERA_STATISTICS_SHARPNESS_MAP_MODE
-+typedef enum icamera_metadata_enum_camera_statistics_sharpness_map_mode {
-+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_OFF,
-+    CAMERA_STATISTICS_SHARPNESS_MAP_MODE_ON,
-+} icamera_metadata_enum_camera_statistics_sharpness_map_mode_t;
-+
-+// CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE
-+typedef enum icamera_metadata_enum_camera_statistics_hot_pixel_map_mode {
-+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_OFF,
-+    CAMERA_STATISTICS_HOT_PIXEL_MAP_MODE_ON,
-+} icamera_metadata_enum_camera_statistics_hot_pixel_map_mode_t;
-+
-+// CAMERA_STATISTICS_SCENE_FLICKER
-+typedef enum icamera_metadata_enum_camera_statistics_scene_flicker {
-+    CAMERA_STATISTICS_SCENE_FLICKER_NONE,
-+    CAMERA_STATISTICS_SCENE_FLICKER_50HZ,
-+    CAMERA_STATISTICS_SCENE_FLICKER_60HZ,
-+} icamera_metadata_enum_camera_statistics_scene_flicker_t;
-+
-+// CAMERA_STATISTICS_LENS_SHADING_MAP_MODE
-+typedef enum icamera_metadata_enum_camera_statistics_lens_shading_map_mode {
-+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_OFF,
-+    CAMERA_STATISTICS_LENS_SHADING_MAP_MODE_ON,
-+} icamera_metadata_enum_camera_statistics_lens_shading_map_mode_t;
-+
-+// CAMERA_TONEMAP_MODE
-+typedef enum icamera_metadata_enum_camera_tonemap_mode {
-+    CAMERA_TONEMAP_MODE_CONTRAST_CURVE,
-+    CAMERA_TONEMAP_MODE_FAST,
-+    CAMERA_TONEMAP_MODE_HIGH_QUALITY,
-+    CAMERA_TONEMAP_MODE_GAMMA_VALUE,
-+    CAMERA_TONEMAP_MODE_PRESET_CURVE,
-+} icamera_metadata_enum_camera_tonemap_mode_t;
-+
-+// CAMERA_TONEMAP_PRESET_CURVE
-+typedef enum icamera_metadata_enum_camera_tonemap_preset_curve {
-+    CAMERA_TONEMAP_PRESET_CURVE_SRGB,
-+    CAMERA_TONEMAP_PRESET_CURVE_REC709,
-+} icamera_metadata_enum_camera_tonemap_preset_curve_t;
-+
-+// CAMERA_LED_TRANSMIT
-+typedef enum icamera_metadata_enum_camera_led_transmit {
-+    CAMERA_LED_TRANSMIT_OFF,
-+    CAMERA_LED_TRANSMIT_ON,
-+} icamera_metadata_enum_camera_led_transmit_t;
-+
-+// CAMERA_LED_AVAILABLE_LEDS
-+typedef enum icamera_metadata_enum_camera_led_available_leds {
-+    CAMERA_LED_AVAILABLE_LEDS_TRANSMIT,
-+} icamera_metadata_enum_camera_led_available_leds_t;
-+
-+// CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
-+typedef enum icamera_metadata_enum_camera_info_supported_hardware_level {
-+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED,
-+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
-+    CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
-+} icamera_metadata_enum_camera_info_supported_hardware_level_t;
-+
-+// CAMERA_BLACK_LEVEL_LOCK
-+typedef enum icamera_metadata_enum_camera_black_level_lock {
-+    CAMERA_BLACK_LEVEL_LOCK_OFF,
-+    CAMERA_BLACK_LEVEL_LOCK_ON,
-+} icamera_metadata_enum_camera_black_level_lock_t;
-+
-+// CAMERA_SYNC_FRAME_NUMBER
-+typedef enum icamera_metadata_enum_camera_sync_frame_number {
-+    CAMERA_SYNC_FRAME_NUMBER_CONVERGING                         = -1,
-+    CAMERA_SYNC_FRAME_NUMBER_UNKNOWN                            = -2,
-+} icamera_metadata_enum_camera_sync_frame_number_t;
-+
-+// CAMERA_SYNC_MAX_LATENCY
-+typedef enum icamera_metadata_enum_camera_sync_max_latency {
-+    CAMERA_SYNC_MAX_LATENCY_PER_FRAME_CONTROL                   = 0,
-+    CAMERA_SYNC_MAX_LATENCY_UNKNOWN                             = -1,
-+} icamera_metadata_enum_camera_sync_max_latency_t;
-+
-+// INTEL_INFO_AVAILABLE_FEATURES
-+typedef enum icamera_metadata_enum_intel_info_available_features {
-+    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_EXPOSURE               = 0,
-+    INTEL_INFO_AVAILABLE_FEATURES_MANUAL_WHITE_BALANCE          = 1,
-+    INTEL_INFO_AVAILABLE_FEATURES_IMAGE_ENHANCEMENT             = 2,
-+    INTEL_INFO_AVAILABLE_FEATURES_NOISE_REDUCTION               = 3,
-+    INTEL_INFO_AVAILABLE_FEATURES_SCENE_MODE                    = 4,
-+    INTEL_INFO_AVAILABLE_FEATURES_WEIGHT_GRID_MODE              = 5,
-+    INTEL_INFO_AVAILABLE_FEATURES_PER_FRAME_CONTROL             = 6,
-+    INTEL_INFO_AVAILABLE_FEATURES_ISP_CONTROL                   = 7,
-+} icamera_metadata_enum_intel_info_available_features_t;
-+
-+// INTEL_INFO_WFOV
-+typedef enum icamera_metadata_enum_intel_info_wfov {
-+    INTEL_INFO_WFOV_OFF,
-+    INTEL_INFO_WFOV_ON,
-+} icamera_metadata_enum_intel_info_wfov_t;
-+
-+// INTEL_INFO_SENSOR_MOUNT_TYPE
-+typedef enum icamera_metadata_enum_intel_info_sensor_mount_type {
-+    INTEL_INFO_SENSOR_MOUNT_TYPE_WALL_MOUNTED,
-+    INTEL_INFO_SENSOR_MOUNT_TYPE_CEILING_MOUNTER,
-+} icamera_metadata_enum_intel_info_sensor_mount_type_t;
-+
-+// INTEL_CONTROL_AE_CONVERGE_SPEED
-+typedef enum icamera_metadata_enum_intel_control_ae_converge_speed {
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_NORMAL,
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_MID,
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_LOW,
-+} icamera_metadata_enum_intel_control_ae_converge_speed_t;
-+
-+// INTEL_CONTROL_NR_MODE
-+typedef enum icamera_metadata_enum_intel_control_nr_mode {
-+    INTEL_CONTROL_NR_MODE_OFF,
-+    INTEL_CONTROL_NR_MODE_AUTO,
-+    INTEL_CONTROL_NR_MODE_MANUAL_NORMAL,
-+    INTEL_CONTROL_NR_MODE_MANUAL_EXPERT,
-+} icamera_metadata_enum_intel_control_nr_mode_t;
-+
-+// INTEL_CONTROL_IRIS_MODE
-+typedef enum icamera_metadata_enum_intel_control_iris_mode {
-+    INTEL_CONTROL_IRIS_MODE_AUTO,
-+    INTEL_CONTROL_IRIS_MODE_MANUAL,
-+    INTEL_CONTROL_IRIS_MODE_CUSTOMIZED,
-+} icamera_metadata_enum_intel_control_iris_mode_t;
-+
-+// INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY
-+typedef enum icamera_metadata_enum_intel_control_ae_distribution_priority {
-+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_AUTO,
-+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_SHUTTER,
-+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_ISO,
-+    INTEL_CONTROL_AE_DISTRIBUTION_PRIORITY_APERTURE,
-+} icamera_metadata_enum_intel_control_ae_distribution_priority_t;
-+
-+// INTEL_CONTROL_WDR_MODE
-+typedef enum icamera_metadata_enum_intel_control_wdr_mode {
-+    INTEL_CONTROL_WDR_MODE_OFF,
-+    INTEL_CONTROL_WDR_MODE_ON,
-+    INTEL_CONTROL_WDR_MODE_AUTO,
-+} icamera_metadata_enum_intel_control_wdr_mode_t;
-+
-+// INTEL_CONTROL_BLC_AREA_MODE
-+typedef enum icamera_metadata_enum_intel_control_blc_area_mode {
-+    INTEL_CONTROL_BLC_AREA_MODE_OFF,
-+    INTEL_CONTROL_BLC_AREA_MODE_ON,
-+} icamera_metadata_enum_intel_control_blc_area_mode_t;
-+
-+// INTEL_CONTROL_SCENE_MODE
-+typedef enum icamera_metadata_enum_intel_control_scene_mode {
-+    INTEL_CONTROL_SCENE_MODE_AUTO,
-+    INTEL_CONTROL_SCENE_MODE_HDR,
-+    INTEL_CONTROL_SCENE_MODE_ULL,
-+    INTEL_CONTROL_SCENE_MODE_VIDEO_LL,
-+    INTEL_CONTROL_SCENE_MODE_HDR2,
-+} icamera_metadata_enum_intel_control_scene_mode_t;
-+
-+// INTEL_CONTROL_WEIGHT_GRID_MODE
-+typedef enum icamera_metadata_enum_intel_control_weight_grid_mode {
-+    INTEL_CONTROL_WEIGHT_GRID_MODE_AUTO,
-+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID1,
-+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID2,
-+    INTEL_CONTROL_WEIGHT_GRID_MODE_CUSTOM_WEIGHT_GRID3,
-+} icamera_metadata_enum_intel_control_weight_grid_mode_t;
-+
-+// INTEL_CONTROL_AE_CONVERGE_SPEED_MODE
-+typedef enum icamera_metadata_enum_intel_control_ae_converge_speed_mode {
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_HAL,
-+    INTEL_CONTROL_AE_CONVERGE_SPEED_MODE_AIQ,
-+} icamera_metadata_enum_intel_control_ae_converge_speed_mode_t;
-+
-+// INTEL_CONTROL_DEINTERLACE_MODE
-+typedef enum icamera_metadata_enum_intel_control_deinterlace_mode {
-+    INTEL_CONTROL_DEINTERLACE_MODE_OFF,
-+    INTEL_CONTROL_DEINTERLACE_MODE_WEAVING,
-+} icamera_metadata_enum_intel_control_deinterlace_mode_t;
-+
-+// INTEL_CONTROL_MAKERNOTE_MODE
-+typedef enum icamera_metadata_enum_intel_control_makernote_mode {
-+    INTEL_CONTROL_MAKERNOTE_MODE_OFF,
-+    INTEL_CONTROL_MAKERNOTE_MODE_JPEG,
-+    INTEL_CONTROL_MAKERNOTE_MODE_RAW,
-+} icamera_metadata_enum_intel_control_makernote_mode_t;
-+
-+// INTEL_CONTROL_YUV_COLOR_RANGE
-+typedef enum icamera_metadata_enum_intel_control_yuv_color_range {
-+    INTEL_CONTROL_YUV_COLOR_RANGE_FULL,
-+    INTEL_CONTROL_YUV_COLOR_RANGE_REDUCED,
-+} icamera_metadata_enum_intel_control_yuv_color_range_t;
-+
-+// INTEL_CONTROL_FISHEYE_DEWARPING_MODE
-+typedef enum icamera_metadata_enum_intel_control_fisheye_dewarping_mode {
-+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_OFF,
-+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_REARVIEW,
-+    INTEL_CONTROL_FISHEYE_DEWARPING_MODE_HITCHVIEW,
-+} icamera_metadata_enum_intel_control_fisheye_dewarping_mode_t;
-+
-+// INTEL_CONTROL_LDC_MODE
-+typedef enum icamera_metadata_enum_intel_control_ldc_mode {
-+    INTEL_CONTROL_LDC_MODE_OFF,
-+    INTEL_CONTROL_LDC_MODE_ON,
-+} icamera_metadata_enum_intel_control_ldc_mode_t;
-+
-+// INTEL_CONTROL_RSC_MODE
-+typedef enum icamera_metadata_enum_intel_control_rsc_mode {
-+    INTEL_CONTROL_RSC_MODE_OFF,
-+    INTEL_CONTROL_RSC_MODE_ON,
-+} icamera_metadata_enum_intel_control_rsc_mode_t;
-+
-+// INTEL_CONTROL_FLIP_MODE
-+typedef enum icamera_metadata_enum_intel_control_flip_mode {
-+    INTEL_CONTROL_FLIP_MODE_NONE,
-+    INTEL_CONTROL_FLIP_MODE_VFLIP,
-+    INTEL_CONTROL_FLIP_MODE_HFLIP,
-+    INTEL_CONTROL_FLIP_MODE_VHFLIP,
-+} icamera_metadata_enum_intel_control_flip_mode_t;
-+
-+// INTEL_CONTROL_MONO_DOWNSCALE
-+typedef enum icamera_metadata_enum_intel_control_mono_downscale {
-+    INTEL_CONTROL_MONO_DOWNSCALE_OFF,
-+    INTEL_CONTROL_MONO_DOWNSCALE_ON,
-+} icamera_metadata_enum_intel_control_mono_downscale_t;
-+
-diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
-new file mode 100644
-index 000000000000..4bcf74710e98
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
-@@ -0,0 +1,524 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "AiqInitData"
-+
-+#include <sys/stat.h>
-+
-+#include "iutils/CameraLog.h"
-+#include "AiqInitData.h"
-+#include "PlatformData.h"
-+#include "ia_types.h"
-+
-+using std::string;
-+
-+namespace icamera {
-+
-+AiqdData::AiqdData(TuningMode tuningMode, const string& sensorName) :
-+    mDataPtr(nullptr)
-+{
-+    CLEAR(mBinaryData);
-+
-+    mAiqdFileName.append(CAMERA_CACHE_DIR);
-+    mAiqdFileName.append(sensorName);
-+    mAiqdFileName.append("_");
-+    mAiqdFileName.append(CameraUtils::tuningMode2String(tuningMode));
-+    mAiqdFileName.append(".aiqd");
-+
-+    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
-+    loadAiqdFromFile();
-+};
-+
-+AiqdData::~AiqdData()
-+{
-+    LOG1("%s, aiqd file name %s", __func__, mAiqdFileName.c_str());
-+}
-+
-+ia_binary_data* AiqdData::getAiqdData()
-+{
-+    if (mDataPtr != nullptr) {
-+        return &mBinaryData;
-+    }
-+    return nullptr;
-+}
-+
-+void AiqdData::saveAiqdData(const ia_binary_data* inData)
-+{
-+    LOG1("%s", __func__);
-+    CheckError(inData == nullptr, VOID_VALUE, "inData is nullptr");
-+
-+    if (mDataPtr == nullptr || inData->size != mBinaryData.size) {
-+        mDataPtr.reset(new char[inData->size]);
-+        mBinaryData.size = inData->size;
-+        mBinaryData.data = mDataPtr.get();
-+    }
-+    MEMCPY_S(mBinaryData.data, mBinaryData.size, inData->data, inData->size);
-+
-+    saveAiqdToFile();
-+}
-+
-+void AiqdData::loadAiqdFromFile()
-+{
-+    LOG1("%s", __func__);
-+
-+    // Get file size
-+    struct stat fileStat;
-+    CLEAR(fileStat);
-+    int ret = stat(mAiqdFileName.c_str(), &fileStat);
-+    if (ret != 0) {
-+        LOG1("There is no aiqd file %s", mAiqdFileName.c_str());
-+        return;
-+    }
-+
-+    // Opem aiqd file
-+    FILE* fp = fopen(mAiqdFileName.c_str(), "rb");
-+    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
-+                 mAiqdFileName.c_str(), strerror(errno));
-+
-+    std::unique_ptr<char[]> dataPtr(new char[fileStat.st_size]);
-+
-+    // Read aiqd data
-+    size_t readSize = fread(dataPtr.get(), sizeof(char), fileStat.st_size, fp);
-+    fclose(fp);
-+
-+    CheckWarning(readSize != (size_t)fileStat.st_size, VOID_VALUE,
-+                 "Failed to read aiqd %s, error %s",
-+                 mAiqdFileName.c_str(), strerror(errno));
-+
-+    mDataPtr = move(dataPtr);
-+    mBinaryData.data = mDataPtr.get();
-+    mBinaryData.size = fileStat.st_size;
-+    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
-+}
-+
-+void AiqdData::saveAiqdToFile()
-+{
-+    LOG1("%s", __func__);
-+
-+    // Open aiqd file
-+    FILE* fp = fopen(mAiqdFileName.c_str(), "wb");
-+    CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open aiqd file %s, error %s",
-+                 mAiqdFileName.c_str(), strerror(errno));
-+
-+    // Write aiqd data to file
-+    size_t writeSize = fwrite(mBinaryData.data, 1, mBinaryData.size, fp);
-+    if (writeSize != mBinaryData.size) {
-+        LOGW("Failed to write aiqd data %s, error %s", mAiqdFileName.c_str(), strerror(errno));
-+        fclose(fp);
-+        return;
-+    }
-+
-+    fflush(fp);
-+    fclose(fp);
-+
-+    LOG1("%s, aiqd file %s, size %d", __func__, mAiqdFileName.c_str(), mBinaryData.size);
-+}
-+
-+CpfConf::CpfConf()
-+{
-+    mLard = new IntelLard();
-+    mCmc = std::unique_ptr<IntelCmc>(new IntelCmc());
-+    CLEAR(mAiq);
-+    CLEAR(mIsp);
-+    CLEAR(mOthers);
-+}
-+
-+CpfConf::~CpfConf()
-+{
-+    delete mLard;
-+    LOG1("@%s", __func__);
-+}
-+
-+int CpfConf::init(int cameraId, ia_binary_data cpfData, TuningMode mode)
-+{
-+    LOG1("@%s", __func__);
-+
-+    CheckWarning(mCmc->getCmc(), OK, "cmc has already been init before!");
-+    CheckError((cpfData.data == nullptr), BAD_VALUE, "Error Initializing CPF configure");
-+
-+    bool cmcRet = false;
-+    ia_lard *iaLard = mLard->init(&cpfData);
-+    if (iaLard != nullptr) {
-+        LOG1("AIQB file supported by lard.");
-+        ia_lard_input_params lardInputParams;
-+        initLardInputParam(cameraId, iaLard, mode, &lardInputParams);
-+
-+        ia_lard_results* lardResults;
-+        // Run ia_lard, result is nullptr if aiqb file is not supported
-+        ia_err iaErr = mLard->run(iaLard, &lardInputParams, &lardResults);
-+        if (lardResults != nullptr) {
-+            LOG1("ia_lard_run success, using lard to get cmc mode and tuning.");
-+            cmcRet = mCmc->init(&lardResults->aiqb_cmc_data, nullptr);
-+            mAiq = lardResults->aiqb_aiq_data;
-+            mIsp = lardResults->aiqb_isp_data;
-+            mOthers = lardResults->aiqb_other_data;
-+        } else {
-+            LOGE("Fail to run ia_lard, iaErr = %d", iaErr);
-+        }
-+        mLard->deinit(iaLard);
-+    } else {
-+        LOG1("Lard not supported. The AIQB file may be in old CPF format");
-+        cmcRet = mCmc->init(&cpfData, nullptr);
-+        mAiq = cpfData;
-+        mIsp = cpfData;
-+        mOthers = cpfData;
-+    }
-+    CheckError(!cmcRet, FAILED_TRANSACTION, "Error cmc parser init!");
-+
-+    return OK;
-+}
-+
-+ia_cmc_t* CpfConf::getCmc() const
-+{
-+    return mCmc->getCmc();
-+}
-+
-+uintptr_t CpfConf::getCmcHandle() const
-+{
-+    return mCmc->getCmcHandle();
-+}
-+
-+void CpfConf::getIspData(ia_binary_data *ispData)
-+{
-+    ispData->data = mIsp.data;
-+    ispData->size = mIsp.size;
-+}
-+
-+void CpfConf::getAiqData(ia_binary_data *aiqData)
-+{
-+    aiqData->data = mAiq.data;
-+    aiqData->size = mAiq.size;
-+}
-+
-+void CpfConf::getOtherData(ia_binary_data *otherData)
-+{
-+    otherData->data = mOthers.data;
-+    otherData->size = mOthers.size;
-+}
-+
-+void CpfConf::deinit()
-+{
-+    mCmc->deinit();
-+}
-+
-+void CpfConf::initLardInputParam(int cameraId, ia_lard *iaLard, TuningMode mode, ia_lard_input_params *lardInputParam)
-+{
-+    LardTagConfig lardTags;
-+    int ret = PlatformData::getLardTagsByTuningMode(cameraId, mode, lardTags);
-+    if (ret != OK) {
-+        lardInputParam->cmc_mode_tag = FOURCC_TO_UL('D','F','L','T');
-+        lardInputParam->aiq_mode_tag = FOURCC_TO_UL('D','F','L','T');
-+        lardInputParam->isp_mode_index = FOURCC_TO_UL('D','F','L','T');
-+        lardInputParam->others_mode_tag = FOURCC_TO_UL('D','F','L','T');
-+        return;
-+    }
-+
-+    unsigned int count = 0;
-+    const unsigned int *tags = nullptr;
-+
-+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','C','M','C'), &count, &tags);
-+    lardInputParam->cmc_mode_tag = isTagValid(lardTags.cmcTag, count, tags) ? \
-+                                   lardTags.cmcTag : FOURCC_TO_UL('D','F','L','T');
-+
-+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','A','I','Q'), &count, &tags);
-+    lardInputParam->aiq_mode_tag = isTagValid(lardTags.aiqTag, count, tags) ? \
-+                                   lardTags.aiqTag : FOURCC_TO_UL('D','F','L','T');
-+
-+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','I','S','P'), &count, &tags);
-+    lardInputParam->isp_mode_index = isTagValid(lardTags.ispTag, count, tags) ? \
-+                                     lardTags.ispTag : FOURCC_TO_UL('D','F','L','T');
-+
-+    mLard->getTagList(iaLard, FOURCC_TO_UL('L','T','H','R'), &count, &tags);
-+    lardInputParam->others_mode_tag = isTagValid(lardTags.othersTag, count, tags) ? \
-+                                      lardTags.othersTag : FOURCC_TO_UL('D','F','L','T');
-+
-+    LOG1("@%s: The lard tags are: aiq-0x%x, isp-0x%x, cmc-0x%x, others-0x%x", __func__,
-+        lardInputParam->aiq_mode_tag, lardInputParam->isp_mode_index,
-+        lardInputParam->cmc_mode_tag, lardInputParam->others_mode_tag);
-+}
-+
-+bool CpfConf::isTagValid(unsigned int tag, unsigned int count, const unsigned int *tags)
-+{
-+    if (tags != nullptr) {
-+        for (unsigned int i = 0; i < count; i++) {
-+            if (tags[i] == tag) return true;
-+        }
-+    }
-+    LOG1("@%s: Tag 0x%x is not valid. Will use DFLT instead.", __func__, tag);
-+    return false;
-+}
-+
-+CpfStore::CpfStore(int cameraId, string sensorName)
-+{
-+    LOG1("@%s:Sensor Name = %s", __func__, sensorName.c_str());
-+
-+    CLEAR(mCpfConfig);
-+    std::vector <TuningConfig> configs;
-+
-+    PlatformData::getSupportedTuningConfig(cameraId, configs);
-+
-+    for (auto &cfg : configs) {
-+        if (mCpfConfig[cfg.tuningMode] != nullptr) {
-+            continue;
-+        }
-+
-+        if (cfg.aiqbName.empty()) {
-+            LOGE("aiqb name is empty, sensor name %s", sensorName.c_str());
-+            continue;
-+        }
-+
-+        if (mCpfData.find(cfg.aiqbName) == mCpfData.end()) {
-+            // Obtain the configurations
-+            if (loadConf(cfg.aiqbName) != OK) {
-+                LOGE("load file %s failed, sensor %s", cfg.aiqbName.c_str(), sensorName.c_str());
-+                continue;
-+            }
-+        }
-+
-+        mCpfConfig[cfg.tuningMode] = new CpfConf();
-+        mCpfConfig[cfg.tuningMode]->init(cameraId, mCpfData[cfg.aiqbName], cfg.tuningMode);
-+    }
-+}
-+
-+CpfStore::~CpfStore()
-+{
-+    LOG1("@%s", __func__);
-+    for (int mode=0; mode<TUNING_MODE_MAX; mode++) {
-+        if (mCpfConfig[mode]) {
-+            mCpfConfig[mode]->deinit();
-+            delete mCpfConfig[mode];
-+        }
-+    }
-+    for (auto &cpfData : mCpfData) {
-+        if (cpfData.second.data) {
-+            free(cpfData.second.data);
-+        }
-+    }
-+    mCpfData.clear();
-+}
-+
-+/**
-+ * findConfigFile
-+ *
-+ * Search the path where CPF files are stored
-+*/
-+int CpfStore::findConfigFile(string& cpfPathName)
-+{
-+    LOG1("@%s", __func__);
-+    std::vector<string> configFilePath;
-+    configFilePath.push_back("./");
-+    configFilePath.push_back(PlatformData::getCameraCfgPath());
-+    int configFileCount = configFilePath.size();
-+
-+    string cpfFile;
-+    for (int i = 0; i < configFileCount; i++) {
-+        cpfFile.append(configFilePath.at(i));
-+        cpfFile.append(cpfPathName);
-+        struct stat st;
-+        if (!stat(cpfFile.c_str(), &st))
-+            break;
-+        cpfFile.clear();
-+    }
-+
-+    if (cpfFile.empty()) {//CPF file not found
-+        LOG1("@%s:No CPF file found for %s", __func__,cpfPathName.c_str());
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    cpfPathName = cpfFile;
-+    LOG1("@%s:CPF file found %s", __func__,cpfPathName.c_str());
-+    return OK;
-+}
-+
-+/**
-+ * loadConf
-+ *
-+ * load the CPF file
-+*/
-+int CpfStore::loadConf(string aiqbName)
-+{
-+    LOG1("@%s", __func__);
-+    int ret = OK;
-+    const char *suffix = ".aiqb";
-+
-+    string cpfPathName = aiqbName;
-+    cpfPathName.append(suffix);
-+    LOG1("aiqb file name %s", cpfPathName.c_str());
-+
-+    if (findConfigFile(cpfPathName) != OK) {
-+        LOGE("CpfStore no aiqb file:%s", aiqbName.c_str());
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    LOG1("Opening CPF file \"%s\"", cpfPathName.c_str());
-+    FILE *file = fopen(cpfPathName.c_str(), "rb");
-+    CheckError((file == nullptr), NAME_NOT_FOUND, "ERROR in opening CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
-+    do {
-+        int fileSize;
-+        if ((fseek(file, 0, SEEK_END) < 0) || ((fileSize = ftell(file)) < 0) || (fseek(file, 0, SEEK_SET) < 0)) {
-+            LOGE("ERROR querying properties of CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
-+            ret = BAD_VALUE;
-+            break;
-+        }
-+
-+        mCpfData[aiqbName].data = malloc(fileSize);
-+        if (!mCpfData[aiqbName].data) {
-+            LOGE("ERROR no memory in %s!", __func__);
-+            ret = NO_MEMORY;
-+            break;
-+        }
-+
-+        if (fread(mCpfData[aiqbName].data, fileSize, 1, file) < 1) {
-+            LOGE("ERROR reading CPF file \"%s\"!", cpfPathName.c_str());
-+            ret = INVALID_OPERATION;
-+            break;
-+        }
-+        mCpfData[aiqbName].size = fileSize;
-+    } while (0);
-+
-+    if (fclose(file)) {
-+        LOGE("ERROR in closing CPF file \"%s\": %s!", cpfPathName.c_str(), strerror(errno));
-+    }
-+
-+    return ret;
-+}
-+
-+/**
-+ * convenience getter for Isp data, Aiq data, cmc data and other data.
-+ */
-+int CpfStore::getDataAndCmc(ia_binary_data *ispData,
-+                            ia_binary_data *aiqData,
-+                            ia_binary_data *otherData,
-+                            uintptr_t *cmcHandle,
-+                            TuningMode mode,
-+                            ia_cmc_t **cmcData)
-+{
-+    LOG1("@%s mode = %d", __func__, mode);
-+    CheckError((mCpfConfig[mode] == nullptr), NO_INIT, "@%s, No aiqb init, mode = %d", __func__, mode);
-+    if (ispData != nullptr)
-+        mCpfConfig[mode]->getIspData(ispData);
-+    if (aiqData != nullptr)
-+        mCpfConfig[mode]->getAiqData(aiqData);
-+    if (otherData != nullptr)
-+        mCpfConfig[mode]->getOtherData(otherData);
-+    if (cmcData) {
-+        *cmcData = mCpfConfig[mode]->getCmc();
-+    }
-+    if (cmcHandle) {
-+        *cmcHandle = mCpfConfig[mode]->getCmcHandle();
-+    }
-+
-+    if (mode == TUNING_MODE_VIDEO_ULL) {
-+        LOG2("@%s ULL mode, ULL cpf file is used", __func__);
-+    } else if (mode == TUNING_MODE_VIDEO_CUSTOM_AIC) {
-+        LOG2("@%s CUSTOM AIC mode, CUSTOM AIC cpf file is used", __func__);
-+    } else if (mode == TUNING_MODE_VIDEO_LL) {
-+        LOG2("@%s VIDEO LL mode, VIDEO LL cpf file is used", __func__);
-+    } else if (mode == TUNING_MODE_VIDEO_REAR_VIEW) {
-+        LOG2("@%s VIDEO Rear View mode, VIDEO REAR VIEW cpf file is used", __func__);
-+    } else if (mode == TUNING_MODE_VIDEO_HITCH_VIEW) {
-+        LOG2("@%s VIDEO Hitch View mode, VIDEO HITCH VIEW cpf file is used", __func__);
-+    } else {
-+        LOG2("@%s VIDEO mode, default cpf file is used", __func__);
-+    }
-+
-+    return OK;
-+}
-+
-+AiqInitData::AiqInitData() :
-+    mCpfStore(nullptr),
-+    mNvmDataBuf(nullptr)
-+{
-+    CLEAR(mNvmData);
-+}
-+
-+AiqInitData::~AiqInitData()
-+{
-+    delete mCpfStore;
-+    for (auto aiqd : mAiqdDataMap) {
-+        delete aiqd.second;
-+    }
-+}
-+
-+CpfStore* AiqInitData::getCpfStore(int cameraId, const string& sensorName)
-+{
-+    if (mCpfStore == nullptr) {
-+        mCpfStore = new CpfStore(cameraId, sensorName);
-+    }
-+    return mCpfStore;
-+}
-+
-+status_t AiqInitData::loadNvmData(int cameraId)
-+{
-+    LOG1("@%s, cameraId: %d", __func__, cameraId);
-+
-+    string nvmDirectory = PlatformData::getNvmDirectory(cameraId);
-+    if (nvmDirectory.length() == 0) {
-+        LOG1("NVM dirctory from config is null");
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    string nvmDataPath(NVM_DATA_PATH);
-+    if (nvmDataPath.back() != '/')
-+        nvmDataPath.append("/");
-+
-+    nvmDataPath.append(nvmDirectory);
-+    if (nvmDataPath.back() != '/')
-+        nvmDataPath.append("/");
-+
-+    nvmDataPath.append("eeprom");
-+    string sensorName = PlatformData::getSensorName(cameraId);
-+    LOG2("NVM data for %s is located in %s", sensorName.c_str(), nvmDataPath.c_str());
-+
-+    FILE *nvmFile = fopen(nvmDataPath.c_str(), "rb");
-+    CheckError(!nvmFile, UNKNOWN_ERROR, "Failed to open NVM file: %s", nvmDataPath.c_str());
-+
-+    fseek(nvmFile, 0, SEEK_END);
-+    int nvmDataSize = std::min(static_cast<int>(ftell(nvmFile)),
-+                               PlatformData::getMaxNvmDataSize(cameraId));
-+    fseek(nvmFile, 0, SEEK_SET);
-+
-+    std::unique_ptr<char[]> nvmData(new char[nvmDataSize]);
-+    LOG2("NVM data size: %d bytes", nvmDataSize);
-+
-+    int ret = fread(nvmData.get(), nvmDataSize, 1, nvmFile);
-+    fclose(nvmFile);
-+    CheckError(ret == 0, UNKNOWN_ERROR, "Cannot read nvm data");
-+
-+    mNvmDataBuf = std::move(nvmData);
-+    mNvmData.data = mNvmDataBuf.get();
-+    mNvmData.size = nvmDataSize;
-+
-+    return OK;
-+}
-+
-+void* AiqInitData::getNvmData(int cameraId)
-+{
-+    if (!mNvmData.data || mNvmData.size == 0)
-+        loadNvmData(cameraId);
-+
-+    return mNvmData.data ? static_cast<void *>(&mNvmData) : nullptr;
-+}
-+
-+AiqdData* AiqInitData::getAiqdData(TuningMode tuningMode, const string& sensorName)
-+{
-+    if (mAiqdDataMap.find(tuningMode) == mAiqdDataMap.end()) {
-+        mAiqdDataMap[tuningMode] = new AiqdData(tuningMode, sensorName);
-+    }
-+    return mAiqdDataMap[tuningMode];
-+}
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
-new file mode 100644
-index 000000000000..cb06edfe09fb
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
-@@ -0,0 +1,199 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <string>
-+#include <map>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelLard.h"
-+#include "modules/sandboxing/client/IntelCmc.h"
-+#else
-+#include "modules/algowrapper/IntelLard.h"
-+#include "modules/algowrapper/IntelCmc.h"
-+#endif
-+
-+namespace icamera {
-+
-+#define NVM_DATA_PATH "/sys/bus/i2c/devices/"
-+
-+/**
-+ * This class is intended to save/load AIQD data.
-+ */
-+class AiqdData
-+{
-+public:
-+    AiqdData(TuningMode tuningMode, const std::string& sensorName);
-+    ~AiqdData();
-+
-+    ia_binary_data* getAiqdData();
-+    void saveAiqdData(const ia_binary_data* inData);
-+
-+private:
-+    void loadAiqdFromFile();
-+    void saveAiqdToFile();
-+
-+private:
-+    std::string mAiqdFileName;
-+    ia_binary_data mBinaryData;
-+    std::unique_ptr<char[]> mDataPtr;
-+};
-+
-+/**
-+  * The IA data stored
-+*/
-+class CpfConf
-+{
-+public:
-+    CpfConf();
-+    virtual ~CpfConf();
-+
-+    /**
-+     * \brief get CMC pointer
-+     *
-+     */
-+    ia_cmc_t* getCmc() const;
-+
-+    /**
-+     * \brief get CMC uintptr_t
-+     *
-+     */
-+    uintptr_t getCmcHandle() const;
-+
-+    /**
-+     * \brief get ISP data from CPF file
-+     *
-+     * \param[out] ia_binary_data *IspData: ISP data
-+     */
-+    void getIspData(ia_binary_data *IspData);
-+
-+    /**
-+     * \brief get AIQ data from CPF file
-+     *
-+     * \param[out] ia_binary_data *AiqData: AIQ data
-+     */
-+    void getAiqData(ia_binary_data *AiqData);
-+
-+    /**
-+     * \brief get others data from CPF file, including LTM data
-+     *
-+     * \param[out] ia_binary_data *otherData: others data
-+     */
-+    void getOtherData(ia_binary_data *otherData);
-+
-+    /**
-+     * \brief parse CMC/ISP/AIQ/Others from the CPF data
-+     *
-+     * Parse the CMC/ISP/AIQ/Others data according to the tuning mode, and init
-+     * the CMC handler.
-+     *
-+     * \param[in] int cameraId: camera id
-+     * \param[in] ia_binary_data cpfData: CPF data loaded from the AIQB file
-+     * \param[in] int mode: Tuning mode
-+     *
-+     * \return OK if init successfully; otherwise non-0 value is returned.
-+     */
-+    int init(int cameraId, ia_binary_data cpfData, TuningMode mode);
-+
-+    /**
-+      * \brief deinit CMC handler.
-+    */
-+    void deinit();
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CpfConf);
-+
-+    void initLardInputParam(int cameraId, ia_lard *iaLard, TuningMode mode, ia_lard_input_params *lardInputParam);
-+    bool isTagValid(unsigned int tag, unsigned int count, const unsigned int *tags);
-+
-+private:
-+    IntelLard* mLard;
-+    std::unique_ptr<IntelCmc> mCmc;
-+    ia_binary_data mAiq;
-+    ia_binary_data mIsp;
-+    ia_binary_data mOthers;
-+};//end CpfConf
-+
-+/**
-+  * CPF file operation class
-+*/
-+class CpfStore
-+{
-+public:
-+    CpfStore(int cameraId, std::string sensorName);
-+    virtual ~CpfStore();
-+
-+    /**
-+     * get Isp and Aiq data info
-+     *
-+     * \param ispData: return isp data of struct ia_binary_data
-+     * \param aiqData: return aiq data of struct ia_binary_data
-+     * \param otherData: return other data of struct ia_binary_data, such as tuning data for LTM
-+     * \param cmcHandle: return cmc uintptr_t
-+     * \param mode: Camera Mode
-+     * \param cmcData: return cmc pointer
-+     * \return NO_INIT if data not found, return OK if success.
-+     */
-+    int getDataAndCmc(ia_binary_data *ispData,
-+                      ia_binary_data *aiqData,
-+                      ia_binary_data *otherData,
-+                      uintptr_t *cmcHandle,
-+                      TuningMode mode = TUNING_MODE_VIDEO,
-+                      ia_cmc_t **cmcData = nullptr);
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CpfStore);
-+
-+    int findConfigFile(std::string& cpfPathName);
-+    int loadConf(std::string aiqbName);
-+
-+public:
-+    CpfConf* mCpfConfig[TUNING_MODE_MAX];
-+    std::map<std::string, ia_binary_data> mCpfData;
-+
-+};//end CpfStore
-+
-+/**
-+ * This class ia a wrapper class which includes CPF data, AIQD data and NVM data.
-+ */
-+class AiqInitData
-+{
-+public:
-+    AiqInitData();
-+    ~AiqInitData();
-+
-+    CpfStore* getCpfStore(int cameraId, const std::string& sensorName);
-+    void* getNvmData(int cameraId);
-+    AiqdData* getAiqdData(TuningMode tuningMode, const std::string& sensorName);
-+
-+private:
-+    status_t loadNvmData(int cameraId);
-+
-+private:
-+    CpfStore* mCpfStore;
-+
-+    // NVM data
-+    std::unique_ptr <char[]> mNvmDataBuf;
-+    ia_binary_data mNvmData;
-+
-+    std::map<TuningMode, AiqdData*> mAiqdDataMap;
-+};
-+
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
-new file mode 100644
-index 000000000000..9c3878af640d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
-@@ -0,0 +1,1939 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ * Copyright 2008-2017, The Android Open Source Project
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "CameraParser"
-+
-+#include <string.h>
-+#include <expat.h>
-+#include <memory>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+#include "metadata/ParameterHelper.h"
-+
-+#include "PlatformData.h"
-+#include "CameraParser.h"
-+
-+#include "gc/GraphConfig.h"
-+
-+using std::string;
-+using std::vector;
-+
-+#include "v4l2/NodeInfo.h"
-+
-+namespace icamera {
-+#define  LIBCAMHAL_PROFILE_NAME "libcamhal_profile.xml"
-+CameraParser::CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg) :
-+    mStaticCfg(cfg),
-+    mCurrentDataField(FIELD_INVALID),
-+    mSensorNum(0),
-+    mCurrentSensor(0),
-+    pCurrentCam(nullptr),
-+    mInMediaCtlCfg(false),
-+    mInStaticMetadata(false),
-+    mMC(mc),
-+    mMetadataCache(nullptr) {
-+    LOGXML("@%s", __func__);
-+    CheckError(mc == nullptr || cfg == nullptr, VOID_VALUE,
-+               "@%s, passed parameters are wrong, mc:%p, data:%p", __func__, mc, cfg);
-+
-+    mMetadataCache = new long[mMetadataCacheSize];
-+    getProfileDataFromXmlFile();
-+    getGraphConfigFromXmlFile();
-+
-+    if(gLogLevel & CAMERA_DEBUG_LOG_LEVEL2)
-+        dumpSensorInfo();
-+}
-+
-+CameraParser::~CameraParser()
-+{
-+    delete []mMetadataCache;
-+}
-+
-+/**
-+ * Replacing $I2CBUS with the real mI2CBus if the value contains the string "$I2CBUS"
-+ * one example: "imx319 $I2CBUS"
-+ * Replacing $CSI_PORT with the real mCsiPort if the value contains the string "$CSI_PORT"
-+ * one example: "Intel IPU6 CSI-2 $CSI_PORT"
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param value: camera information.
-+ * \return: if the value contains the string, it will be replaced.
-+ */
-+string CameraParser::replaceStringInXml(CameraParser *profiles, const char *value)
-+{
-+    string valueTmp;
-+    CheckError(value == nullptr, valueTmp, "value is nullptr");
-+
-+    valueTmp = value;
-+    string::size_type found = string::npos;
-+    if ((found = valueTmp.find("$I2CBUS")) != string::npos) {
-+        valueTmp.replace(found, sizeof("$I2CBUS"), profiles->mI2CBus);
-+        LOGXML("@%s, sensor full name is %s", __func__, valueTmp.c_str());
-+    } else if ((found = valueTmp.find("$CSI_PORT")) != string::npos) {
-+        valueTmp.replace(found, sizeof("$CSI_PORT"), profiles->mCsiPort);
-+        LOGXML("@%s, csi entity full name is %s", __func__, valueTmp.c_str());
-+    }
-+
-+    return valueTmp;
-+}
-+
-+/**
-+ * This function will check which field that the parser parses to.
-+ *
-+ * The field is set to 3 types.
-+ * FIELD_INVALID FIELD_SENSOR and FIELD_COMMON
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void CameraParser::checkField(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s", __func__, name);
-+    if (strcmp(name, "CameraSettings") == 0) {
-+        profiles->mCurrentDataField = FIELD_INVALID;
-+        return;
-+    } else if (strcmp(name, "Sensor") == 0) {
-+        profiles->mSensorNum++;
-+        profiles->mCurrentSensor = profiles->mSensorNum - 1;
-+        if (profiles->mCurrentSensor >= 0 && profiles->mCurrentSensor < MAX_CAMERA_NUMBER) {
-+            profiles->pCurrentCam = new PlatformData::StaticCfg::CameraInfo;
-+
-+            int idx = 0;
-+            string sensorEntityName;
-+            string sinkEntityName;
-+            while (atts[idx]) {
-+                const char* key = atts[idx];
-+                const char* val = atts[idx + 1];
-+                LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+                if (strcmp(key, "name") == 0) {
-+                    profiles->pCurrentCam->sensorName = val;
-+                } else if (strcmp(key, "description") == 0) {
-+                    profiles->pCurrentCam->sensorDescription = val;
-+                }
-+                idx += 2;
-+            }
-+
-+            if (!profiles->pCurrentCam->sensorName.empty() &&
-+                (profiles->mAvailableSensor.find(profiles->pCurrentCam->sensorName) !=
-+                 profiles->mAvailableSensor.end())) {
-+                /* parameters information format example:
-+                   sinkEntityName is "Intel IPU6 CSI-2 1"
-+                   profiles->pCurrentCam->sensorName is "ov8856-wf"
-+                   sensorName is "ov8856"
-+                */
-+                string sinkEntityName = profiles->mAvailableSensor[profiles->pCurrentCam->sensorName];
-+                profiles->mCsiPort = sinkEntityName.substr(sinkEntityName.find_last_of(' ') + 1);
-+                string sensorName = profiles->pCurrentCam->sensorName;
-+                sensorName = sensorName.substr(0, (sensorName.find_last_of('-')));
-+                profiles->mMC->getI2CBusAddress(sensorName, sinkEntityName, &profiles->mI2CBus);
-+
-+                LOGXML("@%s, mI2CBus:%s, cisPort:%s", __func__,
-+                       profiles->mI2CBus.c_str(), profiles->mCsiPort.c_str());
-+             }
-+
-+            profiles->mMetadata.clear();
-+            profiles->mCurrentDataField = FIELD_SENSOR;
-+
-+            return;
-+        }
-+    } else if (strcmp(name, "Common") == 0) {
-+        profiles->mCurrentDataField = FIELD_COMMON;
-+        return;
-+    }
-+
-+    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
-+    return;
-+}
-+
-+/**
-+ * This function will handle all the common related elements.
-+ *
-+ * It will be called in the function startElement
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void CameraParser::handleCommon(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
-+         ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
-+
-+    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]: %s", __func__, name, atts[0], atts[1]);
-+    CommonConfig *cfg = &profiles->mStaticCfg->mCommonConfig;
-+    if (strcmp(name, "version") == 0) {
-+        cfg->xmlVersion = atof(atts[1]);
-+    } else if (strcmp(name, "platform") == 0) {
-+        cfg->ipuName = atts[1];
-+    } else if (strcmp(name, "availableSensors") == 0) {
-+        parseXmlConvertStrings(atts[1], cfg->availableSensors, convertCharToString);
-+    }
-+}
-+
-+/**
-+ * This function will handle all the sensor related elements.
-+ *
-+ * It will be called in the function startElement
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void CameraParser::handleSensor(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s, profiles->mCurrentSensor:%d", __func__, name, profiles->mCurrentSensor);
-+    CheckError(strcmp(atts[0], "value") != 0 || (atts[1] == nullptr), VOID_VALUE
-+        ,"@%s, name:%s, atts[0]:%s or atts[1] is nullptr, xml format wrong", __func__, name, atts[0]);
-+
-+    LOGXML("@%s, name:%s, atts[0]:%s, atts[1]:%s", __func__, name, atts[0], atts[1]);
-+    if (strcmp(name, "supportedISysSizes") == 0) {
-+        parseSizesList(atts[1], pCurrentCam->mSupportedISysSizes);
-+        for (const auto &s : pCurrentCam->mSupportedISysSizes)
-+            LOGXML("@%s, mSupportedISysSizes: width:%d, height:%d", __func__,
-+                s.width, s.height);
-+    } else if (strcmp(name, "supportedISysFormat") == 0) {
-+        getSupportedFormat(atts[1], pCurrentCam->mSupportedISysFormat);
-+    } else if (strcmp(name, "iSysRawFormat") == 0) {
-+        pCurrentCam->mISysRawFormat = CameraUtils::string2PixelCode(atts[1]);
-+    } else if (strcmp(name, "configModeToStreamId") == 0) {
-+        char* srcDup = strdup(atts[1]);
-+        CheckError(!srcDup, VOID_VALUE, "Create a copy of source string failed.");
-+
-+        char* endPtr = (char*)strchr(srcDup, ',');
-+        if (endPtr) {
-+            *endPtr = 0;
-+            ConfigMode configMode = CameraUtils::getConfigModeByName(srcDup);
-+            int streamId = atoi(endPtr + 1);
-+            pCurrentCam->mConfigModeToStreamId[configMode] = streamId;
-+        }
-+        free(srcDup);
-+    } else if (strcmp(name, "pSysFormat") == 0) {
-+        getSupportedFormat(atts[1], pCurrentCam->mPSysFormat);
-+    } else if (strcmp(name, "enableAIQ") == 0) {
-+        pCurrentCam->mEnableAIQ = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "useCrlModule") == 0) {
-+        pCurrentCam->mUseCrlModule = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "skipFrameV4L2Error") == 0) {
-+        pCurrentCam->mSkipFrameV4L2Error = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "useSensorDigitalGain") == 0) {
-+        pCurrentCam->mUseSensorDigitalGain = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "useIspDigitalGain") == 0) {
-+        pCurrentCam->mUseIspDigitalGain = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "preRegisterBuffer") == 0) {
-+        pCurrentCam->mNeedPreRegisterBuffers = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "enableFrameSyncCheck") == 0) {
-+        pCurrentCam->mFrameSyncCheckEnabled = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "lensName") == 0) {
-+        profiles->mMC->getVCMI2CAddr(atts[1], &pCurrentCam->mLensName);
-+    } else if (strcmp(name, "lensHwType") == 0) {
-+        if (strcmp(atts[1], "LENS_VCM_HW") == 0) {
-+            pCurrentCam->mLensHwType = LENS_VCM_HW;
-+        } else {
-+            LOGE("unknown Lens HW type %s, set to LENS_NONE_HW", atts[1]);
-+            pCurrentCam->mLensHwType = LENS_NONE_HW;
-+        }
-+    } else if (strcmp(name, "autoSwitchType") == 0) {
-+        if (strcmp(atts[1], "full") == 0) {
-+            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_FULL;
-+        } else {
-+            pCurrentCam->mAutoSwitchType = AUTO_SWITCH_PSYS;
-+        }
-+    } else if (strcmp(name, "lensCloseCode") == 0) {
-+        pCurrentCam->mLensCloseCode = atoi(atts[1]);
-+    } else if (strcmp(name, "cITMaxMargin") == 0) {
-+        pCurrentCam->mCITMaxMargin = atoi(atts[1]);
-+    } else if (strcmp(name, "ltmGainLag") == 0) {
-+        pCurrentCam->mLtmGainLag = atoi(atts[1]);
-+    } else if (strcmp(name, "enableLtmThread") == 0) {
-+        pCurrentCam->mEnableLtmThread = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "enableLtmDefog") == 0) {
-+        pCurrentCam->mEnableLtmDefog = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "maxSensorDg") == 0) {
-+        pCurrentCam->mMaxSensorDigitalGain = atoi(atts[1]);
-+    } else if (strcmp(name, "sensorDgType") == 0) {
-+        if (strcmp(atts[1], "type_2_x") == 0) {
-+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_2_X;
-+        } else if (strcmp(atts[1], "type_x") == 0) {
-+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_X;
-+        } else {
-+            LOGE("unknown sensor digital gain type:%s, set to SENSOR_DG_TYPE_NONE", atts[1]);
-+            pCurrentCam->mSensorDgType = SENSOR_DG_TYPE_NONE;
-+        }
-+    } else if (strcmp(name, "exposureLag") == 0) {
-+        pCurrentCam->mExposureLag = atoi(atts[1]);
-+    } else if (strcmp(name, "graphSettingsFile") == 0) {
-+        pCurrentCam->mGraphSettingsFile = atts[1];
-+    } else if (strcmp(name, "graphSettingsType") == 0) {
-+        if (strcmp(atts[1], "coupled") == 0) {
-+            pCurrentCam->mGraphSettingsType = COUPLED;
-+        } else if (strcmp(atts[1], "dispersed") == 0) {
-+            pCurrentCam->mGraphSettingsType = DISPERSED;
-+        } else {
-+            LOGW("unknown graph settings type %s, set to COUPLED", atts[1]);
-+            pCurrentCam->mGraphSettingsType = COUPLED;
-+        }
-+    } else if (strcmp(name, "gainLag") == 0) {
-+        pCurrentCam->mGainLag = atoi(atts[1]);
-+    } else if (strcmp(name, "customAicLibraryName") == 0) {
-+        pCurrentCam->mCustomAicLibraryName = atts[1];
-+    } else if (strcmp(name, "custom3ALibraryName") == 0){
-+        pCurrentCam->mCustom3ALibraryName = atts[1];
-+    } else if (strcmp(name, "yuvColorRangeMode") == 0) {
-+        if (strcmp(atts[1],"full") == 0) {
-+            pCurrentCam->mYuvColorRangeMode = CAMERA_FULL_MODE_YUV_COLOR_RANGE;
-+        } else if (strcmp(atts[1],"reduced") == 0) {
-+            pCurrentCam->mYuvColorRangeMode = CAMERA_REDUCED_MODE_YUV_COLOR_RANGE;
-+        }
-+    } else if (strcmp(name, "initialSkipFrame") == 0) {
-+        pCurrentCam->mInitialSkipFrame = atoi(atts[1]);
-+    } else if (strcmp(name, "maxRawDataNum") == 0) {
-+        pCurrentCam->mMaxRawDataNum = atoi(atts[1]);
-+    }  else if (strcmp(name, "topBottomReverse") == 0) {
-+        pCurrentCam->mTopBottomReverse = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "maxRequestsInflight") == 0) {
-+        pCurrentCam->mMaxRequestsInflight = atoi(atts[1]);
-+    } else if (strcmp(name, "psysContinueStats") == 0) {
-+        pCurrentCam->mPsysContinueStats = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "preferredBufQSize") == 0) {
-+        pCurrentCam->mPreferredBufQSize = atoi(atts[1]);
-+    } else if (strcmp(name, "pipeSwitchDelayFrame") == 0) {
-+        pCurrentCam->mPipeSwitchDelayFrame = atoi(atts[1]);
-+    } else if (strcmp(name, "supportedTuningConfig") == 0) {
-+        parseSupportedTuningConfig(atts[1], pCurrentCam->mSupportedTuningConfig);
-+    } else if (strcmp(name, "enableAiqd") == 0) {
-+        pCurrentCam->mEnableAiqd = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "testPatternMap") == 0) {
-+        int size = strlen(atts[1]);
-+        char src[size + 1];
-+        MEMCPY_S(src, size, atts[1], size);
-+        src[size] = '\0';
-+        int32_t mode = TEST_PATTERN_OFF;
-+        char* savePtr = nullptr;
-+
-+        char* tablePtr = strtok_r(src, ",", &savePtr);
-+        while (tablePtr) {
-+            if (strcmp(tablePtr, "Off") == 0) {
-+                mode = TEST_PATTERN_OFF;
-+            } else if (strcmp(tablePtr, "ColorBars") == 0) {
-+                mode = COLOR_BARS;
-+            } else if (strcmp(tablePtr, "SolidColor") == 0) {
-+                mode = SOLID_COLOR;
-+            } else if (strcmp(tablePtr, "ColorBarsFadeToGray") == 0) {
-+                mode = COLOR_BARS_FADE_TO_GRAY;
-+            } else if (strcmp(tablePtr, "PN9") == 0) {
-+                mode = PN9;
-+            } else if (strcmp(tablePtr, "CUSTOM1") == 0) {
-+                mode = TEST_PATTERN_CUSTOM1;
-+            } else {
-+                LOGE("Test pattern string %s is unknown, please check", tablePtr);
-+                return;
-+            }
-+
-+            tablePtr = strtok_r(nullptr, ",", &savePtr);
-+            CheckError(tablePtr == nullptr, VOID_VALUE, "Driver test pattern is nullptr");
-+
-+            pCurrentCam->mTestPatternMap[mode] = atoi(tablePtr);
-+
-+            tablePtr = strtok_r(nullptr, ",", &savePtr);
-+        }
-+    } else if (strcmp(name, "lardTags") == 0) {
-+        parseLardTags(atts[1], pCurrentCam->mLardTagsConfig);
-+    } else if (strcmp(name, "availableConfigModeForAuto") == 0) {
-+        parseXmlConvertStrings(atts[1], pCurrentCam->mConfigModesForAuto, CameraUtils::getConfigModeByName);
-+    } else if (strcmp(name, "supportedAeMultiExpRange") == 0) {
-+        parseMultiExpRange(atts[1]);
-+    } else if (strcmp(name, "dvsType") == 0) {
-+        if (strcmp(atts[1], "MORPH_TABLE") == 0) {
-+            pCurrentCam->mDVSType = MORPH_TABLE;
-+        } else if (strcmp(atts[1], "IMG_TRANS") == 0) {
-+            pCurrentCam->mDVSType = IMG_TRANS;
-+        }
-+    } else if (strcmp(name, "pslOutputMapForRotation") == 0) {
-+        parseOutputMap(atts[1], pCurrentCam->mOutputMap);
-+    } else if (strcmp(name, "maxNvmDataSize") == 0) {
-+        pCurrentCam->mMaxNvmDataSize = atoi(atts[1]);
-+    } else if (strcmp(name, "nvmDirectory") == 0) {
-+        pCurrentCam->mNvmDirectory = atts[1];
-+    } else if (strcmp(name, "isISYSCompression") == 0) {
-+        pCurrentCam->mISYSCompression = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "isPSACompression") == 0) {
-+        pCurrentCam->mPSACompression = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "isOFSCompression") == 0) {
-+        pCurrentCam->mOFSCompression = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "faceAeEnabled") == 0) {
-+        pCurrentCam->mFaceAeEnabled = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "psysAlignWithSof") == 0) {
-+        pCurrentCam->mPsysAlignWithSof = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "swProcessingAlignWithIsp") == 0) {
-+        pCurrentCam->mSwProcessingAlignWithIsp = strcmp(atts[1], "true") == 0;
-+    } else if (strcmp(name, "faceEngineRunningInterval") == 0) {
-+        int val = atoi(atts[1]);
-+        pCurrentCam->mFaceEngineRunningInterval =
-+            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
-+    } else if (strcmp(name, "faceEngineRunningIntervalNoFace") == 0) {
-+        int val = atoi(atts[1]);
-+        pCurrentCam->mFaceEngineRunningIntervalNoFace =
-+            val > 0 ? val : FACE_ENGINE_DEFAULT_RUNNING_INTERVAL;
-+    }  else if (strcmp(name, "faceEngineRunningSync") == 0) {
-+        pCurrentCam->mFaceEngineRunningSync = strcmp(atts[1], "true") == 0;
-+    }
-+}
-+
-+int CameraParser::parseSupportedTuningConfig(const char *str, vector <TuningConfig> &config)
-+{
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+    LOGXML("@%s, str = %s", __func__, str);
-+
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    char *savePtr;
-+    char *configMode = strtok_r(src, ",", &savePtr);
-+    TuningConfig cfg;
-+    while (configMode) {
-+        char* tuningMode = strtok_r(nullptr, ",", &savePtr);
-+        char* aiqb = strtok_r(nullptr, ",", &savePtr);
-+        CheckError(configMode == nullptr || tuningMode == nullptr
-+              || aiqb == nullptr, -1, "@%s, wrong str %s", __func__, str);
-+
-+        LOGXML("@%s, configMode %s, tuningMode %s, aiqb name %s",
-+                __func__, configMode, tuningMode, aiqb);
-+        cfg.configMode = CameraUtils::getConfigModeByName(configMode);
-+        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
-+        cfg.aiqbName = aiqb;
-+        config.push_back(cfg);
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        configMode = strtok_r(nullptr, ",", &savePtr);
-+    }
-+    return 0;
-+}
-+
-+int CameraParser::parseLardTags(const char *str, vector <LardTagConfig> &lardTags)
-+{
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+    LOGXML("@%s, str = %s", __func__, str);
-+
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+
-+    char *savePtr;
-+    char *tuningMode = strtok_r(src, ",", &savePtr);
-+    LardTagConfig cfg;
-+    while (tuningMode) {
-+        char* cmcTag = strtok_r(nullptr, ",", &savePtr);
-+        char* aiqTag = strtok_r(nullptr, ",", &savePtr);
-+        char* ispTag = strtok_r(nullptr, ",", &savePtr);
-+        char* othersTag = strtok_r(nullptr, ",", &savePtr);
-+
-+        cfg.tuningMode = CameraUtils::string2TuningMode(tuningMode);
-+        cfg.cmcTag = CameraUtils::fourcc2UL(cmcTag);
-+        cfg.aiqTag = CameraUtils::fourcc2UL(aiqTag);
-+        cfg.ispTag = CameraUtils::fourcc2UL(ispTag);
-+        cfg.othersTag = CameraUtils::fourcc2UL(othersTag);
-+        CheckError(cfg.cmcTag == 0 || cfg.aiqTag == 0 || cfg.ispTag == 0
-+              || cfg.othersTag == 0, -1, "@%s, wrong str %s", __func__, str);
-+
-+        lardTags.push_back(cfg);
-+        LOGXML("@%s, tuningMode %s, cmc %s, aiq %s, isp %s, others %s",
-+                __func__, tuningMode, cmcTag, aiqTag, ispTag, othersTag);
-+
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        tuningMode = strtok_r(nullptr, ",", &savePtr);
-+    }
-+
-+    return 0;
-+}
-+
-+void CameraParser::parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    MediaCtlConf mc;
-+    int idx = 0;
-+
-+    while (atts[idx]) {
-+        const char *key = atts[idx];
-+        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
-+        if (strcmp(key, "id") == 0) {
-+            mc.mcId = strtol(atts[idx + 1], nullptr, 10);
-+        } else if (strcmp(key, "ConfigMode") == 0) {
-+            parseXmlConvertStrings(atts[idx + 1], mc.configMode, CameraUtils::getConfigModeByName);
-+        } else if (strcmp(key, "outputWidth") == 0) {
-+            mc.outputWidth = strtoul(atts[idx + 1], nullptr, 10);
-+        } else if (strcmp(key, "outputHeight") == 0) {
-+            mc.outputHeight = strtoul(atts[idx + 1], nullptr, 10);
-+        } else if (strcmp(key, "format") == 0) {
-+            mc.format = CameraUtils::string2PixelCode(atts[idx + 1]);
-+        }
-+        idx += 2;
-+    }
-+
-+    LOGXML("@%s, name:%s, atts[0]:%s, id: %d", __func__, name, atts[0], mc.mcId);
-+    //Add a new empty MediaControl Configuration
-+    profiles->pCurrentCam->mMediaCtlConfs.push_back(mc);
-+}
-+
-+#define V4L2_CID_WATERMARK  0x00982901
-+#define V4L2_CID_WATERMARK2 0x00982902
-+void CameraParser::parseControlElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    McCtl ctl;
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    LOGXML("@%s, name:%s", __func__, name);
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx + 1, val);
-+        if (strcmp(key, "name") == 0) {
-+            ctl.entityName = replaceStringInXml(profiles, val);
-+            ctl.entity = profiles->mMC->getEntityIdByName(ctl.entityName.c_str());
-+        } else if (strcmp(key, "ctrlId") == 0) {
-+            if (!strcmp(val, "V4L2_CID_LINK_FREQ")) {
-+                ctl.ctlCmd = V4L2_CID_LINK_FREQ;
-+            } else if (!strcmp(val, "V4L2_CID_VBLANK")) {
-+                ctl.ctlCmd = V4L2_CID_VBLANK;
-+            } else if (!strcmp(val, "V4L2_CID_HBLANK")) {
-+                ctl.ctlCmd = V4L2_CID_HBLANK;
-+            } else if (!strcmp(val, "V4L2_CID_EXPOSURE")) {
-+                ctl.ctlCmd = V4L2_CID_EXPOSURE;
-+            } else if (!strcmp(val, "V4L2_CID_ANALOGUE_GAIN")) {
-+                ctl.ctlCmd = V4L2_CID_ANALOGUE_GAIN;
-+            } else if (!strcmp(val, "V4L2_CID_HFLIP")) {
-+                ctl.ctlCmd = V4L2_CID_HFLIP;
-+            } else if (!strcmp(val, "V4L2_CID_VFLIP")) {
-+                ctl.ctlCmd = V4L2_CID_VFLIP;
-+            } else if (!strcmp(val, "V4L2_CID_WATERMARK")) {
-+                ctl.ctlCmd = V4L2_CID_WATERMARK;
-+            } else if (!strcmp(val, "V4L2_CID_WATERMARK2")) {
-+                ctl.ctlCmd = V4L2_CID_WATERMARK2;
-+            } else if (!strcmp(val, "V4L2_CID_TEST_PATTERN")) {
-+                ctl.ctlCmd = V4L2_CID_TEST_PATTERN;
-+            } else {
-+                LOGE("Unknow ioctl command %s", val);
-+                ctl.ctlCmd = -1;
-+            }
-+        } else if (strcmp(key, "value") == 0) {
-+            ctl.ctlValue = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "ctrlName") == 0) {
-+            ctl.ctlName = val;
-+        }
-+        idx += 2;
-+    }
-+
-+    mc.ctls.push_back(ctl);
-+}
-+
-+void CameraParser::parseSelectionElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    McFormat sel;
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    LOGXML("@%s, name:%s", __func__, name);
-+
-+    sel.top = -1; //top is not specified, need to be calc later.
-+    sel.left = -1; //left is not specified, need to be calc later.
-+    sel.width = 0; //width is not specified, need to be calc later.
-+    sel.height = 0; //height is not specified, need to be calc later.
-+    sel.formatType = FC_SELECTION;
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+        if (strcmp(key, "name") == 0) {
-+            sel.entityName = replaceStringInXml(profiles, val);
-+            sel.entity = profiles->mMC->getEntityIdByName(sel.entityName.c_str());
-+        } else if (strcmp(key, "pad") == 0) {
-+            sel.pad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "target") == 0) {
-+            if (!strcmp(val, "V4L2_SEL_TGT_COMPOSE")) {
-+                sel.selCmd = V4L2_SEL_TGT_COMPOSE;
-+            } else if (!strcmp(val, "V4L2_SEL_TGT_CROP")) {
-+                sel.selCmd = V4L2_SEL_TGT_CROP;
-+            }
-+        } else if (strcmp(key, "top") == 0) {
-+            sel.top = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "left") == 0) {
-+            sel.left = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "width") == 0) {
-+            sel.width = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "height") == 0) {
-+            sel.height = strtoul(val, nullptr, 10);
-+        }
-+        idx += 2;
-+    }
-+
-+    mc.formats.push_back(sel);
-+}
-+
-+/**
-+ * Store the MediaCtlConf mapping table for supportedStreamConfig by id.
-+ * Then we can select the MediaCtlConf through this table and configured stream.
-+ */
-+void CameraParser::storeMcMappForConfig(int mcId, supported_stream_config_t streamCfg)
-+{
-+    //We need to insert new one if mcId isn't in mStreamToMcMap.
-+    if (pCurrentCam->mStreamToMcMap.find(mcId) == pCurrentCam->mStreamToMcMap.end()) {
-+        pCurrentCam->mStreamToMcMap.insert(std::pair<int, supported_stream_config_array_t>(mcId, supported_stream_config_array_t()));
-+    }
-+
-+    supported_stream_config_array_t &streamVector = pCurrentCam->mStreamToMcMap[mcId];
-+    streamVector.push_back(streamCfg);
-+}
-+
-+/**
-+ * \brief Parses the string with the supported stream configurations
-+ * a stream configuration is made of 4 necessary elements
-+ * - Format
-+ * - Resolution
-+ * - Field (Interlaced field)
-+ * - Media config ID
-+ * we parse the string in 4 steps
-+ * example of valid stream configuration is: V4L2_PIX_FMT_NV12,1920x1080,0,0
-+
-+ * the following elements are optional:
-+ * - Max fps, for continuous streaming and high quality capture. (optional)
-+ * example: V4L2_PIX_FMT_NV12,1920x1080,0,0,(30/15)
-+ *
-+ * \param src: string to be parsed
-+ * \param configs: Stream config array needs to be filled in
-+ *
-+ */
-+void CameraParser::parseStreamConfig(const char* src, supported_stream_config_array_t& configs)
-+{
-+    HAL_TRACE_CALL(1);
-+
-+    int mcId = -1;
-+    char* endPtr = nullptr;
-+    char* separatorPtr = nullptr;
-+    int parseStep = 0;
-+    supported_stream_config_t config;
-+    CLEAR(config);
-+
-+#define NUM_ELEMENTS_NECESSARY 4
-+// Has optional element
-+#define NUM_ELEMENTS (NUM_ELEMENTS_NECESSARY + 1)
-+
-+    bool lastElement = false; // the last one?
-+    do {
-+        parseStep++;
-+
-+        bool fetchElement = false;
-+        // Get the next segement for necessary element
-+        // Get the next segement for optional element if it exist
-+        if (parseStep <= NUM_ELEMENTS_NECESSARY
-+            || (!lastElement && (*src == '('))) {
-+            fetchElement = true;
-+
-+            separatorPtr = (char *)strchr(src, ',');
-+            if (separatorPtr) {
-+                *separatorPtr = 0;
-+            } else {
-+                lastElement = true;
-+            }
-+        }
-+
-+        switch (parseStep) {
-+            case 1: // Step 1: Parse format
-+                LOGXML("stream format is %s", src);
-+                config.format = CameraUtils::string2PixelCode(src);
-+                CheckError(config.format == -1, VOID_VALUE, "@%s, format fails", __func__);
-+                break;
-+            case 2: // Step 2: Parse the resolution
-+                config.width = strtol(src, &endPtr, 10);
-+                CheckError(!endPtr || *endPtr != 'x', VOID_VALUE, "@%s, width fails", __func__);
-+                src = endPtr + 1;
-+                config.height = strtol(src, &endPtr, 10);
-+                LOGXML("(%dx%d)", config.width, config.height);
-+                break;
-+            case 3: // Step 3: Parse field
-+                config.field = strtol(src, &endPtr, 10);
-+                LOGXML("stream field is %d", config.field);
-+                break;
-+            case 4: // Step 4: Parse MediaCtlConf id.
-+                mcId = strtol(src, &endPtr, 10);
-+                CheckError(mcId < 0, VOID_VALUE, "@%s, mcId fails", __func__);
-+                LOGXML("the mcId for supported stream config is %d", mcId);
-+                break;
-+            case 5: // Step 5: Parse optional
-+                if (fetchElement) {
-+                    src++; // skip '('
-+                    config.maxVideoFps = strtol(src, &endPtr, 10);
-+                    CheckError(!endPtr || *endPtr != '/', VOID_VALUE, "@%s, maxVideoFps fails", __func__);
-+                    src = endPtr + 1; // skip '/'
-+                    config.maxCaptureFps = strtol(src, &endPtr, 10);
-+                    CheckError(!endPtr || *endPtr != '/', VOID_VALUE, "@%s, maxCaptureFps fails", __func__);
-+                    src = endPtr + 1; // skip '/'
-+                    config.streamType = strtol(src, &endPtr, 10);
-+                    CheckError(config.streamType < CAMERA_STREAM_OUTPUT ||
-+                               config.streamType > CAMERA_STREAM_BIDIRECTIONAL, VOID_VALUE,
-+                               "@%s, streamType:%d fails", __func__, config.streamType);
-+                    LOGXML("@%s, maxVideoFps:%d, maxCaptureFps:%d, streamType:%d", __func__,
-+                           config.maxVideoFps, config.maxCaptureFps, config.streamType);
-+                } else {
-+                    LOGXML("no max fps for supported stream config, use default");
-+                    config.maxVideoFps = 30;
-+                    config.maxCaptureFps = 30;
-+                    config.streamType = 0;
-+                }
-+                break;
-+        }
-+
-+        if (!lastElement) {
-+            // Move to the next element
-+            src = separatorPtr + 1;
-+            src = skipWhiteSpace(src);
-+        } else if (parseStep < NUM_ELEMENTS_NECESSARY ){
-+            LOGE("Malformed stream configuration, only finish step %d", parseStep);
-+            return;
-+        }
-+
-+        // Finish all elements for one config
-+        if (parseStep >= NUM_ELEMENTS) {
-+            configs.push_back(config);
-+            storeMcMappForConfig(mcId, config);
-+            CLEAR(config);
-+            mcId = -1;
-+            parseStep = 0;
-+            LOGXML("Stream Configuration found");
-+            if (lastElement) {
-+                break;
-+            }
-+        }
-+    } while (true);
-+}
-+
-+void CameraParser::parseSupportedFeatures(const char* src, camera_features_list_t& features)
-+{
-+    HAL_TRACE_CALL(1);
-+
-+    char * endPtr = nullptr;
-+    camera_features feature = INVALID_FEATURE;
-+    do {
-+        endPtr = (char *)strchr(src, ',');
-+        if (endPtr) {
-+            *endPtr = 0;
-+        }
-+        if (strcmp(src, "MANUAL_EXPOSURE") == 0) {
-+            feature = MANUAL_EXPOSURE;
-+        } else if (strcmp(src, "MANUAL_WHITE_BALANCE") == 0) {
-+            feature = MANUAL_WHITE_BALANCE;
-+        } else if (strcmp(src, "IMAGE_ENHANCEMENT") == 0) {
-+            feature = IMAGE_ENHANCEMENT;
-+        } else if (strcmp(src, "NOISE_REDUCTION") == 0) {
-+            feature = NOISE_REDUCTION;
-+        } else if (strcmp(src, "SCENE_MODE") == 0) {
-+            feature = SCENE_MODE;
-+        } else if (strcmp(src, "WEIGHT_GRID_MODE") == 0) {
-+            feature = WEIGHT_GRID_MODE;
-+        } else if (strcmp(src, "PER_FRAME_CONTROL") == 0) {
-+            feature = PER_FRAME_CONTROL;
-+        } else if (strcmp(src, "ISP_CONTROL") == 0) {
-+            feature = ISP_CONTROL;
-+        } else {
-+            feature = INVALID_FEATURE;
-+        }
-+
-+        if (feature != INVALID_FEATURE) {
-+            features.push_back(feature);
-+        }
-+
-+        if (endPtr) {
-+            src = endPtr + 1;
-+            src = skipWhiteSpace(src);
-+        }
-+    } while (endPtr);
-+}
-+
-+int CameraParser::parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes)
-+{
-+    HAL_TRACE_CALL(1);
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+
-+    char *savePtr, *tablePtr;
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    camera_video_stabilization_mode_t mode = VIDEO_STABILIZATION_MODE_OFF;
-+
-+    tablePtr = strtok_r(src, ",", &savePtr);
-+    while (tablePtr) {
-+        if (strcmp(tablePtr, "ON") == 0) {
-+            mode = VIDEO_STABILIZATION_MODE_ON;
-+        } else if (strcmp(tablePtr, "OFF") == 0) {
-+            mode = VIDEO_STABILIZATION_MODE_OFF;
-+        }
-+        supportedModes.push_back(mode);
-+
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        tablePtr = strtok_r(nullptr, ",", &savePtr);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraParser::parseSupportedAeMode(const char* str, vector <camera_ae_mode_t> &supportedModes)
-+{
-+    HAL_TRACE_CALL(1);
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+
-+    char *savePtr, *tablePtr;
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    camera_ae_mode_t aeMode = AE_MODE_AUTO;
-+
-+    tablePtr = strtok_r(src, ",", &savePtr);
-+    while (tablePtr) {
-+        if (strcmp(tablePtr, "AUTO") == 0) {
-+            aeMode = AE_MODE_AUTO;
-+        } else if (strcmp(tablePtr, "MANUAL") == 0) {
-+            aeMode = AE_MODE_MANUAL;
-+        }
-+        supportedModes.push_back(aeMode);
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        tablePtr = strtok_r(nullptr, ",", &savePtr);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraParser::parseSupportedAfMode(const char* str, vector <camera_af_mode_t> &supportedModes)
-+{
-+    HAL_TRACE_CALL(1);
-+    CheckError(str == NULL, -1, "@%s, str is NULL", __func__);
-+
-+    char *savePtr, *tablePtr;
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    camera_af_mode_t afMode = AF_MODE_AUTO;
-+
-+    tablePtr = strtok_r(src, ",", &savePtr);
-+    while (tablePtr) {
-+        if (strcmp(tablePtr, "AUTO") == 0) {
-+            afMode = AF_MODE_AUTO;
-+        } else if (strcmp(tablePtr, "MACRO") == 0) {
-+            afMode = AF_MODE_MACRO;
-+        } else if (strcmp(tablePtr, "CONTINUOUS_VIDEO") == 0) {
-+            afMode = AF_MODE_CONTINUOUS_VIDEO;
-+        } else if (strcmp(tablePtr, "CONTINUOUS_PICTURE") == 0) {
-+            afMode = AF_MODE_CONTINUOUS_PICTURE;
-+        } else if (strcmp(tablePtr, "OFF") == 0) {
-+            afMode = AF_MODE_OFF;
-+        }
-+        supportedModes.push_back(afMode);
-+        if (savePtr != NULL)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        tablePtr = strtok_r(NULL, ",", &savePtr);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraParser::parseSupportedAntibandingMode(const char* str, vector <camera_antibanding_mode_t> &supportedModes)
-+{
-+    HAL_TRACE_CALL(1);
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+
-+    char *savePtr, *tablePtr;
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    camera_antibanding_mode_t antibandingMode = ANTIBANDING_MODE_OFF;
-+
-+    tablePtr = strtok_r(src, ",", &savePtr);
-+    while (tablePtr) {
-+        if (strcmp(tablePtr, "AUTO") == 0) {
-+            antibandingMode = ANTIBANDING_MODE_AUTO;
-+        } else if (strcmp(tablePtr, "50Hz") == 0) {
-+            antibandingMode = ANTIBANDING_MODE_50HZ;
-+        } else if (strcmp(tablePtr, "60Hz") == 0) {
-+            antibandingMode = ANTIBANDING_MODE_60HZ;
-+        } else if (strcmp(tablePtr, "OFF") == 0) {
-+            antibandingMode = ANTIBANDING_MODE_OFF;
-+        }
-+        supportedModes.push_back(antibandingMode);
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+        tablePtr = strtok_r(nullptr, ",", &savePtr);
-+    }
-+
-+    return OK;
-+}
-+
-+int CameraParser::parseSupportedAeParamRange(const char* src, vector<int>& scenes,
-+        vector<float>& minValues, vector<float>& maxValues)
-+{
-+    HAL_TRACE_CALL(1);
-+    char* srcDup = strdup(src);
-+    CheckError((srcDup == nullptr), NO_MEMORY, "Create a copy of source string failed.");
-+
-+    char* srcTmp = srcDup;
-+    char* endPtr = nullptr;
-+    while ((endPtr = (char *)strchr(srcTmp, ','))) {
-+        if (endPtr) *endPtr = 0;
-+
-+        camera_scene_mode_t scene = CameraUtils::getSceneModeByName(srcTmp);
-+        scenes.push_back(scene);
-+        if (endPtr) {
-+            srcTmp = endPtr + 1;
-+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        }
-+
-+        float min = strtof(srcTmp, &endPtr);
-+        minValues.push_back(min);
-+        if (endPtr == nullptr || *endPtr != ',') {
-+            LOGE("Malformed ET range in exposure time range configuration");
-+            free(srcDup);
-+            return UNKNOWN_ERROR;
-+        }
-+        srcTmp = endPtr + 1;
-+        float max = strtof(srcTmp, &endPtr);
-+        maxValues.push_back(max);
-+
-+        if (endPtr) {
-+            srcTmp = endPtr + 1;
-+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        }
-+    }
-+    free(srcDup);
-+    return OK;
-+}
-+
-+void CameraParser::parseFormatElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s", __func__, name);
-+
-+    McFormat fmt;
-+    fmt.type = RESOLUTION_TARGET;
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+        if (strcmp(key, "name") == 0) {
-+            fmt.entityName = replaceStringInXml(profiles, val);
-+            fmt.entity = profiles->mMC->getEntityIdByName(fmt.entityName.c_str());
-+        } else if (strcmp(key, "pad") == 0) {
-+            fmt.pad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "stream") == 0) {
-+            fmt.stream = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "type") == 0) {
-+            if (strcmp(val, "RESOLUTION_MAX") == 0) {
-+                fmt.type = RESOLUTION_MAX;
-+            } else if (strcmp(val, "RESOLUTION_COMPOSE") == 0) {
-+                fmt.type = RESOLUTION_COMPOSE;
-+            } else if (strcmp(val, "RESOLUTION_CROP") == 0) {
-+                fmt.type = RESOLUTION_CROP;
-+            } else if (strcmp(val, "RESOLUTION_TARGET") == 0) {
-+                fmt.type = RESOLUTION_TARGET;
-+            } else {
-+                LOGE("Parse format type failed. type = %s", val);
-+                return;
-+            }
-+        } else if (strcmp(key, "width") == 0) {
-+            fmt.width = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "height") == 0) {
-+            fmt.height = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "format") == 0) {
-+            fmt.pixelCode = CameraUtils::string2PixelCode(val);
-+        }
-+        idx += 2;
-+    }
-+
-+    fmt.formatType = FC_FORMAT;
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    mc.formats.push_back(fmt);
-+}
-+
-+void CameraParser::parseLinkElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    McLink link;
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    LOGXML("@%s, name:%s", __func__, name);
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+        if (strcmp(key, "srcName") == 0) {
-+            link.srcEntityName = replaceStringInXml(profiles, val);
-+            link.srcEntity = profiles->mMC->getEntityIdByName(link.srcEntityName.c_str());
-+        } else if (strcmp(key, "srcPad") == 0) {
-+            link.srcPad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "sinkName") == 0) {
-+            link.sinkEntityName = replaceStringInXml(profiles, val);
-+            link.sinkEntity = profiles->mMC->getEntityIdByName(link.sinkEntityName.c_str());
-+        } else if (strcmp(key, "sinkPad") == 0) {
-+            link.sinkPad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "enable") == 0) {
-+            link.enable = strcmp(val, "true") == 0;
-+        }
-+
-+        idx += 2;
-+    }
-+
-+    mc.links.push_back(link);
-+}
-+
-+void CameraParser::parseRouteElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    McRoute route;
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    LOGXML("@%s, name:%s", __func__, name);
-+    route.flag = MEDIA_LNK_FL_ENABLED;
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+        if (strcmp(key, "name") == 0) {
-+            route.entityName = replaceStringInXml(profiles, val);
-+            route.entity = profiles->mMC->getEntityIdByName(route.entityName.c_str());
-+        } else if (strcmp(key, "srcPad") == 0) {
-+            route.srcPad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "sinkPad") == 0) {
-+            route.sinkPad = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "srcStream") == 0) {
-+            route.srcStream = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "sinkStream") == 0) {
-+            route.sinkStream = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "flag") == 0) {
-+            route.flag = strtoul(val, nullptr, 10);
-+        }
-+        idx += 2;
-+    }
-+
-+    mc.routes.push_back(route);
-+}
-+
-+void CameraParser::parseVideoElement(CameraParser *profiles, const char * /*name*/, const char **atts)
-+{
-+   McVideoNode videoNode;
-+   MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+
-+   videoNode.name = replaceStringInXml(profiles, atts[1]);
-+   videoNode.videoNodeType = GetNodeType(atts[3]);
-+   LOGXML("@%s, name:%s, videoNodeType:%d", __func__, videoNode.name.c_str(), videoNode.videoNodeType);
-+
-+   mc.videoNodes.push_back(videoNode);
-+}
-+
-+// MediaCtl output tag xml parsing code for the field like:
-+// <output port="main" width="1920" height="1088" format="V4L2_PIX_FMT_YUYV420_V32"/>
-+// <output port="second" width="3264" height="2448" format="V4L2_PIX_FMT_SGRBG12V32"/>
-+void CameraParser::parseOutputElement(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s", __func__, name);
-+
-+    McOutput output;
-+
-+    int idx = 0;
-+    while (atts[idx]) {
-+        const char* key = atts[idx];
-+        const char* val = atts[idx + 1];
-+        LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+        if (strcmp(key, "port") == 0) {
-+            if (strcmp(val, "main") ==  0)
-+                output.port = MAIN_PORT;
-+            else if (strcmp(val, "second") ==  0)
-+                output.port = SECOND_PORT;
-+            else if (strcmp(val, "third") ==  0)
-+                output.port = THIRD_PORT;
-+            else if (strcmp(val, "forth") ==  0)
-+                output.port = FORTH_PORT;
-+            else
-+                output.port = INVALID_PORT;
-+        } else if (strcmp(key, "width") == 0) {
-+            output.width = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "height") == 0) {
-+            output.height = strtoul(val, nullptr, 10);
-+        } else if (strcmp(key, "format") == 0) {
-+            output.v4l2Format = CameraUtils::string2PixelCode(val);
-+        }
-+        idx += 2;
-+    }
-+
-+    LOGXML("@%s, port:%d, output size:%dx%d, v4l2Format:%x", __func__, output.port,
-+            output.width, output.height, output.v4l2Format);
-+
-+    MediaCtlConf &mc = profiles->pCurrentCam->mMediaCtlConfs.back();
-+    mc.outputs.push_back(output);
-+}
-+
-+void CameraParser::parseMultiExpRange(const char* src)
-+{
-+    ExpRange* range = nullptr;
-+    MultiExpRange multiRange;
-+    MultiExpRange* pCurrRange = nullptr;
-+    pCurrentCam->mMultiExpRanges.clear();
-+    static const int MULTI_EXPOSURE_TAG_SHS1 = 0;
-+    static const int MULTI_EXPOSURE_TAG_RHS1 = 1;
-+    static const int MULTI_EXPOSURE_TAG_SHS2 = 2;
-+    static const int MULTI_EXPOSURE_TAG_RHS2 = 3;
-+    static const int MULTI_EXPOSURE_TAG_SHS3 = 4;
-+
-+    string srcDup = src;
-+    CheckError((srcDup.c_str() == nullptr), VOID_VALUE, "Create a copy of source string failed.");
-+
-+    const char* srcTmp = srcDup.c_str();
-+    char* endPtr = nullptr;
-+    int tag = -1;
-+    while ((endPtr = (char *)strchr(srcTmp, ','))) {
-+        *endPtr = 0;
-+        if (strcmp(srcTmp, "SHS1") == 0) {
-+            tag = MULTI_EXPOSURE_TAG_SHS1;
-+        } else if (strcmp(srcTmp, "RHS1") == 0) {
-+            tag = MULTI_EXPOSURE_TAG_RHS1;
-+        } else if (strcmp(srcTmp, "SHS2") == 0) {
-+            tag = MULTI_EXPOSURE_TAG_SHS2;
-+        } else if (strcmp(srcTmp, "RHS2") == 0) {
-+            tag = MULTI_EXPOSURE_TAG_RHS2;
-+        } else if (strcmp(srcTmp, "SHS3") == 0) {
-+            tag = MULTI_EXPOSURE_TAG_SHS3;
-+        } else {
-+            LOGE("Malformed tag for multi-exposure range configuration");
-+            return;
-+        }
-+
-+        if (endPtr) {
-+            srcTmp = endPtr + 1;
-+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        }
-+
-+        CLEAR(multiRange);
-+        multiRange.Resolution.width = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        multiRange.Resolution.height = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed resolution for multi-exposure range configuration");
-+
-+        pCurrRange = nullptr;
-+        for (unsigned int i = 0; i < pCurrentCam->mMultiExpRanges.size(); i++) {
-+            if (pCurrentCam->mMultiExpRanges[i].Resolution.width == multiRange.Resolution.width &&
-+                pCurrentCam->mMultiExpRanges[i].Resolution.height == multiRange.Resolution.height) {
-+                pCurrRange = &(pCurrentCam->mMultiExpRanges[i]);
-+                break;
-+            }
-+        }
-+        if (pCurrRange) {
-+            switch (tag) {
-+                case MULTI_EXPOSURE_TAG_SHS1:
-+                    range = &pCurrRange->SHS1;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_RHS1:
-+                    range = &pCurrRange->RHS1;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_SHS2:
-+                    range = &pCurrRange->SHS2;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_RHS2:
-+                    range = &pCurrRange->RHS2;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_SHS3:
-+                    range = &pCurrRange->SHS3;
-+                    break;
-+                default:
-+                    LOGE("Wrong tag for multi-exposure range configuration");
-+                    return;
-+            }
-+        } else {
-+            switch (tag) {
-+                case MULTI_EXPOSURE_TAG_SHS1:
-+                    range = &multiRange.SHS1;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_RHS1:
-+                    range = &multiRange.RHS1;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_SHS2:
-+                    range = &multiRange.SHS2;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_RHS2:
-+                    range = &multiRange.RHS2;
-+                    break;
-+                case MULTI_EXPOSURE_TAG_SHS3:
-+                    range = &multiRange.SHS3;
-+                    break;
-+                default:
-+                    LOGE("Wrong tag for multi-exposure range configuration");
-+                    return;
-+            }
-+        }
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        range->min = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        range->max = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        range->step = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        range->lowerBound = strtol(srcTmp, &endPtr, 10);
-+        CheckError((endPtr == nullptr || *endPtr != ','), VOID_VALUE, "Malformed range for multi-exposure range configuration");
-+
-+        srcTmp = endPtr + 1;
-+        srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        range->upperBound = strtol(srcTmp, &endPtr, 10);
-+
-+        if (endPtr) {
-+            srcTmp = endPtr + 1;
-+            srcTmp = const_cast<char*>(skipWhiteSpace(srcTmp));
-+        }
-+
-+        if (!pCurrRange) {
-+            pCurrentCam->mMultiExpRanges.push_back(multiRange);
-+        }
-+    }
-+}
-+
-+int CameraParser::parsePair(const char *str, int *first, int *second, char delim, char **endptr)
-+{
-+    // Find the first integer.
-+    char *end;
-+    int w = (int)strtol(str, &end, 10);
-+    // If a delimeter does not immediately follow, give up.
-+    if (*end != delim) {
-+        LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
-+        return -1;
-+    }
-+
-+    // Find the second integer, immediately after the delimeter.
-+    int h = (int)strtol(end+1, &end, 10);
-+
-+    *first = w;
-+    *second = h;
-+
-+    if (endptr) {
-+        *endptr = end;
-+    }
-+
-+    return 0;
-+}
-+
-+void CameraParser::parseSizesList(const char *sizesStr, vector <camera_resolution_t> &sizes)
-+{
-+    if (sizesStr == 0) {
-+        return;
-+    }
-+
-+    char *sizeStartPtr = (char *)sizesStr;
-+
-+    while (true) {
-+        camera_resolution_t r;
-+        int success = parsePair(sizeStartPtr, &r.width, &r.height, 'x',
-+                                 &sizeStartPtr);
-+        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
-+            LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
-+            return;
-+        }
-+        if (r.width > 0 && r.height > 0)
-+            sizes.push_back(r);
-+
-+        if (*sizeStartPtr == '\0') {
-+            return;
-+        }
-+        sizeStartPtr++;
-+    }
-+}
-+
-+/*
-+ * The pls output to user requirement mapping table
-+ *
-+ * first: user requirement, second: psl output
-+ * eg: <pslOutputForRotation value="3264x2448@1200x1600"/>
-+ */
-+void CameraParser::parseOutputMap(const char *str, vector<UserToPslOutputMap> &outputMap)
-+{
-+    char *srcDup = strdup(str);
-+    CheckError((srcDup == nullptr), VOID_VALUE, "Create a copy of source string failed.");
-+
-+    char *srcTmp = srcDup;
-+    char *endPtr = nullptr;
-+    do {
-+        endPtr = (char *)strchr(srcTmp, ',');
-+        if (endPtr) {
-+            *endPtr = 0;
-+        }
-+        char *tmpPtr = (char *)strchr(srcTmp, '@');
-+        if (tmpPtr) {
-+            *tmpPtr = 0;
-+        }
-+
-+        UserToPslOutputMap map;
-+        parsePair(srcTmp, &(map.User).width, &(map.User).height, 'x');
-+        if (tmpPtr) {
-+            srcTmp = tmpPtr + 1;
-+            srcTmp = (char*)skipWhiteSpace(srcTmp);
-+        }
-+        parsePair(srcTmp, &(map.Psl).width, &(map.Psl).height, 'x');
-+        outputMap.push_back(map);
-+
-+        if (endPtr) {
-+            srcTmp = endPtr + 1;
-+            srcTmp = (char*)skipWhiteSpace(srcTmp);
-+        }
-+    } while (endPtr);
-+
-+    free(srcDup);
-+}
-+
-+int CameraParser::getSupportedFormat(const char* str, vector <int>& supportedFormat)
-+{
-+    if (str == nullptr) {
-+        LOGE("the str is nullptr");
-+        return -1;
-+    }
-+
-+    LOGXML("@%s, str:%s", __func__, str);
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+    char* savePtr;
-+    char* fmt = strtok_r(src, ",", &savePtr);
-+    while (fmt) {
-+        int actual = CameraUtils::string2PixelCode(fmt);
-+        if (actual != -1) {
-+            supportedFormat.push_back(actual);
-+            LOGXML("@%s, add format:%d", __func__, actual);
-+        }
-+        fmt = strtok_r(nullptr, ",", &savePtr);
-+    }
-+
-+    return 0;
-+}
-+
-+/**
-+ * This function will handle all the MediaCtlCfg related elements.
-+ *
-+ * It will be called in the function startElement
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void CameraParser::handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
-+    if (strcmp(name, "MediaCtlConfig") == 0) {
-+        parseMediaCtlConfigElement(profiles, name, atts);
-+    } else if (strcmp(name, "link") == 0) {
-+        parseLinkElement(profiles, name, atts);
-+    } else if (strcmp(name, "route") == 0) {
-+        parseRouteElement(profiles, name, atts);
-+    } else if (strcmp(name, "control") == 0) {
-+        parseControlElement(profiles, name, atts);
-+    } else if (strcmp(name, "selection") == 0) {
-+        parseSelectionElement(profiles, name, atts);
-+    } else if (strcmp(name, "format") == 0) {
-+        parseFormatElement(profiles, name, atts);
-+    } else if (strcmp(name, "videonode") == 0) {
-+        parseVideoElement(profiles, name, atts);
-+    } else if (strcmp(name, "output") == 0) {
-+        parseOutputElement(profiles, name, atts);
-+    }
-+}
-+
-+/**
-+ * This function will handle all the StaticMetadata related elements.
-+ *
-+ * It will be called in the function startElement
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void CameraParser::handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s, atts[0]:%s, profiles->mCurrentSensor:%d", __func__, name, atts[0], profiles->mCurrentSensor);
-+    if (strcmp(name, "supportedStreamConfig") == 0) {
-+        supported_stream_config_array_t configsArray;
-+        parseStreamConfig(atts[1], configsArray);
-+        const int STREAM_MEMBER_NUM = sizeof(supported_stream_config_t) / sizeof(int);
-+        int dataSize = configsArray.size() * STREAM_MEMBER_NUM;
-+        int configs[dataSize];
-+        CLEAR(configs);
-+        for (size_t i = 0; i < configsArray.size(); i++) {
-+            LOGXML("@%s, stream config info: format=%s (%dx%d) field=%d type=%d", __func__,
-+                    CameraUtils::format2string(configsArray[i].format).c_str(),
-+                    configsArray[i].width, configsArray[i].height,
-+                    configsArray[i].field, configsArray[i].streamType);
-+            MEMCPY_S(&configs[i * STREAM_MEMBER_NUM], sizeof(supported_stream_config_t),
-+                     &configsArray[i], sizeof(supported_stream_config_t));
-+        }
-+        mMetadata.update(CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, configs, dataSize);
-+    } else if (strcmp(name, "fpsRange") == 0) {
-+        vector<double> rangeArray;
-+        parseXmlConvertStrings(atts[1], rangeArray, atof);
-+        float fpsRange[rangeArray.size()];
-+        CLEAR(fpsRange);
-+        for (size_t i = 0; i < rangeArray.size(); i++){
-+            fpsRange[i] = static_cast<float>(rangeArray[i]);
-+        }
-+        LOGXML("@%s, supported fps range size: %zu", __func__, rangeArray.size());
-+        mMetadata.update(CAMERA_AE_AVAILABLE_TARGET_FPS_RANGES, fpsRange, ARRAY_SIZE(fpsRange));
-+    } else if (strcmp(name, "evRange") == 0) {
-+        vector<int> rangeArray;
-+        parseXmlConvertStrings(atts[1], rangeArray, atoi);
-+
-+        int evRange[rangeArray.size()];
-+        CLEAR(evRange);
-+        for (size_t i = 0; i < rangeArray.size(); i++) {
-+            evRange[i] = rangeArray[i];
-+        }
-+        LOGXML("@%s, supported ev range size: %zu", __func__, rangeArray.size());
-+        mMetadata.update(CAMERA_AE_COMPENSATION_RANGE, evRange, ARRAY_SIZE(evRange));
-+    } else if (strcmp(name, "evStep") == 0) {
-+        vector<int> rationalType;
-+        int ret = parseXmlConvertStrings(atts[1], rationalType, atoi);
-+        CheckError((ret != OK), VOID_VALUE, "Parse evStep failed");
-+
-+        icamera_metadata_rational_t evStep = {rationalType[0], rationalType[1]};
-+        LOGXML("@%s, the numerator: %d, denominator: %d", __func__, evStep.numerator, evStep.denominator);
-+        mMetadata.update(CAMERA_AE_COMPENSATION_STEP, &evStep, 1);
-+    } else if (strcmp(name, "supportedFeatures") == 0) {
-+        camera_features_list_t supportedFeatures;
-+        parseSupportedFeatures(atts[1], supportedFeatures);
-+        int numberOfFeatures = supportedFeatures.size();
-+        uint8_t features[numberOfFeatures];
-+        CLEAR(features);
-+        for (int i = 0; i < numberOfFeatures; i++) {
-+            features[i] = supportedFeatures[i];
-+        }
-+        mMetadata.update(INTEL_INFO_AVAILABLE_FEATURES, features, numberOfFeatures);
-+    } else if (strcmp(name, "supportedAeExposureTimeRange") == 0) {
-+        vector<int> scenes;
-+        vector<float> minValues, maxValues;
-+        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
-+        CheckError((ret != OK), VOID_VALUE, "Parse AE eExposure time range failed");
-+
-+        const int MEMBER_COUNT = 3;
-+        const int dataSize = scenes.size() * MEMBER_COUNT;
-+        int rangeData[dataSize];
-+        CLEAR(rangeData);
-+
-+        for (size_t i = 0; i < scenes.size(); i++) {
-+            LOGXML("@%s, scene mode:%d supported exposure time range (%f-%f)", __func__,
-+                    scenes[i], minValues[i], maxValues[i]);
-+            rangeData[i * MEMBER_COUNT] = scenes[i];
-+            rangeData[i * MEMBER_COUNT + 1] = (int)minValues[i];
-+            rangeData[i * MEMBER_COUNT + 2] = (int)maxValues[i];
-+        }
-+        mMetadata.update(INTEL_INFO_AE_EXPOSURE_TIME_RANGE, rangeData, dataSize);
-+    } else if (strcmp(name, "supportedAeGainRange") == 0) {
-+        vector<int> scenes;
-+        vector<float> minValues, maxValues;
-+        int ret = parseSupportedAeParamRange(atts[1], scenes, minValues, maxValues);
-+        CheckError((ret != OK), VOID_VALUE, "Parse AE gain range failed");
-+
-+        const int MEMBER_COUNT = 3;
-+        const int dataSize = scenes.size() * MEMBER_COUNT;
-+        int rangeData[dataSize];
-+        CLEAR(rangeData);
-+
-+        for (size_t i = 0; i < scenes.size(); i++) {
-+            LOGXML("@%s, scene mode:%d supported gain range (%f-%f)", __func__,
-+                    scenes[i], minValues[i], maxValues[i]);
-+            rangeData[i * MEMBER_COUNT] = scenes[i];
-+            // Since we use int to store float, before storing it we multiply min and max by 100.
-+            rangeData[i * MEMBER_COUNT + 1] = (int)(minValues[i] * 100);
-+            rangeData[i * MEMBER_COUNT + 2] = (int)(maxValues[i] * 100);
-+        }
-+        mMetadata.update(INTEL_INFO_AE_GAIN_RANGE, rangeData, dataSize);
-+    } else if (strcmp(name, "supportedVideoStabilizationModes") == 0) {
-+        camera_video_stabilization_list_t supportedMode;
-+        parseSupportedVideoStabilizationMode(atts[1], supportedMode);
-+        uint8_t modes[supportedMode.size()];
-+        CLEAR(modes);
-+        for(size_t i = 0; i < supportedMode.size(); i++) {
-+            modes[i] = supportedMode[i];
-+        }
-+        mMetadata.update(CAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, modes, supportedMode.size());
-+    } else if (strcmp(name, "supportedAeMode") == 0) {
-+        vector <camera_ae_mode_t> supportedAeMode;
-+        parseSupportedAeMode(atts[1], supportedAeMode);
-+        uint8_t aeModes[supportedAeMode.size()];
-+        CLEAR(aeModes);
-+        for (size_t i = 0; i < supportedAeMode.size(); i++) {
-+            aeModes[i] = supportedAeMode[i];
-+        }
-+        mMetadata.update(CAMERA_AE_AVAILABLE_MODES, aeModes, supportedAeMode.size());
-+    } else if (strcmp(name, "supportedAwbMode") == 0) {
-+        vector <camera_awb_mode_t> supportedAwbMode;
-+        parseXmlConvertStrings(atts[1], supportedAwbMode, CameraUtils::getAwbModeByName);
-+        uint8_t awbModes[supportedAwbMode.size()];
-+        CLEAR(awbModes);
-+        for (size_t i = 0; i < supportedAwbMode.size(); i++) {
-+            awbModes[i] = supportedAwbMode[i];
-+        }
-+        mMetadata.update(CAMERA_AWB_AVAILABLE_MODES, awbModes, supportedAwbMode.size());
-+    } else if (strcmp(name, "supportedSceneMode") == 0) {
-+        vector <camera_scene_mode_t> supportedSceneMode;
-+        parseXmlConvertStrings(atts[1], supportedSceneMode, CameraUtils::getSceneModeByName);
-+        uint8_t sceneModes[supportedSceneMode.size()];
-+        CLEAR(sceneModes);
-+        for (size_t i = 0; i < supportedSceneMode.size(); i++) {
-+            sceneModes[i] = supportedSceneMode[i];
-+        }
-+        mMetadata.update(CAMERA_CONTROL_AVAILABLE_SCENE_MODES, sceneModes, supportedSceneMode.size());
-+    } else if (strcmp(name, "supportedAfMode") == 0) {
-+        vector <camera_af_mode_t> supportedAfMode;
-+        parseSupportedAfMode(atts[1], supportedAfMode);
-+        uint8_t afModes[supportedAfMode.size()];
-+        CLEAR(afModes);
-+        for (size_t i = 0; i < supportedAfMode.size(); i++) {
-+            afModes[i] = supportedAfMode[i];
-+        }
-+        mMetadata.update(CAMERA_AF_AVAILABLE_MODES, afModes, supportedAfMode.size());
-+    } else if (strcmp(name, "supportedAntibandingMode") == 0) {
-+        vector <camera_antibanding_mode_t> supportedAntibandingMode;
-+        parseSupportedAntibandingMode(atts[1], supportedAntibandingMode);
-+        uint8_t antibandingModes[supportedAntibandingMode.size()];
-+        CLEAR(antibandingModes);
-+        for (size_t i = 0; i < supportedAntibandingMode.size(); i++) {
-+            antibandingModes[i] = supportedAntibandingMode[i];
-+        }
-+        mMetadata.update(CAMERA_AE_AVAILABLE_ANTIBANDING_MODES, antibandingModes, supportedAntibandingMode.size());
-+    } else if (strcmp(name, "sensorMountType") == 0) {
-+        uint8_t mountType = WALL_MOUNTED;
-+
-+        if (strcmp(atts[1], "CEILING_MOUNTED") == 0)
-+            mountType = CEILING_MOUNTED;
-+
-+        mMetadata.update(INTEL_INFO_SENSOR_MOUNT_TYPE, &mountType, 1);
-+        LOGXML("@%s, sensor mount type: %d", __func__, mountType);
-+    } else if (strcmp(name, "StaticMetadata") != 0) { // Make sure it doesn't reach the end of StaticMetadata.
-+        handleGenericStaticMetaData(name, atts[1]);
-+    }
-+}
-+
-+/**
-+ * \brief Parses string for generic static metadata and save them.
-+ *
-+ * \param name: the element's name.
-+ * \param src: the element's value, only include data and separator 'x' or ','.
-+ */
-+void CameraParser::handleGenericStaticMetaData(const char *name, const char *src)
-+{
-+    uint32_t tag =
-+            (strcmp(name, "ae.lockAvailable") == 0)              ? CAMERA_AE_LOCK_AVAILABLE
-+          : (strcmp(name, "awb.lockAvailable") == 0)             ? CAMERA_AWB_LOCK_AVAILABLE
-+          : (strcmp(name, "control.availableModes") == 0)        ? CAMERA_CONTROL_AVAILABLE_MODES
-+          : (strcmp(name, "control.availableSceneModes") == 0)    ? CAMERA_CONTROL_AVAILABLE_SCENE_MODES
-+          : (strcmp(name, "statistics.info.availableFaceDetectModes") == 0) ? CAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES
-+          : (strcmp(name, "statistics.info.maxFaceCount") == 0)    ? CAMERA_STATISTICS_INFO_MAX_FACE_COUNT
-+          : (strcmp(name, "sensor.info.activeArraySize") == 0)   ? CAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE
-+          : (strcmp(name, "sensor.info.pixelArraySize") == 0)    ? CAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE
-+          : (strcmp(name, "sensor.info.physicalSize") == 0)      ? CAMERA_SENSOR_INFO_PHYSICAL_SIZE
-+          : (strcmp(name, "sensor.info.sensitivityRange") == 0)  ? CAMERA_SENSOR_INFO_SENSITIVITY_RANGE
-+          : (strcmp(name, "sensor.info.exposureTimeRange") == 0) ? CAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE
-+          : (strcmp(name, "sensor.info.colorFilterArrangement") == 0) ? CAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
-+          : (strcmp(name, "sensor.availableTestPatternModes") == 0) ? CAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES
-+          : (strcmp(name, "sensor.orientation") == 0)            ? CAMERA_SENSOR_ORIENTATION
-+          : (strcmp(name, "sensor.opaqueRawSize") == 0)          ? CAMERA_SENSOR_OPAQUE_RAW_SIZE
-+          : (strcmp(name, "lens.facing") == 0)                   ? CAMERA_LENS_FACING
-+          : (strcmp(name, "lens.info.availableApertures") == 0)  ? CAMERA_LENS_INFO_AVAILABLE_APERTURES
-+          : (strcmp(name, "lens.info.availableFilterDensities") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES
-+          : (strcmp(name, "lens.info.availableFocalLengths") == 0) ? CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS
-+          : (strcmp(name, "lens.info.availableOpticalStabilization") == 0) ? CAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION
-+          : (strcmp(name, "lens.info.hyperfocalDistance") == 0)  ? CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE
-+          : (strcmp(name, "lens.info.minimumFocusDistance") == 0) ? CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE
-+          : (strcmp(name, "lens.info.shadingMapSize") == 0)      ? CAMERA_LENS_INFO_SHADING_MAP_SIZE
-+          : (strcmp(name, "lens.info.focusDistanceCalibration") == 0) ? CAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION
-+          : (strcmp(name, "request.maxNumOutputStreams") == 0)   ? CAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS
-+          : (strcmp(name, "request.maxNumInputStreams") == 0)    ? CAMERA_REQUEST_MAX_NUM_INPUT_STREAMS
-+          : (strcmp(name, "request.pipelineMaxDepth") == 0)      ? CAMERA_REQUEST_PIPELINE_MAX_DEPTH
-+          : (strcmp(name, "request.availableCapabilities") == 0) ? CAMERA_REQUEST_AVAILABLE_CAPABILITIES
-+          : (strcmp(name, "scaler.availableInputOutputFormatsMap") == 0) ? CAMERA_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP
-+          : (strcmp(name, "reprocess.maxCaptureStall") == 0)     ? CAMERA_REPROCESS_MAX_CAPTURE_STALL
-+          : (strcmp(name, "jpeg.maxSize") == 0)                  ? CAMERA_JPEG_MAX_SIZE
-+          : (strcmp(name, "jpeg.availableThumbnailSizes") == 0)  ? CAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES
-+          : (strcmp(name, "edge.availableEdgeModes") == 0)       ? CAMERA_EDGE_AVAILABLE_EDGE_MODES
-+          : (strcmp(name, "hotPixel.availableHotPixelModes") == 0) ? CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES
-+          : (strcmp(name, "noiseReduction.availableNoiseReductionModes") == 0) ? CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES
-+          : (strcmp(name, "tonemap.maxCurvePoints") == 0)        ? CAMERA_TONEMAP_MAX_CURVE_POINTS
-+          : (strcmp(name, "tonemap.availableToneMapModes") == 0) ? CAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES
-+          : (strcmp(name, "info.supportedHardwareLevel") == 0)   ? CAMERA_INFO_SUPPORTED_HARDWARE_LEVEL
-+          : (strcmp(name, "sync.maxLatency") == 0)               ? CAMERA_SYNC_MAX_LATENCY
-+          : -1;
-+    int tagType = get_icamera_metadata_tag_type(tag);
-+    if (tagType == -1) {
-+        LOGW("Unsupported metadata %s", name);
-+        return;
-+    }
-+
-+    union {
-+        uint8_t* u8;
-+        int32_t* i32;
-+        int64_t* i64;
-+        float*   f;
-+        double*  d;
-+        icamera_metadata_rational_t* r;
-+    } data;
-+    data.u8 = (unsigned char *)mMetadataCache;
-+
-+    int index = 0;
-+    int maxIndex = mMetadataCacheSize / sizeof(double); // worst case
-+    char * endPtr = nullptr;
-+    do {
-+        switch (tagType) {
-+        case ICAMERA_TYPE_BYTE:
-+            data.u8[index]= (char)strtol(src, &endPtr, 10);
-+            LOGXML(" - %d -", data.u8[index]);
-+            break;
-+        case ICAMERA_TYPE_INT32:
-+        case ICAMERA_TYPE_RATIONAL:
-+            data.i32[index]= strtol(src, &endPtr, 10);
-+            LOGXML(" - %d -", data.i32[index]);
-+            break;
-+        case ICAMERA_TYPE_INT64:
-+            data.i64[index]= strtol(src, &endPtr, 10);
-+            LOGXML(" - %ld -", data.i64[index]);
-+            break;
-+        case ICAMERA_TYPE_FLOAT:
-+            data.f[index]= strtof(src, &endPtr);
-+            LOGXML(" - %8.3f -", data.f[index]);
-+            break;
-+        case ICAMERA_TYPE_DOUBLE:
-+            data.d[index]= strtof(src, &endPtr);
-+            LOGXML(" - %8.3f -", data.d[index]);
-+            break;
-+        }
-+        index++;
-+
-+        if (endPtr != nullptr && (*endPtr == 'x' || *endPtr == ',')) {
-+            src = endPtr + 1;
-+        } else {
-+            break;
-+        }
-+    } while (index < maxIndex);
-+
-+    switch (tagType) {
-+    case ICAMERA_TYPE_BYTE:
-+        mMetadata.update(tag, data.u8, index);
-+        break;
-+    case ICAMERA_TYPE_INT32:
-+        mMetadata.update(tag, data.i32, index);
-+        break;
-+    case ICAMERA_TYPE_INT64:
-+        mMetadata.update(tag, data.i64, index);
-+        break;
-+    case ICAMERA_TYPE_FLOAT:
-+        mMetadata.update(tag, data.f, index);
-+        break;
-+    case ICAMERA_TYPE_DOUBLE:
-+        mMetadata.update(tag, data.d, index);
-+        break;
-+    case ICAMERA_TYPE_RATIONAL:
-+        mMetadata.update(tag, data.r, index / 2);
-+        break;
-+    }
-+}
-+
-+/**
-+ * the callback function of the libexpat for handling of one element start
-+ *
-+ * When it comes to the start of one element. This function will be called.
-+ *
-+ * \param userData: the pointer we set by the function XML_SetUserData.
-+ * \param name: the element's name.
-+ */
-+void CameraParser::startParseElement(void *userData, const char *name, const char **atts)
-+{
-+    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
-+
-+    if (profiles->mCurrentDataField == FIELD_INVALID) {
-+        profiles->checkField(profiles, name, atts);
-+        return;
-+    }
-+
-+    switch (profiles->mCurrentDataField) {
-+        case FIELD_SENSOR:
-+            if (strcmp(name, "MediaCtlConfig") == 0) {
-+                profiles->mInMediaCtlCfg = true;
-+                LOGXML("@%s %s, mInMediaCtlCfg is set to true", __func__, name);
-+            } else if (strcmp(name, "StaticMetadata") == 0) {
-+                profiles->mInStaticMetadata = true;
-+                LOGXML("@%s %s, mInStaticMetadata is set to true", __func__, name);
-+            }
-+
-+            if (profiles->mInMediaCtlCfg) {
-+                // The MediaCtlCfg belongs to the sensor segments
-+                profiles->handleMediaCtlCfg(profiles, name, atts);
-+            } else if (profiles->mInStaticMetadata) {
-+                // The StaticMetadata belongs to the sensor segments
-+                profiles->handleStaticMetaData(profiles, name, atts);
-+            } else {
-+                profiles->handleSensor(profiles, name, atts);
-+            }
-+            break;
-+        case FIELD_COMMON:
-+            profiles->handleCommon(profiles, name, atts);
-+            break;
-+        default:
-+            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
-+            break;
-+    }
-+}
-+
-+/**
-+ * the callback function of the libexpat for handling of one element end
-+ *
-+ * When it comes to the end of one element. This function will be called.
-+ *
-+ * \param userData: the pointer we set by the function XML_SetUserData.
-+ * \param name: the element's name.
-+ */
-+void CameraParser::endParseElement(void *userData, const char *name)
-+{
-+    LOGXML("@%s %s", __func__, name);
-+
-+    CameraParser *profiles = reinterpret_cast<CameraParser*>(userData);
-+
-+    if (strcmp(name, "Sensor") == 0) {
-+        profiles->mCurrentDataField = FIELD_INVALID;
-+        if (profiles->pCurrentCam) {
-+            LOGXML("@%s: Add camera id %d (%s)", __func__, profiles->mCurrentSensor,
-+                   profiles->pCurrentCam->sensorName.c_str());
-+            if (profiles->pCurrentCam->mLensName.empty() &&
-+                profiles->pCurrentCam->sensorName.find("-wf") != string::npos) {
-+                int ret = profiles->mMC->getLensName(&profiles->pCurrentCam->mLensName);
-+                if (ret != OK) {
-+                    LOGXML("@%s, Failed to getLensName", __func__);
-+                }
-+            }
-+            // Merge the content of mMetadata into mCapability.
-+            ParameterHelper::merge(profiles->mMetadata, &profiles->pCurrentCam->mCapability);
-+            profiles->mMetadata.clear();
-+
-+            // For non-extended camera, it should be in order by mCurrentSensor
-+            profiles->mStaticCfg->mCameras.insert(profiles->mStaticCfg->mCameras.begin() +
-+                                               profiles->mCurrentSensor, *(profiles->pCurrentCam));
-+
-+            delete profiles->pCurrentCam;
-+            profiles->pCurrentCam = nullptr;
-+        }
-+    }
-+
-+    if (strcmp(name, "MediaCtlConfig") == 0) {
-+        LOGXML("@%s %s, mInMediaCtlCfg is set to false", __func__, name);
-+        profiles->mInMediaCtlCfg = false;
-+    }
-+
-+    if (strcmp(name, "StaticMetadata") == 0) {
-+        LOGXML("@%s %s, mInStaticMetadata is set to false", __func__, name);
-+        profiles->mInStaticMetadata = false;
-+    }
-+
-+    if (strcmp(name, "Common") == 0)
-+        profiles->mCurrentDataField = FIELD_INVALID;
-+}
-+
-+/**
-+* Get available sensors.
-+*
-+* The function will read libcamhal_profile.xml, and parse out all of sensors.
-+* Then those sensors will be checked if it exists in mediaEntity, if it exists,
-+* we put it in availableSensors.
-+* In libcamhal_profile.xml it should have the following requirements:
-+* 1. <availableSensors value="ov8856-wf-2,ov2740-uf-0,ov2740-wf-2"/>
-+*     The value is "'camera name'-wf/uf-'CSI port number'".
-+*     For example: camera name is "ov8856". Sensor's sink entity name is
-+*      "Intel IPU6 CSI-2 2" and it is word facing. The value is ov8856-wf-2.
-+* 2. <platform value="IPU6"/> the platform value must be uppercase letter.
-+*
-+*/
-+std::vector<std::string> CameraParser::getAvailableSensors(const std::string &ipuName,
-+                                                        const std::vector<std::string> &sensorsList)
-+{
-+    LOGXML("@%s, ipuName:%s", __func__, ipuName.c_str());
-+
-+    /* if the string doesn't contain -wf- or -uf-, it needn't be parsed */
-+    if ((sensorsList[0].find("-wf-") == string::npos) &&
-+        (sensorsList[0].find("-uf-") == string::npos)) {
-+        return sensorsList;
-+    }
-+
-+    // sensor's sink entity name prefix:Intel IPU6 CSI-2 2
-+    std::string sensorSinkName = "Intel ";
-+    sensorSinkName.append(ipuName);
-+    sensorSinkName.append(" CSI-2 ");
-+
-+    std::vector<string> availableSensors;
-+    for (auto& sensor : sensorsList) {
-+        std::string srcSensor = sensor;
-+        std::string portNum = srcSensor.substr(srcSensor.find_last_of('-') + 1);
-+        std::string sensorSinkNameTmp = sensorSinkName;
-+        sensorSinkNameTmp.append(portNum);
-+        std::string sensorName = srcSensor.substr(0, srcSensor.find_first_of('-'));
-+
-+        bool ret = mMC->checkAvailableSensor(sensorName, sensorSinkNameTmp);
-+        if (ret) {
-+            std::string sensorNameTmp = srcSensor.substr(0, srcSensor.find_last_of('-'));
-+            availableSensors.push_back(sensorNameTmp);
-+            mAvailableSensor[sensorNameTmp] = sensorSinkNameTmp;
-+            LOGXML("@%s, The availabel sensor name:%s, sensorSinkNameTmp:%s",
-+                   __func__, sensorNameTmp.c_str(), sensorSinkNameTmp.c_str());
-+        }
-+    }
-+
-+    return availableSensors;
-+}
-+
-+/**
-+ * Get camera configuration from xml file
-+ *
-+ * The function will read the xml configuration file firstly.
-+ * Then it will parse out the camera settings.
-+ * The camera setting is stored inside this CameraParser class.
-+ *
-+ */
-+void CameraParser::getProfileDataFromXmlFile(void)
-+{
-+    LOGXML("@%s", __func__);
-+
-+    // Get common data from libcamhal_profile.xml
-+    int ret = getDataFromXmlFile(LIBCAMHAL_PROFILE_NAME);
-+    CheckError(ret != OK, VOID_VALUE, "Failed to get libcamhal profile data frome %s", LIBCAMHAL_PROFILE_NAME);
-+
-+    // According to sensor name to get sensor data
-+    LOGXML("The kinds of sensor is %zu", mStaticCfg->mCommonConfig.availableSensors.size());
-+    vector<string> allSensors = getAvailableSensors(mStaticCfg->mCommonConfig.ipuName,
-+                                                    mStaticCfg->mCommonConfig.availableSensors);
-+
-+    if (allSensors.size() == 0) {
-+        LOGW("The style of libcamhal_profile is too old, please switch it as soon as possible !!!");
-+        return;
-+    }
-+
-+    for (auto sensor : allSensors) {
-+        string sensorName = "sensors/";
-+        sensorName.append(sensor);
-+        sensorName.append(".xml");
-+        int ret = getDataFromXmlFile(sensorName);
-+        CheckError(ret != OK, VOID_VALUE, "Failed to get sensor profile data frome %s", sensorName.c_str());
-+    }
-+}
-+
-+/**
-+ * Read graph descriptor and settings from configuration files.
-+ *
-+ * The resulting graphs represend all possible graphs for given sensor, and
-+ * they are stored in capinfo structure.
-+ */
-+void CameraParser::getGraphConfigFromXmlFile(void)
-+{
-+    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
-+
-+    // Assuming that PSL section from profiles is already parsed, and number
-+    // of cameras is known.
-+    graphConfig->addCustomKeyMap();
-+    for (size_t i = 0; i < getSensorNum(); ++i) {
-+        const string &fileName = mStaticCfg->mCameras[i].mGraphSettingsFile;
-+        if (fileName.empty()) {
-+            continue;
-+        }
-+
-+        LOGXML("Using graph setting file:%s for camera:%zu", fileName.c_str(), i);
-+        int ret  = graphConfig->parse(i, fileName.c_str());
-+        CheckError(ret != OK, VOID_VALUE, "Could not read graph config file for camera %zu", i);
-+    }
-+}
-+
-+void CameraParser::dumpSensorInfo(void)
-+{
-+    LOGXML("@%s, line%d, for sensors settings==================", __func__, __LINE__);
-+    LOGXML("@%s, line%d, sensor number:%d", __func__, __LINE__, getSensorNum());
-+    for (unsigned i = 0; i < getSensorNum(); i++) {
-+        LOGXML("@%s, line%d, i:%d", __func__, __LINE__, i);
-+        LOGXML("@%s, line%d, mCameras[%d].sensorName:%s", __func__, __LINE__, i, mStaticCfg->mCameras[i].sensorName.c_str());
-+        LOGXML("@%s, line%d, mCameras[%d].mISysFourcc:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mISysFourcc);
-+
-+        supported_stream_config_array_t supportedConfigs;
-+        mStaticCfg->mCameras[i].mCapability.getSupportedStreamConfig(supportedConfigs);
-+        for (size_t j = 0; j < supportedConfigs.size(); j++) {
-+            LOGXML("@%s, line%d, mCameras[%d]: format:%d size(%dx%d) field:%d", __func__, __LINE__,
-+                i, supportedConfigs[j].format, supportedConfigs[j].width,
-+                supportedConfigs[j].height, supportedConfigs[j].field);
-+        }
-+
-+        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mSupportedISysFormat.size(); j++) {
-+            LOGXML("@%s, line%d, mCameras[%d].mSupportedISysFormat:%d", __func__, __LINE__, i, mStaticCfg->mCameras[i].mSupportedISysFormat[j]);
-+        }
-+
-+        // dump the media controller mapping table for supportedStreamConfig
-+        LOGXML("The media controller mapping table size: %zu", mStaticCfg->mCameras[i].mStreamToMcMap.size());
-+        for (auto& pool : mStaticCfg->mCameras[i].mStreamToMcMap) {
-+            int mcId = pool.first;
-+            supported_stream_config_array_t &mcMapVector = pool.second;
-+            LOGXML("mcId: %d, the supportedStreamConfig vector size: %zu", mcId, mcMapVector.size());
-+        }
-+
-+        // dump the media controller information
-+        LOGXML("============Format Configuration==================");
-+        for (unsigned j = 0; j < mStaticCfg->mCameras[i].mMediaCtlConfs.size(); j++) {
-+            const MediaCtlConf* mc = &mStaticCfg->mCameras[i].mMediaCtlConfs[j];
-+            for (unsigned k = 0; k < mc->links.size(); k++) {
-+                const McLink* link = &mc->links[k];
-+                LOGXML("       link src %s [%d:%d] ==> %s [%d:%d] enable %d", link->srcEntityName.c_str(), link->srcEntity, link->srcPad, link->sinkEntityName.c_str(), link->sinkEntity, link->sinkPad, link->enable);
-+            }
-+            for (unsigned k = 0; k < mc->ctls.size(); k++) {
-+                const McCtl* ctl = &mc->ctls[k];
-+                LOGXML("       Ctl %s [%d] cmd %s [0x%08x] value %d", ctl->entityName.c_str(), ctl->entity, ctl->ctlName.c_str(), ctl->ctlCmd, ctl->ctlValue);
-+            }
-+            for (unsigned k = 0; k < mc->formats.size(); k++) {
-+                const McFormat* format = &mc->formats[k];
-+                if (format->formatType == FC_FORMAT)
-+                    LOGXML("       format %s [%d:%d] [%dx%d] %s", format->entityName.c_str(), format->entity, format->pad, format->width, format->height, CameraUtils::pixelCode2String(format->pixelCode));
-+                else if (format->formatType == FC_SELECTION)
-+                    LOGXML("       select %s [%d:%d] selCmd: %d [%d, %d] [%dx%d]", format->entityName.c_str(), format->entity, format->pad, format->selCmd, format->top, format->left, format->width, format->height);
-+            }
-+        }
-+        LOGXML("============End of Format Configuration===========");
-+    }
-+
-+    LOGXML("@%s, line%d, for common settings==================", __func__, __LINE__);
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.h b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
-new file mode 100644
-index 000000000000..33cf70641079
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.h
-@@ -0,0 +1,128 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ *\file CameraParser.h
-+ *
-+ * parser for the camera xml configuration file
-+ *
-+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
-+ * It will parse the camera configuration out firstly.
-+ * Then other module can call the methods of it to get the real configuration.
-+ *
-+ */
-+
-+#pragma once
-+
-+#include <unordered_map>
-+#include "PlatformData.h"
-+#include "ParserBase.h"
-+#include "CameraMetadata.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class CameraParser
-+ *
-+ * This class is used to parse the camera configuration file.
-+ * The configuration file is xml format.
-+ * This class will use the expat lib to do the xml parser.
-+ */
-+class CameraParser : public ParserBase {
-+public:
-+    CameraParser(MediaControl *mc, PlatformData::StaticCfg *cfg);
-+    ~CameraParser();
-+
-+    unsigned getSensorNum(void) {return mSensorNum;};
-+
-+private:
-+    DISALLOW_COPY_AND_ASSIGN(CameraParser);
-+
-+private:
-+    PlatformData::StaticCfg *mStaticCfg;
-+
-+    enum DataField {
-+        FIELD_INVALID = 0,
-+        FIELD_SENSOR,
-+        FIELD_COMMON
-+    } mCurrentDataField;
-+    int mSensorNum;
-+    int mCurrentSensor;
-+    std::string mI2CBus;
-+    std::string mCsiPort;
-+    std::unordered_map<std::string, std::string> mAvailableSensor;
-+    PlatformData::StaticCfg::CameraInfo *pCurrentCam;
-+    bool mInMediaCtlCfg;
-+    bool mInStaticMetadata;
-+    MediaControl* mMC;
-+    CameraMetadata mMetadata;
-+
-+    long* mMetadataCache;
-+    static const int mMetadataCacheSize = 4096;
-+
-+    void startParseElement(void *userData, const char *name, const char **atts);
-+    void endParseElement(void *userData, const char *name);
-+
-+    static void parseSizesList(const char *sizesStr, std::vector <camera_resolution_t> &sizes);
-+    static int getSupportedFormat(const char* str, std::vector <int>& supportedFormat);
-+    static int parsePair(const char *str, int *first, int *second, char delim, char **endptr = nullptr);
-+
-+    std::vector<std::string> getAvailableSensors(const std::string &ipuName,
-+                                                 const std::vector<std::string> &sensorsList);
-+    void getProfileDataFromXmlFile(void);
-+    void getSensorDataFromXmlFile(void);
-+    void getGraphConfigFromXmlFile(void);
-+    void checkField(CameraParser *profiles, const char *name, const char **atts);
-+
-+    void handleSensor(CameraParser *profiles, const char *name, const char **atts);
-+    void handleCommon(CameraParser *profiles, const char *name, const char **atts);
-+
-+    void parseStreamConfig(const char* src, supported_stream_config_array_t& configs);
-+    void parseSupportedFeatures(const char* src, camera_features_list_t& features);
-+    void parseSupportedIspControls(const char* src, std::vector<uint32_t>& features);
-+    int parseSupportedVideoStabilizationMode(const char* str, camera_video_stabilization_list_t &supportedModes);
-+    int parseSupportedAeMode(const char* str, std::vector <camera_ae_mode_t> &supportedModes);
-+    int parseSupportedAfMode(const char* str, std::vector <camera_af_mode_t> &supportedModes);
-+    int parseSupportedAntibandingMode(const char* str, std::vector <camera_antibanding_mode_t> &supportedModes);
-+    int parseSupportedAeParamRange(const char* src, std::vector<int>& scenes,
-+                                   std::vector<float>& minValues, std::vector<float>& maxValues);
-+
-+// parse the media controller configuration in xml, the MediaControl MUST be run before the parser to run.
-+    void handleMediaCtlCfg(CameraParser *profiles, const char *name, const char **atts);
-+    void handleStaticMetaData(CameraParser *profiles, const char *name, const char **atts);
-+    void handleGenericStaticMetaData(const char *name, const char *src);
-+    void parseMediaCtlConfigElement(CameraParser *profiles, const char *name, const char **atts);
-+    void storeMcMappForConfig(int mcId, supported_stream_config_t streamCfg);
-+    void parseLinkElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseRouteElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseControlElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseSelectionElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseFormatElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseVideoElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseOutputElement(CameraParser *profiles, const char *name, const char **atts);
-+    void parseMultiExpRange(const char* src);
-+
-+    int parseSupportedTuningConfig(const char *str, std::vector <TuningConfig> &config);
-+    int parseLardTags(const char *str, std::vector <LardTagConfig> &lardTags);
-+
-+    void dumpSensorInfo(void);
-+
-+    void parseOutputMap(const char *str, std::vector<UserToPslOutputMap> &outputMap);
-+
-+    std::string replaceStringInXml(CameraParser *profiles, const char *value);
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
-new file mode 100644
-index 000000000000..a219478151a6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/CameraTypes.h
-@@ -0,0 +1,226 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string>
-+#include <vector>
-+#include <map>
-+#include "Parameters.h"
-+
-+namespace icamera {
-+
-+/**
-+ * Use to link buffer producers and consumers
-+ */
-+enum Port {
-+    MAIN_PORT = 0,
-+    SECOND_PORT,
-+    THIRD_PORT,
-+    FORTH_PORT,
-+    INVALID_PORT
-+};
-+
-+enum {
-+    FACING_BACK = 0,
-+    FACING_FRONT = 1,
-+};
-+
-+enum {
-+    ORIENTATION_0 = 0,
-+    ORIENTATION_90 = 90,
-+    ORIENTATION_180 = 180,
-+    ORIENTATION_270 = 270,
-+};
-+
-+enum {
-+    LENS_VCM_HW = 0,
-+    LENS_NONE_HW
-+};
-+
-+enum {
-+    AUTO_SWITCH_FULL = 0,
-+    AUTO_SWITCH_PSYS
-+};
-+
-+enum {
-+    SENSOR_EXPOSURE_SINGLE = 0,        /* sensor is single exposure */
-+    SENSOR_FIX_EXPOSURE_RATIO,         /* Fix exposure ratio between long and short exposure */
-+    SENSOR_RELATIVE_MULTI_EXPOSURES,   /* AE output exposures are converted to Shutter and
-+                                          Readout time, then set to sensor driver */
-+    SENSOR_MULTI_EXPOSURES,            /* Multi-exposures are set to sensor driver directly */
-+    SENSOR_DUAL_EXPOSURES_DCG_AND_VS   /* Dual-exposure and multiple gains, i.e. DCG + VS */
-+};
-+
-+enum {
-+    SENSOR_GAIN_NONE = 0,
-+    SENSOR_MULTI_DG_AND_CONVERTION_AG,  /* Multi-DigitalGain and convertion AnalogGain are set
-+                                           to sensor driver */
-+    ISP_DG_AND_SENSOR_DIRECT_AG,        /* All digital gain is passed to ISP */
-+    SENSOR_MULTI_DG_AND_DIRECT_AG       /* Multi analog and digital gains, i.e. DCG */
-+};
-+
-+/**
-+ * This definition is used to distinguish different camera running mode, like video or still.
-+ */
-+typedef enum {
-+    TUNING_MODE_VIDEO,
-+    TUNING_MODE_VIDEO_ULL,
-+    TUNING_MODE_VIDEO_CUSTOM_AIC,
-+    TUNING_MODE_VIDEO_LL,
-+    TUNING_MODE_VIDEO_REAR_VIEW,
-+    TUNING_MODE_VIDEO_HITCH_VIEW,
-+    TUNING_MODE_STILL_CAPTURE,
-+    TUNING_MODE_MAX
-+} TuningMode;
-+
-+/*
-+ * The mapping algorithm for sensor digital gain
-+ */
-+typedef enum {
-+    SENSOR_DG_TYPE_NONE,
-+    SENSOR_DG_TYPE_X,           //linear relationship, gain = n*value (value: register value, n: ratio)
-+    SENSOR_DG_TYPE_2_X,         //exponential relationship, gain = 2 ^ value (value: register value)
-+} SensorDgType;
-+
-+typedef enum {
-+    MORPH_TABLE = 0,
-+    IMG_TRANS
-+} DvsType;
-+
-+// Note AUTO is not real config mode in the HAL.
-+typedef camera_stream_configuration_mode_t ConfigMode;
-+
-+typedef struct TuningConfig {
-+    ConfigMode configMode;                 /*!< configMode is internal usage to select AIQ and
-+                                                Pipeline. AUTO is not real config mode. */
-+    TuningMode tuningMode;                 /*!< tuningMode is used to define user cases,
-+                                                like video or still. */
-+    std::string aiqbName;                       /*!< special aiqb name corresponding with TuningMode */
-+} TuningConfig;
-+
-+typedef struct {
-+    /*!< tuningMode is used to define user cases, like video or still. */
-+    TuningMode tuningMode;
-+    unsigned int cmcTag;
-+    unsigned int aiqTag;
-+    unsigned int ispTag;
-+    unsigned int othersTag;
-+} LardTagConfig;
-+
-+typedef struct {
-+    uint32_t horizontal_crop_offset;
-+    uint32_t vertical_crop_offset;
-+    uint32_t cropped_image_width;
-+    uint32_t cropped_image_height;
-+    uint32_t horizontal_scaling_numerator;
-+    uint32_t horizontal_scaling_denominator;
-+    uint32_t vertical_scaling_numerator;
-+    uint32_t vertical_scaling_denominator;
-+} SensorFrameParams;
-+
-+enum ExecutorNotifyPolicy {
-+    POLICY_FRAME_FIRST = 0,
-+    POLICY_STATS_FIRST,
-+    POLICY_INVALID,
-+};
-+
-+struct ExecutorPolicy {
-+    std::string exeName;
-+    ExecutorNotifyPolicy notifyPolicy;
-+    std::vector<std::string> pgList;
-+    std::vector<int> opModeList;
-+    std::vector<int> cyclicFeedbackRoutineList;
-+    std::vector<int> cyclicFeedbackDelayList;
-+    ExecutorPolicy() : notifyPolicy(POLICY_FRAME_FIRST) {}
-+};
-+
-+struct ExecutorDepth {
-+    std::vector<std::string> bundledExecutors;
-+    std::vector<int> depths;
-+};
-+
-+struct PolicyConfig {
-+    int graphId;
-+    std::string policyDescription;
-+    std::vector<ExecutorPolicy> pipeExecutorVec;
-+    std::vector<std::string> exclusivePgs;
-+    std::vector<ExecutorDepth> bundledExecutorDepths;
-+    bool enableBundleInSdv;
-+
-+    PolicyConfig() { graphId = -1; enableBundleInSdv = true; }
-+};
-+
-+struct CommonConfig {
-+    float xmlVersion;
-+    std::string ipuName;
-+    std::vector<std::string> availableSensors;
-+
-+    CommonConfig() { xmlVersion = 1.0; }
-+};
-+
-+struct OBSetting {
-+    ConfigMode configMode;
-+    int top;
-+    int left;
-+    int sectionHeight;
-+    int interleaveStep;
-+};
-+
-+struct ExpRange {
-+    int min;
-+    int max;
-+    int step;
-+    int lowerBound;
-+    int upperBound;
-+};
-+
-+/**
-+ * Multi exposure range information
-+*/
-+struct MultiExpRange {
-+    camera_resolution_t Resolution;
-+    ExpRange SHS1;
-+    ExpRange RHS1;
-+    ExpRange SHS2;
-+    ExpRange RHS2;
-+    ExpRange SHS3;
-+};
-+
-+struct UserToPslOutputMap {
-+    camera_resolution_t User;
-+    camera_resolution_t Psl;
-+};
-+
-+struct FrameInfo {
-+    FrameInfo() {}
-+    int mWidth = 0;
-+    int mHeight = 0;
-+    int mFormat = 0;
-+    int mStride = 0;
-+    int mBpp = 0;
-+};
-+typedef std::map<Port, FrameInfo> FrameInfoPortMap;
-+
-+/**
-+ * Indicate if the graph setting for video and still is coupled or dispersed
-+ */
-+typedef enum {
-+    COUPLED,
-+    DISPERSED,
-+} GraphSettingType;
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
-new file mode 100644
-index 000000000000..92c3f76ed0d8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.cpp
-@@ -0,0 +1,165 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "ParserBase"
-+
-+#include <memory>
-+#include <expat.h>
-+#include <string.h>
-+
-+#include "ParserBase.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+namespace icamera {
-+
-+ParserBase::ParserBase()
-+{
-+    LOGXML("@%s", __func__);
-+}
-+
-+const char *ParserBase::skipWhiteSpace(const char *src)
-+{
-+    while (*src == '\n' || *src == '\t' || *src == ' ' || *src == '\v' || *src == '\r' || *src == '\f') {
-+        src++;
-+    }
-+    return src;
-+}
-+
-+int ParserBase::parseXmlParameterToChar(const char *str, unsigned char *table)
-+{
-+    CheckError(str == nullptr, -1, "@%s, str is nullptr", __func__);
-+
-+    int index = 0;
-+    char *savePtr, *tablePtr;
-+    int sz = strlen(str);
-+    char src[sz + 1];
-+    MEMCPY_S(src, sz, str, sz);
-+    src[sz] = '\0';
-+
-+    tablePtr = strtok_r(src, ",", &savePtr);
-+    while (tablePtr) {
-+        table[index] = atoi(tablePtr);
-+        if (savePtr != nullptr)
-+            savePtr = const_cast<char *>(skipWhiteSpace(savePtr));
-+        index++;
-+        tablePtr = strtok_r(nullptr, ",", &savePtr);
-+    }
-+    return 0;
-+}
-+
-+/* template function need the function ptr */
-+std::string ParserBase::convertCharToString(const char *str)
-+{
-+    return str;
-+}
-+
-+void ParserBase::startElement(void *userData, const char *name, const char **atts)
-+{
-+    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
-+    profiles->startParseElement(userData, name, atts);
-+}
-+
-+void ParserBase::endElement(void *userData, const char *name)
-+{
-+    ParserBaseCallBack *profiles = reinterpret_cast<ParserBaseCallBack*>(userData);
-+    profiles->endParseElement(userData, name);
-+}
-+
-+int ParserBase::parseXmlFile(const std::string &xmlFile)
-+{
-+    int ret = UNKNOWN_ERROR;
-+    int done;
-+    FILE *fp = nullptr;
-+    int bufSize = 4 * 1024;  // parse 4k data every time
-+
-+    CheckError(xmlFile.empty(), UNKNOWN_ERROR, "xmlFile is empty");
-+
-+    LOGXML("@%s, parsing profile: %s", __func__, xmlFile.c_str());
-+
-+    fp = ::fopen(xmlFile.c_str(), "r");
-+    CheckError(nullptr == fp, UNKNOWN_ERROR, "@%s, line:%d, Can not open profile file %s in read mode, fp is nullptr",
-+          __func__, __LINE__, xmlFile.c_str());
-+
-+    std::unique_ptr<char[]>pBuf(new char[bufSize]);
-+    XML_Parser parser = ::XML_ParserCreate(nullptr);
-+    if (nullptr == parser) {
-+        LOGE("@%s, line:%d, parser is nullptr", __func__, __LINE__);
-+        goto exit;
-+    }
-+
-+    ::XML_SetUserData(parser, this);
-+    ::XML_SetElementHandler(parser, startElement, endElement);
-+
-+    do {
-+        int len = (int)::fread(pBuf.get(), 1, bufSize, fp);
-+        if (!len) {
-+            if (ferror(fp)) {
-+                clearerr(fp);
-+                goto exit;
-+            }
-+        }
-+        done = len < bufSize;
-+        if (XML_Parse(parser, (const char *)pBuf.get(), len, done) == XML_STATUS_ERROR) {
-+            LOGE("@%s, line:%d, XML_Parse error", __func__, __LINE__);
-+            goto exit;
-+        }
-+    } while (!done);
-+    ret = OK;
-+
-+exit:
-+    if (parser)
-+        ::XML_ParserFree(parser);
-+    if (fp)
-+    ::fclose(fp);
-+
-+    return ret;
-+}
-+
-+void ParserBase::getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
-+                                     std::string &xmlFile)
-+{
-+    struct stat st;
-+    for (auto xml : avaliableXmlFiles) {
-+        int ret = stat(xml, &st);
-+        if (ret == 0) {
-+            xmlFile = xml;
-+            return;
-+        }
-+    }
-+}
-+
-+int ParserBase::getDataFromXmlFile(std::string fileName)
-+{
-+    LOGXML("@%s", __func__);
-+    CheckError(fileName.size() == 0, UNKNOWN_ERROR, "file name is null");
-+
-+    std::string curFolderFileName = std::string("./") + fileName;
-+    std::string sysFolderFileName = PlatformData::getCameraCfgPath() + fileName;
-+    const std::vector <const char *> profiles = {
-+        curFolderFileName.c_str(),
-+        sysFolderFileName.c_str()
-+    };
-+
-+    std::string chosenXmlFile;
-+    getAvaliableXmlFile(profiles, chosenXmlFile);
-+    CheckError(chosenXmlFile.empty(), UNKNOWN_ERROR, "%s is not found in: %s or %s",
-+          fileName.c_str(), curFolderFileName.c_str(), sysFolderFileName.c_str());
-+
-+    return parseXmlFile(chosenXmlFile);
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/ParserBase.h b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
-new file mode 100644
-index 000000000000..c6ccaff7dd38
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/ParserBase.h
-@@ -0,0 +1,102 @@
-+/*
-+ * Copyright (C) 2019-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ *\file ParserBase.h
-+ *
-+ * parser for the camera xml configuration file, this is a basic class.
-+ *
-+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
-+ * It will parse the camera configuration out firstly.
-+ * Then other module can call the methods of it to get the real configuration.
-+ *
-+ */
-+
-+#pragma once
-+
-+#include "PlatformData.h"
-+
-+namespace icamera {
-+
-+class ParserBaseCallBack {
-+public:
-+    virtual ~ParserBaseCallBack() {}
-+    virtual void startParseElement(void *userData, const char *name, const char **atts){};
-+    virtual void endParseElement(void *userData, const char *name){};
-+};
-+
-+class ParserBase : public ParserBaseCallBack {
-+public:
-+    ParserBase();
-+    virtual ~ParserBase() {}
-+
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(ParserBase);
-+
-+protected:
-+    /**
-+     * Get an avaliable xml file
-+     *
-+     * Find the first avaliable xml file.
-+     *
-+     * \param[in] const vector<char *>& allAvaliableXmlFiles: all avaliable xml files list.
-+     * \param[out] string& xmlFile: to store a avaliable xml file
-+     */
-+    void getAvaliableXmlFile(const std::vector<const char *> &avaliableXmlFiles,
-+                             std::string &xmlFile);
-+
-+    /**
-+     * Get camera configuration from xml file
-+     *
-+     * The function will read the xml configuration file firstly.
-+     * Then it will parse out the camera settings.
-+     * The camera setting is stored inside this CameraProfiles class.
-+     */
-+    int getDataFromXmlFile(std::string fileName);
-+
-+    int parseXmlFile(const std::string &xmlFile);
-+    const char* skipWhiteSpace(const char *src);
-+    int parseXmlParameterToChar(const char *str, unsigned char *table);
-+
-+    static void startElement(void *userData, const char *name, const char **atts);
-+    static void endElement(void *userData, const char *name);
-+    static std::string convertCharToString(const char *str);
-+
-+    template<typename T>
-+    int parseXmlConvertStrings(const char *str, std::vector<T> &vectorT,
-+                               T (*parseXmlString)(const char *)) {
-+        CheckError(str == nullptr || parseXmlString == nullptr, -1, "@%s, input parameter is nullptr", __func__);
-+
-+        int sz = strlen(str);
-+        char src[sz + 1];
-+        MEMCPY_S(src, sz, str, sz);
-+        src[sz] = '\0';
-+
-+        char *savePtr = nullptr;
-+        char *cfgName = strtok_r(src, ",", &savePtr);
-+        while(cfgName) {
-+            vectorT.push_back(parseXmlString(cfgName));
-+            if (savePtr != nullptr)
-+                savePtr = const_cast<char*>(skipWhiteSpace(savePtr));
-+            cfgName = strtok_r(nullptr, ",", &savePtr);
-+        }
-+
-+        return 0;
-+    }
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
-new file mode 100644
-index 000000000000..643002ae6531
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
-@@ -0,0 +1,1296 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "PlatformData"
-+
-+#include <sys/sysinfo.h>
-+#include <math.h>
-+#include <memory>
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "PlatformData.h"
-+#include "CameraParser.h"
-+#include "PolicyParser.h"
-+
-+#include "gc/GraphConfigManager.h"
-+
-+using std::string;
-+using std::vector;
-+
-+namespace icamera {
-+PlatformData *PlatformData::sInstance = nullptr;
-+Mutex  PlatformData::sLock;
-+
-+#ifdef ENABLE_SANDBOXING
-+IntelAlgoClient* PlatformData::mIntelAlgoClient = nullptr;
-+#endif
-+
-+PlatformData* PlatformData::getInstance()
-+{
-+    AutoMutex lock(sLock);
-+    if (sInstance == nullptr) {
-+        sInstance = new PlatformData();
-+    }
-+
-+    return sInstance;
-+}
-+
-+void PlatformData::releaseInstance()
-+{
-+    AutoMutex lock(sLock);
-+    LOG1("@%s", __func__);
-+
-+    if (sInstance) {
-+        delete sInstance;
-+        sInstance = nullptr;
-+    }
-+}
-+
-+PlatformData::PlatformData()
-+{
-+    LOG1("@%s", __func__);
-+    MediaControl *mc = MediaControl::getInstance();
-+    mc->initEntities();
-+
-+#ifdef ENABLE_SANDBOXING
-+    mIntelAlgoClient = new IntelAlgoClient;
-+    bool ret = mIntelAlgoClient->isInitialized();
-+    CheckError(ret == false, VOID_VALUE, "@%s, mIntelAlgoClient->isInitialized() fails", __func__);
-+#endif
-+
-+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
-+        mAiqInitDatas[i] = new AiqInitData;
-+    }
-+
-+    CameraParser CameraParser(mc, &mStaticCfg);
-+    PolicyParser PolicyParser(&mStaticCfg);
-+}
-+
-+PlatformData::~PlatformData() {
-+    LOG1("@%s", __func__);
-+
-+    releaseGraphConfigNodes();
-+    MediaControl::releaseInstance();
-+
-+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
-+        delete mAiqInitDatas[i];
-+        mAiqInitDatas[i] = nullptr;
-+    }
-+
-+#ifdef ENABLE_SANDBOXING
-+    delete mIntelAlgoClient;
-+    mIntelAlgoClient = nullptr;
-+#endif
-+}
-+
-+void PlatformData::releaseGraphConfigNodes()
-+{
-+    std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>();
-+    graphConfig->releaseGraphNodes();
-+    for (uint8_t cameraId = 0; cameraId < mStaticCfg.mCameras.size(); cameraId++) {
-+        IGraphConfigManager::releaseInstance(cameraId);
-+    }
-+}
-+
-+const char* PlatformData::getSensorName(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].sensorName.c_str();
-+}
-+
-+const char* PlatformData::getSensorDescription(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].sensorDescription.c_str();
-+}
-+
-+const char* PlatformData::getLensName(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mLensName.c_str();
-+}
-+
-+int PlatformData::getLensHwType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mLensHwType;
-+}
-+
-+int PlatformData::getDVSType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mDVSType;
-+}
-+
-+bool PlatformData::getISYSCompression(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mISYSCompression;
-+}
-+
-+bool PlatformData::getPSACompression(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mPSACompression;
-+}
-+
-+bool PlatformData::getOFSCompression(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mOFSCompression;
-+}
-+
-+int PlatformData::getCITMaxMargin(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mCITMaxMargin;
-+}
-+
-+bool PlatformData::isEnableAIQ(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAIQ;
-+}
-+
-+bool PlatformData::isEnableLtmThread(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmThread;
-+}
-+
-+bool PlatformData::isFaceAeEnabled(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceAeEnabled;
-+}
-+
-+int PlatformData::faceEngineRunningInterval(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningInterval;
-+}
-+
-+int PlatformData::faceEngineRunningIntervalNoFace(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningIntervalNoFace;
-+}
-+
-+bool PlatformData::isFaceEngineSyncRunning(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mFaceEngineRunningSync;
-+}
-+
-+bool PlatformData::isDvsSupported(int cameraId)
-+{
-+    camera_video_stabilization_list_t videoStabilizationList;
-+    Parameters* param = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
-+    param->getSupportedVideoStabilizationMode(videoStabilizationList);
-+
-+    bool supported = false;
-+    for (auto it : videoStabilizationList) {
-+        if (it == VIDEO_STABILIZATION_MODE_ON) {
-+            supported = true;
-+        }
-+    }
-+
-+    LOG2("@%s, dvs supported:%d", __func__, supported);
-+    return supported;
-+}
-+
-+bool PlatformData::psysAlignWithSof(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysAlignWithSof;
-+}
-+
-+bool PlatformData::swProcessingAlignWithIsp(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mSwProcessingAlignWithIsp;
-+}
-+
-+bool PlatformData::isUsingSensorDigitalGain(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseSensorDigitalGain;
-+}
-+
-+bool PlatformData::isUsingIspDigitalGain(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseIspDigitalGain;
-+}
-+
-+bool PlatformData::isNeedToPreRegisterBuffer(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mNeedPreRegisterBuffers;
-+}
-+
-+int PlatformData::getAutoSwitchType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mAutoSwitchType;
-+}
-+
-+bool PlatformData::isEnableFrameSyncCheck(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mFrameSyncCheckEnabled;
-+}
-+
-+bool PlatformData::isEnableDefog(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableLtmDefog;
-+}
-+
-+int PlatformData::getExposureNum(int cameraId, bool multiExposure)
-+{
-+    if (multiExposure) {
-+        return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureNum;
-+    }
-+
-+    int exposureNum = 1;
-+
-+    return exposureNum;
-+}
-+
-+bool PlatformData::isLtmEnabled(int cameraId)
-+{
-+
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmEnabled;
-+}
-+
-+int PlatformData::getSensorExposureType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorExposureType;
-+}
-+
-+int PlatformData::getSensorGainType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorGainType;
-+}
-+
-+bool PlatformData::isSkipFrameOnSTR2MMIOErr(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mSkipFrameV4L2Error;
-+}
-+
-+unsigned int PlatformData::getInitialSkipFrame(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mInitialSkipFrame;
-+}
-+
-+unsigned int PlatformData::getMaxRawDataNum(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxRawDataNum;
-+}
-+
-+bool PlatformData::getTopBottomReverse(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mTopBottomReverse;
-+}
-+
-+bool PlatformData::isPsysContinueStats(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysContinueStats;
-+}
-+
-+unsigned int PlatformData::getPreferredBufQSize(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mPreferredBufQSize;
-+}
-+
-+unsigned int PlatformData::getPipeSwitchDelayFrame(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mPipeSwitchDelayFrame;
-+}
-+
-+int PlatformData::getLtmGainLag(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mLtmGainLag;
-+}
-+
-+int PlatformData::getMaxSensorDigitalGain(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxSensorDigitalGain;
-+}
-+
-+SensorDgType PlatformData::sensorDigitalGainType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mSensorDgType;
-+}
-+
-+int PlatformData::getExposureLag(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mExposureLag;
-+}
-+
-+int PlatformData::getGainLag(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mGainLag;
-+}
-+
-+PolicyConfig* PlatformData::getExecutorPolicyConfig(int graphId)
-+{
-+    size_t i = 0;
-+    PlatformData::StaticCfg *cfg = &getInstance()->mStaticCfg;
-+
-+    for (i = 0; i < cfg->mPolicyConfig.size(); i++) {
-+        if (graphId == cfg->mPolicyConfig[i].graphId) {
-+            return &(cfg->mPolicyConfig[i]);
-+        }
-+    }
-+
-+    LOGW("Couldn't find the executor policy for graphId(%d), please check xml file", graphId);
-+    return nullptr;
-+}
-+
-+int PlatformData::numberOfCameras()
-+{
-+    return getInstance()->mStaticCfg.mCameras.size();
-+}
-+
-+MediaCtlConf *PlatformData::getMediaCtlConf(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf;
-+}
-+
-+int PlatformData::getCameraInfo(int cameraId, camera_info_t& info)
-+{
-+    // TODO correct the version info
-+    info.device_version = 1;
-+    info.facing = getInstance()->mStaticCfg.mCameras[cameraId].mFacing;
-+    info.orientation= getInstance()->mStaticCfg.mCameras[cameraId].mOrientation;
-+    info.name = getSensorName(cameraId);
-+    info.description = getSensorDescription(cameraId);
-+    info.capability = &getInstance()->mStaticCfg.mCameras[cameraId].mCapability;
-+    return OK;
-+}
-+
-+bool PlatformData::isFeatureSupported(int cameraId, camera_features feature)
-+{
-+    camera_features_list_t features;
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedFeatures(features);
-+
-+    if (features.empty()) {
-+        return false;
-+    }
-+    for (auto& item : features) {
-+        if (item == feature) {
-+            return true;
-+        }
-+    }
-+    return false;
-+}
-+
-+bool PlatformData::isSupportedStream(int cameraId, const stream_t& conf)
-+{
-+    int width = conf.width;
-+    int height = conf.height;
-+    int format = conf.format;
-+    int field = conf.field;
-+
-+    supported_stream_config_array_t availableConfigs;
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedStreamConfig(availableConfigs);
-+    bool sameConfigFound = false;
-+    for (auto const& config : availableConfigs) {
-+        if (config.format == format && config.field == field
-+                && config.width == width && config.height == height) {
-+            sameConfigFound = true;
-+            break;
-+        }
-+    }
-+
-+    return sameConfigFound;
-+}
-+
-+void PlatformData::getSupportedISysSizes(int cameraId, vector <camera_resolution_t>& resolutions)
-+{
-+    resolutions = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysSizes;
-+}
-+
-+bool PlatformData::getSupportedISysFormats(int cameraId, vector <int>& formats)
-+{
-+    formats = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
-+
-+    return true;
-+}
-+
-+int PlatformData::getISysFormat(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc;
-+}
-+
-+/**
-+ * The ISYS format is determined by the steps below:
-+ * 1. Try to use the specified format in media control config if it exists.
-+ * 2. If the given format is supported by ISYS, then use it.
-+ * 3. Use the first supported format if still could not find an appropriate one.
-+ */
-+void PlatformData::selectISysFormat(int cameraId, int format)
-+{
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    if (mc != nullptr && mc->format != -1) {
-+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = mc->format;
-+    } else if (isISysSupportedFormat(cameraId, format)) {
-+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = format;
-+    } else {
-+        // Set the first one in support list to default Isys output.
-+        vector <int> supportedFormat =
-+            getInstance()->mStaticCfg.mCameras[cameraId].mSupportedISysFormat;
-+        getInstance()->mStaticCfg.mCameras[cameraId].mISysFourcc = supportedFormat[0];
-+    }
-+}
-+
-+/**
-+ * The media control config is determined by the steps below:
-+ * 1. Check if can get one from the given MC ID.
-+ * 2. And then, try to use ConfigMode to find matched one.
-+ * 3. Use stream config to get a corresponding mc id, and then get the config by id.
-+ * 4. Return nullptr if still could not find an appropriate one.
-+ */
-+void PlatformData::selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId)
-+{
-+    if (!isIsysEnabled(cameraId)) return;
-+
-+    const StaticCfg::CameraInfo& pCam = getInstance()->mStaticCfg.mCameras[cameraId];
-+
-+    MediaCtlConf* mcConfig = getMcConfByMcId(pCam, mcId);
-+    if (!mcConfig) {
-+        mcConfig = getMcConfByConfigMode(pCam, stream, mode);
-+    }
-+
-+    if (!mcConfig) {
-+        mcConfig = getMcConfByStream(pCam, stream);
-+    }
-+
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCurrentMcConf = mcConfig;
-+
-+    if (!mcConfig) {
-+        LOGE("No matching McConf: cameraId %d, configMode %d, mcId %d", cameraId, mode, mcId);
-+    }
-+}
-+
-+/*
-+ * Find the MediaCtlConf based on the given MC id.
-+ */
-+MediaCtlConf* PlatformData::getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId)
-+{
-+    if (mcId == -1) {
-+        return nullptr;
-+    }
-+
-+    for (auto& mc : cameraInfo.mMediaCtlConfs) {
-+        if (mcId == mc.mcId) {
-+            return (MediaCtlConf*)&mc;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/*
-+ * Find the MediaCtlConf based on MC id in mStreamToMcMap.
-+ */
-+MediaCtlConf* PlatformData::getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
-+                                              const stream_t& stream)
-+{
-+    int mcId = -1;
-+    for (auto& table : cameraInfo.mStreamToMcMap) {
-+        for(auto& config : table.second) {
-+            if (config.format == stream.format && config.field == stream.field
-+                    && config.width == stream.width && config.height == stream.height) {
-+                mcId = table.first;
-+                break;
-+            }
-+        }
-+        if (mcId != -1) {
-+            break;
-+        }
-+    }
-+
-+    return getMcConfByMcId(cameraInfo, mcId);
-+}
-+
-+/*
-+ * Find the MediaCtlConf based on operation mode and stream info.
-+ */
-+MediaCtlConf* PlatformData::getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
-+                                                  const stream_t& stream, ConfigMode mode)
-+{
-+    for (auto& mc : cameraInfo.mMediaCtlConfs) {
-+        for (auto& cfgMode : mc.configMode) {
-+            if (mode != cfgMode) continue;
-+
-+            int outputWidth = mc.outputWidth;
-+            int outputHeight = mc.outputHeight;
-+            int stride = CameraUtils::getStride(mc.format, mc.outputWidth);
-+            bool sameStride = (stride == CameraUtils::getStride(mc.format, stream.width));
-+            /*
-+             * outputWidth and outputHeight is 0 means the ISYS output size
-+             * is dynamic, we don't need to check if it matches with stream config.
-+             */
-+            if ((outputWidth == 0 && outputHeight == 0 ) ||
-+                ((stream.width == outputWidth || sameStride)
-+                && stream.height == outputHeight)) {
-+                return (MediaCtlConf*)&mc;
-+            }
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+/*
-+ * Check if video node is enabled via camera Id and video node type.
-+ */
-+bool PlatformData::isVideoNodeEnabled(int cameraId, VideoNodeType type) {
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    if (!mc) return false;
-+
-+    for(auto const& nd : mc->videoNodes) {
-+        if (type == nd.videoNodeType) {
-+            return true;
-+        }
-+    }
-+    return false;
-+}
-+
-+bool PlatformData::isISysSupportedFormat(int cameraId, int format)
-+{
-+    vector <int> supportedFormat;
-+    getSupportedISysFormats(cameraId, supportedFormat);
-+
-+    for (auto const fmt : supportedFormat) {
-+        if (format == fmt)
-+            return true;
-+    }
-+    return false;
-+}
-+
-+bool PlatformData::isISysSupportedResolution(int cameraId, camera_resolution_t resolution)
-+{
-+    vector <camera_resolution_t> res;
-+    getSupportedISysSizes(cameraId, res);
-+
-+    for (auto const& size : res) {
-+        if (resolution.width == size.width && resolution.height== size.height)
-+            return true;
-+    }
-+
-+    return false;
-+}
-+
-+int PlatformData::getISysRawFormat(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mISysRawFormat;
-+}
-+
-+stream_t PlatformData::getISysOutputByPort(int cameraId, Port port)
-+{
-+    stream_t config;
-+    CLEAR(config);
-+
-+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
-+    CheckError(!mc, config, "Invalid media control config.");
-+
-+    for (const auto& output : mc->outputs) {
-+        if (output.port == port) {
-+            config.format  = output.v4l2Format;
-+            config.width   = output.width;
-+            config.height  = output.height;
-+            break;
-+        }
-+    }
-+
-+    return config;
-+}
-+
-+bool PlatformData::isAiqdEnabled(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mEnableAiqd;
-+}
-+
-+int PlatformData::getFormatByDevName(int cameraId, const string& devName, McFormat& format)
-+{
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
-+
-+    for (auto &fmt : mc->formats) {
-+        if (fmt.formatType == FC_FORMAT && devName == fmt.entityName) {
-+            format = fmt;
-+            return OK;
-+        }
-+    }
-+
-+    LOGE("Failed to find DevName for cameraId: %d, devname: %s", cameraId, devName.c_str());
-+    return BAD_VALUE;
-+}
-+
-+int PlatformData::getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType, string& videoNodeName)
-+{
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    CheckError(!mc, BAD_VALUE, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
-+
-+    for(auto const& nd : mc->videoNodes) {
-+        if (videoNodeType == nd.videoNodeType) {
-+            videoNodeName = nd.name;
-+            return OK;
-+        }
-+    }
-+
-+    LOGE("failed to find video note name for cameraId: %d", cameraId);
-+    return BAD_VALUE;
-+}
-+
-+int PlatformData::getDevNameByType(int cameraId, VideoNodeType videoNodeType, string& devName)
-+{
-+    if (!isIsysEnabled(cameraId)) return OK;
-+
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    bool isSubDev = false;
-+
-+    switch (videoNodeType) {
-+        case VIDEO_PIXEL_ARRAY:
-+        case VIDEO_PIXEL_BINNER:
-+        case VIDEO_PIXEL_SCALER:
-+        {
-+            isSubDev = true;
-+            // For sensor subdevices are fixed and sensor HW may be initialized before configure,
-+            // the first MediaCtlConf is used to find sensor subdevice name.
-+            PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
-+            mc = &pCam->mMediaCtlConfs[0];
-+            break;
-+        }
-+        case VIDEO_ISYS_RECEIVER_BACKEND:
-+        case VIDEO_ISYS_RECEIVER:
-+        {
-+            isSubDev = true;
-+            break;
-+        }
-+        default:
-+            break;
-+    }
-+
-+    CheckError(!mc, NAME_NOT_FOUND, "failed to get MediaCtlConf, videoNodeType %d", videoNodeType);
-+
-+    for(auto& nd : mc->videoNodes) {
-+        if (videoNodeType == nd.videoNodeType) {
-+            string tmpDevName;
-+            CameraUtils::getDeviceName(nd.name.c_str(), tmpDevName, isSubDev);
-+            if (!tmpDevName.empty()) {
-+                devName = tmpDevName;
-+                LOG2("@%s, Found DevName. cameraId: %d, get video node: %s, devname: %s",
-+                      __func__, cameraId, nd.name.c_str(), devName.c_str());
-+                return OK;
-+            } else {
-+                // Use default device name if cannot find it
-+                if (isSubDev)
-+                    devName = "/dev/v4l-subdev1";
-+                else
-+                    devName = "/dev/video5";
-+                LOGE("Failed to find DevName for cameraId: %d, get video node: %s, devname: %s",
-+                      cameraId, nd.name.c_str(), devName.c_str());
-+                return NAME_NOT_FOUND;
-+            }
-+        }
-+    }
-+
-+    LOG1("Failed to find devname for cameraId: %d, use default setting instead", cameraId);
-+    return NAME_NOT_FOUND;
-+}
-+
-+/**
-+ * The ISYS best resolution is determined by the steps below:
-+ * 1. If the resolution is specified in MediaCtlConf, then use it.
-+ * 2. Try to find the exact matched one in ISYS supported resolutions.
-+ * 3. Try to find the same ratio resolution.
-+ * 4. If still couldn't get one, then use the biggest one.
-+ */
-+camera_resolution_t PlatformData::getISysBestResolution(int cameraId, int width,
-+                                                        int height, int field)
-+{
-+    LOG1("@%s, width:%d, height:%d", __func__, width, height);
-+
-+    // Skip for interlace, we only support by-pass in interlaced mode
-+    if (field == V4L2_FIELD_ALTERNATE) {
-+        return {width, height};
-+    }
-+
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    // The isys output size is fixed if outputWidth/outputHeight != 0
-+    // So we use it to as the ISYS resolution.
-+    if (mc != nullptr && mc->outputWidth != 0 && mc->outputHeight != 0) {
-+        return {mc->outputWidth, mc->outputHeight};
-+    }
-+
-+    const float RATIO_TOLERANCE = 0.05f; // Supported aspect ratios that are within RATIO_TOLERANCE
-+    const float kTargetRatio = (float)width / height;
-+
-+    vector <camera_resolution_t> res;
-+    // The supported resolutions are saved in res with ascending order(small -> bigger)
-+    getSupportedISysSizes(cameraId, res);
-+
-+    // Try to find out the same resolution in the supported isys resolution list
-+    // if it couldn't find out the same one, then use the bigger one which is the same ratio
-+    for (auto const& size : res) {
-+        if (width <= size.width && height <= size.height &&
-+            fabs((float)size.width/size.height - kTargetRatio) < RATIO_TOLERANCE) {
-+            LOG1("@%s: Found the best ISYS resoltoution (%d)x(%d)", __func__,
-+                 size.width, size.height);
-+            return {size.width, size.height};
-+        }
-+    }
-+
-+    // If it still couldn't find one, then use the biggest one in the supported list.
-+    LOG1("@%s: ISYS resolution not found, used the biggest one: (%d)x(%d)",
-+         __func__, res.back().width, res.back().height);
-+    return {res.back().width, res.back().height};
-+}
-+
-+bool PlatformData::isIsysEnabled(int cameraId)
-+{
-+    if (getInstance()->mStaticCfg.mCameras[cameraId].mMediaCtlConfs.empty()) {
-+        return false;
-+    }
-+    return true;
-+}
-+
-+int PlatformData::calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams)
-+{
-+    if (!isIsysEnabled(cameraId)) {
-+        LOG2("%s, no mc, just use default from xml", __func__);
-+        vector <camera_resolution_t> res;
-+        getSupportedISysSizes(cameraId, res);
-+
-+        CheckError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured.");
-+        sensorFrameParams = {0, 0, static_cast<uint32_t>(res[0].width),
-+                             static_cast<uint32_t>(res[0].height), 1, 1, 1, 1};
-+
-+        return OK;
-+    }
-+
-+    CLEAR(sensorFrameParams);
-+
-+    uint32_t width = 0;
-+    uint32_t horizontalOffset = 0;
-+    uint32_t horizontalBinNum = 1;
-+    uint32_t horizontalBinDenom = 1;
-+    uint32_t horizontalBin = 1;
-+
-+    uint32_t height = 0;
-+    uint32_t verticalOffset = 0;
-+    uint32_t verticalBinNum = 1;
-+    uint32_t verticalBinDenom = 1;
-+    uint32_t verticalBin = 1;
-+
-+    /**
-+     * For this function, it may be called without configuring stream
-+     * in some UT cases, the mc is nullptr at this moment. So we need to
-+     * get one default mc to calculate frame params.
-+     */
-+    MediaCtlConf *mc = PlatformData::getMediaCtlConf(cameraId);
-+    if (mc == nullptr) {
-+        PlatformData::StaticCfg::CameraInfo *pCam = &getInstance()->mStaticCfg.mCameras[cameraId];
-+        mc = &pCam->mMediaCtlConfs[0];
-+    }
-+
-+    bool pixArraySizeFound = false;
-+    for (auto const& current : mc->formats) {
-+        if (!pixArraySizeFound && current.width > 0 && current.height > 0) {
-+            width = current.width;
-+            height = current.height;
-+            pixArraySizeFound = true;
-+            LOG2("%s: active pixel array H=%d, W=%d", __func__, height, width);
-+            //Setup initial sensor frame params.
-+            sensorFrameParams.horizontal_crop_offset += horizontalOffset;
-+            sensorFrameParams.vertical_crop_offset += verticalOffset;
-+            sensorFrameParams.cropped_image_width = width;
-+            sensorFrameParams.cropped_image_height = height;
-+            sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
-+            sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
-+            sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
-+            sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
-+        }
-+
-+        if (current.formatType != FC_SELECTION) {
-+            continue;
-+        }
-+
-+        if (current.selCmd == V4L2_SEL_TGT_CROP) {
-+
-+            width = current.width * horizontalBin;
-+            horizontalOffset = current.left * horizontalBin;
-+            height = current.height * verticalBin;
-+            verticalOffset = current.top * verticalBin;
-+
-+            LOG2("%s: crop (binning factor: hor/vert:%d,%d)"
-+                  , __func__, horizontalBin, verticalBin);
-+
-+            LOG2("%s: crop left = %d, top = %d, width = %d height = %d",
-+                  __func__, horizontalOffset, verticalOffset, width, height);
-+
-+        } else if (current.selCmd == V4L2_SEL_TGT_COMPOSE) {
-+            if (width == 0 || height == 0) {
-+                LOGE("Invalid XML configuration, no pixel array width/height when handling compose, skip.");
-+                return BAD_VALUE;
-+            }
-+            if (current.width == 0 || current.height == 0) {
-+                LOGW("%s: Invalid XML configuration for TGT_COMPOSE,"
-+                     "0 value detected in width or height", __func__);
-+                return BAD_VALUE;
-+            } else {
-+                LOG2("%s: Compose width %d/%d, height %d/%d", __func__, width, current.width,
-+                    height, current.height);
-+                // the scale factor should be float, so multiple numerator and denominator
-+                // with coefficient to indicate float factor
-+                const int SCALE_FACTOR_COEF = 10;
-+                horizontalBin = width / current.width;
-+                horizontalBinNum = width * SCALE_FACTOR_COEF / current.width;
-+                horizontalBinDenom = SCALE_FACTOR_COEF;
-+                verticalBin = height / current.height;
-+                verticalBinNum = height * SCALE_FACTOR_COEF / current.height;
-+                verticalBinDenom = SCALE_FACTOR_COEF;
-+            }
-+
-+            LOG2("%s: COMPOSE horizontal bin factor=%d, (%d/%d)",
-+                  __func__, horizontalBin, horizontalBinNum, horizontalBinDenom);
-+            LOG2("%s: COMPOSE vertical bin factor=%d, (%d/%d)",
-+                  __func__, verticalBin, verticalBinNum, verticalBinDenom);
-+        } else {
-+            LOGW("%s: Target for selection is not CROP neither COMPOSE!", __func__);
-+            continue;
-+        }
-+
-+        sensorFrameParams.horizontal_crop_offset += horizontalOffset;
-+        sensorFrameParams.vertical_crop_offset += verticalOffset;
-+        sensorFrameParams.cropped_image_width = width;
-+        sensorFrameParams.cropped_image_height = height;
-+        sensorFrameParams.horizontal_scaling_numerator = horizontalBinNum;
-+        sensorFrameParams.horizontal_scaling_denominator = horizontalBinDenom;
-+        sensorFrameParams.vertical_scaling_numerator = verticalBinNum;
-+        sensorFrameParams.vertical_scaling_denominator = verticalBinDenom;
-+    }
-+
-+    return OK;
-+
-+}
-+
-+void PlatformData::getSupportedTuningConfig(int cameraId, vector <TuningConfig> &configs)
-+{
-+    configs = getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig;
-+}
-+
-+bool PlatformData::usePsys(int cameraId, int format)
-+{
-+    if (getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty()) {
-+        LOG1("@%s, the tuning config in xml does not exist", __func__);
-+        return false;
-+    }
-+
-+    if (getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat.empty()) {
-+        LOG1("@%s, the psys supported format does not exist", __func__);
-+        return false;
-+    }
-+
-+    for (auto &psys_fmt : getInstance()->mStaticCfg.mCameras[cameraId].mPSysFormat) {
-+        if (format == psys_fmt)
-+            return true;
-+    }
-+
-+    LOGW("%s, No matched format found, but expected format:%s", __func__,
-+        CameraUtils::pixelCode2String(format));
-+
-+    return false;
-+}
-+
-+int PlatformData::getConfigModesByOperationMode(int cameraId, uint32_t operationMode, vector <ConfigMode> &configModes)
-+{
-+    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_END) {
-+        LOG2("%s: operationMode was invalid operation mode", __func__);
-+        return INVALID_OPERATION;
-+    }
-+
-+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
-+          "@%s, the tuning config in xml does not exist", __func__);
-+
-+    if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) {
-+        if (getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto.empty()) {
-+            // Use the first config mode as default for auto
-+            configModes.push_back(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig[0].configMode);
-+            LOG2("%s: add config mode %d for operation mode %d", __func__, configModes[0], operationMode);
-+        } else {
-+            configModes = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModesForAuto;
-+        }
-+    } else {
-+        for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
-+            if (operationMode == (uint32_t)cfg.configMode) {
-+                configModes.push_back(cfg.configMode);
-+                LOG2("%s: add config mode %d for operation mode %d", __func__, cfg.configMode, operationMode);
-+            }
-+        }
-+    }
-+
-+    if (configModes.size() > 0) return OK;
-+    LOGW("%s, configure number %zu, operationMode %x, cameraId %d", __func__,
-+            configModes.size(), operationMode, cameraId);
-+    return INVALID_OPERATION;
-+}
-+
-+int PlatformData::getTuningModeByConfigMode(int cameraId, ConfigMode configMode,
-+                                            TuningMode& tuningMode)
-+{
-+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(),
-+          INVALID_OPERATION, "the tuning config in xml does not exist");
-+
-+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
-+        LOG2("%s, tuningMode %d, configMode %x", __func__, cfg.tuningMode, cfg.configMode);
-+        if (cfg.configMode == configMode) {
-+            tuningMode = cfg.tuningMode;
-+            return OK;
-+        }
-+    }
-+
-+    LOGW("%s, configMode %x, cameraId %d, no tuningModes", __func__, configMode, cameraId);
-+    return INVALID_OPERATION;
-+}
-+
-+int PlatformData::getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config)
-+{
-+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION,
-+          "@%s, the tuning config in xml does not exist.", __func__);
-+
-+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig) {
-+        if (cfg.configMode == mode) {
-+            config = cfg;
-+            return OK;
-+        }
-+    }
-+
-+    LOGW("%s, configMode %x, cameraId %d, no TuningConfig", __func__, mode, cameraId);
-+    return INVALID_OPERATION;
-+}
-+
-+int PlatformData::getLardTagsByTuningMode(int cameraId, TuningMode mode, LardTagConfig &lardTags)
-+{
-+    if (getInstance()->mStaticCfg.mCameras[cameraId].mLardTagsConfig.empty()) {
-+        LOG1("@%s, the lardTags config does not exist", __func__);
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    for (auto &cfg : getInstance()->mStaticCfg.mCameras[cameraId].mLardTagsConfig) {
-+        if (cfg.tuningMode == mode) {
-+            lardTags = cfg;
-+            return OK;
-+        }
-+    }
-+
-+    LOG1("@%s, the lard tag config does not exist for mode %d", __func__, mode);
-+    return NAME_NOT_FOUND;
-+}
-+
-+int PlatformData::getStreamIdByConfigMode(int cameraId, ConfigMode configMode)
-+{
-+    std::map<int, int> modeMap = getInstance()->mStaticCfg.mCameras[cameraId].mConfigModeToStreamId;
-+    return modeMap.find(configMode) == modeMap.end() ? -1 : modeMap[configMode];
-+}
-+
-+int PlatformData::getMaxRequestsInflight(int cameraId)
-+{
-+    int inflight = getInstance()->mStaticCfg.mCameras[cameraId].mMaxRequestsInflight;
-+    if (inflight <= 0) {
-+        inflight = isEnableAIQ(cameraId) ? 4 : MAX_BUFFER_COUNT;
-+    }
-+
-+    return inflight;
-+}
-+
-+bool PlatformData::getGraphConfigNodes(int cameraId)
-+{
-+    return !(getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsFile.empty());
-+}
-+
-+GraphSettingType PlatformData::getGraphSettingsType(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mGraphSettingsType;
-+}
-+
-+camera_yuv_color_range_mode_t PlatformData::getYuvColorRangeMode(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mYuvColorRangeMode;
-+}
-+
-+AiqdData* PlatformData::getAiqdData(int cameraId, TuningMode tuningMode)
-+{
-+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
-+               "@%s, wrong cameraId:%d", __func__, cameraId);
-+
-+    AiqInitData* aiqInitData = getInstance()->mAiqInitDatas[cameraId];
-+    std::string& sensorName = getInstance()->mStaticCfg.mCameras[cameraId].sensorName;
-+    return aiqInitData->getAiqdData(tuningMode, sensorName);
-+}
-+
-+// load cpf when tuning file (.aiqb) is available
-+CpfStore* PlatformData::getCpfStore(int cameraId)
-+{
-+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
-+               "@%s, wrong cameraId:%d", __func__, cameraId);
-+
-+    // Aiqb tuning file is configured in mSupportedTuningConfig
-+    if (!getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty()) {
-+        AiqInitData* aiqInitData = getInstance()->mAiqInitDatas[cameraId];
-+        std::string& sensorName = getInstance()->mStaticCfg.mCameras[cameraId].sensorName;
-+        return aiqInitData->getCpfStore(cameraId, sensorName);
-+    }
-+    return nullptr;
-+}
-+
-+bool PlatformData::isCSIBackEndCapture(int cameraId)
-+{
-+    bool isCsiBECapture = false;
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
-+
-+    for(const auto& node : mc->videoNodes) {
-+        if (node.videoNodeType == VIDEO_GENERIC &&
-+                (node.name.find("BE capture") != string::npos ||
-+                 node.name.find("BE SOC capture") != string::npos)) {
-+            isCsiBECapture = true;
-+            break;
-+        }
-+    }
-+
-+    return isCsiBECapture;
-+}
-+
-+bool PlatformData::isCSIFrontEndCapture(int cameraId)
-+{
-+    bool isCsiFeCapture = false;
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
-+
-+    for(const auto& node : mc->videoNodes) {
-+        if (node.videoNodeType == VIDEO_GENERIC &&
-+                (node.name.find("CSI-2") != string::npos ||
-+                 node.name.find("TPG") != string::npos)) {
-+            isCsiFeCapture = true;
-+            break;
-+        }
-+    }
-+    return isCsiFeCapture;
-+}
-+
-+bool PlatformData::isTPGReceiver(int cameraId)
-+{
-+    bool isTPGCapture = false;
-+    MediaCtlConf *mc = getMediaCtlConf(cameraId);
-+    CheckError(!mc, false, "getMediaCtlConf returns nullptr, cameraId:%d", cameraId);
-+
-+    for(const auto& node : mc->videoNodes) {
-+        if (node.videoNodeType == VIDEO_ISYS_RECEIVER &&
-+                (node.name.find("TPG") != string::npos)) {
-+            isTPGCapture = true;
-+            break;
-+        }
-+    }
-+    return isTPGCapture;
-+}
-+
-+int PlatformData::getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
-+                                                camera_range_t& etRange)
-+{
-+    vector<camera_ae_exposure_time_range_t> ranges;
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeExposureTimeRange(ranges);
-+
-+    if (ranges.empty())
-+        return NAME_NOT_FOUND;
-+
-+    for (auto& item : ranges) {
-+        if (item.scene_mode == sceneMode) {
-+            etRange = item.et_range;
-+            return OK;
-+        }
-+    }
-+    return NAME_NOT_FOUND;
-+}
-+
-+int PlatformData::getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
-+                                        camera_range_t& gainRange)
-+{
-+    vector<camera_ae_gain_range_t> ranges;
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSupportedAeGainRange(ranges);
-+
-+    if(ranges.empty()) {
-+        return NAME_NOT_FOUND;
-+    }
-+
-+    for (auto& item : ranges) {
-+        if (item.scene_mode == sceneMode) {
-+            gainRange = item.gain_range;
-+            return OK;
-+        }
-+    }
-+    return NAME_NOT_FOUND;
-+}
-+
-+bool PlatformData::isUsingCrlModule(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mUseCrlModule;
-+}
-+
-+vector<MultiExpRange> PlatformData::getMultiExpRanges(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mMultiExpRanges;
-+}
-+
-+camera_resolution_t *PlatformData::getPslOutputForRotation(int width, int height, int cameraId)
-+{
-+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap.empty(), nullptr,
-+          "@%s, cameraId: %d, there isn't pslOutputMapForRotation field in xml.", __func__, cameraId);
-+
-+    vector<UserToPslOutputMap> outputMap = getInstance()->mStaticCfg.mCameras[cameraId].mOutputMap;
-+    for (auto & map : outputMap) {
-+        if (width == map.User.width && height == map.User.height) {
-+            LOG2("cameraId: %d, find the psl output resoltion(%d, %d) for %dx%d",
-+                  cameraId, map.Psl.width, map.Psl.height, map.User.width, map.User.height);
-+            return &map.Psl;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+bool PlatformData::isTestPatternSupported(int cameraId)
-+{
-+    return !getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty();
-+}
-+
-+int32_t PlatformData::getSensorTestPattern(int cameraId, int32_t mode)
-+{
-+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap.empty(), -1,
-+          "@%s, cameraId: %d, mTestPatternMap is empty!", __func__, cameraId);
-+    auto testPatternMap = getInstance()->mStaticCfg.mCameras[cameraId].mTestPatternMap;
-+
-+    if (testPatternMap.find(mode) == testPatternMap.end()) {
-+        LOGW("Test pattern %d wasn't found in configuration file, return -1", mode);
-+        return -1;
-+    }
-+    return testPatternMap[mode];
-+}
-+
-+int PlatformData::getMaxNvmDataSize(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mMaxNvmDataSize;
-+}
-+
-+const char *PlatformData::getNvmDirectory(int cameraId)
-+{
-+    return getInstance()->mStaticCfg.mCameras[cameraId].mNvmDirectory.c_str();
-+}
-+
-+void *PlatformData::getNvmData(int cameraId)
-+{
-+    CheckError(cameraId >= MAX_CAMERA_NUMBER, nullptr,
-+               "@%s, wrong cameraId:%d", __func__, cameraId);
-+
-+    return getInstance()->mAiqInitDatas[cameraId]->getNvmData(cameraId);
-+}
-+
-+camera_coordinate_system_t PlatformData::getActivePixelArray(int cameraId)
-+{
-+    camera_coordinate_system_t arraySize;
-+    CLEAR(arraySize);
-+
-+    getInstance()->mStaticCfg.mCameras[cameraId].mCapability.getSensorActiveArraySize(arraySize);
-+
-+    return {arraySize.left, arraySize.top, arraySize.right, arraySize.bottom};
-+}
-+
-+string PlatformData::getCameraCfgPath()
-+{
-+    char* p = getenv("CAMERA_CFG_PATH");
-+
-+    return p? string(p) : string(CAMERA_DEFAULT_CFG_PATH);
-+}
-+
-+string PlatformData::getGraphDescFilePath()
-+{
-+    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_DESCRIPTOR_FILE);
-+}
-+
-+string PlatformData::getGraphSettingFilePath()
-+{
-+    return PlatformData::getCameraCfgPath() + string(CAMERA_GRAPH_SETTINGS_DIR);
-+}
-+
-+int PlatformData::getSensorDigitalGain(int cameraId, float realDigitalGain)
-+{
-+    int sensorDg = 0;
-+    int maxSensorDg = PlatformData::getMaxSensorDigitalGain(cameraId);
-+
-+    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
-+        int index = 0;
-+        while (pow(2, index) <= realDigitalGain) {
-+            sensorDg = index;
-+            index++;
-+        }
-+        sensorDg = CLIP(sensorDg, maxSensorDg, 0);
-+    } else {
-+        LOGE("%s, don't support the sensor digital gain type: %d",
-+                __func__, PlatformData::sensorDigitalGainType(cameraId));
-+    }
-+
-+    return sensorDg;
-+}
-+
-+float PlatformData::getIspDigitalGain(int cameraId, float realDigitalGain)
-+{
-+    float ispDg = 1.0f;
-+    int sensorDg = getSensorDigitalGain(cameraId, realDigitalGain);
-+
-+    if (PlatformData::sensorDigitalGainType(cameraId) == SENSOR_DG_TYPE_2_X) {
-+        ispDg = realDigitalGain / pow(2, sensorDg);
-+        ispDg = CLIP(ispDg, ispDg, 1.0);
-+    } else {
-+        LOGE("%s, don't support the sensor digital gain type: %d",
-+                __func__, PlatformData::sensorDigitalGainType(cameraId));
-+    }
-+
-+    return ispDg;
-+}
-+
-+int PlatformData::getScalerInfo(int cameraId, int32_t streamId,
-+                                float *scalerWidth, float *scalerHeight)
-+{
-+    if (getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.empty()) {
-+        *scalerWidth = 1.0;
-+        *scalerHeight = 1.0;
-+        return OK;
-+    }
-+
-+    for (auto &scalerInfo : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
-+        LOG2("%s, streamId %d, scalerWidth %f, scalerHeight %f", __func__, scalerInfo.streamId,
-+             scalerInfo.scalerWidth, scalerInfo.scalerHeight);
-+        if (scalerInfo.streamId == streamId) {
-+            *scalerWidth = scalerInfo.scalerWidth;
-+            *scalerHeight = scalerInfo.scalerHeight;
-+            break;
-+        }
-+    }
-+
-+    return OK;
-+}
-+
-+void  PlatformData::setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo)
-+{
-+    for (auto &scalerInfoInput : scalerInfo) {
-+        bool flag = false;
-+        for (auto &scalerInfoTmp : getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo) {
-+            if (scalerInfoInput.streamId == scalerInfoTmp.streamId) {
-+                scalerInfoTmp.scalerWidth = scalerInfoInput.scalerWidth;
-+                scalerInfoTmp.scalerHeight = scalerInfoInput.scalerHeight;
-+                flag = true;
-+                break;
-+            }
-+        }
-+        if (!flag) {
-+            getInstance()->mStaticCfg.mCameras[cameraId].mScalerInfo.push_back(scalerInfoInput);
-+        }
-+    }
-+}
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.h b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
-new file mode 100644
-index 000000000000..16aff41031a4
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
-@@ -0,0 +1,1094 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <limits.h>
-+#include <v4l2_device.h>
-+
-+#include <vector>
-+#include <string>
-+#include <map>
-+#include <unordered_map>
-+
-+#include "ICamera.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "CameraTypes.h"
-+#include "Parameters.h"
-+#include "AiqInitData.h"
-+#include "MediaControl.h"
-+#include "IGraphConfig.h"
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/IntelAlgoClient.h"
-+#endif
-+
-+namespace icamera {
-+
-+#define RESOLUTION_1_3MP_WIDTH  1280
-+#define RESOLUTION_1_3MP_HEIGHT 960
-+#define RESOLUTION_1080P_WIDTH  1920
-+#define RESOLUTION_1080P_HEIGHT 1080
-+#define RESOLUTION_720P_WIDTH   1280
-+#define RESOLUTION_720P_HEIGHT  720
-+#define RESOLUTION_VGA_WIDTH    640
-+#define RESOLUTION_VGA_HEIGHT   480
-+
-+#define MAX_BUFFER_COUNT (10)
-+#define MAX_STREAM_NUMBER   5
-+#define MAX_WEIGHT_GRID_SIDE_LEN 1024
-+
-+#define FACE_ENGINE_DEFAULT_RUNNING_INTERVAL 1
-+
-+#define MAX_SETTING_COUNT 32
-+#define CAMERA_PORT_NAME "CSI-2"
-+
-+#ifdef CAL_BUILD
-+#define MAX_CAMERA_NUMBER 2
-+#define CAMERA_CACHE_DIR "/var/cache/camera/"
-+#define CAMERA_DEFAULT_CFG_PATH "/etc/camera/"
-+#define CAMERA_GRAPH_DESCRIPTOR_FILE "gcss/graph_descriptor.xml"
-+#define CAMERA_GRAPH_SETTINGS_DIR "gcss/"
-+#elif __ANDROID__
-+#define MAX_CAMERA_NUMBER 2
-+#define CAMERA_CACHE_DIR "./"
-+#define CAMERA_DEFAULT_CFG_PATH "/vendor/etc/"
-+#define CAMERA_GRAPH_DESCRIPTOR_FILE "graph_descriptor.xml"
-+#define CAMERA_GRAPH_SETTINGS_DIR ""
-+#else
-+#define MAX_CAMERA_NUMBER   100
-+// Temporarily using current path to save aiqd file for none CAL platforms.
-+#define CAMERA_CACHE_DIR "./"
-+#define CAMERA_DEFAULT_CFG_PATH "/usr/share/defaults/etc/camera/"
-+#define CAMERA_GRAPH_DESCRIPTOR_FILE "gcss/graph_descriptor.xml"
-+#define CAMERA_GRAPH_SETTINGS_DIR "gcss/"
-+#endif
-+
-+class GraphConfigNodes;
-+class PlatformData {
-+private:
-+    //Prevent to create multiple instances
-+    PlatformData();
-+    ~PlatformData();
-+
-+public:
-+    class StaticCfg {
-+    public:
-+        StaticCfg() {
-+            mCameras.clear();
-+        };
-+        ~StaticCfg() {}; // not release resource by design
-+
-+        /**
-+         * Camera feature info that is specific to camera id
-+         */
-+        class CameraInfo {
-+        public:
-+            CameraInfo() :
-+                sensorName(""),
-+                sensorDescription("unset"),
-+                mLensName(""),
-+                mLensHwType(LENS_NONE_HW),
-+                mAutoSwitchType(AUTO_SWITCH_PSYS),
-+                mLtmEnabled(false),
-+                mSensorExposureNum(2),
-+                mSensorExposureType(SENSOR_EXPOSURE_SINGLE),
-+                mSensorGainType(SENSOR_GAIN_NONE),
-+                mLensCloseCode(0),
-+                mEnableAIQ(false),
-+                mSkipFrameV4L2Error(false),
-+                mCITMaxMargin(0),
-+                mYuvColorRangeMode(CAMERA_FULL_MODE_YUV_COLOR_RANGE),
-+                mInitialSkipFrame(0),
-+                mMaxRawDataNum(MAX_BUFFER_COUNT),
-+                mTopBottomReverse(false),
-+                mPsysContinueStats(false),
-+                mMaxRequestsInflight(0),
-+                mPreferredBufQSize(MAX_BUFFER_COUNT),
-+                mPipeSwitchDelayFrame(0),
-+                mExposureLag(MAX_BUFFER_COUNT),
-+                mGainLag(0),
-+                mLtmGainLag(0),
-+                mEnableLtmThread(false),
-+                mEnableLtmDefog(false),
-+                mMaxSensorDigitalGain(0),
-+                mSensorDgType(SENSOR_DG_TYPE_NONE),
-+                mISysFourcc(V4L2_PIX_FMT_SGRBG8),
-+                mISysRawFormat(V4L2_PIX_FMT_SGRBG10),
-+                mUseCrlModule(true),
-+                mFacing(FACING_BACK),
-+                mOrientation(ORIENTATION_0),
-+                mUseSensorDigitalGain(false),
-+                mUseIspDigitalGain(false),
-+                mNeedPreRegisterBuffers(false),
-+                mFrameSyncCheckEnabled(false),
-+                mEnableAiqd(false),
-+                mCurrentMcConf(nullptr),
-+                mGraphSettingsType(COUPLED),
-+                mDVSType(MORPH_TABLE),
-+                mISYSCompression(false),
-+                mPSACompression(false),
-+                mOFSCompression(false),
-+                mFaceAeEnabled(false),
-+                mFaceEngineRunningInterval(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
-+                mFaceEngineRunningIntervalNoFace(FACE_ENGINE_DEFAULT_RUNNING_INTERVAL),
-+                mFaceEngineRunningSync(false),
-+                mPsysAlignWithSof(false),
-+                mSwProcessingAlignWithIsp(false),
-+                mMaxNvmDataSize(0)
-+            {
-+            }
-+
-+            std::vector <MediaCtlConf> mMediaCtlConfs;
-+
-+            std::string sensorName;
-+            std::string sensorDescription;
-+            std::string mLensName;
-+            int mLensHwType;
-+            int mAutoSwitchType;
-+            bool mLtmEnabled;
-+            int mSensorExposureNum;
-+            int mSensorExposureType;
-+            int mSensorGainType;
-+            int mLensCloseCode;
-+            bool mEnableAIQ;
-+            bool mSkipFrameV4L2Error;
-+            int mCITMaxMargin;
-+            camera_yuv_color_range_mode_t mYuvColorRangeMode;
-+            unsigned int mInitialSkipFrame;
-+            unsigned int mMaxRawDataNum;
-+            bool mTopBottomReverse;
-+            bool mPsysContinueStats;
-+            int mMaxRequestsInflight;
-+            unsigned int mPreferredBufQSize;
-+            unsigned int mPipeSwitchDelayFrame;
-+            int mExposureLag;
-+            int mGainLag;
-+            int mLtmGainLag;
-+            bool mEnableLtmThread;
-+            bool mEnableLtmDefog;
-+            int mMaxSensorDigitalGain;
-+            SensorDgType mSensorDgType;
-+            std::string mCustomAicLibraryName;
-+            std::string mCustom3ALibraryName;
-+            std::vector <camera_resolution_t> mSupportedISysSizes; // ascending order request
-+            std::vector <int> mSupportedISysFormat;
-+            int mISysFourcc; // the isys output format
-+            int mISysRawFormat; // the isys raw format if scale enabled
-+
-+            std::vector <int> mPSysFormat; // the psys output format
-+            std::vector <TuningConfig> mSupportedTuningConfig;
-+            std::vector <LardTagConfig> mLardTagsConfig;
-+            std::vector <ConfigMode> mConfigModesForAuto;
-+
-+            bool mUseCrlModule;
-+            int mFacing;
-+            int mOrientation;
-+            bool mUseSensorDigitalGain;
-+            bool mUseIspDigitalGain;
-+            bool mNeedPreRegisterBuffers;
-+            bool mFrameSyncCheckEnabled;
-+            bool mEnableAiqd;
-+            MediaCtlConf *mCurrentMcConf;
-+            std::map<int, supported_stream_config_array_t> mStreamToMcMap;
-+            Parameters mCapability;
-+
-+            std::string mGraphSettingsFile;
-+            GraphSettingType mGraphSettingsType;
-+            std::vector <MultiExpRange> mMultiExpRanges;
-+            std::vector <uint32_t> mSupportedIspControlFeatures;
-+            int mDVSType;
-+            bool mISYSCompression;
-+            bool mPSACompression;
-+            bool mOFSCompression;
-+            bool mFaceAeEnabled;
-+            int mFaceEngineRunningInterval;
-+            int mFaceEngineRunningIntervalNoFace;
-+            int mFaceEngineRunningSync;
-+            bool mPsysAlignWithSof;
-+            bool mSwProcessingAlignWithIsp;
-+
-+            /* key: camera_test_pattern_mode_t, value: sensor test pattern mode */
-+            std::unordered_map<int32_t, int32_t> mTestPatternMap;
-+
-+            // This is for binding stream id to ConfigMode, since the stream id from kernel list of
-+            // a PG might be incorrect. To be removed after stream id mismatch issue fixed.
-+            std::map<int, int> mConfigModeToStreamId;
-+            std::vector<UserToPslOutputMap> mOutputMap;
-+            int mMaxNvmDataSize;
-+            std::string mNvmDirectory;
-+            std::vector<IGraphType::ScalerInfo> mScalerInfo;
-+        };
-+
-+        std::vector<CameraInfo> mCameras;
-+        std::vector<PolicyConfig> mPolicyConfig;
-+        CommonConfig mCommonConfig;
-+    };
-+private:
-+    StaticCfg mStaticCfg;
-+
-+    AiqInitData* mAiqInitDatas[MAX_CAMERA_NUMBER];
-+private:
-+    /**
-+     * Get access to the platform singleton.
-+     *
-+     * Note: this is implemented in PlatformFactory.cpp
-+     */
-+    static PlatformData* sInstance;
-+    static Mutex sLock;
-+    static PlatformData* getInstance();
-+
-+#ifdef ENABLE_SANDBOXING
-+    static IntelAlgoClient* mIntelAlgoClient;
-+#endif
-+
-+    /**
-+     * Release GraphConfigNodes in StaticCfg::CameraInfo
-+     */
-+    void releaseGraphConfigNodes();
-+
-+    /**
-+     * Get MediaCtlConf via MC ID.
-+     */
-+    static MediaCtlConf* getMcConfByMcId(const StaticCfg::CameraInfo& cameraInfo, int mcId);
-+
-+    /**
-+     * Get MediaCtlConf via stream config.
-+     */
-+    static MediaCtlConf* getMcConfByStream(const StaticCfg::CameraInfo& cameraInfo,
-+                                           const stream_t& stream);
-+
-+    /**
-+     * Get MediaCtlConf via ConfigMode.
-+     */
-+    static MediaCtlConf* getMcConfByConfigMode(const StaticCfg::CameraInfo& cameraInfo,
-+                                               const stream_t& stream, ConfigMode mode);
-+
-+    /**
-+     * Check if video node is enabled via camera Id and video node type.
-+     */
-+    static bool isVideoNodeEnabled(int cameraId, VideoNodeType type);
-+
-+public:
-+#ifdef ENABLE_SANDBOXING
-+    /**
-+     * Get the Intel Algo Client.
-+     */
-+    static IntelAlgoClient* getIntelAlgoClient() { return mIntelAlgoClient; }
-+#endif
-+
-+     /**
-+      * releaseInstance
-+      * This function must be called when the hal is destroyed.
-+      */
-+    static void releaseInstance();
-+
-+    /**
-+     * get the camera numbers
-+     *
-+     * \return int: the camera numbers
-+     */
-+    static int numberOfCameras();
-+
-+    /**
-+     * get the sensor name
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return char*: the sensor name string.
-+     */
-+    static const char* getSensorName(int cameraId);
-+
-+    /**
-+     * get the sensor description
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return const char*: the sensor descrition string.
-+     */
-+    static const char* getSensorDescription(int cameraId);
-+
-+    /**
-+     * get the Lens name
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return char*: the lens name string.
-+     */
-+    static const char* getLensName(int cameraId);
-+
-+    /**
-+     * get the Lens HW type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return int: the Lens HW type
-+     */
-+    static int getLensHwType(int cameraId);
-+
-+    /**
-+     * get the DVS type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return int: the DVS type
-+     */
-+    static int getDVSType(int cameraId);
-+
-+    /**
-+     * get the ISYS compression flag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if ISYS compression is enabled
-+     */
-+    static bool getISYSCompression(int cameraId);
-+
-+    /**
-+     * get the PSA compression flag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if PSA compression is enabled
-+     */
-+    static bool getPSACompression(int cameraId);
-+
-+    /**
-+     * get the OFS compression flag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if OFS compression is enabled
-+     */
-+    static bool getOFSCompression(int cameraId);
-+
-+    /**
-+     * get the max coarse integration time margin
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return int: the value of max coarse integration time margin.
-+     */
-+    static int getCITMaxMargin(int cameraId);
-+
-+    /**
-+     * Check AIQ is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if AIQ is enabled or not.
-+     */
-+    static bool isEnableAIQ(int cameraId);
-+
-+    /**
-+     * Check if sensor digital gain is used or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if sensor gain is used or not.
-+     */
-+    static bool isUsingSensorDigitalGain(int cameraId);
-+
-+    /**
-+     * Check if using isp digital gain or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if using isp gain or not.
-+     */
-+    static bool isUsingIspDigitalGain(int cameraId);
-+
-+    /**
-+     * Check if need to pre-register buffers or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if pre-register buffers or not.
-+     */
-+    static bool isNeedToPreRegisterBuffer(int cameraId);
-+
-+    /**
-+     * Get auto switch type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of auto switch type
-+     */
-+    static int getAutoSwitchType(int cameraId);
-+
-+    /**
-+     * Check Defog(LTM) is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if Defog is enabled or not.
-+     */
-+    static bool isEnableDefog(int cameraId);
-+
-+    /**
-+     * Check Frame Sync is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if Frame Sync is enabled or not.
-+     */
-+    static bool isEnableFrameSyncCheck(int cameraId);
-+
-+    /**
-+     * Get exposure number
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param multiExposure: true or false
-+     * \return the value of exposure number according to different cases
-+     */
-+    static int getExposureNum(int cameraId, bool multiExposure);
-+
-+    /**
-+     * Check LTM is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if LTM is enabled or not.
-+     */
-+    static bool isLtmEnabled(int cameraId);
-+
-+    /**
-+     * Get sensor exposure type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of sensor exposure type
-+     */
-+    static int getSensorExposureType(int cameraId);
-+
-+    /**
-+     * Get sensor gain type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of sensor gain type
-+     */
-+    static int getSensorGainType(int cameraId);
-+
-+    /**
-+     * Get sensor's initial skip frame number
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of initial skip frame number
-+     */
-+    static unsigned int getInitialSkipFrame(int cameraId);
-+
-+    /**
-+     * Get max raw data number
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of max raw data number
-+     */
-+    static unsigned int getMaxRawDataNum(int cameraId);
-+
-+     /**
-+     * Get sensor's top bottom filed reverse option
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of top bottom filed reverse value
-+     */
-+    static bool getTopBottomReverse(int cameraId);
-+
-+    /*
-+     * Check if Psys continuous stats is needed or not.
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if it is needed
-+     */
-+    static bool isPsysContinueStats(int cameraId);
-+
-+    /**
-+     * Get preferred buffer queue size
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of preferred buffer queue size
-+     */
-+    static unsigned int getPreferredBufQSize(int cameraId);
-+
-+    /**
-+     * Get pipe switch delay frame
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of delay frame
-+     */
-+    static unsigned int getPipeSwitchDelayFrame(int cameraId);
-+
-+    /**
-+     * Get Ltm Gain lag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of LTM gain lag
-+     */
-+    static int getLtmGainLag(int cameraId);
-+
-+    /**
-+     * Check ltm thread is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if ltm thread is enabled or not.
-+     */
-+    static bool isEnableLtmThread(int cameraId);
-+
-+    /**
-+     * Check face detection is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if face detection is enabled or not.
-+     */
-+    static bool isFaceAeEnabled(int cameraId);
-+
-+    /**
-+     * get face engine's running interval
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the face engine running interval value.
-+     */
-+    static int faceEngineRunningInterval(int cameraId);
-+
-+    /**
-+     * get face engine's running interval when face is not found
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the face engine running interval value when face is not found.
-+     */
-+    static int faceEngineRunningIntervalNoFace(int cameraId);
-+
-+    /**
-+     * Check face detection runs  synchronously or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if face detection runs synchronously or not.
-+     */
-+    static bool isFaceEngineSyncRunning(int cameraId);
-+
-+    /**
-+     * get dvs supported status
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true: dvs supported; false: dvs not supported.
-+     */
-+    static bool isDvsSupported(int cameraId);
-+
-+    /**
-+     * Check psys align with sof is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if psys align with sof is enabled or not.
-+     */
-+    static bool psysAlignWithSof(int cameraId);
-+
-+    /**
-+     * Check software processing align with isp is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if software processing align with isp is enabled or not.
-+     */
-+    static bool swProcessingAlignWithIsp(int cameraId);
-+
-+    /**
-+     * Get the max digital gain of sensor
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of max digital gain
-+     */
-+    static int getMaxSensorDigitalGain(int cameraId);
-+
-+    /**
-+     * Get sensor digital gain type
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the sensor digital gain type
-+     */
-+    static SensorDgType sensorDigitalGainType(int cameraId);
-+
-+    /**
-+     * Get sensor's exposure lag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of exposure lag
-+     */
-+    static int getExposureLag(int cameraId);
-+
-+    /**
-+     * Get sensor's gain lag
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of gain lag
-+     */
-+    static int getGainLag(int cameraId);
-+
-+    /**
-+     * Get the executor policy config.
-+     *
-+     * \param[in] graphId: the graph id
-+     *
-+     * \return PolicyConfig* object if found, otherwise return nullptr.
-+     */
-+    static PolicyConfig* getExecutorPolicyConfig(int graphId);
-+
-+    /**
-+     * According to stream info to select MC
-+     * this function will compare the format/resolutions/interlace to find the MediaCtlConf
-+     * and then store it into cameraInfo.
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param stream: the stream info
-+     * \param mode: the stream operation mode
-+     */
-+    static void selectMcConf(int cameraId, stream_t stream, ConfigMode mode, int mcId);
-+
-+    /**
-+     * to get the current MediaCtlConf
-+     * after the media controller has been analyzed, the media controller information will be stored in the mMediaCtlConfs.
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return MediaCtlConf*, if it doens't find one, this function will return nullptr.
-+     */
-+    static MediaCtlConf *getMediaCtlConf(int cameraId);
-+
-+    /**
-+     * \brief Fill camera info and capability according to given camera id
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param[out] camera_info_t info
-+     *
-+     * \return 0 if succeed, other value indicates failed.
-+     */
-+    static int getCameraInfo(int cameraId, camera_info_t& info);
-+
-+    /**
-+     * \brief Check if the camera_features feature is supported
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param[in] camera_features feature
-+     *
-+     * \return true if supported, otherwise return false.
-+     */
-+    static bool isFeatureSupported(int cameraId, camera_features feature);
-+
-+    /**
-+     * \brief Check if the given stream config is supported
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param[in] stream_t conf
-+     *
-+     * \return true if supported, otherwise return false.
-+     */
-+    static bool isSupportedStream(int cameraId, const stream_t& conf);
-+
-+    /**
-+     * get the isys supported size list
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param sizes: the function will fill the isys supported size list to the sizes
-+     */
-+    static void getSupportedISysSizes(int cameraId, std::vector <camera_resolution_t>& resolutions);
-+
-+    /**
-+     * get the isys supported format list
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param formats: the function will fill the isys supported format list to the formats
-+     * \return true if success, return false if it fails.
-+     */
-+    static bool getSupportedISysFormats(int cameraId, std::vector <int>& formats);
-+
-+    /**
-+     * Format for the ISYS output
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the format for the isys output
-+     */
-+    static int getISysFormat(int cameraId);
-+
-+    /**
-+     * Set ISYS output format
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param format: the isys output format
-+     */
-+    static void selectISysFormat(int cameraId, int format);
-+
-+    /**
-+     * If ISYS supported format.
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     */
-+    static bool isISysSupportedFormat(int cameraId, int format);
-+
-+    /**
-+     * if the resolution is supported by Isys
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param resolution: the requested resolution
-+     * \return true if the resolution is supported by isys, otherwise false
-+     */
-+    static bool isISysSupportedResolution(int cameraId, camera_resolution_t resolution);
-+
-+    /**
-+     * Check if the frame needs to be skipped when STR2MMIO error occurs
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return if corrupted frame needs to be skipped or not.
-+     */
-+    static bool isSkipFrameOnSTR2MMIOErr(int cameraId);
-+
-+    /**
-+     * Format for the ISYS RAW output
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the RAW format if isys scale enabled
-+     */
-+    static int getISysRawFormat(int cameraId);
-+
-+    /**
-+     * Get the config of the ISYS output per port
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the config of the ISYS output for the given port.
-+     */
-+    static stream_t getISysOutputByPort(int cameraId, Port port);
-+
-+    /**
-+     * get the format by device name
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param devName: device name
-+     * \format: return param for format
-+     * \return the status
-+     */
-+    static int getFormatByDevName(int cameraId, const std::string& devName, McFormat& format);
-+
-+    /**
-+     * get the video node name
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param videoNodeType: value of enum VideoNodeType
-+     * \param videoNodeName: return param for the video node name
-+     * \return the status
-+     */
-+    static int getVideoNodeNameByType(int cameraId, VideoNodeType videoNodeType,
-+                                      std::string& videoNodeName);
-+
-+    /**
-+     * get the hardware device name
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param videoNodeType: value of enum VideoNodeType
-+     * \param devName: return param for the device name
-+     * \return the status
-+     */
-+    static int getDevNameByType(int cameraId, VideoNodeType videoNodeType, std::string& devName);
-+
-+    /**
-+     * Check if ISYS is enabled or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if ISYS is enabled, otherwise return false
-+     */
-+    static bool isIsysEnabled(int cameraId);
-+
-+    static int calculateFrameParams(int cameraId, SensorFrameParams& sensorFrameParams);
-+
-+    /**
-+     * Get the optmized resolutions that supported by input system
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param width:    The width of the request frame
-+     * \param height:   The height of the request frame
-+     * \param field:    The field of the request frame
-+     *
-+     * \return camera_resolution_t: The optimized resolution that used to configure the ISYS.
-+     */
-+    static camera_resolution_t getISysBestResolution(int cameraId, int width, int height, int field);
-+
-+    /**
-+     * to get if it support the format
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param format:the format will be checked if the psys supports.
-+     * \return true or false for the psys could be used or not.
-+     */
-+    static bool usePsys(int cameraId, int format);
-+
-+    /**
-+     * to get supported psys dag config
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param configs: the function will fill supported psys dag config list to the configs
-+     */
-+    static void getSupportedTuningConfig(int cameraId, std::vector <TuningConfig> &configs);
-+
-+    /**
-+     * to get the ConfigMode by operation Mode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param operationMode: the operation mode
-+     * \param configModes: the function will fill available ConfigMode for this operation mode
-+     * \return OK if get ConfigMode, otherwise return INVALID_OPERATION
-+     */
-+    static int getConfigModesByOperationMode(int cameraId, uint32_t operationMode,
-+                                             std::vector <ConfigMode> &configModes);
-+
-+    /**
-+     * to get the TuningMode by Config Mode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param configMode: type of ConfigMode (except auto)
-+     * \param tuningMode: return related TuningMode
-+     * \return OK if get TuningMode, otherwise return INVALID_OPERATION
-+     */
-+    static int getTuningModeByConfigMode(int cameraId, ConfigMode configMode, TuningMode& tuningMode);
-+
-+    /**
-+     * to get tuning config by ConfigMode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param mode: ConfigMode
-+     * \param config: return related TuningConfig
-+     * \return OK if get TuningConfig, otherwise return INVALID_OPERATION
-+     */
-+    static int getTuningConfigByConfigMode(int cameraId, ConfigMode mode, TuningConfig &config);
-+
-+    /**
-+     * to get lard tags config by TuningMode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param mode: TuningMode
-+     * \param config: return related LardTagConfig
-+     * \return OK if get TuningConfig, otherwise return NAME_NOT_FOUND
-+     */
-+    static int getLardTagsByTuningMode(int cameraId, TuningMode mode, LardTagConfig &lardTags);
-+
-+    /*
-+     * Get stream id by the given configMode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param configMode: ConfigMode
-+     * \return the stream id if succeeds, otherwise return -1.
-+     */
-+    static int getStreamIdByConfigMode(int cameraId, ConfigMode configMode);
-+
-+    /*
-+     * Get the max requests number in flight
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the max requests number in flight
-+     */
-+    static int getMaxRequestsInflight(int cameraId);
-+
-+    /**
-+     * get yuv color range mode
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the correponding camera_yuv_color_range_mode_t.
-+     */
-+    static camera_yuv_color_range_mode_t getYuvColorRangeMode(int cameraId);
-+
-+    /**
-+     * Get AiqdData object
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param tuningMode: TuningMode
-+     * \return AiqdData object
-+     */
-+    static AiqdData* getAiqdData(int cameraId, TuningMode tuningMode);
-+
-+    /**
-+     * Create CpfStore object, initialize mAiqInitDatas[cameraId]
-+     * and return CpfStore object.
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return CpfStore object if tuning file is available; otherwise return nullptr.
-+     */
-+    static CpfStore* getCpfStore(int cameraId);
-+
-+    /**
-+     * If dynamic graph config enabled
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if use graphConfig file.
-+     */
-+    static bool getGraphConfigNodes(int cameraId);
-+
-+    /**
-+     * to get the type of graph settings
-+     *
-+     * \param cameraId: 0 ~ (MAX_CAMERA_NUMBER - 1)
-+     * \return the graph settings type: COUPLED or DISPERSED.
-+     */
-+    static GraphSettingType getGraphSettingsType(int cameraId);
-+
-+    /**
-+     * if ISYS CSI Back End capture enabled
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if the current sensor is CSI Back End capture or not
-+     */
-+    static bool isCSIBackEndCapture(int cameraId);
-+
-+    /**
-+     * if ISYS CSI Front End capture enabled
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if the current sensor is CSI Front End capture or not
-+     */
-+    static bool isCSIFrontEndCapture(int cameraId);
-+
-+    /**
-+     * if AIQD enabled
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if AIQD is enabled or not
-+     */
-+    static bool isAiqdEnabled(int cameraId);
-+
-+    /**
-+     * if image from tpg
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if frame is from tpg or not
-+     */
-+    static bool isTPGReceiver(int cameraId);
-+
-+    static int getSupportAeExposureTimeRange(int cameraId, camera_scene_mode_t sceneMode,
-+                                             camera_range_t& etRange);
-+    static int getSupportAeGainRange(int cameraId, camera_scene_mode_t sceneMode,
-+                                     camera_range_t& gainRange);
-+
-+    /**
-+     * if CrlModule is used
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if CrlModule driver is used, otherwise return false
-+     */
-+    static bool isUsingCrlModule(int cameraId);
-+
-+    /**
-+     * to get the MultiExpRange of CameraInfo
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the MultiExpRange for current camera id.
-+     */
-+    static std::vector<MultiExpRange> getMultiExpRanges(int cameraId);
-+
-+    /**
-+     * Get the psl output resolution
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param width:    The width of user requirement
-+     * \param height:   The height of user requirement
-+     * \return the psl output resolution if provides it in xml file, otherwise return nullptr.
-+     */
-+    static camera_resolution_t *getPslOutputForRotation(int width, int height, int cameraId);
-+
-+    /**
-+     * Check if test pattern is supported or not
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return true if mTestPatternMap is defined, otherwise return false.
-+     */
-+    static bool isTestPatternSupported(int cameraId);
-+
-+    /**
-+     * get sensor test pattern
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param mode: camera_test_pattern_mode_t
-+     * \return corresponding sensor test pattern if provided in xml file, otherwise return -1.
-+     */
-+    static int32_t getSensorTestPattern(int cameraId, int32_t mode);
-+
-+    /**
-+     * Get the max nvm data size
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the value of max nvm data size
-+     */
-+    static int getMaxNvmDataSize(int cameraId);
-+
-+    /**
-+     * Get the nvm data direcotry
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the string of nvm data direcotry
-+     */
-+    static const char *getNvmDirectory(int cameraId);
-+
-+    /**
-+     * Get the nvm data
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \return the nvm data pointer
-+     */
-+    static void *getNvmData(int cameraId);
-+
-+    /**
-+    * Get sensor active array size
-+    *
-+    * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+    * \return the value of camera_coordinate_system_t.
-+    */
-+    static camera_coordinate_system_t getActivePixelArray(int cameraId);
-+
-+    /**
-+    * Get camera cfg path from environment variable
-+    *
-+    * \param void
-+    * \return the value of camera cfg path.
-+    */
-+    static std::string getCameraCfgPath();
-+
-+    /**
-+    * Get camera graph descriptor file path
-+    *
-+    * \param void
-+    * \return the value of camera graph descriptor file path.
-+    */
-+    static std::string getGraphDescFilePath();
-+
-+    /**
-+    * Get camera graph setting file path.
-+    *
-+    * \param void
-+    * \return the value of camera graph setting file path.
-+    */
-+    static std::string getGraphSettingFilePath();
-+
-+    /*
-+     * Get sensor value for the digital gain.
-+     *
-+     * Since the calculation formula may be different between sensors,
-+     * so we need to get this value based on sensor digital gain type.
-+     * For imx274, the magnification = 2^x (x is the register value).
-+     *
-+     * Need to specify the sensorDgType, maxSensorDg and useIspDigitalGain in xml.
-+     */
-+    static int getSensorDigitalGain(int cameraId, float realDigitalGain);
-+
-+    /*
-+     * Get the isp gain
-+     *
-+     * Separate real digital to sensorDg and ispDg, and the ispDg >= 1
-+     */
-+    static float getIspDigitalGain(int cameraId, float realDigitalGain);
-+
-+    /*
-+     * Get the scaler info
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param streamId: hal stream id
-+     * \param sclscalerWidth and scalerHeight : return related scaler info
-+     * \return OK.
-+     */
-+    static int getScalerInfo(int cameraId, int32_t streamId,
-+                             float *scalerWidth, float *scalerHeight);
-+
-+    /*
-+     * Set the scaler info
-+     *
-+     * \param cameraId: [0, MAX_CAMERA_NUMBER)
-+     * \param scalerInfo related IGraphType::ScalerInfo
-+     */
-+    static void setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo);
-+};
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
-new file mode 100644
-index 000000000000..f799f21a8ec8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.cpp
-@@ -0,0 +1,226 @@
-+/*
-+ * Copyright (C) 2017-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "PolicyParser"
-+
-+#include <string.h>
-+#include <expat.h>
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "PolicyParser.h"
-+
-+namespace icamera {
-+#define PSYS_POLICY_FILE_NAME "psys_policy_profiles.xml"
-+PolicyParser::PolicyParser(PlatformData::StaticCfg *cfg) :
-+    mStaticCfg(cfg),
-+    mCurrentDataField(FIELD_INVALID),
-+    pCurrentConf(nullptr) {
-+    LOGXML("@%s", __func__);
-+    CheckError(!mStaticCfg, VOID_VALUE, "@%s, cfg parameter is wrong", __func__);
-+    mStaticCfg->mPolicyConfig.clear();
-+
-+    int ret = getDataFromXmlFile(PSYS_POLICY_FILE_NAME);
-+    CheckError(ret != OK, VOID_VALUE,
-+               "Failed to get policy profiles data frome %s", PSYS_POLICY_FILE_NAME);
-+}
-+
-+/**
-+ * This function will check which field that the parser parses to.
-+ *
-+ * The field is set to 2 types.
-+ * FIELD_INVALID FIELD_GRAPH
-+ *
-+ * \param profiles: the pointer of the PolicyParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void PolicyParser::checkField(PolicyParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s", __func__, name);
-+    if (strcmp(name, "PsysPolicyConfig") == 0) {
-+        profiles->mCurrentDataField = FIELD_INVALID;
-+        return;
-+    } else if (strcmp(name, "graph") == 0) {
-+        profiles->pCurrentConf = new PolicyConfig;
-+
-+        int idx = 0;
-+        while (atts[idx]) {
-+            const char* key = atts[idx];
-+            const char* val = atts[idx + 1];
-+            LOGXML("@%s, name:%s, atts[%d]:%s, atts[%d]:%s", __func__, name, idx, key, idx+1, val);
-+            if (strcmp(key, "id") == 0) {
-+                profiles->pCurrentConf->graphId = atoi(val);
-+            } else if (strcmp(key, "description") == 0) {
-+                profiles->pCurrentConf->policyDescription = val;
-+            }
-+            idx += 2;
-+        }
-+        profiles->mCurrentDataField = FIELD_GRAPH;
-+        return;
-+    }
-+
-+    LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]);
-+    return;
-+}
-+
-+void PolicyParser::handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts)
-+{
-+    int idx = 0;
-+    ExecutorPolicy policy;
-+
-+    while (atts[idx]) {
-+        const char *key = atts[idx];
-+        LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
-+        if (strcmp(key, "name") == 0) {
-+            policy.exeName = atts[idx + 1];
-+        } else if (strcmp(key, "pgs") == 0) {
-+            parseXmlConvertStrings(atts[idx + 1], policy.pgList, convertCharToString);
-+        } else if (strcmp(key, "op_modes") == 0) {
-+            parseXmlConvertStrings(atts[idx + 1], policy.opModeList, atoi);
-+        } else if (strcmp(key, "notify_policy") == 0) {
-+            int notifyPolicy = std::stoi(atts[idx + 1]);
-+            if (notifyPolicy >= 0 && notifyPolicy < POLICY_INVALID) {
-+                policy.notifyPolicy = (ExecutorNotifyPolicy)notifyPolicy;
-+            } else {
-+                LOGW("Invalid notify policy value: %d", notifyPolicy);
-+            }
-+        } else if (strcmp(key, "cyclic_feedback_routine") == 0) {
-+            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackRoutineList, atoi);
-+        } else if (strcmp(key, "cyclic_feedback_delay") == 0) {
-+            parseXmlConvertStrings(atts[idx + 1], policy.cyclicFeedbackDelayList, atoi);
-+        } else {
-+            LOGW("Invalid policy attribute: %s", key);
-+        }
-+        idx += 2;
-+    }
-+
-+    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
-+    profiles->pCurrentConf->pipeExecutorVec.push_back(policy);
-+}
-+
-+void PolicyParser::handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts)
-+{
-+    int idx = 0;
-+    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
-+    const char *key = atts[idx];
-+    if (strcmp(key, "pgs") == 0) {
-+        parseXmlConvertStrings(atts[idx + 1], profiles->pCurrentConf->exclusivePgs, convertCharToString);
-+    } else {
-+        LOGE("Invalid policy attribute %s in exclusive label.", key);
-+    }
-+}
-+
-+void PolicyParser::handleBundles(PolicyParser *profiles, const char *name, const char **atts)
-+{
-+    int idx = 0;
-+    LOGXML("%s: name: %s, value: %s", __func__, atts[idx], atts[idx + 1]);
-+    const char *key = atts[idx];
-+
-+    CheckError(strcmp(key, "executors") != 0, VOID_VALUE, "Invalid policy attribute %s in bundle label.", key);
-+
-+    // The structure of a bundle looks like: "proc:0,post:1" which uses ',' to split
-+    // different executors' names, and uses ':' to specify the executor's depth.
-+    std::vector<std::string> bundledExecutors;
-+    std::vector<int> depths;
-+    std::vector<std::string> executors = CameraUtils::splitString(atts[idx + 1], ',');
-+
-+    for (const auto & item : executors) {
-+        std::vector<std::string> executorDepth = CameraUtils::splitString(item.c_str(), ':');
-+        CheckError(executorDepth.size() != 2, VOID_VALUE, "Invalid executor-depth mapping.");
-+
-+        bundledExecutors.push_back(executorDepth[0]);
-+        depths.push_back(std::stoi(executorDepth[1]));
-+    }
-+
-+    ExecutorDepth executorDepth = {bundledExecutors, depths};
-+    profiles->pCurrentConf->bundledExecutorDepths.push_back(executorDepth);
-+}
-+
-+/**
-+ * This function will handle all the sensor related elements.
-+ *
-+ * It will be called in the function startElement
-+ *
-+ * \param profiles: the pointer of the CameraParser.
-+ * \param name: the element's name.
-+ * \param atts: the element's attribute.
-+ */
-+void PolicyParser::handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts)
-+{
-+    LOGXML("@%s, name:%s, atts[0]:%s", __func__, name, atts[0]);
-+    if (strcmp(name, "pipe_executor") == 0) {
-+        handlePipeExecutor(profiles, name, atts);
-+    } else if (strcmp(name, "exclusive") == 0) {
-+        handleExclusivePGs(profiles, name, atts);
-+    } else if (strcmp(name, "bundle") == 0) {
-+        handleBundles(profiles, name, atts);
-+    } else if (strcmp(name, "enableBundleInSdv") == 0) {
-+        profiles->pCurrentConf->enableBundleInSdv = (strcmp(atts[1], "true") == 0) ? true : false;
-+        LOGXML("%s: enableBundleInSdv: %s", __func__, atts[1]);
-+    }
-+}
-+
-+/**
-+ * the callback function of the libexpat for handling of one element start
-+ *
-+ * When it comes to the start of one element. This function will be called.
-+ *
-+ * \param userData: the pointer we set by the function XML_SetUserData.
-+ * \param name: the element's name.
-+ */
-+void PolicyParser::startParseElement(void *userData, const char *name, const char **atts)
-+{
-+    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
-+
-+    if (profiles->mCurrentDataField == FIELD_INVALID) {
-+        profiles->checkField(profiles, name, atts);
-+        return;
-+    }
-+
-+    switch (profiles->mCurrentDataField) {
-+        case FIELD_GRAPH:
-+            profiles->handlePolicyConfig(profiles, name, atts);
-+            break;
-+        default:
-+            LOGE("@%s, line:%d, go to default handling", __func__, __LINE__);
-+            break;
-+    }
-+}
-+
-+/**
-+ * the callback function of the libexpat for handling of one element end
-+ *
-+ * When it comes to the end of one element. This function will be called.
-+ *
-+ * \param userData: the pointer we set by the function XML_SetUserData.
-+ * \param name: the element's name.
-+ */
-+void PolicyParser::endParseElement(void *userData, const char *name)
-+{
-+    LOGXML("@%s %s", __func__, name);
-+
-+    PolicyParser *profiles = reinterpret_cast<PolicyParser*>(userData);
-+
-+    if (strcmp(name, "graph") == 0) {
-+        LOGXML("@%s, add policyConf, graphId: %d", __func__, profiles->pCurrentConf->graphId);
-+        profiles->mStaticCfg->mPolicyConfig.push_back(*(profiles->pCurrentConf));
-+        delete profiles->pCurrentConf;
-+        profiles->pCurrentConf = nullptr;
-+        profiles->mCurrentDataField = FIELD_INVALID;
-+    }
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
-new file mode 100644
-index 000000000000..ca5b13e26a83
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/PolicyParser.h
-@@ -0,0 +1,73 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+/**
-+ *\File PolicyParser.h
-+ *
-+ * parser for the policy xml configuration file
-+ *
-+ * This file calls the libexpat ditectly. The libexpat is one xml parser.
-+ * It will parse the camera configuration out firstly.
-+ * Then other module can call the methods of it to get the real configuration.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Utils.h"
-+
-+#include "CameraTypes.h"
-+#include "PlatformData.h"
-+#include "ParserBase.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class PolicyParser
-+ *
-+ * This class is used to parse the policy configuration file.
-+ * The configuration file is xml format.
-+ * This class will use the expat lib to do the xml parser.
-+ */
-+class PolicyParser : public ParserBase {
-+public:
-+    PolicyParser(PlatformData::StaticCfg *cfg);
-+    ~PolicyParser(){}
-+
-+    void startParseElement(void *userData, const char *name, const char **atts);
-+    void endParseElement(void *userData, const char *name);
-+
-+private:
-+    // prevent copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(PolicyParser);
-+
-+private:
-+    void checkField(PolicyParser *profiles, const char *name, const char **atts);
-+    void handlePolicyConfig(PolicyParser *profiles, const char *name, const char **atts);
-+    void handlePipeExecutor(PolicyParser *profiles, const char *name, const char **atts);
-+    void handleExclusivePGs(PolicyParser *profiles, const char *name, const char **atts);
-+    void handleBundles(PolicyParser *profiles, const char *name, const char **atts);
-+
-+private:
-+    PlatformData::StaticCfg *mStaticCfg;
-+
-+    enum DataField {
-+        FIELD_INVALID = 0,
-+        FIELD_GRAPH,
-+    } mCurrentDataField;
-+    PolicyConfig *pCurrentConf;
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
-new file mode 100644
-index 000000000000..cbf94dc3b4ca
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.cpp
-@@ -0,0 +1,338 @@
-+/*
-+ * Copyright (C) 2016-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "FormatUtils"
-+
-+#include <stdint.h>
-+#include <math.h>
-+#include <linux/v4l2-mediabus.h>
-+#include <linux/ipu-isys.h>
-+#include "ia_cipf/ia_cipf_types.h"
-+#include "FormatUtils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+using std::string;
-+using namespace icamera;
-+
-+/**
-+ * Utilities to query information about V4L2 types in graph config
-+ */
-+
-+namespace graphconfig {
-+namespace utils {
-+
-+enum FormatType {
-+    FORMAT_RAW,
-+    FORMAT_RAW_VEC,
-+    FORMAT_YUV,
-+    FORMAT_YUV_VEC,
-+    FORMAT_RGB,
-+    FORMAT_MBUS_BAYER,
-+    FORMAT_MBUS_YUV,
-+    FORMAT_JPEG,
-+    FORMAT_FOURCC
-+};
-+
-+struct FormatInfo {
-+    int32_t pixelCode;  // OS specific pixel code, in this case V4L2 or Media bus
-+    int32_t commonPixelCode;  // Common pixel code used by CIPF and GCSS in settings
-+    string fullName;
-+    string shortName;
-+    int32_t bpp;
-+    FormatType type;
-+};
-+
-+/**
-+ * gFormatMapping
-+ *
-+ * Table for mapping OS agnostic formats defined in CIPF and OS specific ones
-+ * (in this case V4L2, or media bus).
-+ * The table also helps provide textual representation and bits per pixel.
-+ * CIPF does not define most of the formats, only the ones it needs, that is why
-+ * most of the entries have 0 on the common pixel format.
-+ * Conversely there are some new formats introduce by CIPF that do not have
-+ * V4L2 representation.
-+ */
-+static const FormatInfo gFormatMapping[] = {
-+    { V4L2_PIX_FMT_SBGGR8, 0, "V4L2_PIX_FMT_SBGGR8", "BGGR8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG8, 0, "V4L2_PIX_FMT_SGBRG8", "GBRG8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB8, 0, "V4L2_PIX_FMT_SRGGB8", "RGGB8", 8, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SGRBG8, ia_cipf_frame_fourcc_grbg, "V4L2_PIX_FMT_SGRBG8", "GRBG8", 8, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SBGGR10, ia_cipf_frame_fourcc_bg10, "V4L2_PIX_FMT_SBGGR10", "BGGR10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG10, ia_cipf_frame_fourcc_gb10, "V4L2_PIX_FMT_SGBRG10", "GBRG10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_ba10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB10, ia_cipf_frame_fourcc_rg10, "V4L2_PIX_FMT_SRGGB10", "RGGB10", 16, FORMAT_RAW },
-+    // align to xos definition and css format: IA_CSS_DATA_FORMAT_BAYER_GRBG
-+    // it's different with ia_cipf_frame_fourcc_ba10 which align to css format:
-+    // IA_CSS_DATA_FORMAT_RAW
-+    { V4L2_PIX_FMT_SGRBG10, ia_cipf_frame_fourcc_gr10, "V4L2_PIX_FMT_SGRBG10", "GRBG10", 16, FORMAT_RAW },
-+    { 0, css_fourcc_grbg_12_li, "css_fourcc_grbg_12_li", "CSL6", 15, FORMAT_RAW},
-+    { V4L2_PIX_FMT_SGRBG12, ia_cipf_frame_fourcc_ba12, "V4L2_PIX_FMT_SGRBG12", "GRBG12", 16, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_NV12, ia_cipf_frame_fourcc_nv12, "V4L2_PIX_FMT_NV12", "NV12", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_NV21, ia_cipf_frame_fourcc_nv21, "V4L2_PIX_FMT_NV21", "NV21", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_UYVY, ia_cipf_frame_fourcc_uyvy, "V4L2_PIX_FMT_UYVY", "UYVY", 16, FORMAT_YUV },
-+
-+    { V4L2_PIX_FMT_YUV420, ia_cipf_frame_fourcc_iyuv, "V4L2_PIX_FMT_YUV420", "YUV420", 12, FORMAT_YUV },
-+    // Packed formats No V4L2 equivalent exists
-+    // Normal YUV420 planar but with each sample of 12bits stored in 16bits
-+    { 0, ia_cipf_frame_fourcc_i420, "YUV420-12-16p", "YUV420", 24, FORMAT_YUV },
-+    // Normal YUV420 planar but with each sample of 12-bit DMA-packed
-+    // (42 pixels and 8 bits of padding in a 64-byte DMA word)
-+    { 0, css_fourcc_yuv420_12_p64, "YUV420-12-64p", "YUV420", 18, FORMAT_YUV },
-+    //  Normal YUV420 planar but with each sample of 10-bit DMA-packed
-+    // (51 pixels and 2 bits of padding in a 64-byte DMA word)
-+    { 0, css_fourcc_yuv420_10_p64, "YUV420-10-64p", "YUV420", 15, FORMAT_YUV },
-+
-+    { V4L2_MBUS_FMT_SBGGR10_1X10, ia_cipf_frame_fourcc_bg10, "V4L2_MBUS_FMT_SBGGR10_1X10", "SBGGR10_1X10", 10, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGBRG10_1X10, ia_cipf_frame_fourcc_gb10, "V4L2_MBUS_FMT_SGBRG10_1X10", "SGBRG10_1X10", 10, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGRBG10_1X10, ia_cipf_frame_fourcc_ba10, "V4L2_MBUS_FMT_SGRBG10_1X10", "SGRBG10_1X10", 10, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SRGGB10_1X10, ia_cipf_frame_fourcc_rg10, "V4L2_MBUS_FMT_SRGGB10_1X10", "SRGGB10_1X10", 10, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_UYVY8_1X16, ia_cipf_frame_fourcc_uyvy, "V4L2_MBUS_FMT_UYVY8_1X16", "UYVY8_1X16", 16, FORMAT_MBUS_YUV },
-+    { V4L2_PIX_FMT_SBGGR12, 0, "V4L2_PIX_FMT_SBGGR12", "BGGR12", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG12, 0, "V4L2_PIX_FMT_SGBRG12", "GBRG12", 16, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB12, 0, "V4L2_PIX_FMT_SRGGB12", "RGGB12", 16, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_SBGGR10P, 0, "V4L2_PIX_FMT_SBGGR10P", "BGGR10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGBRG10P, 0, "V4L2_PIX_FMT_SGBRG10P", "GBRG10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SGRBG10P, 0, "V4L2_PIX_FMT_SGRBG10P", "GRBG10P", 10, FORMAT_RAW },
-+    { V4L2_PIX_FMT_SRGGB10P, 0, "V4L2_PIX_FMT_SRGGB10P", "RGGB10P", 10, FORMAT_RAW },
-+
-+    { V4L2_PIX_FMT_NV16, 0, "V4L2_PIX_FMT_NV16", "NV16", 16, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YUYV, 0, "V4L2_PIX_FMT_YUYV", "YUYV", 16, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YVU420, 0, "V4L2_PIX_FMT_YVU420", "YVU420", 12, FORMAT_YUV },
-+    { V4L2_PIX_FMT_YUV422P, 0, "V4L2_PIX_FMT_YUV422P", "YUV422P", 16, FORMAT_YUV },
-+
-+    { V4L2_PIX_FMT_BGR24, 0, "V4L2_PIX_FMT_BGR24", "BGR24", 24, FORMAT_RGB },
-+    { V4L2_PIX_FMT_BGR32, 0, "V4L2_PIX_FMT_BGR32", "BGR32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_XBGR32, 0, "V4L2_PIX_FMT_XBGR32", "XBGR32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_XRGB32, 0, "V4L2_PIX_FMT_XRGB32", "XRGB32", 32, FORMAT_RGB },
-+    { V4L2_PIX_FMT_RGB565, 0, "V4L2_PIX_FMT_RGB565", "RGB565", 16, FORMAT_RGB },
-+
-+    { V4L2_PIX_FMT_JPEG, 0, "V4L2_PIX_FMT_JPEG", "JPEG", 0, FORMAT_JPEG },
-+
-+    { V4L2_MBUS_FMT_SBGGR12_1X12, 0, "V4L2_MBUS_FMT_SBGGR12_1X12", "SBGGR12_1X12", 12, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGBRG12_1X12, 0, "V4L2_MBUS_FMT_SGBRG12_1X12", "SGBRG12_1X12", 12, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGRBG12_1X12, 0, "V4L2_MBUS_FMT_SGRBG12_1X12", "SGRBG12_1X12", 12, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SRGGB12_1X12, 0, "V4L2_MBUS_FMT_SRGGB12_1X12", "SRGGB12_1X12", 12, FORMAT_MBUS_BAYER },
-+
-+    { V4L2_MBUS_FMT_SBGGR8_1X8, 0, "V4L2_MBUS_FMT_SBGGR8_1X8", "SBGGR8_1X8", 8, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGBRG8_1X8, 0, "V4L2_MBUS_FMT_SGBRG8_1X8", "SGBRG8_1X8", 8, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SGRBG8_1X8, 0, "V4L2_MBUS_FMT_SGRBG8_1X8", "SGRBG8_1X8", 8, FORMAT_MBUS_BAYER },
-+    { V4L2_MBUS_FMT_SRGGB8_1X8, 0, "V4L2_MBUS_FMT_SRGGB8_1X8", "SRGGB8_1X8", 8, FORMAT_MBUS_BAYER },
-+
-+    { V4L2_MBUS_FMT_YUYV8_1X16, 0, "V4L2_MBUS_FMT_YUYV8_1X16", "YUYV8_1X16", 16, FORMAT_MBUS_YUV },
-+    { V4L2_MBUS_FMT_UYVY8_2X8, 0, "V4L2_MBUS_FMT_UYVY8_2X8","UYVY8_2X8", 8, FORMAT_MBUS_YUV},
-+
-+};
-+
-+const string pixelCode2String(int32_t code)
-+{
-+
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].pixelCode == code) {
-+            return gFormatMapping[i].fullName;
-+        }
-+    }
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].commonPixelCode == code) {
-+            return gFormatMapping[i].fullName;
-+        }
-+    }
-+
-+    LOGE("Invalid Pixel Format: 0x%x", code);
-+    return "INVALID FORMAT";
-+}
-+
-+int32_t string2PixelCode(const string &code)
-+{
-+    if (code.empty()) {
-+        LOGE("Invalid Pixel Format: %s", code.c_str());
-+        return -1;
-+    }
-+
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].fullName == code) {
-+            return gFormatMapping[i].pixelCode;
-+        }
-+    }
-+
-+    LOGE("Invalid Pixel Format: %s", code.c_str());
-+    return -1;
-+}
-+
-+const string format2string(int32_t format)
-+{
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            return gFormatMapping[i].shortName;
-+        }
-+    }
-+
-+    LOGW("Not in our format list :%x", format);
-+    return "INVALID-FORMAT";
-+}
-+
-+bool isPlanarFormat(int32_t format)
-+{
-+    return (format == V4L2_PIX_FMT_NV12 ||
-+            format == V4L2_PIX_FMT_NV21 ||
-+            format == V4L2_PIX_FMT_YUV420 ||
-+            format == V4L2_PIX_FMT_YVU420 ||
-+            format == V4L2_PIX_FMT_YUV422P);
-+}
-+
-+bool isRaw(int32_t format)
-+{
-+    int32_t size = ARRAY_SIZE(gFormatMapping);
-+    for (int32_t i = 0; i < size; i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            // Both normal raw and vector raw treated as raw here.
-+            return gFormatMapping[i].type == FORMAT_RAW_VEC || gFormatMapping[i].type == FORMAT_RAW;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+bool isVectorizedRaw(int32_t format)
-+{
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            return gFormatMapping[i].type == FORMAT_RAW_VEC;
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+/**
-+ * Calculate bytes per line(bpl) based on fourcc format.
-+ *
-+ * \param[in] format 4CC code in OS specific format
-+ * \return bpl bytes per line
-+ */
-+int32_t getBpl(int32_t format, int32_t width)
-+{
-+    int32_t bpl = 0;
-+    switch (format) {
-+        case css_fourcc_yuv420_12_p64:      // YUV
-+            /*
-+             * Align based on UV planes, which have half the strides compared to y plane.
-+             * 42 whole pixels in each 64 byte word, rest 8 bits per word is padding.
-+             * The total bpl is double the UV-plane strides.
-+             */
-+            bpl = ceil(((double)width / 2) / 42) * 64 * 2;
-+            break;
-+        case css_fourcc_yyuv420_v32:        // Y032
-+            bpl = width * 6;
-+            break;
-+        case css_fourcc_grbg_12_li:            // CSL6
-+            bpl = width * 4;
-+            break;
-+        case css_fourcc_grbg_10_v32:        // BV0G
-+        case ia_cipf_frame_fourcc_i420:     // V420
-+        case css_fourcc_raw_interleaved:    // BV0K
-+        case ia_cipf_frame_fourcc_ba10:     // BA10
-+        case ia_cipf_frame_fourcc_gr10:     // GR10
-+        case ia_cipf_frame_fourcc_ba12:
-+        case css_fourcc_p010:               //YUV 10bit serial
-+        case css_fourcc_p010_lsb:
-+        case css_fourcc_p010_msb_tile_y:
-+        case css_fourcc_p010_msb_cile_y:
-+            bpl = width * 2;
-+            break;
-+        case ia_cipf_frame_fourcc_nv12:     // NV12
-+        case ia_cipf_frame_fourcc_grbg:     // GRBG
-+            bpl = width;
-+            break;
-+        default:
-+            bpl = width;
-+            LOGW("bpl defaulting to width for format:%s", CameraUtils::format2string(format).c_str());
-+            break;
-+    }
-+    return bpl;
-+}
-+
-+/**
-+ *  Retrieve the bits per pixel  from the OS specific pixel code.
-+ *  This is ususally used for buffer allocation calculations
-+ *
-+ *  \param [in] format 4CC code in OS specific format
-+ *  \return bits per pixel
-+ */
-+int32_t getBpp(int32_t format)
-+{
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].pixelCode == format) {
-+            return gFormatMapping[i].bpp;
-+        }
-+    }
-+
-+    LOGE("There is no bpp supplied for format %s",
-+            pixelCode2String(format).c_str());
-+    return -1;
-+}
-+
-+/**
-+ *  Retrieve the bits per pixel from the common pixel code format (CIPF)
-+ *  This is usually used for buffer allocation calculations
-+ *
-+ *  \param [in] format 4CC code in Common format
-+ *  \return bits per pixel
-+ */
-+int32_t getBppFromCommon(int32_t format)
-+{
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].commonPixelCode == format) {
-+            return gFormatMapping[i].bpp;
-+        }
-+    }
-+
-+    LOGE("There is no bpp supplied for format %s",
-+            pixelCode2String(format).c_str());
-+    return -1;
-+}
-+
-+int32_t getNumOfPlanes(int32_t format)
-+{
-+    switch(format) {
-+        case V4L2_PIX_FMT_NV12:
-+        case V4L2_PIX_FMT_SGRBG8:
-+        case V4L2_FMT_IPU_ISYS_META:
-+            return 1;
-+        //Add more when needed...
-+        default:
-+            return 1;
-+    }
-+}
-+
-+int32_t getV4L2Format(const int32_t commonPixelFormat)
-+{
-+    for (size_t i = 0; i < ARRAY_SIZE(gFormatMapping); i++) {
-+        if (gFormatMapping[i].commonPixelCode == commonPixelFormat)
-+            return gFormatMapping[i].pixelCode;
-+    }
-+
-+    LOGE("Failed to find any V4L2 format with format %s",
-+            pixelCode2String(commonPixelFormat).c_str());
-+    return -1;
-+}
-+
-+} // namespace utils
-+} // namespace graphconfig
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
-new file mode 100644
-index 000000000000..d6f3a03ad9dd
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/FormatUtils.h
-@@ -0,0 +1,34 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <string>
-+
-+namespace graphconfig {
-+namespace utils {
-+
-+int32_t getV4L2Format(const int32_t commonPixelFormat);
-+const std::string format2string(int32_t format);
-+bool isPlanarFormat(int32_t v4l2Format);
-+bool isRaw(int32_t format);
-+bool isVectorizedRaw(int32_t format);
-+int32_t getBpl(int32_t format, int32_t width);
-+int32_t getBpp(int32_t format);
-+int32_t getBppFromCommon(int32_t format);
-+
-+}  // namespace utils
-+}  // namespace graphconfig
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
-new file mode 100644
-index 000000000000..c7249b41ffb6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
-@@ -0,0 +1,192 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "GraphConfig"
-+
-+#include "src/platformdata/gc/GraphConfig.h"
-+
-+#include "PlatformData.h"
-+#include "iutils/CameraLog.h"
-+
-+using std::vector;
-+using std::map;
-+using std::string;
-+
-+namespace icamera {
-+
-+GraphConfig::GraphConfig(int32_t camId, ConfigMode mode) :
-+        mCameraId(camId) {
-+    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl(camId, mode,
-+                                                        PlatformData::getGraphSettingsType(camId)));
-+}
-+
-+GraphConfig::GraphConfig() {
-+    mGraphConfigImpl = std::unique_ptr<GraphConfigImpl>(new GraphConfigImpl());
-+}
-+
-+GraphConfig::~GraphConfig() {
-+}
-+
-+void GraphConfig::addCustomKeyMap() {
-+    mGraphConfigImpl->addCustomKeyMap();
-+}
-+
-+status_t GraphConfig::parse(int cameraId, const char *settingsXmlFile) {
-+    string graphDescFile = PlatformData::getGraphDescFilePath();
-+    string settingsFile = PlatformData::getGraphSettingFilePath() + settingsXmlFile;
-+    return mGraphConfigImpl->parse(cameraId, graphDescFile.c_str(), settingsFile.c_str());
-+}
-+
-+void GraphConfig::releaseGraphNodes() {
-+    mGraphConfigImpl->releaseGraphNodes();
-+}
-+
-+status_t GraphConfig::configStreams(const vector<HalStream*> &activeStreams) {
-+    LOG1("@%s", __func__);
-+
-+    int ret = mGraphConfigImpl->configStreams(activeStreams);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to config streams", __func__);
-+
-+    ret = mGraphConfigImpl->getGraphConfigData(&mGraphData);
-+    CheckError(ret != OK, UNKNOWN_ERROR, "%s, Failed to get the static graph config data", __func__);
-+
-+    return OK;
-+}
-+
-+status_t GraphConfig::getGdcKernelSetting(uint32_t& kernelId, camera_resolution_t& resolution) {
-+    LOG1("@%s", __func__);
-+    if ((mGraphData.gdcReso.width == 0) || (mGraphData.gdcReso.height == 0)) {
-+        LOGW("%s, Failed to get gdc resolutione: width: %d, height: %d ", __func__,
-+            mGraphData.gdcReso.width, mGraphData.gdcReso.height);
-+        return NO_ENTRY;
-+    }
-+
-+    kernelId = mGraphData.gdcKernelId;
-+    resolution = mGraphData.gdcReso;
-+
-+    return OK;
-+}
-+
-+status_t GraphConfig::graphGetStreamIds(vector<int32_t> &streamIds) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.streamIds.empty(), UNKNOWN_ERROR, "%s, The streamIds vector is empty", __func__);
-+
-+    streamIds = mGraphData.streamIds;
-+    return OK;
-+}
-+
-+int GraphConfig::getStreamIdByPgName(string pgName) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
-+
-+    for (auto &info : mGraphData.pgInfo) {
-+        if (info.pgName == pgName) {
-+            return info.streamId;
-+        }
-+    }
-+
-+    LOGE("%s, Failed to get stream id for pgName: %s", __func__, pgName.c_str());
-+    return -1;
-+}
-+
-+int GraphConfig::getPgIdByPgName(string pgName) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.pgInfo.empty(), -1, "%s, The pgInfo vector is empty", __func__);
-+
-+    for (auto &info : mGraphData.pgInfo) {
-+        if (info.pgName == pgName) {
-+            return info.pgId;
-+        }
-+    }
-+
-+    LOGE("%s, Failed to get pg id for pgName: %s", __func__, pgName.c_str());
-+    return -1;
-+}
-+
-+ia_isp_bxt_program_group* GraphConfig::getProgramGroup(int32_t streamId) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.programGroup.empty(), nullptr, "%s, The programGroup vector is empty", __func__);
-+
-+    for (auto &info : mGraphData.programGroup) {
-+        if (info.streamId == streamId && info.pgPtr != nullptr) {
-+            return info.pgPtr;
-+        }
-+    }
-+
-+    LOGE("%s, Failed to get programGroup for streamId", __func__, streamId);
-+    return nullptr;
-+}
-+
-+status_t GraphConfig::getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) {
-+    LOG1("@%s", __func__);
-+    for (auto &info : mGraphData.mbrInfo) {
-+        if (streamId == info.streamId) {
-+            data = &info.data;
-+            return OK;
-+        }
-+    }
-+
-+    return BAD_VALUE;
-+}
-+
-+status_t GraphConfig::getPgNames(vector<string>* pgNames) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.pgNames.empty(), UNKNOWN_ERROR, "%s, The pgNames vector is empty", __func__);
-+
-+    *pgNames = mGraphData.pgNames;
-+    return OK;
-+}
-+
-+status_t GraphConfig::getPgRbmValue(string pgName, IGraphType::StageAttr *stageAttr) {
-+    LOG1("@%s", __func__);
-+    CheckError(mGraphData.pgInfo.empty(), UNKNOWN_ERROR, "%s, The pgInfo vector is empty", __func__);
-+
-+    for (auto &info : mGraphData.pgInfo) {
-+        if (info.pgName == pgName && info.rbmValue.rbm != nullptr) {
-+            *stageAttr = info.rbmValue;
-+            return OK;
-+        }
-+    }
-+
-+    return BAD_VALUE;
-+}
-+
-+int GraphConfig::getProgramGroup(string pgName, ia_isp_bxt_program_group* programGroupForPG) {
-+    LOG1("@%s", __func__);
-+    return mGraphConfigImpl->getProgramGroup(pgName, programGroupForPG);
-+}
-+
-+status_t GraphConfig::pipelineGetConnections(const vector<string>& pgList,
-+                                             vector<IGraphType::PipelineConnection> *confVector) {
-+    LOG1("@%s", __func__);
-+    CheckError(!confVector, UNKNOWN_ERROR, "%s, The confVector is nullptr", __func__);
-+
-+    status_t ret;
-+    std::vector<IGraphType::ScalerInfo> scalerInfo;
-+
-+    ret = mGraphConfigImpl->pipelineGetConnections(pgList, &scalerInfo, confVector);
-+    CheckError(ret != OK, ret, "%s, Failed to pipelineGetConnections", __func__);
-+
-+    PlatformData::setScalerInfo(mCameraId, scalerInfo);
-+    return OK;
-+}
-+
-+status_t GraphConfig::getPgIdForKernel(const uint32_t streamId, const int32_t kernelId, int32_t *pgId) {
-+    LOG1("@%s", __func__);
-+    CheckError(!pgId, UNKNOWN_ERROR, "%s, the pgId is nullptr", __func__);
-+    return mGraphConfigImpl->getPgIdForKernel(streamId, kernelId, pgId);
-+}
-+}  // icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
-new file mode 100644
-index 000000000000..03fd276a30a2
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
-@@ -0,0 +1,87 @@
-+/*
-+ * Copyright (C) 2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <memory>
-+#include <utility>
-+#include <vector>
-+#include "HalStream.h"
-+#include "iutils/Utils.h"
-+#include "iutils/Errors.h"
-+
-+#ifdef ENABLE_SANDBOXING
-+#include "modules/sandboxing/client/GraphConfigImpl.h"
-+#else
-+#include "modules/algowrapper/graph/GraphConfigImpl.h"
-+#endif
-+
-+namespace icamera {
-+
-+/**
-+ * \class GraphConfig
-+ *
-+ * \brief This is a wrapper of GraphConfigImpl class and it provides the
-+ * public APIs to get the graph config data.
-+ *
-+ * It maintains one static area and GraphConfigImpl object, user get graph
-+ * config data from the local structure or GraphConfigImpl object through
-+ * the public APIs
-+ */
-+class GraphConfig : public IGraphConfig {
-+public:
-+    GraphConfig();
-+    GraphConfig(int32_t camId, ConfigMode mode);
-+    virtual ~GraphConfig();
-+
-+    void addCustomKeyMap();
-+    status_t parse(int cameraId, const char *settingsXmlFile);
-+    void releaseGraphNodes();
-+
-+    // These public methods called by GraphConfigManager
-+    status_t configStreams(const std::vector<HalStream*> &activeStreams);
-+    int getSelectedMcId() { return mGraphData.mcId; }
-+    virtual int getGraphId(void) { return mGraphData.graphId; }
-+    virtual void getCSIOutputResolution(camera_resolution_t &reso) { reso = mGraphData.csiReso; }
-+
-+    virtual status_t getGdcKernelSetting(uint32_t& kernelId, camera_resolution_t& resolution);
-+    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds);
-+    virtual int getStreamIdByPgName(std::string pgName);
-+    virtual int getPgIdByPgName(std::string pgName);
-+    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId);
-+    virtual status_t getPgRbmValue(std::string pgName, IGraphType::StageAttr *stageAttr);
-+    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data);
-+    virtual status_t getPgNames(std::vector<std::string>* pgNames);
-+
-+    virtual int getProgramGroup(std::string pgName,
-+                                ia_isp_bxt_program_group* programGroupForPG);
-+    virtual status_t getPgIdForKernel(const uint32_t streamId,
-+                                      const int32_t kernelId, int32_t *pgId);
-+
-+    virtual status_t pipelineGetConnections(
-+                         const std::vector<std::string> &pgList,
-+                         std::vector<IGraphType::PipelineConnection> *confVector);
-+private:
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfig);
-+
-+private:
-+    int32_t mCameraId;
-+    IGraphType::GraphConfigData mGraphData;
-+    std::unique_ptr<GraphConfigImpl> mGraphConfigImpl;
-+};
-+
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
-new file mode 100644
-index 000000000000..3b792e0f8600
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.cpp
-@@ -0,0 +1,179 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "GraphConfigManager"
-+
-+#include "src/platformdata/gc/GraphConfigManager.h"
-+
-+#include "iutils/Utils.h"
-+#include "iutils/CameraLog.h"
-+#include "PlatformData.h"
-+
-+using std::vector;
-+using std::map;
-+
-+namespace icamera {
-+GraphConfigManager::GraphConfigManager(int32_t cameraId) :
-+    mGcConfigured(false),
-+    mCameraId(cameraId),
-+    mMcId(-1)
-+{
-+}
-+
-+GraphConfigManager::~GraphConfigManager()
-+{
-+    mGraphConfigMap.clear();
-+    mGcConfigured = false;
-+    releaseHalStream();
-+}
-+
-+void GraphConfigManager::releaseHalStream()
-+{
-+    for(auto &halStream : mHalStreamVec) {
-+        delete halStream;
-+    }
-+    mHalStreamVec.clear();
-+}
-+
-+/*
-+ * Get the useCase from the stream and operationMode.
-+ */
-+StreamUseCase GraphConfigManager::getUseCaseFromStream(ConfigMode configMode, const stream_t &stream)
-+{
-+    if (configMode == CAMERA_STREAM_CONFIGURATION_MODE_STILL_CAPTURE ||
-+            stream.usage == CAMERA_STREAM_STILL_CAPTURE)
-+        return USE_CASE_STILL_CAPTURE;
-+
-+    return USE_CASE_PREVIEW;
-+}
-+
-+/**
-+ * Initialize the state of the GraphConfigManager after parsing the stream
-+ * configuration.
-+ * Perform the first level query to find a subset of settings that fulfill the
-+ * constrains from the stream configuration.
-+ *
-+ * \param[in] streamList: all the streams info.
-+ */
-+status_t GraphConfigManager::configStreams(const stream_config_t *streamList)
-+{
-+    HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL1);
-+    CheckError(!streamList, BAD_VALUE, "%s: Null streamList configured", __func__);
-+
-+    vector <ConfigMode> configModes;
-+    int ret = PlatformData::getConfigModesByOperationMode(mCameraId, streamList->operation_mode, configModes);
-+    CheckError(ret != OK, ret, "%s, get ConfigMode failed %d", __func__, ret);
-+
-+    // Convert the stream_t to HalStream
-+    // Use the stream list with descending order to find graph settings.
-+    releaseHalStream();
-+    for (int i = 0; i < streamList->num_streams; i++) {
-+        // Don't handle input stream or opaque RAW stream when configure graph configuration.
-+        if (streamList->streams[i].streamType == CAMERA_STREAM_INPUT ||
-+            streamList->streams[i].usage == CAMERA_STREAM_OPAQUE_RAW) continue;
-+
-+        bool stored = false;
-+        StreamUseCase useCase = getUseCaseFromStream(configModes[0], streamList->streams[i]);
-+        streamProps props = {
-+            static_cast<uint32_t>(streamList->streams[i].width),
-+            static_cast<uint32_t>(streamList->streams[i].height),
-+            streamList->streams[i].format,
-+            streamList->streams[i].id,
-+            useCase,
-+        };
-+        HalStream* halStream = new HalStream(props, static_cast<void*>(&streamList->streams[i]));
-+        CheckError(!halStream, UNKNOWN_ERROR, "Failed to create hal stream");
-+
-+        for (size_t j = 0; j < mHalStreamVec.size(); j++) {
-+            if (halStream->width() * halStream->height() > mHalStreamVec[j]->width() * mHalStreamVec[j]->height()) {
-+                stored = true;
-+                mHalStreamVec.insert((mHalStreamVec.begin() + j), halStream);
-+                break;
-+            }
-+        }
-+        if (!stored)
-+            mHalStreamVec.push_back(halStream);
-+    }
-+
-+    //debug
-+    dumpStreamConfig();
-+    mGraphConfigMap.clear();
-+    mMcId = -1;
-+
-+    for (auto mode : configModes) {
-+        LOG1("Mapping the operationMode %d to ConfigMode %d", streamList->operation_mode, mode);
-+
-+        std::shared_ptr<GraphConfig> graphConfig = std::make_shared<GraphConfig>(mCameraId, mode);
-+        ret = graphConfig->configStreams(mHalStreamVec);
-+        CheckWarning(ret != OK, ret, "%s, Failed to configure graph: real ConfigMode %x", __func__, mode);
-+
-+        int id = graphConfig->getSelectedMcId();
-+        CheckError((id != -1 && mMcId != -1 && mMcId != id), UNKNOWN_ERROR,
-+                    "Not support two different MC ID at same time:(%d/%d)", mMcId, id);
-+        mMcId = id;
-+        LOGG("%s: Add graph setting for op_mode %d", __func__, mode);
-+        mGraphConfigMap[mode] = graphConfig;
-+    }
-+
-+    mGcConfigured = true;
-+    return OK;
-+}
-+
-+std::shared_ptr<IGraphConfig> GraphConfigManager::getGraphConfig(ConfigMode configMode)
-+{
-+    for (auto& gc : mGraphConfigMap) {
-+        if (gc.first == configMode) {
-+            LOGG("%s: found graph config for mode %d", __func__, configMode);
-+            return gc.second;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+void GraphConfigManager::dumpStreamConfig()
-+{
-+    for (size_t i = 0; i < mHalStreamVec.size(); i++) {
-+        LOG1("stream[%zu] %dx%d, fmt %s", i,
-+             mHalStreamVec[i]->width(), mHalStreamVec[i]->height(),
-+             CameraUtils::pixelCode2String(mHalStreamVec[i]->format()));
-+    }
-+}
-+
-+map<int, IGraphConfigManager*> IGraphConfigManager::sInstances;
-+Mutex IGraphConfigManager::sLock;
-+
-+IGraphConfigManager* IGraphConfigManager::getInstance(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        return sInstances[cameraId];
-+    }
-+
-+    sInstances[cameraId] = new GraphConfigManager(cameraId);
-+    return sInstances[cameraId];
-+}
-+
-+void IGraphConfigManager::releaseInstance(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        IGraphConfigManager* gcManager = sInstances[cameraId];
-+        sInstances.erase(cameraId);
-+        delete gcManager;
-+    }
-+}
-+}  // icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
-new file mode 100644
-index 000000000000..68b5066ed200
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfigManager.h
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <gcss.h>
-+
-+#include <memory>
-+#include <utility>
-+#include <vector>
-+
-+#include "iutils/Errors.h"
-+#include "iutils/Thread.h"
-+#include "GraphConfig.h"
-+#include "IGraphConfigManager.h"
-+
-+namespace icamera {
-+
-+/**
-+ * \class GraphConfigManager
-+ *
-+ * Class to wrap over parsing and executing queries on graph settings.
-+ * GraphConfigManager owns the interface towards GCSS and provides convenience
-+ * for HAL to execute queries and it generates GraphConfig objects as results.
-+ *
-+ * GraphConfigManager also provides static method for parsing graph descriptor
-+ * and graph settings from XML files and filtering that data based on sensor.
-+ * The \class GraphConfigmanager::Nodes object is stored in CameraCapInfo and
-+ * is used when instantiating GCM.
-+ *
-+ * At camera open, GraphConfigManager object is created.
-+ * At stream config time the state of GraphConfig manager changes with the
-+ * result of the first query. This is the possible subset of graph settings that
-+ * can fulfill the requirements of requested streams.
-+ * At this point, there may be more than one options, but
-+ * GCM can always return some default settings.
-+ *
-+ * Per each request, GraphConfigManager creates GraphConfig objects based
-+ * on request content. These objects are owned by GCM in a pool, and passed
-+ * around HAL via shared pointers.
-+ */
-+class GraphConfigManager: public IGraphConfigManager
-+{
-+public:
-+    explicit GraphConfigManager(int32_t cameraId);
-+    virtual ~GraphConfigManager();
-+
-+    // Public APIs in IGraphConfigManager
-+    virtual status_t configStreams(const stream_config_t *streamList);
-+    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode);
-+    virtual int getSelectedMcId() { LOGG("%s: %d", __func__, mMcId); return mMcId; }
-+    virtual bool isGcConfigured(void) { LOGG("%s: %d", __func__, mGcConfigured); return mGcConfigured; }
-+
-+private:
-+    // Disable copy constructor and assignment operator
-+    DISALLOW_COPY_AND_ASSIGN(GraphConfigManager);
-+
-+    StreamUseCase getUseCaseFromStream(ConfigMode configMode, const stream_t &stream);
-+    void releaseHalStream();
-+
-+    // Debuging helpers
-+    void dumpStreamConfig();
-+private:
-+
-+    bool mGcConfigured;
-+    int32_t mCameraId;
-+    std::map<ConfigMode, std::shared_ptr<GraphConfig> > mGraphConfigMap;
-+    std::vector<HalStream*> mHalStreamVec;
-+    int mMcId;
-+};
-+
-+} // icamera
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
-new file mode 100644
-index 000000000000..7f822e6b20c6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.cpp
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2018-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#define LOG_TAG "GraphUtils"
-+
-+#include "GraphUtils.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Utils.h"
-+
-+#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
-+#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
-+#define psys_2600_term_idx_from_uid(uid) ((uid & 0x0000FFFF) - 1)
-+
-+using namespace std;
-+
-+namespace icamera {
-+
-+void GraphUtils::dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
-+        return;
-+    }
-+
-+    LOGG("Graph connections:");
-+    for (auto& conn : connections) {
-+
-+        LOGG("Format settings: enabled === %d ===, terminalIdx %d, width %d, height %d, fourcc %s, bpl %d, bpp %d",
-+                    conn.portFormatSettings.enabled,
-+                    conn.portFormatSettings.terminalId,
-+                    conn.portFormatSettings.width, conn.portFormatSettings.height,
-+                    CameraUtils::fourcc2String(conn.portFormatSettings.fourcc).c_str(),
-+                    conn.portFormatSettings.bpl, conn.portFormatSettings.bpp);
-+
-+        LOGG("Connection config: sourceStage %d(%d), sourceTerminal %d(%d), sourceIteration %d, " \
-+                    "sinkStage %d(%d), sinkTerminal %d(%d), sinkIteration %d, connectionType %d",
-+                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSourceStage),
-+                    conn.connectionConfig.mSourceStage,
-+                    conn.connectionConfig.mSourceTerminal - conn.connectionConfig.mSourceStage -1,
-+                    conn.connectionConfig.mSourceTerminal,
-+                    conn.connectionConfig.mSourceIteration,
-+                    psys_2600_pg_id_from_uid(conn.connectionConfig.mSinkStage),
-+                    conn.connectionConfig.mSinkStage,
-+                    conn.connectionConfig.mSinkTerminal - conn.connectionConfig.mSinkStage -1,
-+                    conn.connectionConfig.mSinkTerminal,
-+                    conn.connectionConfig.mSinkIteration,
-+                    conn.connectionConfig.mConnectionType);
-+
-+        LOGG("Edge port: %d", conn.hasEdgePort);
-+    }
-+
-+    return;
-+}
-+
-+void GraphUtils::dumpKernelInfo(const ia_isp_bxt_program_group& programGroup)
-+{
-+    if (!Log::isDebugLevelEnable(CAMERA_DEBUG_LOG_GRAPH)) {
-+        return;
-+    }
-+
-+    LOGG("Kernel info: count %d, opMode %d", programGroup.kernel_count, programGroup.operation_mode);
-+
-+    for(unsigned int i = 0; i< programGroup.kernel_count; i++) {
-+
-+        const ia_isp_bxt_run_kernels_t& curRunKernel = programGroup.run_kernels[i];
-+
-+        LOGG("uid %d, streamId: %d, enabled %d", curRunKernel.kernel_uuid, curRunKernel.stream_id,
-+                    curRunKernel.enable);
-+
-+        if (programGroup.run_kernels[i].resolution_info) {
-+            LOGG("Resolution: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
-+                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
-+                       curRunKernel.resolution_info->input_width, curRunKernel.resolution_info->input_height,
-+                       curRunKernel.resolution_info->input_crop.left, curRunKernel.resolution_info->input_crop.top,
-+                       curRunKernel.resolution_info->input_crop.right, curRunKernel.resolution_info->input_crop.bottom,
-+                       curRunKernel.resolution_info->output_width, curRunKernel.resolution_info->output_height,
-+                       curRunKernel.resolution_info->output_crop.left, curRunKernel.resolution_info->output_crop.top,
-+                       curRunKernel.resolution_info->output_crop.right, curRunKernel.resolution_info->output_crop.bottom);
-+        }
-+
-+        if (programGroup.run_kernels[i].resolution_history) {
-+            LOGG("Resolution history: inputWidth %d, inputHeight %d, inputCrop %d %d %d %d," \
-+                       "outputWidth %d, outputHeight %d, outputCrop %d %d %d %d,",
-+                       curRunKernel.resolution_history->input_width, curRunKernel.resolution_history->input_height,
-+                       curRunKernel.resolution_history->input_crop.left, curRunKernel.resolution_history->input_crop.top,
-+                       curRunKernel.resolution_history->input_crop.right, curRunKernel.resolution_history->input_crop.bottom,
-+                       curRunKernel.resolution_history->output_width, curRunKernel.resolution_history->output_height,
-+                       curRunKernel.resolution_history->output_crop.left, curRunKernel.resolution_history->output_crop.top,
-+                       curRunKernel.resolution_history->output_crop.right, curRunKernel.resolution_history->output_crop.bottom);
-+
-+        }
-+
-+        LOGG("metadata %d %d %d %d, bppInfo: %d %d, outputCount %d",
-+                   curRunKernel.metadata[0], curRunKernel.metadata[1], curRunKernel.metadata[2], curRunKernel.metadata[3],
-+                   curRunKernel.bpp_info.input_bpp, curRunKernel.bpp_info.output_bpp,
-+                   curRunKernel.output_count);
-+    }
-+
-+    return;
-+}
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
-new file mode 100644
-index 000000000000..86686c576e1c
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphUtils.h
-@@ -0,0 +1,27 @@
-+/*
-+ * Copyright (C) 2018-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once
-+
-+#include "IGraphConfig.h"
-+#include "IGraphConfigManager.h"
-+#include "ia_isp_bxt_types.h"
-+
-+namespace icamera {
-+namespace GraphUtils {
-+    void dumpConnections(const std::vector<IGraphType::PipelineConnection>& connections);
-+    void dumpKernelInfo(const ia_isp_bxt_program_group& programGroup);
-+};
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
-new file mode 100644
-index 000000000000..139125a46552
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/HalStream.h
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2016-2019 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+namespace icamera {
-+
-+// Temporary solution
-+enum StreamUseCase {
-+    USE_CASE_COMMON = 0,
-+    USE_CASE_PREVIEW = 1 << 0,        // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
-+    USE_CASE_VIDEO = 1 << 1,          // For HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
-+    USE_CASE_STILL_CAPTURE = 1 << 2,  // For HAL_PIXEL_FORMAT_BLOB/HAL_PIXEL_FORMAT_YCbCr_420_888
-+    USE_CASE_RAW = 1 << 3,            // For HAL_PIXEL_FORMAT_RAW16/HAL_PIXEL_FORMAT_RAW_OPAQUE
-+    USE_CASE_ZSL = 1 << 4,            // For ZSL stream
-+    USE_CASE_INPUT = 1 << 5,           // For input stream
-+};
-+
-+struct streamProps {
-+    uint32_t width;
-+    uint32_t height;
-+    int format;
-+    int streamId;
-+    StreamUseCase useCase;
-+};
-+
-+class HalStream
-+{
-+ public:
-+    HalStream(struct streamProps &props, void *priv):
-+        mWidth(props.width),
-+        mHeight(props.height),
-+        mFormat(props.format),
-+        mStreamId(props.streamId),
-+        mUseCase(props.useCase)
-+    {
-+        maxBuffers = 0;
-+        mPrivate = priv;
-+    }
-+
-+    ~HalStream() { }
-+
-+    uint32_t width() const { return mWidth; }
-+    uint32_t height() const { return mHeight; }
-+    int format() const { return mFormat; }
-+    int streamId() const { return mStreamId; }
-+    StreamUseCase useCase() const { return mUseCase; }
-+    void *priv() { return mPrivate; }
-+
-+ public:
-+    uint32_t mWidth;
-+    uint32_t mHeight;
-+    int mFormat;  // TODO: use v4l2 definition
-+    int mStreamId;
-+    StreamUseCase mUseCase;
-+
-+    int maxBuffers;
-+    void *mPrivate;
-+};
-+
-+} /* namespace icamera */
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
-new file mode 100644
-index 000000000000..e28d039b8af6
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfig.h
-@@ -0,0 +1,199 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once
-+
-+#include <string>
-+#include "HalStream.h"
-+#include "Parameters.h"
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+
-+#include <gcss.h>
-+#include <gcss_aic_utils.h>
-+#include "ia_isp_bxt_types.h"
-+#include "ia_view_types.h"
-+
-+typedef uint32_t ia_uid;
-+
-+namespace GCSS {
-+    class GraphConfigNode;
-+    class GraphQueryManager;
-+    class ItemUID;
-+}
-+
-+typedef GCSS::GraphConfigNode Node;
-+typedef std::vector<Node*> NodesPtrVector;
-+
-+namespace icamera {
-+
-+/**
-+ * Stream id associated with still capture.
-+ */
-+static const int32_t STILL_STREAM_ID = 60000;
-+/**
-+ * Stream id associated with video stream.
-+ */
-+static const int32_t VIDEO_STREAM_ID = 60001;
-+
-+namespace IGraphType {
-+class ConnectionConfig {
-+ public:
-+    ConnectionConfig(): mSourceStage(0),
-+                        mSourceTerminal(0),
-+                        mSourceIteration(0),
-+                        mSinkStage(0),
-+                        mSinkTerminal(0),
-+                        mSinkIteration(0),
-+                        mConnectionType(0) {}
-+
-+    ConnectionConfig(ia_uid sourceStage,
-+                     ia_uid sourceTerminal,
-+                     ia_uid sourceIteration,
-+                     ia_uid sinkStage,
-+                     ia_uid sinkTerminal,
-+                     ia_uid sinkIteration,
-+                     int connectionType):
-+                         mSourceStage(sourceStage),
-+                         mSourceTerminal(sourceTerminal),
-+                         mSourceIteration(sourceIteration),
-+                         mSinkStage(sinkStage),
-+                         mSinkTerminal(sinkTerminal),
-+                         mSinkIteration(sinkIteration),
-+                         mConnectionType(connectionType) {}
-+    void dump() {
-+        LOG1("connection src 0x%x (0x%x) sink 0x%x(0x%x)",
-+             mSourceStage, mSourceTerminal, mSinkStage, mSinkTerminal);
-+    }
-+
-+    ia_uid mSourceStage;
-+    ia_uid mSourceTerminal;
-+    ia_uid mSourceIteration;
-+    ia_uid mSinkStage;
-+    ia_uid mSinkTerminal;
-+    ia_uid mSinkIteration;
-+    int mConnectionType;
-+};
-+
-+/**
-+* \struct PortFormatSettings
-+* Format settings for a port in the graph
-+*/
-+struct PortFormatSettings {
-+    int32_t      enabled;
-+    uint32_t     terminalId; /**< Unique terminal id (is a fourcc code) */
-+    int32_t      width;    /**< Width of the frame in pixels */
-+    int32_t      height;   /**< Height of the frame in lines */
-+    int32_t      fourcc;   /**< Frame format */
-+    int32_t      bpl;      /**< Bytes per line*/
-+    int32_t      bpp;      /**< Bits per pixel */
-+};
-+
-+/**
-+ * \struct PipelineConnection
-+ * Group port format, connection, stream, edge port for
-+ * pipeline configuration
-+ */
-+struct PipelineConnection {
-+    PipelineConnection() : stream(nullptr), hasEdgePort(false) { CLEAR(portFormatSettings); }
-+    PortFormatSettings portFormatSettings;
-+    ConnectionConfig connectionConfig;
-+    HalStream *stream;
-+    bool hasEdgePort;
-+};
-+
-+struct StageAttr{
-+    void *rbm;
-+    uint32_t rbm_bytes;
-+    StageAttr() : rbm(nullptr), rbm_bytes(0) {}
-+};
-+
-+enum terminal_connection_type {
-+    connection_type_push, /* data is pushed by source stage execute */
-+    connection_type_pull  /* data is pulled by sink stage execute */
-+};
-+
-+struct PgInfo {
-+    PgInfo() : pgId(-1), streamId(-1) {}
-+    std::string pgName;
-+    int pgId;
-+    int streamId;
-+    StageAttr rbmValue;
-+};
-+
-+struct MbrInfo {
-+    MbrInfo() { streamId = -1; CLEAR(data); }
-+    int streamId;
-+    ia_isp_bxt_gdc_limits data;
-+};
-+
-+struct ProgramGroupInfo {
-+    ProgramGroupInfo() { streamId = -1; pgPtr = nullptr; }
-+    int streamId;
-+    ia_isp_bxt_program_group *pgPtr;
-+};
-+
-+struct GraphConfigData {
-+    int mcId;
-+    int graphId;
-+    uint32_t gdcKernelId;
-+    camera_resolution_t csiReso;
-+    camera_resolution_t gdcReso;
-+    std::vector<int32_t> streamIds;
-+    std::vector<PgInfo> pgInfo;
-+    std::vector<MbrInfo> mbrInfo;
-+    std::vector<std::string> pgNames;
-+    std::vector<ProgramGroupInfo> programGroup;
-+    GraphConfigData() : mcId(-1),
-+                        graphId(-1),
-+                        gdcKernelId(-1) {
-+        CLEAR(csiReso);
-+        CLEAR(gdcReso);
-+    }
-+};
-+
-+struct ScalerInfo {
-+    int32_t streamId;
-+    float scalerWidth;
-+    float scalerHeight;
-+};
-+}  // namespace IGraphType
-+
-+class IGraphConfig {
-+public:
-+    virtual ~IGraphConfig() = default;
-+
-+    virtual void getCSIOutputResolution(camera_resolution_t &reso) = 0;
-+    virtual status_t getGdcKernelSetting(uint32_t& kernelId,
-+                                         camera_resolution_t& resolution) = 0;
-+    virtual status_t graphGetStreamIds(std::vector<int32_t> &streamIds) = 0;
-+    virtual int getGraphId(void) = 0;
-+    virtual int getStreamIdByPgName(std::string pgName) = 0;
-+    virtual int getPgIdByPgName(std::string pgName) = 0;
-+    virtual ia_isp_bxt_program_group *getProgramGroup(int32_t streamId) = 0;
-+    virtual int getProgramGroup(std::string pgName,
-+                                ia_isp_bxt_program_group* programGroupForPG) {return OK;}
-+    virtual status_t getMBRData(int32_t streamId, ia_isp_bxt_gdc_limits *data) = 0;
-+    virtual status_t getPgRbmValue(std::string pgName,
-+                                   IGraphType::StageAttr *stageAttr) {return OK;}
-+    virtual status_t getPgIdForKernel(const uint32_t streamIds,
-+                                      const int32_t kernelId, int32_t *pgId) {return OK;}
-+    virtual status_t getPgNames(std::vector<std::string>* pgNames) = 0;
-+    virtual status_t pipelineGetConnections(
-+                         const std::vector<std::string> &pgList,
-+                         std::vector<IGraphType::PipelineConnection> *confVector) = 0;
-+};
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
-new file mode 100644
-index 000000000000..fa55c57ab2d1
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/IGraphConfigManager.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Copyright (C) 2018-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+#pragma once
-+
-+#include <memory>
-+#include <map>
-+
-+#include "CameraTypes.h"
-+#include "IGraphConfig.h"
-+#include "Parameters.h"
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+class IGraphConfigManager {
-+public:
-+    virtual ~IGraphConfigManager() = default;
-+
-+    virtual int configStreams(const stream_config_t* streams) = 0;
-+    virtual int getSelectedMcId() = 0;
-+    virtual std::shared_ptr<IGraphConfig> getGraphConfig(ConfigMode configMode) = 0;
-+    virtual bool isGcConfigured(void) = 0;
-+    static void releaseInstance(int cameraId);
-+    static IGraphConfigManager* getInstance(int cameraId);
-+
-+private:
-+    // Guard for singleton instance creation.
-+    static Mutex sLock;
-+    static std::map<int, IGraphConfigManager*> sInstances;
-+};
-+}
-diff --git a/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
-new file mode 100644
-index 000000000000..624d750c868d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/platformdata/gc/custom_gcss_keys.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2016-2018 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+GCSS_KEY (BAYER_ORDER, bayer_order)
-+GCSS_KEY (GAIN, analogue_gain)
-+GCSS_KEY (CSI_BE, csi_be)
-+GCSS_KEY (CSI_BE_SOC, csi_be_soc)
-+GCSS_KEY (CSI_PORT, csi_port)
-+GCSS_KEY (EXPOSURE, exposure)
-+GCSS_KEY (FLL, min_fll)
-+GCSS_KEY (INTERLACED, interlaced)
-+GCSS_KEY (HFLIP, hflip)
-+GCSS_KEY (LINK_FREQ, link_freq)
-+GCSS_KEY (LLP, min_llp)
-+GCSS_KEY (SENSOR_MODE, sensor_mode)
-+GCSS_KEY (PIXEL_ARRAY, pixel_array)
-+GCSS_KEY (BINNER, binner)
-+GCSS_KEY (SCALER, scaler)
-+GCSS_KEY (BINNING_H_FACTOR, h_factor)
-+GCSS_KEY (BINNING_V_FACTOR, v_factor)
-+GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
-+GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
-+GCSS_KEY (PORT_0, port_0)
-+GCSS_KEY (SCALER_PAD, scaler_pad)
-+GCSS_KEY (TARGET, target)
-+GCSS_KEY (SENSOR_NAME, sensor_name)
-+GCSS_KEY (TPG, tpg)
-+GCSS_KEY (STILL_POST_GDC, still_post_gdc)
-+GCSS_KEY (VFLIP, vflip)
-+GCSS_KEY (VIDEO0, video0)
-+GCSS_KEY (VIDEO1, video1)
-+GCSS_KEY (VIDEO2, video2)
-+GCSS_KEY (STILL0, still0)
-+GCSS_KEY (STILL1, still1)
-+GCSS_KEY (STILL2, still2)
-+GCSS_KEY (RAW, raw)
-+GCSS_KEY (OP_MODE, op_mode)
-+GCSS_KEY (MC_ID, mc_id)
-diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
-new file mode 100644
-index 000000000000..0b530c394e90
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.cpp
-@@ -0,0 +1,1116 @@
-+/*
-+ * Copyright (C) 2011 The Android Open Source Project
-+ * Copyright (C) 2015-2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "MediaControl"
-+
-+#include <stack>
-+#include <linux/v4l2-mediabus.h>
-+#include <linux/videodev2.h>
-+
-+#include "iutils/CameraLog.h"
-+#include "iutils/Errors.h"
-+#include "iutils/Utils.h"
-+#include "V4l2DeviceFactory.h"
-+#include "MediaControl.h"
-+#include "Parameters.h"
-+#include "SysCall.h"
-+#include "PlatformData.h"
-+
-+using std::string;
-+using std::vector;
-+
-+namespace icamera {
-+
-+struct MediaLink {
-+    MediaPad *source;
-+    MediaPad *sink;
-+    MediaLink *twin;
-+    uint32_t flags;
-+    uint32_t padding[3];
-+};
-+
-+struct MediaPad {
-+    MediaEntity *entity;
-+    uint32_t index;
-+    uint32_t flags;
-+    uint32_t padding[3];
-+};
-+
-+struct MediaEntity {
-+    media_entity_desc info;
-+    MediaPad *pads;
-+    MediaLink *links;
-+    unsigned int maxLinks;
-+    unsigned int numLinks;
-+
-+    char devname[32];
-+};
-+
-+MediaControl *MediaControl::sInstance = nullptr;
-+Mutex MediaControl::sLock;
-+
-+/*static*/ MediaControl*
-+MediaControl::getInstance()
-+{
-+    LOG1("%s", __func__);
-+    AutoMutex lock(sLock);
-+    if (!sInstance) {
-+        sInstance = new MediaControl(MEDIACTLDEVNAME);
-+    }
-+    return sInstance;
-+}
-+
-+void MediaControl::releaseInstance()
-+{
-+    LOG1("%s", __func__);
-+    AutoMutex lock(sLock);
-+    delete sInstance;
-+    sInstance = nullptr;
-+}
-+
-+MediaControl::MediaControl(const char *devName) :
-+    mDevName(devName)
-+{
-+    LOG1("@%s device: %s", __func__, devName);
-+}
-+
-+MediaControl::~MediaControl()
-+{
-+    LOG1("@%s", __func__);
-+}
-+
-+int MediaControl::initEntities()
-+{
-+    LOG1("@%s", __func__);
-+
-+    mEntities.reserve(100);
-+
-+    int ret = enumInfo();
-+    if (ret != 0) {
-+        LOGE("Enum Info failed.");
-+        return -1;
-+    }
-+
-+    return 0;
-+}
-+
-+void MediaControl::clearEntities()
-+{
-+    LOG1("@%s", __func__);
-+
-+    auto entity = mEntities.begin();
-+    while (entity != mEntities.end()) {
-+        delete [] entity->pads;
-+        entity->pads = nullptr;
-+        delete [] entity->links;
-+        entity->links = nullptr;
-+        entity = mEntities.erase(entity);
-+    }
-+}
-+
-+MediaEntity *MediaControl::getEntityByName(const char *name)
-+{
-+    CheckError(!name, nullptr, "Invalid Entity name");
-+
-+    for (auto &entity : mEntities) {
-+        if (strcmp(name, entity.info.name) == 0) {
-+            return &entity;
-+        }
-+    }
-+
-+    return nullptr;
-+}
-+
-+int MediaControl::getEntityIdByName(const char *name)
-+{
-+    MediaEntity *entity = getEntityByName(name);
-+    if (!entity) {
-+        return -1;
-+    }
-+
-+    return entity->info.id;
-+}
-+
-+int MediaControl::resetAllLinks()
-+{
-+    int ret;
-+
-+    LOG1("@%s", __func__);
-+
-+    for (auto &entity : mEntities) {
-+
-+        for (uint32_t j = 0; j < entity.numLinks; j++) {
-+            MediaLink *link = &entity.links[j];
-+
-+            if (link->flags & MEDIA_LNK_FL_IMMUTABLE ||
-+                    link->source->entity->info.id != entity.info.id) {
-+                continue;
-+            }
-+            ret = setupLink(link->source, link->sink,
-+                    link->flags & ~MEDIA_LNK_FL_ENABLED);
-+
-+            if (ret < 0)
-+                return ret;
-+        }
-+    }
-+
-+    return 0;
-+}
-+
-+int MediaControl::setupLink(MediaPad *source, MediaPad *sink, uint32_t flags)
-+{
-+    MediaLink *link = nullptr;
-+    media_link_desc ulink;
-+    uint32_t i;
-+    int ret = 0;
-+    LOG1("@%s", __func__);
-+
-+    SysCall *sc = SysCall::getInstance();
-+
-+    int fd = openDevice();
-+    if (fd < 0)
-+        goto done;
-+
-+    for (i = 0; i < source->entity->numLinks; i++) {
-+        link = &source->entity->links[i];
-+
-+        if (link->source->entity == source->entity &&
-+                link->source->index == source->index &&
-+                link->sink->entity == sink->entity &&
-+                link->sink->index == sink->index)
-+            break;
-+    }
-+
-+    if (i == source->entity->numLinks) {
-+        LOGE("%s: Link not found", __func__);
-+        ret = -ENOENT;
-+        goto done;
-+    }
-+
-+    /* source pad */
-+    memset(&ulink, 0, sizeof(media_link_desc));
-+    ulink.source.entity = source->entity->info.id;
-+    ulink.source.index = source->index;
-+    ulink.source.flags = MEDIA_PAD_FL_SOURCE;
-+
-+    /* sink pad */
-+    ulink.sink.entity = sink->entity->info.id;
-+    ulink.sink.index = sink->index;
-+    ulink.sink.flags = MEDIA_PAD_FL_SINK;
-+
-+    if (link)
-+        ulink.flags = flags | (link->flags & MEDIA_LNK_FL_IMMUTABLE);
-+
-+    if (Log::isDumpMediaInfo())
-+        dumpLinkDesc(&ulink, 1);
-+
-+    ret = sc->ioctl(fd, MEDIA_IOC_SETUP_LINK, &ulink);
-+    if (ret == -1) {
-+        ret = -errno;
-+        LOGE( "%s: Unable to setup link (%s)",
-+                __func__, strerror(errno));
-+        goto done;
-+    }
-+
-+    if (link) {
-+        link->flags = ulink.flags;
-+        link->twin->flags = ulink.flags;
-+    }
-+
-+    ret = 0;
-+
-+done:
-+    closeDevice(fd);
-+    return ret;
-+}
-+
-+int MediaControl::setupLink(uint32_t srcEntity, uint32_t srcPad,
-+                            uint32_t sinkEntity, uint32_t sinkPad, bool enable)
-+{
-+    LOG1("@%s srcEntity %d srcPad %d sinkEntity %d sinkPad %d enable %d",
-+            __func__, srcEntity, srcPad, sinkEntity, sinkPad, enable);
-+
-+    for (auto &entity : mEntities) {
-+        for (uint32_t j = 0; j < entity.numLinks; j++) {
-+            MediaLink *link = &entity.links[j];
-+
-+            if ((link->source->entity->info.id == srcEntity)
-+                && (link->source->index == srcPad)
-+                && (link->sink->entity->info.id == sinkEntity)
-+                && (link->sink->index == sinkPad)) {
-+
-+                if (enable)
-+                    link->flags |= MEDIA_LNK_FL_ENABLED;
-+                else
-+                    link->flags &= ~MEDIA_LNK_FL_ENABLED;
-+
-+                return setupLink(link->source, link->sink, link->flags);
-+            }
-+        }
-+    }
-+
-+    return -1;
-+}
-+
-+int MediaControl::openDevice()
-+{
-+    int fd;
-+    LOG1("@%s %s", __func__, mDevName.c_str());
-+
-+    SysCall *sc = SysCall::getInstance();
-+
-+    fd = sc->open(mDevName.c_str(), O_RDWR);
-+    if (fd < 0) {
-+        LOGE("%s: Error open media device %s: %s", __func__,
-+             mDevName.c_str(), strerror(errno));
-+        return UNKNOWN_ERROR;
-+    }
-+
-+    return fd;
-+}
-+
-+void MediaControl::closeDevice(int fd)
-+{
-+    LOG1("@%s", __func__);
-+
-+    if (fd < 0)
-+        return ;
-+
-+    SysCall *sc = SysCall::getInstance();
-+
-+    if (sc->close(fd) < 0) {
-+        LOGE("%s: Error close media device %s: %s", __func__,
-+             mDevName.c_str(), strerror(errno));
-+    }
-+}
-+
-+void MediaControl::dumpInfo(media_device_info& devInfo)
-+{
-+    LOGD("Media controller API version %u.%u.%u\n\n",
-+         (devInfo.media_version << 16) & 0xff,
-+         (devInfo.media_version << 8) & 0xff,
-+         (devInfo.media_version << 0) & 0xff);
-+
-+    LOGD("Media device information\n"
-+         "------------------------\n"
-+         "driver          %s\n"
-+         "model           %s\n"
-+         "serial          %s\n"
-+         "bus info        %s\n"
-+         "hw revision     0x%x\n"
-+         "driver version  %u.%u.%u\n\n",
-+         devInfo.driver, devInfo.model,
-+         devInfo.serial, devInfo.bus_info,
-+         devInfo.hw_revision,
-+         (devInfo.driver_version << 16) & 0xff,
-+         (devInfo.driver_version << 8) & 0xff,
-+         (devInfo.driver_version << 0) & 0xff);
-+
-+    for (uint32_t i = 0; i < sizeof(devInfo.reserved)/sizeof(uint32_t); i++)
-+         LOG2("reserved[%u] %d", i, devInfo.reserved[i]);
-+}
-+
-+int MediaControl::enumInfo()
-+{
-+    int ret;
-+    int fd = -1;
-+    media_device_info info;
-+    LOG1("@%s", __func__);
-+
-+    SysCall *sc = SysCall::getInstance();
-+
-+    if (mEntities.size() > 0)
-+        return 0;
-+
-+    fd = openDevice();
-+    if (fd < 0) {
-+        LOGE("Open device failed.");
-+        return fd;
-+    }
-+
-+    ret = sc->ioctl(fd, MEDIA_IOC_DEVICE_INFO, &info);
-+    if (ret < 0) {
-+        LOGE("%s: Unable to retrieve media device information for device %s (%s)",__func__, mDevName.c_str(), strerror(errno));
-+        goto done;
-+    }
-+
-+    if (Log::isDumpMediaInfo())
-+        dumpInfo(info);
-+
-+    ret = enumEntities(fd, info);
-+    if (ret < 0) {
-+        LOGE("%s: Unable to enumerate entities for device %s", __func__, mDevName.c_str());
-+        goto done;
-+    }
-+
-+    LOG2("Found %lu entities", mEntities.size());
-+    LOG2("Enumerating pads and links");
-+
-+    ret = enumLinks(fd);
-+    if (ret < 0) {
-+        LOGE("%s: Unable to enumerate pads and linksfor device %s", __func__, mDevName.c_str());
-+        goto done;
-+    }
-+
-+    ret = 0;
-+
-+done:
-+    closeDevice(fd);
-+    return ret;
-+}
-+
-+void MediaControl::dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo)
-+{
-+    LOGD("id %d", desc.id);
-+    LOGD("name %s", desc.name);
-+    LOGD("type 0x%x", desc.type);
-+    LOGD("revision %d", desc.revision);
-+    LOGD("flags %d", desc.flags);
-+    LOGD("group_id %d", desc.group_id);
-+    LOGD("pads %d", desc.pads);
-+    LOGD("links %u", desc.links);
-+
-+    for (uint32_t i = 0; i < sizeof(desc.reserved)/sizeof(uint32_t); i++)
-+        LOGD("reserved[%u] %d", i, devInfo.reserved[i]);
-+}
-+
-+int MediaControl::enumEntities(int fd, media_device_info& devInfo)
-+{
-+    MediaEntity entity;
-+    uint32_t id;
-+    int ret;
-+    LOG1("@%s", __func__);
-+    SysCall *sc = SysCall::getInstance();
-+
-+    for (id = 0, ret = 0; ; id = entity.info.id) {
-+        memset(&entity, 0, sizeof(MediaEntity));
-+        entity.info.id = id | MEDIA_ENT_ID_FLAG_NEXT;
-+
-+        ret = sc->ioctl(fd, MEDIA_IOC_ENUM_ENTITIES, &entity.info);
-+        if (ret < 0) {
-+            ret = errno != EINVAL ? -errno : 0;
-+            break;
-+        }
-+
-+        if (Log::isDumpMediaInfo())
-+            dumpEntityDesc(entity.info, devInfo);
-+
-+        /* Number of links (for outbound links) plus number of pads (for
-+         * inbound links) is a good safe initial estimate of the total
-+         * number of links.
-+         */
-+        entity.maxLinks = entity.info.pads + entity.info.links;
-+
-+        entity.pads = new MediaPad[entity.info.pads];
-+        entity.links = new MediaLink[entity.maxLinks];
-+        getDevnameFromSysfs(&entity);
-+        mEntities.push_back(entity);
-+
-+        /* Note: carefully to move the follow setting. It must be behind of
-+         * push_back to mEntities:
-+         * 1. if entity is not pushed back to mEntities, getEntityById will
-+         * return NULL.
-+         * 2. we can't set entity.pads[i].entity to &entity direct. Because,
-+         * entity is stack variable, its scope is just this function.
-+         */
-+        for (uint32_t i = 0; i < entity.info.pads; ++i) {
-+            entity.pads[i].entity = getEntityById(entity.info.id);
-+        }
-+    }
-+
-+    return ret;
-+}
-+
-+int MediaControl::getDevnameFromSysfs(MediaEntity *entity)
-+{
-+    char sysName[MAX_SYS_NAME] = {'\0'};
-+    char target[MAX_TARGET_NAME] = {'\0'};
-+    int ret;
-+
-+    if (!entity) {
-+        LOGE("entity is null.");
-+        return -EINVAL;
-+    }
-+
-+    ret = snprintf(sysName, MAX_SYS_NAME, "/sys/dev/char/%u:%u",
-+                   entity->info.v4l.major, entity->info.v4l.minor);
-+    if (ret <= 0) {
-+        LOGE("create sysName failed ret %d.", ret);
-+        return -EINVAL;
-+    }
-+
-+    ret = readlink(sysName, target, MAX_TARGET_NAME);
-+    if (ret <= 0) {
-+        LOGE("readlink sysName %s failed ret %d.", sysName, ret);
-+        return -EINVAL;
-+    }
-+
-+    char *d = strrchr(target, '/');
-+    if (!d) {
-+        LOGE("target is invalid %s.", target);
-+        return -EINVAL;
-+    }
-+    d++; /* skip '/' */
-+
-+    char *t = strstr(d, "dvb");
-+    if (t && t == d) {
-+        t = strchr(t, '.');
-+        if (!t) {
-+            LOGE("target is invalid %s.", target);
-+            return -EINVAL;
-+        }
-+        *t = '/';
-+        d +=3; /* skip "dvb" */
-+        snprintf(entity->devname, sizeof(entity->devname), "/dev/dvb/adapter%s", d);
-+    } else {
-+        snprintf(entity->devname, sizeof(entity->devname), "/dev/%s", d);
-+    }
-+
-+    return 0;
-+}
-+
-+void MediaControl::dumpPadDesc(media_pad_desc *pads, const int padsCount, const char *name)
-+{
-+    for (int i = 0; i < padsCount; i++) {
-+        LOGD("Dump %s Pad desc %d", name == nullptr? "": name, i);
-+        LOGD("entity: %d", pads[i].entity);
-+        LOGD("index: %d", pads[i].index);
-+        LOGD("flags: %d", pads[i].flags);
-+        LOGD("reserved[0]: %d", pads[i].reserved[0]);
-+        LOGD("reserved[1]: %d", pads[i].reserved[1]);
-+    }
-+}
-+
-+void MediaControl::dumpLinkDesc(media_link_desc *links, const int linksCount)
-+{
-+    for (int i = 0; i < linksCount; i++) {
-+        LOG2("Dump Link desc %d", i);
-+        MediaEntity *sourceEntity = getEntityById(links[i].source.entity);
-+        MediaEntity *sinkEntity = getEntityById(links[i].sink.entity);
-+
-+        dumpPadDesc(&links[i].source, 1, sourceEntity->info.name);
-+        dumpPadDesc(&links[i].sink, 1, sinkEntity->info.name);
-+        LOGD("flags: %d", links[i].flags);
-+        LOGD("reserved[0]: %d", links[i].reserved[0]);
-+        LOGD("reserved[1]: %d", links[i].reserved[1]);
-+    }
-+}
-+
-+int MediaControl::enumLinks(int fd)
-+{
-+    int ret = 0;
-+    LOG1("@%s", __func__);
-+
-+    SysCall *sc = SysCall::getInstance();
-+
-+    for (auto &entity : mEntities) {
-+        media_links_enum links;
-+        uint32_t i;
-+
-+        links.entity = entity.info.id;
-+        links.pads = new media_pad_desc[entity.info.pads];
-+        links.links = new media_link_desc[entity.info.links];
-+
-+        if (sc->ioctl(fd, MEDIA_IOC_ENUM_LINKS, &links) < 0) {
-+            ret = -errno;
-+            LOG2("%s: Unable to enumerate pads and links (%s).", __func__, strerror(errno));
-+            delete [] links.pads;
-+            delete [] links.links;
-+            return ret;
-+        }
-+
-+        if (Log::isDumpMediaInfo()) {
-+            LOG2("entity %d", links.entity);
-+            dumpPadDesc(links.pads, entity.info.pads);
-+            dumpLinkDesc(links.links, entity.info.links);
-+        }
-+
-+        for (i = 0; i < entity.info.pads; ++i) {
-+            entity.pads[i].entity = getEntityById(entity.info.id);
-+            entity.pads[i].index = links.pads[i].index;
-+            entity.pads[i].flags = links.pads[i].flags;
-+        }
-+
-+        for (i = 0; i < entity.info.links; ++i) {
-+            media_link_desc *link = &links.links[i];
-+            MediaLink *fwdlink;
-+            MediaLink *backlink;
-+            MediaEntity *source;
-+            MediaEntity *sink;
-+
-+            source = getEntityById(link->source.entity);
-+            sink = getEntityById(link->sink.entity);
-+
-+            if (source == nullptr || sink == nullptr) {
-+                LOG2("WARNING entity %u link %u src %u/%u to %u/%u is invalid!",
-+                        entity.info.id, i, link->source.entity,
-+                        link->source.index,
-+                        link->sink.entity,
-+                        link->sink.index);
-+                ret = -EINVAL;
-+            } else {
-+                fwdlink = entityAddLink(source);
-+                if (fwdlink) {
-+                    fwdlink->source = &source->pads[link->source.index];
-+                    fwdlink->sink = &sink->pads[link->sink.index];
-+                    fwdlink->flags = link->flags;
-+                }
-+
-+                backlink = entityAddLink(sink);
-+                if (backlink) {
-+                    backlink->source = &source->pads[link->source.index];
-+                    backlink->sink = &sink->pads[link->sink.index];
-+                    backlink->flags = link->flags;
-+                }
-+
-+                if (fwdlink)
-+                    fwdlink->twin = backlink;
-+                if (backlink)
-+                    backlink->twin = fwdlink;
-+            }
-+        }
-+
-+        delete [] links.pads;
-+        delete [] links.links;
-+    }
-+
-+    return ret;
-+}
-+
-+MediaLink *MediaControl::entityAddLink(MediaEntity *entity)
-+{
-+    if (entity->numLinks >= entity->maxLinks) {
-+        uint32_t maxLinks = entity->maxLinks * 2;
-+        MediaLink* links = new MediaLink[maxLinks];
-+
-+        MEMCPY_S(links, sizeof(MediaLink) * maxLinks, entity->links,
-+                 sizeof(MediaLink) * entity->maxLinks);
-+        delete [] entity->links;
-+
-+        for (uint32_t i = 0; i < entity->numLinks; ++i) {
-+            links[i].twin->twin = &links[i];
-+        }
-+
-+        entity->maxLinks = maxLinks;
-+        entity->links = links;
-+    }
-+
-+    return &entity->links[entity->numLinks++];
-+}
-+
-+MediaEntity *MediaControl::getEntityById(uint32_t id)
-+{
-+    bool next = id & MEDIA_ENT_ID_FLAG_NEXT;
-+
-+    id &= ~MEDIA_ENT_ID_FLAG_NEXT;
-+
-+    for (uint32_t i = 0; i < mEntities.size(); i++) {
-+        if ((mEntities[i].info.id == id && !next) ||
-+                (mEntities[0].info.id > id && next)) {
-+            return &mEntities[i];
-+        }
-+
-+    }
-+
-+    return nullptr;
-+}
-+
-+const char *MediaControl::entitySubtype2String(unsigned type)
-+{
-+    static const char *nodeTypes[] = {
-+        "Unknown",
-+        "V4L",
-+        "FB",
-+        "ALSA",
-+        "DVB",
-+    };
-+    static const char *subdevTypes[] = {
-+        "Unknown",
-+        "Sensor",
-+        "Flash",
-+        "Lens",
-+    };
-+
-+    uint32_t subtype = type & MEDIA_ENT_SUBTYPE_MASK;
-+
-+    switch (type & MEDIA_ENT_TYPE_MASK) {
-+    case MEDIA_ENT_T_DEVNODE:
-+        if (subtype >= ARRAY_SIZE(nodeTypes))
-+            subtype = 0;
-+        return nodeTypes[subtype];
-+
-+    case MEDIA_ENT_T_V4L2_SUBDEV:
-+        if (subtype >= ARRAY_SIZE(subdevTypes))
-+            subtype = 0;
-+        return subdevTypes[subtype];
-+    default:
-+        return nodeTypes[0];
-+    }
-+}
-+
-+const char *MediaControl::padType2String(unsigned flag)
-+{
-+    static const struct {
-+        __u32 flag;
-+        const char *name;
-+    } flags[] = {
-+        { MEDIA_PAD_FL_SINK, "Sink" },
-+        { MEDIA_PAD_FL_SOURCE, "Source" },
-+    };
-+
-+    uint32_t i;
-+
-+    for (i = 0; i < ARRAY_SIZE(flags); i++) {
-+        if (flags[i].flag & flag)
-+            return flags[i].name;
-+    }
-+
-+    return "Unknown";
-+}
-+
-+int MediaControl::setMediaMcCtl(int cameraId, vector <McCtl> ctls)
-+{
-+    for (auto &ctl : ctls) {
-+        MediaEntity *entity = getEntityById(ctl.entity);
-+        V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
-+        int ret = subDev->SetControl(ctl.ctlCmd, ctl.ctlValue);
-+        LOG2("set Ctl %s [%d] cmd %s [0x%08x] value %d", ctl.entityName.c_str(), ctl.entity,
-+                ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
-+        CheckError(ret != OK, ret, "set Ctl %s [%d] cmd %s [0x%08x] value %d failed.",
-+                ctl.entityName.c_str(), ctl.entity, ctl.ctlName.c_str(), ctl.ctlCmd, ctl.ctlValue);
-+    }
-+    return 0;
-+}
-+
-+int MediaControl::setMediaMcLink(vector <McLink> links)
-+{
-+    for (auto &link : links) {
-+        LOG2("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d.",
-+              link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
-+              link.sinkEntity, link.sinkPad, link.enable);
-+        int ret = setupLink(link.srcEntity, link.srcPad, link.sinkEntity, link.sinkPad, link.enable);
-+        if (ret < 0) {
-+            LOGE("setup Link %s [%d:%d] ==> %s [%dx%d] enable %d failed.",
-+                link.srcEntityName.c_str(), link.srcEntity, link.srcPad, link.sinkEntityName.c_str(),
-+                link.sinkEntity, link.sinkPad, link.enable);
-+            return ret;
-+        }
-+    }
-+    return 0;
-+}
-+
-+int MediaControl::setFormat(int cameraId, const McFormat *format, int targetWidth, int targetHeight, int field)
-+{
-+    PERF_CAMERA_ATRACE();
-+    int ret;
-+    v4l2_mbus_framefmt mbusfmt;
-+    MediaEntity *entity = getEntityById(format->entity);
-+    if (entity == nullptr) {
-+        LOGE("@%s, get entity fail for calling getEntityById", __func__);
-+        return BAD_VALUE;
-+    }
-+
-+    MediaPad *pad = &entity->pads[format->pad];
-+    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
-+    LOG1("@%s, targetWidth:%d, targetHeight:%d", __func__, targetWidth, targetHeight);
-+    LOG2("SENSORCTRLINFO: width=%d", targetWidth);
-+    LOG2("SENSORCTRLINFO: height=%d", targetHeight);
-+    LOG2("SENSORCTRLINFO: code=0x%x", format->pixelCode);
-+
-+    CLEAR(mbusfmt);
-+    if (format->width != 0 && format->height != 0) {
-+        mbusfmt.width  = format->width;
-+        mbusfmt.height = format->height;
-+    } else if (format->type == RESOLUTION_TARGET) {
-+        mbusfmt.width  = targetWidth;
-+        mbusfmt.height = targetHeight;
-+    }
-+    mbusfmt.field = field;
-+
-+    if (format->pixelCode) {
-+        mbusfmt.code = format->pixelCode;
-+    } else {
-+        mbusfmt.code = CameraUtils::getMBusFormat(cameraId, PlatformData::getISysFormat(cameraId));
-+    }
-+    LOG2("set format %s [%d:%d] [%dx%d] [%dx%d] %s ", format->entityName.c_str(),
-+            format->entity, format->pad, mbusfmt.width, mbusfmt.height,
-+            targetWidth, targetHeight, CameraUtils::pixelCode2String(mbusfmt.code));
-+
-+    struct v4l2_subdev_format fmt = {};
-+    fmt.pad = format->pad;
-+    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-+    fmt.format = mbusfmt;
-+    ret = subDev->SetFormat(fmt);
-+    CheckError(ret < 0, BAD_VALUE, "set format %s [%d:%d] [%dx%d] %s failed.",
-+            format->entityName.c_str(), format->entity, format->pad, format->width, format->height,
-+            CameraUtils::pixelCode2String(format->pixelCode));
-+
-+    mbusfmt = fmt.format;
-+
-+    /* If the pad is an output pad, automatically set the same format on
-+     * the remote subdev input pads, if any.
-+     */
-+    if (pad->flags & MEDIA_PAD_FL_SOURCE) {
-+        for (unsigned int i = 0; i < pad->entity->numLinks; ++i) {
-+            MediaLink *link = &pad->entity->links[i];
-+
-+            if (!(link->flags & MEDIA_LNK_FL_ENABLED))
-+                continue;
-+
-+            if (link->source == pad && link->sink->entity->info.type == MEDIA_ENT_T_V4L2_SUBDEV) {
-+                auto subDev = V4l2DeviceFactory::getSubDev(cameraId, link->sink->entity->devname);
-+
-+                struct v4l2_subdev_format tmt = {};
-+                tmt.format = mbusfmt;
-+                tmt.pad = link->sink->index;
-+                tmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-+                subDev->SetFormat(tmt);
-+            }
-+        }
-+    }
-+
-+    return 0;
-+}
-+
-+int MediaControl::setSelection(int cameraId,
-+        const McFormat *format, int targetWidth, int targetHeight)
-+{
-+    PERF_CAMERA_ATRACE();
-+    int ret = OK;
-+
-+    MediaEntity *entity = getEntityById(format->entity);
-+    V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, entity->devname);
-+    LOG1("@%s, cameraId:%d, targetWidth:%d, targetHeight:%d", __func__, cameraId, targetWidth, targetHeight);
-+
-+    if (format->top != -1 && format->left != -1 && format->width != 0 && format->height != 0) {
-+        struct v4l2_subdev_selection selection = {};
-+        selection.pad = format->pad;
-+        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-+        selection.target = format->selCmd;
-+        selection.flags = 0;
-+        selection.r.top = format->top;
-+        selection.r.left = format->left;
-+        selection.r.width = format->width;
-+        selection.r.height = format->height;
-+
-+        ret = subDev->SetSelection(selection);
-+    } else if (format->selCmd == V4L2_SEL_TGT_CROP || format->selCmd == V4L2_SEL_TGT_COMPOSE) {
-+        LOG2("@%s, line:%d, targetWidth:%d, targetHeight:%d", __func__, __LINE__, targetWidth, targetHeight);
-+
-+        struct v4l2_subdev_selection selection = {};
-+        selection.pad = format->pad;
-+        selection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-+        selection.target = format->selCmd;
-+        selection.flags = 0;
-+        selection.r.top = 0;
-+        selection.r.left = 0;
-+        selection.r.width = targetWidth;
-+        selection.r.height = targetHeight;
-+
-+        ret = subDev->SetSelection(selection);
-+    } else {
-+        ret = BAD_VALUE;
-+    }
-+
-+    CheckError(ret < 0, BAD_VALUE, "set selection %s [%d:%d] selCmd: %d [%d, %d] [%dx%d] failed",
-+            format->entityName.c_str(), format->entity, format->pad, format->selCmd,
-+            format->top, format->left, format->width, format->height);
-+
-+    return OK;
-+}
-+
-+int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field)
-+{
-+    LOG1("%s, cameraId:%d", __func__, cameraId);
-+    /* Setup controls in format Configuration */
-+    int ret = setMediaMcCtl(cameraId, mc->ctls);
-+    CheckError(ret != OK, ret, "set MediaCtlConf McCtl failed: ret=%d", ret);
-+
-+    /* Set format & selection in format Configuration */
-+    for (auto &fmt : mc->formats) {
-+        if (fmt.formatType == FC_FORMAT) {
-+            setFormat(cameraId, &fmt, width, height, field);
-+        } else if (fmt.formatType == FC_SELECTION) {
-+            setSelection(cameraId, &fmt, width, height);
-+        }
-+    }
-+
-+    /* Set link in format Configuration */
-+    ret = setMediaMcLink(mc->links);
-+    CheckError(ret != OK, ret, "set MediaCtlConf McLink failed: ret = %d", ret);
-+
-+    dumpEntityTopology();
-+
-+    return OK;
-+}
-+
-+int MediaControl::getVCMI2CAddr(const char* vcmName, string* vcmI2CAddr) {
-+    CheckError(!vcmI2CAddr, BAD_VALUE, "vcmI2CAddr is nullptr");
-+    CheckError(!vcmName, BAD_VALUE, "vcmName is nullptr");
-+
-+    for (auto &entity : mEntities) {
-+        if (strncmp(entity.info.name, vcmName, strlen(vcmName)) == 0) {
-+            *vcmI2CAddr = entity.info.name;
-+            LOG2("%s, vcm addr name %s", __func__, entity.info.name);
-+            return OK;
-+        }
-+    }
-+
-+    return NAME_NOT_FOUND;
-+}
-+
-+void MediaControl::mediaCtlClear(int cameraId, MediaCtlConf *mc)
-+{
-+    LOG1("%s, cameraId:%d", __func__, cameraId);
-+
-+}
-+
-+// This function must be called after enumEntities().
-+int MediaControl::getLensName(string *lensName)
-+{
-+    LOG1("@%s", __func__);
-+    CheckError(!lensName, UNKNOWN_ERROR, "lensName is nullptr");
-+
-+    for (auto &entity : mEntities) {
-+        if (entity.info.type == MEDIA_ENT_T_V4L2_SUBDEV_LENS) {
-+           *lensName = entity.info.name;
-+           return OK;
-+        }
-+    }
-+
-+    return UNKNOWN_ERROR;
-+}
-+
-+// This function must be called after enumEntities().
-+bool MediaControl::checkAvailableSensor(const std::string &sensorEntityName,
-+                                        const std::string &sinkEntityName)
-+{
-+    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__,
-+         sensorEntityName.c_str(), sinkEntityName.c_str());
-+
-+    std::string sensorEntityNameTmp = sensorEntityName;
-+    sensorEntityNameTmp.append(" ");
-+    size_t nameLen = sensorEntityNameTmp.length();
-+    for (auto &entity : mEntities) {
-+        int linksCount = entity.info.links;
-+        MediaLink *links = entity.links;
-+        for (int i = 0; i < linksCount; i++) {
-+            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
-+                char *entityName = entity.info.name;
-+                if (strncmp(entityName, sensorEntityNameTmp.c_str(), nameLen) == 0) {
-+                    return true;
-+                }
-+            }
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+// This function must be called after enumEntities().
-+int MediaControl::getI2CBusAddress(const string &sensorEntityName, const string &sinkEntityName, string *i2cBus)
-+{
-+    LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__, sensorEntityName.c_str(), sinkEntityName.c_str());
-+    CheckError(!i2cBus, UNKNOWN_ERROR, "i2cBus is nullptr");
-+
-+    for (auto &entity : mEntities) {
-+        int linksCount = entity.info.links;
-+        MediaLink *links = entity.links;
-+        char *entityName = nullptr;
-+        size_t sensorEntityNameLen = sensorEntityName.length();
-+        for (int i = 0; i < linksCount; i++) {
-+            if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0) {
-+                entityName = entity.info.name;
-+                break;
-+            }
-+        }
-+
-+        // entityName example: "imx319 10-0010", sensorEntityName example: "imx319"
-+        if (entityName && (strlen(entityName) > (sensorEntityNameLen + 1))) {
-+            *i2cBus = entityName + sensorEntityNameLen + 1;
-+            LOG2("i2cBus is %s", i2cBus->c_str());
-+            return OK;
-+        }
-+    }
-+
-+    return UNKNOWN_ERROR;
-+}
-+
-+void MediaControl::dumpTopologyDot()
-+{
-+    printf("digraph board {\n");
-+    printf("\trankdir=TB\n");
-+
-+    for (auto &entity : mEntities) {
-+        const media_entity_desc *info = &entity.info;
-+        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
-+        uint32_t numLinks = entity.numLinks;
-+        uint32_t npads;
-+        UNUSED(npads);
-+
-+        switch (info->type & MEDIA_ENT_TYPE_MASK) {
-+        case MEDIA_ENT_T_DEVNODE:
-+            // Although printf actually can print NULL pointer, but make check
-+            // to make KW happy.
-+            if (devname)
-+                printf("\tn%08x [label=\"%s\\n%s\", shape=box, style=filled, "
-+                    "fillcolor=yellow]\n",
-+                    info->id, info->name, devname);
-+            break;
-+
-+        case MEDIA_ENT_T_V4L2_SUBDEV:
-+            printf("\tn%08x [label=\"{{", info->id);
-+
-+            for (int i = 0, npads = 0; i < info->pads; ++i) {
-+                MediaPad *pad = entity.pads + i;
-+
-+                if (!(pad->flags & MEDIA_PAD_FL_SINK))
-+                    continue;
-+
-+                printf("%s<port%d> %d", npads ? " | " : "", i, i);
-+                npads++;
-+            }
-+
-+            printf("} | %s", info->name);
-+            if (devname)
-+                printf("\\n%s", devname);
-+            printf(" | {");
-+
-+            for (int i = 0, npads = 0; i < info->pads; ++i) {
-+                MediaPad *pad = entity.pads + i;
-+
-+                if (!(pad->flags & MEDIA_PAD_FL_SOURCE))
-+                    continue;
-+
-+                printf("%s<port%d> %d", npads ? " | " : "", i, i);
-+                npads++;
-+            }
-+
-+            printf("}}\", shape=Mrecord, style=filled, fillcolor=green]\n");
-+            break;
-+
-+        default:
-+            continue;
-+        }
-+
-+        for (uint32_t i = 0; i < numLinks; i++) {
-+             MediaLink *link = entity.links + i;
-+             MediaPad *source = link->source;
-+             MediaPad *sink = link->sink;
-+
-+            /*Only print the forward links of the entity*/
-+            if (source->entity != &entity)
-+                continue;
-+
-+            printf("\tn%08x", source->entity->info.id);
-+            if ((source->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
-+                printf(":port%u", source->index);
-+            printf(" -> ");
-+            printf("n%08x", sink->entity->info.id);
-+            if ((sink->entity->info.type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
-+                printf(":port%u", sink->index);
-+
-+            if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
-+                printf(" [style=bold]");
-+            else if (!(link->flags & MEDIA_LNK_FL_ENABLED))
-+                printf(" [style=dashed]");
-+            printf("\n");
-+        }
-+    }
-+
-+    printf("}\n");
-+}
-+
-+void MediaControl::dumpTopologyText()
-+{
-+    static const struct {
-+        __u32 flag;
-+        const char *name;
-+    } link_flags[] = {
-+        { MEDIA_LNK_FL_ENABLED, "ENABLED" },
-+        { MEDIA_LNK_FL_IMMUTABLE, "IMMUTABLE" },
-+        { MEDIA_LNK_FL_DYNAMIC, "DYNAMIC" },
-+    };
-+
-+    printf("Device topology\n");
-+
-+    for (auto &entity : mEntities) {
-+        const media_entity_desc *info = &entity.info;
-+        const char *devname = (entity.devname[0] ? entity.devname : nullptr);
-+        uint32_t numLinks = entity.numLinks;
-+
-+        uint32_t padding = printf("- entity %u: ", info->id);
-+        printf("%s (%u pad%s, %u link%s)\n", info->name,
-+            info->pads, info->pads > 1 ? "s" : "",
-+            numLinks, numLinks > 1 ? "s" : "");
-+        printf("%*ctype %s subtype %s flags %x\n", padding, ' ',
-+            padType2String(info->type),
-+            entitySubtype2String(info->type),
-+            info->flags);
-+        if (devname)
-+            printf("%*cdevice node name %s\n", padding, ' ', devname);
-+
-+        for (int i = 0; i < info->pads; i++) {
-+            MediaPad *pad = entity.pads + i;
-+
-+            printf("\tpad%d: %s\n", i, padType2String(pad->flags));
-+
-+            /*
-+             *if ((info->type & MEDIA_ENT_TYPE_MASK) == MEDIA_ENT_T_V4L2_SUBDEV)
-+             *v4l2_subdev_print_format(entity, i, V4L2_SUBDEV_FORMAT_ACTIVE);
-+             */
-+            for (uint32_t j = 0; j < numLinks; j++) {
-+                MediaLink *link = entity.links + j;
-+                MediaPad *source = link->source;
-+                MediaPad *sink = link->sink;
-+                bool first = true;
-+
-+                if (source->entity == &entity && source->index == j)
-+                    printf("\t\t-> \"%s\":%u [", sink->entity->info.name,
-+                       sink->index);
-+                else if (sink->entity == &entity && sink->index == j)
-+                    printf("\t\t<- \"%s\":%u [", source->entity->info.name,
-+                       source->index);
-+                else
-+                    continue;
-+
-+                for (uint32_t k = 0; k < ARRAY_SIZE(link_flags); k++) {
-+                    if (!(link->flags & link_flags[k].flag))
-+                        continue;
-+                    if (!first)
-+                        printf(",");
-+                    printf("%s", link_flags[k].name);
-+                    first = false;
-+                }
-+
-+                printf("]\n");
-+            }
-+        }
-+        printf("\n");
-+    }
-+}
-+
-+void MediaControl::dumpEntityTopology(bool dot)
-+{
-+    if (Log::isDumpMediaTopo()) {
-+        if (dot)
-+            dumpTopologyDot();
-+        else
-+            dumpTopologyText();
-+    }
-+}
-+} // namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/v4l2/MediaControl.h b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
-new file mode 100644
-index 000000000000..bf2850731f08
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/MediaControl.h
-@@ -0,0 +1,302 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <vector>
-+#include <string>
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <unistd.h>
-+#include <fcntl.h>
-+#include <sys/ioctl.h>
-+#include <string.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <errno.h>
-+#include <linux/v4l2-subdev.h>
-+#include <linux/media.h>
-+#include <expat.h>
-+
-+#include <v4l2_device.h>
-+
-+#include "CameraTypes.h"
-+#include "iutils/Thread.h"
-+
-+#include "NodeInfo.h"
-+
-+using namespace std;
-+namespace icamera {
-+
-+struct MediaEntity;
-+struct MediaPad;
-+struct MediaLink;
-+
-+#define MEDIACTLDEVNAME "/dev/media0"
-+
-+enum {
-+    FC_FORMAT = 0,
-+    FC_SELECTION = 1,
-+};
-+
-+enum ResolutionType {
-+    RESOLUTION_MAX = 0,
-+    RESOLUTION_COMPOSE,
-+    RESOLUTION_CROP,
-+    RESOLUTION_TARGET,
-+
-+};
-+
-+struct McFormat {
-+    int entity;
-+    int pad;
-+    int stream;
-+    int formatType;
-+    int selCmd;
-+    int top;
-+    int left;
-+    int width;
-+    int height;
-+    enum ResolutionType type;
-+    std::string entityName;
-+    unsigned int pixelCode;
-+    McFormat() {
-+        entity = 0;
-+        pad = 0;
-+        stream = 0;
-+        formatType = 0;
-+        selCmd = 0;
-+        top = 0;
-+        left = 0;
-+        width = 0;
-+        height = 0;
-+        type = RESOLUTION_MAX;
-+        pixelCode = 0;}
-+};
-+
-+struct McOutput {
-+    Port port;
-+    unsigned int v4l2Format;
-+    int width;
-+    int height;
-+    McOutput() { port = INVALID_PORT; v4l2Format = 0; width = 0; height = 0; }
-+};
-+
-+struct McCtl {
-+    int entity;
-+    int ctlCmd;
-+    int ctlValue;
-+    std::string ctlName;
-+    std::string entityName;
-+    McCtl() { entity = 0; ctlCmd = 0; ctlValue= 0; }
-+};
-+
-+struct McLink {
-+    int srcEntity;
-+    int srcPad;
-+    int sinkEntity;
-+    int sinkPad;
-+    bool enable;
-+    std::string srcEntityName;
-+    std::string sinkEntityName;
-+    McLink() { srcEntity = 0; srcPad = 0; sinkEntity = 0; sinkPad = 0; enable = false; }
-+};
-+
-+struct McRoute {
-+    int entity;
-+    uint32_t sinkPad;
-+    uint32_t sinkStream;
-+    uint32_t srcPad;
-+    uint32_t srcStream;
-+    uint32_t flag;
-+    std::string entityName;
-+    McRoute() { entity = 0; sinkPad = 0; srcPad = 0; sinkStream = 0; srcStream = 0; flag = 0; entityName.clear(); }
-+};
-+
-+struct McVideoNode {
-+    std::string name;
-+    VideoNodeType videoNodeType;
-+    McVideoNode() { videoNodeType = VIDEO_GENERIC; }
-+};
-+
-+struct MediaCtlConf {
-+    std::vector <McCtl> ctls;
-+    std::vector <McLink> links;
-+    std::vector <McRoute> routes;
-+    std::vector <McFormat> formats;
-+    std::vector <McOutput> outputs;
-+    std::vector <McVideoNode> videoNodes;
-+    int mcId;
-+    int outputWidth;
-+    int outputHeight;
-+    std::vector <ConfigMode> configMode;
-+    int format;
-+    /*
-+     * The outputWidth or outputHeight is 0 if there isn't this setting
-+     * in MediaCtlConf. It means the isys output size is dynamic, and
-+     * we don't use stream size to select MC.
-+     */
-+    MediaCtlConf() {
-+        mcId = -1;
-+        outputWidth = 0;
-+        outputHeight = 0;
-+        format = -1;
-+    }
-+};
-+
-+/**
-+ * \class MediaController
-+ *
-+ * This class is used for discovering and configuring the internal topology
-+ * of a media device. Devices are modelled as an oriented graph of building
-+ * blocks called media entities. The media entities are connected to each other
-+ * through pads.
-+ *
-+ * Each media entity corresponds to a V4L2 subdevice. This class is also used
-+ * for configuring the V4L2 subdevices.
-+ */
-+
-+class MediaControl {
-+public:
-+    /**
-+     * \brief Get the singleton instance of MediaControl
-+     */
-+    static MediaControl* getInstance();
-+
-+    /**
-+     * \brief Release the singleton instance of MediaControl.
-+     */
-+    static void releaseInstance();
-+
-+    /**
-+     * \brief Enum entities and link, and reset all links
-+     *
-+     * \return 0 if succeed, other value indicates failed
-+     */
-+    int initEntities();
-+
-+    /**
-+     * \brief Free all entities and links memory
-+     */
-+    void clearEntities();
-+
-+    /**
-+     * \brief Get the entity by name
-+     *
-+     * \return entity id if succeed or -1 if error
-+     */
-+    int getEntityIdByName(const char *name);
-+
-+    /**
-+     * \brief Get VCM I2C bus address
-+     *
-+     * \return 0 if succeed, other value indicates failed
-+     */
-+    int getVCMI2CAddr(const char* vcmName, std::string* vcmI2CAddr);
-+
-+    /**
-+     * \brief Set up media controller pipe
-+     *
-+     * \param cameraId: the current camera id
-+     * \param mc: the MediaCtlConf got from platform data
-+     * \param sensorName: the sensor name get from platform data
-+     * \param width: The width of the request frame
-+     * \param height: The height of the request frame
-+     * \param format: The format of the request frame
-+     * \param field: The field of the request frame
-+     *
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int mediaCtlSetup(int cameraId, MediaCtlConf *mc, int width, int height, int field);
-+
-+    /**
-+     * \brief Clear media controller pipe
-+     *
-+     *
-+     * \param cameraId: the current camera id
-+     * \param mc: the MediaCtlConf got from platform data
-+     */
-+    void mediaCtlClear(int cameraId, MediaCtlConf *mc);
-+
-+    int resetAllLinks();
-+
-+    int getLensName(string *lensName);
-+    bool checkAvailableSensor(const std::string &sensorEntityName,
-+                              const std::string &sinkEntityName);
-+    /**
-+     * Getting I2C bus address by the name of sensor entity and the name of sensor's sink entity.
-+     *
-+     * \sensorEntityName: the name of sensor entity.
-+     * \sinkEntityName: the name of sensor's sink entity.
-+     * \i2cBus: I2C bus address.
-+     * \return OK if succeed, other value indicates failed
-+     */
-+    int getI2CBusAddress(const std::string &sensorEntityName, const std::string &sinkEntityName,
-+                         std::string *i2cBus);
-+private:
-+    MediaControl& operator=(const MediaControl&);
-+    MediaControl(const char *devName);
-+    ~MediaControl();
-+
-+    int openDevice();
-+    void closeDevice(int fd);
-+
-+    //enum MediaControl info.
-+    int enumInfo();
-+    int enumLinks(int fd);
-+    int enumEntities(int fd, media_device_info& devInfo);
-+
-+    //get entity info.
-+    int getDevnameFromSysfs(MediaEntity *entity);
-+    MediaEntity *getEntityById(uint32_t id);
-+    MediaEntity *getEntityByName(const char *name);
-+
-+    //set up entity link.
-+
-+    MediaLink *entityAddLink(MediaEntity *entity);
-+    int setupLink(uint32_t srcEntity, uint32_t srcPad, uint32_t sinkEntity, uint32_t sinkPad, bool enable);
-+    int setupLink(MediaPad *source, MediaPad *sink, uint32_t flags);
-+
-+    //set up MediaCtlConf info.
-+    int setMediaMcCtl(int cameraId, std::vector <McCtl> ctls);
-+    int setMediaMcLink(std::vector <McLink> links);
-+    int setFormat(int cameraId, const McFormat *format,
-+            int targetWidth, int targetHeight, int field);
-+    int setSelection(int cameraId, const McFormat *format,
-+            int targetWidth, int targetHeight);
-+
-+    /* Dump functions */
-+    void dumpInfo(media_device_info& devInfo);
-+    void dumpEntityDesc(media_entity_desc& desc, media_device_info& devInfo);
-+    void dumpPadDesc(media_pad_desc *pads, const int padsCount = 1, const char *name = nullptr);
-+    void dumpLinkDesc(media_link_desc *links, const int linksCount = 1);
-+    const char *entitySubtype2String(unsigned type);
-+    const char *padType2String(unsigned flag);
-+    void dumpEntityTopology(bool dot = true);
-+    void dumpTopologyDot();
-+    void dumpTopologyText();
-+
-+private:
-+    std::string mDevName;
-+    std::vector <MediaEntity> mEntities;
-+
-+private:
-+    static MediaControl *sInstance;
-+    static Mutex sLock;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
-new file mode 100644
-index 000000000000..2709861a757d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.cpp
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include "src/v4l2/NodeInfo.h"
-+
-+const VideoNodeInfo gVideoNodeInfos[] = {
-+    { VIDEO_GENERIC,             "VIDEO_GENERIC",              "Generic" },
-+    { VIDEO_GENERIC_MEDIUM_EXPO, "VIDEO_GENERIC_MEDIUM_EXPO",  "GenericMediumExpo" },
-+    { VIDEO_GENERIC_SHORT_EXPO,  "VIDEO_GENERIC_SHORT_EXPO",   "GenericShortExpo" },
-+
-+    { VIDEO_PIXEL_ARRAY,         "VIDEO_PIXEL_ARRAY",          "PixelArray" },
-+    { VIDEO_PIXEL_BINNER,        "VIDEO_PIXEL_BINNER",         "PixelBinner" },
-+    { VIDEO_PIXEL_SCALER,        "VIDEO_PIXEL_SCALER",         "PixelScaler" },
-+
-+    { VIDEO_ISYS_RECEIVER,       "VIDEO_ISYS_RECEIVER",        "ISysReceiver" },
-+    { VIDEO_ISYS_RECEIVER_BACKEND,  "VIDEO_ISYS_RECEIVER_BACKEND",  "CsiBE"},
-+};
-+
-+const char* GetNodeName(VideoNodeType nodeType)
-+{
-+    int size = ARRAY_SIZE(gVideoNodeInfos);
-+    for (int i = 0; i < size; i++) {
-+        if (gVideoNodeInfos[i].type == nodeType) {
-+            return gVideoNodeInfos[i].shortName;
-+        }
-+    }
-+    return "InvalidNode";
-+}
-+
-+VideoNodeType GetNodeType(const char* nodeName)
-+{
-+    int size = ARRAY_SIZE(gVideoNodeInfos);
-+    for (int i = 0; i < size; i++) {
-+        if (strcmp(gVideoNodeInfos[i].fullName, nodeName) == 0) {
-+            return gVideoNodeInfos[i].type;
-+        }
-+    }
-+
-+    return VIDEO_GENERIC;
-+}
-diff --git a/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
-new file mode 100644
-index 000000000000..c5905603a4c5
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/NodeInfo.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2020 Intel Corporation
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include "iutils/Utils.h"
-+
-+enum VideoNodeType {
-+    // video node device
-+    VIDEO_GENERIC,
-+    VIDEO_GENERIC_MEDIUM_EXPO,
-+    VIDEO_GENERIC_SHORT_EXPO,
-+
-+    // sensor subdevice
-+    VIDEO_PIXEL_ARRAY,
-+    VIDEO_PIXEL_BINNER,
-+    VIDEO_PIXEL_SCALER,
-+
-+    // ISP subdevice
-+    VIDEO_ISYS_RECEIVER,
-+    VIDEO_ISYS_RECEIVER_BACKEND,
-+};
-+
-+struct VideoNodeInfo {
-+    VideoNodeType type;
-+    const char* fullName;
-+    const char* shortName;
-+};
-+
-+enum EncodeBufferType {
-+    ENCODE_ISA_CONFIG  = 0,
-+    ENCODE_STATS = 1,
-+};
-+
-+extern const VideoNodeInfo gVideoNodeInfos[];
-+extern const char* GetNodeName(VideoNodeType nodeType);
-+extern VideoNodeType GetNodeType(const char* nodeName);
-diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
-new file mode 100644
-index 000000000000..2f82704d143b
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.cpp
-@@ -0,0 +1,212 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "SysCall"
-+
-+#include "iutils/CameraLog.h"
-+#include "SysCall.h"
-+
-+namespace icamera {
-+
-+static int sCreatedCount = 0;
-+bool SysCall::sIsInitialized = false;
-+SysCall *SysCall::sInstance = nullptr;
-+//Guard for singleton instance creation
-+Mutex SysCall::sLock;
-+
-+/*static*/ SysCall*
-+SysCall::getInstance()
-+{
-+    AutoMutex lock(sLock);
-+    if (!sIsInitialized) {
-+        //Use real sys call as default
-+        sInstance = new SysCall();
-+        sIsInitialized = true;
-+    }
-+    return sInstance;
-+}
-+
-+void SysCall::updateInstance(SysCall* newSysCall)
-+{
-+    LOG1("%s", __func__);
-+    AutoMutex lock(sLock);
-+    if (sIsInitialized) {
-+        sIsInitialized = false;
-+    }
-+    sInstance = newSysCall;
-+    if (newSysCall != nullptr)
-+        sIsInitialized = true;
-+}
-+
-+SysCall::SysCall()
-+{
-+    sCreatedCount++;
-+    LOG1("Syscall was created %d time", sCreatedCount);
-+}
-+
-+SysCall::~SysCall()
-+{
-+    sCreatedCount--;
-+    LOG1("Syscall was destructed %d time", sCreatedCount);
-+}
-+
-+int SysCall::open(const char *pathname, int flags)
-+{
-+    return ::open(pathname, flags);
-+}
-+
-+int SysCall::close(int fd)
-+{
-+    return ::close(fd);
-+}
-+
-+void *SysCall::mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off)
-+{
-+    return ::mmap(addr, len, prot, flag, filedes, off);
-+}
-+
-+int SysCall::munmap(void *addr, size_t len)
-+{
-+    return ::munmap(addr, len);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct media_device_info *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct media_link_desc *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct media_links_enum *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct media_links_desc *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct media_entity_desc *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_capability *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, v4l2_fmtdesc *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, enum v4l2_buf_type *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_format *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_requestbuffers *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_buffers *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_buffer *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_format *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_stream *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+int SysCall::ioctl(int fd, int request, struct v4l2_streamon_info *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_ext_controls *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_control *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_queryctrl *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_selection *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_subdev_routing *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_querymenu *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_event_subscription *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_event *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, struct v4l2_exportbuffer *arg)
-+{
-+    return ioctl(fd, request, (void *)arg);
-+}
-+
-+int SysCall::ioctl(int fd, int request, void *arg)
-+{
-+    int ret = 0;
-+    do {
-+        ret = ::ioctl(fd, request, arg);
-+    } while (-1 == ret && EINTR == errno);
-+
-+    return ret;
-+}
-+
-+int SysCall::poll(struct pollfd *pfd, nfds_t nfds, int timeout)
-+{
-+    int ret = 0;
-+    do {
-+        ret = ::poll(pfd, nfds, timeout);
-+    } while (-1 == ret && EINTR == errno);
-+
-+    return ret;
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/v4l2/SysCall.h b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
-new file mode 100644
-index 000000000000..4ef9c058455d
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/SysCall.h
-@@ -0,0 +1,87 @@
-+/*
-+ * Copyright (C) 2015-2018 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <fcntl.h>
-+#include <errno.h>
-+#include <poll.h>
-+#include <unistd.h>
-+#include <sys/ioctl.h>
-+#include <sys/mman.h>
-+#include <linux/media.h>
-+#include <linux/videodev2.h>
-+#include <linux/v4l2-subdev.h>
-+
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+class SysCall {
-+protected:
-+    SysCall();
-+    virtual ~SysCall();
-+
-+public:
-+    virtual int open(const char *pathname, int flags);
-+    virtual int close(int fd);
-+    virtual void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
-+    virtual int munmap(void *addr, size_t len);
-+
-+    virtual int ioctl(int fd, int request, struct media_device_info *arg);
-+    virtual int ioctl(int fd, int request, struct media_link_desc *arg);
-+    virtual int ioctl(int fd, int request, struct media_links_enum *arg);
-+    virtual int ioctl(int fd, int request, struct media_links_desc *arg);
-+    virtual int ioctl(int fd, int request, struct media_entity_desc *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_capability *arg);
-+    virtual int ioctl(int fd, int request, v4l2_fmtdesc *arg);
-+    virtual int ioctl(int fd, int request, enum v4l2_buf_type *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_format *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_requestbuffers *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_buffers *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_buffer *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_subdev_format *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_subdev_stream *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_streamon_info *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_ext_controls *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_control *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_queryctrl *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_subdev_selection *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_subdev_routing *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_querymenu *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_event_subscription *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_event *arg);
-+    virtual int ioctl(int fd, int request, struct v4l2_exportbuffer *arg);
-+
-+    virtual int poll(struct pollfd *pfd, nfds_t nfds, int timeout);
-+
-+private:
-+        int ioctl(int fd, int request, void *arg);
-+
-+public:
-+    static SysCall* getInstance();
-+    static void updateInstance(SysCall* newSysCall);
-+private:
-+    SysCall&   operator=(const SysCall&);         //Don't call me
-+
-+    static bool sIsInitialized;
-+    static SysCall *sInstance;
-+    static Mutex sLock;
-+};
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
-new file mode 100644
-index 000000000000..90950d2d04c8
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp
-@@ -0,0 +1,126 @@
-+/*
-+ * Copyright (C) 2015-2020 Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#define LOG_TAG "V4l2DeviceFactory"
-+
-+#include <fcntl.h>
-+
-+#include "iutils/CameraLog.h"
-+
-+#include "V4l2DeviceFactory.h"
-+
-+using namespace std;
-+
-+namespace icamera {
-+
-+map<int, V4l2DeviceFactory*> V4l2DeviceFactory::sInstances;
-+Mutex V4l2DeviceFactory::sLock;
-+
-+V4l2DeviceFactory::V4l2DeviceFactory(int cameraId) : mCameraId(cameraId)
-+{
-+    LOG1("V4l2DeviceFactory created for id:%d", mCameraId);
-+}
-+
-+V4l2DeviceFactory::~V4l2DeviceFactory()
-+{
-+    LOG1("V4l2DeviceFactory released for id:%d", mCameraId);
-+}
-+
-+/**
-+ * Create a static instance of V4l2DeviceFactory for cameraId.
-+ * It should be called before any device is used.
-+ */
-+void V4l2DeviceFactory::createDeviceFactory(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    getInstance(cameraId);
-+}
-+
-+/**
-+ * Release the static instance of V4l2DeviceFactory for cameraId.
-+ * All device related to the instance of of V4l2DeviceFactory will be release here as well
-+ * After calling this function, all device could not be used anymore.
-+ */
-+void V4l2DeviceFactory::releaseDeviceFactory(int cameraId)
-+{
-+    AutoMutex lock(sLock);
-+    V4l2DeviceFactory* factory = getInstance(cameraId);
-+    sInstances.erase(cameraId);
-+    factory->releaseSubDevices(cameraId);
-+    delete factory;
-+}
-+
-+/**
-+ * Get an opened sub device
-+ *
-+ * The caller is supposed to get an opened sub device.
-+ * If openSubDev failed, it just return non-opened instance,
-+ * and using this instance to call its funtion will cause 'device not open' error,
-+ *
-+ * Return a not nullptr sub device pointer
-+ */
-+V4L2Subdevice* V4l2DeviceFactory::getSubDev(int cameraId, const string& devName)
-+{
-+    AutoMutex lock(sLock);
-+    V4l2DeviceFactory* factory = getInstance(cameraId);
-+    // If an existing sub device found, then just return it.
-+
-+    if (factory->mDevices.find(devName) != factory->mDevices.end()) {
-+        return factory->mDevices[devName];
-+    }
-+    // Create a new sub device for devName, since it's not created before.
-+    V4L2Subdevice* subdev = new V4L2Subdevice(devName);
-+
-+    // Make sure the caller always got an opened device.
-+    subdev->Open(O_RDWR);
-+    // Add the new allocated sub device into device map.
-+    factory->mDevices[devName] = subdev;
-+    return subdev;
-+}
-+
-+/**
-+ * Release all sub devices in device map
-+ *
-+ * It's a private function with no lock in it, must be called with lock protection.
-+ *
-+ * It MUST be called after all sub devices are not used anymore
-+ */
-+void V4l2DeviceFactory::releaseSubDevices(int  /*cameraId*/)
-+{
-+    for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
-+        V4L2Subdevice* subdev = it->second;
-+        if (subdev) {
-+            subdev->Close();
-+            delete subdev;
-+        }
-+    }
-+    mDevices.clear();
-+}
-+
-+/**
-+ * Private function with no lock in it, must be called with lock protection
-+ */
-+V4l2DeviceFactory* V4l2DeviceFactory::getInstance(int cameraId)
-+{
-+    if (sInstances.find(cameraId) != sInstances.end()) {
-+        return sInstances[cameraId];
-+    }
-+
-+    sInstances[cameraId] = new V4l2DeviceFactory(cameraId);
-+    return sInstances[cameraId];
-+}
-+
-+} //namespace icamera
-diff --git a/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
-new file mode 100644
-index 000000000000..115187d5fa37
---- /dev/null
-+++ b/camera/hal/intel/ipu6/src/v4l2/V4l2DeviceFactory.h
-@@ -0,0 +1,61 @@
-+/*
-+ * Copyright (C) 2015-2020 Intel Corporation.
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ *      http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#pragma once
-+
-+#include <v4l2_device.h>
-+
-+#include <map>
-+#include <string>
-+
-+#include "iutils/Utils.h"
-+#include "iutils/Thread.h"
-+
-+namespace icamera {
-+
-+/**
-+ * Create all v4l2 devices, and provide users an opened device pointer,
-+ * the users should not release any instance got from this factory,
-+ * all devices will be released together by releaseDeviceFactory.
-+ *
-+ * Currently only sub device is supported.
-+ *
-+ * TODO: Next step, all v4l2 devices should be managed by this class
-+ */
-+class V4l2DeviceFactory {
-+public:
-+    static void createDeviceFactory(int cameraId);
-+    static void releaseDeviceFactory(int cameraId);
-+
-+    static V4L2Subdevice* getSubDev(int cameraId, const std::string& devName);
-+
-+private:
-+    V4l2DeviceFactory(int cameraId);
-+    ~V4l2DeviceFactory();
-+
-+    static V4l2DeviceFactory* getInstance(int cameraId);
-+    void releaseSubDevices(int cameraId);
-+
-+private:
-+    static std::map<int, V4l2DeviceFactory*> sInstances;
-+    //Guard for V4l2DeviceFactory public API access
-+    static Mutex sLock;
-+
-+    int mCameraId;
-+    std::map<std::string, V4L2Subdevice*> mDevices;
-+};
-+
-+} //namespace icamera
--- 
-2.7.4
-
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/files/0002-intel-ipu6-Add-initial-code-2nd-part.patch b/media-libs/cros-camera-hal-intel-ipu6-squash/files/0002-intel-ipu6-Add-initial-code-2nd-part.patch
new file mode 100644
index 0000000..381baf8
--- /dev/null
+++ b/media-libs/cros-camera-hal-intel-ipu6-squash/files/0002-intel-ipu6-Add-initial-code-2nd-part.patch
@@ -0,0 +1,140681 @@
+From 65179a5e8c4bca0a01af261ccfdbaa6146eee424 Mon Sep 17 00:00:00 2001
+From: Liang Yang <liang.l.yang@intel.com>
+Date: Wed, 17 Jun 2020 16:43:59 +0800
+Subject: [PATCH 2/2] intel:ipu6: Add initial code (2nd part)
+
+It includes the ia_xxx files.
+
+Change-Id: Ic138ca4f11237aca9878ac35e8fdd11ecdaf50c0
+Signed-off-by: Liang Yang <liang.l.yang@intel.com>
+Signed-off-by: Tianshu Qiu <tian.shu.qiu@intel.com>
+---
+ .../hal/intel/ipu6/include/gcss/GCSSParser.h  |    69 +
+ camera/hal/intel/ipu6/include/gcss/gcss.h     |   284 +
+ .../intel/ipu6/include/gcss/gcss_aic_utils.h  |   330 +
+ .../intel/ipu6/include/gcss/gcss_isp_utils.h  |   153 +
+ .../hal/intel/ipu6/include/gcss/gcss_item.h   |   272 +
+ .../hal/intel/ipu6/include/gcss/gcss_keys.h   |   144 +
+ .../hal/intel/ipu6/include/gcss/gcss_utils.h  |   642 +
+ .../ipu6/include/gcss/graph_query_manager.h   |   157 +
+ .../hal/intel/ipu6/include/gcss/graph_utils.h |   454 +
+ .../ipu6/include/ia_cipf/ia_cipf_types.h      |   414 +
+ .../ipu6/include/ia_cipf_css/ia_cipf_css.h    |  1021 +
+ .../intel/ipu6/include/ia_imaging/AIQResult.h |    28 +
+ .../intel/ipu6/include/ia_imaging/CCAMacro.h  |    71 +
+ .../ipu6/include/ia_imaging/CCAStorage.h      |    33 +
+ .../intel/ipu6/include/ia_imaging/IIPUAic.h   |   274 +
+ .../ipu6/include/ia_imaging/IntelCCATypes.h   |   550 +
+ .../intel/ipu6/include/ia_imaging/ia_aec.h    |    81 +
+ .../ipu6/include/ia_imaging/ia_aec_types.h    |   143 +
+ .../ipu6/include/ia_imaging/ia_aic_myriad.h   |   181 +
+ .../intel/ipu6/include/ia_imaging/ia_aiq.h    |   621 +
+ .../include/ia_imaging/ia_aiq_deprecated.h    |   266 +
+ .../ipu6/include/ia_imaging/ia_aiq_types.h    |   911 +
+ .../ipu6/include/ia_imaging/ia_aiqb_encode.h  |    81 +
+ .../ipu6/include/ia_imaging/ia_aiqb_parser.h  |   134 +
+ .../intel/ipu6/include/ia_imaging/ia_alloc.h  |   121 +
+ .../intel/ipu6/include/ia_imaging/ia_bcomp.h  |    89 +
+ .../ipu6/include/ia_imaging/ia_bcomp_types.h  |    68 +
+ .../intel/ipu6/include/ia_imaging/ia_ccat.h   |   650 +
+ .../ipu6/include/ia_imaging/ia_ccat_params.h  |    48 +
+ .../ipu6/include/ia_imaging/ia_ccat_types.h   |   244 +
+ .../ipu6/include/ia_imaging/ia_cmc_parser.h   |    47 +
+ .../ia_imaging/ia_cmc_parser_deprecated.h     |    42 +
+ .../ipu6/include/ia_imaging/ia_cmc_types.h    |  1471 +
+ .../include/ia_imaging/ia_configuration.h     |    72 +
+ .../ipu6/include/ia_imaging/ia_coordinate.h   |   149 +
+ .../intel/ipu6/include/ia_imaging/ia_dpc.h    |   133 +
+ .../intel/ipu6/include/ia_imaging/ia_dvs.h    |   286 +
+ .../include/ia_imaging/ia_dvs_deprecated.h    |    96 +
+ .../ipu6/include/ia_imaging/ia_dvs_types.h    |   304 +
+ .../ipu6/include/ia_imaging/ia_emd_decoder.h  |   103 +
+ .../ipu6/include/ia_imaging/ia_emd_types.h    |   205 +
+ .../intel/ipu6/include/ia_imaging/ia_exc.h    |   153 +
+ .../include/ia_imaging/ia_exc_deprecated.h    |   171 +
+ .../ipu6/include/ia_imaging/ia_intrinsics.h   |   138 +
+ .../include/ia_imaging/ia_intrinsics_types.h  |    58 +
+ .../ipu6/include/ia_imaging/ia_isp_bxt.h      |   916 +
+ .../ia_imaging/ia_isp_bxt_deprecated.h        |   641 +
+ .../ia_imaging/ia_isp_bxt_statistics_types.h  |   201 +
+ .../include/ia_imaging/ia_isp_bxt_types.h     |   202 +
+ .../ipu6/include/ia_imaging/ia_isp_types.h    |    97 +
+ .../intel/ipu6/include/ia_imaging/ia_lard.h   |   150 +
+ .../intel/ipu6/include/ia_imaging/ia_log.h    |    93 +
+ .../intel/ipu6/include/ia_imaging/ia_ltm.h    |   146 +
+ .../include/ia_imaging/ia_ltm_deprecated.h    |   103 +
+ .../ipu6/include/ia_imaging/ia_ltm_types.h    |   151 +
+ .../ipu6/include/ia_imaging/ia_me_corner.h    |   142 +
+ .../ipu6/include/ia_imaging/ia_mkn_decoder.h  |   138 +
+ .../ipu6/include/ia_imaging/ia_mkn_encoder.h  |   167 +
+ .../ipu6/include/ia_imaging/ia_mkn_types.h    |   165 +
+ .../intel/ipu6/include/ia_imaging/ia_nvm.h    |   183 +
+ .../hal/intel/ipu6/include/ia_imaging/ia_ob.h |    92 +
+ .../intel/ipu6/include/ia_imaging/ia_p2p.h    |  1977 ++
+ .../ipu6/include/ia_imaging/ia_p2p_types.h    |   221 +
+ .../ipu6/include/ia_imaging/ia_pal_direct.h   |    80 +
+ .../ipu6/include/ia_imaging/ia_pal_exports.h  |    38 +
+ .../include/ia_imaging/ia_pal_output_data.h   |    45 +
+ .../include/ia_imaging/ia_pal_types_isp.h     |    54 +
+ .../ia_imaging/ia_pal_types_isp_ids_autogen.h |   379 +
+ .../ia_pal_types_isp_parameters_autogen.h     | 16016 +++++++++
+ .../include/ia_imaging/ia_statistics_types.h  |   111 +
+ .../intel/ipu6/include/ia_imaging/ia_types.h  |   316 +
+ .../intel/ipu6/include/ia_imaging/ia_view.h   |   163 +
+ .../ipu6/include/ia_imaging/ia_view_types.h   |   220 +
+ .../include/ia_imaging/pvl_blink_detection.h  |   218 +
+ .../ipu6/include/ia_imaging/pvl_config.h      |    93 +
+ .../include/ia_imaging/pvl_eye_detection.h    |   161 +
+ .../include/ia_imaging/pvl_face_detection.h   |   275 +
+ .../include/ia_imaging/pvl_face_recognition.h |   478 +
+ .../include/ia_imaging/pvl_image_montage.h    |   234 +
+ .../ia_imaging/pvl_landmark_detection.h       |   140 +
+ .../include/ia_imaging/pvl_mouth_detection.h  |   159 +
+ .../include/ia_imaging/pvl_object_tracking.h  |   243 +
+ .../ipu6/include/ia_imaging/pvl_panorama.h    |   267 +
+ .../ia_imaging/pvl_pedestrian_detection.h     |   227 +
+ .../ia_imaging/pvl_perspective_control.h      |   413 +
+ .../include/ia_imaging/pvl_smile_detection.h  |   247 +
+ .../intel/ipu6/include/ia_imaging/pvl_types.h |   177 +
+ .../ia_imaging/tnr7us_parameters_definition.h |   114 +
+ .../intel/ipu6/include/ia_tools/css_types.h   |    62 +
+ .../hal/intel/ipu6/include/ia_tools/ia_list.h |   116 +
+ .../include/igfxcmrt/cm_hw_vebox_cmd_g10.h    | 27995 ++++++++++++++++
+ .../hal/intel/ipu6/include/igfxcmrt/cm_rt.h   |  1562 +
+ .../ipu6/include/igfxcmrt/cm_rt_api_os.h      |   220 +
+ .../ipu6/include/igfxcmrt/cm_rt_def_os.h      |   378 +
+ .../ipu6/include/igfxcmrt/cm_rt_extension.h   |     1 +
+ .../intel/ipu6/include/igfxcmrt/cm_rt_g10.h   |    70 +
+ .../intel/ipu6/include/igfxcmrt/cm_rt_g11.h   |    62 +
+ .../ipu6/include/igfxcmrt/cm_rt_g12_tgl.h     |    51 +
+ .../intel/ipu6/include/igfxcmrt/cm_rt_g8.h    |  3742 +++
+ .../intel/ipu6/include/igfxcmrt/cm_rt_g9.h    |  1417 +
+ .../ipu6/modules/ia_cipr/include/Buffer.h     |    62 +
+ .../ipu6/modules/ia_cipr/include/Command.h    |    50 +
+ .../ipu6/modules/ia_cipr/include/Context.h    |    69 +
+ .../ipu6/modules/ia_cipr/include/Event.h      |    40 +
+ .../ipu6/modules/ia_cipr/include/Types.h      |   198 +
+ .../ipu6/modules/ia_cipr/include/Utils.h      |    30 +
+ .../ipu6/modules/ia_cipr/include/ipu-psys.h   |   112 +
+ .../intel/ipu6/modules/ia_cipr/src/Buffer.cpp |   388 +
+ .../ipu6/modules/ia_cipr/src/Command.cpp      |   203 +
+ .../ipu6/modules/ia_cipr/src/Context.cpp      |   313 +
+ .../intel/ipu6/modules/ia_cipr/src/Event.cpp  |   118 +
+ .../intel/ipu6/modules/ia_cipr/src/Utils.cpp  |    64 +
+ .../ia_css/ipu6/include/assert_support.h      |   210 +
+ .../ia_css/ipu6/include/cpu_mem_support.h     |   239 +
+ .../ia_css/ipu6/include/error_support.h       |   112 +
+ .../ia_css/ipu6/include/frame_support.h       |    63 +
+ .../ia_css/ipu6/include/ia_css_base_types.h   |    55 +
+ .../ipu6/include/ia_css_isa_parameter_defs.h  |   789 +
+ .../include/ia_css_isa_parameter_defs_dep.h   |   580 +
+ .../ipu6/include/ia_css_kernel_bitmap.h       |   262 +
+ .../ipu6/include/ia_css_kernel_bitmap_impl.h  |   340 +
+ .../ia_css_kernel_bitmap_storage_class.h      |    30 +
+ .../include/ia_css_kernel_user_param_types.h  |    88 +
+ .../ipu6/include/ia_css_param_storage_class.h |    30 +
+ .../ipu6/include/ia_css_program_group_data.h  |   449 +
+ .../include/ia_css_program_group_data_defs.h  |   244 +
+ .../include/ia_css_program_group_data_impl.h  |   461 +
+ .../ipu6/include/ia_css_program_group_param.h |   295 +
+ .../include/ia_css_program_group_param.sim.h  |   155 +
+ .../ia_css_program_group_param_private.h      |    85 +
+ .../ia_css_program_group_param_types.h        |    66 +
+ .../ipu6/include/ia_css_psys_buffer_set.h     |   290 +
+ .../include/ia_css_psys_data_storage_class.h  |    30 +
+ .../ipu6/include/ia_css_psys_data_trace.h     |   104 +
+ .../ia_css_psys_dynamic_storage_class.h       |    30 +
+ .../ipu6/include/ia_css_psys_dynamic_trace.h  |   105 +
+ .../ipu6/include/ia_css_psys_kernel_trace.h   |   105 +
+ .../ipu6/include/ia_css_psys_manifest_types.h |   108 +
+ .../ipu6/include/ia_css_psys_param_trace.h    |   104 +
+ .../include/ia_css_psys_private_pg_data.h     |    53 +
+ .../ia_css/ipu6/include/ia_css_psys_process.h |   395 +
+ .../include/ia_css_psys_process.hsys.kernel.h |   159 +
+ .../include/ia_css_psys_process.hsys.user.h   |    94 +
+ .../ipu6/include/ia_css_psys_process.psys.h   |    54 +
+ .../ipu6/include/ia_css_psys_process_group.h  |   487 +
+ .../ia_css_psys_process_group.hsys.kernel.h   |   379 +
+ .../ia_css_psys_process_group.hsys.user.h     |   224 +
+ .../include/ia_css_psys_process_group.psys.h  |    61 +
+ .../ia_css_psys_process_group_cmd_impl.h      |   280 +
+ .../include/ia_css_psys_process_group_impl.h  |  1846 +
+ .../ipu6/include/ia_css_psys_process_impl.h   |   694 +
+ .../ia_css_psys_process_private_types.h       |   135 +
+ .../ipu6/include/ia_css_psys_process_types.h  |    98 +
+ .../ia_css_psys_program_group_manifest.h      |   320 +
+ ...ss_psys_program_group_manifest.hsys.user.h |    78 +
+ .../ia_css_psys_program_group_manifest.sim.h  |   131 +
+ .../ia_css_psys_program_group_manifest_impl.h |   417 +
+ .../ia_css_psys_program_group_private.h       |   278 +
+ .../include/ia_css_psys_program_manifest.h    |   679 +
+ ...ia_css_psys_program_manifest.hsys.kernel.h |   105 +
+ .../ia_css_psys_program_manifest.hsys.user.h  |    41 +
+ .../ia_css_psys_program_manifest.sim.h        |    65 +
+ .../ia_css_psys_program_manifest_impl.h       |   577 +
+ .../include/ia_css_psys_sim_storage_class.h   |    30 +
+ .../ipu6/include/ia_css_psys_sim_trace.h      |    97 +
+ .../ia_css_psys_static_storage_class.h        |    30 +
+ .../ipu6/include/ia_css_psys_static_trace.h   |   105 +
+ .../ipu6/include/ia_css_psys_terminal.h       |   403 +
+ .../include/ia_css_psys_terminal.hsys.user.h  |   257 +
+ .../ipu6/include/ia_css_psys_terminal_impl.h  |  2053 ++
+ .../include/ia_css_psys_terminal_manifest.h   |   621 +
+ .../ia_css_psys_terminal_manifest.hsys.user.h |    40 +
+ .../ia_css_psys_terminal_manifest.sim.h       |    50 +
+ .../ia_css_psys_terminal_manifest_impl.h      |   745 +
+ .../ia_css_psys_terminal_private_types.h      |   102 +
+ .../ipu6/include/ia_css_psys_transport.h      |    96 +
+ .../ipu6/include/ia_css_psys_transport_dep.h  |    66 +
+ .../ia_css/ipu6/include/ia_css_psysapi.h      |    25 +
+ .../ipu6/include/ia_css_psysapi_fw_version.h  |    35 +
+ .../ipu6/include/ia_css_psysapi_trace.h       |    80 +
+ .../modules/ia_css/ipu6/include/ia_css_rbm.h  |   199 +
+ .../ia_css/ipu6/include/ia_css_rbm_impl.h     |   410 +
+ .../ia_css/ipu6/include/ia_css_rbm_manifest.h |   146 +
+ .../ipu6/include/ia_css_rbm_manifest_types.h  |    96 +
+ .../ipu6/include/ia_css_rbm_storage_class.h   |    38 +
+ .../ia_css/ipu6/include/ia_css_rbm_trace.h    |    79 +
+ .../ia_css/ipu6/include/ia_css_terminal.h     |   187 +
+ .../ipu6/include/ia_css_terminal_base_types.h |    53 +
+ .../ipu6/include/ia_css_terminal_defs.h       |   209 +
+ .../ipu6/include/ia_css_terminal_impl.h       |   497 +
+ .../ipu6/include/ia_css_terminal_manifest.h   |   233 +
+ .../ia_css_terminal_manifest_base_types.h     |    75 +
+ .../include/ia_css_terminal_manifest_impl.h   |   391 +
+ .../include/ia_css_terminal_manifest_types.h  |   349 +
+ .../ipu6/include/ia_css_terminal_types.h      |   477 +
+ .../ia_css/ipu6/include/ia_css_trace.h        |  1002 +
+ .../ipu6/include/ipu_device_acb_devices.h     |    58 +
+ .../ipu6/include/ipu_device_gp_devices.h      |   205 +
+ .../ia_css/ipu6/include/math_support.h        |   328 +
+ .../ia_css/ipu6/include/misc_support.h        |    78 +
+ .../ipu6/include/pg_control_init_framework.h  |    78 +
+ .../ia_css/ipu6/include/platform_support.h    |   194 +
+ .../ia_css/ipu6/include/print_support.h       |   121 +
+ .../ipu6/include/psys_system_global_impl.h    |   504 +
+ .../ia_css/ipu6/include/storage_class.h       |    55 +
+ .../ia_css/ipu6/include/type_support.h        |    82 +
+ .../ipu6/include/vied_nci_acb_route_type.h    |    41 +
+ .../include/vied_nci_psys_resource_model.h    |   380 +
+ .../include/vied_nci_psys_system_global.h     |   186 +
+ .../ia_css/ipu6/src/ia_css_kernel_bitmap.c    |   151 +
+ .../ipu6/src/ia_css_program_group_data.c      |    28 +
+ .../ipu6/src/ia_css_program_group_param.c     |   769 +
+ .../ia_css/ipu6/src/ia_css_psys_process.c     |  1038 +
+ .../ipu6/src/ia_css_psys_process_group.c      |   826 +
+ .../src/ia_css_psys_process_group_cmd_impl.c  |   137 +
+ .../src/ia_css_psys_program_group_manifest.c  |  1081 +
+ .../ipu6/src/ia_css_psys_program_manifest.c   |   972 +
+ .../ia_css/ipu6/src/ia_css_psys_terminal.c    |   534 +
+ .../ipu6/src/ia_css_psys_terminal_manifest.c  |   776 +
+ .../ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c |    19 +
+ .../modules/ia_css/ipu6/src/ia_css_terminal.c |    22 +
+ .../ipu6/src/ia_css_terminal_manifest.c       |    22 +
+ .../ia_css/ipu6/src/vied_nci_psys_system.c    |    28 +
+ .../ia_css/ipu6se/include/assert_support.h    |   210 +
+ .../ia_css/ipu6se/include/cpu_mem_support.h   |   239 +
+ .../ia_css/ipu6se/include/error_support.h     |   112 +
+ .../ia_css/ipu6se/include/frame_support.h     |    63 +
+ .../ia_css/ipu6se/include/ia_css_base_types.h |    55 +
+ .../include/ia_css_isa_parameter_defs.h       |   789 +
+ .../include/ia_css_isa_parameter_defs_dep.h   |   580 +
+ .../ipu6se/include/ia_css_kernel_bitmap.h     |   262 +
+ .../include/ia_css_kernel_bitmap_impl.h       |   340 +
+ .../ia_css_kernel_bitmap_storage_class.h      |    30 +
+ .../include/ia_css_kernel_user_param_types.h  |    88 +
+ .../include/ia_css_param_storage_class.h      |    30 +
+ .../include/ia_css_program_group_data.h       |   449 +
+ .../include/ia_css_program_group_data_defs.h  |   244 +
+ .../include/ia_css_program_group_data_impl.h  |   461 +
+ .../include/ia_css_program_group_param.h      |   295 +
+ .../include/ia_css_program_group_param.sim.h  |   155 +
+ .../ia_css_program_group_param_private.h      |    85 +
+ .../ia_css_program_group_param_types.h        |    66 +
+ .../ipu6se/include/ia_css_psys_buffer_set.h   |   290 +
+ .../include/ia_css_psys_data_storage_class.h  |    30 +
+ .../ipu6se/include/ia_css_psys_data_trace.h   |   104 +
+ .../ia_css_psys_dynamic_storage_class.h       |    30 +
+ .../include/ia_css_psys_dynamic_trace.h       |   105 +
+ .../ipu6se/include/ia_css_psys_kernel_trace.h |   105 +
+ .../include/ia_css_psys_manifest_types.h      |   108 +
+ .../ipu6se/include/ia_css_psys_param_trace.h  |   104 +
+ .../include/ia_css_psys_private_pg_data.h     |    53 +
+ .../ipu6se/include/ia_css_psys_process.h      |   395 +
+ .../include/ia_css_psys_process.hsys.kernel.h |   159 +
+ .../include/ia_css_psys_process.hsys.user.h   |    94 +
+ .../ipu6se/include/ia_css_psys_process.psys.h |    54 +
+ .../include/ia_css_psys_process_group.h       |   487 +
+ .../ia_css_psys_process_group.hsys.kernel.h   |   379 +
+ .../ia_css_psys_process_group.hsys.user.h     |   224 +
+ .../include/ia_css_psys_process_group.psys.h  |    61 +
+ .../ia_css_psys_process_group_cmd_impl.h      |   280 +
+ .../include/ia_css_psys_process_group_impl.h  |  1846 +
+ .../ipu6se/include/ia_css_psys_process_impl.h |   694 +
+ .../ia_css_psys_process_private_types.h       |   135 +
+ .../include/ia_css_psys_process_types.h       |    98 +
+ .../ia_css_psys_program_group_manifest.h      |   320 +
+ ...ss_psys_program_group_manifest.hsys.user.h |    78 +
+ .../ia_css_psys_program_group_manifest.sim.h  |   131 +
+ .../ia_css_psys_program_group_manifest_impl.h |   417 +
+ .../ia_css_psys_program_group_private.h       |   278 +
+ .../include/ia_css_psys_program_manifest.h    |   679 +
+ ...ia_css_psys_program_manifest.hsys.kernel.h |   105 +
+ .../ia_css_psys_program_manifest.hsys.user.h  |    41 +
+ .../ia_css_psys_program_manifest.sim.h        |    65 +
+ .../ia_css_psys_program_manifest_impl.h       |   577 +
+ .../include/ia_css_psys_sim_storage_class.h   |    30 +
+ .../ipu6se/include/ia_css_psys_sim_trace.h    |    97 +
+ .../ia_css_psys_static_storage_class.h        |    30 +
+ .../ipu6se/include/ia_css_psys_static_trace.h |   105 +
+ .../ipu6se/include/ia_css_psys_terminal.h     |   403 +
+ .../include/ia_css_psys_terminal.hsys.user.h  |   257 +
+ .../include/ia_css_psys_terminal_impl.h       |  2053 ++
+ .../include/ia_css_psys_terminal_manifest.h   |   621 +
+ .../ia_css_psys_terminal_manifest.hsys.user.h |    40 +
+ .../ia_css_psys_terminal_manifest.sim.h       |    50 +
+ .../ia_css_psys_terminal_manifest_impl.h      |   745 +
+ .../ia_css_psys_terminal_private_types.h      |   102 +
+ .../ipu6se/include/ia_css_psys_transport.h    |    96 +
+ .../include/ia_css_psys_transport_dep.h       |    47 +
+ .../ia_css/ipu6se/include/ia_css_psysapi.h    |    25 +
+ .../include/ia_css_psysapi_fw_version.h       |    35 +
+ .../ipu6se/include/ia_css_psysapi_trace.h     |    80 +
+ .../ia_css/ipu6se/include/ia_css_rbm.h        |   199 +
+ .../ia_css/ipu6se/include/ia_css_rbm_impl.h   |   410 +
+ .../ipu6se/include/ia_css_rbm_manifest.h      |   146 +
+ .../include/ia_css_rbm_manifest_types.h       |    96 +
+ .../ipu6se/include/ia_css_rbm_storage_class.h |    38 +
+ .../ia_css/ipu6se/include/ia_css_rbm_trace.h  |    79 +
+ .../ia_css/ipu6se/include/ia_css_terminal.h   |   187 +
+ .../include/ia_css_terminal_base_types.h      |    53 +
+ .../ipu6se/include/ia_css_terminal_defs.h     |   209 +
+ .../ipu6se/include/ia_css_terminal_impl.h     |   497 +
+ .../ipu6se/include/ia_css_terminal_manifest.h |   233 +
+ .../ia_css_terminal_manifest_base_types.h     |    75 +
+ .../include/ia_css_terminal_manifest_impl.h   |   391 +
+ .../include/ia_css_terminal_manifest_types.h  |   349 +
+ .../ipu6se/include/ia_css_terminal_types.h    |   477 +
+ .../ia_css/ipu6se/include/ia_css_trace.h      |  1002 +
+ .../ipu6se/include/ipu_device_acb_devices.h   |    39 +
+ .../ipu6se/include/ipu_device_gp_devices.h    |   195 +
+ .../ia_css/ipu6se/include/math_support.h      |   328 +
+ .../ia_css/ipu6se/include/misc_support.h      |    78 +
+ .../include/pg_control_init_framework.h       |    78 +
+ .../ia_css/ipu6se/include/platform_support.h  |   194 +
+ .../ia_css/ipu6se/include/print_support.h     |   121 +
+ .../ipu6se/include/psys_system_global_impl.h  |   504 +
+ .../ia_css/ipu6se/include/storage_class.h     |    55 +
+ .../ia_css/ipu6se/include/type_support.h      |    82 +
+ .../ipu6se/include/vied_nci_acb_route_type.h  |    41 +
+ .../include/vied_nci_psys_resource_model.h    |   342 +
+ .../include/vied_nci_psys_system_global.h     |   186 +
+ .../ia_css/ipu6se/src/ia_css_kernel_bitmap.c  |   151 +
+ .../ipu6se/src/ia_css_program_group_data.c    |    28 +
+ .../ipu6se/src/ia_css_program_group_param.c   |   769 +
+ .../ia_css/ipu6se/src/ia_css_psys_process.c   |  1038 +
+ .../ipu6se/src/ia_css_psys_process_group.c    |   826 +
+ .../src/ia_css_psys_process_group_cmd_impl.c  |   137 +
+ .../src/ia_css_psys_program_group_manifest.c  |  1081 +
+ .../ipu6se/src/ia_css_psys_program_manifest.c |   972 +
+ .../ia_css/ipu6se/src/ia_css_psys_terminal.c  |   534 +
+ .../src/ia_css_psys_terminal_manifest.c       |   776 +
+ .../modules/ia_css/ipu6se/src/ia_css_rbm.c    |    19 +
+ .../ia_css/ipu6se/src/ia_css_terminal.c       |    22 +
+ .../ipu6se/src/ia_css_terminal_manifest.c     |    22 +
+ .../ia_css/ipu6se/src/vied_nci_psys_system.c  |    28 +
+ 334 files changed, 137988 insertions(+)
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/GCSSParser.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_item.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_keys.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/gcss_utils.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
+ create mode 100644 camera/hal/intel/ipu6/include/gcss/graph_utils.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_params.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_output_data.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/tnr7us_parameters_definition.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_tools/css_types.h
+ create mode 100644 camera/hal/intel/ipu6/include/ia_tools/ia_list.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_hw_vebox_cmd_g10.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_api_os.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_def_os.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_extension.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g10.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g11.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g12_tgl.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g8.h
+ create mode 100644 camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g9.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
+ create mode 100755 camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
+ create mode 100644 camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
+
+diff --git a/camera/hal/intel/ipu6/include/gcss/GCSSParser.h b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
+new file mode 100644
+index 000000000000..d601cb6f6aad
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
+@@ -0,0 +1,69 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2015-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef __GCSS_PARSER_H__
++#define __GCSS_PARSER_H__
++
++#include "gcss.h"
++#include "gcss_item.h"
++#include <expat.h>
++
++namespace GCSS {
++
++/**
++ * \class GCSSParser
++ *
++ * This class is used to parse the Graph Configuration Subsystem graph
++ * descriptor xml file. Uses the expat lib to do the parsing.
++ */
++class GCSSParser {
++public:
++    GCSSParser();
++    ~GCSSParser();
++    void parseGCSSXmlFile(const char*, IGraphConfig**);
++    void parseGCSSXmlData(char*, size_t, IGraphConfig**);
++
++private: /* Constants*/
++    static const int BUFFERSIZE = 4*1024;  // For xml file
++
++private: /* Methods */
++    GCSSParser(const GCSSParser& other);
++    GCSSParser& operator=(const GCSSParser& other);
++
++    static void startElement(void *userData, const char *name, const char **atts);
++    static void endElement(void *userData, const char *name);
++
++    void parseXML(XML_Parser &parser, const char* fileName, void* pBuf);
++#ifndef ZLIB_DISABLED
++    void parseGz(XML_Parser &parser, const char* filename, void* pBuf);
++#endif
++    void handleGraph(const char *name, const char **atts);
++    void handleNode(const char *name, const char **atts);
++    void checkField(GCSSParser *profiles, const char *name, const char **atts);
++
++private:  /* Members */
++
++    ia_uid mTopLevelNode;
++    std::string mVersion; /* save version number from the xml here */
++    GCSS::GraphConfigNode *mCurrentNode; /* TODO: these should be of GraphConfig-iface type */
++};
++} // namespace
++#endif
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss.h b/camera/hal/intel/ipu6/include/gcss/gcss.h
+new file mode 100644
+index 000000000000..d937cce5be49
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss.h
+@@ -0,0 +1,284 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2016-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++#ifndef __GCSS_H__
++#define __GCSS_H__
++
++#include <ia_tools/css_types.h>
++#include <ia_cipf/ia_cipf_types.h>
++
++#ifdef __cplusplus
++
++#include <string>
++#include <map>
++#include <utility>
++#include <vector>
++
++namespace GCSS {
++
++/* For now there is no C API to GCSS so exposing the ItemUID and IGraphConfig
++ * here */
++class ItemUID
++{
++public:
++    static ia_uid str2key(const std::string&);
++    static const char* key2str(const ia_uid key);
++    static bool isInteger(const ia_uid key);
++    static ia_uid generateKey(const std::string&);
++    static void addCustomKeyMap(std::map<std::string, ia_uid> &osMap);
++
++    ItemUID(std::initializer_list<ia_uid> uids) {
++        mUids.insert(mUids.end(), uids.begin(), uids.end());
++    };
++    ItemUID (const std::string &itemName);
++    ItemUID() {};
++    void pop_back() { mUids.pop_back(); };
++    void push_back( const ia_uid& iuid) { mUids.push_back(iuid); };
++
++    bool operator == (const ItemUID& v) const {
++        return v.mUids == mUids;
++    }
++
++    std::string toString() const;
++
++    std::size_t size() const { return mUids.size(); };
++
++    ItemUID(const ItemUID &ref) { mUids = ref.mUids; };
++    ItemUID & operator=(const ItemUID &v) {
++        // check for self-assignment
++        if (&v == this)
++            return *this;
++
++        mUids = v.mUids;
++        return *this;
++    }
++
++    ia_uid& operator[](std::size_t idx) { return mUids[idx]; }
++    const ia_uid& operator[](std::size_t idx) const
++    { return mUids[idx]; }
++
++private:
++    friend bool operator<(const ItemUID &r, const ItemUID &l);
++    friend bool operator>(const ItemUID &r, const ItemUID &l);
++    std::vector<ia_uid> mUids;
++
++};
++
++class IGraphConfig
++{
++public:
++    virtual ~IGraphConfig() {}
++
++    /**
++     * Get root level node of the graph
++     *
++     * \ingroup gcss
++     *
++     * \return pointer to root node on success
++     * \return NULL if error
++     */
++    virtual IGraphConfig* getRoot(void) const = 0;
++    /*
++     * Get ancestor for the node
++     *
++     * \ingroup gcss
++     *
++     * \return pointer to ancestor node on success
++     * \return NULL if error
++     */
++    virtual IGraphConfig* getAncestor(void) const = 0;
++
++    virtual uint32_t getDescendantCount() const = 0;
++
++    /**
++     * Get descendant by GCSS_KEY
++     *
++     * \ingroup gcss
++     *
++     * \return pointer to the descendant if success
++     * \return NULL if error
++     */
++    virtual IGraphConfig* getDescendant(ia_uid) const = 0;
++
++    /**
++     * Get descendant by GCSS_KEY, or array of keys
++     *
++     * \ingroup gcss
++     *
++     * possible usages:
++     * getDescendant(GCSS_KEY_GRAPH);
++     * getDescendant({GCSS_KEY_GRAPH, GCSS_KEY_CONNECTION});
++     *
++     * \return pointer to the descendant if success
++     * \return NULL if error
++     */
++
++    virtual IGraphConfig* getDescendant(const ItemUID&) const = 0;
++    /**
++     * DEPRECATED
++     * Get descendant by string
++     *
++     * \ingroup gcss
++     *
++     * \return pointer to the descendant if success
++     * \return NULL if error
++     */
++    virtual IGraphConfig* getDescendantByString(const std::string &str) const = 0;
++
++    /**
++     * Get int value for an attribute given as GCSS_KEY
++     *
++     * \ingroup gcss
++     *
++     * \param[in] gcss key
++     * \param[out] int value
++     * \return css_err_none if success
++     */
++    virtual css_err_t getValue(ia_uid, int&) const = 0;
++    virtual css_err_t getValue(const ItemUID&, int&) const = 0;
++
++    /**
++     * Get str value for an attribute given as GCSS_KEY
++     *
++     * \ingroup gcss
++     *
++     * \param[in] gcss key
++     * \param[out] str value
++     * \return css_err_none if success
++     */
++    virtual css_err_t getValue(ia_uid, std::string&) const = 0;
++    virtual css_err_t getValue(const ItemUID&, std::string&) const = 0;
++
++    /**
++     * Set int value for an attribute given as GCSS_KEY
++     *
++     * \ingroup gcss
++     *
++     * \param[in] gcss key
++     * \param[in] int value
++     * \return css_err_none if success
++     */
++
++    virtual css_err_t setValue(ia_uid, int) = 0;
++    virtual css_err_t setValue(const ItemUID&, int) = 0;
++
++    /**
++     * Set str value for an attribute given as GCSS_KEY
++     *
++     * \ingroup gcss
++     *
++     * \param[in] gcss key
++     * \param[in] str value
++     * \return css_err_none if success
++     */
++    virtual css_err_t setValue(ia_uid, const std::string&) = 0;
++    virtual css_err_t setValue(const ItemUID&, const std::string&) = 0;
++
++    /* Helpers to get uid of the node. Either as a string or uint*/
++    virtual std::string getName()const = 0;
++    virtual ia_uid getUid() const = 0;
++
++    /**
++    * Check if node in the graph is of given type
++    *
++    * \ingroup gcss
++    *
++    * Check if node is, for example, sink, port, program group.
++    *
++    * \param[in] type to compare against as a gcss key
++    * \return true if type matches, false otherwise
++    */
++    virtual bool isType(ia_uid) const = 0;
++
++};
++
++/**
++* \class NodeIterator
++* \ingroup gcss
++* allows iteration of descendants by type, name or value
++*/
++class NodeIterator
++{
++public:
++    /**
++    * Iterator is constructed by givin pointer to the IGraphConfig object
++    * that is being iterated.
++    * \ingroup gcss
++    */
++    NodeIterator(const IGraphConfig *node) : mCurrentIndex(0), mTarget(node), mCurrentKey(0) {}
++
++    /**
++    * Iterates descendants of the node by their type
++    * \ingroup gcss
++    * \param[in] type           Gcss key of the type to iterate
++    * \return    IGraphConfig   As long as descendants found
++    * \return    NULL           When end reached
++    */
++    IGraphConfig* iterateByType(const ia_uid &type);
++
++    /**
++    * Iterates descendants of the node with a given uid
++    *
++    * \ingroup gcss
++    * \param[in] uid            Descendant uid as a gcss key
++    * \return    IGraphConfig   As long as matching descendants found
++    * \return    NULL           When end reached
++    */
++
++    IGraphConfig* iterateByUid(const ia_uid &name);
++
++    /**
++    * Iterates all descendants of the node
++    *
++    * \ingroup gcss
++    * \return    IGraphConfig   As long as matching descendants found
++    * \return    NULL           When end reached
++    */
++    IGraphConfig* iterateDescendants();
++private:
++    IGraphConfig* iterateNodes(const ia_uid &type, const std::string &str);
++    IGraphConfig* reset();
++    int32_t mCurrentIndex; /**< state of the iterator */
++    const IGraphConfig *mTarget;   /**< node being iterated */
++    // for caching key to string conversions
++    ia_uid mCurrentKey;
++    std::string mCurrentString;
++};
++} // namespace
++
++extern "C" {
++#endif
++
++#define GCSS_KEY(key, str) GCSS_KEY_##key,
++#define GCSS_KEY_SECTION_START(key, str, val) GCSS_KEY_##key = val,
++#define GCSS_KEY_SECTION_END(key, str, val) GCSS_KEY_##key = val,
++typedef enum _GraphConfigKey {
++    #include "gcss_keys.h"
++    GCSS_KEY_START_CUSTOM_KEYS = 0x8000,
++} GraphConfigKey;
++#undef GCSS_KEY
++#undef GCSS_KEY_SECTION_START
++#undef GCSS_KEY_SECTION_END
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
+new file mode 100644
+index 000000000000..9dcbbab80175
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
+@@ -0,0 +1,330 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2017-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++#ifndef GCSS_AIC_UTILS_H_
++#define GCSS_AIC_UTILS_H_
++
++extern "C" {
++#include "ia_isp_bxt_types.h"
++#include "ia_view_types.h"
++}
++
++#include "gcss.h"
++#include "gcss_item.h"
++#include "graph_utils.h"
++#include "gcss_isp_utils.h"
++
++namespace GCSS {
++
++typedef std::map<GCSS::IGraphConfig*, ia_isp_bxt_resolution_info_t> portResHistoryMap;
++typedef std::vector<GCSS::IGraphConfig*> NodesVector;
++typedef std::vector<int32_t> StreamIdVector;
++/*
++* Map with the information for each stream id of the RBM for each PG
++* the key of the map is the stream id (60000, 60001, etc..)
++* the Values in the map is a vector with tuples that have the PG/CB id as integer
++* and the RBM as a string.
++*/
++typedef std::map<int32_t, std::vector<std::tuple<int32_t, std::string> > > GraphRoutingInfo;
++/*
++ * Maps the execution context id to index of the vector mKernels  where the
++ * pre-allocated arrays of ia_isp_bxt_run_kernels_t are stored. <exec_ctx_id, idx>
++ */
++typedef std::map<int32_t, uint32_t> ExecCtxIdsMap;
++/**
++* \class BxtAicUtils
++* GCSS AIC dependent utility functions
++* */
++class BxtAicUtils {
++public: /*  methods */
++    /**
++     * \param legacy true if stream id is used instead of execution context
++     */
++    BxtAicUtils(bool legacy = true);
++    ~BxtAicUtils();
++    /**
++     * Init aic utils
++     *
++     * Reserves memory, and creates kernel lists for each stream
++     *
++     * \ingroup gcss
++     *
++     * \param[in] GCHandle a handle to createGraph result
++     * \return css_err_none when successful
++     */
++    css_err_t initAicUtils(const IGraphConfig *GCHandle);
++
++    /**
++     * get the list of stream Ids available in the graph settings initialized
++     * in this object.
++     *
++     * \param[out] streamIds vector with the stream id's
++     * \param[in] active boolean to specify whether the list of stream ids will
++     *                   have all the stream ids in the graph or only the ones
++     *                   with valid settings. Those are considered as active
++     *                   streams
++     * \return css_err_none
++     */
++
++    css_err_t getStreamIds(std::vector<int32_t> &streamIds, bool active = false) const;
++
++    /**
++     * Get program group by stream id
++     *
++     * \ingroup gcss
++     *
++     * Returns pointer to program group struct, which is allocated as a
++     * member of this class. So the ownership of the memory remains in the instance
++     * of this class. The user does not need to free the memory.
++     *
++     * \param[in] stremId a stream id of the program group being requested
++     * \param[out] pg Reference to a program group struct being populated
++     */
++    void getProgramGroup(int32_t streamId, ia_isp_bxt_program_group &pg);
++
++    /**
++    * Returns the structure required by ia_isp (aka PAL) to run
++    *
++    * \ingroup gcss
++    * Unfortunate name, program group. This is the array of structures
++    * ia_isp_bxt_run_kernels_t that describes the input/output resolution for
++    * each kernel.
++    * This version of the API takes as input a concrete IGraphConfig node that
++    * represents a PG. The other API takes the stream-id and returns all the kernels
++    * in all the PG's that belong to them.
++    * In both cases the list of kernels is returned inside the AIC structure
++    * ia_isp_bxt_program_group.
++    * The memory allocated is owned by this instance. The user of this API must not
++    * de-allocate the pg.run_kernels pointer.
++    *
++    * NOTE: The current implementation only supports IPU6, not yet IPU5
++    *
++    * \param[in] pgNode IGraphConfig node representing a particular PG
++    * \param[out] pg Reference to a program group struct being populated
++    */
++    css_err_t getProgramGroup(const IGraphConfig* pgNode, ia_isp_bxt_program_group &pg);
++
++    /**
++     * Get cmc mode tag associated with the sensor
++     * \ingroup gcss
++     *
++     * This will be used to retieve the CMC section of a multi-tune file. This
++     * is done using ia_lard.
++     *
++     * \param[out] cmcTag
++     * \return css_err_none if everything goes ok
++     * \return css_err_internal if settigns do no thave sensor node
++     * \return css_err_data if sensor node does node have the attribure cmc_tag
++     */
++    css_err_t getSensorCmcId(std::string &cmcTag);
++
++    /* Get Information about the DOL mode of the sensor
++     * \ingroup gcss
++     *
++     * This will be used to retieve the conversion gain and the DOL mode from
++     * the settings of the sensor mode.
++     * if sensor mode does not have the attribute the method does not fail but
++     * returns gain 1 and mode none.
++     *
++     * TODO: Mode should come as an enum and not as string, this requires
++     * addition of dol mode in ia_isp_bxt
++     *
++     * \param[out] gain conversion gain
++     * \param[out] mode DOL mode, only 4 possible values
++     * \return css_err_none if everything goes ok
++     * \return css_err_internal if settigns do no thave sensor node or instance
++     *                          is not initialized
++     */
++    css_err_t getDolInfo(float &gain, std::string &mode);
++
++    /* Get MBR Tool data
++    * \ingroup gcss
++    *
++    * Retrieve the limits of MBR tool stored in the settings. This information
++    * is required for WFOV mode.
++    *
++    * \param[in] stream_id Value of the stream_id associated with the MBR limits
++    * \param[out] data Pointer to valid structure where to store the MBR limits
++    * \return css_err_none if everything goes ok
++    * \return css_err_data if settigns do not have enough data to fill the mbr limits structure
++    * \return css_err_internal if settigns do not have mbr limits data
++    *
++    */
++    css_err_t getMbrData(int32_t stream_id, ia_isp_bxt_gdc_limits *data);
++
++    /**
++     * Get the IGraphConfig root node that was used to initialize this utility
++     * class. This allows users to perform other queries to the IGraphConfig
++     * interface.
++     * \ingroup gcss
++     *
++     */
++    const IGraphConfig* getGraphConfig() { return mGCHandle; }
++
++    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history);
++
++    /**
++    * Retrieves the list of all the RBM's in all the stream-ids present in the
++    * settings. The RBM's are listed per PG/CB
++    * \see GraphRoutingInfo
++    * \ingroup gcss
++    *
++    */
++    css_err_t getRoutingInfo(GraphRoutingInfo &routingInfo);
++
++    /**
++     * Dumps the list of kernels for given stream
++     *
++     * \ingroup gcss
++     *
++     * \param[in] streamId
++     */
++    void dumpKernels(int32_t streamId);
++    /**
++     * Dumps the information from a list of kernels descriptors
++     *
++     * \ingroup gcss
++     *
++     * \param[in] streamId
++     */
++    static void dumpKernels(ia_isp_bxt_run_kernels_t *kernelList,
++                            uint32_t kernel_count);
++
++    static void dumpResInfo(ia_isp_bxt_run_kernels_t &kernelInfo);
++    static void dumpResHistory(ia_isp_bxt_resolution_info_t &resInfo,
++                               const char* name);
++private:
++    /* pair of execution context id and port */
++    typedef std::pair<int32_t, IGraphConfig*> StreamPort;
++    typedef ia_isp_bxt_resolution_info_t ResolutionInfo;
++
++    /* Helper classes to store sensor and kernel information */
++    struct Scaler: public ResolutionInfo {
++        Scaler() : num(1), denom(1) {} /**< avoid possible division by 0 */
++        int32_t num;  /**< scaling factor numerator */
++        int32_t denom; /**< scaling factor denominator */
++    };
++    struct Binner : public ResolutionInfo {
++        Binner() : hFactor(1), vFactor(1) {} /**< avoid possible division by 0 */
++        int32_t hFactor;  /**< horizontal binning factor */
++        int32_t vFactor; /**< Vertical binning factor */
++    };
++    struct SensorModeInfo {
++        ResolutionInfo pixelArray;
++        Binner binner;
++        Scaler scaler;
++    };
++    struct ResolutionMemPool {
++           std::vector<ResolutionInfo *> resHistorys;
++           std::vector<ResolutionInfo *> resInfos;
++    };
++    struct KernelGroupInfo {
++        KernelGroupInfo() : runKernels(nullptr), kernelCount(0) {}
++        KernelGroupInfo(uint32_t kCount) : runKernels(nullptr), kernelCount(kCount) {}
++        ia_isp_bxt_run_kernels_t *runKernels;
++        uint32_t kernelCount = 0;
++    };
++    // Storage for kernel info extensions to AIC requirements
++    struct KernelInfo {
++        int32_t rcb;
++        int32_t branchPoint;
++        int32_t sinkPortId;
++        int32_t restorePoint;
++        IGraphConfig *sinkPort;
++        IGraphConfig *srcPort;
++    };
++
++    css_err_t collectNodesIntAttribute(std::vector<int32_t> &pgsAttribute,
++                                       ia_uid attributeKey,
++                                       ia_uid nodeType) const;
++    int32_t getUpstreamStreamId(int32_t streamId,
++                                IGraphConfig **upstreamPort);
++
++    css_err_t createKernelListStructures();
++    css_err_t createPerPgKernelListStructures(const IGraphConfig *pg, uint32_t);
++    static css_err_t getSensorModeInfo(IGraphConfig &sensorNode, SensorModeInfo &sensorInfo);
++    static css_err_t sourceGetResolutionHistory(ResolutionInfo &history,
++                                                IGraphConfig &sourceNode);
++    static css_err_t  calculateSensorResolutionHistory(IGraphConfig &sensorNode,
++                                                       ResolutionInfo &history);
++    static css_err_t  calculateTPGResolutionHistory(IGraphConfig &sensorNode,
++                                                    ResolutionInfo &history);
++    static css_err_t calculateBufSrcResolutionHistory(IGraphConfig &tpgNode,
++                                                      ResolutionInfo &history);
++    static css_err_t getCsiDimensions(IGraphConfig &sensorNode,
++                                      ResolutionInfo &pixFormat);
++    css_err_t populateKernelArray(int32_t streamId,
++                                  ia_isp_bxt_run_kernels_t *kernelList,
++                                  uint32_t index,
++                                  portResHistoryMap &portResHistory);
++
++    css_err_t getStreamChains(std::map<int32_t, std::vector<StreamPort>> &streamChains);
++    css_err_t generateKernelListsForExecCtxs();
++
++    css_err_t getResHistoryForIntermediatePg(const IGraphConfig *pg,
++        ResolutionInfo &resolutionHistory,
++                                             portResHistoryMap &portResHistory);
++    css_err_t handleSinkPort(KernelInfo &kInfo, const IGraphConfig *pg, std::vector<int32_t> &, int32_t);
++    static css_err_t kernelGetValues(const GCSS::IGraphConfig *kernelNode,
++                                     int32_t *palUuid = NULL,
++                                     int32_t *kernelId = NULL,
++                                     uint32_t *metadata = NULL,
++                                     int32_t *enable = NULL,
++                                     int32_t *rcb = NULL,
++                                     int32_t *branchPoint = NULL,
++                                     int32_t *sinkPort = NULL,
++                                     int32_t *restorePoint = NULL);
++
++    static css_err_t kernelGetResolutions(const IGraphConfig *kernelNode,
++                                          std::map<std::string, ResolutionInfo> &resInfos);
++    static css_err_t kernelGetResolutions(const GCSS::IGraphConfig *kernelNode,
++        ResolutionInfo *resInfo);
++
++    static css_err_t kernelGetBppInfo(const IGraphConfig &kernelNode,
++                                      ia_isp_bxt_run_kernels_t &runKernel);
++    static void accumulateCrop(ia_rectangle &in, const ia_rectangle &toAccumulate,
++                                       int32_t scaleNum = 1, int32_t scaleDenom = 1);
++    css_err_t kernelIdSanityCheck(uint32_t checksum, uint32_t kernelCount);
++
++    // IPU6/7 new logic - start
++    bool nodesHaveKernelLinks();
++    bool detectNewGraphVersion();
++    // IPU6 new logic - end
++    static bool kernelHasResolutions(GCSS::IGraphConfig *kernelNode);
++    void deleteKernelInfo();
++    static void dumpPortResHistoryMap (portResHistoryMap &m);
++    static const char* resInfoToStr(ResolutionInfo &resInfo);
++    void applyKernelConfigs(const KernelConfigs &kernelConf,
++                            ia_isp_bxt_run_kernels_t &runKernels);
++    friend class GraphUtil;
++    ExecCtxIdsMap mExecCtxIds;
++    std::vector<ResolutionMemPool> mResMems;
++    std::map<const IGraphConfig*, KernelGroupInfo> mRunKernelsPerPg;
++    std::map<int32_t, KernelGroupInfo> mRunKernelsPerStream;
++    ResolutionInfo mSourceHistory;
++
++    const IGraphConfig *mGCHandle;
++    bool mUseStreamId;
++    GraphUtil mGraphUtil;
++    GdfVersion mGdfVersion;
++    std::shared_ptr<IspUtils> mISPUtils;
++};
++} // namespace
++#endif
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
+new file mode 100644
+index 000000000000..6050307c2927
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
+@@ -0,0 +1,153 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2018 Intel Corporation. All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its suppliers
++* or licensors. Title to the Material remains with Intel Corporation or its
++* suppliers and licensors. The Material contains trade secrets and proprietary
++* and confidential information of Intel or its suppliers and licensors. The
++* Material is protected by worldwide copyright and trade secret laws and
++* treaty provisions. No part of the Material may be used, copied, reproduced,
++* modified, published, uploaded, posted, transmitted, distributed, or
++* disclosed in any way without Intel's prior express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or delivery
++* of the Materials, either expressly, by implication, inducement, estoppel or
++* otherwise. Any license under such intellectual property rights must be
++* express and approved by Intel in writing.
++*/
++#ifndef GCSS_ISP_UTILS_H_
++#define GCSS_ISP_UTILS_H_
++
++#include "gcss.h"
++#include "graph_utils.h"
++
++namespace GCSS {
++
++struct KernelConfigContainer {
++    int32_t overwriteMode = 0; /**< use this flag to tell which values to update */
++    uint32_t kernel_uuid;
++    int32_t enable;
++    uint32_t metadata[4];
++    ia_isp_bxt_bpp_info_t bpp_info;
++};
++
++/**
++* These modes are used to tell which kernel properties are to be overwritten
++*/
++enum OverwriteMode {
++    OVERWRITE_ENABLE   = 1 << 1,
++    OVERWRITE_BPP      = 1 << 2,
++    OVERWRITE_METADATA = 1 << 3
++};
++
++static const std::string IPU_VER_5("IPU5");
++static const std::string IPU_VER_6("IPU6");
++static const std::string IPU_VER_7("IPU7");
++/**
++ * Vector that is used to hold kernelConfig structs per kernel
++ */
++typedef std::vector<KernelConfigContainer> KernelConfigs;
++
++/** \class IspUtils
++ * Provides IPU specific utilities that can be accessed through
++ * the pointer constructed with the Factory method.
++ */
++class IspUtils {
++
++public:
++    virtual ~IspUtils() {}
++
++    /**
++    * Isp Utils Factory
++    *
++    * \ingroup gcss
++    *
++    * Returns pointer that allows access to common and IPU specific utilities.
++    * Ipu is automatically selected based on the version attribute in the
++    * graph descriptor.
++    *
++    * \param[in]  settings
++    * \return     pointer to one of the ipu specific implementations
++    */
++    static std::shared_ptr<IspUtils> Factory(const IGraphConfig *settings);
++
++    /**
++    * Is dvs enabled
++    *
++    * \ingroup gcss
++    *
++    * Returns true if dvs enabled in settings. False otherwise,
++    *
++    * \return true if dvs is enabled in the settings
++    * \return false if dvs disabled in the settings
++    */
++    virtual bool isDvsEnabled() = 0;
++
++    /**
++    * Get IPU version
++    *
++    * \ingroup gcss
++    *
++    * Returns ipu version as GdfVersion type
++    *
++    * \return GdfVersion
++    */
++    virtual GdfVersion getIpuVersion() = 0;
++
++    /**
++    * Get kernel configurations
++    *
++    * \ingroup gcss
++    *
++    * Returns map of runtime kernel configurations. KernelConfigurations map
++    * contains pal uuid and enable value for kernel. Use through ipu specific
++    * implementation.
++    *
++    * \param[out] KernelConfigContainer populated with kernel configs
++    * \return css_err_none on success
++    * \return css_err_nimpl if function not implemented
++    * \return css_err_general in case of error
++    */
++    virtual css_err_t getKernelConfigurations(KernelConfigs &kConfig) = 0;
++
++    /** Apply given format to output port
++    *
++    * \ingroup gcss
++    *
++    * Applies given format to the port that the sink is connected to.
++    * The given format has to be present in the options list of the pg where the
++    * port belongs to. If there is no options list for the pg, then no error is
++    * returned and no format applied.
++    *
++    * \param[in] sink    Pointer to the sink in the graph.
++    * \param[in] format  Name of the format that is being applied
++    * \return css_err_none   in case of success
++    * \return css_err_data   in case the given format is not in the options list
++    */
++    virtual css_err_t applyFormat(const IGraphConfig *sink,
++        const std::string &format) = 0;
++
++    /** Applies compression to full pipe and sets given format to output port
++    *
++    * \ingroup gcss
++    *
++    * Applies given format to the port that the sink is connected to.
++    * The given format has to be present in the options list of the pg where the
++    * port belongs to. If there is no options list for the pg, then no error is
++    * returned and no format applied. Applies compression also to PSA and to
++    * tnr ports if present.
++    *
++    * \param[in] sink    Pointer to the sink in the graph.
++    * \param[in] format  Name of the compressed format that is being applied
++    * \return css_err_none       in case of success
++    * \return css_err_argument   in case the given format is not compressed
++    * \return css_err_data       in case the given format is not in the options list
++    */
++    virtual css_err_t applyCompression(const IGraphConfig *sink,
++        const std::string &format) = 0;
++};
++} // namespace
++#endif
+\ No newline at end of file
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_item.h b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
+new file mode 100644
+index 000000000000..dbe34c649d02
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
+@@ -0,0 +1,272 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2015-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++#ifndef GCSS_ITEM_H_
++#define GCSS_ITEM_H_
++
++#include "gcss.h"
++namespace GCSS {
++
++class GraphQueryManager;
++
++/** RelayControl :
++* Controls of assigning GraphConfig container elements */
++namespace RelayControl {
++    typedef int8_t Rule;
++    const Rule RELAY_RULE_ADD_NODES = 0x1;
++    const Rule RELAY_RULE_HANDLE_OPTIONS = 1 << 1;
++    const Rule RELAY_RULE_PROPAGATE = 1 << 2;
++    const Rule RELAY_RULE_OVERWRITE = 1 << 3;
++}
++
++void getGcssKeys(std::map<std::string, ia_uid> &src);
++void copyGcssKeys(std::map<std::string, ia_uid> &src);
++
++/**
++ * Holds type of the item. It can be Node or Attribute (int or string)
++ */
++enum Type {
++    NA               = (1 << 0),
++    STR_ATTRIBUTE    = (1 << 1),
++    INT_ATTRIBUTE    = (1 << 2),
++    NODE             = (1 << 3)
++};
++/**
++ * \class GraphConfigItem
++ * Base class that holds attributes or nodes inside
++ */
++class GraphConfigItem
++{
++public:
++    typedef std::multimap<ia_uid, GraphConfigItem*> gcss_item_map;
++    typedef gcss_item_map::const_iterator const_iterator;
++
++    /** Getter for int value of attribute. Return error if getValue is being
++     * used directly or if child class doesn't implement getValue
++     * \param[out] value
++     */
++
++    virtual css_err_t getValue(int&) {return css_err_noentry;}
++    /** Getter for string value of attribute. Return error if getValue is being
++     * used directly or if child class doesn't implement getValue
++     * \param[out] value
++     */
++
++    virtual css_err_t getValue(std::string&) {return css_err_noentry;}
++    /** Setter for string value of attribute.
++     * \param[in] new value
++     */
++
++    virtual css_err_t setValue(const std::string&) {return css_err_noentry;}
++    /** Setter for int value of attribute.
++     * \param[in] new value
++     */
++    virtual css_err_t setValue(int) {return css_err_noentry;}
++
++    Type mType;
++    GraphConfigItem(Type type) : mType(type) {}
++
++    virtual ~GraphConfigItem() {}
++};
++
++
++inline bool operator<(const ItemUID &r, const ItemUID &l)
++{
++    return r.mUids < l.mUids;
++}
++
++inline bool operator>(const ItemUID &r, const ItemUID &l)
++{
++    return r.mUids > l.mUids;
++}
++
++/**
++ * \class GraphConfigAttribute
++ * Base class for graph config attributes
++ */
++class GraphConfigAttribute : public GraphConfigItem {
++public:
++    GraphConfigAttribute() : GraphConfigItem(NA){}
++    GraphConfigAttribute(Type t) : GraphConfigItem(t){}
++    ~GraphConfigAttribute() {}
++};
++
++/**
++ * \class GraphConfigIntAttribute
++ * Container for integer type attributes
++ */
++class GraphConfigIntAttribute : public GraphConfigAttribute
++{
++public:
++    GraphConfigIntAttribute() : GraphConfigAttribute(INT_ATTRIBUTE), mInteger(-1){}
++    GraphConfigIntAttribute* copy();
++    css_err_t getValue(int& intVal){intVal = mInteger; return css_err_none;}
++    css_err_t setValue(int intVal) { return insertInteger(intVal);}
++    ~GraphConfigIntAttribute() {};
++private:
++    css_err_t insertInteger(int);
++    int mInteger;
++};
++
++/**
++ * \class GraphConfigStrAttribute
++ * Container for string type attributes
++ */
++class GraphConfigStrAttribute : public GraphConfigAttribute
++{
++public:
++    GraphConfigStrAttribute() : GraphConfigAttribute(STR_ATTRIBUTE){}
++    GraphConfigStrAttribute* copy();
++    css_err_t getValue(std::string& str){str = mString; return css_err_none;}
++    css_err_t setValue(const std::string& str) { return insertString(str);}
++    ~GraphConfigStrAttribute() {};
++private:
++    css_err_t insertString(const std::string&);
++    std::string mString;
++};
++
++/**
++ * \class GraphConfigNode
++ * Provides methods for manipulating nodes in the graph
++ */
++class GraphConfigNode : public GraphConfigItem, public IGraphConfig
++{
++public:
++    GraphConfigNode(const GraphConfigNode&);
++    GraphConfigNode() : GraphConfigItem(NODE), mAncestor(NULL){};
++    ~GraphConfigNode();
++
++    GraphConfigNode* copy() const;
++    operator IGraphConfig*() { return this; }
++    static void dumpNodeTree(const GraphConfigNode*, int depth  = 0);
++    const_iterator begin() const { return mItem.begin(); }
++    const_iterator end() const { return mItem.end(); }
++
++    css_err_t insertDescendant(GraphConfigItem*, const ia_uid);
++    css_err_t removeDescendant(const ia_uid);
++    css_err_t createAttribute(const ItemUID& item, GraphConfigAttribute** ret);
++
++    css_err_t changeBaseNodeIntoNode(GraphConfigNode &configNode);
++
++    /**
++     * Helper function which iterates through given node and search for
++     * matching attribute. Return error if not found.
++     * \param attribute the ItemUID of attribute to search
++     * \param searchAttributeValue the value to search
++     * \param it iterator for the node to search
++     * \return css_err_t
++     */
++    template <typename T>
++    css_err_t iterateAttributes(ia_uid attribute,
++        const T& searchAttributeValue,
++        const const_iterator& it) const;
++
++    static css_err_t handleAttributeOptions(GraphConfigNode *node,
++        ia_uid attribute_key,
++        const std::string &newValue);
++
++    /** DEPRECATED public methods, use IGraphConfig implementations instead */
++    GraphConfigNode* getRootNode(void) const;
++    css_err_t getAncestor(GraphConfigNode**);
++    css_err_t getAttribute(const ia_uid iuid, GraphConfigAttribute** ret) const;
++    css_err_t getAttribute(const ItemUID& item, GraphConfigAttribute** ret) const;
++    css_err_t getDescendant(const ia_uid, GraphConfigNode**) const;
++    css_err_t getDescendant(const ia_uid attribute,
++        const int searchAttributeValue,
++        const_iterator& it,
++        GraphConfigNode** retNode) const;
++    css_err_t getDescendant(const ia_uid attribute,
++        const std::string& searchAttributeValue,
++        const_iterator& it,
++        GraphConfigNode** retNode) const;
++    css_err_t getDescendantByString(const std::string &str,
++        GraphConfigNode **retNode);
++private:
++    /* private methods */
++    GraphConfigNode & operator=(const GraphConfigNode &);
++
++    GraphConfigItem::const_iterator getNext(const_iterator& it){
++                                            return std::next(it, 1);}
++    GraphConfigItem::const_iterator getNextAttribute(
++            GraphConfigItem::const_iterator& it) const;
++
++    template <typename T>
++    css_err_t getAttrValue(const ia_uid& uid, T& val) const;
++
++    template <typename T>
++    css_err_t setAttrValue(const ia_uid& uid, T& val);
++
++    void dumpNode();
++
++    /* private members */
++    gcss_item_map mItem; /**< map that holds GraphConfigItem objects inside */
++    GraphConfigNode* mAncestor;
++
++
++    css_err_t setValueFromStr(const ItemUID &iuid, const std::string val);
++    virtual IGraphConfig* getGraphConfigItem(const ItemUID&) const;
++
++public: /* implements IGraphConfig */
++    virtual IGraphConfig* getRoot(void) const;
++    virtual IGraphConfig* getAncestor(void) const;
++    virtual IGraphConfig* getDescendant(ia_uid uid) const;
++    virtual IGraphConfig* getDescendant(const ItemUID&) const;
++    virtual IGraphConfig* getDescendantByString(const std::string &str) const;
++    virtual uint32_t getDescendantCount() const;
++    virtual css_err_t getValue(ia_uid, int&) const;
++    virtual css_err_t getValue(const ItemUID&, int&) const;
++
++    virtual css_err_t getValue(ia_uid, std::string&) const;
++    virtual css_err_t getValue(const ItemUID&, std::string&) const;
++
++    virtual css_err_t setValue(ia_uid, int);
++    virtual css_err_t setValue(const ItemUID&, int);
++
++    virtual css_err_t setValue(ia_uid, const std::string&);
++    virtual css_err_t setValue(const ItemUID&, const std::string&);
++    virtual std::string getName() const;
++    virtual ia_uid getUid() const;
++    virtual bool isType(ia_uid) const;
++
++    /* access not part of IGraphConfig */
++    bool hasItem(const ia_uid iuid) const;
++    css_err_t addValue(ia_uid uid, const std::string &val);
++    css_err_t addValue(ia_uid uid, int val);
++
++    // To silence possible compiler warning
++    using GraphConfigItem::getValue;
++    using GraphConfigItem::setValue;
++};
++/* class to expose GraphConfigNode internals to GraphQueryManager */
++class GraphQueryUtils : public GraphConfigNode {
++public:
++    static css_err_t addDescendantsFromNode(
++        GraphConfigNode *to,
++        GraphConfigNode *from,
++        RelayControl::Rule rr = RelayControl::RELAY_RULE_ADD_NODES
++        | RelayControl::RELAY_RULE_OVERWRITE);
++private:
++    static GraphConfigNode* getPortPeer(GraphConfigNode* portNode);
++    static void disableUnusedPorts(GraphConfigNode *gcNode);
++    static css_err_t disableNode(GraphConfigNode *);
++    friend GraphQueryManager;
++};
++} // namespace GCSS
++#endif /* GCSS_ITEM_H_ */
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_keys.h b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
+new file mode 100644
+index 000000000000..5bd0f2907f0e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
+@@ -0,0 +1,144 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2015-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++GCSS_KEY_SECTION_START (NA, na, 0x0000)
++GCSS_KEY (AE_STATS_SINK, ae_stats_sink)
++GCSS_KEY (AF_STATS_SINK, af_stats_sink)
++GCSS_KEY (AWB_STATS_SINK, awb_stats_sink)
++GCSS_KEY (BASE_NODE, base_node)
++GCSS_KEY (BASE_TYPE, base_type)
++GCSS_KEY (BUFFER_SRC0, buffer_src0)
++GCSS_KEY (COMPUTE_BLOCK, compute_block)
++GCSS_KEY (CONNECTION, connection)
++GCSS_KEY (CONTENT_TYPE, content_type)
++GCSS_KEY (CONVERSION_GAIN, conversion_gain)
++GCSS_KEY (CMC_TAG, cmc_tag)
++GCSS_KEY (DEMUXER, demux)
++GCSS_KEY (DESTINATION, destination)
++GCSS_KEY (DOL_MODE, dol_mode)
++GCSS_KEY (FLOW, flow)
++GCSS_KEY (FORMAT, format)
++GCSS_KEY (GRAPH, graph)
++GCSS_KEY (GRAPHS, graphs)
++GCSS_KEY (GRAPH_DESCRIPTOR, graph_descriptor)
++GCSS_KEY (GRAPH_SETTINGS, graph_settings)
++GCSS_KEY (HW, hw)
++GCSS_KEY (INPUT, input)
++GCSS_KEY (KERNEL, kernel)
++GCSS_KEY (KERNEL_LINK, klink)
++GCSS_KEY (MBR_DATA, mbr_data)
++GCSS_KEY (METADATA, metadata)
++GCSS_KEY (MODE_ID, mode_id)
++GCSS_KEY (MUXER, mux)
++GCSS_KEY (NAME, name)
++GCSS_KEY (NODE, node)
++GCSS_KEY (NODES, nodes)
++GCSS_KEY (OUTPUT, output)
++GCSS_KEY (PEER, peer)
++GCSS_KEY (PORT, port)
++GCSS_KEY (PROGRAM_GROUP, program_group)
++GCSS_KEY (SENSOR, sensor)
++GCSS_KEY (SENSOR_MODES, sensor_modes)
++GCSS_KEY (PIXEL_ARRAY, pixel_array)
++GCSS_KEY (BINNER, binner)
++GCSS_KEY (SCALER, scaler)
++GCSS_KEY (CSI_BE, csi_be)
++GCSS_KEY (CSI_BE_DOL, csi_be_dol)
++GCSS_KEY (CSI_BE_SOC, csi_be_soc)
++GCSS_KEY (SENSOR_TYPE, sensor_type)
++GCSS_KEY (SETTINGS, settings)
++GCSS_KEY (SINK, sink)
++GCSS_KEY (SOURCE, source)
++GCSS_KEY (SPLITTER, split)
++GCSS_KEY (STATIC, static)
++GCSS_KEY (TARGET, target)
++GCSS_KEY (TYPE, type)
++GCSS_KEY (VALUE, value)
++GCSS_KEY (CIPF, cipf)
++GCSS_KEY (ATTRIBUTE, attribute)
++GCSS_KEY (OPTIONS, options)
++GCSS_KEY (APPLY, apply)
++GCSS_KEY (TPG, tpg)
++GCSS_KEY (SIMULATION, simulation)
++GCSS_KEY (VERSION, version)
++GCSS_KEY (FILE_NAME, file_name)
++GCSS_KEY (RBM, rbm)
++GCSS_KEY (DESCRIPTION, description)
++GCSS_KEY (VIDEO_BPP, video_bpp)
++GCSS_KEY (STILLS_BPP, stills_bpp)
++GCSS_KEY (EXTERNAL_STAGE, external_stage)
++GCSS_KEY (PDAF_TYPE, pdaf_type)
++GCSS_KEY (SUBSYSTEM, subsystem)
++GCSS_KEY (HW_BITMAPS, hw_bitmaps)
++GCSS_KEY (DEB, deb)
++GCSS_KEY (TEB, teb)
++GCSS_KEY (REB, reb)
++/* add new keys to this section above this line */
++GCSS_KEY_SECTION_END (GENERIC_KEYS_END, generic_keys_end, 0x0FFF)
++
++/* do not add keys here! */
++
++/* NUMERICAL KEY DEFINITIONS */
++GCSS_KEY_SECTION_START (NUMERICAL_START, num_start, 0x2000)
++GCSS_KEY (ACTIVE_INPUT, active_input)
++GCSS_KEY (ACTIVE_OUTPUTS, active_outputs)
++GCSS_KEY (ACTIVE_OUTPUT, active_output)
++GCSS_KEY (BINNING_H_FACTOR, h_factor)
++GCSS_KEY (BINNING_V_FACTOR, v_factor)
++GCSS_KEY (BOTTOM, bottom)
++GCSS_KEY (BPP, bpp)
++GCSS_KEY (BRANCH_POINT, branch_point)
++GCSS_KEY (BYTES_PER_LINE, bpl)
++GCSS_KEY (CONCURRENT, concurrent)
++GCSS_KEY (DIRECTION, direction)
++GCSS_KEY (DVS, dvs)
++GCSS_KEY (ENABLED, enabled)
++GCSS_KEY (EXEC_CTX_ID, exec_ctx_id)
++GCSS_KEY (FLIP_H, flip_h)
++GCSS_KEY (FLIP_V, flip_v)
++GCSS_KEY (FPS, fps)
++GCSS_KEY (FRAGMENT_COUNT, fragment_count)
++GCSS_KEY (HEIGHT, height)
++GCSS_KEY (ID, id)
++GCSS_KEY (KEY, key)
++GCSS_KEY (LEFT, left)
++GCSS_KEY (LINK_ID, link_id)
++GCSS_KEY (OPMODE, operation_mode)
++GCSS_KEY (PAL_UUID, pal_uuid)
++GCSS_KEY (PG_ID, pg_id)
++GCSS_KEY (POWER_FACTOR, power_factor)
++GCSS_KEY (PRIVATE, private)
++GCSS_KEY (PSYS_FREQ, psys_frequency)
++GCSS_KEY (RCB, rcb)
++GCSS_KEY (RESTORE_POINT, restore_point)
++GCSS_KEY (RIGHT, right)
++GCSS_KEY (SCALING_FACTOR_NUM, num_factor)
++GCSS_KEY (SCALING_FACTOR_DENOM, denom_factor)
++GCSS_KEY (SINK_PORT, sink_port)
++GCSS_KEY (STREAM_ID, stream_id)
++GCSS_KEY (TNR, tnr)
++GCSS_KEY (TOP, top)
++GCSS_KEY (TUNING_MODE, tuning_mode)
++GCSS_KEY (WIDTH, width)
++/* add new keys to this section above this line */
++GCSS_KEY_SECTION_END (NUMERICAL_END, num_end, 0x2FFF)
++
++/* do not add keys here, start a new section instead! */
+diff --git a/camera/hal/intel/ipu6/include/gcss/gcss_utils.h b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
+new file mode 100644
+index 000000000000..2b656ff83401
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
+@@ -0,0 +1,642 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2015-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++#ifndef GCSS_UTILS_H_
++#define GCSS_UTILS_H_
++
++#include "gcss.h"
++#include <set>
++#include <utility>
++#include <string>
++#include <limits>
++#include "gcss_item.h"
++
++namespace GCSS {
++/**
++ * \enum GdfVersion
++ * Enum to identify the different IPU versions
++ */
++enum GdfVersion {
++    GDF_VERSION_NONE,
++    GDF_VERSION_IPU4 = 4,
++    GDF_VERSION_IPU5,
++    GDF_VERSION_IPU6,
++    GDF_VERSION_IPU7
++};
++/**
++ * \class GraphCameraUtil
++ * Class that holds utility functions to derive information from
++ * GraphConfig container for Camera runtime.
++ *
++ * Utilities are separated from GraphConfig interface in order to
++ * specialize the XML-schema that Camera runtime is dependent of
++ * from the generic concept of graph information.
++ *
++ * These specializations include execCtxs, ports, execCtx edges
++ * as well as sensor and imaging kernel details that are nested
++ * in generic graph elements hierarchy.
++ */
++class GraphCameraUtil
++{
++public: // types
++   /**
++    * \struct PortDescriptor
++    * Information of a port from an XML graph node
++    */
++    struct PortDescriptor {
++        std::string    name;
++        std::string    pgName;
++        int32_t        direction;
++        int32_t        enabled;
++        uint32_t       terminalId; /**< Unique terminal id (is a fourcc code)
++                                         this is relevant only when the node
++                                         is a PG and then the port is a terminal */
++        uint32_t        width;    /**< Width of the frame in pixels */
++        uint32_t        height;   /**< Height of the frame in lines */
++        std::string     format;   /**< Frame format name, use gcss_format
++                                       utilities to query more information */
++    };
++
++public:
++    virtual ~GraphCameraUtil() {}
++
++    static const int32_t PORT_DIRECTION_INPUT = 0;
++    static const int32_t PORT_DIRECTION_OUTPUT = 1;
++    //pair of source and sink between either 2 pg, or 2 execution context.
++    typedef std::pair<std::string, std::string> StreamConnection;
++
++    /*
++     * Generic Dimensions prototype:
++     *
++     * Port-elements, kernels as well as sensor entities input and output
++     * elements reuse the common dimensions prototype including
++     *  GCSS_KEY_WIDTH, GCSS_KEY_HEIGHT, GCSS_KEY_BYTES_PER_LINE,
++     *  GCSS_KEY_LEFT, GCSS_KEY_TOP, GCSS_KEY_RIGHT, GCSS_KEY_BOTTOM
++     */
++
++    /**
++     * Get width, height, bpl and cropping values from the given element
++     *
++     * \ingroup gcss
++     *
++     * \param[in] node the node to read the values from
++     * \param[out] w width
++     * \param[out] h height
++     * \param[out] l left crop
++     * \param[out] t top crop
++     * \param[out] r right crop
++     * \param[out] b bottom crop
++     */
++    static css_err_t getDimensions(const IGraphConfig *node,
++                                   int32_t *w = NULL,
++                                   int32_t *h = NULL,
++                                   int32_t *l = NULL,
++                                   int32_t *t = NULL,
++                                   int32_t *r = NULL,
++                                   int32_t *b = NULL);
++
++    /*
++     * NODE-specialization
++     */
++    static IGraphConfig* nodeGetPortById(const IGraphConfig *node, int32_t id);
++
++    /*
++     * PORT-specialization
++     */
++
++    /**
++     * Check if port is at the edge
++     *
++     * \ingroup gcss
++     *
++     * A port is at the edge of the video execCtx (pipeline) if its peer is in a PG
++     * that has a different execCtxID (a.k.a. pipeline id) or if its peer is a
++     * virtual sink.
++     *
++     * Here we check for both conditions and return true if this port is at either
++     * edge of a pipeline
++     * \param[in] port Reference to port Graph node
++     * \return true if it is edge port
++     */
++    static bool isEdgePort(const IGraphConfig* port);
++
++    /**
++     * Check if port is virtual
++     *
++     * \ingroup gcss
++     *
++     * Check if the port is a virtual port. this is the end point
++     * of the graph. Virtual ports are the nodes of type sink.
++     *
++     * \param[in] port Reference to port Graph node
++     * \return true if it is a virtual port
++     * \return false if it is not a virtual port
++     */
++    static bool portIsVirtual(const IGraphConfig* port);
++    /**
++     * return child node full name, this is pg-name:child-name
++     *
++     * This makes the child name unique in the graph, because multiple
++     * nodes may have children named same way (ex: input)
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port Reference to port Graph node
++     * \return string with the full name
++     */
++    static std::string getFullName(const IGraphConfig &child);
++
++    /**
++     * Return the port descriptor
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port
++     * \param[out] descriptor
++     * \return 0 if it is an input port
++     * \return 1 if it is an output port
++     */
++    static css_err_t portGetDescriptor(const IGraphConfig* port,
++                                       PortDescriptor &desc);
++    /**
++     * Return the port direction
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port
++     * \return 0 if it is an input port
++     * \return 1 if it is an output port
++     */
++    static int portGetDirection(const IGraphConfig* port);
++
++    /**
++     * For a given port node it constructs the fourCC code used in the connection
++     * object. This is constructed from the program group id.
++     *
++     * \ingroup gcss
++     *
++     * \param[in] portNode
++     * \param[out] stageId Fourcc code that describes the PG where this node is
++     *                     contained
++     * \param[out] terminalID Fourcc code that describes the port, in FW jargon,
++     *                        this is a PG terminal.
++     * \return css_err_none in case of no error
++     * \return css_err_argument in case some error is found
++     */
++    static css_err_t portGetFourCCInfo(const IGraphConfig *portNode,
++                                      ia_uid& stageId,
++                                      uint32_t& terminalId);
++
++    /**
++     * Retrieve the graph config node of the port that is connected to a given port.
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port Node with the info of the port that we want to find its peer.
++     * \param[out] peer Pointer to a node where the peer node reference will be
++     *                  stored
++     * \return css_err_none
++     * \return css_err_argument if any of the graph settings is incorrect.
++     */
++    static css_err_t portGetPeer(const IGraphConfig* port, IGraphConfig** peer);
++
++    /**
++     * Finds the stream id of the program group that the port is in.
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port The port whose stream id is being returned
++     * \return valid stream id, or -1 in case of error.
++     */
++    static int portGetStreamId(const IGraphConfig *port);
++    /**
++     * Finds the execCtx id of the program group that the port is in.
++     *
++     * \ingroup gcss
++     *
++     * \param[in] port The port whose execCtx is being returned
++     * \return valid execCtx id, or -1 in case of error.
++     */
++    static int portGetExecCtxId(const IGraphConfig *port);
++    static int getExecCtxIds(const IGraphConfig &setting,
++                             std::set<int32_t> &execCtxIds);
++    static int getExecCtxIdsTuningMap(const IGraphConfig &settings,
++                                      std::map<int32_t,int32_t> &execCtxIdsTuningMap);
++    static int portGetKey(const IGraphConfig *port, ia_uid uid);
++
++    /**
++    * Retrieves the basic information of a port. Uses the peer port (i.e. the
++    * port connected to this one) to get the information if not found from the
++    * given port.
++    *
++    * Returns an error if some of the information is missing unless it is a
++    * private port.
++    *
++    * \ingroup gcss
++    *
++    * \param[in] port        Port to query the format.
++    * \param[out] enabled    Passthrough, enabled or disabled status
++    * \param[out] terminalId Unique terminal id
++    */
++    static css_err_t portGetInfo(const GCSS::IGraphConfig *port,
++                                 uint32_t &enabled,
++                                 uint32_t &terminalId);
++
++    /**
++    * Retrieves the format information of a port. Uses the peer port (i.e. the
++    * port connected to this one) to get the information if not found from the
++    * given port.
++    *
++    * Returns an error if some of the information is missing unless it is a
++    * private port.
++    *
++    * \ingroup gcss
++    *
++    * \param[in] port        Port to query the format.
++    * \param[out] enabled    Passthrough, enabled or disabled status
++    * \param[out] terminalId Unique terminal id
++    * \param[out] width      Width of the frame in pixels
++    * \param[out] height     Height of the frame in lines
++    * \param[out] fourcc     Frame format
++    * \param[out] bpl        Bytes per line
++    * \param[out] bpp        Bits per pixel
++    */
++    static css_err_t portGetFormat(const GCSS::IGraphConfig *port,
++                                   uint32_t &enabled,
++                                   uint32_t &terminalId,
++                                   uint32_t &width,
++                                   uint32_t &height,
++                                   uint32_t &fourcc,
++                                   uint32_t &bpl,
++                                   uint32_t &bpp);
++
++    /** Apply given format to output port
++     *
++     * \ingroup gcss
++     *
++     * Applies given format to the port that the sink is connected to.
++     * The given format has to be present in the options list of the pg where the
++     * port belongs to. If there is no options list for the pg, then no error is
++     * returned and no format applied.
++     *
++     * \param[in] sink    Pointer to the sink in the graph.
++     * \param[in] format  Name of the format that is being applied
++     * \return css_err_none   in case of success
++     * \return css_err_data   in case the given format is not in the options list
++     */
++    static css_err_t applyFormat(const IGraphConfig *sink,
++                                 const std::string &format);
++
++    /**
++     * SENSOR-specialization
++     */
++
++    /**
++     * Get binning factor values from the given node
++     *
++     * \ingroup gcss
++     *
++     * \param[in] node the node to read the values from
++     * \param[out] hBin horizontal binning factor
++     * \param[out] vBin vertical binning factor
++     */
++    static css_err_t sensorGetBinningFactor(const IGraphConfig *node,
++                                           int &hBin, int &vBin);
++
++    /**
++     * Get scaling factor values from the given node
++     *
++     * \ingroup gcss
++     *
++     * \param[in] node the node to read the values from
++     * \param[out] scalingNum scaling ratio
++     * \param[out] scalingDenom scaling ratio
++     */
++    static css_err_t sensorGetScalingFactor(const IGraphConfig *node,
++                                           int &scalingNum,
++                                           int &scalingDenom);
++    /**
++    * sensorGetType
++    *
++    * Returns the sensor type as a string. Sensor types are typically
++    * BAYER, SVE, MD etc..
++    * The input is a valid graph settings (output of createGraph)
++    *
++    * \param[in] settings
++    * \param[out[ sensorType
++    * \return css_err_argument if the inputs arguments are invalid
++    * \return css_err_noentry if it could not find the sensor type
++    * \return css_err_none if everything went ok.
++    */
++    static css_err_t sensorGetType(const IGraphConfig *settings,
++                                   std::string &sensorType);
++
++    /**
++    * Get content type
++    *
++    * By default if content_type tag is not found will return pixel_data
++    *
++    * \ingroup gcss
++    *
++    * \param[in] node the node to read the values from
++    * \return content type string
++    */
++    static std::string portGetContentType(const IGraphConfig *node);
++
++    /**
++     * Analyse all connections between execution context.
++     * Generates 3 lists:
++     * - list of pair of names of inter-connections between execution contexts
++     * - list of input ports names associated with input streams
++     * - list of output ports names associated with output streams
++     *
++     * \ingroup gcss
++     *
++     * \param[in] graphHandle pointer to any node in the graph
++     * \param[out] connections set connections with edges pair
++     * \param[out] pixel_sources pixel data sources
++     * \param[out] pixel_sinks pixel data sinks
++     */
++    static css_err_t getExecCtxConnectionPorts(const IGraphConfig *graphHandle,
++                                               std::vector<StreamConnection> &connections,
++                                               std::vector<std::string> &pixel_sources,
++                                               std::vector<std::string> &pixel_sinks);
++    /**
++     * Finds input ports for the given execCtx or stream id
++     *
++     * \ingroup gcss
++     *
++     * \param[in] uid key identifying whether the next value is a stream id or
++     *                a exec ctx id.
++     * \param[in] execCtxId id of the execCtx OR stream id
++     * \param[in] graphHandle pointer to any node in the graph
++     * \param[out] ports reference to a vector of IGraphConfig where to store the
++     *                   found ports
++     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
++     */
++    static css_err_t getInputPorts(ia_uid uid,
++                                   int32_t execCtxId,
++                                   const IGraphConfig &graphHandle,
++                                   std::vector<IGraphConfig *> &ports,
++                                   ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
++    /**
++     * Finds output ports for the given execCtx or stream id
++     *
++     * \ingroup gcss
++     *
++     * \param[in] uid key identifying whether the next value is a stream id or
++     *                a exec ctx id.
++     * \param[in] execCtxId id of the execCtx OR stream id
++     * \param[in] graphHandle pointer to any node in the graph
++     * \param[out] ports reference to a vector of IGraphConfig where to store the
++     *                   found ports
++     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
++     */
++    static css_err_t getOutputPorts(ia_uid uid,
++                                    int32_t execCtxId,
++                                    const IGraphConfig &graphHandle,
++                                    std::vector<IGraphConfig *> &ports,
++                                    ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
++    /**
++     * Finds input port for the given execCtx or stream id
++     *
++     * \ingroup gcss
++     *
++     * \param[in] uid key identifying whether the next value is a stream id or
++     *                a exec ctx id.
++     * \param[in] execCtxId id of the execCtx OR stream id
++     * \param[in] graphHandle pointer to any node in the graph
++     * \param[out] port input port
++     * \param[in] computeKey GCSS key of compute element (usually PG or CB)
++     */
++    static css_err_t getInputPort(ia_uid uid,
++                                  int32_t execCtxId,
++                                  const IGraphConfig *graphHandle,
++                                  IGraphConfig **port,
++                                  ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
++
++    /**
++     * getSubgraphPorts
++     *
++     * For a given subgraph, specified via stream id or exec-ctx id, retrieve the
++     * ports that cross subgraph boundaries.
++     *
++     * \ingroup gcss
++     * \param[in] uid Key to specify whether we are looking for stream id or exec ctx
++     *                ids input port. Possible values are GCSS_KEY_STREAM_ID or
++     *                GCSS_KEY_EXEC_CTX_ID
++     * \param[in] execCtxId Value of the stream/exec-ctx id
++     * \param[in] direction Either PORT_DIRECTION_INPUT or PORT_DIRECTION_OUTPUT
++     * \param[in] graphHandle Reference to the root node of the tree
++     * \param[in] computeKey
++     * \param[out] ports vector of pointers where to store the found port nodes.
++     *
++     * \return  css_err_argument in case of any of the input parameters being invalid
++     *                           or in case it did not find any port.
++     */
++    static css_err_t getSubgraphPorts(ia_uid uid,
++                                      int32_t execCtxId,
++                                      int32_t direction,
++                                      const IGraphConfig &graphHandle,
++                                      std::vector<IGraphConfig *> &ports,
++                                      ia_uid computeKey = GCSS_KEY_PROGRAM_GROUP);
++
++    /**
++     *
++     * Retrieve a list of program groups that belong to a given execCtx id or
++     * stream id.
++     * Iterates through the graph configuration storing the program groups
++     * that match this execCtx id into the provided vector.
++     *
++     * \param[in] uid Used to determine if we search the PG per stream-id or exec
++     *                ctx-id
++     * \param[in] value Depending on the key parameter this is the value of the
++     *                  stream-id or execCtx-id to match.
++     * \param[in] GCHandle Handle to get graph result.
++     * \param[out] programGroups Vector with the nodes that match the criteria.
++     */
++    static css_err_t getProgramGroups(ia_uid uid,
++                                     int32_t value,
++                                     const GCSS::IGraphConfig *GCHandle,
++                                     std::vector<IGraphConfig*> &pgs);
++
++    /**
++     * Retrieve the number of kernels inside a PG
++     *
++     * \param[in] pgNode Pointer to a IGraphConfig node that represents a PG.
++     * \param[out] kernelCount number of kernels found inside.
++     */
++    static css_err_t getKernelCountInPg(const GCSS::IGraphConfig *pgNode,
++                                        uint32_t &kernelCount);
++    /**
++     * Helper function to get values from the kernel settings
++     * \todo Moved to bxt aic utils, will be removed from here after hal has
++     *       adapted to changes.
++     * \ingroup gcss
++     *
++     * \param[in] kernelNode
++     * \param[out] palUuid
++     * \param[out] kernelId
++     * \param[out] metadata
++     * \param[out] enable
++     * \param[out] rcb
++     * \param[out] branchPoint
++     */
++    static css_err_t kernelGetValues(const IGraphConfig *kernelNode,
++                                    int32_t *palUuid = NULL,
++                                    int32_t *kernelId = NULL,
++                                    uint32_t *metadata = NULL,
++                                    int32_t *enable = NULL,
++                                    int32_t *rcb = NULL,
++                                    int32_t *branchPoint = NULL,
++                                    int32_t *sinkPort = NULL);
++
++    /**
++     * Return pointer to active source
++     *
++     * Graph descriptor may define multiple sources. This function returns
++     * pointer to source node that is set active.
++     *
++     * \ingroup gcss
++     *
++     * \param[in]  settings,   pointer to gc graph
++     * \param[out] sourceNode, vector of pointers to active sources
++     */
++    static css_err_t getSourceNode(const IGraphConfig *gcHandle,
++            std::vector<IGraphConfig*> &sourceNodes);
++
++
++    /**
++    * Retrieve all the sinks in the current graph configuration that match the
++    * input parameter string in their name attribute.
++    *
++    * If the name to match is empty it returns all the nodes of type sink
++    *
++    * \param[in] name String containing the name to match.
++    * \param[in] gcHandle pointer to the graph
++    * \param[out] sink List of sinks that match that name
++    * \return css_err_none in case of success
++    * \return css_err_noentry if no sinks were found in the graph config.
++    * \return css_err_argument if graph config handle is nullptr
++    */
++    static css_err_t graphGetSinksByName(const std::string &name,
++                                         const IGraphConfig *gcHandle,
++                                         std::vector<IGraphConfig*> &sinks);
++
++    /**
++     * Debug utils
++     */
++
++    /**
++     * Pretty print any recognized element: node, port, kernel
++     *
++     * \ingroup gcss
++     *
++     * \param[in] node of which name to print
++     */
++    static std::string print(const IGraphConfig *node);
++
++    /**
++     * Dumps the whole tree of nodes and attributes.
++     *
++     * \ingroup gcss
++     *
++     * \param node Node to dump
++     * \param depth Depth level of the dump. Default(whole tree) is 0
++     */
++    static void dumpNodeTree(const IGraphConfig* node, int depth = 0);
++
++    /**
++     * Convert string containing a number to a binary blob.
++     *
++     * \ingroup gcss
++     *
++     * \param[in] str String containing a number in decimal or hex (prefix "0x").
++     * \param[out] bytes Size of the new binary data in bytes.
++     *
++     * \return void* Pointer to the newly allocated binary data.
++     *               The format is little-endian, least significant bytes first.
++     *               Caller must free with IA_CIPR_FREE()
++     */
++    static void *numString2binary(const std::string &str, unsigned int *bytes = NULL);
++
++    /**
++     * Process the attribute overrides tags in the graph.
++     * The apply tag allows a graph to modify an attribute of a member node.
++     * The syntax is:
++     * <apply target="" value=""/>
++     * - Target is the fully qualified name of the  attribute we want to override.
++     *  By fully qualified we mean that it contains the names of all the nodes in the
++     *  hierarchy until the attribute. The names are separated by colon (:).
++     *   Ex, to change the attribute of a kernel the target  would be:
++     *   "node:kernel:attribute"
++     * - Value is the value to give the the attribute.
++     *
++     * Please note that this logic does not insert new attributes to a given node
++     * it just modifies an existing. The parsing of the graph will fail if
++     * the override tries to add a new attribute.
++     *
++     * This mechanism is useful to reduce the number of duplicated nodes that only
++     * differ in a few attributes. This is the case for example for the 8/10 bpp
++     * PSA node.
++     *
++     * \param[in] graphNode Node to the GDF graph
++     * \param[out] result Node to the resulting tree of combining the settings with
++     *                    the graph.
++     *
++     * \return css_err_none in case no error
++     *         css_err_data in case the node or attribute are not present in the
++     *                      current graph.
++     */
++    static css_err_t processGraphOverrides(GraphConfigNode& graphNode, GraphConfigNode& results);
++};
++
++/**
++ * \brief Rounds the given number up to the next power of 2
++ *
++ * Rounds given number up to the next power two. Up to number
++ * of bits in 'unsigned int' type.
++ *
++ * \returns Value of 'a' rounded up to the next power of two.
++ *          Zero in case of an overflow.
++*/
++inline unsigned ceil_pow2(unsigned a)
++{
++    // Maximum number of possible bit shifts, to avoid error situations
++    const int maxNumShifts = std::numeric_limits<unsigned>::digits - 1;
++
++    unsigned result = 1;
++    int shifts = 0;
++    while (result < a && shifts <= maxNumShifts) {
++        result <<= 1;
++        ++shifts;
++    }
++
++    if (shifts > maxNumShifts) {
++        // Overflow, return zero.
++        result = 0;
++    }
++
++    return result;
++}
++
++} // namespace GCSS
++
++#endif /* GCSS_UTILS_H_ */
+diff --git a/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
+new file mode 100644
+index 000000000000..d5dbf7675058
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
+@@ -0,0 +1,157 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2015-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef GRAPH_QUERY_MANAGER_H
++#define GRAPH_QUERY_MANAGER_H
++
++#include "gcss.h"
++#include "gcss_item.h"
++#include "gcss_utils.h"
++
++namespace GCSS {
++
++class GraphQueryManager
++{
++public:
++    GraphQueryManager() : mStrictQuery(true),
++                          mGS(nullptr),
++                          mGD(nullptr),
++                          mKey(-1){}
++    ~GraphQueryManager(){}
++
++    typedef std::map<ItemUID, std::string> GraphQuery;
++    typedef std::vector<IGraphConfig*> QueryResult;
++
++    /**
++    * isInitialized
++    *
++    * \ingroup gcss
++    *
++    * Returns true if the object has been initialized correctly with valid
++    * settings and descriptor
++    *
++    */
++    bool isInitialized() { return (mGS != nullptr && mGD != nullptr); };
++
++    /**
++     * Create graph
++     *
++     * \ingroup gcss
++     *
++     * Takes pointer to one of the settings found with queryGraphs and
++     * returns full graph combined with graph descriptor.
++     *
++     * \param[in] settings
++     * \param[out] result
++     */
++    css_err_t createGraph(IGraphConfig* settingsGraph, IGraphConfig** result);
++
++    /**
++     * Destroy graph
++     *
++     * \ingroup gcss
++     *
++     * Needs to be called for each graph created with createGraph
++     *
++     * \param[in] graph
++     *
++     */
++    static void destroyGraph(IGraphConfig* graph);
++
++    /**
++    * Query graphs
++    *
++    * \ingroup gcss
++    *
++    * Query graph settings file for settings that matches search terms in
++    * GraphQuery;
++    *
++    * \param[in] GraphQuery
++    * \param[out] QueryResult
++    * \param[optional | in] strict if true, all search terms has to match
++    */
++    css_err_t queryGraphs(const GraphQuery&,
++                          QueryResult&,
++                          bool strict = true);
++    css_err_t queryGraphs(const GraphQuery&,
++                          const QueryResult&,
++                          QueryResult&,
++                          bool strict = true);
++
++    /**
++     * Set graph settings
++     *
++     * \ingroup gcss
++     *
++     * Set parsed graph settings to graph query manager for later use.
++     *
++     * \param[in] settings
++     */
++    void setGraphSettings(const IGraphConfig* settings);
++
++    /**
++     * Set graph descriptor
++     *
++     * \ingroup gcss
++     *
++     * Set parsed graph descriptor to graph query manager for later use.
++     *
++     * \param[in] descriptor
++     */
++    void setGraphDescriptor(const IGraphConfig* descriptor);
++private:
++    css_err_t getGraph(GraphConfigNode*, GraphConfigNode*);
++    bool mStrictQuery; /**< true by default. True = every search item has to match
++                        false = at least one match */
++    // Store parsed data into these containers, instead of using a single node
++    const IGraphConfig *mGS; // graph settings
++    const IGraphConfig *mGD; // graph descriptor
++    int32_t mKey; // key of the selected setting
++
++    void goThroughSearchItems(const GraphQuery&, const IGraphConfig*, uint16_t&);
++
++    static css_err_t addSensorModeData(GraphConfigNode *sensorNode,
++                                      GraphConfigNode *sensorModesNode,
++                                      const std::string &sensorModeID);
++    css_err_t getConnectionData(const std::string& source_connection,
++                               const std::string& sink_connection,
++                               GraphConfigNode *settings,
++                               GraphConfigNode *ret_node);
++    css_err_t getStaticConnectionData(const std::string& source_connection,
++                                      const std::string& sink_connection,
++                                      GraphConfigNode *ret_node);
++    IGraphConfig *copyNodeToResult(IGraphConfig *descriptorNodes,
++                                   ia_uid nodeId,
++                                   GraphConfigNode* resultNode);
++    css_err_t propagateIntAttribute(IGraphConfig *srcNode,
++                                    IGraphConfig *dstNode,
++                                    ia_uid attributeId);
++    css_err_t propagateStrAttribute(IGraphConfig *srcNode,
++                                    IGraphConfig *dstNode,
++                                    ia_uid attributeId);
++    css_err_t validateSettingsAgainstDescriptor();
++    bool nodeHasBaseNode(IGraphConfig &graphNode, std::string &baseNodeName);
++    IGraphConfig* constructNodeFromBase(IGraphConfig *derivedNode,
++                                        std::string &baseName,
++                                        IGraphConfig *gdfNodesRoot);
++};
++} // namespace
++#endif
+diff --git a/camera/hal/intel/ipu6/include/gcss/graph_utils.h b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
+new file mode 100644
+index 000000000000..465d47584a32
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
+@@ -0,0 +1,454 @@
++
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2017-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++#ifndef IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
++#define IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_
++
++#include <memory>
++#include <functional>
++#include <set>
++
++extern "C" {
++#include "ia_isp_bxt_types.h"
++}
++#include "gcss.h"
++#include "gcss_utils.h"
++
++namespace GCSS {
++
++
++/**
++ * \class GraphUtil
++ *
++ * This class implements similar functionality as BxtAicUtils. It is meant as
++ * a replacement for IPU6 graphs that contain more explicit graph information.
++ * It is then an internal implementation detail of BxtAicUtils that has more
++ * capabilities.
++ *
++ * This class analyses the graph settings and creates a representation
++ * of the graph and inner imaging graphs.
++ *
++ * This representation does not duplicate data, just stores it in a more
++ * convenient way to perform graph operations.
++ *
++ * We need to separate conceptually the XML data stored in IGraphConfig containers
++ * (that is also stored as a tree of nodes) from the actual graph that represents
++ * the information stored, the graph that represents an imaging system.
++ * For that we formalise the following concepts:
++ * - Container graph: This is the graph made out of IGraphConfig nodes. It is a
++ *   representation of the XML hierarchical structure. The information stored
++ *   in this graph is a 1:1 mapping with the XML data. IGraphConfig methods
++ *   helps us to traverse this graph and find information from the nodes (xml
++ *   tags) and xml attributes.
++ *
++ * - Camera Graph: this is the graph that represents a camera subsystem. The nodes
++ *   in this graph are sensor, buffer source/sinks and processing nodes like
++ *   Program Groups (FW).
++ *
++ * - Imaging Graph: This is the graph that represents the image processing
++ * nodes inside the camera graph processing nodes (ex: PG). The nodes of
++ * this graph are imaging kernels (PAL/ATE), routing elements (mux/demux/split)
++ * and also PG ports because one imaging graph may expand multiple PG's
++ *
++ * - Meta-graph: This is the graph made out of camera subgraphs. The Camera graph
++ * may group its nodes in two different ways:
++ *   - stream-id: this traditionally aligns with the video/still/IR pipes.
++ *   - execution context id: This grouping is done to split the nodes in separate
++ *   threads (execution contexts). Only used by CISU.
++ *
++ * Conceptually the last three graphs are nested, the metagraph is at the top,
++ * then the camera graph and finally the imaging graph.
++ *
++ * The imaging graphs are split per subgraph id because the structures given to
++ * PAL are also grouped by subgraph id, whatever this may be (stream-id or exec-ctx)
++ *
++ * The container graph is the data storage that is passed during the initialisation
++ * of this class, but the other three graphs are now represented by the
++ * following member variables of this class:
++ * - Camera Graph: mGraphNodes
++ * - MetaGraph : mSubGraphInfoMap
++ * - Imaging Graph: inside a a subgraph info map entry as imagingGraph.
++ *
++ * All the nodes of these three graphs derived from the same base struct that
++ * contains the needed fields to traverse those graphs in topological order.
++ * This is, a bi-directional adjacently list.
++ * With this representation it is very easy to perform any type of operation in
++ * topological order. We use the same algorithm (Graph Depth First) implemented
++ * in method traverseGraph with different visitor functions.
++ * Same scheme can be used at any of those 3 levels.
++ *
++ * At the moment the visitors are used for:
++ * - Dumping information in traces for each node (for the 3 graphs)
++ * - Calculating the resolution history of the imaging kernels
++ * - detecting subgraph boundaries at the camera graph
++ *
++ * Any new operation on the graph only requires a new visitor function at the
++ * correct level of detail (meta-graph, graph or imaging-graph)
++ *
++ */
++class GraphUtil
++{
++public:
++    GraphUtil();
++    ~GraphUtil();
++    /**
++     * Initialise the GraphUtils class.
++     * During this call the class will analyse the graph settings and create
++     * structures to store the information of the imaging kernels found.
++     * It creates
++     * \param[in] subgraphType either GCSS_KEY_STREAM_ID or GCSS_ID_EXEC_CTX
++     *                         It determines what type of subgraph will be used
++     *                         to group the kernels.
++     * \param[in] ipuVer IPU version
++     *
++     * \param[out] gcHandle Pointer to a IGraphConfig Object that represents
++     *                      some graph-settings.
++     * \return css_err_none if everything is fine
++     * \return css_err_no_memory if there is some problem allocating the new
++     *                           structures.
++     * \return css_err_internal if there is some problem with the graph settings
++     *                          being analysed
++     */
++    css_err_t init(ia_uid subgraphType, const IGraphConfig *gcHandle,
++                   GdfVersion ipuVer = GdfVersion::GDF_VERSION_IPU6);
++
++    /* Query methods */
++    /**
++     * isInitialized
++     * returns true if the class was initialised with some settings
++     */
++    inline bool isInitialized() { return (mGraphSettings != nullptr); }
++    /**
++     * Get program group by execution context Id or stream id
++     *
++     *
++     * Fills the provided structure with the relevant data for that subgraph
++     * id provided. This id needs to be align with the construction time parameter.
++     * i.e. you cannot construct this object with GCSS_KEY_STREAM_ID and then
++     * pass a execution ctx id to this method.
++     *
++     * The granularity of the subgraphs is different and it should match the
++     * granularity of the AIC execution.
++     *
++     * \param[in] subgraphId A stream id (or exec Ctx) of the program group
++     *                      being requested.
++     *                      The concrete value needs to be in sync with the input
++     *                      parameter during initialisation call.
++     * \param[out] pg reference to a program group struct being populated
++     *
++     * \return css_err_none if everything is fine.
++     * \return css_err_data if the subgraph does not contain any subgraphs with
++     *                      the requested id.
++     */
++    css_err_t getAicData(int32_t subgraphId, ia_isp_bxt_program_group &pg);
++
++    /**
++    * Get the AIC PG info from a IGraphConfig PG node.
++    * The PG node must be part of the settings that where used to initialize this
++    * instance.
++    *
++    * \param[in] pgNode A IGraphConfig Node that represents the PG whose kernels
++    *                   we want to retrieve.
++    * \param[out] pg reference to a program group struct being populated
++    *
++    * \return css_err_none if everything is fine.
++    * \return css_err_data if the PG is not in the settings used during initialization
++    */
++    css_err_t getPgAicData(const IGraphConfig *pgNode, ia_isp_bxt_program_group &pg);
++
++    css_err_t getSourceResolutionHistory(ia_isp_bxt_resolution_info_t &history) {
++        history = mSourceHistory;
++        return css_err_none;
++    };
++    /**
++     * Debugging tool to dump to error traces the AIC structures of the given
++     * subgraph id.
++     * \param[in] subgraphId
++     */
++    void dumpKernels(int32_t subgraphId);
++
++private: // types
++    /**
++     * \struct KernelInfoMemPool
++     * structure to associate the array of run kernel structs for each
++     * subgraph-id or PG,
++     * and the resolution info structures allocated for each kernel.
++     * Each kernel needs two, the size of these vector should
++     * match the number of kernels in a given subgraph-id.
++     * This struct is used only for memory management purposes (allocate/free).
++     * We need this for two reasons:
++     * - because the structure ia_isp_bxt_run_kernels_t has pointers to two
++     *   structures of type ia_isp_bxt_resolution_info_t that may be null.
++     * - because the interface of AIC requires a C-style array of run kernels
++     *   structures
++     */
++    struct KernelInfoMemPool {
++           ia_isp_bxt_run_kernels_t *runKernels;
++           size_t kernelCount;
++           std::vector<ia_isp_bxt_resolution_info_t *> resHistorys;
++           std::vector<ia_isp_bxt_resolution_info_t *> resInfos;
++    };
++    /**
++     * \enum
++     * Type of the inner graph nodes
++     */
++    enum ImagingNodeType {
++            IMAGING_NODE_KERNEL,
++            IMAGING_NODE_MUX,
++            IMAGING_NODE_DEMUX,
++            IMAGING_NODE_SPLIT,
++            IMAGING_NODE_PG_PORT_IN,
++            IMAGING_NODE_PG_PORT_OUT,
++            IMAGING_NODE_NONE
++    };
++    /**
++     * \struct BaseGraphNode
++     * Base structure that is used for the three types of nodes that
++     * the camera graph has at different levels
++     * Top level meta-graph made out of subgraphs
++     * Medium level graph made out of sources, PG's, sink etc..
++     * Inner graph that represent the imaging elements inside the Program Group
++     * nodes the inner graph is made out of kernels, mux/demux and ports of the
++     * PG's
++     * This structure has the basics to traverse the graph in any direction
++     * using standard graph traversal algorithms.
++     */
++
++    struct BaseGraphNode {
++        std::string name;
++        IGraphConfig* data;
++        bool visited;
++        std::map<BaseGraphNode*, std::string > parents;
++        std::map<BaseGraphNode*, std::string> children;
++        BaseGraphNode(): data(nullptr), visited(false) {}
++        void addParent(BaseGraphNode *p, std::string pinId) {
++            parents.insert(std::pair<BaseGraphNode*, std::string>(p, pinId));
++        }
++        void addChild(BaseGraphNode *c, std::string pinId) {
++            children.insert(std::pair<BaseGraphNode*, std::string>(c, pinId));
++        }
++        void removeChild(BaseGraphNode *c) {
++            auto it = children.find(c);
++            if (it != children.end()) {
++                children.erase(it);
++            }
++        }
++        void removeParent(BaseGraphNode *p) {
++            auto it = parents.find(p);
++            if (it != parents.end()) {
++                parents.erase(it);
++            }
++        }
++        void emanzipate() {
++            for (auto &p : parents) {
++                p.first->removeChild(this);
++            }
++            for (auto &c : children) {
++                c.first->removeParent(this);
++            }
++        }
++    };
++
++    struct GraphNode : public BaseGraphNode {
++        ia_uid type;    /**<GCSS_KEY_HW, GCSS_KEY_PROGRAM_GROUP, GCSS_KEY_SINK */
++        int32_t streamId;
++        int32_t exeCtxId;
++        GraphNode(): BaseGraphNode(),
++                     type(GCSS_KEY_PROGRAM_GROUP),
++                     streamId(-1),
++                     exeCtxId(-1){}
++    };
++    typedef std::shared_ptr<GraphNode> GraphNodePtr;
++
++    enum ImagingNodeFlags {
++        IMAGING_NODE_FLAG_NONE,
++        IMAGING_NODE_FLAG_RCB            = (0x1 << 0),      /*<! if this imaging node kernel is a Resolution Changing Block or not*/
++        IMAGING_NODE_FLAG_PRIVATE_PORT   = (0x1 << 1),
++        IMAGING_NODE_FLAG_DISABLED       = (0x1 << 2),  /*<! This flag has the same meaning as the kernel enabled field, but is generic for all types of imaging nodes */
++        IMAGING_NODE_FLAG_MAX            = (0x1 << 3)
++    };
++    /**
++     * \struct ImagingNode
++     * Node in the pipe of imaging elements (kernels)
++     * This struct is used to create a graph of nodes and perform operations
++     * in topological order, like the resolution history calculation.
++     * The information of the links is derived from kernel links(klink)
++     * The resolution history used for the run_kernel struct is usually filled
++     * from the parent. The modifications of the history from this node
++     * are stored in the member nextresolutionHistory. They are meant for the children
++     * nodes.
++     * In order to suport kernels with more than 1 child we have the resoltuion
++     * info and nextresolutionHistory as vectors, one per output klink
++     */
++    struct ImagingNode : public BaseGraphNode {
++        ImagingNodeType type;
++        int32_t flags;
++        std::map<std::string, ia_isp_bxt_resolution_info_t> resolutionInfo;  /*<! resolution info for each of the outputs of this kernel, key is kernel output pin name */
++        std::map<std::string, ia_isp_bxt_resolution_info_t> nextResolutionHistory; /*<! resolution history for the NEXT kernels (children nodes) ,  key is kernel output pin name*/
++        ia_isp_bxt_resolution_info_t currentHistory;
++        ia_isp_bxt_run_kernels_t kernelInfo; /*<! local copy used for temporary operations */
++        ia_isp_bxt_run_kernels_t *outKInfo; /*<! preallocated run_kernels for output towards AIC.*/
++        int32_t routingActivePath; /*<! In case this node is a routing element (mux/demux) this member stores the active input/output */
++        ImagingNode();
++    };
++    typedef std::shared_ptr<ImagingNode> ImagingNodePtr;
++
++    /**
++     * \struct SubGraphInfo
++     * Container for the information of a single subgraph.
++     * The type of subgraph can be stream-id or exec-ctx.
++     * It can be also considered a node of a meta-graph made out of subgraphs.
++     */
++    struct SubGraphInfo : public BaseGraphNode {
++        ia_uid subgraphType;  /**< gcss key for exec-ctx or stream-id */
++        int32_t id;           /**< id fo the subgraph */
++        /**< if the subgraph type is stream id this value is the same as id,
++         * if subgraph type is execution context then this value is the stream
++         * id of all the nodes inside the subgraph, there cannot be more than 1
++         **/
++        int32_t streamId;
++        uint32_t ispTuningMode;
++        std::vector<GraphNode*> nodes;
++        std::vector<IGraphConfig*> pgs;
++        std::vector<IGraphConfig*> inputPorts;
++        std::vector<IGraphConfig*> outputPorts;
++        size_t kernelCount;
++        ia_isp_bxt_run_kernels_t *kernelMemory;
++        std::map<std::string, ImagingNodePtr> imagingGraph;
++        SubGraphInfo() : BaseGraphNode(),
++                         subgraphType(GCSS_KEY_STREAM_ID),
++                         id(0), streamId(-1),
++                         ispTuningMode(0),kernelCount(0),
++                         kernelMemory(nullptr) {}
++    };
++    typedef std::shared_ptr<SubGraphInfo> SubGraphInfoPtr;
++
++    struct KernelLink {
++        KernelLink(IGraphConfig &kl);
++        bool isSrcAPort() { return srcPin.empty(); }
++        bool isDstAPort() { return dstPin.empty(); }
++        std::string toStr() { return srcNode + ":" + srcPin + "->" + dstNode + ":" + dstPin; }
++        std::string srcNode;
++        std::string srcPin;
++        std::string dstNode;
++        std::string dstPin;
++    };
++private: //methods
++    css_err_t analyzeGraphSettings();
++    css_err_t allocateAicData();
++    void deleteAicStructs();
++    css_err_t populateAicData();
++    css_err_t removeUnusedNodes();
++    css_err_t disableKernelsToDisabledTerminals(SubGraphInfo &sgInfo);
++    css_err_t analyzeSubGraphs(std::map<int32_t, SubGraphInfoPtr> &infoMap);
++    css_err_t addGraphNode(IGraphConfig &node);
++    css_err_t addGraphConnection(IGraphConfig &node);
++    css_err_t addImagingNode(SubGraphInfo& sgInfo, IGraphConfig& kernel, std::string pgName);
++    css_err_t addImagingLink(SubGraphInfo &ctxInfo, IGraphConfig &klink,
++                             IGraphConfig &pg);
++    css_err_t addRoutingNode(SubGraphInfo &sgInfo, IGraphConfig &routing,
++                             ImagingNodeType type, std::string pgName);
++    css_err_t collectPgInnerGraph(SubGraphInfo &sgi, IGraphConfig &pg);
++    css_err_t collectSourceInnerGraph(SubGraphInfo &sgi);
++    css_err_t collectInterPgConnections(SubGraphInfo &sgi);
++    css_err_t collectSubgraphConnections();
++    css_err_t traverseGraph(BaseGraphNode *item,
++                            std::function<css_err_t(BaseGraphNode*)> &f,
++                            bool forward = true);
++    css_err_t getDownstreamSubgraphs(IGraphConfig *src,
++                                    std::vector<int32_t> &subgraphIds);
++    css_err_t calculateSourceResHistory(SubGraphInfo &sgi,
++                                       ia_isp_bxt_resolution_info_t &resHistory);
++    css_err_t fillAicRunKernels(SubGraphInfo &sgi);
++    css_err_t getUpstreamResHistory(ImagingNode &portNode);
++    css_err_t getCrossSgInPorts(GraphNode &node,
++                                std::vector<IGraphConfig *> &ports);
++    css_err_t getParentHistory(ImagingNode &child,
++                               ia_isp_bxt_resolution_info_t &parentHistory);
++    css_err_t getKernelResolutionInfos(ImagingNode &kNode);
++    css_err_t disableDisconnectedKernels(SubGraphInfo &sgi);
++    void getAvailableSubgraphs(std::set<int32_t> &ids);
++    void resetGraph();
++    void resetInnerGraph(SubGraphInfo &sgi, bool reportUnvisited = true);
++    void resetMetaGraph();
++    css_err_t subgraphConnectionVisitor(BaseGraphNode *n);
++    css_err_t resHistoryCalcVisitor(BaseGraphNode *n);
++    css_err_t resHistoryINodeVisitor(BaseGraphNode *n);
++    css_err_t kernelDisableVisitor(BaseGraphNode *n, bool forward = false);
++    css_err_t kernelDisconectedVisitor(BaseGraphNode *n, bool forward = false);
++    css_err_t activeNodeVisitor(BaseGraphNode *n, std::vector<std::string> *nodes);
++    css_err_t getUnvisitedInputPortsPeers(SubGraphInfo &sgi, std::vector<ImagingNode*> &internalInputPeers);
++    // Debug utils
++    void dumpSubGraphInfos();
++    void dumpInnerGraph(int32_t id);
++    void dumpOuterGraph();
++    void dumpAicStructs();
++    static css_err_t dumpInnerNodeVisitor(BaseGraphNode *item, ImagingNodeType type);
++    static css_err_t printOuterNode(BaseGraphNode *item);
++private: // members
++    const IGraphConfig *mGraphSettings;
++    ia_uid mSubgraphType;   /**< GCSS_KEY_STREAM_ID, GCSS_KEY_EXEC_CTX_ID */
++    ia_isp_bxt_resolution_info_t mSourceHistory;
++
++    /**
++     * map with the Info for each subgraph, the key is the subgraph id.
++     * The concrete subrgraph type is passed in the constructor
++     * we can use stream-id or execution-context-id
++     * The inner graphs are stored in the SubgraphInfo structure
++     */
++    std::map<int32_t, SubGraphInfoPtr> mSubgraphInfoMap;
++
++    /**
++     * outer graph as represented by the lighter GraphNode structures.
++     * The key is the name of the node.
++     */
++    std::map<std::string, GraphNodePtr> mGraphNodes;
++    std::vector<IGraphConfig*> mConnections;
++    /**
++     * map used to store the memory for the AIC structs associated with a given
++     * subgraph id. The key of the map is the subgraph-id
++     * This map is used only for memory management (alloc/free).
++     * The arrays stored here are used via the SubgraphInfo::kernelMemory field
++     */
++    std::map<int32_t, KernelInfoMemPool> mKernelMemoryMap;
++    /**
++    * map used to store the memory for the AIC structs associated with a given
++    * PG id. The key of the map is the IGraphConfig Node address that represents
++    * each node.
++    * This map is used only for memory management (alloc/free).
++    */
++    std::map<const IGraphConfig*, KernelInfoMemPool> mPGKernelMemoryMap;
++    /**
++     * IPU version
++     */
++    GCSS::GdfVersion mIpuVer;
++    /**
++     * if IPU version is < than 7 the computeKey is GCSS_KEY_PROGRAM_GROUP
++     * in IPU7 the concept of PG was replace with compute blocks. in this
++     * case the mComputeKeyUid id GCSS_KEY_COMPUTE_BLOCK
++     */
++    ia_uid mComputeKeyUid;
++};
++
++} //namespace GCSS
++
++
++#endif /* IA_CAMERA_GCSS_GRAPH_UTILS_GRAPH_UTILS_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
+new file mode 100644
+index 000000000000..63f14ef6aed3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
+@@ -0,0 +1,414 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2013-2018 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef _IA_CIPF_TYPES_H_
++#define _IA_CIPF_TYPES_H_
++
++#include <ia_tools/ia_list.h>
++#include <ia_tools/css_types.h>
++
++/** \file ia_cipf_types.h
++ *
++ * Definitions for datatypes used with public CIPF interfaces
++ *
++ * \ingroup ia_cipf
++ *
++ * Includes opaque CIPF objects and types for data management
++ */
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct _cipf_terminal ia_cipf_terminal_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct _cipf_container ia_cipf_container_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct _cipf_connection ia_cipf_connection_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_registry ia_cipf_registry_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct _cipf_property ia_cipf_property_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct _cipf_stage ia_cipf_stage_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef css_err_t (*ia_cipf_stage_completion_op_t)(ia_cipf_stage_t*, void *priv);
++
++/** ia_cipf_iterator_t - context of single pipeline iteration
++ *
++ * \ingroup ia_cipf
++ *
++ * Iterator object holds accessors (<stage, container>-pairs called parcels)
++ * for pipeline components associated with single execution step. Amount of
++ * stages and terminals within single execution step may vary based on
++ * DAG definition.
++ */
++typedef struct ia_cipf_iterator ia_cipf_iterator_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_pipe ia_cipf_pipe_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef uint32_t ia_uid;
++
++/**
++ * \ingroup ia_cipf
++ */
++#define ia_fourcc(a, b, c, d) ((uint32_t)(d) | ((uint32_t)(c) << 8) \
++                              | ((uint32_t)(b) << 16) | ((uint32_t)(a) << 24))
++
++ /**
++ * \ingroup ia_cipf
++ * macro used to print in traces the fourcc values
++ * firs macro is used to define the format.
++ */
++#define ia_fourcc_conv "%c%c%c%c"
++#define ia_fourcc_to_conv(fourcc) \
++        ((fourcc) >> 24) & 0x7f, ((fourcc) >> 16) & 0x7f,\
++        ((fourcc) >> 8) & 0x7f, (fourcc) & 0x7f
++
++typedef struct log_context log_context_t;
++
++/*
++ * \todo Add documentation where do the format definitions come from
++ * and/or how are they defined.
++ */
++
++/* Native UID definitions for fourcc pixel formats */
++#define ia_cipf_frame_fourcc_i420 ia_fourcc('V','4','2','0')
++#define ia_cipf_frame_fourcc_iyuv ia_fourcc('I','Y','U','V') /* YUV420 planar */
++#define ia_cipf_frame_fourcc_yv12 ia_fourcc('Y','V','1','2') /* YUV420 planar U and V reversed */
++#define ia_cipf_frame_fourcc_ciyuv ia_fourcc('C','I','Y','U') /* YUV420 planar 8bpe, compressed */
++#define ia_cipf_frame_fourcc_p01y ia_fourcc('P','0','1','Y') /* YUV420 planar 10bpp, compressed */
++#define ia_cipf_frame_fourcc_c420 ia_fourcc('C','4','2','0') /* YUV420 planar, 16bpe compressed */
++#define ia_cipf_frame_fourcc_m420 ia_fourcc('M','4','2','0') /* YUV420 semi-planar line interleaved */
++#define ia_cipf_frame_fourcc_nv12 ia_fourcc('N','V','1','2')
++#define ia_cipf_frame_fourcc_p412 ia_fourcc('P','4','1','2') /*YUV420 planar 12bpp */
++#define ia_cipf_frame_fourcc_cnv12_tnr ia_fourcc('C','T','1','2') /* Compressed planar NV12, for TNR input/output */
++#define ia_cipf_frame_fourcc_cnv12 ia_fourcc('C','N','1','2') /* Compressed semi-planar NV12,  */
++#define ia_cipf_frame_fourcc_pc10 ia_fourcc('P','C','1','0') /* Compressed semi-planar P010 MSB  */
++#define ia_cipf_frame_fourcc_pc12 ia_fourcc('P','C','1','2') /* Compressed semi-planar P012 MSB  */
++#define ia_cipf_frame_fourcc_nv21 ia_fourcc('N','V','2','1')
++#define ia_cipf_frame_fourcc_nv16 ia_fourcc('N','V','1','6')
++#define ia_cipf_frame_fourcc_yuy2 ia_fourcc('Y','U','Y','2')
++#define ia_cipf_frame_fourcc_ba10 ia_fourcc('B','A','1','0')
++#define ia_cipf_frame_fourcc_rg10 ia_fourcc('R','G','1','0')
++#define ia_cipf_frame_fourcc_bg10 ia_fourcc('B','G','1','0')
++#define ia_cipf_frame_fourcc_gb10 ia_fourcc('G','B','1','0')
++#define ia_cipf_frame_fourcc_gr08 ia_fourcc('G','R','0','8')
++#define ia_cipf_frame_fourcc_gr10 ia_fourcc('G','R','1','0')
++#define ia_cipf_frame_fourcc_grbg ia_fourcc('G','R','B','G')
++#define ia_cipf_frame_fourcc_rggb ia_fourcc('R','G','G','B')
++#define ia_cipf_frame_fourcc_bggr ia_fourcc('B','G','G','R')
++#define ia_cipf_frame_fourcc_gbrg ia_fourcc('G','B','R','G')
++#define ia_cipf_frame_fourcc_y800 ia_fourcc('Y','8','0','0')
++#define ia_cipf_frame_fourcc_tile ia_fourcc('T','I','L','E') /* NV12 tiled TileYUV420_8_SP */
++#define ia_cipf_frame_fourcc_cile ia_fourcc('C','I','L','E') /* NV12 tiled, compressed TileYUV420_8_SP_C */
++#define ia_cipf_frame_fourcc_bin8 ia_fourcc('B','I','N','8')
++#define ia_cipf_frame_fourcc_uyvy ia_fourcc('U','Y','V','Y')
++#define ia_cipf_frame_fourcc_srgb48 ia_fourcc('S','R','4','8')
++#define ia_cipf_frame_fourcc_yuv420_16_pl ia_fourcc('S','4','2','0')
++#define ia_cipf_frame_fourcc_yuv444_8_pl ia_fourcc('N','A','N','A')
++#define ia_cipf_frame_fourcc_yuv420_8_sp_c_tnr ia_fourcc('C','T','1','2')
++#define ia_cipf_frame_fourcc_yuv420_16_sp ia_fourcc('P','0','1','6')
++
++/* pdaf bayer formats */
++#define ia_cipf_frame_fourcc_pafn ia_fourcc('P','A','F','n')
++#define ia_cipf_frame_fourcc_pafi ia_fourcc('P','A','F','i')
++#define ia_cipf_frame_fourcc_paf_08 ia_fourcc('P','F','8','n')
++#define ia_cipf_frame_fourcc_paf_10 ia_fourcc('P','F','1','n')
++#define ia_cipf_frame_fourcc_paf_12 ia_fourcc('P','F','2','n')
++#define ia_cipf_frame_fourcc_paf_14 ia_fourcc('P','F','4','n')
++#define ia_cipf_frame_fourcc_paf_16 ia_fourcc('P','F','6','n')
++
++#define ia_cipf_frame_fourcc_paf_08i ia_fourcc('P','F','8','i')
++#define ia_cipf_frame_fourcc_paf_10i ia_fourcc('P','F','1','i')
++#define ia_cipf_frame_fourcc_paf_12i ia_fourcc('P','F','2','i')
++#define ia_cipf_frame_fourcc_paf_14i ia_fourcc('P','F','4','i')
++#define ia_cipf_frame_fourcc_paf_16i ia_fourcc('P','F','6','i')
++
++#define ia_cipf_frame_fourcc_ba12 ia_fourcc('B','A','1','2')
++
++/* CSS format fourcc codes for export */
++#define css_fourcc_raw                  ia_fourcc('C','S','B','A')
++
++/* Vectorized Bayer formats */
++#define css_fourcc_bggr_10_v32          ia_fourcc('b','V','0','E')
++#define css_fourcc_gbrg_10_v32          ia_fourcc('b','V','0','F')
++#define css_fourcc_grbg_10_v32          ia_fourcc('b','V','0','G')
++#define css_fourcc_rggb_10_v32          ia_fourcc('b','V','0','H')
++#define css_fourcc_bggr_12_v32          ia_fourcc('b','V','0','I')
++#define css_fourcc_gbrg_12_v32          ia_fourcc('b','V','0','J')
++#define css_fourcc_grbg_12_v32          ia_fourcc('b','V','0','K')
++#define css_fourcc_rggb_12_v32          ia_fourcc('b','V','0','L')
++
++/* Not actually raw interleaved format but 12 bit vectorized GRBG bayer. Wrong
++ * naming but is still used in HAL.
++ ** \todo Remove this definition once there are no more dependencies */
++#define css_fourcc_raw_interleaved      css_fourcc_grbg_12_v32
++
++/* Packed vectorized Bayer formats */
++#define css_fourcc_bggr_10_v32_p64      ia_fourcc('b','V','0','M')
++#define css_fourcc_gbrg_10_v32_p64      ia_fourcc('b','V','0','N')
++#define css_fourcc_grbg_10_v32_p64      ia_fourcc('b','V','0','O')
++#define css_fourcc_rggb_10_v32_p64      ia_fourcc('b','V','0','P')
++#define css_fourcc_bggr_12_v32_p64      ia_fourcc('b','V','0','Q')
++#define css_fourcc_gbrg_12_v32_p64      ia_fourcc('b','V','0','R')
++#define css_fourcc_grbg_12_v32_p64      ia_fourcc('b','V','0','S')
++#define css_fourcc_rggb_12_v32_p64      ia_fourcc('b','V','0','T')
++
++/* Packed Normal Bayer Formats */
++#define css_fourcc_bggr_14_p64          ia_fourcc('p','B','E','E')
++#define css_fourcc_gbrg_14_p64          ia_fourcc('p','G','E','E')
++#define css_fourcc_grbg_14_p64          ia_fourcc('p','g','E','E')
++#define css_fourcc_rggb_14_p64          ia_fourcc('p','R','E','E')
++#define css_fourcc_bggr_12_p64          ia_fourcc('p','B','C','C')
++#define css_fourcc_gbrg_12_p64          ia_fourcc('p','G','C','C')
++#define css_fourcc_grbg_12_p64          ia_fourcc('p','g','C','C')
++#define css_fourcc_rggb_12_p64          ia_fourcc('p','R','C','C')
++#define css_fourcc_bggr_10_p64          ia_fourcc('p','B','A','A')
++#define css_fourcc_gbrg_10_p64          ia_fourcc('p','G','A','A')
++#define css_fourcc_grbg_10_p64          ia_fourcc('p','g','A','A')
++#define css_fourcc_rggb_10_p64          ia_fourcc('p','R','A','A')
++
++/* Line interleaved formats */
++#define css_fourcc_bggr_10_li           ia_fourcc('C','S','L','0')
++#define css_fourcc_gbrg_10_li           ia_fourcc('C','S','L','1')
++#define css_fourcc_grbg_10_li           ia_fourcc('C','S','L','2')
++#define css_fourcc_rggb_10_li           ia_fourcc('C','S','L','3')
++#define css_fourcc_bggr_12_li           ia_fourcc('C','S','L','4')
++#define css_fourcc_gbrg_12_li           ia_fourcc('C','S','L','5')
++#define css_fourcc_grbg_12_li           ia_fourcc('C','S','L','6')
++#define css_fourcc_rggb_12_li           ia_fourcc('C','S','L','7')
++
++/* Compressed bayer formats */
++#define css_fourcc_bggr_8_c             ia_fourcc('B','G','8','C')
++#define css_fourcc_gbrg_8_c             ia_fourcc('G','B','8','C')
++#define css_fourcc_grbg_8_c             ia_fourcc('G','R','8','C')
++#define css_fourcc_rggb_8_c             ia_fourcc('R','G','8','C')
++#define css_fourcc_bggr_10_c            ia_fourcc('B','G','1','C')
++#define css_fourcc_gbrg_10_c            ia_fourcc('G','B','1','C')
++#define css_fourcc_grbg_10_c            ia_fourcc('G','R','1','C')
++#define css_fourcc_rggb_10_c            ia_fourcc('R','G','1','C')
++
++/* YUV formats */
++#define css_fourcc_internal_yuv_line    ia_fourcc('C','S','Y','C')
++#define css_fourcc_yyuv420_v32          ia_fourcc('y','0','3','2')
++#define css_fourcc_yyuv420_12_v32_p64   ia_fourcc('y','0','3','6')
++#define css_fourcc_yuv420_internal      ia_fourcc('C','S','Y','I') /* denotes all YUVs with bpe 8, for TNR, for example */
++#define css_fourcc_yplanar              ia_fourcc('C','S','Y','P')
++#define css_fourcc_yuv420_12_p64        ia_fourcc('C','S','4','2')
++#define css_fourcc_yuv420_10_p64        ia_fourcc('C','S','4','0')
++
++#define css_fourcc_p010                 ia_fourcc('P','0','1','0')
++#define css_fourcc_p010_lsb             ia_fourcc('P','0','1','L')
++/* Intel internal format: P010 Tile-Y (MSB) */
++#define css_fourcc_p010_msb_tile_y          ia_fourcc('T','0','1','0')  /* TileYUV420_10_SP */
++/* Intel internal format: P010 Tile-Y (MSB), compressed*/
++#define css_fourcc_p010_msb_cile_y          ia_fourcc('C','0','1','0') /* TileYUV420_10_SP_C */
++
++#define css_fourcc_p012                 ia_fourcc('P','0','1','2')
++#define css_fourcc_p012_lsb             ia_fourcc('P','L','1','2')
++/* Intel internal format: P012 Tile-Y (MSB) */
++#define css_fourcc_p012_msb_tile_y          ia_fourcc('T','0','1','2') /* TileYUV420_12_SP */
++/* Intel internal format: P012 Tile-Y (MSB), compressed*/
++#define css_fourcc_p012_msb_cile_y          ia_fourcc('C','0','1','2') /* TileYUV420_12_SP_C */
++
++#define css_fourcc_yuv420_12_pl          ia_fourcc('P','4','1','2')
++
++#define ia_cipf_frame_fourcc_ir16 ia_fourcc('I','R','1','6')
++
++/* Native object type reference UIDs */
++#define ia_cipf_pipeline_location_ref_uid   ia_fourcc('P','O','L','R')
++#define ia_cipf_platform_buffer_ref_uid     ia_fourcc('P','O','B','R')
++#define ia_cipf_platform_buffer_offset_uid  ia_fourcc('P','O','B','O')
++#define ia_cipf_platform_memory_ref_uid     ia_fourcc('P','O','M','R')
++#define ia_cipf_platform_memory_device_ref_uid ia_fourcc('P','O','M','D')
++
++/* Native type payload UIDs */
++#define ia_cipf_payload_uid_int32           ia_fourcc('D','A','$','0')
++#define ia_cipf_payload_uid_uint32          ia_fourcc('D','A','$','1')
++#define ia_cipf_payload_uid_resolution      ia_fourcc('D','A','$','2')
++#define ia_cipf_payload_uid_boolean         ia_fourcc('D','A','$','3')
++#define ia_cipf_payload_uid_uint64          ia_fourcc('D','A','$','4')
++#define ia_cipf_payload_uid_void_ref        ia_fourcc('D','R','$','0')
++#define ia_cipf_payload_uid_int32_ref       ia_fourcc('D','R','$','1')
++#define ia_cipf_payload_uid_uint32_ref      ia_fourcc('D','R','$','2')
++#define ia_cipf_payload_uid_resolution_ref  ia_fourcc('D','R','$','3')
++#define ia_cipf_payload_uid_string_ref      ia_fourcc('D','R','$','4')
++#define ia_cipf_payload_uid_uint64_ref      ia_fourcc('D','R','$','5')
++#define ia_cipf_payload_uid_offset_ref      ia_fourcc('D','O','$','0')
++
++/* Native payload for special unidentified property */
++#define ia_cipf_payload_uid_unidentified    ia_fourcc('U','I','P','R')
++
++/* Native property UIDs */
++#define ia_cipf_frame_format_uid ia_fourcc('P','X','F','M')
++#define ia_cipf_frame_uid ia_fourcc('F','R','A','M')
++#define ia_cipf_fragment_descriptor_uid ia_fourcc('F','R','D','S')
++#define ia_cipf_property_data_uid ia_fourcc('D','A','T','A')
++#define ia_cipf_tunneled_terminal_data_uid  ia_fourcc('A','U','T','O')
++
++#define IA_CIPF_PAYLOAD_STORAGE_SIZE 8
++
++/** Identifiable data payload type
++ *
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_payload {
++    ia_uid     uid;  /* data type identifier */
++    uint32_t   size; /* size in bytes allocated to data.cpu_ptr */
++    union {
++        void        *cpu_ptr;
++        uint32_t    offset;
++        uint32_t    handle;
++        uint8_t     raw[IA_CIPF_PAYLOAD_STORAGE_SIZE];
++        uint32_t    uvalue;
++        uint64_t    u64value;
++        int32_t     svalue;
++    } data;
++} ia_cipf_payload_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_frame_format {
++    uint32_t        width;    /**< Width of the frame in pixels */
++    uint32_t        height;   /**< Height of the frame in lines */
++    uint32_t        fourcc;   /**< Frame format */
++    uint32_t        bpl;      /**< Bytes per line*/
++    uint32_t        bpp;      /**< Bits per pixel */
++} ia_cipf_frame_format_t;
++
++#define IA_CIPF_MAX_PLANES 6
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_timestamp {
++    uint64_t seconds; /**< Number of whole seconds */
++    uint64_t useconds; /**< Rest of the time in microseconds */
++} ia_cipf_timestamp_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_frame {
++    ia_uid              uid;
++    uint32_t            id;
++    uint32_t            sequence;
++    ia_cipf_timestamp_t timestamp;
++    uint32_t            flags;
++    uint32_t            allocated;
++    uint32_t            planes;
++    ia_cipf_payload_t   payload[IA_CIPF_MAX_PLANES];
++} ia_cipf_frame_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_buffer {
++    ia_cipf_payload_t    payload;
++} ia_cipf_buffer_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef enum ia_cipf_terminal_type {
++    ia_cipf_terminal_type_frame_input,
++    ia_cipf_terminal_type_frame_output,
++    ia_cipf_terminal_type_param_input,
++    ia_cipf_terminal_type_param_output
++} ia_cipf_terminal_type_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef enum ia_cipf_connection_type {
++    connection_type_push, /* data is pushed by source stage execute */
++    connection_type_pull  /* data is pulled by sink stage execute */
++} ia_cipf_connection_type_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_point {
++    uint16_t x;
++    uint16_t y;
++} ia_cipf_point_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_rect {
++    uint16_t x;
++    uint16_t y;
++    uint16_t width;
++    uint16_t height;
++} ia_cipf_rect_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_resolution {
++    uint16_t width;
++    uint16_t height;
++} ia_cipf_resolution_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_association {
++    ia_uid stage;
++    ia_uid terminal;
++    ia_uid property;
++} ia_cipf_association_t;
++
++/**
++ * \ingroup ia_cipf
++ */
++typedef struct ia_cipf_fragment_desc {
++    ia_cipf_resolution_t size;
++    ia_cipf_point_t start;
++} ia_cipf_fragment_desc_t;
++
++#endif /* _IA_CIPF_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
+new file mode 100644
+index 000000000000..680248b5d2b6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
+@@ -0,0 +1,1021 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2013-2020 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef _IA_CIPF_CSS_H_
++#define _IA_CIPF_CSS_H_
++
++#include <ia_cipf/ia_cipf_types.h>
++
++/* Note:
++ * PSYS Library is considered to query UIDs from binary releases
++ * or from other external definition (markup language?)
++ *
++ * Here we would define only the ones statically integrated
++ */
++
++#define psys_2401_vfpp_pg_uid       ia_fourcc('V','F','P','P')
++#define psys_2401_vfpp_in_uid       psys_2401_vfpp_pg_uid + 1
++#define psys_2401_vfpp_out_uid      psys_2401_vfpp_pg_uid + 2
++#define psys_2401_vfpp_params_uid   psys_2401_vfpp_pg_uid + 3
++
++#define psys_2401_preview_pg_uid     ia_fourcc('P','R','E','0')
++#define psys_2401_preview_in_uid     psys_2401_preview_pg_uid + 1
++#define psys_2401_preview_out_uid    psys_2401_preview_pg_uid + 2
++#define psys_2401_preview_params_uid psys_2401_preview_pg_uid + 3
++
++#define psys_2401_capture_pg_uid                ia_fourcc('P','R','I','0')
++#define psys_2401_capture_in_uid                psys_2401_capture_pg_uid + 1
++#define psys_2401_capture_params_uid            psys_2401_capture_pg_uid + 2
++#define psys_2401_capture_main_output_uid       psys_2401_capture_pg_uid + 3
++#define psys_2401_capture_vfpp_output_uid       psys_2401_capture_pg_uid + 4
++
++#define psys_2401_codec_uid               ia_fourcc('2','4','C','O')
++#define psys_2401_3A_grid_info_uid        psys_2401_codec_uid + 1
++#define psys_2401_3A_statistics_uid       psys_2401_codec_uid + 2
++
++#define psys_2401_lsc_table_uid         ia_fourcc('2','4','P','A')
++#define psys_2401_3A_statistics_hi_uid  psys_2401_lsc_table_uid + 1
++#define psys_2401_3A_statistics_lo_uid  psys_2401_lsc_table_uid + 2
++#define psys_2401_3A_histogram_uid      psys_2401_lsc_table_uid + 3
++
++/* 2600 UIDS */
++#define psys_2600_small_uid         ia_fourcc('S','M','A','0')
++#define psys_2600_small_input_uid   psys_2600_small_uid + 1
++#define psys_2600_small_output_uid  psys_2600_small_uid + 2
++#define psys_2600_small_param_uid   psys_2600_small_uid + 3
++#define psys_2600_small_secondary_output_uid psys_2600_small_uid + 4
++
++#define psys_2600_pg_uid(id) ia_fourcc(((id & 0xFF00) >> 8),id,'G','0')
++#define psys_2600_pg_id_from_uid(uid) ((uid & 0xFFFF0000) >> 16)
++#define is_psys_stage_uid(uid) ((uid & 0x0000FFFF) == psys_2600_pg_uid(0))
++
++#define psys_2600_4k60_pg_id        107
++#define psys_2600_4k60_uid          psys_2600_pg_uid(psys_2600_4k60_pg_id)
++#define psys_2600_4k60_param_uid    psys_2600_4k60_uid + 1
++#define psys_2600_4k60_input_uid    psys_2600_4k60_uid + 2
++#define psys_2600_4k60_output_uid   psys_2600_4k60_uid + 3
++#define psys_2600_4k60_secondary_output_uid psys_2600_4k60_uid + 4
++
++#define psys_2600_uvswap_pg_id        119
++#define psys_2600_uvswap_uid          psys_2600_pg_uid(psys_2600_uvswap_pg_id)
++#define psys_2600_uvswap_param_uid    psys_2600_uvswap_uid + 1
++#define psys_2600_uvswap_input_uid    psys_2600_uvswap_uid + 2
++#define psys_2600_uvswap_output_uid   psys_2600_uvswap_uid + 3
++
++#define psys_2600_popg_pg_id                201
++#define psys_2600_popg_uid                  psys_2600_pg_uid(psys_2600_popg_pg_id)
++#define psys_2600_popg_param_uid            psys_2600_popg_uid + 1
++#define psys_2600_popg_program_uid          psys_2600_popg_uid + 2
++#define psys_2600_popg_input_uid            psys_2600_popg_uid + 3
++#define psys_2600_popg_output_uid           psys_2600_popg_uid + 4
++#define psys_2600_popg_secondary_output_uid psys_2600_popg_uid + 5
++
++/* \todo Temporarily switched to use still post-gdc PG */
++#define psys_2600_post_gdc_pg_id                118
++#define psys_2600_post_gdc_uid                  psys_2600_pg_uid(psys_2600_post_gdc_pg_id)
++#define psys_2600_post_gdc_param_uid            psys_2600_post_gdc_uid + 1
++#define psys_2600_post_gdc_program_uid          psys_2600_post_gdc_uid + 2
++#define psys_2600_post_gdc_input_uid            psys_2600_post_gdc_uid + 3
++#define psys_2600_post_gdc_spatial_param_uid    psys_2600_post_gdc_uid + 4
++#define psys_2600_post_gdc_output_uid           psys_2600_post_gdc_uid + 5
++#define psys_2600_post_gdc_secondary_output_uid psys_2600_post_gdc_uid + 6
++#define psys_2600_post_gdc_third_output_uid     psys_2600_post_gdc_uid + 7
++
++#define psys_2600_video_post_gdc_pg_id                114
++#define psys_2600_video_post_gdc_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_pg_id)
++#define psys_2600_video_post_gdc_param_uid            psys_2600_video_post_gdc_uid + 1
++#define psys_2600_video_post_gdc_program_uid          psys_2600_video_post_gdc_uid + 2
++#define psys_2600_video_post_gdc_input_uid            psys_2600_video_post_gdc_uid + 3
++#define psys_2600_video_post_gdc_spatial_param_uid    psys_2600_video_post_gdc_uid + 4
++#define psys_2600_video_post_gdc_output_uid           psys_2600_video_post_gdc_uid + 5
++#define psys_2600_video_post_gdc_secondary_output_uid psys_2600_video_post_gdc_uid + 6
++#define psys_2600_video_post_gdc_third_output_uid     psys_2600_video_post_gdc_uid + 7
++#define psys_2600_video_post_gdc_tnr_input_uid        psys_2600_video_post_gdc_uid + 8
++#define psys_2600_video_post_gdc_tnr_output_uid       psys_2600_video_post_gdc_uid + 9
++
++#define psys_2600_video_post_gdc_v2_pg_id                129
++#define psys_2600_video_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_pg_id)
++#define psys_2600_video_post_gdc_v2_param_uid            psys_2600_video_post_gdc_v2_uid + 1
++#define psys_2600_video_post_gdc_v2_program_uid          psys_2600_video_post_gdc_v2_uid + 2
++#define psys_2600_video_post_gdc_v2_input_uid            psys_2600_video_post_gdc_v2_uid + 3
++#define psys_2600_video_post_gdc_v2_spatial_param_uid    psys_2600_video_post_gdc_v2_uid + 4
++#define psys_2600_video_post_gdc_v2_output_uid           psys_2600_video_post_gdc_v2_uid + 5
++#define psys_2600_video_post_gdc_v2_secondary_output_uid psys_2600_video_post_gdc_v2_uid + 6
++#define psys_2600_video_post_gdc_v2_third_output_uid     psys_2600_video_post_gdc_v2_uid + 7
++#define psys_2600_video_post_gdc_v2_tnr_input_uid        psys_2600_video_post_gdc_v2_uid + 8
++#define psys_2600_video_post_gdc_v2_tnr_output_uid       psys_2600_video_post_gdc_v2_uid + 9
++
++#define psys_2600_video_post_gdc_mbr_pg_id                132
++#define psys_2600_video_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_mbr_pg_id)
++#define psys_2600_video_post_gdc_mbr_param_uid            psys_2600_video_post_gdc_mbr_uid + 1
++#define psys_2600_video_post_gdc_mbr_program_uid          psys_2600_video_post_gdc_mbr_uid + 2
++#define psys_2600_video_post_gdc_mbr_input_uid            psys_2600_video_post_gdc_mbr_uid + 3
++#define psys_2600_video_post_gdc_mbr_spatial_param_uid    psys_2600_video_post_gdc_mbr_uid + 4
++#define psys_2600_video_post_gdc_mbr_output_uid           psys_2600_video_post_gdc_mbr_uid + 5
++#define psys_2600_video_post_gdc_mbr_secondary_output_uid psys_2600_video_post_gdc_mbr_uid + 6
++#define psys_2600_video_post_gdc_mbr_third_output_uid     psys_2600_video_post_gdc_mbr_uid + 7
++#define psys_2600_video_post_gdc_mbr_tnr_input_uid        psys_2600_video_post_gdc_mbr_uid + 8
++#define psys_2600_video_post_gdc_mbr_tnr_output_uid       psys_2600_video_post_gdc_mbr_uid + 9
++
++#define psys_2600_video_post_gdc_v2_mbr_pg_id                172
++#define psys_2600_video_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_v2_mbr_pg_id)
++#define psys_2600_video_post_gdc_v2_mbr_param_uid            psys_2600_video_post_gdc_v2_mbr_uid + 1
++#define psys_2600_video_post_gdc_v2_mbr_program_uid          psys_2600_video_post_gdc_v2_mbr_uid + 2
++#define psys_2600_video_post_gdc_v2_mbr_input_uid            psys_2600_video_post_gdc_v2_mbr_uid + 3
++#define psys_2600_video_post_gdc_v2_mbr_spatial_param_uid    psys_2600_video_post_gdc_v2_mbr_uid + 4
++#define psys_2600_video_post_gdc_v2_mbr_output_uid           psys_2600_video_post_gdc_v2_mbr_uid + 5
++#define psys_2600_video_post_gdc_v2_mbr_secondary_output_uid psys_2600_video_post_gdc_v2_mbr_uid + 6
++#define psys_2600_video_post_gdc_v2_mbr_third_output_uid     psys_2600_video_post_gdc_v2_mbr_uid + 7
++#define psys_2600_video_post_gdc_v2_mbr_tnr_input_uid        psys_2600_video_post_gdc_v2_mbr_uid + 8
++#define psys_2600_video_post_gdc_v2_mbr_tnr_output_uid       psys_2600_video_post_gdc_v2_mbr_uid + 9
++
++#define psys_2600_video_pre_gdc_pg_id        116
++#define psys_2600_video_pre_gdc_uid          psys_2600_pg_uid(psys_2600_video_pre_gdc_pg_id)
++#define psys_2600_video_pre_gdc_param_uid    psys_2600_video_pre_gdc_uid + 1
++#define psys_2600_video_pre_gdc_program_uid  psys_2600_video_pre_gdc_uid + 2
++#define psys_2600_video_pre_gdc_input_uid    psys_2600_video_pre_gdc_uid + 3
++#define psys_2600_video_pre_gdc_output_uid   psys_2600_video_pre_gdc_uid + 4
++
++#define psys_2600_ipu5_video_pre_gdc_pg_id                  140
++#define psys_2600_ipu5_video_pre_gdc_uid                    psys_2600_pg_uid(psys_2600_ipu5_video_pre_gdc_pg_id)
++#define psys_2600_ipu5_video_pre_gdc_param_uid              psys_2600_ipu5_video_pre_gdc_uid + 1
++#define psys_2600_ipu5_video_pre_gdc_program_uid            psys_2600_ipu5_video_pre_gdc_uid + 2
++#define psys_2600_ipu5_video_pre_gdc_param_spatial_in_uid   psys_2600_ipu5_video_pre_gdc_uid + 3
++#define psys_2600_ipu5_video_pre_gdc_input_uid              psys_2600_ipu5_video_pre_gdc_uid + 4
++#define psys_2600_ipu5_video_pre_gdc_output_uid             psys_2600_ipu5_video_pre_gdc_uid + 5
++
++#define psys_ipu5_video_pre_gdc_vpless_pg_id                    167
++#define psys_ipu5_video_pre_gdc_vpless_uid                      psys_2600_pg_uid(psys_ipu5_video_pre_gdc_vpless_pg_id)
++#define psys_ipu5_video_pre_gdc_vpless_param_uid                psys_ipu5_video_pre_gdc_vpless_uid + 1
++#define psys_ipu5_video_pre_gdc_vpless_program_uid              psys_ipu5_video_pre_gdc_vpless_uid + 2
++#define psys_ipu5_video_pre_gdc_vpless_program_control_init_uid psys_ipu5_video_pre_gdc_vpless_uid + 3
++#define psys_ipu5_video_pre_gdc_vpless_input_uid                psys_ipu5_video_pre_gdc_vpless_uid + 4
++#define psys_ipu5_video_pre_gdc_vpless_output_uid               psys_ipu5_video_pre_gdc_vpless_uid + 5
++#define psys_ipu5_video_pre_gdc_gammastar_grid_uid              psys_ipu5_video_pre_gdc_vpless_uid + 6
++#define psys_ipu5_video_pre_gdc_dvs_mv_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 7
++#define psys_ipu5_video_pre_gdc_dvs_mv_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 8
++#define psys_ipu5_video_pre_gdc_dvs_mv_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 9
++#define psys_ipu5_video_pre_gdc_dvs_fe_in_l0_uid                psys_ipu5_video_pre_gdc_vpless_uid + 10
++#define psys_ipu5_video_pre_gdc_dvs_fe_in_l1_uid                psys_ipu5_video_pre_gdc_vpless_uid + 11
++#define psys_ipu5_video_pre_gdc_dvs_fe_in_l2_uid                psys_ipu5_video_pre_gdc_vpless_uid + 12
++#define psys_ipu5_video_pre_gdc_dvs_fe_out_l0_uid               psys_ipu5_video_pre_gdc_vpless_uid + 13
++#define psys_ipu5_video_pre_gdc_dvs_fe_out_l1_uid               psys_ipu5_video_pre_gdc_vpless_uid + 14
++#define psys_ipu5_video_pre_gdc_dvs_fe_out_l2_uid               psys_ipu5_video_pre_gdc_vpless_uid + 15
++
++#define psys_2600_ipu6_lb_video_pg_id                  182
++#define psys_2600_ipu6_lb_video_uid                    psys_2600_pg_uid(psys_2600_ipu6_lb_video_pg_id)
++#define psys_2600_ipu6_lb_video_param_uid              psys_2600_ipu6_lb_video_uid + 1
++#define psys_2600_ipu6_lb_video_program_uid            psys_2600_ipu6_lb_video_uid + 2
++#define psys_2600_ipu6_lb_video_program_control_uid    psys_2600_ipu6_lb_video_uid + 3
++#define psys_2600_ipu6_lb_video_input_uid              psys_2600_ipu6_lb_video_uid + 4
++#define psys_2600_ipu6_lb_video_output_uid             psys_2600_ipu6_lb_video_uid + 5
++
++#define psys_ipu6_bb_pg_id                 189
++#define psys_ipu6_bb_uid                   psys_2600_pg_uid(psys_ipu6_bb_pg_id)
++#define psys_ipu6_bb_input_uid             (psys_ipu6_bb_uid + 1)
++#define psys_ipu6_bb_mp_uid                (psys_ipu6_bb_uid + 2)
++#define psys_ipu6_bb_dp_uid                (psys_ipu6_bb_uid + 3)
++#define psys_ipu6_bb_ppp_uid               (psys_ipu6_bb_uid + 4)
++#define psys_ipu6_bb_tnr_ref_in_uid        (psys_ipu6_bb_uid + 5)
++#define psys_ipu6_bb_tnr_recsim_in_uid     (psys_ipu6_bb_uid + 6)
++#define psys_ipu6_bb_tnr_ref_out_uid       (psys_ipu6_bb_uid + 7)
++#define psys_ipu6_bb_tnr_recsim_out_uid    (psys_ipu6_bb_uid + 8)
++#define psys_ipu6_bb_program_control_uid   (psys_ipu6_bb_uid + 9)
++#define psys_ipu6_bb_param_in_uid          (psys_ipu6_bb_uid + 10)
++#define psys_ipu6_bb_program_uid           (psys_ipu6_bb_uid + 11)
++
++#define psys_ipu6_lb_rbm_pg_id                183
++#define psys_ipu6_lb_rbm_uid                  psys_2600_pg_uid(psys_ipu6_lb_rbm_pg_id)
++#define psys_ipu6_lb_rbm_param_uid            (psys_ipu6_lb_rbm_uid + 1)
++#define psys_ipu6_lb_rbm_program_uid          (psys_ipu6_lb_rbm_uid + 2)
++#define psys_ipu6_lb_rbm_program_control_uid  (psys_ipu6_lb_rbm_uid + 3)
++#define psys_ipu6_lb_rbm_input_uid            (psys_ipu6_lb_rbm_uid + 4)
++#define psys_ipu6_lb_rbm_output_uid           (psys_ipu6_lb_rbm_uid + 5)
++#define psys_ipu6_lb_rbm_gammastar_grid_uid   (psys_ipu6_lb_rbm_uid + 6)
++#define psys_ipu6_lb_rbm_dvs_mv_out_l0_uid    (psys_ipu6_lb_rbm_uid + 7)
++#define psys_ipu6_lb_rbm_dvs_mv_out_l1_uid    (psys_ipu6_lb_rbm_uid + 8)
++#define psys_ipu6_lb_rbm_dvs_mv_out_l2_uid    (psys_ipu6_lb_rbm_uid + 9)
++#define psys_ipu6_lb_rbm_dvs_fe_in_l0_uid     (psys_ipu6_lb_rbm_uid + 10)
++#define psys_ipu6_lb_rbm_dvs_fe_in_l1_uid     (psys_ipu6_lb_rbm_uid + 11)
++#define psys_ipu6_lb_rbm_dvs_fe_in_l2_uid     (psys_ipu6_lb_rbm_uid + 12)
++#define psys_ipu6_lb_rbm_dvs_fe_out_l0_uid    (psys_ipu6_lb_rbm_uid + 13)
++#define psys_ipu6_lb_rbm_dvs_fe_out_l1_uid    (psys_ipu6_lb_rbm_uid + 14)
++#define psys_ipu6_lb_rbm_dvs_fe_out_l2_uid    (psys_ipu6_lb_rbm_uid + 15)
++
++#define psys_ipu6_isa_rbm_pg_id                185
++#define psys_ipu6_isa_rbm_uid                  psys_2600_pg_uid(psys_ipu6_isa_rbm_pg_id)
++#define psys_ipu6_isa_rbm_param_uid            (psys_ipu6_isa_rbm_uid + 1)
++#define psys_ipu6_isa_rbm_program_uid          (psys_ipu6_isa_rbm_uid + 2)
++#define psys_ipu6_isa_rbm_program_control_uid  (psys_ipu6_isa_rbm_uid + 3)
++#define psys_ipu6_isa_rbm_input_uid            (psys_ipu6_isa_rbm_uid + 4)
++#define psys_ipu6_isa_rbm_blc_input_uid        (psys_ipu6_isa_rbm_uid + 5)
++#define psys_ipu6_isa_rbm_lsc_input_uid        (psys_ipu6_isa_rbm_uid + 6)
++#define psys_ipu6_isa_rbm_output_bayer_uid     (psys_ipu6_isa_rbm_uid + 7)
++#define psys_ipu6_isa_rbm_output_yuv_a_uid     (psys_ipu6_isa_rbm_uid + 8)
++#define psys_ipu6_isa_rbm_output_yuv_b_uid     (psys_ipu6_isa_rbm_uid + 9)
++#define psys_ipu6_isa_rbm_output_full_uid      (psys_ipu6_isa_rbm_uid + 10)
++#define psys_ipu6_isa_rbm_output_ir_uid        (psys_ipu6_isa_rbm_uid + 11)
++#define psys_ipu6_isa_rbm_output_sis_a_uid     (psys_ipu6_isa_rbm_uid + 12)
++#define psys_ipu6_isa_rbm_output_sis_b_uid     (psys_ipu6_isa_rbm_uid + 13)
++#define psys_ipu6_isa_rbm_output_af_uid        (psys_ipu6_isa_rbm_uid + 14)
++#define psys_ipu6_isa_rbm_output_awb_uid       (psys_ipu6_isa_rbm_uid + 15)
++#define psys_ipu6_isa_rbm_output_paf_uid       (psys_ipu6_isa_rbm_uid + 16)
++#define psys_ipu6_isa_rbm_param_out_uid        (psys_ipu6_isa_rbm_uid + 17)
++#define psys_ipu6_isa_rbm_input_short_uid      (psys_ipu6_isa_rbm_uid + 18)
++#define psys_ipu6_isa_rbm_input_medium_uid     (psys_ipu6_isa_rbm_uid + 19)
++#define psys_ipu6_isa_rbm_input_paf_uid        (psys_ipu6_isa_rbm_uid + 20)
++
++#define psys_ipu6s_isa_pg_id                198
++#define psys_ipu6s_isa_uid                  psys_2600_pg_uid(psys_ipu6s_isa_pg_id)
++#define psys_ipu6s_isa_param_uid            (psys_ipu6s_isa_uid + 1)
++#define psys_ipu6s_isa_program_uid          (psys_ipu6s_isa_uid + 2)
++#define psys_ipu6s_isa_program_control_uid  (psys_ipu6s_isa_uid + 3)
++#define psys_ipu6s_isa_input_uid            (psys_ipu6s_isa_uid + 4)
++#define psys_ipu6s_isa_blc_input_uid        (psys_ipu6s_isa_uid + 5)
++#define psys_ipu6s_isa_lsc_input_uid        (psys_ipu6s_isa_uid + 6)
++#define psys_ipu6s_isa_output_bayer_uid     (psys_ipu6s_isa_uid + 7)
++#define psys_ipu6s_isa_output_yuv_a_uid     (psys_ipu6s_isa_uid + 8)
++#define psys_ipu6s_isa_output_yuv_b_uid     (psys_ipu6s_isa_uid + 9)
++#define psys_ipu6s_isa_output_full_uid      (psys_ipu6s_isa_uid + 10)
++#define psys_ipu6s_isa_output_af_uid        (psys_ipu6s_isa_uid + 11)
++#define psys_ipu6s_isa_output_awb_uid       (psys_ipu6s_isa_uid + 12)
++#define psys_ipu6s_isa_output_paf_uid       (psys_ipu6s_isa_uid + 13)
++
++#define psys_fake_ipu6s_isa_pg_id                199
++#define psys_fake_ipu6s_isa_uid                  psys_2600_pg_uid(psys_fake_ipu6s_isa_pg_id)
++#define psys_fake_ipu6s_isa_param_uid            (psys_fake_ipu6s_isa_uid + 1)
++#define psys_fake_ipu6s_isa_program_uid          (psys_fake_ipu6s_isa_uid + 2)
++#define psys_fake_ipu6s_isa_program_control_uid  (psys_fake_ipu6s_isa_uid + 3)
++#define psys_fake_ipu6s_isa_input_uid            (psys_fake_ipu6s_isa_uid + 4)
++#define psys_fake_ipu6s_isa_blc_input_uid        (psys_fake_ipu6s_isa_uid + 5)
++#define psys_fake_ipu6s_isa_lsc_input_uid        (psys_fake_ipu6s_isa_uid + 6)
++#define psys_fake_ipu6s_isa_output_bayer_uid     (psys_fake_ipu6s_isa_uid + 7)
++#define psys_fake_ipu6s_isa_output_yuv_a_uid     (psys_fake_ipu6s_isa_uid + 8)
++#define psys_fake_ipu6s_isa_output_yuv_b_uid     (psys_fake_ipu6s_isa_uid + 9)
++#define psys_fake_ipu6s_isa_output_full_uid      (psys_fake_ipu6s_isa_uid + 10)
++#define psys_fake_ipu6s_isa_output_af_uid        (psys_fake_ipu6s_isa_uid + 11)
++#define psys_fake_ipu6s_isa_output_awb_uid       (psys_fake_ipu6s_isa_uid + 12)
++#define psys_fake_ipu6s_isa_output_paf_uid       (psys_fake_ipu6s_isa_uid + 13)
++
++#ifndef IPU_SYSVER_ipu6v5
++#define psys_ipu6_isa_lb_pg_id                     187
++#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
++#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
++#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
++#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
++#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
++#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
++#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
++#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
++#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
++#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
++#define psys_ipu6_isa_lb_output_yuv_b_uid          (psys_ipu6_isa_lb_uid + 10)
++#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 11)
++#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 12)
++#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 13)
++#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 14)
++#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 15)
++#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 16)
++#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 17)
++#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 18)
++#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 19)
++#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 20)
++#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 21)
++#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 22)
++#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 23)
++#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 24)
++#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 25)
++#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 26)
++#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 27)
++#define psys_ipu6_isa_lb_input_short_uid           (psys_ipu6_isa_lb_uid + 28)
++#define psys_ipu6_isa_lb_input_medium_uid          (psys_ipu6_isa_lb_uid + 29)
++#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 30)
++#else
++#define psys_ipu6_isa_lb_pg_id                     187
++#define psys_ipu6_isa_lb_uid                       psys_2600_pg_uid(psys_ipu6_isa_lb_pg_id)
++#define psys_ipu6_isa_lb_param_in_uid              (psys_ipu6_isa_lb_uid + 1)
++#define psys_ipu6_isa_lb_program_uid               (psys_ipu6_isa_lb_uid + 2)
++#define psys_ipu6_isa_lb_program_control_init_uid  (psys_ipu6_isa_lb_uid + 3)
++#define psys_ipu6_isa_lb_input_high_uid            (psys_ipu6_isa_lb_uid + 4)
++#define psys_ipu6_isa_lb_blc_grid_uid              (psys_ipu6_isa_lb_uid + 5)
++#define psys_ipu6_isa_lb_lsc_grid_uid              (psys_ipu6_isa_lb_uid + 6)
++#define psys_ipu6_isa_lb_gammastar_grid_uid        (psys_ipu6_isa_lb_uid + 7)
++#define psys_ipu6_isa_lb_output_uid                (psys_ipu6_isa_lb_uid + 8)
++#define psys_ipu6_isa_lb_output_bayer_uid          (psys_ipu6_isa_lb_uid + 9)
++#define psys_ipu6_isa_lb_output_sis_a_uid          (psys_ipu6_isa_lb_uid + 10)
++#define psys_ipu6_isa_lb_output_sis_b_uid          (psys_ipu6_isa_lb_uid + 11)
++#define psys_ipu6_isa_lb_output_full_uid           (psys_ipu6_isa_lb_uid + 12)
++#define psys_ipu6_isa_lb_output_ir_depth_uid       (psys_ipu6_isa_lb_uid + 13)
++#define psys_ipu6_isa_lb_spt_af_uid                (psys_ipu6_isa_lb_uid + 14)
++#define psys_ipu6_isa_lb_spt_awb_uid               (psys_ipu6_isa_lb_uid + 15)
++#define psys_ipu6_isa_lb_spt_paf_uid               (psys_ipu6_isa_lb_uid + 16)
++#define psys_ipu6_isa_lb_dvs_mv_out_l0_uid         (psys_ipu6_isa_lb_uid + 17)
++#define psys_ipu6_isa_lb_dvs_mv_out_l1_uid         (psys_ipu6_isa_lb_uid + 18)
++#define psys_ipu6_isa_lb_dvs_mv_out_l2_uid         (psys_ipu6_isa_lb_uid + 19)
++#define psys_ipu6_isa_lb_ae_stat_uid               (psys_ipu6_isa_lb_uid + 20)
++#define psys_ipu6_isa_lb_dvs_fe_in_l0_uid          (psys_ipu6_isa_lb_uid + 21)
++#define psys_ipu6_isa_lb_dvs_fe_in_l1_uid          (psys_ipu6_isa_lb_uid + 22)
++#define psys_ipu6_isa_lb_dvs_fe_in_l2_uid          (psys_ipu6_isa_lb_uid + 23)
++#define psys_ipu6_isa_lb_dvs_fe_out_l0_uid         (psys_ipu6_isa_lb_uid + 24)
++#define psys_ipu6_isa_lb_dvs_fe_out_l1_uid         (psys_ipu6_isa_lb_uid + 25)
++#define psys_ipu6_isa_lb_dvs_fe_out_l2_uid         (psys_ipu6_isa_lb_uid + 26)
++#define psys_ipu6_isa_lb_paf_uid                   (psys_ipu6_isa_lb_uid + 27)
++
++#endif
++
++
++#define psys_ipu6_bb_gdc_pg_id                 196
++#define psys_ipu6_bb_gdc_uid                   psys_2600_pg_uid(psys_ipu6_bb_gdc_pg_id)
++#define psys_ipu6_bb_gdc_input_uid             (psys_ipu6_bb_gdc_uid + 1)
++#define psys_ipu6_bb_gdc_mp_uid                (psys_ipu6_bb_gdc_uid + 2)
++#define psys_ipu6_bb_gdc_dp_uid                (psys_ipu6_bb_gdc_uid + 3)
++#define psys_ipu6_bb_gdc_ppp_uid               (psys_ipu6_bb_gdc_uid + 4)
++#define psys_ipu6_bb_gdc_program_control_uid   (psys_ipu6_bb_gdc_uid + 5)
++#define psys_ipu6_bb_gdc_param_in_uid          (psys_ipu6_bb_gdc_uid + 6)
++#define psys_ipu6_bb_gdc_program_uid           (psys_ipu6_bb_gdc_uid + 7)
++
++#define psys_2600_video_pre_gdc_hq_pg_id             122
++#define psys_2600_video_pre_gdc_hq_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_pg_id)
++#define psys_2600_video_pre_gdc_hq_param_uid         psys_2600_video_pre_gdc_hq_uid + 1
++#define psys_2600_video_pre_gdc_hq_program_uid       psys_2600_video_pre_gdc_hq_uid + 2
++#define psys_2600_video_pre_gdc_hq_input_uid         psys_2600_video_pre_gdc_hq_uid + 3
++#define psys_2600_video_pre_gdc_hq_output_uid        psys_2600_video_pre_gdc_hq_uid + 4
++#define psys_2600_video_pre_gdc_hq_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_uid + 5
++#define psys_2600_video_pre_gdc_hq_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_uid + 6
++#define psys_2600_video_pre_gdc_hq_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_uid + 7
++#define psys_2600_video_pre_gdc_hq_spatial_out_0_uid psys_2600_video_pre_gdc_hq_uid + 8
++#define psys_2600_video_pre_gdc_hq_spatial_out_1_uid psys_2600_video_pre_gdc_hq_uid + 9
++#define psys_2600_video_pre_gdc_hq_spatial_out_2_uid psys_2600_video_pre_gdc_hq_uid + 10
++
++#define psys_2600_video_pre_gdc_hq_vcr2_pg_id             148
++#define psys_2600_video_pre_gdc_hq_vcr2_uid               psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_vcr2_pg_id)
++#define psys_2600_video_pre_gdc_hq_vcr2_param_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 1
++#define psys_2600_video_pre_gdc_hq_vcr2_program_uid       psys_2600_video_pre_gdc_hq_vcr2_uid + 2
++#define psys_2600_video_pre_gdc_hq_vcr2_input_uid         psys_2600_video_pre_gdc_hq_vcr2_uid + 3
++#define psys_2600_video_pre_gdc_hq_vcr2_output_uid        psys_2600_video_pre_gdc_hq_vcr2_uid + 4
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_0_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 5
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_1_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 6
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_in_2_uid  psys_2600_video_pre_gdc_hq_vcr2_uid + 7
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_0_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 8
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_1_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 9
++#define psys_2600_video_pre_gdc_hq_vcr2_spatial_out_2_uid psys_2600_video_pre_gdc_hq_vcr2_uid + 10
++
++#define psys_2600_ipu5_still_pre_gdc_pg_id        143
++#define psys_2600_ipu5_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_pg_id)
++#define psys_2600_ipu5_still_pre_gdc_param_uid    psys_2600_ipu5_still_pre_gdc_uid + 1
++#define psys_2600_ipu5_still_pre_gdc_program_uid  psys_2600_ipu5_still_pre_gdc_uid + 2
++#define psys_2600_ipu5_still_pre_gdc_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_uid + 3
++#define psys_2600_ipu5_still_pre_gdc_input_uid   psys_2600_ipu5_still_pre_gdc_uid + 4
++#define psys_2600_ipu5_still_pre_gdc_output_uid   psys_2600_ipu5_still_pre_gdc_uid + 5
++
++
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id        144
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_uid          psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_no_xnr_pg_id)
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_param_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 1
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_program_uid  psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 2
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_gammstar_acc_ctrl_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 3
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_input_uid    psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 4
++#define psys_2600_ipu5_still_pre_gdc_no_xnr_output_uid   psys_2600_ipu5_still_pre_gdc_no_xnr_uid + 5
++
++#define psys_2600_ipu5_still_pre_gdc_vpless_pg_id                       168
++#define psys_2600_ipu5_still_pre_gdc_vpless_uid                         psys_2600_pg_uid(psys_2600_ipu5_still_pre_gdc_vpless_pg_id)
++#define psys_2600_ipu5_still_pre_gdc_vpless_param_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 1
++#define psys_2600_ipu5_still_pre_gdc_vpless_program_uid                 psys_2600_ipu5_still_pre_gdc_vpless_uid + 2
++#define psys_2600_ipu5_still_pre_gdc_vpless_gammstar_acc_ctrl_uid       psys_2600_ipu5_still_pre_gdc_vpless_uid + 3
++#define psys_2600_ipu5_still_pre_gdc_vpless_input_uid                   psys_2600_ipu5_still_pre_gdc_vpless_uid + 4
++#define psys_2600_ipu5_still_pre_gdc_vpless_output_uid                  psys_2600_ipu5_still_pre_gdc_vpless_uid + 5
++#define psys_2600_ipu5_still_pre_gdc_vpless_spt_gammstar_grid           psys_2600_ipu5_still_pre_gdc_vpless_uid + 6
++
++#define psys_ipu5_still_post_gdc_v4_pg_id                162
++#define psys_ipu5_still_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_v4_pg_id)
++#define psys_ipu5_still_post_gdc_v4_param_uid            psys_ipu5_still_post_gdc_v4_uid + 1
++#define psys_ipu5_still_post_gdc_v4_program_uid          psys_ipu5_still_post_gdc_v4_uid + 2
++#define psys_ipu5_still_post_gdc_v4_input_uid            psys_ipu5_still_post_gdc_v4_uid + 3
++#define psys_ipu5_still_post_gdc_v4_spatial_param_uid    psys_ipu5_still_post_gdc_v4_uid + 4
++#define psys_ipu5_still_post_gdc_v4_output_uid           psys_ipu5_still_post_gdc_v4_uid + 5
++#define psys_ipu5_still_post_gdc_v4_secondary_output_uid psys_ipu5_still_post_gdc_v4_uid + 6
++#define psys_ipu5_still_post_gdc_v4_third_output_uid     psys_ipu5_still_post_gdc_v4_uid + 7
++
++#define psys_ipu5_video_post_gdc_pg_id                151
++#define psys_ipu5_video_post_gdc_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_pg_id)
++#define psys_ipu5_video_post_gdc_param_uid            psys_ipu5_video_post_gdc_uid + 1
++#define psys_ipu5_video_post_gdc_program_uid          psys_ipu5_video_post_gdc_uid + 2
++#define psys_ipu5_video_post_gdc_input_uid            psys_ipu5_video_post_gdc_uid + 3
++#define psys_ipu5_video_post_gdc_spatial_param_uid    psys_ipu5_video_post_gdc_uid + 4
++#define psys_ipu5_video_post_gdc_output_uid           psys_ipu5_video_post_gdc_uid + 5
++#define psys_ipu5_video_post_gdc_secondary_output_uid psys_ipu5_video_post_gdc_uid + 6
++#define psys_ipu5_video_post_gdc_third_output_uid     psys_ipu5_video_post_gdc_uid + 7
++#define psys_ipu5_video_post_gdc_tnr_input_uid        psys_ipu5_video_post_gdc_uid + 8
++#define psys_ipu5_video_post_gdc_tnr_output_uid       psys_ipu5_video_post_gdc_uid + 9
++
++#define psys_ipu5_video_post_gdc_v4_pg_id                169
++#define psys_ipu5_video_post_gdc_v4_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_v4_pg_id)
++#define psys_ipu5_video_post_gdc_v4_param_uid            psys_ipu5_video_post_gdc_v4_uid + 1
++#define psys_ipu5_video_post_gdc_v4_program_uid          psys_ipu5_video_post_gdc_v4_uid + 2
++#define psys_ipu5_video_post_gdc_v4_input_uid            psys_ipu5_video_post_gdc_v4_uid + 3
++#define psys_ipu5_video_post_gdc_v4_spatial_param_uid    psys_ipu5_video_post_gdc_v4_uid + 4
++#define psys_ipu5_video_post_gdc_v4_output_uid           psys_ipu5_video_post_gdc_v4_uid + 5
++#define psys_ipu5_video_post_gdc_v4_secondary_output_uid psys_ipu5_video_post_gdc_v4_uid + 6
++#define psys_ipu5_video_post_gdc_v4_third_output_uid     psys_ipu5_video_post_gdc_v4_uid + 7
++#define psys_ipu5_video_post_gdc_v4_tnr_input_uid        psys_ipu5_video_post_gdc_v4_uid + 8
++#define psys_ipu5_video_post_gdc_v4_tnr_output_uid       psys_ipu5_video_post_gdc_v4_uid + 9
++
++#define psys_ipu5_video_post_gdc_10bit_pg_id                193
++#define psys_ipu5_video_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_video_post_gdc_10bit_pg_id)
++#define psys_ipu5_video_post_gdc_10bit_param_uid            psys_ipu5_video_post_gdc_10bit_uid + 1
++#define psys_ipu5_video_post_gdc_10bit_program_uid          psys_ipu5_video_post_gdc_10bit_uid + 2
++#define psys_ipu5_video_post_gdc_10bit_input_uid            psys_ipu5_video_post_gdc_10bit_uid + 3
++#define psys_ipu5_video_post_gdc_10bit_spatial_param_uid    psys_ipu5_video_post_gdc_10bit_uid + 4
++#define psys_ipu5_video_post_gdc_10bit_output_uid           psys_ipu5_video_post_gdc_10bit_uid + 5
++#define psys_ipu5_video_post_gdc_10bit_secondary_output_uid psys_ipu5_video_post_gdc_10bit_uid + 6
++#define psys_ipu5_video_post_gdc_10bit_third_output_uid     psys_ipu5_video_post_gdc_10bit_uid + 7
++#define psys_ipu5_video_post_gdc_10bit_tnr_input_uid        psys_ipu5_video_post_gdc_10bit_uid + 8
++#define psys_ipu5_video_post_gdc_10bit_tnr_output_uid       psys_ipu5_video_post_gdc_10bit_uid + 9
++#define psys_ipu5_video_post_gdc_10bit_main_output_uid      psys_ipu5_video_post_gdc_10bit_uid + 10
++#define psys_ipu5_video_post_gdc_10bit_display_output_uid   psys_ipu5_video_post_gdc_10bit_uid + 11
++
++#define psys_ipu5_still_post_gdc_10bit_pg_id                197
++#define psys_ipu5_still_post_gdc_10bit_uid                  psys_2600_pg_uid(psys_ipu5_still_post_gdc_10bit_pg_id)
++#define psys_ipu5_still_post_gdc_10bit_param_uid            psys_ipu5_still_post_gdc_10bit_uid + 1
++#define psys_ipu5_still_post_gdc_10bit_program_uid          psys_ipu5_still_post_gdc_10bit_uid + 2
++#define psys_ipu5_still_post_gdc_10bit_input_uid            psys_ipu5_still_post_gdc_10bit_uid + 3
++#define psys_ipu5_still_post_gdc_10bit_spatial_param_uid    psys_ipu5_still_post_gdc_10bit_uid + 4
++#define psys_ipu5_still_post_gdc_10bit_output_uid           psys_ipu5_still_post_gdc_10bit_uid + 5
++#define psys_ipu5_still_post_gdc_10bit_secondary_output_uid psys_ipu5_still_post_gdc_10bit_uid + 6
++#define psys_ipu5_still_post_gdc_10bit_third_output_uid     psys_ipu5_still_post_gdc_10bit_uid + 7
++#define psys_ipu5_still_post_gdc_10bit_main_output_uid      psys_ipu5_still_post_gdc_10bit_uid + 8
++#define psys_ipu5_still_post_gdc_10bit_display_output_uid   psys_ipu5_still_post_gdc_10bit_uid + 9
++
++
++#ifdef _MSC_VER
++    #define psys_2600_still_pre_gdc_pg_id    136
++#else //_MSC_VER
++    #define psys_2600_still_pre_gdc_pg_id    131
++#endif
++#define psys_2600_still_pre_gdc_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_pg_id)
++#define psys_2600_still_pre_gdc_param_uid    psys_2600_still_pre_gdc_uid + 1
++#define psys_2600_still_pre_gdc_program_uid  psys_2600_still_pre_gdc_uid + 2
++#define psys_2600_still_pre_gdc_input_uid    psys_2600_still_pre_gdc_uid + 3
++#define psys_2600_still_pre_gdc_output_uid   psys_2600_still_pre_gdc_uid + 4
++
++#define psys_2600_still_pre_gdc_vcr2_pg_id        150
++#define psys_2600_still_pre_gdc_vcr2_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_vcr2_pg_id)
++#define psys_2600_still_pre_gdc_vcr2_param_uid    psys_2600_still_pre_gdc_vcr2_uid + 1
++#define psys_2600_still_pre_gdc_vcr2_program_uid  psys_2600_still_pre_gdc_vcr2_uid + 2
++#define psys_2600_still_pre_gdc_vcr2_input_uid    psys_2600_still_pre_gdc_vcr2_uid + 3
++#define psys_2600_still_pre_gdc_vcr2_output_uid   psys_2600_still_pre_gdc_vcr2_uid + 4
++
++/* \todo dummy definition for Windows only until we can sort out the conflict
++ * needed to continue patch porting, this allows the conflicts to only be present in this file
++ */
++#ifdef _MSC_VER
++    #define psys_2600_still_pre_gdc_v3_uid          ia_fourcc('D','U','M','Y') // DUMMY
++#else
++    #define psys_2600_still_pre_gdc_v3_pg_id        136
++    #define psys_2600_still_pre_gdc_v3_uid          psys_2600_pg_uid(psys_2600_still_pre_gdc_v3_pg_id)
++    #define psys_2600_still_pre_gdc_v3_param_uid    psys_2600_still_pre_gdc_v3_uid + 1
++    #define psys_2600_still_pre_gdc_v3_program_uid  psys_2600_still_pre_gdc_v3_uid + 2
++    #define psys_2600_still_pre_gdc_v3_input_uid    psys_2600_still_pre_gdc_v3_uid + 3
++    #define psys_2600_still_pre_gdc_v3_output_uid   psys_2600_still_pre_gdc_v3_uid + 4
++#endif
++
++#define psys_2600_still_post_gdc_pg_id                118
++#define psys_2600_still_post_gdc_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_pg_id)
++#define psys_2600_still_post_gdc_param_uid            psys_2600_still_post_gdc_uid + 1
++#define psys_2600_still_post_gdc_program_uid          psys_2600_still_post_gdc_uid + 2
++#define psys_2600_still_post_gdc_input_uid            psys_2600_still_post_gdc_uid + 3
++#define psys_2600_still_post_gdc_spatial_param_uid    psys_2600_still_post_gdc_uid + 4
++#define psys_2600_still_post_gdc_output_uid           psys_2600_still_post_gdc_uid + 5
++#define psys_2600_still_post_gdc_secondary_output_uid psys_2600_still_post_gdc_uid + 6
++#define psys_2600_still_post_gdc_third_output_uid     psys_2600_still_post_gdc_uid + 7
++
++#define psys_2600_still_post_gdc_v2_pg_id                128
++#define psys_2600_still_post_gdc_v2_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_pg_id)
++#define psys_2600_still_post_gdc_v2_param_uid            psys_2600_still_post_gdc_v2_uid + 1
++#define psys_2600_still_post_gdc_v2_program_uid          psys_2600_still_post_gdc_v2_uid + 2
++#define psys_2600_still_post_gdc_v2_input_uid            psys_2600_still_post_gdc_v2_uid + 3
++#define psys_2600_still_post_gdc_v2_spatial_param_uid    psys_2600_still_post_gdc_v2_uid + 4
++#define psys_2600_still_post_gdc_v2_output_uid           psys_2600_still_post_gdc_v2_uid + 5
++#define psys_2600_still_post_gdc_v2_secondary_output_uid psys_2600_still_post_gdc_v2_uid + 6
++#define psys_2600_still_post_gdc_v2_third_output_uid     psys_2600_still_post_gdc_v2_uid + 7
++
++#define psys_2600_still_post_gdc_mbr_pg_id                133
++#define psys_2600_still_post_gdc_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_mbr_pg_id)
++#define psys_2600_still_post_gdc_mbr_param_uid            psys_2600_still_post_gdc_mbr_uid + 1
++#define psys_2600_still_post_gdc_mbr_program_uid          psys_2600_still_post_gdc_mbr_uid + 2
++#define psys_2600_still_post_gdc_mbr_input_uid            psys_2600_still_post_gdc_mbr_uid + 3
++#define psys_2600_still_post_gdc_mbr_spatial_param_uid    psys_2600_still_post_gdc_mbr_uid + 4
++#define psys_2600_still_post_gdc_mbr_output_uid           psys_2600_still_post_gdc_mbr_uid + 5
++#define psys_2600_still_post_gdc_mbr_secondary_output_uid psys_2600_still_post_gdc_mbr_uid + 6
++#define psys_2600_still_post_gdc_mbr_third_output_uid     psys_2600_still_post_gdc_mbr_uid + 7
++
++#define psys_2600_still_post_gdc_v2_mbr_pg_id                173
++#define psys_2600_still_post_gdc_v2_mbr_uid                  psys_2600_pg_uid(psys_2600_still_post_gdc_v2_mbr_pg_id)
++#define psys_2600_still_post_gdc_v2_mbr_param_uid            psys_2600_still_post_gdc_v2_mbr_uid + 1
++#define psys_2600_still_post_gdc_v2_mbr_program_uid          psys_2600_still_post_gdc_v2_mbr_uid + 2
++#define psys_2600_still_post_gdc_v2_mbr_input_uid            psys_2600_still_post_gdc_v2_mbr_uid + 3
++#define psys_2600_still_post_gdc_v2_mbr_spatial_param_uid    psys_2600_still_post_gdc_v2_mbr_uid + 4
++#define psys_2600_still_post_gdc_v2_mbr_output_uid           psys_2600_still_post_gdc_v2_mbr_uid + 5
++#define psys_2600_still_post_gdc_v2_mbr_secondary_output_uid psys_2600_still_post_gdc_v2_mbr_uid + 6
++#define psys_2600_still_post_gdc_v2_mbr_third_output_uid     psys_2600_still_post_gdc_v2_mbr_uid + 7
++
++#define psys_2600_video_isa_pg_id                127
++#define psys_2600_video_isa_uid                  psys_2600_pg_uid(psys_2600_video_isa_pg_id)
++#define psys_2600_video_isa_param_uid            psys_2600_video_isa_uid + 1
++#define psys_2600_video_isa_program_uid          psys_2600_video_isa_uid + 2
++#define psys_2600_video_isa_input_uid            psys_2600_video_isa_uid + 3
++#define psys_2600_video_isa_output_uid           psys_2600_video_isa_uid + 4
++#define psys_2600_video_isa_secondary_output_uid psys_2600_video_isa_uid + 5
++#define psys_2600_video_isa_ae_output_uid        psys_2600_video_isa_uid + 6
++#define psys_2600_video_isa_blc_type0_input_uid  psys_2600_video_isa_uid + 7
++#define psys_2600_video_isa_blc_type1_input_uid  psys_2600_video_isa_uid + 8
++#define psys_2600_video_isa_blc_type2_input_uid  psys_2600_video_isa_uid + 9
++#define psys_2600_video_isa_lsc_type0_input_uid  psys_2600_video_isa_uid + 10
++#define psys_2600_video_isa_lsc_type1_input_uid  psys_2600_video_isa_uid + 11
++#define psys_2600_video_isa_lsc_type2_input_uid  psys_2600_video_isa_uid + 12
++#define psys_2600_video_isa_awb_output_uid       psys_2600_video_isa_uid + 13
++#define psys_2600_video_isa_af_output_uid        psys_2600_video_isa_uid + 14
++
++#define psys_2600_video_rgbir_isa_pg_id                130
++#define psys_2600_video_rgbir_isa_uid                  psys_2600_pg_uid(psys_2600_video_rgbir_isa_pg_id)
++#define psys_2600_video_rgbir_isa_param_uid            psys_2600_video_rgbir_isa_uid + 1
++#define psys_2600_video_rgbir_isa_program_uid          psys_2600_video_rgbir_isa_uid + 2
++#define psys_2600_video_rgbir_isa_input_uid            psys_2600_video_rgbir_isa_uid + 3
++#define psys_2600_video_rgbir_isa_output_uid           psys_2600_video_rgbir_isa_uid + 4
++#define psys_2600_video_rgbir_isa_secondary_output_uid psys_2600_video_rgbir_isa_uid + 5
++#define psys_2600_video_rgbir_isa_ae_output_uid        psys_2600_video_rgbir_isa_uid + 6
++#define psys_2600_video_rgbir_isa_blc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 7
++#define psys_2600_video_rgbir_isa_blc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 8
++#define psys_2600_video_rgbir_isa_blc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 9
++#define psys_2600_video_rgbir_isa_lsc_type0_input_uid  psys_2600_video_rgbir_isa_uid + 10
++#define psys_2600_video_rgbir_isa_lsc_type1_input_uid  psys_2600_video_rgbir_isa_uid + 11
++#define psys_2600_video_rgbir_isa_lsc_type2_input_uid  psys_2600_video_rgbir_isa_uid + 12
++#define psys_2600_video_rgbir_isa_awb_output_uid       psys_2600_video_rgbir_isa_uid + 13
++#define psys_2600_video_rgbir_isa_af_output_uid        psys_2600_video_rgbir_isa_uid + 14
++
++
++#define psys_2600_ipu5_video_isa_pg_id                141
++#define psys_2600_ipu5_video_isa_uid                  psys_2600_pg_uid(psys_2600_ipu5_video_isa_pg_id)
++#define psys_2600_ipu5_video_isa_param_uid            psys_2600_ipu5_video_isa_uid + 1
++#define psys_2600_ipu5_video_isa_program_uid          psys_2600_ipu5_video_isa_uid + 2
++#define psys_2600_ipu5_video_isa_input_uid            psys_2600_ipu5_video_isa_uid + 3
++#define psys_2600_ipu5_video_isa_output_uid           psys_2600_ipu5_video_isa_uid + 4
++#define psys_2600_ipu5_video_isa_secondary_output_uid psys_2600_ipu5_video_isa_uid + 5
++#define psys_2600_ipu5_video_isa_sis_output_uid       psys_2600_ipu5_video_isa_uid + 6
++#define psys_2600_ipu5_video_isa_ae_output_uid        psys_2600_ipu5_video_isa_uid + 7
++#define psys_2600_ipu5_video_isa_blc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 8
++#define psys_2600_ipu5_video_isa_blc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 9
++#define psys_2600_ipu5_video_isa_blc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 10
++#define psys_2600_ipu5_video_isa_lsc_type0_input_uid  psys_2600_ipu5_video_isa_uid + 11
++#define psys_2600_ipu5_video_isa_lsc_type1_input_uid  psys_2600_ipu5_video_isa_uid + 12
++#define psys_2600_ipu5_video_isa_lsc_type2_input_uid  psys_2600_ipu5_video_isa_uid + 13
++#define psys_2600_ipu5_video_isa_awb_output_uid       psys_2600_ipu5_video_isa_uid + 14
++#define psys_2600_ipu5_video_isa_af_output_uid        psys_2600_ipu5_video_isa_uid + 15
++
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id                174
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid                  psys_2600_pg_uid(psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id)
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_param_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 1
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_program_uid          psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 2
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_bayer_output_uid     psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 3
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_sis_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 4
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_ae_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 5
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 6
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 7
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_blc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 8
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type0_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 9
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type1_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 10
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_lsc_type2_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 11
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_awb_output_uid       psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 12
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_af_output_uid        psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 13
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_gammastar_input_uid  psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 14
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_input_uid            psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 15
++#define psys_ipu5_dfm_isa_to_psa_yuv_vmem_output_uid           psys_ipu5_dfm_isa_to_psa_yuv_vmem_pg_id + 16
++
++#define psys_ipu5_isa_lb_pg_id                          194
++#define psys_ipu5_isa_lb_uid                            psys_2600_pg_uid(psys_ipu5_isa_lb_pg_id)
++#define psys_ipu5_isa_lb_param_uid                      psys_ipu5_isa_lb_uid + 1
++#define psys_ipu5_isa_lb_program_uid                    psys_ipu5_isa_lb_uid + 2
++#define psys_ipu5_isa_lb_program_control_init_uid       psys_ipu5_isa_lb_uid + 3
++#define psys_ipu5_isa_lb_input_uid                      psys_ipu5_isa_lb_uid + 4
++#define psys_ipu5_isa_lb_input_paf_uid                  psys_ipu5_isa_lb_uid + 5
++#define psys_ipu5_isa_lb_bayer_output_uid               psys_ipu5_isa_lb_uid + 6
++#define psys_ipu5_isa_lb_sis_output_uid                 psys_ipu5_isa_lb_uid + 7
++#define psys_ipu5_isa_lb_yuv_output_uid                 psys_ipu5_isa_lb_uid + 8
++#define psys_ipu5_isa_lb_cached_out_param_uid           psys_ipu5_isa_lb_uid + 9
++#define psys_ipu5_isa_lb_blc_type0_uid                  psys_ipu5_isa_lb_uid + 10
++#define psys_ipu5_isa_lb_blc_type1_uid                  psys_ipu5_isa_lb_uid + 11
++#define psys_ipu5_isa_lb_blc_type2_uid                  psys_ipu5_isa_lb_uid + 12
++#define psys_ipu5_isa_lb_lsc_type0_uid                  psys_ipu5_isa_lb_uid + 13
++#define psys_ipu5_isa_lb_lsc_type1_uid                  psys_ipu5_isa_lb_uid + 14
++#define psys_ipu5_isa_lb_lsc_type2_uid                  psys_ipu5_isa_lb_uid + 15
++#define psys_ipu5_isa_lb_3a_stat_awb_uid                psys_ipu5_isa_lb_uid + 16
++#define psys_ipu5_isa_lb_3a_stat_af_uid                 psys_ipu5_isa_lb_uid + 17
++#define psys_ipu5_isa_lb_3a_stat_paf_uid                psys_ipu5_isa_lb_uid + 18
++#define psys_ipu5_isa_lb_gammastar_grid_uid             psys_ipu5_isa_lb_uid + 19
++#define psys_ipu5_isa_lb_dvs_mv_out_l0_uid              psys_ipu5_isa_lb_uid + 20
++#define psys_ipu5_isa_lb_dvs_mv_out_l1_uid              psys_ipu5_isa_lb_uid + 21
++#define psys_ipu5_isa_lb_dvs_mv_out_l2_uid              psys_ipu5_isa_lb_uid + 22
++#define psys_ipu5_isa_lb_dvs_fe_in_l0_uid               psys_ipu5_isa_lb_uid + 23
++#define psys_ipu5_isa_lb_dvs_fe_in_l1_uid               psys_ipu5_isa_lb_uid + 24
++#define psys_ipu5_isa_lb_dvs_fe_in_l2_uid               psys_ipu5_isa_lb_uid + 25
++#define psys_ipu5_isa_lb_dvs_fe_out_l0_uid              psys_ipu5_isa_lb_uid + 26
++#define psys_ipu5_isa_lb_dvs_fe_out_l1_uid              psys_ipu5_isa_lb_uid + 27
++#define psys_ipu5_isa_lb_dvs_fe_out_l2_uid              psys_ipu5_isa_lb_uid + 28
++
++#define psys_ipu5_dfm_isl_ps_vpless_pg_id                          166
++#define psys_ipu5_dfm_isl_ps_vpless_uid                            psys_2600_pg_uid(psys_ipu5_dfm_isl_ps_vpless_pg_id)
++#define psys_ipu5_dfm_isl_ps_vpless_param_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 1
++#define psys_ipu5_dfm_isl_ps_vpless_program_uid                    psys_ipu5_dfm_isl_ps_vpless_uid + 2
++#define psys_ipu5_dfm_isl_ps_vpless_program_control_init_uid       psys_ipu5_dfm_isl_ps_vpless_uid + 3
++#define psys_ipu5_dfm_isl_ps_vpless_input_uid                      psys_ipu5_dfm_isl_ps_vpless_uid + 4
++#define psys_ipu5_dfm_isl_ps_vpless_input_paf_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 5
++#define psys_ipu5_dfm_isl_ps_vpless_yuv_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 6
++#define psys_ipu5_dfm_isl_ps_vpless_bayer_output_uid               psys_ipu5_dfm_isl_ps_vpless_uid + 7
++#define psys_ipu5_dfm_isl_ps_vpless_sis_output_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 8
++#define psys_ipu5_dfm_isl_ps_vpless_cached_out_param_uid           psys_ipu5_dfm_isl_ps_vpless_uid + 9
++#define psys_ipu5_dfm_isl_ps_vpless_blc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 10
++#define psys_ipu5_dfm_isl_ps_vpless_blc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 11
++#define psys_ipu5_dfm_isl_ps_vpless_blc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 12
++#define psys_ipu5_dfm_isl_ps_vpless_lsc_type0_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 13
++#define psys_ipu5_dfm_isl_ps_vpless_lsc_type1_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 14
++#define psys_ipu5_dfm_isl_ps_vpless_lsc_type2_uid                  psys_ipu5_dfm_isl_ps_vpless_uid + 15
++#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_awb_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 16
++#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_af_uid                 psys_ipu5_dfm_isl_ps_vpless_uid + 17
++#define psys_ipu5_dfm_isl_ps_vpless_3a_stat_paf_uid                psys_ipu5_dfm_isl_ps_vpless_uid + 18
++
++#define psys_2600_video_isa_pre_gdc_pg_id               137
++#define psys_2600_video_isa_pre_gdc_uid                 psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_pg_id)
++#define psys_2600_video_isa_pre_gdc_param_uid           psys_2600_video_isa_pre_gdc_uid + 1
++#define psys_2600_video_isa_pre_gdc_ae_output_uid       psys_2600_video_isa_pre_gdc_uid + 2
++#define psys_2600_video_isa_pre_gdc_program_uid         psys_2600_video_isa_pre_gdc_uid + 3
++#define psys_2600_video_isa_pre_gdc_input_uid           psys_2600_video_isa_pre_gdc_uid + 4
++#define psys_2600_video_isa_pre_gdc_output_uid          psys_2600_video_isa_pre_gdc_uid + 5
++#define psys_2600_video_isa_pre_gdc_blc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 6
++#define psys_2600_video_isa_pre_gdc_blc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 7
++#define psys_2600_video_isa_pre_gdc_blc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 8
++#define psys_2600_video_isa_pre_gdc_lsc_type0_input_uid psys_2600_video_isa_pre_gdc_uid + 9
++#define psys_2600_video_isa_pre_gdc_lsc_type1_input_uid psys_2600_video_isa_pre_gdc_uid + 10
++#define psys_2600_video_isa_pre_gdc_lsc_type2_input_uid psys_2600_video_isa_pre_gdc_uid + 11
++#define psys_2600_video_isa_pre_gdc_awb_output_uid      psys_2600_video_isa_pre_gdc_uid + 12
++#define psys_2600_video_isa_pre_gdc_af_output_uid       psys_2600_video_isa_pre_gdc_uid + 13
++#define psys_2600_video_isa_pre_gdc_dvs_in_0_uid        psys_2600_video_isa_pre_gdc_uid + 14
++#define psys_2600_video_isa_pre_gdc_dvs_in_1_uid        psys_2600_video_isa_pre_gdc_uid + 15
++#define psys_2600_video_isa_pre_gdc_dvs_in_2_uid        psys_2600_video_isa_pre_gdc_uid + 16
++#define psys_2600_video_isa_pre_gdc_dvs_out_0_uid       psys_2600_video_isa_pre_gdc_uid + 17
++#define psys_2600_video_isa_pre_gdc_dvs_out_1_uid       psys_2600_video_isa_pre_gdc_uid + 18
++#define psys_2600_video_isa_pre_gdc_dvs_out_2_uid       psys_2600_video_isa_pre_gdc_uid + 19
++
++#define psys_2600_video_isl_pre_gdc_hq_pg_id                156
++#define psys_2600_video_isl_pre_gdc_hq_uid                  psys_2600_pg_uid(psys_2600_video_isl_pre_gdc_hq_pg_id)
++#define psys_2600_video_isl_pre_gdc_hq_param_uid            psys_2600_video_isl_pre_gdc_hq_uid + 1
++#define psys_2600_video_isl_pre_gdc_hq_ae_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 2
++#define psys_2600_video_isl_pre_gdc_hq_program_uid          psys_2600_video_isl_pre_gdc_hq_uid + 3
++#define psys_2600_video_isl_pre_gdc_hq_input_uid            psys_2600_video_isl_pre_gdc_hq_uid + 4
++#define psys_2600_video_isl_pre_gdc_hq_output_uid           psys_2600_video_isl_pre_gdc_hq_uid + 5
++#define psys_2600_video_isl_pre_gdc_hq_blc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 6
++#define psys_2600_video_isl_pre_gdc_hq_blc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 7
++#define psys_2600_video_isl_pre_gdc_hq_blc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 8
++#define psys_2600_video_isl_pre_gdc_hq_lsc_type0_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 9
++#define psys_2600_video_isl_pre_gdc_hq_lsc_type1_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 10
++#define psys_2600_video_isl_pre_gdc_hq_lsc_type2_input_uid  psys_2600_video_isl_pre_gdc_hq_uid + 11
++#define psys_2600_video_isl_pre_gdc_hq_awb_output_uid       psys_2600_video_isl_pre_gdc_hq_uid + 12
++#define psys_2600_video_isl_pre_gdc_hq_af_output_uid        psys_2600_video_isl_pre_gdc_hq_uid + 13
++#define psys_2600_video_isl_pre_gdc_hq_dvs_in_0_uid         psys_2600_video_isl_pre_gdc_hq_uid + 14
++#define psys_2600_video_isl_pre_gdc_hq_dvs_in_1_uid         psys_2600_video_isl_pre_gdc_hq_uid + 15
++#define psys_2600_video_isl_pre_gdc_hq_dvs_in_2_uid         psys_2600_video_isl_pre_gdc_hq_uid + 16
++#define psys_2600_video_isl_pre_gdc_hq_dvs_out_0_uid        psys_2600_video_isl_pre_gdc_hq_uid + 17
++#define psys_2600_video_isl_pre_gdc_hq_dvs_out_1_uid        psys_2600_video_isl_pre_gdc_hq_uid + 18
++#define psys_2600_video_isl_pre_gdc_hq_dvs_out_2_uid        psys_2600_video_isl_pre_gdc_hq_uid + 19
++
++#define psys_2600_video_pre_gdc_hp_pg_id                 1002
++#define psys_2600_video_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_pre_gdc_hp_pg_id)
++#define psys_2600_video_pre_gdc_hp_param_uid             psys_2600_video_pre_gdc_hp_uid + 1
++#define psys_2600_video_pre_gdc_hp_program_uid           psys_2600_video_pre_gdc_hp_uid + 2
++#define psys_2600_video_pre_gdc_hp_input_uid             psys_2600_video_pre_gdc_hp_uid + 3
++#define psys_2600_video_pre_gdc_hp_output_uid            psys_2600_video_pre_gdc_hp_uid + 4
++#define psys_2600_video_pre_gdc_hp_ae_output_uid         psys_2600_video_pre_gdc_hp_uid + 5
++#define psys_2600_video_pre_gdc_hp_blc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 6
++#define psys_2600_video_pre_gdc_hp_blc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 7
++#define psys_2600_video_pre_gdc_hp_blc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 8
++#define psys_2600_video_pre_gdc_hp_lsc_type0_input_uid   psys_2600_video_pre_gdc_hp_uid + 9
++#define psys_2600_video_pre_gdc_hp_lsc_type1_input_uid   psys_2600_video_pre_gdc_hp_uid + 10
++#define psys_2600_video_pre_gdc_hp_lsc_type2_input_uid   psys_2600_video_pre_gdc_hp_uid + 11
++#define psys_2600_video_pre_gdc_hp_hw3a_awb_output_uid   psys_2600_video_pre_gdc_hp_uid + 12
++#define psys_2600_video_pre_gdc_hp_hw3a_af_output_uid    psys_2600_video_pre_gdc_hp_uid + 13
++#define psys_2600_video_pre_gdc_hp_fw3a_rgby_uid         psys_2600_video_pre_gdc_hp_uid + 14
++#define psys_2600_video_pre_gdc_hp_fw3a_rgbs_uid         psys_2600_video_pre_gdc_hp_uid + 15
++#define psys_2600_video_pre_gdc_hp_fw3a_ydrc_uid         psys_2600_video_pre_gdc_hp_uid + 16
++#define psys_2600_video_pre_gdc_hp_drc_mapin_uid         psys_2600_video_pre_gdc_hp_uid + 17
++
++#define psys_2600_video_post_gdc_hp_pg_id                1003
++#define psys_2600_video_post_gdc_hp_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hp_pg_id)
++#define psys_2600_video_post_gdc_hp_param_uid            psys_2600_video_post_gdc_hp_uid + 1
++#define psys_2600_video_post_gdc_hp_program_uid          psys_2600_video_post_gdc_hp_uid + 2
++#define psys_2600_video_post_gdc_hp_input_uid            psys_2600_video_post_gdc_hp_uid + 3
++#define psys_2600_video_post_gdc_hp_spatial_param_uid    psys_2600_video_post_gdc_hp_uid + 4
++#define psys_2600_video_post_gdc_hp_output_uid           psys_2600_video_post_gdc_hp_uid + 5
++#define psys_2600_video_post_gdc_hp_secondary_output_uid psys_2600_video_post_gdc_hp_uid + 6
++#define psys_2600_video_post_gdc_hp_third_output_uid     psys_2600_video_post_gdc_hp_uid + 7
++#define psys_2600_video_post_gdc_hp_tnr_input_uid        psys_2600_video_post_gdc_hp_uid + 8
++#define psys_2600_video_post_gdc_hp_tnr_sim_input_uid    psys_2600_video_post_gdc_hp_uid + 9
++#define psys_2600_video_post_gdc_hp_tnr_output_uid       psys_2600_video_post_gdc_hp_uid + 10
++#define psys_2600_video_post_gdc_hp_tnr_sim_output_uid   psys_2600_video_post_gdc_hp_uid + 11
++
++#define psys_2600_video_hdr_pre_proc_pg_id                1005
++#define psys_2600_video_hdr_pre_proc_uid                  psys_2600_pg_uid(psys_2600_video_hdr_pre_proc_pg_id)
++#define psys_2600_video_hdr_pre_proc_param_uid            psys_2600_video_hdr_pre_proc_uid + 1
++#define psys_2600_video_hdr_pre_proc_program_uid          psys_2600_video_hdr_pre_proc_uid + 2
++#define psys_2600_video_hdr_pre_proc_input_uid            psys_2600_video_hdr_pre_proc_uid + 3
++#define psys_2600_video_hdr_pre_proc_output_uid           psys_2600_video_hdr_pre_proc_uid + 4
++#define psys_2600_video_hdr_pre_proc_secondary_output_uid psys_2600_video_hdr_pre_proc_uid + 5
++#define psys_2600_video_hdr_pre_proc_ae_output_uid        psys_2600_video_hdr_pre_proc_uid + 6
++#define psys_2600_video_hdr_pre_proc_blc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 7
++#define psys_2600_video_hdr_pre_proc_blc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 8
++#define psys_2600_video_hdr_pre_proc_blc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 9
++#define psys_2600_video_hdr_pre_proc_lsc_type0_input_uid  psys_2600_video_hdr_pre_proc_uid + 10
++#define psys_2600_video_hdr_pre_proc_lsc_type1_input_uid  psys_2600_video_hdr_pre_proc_uid + 11
++#define psys_2600_video_hdr_pre_proc_lsc_type2_input_uid  psys_2600_video_hdr_pre_proc_uid + 12
++#define psys_2600_video_hdr_pre_proc_hw3a_awb_output_uid  psys_2600_video_hdr_pre_proc_uid + 13
++#define psys_2600_video_hdr_pre_proc_hw3a_af_output_uid   psys_2600_video_hdr_pre_proc_uid + 14
++#define psys_2600_video_hdr_pre_proc_fw3a_rgby_uid        psys_2600_video_hdr_pre_proc_uid + 15
++#define psys_2600_video_hdr_pre_proc_fw3a_rgbs_uid        psys_2600_video_hdr_pre_proc_uid + 16
++#define psys_2600_video_hdr_pre_proc_fw3a_ydrc_uid        psys_2600_video_hdr_pre_proc_uid + 17
++#define psys_2600_video_hdr_pre_proc_drc_mapin_uid        psys_2600_video_hdr_pre_proc_uid + 18
++
++#define psys_2600_video_pre_gdc_hq_ns_pg_id                1007
++#define psys_2600_video_pre_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_hq_ns_pg_id)
++#define psys_2600_video_pre_gdc_hq_ns_param_uid            psys_2600_video_pre_gdc_hq_ns_uid + 1
++#define psys_2600_video_pre_gdc_hq_ns_program_uid          psys_2600_video_pre_gdc_hq_ns_uid + 2
++#define psys_2600_video_pre_gdc_hq_ns_input_uid            psys_2600_video_pre_gdc_hq_ns_uid + 3
++#define psys_2600_video_pre_gdc_hq_ns_output_uid           psys_2600_video_pre_gdc_hq_ns_uid + 4
++#define psys_2600_video_pre_gdc_hq_ns_noise_output_uid     psys_2600_video_pre_gdc_hq_ns_uid + 5
++#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l0_uid        psys_2600_video_pre_gdc_hq_ns_uid + 6
++#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l1_uid        psys_2600_video_pre_gdc_hq_ns_uid + 7
++#define psys_2600_video_pre_gdc_hq_ns_dvs_in_l2_uid        psys_2600_video_pre_gdc_hq_ns_uid + 8
++#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l0_uid       psys_2600_video_pre_gdc_hq_ns_uid + 9
++#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l1_uid       psys_2600_video_pre_gdc_hq_ns_uid + 10
++#define psys_2600_video_pre_gdc_hq_ns_dvs_out_l2_uid       psys_2600_video_pre_gdc_hq_ns_uid + 11
++
++#define psys_2600_video_post_gdc_hq_ns_pg_id                1008
++#define psys_2600_video_post_gdc_hq_ns_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_ns_pg_id)
++#define psys_2600_video_post_gdc_hq_ns_param_uid            psys_2600_video_post_gdc_hq_ns_uid + 1
++#define psys_2600_video_post_gdc_hq_ns_program_uid          psys_2600_video_post_gdc_hq_ns_uid + 2
++#define psys_2600_video_post_gdc_hq_ns_input_uid            psys_2600_video_post_gdc_hq_ns_uid + 3
++#define psys_2600_video_post_gdc_hq_ns_spatial_param_uid    psys_2600_video_post_gdc_hq_ns_uid + 4
++#define psys_2600_video_post_gdc_hq_ns_output_uid           psys_2600_video_post_gdc_hq_ns_uid + 5
++#define psys_2600_video_post_gdc_hq_ns_secondary_output_uid psys_2600_video_post_gdc_hq_ns_uid + 6
++#define psys_2600_video_post_gdc_hq_ns_third_output_uid     psys_2600_video_post_gdc_hq_ns_uid + 7
++#define psys_2600_video_post_gdc_hq_ns_tnr_input_uid        psys_2600_video_post_gdc_hq_ns_uid + 8
++#define psys_2600_video_post_gdc_hq_ns_tnr_output_uid       psys_2600_video_post_gdc_hq_ns_uid + 9
++#define psys_2600_video_post_gdc_hq_ns_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_ns_uid + 10
++#define psys_2600_video_post_gdc_hq_ns_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_ns_uid + 11
++#define psys_2600_video_post_gdc_hq_ns_input_ns_uid         psys_2600_video_post_gdc_hq_ns_uid + 12
++
++#define psys_2600_video_post_gdc_hq_4k_pg_id                1011
++#define psys_2600_video_post_gdc_hq_4k_uid                  psys_2600_pg_uid(psys_2600_video_post_gdc_hq_4k_pg_id)
++#define psys_2600_video_post_gdc_hq_4k_param_uid            psys_2600_video_post_gdc_hq_4k_uid + 1
++#define psys_2600_video_post_gdc_hq_4k_program_uid          psys_2600_video_post_gdc_hq_4k_uid + 2
++#define psys_2600_video_post_gdc_hq_4k_input_uid            psys_2600_video_post_gdc_hq_4k_uid + 3
++#define psys_2600_video_post_gdc_hq_4k_spatial_param_uid    psys_2600_video_post_gdc_hq_4k_uid + 4
++#define psys_2600_video_post_gdc_hq_4k_output_uid           psys_2600_video_post_gdc_hq_4k_uid + 5
++#define psys_2600_video_post_gdc_hq_4k_secondary_output_uid psys_2600_video_post_gdc_hq_4k_uid + 6
++#define psys_2600_video_post_gdc_hq_4k_third_output_uid     psys_2600_video_post_gdc_hq_4k_uid + 7
++#define psys_2600_video_post_gdc_hq_4k_tnr_input_uid        psys_2600_video_post_gdc_hq_4k_uid + 8
++#define psys_2600_video_post_gdc_hq_4k_tnr_output_uid       psys_2600_video_post_gdc_hq_4k_uid + 9
++#define psys_2600_video_post_gdc_hq_4k_tnr_sim_input_uid    psys_2600_video_post_gdc_hq_4k_uid + 10
++#define psys_2600_video_post_gdc_hq_4k_tnr_sim_output_uid   psys_2600_video_post_gdc_hq_4k_uid + 11
++#define psys_2600_video_post_gdc_hq_4k_input_ns_uid         psys_2600_video_post_gdc_hq_4k_uid + 12
++
++#define psys_2600_gaussian_pg_id          123
++#define psys_2600_gaussian_uid            psys_2600_pg_uid(psys_2600_gaussian_pg_id)
++#define psys_2600_gaussian_param_uid      psys_2600_gaussian_uid + 1
++#define psys_2600_gaussian_program_uid    psys_2600_gaussian_uid + 2
++#define psys_2600_gaussian_input_uid      psys_2600_gaussian_uid + 3
++#define psys_2600_gaussian_output_h_uid   psys_2600_gaussian_uid + 4
++#define psys_2600_gaussian_output_v_uid   psys_2600_gaussian_uid + 5
++
++#define psys_2600_video_isa_pre_gdc_hq_4k_pg_id         1012
++#define psys_2600_video_isa_pre_gdc_hq_4k_uid           psys_2600_pg_uid(psys_2600_video_isa_pre_gdc_hq_4k_pg_id)
++
++#define psys_2600_video_hdr_pre_gdc_hp_pg_id                 1015
++#define psys_2600_video_hdr_pre_gdc_hp_uid                   psys_2600_pg_uid(psys_2600_video_hdr_pre_gdc_hp_pg_id)
++#define psys_2600_video_hdr_pre_gdc_hp_isl_input_uid         psys_2600_video_hdr_pre_gdc_hp_uid + 4
++#define psys_2600_video_hdr_pre_gdc_hp_isl_output_uid        psys_2600_video_hdr_pre_gdc_hp_uid + 5
++
++#define psys_2600_video_pre_gdc_ll_pg_id                1004
++#define psys_2600_video_pre_gdc_ll_uid                  psys_2600_pg_uid(psys_2600_video_pre_gdc_ll_pg_id)
++#define psys_2600_video_pre_gdc_ll_param_uid            psys_2600_video_pre_gdc_ll_uid + 1
++#define psys_2600_video_pre_gdc_ll_program_uid          psys_2600_video_pre_gdc_ll_uid + 2
++#define psys_2600_video_pre_gdc_ll_input_uid            psys_2600_video_pre_gdc_ll_uid + 3
++#define psys_2600_video_pre_gdc_ll_output_uid           psys_2600_video_pre_gdc_ll_uid + 4
++
++//NCR mono-ds pg
++#define psys_2600_ncr_monods_gdc_pg_id                1150
++#define psys_2600_ncr_monods_gdc_uid                  psys_2600_pg_uid(psys_2600_ncr_monods_gdc_pg_id)
++#define psys_2600_ncr_monods_gdc_param_uid            psys_2600_ncr_monods_gdc_uid + 1
++#define psys_2600_ncr_monods_gdc_program_uid          psys_2600_ncr_monods_gdc_uid + 2
++#define psys_2600_ncr_monods_gdc_input_uid            psys_2600_ncr_monods_gdc_uid + 3
++#define psys_2600_ncr_monods_gdc_output_uid           psys_2600_ncr_monods_gdc_uid + 4
++#define psys_2600_ncr_monods_gdc_output_ds4_uid       psys_2600_ncr_monods_gdc_uid + 5
++#define psys_2600_ncr_monods_gdc_output_ds16_uid      psys_2600_ncr_monods_gdc_uid + 6
++
++#define tnr_stage_id                  102
++#define tnr_stage_uid                 ia_cipf_external_stage_uid(tnr_stage_id)
++#define veboxtnr_stage_id             101
++#define veboxtnr_stage_uid            ia_cipf_external_stage_uid(veboxtnr_stage_id)
++
++#define psys_interleaved_code_uid     ia_fourcc('I','L','C','S')
++#define psys_interleaved_code_in_uid  psys_interleaved_code_uid + 1
++#define psys_interleaved_code_out_uid psys_interleaved_code_uid + 2
++
++#define psys_command_psys_frequency_uid ia_fourcc('P','S','C','F')
++#define psys_command_priority_uid       ia_fourcc('P','S','C','P')
++#define psys_command_timeout_ms_uid     ia_fourcc('P','S','C','T')
++#define psys_stage_operation_mode_uid   ia_fourcc('P','S','O','P')
++#define psys_stage_routing_bitmap_uid   ia_fourcc('R','B','M','0')
++
++#define psys_software_terminal_uid(pg_id)               ia_fourcc('P','S',((pg_id & 0xFF00) >> 8),pg_id)
++#define psys_software_terminal_uid_from_stage_uid(uid)  psys_software_terminal_uid(psys_2600_pg_id_from_uid(uid))
++#define is_psys_software_terminal_uid(uid)              ((uid & 0xFFFF0000) == psys_software_terminal_uid(0))
++
++#define is_post_gdc_uid(uid)    (uid == psys_2600_post_gdc_uid \
++                              || uid == psys_2600_video_post_gdc_uid \
++                              || uid == psys_2600_video_post_gdc_v2_uid \
++                              || uid == psys_2600_video_post_gdc_mbr_uid \
++                              || uid == psys_2600_video_post_gdc_v2_mbr_uid \
++                              || uid == psys_2600_video_post_gdc_hq_ns_uid \
++                              || uid == psys_2600_still_post_gdc_uid \
++                              || uid == psys_2600_still_post_gdc_v2_uid \
++                              || uid == psys_2600_still_post_gdc_mbr_uid \
++                              || uid == psys_2600_still_post_gdc_v2_mbr_uid \
++                              || uid == psys_ipu5_still_post_gdc_v4_uid \
++                              || uid == psys_ipu5_video_post_gdc_v4_uid \
++                              || uid == psys_ipu5_video_post_gdc_uid \
++                              || uid == psys_ipu6_bb_uid \
++                              || uid == psys_ipu6_bb_gdc_uid \
++                              || uid == psys_ipu5_video_post_gdc_10bit_uid \
++                              || uid == psys_ipu5_still_post_gdc_10bit_uid)
++
++#define is_pre_gdc_uid(uid)     (uid == psys_2600_video_pre_gdc_uid \
++                              || uid == psys_2600_video_pre_gdc_hq_uid \
++                              || uid == psys_2600_video_pre_gdc_hq_vcr2_uid \
++                              || uid == psys_2600_video_pre_gdc_ll_uid \
++                              || uid == psys_2600_ipu5_video_pre_gdc_uid \
++                              || uid == psys_2600_ipu6_lb_video_uid \
++                              || uid == psys_ipu6_lb_rbm_uid \
++                              || uid == psys_2600_still_pre_gdc_uid \
++                              || uid == psys_2600_still_pre_gdc_vcr2_uid \
++                              || uid == psys_2600_still_pre_gdc_v3_uid \
++                              || uid == psys_2600_ipu5_still_pre_gdc_uid \
++                              || uid == psys_2600_ipu5_still_pre_gdc_no_xnr_uid \
++                              || uid == psys_2600_ipu5_still_pre_gdc_vpless_uid)
++
++#define is_combined_pg_uid(uid) (uid == psys_2600_video_isa_pre_gdc_uid \
++                              || uid == psys_2600_video_isl_pre_gdc_hq_uid \
++                              || uid == psys_ipu5_dfm_isa_to_psa_yuv_vmem_uid \
++                              || uid == psys_ipu5_isa_lb_uid \
++                              || uid == psys_ipu6_isa_lb_uid)
++
++#define is_isl_pg_uid(uid)    (uid == psys_ipu6_isa_rbm_uid \
++                            || uid == psys_ipu6s_isa_uid \
++                            || uid == psys_fake_ipu6s_isa_uid \
++                            || uid == psys_ipu5_dfm_isl_ps_vpless_uid)
++
++#define is_gpu_stage_uid(uid) (uid == burstisp_stage_uid \
++                            || uid == tnr_stage_uid \
++                            || uid == veboxtnr_stage_uid)
++
++/* COMMON CSS UIDS */
++#define css_program_group_params_uid        ia_fourcc('C','S','S','P')
++#define css_frame_descriptor_uid            ia_fourcc('C','S','S','F')
++#define css_sc_descriptor_uid               ia_fourcc('C','S','S','C')
++#define css_frame_max_resolution_uid        ia_fourcc('C','S','M','A')
++#define css_frame_min_resolution_uid        ia_fourcc('C','S','M','I')
++#define css_program_group_manifest_uid      ia_fourcc('C','S','S','M')
++#define css_process_group_uid               ia_fourcc('C','S','P','G')
++#define css_process_group_size_uid          ia_fourcc('C','S','P','S')
++#define css_cipr_context_uid                ia_fourcc('C','S','C','C')
++#define css_create_ppg_uid                  ia_fourcc('C','S','C','P')
++#define css_fragment_max_uid                ia_fourcc('C','S','F','<')
++#define css_fragment_min_uid                ia_fourcc('C','S','F','>')
++#define css_fragment_uid                    ia_fourcc('C','S','F','S')
++#define css_fragment_overlap_uid            ia_fourcc('C','S','F','O')
++#define css_fragment_count_uid              ia_fourcc('C','S','F','C')
++#define css_terminal_descriptor_uid         ia_fourcc('C','S','S','T')
++#define css_kernel_bitmap_uid               ia_fourcc('C','S','S','K')
++#define css_dynamic_kernel_bitmap_uid       ia_fourcc('C','S','S','D')
++#define css_fragment_grid_desc_uid          ia_fourcc('C','S','F','G')
++#define css_frame_grid_param_desc_uid       ia_fourcc('C','S','F','P')
++#define css_param_section_desc_uid          ia_fourcc('C','S','P','D')
++#define css_frag_param_section_desc_uid     ia_fourcc('C','S','F','D')
++#define css_kernel_disable_uid              ia_fourcc('C','S','K','D')
++#define css_terminal_link_id_uid            ia_fourcc('C','S','N','K')
++#define css_pg_manifest_uid                 ia_fourcc('C','S','M','F')
++#define css_terminal_connection_type_uid    ia_fourcc('C','S','C','T')
++#define css_terminal_stream2gen_buffer_size_uid    ia_fourcc('C','S','S','B')
++
++
++/* Encode 8bit vied_nci_resource_id_t into least significant byte of UID */
++#define css_vied_nci_kernel_id_uid_mask ia_fourcc(0xFF,0xFF,0xFF,0)
++#define css_vied_nci_kernel_id_uid(x)   ia_fourcc('K','I','#', x)
++
++/** PSYS stage operation modes
++ *
++ * Controllable via psys_stage_operation_mode_uid property
++ */
++typedef enum _psys_stage_opmode {
++    _psys_stage_opmode_na_,         /**< not set, defaults to raw */
++    _psys_stage_opmode_raw_,        /**< basic operation */
++    _psys_stage_opmode_coupled_,    /**< Couple stage with downstream.
++                                         Note: With coupling the IPU commands
++                                         of consequent stages can be re-ordered
++                                         for optimal scheduling with IPU
++                                         parallelism. Delay queues are added
++                                         between stages to sustain SDF.
++                                        */
++    _psys_stage_opmode_coupled_relay_, /**< Relay coupling towards downstream
++                                         Note: When more than 2 stages
++                                         participate in custom scheduling
++                                         discipline. Stages can be used to
++                                         relay the command-list (bundle) ahead
++                                         to stages in downstream.
++                                        */
++    _psys_stage_opmode_delay_only_,  /**< Delay outputs by one.
++                                         Note: Uses delays with default
++                                         scheduling discipline. Used to expose
++                                         aligned delay queue semantics as with
++                                         coupled mode but without changes to
++                                         command queueing.
++                                        */
++    _psys_stage_opmode_incomplete_  /**< no fragmenting and PG creation */
++} psys_stage_opmode_t;
++
++/*** User control utils for PSYS stage ***/
++
++/** Calculate sizeof unidentified PSYS stage property
++ *
++ * This function is intended for generalizing the calculus of stage property
++ * sizes when they need to be identified by user, but PSYS library provides
++ * helper utilities for the purpose.
++ *
++ * Property sizes may dependent on other configuration details of a stage. In
++ * such case the order of sequence needs to be derived from PSYS PG
++ * specification.
++ *
++ * Returns 0 when property cannot be identified or size calculus misses input.
++ * Note: value 0 cannot be set as size of property payload and hence the
++ * property identification loop will fail unless user handles the case.
++ *
++ * \param[in]   property    property object to identify
++ */
++uint32_t psys_library_control_sizeof_property(ia_cipf_property_t *property);
++
++/** Preset data of PSYS stage buffer
++ *
++ * This function is intended to be called when new buffers are allocated and
++ * registered for use of PSYS stage.
++ *
++ * In case of parameter buffers, this function can be expected to take care
++ * of setting the defaults when available.
++ *
++ * Buffer preset function may be dependent on other configuration details of
++ * a stage. This function can be expected to fetch the information from the
++ * stage that user has configured according to PSYS PG specification as a
++ * precondition (e.g terminal formats need to be configured).
++ *
++ * \param[in,out] buffer    buffer object to preset
++ */
++css_err_t psys_library_control_preset_buffer(ia_cipf_buffer_t *buffer);
++
++/** Preset parameter terminal buffer section sizes in Windows use case
++ *
++ * This function is intended to be called during identify loop to handle
++ * parameter terminal properties exposed from PSYS stage.
++ *
++ * This function will set buffer section sizes according to specification
++ * from manifest.
++ *
++ * \param[in,out] terminal    terminal object to preset
++ */
++css_err_t
++psys_library_control_preset_terminal_sections(ia_cipf_terminal_t *terminal);
++
++#endif
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h b/camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h
+new file mode 100644
+index 000000000000..b3d386b7e2bc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++namespace cca {
++
++// TODO: port AiqResult.cpp/.h into this class, along with deep copy functions
++//       from AiqUtils.cpp/.h from libcamhal.
++
++class AIQResult {
++public:
++    AIQResult();
++    virtual ~AIQResult();
++};
++}//cca
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h b/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
+new file mode 100644
+index 000000000000..14e65433c152
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++#include <stdint.h>
++
++namespace cca {
++
++/*
++ * TODO:
++ * This config file should be generated automatically to support different
++ * platforms or products, because the below defintions should depend on
++ * sensor, IPU, etc.
++ */
++const uint32_t MAX_CPF_LEN = 1024 * 1024 * 4;
++const uint32_t MAX_NVM_LEN = 1024 * 2;
++const uint32_t MAX_AIQD_LEN = 1024 * 1024;
++const uint32_t MAX_MKN_LEN = 1024 * 1024;
++const uint32_t MAX_MKN_SECTION_SIZE = 100000;
++const uint32_t MAX_CMC_LEN = 1024 * 1024;
++const uint32_t DEFAULT_FPS = 30;
++const uint32_t MAX_NUM_EXPOSURE = 4;
++const uint32_t MAX_NUM_STATS = 2;
++const uint32_t MAX_NUM_AF_STATS = 1;
++const uint32_t MAX_SENSOR = 2;
++const uint32_t MAX_EXPO_PLAN = 4;
++const uint32_t MAX_NUM_FLASH_LEDS = 1;
++const uint32_t MAX_BAYER_ORDER_NUM = 4;
++const uint32_t MAX_DVS_VECTOR_COUNT = 100 * 100;
++const uint32_t MAX_SIS_FRAME_SIZE = 500 * 500 * 4;
++const uint32_t MAX_PAL_TUNING_SIZE = 1024 * 1024;
++const uint32_t MAX_CUSTOM_CONTROLS_PARAM_SIZE = 128;
++const uint32_t MAX_KERNEL_NUMBERS_IN_PIPE = 128;
++const uint32_t MAX_AF_GRID_WIDTH = 128;
++const uint32_t MAX_AF_GRID_HEIGHT = 128;
++const uint32_t MAX_AF_STATS_GRID_SIZE (MAX_AF_GRID_WIDTH * MAX_AF_GRID_HEIGHT);
++const uint32_t MAX_GRBS_GRID_WIDTH = 150;
++const uint32_t MAX_GRBS_GRID_HEIGHT = 150;
++const uint32_t MAX_RGBS_STATS_GRID_SIZE (MAX_GRBS_GRID_WIDTH * MAX_GRBS_GRID_HEIGHT);
++const uint32_t MAX_STATS_LEN = 1024 * 1024;
++const uint32_t MAX_FACE_NUM = 32;
++const uint32_t MAX_LSC_DIM  = 2;
++const uint32_t MAX_LSC_DIM_SIZE (MAX_LSC_DIM * MAX_LSC_DIM);
++const uint32_t MAX_LSC_GRID_SIZE = 80 * 80;
++const uint32_t MAX_GAMMA_LUT_SIZE = 2048;
++
++
++const uint32_t GDC_Y_BLOCK_WIDTH = 64;
++const uint32_t GDC_UV_BLOCK_WIDTH = 64;
++const uint32_t GDC_Y_BLOCK_HEIGHT = 32;
++const uint32_t GDC_UV_BLOCK_HEIGHT = 16;
++const uint32_t GDC_SPLIT_METADATA_LEN = 4;
++const float GDC_CLIP_MAX_ANGLE = 3.5f;
++
++const uint32_t MAX_KERNEL_NUM_IN_PG = 128;
++const uint32_t MAX_PG_NUM = 5;
++const uint32_t MAX_PG_TERMINAL_NUM = 8;
++}//cca
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h b/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
+new file mode 100644
+index 000000000000..4b1afbdfe87b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
+@@ -0,0 +1,33 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++#pragma once
++
++#include "AIQResult.h"
++// TODO: port AiqResultStorage.h/cpp class from libcamhal here.
++
++namespace cca {
++
++class CCAStorage {
++public:
++    CCAStorage();
++    virtual ~CCAStorage();
++
++private:
++    //TODO: frame indexed stats and result arrays as private member.
++    //      Result is compond structure so define CCAResult, as for stats
++    //      just use ia_xxx structures.
++};
++}//cca
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h b/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
+new file mode 100644
+index 000000000000..d716d06ba40d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
+@@ -0,0 +1,274 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "IntelCCATypes.h"
++#ifdef PAC_ENABLE
++#include "ia_aic_types.h"
++#endif
++
++namespace cca {
++
++/*!
++ * \brief decode stats input parameters
++ */
++typedef struct {
++    long sequenceId;                           /*!< sequence id of the frame to decode from. */
++    const ia_aiq_ae_results* ae_settings;       /*!< AE result for sensor exposure setting. */
++    const ia_bcomp_results* bcomp_settings;     /*!< BComp result for lens VCM and PWM setting. */
++    ia_binary_data* stats;                      /*!< statistics binary. */
++} cca_dec_stats_input;
++
++/*!
++ * \brief decode stats output parameters
++ */
++typedef struct {
++    ia_isp_bxt_statistics_query_results_t stats;   /*!< contents of the binary. */
++    const ia_aiq_rgbs_grid **rgbs_grids;           /*!< rgbs statistics. */
++    const ia_aiq_af_grid **af_grids;               /*!< AF filter. */
++    const ia_aiq_histogram **hist;                 /*!< histogram used for AEC. */
++    const ia_dvs_statistics **dvs_statistics;      /*!< DVS statistics */
++} cca_dec_stats_output;
++
++/*!
++ * \brief intel 3a plus results for AIC run
++ */
++typedef struct {
++    ia_aiq_frame_params* frame_info;
++    unsigned long long frame_timestamp;
++    ia_aiq_pa_results_v1* pa_results;
++    ia_aiq_awb_results* awb_results;
++    ia_aiq_ae_results* aec_results;
++    ia_aiq_af_results* af_results;
++    ia_aiq_gbce_results* gbce_results;
++    ia_aiq_sa_results_v1 *sa_results;
++    ia_ltm_drc_params* drc_params;
++    ia_ltm_results* ltm_results;
++    ia_ob_output ob_results;
++    ia_dvs_morph_table* morph_table;
++    ia_dvs_image_transformation* dvs_image_transform;
++    ia_bcomp_results* bcomp_results;
++} cca_3a_plus_results;
++
++#ifdef PAC_ENABLE
++/*!
++ * \brief configure the kernels in cb for AIC
++ */
++typedef struct {
++    int group_id;
++    int fragment_count;
++    ImagingKernelGroup *kernel_group;
++} cca_cb_config;
++
++/*!
++ * \brief configure the kernels in whole pipe for AIC
++ */
++typedef struct {
++    uint32_t cb_num;
++    cca_cb_config cb_config[MAX_PG_NUM];
++} cca_aic_config;
++
++/*!
++ * \brief terminal buffer struct
++ */
++typedef struct {
++    uint32_t terminal_index;
++    size_t buf_size;
++    IaAicBuffer *payload;
++} cca_terminal_buf;
++
++/*!
++ * \brief terminals for one cb
++ */
++typedef struct {
++    int group_id;
++    uint32_t num_terminal;
++    cca_terminal_buf terminal_buf[MAX_PG_TERMINAL_NUM];
++} cca_cb_termal_buf;
++
++typedef struct {
++    uint32_t cb_num;
++    cca_cb_termal_buf cb_terminal_buf[MAX_PG_NUM];
++} cca_aic_terminal_config;
++
++/*!
++ * \brief kernel offset config for AIC
++ */
++typedef struct {
++    int uuid;
++    IaAicBufferTypes terminal_type;
++    uint32_t terminal_index;
++    uint32_t *offsets;
++    uint32_t *sizes;
++    uint32_t num_offsets;
++    uint32_t fragment;
++} cca_kernel_offset;
++
++/*!
++ * \brief kernel offset config for special cb
++ */
++typedef struct {
++    int group_id;
++    uint32_t num_kernels;
++    cca_kernel_offset kernels_offset[MAX_KERNEL_NUM_IN_PG];
++} cca_cb_kernel_offset;
++
++/*!
++ * \brief configure the all kernel offsets in whole pipe for AIC
++ */
++typedef struct {
++    uint32_t cb_num;
++    cca_cb_kernel_offset cb_kernel_offset[MAX_PG_NUM];
++} cca_aic_kernel_offset;
++#endif
++
++/*!
++ * \brief Pure interface exposed to IntelCCA for AIC operations.
++ */
++class IIPUAic {
++public:
++    virtual ~IIPUAic() = default;
++
++    /*!
++     * \brief init all the IPU handles with aiqb/cmc.
++     *
++     * \param[in] aiqb                   Mandatory.\n
++     *                                   tuning file.
++     * \param[in] cmc                    Mandatory.\n
++     *                                   CCA global initial parameters.
++     * \param[in] max_stats_width        Mandatory.\n
++     *                                   max statistics grid width.
++     * \param[in] max_stats_height       Mandatory.\n
++     *                                   max statistics grid height.
++     * \param[in] max_num_stats_in       Mandatory.\n
++     *                                   max number of stats related to hdr/multi-sensor.
++     * \param[in] mkn                    Mandatory.\n
++     *                                   maker note buffer.
++     * \return                           Error code.
++     */
++    virtual ia_err init(const ia_binary_data *aiqb, const ia_cmc_t *cmc, uint32_t max_stats_width,
++                        uint32_t max_stats_height, uint32_t max_num_stats_in, ia_mkn *mkn) = 0;
++
++    /*!
++     * \brief run AIC parameters with graph config & Intel3A results.
++     *
++     * \param[in] params                 Mandatory.\n
++     *                                   AIQ plus parameters and stats.
++     * \param[out] pal                   Mandatory.\n
++     *                                   AIC results.
++     * \return                           Error code.
++     */
++    virtual ia_err run(const cca_pal_input_params& params, cca_3a_plus_results& aaaResults, ia_binary_data* pal) = 0;
++
++    /*!
++     * \brief update tuning file aiqb.
++     *
++     * \param[in] aiqb                       Mandatory.\n
++     *                                       Tuning file.
++     * \param[in] cmc                        Mandatory.\n
++     *                                       Parsed cmc data.
++     * \return                               Error code.
++     */
++    virtual ia_err updateTuning(const ia_binary_data *aiqb, const ia_cmc_t *cmc) = 0;
++
++#ifdef PAC_ENABLE
++    /*!
++     * \brief configure cb including kernels group and kernels offset.
++     *
++     * \param[in] conf                          Mandatory.\n
++     *                                          graph config for all kernels.
++     * \param[in] offset                        Mandatory.\n
++     *                                          buffer offsets for all kernels.
++     * \param[out] termConfig                   Mandatory.\n
++     *                                          the memory needed by terminals of cb.
++     * \return                                  Error code.
++     */
++    virtual ia_err config(const cca_aic_config &conf, const cca_aic_kernel_offset &offset, cca_aic_terminal_config &termConfig) = 0;
++    /*!
++     * \brief register terminal buffers.
++     *
++     * \param[in] termConfig                    Mandatory.\n
++     *                                          the memory needed by terminals of cb.
++     * \return                                  Error code.
++     */
++    virtual ia_err registerBuf(const cca_aic_terminal_config &termConfig) = 0;
++    /*!
++     * \brief get AIC buffers for FW input after runing PAL.
++     *
++     * \param[out] termConfig                   Mandatory.\n
++     *                                          terminal memory of cb filled with IPU params.
++     * \return                                  Error code.
++     */
++    virtual ia_err getBuf(cca_aic_terminal_config &termConfig) = 0;
++    /*!
++     * \brief decode statistics for a specific type(AIQ, LTM, DVS stats).
++     *
++     * \param[in] groupId                Mandatory.\n
++     *                                   group id of CB.
++     * \param[in] seqId                  Mandatory.\n
++     *                                   sequence id for streaming.
++     * \param[out] stats                 Mandatory.\n
++     *                                   decoded statistics.
++     * \return                           Error code.
++     */
++    virtual ia_err decodeStats(int groupId, long seqId, IaCcatStatistics *stats) = 0;
++
++#else
++    /*!
++     * \brief decode statistics for a specific type(AIQ, LTM, DVS stats) <=IPU6.
++     *
++     * \param[in] decParams              Mandatory.\n
++     *                                   statistics info from FW.
++     * \param[out] results               Mandatory.\n
++     *                                   results of parsing statistics from FW.
++     * \return                           Error code.
++     */
++    virtual ia_err decodeStats(const cca_dec_stats_input &decParams, cca_dec_stats_output &results) = 0;
++
++    /*! Get PAL binary size
++    *
++    * Calculate the PAL size according to program group
++    *
++    * \param [in]  programGroup kernel info for special stream id
++    *
++    *
++    * return Pal size in success. zero on failure
++    */
++    virtual uint32_t getPalSize(const cca_program_group &programGroup) = 0;
++
++#endif
++     /*!
++     * \brief deinit all the AIC handles.
++     */
++    virtual void deinit() = 0;
++
++    /*!
++     * \brief get the IPU HW version.
++     *
++     * \return                                  IPU HW version.
++     */
++    virtual const char* getVersion() = 0;
++
++    /*!
++     * \brief get the IPU Handle.
++     *
++     * \return                       IPU handle.
++     */
++    virtual void* getIspHandle() = 0;
++
++};
++}//cca
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h b/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h
+new file mode 100644
+index 000000000000..825a198f67ed
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h
+@@ -0,0 +1,550 @@
++/*
++ * Copyright (C) 2019-2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "ia_aiq.h"
++#include "ia_types.h"
++#include "ia_ob.h"
++#include "ia_lard.h"
++#include "ia_ltm.h"
++#include "ia_dvs.h"
++#include "ia_view.h"
++#include "ia_cmc_types.h"
++#include "ia_cmc_parser.h"
++#include "ia_isp_bxt.h"
++#include "ia_bcomp.h"
++#include "ia_mkn_encoder.h"
++#ifdef PAC_ENABLE
++#include "ia_aic_types.h"
++#else
++#include "ia_isp_types.h"
++#endif
++
++#include "CCAMacro.h"
++
++namespace cca {
++
++typedef struct
++{
++    size_t size;
++    uint8_t buf[MAX_CPF_LEN];
++} cca_cpf;
++
++typedef struct
++{
++    size_t size;
++    uint8_t buf[MAX_NVM_LEN];
++} cca_nvm;
++
++typedef struct
++{
++    size_t size;
++    uint8_t buf[MAX_AIQD_LEN];
++} cca_aiqd;
++
++typedef struct
++{
++    size_t size;
++    uint8_t buf[MAX_MKN_LEN];
++} cca_mkn;
++
++typedef struct
++{
++    size_t size;
++    uint8_t buf[MAX_STATS_LEN];
++} cca_stats_bin;
++
++/*!
++ * \brief bitmap to enable CCA modules in running.
++ */
++enum CCAModuleBitMap
++{
++    CCA_MODULE_AE = 1,
++    CCA_MODULE_AF = 1 << 1,
++    CCA_MODULE_AWB = 1 << 2,
++    CCA_MODULE_PA = 1 << 3,
++    CCA_MODULE_SA = 1 << 4,
++    CCA_MODULE_GBCE = 1 << 5,
++    CCA_MODULE_LTM = 1 << 6,
++    CCA_MODULE_DVS = 1 << 7,
++    CCA_MODULE_OB = 1 << 8,
++    CCA_MODULE_BCOM = 1 << 9,
++    CCA_MODULE_LARD = 1 << 10
++};
++
++/*!
++ * \brief aiqb contents.
++ */
++enum CCALardItem
++{
++    CCA_LARD_CMC = 1,
++    CCA_LARD_AIQ = 1 << 1,
++    CCA_LARD_ISP = 1 << 2,
++    CCA_LARD_OTHER = 1 << 3
++};
++
++/*!
++ * \brief denote the type of statistics.
++ */
++enum CCAStatsType
++{
++    CCA_STATS_RGBS = 0,
++    CCA_STATS_HIST,
++    CCA_STATS_AF,
++    CCA_STATS_YV,
++    CCA_STATS_LTM,
++    CCA_STATS_DVS
++};
++
++/*!
++ * \brief DVS results type.
++ */
++enum CCADVSOutputType
++{
++    CCA_DVS_MORPH_TABLE = 0,
++    CCA_DVS_IMAGE_TRANSFORM
++};
++
++typedef struct
++{
++    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
++    uint32_t num_exposures;                                     /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
++    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
++    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
++    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
++    ia_aiq_exposure_sensor_descriptor sensor_descriptor[MAX_SENSOR];       /*!< Mandatory although function will not return error, if not given.
++                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
++                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
++    uint32_t num_sensor_descriptors;                            /*!< Mandatory. The number of sensor descriptors given in the above pointer.
++                                                                     Used to specify different sensor descriptors for each exposure. */
++    ia_rectangle exposure_window;                               /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
++    ia_coordinate exposure_coordinate;                          /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
++                                                                     AEC increases weight of given point in final AEC results. */
++    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
++    uint32_t manual_exposure_time_us[MAX_NUM_EXPOSURE];         /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
++                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of 
++                                                                     ae_results, e.g.
++                                                                     manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
++    float manual_analog_gain [MAX_NUM_EXPOSURE];                /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures
++                                                                     length. Order of gain values corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
++    uint16_t manual_iso[MAX_NUM_EXPOSURE];                      /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of
++                                                                     values of num_exposures length. Order of ISO values corresponds to exposure_index of
++                                                                     ae_results, e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
++    ia_aiq_ae_manual_limits manual_limits[MAX_NUM_EXPOSURE];    /*!< Optional. Manual limits which override limits defined in AEC tunings. */
++    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
++    float manual_convergence_time;                              /*!< Mandatory. Manual AEC convergence speed in seconds.
++                                                                     -1.0 if NA (uses tunings).
++                                                                     0.0  means convergence filters are bypassed, this is similar behavior as in previous
++                                                                          API when using frame_use still
++                                                                     > 0.0  Overrides convergence speed from tunings. */
++} cca_ae_input_params;
++
++/*!
++ * \brief exposure results.
++ */
++typedef struct
++{
++    ia_aiq_exposure_parameters exposure[MAX_EXPO_PLAN]; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
++    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_EXPO_PLAN]; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
++    float distance_from_convergence;       /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
++    bool converged;
++} cca_ae_exposure;
++
++/*!
++ *  \brief AEC hist weight map.
++ */
++typedef struct
++{
++    uint16_t width;     /*!< Width of the weight grid. */
++    uint16_t height;    /*!< Height of the weight grid. */
++    uint8_t  weights[MAX_RGBS_STATS_GRID_SIZE]; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
++} cca_hist_weight_grid;
++
++/*!
++ * \brief AEC results.
++ */
++typedef struct
++{
++    cca_ae_exposure exposures[MAX_SENSOR]; /*!< Exposure results to be used in the next frame. */
++    uint32_t num_exposures;                            /*!< The number of calculated exposures. */
++    ia_aiq_flash_parameters flashes[MAX_NUM_FLASH_LEDS]; /*!< Array of flash parameters for each flashes to be used in the next frame. */
++    uint32_t num_flashes;
++    ia_aiq_bracket_mode multiframe;                     /*!< AEC may propose to use multiframe for optimal results. */
++    ia_aiq_aperture_control aperture_control;          /*!< Aperture control parameters. */
++    cca_hist_weight_grid weight_grid;   /*!< AEC weight wap used by next frame. */
++} cca_ae_results;
++
++/*!
++ *  \brief Input parameter structure for AF algorithm.
++ */
++typedef struct
++{
++    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AF calculations (Preview, Still, video etc.). */
++    uint32_t lens_position;                                     /*!< Mandatory. Current lens position. */
++    uint64_t lens_movement_start_timestamp;                     /*!< Mandatory. Lens movement start timestamp in us. Timestamp is compared against
++                                                                     statistics timestamp
++                                                                     to determine if lens was moving during statistics collection. */
++    ia_aiq_af_operation_mode focus_mode;                        /*!< Mandatory. Focusing mode. */
++    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. User setting for flash. */
++    ia_rectangle focus_rect;                                    /*!< Optional. */
++    ia_aiq_manual_focus_parameters manual_focus_parameters;     /*!< Optional. Manual focus parameters (manual lens position, manual focusing distance).
++                                                                     Used only if focus mode 'ia_aiq_af_operation_mode_manual' is used. */
++    bool trigger_new_search;                                    /*!< TRUE if new AF search is needed, FALSE otherwise. Host is responsible for flag cleaning. */
++} cca_af_input_params;
++
++typedef struct
++{
++    ia_aiq_af_status status;                           /*!< Focus status */
++    uint32_t next_lens_position;                       /*!< Next lens position */
++    uint16_t current_focus_distance;                   /*!< Current focusing distance [mm] between the lens and object plane */
++    bool final_lens_position_reached;                  /*!< Lens has reached the final lens position */
++} cca_af_results;
++
++
++/*!
++ *  \brief Input parameter structure for AWB algorithm.
++ */
++typedef struct
++{
++    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
++    ia_aiq_awb_manual_cct_range manual_cct_range;     /*!< Optional. Manual CCT range. Used only if AWB scene mode
++                                                           'ia_aiq_awb_operation_manual_cct_range' is used. */
++    ia_coordinate manual_white_coordinate;            /*!< Optional. Manual white point coordinate relative to the full FOV of the scene.
++                                                           Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
++    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA.
++                                                           Overrides convergence speed from tunings. */
++} cca_awb_input_params;
++
++/*!
++ * \brief Results from AWB.
++ */
++typedef struct
++{
++    float accurate_r_per_g;           /*!< Accurate White Point for the image. */
++    float accurate_b_per_g;           /*!< Accurate White Point for the image. */
++    float distance_from_convergence;  /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
++} cca_awb_results;
++
++/*!
++ *  \brief Input parameter structure for GBCE algorithm.
++ */
++typedef struct
++{
++    ia_aiq_frame_use frame_use;             /*!< Deprecated. Not used. */
++    float ev_shift;                         /*!< Optional. Exposure Value shift [-4,4]. */
++} cca_gbce_input_params;
++
++
++/*!
++ * \brief R, G, B and Saturation grid block.
++ * As defined in the AIQ statistics specification.
++ * RGBS grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    rgbs_grid_block blocks_ptr[MAX_RGBS_STATS_GRID_SIZE];  /*!< RGBS blocks. */
++    unsigned short grid_width;    /*!< Grid width. */
++    unsigned short grid_height;   /*!< Grid height. */
++    bool shading_correction;      /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
++} cca_rgbs_grid;
++
++ /*!
++ * \brief R, G, B and Saturation grid block for 32-bit HDR statistics.
++ * As defined in the AIQ statistics specification.
++ * HDR RGBS grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    hdr_rgbs_grid_block blocks_ptr[MAX_RGBS_STATS_GRID_SIZE];    /*!< HDR RGBS blocks. */
++    uint32_t grid_width;            /*!< Grid width. */
++    uint32_t grid_height;           /*!< Grid height. */
++    uint32_t grid_data_bit_depth;   /*!< Bit depth of data in channel data. */
++    bool shading_correction;        /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
++} cca_hdr_rgbs_grid;
++
++/*!
++ * \brief AF statistics
++ * As defined in the AIQ statistics specification.
++ * AF grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    uint16_t grid_width;    /*!< Number of block elements horizontally in a grid. */
++    uint16_t grid_height;   /*!< Number of block elements vertically in a grid. */
++    uint16_t block_width;   /*!< Block width (bq per block element). */
++    uint16_t block_height;  /*!< Block height (bq per grid element). */
++    int32_t filter_response_1[MAX_AF_STATS_GRID_SIZE];       /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
++    int32_t filter_response_2[MAX_AF_STATS_GRID_SIZE];       /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
++} cca_af_grid;
++
++/** @brief Face state data.
++ * This structure is used to hold inputs and outputs of functions and also works as a handle of the engine instance.
++ */
++typedef struct
++{
++    uint32_t      num_faces;                 /**< Number of faces in the recently processed input frame. */
++    ia_atbx_face  faces[MAX_FACE_NUM];       /**< Array of face information. */
++} cca_face_state;
++
++/*!
++ *  \brief Input parameter structure of stats for AIQ algorithm.
++ */
++typedef struct
++{
++    uint64_t frame_id;                  /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
++    uint64_t frame_timestamp;           /*!< Mandatory although function will not return error, if not given. Start of frame timestamp in microseconds. */
++    cca_face_state faces;               /*!< Mandatory although function will not return error, if not given. Face coordinates from external face detector.
++                                             DSD will not return all scene modes, if not given. AWB will not take face information into account,
++                                             if not given. */
++    ia_aiq_camera_orientation camera_orientation;               /*!< The orientation of the camera. Currently unused. */
++    cca_hist_weight_grid weight_grid;   /*!< Weight map to be used in the next frame histogram calculation. */
++    uint16_t dvs_stats_height;                /*!< height of dvs statistics */
++    uint16_t dvs_stats_width;                 /*!< width of dvs statistics */
++} cca_stats_params;
++
++/*!
++*  \brief Input parameter structure for Parameter adaptor.
++*/
++typedef struct
++{
++    ia_aiq_color_channels color_gains;              /*!< Optional. RGB gains for each color channels.
++                                                         These gain will be applied on top of RGB gains calculated from WB results. */
++} cca_pa_input_params;
++
++/*!
++ *  \brief Input parameter structure for Shading Adaptor.
++ */
++typedef struct
++{
++    float manual_convergence_time;          /*!< Mandatory, in seconds. Allows override of tunings for LSC transition interval
++                                                 -1.0 if NA (uses tunings).
++                                                 0.0  forces update of LSC table, this is similar behavior as in previous API when using frame_use still
++                                                 > 0.0  Overrides convergence speed from tunings */
++} cca_sa_input_params;
++
++/*!
++ *  \brief output structure for Shading Adaptor.
++ */
++typedef struct
++{
++    uint16_t lsc_grid[MAX_LSC_DIM_SIZE][MAX_LSC_GRID_SIZE];   /*!< Arrays of the LSC grid for all color channels.*/
++    uint16_t width;                            /*!< Width of LSC grid. */
++    uint16_t height;                           /*!< Height of LSC grid. */
++    cmc_bayer_order color_order;               /*!< Bayer order of LSC grid. */
++    bool lsc_update;                           /*!< LSC LUT is updated */
++} cca_sa_results;
++
++/*!
++ *  \brief params for global brightness and contrast enhancement.
++ */
++typedef struct
++{
++    float r_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
++    float b_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
++    float g_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
++    uint32_t gamma_lut_size;                        /*!< size of LUT. */
++} cca_gbce_params;
++
++/*!
++ *  \brief params for parameter adaptor.
++ */
++typedef struct
++{
++    bool enable_manual_settings;               /*!< indicate input params is valid. */
++    float color_conversion_matrix[3][3];       /*!< CC matrix. */
++    ia_aiq_color_channels color_gains;         /*!< RGB gains for each color channels. */
++} cca_pa_params;
++
++/*!
++ *  \brief input parameter structure for aiq algorithm comp.
++ */
++typedef struct
++{
++    uint32_t bitmap;                /*!< algo(af,awb,gbce,pa,sa) enable/disable bitmap (CCAModuleBitMap) */
++    cca_af_input_params af_input;
++    cca_awb_input_params awb_input;
++    cca_gbce_input_params gbce_input;
++    cca_pa_input_params pa_input;
++    cca_sa_input_params sa_input;
++    ia_aiq_frame_params frame_params; /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++} cca_aiq_params;
++
++/*!
++ *  \brief results structure for aiq algorithm comp.
++ */
++typedef struct
++{
++    cca_af_results af_output;
++    cca_awb_results awb_output;
++    cca_sa_results sa_output;
++    cca_gbce_params gbce_output;
++    cca_pa_params  pa_output;
++} cca_aiq_results;
++
++/** LTM SIS.
++ * This structure contains LTM statistics.
++ */
++typedef struct
++{
++    ia_image_full_info image_info;       /* image info e.g image resolution */
++    uint32_t size;                       /* length of SIS */
++    uint8_t data[MAX_SIS_FRAME_SIZE];    /* SIS frame */
++} cca_ltm_statistics;
++
++typedef struct
++{
++    ia_ltm_level ltm_level;                 /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
++    float ev_shift;                         /*!< Optional. (ob) Exposure Value shift [-4,4]. */
++    uint8_t ltm_strength_manual;            /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char,
++                                                 [0, 200], default is 100 and means no manual effect*/
++    int16_t frame_width;                    /*!< Mandatory. Width of the frame where the results will be applied. */
++    int16_t frame_height;
++    cca_ltm_statistics sis;
++} cca_ltm_input_params;
++
++
++/** DVS Motion vectors.
++ * This structure contains DVS statistics.
++ */
++typedef struct
++{
++    uint32_t vector_count;              /* Number of motion vectors */
++    ia_dvs_motion_vector motion_vectors[MAX_DVS_VECTOR_COUNT];   /* Table of local motion vectors. Contains [vector_count] values. */
++} cca_dvs_statistics;
++
++/** DVS configuration.
++ * This structure contains DVS configuration.
++ */
++typedef struct
++{
++    ia_isp_bxt_resolution_info_t gdc_resolution_history;
++    ia_isp_bxt_resolution_info_t gdc_resolution_info;
++    int pre_gdc_top_padding;
++    int pre_gdc_bottom_padding;
++    int gdc_filter_width;
++    int gdc_filter_height;
++    uint8_t splitMetadata[GDC_SPLIT_METADATA_LEN];
++} cca_gdc_configuration;
++
++struct cca_dvs_zoom
++{
++    float digital_zoom_ratio;               /* Digital zoom ratio */
++    float digital_zoom_factor;              /* If LGD correction is enabled and envelope is not big enough, small amount of DZ is automatically applied. */
++    ia_dvs_zoom_mode zoom_mode;             /* Digital zooming mode */
++    ia_rectangle zoom_region;               /* Zooming region which defines area to be scaled for the output. */
++    ia_coordinate zoom_coordinate;          /* Zooming coordinate which defines point where digital zoom is applied. */
++};
++
++/*!
++*  \brief IA_ISP_BXT parameter input structure.
++*/
++typedef struct
++{
++    size_t size;
++    uint8_t data[MAX_PAL_TUNING_SIZE];
++} cca_pal_tuning;
++
++typedef struct
++{
++    int count;
++    float parameters[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
++} cca_custom_control_params;
++
++typedef struct
++{
++    ia_isp_bxt_program_group base;
++    ia_isp_bxt_run_kernels_t run_kernels[MAX_KERNEL_NUMBERS_IN_PIPE];  /*!< Array of kernels in the program group. */
++    ia_isp_bxt_pipe_t pipe[MAX_KERNEL_NUMBERS_IN_PIPE];                /*!< The graph of kernels in the program group .*/
++    ia_isp_bxt_resolution_info_t resolution_info[MAX_KERNEL_NUMBERS_IN_PIPE];          /*!< Resolution change to be done in this kernel. NULL, if kernel doesn't change resolution. */
++    ia_isp_bxt_resolution_info_t resolution_history[MAX_KERNEL_NUMBERS_IN_PIPE];       /*!< Resolution changes done before current kernel with respect to sensor output. NULL, if not available*/
++} cca_program_group;
++
++typedef struct
++{
++    ia_aiq_advanced_ccm_t preferred_acm;       /*!< Optional, manual setting for acm to replace the acm in PA results */
++    uint32_t stream_id;                        /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
++                                                    associated with the stream_id. */
++    uint32_t seq_id;                           /*!< Optional. sequence number for aic run */
++    ia_isp_feature_setting nr_setting;         /*!< Mandatory. Feature setting for noise reduction algorithms. */
++    ia_isp_feature_setting ee_setting;         /*!< Mandatory. Feature setting for edge enhancement algorithms. */
++    int8_t manual_brightness;                  /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
++    int8_t manual_contrast;                    /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
++    int8_t manual_hue;                         /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
++                                                    Value -96 means red become blue, green become red, blue become green */
++    int8_t manual_saturation;                  /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
++    ia_isp_effect effects;                     /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
++    float manual_digital_gain;                 /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP
++                                                    statistics collection. Values less than 1.0 means no additional gain. */
++    ia_media_format media_format;              /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
++    cca_program_group program_group;           /*!< Program group parameters for running AIC */
++    cca_custom_control_params custom_controls; /*!< Optional. Custom control parameter for interpolating between different tunings.
++                                                    If custom controls are not used, pointer can be set as null.*/
++    cca_pal_tuning pal_override;               /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
++                                                    Algo API binary format. Binary may contain multiple parameter sets.
++                                                    Can be set as null if PAL override functionality is not used. */
++    ia_view_config_t view_params;              /*!< Optional. View parameters for running in GDC5 mode.*/
++    ia_isp_bxt_gdc_limits gdc_mbr_limits;      /*!< Optional. GDC MBR limits for WFOV usecases */
++    cca_pa_params manual_pa_setting;           /*!< Optional. manual settings (ccm & gain) for pa results.*/
++    cca_gbce_params manual_gbce_setting;       /*!< Optional. manual settings (gamma lut) for gbce results.*/
++    bool force_lsc_update;                     /*!< Optional. force to update LSC for SA results.*/
++} cca_pal_input_params;
++
++/*!
++*  \brief cmc parsed structure.
++*/
++typedef struct
++{
++    uint16_t base_iso;
++    cmc_optomechanics_t optics;
++    uint16_t lut_apertures;
++} cca_cmc;
++
++struct cca_init_params{
++    cca_cpf aiq_cpf;
++    cca_nvm aiq_nvm;
++    cca_aiqd aiq_aiqd;
++    unsigned int bitmap;       /*!< Mandatory. list all components (CCAModuleBitMap) that need initialization. */
++    ia_lard_input_params lardTag;
++    //BComp init params
++    float conversionGainRatio;
++    ia_bcomp_dol_mode_t dolMode;
++    //DVS
++    CCADVSOutputType dvsOutputType;
++    float dvsZoomRatio;
++    bool enableVideoStablization;
++    cca_gdc_configuration gdcConfig;
++    cca_init_params() :
++        conversionGainRatio(1),
++        dolMode(ia_bcomp_non_dol),
++        dvsOutputType(CCA_DVS_MORPH_TABLE),
++        dvsZoomRatio(1.0f),
++        enableVideoStablization(false)
++        {
++            bitmap = CCA_MODULE_AE | CCA_MODULE_AF | CCA_MODULE_AWB |
++                     CCA_MODULE_PA | CCA_MODULE_SA | CCA_MODULE_GBCE |
++                     CCA_MODULE_LTM | CCA_MODULE_DVS | CCA_MODULE_OB |
++                     CCA_MODULE_BCOM;
++            lardTag.aiq_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
++            lardTag.cmc_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
++            lardTag.isp_mode_index = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
++            lardTag.others_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
++        }
++};
++
++}//cca
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
+new file mode 100644
+index 000000000000..261591084739
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
+@@ -0,0 +1,81 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++
++/*!
++ * \file ia_aec.h
++ * \brief Definitions and declarations of Intel AEC algorithm.
++ */
++
++#ifndef _IA_AEC_H_
++#define _IA_AEC_H_
++
++#include "ia_configuration.h"
++#include "ia_types.h"
++#include "ia_ccat.h"
++#include "ia_aec_types.h"
++#include "ia_cmc_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Initialize IA_AEC
++ * This function must be called before any other function in the library. It allocates memories for all AEC algorithms based on input parameters
++ * given by the user. AIQB (from CPFF). Initialization returns a handle to the AEC instance, which is given as input parameter for all the
++ * subsequent calls to this library. Therefore, multiple instances of AEC can running simultaneously. For example one instance per camera.
++ *
++ * \param[in]     atbx              Analysis Toolbox handle. AEC will use it to get statistics analysis results.
++ * \param[in]     aiqb_data         Contains tuning parameters for AEC algorithms. NULL, if built-ion defaults are to be used.
++ * return                           IA_AEC handle. Use the returned handle as input parameter for the consequent IA_AEC calls.
++ */
++LIBEXPORT ia_aec*
++ia_aec_init(
++    ia_ccat *ccat,
++    const ia_binary_data *aiqb_data,
++    const ia_cmc_t *a_cmc_ptr);
++
++/*!
++ * \brief De-initialize IA_AEC and its submodules.
++ * All memory allocated by AEC algorithm is freed. AEC handle can no longer be used.
++ *
++ * \param[in] ia_aec                AEC instance handle.
++ */
++LIBEXPORT void
++ia_aec_deinit(ia_aec *ia_aec);
++
++/*!
++ * \brief AEC calculation based on input parameters and frame statistics.
++ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
++ *
++ * \param[in] ia_aec                 AEC instance handle.
++ * \param[in] aec_input_params       Input parameters for AEC calculations.
++ * \param[out] aec_results           Pointer where AEC results are stored. Client allocates this memory and AEC only fills it with next exposure parameters.
++ * \return                           Error code.
++ */
++LIBEXPORT ia_err
++ia_aec_run(
++    ia_aec *ia_aec,
++    const ia_aec_input_params *aec_input_params,
++    ia_aec_results *aec_results);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_AEC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
+new file mode 100644
+index 000000000000..e02a7c59aeaa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
+@@ -0,0 +1,143 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++
++/*!
++ * \file ia_aec.h
++ * \brief Definitions and declarations of Intel AEC algorithm.
++ */
++
++#ifndef _IA_AEC_TYPES_H_
++#define _IA_AEC_TYPES_H_
++
++#include "ia_configuration.h"
++#include "ia_types.h"
++#include "ia_aiq_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef IA_AEC_FEATURE_WEIGHT_GRID
++#define IA_AEC_WEIGHT_GRID_SIZE (IA_AEC_WEIGHT_GRID_WIDTH * IA_AEC_WEIGHT_GRID_HEIGHT)
++typedef struct
++{
++    unsigned int grid_width;
++    unsigned int grid_height;
++    unsigned char data[IA_AEC_WEIGHT_GRID_SIZE];
++} ia_aec_weight_grid;
++#endif
++
++typedef struct ia_aec_t ia_aec;
++
++/*!
++ * \brief Input parameter structure for AE algorithm.
++ * This structure can be initialized to zero values for basic functionality (disable or make features ineffective).
++ */
++typedef struct
++{
++    unsigned int num_exposures;                                                     /*!< The number of exposure outputs to have. One for LDR, two or more for HDR/exposure bracketing. */
++    ia_aiq_exposure_sensor_descriptor sensor_descriptor[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Sensor specific descriptor and limits of the used sensor mode for target frame use. */
++    unsigned int num_sensor_descriptors;                                            /*!< The number of sensor descriptors given in the above pointer.
++                                                                                         Used to specify different sensor descriptors for each exposure. */
++    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority;        /*!< AEC exposure distribution priority mode. */
++    ia_aiq_ae_priority_mode priority_mode;                                          /*!< AEC priority mode. */
++    float manual_convergence_time;                                                  /*!< Manual AEC convergence speed in seconds.
++                                                                                        < 0.0   Use convergence speed from tunings.
++                                                                                         0.0    Convergence filters are bypassed. This is similar behavior as in previous API when using frame_use still
++                                                                                         > 0.0  Overrides convergence speed from tunings. */
++    ia_aiq_ae_manual_limits manual_limits[IA_AEC_EXPOSURES_MAX_NUM];                /*!< Manual limits which override limits defined in AEC tunings. If tunings are to be used, all values must be set to 0. */
++    unsigned int num_manual_limits;                                                 /*!< Number of limits to use. One, if same limits are used for all exposures, two or more if different limits for each exposure are used. */
++    float ev_shift;                                                                 /*!< Exposure Value shift [-4,4]. */
++#ifdef IA_AEC_FEATURE_FLASH
++    ia_aiq_flash_mode flash_mode;                                                   /*!< Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
++#endif
++#ifdef IA_AEC_FEATURE_WEIGHT_GRID
++    ia_aiq_ae_metering_mode metering_mode;                                          /*!< AEC metering mode. */
++#endif
++#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode;                             /*!< AEC flicker reduction mode. */
++#endif
++#ifdef IA_AEC_FEATURE_ROI_ENABLED
++    ia_rectangle exposure_window;                                                   /*!< Rectangle of area which AEC uses to to calculate new exposure parameters. If rectangle is not to be used, all values must be set to 0. */
++#endif
++#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
++    float manual_aperture_fn;                                                       /*!< Manual f-number of aperture (e.g. 2.8), <= 0.0 for N/A. Used only with P iris. */
++#endif
++#ifdef IA_AEC_FEATURE_DC_IRIS
++    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command;                 /*!< Used only with DC iris. 0 (auto) for N/A. */
++#endif
++} ia_aec_input_params;
++
++/*!
++ *  \brief Gain structure defining gain value and type.
++ */
++typedef struct
++{
++    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
++    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
++} ia_aec_gain;
++
++/*!
++* \brief AEC results.
++*/
++typedef struct
++{
++    unsigned int exposure_time_us;           /*!< Exposure time in microseconds, -1 if N/A. */
++    ia_aec_gain gains[IA_CMC_GAINS_MAX_NUM]; /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
++    unsigned int num_gains;                  /*!< The number of gains. */
++    int iso;                                 /*!< ISO value corresponding to the total gains. -1 if N/A. */
++    unsigned int total_target_exposure;      /*!< Total exposure ie. combination of Et, Total gains and Aperture gain, -1 if N/A. */
++} ia_aec_exposure_parameters;
++
++typedef struct
++{
++    unsigned int exposure_index;                                                    /*!< Exposure index which identifies the exposure. */
++    ia_aec_exposure_parameters exposure[IA_AEC_EXPOSURE_PLANS_NUM];                 /*!< Exposure parameters to be used in the next frame in generic format. */
++    ia_aiq_exposure_sensor_parameters sensor_exposure[IA_AEC_EXPOSURE_PLANS_NUM];   /*!< Exposure parameters to be used in the next frame in sensor specific format. */
++    unsigned int exposure_plan_ids[IA_AEC_EXPOSURE_PLANS_NUM];                      /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
++    float distance_from_convergence;                                                /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
++} ia_aec_exposure_result;
++
++typedef struct
++{
++    ia_aec_exposure_result exposures[IA_AEC_EXPOSURES_MAX_NUM];  /*!< Results for each exposure to be used in the next frame. */
++    unsigned int num_exposures;                                  /*!< The number of calculated exposures. */
++    float lux_level_estimate;                                    /*!< Lux level estimate. */
++    bool converged;                                              /*!< Indicates that AE has converged. */
++#ifdef IA_AEC_FEATURE_WEIGHT_GRID
++    ia_aec_weight_grid weight_grid;                              /*!< Weight map to be used in the next frame histogram calculation. */
++#endif
++#ifdef IA_AEC_FEATURE_FLASH
++    ia_aiq_flash_parameters flashes[IA_AEC_FLASHES_NUM];         /*!< Array of flash parameters for each flashes to be used in the next frame. */
++#endif
++#ifdef IA_AEC_FEATURE_FLICKER_DETECTION
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode;          /*!< Flicker reduction mode proposed by the AEC algorithm */
++#endif
++#ifdef IA_AEC_FEATURE_MULTIFRAME_HINT
++    ia_aiq_bracket_mode multiframe;                              /*!< AEC may propose to use multiframe for optimal results. */
++#endif
++#ifdef IA_AEC_FEATURE_APERTURE_CONTROL
++    ia_aiq_aperture_control aperture_control;                    /*!< Aperture control parameters. */
++#endif
++} ia_aec_results;
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_AEC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
+new file mode 100644
+index 000000000000..387aac25018f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
+@@ -0,0 +1,181 @@
++/*
++ * Copyright 2018-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_aic_myriad.h
++ * \brief ia_aic_myriad specific implementation.
++ *
++ * \mainpage
++ * \section main Automatic ISP (AIC) Configuration component for Myriad ISP
++ *
++ * AIC is stateless component, which purpose is to
++ * - Convert generic results into ISP specific format.
++ * - Adapt ISP tunings based on run-time changing parameters.
++ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
++ *
++ * AIC consists of following components:
++ * - \ref gaic
++ *
++ * AIC API is defined in ia_aic_myriad.h file.
++ *
++ * See \ref integration for more detailed information about various integration details.
++ *
++ * \page aicparts AIC modules
++ * \section gaic Generic AIC (GAIC)
++ *
++ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
++ * schemes to calculate ISP parameters between distinct tunings.
++ *
++ * \page integration Integration notes
++ * \section AIC output buffer state
++ *
++ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
++ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
++ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
++ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
++ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
++ *
++*/
++
++#ifndef IA_AIC_MYRIAD_H_
++#define IA_AIC_MYRIAD_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ipipe.h"
++#include "ia_statistics_types.h"
++//#include "ia_dvs_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef struct ia_aic_myriad_t ia_aic_myriad;
++
++/*!
++ * \brief Initialize ia_aic_myriad.
++ * This function must be called before any other function in the library.
++ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the ia_aic_myriad functions.
++ */
++
++LIBEXPORT ia_aic_myriad*
++ia_aic_myriad_init(void);
++
++LIBEXPORT void
++ia_aic_myriad_deinit(ia_aic_myriad *ia_aic_myriad);
++
++LIBEXPORT ia_err
++ia_aic_myriad_set_tuning(
++    ia_aic_myriad *aic_myriad,
++    const ia_binary_data *aiqb_data,
++    const ia_cmc_t *ia_cmc);
++
++/*!
++ *  \brief ia_aic_myriad parameter input structure.
++ */
++typedef struct
++{
++    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_aic_myriad_run function is called. AIC uses timestamp to decide what
++                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
++    unsigned int frame_width;
++    unsigned int frame_height;
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
++    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
++                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
++                                                                     ae results and not only needed parameters. */
++    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
++    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
++//    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
++} ia_aic_myriad_input_params;
++
++/*!
++ * \brief ISP configuration for the next frame
++ * Computes ISP parameters from input parameters and CPF values for the next image.
++ *
++ * \param[in] ia_aic_myriad                 Mandatory. ISP instance handle.
++ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
++ * \param[in/out] output                    Mandatory. Output data structure. If output pointer is given, AIC writes the results to given buffer.
++ *                                                     Output is following ISP API format.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aic_myriad_run(
++    ia_aic_myriad *ia_aic_myriad,
++    const ia_aic_myriad_input_params *input_params,
++    icIspConfig *output);
++
++/*!
++ * \brief Creates ISP parameters output buffer.
++ * This function can be used by AIC client to create AIC output buffer. This function's output can be
++ * passed ia_aic_myriad_run() function to fill the output_data structure.
++ *
++ * \return                         ISP configuration parameter structure.
++ */
++LIBEXPORT icIspConfig *
++ia_aic_myriad_create_output(void);
++
++LIBEXPORT void
++ia_aic_myriad_delete_output(icIspConfig *output);
++
++LIBEXPORT ia_err
++ia_aic_myriad_statistics_convert_rgbs_grid_v2(
++        const icIspConfig *isp_config,
++        ia_rgbs_grid *rgbs_grid);
++
++LIBEXPORT ia_err
++ia_aic_myriad_statistics_convert_rgbs_grid(
++    const icIspConfig *isp_config,
++    ia_aiq_rgbs_grid *rgbs_grid);
++
++/*!
++ * \brief Converts Myriad ISP specific convolution filter response grid statistics to CCAT format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into CCAT format.
++ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
++ *
++ * \param[out] out_fr_grid   Mandatory.\n
++ *                           Pointer's to structure where converted statistics are stored.
++ *                           Converted af grid statistics.
++ * \return                   Error code.
++ */
++LIBEXPORT ia_err
++ia_aic_myriad_statistics_convert_fr_grid_v2(
++    const icIspConfig *isp_config,
++    ia_filter_response_grid *out_fr_grid);
++
++/*!
++ * \brief Converts Myriad ISP specific convolution filter response grid statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in]  ia_aic_myriad Mandatory. ia_aic_myriad instance handle.
++ *
++ * \param[out] out_fr_grid   Mandatory.\n
++ *                           Pointer's pointer where address of converted statistics are stored.
++ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
++ * \return                   Error code.
++ */
++LIBEXPORT ia_err
++ia_aic_myriad_statistics_convert_fr_grid(
++    const icIspConfig *isp_config,
++    ia_aiq_af_grid *out_fr_grid);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_AIC_MYRIAD_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
+new file mode 100644
+index 000000000000..86b284303acb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
+@@ -0,0 +1,621 @@
++/*
++ * Copyright 2012-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \mainpage IA AIQ API documentation
++ *
++ * Browse Files and Classes tabs for details.
++ *
++ * \section general General info
++ *
++ * AIQ API has been designed to be re-entrant. Each algorithm function can be called multiple times per frame.
++ * Input parameters for the algorithms define what is the output ie. running an algorithm with same input parameters
++ * and same statistics produce the same output. For example one can run AE multiple times with different EV compensations
++ * to get parameters for exposure bracketing.
++ *
++ * AIQ (Algorithms and Image Quality) library contains several algorithm which are used to modify RAW image.
++ * Currently following features and algorithms are supported:
++ * - \ref aec (Automatic Exposure Control)
++ * - \ref awb (Automatic White Balance)
++ * - \ref af (Automatic Focus)
++ * - \ref sa (Shading Adaptor)
++ * - \ref pa (Parameter Adaptor)
++ * - \ref dsd (Discrete Scene Detection)
++ * - \ref gbce (Global Brightness and Contrast Enhancement)
++ *
++ * AIQ also supports calculation of parameters for multiframe bracketing cases:
++ * - \ref afbracket (Automatic Focus Bracket)
++ * - \ref aebracket (Automatic Exposure Bracket)
++ *
++ * Running AIQ algorithms requires following steps:
++ * - \ref init
++ * - \ref stats
++ * - \ref running
++ * - \ref deinit
++ *
++ * Some AIQ algorithms require coordinates as inputs to specify a certain area in the image. Coordinates are relative to
++ * the statistics thus not necessarily the whole sensor area. Coordinates are not absolute but relative. See \link ia_coordinate.h \endlink
++ * for detailed description of the used coordinate system.
++ * <br><hr><br>
++ *
++ * \section init Initialization of AIQ library
++ *
++ * \copybrief ia_aiq_init
++ * To create an instance of AIQ library one must call function:
++ * \code ia_aiq_init \endcode
++ * \copydetails ia_aiq_init
++ *
++ * <br><hr><br>
++ *
++ * \section stats Setting of frame statistics
++ *
++ * Algorithms depend on statistics collected from the RAW image. Some or all of the statistics are
++ * calculated by the ISP after RAW image capture from camera sensor. These statistics are always collected from
++ * captured image data. To convert statistics from ISP specific format to AIQ format, a helper function can be used:
++ * \code ia_isp_XXX_statistics_convert \endcode
++ * See ia_isp documentation for details.
++ *
++ * \copybrief ia_aiq_statistics_set
++ * To set statistics for algorithms AIQ library, one must call function:
++ * \code ia_aiq_statistics_set \endcode
++ * \copydetails ia_aiq_statistics_set
++ *
++ * Algorithms can also utilize external sensor data for making better decisions. For example external light sensor
++ * can be used by AEC to determine correct cold start exposure parameters when AEC is called the first time without
++ * statistics.
++ *
++ * \copybrief ia_aiq_sensor_events_set_v1
++ * To set external sensor data statistics for algorithms AIQ library, one must call function:
++ * \code ia_aiq_sensor_events_set_v1 \endcode
++ * \copydetails ia_aiq_sensor_events_set_v1
++ *
++ * <br><hr><br>
++ *
++ * \section running Running AIQ algorithms
++ *
++ * Once the AIQ instance is initialized and statistics are set, algorithms can be run in any order.
++ * \subsection af AF
++ * \copybrief ia_aiq_af_run
++ * \code ia_aiq_af_run \endcode
++ * \copydetails ia_aiq_af_run
++ *
++ * \subsection aec AEC
++ * \copybrief ia_aiq_ae_run
++ * \code ia_aiq_ae_run \endcode
++ * \copydetails ia_aiq_ae_run
++ *
++ * \subsection awb AWB
++ * \copybrief ia_aiq_awb_run
++ * \code ia_aiq_awb_run \endcode
++ * \copydetails ia_aiq_awb_run
++ *
++ * \subsection sa SA
++ * \copybrief ia_aiq_sa_run
++ * \code ia_aiq_sa_run \endcode
++ * \copydetails ia_aiq_sa_run
++ *
++ * \subsection pa PA
++ * \copybrief ia_aiq_pa_run
++ * \code ia_aiq_pa_run \endcode
++ * \copydetails ia_aiq_pa_run
++ *
++ * \subsection dsd DSD
++ * \copybrief ia_aiq_dsd_run
++ * \code ia_aiq_dsd_run \endcode
++ * \copydetails ia_aiq_dsd_run
++ *
++ * \subsection gbce GBCE
++ * \copybrief ia_aiq_gbce_run
++ * \code ia_aiq_gbce_run \endcode
++ * \copydetails ia_aiq_gbce_run
++ *
++ * \subsection afbracket AF Bracket
++ * \copybrief ia_aiq_af_bracket
++ * \code ia_aiq_af_bracket \endcode
++ * \copydetails ia_aiq_af_bracket
++ *
++ * \subsection aebracket AE Bracket & HDR
++ * AEC supports outputting of multiple exposure results. By setting the "num_exposures" parameter >1 in ia_aiq_ae_input_params, AEC determines
++ * the best exposure parameters to cover as much as possible of the sensor's dynamic range. AIQ's client can then queue the exposure parameters
++ * to the sensor for consecutive frames for best speed.
++ *
++ * HDR support in AEC works the same way. Client requests >1 "num_exposures" but also gives AIQ the resulting statistics from all requested
++ * exposures. AEC uses the given (multiple) statistics to calculate new exposure parameters.
++ *
++ *
++ * <br><hr><br>
++ *
++ * \section deinit De-initialization of AIQ library
++ *
++ * To de-initialize and free memory AIQ library instance has allocated, one must call function:
++ * \code
++ * ia_aiq_deinit
++ * \endcode
++ *
++ * After this call AIQ library instance is destroyed and can't be used.
++ */
++
++/*!
++ * \file ia_aiq.h
++ * \brief Definitions and declarations of Intel 3A library.
++ */
++
++#ifndef _IA_AIQ_H_
++#define _IA_AIQ_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ia_mkn_types.h"
++#include "ia_cmc_types.h"
++#include "ia_aiq_deprecated.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Initialize IA_AIQ and its submodules.
++ * This function must be called before any other function in the library. It allocates memories for all AIQ algorithms based on input parameters
++ * given by the user. AIQB (from CPFF) and NVM data are parsed and combined resulting camera module specific tuning parameters which the
++ * AIQ algorithms use. Initialization returns a handle to the AIQ instance, which is given as input parameter for all the
++ * algorithms. Therefore, multiple instances of AIQ library can running simultaneously. For example one instance per camera.
++ *
++ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
++ *                                  Contains tuning parameters for AIQ algorithms.
++ * \param[in]     nvm_data          Optional.\n
++ *                                  NVM (Non Volatile Memory) containing sensor unit specific calibration data.
++ *                                  AIC uses camera unit specific calibration data, if given.
++ * \param[in]     aiqd_data         Optional.\n
++ *                                  AIQ generic input data, provided by the host. Contains various AIQ related information, collected
++ *                                  during run-time and stored in a host file system. AIQ will parse this data in to internal storage.
++ * \param[in]     stats_max_width   Mandatory.\n
++ *                                  Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
++ *                                  memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
++ *                                  and AF statistics grid allocations.
++ * \param[in]     stats_max_height  Mandatory.\n
++ *                                  Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
++ *                                  memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
++ *                                  and AF statistics grid allocations.
++ * \param[in]     max_num_stats_in  Mandatory.\n
++ *                                  The maximum number of input statistics for one frame. Each statistics is related to different exposure.
++ *                                  Used especially for sensors that support two or more simultaneous exposures (HDR).
++ * \param[in]     ia_cmc            Mandatory.\n
++ *                                  Parsed camera module characterization structure. ia_cmc structure needs to be kept available by client for
++ *                                  the lifetime of AIQ component.
++ * \param[in,out] ia_mkn            Optional.\n
++ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from AIQ is needed
++ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
++ *                                  Client writes the data into Makernote section in EXIF.
++ * return                           IA_AIQ handle. Use the returned handle as input parameter for the consequent IA_AIQ calls.
++ */
++LIBEXPORT ia_aiq*
++ia_aiq_init(const ia_binary_data *aiqb_data,
++            const ia_binary_data *nvm_data,
++            const ia_binary_data *aiqd_data,
++            unsigned int stats_max_width,
++            unsigned int stats_max_height,
++            unsigned int max_num_stats_in,
++            ia_cmc_t *ia_cmc,
++            ia_mkn *ia_mkn);
++
++/*!
++ * \brief Set tuning to an existing AIQ instance.
++ * This function can be used to switch tunings on-the-fly in a way that 3A preserves its state and offers smooth transition from one tuning to another.
++ */
++LIBEXPORT ia_err
++ia_aiq_set_tuning(ia_aiq *ia_aiq,
++                  const ia_binary_data *aiqb_data);
++
++/*!
++ * \brief De-initialize IA_AIQ and its submodules.
++ * All memory allocated by AIQ algoriths are freed. AIQ handle can no longer be used.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ */
++LIBEXPORT void
++ia_aiq_deinit(ia_aiq *ia_aiq);
++
++/*!
++ *  \brief Input parameter structure for AE algorithm.
++ */
++typedef struct
++{
++    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
++    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
++    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
++    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
++    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
++    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
++    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
++                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
++                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
++    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
++                                                                     Used to specify different sensor descriptors for each exposure. */
++    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
++    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
++                                                                     AEC increases weight of given point in final AEC results. */
++    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
++    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
++                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
++    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
++                                                                     Order of gain values corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
++    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
++                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
++    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
++    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
++    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
++    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
++    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
++    float manual_convergence_time;                              /*!< Mandatory. Manual AEC convergence speed in seconds.
++                                                                     -1.0 if NA (uses tunings).
++                                                                     0.0  means convergence filters are bypassed, this is similar behavior as in previous API when using frame_use still
++                                                                     > 0.0  Overrides convergence speed from tunings. */
++} ia_aiq_ae_input_params_v1;
++
++/*!
++ * \brief AEC calculation based on input parameters and frame statistics.
++ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] ae_input_params       Mandatory.\n
++ *                                  Input parameters for AEC calculations.
++ * \param[out] ae_results           Mandatory.\n
++ *                                  Pointer's pointer where address of ISP parameters are stored.
++ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_ae_run_v1(ia_aiq *ia_aiq,
++              const ia_aiq_ae_input_params_v1 *ae_input_params,
++              ia_aiq_ae_results **ae_results);
++
++/*!
++* \brief Get the AEC calculated histograms.
++* AE calculates histograms from the RGBS grid.
++*
++* \param[in] ia_aiq                Mandatory.\n
++*                                  AIQ instance handle.
++* \return                          Pointer to the calculated histograms.
++*/
++LIBEXPORT ia_aiq_histogram *
++ia_aiq_get_histograms_v1(ia_aiq *ia_aiq, unsigned int a_exposure_index);
++
++/*!
++ *  \brief Input parameter structure for AF algorithm.
++ */
++typedef struct
++{
++    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AF calculations (Preview, Still, video etc.). */
++    int lens_position;                                          /*!< Mandatory. Current lens position. */
++    unsigned long long lens_movement_start_timestamp;           /*!< Mandatory. Lens movement start timestamp in us. Timestamp is compared against statistics timestamp
++                                                                     to determine if lens was moving during statistics collection. */
++    ia_aiq_af_operation_mode focus_mode;                        /*!< Mandatory. Focusing mode. */
++    ia_aiq_af_range focus_range;                                /*!< Mandatory. Focusing range. Only valid when focus_mode is ia_aiq_af_operation_mode_auto. */
++    ia_aiq_af_metering_mode focus_metering_mode;                /*!< Mandatory. Metering mode (multispot, touch). */
++    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. User setting for flash. */
++    ia_rectangle *focus_rect;                                   /*!< Optional. */
++    ia_aiq_manual_focus_parameters *manual_focus_parameters;    /*!< Optional. Manual focus parameters (manual lens position, manual focusing distance). Used only if
++                                                                     focus mode 'ia_aiq_af_operation_mode_manual' is used. */
++    bool trigger_new_search;                                    /*!< TRUE if new AF search is needed, FALSE otherwise. Host is responsible for flag cleaning. */
++} ia_aiq_af_input_params;
++
++/*!
++ * \brief AF calculation based on input parameters and frame statistics.
++ * AF calculates new lens position based on statistics and given input parameters.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] af_input_params       Mandatory.\n
++ *                                  Input parameters for AF calculations.
++ * \param[out] af_results           Mandatory.\n
++ *                                  Pointer's pointer where address of AF results are stored.
++ *                                  Results from AF calculations.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_af_run(ia_aiq *ia_aiq,
++              const ia_aiq_af_input_params *af_input_params,
++              ia_aiq_af_results **af_results);
++
++/*!
++ *  \brief Input parameter structure for AWB algorithm.
++ */
++typedef struct
++{
++    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
++    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
++    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
++    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
++} ia_aiq_awb_input_params_v1;
++
++/*!
++ * \brief AWB calculation based on input parameters and frame statistics.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] awb_input_params      Mandatory.\n
++ *                                  Input parameters for AWB calculations.
++ * \param[out] awb_results          Mandatory.\n
++ *                                  Pointer's pointer where address of AWB results are stored.
++ *                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_awb_run_v1(ia_aiq *ia_aiq,
++                  const ia_aiq_awb_input_params_v1 *awb_input_params,
++                  ia_aiq_awb_results **awb_results);
++
++
++/*!
++ *  \brief Input parameter structure for GBCE algorithm.
++ */
++typedef struct
++{
++    ia_aiq_gbce_level gbce_level;           /*!< Mandatory. GBCE level. -1 to use tuning defaults.*/
++    ia_aiq_tone_map_level tone_map_level;   /*!< Mandatory. Tone Map level. -1 to use tuning defaults.*/
++    ia_aiq_frame_use frame_use;             /*!< Deprecated. Not used. */
++    float ev_shift;                         /*!< Optional. Exposure Value shift [-4,4]. */
++} ia_aiq_gbce_input_params;
++
++/*!
++ * \brief GBCE calculation based on input parameters and frame statistics.
++ * Computes gamma
++ *
++ * \param[in] ia_aiq                        Mandatory.\n
++ *                                          AIQ instance handle.
++ * \param[in] gbce_input_params             Mandatory.\n
++ *                                          Input parameters for GBCE calculations.
++ * \param[out] gbce_results                 Mandatory.\n
++ *                                          Pointer's pointer where address of GBCE results are stored.
++ *                                          Results contain GBCE Gamma table. Results can be used directly as input for AIC.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_gbce_run(ia_aiq *ia_aiq,
++                const ia_aiq_gbce_input_params *gbce_input_params,
++                ia_aiq_gbce_results **gbce_results);
++
++/*!
++ *  \brief Input parameter structure for DSD algorithm.
++ */
++typedef struct
++{
++    ia_aiq_af_results *af_results;     /*!< Mandatory although function will not return error, if not given.
++                                            DSD will not return all scene modes, if not given. */
++    ia_aiq_scene_mode scene_modes_selection;  /*!<configure which scene modes should be detected by DSD*/
++} ia_aiq_dsd_input_params;
++
++/*!
++ * \brief DSD based on statistics analysis.
++ * Determine scene (DSD) the given image.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] dsd_input_params      Mandatory.\n
++ *                                  Input parameters for DSD calculations.
++ * \param[out] dsd_scene            Mandatory.\n
++ *                                  Detected scene mode.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_dsd_run(ia_aiq *ia_aiq,
++               const ia_aiq_dsd_input_params *dsd_input_params,
++               ia_aiq_scene_mode *dsd_scene);
++
++/*!
++*  \brief Input parameter structure for Parameter adaptor.
++*/
++typedef struct ia_aiq_pa_input_params
++{
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    ia_aiq_exposure_parameters *exposure_params;     /*!< Mandatory. Analog gain and exposure time. */
++    ia_aiq_color_channels *color_gains;              /*!< Optional. RGB gains for each color channels. These gain will be applied on top of RGB gains calculated from WB results. */
++} ia_aiq_pa_input_params;
++
++/*!
++* \brief Parameter adaptor calculations for the next frame.
++* Compute generic parameters (Color Correction Matrix and Black Level Correction),
++* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
++* These generic results are converted to ISP specific parameters by ia_isp component.
++*
++* \param[in] ia_aiq                Mandatory.\n
++*                                  AIQ instance handle.
++* \param[in] pa_input_params       Mandatory.\n
++*                                  Input parameters for PA calculations.
++* \param[out] pa_results           Mandatory.\n
++*                                  Pointer's pointer where address of parameter adaptor results are stored.
++
++* \return                          Error code.
++*/
++LIBEXPORT ia_err
++ia_aiq_pa_run_v1(ia_aiq *ia_aiq,
++               const ia_aiq_pa_input_params *pa_input_params,
++               ia_aiq_pa_results_v1 **pa_results);
++
++/*!
++ * \brief Shading Adaptor calculations for the next frame.
++ * Compute shading correction parameters.
++ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
++ * These generic results are converted to ISP specific parameters by ia_isp component.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] sa_input_params       Mandatory.\n
++ *                                  Input parameters for SA calculations.
++ * \param[out] sa_results           Mandatory.\n
++ *                                  Pointer's pointer where address of shading adaptor results are stored.
++
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_sa_run_v2(ia_aiq *ia_aiq,
++               const ia_aiq_sa_input_params_v1 *sa_input_params,
++               ia_aiq_sa_results_v1 **sa_results);
++
++/*!
++ *  \brief Input parameter structure for setting the statistics.
++ */
++typedef struct
++{
++    unsigned long long frame_id;                                /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
++    unsigned long long frame_timestamp;                         /*!< Mandatory although function will not return error, if not given.
++                                                                     Start of frame timestamp in microseconds. This value is used in conjunction with timestamps
++                                                                     provided in the AIQ algorithms function calls to calculate the convergence
++                                                                     speed of AIQ algorithms.
++                                                                     AEC, AWB and AF will not converge, if not given. */
++    const ia_aiq_ae_results *frame_ae_parameters;               /*!< Mandatory although function will not return error, if not given.
++                                                                     Exposure results from AEC which were used to capture this frame.
++                                                                     AEC depends on this parameters. AEC will return cold start values if not given.*/
++    const ia_aiq_af_results *frame_af_parameters;               /*!< Mandatory although function will not return error, if not given.
++                                                                     Focus results from AF which were used to capture this frame.
++                                                                     AEC with AF assist light and flash usage in macro functionalities depend on these parameters. */
++    const ia_aiq_rgbs_grid **rgbs_grids;                        /*!< Mandatory. Almost all AIQ algorithms require RGBS grid statistics. */
++    unsigned int num_rgbs_grids;                                /*!< The number of RGBS grids. */
++    const ia_aiq_hdr_rgbs_grid* hdr_rgbs_grid;                  /*!< Optional. HDR statistics grid. */
++    const ia_aiq_af_grid **af_grids;                            /*!< Mandatory although function will not return error, if not given.
++                                                                     AF will return a NULL pointer, if not given.
++                                                                     DSD will not return all scene modes, if not given. */
++    unsigned int num_af_grids;                                  /*!< The number of AF grids. */
++    const ia_aiq_histogram **external_histograms;               /*!< Optional. If ISP calculates histogram, if can be given. If external histogram is not given,
++                                                                     AIQ internally calculates the histogram from the RGBS grid statistics and given AWB parameters. */
++    unsigned int num_external_histograms;                       /*!< The number of external histograms. */
++    const ia_aiq_pa_results_v1 *frame_pa_parameters;               /*!< Optional (Mandatory if external_histogram is not given).
++                                                                     AWB results used in the frame from where the statistics are collected.
++                                                                     GBCE will give default gamma table if external histogram or AWB results are not available. */
++    const ia_atbx_face_state *faces;                            /*!< Mandatory although function will not return error, if not given.
++                                                                     Face coordinates from external face detector.
++                                                                     DSD will not return all scene modes, if not given.
++                                                                     AWB will not take face information into account, if not given. */
++    ia_aiq_camera_orientation camera_orientation;               /*!< The orientation of the camera. Currently unused. */
++
++    const ia_aiq_awb_results *awb_results;                      /*!< Optional. Estimated AWB results from the previous run of AWB */
++    const ia_aiq_sa_results_v1 *frame_sa_parameters;            /*!< Optional. LSC results used in the frame for statistics collected. */
++    const ia_aiq_depth_grid **depth_grids;                      /*!< Optional. Depth grid statistics */
++    unsigned int num_depth_grids;                               /*!< Optional. Number of depth grid statistics */
++    const ia_aiq_grid *ir_grid;                                 /*!< Optional. Ir grid statistics, if available. */
++} ia_aiq_statistics_input_params_v4;
++
++/*!
++ * \brief Set input statistics and information about the captured image.
++ * AIQ algorithms need various information about the conditions in which the frame and statistics were captured in order to
++ * calculate new parameters.
++ *
++ * \param[in] ia_aiq                        Mandatory.\n
++ *                                          AIQ instance handle.
++ * \param[in] statistics_input_params       Mandatory.\n
++ *                                          Input parameters containing statistics and information about a frame.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_statistics_set_v4(ia_aiq *ia_aiq,
++    const ia_aiq_statistics_input_params_v4 *statistics_input_params);
++
++/*!
++ * \brief Focus bracketing parameters.
++ */
++typedef struct
++{
++    unsigned char focus_positions;                     /*!< Number of focus positions */
++    ia_aiq_af_results af_results;                      /*!< Autofocus results */
++    ia_aiq_af_bracket_mode af_bracket_mode;            /*!< Focus bracketing mode */
++} ia_aiq_af_bracket_input_params;
++
++/*!
++ * \brief Calculates the list of lens positions for focus bracketing.
++ *
++ * \param[in]  ia_aiq                       Mandatory.\n
++ *                                          AIQ instance handle.
++ * \param[in]  af_bracket_input_params      Mandatory.\n
++ *                                          Autofocus bracketing parameters.
++ * \param[out] af_bracket_results           Mandatory.\n
++ *                                          Pointer's pointer where address of focus bracketing results are stored.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_af_bracket(ia_aiq *ia_aiq,
++                  const ia_aiq_af_bracket_input_params *af_bracket_input_params,
++                  ia_aiq_af_bracket_results **af_bracket_results);
++
++/*!
++ * \param[in]  ia_aiq               Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[out] out_ia_aiq_data      Mandatory.\n
++ *                                  Contains various AIQ related information, collected during run-time and subject to
++ *                                  be stored in a host file system. Host will copy this data, if ia_aiq_data->size > 0
++ *                                  and ia_aiq_data->data != NULL; AIQ is responsible to deallocate data buffer
++ *                                  during ia_aiq_deinit().
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_get_aiqd_data(ia_aiq *ia_aiq,
++                ia_binary_data *out_ia_aiq_data);
++
++
++
++/*!
++* \brief Data from external sensors
++*/
++typedef struct
++{
++    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
++                                                                         Acceleration = Gravity + Linear Acceleration*/
++    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
++    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
++    unsigned int num_gravity_events;                                /*!< Number of gravity events */
++    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
++    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
++    ia_aiq_ambient_light_events_v1 *ambient_light_events;           /*!< The data holds information on the ambient light */
++    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
++    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
++    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
++} ia_aiq_sensor_events_v1;
++
++/*!
++ * \brief Set event statistics.
++ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
++ *
++ * \param[in] ia_aiq                        Mandatory.\n
++ *                                          AIQ instance handle.
++ * \param[in] sensor_events_input           Mandatory.\n
++ *                                          Sensor events input holds data from libsensorhub.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_sensor_events_set_v1(ia_aiq *ia_aiq,
++                            const ia_aiq_sensor_events_v1 *sensor_events_input);
++
++
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                                  Version string.
++ */
++LIBEXPORT const char* ia_aiq_get_version(void);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_AIQ_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
+new file mode 100644
+index 000000000000..ef0dfadec7ea
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
+@@ -0,0 +1,266 @@
++/*
++ * Copyright 2018-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_aiq_deprecated.h
++ * \brief Definitions and declarations of Intel 3A library.
++ */
++
++#ifndef _IA_AIQ_DEPRECATED_H_
++#define _IA_AIQ_DEPRECATED_H_
++
++#include "ia_aiq_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++  Forward declaration of struct declared in ia_aiq.h
++*/
++struct ia_aiq_pa_input_params;
++
++/*!
++* \brief Shading Adaptor results.
++*/
++typedef struct {
++    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
++    unsigned short width;                             /*!< Width of LSC grid. */
++    unsigned short height;                            /*!< Height of LSC grid. */
++    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
++    cmc_bayer_order color_order;                      /*!< Color channels order. */
++    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
++    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
++    float confidence;                                 /*!< Confidence in results. */
++    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
++} ia_aiq_sa_results;
++
++/*!
++* \brief Ambient Light EventsLIGHT_AMBIENTLIGHT
++* NOTE: This should always match to libsensorhub API
++*/
++typedef struct
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    float data;             /*!< Ambient Light data ? */
++    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++} ia_aiq_ambient_light_events;
++
++/*!
++* \brief Data from external sensors
++*/
++typedef struct
++{
++    ia_aiq_sensor_data *accelerometer_events;                       /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
++                                                                    Acceleration = Gravity + Linear Acceleration*/
++    unsigned int num_accelerometer_events;                          /*!< Number of accelerometer events */
++    ia_aiq_sensor_data *gravity_events;                             /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
++    unsigned int num_gravity_events;                                /*!< Number of gravity events */
++    ia_aiq_sensor_data *gyroscope_events;                           /*!< The data holds information on the angular velocity of the device in rad/sec */
++    unsigned int num_gyroscope_events;                              /*!< Number of gyroscope events */
++    ia_aiq_ambient_light_events *ambient_light_events;              /*!< The data holds information on the ambient light */
++    unsigned int num_ambient_light_events;                          /*!< Number of ambient light events */
++    ia_aiq_dmd_sensor_events *dmd_events;                           /*!< Device Movement Detector (DMD) virtual sensor */
++    unsigned int num_dmd_events;                                    /*!< Number of DMD sensor events */
++} ia_aiq_sensor_events;
++
++/*!
++* \brief Parameter adaptor calculations for the next frame.
++* Compute generic parameters (Color Correction Matrix and Black Level Correction),
++* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
++* These generic results are converted to ISP specific parameters by ia_isp component.
++*
++* \param[in] ia_aiq                Mandatory.\n
++*                                  AIQ instance handle.
++* \param[in] pa_input_params       Mandatory.\n
++*                                  Input parameters for PA calculations.
++* \param[out] pa_results           Mandatory.\n
++*                                  Pointer's pointer where address of parameter adaptor results are stored.
++
++* \return                          Error code.
++*/
++LIBEXPORT ia_err
++ia_aiq_pa_run(ia_aiq *ia_aiq,
++     const struct ia_aiq_pa_input_params *pa_input_params,
++     ia_aiq_pa_results **pa_results);
++
++/*!
++ * \brief Set event statistics.
++ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
++ *
++ * \param[in] ia_aiq                        Mandatory.\n
++ *                                          AIQ instance handle.
++ * \param[in] sensor_events_input           Mandatory.\n
++ *                                          Sensor events input holds data from libsensorhub.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_sensor_events_set(ia_aiq *ia_aiq, const ia_aiq_sensor_events *sensor_events_input);
++
++
++/*!
++ *  \brief Input parameter structure for AE algorithm.
++ */
++typedef struct
++{
++    unsigned int num_exposures;                                 /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
++    ia_aiq_frame_use frame_use;                                 /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
++    ia_aiq_flash_mode flash_mode;                               /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
++    ia_aiq_ae_operation_mode operation_mode;                    /*!< Mandatory. AEC operation mode. */
++    ia_aiq_ae_metering_mode metering_mode;                      /*!< Mandatory. AEC metering mode. */
++    ia_aiq_ae_priority_mode priority_mode;                      /*!< Mandatory. AEC priority mode. */
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode;         /*!< Mandatory. AEC flicker reduction mode. */
++    ia_aiq_exposure_sensor_descriptor *sensor_descriptor;       /*!< Mandatory although function will not return error, if not given.
++                                                                     Sensor specific descriptor and limits of the used sensor mode for target frame use.
++                                                                     AEC will not limit and calculate sensor specific parameters, if not given */
++    unsigned int num_sensor_descriptors;                        /*!< Mandatory. The number of sensor descriptors given in the above pointer.
++                                                                     Used to specify different sensor descriptors for each exposure. */
++    ia_rectangle *exposure_window;                              /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
++    ia_coordinate *exposure_coordinate;                         /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
++                                                                     AEC increases weight of given point in final AEC results. */
++    float ev_shift;                                             /*!< Optional. Exposure Value shift [-4,4]. */
++    long *manual_exposure_time_us;                              /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
++                                                                     of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
++    float *manual_analog_gain;                                  /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
++                                                                     Order of gain values corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
++    short *manual_iso;                                          /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
++                                                                     of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
++                                                                     e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
++    ia_aiq_ae_features *aec_features;                           /*!< Optional. AEC features in use when calculating new exposure parameters. */
++    ia_aiq_ae_manual_limits *manual_limits;                     /*!< Optional. Manual limits which override limits defined in AEC tunings. */
++    float manual_aperture_fn;                                   /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
++    ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
++    ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
++    float manual_convergence_time;                              /*!< Optional. Manual AEC convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
++} ia_aiq_ae_input_params;
++
++/*!
++ * \brief AEC calculation based on input parameters and frame statistics.
++ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
++ *
++ * \param[in] ia_aiq                Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] ae_input_params       Mandatory.\n
++ *                                  Input parameters for AEC calculations.
++ * \param[out] ae_results           Mandatory.\n
++ *                                  Pointer's pointer where address of ISP parameters are stored.
++ *                                  Results from AEC calculations. Results can be used directly as input for AIC.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_ae_run(ia_aiq *ia_aiq,
++              const ia_aiq_ae_input_params *ae_input_params,
++              ia_aiq_ae_results **ae_results);
++
++/*!
++* \brief Get the AEC calculated histograms.
++* AE calculates histograms from the RGBS grid.
++*
++* \param[in] ia_aiq                Mandatory.\n
++*                                  AIQ instance handle.
++* \return                          Pointer to the calculated histograms.
++*/
++LIBEXPORT ia_aiq_histogram *
++ia_aiq_get_histograms(ia_aiq *ia_aiq);
++
++/*
++ *  \brief Input parameter structure for Shading Adaptor. DEPRECATED
++ */
++typedef struct
++{
++    ia_aiq_frame_use frame_use;                      /*!< Mandatory. Target frame type of the AIC calculations (Preview, Still, video etc.). */
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++} ia_aiq_sa_input_params;
++
++/*!
++ * \brief Shading Adaptor calculations for the next frame.
++ * Compute shading correction parameters.
++ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
++ * These generic results are converted to ISP specific parameters by ia_isp component.
++ * DEPRECATED
++ *
++ * \param[in] a_ia_aiq_ptr          Mandatory.\n
++ *                                  AIQ instance handle.
++ * \param[in] a_sa_input_params     Mandatory.\n
++ *                                  Input parameters for SA calculations.
++ * \param[out] a_sa_results         Mandatory.\n
++ *                                  Pointer's pointer where address of shading adaptor results are stored.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_aiq_sa_run(ia_aiq *a_ia_aiq_ptr,
++                const ia_aiq_sa_input_params *a_sa_input_params,
++                ia_aiq_sa_results **a_sa_results);
++
++
++/*!
++* \brief Shading Adaptor calculations for the next frame.
++* Compute shading correction parameters.
++* which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
++* These generic results are converted to ISP specific parameters by ia_isp component.
++*
++* \param[in] a_ia_aiq_ptr          Mandatory.\n
++*                                  AIQ instance handle.
++* \param[in] a_sa_input_params     Mandatory.\n
++*                                  Input parameters for SA calculations.
++* \param[out] a_sa_results         Mandatory.\n
++*                                  Pointer's pointer where address of shading adaptor results are stored.
++* \return                          Error code.
++*/
++LIBEXPORT ia_err
++ia_aiq_sa_run_v1(ia_aiq *a_ia_aiq_ptr,
++                const ia_aiq_sa_input_params_v1 *a_sa_input_params,
++                ia_aiq_sa_results **a_sa_results);
++
++/*!
++*  \brief Input parameter structure for AWB algorithm.
++*/
++typedef struct
++{
++    ia_aiq_frame_use frame_use;                       /*!< Mandatory. Target frame type of the AWB calculations (Preview, Still, video etc.). */
++    ia_aiq_awb_operation_mode scene_mode;             /*!< Mandatory. AWB scene mode. */
++    ia_aiq_awb_manual_cct_range *manual_cct_range;    /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
++    ia_coordinate *manual_white_coordinate;           /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
++    float manual_convergence_time;                    /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
++} ia_aiq_awb_input_params;
++
++/*!
++* \brief AWB calculation based on input parameters and frame statistics.
++*
++* \param[in] ia_aiq                Mandatory.\n
++*                                  AIQ instance handle.
++* \param[in] awb_input_params      Mandatory.\n
++*                                  Input parameters for AWB calculations.
++* \param[out] awb_results          Mandatory.\n
++*                                  Pointer's pointer where address of AWB results are stored.
++*                                  Results from AWB calculations. Results can be used directly as input for ia_isp.
++* \return                          Error code.
++*/
++LIBEXPORT ia_err
++ia_aiq_awb_run(ia_aiq *ia_aiq,
++const ia_aiq_awb_input_params *awb_input_params,
++ia_aiq_awb_results **awb_results);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_AIQ_DEPRECATED_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
+new file mode 100644
+index 000000000000..797e90d136a8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
+@@ -0,0 +1,911 @@
++/*
++ * Copyright 2012-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_aiq_types.h
++ * \brief Definitions of input/output structures of the Intel 3A library.
++ */
++
++#ifndef _IA_AIQ_TYPES_H_
++#define _IA_AIQ_TYPES_H_
++
++#include "ia_types.h"
++#include "ia_cmc_types.h"
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define IA_AIQ_MAX_NUM_EXPOSURES 10
++
++/*!
++ * \brief Maximum number of sensor events supported by AIQ lib.
++ */
++#define IA_AIQ_MAX_NUMBER_OF_SENSOR_EVENTS 20
++
++typedef struct ia_aiq_t ia_aiq;
++
++/*!
++ * \brief Target (frame use) for the analysis algorithms calculations.
++ */
++typedef enum
++{
++    ia_aiq_frame_use_preview,
++    ia_aiq_frame_use_still,
++    ia_aiq_frame_use_continuous,
++    ia_aiq_frame_use_video,
++} ia_aiq_frame_use;
++
++/*!
++ * \brief Camera orientations.
++ */
++typedef enum
++{
++    ia_aiq_camera_orientation_unknown,      /*!< Orientation not known. */
++    ia_aiq_camera_orientation_rotate_0,     /*!< Non-rotated landscape. */
++    ia_aiq_camera_orientation_rotate_90,    /*!< Portrait i.e. rotated 90 degrees clockwise. */
++    ia_aiq_camera_orientation_rotate_180,   /*!< Landscape (upside down) i.e. rotated 180 degrees clockwise. */
++    ia_aiq_camera_orientation_rotate_270    /*!< Portrait (upside down) i.e. rotated 270 degrees clockwise. */
++} ia_aiq_camera_orientation;
++
++/*!
++ * \brief AEC flicker reduction modes.
++ */
++typedef enum
++{
++    ia_aiq_ae_flicker_reduction_off,     /*!< Disables flicker detection and reduction. */
++    ia_aiq_ae_flicker_reduction_50hz,    /*!< Manual flicker reduction for 50Hz mains frequency. */
++    ia_aiq_ae_flicker_reduction_60hz,    /*!< Manual flicker reduction for 60Hz mains frequency. */
++    ia_aiq_ae_flicker_reduction_auto,    /*!< Detects flicker frequency and applies detected reduction. */
++    ia_aiq_ae_flicker_reduction_detect,  /*!< Detects only flicker frequency but doesn't apply reduction. */
++} ia_aiq_ae_flicker_reduction;
++
++/*!
++ * \brief AEC operation modes.
++ */
++typedef enum {
++    ia_aiq_ae_operation_mode_automatic,         /*!< Automatic mode. */
++    ia_aiq_ae_operation_mode_long_exposure,     /*!< AEC produces exposure parameters with long exposure (low light & static) scene. */
++    ia_aiq_ae_operation_mode_action,            /*!< AEC produces exposure parameters for fast moving scene. */
++    ia_aiq_ae_operation_mode_video_conference,  /*!< AEC produces exposure parameters which can be used in video conferencing scene. */
++    ia_aiq_ae_operation_mode_production_test,   /*!< AEC produces exposure parameters which are used in production test environment. */
++    ia_aiq_ae_operation_mode_ultra_low_light,   /*!< AEC produces exposure parameters which are used in ultra low light scene. */
++    ia_aiq_ae_operation_mode_fireworks,         /*!< AEC produces exposure parameters which are used in fireworks scene. */
++    ia_aiq_ae_operation_mode_hdr,               /*!< AEC produces exposure parameters which are used for HDR imaging (vHDR or exposure bracketing). */
++    ia_aiq_ae_operation_mode_custom_1,          /*!< AEC produces exposure parameters for a specialized custom scene 1. */
++    ia_aiq_ae_operation_mode_custom_2,          /*!< AEC produces exposure parameters for a specialized custom scene 2. */
++    ia_aiq_ae_operation_mode_custom_3,          /*!< AEC produces exposure parameters for a specialized custom scene 3. */
++} ia_aiq_ae_operation_mode;
++
++/*!
++ * \brief AEC metering modes.
++ */
++typedef enum {
++    ia_aiq_ae_metering_mode_evaluative,  /*!< Exposure is evaluated from the whole frame. */
++    ia_aiq_ae_metering_mode_center,      /*!< Exposure is evaluated center weighted. */
++} ia_aiq_ae_metering_mode;
++
++/*!
++ * \brief AEC priority modes.
++ */
++typedef enum {
++    ia_aiq_ae_priority_mode_normal,    /*!< All areas are equally important. */
++    ia_aiq_ae_priority_mode_highlight, /*!< Highlights must be preserved even if it means that dark parts become very dark. */
++    ia_aiq_ae_priority_mode_shadow,    /*!< Shadow areas are more important. */
++} ia_aiq_ae_priority_mode;
++
++/*!
++ * \brief Manual AEC limit parameters.
++ */
++typedef struct
++{
++    int manual_exposure_time_min;             /*!< Optional. Minimum exposure time in microseconds. -1 if NA. */
++    int manual_exposure_time_max;             /*!< Optional. Maximum exposure time in microseconds. -1 if NA. */
++    int manual_frame_time_us_min;             /*!< Optional. Manual minimum frame length in microseconds. Defines maximum frame rate -1 if NA. */
++    int manual_frame_time_us_max;             /*!< Optional. Manual maximum frame length in microseconds. Defines minimum frame rate. -1 if NA. */
++    int manual_iso_min;                       /*!< Optional. Manual minimum ISO. -1 if NA. */
++    int manual_iso_max;                       /*!< Optional. Manual maximum ISO. -1 if NA. */
++} ia_aiq_ae_manual_limits;
++
++/*!
++ * \brief AEC exposure distribution priority modes
++ *
++ * This enumeration values are used to control distribution of AEC exposure parameters. For example in some situation user may want to keep
++ * aperture at smallest value (in order to have large DOF) as long as possible in expense of motion blur (caused by long exposure time) and
++ * noise (caused by high ISO).
++ *
++ * Note. Manual priority modes as understood by SLRs are achieved by using manual exposure parameters when running AEC:
++ * Shutter priority: Set manual_exposure_time_us in ia_aiq_ae_input_params.
++ * ISO priority: Set manual_iso in ia_aiq_ae_input_params.
++ * Aperture priority: Set manual_aperture_fn in ia_aiq_ae_input_params.
++ */
++typedef enum
++{
++    ia_aiq_ae_exposure_distribution_auto,     /*!< AEC internally prioritizes between exposure time, aperture and ISO when calculating distribution. */
++    ia_aiq_ae_exposure_distribution_shutter,  /*!< AEC tries to keep the exposure time at minimum until ISO and aperture are at maximum. */
++    ia_aiq_ae_exposure_distribution_iso,      /*!< AEC tries to keep the ISO at minimum until exposure time and aperture are at maximum. */
++    ia_aiq_ae_exposure_distribution_aperture, /*!< AEC tries to keep the aperture at minimum until exposure time and ISO are at maximum. */
++} ia_aiq_ae_exposure_distribution_priority;
++
++/*!
++ * \brief AEC feature setting.
++ */
++typedef enum {
++    ia_aiq_ae_feature_setting_tuning,     /*!< Feature setting is taken from tuning data. */
++    ia_aiq_ae_feature_setting_disabled,   /*!< Feature setting is disabled. */
++    ia_aiq_ae_feature_setting_enabled,    /*!< Feature setting is enabled. */
++} ia_aiq_ae_feature_setting;
++
++
++/*!
++ * \brief Autofocus states
++ */
++typedef enum
++{
++    ia_aiq_af_status_idle,               /*!< Focus is idle */
++    ia_aiq_af_status_local_search,       /*!< Focus is in local search state */
++    ia_aiq_af_status_extended_search,    /*!< Focus is in extended search state */
++    ia_aiq_af_status_success,            /*!< Focus has succeeded */
++    ia_aiq_af_status_fail,               /*!< Focus has failed */
++    ia_aiq_af_status_depth_search        /*!< Focus in depth search mode */
++} ia_aiq_af_status;
++
++/*!
++ * \brief Action for the lens driver
++ */
++typedef enum
++{
++    ia_aiq_lens_driver_action_none,
++    ia_aiq_lens_driver_action_move_to_unit,
++    ia_aiq_lens_driver_action_move_by_units
++} ia_aiq_lens_driver_action;
++
++/*!
++ * \brief Autofocus modes
++ */
++typedef enum
++{
++    ia_aiq_af_operation_mode_auto,                 /*!< Auto mode */
++    ia_aiq_af_operation_mode_infinity,             /*!< Inifinity mode */
++    ia_aiq_af_operation_mode_hyperfocal,           /*!< Hyperfocal mode */
++    ia_aiq_af_operation_mode_manual,               /*!< Manual mode */
++    ia_aiq_af_operation_mode_production_test,      /*!< Production test mode. */
++    ia_aiq_af_operation_mode_depth_map,            /*!< Depth-map generation mode. */
++    ia_aiq_af_operation_mode_depth,                /*!< Automatic focusing based on depth measurements only. */
++    ia_aiq_af_operation_mode_contrast              /*!< Automatic focusing based on contrast measurements only. */
++} ia_aiq_af_operation_mode;
++
++/*!
++ * \brief Autofocus range
++ */
++typedef enum
++{
++    ia_aiq_af_range_normal,                        /*!< Normal range */
++    ia_aiq_af_range_macro,                         /*!< Macro range */
++    ia_aiq_af_range_extended,                      /*!< Extended/full range */
++} ia_aiq_af_range;
++
++
++/*!
++ * \brief Autofocus metering modes
++ */
++typedef enum
++{
++    ia_aiq_af_metering_mode_auto,                      /*!< Auto metering mode */
++    ia_aiq_af_metering_mode_touch                      /*!< Touch metering mode */
++} ia_aiq_af_metering_mode;
++
++/*!
++ * \brief Lens actuator status
++ */
++typedef enum
++{
++    ia_aiq_lens_status_stopped,                    /*!< Lens has not moved during the frame integration*/
++    ia_aiq_lens_status_moving                      /*!< Lens has been moving during the frame integration */
++} ia_aiq_lens_status;
++
++/*!
++ * \brief Action for the manual focus
++ */
++typedef enum
++{
++    ia_aiq_manual_focus_action_none,                /*!< No action for the manual focus is required */
++    ia_aiq_manual_focus_action_set_distance,        /*!< Set manual focus distance */
++    ia_aiq_manual_focus_action_set_lens_position,   /*!< Set manual lens position */
++    ia_aiq_manual_focus_action_set_focal_distance   /*!< Set manual focal distance in um (distance between the lens and the sensor plane, e.g. 4390) */
++} ia_aiq_manual_focus_action;
++
++/*!
++ * \brief Focus bracketing mode.
++ */
++typedef enum
++{
++    ia_aiq_af_bracket_mode_symmetric,        /*!< Symmetric focus bracketing around the reference lens position*/
++    ia_aiq_af_bracket_mode_towards_near,     /*!< One side focus bracketing. Images are taken towards NEAR end (macro) */
++    ia_aiq_af_bracket_mode_towards_far       /*!< One side focus bracketing. Images are taken towards FAR end (infinity)*/
++} ia_aiq_af_bracket_mode;
++
++/*!
++ * \brief Detected scene mode.
++ */
++typedef enum
++{
++    ia_aiq_scene_mode_none                = 0,
++    ia_aiq_scene_mode_close_up_portrait   = (1 << 0),
++    ia_aiq_scene_mode_portrait            = (1 << 1),
++    ia_aiq_scene_mode_lowlight_portrait   = (1 << 2),
++    ia_aiq_scene_mode_low_light           = (1 << 3),
++    ia_aiq_scene_mode_action              = (1 << 4),
++    ia_aiq_scene_mode_backlight           = (1 << 5),
++    ia_aiq_scene_mode_landscape           = (1 << 6),
++    ia_aiq_scene_mode_document            = (1 << 7),
++    ia_aiq_scene_mode_firework            = (1 << 8),
++    ia_aiq_scene_mode_lowlight_action     = (1 << 9),
++    ia_aiq_scene_mode_baby                = (1 << 10),
++    ia_aiq_scene_mode_barcode             = (1 << 11)
++} ia_aiq_scene_mode;
++
++/*!
++* \brief Mode for calculating AE bracketing.
++*/
++typedef enum
++{
++    ia_aiq_bracket_mode_none,             /*!< No bracketing used. */
++    ia_aiq_bracket_mode_ull  = (1 << 0),  /*!< Ultra Low Light bracketing used. */
++    ia_aiq_bracket_mode_hdr  = (1 << 1)   /*!< High Dynamic Range bracketing used. */
++} ia_aiq_bracket_mode;
++
++/*!
++ * \brief Manual focus parameters.
++ */
++typedef struct
++{
++    unsigned int manual_focus_distance;               /*!< Manual focus distance in mm*/
++    int manual_lens_position;                         /*!< Manual lens position */
++    unsigned int manual_focal_distance;               /*!< Manual focal_distance in um (e.g. 4390) */
++    ia_aiq_manual_focus_action manual_focus_action;   /*!< Manual focus action */
++} ia_aiq_manual_focus_parameters;
++
++/*!
++ *  Gain structure defining gain value and type.
++ */
++typedef struct
++{
++    cmc_gain_type_t type;       /*!< Gain type (analog, digital, etc.). */
++    float value;                /*!< Gain value as a multiplier (e.g. 1.0). */
++} ia_aiq_gain;
++
++/*!
++ * \brief Exposure parameters in terms of generic units.
++ * Structure can be used as input or output from AEC.
++ */
++typedef struct
++{
++    unsigned int exposure_time_us;          /*!< Exposure time in microseconds, -1 if N/A. */
++    float analog_gain;                      /*!< Deprecated. Analog gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
++    float digital_gain;                     /*!< Deprecated. Digital gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
++    float aperture_fn;                      /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. TODO: Move to ia_aiq_aperture_control structure. */
++    unsigned int total_target_exposure;     /*!< Total exposure ie. combination of ET, gains, Aperture gain and ND gain, -1 if N/A. */
++    bool nd_filter_enabled;                 /*!< true or false, false for N/A. */
++    int iso;                                /*!< ISO value corresponding to the analog gain. -1 if N/A. */
++    ia_aiq_gain gains[IA_CMC_GAINS_MAX_NUM];       /*!< Gain as multipliers (e.g. 1.0), -1.0f if N/A. */
++    unsigned int num_gains;                 /*!< The number of gains. */
++} ia_aiq_exposure_parameters;
++
++/*!
++ * \brief Exposure parameters in terms of sensor units.
++ * Structure can be used as input or output from AEC.
++ */
++typedef struct
++{
++    unsigned short fine_integration_time;         /*!< Integration time specified as a number of pixel clocks added on top of coarse_integration_time. */
++    unsigned short coarse_integration_time;       /*!< Integration time specified in multiples of pixel_periods_per_line.*/
++    unsigned short analog_gain_code_global;       /*!< Global analog gain code. */
++    unsigned short digital_gain_global;           /*!< Global digital gain code. */
++    unsigned short line_length_pixels;            /*!< The number of pixels in one row. This includes visible lines and horizontal blanking lines. */
++    unsigned short frame_length_lines;            /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
++    unsigned short gain_codes[IA_CMC_GAINS_MAX_NUM];     /*!< Global gain codes. */
++} ia_aiq_exposure_sensor_parameters;
++
++/*!
++ * \brief Exposure related restrictions and constants in terms of sensor units.
++ * Camera driver fills and updates these parameters whenever they are changed (for example in mode change).
++ */
++typedef struct
++{
++    float pixel_clock_freq_mhz;                        /*!< Video timing pixel clock frequency. */
++    unsigned short pixel_periods_per_line;             /*!< The number of pixel clock periods in one line (row) time. This includes visible pixels and horizontal blanking time. */
++    unsigned short line_periods_per_field;             /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
++    unsigned short line_periods_vertical_blanking;     /*!< Number of vertical blanking lines. Visible lines can be calculated using this and line_periods_per_field (above) value. */
++    unsigned short fine_integration_time_min;          /*!< The minimum allowed value for fine_integration_time in AEC outputs. */
++    unsigned short fine_integration_time_max_margin;   /*!< fine_integration_time_max = pixel_periods_per_line - fine_integration_time_max_margin. */
++    unsigned short coarse_integration_time_min;        /*!< The minimum allowed value for coarse_integration_time in AEC outputs. */
++    unsigned short coarse_integration_time_max_margin; /*!< coarse_integration_time_max = line_periods_per_field - coarse_integration_time_max_margin */
++    bool is_mono_ir_sensor;                                /*!< Judge if it is IR sensor, 1: IR sensor, 0: others*/
++} ia_aiq_exposure_sensor_descriptor;
++
++/*!
++ * AEC features.
++ * Parameters for enabling/disabling AEC features. Setting ia_aiq_ae_feature_setting_tuning takes feature definitions from CPF.
++ */
++typedef struct {
++
++    ia_aiq_ae_feature_setting motion_blur_control;          /*!< AEC modifies exposure time/analog gain ratio based on movement in the image. */
++    ia_aiq_ae_feature_setting backlight_compensation;       /*!< AEC analyzes and modifies exposure parameters based on backlight detection algorithm. */
++    ia_aiq_ae_feature_setting face_utilization;             /*!< AEC uses face coordinates in exposure calculations for next frame. */
++    ia_aiq_ae_feature_setting red_eye_reduction_flash;      /*!< AEC will propose flashes before pre-flashes to reduce red eye effect. */
++    ia_aiq_ae_feature_setting fill_in_flash;                /*!< AEC will propose flash in back light situations, where target is close enough. */
++    ia_aiq_ae_feature_setting continuous_flicker_detection; /*!< AEC runs the flicker detection algorithm continuously in the VF */
++} ia_aiq_ae_features;
++
++
++/*!
++ * \brief Flash modes from the user.
++ */
++typedef enum
++{
++    ia_aiq_flash_mode_auto,
++    ia_aiq_flash_mode_on,
++    ia_aiq_flash_mode_off,
++} ia_aiq_flash_mode;
++
++/*!
++ * \brief Flash status.
++ */
++typedef enum
++{
++    ia_aiq_flash_status_no,                /*!< No flash use. */
++    ia_aiq_flash_status_torch,             /*!< Torch flash use. */
++    ia_aiq_flash_status_pre,               /*!< Pre-flash use. */
++    ia_aiq_flash_status_main,              /*!< Main flash use. */
++    ia_aiq_flash_status_red_eye_reduction, /*!< Red Eye Reduction flash use. */
++} ia_aiq_flash_status;
++
++/*!
++ * \brief Depth data type.
++ */
++typedef enum
++{
++    ia_aiq_depth_data_type_vcm,     /*!< VCM units */
++    ia_aiq_depth_data_type_mm,      /*!< Distance to the object in mm */
++} ia_aiq_depth_data_type;
++
++/*!
++ * \brief Flash parameters.
++ * Structure can be used as input or output from AEC.
++ */
++typedef struct
++{
++    ia_aiq_flash_status status;  /*!< Flash status. */
++    char power_prc;              /*!< Flash power [0,100] value range maps 0% to 100%, 0 if off. */
++} ia_aiq_flash_parameters;
++
++
++/*!
++ * \brief Grid for weighted histograms.
++ * Pixel values of certain area can be weighted differently based of specified grid.
++ * Weight grid should be passed and used by the component which is calculating the histograms from the frame data. If no pixel accurate
++ * histograms are calculated, the weight map should be given back to AIQ library along with the statistics so that AIQ library can
++ * calculate the weighted histograms itself from the RGBS statistics.
++ * This structure is output as part of AEC results but it can be replaced with custom weight map.
++ */
++typedef struct
++{
++    unsigned short width;   /*!< Width of the weight grid. */
++    unsigned short height;  /*!< Height of the weight grid. */
++    unsigned char *weights; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
++} ia_aiq_hist_weight_grid;
++
++/*!
++ * \brief Histogram.
++ * AIQ uses internally histogram, which are calculated from RGBS statistics:
++ * - "RAW" frame data i.e. RGBS statistics (corrected BLC + LSC).
++ * - "Color corrected" frame data (corrected BLC + LSC + CCM + WB)
++ * - "Color corrected and weighted" frame data (corrected BLC + LSC + CCM + WB + Weight Map)
++ * If histograms are calculated outside AIQ from frame pixel data (more accurate), it is expected to be "Color corrected and weighted".
++ * Size of histogram data arrays behind the pointers depends on value of num_bins variable in the structure.
++ */
++typedef struct
++{
++    unsigned int num_bins;            /*!< Number of histogram bins. */
++    unsigned int *r;                  /*!< R histogram. */
++    unsigned int *g;                  /*!< G (both Gr and Gb values) histogram. */
++    unsigned int *b;                  /*!< B histogram. */
++    unsigned int *rgb;                /*!< Combined RGB histogram (all pixel values of R, G and B together) TODO: Remove?. Used in percentile calculation but if GW AWB is done always, the same values are calculated. */
++    unsigned int *rgb_ch;             /*!< RGB channel-independent histogram where all channels are treated as grayscale intensities and combined into one histogram. */
++    unsigned int *y;                  /*!< Luminance histogram. */
++    unsigned int num_r_elements;      /*!< Number of elements in the R histogram. */
++    unsigned int num_g_elements;      /*!< Number of elements in the G histogram. */
++    unsigned int num_b_elements;      /*!< Number of elements in the B histogram. */
++    unsigned int num_rgb_elements;    /*!< Number of elements in the combined RGB histogram. */
++    unsigned int num_rgb_ch_elements; /*!< Number of elements in the RGB channel-independent histogram. */
++    unsigned int num_y_elements;      /*!< Number of elements in the luminance histogram. */
++} ia_aiq_histogram;
++
++/*!
++ * \brief Grid block
++ * As defined in the AIQ statistics specification.
++ * Ranges of all parameters are [0, 255].
++ */
++typedef struct
++{
++    unsigned char avg_gr; /*!< Average Gr value in the grid. */
++    unsigned char avg_r;  /*!< Average R value in the grid. */
++    unsigned char avg_b;  /*!< Average B value in the grid. */
++    unsigned char avg_gb; /*!< Average Gb value in the grid. */
++    unsigned char sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
++} rgbs_grid_block;
++
++/*!
++ * \brief R, G, B and Saturation grid block.
++ * As defined in the AIQ statistics specification.
++ * RGBS grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    rgbs_grid_block *blocks_ptr;  /*!< RGBS blocks. */
++    unsigned short grid_width;    /*!< Grid width. */
++    unsigned short grid_height;   /*!< Grid height. */
++    bool shading_correction;      /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
++} ia_aiq_rgbs_grid;
++
++/*!
++* \brief Generic grid structure.
++*/
++typedef struct
++{
++    unsigned short *data;       /*!< Data of size width * height. */
++    unsigned short width;       /*!< Grid width. */
++    unsigned short height;      /*!< Grid height. */
++    float i_per_y;
++    float out_ir_compgain_isp;
++} ia_aiq_grid;
++
++/*!
++ * \brief Grid block for 32-bit HDR.
++ * As defined in the AIQ statistics specification.
++ * Ranges of all parameters are [0, 255].
++ */
++typedef struct
++{
++    unsigned int avg_gr; /*!< Average Gr value in the grid. */
++    unsigned int avg_r;  /*!< Average R value in the grid. */
++    unsigned int avg_b;  /*!< Average B value in the grid. */
++    unsigned int avg_gb; /*!< Average Gb value in the grid. */
++    unsigned int sat;    /*!< Percentage of saturated pixels in the block [0, 255]. */
++} hdr_rgbs_grid_block;
++
++/*!
++ * \brief R, G, B and Saturation grid block for 32-bit HDR statistics.
++ * As defined in the AIQ statistics specification.
++ * HDR RGBS grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    hdr_rgbs_grid_block *blocks_ptr;    /*!< HDR RGBS blocks. */
++    unsigned int grid_width;            /*!< Grid width. */
++    unsigned int grid_height;           /*!< Grid height. */
++    unsigned int grid_data_bit_depth;   /*!< Bit depth of data in channel data. */
++    bool shading_correction;            /*!< Flag indicating if statistics was calculated using lens shading corrected data. */
++} ia_aiq_hdr_rgbs_grid;
++
++/*!
++ * \brief AF statistics
++ * As defined in the AIQ statistics specification.
++ * AF grid covers the full Field Of View (FOV) of the sensor.
++ */
++typedef struct
++{
++    unsigned short grid_width;    /*!< Number of block elements horizontally in a grid. */
++    unsigned short grid_height;   /*!< Number of block elements vertically in a grid. */
++    unsigned short block_width;   /*!< Block width (bq per block element). */
++    unsigned short block_height;  /*!< Block height (bq per grid element). */
++    int *filter_response_1;       /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
++    int *filter_response_2;       /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
++} ia_aiq_af_grid;
++
++/*!
++ * \brief Depth grid statistics
++ */
++typedef struct
++{
++    ia_aiq_depth_data_type type;          /*!< Data type (VCM units/mm)*/
++    ia_rectangle *grid_rect;              /*!< ROI for the grid */
++    int *depth_data;                      /*!< Depth data (type of data is defined by ia_aiq_depth_data_type) */
++    unsigned char *confidence;            /*!< Confidence level */
++    unsigned short grid_width;            /*!< Number of grid elements horizontally */
++    unsigned short grid_height;           /*!< Number of grid elements vertically */
++} ia_aiq_depth_grid;
++
++/*!
++ * \brief AWB scene modes
++ * Used in AWB as input to restrict White Point between certain CCT range.
++ * Note that not in all cases only CCT range is used to restrict White Point but more intelligent estimation may be used.
++ */
++typedef enum
++{
++    ia_aiq_awb_operation_mode_auto,
++    ia_aiq_awb_operation_mode_daylight,           /*!< Restrict CCT range to [5000, 7000]. */
++    ia_aiq_awb_operation_mode_partly_overcast,    /*!< Restrict CCT range to [5500, 9000]. */
++    ia_aiq_awb_operation_mode_fully_overcast,     /*!< Restrict CCT range to [6000, 7000]. */
++    ia_aiq_awb_operation_mode_fluorescent,        /*!< Restrict CCT range to [2700, 5500]. */
++    ia_aiq_awb_operation_mode_incandescent,       /*!< Restrict CCT range to [2700, 3100]. */
++    ia_aiq_awb_operation_mode_sunset,
++    ia_aiq_awb_operation_mode_video_conference,
++    ia_aiq_awb_operation_mode_manual_cct_range,   /*!< Use given CCT range (see ia_aiq_awb_manual_cct_range). */
++    ia_aiq_awb_operation_mode_manual_white,       /*!< Use coordinate (see ia_coordinate) relative to full FOV which should be used as white point. */
++    ia_aiq_awb_operation_mode_production_test,
++    ia_aiq_awb_operation_mode_candlelight,
++    ia_aiq_awb_operation_mode_flash,
++    ia_aiq_awb_operation_mode_snow,
++    ia_aiq_awb_operation_mode_beach,
++} ia_aiq_awb_operation_mode;
++
++/*!
++ * \brief Manual CCT range
++ */
++typedef struct
++{
++    unsigned int min_cct;
++    unsigned int max_cct;
++} ia_aiq_awb_manual_cct_range;
++
++/*!
++ * \brief Frame parameters which describe cropping and scaling (need to be filled by AIQ client for every frame)
++ */
++typedef struct
++{
++    unsigned short horizontal_crop_offset;            /*!< Read out offset horizontal. */
++    unsigned short vertical_crop_offset;              /*!< Read out offset vertical. */
++    unsigned short cropped_image_width;               /*!< Width of cropped area in native resolution. */
++    unsigned short cropped_image_height;              /*!< Height of cropped area in native resolution. */
++    unsigned char horizontal_scaling_numerator;       /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
++    unsigned char horizontal_scaling_denominator;     /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
++    unsigned char vertical_scaling_numerator;         /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
++    unsigned char vertical_scaling_denominator;       /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
++} ia_aiq_frame_params;
++
++/*!
++ * \brief DC iris control.
++ * When using DC iris, there are no distinct aperture steps. Use these commands to increase or decrease aperture size.
++ */
++typedef enum
++{
++    ia_aiq_aperture_control_dc_iris_auto,  /*!< State of the iris is selected automatically. */
++    ia_aiq_aperture_control_dc_iris_hold,  /*!< Iris should hold current aperture. */
++    ia_aiq_aperture_control_dc_iris_open,  /*!< Iris should open. */
++    ia_aiq_aperture_control_dc_iris_close, /*!< Iris should close. */
++} ia_aiq_aperture_control_dc_iris_command;
++
++/*!
++ * \brief Aperture control parameters.
++ * Aperture controls for both P (where iris has discrete amount of apertures) and DC (where iris has indefinite amount of possible apertures) iris.
++ */
++typedef struct
++{
++    float aperture_fn;                                       /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
++    ia_aiq_aperture_control_dc_iris_command dc_iris_command; /*!< Used only with DC iris. */
++    int code;                                                /*!< Iris module HW register value. */
++} ia_aiq_aperture_control;
++
++/*!
++ * \brief Exposure data for all exposures.
++ */
++typedef struct
++{
++    unsigned int exposure_index;                        /*!< Exposure index which identifies the exposure. */
++    ia_aiq_exposure_parameters* exposure;               /*!< Exposure parameters to be used in the next frame in generic format. */
++    ia_aiq_exposure_sensor_parameters* sensor_exposure; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
++    float distance_from_convergence;                    /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
++    bool converged;                                     /*!< Indicates that AE has converged. */
++    unsigned int num_exposure_plan;                     /*!< Size of the exposure plan. Indicates how many exposure and sensor_exposure parameter structures are in the arrays above. */
++    unsigned int *exposure_plan_ids;                    /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
++} ia_aiq_ae_exposure_result;
++
++/*!
++ * \brief AEC results.
++ */
++typedef struct
++{
++    ia_aiq_ae_exposure_result* exposures;               /*!< Results for each exposure to be used in the next frame. */
++    unsigned int num_exposures;                         /*!< The number of calculated exposures. */
++    ia_aiq_hist_weight_grid* weight_grid;               /*!< Weight map to be used in the next frame histogram calculation. */
++    ia_aiq_flash_parameters* flashes;                   /*!< Array of flash parameters for each flashes to be used in the next frame. */
++    unsigned int num_flashes;                           /*!< Number of independent flashes. */
++    float lux_level_estimate;                           /*!< Lux level estimate. */
++    ia_aiq_bracket_mode multiframe;                     /*!< AEC may propose to use multiframe for optimal results. */
++    ia_aiq_ae_flicker_reduction flicker_reduction_mode; /*!< Flicker reduction mode proposed by the AEC algorithm */
++    ia_aiq_aperture_control *aperture_control;          /*!< Aperture control parameters. */
++} ia_aiq_ae_results;
++
++/*!
++ * \brief Autofocus algorithm results
++ */
++typedef struct
++{
++    ia_aiq_af_status status;                           /*!< Focus status */
++    unsigned short current_focus_distance;             /*!< Current focusing distance [mm] between the lens and object plane */
++    int next_lens_position;                            /*!< Next lens position */
++    int next_focal_distance;                           /*!< Focal distance [um] between the sensor and lens corresponding to the next lens position */
++    ia_aiq_lens_driver_action lens_driver_action;      /*!< Lens driver action*/
++    bool use_af_assist;                                /*!< True if the af assist light is to be used at half press, false otherwise */
++    bool final_lens_position_reached;                  /*!< Lens has reached the final lens position */
++} ia_aiq_af_results;
++
++/*!
++ * \brief Results from AWB.
++ */
++typedef struct
++{
++    float accurate_r_per_g;           /*!< Accurate White Point for the image. */
++    float accurate_b_per_g;           /*!< Accurate White Point for the image. */
++    float final_r_per_g;              /*!< Final White Point, including color appearance modeling. */
++    float final_b_per_g;              /*!< Final White Point, including color appearance modeling.*/
++    unsigned int cct_estimate;        /*!< Correlated Color Temperature estimate calculated from the accurate WP. */
++    float distance_from_convergence;  /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
++} ia_aiq_awb_results;
++
++/*!
++ * \brief GBCE level.
++ * Allows to override GBCE level defined in the tuning.
++ */
++typedef enum
++{
++    ia_aiq_gbce_level_use_tuning = -1, /*!< Use GBCE level defined in the tuning. */
++    ia_aiq_gbce_level_bypass = 0,      /*!< Use the default gamma table without stretching. This level should be used when manual AE parameters are set. */
++    ia_aiq_gbce_level_gamma_stretch,   /*!< Apply histogram stretching. */
++    ia_aiq_gbce_level_gamma_stretch_and_power_adaptation, /*!< Histogram stretching & gamma power adaptation. */
++} ia_aiq_gbce_level;
++
++/*!
++* \brief Tone Map level.
++* Allows to override Tone Map level defined in the tuning.
++*/
++
++typedef enum
++{
++    ia_aiq_tone_map_level_use_tuning = -1,  /*!< Use Tone Map level defined in the tuning. */
++    ia_aiq_tone_map_level_bypass = 0,       /*!< Bypass TM LUT (i.e. legacy GBCE behavior) */
++    ia_aiq_tone_map_level_default,          /*!< Separate tone mapping and Gamma */
++    ia_aiq_tone_map_level_dynamic,          /*!< Dynamically calculate the TM LUT */
++} ia_aiq_tone_map_level;
++
++/*!
++ * \brief Results from GBCE.
++ */
++typedef struct {
++    float* r_gamma_lut;             /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
++    float* b_gamma_lut;             /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
++    float* g_gamma_lut;             /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
++    unsigned int gamma_lut_size;    /*!< Number of elements in each gamma LUT. */
++    float* tone_map_lut;            /*!< Tone Mapping Gain LUT. Range [0.0 FLT_MAX] */
++    unsigned int tone_map_lut_size; /*!< Number of elements in tone mapping LUT. */
++} ia_aiq_gbce_results;
++
++/*!
++ * \brief Values used in various operations for each color channels.
++ * Value range depends on algorithm output.
++ */
++typedef struct
++{
++    float gr;               /*!< A value affecting Gr color channel. */
++    float r;                /*!< A value affecting R color channel. */
++    float b;                /*!< A value affecting B color channel. */
++    float gb;               /*!< A value affecting Gb color channel. */
++} ia_aiq_color_channels;
++
++/*!
++ * \brief LUTs for each color channel.
++ */
++typedef struct
++{
++    float *gr;              /*!< LUT for Gr color channel. Range [0.0, 1.0].*/
++    float *r;               /*!< LUT for R color channel. Range [0.0, 1.0]. */
++    float *b;               /*!< LUT for B color channel. Range [0.0, 1.0]. */
++    float *gb;              /*!< LUT for Gb color channel. Range [0.0, 1.0]. */
++    unsigned int size;      /*!< Number of elements in each LUT. */
++} ia_aiq_color_channels_lut;
++
++/*!
++ * \brief Shading Adaptor light source weight and its type.
++ */
++typedef struct {
++    float weight;
++    cmc_light_source source_type;
++} light_source_t;
++
++/*!
++* \brief Advanced Color Correction Matrix Structure Returned by Parameter Adaptor.
++*/
++typedef struct {
++    unsigned int sector_count;                                  /*!< Number of color matrix sectors. */
++    unsigned int *hue_of_sectors;                               /*!< Starting hues of sectors. */
++    float (*advanced_color_conversion_matrices)[3][3];          /*!< Advanced CC matrices. Array of color matrices. Each color matrix optimized using a certain sector. Array size is sector_count. */
++    cmc_color_space target_color_space;                         /*!< Target color space of the ACMs, also the color space for which ACMs have been tuned. See enum cmc_color_space. */
++} ia_aiq_advanced_ccm_t;
++
++
++
++/*!
++* \brief IR Weight Grid.
++*/
++typedef struct {
++    unsigned int width;                 /*!< IR Weight grid width */
++    unsigned int height;                /*!< IR Weight grid height */
++    unsigned short *ir_weight_grid_R;          /*!< Interpolated IR Weight for R channel */
++    unsigned short *ir_weight_grid_G;          /*!< Interpolated IR Weight for G channel */
++    unsigned short *ir_weight_grid_B;          /*!< Interpolated IR Weight for B channel */
++}
++ia_aiq_ir_weight_t;
++
++/*!
++ * \brief RGB IR model.
++ */
++typedef struct {
++    unsigned int width;    /*!< Width of model */
++    unsigned int height;   /*!< Height of model */
++    unsigned short sigma;  /*!< Sigma of model */
++    unsigned short offset; /*!< offset of model */
++    unsigned short max;    /*!< max value for model */
++    unsigned short base;   /*!< base value for model */
++} ia_aiq_rgbir_model_t;
++
++/*!
++ * \brief RGB IR.
++ */
++typedef struct {
++    int8_t grid_indices[16];      /*!< Grid indices */
++    unsigned int n_models;        /*!< Number of models */
++    ia_aiq_rgbir_model_t *models; /*!< Array of models */
++} ia_aiq_rgbir_t;
++
++/*!
++ *  \brief Input parameter structure for Shading Adaptor.
++ */
++typedef struct
++{
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    float manual_convergence_time;                   /*!< Mandatory, in seconds. Allows override of tunings for LSC transition interval
++                                                     -1.0 if NA (uses tunings).
++                                                     0.0  forces update of LSC table, this is similar behavior as in previous API when using frame_use still
++                                                     > 0.0  Overrides convergence speed from tunings */
++} ia_aiq_sa_input_params_v1;
++
++/*!
++ * \brief Shading Adaptor results.
++ */
++typedef struct {
++    unsigned short* lsc_grid[4][4];                   /*!< Pointers to the LSC grid for all color channels. Invalid channels are set to NULL. */
++    unsigned short width;                             /*!< Width of LSC grid. */
++    unsigned short height;                            /*!< Height of LSC grid. */
++    unsigned int fraction_bits;                       /*!< Number of fraction bits for the shading table fix point representation. */
++    cmc_bayer_order color_order;                      /*!< Color channels order. */
++    bool lsc_update;                                  /*!< Indicates if LSC grid has been modified and shall be updated in ISP. false - no change, true - new LSC. */
++    light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
++    float confidence;                                 /*!< Confidence in results. */
++    ia_aiq_frame_params frame_params;                 /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
++    float luma_strength;                              /*!< Luma correction strength in image corners, which is percent (normalized to be between 0.0f and 1.0f) of
++                                                      brightness attenutation in corners against image center. Its parametric representation is a semi-sphere with
++                                                      max 1.0f in the centre and luma_strength (e.g. 0.80f for 80%) in corner of size width x height. luma_strength
++                                                      1.0f (see 100%) is a plane of 1.0f of size width x height. -1.0f states for invalid parameter. */
++} ia_aiq_sa_results_v1;
++
++/*!
++* \brief Results from Parameter Adaptor(Deprecated).
++*/
++typedef struct {
++    float color_conversion_matrix[3][3];              /*!< CC matrix. */
++    ia_aiq_color_channels black_level;                /*!< Black level coefficients of each Bayer channel (absolute level). */
++    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
++    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
++    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
++    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
++    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
++    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
++    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
++} ia_aiq_pa_results;
++
++/*!
++* \brief Results from Parameter Adaptor.
++*/
++typedef struct {
++    float color_conversion_matrix[3][3];              /*!< CC matrix. */
++    float black_level_4x4[4][4];                    /*!< Black level coefficients of each Bayer channel (absolute level). */
++    ia_aiq_color_channels color_gains;                /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
++    ia_aiq_color_channels_lut linearization;          /*!< LUTs for linearization of each color channel after black level correction. */
++    float saturation_factor;                          /*!< Saturation factor to increase/decrease saturation.*/
++    float brightness_level;                           /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
++    ia_aiq_advanced_ccm_t *preferred_acm;             /*!< Advanced CC matrix. */
++    ia_aiq_ir_weight_t *ir_weight;                    /*!< IR Weight. */
++    ia_aiq_rgbir_t *rgbir;                            /*!< RGB IR model. */
++} ia_aiq_pa_results_v1;
++
++/*!
++ * \brief Autofocus bracketing results
++ */
++typedef struct
++{
++    unsigned short *distances_bracketing;             /*!< Ordered array of distances in mm for focus bracketing. Distances are ordered from Infinity to close up.*/
++    int *lens_positions_bracketing;                   /*!< Ordered array of lens positions for focus bracketing. Order is from FAR and to NEAR end. */
++} ia_aiq_af_bracket_results;
++
++/*!
++ * \brief Accelerometer Events
++ *        Gravity Events
++ *        Gyroscope Events
++ */
++typedef struct
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
++    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
++    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
++    float sensitivity;      /*!< Sensitivity of the sensor */
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++} ia_aiq_sensor_data;
++
++
++/*!
++ * \brief Ambient Light Sensor (ALS) events.
++  */
++typedef struct
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++    float lux;              /*!< Illuminance (lux), -1 for N/A. */
++    float cct;              /*!< Correlated color temperature (Kelvin), -1 for N/A. */
++    cmc_cie_coords cie_coor; /*!< CIE xy chromaticity, -1 for N/A. */
++    float r;                /*!< Red mean, -1 for N/A. */
++    float g;                /*!< Green mean, -1 for N/A. */
++    float b;                /*!< Blue mean, -1 for N/A. */
++    float c;                /*!< Clear (white) mean, -1 for N/A. */
++    float ir;               /*!< Infra-red mean, -1 for N/A. */
++} ia_aiq_ambient_light_events_v1;
++
++/*!
++ * \brief Device Movement Detector (DMD) motion level
++ *        Coincides with the definition at ISH.
++ */
++typedef enum
++{
++    ia_aiq_dmd_motion_level_sleep = 0,          /*!< The device did not move for the last 10 seconds */
++    ia_aiq_dmd_motion_level_motionless,
++    ia_aiq_dmd_motion_level_slightly_drifting,
++    ia_aiq_dmd_motion_level_slowly_moving,
++    ia_aiq_dmd_motion_level_moving,
++    ia_aiq_dmd_motion_level_rapidly_moving,
++} ia_aiq_dmd_sensor_motion_level;
++
++/*!
++ * \brief Device Movement Detector (DMD) Sensor Events
++ *        This is a virtual sensor designed in ISH to detect if device is in motion.
++ */
++typedef struct
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    ia_aiq_dmd_sensor_motion_level motion;
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++} ia_aiq_dmd_sensor_events;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_AIQ_TYPES_H_ */
++
++
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
+new file mode 100644
+index 000000000000..47aefb93d45e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
+@@ -0,0 +1,81 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2016-2017 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intels
++* suppliers or licensors in any way.
++*/
++
++/*!
++ * \file ia_aiqb_encode.h
++ * \brief Helper functtions to encode records into AIQB.
++ */
++
++
++#ifndef IA_AIQB_ENCODE_H_
++#define IA_AIQB_ENCODE_H_
++
++#include "ia_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MAX_NUM_MAPS 20
++typedef struct
++{
++    ia_aiqd_parser_offset_map offset_maps[MAX_NUM_MAPS];
++    ia_aiqd_parser_maps_info maps_info;
++} pointer_map;
++
++/*!
++ * \brief Copies data from source data pointer to target data pointer and updates pointer address
++ * param[in]     data_end     End address of output buffer. Used to make sure that data is not copied beyond allocated memory.
++ * param[in]     data_input   Input buffer to copy.
++ * param[in]     data_size    Size of data to copy.
++ * param[in/out] data_current Target data pointer (where to copy data).
++ * param[in/out] data_target  Target address pointer (where to update address of copied data).
++ */
++ia_err memory_assign_and_copy(
++    const char *data_end,
++    const void *data_input,
++    size_t data_size,
++    char **data_current,
++    char **data_target);
++
++ia_err update_pointer_map(
++    const char *data_start,
++    const char *pointer_to_pointer,
++    const char *pointer_to_data,
++    pointer_map *maps);
++
++ia_err append_pointer_map(
++    char *data_start,
++    char *data_end,
++    pointer_map *maps,
++    char **data_current);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_AIQB_ENCODE_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
+new file mode 100644
+index 000000000000..acca5d6e60c6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
+@@ -0,0 +1,134 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2016 Intel Corporation
++ * All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its
++ * suppliers or licensors. Title to the Material remains with Intel
++ * Corporation or its suppliers and licensors. The Material may contain trade
++ * secrets and proprietary and confidential information of Intel Corporation
++ * and its suppliers and licensors, and is protected by worldwide copyright
++ * and trade secret laws and treaty provisions. No part of the Material may be
++ * used, copied, reproduced, modified, published, uploaded, posted,
++ * transmitted, distributed, or disclosed in any way without Intel's prior
++ * express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or
++ * delivery of the Materials, either expressly, by implication, inducement,
++ * estoppel or otherwise. Any license under such intellectual property rights
++ * must be express and approved by Intel in writing.
++ *
++ * Unless otherwise agreed by Intel in writing, you may not remove or alter
++ * this notice or any other notice embedded in Materials by Intel or Intels
++ * suppliers or licensors in any way.
++ */
++
++/*!
++ * \file ia_aiqb_parser.h
++ * \brief Generic parser of new AIQB file format.
++ *
++ * New AIQB format assumes that records can be typecasted directly into structures. This means that when using some variable data types in
++ * 32 or 64 bit environments, they occupy different amount of space. Thus AIQB needs to be contructed differently for those environments.
++ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86 for reference.
++ *
++ * Also, structure (and enum) packing must be disabled when constructing AIQB file (or structure packing needs taken into account when creating AIQB).
++ * See https://en.wikipedia.org/wiki/Data_structure_alignment#Default_packing_and_.23pragma_pack for reference.
++ *
++ */
++
++
++#ifndef IA_AIQB_PARSER_H_
++#define IA_AIQB_PARSER_H_
++
++#include "ia_types.h"
++#include "ia_mkn_decoder.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef _DEBUG
++#ifdef __ANDROID__
++#include <utils/Log.h>
++#define IA_AIQB_LOG(...)      ((void)ALOG(LOG_DEBUG, "IA_AIQB: ", __VA_ARGS__))
++#define IA_AIQB_LOG_ERR(...)  ((void)ALOG(LOG_ERROR, "IA_AIQB: ", __VA_ARGS__))
++#else
++#include <stdio.h>
++#define IA_AIQB_LOG(fmt, ...)     fprintf(stdout, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
++#define IA_AIQB_LOG_ERR(fmt, ...) fprintf(stderr, "IA_AIQB: " fmt "\n", ## __VA_ARGS__)
++#endif
++#else
++#define IA_AIQB_LOG(...) ((void)0)
++#define IA_AIQB_LOG_ERR(...) ((void)0)
++#endif
++
++/*!
++ * \brief Offset information about pointers and data tables inside AIQB record.
++ *
++ * Using the offset information parser inserts correct memory address into structures' pointer values.
++ */
++typedef struct
++{
++    uint32_t offset_to_pointer;  /*!< Offset from the beginning of the record to a pointer in the typecasted structure. */
++    uint32_t offset_to_data;     /*!< Offset from the beginning of the record to data where offset_to_pointer needs to reference. */
++} ia_aiqd_parser_offset_map;
++
++/*!
++ * \brief Tells how many offset maps there are.
++ *
++ * AIQB file contains as many maps as there are pointers in the tuning structure.
++ */
++typedef struct
++{
++    uint32_t checksum;         /*!< Checksum of record data after ia_mkn_header and before ia_aiqd_parserr_offset_map and ia_aiqd_parserr_maps_info calculated with function ia_aiqb_parse_checksum(). */
++    uint32_t num_maps;         /*!< Number of ia_aiqd_parserr_offset_map (maps) structures after the record data. */
++} ia_aiqd_parser_maps_info;
++
++/*!
++ * \brief Calculates checksum of given memory using unsigned 32 bit values.
++ *
++ * Function will round down number of elements to sum, if size given is not multiple of 4 bytes. However this should never happen because sizeof(struct) is always multiple of 4 bytes.
++ *
++ * \param[in] data  Buffer from where checksum is calculated.
++ * \param[in] count Size of buffer to sum in bytes.
++ * \return          Calculated checksum.
++ */
++LIBEXPORT unsigned int
++ia_aiqb_parse_calculate_checksum(void *data, size_t size);
++
++
++/*!
++* \brief Replace pointers in the AIQB data from map.
++*
++* Modifies contents of the given AIQB record data buffer by updating pointer values in the record to valid memory address.
++* Map in the end of the record tells offset to pointers which need to be updated. Record has following structure:
++*
++* ia_mkn_record_header record_header;
++* char record_data[record_header.size - (maps_info.num_maps * sizeof(ia_aiqd_parser_offset_map) + sizeof(ia_aiqd_parser_maps_info))];
++* ia_aiqd_parser_offset_map maps[maps_info.num_maps];
++* ia_aiqd_parser_maps_info maps_info;
++*
++* \param[in,out] record AIQB record buffer including all data listed above (header + data). 
++* \return               Error code.
++*/
++LIBEXPORT ia_err
++ia_aiqb_parse_record(ia_mkn_record_header *record);
++
++/*!
++ * \brief Replace pointers in the AIQB data from map.
++ *
++ * Modifies contents of the given AIQB data buffer by updating pointer values in all records to valid memory address.
++ *
++ * \param[in,out] aiqb_binary AIQB data buffer
++ * \return                    Error code.
++ */
++LIBEXPORT ia_err
++ia_aiqb_parse(ia_binary_data *aiqb_binary);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_AIQB_PARSER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
+new file mode 100644
+index 000000000000..9ff602d740ab
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
+@@ -0,0 +1,121 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++ /*!
++  * \file ia_alloc.h
++  * \brief Linear scope stack allocator interface.
++  */
++
++#ifndef IA_ALLOC_H_
++#define IA_ALLOC_H_
++
++#include "ia_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef void(*finalizer_function)(void *ptr);
++typedef struct ia_alloc_t ia_alloc;
++
++/*!
++ *  Initializes the linear allocator.
++ *
++ *  \param [in] size Size of the allocator memory space.
++ *                   If 0, no allocation is made at this point and memory must be reserved with ia_alloc_reserve().
++ *
++ *  \return A pointer to the allocator object, or NULL if errors.
++ */
++LIBEXPORT ia_alloc* ia_alloc_init(size_t size);
++
++/*!
++ *  Initializes the linear allocator using pre-allocated memory.
++ *
++ *  \param [in] buffer Pre-allocated memory buffer.
++ *  \param [in] size   The size of the given buffer.
++ *
++ *  \return A pointer to the allocator object, or NULL if errors.
++ */
++LIBEXPORT ia_alloc* ia_alloc_init_from_memory(void* buffer, size_t size);
++
++/*!
++ *  Reserves memory for the allocator. Can also be used to increase the size of the allocation.
++ *
++ *  \param [in] alloc The allocator.
++ *  \param [in] size  The size of the internal memory space to allocate.
++ *
++ *  \note Stack position is automatically rewound to the start of the allocator buffer.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_nomemory, if out of memory.
++ *          ia_err_argument, if invalid allocator or the allocator used pre-allocated memory.
++ */
++LIBEXPORT ia_err ia_alloc_reserve(ia_alloc* alloc, size_t size);
++
++/*!
++ *  Allocates a block of memory from the allocator memory space.
++ *
++ *  \param [in] alloc The allocator.
++ *  \param [in] size  The size of the requested allocation.
++ *
++ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
++ */
++LIBEXPORT void* ia_alloc_allocate(ia_alloc* alloc, size_t size);
++
++/*!
++ *  Allocates a block of memory from the allocator with a custom specified finalizer for destruction.
++ *
++ *  \param [in] alloc The allocator.
++ *  \param [in] size  The size of the requested allocation.
++ *  \param [in] func  A pointer to the finalizer function.
++ *
++ *  \return A pointer to the allocation, or NULL, if ran out of allocator memory space.
++ */
++LIBEXPORT void* ia_alloc_allocate_with_finalizer(ia_alloc* alloc, size_t size, finalizer_function func);
++
++/*!
++ *  Enters a new scope.
++ *
++ *  \param [in] alloc The allocator.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_internal, if maximum scope depth was reached.
++ */
++LIBEXPORT ia_err ia_alloc_enter_scope(ia_alloc* alloc);
++
++/*!
++*  Leaves a scope.
++*
++*  \param [in] alloc The allocator.
++*
++*  \return ia_err_none, if no errors.
++*          ia_err_internal, if there is a mismatch between enter and leave calls.
++*/
++LIBEXPORT ia_err ia_alloc_leave_scope(ia_alloc* alloc);
++
++/*!
++ *  Deinitializes the linear allocator.
++ *
++ *  \param [in] alloc The allocator.
++ */
++LIBEXPORT void ia_alloc_deinit(ia_alloc* alloc);
++
++#ifdef __cplusplus
++}
++#endif
++
++
++#endif /* IA_ALLOC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
+new file mode 100644
+index 000000000000..1ef2a9b4944f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
+@@ -0,0 +1,89 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++/*!
++ * \mainpage IA BCOMP API documentation
++ *
++ * Browse Files and Classes tabs for details.
++ *
++ */
++/*!
++ * \file ia_bcomp.h
++ * \brief Definitions and declarations of IA_BCOMP library.
++ */
++#ifndef _IA_BCOMP_H_
++#define _IA_BCOMP_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ia_bcomp_types.h"
++#include "ia_cmc_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Initialize ia_bcomp handle.
++ *        If yes the object is allocated and initialized.
++ *        If not, null is returned
++ * \param [in]      ia_cmc              Mandatory, Pointer to CMC structure
++ * \param [in]      dol_mode            Mandatory, Operating mode for DOL sensor
++ * \param [in]      cg_ratio            Optional, conversion gain ratio for DCG sensor, if sensor is not DCG sensor, this should be set to 1.
++ * return                               IA_BCOMP handle. Use the returned handle as input parameter for the consequent IA_BCOMP calls.
++ *                                      Returns NULL is ia_bcomp initialization fails.
++ */
++LIBEXPORT ia_bcomp*
++ia_bcomp_init(const ia_cmc_t *ia_cmc, ia_bcomp_dol_mode_t dol_mode,
++              float cg_ratio);
++
++/*!
++ * \brief Deinitialize IA_BCOMP.
++ *        All memory allocated by BCOMP algoritmhs are freed. BCOMP handle can no longer be used.
++ *
++ * \param[in] ia_bcomp                  Mandatory. BCOMP instance handle.
++ *
++ */
++LIBEXPORT void
++ia_bcomp_deinit(ia_bcomp *ia_bcomp);
++
++/*!
++* \brief IA_BCOMP parameters to calculate compression info.
++*/
++typedef struct ia_bcomp_input_params
++{
++    ia_aiq_ae_results *ae_results;  /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
++                                         Currently only exposure times, analog and digital gains are used. For convenience reasons bcomp takes
++                                         ae results and not only needed parameters. */
++} ia_bcomp_input_params;
++
++/*!
++* \brief Run a bit-compression and generates necessary outputs.
++*
++*  \param [in]      ia_bcomp            Mandatory, initialized ia_bcomp handle.\n
++*  \param [in]      bcomp_input_params  Mandatory. Input parameters to run bit-compression.\n
++*  \param[out]      bcomp_results       Mandatory. Pointer's pointer where address of bcomp results are stored.
++*  \return                              Error code.
++*
++*/
++LIBEXPORT ia_err
++ia_bcomp_run(ia_bcomp *ia_bcomp,
++             const ia_bcomp_input_params *bcomp_input_params,
++             ia_bcomp_results **bcomp_results);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* _IA_BCOMP_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
+new file mode 100644
+index 000000000000..2ba1d7fb2f96
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
+@@ -0,0 +1,68 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_bcomp_types.h
++*/
++
++#ifndef IA_BCOMP_TYPES_H_
++#define IA_BCOMP_TYPES_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MAX_AMOUNT_OF_KNEE_POINTS   16
++
++typedef struct ia_bcomp_t ia_bcomp;
++
++/*!
++* \brief compression curves.
++*/
++typedef struct ia_pwl_compression_curve
++{
++    uint32_t x[MAX_AMOUNT_OF_KNEE_POINTS];
++    uint32_t y[MAX_AMOUNT_OF_KNEE_POINTS];
++    uint32_t num_of_knee_points;
++} ia_pwl_compression_curve;
++
++/*!
++ * \brief Current operating modes supported for various DOL sensors.
++ */
++typedef enum
++{
++    ia_bcomp_non_dol = 0,                /*!< Non-DOL sensor >*/
++    ia_bcomp_dol_two_or_three_frame = 1, /*!< UC1 - DOL Sensor outputs two or three exposure readout mode, long, medium , short / long, short >*/
++    ia_bcomp_dol_dcg = 2,                    /*!< UC2 - DOL DCG (Dual Conversion gain) sensor - outputs HCG (long) and LCG (medium) with a constant cg ratio >*/
++    ia_bcomp_dol_combined_very_short = 3,    /*!< UC3 - DOL DCG sensor - outputs combined image (long and medium exposure stitched in sensor) and very short exposure >*/
++    ia_bcomp_dol_dcg_very_short = 4,         /*!< UC4 - DOL DCG sensor - outputs HCG (long), LCG(medium) with constant cg ratio and very short exposure frames >*/
++} ia_bcomp_dol_mode_t;
++
++/*!
++ * \brief calculated compression curves.
++ */
++typedef struct ia_bcomp_results
++{
++    ia_pwl_compression_curve    pwl_compression_curve; /*!< piecewise linear compression curve >*/
++    ia_bcomp_dol_mode_t         dol_mode; /*!< Operating Mode for DOL sensor >*/
++    float                       cg_ratio; /*!< Conversion Gain Ratio for the sensor - constant value per sensor >*/
++} ia_bcomp_results;
++
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_BCOMP_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
+new file mode 100644
+index 000000000000..51e27d660e4f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
+@@ -0,0 +1,650 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2012-2020 Intel Corporation
++ * All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its
++ * suppliers or licensors. Title to the Material remains with Intel
++ * Corporation or its suppliers and licensors. The Material may contain trade
++ * secrets and proprietary and confidential information of Intel Corporation
++ * and its suppliers and licensors, and is protected by worldwide copyright
++ * and trade secret laws and treaty provisions. No part of the Material may be
++ * used, copied, reproduced, modified, published, uploaded, posted,
++ * transmitted, distributed, or disclosed in any way without Intel's prior
++ * express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or
++ * delivery of the Materials, either expressly, by implication, inducement,
++ * estoppel or otherwise. Any license under such intellectual property rights
++ * must be express and approved by Intel in writing.
++ *
++ * Unless otherwise agreed by Intel in writing, you may not remove or alter
++ * this notice or any other notice embedded in Materials by Intel or Intels
++ * suppliers or licensors in any way.
++ */
++
++/*!
++ * \file ia_ccat.h
++ * \brief Definitions of common analysis functions used by Intel 3A modules.
++*/
++
++#ifndef IA_CCAT_H_
++#define IA_CCAT_H_
++
++#include "ia_configuration.h"
++#include "ia_ccat_types.h"
++#include "ia_aiq_types.h"
++#include "ia_cmc_types.h"
++#include "ia_ccat_params.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++#define IA_CCAT_ACM_SECTORS_MAX_NUM 36
++
++typedef struct ia_ccat_t ia_ccat;
++typedef struct frame_info_t ia_ccat_frame_info;
++
++LIBEXPORT ia_ccat*
++ia_ccat_init();
++
++/*!
++ * \brief (Re)allocates memory for CMC/tunings used inside CCAT.
++ * Given CMC structure must be valid throughout lifetime of CCAT.
++ */
++LIBEXPORT ia_err
++ia_ccat_set_tunings(
++    ia_ccat *ccat,        /*!< \param[in] Analysis toolbox's internal structure. */
++    const ia_cmc_t *cmc); /*!< \param[in] CMC structure that will be stored and copied/modified for CCAT internal use. */
++
++/*!
++ * \brief De-initializes and frees memory allocated in ia_ccat_init() function.
++ */
++LIBEXPORT void
++ia_ccat_deinit(ia_ccat *ccat); /*!< \param[in] Analysis toolbox's internal structure. */
++
++/*!
++ * \brief Statistics setting and initialization functions.
++ *
++ * Note: frame_parameters_available and frame_type:
++ * CCAT keeps shallow copy of ia_ccat_frame_parameters structure for all frame_types (eg. flash and nonflash frame parameters) and accesses
++ * parameters behind given pointers directly during its lifetime. When ia_ccat_set_frame_parameters is called with new set of parameters
++ * (and frame_parameters_available is set to true), previously given frame parameters (for the given frame_type) will no longer be used and
++ * can be freed/reused by CCAT client.
++ * If CCAT client wants to invalidate given frame parameters (for particular frame_type) without new set of parameters, frame_parameters_available
++ * flag should be set to false. This needs to be done for all frame_types that CCAT client wants to invalidate.
++ *
++ * Note: statistics_crop_area:
++ * This information is needed to restrict use parameters from Camera Module Characterization (for example LSC),
++ * which was done relative to the full sensor resolution (FOV).
++ * For example, if sensor captures image size 1600x1200 (4:3 ratio) pixels and only 1600x900 (16:9) area is used from the center.
++ * So, image area at top and bottom must not be used (needs to be cropped 150 pixels from top and bottom).
++ * statistics_crop_area crop rectangle needs to be given relative to IA_COORDINATE_WIDTH, IA_COORDINATE_HEIGHT found in ia_coordinate.h.
++ * Thus given structure in this example case should be:
++ *  statistics_crop_area.left = (0*IA_COORDINATE_WIDTH/1600);
++ *  statistics_crop_area.top = (150*IA_COORDINATE_HEIGHT/1200);
++ *  statistics_crop_area.right = (0*IA_COORDINATE_WIDTH/1600);
++ *  statistics_crop_area.bottom = (150*IA_COORDINATE_HEIGHT/1200);
++ *
++ */
++LIBEXPORT ia_err
++ia_ccat_set_frame_parameters(
++    ia_ccat *ccat,                                                           /*!< \param[in] Analysis toolbox internal data structure. */
++    const ia_ccat_frame_statistics *frame_statistics,                        /*!< \param[in] Input statistics */
++    const ia_ccat_frame_parameters *frame_parameters);                       /*!< \param[in] Input parameters */
++
++/*!
++ * \brief Registers percentile that will be calculated from histograms covering whole frame.
++ */
++LIBEXPORT ia_err
++ia_ccat_register_percentile_frame(
++    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
++    float percentile);
++
++/*!
++ * \brief Reserves frame into use.
++ * \return Error code.
++ */
++LIBEXPORT ia_err
++ia_ccat_hold_frame(
++    ia_ccat *ccat,                    /*!< \param[in]  Analysis toolbox internal data structure. */
++    ia_ccat_frame_type frame_type,    /*!< \param[in]  Frame type to acquire. */
++    ia_ccat_frame_info **frame_info); /*!< \param[out] Pointer to acquired frame info. */
++
++LIBEXPORT ia_err
++ia_ccat_release_frame(
++    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
++    ia_ccat_frame_info **frame_info); /*!< \param[in] Frame info pointer that is no longer used. */
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_percentile(
++    ia_ccat_frame_info* frame_info,
++    float percentile,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type histogram_type,
++    float *percentile_bin);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_normalized_percentile(
++    ia_ccat_frame_info* frame_info,
++    float percentile,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type histogram_type,
++    float *normalized_percentile);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_total_gain(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    float *total_gain);
++
++LIBEXPORT ia_err
++ia_ccat_calculate_total_gain(
++    const ia_aiq_exposure_parameters* a_exposure_params,
++    float *total_gain);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_total_exposure_time(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    unsigned int *total_exposure_time);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_lux_level_estimate(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    float *lux_level_estimate);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_filtered_lux_level_estimate(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    float *filtered_lux_level_estimate);
++
++LIBEXPORT ia_err
++ia_ccat_hold_frame_histogram(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type histogram_type,
++    const ia_histogram **histogram);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_camera_orientation(
++    ia_ccat_frame_info *frame_info,
++    ia_aiq_camera_orientation *a_camera_orientation);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_ccat(
++    ia_ccat_frame_info *frame_info,
++    ia_ccat **ccat_ptr);
++
++LIBEXPORT ia_err
++ia_ccat_estimate_percentile_with_saturation_frame(
++    ia_ccat_frame_info *frame_info,
++    ia_ccat_histogram_type a_ccat_histogram_type,
++    unsigned int exposure_index,
++    float a_full_sat_step,
++    float a_percentile,
++    unsigned int *adjusted_prc);
++
++LIBEXPORT ia_err
++ia_ccat_release_frame_histogram(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type histogram_type,
++    const ia_histogram **histogram);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_histogram_info(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type histogram_type,
++    float *mean,
++    float *saturation_percent,
++    float *max);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_histogram_segment_average(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    ia_ccat_histogram_type a_histogram_type,
++    float low_limit,
++    float high_limit,
++    float *average);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_ae_results(
++    ia_ccat_frame_info *frame_info,
++    const ia_aec_results **ae_results_ptr);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_awb_results(
++    ia_ccat_frame_info *frame_info,
++    const ia_aiq_awb_results **awb_results);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_af_results(
++    ia_ccat_frame_info *frame_info,
++    const ia_aiq_af_results **af_results);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_sa_results(
++    ia_ccat_frame_info *frame_info,
++    const ia_aiq_sa_results_v1 **sa_results);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_exposure_result(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_aec_exposure_result **a_exposure_result_ptr);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_exposure_parameters(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_aec_exposure_parameters **a_exposure_parameters_ptr);
++
++/*!
++ *  Calculate amount of pixels (normalized) in a segment defined by min and max
++ *  values. Raw histograms are used to compute area in between of low and high
++ *  bins, that define of segment.
++ *
++ *
++ *  \param [in]  frame_info         A pointer to the frame info.
++ *  \param [in]  a_low_limit        Low limit bin (min 0).
++ *  \param [in]  a_high_limit       High limit bin (max 255).
++ *  \param [in]  a_num_exposures    Number of exposures, or number of RGBS statistics grids.
++ *  \param [out] power_normal       Amount of pixels (normalized) in a segment defined by min and max values
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_segment_size(
++    ia_ccat_frame_info *frame_info,
++    uint16_t a_low_limit,
++    uint16_t a_high_limit,
++    uint16_t a_num_exposures,
++    float *power_noraml);
++
++#ifdef IA_AEC_FEATURE_WEIGHT_GRID
++LIBEXPORT ia_err
++ia_ccat_get_frame_histogram_weight_map(
++    ia_ccat_frame_info *frame_info,
++    const ia_aec_weight_grid **a_weight_grid_ptr);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_weight_map_changed(
++    ia_ccat_frame_info *frame_info,
++    bool *weight_map_changed);
++#endif
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_sensor_exposure_parameters(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    ia_aiq_exposure_sensor_parameters *exposure_sensor_parameters);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_color_gains(
++    ia_ccat_frame_info *frame_info,
++    ia_aiq_color_channels *color_gains);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_color_correction_matrix(
++    ia_ccat_frame_info *frame_info,
++    float(*matrix)[3][3]);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_timestamp(
++    ia_ccat_frame_info *frame_info,
++    unsigned long long *frame_timestamp);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_id(
++    ia_ccat_frame_info *frame_info,
++    unsigned long long *frame_id);
++
++/*!
++ * \brief Get information about number of exposures and which of them is the center (in case of multi exposure frame) exposure index.
++ */
++LIBEXPORT ia_err
++ia_ccat_get_frame_exposure_index_info(
++    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
++    unsigned int *center_exposure_index,                               /*!< [out] Center (in case of multiple exposures) / default exposure index . */
++    unsigned int *num_exposures);                                      /*!< [out] Number of exposures/statistics in the frame. */
++
++/*!
++ * \brief Get closest ACMs for a white point.
++ * Note: Only CCMs are updated in out_acm structure.
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_weighted_acm(
++    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
++    const cmc_parsed_advanced_color_matrices_ls_t *parsed_acm_ls,      /*!< [in] ACMs from CMC or AIQ tunings. */
++    unsigned int a_num_advanced_color_matrices,                        /*!< [in] Number of advanced color matrices */
++    unsigned int sector_count,                                         /*!< [in] Number of sectors in ACMs. */
++    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
++    float (*out_acm)[3][3],                                            /*!< [out] Resulting ACMs. Array length is defined by sector_count. */
++    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
++
++/*!
++ * \brief Get closest CCMs for a white point.
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_weighted_ccm(
++    ia_ccat_frame_info *frame_info,                                    /*!< [in] Frame handle. */
++    const cmc_parsed_color_matrices_t *parsed_color_matrices,          /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
++    bool output_ccm_type_preferred,                                    /*!< [in] Flag to control output CCM to be preferred (true) or accurate (false). */
++    cmc_chromaticity point,                                            /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
++    float (*out_ccm)[3][3]);                                           /*!< [out] Resulting CCM. */
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_scaled_cmc_lens_shading(
++    ia_ccat_frame_info *a_frame_info_ptr,
++    unsigned int a_exposure_index,
++    const cmc_lens_shading_correction **a_scaled_lsc_ptr);
++
++LIBEXPORT ia_err
++ia_ccat_calculate_chromaticity_based_weights(
++    ia_ccat_frame_info *frame_info,                                      /*!< [in] Frame handle. */
++    cmc_chromaticity(*a_chromaticities_ptr)[CMC_NUM_LIGHTSOURCES],       /*!< [in] CCM characterization data with R/G and B/G chromaticities. */
++    unsigned int num_chromaticities,                                     /*!< [in] Number of input chromaticities. */
++    cmc_chromaticity point,                                              /*!< [in] Chromaticity to calculate distance (x and y axis) against input list of chromaticities in R/G and B/G plane. */
++    const float *ir_proportion,                                          /*!< [in] Ir effect on chromaticity point distance (z axis). */
++    float(*weights)[CMC_NUM_LIGHTSOURCES]);                              /*!< [out] Normalized chromaticity distances translated into weights. */
++
++#ifdef IA_AEC_FEATURE_FLASH
++/*!
++ * \brief Calculate preferred flash ratio for multi-flash using non-flash white point information. flash_ratio scale between 0-100
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_flash_ratios(
++    const cmc_multi_led_flash_t *flash_tunings,
++    ia_ccat_frame_info *nonflash_frame_info,
++    float (*flash_ratios)[IA_AEC_FLASHES_NUM]);
++
++/*!
++ * \brief Calculate preferred flash ratio for multi-flash using non-flash white point information. flash_ratio scale between 0-100
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_flash_ratios_frame_tuning(
++    ia_ccat_frame_info *frame_info,
++    float (*flash_ratios)[IA_AEC_FLASHES_NUM]);
++#endif
++
++#ifdef IA_CCAT_IR_GRID_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_ir_grid(
++    ia_ccat_frame_info *frame_info,
++    const ia_ccat_ir_grid **ir_grid);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_ir_histogram_info(
++    ia_ccat_frame_info *frame_info,
++    float *mean,
++    float *saturation_percent,
++    float *max);
++
++LIBEXPORT ia_err
++ia_ccat_set_ir_compgain(
++    ia_ccat_frame_info *frame_info,
++    float ir_compgain);
++
++LIBEXPORT ia_err
++ia_ccat_get_ir_compgain(
++    ia_ccat_frame_info *frame_info,
++    float *ir_compgain);
++#endif
++
++#ifdef IA_CCAT_DEPTH_GRID_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_depth_grid(
++    ia_ccat_frame_info *frame_info,
++    const ia_depth_grid **depth_grid);
++#endif
++
++#ifdef IA_CCAT_RGBS_GRID_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_rgbs_grid(
++    ia_ccat_frame_info *frame_info,
++    bool shading_corrected,
++    unsigned int exposure_index,
++    const ia_rgbs_grid **rgbs_grid);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_af_grid(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_filter_response_grid **af_grid);
++
++#ifdef IA_CCAT_HSV_GRID_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_hsv_grid(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_ccat_hsv_grid **hsv_grid);
++#endif
++
++#ifdef IA_CCAT_LUMINANCE_GRID_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_luminance_grid(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_ccat_grid_char **luminance_grid);
++
++#ifdef IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
++LIBEXPORT ia_err
++ia_ccat_get_frame_motion_level_estimate(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    float *motion_estimate);
++#endif
++#endif
++
++#ifdef IA_CCAT_ROI_ANALYSIS_ENABLED
++LIBEXPORT ia_err
++ia_ccat_register_percentile_roi(
++    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
++    float percentile);
++
++LIBEXPORT ia_err
++ia_ccat_hold_frame_histogram_roi(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_rectangle *roi_area,
++    ia_ccat_histogram_type histogram_type,
++    const ia_histogram **histogram);
++
++LIBEXPORT ia_err
++ia_ccat_release_frame_histogram_roi(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_rectangle *roi_area,
++    ia_ccat_histogram_type histogram_type,
++    const ia_histogram **histogram);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_histogram_info_roi(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_rectangle *roi_area,
++    ia_ccat_histogram_type histogram_type,
++    float *mean,
++    float *saturation_percent,
++    float *max);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_percentile_roi(
++    ia_ccat_frame_info *frame_info,
++    float percentile,
++    unsigned int exposure_index,
++    const ia_rectangle *roi_area,
++    ia_ccat_histogram_type histogram_type,
++    float *percentile_bin);
++#endif /* IA_CCAT_ROI_ANALYSIS_ENABLED */
++
++#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
++LIBEXPORT ia_err
++ia_ccat_register_percentile_face(
++    ia_ccat *ccat,                    /*!< \param[in] Analysis toolbox internal data structure. */
++    float percentile);
++
++LIBEXPORT ia_err
++ia_ccat_get_face_stencil(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_rectangle *face_area,
++    const ia_ccat_grid_char **stencil_mask);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_faces(
++    ia_ccat_frame_info *frame_info,
++    unsigned int *num_faces,
++    const ia_face_roi **faces);
++
++LIBEXPORT ia_err
++ia_ccat_get_face_coverage(
++    const ia_face_roi *face,
++    float *coverage);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_face_y_mean(
++    ia_ccat_frame_info *frame_info,
++    unsigned int exposure_index,
++    const ia_face_roi *face,
++    float *face_y_mean);
++
++LIBEXPORT ia_err
++ia_ccat_get_frame_percentile_face(
++    ia_ccat_frame_info *frame_info,
++    float percentile,
++    unsigned int exposure_index,
++    const ia_face_roi *face,
++    ia_ccat_histogram_type histogram_type,
++    float *percentile_bin);
++
++/*!
++ *  Calculates the percentage of how many pixels of the given roi are contained in the luminance segment [low, high].
++ */
++LIBEXPORT ia_err
++ia_ccat_calculate_face_coverage_in_segment(
++    ia_ccat_frame_info *frame_info,
++    unsigned char a_thr_low,
++    unsigned char a_thr_high,
++    const ia_face_roi *face,
++    float *coverage_segment);
++
++LIBEXPORT ia_err
++ia_ccat_set_face_in_exit_time(
++    ia_ccat_frame_info *frame_info,
++    bool face_in_exit_time);
++
++LIBEXPORT ia_err
++ia_ccat_get_face_in_exit_time(
++    ia_ccat_frame_info *frame_info,
++    bool* face_in_exit_time);
++#endif /* IA_CCAT_FACE_ANALYSIS_ENABLED */
++#endif /* IA_CCAT_RGBS_GRID_ENABLED */
++
++#ifdef IA_CCAT_EXTERNAL_SENSORS_ENABLED
++/*
++* Sensor event functions.
++*/
++/*!
++* \brief Set the accelerometer sensor events to CCAT internal circular buffer.
++* Initialize sensor_events structure. Const fields in the structure are assumed to be initialized before calling this function.
++*/
++LIBEXPORT ia_err
++ia_ccat_set_sensor_events_accelerometer(
++    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
++    unsigned int num_events,                           /*!< [in] Number of accelerometer sensor events. */
++    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing accelerometer events for given time range. */
++
++/*!
++* \brief Get a copy of accelerometer events.
++* Outputs all events within given timestamps.
++*/
++LIBEXPORT ia_err
++ia_ccat_get_sensor_events_accelerometer(
++    const ia_ccat *ccat,                               /*!< [in] Analysistoolbox internal data structures. */
++    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
++                                                       [out] How many events were copied to the sensor_events structure. */
++    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied accelerometer events. */
++
++/*!
++* \brief Set the gyroscope sensor events to CCAT internal circular buffer.
++*/
++LIBEXPORT ia_err
++ia_ccat_set_sensor_events_gyroscope(
++    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
++    unsigned int num_events,                           /*!< [in] Number of gyroscope sensor events. */
++    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gyroscope events for given time range. */
++
++/*!
++* \brief Get a copy of gyroscope events.
++* Outputs all events within given timestamps.
++*/
++LIBEXPORT ia_err
++ia_ccat_get_sensor_events_gyroscope(
++    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
++    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
++                                                       [out] How many events were copied to the sensor_events structure. */
++    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gyroscope events. */
++
++/*!
++* \brief Set the gravity sensor events to CCAT internal circular buffer.
++*/
++LIBEXPORT ia_err
++ia_ccat_set_sensor_events_gravity(
++    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
++    unsigned int num_events,                           /*!< [in] Number of gravity sensor events. */
++    const ia_ccat_motion_sensor_event *sensor_events); /*!< [in] Structure containing gravity events for given time range. */
++
++/*!
++* \brief Get a copy of gravity events.
++* Outputs all events within given timestamps.
++*/
++LIBEXPORT ia_err
++ia_ccat_get_sensor_events_gravity(
++    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
++    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
++                                                       [out] How many events were copied to the sensor_events structure. */
++    ia_ccat_motion_sensor_event* sensor_events);       /*!< [out] Copied gravity events. */
++
++/*!
++* \brief Set the ambient light sensor events to CCAT internal circular buffer.
++*/
++LIBEXPORT ia_err
++ia_ccat_set_sensor_events_ambient_light(
++    ia_ccat *ccat,                                     /*!< [in, out] Analysistoolbox internal data structures. */
++    unsigned int num_events,                           /*!< [in] Number of ambient light sensor events. */
++    const ia_ccat_ambient_light_event *sensor_events); /*!< [in] Structure containing ambient light events for given time range. */
++
++/*!
++* \brief Get a copy of ambient light events.
++* Outputs all events within given timestamps.
++*/
++LIBEXPORT ia_err
++ia_ccat_get_sensor_events_ambient_light(
++    const ia_ccat *ccat,                               /*!< [in]  Analysistoolbox internal data structures. */
++    unsigned long long start_timestamp,                /*!< [in]  Start time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned long long end_timestamp,                  /*!< [in]  End time for events to be copied. 0 if all data (max_num_events) must be copied. */
++    unsigned int *num_events,                          /*!< [in]  Number of events allowed to be copied (maximum amount of available memory in sensor_events).
++                                                            [out] How many events were copied to the sensor_events structure. */
++    ia_ccat_ambient_light_event* sensor_events);       /*!< [out] Copied ambient light events. */
++
++                                                       /* Following functions require frame_info structure as input. Client should call ia_ccat_hold_frame() to get the frame handle.
++                                                       * Once frame handle is no longer used, ia_ccat_release_frame() must be called. */
++#endif /* IA_CCAT_EXTERNAL_SENSORS_ENABLED */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_CCAT_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_params.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_params.h
+new file mode 100644
+index 000000000000..09f68fbc45f4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_params.h
+@@ -0,0 +1,48 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2020 Intel Corporation
++ * All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its
++ * suppliers or licensors. Title to the Material remains with Intel
++ * Corporation or its suppliers and licensors. The Material may contain trade
++ * secrets and proprietary and confidential information of Intel Corporation
++ * and its suppliers and licensors, and is protected by worldwide copyright
++ * and trade secret laws and treaty provisions. No part of the Material may be
++ * used, copied, reproduced, modified, published, uploaded, posted,
++ * transmitted, distributed, or disclosed in any way without Intel's prior
++ * express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or
++ * delivery of the Materials, either expressly, by implication, inducement,
++ * estoppel or otherwise. Any license under such intellectual property rights
++ * must be express and approved by Intel in writing.
++ *
++ * Unless otherwise agreed by Intel in writing, you may not remove or alter
++ * this notice or any other notice embedded in Materials by Intel or Intels
++ * suppliers or licensors in any way.
++ */
++
++/*!
++ * \file ia_ccat_params.h
++ * \brief Definitions of CCAT constants.
++*/
++
++#ifndef CCAT_PARAMS_H_
++#define CCAT_PARAMS_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MANUAL_CONVERGENCE_TIME_GRANULARITY 0.01f
++#define TIMED_TRIMMED_FILTER_SIZE 34
++#define DEFAULT_MODULE_ISO 100
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* CCAT_PARAMS_H_ */
+\ No newline at end of file
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
+new file mode 100644
+index 000000000000..58a1bce3fe4e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
+@@ -0,0 +1,244 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2012-2020 Intel Corporation
++ * All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its
++ * suppliers or licensors. Title to the Material remains with Intel
++ * Corporation or its suppliers and licensors. The Material may contain trade
++ * secrets and proprietary and confidential information of Intel Corporation
++ * and its suppliers and licensors, and is protected by worldwide copyright
++ * and trade secret laws and treaty provisions. No part of the Material may be
++ * used, copied, reproduced, modified, published, uploaded, posted,
++ * transmitted, distributed, or disclosed in any way without Intel's prior
++ * express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or
++ * delivery of the Materials, either expressly, by implication, inducement,
++ * estoppel or otherwise. Any license under such intellectual property rights
++ * must be express and approved by Intel in writing.
++ *
++ * Unless otherwise agreed by Intel in writing, you may not remove or alter
++ * this notice or any other notice embedded in Materials by Intel or Intels
++ * suppliers or licensors in any way.
++ */
++
++/*!
++ * \file ia_ccat.h
++ * \brief Definitions of common analysis types used by Intel 3A modules.
++*/
++
++#ifndef IA_CCAT_TYPES_H_
++#define IA_CCAT_TYPES_H_
++
++#include "ia_configuration.h"
++#include "ia_statistics_types.h"
++#include "ia_aiq_types.h"
++#include "ia_aec_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef enum
++{
++    ia_ccat_frame_type_nonflash,
++#ifdef IA_AEC_FEATURE_FLASH
++    ia_ccat_frame_type_flash,
++#endif
++    ia_ccat_frame_type_count
++} ia_ccat_frame_type;
++
++typedef enum
++{
++    ia_ccat_histogram_type_cc_start = 0,
++    ia_ccat_histogram_type_cc_rgb_averaged = ia_ccat_histogram_type_cc_start, /*!< Color corrected and weighted R, G and B histograms averaged into one histogram. */
++    ia_ccat_histogram_type_cc_rgb_combined,                                   /*!< Color corrected and weighted R, G and B histograms summed into one histogram. */
++    ia_ccat_histogram_type_cc_y,                                              /*!< Color corrected and weighted R, G and B histograms converted to Y (luminance) histogram. */
++    ia_ccat_histogram_type_cc_end,
++    ia_ccat_histogram_type_raw_start = ia_ccat_histogram_type_cc_end,
++#ifdef IA_CCAT_RGBS_GRID_ENABLED
++    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_cc_end,  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms averaged into one histogram. */
++    ia_ccat_histogram_type_raw_rgb_combined,                                  /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms summed into one histogram. */
++    ia_ccat_histogram_type_raw_y,                                             /*!< Raw (calculated from RGBS grid before color correction) R, G and B histograms converted to Y (luminance) histogram. */
++    ia_ccat_histogram_type_uncorrected_raw_y,                                 /*!< Raw (calculated from RGBS grid before LSC and color correction) R, G and B histograms converted to Y (luminance) histogram. */
++    ia_ccat_histogram_type_raw_end,
++#else
++    ia_ccat_histogram_type_raw_end = ia_ccat_histogram_type_raw_start,
++    ia_ccat_histogram_type_raw_rgb_averaged = ia_ccat_histogram_type_raw_end,
++    ia_ccat_histogram_type_raw_rgb_combined = ia_ccat_histogram_type_raw_end,
++    ia_ccat_histogram_type_raw_y = ia_ccat_histogram_type_raw_end,
++    ia_ccat_histogram_type_uncorrected_raw_y = ia_ccat_histogram_type_raw_end,
++#endif
++    ia_ccat_histogram_type_count = ia_ccat_histogram_type_raw_end,
++    ia_ccat_histogram_type_invalid = ia_ccat_histogram_type_count,
++} ia_ccat_histogram_type;
++
++typedef struct ia_ccat_histograms
++{
++    ia_histogram r;
++    ia_histogram g;
++    ia_histogram b;
++} ia_ccat_histograms;
++
++#ifdef IA_CCAT_RGBS_GRID_ENABLED
++#ifdef IA_CCAT_HSV_GRID_ENABLED
++typedef struct ia_ccat_hsv_channels
++{
++    float h;
++    float s;
++    float v;
++} ia_ccat_hsv_channels;
++
++/*!
++* \brief HSV grid structure.
++*/
++typedef struct ia_ccat_hsv_grid
++{
++    unsigned int grid_width;                        /*! Width of the grid. */
++    unsigned int grid_height;                       /*! Height of the grid. */
++    ia_ccat_hsv_channels data[IA_RGBS_GRID_SIZE];   /*! Grid data. */
++} ia_ccat_hsv_grid;
++#endif
++#endif
++
++#if defined IA_CCAT_RGBS_GRID_ENABLED || defined IA_CCAT_LUMINANCE_GRID_ENABLED || defined IA_CCAT_IR_GRID_ENABLED
++/*!
++ * \brief Generic 8 bit grid structure.
++ */
++typedef struct ia_ccat_grid_char
++{
++    unsigned int grid_width;                    /*! Width of the grid. */
++    unsigned int grid_height;                   /*! Height of the grid. */
++    unsigned char data[IA_RGBS_GRID_SIZE];      /*! Grid data. */
++} ia_ccat_grid_char;
++
++/*!
++* \brief Generic 16 bit grid structure.
++*/
++typedef struct ia_ccat_grid_short
++{
++    unsigned int grid_width;                    /*! Width of the grid. */
++    unsigned int grid_height;                   /*! Height of the grid. */
++    unsigned short data[IA_RGBS_GRID_SIZE];     /*! Grid data. */
++} ia_ccat_grid_short;
++
++/*!
++ * \brief Generic grid structure with floating point values.
++ */
++typedef struct ia_ccat_grid_float
++{
++    unsigned int grid_width;                    /*! Width of the grid. */
++    unsigned int grid_height;                   /*! Height of the grid. */
++    float data[IA_RGBS_GRID_SIZE];              /*! Grid data in floating point format. */
++} ia_ccat_grid_float;
++#if defined IA_CCAT_IR_GRID_ENABLED
++typedef struct ia_ccat_ir_grid
++{
++    ia_ccat_grid_char grid_data;
++    float i_per_y;
++    float out_ir_compgain_isp;
++} ia_ccat_ir_grid;
++#endif
++#endif
++
++typedef struct ia_ccat_frame_statistics
++{
++    bool frame_parameters_available;                                         /*!< Mandatory. Flag indicating that frame parameters can be used by CCAT. Set to false to invalidate frame parameters. */
++    bool shading_corrected;                                                  /*!< Mandatory. Flag indicating if statistics were calculated using lens shading corrected data. */
++    ia_ccat_frame_type frame_type;                                           /*!< Mandatory. Indicates if statistics were captured from non-flash or flash illuminated frame. */
++    unsigned long long frame_id;                                             /*!< Mandatory. ID for the captured frame. */
++    unsigned long long frame_timestamp;                                      /*!< Mandatory. Time stamp for captured frame. */
++    ia_rectangle statistics_crop_area;                                       /*!< Mandatory. RGBS and AF grid area crop with respect to full field of view of sensor output using (relative)ranges from ia_coordinate.h. */
++#ifdef IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
++    ia_ccat_histograms rgb_histograms[IA_CCAT_STATISTICS_MAX_NUM];           /*!< Optional. RGB histograms pointer for each exposure statistics. */
++#endif
++#ifdef IA_CCAT_EXTERNAL_LUMINANCE_HISTOGRAM_ENABLED
++    ia_histogram y_histogram[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance histogram. */
++#endif
++#ifdef IA_CCAT_RGBS_GRID_ENABLED
++    ia_rgbs_grid rgbs_grids[IA_CCAT_STATISTICS_MAX_NUM];                     /*!< Optional. RGBS grids for each exposure statistics. */
++#endif
++#ifdef IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
++    ia_filter_response_grid af_grids[IA_CCAT_STATISTICS_MAX_NUM];            /*!< Optional. AF grids for each exposure statistics. */
++#endif
++#ifdef IA_CCAT_EXTERNAL_LUMINANCE_GRID_ENABLED
++    ia_ccat_grid_char y_grid[IA_CCAT_STATISTICS_MAX_NUM];                    /*!< Optional. Luminance (LSC and color corrected) grids for each exposure statistics. */
++#endif
++#ifdef IA_CCAT_IR_GRID_ENABLED
++    ia_ccat_ir_grid ir_grid;                                               /*!< Optional. Ir grid (Non LSC corrected grid). */
++#endif
++#ifdef IA_CCAT_DEPTH_GRID_ENABLED
++    ia_depth_grid depth_grid;                                                /*!< Optional. Depth grid. */
++#endif
++} ia_ccat_frame_statistics;
++
++typedef struct ia_ccat_frame_parameters
++{
++    ia_aec_results aec_results;                                              /*!< Mandatory. Exposure parameters used to capture the frame. */
++    ia_aiq_pa_results_v1 pa_results;                                         /*!< Optional. */
++    ia_aiq_sa_results_v1 sa_results;                                         /*!< Optional. */
++    ia_aiq_awb_results awb_results;                                          /*!< Optional. */
++    ia_aiq_af_results af_results;                                            /*!< Optional. */
++#ifdef IA_CCAT_FACE_ANALYSIS_ENABLED
++    ia_face_roi faces[IA_CCAT_FACES_MAX_NUM];                                /*!< Optional. Face coordinates from external face detector. NULL if not available. */
++#endif
++} ia_ccat_frame_parameters;
++
++/*!
++ * \brief Structure for various motion sensors
++ * Accelerometer Events:
++ *  - The data holds information on the acceleration of the device in mg/sec (miligravity per second). Acceleration = Gravity + Linear Acceleration.
++ * Gravity Events:
++ *  - The data holds information on the gravitation of the device in mg/sec (miligravity per second).
++ * Gyroscope Events:
++ *  - The data holds information on the angular velocity of the device in rad/sec.
++ */
++typedef struct ia_ccat_motion_sensor_event
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    float x;                /*!< Sensor Data in X direction depending on the type of the sensor */
++    float y;                /*!< Sensor Data in Y direction depending on the type of the sensor */
++    float z;                /*!< Sensor Data in Z direction depending on the type of the sensor */
++    float sensitivity;      /*!< Sensitivity of the sensor */
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++} ia_ccat_motion_sensor_event;
++
++/*!
++ * \brief Ambient Light Events
++ * NOTE: This should always match to libsensorhub API
++ * TODO: Update the structure according to the API
++ */
++typedef struct ia_ccat_ambient_light_event
++{
++    unsigned long long ts;  /*!< Time stamp in usec (microseconds) */
++    float data;             /*!< Ambient Light data ? */
++    float sensitivity;      /*!< Sensitivity of Ambient Light sensor */
++    unsigned long long fs;  /*!< Frame stamp in usec (microseconds) */
++} ia_ccat_ambient_light_event;
++
++#if 0
++/*!
++ * \brief Face rectangle
++ * Range of rectangle values is defined in ia_coordinate.h:
++ * IA_COORDINATE_TOP, IA_COORDINATE_LEFT, IA_COORDINATE_BOTTOM, IA_COORDINATE_RIGHT
++ */
++typedef struct ia_face_roi
++{
++    int tracking_id;                   /*!< Tracking id of the face. */
++    ia_rectangle face_area;            /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
++    ia_coordinate mouth;               /*!< Mid-point of the mouth. */
++    ia_coordinate left_eye;            /*!< Left eye */
++    ia_coordinate right_eye;           /*!< Right eye */
++    bool eye_validity;                 /*!< Indicates whether a face was processed to get eye positions */
++    float skin_type_dark_likelihood;   /*!< Likelihood of skin type being dark [0.0, 1.0]. Bright skin likelihood = 1.0 - dark_skin_type_likelihood */
++    bool skin_type_validity;           /*!< Indicates whether a face was processed to get skin likelihood */
++} ia_face_roi;
++#endif
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_CCAT_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
+new file mode 100644
+index 000000000000..5ac33fcda4e7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
+@@ -0,0 +1,47 @@
++/*
++ * Copyright 2012-2017 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_cmc_parser.h
++ * \brief Parser for CMC data.
++*/
++
++
++#ifndef IA_CMC_PARSER_H_
++#define IA_CMC_PARSER_H_
++
++#include "ia_types.h"
++#include "ia_cmc_types.h"
++#include "ia_nvm.h"
++#include "ia_cmc_parser_deprecated.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++LIBEXPORT ia_cmc_t*
++ia_cmc_parser_init_v1(
++    const ia_binary_data *a_aiqb_binary,
++    const ia_binary_data *a_nvm_data);
++
++LIBEXPORT void
++ia_cmc_parser_deinit(ia_cmc_t *ia_cmc);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_CMC_PARSER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
+new file mode 100644
+index 000000000000..db376484a598
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
+@@ -0,0 +1,42 @@
++/*
++ * Copyright 2012-2017 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_cmc_parser.h
++ * \brief Parser for CMC data.
++*/
++
++
++#ifndef IA_CMC_PARSER_DEPRECATED_H_
++#define IA_CMC_PARSER_DEPRECATED_H_
++
++#include "ia_types.h"
++#include "ia_cmc_types.h"
++#include "ia_nvm.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++LIBEXPORT ia_cmc_t*
++ia_cmc_parser_init(
++    const ia_binary_data *a_aiqb_binary);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_CMC_PARSER_DEPRECATED_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
+new file mode 100644
+index 000000000000..921a08ac1a51
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
+@@ -0,0 +1,1471 @@
++/*
++ * Copyright 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_cmc_types.h
++ * \brief Definitions of Camera Module Characterization (CMC) records.
++*/
++
++#ifndef IA_CMC_TYPES_H_
++#define IA_CMC_TYPES_H_
++
++#include "ia_mkn_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* All CMC records are inside AIQB record in CPFF file. */
++#define AIQB_TAG IA_MKN_CHTOUL('A','I','Q','B')  /*!< AIQ configuration block tag. */
++
++/*
++ * Color Channels (1-4) refer to Raw Bayer quad in the following order.
++ * -------------
++ * | CC1 | CC2 |
++ * -------------
++ * | CC3 | CC4 |
++ * -------------
++ *
++ * Structures defined in this header file, which are stored into memory/file must start from 64 bit boundary (for 64 bit systems).
++ * Keep in mind also structures' internal padding when defining new structures.
++ */
++#define CMC_NUM_CHANNELS 4
++
++typedef struct
++{
++    uint16_t cc1;
++    uint16_t cc2;
++    uint16_t cc3;
++    uint16_t cc4;
++} cmc_color_channels;
++
++/*!
++ * \brief CIE x and Y coordinates.
++ */
++typedef struct
++{
++    uint16_t x;
++    uint16_t y;
++} cie_coords_t;
++
++/*!
++ * \brief R/G and B/G ratios.
++ */
++typedef struct
++{
++    uint16_t r_per_g;
++    uint16_t b_per_g;
++} chromaticity_t;
++
++/*!
++ * \brief Physical pixel coordinates.
++ */
++typedef struct
++{
++    uint16_t x;
++    uint16_t y;
++} cmc_coords;
++
++/*!
++ * \brief Chromaticity coordinates in CIE 1931 space.
++ */
++typedef struct
++{
++    float x;
++    float y;
++} cmc_cie_coords;
++
++/*!
++ * \brief Chromaticity coordinates in R/G & B/G space.
++ */
++typedef struct
++{
++    float r_per_g;
++    float b_per_g;
++} cmc_chromaticity;
++
++/*!
++* \brief 3x3 color matrix.
++*/
++typedef struct
++{
++    float matrix[3][3];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
++} cmc_color_matrix;
++
++/*!
++ * \brief Raw image bayer order.
++ */
++typedef enum
++{
++    cmc_bayer_order_2x2,                            /*!< Start of enumerations for 2x2 bayer types. */
++    cmc_bayer_order_grbg = cmc_bayer_order_2x2,     /*!< First row contains pixels Gr, R. Second row contains pixels B, Gb. */
++    cmc_bayer_order_rggb,                           /*!< First row contains pixels R, Gr. Second row contains pixels Gb, B. */
++    cmc_bayer_order_bggr,                           /*!< First row contains pixels B, Gb. Second row contains pixels Gr, R. */
++    cmc_bayer_order_gbrg,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, Gr. */
++    cmc_bayer_order_grbi,                           /*!< First row contains pixels Gr, R. Second row contains pixels B, IR. */
++    cmc_bayer_order_irbg,                           /*!< First row contains pixels IR, R. Second row contains pixels B, Gb. */
++    cmc_bayer_order_rgib,                           /*!< First row contains pixels R, Gr. Second row contains pixels IR, B. */
++    cmc_bayer_order_rigb,                           /*!< First row contains pixels R, IR. Second row contains pixels Gb, B. */
++    cmc_bayer_order_bgir,                           /*!< First row contains pixels B, Gb. Second row contains pixels IR, R. */
++    cmc_bayer_order_bigr,                           /*!< First row contains pixels B, IR. Second row contains pixels Gr, R. */
++    cmc_bayer_order_gbri,                           /*!< First row contains pixels Gb, B. Second row contains pixels R, IR. */
++    cmc_bayer_order_ibrg,                           /*!< First row contains pixels IR, B. Second row contains pixels R, Gr. */
++    cmc_bayer_order_4x2 = 128,                      /*!< Start of enumerations for 4x2 bayer types. */
++    cmc_bayer_order_2pd_grbg = cmc_bayer_order_4x2, /*!< Two photodiodes per pixel in Gr, R, B, Gb order (4x2). */
++    cmc_bayer_order_2pd_rggb,                       /*!< Two photodiodes per pixel in R, Gr, Gb, B order (4x2). */
++    cmc_bayer_order_2pd_bggr,                       /*!< Two photodiodes per pixel in B, Gb, Gr, R order (4x2). */
++    cmc_bayer_order_2pd_gbrg,                       /*!< Two photodiodes per pixel in Gb, B, R, Gr order (4x2). */
++    cmc_bayer_order_4x4 = 256,                      /*!< Start of enumerations for 4x4 bayer types. */
++    cmc_bayer_order_bgrg_gigi_rgbg_gigi = cmc_bayer_order_4x4, /*!< Order: 1st row: B G R G, 2nd row: G I G I, 3rd row: R G B G, 4th row: G I G I (4x4). */
++    cmc_bayer_order_grgb_igig_gbgr_igig,                       /*!< Order: 1st row: G R G B, 2nd row: I G I G, 3rd row: G B G R, 4th row: I G I G (4x4). */
++    cmc_bayer_order_rgbg_gigi_bgrg_gigi,                       /*!< Order: 1st row: R G B G, 2nd row: G I G I, 3rd row: B G R G, 4th row: G I G I (4x4). */
++    cmc_bayer_order_gbgr_igig_grgb_igig,                       /*!< Order: 1st row: G B G R, 2nd row: I G I G, 3rd row: G R G B, 4th row: I G I G (4x4). */
++    cmc_bayer_order_gigi_rgbg_gigi_bgrg,                       /*!< Order: 1st row: G I G I, 2nd row: R G B G, 3rd row: G I G I, 4th row: B G R G (4x4). */
++    cmc_bayer_order_igig_gbgr_igig_grgb,                       /*!< Order: 1st row: I G I G, 2nd row: G B G R, 3rd row: I G I G, 4th row: G R G B (4x4). */
++    cmc_bayer_order_gigi_bgrg_gigi_rgbg,                       /*!< Order: 1st row: G I G I, 2nd row: B G R G, 3rd row: G I G I, 4th row: R G B G (4x4). */
++    cmc_bayer_order_igig_grgb_igig_gbgr                        /*!< Order: 1st row: I G I G, 2nd row: G R G B, 3rd row: I G I G, 4th row: G B G R (4x4). */
++} cmc_bayer_order;
++
++/*!
++ * \brief Color space definitions.
++ */
++typedef enum
++{
++    cmc_color_space_srgb,
++    cmc_color_space_bt601,
++    cmc_color_space_bt709,
++    cmc_color_space_bt2020,
++    cmc_color_space_bt2100_rgb,
++    cmc_color_space_bt2100_lms,
++    cmc_color_space_dci_p3,
++    cmc_color_space_adobergb,
++} cmc_color_space;
++
++/*!
++ * \brief CMC names used in the record headers.
++ */
++typedef enum
++{
++    cmc_name_id_reserved = 0,                            /*!< 00 */
++    cmc_name_id_comment,                                 /*!< 01 */
++    cmc_name_id_general_data,                            /*!< 02 */
++    cmc_name_id_black_level,                             /*!< 03 */
++    cmc_name_id_black_level_spatial,                     /*!< 04 */
++    cmc_name_id_saturation_level,                        /*!< 05 */
++    cmc_name_id_dynamic_range_and_linearity,             /*!< 06 */
++    cmc_name_id_module_sensitivity,                      /*!< 07 */
++    cmc_name_id_defect_pixels,                           /*!< 08 */
++    cmc_name_id_noise,                                   /*!< 09 */
++    cmc_name_id_lens_shading_correction,                 /*!< 10 */
++    cmc_name_id_lens_shading_correction_ratio,           /*!< 11 */
++    cmc_name_id_geometric_distortion_correction,         /*!< 12 */
++    cmc_name_id_optics_and_mechanics,                    /*!< 13 */
++    cmc_name_id_module_spectral_response,                /*!< 14 */
++    cmc_name_id_chromaticity_response,                   /*!< 15 */
++    cmc_name_id_flash_chromaticity,                      /*!< 16 */
++    cmc_name_id_nvm_info,                                /*!< 17 */
++    cmc_name_id_color_matrices,                          /*!< 18 */
++    cmc_name_id_analog_gain_conversion,                  /*!< 19 DEPRECATED */
++    cmc_name_id_digital_gain,                            /*!< 20 */
++    cmc_name_id_sensor_metadata,                         /*!< 21 */
++    cmc_name_id_geometric_distortion_correction2,        /*!< 22 */
++    cmc_name_id_exposure_range,                          /*!< 23 */
++    cmc_name_id_multi_led_flash_chromaticity,            /*!< 24 */
++    cmc_name_id_advanced_color_matrices,                 /*!< 25 */
++    cmc_name_id_hdr,                                     /*!< 26 */
++    cmc_name_id_infrared_correction,                     /*!< 27 */
++    cmc_name_id_lens_shading_correction_4x4,             /*!< 28 */
++    cmc_name_id_lateral_chromatic_aberration_correction, /*!< 29 */
++    cmc_name_id_phase_difference,                        /*!< 30 */
++    cmc_name_id_black_level_global,                      /*!< 31 */
++    cmc_name_id_valid_image_area,                        /*!< 32 */
++    cmc_name_id_lens_shading_correction_4x4_ratio,       /*!< 33 */
++    cmc_name_id_multi_gain_conversions,                  /*!< 34 */
++} cmc_name_id;
++
++/*!
++ * \brief Camera features flags (see cmc_optomechanics_t.camera_features).
++ * Bit '1' means that the feature is presented.
++ */
++typedef enum {
++    cmc_camera_feature_lens_position_sensor        = 1,            /*!< Physical Lens Position sensor */
++    cmc_camera_feature_voice_coil_actuator         = (1 << 1),     /*!< 'Voice Coil' type of lens actuator */
++    cmc_camera_feature_hybrid_voice_coil_actuator  = (1 << 2),     /*!< 'Hybrid Voice Coil' type of lens actuator */
++    cmc_camera_feature_piezo_actuator              = (1 << 3),     /*!< 'Piezo' type of lens actuator */
++    cmc_camera_feature_mems_actuator               = (1 << 4),     /*!< 'MEMS' type of lens actuator */
++    cmc_camera_feature_nd_filter                   = (1 << 5),     /*!< Neutral Density filter */
++    cmc_camera_feature_mechanical_shutter          = (1 << 6),     /*!< Mechanical Shutter */
++    cmc_camera_feature_variable_apertures          = (1 << 7),     /*!< Variable Apertures */
++    cmc_camera_feature_optical_zoom                = (1 << 8)      /*!< Optical Zoom */
++} cmc_camera_feature;
++
++/*!
++ * \brief Camera module orientation
++ */
++typedef enum {
++    cmc_camera_orientation_down = 0,            /*!< Camera module is pointing down */
++    cmc_camera_orientation_horizontally,        /*!< Camera module is pointing horizontally */
++    cmc_camera_orientation_up                   /*!< Camera module is pointing up */
++} cmc_camera_orientation;
++
++/*!
++ * \brief LSC level enumeration.
++ */
++typedef enum {
++    cmc_lsc_force_first_grid = 0,           /*!< Use always first LSC grid */
++    cmc_lsc_without_nvm,                    /*!< Use LSC adaptation without NVM */
++    cmc_lsc_with_nvm                        /*!< Use LSC adaptation with NVM */
++} cmc_lsc_level;
++
++/*!
++ * \brief Shading Adaptor Level enumeration.
++ */
++typedef enum {
++    cmc_sa_disable = 0,                     /*!< Do not apply shading tables (bypass LSC) */
++    cmc_sa_cct_based,                       /*!< Use CCT based LSC selection */
++    cmc_sa_adaptive,                        /*!< Use adaptive LSC selection */
++    cmc_sa_self_adjusting                   /*!< Use module variation correcting LSC */
++} cmc_sa_level;
++
++/*!
++ * \brief Light source enumeration
++ */
++typedef enum {
++    cmc_light_source_none = 0,           /*!< Light source N/A */
++    cmc_light_source_a,                  /*!< Incandescent / Tungsten */
++    cmc_light_source_b,                  /*!< Obsolete. Direct sunlight at noon */
++    cmc_light_source_c,                  /*!< Obsolete. Average / north sky daylight */
++    cmc_light_source_d50,                /*!< Horizon light. ICC profile PCS */
++    cmc_light_source_d55,                /*!< Mid-morning / mid-afternoon daylight */
++    cmc_light_source_d65,                /*!< Noon daylight. Television, sRGB color space */
++    cmc_light_source_d75,                /*!< North sky daylight */
++    cmc_light_source_e,                  /*!< Equal energy */
++    cmc_light_source_f1,                 /*!< Daylight fluorescent */
++    cmc_light_source_f2,                 /*!< Cool white fluorescent */
++    cmc_light_source_f3,                 /*!< White fluorescent */
++    cmc_light_source_f4,                 /*!< Warm white fluorescent */
++    cmc_light_source_f5,                 /*!< Daylight fluorescent */
++    cmc_light_source_f6,                 /*!< Lite white fluorescent */
++    cmc_light_source_f7,                 /*!< D65 simulator, daylight simulator */
++    cmc_light_source_f8,                 /*!< D50 simulator, Sylvania F40 Design 50 */
++    cmc_light_source_f9,                 /*!< Cool white deluxe fluorescent */
++    cmc_light_source_f10,                /*!< Philips TL85, Ultralume 50 */
++    cmc_light_source_f11,                /*!< Philips TL84, Ultralume 40 */
++    cmc_light_source_f12,                /*!< Philips TL83, Ultralume 30 */
++    cmc_light_source_hz,                 /*!< Horizon IR */
++    cmc_light_source_a_md,               /*!< A - Incandescent / Tungsten Medium light */
++    cmc_light_source_a_lw,               /*!< A - Incandescent / Tungsten Low light */
++} cmc_light_source;
++#define CMC_NUM_LIGHTSOURCES 24u
++
++/*!
++ * \brief PD sensor type enumeration.
++ */
++typedef enum {
++    cmc_pd_sensor_type_non_pd = 0,        /*!< Non-PD sensor */
++    cmc_pd_sensor_type_1,                 /*!< Type 1 (All processing done on sensor) */
++    cmc_pd_sensor_type_2,                 /*!< Type 2 (PD extraction on sensor, statistics processing in IPU) */
++    cmc_pd_sensor_type_3                  /*!< Type 3 (All processing done in IPU) */
++} cmc_pd_sensor_type;
++
++/*!
++ * \brief PD technology type enumeration.
++ */
++typedef enum {
++    cmc_pd_technology_type_metal_shield = 0,        /*!< Metal shield-based PD */
++    cmc_pd_technology_type_dual_photodiode,         /*!< Dual photodiode-based PD */
++    cmc_pd_technology_type_wide_microlens           /*!< Wide microlens-based PD */
++} cmc_pd_technology_type;
++
++/*!
++ * \brief CMC gdc mode type enumeration.
++ */
++typedef enum {
++    cmc_gdc_mode_grid,    /*!< CMC GDC Grid mode */
++    cmc_gdc_mode_lut,     /*!< CMC GDC Look-up Table mode */
++    cmc_gdc_mode_extlut   /*!< CMC GDC Look-up Table from External Tool mode */
++} cmc_gdc_mode_type;
++
++/*!
++ * \brief CMC Comment
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: UInt8 (See AIQB_DataID), Name ID: cmc_name_id_comment (See cmc_name_id). */
++    uint8_t project_id[16];      /*!< NULL terminated Project ID string. Date format: yymmddHHMMSSFFF. For example: 1202201823444. */
++/*    uint8_t comment[];          / *!< Free C string text comment (NULL terminated). Must end at 64 bit alignment. * / */
++} cmc_comment_t;
++#define SIZEOF_CMC_COMMENT_T 24
++
++/*!
++ * \brief CMC General Data
++ */
++typedef struct
++{
++    ia_mkn_record_header header;        /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_general_data. (enum cmc_name_id). */
++    uint16_t width;                     /*!< Sensor native maximum width. */
++    uint16_t height;                    /*!< Sensor native maximum height. */
++    uint16_t bit_depth;                 /*!< Sensor native maximum bit depth (after sensor linearization). For HDR sensor, this is the bit depth after stitching. */
++    uint16_t color_order;               /*!< Sensor color order in native orientation. */
++    uint16_t bit_depth_packed;          /*!< Sensor native maximum bit depth (before sensor linearization = packed) . */
++    uint8_t sve_pattern[16];            /*!< 4x4 pixel pattern. 0 means shortest exposure time and n the longest. */
++    uint16_t single_exposure_bit_depth; /*!< Sensor native maximum bit depth for single (non-stitched) exposure. */
++} cmc_general_data_t;
++#define SIZEOF_CMC_GENERAL_DATA_V100_T 16
++#define SIZEOF_CMC_GENERAL_DATA_V101_T 18
++#define SIZEOF_CMC_GENERAL_DATA_V102_T 34
++#define SIZEOF_CMC_GENERAL_DATA_V103_T 36
++
++/*!
++ * \brief CMC Black Level
++ * - Global black level compensation.
++ */
++typedef struct
++{
++    uint32_t exposure_time;              /*!< Exposure time. */
++    uint32_t analog_gain;                /*!< Analog gain. */
++    cmc_color_channels color_channels;     /*!< Color channel correction for given exposure time and analog gain. */
++} cmc_black_level_lut_t;
++#define SIZEOF_CMC_BLACK_LEVEL_LUT_T 16
++
++typedef struct
++{
++    ia_mkn_record_header header;     /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_black_level. (enum cmc_name_id). */
++    uint32_t num_bl_luts;            /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
++/*    cmc_black_level_lut_t bl_luts[]; / *!< Lookup tables for black level correction. * / */
++} cmc_black_level_t;
++#define SIZEOF_CMC_BLACK_LEVEL_T 12
++
++/*!
++* \brief CMC for global black Level
++* - Global black level compensation for 4x4 sensors.
++*/
++typedef struct
++{
++    uint32_t exposure_time;         /*!< Exposure time in microseconds. */
++    float total_gain;               /*!< Total gain (including both analog and digital gains). */
++    float black_level[4][4];        /*!< Black level correction for given exposure time and total gain. */
++} cmc_black_level_values;
++
++typedef struct
++{
++    ia_mkn_record_header header;             /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_black_level_global (See cmc_name_id). */
++    uint32_t num_bl_luts;                    /*!< Number of black level lookup tables (number of analog gain * number of exposures).  */
++    uint32_t padding;                        /* Ensures that next 64 bit variable starts from 64 bit boundary. */
++    union {
++        cmc_black_level_values *ptr;         /*!< Array of global black level values as function of exposure time and gain. Array length is defined by num_bl_luts. */
++        uint64_t dummy;                      /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } bl_values;
++} cmc_black_level_global;
++
++/*!
++ * \brief CMC Saturation Level
++ * - Defined for each color channels.
++ * - Absolute pixel values using native max bit depth.
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID) Name ID: cmc_name_id_saturation_level. (enum cmc_name_id). */
++    uint16_t saturation_cc1;     /*!< Saturation level of 1st color channel. */
++    uint16_t saturation_cc2;     /*!< Saturation level of 2nd color channel. */
++    uint16_t saturation_cc3;     /*!< Saturation level of 3rd color channel. */
++    uint16_t saturation_cc4;     /*!< Saturation level of 4th color channel. */
++} cmc_saturation_level_t;
++#define SIZEOF_CMC_SATURATION_LEVEL_T 16
++
++/*!
++ * \brief CMC Pixel Dynamic Range And Linearity
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID) Name ID: cmc_name_id_dynamic_range_and_linearity. (enum cmc_name_id). */
++    uint32_t dynamic_range;      /*!< Pixel dynamic range in dB. */
++    uint8_t num_linearity_cc1;   /*!< Number of points in color channel 1 linearity lookup table. */
++    uint8_t num_linearity_cc2;   /*!< Number of points in color channel 2 linearity lookup table. */
++    uint8_t num_linearity_cc3;   /*!< Number of points in color channel 3 linearity lookup table. */
++    uint8_t num_linearity_cc4;   /*!< Number of points in color channel 4 linearity lookup table. */
++/*    uint16_t lut_linearities[]; / *!< Linearity lookup table for color channels in order: Ch1, Ch2, Ch3 and Ch4. * / */
++} cmc_linearity_t;
++#define SIZEOF_CMC_LINEARITY_T 16
++
++/*!
++ * \brief CMC Module Sensitivity
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_sensitivity (See cmc_name_id). */
++    uint16_t base_iso;           /*!< Base ISO value of the camera module. */
++} cmc_sensitivity_t;
++#define SIZEOF_CMC_SENSITIVITY_T 10
++
++/*!
++ * \brief CMC Defect Pixels
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: ??? (See AIQB_DataID), Name ID: cmc_name_id_defect_pixels (See cmc_name_id). */
++    uint16_t not_defined;        /*!<  */
++} cmc_defect_pixel_t;
++#define SIZEOF_CMC_DEFECT_PIXEL_T 10
++
++/*!
++ * \brief CMC Noise
++ */
++typedef struct
++{
++    ia_mkn_record_header header;       /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_noise (See cmc_name_id). */
++    float noise_model_coefficients[5]; /*!< Noise model coefficients (c1..5) in equation y = c1*x^2 + Gain*c2*x + Gain^2*c3 + Gain*c4 + c5.
++                                            Gain is sum of gain applied to pixel (DG and AG), x is the normalized mean (pixel value), and y is the variance. */
++    int reserved;                      /*!< Reserved for alignment. Always 0. */
++} cmc_noise;
++
++typedef struct
++{
++    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
++    uint16_t correction_level; /*!< Luminance correction level. */
++    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
++/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
++} cmc_lsc_grid_t;
++#define SIZEOF_CMC_LSC_GRID_T 8
++
++/*!
++ * \brief CMC_Lens Shading Correction
++ * - Full native FOV
++ * - Absolute gain values
++ * - 100% color shading correction
++ * - x% grid "divided by" NVM_calibration_grid (=ratio) - if no NVM use ones
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction (See cmc_name_id). */
++    uint16_t lsc_level;          /*!< LSC level enumeration. */
++    uint16_t num_grids;          /*!< Number of LSC grids. */
++    uint16_t grid_width;         /*!< LSC Grid width. */
++    uint16_t grid_height;        /*!< LSC Grid height. */
++/*  cmc_lsc_grid_t lsc_grids[]; / *!< LSC grids. * / */
++} cmc_lens_shading_t;
++#define SIZEOF_CMC_LENS_SHADING_T 16
++
++typedef struct
++{
++    uint16_t pair_index;       /*!< Calibration light source pair index. */
++    uint16_t source_type;      /*!< Light source type (enum), e.g. Fluorescent. */
++    uint16_t correction_level; /*!< Luminance correction level. */
++    cie_coords_t cie_coords;   /*!< CIE x and y coordinates. */
++/*    uint16_t lsc_grid[];       / *!< LSC Grid. * / */
++} cmc_lsc_ratio_grid_t;
++#define SIZEOF_CMC_LSC_RATIO_GRID_T 10
++
++/*!
++ * \brief Lens Shading Correction Ratio
++ */
++typedef struct
++{
++    ia_mkn_record_header header;      /*!< Record header with Format ID: Custom (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_ratio (See cmc_name_id). */
++    uint16_t num_grids;               /*!< Number of LSC grids. */
++    uint16_t grid_width;              /*!< LSC Grid width. */
++    uint16_t grid_height;             /*!< LSC Grid height. */
++/*    cmc_lsc_ratio_grid_t lsc_grids[]; / *!< LSC grids. * / */
++} cmc_lens_shading_ratio_t;
++#define SIZEOF_CMC_LENS_SHADING_RATIO_T 14
++
++/*!
++ * \brief CMC Geometric Distortion Correction
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: Float (See AIQB_DataID), Name ID: cmc_name_id_geometric_distortion_correction (See cmc_name_id). */
++    float gdck1;                 /*!<  1st order radial distortion coefficient. */
++    float gdck2;                 /*!<  2nd order radial distortion coefficient. */
++    float gdck3;                 /*!<  3rd order radial distortion coefficient. */
++    float gdcp1;                 /*!<  1st order tangential distortion coefficient. */
++    float gdcp2;                 /*!<  2nd order tangential distortion coefficient. */
++} cmc_geometric_distortion_t;
++#define SIZEOF_CMC_GEOMETRIC_DISTORTION_T 28
++
++/*!
++ * \brief CMC Optics and Mechanics
++ */
++typedef struct
++{
++    ia_mkn_record_header header;                         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_optics_and_mechanics (See cmc_name_id). */
++    uint8_t actuator;                                    /*!< Actuator type (enum). */
++    uint8_t camera_module_orientation;                   /*!< Camera module orientation during the AF calibration (enum from Camera Module Orientation). */
++    uint16_t camera_actuator_features;                   /*!< Camera features list (flags from cmc_camera_feature enumeration). */
++    uint16_t nd_gain;                                    /*!< Neutral density filter gain. */
++    uint16_t effect_focal_length;                        /*!< Effective Focal Length, (mm * 100). */
++    uint16_t sensor_pix_size_v;                          /*!< Sensor pixel size Vertical, (um * 100). */
++    uint16_t sensor_pix_size_h;                          /*!< Sensor pixel size Horizontal, (um * 100). */
++    uint16_t sensor_width_pix_total;                     /*!< Sensor width in pixels, total. */
++    uint16_t sensor_height_pix_total;                    /*!< Sensor height in pixels, total. */
++    uint16_t lens_offset_up_to_horz;                     /*!< Lens displacement when module turns from Up to Horizontal, (um). */
++    uint16_t lens_offset_horz_to_down;                   /*!< Lens displacement when module turns from Horizontal to Down, (um). */
++    uint16_t range_inf_to_85mm;                          /*!< Optical range 'Inf - 8.5 cm', (um). */
++    uint16_t range_inf_to_100mm;                         /*!< Optical range 'Inf - 10 cm', (um). */
++    uint16_t range_inf_to_300mm;                         /*!< Optical range 'Inf - 30 cm', (um). */
++    uint16_t range_inf_to_500mm;                         /*!< Optical range 'Inf - 50 cm', (um). */
++    uint16_t range_inf_to_950mm;                         /*!< Optical range 'Inf - 95 cm', (um). */
++    uint16_t range_inf_to_1200mm;                        /*!< Optical range 'Inf - 120 cm', (um). */
++    uint16_t range_inf_to_hyperfocal;                    /*!< Optical range 'Inf - Hyperfocal', (um). */
++    uint16_t range_inf_to_calibration_distance_far;      /*!< Optical range 'Inf - calibration distance far', (um). */
++    uint16_t range_inf_to_calibration_distance_near;     /*!< Optical range 'Inf - calibration_distance_near', (um). */
++    uint16_t range_inf_to_min_focusing_distance;         /*!< Optical range 'Inf - calibration_distance_near', (um). */
++    uint16_t calibration_distance_far;                   /*!< Distance to supplier's FAR production calibration target, (cm). */
++    uint16_t calibration_distance_near;                  /*!< Distance to supplier's NEAR production calibration target, (cm). */
++    int16_t calibration_position_far;                    /*!< Supplier's FAR production calibration target in ACTUATOR UNITS, default (used in case NVM is not available).*/
++    int16_t calibration_position_near;                   /*!< Supplier's NEAR production calibration target in ACTUATOR UNITS,  default (used in case NVM is not available).*/
++    int32_t lens_range_limit;                            /*!< Maximum available value for the lens actuator. */
++    int32_t lens_actuator_offset;                        /*!< Permanent offset to lens actuator values. */
++    uint32_t lens_movement_time;                         /*!< Time (in us) needed to move the lens per single VC unit (if linear_lens_movement_time is 1). Total time needed per one lens move (if linear_lens_movement_time is 0)*/
++    uint16_t min_focus_distance;                         /*!< Minimum focusing distance, (cm). */
++    uint16_t num_apertures;                              /*!< Actual number of apertures, presented in camera. */
++} cmc_optomechanics_t;
++#define SIZEOF_CMC_OPTOMECHANICS    72
++
++/*!
++ * \brief CMC Module Spectral Response
++ */
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_module_spectral_response (See cmc_name_id). */
++    uint16_t min_wavelength;              /*!< Minimum wave length. */
++    uint16_t max_wavelength;              /*!< Maximum wave length. */
++    uint16_t wavelength_sampling_rate;    /*!< Wave length sampling rate. */
++/*    cmc_color_channels spectral_response[]; / *!< Module spectral response in order: Ch1,Ch2,Ch3 and Ch4. * / */
++} cmc_spectral_response_t;
++#define SIZEOF_CMC_SPECTRAL_RESPONSE 14
++
++/*!
++ * \brief Lightsource definition.
++ */
++typedef struct
++{
++    cie_coords_t cie_coords;           /*!< Light source CIE xy coordinates. */
++    chromaticity_t chromaticity_response; /*!< Avg Chromaticity response for R/G anf B/G.*/
++} cmc_lightsource_t;
++#define SIZEOF_CMC_LIGHTSOURCE_T 8
++
++/*!
++ * \brief CMC Chromaticity Response
++ */
++typedef struct
++{
++    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_chromaticity_response (See cmc_name_id). */
++    uint16_t num_lightsources;        /*!< Number of avg light sources. */
++    uint16_t num_nvm_lightsources;    /*!< Number of nvm light sources. */
++/*  cmc_lightsource_t lightsources[]; / *!< Lightsources in the order: avg, high and low. * / */
++} cmc_chromaticity_response_t;
++#define SIZEOF_CMC_CHROMATICITY_RESPONSE 12
++
++/*!
++ *  \brief Flash chromaticity responses for a point.
++ */
++typedef struct
++{
++    chromaticity_t flash_chromaticity_response;    /*!< Flash Chromaticity response, R/G and B/G */
++} cmc_poly_point_t;
++#define SIZEOF_CMC_POLY_POINT_T 4
++
++/*!
++ * \brief CMC Flash Chromaticity
++ */
++typedef struct
++{
++    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_flash_chromaticity (See cmc_name_id). */
++    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
++    uint16_t num_poly_points;           /*!< Number of points defining polygon. */
++/*    cmc_poly_point_t poly_point[];    / *!< Flash Chromaticity Deviation in R/G, B/G plane. * / */
++} cmc_flash_chromaticity_t;
++#define SIZEOF_CMC_FLASH_CHROMATICITY_T 14
++
++typedef struct
++{
++    cmc_light_source light_src_type; /*!< Light-source type. See enum cmc_light_source.  */
++    chromaticity_t chromaticity;     /*!< Chromaticity (sensor) in R/G, B/G plane. */
++    cie_coords_t cie_coords;      /*!< CIE x and y coordinates. */
++    int32_t matrix_accurate[9];   /*!< 3x3 accurate CCM, each 3 consequtive elemets sum to 1. */
++    int32_t matrix_preferred[9];  /*!< 3x3 preferred CCM, each 3 consequtive elemets sum to 1. */
++} cmc_color_matrix_t;
++#define SIZEOF_CMC_COLOR_MATRIX_T 84
++
++/*!
++ * \brief CMC Color matrices
++ */
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_color_matrices (See cmc_name_id). */
++    uint16_t num_matrices;               /*!< Number of color matrices. */
++/*    cmc_color_matrix_t color_matrices[]; / *!< Color matrices. * / */
++} cmc_color_matrices_t;
++#define SIZEOF_CMC_COLOR_MATRICES_T 10
++/*!
++ * \brief CMC NVM Info
++ */
++typedef struct
++{
++    ia_mkn_record_header header;      /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_nvm_info (See cmc_name_id). */
++    uint16_t nvm_parser_version;      /*!< Parser version for current camera module type */
++    uint16_t nvm_data_color_order;    /*!< NVM data color order */
++    uint16_t nvm_data_orientation;    /*!< NVM data orientation */
++} cmc_nvm_info_t;
++#define SIZEOF_CMC_NVM_INFO_T 14
++
++/*!
++ * \brief CMC NVM Info v101
++ */
++typedef struct
++{
++    uint16_t nvm_scaling_method;        /*!< NVM table scaling method. */
++} cmc_nvm_info_v101_t;
++#define SIZEOF_CMC_NVM_INFO_V101_T   2
++
++typedef struct
++{
++    cmc_nvm_info_t *cmc_nvm_info;           /*!< CMC NVM info data. */
++    cmc_nvm_info_v101_t *cmc_nvm_info_v101; /*!< CMC NVM info data v101. */
++} cmc_parsed_nvm_info_t;
++
++/*!
++ * \brief Analog gain to gain code mapping.
++ * Gains must be defined in ascending order.
++ */
++typedef struct
++{
++    uint32_t gain;                 /*!< Gain in fixed point format (16bit integer part + 16bit fraction part). */
++    uint32_t code;                 /*!< Code corresponding to gain. */
++} cmc_analog_gain_pair_t;
++#define SIZEOF_CMC_ANALOG_GAIN_PAIR_T 8
++
++/*!
++ * \brief Analog gain to gain code mapping of a segment.
++ * Segments contain SMIA analog gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
++ * For example analog gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Analog gain 2.0 is not calculated from the first range parameters but from the second range.
++ */
++typedef struct
++{
++    uint32_t gain_begin;         /*!< Begin of gain of the segment (inclusive) in fixed point format (16bit integer part + 16bit fraction part). */
++    uint32_t gain_end;           /*!< End of gain of the segment (exclusive) in fixed point format (16bit integer part + 16bit fraction part). */
++    uint32_t code_min;           /*!< The minimum recommended setting for the analog gain control. */
++    uint32_t code_max;           /*!< The maximum recommended setting for the analog gain control. */
++    uint32_t code_step;          /*!< The precision of the analog gain control. */
++    int16_t M0;                  /*!< Gain code M0 as in SMIA. */
++    int16_t C0;                  /*!< Gain code C0 as in SMIA. */
++    int16_t M1;                  /*!< Gain code M1 as in SMIA. */
++    int16_t C1;                  /*!< Gain code C1 as in SMIA. */
++} cmc_analog_gain_segment_t;
++#define SIZEOF_CMC_ANALOG_GAIN_SEGMENT_T 28
++
++/*!
++ * \brief CMC Analog gain conversion types
++ * Enum defines different analog gain conversion types.
++ */
++typedef enum
++{
++    cmc_analog_gain_conversion_type_none,    /*!< No analog gain conversion should be done. */
++    cmc_analog_gain_conversion_type_segment, /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of analog gain. */
++    cmc_analog_gain_conversion_type_pair,    /*!< Pairs contain analog gain value & corresponding register value. */
++} cmc_analog_gain_conversion_type_t;
++
++/*!
++ * \brief CMC Analog gain conversion table
++ * Analog gain can be represented with n amount of gain code (register value) pairs/segments.
++ */
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_analog_gain_conversion (See cmc_name_id). */
++    uint16_t conversion_type;            /*!< Analog gain conversion type.  See cmc_analog_gain_conversion_type_t. */
++    uint16_t reserved;                   /*!< Reserved due to byte alignment. */
++    uint16_t num_segments;               /*!< Number of gain/code segments which describe the analog gain. */
++    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the analog gain. */
++/*    cmc_analog_gain_segment_t gain_segments[]; */
++/*    cmc_analog_gain_pair_t gain_pairs[]; */
++} cmc_analog_gain_conversion_t;
++#define SIZEOF_CMC_ANALOG_GAIN_CONVERSION_T 16
++
++/*!
++ * \brief CMC Digital gain conversion types
++ * Enum defines different digital gain conversion types.
++ */
++typedef enum
++{
++    cmc_digital_gain_conversion_type_fixed_point, /*!< Digital gain is defined in fixed point format. */
++    cmc_digital_gain_conversion_type_pair,        /*!< Pairs contain digital gain value & corresponding register value. */
++} cmc_digital_gain_conversion_type_t;
++
++/*!
++ * \brief CMC digital gain limits and step.
++ */
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_digital_gain (See cmc_name_id). */
++    uint16_t digital_gain_min;           /*!< The minimum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
++    uint16_t digital_gain_max;           /*!< The maximum valid limit of the digital gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
++    uint8_t digital_gain_step_size;      /*!< Step size of digital gain code register value. */
++    uint8_t digital_gain_fraction_bits;  /*!< Number of bits used for the fraction part of the 16 bit register value. */
++/*    cmc_digital_gain_v102_t dg_v102; */
++/*    cmc_analog_gain_pair_t dg_pairs[];*/
++} cmc_digital_gain_t;
++#define SIZEOF_CMC_DIGITAL_GAIN_T 14
++
++/*!
++ * \brief Defines additions to digital gain structure with gain/code pairs support.
++ */
++typedef struct
++{
++    uint16_t conversion_type;            /*!< Digital gain conversion type.  See cmc_digital_gain_conversion_type_t. */
++    uint16_t num_pairs;                  /*!< Number of gain/code pairs which describe the digital gain. */
++    uint16_t reserved;                   /*!< Not used at the moment. Reserved to ensure correct (32 bit) alignment. */
++} cmc_digital_gain_v102_t;
++#define SIZEOF_CMC_DIGITAL_GAIN_V102_T 6
++
++/*!
++ * \brief CMC Sensor exposure registers ranges.
++ */
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_exposure_range (See cmc_name_id). */
++    uint32_t coarse_integration_min;     /*!< Minimum sensor register value for coarse integration time. */
++    uint32_t coarse_integration_max;     /*!< Maximum sensor register value for coarse integration time.*/
++    uint32_t fine_integration_min;       /*!< Minimum sensor register value for fine integration time.*/
++    uint32_t fine_integration_max;       /*!< Maximum sensor register value for fine integration time.*/
++} cmc_exposure_range_t;
++#define SIZEOF_CMC_EXPOSURE_RANGE_T 24
++
++/*!
++ * \brief CMC Multiple LED flash chromaticity.
++ */
++typedef struct
++{
++    uint16_t device_id;                    /*!< Flash device ID enumerator. */
++    uint16_t num_poly_points;              /*!< Number of points defining polygon. */
++    chromaticity_t flash_avg_chromaticity; /*!< Flash chromaticity in R/G, B/G plane. */
++    cie_coords_t flash_avg_cie;            /*!< Flash chromaticity in CIE X, CIE Y plane. */
++    uint16_t reserved[2];                  /*!< Reserved for future changes. Always 0 (for now).. */
++    cmc_poly_point_t *poly_points;         /*!< Flash Chromaticity Deviation in R/G, B/G plane. */
++} cmc_flash_device_t;
++#define SIZEOF_CMC_FLASH_DEVICE_T 16     /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
++
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_led_flash_chromaticity (See cmc_name_id). */
++    uint16_t max_flash_output;           /*!< Flash maximum energy output for full power, lumen per second [lm/s] */
++    uint16_t multi_led_flash_mode;       /*!< Reserved for future changes. Always 0 (for now). */
++    uint16_t reserved;                   /*!< Reserved for future changes. Always 0 (for now). */
++    uint16_t num_flash_devices;          /*!< Number of flash devices/LEDs. */
++    cmc_flash_device_t *flash_devices;   /*!< Data of all flash devices. */
++} cmc_multi_led_flash_t;
++#define SIZEOF_CMC_MULTI_LED_FLASH_T 16  /*!< Size of the structure without pointers. Used in copying data from CPF to this structure. */
++
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_sensor_metadata (See cmc_name_id). */
++    uint16_t total_num_of_cfg_blocks;    /*!< Total number of config blocks (ia_emd_config_block_t). */
++    uint16_t total_num_of_data_blocks;   /*!< Total number of decoded data blocks (ia_emd_decoded_block_t). */
++    uint8_t num_of_exposure_sets;        /*!< Number of exposure sets in sensor embedded data. */
++    uint8_t num_of_color_channels;       /*!< Number of color channels in sensor embedded data. */
++    uint8_t max_num_of_faces;            /*!< Maximum number of faces in external ISP embedded data. */
++    uint8_t reserved;                    /*!< Reserved. */
++    /* ia_emd_config_block_t cfg_blocks[];*/   /*!< Configuration blocks array. */
++} cmc_emd_decoder_config_t;
++#define SIZEOF_CMC_EMD_DECODER_CONFIG_T  16 /*!< Size of cmc_emd_decoder_config_t without pointer. Used in copying data from CPF to this structure. */
++
++typedef struct
++{
++    uint8_t *key;                       /*!< Free C string text key (NULL terminated) */
++    uint8_t *version;                   /*!< Free C string text version (NULL terminated) */
++} cmc_version_info_t;
++
++typedef struct
++{
++    cmc_comment_t *cmc_comment;
++    uint8_t *comment;
++    uint16_t num_version_infos;
++    cmc_version_info_t *version_infos;
++} cmc_parsed_comment_t;
++
++typedef struct
++{
++    cmc_black_level_t *cmc_black_level;
++    cmc_black_level_lut_t *cmc_black_level_luts;
++} cmc_parsed_black_level_t;
++
++typedef struct
++{
++    cmc_linearity_t *cmc_linearity;
++    uint16_t *cmc_linearity_lut;
++} cmc_parsed_linearity_t;
++
++typedef struct
++{
++    cmc_lens_shading_t *cmc_lens_shading;
++    cmc_lsc_grid_t *cmc_lsc_grids;
++    uint16_t *lsc_grids;
++    chromaticity_t *cmc_lsc_rg_bg_ratios;  /* Sensor R/G B/G ratios, available in
++                                               cmc_name_id_lens_shading_correction v101. */
++} cmc_parsed_lens_shading_t;
++
++typedef struct
++{
++    cmc_lens_shading_ratio_t *cmc_lens_shading_ratio;
++    cmc_lsc_ratio_grid_t *cmc_lsc_ratio_grids;
++    uint16_t *lsc_grids;
++} cmc_parsed_lens_shading_ratio_t;
++
++typedef enum
++{
++    cmc_aperture_type_fixed = 0,          /*!< Aperture is fixed. */
++    cmc_aperture_type_dc_iris,            /*!< Aperture is controlled by DC-iris. */
++    cmc_aperture_type_p_iris,             /*!< Aperture is controlled by P-iris. */
++} cmc_aperture_type_t;
++
++typedef struct
++{
++    int16_t cmc_dac_min;        /*!< Minimum value of the DA-converter (will close the iris). */
++    int16_t cmc_dac_hold;       /*!< A value for DA-converter that will hold the iris ("barely open or barely close"). */
++    int16_t cmc_dac_max;        /*!< Maximum value of the DA-converter (will open the iris). */
++} cmc_dc_iris_dac_t;
++
++typedef struct
++{
++    cmc_optomechanics_t *cmc_optomechanics;
++    uint16_t *lut_apertures;
++    uint16_t aperture_type;         /*!< Aperture type control of type cmc_aperture_type_t, v101 and onwards. */
++    cmc_dc_iris_dac_t dc_iris_dac;  /*!< DAC values for DC-iris, v102 and onwards. */
++} cmc_parsed_optics_t;
++
++typedef struct
++{
++    cmc_spectral_response_t *cmc_spectral_response;
++    cmc_color_channels *spectral_responses;
++} cmc_parsed_spectral_response_t;
++
++/*!
++ * \brief CMC Gamut.
++ */
++typedef struct
++{
++    uint16_t light_source;               /*!< Light source type (0 if not known). */
++    uint16_t r_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
++    uint16_t b_per_g;                    /*!< Gamut achromatic point R per G (white balance gains for given gamut).*/
++    uint16_t CIE_x;                      /*!< Illumination CIE x coordinate.*/
++    uint16_t CIE_y;                      /*!< Illumination CIE x coordinate.*/
++    uint16_t size;                       /*!< Size of the gamut tables.*/
++    uint16_t *gamut_r_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
++    uint16_t *gamut_b_per_g;             /*!< Illumination gamut (convex hull). R per g points in clockwise order*/
++} cmc_gamut_t;
++#define SIZEOF_CMC_GAMUT_T 12
++
++typedef struct
++{
++    uint16_t num_illumination_gamuts;   /*!< Number of illumination gamuts */
++    cmc_gamut_t *cmc_gamut;
++} cmc_chromaticity_response_v101_t;
++#define SIZEOF_CMC_CHROMATICITY_RESPONSE_V101 2
++
++/*!
++ * \brief Parametric model coefficients for the average chromaticity locus and CCT curve
++ */
++typedef struct
++{
++    float locus_model[4];
++    float cct_model[3];
++} cmc_locus_t;
++
++typedef struct
++{
++    cmc_chromaticity_response_t *cmc_chromaticity_response;
++    cmc_chromaticity_response_v101_t *cmc_chromaticity_response_v101;
++    cmc_locus_t *cmc_locus;
++    cmc_lightsource_t *cmc_lightsources_avg;
++    cmc_lightsource_t *cmc_lightsources_hi;
++    cmc_lightsource_t *cmc_lightsources_lo;
++    cmc_lightsource_t *cmc_lightsources_nvm;
++} cmc_parsed_chromaticity_response_t;
++
++typedef struct
++{
++    cmc_flash_chromaticity_t *cmc_flash_chromaticity;
++    cmc_poly_point_t *cmc_poly_points;
++} cmc_parsed_flash_chromaticity_t;
++
++typedef enum
++{
++    ccm_estimate_method_bypass,     /*!< Return unity CCM matrix. */
++    ccm_estimate_method_wp,         /*!< Return CCM matrix using only white point estimate from AWB. */
++    ccm_estimate_method_wp_sa,      /*!< Return CCM matrix using both white point estimate from AWB and Shading Adaptor Results. */
++} ccm_estimate_method_t;
++
++typedef struct
++{
++    cmc_color_matrices_t *cmc_color_matrices;
++    cmc_color_matrix_t *cmc_color_matrix;
++    uint16_t *ccm_estimate_method;              /*!< ccm_estimate_method for interpolation -> ccm_estimate_method_t */
++} cmc_parsed_color_matrices_t;
++
++typedef struct
++{
++    cmc_analog_gain_conversion_t *cmc_analog_gain_conversion;
++    cmc_analog_gain_segment_t *cmc_analog_gain_segments;
++    cmc_analog_gain_pair_t *cmc_analog_gain_pairs;
++} cmc_parsed_analog_gain_conversion_t;
++
++/*!
++ * \brief Gain to gain code mapping.
++ * Gains must be defined in ascending order.
++*/
++typedef struct
++{
++    float gain;                         /*!< Gain in floating point format. */
++    uint32_t code;                      /*!< Code corresponding to gain. */
++} cmc_gain_code_pair_t;
++
++/*!
++ * \brief Gain to gain code mapping of a segment.
++ * Segments contain SMIA gain parameters. When ranges is defined, beginning is always inclusive and end exclusive.
++ * For example gain 2.0 and ranges: [1.0, 2.0[; [2.0, 4.0[;. Gain 2.0 is not calculated from the first range parameters but from the second range.
++ */
++typedef struct
++{
++    float gain_begin;                   /*!< Begin of gain of the segment (inclusive) in floating point format. */
++    float gain_end;                     /*!< End of gain of the segment (exclusive) in floating point format. */
++    uint32_t code_min;                  /*!< The minimum recommended setting for the gain control. */
++    uint32_t code_max;                  /*!< The maximum recommended setting for the gain control. */
++    uint32_t code_step;                 /*!< The precision of the gain control. */
++    int16_t M0;                         /*!< Gain code M0 as in SMIA. */
++    int16_t C0;                         /*!< Gain code C0 as in SMIA. */
++    int16_t M1;                         /*!< Gain code M1 as in SMIA. */
++    int16_t C1;                         /*!< Gain code C1 as in SMIA. */
++    uint32_t padding;                   /*!< Padding to 64-bit boundary. */
++} cmc_gain_segment_t;
++
++typedef struct
++{
++    cmc_digital_gain_t *cmc_digital_gain;
++    cmc_digital_gain_v102_t *cmc_digital_gain_v102;
++    cmc_analog_gain_pair_t *cmc_digital_gain_pairs;
++} cmc_parsed_digital_gain_t;
++
++typedef enum
++{
++    cmc_gain_type_invalid = -1,     /*!< Invalid gain. */
++    cmc_gain_type_analog_gain = 0,  /*!< Analog gain. */
++    cmc_gain_type_digital_gain,     /*!< Digital gain. */
++    cmc_gain_type_conversion_gain,  /*!< Conversion gain for HDR sensors. */
++    cmc_gain_type_isp_gain,         /*!< Gain applied in ISP. */
++} cmc_gain_type_t;
++
++#ifndef IA_CMC_GAINS_MAX_NUM
++/* TODO: Use definition from ia_configuration.h */
++/* Windows driver and imaging system simulators don't include ia_configuration.h correctly. */
++#define IA_CMC_GAINS_MAX_NUM 4
++#endif
++
++typedef enum
++{
++    cmc_gain_conversion_type_none,          /*!< No gain conversion should be done. */
++    cmc_gain_conversion_type_segment,       /*!< Segments contain SMIA compatible parameters for calculating register value for a certain range of gain. */
++    cmc_gain_conversion_type_pair,          /*!< Pairs contain gain value & corresponding register value. */
++    cmc_gain_conversion_type_fixed_point,   /*!< Gain is defined in fixed point format. */
++} cmc_gain_conversion_type_t;
++
++typedef struct
++{
++    uint16_t gain_min;           /*!< The minimum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
++    uint16_t gain_max;           /*!< The maximum valid limit of the gain control parameters in fixed point format (16bit integer part + 16bit fraction part). */
++    uint16_t gain_step_size;      /*!< Step size of gain code register value. */
++    uint16_t fraction_bits;       /*!< Number of bits used for the fraction part of the 16 bit register value. */
++} cmc_gain_fixed_t;
++
++typedef struct
++{
++    cmc_gain_type_t gain_type;                  /*!< Gain type. */
++    cmc_gain_conversion_type_t conversion_type; /*!< Gain conversion type. */
++    uint32_t num_segments;                      /*!< Number of gain/code segments which describe the gain. */
++    uint32_t num_pairs;                         /*!< Number of gain/code pairs which describe the gain. */
++    union
++    {
++        cmc_gain_segment_t *ptr;                /*!< Array of gain segments. Array length is defined by num_segments. */
++        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } segments;
++    union
++    {
++        cmc_gain_code_pair_t *ptr;              /*!< Array of gain code pairs. Array length is defined by num_pairs. */
++        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } pairs;
++    union
++    {
++        cmc_gain_fixed_t *ptr;                  /*!< A pointer to the fixed point format. */
++        uint64_t dummy;                         /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } fixed;
++} cmc_gain_conversion_t;
++
++typedef struct
++{
++    ia_mkn_record_header header;        /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_multi_gain_conversions (See cmc_name_id). */
++    uint32_t num_gains;                 /*!< Number of gains configured. */
++    uint32_t padding;
++    union
++    {
++        cmc_gain_conversion_t* ptr;     /*!< Array of gain conversions. Array length defined in num_gains. */
++        uint64_t dummy;                 /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } gains;
++    uint64_t reserved;                  /* Reserved for record version updates. */
++} cmc_multi_gain_conversions_t;
++
++/*!
++* \brief CMC geometric distortion correction grids
++*/
++typedef struct
++{
++    uint16_t focus_position;             /*!< Focus motor position in terms of those used by the sensor module.
++                                         Range should be depicted from the cmc_name_id_optics_and_mechanics section in the CPFF.). */
++    int32_t *x_deltas;                  /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
++                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
++    int32_t *y_deltas;                  /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
++                                        that was done. Contains [GDC_grid_height  x GDC_grid_width] values. */
++} cmc_geometric_distortion2_grid_t;
++
++typedef struct
++{
++    int32_t focalLength;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
++    int32_t ldc_r_lut[256];         /*!< LDC(R) LUT table*/
++    int32_t ldc_r_x_center;         /*!< X coordinate of LDC(R) correction center of symmetry */
++    int32_t ldc_r_y_center;         /*!< Y coordinate of LDC(R) correction center of symmetry */
++    int32_t ldc_r_y_scale_factor;   /*!< Y coordinate scaling factor for elliptical distortion of LDC(R) correction */
++} cmc_ldc_lut_t;
++
++/*!
++ * \brief LDC LUT mode
++ */
++typedef enum {
++    cmc_camera_ldc_lut_type_incident_angle_vs_distorted_radius = 0,  /*!< incident angle vs Rd */
++    cmc_camera_ldc_lut_type_undistorted_radius_vs_distorted_radius,  /*!< 1-> Ru vs Rd */
++} cmc_camera_ldc_lut_mode_t;
++
++
++/*!
++ * \brief CMC WFOV LDC parameters
++ */
++
++typedef struct
++{
++    float focal_length;            /*!< Focal length in terms of those used by the camera module.Range should be depicted from the CMC_OpticsAndMechanics section in the CPFF.*/
++    float max_fov_lut;            /*!< Max incident angle (in degrees) covered in the LUT.*/
++    cmc_camera_ldc_lut_mode_t lut_mode;    /*!< LDC LUT mode: 0 -> incident angle vs Rd, 1-> Ru vs Rd*/
++    int32_t num_lut_elements;     /*!< Number of LUT elements.*/
++    float *ldc_r_lut;             /*!< LDC(R) LUT table in pixels*/
++} cmc_wfov_ldc_lut_t;
++
++
++/*!
++ * \brief CMC WFOV calibration parameters
++ */
++typedef struct
++{
++    float horizontal_shift;         /*!< Horizontal shifts in pixels */
++    float vertical_shift;           /*!< Vertical shifts in pixels */
++    float horizontal_foclen_fact;   /*!< Horizontal focal length factor */
++    float vertical_foclen_fact;     /*!< Vertical focal length factor */
++    float horizontal_shear;         /*!< Horizontal shear factor */
++    float vertical_shear;           /*!< Vertical shear factor */
++} cmc_affine_params_t;
++#define SIZEOF_CMC_AFFINE_PARAMS (24)
++
++typedef struct
++{
++    int16_t ldc_col_start;                             /*!< Table X offset in pixels from left corner of the sensor maximum visible area e.g.
++                                                       If GDC_col_start=GDC_block_width*(-1) then GDC table offset is is one block left compared
++                                                       to the maximum visible sensor area. */
++    int16_t ldc_row_start;                             /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area e.g.
++                                                       If GDC_row_start=GDC_block_height*(-1) then GDC table offset is is one block up compared
++                                                       to the maximum visible sensor area.  */
++    int16_t ldc_grid_width;                            /*!< Indicates number of grid vertices on the horizontal axis. */
++    int16_t ldc_grid_height;                           /*!< Indicates number of grid vertices on the vertical axis. */
++    int16_t ldc_block_width;                           /*!< Average width of the grid cell in pixel count. */
++    int16_t ldc_block_height;                          /*!< Average height of the grid cell in pixel count. */
++    uint16_t ldc_grid_count;                           /*!< Number of LDC grids (focus positions). */
++    cmc_gdc_mode_type gdc_mode;                        /*!< GDC mode enum, 0=Grid based (old),  1=LUT, 2=ext-LUT. */
++    int32_t ldc_lut_count;                             /*!< Number of LDC Luts (focal lengths) */
++    int32_t spherical_r_lut[256];                      /*!< R-spherical LUT table for spherical to Cartesian coordinate system transformation (dewarping) */
++    int32_t spherical_r_lut_radius_start;              /*!< R-spherical LUT table starting radius, 0-65535 */
++    int32_t spherical_r_lut_radius_end;                /*!< R-spherical LUT table ending radius, 0-65535 */
++    int32_t spherical_to_cartesian_x_center;           /*!< X coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
++    int32_t spherical_to_cartesian_y_center;           /*!< Y coordinate of spherical to Cartesian coordinate system transformation (dewarping), 0-65535 */
++    cmc_geometric_distortion2_grid_t* ldc_grid;        /*!< LDC grids (legacy) */
++    cmc_ldc_lut_t* ldc_lut;                            /*!< LDC LUTs */
++    float max_fov_lens;                                /*!< Max field of view of the lens(degrees) */
++    int32_t num_wfov_luts;                             /*!< Number of WFOV Luts (focal lengths) */
++    cmc_wfov_ldc_lut_t *wfov_ldc_lut;                  /*!< WFOV LDC LUTs: Number of LUTs specified by num_wfov_luts */
++    cmc_affine_params_t *affine_params;                /*!< WFOV affine parameters: One for each LUT */
++} cmc_parsed_geometric_distortion2_t;
++#define SIZEOF_CMC_GEOMETRIC_DISTORTION_V100_T 22
++#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_R_LUT 1024 /* 256 * 4 */
++#define SIZEOF_CMC_GEOMETRIC_DISTORTION_SPHERICAL_CFG_PARAMS 16
++
++
++
++/*!
++ * \brief CMC advanced color matrix info
++ */
++typedef struct
++{
++    ia_mkn_record_header header;         /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: CMC_GeometricDistortion2 (See cmc_name_id). */
++    uint16_t light_sources_count;        /*!< Number of light sources. */
++    uint16_t sector_count;               /*!< Number of color matrix sectors.  */
++} cmc_advanced_color_matrix_info_t;
++#define SIZEOF_CMC_ADVANCED_COLOR_MATRIX_INFO_T 12
++
++/*!
++ * \brief CMC color matrix
++ */
++typedef struct
++{
++    float color_matrix[9];                 /*!< 3x3 accurate CCM, each consequtive elements sum to 1. */
++} cmc_acm_color_matrix_t;
++#define SIZEOF_CMC_ACM_COLOR_MATRIX_T 36
++
++/*!
++ * \brief CMC advanced color matrices info for light sources
++ */
++typedef struct
++{
++    uint32_t src_type;                   /*!< Light source type (enum), e.g. Fluorescent. */
++    float chromaticity[2];               /*!< Chromaticity (sensor) in R/G, B/G plane. */
++    float src_cie_xy[2];                 /*!< CIE x and y coordinates. */
++} cmc_acm_color_matrices_info_t;
++#define SIZEOF_CMC_ACM_COLOR_MATRICES_INFO_T 20
++
++typedef struct
++{
++    cmc_acm_color_matrices_info_t *color_matrices_info;         /*! < Information for Color matrices. */
++    cmc_acm_color_matrix_t traditional_color_matrix;            /*! < Color matrix optimized using all sectors. */
++    cmc_acm_color_matrix_t *advanced_color_matrices;            /*! < Array of color matrices. Array size is sector_count */
++} cmc_parsed_advanced_color_matrices_ls_t;
++
++typedef struct
++{
++    cmc_advanced_color_matrix_info_t *cmc_advanced_color_matrix_info;
++    uint32_t *hue_of_sectors;                                                       /*! < Starting hue angle array of sectors. Array size is sector_count. */
++    cmc_parsed_advanced_color_matrices_ls_t *cmc_parsed_advanced_color_matrices_ls; /*! < Array of color matrices
++                                                                                          for different light sources.
++                                                                                          Array size is light_sources_count. */
++} cmc_parsed_advanced_color_matrix_t;
++
++typedef struct
++{
++    float min;    /*!< The minimum allowed ratio for the parameter. */
++    float max;    /*!< The maximum allowed ratio for the parameter. */
++} cmc_hdr_param_ratio_limit_t;
++
++/*!
++ *  CMC HDR ratio limits.
++ */
++typedef struct
++{
++    cmc_hdr_param_ratio_limit_t hdr_exposure_time_ratio_limits; /*!< Allowed ratio between exposure times. */
++    cmc_hdr_param_ratio_limit_t hdr_analog_gain_ratio_limits;   /*!< Allowed ratio between analog gains. */
++    cmc_hdr_param_ratio_limit_t hdr_digital_gain_ratio_limits;  /*!< Allowed ratio between digital gains. */
++} cmc_hdr_ratio_limits_t;
++
++/*!
++* \brief CMC HDR Parameters
++*/
++typedef struct
++{
++    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
++    float hdr_exposure_ratio_min;   /*!< Minimum HDR exposure ratio between different exposures. */
++    float hdr_exposure_ratio_max;   /*!< Maximum HDR exposure ratio between different exposures. */
++
++    cmc_hdr_ratio_limits_t overall_ratio_limits;    /*!< v101. Ratio limits between the longest and shortest exposure. */
++    cmc_hdr_ratio_limits_t pair_ratio_limits;       /*!< v101. Ratio limits between exposure pairs. */
++} cmc_parsed_hdr_parameters_t;
++
++#define SIZEOF_CMC_HDR_T        16
++#define SIZEOF_CMC_HDR_V101_T   (2*(uint32_t)sizeof(cmc_hdr_ratio_limits_t))
++
++typedef enum
++{
++    ir_correction_level_bypass,     /*!< Set PA IR Weight grid pointer as NULL. */
++    ir_correction_level_wp,         /*!< Interpolate IR Weight grid using only white point estimate from AWB. */
++} ir_correction_level_t;
++
++/*!
++* \brief CMC IR Weight Grids Parameters
++*/
++typedef struct
++{
++    ia_mkn_record_header header;    /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_hdr. */
++    int8_t grid_indices[16];        /*!< IR Weight grid indices showing which tables in the structure holds information. -1 means no correction for that pixel */
++    uint16_t num_light_sources;     /*!< Number of light sources for which IR Weight Grids are characterized . */
++    uint16_t num_grids;             /*!< Number of grids per light source. This depends on the CFA type and non -1 elements in  . */
++    uint16_t grid_width;            /*!< IR Weight Grid width. */
++    uint16_t grid_height;           /*!< IR Weight Grid height. */
++}
++cmc_ir_weight_info_t;
++#define SIZEOF_CMC_IR_WEIGHT_INFO_T 32
++
++
++typedef struct
++{
++    cmc_light_source source_type;    /*!< Light-source type. See enum cmc_light_source.  */
++    float chromaticity[2];          /*!< Chromaticity (sensor) in R/G, B/G plane. */
++    float cie_coords[2];            /*!< CIE x and y coordinates. */
++} cmc_ir_weight_grid_info_t;
++#define SIZEOF_CMC_IR_WEIGHT_GRID_INFO_T 20
++
++typedef struct
++{
++    cmc_ir_weight_grid_info_t *ir_weight_grid_info;     /*!< IR Weight Grid Info. */
++    uint16_t *ir_weight_grid;        /*!< IR Weight Grids for all channels. */
++}
++cmc_ir_weight_grids_t;
++
++typedef struct
++{
++    float ir_proportion;            /*!< IR and green pixel proportion in sensor plane, */
++    float reserved[3];              /*!< Reserved. */
++}
++cmc_ir_proportion_t;
++#define SIZEOF_CMC_IR_PROPORTION_V101_T   ((uint32_t)sizeof(cmc_ir_proportion_t))
++
++typedef struct
++{
++    cmc_ir_weight_info_t *ir_weight_info;       /*!< IR Weight Info . */
++    cmc_ir_weight_grids_t *ir_weight_grids;     /*!< IR Weight Grids. */
++    cmc_ir_proportion_t *ir_proportion;         /*!< v101. */
++}
++cmc_parsed_ir_weight_t;
++
++/* CMC structures with version ID >= v200 */
++
++typedef struct
++{
++    cmc_light_source source_type;         /*!< Light source type (enum), e.g. Fluorescent. */
++    cmc_chromaticity chromaticity;        /*!< Chromaticity (sensor) in R/G, B/G plane. */
++    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
++    cmc_color_matrix traditional;         /*!< Color matrix optimized using all sectors. */
++    cmc_color_matrix *advanced;           /*!< Array of color matrices (as defined by num_sectors). */
++} cmc_advanced_color_matrices;
++
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_advanced_color_matrices (See cmc_name_id). */
++    unsigned short num_light_srcs;        /*!< Number of light sources. */
++    unsigned short num_sectors;           /*!< Number of color matrix sectors.  */
++    cmc_advanced_color_matrices *acms;    /*!< Advanced color matrices for all light sources (as defined by num_light_srcs). */
++    unsigned int *hue_of_sectors;         /*!< Starting hue angle array of sectors (as defined by num_sectors). */
++} cmc_advanced_color_matrix_correction;
++
++typedef struct
++{
++    cmc_light_source source_type;         /*!< Light source type. */
++    float chromaticity_i_per_g;           /*!< Sensor Ir/G ratio. */
++    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
++    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
++    uint16_t *grids[4][4];                /*!< IR Grids for all color channels (as defined by grid_indices). */
++} cmc_ir_grid;
++
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_infrared_correction (See cmc_name_id). */
++    char grid_indices[4][4];              /*!< IR grid indices showing which tables in the structure holds information. -1 means no correction. */
++    unsigned short num_light_srcs;        /*!< Number of light sources. */
++    unsigned short grid_width;            /*!< IR Grid width. */
++    unsigned short grid_height;           /*!< IR Grid height. */
++    cmc_ir_grid *ir_grids;                /*!< IR grids for all light sources (as defined by num_light_srcs). */
++} cmc_infrared_correction;
++
++typedef struct
++{
++    cmc_light_source source_type;         /*!< Light source type. */
++    cmc_chromaticity chromaticity;        /*!< Sensor R/G B/G ratios. */
++    cmc_cie_coords cie_coords;            /*!< CIE x and y coordinates. */
++    unsigned short fraction_bits;         /*!< Number of fraction bits in the shading table fix point representation. */
++    unsigned short *grids[4][4];          /*!< LSC gain grid stored in fixed point format with variable number of fraction bits, (16-fraction_bits)Qfraction_bits. */
++} cmc_lsc_grid;
++#define SIZEOF_CMC_LSC_GAIN_GRID_T 22
++
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
++    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
++    unsigned short num_light_srcs;        /*!< Number of light sources. */
++    unsigned short grid_width;            /*!< LSC grid width. */
++    unsigned short grid_height;           /*!< LSC grid height. */
++    cmc_lsc_grid *lsc_grids;              /*!< LSC grids for all light sources (as defined by num_light_srcs). */
++} cmc_lens_shading_correction;
++#define SIZEOF_CMC_LENS_SHADING4x4_T 32
++
++typedef struct
++{
++    cmc_lsc_grid lsc_grid;                /* LSC gain grid. */
++    uint16_t pair_index;                  /* Calibration light source pair index. Tells which NVM table number should be used (in case there are more than one, if there is only one the value is always 0). */
++} cmc_lsc_ratio_grid;
++
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lens_shading_correction_4x4 (See cmc_name_id). */
++    char grid_indices[4][4];              /*!< LSC grid indices showing which tables in the structure holds information. -1 means no correction. */
++    unsigned short num_light_srcs;        /*!< Number of light sources. */
++    unsigned short grid_width;            /*!< LSC grid width. */
++    unsigned short grid_height;           /*!< LSC grid height. */
++    cmc_lsc_ratio_grid *ratio_grids;      /*!< LSC grids for all light sources (as defined by num_light_srcs). */
++} cmc_lens_shading_ratio_correction;
++
++typedef struct
++{
++    ia_mkn_record_header header;          /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_lateral_chromatic_aberration_correction (See cmc_name_id). */
++    cmc_coords optical_center;            /*!< Optical center distance from the left uppermost corner of the sensor (in native sensors resolution). This the location where no lateral chromatic aberration is present. [x, y]. */
++    uint16_t grid_width;                  /*!< Width of the grid. */
++    uint16_t grid_height;                 /*!< Height of the grid. */
++    uint16_t cell_size_x;                 /*!< X-dimension distance (in pixels) between the grid points (lca_grid_*). Guaranteed to be 2^n. This is always in respect to the maximum native sensor width defined in ID2 (General Data). All adaptations to other resolutions is done in the imaging system code in the device in the runtime.*/
++    uint16_t cell_size_y;                 /*!< Same as above but y-dimension */
++    float *lca_grid_blue_x;               /*!< Amount of absolute lateral chromatic aberration in horizontal direction in each of the grid locations for blue pixels, in respect to the green pixel. The grid is evenly spaced over the native maximum sensor resolution and maximum field of view. 0 means no aberration, -x means shifted to left, +x mean shifted to right. Grid is aligned to the left uppermost corner of the maximum focal plane. This, as all other CMC tables, are in respect to the maximum native image sensor resolution. All adaptations to other resolutions is done in the imaging system code in the device in the runtime. */
++    float *lca_grid_blue_y;               /*!< Same as above but in vertical direction. */
++    float *lca_grid_red_x;                /*!< Same as above but for horizontal and red pixel. */
++    float *lca_grid_red_y;                /*!< Same as above but in vertical direction. */
++} cmc_lateral_chromatic_aberration_correction;
++#define SIZEOF_CMC_LCA_HDR 20
++
++typedef struct
++{
++    uint16_t pattern_horizontal_offsets;    /*!< Buffer of horizontal offsets for repetitive PD pixels within the pattern */
++    uint16_t pattern_vertical_offsets;      /*!< Buffer of vertical offsets for repetitive PD pixels within the pattern */
++    uint16_t pattern_labels;                /*!< Buffer of labels for repetitive PD pixels within the pattern (0 - left pixel, 1 - right pixel) */
++} cmc_pd_pattern_t;
++
++typedef struct
++{
++    int32_t dlom;                          /*!< Default DLOM table for the reference golden sample */
++} cmc_pd_dlom_t;
++
++typedef struct
++{
++    uint16_t ps_gains_left;                /*!< Default PS gains table for left pixels for the reference golden module */
++    uint16_t ps_gains_right;               /*!< Default PS gains table for right pixels for the reference golden module */
++} cmc_pd_ps_gains_t;
++
++typedef struct
++{
++    ia_mkn_record_header header;            /*!< Record header with Format ID: Uint16 (See AIQB_DataID) Name ID: cmc_name_id_phase_difference */
++    uint16_t sensor_type;                   /*!< PD sensor type (See cmc_pd_sensor_type)*/
++    uint16_t technology_type;               /*!< PD technology type (See cmc_pd_technology_type) */
++    uint16_t pd_horizontal_offset;          /*!< Number of pixel pairs skipped at the beginning of the frame before the start of the first PD pattern */
++    uint16_t pd_vertical_offset;            /*!< Number of line pairs skipped at the beginning of the frame before the start of the first PD pattern */
++    uint16_t num_pd_pixels;                 /*!< Number of repetitive PD pixels within the pattern */
++    uint16_t pattern_width;                 /*!< Pattern width (horizontal period for repetitive PD pixels) */
++    uint16_t pattern_height;                /*!< Pattern height (vertical period for repetitive PD pixels) */
++    uint16_t dlom_width;                    /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in horizontal orientation */
++    uint16_t dlom_height;                   /*!< Number of Disparity of Lens Offset Mapping (DLOM) knots in vertical orientation */
++    uint16_t ps_gains_width;                /*!< Number of pixel sensitivity (PS) knots in horizontal orientation */
++    uint16_t ps_gains_height;               /*!< Number of pixel sensitivity (PS) knots in vertical orientation */
++    cmc_pd_pattern_t *cmc_pd_pattern;       /*!< PD pattern characterization (num_pd_pixels) */
++    cmc_pd_dlom_t *cmc_pd_dlom;             /*!< Disparity of Lens Offset Mapping characterization (dlom_width*dlom_height) */
++    cmc_pd_ps_gains_t *cmc_pd_ps_gains;     /*!< Pixel sensitivity characterization (ps_gains_width*ps_gains_height) */
++} cmc_phase_difference_t;
++#define SIZEOF_CMC_PHASE_DIFFERENCE_T 30
++
++/*!
++ * \brief Structure defining run (count) and value pairs.
++ */
++typedef struct
++{
++    unsigned short run;    /*!< Count of how many times the same 'value' is present. */
++    unsigned short value;  /*!< Value. */
++} cmc_run_value;
++
++/*!
++ * \brief Defines structure that describes valid image area.
++ * When using WFOV lens, for example fisheye lens, image coming through the optics is not covering the whole sensor area.
++ * For example corners of the captured image from sensor may be invalid and need to be excluded from 3A analysis and ISP processing.
++ * This structure defines generic form of describing areas that should be excluded from captured rectangular sensor image.
++ * 0 value indicates invalid area and 1 indicates valid area.
++ * { run, value } pairs are used to compress data.
++ *
++ * Example how following 2D table is described with { run, value } pairs:
++ * 0000000000000000 -> { 16, 0 },
++ * 0000011111111111 -> { 5, 0 },  { 11, 1 },
++ * 0111111111111110 -> { 1, 0  }, { 14, 1 }, { 1, 0 },
++ * 0011111111111100 -> { 2, 0  }, { 12, 1 }, { 2, 0 },
++ * 0000111111110000 -> { 4, 0  }, { 8, 1  }, { 4, 0 },
++ *
++ * This 2D table can be further reduced by joining per row { run, value } pairs to 1D table:
++ * { 21, 0 }, { 11, 1 }, { 1, 0 }, { 14, 1 }, { 3, 0 }, { 12, 1 }, { 6, 0 }, { 8, 1 }, { 4, 0 }
++ * 'width' defines how to decode 1D array into 2D table.
++ * 'height' is given for reference, in order to calculate size of 2D table for decoding it into memory.
++ */
++typedef struct
++{
++    ia_mkn_record_header header; /*!< Record header with Format ID: UInt16 (See AIQB_DataID), Name ID: cmc_name_id_valid_image_area (See cmc_name_id). */
++    unsigned short width;        /*!< Width of the map that indicates valid image area. */
++    unsigned short height;       /*!< Height of the map that indicates valid image area. */
++    unsigned int num_run_values; /*!< Number of { run, value } pairs encoded. */
++    union {
++        cmc_run_value *ptr;      /*!< Pointer to { run, value} pairs. */
++        uint64_t dummy;          /* Ensures that pointer is accessible in both 32 and 64 bit systems. */
++    } run_values;
++
++    unsigned short center_x;     /*!< v201+ only -- Horizontal center of radial approximation of valid image area in pixels. */
++    unsigned short center_y;     /*!< v201+ only -- Vertical center of radial approximation of valid image area in pixels. */
++    unsigned int radius;         /*!< v201+ only -- Radius of valid image area in pixels */
++    uint64_t reserved_v202;      /*!< v202+ only -- reserved for pointer to v202 data */
++    uint64_t reserved_v203;      /*!< v202+ only -- reserved for pointer to v203 data */
++} cmc_valid_image_area;
++
++/*!
++ * \brief Parsed CMC structure.
++ * Parser will fill the pointers in this structure so that data can be accessed more easily.
++ */
++typedef struct
++{
++    cmc_parsed_comment_t cmc_parsed_comment;                               /* 0 */
++    cmc_general_data_t *cmc_general_data;                                  /* 8 */
++    cmc_parsed_black_level_t cmc_parsed_black_level;                       /* DEPRECATED. Use cmc_black_level_global instead. */
++    cmc_saturation_level_t *cmc_saturation_level;                          /* 20 */
++    cmc_parsed_linearity_t cmc_parsed_linearity;                           /* 24 */
++    cmc_sensitivity_t *cmc_sensitivity;                                    /* 32 */
++    cmc_defect_pixel_t *cmc_defect_pixel;                                  /* 36 */
++    cmc_noise *cmc_noise_model;                                            /* 40 */
++    cmc_parsed_lens_shading_t cmc_parsed_lens_shading;                     /* 44 */
++    cmc_parsed_optics_t cmc_parsed_optics;                                 /* 72 */
++    cmc_parsed_spectral_response_t cmc_parsed_spectral_response;           /* 80 */
++    cmc_parsed_chromaticity_response_t cmc_parsed_chromaticity_response;   /* 88 */
++    cmc_parsed_flash_chromaticity_t cmc_parsed_flash_chromaticity;         /* 108 */
++    cmc_parsed_nvm_info_t cmc_parsed_nvm_info;                             /* 114 */
++    cmc_parsed_color_matrices_t cmc_parsed_color_matrices;                 /* */
++    cmc_parsed_analog_gain_conversion_t cmc_parsed_analog_gain_conversion; /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
++    cmc_parsed_digital_gain_t cmc_parsed_digital_gain;                     /* DEPRECATED. Use cmc_multi_gain_conversions instead. */
++    cmc_parsed_geometric_distortion2_t *cmc_parsed_geometric_distortion2;
++    cmc_exposure_range_t *cmc_exposure_range;
++    cmc_multi_led_flash_t *cmc_multi_led_flashes;
++    cmc_emd_decoder_config_t *cmc_emd_decoder_config;
++    cmc_parsed_advanced_color_matrix_t cmc_parsed_advanced_color_matrix;
++    cmc_parsed_hdr_parameters_t *cmc_parsed_hdr_parameters;
++    cmc_parsed_ir_weight_t *cmc_parsed_ir_weight;
++    cmc_phase_difference_t *cmc_phase_difference;
++    cmc_lateral_chromatic_aberration_correction *cmc_parsed_lca;
++    cmc_lens_shading_correction *cmc_lens_shading;
++    cmc_black_level_global *cmc_black_level_global;
++    cmc_valid_image_area *cmc_valid_image_area;
++    cmc_lens_shading_ratio_correction *cmc_lens_shading_ratio;
++    cmc_multi_gain_conversions_t *cmc_multi_gain_conversions;
++} ia_cmc_t;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_CMC_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
+new file mode 100644
+index 000000000000..ffd4c6f2dafa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
+@@ -0,0 +1,72 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2020 Intel Corporation
++ * All Rights Reserved.
++ * 
++ * This file autogenerated. Do not edit directly!
++ */
++
++#ifndef _IA_CONFIGURATION_H_
++#define _IA_CONFIGURATION_H_
++
++#define IA_HISTOGRAM_SIZE 256
++#define IA_RGBS_GRID_WIDTH 100
++#define IA_RGBS_GRID_HEIGHT 100
++#define IA_FILTER_RESPONSE_GRID_WIDTH 100
++#define IA_FILTER_RESPONSE_GRID_HEIGHT 100
++#define IA_DEPTH_GRID_WIDTH 16
++#define IA_DEPTH_GRID_HEIGHT 12
++#define IA_CMC_GAINS_MAX_NUM 4
++#define IA_CCAT_STATISTICS_MAX_NUM 3
++#define IA_CCAT_EXTERNAL_RGB_HISTOGRAMS_ENABLED
++#define IA_CCAT_EXTERNAL_LUMINANCE_HISTOGRAM_ENABLED
++#define IA_CCAT_IR_GRID_ENABLED
++#define IA_CCAT_DEPTH_GRID_ENABLED
++#define IA_CCAT_RGBS_GRID_ENABLED
++#define IA_CCAT_HSV_GRID_ENABLED
++#define IA_CCAT_LIGHT_SOURCE_ESTIMATION_ENABLED
++#define IA_CCAT_LUMINANCE_GRID_ENABLED
++#define IA_CCAT_LUMINANCE_MOTION_ESTIMATE_ENABLED
++#define IA_CCAT_FACE_ANALYSIS_ENABLED
++#define IA_CCAT_FACES_MAX_NUM 3
++#define IA_CCAT_ROI_ANALYSIS_ENABLED
++#define IA_CCAT_ROIS_MAX_NUM 1
++#define IA_CCAT_CONVOLUTION_FILTER_GRID_ENABLED
++#define IA_CCAT_EXTERNAL_SENSORS_ENABLED
++#define ENABLE_RGB_IR_SENSOR
++#define ENABLE_AEC
++#define IA_AEC_EXPOSURES_MAX_NUM 10
++#define IA_AEC_EXPOSURE_PLANS_NUM 4
++#define IA_AEC_FEATURE_WEIGHT_GRID
++#define IA_AEC_WEIGHT_GRID_WIDTH 32
++#define IA_AEC_WEIGHT_GRID_HEIGHT 24
++#define IA_AEC_FEATURE_CALIBRATION_DATA
++#define IA_AEC_FEATURE_FLASH
++#define IA_AEC_FLASHES_NUM 2
++#define IA_AEC_FEATURE_FLICKER_DETECTION
++#define IA_AEC_FEATURE_BACKLIGHT_DETECTION
++#define IA_AEC_FEATURE_FACE_UTILIZATION
++#define IA_AEC_FEATURE_ROI_ENABLED
++#define IA_AEC_FEATURE_APERTURE_CONTROL
++#define IA_AEC_FEATURE_DC_IRIS
++#define IA_AEC_FEATURE_MULTIFRAME_HINT
++#define IA_AEC_FEATURE_HDR
++#define IA_AEC_FEATURE_MOTION_BLUR_REDUCTION
++#define IA_AEC_FEATURE_SCENE_ANALYSIS
++#define ENABLE_AF
++#define ENABLE_AWB
++#define IA_AWB_FEATURE_SKIN_TONE_CORRECTION
++#define IA_AWB_FEATURE_CAM_ENABLED
++#define IA_AWB_FEATURE_SENSOR_GAMUT_MAPPING_ENABLED
++#define IA_AWB_FEATURE_RGB_MAX_ENABLED
++#define IA_AWB_FEATURE_HO_GW_ENABLED
++#define IA_AWB_FEATURE_OT_GW_ENABLED
++#define ENABLE_GBCE
++#define ENABLE_PA
++#define ENABLE_SA
++#define IA_LSC_FEATURE_LSE_ENABLED
++#define IA_BRADFORD_ADAPTATION_ENABLED
++#define IA_IR_WEIGHT_CALCULATION_ENABLED
++#define ENABLE_DSD
++
++#endif /* _IA_CONFIGURATION_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
+new file mode 100644
+index 000000000000..63355fb18f2f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
+@@ -0,0 +1,149 @@
++/*
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_coordinate.h
++ * \brief Definitions of IA imaging coordinate system and conversion functions.
++ *
++ * IA Imaging algorithms use relative coordinate system where top left corner
++ * is (0,0) and bottom right corner is (8192,8192).
++ *
++ * Coordinate conversions can happen between arbitrary coordinate systems.
++ *
++ * Width and height of coordinate system must be > 0.
++ *
++ * Zoom factor is not considered in coordinate conversions but it should be
++ * calculated when defining the target coordinate system.
++ *
++ * For example:
++ *
++ *      |-------------------------------------------|
++ *      |(0,0)                                      |
++ *      |                                           |
++ *      |    (1800,1700)                            |
++ *      |        |--------------|                   |
++ *      |        |(-100,-100)   |                   |
++ *      |        |              |                   |
++ *      |        |     (100,100)|                   |
++ *      |        |--------------|                   |
++ *      |                   (5500,4000)             |
++ *      |                                           |
++ *      |                                           |
++ *      |                                           |
++ *      |                                           |
++ *      |                                (8192,8192)|
++ *      |-------------------------------------------|
++ *
++ *
++ * There is an algorithm which works on cropped area with own coordinate system A
++ * [(-100,100), (100.100)] inside another coordinate system B [(0,0), (8192,8192)].
++ *
++ * To convert results from coordinate system A to B, one must define source and target
++ * coordinate systems:
++ * Source system is coordinate system A.
++ * src_system: [(-100,100), (100.100)]
++ *
++ * Target system defines the cropped rectangle from inside coordinate system B.
++ * trg_system: [(1800,1700), (5500,4000)]
++ *
++ */
++
++
++#ifndef IA_COORDINATE_H_
++#define IA_COORDINATE_H_
++
++#include "ia_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*! \brief Definitions of IA imaging coordinate system. */
++#define IA_COORDINATE_TOP 0
++#define IA_COORDINATE_LEFT 0
++#define IA_COORDINATE_BOTTOM 8192
++#define IA_COORDINATE_RIGHT 8192
++#define IA_COORDINATE_WIDTH (IA_COORDINATE_RIGHT-IA_COORDINATE_LEFT)
++#define IA_COORDINATE_HEIGHT (IA_COORDINATE_BOTTOM-IA_COORDINATE_TOP)
++
++typedef enum
++{
++    ia_coordinate_rounding_mode_floor = 0, /* Coordinates are always floored down. This is the old behavior. */
++    ia_coordinate_rounding_mode_ceil,      /* Coordinates are always ceiled up. */
++    ia_coordinate_rounding_mode_round      /* Coordinates are rounded to the closest integer. */
++} ia_coordinate_rounding_mode;
++
++/*!
++ * \brief Coordinate system.
++ * Defines the coordinate space boundaries.
++ */
++typedef struct
++{
++    int top;    /*!< Top coordinate value in the coordinate system. */
++    int left;   /*!< Left coordinate value in the coordinate system. */
++    int bottom; /*!< Bottom coordinate value in the coordinate system. */
++    int right;  /*!< Right coordinate value in the coordinate system. */
++} ia_coordinate_system;
++
++/*!
++ * \brief Convert coordinate from source coordinate space to target coordinate space.
++ * \param[in] src_system     Source coordinate system boundaries.
++ * \param[in] trg_system     Target coordinate system boundaries.
++ * \param[in] src_coordinate Coordinate values in source coordinate system.
++ * \param[in] rounding_mode  Coordinate rounding mode.
++ * \return                   Target coordinate converted from source coordinate.
++ */
++LIBEXPORT ia_coordinate
++ia_coordinate_convert(
++    const ia_coordinate_system *src_system,
++    const ia_coordinate_system *trg_system,
++    const ia_coordinate src_coordinate,
++    const ia_coordinate_rounding_mode rounding_mode);
++
++/*!
++*  Converts a rectangle from one coordinate system to another.
++*
++*  \param [in]  a_src_system_ptr   The source coordinate system.
++*  \param [in]  a_src_rect_ptr     The source rectangle.
++*  \param [in]  a_tgt_system_ptr   The target coordinate system.
++*  \param [out] a_tgt_rect_ptr     The calculated target rectangle.
++*/
++LIBEXPORT void
++ia_coordinate_convert_rect(
++    const ia_coordinate_system* a_src_system_ptr,
++    const ia_rectangle* a_src_rect_ptr,
++    const ia_coordinate_system* a_tgt_system_ptr,
++    ia_rectangle* a_tgt_rect_ptr);
++
++/*!
++ * \brief Convert face coordinates to target coordinate system.
++ * \param[in,out] face_state Structure containing face information from face tracker.
++ * \param[in]     src_system Source coordinate system boundaries.
++ * \param[in]     trg_system Target coordinate system boundaries.
++ */
++LIBEXPORT void
++ia_coordinate_convert_atbx_faces(
++    ia_atbx_face_state *face_state,
++    const ia_coordinate_system *src_system,
++    const ia_coordinate_system *trg_system);
++
++#ifdef __cplusplus
++}
++#endif
++
++
++#endif /* IA_COORDINATE_H_ */
++
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
+new file mode 100644
+index 000000000000..b8fcade391e6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
+@@ -0,0 +1,133 @@
++/*
++ * Copyright 2012 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++/*!
++ * \mainpage IA DPC API documentation
++ *
++ * Browse Files and Classes tabs for details.
++ *
++ */
++/*!
++ * \file ia_dpc.h
++ * \brief Definitions and declarations of IA SD-DPC library.
++ */
++#ifndef _IA_DPC_H_
++#define _IA_DPC_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ia_mkn_types.h"
++#include "ia_cmc_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++#define IA_DPC_VERSION "1.0.0.0"
++typedef struct ia_dpc_t ia_dpc;
++
++/*!
++ * \brief SD-DPC runtime input.
++ */
++typedef struct {
++    short *frame_data;                 /*!< fixed point image */
++    int frame_width;                   /*!< current frame width (might be cropped) */
++    int frame_height;                  /*!< current frame height (might be cropped) */
++} sd_dpc_input;
++
++/*!
++ * \brief SD-DPC per-run output.
++ */
++typedef struct {
++    short *defect_lut;          /*!< defects LUT stores the column indices (one-based) of the approved defects per row. size frame_height x max_defects_per_line */
++    int dpc_lut_width;        /*!< the width of the DP LUT, equal to maximum number of defects per line */
++    int dpc_lut_height;       /*!< the height of the DP LUT, equal to sensor height */
++    bool dpc_lut_changed;     /*!< true if the new defects have been added */
++} sd_dpc_output;
++
++/*!
++ * \brief Initialize IA_DPC.The function parses the given AIQB data and determines if the SD-DPC should be used. 
++ *        If yes the object is allocated and initialized.
++ *        If not, null is returned
++ *
++ * \param[in]     aiqb_data              Mandatory.\n
++ *                                       CPFF that contains tuning parameters for camera, ISP and AIQ algorithms.
++ *                                       If NULL is given the function will return NULL.
++ * \param[in]     ia_cmc                 Mandatory.\n
++ *                                       Parsed camera module characterization structure. Internal copy of the structure will be taken.
++ *                                       If NULL is given the function will return NULL.
++ * \param[in]     ia_dpcd_data           Mandatory.\n
++ *                                       loaded DPCD data. Should not be NULL, but have size = 0 instead
++ * \param[in]     max_defects_per_line   Mandatory.\n
++ *                                       maximum number of defects per line support by the ISP.
++ * \param[in]     stripe_number_of_lines Mandatory.\n
++ *                                       The maximum stripe height.
++ * return                                IA_DPC handle. Use the returned handle as input parameter for the consequent IA_DPC calls.
++ *                                       Returns NULL is SD-DPC should be bypassed.
++ */
++LIBEXPORT ia_dpc*
++ia_dpc_init(const ia_binary_data *aiqb_data,
++            const ia_cmc_t *ia_cmc,
++            const ia_binary_data *ia_dpcd_data,
++            unsigned int max_defects_per_line,
++            unsigned int stripe_number_of_lines);
++
++/*!
++ * \brief De-initialize IA_DPC.
++ * All memory allocated by DPC algoriths are freed. DPC handle can no longer be used.
++ *
++ * \param[in] ia_dpc                Mandatory.\n
++ *                                  DPC instance handle.
++ */
++LIBEXPORT void
++ia_dpc_deinit(ia_dpc *ia_dpc);
++/*!
++ * \brief SD-DPC execution based on input parameters and stripe.
++ *
++ *  \param [in]      ia_dpc         Mandatory.\n
++ *                                  SD-DPC state, updated with the intermediate results
++ *  \param [in,out]  stripe_ptr     Mandatory.\n
++ *                                  Stripe data that include the RAW pixels and the exisitng/ missing margins information.
++ *  \param [out]     dpc_output     Mandatory.\n
++ *                                  Output LUT of the verified defect pixels. The new defect pixels can be only in the given stripe region.
++ *                                  Results can be used directly as input for AIC.
++ *  \return                         Error code.
++ */
++
++LIBEXPORT ia_err
++ia_dpc_run(ia_dpc *ia_dpc,
++          const sd_dpc_input *stripe_ptr,
++          const ia_aiq_frame_params *aiq_frame_params_ptr,
++          const ia_aiq_ae_exposure_result *ae_exposure_result_ptr,
++          sd_dpc_output *dpc_output);
++
++/*!
++ * \param[in]  ia_aiq               Mandatory.\n
++ *                                  DPC instance handle.
++ * \param[out] out_ia_dpcd_data     Mandatory.\n
++ *                                  Contains various DPC related information, collected during run-time and subject to
++ *                                  be stored in a host file system. Host will copy this data, if ia_dpcd_data->size > 0
++ *                                  and ia_dpcd_data->data != NULL; SD-DPC is responsible to deallocate data buffer
++ *                                  during ia_dpc_deinit().
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err 
++ia_dpc_get_dpcd_data(
++        ia_dpc *ia_dpc,
++        ia_binary_data *out_ia_dpcd_data);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* _IA_DPC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
+new file mode 100644
+index 000000000000..ed98f395d998
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
+@@ -0,0 +1,286 @@
++/*
++ * Copyright 2014-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \mainpage IA DVS documentation
++ *
++ * \section general General info
++ *
++ * Digital video stabilization API.
++ *
++ */
++
++/*!
++ * \file ia_dvs.h
++ * \brief Definitions and declarations of Intel DVS library.
++ */
++
++#ifndef _IA_DVS_H_
++#define _IA_DVS_H_
++
++#include <stdint.h>
++#include "ia_dvs_types.h"
++#include "ia_aiq_types.h"
++#include "ia_cmc_types.h"
++#include "ia_aiq.h"
++#include "ia_dvs_deprecated.h"
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*! \brief Initialize the DVS module.
++ *
++ * \param[out]  dvs_state            dvs state.
++ *                                   This is a pointer to a pointer to a module.
++ * \param[in]   a_aiq_tuning_binary  aiqb binary tuning parameter.
++ * \param[in]   cmc                  cmc_t parameter.
++ * \return                           0 for no error, others for error.
++ *
++ * This function initializes the DVS module. This allocates and initializes
++ * internal data structures. This function must always be called before any
++ * other ia_dvs function.
++ */
++LIBEXPORT ia_err
++ia_dvs_init(ia_dvs_state **dvs_state,
++            const ia_binary_data *a_aiq_tuning_binary,
++            const ia_cmc_t *cmc);
++
++/*! \brief Configure the DVS module.
++ *
++ * \param[in]   dvs_state           dvs state.
++ * \param[in]   config              dvs configuration
++ * \param[in]   digital_zoom_ratio  digital zoom ratio.
++ * \return                          0 for no error, others for error.
++ *
++ * This function configures the DVS module. This allocates and initializes
++ * internal data structures. This function must always be called after ia_dvs_init
++ * and before any other ia_dvs function is called.
++ */
++LIBEXPORT ia_err
++ia_dvs_config_v1(ia_dvs_state *dvs_state,
++                 const ia_dvs_configuration_v1 *config,
++                 float digital_zoom_ratio);
++
++/*! \brief Deinitialize the DVS module.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ *
++ * This function deinitilizes the DVS module. This frees the allocated memory.
++ */
++LIBEXPORT void
++ia_dvs_deinit(ia_dvs_state *dvs_state);
++
++/*! \brief Set the DVS statistics.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ * \param[in]   statistics      Pointer to generic DVS statistics
++ * \param[in]   ae_results      Optional. Pointer to AIQ AE results.
++ * \param[in]   af_results      Optional. Pointer to AIQ AF results.
++ * \param[in]   sensor_events   Optional. Pointer to sensor events data which contains accelerometer,
++ *                              gravity and gyroscope events.
++ * \param[in]   frame_readout_start     Frame readout start time. Optional for image based DVS. Mandatory for gyro based DVS
++ * \param[in]   frame_readout_end       Frame readout end time. Optional for image based DVS. Mandatory for gyro based DVS
++ * \return                      0 for no error, others for error.
++ *
++ * This function receives DVS statistics in generic format.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_statistics(ia_dvs_state *dvs_state,
++                      const ia_dvs_statistics *statistics,
++                      const ia_aiq_ae_results *ae_results,
++                      const ia_aiq_af_results *af_results,
++                      const ia_aiq_sensor_events *sensor_events,
++                      const unsigned long long frame_readout_start,
++                      const unsigned long long frame_readout_end);
++
++/*! \brief Execute DVS main process.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ * \param[in]   focus_position  Focus motor position in terms of those used by the sensor module.
++ *                              Value 0 will use the first LDC grid from the CPF.
++ * \return                      0 for no error, others for error.
++ *
++ * This function processes the DVS main functionality. This generates a
++ * lens distortion configuration and calculates global motion.
++ */
++LIBEXPORT ia_err
++ia_dvs_execute(ia_dvs_state *dvs_state,
++               uint16_t focus_position);
++
++/*! \brief allocate the DVS morphing table.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ * \param[out]  morph_table     Pointer to Pointer to morphing table.
++ * \return                      0 for no error, others for error.
++ *
++ * This function allocates the memory of dvs morphing table.
++ * This allocates the struct ia_dvs_morph_table itself, and the members in the structure.
++ */
++LIBEXPORT ia_err
++ia_dvs_allocate_morph_table(ia_dvs_state *dvs_state,
++                            ia_dvs_morph_table **morph_table);
++
++/*! \brief Free the DVS morphing table.
++ *
++ * \param[in]   morph_table     Pointer to morphing table.
++ * \return                      0 for no error, others for error.
++ *
++ * This function frees the memory of dvs morphing table.
++ * Each allocated member in morph_table, and morph_table itself are freed.
++ */
++LIBEXPORT ia_err
++ia_dvs_free_morph_table(ia_dvs_morph_table *morph_table);
++
++/*! \brief Get the GDC morphing table.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ * \param[out]  morph_table     Pointer to the GDC morph table
++ * \return                      0 for no error, others for error.
++ *
++ * This function calculates GDC morphing table from lens distortion configuration, digital zoom and global motion.
++ */
++LIBEXPORT ia_err
++ia_dvs_get_morph_table(ia_dvs_state *dvs_state,
++                       ia_dvs_morph_table *morph_table);
++
++/*! \brief Set non blanking ratio.
++ *
++ * \param[in]   dvs_state               dvs_state.
++ *                                      This is a pointer to a module.
++ * \param[in]   nonblanking_ratio       non blanking ratio.
++ *                                      Value 0.0 means no rolling shutter correction.
++ * \return                              0 for no error, others for error.
++ *
++ * This function specifies the rolling shutter correction effect.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_non_blank_ratio(ia_dvs_state *dvs_state,
++                           float nonblanking_ratio);
++
++/*! \brief Set digital zoom magnitude.
++ *
++ * \param[in]   dvs_state       dvs state.
++ *                              This is a pointer to a module.
++ * \param[in]   magnitude       digital zoom magnitude
++ * \return                      0 for no error, others for error.
++ *
++ * This function specifies the digital zoom magnitude
++ */
++LIBEXPORT ia_err
++ia_dvs_set_digital_zoom_magnitude(ia_dvs_state *dvs_state,
++                                  float magnitude);
++
++/*!
++ * \brief Set the distortion configuration.
++ *
++ * This function specifies lens distortion correction grid. This will override LDC defined in CPF.
++ *
++ * \param[in]   dvs_state           dvs state.
++ *                                  This is a pointer to a module.
++ * \param[in]   distortion_config   Distortion grid configuration.
++ * \return                          0 for no error, others for error.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_distortion_config(ia_dvs_state *dvs_state,
++                             const ia_dvs_distortion_config *distortion_config);
++
++/*!
++ * \brief Set digital zoom mode.
++ *
++ * This function specifies the digital zoom mode.
++ *
++ * In mode ia_dvs_zoom_mode_center ia_dvs_set_digital_zoom_magnitude() is used to control
++ * digital zoom. Zooming is performed to the center of the image.
++ *
++ * In mode ia_dvs_zoom_mode_region ia_dvs_set_digital_zoom_region() is used to control
++ * zooming position and magnitude.
++ *
++ * By default mode ia_dvs_zoom_mode_center is used.
++ *
++ * \param[in]   dvs_state           dvs state.
++ *                                  This is a pointer to a module.
++ * \param[in]   zoom_mode           digital zoom mode
++ * \return                          0 for no error, others for error.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_digital_zoom_mode(ia_dvs_state *dvs_state,
++                             ia_dvs_zoom_mode zoom_mode);
++
++/*!
++ * \brief Set digital zoom region.
++ *
++ * This function specifies the digital zoom region. It requires setting
++ * the zoom mode to ia_dvs_zoom_mode_region.
++ *
++ * \param[in]   dvs_state           dvs state.
++ *                                  This is a pointer to a module.
++ * \param[in]   zoom_region         Rectangle which is zoomed in.
++ *                                  This region is cropped and scaled
++ *                                  to the size of the output image.
++ *                                  Coordinates are given in BQs.
++ * \return                          0 for no error, others for error.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_digital_zoom_region(ia_dvs_state *dvs_state,
++                               ia_rectangle *zoom_region);
++
++/*!
++ * \brief Set digital zoom coordinate.
++ *
++ * This function specifies the digital zoom coordinate. It requires setting
++ * the zoom mode to ia_dvs_zoom_mode_coordinate.
++ *
++ * \param[in]   dvs_state           dvs state.
++ *                                  This is a pointer to a module.
++ * \param[in]   zoom_coordinate     Coordinate which is zoomed in.
++ *                                  Coordinate is given in BQs.
++ * \return                          0 for no error, others for error.
++ */
++LIBEXPORT ia_err
++ia_dvs_set_digital_zoom_coordinate(ia_dvs_state *dvs_state,
++                               ia_coordinate *zoom_coordinate);
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                          Version string.
++ */
++LIBEXPORT const char* ia_dvs_get_version(void);
++
++/*! \brief Get the homography matrix for image stabilization.
++*
++* \param[in]   dvs_state             dvs state.
++*                                    This is a pointer to a module.
++* \param[out]  image_transformation  Pointer to the transformation structure where results are saved.
++* \return                           0 for no error, others for error.
++*
++* This function calculates gets a set of homography matrices to perform video stabilization for one frame.
++*/
++LIBEXPORT ia_err
++ia_dvs_get_image_transformation(ia_dvs_state *dvs_state,
++                                ia_dvs_image_transformation *image_transformation);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_DVS_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
+new file mode 100644
+index 000000000000..1f9335125a63
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright 2014-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _IA_DVS_DEPRECATED_H_
++#define _IA_DVS_DEPRECATED_H_
++
++#include "ia_dvs_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/** DVS configuration.
++ * This structure contains DVS configuration.
++ */
++typedef struct
++{
++    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
++    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
++    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
++    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
++    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
++    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
++    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
++    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
++    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
++    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
++    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
++    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
++    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
++                                                     used when validating outgoing morphing table. */
++    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
++    int frame_rate;                             /**< Frame rate */
++    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
++                                                     invalid memory locations in GDC.
++
++                                                     This configuration should come from FW
++                                                     to inform how large buffer is allocated for GDC processing.
++                                                     Morphing table coordinates generated by DVS must fit inside
++                                                     GDC buffer limits. GDC buffer is allocated by FW and
++                                                     it needs to allocate extra padding for each side of the image data.
++                                                     This allows DVS to generate morphing table which points are outside of the image area
++                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
++                                                     barrel shaped. */
++    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
++                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
++                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
++                                                     together.
++                                                     Lens distortion correction is calculated from the full sensor resolution and
++                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
++                                                     the GDC input image.*/
++    bool validate_morph_table;                  /**< False disables morph table validation, true enables. Morph table needs to be validated to
++                                                     protect FW. Starting from IPU4 validation is performed in PAL. */
++    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
++                                                     provide only UV table in floating point format. */
++    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
++                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
++                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
++                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
++    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
++} ia_dvs_configuration;
++
++/*! \brief Configure the DVS module.
++ *
++ * \param[in]   dvs_state           dvs state.
++ * \param[in]   config              dvs configuration
++ * \param[in]   digital_zoom_ratio  digital zoom ratio.
++ * \return                          0 for no error, others for error.
++ *
++ * This function configures the DVS module. This allocates and initializes
++ * internal data structures. This function must always be called after ia_dvs_init
++ * and before any other ia_dvs function is called.
++ */
++LIBEXPORT ia_err
++ia_dvs_config(ia_dvs_state *dvs_state,
++              const ia_dvs_configuration *config,
++              float digital_zoom_ratio);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_DVS_DEPRECATED_H_ */
+\ No newline at end of file
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
+new file mode 100644
+index 000000000000..335aeb090337
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
+@@ -0,0 +1,304 @@
++/*
++ * Copyright 2014-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++/*!
++ * \file ia_dvs_types.h
++ * \brief Data types and enumerations for Intel DVS library.
++ */
++#ifndef _IA_DVS_TYPES_H_
++#define _IA_DVS_TYPES_H_
++#include <stdint.h>
++#include "ia_types.h"
++
++#define DVS_HOMOGRAPHY_MATRIX_MAX_COUNT 16
++
++typedef struct t_dvs_facade ia_dvs_state;
++
++/** DVS Algorithm.
++ * These settings specify the members of correction axes.
++ * ia_dvs_algorihm_0_axis is a special mode. In this case, library does not compensate the
++ * motion, works for digital zoom and distortion correction.
++ */
++typedef enum
++{
++    ia_dvs_algorithm_0_axis     = 0,                        /**< 0 axis, means video stabilization is turned off */
++    ia_dvs_algorithm_2_axis     = 2,                        /**< 2 axis - x and y translations */
++    ia_dvs_algorithm_3_axis     = 3,                        /**< 3 axis - x and y translations and z-scale*/
++    ia_dvs_algorithm_4_axis     = 4,                        /**< 4 axis */
++    ia_dvs_algorithm_5_axis     = 5,                        /**< 5 axis - x and y translations and all rotations*/
++    ia_dvs_algorithm_6_axis     = 6,                        /**< 6 axis - x and y translations, z-scale and all rotations*/
++    ia_dvs_algorithm_max_axis   = ia_dvs_algorithm_6_axis,  /**< maximum axis */
++    ia_dvs_algorithm_motion_sensor = 10                     /**< motion sensor based stabilization */
++} ia_dvs_algorithm_version;
++
++/** DVS2 BQ resolution.
++ * These parameter are BQ resolution configuration.
++ */
++typedef struct
++{
++    int width_bq;                           /**< width [BQ] */
++    int height_bq;                          /**< height [BQ] */
++} ia_dvs_bq_resolution;
++
++/** GDC Scan Mode
++ * These settings specify the gdc scan mode.
++ */
++typedef enum
++{
++    ia_dvs_gdc_scan_mode_stb    = 0,        /**< STB (slide to the bottom) */
++    ia_dvs_gdc_scan_mode_str,               /**< STR (slide to the right) */
++} ia_dvs_gdc_scan_mode;
++
++/** GDC Interpolation Method
++ * These settings specify the gdc interpolation method.
++ */
++typedef enum
++{
++    ia_dvs_gdc_interpolation_nnd= 0,        /**< NND (nearest neighbor) */
++    ia_dvs_gdc_interpolation_bli,           /**< BLI (bilinear) */
++    ia_dvs_gdc_interpolation_bci,           /**< BCI (bicubic) */
++    ia_dvs_gdc_interpolation_lut,           /**< LUT (look up table) */
++} ia_dvs_gdc_interpolation;
++
++/** GDC Performance Point
++ * These settings specify the gdc performance point.
++ */
++typedef enum
++{
++    ia_dvs_gdc_performance_point_1x1= 0,    /**< 1x1 */
++    ia_dvs_gdc_performance_point_2x1,       /**< 2x1 */
++    ia_dvs_gdc_performance_point_1x2,       /**< 1x2 */
++    ia_dvs_gdc_performance_point_2x2,       /**< 2x2 */
++} ia_dvs_gdc_performance_point;
++
++/** GDC hardware configuration
++ * These parametes are the gdc hardware block configuration.
++ * dvs library use these parameters just check the gdc constraints,
++ * do NOT use these parameters for any controls nor calculations.
++ */
++typedef struct
++{
++    ia_dvs_gdc_scan_mode scan_mode;
++    ia_dvs_gdc_interpolation interpolation;
++    ia_dvs_gdc_performance_point performance_point;
++} ia_dvs_gdc_hw_configuration;
++
++/** GDC buffer configuration
++ *  These parameters indicates the limits of the GDC ISP buffer.
++ *  DVS needs to limit morphing table coordinates to fit inside GDC
++ *  ISP buffer.
++ */
++typedef struct
++{
++    unsigned int x_offset;  /* X offset [BQ] for the first pixel of image data */
++    unsigned int y_offset;  /* Y offset [BQ] for the first pixel of image data*/
++    unsigned int width;     /* Total width [BQ] for the buffer */
++    unsigned int height;    /* Total height [BQ] for the buffer */
++} ia_dvs_gdc_buffer_config;
++
++/** Total cropping parameters
++ *  These parameters contain sensor and ISP cropping information without any scaling or binning.
++ *  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
++ *  This information is used to crop lens distortion grids accordingly.
++ */
++typedef struct
++{
++    unsigned int horizontal_crop_offset;    /* Read out offset horizontal [BQ] */
++    unsigned int vertical_crop_offset;      /* Read out offset vertical [BQ] */
++    unsigned int cropped_width;             /* Width of cropped area without any scaling [BQ] */
++    unsigned int cropped_height;            /* Height of cropped area without any scaling [BQ] */
++} ia_dvs_crop_params;
++
++
++
++
++
++/** GDC HW limits which are specific for particluar IPU
++ * version and need to be taken into account in the
++ * DVS algorithm side when preparing a correct morphing table
++ */
++
++
++
++
++/** This enum is a list of possible constraints on the DVS morphing
++ * table which need to be ensured during DVS algorithm execution.
++ */
++typedef enum
++{
++    ia_dvs_no_constraints = 0,     /**< No additional constraints on the morphing table need to be performed */
++    ia_dvs_woi_validation,         /**< The morphing table is validated for access violation in FW duirng WOI pixel data fetch;
++                                        a violation results in no compensation for the current frame */
++    ia_dvs_max_tetragon_size,      /**< DVS ensures that the morph table tetragons fit inside pre-defined max width and height */
++} ia_dvs_morph_table_constraints;
++
++/** DVS configuration.
++ * This structure contains DVS configuration.
++ */
++typedef struct
++{
++    ia_dvs_algorithm_version num_axis;          /**< Algorithm mode */
++    float nonblanking_ratio;                    /**< Effective vertical scan ratio, used for rolling correction (Non-blanking ration of frame interval) */
++    ia_dvs_bq_resolution source_bq;             /**< Input image size [BQ] for GDC block */
++    ia_dvs_bq_resolution output_bq;             /**< Output image size [BQ] from GDC block */
++    ia_dvs_bq_resolution envelope_bq;           /**< GDC effective envelope size [BQ] */
++    ia_dvs_bq_resolution ispfilter_bq;          /**< Padding of the image which is corrupted and should not be visible in the output image [BQ] */
++    int gdc_shift_x;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
++    int gdc_shift_y;                            /**< Shift value of morphing table depend on ISP pipe. [chroma pixel] */
++    unsigned int oxdim_y;                       /**< Output block width  for Y plane [pixel] */
++    unsigned int oydim_y;                       /**< Output block height for Y plane [pixel] */
++    unsigned int oxdim_uv;                      /**< Output block width  for U/V plane [chroma pixel] */
++    unsigned int oydim_uv;                      /**< Output block height for U/V plane [chroma pixel] */
++    ia_dvs_gdc_hw_configuration hw_config;      /**< GDC h/w configuration. DVS does not set these values anywhere so it's only
++                                                     used when validating outgoing morphing table. */
++    bool use_lens_distortion_correction;        /**< False disables LDC, true enables */
++    int frame_rate;                             /**< Frame rate */
++    ia_dvs_gdc_buffer_config gdc_buffer_config; /**< Configuration of the GDC buffer is used inside DVS to prevent morphing table to point
++                                                     invalid memory locations in GDC.
++
++                                                     This configuration should come from FW
++                                                     to inform how large buffer is allocated for GDC processing.
++                                                     Morphing table coordinates generated by DVS must fit inside
++                                                     GDC buffer limits. GDC buffer is allocated by FW and
++                                                     it needs to allocate extra padding for each side of the image data.
++                                                     This allows DVS to generate morphing table which points are outside of the image area
++                                                     but still inside GDC buffer (padding area). This might be the case e.g. if LDC grid is
++                                                     barrel shaped. */
++    ia_dvs_crop_params crop_params;             /**< Sensor and ISP cropping parameteres in native resolution (without any scaling or binning).
++                                                     If scaling is performed before cropping, cropping offsets need to be calculated in native
++                                                     resolution. Also if cropping is done in multiple places, everything needs to be combined
++                                                     together.
++                                                     Lens distortion correction is calculated from the full sensor resolution and
++                                                     DVS needs to know how distortion grids need to be cropped so that they will match with
++                                                     the GDC input image.*/
++    ia_dvs_morph_table_constraints morph_table_constraints;
++                                                /**< Constraints defined on the DVS morphing table which need to be taken into account during
++                                                     DVS algorithm execution for smoother video perception */
++    bool gdc_uses_floats;                       /**< False keeps dvs providing fixed point Y and UV morphing tables (legacy). True changes dvs to
++                                                     provide only UV table in floating point format. */
++    float quaternion_clip_max_angle;            /**< Maximum allowed angle [degrees] of rotation for rotational motion compensation. The value is
++                                                     used to clip the angle of rotation for shake motion or rolling shutter compensation. The clipping
++                                                     value does not depend on the orientation of the axis of rotation. This should be non-negative
++                                                     value and depends on the resolution and envelope and GDC HW limitations.*/
++    float gyro_to_cam_orientation[9];           /**< Contains the orientation of gyro sensor in relation to camera sensor. */
++} ia_dvs_configuration_v1;
++
++/** Distortion grid configuration.
++ * Structure defines lens distortion grid.
++ */
++typedef struct
++{
++    int16_t ldc_col_start;      /*!< Table X offset in pixels from left corner of the sensor maximum visible area.
++                                     e.g. If ldc_col_start=ldc_block_width*(-1)
++                                     then ldc table offset is is one block left compared to the maximum visible sensor area. */
++    int16_t ldc_row_start;      /*!< Table Y offset in pixels from upper corner of the sensor maximum visible area.
++                                     e.g. If ldc_row_start=ldc_block_height*(-1)
++                                     then ldc table offset is is one block up compared to the maximum visible sensor area.  */
++    int16_t ldc_grid_width;     /*!< Indicates number of grid vertices on the horizontal axis. */
++    int16_t ldc_grid_height;    /*!< Indicates number of grid vertices on the vertical axis. */
++    int16_t ldc_block_width;    /*!< Width of the original grid cell (without correction). */
++    int16_t ldc_block_height;   /*!< Height of the original grid cell (without correction). */
++    float *x_deltas;            /*!< Table of x-axis deltas of the grid points. The delta at each point represents the distortion
++                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
++    float *y_deltas;            /*!< Table of y-axis deltas of the grid points. The delta at each point represents the distortion
++                                     that was done. Contains [ldc_grid_height  x ldc_grid_width] values. */
++} ia_dvs_distortion_config;
++
++/** DVS Motion vector structure.
++ * This structure contains definition for one local motion vector.
++ */
++typedef struct
++{
++    float x_start;          /* Normalized X start position */
++    float y_start;          /* Normalized Y start position */
++    float x_end;            /* Normalized X end position */
++    float y_end;            /* Normalized y end position */
++    float weight;           /* Weight of the motion vector [0.0, 1.0]. Describes accuracy of the motion vector */
++} ia_dvs_motion_vector;
++
++/** DVS Motion vectors.
++ * This structure contains DVS statistics.
++ */
++typedef struct
++{
++    unsigned int vector_count;              /* Number of motion vectors */
++    ia_dvs_motion_vector *motion_vectors;   /* Table of local motion vectors. Contains [vector_count] values. */
++} ia_dvs_statistics;
++
++/** DVS morphing table structure.
++ * This structure contains morphing table which includes
++ * lens distortion correction, digital zoom, rolling shutter correction and video stabilization.
++ */
++typedef struct
++{
++    uint32_t width_y;
++    uint32_t height_y;
++    uint32_t width_uv;
++    uint32_t height_uv;
++    uint32_t *xcoords_y;
++    uint32_t *ycoords_y;
++    uint32_t *xcoords_uv;
++    uint32_t *ycoords_uv;
++    bool morph_table_changed;
++    float *xcoords_uv_float; /* uv x-coordinates in float format */
++    float *ycoords_uv_float; /* uv y-coordinates in float format */
++    bool disable_gdc;        /* Info flag for GDC to indicate input resolution = output resolution and no warping is done. */
++} ia_dvs_morph_table;
++
++/** Digital zoom mode
++ * These settings specify digital zoom mode.
++ */
++typedef enum {
++        ia_dvs_zoom_mode_center = 0,
++        ia_dvs_zoom_mode_region,
++        ia_dvs_zoom_mode_coordinate
++} ia_dvs_zoom_mode;
++
++/** DVS global translation parameters.
++ * This structure contains the frame-to-frame translations along x and y axes
++ * and also a coefficient for scene reliability in the range [0, 1] with 1 being
++ * totally reliable estimate and 0 being totally unreliable
++ */
++typedef struct
++{
++    uint32_t plane_translation_x;
++    uint32_t plane_translation_y;
++    float reliability_coefficient;
++} ia_dvs_global_translation;
++
++
++typedef struct
++{
++    int32_t start_row;             /* Vertical offset in lines where matrix is applied.
++                                      Between two offsets corresponding matrices are linearly interpolated
++                                      element wise.*/
++    float matrix[3][3];            /* Defines one 3x3 homography matrix which is ordered row wise. */
++} ia_dvs_homography_matrix;
++
++/** Image transformation parameters.
++* This structure defines image transformation with a list of 3x3 homography matrices.
++* Maximum number of homography matrices is 16 and for each matrix start offset
++* should be defined.
++*/
++typedef struct
++{
++    int32_t num_homography_matrices;                                     /* Number of homography matrices */
++    ia_dvs_homography_matrix matrices[DVS_HOMOGRAPHY_MATRIX_MAX_COUNT];  /* Homography matrices for image
++                                                                            transformation. Can be used e.g.
++                                                                            for image alignment or
++                                                                            video stabilization. */
++} ia_dvs_image_transformation;
++
++#endif /* _IA_DVS_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
+new file mode 100644
+index 000000000000..6bcdd4f407d6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
+@@ -0,0 +1,103 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2014-2016 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intels
++* suppliers or licensors in any way.
++*/
++
++/*!
++ * \file ia_emd_decoder.h
++ * \brief Definitions of functions in Embedded Data decoder.
++*/
++
++#ifndef _IA_EMD_DECODER_H_
++#define _IA_EMD_DECODER_H_
++
++#include "ia_aiq_types.h"
++#include "ia_emd_types.h"
++#include "ia_types.h"
++#include "ia_log.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef LOG_EMD
++#define IA_EMD_LOG(fmt, ...) IA_LOG(ia_log_debug, "IAEMD: " fmt, ## __VA_ARGS__)
++#define IA_EMD_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAEMD: " fmt, ## __VA_ARGS__)
++#define IA_EMD_LOG_INFO(fmt, ...) IA_LOG(ia_log_info, "IAEMD: " fmt, ## __VA_ARGS__)
++#else
++#define IA_EMD_LOG(...) ((void)0)
++#define IA_EMD_LOG_ERROR(...) ((void)0)
++#define IA_EMD_LOG_INFO(...) ((void)0)
++#endif
++
++
++/*!
++ * \brief Creates Embedded Data Decoder.
++ *
++ * \param[in] ia_cmc                        Mandatory.\n
++ *                                          Parsed camera module characterization structure. Internal copy of the structure will be taken.
++ * \return                                  Pointer to Embedded Data Decoder handle.
++ */
++LIBEXPORT ia_emd_decoder_t *
++ia_emd_decoder_init(
++    const ia_cmc_t *ia_cmc);
++
++
++/*!
++ * \brief Deletes Sensor Data Decoder.
++ *
++ * \param[in] emd_decoder                   Mandatory. \n
++ *                                          Pointer to decoder handle.
++ * \return                                  None.
++ */
++LIBEXPORT void
++ia_emd_decoder_deinit(ia_emd_decoder_t *emd_decoder);
++
++
++/*!
++ * \brief Runs Sensor Data Decoder.
++ *
++ * \param[in] emd_bin                       Mandatory. \n
++ *                                          Pointer to sensor embedded data binary blob.
++ * \param[in] emd_mode                      Mandatory. \n
++ *                                          Pointer to sensor embedded data run-time configuration.
++ * \param[in] sensor_descriptor             Mandatory. \n
++ *                                          Pointer to sensor specific descriptor.
++ * \param[in/out] emd_decoder               Mandatory. \n
++                                            Pointer to decoder handle. Contains decoded exposure data as well.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_emd_decoder_run(
++    const ia_binary_data *emd_bin,
++    const ia_emd_mode_t *emd_mode,
++    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
++    ia_emd_decoder_t *emd_decoder);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_EMD_DECODER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
+new file mode 100644
+index 000000000000..419d2a277adc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
+@@ -0,0 +1,205 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2014-2015 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intels
++* suppliers or licensors in any way.
++*/
++
++/*!
++ * \file ia_emd_types.h
++ * \brief Enumerations, structures and definitions used in the Embedded Data decoder.
++*/
++
++#ifndef _EMD_TYPES_H_
++#define _EMD_TYPES_H_
++
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ *  Revision of Sensor Data Decoder library, format 0xYYMMDDVV, where:
++ * - YY: year,
++ * - MM: month,
++ * - DD: day,
++ * - VV: version ('01': ver 0.1,'11': ver 1.1 etc.)
++ */
++#define IA_SENSOR_DATA_DECODER_REVISION         0x15080711
++
++#define MAX_NUMBER_OF_BLOCK_IDS                 0xF00
++
++/* CMC Comment */
++#define AIQB_EMD_RECORD_1_ID                    1
++#define AIQB_EMD_RECORD_1_VERSION               100
++
++/* CMC Embedded Data */
++#define AIQB_EMD_RECORD_21_ID                   21
++#define AIQB_EMD_RECORD_21_VERSION              100
++#define AIQB_EMD_RECORD_21_VERSION_101          101
++
++
++#define SIZEOF_CONFIG_DATA_BLOCK_T              16         /*!< Size of ia_emd_config_block_t structure in bytes. */
++
++/*!
++ * \brief Elementary embedded data block IDs.
++ */
++typedef enum
++{
++    /* Parameters in sensor units */
++    fine_int_time_sensor_units = 0,                 /*!<  0: Fine integration time in sensor units. */
++    coarse_int_time_sensor_units,                   /*!<  1: Coarse integration time in sensor units. */
++    a_gain_global_sensor_units,                     /*!<  2: Analog gain global in sensor units. */
++    d_gain_global_sensor_units,                     /*!<  3: Digital gain global in sensor units. */
++    d_gain_R_sensor_units,                          /*!<  4: Digital gain R in sensor units. */
++    d_gain_GR_sensor_units,                         /*!<  5: Digital gain GR in sensor units. */
++    d_gain_GB_sensor_units,                         /*!<  6: Digital gain GB in sensor units. */
++    d_gain_B_sensor_units,                          /*!<  7: Digital gain B in sensor units. */
++
++    /* Parameters in generic units */
++    fine_int_time_generic_units,                    /*!<  8: Fine integration time in generic_units. */
++    coarse_int_time_generic_units,                  /*!<  9: Coarse integration time in generic_units. */
++    a_gain_global_generic_units,                    /*!< 10: Analog gain global in generic_units. */
++    d_gain_global_generic_units,                    /*!< 11: Digital gain global in generic_units. */
++    d_gain_R_generic_units,                         /*!< 12: Digital gain R in generic_units. */
++    d_gain_GR_generic_units,                        /*!< 13: Digital gain GR in generic_units. */
++    d_gain_GB_generic_units,                        /*!< 14: Digital gain GB in generic_units. */
++    d_gain_B_generic_units,                         /*!< 15: Digital gain GB in generic_units. */
++
++    /* Additional parameters */
++    analog_gain_apex_format,                        /*!< 16: Analog gain in APEX format. */
++    digital_gain_apex_format,                       /*!< 17: Digital gain in APEX format. */
++    total_gain_apex_format,                         /*!< 18: Total gain in APEX format. */
++    exposure_time_us,                               /*!< 19: Exposure time in us. */
++    iso_speed,                                      /*!< 20: ISO speed value. */
++    f_number_apex,                                  /*!< 21: F-number in APEX format. */
++    face_count,                                     /*!< 22: Number of faces recognized in the image. */
++    face_largest_index,                             /*!< 23: Index of the largest face in a face array. */
++    face_top_left_corner_x,                         /*!< 24: Top-left corner of face region, X coordinates of faces recognized in the image. */
++    face_top_left_corner_y,                         /*!< 25: Top-left corner of face region, Y coordinates of faces recognized in the image. */
++    face_bottom_right_x,                            /*!< 26: Bottom-right corner of face region, X coordinates of faces recognized in the image. */
++    face_bottom_right_y,                            /*!< 27: Bottom-right corner of face region, Y coordinates of faces recognized in the image. */
++
++    /* Misc. parameters */
++    frame_length,                                   /*!< 28: Total line number per one frame. */
++    line_length,                                    /*!< 29: Total pixel number per one line. */
++    frame_counter,                                  /*!< 30: Frame counter. */
++    x_output_size,                                  /*!< 31: Horizontal output width. */
++    y_output_size,                                  /*!< 32: Vertical output height. */
++
++    /* Keep it as last one */
++    num_of_embedded_data_block_ids                  /*!< Number of Embedded Data block IDs. */
++} ia_emd_block_id_t;
++
++
++/*!
++ * \brief Elementary Embedded Data block.
++ * Each block describes the content of a single elementary data unit, which could be provided from different
++ * sources, e.g.:
++ * - RAW data embedded lines;
++ * - External ISP embedded data block;
++ * - Any other type of sources.
++ */
++typedef struct
++{
++    uint32_t offset;                                /*!< Offset from beginning of data source blob in bytes. */
++    uint16_t total_blocks;                          /*!< Total number of Elementary Data blocks in a value. */
++    uint16_t block_number;                          /*!< Number of the current block in a series. */
++    uint8_t  data_src;                              /*!< Value from emd_source_t enumeration. */
++    uint8_t  block_id;                              /*!< Value from emd_block_id_t enumeration. */
++    uint8_t  bit_mask;                              /*!< Bit mask, applyed to the byte (before applying the shift). */
++    int8_t   byte_shift_value;                      /*!< Shift value (bits) applyed to byte. E.g. -2 is (N >> 2), 3 is (N << 3). */
++    uint8_t  data_format;                           /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
++    uint8_t  msb_num;                               /*!< Most significant bit of the block (e.g 11 if [11:8]), if applicable. */
++    uint8_t  lsb_num;                               /*!< Least significant bit of the block (e.g 8 if [11:8]), if applicable. */
++    uint8_t  embedded_line;                         /*!< Embedded line #, where data block is located. */
++} ia_emd_config_block_t;
++
++
++/*!
++ * \brief Describes a run-time configuration of sensor embedded data.
++ */
++typedef struct
++{
++    uint32_t exp_id;                                /*!< A unique exposure ID of the frame. */
++    int32_t stride;                                 /*!< Stride of embedded data lines. */
++    int32_t height;                                 /*!< Num of lines in sensor emb.data, e.g for imx227 it should '2'. */
++    int32_t *effective_width;                       /*!< Effective data for each line, e.g for imx227 it should be {160, 62}. */
++} ia_emd_mode_t;
++
++
++/*!
++ * \brief Decoded Embedded Data block.
++ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
++ */
++typedef struct
++{
++    int64_t data;                                   /*!< Data of the block. */
++    uint8_t data_src;                               /*!< Value from emd_source_t enumeration. */
++    uint8_t block_id;                               /*!< Value from emd_block_id_t enumeration. */
++    uint8_t data_format;                            /*!< Format of the data (block describes), value from ia_mkn_dfid enumeration. */
++    uint8_t reserved;                               /*!< Reserved. */
++} ia_emd_decoded_block_t;
++
++/*!
++ * \brief Decoded Embedded Data block.
++ * Each block contains one decoded embedded data parameter (e.g.: fine integration time, analog gain, etc.), copyied to int64 container.
++ */
++typedef struct
++{
++    uint32_t frame_counter;                         /*!< Frame counter. */
++    uint16_t x_output_size;                         /*!< Horizontal output width. */
++    uint16_t y_output_size;                         /*!< Vertical output height. */
++} ia_emd_misc_parameters_t;
++
++/*!
++ * \brief Decoded Exposure parameters.
++ */
++typedef struct
++{
++    ia_aiq_exposure_sensor_parameters *sensor_units_p; /*!< Exposure parameters in terms of sensor units. */
++    ia_aiq_exposure_parameters *generic_units_p;    /*!< Exposure parameters in terms of generic units. */
++    ia_emd_misc_parameters_t *misc_parameters_p;    /*!< Misc decoded parameters. */
++} ia_emd_result_t;
++
++
++/*!
++ * \brief Embedded Data Decoder handle.
++ */
++typedef struct
++{
++    uint32_t decoder_revision;                      /*!< Version of decoder: 0xMAjor.MInor. */
++    const ia_cmc_t *ia_cmc_p;                       /*!< Pointer to internal copy of parsed camera module characterization structure. */
++    uint16_t max_block_ID;                          /*!< Maximum block_id value from decoder_cfg_p. */
++    uint16_t config_flags;                          /*!< Value from embedded_data_decoder_flags_t enumeration. */
++    uint16_t *block_id_mapping;                     /*!< Array[max_block_ID + 1] for mapping of block_id to data blocks array index. */
++    ia_emd_result_t decoded_data;                   /*!< Result of EMD decoding. */
++    /* ia_emd_decoded_block_t blocks[];*/           /*!< Decoded data blocks array. */
++} ia_emd_decoder_t;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _EMD_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
+new file mode 100644
+index 000000000000..0ecdead19547
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
+@@ -0,0 +1,153 @@
++/*
++ * Copyright 2014-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_exc.h
++ * \brief Definitions of exposure parameters conversions between generic and sensor units.
++*/
++
++
++#ifndef IA_EXC_H_
++#define IA_EXC_H_
++
++#include "ia_types.h"
++#include "ia_aiq_types.h"
++#include "ia_cmc_types.h"
++
++#include "ia_exc_deprecated.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/*!
++ * \brief Convert exposure time from generic units to sensor units (line & pixel values).
++ * AEC will use default formula for conversion, if not given
++ * \param[in]  exposure_range          Structure containing coarse and fine integration sensor register ranges. Can be set to NULL if not available.
++ * \param[in]  sensor_descriptor       Structure containing coarse and fine integration time limits and step size.
++ * \param[in]  exposure_time_us        Exposure time to convert.
++ * \param[out] coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
++ * \param[out] fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
++ * \return                             Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_exposure_time_to_sensor_units(
++    const cmc_exposure_range_t *exposure_range,
++    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
++    const unsigned int exposure_time_us,
++    unsigned short *coarse_integration_time,
++    unsigned short *fine_integration_time);
++
++/*!
++ * \brief Converts gain from generic units to sensor units.
++ * AEC will use default formulae for conversion, if not given
++ * Converts gain value to sensor units, limiting the value according to sensor specific limits.
++ * \param[in]  gain_conversion   Structure containing gain to code mapping information.
++ * \param[in]  gain              Gain in generic units.
++ * \param[out] gain_code         Calculated gain code.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_gain_to_sensor_units(
++    const cmc_gain_conversion_t *gain_conversion,
++    const float gain,
++    unsigned short *gain_code);
++
++/*!
++ * \brief Convert exposure time from sensor units to generic units.
++ * AEC will use default formula for conversion, if not given
++ * \param[in]  sensor_descriptor       Structure containing pixel clock frequency needed in exposure conversion.
++ * \param[in]  coarse_integration_time Coarse (rows of integration) for rolling shutter cameras.
++ * \param[in]  fine_integration_time   Fine (pixels of integration remaining after coarse quantization) for rolling shutter cameras.
++ * \param[out] exposure_time           Calculated exposure value in microseconds.
++ * \return                             Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_sensor_units_to_exposure_time(
++    const ia_aiq_exposure_sensor_descriptor *sensor_descriptor,
++    const unsigned short coarse_integration_time,
++    const unsigned short fine_integration_time,
++    unsigned int *exposure_time);
++
++/*!
++* \brief Convert gain from sensor units to generic units.
++* Using the sensor characteristics info, calculate gain from sensor register values.
++* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
++* \param[in]  gain_code         Gain code in sensor specific units.
++* \param[out] gain              Calculated gain.
++* \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_exc_sensor_units_to_gain(
++    const cmc_gain_conversion_t *gain_conversion,
++    const unsigned short gain_code,
++    float *gain);
++
++/*!
++* \brief Gets gain and code based on current code.
++* Offset is used to retrieve previous or next gain code pairs from the CMC gain conversion tables.
++* \param[in]  gain_conversion   Structure containing gain to gain code conversion tables.
++* \param[in]  gain_code         Gain code in sensor specific units.
++* \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
++* \param[out] indexed_gain_code Gain code matching the offset.
++* \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_exc_get_gain_code(
++    const cmc_gain_conversion_t *gain_conversion,
++    const unsigned short gain_code,
++    const int gain_code_offset,
++    unsigned short *indexed_gain_code);
++
++/*!
++ * \brief Converts ISO to gains and codes.
++ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
++ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables.
++ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
++ * \param[in]  iso                      ISO value to be converted into gains.
++ * \param[out] gains                    Array of calculated gains. -1.0 if not available.
++ * \param[out] gain_codes               Array of calculated gain codes. -1 if not available.
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_convert_iso_to_multi_gains(
++    const cmc_multi_gain_conversions_t *multi_gain_conversions,
++    const cmc_sensitivity_t *sensitivity,
++    const int iso,
++    float gains[IA_CMC_GAINS_MAX_NUM],
++    int gain_codes[IA_CMC_GAINS_MAX_NUM]);
++
++/*!
++ * \brief Converts gain codes to ISO.
++ * \param[in]  multi_gain_conversions   Structure containing gain to gain code conversion tables. Can be NULL, if sensor doesn't support any gains.
++ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
++ * \param[in]  gain_codes               Array of gain codes. Each element can be -1 if not available.
++ * \param[out] iso                      Gain codes converted into ISO value. -1 if not available.
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_convert_multi_gain_codes_to_iso(
++    const cmc_multi_gain_conversions_t *multi_gain_conversions,
++    const cmc_sensitivity_t *sensitivity,
++    const int gain_codes[IA_CMC_GAINS_MAX_NUM],
++    int *iso);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_EXC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
+new file mode 100644
+index 000000000000..9b74ba968015
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
+@@ -0,0 +1,171 @@
++/*
++ * Copyright 2014-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_exc_deprecated.h
++ * \brief Definitions of exposure parameters conversions between generic and sensor units (deprecated versions).
++*/
++
++
++#ifndef IA_EXC_DEPRECATED_H_
++#define IA_EXC_DEPRECATED_H_
++
++#include "ia_types.h"
++#include "ia_aiq_types.h"
++#include "ia_cmc_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/*!
++ * \brief Convert analog gain from generic units to sensor units.
++ * Calculate analog gain code from analog gain, limiting it to the sensor specific values.
++ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
++ * \param[in]  analog_gain       Analog gain value to convert to sensor unit.
++ * \param[out] analog_gain_code  Calculated analog gain code.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_analog_gain_to_sensor_units(
++    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
++    const float analog_gain,
++    unsigned short *analog_gain_code);
++
++/*!
++ * \brief Converts digital gain from generic units to sensor units.
++ * AEC will use default formulae for conversion, if not given
++ * Converts digital gain value to sensor units, limiting the value according to sensor specific limits.
++ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
++ * \param[in]  digital_gain      Digital gain in generic units.
++ * \param[out] digital_gain_code Calculated digital gain code.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_digital_gain_to_sensor_units(
++    const cmc_parsed_digital_gain_t *gain_conversion,
++    const float digital_gain,
++    unsigned short *digital_gain_code);
++
++/*!
++ * \brief Convert analog gain from sensor units to generic units.
++ * Using the sensor characteristics info, calculate analog gain from sensor register values.
++ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
++ * \param[in]  gain_code         Analog gain code in sensor specific units.
++ * \param[out] analog_gain       Calculated analog gain.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_sensor_units_to_analog_gain(
++    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
++    const unsigned short gain_code,
++    float *analog_gain);
++
++/*!
++ * \brief Converts digital gain from sensor units to generic units.
++ * AEC will use default formula for conversion, if not given
++ * \param[in]  gain_conversion   Structure containing digital gain to code mapping information.
++ * \param[in]  gain_code         Digital gain code in sensor specific units.
++ * \param[out] digital_gain      Calculated digital gain.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_sensor_units_to_digital_gain(
++    const cmc_parsed_digital_gain_t *gain_conversion,
++    const unsigned short code,
++    float *digital_gain);
++
++/*!
++ * \brief Gets analog gain and code based on current code.
++ * Offset is used to retrieve previous or next analog gain code pairs from the CMC analog gain conversion tables.
++ * \param[in]  gain_conversion   Structure containing analog gain to gain code conversion tables.
++ * \param[in]  gain_code         Analog gain code in sensor specific units.
++ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
++ * \param[out] indexed_gain_code Analog gain code matching the offset.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_get_analog_gain_code(
++    const cmc_parsed_analog_gain_conversion_t *gain_conversion,
++    const unsigned short gain_code,
++    const int gain_code_offset,
++    unsigned short *indexed_gain_code);
++
++/*!
++ * \brief Gets digital gain and code based on current code.
++ * Offset is used to retrieve previous or next digital gain code pairs from the CMC digital gain conversion tables.
++ * \param[in]  gain_conversion   Structure containing digital gain to gain code conversion tables.
++ * \param[in]  gain_code         Digital gain code in sensor specific units.
++ * \param[in]  gain_code_offset  Offset of code to resolve (-1 or 1).
++ * \param[out] indexed_gain_code Analog gain code matching the offset.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_get_digital_gain_code(
++    const cmc_parsed_digital_gain_t *gain_conversion,
++    const unsigned short gain_code,
++    const int gain_code_offset,
++    unsigned short *indexed_gain_code);
++
++/*!
++ * \brief Converts ISO to analog gain and digital gain and codes.
++ * Gains are round down except if given ISO is smaller than corresponding gain 1.0.
++ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables.  Can be NULL, if sensor doesn't support analog gain.
++ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
++ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
++ * \param[in]  iso                      ISO value to be converted into gains.
++ * \param[out] analog_gain              Calculated analog gain.-1.0 if not available.
++ * \param[out] analog_gain_code         Calculated analog gain code. -1 if not available.
++ * \param[out] digital_gain             Calculated digital gain. -1.0 if not available.
++ * \param[out] digital_gain_code        Calculated digital gain code. -1 if not available.
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_convert_iso_to_gains(
++    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
++    const cmc_parsed_digital_gain_t *digital_gain_conversion,
++    const cmc_sensitivity_t *sensitivity,
++    const int iso,
++    float *analog_gain,
++    int *analog_gain_code,
++    float *digital_gain,
++    int *digital_gain_code);
++
++/*!
++ * \brief Converts analog gain and digital gain codes to ISO.
++ * \param[in]  analog_gain_conversion   Structure containing analog gain to gain code conversion tables. Can be NULL, if sensor doesn't support analog gain.
++ * \param[in]  digital_gain_conversion  Structure containing digital gain to code mapping information. Can be NULL, if sensor doesn't support digital gain.
++ * \param[in]  sensitivity              Structure containing sensor sensitivity information.
++ * \param[in]  analog_gain_code         Analog gain code. -1 if not available.
++ * \param[in]  digital_gain_code        Digital gain code. -1 if not available.
++ * \param[out] iso                      Analog and digital gain codes converted into ISO value. -1 if not available.
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err
++ia_exc_convert_gain_codes_to_iso(
++    const cmc_parsed_analog_gain_conversion_t *analog_gain_conversion,
++    const cmc_parsed_digital_gain_t *digital_gain_conversion,
++    const cmc_sensitivity_t *sensitivity,
++    const int analog_gain_code,
++    const int digital_gain_code,
++    int *iso);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_EXC_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
+new file mode 100644
+index 000000000000..5fbd1e159aa4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
+@@ -0,0 +1,138 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_intrinsics.h
++ * \brief Definitions and declarations of intrinsics library.
++ */
++
++#ifndef _IA_INTRINSICS_H_
++#define _IA_INTRINSICS_H_
++
++#include "ia_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_aiq_types.h"
++#include "ia_intrinsics_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef struct
++{
++    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
++    bool  focus_supported;                          /*!<Is focussing supported*/
++    bool  dvs_enabled;                              /*!<Is DVS enabled*/
++} ia_intrinsics_config_params;
++
++/*!
++ * \brief Initialize intrinsics.
++ * This function must be called before any other function in the library. It allocates memories for all intrinsics
++ * algorithms based on input parameters given by the user.
++ *
++ * \param[in]     ia_cmc            Mandatory. Parsed camera module characterization structure.
++ *  return                          ia_intrinsics handle. Use the returned handle as input parameter for the consequent intrinsics calls.
++ */
++LIBEXPORT ia_intrinsics*
++ia_intrinsics_init(const ia_cmc_t *ia_cmc);
++
++/*!
++ * \brief Focal length calculation based on AF results.
++ * Intrinsics lib calculates focal length for each frame.
++ * \param[in]   intrinsics_ptr      Mandatory.\n
++ *                                  Intrinsics handle.
++ * \param[in]   af_results          Mandatory.\n
++ *                                  AF results from AF algorithm.
++ * \param[out]  out_focal_length    Mandatory.\n
++ *                                  Calculated focal_length in x and y coordinates.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_intrinsics_get_focal_length(ia_intrinsics *intrinsics_ptr, ia_aiq_af_results *af_results, float *out_focal_length);
++
++/*! \brief Configure the intrinsics lib to calculate the principal point.
++*
++* \param[in]   intrinsics_ptr           Mandatory.\n
++*                                       Intrinsics handle.
++* \param[in]   config_params            Mandatory.\n
++*                                       Needed to know the scaling/cropping done in the sensor and isp.
++* \return                               0 for no error, others for error.
++*
++* This function configures the intrinsics lib to provide the needed info to calculate
++* the principal point. This function must be called everytime the pipe config changes before
++* calling the API to get the principal point.
++*/
++LIBEXPORT ia_err
++ia_intrinsics_config(ia_intrinsics *intrinsics_ptr,
++    ia_intrinsics_config_params *config_params);
++
++
++/*! \brief Function to get the principal point x, y coordinates.
++*
++* \param[in]   intrinsics_ptr       Mandatory.\n
++*                                   Intrinsics handle.
++* \param[out]  out_principal_point  Mandatory.\n
++*                                   Calculated principal point  x, y coordinates.
++* \return                           0 for no error, others for error.
++*
++* This function returns the principal point based on the sensor params and pipe config given in the config function.
++* Config function must be called atleast once before calling this function.
++*/
++LIBEXPORT ia_err
++ia_intrinsics_get_principal_point(ia_intrinsics *intrinsics_ptr, float *out_principal_point);
++
++/*! \brief Function to get the distortion coefficients.
++*
++* \param[in]   intrinsics_ptr               Mandatory.\n
++*                                           Intrinsics handle.
++* \param[out]  out_radial_distortion        Mandatory.\n
++*                                           Calculated radial_distortion coefficients k1, k2, k3.
++* \param[out]  out_tangential_distortion    Mandatory.\n
++*                                           Calculated tangential_distortion coefficients p1, p2.
++* \return                                   0 for no error, others for error.
++*
++* This function returns the radial_distortion and tangential_distortion coefficients point based on the cmc info given in the
++* init function. Cmc is not expected to change after intrinsic lib init.
++*/
++LIBEXPORT ia_err
++ia_intrinsics_get_distortion_coefficients(ia_intrinsics *intrinsics_ptr, float *out_radial_distortion, float *out_tangential_distortion);
++
++/*! \brief Function to set zoom factor.
++*
++* \param[in]   intrinsics_ptr               Mandatory.\n
++*                                           Intrinsics handle.
++* \param[out]  zoom_factor                  Mandatory.\n
++*                                           Zoom factor to set.
++*/
++LIBEXPORT void
++ia_intrinsics_set_zoom_factor(ia_intrinsics *intrinsics_ptr, float zoom_factor);
++
++/*!
++ * \brief De-initialize intrinsics lib.
++ * All memory allocated by intrinsics library are freed.
++ *
++ */
++LIBEXPORT void
++ia_intrinsics_deinit(ia_intrinsics *intrinsics_ptr);
++
++
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_INTRINSICS_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
+new file mode 100644
+index 000000000000..e4d980a9e50e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
+@@ -0,0 +1,58 @@
++/*
++ * Copyright 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++/*!
++ * \file ia_intrinsics_types.h
++ * \brief Data types and enumerations for Intel Intrinsics library.
++ */
++#ifndef _IA_INTRINSICS_TYPES_H_
++#define _IA_INTRINSICS_TYPES_H_
++#include <stdint.h>
++#include "ia_types.h"
++
++typedef struct ia_intrinsics_t ia_intrinsics;
++
++/*!
++ * \brief ia_intrinsics structure.
++ */
++
++typedef struct ia_intrinsics_t
++{
++    float principal_point[2];                       /*!<The current principal point of the camera in x and y coordinates based on the current pipe config*/
++    float radial_distortion[3];                     /*!<The radial distortion coefficients of the camera based on the current cmc*/
++    float tangential_distortion[2];                 /*!<The tangential distortion coefficients of the camera based on the current cmc*/
++    float undistorted_projection_transform[16];     /*!<4x4 warping matrix which can be used to describe the mapping between
++                                                        3D world points and image pixels like camera intrinsics matrix*/
++    const ia_cmc_t *ia_cmc;
++    float zoom_factor;                              /*!<Zoom factor to be used in the calculations*/
++    bool  focus_supported;                          /*!<Is focussing supported*/
++    bool  dvs_enabled;                              /*!<Is DVS enabled*/
++    ia_aiq_frame_params *output_frame_descriptor;   /*!<Scale and crop info of output*/
++} ia_intrinsics_t;
++
++/** Total cropping parameters
++*  These parameters contain sensor and ISP cropping information without any scaling or binning.
++*  In case of scaling before cropping, cropping params needs to be scaled back to the original resolution.
++*  This information is used to crop lens distortion grids accordingly.
++*/
++typedef struct
++{
++    unsigned int horizontal_crop_offset;    /* Read out offset horizontal */
++    unsigned int vertical_crop_offset;      /* Read out offset vertical */
++    unsigned int cropped_width;             /* Width of cropped area without any scaling*/
++    unsigned int cropped_height;            /* Height of cropped area without any scaling*/
++} ia_intrinsics_crop_params;
++
++#endif /* _IA_INTRINSICS_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
+new file mode 100644
+index 000000000000..87c10bfea312
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
+@@ -0,0 +1,916 @@
++/*
++ * Copyright 2017-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_isp_bxt.h
++ * \brief ia_isp_bxt specific implementation.
++ *
++ * \mainpage
++ * \section main Automatic ISP (AIC) Configuration component for IPU4 (and onwards)
++ *
++ * AIC is stateless component, which purpose is to
++ * - Convert generic results into ISP specific format.
++ * - Adapt ISP tunings based on run-time changing parameters.
++ * - Convert ISP specific statistics into format that is used by 3A and control other algorithms.
++ *
++ * AIC consists of following components:
++ * - \ref gaic
++ * - \ref pal
++ *
++ * AIC API is defined in ia_isp_bxt.h file.
++ *
++ * See \ref integration for more detailed information about various integration details.
++ *
++ * \page aicparts AIC modules
++ * \section gaic Generic AIC (GAIC)
++ *
++ * GAIC implements generic adaptation of tunings (generated with IQ tools) as factor of run-time changing parameters. GAIC uses various interpolation
++ * schemes to calculate ISP parameters between distinct tunings.
++ *
++ * \section pal Parameter Abstraction Layer (PAL)
++ *
++ * PAL generates ISP parameters to each ISP block based on distinct tuning given to it. Refer to PAL documentation for detailed description for
++ * configuration and dependencies of each ISP block.
++ *
++ * \page integration Integration notes
++ * \section AIC output buffer state
++ *
++ * AIC is stateless but instead state is stored inside output buffer. Naturally, if same output buffer is not given back to AIC in the next iteration
++ * AIC will recalculate all ISP parameters, thus maintaining backwards compatibility for systems that don't utilize buffer state.AIC determines if the given buffer
++ * is the same by compating if the first 8 bytes of the given buffer are always the same. If AIC client uses the same output buffer all the time, client should
++ * invalidate (by clearing the first 8 bytes of the) given AIC output buffer when any resolution (resolution_info or resolution_history) parameters change at any
++ * stage of the camera operation. Such changes include for example change in digital zoom, scaling and cropping.
++ *
++ * \section ispdg Digital gain in ISP
++ *
++ * Applying DG in ISP is preferable over sensor digital gain in certain cases:
++ * - ISP may have higher bit depth in the image and retain information that would be lost, if digital gain operation would be done in the sensor.
++ * - ISP can apply gains after statistics calculation. This allows 3A algorithms to operate on statistics, which would be saturated by digital gain.
++ *   - Sometimes this is the only way to gain image data further, if higher that maximum WB gains that ISP block supports are required.
++ *
++ * There are three ways to implement digital gain operation in a running system (using input parameters for ia_isp_bxt_run function).
++ * AIC client should make decision how to apply digital gain before and after statistics (or partially both):
++ * 1. Apply digital gain in WB gains.
++ *  - Digital gain operation is applied in ISP after statistic collection (preferred)
++ *  - Applying digital gain after statistics collection reduces saturation of image before statistics calculation giving 3A+ algorithms best possible statistics input.
++ *  - This can be done only if all digital gain can be applied by WB ISP block.
++ *  - Route AEC digital gain to ia_aiq_pa_run() in ia_aiq_pa_input_params->color_gains. Further route ia_aiq_pa_results to AIC.
++ * 2. Apply digital gain in manual_digital_gain.
++ *  - This is simple from integration point of view.
++ *  - Digital gain operation is applied before statistics collection (may saturate some image data in early phase of image processing).
++ *  - Route AEC digital gain directly to manual_digital_gain parameter.
++ * 3. Apply digital gain partially in WB gains and partially in manual_digital_gain.
++ *  - Should be considered only if digital gain exceeds maximum gain supported by WB ISP block (see option 1).
++ *  - Most difficult to integrate. Consider using this option, if image quality is not sufficient by using option 2.
++ *  - Each ia_aiq_pa_results->color_gains gain is compared against maximum supported gain in the WB ISP block.
++ *  - If all gains are below maximum supported gain, apply all gains in color_gains.
++ *   - Example:
++ *    - Maximum supported gain in WB ISP block is 15.9.
++ *    - AEC requests digital gain on 4.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
++ *    - WB gains for all color channels after ia_aiq_pa_run() (including white point gains from AWB results) are all below 15.9
++ *     -> pass ia_aiq_pa_results to AIC as they are.
++ *  - If some of the gains are above maximum supported gain, extract smallest amount of common gains from all color channels and set that in manual_digital_gain.
++ *   - Note for integration: When giving statistics to AIQ, modified ia_aiq_pa_results (where common gain was removed) should be given along with the statistics.
++ *     Also manual_digital_gain should be given in ia_aiq_ae_results, which indicates how much digital gain was applied in the statistics.
++ *   - Example:
++ *    - Maximum supported gain in WB ISP block is 15.9.
++ *    - AEC requests digital gain on 18.0 -> apply digital gain to all color channels as color_gains in ia_aiq_pa_run() input parameters.
++ *    - Some color channels' WB gains after ia_aiq_pa_run() (including white point gains from AWB results) are all above 15.9
++ *     -> modify WB gains so that common for all color channels gain is removed from ia_aiq_pa_results->color_gains and given as manual_digital_gain to AIC.
++ *
++ * \section performance Power & Perfomance optimizations
++ *
++ * \subsection state AIC output buffer state
++ *
++ * AIC being stateless component, won't retain anything in history of previous iterations. However, if AIC output buffer is given to AIC (to fill) by the client,
++ * AIC stores state of ISP parameters in that buffer. Then in the next iteration, if same AIC output buffer (with same exact list of run_kernels) is given back to AIC,
++ * it can decide to execute or skip calculation of new ISP parameters.
++ *
++ * \subsection tunablerunrate Tunable run rate of ISP algorithms
++ *
++ * Calculation of some ISP configuration parameters can be heavy and in some cases it is not needed to run some algorithms at every ia_isp_bxt_run iteration.
++ * AIC supports variable run rate of ISP algorithms via tuning record, which contains list of ISP block UUIDs and their corresponding execution rate in microseconds.
++ * AIC needs to get correct timestamp in microseconds as input. This timestamp is stored into the AIC output buffer. If same buffer is given back to AIC in the
++ * next iteration, AIC detects it, compares newly given timestamp against the timestamp of the previous run and decides if calculation of certain ISP parameters
++ * need to be done.
++ *
++*/
++
++#ifndef IA_ISP_BXT_H_
++#define IA_ISP_BXT_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_isp_bxt_statistics_types.h"
++#include "ia_isp_types.h"
++#include "ia_dvs_types.h"
++#include "ia_ltm_types.h"
++#include "ia_mkn_types.h"
++#include "ia_view_types.h"
++#include "ia_ob.h"
++#include "ia_isp_bxt_deprecated.h"
++#include "ia_bcomp_types.h"
++#include "ia_ccat_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Initialize IA_ISP and its submodules.
++ * This function must be called before any other function in the library. It allocates memories and parses ISP specific parts from CPFF.
++ * Initialization returns a handle to the ISP instance, which is given as input parameter for all the
++ * ISP functions.
++ *
++ * \param[in]     aiqb_data          Mandatory although function will not return error, if it not given.\n
++ *                                   Reads generic AIC records Block from CPFF.
++ * \param[in]     ia_cmc             Mandatory. Parsed camera module characterization structure. IA_ISP will use structures behind given pointer.
++ *                                   Structure must be valid throughout whole lifetime of IA_ISP component.
++ * \param[in]     max_stats_width    Mandatory. Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
++ *                                   memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
++ *                                   and AF statistics grid allocations.
++ * \param[in]     max_stats_height   Mandatory. Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
++ *                                   memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
++ *                                   and AF statistics grid allocations.l
++ *                                   Initialization parameters for statistics conversion.
++ * \param[in]     max_num_stats_in   Mandatory. The maximum number of input statistics for one frame. Each statistics is related to different exposure.
++ *                                   Used especially for sensors that support two or more simultaneous exposures (HDR).
++ */
++
++LIBEXPORT ia_isp_bxt*
++ia_isp_bxt_init(
++    const ia_binary_data *aiqb_data,
++    const ia_cmc_t *ia_cmc,
++    unsigned int max_stats_width,
++    unsigned int max_stats_height,
++    unsigned int max_num_stats_in,
++    ia_mkn *ia_mkn);
++
++/*!
++* \brief Set tuning to an existing AIC instance.
++* This function can be used to switch tunings on-the-fly in a way that AIC preserves its state and offers smooth transition from one tuning to another.
++* \param[in]    ia_isp_ptr      Handle to the ia_isp instance. This is the output of _init.
++* \param[in]    aiqb_data       Binary data containing the tunings.
++* \param[in]    ia_cmc_ptr      Parsed structure of Camera Module Characterization.
++* \returns error codes
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_set_tuning(ia_isp_bxt *ia_isp_ptr,
++     const ia_binary_data *aiqb_data,
++     const ia_cmc_t *ia_cmc_ptr);
++
++LIBEXPORT void
++ia_isp_bxt_deinit(ia_isp_bxt *ia_isp_bxt);
++
++
++
++/*!
++*  \brief IA_ISP_BXT parameter input structure.
++*/
++typedef struct ia_isp_bxt_input_params_v2
++{
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
++    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
++                                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
++                                                                     ae results and not only needed parameters. */
++    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
++    ia_aiq_sa_results_v1 *sa_results;                /*!< Mandatory. Shading adaptor results from AIQ. */
++    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
++    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
++    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
++                                                                    associated with the stream_id. */
++    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
++    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
++    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
++    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
++    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
++                                                                    Value -96 means red become blue, green become red, blue become green */
++    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
++    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
++    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
++                                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
++    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
++                                                                    If custom controls are not used, pointer can be set as null.*/
++    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
++                                                                    Algo API binary format. Binary may contain multiple parameter sets.
++                                                                    Can be set as null if PAL override functionality is not used. */
++    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
++    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
++    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
++                                                                    Values less than 1.0 means no additional gain. */
++    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
++    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
++                                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
++    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
++    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
++    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
++    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
++    ia_isp_bxt_gdc_limits const *gdc_mbr_limits;     /*!< Optional.  GDC MBR limits for WFOV usecases */
++} ia_isp_bxt_input_params_v2;
++
++/*!
++ * \brief Dump AIC input parameters to binary, for debug purpose only.
++ *
++ * \param[in] input_params                  Mandatory. Input parameters for AIC.
++ * \param[out] output_data                  Mandatory. Output data structure which contains the dump of input_params.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_input_params_dump(
++    const ia_isp_bxt_input_params_v2 *bxt_input_params,
++    ia_binary_data *output_data);
++
++/*!
++ * \brief Load AIC input parameters from binary, for debug purpose only.
++ *
++ * \param[out] input_params                Mandatory. AIC input parameters loaded from binary.
++ * \param[in] output_data                  Mandatory. Binary where to load AIC input parameters from.
++ * \return                                 Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_input_params_load(
++    ia_isp_bxt_input_params_v2 **input_params,
++    const ia_binary_data *output_data);
++
++/*!
++ * \brief ISP configuration for the next frame
++ * Computes ISP parameters from input parameters and CPF values for the next image.
++ *
++ * \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
++ * \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
++ * \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
++ *                                                     Output is PAL output following ISP API format.
++ * \return                                  Error code.
++ *
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_run_v2(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_isp_bxt_input_params_v2 *input_params,
++    ia_binary_data *output_data);
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                         Version string.
++ */
++LIBEXPORT const char*
++ia_isp_bxt_get_version(void);
++
++/*!
++* \brief Get PAL kernel statuses.
++* Get PAL kernel status list from previous run.
++* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
++* \param[in] pal_status_list               Mandatory. Pointer's pointer where kernel status list is set.
++* \param[in] status_list_count             Mandatory. Pointer where number of statuses is written.
++*
++*/
++LIBEXPORT void
++ia_isp_bxt_get_pal_status_list(ia_isp_bxt *ia_isp_bxt_ptr, ia_isp_pal_status_t **pal_status_list, unsigned int *status_list_count);
++
++/*!
++ * \brief Calculates ISP parameters output buffer size for given program group.
++ * This function can be used by AIC client to query the size of AIC output buffer for particular program group. Client should allocate the memory and
++ * pass the size and data it to ia_isp_bxt_run() function in the output_data structure.
++ *
++ * \param[in] program_group        Optional. List of kernels associated with this program group. If NULL, AIC calculates output size of all ISP blocks.
++ * \return                         Size of memory to allocate in order to fit the
++ */
++LIBEXPORT int
++ia_isp_bxt_get_output_size(ia_isp_bxt_program_group *program_group);
++
++/*!
++ * \brief Gets a pointer of HDR YV statistics inside the given binary statistics buffer.
++ * Note! Output hdr_yv_grid always points inside the given statistics buffer.
++ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
++ * \param[out] hdr_yv_grid       Mandatory. Pointer's pointer where address of statistics are located. Pointing inside given statistics buffer.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_get_hdr_yv_in_binary(
++    const ia_binary_data *statistics,
++    ia_isp_bxt_hdr_yv_grid_t **hdr_yv_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in] ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
++ * \param[out] out_query_results Mandatory. A pointer to the query results which indicate which statistics are available.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_query(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    ia_isp_bxt_statistics_query_results_t* out_query_results);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in] ia_isp_bxt            Mandatory. ia_isp_bxt instance handle.
++ * \param[in] statistics            Mandatory. Statistics in ISP specific format.
++ * \param[in] ir_weight             Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++ * \param[in] ae_results            Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++ *                                  used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in] wb_color_gains        Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
++ *                                  ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in] bcomp_results         Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
++ * \param[out] out_rgbs_grid        Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                                  Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                                  if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++ * \param[out] out_ir_grid          Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++ *                                  Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                                  if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_from_binary_v4(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_aiq_color_channels *wb_color_gains,
++    const ia_bcomp_results *bcomp_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Converts awb statistics to ccat format (<=IPU6).
++* ISP generated statistics may not be in the ccat format. Statistics need to be converted
++* from various ISP formats into CCAT statistics format.
++* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
++* \param[in] stats_width            Mandatory actual width of the statistics grid.
++* \param[in] stats_height           Mandatory actual height of the statistics grid.
++* \param[in] buf_color              Mandatory Average level of colors in hw statistics format.
++* \param[in] buf_sat                Mandatory Saturation ratio data in hw statistics format.
++*                                       0: 0% above saturation
++*                                       255: 100% above saturation
++* \param[in] color_stride           Mandatory. Stride in bytes for single row of color average data in buf_color.
++* \param[in] sat_stride             Mandatory. Stride in bytes for single row of saturation data in buf_sat.
++* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
++*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
++* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
++* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
++* \return                           Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_statistics_convert_awb_ccat(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    const void *buf_color,
++    const void *buf_sat,
++    unsigned int color_stride,
++    unsigned int sat_stride,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_aiq_color_channels *wb_color_gains,
++    const ia_bcomp_results *bcomp_results,
++    ia_rgbs_grid *out_rgbs_grids,
++    ia_ccat_grid_char *out_ir_grid);
++
++/*!
++* \brief Converts rgbs grid statistics to ccat format (IPU7->).
++* ISP generated statistics may not be in the ccat format. Statistics need to be converted
++* from various ISP formats into CCAT statistics format.
++* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
++* \param[in] stats_width            Mandatory actual width of the statistics grid.
++* \param[in] stats_height           Mandatory actual height of the statistics grid.
++* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
++* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
++* \param[in] sat_buf                Mandatory Represents Saturation ratio.
++*                                       0: 0% above saturation
++*                                       255: 100% above saturation
++* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
++* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
++* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
++* \param[in] uint8_t_statistics     Mandatory.
++*                                       true:  uint8_t  average values in buf1 and buf2
++*                                       false: uint16_t average values in buf1 and buf2
++* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
++*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
++* \param[out] out_rgbs_grid         Mandatory. CCAT output rgbs-grids. At least IA_CCAT_STATISTICS_MAX_NUM grids.
++* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. CCAT output ir-grid.
++* \return                           Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_statistics_convert_rgbs_grid_ccat(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    const void *buf1_c0_c1_c2_c3,
++    const void *buf2_c4_c5_c6_c7,
++    const void *sat_buf,
++    int buf1_cid_count,
++    int buf2_cid_count,
++    int min_out_bytes_per_cell,
++    bool uint8_t_statistics,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_aiq_color_channels *wb_color_gains,
++    const ia_bcomp_results *bcomp_results,
++    ia_rgbs_grid *out_rgbs_grids,
++    ia_ccat_grid_char *out_ir_grid);
++
++/*!
++* \brief Converts fr grid statistics to ccat format (all ipus).
++* ISP generated statistics may not be in the ccat format. Statistics need to be converted
++* from various ISP formats into CCAT statistics format.
++* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
++* \param[in] stats_width            Mandatory actual width of the statistics grid.
++* \param[in] stats_height           Mandatory actual height of the statistics grid.
++* \param[in] buf1                   Mandatory fr filter data
++* \param[in] buf2                   Optional fr filter data. Only used with ipu7. <= ipu6 must set this to NULL
++* \param[in] stride                 Mandatory. Stride in bytes for single row of fr filter data in buf(s).
++* \param[in] num_stats              Mandatory. Number of fr grids allocated behind the fr_grids pointer.
++* \param[out] fr_grids              Mandatory. CCAT output fr-grids pointer.
++* \return                           Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_statistics_convert_af_ccat(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    const void *buf1,
++    const void *buf2,
++    unsigned int stride,
++    unsigned int num_stats,
++    ia_filter_response_grid *fr_grids);
++
++/*!
++* \brief Converts rgbs grid statistics to IA_AIQ format (IPU7->).
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++* \param[in] ia_isp_bxt             Mandatory. ia_isp_bxt instance handle.
++* \param[in] stats_width            Mandatory actual width of the statistics grid.
++* \param[in] stats_height           Mandatory actual height of the statistics grid.
++* \param[in] buf1_c0_c1_c2_c3       Mandatory Average level of c0-c3 colors
++* \param[in] buf2_c4_c5_c6_c7       Average level of c4-c7 colors. Can be NULL, if buf2_cid_count is 0.
++* \param[in] sat_buf                Mandatory Represents Saturation ratio.
++*                                       0: 0% above saturation
++*                                       255: 100% above saturation
++* \param[in] buf1_cid_count         Mandatory. Number of color ids in buf1_c0_c1_c2_c3. Either 1 or 4.
++* \param[in] buf2_cid_count         Mandatory. Number of color ids in buf2_c4_c5_c6_c7. Can be 0, 1 or 4.
++* \param[in] min_out_bytes_per_cell Mandatory. Minimum number of bytes per grid cell.
++* \param[in] output_packed          Mandatory.
++*                                       true:  uint8_t  average values in buf1 and buf2
++*                                       false: uint16_t average values in buf1 and buf2
++* \param[in] ir_weight              Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++* \param[in] ae_results             Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++*                                   used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] wb_color_gains         Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
++*                                   ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[in] bcomp_results          Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU7).
++* \param[out] out_rgbs_grid         Mandatory. Pointer's pointer where address of converted statistics are stored.
++*                                   Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                   if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \param[out] out_ir_grid           Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++*                                   Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                   if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++* \return                           Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_rgbs_grid(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    const void *buf1_c0_c1_c2_c3,
++    const void *buf2_c4_c5_c6_c7,
++    const void *sat_buf,
++    int buf1_cid_count,
++    int buf2_cid_count,
++    int min_out_bytes_per_cell,
++    bool output_packed,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_aiq_color_channels *wb_color_gains,
++    const ia_bcomp_results *bcomp_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in] ia_isp_bxt               Mandatory.\n
++ *                                     ia_isp_bxt instance handle.
++ * \param[in]  stats_width             Mandatory actual width of the statistics grid.
++ * \param[in]  stats_height            Mandatory actual height of the statistics grid.
++ * \param[in]  c0_avg                  Mandatory Average level of c0 color
++ * \param[in]  c1_avg                  Mandatory Average level of c0 color
++ * \param[in]  c2_avg                  Mandatory Average level of c0 color
++ * \param[in]  c3_avg                  Mandatory Average level of c0 color
++ * \param[in]  c4_avg                  Mandatory Average level of c0 color
++ * \param[in]  c5_avg                  Mandatory Average level of c0 color
++ * \param[in]  c6_avg                  Mandatory Average level of c0 color
++ * \param[in]  c7_avg                  Mandatory Average level of c0 color
++ * \param[in]  sat_ratio_0             Mandatory Represents Saturation ratio.
++ *                                               0: 0% above saturation
++ *                                               255: 100% above saturation
++ * \param[in]  sat_ratio_1             Mandatory Represents Saturation ratio.
++ *                                               0: 0% above saturation
++ *                                               255: 100% above saturation
++ * \param[in]  sat_ratio_2             Mandatory Represents Saturation ratio.
++ *                                               0: 0% above saturation
++ *                                               255: 100% above saturation
++ * \param[in]  sat_ratio_3             Mandatory Represents Saturation ratio.
++ *                                               0: 0% above saturation
++ *                                               255: 100% above saturation
++ * \param[in]  ir_weight               Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
++ * \param[in]  ae_results              Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in]  wb_color_gains          Mandatory for cases(such as DOL) where statistics have WB already applied in the ISP which needs to be reverted for valid RGBS stat calculation,
++ *                                     ignored otherwise. The color gains are from PA results(ia_aiq_pa_results.color_gains) used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in] bcomp_results            Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
++ *
++ * \param[out] out_rgbs_grid           Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                                     Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                                     if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++ * \param[out] out_ir_grid             Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++ *                                     Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                                     if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++ *
++ * \return                             Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_v4(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *c0_avg,
++    void *c1_avg,
++    void *c2_avg,
++    void *c3_avg,
++    void *c4_avg,
++    void *c5_avg,
++    void *c6_avg,
++    void *c7_avg,
++    void *sat_ratio_0,
++    void *sat_ratio_1,
++    void *sat_ratio_2,
++    void *sat_ratio_3,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_aiq_color_channels *wb_color_gains,
++    const ia_bcomp_results *bcomp_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Converts BXT ISP specific statistics (MSB aligned) to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++*
++* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
++* \param[in]  statistics                         Mandatory. Statistics in ISP specific format. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
++* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
++* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
++* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
++* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
++* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
++*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \return                                        Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v2(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_aiq_ae_results *ae_results,
++    const ia_isp_bxt_hdr_compression_t *hdr_compression,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float r_gain,
++    float g_gain,
++    float b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
++
++/*!
++* \brief Converts HDR DP RGBS statistics (MSB aligned) to AIQ format.
++* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
++* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
++* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
++* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
++* \param[in]  stats_r                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
++* \param[in]  stats_b                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
++* \param[in]  stats_g                            Mandatory. Must be MSB aligned to ia_isp_bxt_ptr->ia_cmc->cmc_general_data->bit_depth.
++* \param[in]  stats_s                            Mandatory.
++* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
++* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
++* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
++* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
++* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
++*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \return                                        Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr_v2(
++    ia_isp_bxt *ia_isp_bxt_ptr,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *stats_r,
++    void *stats_g,
++    void *stats_b,
++    void *stats_s,
++    const ia_aiq_ae_results *ae_results,
++    const ia_isp_bxt_hdr_compression_t *hdr_compression,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float  r_gain,
++    float  g_gain,
++    float  b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in]  ia_isp_bxt     Mandatory ia_isp_bxt instance handle.
++ * \param[in]  statistics     Mandatory. Statistics in ISP specific format.
++ *
++ * \param[out] out_af_grid    Mandatory. This pointer is returned from the initialize function
++ *                            Pointer's pointer where address of converted statistics are stored.
++ *                            Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                            if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
++ * \return                    Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_af_from_binary(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    ia_aiq_af_grid **out_af_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in]  ia_isp_bxt    Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  stats_width   Mandatory. Actual width of the statistics grid.
++ * \param[in]  stats_height  Mandatory. Actual height of the statistics grid.
++ * \param[in]  y00_avg       Mandatory. Blocks value of Y00 filter response
++ * \param[in]  y01_avg       Mandatory. Blocks value of Y01 filter response. IPU7 must have a NULL in this.
++ * \param[in]  y10_avg       Mandatory. Blocks value of Y10 filter response
++ * \param[in]  y11_avg       Mandatory. Blocks value of Y11 filter response. IPU7 must have a NULL in this.
++ *
++ * \param[out] out_af_grid   Mandatory.\n
++ *                           Pointer's pointer where address of converted statistics are stored.
++ *                           Converted af grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                           if the external buffer is provided in out_af_grid it will be used otherwise internal buffer is used.
++ * \return                   Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_af(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *y00_avg,
++    void *y01_avg,
++    void *y10_avg,
++    void *y11_avg,
++    ia_aiq_af_grid **out_af_grid);
++
++/*!
++* \brief Converts ISP specific statistics to ccat format.
++* ISP generated statistics may not be in the format in which ccat expect. Statistics need to be converted
++* from various ISP formats into ccat statistics format.
++* \param[in]  c0_histogram      Optional. Block value of c0_histogram. Mapped to rgb_histograms->r. If null, not read.
++* \param[in]  c1_histogram      Optional. Block value of c1_histogram. Mapped to rgb_histograms->g. If null, not read.
++* \param[in]  c2_histogram      Optional. Block value of c2_histogram. Mapped to rgb_histograms->b. If null, not read.
++* \param[in]  c3_histogram      Optional. Block value of c3_histogram. Mapped to y_histogram. If null, not read.
++* \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
++* \param[out] rgb_histograms    Optional. Pointer to rgb histograms output. If null, not written to.
++* \param[out] y_histogram       Optional. Pointer to y histogram output. If null, not written to.
++* \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_statistics_convert_histogram_ccat(
++        unsigned int *c0_histogram,
++        unsigned int *c1_histogram,
++        unsigned int *c2_histogram,
++        unsigned int *c3_histogram,
++        unsigned int num_bins,
++        ia_ccat_histograms *rgb_histograms,
++        ia_histogram *y_histogram);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  statistics        Mandatory. Statistics in ISP specific format.
++ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_ae_from_binary(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    ia_aiq_histogram **out_aiq_histogram);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in]  ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  c0_histogram      Mandatory. Block value of c0_histogram
++ * \param[in]  c1_histogram      Mandatory. Block value of c1_histogram
++ * \param[in]  c2_histogram      Mandatory. Block value of c2_histogram
++ * \param[in]  c3_histogram      Mandatory. Block value of c3_histogram
++ * \param[in]  c4_histogram      Mandatory. Block value of c4_histogram
++ * \param[in]  c5_histogram      Mandatory. Block value of c5_histogram
++ * \param[in]  c6_histogram      Mandatory. Block value of c6_histogram
++ * \param[in]  c7_histogram      Mandatory. Block value of c7_histogram
++ * \param[in]  num_bins          Mandatory. Number of histogram bins in ISP generated histograms.
++ * \param[out] out_aiq_histogram Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                               Converted aiq histogram statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                               if the external buffer is provided in out_aiq_histogram it will be used otherwise internal buffer is used.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_ae(
++    ia_isp_bxt *ia_isp_bxt,
++    void *c0_histogram,
++    void *c1_histogram,
++    void *c2_histogram,
++    void *c3_histogram,
++    void *c4_histogram,
++    void *c5_histogram,
++    void *c6_histogram,
++    void *c7_histogram,
++    unsigned int num_bins,
++    ia_aiq_histogram **out_aiq_histogram);
++
++/*!
++ * \brief This function converts corner based statistics to generic DVS statistics.
++ *
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ *
++ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  statistics                  Mandatory. Statistics in ISP specific format.
++ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
++ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
++ * \param[out] dvs_statistics              Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                                         Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
++ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
++ * \return                                 Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_dvs_from_binary(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    unsigned int dvs_statistics_input_width,
++    unsigned int dvs_statistics_input_height,
++    ia_dvs_statistics **dvs_statistics);
++
++/*!
++ * \brief This function converts corner based statistics to generic DVS statistics.
++ *
++ * ISP generated statistics may not be in the format in which DVS algorithms expect. Statistics need to be converted
++ * from various ISP formats into DVS statistics format.
++ *
++ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  bxt_dvs_statistics          Mandatory. Binary data which contains pointer to BXT specific DVS statistics structure.
++ * \param[in]  dvs_statistics_input_width  Mandatory. DVS statistics input width. Used only in DVS statistics conversion.
++ * \param[in]  dvs_statistics_input_height Mandatory. DVS statistics input height. Used only in DVS statistics conversion.
++ * \param[out] dvs_statistics              Mandatory. Converted DVS statistics. Output can be directly used as input in function ia_dvs_set_statistics.
++ *                                         If the external buffer is provided in dvs_statistics it will be used otherwise internal buffer is used.
++ * \return                                 Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_dvs(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *bxt_dvs_statistics,
++    unsigned int dvs_statistics_input_width,
++    unsigned int dvs_statistics_input_height,
++    ia_dvs_statistics **dvs_statistics);
++
++/*!
++ * \brief Read parameters, interpolated by GAIC, of requested ISP block.
++ * This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, of a target ISP block.
++ *
++ * \param [in]  ia_isp_bxt         Mandatory.  ia_isp_bxt instance handle.
++ * \param [in]  target_id          Mandatory.  uuid of queried ISP block.
++ * \param [out] target_data_ptr    Mandatory.  a pointer of a pointer to data buffer that will have read parameters.
++ * \param [out] output_size_ptr    Mandatory.  a size of all parameters. 0 if a target record does not exist.
++ *
++ * \return                         Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_get_interpolated_parameters(
++    const ia_isp_bxt *ia_isp_bxt_ptr,
++    const unsigned int target_id,
++    char **target_data_ptr,
++    size_t *output_size_ptr);
++
++/*!
++* \brief Get Algo API values interpolated by GAIC of all the ISP blocks.
++* This function queries currently effective Algorithm API parameters, which are interpolated by GAIC, for all the ISP blocks.
++*
++* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
++* \param [out] output_data Mandatory. Effective Algorithm API parameters binary data.
++* \return Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_get_all_interpolated_parameters(
++const ia_isp_bxt *ia_isp_bxt_ptr,
++ia_binary_data* output_data);
++
++/*!
++* \brief Get Direct Results.
++* This function queries currently effective Direct Results.
++*
++* \param [in] ia_isp_bxt Mandatory. ia_isp_bxt instance handle.
++* \param [out] output_data Mandatory. Effective Direct Results data.
++* \return Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_get_direct_results(
++const ia_isp_bxt *ia_isp_bxt_ptr,
++ia_binary_data* output_data);
++
++/*!
++ * \brief Converts BXT ISP PAF statistics to IA_AIQ format.
++ *
++ * ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into IA_AIQ statistics format.
++ *
++ * \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
++ * \param[in]  bxt_paf_statistics          Mandatory. Binary data which contains pointer to BXT specific PAF statistics structure.
++ * \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
++ * \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
++ * \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
++ * \return                                 Error code.
++ */
++ia_err ia_isp_bxt_statistics_convert_paf_from_binary(
++        ia_isp_bxt *ia_isp_bxt,
++        const ia_binary_data *bxt_paf_statistics,
++        unsigned int paf_statistics_input_width,
++        unsigned int paf_statistics_input_height,
++        ia_aiq_depth_grid **depth_statistics);
++
++/*!
++* \brief Converts uint16_t PAF statistics to IA_AIQ format.
++*
++* ISP generated statistics may not be in the format in which IA_AIQ algorithms expect. Statistics need to be converted
++* from the ISP format into IA_AIQ statistics format.
++*
++* \param[in]  ia_isp_bxt                  Mandatory. ia_isp_bxt instance handle.
++* \param[in]  paf_statistics_data         Mandatory. uint16_t PAF data handle.
++* \param[in]  paf_statistics_input_width  Mandatory. PAF statistics input width.
++* \param[in]  paf_statistics_input_height Mandatory. PAF statistics input height.
++* \param[in]  num_phase_shifts            Mandatory. Number of phase shifts in the paf_statistics_data
++* \param[out] depth_statistics            Mandatory. Converted PAF statistics. Output can be directly used as input in function ia_statistics_set.
++* \return                                 Error code.
++*/
++ia_err ia_isp_bxt_statistics_convert_paf(
++    ia_isp_bxt *ia_isp_bxt,
++    uint16_t *paf_statistics_data,
++    unsigned int paf_statistics_input_width,
++    unsigned int paf_statistics_input_height,
++    int num_phase_shifts,
++    ia_aiq_depth_grid **depth_statistics);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_ISP_BXT_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
+new file mode 100644
+index 000000000000..556e1f7fa958
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
+@@ -0,0 +1,641 @@
++/*
++ * Copyright 2017-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_isp_bxt_deprecated.h
++ * \brief ia_isp_bxt specific implementation.
++*/
++
++#ifndef IA_ISP_BXT_DEPRECATED_H_
++#define IA_ISP_BXT_DEPRECATED_H_
++
++#include "ia_aiq_types.h"
++#include "ia_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_bcomp_types.h"
++#include "ia_aiq_deprecated.h"
++#include "ia_cmc_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++*  HDR exposure info which provides information about the thresholds and exposure ratios.
++*
++*  Exposure 0: L[0]|---------------|H[0]
++*         R[0] <--->
++*  Exposure 1:      L[1]|----------------------|H[1]
++*              R[1] <--->
++*  Exposure 2:           L[2]|-----------------------------|H[2]
++*  ...
++*                 R[N-2] <--->
++*  Exposure N:                L[N-1]|-----------------------------------|H[N-1]
++*
++*  N = number of exposures
++*  L[n] = lowest intensity captured by n:th exposure (ia_isp_stat_split_thresh::low)
++*  H[n] = highest intensity captured by n:th exposure (ia_isp_stat_split_thresh::high)
++*  R[n] = exposure ratio between n:th and the longest exposure
++*
++*  Number of thresholds equals N, but number of exposure ratios equals N-1.
++*/
++typedef struct
++{
++    unsigned int num_exposures;                             /*!< Number of exposures. */
++    ia_isp_stat_split_thresh thresholds[IA_AIQ_MAX_NUM_EXPOSURES]; /*!< Lowest and highest intensity values in the stitched data for each exposure [0, num_exposures-1]. */
++    float exposure_ratios[IA_AIQ_MAX_NUM_EXPOSURES - 1];    /*!< Exposure ratios for each exposure pair (between n:th and the longest exposure) [0, num_exposures-2]. */
++    float hdr_gain;                                         /*!< Scaling factor for normalizing pixel data to the maximum bit depth. */
++} ia_isp_hdr_exposure_info_t;
++
++
++/*!
++*  \brief IA_ISP_BXT parameter input structure.
++*/
++typedef struct
++{
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
++    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
++                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
++                                                     ae results and not only needed parameters. */
++    ia_aiq_pa_results *pa_results;                   /*!< Mandatory. Parameter adaptor results from AIQ. */
++    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
++    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
++    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
++    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
++                                                     associated with the stream_id. */
++    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
++    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
++    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
++    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
++    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
++                                                     Value -96 means red become blue, green become red, blue become green */
++    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
++    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
++    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
++                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
++    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
++                                                     If custom controls are not used, pointer can be set as null.*/
++    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
++                                                     Algo API binary format. Binary may contain multiple parameter sets.
++                                                     Can be set as null if PAL override functionality is not used. */
++    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
++    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
++    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
++                                                     Values less than 1.0 means no additional gain. */
++    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
++    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
++                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
++    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
++    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
++    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
++    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
++} ia_isp_bxt_input_params;
++
++/*!
++*  \brief IA_ISP_BXT parameter input structure.
++*/
++typedef struct
++{
++    ia_aiq_frame_params *sensor_frame_params;        /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
++    ia_aiq_awb_results *awb_results;                 /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
++    ia_aiq_gbce_results *gbce_results;               /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters.*/
++    ia_aiq_ae_results *ae_results;                   /*!< Mandatory. Exposure results which are to be used to calculate next ISP parameters.
++                                                     Currently only exposure times, analog and digital gains are used. For convenience reasons AIC takes
++                                                     ae results and not only needed parameters. */
++    ia_aiq_pa_results_v1 *pa_results;                /*!< Mandatory. Parameter adaptor results from AIQ. */
++    ia_aiq_sa_results *sa_results;                   /*!< Mandatory. Shading adaptor results from AIQ. */
++    ia_aiq_hist_weight_grid *weight_grid;            /*!< Mandatory. Weight map to be used in the next frame histogram calculation. */
++    ia_isp_bxt_program_group *program_group;         /*!< Mandatory. List of kernels associated with this program group */
++    unsigned int stream_id;                          /*!< Optional. If program_group is not given, stream_id is used to fetch all the tunings for all the kernels
++                                                     associated with the stream_id. */
++    ia_isp_feature_setting nr_setting;               /*!< Mandatory. Feature setting for noise reduction algorithms. */
++    ia_isp_feature_setting ee_setting;               /*!< Mandatory. Feature setting for edge enhancement algorithms. */
++    char manual_brightness;                          /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
++    char manual_contrast;                            /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
++    char manual_hue;                                 /*!< Optional. Manual hue value range [-128,127]. Value 0 means no change.
++                                                     Value -96 means red become blue, green become red, blue become green */
++    char manual_saturation;                          /*!< Optional. Manual saturation value range [-128,127]. Value 0 means no change. */
++    ia_isp_effect effects;                           /*!< Optional. Manual setting for special effects. Combination of ia_isp_effect enums.*/
++    ia_dvs_morph_table *dvs_morph_table;             /*!< Mandatory. DVS results which are passed to GDC ISP FW. If null is given, PAL produces default
++                                                     morphing table in PAL results. PAL will add scaling to the grid if defined in resolution info.*/
++    ia_isp_custom_controls* custom_controls;         /*!< Optional. Custom control parameter for interpolating between different tunings.
++                                                     If custom controls are not used, pointer can be set as null.*/
++    ia_binary_data* pal_override;                    /*!< Optional. Set of parameters for overriding tunings from CPF. Parameters need to follow
++                                                     Algo API binary format. Binary may contain multiple parameter sets.
++                                                     Can be set as null if PAL override functionality is not used. */
++    ia_ltm_results *ltm_results;                     /*!< Mandatory. Local tone mapping results from LTM. */
++    ia_ltm_drc_params *ltm_drc_params;               /*!< Mandatory. DRC parameters from LTM. */
++    float manual_digital_gain;                       /*!< Optional. Additional digital gain that is applied to all color channels of the image before ISP statistics collection.
++                                                     Values less than 1.0 means no additional gain. */
++    ia_ob_output ob_black_level;                     /*!< Optional. Black level values calculated on-the-fly when the sensor supports. */
++    unsigned long long timestamp;                    /*!< Mandatory. Current timestamp (is microseconds) when ia_isp_bxt_run function is called. AIC uses timestamp to decide what
++                                                     calculations are done based on tunable run rate for each ISP configuration algorithm. */
++    ia_dvs_image_transformation *gdc_transformation; /*!< Mandatory. Image transformation parameters for GDC5 ISP FW. This feature replaces the need for morph_table usage.*/
++    ia_isp_bxt_view_params_t const *view_params;     /*!< Optional. View parameters for running in GDC5 mode.*/
++    ia_media_format media_format;                    /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
++    ia_bcomp_results const *bcomp_results;           /*!< Optional.  bit-compression curves. */
++} ia_isp_bxt_input_params_v1;
++
++/*!
++* \brief ISP configuration for the next frame
++* Computes ISP parameters from input parameters and CPF values for the next image.
++*
++* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
++* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
++* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
++*                                                     Output is PAL output following ISP API format.
++* \return                                  Error code.
++*
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_run(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_isp_bxt_input_params *input_params,
++    ia_binary_data *output_data);
++
++/*!
++* \brief ISP configuration for the next frame
++* Computes ISP parameters from input parameters and CPF values for the next image.
++*
++* \param[in] ia_isp_bxt                    Mandatory. ISP instance handle.
++* \param[in] input_params                  Mandatory. Input parameters for ISP calculations.
++* \param[in] output_data                   Mandatory. Output data structure. If output_data->data pointer is given, AIC writes the results to given buffer.
++*                                                     Output is PAL output following ISP API format.
++* \return                                  Error code.
++*
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_run_v1(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_isp_bxt_input_params_v1 *input_params,
++    ia_binary_data *output_data);
++
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_from_binary(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    ia_aiq_rgbs_grid **out_rgbs_grid);
++
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *c0_avg,
++    void *c1_avg,
++    void *c2_avg,
++    void *c3_avg,
++    void *c4_avg,
++    void *c5_avg,
++    void *c6_avg,
++    void *c7_avg,
++    void *sat_ratio_0,
++    void *sat_ratio_1,
++    void *sat_ratio_2,
++    void *sat_ratio_3,
++    ia_aiq_rgbs_grid **out_rgbs_grid);
++
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr_from_binary(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_isp_stat_split_thresh *thresholds,
++    int num_thresholds,
++    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float r_gain,
++    float g_gain,
++    float b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid);
++
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr(
++    ia_isp_bxt *ia_isp_bxt_ptr,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *stats_r,
++    void *stats_g,
++    void *stats_b,
++    void *stats_s,
++    const ia_isp_stat_split_thresh *thresholds,
++    int num_thresholds,
++    ia_isp_bxt_hdr_params_t *ia_isp_bxt_hdr_params,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float  r_gain,
++    float  g_gain,
++    float  b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid);
++
++/*!
++* \brief Converts BXT ISP specific statistics to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++*
++* \param[in] ia_isp_bxt                          Mandatory. ia_isp_bxt instance handle.
++* \param[in]  statistics                         Mandatory. Statistics in ISP specific format.
++* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
++* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
++* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
++* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
++* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of converted statistics are stored.
++* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics are stored.
++*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \return                                        Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr_from_binary_v1(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
++    const ia_isp_bxt_hdr_compression_t *hdr_compression,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float r_gain,
++    float g_gain,
++    float b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
++
++/*!
++* \brief Converts HDR DP RGBS statistics to AIQ format.
++* ISP/VLIW generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted  into AIQ statistics format.
++* \param[in]  ia_isp_bxt                         Mandatory. ia_isp_bxt instance handle.
++* \param[in]  stats_width                        Mandatory. Actual width of the statistics grid.
++* \param[in]  stats_height                       Mandatory. Actual height of the statistics grid.
++* \param[in]  stats_r                            Mandatory.
++* \param[in]  stats_b                            Mandatory.
++* \param[in]  stats_g                            Mandatory.
++* \param[in]  stats_s                            Mandatory.
++* \param[in]  hdr_exposure_info                  Mandatory. HDR exposure info calculated with ia_isp_bxt_calculate_hdr_exposure_info().
++* \param[in]  hdr_compression                    Optional. NULL, if HDR statistics are already in linear space (no compression).
++* \param[in]  stats_rgbs_hdr_block_pixel_width   Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Width of the block in pixel used in computing the saturation percentage.
++* \param[in]  stats_rgbs_hdr_block_pixel_height  Mandatory. TODO: Remove when FW will output saturation percentage instead of saturation count. Height of the block in pixel used in computing the saturation percentage.
++* \param[in]  r_gain                             Mandatory. Gain applied to the R color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  g_gain                             Mandatory. Gain applied to the G color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[in]  b_gain                             Mandatory. Gain applied to the B color channel before HDR statistic collection. Gain will be reverted from HDR statistics.
++* \param[out] out_rgbs_grid                      Mandatory. Pointer's pointer where address of de-stitched statistics array is stored.
++* \param[out] out_hdr_rgbs_grid                  Optional. Pointer's pointer where address of combined HDR statistics is stored.
++*                                                Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                                                if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \return                                        Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_hdr_v1(
++    ia_isp_bxt *ia_isp_bxt_ptr,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *stats_r,
++    void *stats_g,
++    void *stats_b,
++    void *stats_s,
++    const ia_isp_hdr_exposure_info_t *hdr_exposure_info,
++    const ia_isp_bxt_hdr_compression_t *hdr_compression,
++    unsigned int stats_rgbs_hdr_block_pixel_width,
++    unsigned int stats_rgbs_hdr_block_pixel_height,
++    float  r_gain,
++    float  g_gain,
++    float  b_gain,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_hdr_rgbs_grid **out_hdr_rgbs_grid);
++
++/*!
++*  Calculates additional HDR exposure information based on the AE results.
++*
++*  \param [in]  ia_isp_bxt         Mandatory. ia_isp_bxt instance handle.
++*  \param [in]  ae_results         Mandatory. AE results structure containing the used exposures.
++*  \param [in]  hdr_bit_depth      Mandatory. Maximum bit depth of the HDR data.
++*  \param [out] hdr_exposure_info  Mandatory. Calculated additional HDR exposure information.
++*
++*  \return                         Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_calculate_hdr_exposure_info(
++ia_isp_bxt *ia_isp_bxt,
++const ia_aiq_ae_results *ae_results,
++unsigned int hdr_bit_depth,
++ia_isp_hdr_exposure_info_t *hdr_exposure_info);
++
++/*!
++* \brief Converts BXT ISP specific statistics to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++* \param[in] ia_isp_bxt     Mandatory.\n
++*                           ia_isp_bxt instance handle.
++* \param[in]  stats_width   Mandatory actual width of the statistics grid.
++* \param[in]  stats_height  Mandatory actual height of the statistics grid.
++* \param[in]  c0_avg        Mandatory Average level of c0 color
++* \param[in]  c1_avg        Mandatory Average level of c0 color
++* \param[in]  c2_avg        Mandatory Average level of c0 color
++* \param[in]  c3_avg        Mandatory Average level of c0 color
++* \param[in]  c4_avg        Mandatory Average level of c0 color
++* \param[in]  c5_avg        Mandatory Average level of c0 color
++* \param[in]  c6_avg        Mandatory Average level of c0 color
++* \param[in]  c7_avg        Mandatory Average level of c0 color
++* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
++*
++* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
++*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++*
++* \return                   Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_v1(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *c0_avg,
++    void *c1_avg,
++    void *c2_avg,
++    void *c3_avg,
++    void *c4_avg,
++    void *c5_avg,
++    void *c6_avg,
++    void *c7_avg,
++    void *sat_ratio_0,
++    void *sat_ratio_1,
++    void *sat_ratio_2,
++    void *sat_ratio_3,
++    const ia_aiq_ir_weight_t *ir_weight,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Converts BXT ISP specific statistics to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++* \param[in] ia_isp_bxt     Mandatory.\n
++*                           ia_isp_bxt instance handle.
++* \param[in]  stats_width   Mandatory actual width of the statistics grid.
++* \param[in]  stats_height  Mandatory actual height of the statistics grid.
++* \param[in]  c0_avg        Mandatory Average level of c0 color
++* \param[in]  c1_avg        Mandatory Average level of c0 color
++* \param[in]  c2_avg        Mandatory Average level of c0 color
++* \param[in]  c3_avg        Mandatory Average level of c0 color
++* \param[in]  c4_avg        Mandatory Average level of c0 color
++* \param[in]  c5_avg        Mandatory Average level of c0 color
++* \param[in]  c6_avg        Mandatory Average level of c0 color
++* \param[in]  c7_avg        Mandatory Average level of c0 color
++* \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
++*                                     0: 0% above saturation
++*                                     255: 100% above saturation
++* \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
++* \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++*                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++*
++* \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
++*                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++*                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++*
++* \return                   Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_v2(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *c0_avg,
++    void *c1_avg,
++    void *c2_avg,
++    void *c3_avg,
++    void *c4_avg,
++    void *c5_avg,
++    void *c6_avg,
++    void *c7_avg,
++    void *sat_ratio_0,
++    void *sat_ratio_1,
++    void *sat_ratio_2,
++    void *sat_ratio_3,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in] ia_isp_bxt     Mandatory.\n
++ *                           ia_isp_bxt instance handle.
++ * \param[in]  stats_width   Mandatory actual width of the statistics grid.
++ * \param[in]  stats_height  Mandatory actual height of the statistics grid.
++ * \param[in]  c0_avg        Mandatory Average level of c0 color
++ * \param[in]  c1_avg        Mandatory Average level of c0 color
++ * \param[in]  c2_avg        Mandatory Average level of c0 color
++ * \param[in]  c3_avg        Mandatory Average level of c0 color
++ * \param[in]  c4_avg        Mandatory Average level of c0 color
++ * \param[in]  c5_avg        Mandatory Average level of c0 color
++ * \param[in]  c6_avg        Mandatory Average level of c0 color
++ * \param[in]  c7_avg        Mandatory Average level of c0 color
++ * \param[in]  sat_ratio_0   Mandatory Represents Saturation ratio.
++ *                                     0: 0% above saturation
++ *                                     255: 100% above saturation
++ * \param[in]  sat_ratio_1   Mandatory Represents Saturation ratio.
++ *                                     0: 0% above saturation
++ *                                     255: 100% above saturation
++ * \param[in]  sat_ratio_2   Mandatory Represents Saturation ratio.
++ *                                     0: 0% above saturation
++ *                                     255: 100% above saturation
++ * \param[in]  sat_ratio_3   Mandatory Represents Saturation ratio.
++ *                                     0: 0% above saturation
++ *                                     255: 100% above saturation
++ * \param[in]  ir_weight     Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid for given frame.
++ * \param[in]  ae_results    Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++ *                                     used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in] bcomp_results  Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6)
++ *
++ * \param[out] out_rgbs_grid Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                           Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                           if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++ * \param[out] out_ir_grid   Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++ *                           Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                           if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++ *
++ * \return                   Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_v3(
++    ia_isp_bxt *ia_isp_bxt,
++    unsigned int stats_width,
++    unsigned int stats_height,
++    void *c0_avg,
++    void *c1_avg,
++    void *c2_avg,
++    void *c3_avg,
++    void *c4_avg,
++    void *c5_avg,
++    void *c6_avg,
++    void *c7_avg,
++    void *sat_ratio_0,
++    void *sat_ratio_1,
++    void *sat_ratio_2,
++    void *sat_ratio_3,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_bcomp_results *bcomp_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Converts BXT ISP specific statistics to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
++* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
++* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
++*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++* \return                      Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_from_binary_v1(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_aiq_ir_weight_t *ir_weight,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Converts BXT ISP specific statistics to IA_AIQ format.
++* ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++* from various ISP formats into AIQ statistics format.
++* \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
++* \param[in]  statistics       Mandatory. Statistics in ISP specific format.
++* \param[in]  ir_weight        Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++* \param[in]  ae_results       Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++                               used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++* \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
++*                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++* \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++*                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++*                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++* \return                      Error code.
++*/
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_from_binary_v2(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++ * \brief Converts BXT ISP specific statistics to IA_AIQ format.
++ * ISP generated statistics may not be in the format in which AIQ algorithms expect. Statistics need to be converted
++ * from various ISP formats into AIQ statistics format.
++ * \param[in] ia_isp_bxt        Mandatory. ia_isp_bxt instance handle.
++ * \param[in] statistics        Mandatory. Statistics in ISP specific format.
++ * \param[in] ir_weight         Mandatory for RGB-IR sensors, NULL otherwise. IR contamination grid.
++ * \param[in] ae_results        Mandatory for 2DP-SVE sensors for frames captured with >=2 exposures, ignored otherwise. Exposure parameters
++ *                              used in de-stiching of input HDR statistics to num_exposures LDR RGBS grids.
++ * \param[in] bcomp_results     Mandatory for compressed statistics data (e.g. in case of 20-bit DOL statistics in IPU6).
++ * \param[out] out_rgbs_grid    Mandatory. Pointer's pointer where address of converted statistics are stored.
++ *                              Converted RGBS grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                              if the external buffer is provided in out_rgbs_grid it will be used otherwise internal buffer is used.
++ * \param[out] out_ir_grid      Mandatory for RGB-IR sensors, NULL otherwise. Pointer's pointer where address of converted statistics are stored.
++ *                              Converted IR grid statistics. Output can be directly used as input in function ia_aiq_statistics_set.
++ *                              if the external buffer is provided in out_ir_grid it will be used otherwise internal buffer is used.
++ * \return                      Error code.
++ */
++LIBEXPORT ia_err
++ia_isp_bxt_statistics_convert_awb_from_binary_v3(
++    ia_isp_bxt *ia_isp_bxt,
++    const ia_binary_data *statistics,
++    const ia_aiq_ir_weight_t *ir_weight,
++    const ia_aiq_ae_results *ae_results,
++    const ia_bcomp_results *bcomp_results,
++    ia_aiq_rgbs_grid **out_rgbs_grid,
++    ia_aiq_grid **out_ir_grid);
++
++/*!
++* \brief Convert legacy isp api input data to version 1 data
++* Convert legacy isp api input data structure to new version 1 input
++* format structure.
++* \param[in] input_params       Legacy format input parameters
++* \param[in] ia_cmc             CMC handle
++* \param[out] pa_results_v1_ptr pa_results version 1 output pointer
++* \param[out] input_params_v1   pointer to version 1 output data
++*
++*/
++
++LIBEXPORT void
++ia_isp_convert_input_params_v0_to_v1(
++    const ia_isp_bxt_input_params *input_params,
++    ia_isp_bxt_input_params_v1 *input_params_v1,
++    const ia_cmc_t *ia_cmc,
++    ia_aiq_pa_results_v1* pa_results_v1_ptr);
++
++/*!
++* \brief Convert isp api input v1 data to version 2 data
++* Convert isp api input v1 data structure to new version 2 input
++* format structure.
++* \param[in] input_params       Legacy format input parameters
++* \param[out] sa_results_v1     sa-results in format v1
++* \param[out] input_params_v1   pointer to version 1 output data
++*
++*/
++
++struct ia_isp_bxt_input_params_v2;
++LIBEXPORT void
++ia_isp_convert_input_params_v1_to_v2(const ia_isp_bxt_input_params_v1 *input_params_v1,
++    struct ia_isp_bxt_input_params_v2 *input_params_v2,
++    ia_aiq_sa_results_v1 *sa_results_v1);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_ISP_BXT_DEPRECATED_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
+new file mode 100644
+index 000000000000..eef766694fa5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
+@@ -0,0 +1,201 @@
++/*
++ * Copyright 2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_isp_bxt_statistics_types.h
++ * \brief BXT ISP specific statistics data types.
++*/
++#ifndef IA_ISP_BXT_STATISTICS_TYPES_H_
++#define IA_ISP_BXT_STATISTICS_TYPES_H_
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#define BXT_HISTOGRAM_BINS                          256
++#define BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS   1024    /* Max grid size = [32, 32] */
++
++#define BXT_RGBS_GRID_MAX_WIDTH                     96 /* Max grid size = [96, 72] */
++#define BXT_RGBS_GRID_MAX_HEIGHT                    72
++#define BXT_RGBS_GRID_MAX_NUM_ELEMENTS              BXT_RGBS_GRID_MAX_WIDTH*BXT_RGBS_GRID_MAX_HEIGHT
++
++#define BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS 154
++#define BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS 120
++#define BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS 85
++
++#define BXT_PAF_STATS_MAX_STEPS                      11     /*!< Max number of phase shifts in a block. */
++#define BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS          16*12*BXT_PAF_STATS_MAX_STEPS /*!< Max grid size = [16, 12] */
++
++#define BXT_HDR_RGBY_GRID_MAX_WIDTH                  484  /*!< Maximum grid width for HDR-statisics.*/
++#define BXT_HDR_RGBY_GRID_MAX_HEIGHT                 276  /*!< Maximum grid height for HDR-statisics.*/
++#define BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS           (BXT_HDR_RGBY_GRID_MAX_WIDTH * BXT_HDR_RGBY_GRID_MAX_HEIGHT)  /*!< Maximum grid size for HDR-statisics.484*276=133584.*/
++
++typedef enum
++{
++    /* TODO: These should be calculated as a hash from the below data structures. */
++    ia_isp_bxt_statistics_uuid_filter_response_grid = 101,
++    ia_isp_bxt_statistics_uuid_rgbs_grid = 102,
++    ia_isp_bxt_statistics_uuid_histograms = 103,
++    ia_isp_bxt_statistics_uuid_motion_vectors = 104,
++    ia_isp_bxt_statistics_uuid_paf_grid = 105,
++    ia_isp_bxt_statistics_uuid_hdr_rgbs_grid = 106,           /*!< RGBS grid with higher than 8 bit precision. */
++    ia_isp_bxt_statistics_uuid_hdr_rgby_grid = 107,           /*!< RGBY grid with higher than 8 bit precision. Possibly compressed. */
++    ia_isp_bxt_statistics_uuid_hdr_yv_grid = 108              /*!< Y (Luma) V (Value in HSV color space)  grid with higher than 8 bit precision. Possibly compressed. */
++} ia_isp_bxt_statistics_uuid;
++
++typedef struct
++{
++    int32_t uuid;                           /*!< Unique identifier of the record. See ia_isp_bxt_statistics_uuid. */
++    int32_t size;                           /*!< The size of the record (i.e., the size of this struct). */
++} ia_isp_bxt_statistics_header_t;
++
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;  /*!< Header data. */
++    int32_t hist_c0[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C0. */
++    int32_t hist_c1[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C1. */
++    int32_t hist_c2[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C2. */
++    int32_t hist_c3[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C3. */
++    int32_t hist_c4[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C4. */
++    int32_t hist_c5[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C5. */
++    int32_t hist_c6[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C6. */
++    int32_t hist_c7[BXT_HISTOGRAM_BINS];    /*!< Histogram for color channel C7. */
++} ia_isp_bxt_histograms_t;
++
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
++    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    int32_t y00_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y00 filter responses for each grid block. */
++    int32_t y01_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y01 filter responses for each grid block. */
++    int32_t y10_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y10 filter responses for each grid block. */
++    int32_t y11_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS]; /*!< Y11 filter responses for each grid block. */
++    int32_t r_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< R filter responses for each grid block. */
++    int32_t g_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< G filter responses for each grid block. */
++    int32_t b_avg[BXT_FILTER_RESPONSE_GRID_MAX_NUM_ELEMENTS];   /*!< B filter responses for each grid block. */
++} ia_isp_bxt_filter_response_grid_t;
++
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
++    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    int32_t c0_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C0 color for each grid block. */
++    int32_t c1_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C1 color for each grid block. */
++    int32_t c2_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C2 color for each grid block. */
++    int32_t c3_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C3 color for each grid block. */
++    int32_t c4_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C4 color for each grid block. */
++    int32_t c5_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C5 color for each grid block. */
++    int32_t c6_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C6 color for each grid block. */
++    int32_t c7_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];             /*!< Average level of C7 color for each grid block. */
++    int32_t sat_ratio_0[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
++    int32_t sat_ratio_1[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
++    int32_t sat_ratio_2[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
++    int32_t sat_ratio_3[BXT_RGBS_GRID_MAX_NUM_ELEMENTS / 4];    /*!< Saturation ratios. 0 = 0% above saturation. 255 = 100% above saturation. */
++} ia_isp_bxt_rgbs_grid_t;
++
++/*!
++ * \brief RGBS data collected from decompressed and merged (from multiple exposures) HDR image.
++ * Named as StatR/G/B/S in ISP Firmware.
++*/
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
++    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    int32_t r_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of red color for each grid block. */
++    int32_t g_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of (gr+gb)/2 color for each grid block. */
++    int32_t b_avg[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];              /*!< U20. Average level of blue color for each grid block. */
++    unsigned char sat[BXT_RGBS_GRID_MAX_NUM_ELEMENTS];          /*!< U8. currently this is saturation count and it will be saturation percentage after a few weeks. All codes need to be updated accordingly.*/
++} ia_isp_bxt_hdr_rgbs_grid_t;
++
++/*!
++ * \brief RBGY grids of data which may be compressed or not based on sensor and ISP pipe type.
++ * Named as HistStatR/G/B/Y in ISP Firmware.
++ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
++*/
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
++    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    unsigned short r_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of R color for each grid block with high resolution. */
++    unsigned short b_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of B color for each grid block with high resolution. */
++    unsigned short g_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of (GR+GB)/2 color for each grid block with high resolution. */
++    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15. Average level of Y (luminance) for each grid block with high resolution. */
++} ia_isp_bxt_hdr_rgby_grid_t;
++
++/*!
++ * \brief Y (luminance) V (Value in HSV color space) grids of data which may be compressed or not based on sensor and ISP pipe type.
++ * Named as DRCStatY/V in ISP Firmware.
++ * If statistics are compressed, information for decompression is described in structure ia_isp_bxt_hdr_compression_property_t.
++*/
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                      /*!< Header data. */
++    int32_t grid_width;                                         /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height;                                        /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    unsigned short v_max[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.v_max = max(R,G,B) in HSV color space. Compressed or not based on sensor type. */
++    unsigned short y_avg[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];   /*!< U15.y_avg is same data as the y_avg in ia_isp_bxt_hdr_rgby_grid_t, but sub-sampled by 2x. */
++} ia_isp_bxt_hdr_yv_grid_t;
++
++typedef struct
++{
++    int32_t vec_fe_x_pos;
++    int32_t vec_fe_y_pos;
++    int32_t vec_fm_x_pos;
++    int32_t vec_fm_y_pos;
++    int32_t harris_grade;
++    int32_t match_grade;
++    int32_t level;
++} ia_isp_bxt_dvs_motion_vector_entry_t;
++
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
++    int32_t grid_width_l0;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height_l0;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_width_l1;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height_l1;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_width_l2;                                                          /*!< The actual grid width. Specifies the amount of valid data in the below arrays. */
++    int32_t grid_height_l2;                                                         /*!< The actual grid height. Specifies the amount of valid data in the below arrays. */
++    ia_isp_bxt_dvs_motion_vector_entry_t mv_l0[BXT_DVS_STATS_L0_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L0 grid. */
++    ia_isp_bxt_dvs_motion_vector_entry_t mv_l1[BXT_DVS_STATS_L1_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L1 grid. */
++    ia_isp_bxt_dvs_motion_vector_entry_t mv_l2[BXT_DVS_STATS_L2_MAX_NUM_ELEMENTS];  /*!< Motion vectors for L2 grid. */
++} ia_isp_bxt_motion_vectors_t;
++
++typedef struct
++{
++    ia_isp_bxt_statistics_header_t header;                                          /*!< Header data. */
++    int32_t sum_of_diff[BXT_PAF_STATS_GRID_MAX_NUM_ELEMENTS];                       /*!<  Sum of phase differences from blocks. */
++}ia_isp_bxt_paf_grid_t;
++
++typedef struct
++{
++    float r;        /*!< Compensation gain for R */
++    float gr;       /*!< Compensation gain for Gr */
++    float gb;       /*!< Compensation gain for Gb */
++    float b;        /*!< Compensation gain for B */
++    float isp;      /*!< Compensation gain to be used as ISP gain in the pipeline */
++} ia_isp_bxt_ir_compgain_t;
++
++#ifdef __cplusplus
++}
++
++#endif
++#endif /* IA_ISP_BXT_STATISTICS_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
+new file mode 100644
+index 000000000000..2120ee91badd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
+@@ -0,0 +1,202 @@
++/*
++ * Copyright 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_isp_bxt_types.h
++*/
++
++#ifndef IA_ISP_BXT_TYPES_H_
++#define IA_ISP_BXT_TYPES_H_
++
++#include "ia_types.h"
++#include <stdint.h>  /* defines fixed width integers */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef struct ia_isp_bxt_t ia_isp_bxt;
++
++/*!
++ * \brief Input structure for resolution changing ISP block.
++ *
++ * If ISP block changes resolution as part of its processing, this structure defines
++ * resolutions and cropping parameters for one input and output pins. If ISP block has
++ * multiple outputs, structure needs to be passed for each output pin. Order of operations:
++ *
++ * -# Input image is cropped according to input_crop structure parameters. New cropped input resolution is calculated.
++ * -# Cropped input image is scaled from cropped input resolution to output resolution (output_width & output_height).
++ * -# Output image is cropped according to output_crop structure parameters.
++ *
++ * If ISP block doesn't change resolution of the image as part of its processing, this structure defines
++ * resolution changes done to the image from the beginning of the pipe until now. For example if some scaling or
++ * cropping was done before, they are combined.
++ *
++ * Example:
++ *
++ * -# Sensor outputs 6528 x 4896. Sensor crops 3264 x 2448 ROI from bottom right corner.
++ * -# ISP block downscales the image from 3264 x 2448 to 2176 x 1632 (scale 0.6667) and crops to 1920 x 1080 (RCB):
++ *    - resolution_info { 6528, 4896, { 3264, 2448, 0, 0 }, 2176, 1632, { 128, 276, 128, 276 } }
++ *
++ * -# ISP block needs to know what resolution changes were done with respect to full sensor frame:
++ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1920, 1080, { 0, 0, 0, 0 } }
++ *
++ * -# ISP block forther downscales the image to 1280 x 720 (RCB):
++ *    - resolution_info { 1920, 1080, { 0, 0, 0, 0 }, 1280, 720, { 0, 0, 0, 0 } }
++ *
++ * -# ISP block needs to know what resolution changes were done:
++ *    - resolution_history { 6528, 4896, { 3264+(128/0.6667), 2448+(276/0.6667), (128/0.6667), (276/0.6667) }, 1280, 720, { 0, 0, 0, 0 } }
++ *
++ */
++
++/*!
++* \brief Metadata buffer indices for ia_isp_bxt_run_kernels_t structure.
++*/
++typedef enum
++{
++    kernel_metadata_paf_frame_width = 0,                   /*!< Widht of PDAF frame buffer (used by DPC and PAF Statistics). */
++    kernel_metadata_paf_frame_height                       /*!< Height of PDAF frame buffer (used by DPC and PAF Statistics). */
++} run_kernels_metadata_t;
++
++#pragma pack(push, IA_RESOLUTION_STATIC_GRAPH_PACK)
++typedef struct ia_isp_bxt_resolution_info
++{
++    /*
++     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
++     * This struct is being used by casting data from a binary file and hence cannot be changed.
++     */
++    int input_width;          /*!< Input image width. */
++    int input_height;         /*!< Input image height. */
++    ia_rectangle input_crop;  /*!< Crop offsets for input image. Cropping happens before processing the input image. */
++    int output_width;         /*!< Output image width. */
++    int output_height;        /*!< Output image height. */
++    ia_rectangle output_crop; /*!< Crop offsets for output image. Cropping happens after scaling to output resolution. */
++} ia_isp_bxt_resolution_info_t;
++
++/*!
++* \brief Defines how ISP kernel should modify bit depth of image passing through it.
++* Note: Not all ISP kernels are able to change depth of image data which it's processing.
++*/
++typedef struct ia_isp_bxt_bpp_info
++{
++    /*
++     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
++     * This struct is being used by casting data from a binary file and hence cannot be changed.
++     */
++    int32_t input_bpp;        /*!< Bit depth of image going in to a particular ISP kernel. */
++    int32_t output_bpp;       /*!< Bit depth of output going out from a particular ISP kernel. */
++} ia_isp_bxt_bpp_info_t;
++#pragma pack(pop)
++
++/*!
++* \brief Describes options for run-time kernel control.
++*/
++typedef enum
++{
++    kernel_passthrough = 0,
++    kernel_enable,
++    kernel_disable
++} ia_isp_bxt_enable_control_t;
++
++typedef struct ia_isp_bxt_run_kernels
++{
++    uint32_t stream_id;                                     /*!< Used to identify, in which branch of the pipe the kernel is located. */
++    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid. ISP API (output) UUID. */
++    int32_t enable;                                         /*!< Run-time control to passthrough, enable or disable kernel. */
++    ia_isp_bxt_resolution_info_t *resolution_info;          /*!< Resolution change to be done in this kernel. NULL, if kernel doesn't change resolution. */
++    ia_isp_bxt_resolution_info_t *resolution_history;       /*!< Resolution changes done before current kernel with respect to sensor output. NULL, if not available*/
++    uint32_t metadata[4];                                   /*!< Kernel specific metadata. For example image data format etc. */
++    ia_isp_bxt_bpp_info_t bpp_info;                         /*!< Kernel specific input and output bits per pixel values. */
++    uint32_t output_count;                                  /*!< Number of outputs this kernel has, this means that in this structure the pointer to resolution_info can
++                                                                 be interpreted as an array of this size */
++    ia_binary_data system_api;                              /*!< Used by system devices to get system information from graph */
++} ia_isp_bxt_run_kernels_t;
++
++typedef struct
++{
++    uint32_t kernel_uuid;                                   /*!< ia_pal_uuid */
++    uint32_t flags;
++#define IA_ISP_BXT_PIPE_LAST     (1 << 0)                   /*!< this is the last kernel in the array */
++#define IA_ISP_BXT_PIPE_FIRST    (1 << 1)                   /*!< this is the first kernel in a path */
++#define IA_ISP_BXT_PIPE_TERMINAL (1 << 2)                   /*!< this is not a kernel but a terminal.
++                                                                 In this case, kernel_uuid is the terminal id */
++#define IA_ISP_BXT_PIPE_RCB      (1 << 3)                   /*!< this kernel is a resolution changing block */
++} ia_isp_bxt_pipe_t;
++
++typedef struct ia_isp_bxt_program_group
++{
++    unsigned int kernel_count;                    /*!< Number of kernels in the program group .*/
++    ia_isp_bxt_run_kernels_t *run_kernels;        /*!< Array of kernels in the program group. */
++    unsigned int operation_mode;                  /*!< Operation mode for selecting proper tunings. Is usually associated to different resolutions. */
++    ia_isp_bxt_pipe_t *pipe;                      /*!< The graph of kernels in the program group .*/
++} ia_isp_bxt_program_group;
++
++/*!
++* \brief ia_isp_pal_status_t keeps track of PAL kernel status.
++*/
++typedef struct ia_isp_pal_status_t
++{
++    int32_t uuid;
++    int32_t status_id;
++} ia_isp_pal_status_t;
++
++typedef struct
++{
++    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
++    bool af_grid;            /*!< If true, AF grid is available. */
++    bool histograms;         /*!< If true, histograms are available. */
++    bool dvs_stats;          /*!< If true, DVS statistics are available. */
++    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
++    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
++    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
++    bool paf_grid;           /*!< If true, PAF grid is available. */
++} ia_isp_bxt_statistics_query_results_t;
++
++/*!
++ * \brief Describes options to decompress Y (luma).
++ */
++typedef enum
++{
++    ia_isp_bxt_hdr_y_decompression_max_rgb,   /*!< Use RGB max to calculate Y (luma). */
++    ia_isp_bxt_hdr_y_decompression_avg_rgb    /*!< Use RGB average to calculate Y (luma). */
++} ia_isp_bxt_hdr_y_compression_method_t;
++
++/*!
++ * \brief Describes the parameters used in HDR compression algorithm.
++ * Sensor/ISP may merge the HDR image and then compress the data to preserve data from different parts of the dynamic range.
++ * Compression is most often done to save memory. For example, merged 20 bit (input) image data could be compressed to fit into (output) 15 bits.
++ * Parameters in this structure are used to decompress HDR statistics back to linear space.
++ */
++typedef struct
++{
++    ia_isp_bxt_hdr_y_compression_method_t y_compression_method; /*!< Used decompression method. */
++    ia_isp_bxt_bpp_info_t                 bpp_info;             /*!< Input and output bits per pixel values. */
++} ia_isp_bxt_hdr_compression_t;
++
++/*!
++ * \brief Structure describes the parameters used in HDR statistics.
++ */
++typedef struct
++{
++    unsigned char num_exposures;                               /*!< Mandatory. Number of exposures the sensor supports/outputs. */
++    float *hdr_ratios;                                         /*!< Mandatory. HDR ratio of [L/S S/VS etc.] for stitching. The effective length is determined by num_exposures-1. */
++    ia_isp_bxt_hdr_compression_t *ia_isp_bxt_hdr_compression;  /*!< Optional. NULL, if HDR statistics are already in linear space (no compression). */
++} ia_isp_bxt_hdr_params_t;
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_ISP_BXT_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
+new file mode 100644
+index 000000000000..3dabf019e15a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
+@@ -0,0 +1,97 @@
++/*
++ * Copyright 2014-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_isp_types.h
++ * \brief Common ISP enumerations and structures.
++*/
++
++
++#ifndef IA_ISP_TYPES_H_
++#define IA_ISP_TYPES_H_
++
++#include "ia_aiq_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ *  \brief Complexity level for ISP features.
++ */
++typedef enum
++{
++    ia_isp_feature_level_off,   /* Feature is turned off */
++    ia_isp_feature_level_low,   /* Minimum set of algorithms are used */
++    ia_isp_feature_level_high   /* Maximum set of algorithms are used */
++} ia_isp_feature_level;
++
++/*!
++ * \brief Custom control parameters for tuning interpolation in GAIC
++ *
++ * GAIC implements generic interpolations of tuning parameters as factor of certain run-time changing parameter.
++ * This structure defines custom run-time changeable control parameters, which can be used in tuning interpolations.
++ */
++typedef struct
++{
++    int count;                        /*!< Length of parameters array. */
++    float *parameters;                /*!< Parameters used in calculation (interpolation) of tuning values.
++                                           The first element of the array corresponds custom tuning 0,
++                                           second corresponds with custom tuning 1 etc.*/
++} ia_isp_custom_controls;
++
++/*!
++ *  \brief Definitions for the color effects.
++ */
++typedef enum
++{
++    ia_isp_effect_none     =               0,
++    ia_isp_effect_sky_blue =         (1 << 0),
++    ia_isp_effect_grass_green =      (1 << 1),
++    ia_isp_effect_skin_whiten_low =  (1 << 2),
++    ia_isp_effect_skin_whiten =      (1 << 3),
++    ia_isp_effect_skin_whiten_high = (1 << 4),
++    ia_isp_effect_sepia =            (1 << 5),
++    ia_isp_effect_black_and_white =  (1 << 6),
++    ia_isp_effect_negative =         (1 << 7),
++    ia_isp_effect_vivid =            (1 << 8),
++    ia_isp_effect_invert_gamma =     (1 << 9),
++    ia_isp_effect_grayscale =        (1 << 10),
++    ia_isp_effect_aqua =             (1 << 11)
++} ia_isp_effect;
++
++/*!
++ *  \brief Settings for feature level and strength.
++ */
++typedef struct
++{
++    ia_isp_feature_level feature_level;  /* Feature level */
++    char strength;                       /* Setting for the strength [-128,127]. */
++} ia_isp_feature_setting;
++
++/* Thresholds to extract data of given range from statistics. Used to split combined WDR statistics into several low dynamic range statistics. */
++typedef struct
++{
++    float low;
++    float high;
++    float scale;
++} ia_isp_stat_split_thresh;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_ISP_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
+new file mode 100644
+index 000000000000..2c4b7dd73a24
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
+@@ -0,0 +1,150 @@
++/*
++ * Copyright 2012 - 2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++
++/*!
++ * \file ia_lard.h
++ * \brief Lard PCF parser specific implementation.
++ */
++
++#ifndef _IA_LARD_H_
++#define _IA_LARD_H_
++
++#include "ia_types.h"
++#include "ia_mkn_types.h"
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief available group tags, each group contains all of the tuning modes,
++ * each mode, contains all of the records which are used for the different filters tunings.
++ */
++#define LCMC_TAG IA_MKN_CHTOUL('L','C','M','C')  /*!< CMC group header tag. */
++#define LAIQ_TAG IA_MKN_CHTOUL('L','A','I','Q')  /*!< 3A+ group header tag. */
++#define LISP_TAG IA_MKN_CHTOUL('L','I','S','P')  /*!< ISP group header tag. */
++#define LTHR_TAG IA_MKN_CHTOUL('L','T','H','R')  /*!< Others group header tag. */
++
++
++typedef struct ia_lard_t ia_lard;
++
++/*!
++ * \brief Initialize IA_LARD.
++ * This function must be called before any other function in the library. It allocates needed memory and
++ * parses given Lard CPF data. Initialization returns a handle to data of all parsed items, if given
++ * data is valid Lard CPF data.
++ *
++ * \param[in]     lard_data_ptr    Mandatory although function will not return error, if it not given.\n
++ * \return                         IA_LARD handle. Use the returned handle as input parameter for the consequent IA_LARD calls.
++ */
++LIBEXPORT ia_lard*
++ia_lard_init(const ia_binary_data *lard_data_ptr);
++
++/*!
++ * \brief De-initialize IA_LARD.
++ * All memory allocated by LARD is freed. LARD handle can no longer be used.
++ *
++ * \param[in] ia_lard              Mandatory.\n
++ *                                 LARD instance handle.
++ */
++LIBEXPORT void
++ia_lard_deinit(ia_lard *ia_lard_ptr);
++
++/*!
++ * \brief Input parameter structure for Lard run.
++ * Please NOTICE!
++ * the ISP group can use either index OR tag, the other groups are using tags to get
++ * the correct thing mode.
++ * for example
++ * cmc_mode_tag = 'D','F','L','T'
++ * aiq_mode_tag = 'L','O','W','L' (low light tunings which the user made up)
++ * isp_mode_index = 1 OR 'D', 'F', 'L', 'T'
++ * others_mode_tag = 'D','F','L','T'
++ *
++ *
++ */
++typedef struct
++{
++    unsigned int cmc_mode_tag;      /*!< Mandatory. CMC mode tag (4 letters) to be used with ia_lard_run. */
++    unsigned int aiq_mode_tag;      /*!< Mandatory. AIQ mode tag (4 letters) to be used with ia_lard_run. */
++    unsigned int isp_mode_index;    /*!< Mandatory. ISP mode index (number) or tag (4 letters) to be used with ia_lard_run. */
++    unsigned int others_mode_tag;   /*!< Mandatory. Other mode tag (4 letters)to be used with ia_lard_run. */
++} ia_lard_input_params;
++
++/*!
++* \brief Output parameter structure for ia_lard_run.
++* Pointers to aiqb data of requested mode for each of the groups.
++*/
++typedef struct ia_lard_results
++{
++    ia_binary_data aiqb_cmc_data;      /*!< Mandatory. Aiqb binary data struct for CMC data. */
++    ia_binary_data aiqb_aiq_data;      /*!< Mandatory. Aiqb binary data struct for AIQ data. */
++    ia_binary_data aiqb_isp_data;      /*!< Mandatory. Aiqb binary data struct for ISP data. */
++    ia_binary_data aiqb_other_data;    /*!< Mandatory. Aiqb binary data struct for Other data. */
++} ia_lard_results;
++
++/*!
++ * \brief Lard run will give pointers to aiqb data of the requested modes of each group.
++ *
++ * \param[in] ia_lard_ptr               Mandatory.\n
++ *                                      Lard instance handle.
++ * \param[in] lard_input_params_ptr     Mandatory.\n
++ *                                      Input parameters to tell modes that client is requesting.
++ * \param[in/out] lard_results_ptr      Mandatory. \n
++ *                                      Output pointer to aiqb data blocks of specific modes
++ *                                      that client were requested with lard_input_params_ptr. NULL will
++ *                                      be set if no modes are requested in some group or data for that
++ *                                      mode can't be found.
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err
++ia_lard_run(
++    ia_lard *ia_lard_ptr,
++    ia_lard_input_params *lard_input_params_ptr,
++    ia_lard_results **lard_results_ptr);
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                              Lard version string.
++ */
++LIBEXPORT const char*
++ia_lard_get_version(void);
++
++
++/*!
++ * \brief Get a list of all of the available tags for a given group
++ * \param[in] ia_lard_ptr               Mandatory.\n
++ *                                      Lard instance handle.
++ * \param[in] mode_tag                  Mandatory.\n
++ *                                      Mode tag (LAIQ, LISP, LCMC, LTHR)
++ * \param[out] num_tags                 Mandatory.\n
++ *                                      number of tunings available for given mode tag
++ * \param[out] tags                     Mandatory.\n
++ *                                      tags of available tunings for given mode tag
++ * \return                              Error code.
++ */
++LIBEXPORT ia_err ia_lard_get_tag_list(ia_lard* ia_lard_ptr, const unsigned int mode_tag, unsigned int* num_tags, const unsigned int** tags);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_LARD_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
+new file mode 100644
+index 000000000000..c7f188863834
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
+@@ -0,0 +1,93 @@
++/*
++ * Copyright 2013 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_types.h"
++
++#ifndef _IA_LOG_H_
++#define _IA_LOG_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifndef __func__
++#define __func__ __FUNCTION__
++#endif
++
++/*!
++ * \brief Macro for not logging.
++ */
++#define IA_NOLOG(...)           ((void)0)
++
++/*!
++ * \brief Macro wrapper for ia_log function.
++ */
++#define IA_LOG(level, fmt, ...) ((void)ia_log(level, fmt, ## __VA_ARGS__))
++
++/*!
++ * \brief Logging levels.
++ */
++typedef enum
++{
++    ia_log_error,
++    ia_log_debug,
++    ia_log_info,
++} ia_log_level;
++
++/*!
++ * \brief Initializes ia_log library with external function pointers for logging.
++ * If this function is not called, logging will be directed to stdout and stderr.
++ *
++ * \param[in] a_env_ptr Structure containing the addresses to logging functions.
++ *                      If NULL is passed as function pointer, there won't be log prints.
++ * \return              Error code.
++ */
++LIBEXPORT ia_err
++ia_log_init(ia_env *a_env_ptr);
++
++/*!
++ * \brief Prints formatted string.
++ *
++ *
++ * \param[in] level Log level.
++ * \param[in] fmt   Format string.
++ * \param[in] ...   Variables to be printed out as defined by the format string.
++ */
++LIBEXPORT void
++ia_log(ia_log_level level, const char *fmt, ...);
++
++/*!
++ * \brief Prints formatted string with interpreted error code.
++ *
++ *
++ * \param[in]     error               Error code.
++ * \return                            Pointer to all Error string.
++ */
++LIBEXPORT const char *
++ia_log_strerror(ia_err error);
++
++/*!
++ * \brief De-initialization of ia_log library.
++ * Must be called if ia_log_init() was called.
++ */
++LIBEXPORT void
++ia_log_deinit();
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_LOG_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
+new file mode 100644
+index 000000000000..54465a3f1fcb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
+@@ -0,0 +1,146 @@
++/*
++ * Copyright 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \mainpage IA LTM API documentation
++ *
++ * Browse Files and Classes tabs for details.
++ *
++ * \section general General info
++ *
++ *  \section init Initialization of LTM library
++ *
++ * \copybrief ia_ltm_init
++ * To create an instance of LTM library one must call function:
++ * \code ia_ltm_init \endcode
++ * \copydetails ia_ltm_init
++ *
++ * <br><hr><br>
++ */
++/*!
++ * \file ia_ltm.h
++ * \brief Definitions and declarations of Intel LTM library.
++ */
++
++
++#ifndef _IA_LTM_H_
++#define _IA_LTM_H_
++
++#include "ia_ltm_types.h"
++#include "ia_types.h"
++#include "ia_aiq_types.h"
++#include "ia_isp_bxt_statistics_types.h"
++#include "ia_mkn_types.h"
++#include "ia_ltm_deprecated.h"
++#include "ia_bcomp_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Initialize IA_LTM.
++ * This function must be called before any other function in the library. It allocates memories for all LTM algorithms based on input parameters
++ * given by the user. Tuning parameters are parsed from AIQB and saved for LTM algorithms to use. Initialization returns a handle to the LTM instance,
++ * which is given as input parameter for other functions to access object data. Therefore, multiple instances of LTM library can running simultaneously.
++ * For example one instance per camera.
++ *
++ * \param[in]     aiqb_data         Mandatory although function will not return error, if it not given.\n
++ *                                  AIQB Block from CPFF. Contains tuning parameters for AIQ, ISP and LTM algorithms.
++ * \param[in,out] ia_mkn            Optional.\n
++ *                                  Makernote handle which can be initialized with ia_mkn library. If debug data from LTM is needed
++ *                                  to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
++ *                                  Client writes the data into Makernote section in EXIF.
++ * return                           IA_LTM handle. Use the returned handle as input parameter for the consequent IA_LTM calls.
++ */
++LIBEXPORT ia_ltm*
++ia_ltm_init(const ia_binary_data *aiqb_data,
++            ia_mkn *ia_mkn);
++
++/*!
++ * \brief De-initialize IA_LTM.
++ * All memory allocated by LTM algorithms is freed. LTM handle can no longer be used.
++ *
++ * \param[in] ia_ltm                Mandatory.\n
++ *                                  LTM instance handle.
++ */
++LIBEXPORT void
++ia_ltm_deinit(ia_ltm *ia_ltm);
++
++/*!
++* \brief Set tuning to an existing LTM instance.
++* This function can be used to switch tunings on-the-fly in a way that LTM preserves its state and offers smooth transition from one tuning to another.
++*/
++LIBEXPORT ia_err
++ia_ltm_set_tuning(ia_ltm *ia_ltm,
++    const ia_binary_data *tuning_data_ptr);
++
++/*!
++ * \brief Input parameter structure for LTM/DRC algorithm.
++ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
++ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
++ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
++ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
++ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
++ * marked with '(lb)'.
++ */
++typedef struct ia_ltm_input_params_v2
++{
++    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
++    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
++    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
++    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
++    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
++    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
++    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
++    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
++    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
++    const ia_bcomp_results *bcomp_results;          /*!< Optional. (lb) Compression curve for DOL sensors */
++} ia_ltm_input_params_v2;
++
++/*!
++ * \brief LTM calculation based on input parameters and frame statistics.
++  *
++ * \param[in] ia_ltm                        Mandatory.\n
++ *                                          LTM instance handle.
++ * \param[in] ltm_input_params              Mandatory.\n
++ *                                          Input parameters for LTM calculations.
++ * \param[out] ltm_results                  Mandatory.\n
++ *                                          Pointer's pointer where address of LTM results are stored.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_ltm_run_v2(ia_ltm *ia_ltm,
++        const ia_ltm_input_params_v2 *ltm_input_params,
++        ia_ltm_results **ltm_results,
++        ia_ltm_drc_params **ltm_results_drc);
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                                  Version string.
++ */
++LIBEXPORT const char* ia_ltm_get_version(void);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_LTM_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
+new file mode 100644
+index 000000000000..b8dabf306c57
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
+@@ -0,0 +1,103 @@
++/*
++ * Copyright 2016-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_ltm_deprecated.h
++ * \brief Definitions and declarations of Intel LTM library.
++ */
++
++
++#ifndef _IA_LTM__DEPRECATED_H_
++#define _IA_LTM__DEPRECATED_H_
++
++#include "ia_ltm_types.h"
++#include "ia_types.h"
++#include "ia_aiq_types.h"
++#include "ia_bcomp_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Input parameter structure for LTM/DRC algorithm.
++ * Note that, even though all the input statistics and image are optional (i.e. yv_grid, rgbs,grid_ptr, hdr_rgbs_grid_ptr and input_image_ptr),
++ * one of them is always needed. While certain LTM algorithms (selectable from tunings) can utilize different input, all algorithms can operate
++ * on input_image_ptr data. Some inputs may provide certain PnP or IQ advantages over others, so all inputs should still be set if available in
++ * order to allow the tuner make the appropriate choice (for instance rgbs_grid_ptr and hdr_rgbs_grid_ptr). Notice that input image or statistics
++ * may or may not contain WB gains and CCM applied. Parameters needed by Optibright algorithm are marked with '(ob)' and parameters needed by LBCE are
++ * marked with '(lb)'.
++ */
++typedef struct ia_ltm_input_params
++{
++    ia_ltm_level ltm_level;                 /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
++    ia_aiq_frame_use frame_use;             /*!< Mandatory. Target frame type of the LTM calculations (Preview, Still, video etc.). */
++    float ev_shift;                         /*!< Optional. (ob) Exposure Value shift [-4,4]. */
++    char ltm_strength_manual;               /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
++    ia_aiq_ae_results *ae_results;          /*!< Optional. (ob) AEC output will be used by LTM.*/
++    ia_isp_bxt_hdr_yv_grid_t *yv_grid;      /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
++    int16_t frame_width;                    /*!< Mandatory. Width of the frame where the results will be applied. */
++    int16_t frame_height;                   /*!< Mandatory. Height of the frame where the results will be applied. */
++    ia_aiq_rgbs_grid *rgbs_grid_ptr;        /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;/*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_ltm_input_image *input_image_ptr;    /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
++    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
++} ia_ltm_input_params;
++
++typedef struct ia_ltm_input_params_v1
++{
++    ia_ltm_level ltm_level;                         /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
++    float ev_shift;                                 /*!< Optional. (ob) Exposure Value shift [-4,4]. */
++    char ltm_strength_manual;                       /*!< Optional. (ob) User defined manual control for ltm strength, will be casted into unsigned char, [0, 200], default is 100 and means no manual effect*/
++    ia_aiq_ae_results *ae_results;                  /*!< Optional. (ob) AEC output will be used by LTM.*/
++    ia_isp_bxt_hdr_yv_grid_t *yv_grid;              /*!< Optional. (ob) Statistics used to calculate LTMs. (available only in IPU4 using FW DRC). */
++    int16_t frame_width;                            /*!< Mandatory. Width of the frame where the results will be applied. */
++    int16_t frame_height;                           /*!< Mandatory. Height of the frame where the results will be applied. */
++    ia_aiq_rgbs_grid *rgbs_grid_ptr;                /*!< Optional. (lb) RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_aiq_hdr_rgbs_grid *hdr_rgbs_grid_ptr;        /*!< Optional. (lb) HDR RGBS statistics. LTM may use this small grid instead of given larger grids to reduce PnP (available in IPU4 and onwards). */
++    ia_ltm_input_image *input_image_ptr;            /*!< Optional. (ob)(lb) Image data of any resolution based on IQ requirements for particular use case from which LTM calculates local tone maps (HW generated image available in IPU5 and onwards). */
++    ia_ltm_gtm_input_params *gtm_input_params_ptr;  /*!< Optional. (ob) GTM parameters of LTM if GTM should be applied inside LTM. */
++} ia_ltm_input_params_v1;
++
++/*!
++ * \brief LTM calculation based on input parameters and frame statistics.
++  *
++ * \param[in] ia_ltm                        Mandatory.\n
++ *                                          LTM instance handle.
++ * \param[in] ltm_input_params              Mandatory.\n
++ *                                          Input parameters for LTM calculations.
++ * \param[out] ltm_results                  Mandatory.\n
++ *                                          Pointer's pointer where address of LTM results are stored.
++ * \return                                  Error code.
++ */
++LIBEXPORT ia_err
++ia_ltm_run(ia_ltm *ia_ltm,
++        const ia_ltm_input_params *ltm_input_params,
++        ia_ltm_results **ltm_results,
++        ia_ltm_drc_params **ltm_results_drc);
++
++LIBEXPORT ia_err
++ia_ltm_run_v1(ia_ltm *ia_ltm,
++        const ia_ltm_input_params_v1 *ltm_input_params,
++        ia_ltm_results **ltm_results,
++        ia_ltm_drc_params **ltm_results_drc);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_LTM__DEPRECATED_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
+new file mode 100644
+index 000000000000..5fc11ffed5a5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
+@@ -0,0 +1,151 @@
++/*
++ * Copyright 2016-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_ltm_types.h
++ * \brief Definitions of input/output structures of the Intel local tone mapping library.
++ */
++
++#ifndef _IA_LTM_TYPES_H_
++#define _IA_LTM_TYPES_H_
++
++#include "ia_types.h"
++#include <stdint.h>
++#include "ia_isp_bxt_statistics_types.h"
++
++#define GTM_LUT_SIZE 32
++#define GCE_DEFOG_LUT_SIZE 64
++#define NUM_TONE_MAP_PWL_SEGMENTS 7   /*!< Local curves in piece-wise-linear form (7 pieces)*/
++#define MAX_LUT_WIDTH   145
++#define MAX_LUT_HEIGHT  500
++#define MAX_NUM_LUT 500           /*!< Max. possible number of grids in GammaStar (25 x 20) */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef struct ia_ltm_t ia_ltm;
++
++/*!
++ * \brief New struct for LTM/DRC (local tone mapping/dynamic range compression),
++ * LTM is a algorithm for local tone mapping when sensor is in HDR mode
++ * LTM/DRC analysis algorithm is in CPU, applying LTM is a FW block called gamma.
++ */
++typedef enum
++{
++    ia_ltm_level_use_tuning = -1,      /*!< Use LTM level defined in the tuning. */
++    ia_ltm_level_bypass = 0,           /*!< Bypass LTM (DRC) */
++} ia_ltm_level;
++
++/*!
++ * \brief Input image for LTM calculations.
++ */
++typedef struct
++{
++    ia_image_full_info image_info;     /*!< Structure defining given image format, size and other characteristics. */
++    const ia_binary_data *image_data;  /*!< Input image buffer format, layout and size depends of width & height (and other paddings) defined in image_info structure above. */
++} ia_ltm_input_image;
++
++/*!
++ * \brief struct to hold LTM LUTs
++ * Local curves in pwl format as needed by GammaStar
++ * x & y indexes, slopes for each linear piece
++ */
++typedef struct ia_ltm_lut
++{
++    uint16_t points_x[NUM_TONE_MAP_PWL_SEGMENTS + 1]; /* UQ0.15 + 2^15(offset) */
++    uint16_t slopes_a[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ8.8 */
++    uint16_t points_y[NUM_TONE_MAP_PWL_SEGMENTS];     /* UQ0.15 */
++} ia_ltm_lut;
++
++/*!
++ * \brief struct to hold LTM results
++ * - Local LUTs
++ * - Number of blocks in each dimension
++ * - Average local gain (An estimate of overall local gains to be applied is needed for accurate denoising)
++ */
++typedef struct ia_ltm_results
++{
++    ia_ltm_lut ltm_luts[MAX_NUM_LUT];   /*!< Local look-up-tables */
++    int grid_width;                     /*!< Grid width of LTM LUTs. */
++    int grid_height;                    /*!< Grid height of LTM LUTs. */
++    int block_size;                     /*!< Block size (width & height in pixels) to which LTM LUTs are applied. */
++    float ltm_gain;                     /*!< LTM gain. */
++    float dynamic_range;                /*!< Estimated scene's dynamic range from 0 to 100.  Scene has wider dynamic range when this gets closer to 100.
++                                        Currently only Optibright outputs this value and this would be zero always for all other LTM algorithms. */
++} ia_ltm_results;
++
++/*!
++ * \brief GTM parameters for DRC.
++ */
++
++typedef struct ia_ltm_gce_defog
++{
++    int32_t offset_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
++    int32_t slope_vec[GCE_DEFOG_LUT_SIZE];  /* S15 */
++    int32_t x_cord_vec[GCE_DEFOG_LUT_SIZE]; /* U15 */
++    int32_t x_cord_max;                     /* U15 */
++    int32_t exponent;                       /* U4  */
++    int32_t resolution;                     /* U4  */
++    int32_t A0;
++    int32_t A1;
++    int32_t ltm_bypass;
++    int32_t ltm_weight;                     /* U15 */
++    int32_t defog_enable;
++    int32_t defog_enhance;
++} ia_ltm_gce_defog;
++
++typedef struct ia_ltm_drc_gtm
++{
++    unsigned short gtm_bypass;
++    unsigned short xcu_gtm_offset_vec[GTM_LUT_SIZE];
++    short xcu_gtm_slope_vec[GTM_LUT_SIZE];
++    unsigned short xcu_gtm_x_cord_vec[GTM_LUT_SIZE];
++    unsigned short xcu_gtm_x_cord_max;
++    unsigned short xcu_gtm_exponent;
++    unsigned short xcu_gtm_slope_resolution;
++    unsigned short gtm_gain_frac_bit;
++} ia_ltm_drc_gtm;
++
++/*!
++ * \brief LTM results from algorithms, passing to DRC in IPU4i HDR pipe.
++ */
++
++typedef struct ia_ltm_drc_params
++{
++    unsigned short gain_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];    /*!< U15.gain_map is upscaled by bilateral, applied to pixel-to-pixel in DRC FW block. */
++    unsigned short weight_map[BXT_HDR_RGBY_GRID_MAX_NUM_ELEMENTS];  /*!< U15.weight_map is for computing similarity inside DRC FW block. */
++    ia_ltm_drc_gtm drc_gtm;                                         /*! GTM parameters. */
++    ia_ltm_gce_defog gce_defog;                                     /*! GCE/DEFOG parameters. */
++} ia_ltm_drc_params;
++
++/*!
++ * \brief GTM parameters for GTM part of LTM.
++ * If GTM is applied inside LTM this structure is used for passing arguments to GTM. In case that GTM is applied
++ * inside LTM, GBCE and GammaTM ISP block should be disabled.
++ */
++typedef struct
++{
++    float manual_gain;                  /*!< Mandatory. Manual gain. -1.0 if NA */
++    float manual_convergence_time;      /*!< Mandatory. Manual brightness convergence speed in seconds. -1.0 if NA. */
++    unsigned long long frame_timestamp; /*!< Mandatory. Current time stamp in micro seconds. */
++} ia_ltm_gtm_input_params;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_LTM_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
+new file mode 100644
+index 000000000000..0868dedc5ad0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
+@@ -0,0 +1,142 @@
++/*
++ * Copyright 2014-2016 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_me_corner.h
++ * \brief Motion estimation from corner detection and feature matching DVS statistics.
++ */
++#ifndef _IA_ME_CORNER_H_
++#define _IA_ME_CORNER_H_
++
++#include <stdint.h>
++#include "ia_dvs_types.h"
++#include "dvs_stat_public.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/** ME Corner State.
++ * Host code access to the Motion Estimation Corner detection API with this.
++ */
++typedef struct t_ia_me_corner ia_me_corner_state;
++
++/** \brief Initialize the ME corner detection module.
++ *
++ * \param[out]  me_corner_state      ME corner state.
++ *                                   This is a pointer to a pointer to a module.
++ * \param[in]   aiq_tuning_binary    aiqb binary tuning parameter.
++ * \return                           0 for no error, others for error.
++ *
++ * This function initializes the Motion Estimation Corner detection module. This allocates and initializes
++ * internal data structures. This function must always be called before any
++ * other ia_me_corner function.
++ */
++LIBEXPORT ia_err
++ia_me_corner_init(ia_me_corner_state **me_corner_state,
++                  const ia_binary_data *aiq_tuning_binary);
++
++/** \brief Configures the ME corner module.
++ *
++ * \param[in]  me_corner_state       ME corner state.
++ *                                   This is a pointer to a module.
++ * \param[in]  input_resolution      ISP input resolution in BQ.
++ * \return                           0 for no error, others for error.
++ *
++ * This function configures the Motion Estimation corner detection module. This function must always be called
++ * after ia_me_corner_init.
++ */
++LIBEXPORT ia_err
++ia_me_corner_config(ia_me_corner_state *me_corner_state,
++                    ia_dvs_bq_resolution *input_resolution);
++
++/** \brief Deinitialize the ME corner module.
++ *
++ * \param[in]   me_corner_state  ME corner state.
++ *                               This is a pointer to a module.
++ *
++ * This function deinitilizes the ME corner module. This frees the allocated memory.
++ */
++LIBEXPORT void
++ia_me_corner_deinit(ia_me_corner_state *me_corner_state);
++
++/*!
++ * \brief Allocate statistics buffer.
++ *
++ * Returns allocated DVS statistics.
++ *
++ * \param[out]  statistics          Mandatory.\n
++ *                                  Pointer's pointer where statistics buffer instance is stored.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_me_corner_allocate_statistics(struct ia_css_skc_dvs_statistics **statistics);
++
++/*!
++ * \brief Free the statistics buffer.
++ *
++ * Free the statistics buffer.
++ *
++ * \param[in]   statistics          Mandatory.\n
++ *                                  Pointer to allocated statistics buffer.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_me_corner_free_statistics(struct ia_css_skc_dvs_statistics *statistics);
++
++
++/** \brief Set the ME corner statistics.
++ *
++ * \param[in]   me_corner_state     ME corner state.
++ *                                  This is a pointer to a module.
++ * \param[in]   corner_statistics   Pointer to statistics from ISP
++ * \param[out]  dvs_statistics      Pointer to pointer to converted DVS statistics
++ * \return                          0 for no error, others for error.
++ *
++ * This function converts corner based statistics to generic DVS statistics.
++ */
++LIBEXPORT ia_err
++ia_me_corner_convert_statistics(ia_me_corner_state *me_corner_state,
++                                const struct ia_css_skc_dvs_statistics *corner_statistics,
++                                ia_dvs_statistics **dvs_statistics);
++
++/** \brief Gets the ME corner statistics configuration.
++ *
++ * \param[in]   me_corner_state        ME corner state.
++ *                                     This is a pointer to a module.
++ * \param[out]  dvs_statistics_config  Pointer to pointer to calculated DVS statistics configuration
++ * \return                             0 for no error, others for error.
++ *
++ * This function calculates configuration for collecting DVS statistics.
++ */
++LIBEXPORT ia_err
++ia_me_corner_get_statistics_config(ia_me_corner_state *me_corner_state,
++                                   struct ia_css_dvs_stat_grid_info **dvs_statistics_config);
++
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                             Version string.
++ */
++LIBEXPORT const char* ia_me_corner_get_version(void);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_ME_CORNER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
+new file mode 100644
+index 000000000000..4c0eca5bf7cd
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
+@@ -0,0 +1,138 @@
++/*
++ * Copyright 2012-2017 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_mkn_decoder.h
++ * \brief Definitions of functions to decode records from Maker Note.
++*/
++
++#ifndef IA_MKN_DECODER_H_
++#define IA_MKN_DECODER_H_
++
++#include "ia_types.h"
++#include "ia_mkn_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Checks if makernote contents are valid.
++ *
++ * \param[in] a_mknt_data_ptr       Mandatory.\n
++ *                                  Pointer to the makernote (MKNT) binary data.
++ * \param[in] a_tag                 Mandatory.\n
++ *                                  Tag which should match tag in the given data. Can be 0, if tag doesn't matter.
++ * \return                          True if makernote data is valid.
++ */
++LIBEXPORT bool
++ia_mkn_is_valid(const ia_binary_data *a_mknt_data_ptr,
++                const unsigned int a_tag);
++
++/*!
++ * \brief Changes endianness of given makernote buffer.
++ * Modifies the makernote buffer by changing endianness of makernote header and records.
++ *
++ * \param[in, out] mknt_data        Mandatory.\n
++ *                                  Pointer to the makernote (MKNT) binary data which will be changed
++ *                                  to different endianness.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_mkn_change_endianness(ia_binary_data *mknt_data);
++
++/*!
++ * \brief Prints all records contents.
++ * Prints all record headers and record contents into the stdout in the same format as defined by the DFID. If a buffer
++ * containing makernote header file is given as input, the DNID is also printed out as the first value on each row.
++ * Note. Makernote data CRC validity is not checked when printing records. Prior to calling this function,
++ * call ia_mkn_is_valid() to validate integrity of makernote data.
++ *
++ * \param[in] mknt_data             Mandatory.\n
++ *                                  Pointer to the makernote (MKNT) binary data.
++ * \param[in] makernote_header_file Optional.\n
++ *                                  Buffer where makernote header file has been read. Can be NULL.
++ * \param[in] mkn_dnid_struct_name  Optional.\n
++ *                                  C string of name of structure containing DNIDs in the given header file.
++ * \param[in] dnid                  Mandatory.\n
++ *                                  Record's DNID to print. If 0, all records will be printed out.
++ * \param[in] binary                Mandatory.\n
++ *                                  Flag indicating if data is printed out as binary data into stdout.
++ * \param[in] key                   Mandatory.\n
++ *                                  Packing key (16 bytes).
++ * \return                          Error code.
++ */
++#ifdef TESTMODE
++LIBEXPORT ia_err
++ia_mkn_print_record(const ia_binary_data *mknt_data,
++                    const char *makernote_header_file,
++                    const char *mkn_dnid_struct_name,
++                    ia_mkn_dnid dnid,
++                    bool binary,
++                    const char *key);
++
++#endif
++/*!
++ * \brief Copies record data from the makernote to given buffer.
++ * Checks if a given record exists in the makernote and copies the data from the makernote buffer into the record data buffer.
++ * The amount to copy depends on size value given as input in the record header structure. If size is 0,
++ * only the record header is updated with correct data size and no data is copied. Thus this function can be called twice:
++ * First to get the record size and second time (after allocating a buffer for the output) to get the record data. When querying
++ * for record, DFID and DNID must match the record's DFID and DNID.
++ * Note. Makernote data CRC validity is not checked when getting records. Prior to calling this function,
++ * call ia_mkn_is_valid() to validate integrity of makernote data.
++ *
++ * \param[in] mknt_data             Mandatory.\n
++ *                                  Pointer to the makernote (MKNT) binary data.
++ * \param[in] key                   Mandatory.\n
++ *                                  Packing key (16 bytes).
++ * \param[in,out] mkn_record_header Mandatory.\n
++ *                                  Record header with size set to 0 or wanted data size from record. DFID and DNID
++ *                                  must be set correctly to get record data.
++ * \param[out]    record_data       Mandatory if record header size is not 0.\n
++ *                                  Large enough buffer to hold whole record data.
++ * \return                          Error code.
++ */
++LIBEXPORT ia_err
++ia_mkn_get_record(const ia_binary_data *mknt_data,
++                  const char* key,
++                  ia_mkn_record_header *mkn_record_header,
++                  void *record_data);
++
++/*!
++ * \brief Copies record data from the makernote to given buffer.
++ * Parses through the makernote file and copies record headers of the first num_mkn_records to the given memory array.
++ * Client should make sure enough memory is allocated for num_mkn_records in the given array.
++ * If mkn_record_headers is NULL, this function will return the number of records. Thus
++ * first call can be used to query how many records there are and second call to get the actual record headers.
++ *
++ * \param[in] mknt_data              Mandatory.\n
++ *                                   Pointer to the makernote (MKNT) binary data.
++ * \param[in,out] num_mkn_records    Mandatory.\n
++ *                                   Number of makernote records the function is allowed to parse and store to the mkn_record_headers.
++ * \param[in,out] mkn_record_headers Mandatory.\n
++ *                                   Client allocated memory for storing the array of record headers parsed by this function.
++ * \return                           Error code.
++ */
++LIBEXPORT ia_err
++ia_mkn_get_record_headers(const ia_binary_data *mknt_data,
++                          int *num_mkn_records,
++                          ia_mkn_record_header *mkn_record_headers);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* IA_MKN_DECODER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
+new file mode 100644
+index 000000000000..d5da483c497c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
+@@ -0,0 +1,167 @@
++/*
++ * Copyright 2012-2013, 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_mkn_encoder.h
++ * \brief Definitions of functions to control and add records to Maker Note.
++*/
++
++#ifndef IA_MKN_ENCODER_H_
++#define IA_MKN_ENCODER_H_
++
++#include <stddef.h>
++#include "ia_types.h"
++#include "ia_mkn_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief Creates Make Note system handle.
++ * Allocates and initializes makernote handle. Handle must be given as input parameter to all consequent ia_mkn calls.
++ *
++ * \param[in] mkn_config_bits       Mandatory.\n
++ *                                  Configuration flag bits.
++ * \param[in] mkn_section_1_size    Mandatory.\n
++ *                                  Size of Section 1 data buffer.
++ * \param[in] mkn_section_2_size    Mandatory.\n
++ *                                  Size of Section 2 data buffer.
++ * \return                          Pointer to the makernote handle.
++ */
++LIBEXPORT ia_mkn*
++ia_mkn_init(ia_mkn_config_bits mkn_config_bits,
++            size_t mkn_section_1_size,
++            size_t mkn_section_2_size);
++
++/*!
++ * \brief Deletes Make Note system handle.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle.
++ * \return                       Error code.
++ */
++LIBEXPORT void
++ia_mkn_uninit(ia_mkn *mkn);
++
++/*!
++ * \brief Reset Make Note system to default state.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_mkn_reset(ia_mkn *mkn);
++
++/*!
++ * \brief Adds or updates a data record in the makernote.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
++ * \param[in] data_format_id     Mandatory.\n
++ *                               Record data format ID.
++ * \param[in] data_name_id       Mandatory.\n
++ *                               Record name ID.
++ * \param[in] data               Mandatory.\n
++ *                               Pointer to record data to be copied into the makernote. Size of data to be copied is calculated
++ *                               from on DFID and number of elements.
++ * \param[in] num_elements       Mandatory.\n
++ *                               Number of elements to store.
++ * \param[in] key                Mandatory.\n
++ *                               Packing key (16 bytes). NULL means 'no packing'.
++ * \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_mkn_add_record(ia_mkn *mkn,
++                  ia_mkn_dfid mkn_data_format_id,
++                  ia_mkn_dnid mkn_data_name_id,
++                  const void *data,
++                  unsigned int num_elements,
++                  const char *key);
++
++/*!
++ * \brief Deletes a data record from the makernote.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
++ * \param[in] data_format_id     Mandatory.\n
++ *                               Record data format ID.
++ * \param[in] data_name_id       Mandatory.\n
++ *                               Record name ID.
++ * \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_mkn_delete_record(ia_mkn *mkn,
++                     ia_mkn_dfid mkn_data_format_id,
++                     ia_mkn_dnid mkn_data_name_id);
++
++/*!
++ * \brief Prepares makernote so that it can be included into the EXIF.
++ * Based on data target: Section 1 can be used by client for example for EXIF or Section 2 where all (Section 1 & Section 2) records will be included.
++ * calculates checksum, updates total size of makernote data, compresses and pack makernote data.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
++ * \param[in] data_target        Target of the makernote as defined in enum ia_mkn_trg.
++ * \return                       Binary data structure with pointer and size of data..
++ */
++LIBEXPORT ia_binary_data
++ia_mkn_prepare(ia_mkn *mkn,
++               ia_mkn_trg data_target);
++
++/*!
++ * \brief Enable/Disable makernote data collecting.
++ *
++ * \param[in] mkn                Mandatory. \n
++ *                               Pointer to makernote handle obtained from ia_mkn_init function call.
++ * \param enable_data_collection Mandatory.\n
++ *                               Enable/disable data collection.
++ * \return                       Error code.
++*/
++LIBEXPORT ia_err
++ia_mkn_enable(ia_mkn *mkn,
++              bool enable_data_collection);
++
++/*!
++ * \brief Merge two makernotes.
++ * Copies all records from source makernote to the target makernote. Existing same records in the target are overwritten by source record.
++ * Both makernotes must be created with the same makernote library ie. have the same internal structure.
++ * After merging makernotes, ia_mkn_prepare() function must be called before using the merged makernote.
++ *
++ * \param[in,out] mkn_trg_data   Target makernote. Source makernote will be merged into this.
++ * \param[in]     mkn_src_data   Source makernote.
++ * \return                       Error code.
++ */
++LIBEXPORT ia_err
++ia_mkn_merge(ia_mkn *mkn_trg,
++             const ia_mkn *mkn_src);
++
++/*!
++ * \brief Converts makernote (MKNT) binary data to full MKN data.
++ *  Allocates full MKN data and copies the content of (MKNT) binary data to MKN.
++ *
++ * \param[in]     mknt_src_data  Pointer to the makernote (MKNT) binary data.
++ * \return                       Pointer to the makernote handle.
++ */
++LIBEXPORT ia_mkn*
++ia_mknt_to_mkn(const ia_binary_data *mknt_src_data);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_MKN_ENCODER_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
+new file mode 100644
+index 000000000000..d9d06109c986
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
+@@ -0,0 +1,165 @@
++/*
++ * Copyright 2012-2013, 2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_mkn_types.h
++ * \brief Enumerations, structures and definitions used in the Maker Note System.
++*/
++
++#ifndef _IA_MKN_TYPES_H_
++#define _IA_MKN_TYPES_H_
++
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * \brief combines 4 chars into one unsigned long integer.
++ */
++#define IA_MKN_CHTOUL(a,b,c,d) \
++    ( (uint32_t)(a) | ((uint32_t)(b)<<8) | ((uint32_t)(c)<<16) | ((uint32_t)(d)<<24) )
++
++/*!
++ * \brief Makernote tag. 4 first bytes of the makernote data.
++ */
++#define IA_MKN_TAG IA_MKN_CHTOUL('M','K','N','T')
++
++/*!
++ * \brief Definition of ia_mkn handle.
++ * Definition to clarify when ia_mkn handle is expected to be used.
++ */
++typedef void ia_mkn;
++
++/*!
++ *  Start of MKN System enumeration set.
++ * \brief Enumerations set for Maker Note System.
++ * This part contatins two enumerations:
++ * - 'ia_mkn_dfid', describes data type of the 'Data' field in the MKN record;
++ * - 'ia_mkn_dnid',describes a name (or functionality) of data in the 'Data' field.
++ * To modify this file a following procedure is used:
++ * a) Add new enum members of ia_mkn_dfid or ia_mkn_dnid
++ * b) Update MKN_ENUMS_DATA_REVISION accordingly.
++ */
++
++/*!
++ *  Revision of MKN System enumeration set, format 0xYYMMDDVV, where:
++ * - YY: year,
++ * - MM: month,
++ * - DD: day,
++ * - VV: version ('01','02' etc.)
++ */
++#define IA_MKN_ENUMS_DATA_REVISION 0x14012702
++
++/*!
++ * \brief Data Format ID (DFID) enumeration describes data type of the 'Data' field in the MKN record.
++ */
++typedef enum
++{
++    ia_mkn_dfid_dummy,                     /*!< Used for dummy records (no actual data). */
++
++    /*! Standard integer data types */
++    ia_mkn_dfid_signed_char,               /*!< 8-bit, int. values, range: -128 to 127 */
++    ia_mkn_dfid_unsigned_char,             /*!< 8-bit, int. values, range: 0 to 255 */
++    ia_mkn_dfid_signed_short,              /*!< 16-bit, int. values, range: -32768 to 32767 */
++    ia_mkn_dfid_unsigned_short,            /*!< 16-bit, int. values, range: 0 to 65535 */
++    ia_mkn_dfid_signed_int,                /*!< 32-bit, int. values, range: -2147483648 to 2147483647 */
++    ia_mkn_dfid_unsigned_int,              /*!< 32-bit, int. values, range: 0 to 4294967295 */
++    ia_mkn_dfid_signed_long_long,          /*!< 64-bit, int. values, range: -9223372036854775808 to 9223372036854775807 */
++    ia_mkn_dfid_unsigned_long_long,        /*!< 64-bit, int. values, range: 0 to 18446744073709551615 */
++    ia_mkn_dfid_string,                    /*!< 8-bit chars which are converted to ASCII. */
++
++    /*! Floating point numbers. */
++    ia_mkn_dfid_float = 14,                /*!< IEEE-754 floating point single precision */
++    ia_mkn_dfid_double,                    /*!< IEEE-754 floating point double precision */
++
++    /*! Fixed point fractional data types */
++    ia_mkn_dfid_unsigned_q16_16,            /*!< 32-bit, Unsigned fixed point fractional value,  16 bits integer, 16 bits fractional */
++    ia_mkn_dfid_signed_q15_16,              /*!< 32-bit, Signed fixed point fractional value,  1 bit sign, 15 bits integer, 16 bits fractional */
++    ia_mkn_dfid_unsigned_q8_8,              /*!< 16-bit, Unsigned fixed point fractional value,  8 bits integer, 8 bits fractional */
++    ia_mkn_dfid_signed_q7_8,                /*!< 16-bit, Signed fixed point fractional value,  1 bit sign, 7 bits integer, 8 bits fractional */
++
++    ia_mkn_dfid_last                        /*!< Total number of data types, keep this enum member as a last one!. */
++} ia_mkn_dfid;
++
++
++/*!
++ * \brief Data Name ID (DNID) enumeration describes a name (or functionality) of data in the 'Data' field.
++ */
++typedef enum
++{
++    ia_mkn_dnid_dummy,                      /*!< Used for dummy records (no actual data). */
++    ia_mkn_dnid_ia_aiq_records = 1,         /*!< ia_aiq library internal records. */
++    ia_mkn_dnid_hal_records = 256,          /*!< HAL records. */
++    ia_mkn_dnid_ia_isp_records = 512,       /*!< ia_isp library internal records. */
++    ia_mkn_dnid_free_records = 768,         /*!< Next free block of records - replace this when assigned. */
++    ia_mkn_dnid_last                        /*!< Total number of data names, keep this enum member as a last one!. */
++} ia_mkn_dnid;
++
++
++/*!
++ * \brief Bitfield to enable makernote features.
++ */
++typedef enum
++{
++    ia_mkn_cfg_compression  = 1,        /*!< Enable compression of maker note data */
++    ia_mkn_cfg_imported  = 1 << 1,      /*!< Shows that MKN has been imported from binary container */
++} ia_mkn_config_bits;
++
++
++/*!
++ * \brief Target of the makernote data: Section 1 or 2 (which could represent e.g. JPEG EXIF or RAW Header data).
++ *  Notice that if Section 2 is selected, an output makernote data will contain both Section 1 and Section 2 parts.
++ *  Bitwise OR'd with DNID when set for the target sections.
++ */
++typedef enum
++{
++    ia_mkn_trg_section_1    = 0,        /*!< Extensions ('or'-ed to ia_mkn_dnid) */
++    ia_mkn_trg_section_2    = 0x10000   /*!< Extensions ('or'-ed to ia_mkn_dnid) */
++} ia_mkn_trg;
++
++
++/*!
++ * \brief Makernote header structure. Records (ia_mkn_record_header) are followed after this header.
++ */
++typedef struct
++{
++    uint32_t tag;                           /*!< Tag in the beginning of makernote data. It also can be used to determine endianness. */
++    uint32_t size;                          /*!< Size of the actual makernote records data (including ia_mkn_header) */
++    uint32_t system_version;                /*!< Version of makernote system, format 0xYYMMDDVV */
++    uint32_t enum_revision;                 /*!< Revision of makernote enumerations set, format 0xYYMMDDVV */
++    uint32_t config_bits;                   /*!< Configuration flag bits set */
++    uint32_t checksum;                      /*!< Global checksum of all bytes from the maker note buffer */
++} ia_mkn_header;
++
++
++/*!
++ * \brief Record header structure. Data is followed after this header.
++ */
++typedef struct
++{
++    uint32_t size;                          /*!< Size of record including header */
++    uint8_t data_format_id;                 /*!< ia_mkn_dfid enumeration values used */
++    uint8_t key_id;                         /*!< Packing key ID. If 0 - no packing */
++    uint16_t data_name_id;                  /*!< ia_mkn_dnid enumeration values used */
++} ia_mkn_record_header;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_MKN_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
+new file mode 100644
+index 000000000000..b8ee6ceb9f06
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
+@@ -0,0 +1,183 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2012-2017 Intel Corporation
++ * All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its
++ * suppliers or licensors. Title to the Material remains with Intel
++ * Corporation or its suppliers and licensors. The Material may contain trade
++ * secrets and proprietary and confidential information of Intel Corporation
++ * and its suppliers and licensors, and is protected by worldwide copyright
++ * and trade secret laws and treaty provisions. No part of the Material may be
++ * used, copied, reproduced, modified, published, uploaded, posted,
++ * transmitted, distributed, or disclosed in any way without Intel's prior
++ * express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or
++ * delivery of the Materials, either expressly, by implication, inducement,
++ * estoppel or otherwise. Any license under such intellectual property rights
++ * must be express and approved by Intel in writing.
++ *
++ * Unless otherwise agreed by Intel in writing, you may not remove or alter
++ * this notice or any other notice embedded in Materials by Intel or Intels
++ * suppliers or licensors in any way.
++ */
++
++/*!
++ * \file nvmparser.h
++ * \brief Definitions of NVM (Non-Volatile Memory) data parser.
++*/
++
++#ifndef _IA_NVM_H_
++#define _IA_NVM_H_
++
++#include <stdint.h>
++#include "ia_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define IA_NVM_NUM_CHANNELS 4
++#define IA_NVM_LSC_BIT_DEPTH_THRESHOLD 8
++#define IA_NVM_MIN_LSC_WIDTH 7
++#define IA_NVM_MIN_LSC_HEIGHT 5
++#define IA_NVM_SENSITIVITY_BIT_DEPTH 10
++#define IA_NVM_CIE_RANGE_MIN 0.270
++#define IA_NVM_CIE_RANGE_MAX 0.490
++
++#define IA_NVM_INTERFACE_PDAF_MAJOR_VERSION   2
++
++#define IA_NVM_STATIC_BUFFER_SIZE_V1 10
++#define IA_NVM_STATIC_BUFFER_SIZE_V2 12 /*new nvm format with PDAF fields added*/
++
++/*!
++ * \brief NVM parsing status codes.
++ */
++typedef enum
++{
++    ia_nvm_error_none,            /*!< No error. */
++    ia_nvm_error_internal,        /*!< Parser internal failure (not enough memory). */
++    ia_nvm_error_no_data,         /*!< NULL pointer as input or not enough input data. */
++    ia_nvm_error_af,              /*!< Error parsing AF parameters. */
++    ia_nvm_error_lsc,             /*!< Error parsing AF parameters. (lsc dimensions, lsc data) */
++    ia_nvm_error_awb,             /*!< Error parsing AWB parameters (sensitivities, n_lights). */
++    ia_nvm_error_crc,             /*!< CRC check error. */
++    ia_nvm_error_not_used,        /*!< No error in NVM data but NVM data is not used. */
++    ia_nvm_error_not_implemented, /*!< Parser for given data type has not been implemented. */
++    ia_nvm_error_version,         /*!< invalid version. */
++    ia_nvm_error_pdaf,            /*!< Error parsing PDAF parameters */
++    ia_nvm_error_vcm,             /*!< Error parsing Closed loop vcm parameters*/
++} ia_nvm_error;
++
++/*!
++ * \brief PDAF PS Table data layout in NVM (Non-Volatile Memory) data.
++ */
++typedef struct
++{
++    uint16_t* pdaf_ps_left;          /*!< PS Gain tables for Left Pixels */
++    uint16_t* pdaf_ps_right;         /*!< PS Gain tables for Right Pixels */
++} ia_nvm_pdaf_ps;
++
++/*!
++ * \brief PDAF data layout in NVM (Non-Volatile Memory) data.
++ */
++typedef struct
++{
++    uint8_t pdaf_ps_sensor_modes;                     /*!< number of sensor modes calibrated for PS */
++    uint8_t pdaf_ps_knots_width;                      /*!< number of PS knots across width */
++    uint8_t pdaf_ps_knots_height;                     /*!< number of PS knots across height */
++    uint8_t pdaf_ps_frac_bits;                        /*!< PS Fractional Bit depth */
++    ia_nvm_pdaf_ps *pdaf_ps_tables;                  /*!< PS tables for all the sensor modes */
++    uint8_t pdaf_dlom_knots_width;                   /*!< number of DLOM knots across width */
++    uint8_t pdaf_dlom_knots_height;                  /*!< number of DLOM knots across height */
++    uint8_t pdaf_dlom_frac_bits;                     /*!< DLOM Fractional Bit Depth */
++    int32_t* pdaf_dlom_tables;                      /*!< DLOM tables */
++} ia_nvm_pdaf_data;
++
++/*!
++ * \brief Closed loop vcm calibration data layout in NVM (Non-Volatile Memory) data.
++ */
++typedef struct
++{
++    uint8_t  closed_loop_hall_offset_vert;  /*!< vertical distance b/w Hall sensor and Magnet */
++    uint8_t  closed_loop_hall_bias_horz;    /*!< horizontal distance b/w Hall sensor and Magnet */
++    uint16_t closed_loop_hall_min;          /*!< Hall sensor movement minimum limit */
++    uint16_t closed_loop_hall_max;          /*!< Hall sensor movement maximum limit */
++} ia_nvm_closed_loop_vcm;
++
++/*!
++ * \brief LSC table layout in NVM (Non-Volatile Memory) data.
++ * LSC tables are one after another for N amount of lights. One LSC table consists of tables for 4 channels in order: Ch1, Ch2, Ch3 and Ch4.
++ */
++typedef struct
++{
++    uint8_t lsc_frac_bits;                    /*!< LSC fractional bit depth range 4-8. */
++    void *lsc_tables[IA_NVM_NUM_CHANNELS];    /*!< LSC table for Ch1, Ch2, Ch3 and Ch4. Type depends on lsc_fraq_bits. If <= IA_NVM_LSC_BIT_DEPTH_THRESHOLD, then uint8_t, else uint16_t. */
++} ia_nvm_lsc;
++
++
++typedef struct
++{
++    uint8_t major_version;                            /*!< Calibration data major version. */
++    uint8_t minor_version;                            /*!< Calibration data minor version. */
++    uint8_t n_pos;                                    /*!< Number of AF measurement orientations. */
++    uint8_t vcm_lps_bits;                             /*!< VCM lens position sensor bit depth (0 if N/A). */
++    uint8_t vcm_bits;                                 /*!< VCM register bit depth (8 or 16). */
++    int16_t *vcm_af_near;                             /*!< VCM register values for n_pos for AF at near calibration distance (supplier specific). */
++    int16_t *vcm_af_far;                              /*!< VCM register values for n_pos for AF at far calibration distance (supplier specific). */
++    int16_t *vcm_af_start;                            /*!< VCM register values for n_pos for AF at lens start.DEPRICATED.the parameter must not be used */
++    int16_t *vcm_af_end;                              /*!< VCM register values for n_pos for AF at lens end.DEPRICATED the parameter must not be used */
++    uint8_t n_lights;                                 /*!< Number of light sources used for LSC and AWB. */
++    uint8_t *cie_coords_x;                            /*!< CIE x coordinates for n_lights light sources. */
++    uint8_t *cie_coords_y;                            /*!< CIE y coordinates for n_lights light sources. */
++    uint8_t lsc_width;                                /*!< Width of all LSC tables. */
++    uint8_t lsc_height;                               /*!< Height of all LSC tables. */
++    ia_nvm_lsc *lsc;                                  /*!< LSC tables for n_lights. */
++    uint16_t *awb_sensitivities[IA_NVM_NUM_CHANNELS]; /*!< AWB sensitivities for n_lights in order: Ch1, Ch2, Ch3 and Ch4. */
++    uint8_t pdaf_data_present;                        /*!< PDAF Calibration data present or not(0: no PDAF Data)*/
++    ia_nvm_pdaf_data *pdaf_data;                      /*!< PDAF Calibration data */
++    uint8_t closed_loop_data_present;                 /*!< closed loop vcm data present or not (0: no vcm data)*/
++    ia_nvm_closed_loop_vcm *vcm;                      /*!< vcm data */
++    uint16_t checksum;                                /*!< CRC-16 checksum calculated from all bytes before checksum. */
++} ia_nvm;
++
++/*!
++ * \brief Parses intel specified camera NVM data into ia_nvm structure.
++ * \param[in]  nvm        Camera NVM data in Intel specified format.
++ * \param[out] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
++ * \return                NVM parsing error code.
++ */
++LIBEXPORT ia_nvm_error
++ia_nvm_parse(const ia_binary_data *nvm,
++             ia_nvm** parsed_nvm);
++
++/*!
++ * \brief Frees contents of ia_nvm structure.
++ * \param[in] parsed_nvm Camera NVM in parsed (ia_nvm) structure.
++ */
++LIBEXPORT void
++ia_nvm_deinit(ia_nvm *parsed_nvm);
++
++/*!
++ * \brief Allocates memory and creates Intel specified camera NVM data from input structure.
++ * \param[in] parsed_nvm Structure containing values from which the binary will be created.
++ * \return               Binary data containing the camera NVM in Intel specified format.
++ */
++LIBEXPORT ia_binary_data*
++ia_nvm_binary_create(const ia_nvm *parsed_nvm);
++
++/*!
++ * \brief Deletes memory allocated by ia_nvm_binary_create() function.
++ * \param[in] nvm_binary Binary data created by function ia_nvm_binary_create.
++ */
++LIBEXPORT void
++ia_nvm_binary_delete(ia_binary_data *nvm_binary);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_NVM_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
+new file mode 100644
+index 000000000000..97c2f3b14477
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
+@@ -0,0 +1,92 @@
++/*
++ * Copyright 2017-2018 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++/*!
++ * \mainpage IA OB API documentation
++ *
++ * Browse Files and Classes tabs for details.
++ *
++ */
++/*!
++ * \file ia_ob.h
++ * \brief Definitions and declarations of IA OB library.
++ */
++#ifndef _IA_OB_H_
++#define _IA_OB_H_
++
++#include "ia_types.h"
++
++#define IA_OB_DEBUG
++#if defined IA_OB_DEBUG
++#define IA_OB_LOG(fmt, ...)       IA_LOG(ia_log_debug, "IAOB: " fmt, ## __VA_ARGS__)
++#define IA_OB_LOG_ERROR(fmt, ...) IA_LOG(ia_log_error, "IAOB: ERROR: " fmt, ## __VA_ARGS__)
++#define DEBUG_BUFFER_SIZE 1024*7
++#else
++#define IA_OB_LOG            IA_NOLOG
++#define IA_OB_LOG_ERROR      IA_NOLOG
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define IA_OB_VERSION "1.0.0.0"
++typedef struct ia_ob_t ia_ob;
++
++typedef enum
++{
++    ia_ob_interleave_none,
++    ia_ob_interleave_two,
++} ia_ob_interleave_mode;
++
++/*!
++ * \brief OB runtime input.
++ */
++typedef struct {
++    short *frame_data;       /*!< fixed point image */
++    unsigned int frame_width;         /*!< current frame width (might be cropped) */
++    unsigned int frame_height;        /*!< current frame height (might be cropped) */
++    unsigned int ob_top;
++    unsigned int ob_left;
++    unsigned int ob_width;
++    unsigned int ob_height;
++    ia_ob_interleave_mode interleave_step;
++} ia_ob_input;
++
++/*!
++ * \brief OB per-run output.
++ */
++typedef struct {
++    float cc00;
++    float cc01;
++    float cc10;
++    float cc11;
++} ia_ob_output;                 /*!< OB ouput for 4 color components */
++
++LIBEXPORT ia_ob*
++ia_ob_init(void);
++
++LIBEXPORT void
++ia_ob_deinit(ia_ob *ia_ob);
++
++LIBEXPORT ia_err
++ia_ob_run(ia_ob *ia_ob,
++          const ia_ob_input *ob_input,
++          ia_ob_output *ob_output);
++
++#ifdef __cplusplus
++}
++#endif
++#endif /* _IA_OB_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
+new file mode 100644
+index 000000000000..987e1601eb25
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
+@@ -0,0 +1,1977 @@
++/*
++ * Copyright 2015-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_p2p.h
++ * \brief Declares the public2private converter API interface.
++ */
++
++/*! \mainpage
++ *
++ *  Public2Private (P2P) is a component designed for converting algorithm-related parameters between the ISP algo API and the actual
++ *  register layouts what firmware expects in its terminals. In the context of P2P, ISP algo parameters are referred as public data
++ *  and the register layouts as private data.
++ *
++ *  P2P has three main responsibilities:
++ *   - Converting public data to private data (encoding parameters)
++ *   - Converting private data to public data (decoding statistics)
++ *   - Filling the actual terminal descriptors accordingly
++ *
++ *  \section deps Dependencies
++ *
++ *  P2P has dependencies to other repositories:
++ *   - \b include: contains include files that are common to all AIQ libraries
++ *   - \b ia_log: the log library used in all AIQ libraries
++ *   - \b ia_pal: contains the public parameter definitions
++ *   - \b vied-viedifw-ispfw: P2P uses the CSS functions related to accessing data inside terminals
++ *
++ *  \section supported_kernels Supported Platforms and Kernels
++ *
++ *  Supported platforms:
++ *   - BXT B0
++ *   - CNL A0
++ *   - CNL B0
++ *   - GLV A0
++ *
++ *  P2P implementation currently supports the following kernels from ISYS:
++ *   - INL
++ *   - BLC_GLOBAL
++ *   - BLC_SENSOR_TYPE_0
++ *   - BLC_SENSOR_TYPE_1
++ *   - BLC_SENSOR_TYPE_2
++ *   - PCLN
++ *   - LSC_SENSOR_TYPE_0
++ *   - LSC_SENSOR_TYPE_1
++ *   - LSC_SENSOR_TYPE_2
++ *   - 3A_STAT_AWB
++ *   - 3A_STAT_AF
++ *   - 3A_STAT_AE_CCM
++ *   - 3A_STAT_AE
++ *   - IDS
++ *   - 3A_STAT_PAF
++ *
++ *  P2P implementation currently supports the following kernels from VPREGDC:
++ *   - WBA_WBA
++ *   - RYNR_VCUD
++ *   - RYNR_BNLM
++ *   - DEMOSAIC_DEMOSAIC
++ *   - ACM_CCM
++ *   - ACM_ACM
++ *   - GTC_CSC_CDS
++ *   - GTC_GTM
++ *   - YUV1_IEFD
++ *   - YUV1_YDS (defaults)
++ *   - YUV1_TCC (defaults)
++ *   - DVS_YBIN
++ *   - DVS_DVS
++ *   - DVS_L0
++ *   - DVS_L1
++ *   - DVS_L2
++ *   - XNR4-MH
++ *   - XNR4-M
++ *   - XNR4_2_Video
++ *
++ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS:
++ *   - WBA_WBA
++ *   - RYNR_VCUD
++ *   - RYNR_BNLM
++ *   - DEMOSAIC_DEMOSAIC
++ *   - ACM_CCM
++ *   - ACM_ACM
++ *   - GTC_CSC_CDS
++ *   - GTC_GTM
++ *   - YUV1_IEFD
++ *   - YUV1_YDS (defaults)
++ *   - YUV1_TCC (defaults)
++ *   - DVS_YBIN
++ *   - DVS_DVS
++ *   - DVS_L0
++ *   - DVS_L1
++ *   - DVS_L2
++ *   - EXY
++ *   - XNR42_Video
++ *
++ *  P2P implementation currently supports the following kernels from VPREGDC_HQ_NS_DVS:
++ *   - WBA_WBA
++ *   - RYNR_VCUD
++ *   - RYNR_BNLM
++ *   - DEMOSAIC_DEMOSAIC
++ *   - ACM_CCM
++ *   - ACM_ACM
++ *   - GTC_CSC_CDS
++ *   - GTC_GTM
++ *   - YUV1_IEFD
++ *   - YUV1_YDS (defaults)
++ *   - YUV1_TCC (defaults)
++ *   - DVS_YBIN
++ *   - DVS_DVS
++ *   - DVS_L0
++ *   - DVS_L1
++ *   - DVS_L2
++ *   - EXY
++ *   - XNR42_Video
++ *
++ *  P2P implementation currently supports the following kernels from VPREGDC_ISL_HQ_4K:
++ *   - INL
++ *   - BLC_GLOBAL
++ *   - BLC_SENSOR_TYPE_0
++ *   - BLC_SENSOR_TYPE_1
++ *   - BLC_SENSOR_TYPE_2
++ *   - PCLN
++ *   - LSC_SENSOR_TYPE_0
++ *   - LSC_SENSOR_TYPE_1
++ *   - LSC_SENSOR_TYPE_2
++ *   - 3A_STAT_AWB
++ *   - 3A_STAT_AF
++ *   - 3A_STAT_AE_CCM
++ *   - 3A_STAT_AE
++ *   - 3A_STAT_PAF
++ *   - WBA_WBA
++ *   - RYNR_VCUD
++ *   - RYNR_BNLM
++ *   - DEMOSAIC_DEMOSAIC
++ *   - ACM_CCM
++ *   - ACM_ACM
++ *   - GTC_CSC_CDS
++ *   - GTC_GTM
++ *   - YUV1_IEFD
++ *   - YUV1_YDS (defaults)
++ *   - YUV1_TCC (defaults)
++ *   - DVS_YBIN
++ *   - DVS_DVS
++ *   - DVS_L0
++ *   - DVS_L1
++ *   - DVS_L2
++ *   - XNR42_Video
++ *
++ *  P2P implementation currently supports the following kernels from VHDR_PREGDC_HP: // TODO: Update list.
++ *   - INL
++ *   - BLC_GLOBAL
++ *   - BLC_SENSOR_TYPE_0
++ *   - BLC_SENSOR_TYPE_1
++ *   - BLC_SENSOR_TYPE_2
++ *   - PCLN
++ *   - LSC_V1_0_SENSOR_TYPE_0
++ *   - LSC_V1_0_SENSOR_TYPE_1
++ *   - LSC_V1_0_SENSOR_TYPE_2
++ *   - DPC_1_0_1
++ *   - IDS_V2_1
++ *   - 3A_STAT_AWB
++ *   - 3A_STAT_AF
++ *   - 3A_STAT_AE_CCM
++ *   - 3A_STAT_AE
++ *   - BLC_SENSOR_TYPE_0
++ *   - BLC_SENSOR_TYPE_1
++ *   - BLC_SENSOR_TYPE_2
++ *   - LSC_V1_0_SENSOR_TYPE_0
++ *   - LSC_V1_0_SENSOR_TYPE_1
++ *   - LSC_V1_0_SENSOR_TYPE_2
++ *   - 3A_STAT_AWB
++ *   - 3A_STAT_AF
++ *   - OUTPUT_CROP
++ *   - HDR_STATS
++ *   - HDR_STATS_RGBY_OUT
++ *   - HDR_STATS_YDRC_OUT
++ *   - HDR_STATS_RGBS_OUT
++ *
++ *  P2P implementation currently supports the following kernels from VPOSTGDC:
++ *   - DVS_COORDS
++ *   - DVS_CONFIG
++ *   - OFS_OF
++ *   - OFS_SC0
++ *   - OFS_SC1
++ *   - OFS_ISP
++ *   - TNR5
++ *
++ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS:
++ *   - DVS_COORDS
++ *   - DVS_CONFIG
++ *   - OFS_OF
++ *   - OFS_SC0
++ *   - OFS_SC1
++ *   - OFS_ISP
++ *   - TNR5_2_1
++ *
++ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS2:
++ *   - DVS_COORDS
++ *   - DVS_CONFIG
++ *   - OFS_OF
++ *   - OFS_SC0
++ *   - OFS_SC1
++ *   - OFS_ISP
++ *   - TNR5_2_1
++ *
++ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_NS_DVS3:
++ *   - DVS_COORDS
++ *   - DVS_CONFIG
++ *   - OFS_OF
++ *   - OFS_SC0
++ *   - OFS_SC1
++ *   - OFS_ISP
++ *   - TNR5_2_1
++ *
++ *  P2P implementation currently supports the following kernels from VPOSTGDC_HQ_4K: with DVS2
++ *   - DVS_COORDS
++ *   - DVS_CONFIG
++ *   - OFS_OF
++ *   - OFS_SC0
++ *   - OFS_SC1
++ *   - OFS_ISP
++ *   - TNR5_2_2
++ *
++ *  P2P implementation currently supports the following kernels from YUV_CSC:
++ *   - CSC_YUV2RGB
++ *
++ *  \section init Initialization and deinitialization
++ *
++ *  P2P must be initialized before its conversion functions can be used. Initialization happens during the camera start-up with ia_p2p_init().
++ *  This function returns a handle to the created P2P instance, required by the encoding and decoding functions. When cleaning up, P2P must be
++ *  deinitialized with ia_p2p_deinit().
++ *
++ *  The user has to allocate a cache buffer which is used during encoding and decoding to store parameters which are cached between frames.
++ *  The cache buffer is specific to a stream, so each stream must have its own cache buffer. The user takes care of giving the correct cache
++ *  buffer to P2P. The size of the cache buffer must be queried with ia_p2p_get_cache_buffer_size().
++ *
++ *  \section runtime Runtime use
++ *
++ *  The high-level execution flow during runtime is illustrated in Figure 1. On each frame, P2P expects to get public data from PAL. The user
++ *  is responsible for calling pal_run() to produce the public data as a binary data chunk and give this as an input to ia_p2p_parse() which
++ *  parses the data to a form that is more easily accessible by the encoding functions. ia_p2p_parse() also requires the pointer to the cache
++ *  buffer to use for encoding the cached data. After parsing the public data, the requirements for the terminals and the payload can be queried
++ *  from P2P in order to allocate memory for the payload and to create terminals.
++ *
++ *  \mscfile overview.signalling Figure 1. Using P2P at runtime.
++ *
++ *  After the terminals have been created, the encoding functions can be used to fill the terminals and their payload with private data.
++ *
++ *  \subsection runtime_terminal_creation Querying requirements and creating terminals
++ *
++ *  There are five different terminal types relevant to P2P: three input terminals and two output terminals.
++ *
++ *  Input terminals:
++ *      - <b>Parameter input terminal</b>: contains global kernel parameters
++ *      - <b>Program terminal</b>: contains program-specific information, i.e. information related to fragmentation and fragment-specific kernel parameters
++ *      - <b>Spatial parameter input terminal</b>: contains spatial kernel parameters, e.g. 2D lookup tables for LSC and GridBLC
++ *
++ *  Output terminals:
++ *      - <b>Parameter output terminal</b>: contains global statistics, e.g. histograms
++ *      - <b>Spatial parameter output terminal</b>: contains spatial statistics, e.g. RGBS grid
++ *
++ *  Parameter input terminal contains global parameters for all kernels, so only one parameter input terminal is required. The order of the sections
++ *  in the parameter input terminal usually comes from a FW terminal manifest except for ISYS which does not have a manifest.
++ *
++ *  Program terminal contains program-specific information, i.e. parameters which are not global but fragment-specific. The user can decide into how many
++ *  fragments the full frame is split. Only one program terminal is needed, and it contains fragment-specific parameters for all kernels and for each and every
++ *  fragment. The order of the sections in the program terminal is such that first comes all the sections of all kernels for the first fragment (similar to
++ *  parameter input terminal) and then for the second fragment and so on.
++ *
++ *  Spatial parameter input terminals are kernel-specific, so there is one for each kernel which requires spatial input parameters. The spatial parameter
++ *  input terminal contains lookup tables e.g. LSC table.
++ *
++ *  Parameter output terminal contains global statistics, such as the histograms. There is only one parameter output terminal which contains statistics
++ *  data for all kernels producing global statistics. Since the image might be fragmented, parameter output terminal contains the statistics for each
++ *  fragment individually. The order of the sections is such that first comes the statistics of all kernels for the first fragment, then for the second
++ *  fragment and so on.
++ *
++ *  Spatial parameter output terminal contains spatial statistics, such as the RGBS grid. There is one spatial parameter output terminal for each kernel
++ *  which produces spatial statistics and it contains only the data for that specific kernel.
++ *
++ *  Figure 2 illustrates the process of querying terminal and payload requirements and creating the terminals. The number of sections in the
++ *  terminals must be queried from P2P using ia_p2p_get_kernel_terminal_requirements(). Since this function returns the requirements for a single
++ *  kernel, the user is responsible for looping it over all kernels and accumulating the results to determine the total number of sections in the
++ *  parameter terminal and program terminal.
++ *
++ *  In order to calculate how much memory should be allocated for the actual payload, ia_p2p_get_kernel_payload_desc() is used. This function returns
++ *  the required payload size for a single kernel for each terminal type. The user must accumulate the payload sizes over all kernels to determine the
++ *  total amount of memory required for payload.
++ *
++ *  \mscfile terminal_creation.signalling Figure 2. Querying requirements and creating terminals.
++ *
++ *  After requirements for the terminals and the payload have been determined, memory should be allocated for the terminals and the payload.
++ *  Terminals are created using the functions provided by the firmware. As previously explained, only one parameter input terminal, one parameter
++ *  output terminal and one program terminal is needed, whereas there must be one spatial parameter input terminal for each kernel having spatial
++ *  input parameters. The same applies to spatial output terminals.
++ *
++ *  \subsection runtime_encoding Encoding
++ *
++ *  Figure 3 illustrates the encoding process. P2P expects that the user will keep track of the section index where to write the parameters for each
++ *  kernel. For each terminal, encoding is performed kernel by kernel in the order of increasing kernel identifier. The first kernel will write to section 0.
++ *  The results of ia_p2p_get_kernel_requirements() define how much to increment the section index counter between loop iterations. E.g., if the first
++ *  kernel requires 3 sections, the second kernel will be written to section index 3 and so on. The following pseudo code shows how the loop could look like
++ *  for the parameter input terminal in case of ISYS:
++ *
++ *  \code{.c}
++ *  unsigned int cur_section = 0;
++ *  unsigned int cur_offset = 0;
++ *
++ *  for (kernel = 0; kernel < N_IA_CSS_ISYS_KERNEL_ID; ++kernel)
++ *  {
++ *      ia_p2p_parameter_terminal_encode(ia_p2p, IA_P2P_PG_ISYS, kernel, terminal, cur_section, payload_buffer, cur_offset);
++ *
++ *      ia_p2p_get_kernel_terminal_requirements(ia_p2p, IA_P2P_PG_ISYS, kernel, &reqs); // These could be cached before the loop.
++ *      cur_section += reqs.parameter_section_count;
++ *
++ *      ia_p2p_get_kernel_payload_desc(ia_p2p, IA_P2P_PG_ISYS, kernel, fragment_count, &desc); // These could be cached before the loop.
++ *      cur_offset += desc.parameter_payload_size;
++ *  }
++ *  \endcode
++ *
++ *  \mscfile encoding.signalling 3. Encoding process.
++ *
++ *  Parameter terminal does not have any dependencies, so it can be encoded at any point of execution by looping through all kernel identifiers using
++ *  ia_p2p_param_in_terminal_encode(). Same is true for the parameter output terminal which is prepared using ia_p2p_param_out_terminal_prepare() at any time.
++ *  Preparation only fills in the payload offsets so that firmware knows where to write the statistics.
++ *
++ *  Program terminal encoding must be started with ia_p2p_program_terminal_init(). This is executed only once per frame. Then, ia_p2p_program_terminal_encode()
++ *  needs to be run for each kernel individually, just as was with ia_p2p_param_in_terminal_encode(). Program terminal encode needs the fragment descriptors,
++ *  which define which part of the full frame the fragment contains.
++ *
++ *  Spatial param terminals are encoded/prepared with ia_p2p_spatial_param_in_terminal_encode() / ia_p2p_spatial_param_out_terminal_prepare(). Each kernel has its
++ *  own spatial terminals, so the function is called only once per terminal for each kernel.
++ *
++ *  \subsection runtime_decoding_stats Decoding statistics
++ *
++ *  Figure 4 illustrates the decoding process for statistics. Decoding the parameter output terminal should be done with a similar loop as encoding the parameter
++ *  input terminal and keeping track of the current section index. ia_p2p_param_out_terminal_decode() is used to decode the global statistics. Spatial statistics are
++ *  decoded similarly with ia_p2p_spatial_param_out_terminal_decode() with the exception that every statistics block producing spatial statistics has its own spatial
++ *  param output terminal.
++ *
++ *  \mscfile decoding_stats.signalling 4. Decoding process for statistics.
++ *
++ *  After all statistics have been decoded, the statistics buffer can be requested from P2P by ia_p2p_serialize_statistics(). The returned ia_binary_data buffer is
++ *  owned by P2P and remains valid until ia_p2p_serialize_statistics() is called the next time. The user is responsible of copying the data from the ia_binary_data
++ *  structure to another location to preserve it over several frames.
++ *
++ *  \subsection runtime_decoding_inputs Decoding input parameters (only for debugging purposes)
++ *
++ *  P2P offers functions for decoding also the input parameters. This is meant only for debugging purposes and should not be used on a real device. Decoding input
++ *  parameters has strict requirements for the order of executing the decoding functions. It is mandatory to first decode the parameter terminal with
++ *  ia_p2p_param_in_terminal_encode() since the parameter terminal contains the information about which kernels have been enabled. This is needed to determine
++ *  how the other terminals are decoded. Before the program terminal can be decoded, the sequencer fragment grid descriptors for a specific kernel must be retrieved
++ *  from the spatial parameter input terminal using ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(). After this step, ia_p2p_program_terminal_decode()
++ *  can be used to decode program-specific parameters. Finally, ia_p2p_spatial_param_in_terminal_decode() is used to decode the spatial input terminals.
++ *
++ *  \mscfile decoding.signalling 5. Decoding process for input parameters.
++ *
++ *  \page integration_guide Integration Guide
++ *
++ *  This page explains how to integrate P2P for each program group.
++ *
++ *  The following table summarizes the supported program groups in P2P:
++ *
++ *  SV = meaning supported for internal System Validation only (not released for driver)
++ *
++ *  Program Group             | P2P Constant                         | PG ID | Fragmentation Support | BXT B0 | CNL B0 | GLV A0 | IPU6 | IPU6S
++ *  ------------------------- | ------------------------------------ | ----- | --------------------- | ------ | ------ | ------ | ---- | ------
++ *  ISYS                      | IA_P2P_PG_ISYS                       | 0     | Yes                   | X      | X      | -      | -    | -
++ *  ISL PS HIRES              | IA_P2P_PG_ISL_PS_HIRES               | 127   | Yes                   | X      | -      | -      | -    | -
++ *  ISL PS INPUT CROP         | IA_P2P_PG_ISL_PS_INPUT_CROP          | 127   | Yes                   | -      | X      | -      | -    | -
++ *  ISL PS GLV VPLESS         | IA_P2P_PG_ISL_PS_GLV_VPLESS          | 166   | Yes                   | -      | -      | X      | -    | -
++ *  ISA LB GLV VPLESS         | IA_P2P_PG_ISA_LB_GLV_VPLESS          | 194   | Yes                   | -      | -      | X      | -    | -
++ *  Video PreGDC HQ           | IA_P2P_PG_VPREGDC_HQ                 | 122   | Yes                   | X      | X      | -      | -    | -
++ *  IPU5 Video PreGDC VPless  | IA_P2P_PG_IPU5_VPREGDC_VPLESS        | 167   | Yes                   | -      | -      | X      | -    | -
++ *  Still PreGDC              | IA_P2P_PG_SPREGDC                    | 117   | No                    | -      | -      | -      | -    | -
++ *  IPU5 Still PreGDC VPless  | IA_P2P_PG_IPU5_SPREGDC_VPLESS        | 168   | Yes                   | -      | -      | X      | -    | -
++ *  Still PreGDC XNR          | IA_P2P_PG_SPREGDC_XNR                | 125   | No                    | -      | -      | -      | -    | -
++ *  Still PreGDC XNR V2       | IA_P2P_PG_SPREGDC_XNR_V2             | 131   | Yes                   | X      | X      | -      | -    | -
++ *  Still PreGDC XNR V3       | IA_P2P_PG_SPREGDC_XNR_V3             | 136   | Yes                   | X      | X      | -      | -    | -
++ *  Still PostGDC             | IA_P2P_PG_SPOSTGDC                   | 118   | Yes                   | X      | X      | X      | -    | -
++ *  Still PostGDC IN8         | IA_P2P_PG_SPOSTGDC_IN8               | 152   | Yes                   |        |        | X      | -    | -
++ *  Still PostGDC V4          | IA_P2P_PG_SPOSTGDC_V4                | 161   | No                    |        |        | SV     | -    | -
++ *  Still PostGDC IN8 V4      | IA_P2P_PG_SPOSTGDC_IN8_V4            | 162   | Yes                   | -      | -      | X      | -    | -
++ *  Still PostGDC V4 10BIT    | IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT     | 197   | Yes                   | -      | -      | X      | -    | -
++ *  Video PostGDC V1          | IA_P2P_PG_IPU5_VPOSTGDC_V1           | 151   | No                    | -      | -      | X      | -    | -
++ *  Video PostGDC V4          | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 169   | No                    | -      | -      | X      | -    | -
++ *  Video PostGDC V4 HDR10    | IA_P2P_PG_IPU5_VPOSTGDC_V4           | 193   | No                    | -      | -      | X      | -    | -
++ *  Video PostGDC V2          | IA_P2P_PG_VPOSTGDC_V2                | 129   | No                    | X      | X      | -      | -    | -
++ *  Video PostGDC V2 MBR      | IA_P2P_PG_VPOSTGDC_V2_MBR            | 172   | No                    | -      | X      | -      | -    | -
++ *  Still PostGDC V2 MBR      | IA_P2P_PG_SPOSTGDC_V2_MBR            | 173   | Yes                   | -      | X      | -      | -    | -
++ *  Video PostGDC MBR         | IA_P2P_PG_VPOSTGDC_MBR               | 132   | No                    | -      | X      | -      | -    | -
++ *  Still PostGDC MBR         | IA_P2P_PG_SPOSTGDC_MBR               | 133   | Yes                   | -      | X      | -      | -    | -
++ *  Video PreGDC HQ VCR2      | IA_P2P_PG_VPREGDC_HQ_VCR2            | 148   | Yes                   | -      | X      | -      | -    | -
++ *  Video ISL PreGDC HQ VCR2  | IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   | 156   | Yes                   | -      | X      | -      | -    | -
++ *  Still PreGDC XNR V2 VCR2  | IA_P2P_PG_SPREGDC_XNR_V2_VCR2        | 149   | Yes                   | -      | X      | -      | -    | -
++ *  Still PreGDC XNR V3 VCR2  | IA_P2P_PG_SPREGDC_XNR_V3_VCR2        | 150   | Yes                   | -      | X      | -      | -    | -
++ *  LB PSA Bypass             | IA_P2P_PG_IPU6_LB_PSA_BYPASS         | 182   | No                    | -      | -      | -      | X    | -
++ *  LB PSA                    | IA_P2P_PG_IPU6_LB_PSA                | 183   | No                    | -      | -      | -      | X    | -
++ *  ISL RBM                   | IA_P2P_PG_IPU6_ISL_RBM               | 185   | No                    | -      | -      | -      | X    | -
++ *  ISA combined LB PG        | IA_P2P_PG_IPU6_ISA_LB                | 187   | No                    | -      | -      | -      | X    | -
++ *  ISA PG                    | IA_P2P_PG_IPU6S_ISA                  | 198   | No                    | -      | -      | -      | -    | X
++ *  Video PreGDC HQ NS        | IA_P2P_PG_VPREGDC_HQ_NS              | 1000  | Yes                   | X      | -      | -      | -    | -
++ *  Video PostGDC HQ NS       | IA_P2P_PG_VPOSTGDC_HQ_NS             | 1001  | Yes                   | X      | -      | -      | -    | -
++ *  Video PreGDC HP           | IA_P2P_PG_VPREGDC_HP                 | 1002  | Yes                   | X      | -      | -      | -    | -
++ *  Video PostGDC HP          | IA_P2P_PG_VPOSTGDC_HP                | 1003  | Yes                   | X      | -      | -      | -    | -
++ *  Video PreGDC LL           | IA_P2P_PG_VPREGDC_LL                 | 1004  | Yes                   | X      | -      | -      | -    | -
++ *  VHDR PreProc V2           | IA_P2P_PG_VHDR_PREPROC_V2            | 1005  | Yes                   | X      | -      | -      | -    | -
++ *  Video PreGDC HQ NS DVS    | IA_P2P_PG_VPREGDC_HQ_NS_DVS          | 1007  | Yes                   | X      | -      | -      | -    | -
++ *  Video PostGDC HQ NS DVS2  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        | 1008  | Yes                   | X      | -      | -      | -    | -
++ *  Video PostGDC HQ NS DVS3  | IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        | 1009  | Yes                   | X      | -      | -      | -    | -
++ *  Video PreGDC HP 2FR       | IA_P2P_PG_VPREGDC_HP_2FR             | 1010  | Yes                   | X      | -      | -      | -    | -
++ *  Video PostGDC HQ 4K       | IA_P2P_PG_VPOSTGDC_HQ_4K             | 1011  | No                    | X      | -      | -      | -    | -
++ *  Video PreGDC ISL HQ 4K    | IA_P2P_PG_VPREGDC_ISL_HQ_4K          | 1012  | Yes                   | X      | -      | -      | -    | -
++ *  VHDR PreProc Stats HP     | IA_P2P_PG_VHDR_PREPROC_Stats hp      | 1013  | Yes                   | X      | -      | -      | -    | -
++ *  Video PreGDC HP DRC       | IA_P2P_PG_VPREGDC_HP_DRC             | 1014  | Yes                   | X      | -      | -      | -    | -
++ *  VHDR PreGDC HP            | IA_P2P_PG_VHDR_PREGDC_HP             | 1015  | Yes                   | X      | -      | -      | -    | -
++ *  YUYV SCALE                | IA_P2P_PG_YUYV_SCALE                 | 1051  | No                    | X      | -      | -      | -    | -
++ *  YUV_CSC                   | IA_P2P_PG_YUV_CSC                    | 1052  | No                    | X      | -      | -      | -    | -
++ *  YUYV_LDC                  | IA_P2P_PG_YUYV_LDC                   | 1053  | No                    | X      | -      | -      | -    | -
++ *
++ *  \section isys Input System Program Groups
++ *
++ *  Program groups involved
++ *   - ISYS
++ *   - ISL PS GLV
++ *   - ISL PS HIRES
++ *   - ISL PS INPUT CROP
++ *
++ *  ISYS is the only program group which does not have a terminal manifest to use. This is why all control logic for P2P integration must be done by calling P2P
++ *  encode functions in the increasing kernel id order defined in the IA_CSS_ISA_KERNEL_ID enumeration in FW code. This ordering holds true for both param in and
++ *  program terminals. Spatial terminals use individual kernel ids and they utilize the same numbering as the param in and program terminal kernel ids.
++ *
++ *  ISL PS GLV, ISL PS INPUT CROP and ISL PS HIRES program groups are similar to ISYS program group, but they are run on PSYS and are meant for multi-camera setups.
++ *  This also means that there is a manifest available. All encoding logic should follow the manifest to achieve correct section order.
++ *
++ *  One difference compared to the ISYS program group is also that the spatial terminals have different kernel ids than the param in and program terminal. A good
++ *  example of this is LSC: param in and program terminals use kernel id 7 for LSC sensor type 1, but the corresponding LSC spatial terminal is using kernel id 28.
++ *
++ *  Since P2P needs to support both ISYS and ISL PS program groups at the same time, P2P internally uses the common logic and this is why kernel requirements
++ *  and payload descriptors should not be calculated for spatial terminal kernel ids (kernel_id >= 24). The required payload is already calculated when calling
++ *  ia_p2p_get_kernel_terminal_requirements() and ia_p2p_get_kernel_payload_desc() functions for the non-spatial kernel ids (kernel_id < 24). This is not critical,
++ *  since the only downside of calling the functions is that too much memory is allocated, but should anyway be optimized.
++ *
++ * The following chapters list the required PAL records for each Input System program group.
++ *
++ *  \subsection ipu5_pre_gdc_pgs IPU5 Input System Program Group PALs
++ *
++
++ *  \subsubsection isl_ps_glv_vpless IA_P2P_PG_ISL_PS_GLV_VPLESS (PG id 166)
++ *
++ *   - ia_pal_uuid_isp_pixelformatter
++ *   - ia_pal_uuid_isp_bxt_norm_lin
++ *   - ia_pal_uuid_isp_bxt_gridbaseob
++ *   - ia_pal_uuid_isp_bxt_linearization
++ *   - ia_pal_uuid_isp_bxt_lsc
++ *   - ia_pal_uuid_isp_dpc_1_3
++ *   - ia_pal_uuid_isp_pafstatistics_1
++ *   - ia_pal_uuid_isp_lca_1_0
++ *   - ia_pal_uuid_isp_bxt_blc
++ *   - ia_pal_uuid_isp_bxt_disparity
++ *   - ia_pal_uuid_isp_bxt_applycorrection
++ *   - ia_pal_uuid_isp_bxt_awbstatistics
++ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
++ *   - ia_pal_uuid_isp_bxt_3a_ccm
++ *   - ia_pal_uuid_isp_bxt_aestatistics
++ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
++ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
++ *   - ia_pal_uuid_isp_padder_bayer_a
++ *   - ia_pal_uuid_isp_bxt_inputscalerv2
++ *   - ia_pal_uuid_isp_bxt_vcsc
++ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
++ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
++ *   - ia_pal_uuid_isp_padder_yuv_a
++ *   - ia_pal_uuid_isp_crop_sis
++ *   - ia_pal_uuid_isp_wb_sis
++ *   - ia_pal_uuid_isp_sis_1
++ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
++ *   - ia_pal_uuid_isp_pxl_crop_sis_a
++ *
++ *  \subsubsection isl_ps_dfm_lb_glv IA_P2P_PG_ISA_LB_GLV_VPLESS (PG id 194)
++ *
++ *   - ia_pal_uuid_isp_bxt_pixelformatter
++ *   - ia_pal_uuid_isp_bxt_norm_lin
++ *   - ia_pal_uuid_isp_bxt_gridbaseob
++ *   - ia_pal_uuid_isp_bxt_linearization
++ *   - ia_pal_uuid_isp_bxt_lsc
++ *   - ia_pal_uuid_isp_dpc_1_3
++ *   - ia_pal_uuid_isp_pafstatistics_1
++ *   - ia_pal_uuid_isp_lca_1_0
++ *   - ia_pal_uuid_isp_bxt_blc
++ *   - ia_pal_uuid_isp_bxt_disparity
++ *   - ia_pal_uuid_isp_bxt_applycorrection
++ *   - ia_pal_uuid_isp_bxt_awbstatistics
++ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
++ *   - ia_pal_uuid_isp_bxt_3a_ccm
++ *   - ia_pal_uuid_isp_bxt_aestatistics
++ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropstills
++ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
++ *   - ia_pal_uuid_isp_padder_bayer_a
++ *   - ia_pal_uuid_isp_bxt_inputscalerv2
++ *   - ia_pal_uuid_isp_bxt_vcsc
++ *   - ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo
++ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
++ *   - ia_pal_uuid_isp_padder_yuv_a
++ *   - ia_pal_uuid_isp_crop_sis
++ *   - ia_pal_uuid_isp_wb_sis
++ *   - ia_pal_uuid_isp_sis_1
++ *   - ia_pal_uuid_isp_pixprecadapter_post_sis
++ *   - ia_pal_uuid_isp_pxl_crop_sis_a
++ *   - ia_pal_uuid_isp_bnlm_3_0
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_b2i_dm_1_0
++ *   - ia_pal_uuid_isp_bxt_vcsc
++ *   - ia_pal_uuid_isp_gltm_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_glim_1_0
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_gammastar_1
++ *   - ia_pal_uuid_isp_gammatm_v3
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_strm_crop_psa
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_dvsstatistics_2
++ *
++ *  \section pregdc_pgs Pre-GDC Program Groups
++ *
++ *  Program groups involved
++ *   - Video PreGDC
++ *   - Video PreGDC HQ
++ *   - Video PreGDC HQ VCR2
++ *   - ISL Video PreGDC HQ VCR2
++ *   - Still PreGDC
++ *   - Still PreGDC XNR
++ *   - Still PreGDC XNR V2
++ *   - Still PreGDC XNR V3
++ *   - Still PreGDC XNR V2 VCR2
++ *   - Still PreGDC XNR V3 VCR2
++ *   - Video PreGDC HQ NS
++ *   - Video PreGDC HQ NS DVS
++ *   - Video PreGDC LL
++ *   - Video PreGDC HP
++ *   - Video PreGDC HP 2FR
++ *   - Video ISL PreGDC HQ 4K
++ *   - Video HDR PreGDC HP
++ *
++ *  All PreGDC program groups have a manifest which should be used when calling P2P encoding functionality. Because of the DMA packing feature,
++ *  the input and output fragment's "bits per elements" or "bpe" can be freely chosen by the driver. Hence the alignment requirements are different
++ *  between input and output fragments. For P2P to configure the output crop parameters, it should to know the fragment descriptor calculation logic
++ *  Hence P2P must be used to calculate the fragment descriptors for preGDC and driver would need to call the ia_p2p_calculate_pregdc_fragments()
++ *  for that purpose.
++ *
++ *  Because the input and output alignments can be different, p2p maintains an internal cache about the pixels to be cropped for each fragment.
++ *  The driver must call ia_p2p_calculate_pregdc_fragments() with input and output fragment bpe, frame width, fragment count and input and output
++ *  fragment descriptors. P2P will use the cached output crop pixel offsets for subsequent configuring of the output crop parameters.
++ *
++ *  To simplify the fragment descriptor calculations, P2P assumes the maximum number of fragments to be supported as 20.
++ *
++ * The following chapters list the required PAL records for each Pre-GDC program group.
++ *
++ *  \subsection ipu5_pre_gdc_pgs IPU5 Pre-GDC Program Group PALs
++ *
++ *  \subsubsection  vpregdc IA_P2P_PG_IPU5_VPREGDC_VPLESS (PG id 167)
++ *
++ *   - ia_pal_uuid_isp_bnlm_3_0
++ *   - ia_pal_uuid_isp_gltm_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_glim_1_0
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_gammastar_1
++ *   - ia_pal_uuid_isp_gammatm_v3
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_strm_crop_psa
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_dvsstatistics_2
++ *
++ *  \subsubsection  spregdc_vpless IA_P2P_PG_IPU5_SPREGDC_VPLESS (PG id 168)
++ *
++ *   - ia_pal_uuid_isp_bnlm_3_0
++ *   - ia_pal_uuid_isp_bxt_wb_stills
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector
++ *   - ia_pal_uuid_isp_bxt_vcsc_stills
++ *   - ia_pal_uuid_isp_gltm_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_glim_1_0
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_gammastar_1
++ *   - ia_pal_uuid_isp_gammatm_v3
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_strm_crop_psa
++ *   - ia_pal_uuid_isp_espa_1_0
++ *
++ *  \subsection ipu4p_pre_gdc_pgs IPU4P Pre-GDC Program Group PALs
++ *
++ *  \subsubsection  vpregdc_hq_kernels IA_P2P_PG_VPREGDC_HQ (PG id 122)
++ *
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector,
++ *   - ia_pal_uuid_isp_bxt_ccm,
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_bxt_vcud
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_xnr4_m
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \subsubsection  vpregdc_hq_vcr2_kernels IA_P2P_PG_VPREGDC_HQ_VCR2 (PG id 148)
++ *
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector,
++ *   - ia_pal_uuid_isp_bxt_ccm,
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_bxt_vcud
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_xnr4_m
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \subsubsection  video_isl_pregdc_hq_vcr2_kernels IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2 (PG id 156)
++ *
++ *   - ia_pal_uuid_isp_bxt_norm_lin
++ *   - ia_pal_uuid_isp_bxt_blc
++ *   - ia_pal_uuid_isp_bxt_gridbaseob
++ *   - ia_pal_uuid_isp_bxt_linearization
++ *   - ia_pal_uuid_isp_bxt_lsc
++ *   - ia_pal_uuid_isp_bxt_applycorrection
++ *   - ia_pal_uuid_isp_bxt_disparity
++ *   - ia_pal_uuid_isp_dpc_1_1
++ *   - ia_pal_uuid_isp_bxt_awbstatistics
++ *   - ia_pal_uuid_isp_bxt_af_awb_fr_statistics
++ *   - ia_pal_uuid_isp_bxt_3a_ccm
++ *   - ia_pal_uuid_isp_bxt_aestatistics
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_xnr4_mh
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2 (PG id 131)
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_xnr4_mh
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \subsubsection  spregdc_xnr_v2_kernels IA_P2P_PG_SPREGDC_XNR_V2_VCR2 (PG id 149)
++ *
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_xnr4_mh
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \subsubsection  vpregdc_hq_ns_dvs_kernels IA_P2P_PG_VPREGDC_HQ_NS_DVS (PG id 1007)
++ *
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_bxt_rynr_splitter
++ *   - ia_pal_uuid_isp_bxt_rynr_collector
++ *   - ia_pal_uuid_isp_bxt_bnlm
++ *   - ia_pal_uuid_isp_bxt_vcud
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_bxt_gammatm
++ *   - ia_pal_uuid_isp_sc_iefd
++ *   - ia_pal_uuid_isp_exy
++ *   - ia_pal_uuid_isp_bxt_csc2
++ *   - ia_pal_uuid_isp_bxt_xnr_dss
++ *   - ia_pal_uuid_isp_exy
++ *   - ia_pal_uuid_isp_bxt_dvsstatistics
++ *
++ *  \section postgdc_pgs Post-GDC Program Groups
++ *
++ *  Program groups involved
++ *   - Video PostGDC
++ *   - Video PostGDC V2
++ *   - Video PostGDC V2 MBR
++ *   - Still PostGDC
++ *   - Still PostGDC V2
++ *   - Still PostGDC V2 MBR
++ *   - Video PostGDC MBR
++ *   - Still PostGDC MBR
++ *   - Video PostGDC HQ NS
++ *   - Video PostGDC HQ NS DVS2
++ *   - Video PostGDC HQ NS DVS3
++ *   - Video PostGDC HQ 4K
++ *   - Video PostGDC HP
++ *   - YUYV Scale
++ *   - YUYV LDC
++ *
++ *  Both PostGDC program groups have a manifest which should be used when calling P2P encoding functionality. The driver should call ia_p2p_calculate_postgdc_fragments()
++ *  to calculate proper fragmentation for PostGDC. This function can be used even when there is no fragmentation, i.e. the fragment count is 1. This way the integration
++ *  can be done in the same way for both unfragmented and fragmented use cases.
++ *
++ *  The function ia_p2p_calculate_postgdc_fragments() calculates multiple fragment descriptors. Some of this data needs to be used when configuring the data terminals.
++ *  The following table describes how to configure each data terminal in the program group:
++ *
++ *  Terminal                     | Fragment Descriptors
++ *  ---------------------------- | ---------------------------------------------------------------------------------------------------------------
++ *  Data input terminal          | Configure always to full frame
++ *  Data output terminal (pin 0) | Use output_pixel_fragment_descs_display_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
++ *  Data output terminal (pin 1) | Use output_pixel_fragment_descs_main_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
++ *  Data output terminal (pin 2) | Use output_pixel_fragment_descs_postprocess_pin descriptors calculated by ia_p2p_calculate_postgdc_fragments()
++ *
++ *  The input_pixel_fragment_descs descriptors returned by ia_p2p_calculate_postgdc_fragments() must be given as input to the P2P encoding functions.
++ *
++ * The following chapters list the required PAL records for each Post-GDC program group.
++ *
++ *  \subsection ipu5_post_gdc_pgs IPU5 Post-GDC Program Group PALs
++ *
++ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4 (PG ID 169)
++ *
++ *   - ia_pal_uuid_isp_gdc4_2
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_tnr5_3
++ *
++ *  \subsubsection vpostgdc IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT (PG ID 193)
++ *
++ *   - ia_pal_uuid_isp_gdc4_2
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_tnr5_3_1
++ *
++ *  \subsubsection spostgdc_v4 IA_P2P_PG_SPOSTGDC_V4 (PG id 161)
++ *
++ *   - ia_pal_uuid_isp_gdc4_2
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *
++ *  \subsubsection spostgdc_in8_v4 IA_P2P_PG_SPOSTGDC_IN8_V4 (PG id 162)
++ *
++ *   - ia_pal_uuid_isp_gdc4_2
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *
++ *  \subsubsection spostgdc_v4_10bit IA_P2P_PG_IPU5_SPOSTGDC_V4_10BIT (PG id 197)
++ *
++ *   - ia_pal_uuid_isp_gdc4_2
++ *   - ia_pal_uuid_isp_ofa_1
++ *
++ *  \subsection ipu4p_post_gdc_pgs IPU4P Post-GDC Program Group PALs
++ *
++ *  \subsubsection vpostgdc_dvs2 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2 (PG id 1008)
++ *
++ *   - ia_pal_uuid_isp_gdc3_1
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_tnr5_21
++ *
++ *  \subsubsection vpostgdc_dvs3 IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3 (PG id 1009)
++ *
++ *   - ia_pal_uuid_isp_gdc3_1
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_tnr5_21
++ *
++ *  \subsubsection vpostgdc_4K IA_P2P_PG_VPOSTGDC_HQ_4K (PG id 1011)
++ *
++ *   - ia_pal_uuid_isp_gdc3_1
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_tnr5_22
++ *
++ *  \subsubsection vpostgdc IA_P2P_PG_VPOSTGDC_V2_MBR (PG id 172)
++ *
++ *   - ia_pal_uuid_isp_gdc3_1
++ *   - ia_pal_uuid_isp_ofa_1
++ *   - ia_pal_uuid_isp_sc_outputscaler_ppp
++ *   - ia_pal_uuid_isp_sc_outputscaler_dp
++ *   - ia_pal_uuid_isp_dma_cropper_ppp
++ *   - ia_pal_uuid_isp_dma_cropper_mp
++ *   - ia_pal_uuid_isp_dma_cropper_dp
++ *   - ia_pal_uuid_isp_bxt_tnr5v1
++ *
++ *  \subsection IPU6 PGs
++ *
++ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB_PSA_BYPASS (PG id 182)
++ *
++ *   - ia_pal_uuid_isp_bnlm_3_0
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_gammastar_1
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_gammatm_v3
++ *   - ia_pal_uuid_isp_yuv_splitter
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_gltm_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_glim_1_0
++ *
++ *  \subsubsection LB PSA Bypass PG IA_P2P_PG_IPU6_LB (PG id 183)
++ *
++ *   - ia_pal_uuid_isp_bnlm_3_0
++ *   - ia_pal_uuid_isp_bxt_demosaic
++ *   - ia_pal_uuid_isp_bxt_vcsc
++ *   - ia_pal_uuid_isp_bxt_ccm
++ *   - ia_pal_uuid_isp_bxt_acm
++ *   - ia_pal_uuid_isp_bxt_vcr2
++ *   - ia_pal_uuid_isp_gammastar_1
++ *   - ia_pal_uuid_isp_bxt_csc
++ *   - ia_pal_uuid_isp_gammatm_v3
++ *   - ia_pal_uuid_isp_yuv_splitter
++ *   - ia_pal_uuid_isp_sc_iefd_v2
++ *   - ia_pal_uuid_isp_gltm_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_xnr_5_1
++ *   - ia_pal_uuid_isp_espa_1_0
++ *   - ia_pal_uuid_isp_glim_1_0
++ *
++ *  \subsubsection LB ISA RBM PG IA_P2P_PG_IPU6_ISL_RBM (PG id 185)
++ *
++ *   - ia_pal_uuid_isp_bxt_pixelformatter
++ *   - ia_pal_uuid_isp_bxt_norm_lin
++ *   - ia_pal_uuid_isp_bxt_blc
++ *   - ia_pal_uuid_isp_bxt_gridbaseob
++ *   - ia_pal_uuid_isp_linearization2_0
++ *   - ia_pal_uuid_isp_lsc_1_1
++ *   - ia_pal_uuid_isp_dpc_2_0
++ *   - ia_pal_uuid_isp_bxt_disparity
++ *   - ia_pal_uuid_isp_bxt_applycorrection
++ *   - ia_pal_uuid_isp_af_awb_frstatistics_2_0
++ *   - ia_pal_uuid_isp_awbstatistics_2_0
++ *   - ia_pal_uuid_isp_ccm_3a_2_0
++ *   - ia_pal_uuid_isp_aestatistics_2_0
++ *   - ia_pal_uuid_isp_bxt_wb
++ *   - ia_pal_uuid_isp_lca_1_0
++ *   - ia_pal_uuid_isp_strm_crop_sis_a
++ *   - ia_pal_uuid_isp_sis_1_0_a
++ *   - ia_pal_uuid_isp_espa_sis_a
++ *   - ia_pal_uuid_isp_pxl_crop_sis_a
++ *   - ia_pal_uuid_isp_strm_crop_sis_b
++ *   - ia_pal_uuid_isp_sis_1_0_b
++ *   - ia_pal_uuid_isp_espa_sis_b
++ *   - ia_pal_uuid_isp_pxl_crop_sis_b
++ *   - ia_pal_uuid_isp_espa_bayer_a
++ *   - ia_pal_uuid_isp_padder_bayer_a
++ *   - ia_pal_uuid_isp_pxl_crop_bayer_a
++ *   - ia_pal_uuid_isp_b2i_bnr_1_0
++ *   - ia_pal_uuid_isp_b2i_dm_1_0
++ *   - ia_pal_uuid_isp_b2i_sie_1_0
++ *   - ia_pal_uuid_isp_b2i_ds_1_0_0
++ *   - ia_pal_uuid_isp_espa_yuv_a
++ *   - ia_pal_uuid_isp_padder_yuv_a
++ *   - ia_pal_uuid_isp_pxl_crop_yuv_a
++ *   - ia_pal_uuid_isp_b2i_ds_1_0_1
++ *   - ia_pal_uuid_isp_espa_yuv_b
++ *   - ia_pal_uuid_isp_padder_yuv_b
++ *   - ia_pal_uuid_isp_pxl_crop_yuv_b
++ *   - ia_pal_uuid_isp_espa_yuv_c
++ *   - ia_pal_uuid_isp_padder_yuv_c
++ *   - ia_pal_uuid_isp_pxl_crop_yuv_c
++ *
++ *  \subsubsection IPU6 combined ISA PG IA_P2P_PG_IPU6_ISA_LB (PG id 187)
++ *   - ia_pal_uuid_espa_isa_sis_a
++ *   - ia_pal_uuid_espa_isa_sis_b
++ *   - ia_pal_uuid_ycbcrcombine
++ *   - ia_pal_uuid_pxl_crop_sis_a
++ *   - ia_pal_uuid_linearization2_0
++ *   - ia_pal_uuid_pxl_crop_sis_b
++ *   - ia_pal_uuid_pixelformatter
++ *   - ia_pal_uuid_dpc_2_0
++ *   - ia_pal_uuid_packer_isa_yuv_b
++ *   - ia_pal_uuid_bxt_acm
++ *   - ia_pal_uuid_espa_isa_bayer_a
++ *   - ia_pal_uuid_awbstatistics_2_0
++ *   - ia_pal_uuid_pxl_crop_yuv_c
++ *   - ia_pal_uuid_strm_crop_psa_c
++ *   - ia_pal_uuid_strm_crop_psa_d
++ *   - ia_pal_uuid_strm_crop_psa_e
++ *   - ia_pal_uuid_strm_crop_psa_f
++ *   - ia_pal_uuid_pxl_crop_yuv_b
++ *   - ia_pal_uuid_strm_crop_psa_h
++ *   - ia_pal_uuid_b2i_dm_1_0
++ *   - ia_pal_uuid_pxl_crop_yuv_a
++ *   - ia_pal_uuid_sve_1_0
++ *   - ia_pal_uuid_espa_isa_yuv_c
++ *   - ia_pal_uuid_espa_isa_yuv_b
++ *   - ia_pal_uuid_espa_isa_yuv_a
++ *   - ia_pal_uuid_linearization2_0_c
++ *   - ia_pal_uuid_linearization2_0_b
++ *   - ia_pal_uuid_bxt_vcsc_stills
++ *   - ia_pal_uuid_sis_1_0_b
++ *   - ia_pal_uuid_lsc_1_1
++ *   - ia_pal_uuid_espa_psa_e
++ *   - ia_pal_uuid_sis_1_0_a
++ *   - ia_pal_uuid_espa_psa_c
++ *   - ia_pal_uuid_pix_crop_ir_md
++ *   - ia_pal_uuid_espa_psa_h
++ *   - ia_pal_uuid_bxt_vcr2
++ *   - ia_pal_uuid_bxt_gridbaseob
++ *   - ia_pal_uuid_xnr_5_2
++ *   - ia_pal_uuid_bxt_norm_lin_c
++ *   - ia_pal_uuid_bxt_blc_b
++ *   - ia_pal_uuid_bxt_csc
++ *   - ia_pal_uuid_padder_yuv_a
++ *   - ia_pal_uuid_padder_yuv_b
++ *   - ia_pal_uuid_padder_yuv_c
++ *   - ia_pal_uuid_ccm_3a_2_0
++ *   - ia_pal_uuid_bxt_blc_c
++ *   - ia_pal_uuid_espa_psa_4
++ *   - ia_pal_uuid_x2i_md_1_0
++ *   - ia_pal_uuid_espa_psa_1
++ *   - ia_pal_uuid_b2i_sie_1_0
++ *   - ia_pal_uuid_bxt_applycorrection
++ *   - ia_pal_uuid_packer_isa_yuv_c
++ *   - ia_pal_uuid_padder_bayer_a
++ *   - ia_pal_uuid_packer_isa_yuv_a
++ *   - ia_pal_uuid_pxl_crop_bayer_a
++ *   - ia_pal_uuid_dvsstatistics_2
++ *   - ia_pal_uuid_sc_iefd_v2
++ *   - ia_pal_uuid_packer_isa_bayer_a
++ *   - ia_pal_uuid_b2i_bnr_1_0
++ *   - ia_pal_uuid_af_awb_frstatistics_2_0
++ *   - ia_pal_uuid_rgb_ir_2_0
++ *   - ia_pal_uuid_glim_1_0
++ *   - ia_pal_uuid_strm_crop_sis_b
++ *   - ia_pal_uuid_strm_crop_sis_a
++ *   - ia_pal_uuid_espa_isa_wb
++ *   - ia_pal_uuid_bxt_blc
++ *   - ia_pal_uuid_bxt_gridbaseob_b
++ *   - ia_pal_uuid_bxt_gridbaseob_c
++ *   - ia_pal_uuid_espa_psa_f
++ *   - ia_pal_uuid_bxt_norm_lin
++ *   - ia_pal_uuid_bxt_norm_lin_b
++ *   - ia_pal_uuid_gltm_1_0
++ *   - ia_pal_uuid_pixelformatter_c
++ *   - ia_pal_uuid_pixelformatter_b
++ *   - ia_pal_uuid_bxt_ccm
++ *   - ia_pal_uuid_vertical_padding_1_0
++ *   - ia_pal_uuid_b2i_ds_1_0_1
++ *   - ia_pal_uuid_b2i_ds_1_0_0
++ *   - ia_pal_uuid_espa_psa_d
++ *   - ia_pal_uuid_pafstatistics_1
++ *   - ia_pal_uuid_strm_crop_psa_g
++ *   - ia_pal_uuid_bxt_demosaic
++ *   - ia_pal_uuid_lca_1_0
++ *   - ia_pal_uuid_bxt_disparity
++ *   - ia_pal_uuid_gammastar_1
++ *   - ia_pal_uuid_espa_psa_g
++ *   - ia_pal_uuid_dol_1_0
++ *   - ia_pal_uuid_aestatistics_2_0
++ *   - ia_pal_uuid_espa_isa_ir_md
++ *   - ia_pal_uuid_gammatm_v3
++ *   - ia_pal_uuid_bnlm_3_0
++ *   - ia_pal_uuid_bxt_wb
++ *
++ *  \page debugging Debugging
++ *
++ *  This page explains how P2P can be debugged. There are three ways to debug P2P operation.
++ *
++ *  \section simulator P2P simulator
++ *
++ *  P2P simulator (also known as PG dump utility), which originally was done for FW validation purposes, is a test case which can be used to run whole P2P encoding cycle
++ *  for a program group based on a PAL output binary. The simulator takes the PAL output binary as an input and produces terminal payload dumps as an output. By attaching
++ *  a debugger, the whole P2P encoding can be debugged. This is useful for checking if the input parameters valid and encoded correctly. Since the P2P simulator can only
++ *  run encoding, it is not suitable for debugging statistics related issues.
++ *
++ *  All test case files needed by the P2P simulator can be found under <i>validation</i> folder. File <i>dumpgen.test</i> is the main test case file for running the dump
++ *  generation. In addition to the generator, the simulator needs to know which program group to run (defined by a .pg file) and what kind of fragmentation scheme to run
++ *  (defined by a .frag file). The simulator produces two files for each terminal: terminal descriptor and terminal payload. There can be directly used by FW for validation
++ *  purposes.
++ *
++ *  The generic syntax of running the P2P simulator is as follows:
++ *
++ *  \code
++ *  bin/testframework -D Validate=<boolean> -D OutputDir=<string> -D FrameWidth=<int> -D FrameHeight=<int> -D FragmentCount=<int> -D PalDataFile=<string> <Frag_file> <Pg_file> validation/dumpgen.test GenerateDump
++ *  \endcode
++ *
++ *  Parameters:
++ *  - <b>Validate</b>: Defines whether PAL output binary values will be validated or not. Possible values:
++ *      - <i>true</i>: P2P validates all PAL output binary values and stops if there is even a single invalid value. No P2P dumps are produced in case that the validation fails.
++ *      - <i>false</i>: Validation is skipped and the P2P dumps are produced always. If there is invalid values, it might lead to a crash in the worst case.
++ *  - <b>OutputDir</b>: Specifies the folder where the P2P dumps are written.
++ *  - <b>FrameWidth</b>: Defines the full input frame width. Only needed when using single.frag for fragmentation.
++ *  - <b>FrameHeight</b>: Defines the full input frame height. Only needed when using single.frag for fragmentation.
++ *  - <b>FragmentCount</b>: Defines the number of fragments to use. Only needed when using postgdc_auto.frag for fragmentation.
++ *  - <b>PalDataFile</b>: Specifies the location of the PAL output binary to use as the input.
++ *  - <b>Frag_file</b>: The file which defines the fragmentation scheme (.frag file). Currently, there are two possible schemes:
++ *      - <i>validation/single.frag</i>: Runs a single fragment which covers the full frame. Uses FrameWidth and FrameHeight parameters.
++ *      - <i>validation/postgdc_auto.frag</i>: Runs automatic fragmentation calculation for postgdc. Uses FragmentCount parameter to define into how many fragments the full frame is split.
++ *      - <i>validation/auto.fraq</i>: Runs automatic fragment calculation for all program groups. THIS SHOULD BE USED in all PGs for IPU5.5.
++ *  - <b>Pg_file</b>: The file which defines which program group to run (.pg file).
++ *  - <b>ShowVersion</b>: Displays simulator version in output log. The version number is generated for pre-compiled binaries.
++ *
++ *  Example use for vpregdc using one fragment and resolution 2048x1536:
++ *  \code
++ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FrameWidth=2048 -D FrameHeight=1536 -D PalDataFile=PAL.bin validation/single.frag validation/vpregdc.pg validation/dumpgen.test GenerateDump
++ *  \endcode
++ *
++ *  Example use for spostgdc using automatic fragmentation:
++ *  \code
++ *  bin/testframework -D Validate=true -D OutputDir=p2p_output -D FragmentCount=2 -D PalDataFile=PAL.bin validation/postgdc_auto.frag validation/spostgdc.pg validation/dumpgen.test GenerateDump
++ *  \endcode
++ *
++ *  Example use for querying version number:
++ *  \code
++ *  bin/testframework validation/dumpgen.test ShowVersion
++ *  \endcode
++ *
++ *  \section p2pdecoder P2P decoder
++ *
++ *  P2P decoder can be used to interpret P2P outputs received from FW or driver teams. The decoder supports both pgdump and parambins formats. PG dump is a file which
++ *  contains the P2P output as a single text file. Parambins, on the other hand, is a collection of binary files which define the terminal descriptor and payload for each
++ *  terminal.
++ *
++ *  P2P decoder interprets the P2P output and prints all found parameters into the log output. In a sense, it is doing the P2P simulation to the other direction (from
++ *  private to public). This can be used to check what kind of configuration parameters were sent to the FW. Also, if the pgdump is created after running the program
++ *  group, the decoder can be used for inspecting statistics issues.
++ *
++ *  The version number is the same for P2P simulator and decoder. However, it is possible to query the version by running decoder.test with the same option as the simulator.
++ *
++ *  \subsection decode_from_pgdump Decoding From Pgdump
++ *
++ *  The syntax of running the decoder using a pgdump as input is as follows:
++ *
++ *  \code
++ *  bin/testframework -D PGDumpFile=<string> <Pg_file> validation/decoder.test DecodePGDump
++ *  \endcode
++ *
++ *  Parameters:
++ *  - <b>PGDumpFile</b>: Specifies the location of the PG dump file to use as the input.
++ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
++ *
++ *  Example use for spostgdc:
++ *  \code
++ *  bin/testframework -D PGDumpFile=pgdump.txt validation/spostgdc.pg validation/decoder.test DecodePGDump
++ *  \endcode
++ *
++ *  \subsection decode_from_parambins Decoding From Parambins
++ *
++ *  The syntax of running the decoder using parambins as input is as follows:
++ *
++ *  \code
++ *  bin/testframework -D ParamBinsFolder=<string> <Pg_file> validation/decoder.test DecodeParamBins
++ *  \endcode
++ *
++ *  Parameters:
++ *  - <b>ParamBinsFolder</b>: Specifies the folder which contains the parambins for all terminals to use as the input.
++ *  - <b>Pg_file</b>: The file which defines for which program group the dump was made (.pg file).
++ *
++ *  Example use for spostgdc:
++ *  \code
++ *  bin/testframework -D ParamBinsFolder=p2p_output validation/spostgdc.pg validation/decoder.test DecodeParamBins
++ *  \endcode
++ *
++ *  \section filedebug P2P File Debug
++ *
++ *  P2P contains similar file debug functionality as the other libraries (AIQ and IA_ISP). By enabling the file debug feature in the builds by defining the pre-compiler flag
++ *  INPUT_IN_FILE, P2P will store all function calls to ia_p2p_usecase.bin files, which allows reproducing the exact same execution than what was run in real hardware.
++ *
++ *  Unlike the file debug in other libraries, P2P file debug cannot be run independently. Both IA_ISP_BXT and P2P file debug dumps are required in order to run the full
++ *  simulation. This means that INPUTS_IN_FILE needs to be enabled in both ia_p2p and ia_isp_bxt libraries. The HAL/driver also instantiates multiple instances of P2P to
++ *  be able to run encoding for different frames concurrently. This means that it is not enough to copy only one of the P2P file debug dumps. For full file debug simulation,
++ *  all P2P file debug dumps produced from the same system startup are required.
++ *
++ *  \subsection filedebug_windows Capturing P2P File Debug Dumps on Windows
++ *
++ *  On Windows, P2P file debug dumps are produced in folder <i>C:\\Windows\\system32\\drivers</i>. Windows version of P2P is run in kernel mode which means that P2P is initialized
++ *  already during system startup and uninitialized only when the system is shut down. Since the file debug file handles remain open until the uninitialization, the system needs
++ *  to be restarted in order to be able to copy the ia_p2p_usecase_xxx.bin files to another location.
++ *
++
++ *
++ *  \subsection filedebug_testframework Running File Debug in Testframework
++ *
++ *  Running the simulation is done via ia_isp repository. On Windows side, this happens using the testframework_isp_with_p2p.sln solution file which enables P2P builds in the
++ *  same environment and expects to get P2P dumps as input as well as the ia_isp_bxt dump. P2P dumps are read by the file debug test case using a wild card, so it is enough
++ *  to copy all P2P file debug dumps to the <i>testdata</i> folder. There is no need to change the file names. The IA_ISP_BXT dump is set up in the same way as when debugging
++ *  IA_ISP.
++ */
++
++#ifndef IA_P2P_H_
++#define IA_P2P_H_
++
++#include "ia_isp_bxt_types.h"
++#include "ia_css_terminal_types.h"
++#include "ia_css_terminal.h"
++#include "ia_css_kernel_bitmap.h"
++#include "ia_p2p_types.h"
++#include <ia_css_rbm.h>
++
++#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
++#include "ia_p2p_private.h"
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Following definitions are used regardless if the IA_AIC is compiled in or not.
++ * Keep this part self-contained until the proper IA_AIC implementation exists for these
++ */
++#define PAC_P2P_SECTIONS MAX_NUM_SECTIONS_PER_KERNEL //private buffer layout calculated by p2p also for PAC proto
++#define PAC_P2P_MAX_FRAGMENTS IA_P2P_MAX_FRAGMENTS
++
++struct ia_pac_fragment_desc_p2p {
++        uint16_t fragment_width;    /*!< The width of the fragment. */
++        uint16_t fragment_height;   /*!< The height of the fragment. */
++        uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
++        uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
++};
++
++struct ia_aic_section_info
++{
++    uint32_t param_in_size[PAC_P2P_SECTIONS];
++    uint32_t param_sec_count;
++    uint32_t program_size[PAC_P2P_SECTIONS];
++    uint32_t program_sec_count;
++    uint32_t spatial_in_size[PAC_P2P_SECTIONS];
++    uint32_t spatial_sec_count;
++    uint32_t uuid[MAX_NUM_ASSOCIATED_PALS_PER_DEVICE];
++    uint32_t uuid_count;
++    uint32_t logical_k_id;
++    uint32_t p2p_kernel_id;
++    struct ia_pac_fragment_desc_p2p pixel_fragment_descs[PAC_P2P_MAX_FRAGMENTS];
++};
++
++/*!
++ *  Initializes IA_P2P module for the given platform.
++ *
++ *  \param [in] platform The platform for which to initialize P2P.
++ *
++ *  \return The IA_P2P instance handle, or NULL if errors.
++ */
++ia_p2p_handle ia_p2p_init(ia_p2p_platform_t platform);
++
++/*!
++ *  De-initializes IA_P2P module.
++ *
++ *  \param [in] ia_p2p IA_P2P instance handle.
++ */
++void ia_p2p_deinit(ia_p2p_handle ia_p2p);
++
++/*!
++ *  Returns the required size for the cache buffer.
++ *
++ *  \param [in] ia_p2p IA_P2P instance handle.
++ */
++uint32_t ia_p2p_get_cache_buffer_size(ia_p2p_handle ia_p2p);
++
++/*!
++ *  Returns the required size for the statistics buffer.
++ *
++ *  \param [in] ia_p2p IA_P2P instance handle.
++ */
++int32_t ia_p2p_get_statistics_buffer_size(ia_p2p_handle ia_p2p);
++
++/*!
++ *  Set statistics buffer pointer.
++ *
++ *  \param [in] ia_p2p            IA_P2P instance handle.
++ *  \param [in] statistics_buffer A pointer to statistics buffer. The buffer is allocated and managed by the user. The internal buffer will be used if it is NULL.
++ */
++void ia_p2p_set_statistics_buffer(ia_p2p_handle ia_p2p, void* statistics_buffer);
++
++/*!
++ *  Parses the public data ready to be used for encoding.
++ *
++ *  \param [in] ia_p2p          IA_P2P instance handle.
++ *  \param [in] public_data     The public data to parse (from PAL output).
++ *  \param [in] cache_buffer    A pointer to the cache buffer. The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ *          ia_err_data, if public_data doesn't contain enough data.
++ */
++ia_err ia_p2p_parse(
++    ia_p2p_handle ia_p2p,
++    const ia_binary_data* public_data,
++    void* cache_buffer);
++
++/*!
++ *  Serializes the statistics to a single binary blob.
++ *
++ *  \param [in]  ia_p2p     IA_P2P instance handle.
++ *  \param [out] statistics The resulting statistics data.
++ *  \param [out] included   Flags which indicate what statistics are included in the data.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ *
++ *  \remarks The returned data buffer is owned by P2P and is valid as long as any P2P decode functions are not called.
++ */
++ia_err ia_p2p_serialize_statistics(
++    ia_p2p_handle ia_p2p,
++    ia_binary_data* statistics,
++    ia_p2p_statistics_included_t* included);
++
++/*!
++ *  Generates a kernel bitmap for the requested program group.
++ *
++ *  \param [in] ia_p2p  IA_P2P instance handle.
++ *  \param [in] pg_id   The program group id.
++ *
++ *  \return The kernel bitmap where set bit means that the kernel is an imaging kernel and should be encoded by P2P.
++ */
++ia_css_kernel_bitmap_t ia_p2p_get_kernel_bitmap(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id);
++
++/*!
++*  Generates a kernel bitmap for enabled kernels of the requested program group.
++*
++*  \param [in] ia_p2p  IA_P2P instance handle.
++*  \param [in] pg_id   The program group id.
++*
++*  \return The kernel bitmap where set bit means that the kernel is enabled and should be encoded by P2P.
++*/
++ia_css_kernel_bitmap_t ia_p2p_get_kernel_enable_bitmap(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id);
++
++/*!
++*  Generates a kernel bitmap for disabled kernels of the requested program group.
++*
++*  \param [in] ia_p2p  IA_P2P instance handle.
++*  \param [in] pg_id   The program group id.
++*
++*  \return The kernel bitmap where set bit means that the kernel need to be disabled for the PG.
++*/
++ia_css_kernel_bitmap_t ia_p2p_get_kernel_disable_bitmap(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id);
++
++/*!
++ * Check if the kernel bitmaps is empty.
++ *
++ * \param [in] bitmap Kernel bitmap.
++ *
++ * \return bitmap == 0.
++ */
++bool ia_p2p_is_kernel_bitmap_empty(ia_css_kernel_bitmap_t bitmap);
++
++/*!
++ *  Calculates proper fragments for ISL.
++ *
++ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
++ *  \param [in]   fragment_count                             The number of fragments.
++ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
++ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for Bayer (non-scaled) output.
++ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for YUV (scaled) output.
++ */
++ia_err ia_p2p_calculate_isl_fragments(
++    ia_p2p_handle ia_p2p,
++    unsigned int fragment_count,
++    ia_p2p_fragment_desc* input_pixel_fragment_descs,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs_bayer,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs_yuv);
++
++/*!
++ *  Calculates proper fragments for post-GDC.
++ *
++ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
++ *  \param [in]   fragment_count                             The number of fragments.
++ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
++ *  \param [out]  input_pixel_fragment_descs_display_pin     The resulting array of output fragment descriptors for display pin, one for each fragment.
++ *  \param [out]  input_pixel_fragment_descs_main_pin        The resulting array of output fragment descriptors for main pin, one for each fragment.
++ *  \param [out]  input_pixel_fragment_descs_postprocess_pin The resulting array of output fragment descriptors for post-process pin, one for each fragment.
++ */
++ia_err ia_p2p_calculate_postgdc_fragments(
++    ia_p2p_handle ia_p2p,
++    unsigned int fragment_count,
++    ia_p2p_fragment_desc* input_pixel_fragment_descs,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs_display_pin,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs_main_pin,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs_postprocess_pin);
++
++/*!
++ *  Calculates proper fragments for pre-GDC.
++ *
++ *  \param [in]   ia_p2p                                     IA_P2P instance handle.
++ *  \param [in]   fragment_count                             The number of fragments.
++ *  \param [in]   frame_width                                Frame width
++ *  \param [in]   frame_height                               Frame height
++ *  \param [in]   input_bpe                                  Input bits per element because of DMA packing
++ *  \param [in]   output_bpe                                 Output bits per element because of DMA packing
++ *  \param [out]  input_pixel_fragment_descs                 The resulting array of fragment descriptors, one for each fragment.
++ *  \param [out]  output_pixel_fragment_descs                The resulting array of fragment descriptors, one for each fragment.
++ */
++ia_err ia_p2p_calculate_pregdc_fragments(
++    ia_p2p_handle ia_p2p,
++    unsigned int fragment_count,
++    unsigned int frame_width,
++    unsigned int frame_height,
++    unsigned int input_bpe,
++    unsigned int output_bpe,
++    ia_p2p_fragment_desc* input_pixel_fragment_descs,
++    ia_p2p_fragment_desc* output_pixel_fragment_descs);
++
++/*!
++ *  Calculates proper fragments for a program group with pipe graph.
++ *
++ *  \param [in]   ia_p2p            IA_P2P instance handle.
++ *  \param [in]   pg_id             The program group id.
++ *  \param [in]   fragment_count    The number of fragments.
++ *  \param [in]   pipe              The pipe graph.
++ *  \param [in]   fragment_reqs     The constraints to align fragments.
++ *  \param [out]  configuration     The resulting fragment configuration.
++ */
++ia_err ia_p2p_calculate_fragments_pipe(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    const ia_isp_bxt_pipe_t *pipe,
++    ia_p2p_fragment_reqs *fragment_reqs,
++    ia_p2p_fragment_configuration_t* configuration);
++
++/*!
++ *  Calculates proper fragments for a program group.
++ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
++ *
++ *  \param [in]   ia_p2p            IA_P2P instance handle.
++ *  \param [in]   pg_id             The program group id.
++ *  \param [in]   fragment_count    The number of fragments.
++ *  \param [out]  configuration     The resulting fragment configuration.
++ */
++ia_err ia_p2p_calculate_fragments(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    ia_p2p_fragment_configuration_t* configuration);
++
++/*!
++ *  Calculates proper fragments for a program group with routing bitmap.
++ *  DEPRECATED. Use ia_p2p_calculate_fragments_pipe instead.
++ *
++ *  \param [in]   ia_p2p            IA_P2P instance handle.
++ *  \param [in]   pg_id             The program group id.
++ *  \param [in]   fragment_count    The number of fragments.
++ *  \param [in]   rbm               The routing bitmap.
++ *  \param [in]   fragment_reqs     The constraints to align fragments.
++ *  \param [out]  configuration     The resulting fragment configuration.
++ */
++ia_err ia_p2p_calculate_fragments_rbm(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    const ia_css_rbm_t *rbm,
++    ia_p2p_fragment_reqs *fragment_reqs,
++    ia_p2p_fragment_configuration_t* configuration);
++
++/*!
++ *  Calculates the required number of section descriptors for each terminal type for the given kernel.
++ *
++ *  \param [in]  ia_p2p                 IA_P2P instance handle.
++ *  \param [in]  pg_id                  The program group id.
++ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose descriptor to calculate.
++ *  \param [out] kernel_requirements    The calculated requirements for each terminal for the given kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_get_kernel_terminal_requirements(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    ia_p2p_terminal_requirements_t* kernel_requirements);
++
++/*!
++ *  Calculates the total size of payload for each terminal type for the given kernel.
++ *
++ *  \param [in]  ia_p2p                 IA_P2P instance handle.
++ *  \param [in]  pg_id                  The program group id.
++ *  \param [in]  kernel_id              The program group specific identifier of the kernel whose payload sizes to calculate.
++ *  \param [in]  fragment_count         The number of fragments.
++ *  \param [in]  pixel_fragment_descs   An array of fragment descriptors, one for each fragment.
++ *  \param [out] kernel_payload_desc    The calculated total payload size for each terminal for the given kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_get_kernel_payload_desc(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_p2p_payload_desc* kernel_payload_desc);
++
++/*!
++ * Interface for IPU7 PAC. Caller needs more information about the sections.
++ * IPU7 PAC still borrows some services from P2P.
++ *
++ * Interface is the same as for ia_p2p_get_kernel_payload_desc but
++ * \ param[out] s_info                  Section information
++ */
++ia_err ia_pac_get_kernel_payload_desc(
++        ia_p2p_handle ia_p2p,
++        uint32_t pg_id,
++        uint32_t kernel_id,
++        unsigned int fragment_count,
++        const ia_p2p_fragment_desc* pixel_fragment_descs,
++        ia_p2p_payload_desc* kernel_payload_desc,
++        struct ia_aic_section_info *s_info);
++
++
++/*!
++ *  Encodes data for a single kernel in a parameter terminal.
++ *
++ *  \param [in]     ia_p2p              IA_P2P instance handle.
++ *  \param [in]     pg_id               The program group id.
++ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
++ *  \param [in,out] terminal            The parameter terminal.
++ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
++ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_param_in_terminal_encode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    ia_css_param_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    unsigned int payload_base_offset);
++
++/*!
++ *  Initializes the program terminal sequencer with fragment information.
++ *
++ *  \param [in]     ia_p2p                  IA_P2P instance handle.
++ *  \param [in]     pg_id                   The program group id.
++ *  \param [in]     fragment_count          The number of fragments.
++ *  \param [in]     pixel_fragment_descs    An array of fragment descriptors, one for each fragment.
++ *  \param [in,out] terminal                The program terminal.
++ */
++ia_err ia_p2p_program_terminal_init(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_program_terminal_t* terminal);
++
++/*!
++ *  Initializes the program terminal sequencer with fragment information.
++ *
++ *  \param [in]     ia_p2p                  IA_P2P instance handle.
++ *  \param [in]     pg_id                   The program group id.
++ *  \param [in]     configuration           Fragment configuration calculated with ia_p2p_calculate_fragments().
++ *  \param [in,out] terminal                The program terminal.
++ */
++ia_err ia_p2p_program_terminal_init_v2(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    const ia_p2p_fragment_configuration_t* configuration,
++    ia_css_program_terminal_t* terminal);
++
++/*!
++ *  Encodes data for a single kernel in a program terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
++ *  \param [in,out] terminal                        The program terminal.
++ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
++ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
++ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_program_terminal_encode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_program_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned int total_section_count,
++    unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    unsigned int payload_base_offset);
++
++/*!
++ *  Encodes data for a single kernel in a spatial param input terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
++ *  \param [in,out] terminal                        The spatial param input terminal.
++ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in,out] payload_buffer                  A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
++ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_in_terminal_encode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_spatial_param_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    unsigned int payload_base_offset);
++
++/*!
++ *  Encodes data for a single kernel in a spatial param output terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to encode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in]     pixel_fragment_descs            An array of fragment descriptors, one for each fragment.
++ *  \param [in,out] terminal                        The spatial param output terminal.
++ *  \param [in]     section_index                   The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
++ *  \param [in]     payload_base_offset             The base offset in the payload buffer for this kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_out_terminal_prepare(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_spatial_param_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned int payload_buffer_size,
++    unsigned int payload_base_offset);
++
++/*!
++ *  Decodes spatial parameter data for a single kernel from a spatial param output terminal.
++ *
++ *  \param [in]     ia_p2p              IA_P2P instance handle.
++ *  \param [in]     pg_id               The program group id.
++ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
++ *  \param [in]     terminal            The spatial param output terminal.
++ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
++ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
++ *  \param [in,out] cache_buffer        A pointer to the cache buffer for storing the cached outputs.
++ *                                      The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_out_terminal_decode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    ia_css_spatial_param_terminal_t* terminal,
++    unsigned int section_index,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    void* cache_buffer);
++
++/*!
++*  Decodes spatial parameter data for a single kernel from a spatial param output terminal with fragment information.
++*
++*  \param [in]     ia_p2p               IA_P2P instance handle.
++*  \param [in]     pg_id                The program group id.
++*  \param [in]     kernel_id            The program group specific identifier of the kernel to decode.
++*  \param [in]     fragments_count      To apply offsets to subsequent fragments.
++*  \param [in]     pixel_fragment_descs Pixel fragment descriptors that were used when encoding current frame.
++*  \param [in]     terminal             The spatial param output terminal.
++*  \param [in]     section_index        The index of the first section where the data for this kernel is available in the terminal.
++*  \param [in]     payload_buffer       A pointer to the beginning of the payload buffer.
++*  \param [in]     payload_buffer_size  The total size of the given payload buffer, in bytes.
++*  \param [in,out] cache_buffer         A pointer to the cache buffer for storing the cached outputs.
++*                                       The buffer is allocated and managed by the user (query the required size with ia_p2p_get_cache_buffer_size()).
++*
++*
++*  \return ia_err_none, if no errors.
++*          ia_err_argument, if the arguments are invalid.
++*/
++ia_err ia_p2p_spatial_param_out_terminal_decode_v2(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragments_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_spatial_param_terminal_t* terminal,
++    unsigned int section_index,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    void* cache_buffer);
++
++/*!
++ *  Prepares payload for a single kernel in a parameter output terminal.
++ *
++ *  \param [in]     ia_p2p              IA_P2P instance handle.
++ *  \param [in]     pg_id               The program group id.
++ *  \param [in]     kernel_id           The program group specific identifier of the kernel whose descriptors to prepare.
++ *  \param [in]     fragment_count      The number of fragments.
++ *  \param [in,out] terminal            The param output terminal.
++ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
++ *  \param [in]     payload_buffer_size The total size of the payload buffer, in bytes.
++ *  \param [in]     payload_base_offset The base offset in the payload buffer for this kernel.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_param_out_terminal_prepare(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    ia_css_param_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned int total_section_count,
++    unsigned int payload_buffer_size,
++    unsigned int payload_base_offset);
++
++/*!
++ *  Decodes param out data for a single kernel in a parameter output terminal.
++ *
++ *  \param [in]     ia_p2p              IA_P2P instance handle.
++ *  \param [in]     pg_id               The program group id.
++ *  \param [in]     kernel_id           The program group specific identifier of the kernel to decode.
++ *  \param [in]     fragment_count      The number of fragments.
++ *  \param [in]     terminal            The param output terminal.
++ *  \param [in]     section_index       The index of the first section where the data for this kernel is written to the terminal.
++ *  \param [in]     total_section_count The total number of sections for one fragment including all kernels.
++ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
++ *  \param [in]     payload_buffer      A pointer to the beginning of the payload buffer.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_param_out_terminal_decode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    const ia_css_param_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned int total_section_count,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size);
++
++/*!
++ *  Returns the size of kernel user parameters for all the kernels in the given Program Group.
++ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
++ *  instead of firmware.
++ *
++ *  \param [in]  ia_p2p                 IA_P2P instance handle.
++ *  \param [in]  pg_id                  The program group id.
++ *  \param [in]  fragment_count         The number of fragments.
++ *  \param [out] user_parameter_size    Size of the kernel user parameters in the given PG.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_get_kernel_user_parameter_size(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    unsigned int* user_parameter_size);
++
++/*!
++ *  Returns the size of kernel user parameters descriptor and payload size separately for the
++ *  parambin generation purpose.
++ *
++ *  \param [in]  ia_p2p                 IA_P2P instance handle.
++ *  \param [in]  pg_id                  The program group id.
++ *  \param [in]  fragment_count         The number of fragments.
++ *  \param [out] kup_desc_size          Size of the kernel user parameter descriptor for a given PG
++ *  \param [out] kup_payload_size       Size of the kernel user parameter payload for a given PG.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_get_kup_desc_and_payload_size(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    unsigned int* kup_desc_size,
++    unsigned int* kup_payload_size);
++
++/*!
++ *  Initializes the Program Group with kernel specific user parameters.
++ *  This is used in VP-less environment where some of the parameter calculation is done in P2P
++ *  instead of firmware.
++ *
++ *  \param [in]     ia_p2p                   IA_P2P instance handle.
++ *  \param [in]     pg_id                    The program group id.
++ *  \param [in]     fragment_count           The number of fragments.
++ *  \param [in]     pixel_fragment_descs     An array of fragment descriptors, one for each fragment.
++ *  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
++ */
++ia_err ia_p2p_get_kernel_user_parameters(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_desc* pixel_fragment_descs,
++    unsigned char* user_parameters);
++
++/*!
++*  Initializes the Program Group with kernel specific user parameters.
++*  This is used in VP-less environment where some of the parameter calculation is done in P2P
++*  instead of firmware.
++*
++*  \param [in]     ia_p2p                   IA_P2P instance handle.
++*  \param [in]     pg_id                    The program group id.
++*  \param [in]     fragment_count           The number of fragments.
++*  \param [in]     frag_configuration       Fragment configuration calculated with ia_p2p_calculate_fragments().
++*  \param [in,out] user_parameters          A pointer to the beginning of user parameters.
++*/
++ia_err ia_p2p_get_kernel_user_parameters_v2(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    unsigned int fragment_count,
++    const ia_p2p_fragment_configuration_t* frag_configuration,
++    unsigned char* user_parameters);
++
++/*!
++ * \brief Get version.
++ * Get version from version header.
++ *
++ * \return                                  Version string.
++ */
++const char* ia_p2p_get_version(void);
++
++/*!
++*  Decodes kernel user parameters for all kernels in the program group.
++*  The result is printout of each parameter.
++*
++*  \param [in]     ia_p2p                   IA_P2P instance handle.
++*  \param [in]     pg_id                    The program group id.
++*  \param [in]     kup_descriptor           The kernel user parameter payload layout information.
++*  \param [in]     payload_buffer           Kernel user parameter binary.
++*/
++ia_err ia_p2p_decode_kup(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    const unsigned char* kup_descriptor,
++    const unsigned char* payload_buffer);
++
++
++#ifdef IA_P2P_ENABLE_DEBUG_SUPPORT
++/*!
++ *  Decodes data for a single kernel in a parameter terminal.
++ *
++ *  \param [in]     ia_p2p              IA_P2P instance handle.
++ *  \param [in]     pg_id               The program group id.
++ *  \param [in]     kernel_id           The program group specific identifier of the kernel to encode.
++ *  \param [in,out] terminal            The parameter terminal.
++ *  \param [in]     section_index       The index of the first section where the data for this kernel is available in the terminal.
++ *  \param [in,out] payload_buffer      A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size The total size of the given payload buffer, in bytes.
++ *  \param [out]    public_data_out     A structure for the public data output.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_param_in_terminal_decode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    const ia_css_param_terminal_t* terminal,
++    unsigned int section_index,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    ia_p2p_public_data_t* public_data_out);
++
++/*!
++ *  Encodes data for a single kernel in a program terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in,out] terminal                        The program terminal.
++ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
++ *  \param [in]     total_section_count             The total number of sections for one fragment including all kernels.
++ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
++ *  \param [out]    public_data_out                 A structure for the decoded output.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_program_terminal_decode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    ia_css_program_terminal_t* terminal,
++    unsigned int section_index,
++    unsigned int total_section_count,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    ia_p2p_public_data_t* public_data_out);
++
++/*!
++ *  Decodes fragment grid descriptors for a single kernel from a spatial param input terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in]     terminal                        The spatial param input terminal.
++ *  \param [in]     public_data_out                 A structure for the decoded output.
++ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_in_terminal_decode_grid_descriptors(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    ia_css_spatial_param_terminal_t* terminal,
++    ia_p2p_public_data_t* public_data_out,
++    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
++
++/*!
++ *  Decodes spatial parameter data for a single kernel from a spatial param input terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
++ *  \param [in]     terminal                        The spatial param input terminal.
++ *  \param [in]     section_index                   The index of the first section where the data for this kernel is available in the terminal.
++ *  \param [in]     payload_buffer                  A pointer to the beginning of the payload buffer.
++ *  \param [in]     payload_buffer_size             The total size of the given payload buffer, in bytes.
++ *  \param [in,out] public_data_out                 A structure for the decoded output.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_in_terminal_decode(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    ia_css_spatial_param_terminal_t* terminal,
++    unsigned int section_index,
++    const unsigned char* payload_buffer,
++    unsigned int payload_buffer_size,
++    ia_p2p_public_data_t* public_data_out);
++
++/*!
++ *  Decodes fragment grid descriptors for a single kernel from a spatial param output terminal.
++ *
++ *  \param [in]     ia_p2p                          IA_P2P instance handle.
++ *  \param [in]     pg_id                           The program group id.
++ *  \param [in]     kernel_id                       The program group specific identifier of the kernel to decode.
++ *  \param [in]     fragment_count                  The number of fragments.
++ *  \param [in]     terminal                        The spatial param output terminal.
++ *  \param [in]     public_data_out                 A structure for the decoded output.
++ *  \param [out]    sequencer_fragment_descs        The resulting array of fragment grid descriptors.
++ *
++ *  \return ia_err_none, if no errors.
++ *          ia_err_argument, if the arguments are invalid.
++ */
++ia_err ia_p2p_spatial_param_out_terminal_decode_grid_descriptors(
++    ia_p2p_handle ia_p2p,
++    uint32_t pg_id,
++    uint32_t kernel_id,
++    unsigned int fragment_count,
++    ia_css_spatial_param_terminal_t* terminal,
++    ia_p2p_public_data_t* public_data_out,
++    ia_css_fragment_grid_desc_t* sequencer_fragment_descs);
++
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_P2P_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
+new file mode 100644
+index 000000000000..5bb2db556956
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
+@@ -0,0 +1,221 @@
++/*
++ * Copyright 2015-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*!
++ * \file ia_p2p_types.h
++ * \brief Declares public2private interface data types.
++ */
++
++#ifndef IA_P2P_TYPES_H_
++#define IA_P2P_TYPES_H_
++
++#include <stdint.h>
++
++#include "ia_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*!
++ * Max section count for each kernel
++ */
++#define MAX_NUM_SECTIONS_PER_KERNEL 20
++
++/*!
++ * Max number of Algo kernels associated with a HW device
++ */
++#define MAX_NUM_ASSOCIATED_PALS_PER_DEVICE 5
++
++/*!
++ *  P2P instance handle type.
++ */
++typedef struct ia_p2p_t* ia_p2p_handle;
++
++/*!
++ *  Platform identifier.
++ */
++typedef enum
++{
++    IA_P2P_PLATFORM_BXT_A0,
++    IA_P2P_PLATFORM_BXT_B0,
++    IA_P2P_PLATFORM_CNL_A0,
++    IA_P2P_PLATFORM_CNL_B0,
++    IA_P2P_PLATFORM_GLV_A0,
++    IA_P2P_PLATFORM_IPU6,
++} ia_p2p_platform_t;
++
++#define IA_P2P_MAX_FRAGMENTS       10
++#define IA_P2P_MAX_KERNELS_PER_PG  128
++
++/*!
++ *  Fragment descriptor.
++ */
++typedef struct
++{
++    uint16_t fragment_width;    /*!< The width of the fragment. */
++    uint16_t fragment_height;   /*!< The height of the fragment. */
++    uint16_t fragment_start_x;  /*!< The x offset from the top-left corner of the full image. */
++    uint16_t fragment_start_y;  /*!< The y offset from the top-left corner of the full image. */
++} ia_p2p_fragment_desc;
++
++/*!
++ *  Fragment requirements.
++ */
++typedef struct
++{
++    uint8_t input_bpe;    /*!< The input bits per element. */
++    uint8_t output_bpe;   /*!< The output bits per element. */
++} ia_p2p_fragment_reqs;
++
++/*!
++ *  Full fragmentation configuration for a program group.
++ */
++typedef struct
++{
++    unsigned int fragment_count;
++    ia_p2p_fragment_desc pixel_fragment_descs[IA_P2P_MAX_KERNELS_PER_PG][IA_P2P_MAX_FRAGMENTS];
++} ia_p2p_fragment_configuration_t;
++
++/*!
++ *  Structure for terminal requirements, specifying the number of sections required for each terminal type.
++ */
++typedef struct
++{
++    unsigned int param_in_section_count;                        /*!< The number of parameter input sections required. */
++    unsigned int param_out_section_count_per_fragment;          /*!< The number of parameter output sections required per fragment. */
++    unsigned int program_section_count_per_fragment;            /*!< The number of program sections required per fragment. */
++    unsigned int spatial_param_in_section_count;                /*!< The number of spatial param input sections required. */
++    unsigned int spatial_param_out_section_count;               /*!< The number of spatial param output sections required. */
++} ia_p2p_terminal_requirements_t;
++
++/*!
++ *  Payload descriptor specifying the total size of payload required for each terminal type.
++ */
++typedef struct
++{
++    uint32_t param_in_payload_size;             /*!< The total size of the parameter input payload in bytes. */
++    uint32_t param_out_payload_size;            /*!< The total size of the parameter output payload in bytes. */
++    uint32_t program_payload_size;              /*!< The total size of the program payload in bytes. */
++    uint32_t spatial_param_in_payload_size;     /*!< The total size of the spatial param input payload in bytes. */
++    uint32_t spatial_param_out_payload_size;    /*!< The total size of the spatial param output payload in bytes. */
++} ia_p2p_payload_desc;
++
++/*!
++ *  Payload descriptor specifying the count and size of payload required for each terminal type.
++ */
++typedef struct
++{
++    uint32_t param_in_section_count;                              /*!< The count of parameter input sections. */
++    uint32_t param_out_section_count;                             /*!< The count of parameter output sections (per fragment). */
++    uint32_t program_section_count;                               /*!< The count of program sections (per fragment). */
++    uint32_t param_in_section_size[MAX_NUM_SECTIONS_PER_KERNEL];  /*!< The size of the parameter input section in bytes. */
++    uint32_t param_out_section_size[MAX_NUM_SECTIONS_PER_KERNEL]; /*!< The size of the parameter output section in bytes. */
++    uint32_t program_section_size[MAX_NUM_SECTIONS_PER_KERNEL];   /*!< The size of the program section in bytes. */
++} ia_p2p_payload_section_desc;
++/*!
++ *  Flags for available serialized statistics.
++ */
++typedef struct
++{
++    bool rgbs_grid;          /*!< If true, RGBS grid is available. */
++    bool af_grid;            /*!< If true, AF grid is available. */
++    bool histograms;         /*!< If true, histograms are available. */
++    bool dvs_stats;          /*!< If true, DVS statistics are available. */
++    bool paf_grid;           /*!< If true, PAF grid is available. */
++    bool rgbs_grids_hdr;     /*!< If true, RGBS HDR grids are available. */
++    bool rgby_grids_hdr;     /*!< If true, RGBY stat for high precision histogram is available. */
++    bool yv_grids_hdr;       /*!< If true, YV HDR grids are available. */
++} ia_p2p_statistics_included_t;
++
++/* Currently supported program groups. */
++#define IA_P2P_PG_ISYS                       0       /* No manifest available so we define a custom PG specification id for ISYS. */
++#define IA_P2P_PG_VPOSTGDC                   114     /* IA_CSS_BXT_PSS_PG_SPECIFICATION_VPOSTGDC */
++#define IA_P2P_PG_VPREGDC                    116     /* Deprecated */
++#define IA_P2P_PG_SPREGDC                    117     /* Deprecated */
++#define IA_P2P_PG_SPOSTGDC                   118
++#define IA_P2P_PG_ISL                        120     /* Deprecated */
++#define IA_P2P_PG_VHDR_PREPROC               121     /* Deprecated */
++#define IA_P2P_PG_VPREGDC_HQ                 122
++#define IA_P2P_PG_VPREGDC_HQ_VCR2            148
++#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ_VCR2   156
++#define IA_P2P_PG_SPREGDC_XNR                125     /* Deprecated */
++#define IA_P2P_PG_SPREGDC_XNR_V2             131
++#define IA_P2P_PG_SPREGDC_XNR_V3             136
++#define IA_P2P_PG_SPOSTGDC_IN8               152
++#define IA_P2P_PG_SPOSTGDC_V4                161     /* For SV usage only */
++#define IA_P2P_PG_SPOSTGDC_IN8_V4            162
++#define IA_P2P_PG_SPREGDC_XNR_V2_VCR2        149
++#define IA_P2P_PG_SPREGDC_XNR_V3_VCR2        150
++#define IA_P2P_PG_ISL_PS_HIRES               127
++#define IA_P2P_PG_ISL_PS_INPUT_CROP          127
++#define IA_P2P_PG_ISL_PS_RGBIR               130
++#define IA_P2P_PG_ISL_RGBIR_VPREGDC_HQ_VCR2  158
++#define IA_P2P_PG_SPOSTGDC_V2                128
++#define IA_P2P_PG_SPOSTGDC_V2_MBR            173
++#define IA_P2P_PG_VPOSTGDC_V2                129
++#define IA_P2P_PG_VPOSTGDC_V2_MBR            172
++#define IA_P2P_PG_VPOSTGDC_MBR               132
++#define IA_P2P_PG_SPOSTGDC_MBR               133
++#define IA_P2P_PG_IPU5_SPOSTGDC_10BIT        197
++#define IA_P2P_PG_POWERON                    201     /* Deprecated */
++#define IA_P2P_PG_VIDEO_ISL_PREGDC_HQ        137
++#define IA_P2P_PG_ISL_PS_GLV                 138
++#define IA_P2P_PG_ISL_PS_GLV_V2              155
++#define IA_P2P_PG_DFM_ISL_PS_GLV_VPLESS      166     /* To be removed, leaved here to simplify integration (referenced by libiacss) */
++#define IA_P2P_PG_ISL_PS_GLV_VPLESS          166
++#define IA_P2P_PG_ISA_LB_GLV_VPLESS          194
++#define IA_P2P_PG_IPU5_VPREGDC_VPLESS        167
++#define IA_P2P_PG_IPU5_SPREGDC_VPLESS        168
++#define IA_P2P_PG_IPU5_VPOSTGDC_V1           151
++#define IA_P2P_PG_IPU5_VPOSTGDC_V4           169
++#define IA_P2P_PG_IPU5_VPOSTGDC_V4_HDR10     193 /* TODO: Remove after merge. Here just to avoid two-way dependency to libiacss */
++#define IA_P2P_PG_IPU5_VPOSTGDC_V4_10BIT     193
++#define IA_P2P_PG_IPU6_LB_PSA_BYPASS         182
++#define IA_P2P_PG_IPU6_LB_PSA                183
++#define IA_P2P_PG_IPU6_ISL_RBM               185
++#define IA_P2P_PG_IPU6_ISA_LB                187
++#define IA_P2P_PG_IPU6_BB_OFS                188
++#define IA_P2P_PG_IPU6_BB                    189
++#define IA_P2P_PG_IPU6_BB_OFS_GDC            196
++#define IA_P2P_PG_IPU6S_ISA                  198
++#define IA_P2P_PG_VPREGDC_HQ_NS              1000    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS */
++#define IA_P2P_PG_VPOSTGDC_HQ_NS             1001    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS */
++#define IA_P2P_PG_VPREGDC_HP                 1002    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP */
++#define IA_P2P_PG_VPOSTGDC_HP                1003    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HP */
++#define IA_P2P_PG_VPREGDC_LL                 1004    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_LL */
++#define IA_P2P_PG_VHDR_PREPROC_V2            1005    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREPROC_V2 */
++#define IA_P2P_PG_VPREGDC_HQ_NS_DVS          1007    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HQ_NS_DVS */
++#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS2        1008    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS2 */
++#define IA_P2P_PG_VPOSTGDC_HQ_NS_DVS3        1009    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_NS_DVS3 */
++#define IA_P2P_PG_VPREGDC_HP_2FR             1010    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_2FR */
++#define IA_P2P_PG_VPOSTGDC_HQ_4K             1011    /* IA_CSS_PROGRAM_GROUP_ID_VPOSTGDC_HQ_4K */
++#define IA_P2P_PG_VPREGDC_ISL_HQ_4K          1012    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_ISL_HQ_4K */
++#define IA_P2P_PG_VHDR_PREPROC_STATS_HP      1013    /* A_CSS_PROGRAM_GROUP_ID_VHDRPREPROC_STATS_HP */
++#define IA_P2P_PG_VPREGDC_HP_DRC             1014    /* IA_CSS_PROGRAM_GROUP_ID_VPREGDC_HP_DRC */
++#define IA_P2P_PG_VHDR_PREGDC_HP             1015    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP */
++#define IA_P2P_PG_VHDR_PREGDC_HP_DRC2        1016    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_DRC2 */
++#define IA_P2P_PG_VHDR_PREGDC_HP_2FR_V2      1017    /* IA_CSS_PROGRAM_GROUP_ID_VHDR_PREGDC_HP_2FR_V2 */
++#define IA_P2P_PG_YUYV_SCALE                 1051    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_SCALE */
++#define IA_P2P_PG_YUV_CSC                    1052    /* IA_CSS_PROGRAM_GROUP_ID_YUV_CSC */
++#define IA_P2P_PG_YUYV_LDC                   1053    /* IA_CSS_PROGRAM_GROUP_ID_YUYV_LDC */
++#define IA_P2P_PG_TEST                       1       /* For internal P2P testing. */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_P2P_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h
+new file mode 100644
+index 000000000000..be276c25a641
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h
+@@ -0,0 +1,80 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2016-2018 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intel's
++* suppliers or licensors in any way.
++*/
++#pragma once
++#include "ia_aiq_types.h"
++#include "ia_ltm_types.h"
++#include "ia_dvs_types.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_cmc_types.h"
++#include "ia_view_types.h"
++#include "ia_bcomp_types.h"
++
++/*!
++ *\brief Enumeration for direct results UUIDs.
++ * UUIDs are used when fetching direct results from InputData class.
++ */
++typedef enum
++{
++    ia_pal_direct_results_uuid_start,
++    ia_pal_direct_results_uuid_aiq_sa_results = ia_pal_direct_results_uuid_start,
++    ia_pal_direct_results_uuid_aiq_hist_weight_grid,
++    ia_pal_direct_results_uuid_ltm_drc_params,
++    ia_pal_direct_results_uuid_dvs_morph_table,
++    ia_pal_direct_results_uuid_ltm_results,
++    ia_pal_direct_results_uuid_cmc_phase_difference,
++    ia_pal_direct_results_uuid_cmc_general_data,
++    ia_pal_direct_results_uuid_dvs_image_transformation,
++    ia_pal_direct_results_uuid_cmc_parsed_geometric_distortion2,
++    ia_pal_direct_results_uuid_cmc_lateral_chromatic_aberration_correction,
++    ia_pal_direct_results_uuid_cmc_optomechanics,
++    ia_pal_direct_results_uuid_view_params,
++    ia_pal_direct_results_uuid_bcomp_results,
++    ia_pal_direct_results_uuid_count, /* Keep this last */
++} ia_pal_direct_results_uuid;
++
++/*!
++ * \brief Direct results coming from algorithms without conversion to algo API structures.
++ * In case GAIC is not used, for improved PnP, it's not needed to copy large buffers from algorithm results to
++ * algo API structures. Define a structure, where algorithm results can be passed directly to PAL.
++ * ia_pal_direct_results structure must contain only pointers to other structures (no copied structures)!
++ */
++typedef struct
++{
++    ia_aiq_sa_results_v1 const *direct_ia_aiq_sa_results_v1;
++    ia_aiq_hist_weight_grid const *direct_ia_aiq_hist_weight_grid;
++    ia_ltm_drc_params const *direct_ia_ltm_drc_params;
++    ia_dvs_morph_table const *direct_ia_dvs_morph_table;
++    ia_ltm_results const *direct_ia_ltm_results;
++    cmc_phase_difference_t const *direct_cmc_phase_difference_t;
++    cmc_general_data_t const *direct_cmc_general_data_t;
++    ia_dvs_image_transformation const *direct_ia_dvs_image_transformation;
++    cmc_parsed_geometric_distortion2_t const *direct_cmc_parsed_geometric_distortion2_t;
++    cmc_lateral_chromatic_aberration_correction const *direct_cmc_lateral_chromatic_aberration_correction;
++    cmc_optomechanics_t const *direct_cmc_optomechanics_t;
++    ia_view_t const *direct_ia_view_t;
++    ia_bcomp_results const *direct_ia_bcomp_results;
++} ia_pal_direct_results;
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
+new file mode 100644
+index 000000000000..99492333cf65
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
+@@ -0,0 +1,38 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2014-2016 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intel's
++* suppliers or licensors in any way.
++*/
++
++#pragma once
++
++#if defined _WIN32 && defined BUILD_SHARED_LIBS
++#if defined BROXTON_IA_PAL_EXPORTS || defined broxton_ia_pal_EXPORTS
++#define IA_PAL_API __declspec(dllexport)
++#else
++#define IA_PAL_API __declspec(dllimport)
++#endif
++#else
++#define IA_PAL_API
++#endif
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_output_data.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_output_data.h
+new file mode 100644
+index 000000000000..5b067056e45e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_output_data.h
+@@ -0,0 +1,45 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2017-2018 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code ("Material") are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intel's
++* suppliers or licensors in any way.
++*/
++
++#pragma once
++#include <map>
++#include "ia_pal_types_isp_ids_autogen.h"
++#include "ia_isp_bxt_types.h"
++#include "ia_types.h"
++
++class PalOutputData
++{
++public:
++    PalOutputData(const ia_isp_bxt_program_group *pg);
++    ~PalOutputData();
++    ia_err setPublicOutput(ia_binary_data *output);
++    ia_err getKernelPublicOutput(ia_pal_uuid id, void *&result) const;
++
++private:
++    ia_binary_data m_public_output;
++    std::map<ia_pal_uuid, unsigned int> m_public_output_offsets;
++};
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
+new file mode 100644
+index 000000000000..ba5e31958019
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
+@@ -0,0 +1,54 @@
++/*
++* INTEL CONFIDENTIAL
++* Copyright (c) 2016-2018 Intel Corporation
++* All Rights Reserved.
++*
++* The source code contained or described herein and all documents related to
++* the source code (Material) are owned by Intel Corporation or its
++* suppliers or licensors. Title to the Material remains with Intel
++* Corporation or its suppliers and licensors. The Material may contain trade
++* secrets and proprietary and confidential information of Intel Corporation
++* and its suppliers and licensors, and is protected by worldwide copyright
++* and trade secret laws and treaty provisions. No part of the Material may be
++* used, copied, reproduced, modified, published, uploaded, posted,
++* transmitted, distributed, or disclosed in any way without Intel's prior
++* express written permission.
++*
++* No license under any patent, copyright, trade secret or other intellectual
++* property right is granted to or conferred upon you by disclosure or
++* delivery of the Materials, either expressly, by implication, inducement,
++* estoppel or otherwise. Any license under such intellectual property rights
++* must be express and approved by Intel in writing.
++*
++* Unless otherwise agreed by Intel in writing, you may not remove or alter
++* this notice or any other notice embedded in Materials by Intel or Intel's
++* suppliers or licensors in any way.
++*/
++
++#ifndef IA_PAL_TYPES_ISP_H_
++#define IA_PAL_TYPES_ISP_H_
++
++#ifdef __cplusplus
++extern "C"{
++#endif
++
++/*!
++ * \brief Common header for all PAL output data structures.
++ */
++typedef struct
++{
++    int uuid;                   /*!< UUID of PAL output. Indicates, which ISP block configuration this record contains. */
++    int size;                   /*!< Size of PAL output for a particular kernel. */
++    bool update;                /*!< Flag indicating if PAL calculations updated results. */
++    char enable;                /*!< Three-state kernel enable (passthrough, enable, disable) */
++    unsigned int run_time_diff; /*!< Time difference since these PAL results were previously calculated. */
++    unsigned short width;       /*!< Input width of frame for this ISP block. */
++    unsigned short height;      /*!< Input height of frame for this ISP block. */
++} ia_pal_record_header;
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* IA_PAL_TYPES_ISP_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
+new file mode 100644
+index 000000000000..2ceb0c25736b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
+@@ -0,0 +1,379 @@
++

++/*

++* INTEL CONFIDENTIAL

++* Copyright (c) 2020 Intel Corporation

++* All Rights Reserved.

++*

++* The source code contained or described herein and all documents related to

++* the source code (Material) are owned by Intel Corporation or its

++* suppliers or licensors. Title to the Material remains with Intel

++* Corporation or its suppliers and licensors. The Material may contain trade

++* secrets and proprietary and confidential information of Intel Corporation

++* and its suppliers and licensors, and is protected by worldwide copyright

++* and trade secret laws and treaty provisions. No part of the Material may be

++* used, copied, reproduced, modified, published, uploaded, posted,

++* transmitted, distributed, or disclosed in any way without Intel's prior

++* express written permission.

++*

++* No license under any patent, copyright, trade secret or other intellectual

++* property right is granted to or conferred upon you by disclosure or

++* delivery of the Materials, either expressly, by implication, inducement,

++* estoppel or otherwise. Any license under such intellectual property rights

++* must be express and approved by Intel in writing.

++*

++* Unless otherwise agreed by Intel in writing, you may not remove or alter

++* this notice or any other notice embedded in Materials by Intel or Intel's

++* suppliers or licensors in any way.

++*/

++#pragma once

++#include <stdint.h>

++#include <memory.h>

++

++#ifdef __cplusplus

++extern "C"{

++#endif

++

++typedef enum

++{

++    ia_pal_uuid_isp_acm_1_1 = 13026,

++    ia_pal_uuid_isp_aestatistics_2_0 = 26055,

++    ia_pal_uuid_isp_aestatistics_2_1 = 55073,

++    ia_pal_uuid_isp_af_awb_frstatistics_2_0 = 13395,

++    ia_pal_uuid_isp_awbstatistics_2_0 = 33260,

++    ia_pal_uuid_isp_b2i_bnr_1_0 = 8682,

++    ia_pal_uuid_isp_b2i_dm_1_0 = 64138,

++    ia_pal_uuid_isp_b2i_ds_1_0_0 = 10497,

++    ia_pal_uuid_isp_b2i_ds_1_0_1 = 20739,

++    ia_pal_uuid_isp_b2i_sie_1_0 = 58817,

++    ia_pal_uuid_isp_b2i_sie_1_1 = 42944,

++    ia_pal_uuid_isp_bnlm_3_0 = 41108,

++    ia_pal_uuid_isp_bnlm_3_1 = 2748,

++    ia_pal_uuid_isp_bnlm_3_2 = 48964,

++    ia_pal_uuid_isp_bnlm_3_3 = 21777,

++    ia_pal_uuid_isp_burst_isp = 11827,

++    ia_pal_uuid_isp_bxt_3a_ccm = 15593,

++    ia_pal_uuid_isp_bxt_acm = 13506,

++    ia_pal_uuid_isp_bxt_aestatistics = 21985,

++    ia_pal_uuid_isp_bxt_af_awb_fr_statistics = 21650,

++    ia_pal_uuid_isp_bxt_applycorrection = 45482,

++    ia_pal_uuid_isp_bxt_awbstatistics = 10104,

++    ia_pal_uuid_isp_bxt_blc = 11700,

++    ia_pal_uuid_isp_bxt_blc_b = 26932,

++    ia_pal_uuid_isp_bxt_blc_c = 18168,

++    ia_pal_uuid_isp_bxt_bnlm = 54605,

++    ia_pal_uuid_isp_bxt_ccm = 16559,

++    ia_pal_uuid_isp_bxt_convert16sto8u = 48932,

++    ia_pal_uuid_isp_bxt_cropstills = 34611,

++    ia_pal_uuid_isp_bxt_cropvideo = 42997,

++    ia_pal_uuid_isp_bxt_csc = 31704,

++    ia_pal_uuid_isp_bxt_csc_yuv2rgb = 1391,

++    ia_pal_uuid_isp_bxt_csc2 = 39659,

++    ia_pal_uuid_isp_bxt_demosaic = 48695,

++    ia_pal_uuid_isp_bxt_disparity = 55093,

++    ia_pal_uuid_isp_bxt_dpc = 23342,

++    ia_pal_uuid_isp_bxt_dpcm_decode = 16046,

++    ia_pal_uuid_isp_bxt_dpcm_encode = 11653,

++    ia_pal_uuid_isp_bxt_dvsstatistics = 10794,

++    ia_pal_uuid_isp_bxt_gammatm = 44304,

++    ia_pal_uuid_isp_bxt_gridbaseob = 46517,

++    ia_pal_uuid_isp_bxt_gridbaseob_b = 28979,

++    ia_pal_uuid_isp_bxt_gridbaseob_c = 18935,

++    ia_pal_uuid_isp_bxt_inputscaler = 29163,

++    ia_pal_uuid_isp_bxt_inputscalerv2 = 10913,

++    ia_pal_uuid_isp_bxt_isl_inputcrop = 42521,

++    ia_pal_uuid_isp_bxt_linearization = 33288,

++    ia_pal_uuid_isp_bxt_lsc = 53711,

++    ia_pal_uuid_isp_bxt_norm_lin = 64791,

++    ia_pal_uuid_isp_bxt_norm_lin_b = 1034,

++    ia_pal_uuid_isp_bxt_norm_lin_c = 20905,

++    ia_pal_uuid_isp_bxt_ofa_dp = 18729,

++    ia_pal_uuid_isp_bxt_ofa_mp = 5232,

++    ia_pal_uuid_isp_bxt_ofa_ppp = 19509,

++    ia_pal_uuid_isp_bxt_paddingsupport = 65094,

++    ia_pal_uuid_isp_bxt_pafstatistics = 21380,

++    ia_pal_uuid_isp_bxt_pixelformatter = 15205,

++    ia_pal_uuid_isp_bxt_pixprecadapter = 15868,

++    ia_pal_uuid_isp_bxt_pixprecadapter_postvcr = 64780,

++    ia_pal_uuid_isp_bxt_pixprecadapter_precropstills = 29575,

++    ia_pal_uuid_isp_bxt_pixprecadapter_precropvideo = 13533,

++    ia_pal_uuid_isp_bxt_pixprecadapter_precsc2 = 60774,

++    ia_pal_uuid_isp_bxt_pixprecadapter_pregdc = 12215,

++    ia_pal_uuid_isp_bxt_pixprecadapter_prevcud = 23002,

++    ia_pal_uuid_isp_bxt_pixprecadapter_prewb = 20178,

++    ia_pal_uuid_isp_bxt_rynr_collector = 28476,

++    ia_pal_uuid_isp_bxt_rynr_splitter = 61356,

++    ia_pal_uuid_isp_bxt_shift14to16bit = 49150,

++    ia_pal_uuid_isp_bxt_tnr5v1 = 43225,

++    ia_pal_uuid_isp_bxt_vcr = 21834,

++    ia_pal_uuid_isp_bxt_vcr2 = 5194,

++    ia_pal_uuid_isp_bxt_vcsc = 60680,

++    ia_pal_uuid_isp_bxt_vcsc_stills = 21171,

++    ia_pal_uuid_isp_bxt_vcsc_video = 11176,

++    ia_pal_uuid_isp_bxt_vcud = 17897,

++    ia_pal_uuid_isp_bxt_wb = 32398,

++    ia_pal_uuid_isp_bxt_wb_stills = 47444,

++    ia_pal_uuid_isp_bxt_xnr4_m = 19837,

++    ia_pal_uuid_isp_bxt_xnr4_mh = 47865,

++    ia_pal_uuid_isp_call_info = 28030,

++    ia_pal_uuid_isp_cas_1_0 = 22660,

++    ia_pal_uuid_isp_ccm_3a_2_0 = 62344,

++    ia_pal_uuid_isp_comp_spliter = 35257,

++    ia_pal_uuid_isp_compand_1_0 = 35311,

++    ia_pal_uuid_isp_crop_sis = 12166,

++    ia_pal_uuid_isp_cvt_1_0 = 32427,

++    ia_pal_uuid_isp_debug_info = 12967,

++    ia_pal_uuid_isp_decompand_1_0 = 55624,

++    ia_pal_uuid_isp_dehaze_1_0 = 58873,

++    ia_pal_uuid_isp_dma_cropper_dp = 47638,

++    ia_pal_uuid_isp_dma_cropper_mp = 27230,

++    ia_pal_uuid_isp_dma_cropper_ppp = 49162,

++    ia_pal_uuid_isp_dol_1_0 = 11842,

++    ia_pal_uuid_isp_dol_2_0 = 11890,

++    ia_pal_uuid_isp_dol_mapper = 17361,

++    ia_pal_uuid_isp_dol_parser = 44843,

++    ia_pal_uuid_isp_dpc_1_1 = 51918,

++    ia_pal_uuid_isp_dpc_1_3 = 23488,

++    ia_pal_uuid_isp_dpc_2_0 = 5679,

++    ia_pal_uuid_isp_drc_1 = 29204,

++    ia_pal_uuid_isp_drc_2 = 4091,

++    ia_pal_uuid_isp_ds_dynamic = 8249,

++    ia_pal_uuid_isp_dvsstatistics_2 = 37235,

++    ia_pal_uuid_isp_espa_1_0 = 47319,

++    ia_pal_uuid_isp_espa_1_1 = 41663,

++    ia_pal_uuid_isp_espa_isa_bayer_a = 1326,

++    ia_pal_uuid_isp_espa_isa_ir_md = 37592,

++    ia_pal_uuid_isp_espa_isa_sis_a = 59281,

++    ia_pal_uuid_isp_espa_isa_sis_b = 52347,

++    ia_pal_uuid_isp_espa_isa_wb = 63427,

++    ia_pal_uuid_isp_espa_isa_yuv_a = 33409,

++    ia_pal_uuid_isp_espa_isa_yuv_b = 58945,

++    ia_pal_uuid_isp_espa_isa_yuv_c = 45072,

++    ia_pal_uuid_isp_espa_psa_1 = 11719,

++    ia_pal_uuid_isp_espa_psa_4 = 36228,

++    ia_pal_uuid_isp_espa_psa_5 = 33315,

++    ia_pal_uuid_isp_espa_psa_c = 41410,

++    ia_pal_uuid_isp_espa_psa_d = 19387,

++    ia_pal_uuid_isp_espa_psa_e = 40191,

++    ia_pal_uuid_isp_espa_psa_f = 56948,

++    ia_pal_uuid_isp_espa_psa_g = 17153,

++    ia_pal_uuid_isp_espa_psa_h = 11266,

++    ia_pal_uuid_isp_exy = 35008,

++    ia_pal_uuid_isp_fr_grid_1_0 = 26958,

++    ia_pal_uuid_isp_gammastar_1 = 42751,

++    ia_pal_uuid_isp_gammatm_v3 = 57496,

++    ia_pal_uuid_isp_gd_dpc_2_1 = 22642,

++    ia_pal_uuid_isp_gdc3 = 14376,

++    ia_pal_uuid_isp_gdc3_1 = 15925,

++    ia_pal_uuid_isp_gdc3_1_1 = 35089,

++    ia_pal_uuid_isp_gdc4_2 = 55837,

++    ia_pal_uuid_isp_gdc5 = 41165,

++    ia_pal_uuid_isp_gdc7 = 21644,

++    ia_pal_uuid_isp_gdc_sp = 59334,

++    ia_pal_uuid_isp_glim_1_0 = 55620,

++    ia_pal_uuid_isp_glim_2_0 = 36029,

++    ia_pal_uuid_isp_gltm_1_0 = 60649,

++    ia_pal_uuid_isp_gltm_2_0 = 54721,

++    ia_pal_uuid_isp_gmv_statistics_1_0 = 54420,

++    ia_pal_uuid_isp_hdr_blc_1 = 40166,

++    ia_pal_uuid_isp_hdr_pwldecomp_1 = 41666,

++    ia_pal_uuid_isp_hdr_sqrtcomp_2 = 31478,

++    ia_pal_uuid_isp_hdr_sqrtcomp_3 = 63941,

++    ia_pal_uuid_isp_hdr_stitch_1w = 15195,

++    ia_pal_uuid_isp_hdr_wb_1 = 23040,

++    ia_pal_uuid_isp_hdrstats_1 = 23432,

++    ia_pal_uuid_isp_is_odr_a = 11470,

++    ia_pal_uuid_isp_is_odr_b = 55449,

++    ia_pal_uuid_isp_is_odr_c = 50407,

++    ia_pal_uuid_isp_gdc_fp_rifd_yuvn_regs = 36665,

++    ia_pal_uuid_isp_gdc_sp_bodr_yuv4n_regs = 14288,

++    ia_pal_uuid_isp_gdc_sp_rifd_yuv4n_regs = 35281,

++    ia_pal_uuid_isp_ifd_gmv = 49014,

++    ia_pal_uuid_isp_ifd_lsc = 27306,

++    ia_pal_uuid_isp_ifd_pdaf = 57522,

++    ia_pal_uuid_isp_ifd_pipe = 35909,

++    ia_pal_uuid_isp_lbff_crop_espa = 11929,

++    ia_pal_uuid_isp_odr_ae = 4220,

++    ia_pal_uuid_isp_odr_af_std = 12347,

++    ia_pal_uuid_isp_odr_af_sve = 38511,

++    ia_pal_uuid_isp_odr_awb_sat = 24740,

++    ia_pal_uuid_isp_odr_awb_std = 31055,

++    ia_pal_uuid_isp_odr_awb_sve = 55896,

++    ia_pal_uuid_isp_odr_burst_isp = 38589,

++    ia_pal_uuid_isp_odr_cv = 12703,

++    ia_pal_uuid_isp_odr_gmv_feature = 15342,

++    ia_pal_uuid_isp_odr_gmv_match = 55280,

++    ia_pal_uuid_isp_odr_ir = 45077,

++    ia_pal_uuid_isp_odr_output_me = 37784,

++    ia_pal_uuid_isp_odr_output_ps = 29596,

++    ia_pal_uuid_isp_odr_pdaf = 7259,

++    ia_pal_uuid_isp_ofs_dp_bodr_regs = 33527,

++    ia_pal_uuid_isp_ofs_mp_bodr_regs = 16116,

++    ia_pal_uuid_isp_ofs_pp_bodr_regs = 21210,

++    ia_pal_uuid_isp_sdp_left_ifd = 11944,

++    ia_pal_uuid_isp_sdp_right_ifd = 60082,

++    ia_pal_uuid_isp_sdp_image_out0_odr = 19554,

++    ia_pal_uuid_isp_sdp_image_pp_odr = 12771,

++    ia_pal_uuid_isp_sdp_map_odr = 29504,

++    ia_pal_uuid_isp_slim_tnr_fp_blend_bifd_yuvnm1_regs = 7438,

++    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_rs4nm1_regs = 56551,

++    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_yuv4nm1_regs = 17856,

++    ia_pal_uuid_isp_slim_tnr_spatial_bifd_yuvn_regs = 27893,

++    ia_pal_uuid_isp_tnr_fp_blend_bifd_rs4n_regs = 42998,

++    ia_pal_uuid_isp_tnr_fp_bodr_yuvn_regs = 46525,

++    ia_pal_uuid_isp_tnr_mc_fp_bifd_mv16n_regs = 57956,

++    ia_pal_uuid_isp_tnr_mc_fp_rifd_yuvnm1_regs = 52353,

++    ia_pal_uuid_isp_tnr_scale_fp_bodr_yuv4n_regs = 54952,

++    ia_pal_uuid_isp_tnr_scale_sp_bifd_y4n_regs = 31596,

++    ia_pal_uuid_isp_tnr_scale_sp_bodr_y16n_regs = 23712,

++    ia_pal_uuid_isp_tnr_sp_bc_bifd_yuv4n_regs = 19665,

++    ia_pal_uuid_isp_tnr_sp_bc_bodr_rs4n_regs = 21608,

++    ia_pal_uuid_isp_tnr_sp_bc_bifd_mv16n_regs = 28166,

++    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16n_regs = 50773,

++    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16nm1_regs = 58548,

++    ia_pal_uuid_isp_tnr_sp_mc1_rifd_y4nm1_regs = 36828,

++    ia_pal_uuid_isp_tnr_sp_mc2_bifd_mv16n_regs = 62418,

++    ia_pal_uuid_isp_tnr_sp_mc2_rifd_rs4nm1_regs = 9229,

++    ia_pal_uuid_isp_tnr_sp_mc2_rifd_yuv4nm1_regs = 44986,

++    ia_pal_uuid_isp_tnr_sp_rme_bifd_y4n_regs = 39832,

++    ia_pal_uuid_isp_tnr_sp_rme_bodr_mv16n_regs = 32045,

++    ia_pal_uuid_isp_visp_metadata_sodr_regs = 16026,

++    ia_pal_uuid_isp_visp_pixels_bodr_regs = 35866,

++    ia_pal_uuid_isp_irs_1_0 = 16993,

++    ia_pal_uuid_isp_lca_1_0 = 25352,

++    ia_pal_uuid_isp_ldr_blc_1 = 12439,

++    ia_pal_uuid_isp_ldr_wb_1 = 8496,

++    ia_pal_uuid_isp_linearization2_0 = 10326,

++    ia_pal_uuid_isp_linearization2_0_b = 42416,

++    ia_pal_uuid_isp_linearization2_0_c = 28552,

++    ia_pal_uuid_isp_linearization2hdr = 19752,

++    ia_pal_uuid_isp_linearizationdg_dss = 38566,

++    ia_pal_uuid_isp_linearizationwb_dss = 41930,

++    ia_pal_uuid_isp_lossycomp_1_0 = 62606,

++    ia_pal_uuid_isp_lossydecomp_1_0 = 41948,

++    ia_pal_uuid_isp_lsc_1_1 = 16882,

++    ia_pal_uuid_isp_lsc_1_2 = 2144,

++    ia_pal_uuid_isp_ltm_cd_1_0 = 53308,

++    ia_pal_uuid_isp_ltm_de_gamma_1_0 = 43310,

++    ia_pal_uuid_isp_ltm_fd_1_0 = 6516,

++    ia_pal_uuid_isp_ltm_vrt_ctrl = 64517,

++    ia_pal_uuid_isp_mas = 53441,

++    ia_pal_uuid_isp_mrc_1_0 = 57534,

++    ia_pal_uuid_isp_norm_lin_dss = 48425,

++    ia_pal_uuid_isp_nrf_6_00 = 24924,

++    ia_pal_uuid_isp_nv12reader = 27990,

++    ia_pal_uuid_isp_nv12writer = 15697,

++    ia_pal_uuid_isp_ofa_1_dp = 60197,

++    ia_pal_uuid_isp_ofa_1_mp = 59839,

++    ia_pal_uuid_isp_ofa_1_ppp = 53002,

++    ia_pal_uuid_isp_ofa_2_dp = 18275,

++    ia_pal_uuid_isp_ofa_2_mp = 16233,

++    ia_pal_uuid_isp_ofa_2_ppp = 16427,

++    ia_pal_uuid_isp_outputscaler_2_0_a = 6800,

++    ia_pal_uuid_isp_outputscaler_2_0_b = 51856,

++    ia_pal_uuid_isp_packer_isa_bayer_a = 13215,

++    ia_pal_uuid_isp_packer_isa_yuv_a = 3683,

++    ia_pal_uuid_isp_packer_isa_yuv_b = 5000,

++    ia_pal_uuid_isp_packer_isa_yuv_c = 27259,

++    ia_pal_uuid_isp_padder_bayer_a = 19728,

++    ia_pal_uuid_isp_padder_yuv_a = 40136,

++    ia_pal_uuid_isp_padder_yuv_b = 49213,

++    ia_pal_uuid_isp_padder_yuv_c = 23317,

++    ia_pal_uuid_isp_pafstatistics_1 = 47216,

++    ia_pal_uuid_isp_pafstatistics_1_1 = 38817,

++    ia_pal_uuid_isp_pext_1_0 = 43213,

++    ia_pal_uuid_isp_pix_crop_ir_md = 54005,

++    ia_pal_uuid_isp_pixcomp_1_0 = 4693,

++    ia_pal_uuid_isp_pixelformatter = 41023,

++    ia_pal_uuid_isp_pixelformatter_b = 54735,

++    ia_pal_uuid_isp_pixelformatter_c = 3081,

++    ia_pal_uuid_isp_pixprecadapter_post_sis = 53715,

++    ia_pal_uuid_isp_pixprecadapter_s2v_c = 57170,

++    ia_pal_uuid_isp_pixprecadapter_v2s_4 = 56918,

++    ia_pal_uuid_isp_pme_1_0 = 51711,

++    ia_pal_uuid_isp_pxl_crop_bayer_a = 34076,

++    ia_pal_uuid_isp_pxl_crop_psa = 41874,

++    ia_pal_uuid_isp_pxl_crop_sis_a = 38128,

++    ia_pal_uuid_isp_pxl_crop_sis_b = 3437,

++    ia_pal_uuid_isp_pxl_crop_yuv_a = 9082,

++    ia_pal_uuid_isp_pxl_crop_yuv_b = 33476,

++    ia_pal_uuid_isp_pxl_crop_yuv_c = 64756,

++    ia_pal_uuid_isp_rgb_ir_2_0 = 14488,

++    ia_pal_uuid_isp_rgb_ir_2_1 = 62955,

++    ia_pal_uuid_isp_rgb_ir_2_1_bbb = 39657,

++    ia_pal_uuid_isp_rgbs_grid_1_0 = 18844,

++    ia_pal_uuid_isp_rgbs_statistics_1_0 = 39058,

++    ia_pal_uuid_isp_sc_iefd = 2442,

++    ia_pal_uuid_isp_sc_iefd_v2 = 7320,

++    ia_pal_uuid_isp_sc_outputscaler_dp = 5852,

++    ia_pal_uuid_isp_sc_outputscaler_dp_1_1 = 23205,

++    ia_pal_uuid_isp_sc_outputscaler_ppp = 60118,

++    ia_pal_uuid_isp_sc_outputscaler_ppp_1_1 = 52796,

++    ia_pal_uuid_isp_sc_ylpf = 50844,

++    ia_pal_uuid_isp_sdp_scp = 28247,

++    ia_pal_uuid_isp_see = 15281,

++    ia_pal_uuid_isp_see2 = 55908,

++    ia_pal_uuid_isp_sharpening_1_0 = 25130,

++    ia_pal_uuid_isp_sie_vcsc1_1 = 5286,

++    ia_pal_uuid_isp_sis_1 = 1732,

++    ia_pal_uuid_isp_sis_1_0_a = 44134,

++    ia_pal_uuid_isp_sis_1_0_b = 7487,

++    ia_pal_uuid_isp_spa_sis_a = 13401,

++    ia_pal_uuid_isp_stream2mmio = 33280,

++    ia_pal_uuid_isp_stream2mmio_b = 10400,

++    ia_pal_uuid_isp_stream2mmio_c = 30373,

++    ia_pal_uuid_isp_strm_crop_psa = 45913,

++    ia_pal_uuid_isp_strm_crop_psa_c = 12123,

++    ia_pal_uuid_isp_strm_crop_psa_d = 44733,

++    ia_pal_uuid_isp_strm_crop_psa_e = 1739,

++    ia_pal_uuid_isp_strm_crop_psa_f = 40056,

++    ia_pal_uuid_isp_strm_crop_psa_g = 46549,

++    ia_pal_uuid_isp_strm_crop_psa_h = 42698,

++    ia_pal_uuid_isp_strm_crop_sis_a = 9544,

++    ia_pal_uuid_isp_strm_crop_sis_b = 49322,

++    ia_pal_uuid_isp_sve_1_0 = 11000,

++    ia_pal_uuid_isp_sve_1_1 = 53103,

++    ia_pal_uuid_isp_tnr_6_0 = 64565,

++    ia_pal_uuid_isp_tnr_scale_lb = 33723,

++    ia_pal_uuid_isp_tnr_scale_fp = 60056,

++    ia_pal_uuid_isp_tnr_scale_sp = 44886,

++    ia_pal_uuid_isp_tnr5_21 = 7824,

++    ia_pal_uuid_isp_tnr5_22 = 21293,

++    ia_pal_uuid_isp_tnr5_25 = 41522,

++    ia_pal_uuid_isp_tnr5_3 = 35640,

++    ia_pal_uuid_isp_tnr5_3_1 = 43630,

++    ia_pal_uuid_isp_tnr7_bc_1_0 = 39981,

++    ia_pal_uuid_isp_tnr7_blend_1_0 = 32696,

++    ia_pal_uuid_isp_tnr7_cme_1_0 = 28470,

++    ia_pal_uuid_isp_tnr7_ims_1_0 = 4720,

++    ia_pal_uuid_isp_tnr7_mc_1_0 = 1886,

++    ia_pal_uuid_isp_tnr_sp_mc2 = 43550,

++    ia_pal_uuid_isp_tnr7_rme_1_0 = 8230,

++    ia_pal_uuid_isp_tnr7_spatial_1_0 = 3133,

++    ia_pal_uuid_isp_tvs_1_0 = 64291,

++    ia_pal_uuid_isp_vcr_3_1 = 36035,

++    ia_pal_uuid_isp_vcr3 = 32600,

++    ia_pal_uuid_isp_vcsc_2_0 = 6086,

++    ia_pal_uuid_isp_vcsc_2_0_b = 13708,

++    ia_pal_uuid_isp_vcsc_2_0_c = 21802,

++    ia_pal_uuid_isp_vertical_padding_1_0 = 54484,

++    ia_pal_uuid_isp_vltm_1_0 = 20302,

++    ia_pal_uuid_isp_wb_1_1 = 5144,

++    ia_pal_uuid_isp_wb_sis = 1689,

++    ia_pal_uuid_isp_x2i_md_1_0 = 59520,

++    ia_pal_uuid_isp_xnr_5_1 = 40137,

++    ia_pal_uuid_isp_xnr_5_2 = 58858,

++    ia_pal_uuid_isp_xnr_dss = 42418,

++

++} ia_pal_uuid;

++

++typedef enum

++{

++    ia_pal_uuid_system_api_gdc7 = 62512,

++    ia_pal_uuid_system_api_io_buffer = 47777,

++    ia_pal_uuid_system_api_tvs_1_0 = 29571,

++

++} ia_system_api_uuid;

++

++#ifdef __cplusplus

++}

++#endif

+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
+new file mode 100644
+index 000000000000..b9126ef80f0c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
+@@ -0,0 +1,16016 @@
++

++/*

++* INTEL CONFIDENTIAL

++* Copyright (c) 2020 Intel Corporation

++* All Rights Reserved.

++*

++* The source code contained or described herein and all documents related to

++* the source code (Material) are owned by Intel Corporation or its

++* suppliers or licensors. Title to the Material remains with Intel

++* Corporation or its suppliers and licensors. The Material may contain trade

++* secrets and proprietary and confidential information of Intel Corporation

++* and its suppliers and licensors, and is protected by worldwide copyright

++* and trade secret laws and treaty provisions. No part of the Material may be

++* used, copied, reproduced, modified, published, uploaded, posted,

++* transmitted, distributed, or disclosed in any way without Intel's prior

++* express written permission.

++*

++* No license under any patent, copyright, trade secret or other intellectual

++* property right is granted to or conferred upon you by disclosure or

++* delivery of the Materials, either expressly, by implication, inducement,

++* estoppel or otherwise. Any license under such intellectual property rights

++* must be express and approved by Intel in writing.

++*

++* Unless otherwise agreed by Intel in writing, you may not remove or alter

++* this notice or any other notice embedded in Materials by Intel or Intel's

++* suppliers or licensors in any way.

++*/

++#pragma once

++#include <stdint.h>

++#include <memory.h>

++

++#ifdef __cplusplus

++extern "C"{

++#endif

++

++

++/*! \isp struct acm_1_1

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< enable_chroma_lut Enable Chroma adaptation by LUT*/

++    int32_t enable_chroma_lut;

++    /*!< enable_luma_lut Enable Luma adaptation by LUT*/

++    int32_t enable_luma_lut;

++    /*!< enable_negative_pixels enable negative pixels in output*/

++    int32_t enable_negative_pixels;

++    /*!< enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/

++    int32_t enable_chroma_low_light_mode;

++    /*!< enable_luma_low_light_mode Enable Luma adaptation in low light mode*/

++    int32_t enable_luma_low_light_mode;

++    /*!< num_of_sectors number of sectors, U5.0*/

++    int32_t num_of_sectors;

++    /*!< chromagrid2uniformlut_cu_x[9] U12.0*/

++    int32_t chromagrid2uniformlut_cu_x[9];

++    /*!< chromagrid2uniformlut_cu_a[8] S4.10*/

++    int32_t chromagrid2uniformlut_cu_a[8];

++    /*!< lumagrid2uniformlut_cu_x[9] U12.0*/

++    int32_t lumagrid2uniformlut_cu_x[9];

++    /*!< lumagrid2uniformlut_cu_a[8] S4.10*/

++    int32_t lumagrid2uniformlut_cu_a[8];

++    /*!< ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/

++    int32_t ccm_matrix_arr[216];

++    /*!< hue_boundary_arr[24] Table of sectors boundaries, U11.0*/

++    int32_t hue_boundary_arr[24];

++    /*!< ccm_index_arr[25] Table of the sectors indices, U5.0*/

++    int32_t ccm_index_arr[25];

++    /*!< offr CCM bias for R, S13.0*/

++    int32_t offr;

++    /*!< offg CCM bias for G, S13.0*/

++    int32_t offg;

++    /*!< offb CCM bias for B, S13.0*/

++    int32_t offb;

++    /*!< luma_coeff_arr[3] Luna coefficients (weights), U0.8*/

++    int32_t luma_coeff_arr[3];

++    /*!< adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/

++    int32_t adapt_chroma_lut[81];

++    /*!< adapt_luma_lut[81] Luma adaptation LUT, S13.0*/

++    int32_t adapt_luma_lut[81];

++    /*!< enable_low_light_mode Enable CC's adaptation low light mode*/

++    int32_t enable_low_light_mode;

++    /*!< enable_compand enable for the (de)companding*/

++    int32_t enable_compand;

++    /*!< cu_compression_x[13] U.24 linear, default log-limited*/

++    int32_t cu_compression_x[13];

++    /*!< cu_compression_y[12] U.15 companded output*/

++    int32_t cu_compression_y[12];

++    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/

++    int32_t cu_compression_slope[12];

++    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/

++    int32_t cu_decompression_x[13];

++    /*!< cu_decompression_y[12] U.24 linear*/

++    int32_t cu_decompression_y[12];

++    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/

++    int32_t cu_decompression_slope[12];

++    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/

++    int32_t linear_pedestal;

++    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

++    int32_t use_pedestal;

++

++} ia_pal_isp_acm_1_1_t;

++

++/*! \isp struct aestatistics_2_0

++AE Statistics (histogram)

++*/

++typedef struct

++{

++    /*!< cell0[96] weighted histogram grid values*/

++    int32_t cell0[96];

++    /*!< cell1[96] weighted histogram grid values*/

++    int32_t cell1[96];

++    /*!< cell2[96] weighted histogram grid values*/

++    int32_t cell2[96];

++    /*!< cell3[96] weighted histogram grid values*/

++    int32_t cell3[96];

++    /*!< cell4[96] weighted histogram grid values*/

++    int32_t cell4[96];

++    /*!< cell5[96] weighted histogram grid values*/

++    int32_t cell5[96];

++    /*!< cell6[96] weighted histogram grid values*/

++    int32_t cell6[96];

++    /*!< cell7[96] weighted histogram grid values*/

++    int32_t cell7[96];

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_height;

++    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

++    int32_t ae_en;

++    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

++    int32_t rst_hist_array;

++    /*!< x_start X top left corner of the grid*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< shift_id[8] shifter for the histograms per color channel*/

++    int32_t shift_id[8];

++

++} ia_pal_isp_aestatistics_2_0_t;

++

++/*! \isp struct aestatistics_2_1

++AE Statistics (histogram)

++*/

++typedef struct

++{

++    /*!< cell0[96] weighted histogram grid values*/

++    int32_t cell0[96];

++    /*!< cell1[96] weighted histogram grid values*/

++    int32_t cell1[96];

++    /*!< cell2[96] weighted histogram grid values*/

++    int32_t cell2[96];

++    /*!< cell3[96] weighted histogram grid values*/

++    int32_t cell3[96];

++    /*!< cell4[96] weighted histogram grid values*/

++    int32_t cell4[96];

++    /*!< cell5[96] weighted histogram grid values*/

++    int32_t cell5[96];

++    /*!< cell6[96] weighted histogram grid values*/

++    int32_t cell6[96];

++    /*!< cell7[96] weighted histogram grid values*/

++    int32_t cell7[96];

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_height;

++    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

++    int32_t ae_en;

++    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

++    int32_t rst_hist_array;

++    /*!< x_start X top left corner of the grid*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< shift_id[8] shifter for the histograms per color channel*/

++    int32_t shift_id[8];

++

++} ia_pal_isp_aestatistics_2_1_t;

++

++/*! \isp struct af_awb_frstatistics_2_0

++

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_height;

++    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice*/

++    int32_t grid_height_per_slice;

++    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/

++    int32_t y_fr_en;

++    /*!< awb_fr_en 0: FF will not write to the AWB_FR  array; 1: FF will write  to the AWB_FR  array*/

++    int32_t awb_fr_en;

++    /*!< x_start X top left corner of the grid*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid*/

++    int32_t y_end;

++    /*!< shftr_val_x[7] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];m_ShftR_val_R = shftr_val_x[4];m_ShftR_val_G = shftr_val_x[5];m_ShftR_val_B = shftr_val_x[6];*/

++    int32_t shftr_val_x[7];

++    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_0[4];

++    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_1[4];

++    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_2[4];

++    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_3[4];

++    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/

++    int32_t mask_y0;

++    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/

++    int32_t mask_y1;

++    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/

++    int32_t oe_y0;

++    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/

++    int32_t oe_y1;

++    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y0[4];

++    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y1[4];

++    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/

++    int32_t r_select;

++    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column*/

++    int32_t g_select;

++    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/

++    int32_t b_select;

++    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y00_filter_coeff[6];

++    /*!< y00_filter_sign_vec sign vector for Y00*/

++    int32_t y00_filter_sign_vec;

++    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y01_filter_coeff[6];

++    /*!< y01_filter_sign_vec sign vector for Y01*/

++    int32_t y01_filter_sign_vec;

++    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y10_filter_coeff[6];

++    /*!< y10_filter_sign_vec sign vector for Y10*/

++    int32_t y10_filter_sign_vec;

++    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y11_filter_coeff[6];

++    /*!< y11_filter_sign_vec sign vector for Y11*/

++    int32_t y11_filter_sign_vec;

++    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/

++    int32_t r_filter_coeff[6];

++    /*!< r_filter_sign_vec sign vector for R*/

++    int32_t r_filter_sign_vec;

++    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/

++    int32_t g_filter_coeff[6];

++    /*!< g_filter_sign_vec sign vector for G*/

++    int32_t g_filter_sign_vec;

++    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/

++    int32_t b_filter_coeff[6];

++    /*!< b_filter_sign_vec sign vector for B*/

++    int32_t b_filter_sign_vec;

++    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/

++    int32_t nf_x[7];

++    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/

++    int32_t sensor_mode;

++    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/

++    int32_t downscaling_factor;

++    /*!< y00_blending_weight Median filter weight for Y00*/

++    int32_t y00_blending_weight;

++    /*!< y01_blending_weight Median filter weight for Y01*/

++    int32_t y01_blending_weight;

++    /*!< y10_blending_weight Median filter weight for Y10*/

++    int32_t y10_blending_weight;

++    /*!< y11_blending_weight Median filter weight for Y11*/

++    int32_t y11_blending_weight;

++

++} ia_pal_isp_af_awb_frstatistics_2_0_t;

++

++/*! \isp struct awbstatistics_2_0

++AWB Statistics (RGBS grid)

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

++    int32_t block_height;

++    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/

++    int32_t grid_height_per_slice;

++    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

++    int32_t awb_en;

++    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

++    int32_t rgbs_incl_sat;

++    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

++    int32_t rgbs_thr_cx[8];

++    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

++    int32_t shftr_val_cx[8];

++    /*!< shftr_sat represents log2(num of pixels in cell)*/

++    int32_t shftr_sat;

++    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

++    int32_t output_packed;

++

++} ia_pal_isp_awbstatistics_2_0_t;

++

++/*! \isp struct b2i_bnr_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enable B2I-BNR filter*/

++    int32_t enable;

++    /*!< bayer_noise_mod_poiss_coeff denoise: noise model alpha - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_poiss_coeff;

++    /*!< bayer_noise_mod_gauss_coeff denoise: noise model beta - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_gauss_coeff;

++    /*!< bayer_noise_mod_gain_gr denoise: noise model gain for gr - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_gain_gr;

++    /*!< bayer_noise_mod_gain_r denoise: noise model gain for r - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_gain_r;

++    /*!< bayer_noise_mod_gain_b denoise: noise model gain for b - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_gain_b;

++    /*!< bayer_noise_mod_gain_gb denoise: noise model gain for gb - TH=alpha*sqrt(gain*I)+beta*gain*sigma+gamma+texture(I)*/

++    int32_t bayer_noise_mod_gain_gb;

++    /*!< bayer_noise_spatial_Gcoeff[4] denoise: spatial kernel coefficients for G pixels*/

++    int32_t bayer_noise_spatial_Gcoeff[4];

++    /*!< bayer_noise_spatial_Rbcoeff[3] denoise: spatial kernel coefficients for R,B pixels*/

++    int32_t bayer_noise_spatial_Rbcoeff[3];

++    /*!< psdy_noise_th 0-use bayer pixel for noise TH, 1- use psdY pixel for noise TH*/

++    int32_t psdy_noise_th;

++    /*!< radial_x_initial Radial x coordinates of corner*/

++    int32_t radial_x_initial;

++    /*!< radial_y_initial Radial y coordinates of corner*/

++    int32_t radial_y_initial;

++    /*!< radial_coords_prec_reduc radial coordinates precision reduction - to bring sqrX+sqrY to [0-256]*/

++    int32_t radial_coords_prec_reduc;

++    /*!< cu_radial_coeff_gr_x[6] radial coeff function for Gr channel config unit - x values*/

++    int32_t cu_radial_coeff_gr_x[6];

++    /*!< cu_radial_coeff_gr_y[5] radial coeff function for Gr channel config unit - y values*/

++    int32_t cu_radial_coeff_gr_y[5];

++    /*!< cu_radial_coeff_gr_slope[5] radial coeff function for Gr channel config unit - slope values*/

++    int32_t cu_radial_coeff_gr_slope[5];

++    /*!< cu_radial_coeff_r_x[6] radial coeff function for R channel config unit - x values*/

++    int32_t cu_radial_coeff_r_x[6];

++    /*!< cu_radial_coeff_r_y[5] radial coeff function for R channel config unit - y values*/

++    int32_t cu_radial_coeff_r_y[5];

++    /*!< cu_radial_coeff_r_slope[5] radial coeff function for R channel config unit - slope values*/

++    int32_t cu_radial_coeff_r_slope[5];

++    /*!< cu_radial_coeff_b_x[6] radial coeff function for B channel config unit - x values*/

++    int32_t cu_radial_coeff_b_x[6];

++    /*!< cu_radial_coeff_b_y[5] radial coeff function for B channel config unit - y values*/

++    int32_t cu_radial_coeff_b_y[5];

++    /*!< cu_radial_coeff_b_slope[5] radial coeff function for B channel config unit - slope values*/

++    int32_t cu_radial_coeff_b_slope[5];

++    /*!< cu_radial_coeff_gb_x[6] radial coeff function for Gb channel config unit - x values*/

++    int32_t cu_radial_coeff_gb_x[6];

++    /*!< cu_radial_coeff_gb_y[5] radial coeff function for Gb channel config unit - y values*/

++    int32_t cu_radial_coeff_gb_y[5];

++    /*!< cu_radial_coeff_gb_slope[5] radial coeff function for Gb channel config unit - slope values*/

++    int32_t cu_radial_coeff_gb_slope[5];

++

++} ia_pal_isp_b2i_bnr_1_0_t;

++

++/*! \isp struct b2i_dm_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enable B2I-DM filter*/

++    int32_t enable;

++    /*!< local_median_bypass local_median_bypass*/

++    int32_t local_median_bypass;

++    /*!< cas_bypass cas_bypass*/

++    int32_t cas_bypass;

++    /*!< g_int_x_points[2] x_points for green interpolation CU*/

++    int32_t g_int_x_points[2];

++    /*!< g_int_a_points a_points for green interpolation CU*/

++    int32_t g_int_a_points;

++    /*!< g_int_b_points b_points for green interpolation CU*/

++    int32_t g_int_b_points;

++    /*!< cas_x_points[2] x_points for CAS CU*/

++    int32_t cas_x_points[2];

++    /*!< cas_a_points a_points for CAS CU*/

++    int32_t cas_a_points;

++    /*!< cas_b_points b_points for CAS CU*/

++    int32_t cas_b_points;

++    /*!< local_med_x_points[2] x_points forlocal median CU*/

++    int32_t local_med_x_points[2];

++    /*!< local_med_a_points a_points forlocal median CU*/

++    int32_t local_med_a_points;

++    /*!< local_med_b_points b_points forlocal median CU*/

++    int32_t local_med_b_points;

++    /*!< cas_low_level low level of the CAS config unit. [0 , 1024]*/

++    int32_t cas_low_level;

++    /*!< sharp_power power of DM sharpening - higher is more sharp [0 15]*/

++    int32_t sharp_power;

++

++} ia_pal_isp_b2i_dm_1_0_t;

++

++/*! \isp struct b2i_ds_1_0_0

++

++*/

++typedef struct

++{

++    /*!< enable enable scaling filter*/

++    int32_t enable;

++    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/

++    int32_t scaling_ratio;

++    /*!< horizontal_offset Position of first output pixel for scaler*/

++    int32_t horizontal_offset;

++    /*!< vertical_offset Position of first output line for scaler*/

++    int32_t vertical_offset;

++    /*!< output_height Output image height for scaler*/

++    int32_t output_height;

++    /*!< output_width Output image width for scaler*/

++    int32_t output_width;

++    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/

++    int32_t vkernel_LUT[129];

++    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/

++    int32_t hkernel_LUT[129];

++    /*!< input_height input image height*/

++    int32_t input_height;

++

++} ia_pal_isp_b2i_ds_1_0_0_t;

++

++/*! \isp struct b2i_ds_1_0_1

++

++*/

++typedef struct

++{

++    /*!< enable enable scaling filter*/

++    int32_t enable;

++    /*!< scaling_ratio Scaling factor, 16bit fixed point, greater than 1*/

++    int32_t scaling_ratio;

++    /*!< horizontal_offset Position of first output pixel for scaler*/

++    int32_t horizontal_offset;

++    /*!< vertical_offset Position of first output line for scaler*/

++    int32_t vertical_offset;

++    /*!< output_height Output image height for scaler*/

++    int32_t output_height;

++    /*!< output_width Output image width for scaler*/

++    int32_t output_width;

++    /*!< vkernel_LUT[129] interpolation vertical kernel coefficients for scaler*/

++    int32_t vkernel_LUT[129];

++    /*!< hkernel_LUT[129] interpolation horizontal kernel coefficients for scaler*/

++    int32_t hkernel_LUT[129];

++    /*!< input_height input image height*/

++    int32_t input_height;

++

++} ia_pal_isp_b2i_ds_1_0_1_t;

++

++/*! \isp struct b2i_sie_1_0

++

++*/

++typedef struct

++{

++    /*!< csc_enable csc_bypass*/

++    int32_t csc_enable;

++    /*!< sharp_enable sharp_bypass*/

++    int32_t sharp_enable;

++    /*!< gamma_lut_enable gamma lut enable*/

++    int32_t gamma_lut_enable;

++    /*!< tm_lut_enable TM enable*/

++    int32_t tm_lut_enable;

++    /*!< ccm_enable ccm_bypass*/

++    int32_t ccm_enable;

++    /*!< cnr_enable cnr_bypass*/

++    int32_t cnr_enable;

++    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

++    int32_t csc_matrix[9];

++    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

++    int32_t csc_matrix_norm;

++    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

++    int32_t csc_bias_vec[3];

++    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

++    int32_t cds_coeff_array[8];

++    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

++    int32_t cds_coeff_array_norm;

++    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/

++    int32_t sharp_undershoot_power;

++    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/

++    int32_t sharp_overshoot_power;

++    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/

++    int32_t glut_base_level[5];

++    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/

++    int32_t glut_start_bin[5];

++    /*!< glut_step[5] Gamma lut  - GLUT step*/

++    int32_t glut_step[5];

++    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/

++    int32_t glut_gen_lut[385];

++    /*!< gamma_prog_shift programable shift for the gamma output*/

++    int32_t gamma_prog_shift;

++    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/

++    int32_t ccm_matrix[9];

++    /*!< ccm_matrix_norm normalization factor for color enhancement*/

++    int32_t ccm_matrix_norm;

++    /*!< tmlut_base_level TM lut  - LUT base levels*/

++    int32_t tmlut_base_level;

++    /*!< tmlut_start_bin TM lut  - LUT start bin*/

++    int32_t tmlut_start_bin;

++    /*!< tmlut_step TM lut  - LUT step*/

++    int32_t tmlut_step;

++    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/

++    int32_t tmlut_gen_lut[513];

++    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/

++    int32_t x_points_for_sharp_pos_th[6];

++    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/

++    int32_t a_points_for_sharp_pos_th[5];

++    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/

++    int32_t b_points_for_sharp_pos_th[5];

++    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/

++    int32_t x_points_for_sharp_neg_th[6];

++    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/

++    int32_t a_points_for_sharp_neg_th[5];

++    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/

++    int32_t b_points_for_sharp_neg_th[5];

++    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/

++    int32_t x_points_for_sharp_pixval_th[6];

++    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/

++    int32_t a_points_for_sharp_pixval_th[5];

++    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/

++    int32_t b_points_for_sharp_pixval_th[5];

++    /*!< sharp_texture_coeff_norm texture  metric normalization power*/

++    int32_t sharp_texture_coeff_norm;

++    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/

++    int32_t sharp_texture_undershoot;

++    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/

++    int32_t sharp_edge_undershoot;

++    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/

++    int32_t sharp_texture_overshoot;

++    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/

++    int32_t sharp_edge_overshoot;

++    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/

++    int32_t sharp_kernel_coeffs[6];

++    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/

++    int32_t x_points_for_noise_th[6];

++    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/

++    int32_t a_points_for_noise_th[5];

++    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/

++    int32_t b_points_for_noise_th[5];

++    /*!< x_points_for_local_coring[6] x points for local coring config unit*/

++    int32_t x_points_for_local_coring[6];

++    /*!< a_points_for_local_coring[5] a points for local coring config unit*/

++    int32_t a_points_for_local_coring[5];

++    /*!< b_points_for_local_coring[5] b points for local coring config unit*/

++    int32_t b_points_for_local_coring[5];

++    /*!< x_points_for_global_coring[6] x points for global coring config unit*/

++    int32_t x_points_for_global_coring[6];

++    /*!< a_points_for_global_coring[5] a points for global coring config unit*/

++    int32_t a_points_for_global_coring[5];

++    /*!< b_points_for_global_coring[5] b points for global coring config unit*/

++    int32_t b_points_for_global_coring[5];

++    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/

++    int32_t cnr_iir_weight;

++    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/

++    int32_t cnr_fir_weight[3];

++

++} ia_pal_isp_b2i_sie_1_0_t;

++

++/*! \isp struct b2i_sie_1_1

++

++*/

++typedef struct

++{

++    /*!< csc_enable csc_bypass*/

++    int32_t csc_enable;

++    /*!< sharp_enable sharp_bypass*/

++    int32_t sharp_enable;

++    /*!< gamma_lut_enable gamma lut enable*/

++    int32_t gamma_lut_enable;

++    /*!< tmlut_enable TM enable*/

++    int32_t tmlut_enable;

++    /*!< ccm_enable ccm_bypass*/

++    int32_t ccm_enable;

++    /*!< cnr_enable cnr_bypass*/

++    int32_t cnr_enable;

++    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

++    int32_t csc_matrix[9];

++    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

++    int32_t csc_matrix_norm;

++    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

++    int32_t csc_bias_vec[3];

++    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

++    int32_t cds_coeff_array[8];

++    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

++    int32_t cds_coeff_array_norm;

++    /*!< sharp_undershoot_power sharpening undershoot enhancement.To enhance use positive. To weaken use a negative.*/

++    int32_t sharp_undershoot_power;

++    /*!< sharp_overshoot_power sharpening overshoot enhancement.To enhance use positive. To weaken use a negative.*/

++    int32_t sharp_overshoot_power;

++    /*!< glut_base_level[5] Gamma lut  - GLUT base levels*/

++    int32_t glut_base_level[5];

++    /*!< glut_start_bin[5] Gamma lut  - GLUT start bin*/

++    int32_t glut_start_bin[5];

++    /*!< glut_step[5] Gamma lut  - GLUT step*/

++    int32_t glut_step[5];

++    /*!< glut_gen_lut[385] Gamma lut  - GLUT values*/

++    int32_t glut_gen_lut[385];

++    /*!< gamma_prog_shift programable shift for the gamma output*/

++    int32_t gamma_prog_shift;

++    /*!< ccm_matrix[9] color space conversion matrix for color enhancement*/

++    int32_t ccm_matrix[9];

++    /*!< ccm_matrix_norm normalization factor for color enhancement*/

++    int32_t ccm_matrix_norm;

++    /*!< tmlut_base_level TM lut  - LUT base levels*/

++    int32_t tmlut_base_level;

++    /*!< tmlut_start_bin TM lut  - LUT start bin*/

++    int32_t tmlut_start_bin;

++    /*!< tmlut_step TM lut  - LUT step*/

++    int32_t tmlut_step;

++    /*!< tmlut_gen_lut[513] TM lut  - LUT values*/

++    int32_t tmlut_gen_lut[513];

++    /*!< x_points_for_sharp_pos_th[6] x points for sharpning overshoot config unit*/

++    int32_t x_points_for_sharp_pos_th[6];

++    /*!< a_points_for_sharp_pos_th[5] a points for sharpning overshoot config unit*/

++    int32_t a_points_for_sharp_pos_th[5];

++    /*!< b_points_for_sharp_pos_th[5] b points for sharpning overshoot config unit*/

++    int32_t b_points_for_sharp_pos_th[5];

++    /*!< x_points_for_sharp_neg_th[6] x points for sharpning undershoot config unit*/

++    int32_t x_points_for_sharp_neg_th[6];

++    /*!< a_points_for_sharp_neg_th[5] a points for sharpning undershoot config unit*/

++    int32_t a_points_for_sharp_neg_th[5];

++    /*!< b_points_for_sharp_neg_th[5] b points for sharpning undershoot config unit*/

++    int32_t b_points_for_sharp_neg_th[5];

++    /*!< x_points_for_sharp_pixval_th[6] x points for sharpning pixel value config unit*/

++    int32_t x_points_for_sharp_pixval_th[6];

++    /*!< a_points_for_sharp_pixval_th[5] a points for sharpning pixel value config unit*/

++    int32_t a_points_for_sharp_pixval_th[5];

++    /*!< b_points_for_sharp_pixval_th[5] b points for sharpning pixel value config unit*/

++    int32_t b_points_for_sharp_pixval_th[5];

++    /*!< sharp_texture_coeff_norm texture  metric normalization power*/

++    int32_t sharp_texture_coeff_norm;

++    /*!< sharp_texture_undershoot sharpening: allowed undershoot for textured pixels*/

++    int32_t sharp_texture_undershoot;

++    /*!< sharp_edge_undershoot sharpening: allowed undershoot for edge pixels*/

++    int32_t sharp_edge_undershoot;

++    /*!< sharp_texture_overshoot sharpening: allowed overshoot for textured pixels*/

++    int32_t sharp_texture_overshoot;

++    /*!< sharp_edge_overshoot sharpening: allowed overshoot for edge pixels*/

++    int32_t sharp_edge_overshoot;

++    /*!< sharp_kernel_coeffs[6] sharpening: kernel coefficients*/

++    int32_t sharp_kernel_coeffs[6];

++    /*!< x_points_for_noise_th[6] x points for sharpning noise th config unit*/

++    int32_t x_points_for_noise_th[6];

++    /*!< a_points_for_noise_th[5] a  points for sharpning noise th config unit*/

++    int32_t a_points_for_noise_th[5];

++    /*!< b_points_for_noise_th[5] b  points for sharpning noise th config unit*/

++    int32_t b_points_for_noise_th[5];

++    /*!< x_points_for_local_coring[6] x points for local coring config unit*/

++    int32_t x_points_for_local_coring[6];

++    /*!< a_points_for_local_coring[5] a points for local coring config unit*/

++    int32_t a_points_for_local_coring[5];

++    /*!< b_points_for_local_coring[5] b points for local coring config unit*/

++    int32_t b_points_for_local_coring[5];

++    /*!< x_points_for_global_coring[6] x points for global coring config unit*/

++    int32_t x_points_for_global_coring[6];

++    /*!< a_points_for_global_coring[5] a points for global coring config unit*/

++    int32_t a_points_for_global_coring[5];

++    /*!< b_points_for_global_coring[5] b points for global coring config unit*/

++    int32_t b_points_for_global_coring[5];

++    /*!< cnr_iir_weight weights for vertical iir filter (filter norm power = 6)*/

++    int32_t cnr_iir_weight;

++    /*!< cnr_fir_weight[3] weights for horizontal fir filter (filter norm power = 7)*/

++    int32_t cnr_fir_weight[3];

++

++} ia_pal_isp_b2i_sie_1_1_t;

++

++/*! \isp struct bnlm_3_0

++noise reduction

++*/

++typedef struct

++{

++    /*!< bayer_fmt Bayer format*/

++    int32_t bayer_fmt;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< run_on_y a flag that indicates if the block used on Y input*/

++    int32_t run_on_y;

++    /*!< hv_edge_density_thr Edge density noise sigma thr*/

++    int32_t hv_edge_density_thr;

++    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

++    int32_t minmax_hv_edge_density_thr;

++    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

++    int32_t d_edge_density_thr;

++    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

++    int32_t minmax_d_edge_density_thr;

++    /*!< sigma_flat sigma flat*/

++    int32_t sigma_flat;

++    /*!< sigma_slope sigma slope*/

++    int32_t sigma_slope;

++    /*!< sigma_edge sigma edge*/

++    int32_t sigma_edge;

++    /*!< sigma_texture sigma texture*/

++    int32_t sigma_texture;

++    /*!< delta_flat delta flat*/

++    int32_t delta_flat;

++    /*!< delta_slope delta slope*/

++    int32_t delta_slope;

++    /*!< delta_edge delta edge*/

++    int32_t delta_edge;

++    /*!< delta_texture delta texture*/

++    int32_t delta_texture;

++    /*!< alpha_flat alpha flat*/

++    int32_t alpha_flat;

++    /*!< alpha_slope alpha slope*/

++    int32_t alpha_slope;

++    /*!< alpha_edge alpha edge*/

++    int32_t alpha_edge;

++    /*!< alpha_texture alpha texture*/

++    int32_t alpha_texture;

++    /*!< sigma_s spatial sigma of uniform filter*/

++    int32_t sigma_s;

++    /*!< sigma_s_b narrow sigma of elliptical filter*/

++    int32_t sigma_s_b;

++    /*!< sigma_s_a wide sigma of elliptical filter*/

++    int32_t sigma_s_a;

++    /*!< rx_sqr_start initial value of Rx^2*/

++    int32_t rx_sqr_start;

++    /*!< ry_sqr_start initial value of Ry^2*/

++    int32_t ry_sqr_start;

++    /*!< coordinates_shift coordinates shift*/

++    int32_t coordinates_shift;

++    /*!< color_penalty_weight color penalty weight*/

++    int32_t color_penalty_weight;

++    /*!< alpha_i_max alpha I max*/

++    int32_t alpha_i_max;

++    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

++    int32_t cu_ed_measure_x[4];

++    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

++    int32_t cu_ed_measure_y[3];

++    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

++    int32_t cu_ed_measure_slope[3];

++    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

++    int32_t cu_ed_dir_measure_x[4];

++    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

++    int32_t cu_ed_dir_measure_y[3];

++    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

++    int32_t cu_ed_dir_measure_slope[3];

++    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

++    int32_t cu_lin_slope_measure_x[4];

++    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

++    int32_t cu_lin_slope_measure_y[3];

++    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

++    int32_t cu_lin_slope_measure_slope[3];

++    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

++    int32_t cu_lin_slope_edge_measure_x[4];

++    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

++    int32_t cu_lin_slope_edge_measure_y[3];

++    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

++    int32_t cu_lin_slope_edge_measure_slope[3];

++    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

++    int32_t cu_var_measure_x[4];

++    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

++    int32_t cu_var_measure_y[3];

++    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

++    int32_t cu_var_measure_slope[3];

++    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

++    int32_t cu_var_edge_measure_x[4];

++    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

++    int32_t cu_var_edge_measure_y[3];

++    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

++    int32_t cu_var_edge_measure_slope[3];

++    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

++    int32_t cu_alpha_i_x[4];

++    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

++    int32_t cu_alpha_i_y[3];

++    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

++    int32_t cu_alpha_i_slope[3];

++    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

++    int32_t cu_lsc_coeff_gr_x[6];

++    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

++    int32_t cu_lsc_coeff_gr_y[5];

++    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gr_slope[5];

++    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

++    int32_t cu_lsc_coeff_r_x[6];

++    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

++    int32_t cu_lsc_coeff_r_y[5];

++    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

++    int32_t cu_lsc_coeff_r_slope[5];

++    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

++    int32_t cu_lsc_coeff_b_x[6];

++    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

++    int32_t cu_lsc_coeff_b_y[5];

++    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

++    int32_t cu_lsc_coeff_b_slope[5];

++    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

++    int32_t cu_lsc_coeff_gb_x[6];

++    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

++    int32_t cu_lsc_coeff_gb_y[5];

++    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gb_slope[5];

++    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

++    int32_t start_col;

++    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

++    int32_t start_row;

++    /*!< delta_y_counter crop supporting register*/

++    int32_t delta_y_counter;

++    /*!< delta_x_counter crop supporting register*/

++    int32_t delta_x_counter;

++    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

++    int32_t cu_nm_patch_x[10];

++    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

++    int32_t cu_nm_patch_y[9];

++    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

++    int32_t cu_nm_patch_slope[9];

++    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

++    int32_t cu_nm_block_x[10];

++    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

++    int32_t cu_nm_block_y[9];

++    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

++    int32_t cu_nm_block_slope[9];

++    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

++    int32_t cu_input_compression_x[16];

++    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

++    int32_t cu_input_compression_y[15];

++    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

++    int32_t cu_input_compression_slope[15];

++    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

++    int32_t cu_input_decompression_x[16];

++    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

++    int32_t cu_input_decompression_y[15];

++    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

++    int32_t cu_input_decompression_slope[15];

++    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

++    int32_t cu_output_compression_x[16];

++    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

++    int32_t cu_output_compression_y[15];

++    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

++    int32_t cu_output_compression_slope[15];

++    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

++    int32_t nm_norm_scale;

++

++} ia_pal_isp_bnlm_3_0_t;

++

++/*! \isp struct bnlm_3_1

++noise reduction

++*/

++typedef struct

++{

++    /*!< bayer_fmt Bayer format*/

++    int32_t bayer_fmt;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< run_on_y a flag that indicates if the block used on Y input*/

++    int32_t run_on_y;

++    /*!< hv_edge_density_thr Edge density noise sigma thr*/

++    int32_t hv_edge_density_thr;

++    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

++    int32_t minmax_hv_edge_density_thr;

++    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

++    int32_t d_edge_density_thr;

++    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

++    int32_t minmax_d_edge_density_thr;

++    /*!< sigma_flat sigma flat*/

++    int32_t sigma_flat;

++    /*!< sigma_slope sigma slope*/

++    int32_t sigma_slope;

++    /*!< sigma_edge sigma edge*/

++    int32_t sigma_edge;

++    /*!< sigma_texture sigma texture*/

++    int32_t sigma_texture;

++    /*!< delta_flat delta flat*/

++    int32_t delta_flat;

++    /*!< delta_slope delta slope*/

++    int32_t delta_slope;

++    /*!< delta_edge delta edge*/

++    int32_t delta_edge;

++    /*!< delta_texture delta texture*/

++    int32_t delta_texture;

++    /*!< alpha_flat alpha flat*/

++    int32_t alpha_flat;

++    /*!< alpha_slope alpha slope*/

++    int32_t alpha_slope;

++    /*!< alpha_edge alpha edge*/

++    int32_t alpha_edge;

++    /*!< alpha_texture alpha texture*/

++    int32_t alpha_texture;

++    /*!< sigma_s spatial sigma of uniform filter*/

++    int32_t sigma_s;

++    /*!< sigma_s_b narrow sigma of elliptical filter*/

++    int32_t sigma_s_b;

++    /*!< sigma_s_a wide sigma of elliptical filter*/

++    int32_t sigma_s_a;

++    /*!< rx_sqr_start initial value of Rx^2*/

++    int32_t rx_sqr_start;

++    /*!< ry_sqr_start initial value of Ry^2*/

++    int32_t ry_sqr_start;

++    /*!< coordinates_shift coordinates shift*/

++    int32_t coordinates_shift;

++    /*!< color_penalty_weight color penalty weight*/

++    int32_t color_penalty_weight;

++    /*!< alpha_i_max alpha I max*/

++    int32_t alpha_i_max;

++    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

++    int32_t cu_ed_measure_x[4];

++    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

++    int32_t cu_ed_measure_y[3];

++    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

++    int32_t cu_ed_measure_slope[3];

++    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

++    int32_t cu_ed_dir_measure_x[4];

++    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

++    int32_t cu_ed_dir_measure_y[3];

++    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

++    int32_t cu_ed_dir_measure_slope[3];

++    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

++    int32_t cu_lin_slope_measure_x[4];

++    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

++    int32_t cu_lin_slope_measure_y[3];

++    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

++    int32_t cu_lin_slope_measure_slope[3];

++    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

++    int32_t cu_lin_slope_edge_measure_x[4];

++    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

++    int32_t cu_lin_slope_edge_measure_y[3];

++    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

++    int32_t cu_lin_slope_edge_measure_slope[3];

++    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

++    int32_t cu_var_measure_x[4];

++    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

++    int32_t cu_var_measure_y[3];

++    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

++    int32_t cu_var_measure_slope[3];

++    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

++    int32_t cu_var_edge_measure_x[4];

++    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

++    int32_t cu_var_edge_measure_y[3];

++    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

++    int32_t cu_var_edge_measure_slope[3];

++    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

++    int32_t cu_alpha_i_x[4];

++    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

++    int32_t cu_alpha_i_y[3];

++    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

++    int32_t cu_alpha_i_slope[3];

++    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

++    int32_t cu_lsc_coeff_gr_x[6];

++    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

++    int32_t cu_lsc_coeff_gr_y[5];

++    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gr_slope[5];

++    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

++    int32_t cu_lsc_coeff_r_x[6];

++    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

++    int32_t cu_lsc_coeff_r_y[5];

++    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

++    int32_t cu_lsc_coeff_r_slope[5];

++    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

++    int32_t cu_lsc_coeff_b_x[6];

++    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

++    int32_t cu_lsc_coeff_b_y[5];

++    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

++    int32_t cu_lsc_coeff_b_slope[5];

++    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

++    int32_t cu_lsc_coeff_gb_x[6];

++    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

++    int32_t cu_lsc_coeff_gb_y[5];

++    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gb_slope[5];

++    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

++    int32_t start_col;

++    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

++    int32_t start_row;

++    /*!< delta_y_counter crop supporting register*/

++    int32_t delta_y_counter;

++    /*!< delta_x_counter crop supporting register*/

++    int32_t delta_x_counter;

++    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

++    int32_t cu_nm_patch_x[10];

++    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

++    int32_t cu_nm_patch_y[9];

++    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

++    int32_t cu_nm_patch_slope[9];

++    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

++    int32_t cu_nm_block_x[10];

++    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

++    int32_t cu_nm_block_y[9];

++    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

++    int32_t cu_nm_block_slope[9];

++    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

++    int32_t cu_input_compression_x[16];

++    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

++    int32_t cu_input_compression_y[15];

++    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

++    int32_t cu_input_compression_slope[15];

++    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

++    int32_t cu_input_decompression_x[16];

++    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

++    int32_t cu_input_decompression_y[15];

++    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

++    int32_t cu_input_decompression_slope[15];

++    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

++    int32_t cu_output_compression_x[16];

++    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

++    int32_t cu_output_compression_y[15];

++    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

++    int32_t cu_output_compression_slope[15];

++    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

++    int32_t nm_norm_scale;

++

++} ia_pal_isp_bnlm_3_1_t;

++

++/*! \isp struct bnlm_3_2

++noise reduction

++*/

++typedef struct

++{

++    /*!< bayer_fmt Bayer format*/

++    int32_t bayer_fmt;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< run_on_y a flag that indicates if the block used on Y input*/

++    int32_t run_on_y;

++    /*!< hv_edge_density_thr Edge density noise sigma thr*/

++    int32_t hv_edge_density_thr;

++    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

++    int32_t minmax_hv_edge_density_thr;

++    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

++    int32_t d_edge_density_thr;

++    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

++    int32_t minmax_d_edge_density_thr;

++    /*!< sigma_flat sigma flat*/

++    int32_t sigma_flat;

++    /*!< sigma_slope sigma slope*/

++    int32_t sigma_slope;

++    /*!< sigma_edge sigma edge*/

++    int32_t sigma_edge;

++    /*!< sigma_texture sigma texture*/

++    int32_t sigma_texture;

++    /*!< delta_flat delta flat*/

++    int32_t delta_flat;

++    /*!< delta_slope delta slope*/

++    int32_t delta_slope;

++    /*!< delta_edge delta edge*/

++    int32_t delta_edge;

++    /*!< delta_texture delta texture*/

++    int32_t delta_texture;

++    /*!< alpha_flat alpha flat*/

++    int32_t alpha_flat;

++    /*!< alpha_slope alpha slope*/

++    int32_t alpha_slope;

++    /*!< alpha_edge alpha edge*/

++    int32_t alpha_edge;

++    /*!< alpha_texture alpha texture*/

++    int32_t alpha_texture;

++    /*!< sigma_s spatial sigma of uniform filter*/

++    int32_t sigma_s;

++    /*!< sigma_s_b narrow sigma of elliptical filter*/

++    int32_t sigma_s_b;

++    /*!< sigma_s_a wide sigma of elliptical filter*/

++    int32_t sigma_s_a;

++    /*!< rx_sqr_start initial value of Rx^2*/

++    int32_t rx_sqr_start;

++    /*!< ry_sqr_start initial value of Ry^2*/

++    int32_t ry_sqr_start;

++    /*!< coordinates_shift coordinates shift*/

++    int32_t coordinates_shift;

++    /*!< color_penalty_weight color penalty weight*/

++    int32_t color_penalty_weight;

++    /*!< alpha_i_max alpha I max*/

++    int32_t alpha_i_max;

++    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

++    int32_t cu_ed_measure_x[4];

++    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

++    int32_t cu_ed_measure_y[3];

++    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

++    int32_t cu_ed_measure_slope[3];

++    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

++    int32_t cu_ed_dir_measure_x[4];

++    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

++    int32_t cu_ed_dir_measure_y[3];

++    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

++    int32_t cu_ed_dir_measure_slope[3];

++    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

++    int32_t cu_lin_slope_measure_x[4];

++    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

++    int32_t cu_lin_slope_measure_y[3];

++    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

++    int32_t cu_lin_slope_measure_slope[3];

++    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

++    int32_t cu_lin_slope_edge_measure_x[4];

++    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

++    int32_t cu_lin_slope_edge_measure_y[3];

++    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

++    int32_t cu_lin_slope_edge_measure_slope[3];

++    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

++    int32_t cu_var_measure_x[4];

++    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

++    int32_t cu_var_measure_y[3];

++    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

++    int32_t cu_var_measure_slope[3];

++    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

++    int32_t cu_var_edge_measure_x[4];

++    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

++    int32_t cu_var_edge_measure_y[3];

++    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

++    int32_t cu_var_edge_measure_slope[3];

++    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

++    int32_t cu_alpha_i_x[4];

++    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

++    int32_t cu_alpha_i_y[3];

++    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

++    int32_t cu_alpha_i_slope[3];

++    /*!< cu_lsc_coeff_gr_x[6] LSC coeff function for Gr channel config unit - x values*/

++    int32_t cu_lsc_coeff_gr_x[6];

++    /*!< cu_lsc_coeff_gr_y[5] LSC coeff function for Gr channel config unit - y values*/

++    int32_t cu_lsc_coeff_gr_y[5];

++    /*!< cu_lsc_coeff_gr_slope[5] LSC coeff function for Gr channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gr_slope[5];

++    /*!< cu_lsc_coeff_r_x[6] LSC coeff function for R channel config unit - x values*/

++    int32_t cu_lsc_coeff_r_x[6];

++    /*!< cu_lsc_coeff_r_y[5] LSC coeff function for R channel config unit - y values*/

++    int32_t cu_lsc_coeff_r_y[5];

++    /*!< cu_lsc_coeff_r_slope[5] LSC coeff function for R channel config unit - slope values*/

++    int32_t cu_lsc_coeff_r_slope[5];

++    /*!< cu_lsc_coeff_b_x[6] LSC coeff function for B channel config unit - x values*/

++    int32_t cu_lsc_coeff_b_x[6];

++    /*!< cu_lsc_coeff_b_y[5] LSC coeff function for B channel config unit - y values*/

++    int32_t cu_lsc_coeff_b_y[5];

++    /*!< cu_lsc_coeff_b_slope[5] LSC coeff function for B channel config unit - slope values*/

++    int32_t cu_lsc_coeff_b_slope[5];

++    /*!< cu_lsc_coeff_gb_x[6] LSC coeff function for Gb channel config unit - x values*/

++    int32_t cu_lsc_coeff_gb_x[6];

++    /*!< cu_lsc_coeff_gb_y[5] LSC coeff function for Gb channel config unit - y values*/

++    int32_t cu_lsc_coeff_gb_y[5];

++    /*!< cu_lsc_coeff_gb_slope[5] LSC coeff function for Gb channel config unit - slope values*/

++    int32_t cu_lsc_coeff_gb_slope[5];

++    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

++    int32_t start_col;

++    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

++    int32_t start_row;

++    /*!< delta_y_counter crop supporting register*/

++    int32_t delta_y_counter;

++    /*!< delta_x_counter crop supporting register*/

++    int32_t delta_x_counter;

++    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

++    int32_t cu_nm_patch_x[10];

++    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

++    int32_t cu_nm_patch_y[9];

++    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

++    int32_t cu_nm_patch_slope[9];

++    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

++    int32_t cu_nm_block_x[10];

++    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

++    int32_t cu_nm_block_y[9];

++    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

++    int32_t cu_nm_block_slope[9];

++    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

++    int32_t cu_input_compression_x[16];

++    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

++    int32_t cu_input_compression_y[15];

++    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

++    int32_t cu_input_compression_slope[15];

++    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

++    int32_t cu_input_decompression_x[16];

++    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

++    int32_t cu_input_decompression_y[15];

++    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

++    int32_t cu_input_decompression_slope[15];

++    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

++    int32_t cu_output_compression_x[16];

++    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

++    int32_t cu_output_compression_y[15];

++    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

++    int32_t cu_output_compression_slope[15];

++    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

++    int32_t nm_norm_scale;

++

++} ia_pal_isp_bnlm_3_2_t;

++

++/*! \isp struct bnlm_3_3

++noise reduction

++*/

++typedef struct

++{

++    /*!< bayer_fmt Bayer format*/

++    int32_t bayer_fmt;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< run_on_y a flag that indicates if the block used on Y input*/

++    int32_t run_on_y;

++    /*!< hv_edge_density_thr Edge density noise sigma thr*/

++    int32_t hv_edge_density_thr;

++    /*!< minmax_hv_edge_density_thr Edge density delta max - min thr*/

++    int32_t minmax_hv_edge_density_thr;

++    /*!< d_edge_density_thr Diagonal edge density noise sigma thr*/

++    int32_t d_edge_density_thr;

++    /*!< minmax_d_edge_density_thr Diagonal edge density delta max - min thr*/

++    int32_t minmax_d_edge_density_thr;

++    /*!< sigma_flat sigma flat*/

++    int32_t sigma_flat;

++    /*!< sigma_slope sigma slope*/

++    int32_t sigma_slope;

++    /*!< sigma_edge sigma edge*/

++    int32_t sigma_edge;

++    /*!< sigma_texture sigma texture*/

++    int32_t sigma_texture;

++    /*!< delta_flat delta flat*/

++    int32_t delta_flat;

++    /*!< delta_slope delta slope*/

++    int32_t delta_slope;

++    /*!< delta_edge delta edge*/

++    int32_t delta_edge;

++    /*!< delta_texture delta texture*/

++    int32_t delta_texture;

++    /*!< alpha_flat alpha flat*/

++    int32_t alpha_flat;

++    /*!< alpha_slope alpha slope*/

++    int32_t alpha_slope;

++    /*!< alpha_edge alpha edge*/

++    int32_t alpha_edge;

++    /*!< alpha_texture alpha texture*/

++    int32_t alpha_texture;

++    /*!< sigma_s spatial sigma of uniform filter*/

++    int32_t sigma_s;

++    /*!< sigma_s_b narrow sigma of elliptical filter*/

++    int32_t sigma_s_b;

++    /*!< sigma_s_a wide sigma of elliptical filter*/

++    int32_t sigma_s_a;

++    /*!< rx_sqr_start initial value of Rx^2*/

++    int32_t rx_sqr_start;

++    /*!< ry_sqr_start initial value of Ry^2*/

++    int32_t ry_sqr_start;

++    /*!< coordinates_shift coordinates shift*/

++    int32_t coordinates_shift;

++    /*!< color_penalty_weight color penalty weight*/

++    int32_t color_penalty_weight;

++    /*!< alpha_i_max alpha I max*/

++    int32_t alpha_i_max;

++    /*!< cu_ed_measure_x[4] edge density config unit - x values*/

++    int32_t cu_ed_measure_x[4];

++    /*!< cu_ed_measure_y[3] edge density config unit - y values*/

++    int32_t cu_ed_measure_y[3];

++    /*!< cu_ed_measure_slope[3] edge density config unit - slope values*/

++    int32_t cu_ed_measure_slope[3];

++    /*!< cu_ed_dir_measure_x[4] directional measure config unit - x values*/

++    int32_t cu_ed_dir_measure_x[4];

++    /*!< cu_ed_dir_measure_y[3] directional measure config unit - y values*/

++    int32_t cu_ed_dir_measure_y[3];

++    /*!< cu_ed_dir_measure_slope[3] directional measure config unit - slopes values*/

++    int32_t cu_ed_dir_measure_slope[3];

++    /*!< cu_lin_slope_measure_x[4] slope measure config unit - x values*/

++    int32_t cu_lin_slope_measure_x[4];

++    /*!< cu_lin_slope_measure_y[3] slope measure config unit - y values*/

++    int32_t cu_lin_slope_measure_y[3];

++    /*!< cu_lin_slope_measure_slope[3] slope measure config unit - slope values*/

++    int32_t cu_lin_slope_measure_slope[3];

++    /*!< cu_lin_slope_edge_measure_x[4] edge measure based on linear slope config unit - x values*/

++    int32_t cu_lin_slope_edge_measure_x[4];

++    /*!< cu_lin_slope_edge_measure_y[3] edge measure based on linear slope config unit - y values*/

++    int32_t cu_lin_slope_edge_measure_y[3];

++    /*!< cu_lin_slope_edge_measure_slope[3] edge measure based on linear slope config unit - slope values*/

++    int32_t cu_lin_slope_edge_measure_slope[3];

++    /*!< cu_var_measure_x[4] variance measure config unit - x values*/

++    int32_t cu_var_measure_x[4];

++    /*!< cu_var_measure_y[3] variance measure config unit - y values*/

++    int32_t cu_var_measure_y[3];

++    /*!< cu_var_measure_slope[3] variance measure config unit - slope values*/

++    int32_t cu_var_measure_slope[3];

++    /*!< cu_var_edge_measure_x[4] variance edge measure config unit - x values*/

++    int32_t cu_var_edge_measure_x[4];

++    /*!< cu_var_edge_measure_y[3] variance edge measure config unit - y values*/

++    int32_t cu_var_edge_measure_y[3];

++    /*!< cu_var_edge_measure_slope[3] variance edge measure config unit - slope values*/

++    int32_t cu_var_edge_measure_slope[3];

++    /*!< cu_alpha_i_x[4] alpha change with intensity config unit - x values*/

++    int32_t cu_alpha_i_x[4];

++    /*!< cu_alpha_i_y[3] alpha change with intensity config unit - y values*/

++    int32_t cu_alpha_i_y[3];

++    /*!< cu_alpha_i_slope[3] alpha change with intensity config unit - slopes values*/

++    int32_t cu_alpha_i_slope[3];

++    /*!< start_col The distance along the vertical axis of the first pixel of the frame*/

++    int32_t start_col;

++    /*!< start_row The distance along the horizontal axis of the first pixel of the frame*/

++    int32_t start_row;

++    /*!< delta_y_counter crop supporting register*/

++    int32_t delta_y_counter;

++    /*!< delta_x_counter crop supporting register*/

++    int32_t delta_x_counter;

++    /*!< cu_nm_patch_x[10] noise model config unit - x values*/

++    int32_t cu_nm_patch_x[10];

++    /*!< cu_nm_patch_y[9] noise model config unit - y values*/

++    int32_t cu_nm_patch_y[9];

++    /*!< cu_nm_patch_slope[9] noise model config unit - slope values*/

++    int32_t cu_nm_patch_slope[9];

++    /*!< cu_nm_block_x[10] content detectors noise model config unit - x values*/

++    int32_t cu_nm_block_x[10];

++    /*!< cu_nm_block_y[9] content detectors noise model config unit - y values*/

++    int32_t cu_nm_block_y[9];

++    /*!< cu_nm_block_slope[9] content detectors noise model config unit - slope values*/

++    int32_t cu_nm_block_slope[9];

++    /*!< cu_input_compression_x[16] input compression function (16 to 12 bits) - x values*/

++    int32_t cu_input_compression_x[16];

++    /*!< cu_input_compression_y[15] input compression function (16 to 12 bits) - y values*/

++    int32_t cu_input_compression_y[15];

++    /*!< cu_input_compression_slope[15] input compression function (16 to 12 bits) - slope values*/

++    int32_t cu_input_compression_slope[15];

++    /*!< cu_input_decompression_x[16] input decompression function (16 to 24 bits) - x values*/

++    int32_t cu_input_decompression_x[16];

++    /*!< cu_input_decompression_y[15] input decompression function (16 to 24 bits) - y values*/

++    int32_t cu_input_decompression_y[15];

++    /*!< cu_input_decompression_slope[15] input decompression function (16 to 24 bits) - slope values*/

++    int32_t cu_input_decompression_slope[15];

++    /*!< cu_output_compression_x[16] output compression function (24 to 16 bits) - x values*/

++    int32_t cu_output_compression_x[16];

++    /*!< cu_output_compression_y[15] output compression function (24 to 16 bits) - y values*/

++    int32_t cu_output_compression_y[15];

++    /*!< cu_output_compression_slope[15] output compression function (24 to 16 bits) - slope values*/

++    int32_t cu_output_compression_slope[15];

++    /*!< nm_norm_scale Amount of bits to normalize the noise model*/

++    int32_t nm_norm_scale;

++    /*!< lsc_coeff_lut_gr[32] Shading coeffcients along the distance from the frame optical center*/

++    int32_t lsc_coeff_lut_gr[32];

++    /*!< lsc_coeff_lut_gb[32] Shading coeffcients along the distance from the frame optical center*/

++    int32_t lsc_coeff_lut_gb[32];

++    /*!< lsc_coeff_lut_r[32] Shading coeffcients along the distance from the frame optical center*/

++    int32_t lsc_coeff_lut_r[32];

++    /*!< lsc_coeff_lut_b[32] Shading coeffcients along the distance from the frame optical center*/

++    int32_t lsc_coeff_lut_b[32];

++

++} ia_pal_isp_bnlm_3_3_t;

++

++/*! \isp struct burst_isp

++3A results are passed to burstisp

++*/

++typedef struct

++{

++    /*!< exp_time_us exposure time*/

++    int32_t exp_time_us;

++    /*!< analog_gain Although the parameter is defined as analog_gain we are using it as total_gain. U24.8 precision*/

++    int32_t analog_gain;

++    /*!< wb_gain_gr Absolute WB gain for Gr in U3.13 format*/

++    uint32_t wb_gain_gr;

++    /*!< wb_gain_r Absolute WB gain for R in U3.13 format*/

++    uint32_t wb_gain_r;

++    /*!< wb_gain_b Absolute WB gain for Bin U3.13 format*/

++    uint32_t wb_gain_b;

++    /*!< wb_gain_gb Absolute WB gain for Gb in U3.13 format*/

++    uint32_t wb_gain_gb;

++    /*!< lut_width LUT width*/

++    int32_t lut_width;

++    /*!< lut_height LUT height*/

++    int32_t lut_height;

++    /*!< num_channel Number of channels*/

++    int32_t num_channel;

++    /*!< lut[16384] LUT_width*LUT_height*Num_channel*/

++    int32_t lut[16384];

++

++} ia_pal_isp_burst_isp_t;

++

++/*! \isp struct bxt_3a_ccm

++

++*/

++typedef struct

++{

++    /*!< gain_cx[8] WB coefficients*/

++    int32_t gain_cx[8];

++    /*!< m_1x[4] CCM matrix coefficients M11 - M14*/

++    int32_t m_1x[4];

++    /*!< m_2x[4] CCM matrix coefficients M21 - M24*/

++    int32_t m_2x[4];

++    /*!< m_3x[4] CCM matrix coefficients M31 - M34*/

++    int32_t m_3x[4];

++    /*!< c_0x[8] Y-calc matrix coefficients C01 - C08*/

++    int32_t c_0x[8];

++    /*!< c_1x[8] Y-calc matrix coefficients C11 - C18*/

++    int32_t c_1x[8];

++    /*!< c_2x[8] Y-calc matrix coefficients C21 - C28*/

++    int32_t c_2x[8];

++    /*!< c_3x[8] Y-calc matrix coefficients C31 - C38*/

++    int32_t c_3x[8];

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< ccm_ycalc_en 0: CCM_YCALC is bypassed; 1: CCM_YCALC is enabled*/

++    int32_t ccm_ycalc_en;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++

++} ia_pal_isp_bxt_3a_ccm_t;

++

++/*! \isp struct bxt_acm

++

++*/

++typedef struct

++{

++    /*!< m_acm_bypass Block bypass for HW use*/

++    int32_t m_acm_bypass;

++    /*!< m_enable_chroma_lut Enable Chroma adaptation by LUT*/

++    int32_t m_enable_chroma_lut;

++    /*!< m_enable_luma_lut Enable Luma adaptation by LUT*/

++    int32_t m_enable_luma_lut;

++    /*!< m_enable_negative_pixels enable negative pixels in output*/

++    int32_t m_enable_negative_pixels;

++    /*!< m_enable_chroma_low_light_mode Enable Chroma adaptation in low light mode*/

++    int32_t m_enable_chroma_low_light_mode;

++    /*!< m_enable_luma_low_light_mode Enable Luma adaptation in low light mode*/

++    int32_t m_enable_luma_low_light_mode;

++    /*!< m_num_of_sectors number of sectors, U5.0*/

++    int32_t m_num_of_sectors;

++    /*!< m_chromagrid2uniformlut_cu_x[9] U12.0*/

++    int32_t m_chromagrid2uniformlut_cu_x[9];

++    /*!< m_chromagrid2uniformlut_cu_a[8] S4.10*/

++    int32_t m_chromagrid2uniformlut_cu_a[8];

++    /*!< m_lumagrid2uniformlut_cu_x[9] U12.0*/

++    int32_t m_lumagrid2uniformlut_cu_x[9];

++    /*!< m_lumagrid2uniformlut_cu_a[8] S4.10*/

++    int32_t m_lumagrid2uniformlut_cu_a[8];

++    /*!< m_ccm_matrix_arr[216] CCM's table (one per sector), S3.11*/

++    int32_t m_ccm_matrix_arr[216];

++    /*!< m_hue_boundary_arr[24] Table of sectors boundaries, U11.0*/

++    int32_t m_hue_boundary_arr[24];

++    /*!< m_ccm_index_arr[25] Table of the sectors indices, U5.0*/

++    int32_t m_ccm_index_arr[25];

++    /*!< m_offr CCM bias for R, S13.0*/

++    int32_t m_offr;

++    /*!< m_offg CCM bias for G, S13.0*/

++    int32_t m_offg;

++    /*!< m_offb CCM bias for B, S13.0*/

++    int32_t m_offb;

++    /*!< m_luma_coeff_arr[3] Luna coefficients (weights), U0.8*/

++    int32_t m_luma_coeff_arr[3];

++    /*!< m_adapt_chroma_lut[81] Chroma adaptation LUT, U2.7*/

++    int32_t m_adapt_chroma_lut[81];

++    /*!< m_adapt_luma_lut[81] Luma adaptation LUT, S13.0*/

++    int32_t m_adapt_luma_lut[81];

++    /*!< m_enable_low_light_mode Enable CC's adaptation low light mode*/

++    int32_t m_enable_low_light_mode;

++

++} ia_pal_isp_bxt_acm_t;

++

++/*! \isp struct bxt_aestatistics

++

++*/

++typedef struct

++{

++    /*!< cell0[96] weighted histogram grid values*/

++    int32_t cell0[96];

++    /*!< cell1[96] weighted histogram grid values*/

++    int32_t cell1[96];

++    /*!< cell2[96] weighted histogram grid values*/

++    int32_t cell2[96];

++    /*!< cell3[96] weighted histogram grid values*/

++    int32_t cell3[96];

++    /*!< cell4[96] weighted histogram grid values*/

++    int32_t cell4[96];

++    /*!< cell5[96] weighted histogram grid values*/

++    int32_t cell5[96];

++    /*!< cell6[96] weighted histogram grid values*/

++    int32_t cell6[96];

++    /*!< cell7[96] weighted histogram grid values*/

++    int32_t cell7[96];

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128, 256)*/

++    int32_t block_height;

++    /*!< ae_en 0: FF will not write to the AE  array; 1: FF will write*/

++    int32_t ae_en;

++    /*!< rst_hist_array 1: triggers the reset mechanism for the GLB_HIST*/

++    int32_t rst_hist_array;

++    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++

++} ia_pal_isp_bxt_aestatistics_t;

++

++/*! \isp struct bxt_af_awb_fr_statistics

++

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_height;

++    /*!< grid_height_per_slice # of blocks (vert) per Meta-Data Slice (grid_height_per_slice * grid_width <= 32; grid_height_per_slice <= 2)*/

++    int32_t grid_height_per_slice;

++    /*!< y_fr_en 0: FF will not write to the Y array; 1: FF will write*/

++    int32_t y_fr_en;

++    /*!< awb_fr_en 0: FF will not write to the AWB_FR array; 1: FF will write*/

++    int32_t awb_fr_en;

++    /*!< ff_en 0: FF is bypassed; 1: FF is enabled*/

++    int32_t ff_en;

++    /*!< x_start X top left corner of the grid. 20 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= x_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end <= (frame_width - 1 - 20)*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end <= (frame_height - 1)*/

++    int32_t y_end;

++    /*!< shftr_val_x[7] represents log2(num of pixels of the estimated colour component in a block) for Y00, Y01, Y10, Y11, R, G, B*/

++    int32_t shftr_val_x[7];

++    /*!< gx0[4] Ycalc contribution ratio for Pat_ij*/

++    int32_t gx0[4];

++    /*!< gx1[4] Ycalc contribution ratio for Pat_ij*/

++    int32_t gx1[4];

++    /*!< gx2[4] Ycalc contribution ratio for Pat_ij*/

++    int32_t gx2[4];

++    /*!< gx3[4] Ycalc contribution ratio for Pat_ij*/

++    int32_t gx3[4];

++    /*!< mask_y0 selecting the relevant pixels for Y0; bit k corresponds to Row * 4 + Column*/

++    int32_t mask_y0;

++    /*!< mask_y1 selecting the relevant pixels for Y1; bit k corresponds to Row * 4 + Column*/

++    int32_t mask_y1;

++    /*!< oe_y0 Output Enable for Y0; bit k corresponds to Row * 2 + Column*/

++    int32_t oe_y0;

++    /*!< oe_y1 Output Enable for Y1; bit k corresponds to Row * 2 + Column*/

++    int32_t oe_y1;

++    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y0[4];

++    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y1[4];

++    /*!< r_select selecting the relevant R pixels; bit k corresponds to Row * 4 + Column*/

++    int32_t r_select;

++    /*!< g_select selecting the relevant G pixels; bit k corresponds to Row * 4 + Column + 16*/

++    int32_t g_select;

++    /*!< b_select selecting the relevant B pixels; bit k corresponds to Row * 4 + Column*/

++    int32_t b_select;

++    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y00_filter_coeff[6];

++    /*!< y00_filter_sign_vec sign vector for Y00*/

++    int32_t y00_filter_sign_vec;

++    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y01_filter_coeff[6];

++    /*!< y01_filter_sign_vec sign vector for Y01*/

++    int32_t y01_filter_sign_vec;

++    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y10_filter_coeff[6];

++    /*!< y10_filter_sign_vec sign vector for Y10*/

++    int32_t y10_filter_sign_vec;

++    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y11_filter_coeff[6];

++    /*!< y11_filter_sign_vec sign vector for Y11*/

++    int32_t y11_filter_sign_vec;

++    /*!< r_filter_coeff[6] filter coefficients for R (A1, A2, A3, A4, A5, A6)*/

++    int32_t r_filter_coeff[6];

++    /*!< r_filter_sign_vec sign vector for R*/

++    int32_t r_filter_sign_vec;

++    /*!< g_filter_coeff[6] filter coefficients for G (A1, A2, A3, A4, A5, A6)*/

++    int32_t g_filter_coeff[6];

++    /*!< g_filter_sign_vec sign vector for G*/

++    int32_t g_filter_sign_vec;

++    /*!< b_filter_coeff[6] filter coefficients for B (A1, A2, A3, A4, A5, A6)*/

++    int32_t b_filter_coeff[6];

++    /*!< b_filter_sign_vec sign vector for B*/

++    int32_t b_filter_sign_vec;

++    /*!< nf_x[7] Filter response normalization factors for Y00, Y01, Y10, Y11, R, G, B*/

++    int32_t nf_x[7];

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++

++} ia_pal_isp_bxt_af_awb_fr_statistics_t;

++

++/*! \isp struct bxt_applycorrection

++

++*/

++typedef struct

++{

++    /*!< global_enable global enable*/

++    int32_t global_enable;

++    /*!< gdc_enable gdc enable*/

++    int32_t gdc_enable;

++    /*!< dpc_enable dpc enable*/

++    int32_t dpc_enable;

++    /*!< green_pos gb position*/

++    int32_t green_pos;

++

++} ia_pal_isp_bxt_applycorrection_t;

++

++/*! \isp struct bxt_awbstatistics

++

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

++    int32_t block_height;

++    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 160)*/

++    int32_t grid_height_per_slice;

++    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

++    int32_t awb_en;

++    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

++    int32_t rgbs_incl_sat;

++    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

++    int32_t rgbs_thr_cx[8];

++    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

++    int32_t shftr_val_cx[8];

++    /*!< shftr_sat represents log2(num of pixels in cell)*/

++    int32_t shftr_sat;

++

++} ia_pal_isp_bxt_awbstatistics_t;

++

++/*! \isp struct bxt_blc

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

++    int32_t dummy_bypass;

++    /*!< fixobc00 black level value*/

++    int32_t fixobc00;

++    /*!< fixobc01 black level value*/

++    int32_t fixobc01;

++    /*!< fixobc02 black level value*/

++    int32_t fixobc02;

++    /*!< fixobc03 black level value*/

++    int32_t fixobc03;

++    /*!< fixobc10 black level value*/

++    int32_t fixobc10;

++    /*!< fixobc11 black level value*/

++    int32_t fixobc11;

++    /*!< fixobc12 black level value*/

++    int32_t fixobc12;

++    /*!< fixobc13 black level value*/

++    int32_t fixobc13;

++    /*!< fixobc20 black level value*/

++    int32_t fixobc20;

++    /*!< fixobc21 black level value*/

++    int32_t fixobc21;

++    /*!< fixobc22 black level value*/

++    int32_t fixobc22;

++    /*!< fixobc23 black level value*/

++    int32_t fixobc23;

++    /*!< fixobc30 black level value*/

++    int32_t fixobc30;

++    /*!< fixobc31 black level value*/

++    int32_t fixobc31;

++    /*!< fixobc32 black level value*/

++    int32_t fixobc32;

++    /*!< fixobc33 black level value*/

++    int32_t fixobc33;

++

++} ia_pal_isp_bxt_blc_t;

++

++/*! \isp struct bxt_blc_b

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

++    int32_t dummy_bypass;

++    /*!< fixobc00 black level value*/

++    int32_t fixobc00;

++    /*!< fixobc01 black level value*/

++    int32_t fixobc01;

++    /*!< fixobc02 black level value*/

++    int32_t fixobc02;

++    /*!< fixobc03 black level value*/

++    int32_t fixobc03;

++    /*!< fixobc10 black level value*/

++    int32_t fixobc10;

++    /*!< fixobc11 black level value*/

++    int32_t fixobc11;

++    /*!< fixobc12 black level value*/

++    int32_t fixobc12;

++    /*!< fixobc13 black level value*/

++    int32_t fixobc13;

++    /*!< fixobc20 black level value*/

++    int32_t fixobc20;

++    /*!< fixobc21 black level value*/

++    int32_t fixobc21;

++    /*!< fixobc22 black level value*/

++    int32_t fixobc22;

++    /*!< fixobc23 black level value*/

++    int32_t fixobc23;

++    /*!< fixobc30 black level value*/

++    int32_t fixobc30;

++    /*!< fixobc31 black level value*/

++    int32_t fixobc31;

++    /*!< fixobc32 black level value*/

++    int32_t fixobc32;

++    /*!< fixobc33 black level value*/

++    int32_t fixobc33;

++

++} ia_pal_isp_bxt_blc_b_t;

++

++/*! \isp struct bxt_blc_c

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++    /*!< dummy_bypass dumy bypass for the filter. Required to allign block API to RTL registers*/

++    int32_t dummy_bypass;

++    /*!< fixobc00 black level value*/

++    int32_t fixobc00;

++    /*!< fixobc01 black level value*/

++    int32_t fixobc01;

++    /*!< fixobc02 black level value*/

++    int32_t fixobc02;

++    /*!< fixobc03 black level value*/

++    int32_t fixobc03;

++    /*!< fixobc10 black level value*/

++    int32_t fixobc10;

++    /*!< fixobc11 black level value*/

++    int32_t fixobc11;

++    /*!< fixobc12 black level value*/

++    int32_t fixobc12;

++    /*!< fixobc13 black level value*/

++    int32_t fixobc13;

++    /*!< fixobc20 black level value*/

++    int32_t fixobc20;

++    /*!< fixobc21 black level value*/

++    int32_t fixobc21;

++    /*!< fixobc22 black level value*/

++    int32_t fixobc22;

++    /*!< fixobc23 black level value*/

++    int32_t fixobc23;

++    /*!< fixobc30 black level value*/

++    int32_t fixobc30;

++    /*!< fixobc31 black level value*/

++    int32_t fixobc31;

++    /*!< fixobc32 black level value*/

++    int32_t fixobc32;

++    /*!< fixobc33 black level value*/

++    int32_t fixobc33;

++

++} ia_pal_isp_bxt_blc_c_t;

++

++/*! \isp struct bxt_bnlm

++

++*/

++typedef struct

++{

++    /*!< div_unit_slope[15] DIV_UNIT_SLOPE - fixed value array for config unit*/

++    int32_t div_unit_slope[15];

++    /*!< div_unit_x[16] DIV_UNIT_X - fixed value array for config unit*/

++    int32_t div_unit_x[16];

++    /*!< div_unit_y[15] DIV_UNIT_Y - fixed value array for config unit*/

++    int32_t div_unit_y[15];

++    /*!< m_bypass Block bypass for HW use*/

++    int32_t m_bypass;

++    /*!< m_bcandshift1[4] m_BCandShift1: Group B candidate factoring params*/

++    int32_t m_bcandshift1[4];

++    /*!< m_bcandshift2[4] m_BCandShift2: Group B candidate factoring params*/

++    int32_t m_bcandshift2[4];

++    /*!< m_bcandsubflag[4] m_BCandSubFlag: Group B candidate factoring params*/

++    int32_t m_bcandsubflag[4];

++    /*!< m_ccandshift1[4] m_CCandShift1: Group C candidate factoring params*/

++    int32_t m_ccandshift1[4];

++    /*!< m_ccandshift2[4] m_CCandShift2:  Group C candidate factoring params*/

++    int32_t m_ccandshift2[4];

++    /*!< m_ccandsubflag[4] m_CCandSubFlag:  Group C candidate factoring params*/

++    int32_t m_ccandsubflag[4];

++    /*!< m_candconstellation[2] m_CandConstellation: (0,1,2)  (1=Dendse 10x10 for Y video  0=16x16 sparse for Bayer)    2=Obsolete   input format related params;   Only first element is in use*/

++    int32_t m_candconstellation[2];

++    /*!< m_dcandshift1[4] m_DCandShift1:  Group D candidate factoring params*/

++    int32_t m_dcandshift1[4];

++    /*!< m_dcandshift2[4] m_DCandShift2:   Group D candidate factoring params*/

++    int32_t m_dcandshift2[4];

++    /*!< m_dcandsubflag[4] m_DCandSubFlag:   Group D candidate factoring params*/

++    int32_t m_dcandsubflag[4];

++    /*!< m_detail_radial_lut_f1[12] m_DETAIL_RADIAL_LUT_f1*/

++    int32_t m_detail_radial_lut_f1[12];

++    /*!< m_detail_radial_lut_f2[12] m_DETAIL_RADIAL_LUT_f2*/

++    int32_t m_detail_radial_lut_f2[12];

++    /*!< m_detail_radial_lut_s1[12] m_DETAIL_RADIAL_LUT_s1*/

++    int32_t m_detail_radial_lut_s1[12];

++    /*!< m_detail_radial_lut_s2[12] m_DETAIL_RADIAL_LUT_s2*/

++    int32_t m_detail_radial_lut_s2[12];

++    /*!< m_detail_radial_lut_s3[12] m_DETAIL_RADIAL_LUT_s3*/

++    int32_t m_detail_radial_lut_s3[12];

++    /*!< m_detail_radial_lut_v[12] m_DETAIL_RADIAL_LUT_v*/

++    int32_t m_detail_radial_lut_v[12];

++    /*!< m_exp_lut_f1[12] m_EXP_LUT_f1*/

++    int32_t m_exp_lut_f1[12];

++    /*!< m_exp_lut_f2[12] m_EXP_LUT_f2*/

++    int32_t m_exp_lut_f2[12];

++    /*!< m_exp_lut_o[12] m_EXP_LUT_o*/

++    int32_t m_exp_lut_o[12];

++    /*!< m_exp_lut_s1[12] m_EXP_LUT_s1*/

++    int32_t m_exp_lut_s1[12];

++    /*!< m_exp_lut_s2[12] m_EXP_LUT_s2*/

++    int32_t m_exp_lut_s2[12];

++    /*!< m_exp_lut_s3[12] m_EXP_LUT_s3*/

++    int32_t m_exp_lut_s3[12];

++    /*!< m_exp_lut_v[12] m_EXP_LUT_v*/

++    int32_t m_exp_lut_v[12];

++    /*!< m_frame_width OBSOLETE*/

++    int32_t m_frame_width;

++    /*!< m_matchqualitymaxidx[4] OBSOLETE*/

++    int32_t m_matchqualitymaxidx[4];

++    /*!< m_mu_root_lut_f1[12] m_MU_ROOT_LUT_f1*/

++    int32_t m_mu_root_lut_f1[12];

++    /*!< m_mu_root_lut_f2[12] m_MU_ROOT_LUT_f2*/

++    int32_t m_mu_root_lut_f2[12];

++    /*!< m_mu_root_lut_s1[12] m_MU_ROOT_LUT_s1*/

++    int32_t m_mu_root_lut_s1[12];

++    /*!< m_mu_root_lut_s2[12] m_MU_ROOT_LUT_s2*/

++    int32_t m_mu_root_lut_s2[12];

++    /*!< m_mu_root_lut_s3[12] m_MU_ROOT_LUT_s3*/

++    int32_t m_mu_root_lut_s3[12];

++    /*!< m_mu_root_lut_v[12] m_MU_ROOT_LUT_v*/

++    int32_t m_mu_root_lut_v[12];

++    /*!< m_nl_lut1_f1[10] m_NL_LUT1_f1*/

++    int32_t m_nl_lut1_f1[10];

++    /*!< m_nl_lut1_f2[10] m_NL_LUT1_f1*/

++    int32_t m_nl_lut1_f2[10];

++    /*!< m_nl_lut1_s1[10] m_NL_LUT1_s1*/

++    int32_t m_nl_lut1_s1[10];

++    /*!< m_nl_lut1_s2[10] m_NL_LUT1_s2*/

++    int32_t m_nl_lut1_s2[10];

++    /*!< m_nl_lut1_s3[10] m_NL_LUT1_s2*/

++    int32_t m_nl_lut1_s3[10];

++    /*!< m_nl_lut1_v[10] m_NL_LUT1_v*/

++    int32_t m_nl_lut1_v[10];

++    /*!< m_nl_lut2_f1[10] m_NL_LUT2_f1*/

++    int32_t m_nl_lut2_f1[10];

++    /*!< m_nl_lut2_f2[10] m_NL_LUT2_f1*/

++    int32_t m_nl_lut2_f2[10];

++    /*!< m_nl_lut2_s1[10] m_NL_LUT2_s1*/

++    int32_t m_nl_lut2_s1[10];

++    /*!< m_nl_lut2_s2[10] m_NL_LUT2_s2*/

++    int32_t m_nl_lut2_s2[10];

++    /*!< m_nl_lut2_s3[10] m_NL_LUT2_s2*/

++    int32_t m_nl_lut2_s3[10];

++    /*!< m_nl_lut2_v[10] m_NL_LUT2_v*/

++    int32_t m_nl_lut2_v[10];

++    /*!< m_nl_lut3_f1[10] m_NL_LUT3_f1*/

++    int32_t m_nl_lut3_f1[10];

++    /*!< m_nl_lut3_f2[10] m_NL_LUT3_f1*/

++    int32_t m_nl_lut3_f2[10];

++    /*!< m_nl_lut3_s1[10] m_NL_LUT3_s1*/

++    int32_t m_nl_lut3_s1[10];

++    /*!< m_nl_lut3_s2[10] m_NL_LUT3_s2*/

++    int32_t m_nl_lut3_s2[10];

++    /*!< m_nl_lut3_s3[10] m_NL_LUT3_s2*/

++    int32_t m_nl_lut3_s3[10];

++    /*!< m_nl_lut3_v[10] m_NL_LUT3_v*/

++    int32_t m_nl_lut3_v[10];

++    /*!< m_nl_lut4_f1[10] m_NL_LUT4_f1*/

++    int32_t m_nl_lut4_f1[10];

++    /*!< m_nl_lut4_f2[10] m_NL_LUT4_f1*/

++    int32_t m_nl_lut4_f2[10];

++    /*!< m_nl_lut4_s1[10] m_NL_LUT4_s1*/

++    int32_t m_nl_lut4_s1[10];

++    /*!< m_nl_lut4_s2[10] m_NL_LUT4_s2*/

++    int32_t m_nl_lut4_s2[10];

++    /*!< m_nl_lut4_s3[10] m_NL_LUT4_s2*/

++    int32_t m_nl_lut4_s3[10];

++    /*!< m_nl_lut4_v[10] m_NL_LUT4_v*/

++    int32_t m_nl_lut4_v[10];

++    /*!< m_nl_th[3] m_NL_TH: detailIx-->detailType 3 THs for classification 1=Flat.vs.Weak; 2=Weak.vs.Texture 3=Texture.vs.Edge 4=OBSOLETE & not implemented*/

++    int32_t m_nl_th[3];

++    /*!< m_radial_power_lut_f1[12] m_RADIAL_POWER_LUT_f1*/

++    int32_t m_radial_power_lut_f1[12];

++    /*!< m_radial_power_lut_f2[12] m_RADIAL_POWER_LUT_f2*/

++    int32_t m_radial_power_lut_f2[12];

++    /*!< m_radial_power_lut_s1[12] m_RADIAL_POWER_LUT_s1*/

++    int32_t m_radial_power_lut_s1[12];

++    /*!< m_radial_power_lut_s2[12] m_RADIAL_POWER_LUT_s2*/

++    int32_t m_radial_power_lut_s2[12];

++    /*!< m_radial_power_lut_s3[12] m_RADIAL_POWER_LUT_s3*/

++    int32_t m_radial_power_lut_s3[12];

++    /*!< m_radial_power_lut_v[12] m_RADIAL_POWER_LUT_v*/

++    int32_t m_radial_power_lut_v[12];

++    /*!< m_rxinitial m_RxInitial: Radial  (coordinates of corner) - Initial X [0,m_frame_width-1]  Default=m_frame_width/2*/

++    int32_t m_rxinitial;

++    /*!< m_rxsqrinitial m_RxSqrInitial: m_RxInitial^2*/

++    int32_t m_rxsqrinitial;

++    /*!< m_ryinitial m_RyInitial: : Radial  (coordinates of corner) - Initial Y [0,m_frame_height-1]  Default=m_frame_height/2*/

++    int32_t m_ryinitial;

++    /*!< m_rysqrinitial m_RySqrInitial: m_RyInitial^2*/

++    int32_t m_rysqrinitial;

++    /*!< m_sad_norm_lut_f1[12] m_SAD_NORM_LUT_f1*/

++    int32_t m_sad_norm_lut_f1[12];

++    /*!< m_sad_norm_lut_f2[12] m_SAD_NORM_LUT_f2*/

++    int32_t m_sad_norm_lut_f2[12];

++    /*!< m_sad_norm_lut_s1[12] m_SAD_NORM_LUT_s1*/

++    int32_t m_sad_norm_lut_s1[12];

++    /*!< m_sad_norm_lut_s2[12] m_SAD_NORM_LUT_s2*/

++    int32_t m_sad_norm_lut_s2[12];

++    /*!< m_sad_norm_lut_s3[12] m_SAD_NORM_LUT_s3*/

++    int32_t m_sad_norm_lut_s3[12];

++    /*!< m_sad_norm_lut_v[12] m_SAD_NORM_LUT_v*/

++    int32_t m_sad_norm_lut_v[12];

++    /*!< m_sig_n_detail_lut_f1[10] m_SIG_N_DETAIL_LUT_f1*/

++    int32_t m_sig_n_detail_lut_f1[10];

++    /*!< m_sig_n_detail_lut_f2[10] m_SIG_N_DETAIL_LUT_f1*/

++    int32_t m_sig_n_detail_lut_f2[10];

++    /*!< m_sig_n_detail_lut_s1[10] m_SIG_N_DETAIL_LUT_s1*/

++    int32_t m_sig_n_detail_lut_s1[10];

++    /*!< m_sig_n_detail_lut_s2[10] m_SIG_N_DETAIL_LUT_s2*/

++    int32_t m_sig_n_detail_lut_s2[10];

++    /*!< m_sig_n_detail_lut_s3[10] m_SIG_N_DETAIL_LUT_s2*/

++    int32_t m_sig_n_detail_lut_s3[10];

++    /*!< m_sig_n_detail_lut_v[10] m_SIG_N_DETAIL_LUT_v*/

++    int32_t m_sig_n_detail_lut_v[10];

++    /*!< m_sig_n_rad_lut_f1[12] m_SIG_N_RAD_LUT_f1*/

++    int32_t m_sig_n_rad_lut_f1[12];

++    /*!< m_sig_n_rad_lut_f2[12] m_SIG_N_RAD_LUT_f2*/

++    int32_t m_sig_n_rad_lut_f2[12];

++    /*!< m_sig_n_rad_lut_s1[12] m_SIG_N_RAD_LUT_s1*/

++    int32_t m_sig_n_rad_lut_s1[12];

++    /*!< m_sig_n_rad_lut_s2[12] m_SIG_N_RAD_LUT_s2*/

++    int32_t m_sig_n_rad_lut_s2[12];

++    /*!< m_sig_n_rad_lut_s3[12] m_SIG_N_RAD_LUT_s3*/

++    int32_t m_sig_n_rad_lut_s3[12];

++    /*!< m_sig_n_rad_lut_v[12] m_SIG_N_RAD_LUT_v*/

++    int32_t m_sig_n_rad_lut_v[12];

++    /*!< m_sve_groups m_SVE_Groups: OBSOLETE*/

++    int32_t m_sve_groups;

++    /*!< m_sve_enable m_SVE_enable: OBSOLETE*/

++    int32_t m_sve_enable;

++    /*!< m_sve_gain[2] m_SVE_gain: OBSOLETE*/

++    int32_t m_sve_gain[2];

++    /*!< m_sve_shift[2] m_SVE_shift: OBSOLETE*/

++    int32_t m_sve_shift[2];

++    /*!< m_signglobal_shift1 m_SigNGlobal_SHIFT1: OBSOLETE*/

++    int32_t m_signglobal_shift1;

++    /*!< m_signglobal_shift2 m_SigNGlobal_SHIFT2: OBSOLETE*/

++    int32_t m_signglobal_shift2;

++    /*!< m_signglobal_sub_flag m_SigNGlobal_SUB_FLAG: OBSOLETE*/

++    int32_t m_signglobal_sub_flag;

++    /*!< m_detailidxshiftleft m_detailIdxShiftLeft: detail index shift left - Dynamic range normalization  Fixed=2  [2:7]*/

++    int32_t m_detailidxshiftleft;

++    /*!< m_matchqualitycands[16] m_matchQualityCands: match quality index weight pick  4X4   alpha0 inputs  (4 canidates [ 0*/

++    int32_t m_matchqualitycands[16];

++    /*!< m_ncandforavgpixel[4] m_nCandForAvgPixel: number of cands. for average pixel  per detail Type  (15..0)+1  Typically=[16 6 4 6]*/

++    int32_t m_ncandforavgpixel[4];

++    /*!< m_sortth[15] m_sortTh: sort th index set - THs for Pseudo SORT (Const not to be configured)*/

++    int32_t m_sortth[15];

++    /*!< m_statusetopleft m_statUseTopLeft: is top left pixel G/W  (for Bayer start)*/

++    int32_t m_statusetopleft;

++    /*!< m_wmaxminth m_wMaxMinTh: Final TH on Max(Weight) to overright Alpha*/

++    int32_t m_wmaxminth;

++    /*!< m_wsumminth m_wSumMinTh:  Final TH on Sum(Weight) to overright Alpha*/

++    int32_t m_wsumminth;

++    /*!< rad_enable OBSOLETE*/

++    int32_t rad_enable;

++

++} ia_pal_isp_bxt_bnlm_t;

++

++/*! \isp struct bxt_ccm

++

++*/

++typedef struct

++{

++    /*!< bypass block bypass bit*/

++    int32_t bypass;

++    /*!< nb1 offset 1 for the transform*/

++    int32_t nb1;

++    /*!< nb2 offset 2 for the transform*/

++    int32_t nb2;

++    /*!< nb3 offset 3 for the transform*/

++    int32_t nb3;

++    /*!< configuration_matrix[9] ccm configuration matrix precision: S4.11*/

++    int32_t configuration_matrix[9];

++

++} ia_pal_isp_bxt_ccm_t;

++

++/*! \isp struct bxt_convert16sto8u

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++

++} ia_pal_isp_bxt_convert16sto8u_t;

++

++/*! \isp struct bxt_cropstills

++

++*/

++typedef struct

++{

++    /*!< Bypass block bypass*/

++    int32_t Bypass;

++    /*!< LeftBorder crop left border*/

++    int32_t LeftBorder;

++    /*!< TopBorder crop top border*/

++    int32_t TopBorder;

++    /*!< RightBorder crop right border*/

++    int32_t RightBorder;

++    /*!< BottomBorder crop bottom border*/

++    int32_t BottomBorder;

++

++} ia_pal_isp_bxt_cropstills_t;

++

++/*! \isp struct bxt_cropvideo

++

++*/

++typedef struct

++{

++    /*!< Bypass block bypass*/

++    int32_t Bypass;

++    /*!< LeftBorder crop left border*/

++    int32_t LeftBorder;

++    /*!< TopBorder crop top border*/

++    int32_t TopBorder;

++    /*!< RightBorder crop right border*/

++    int32_t RightBorder;

++    /*!< BottomBorder crop bottom border*/

++    int32_t BottomBorder;

++

++} ia_pal_isp_bxt_cropvideo_t;

++

++/*! \isp struct bxt_csc

++

++*/

++typedef struct

++{

++    /*!< m_csc_c_matrix_arr[9] CSC Matrix components (S0.14)*/

++    int32_t m_csc_c_matrix_arr[9];

++    /*!< m_csc_b_vec_arr[3] CSC Vector components (S0.13)*/

++    int32_t m_csc_b_vec_arr[3];

++    /*!< m_chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/

++    int32_t m_chroma_ds_coeff_arr[8];

++    /*!< m_chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/

++    int32_t m_chroma_ds_nf;

++    /*!< m_bypass Bypassing CSC. Outputting RGB to the Chroma downscale*/

++    int32_t m_bypass;

++    /*!< m_uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/

++    int32_t m_uv_bin_output;

++

++} ia_pal_isp_bxt_csc_t;

++

++/*! \isp struct bxt_csc_yuv2rgb

++CSC YUV2RGB Block

++*/

++typedef struct

++{

++    /*!< coeff_shift coeff_shift*/

++    int32_t coeff_shift;

++    /*!< yuv_calibration[3] yuv_calibration*/

++    int32_t yuv_calibration[3];

++    /*!< yuv2rgb_coef[9] yuv2rgb_coef*/

++    int32_t yuv2rgb_coef[9];

++

++} ia_pal_isp_bxt_csc_yuv2rgb_t;

++

++/*! \isp struct bxt_csc2

++Color Space Conversion and down-sample to 4:2:0

++*/

++typedef struct

++{

++    /*!< bypass_0_1 Bypass CSC2*/

++    int32_t bypass_0_1;

++    /*!< use_fir_flag use ani-aliasing filter before decimation*/

++    int32_t use_fir_flag;

++    /*!< rgb2yuv_coef[3] 3 coefs for Y , 1 for U and 1 for V , Q15*/

++    int32_t rgb2yuv_coef[3];

++

++} ia_pal_isp_bxt_csc2_t;

++

++/*! \isp struct bxt_demosaic

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< frame_width Frame width*/

++    int32_t frame_width;

++    /*!< gammasg Sharpening coefficient*/

++    int32_t gammasg;

++    /*!< lcctrl Checkers removal control*/

++    int32_t lcctrl;

++    /*!< crparam1 High frequency denoise param1*/

++    int32_t crparam1;

++    /*!< crparam2 High frequency denoise param2*/

++    int32_t crparam2;

++    /*!< coringparam False color correction gain*/

++    int32_t coringparam;

++    /*!< char_en Checkers removal enable*/

++    int32_t char_en;

++    /*!< fcc_en False color correction enable*/

++    int32_t fcc_en;

++    /*!< car_en Chroam artifacts removal enable*/

++    int32_t car_en;

++    /*!< hfar_en High frequency aliasing reduction correction enable*/

++    int32_t hfar_en;

++    /*!< es_enable Edge smoothing enable*/

++    int32_t es_enable;

++    /*!< es_pow Edge smoohing enable.*/

++    int32_t es_pow;

++    /*!< diag_car_trade_off_th Diagonal regions protection param1*/

++    int32_t diag_car_trade_off_th;

++    /*!< diag_car_trade_off_slope Diagonal regions protection param2*/

++    int32_t diag_car_trade_off_slope;

++    /*!< stream_ylp_c Coefficient for the YLP for central element of 3x3 neighborhood*/

++    int32_t stream_ylp_c;

++    /*!< stream_ylp_p Coefficient for the YLP for peripheral element of 3x3 neighborhood*/

++    int32_t stream_ylp_p;

++    /*!< stream_ylp_d Coefficient for the YLP for diagonal element of 3x3 neighborhood*/

++    int32_t stream_ylp_d;

++    /*!< stream_ylp_mul_norm Coefficient for multiplier in YLP stream*/

++    int32_t stream_ylp_mul_norm;

++    /*!< stream_ylp_norm_shift Coefficient for YLP stream*/

++    int32_t stream_ylp_norm_shift;

++    /*!< configunitdiag1_x[2] CU_DIAG1 - x input*/

++    int32_t configunitdiag1_x[2];

++    /*!< configunitdiag2_x[2] CU_DIAG2 - x input*/

++    int32_t configunitdiag2_x[2];

++    /*!< configunitdiag3_x[2] CU_DIAG3 - x input*/

++    int32_t configunitdiag3_x[2];

++    /*!< configunitcar_sat_x[2] CU_CAR_SAT - x input*/

++    int32_t configunitcar_sat_x[2];

++    /*!< configunitdiag1_y[1] CU_DIAG1 - y input*/

++    int32_t configunitdiag1_y[1];

++    /*!< configunitdiag1_slope[1] CU_DIAG1 - slope input*/

++    int32_t configunitdiag1_slope[1];

++    /*!< configunitdiag2_y[1] CU_DIAG2 - y input*/

++    int32_t configunitdiag2_y[1];

++    /*!< configunitdiag2_slope[1] CU_DIAG2 - slope input*/

++    int32_t configunitdiag2_slope[1];

++    /*!< configunitdiag3_y[1] CU_DIAG3 - y input*/

++    int32_t configunitdiag3_y[1];

++    /*!< configunitdiag3_slope[1] CU_DIAG3 - slope input*/

++    int32_t configunitdiag3_slope[1];

++    /*!< configunitcar_sat_y[1] CU_CAR_SAT - y input*/

++    int32_t configunitcar_sat_y[1];

++    /*!< configunitcar_sat_slope[1] CU_CAR_SAT - slope input*/

++    int32_t configunitcar_sat_slope[1];

++

++} ia_pal_isp_bxt_demosaic_t;

++

++/*! \isp struct bxt_disparity

++

++*/

++typedef struct

++{

++    /*!< green_pos gb position*/

++    int32_t green_pos;

++    /*!< lc_cu_x[4] local contrast config unit x*/

++    int32_t lc_cu_x[4];

++    /*!< lc_cu_y[3] local contrast config unit y*/

++    int32_t lc_cu_y[3];

++    /*!< lc_cu_slope[3] local contrast config unit slope*/

++    int32_t lc_cu_slope[3];

++    /*!< delta_cu_x[4] delta config unit x*/

++    int32_t delta_cu_x[4];

++    /*!< delta_cu_y[3] delta config unit y*/

++    int32_t delta_cu_y[3];

++    /*!< delta_cu_slope[3] delta config unit slope*/

++    int32_t delta_cu_slope[3];

++    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/

++    int32_t inv_lc_cu_x[8];

++    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/

++    int32_t inv_lc_cu_y[7];

++    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/

++    int32_t inv_lc_cu_slope[7];

++    /*!< inv_delta_cu_x[8] inverse delta config unit x*/

++    int32_t inv_delta_cu_x[8];

++    /*!< inv_delta_cu_y[7] inverse delta config unit y*/

++    int32_t inv_delta_cu_y[7];

++    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/

++    int32_t inv_delta_cu_slope[7];

++    /*!< detail_pres detail preservation factor*/

++    int32_t detail_pres;

++    /*!< invscale scale factor after normalizing by inverse*/

++    int32_t invscale;

++

++} ia_pal_isp_bxt_disparity_t;

++

++/*! \isp struct bxt_dpc

++

++*/

++typedef struct

++{

++    /*!< afxoffset[8] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

++    int32_t afxoffset[8];

++    /*!< afxperiod[8] 8 Autofocus pixels X axis period*/

++    int32_t afxperiod[8];

++    /*!< afyoffset[8] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

++    int32_t afyoffset[8];

++    /*!< afyperiod[8] 8 Autofocus pixels Y axis period*/

++    int32_t afyperiod[8];

++    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

++    int32_t hdrfactors[16];

++    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

++    int32_t hdrfactorsinverse[16];

++    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_slope[7];

++    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_x[8];

++    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_y[7];

++    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_slope[7];

++    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_x[8];

++    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_y[7];

++    /*!< configunitfix_slope[3] fix config unit*/

++    int32_t configunitfix_slope[3];

++    /*!< configunitfix_x[4] fix config unit*/

++    int32_t configunitfix_x[4];

++    /*!< configunitfix_y[3] fix config unit*/

++    int32_t configunitfix_y[3];

++    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_slope[7];

++    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_x[8];

++    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_y[7];

++    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_slope[7];

++    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_x[8];

++    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_y[7];

++    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

++    int32_t configunitrawvslb_slope[7];

++    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

++    int32_t configunitrawvslb_x[8];

++    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

++    int32_t configunitrawvslb_y[7];

++    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

++    int32_t configunitrawvsub_slope[7];

++    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

++    int32_t configunitrawvsub_x[8];

++    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

++    int32_t configunitrawvsub_y[7];

++    /*!< curx[1024] x locations of the static bad pixels*/

++    int32_t curx[1024];

++    /*!< cury[1024] y locations of the static bad pixels*/

++    int32_t cury[1024];

++    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t lbtype[16];

++    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t ubtype[16];

++    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

++    int32_t pelesttype[16];

++    /*!< dtype[16] 0-D1 1-D2  2-D3*/

++    int32_t dtype[16];

++    /*!< lbmasks[64] configurations related to the bayer pattern*/

++    int32_t lbmasks[64];

++    /*!< ubmasks[64] configurations related to the bayer pattern*/

++    int32_t ubmasks[64];

++    /*!< pmasks[384] configurations related to the bayer pattern*/

++    int32_t pmasks[384];

++    /*!< dmasks[48] configurations related to the bayer pattern*/

++    int32_t dmasks[48];

++    /*!< bitreduceshift Shift value for bit reduce block*/

++    int32_t bitreduceshift;

++    /*!< afenable enable for the AF unit block*/

++    int32_t afenable;

++    /*!< staticenable enable for the static LUT block*/

++    int32_t staticenable;

++    /*!< dynamicenable enable for the dynamic detection block*/

++    int32_t dynamicenable;

++    /*!< n_static_lut_entries number of static lut entries*/

++    int32_t n_static_lut_entries;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< frame_height frame height*/

++    int32_t frame_height;

++    /*!< paf_grid0_en paf enable0*/

++    int32_t paf_grid0_en;

++    /*!< paf_grid1_en paf enable1*/

++    int32_t paf_grid1_en;

++    /*!< paf_grid2_en paf enable2*/

++    int32_t paf_grid2_en;

++    /*!< paf_grid3_en paf enable3*/

++    int32_t paf_grid3_en;

++    /*!< paf_grid4_en paf enable4*/

++    int32_t paf_grid4_en;

++    /*!< paf_grid5_en paf enable5*/

++    int32_t paf_grid5_en;

++    /*!< paf_grid6_en paf enable6*/

++    int32_t paf_grid6_en;

++    /*!< paf_grid7_en paf enable7*/

++    int32_t paf_grid7_en;

++

++} ia_pal_isp_bxt_dpc_t;

++

++/*! \isp struct bxt_dpcm_decode

++

++*/

++typedef struct

++{

++    /*!< first_pix_res first pixel resolution*/

++    int32_t first_pix_res;

++    /*!< bypass block bypass bit*/

++    int32_t bypass;

++    /*!< code[6] The codes array*/

++    int32_t code[6];

++    /*!< codethr[6] The threshold for using the next code*/

++    int32_t codethr[6];

++    /*!< codemask[6] Used for extracting the code from the coded word*/

++    int32_t codemask[6];

++    /*!< valuemask[6] Used for extracting the value from the coded word*/

++    int32_t valuemask[6];

++    /*!< signmask[6] Used for extracting the sign from the coded word*/

++    int32_t signmask[6];

++    /*!< lowresthrnum Code threshold for lower resolution coding*/

++    int32_t lowresthrnum;

++

++} ia_pal_isp_bxt_dpcm_decode_t;

++

++/*! \isp struct bxt_dpcm_encode

++

++*/

++typedef struct

++{

++    /*!< first_pix_res first pixel resolution*/

++    int32_t first_pix_res;

++    /*!< bypass block bypass bit*/

++    int32_t bypass;

++    /*!< code[6] The codes array*/

++    int32_t code[6];

++    /*!< codethr[6] The threshold for using the next code*/

++    int32_t codethr[6];

++    /*!< codemask[6] Used for extracting the code from the coded word*/

++    int32_t codemask[6];

++    /*!< valuemask[6] Used for extracting the value from the coded word*/

++    int32_t valuemask[6];

++    /*!< signmask[6] Used for extracting the sign from the coded word*/

++    int32_t signmask[6];

++    /*!< lowresthrnum Code threshold for lower resolution coding*/

++    int32_t lowresthrnum;

++

++} ia_pal_isp_bxt_dpcm_encode_t;

++

++/*! \isp struct bxt_dvsstatistics

++

++*/

++typedef struct

++{

++    /*!< kappa Global configuration - kappa*/

++    int32_t kappa;

++    /*!< match_shift Global configuration - match_shift*/

++    int32_t match_shift;

++    /*!< ybin_mode Global configuration - y binning mode*/

++    int32_t ybin_mode;

++    /*!< grid_width_l0 DVS statistics grid width level 0*/

++    int32_t grid_width_l0;

++    /*!< grid_height_l0 DVS statistics grid height level 0*/

++    int32_t grid_height_l0;

++    /*!< block_width_l0 DVS statistics block width level 0*/

++    int32_t block_width_l0;

++    /*!< block_height_l0 DVS statistics block height level 0*/

++    int32_t block_height_l0;

++    /*!< x_start_l0 DVS statistics level 0 x start*/

++    int32_t x_start_l0;

++    /*!< y_start_l0 DVS statistics level 0 y start*/

++    int32_t y_start_l0;

++    /*!< enabled_l0 DVS statistics level 0 enable*/

++    int32_t enabled_l0;

++    /*!< x_end_l0 DVS statistics level 0 x end*/

++    int32_t x_end_l0;

++    /*!< y_end_l0 DVS statistics level 0 y end*/

++    int32_t y_end_l0;

++    /*!< grid_width_l1 DVS statistics grid width level 1*/

++    int32_t grid_width_l1;

++    /*!< grid_height_l1 DVS statistics grid height level 1*/

++    int32_t grid_height_l1;

++    /*!< block_width_l1 DVS statistics block width level 1*/

++    int32_t block_width_l1;

++    /*!< block_height_l1 DVS statistics block height level 1*/

++    int32_t block_height_l1;

++    /*!< x_start_l1 DVS statistics level 1 x start*/

++    int32_t x_start_l1;

++    /*!< y_start_l1 DVS statistics level 1 y start*/

++    int32_t y_start_l1;

++    /*!< enabled_l1 DVS statistics level 1 enable*/

++    int32_t enabled_l1;

++    /*!< x_end_l1 DVS statistics level 1 x end*/

++    int32_t x_end_l1;

++    /*!< y_end_l1 DVS statistics level 1 y end*/

++    int32_t y_end_l1;

++    /*!< grid_width_l2 DVS statistics grid width level 2*/

++    int32_t grid_width_l2;

++    /*!< grid_height_l2 DVS statistics grid height level 2*/

++    int32_t grid_height_l2;

++    /*!< block_width_l2 DVS statistics block width level 2*/

++    int32_t block_width_l2;

++    /*!< block_height_l2 DVS statistics block height level 2*/

++    int32_t block_height_l2;

++    /*!< x_start_l2 DVS statistics level 2 x start*/

++    int32_t x_start_l2;

++    /*!< y_start_l2 DVS statistics level 2 y start*/

++    int32_t y_start_l2;

++    /*!< enabled_l2 DVS statistics level 2 enable*/

++    int32_t enabled_l2;

++    /*!< x_end_l2 DVS statistics level 2 x end*/

++    int32_t x_end_l2;

++    /*!< y_end_l2 DVS statistics level 2 y end*/

++    int32_t y_end_l2;

++    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/

++    int32_t feroi_x_start_l0;

++    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/

++    int32_t feroi_y_start_l0;

++    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/

++    int32_t feroi_x_end_l0;

++    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/

++    int32_t feroi_y_end_l0;

++    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/

++    int32_t feroi_x_start_l1;

++    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/

++    int32_t feroi_y_start_l1;

++    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/

++    int32_t feroi_x_end_l1;

++    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/

++    int32_t feroi_y_end_l1;

++    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/

++    int32_t feroi_x_start_l2;

++    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/

++    int32_t feroi_y_start_l2;

++    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/

++    int32_t feroi_x_end_l2;

++    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/

++    int32_t feroi_y_end_l2;

++

++} ia_pal_isp_bxt_dvsstatistics_t;

++

++/*! \isp struct bxt_gammatm

++

++*/

++typedef struct

++{

++    /*!< enable enable for the filter*/

++    int32_t enable;

++    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa. 0- TM --> Gamma. 1- Gamma-->TM*/

++    int32_t gammaBeforeTM;

++    /*!< a1 shift amount at stage 1*/

++    int32_t a1;

++    /*!< a2 shift amount at stage 2*/

++    int32_t a2;

++    /*!< a3 shift amount at stage 3*/

++    int32_t a3;

++    /*!< gamma_lut_enable enable for gamma lut*/

++    int32_t gamma_lut_enable;

++    /*!< gamma_lut_base_level[5] base level for gamma lut*/

++    int32_t gamma_lut_base_level[5];

++    /*!< gamma_lut_step[5] step for gamma lut*/

++    int32_t gamma_lut_step[5];

++    /*!< gamma_lut_start_bin[5] start bin for gamma lut*/

++    int32_t gamma_lut_start_bin[5];

++    /*!< gamma_lut_size gamma lut size*/

++    int32_t gamma_lut_size;

++    /*!< gamma_lut_gen_lut[385] generalized lut for gamma lut*/

++    int32_t gamma_lut_gen_lut[385];

++    /*!< tm_lut_enable enable for tone mapping lut*/

++    int32_t tm_lut_enable;

++    /*!< tm_lut_base_level[1] base level for  tone mapping lut*/

++    int32_t tm_lut_base_level[1];

++    /*!< tm_lut_step[1] step for  tone mapping lut*/

++    int32_t tm_lut_step[1];

++    /*!< tm_lut_start_bin[1] start bin for  tone mapping lut*/

++    int32_t tm_lut_start_bin[1];

++    /*!< tm_lut_size tone mapping lut size*/

++    int32_t tm_lut_size;

++    /*!< tm_lut_gen_lut[513] generalized lut for tone mapping lut*/

++    int32_t tm_lut_gen_lut[513];

++

++} ia_pal_isp_bxt_gammatm_t;

++

++/*! \isp struct bxt_gridbaseob

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

++    int32_t blc_log2gridwidth;

++    /*!< blc_log2gridheight log2 of grid of each subplane height*/

++    int32_t blc_log2gridheight;

++    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t blc_col_start;

++    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t blc_row_start;

++    /*!< blc_grid_tablec00[4096] gridob grid table*/

++    int32_t blc_grid_tablec00[4096];

++    /*!< blc_grid_tablec01[4096] gridob grid table*/

++    int32_t blc_grid_tablec01[4096];

++    /*!< blc_grid_tablec02[4096] gridob grid table*/

++    int32_t blc_grid_tablec02[4096];

++    /*!< blc_grid_tablec03[4096] gridob grid table*/

++    int32_t blc_grid_tablec03[4096];

++    /*!< blc_grid_tablec10[4096] gridob grid table*/

++    int32_t blc_grid_tablec10[4096];

++    /*!< blc_grid_tablec11[4096] gridob grid table*/

++    int32_t blc_grid_tablec11[4096];

++    /*!< blc_grid_tablec12[4096] gridob grid table*/

++    int32_t blc_grid_tablec12[4096];

++    /*!< blc_grid_tablec13[4096] gridob grid table*/

++    int32_t blc_grid_tablec13[4096];

++    /*!< blc_grid_tablec20[4096] gridob grid table*/

++    int32_t blc_grid_tablec20[4096];

++    /*!< blc_grid_tablec21[4096] gridob grid table*/

++    int32_t blc_grid_tablec21[4096];

++    /*!< blc_grid_tablec22[4096] gridob grid table*/

++    int32_t blc_grid_tablec22[4096];

++    /*!< blc_grid_tablec23[4096] gridob grid table*/

++    int32_t blc_grid_tablec23[4096];

++    /*!< blc_grid_tablec30[4096] gridob grid table*/

++    int32_t blc_grid_tablec30[4096];

++    /*!< blc_grid_tablec31[4096] gridob grid table*/

++    int32_t blc_grid_tablec31[4096];

++    /*!< blc_grid_tablec32[4096] gridob grid table*/

++    int32_t blc_grid_tablec32[4096];

++    /*!< blc_grid_tablec33[4096] gridob grid table*/

++    int32_t blc_grid_tablec33[4096];

++    /*!< blc_table_width table width*/

++    int32_t blc_table_width;

++    /*!< blc_table_height table height*/

++    int32_t blc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_gridbaseob_t;

++

++/*! \isp struct bxt_gridbaseob_b

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

++    int32_t blc_log2gridwidth;

++    /*!< blc_log2gridheight log2 of grid of each subplane height*/

++    int32_t blc_log2gridheight;

++    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t blc_col_start;

++    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t blc_row_start;

++    /*!< blc_grid_tablec00[4096] gridob grid table*/

++    int32_t blc_grid_tablec00[4096];

++    /*!< blc_grid_tablec01[4096] gridob grid table*/

++    int32_t blc_grid_tablec01[4096];

++    /*!< blc_grid_tablec02[4096] gridob grid table*/

++    int32_t blc_grid_tablec02[4096];

++    /*!< blc_grid_tablec03[4096] gridob grid table*/

++    int32_t blc_grid_tablec03[4096];

++    /*!< blc_grid_tablec10[4096] gridob grid table*/

++    int32_t blc_grid_tablec10[4096];

++    /*!< blc_grid_tablec11[4096] gridob grid table*/

++    int32_t blc_grid_tablec11[4096];

++    /*!< blc_grid_tablec12[4096] gridob grid table*/

++    int32_t blc_grid_tablec12[4096];

++    /*!< blc_grid_tablec13[4096] gridob grid table*/

++    int32_t blc_grid_tablec13[4096];

++    /*!< blc_grid_tablec20[4096] gridob grid table*/

++    int32_t blc_grid_tablec20[4096];

++    /*!< blc_grid_tablec21[4096] gridob grid table*/

++    int32_t blc_grid_tablec21[4096];

++    /*!< blc_grid_tablec22[4096] gridob grid table*/

++    int32_t blc_grid_tablec22[4096];

++    /*!< blc_grid_tablec23[4096] gridob grid table*/

++    int32_t blc_grid_tablec23[4096];

++    /*!< blc_grid_tablec30[4096] gridob grid table*/

++    int32_t blc_grid_tablec30[4096];

++    /*!< blc_grid_tablec31[4096] gridob grid table*/

++    int32_t blc_grid_tablec31[4096];

++    /*!< blc_grid_tablec32[4096] gridob grid table*/

++    int32_t blc_grid_tablec32[4096];

++    /*!< blc_grid_tablec33[4096] gridob grid table*/

++    int32_t blc_grid_tablec33[4096];

++    /*!< blc_table_width table width*/

++    int32_t blc_table_width;

++    /*!< blc_table_height table height*/

++    int32_t blc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_gridbaseob_b_t;

++

++/*! \isp struct bxt_gridbaseob_c

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< blc_log2gridwidth log2 of grid of each subplane width*/

++    int32_t blc_log2gridwidth;

++    /*!< blc_log2gridheight log2 of grid of each subplane height*/

++    int32_t blc_log2gridheight;

++    /*!< blc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t blc_col_start;

++    /*!< blc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t blc_row_start;

++    /*!< blc_grid_tablec00[4096] gridob grid table*/

++    int32_t blc_grid_tablec00[4096];

++    /*!< blc_grid_tablec01[4096] gridob grid table*/

++    int32_t blc_grid_tablec01[4096];

++    /*!< blc_grid_tablec02[4096] gridob grid table*/

++    int32_t blc_grid_tablec02[4096];

++    /*!< blc_grid_tablec03[4096] gridob grid table*/

++    int32_t blc_grid_tablec03[4096];

++    /*!< blc_grid_tablec10[4096] gridob grid table*/

++    int32_t blc_grid_tablec10[4096];

++    /*!< blc_grid_tablec11[4096] gridob grid table*/

++    int32_t blc_grid_tablec11[4096];

++    /*!< blc_grid_tablec12[4096] gridob grid table*/

++    int32_t blc_grid_tablec12[4096];

++    /*!< blc_grid_tablec13[4096] gridob grid table*/

++    int32_t blc_grid_tablec13[4096];

++    /*!< blc_grid_tablec20[4096] gridob grid table*/

++    int32_t blc_grid_tablec20[4096];

++    /*!< blc_grid_tablec21[4096] gridob grid table*/

++    int32_t blc_grid_tablec21[4096];

++    /*!< blc_grid_tablec22[4096] gridob grid table*/

++    int32_t blc_grid_tablec22[4096];

++    /*!< blc_grid_tablec23[4096] gridob grid table*/

++    int32_t blc_grid_tablec23[4096];

++    /*!< blc_grid_tablec30[4096] gridob grid table*/

++    int32_t blc_grid_tablec30[4096];

++    /*!< blc_grid_tablec31[4096] gridob grid table*/

++    int32_t blc_grid_tablec31[4096];

++    /*!< blc_grid_tablec32[4096] gridob grid table*/

++    int32_t blc_grid_tablec32[4096];

++    /*!< blc_grid_tablec33[4096] gridob grid table*/

++    int32_t blc_grid_tablec33[4096];

++    /*!< blc_table_width table width*/

++    int32_t blc_table_width;

++    /*!< blc_table_height table height*/

++    int32_t blc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_gridbaseob_c_t;

++

++/*! \isp struct bxt_inputscaler

++

++*/

++typedef struct

++{

++    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/

++    int32_t block_bypass;

++    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

++    int32_t demo_bypass;

++    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

++    int32_t scaler_bypass;

++    /*!< vnumerator Vertical SF Numerator*/

++    int32_t vnumerator;

++    /*!< hnumerator Horizontal SF Numerator*/

++    int32_t hnumerator;

++    /*!< vdenominator Vertical SF Denominator*/

++    int32_t vdenominator;

++    /*!< hdenominator Horizontal SF Denominator*/

++    int32_t hdenominator;

++    /*!< norm_mul Normalization multiply coefficient*/

++    int32_t norm_mul;

++    /*!< norm_shift Normalization shift*/

++    int32_t norm_shift;

++    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

++    int32_t output_sensor_mode;

++    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/

++    int32_t output_format_matrix[16];

++    /*!< Input_Frame_Width Input frame width.*/

++    int32_t Input_Frame_Width;

++    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/

++    int32_t input_is_bayer;

++    /*!< output_height Has to be a multiple of 4.*/

++    int32_t output_height;

++    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/

++    int32_t output_width;

++    /*!< shift_to_lb Shifting before LB*/

++    int32_t shift_to_lb;

++    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

++    int32_t input_sensor_mode;

++    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/

++    int32_t is_ul_w;

++    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/

++    int32_t bayer_type;

++    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/

++    int32_t lut_values[16];

++    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/

++    int32_t lut_shifts1[16];

++    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/

++    int32_t lut_shifts2[16];

++    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/

++    int32_t lut_subtraction_flags[16];

++    /*!< lut_output_values[16] QNN LUT - Output Values*/

++    int32_t lut_output_values[16];

++    /*!< kernel_g_coef[6] G kernel - Coefs*/

++    int32_t kernel_g_coef[6];

++    /*!< kernel_g_norm File for G kernel - Norm*/

++    int32_t kernel_g_norm;

++    /*!< cbf_div_cu_x[12] Config unit division - X points*/

++    int32_t cbf_div_cu_x[12];

++    /*!< cbf_div_cu_y[11] Config unit division - Y points*/

++    int32_t cbf_div_cu_y[11];

++    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/

++    int32_t cbf_div_cu_slope[11];

++    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/

++    int32_t cbi_r_pos[96];

++    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/

++    int32_t cbi_r_wgt[96];

++    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}*/

++    int32_t cbi_g_pos[96];

++    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}*/

++    int32_t cbi_g_wgt[96];

++    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/

++    int32_t cbi_b_pos[96];

++    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/

++    int32_t cbi_b_wgt[96];

++    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/

++    int32_t wb_matrix[16];

++    /*!< r_wb_gain WB R gain*/

++    int32_t r_wb_gain;

++    /*!< g_wb_gain WB G gain*/

++    int32_t g_wb_gain;

++    /*!< b_wb_gain WB B gain*/

++    int32_t b_wb_gain;

++

++} ia_pal_isp_bxt_inputscaler_t;

++

++/*! \isp struct bxt_inputscalerv2

++

++*/

++typedef struct

++{

++    /*!< block_bypass block bypass bit. Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable). In case block_bypass = 1, demo_bypass and scaler_bypass will turn to 1.*/

++    int32_t block_bypass;

++    /*!< demo_bypass demosaic bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

++    int32_t demo_bypass;

++    /*!< scaler_bypass scaler bypass bit.  Note that in ATE this parameters is 'bypass' (0 - enable. 1 - disable) while in HW it is 'enable' (0 - bypass. 1 - enable).*/

++    int32_t scaler_bypass;

++    /*!< vnumerator Vertical   SF Numerator*/

++    int32_t vnumerator;

++    /*!< hnumerator Horizontal SF Numerator*/

++    int32_t hnumerator;

++    /*!< vdenominator Vertical   SF Denominator*/

++    int32_t vdenominator;

++    /*!< hdenominator Horizontal SF Denominator*/

++    int32_t hdenominator;

++    /*!< norm_mul Normalization multiply coeffiecient*/

++    int32_t norm_mul;

++    /*!< norm_shift Normalization shift*/

++    int32_t norm_shift;

++    /*!< output_sensor_mode Output Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

++    int32_t output_sensor_mode;

++    /*!< output_format_matrix[16] Output format matrix [4,4]. 0=R. 1=G. 2=G. 3=W*/

++    int32_t output_format_matrix[16];

++    /*!< Input_Frame_Width Input frame width. Has to be a multiple of 4.*/

++    int32_t Input_Frame_Width;

++    /*!< input_is_bayer 0 - RGBC, 1 - Bayer,*/

++    int32_t input_is_bayer;

++    /*!< output_height Has to be a multiple of 4.*/

++    int32_t output_height;

++    /*!< output_width Better be a mutiplication of 32 to avoid RTL zero padding (?). When block is stationed in isla (isla=on) then maximum is 2560. Has to be a multiple of 4.*/

++    int32_t output_width;

++    /*!< shift_to_lb Shifting before LB*/

++    int32_t shift_to_lb;

++    /*!< input_sensor_mode Input Sensor mode 0-1x1, 1-2x2, 2-4x4. Input scaler can't work in 1x1 sensor mode.*/

++    int32_t input_sensor_mode;

++    /*!< is_ul_w Is the first pixel in frame G/W 1-true, 0-false*/

++    int32_t is_ul_w;

++    /*!< bayer_type Bayer Type - BGGR(0), RGGB(1), GRBG(2), GBRG(3)*/

++    int32_t bayer_type;

++    /*!< lut_values[16] QNN LUT - Values. Restriction - rising monotonic.*/

++    int32_t lut_values[16];

++    /*!< lut_shifts1[16] QNN LUT - Shift1. lut_shift2 >= lut_shift1.*/

++    int32_t lut_shifts1[16];

++    /*!< lut_shifts2[16] QNN LUT - Shift2. lut_shift2 >= lut_shift1.*/

++    int32_t lut_shifts2[16];

++    /*!< lut_subtraction_flags[16] QNN LUT - Flags*/

++    int32_t lut_subtraction_flags[16];

++    /*!< lut_output_values[16] QNN LUT - Output Values*/

++    int32_t lut_output_values[16];

++    /*!< kernel_g_coef[6] G kernel - Coefs*/

++    int32_t kernel_g_coef[6];

++    /*!< kernel_g_norm File for G kernel - Norm*/

++    int32_t kernel_g_norm;

++    /*!< cbf_div_cu_x[12] Config unit division - X points*/

++    int32_t cbf_div_cu_x[12];

++    /*!< cbf_div_cu_y[11] Config unit division - Y points*/

++    int32_t cbf_div_cu_y[11];

++    /*!< cbf_div_cu_slope[11] Config unit division - Slopes*/

++    int32_t cbf_div_cu_slope[11];

++    /*!< cbi_r_pos[96] .CBI R Positions. Valid range {0-17}*/

++    int32_t cbi_r_pos[96];

++    /*!< cbi_r_wgt[96] CBI R Weights. Valid range: {0-4 , 7}*/

++    int32_t cbi_r_wgt[96];

++    /*!< cbi_g_pos[96] CBI G Positions. Valid range {0-17}. Not used in Bayer (only in RGBC).*/

++    int32_t cbi_g_pos[96];

++    /*!< cbi_g_wgt[96] CBI G Weights. Valid range {0-4 , 7}. Not used in Bayer (only in RGBC).*/

++    int32_t cbi_g_wgt[96];

++    /*!< cbi_b_pos[96] CBI B Positions. Valid range {0-17}*/

++    int32_t cbi_b_pos[96];

++    /*!< cbi_b_wgt[96] CBI B Weights. Valid range {0-4 , 7}*/

++    int32_t cbi_b_wgt[96];

++    /*!< wb_matrix[16] Matrix[4][4] for WB. 0=no gain. 1=R. 2=B. 3=G. (in each quad must use at least two zeros (no gain)).*/

++    int32_t wb_matrix[16];

++    /*!< r_wb_gain WB R gain. 4096 is equal to gain 1.*/

++    int32_t r_wb_gain;

++    /*!< g_wb_gain WB G gain. 4096 is equal to gain 1.*/

++    int32_t g_wb_gain;

++    /*!< b_wb_gain WB B gain. 4096 is equal to gain 1.*/

++    int32_t b_wb_gain;

++    /*!< g_min_r_en Enable 'G-R' mode*/

++    int32_t g_min_r_en;

++

++} ia_pal_isp_bxt_inputscalerv2_t;

++

++/*! \isp struct bxt_isl_inputcrop

++

++*/

++typedef struct

++{

++    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_xstart;

++    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_ystart;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++

++} ia_pal_isp_bxt_isl_inputcrop_t;

++

++/*! \isp struct bxt_linearization

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< linc00[65] linearization grid table*/

++    int32_t linc00[65];

++    /*!< linc01[65] linearization grid table*/

++    int32_t linc01[65];

++    /*!< linc02[65] linearization grid table*/

++    int32_t linc02[65];

++    /*!< linc03[65] linearization grid table*/

++    int32_t linc03[65];

++    /*!< linc10[65] linearization grid table*/

++    int32_t linc10[65];

++    /*!< linc11[65] linearization grid table*/

++    int32_t linc11[65];

++    /*!< linc12[65] linearization grid table*/

++    int32_t linc12[65];

++    /*!< linc13[65] linearization grid table*/

++    int32_t linc13[65];

++    /*!< linc20[65] linearization grid table*/

++    int32_t linc20[65];

++    /*!< linc21[65] linearization grid table*/

++    int32_t linc21[65];

++    /*!< linc22[65] linearization grid table*/

++    int32_t linc22[65];

++    /*!< linc23[65] linearization grid table*/

++    int32_t linc23[65];

++    /*!< linc30[65] linearization grid table*/

++    int32_t linc30[65];

++    /*!< linc31[65] linearization grid table*/

++    int32_t linc31[65];

++    /*!< linc32[65] linearization grid table*/

++    int32_t linc32[65];

++    /*!< linc33[65] linearization grid table*/

++    int32_t linc33[65];

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_linearization_t;

++

++/*! \isp struct bxt_lsc

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< lsclog2gridwidth log2 width of each subplane*/

++    int32_t lsclog2gridwidth;

++    /*!< lsclog2gridheight log2 height of each subplane*/

++    int32_t lsclog2gridheight;

++    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t lsc_col_start;

++    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t lsc_row_start;

++    /*!< lsc_exp resolution modifier of the lsc tables*/

++    int32_t lsc_exp;

++    /*!< lsc_grid_tablec00[4096] lsc grid table*/

++    int32_t lsc_grid_tablec00[4096];

++    /*!< lsc_grid_tablec01[4096] lsc grid table*/

++    int32_t lsc_grid_tablec01[4096];

++    /*!< lsc_grid_tablec02[4096] lsc grid table*/

++    int32_t lsc_grid_tablec02[4096];

++    /*!< lsc_grid_tablec03[4096] lsc grid table*/

++    int32_t lsc_grid_tablec03[4096];

++    /*!< lsc_grid_tablec10[4096] lsc grid table*/

++    int32_t lsc_grid_tablec10[4096];

++    /*!< lsc_grid_tablec11[4096] lsc grid table*/

++    int32_t lsc_grid_tablec11[4096];

++    /*!< lsc_grid_tablec12[4096] lsc grid table*/

++    int32_t lsc_grid_tablec12[4096];

++    /*!< lsc_grid_tablec13[4096] lsc grid table*/

++    int32_t lsc_grid_tablec13[4096];

++    /*!< lsc_grid_tablec20[4096] lsc grid table*/

++    int32_t lsc_grid_tablec20[4096];

++    /*!< lsc_grid_tablec21[4096] lsc grid table*/

++    int32_t lsc_grid_tablec21[4096];

++    /*!< lsc_grid_tablec22[4096] lsc grid table*/

++    int32_t lsc_grid_tablec22[4096];

++    /*!< lsc_grid_tablec23[4096] lsc grid table*/

++    int32_t lsc_grid_tablec23[4096];

++    /*!< lsc_grid_tablec30[4096] lsc grid table*/

++    int32_t lsc_grid_tablec30[4096];

++    /*!< lsc_grid_tablec31[4096] lsc grid table*/

++    int32_t lsc_grid_tablec31[4096];

++    /*!< lsc_grid_tablec32[4096] lsc grid table*/

++    int32_t lsc_grid_tablec32[4096];

++    /*!< lsc_grid_tablec33[4096] lsc grid table*/

++    int32_t lsc_grid_tablec33[4096];

++    /*!< lsc_table_width table width*/

++    int32_t lsc_table_width;

++    /*!< lsc_table_height table height*/

++    int32_t lsc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_lsc_t;

++

++/*! \isp struct bxt_norm_lin

++

++*/

++typedef struct

++{

++    /*!< lut[257] Normalization lut*/

++    int32_t lut[257];

++    /*!< lin_en Linearization enable*/

++    int32_t lin_en;

++    /*!< lshift The size of normalized shift (signed)*/

++    int32_t lshift;

++    /*!< bypass bypass*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_norm_lin_t;

++

++/*! \isp struct bxt_norm_lin_b

++

++*/

++typedef struct

++{

++    /*!< lut[257] Normalization lut*/

++    int32_t lut[257];

++    /*!< lin_en Linearization enable*/

++    int32_t lin_en;

++    /*!< lshift The size of normalized shift (signed)*/

++    int32_t lshift;

++    /*!< bypass bypass*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_norm_lin_b_t;

++

++/*! \isp struct bxt_norm_lin_c

++

++*/

++typedef struct

++{

++    /*!< lut[257] Normalization lut*/

++    int32_t lut[257];

++    /*!< lin_en Linearization enable*/

++    int32_t lin_en;

++    /*!< lshift The size of normalized shift (signed)*/

++    int32_t lshift;

++    /*!< bypass bypass*/

++    int32_t bypass;

++

++} ia_pal_isp_bxt_norm_lin_c_t;

++

++/*! \isp struct bxt_ofa_dp

++

++*/

++typedef struct

++{

++    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling;

++    /*!< pack_mode pack mode for packer*/

++    int32_t pack_mode;

++    /*!< bypass_flip bypass flip*/

++    int32_t bypass_flip;

++    /*!< bypass_mirror bypass mirror*/

++    int32_t bypass_mirror;

++    /*!< bypass_reduced_range bypass reduced range*/

++    int32_t bypass_reduced_range;

++    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e[2];

++    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o[2];

++

++} ia_pal_isp_bxt_ofa_dp_t;

++

++/*! \isp struct bxt_ofa_mp

++

++*/

++typedef struct

++{

++    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling;

++    /*!< pack_mode pack mode for packer*/

++    int32_t pack_mode;

++    /*!< bypass_flip bypass flip*/

++    int32_t bypass_flip;

++    /*!< bypass_mirror bypass mirror*/

++    int32_t bypass_mirror;

++    /*!< bypass_reduced_range bypass reduced range*/

++    int32_t bypass_reduced_range;

++    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e[2];

++    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o[2];

++

++} ia_pal_isp_bxt_ofa_mp_t;

++

++/*! \isp struct bxt_ofa_ppp

++

++*/

++typedef struct

++{

++    /*!< y_tiling tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling;

++    /*!< pack_mode pack mode for packer*/

++    int32_t pack_mode;

++    /*!< bypass_flip bypass flip*/

++    int32_t bypass_flip;

++    /*!< bypass_mirror bypass mirror*/

++    int32_t bypass_mirror;

++    /*!< bypass_reduced_range bypass reduced range*/

++    int32_t bypass_reduced_range;

++    /*!< p_e[2] Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e[2];

++    /*!< p_o[2] Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o[2];

++

++} ia_pal_isp_bxt_ofa_ppp_t;

++

++/*! \isp struct bxt_paddingsupport

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/

++    int32_t m_padval;

++

++} ia_pal_isp_bxt_paddingsupport_t;

++

++/*! \isp struct bxt_pafstatistics

++

++*/

++typedef struct

++{

++    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

++    int32_t paf_en;

++    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

++    int32_t paf_frame_width;

++    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

++    int32_t paf_frame_height;

++    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

++    int32_t skip_horizontal_start;

++    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

++    int32_t skip_vertical_start;

++    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

++    int32_t block_width;

++    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

++    int32_t block_height;

++    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

++    int32_t accum_horizontal;

++    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

++    int32_t skip_horizontal;

++    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

++    int32_t accum_vertical;

++    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

++    int32_t skip_vertical;

++    /*!< min_shift minimum evaluation shift in steps*/

++    int32_t min_shift;

++    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

++    int32_t shift_steps;

++    /*!< paf_shift_step_size phase evaluation step size in pixels*/

++    int32_t paf_shift_step_size;

++    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

++    int32_t paf_shifter;

++    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

++    int32_t split_accross_multiple_lines;

++    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

++    int32_t pixels_per_line;

++    /*!< input_modes 0: RRRR + LLLL; 1: LLLL + RRRR; 2: RLRL; 3: LRLR; 4: RRRR + LLLL alternate; 5: LLLL + RRRR alternate; 6: RLRL alternate; 7: LRLR alternate*/

++    int32_t input_modes;

++    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

++    int32_t input_bpp;

++    /*!< int_prec internal precision of PAF pixels*/

++    int32_t int_prec;

++

++} ia_pal_isp_bxt_pafstatistics_t;

++

++/*! \isp struct bxt_pixelformatter

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++    /*!< m_ColRemoval col removal- for setting bayer pattern*/

++    int32_t m_ColRemoval;

++    /*!< m_RowRemoval row removal- for setting bayer pattern*/

++    int32_t m_RowRemoval;

++    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_xstart;

++    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_ystart;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++    /*!< m_padval Padding value : zero(0), MaxVal(1), DuplicateLast(2)*/

++    int32_t m_padval;

++

++} ia_pal_isp_bxt_pixelformatter_t;

++

++/*! \isp struct bxt_pixprecadapter

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_t;

++

++/*! \isp struct bxt_pixprecadapter_postvcr

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_postvcr_t;

++

++/*! \isp struct bxt_pixprecadapter_precropstills

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_precropstills_t;

++

++/*! \isp struct bxt_pixprecadapter_precropvideo

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_precropvideo_t;

++

++/*! \isp struct bxt_pixprecadapter_precsc2

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_precsc2_t;

++

++/*! \isp struct bxt_pixprecadapter_pregdc

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_pregdc_t;

++

++/*! \isp struct bxt_pixprecadapter_prevcud

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_prevcud_t;

++

++/*! \isp struct bxt_pixprecadapter_prewb

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_bxt_pixprecadapter_prewb_t;

++

++/*! \isp struct bxt_rynr_collector

++

++*/

++typedef struct

++{

++    /*!< input_pin dummy parameter for HW purpose; 1 - Stills, 0 - Video*/

++    int32_t input_pin;

++

++} ia_pal_isp_bxt_rynr_collector_t;

++

++/*! \isp struct bxt_rynr_splitter

++

++*/

++typedef struct

++{

++    /*!< input_pin Which input pin connect to output: if 1 (Stills), output pin is InputPin1 (pcsBayer), if 0 (Video), output pin is InputPin0 (pcsYUV420)*/

++    int32_t input_pin;

++

++} ia_pal_isp_bxt_rynr_splitter_t;

++

++/*! \isp struct bxt_shift14to16bit

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass        {0,1}*/

++    int32_t m_bypass;

++    /*!< m_shiftmode Shift : 14To16(0), 16To14(1)*/

++    int32_t m_shiftmode;

++    /*!< m_isbayer Is Bayer? - Bayer(0) RGB(1)*/

++    int32_t m_isbayer;

++

++} ia_pal_isp_bxt_shift14to16bit_t;

++

++/*! \isp struct bxt_tnr5v1

++

++*/

++typedef struct

++{

++    /*!< nm_luma_lut[64] Noise model LUMA lut (for I core)*/

++    int32_t nm_luma_lut[64];

++    /*!< nm_chroma_lut[64] Noise model Chroma LUT (for I core)*/

++    int32_t nm_chroma_lut[64];

++    /*!< nm_spnr_lut[64] Noise model LUMA lut, for II core, beem used by spNR*/

++    int32_t nm_spnr_lut[64];

++    /*!< nm_radial_lut[128] Noise model radial Lut*/

++    int32_t nm_radial_lut[128];

++    /*!< nm_radial_r2_shift Noise model radial shift*/

++    int32_t nm_radial_r2_shift;

++    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

++    int32_t nm_radial_x_center;

++    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

++    int32_t nm_radial_y_center;

++    /*!< co_max_content maximal value for the content*/

++    int32_t co_max_content;

++    /*!< co_content_shift shift right for content*/

++    int32_t co_content_shift;

++    /*!< fm_sim_lut[64] FMVE Similarity LUT for grade calculation*/

++    int32_t fm_sim_lut[64];

++    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

++    int32_t fm_dist_weights[128];

++    /*!< fm_sad_shift shift for the SAD values in the FMVE sub-block (using realigning)*/

++    int32_t fm_sad_shift;

++    /*!< fm_sim_arg_shift shift for FMVE similarity arg values.*/

++    int32_t fm_sim_arg_shift;

++    /*!< mvd_sim_lut[64] MVD Similarity LUT*/

++    int32_t mvd_sim_lut[64];

++    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

++    int32_t mvd_sad_shift;

++    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

++    int32_t mvd_arg_g_static;

++    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

++    int32_t mvd_arg_g_static_local;

++    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

++    int32_t mvd_arg_g_move;

++    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

++    int32_t mvd_arg_g_move_local;

++    /*!< spnr_lut_h[64] spNR BF lut for horizontal direction*/

++    int32_t spnr_lut_h[64];

++    /*!< spnr_lut_v[64] spNR BF lut for vertical direction*/

++    int32_t spnr_lut_v[64];

++    /*!< pb_weight_pre_max maximal spTNR weight*/

++    int32_t pb_weight_pre_max;

++    /*!< pb_weight_in_min The minimal weight of the input frame at the blended output image.*/

++    int32_t pb_weight_in_min;

++    /*!< no_fmve FMVE debug flag, 0-run, 1-don't run, 2- don't run, but run content*/

++    int32_t no_fmve;

++    /*!< bypass bypass flag, output is 4 bit shifted input*/

++    int32_t bypass;

++    /*!< framenumber frame number. Should be in PAL*/

++    int32_t framenumber;

++    /*!< g_mv_x global  MV_X. Should be in PAL*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y. Should be in PAL*/

++    int32_t g_mv_y;

++

++} ia_pal_isp_bxt_tnr5v1_t;

++

++/*! \isp struct bxt_vcr

++

++*/

++typedef struct

++{

++    /*!< bypass_0_1 Bypass VCR*/

++    int32_t bypass_0_1;

++

++} ia_pal_isp_bxt_vcr_t;

++

++/*! \isp struct bxt_vcr2

++

++*/

++typedef struct

++{

++    /*!< bypass_0_1 Bypass VCR2*/

++    int32_t bypass_0_1;

++    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/

++    int32_t input_format_420;

++    /*!< lpf_p0_c0 Phase 0 - coef 0*/

++    int32_t lpf_p0_c0;

++    /*!< lpf_p0_c1 Phase 0 - coef 1*/

++    int32_t lpf_p0_c1;

++    /*!< lpf_p0_c2 Phase 0 - coef 2*/

++    int32_t lpf_p0_c2;

++    /*!< lpf_p0_c3 Phase 0 - coef 3*/

++    int32_t lpf_p0_c3;

++    /*!< lpf_p1_c0 Phase 1 - coef 0*/

++    int32_t lpf_p1_c0;

++    /*!< lpf_p1_c1 Phase 1 - coef 1*/

++    int32_t lpf_p1_c1;

++    /*!< lpf_p1_c2 Phase 1 - coef 2*/

++    int32_t lpf_p1_c2;

++    /*!< lpf_p1_c3 Phase 1 - coef 3*/

++    int32_t lpf_p1_c3;

++

++} ia_pal_isp_bxt_vcr2_t;

++

++/*! \isp struct bxt_vcsc

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< gain Matrix table gain exponent*/

++    int32_t gain;

++    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

++    int32_t coef_matrix[12];

++    /*!< t0 matrix offeset 0 (y)*/

++    int32_t t0;

++    /*!< t1 matrix offeset 1 (u)*/

++    int32_t t1;

++    /*!< t2 matrix offeset y (v)*/

++    int32_t t2;

++    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_h;

++    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_v;

++

++} ia_pal_isp_bxt_vcsc_t;

++

++/*! \isp struct bxt_vcsc_stills

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< gain Matrix table gain exponent*/

++    int32_t gain;

++    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

++    int32_t coef_matrix[12];

++    /*!< t0 matrix offeset 0 (y)*/

++    int32_t t0;

++    /*!< t1 matrix offeset 1 (u)*/

++    int32_t t1;

++    /*!< t2 matrix offeset y (v)*/

++    int32_t t2;

++    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_h;

++    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_v;

++

++} ia_pal_isp_bxt_vcsc_stills_t;

++

++/*! \isp struct bxt_vcsc_video

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< gain Matrix table gain exponent*/

++    int32_t gain;

++    /*!< coef_matrix[12] 3x4 Matrix coeffcients, Q10*/

++    int32_t coef_matrix[12];

++    /*!< t0 matrix offeset 0 (y)*/

++    int32_t t0;

++    /*!< t1 matrix offeset 1 (u)*/

++    int32_t t1;

++    /*!< t2 matrix offeset y (v)*/

++    int32_t t2;

++    /*!< fir_alpha_h Horizontal filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_h;

++    /*!< fir_alpha_v Vertical filter 2nd tap coeffcient [0.0…0.33], Q10*/

++    int32_t fir_alpha_v;

++

++} ia_pal_isp_bxt_vcsc_video_t;

++

++/*! \isp struct bxt_vcud

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< chm_offset_u U bias*/

++    int32_t chm_offset_u;

++    /*!< chm_offset_v V bias*/

++    int32_t chm_offset_v;

++    /*!< chm_gain gain exponent of chroma metric*/

++    int32_t chm_gain;

++    /*!< lcs_th_low Low Chroma suppression threshold low*/

++    int32_t lcs_th_low;

++    /*!< lcs_th_high Low Chroma suppression threshold high*/

++    int32_t lcs_th_high;

++    /*!< cu_lcs_x_points[6] CU LCS X points*/

++    int32_t cu_lcs_x_points[6];

++    /*!< cu_lcs_y_points[5] CU LCS Y points*/

++    int32_t cu_lcs_y_points[5];

++    /*!< cu_lcs_slopes[5] CU LCS Slopes, Q4*/

++    int32_t cu_lcs_slopes[5];

++    /*!< cu_noise_x_points[7] CU Noise X points*/

++    int32_t cu_noise_x_points[7];

++    /*!< cu_noise_y_points[6] CU Noise Y points*/

++    int32_t cu_noise_y_points[6];

++    /*!< cu_noise_slopes[6] CU Noise Slopes, Q5*/

++    int32_t cu_noise_slopes[6];

++    /*!< cu_radial_x_points[6] CU Radial X points*/

++    int32_t cu_radial_x_points[6];

++    /*!< cu_radial_y_points[5] CU Radial Y points*/

++    int32_t cu_radial_y_points[5];

++    /*!< cu_radial_slopes[5] CU Radial Slopes, Q8*/

++    int32_t cu_radial_slopes[5];

++    /*!< cu_psdiv_lcs_x_points[12] CU psdiv_lcs X points*/

++    int32_t cu_psdiv_lcs_x_points[12];

++    /*!< cu_psdiv_lcs_y_points[11] CU psdiv_lcs Y points*/

++    int32_t cu_psdiv_lcs_y_points[11];

++    /*!< cu_psdiv_lcs_slopes[11] CU psdiv_lcs Slopes, Q10*/

++    int32_t cu_psdiv_lcs_slopes[11];

++    /*!< cu_psdiv_jbl_x_points[12] CU psdiv_jbl X points*/

++    int32_t cu_psdiv_jbl_x_points[12];

++    /*!< cu_psdiv_jbl_y_points[11] CU psdiv_jbl Y points*/

++    int32_t cu_psdiv_jbl_y_points[11];

++    /*!< cu_psdiv_jbl_slopes[11] CU psdiv_jbl Slopes, Q10*/

++    int32_t cu_psdiv_jbl_slopes[11];

++    /*!< noise_beta[9] Noise model Beta coefficients*/

++    int32_t noise_beta[9];

++    /*!< lpf_coefs[6] Bilatheral Spatial filter coefficients , Q10, {c0, c3,c4,c6,c7,c8}*/

++    int32_t lpf_coefs[6];

++    /*!< jbl_center_loc JBL center location for noise model*/

++    int32_t jbl_center_loc;

++    /*!< jbl_sigma_y JBL Y noise sigma power, Q6*/

++    int32_t jbl_sigma_y;

++    /*!< jbl_sigma_u JBL U noise  sigma power, Q6*/

++    int32_t jbl_sigma_u;

++    /*!< jbl_sigma_v JBL V noise sigma power, Q6*/

++    int32_t jbl_sigma_v;

++    /*!< jbl_dist_epsilon JBL minmum distance*/

++    int32_t jbl_dist_epsilon;

++    /*!< jbl_noise_epsilon2 JBL minimum noise estimation*/

++    int32_t jbl_noise_epsilon2;

++    /*!< jbl_exp2_min JBL minimum value similarity weight (exp^1/2x^2)*/

++    int32_t jbl_exp2_min;

++    /*!< jbl_weight_th JBL minimum weight threshold*/

++    int32_t jbl_weight_th;

++    /*!< upscale_only_en 0 - VCUD do denoising and duplicate chroma to 4:4:4, 1 - VCUD do only bicubic chroma upsampling to 4:4:4*/

++    int32_t upscale_only_en;

++    /*!< rad_en Enable Radial parameters*/

++    int32_t rad_en;

++    /*!< rad_x_reset top left pixel X location relative to the optical center point*/

++    int32_t rad_x_reset;

++    /*!< rad_y_reset top left pixel Y location relative to the optical center point*/

++    int32_t rad_y_reset;

++    /*!< rad_x2_reset rad_x_reset * rad_x_reset*/

++    int32_t rad_x2_reset;

++    /*!< rad_y2_reset rad_y_reset * rad_y_reset*/

++    int32_t rad_y2_reset;

++    /*!< rad_nf exponent gain for rad_inv_r2*/

++    int32_t rad_nf;

++    /*!< rad_inv_r2 1/radius * 2^???*/

++    int32_t rad_inv_r2;

++    /*!< rad_jbl_sigma_y Radial*/

++    int32_t rad_jbl_sigma_y;

++    /*!< rad_jbl_sigma_u Radial*/

++    int32_t rad_jbl_sigma_u;

++    /*!< rad_jbl_sigma_v Radial*/

++    int32_t rad_jbl_sigma_v;

++    /*!< rad_jbl_dist_epsilon Radial*/

++    int32_t rad_jbl_dist_epsilon;

++    /*!< rad_jbl_noise_epsilon2 Radial*/

++    int32_t rad_jbl_noise_epsilon2;

++

++} ia_pal_isp_bxt_vcud_t;

++

++/*! \isp struct bxt_wb

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass            {0,1}*/

++    int32_t m_bypass;

++    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

++    int32_t m_gainch0;

++    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

++    int32_t m_gainch1;

++    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

++    int32_t m_gainch2;

++    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

++    int32_t m_gainch3;

++    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

++    int32_t m_gainch4;

++    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

++    int32_t m_gainch5;

++    /*!< m_gainch6 Gain Channel6 (U4.12)*/

++    int32_t m_gainch6;

++    /*!< m_gainch7 Gain Channel7 (U4.12)*/

++    int32_t m_gainch7;

++    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

++    int32_t m_sensormode;

++    /*!< m_wbindmat[16] Vector WB matrix*/

++    int32_t m_wbindmat[16];

++

++} ia_pal_isp_bxt_wb_t;

++

++/*! \isp struct bxt_wb_stills

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass            {0,1}*/

++    int32_t m_bypass;

++    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

++    int32_t m_gainch0;

++    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

++    int32_t m_gainch1;

++    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

++    int32_t m_gainch2;

++    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

++    int32_t m_gainch3;

++    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

++    int32_t m_gainch4;

++    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

++    int32_t m_gainch5;

++    /*!< m_gainch6 Gain Channel6 (U4.12)*/

++    int32_t m_gainch6;

++    /*!< m_gainch7 Gain Channel7 (U4.12)*/

++    int32_t m_gainch7;

++    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

++    int32_t m_sensormode;

++    /*!< m_wbindmat[16] Vector WB matrix*/

++    int32_t m_wbindmat[16];

++

++} ia_pal_isp_bxt_wb_stills_t;

++

++/*! \isp struct bxt_xnr4_m

++Scalable Chroma and Luma Denoise, Medium and High Frequency

++*/

++typedef struct

++{

++    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

++    int32_t jbl_mf_bypass_y;

++    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

++    int32_t jbl_mf_bypass_c;

++    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

++    int32_t noise_sigma_mf_y_y;

++    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

++    int32_t noise_sigma_mf_y_s;

++    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

++    int32_t noise_sigma_mf_c_y;

++    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

++    int32_t noise_sigma_mf_c_u;

++    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

++    int32_t noise_sigma_mf_c_v;

++    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_y_y;

++    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

++    int32_t rad_noise_sigma_mf_y_s;

++    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_c_y;

++    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

++    int32_t rad_noise_sigma_mf_c_u;

++    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

++    int32_t rad_noise_sigma_mf_c_v;

++    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_y_y;

++    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_c_y;

++    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

++    int32_t noise_epsilon_mf_c_u;

++    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

++    int32_t noise_epsilon_mf_c_v;

++    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_y_y;

++    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_y;

++    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_u;

++    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_v;

++    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_y;

++    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_c;

++    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

++    int32_t lpf_mf_coef_y[49];

++    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

++    int32_t lpf_mf_coef_c[49];

++    /*!< range_weight_lut[7] JBL range Weight LUT*/

++    int32_t range_weight_lut[7];

++    /*!< blend_mf_power_y MF denoise blending power y*/

++    int32_t blend_mf_power_y;

++    /*!< blend_mf_power_c MF denoise blending power chroma*/

++    int32_t blend_mf_power_c;

++    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

++    int32_t rad_blend_mf_power_y;

++    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

++    int32_t rad_blend_mf_power_c;

++    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

++    int32_t noise_beta_y_0;

++    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

++    int32_t noise_beta_u_0;

++    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

++    int32_t noise_beta_u_1;

++    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

++    int32_t noise_beta_v_0;

++    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

++    int32_t noise_beta_v_2;

++    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_x;

++    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_y;

++    /*!< rad_exp Radial scale bit into the Lut*/

++    int32_t rad_exp;

++    /*!< rad_lut[128] Radial LUT*/

++    int32_t rad_lut[128];

++    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

++    int32_t one_div_64_lut[64];

++    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

++    int32_t xcu_divsqrt_exp;

++    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

++    int32_t xcu_divsqrt_slp_a_res;

++    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

++    int32_t xcu_divsqrt_offset[16];

++    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

++    int32_t xcu_divsqrt_slope[16];

++    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

++    int32_t xcu_divsqrt_x[17];

++

++} ia_pal_isp_bxt_xnr4_m_t;

++

++/*! \isp struct bxt_xnr4_mh

++Scalable Chroma and Luma Denoise, Medium and High Frequency

++*/

++typedef struct

++{

++    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

++    int32_t jbl_mf_bypass_y;

++    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

++    int32_t jbl_mf_bypass_c;

++    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

++    int32_t noise_sigma_mf_y_y;

++    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

++    int32_t noise_sigma_mf_y_s;

++    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

++    int32_t noise_sigma_mf_c_y;

++    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

++    int32_t noise_sigma_mf_c_u;

++    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

++    int32_t noise_sigma_mf_c_v;

++    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_y_y;

++    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

++    int32_t rad_noise_sigma_mf_y_s;

++    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_c_y;

++    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

++    int32_t rad_noise_sigma_mf_c_u;

++    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

++    int32_t rad_noise_sigma_mf_c_v;

++    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_y_y;

++    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_c_y;

++    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

++    int32_t noise_epsilon_mf_c_u;

++    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

++    int32_t noise_epsilon_mf_c_v;

++    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_y_y;

++    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_y;

++    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_u;

++    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_v;

++    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_y;

++    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_c;

++    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

++    int32_t lpf_mf_coef_y[49];

++    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

++    int32_t lpf_mf_coef_c[49];

++    /*!< range_weight_lut[7] JBL range Weight LUT*/

++    int32_t range_weight_lut[7];

++    /*!< blend_mf_power_y MF denoise blending power y*/

++    int32_t blend_mf_power_y;

++    /*!< blend_mf_power_c MF denoise blending power chroma*/

++    int32_t blend_mf_power_c;

++    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

++    int32_t rad_blend_mf_power_y;

++    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

++    int32_t rad_blend_mf_power_c;

++    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

++    int32_t noise_beta_y_0;

++    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

++    int32_t noise_beta_u_0;

++    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

++    int32_t noise_beta_u_1;

++    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

++    int32_t noise_beta_v_0;

++    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

++    int32_t noise_beta_v_2;

++    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_x;

++    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_y;

++    /*!< rad_exp Radial scale bit into the Lut*/

++    int32_t rad_exp;

++    /*!< rad_lut[128] Radial LUT*/

++    int32_t rad_lut[128];

++    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

++    int32_t one_div_64_lut[64];

++    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

++    int32_t xcu_divsqrt_exp;

++    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

++    int32_t xcu_divsqrt_slp_a_res;

++    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

++    int32_t xcu_divsqrt_offset[16];

++    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

++    int32_t xcu_divsqrt_slope[16];

++    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

++    int32_t xcu_divsqrt_x[17];

++    /*!< jbl_hf_bypass_c Bypass HF Chroma*/

++    int32_t jbl_hf_bypass_c;

++    /*!< noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma*/

++    int32_t noise_sigma_hf_c_y;

++    /*!< noise_sigma_hf_c_u Noise Sigma HF Chroma per U*/

++    int32_t noise_sigma_hf_c_u;

++    /*!< noise_sigma_hf_c_v Noise Sigma HF Chroma per V*/

++    int32_t noise_sigma_hf_c_v;

++    /*!< rad_noise_sigma_hf_c_y Noise Sigma HF Chroma per Luma - radial*/

++    int32_t rad_noise_sigma_hf_c_y;

++    /*!< rad_noise_sigma_hf_c_u Noise Sigma HF Chroma per U - radial*/

++    int32_t rad_noise_sigma_hf_c_u;

++    /*!< rad_noise_sigma_hf_c_v Noise Sigma HF Chroma per V - radial*/

++    int32_t rad_noise_sigma_hf_c_v;

++    /*!< noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_hf_c_y;

++    /*!< noise_epsilon_hf_c_u Chroma min noise variance per U , Q12*/

++    int32_t noise_epsilon_hf_c_u;

++    /*!< noise_epsilon_hf_c_v Chroma min noise variance per V , Q12*/

++    int32_t noise_epsilon_hf_c_v;

++    /*!< rad_noise_epsilon_hf_c_y Chroma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_hf_c_y;

++    /*!< rad_noise_epsilon_hf_c_u Chroma min noise variance per U , Q12 -radial*/

++    int32_t rad_noise_epsilon_hf_c_u;

++    /*!< rad_noise_epsilon_hf_c_v Chroma min noise variance per V , Q12 -radial*/

++    int32_t rad_noise_epsilon_hf_c_v;

++    /*!< lpf_hf_coef_c[49] HF JBL Spatial coefs for Chroma*/

++    int32_t lpf_hf_coef_c[49];

++    /*!< jbl_weight_th_hf_c Chroma Weight threshold of HF JBL*/

++    int32_t jbl_weight_th_hf_c;

++    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/

++    int32_t lcs_th_low;

++    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/

++    int32_t lcs_th_high_delta;

++    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/

++    int32_t rad_lcs_th_low;

++    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/

++    int32_t rad_lcs_th_high_delta;

++    /*!< xcu_lcs_exp XCU ed exponent*/

++    int32_t xcu_lcs_exp;

++    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/

++    int32_t xcu_lcs_slp_a_res;

++    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/

++    int32_t xcu_lcs_offset[32];

++    /*!< xcu_lcs_slope[32] XCU ed slope vector*/

++    int32_t xcu_lcs_slope[32];

++    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/

++    int32_t xcu_lcs_x[33];

++    /*!< nncu_hf_luma_blend_exp NNCU HF Luma blend  exponent*/

++    int32_t nncu_hf_luma_blend_exp;

++    /*!< nncu_hf_luma_blend_offset[64] NNCU HF Luma blend offset vector*/

++    int32_t nncu_hf_luma_blend_offset[64];

++    /*!< nncu_hf_luma_blend_x_0 NNCU HF Luma blend first X cordinate*/

++    int32_t nncu_hf_luma_blend_x_0;

++    /*!< nncu_hf_luma_blend_x_max NNCU HF Luma blend last X cordinate ( the #65 corrdinate -1)*/

++    int32_t nncu_hf_luma_blend_x_max;

++    /*!< hf_luma_power HF Luma denoise power, Q15*/

++    int32_t hf_luma_power;

++    /*!< rad_hf_luma_power HF Luma denoise power, Q15 -radial*/

++    int32_t rad_hf_luma_power;

++    /*!< blend_hf_power_c blend_mf_power_c HF denoise blending power chroma*/

++    int32_t blend_hf_power_c;

++

++} ia_pal_isp_bxt_xnr4_mh_t;

++

++/*! \isp struct call_info

++Call info contains timestamp of current call to calculate ISP parameters. This information is used to determine run rate of each PAL component.

++*/

++typedef struct

++{

++    /*!< timestamp[2] Timestamp of current iteration. 64 bit value (using both int32 values in the array as one).*/

++    int32_t timestamp[2];

++

++} ia_pal_isp_call_info_t;

++

++/*! \isp struct cas_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Block enable for HW use*/

++    int32_t enable;

++    /*!< x_center Optical center x. Bittage is enough to fit 16K resolution*/

++    int32_t x_center;

++    /*!< y_center Optical center y. Bittage is enough to fit 16K resolution*/

++    int32_t y_center;

++    /*!< x_start Starting column of the fragment. Max number of pixels per line in a stripe is 4096*/

++    int32_t x_start;

++    /*!< y_start Starting row of the fragment (Usualy will be 0)*/

++    int32_t y_start;

++    /*!< inv_spatial_model[16] Describes the inverse spatial noise*/

++    int32_t inv_spatial_model[16];

++    /*!< spatial_step_log2 log2 of spatial lut step size. Bittage is enough for supporting 8192x4320 resulotion*/

++    int32_t spatial_step_log2;

++    /*!< nm_lut[16] noise model for luma. Save&restore register (will be ovveride in video mode)*/

++    int32_t nm_lut[16];

++    /*!< apu_alpha_limit update mechanism in apu - as limit increases, we need more measurements for the histogram bins to be considered as reliable.*/

++    int32_t apu_alpha_limit;

++    /*!< apu_alpha_power update mechanism in apu - as power increase, we count more on the new val calculated then the one from previous frame.*/

++    int32_t apu_alpha_power;

++    /*!< hist_vals[256] histogram valuse of APU to flow between fragments. save and restore. 2D array of size 16*(2^(4))( HWP_APU_N_VALUES*(1<<HWP_APU_HIST_N_BINS_EXP)). precision is 20 (HWP_APU_HIST_BIN_BITTAGE)*/

++    int32_t hist_vals[256];

++    /*!< skin_sharp_suppression_power Suppress sharpening in human skin areas*/

++    int32_t skin_sharp_suppression_power;

++    /*!< signal_metric_low_th low threshold for normalizing signal metric map*/

++    int32_t signal_metric_low_th;

++    /*!< signal_metric_slope slope for normalizing signal metric map*/

++    int32_t signal_metric_slope;

++    /*!< texture_noise_regulator detects less textures for higher values [0,0.2]*/

++    int32_t texture_noise_regulator;

++    /*!< texture_low_th low threshold for normalizing texture map. Values below this threshold will be consider as none texture.*/

++    int32_t texture_low_th;

++    /*!< texture_slope slope for normalizing texture map. This will be used to calculate the high threshold*/

++    int32_t texture_slope;

++    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

++    int32_t unsharpfilter[15];

++    /*!< power_luma_control_enable enables the luma control mechanism*/

++    int32_t power_luma_control_enable;

++    /*!< cu_power_luma_control_x[4] x axis values for luma sharpening config-unit*/

++    int32_t cu_power_luma_control_x[4];

++    /*!< cu_power_luma_control_y[3] y axis values for luma sharpening config-unit*/

++    int32_t cu_power_luma_control_y[3];

++    /*!< cu_power_luma_control_slope[3] slope values for luma sharpening config-unit*/

++    int32_t cu_power_luma_control_slope[3];

++    /*!< power_spatial_control_th adapts the power sharpening to spatial location - this threshold is the distance from which the adaptation begins*/

++    int32_t power_spatial_control_th;

++    /*!< power_spatial_control_multiply_factor adapts the power sharpening to spatial location - this it the factor for the power sharpening in the periphrial regions.*/

++    int32_t power_spatial_control_multiply_factor;

++    /*!< power_spatial_control_slope adapts the power sharpening to spatial location - this slope is how fast the adaptation with respect to the distance from the center. In order to bypass spatial control mechanism assign this variable to 0*/

++    int32_t power_spatial_control_slope;

++    /*!< sharpening_power_texture Power of unsharp-mask sharpening for texture regions*/

++    int32_t sharpening_power_texture;

++    /*!< sharpening_power_edges Power of unsharp-mask sharpening for edges regions*/

++    int32_t sharpening_power_edges;

++    /*!< skin_uv_center[2] center of the UV ellipse in UV space*/

++    int32_t skin_uv_center[2];

++    /*!< skin_uv_ellipse[3] minor and major axis UV ellipse. Symetric matrix therfore reducing values to 3 instead of 4*/

++    int32_t skin_uv_ellipse[3];

++    /*!< skin_uv_low_th low threshold for normalizing non-skin area map. Values below this threshold will be consider as skin.*/

++    int32_t skin_uv_low_th;

++    /*!< skin_uv_slope slope for normalizing non-skin map. This will be used to calculate the high threshold*/

++    int32_t skin_uv_slope;

++    /*!< skin_smoothing blending factor for smooting human skin using the bilateral*/

++    int32_t skin_smoothing;

++    /*!< inv_denoise_power 0 - strong denoiser, 63 - weak denoiser*/

++    int32_t inv_denoise_power;

++    /*!< sort_low_undershoots Sorting low undershoots*/

++    int32_t sort_low_undershoots;

++    /*!< alfa_os controls edged overshoot. 0 - no overshoot allowed, 63 - max overshoot allowed*/

++    int32_t alfa_os;

++    /*!< alfa_us controls edged undershoot. 0 - no undershoot allowed, 63 - max undershoot allowed*/

++    int32_t alfa_us;

++    /*!< os_us_delta_compression_threshold overshood/undershood delta which exceed threshold will be compressed. 0-no OS/US allowed. 511-no OS/US clipping.*/

++    int32_t os_us_delta_compression_threshold;

++    /*!< saturated_color_shrap_suppression_th the sharpening for max(u,v) above this threshold wll be suppressed*/

++    int32_t saturated_color_shrap_suppression_th;

++    /*!< saturated_color_shrap_suppression_factor the sharpening for max(u,v) above threshold wll be suppressed by this factor*/

++    int32_t saturated_color_shrap_suppression_factor;

++    /*!< os_us_delta_compression_factor overshoot / undershoot compression factor*/

++    int32_t os_us_delta_compression_factor;

++    /*!< conf_low_th the minimum number of samples consider reliable for APU estimation*/

++    int32_t conf_low_th;

++    /*!< conf_slope slope for normalizing confidence map. This will be used to calculate the high threshold*/

++    int32_t conf_slope;

++

++} ia_pal_isp_cas_1_0_t;

++

++/*! \isp struct ccm_3a_2_0

++AE color correction

++*/

++typedef struct

++{

++    /*!< gain_cx[8] WB coefficients*/

++    int32_t gain_cx[8];

++    /*!< m_1x[4] CCM matrix coefficients M11 - M14 (-4..4)*/

++    int32_t m_1x[4];

++    /*!< m_2x[4] CCM matrix coefficients M21 - M24 (-4..4)*/

++    int32_t m_2x[4];

++    /*!< m_3x[4] CCM matrix coefficients M21 - M24 (-4..4)*/

++    int32_t m_3x[4];

++    /*!< c_x[4] Y-calc matrix coefficients C01 - C04*/

++    int32_t c_x[4];

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++

++} ia_pal_isp_ccm_3a_2_0_t;

++

++/*! \isp struct comp_spliter

++

++*/

++typedef struct

++{

++    /*!< m_bypass bypass*/

++    int32_t m_bypass;

++

++} ia_pal_isp_comp_spliter_t;

++

++/*! \isp struct compand_1_0

++Companding 24bit --> 15bit

++*/

++typedef struct

++{

++    /*!< enable enable the companding*/

++    int32_t enable;

++    /*!< compand_enable enable the companding CU*/

++    int32_t compand_enable;

++    /*!< cu_companding_x[13] U24 linear, default log-limited*/

++    int32_t cu_companding_x[13];

++    /*!< cu_companding_y[12] U15 companded output*/

++    int32_t cu_companding_y[12];

++    /*!< cu_companding_slope[12] U1.14 15bit slopes for companding*/

++    int32_t cu_companding_slope[12];

++    /*!< linear_pedestal U24, Pedestal added in linear domain*/

++    int32_t linear_pedestal;

++

++} ia_pal_isp_compand_1_0_t;

++

++/*! \isp struct crop_sis

++

++*/

++typedef struct

++{

++    /*!< enable Enable pre SIS crop*/

++    int32_t enable;

++    /*!< crop_col_start crop_col_start*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_crop_sis_t;

++

++/*! \isp struct cvt_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enables the filter*/

++    int32_t enable;

++    /*!< enable_upsample enables upsampling (YUV422 --> YUV444)*/

++    int32_t enable_upsample;

++    /*!< enable_downsample enables downsampling (YUV444 --> YUV422)*/

++    int32_t enable_downsample;

++    /*!< enable_csc enables color space conversion (YUV  <--> RGB)*/

++    int32_t enable_csc;

++    /*!< enable_vertical_decimation enables vertical decimation*/

++    int32_t enable_vertical_decimation;

++    /*!< enable_horizontal_decimation enabled horizontal decimation*/

++    int32_t enable_horizontal_decimation;

++    /*!< enable_shuffle enables_shuffle*/

++    int32_t enable_shuffle;

++    /*!< csc_matrix[9] yuv to rgb to yuv conversion matrix, S4.11*/

++    int32_t csc_matrix[9];

++    /*!< shuffle_map_component_0 shuffle mapping of component 0*/

++    int32_t shuffle_map_component_0;

++    /*!< shuffle_map_component_1 shuffle mapping of component 1*/

++    int32_t shuffle_map_component_1;

++    /*!< shuffle_map_component_2 shuffle mapping of component 2*/

++    int32_t shuffle_map_component_2;

++    /*!< shuffle_map_component_3 shuffle mapping of component 3*/

++    int32_t shuffle_map_component_3;

++    /*!< shuffle_map_component_4 shuffle mapping of component 4*/

++    int32_t shuffle_map_component_4;

++    /*!< shuffle_map_component_5 shuffle mapping of component 5*/

++    int32_t shuffle_map_component_5;

++    /*!< decimation_type 0-Y, 1-RGB, 2-YUV420, 3-YUV422*/

++    int32_t decimation_type;

++

++} ia_pal_isp_cvt_1_0_t;

++

++/*! \isp struct debug_info

++

++*/

++typedef struct

++{

++    /*!< output_data_id Output data ID. Debugging data to match P2P call sequence with correct PAL output data. AIC increments this value by 1 on every call to ia_isp_bxt_run().*/

++    int32_t output_data_id;

++

++} ia_pal_isp_debug_info_t;

++

++/*! \isp struct decompand_1_0

++Decompanding 15bit --> 24bit

++*/

++typedef struct

++{

++    /*!< enable enable the decompanding*/

++    int32_t enable;

++    /*!< decompand_enable enable the decompanding CU*/

++    int32_t decompand_enable;

++    /*!< cu_decompanding_x[13] U15 linear, companded*/

++    int32_t cu_decompanding_x[13];

++    /*!< cu_decompanding_y[12] U24 decompanded output, default log-limited*/

++    int32_t cu_decompanding_y[12];

++    /*!< cu_decompanding_slope[12] U20.6 26bit slopes for companding*/

++    int32_t cu_decompanding_slope[12];

++    /*!< linear_pedestal U24, Pedestal added in linear domain*/

++    int32_t linear_pedestal;

++

++} ia_pal_isp_decompand_1_0_t;

++

++/*! \isp struct dehaze_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enabling the block. If enable is false, output is RGB obtained w/o 'dehazing'*/

++    int32_t enable;

++    /*!< dehaze_power the strength of the dehazing - obtained from previous frame*/

++    int32_t dehaze_power;

++    /*!< coeff_al overall airlight intrusion parameter*/

++    int32_t coeff_al;

++    /*!< airlight_color[3] airlight color - obtained from previouse frame*/

++    int32_t airlight_color[3];

++    /*!< trans_min minimal accepted tranmission used for transmition map calculation*/

++    int32_t trans_min;

++    /*!< trans_max maximal accepted tranmission used for transmition map calculation*/

++    int32_t trans_max;

++    /*!< quasi_satur_coeff quasi saturation coefficient*/

++    int32_t quasi_satur_coeff;

++    /*!< high_th threshold defining 'edges'*/

++    int32_t high_th;

++    /*!< low_th threshold defining 'flats'*/

++    int32_t low_th;

++    /*!< low_sim_alpha weight of the haze calculated on area used on 'edges'*/

++    int32_t low_sim_alpha;

++    /*!< med_sim_alpha weigh of the haze calculated on area used everwhere except edges and 'flats'*/

++    int32_t med_sim_alpha;

++    /*!< saturation_amp color saturation boost*/

++    int32_t saturation_amp;

++    /*!< update_power_weight mixing coefficient between the old and the new power (defines dynamic behaviour)*/

++    int32_t update_power_weight;

++    /*!< update_haze_color_weight mixing coefficient between the old and the new haze color (defines dynamic behaviour)*/

++    int32_t update_haze_color_weight;

++    /*!< min_tr_for_haze_color minimal transmision value for haze color calculation*/

++    int32_t min_tr_for_haze_color;

++    /*!< max_tr_for_haze_color maximal transmision value for haze color calculation*/

++    int32_t max_tr_for_haze_color;

++    /*!< cu_trans_x[7] power config unit x values*/

++    int32_t cu_trans_x[7];

++    /*!< cu_trans_y[6] power config unit y values*/

++    int32_t cu_trans_y[6];

++    /*!< cu_trans_slopes[6] power config unit slopes values*/

++    int32_t cu_trans_slopes[6];

++    /*!< cu_power_x[4] transmission config unit x values*/

++    int32_t cu_power_x[4];

++    /*!< cu_power_y[3] transmission config unit y values*/

++    int32_t cu_power_y[3];

++    /*!< cu_power_slopes[3] transmission config unit y values*/

++    int32_t cu_power_slopes[3];

++    /*!< max_h_for_update max H value to use for haze color and power updates*/

++    int32_t max_h_for_update;

++    /*!< CCM_yuv2rgb_matrix[9] S3.14, matrix for conversion from Yuv to RGB*/

++    int32_t CCM_yuv2rgb_matrix[9];

++    /*!< max_uv_haze_color maximal u and v values of haze color*/

++    int32_t max_uv_haze_color;

++    /*!< fragment_h_acc accumulator for haze coordinate value sum on the fragment*/

++    int32_t fragment_h_acc;

++    /*!< fragment_x1_acc accumulator for x1 coordinate value sum on the fragment*/

++    int32_t fragment_x1_acc;

++    /*!< fragment_x2_acc accumulator for x2 coordinate value sum on the fragment*/

++    int32_t fragment_x2_acc;

++    /*!< fragment_pixel_counter accumulator for pixel counter on the fragment*/

++    int32_t fragment_pixel_counter;

++    /*!< fragment_number number of the fragment [0..15]*/

++    int32_t fragment_number;

++    /*!< fragments_in_total fragments in total*/

++    int32_t fragments_in_total;

++    /*!< fragments_overlap fragments overlap*/

++    int32_t fragments_overlap;

++    /*!< pixels_in_total overall pixels in the frame (fragmentation support for 8K maximum)*/

++    int32_t pixels_in_total;

++    /*!< fragment_height fragment height*/

++    int32_t fragment_height;

++    /*!< fragment_width fragment width*/

++    int32_t fragment_width;

++

++} ia_pal_isp_dehaze_1_0_t;

++

++/*! \isp struct dma_cropper_dp

++

++*/

++typedef struct

++{

++    /*!< Bypass bypass the DMA_Cropper*/

++    int32_t Bypass;

++    /*!< crop_left number of pixels to crop from left*/

++    int32_t crop_left;

++    /*!< crop_top number of pixels to crop from top*/

++    int32_t crop_top;

++    /*!< uncropped_output_width output width before any cropping is done*/

++    int32_t uncropped_output_width;

++    /*!< uncropped_output_height output height before any cropping is done*/

++    int32_t uncropped_output_height;

++    /*!< cropped_width input crop width*/

++    int32_t cropped_width;

++    /*!< cropped_height input crop height*/

++    int32_t cropped_height;

++

++} ia_pal_isp_dma_cropper_dp_t;

++

++/*! \isp struct dma_cropper_mp

++

++*/

++typedef struct

++{

++    /*!< Bypass bypass the DMA_Cropper*/

++    int32_t Bypass;

++    /*!< crop_left number of pixels to crop from left*/

++    int32_t crop_left;

++    /*!< crop_top number of pixels to crop from top*/

++    int32_t crop_top;

++    /*!< uncropped_output_width output width before any cropping is done*/

++    int32_t uncropped_output_width;

++    /*!< uncropped_output_height output height before any cropping is done*/

++    int32_t uncropped_output_height;

++    /*!< cropped_width input crop width*/

++    int32_t cropped_width;

++    /*!< cropped_height input crop height*/

++    int32_t cropped_height;

++

++} ia_pal_isp_dma_cropper_mp_t;

++

++/*! \isp struct dma_cropper_ppp

++

++*/

++typedef struct

++{

++    /*!< Bypass bypass the DMA_Cropper*/

++    int32_t Bypass;

++    /*!< crop_left number of pixels to crop from left*/

++    int32_t crop_left;

++    /*!< crop_top number of pixels to crop from top*/

++    int32_t crop_top;

++    /*!< uncropped_output_width output width before any cropping is done*/

++    int32_t uncropped_output_width;

++    /*!< uncropped_output_height output height before any cropping is done*/

++    int32_t uncropped_output_height;

++    /*!< cropped_width input crop width*/

++    int32_t cropped_width;

++    /*!< cropped_height input crop height*/

++    int32_t cropped_height;

++

++} ia_pal_isp_dma_cropper_ppp_t;

++

++/*! \isp struct dol_1_0

++Digital OverLap images 3 to 1 merge

++*/

++typedef struct

++{

++    /*!< enable enabling the block. If enable == false, Output = input_long*/

++    int32_t enable;

++    /*!< wb_multiplied_etr_short[4] U4.14, exposure ratio of short / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

++    int32_t wb_multiplied_etr_short[4];

++    /*!< wb_multiplied_etr_med[4] U4.14, exposure ratio of med / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

++    int32_t wb_multiplied_etr_med[4];

++    /*!< wb_multiplied_etr_long[4] U4.19, exposure ratio of long / short multiplied by WB gains, {Gr,R,B Gb}, 0…1*/

++    int32_t wb_multiplied_etr_long[4];

++    /*!< max_input_val U.0.20 - max value of input pixel*/

++    int32_t max_input_val;

++    /*!< is_medium_used indicates if medium image is valid*/

++    int32_t is_medium_used;

++    /*!< noise_model_beta_0_short[4] U.0.30, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

++    int32_t noise_model_beta_0_short[4];

++    /*!< noise_model_beta_1_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_1_short[4];

++    /*!< noise_model_beta_2_short[4] U.0.15, short exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_2_short[4];

++    /*!< noise_model_beta_0_med[4] U.0.30, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

++    int32_t noise_model_beta_0_med[4];

++    /*!< noise_model_beta_1_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_1_med[4];

++    /*!< noise_model_beta_2_med[4] U.0.15, medium/LCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_2_med[4];

++    /*!< noise_model_beta_0_long[4] U.0.30, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_0 by PAL*/

++    int32_t noise_model_beta_0_long[4];

++    /*!< noise_model_beta_1_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_1 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_1_long[4];

++    /*!< noise_model_beta_2_long[4] U.0.15, long/HCG exposure noise estimation, sigma^2 = beta_0 + beta_1*I + beta_2*I^2, derived from alpha_2 by PAL, {R,G,B}, 0…1*/

++    int32_t noise_model_beta_2_long[4];

++    /*!< motion_detector_gain U.2.7 motion detector gain, g_md*/

++    int32_t motion_detector_gain;

++    /*!< motion_detector_falarm_th U.3.5 motion detector false alarm threshold, FM_md*/

++    int32_t motion_detector_falarm_th;

++    /*!< cu_long_not_burnt_x[4] U 15.0 long exposure not-burnt soft threshold - x values*/

++    int32_t cu_long_not_burnt_x[4];

++    /*!< cu_long_not_burnt_y[3] U 1.7 long exposure not-burnt soft threshold  - y values*/

++    int32_t cu_long_not_burnt_y[3];

++    /*!< cu_long_not_burnt_slope[3] S 3.12 long exposure not-burnt soft threshold  - slope values*/

++    int32_t cu_long_not_burnt_slope[3];

++    /*!< cu_med_not_burnt_x[4] U 15.0 medium exposure not-burnt soft threshold  - x values*/

++    int32_t cu_med_not_burnt_x[4];

++    /*!< cu_med_not_burnt_y[3] U 1.7 medium exposure not-burnt soft threshold - y values*/

++    int32_t cu_med_not_burnt_y[3];

++    /*!< cu_med_not_burnt_slope[3] S 3.12 medium exposure not-burnt soft threshold - slope values*/

++    int32_t cu_med_not_burnt_slope[3];

++    /*!< cu_short_not_shadow_x[4] U 15.0 short exposure not-shadow soft threshold  - x values*/

++    int32_t cu_short_not_shadow_x[4];

++    /*!< cu_short_not_shadow_y[3] U 1.7 short exposure not-shadow soft threshold - y values*/

++    int32_t cu_short_not_shadow_y[3];

++    /*!< cu_short_not_shadow_slope[3] S 3.12 short exposure not-shadow soft threshold - slope values*/

++    int32_t cu_short_not_shadow_slope[3];

++    /*!< rad_blur_not_shadow_not_burnt_power U.1.7 the power of the blurred vs. blurred not shadow not burnt*/

++    int32_t rad_blur_not_shadow_not_burnt_power;

++    /*!< hdr_blending_weight_1 U.1.7 - HDR blending weight 1*/

++    int32_t hdr_blending_weight_1;

++    /*!< hdr_blending_weight_2 U.1.7 - HDR blending weight 2*/

++    int32_t hdr_blending_weight_2;

++    /*!< hdr_blending_weight_3 U.1.7 - HDR blending weight 3*/

++    int32_t hdr_blending_weight_3;

++    /*!< hdr_blending_weight_4 U.1.7 - HDR blending weight 4*/

++    int32_t hdr_blending_weight_4;

++    /*!< radiance_long_max_val_for_motion[4] U.0.20 - long max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_long_max_val_for_motion[4];

++    /*!< radiance_long_min_val_for_motion[4] S.0.21 - long min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_long_min_val_for_motion[4];

++    /*!< radiance_med_max_val_for_motion[4] U.0.20 - med max radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_med_max_val_for_motion[4];

++    /*!< radiance_med_min_val_for_motion[4] S.0.21 - med min radiance value for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_med_min_val_for_motion[4];

++    /*!< radiance_short_or_med_max_val_for_motion_vs_long[4] U.0.20 - short or med max radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_short_or_med_max_val_for_motion_vs_long[4];

++    /*!< radiance_short_or_med_min_val_for_motion_vs_long[4] S.0.21 - short or med min radiance value vs long for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_short_or_med_min_val_for_motion_vs_long[4];

++    /*!< radiance_short_max_val_for_motion_vs_med[4] U.0.20 - short max radiance value vs medium for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_short_max_val_for_motion_vs_med[4];

++    /*!< radiance_short_min_val_for_motion[4] S.0.21 - short min radiacne value for motion detector, {Gr,R,B Gb}, 0…1*/

++    int32_t radiance_short_min_val_for_motion[4];

++    /*!< cu_compression_x[8] U.20 cu_compression_x*/

++    int32_t cu_compression_x[8];

++    /*!< cu_compression_y[7] U.15 cu_compression_y*/

++    int32_t cu_compression_y[7];

++    /*!< cu_compression_slope[7] S.2.10 cu_compression_slope (12 bit include sign)*/

++    int32_t cu_compression_slope[7];

++    /*!< motion_dilation_enable enabling dilation on motion-detection map.*/

++    int32_t motion_dilation_enable;

++    /*!< noise_model_var_min_val_long[4] U.0.30 - min value of noise model variance for long/HCG exposure, {Gr,R,B Gb}*/

++    int32_t noise_model_var_min_val_long[4];

++    /*!< noise_model_var_min_val_med[4] U.0.30- min value of noise model variance for medium exposure, {Gr,R,B Gb}*/

++    int32_t noise_model_var_min_val_med[4];

++    /*!< noise_model_var_min_val_short[4] U.0.30 - min value of noise model variance for short exposure, {Gr,R,B Gb}*/

++    int32_t noise_model_var_min_val_short[4];

++    /*!< noise_norm_shift_long U.4.0 long exposure variance normalization*/

++    int32_t noise_norm_shift_long;

++    /*!< noise_norm_shift_med U.4.0 medium exposure variance normalization*/

++    int32_t noise_norm_shift_med;

++    /*!< noise_norm_shift_short U.4.0 short exposure variance normalization*/

++    int32_t noise_norm_shift_short;

++    /*!< dp_enable U1.0 bypass defective pixel sensitive motion detection*/

++    int32_t dp_enable;

++    /*!< dpreduce_prec_long U4.0 long exposure DP sensitive motion detection parameter precision*/

++    int32_t dpreduce_prec_long;

++    /*!< dpreduce_prec_med U4.0 medium exposure DP sensitive motion detection parameter precision*/

++    int32_t dpreduce_prec_med;

++    /*!< dpreduce_slope_long[4] U0.16 long exposure slope value for DP sensitive motion detection*/

++    int32_t dpreduce_slope_long[4];

++    /*!< dpreduce_slope_med[4] U0.16 medium exposure slope value for DP sensitive motion detection*/

++    int32_t dpreduce_slope_med[4];

++    /*!< dpreduce_thre_long[4] U0.16 long exposure threshold for DP sensitive motion detection*/

++    int32_t dpreduce_thre_long[4];

++    /*!< dpreduce_thre_med[4] U0.16 medium exposure threshold for DP sensitive motion detection*/

++    int32_t dpreduce_thre_med[4];

++    /*!< blf_scale_med U0.8 bilateral filter noise model scaling factor for medium exposure*/

++    int32_t blf_scale_med;

++    /*!< blf_scale_short U0.8 bilateral filter noise model scaling factor for short exposure*/

++    int32_t blf_scale_short;

++    /*!< chroma_coring_med U0.8 moving object chroma coring in medium exposure*/

++    int32_t chroma_coring_med;

++    /*!< chroma_coring_short U0.8 moving object chroma coring in short exposure*/

++    int32_t chroma_coring_short;

++    /*!< lfm_enable enabling LFM function*/

++    int32_t lfm_enable;

++    /*!< lfm_rshift1 U5.0*/

++    int32_t lfm_rshift1;

++    /*!< lfm_rshift2 U5.0*/

++    int32_t lfm_rshift2;

++    /*!< lfm_rshift3 S16.0*/

++    int32_t lfm_rshift3;

++    /*!< lfm_clipval1 U5.0*/

++    int32_t lfm_clipval1;

++    /*!< lfm_clipval2 U5.0*/

++    int32_t lfm_clipval2;

++    /*!< lfm_clipval3 U5.0*/

++    int32_t lfm_clipval3;

++    /*!< lfm_maxval_long U20.0*/

++    int32_t lfm_maxval_long;

++    /*!< lfm_maxval_med U20.0*/

++    int32_t lfm_maxval_med;

++    /*!< lfm_smf_th U5.0*/

++    int32_t lfm_smf_th;

++    /*!< lfm_flicker_thre U5.0*/

++    int32_t lfm_flicker_thre;

++    /*!< lfm_flicker_gain U3.6*/

++    int32_t lfm_flicker_gain;

++    /*!< lfm_a2 U5.6*/

++    int32_t lfm_a2;

++    /*!< lfm_b2 U10.0*/

++    int32_t lfm_b2;

++    /*!< lfm_a3 U5.6*/

++    int32_t lfm_a3;

++    /*!< lfm_b3 U10.0*/

++    int32_t lfm_b3;

++    /*!< lfm_blend_shift_long U4.0*/

++    int32_t lfm_blend_shift_long;

++    /*!< lfm_blend_shift_long_med U4.0*/

++    int32_t lfm_blend_shift_long_med;

++    /*!< lfm_blend_shift_long_med_short U4.0*/

++    int32_t lfm_blend_shift_long_med_short;

++

++} ia_pal_isp_dol_1_0_t;

++

++/*! \isp struct dol_2_0

++Exposure image merger

++*/

++typedef struct

++{

++    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/

++    int32_t bypass;

++    /*!< cfaBayer[4] Bayer CFA descriptor; 0: R, 1: Gr; 2: Gb, 3: B*/

++    int32_t cfaBayer[4];

++    /*!< decompandX0[5] Decompanding input 0*/

++    int32_t decompandX0[5];

++    /*!< decompandY0[4] Decompanding output 0*/

++    int32_t decompandY0[4];

++    /*!< decompandS0[4] Decompanding slope 0*/

++    int32_t decompandS0[4];

++    /*!< decompandX1[5] Decompanding input 1*/

++    int32_t decompandX1[5];

++    /*!< decompandY1[4] Decompanding output 1*/

++    int32_t decompandY1[4];

++    /*!< decompandS1[4] Decompanding slope 1*/

++    int32_t decompandS1[4];

++    /*!< decompandX2[5] Decompanding input 2*/

++    int32_t decompandX2[5];

++    /*!< decompandY2[4] Decompanding output 2*/

++    int32_t decompandY2[4];

++    /*!< decompandS2[4] Decompanding slope 2*/

++    int32_t decompandS2[4];

++    /*!< decompandX3[5] Decompanding input 3*/

++    int32_t decompandX3[5];

++    /*!< decompandY3[4] Decompanding output 3*/

++    int32_t decompandY3[4];

++    /*!< decompandS3[4] Decompanding slope 3*/

++    int32_t decompandS3[4];

++    /*!< dolStats[16] DOL statistic extraction descriptor*/

++    int32_t dolStats[16];

++    /*!< dolStatsMode DOL statistic extraction mode, 0: single, 1: pair, 2:  quad*/

++    int32_t dolStatsMode;

++    /*!< wbGains[16] White balancing gains {R G G B}; 1 refers to 4096*/

++    int32_t wbGains[16];

++    /*!< combGains[16] Additional gains {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/

++    int32_t combGains[16];

++    /*!< blackLevel[16] Black level {LEr, LEg, LEg, LEb, MEr,…, VEb};*/

++    int32_t blackLevel[16];

++    /*!< residualBlackLevel[16] Residual black level {LEr, LEg, LEg, LEb, MEr,…, VEb}; 1 refers to 4096*/

++    int32_t residualBlackLevel[16];

++    /*!< residualBlackLevel2[4] Residual black level {LE, ME, SE, VE} for luma; 1 refers to 4096*/

++    int32_t residualBlackLevel2[4];

++    /*!< numExp Number of exposure images*/

++    int32_t numExp;

++    /*!< expRatio[4] Exposure ratios {LE, ME, SE, VE}*/

++    int32_t expRatio[4];

++    /*!< satvalMax[4] Saturation value {LE, ME, SE, VE}*/

++    int32_t satvalMax[4];

++    /*!< satThr[4] Saturation range as bit shift {LE, ME, SE, VE}*/

++    int32_t satThr[4];

++    /*!< satvalMin[4] Minimum saturation value {LE, ME, SE, VE}*/

++    int32_t satvalMin[4];

++    /*!< desatModel[3] Desaturation model; details TBA*/

++    int32_t desatModel[3];

++    /*!< motionIndex Baseline exposure image for motion detection*/

++    int32_t motionIndex;

++    /*!< motionModel[6] Motion model {LM, LM, LM, MS, MS, MS}; details TBA*/

++    int32_t motionModel[6];

++    /*!< motionLo[4] Low signal range {L, L, M, M}; details TBA*/

++    int32_t motionLo[4];

++    /*!< motionHi[4] High signal range; details TBA*/

++    int32_t motionHi[4];

++    /*!< motionLimit[2] Motion map limits {Lo, Hi}*/

++    int32_t motionLimit[2];

++    /*!< flickerModel[6] Flicker model {LE, LE, LE, ME, ME, ME, SE, SE, SE}*/

++    int32_t flickerModel[6];

++    /*!< flickerMaxval[4] Flicker signal upper threshold {LE, ME, SE, VE}*/

++    int32_t flickerMaxval[4];

++    /*!< flickerLimit[2] Flicker map limits {Lo, Hi}*/

++    int32_t flickerLimit[2];

++    /*!< blendingLimit[2] Blending map limits {Lo, Hi}*/

++    int32_t blendingLimit[2];

++    /*!< pedestal Linear output image pedestal*/

++    int32_t pedestal;

++    /*!< compandX[12] Input*/

++    int32_t compandX[12];

++    /*!< compandY[11] Output*/

++    int32_t compandY[11];

++    /*!< compandS[11] Slope*/

++    int32_t compandS[11];

++

++} ia_pal_isp_dol_2_0_t;

++

++/*! \isp struct dol_mapper

++DOL color ID mapper

++*/

++typedef struct

++{

++    /*!< bypass Bypass mode; 0: HDR image, 1: long exposure image*/

++    int32_t bypass;

++    /*!< exposures Number of exposure images*/

++    int32_t exposures;

++    /*!< mapping[16] Pixel extraction descriptor*/

++    int32_t mapping[16];

++    /*!< mode Extraction mode: single (0), pair (1), quad (2)*/

++    int32_t mode;

++

++} ia_pal_isp_dol_mapper_t;

++

++/*! \isp struct dol_parser

++

++*/

++typedef struct

++{

++    /*!< vbp Vertical Blanking Period Before SE starts*/

++    int32_t vbp;

++    /*!< crop_x Pixels to be cropped along the width of the fragment*/

++    int32_t crop_x;

++    /*!< crop_y Pixels to be cropped along the height of the fragment*/

++    int32_t crop_y;

++    /*!< cropped_width Width of the fragment*/

++    int32_t cropped_width;

++    /*!< cropped_height Height of the fragment*/

++    int32_t cropped_height;

++

++} ia_pal_isp_dol_parser_t;

++

++/*! \isp struct dpc_1_1

++

++*/

++typedef struct

++{

++    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

++    int32_t afxoffset[32];

++    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

++    int32_t afxperiod[32];

++    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

++    int32_t afyoffset[32];

++    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

++    int32_t afyperiod[32];

++    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

++    int32_t hdrfactors[16];

++    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

++    int32_t hdrfactorsinverse[16];

++    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_slope[7];

++    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_x[8];

++    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_y[7];

++    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_slope[7];

++    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_x[8];

++    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_y[7];

++    /*!< configunitfix_slope[3] fix config unit*/

++    int32_t configunitfix_slope[3];

++    /*!< configunitfix_x[4] fix config unit*/

++    int32_t configunitfix_x[4];

++    /*!< configunitfix_y[3] fix config unit*/

++    int32_t configunitfix_y[3];

++    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_slope[7];

++    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_x[8];

++    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_y[7];

++    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_slope[7];

++    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_x[8];

++    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_y[7];

++    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

++    int32_t configunitrawvslb_slope[7];

++    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

++    int32_t configunitrawvslb_x[8];

++    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

++    int32_t configunitrawvslb_y[7];

++    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

++    int32_t configunitrawvsub_slope[7];

++    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

++    int32_t configunitrawvsub_x[8];

++    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

++    int32_t configunitrawvsub_y[7];

++    /*!< curx[1024] x locations of the static bad pixels*/

++    int32_t curx[1024];

++    /*!< cury[1024] y locations of the static bad pixels*/

++    int32_t cury[1024];

++    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t lbtype[16];

++    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t ubtype[16];

++    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

++    int32_t pelesttype[16];

++    /*!< dtype[16] 0-D1 1-D2  2-D3*/

++    int32_t dtype[16];

++    /*!< lbmasks[64] configurations related to the bayer pattern*/

++    int32_t lbmasks[64];

++    /*!< ubmasks[64] configurations related to the bayer pattern*/

++    int32_t ubmasks[64];

++    /*!< pmasks[384] configurations related to the bayer pattern*/

++    int32_t pmasks[384];

++    /*!< dmasks[48] configurations related to the bayer pattern*/

++    int32_t dmasks[48];

++    /*!< bitreduceshift Shift value for bit reduce block*/

++    int32_t bitreduceshift;

++    /*!< afenable enable for the AF unit block*/

++    int32_t afenable;

++    /*!< staticenable enable for the static LUT block*/

++    int32_t staticenable;

++    /*!< dynamicenable enable for the dynamic detection block*/

++    int32_t dynamicenable;

++    /*!< n_static_lut_entries number of static lut entries*/

++    int32_t n_static_lut_entries;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< frame_height frame height*/

++    int32_t frame_height;

++    /*!< paf_grid_en[32] paf grid enables*/

++    int32_t paf_grid_en[32];

++    /*!< paf_output_mode 0)disables, do not pass anything 1) first line sent to memset0 second line sent to memset1  2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

++    int32_t paf_output_mode;

++    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.  0: no swapping  1: swap B/C inputs*/

++    int32_t swapping1stbc;

++    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.  0: no swapping 1: swap C/D inputs*/

++    int32_t swapping1stcd;

++    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines  0: no swapping  1: swap A/B inputs*/

++    int32_t swapping2ndbc;

++    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines  0: no swapping 1: swap C/D inputs*/

++    int32_t swapping2ndcd;

++    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

++    int32_t pdaf_width;

++    /*!< pdaf_height Height in units of pdaf lines*/

++    int32_t pdaf_height;

++    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines 0=use the line*/

++    int32_t drop_pattern[32];

++    /*!< drop_period Period of the drop pattern*/

++    int32_t drop_period;

++

++} ia_pal_isp_dpc_1_1_t;

++

++/*! \isp struct dpc_1_3

++

++*/

++typedef struct

++{

++    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

++    int32_t afxoffset[32];

++    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

++    int32_t afxperiod[32];

++    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

++    int32_t afyoffset[32];

++    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

++    int32_t afyperiod[32];

++    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

++    int32_t hdrfactors[16];

++    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

++    int32_t hdrfactorsinverse[16];

++    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_slope[7];

++    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_x[8];

++    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_y[7];

++    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_slope[7];

++    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_x[8];

++    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_y[7];

++    /*!< configunitfix_slope[3] fix config unit*/

++    int32_t configunitfix_slope[3];

++    /*!< configunitfix_x[4] fix config unit*/

++    int32_t configunitfix_x[4];

++    /*!< configunitfix_y[3] fix config unit*/

++    int32_t configunitfix_y[3];

++    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_slope[7];

++    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_x[8];

++    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_y[7];

++    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_slope[7];

++    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_x[8];

++    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_y[7];

++    /*!< configunitrawvslb_slope[7] configunitrawvslb_slope*/

++    int32_t configunitrawvslb_slope[7];

++    /*!< configunitrawvslb_x[8] configunitrawvslb_x*/

++    int32_t configunitrawvslb_x[8];

++    /*!< configunitrawvslb_y[7] configunitrawvslb_y*/

++    int32_t configunitrawvslb_y[7];

++    /*!< configunitrawvsub_slope[7] configunitrawvsub_slope*/

++    int32_t configunitrawvsub_slope[7];

++    /*!< configunitrawvsub_x[8] configunitrawvsub_x*/

++    int32_t configunitrawvsub_x[8];

++    /*!< configunitrawvsub_y[7] configunitrawvsub_y*/

++    int32_t configunitrawvsub_y[7];

++    /*!< curx[1024] x locations of the static bad pixels*/

++    int32_t curx[1024];

++    /*!< cury[1024] y locations of the static bad pixels*/

++    int32_t cury[1024];

++    /*!< lbtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t lbtype[16];

++    /*!< ubtype[16] 0 - B1,   1 - B2,  2 - B3*/

++    int32_t ubtype[16];

++    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

++    int32_t pelesttype[16];

++    /*!< dtype[16] 0-D1 1-D2  2-D3*/

++    int32_t dtype[16];

++    /*!< lbmasks[64] configurations related to the bayer pattern*/

++    int32_t lbmasks[64];

++    /*!< ubmasks[64] configurations related to the bayer pattern*/

++    int32_t ubmasks[64];

++    /*!< pmasks[384] configurations related to the bayer pattern*/

++    int32_t pmasks[384];

++    /*!< dmasks[48] configurations related to the bayer pattern*/

++    int32_t dmasks[48];

++    /*!< bitreduceshift Shift value for bit reduce block*/

++    int32_t bitreduceshift;

++    /*!< afenable enable for the AF unit block*/

++    int32_t afenable;

++    /*!< staticenable enable for the static LUT block*/

++    int32_t staticenable;

++    /*!< dynamicenable enable for the dynamic detection block*/

++    int32_t dynamicenable;

++    /*!< n_static_lut_entries number of static lut entries*/

++    int32_t n_static_lut_entries;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< paf_grid_en[32] paf grid enables*/

++    int32_t paf_grid_en[32];

++    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

++    int32_t paf_output_mode;

++    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

++    int32_t swapping1stbc;

++    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping1stcd;

++    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

++    int32_t swapping2ndbc;

++    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping2ndcd;

++    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

++    int32_t pdaf_width;

++    /*!< pdaf_height Height in units of pdaf lines*/

++    int32_t pdaf_height;

++    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

++    int32_t drop_pattern[32];

++    /*!< drop_period Period of the drop pattern*/

++    int32_t drop_period;

++    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

++    int32_t paf_pattern_rearrangement_en;

++    /*!< afsXStart AF pixel detection crop - start X position*/

++    int32_t afsXStart;

++    /*!< afsYStart AF pixel detection crop - start Y position*/

++    int32_t afsYStart;

++    /*!< afsXEnd AF pixel detection crop - end X position*/

++    int32_t afsXEnd;

++    /*!< afsYEnd AF pixel detection crop - end Y position*/

++    int32_t afsYEnd;

++    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

++    int32_t afsXStartCropEn;

++    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

++    int32_t afsYStartCropEn;

++    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

++    int32_t afsXEndCropEn;

++    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

++    int32_t afsYEndCropEn;

++    /*!< bypass bypass to the block*/

++    int32_t bypass;

++    /*!< use_nlm[16] use non local means mechanism*/

++    int32_t use_nlm[16];

++    /*!< sad1_thr threshold on the first sad*/

++    int32_t sad1_thr;

++    /*!< sad2_thr threshold on the second sad*/

++    int32_t sad2_thr;

++    /*!< pixel_diff_thr threshold on the pixel difference*/

++    int32_t pixel_diff_thr;

++    /*!< min_direction_sad_thr threshold on the min direction*/

++    int32_t min_direction_sad_thr;

++    /*!< max_direction_sad_thr threshold on the max direction*/

++    int32_t max_direction_sad_thr;

++    /*!< saturation_thr protect pixels in saturated areas*/

++    int32_t saturation_thr;

++    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

++    int32_t ignore_ver_direction[16];

++    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

++    int32_t configunit_med_protection_slope[3];

++    /*!< configunit_med_protection_x[4] nlm fix config unit*/

++    int32_t configunit_med_protection_x[4];

++    /*!< configunit_med_protection_y[3] nlm fix config unit*/

++    int32_t configunit_med_protection_y[3];

++    /*!< clamping_disable disable clamping to support previous version of dpc*/

++    int32_t clamping_disable;

++    /*!< median_blend_coef median blending parameter*/

++    int32_t median_blend_coef;

++

++} ia_pal_isp_dpc_1_3_t;

++

++/*! \isp struct dpc_2_0

++

++*/

++typedef struct

++{

++    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

++    int32_t afxoffset[32];

++    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

++    int32_t afxperiod[32];

++    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

++    int32_t afyoffset[32];

++    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

++    int32_t afyperiod[32];

++    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

++    int32_t hdrfactors[16];

++    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

++    int32_t hdrfactorsinverse[16];

++    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_slope[7];

++    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_x[8];

++    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_y[7];

++    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_slope[7];

++    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_x[8];

++    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_y[7];

++    /*!< configunitfix_slope[3] fix config unit*/

++    int32_t configunitfix_slope[3];

++    /*!< configunitfix_x[4] fix config unit*/

++    int32_t configunitfix_x[4];

++    /*!< configunitfix_y[3] fix config unit*/

++    int32_t configunitfix_y[3];

++    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_slope[7];

++    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_x[8];

++    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_y[7];

++    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_slope[7];

++    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_x[8];

++    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_y[7];

++    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

++    int32_t pelesttype[16];

++    /*!< dtype[16] 0-D1 1-D2  2-D3*/

++    int32_t dtype[16];

++    /*!< pmasks[384] configurations related to the bayer pattern*/

++    int32_t pmasks[384];

++    /*!< dmasks[48] configurations related to the bayer pattern*/

++    int32_t dmasks[48];

++    /*!< bitreduceshift Shift value for bit reduce block*/

++    int32_t bitreduceshift;

++    /*!< afenable enable for the AF unit block*/

++    int32_t afenable;

++    /*!< dynamicenable enable for the dynamic detection block*/

++    int32_t dynamicenable;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< paf_grid_en[32] paf grid enables*/

++    int32_t paf_grid_en[32];

++    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

++    int32_t paf_output_mode;

++    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

++    int32_t swapping1stbc;

++    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping1stcd;

++    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

++    int32_t swapping2ndbc;

++    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping2ndcd;

++    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

++    int32_t pdaf_width;

++    /*!< pdaf_height Height in units of pdaf lines*/

++    int32_t pdaf_height;

++    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

++    int32_t drop_pattern[32];

++    /*!< drop_period Period of the drop pattern*/

++    int32_t drop_period;

++    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

++    int32_t paf_pattern_rearrangement_en;

++    /*!< afsXStart AF pixel detection crop - start X position*/

++    int32_t afsXStart;

++    /*!< afsYStart AF pixel detection crop - start Y position*/

++    int32_t afsYStart;

++    /*!< afsXEnd AF pixel detection crop - end X position*/

++    int32_t afsXEnd;

++    /*!< afsYEnd AF pixel detection crop - end Y position*/

++    int32_t afsYEnd;

++    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

++    int32_t afsXStartCropEn;

++    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

++    int32_t afsYStartCropEn;

++    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

++    int32_t afsXEndCropEn;

++    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

++    int32_t afsYEndCropEn;

++    /*!< bypass bypass to the block*/

++    int32_t bypass;

++    /*!< use_nlm[16] use non local means mechanism*/

++    int32_t use_nlm[16];

++    /*!< sad1_thr threshold on the first sad*/

++    int32_t sad1_thr;

++    /*!< sad2_thr threshold on the second sad*/

++    int32_t sad2_thr;

++    /*!< pixel_diff_thr threshold on the pixel difference*/

++    int32_t pixel_diff_thr;

++    /*!< min_direction_sad_thr threshold on the min direction*/

++    int32_t min_direction_sad_thr;

++    /*!< max_direction_sad_thr threshold on the max direction*/

++    int32_t max_direction_sad_thr;

++    /*!< saturation_thr protect pixels in saturated areas*/

++    int32_t saturation_thr;

++    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

++    int32_t ignore_ver_direction[16];

++    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

++    int32_t configunit_med_protection_slope[3];

++    /*!< configunit_med_protection_x[4] nlm fix config unit*/

++    int32_t configunit_med_protection_x[4];

++    /*!< configunit_med_protection_y[3] nlm fix config unit*/

++    int32_t configunit_med_protection_y[3];

++    /*!< clamping_disable disable clamping to support previous version of dpc*/

++    int32_t clamping_disable;

++    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/

++    int32_t sensor_type;

++    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/

++    int32_t fix_dist;

++    /*!< flip_neigb_axis flip neigb vs dist axis*/

++    int32_t flip_neigb_axis;

++    /*!< g_locations_for_sve[16] g on 4x4 grid*/

++    int32_t g_locations_for_sve[16];

++    /*!< config_median_blend_slope[3] blend coef cfg*/

++    int32_t config_median_blend_slope[3];

++    /*!< config_median_blend_x[4] blend coef cfg*/

++    int32_t config_median_blend_x[4];

++    /*!< config_median_blend_y[3] blend coef cfg*/

++    int32_t config_median_blend_y[3];

++    /*!< config_ridges_slope[3] ridge coef cfg*/

++    int32_t config_ridges_slope[3];

++    /*!< config_ridges_x[4] ridge coef cfg*/

++    int32_t config_ridges_x[4];

++    /*!< config_ridges_y[3] ridge coef cfg*/

++    int32_t config_ridges_y[3];

++

++} ia_pal_isp_dpc_2_0_t;

++

++/*! \isp struct drc_1

++DRC filter

++*/

++typedef struct

++{

++    /*!< Bypass Bypass filter*/

++    int32_t Bypass;

++    /*!< blus_ds_factor downscale factor: 8 or 16*/

++    int32_t blus_ds_factor;

++    /*!< blus_sp_coef_a[256] spatial coefficients A (top left), 0.0.15*/

++    int32_t blus_sp_coef_a[256];

++    /*!< blus_sp_coef_b[256] spatial coefficients B (top right), 0.0.15*/

++    int32_t blus_sp_coef_b[256];

++    /*!< blus_sp_coef_c[256] spatial coefficients C (bottom left), 0.0.15*/

++    int32_t blus_sp_coef_c[256];

++    /*!< blus_sp_coef_d[256] spatial coefficients D (bottom right), 0.0.15*/

++    int32_t blus_sp_coef_d[256];

++    /*!< blus_sim_min min value of similarity, 0.0.15*/

++    int32_t blus_sim_min;

++    /*!< lce_bypass LCE bypass*/

++    int32_t lce_bypass;

++    /*!< lce_model_slope LCE model slope, 1.7.8*/

++    int32_t lce_model_slope;

++    /*!< lce_model_offset LCE model offset, 1.7.8*/

++    int32_t lce_model_offset;

++    /*!< lce_viir_sp_weight VIIR spatial weight, 1.0.15*/

++    int32_t lce_viir_sp_weight;

++    /*!< lce_power LCE power, 0.3.12*/

++    int32_t lce_power;

++    /*!< lce_deadzone LCE deadzone, 0.0.15*/

++    int32_t lce_deadzone;

++    /*!< lce_clip LCE clip, 0.0.15*/

++    int32_t lce_clip;

++    /*!< lr_gain_map[133584] LRGain, 0.7.8*/

++    int32_t lr_gain_map[133584];

++    /*!< lr_wgt_map[133584] LRWgt*/

++    int32_t lr_wgt_map[133584];

++    /*!< lr_map_width map width*/

++    int32_t lr_map_width;

++    /*!< lr_map_height map height*/

++    int32_t lr_map_height;

++    /*!< gtm_bypass GTM bypass*/

++    int32_t gtm_bypass;

++    /*!< xcu_gtm_slope_vec[32] GTM xcu slope vector, 1.15-xcu_gtm_slope_resolution.xcu_gtm_slope_resolution*/

++    int32_t xcu_gtm_slope_vec[32];

++    /*!< xcu_gtm_offset_vec[32] GTM xcu offset vector, 0.0.15*/

++    int32_t xcu_gtm_offset_vec[32];

++    /*!< xcu_gtm_x_cord_vec[32] GTM xcu x cord vector, 0.0.15*/

++    int32_t xcu_gtm_x_cord_vec[32];

++    /*!< xcu_gtm_x_cord_max GTM xcu x cord max, 0.0.15*/

++    int32_t xcu_gtm_x_cord_max;

++    /*!< xcu_gtm_exponent GTM xcu exponent*/

++    int32_t xcu_gtm_exponent;

++    /*!< xcu_gtm_slope_resolution GTM xcu slope resolution*/

++    int32_t xcu_gtm_slope_resolution;

++    /*!< gtm_gain_frac_bit GTM gain fractional bit*/

++    int32_t gtm_gain_frac_bit;

++

++} ia_pal_isp_drc_1_t;

++

++/*! \isp struct drc_2

++LUT based DRC and Defog

++*/

++typedef struct

++{

++    /*!< bypass Bypass filter*/

++    int32_t bypass;

++    /*!< gtm_resolution GTM slope resolution*/

++    int32_t gtm_resolution;

++    /*!< gtm_slope_vec[32] GTM slope vector*/

++    int32_t gtm_slope_vec[32];

++    /*!< gtm_offset_vec[32] GTM offset vector*/

++    int32_t gtm_offset_vec[32];

++    /*!< gtm_x_cord_vec[32] GTM x cord vector*/

++    int32_t gtm_x_cord_vec[32];

++    /*!< gtm_x_cord_max GTM xcu x cord max, 0.0.15(for assertion)*/

++    int32_t gtm_x_cord_max;

++    /*!< gtm_exponent GTM xcu exponent(for assertion)*/

++    int32_t gtm_exponent;

++    /*!< gce_defog_resolution LCE&Defog slope resolution*/

++    int32_t gce_defog_resolution;

++    /*!< gce_defog_slope_vec[64] LCE&Defog slope vector*/

++    int32_t gce_defog_slope_vec[64];

++    /*!< gce_defog_offset_vec[64] LCE&Defog offset vector*/

++    int32_t gce_defog_offset_vec[64];

++    /*!< gce_defog_x_cord_vec[64] LCE&Defog x cord vector*/

++    int32_t gce_defog_x_cord_vec[64];

++    /*!< gce_defog_x_cord_max LCE&Defog xcu x cord max, 0.0.15(for assertion)*/

++    int32_t gce_defog_x_cord_max;

++    /*!< gce_defog_exponent LCE&Defog xcu exponent(for assertion)*/

++    int32_t gce_defog_exponent;

++    /*!< defog_A0 Control threshold for defog*/

++    int32_t defog_A0;

++    /*!< defog_A1 Control threshold for defog*/

++    int32_t defog_A1;

++    /*!< sharp_amountL Control sharpening strength L*/

++    int32_t sharp_amountL;

++    /*!< sharp_maxL Control sharpening max L*/

++    int32_t sharp_maxL;

++    /*!< sharp_thrL Control sharpening threshold L*/

++    int32_t sharp_thrL;

++    /*!< sharp_amountS Control sharpening strength S*/

++    int32_t sharp_amountS;

++    /*!< sharp_maxS Control sharpening max S*/

++    int32_t sharp_maxS;

++    /*!< sharp_thrS Control sharpening threshold S*/

++    int32_t sharp_thrS;

++    /*!< ltm_enable ltm enable*/

++    int32_t ltm_enable;

++    /*!< ltm_weight ltm weight*/

++    int32_t ltm_weight;

++

++} ia_pal_isp_drc_2_t;

++

++/*! \isp struct ds_dynamic

++Position in 2x2 QUAD form

++*/

++typedef struct

++{

++    /*!< extract_pos Position in 2x2 QUAD form - to extract pixel or pixel position in (00, 01, 10, 11) to perform downscale*/

++    int32_t extract_pos;

++

++} ia_pal_isp_ds_dynamic_t;

++

++/*! \isp struct dvsstatistics_2

++

++*/

++typedef struct

++{

++    /*!< kappa Global configuration - kappa*/

++    int32_t kappa;

++    /*!< match_shift Global configuration - match_shift*/

++    int32_t match_shift;

++    /*!< ybin_mode Global configuration - y binning mode*/

++    int32_t ybin_mode;

++    /*!< grid_width_l0 DVS statistics grid width level 0*/

++    int32_t grid_width_l0;

++    /*!< grid_height_l0 DVS statistics grid height level 0*/

++    int32_t grid_height_l0;

++    /*!< block_width_l0 DVS statistics block width level 0*/

++    int32_t block_width_l0;

++    /*!< block_height_l0 DVS statistics block height level 0*/

++    int32_t block_height_l0;

++    /*!< x_start_l0 DVS statistics level 0 x start*/

++    int32_t x_start_l0;

++    /*!< y_start_l0 DVS statistics level 0 y start*/

++    int32_t y_start_l0;

++    /*!< enabled_l0 DVS statistics level 0 enable*/

++    int32_t enabled_l0;

++    /*!< x_end_l0 DVS statistics level 0 x end*/

++    int32_t x_end_l0;

++    /*!< y_end_l0 DVS statistics level 0 y end*/

++    int32_t y_end_l0;

++    /*!< grid_width_l1 DVS statistics grid width level 1*/

++    int32_t grid_width_l1;

++    /*!< grid_height_l1 DVS statistics grid height level 1*/

++    int32_t grid_height_l1;

++    /*!< block_width_l1 DVS statistics block width level 1*/

++    int32_t block_width_l1;

++    /*!< block_height_l1 DVS statistics block height level 1*/

++    int32_t block_height_l1;

++    /*!< x_start_l1 DVS statistics level 1 x start*/

++    int32_t x_start_l1;

++    /*!< y_start_l1 DVS statistics level 1 y start*/

++    int32_t y_start_l1;

++    /*!< enabled_l1 DVS statistics level 1 enable*/

++    int32_t enabled_l1;

++    /*!< x_end_l1 DVS statistics level 1 x end*/

++    int32_t x_end_l1;

++    /*!< y_end_l1 DVS statistics level 1 y end*/

++    int32_t y_end_l1;

++    /*!< grid_width_l2 DVS statistics grid width level 2*/

++    int32_t grid_width_l2;

++    /*!< grid_height_l2 DVS statistics grid height level 2*/

++    int32_t grid_height_l2;

++    /*!< block_width_l2 DVS statistics block width level 2*/

++    int32_t block_width_l2;

++    /*!< block_height_l2 DVS statistics block height level 2*/

++    int32_t block_height_l2;

++    /*!< x_start_l2 DVS statistics level 2 x start*/

++    int32_t x_start_l2;

++    /*!< y_start_l2 DVS statistics level 2 y start*/

++    int32_t y_start_l2;

++    /*!< enabled_l2 DVS statistics level 2 enable*/

++    int32_t enabled_l2;

++    /*!< x_end_l2 DVS statistics level 2 x end*/

++    int32_t x_end_l2;

++    /*!< y_end_l2 DVS statistics level 2 y end*/

++    int32_t y_end_l2;

++    /*!< feroi_x_start_l0 DVS statistics fe-roi level 0 x start*/

++    int32_t feroi_x_start_l0;

++    /*!< feroi_y_start_l0 DVS statistics fe-roi level 0 y start*/

++    int32_t feroi_y_start_l0;

++    /*!< feroi_x_end_l0 DVS statistics fe-roi level 0 x end*/

++    int32_t feroi_x_end_l0;

++    /*!< feroi_y_end_l0 DVS statistics fe-roi level 0 y end*/

++    int32_t feroi_y_end_l0;

++    /*!< feroi_x_start_l1 DVS statistics fe-roi level 1 x start*/

++    int32_t feroi_x_start_l1;

++    /*!< feroi_y_start_l1 DVS statistics fe-roi level 1 y start*/

++    int32_t feroi_y_start_l1;

++    /*!< feroi_x_end_l1 DVS statistics fe-roi level 1 x end*/

++    int32_t feroi_x_end_l1;

++    /*!< feroi_y_end_l1 DVS statistics fe-roi level 1 y end*/

++    int32_t feroi_y_end_l1;

++    /*!< feroi_x_start_l2 DVS statistics fe-roi level 2 x start*/

++    int32_t feroi_x_start_l2;

++    /*!< feroi_y_start_l2 DVS statistics fe-roi level 2 y start*/

++    int32_t feroi_y_start_l2;

++    /*!< feroi_x_end_l2 DVS statistics fe-roi level 2 x end*/

++    int32_t feroi_x_end_l2;

++    /*!< feroi_y_end_l2 DVS statistics fe-roi level 2 y end*/

++    int32_t feroi_y_end_l2;

++

++} ia_pal_isp_dvsstatistics_2_t;

++

++/*! \isp struct espa_1_0

++Extendedn Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++

++} ia_pal_isp_espa_1_0_t;

++

++/*! \isp struct espa_1_1

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_1_1_t;

++

++/*! \isp struct espa_isa_bayer_a

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_bayer_a_t;

++

++/*! \isp struct espa_isa_ir_md

++Extended Stream Precision Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_ir_md_t;

++

++/*! \isp struct espa_isa_sis_a

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_sis_a_t;

++

++/*! \isp struct espa_isa_sis_b

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_sis_b_t;

++

++/*! \isp struct espa_isa_wb

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_wb_t;

++

++/*! \isp struct espa_isa_yuv_a

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_yuv_a_t;

++

++/*! \isp struct espa_isa_yuv_b

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_yuv_b_t;

++

++/*! \isp struct espa_isa_yuv_c

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_isa_yuv_c_t;

++

++/*! \isp struct espa_psa_1

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_1_t;

++

++/*! \isp struct espa_psa_4

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_4_t;

++

++/*! \isp struct espa_psa_5

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_5_t;

++

++/*! \isp struct espa_psa_c

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_c_t;

++

++/*! \isp struct espa_psa_d

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_d_t;

++

++/*! \isp struct espa_psa_e

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_e_t;

++

++/*! \isp struct espa_psa_f

++Extended Stream Precsion Adapter

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_f_t;

++

++/*! \isp struct espa_psa_g

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_g_t;

++

++/*! \isp struct espa_psa_h

++

++*/

++typedef struct

++{

++    /*!< Shift_l_comp_0 Shif_Left_enable_for_channel_0: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_0;

++    /*!< Shift_l_comp_1 Shif_Left_enable_for_channel_1: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_1;

++    /*!< Shift_l_comp_2 Shif_Left_enable_for_channel_2: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_2;

++    /*!< Shift_l_comp_3 Shif_Left_enable_for_channel_3: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_3;

++    /*!< Shift_l_comp_4 Shif_Left_enable_for_channel_4: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_4;

++    /*!< Shift_l_comp_5 Shif_Left_enable_for_channel_5: 0 -shift right with round, 1- shift left*/

++    int32_t Shift_l_comp_5;

++    /*!< Shift_val_comp_0 Shif_value_for_channel_0*/

++    int32_t Shift_val_comp_0;

++    /*!< Shift_val_comp_1 Shif_value_for_channel_1*/

++    int32_t Shift_val_comp_1;

++    /*!< Shift_val_comp_2 Shif_value_for_channel_2*/

++    int32_t Shift_val_comp_2;

++    /*!< Shift_val_comp_3 Shif_value_for_channel_3*/

++    int32_t Shift_val_comp_3;

++    /*!< Shift_val_comp_4 Shif_value_for_channel_4*/

++    int32_t Shift_val_comp_4;

++    /*!< Shift_val_comp_5 Shif_value_for_channel_5*/

++    int32_t Shift_val_comp_5;

++    /*!< Clip_min_comp_0 Clip_to_positive_for_channel_0*/

++    int32_t Clip_min_comp_0;

++    /*!< Clip_min_comp_1 Clip_to_positive_for_channel_1*/

++    int32_t Clip_min_comp_1;

++    /*!< Clip_min_comp_2 Clip_to_positive_for_channel_2*/

++    int32_t Clip_min_comp_2;

++    /*!< Clip_min_comp_3 Clip_to_positive_for_channel_3*/

++    int32_t Clip_min_comp_3;

++    /*!< Clip_min_comp_4 Clip_to_positive_for_channel_4*/

++    int32_t Clip_min_comp_4;

++    /*!< Clip_min_comp_5 Clip_to_positive_for_channel_5*/

++    int32_t Clip_min_comp_5;

++    /*!< Clip_max_comp_0 Clip_to_negative_for_channel_0*/

++    int32_t Clip_max_comp_0;

++    /*!< Clip_max_comp_1 Clip_to_negative_for_channel_1*/

++    int32_t Clip_max_comp_1;

++    /*!< Clip_max_comp_2 Clip_to_negative_for_channel_2*/

++    int32_t Clip_max_comp_2;

++    /*!< Clip_max_comp_3 Clip_to_negative_for_channel_3*/

++    int32_t Clip_max_comp_3;

++    /*!< Clip_max_comp_4 Clip_to_negative_for_channel_4*/

++    int32_t Clip_max_comp_4;

++    /*!< Clip_max_comp_5 Clip_to_negative_for_channel_5*/

++    int32_t Clip_max_comp_5;

++    /*!< Offset_comp_0 Ofset_value_for_channel_0*/

++    int32_t Offset_comp_0;

++    /*!< Offset_comp_1 Ofset_value_for_channel_1*/

++    int32_t Offset_comp_1;

++    /*!< Offset_comp_2 Ofset_value_for_channel_2*/

++    int32_t Offset_comp_2;

++    /*!< Offset_comp_3 Ofset_value_for_channel_3*/

++    int32_t Offset_comp_3;

++    /*!< Offset_comp_4 Ofset_value_for_channel_4*/

++    int32_t Offset_comp_4;

++    /*!< Offset_comp_5 Ofset_value_for_channel_5*/

++    int32_t Offset_comp_5;

++    /*!< Clip_min_val_0 Clip_min_value_for_channel_0*/

++    int32_t Clip_min_val_0;

++    /*!< Clip_max_val_0 Clip_max_value_for_channel_0*/

++    int32_t Clip_max_val_0;

++    /*!< Clip_min_val_1 Clip_min_value_for_channel_1*/

++    int32_t Clip_min_val_1;

++    /*!< Clip_max_val_1 Clip_max_value_for_channel_1*/

++    int32_t Clip_max_val_1;

++    /*!< Clip_min_val_2 Clip_min_value_for_channel_2*/

++    int32_t Clip_min_val_2;

++    /*!< Clip_max_val_2 Clip_max_value_for_channel_2*/

++    int32_t Clip_max_val_2;

++    /*!< Clip_min_val_3 Clip_min_value_for_channel_3*/

++    int32_t Clip_min_val_3;

++    /*!< Clip_max_val_3 Clip_max_value_for_channel_3*/

++    int32_t Clip_max_val_3;

++    /*!< Clip_min_val_4 Clip_min_value_for_channel_4*/

++    int32_t Clip_min_val_4;

++    /*!< Clip_max_val_4 Clip_max_value_for_channel_4*/

++    int32_t Clip_max_val_4;

++    /*!< Clip_min_val_5 Clip_min_value_for_channel_5*/

++    int32_t Clip_min_val_5;

++    /*!< Clip_max_val_5 Clip_max_value_for_channel_5*/

++    int32_t Clip_max_val_5;

++    /*!< range_reduction_en range_reduction_en*/

++    int32_t range_reduction_en;

++    /*!< output_resolution bpp of output image. 8, 10 and 12 are valid.*/

++    int32_t output_resolution;

++    /*!< MSB_alignment_en 6 bit shift left for P010, 4 for P012*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_espa_psa_h_t;

++

++/*! \isp struct exy

++

++*/

++typedef struct

++{

++    /*!< bypass Bypass filter*/

++    int32_t bypass;

++    /*!< Coef[2] filter coefficients*/

++    int32_t Coef[2];

++    /*!< NS_shift shifting noise stream to the relevant range*/

++    int32_t NS_shift;

++

++} ia_pal_isp_exy_t;

++

++/*! \isp struct fr_grid_1_0

++FR Statistics

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128,256)*/

++    int32_t block_height;

++    /*!< y_fr_en 0: FF will not write to the Y  array; 1: FF will write  to the Y  array*/

++    int32_t y_fr_en;

++    /*!< x_start X top left corner of the grid*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid*/

++    int32_t y_end;

++    /*!< shftr_val_x[4] Log2(num pixels of estimated colour component in a block). The binding as follows: m_ShftR_val_Y00 = shftr_val_x[0]; m_ShftR_val_Y01 = shftr_val_x[1];m_ShftR_val_Y10 = shftr_val_x[2];m_ShftR_val_Y11 = shftr_val_x[3];*/

++    int32_t shftr_val_x[4];

++    /*!< gx_0[4] gx0 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_0[4];

++    /*!< gx_1[4] gx1 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_1[4];

++    /*!< gx_2[4] gx2 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_2[4];

++    /*!< gx_3[4] gx3 Y_calc contribution ratio for Pat_ij*/

++    int32_t gx_3[4];

++    /*!< mask_y0 selecting the relevant pixels for Y0; bit k = row * 4 + column*/

++    int32_t mask_y0;

++    /*!< mask_y1 selecting the relevant pixels for Y1; bit k = row * 4 + column*/

++    int32_t mask_y1;

++    /*!< oe_y0 output enable for Y0; bit k corresponds to row * 2 + column*/

++    int32_t oe_y0;

++    /*!< oe_y1 output enable for Y1; bit k corresponds to row * 2 + column*/

++    int32_t oe_y1;

++    /*!< on_x_y0[4] Y0 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y0[4];

++    /*!< on_x_y1[4] Y1 estimation normalization (00, 01, 10, 11)*/

++    int32_t on_x_y1[4];

++    /*!< y00_filter_coeff[6] filter coefficients for Y00 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y00_filter_coeff[6];

++    /*!< y00_filter_sign_vec sign vector for Y00*/

++    int32_t y00_filter_sign_vec;

++    /*!< y01_filter_coeff[6] filter coefficients for Y01 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y01_filter_coeff[6];

++    /*!< y01_filter_sign_vec sign vector for Y01*/

++    int32_t y01_filter_sign_vec;

++    /*!< y10_filter_coeff[6] filter coefficients for Y10 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y10_filter_coeff[6];

++    /*!< y10_filter_sign_vec sign vector for Y10*/

++    int32_t y10_filter_sign_vec;

++    /*!< y11_filter_coeff[6] filter coefficients for Y11 (A1, A2, A3, A4, A5, A6)*/

++    int32_t y11_filter_coeff[6];

++    /*!< y11_filter_sign_vec sign vector for Y11*/

++    int32_t y11_filter_sign_vec;

++    /*!< nf_x[4] Filter response normalization factors for Y00, Y01, Y10, Y11*/

++    int32_t nf_x[4];

++    /*!< sensor_mode Sensor mode 0: 1x1,  1: 2x2, 2: 4x4*/

++    int32_t sensor_mode;

++    /*!< downscaling_factor Downscaling factor 0: 1x, 1: 2x, 2: 4x*/

++    int32_t downscaling_factor;

++    /*!< y00_blending_weight Median filter weight for Y00*/

++    int32_t y00_blending_weight;

++    /*!< y01_blending_weight Median filter weight for Y01*/

++    int32_t y01_blending_weight;

++    /*!< y10_blending_weight Median filter weight for Y10*/

++    int32_t y10_blending_weight;

++    /*!< y11_blending_weight Median filter weight for Y11*/

++    int32_t y11_blending_weight;

++

++} ia_pal_isp_fr_grid_1_0_t;

++

++/*! \isp struct gammastar_1

++Initial Gamma* filter

++*/

++typedef struct

++{

++    /*!< gamma_star_en Bypass filter*/

++    int32_t gamma_star_en;

++    /*!< crop_enable Enable Crop by EDE block*/

++    int32_t crop_enable;

++    /*!< crop_parameters[4] Crop parameters*/

++    int32_t crop_parameters[4];

++    /*!< saturation_enable Saturation sub-block bypass*/

++    int32_t saturation_enable;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< rgb2y_coef[5] RGB to luma conversion coefficients*/

++    int32_t rgb2y_coef[5];

++    /*!< extrap_blend_alpha blending coefficient used in extrapolation*/

++    int32_t extrap_blend_alpha;

++    /*!< tm_num_rows number of rows in TM grid*/

++    int32_t tm_num_rows;

++    /*!< tm_num_cols number of columns in TM grid*/

++    int32_t tm_num_cols;

++    /*!< spatial_weight[64] List of spatial weights*/

++    int32_t spatial_weight[64];

++    /*!< tm_blk_sz_shift Log2 of Number of pixels in row/column of TM block*/

++    int32_t tm_blk_sz_shift;

++    /*!< init_row First image pixel offset relative to the TM grid and the initial pixel*/

++    int32_t init_row;

++    /*!< init_col First image pixel offset relative to the TM grid and the initial pixel*/

++    int32_t init_col;

++    /*!< spatial_index_shift Shift value between index in Blk and index in spatial weights vector*/

++    int32_t spatial_index_shift;

++    /*!< output_shift Final shift, at end of block, converting working precision to required output precision*/

++    int32_t output_shift;

++    /*!< cu_similarity_weight_mapping_x[11] config unit mapping luma diff to similarity weights , X values*/

++    int32_t cu_similarity_weight_mapping_x[11];

++    /*!< cu_similarity_weight_mapping_b[10] config unit mapping luma diff to similarity weights,  Y values*/

++    int32_t cu_similarity_weight_mapping_b[10];

++    /*!< cu_similarity_weight_mapping_a[10] config unit mapping luma diff to similarity weights, Slope values*/

++    int32_t cu_similarity_weight_mapping_a[10];

++    /*!< cu_chroma_control_x[10] config unit for chroma control, X values*/

++    int32_t cu_chroma_control_x[10];

++    /*!< cu_chroma_control_b[9] config unit for chroma control, Y values*/

++    int32_t cu_chroma_control_b[9];

++    /*!< cu_chroma_control_a[9] config unit for chroma control, Slope values*/

++    int32_t cu_chroma_control_a[9];

++    /*!< tm_grid_xay[1595000] LUT that holds gammastar grid points x, slope and y values*/

++    uint16_t tm_grid_xay[1595000];

++

++} ia_pal_isp_gammastar_1_t;

++

++/*! \isp struct gammatm_v3

++

++*/

++typedef struct

++{

++    /*!< enable enable for the filter*/

++    int32_t enable;

++    /*!< gammaBeforeTM order of operations whether Gamma correction should precede TM or vise versa*/

++    int32_t gammaBeforeTM;

++    /*!< a1 shift amount at stage 1*/

++    int32_t a1;

++    /*!< a2 shift amount at stage 2*/

++    int32_t a2;

++    /*!< a3 shift amount at stage 3*/

++    int32_t a3;

++    /*!< gamma_lut_enable enable for gamma lut*/

++    int32_t gamma_lut_enable;

++    /*!< gamma_lut_base_level[8] base level for gamma lut*/

++    int32_t gamma_lut_base_level[8];

++    /*!< gamma_lut_step[8] step for gamma lut*/

++    int32_t gamma_lut_step[8];

++    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/

++    int32_t gamma_lut_start_bin[8];

++    /*!< gamma_lut_size gamma lut size*/

++    int32_t gamma_lut_size;

++    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/

++    int32_t gamma_lut_gen_lut[1537];

++    /*!< tm_lut_enable enable for tone mapping lut*/

++    int32_t tm_lut_enable;

++    /*!< tm_lut_base_level[3] base level for  tone mapping lut*/

++    int32_t tm_lut_base_level[3];

++    /*!< tm_lut_step[3] step for  tone mapping lut*/

++    int32_t tm_lut_step[3];

++    /*!< tm_lut_start_bin[3] start bin for  tone mapping lut*/

++    int32_t tm_lut_start_bin[3];

++    /*!< tm_lut_size tone mapping lut size*/

++    int32_t tm_lut_size;

++    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut*/

++    int32_t tm_lut_gen_lut[2049];

++    /*!< prog_shift programable shift for the gamma output*/

++    int32_t prog_shift;

++

++} ia_pal_isp_gammatm_v3_t;

++

++/*! \isp struct gd_dpc_2_1

++

++*/

++typedef struct

++{

++    /*!< green_pos gb position*/

++    int32_t green_pos;

++    /*!< lc_cu_x[4] local contrast config unit x*/

++    int32_t lc_cu_x[4];

++    /*!< lc_cu_y[3] local contrast config unit y*/

++    int32_t lc_cu_y[3];

++    /*!< lc_cu_slope[3] local contrast config unit slope*/

++    int32_t lc_cu_slope[3];

++    /*!< delta_cu_x[4] delta config unit x*/

++    int32_t delta_cu_x[4];

++    /*!< delta_cu_y[3] delta config unit y*/

++    int32_t delta_cu_y[3];

++    /*!< delta_cu_slope[3] delta config unit slope*/

++    int32_t delta_cu_slope[3];

++    /*!< inv_lc_cu_x[8] inverse local contarst config unit x*/

++    int32_t inv_lc_cu_x[8];

++    /*!< inv_lc_cu_y[7] inverse local contarst config unit y*/

++    int32_t inv_lc_cu_y[7];

++    /*!< inv_lc_cu_slope[7] inverse local contarst config unit slope*/

++    int32_t inv_lc_cu_slope[7];

++    /*!< inv_delta_cu_x[8] inverse delta config unit x*/

++    int32_t inv_delta_cu_x[8];

++    /*!< inv_delta_cu_y[7] inverse delta config unit y*/

++    int32_t inv_delta_cu_y[7];

++    /*!< inv_delta_cu_slope[7] inverse delta config unit slope*/

++    int32_t inv_delta_cu_slope[7];

++    /*!< detail_pres detail preservation factor*/

++    int32_t detail_pres;

++    /*!< invscale scale factor after normalizing by inverse*/

++    int32_t invscale;

++    /*!< afxoffset[32] 8 Autofocus pixels X axis offset U14.0, should be smaller than afxperiod*/

++    int32_t afxoffset[32];

++    /*!< afxperiod[32] 8 Autofocus pixels X axis period*/

++    int32_t afxperiod[32];

++    /*!< afyoffset[32] 8 Autofocus pixels Y axis offset U14.0, should be smaller than afyperiod*/

++    int32_t afyoffset[32];

++    /*!< afyperiod[32] 8 Autofocus pixels Y axis period*/

++    int32_t afyperiod[32];

++    /*!< hdrfactors[16] 4x4 HDR exposure factor U6.8*/

++    int32_t hdrfactors[16];

++    /*!< hdrfactorsinverse[16] 4x4 HDR exposure inverse factor U6.8 - should be inverse of hdrfactors*/

++    int32_t hdrfactorsinverse[16];

++    /*!< configunitcolddistvsmedian_slope[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_slope[7];

++    /*!< configunitcolddistvsmedian_x[8] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_x[8];

++    /*!< configunitcolddistvsmedian_y[7] cold dist vs median config unit classifier*/

++    int32_t configunitcolddistvsmedian_y[7];

++    /*!< configunitcolddistvsneighb_slope[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_slope[7];

++    /*!< configunitcolddistvsneighb_x[8] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_x[8];

++    /*!< configunitcolddistvsneighb_y[7] cold dist vs neigb config unit classifier*/

++    int32_t configunitcolddistvsneighb_y[7];

++    /*!< configunitfix_slope[3] fix config unit*/

++    int32_t configunitfix_slope[3];

++    /*!< configunitfix_x[4] fix config unit*/

++    int32_t configunitfix_x[4];

++    /*!< configunitfix_y[3] fix config unit*/

++    int32_t configunitfix_y[3];

++    /*!< configunithotdistvsmedian_slope[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_slope[7];

++    /*!< configunithotdistvsmedian_x[8] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_x[8];

++    /*!< configunithotdistvsmedian_y[7] hot dist vs median classifier*/

++    int32_t configunithotdistvsmedian_y[7];

++    /*!< configunithotdistvsneighb_slope[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_slope[7];

++    /*!< configunithotdistvsneighb_x[8] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_x[8];

++    /*!< configunithotdistvsneighb_y[7] hot dist vs neigb config unit classifier*/

++    int32_t configunithotdistvsneighb_y[7];

++    /*!< pelesttype[16] 0-P1, 1-P2, 2-P3, 3-P4, 4-P5, 5-P6*/

++    int32_t pelesttype[16];

++    /*!< dtype[16] 0-D1 1-D2  2-D3*/

++    int32_t dtype[16];

++    /*!< pmasks[384] configurations related to the bayer pattern*/

++    int32_t pmasks[384];

++    /*!< dmasks[48] configurations related to the bayer pattern*/

++    int32_t dmasks[48];

++    /*!< bitreduceshift Shift value for bit reduce block*/

++    int32_t bitreduceshift;

++    /*!< afenable enable for the AF unit block*/

++    int32_t afenable;

++    /*!< dynamicenable enable for the dynamic detection block*/

++    int32_t dynamicenable;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< paf_grid_en[32] paf grid enables*/

++    int32_t paf_grid_en[32];

++    /*!< paf_pattern_rearrangement_en Enable pattern rearrangement unit after AF Pels detection*/

++    int32_t paf_pattern_rearrangement_en;

++    /*!< afsXStart AF pixel detection crop - start X position*/

++    int32_t afsXStart;

++    /*!< afsYStart AF pixel detection crop - start Y position*/

++    int32_t afsYStart;

++    /*!< afsXEnd AF pixel detection crop - end X position*/

++    int32_t afsXEnd;

++    /*!< afsYEnd AF pixel detection crop - end Y position*/

++    int32_t afsYEnd;

++    /*!< afsXStartCropEn AF pixel crop enable - start X position*/

++    int32_t afsXStartCropEn;

++    /*!< afsYStartCropEn AF pixel crop enable - start Y position*/

++    int32_t afsYStartCropEn;

++    /*!< afsXEndCropEn AF pixel crop enable - end X position*/

++    int32_t afsXEndCropEn;

++    /*!< afsYEndCropEn AF pixel crop enable - end Y position*/

++    int32_t afsYEndCropEn;

++    /*!< use_nlm[16] use non local means mechanism*/

++    int32_t use_nlm[16];

++    /*!< sad1_thr threshold on the first sad*/

++    int32_t sad1_thr;

++    /*!< sad2_thr threshold on the second sad*/

++    int32_t sad2_thr;

++    /*!< pixel_diff_thr threshold on the pixel difference*/

++    int32_t pixel_diff_thr;

++    /*!< min_direction_sad_thr threshold on the min direction*/

++    int32_t min_direction_sad_thr;

++    /*!< max_direction_sad_thr threshold on the max direction*/

++    int32_t max_direction_sad_thr;

++    /*!< saturation_thr protect pixels in saturated areas*/

++    int32_t saturation_thr;

++    /*!< ignore_ver_direction[16] ignore vertical direction for certain types of pdaf sensors*/

++    int32_t ignore_ver_direction[16];

++    /*!< configunit_med_protection_slope[3] nlm fix config unit*/

++    int32_t configunit_med_protection_slope[3];

++    /*!< configunit_med_protection_x[4] nlm fix config unit*/

++    int32_t configunit_med_protection_x[4];

++    /*!< configunit_med_protection_y[3] nlm fix config unit*/

++    int32_t configunit_med_protection_y[3];

++    /*!< clamping_disable disable clamping to support previous version of dpc*/

++    int32_t clamping_disable;

++    /*!< sensor_type 0=simple_bayer 1=2pd 2=sve_2pd 3=sve_zigzag1 4=sve_zigzag2*/

++    int32_t sensor_type;

++    /*!< fix_dist when 0 - opposite sign distances around the pixel are ignored*/

++    int32_t fix_dist;

++    /*!< flip_neigb_axis flip neigb vs dist axis*/

++    int32_t flip_neigb_axis;

++    /*!< g_locations_for_sve[16] g on 4x4 grid*/

++    int32_t g_locations_for_sve[16];

++    /*!< config_median_blend_slope[3] blend coef cfg*/

++    int32_t config_median_blend_slope[3];

++    /*!< config_median_blend_x[4] blend coef cfg*/

++    int32_t config_median_blend_x[4];

++    /*!< config_median_blend_y[3] blend coef cfg*/

++    int32_t config_median_blend_y[3];

++    /*!< config_ridges_slope[3] ridge coef cfg*/

++    int32_t config_ridges_slope[3];

++    /*!< config_ridges_x[4] ridge coef cfg*/

++    int32_t config_ridges_x[4];

++    /*!< config_ridges_y[3] ridge coef cfg*/

++    int32_t config_ridges_y[3];

++    /*!< global_enable global enable*/

++    int32_t global_enable;

++    /*!< gdc_enable gdc enable*/

++    int32_t gdc_enable;

++    /*!< dpc_enable dpc enable*/

++    int32_t dpc_enable;

++

++} ia_pal_isp_gd_dpc_2_1_t;

++

++/*! \isp struct gdc3

++HW filter reference with FW ISP API

++*/

++typedef struct

++{

++    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

++    int32_t filter_size;

++    /*!< nums_luts number of LUTs partioning. {1-4}*/

++    int32_t nums_luts;

++    /*!< lut_sel LUT part selection. {0:nums_lut}*/

++    int32_t lut_sel;

++    /*!< lut[1536] LUT s5.10*/

++    int32_t lut[1536];

++    /*!< interpolation_type interpolation type*/

++    int32_t interpolation_type;

++    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

++    int32_t nums_hgrid_luma;

++    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

++    int32_t nums_vgrid_luma;

++    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

++    int32_t nums_hgrid_chroma;

++    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

++    int32_t nums_vgrid_chroma;

++    /*!< luma_block_width_power luma_block_width_power*/

++    int32_t luma_block_width_power;

++    /*!< luma_block_height_power luma_block_height_power*/

++    int32_t luma_block_height_power;

++    /*!< chroma_block_width_power chroma_block_width_power*/

++    int32_t chroma_block_width_power;

++    /*!< chroma_block_height_power chroma_block_height_power*/

++    int32_t chroma_block_height_power;

++    /*!< luma_origin_x[10584] luma_origin_x*/

++    int32_t luma_origin_x[10584];

++    /*!< luma_origin_y[10584] luma_origin_y*/

++    int32_t luma_origin_y[10584];

++    /*!< luma_in_block_width[10584] luma_in_block_width*/

++    int32_t luma_in_block_width[10584];

++    /*!< luma_in_block_height[10584] luma_in_block_heght*/

++    int32_t luma_in_block_height[10584];

++    /*!< luma_p0_x[10584] luma_p0_x*/

++    int32_t luma_p0_x[10584];

++    /*!< luma_p0_y[10584] luma_p0_y*/

++    int32_t luma_p0_y[10584];

++    /*!< luma_p1_x[10584] luma_p1_x*/

++    int32_t luma_p1_x[10584];

++    /*!< luma_p1_y[10584] luma_p1_y*/

++    int32_t luma_p1_y[10584];

++    /*!< luma_p2_x[10584] luma_p2_x*/

++    int32_t luma_p2_x[10584];

++    /*!< luma_p2_y[10584] luma_p2_y*/

++    int32_t luma_p2_y[10584];

++    /*!< luma_p3_x[10584] luma_p3_x*/

++    int32_t luma_p3_x[10584];

++    /*!< luma_p3_y[10584] luma_p3_y*/

++    int32_t luma_p3_y[10584];

++    /*!< chroma_origin_x[10584] chroma_origin_x*/

++    int32_t chroma_origin_x[10584];

++    /*!< chroma_origin_y[10584] chroma_origin_y*/

++    int32_t chroma_origin_y[10584];

++    /*!< chroma_in_block_width[10584] chroma_in_block_width*/

++    int32_t chroma_in_block_width[10584];

++    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/

++    int32_t chroma_in_block_height[10584];

++    /*!< chroma_p0_x[10584] chroma_p0_x*/

++    int32_t chroma_p0_x[10584];

++    /*!< chroma_p0_y[10584] chroma_p0_y*/

++    int32_t chroma_p0_y[10584];

++    /*!< chroma_p1_x[10584] chroma_p1_x*/

++    int32_t chroma_p1_x[10584];

++    /*!< chroma_p1_y[10584] chroma_p1_y*/

++    int32_t chroma_p1_y[10584];

++    /*!< chroma_p2_x[10584] chroma_p2_x*/

++    int32_t chroma_p2_x[10584];

++    /*!< chroma_p2_y[10584] chroma_p2_y*/

++    int32_t chroma_p2_y[10584];

++    /*!< chroma_p3_x[10584] chroma_p3_x*/

++    int32_t chroma_p3_x[10584];

++    /*!< chroma_p3_y[10584] chroma_p3_y*/

++    int32_t chroma_p3_y[10584];

++

++} ia_pal_isp_gdc3_t;

++

++/*! \isp struct gdc3_1

++HW filter reference with FW ISP API

++*/

++typedef struct

++{

++    /*!< filter_size */

++    int32_t filter_size;

++    /*!< nums_luts */

++    int32_t nums_luts;

++    /*!< lut_sel */

++    int32_t lut_sel;

++    /*!< lut[1536] */

++    int32_t lut[1536];

++    /*!< interpolation_type */

++    int32_t interpolation_type;

++    /*!< nums_hgrid_luma */

++    int32_t nums_hgrid_luma;

++    /*!< nums_vgrid_luma */

++    int32_t nums_vgrid_luma;

++    /*!< nums_hgrid_chroma */

++    int32_t nums_hgrid_chroma;

++    /*!< nums_vgrid_chroma */

++    int32_t nums_vgrid_chroma;

++    /*!< luma_block_width_power */

++    int32_t luma_block_width_power;

++    /*!< luma_block_height_power */

++    int32_t luma_block_height_power;

++    /*!< chroma_block_width_power */

++    int32_t chroma_block_width_power;

++    /*!< chroma_block_height_power */

++    int32_t chroma_block_height_power;

++    /*!< luma_origin_x[5292] */

++    int32_t luma_origin_x[5292];

++    /*!< luma_origin_y[5292] */

++    int32_t luma_origin_y[5292];

++    /*!< luma_in_block_width[5292] */

++    int32_t luma_in_block_width[5292];

++    /*!< luma_in_block_height[5292] */

++    int32_t luma_in_block_height[5292];

++    /*!< luma_p0_x[5292] */

++    int32_t luma_p0_x[5292];

++    /*!< luma_p0_y[5292] */

++    int32_t luma_p0_y[5292];

++    /*!< luma_p1_x[5292] */

++    int32_t luma_p1_x[5292];

++    /*!< luma_p1_y[5292] */

++    int32_t luma_p1_y[5292];

++    /*!< luma_p2_x[5292] */

++    int32_t luma_p2_x[5292];

++    /*!< luma_p2_y[5292] */

++    int32_t luma_p2_y[5292];

++    /*!< luma_p3_x[5292] */

++    int32_t luma_p3_x[5292];

++    /*!< luma_p3_y[5292] */

++    int32_t luma_p3_y[5292];

++    /*!< chroma_origin_x[5292] */

++    int32_t chroma_origin_x[5292];

++    /*!< chroma_origin_y[5292] */

++    int32_t chroma_origin_y[5292];

++    /*!< chroma_in_block_width[5292] */

++    int32_t chroma_in_block_width[5292];

++    /*!< chroma_in_block_height[5292] */

++    int32_t chroma_in_block_height[5292];

++    /*!< chroma_p0_x[5292] */

++    int32_t chroma_p0_x[5292];

++    /*!< chroma_p0_y[5292] */

++    int32_t chroma_p0_y[5292];

++    /*!< chroma_p1_x[5292] */

++    int32_t chroma_p1_x[5292];

++    /*!< chroma_p1_y[5292] */

++    int32_t chroma_p1_y[5292];

++    /*!< chroma_p2_x[5292] */

++    int32_t chroma_p2_x[5292];

++    /*!< chroma_p2_y[5292] */

++    int32_t chroma_p2_y[5292];

++    /*!< chroma_p3_x[5292] */

++    int32_t chroma_p3_x[5292];

++    /*!< chroma_p3_y[5292] */

++    int32_t chroma_p3_y[5292];

++

++} ia_pal_isp_gdc3_1_t;

++

++/*! \isp struct gdc3_1_1

++HW filter reference with FW ISP API

++*/

++typedef struct

++{

++    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

++    int32_t filter_size;

++    /*!< nums_luts number of LUTs partioning. {1-4}*/

++    int32_t nums_luts;

++    /*!< lut_sel LUT part selection. {0:nums_lut}*/

++    int32_t lut_sel;

++    /*!< lut[1536] LUT s5.10*/

++    int32_t lut[1536];

++    /*!< interpolation_type interpolation type*/

++    int32_t interpolation_type;

++    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

++    int32_t nums_hgrid_luma;

++    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

++    int32_t nums_vgrid_luma;

++    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

++    int32_t nums_hgrid_chroma;

++    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

++    int32_t nums_vgrid_chroma;

++    /*!< luma_block_width_power luma_block_width_power*/

++    int32_t luma_block_width_power;

++    /*!< luma_block_height_power luma_block_height_power*/

++    int32_t luma_block_height_power;

++    /*!< chroma_block_width_power chroma_block_width_power*/

++    int32_t chroma_block_width_power;

++    /*!< chroma_block_height_power chroma_block_height_power*/

++    int32_t chroma_block_height_power;

++    /*!< gdc_warp_grid_luma[84672] gdc_warp_grid_luma*/

++    int32_t gdc_warp_grid_luma[84672];

++    /*!< gdc_warp_grid_chroma[84672] gdc_warp_grid_chroma*/

++    int32_t gdc_warp_grid_chroma[84672];

++

++} ia_pal_isp_gdc3_1_1_t;

++

++/*! \isp struct gdc4_2

++HW filter reference with FW ISP API

++*/

++typedef struct

++{

++    /*!< in_bpp image input bpp*/

++    int32_t in_bpp;

++    /*!< interpolation_type */

++    int32_t interpolation_type;

++    /*!< filter_size */

++    int32_t filter_size;

++    /*!< lut_sel */

++    int32_t lut_sel;

++    /*!< out_bpp image output bpp*/

++    int32_t out_bpp;

++    /*!< gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

++    int32_t gro;

++    /*!< perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

++    int32_t perf_mode;

++    /*!< ch1_in_bpp image input bpp*/

++    int32_t ch1_in_bpp;

++    /*!< ch1_interpolation_type */

++    int32_t ch1_interpolation_type;

++    /*!< ch1_filter_size */

++    int32_t ch1_filter_size;

++    /*!< ch1_lut_sel */

++    int32_t ch1_lut_sel;

++    /*!< ch1_out_bpp image output bpp*/

++    int32_t ch1_out_bpp;

++    /*!< ch1_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

++    int32_t ch1_gro;

++    /*!< ch1_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

++    int32_t ch1_perf_mode;

++    /*!< ch2_in_bpp image input bpp*/

++    int32_t ch2_in_bpp;

++    /*!< ch2_interpolation_type */

++    int32_t ch2_interpolation_type;

++    /*!< ch2_filter_size */

++    int32_t ch2_filter_size;

++    /*!< ch2_lut_sel */

++    int32_t ch2_lut_sel;

++    /*!< ch2_out_bpp image output bpp*/

++    int32_t ch2_out_bpp;

++    /*!< ch2_gro Group reorder, convert 2D to 1D access, 0: bypass, 1: reorder (needed for 2y mode)*/

++    int32_t ch2_gro;

++    /*!< ch2_perf_mode Perf mode, 0: 1x1y, 1: 2x1y, 2: 1x2y, 3: 2x2y*/

++    int32_t ch2_perf_mode;

++    /*!< nums_luts */

++    int32_t nums_luts;

++    /*!< lut[1536] */

++    int32_t lut[1536];

++    /*!< nums_hgrid_luma */

++    int32_t nums_hgrid_luma;

++    /*!< nums_vgrid_luma */

++    int32_t nums_vgrid_luma;

++    /*!< nums_hgrid_chroma */

++    int32_t nums_hgrid_chroma;

++    /*!< nums_vgrid_chroma */

++    int32_t nums_vgrid_chroma;

++    /*!< luma_block_width_power */

++    int32_t luma_block_width_power;

++    /*!< luma_block_height_power */

++    int32_t luma_block_height_power;

++    /*!< chroma_block_width_power */

++    int32_t chroma_block_width_power;

++    /*!< chroma_block_height_power */

++    int32_t chroma_block_height_power;

++    /*!< luma_tetragons[84672] */

++    int32_t luma_tetragons[84672];

++    /*!< chroma_tetragons[84672] */

++    int32_t chroma_tetragons[84672];

++

++} ia_pal_isp_gdc4_2_t;

++

++/*! \isp struct gdc5

++HW filter reference with FW ISP API

++*/

++typedef struct

++{

++    /*!< filter_size filter size. {4-BCI, 6-Lancos}*/

++    int32_t filter_size;

++    /*!< nums_luts number of LUTs partioning. {1-4}*/

++    int32_t nums_luts;

++    /*!< lut_sel LUT part selection. {0:nums_lut}*/

++    int32_t lut_sel;

++    /*!< lut[1536] LUT s1.10*/

++    int32_t lut[1536];

++    /*!< interpolation_type interpolation type*/

++    int32_t interpolation_type;

++    /*!< nums_hgrid_luma size of horizontal grig for luma. {}*/

++    int32_t nums_hgrid_luma;

++    /*!< nums_vgrid_luma size of vertical grig for luma. {}*/

++    int32_t nums_vgrid_luma;

++    /*!< nums_hgrid_chroma size of horizontal grig for chroma. {}*/

++    int32_t nums_hgrid_chroma;

++    /*!< nums_vgrid_chroma size of vertical grig for chroma {}*/

++    int32_t nums_vgrid_chroma;

++    /*!< luma_block_width_power luma_block_width_power*/

++    int32_t luma_block_width_power;

++    /*!< luma_block_height_power luma_block_height_power*/

++    int32_t luma_block_height_power;

++    /*!< chroma_block_width_power chroma_block_width_power*/

++    int32_t chroma_block_width_power;

++    /*!< chroma_block_height_power chroma_block_height_power*/

++    int32_t chroma_block_height_power;

++    /*!< luma_origin_x[10584] luma_origin_x*/

++    int32_t luma_origin_x[10584];

++    /*!< luma_origin_y[10584] luma_origin_y*/

++    int32_t luma_origin_y[10584];

++    /*!< luma_in_block_width[10584] luma_in_block_width*/

++    int32_t luma_in_block_width[10584];

++    /*!< luma_in_block_height[10584] luma_in_block_heght*/

++    int32_t luma_in_block_height[10584];

++    /*!< luma_p0_x[10584] luma_p0_x*/

++    int32_t luma_p0_x[10584];

++    /*!< luma_p0_y[10584] luma_p0_y*/

++    int32_t luma_p0_y[10584];

++    /*!< luma_p1_x[10584] luma_p1_x*/

++    int32_t luma_p1_x[10584];

++    /*!< luma_p1_y[10584] luma_p1_y*/

++    int32_t luma_p1_y[10584];

++    /*!< luma_p2_x[10584] luma_p2_x*/

++    int32_t luma_p2_x[10584];

++    /*!< luma_p2_y[10584] luma_p2_y*/

++    int32_t luma_p2_y[10584];

++    /*!< luma_p3_x[10584] luma_p3_x*/

++    int32_t luma_p3_x[10584];

++    /*!< luma_p3_y[10584] luma_p3_y*/

++    int32_t luma_p3_y[10584];

++    /*!< chroma_origin_x[10584] chroma_origin_x*/

++    int32_t chroma_origin_x[10584];

++    /*!< chroma_origin_y[10584] chroma_origin_y*/

++    int32_t chroma_origin_y[10584];

++    /*!< chroma_in_block_width[10584] chroma_in_block_width*/

++    int32_t chroma_in_block_width[10584];

++    /*!< chroma_in_block_height[10584] chroma_in_block_heght*/

++    int32_t chroma_in_block_height[10584];

++    /*!< chroma_p0_x[10584] chroma_p0_x*/

++    int32_t chroma_p0_x[10584];

++    /*!< chroma_p0_y[10584] chroma_p0_y*/

++    int32_t chroma_p0_y[10584];

++    /*!< chroma_p1_x[10584] chroma_p1_x*/

++    int32_t chroma_p1_x[10584];

++    /*!< chroma_p1_y[10584] chroma_p1_y*/

++    int32_t chroma_p1_y[10584];

++    /*!< chroma_p2_x[10584] chroma_p2_x*/

++    int32_t chroma_p2_x[10584];

++    /*!< chroma_p2_y[10584] chroma_p2_y*/

++    int32_t chroma_p2_y[10584];

++    /*!< chroma_p3_x[10584] chroma_p3_x*/

++    int32_t chroma_p3_x[10584];

++    /*!< chroma_p3_y[10584] chroma_p3_y*/

++    int32_t chroma_p3_y[10584];

++    /*!< in_bpp image input bpp*/

++    int32_t in_bpp;

++    /*!< out_bpp image output bpp*/

++    int32_t out_bpp;

++    /*!< gdc_operating_mode 0: GDC calculates tetragons; 1: tetragons from API are used, 2: GDC5_1 WFOV*/

++    int32_t gdc_operating_mode;

++    /*!< gdc_mode 0: bypass, 1: High Distortion only, 2: Homography only, 6: Homography and high distortion, 9: High distortion and homography*/

++    int32_t gdc_mode;

++    /*!< crop_top Top border for cropping*/

++    int32_t crop_top;

++    /*!< crop_left Left border for cropping*/

++    int32_t crop_left;

++    /*!< crop_bottom Bottom border for cropping*/

++    int32_t crop_bottom;

++    /*!< crop_right Right border for cropping*/

++    int32_t crop_right;

++    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S2.20,*/

++    int32_t homography_transformation_luma_0[64];

++    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/

++    int32_t homography_transformation_luma_1[32];

++    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S15.16*/

++    int32_t homography_transformation_luma_2[48];

++    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/

++    int32_t homography_matrices_offset[16];

++    /*!< homography_matrices_count number of homography matrices*/

++    int32_t homography_matrices_count;

++    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/

++    int32_t ldc_r_lut[256];

++    /*!< ldc_max_distance_from_center Maximum distance from the radial center from the full sensor resolution. Q16.8*/

++    int32_t ldc_max_distance_from_center;

++    /*!< ldc_r_x_center x coordinate of LDC (R) correction center of symmerty*/

++    int32_t ldc_r_x_center;

++    /*!< ldc_r_y_center y coordinate of LDC (R) correction center of symmerty*/

++    int32_t ldc_r_y_center;

++    /*!< ldc_r_y_scale_factor y coordinate scaling factor for elliptical distortion of LDC (R) correction, format Q4.16*/

++    int32_t ldc_r_y_scale_factor;

++    /*!< gdc_modep 0:PreAffine/Projections/LDC/PostAffine, 1:PreAffine/Projections/Rotation/LDC/PostAffine, 2:PreAffine/Projections/Rotation/PostAffine, 3:Homography/PreAffine/Projections/Rotation/LDC/PostAffine, 4:PreAffine/Homography/Projections/Rotation/LDC/PostAffine*/

++    int32_t gdc_modep;

++    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/

++    int32_t rotationmatrix[9];

++    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/

++    int32_t projectionsf_1[2];

++    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/

++    int32_t projectionsf_2[2];

++    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular*/

++    int32_t projection_type;

++    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/

++    int32_t projections_inv_f_pi;

++    /*!< ldc_mode 0:Rd/Ru mode, 1: SqLUT mode, 2: Rd/Ru mode with normalization*/

++    int32_t ldc_mode;

++    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/

++    int32_t ldc_max_a;

++    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/

++    int32_t ldc_inv_max_a;

++    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/

++    int32_t ldc_lut_shift_bits;

++    /*!< preaffine_matrix_scale[4] PreAffine Matrix for scale S4.15*/

++    int32_t preaffine_matrix_scale[4];

++    /*!< preaffine_matrix_translation[2] PreAffine Matrix for translation integer value S18.8*/

++    int32_t preaffine_matrix_translation[2];

++    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/

++    int32_t postaffine_matrix_scale[4];

++    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/

++    int32_t postaffine_matrix_translation[2];

++    /*!< invalid_coord_mask[4] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/

++    int32_t invalid_coord_mask[4];

++    /*!< normalization_sf Normalization scaling factor (Q20)*/

++    int32_t normalization_sf;

++    /*!< MSB_alignment_en 0: LSB Alignment 1:MSB Alignment*/

++    int32_t MSB_alignment_en;

++

++} ia_pal_isp_gdc5_t;

++

++/*! \isp struct gdc7

++

++*/

++typedef struct

++{

++    /*!< gdc_coord_enable coord calculation bypass*/

++    int32_t gdc_coord_enable;

++    /*!< crop_top Top border for cropping*/

++    int32_t crop_top;

++    /*!< crop_left Left border for cropping*/

++    int32_t crop_left;

++    /*!< crop_bottom Bottom border for cropping*/

++    int32_t crop_bottom;

++    /*!< crop_right Right border for cropping*/

++    int32_t crop_right;

++    /*!< homography_transformation_luma_0[64] homography transformation matrices for luma channel,  1, 2, 4, 5. elements S4.18,*/

++    int32_t homography_transformation_luma_0[64];

++    /*!< homography_transformation_luma_1[32] homography transformation matrices for luma channel,  7. and 8. S0.31 but only 25 lower bits used*/

++    int32_t homography_transformation_luma_1[32];

++    /*!< homography_transformation_luma_2[48] homography transformation matrices for luma channel, 3, 6, 9. S18.13*/

++    int32_t homography_transformation_luma_2[48];

++    /*!< homography_matrices_offset[16] Offsets from the top for homography matrices*/

++    int32_t homography_matrices_offset[16];

++    /*!< homography_matrices_count number of homography matrices*/

++    int32_t homography_matrices_count;

++    /*!< ldc_r_lut[256] LDC (R) LUT table, format Q14.16*/

++    int32_t ldc_r_lut[256];

++    /*!< gdc_modep 0:Homography/Projections/LDC/PostAffine, 1:Homography/Projections/Rotation/LDC/PostAffine, 2:Homography/Projections/Rotation/PostAffine*/

++    int32_t gdc_modep;

++    /*!< rotationmatrix[9] Rotational Matrix for applying rotation (S1.20)*/

++    int32_t rotationmatrix[9];

++    /*!< projectionsf_1[2] Scaling factor for Projections. (Elements 1 and 2 of scaling factor: S4.20)*/

++    int32_t projectionsf_1[2];

++    /*!< projectionsf_2[2] Scaling factor for Projections. (Elements 3 and 4 of scaling factor: S14.8)*/

++    int32_t projectionsf_2[2];

++    /*!< projection_type 0: Rectilinear, 1: Conic, 2: Equirectangular, 3: 2D Bowl*/

++    int32_t projection_type;

++    /*!< projections_inv_f_pi Inv_f_pi = (1/f*pi) where f corresponds to View_Width/HFOV (Q0.31)*/

++    int32_t projections_inv_f_pi;

++    /*!< ldc_max_a Maximum distance from the radial center from the full sensor resolution. Q3.16*/

++    int32_t ldc_max_a;

++    /*!< ldc_inv_max_a Inv of ldc_max_a, Q0.26*/

++    int32_t ldc_inv_max_a;

++    /*!< ldc_lut_shift_bits LDC LUT Shift bits*/

++    int32_t ldc_lut_shift_bits;

++    /*!< postaffine_matrix_scale[4] PostAffine Matrix for scale S4.15*/

++    int32_t postaffine_matrix_scale[4];

++    /*!< postaffine_matrix_translation[2] PostAffine Matrix for translation integer value S18.8*/

++    int32_t postaffine_matrix_translation[2];

++    /*!< invalid_coord_mask[3] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/

++    int32_t invalid_coord_mask[3];

++    /*!< translation3d[3] 3D translation for bowl projection (S14.8)*/

++    int32_t translation3d[3];

++    /*!< bowl_radius_sqr_2d 2D Bowl Radius Square (Q28.0)*/

++    int32_t bowl_radius_sqr_2d;

++    /*!< bowl_scale_2d 2D Bowl Scale Value (Q0.31)*/

++    int32_t bowl_scale_2d;

++    /*!< IRS_interpolation_enable Use NN for interpolation*/

++    int32_t IRS_interpolation_enable;

++    /*!< input_height input image height*/

++    int32_t input_height;

++    /*!< input_width input image width*/

++    int32_t input_width;

++    /*!< GDC_SP_coord_conv_enable GDC SP 1:4 coord conversion mechanism*/

++    int32_t GDC_SP_coord_conv_enable;

++    /*!< max_distortion_reporting_enable Report position within input image of last processed row for internal rolling buffer support 0-off, 1-on*/

++    int32_t max_distortion_reporting_enable;

++    /*!< max_distortion Maximum lens distortion in input image domain, which defines stagger of last processed input row relative to output row*/

++    int32_t max_distortion;

++

++} ia_pal_isp_gdc7_t;

++

++/*! \isp struct glim_1_0

++Global inverse tone mapping

++*/

++typedef struct

++{

++    /*!< glim_enable Enable GLIM*/

++    int32_t glim_enable;

++    /*!< glu_base_level[8] GLU base level offset*/

++    int32_t glu_base_level[8];

++    /*!< glu_step[8] GLU step amount per stage*/

++    int32_t glu_step[8];

++    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

++    int32_t glu_start_bin[8];

++    /*!< glu_gen_lut_size Utilized LUT size*/

++    int32_t glu_gen_lut_size;

++    /*!< glu_gen_lut[385] LUT samples*/

++    int32_t glu_gen_lut[385];

++    /*!< gain_prec Gain precision bits*/

++    int32_t gain_prec;

++

++} ia_pal_isp_glim_1_0_t;

++

++/*! \isp struct glim_2_0

++Global inverse tone mapping

++*/

++typedef struct

++{

++    /*!< glim_enable Enable GLIM*/

++    int32_t glim_enable;

++    /*!< glu_base_level[8] GLU base level offset*/

++    int32_t glu_base_level[8];

++    /*!< glu_step[8] GLU step amount per stage*/

++    int32_t glu_step[8];

++    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

++    int32_t glu_start_bin[8];

++    /*!< glu_gen_lut_size Utilized LUT size*/

++    int32_t glu_gen_lut_size;

++    /*!< glu_gen_lut[385] LUT samples*/

++    int32_t glu_gen_lut[385];

++    /*!< gain_prec Gain precision bits*/

++    int32_t gain_prec;

++

++} ia_pal_isp_glim_2_0_t;

++

++/*! \isp struct gltm_1_0

++Global tone mapping

++*/

++typedef struct

++{

++    /*!< gltm_enable Enable GLTM*/

++    int32_t gltm_enable;

++    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/

++    int32_t fc_m[9];

++    /*!< glu_base_level[8] GLU base level offset*/

++    int32_t glu_base_level[8];

++    /*!< glu_step[8] GLU step amount per stage*/

++    int32_t glu_step[8];

++    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

++    int32_t glu_start_bin[8];

++    /*!< glu_gen_lut_size Utilized LUT size*/

++    int32_t glu_gen_lut_size;

++    /*!< glu_gen_lut[385] LUT samples*/

++    int32_t glu_gen_lut[385];

++    /*!< gain_prec Gain precision bits*/

++    int32_t gain_prec;

++

++} ia_pal_isp_gltm_1_0_t;

++

++/*! \isp struct gltm_2_0

++Global tone mapping

++*/

++typedef struct

++{

++    /*!< gltm_enable Enable GLTM*/

++    int32_t gltm_enable;

++    /*!< fc_m[9] YUV2RGB format conversion matrix (coeffs S2.13)*/

++    int32_t fc_m[9];

++    /*!< glu_base_level[8] GLU base level offset*/

++    int32_t glu_base_level[8];

++    /*!< glu_step[8] GLU step amount per stage*/

++    int32_t glu_step[8];

++    /*!< glu_start_bin[8] GLU stage start offset in LUT*/

++    int32_t glu_start_bin[8];

++    /*!< glu_gen_lut_size Utilized LUT size*/

++    int32_t glu_gen_lut_size;

++    /*!< glu_gen_lut[385] LUT samples*/

++    int32_t glu_gen_lut[385];

++    /*!< gain_prec Gain precision bits*/

++    int32_t gain_prec;

++

++} ia_pal_isp_gltm_2_0_t;

++

++/*! \isp struct gmv_statistics_1_0

++

++*/

++typedef struct

++{

++    /*!< gmv_en ff enable/disable flag*/

++    int32_t gmv_en;

++    /*!< additional_bin_input set to 1 if 4x binning is required before processing, otherwise image is binned 2x*/

++    int32_t additional_bin_input;

++    /*!< kappa kappa for Harris grade calculation*/

++    int32_t kappa;

++    /*!< counter_shifter Shifter for the good feature point and good match point counter*/

++    int32_t counter_shifter;

++    /*!< good_corner_threshold Threshold for the good corner counter.*/

++    int32_t good_corner_threshold;

++    /*!< good_match_threshold Threshold for the good match counter.*/

++    int32_t good_match_threshold;

++    /*!< block_width Block width*/

++    int32_t block_width;

++    /*!< block_height Block height*/

++    int32_t block_height;

++    /*!< x_start x start for best feature search*/

++    int32_t x_start;

++    /*!< y_start y start for best feature search*/

++    int32_t y_start;

++    /*!< x_end x end for best feature search*/

++    int32_t x_end;

++    /*!< y_end y end for best feature search*/

++    int32_t y_end;

++

++} ia_pal_isp_gmv_statistics_1_0_t;

++

++/*! \isp struct hdr_blc_1

++HDR black level correction filter

++*/

++typedef struct

++{

++    /*!< bl_cc00 Black level, color channel (0,0) (adjusted for MSB aligned image)*/

++    int32_t bl_cc00;

++    /*!< bl_cc01 Black level, color channel (0,1) (adjusted for MSB aligned image)*/

++    int32_t bl_cc01;

++    /*!< bl_cc10 Black level, color channel (1,0) (adjusted for MSB aligned image)*/

++    int32_t bl_cc10;

++    /*!< bl_cc11 Black level, color channel (1,1) (adjusted for MSB aligned image)*/

++    int32_t bl_cc11;

++

++} ia_pal_isp_hdr_blc_1_t;

++

++/*! \isp struct hdr_pwldecomp_1

++PWL decompression filter

++*/

++typedef struct

++{

++    /*!< idx_shift Shift for computing LUT index*/

++    int32_t idx_shift;

++    /*!< delta_x_0_to_31[32] PWL decompression curve delta x (for each segment)*/

++    int32_t delta_x_0_to_31[32];

++    /*!< delta_x_32_to_63[32] PWL decompression curve delta x (for each segment)*/

++    int32_t delta_x_32_to_63[32];

++    /*!< slope_shift_0_to_31[32] PWL decompression curve shift representing slope (for each segment)*/

++    int32_t slope_shift_0_to_31[32];

++    /*!< slope_shift_32_to_63[32] PWL decompression curve shift representing slope (for each segment)*/

++    int32_t slope_shift_32_to_63[32];

++    /*!< offset_y_0_to_31[32] PWL decompression curve y offset (for each segment)*/

++    int32_t offset_y_0_to_31[32];

++    /*!< offset_y_32_to_63[32] PWL decompression curve y offset (for each segment)*/

++    int32_t offset_y_32_to_63[32];

++    /*!< use64 Switch for using 64-element LUTs*/

++    int32_t use64;

++    /*!< range_shift Shift for MSB alignment*/

++    int32_t range_shift;

++

++} ia_pal_isp_hdr_pwldecomp_1_t;

++

++/*! \isp struct hdr_sqrtcomp_2

++HDR compression filter

++*/

++typedef struct

++{

++    /*!< noSQRTcomp SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/

++    int32_t noSQRTcomp;

++

++} ia_pal_isp_hdr_sqrtcomp_2_t;

++

++/*! \isp struct hdr_sqrtcomp_3

++

++*/

++typedef struct

++{

++    /*!< bypass SQRT compression switch: 0 - enable SQRT compression, 1 - no SQRT compression, pass top 15-bits (approx.)*/

++    int32_t bypass;

++    /*!< invsqrt_offset_vec[128] */

++    int32_t invsqrt_offset_vec[128];

++    /*!< invsqrt_slope_vec[128] */

++    int32_t invsqrt_slope_vec[128];

++    /*!< invsqrt_x_cord_vec[128] */

++    int32_t invsqrt_x_cord_vec[128];

++    /*!< invsqrt_exponent */

++    int32_t invsqrt_exponent;

++    /*!< invsqrt_resolution */

++    int32_t invsqrt_resolution;

++    /*!< invsqrt_x_cord_max */

++    int32_t invsqrt_x_cord_max;

++

++} ia_pal_isp_hdr_sqrtcomp_3_t;

++

++/*! \isp struct hdr_stitch_1w

++

++*/

++typedef struct

++{

++    /*!< blend_hithr Blending mask transfer fn upper threshold*/

++    int32_t blend_hithr;

++    /*!< blend_maxblendval Max. blending mask value before normalization*/

++    int32_t blend_maxblendval;

++    /*!< blend_blendshift Normalization shift for blending mask values*/

++    int32_t blend_blendshift;

++    /*!< blend_maxblendval2 Max. blending mask value after normalization*/

++    int32_t blend_maxblendval2;

++    /*!< dg_Yshift Shift for luminance in deghosting*/

++    int32_t dg_Yshift;

++    /*!< dg_A Ghost map transfer fn. parameter A*/

++    int32_t dg_A;

++    /*!< dg_S Ghost map transfer fn. parameter S*/

++    int32_t dg_S;

++    /*!< dg_Yfactshift Shift for luminance factor in deghosting*/

++    int32_t dg_Yfactshift;

++    /*!< dg_Yfactoffset Offset for luminance factor in deghosting*/

++    int32_t dg_Yfactoffset;

++    /*!< dg_ylothr Low threshold deghosting luminance sensitivity (15bit)*/

++    int32_t dg_ylothr;

++    /*!< dg_blur Factor for controling blurring in ghost locations (0 no blur , 128 max blur)*/

++    int32_t dg_blur;

++    /*!< ng_factor Normalization gain factor (ISP gain * HDR gain)*/

++    int32_t ng_factor;

++    /*!< ng_shift Normalization gain shift*/

++    int32_t ng_shift;

++    /*!< cgl_R Long exposure channel gain, R (fixed point)*/

++    int32_t cgl_R;

++    /*!< cgl_Gr Long exposure channel gain, Gr (fixed point)*/

++    int32_t cgl_Gr;

++    /*!< cgl_Gb Long exposure channel gain, Gb (fixed point)*/

++    int32_t cgl_Gb;

++    /*!< cgl_B Long exposure channel gain, B (fixed point)*/

++    int32_t cgl_B;

++    /*!< cgs_R Short exposure channel gain, R (fixed point)*/

++    int32_t cgs_R;

++    /*!< cgs_Gr Short exposure channel gain, Gr (fixed point)*/

++    int32_t cgs_Gr;

++    /*!< cgs_Gb Short exposure channel gain, Gb (fixed point)*/

++    int32_t cgs_Gb;

++    /*!< cgs_B Short exposure channel gain, B (fixed point)*/

++    int32_t cgs_B;

++    /*!< bll_cc00 Long exposure black level, color channel (0,0), WB corrected*/

++    int32_t bll_cc00;

++    /*!< bll_cc01 Long exposure black level, color channel (0,0), WB corrected*/

++    int32_t bll_cc01;

++    /*!< bll_cc10 Long exposure black level, color channel (0,0), WB corrected*/

++    int32_t bll_cc10;

++    /*!< bll_cc11 Long exposure black level, color channel (0,0), WB corrected*/

++    int32_t bll_cc11;

++    /*!< bls_cc00 Short exposure black level, color channel (0,0), fixed point*/

++    int32_t bls_cc00;

++    /*!< bls_cc01 Short exposure black level, color channel (0,1), fixed point*/

++    int32_t bls_cc01;

++    /*!< bls_cc10 Short exposure black level, color channel (1,0), fixed point*/

++    int32_t bls_cc10;

++    /*!< bls_cc11 Short exposure black level, color channel (1,1), fixed point*/

++    int32_t bls_cc11;

++    /*!< blr_cc00 Short exposure residual black level, color channel (0,0), WB corrected and exposure aligned*/

++    int32_t blr_cc00;

++    /*!< blr_cc01 Short exposure residual black level, color channel (0,1), WB corrected and exposure aligned*/

++    int32_t blr_cc01;

++    /*!< blr_cc10 Short exposure residual black level, color channel (1,0), WB corrected and exposure aligned*/

++    int32_t blr_cc10;

++    /*!< blr_cc11 Short exposure residual black level, color channel (1,1), WB corrected and exposure aligned*/

++    int32_t blr_cc11;

++    /*!< dpc_enable DPC weight parameter*/

++    int32_t dpc_enable;

++    /*!< lowlight_value Low light threshold*/

++    int32_t lowlight_value;

++    /*!< lowlight_shift Low light filter shift*/

++    int32_t lowlight_shift;

++    /*!< lowlight_filterStrength Low light filter strength*/

++    int32_t lowlight_filterStrength;

++

++} ia_pal_isp_hdr_stitch_1w_t;

++

++/*! \isp struct hdr_wb_1

++HDR white balance correction filter

++*/

++typedef struct

++{

++    /*!< gain_R Integer representation of adjusted WB gain, R*/

++    int32_t gain_R;

++    /*!< gain_Gr Integer representation of adjusted WB gain, Gr*/

++    int32_t gain_Gr;

++    /*!< gain_Gb Integer representation of adjusted WB gain, Gb*/

++    int32_t gain_Gb;

++    /*!< gain_B Integer representation of adjusted WB gain, B*/

++    int32_t gain_B;

++    /*!< gain_shift_R Adjusted WB gain shift, R*/

++    int32_t gain_shift_R;

++    /*!< gain_shift_Gr Adjusted WB gain shift, Gr*/

++    int32_t gain_shift_Gr;

++    /*!< gain_shift_Gb Adjusted WB gain shift, Gb*/

++    int32_t gain_shift_Gb;

++    /*!< gain_shift_B Adjusted WB gain shift, B*/

++    int32_t gain_shift_B;

++    /*!< clipval Clip value for input signal*/

++    int32_t clipval;

++

++} ia_pal_isp_hdr_wb_1_t;

++

++/*! \isp struct hdrstats_1

++HDR Statistics Extraction filter

++*/

++typedef struct

++{

++    /*!< rgbsstat_en StatR/G/B/S enable: 0 - disable, 1 - enable*/

++    int32_t rgbsstat_en;

++    /*!< histstat_en HistStatR/G/B/Y enable: 0 - disable, 1 - enable*/

++    int32_t histstat_en;

++    /*!< drcstat_en DRCStatY/V enable: 0 - disable, 1 - enable*/

++    int32_t drcstat_en;

++    /*!< bayer_startcolor Bayer Start Color: 0 - R, 1 - Gr, 2 - Gb, 3 - B*/

++    int32_t bayer_startcolor;

++    /*!< dcn_mode DCN mode: 0 - bypass, 1 - DC2, 2 - DC4, 3 - DC8, Saturation grid size: 0 - 8x8, 1 - 16x16, 2 - 32x32, 3 - 64x64*/

++    int32_t dcn_mode;

++    /*!< sat_thrsh Saturation threshold*/

++    int32_t sat_thrsh;

++    /*!< sat_rshift Saturation right shift value for converting to saturation ratio: DCN mode * 2*/

++    int32_t sat_rshift;

++    /*!< drcstat_xx2x_bypass Bypass XX2x sub-block*/

++    int32_t drcstat_xx2x_bypass;

++    /*!< decomp_bypass Bypass decompression sub-block*/

++    int32_t decomp_bypass;

++    /*!< decomp_y_mode decompression Y mode: 0 - average, 1 - max*/

++    int32_t decomp_y_mode;

++    /*!< rgbs_grid_width StatR/G/B/S grid width*/

++    int32_t rgbs_grid_width;

++    /*!< rgbs_grid_height StatR/G/B/S grid height*/

++    int32_t rgbs_grid_height;

++    /*!< hist_grid_width HistStatR/G/B/Y grid width*/

++    int32_t hist_grid_width;

++    /*!< hist_grid_height HistStatR/G/B/Y grid height*/

++    int32_t hist_grid_height;

++    /*!< drc_grid_width DRCStatY/V grid width*/

++    int32_t drc_grid_width;

++    /*!< drc_grid_height DRCStatY/V grid height*/

++    int32_t drc_grid_height;

++

++} ia_pal_isp_hdrstats_1_t;

++

++/*! \isp struct input_system_drainer

++

++*/

++typedef struct

++{

++    /*!< binning_bayer_enable Bayer binning enable*/

++    int32_t binning_bayer_enable;

++    /*!< binning_4cell_enable 4cell binning enable*/

++    int32_t binning_4cell_enable;

++    /*!< crop_enable 0 - Line cropping enabled, 1 - Line cropping enabled*/

++    int32_t crop_enable;

++    /*!< crop_line_top When cropping is enabled, all lines before this line will be cropped*/

++    int32_t crop_line_top;

++    /*!< crop_line_bot When cropping is enabled, all lines after this line will be cropped*/

++    int32_t crop_line_bot;

++

++} ia_pal_isp_input_system_drainer_t;

++

++/*! \isp struct io_buffer

++

++*/

++typedef struct

++{

++    /*!< input_width Input width counted in number of pixels components per line*/

++    int32_t input_width;

++    /*!< input_height Input height counted in number of lines*/

++    int32_t input_height;

++    /*!< output_width Output width counted in number of pixels components per line*/

++    int32_t output_width;

++    /*!< output_height Output height counted in number of lines*/

++    int32_t output_height;

++    /*!< x_output_offset Output horizontal offset from the input, counted in number of pixels components per line, 16b signed (if negative padding is required)*/

++    int32_t x_output_offset;

++    /*!< y_output_offset Output vertical offset from the input counted in number of lines, 16b signed*/

++    int32_t y_output_offset;

++    /*!< use_attributes This capability impact the ODR. When set, ODR should use the EOL/EOF attributes to detect frame dimensions. In general, this capability is used when the height or width or both are not known or cannot be expressed. Using this capability disable the option using crop/pad mechanism and force SW to provide the same dimension in input/output region (if known) and zero the offset values.*/

++    int32_t use_attributes;

++    /*!< espa_luma_shift_left 1-perform shift left on the luma/bayer componenets, 0-perfrom shift right on the luma/bayer components*/

++    int32_t espa_luma_shift_left;

++    /*!< espa_luma_shift_count shift amount to the luma/bayer component where sign is kept and shift right done with rounding*/

++    int32_t espa_luma_shift_count;

++    /*!< espa_chroma_shift_left 1-perform shift left on the chroma componenets, 0-perfrom shift right on the chroma components*/

++    int32_t espa_chroma_shift_left;

++    /*!< espa_chroma_shift_count shift amount to the chroma component where sign is kept and shift right done with rounding*/

++    int32_t espa_chroma_shift_count;

++    /*!< espa_range_reduction_output_resolution Set the output resolution to be used at the range reduction calculation*/

++    int32_t espa_range_reduction_output_resolution;

++    /*!< espa_range_reduction_enable enable range reduction calculation for all components*/

++    int32_t espa_range_reduction_enable;

++    /*!< espa_luma_clipping_min_enable clipping the luma components to clipping_min value*/

++    int32_t espa_luma_clipping_min_enable;

++    /*!< espa_luma_clipping_max_enable clipping the luma components to clipping_max value*/

++    int32_t espa_luma_clipping_max_enable;

++    /*!< espa_chroma_clipping_min_enable clipping the chroma components to clipping_min value*/

++    int32_t espa_chroma_clipping_min_enable;

++    /*!< espa_chroma_clipping_max_enable clipping the chroma components to clipping_max value*/

++    int32_t espa_chroma_clipping_max_enable;

++    /*!< espa_luma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/

++    int32_t espa_luma_clipping_min_value;

++    /*!< espa_luma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/

++    int32_t espa_luma_clipping_max_value;

++    /*!< espa_luma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/

++    int32_t espa_luma_offset_value;

++    /*!< espa_chroma_clipping_min_value Min value (S15) to clip the component after the shift using sign arithmetic*/

++    int32_t espa_chroma_clipping_min_value;

++    /*!< espa_chroma_clipping_max_value Max value (S15) to clip the component after the shift using sign arithmetic*/

++    int32_t espa_chroma_clipping_max_value;

++    /*!< espa_chroma_offset_value Offset value (S15) to be added to the component using sign arithmetic*/

++    int32_t espa_chroma_offset_value;

++    /*!< espa_enable Enable espa*/

++    int32_t espa_enable;

++    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/

++    int32_t component_precision;

++    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/

++    int32_t unpack_alignment;

++    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/

++    int32_t vertical_ordering_enable;

++    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/

++    int32_t vertical_ordering_sub_line;

++    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/

++    int32_t num_of_queues;

++    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/

++    int32_t vector_format;

++    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/

++    int32_t tile_mode;

++    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/

++    int32_t tiling_type;

++    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/

++    int32_t compression_mode;

++    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/

++    int32_t buffer_1d_enable;

++    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/

++    int32_t num_of_planes;

++    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/

++    uint32_t plane_stride[3];

++    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

++    uint32_t plane_offset_start_address[3];

++    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

++    uint32_t plane_offset_end_address[3];

++    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/

++    int32_t plane_tile_width[3];

++    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/

++    int32_t plane_tile_height[3];

++    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/

++    int32_t chroma_planes_order;

++    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/

++    int32_t chroma_duplication;

++    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/

++    int32_t onep_pixel_order;

++    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/

++    int32_t zlr_transaction_enable;

++    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/

++    int32_t streaming_mode;

++    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/

++    int32_t streaming_sw_managed;

++    /*!< local_link_id indicates the stream used at the current connectlon*/

++    int32_t local_link_id;

++    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/

++    int32_t stride_ratio;

++    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/

++    int32_t granularity_pointer_update;

++    /*!< max_stride provides the maximum stride value to be used at the connection*/

++    int32_t max_stride;

++    /*!< block_width buffer block width configuration in pixels*/

++    int32_t block_width;

++    /*!< block_height buffer block height configuration in lines*/

++    int32_t block_height;

++    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/

++    int32_t first_row_blocks_height;

++    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/

++    int32_t last_row_blocks_height;

++    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/

++    int32_t plane_max_burst_size[3];

++    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/

++    int32_t plane_horiz_subsample_config[3];

++    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/

++    int32_t plane_vert_subsample_config[3];

++    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/

++    int32_t plane_zlr_granularity[3];

++    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/

++    int32_t progress_message_line;

++    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/

++    int32_t pace_message_ref_line;

++    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/

++    int32_t pace_message_pace_line;

++    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/

++    int32_t component_in_valid_pixel;

++    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/

++    int32_t pixels_in_valid_cycle;

++    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/

++    int32_t subsample_YUV444_to_YUV422;

++    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/

++    int32_t middle_ack_line_number;

++    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/

++    int32_t middle_ack_enable;

++    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/

++    int32_t middle_ack_mode_stall;

++    /*!< stream_dt stream data type as need to be used by the MIPI*/

++    int32_t stream_dt;

++    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/

++    int32_t stream_vc;

++    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/

++    int32_t proc_ff_bypass;

++    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

++    int32_t dpa_bypass;

++    /*!< stream_dt_for_mipi_packet stream data type as need to be used in the header of mipi packet - not affect the proc*/

++    int32_t stream_dt_for_mipi_packet;

++    /*!< arbiter_pin MIPI CSI arbiter pin location of the stream*/

++    int32_t arbiter_pin;

++    /*!< user_reserved user_reserved*/

++    int32_t user_reserved;

++    /*!< aligner_data_size amount of valid bits per valid cycle to be accumulate and use the aligner (valid when dpa_bypass is set). LSB represent 2b resolution (meaning value can be 2, 4, 6, 8, … up to 72 which is the size bus)*/

++    int32_t aligner_data_size;

++    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

++    int32_t mipi_csi_eof;

++    /*!< ppc provides the amount of pixel per cycle*/

++    int32_t ppc;

++    /*!< stream_wc stream word count as need to be used by the MIPI*/

++    int32_t stream_wc;

++    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/

++    uint32_t max_credits;

++    /*!< reserved_0_0 Reserved for future use*/

++    int32_t reserved_0_0;

++    /*!< reserved_0_1 Reserved for future use*/

++    int32_t reserved_0_1;

++    /*!< reserved_0_2 Reserved for future use*/

++    int32_t reserved_0_2;

++    /*!< reserved_0_3 Reserved for future use*/

++    int32_t reserved_0_3;

++    /*!< reserved_1_0 Reserved for future use*/

++    int32_t reserved_1_0;

++    /*!< reserved_1_1 Reserved for future use*/

++    int32_t reserved_1_1;

++    /*!< reserved_1_2 Reserved for future use*/

++    int32_t reserved_1_2;

++    /*!< reserved_1_3 Reserved for future use*/

++    int32_t reserved_1_3;

++

++} ia_pal_isp_io_buffer_t;

++

++/*! \isp struct irs_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Enable IRS*/

++    int32_t enable;

++    /*!< passThrough Pass throught algorithm*/

++    int32_t passThrough;

++    /*!< block_height */

++    int32_t block_height;

++    /*!< block_width */

++    int32_t block_width;

++    /*!< top_left_x */

++    int32_t top_left_x;

++    /*!< top_left_y */

++    int32_t top_left_y;

++    /*!< interpolation_enable */

++    int32_t interpolation_enable;

++    /*!< unclipped_a_max */

++    int32_t unclipped_a_max;

++    /*!< mask_val_Y */

++    int32_t mask_val_Y;

++    /*!< mask_val_U */

++    int32_t mask_val_U;

++    /*!< mask_val_V */

++    int32_t mask_val_V;

++    /*!< mask_val_Z */

++    int32_t mask_val_Z;

++    /*!< coord_stride stride of the given coordinates grid*/

++    int32_t coord_stride;

++    /*!< mode MC1/MC2/MCFR/GDC_SP/GDC_FR mode*/

++    int32_t mode;

++

++} ia_pal_isp_irs_1_0_t;

++

++/*! \isp struct lca_1_0

++Lateral Chromatic Aberration Correction

++*/

++typedef struct

++{

++    /*!< radial_enable radial_enable*/

++    int32_t radial_enable;

++    /*!< grid_enable grid_enable*/

++    int32_t grid_enable;

++    /*!< bypass bypass flag*/

++    int32_t bypass;

++    /*!< pixel_format_matrix[4] Bayer type: Gr -> 0, Gb ->1, R -> 2, B -> 3*/

++    int32_t pixel_format_matrix[4];

++    /*!< rx_initial rx_initial*/

++    int32_t rx_initial;

++    /*!< ry_initial ry_initial*/

++    int32_t ry_initial;

++    /*!< opt_center_x opt_center_x*/

++    int32_t opt_center_x;

++    /*!< opt_center_y opt_center_y*/

++    int32_t opt_center_y;

++    /*!< bits_per_pixel_in_map_x bits_per_pixel_in_map_x*/

++    int32_t bits_per_pixel_in_map_x;

++    /*!< bits_per_pixel_in_map_y bits_per_pixel_in_map_y*/

++    int32_t bits_per_pixel_in_map_y;

++    /*!< grid_shift_map_blue_x[324] grid_shift_map_blue_x*/

++    int32_t grid_shift_map_blue_x[324];

++    /*!< grid_shift_map_blue_y[324] grid_shift_map_blue_y*/

++    int32_t grid_shift_map_blue_y[324];

++    /*!< grid_shift_map_red_x[324] grid_shift_map_red_x*/

++    int32_t grid_shift_map_red_x[324];

++    /*!< grid_shift_map_red_y[324] grid_shift_map_red_y*/

++    int32_t grid_shift_map_red_y[324];

++    /*!< cu_blue_rad_shift_x[16] cu_blue_rad_shift_x*/

++    int32_t cu_blue_rad_shift_x[16];

++    /*!< cu_blue_rad_shift_y[15] cu_blue_rad_shift_y*/

++    int32_t cu_blue_rad_shift_y[15];

++    /*!< cu_blue_rad_shift_slope[15] cu_blue_rad_shift_slope*/

++    int32_t cu_blue_rad_shift_slope[15];

++    /*!< cu_red_rad_shift_x[16] cu_red_rad_shift_x*/

++    int32_t cu_red_rad_shift_x[16];

++    /*!< cu_red_rad_shift_y[15] cu_red_rad_shift_y*/

++    int32_t cu_red_rad_shift_y[15];

++    /*!< cu_red_rad_shift_slope[15] cu_red_rad_shift_slope*/

++    int32_t cu_red_rad_shift_slope[15];

++    /*!< resample_type resample type: 0 - bilinear, 1 - bicubic*/

++    int32_t resample_type;

++    /*!< rad_sqr_prec_reduction radius square precision reduction*/

++    int32_t rad_sqr_prec_reduction;

++    /*!< grid_shift_precision_increment grid shift precision increment*/

++    int32_t grid_shift_precision_increment;

++    /*!< radial_shift_precision_alignment radial shift precision alignment*/

++    int32_t radial_shift_precision_alignment;

++    /*!< correction_power sensitivity correction*/

++    int32_t correction_power;

++    /*!< binning_factor_x binnig factor for x dimension*/

++    int32_t binning_factor_x;

++    /*!< binning_factor_y binning factor for y dimension*/

++    int32_t binning_factor_y;

++

++} ia_pal_isp_lca_1_0_t;

++

++/*! \isp struct ldr_blc_1

++LDR black level correction filter

++*/

++typedef struct

++{

++    /*!< bl_cc00 Black level, color channel (0,0)*/

++    int32_t bl_cc00;

++    /*!< bl_cc01 Black level, color channel (0,1)*/

++    int32_t bl_cc01;

++    /*!< bl_cc10 Black level, color channel (1,0)*/

++    int32_t bl_cc10;

++    /*!< bl_cc11 Black level, color channel (1,1)*/

++    int32_t bl_cc11;

++

++} ia_pal_isp_ldr_blc_1_t;

++

++/*! \isp struct ldr_wb_1

++LDR white balance correction filter

++*/

++typedef struct

++{

++    /*!< gain_R WB gain, R (fixed point)*/

++    int32_t gain_R;

++    /*!< gain_Gr WB gain, Gr (fixed point)*/

++    int32_t gain_Gr;

++    /*!< gain_Gb WB gain, Gb (fixed point)*/

++    int32_t gain_Gb;

++    /*!< gain_B WB gain, B (fixed point)*/

++    int32_t gain_B;

++    /*!< gain_fract No. of fractional places in WB gain fixed pt. representation*/

++    int32_t gain_fract;

++    /*!< saturation_value Saturation value after WB*/

++    int32_t saturation_value;

++

++} ia_pal_isp_ldr_wb_1_t;

++

++/*! \isp struct linearization2_0

++Linearization

++*/

++typedef struct

++{

++    /*!< Linearization2_0_enable Enable Linearization2_0*/

++    int32_t Linearization2_0_enable;

++    /*!< glu_base_level0[5] GLU base level offset*/

++    int32_t glu_base_level0[5];

++    /*!< glu_base_level1[5] GLU1 base level offset*/

++    int32_t glu_base_level1[5];

++    /*!< glu_base_level2[5] GLU2 base level offset*/

++    int32_t glu_base_level2[5];

++    /*!< glu_base_level3[5] GLU3 base level offset*/

++    int32_t glu_base_level3[5];

++    /*!< glu_base_level4[5] GLU4 base level offset*/

++    int32_t glu_base_level4[5];

++    /*!< glu_base_level5[5] GLU5 base level offset*/

++    int32_t glu_base_level5[5];

++    /*!< glu_base_level6[5] GLU6 base level offset*/

++    int32_t glu_base_level6[5];

++    /*!< glu_base_level7[5] GLU7 base level offset*/

++    int32_t glu_base_level7[5];

++    /*!< glu_step0[5] GLU step amount per stage*/

++    int32_t glu_step0[5];

++    /*!< glu_step1[5] GLU1 step amount per stage*/

++    int32_t glu_step1[5];

++    /*!< glu_step2[5] GLU2 step amount per stage*/

++    int32_t glu_step2[5];

++    /*!< glu_step3[5] GLU3 step amount per stage*/

++    int32_t glu_step3[5];

++    /*!< glu_step4[5] GLU4 step amount per stage*/

++    int32_t glu_step4[5];

++    /*!< glu_step5[5] GLU5 step amount per stage*/

++    int32_t glu_step5[5];

++    /*!< glu_step6[5] GLU6 step amount per stage*/

++    int32_t glu_step6[5];

++    /*!< glu_step7[5] GLU7 step amount per stage*/

++    int32_t glu_step7[5];

++    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

++    int32_t glu_start_bin0[5];

++    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

++    int32_t glu_start_bin1[5];

++    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

++    int32_t glu_start_bin2[5];

++    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

++    int32_t glu_start_bin3[5];

++    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

++    int32_t glu_start_bin4[5];

++    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

++    int32_t glu_start_bin5[5];

++    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

++    int32_t glu_start_bin6[5];

++    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

++    int32_t glu_start_bin7[5];

++    /*!< glu_gen_lut_size0 Utilized LUT size*/

++    int32_t glu_gen_lut_size0;

++    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

++    int32_t glu_gen_lut_size1;

++    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

++    int32_t glu_gen_lut_size2;

++    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

++    int32_t glu_gen_lut_size3;

++    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

++    int32_t glu_gen_lut_size4;

++    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

++    int32_t glu_gen_lut_size5;

++    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

++    int32_t glu_gen_lut_size6;

++    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

++    int32_t glu_gen_lut_size7;

++    /*!< glu_gen_lut0[512] LUT samples*/

++    int32_t glu_gen_lut0[512];

++    /*!< glu_gen_lut1[512] LUT1 samples*/

++    int32_t glu_gen_lut1[512];

++    /*!< glu_gen_lut2[512] LUT2 samples*/

++    int32_t glu_gen_lut2[512];

++    /*!< glu_gen_lut3[512] LUT3 samples*/

++    int32_t glu_gen_lut3[512];

++    /*!< glu_gen_lut4[512] LUT4 samples*/

++    int32_t glu_gen_lut4[512];

++    /*!< glu_gen_lut5[512] LUT5 samples*/

++    int32_t glu_gen_lut5[512];

++    /*!< glu_gen_lut6[512] LUT6 samples*/

++    int32_t glu_gen_lut6[512];

++    /*!< glu_gen_lut7[512] LUT7 samples*/

++    int32_t glu_gen_lut7[512];

++    /*!< mask0[4] Mask of quad 0*/

++    int32_t mask0[4];

++    /*!< mask1[4] Mask of quad 1*/

++    int32_t mask1[4];

++    /*!< mask2[4] Mask of quad 2*/

++    int32_t mask2[4];

++    /*!< mask3[4] Mask of quad 3*/

++    int32_t mask3[4];

++

++} ia_pal_isp_linearization2_0_t;

++

++/*! \isp struct linearization2_0_b

++Linearization

++*/

++typedef struct

++{

++    /*!< Linearization2_0_enable Enable Linearization2_0*/

++    int32_t Linearization2_0_enable;

++    /*!< glu_base_level0[5] GLU base level offset*/

++    int32_t glu_base_level0[5];

++    /*!< glu_base_level1[5] GLU1 base level offset*/

++    int32_t glu_base_level1[5];

++    /*!< glu_base_level2[5] GLU2 base level offset*/

++    int32_t glu_base_level2[5];

++    /*!< glu_base_level3[5] GLU3 base level offset*/

++    int32_t glu_base_level3[5];

++    /*!< glu_base_level4[5] GLU4 base level offset*/

++    int32_t glu_base_level4[5];

++    /*!< glu_base_level5[5] GLU5 base level offset*/

++    int32_t glu_base_level5[5];

++    /*!< glu_base_level6[5] GLU6 base level offset*/

++    int32_t glu_base_level6[5];

++    /*!< glu_base_level7[5] GLU7 base level offset*/

++    int32_t glu_base_level7[5];

++    /*!< glu_step0[5] GLU step amount per stage*/

++    int32_t glu_step0[5];

++    /*!< glu_step1[5] GLU1 step amount per stage*/

++    int32_t glu_step1[5];

++    /*!< glu_step2[5] GLU2 step amount per stage*/

++    int32_t glu_step2[5];

++    /*!< glu_step3[5] GLU3 step amount per stage*/

++    int32_t glu_step3[5];

++    /*!< glu_step4[5] GLU4 step amount per stage*/

++    int32_t glu_step4[5];

++    /*!< glu_step5[5] GLU5 step amount per stage*/

++    int32_t glu_step5[5];

++    /*!< glu_step6[5] GLU6 step amount per stage*/

++    int32_t glu_step6[5];

++    /*!< glu_step7[5] GLU7 step amount per stage*/

++    int32_t glu_step7[5];

++    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

++    int32_t glu_start_bin0[5];

++    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

++    int32_t glu_start_bin1[5];

++    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

++    int32_t glu_start_bin2[5];

++    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

++    int32_t glu_start_bin3[5];

++    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

++    int32_t glu_start_bin4[5];

++    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

++    int32_t glu_start_bin5[5];

++    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

++    int32_t glu_start_bin6[5];

++    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

++    int32_t glu_start_bin7[5];

++    /*!< glu_gen_lut_size0 Utilized LUT size*/

++    int32_t glu_gen_lut_size0;

++    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

++    int32_t glu_gen_lut_size1;

++    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

++    int32_t glu_gen_lut_size2;

++    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

++    int32_t glu_gen_lut_size3;

++    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

++    int32_t glu_gen_lut_size4;

++    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

++    int32_t glu_gen_lut_size5;

++    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

++    int32_t glu_gen_lut_size6;

++    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

++    int32_t glu_gen_lut_size7;

++    /*!< glu_gen_lut0[512] LUT samples*/

++    int32_t glu_gen_lut0[512];

++    /*!< glu_gen_lut1[512] LUT1 samples*/

++    int32_t glu_gen_lut1[512];

++    /*!< glu_gen_lut2[512] LUT2 samples*/

++    int32_t glu_gen_lut2[512];

++    /*!< glu_gen_lut3[512] LUT3 samples*/

++    int32_t glu_gen_lut3[512];

++    /*!< glu_gen_lut4[512] LUT4 samples*/

++    int32_t glu_gen_lut4[512];

++    /*!< glu_gen_lut5[512] LUT5 samples*/

++    int32_t glu_gen_lut5[512];

++    /*!< glu_gen_lut6[512] LUT6 samples*/

++    int32_t glu_gen_lut6[512];

++    /*!< glu_gen_lut7[512] LUT7 samples*/

++    int32_t glu_gen_lut7[512];

++    /*!< mask0[4] Mask of quad 0*/

++    int32_t mask0[4];

++    /*!< mask1[4] Mask of quad 1*/

++    int32_t mask1[4];

++    /*!< mask2[4] Mask of quad 2*/

++    int32_t mask2[4];

++    /*!< mask3[4] Mask of quad 3*/

++    int32_t mask3[4];

++

++} ia_pal_isp_linearization2_0_b_t;

++

++/*! \isp struct linearization2_0_c

++Linearization

++*/

++typedef struct

++{

++    /*!< Linearization2_0_enable Enable Linearization2_0*/

++    int32_t Linearization2_0_enable;

++    /*!< glu_base_level0[5] GLU base level offset*/

++    int32_t glu_base_level0[5];

++    /*!< glu_base_level1[5] GLU1 base level offset*/

++    int32_t glu_base_level1[5];

++    /*!< glu_base_level2[5] GLU2 base level offset*/

++    int32_t glu_base_level2[5];

++    /*!< glu_base_level3[5] GLU3 base level offset*/

++    int32_t glu_base_level3[5];

++    /*!< glu_base_level4[5] GLU4 base level offset*/

++    int32_t glu_base_level4[5];

++    /*!< glu_base_level5[5] GLU5 base level offset*/

++    int32_t glu_base_level5[5];

++    /*!< glu_base_level6[5] GLU6 base level offset*/

++    int32_t glu_base_level6[5];

++    /*!< glu_base_level7[5] GLU7 base level offset*/

++    int32_t glu_base_level7[5];

++    /*!< glu_step0[5] GLU step amount per stage*/

++    int32_t glu_step0[5];

++    /*!< glu_step1[5] GLU1 step amount per stage*/

++    int32_t glu_step1[5];

++    /*!< glu_step2[5] GLU2 step amount per stage*/

++    int32_t glu_step2[5];

++    /*!< glu_step3[5] GLU3 step amount per stage*/

++    int32_t glu_step3[5];

++    /*!< glu_step4[5] GLU4 step amount per stage*/

++    int32_t glu_step4[5];

++    /*!< glu_step5[5] GLU5 step amount per stage*/

++    int32_t glu_step5[5];

++    /*!< glu_step6[5] GLU6 step amount per stage*/

++    int32_t glu_step6[5];

++    /*!< glu_step7[5] GLU7 step amount per stage*/

++    int32_t glu_step7[5];

++    /*!< glu_start_bin0[5] GLU stage start offset in LUT*/

++    int32_t glu_start_bin0[5];

++    /*!< glu_start_bin1[5] GLU stage start offset in LUT1*/

++    int32_t glu_start_bin1[5];

++    /*!< glu_start_bin2[5] GLU stage start offset in LUT2*/

++    int32_t glu_start_bin2[5];

++    /*!< glu_start_bin3[5] GLU stage start offset in LUT3*/

++    int32_t glu_start_bin3[5];

++    /*!< glu_start_bin4[5] GLU stage start offset in LUT4*/

++    int32_t glu_start_bin4[5];

++    /*!< glu_start_bin5[5] GLU stage start offset in LUT5*/

++    int32_t glu_start_bin5[5];

++    /*!< glu_start_bin6[5] GLU stage start offset in LUT6*/

++    int32_t glu_start_bin6[5];

++    /*!< glu_start_bin7[5] GLU stage start offset in LUT7*/

++    int32_t glu_start_bin7[5];

++    /*!< glu_gen_lut_size0 Utilized LUT size*/

++    int32_t glu_gen_lut_size0;

++    /*!< glu_gen_lut_size1 Utilized LUT1 size*/

++    int32_t glu_gen_lut_size1;

++    /*!< glu_gen_lut_size2 Utilized LUT2 size*/

++    int32_t glu_gen_lut_size2;

++    /*!< glu_gen_lut_size3 Utilized LUT3 size*/

++    int32_t glu_gen_lut_size3;

++    /*!< glu_gen_lut_size4 Utilized LUT4 size*/

++    int32_t glu_gen_lut_size4;

++    /*!< glu_gen_lut_size5 Utilized LUT5 size*/

++    int32_t glu_gen_lut_size5;

++    /*!< glu_gen_lut_size6 Utilized LUT6 size*/

++    int32_t glu_gen_lut_size6;

++    /*!< glu_gen_lut_size7 Utilized LUT7 size*/

++    int32_t glu_gen_lut_size7;

++    /*!< glu_gen_lut0[512] LUT samples*/

++    int32_t glu_gen_lut0[512];

++    /*!< glu_gen_lut1[512] LUT1 samples*/

++    int32_t glu_gen_lut1[512];

++    /*!< glu_gen_lut2[512] LUT2 samples*/

++    int32_t glu_gen_lut2[512];

++    /*!< glu_gen_lut3[512] LUT3 samples*/

++    int32_t glu_gen_lut3[512];

++    /*!< glu_gen_lut4[512] LUT4 samples*/

++    int32_t glu_gen_lut4[512];

++    /*!< glu_gen_lut5[512] LUT5 samples*/

++    int32_t glu_gen_lut5[512];

++    /*!< glu_gen_lut6[512] LUT6 samples*/

++    int32_t glu_gen_lut6[512];

++    /*!< glu_gen_lut7[512] LUT7 samples*/

++    int32_t glu_gen_lut7[512];

++    /*!< mask0[4] Mask of quad 0*/

++    int32_t mask0[4];

++    /*!< mask1[4] Mask of quad 1*/

++    int32_t mask1[4];

++    /*!< mask2[4] Mask of quad 2*/

++    int32_t mask2[4];

++    /*!< mask3[4] Mask of quad 3*/

++    int32_t mask3[4];

++

++} ia_pal_isp_linearization2_0_c_t;

++

++/*! \isp struct linearization2hdr

++

++*/

++typedef struct

++{

++    /*!< bypass */

++    int32_t bypass;

++    /*!< lut_vec_00[128] */

++    int32_t lut_vec_00[128];

++    /*!< lut_vec_01[128] */

++    int32_t lut_vec_01[128];

++    /*!< lut_vec_10[128] */

++    int32_t lut_vec_10[128];

++    /*!< lut_vec_11[128] */

++    int32_t lut_vec_11[128];

++    /*!< base_level[16] */

++    int32_t base_level[16];

++    /*!< start_bin[16] */

++    int32_t start_bin[16];

++    /*!< step[16] */

++    int32_t step[16];

++    /*!< slope_vec_00[128] */

++    int32_t slope_vec_00[128];

++    /*!< slope_vec_01[128] */

++    int32_t slope_vec_01[128];

++    /*!< slope_vec_10[128] */

++    int32_t slope_vec_10[128];

++    /*!< slope_vec_11[128] */

++    int32_t slope_vec_11[128];

++    /*!< slope_resolution[16] */

++    int32_t slope_resolution[16];

++

++} ia_pal_isp_linearization2hdr_t;

++

++/*! \isp struct linearizationdg_dss

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< linc00[65] linearization grid table*/

++    int32_t linc00[65];

++    /*!< linc01[65] linearization grid table*/

++    int32_t linc01[65];

++    /*!< linc02[65] linearization grid table*/

++    int32_t linc02[65];

++    /*!< linc03[65] linearization grid table*/

++    int32_t linc03[65];

++    /*!< linc10[65] linearization grid table*/

++    int32_t linc10[65];

++    /*!< linc11[65] linearization grid table*/

++    int32_t linc11[65];

++    /*!< linc12[65] linearization grid table*/

++    int32_t linc12[65];

++    /*!< linc13[65] linearization grid table*/

++    int32_t linc13[65];

++    /*!< linc20[65] linearization grid table*/

++    int32_t linc20[65];

++    /*!< linc21[65] linearization grid table*/

++    int32_t linc21[65];

++    /*!< linc22[65] linearization grid table*/

++    int32_t linc22[65];

++    /*!< linc23[65] linearization grid table*/

++    int32_t linc23[65];

++    /*!< linc30[65] linearization grid table*/

++    int32_t linc30[65];

++    /*!< linc31[65] linearization grid table*/

++    int32_t linc31[65];

++    /*!< linc32[65] linearization grid table*/

++    int32_t linc32[65];

++    /*!< linc33[65] linearization grid table*/

++    int32_t linc33[65];

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_linearizationdg_dss_t;

++

++/*! \isp struct linearizationwb_dss

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< linc00[65] linearization grid table*/

++    int32_t linc00[65];

++    /*!< linc01[65] linearization grid table*/

++    int32_t linc01[65];

++    /*!< linc02[65] linearization grid table*/

++    int32_t linc02[65];

++    /*!< linc03[65] linearization grid table*/

++    int32_t linc03[65];

++    /*!< linc10[65] linearization grid table*/

++    int32_t linc10[65];

++    /*!< linc11[65] linearization grid table*/

++    int32_t linc11[65];

++    /*!< linc12[65] linearization grid table*/

++    int32_t linc12[65];

++    /*!< linc13[65] linearization grid table*/

++    int32_t linc13[65];

++    /*!< linc20[65] linearization grid table*/

++    int32_t linc20[65];

++    /*!< linc21[65] linearization grid table*/

++    int32_t linc21[65];

++    /*!< linc22[65] linearization grid table*/

++    int32_t linc22[65];

++    /*!< linc23[65] linearization grid table*/

++    int32_t linc23[65];

++    /*!< linc30[65] linearization grid table*/

++    int32_t linc30[65];

++    /*!< linc31[65] linearization grid table*/

++    int32_t linc31[65];

++    /*!< linc32[65] linearization grid table*/

++    int32_t linc32[65];

++    /*!< linc33[65] linearization grid table*/

++    int32_t linc33[65];

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++

++} ia_pal_isp_linearizationwb_dss_t;

++

++/*! \isp struct lossycomp_1_0

++Lossy compression for DDR

++*/

++typedef struct

++{

++    /*!< enable enable the lossy compression*/

++    int32_t enable;

++

++} ia_pal_isp_lossycomp_1_0_t;

++

++/*! \isp struct lossydecomp_1_0

++Lossy decompression for DDR

++*/

++typedef struct

++{

++    /*!< enable enable the lossy decompression*/

++    int32_t enable;

++

++} ia_pal_isp_lossydecomp_1_0_t;

++

++/*! \isp struct lsc_1_1

++

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< lsclog2gridwidth log2 width of each subplane*/

++    int32_t lsclog2gridwidth;

++    /*!< lsclog2gridheight log2 height of each subplane*/

++    int32_t lsclog2gridheight;

++    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t lsc_col_start;

++    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t lsc_row_start;

++    /*!< lsc_exp resolution modifier of the lsc tables*/

++    int32_t lsc_exp;

++    /*!< lsc_grid_tablec00[4096] lsc grid table*/

++    int32_t lsc_grid_tablec00[4096];

++    /*!< lsc_grid_tablec01[4096] lsc grid table*/

++    int32_t lsc_grid_tablec01[4096];

++    /*!< lsc_grid_tablec02[4096] lsc grid table*/

++    int32_t lsc_grid_tablec02[4096];

++    /*!< lsc_grid_tablec03[4096] lsc grid table*/

++    int32_t lsc_grid_tablec03[4096];

++    /*!< lsc_grid_tablec10[4096] lsc grid table*/

++    int32_t lsc_grid_tablec10[4096];

++    /*!< lsc_grid_tablec11[4096] lsc grid table*/

++    int32_t lsc_grid_tablec11[4096];

++    /*!< lsc_grid_tablec12[4096] lsc grid table*/

++    int32_t lsc_grid_tablec12[4096];

++    /*!< lsc_grid_tablec13[4096] lsc grid table*/

++    int32_t lsc_grid_tablec13[4096];

++    /*!< lsc_grid_tablec20[4096] lsc grid table*/

++    int32_t lsc_grid_tablec20[4096];

++    /*!< lsc_grid_tablec21[4096] lsc grid table*/

++    int32_t lsc_grid_tablec21[4096];

++    /*!< lsc_grid_tablec22[4096] lsc grid table*/

++    int32_t lsc_grid_tablec22[4096];

++    /*!< lsc_grid_tablec23[4096] lsc grid table*/

++    int32_t lsc_grid_tablec23[4096];

++    /*!< lsc_grid_tablec30[4096] lsc grid table*/

++    int32_t lsc_grid_tablec30[4096];

++    /*!< lsc_grid_tablec31[4096] lsc grid table*/

++    int32_t lsc_grid_tablec31[4096];

++    /*!< lsc_grid_tablec32[4096] lsc grid table*/

++    int32_t lsc_grid_tablec32[4096];

++    /*!< lsc_grid_tablec33[4096] lsc grid table*/

++    int32_t lsc_grid_tablec33[4096];

++    /*!< lsc_table_width table width*/

++    int32_t lsc_table_width;

++    /*!< lsc_table_height table height*/

++    int32_t lsc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++    /*!< bypass_compression bypass for the compression/decompression*/

++    int32_t bypass_compression;

++    /*!< cu_compression_x[8] U.20 cu_compression_x*/

++    int32_t cu_compression_x[8];

++    /*!< cu_compression_y[7] U.15 cu_compression_y*/

++    int32_t cu_compression_y[7];

++    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit)*/

++    int32_t cu_compression_slope[7];

++    /*!< cu_decompression_x[8] U.15 cu_decompression_y*/

++    int32_t cu_decompression_x[8];

++    /*!< cu_decompression_y[7] U.20 cu_decompression_x*/

++    int32_t cu_decompression_y[7];

++    /*!< cu_decompression_slope[7] U.8.6 cu_decompression_slope (14 bit)*/

++    int32_t cu_decompression_slope[7];

++

++} ia_pal_isp_lsc_1_1_t;

++

++/*! \isp struct lsc_1_2

++Lens shading correction up to 24 bit

++*/

++typedef struct

++{

++    /*!< cfa_type cfa type 0=1x1 1=2x2 2=4x4*/

++    int32_t cfa_type;

++    /*!< lsclog2gridwidth log2 width of each subplane*/

++    int32_t lsclog2gridwidth;

++    /*!< lsclog2gridheight log2 height of each subplane*/

++    int32_t lsclog2gridheight;

++    /*!< lsc_col_start X value of top left corner of sensor relative to ROI*/

++    int32_t lsc_col_start;

++    /*!< lsc_row_start Y value of top left corner of sensor relative to ROI*/

++    int32_t lsc_row_start;

++    /*!< lsc_exp resolution modifier of the lsc tables*/

++    int32_t lsc_exp;

++    /*!< lsc_grid_tablec00[4096] lsc grid table*/

++    int32_t lsc_grid_tablec00[4096];

++    /*!< lsc_grid_tablec01[4096] lsc grid table*/

++    int32_t lsc_grid_tablec01[4096];

++    /*!< lsc_grid_tablec02[4096] lsc grid table*/

++    int32_t lsc_grid_tablec02[4096];

++    /*!< lsc_grid_tablec03[4096] lsc grid table*/

++    int32_t lsc_grid_tablec03[4096];

++    /*!< lsc_grid_tablec10[4096] lsc grid table*/

++    int32_t lsc_grid_tablec10[4096];

++    /*!< lsc_grid_tablec11[4096] lsc grid table*/

++    int32_t lsc_grid_tablec11[4096];

++    /*!< lsc_grid_tablec12[4096] lsc grid table*/

++    int32_t lsc_grid_tablec12[4096];

++    /*!< lsc_grid_tablec13[4096] lsc grid table*/

++    int32_t lsc_grid_tablec13[4096];

++    /*!< lsc_grid_tablec20[4096] lsc grid table*/

++    int32_t lsc_grid_tablec20[4096];

++    /*!< lsc_grid_tablec21[4096] lsc grid table*/

++    int32_t lsc_grid_tablec21[4096];

++    /*!< lsc_grid_tablec22[4096] lsc grid table*/

++    int32_t lsc_grid_tablec22[4096];

++    /*!< lsc_grid_tablec23[4096] lsc grid table*/

++    int32_t lsc_grid_tablec23[4096];

++    /*!< lsc_grid_tablec30[4096] lsc grid table*/

++    int32_t lsc_grid_tablec30[4096];

++    /*!< lsc_grid_tablec31[4096] lsc grid table*/

++    int32_t lsc_grid_tablec31[4096];

++    /*!< lsc_grid_tablec32[4096] lsc grid table*/

++    int32_t lsc_grid_tablec32[4096];

++    /*!< lsc_grid_tablec33[4096] lsc grid table*/

++    int32_t lsc_grid_tablec33[4096];

++    /*!< lsc_table_width table width*/

++    int32_t lsc_table_width;

++    /*!< lsc_table_height table height*/

++    int32_t lsc_table_height;

++    /*!< bypass bypass for the filter*/

++    int32_t bypass;

++    /*!< enable_compand enable for the (de)companding*/

++    int32_t enable_compand;

++    /*!< cu_compression_x[13] U.24 linear, default log-limited*/

++    int32_t cu_compression_x[13];

++    /*!< cu_compression_y[12] U.15 companded output*/

++    int32_t cu_compression_y[12];

++    /*!< cu_compression_slope[12] U1.14 15bit slopes for companding*/

++    int32_t cu_compression_slope[12];

++    /*!< cu_decompression_x[13] U.15 companded input, default log-limited*/

++    int32_t cu_decompression_x[13];

++    /*!< cu_decompression_y[12] U.24 linear*/

++    int32_t cu_decompression_y[12];

++    /*!< cu_decompression_slope[12] U20.6 26bit slopes for decompanding*/

++    int32_t cu_decompression_slope[12];

++    /*!< linear_pedestal Pedestal subtracted (and added later) in linear domain, U.24*/

++    int32_t linear_pedestal;

++    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

++    int32_t use_pedestal;

++

++} ia_pal_isp_lsc_1_2_t;

++

++/*! \isp struct ltm_cd_1_0

++Local Tone Maping Coarse Detail Extruction

++*/

++typedef struct

++{

++    /*!< enable enabling the block. If enable == false, Output is zero*/

++    int32_t enable;

++    /*!< LTM_Power_8 Power gain for 1/8 band*/

++    int32_t LTM_Power_8;

++    /*!< LTM_Power_16 Power gain for 1/16 band*/

++    int32_t LTM_Power_16;

++    /*!< cu_thr8_x[15] threshold for variance - x values*/

++    int32_t cu_thr8_x[15];

++    /*!< cu_thr8_y[14] threshold for variance - y values*/

++    int32_t cu_thr8_y[14];

++    /*!< cu_thr8_slopes[14] threshold for variance - slopes values*/

++    int32_t cu_thr8_slopes[14];

++    /*!< cu_thr16_x[15] threshold for variance - x values*/

++    int32_t cu_thr16_x[15];

++    /*!< cu_thr16_y[14] threshold for variance - y values*/

++    int32_t cu_thr16_y[14];

++    /*!< cu_thr16_slopes[14] threshold for variance - slopes values*/

++    int32_t cu_thr16_slopes[14];

++    /*!< cu_sqrt_x[15] sqrt-x values*/

++    int32_t cu_sqrt_x[15];

++    /*!< cu_sqrt_y[14] sqrt-y values*/

++    int32_t cu_sqrt_y[14];

++    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/

++    int32_t cu_sqrt_slopes[14];

++    /*!< cu_gtm_x[15] gtm-x values*/

++    int32_t cu_gtm_x[15];

++    /*!< cu_gtm_y[14] gtm-y values*/

++    int32_t cu_gtm_y[14];

++    /*!< cu_gtm_slopes[14] gtm-slopes values*/

++    int32_t cu_gtm_slopes[14];

++    /*!< gradual_saturation_on enable gradual saturaion*/

++    int32_t gradual_saturation_on;

++    /*!< frame_width width of current frame*/

++    int32_t frame_width;

++    /*!< frame_height only for HW purposes*/

++    int32_t frame_height;

++    /*!< luma_correction_on enable luma correction*/

++    int32_t luma_correction_on;

++

++} ia_pal_isp_ltm_cd_1_0_t;

++

++/*! \isp struct ltm_de_gamma_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enable for the filter*/

++    int32_t enable;

++    /*!< enable_decomp enabling the tone mapping*/

++    int32_t enable_decomp;

++    /*!< enable_gtm enabling the tone mapping*/

++    int32_t enable_gtm;

++    /*!< enable_df enabling the ltm*/

++    int32_t enable_df;

++    /*!< enable_gamma enabling the gamma*/

++    int32_t enable_gamma;

++    /*!< gamma_lut_base_level[8] base level for gamma lut*/

++    int32_t gamma_lut_base_level[8];

++    /*!< gamma_lut_step[8] step for gamma lut*/

++    int32_t gamma_lut_step[8];

++    /*!< gamma_lut_start_bin[8] start bin for gamma lut*/

++    int32_t gamma_lut_start_bin[8];

++    /*!< gamma_lut_size gamma lut size*/

++    int32_t gamma_lut_size;

++    /*!< gamma_lut_gen_lut[1537] generalized lut for gamma lut*/

++    int32_t gamma_lut_gen_lut[1537];

++    /*!< tm_lut_base_level[7] base level for  tone mapping lut*/

++    int32_t tm_lut_base_level[7];

++    /*!< tm_lut_start_bin[7] start bin for  tone mapping lut*/

++    int32_t tm_lut_start_bin[7];

++    /*!< tm_lut_size tone mapping lut size*/

++    int32_t tm_lut_size;

++    /*!< tm_lut_step[7] step size for generalized LUT*/

++    int32_t tm_lut_step[7];

++    /*!< tm_lut_gen_lut[2049] generalized lut for tone mapping lut. The lut is with the fixed point format 9.10*/

++    int32_t tm_lut_gen_lut[2049];

++    /*!< gtm_gain_shift shift for gain*/

++    int32_t gtm_gain_shift;

++    /*!< cu_decompand_x[13] cu_decompand_x*/

++    int32_t cu_decompand_x[13];

++    /*!< cu_decompand_y[12] cu_decompand_y*/

++    int32_t cu_decompand_y[12];

++    /*!< cu_decompand_slopes[12] cu_decompand_slopes*/

++    int32_t cu_decompand_slopes[12];

++    /*!< linear_pedestal Pedestal subtracted in linear domain*/

++    int32_t linear_pedestal;

++    /*!< use_pedestal If true, pedestal is used and the companded signal should be U15. If false, linear_pedestal should be 0*/

++    int32_t use_pedestal;

++

++} ia_pal_isp_ltm_de_gamma_1_0_t;

++

++/*! \isp struct ltm_fd_1_0

++Local Tone Maping Fine Detail Extruction

++*/

++typedef struct

++{

++    /*!< enable enabling the block. If enable == false, Output is zero*/

++    int32_t enable;

++    /*!< LTM_Power_4 Power gain for 1/4 band*/

++    int32_t LTM_Power_4;

++    /*!< LTM_Power_2 Power gain for 1/2 band*/

++    int32_t LTM_Power_2;

++    /*!< LTM_Power_1 Power gain for full band*/

++    int32_t LTM_Power_1;

++    /*!< cu_thr1_x[15] threshold for variance - x values*/

++    int32_t cu_thr1_x[15];

++    /*!< cu_thr1_y[14] threshold for variance - y values*/

++    int32_t cu_thr1_y[14];

++    /*!< cu_thr1_slopes[14] threshold for variance - slopes values*/

++    int32_t cu_thr1_slopes[14];

++    /*!< cu_thr2_x[15] threshold for variance - x values*/

++    int32_t cu_thr2_x[15];

++    /*!< cu_thr2_y[14] threshold for variance - y values*/

++    int32_t cu_thr2_y[14];

++    /*!< cu_thr2_slopes[14] threshold for variance - slopes values*/

++    int32_t cu_thr2_slopes[14];

++    /*!< cu_thr4_x[15] threshold for variance - x values*/

++    int32_t cu_thr4_x[15];

++    /*!< cu_thr4_y[14] threshold for variance - y values*/

++    int32_t cu_thr4_y[14];

++    /*!< cu_thr4_slopes[14] threshold for variance - slopes values*/

++    int32_t cu_thr4_slopes[14];

++    /*!< cu_sqrt_x[15] sqrt-x values*/

++    int32_t cu_sqrt_x[15];

++    /*!< cu_sqrt_y[14] sqrt-y values*/

++    int32_t cu_sqrt_y[14];

++    /*!< cu_sqrt_slopes[14] sqrt-slopes values*/

++    int32_t cu_sqrt_slopes[14];

++    /*!< cu_gtm_x[15] gtm-x values*/

++    int32_t cu_gtm_x[15];

++    /*!< cu_gtm_y[14] gtm-y values*/

++    int32_t cu_gtm_y[14];

++    /*!< cu_gtm_slopes[14] gtm-slopes values*/

++    int32_t cu_gtm_slopes[14];

++    /*!< gradual_saturation_on enable gradual saturaion*/

++    int32_t gradual_saturation_on;

++    /*!< luma_correction_on enable luma correction*/

++    int32_t luma_correction_on;

++    /*!< cu_norm_x[15] norm-x values*/

++    int32_t cu_norm_x[15];

++    /*!< cu_norm_y[14] norm-y values*/

++    int32_t cu_norm_y[14];

++    /*!< cu_norm_slopes[14] norm-slopes values*/

++    int32_t cu_norm_slopes[14];

++    /*!< frame_height frame height - only for HW needs*/

++    int32_t frame_height;

++    /*!< frame_width frame width - only for HW needs*/

++    int32_t frame_width;

++

++} ia_pal_isp_ltm_fd_1_0_t;

++

++/*! \isp struct ltm_vrt_ctrl

++

++*/

++typedef struct

++{

++    /*!< frame_height height of current frame*/

++    int32_t frame_height;

++    /*!< frame_width width of current frame*/

++    int32_t frame_width;

++

++} ia_pal_isp_ltm_vrt_ctrl_t;

++

++/*! \isp struct mas

++Motion artifact suppression ofr IMX185

++*/

++typedef struct

++{

++    /*!< gain_motion Threshold for MapMotion*/

++    int32_t gain_motion;

++    /*!< th_low_r Threshold for MapRange Rmin*/

++    int32_t th_low_r;

++    /*!< th_high_r Threshold for MapRange Gmax*/

++    int32_t th_high_r;

++    /*!< th_low_g Threshold for MapRange Gmin*/

++    int32_t th_low_g;

++    /*!< th_high_g Threshold for MapRange Gmax*/

++    int32_t th_high_g;

++    /*!< th_low_b Threshold for MapRange Bmin*/

++    int32_t th_low_b;

++    /*!< th_high_b Threshold for MapRange Bmax*/

++    int32_t th_high_b;

++    /*!< index_color Gain for MapColor*/

++    int32_t index_color;

++    /*!< offset_color Offset for MapColor*/

++    int32_t offset_color;

++    /*!< th_map Threshold for Map*/

++    int32_t th_map;

++    /*!< enable enable:1, bypass:0*/

++    int32_t enable;

++    /*!< frame_id first frame:0, second or after:1*/

++    int32_t frame_id;

++    /*!< flag_by Flag for color map. 0:magenta/green, 1:blue/yellow*/

++    int32_t flag_by;

++

++} ia_pal_isp_mas_t;

++

++/*! \isp struct mrc_1_0

++Motion refinement and compensation - standalone algorithm

++*/

++typedef struct

++{

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< reference_image_bittage bittage of reference input image*/

++    int32_t reference_image_bittage;

++    /*!< low_res_search_range_y low res search range - bottom*/

++    int32_t low_res_search_range_y;

++    /*!< low_res_search_range_x low res search range - left*/

++    int32_t low_res_search_range_x;

++    /*!< invalid_search_edge_y motion refinement range - bottom*/

++    int32_t invalid_search_edge_y;

++    /*!< invalid_search_edge_x motion refinement range - left*/

++    int32_t invalid_search_edge_x;

++    /*!< SAD_chroma_weight weight of chroma in SAD calculation*/

++    int32_t SAD_chroma_weight;

++    /*!< std_thr_flat confidenceSTD lower limit (dY below this value considered flat)*/

++    int32_t std_thr_flat;

++    /*!< std_thr_info confidenceSTD upper limit (dY above this value considered informative)*/

++    int32_t std_thr_info;

++    /*!< alpha_confidence bla bla*/

++    int32_t alpha_confidence;

++    /*!< center_motion_bias_LUT[18] bla bla*/

++    int32_t center_motion_bias_LUT[18];

++    /*!< neighbor_motion_bias_LUT[18] bla bla*/

++    int32_t neighbor_motion_bias_LUT[18];

++    /*!< full_res_center_bias_LUT[18] bla bla*/

++    int32_t full_res_center_bias_LUT[18];

++    /*!< full_res_neighbor_bias_LUT[18] bla bla*/

++    int32_t full_res_neighbor_bias_LUT[18];

++    /*!< motion_magnitude_low bla bla*/

++    int32_t motion_magnitude_low;

++    /*!< motion_magnitude_coeff bla bla*/

++    int32_t motion_magnitude_coeff;

++    /*!< motion_magnitude_platau bla bla*/

++    int32_t motion_magnitude_platau;

++    /*!< rad_sqr_prec_reduction Bit shift bumber to calculate index for nm_R_xcu*/

++    int32_t rad_sqr_prec_reduction;

++    /*!< ry_initial Opical center y coordinate in chroma resolution*/

++    int32_t ry_initial;

++    /*!< rx_initial Opical center x coordinate in chroma resolution*/

++    int32_t rx_initial;

++    /*!< nm_R_xcu[128] LUT for radial noise model*/

++    int32_t nm_R_xcu[128];

++    /*!< nm_Y_xcu[128] LUT for C noise model – Y dependency*/

++    int32_t nm_Y_xcu[128];

++    /*!< nm_C_xcu[128] LUT for C noise model – C dependency*/

++    int32_t nm_C_xcu[128];

++    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

++    int32_t nm_Y_log_est_min;

++    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

++    int32_t nm_Y_log_est_max;

++    /*!< nm_C_log_est_min Min value for log space C noise model*/

++    int32_t nm_C_log_est_min;

++    /*!< nm_C_log_est_max Max value for log space C noise model*/

++    int32_t nm_C_log_est_max;

++    /*!< nm_lut_frac Fractional bit for noise model LUT*/

++    int32_t nm_lut_frac;

++    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

++    int32_t nm_idx_frac;

++    /*!< nm_pow[64] LUT for power function*/

++    int32_t nm_pow[64];

++    /*!< nm_pow_frac Fractional bit for POW LUT*/

++    int32_t nm_pow_frac;

++    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

++    int32_t nm_shift_num;

++    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

++    int32_t nm_Y_alpha;

++    /*!< nm_C_alpha Scaling coefficient for C noise model*/

++    int32_t nm_C_alpha;

++    /*!< co_var_thres Variance threshold*/

++    int32_t co_var_thres;

++    /*!< co_var_gain Variance gain*/

++    int32_t co_var_gain;

++    /*!< alignment_control Control alignement confidence*/

++    int32_t alignment_control;

++    /*!< alignment_confidence_control Control alignement confidence*/

++    int32_t alignment_confidence_control;

++    /*!< min_normed_sad minimal normed y sad value*/

++    int32_t min_normed_sad;

++    /*!< max_normed_sad maximal normed y sad value*/

++    int32_t max_normed_sad;

++    /*!< min_normed_sad_c minimal normed c sad value*/

++    int32_t min_normed_sad_c;

++    /*!< max_normed_sad_c maximal normed c sad value*/

++    int32_t max_normed_sad_c;

++    /*!< input_bpp bit reduction in feedback loop*/

++    int32_t input_bpp;

++    /*!< output_bpp bit reduction in feedback loop*/

++    int32_t output_bpp;

++

++} ia_pal_isp_mrc_1_0_t;

++

++/*! \isp struct norm_lin_dss

++

++*/

++typedef struct

++{

++    /*!< lut[257] Normalization lut*/

++    int32_t lut[257];

++    /*!< lin_en Linearization enable*/

++    int32_t lin_en;

++    /*!< lshift The size of normalized shift (signed)*/

++    int32_t lshift;

++    /*!< bypass bypass*/

++    int32_t bypass;

++

++} ia_pal_isp_norm_lin_dss_t;

++

++/*! \isp struct nrf_6_00

++

++*/

++typedef struct

++{

++    /*!< Bypass iBypass*/

++    int32_t Bypass;

++    /*!< GNE_consistency_check iGNE consistency check*/

++    int32_t GNE_consistency_check;

++    /*!< GNE_luma_threshold_for_consistency_check iGNE luma threshold for consistency check*/

++    int32_t GNE_luma_threshold_for_consistency_check;

++    /*!< GNE_chroma_threshold_for_consistency_check iGNE chroma threshold for consistency check*/

++    int32_t GNE_chroma_threshold_for_consistency_check;

++    /*!< Block_Noise_Estimate_Edge_Threshold iBlock Noise Estimate Edge Threshold (u14)*/

++    int32_t Block_Noise_Estimate_Edge_Threshold;

++    /*!< Block_Noise_Estimate_Noise_Threshold iBlock Noise Estimate Noise Threshold (u14)*/

++    int32_t Block_Noise_Estimate_Noise_Threshold;

++    /*!< Eight_edge_Threshold iEight-edge Threshold (u16)*/

++    int32_t Eight_edge_Threshold;

++    /*!< Valid_Pixel_Range iValid Pixel Range (u12)*/

++    int32_t Valid_Pixel_Range;

++    /*!< Small_Sobel_Threshold iSmall Sobel Threshold (u14)*/

++    int32_t Small_Sobel_Threshold;

++    /*!< Large_Sobel_Threshold iLarge Sobel Threshold (u14)*/

++    int32_t Large_Sobel_Threshold;

++    /*!< Number_of_Large_Sobel_Threshold iNumber of Large Sobel Threshold (u6)*/

++    int32_t Number_of_Large_Sobel_Threshold;

++    /*!< Number_of_Mediam_Sobel_Threshold iNumber of Mediam Sobel Threshold (u6)*/

++    int32_t Number_of_Mediam_Sobel_Threshold;

++    /*!< Number_of_Small_Sobel_Threshold iNumber of Small Sobel Threshold (u6)*/

++    int32_t Number_of_Small_Sobel_Threshold;

++    /*!< Block_Sigma_Diff_Threshold iBlock Sigma Diff Threshold (u14)*/

++    int32_t Block_Sigma_Diff_Threshold;

++    /*!< Max_Sobel_Threshold iMax Sobel Threshold (u14)*/

++    int32_t Max_Sobel_Threshold;

++    /*!< Denoise_Maximum_History iDenoise Maximum History (u8)*/

++    int32_t Denoise_Maximum_History;

++    /*!< Denoise_History_Increase iDenoise History Increase (u4)*/

++    int32_t Denoise_History_Increase;

++    /*!< Denoise_Moving_Pixel_Threshold iDenoise Moving Pixel Threshold (u5)*/

++    int32_t Denoise_Moving_Pixel_Threshold;

++    /*!< Denoise_Threshold_for_Sum_of_Complexity_Measure iDenoise Threshold for Sum of Complexity Measure (u12)*/

++    int32_t Denoise_Threshold_for_Sum_of_Complexity_Measure;

++    /*!< Denoise_ASD_Threshold iDenoise ASD Threshold (u12)*/

++    int32_t Denoise_ASD_Threshold;

++    /*!< Progressive_DN iProgressive DN (0, 1)*/

++    int32_t Progressive_DN;

++    /*!< Initial_Denoise_History iInitial Denoise History (u6)*/

++    int32_t Initial_Denoise_History;

++    /*!< Denoise_STAD_Threshold iDenoise STAD Threshold (u15)*/

++    int32_t Denoise_STAD_Threshold;

++    /*!< Temporal_Difference_Threshold iTemporal Difference Threshold (u12)*/

++    int32_t Temporal_Difference_Threshold;

++    /*!< Low_Temporal_Difference_Threshold iLow Temporal Difference Threshold (u12)*/

++    int32_t Low_Temporal_Difference_Threshold;

++    /*!< Chroma_Denoise_Enable iChroma Denoise Enable*/

++    int32_t Chroma_Denoise_Enable;

++    /*!< Chroma_Denoise_Moving_Pixel_Threshold iChroma Denoise Moving Pixel Threshold (u5)*/

++    int32_t Chroma_Denoise_Moving_Pixel_Threshold;

++    /*!< Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure iChroma Denoise Threshold for Sum of Complexity Measure (u12)*/

++    int32_t Chroma_Denoise_Threshold_for_Sum_of_Complexity_Measure;

++    /*!< Chroma_Denoise_ASD_Threshold iChroma Denoise ASD Threshold (u12)*/

++    int32_t Chroma_Denoise_ASD_Threshold;

++    /*!< Chroma_Denoise_Temporal_Difference_Threshold iChroma Denoise Temporal Difference Threshold (u12)*/

++    int32_t Chroma_Denoise_Temporal_Difference_Threshold;

++    /*!< Chroma_Low_Temporal_Difference_Threshold iChroma Low Temporal Difference Threshold (u12)*/

++    int32_t Chroma_Low_Temporal_Difference_Threshold;

++    /*!< Chroma_Denoise_STAD_Threshold iChroma Denoise STAD Threshold (u15)*/

++    int32_t Chroma_Denoise_STAD_Threshold;

++    /*!< Low_Noise_Level iLow Noise Level*/

++    int32_t Low_Noise_Level;

++    /*!< Strong_Noise_Level iStrong Noise Level*/

++    int32_t Strong_Noise_Level;

++    /*!< DnY_prt0 iDnY_prt0 (RangeThreshold 0, u13)*/

++    int32_t DnY_prt0;

++    /*!< DnY_prt1 iDnY_prt1 (RangeThreshold 1, u13)*/

++    int32_t DnY_prt1;

++    /*!< DnY_prt2 iDnY_prt2 (RangeThreshold 2, u13)*/

++    int32_t DnY_prt2;

++    /*!< DnY_prt3 iDnY_prt3 (RangeThreshold 3, u13)*/

++    int32_t DnY_prt3;

++    /*!< DnY_prt4 iDnY_prt4 (RangeThreshold 4, u13)*/

++    int32_t DnY_prt4;

++    /*!< DnY_prt5 iDnY_prt5 (RangeThreshold 5, u13)*/

++    int32_t DnY_prt5;

++    /*!< DnY_Wr0 iDnY_Wr0 (RangeWgt0, u5)*/

++    int32_t DnY_Wr0;

++    /*!< DnY_Wr1 iDnY_Wr1 (RangeWgt1, u5)*/

++    int32_t DnY_Wr1;

++    /*!< DnY_Wr2 iDnY_Wr2 (RangeWgt2, u5)*/

++    int32_t DnY_Wr2;

++    /*!< DnY_Wr3 iDnY_Wr3 (RangeWgt3, u5)*/

++    int32_t DnY_Wr3;

++    /*!< DnY_Wr4 iDnY_Wr4 (RangeWgt4, u5)*/

++    int32_t DnY_Wr4;

++    /*!< DnY_Wr5 iDnY_Wr5 (RangeWgt5, u5)*/

++    int32_t DnY_Wr5;

++    /*!< DnY_wd00 iDnY_wd00 (DistWeight[0][0], u5)*/

++    int32_t DnY_wd00;

++    /*!< DnY_wd01 iDnY_wd01 (DistWeight[0][1], u5)*/

++    int32_t DnY_wd01;

++    /*!< DnY_wd02 iDnY_wd02 (DistWeight[0][2], u5)*/

++    int32_t DnY_wd02;

++    /*!< DnY_wd10 iDnY_wd10 (DistWeight[1][0], u5)*/

++    int32_t DnY_wd10;

++    /*!< DnY_wd11 iDnY_wd11 (DistWeight[1][1], u5)*/

++    int32_t DnY_wd11;

++    /*!< DnY_wd12 iDnY_wd12 (DistWeight[1][2], u5)*/

++    int32_t DnY_wd12;

++    /*!< DnY_wd20 iDnY_wd20 (DistWeight[2][0], u5)*/

++    int32_t DnY_wd20;

++    /*!< DnY_wd21 iDnY_wd21 (DistWeight[2][1], u5)*/

++    int32_t DnY_wd21;

++    /*!< DnY_wd22 iDnY_wd22 (DistWeight[2][2], u5)*/

++    int32_t DnY_wd22;

++    /*!< DnY_dyn_thmin iDnY_dyn_thmin (Min Dynamic Threshold, u13)*/

++    int32_t DnY_dyn_thmin;

++    /*!< DnY_thmin iDnY_thmin (Min Threshold Value for luma, u13)*/

++    int32_t DnY_thmin;

++    /*!< DnY_thmax iDnY_thmax (Max Threshold Value for luma, u13)*/

++    int32_t DnY_thmax;

++    /*!< DnU_prt0 iDnU_prt0 (U RangeThreshold 0, u13)*/

++    int32_t DnU_prt0;

++    /*!< DnU_prt1 iDnU_prt1 (U RangeThreshold 1, u13)*/

++    int32_t DnU_prt1;

++    /*!< DnU_prt2 iDnU_prt2 (U RangeThreshold 2, u13)*/

++    int32_t DnU_prt2;

++    /*!< DnU_prt3 iDnU_prt3 (U RangeThreshold 3, u13)*/

++    int32_t DnU_prt3;

++    /*!< DnU_prt4 iDnU_prt4 (U RangeThreshold 4, u13)*/

++    int32_t DnU_prt4;

++    /*!< DnU_prt5 iDnU_prt5 (U RangeThreshold 5, u13)*/

++    int32_t DnU_prt5;

++    /*!< DnU_Wr0 iDnU_Wr0 (U RangeWgt0, u5)*/

++    int32_t DnU_Wr0;

++    /*!< DnU_Wr1 iDnU_Wr1 (U RangeWgt1, u5)*/

++    int32_t DnU_Wr1;

++    /*!< DnU_Wr2 iDnU_Wr2 (U RangeWgt2, u5)*/

++    int32_t DnU_Wr2;

++    /*!< DnU_Wr3 iDnU_Wr3 (U RangeWgt3, u5)*/

++    int32_t DnU_Wr3;

++    /*!< DnU_Wr4 iDnU_Wr4 (U RangeWgt4, u5)*/

++    int32_t DnU_Wr4;

++    /*!< DnU_Wr5 iDnU_Wr5 (U RangeWgt5, u5)*/

++    int32_t DnU_Wr5;

++    /*!< DnU_wd00 iDnU_wd00 (U DistWeight[0][0], u5)*/

++    int32_t DnU_wd00;

++    /*!< DnU_wd01 iDnU_wd01 (U DistWeight[0][1], u5)*/

++    int32_t DnU_wd01;

++    /*!< DnU_wd02 iDnU_wd02 (U DistWeight[0][2], u5)*/

++    int32_t DnU_wd02;

++    /*!< DnU_wd10 iDnU_wd10 (U DistWeight[1][0], u5)*/

++    int32_t DnU_wd10;

++    /*!< DnU_wd11 iDnU_wd11 (U DistWeight[1][1], u5)*/

++    int32_t DnU_wd11;

++    /*!< DnU_wd12 iDnU_wd12 (U DistWeight[1][2], u5)*/

++    int32_t DnU_wd12;

++    /*!< DnU_wd20 iDnU_wd20 (U DistWeight[2][0], u5)*/

++    int32_t DnU_wd20;

++    /*!< DnU_wd21 iDnU_wd21 (U DistWeight[2][1], u5)*/

++    int32_t DnU_wd21;

++    /*!< DnU_wd22 iDnU_wd22 (U DistWeight[2][2], u5)*/

++    int32_t DnU_wd22;

++    /*!< DnU_dyn_thmin iDnU_dyn_thmin (U Min Dynamic Threshold, u13)*/

++    int32_t DnU_dyn_thmin;

++    /*!< DnU_thmin iDnU_thmin (Min Threshold Value for U, u13)*/

++    int32_t DnU_thmin;

++    /*!< DnU_thmax iDnU_thmax (Max Threshold Value for U, u13)*/

++    int32_t DnU_thmax;

++    /*!< DnV_prt0 iDnV_prt0 (V RangeThreshold 0, u13)*/

++    int32_t DnV_prt0;

++    /*!< DnV_prt1 iDnV_prt1 (V RangeThreshold 1, u13)*/

++    int32_t DnV_prt1;

++    /*!< DnV_prt2 iDnV_prt2 (V RangeThreshold 2, u13)*/

++    int32_t DnV_prt2;

++    /*!< DnV_prt3 iDnV_prt3 (V RangeThreshold 3, u13)*/

++    int32_t DnV_prt3;

++    /*!< DnV_prt4 iDnV_prt4 (V RangeThreshold 4, u13)*/

++    int32_t DnV_prt4;

++    /*!< DnV_prt5 iDnV_prt5 (V RangeThreshold 5, u13)*/

++    int32_t DnV_prt5;

++    /*!< DnV_Wr0 iDnV_Wr0 (V RangeWgt0, u5)*/

++    int32_t DnV_Wr0;

++    /*!< DnV_Wr1 iDnV_Wr1 (V RangeWgt1, u5)*/

++    int32_t DnV_Wr1;

++    /*!< DnV_Wr2 iDnV_Wr2 (V RangeWgt2, u5)*/

++    int32_t DnV_Wr2;

++    /*!< DnV_Wr3 iDnV_Wr3 (V RangeWgt3, u5)*/

++    int32_t DnV_Wr3;

++    /*!< DnV_Wr4 iDnV_Wr4 (V RangeWgt4, u5)*/

++    int32_t DnV_Wr4;

++    /*!< DnV_Wr5 iDnV_Wr5 (V RangeWgt5, u5)*/

++    int32_t DnV_Wr5;

++    /*!< DnV_wd00 iDnV_wd00 (V DistWeight[0][0], u5)*/

++    int32_t DnV_wd00;

++    /*!< DnV_wd01 iDnV_wd01 (V DistWeight[0][1], u5)*/

++    int32_t DnV_wd01;

++    /*!< DnV_wd02 iDnV_wd02 (V DistWeight[0][2], u5)*/

++    int32_t DnV_wd02;

++    /*!< DnV_wd10 iDnV_wd10 (V DistWeight[1][0], u5)*/

++    int32_t DnV_wd10;

++    /*!< DnV_wd11 iDnV_wd11 (V DistWeight[1][1], u5)*/

++    int32_t DnV_wd11;

++    /*!< DnV_wd12 iDnV_wd12 (V DistWeight[1][2], u5)*/

++    int32_t DnV_wd12;

++    /*!< DnV_wd20 iDnV_wd20 (V DistWeight[2][0], u5)*/

++    int32_t DnV_wd20;

++    /*!< DnV_wd21 iDnV_wd21 (V DistWeight[2][1], u5)*/

++    int32_t DnV_wd21;

++    /*!< DnV_wd22 iDnV_wd22 (V DistWeight[2][2], u5)*/

++    int32_t DnV_wd22;

++    /*!< DnV_dyn_thmin iDnV_dyn_thmin (V Min Dynamic Threshold, u13)*/

++    int32_t DnV_dyn_thmin;

++    /*!< DnV_thmin iDnV_thmin (Min Threshold Value for V, u13)*/

++    int32_t DnV_thmin;

++    /*!< DnV_thmax iDnV_thmax (Max Threshold Value for V, u13)*/

++    int32_t DnV_thmax;

++    /*!< Y_RangeThr_Adp2NLvl iY RangeThr Adp2NLvl {0/1}*/

++    int32_t Y_RangeThr_Adp2NLvl;

++    /*!< Y_RangeThr_Adp2NLvl_Min iY RangeThr Adp2NLvl Min*/

++    int32_t Y_RangeThr_Adp2NLvl_Min;

++    /*!< Y_RangeThr_Adp2NLvl_Max iY RangeThr Adp2NLvl Max*/

++    int32_t Y_RangeThr_Adp2NLvl_Max;

++    /*!< Y_RangeThrNLvlMaxIncr0 iY RangeThrNLvlMaxIncr0*/

++    int32_t Y_RangeThrNLvlMaxIncr0;

++    /*!< Y_RangeThrNLvlMaxIncr1 iY RangeThrNLvlMaxIncr1*/

++    int32_t Y_RangeThrNLvlMaxIncr1;

++    /*!< Y_RangeThrNLvlMaxIncr2 iY RangeThrNLvlMaxIncr2*/

++    int32_t Y_RangeThrNLvlMaxIncr2;

++    /*!< Y_RangeThrNLvlMaxIncr3 iY RangeThrNLvlMaxIncr3*/

++    int32_t Y_RangeThrNLvlMaxIncr3;

++    /*!< Y_RangeThrNLvlMaxIncr4 iY RangeThrNLvlMaxIncr4*/

++    int32_t Y_RangeThrNLvlMaxIncr4;

++    /*!< Y_RangeThrNLvlMaxIncr5 iY RangeThrNLvlMaxIncr5*/

++    int32_t Y_RangeThrNLvlMaxIncr5;

++    /*!< U_RangeThr_Adp2NLvl iU RangeThr Adp2NLvl {0/1}*/

++    int32_t U_RangeThr_Adp2NLvl;

++    /*!< U_RangeThr_Adp2NLvl_Min iU RangeThr Adp2NLvl Min*/

++    int32_t U_RangeThr_Adp2NLvl_Min;

++    /*!< U_RangeThr_Adp2NLvl_Max iU RangeThr Adp2NLvl Max*/

++    int32_t U_RangeThr_Adp2NLvl_Max;

++    /*!< U_RangeThrNLvlMaxIncr0 iU RangeThrNLvlMaxIncr0*/

++    int32_t U_RangeThrNLvlMaxIncr0;

++    /*!< U_RangeThrNLvlMaxIncr1 iU RangeThrNLvlMaxIncr1*/

++    int32_t U_RangeThrNLvlMaxIncr1;

++    /*!< U_RangeThrNLvlMaxIncr2 iU RangeThrNLvlMaxIncr2*/

++    int32_t U_RangeThrNLvlMaxIncr2;

++    /*!< U_RangeThrNLvlMaxIncr3 iU RangeThrNLvlMaxIncr3*/

++    int32_t U_RangeThrNLvlMaxIncr3;

++    /*!< U_RangeThrNLvlMaxIncr4 iU RangeThrNLvlMaxIncr4*/

++    int32_t U_RangeThrNLvlMaxIncr4;

++    /*!< U_RangeThrNLvlMaxIncr5 iU RangeThrNLvlMaxIncr5*/

++    int32_t U_RangeThrNLvlMaxIncr5;

++    /*!< V_RangeThr_Adp2NLvl iV RangeThr Adp2NLvl {0/1}*/

++    int32_t V_RangeThr_Adp2NLvl;

++    /*!< V_RangeThr_Adp2NLvl_Min iV RangeThr Adp2NLvl Min*/

++    int32_t V_RangeThr_Adp2NLvl_Min;

++    /*!< V_RangeThr_Adp2NLvl_Max iV RangeThr Adp2NLvl Max*/

++    int32_t V_RangeThr_Adp2NLvl_Max;

++    /*!< V_RangeThrNLvlMaxIncr0 iV RangeThrNLvlMaxIncr0*/

++    int32_t V_RangeThrNLvlMaxIncr0;

++    /*!< V_RangeThrNLvlMaxIncr1 iV RangeThrNLvlMaxIncr1*/

++    int32_t V_RangeThrNLvlMaxIncr1;

++    /*!< V_RangeThrNLvlMaxIncr2 iV RangeThrNLvlMaxIncr2*/

++    int32_t V_RangeThrNLvlMaxIncr2;

++    /*!< V_RangeThrNLvlMaxIncr3 iV RangeThrNLvlMaxIncr3*/

++    int32_t V_RangeThrNLvlMaxIncr3;

++    /*!< V_RangeThrNLvlMaxIncr4 iV RangeThrNLvlMaxIncr4*/

++    int32_t V_RangeThrNLvlMaxIncr4;

++    /*!< V_RangeThrNLvlMaxIncr5 iV RangeThrNLvlMaxIncr5*/

++    int32_t V_RangeThrNLvlMaxIncr5;

++    /*!< Hot_Pixel_Enable iHot Pixel Enable (0,1)*/

++    int32_t Hot_Pixel_Enable;

++    /*!< Hot_Pixel_Y_Threshold iHot Pixel Y Threshold (u8)*/

++    int32_t Hot_Pixel_Y_Threshold;

++    /*!< Hot_Pixel_Y_Count iHot Pixel Y Count (u4)*/

++    int32_t Hot_Pixel_Y_Count;

++    /*!< Hot_Pixel_U_Threshold iHot Pixel U Threshold (u8)*/

++    int32_t Hot_Pixel_U_Threshold;

++    /*!< Hot_Pixel_U_Count iHot Pixel U Count (u4)*/

++    int32_t Hot_Pixel_U_Count;

++    /*!< Hot_Pixel_V_Threshold iHot Pixel V Threshold (u8)*/

++    int32_t Hot_Pixel_V_Threshold;

++    /*!< Hot_Pixel_V_Count iHot Pixel V Count (u4)*/

++    int32_t Hot_Pixel_V_Count;

++    /*!< Validation_mode iValidation mode*/

++    int32_t Validation_mode;

++    /*!< Block_Width iBlock Width*/

++    int32_t Block_Width;

++    /*!< Block_Height iBlock Height*/

++    int32_t Block_Height;

++    /*!< Block_Size iBlock Size*/

++    int32_t Block_Size;

++    /*!< Chroma_Denoise_Block_Size_H iChroma Denoise Block Size H*/

++    int32_t Chroma_Denoise_Block_Size_H;

++    /*!< Chroma_Denoise_Block_Size_V iChroma Denoise Block Size V*/

++    int32_t Chroma_Denoise_Block_Size_V;

++    /*!< Bayer_input_for_capture_pipe iBayer input for capture pipe*/

++    int32_t Bayer_input_for_capture_pipe;

++    /*!< RGB_input iRGB input*/

++    int32_t RGB_input;

++    /*!< Right_Edge iRight Edge*/

++    int32_t Right_Edge;

++    /*!< Left_Edge iLeft Edge*/

++    int32_t Left_Edge;

++    /*!< PADDING_X_MARGIN_LEFT iPADDING X_MARGIN_LEFT*/

++    int32_t PADDING_X_MARGIN_LEFT;

++    /*!< PADDING_X_MARGIN_RIGHT iPADDING X_MARGIN_RIGHT*/

++    int32_t PADDING_X_MARGIN_RIGHT;

++    /*!< PADDING_Y_MARGIN_TOP iPADDING Y_MARGIN_TOP*/

++    int32_t PADDING_Y_MARGIN_TOP;

++    /*!< PADDING_Y_MARGIN_BOTTOM iPADDING Y_MARGIN_BOTTOM*/

++    int32_t PADDING_Y_MARGIN_BOTTOM;

++    /*!< Bayer_Partial_Column_Padding iBayer Partial Column Padding*/

++    int32_t Bayer_Partial_Column_Padding;

++    /*!< Bayer_Partial_Row_Padding iBayer Partial Row Padding*/

++    int32_t Bayer_Partial_Row_Padding;

++    /*!< Enable_CUI_Manual_Bar iEnable CUI Manual Bar*/

++    int32_t Enable_CUI_Manual_Bar;

++    /*!< CUI_Strength_Value iCUI Strength Value[0 - 64]*/

++    int32_t CUI_Strength_Value;

++    /*!< Monochrome_Support_Force_Zero_UV_OUTPUT iMonochrome Support : Force Zero UV OUTPUT*/

++    int32_t Monochrome_Support_Force_Zero_UV_OUTPUT;

++    /*!< Only_enable_spatial_denoise iOnly enable spatial denoise*/

++    int32_t Only_enable_spatial_denoise;

++    /*!< Treat_frame_as_first_frame_for_still_image_sequence iTreat frame as first frame for still image sequence*/

++    int32_t Treat_frame_as_first_frame_for_still_image_sequence;

++    /*!< Fulsim_Output_Bit_Precision iFulsim Output Bit Precision*/

++    int32_t Fulsim_Output_Bit_Precision;

++

++} ia_pal_isp_nrf_6_00_t;

++

++/*! \isp struct nv12reader

++

++*/

++typedef struct

++{

++    /*!< im_width input image width*/

++    int32_t im_width;

++    /*!< im_height input image height*/

++    int32_t im_height;

++    /*!< input_bpp input image bpp*/

++    int32_t input_bpp;

++    /*!< output_bpp output image bpp*/

++    int32_t output_bpp;

++    /*!< input_pixel_container input pixel container (in bits)*/

++    int32_t input_pixel_container;

++

++} ia_pal_isp_nv12reader_t;

++

++/*! \isp struct nv12writer

++

++*/

++typedef struct

++{

++    /*!< output_bpp output image bpp*/

++    int32_t output_bpp;

++    /*!< input_pixel_container input pixel container (in bits)*/

++    int32_t input_pixel_container;

++

++} ia_pal_isp_nv12writer_t;

++

++/*! \isp struct ofa_1_dp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_dp;

++    /*!< pack_mode_dp pack mode for packer*/

++    int32_t pack_mode_dp;

++    /*!< enable_flip_dp bypass flip*/

++    int32_t enable_flip_dp;

++    /*!< enable_mirror_dp bypass mirror*/

++    int32_t enable_mirror_dp;

++    /*!< enable_reduced_range_dp bypass reduced range*/

++    int32_t enable_reduced_range_dp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_dp display pin is active*/

++    int32_t enable_dp;

++

++} ia_pal_isp_ofa_1_dp_t;

++

++/*! \isp struct ofa_1_mp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_mp;

++    /*!< pack_mode_mp pack mode for packer*/

++    int32_t pack_mode_mp;

++    /*!< enable_flip_mp bypass flip*/

++    int32_t enable_flip_mp;

++    /*!< enable_mirror_mp bypass mirror*/

++    int32_t enable_mirror_mp;

++    /*!< enable_reduced_range_mp bypass reduced range*/

++    int32_t enable_reduced_range_mp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_mp main pin is active*/

++    int32_t enable_mp;

++

++} ia_pal_isp_ofa_1_mp_t;

++

++/*! \isp struct ofa_1_ppp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_ppp;

++    /*!< pack_mode_ppp pack mode for packer*/

++    int32_t pack_mode_ppp;

++    /*!< enable_flip_ppp bypass flip*/

++    int32_t enable_flip_ppp;

++    /*!< enable_mirror_ppp bypass mirror*/

++    int32_t enable_mirror_ppp;

++    /*!< enable_reduced_range_ppp bypass reduced range*/

++    int32_t enable_reduced_range_ppp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_ppp post proc. Pin is active*/

++    int32_t enable_ppp;

++

++} ia_pal_isp_ofa_1_ppp_t;

++

++/*! \isp struct ofa_2_dp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_dp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_dp;

++    /*!< input_bpp_dp input bpp parameter for OFA*/

++    int32_t input_bpp_dp;

++    /*!< pack_mode_dp pack mode for packer*/

++    int32_t pack_mode_dp;

++    /*!< enable_flip_dp bypass flip*/

++    int32_t enable_flip_dp;

++    /*!< enable_mirror_dp bypass mirror*/

++    int32_t enable_mirror_dp;

++    /*!< enable_reduced_range_dp bypass reduced range*/

++    int32_t enable_reduced_range_dp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_dp display pin is active*/

++    int32_t enable_dp;

++    /*!< input_left_crop_pixels_dp left pixels to crop*/

++    int32_t input_left_crop_pixels_dp;

++    /*!< input_top_crop_pixels_dp top pixels to crop*/

++    int32_t input_top_crop_pixels_dp;

++    /*!< output_height_dp output height after padding*/

++    int32_t output_height_dp;

++    /*!< output_width_dp output width after padding*/

++    int32_t output_width_dp;

++

++} ia_pal_isp_ofa_2_dp_t;

++

++/*! \isp struct ofa_2_mp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_mp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_mp;

++    /*!< input_bpp_mp input bpp parameter for OFA*/

++    int32_t input_bpp_mp;

++    /*!< pack_mode_mp pack mode for packer*/

++    int32_t pack_mode_mp;

++    /*!< enable_flip_mp bypass flip*/

++    int32_t enable_flip_mp;

++    /*!< enable_mirror_mp bypass mirror*/

++    int32_t enable_mirror_mp;

++    /*!< enable_reduced_range_mp bypass reduced range*/

++    int32_t enable_reduced_range_mp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_mp main pin is active*/

++    int32_t enable_mp;

++    /*!< input_left_crop_pixels_mp left pixels to crop*/

++    int32_t input_left_crop_pixels_mp;

++    /*!< input_top_crop_pixels_mp top pixels to crop*/

++    int32_t input_top_crop_pixels_mp;

++    /*!< output_height_mp output height after padding*/

++    int32_t output_height_mp;

++    /*!< output_width_mp output width after padding*/

++    int32_t output_width_mp;

++

++} ia_pal_isp_ofa_2_mp_t;

++

++/*! \isp struct ofa_2_ppp

++Output Fornatting Accelerator

++*/

++typedef struct

++{

++    /*!< y_tiling_ppp tiling parameter for NV12 y_tiled format*/

++    int32_t y_tiling_ppp;

++    /*!< input_bpp_ppp input bpp parameter for OFA*/

++    int32_t input_bpp_ppp;

++    /*!< pack_mode_ppp pack mode for packer*/

++    int32_t pack_mode_ppp;

++    /*!< enable_flip_ppp bypass flip*/

++    int32_t enable_flip_ppp;

++    /*!< enable_mirror_ppp bypass mirror*/

++    int32_t enable_mirror_ppp;

++    /*!< enable_reduced_range_ppp bypass reduced range*/

++    int32_t enable_reduced_range_ppp;

++    /*!< p_e_0 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_0;

++    /*!< p_e_1 Multiplication parameters for pixel with even vertical index*/

++    int32_t p_e_1;

++    /*!< p_o_0 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_0;

++    /*!< p_o_1 Multiplication parameters for pixel with odd vertical index*/

++    int32_t p_o_1;

++    /*!< enable_ppp post proc. Pin is active*/

++    int32_t enable_ppp;

++    /*!< input_left_crop_pixels_ppp left pixels to crop*/

++    int32_t input_left_crop_pixels_ppp;

++    /*!< input_top_crop_pixels_ppp top pixels to crop*/

++    int32_t input_top_crop_pixels_ppp;

++    /*!< output_height_pp output height after padding*/

++    int32_t output_height_pp;

++    /*!< output_width_pp output width after padding*/

++    int32_t output_width_pp;

++

++} ia_pal_isp_ofa_2_ppp_t;

++

++/*! \isp struct outputscaler_2_0

++

++*/

++typedef struct

++{

++    /*!< enable enable scaling filter*/

++    int32_t enable;

++    /*!< scaling_ratio U5.16 , downscale - greater than 1*/

++    int32_t scaling_ratio;

++    /*!< horizontal_offset_luma S13.16,Position of first output pixel luma channel for scaler*/

++    int32_t horizontal_offset_luma;

++    /*!< vertical_offset_luma S13.16, Position of first output line luma channel for scaler*/

++    int32_t vertical_offset_luma;

++    /*!< horizontal_offset_chroma S13.16, Position of first output pixel chroma channel for scaler*/

++    int32_t horizontal_offset_chroma;

++    /*!< vertical_offset_chroma S13.16, Position of first output line chroma channel for scaler*/

++    int32_t vertical_offset_chroma;

++    /*!< output_height U13.0, Height of output image Y plane for scaler (even)*/

++    int32_t output_height;

++    /*!< output_width U13.0, Width of output image Y plane for scaler (even)*/

++    int32_t output_width;

++    /*!< kernel_LUT[129] S1.10 Y channel Interpolation vertical kernel coefficients for scaler*/

++    int32_t kernel_LUT[129];

++    /*!< chroma_kernel_LUT[129] S1.10 UV channel Interpolation vertical kernel coefficients for scaler*/

++    int32_t chroma_kernel_LUT[129];

++

++} ia_pal_isp_outputscaler_2_0_t;

++

++/*! \isp struct packer_isa_bayer_a

++Bayer Planar output formatter

++*/

++typedef struct

++{

++    /*!< format Output format: 0 - Bayer planar, 1 - Bayer packed*/

++    int32_t format;

++

++} ia_pal_isp_packer_isa_bayer_a_t;

++

++/*! \isp struct packer_isa_yuv_a

++NV12 output formatter

++*/

++typedef struct

++{

++    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

++    int32_t format;

++

++} ia_pal_isp_packer_isa_yuv_a_t;

++

++/*! \isp struct packer_isa_yuv_b

++NV12 output formatter

++*/

++typedef struct

++{

++    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

++    int32_t format;

++

++} ia_pal_isp_packer_isa_yuv_b_t;

++

++/*! \isp struct packer_isa_yuv_c

++NV12 output formatter

++*/

++typedef struct

++{

++    /*!< format Output format: 0 - I420, 1 - NV12, 2 - NV21, 3 - P010MSB, 4 - P016MSB*/

++    int32_t format;

++

++} ia_pal_isp_packer_isa_yuv_c_t;

++

++/*! \isp struct padder_bayer_a

++

++*/

++typedef struct

++{

++    /*!< Padder_en 0- disable filter. 1- enable filter.*/

++    int32_t Padder_en;

++    /*!< sol_pad Left side padding quad number.*/

++    int32_t sol_pad;

++    /*!< eol_pad Right side padding quad number.*/

++    int32_t eol_pad;

++    /*!< Frame_width The width of the frame in number of quads.*/

++    int32_t Frame_width;

++    /*!< Strm_format 0- YUV. 1- Bayer.*/

++    int32_t Strm_format;

++

++} ia_pal_isp_padder_bayer_a_t;

++

++/*! \isp struct padder_yuv_a

++

++*/

++typedef struct

++{

++    /*!< Padder_en 0- disable filter. 1- enable filter.*/

++    int32_t Padder_en;

++    /*!< sol_pad Left side padding quad number.*/

++    int32_t sol_pad;

++    /*!< eol_pad Right side padding quad number.*/

++    int32_t eol_pad;

++    /*!< Frame_width The width of the frame in number of quads.*/

++    int32_t Frame_width;

++    /*!< Strm_format 0- YUV. 1- Bayer.*/

++    int32_t Strm_format;

++

++} ia_pal_isp_padder_yuv_a_t;

++

++/*! \isp struct padder_yuv_b

++

++*/

++typedef struct

++{

++    /*!< Padder_en 0- disable filter. 1- enable filter.*/

++    int32_t Padder_en;

++    /*!< sol_pad Left side padding quad number.*/

++    int32_t sol_pad;

++    /*!< eol_pad Right side padding quad number.*/

++    int32_t eol_pad;

++    /*!< Frame_width The width of the frame in number of quads.*/

++    int32_t Frame_width;

++    /*!< Strm_format 0- YUV. 1- Bayer.*/

++    int32_t Strm_format;

++

++} ia_pal_isp_padder_yuv_b_t;

++

++/*! \isp struct padder_yuv_c

++

++*/

++typedef struct

++{

++    /*!< Padder_en 0- disable filter. 1- enable filter.*/

++    int32_t Padder_en;

++    /*!< sol_pad Left side padding quad number.*/

++    int32_t sol_pad;

++    /*!< eol_pad Right side padding quad number.*/

++    int32_t eol_pad;

++    /*!< Frame_width The width of the frame in number of quads.*/

++    int32_t Frame_width;

++    /*!< Strm_format 0- YUV. 1- Bayer.*/

++    int32_t Strm_format;

++

++} ia_pal_isp_padder_yuv_c_t;

++

++/*! \isp struct pafstatistics_1

++PAF Statistics

++*/

++typedef struct

++{

++    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

++    int32_t paf_en;

++    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

++    int32_t paf_frame_width;

++    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

++    int32_t paf_frame_height;

++    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

++    int32_t skip_horizontal_start;

++    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

++    int32_t skip_vertical_start;

++    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

++    int32_t block_width;

++    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

++    int32_t block_height;

++    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

++    int32_t accum_horizontal;

++    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

++    int32_t skip_horizontal;

++    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

++    int32_t accum_vertical;

++    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

++    int32_t skip_vertical;

++    /*!< min_shift minimum evaluation shift in steps*/

++    int32_t min_shift;

++    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

++    int32_t shift_steps;

++    /*!< paf_shift_step_size phase evaluation step size in pixels*/

++    int32_t paf_shift_step_size;

++    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

++    int32_t paf_shifter;

++    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

++    int32_t split_accross_multiple_lines;

++    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

++    int32_t pixels_per_line;

++    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/

++    int32_t input_modes;

++    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

++    int32_t input_bpp;

++    /*!< int_prec internal precision of PAF pixels*/

++    int32_t int_prec;

++    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/

++    int32_t paf_blacklevel;

++    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/

++    int32_t shading_coeff_l[192];

++    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/

++    int32_t shading_coeff_r[192];

++    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/

++    int32_t paf_abs_shifter;

++

++} ia_pal_isp_pafstatistics_1_t;

++

++/*! \isp struct pafstatistics_1_1

++PAF Statistics

++*/

++typedef struct

++{

++    /*!< paf_en 0: FF will not write to the PAF  array; 1: FF will write*/

++    int32_t paf_en;

++    /*!< paf_frame_width width of PAF frame (in PAF pixels)*/

++    int32_t paf_frame_width;

++    /*!< paf_frame_height height of PAF frame (in PAF lines)*/

++    int32_t paf_frame_height;

++    /*!< skip_horizontal_start number of skipped PAF pixel pairs at the start of each line pair*/

++    int32_t skip_horizontal_start;

++    /*!< skip_vertical_start number of skipped PAF line pairs at the start of the frame*/

++    int32_t skip_vertical_start;

++    /*!< block_width number of PAF pixel pairs per block in horizontal direction*/

++    int32_t block_width;

++    /*!< block_height number of PAF pixel pairs per block in vertical direction*/

++    int32_t block_height;

++    /*!< accum_horizontal number of consecutive PAF pixel pairs accumulated in horizontal direction*/

++    int32_t accum_horizontal;

++    /*!< skip_horizontal number of PAF pixel pairs skipped between accumulated pixel pairs in horizontal direction*/

++    int32_t skip_horizontal;

++    /*!< accum_vertical number of consecutive PAF pixel pairs accumulated in vertical direction*/

++    int32_t accum_vertical;

++    /*!< skip_vertical number of PAF line pairs skipped between accumulated pixel pairs in vertical direction*/

++    int32_t skip_vertical;

++    /*!< min_shift minimum evaluation shift in steps*/

++    int32_t min_shift;

++    /*!< shift_steps number of evaluation points, starting from m_paf_min_shift*/

++    int32_t shift_steps;

++    /*!< paf_shift_step_size phase evaluation step size in pixels*/

++    int32_t paf_shift_step_size;

++    /*!< paf_shifter configured so that the accumulated phase difference fits in the output register*/

++    int32_t paf_shifter;

++    /*!< split_accross_multiple_lines 0: SOP = SOL, EOP = EOL; 1: SOF determined by the reset, EOL determined by pixels per line*/

++    int32_t split_accross_multiple_lines;

++    /*!< pixels_per_line number of pixels per line; pixels_per_line <= paf_frame_width*/

++    int32_t pixels_per_line;

++    /*!< input_modes 0: RRRR+LLLL; 1: LLLL+RRRR; 2: RLRL; 3: LRLR; 4: RRRR+LLLL_ALT; 5: LLLL+RRRR_ALT; 6: RLRL_ALT; 7: LRLR_ALT*/

++    int32_t input_modes;

++    /*!< input_bpp 0: 8 bits; 1: 10 bits; 2: 12 bits; 3: 14 bits; 4: 16 bits*/

++    int32_t input_bpp;

++    /*!< int_prec internal precision of PAF pixels*/

++    int32_t int_prec;

++    /*!< paf_blacklevel Black level to be subtracted from raw PDAF pixel values*/

++    int32_t paf_blacklevel;

++    /*!< shading_coeff_l[192] Shading correction coefficients for L PDAF values (arrangement is the same as PDAF grid: 16x12)*/

++    int32_t shading_coeff_l[192];

++    /*!< shading_coeff_r[192] Shading correction coefficients for R PDAF values (arrangement is the same as PDAF grid: 16x12)*/

++    int32_t shading_coeff_r[192];

++    /*!< paf_abs_shifter Bit right shift after abs-operation, to compensate for the shading gains*/

++    int32_t paf_abs_shifter;

++

++} ia_pal_isp_pafstatistics_1_1_t;

++

++/*! \isp struct pext_1_0

++

++*/

++typedef struct

++{

++    /*!< paf_output_mode 0)disables, do not pass anything\n 1) first line sent to memset0 second\n line sent to memset1\n 2)first line sent to memset0 second to memset 1 and afterward alternate every two lines 3) passthrough –send to memset0 everything*/

++    int32_t paf_output_mode;

++    /*!< swapping1stbc Apply swapping of BC inputs for 1st/3rd/etc.\n0: no swapping\n1: swap B/C inputs*/

++    int32_t swapping1stbc;

++    /*!< swapping1stcd Apply swapping of CD inputs for 1st/3rd/etc.\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping1stcd;

++    /*!< swapping2ndbc Apply swapping of BC inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap A/B inputs*/

++    int32_t swapping2ndbc;

++    /*!< swapping2ndcd Apply swapping of CD inputs for 2nd/4th/etc. lines\n0: no swapping\n1: swap C/D inputs*/

++    int32_t swapping2ndcd;

++    /*!< pdaf_width Width in units of PDAF pixels. After Width pixels – Pext knows there is a new line coming in. In Modes1..3 – max line length is as in the internal buffer size which is 1024 pixels.*/

++    int32_t pdaf_width;

++    /*!< pdaf_height Height in units of pdaf lines*/

++    int32_t pdaf_height;

++    /*!< drop_pattern[32] Drop pattern for AF pixels. 1=drop the lines\n0=use the line*/

++    int32_t drop_pattern[32];

++    /*!< drop_period Period of the drop pattern*/

++    int32_t drop_period;

++

++} ia_pal_isp_pext_1_0_t;

++

++/*! \isp struct pix_crop_ir_md

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for IR MD output*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pix_crop_ir_md_t;

++

++/*! \isp struct pixcomp_1_0

++Input system pixel compression

++*/

++typedef struct

++{

++    /*!< pixcomp_enable Enable PixComp*/

++    int32_t pixcomp_enable;

++    /*!< glu_base_level[6] GLU base level offset*/

++    int32_t glu_base_level[6];

++    /*!< glu_step[6] GLU step amount per stage*/

++    int32_t glu_step[6];

++    /*!< glu_start_bin[6] GLU stage start offset in LUT*/

++    int32_t glu_start_bin[6];

++    /*!< glu_gen_lut_size Utilized LUT size*/

++    int32_t glu_gen_lut_size;

++    /*!< glu_gen_lut[128] LUT samples*/

++    int32_t glu_gen_lut[128];

++

++} ia_pal_isp_pixcomp_1_0_t;

++

++/*! \isp struct pixelformatter

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++    /*!< m_ColRemoval col removal- for setting bayer pattern*/

++    int32_t m_ColRemoval;

++    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_xstart;

++    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_ystart;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++

++} ia_pal_isp_pixelformatter_t;

++

++/*! \isp struct pixelformatter_b

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++    /*!< m_ColRemoval col removal- for setting bayer pattern*/

++    int32_t m_ColRemoval;

++    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_xstart;

++    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_ystart;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++

++} ia_pal_isp_pixelformatter_b_t;

++

++/*! \isp struct pixelformatter_c

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass     {0,1}*/

++    int32_t m_bypass;

++    /*!< m_ColRemoval col removal- for setting bayer pattern*/

++    int32_t m_ColRemoval;

++    /*!< m_xstart Horizontal Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_xstart;

++    /*!< m_ystart Vertical   Starting Pixel. FIXME: Put correct max and default values*/

++    int32_t m_ystart;

++    /*!< m_xsize Horizontal Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_xsize;

++    /*!< m_ysize Vertical   Frame Size. FIXME: Put correct max and default values*/

++    int32_t m_ysize;

++

++} ia_pal_isp_pixelformatter_c_t;

++

++/*! \isp struct pixprecadapter_post_sis

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_pixprecadapter_post_sis_t;

++

++/*! \isp struct pixprecadapter_s2v_c

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_pixprecadapter_s2v_c_t;

++

++/*! \isp struct pixprecadapter_v2s_4

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_pixprecadapter_v2s_4_t;

++

++/*! \isp struct pme_1_0

++PME for 'standalone TNR6'

++*/

++typedef struct

++{

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< frame_height frame height*/

++    int32_t frame_height;

++    /*!< frame_width frame width*/

++    int32_t frame_width;

++    /*!< search_range_y search range - bottom*/

++    int32_t search_range_y;

++    /*!< search_range_x search range - left*/

++    int32_t search_range_x;

++    /*!< dest_block_size_max_y[4] maximal block size - vertical*/

++    int32_t dest_block_size_max_y[4];

++    /*!< dest_block_size_max_x maximal block size - horizontal*/

++    int32_t dest_block_size_max_x;

++    /*!< iy_dest_image_min the first row of the destination image available in the DDR buffer*/

++    int32_t iy_dest_image_min;

++    /*!< ix_dest_image_min the first column of the destination image available in the DDR buffer*/

++    int32_t ix_dest_image_min;

++    /*!< homography_matrix_0[4] homography base->destination; elements 1,2,4,5 [S2.20]*/

++    int32_t homography_matrix_0[4];

++    /*!< homography_matrix_1[2] homography base->destination; elements 7, 8 [S0.31, only 25 LSBs used]*/

++    int32_t homography_matrix_1[2];

++    /*!< homography_matrix_2[3] homography base->destination; elements 3, 6, 9 [S15.16]*/

++    int32_t homography_matrix_2[3];

++    /*!< homography_confidence the confidence of the homography model*/

++    int32_t homography_confidence;

++    /*!< no_motion_confidence the confidence of the no-motion model*/

++    int32_t no_motion_confidence;

++    /*!< motion_complexity[2176] bypass*/

++    int32_t motion_complexity[2176];

++    /*!< motion_complexity_bin_exp_y motion-complexity read configuration*/

++    int32_t motion_complexity_bin_exp_y;

++

++} ia_pal_isp_pme_1_0_t;

++

++/*! \isp struct pxl_crop_bayer_a

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for bayer output A*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_bayer_a_t;

++

++/*! \isp struct pxl_crop_psa

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for bayer output A*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_psa_t;

++

++/*! \isp struct pxl_crop_sis_a

++

++*/

++typedef struct

++{

++    /*!< enable Enable post SIS Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_sis_a_t;

++

++/*! \isp struct pxl_crop_sis_b

++

++*/

++typedef struct

++{

++    /*!< enable Enable post SIS Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_sis_b_t;

++

++/*! \isp struct pxl_crop_yuv_a

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for YUV output A*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_yuv_a_t;

++

++/*! \isp struct pxl_crop_yuv_b

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for YUV output B*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_yuv_b_t;

++

++/*! \isp struct pxl_crop_yuv_c

++

++*/

++typedef struct

++{

++    /*!< enable Enable Crop for YUV output C*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_pxl_crop_yuv_c_t;

++

++/*! \isp struct rgb_ir_2_0

++RGB-IR

++*/

++typedef struct

++{

++    /*!< Bypass Bypass (0,1)*/

++    int32_t Bypass;

++    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

++    int32_t CFArgbir[16];

++    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

++    int32_t CFAbayer[4];

++    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

++    int32_t SensorDim[2];

++    /*!< ImageDim[2] Image dimensions (height,width)*/

++    int32_t ImageDim[2];

++    /*!< IRimageDim[2] IR image dimensions (height,width)*/

++    int32_t IRimageDim[2];

++    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

++    int32_t IRtype;

++    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

++    int32_t IRrefloc;

++    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights11[25];

++    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights12[25];

++    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights13[25];

++    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights14[25];

++    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights21[25];

++    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights22[25];

++    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights23[25];

++    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights24[25];

++    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights31[25];

++    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights32[25];

++    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights33[25];

++    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights34[25];

++    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights41[25];

++    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights42[25];

++    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights43[25];

++    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights44[25];

++    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

++    int32_t LumaWeightSums[16];

++    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors11[8];

++    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors12[8];

++    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors13[8];

++    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors14[8];

++    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors21[8];

++    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors22[8];

++    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors23[8];

++    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors24[8];

++    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors31[8];

++    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors32[8];

++    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors33[8];

++    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors34[8];

++    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors41[8];

++    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors42[8];

++    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors43[8];

++    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors44[8];

++    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestLuma;

++    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestWeights;

++    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

++    int32_t IRspatialOffset[2];

++    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

++    int32_t IRbinningFactor[2];

++    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

++    int32_t IRcormode;

++    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

++    int32_t IRmodelSigma[3];

++    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

++    int32_t IRmodelOffset[3];

++    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

++    int32_t IRmodelHeight[3];

++    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

++    int32_t IRmodelWidth[3];

++    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

++    int32_t IRmodelMax[3];

++    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

++    int32_t IRmodelCUxR[12];

++    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

++    int32_t IRmodelCUaR[11];

++    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

++    int32_t IRmodelCUbR[11];

++    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

++    int32_t IRmodelCUxG[12];

++    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

++    int32_t IRmodelCUaG[11];

++    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

++    int32_t IRmodelCUbG[11];

++    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

++    int32_t IRmodelCUxB[12];

++    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

++    int32_t IRmodelCUaB[11];

++    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

++    int32_t IRmodelCUbB[11];

++    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

++    int32_t IRinterpNeighbors11[12];

++    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

++    int32_t IRinterpNeighbors12[12];

++    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

++    int32_t IRinterpNeighbors13[12];

++    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

++    int32_t IRinterpNeighbors14[12];

++    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

++    int32_t IRinterpNeighbors21[12];

++    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

++    int32_t IRinterpNeighbors22[12];

++    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

++    int32_t IRinterpNeighbors23[12];

++    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

++    int32_t IRinterpNeighbors24[12];

++    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

++    int32_t IRinterpNeighbors31[12];

++    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

++    int32_t IRinterpNeighbors32[12];

++    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

++    int32_t IRinterpNeighbors33[12];

++    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

++    int32_t IRinterpNeighbors34[12];

++    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

++    int32_t IRinterpNeighbors41[12];

++    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

++    int32_t IRinterpNeighbors42[12];

++    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

++    int32_t IRinterpNeighbors43[12];

++    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

++    int32_t IRinterpNeighbors44[12];

++    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

++    int32_t IRscaledSensorDim[2];

++    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

++    int32_t IRscaledModelSigma[3];

++

++} ia_pal_isp_rgb_ir_2_0_t;

++

++/*! \isp struct rgb_ir_2_1

++RGB-IR

++*/

++typedef struct

++{

++    /*!< Bypass Bypass (0,1)*/

++    int32_t Bypass;

++    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

++    int32_t CFArgbir[16];

++    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

++    int32_t CFAbayer[4];

++    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

++    int32_t SensorDim[2];

++    /*!< ImageDim[2] Image dimensions (height,width)*/

++    int32_t ImageDim[2];

++    /*!< IRimageDim[2] IR image dimensions (height,width)*/

++    int32_t IRimageDim[2];

++    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

++    int32_t IRtype;

++    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

++    int32_t IRrefloc;

++    /*!< LumaWeights11[25] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights11[25];

++    /*!< LumaWeights12[25] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights12[25];

++    /*!< LumaWeights13[25] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights13[25];

++    /*!< LumaWeights14[25] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights14[25];

++    /*!< LumaWeights21[25] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights21[25];

++    /*!< LumaWeights22[25] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights22[25];

++    /*!< LumaWeights23[25] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights23[25];

++    /*!< LumaWeights24[25] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights24[25];

++    /*!< LumaWeights31[25] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights31[25];

++    /*!< LumaWeights32[25] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights32[25];

++    /*!< LumaWeights33[25] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights33[25];

++    /*!< LumaWeights34[25] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights34[25];

++    /*!< LumaWeights41[25] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights41[25];

++    /*!< LumaWeights42[25] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights42[25];

++    /*!< LumaWeights43[25] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights43[25];

++    /*!< LumaWeights44[25] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights44[25];

++    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

++    int32_t LumaWeightSums[16];

++    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors11[8];

++    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors12[8];

++    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors13[8];

++    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors14[8];

++    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors21[8];

++    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors22[8];

++    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors23[8];

++    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors24[8];

++    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors31[8];

++    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors32[8];

++    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors33[8];

++    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors34[8];

++    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors41[8];

++    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors42[8];

++    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors43[8];

++    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors44[8];

++    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestLuma;

++    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestWeights;

++    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

++    int32_t IRspatialOffset[2];

++    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

++    int32_t IRbinningFactor[2];

++    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

++    int32_t IRcormode;

++    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

++    int32_t IRmodelSigma[3];

++    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

++    int32_t IRmodelOffset[3];

++    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

++    int32_t IRmodelHeight[3];

++    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

++    int32_t IRmodelWidth[3];

++    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

++    int32_t IRmodelMax[3];

++    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

++    int32_t IRmodelCUxR[12];

++    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

++    int32_t IRmodelCUaR[11];

++    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

++    int32_t IRmodelCUbR[11];

++    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

++    int32_t IRmodelCUxG[12];

++    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

++    int32_t IRmodelCUaG[11];

++    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

++    int32_t IRmodelCUbG[11];

++    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

++    int32_t IRmodelCUxB[12];

++    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

++    int32_t IRmodelCUaB[11];

++    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

++    int32_t IRmodelCUbB[11];

++    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

++    int32_t IRinterpNeighbors11[12];

++    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

++    int32_t IRinterpNeighbors12[12];

++    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

++    int32_t IRinterpNeighbors13[12];

++    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

++    int32_t IRinterpNeighbors14[12];

++    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

++    int32_t IRinterpNeighbors21[12];

++    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

++    int32_t IRinterpNeighbors22[12];

++    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

++    int32_t IRinterpNeighbors23[12];

++    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

++    int32_t IRinterpNeighbors24[12];

++    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

++    int32_t IRinterpNeighbors31[12];

++    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

++    int32_t IRinterpNeighbors32[12];

++    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

++    int32_t IRinterpNeighbors33[12];

++    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

++    int32_t IRinterpNeighbors34[12];

++    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

++    int32_t IRinterpNeighbors41[12];

++    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

++    int32_t IRinterpNeighbors42[12];

++    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

++    int32_t IRinterpNeighbors43[12];

++    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

++    int32_t IRinterpNeighbors44[12];

++    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

++    int32_t IRscaledSensorDim[2];

++    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

++    int32_t IRscaledModelSigma[3];

++    /*!< NormLinLshift NormLin lshift*/

++    int32_t NormLinLshift;

++    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/

++    int32_t BL[16];

++    /*!< DPCmode DPC mode (0: disable, 1: enable)*/

++    int32_t DPCmode;

++    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/

++    int32_t DPCneighbors11[16];

++    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/

++    int32_t DPCneighbors12[16];

++    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/

++    int32_t DPCneighbors13[16];

++    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/

++    int32_t DPCneighbors14[16];

++    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/

++    int32_t DPCneighbors21[16];

++    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/

++    int32_t DPCneighbors22[16];

++    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/

++    int32_t DPCneighbors23[16];

++    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/

++    int32_t DPCneighbors24[16];

++    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/

++    int32_t DPCneighbors31[16];

++    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/

++    int32_t DPCneighbors32[16];

++    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/

++    int32_t DPCneighbors33[16];

++    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/

++    int32_t DPCneighbors34[16];

++    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/

++    int32_t DPCneighbors41[16];

++    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/

++    int32_t DPCneighbors42[16];

++    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/

++    int32_t DPCneighbors43[16];

++    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/

++    int32_t DPCneighbors44[16];

++    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/

++    int32_t DPCnoiseModel[2];

++    /*!< DPCnorm[5] DPC normalization*/

++    int32_t DPCnorm[5];

++    /*!< IRblocksize_log2 log2 of IR Block size*/

++    int32_t IRblocksize_log2;

++    /*!< IRgridX IR grid width*/

++    int32_t IRgridX;

++    /*!< IRgridY IR grid height*/

++    int32_t IRgridY;

++    /*!< IRweightsR[170] IR weights (R channel)*/

++    int32_t IRweightsR[170];

++    /*!< IRweightsG[170] IR weights (G channel)*/

++    int32_t IRweightsG[170];

++    /*!< IRweightsB[170] IR weights (B channel)*/

++    int32_t IRweightsB[170];

++

++} ia_pal_isp_rgb_ir_2_1_t;

++

++/*! \isp struct rgb_ir_2_1_bbb

++RGB-IR_BBB Filter

++*/

++typedef struct

++{

++    /*!< Bypass Bypass (0,1)*/

++    int32_t Bypass;

++    /*!< CFArgbir[16] RGB-IR CFA descriptor for 4x4 repetitive pattern (0: R, 1: G, 2: B, 3: IR)*/

++    int32_t CFArgbir[16];

++    /*!< CFAbayer[4] Bayer CFA descriptor for 2x2 repetitive pattern (0: R, 1: G, 2: B)*/

++    int32_t CFAbayer[4];

++    /*!< SensorDim[2] Sensor dimensions (height,width) for IR contamination correction (optical center calculation)*/

++    int32_t SensorDim[2];

++    /*!< ImageDim[2] Image dimensions (height,width)*/

++    int32_t ImageDim[2];

++    /*!< IRimageDim[2] IR image dimensions (height,width)*/

++    int32_t IRimageDim[2];

++    /*!< IRtype Type of IR pixel layout (2: IRtype2, 1: IRtype1, 0: any other supported, -1: unsupported)*/

++    int32_t IRtype;

++    /*!< IRrefloc Pixel location corresponding to the reference (first) IR pixel within a 4x4 repetitive pattern*/

++    int32_t IRrefloc;

++    /*!< LumaWeights11[9] Filter mask for luminance calculations in CFA locations 11; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights11[9];

++    /*!< LumaWeights12[9] Filter mask for luminance calculations in CFA locations 12; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights12[9];

++    /*!< LumaWeights13[9] Filter mask for luminance calculations in CFA locations 13; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights13[9];

++    /*!< LumaWeights14[9] Filter mask for luminance calculations in CFA locations 14; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights14[9];

++    /*!< LumaWeights21[9] Filter mask for luminance calculations in CFA locations 21; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights21[9];

++    /*!< LumaWeights22[9] Filter mask for luminance calculations in CFA locations 22; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights22[9];

++    /*!< LumaWeights23[9] Filter mask for luminance calculations in CFA locations 23; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights23[9];

++    /*!< LumaWeights24[9] Filter mask for luminance calculations in CFA locations 24; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights24[9];

++    /*!< LumaWeights31[9] Filter mask for luminance calculations in CFA locations 31; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights31[9];

++    /*!< LumaWeights32[9] Filter mask for luminance calculations in CFA locations 32; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights32[9];

++    /*!< LumaWeights33[9] Filter mask for luminance calculations in CFA locations 33; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights33[9];

++    /*!< LumaWeights34[9] Filter mask for luminance calculations in CFA locations 34; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights34[9];

++    /*!< LumaWeights41[9] Filter mask for luminance calculations in CFA locations 41; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights41[9];

++    /*!< LumaWeights42[9] Filter mask for luminance calculations in CFA locations 42; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights42[9];

++    /*!< LumaWeights43[9] Filter mask for luminance calculations in CFA locations 43; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights43[9];

++    /*!< LumaWeights44[9] Filter mask for luminance calculations in CFA locations 44; both the mask coefficients and their sum should be power of two values. A negative value excludes the corresponding sample from consideration.*/

++    int32_t LumaWeights44[9];

++    /*!< LumaWeightSums[16] Right bit shifts equivalent to the sum of the luminance filter mask coefficients for all 16 channels (11,12,44) within 4x4 repetitive pattern.*/

++    int32_t LumaWeightSums[16];

++    /*!< BayerRestNeighbors11[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 11; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors11[8];

++    /*!< BayerRestNeighbors12[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 12; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors12[8];

++    /*!< BayerRestNeighbors13[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations ; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors13[8];

++    /*!< BayerRestNeighbors14[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 14; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors14[8];

++    /*!< BayerRestNeighbors21[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 21; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors21[8];

++    /*!< BayerRestNeighbors22[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 22; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors22[8];

++    /*!< BayerRestNeighbors23[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 23; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors23[8];

++    /*!< BayerRestNeighbors24[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 24; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors24[8];

++    /*!< BayerRestNeighbors31[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 31; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors31[8];

++    /*!< BayerRestNeighbors32[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 32; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors32[8];

++    /*!< BayerRestNeighbors33[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 33; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors33[8];

++    /*!< BayerRestNeighbors34[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 34; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors34[8];

++    /*!< BayerRestNeighbors41[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 41; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors41[8];

++    /*!< BayerRestNeighbors42[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 42; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors42[8];

++    /*!< BayerRestNeighbors43[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 43; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors43[8];

++    /*!< BayerRestNeighbors44[8] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) of up-to-four neighboring pixels chosen for restoration in CFA locations 44; (y=0,x=0) excludes the corresponding sample from consideration by setting its weight to 0*/

++    int32_t BayerRestNeighbors44[8];

++    /*!< BayerRestLuma Disable the use of the luminance in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestLuma;

++    /*!< BayerRestWeights Disable the use of the weights in Bayer CFA restoration (0: disable, 1: enable)*/

++    int32_t BayerRestWeights;

++    /*!< IRspatialOffset[2] Spatial shift (y,x) of pixel locations for IR contamination correction*/

++    int32_t IRspatialOffset[2];

++    /*!< IRbinningFactor[2] Binning factors (y,x) for IR contamination correction*/

++    int32_t IRbinningFactor[2];

++    /*!< IRcormode IR contamination correction mode (0: disable, 1: enable)*/

++    int32_t IRcormode;

++    /*!< IRmodelSigma[3] IR contamination model sigma (R,G,B)*/

++    int32_t IRmodelSigma[3];

++    /*!< IRmodelOffset[3] IR contamination model offset (R,G,B)*/

++    int32_t IRmodelOffset[3];

++    /*!< IRmodelHeight[3] IR contamination model height (R,G,B)*/

++    int32_t IRmodelHeight[3];

++    /*!< IRmodelWidth[3] IR contamination model width (R,G,B)*/

++    int32_t IRmodelWidth[3];

++    /*!< IRmodelMax[3] IR contamination model maximum (R,G,B)*/

++    int32_t IRmodelMax[3];

++    /*!< IRmodelCUxR[12] IR contamination model configuration unit parameter set X for R channel*/

++    int32_t IRmodelCUxR[12];

++    /*!< IRmodelCUaR[11] IR contamination model configuration unit parameter set A for R channel*/

++    int32_t IRmodelCUaR[11];

++    /*!< IRmodelCUbR[11] IR contamination model configuration unit parameter set B for R channel*/

++    int32_t IRmodelCUbR[11];

++    /*!< IRmodelCUxG[12] IR contamination model configuration unit parameter set X for G channel*/

++    int32_t IRmodelCUxG[12];

++    /*!< IRmodelCUaG[11] IR contamination model configuration unit parameter set A for G channel*/

++    int32_t IRmodelCUaG[11];

++    /*!< IRmodelCUbG[11] IR contamination model configuration unit parameter set B for G channel*/

++    int32_t IRmodelCUbG[11];

++    /*!< IRmodelCUxB[12] IR contamination model configuration unit parameter set X for B channel*/

++    int32_t IRmodelCUxB[12];

++    /*!< IRmodelCUaB[11] IR contamination model configuration unit parameter set A for B channel*/

++    int32_t IRmodelCUaB[11];

++    /*!< IRmodelCUbB[11] IR contamination model configuration unit parameter set B for B channel*/

++    int32_t IRmodelCUbB[11];

++    /*!< IRinterpNeighbors11[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 11*/

++    int32_t IRinterpNeighbors11[12];

++    /*!< IRinterpNeighbors12[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 12*/

++    int32_t IRinterpNeighbors12[12];

++    /*!< IRinterpNeighbors13[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 13*/

++    int32_t IRinterpNeighbors13[12];

++    /*!< IRinterpNeighbors14[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 14*/

++    int32_t IRinterpNeighbors14[12];

++    /*!< IRinterpNeighbors21[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 21*/

++    int32_t IRinterpNeighbors21[12];

++    /*!< IRinterpNeighbors22[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 22*/

++    int32_t IRinterpNeighbors22[12];

++    /*!< IRinterpNeighbors23[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 23*/

++    int32_t IRinterpNeighbors23[12];

++    /*!< IRinterpNeighbors24[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 24*/

++    int32_t IRinterpNeighbors24[12];

++    /*!< IRinterpNeighbors31[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 31*/

++    int32_t IRinterpNeighbors31[12];

++    /*!< IRinterpNeighbors32[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 32*/

++    int32_t IRinterpNeighbors32[12];

++    /*!< IRinterpNeighbors33[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 33*/

++    int32_t IRinterpNeighbors33[12];

++    /*!< IRinterpNeighbors34[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 34*/

++    int32_t IRinterpNeighbors34[12];

++    /*!< IRinterpNeighbors41[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 41*/

++    int32_t IRinterpNeighbors41[12];

++    /*!< IRinterpNeighbors42[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 42*/

++    int32_t IRinterpNeighbors42[12];

++    /*!< IRinterpNeighbors43[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 43*/

++    int32_t IRinterpNeighbors43[12];

++    /*!< IRinterpNeighbors44[12] Spatial offsets (y1,x1,y2,x2,y3,x3,y4,x4) and corresponding weights (w1,w2,w3,w4) of four neighboring pixels for IR interpolation in CFA locations 44*/

++    int32_t IRinterpNeighbors44[12];

++    /*!< IRscaledSensorDim[2] Scaled sensor dimensions (height,width) for IR contamination correction (optical center calculation); (1 << SHVAL)/SensorDim, for SHVAL = 24. Maximum value assumes that sensor dimensions are larger than 256*/

++    int32_t IRscaledSensorDim[2];

++    /*!< IRscaledModelSigma[3] Scaled IR contamination model sigma (R,G,B); (1 << SMVAL)/IRmodelSigma, for SMVAL = 16*/

++    int32_t IRscaledModelSigma[3];

++    /*!< NormLinLshift NormLin lshift*/

++    int32_t NormLinLshift;

++    /*!< BL[16] Black level values for 4x4 CFA repetitive pattern*/

++    int32_t BL[16];

++    /*!< DPCmode DPC mode (0: disable, 1: enable)*/

++    int32_t DPCmode;

++    /*!< DPCneighbors11[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 11*/

++    int32_t DPCneighbors11[16];

++    /*!< DPCneighbors12[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 12*/

++    int32_t DPCneighbors12[16];

++    /*!< DPCneighbors13[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 13*/

++    int32_t DPCneighbors13[16];

++    /*!< DPCneighbors14[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 14*/

++    int32_t DPCneighbors14[16];

++    /*!< DPCneighbors21[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 21*/

++    int32_t DPCneighbors21[16];

++    /*!< DPCneighbors22[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 22*/

++    int32_t DPCneighbors22[16];

++    /*!< DPCneighbors23[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 23*/

++    int32_t DPCneighbors23[16];

++    /*!< DPCneighbors24[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 24*/

++    int32_t DPCneighbors24[16];

++    /*!< DPCneighbors31[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 31*/

++    int32_t DPCneighbors31[16];

++    /*!< DPCneighbors32[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 32*/

++    int32_t DPCneighbors32[16];

++    /*!< DPCneighbors33[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 33*/

++    int32_t DPCneighbors33[16];

++    /*!< DPCneighbors34[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 34*/

++    int32_t DPCneighbors34[16];

++    /*!< DPCneighbors41[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 41*/

++    int32_t DPCneighbors41[16];

++    /*!< DPCneighbors42[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 42*/

++    int32_t DPCneighbors42[16];

++    /*!< DPCneighbors43[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 43*/

++    int32_t DPCneighbors43[16];

++    /*!< DPCneighbors44[16] Spatial offsets (y1,x1,y2,x2,...,y8,x8) of eight neighboring pixels for DPC in CFA locations 44*/

++    int32_t DPCneighbors44[16];

++    /*!< DPCnoiseModel[2] Noise model {a,b} with offset term a and linear term b to calculate noise variance as a+(b*x)>>8*/

++    int32_t DPCnoiseModel[2];

++    /*!< IRbinningH Horizontal binning IR output (0 no-binning, 1 2x horizontal binning)*/

++    int32_t IRbinningH;

++    /*!< IRbinningV Vertical binning IR output (0 no-binning, 1 2x vertical binning)*/

++    int32_t IRbinningV;

++    /*!< OutputMode Output Mode (0 bayer, 1 ir)*/

++    int32_t OutputMode;

++    /*!< block_dim Block_dimension (WxH). Log2 block dimension of each grid cell (8x8,16x16,32x32,64x64,128x128, 256x256)*/

++    int32_t block_dim;

++    /*!< awb_en Enable IR AWB statistics output (0 disable, 1 enable)*/

++    int32_t awb_en;

++    /*!< shftr_val Shift right average value. Derived from log2 number of pixels in a cell). Note: 1) RGB_IR_2_1 AWB works internally with U11 input. 2) Val will be clipped to U15 after shift*/

++    int32_t shftr_val;

++    /*!< shftr_sat Shift right saturation. Represents log2(num of pixels in cell). Note: Sat value will be clipped to U8 after shift.*/

++    int32_t shftr_sat;

++    /*!< rgbs_thr Threshold value for IR saturation calculation. Note: RGB_IR_2_1 AWB works internally with U11 input, so limit max value to (1<<11)-1'))*/

++    int32_t rgbs_thr;

++    /*!< DPCnorm[5] DPC normalization*/

++    int32_t DPCnorm[5];

++    /*!< IRblocksize_log2 log2 of IR Block size*/

++    int32_t IRblocksize_log2;

++    /*!< IRgridX IR grid width*/

++    int32_t IRgridX;

++    /*!< IRgridY IR grid height*/

++    int32_t IRgridY;

++    /*!< IRweightsR[170] IR weights (R channel)*/

++    int32_t IRweightsR[170];

++    /*!< IRweightsG[170] IR weights (G channel)*/

++    int32_t IRweightsG[170];

++    /*!< IRweightsB[170] IR weights (B channel)*/

++    int32_t IRweightsB[170];

++

++} ia_pal_isp_rgb_ir_2_1_bbb_t;

++

++/*! \isp struct rgbs_grid_1_0

++RGBS grid (AWB statistics)

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

++    int32_t block_height;

++    /*!< min_out_bytes_per_cell Minimum bytes per grid cell in output buffer (pad with '0's in MSB side if not met otherwise)*/

++    int32_t min_out_bytes_per_cell;

++    /*!< rgbs_en 0: FF will not write to the RGBS array; 1: FF will write*/

++    int32_t rgbs_en;

++    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

++    int32_t rgbs_incl_sat;

++    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

++    int32_t rgbs_thr_cx[8];

++    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

++    int32_t shftr_val_cx[8];

++    /*!< shftr_sat represents log2(num of pixels in cell)*/

++    int32_t shftr_sat;

++    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

++    int32_t output_packed;

++    /*!< copy_out_components bit0: copy_enable_colorid0, bit1..3: copy_src_colorid, bit4: copy_enable_colorid1, bit5..7: copy_src_colorid, ... , bit28: copy_enable_colorid7, bit29..31: copy_src_colorid*/

++    uint32_t copy_out_components;

++

++} ia_pal_isp_rgbs_grid_1_0_t;

++

++/*! \isp struct rgbs_statistics_1_0

++

++*/

++typedef struct

++{

++    /*!< grid_width represents number of horizontal grid cells*/

++    int32_t grid_width;

++    /*!< grid_height represents number of vertical grid cells*/

++    int32_t grid_height;

++    /*!< block_width Log2 the width of each grid cell (8,16,32,64,128)*/

++    int32_t block_width;

++    /*!< block_height Log2 the height of each grid cell (8,16,32,64,128)*/

++    int32_t block_height;

++    /*!< grid_height_per_slice # of blocks in vert.axis per Meta-Data Slice (grid_height_per_slice * grid_width <= 192)*/

++    int32_t grid_height_per_slice;

++    /*!< awb_en 0: FF will not write to the AWB  array; 1: FF will write*/

++    int32_t awb_en;

++    /*!< rgbs_incl_sat 0: do not include saturated quads in the average; 1: include saturated quads in the average*/

++    int32_t rgbs_incl_sat;

++    /*!< x_start X top left corner of the grid. 0 <= x_start <= (frame_width - 1)*/

++    int32_t x_start;

++    /*!< y_start Y top left corner of the grid. 0 <= y_start <= (frame_height - 1)*/

++    int32_t y_start;

++    /*!< x_end X bottom right corner of the grid. x_end = x_start + (grid_width << block_width) - 1*/

++    int32_t x_end;

++    /*!< y_end Y bottom right corner of the grid. y_end = y_start + (grid_height << block_height) - 1*/

++    int32_t y_end;

++    /*!< sensor_mode 0: 1x1 CFA (array sensor); 1: 2 x 2 CFA; 2: 4 x 4 CFA*/

++    int32_t sensor_mode;

++    /*!< pat_00 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_00;

++    /*!< pat_01 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_01;

++    /*!< pat_02 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_02;

++    /*!< pat_03 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_03;

++    /*!< pat_10 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_10;

++    /*!< pat_11 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_11;

++    /*!< pat_12 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_12;

++    /*!< pat_13 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_13;

++    /*!< pat_20 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_20;

++    /*!< pat_21 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_21;

++    /*!< pat_22 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_22;

++    /*!< pat_23 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_23;

++    /*!< pat_30 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_30;

++    /*!< pat_31 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_31;

++    /*!< pat_32 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_32;

++    /*!< pat_33 defines the color ID of the pixel in the CFA pattern; Pat_ij: i - row, j - column*/

++    int32_t pat_33;

++    /*!< rgbs_thr_cx[8] RGBS threshold value (C0, C1, C2, C3, C4, C5, C6, C7)*/

++    int32_t rgbs_thr_cx[8];

++    /*!< shftr_val_cx[8] ShiftVal is derived from log2(number of pixels from C0-C7 color channel in a cell)*/

++    int32_t shftr_val_cx[8];

++    /*!< shftr_sat Shifter for saturation grid. Represents log2(num of pixels in cell) + 1. In SVE/RGB-IR use cases represent the shifter for saturation grid 0. In SVE, this correspond to long exposure colorIDs[0-3]. In RGB-IR this correspond to RGB colorID[0-2]*/

++    int32_t shftr_sat;

++    /*!< output_packed Enabling Output packing. Use 0 if ColorID [0 3] are used, Use 1 if all ColorIDs i.e. [0 7] are used (i.e. multi-exposure (e.g. SVE) use-cases)*/

++    int32_t output_packed;

++    /*!< output_sat_packed Enabling Saturation Output packing for SVE & RGB-IR so that two saturation grids can be used to represent short/long in SVE and  RGB/IR in RGB-IR use cases.*/

++    int32_t output_sat_packed;

++    /*!< cx_sat_id mapping of ColorIDs 0-7 to saturation grid 0(long exp) or 1(short exp/IR)*/

++    int32_t cx_sat_id;

++    /*!< shftr_sat_1 Shifter for saturation grid 1. Used only in SVE & RGB-IR. In SVE, this correspond to short exposure colorIDs[4-7]. In RGB-IR this correspond to IR colorID[3]. Represents log2(num of pixels in cell) + 1.*/

++    int32_t shftr_sat_1;

++

++} ia_pal_isp_rgbs_statistics_1_0_t;

++

++/*! \isp struct sc_iefd

++

++*/

++typedef struct

++{

++    /*!< bypass Block bypass for HW use*/

++    int32_t bypass;

++    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/

++    int32_t horver_diag_coeff;

++    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/

++    int32_t ed_horver_diag_coeff;

++    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/

++    int32_t dir_far_sharp_w;

++    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/

++    int32_t dir_far_dns_w;

++    /*!< ndir_dns_power Power of non-direct denoising*/

++    int32_t ndir_dns_power;

++    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/

++    int32_t shrpn_posi_lmt_dir;

++    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/

++    int32_t shrpn_nega_lmt_dir;

++    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/

++    int32_t shrpn_posi_lmt_txt;

++    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/

++    int32_t shrpn_nega_lmt_txt;

++    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/

++    int32_t clamp_stitch;

++    /*!< denoise_en Denoise enable flag*/

++    int32_t denoise_en;

++    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/

++    int32_t cu6_ndir_shrpn_pwr;

++    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/

++    int32_t cuunsharpen_power;

++    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/

++    int32_t unsharp_weight;

++    /*!< unsharp_amount Unsharp-mask extra sharpening power*/

++    int32_t unsharp_amount;

++    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/

++    int32_t direct_metric_update;

++    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/

++    int32_t directional_smooth_en;

++    /*!< rad_enable Enable radial dependency flag*/

++    int32_t rad_enable;

++    /*!< rad_xreset Radial reset of  x (width)*/

++    int32_t rad_xreset;

++    /*!< rad_yreset Radial reset of y (height)*/

++    int32_t rad_yreset;

++    /*!< rad_x2reset Radial reset of x^2 (width^2)*/

++    int32_t rad_x2reset;

++    /*!< rad_y2reset Radial reset of y^2 (height^2)*/

++    int32_t rad_y2reset;

++    /*!< rad_nf Scaling down factor of radius^2*/

++    int32_t rad_nf;

++    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/

++    int32_t rad_inv_r2;

++    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/

++    int32_t rad_dir_far_sharp_w;

++    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/

++    int32_t rad_cu6_ndir_shrpn_pwr;

++    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/

++    int32_t rad_cuun_shrpn_pwr;

++    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/

++    int32_t rad_cu6_x1;

++    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/

++    int32_t rad_cuunshrp_x1;

++    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/

++    int32_t rad_dir_far_dns_w;

++    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/

++    int32_t rad_ndir_dns_power;

++    /*!< vssnlm_enable Enable of edge denoising flag*/

++    int32_t vssnlm_enable;

++    /*!< vs_x0 Edge denoising LUT x0*/

++    int32_t vs_x0;

++    /*!< vs_x1 Edge denoising LUT x1*/

++    int32_t vs_x1;

++    /*!< vs_x2 Edge denoising LUT x2*/

++    int32_t vs_x2;

++    /*!< vs_y1 Edge denoising LUT y0*/

++    int32_t vs_y1;

++    /*!< vs_y2 Edge denoising LUT y1*/

++    int32_t vs_y2;

++    /*!< vs_y3 Edge denoising LUT y2*/

++    int32_t vs_y3;

++    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

++    int32_t unsharpfilter[15];

++    /*!< denoisefilter[6] Denoising filter coefficients*/

++    int32_t denoisefilter[6];

++    /*!< configunit1_x[2] CU1 x points*/

++    int32_t configunit1_x[2];

++    /*!< configunit1_slope[1] CU1 slope vlaues*/

++    int32_t configunit1_slope[1];

++    /*!< configunit3_x[2] CU3 x points*/

++    int32_t configunit3_x[2];

++    /*!< configunit3_slope[1] CU3 slope vlaues*/

++    int32_t configunit3_slope[1];

++    /*!< configunit5_x[2] CU5 x points*/

++    int32_t configunit5_x[2];

++    /*!< configunit5_y[1] CU5 y points*/

++    int32_t configunit5_y[1];

++    /*!< configunit5_slope[1] CU5 x slope values*/

++    int32_t configunit5_slope[1];

++    /*!< configunit6_opt_x[4] CU6 x points*/

++    int32_t configunit6_opt_x[4];

++    /*!< configunit6_opt_y[3] CU6 y points*/

++    int32_t configunit6_opt_y[3];

++    /*!< configunit6_opt_slope[3] CU6 slope values*/

++    int32_t configunit6_opt_slope[3];

++    /*!< configunit7_x[2] CU7 x points*/

++    int32_t configunit7_x[2];

++    /*!< configunit7_slope[1] CU7 slope vlaues*/

++    int32_t configunit7_slope[1];

++    /*!< configunited_x[6] CU_ED x points*/

++    int32_t configunited_x[6];

++    /*!< configunited_y[5] CU_ED y points*/

++    int32_t configunited_y[5];

++    /*!< configunited_slope[5] CU_ED slope vlaues*/

++    int32_t configunited_slope[5];

++    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/

++    int32_t configunitunsharp_opt_x[4];

++    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/

++    int32_t configunitunsharp_opt_y[3];

++    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope vlaues*/

++    int32_t configunitunsharp_opt_slope[3];

++    /*!< configunitradial_x[6] CU_RAD x points*/

++    int32_t configunitradial_x[6];

++    /*!< configunitradial_y[5] CU_RAD y points*/

++    int32_t configunitradial_y[5];

++    /*!< configunitradial_slope[5] CU_RAD slope vlaues*/

++    int32_t configunitradial_slope[5];

++    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/

++    int32_t configunitvssnlm_x[2];

++    /*!< configunitvssnlm_slope[1] C_VSSNLM slope vlaues*/

++    int32_t configunitvssnlm_slope[1];

++

++} ia_pal_isp_sc_iefd_t;

++

++/*! \isp struct sc_iefd_v2

++

++*/

++typedef struct

++{

++    /*!< enable Block enable for HW use*/

++    int32_t enable;

++    /*!< horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal gradient metric*/

++    int32_t horver_diag_coeff;

++    /*!< ed_horver_diag_coeff Coefficient that compensates for different distnace of vertical/horizontal and diagonal edge metric*/

++    int32_t ed_horver_diag_coeff;

++    /*!< dir_far_sharp_w Weight of wide kernel direct sharpening*/

++    int32_t dir_far_sharp_w;

++    /*!< dir_far_dns_w Weight of wide kernel direct denoising*/

++    int32_t dir_far_dns_w;

++    /*!< ndir_dns_power Power of non-direct denoising*/

++    int32_t ndir_dns_power;

++    /*!< shrpn_posi_lmt_dir Overshoot limit for edge*/

++    int32_t shrpn_posi_lmt_dir;

++    /*!< shrpn_nega_lmt_dir Undershoot limit for edge*/

++    int32_t shrpn_nega_lmt_dir;

++    /*!< shrpn_posi_lmt_txt Overshoot limit for texture*/

++    int32_t shrpn_posi_lmt_txt;

++    /*!< shrpn_nega_lmt_txt Undershoot limit for texture*/

++    int32_t shrpn_nega_lmt_txt;

++    /*!< clamp_stitch Slope to stitch between clamped and unclamped edge values*/

++    int32_t clamp_stitch;

++    /*!< denoise_en Denoise enable flag*/

++    int32_t denoise_en;

++    /*!< cu6_ndir_shrpn_pwr Power of direct sharpening*/

++    int32_t cu6_ndir_shrpn_pwr;

++    /*!< cuunsharpen_power Power of unsharp-mask sharpening*/

++    int32_t cuunsharpen_power;

++    /*!< unsharp_weight Blending weight between unsharp-mask and direct sharpening*/

++    int32_t unsharp_weight;

++    /*!< unsharp_amount Unsharp-mask extra sharpening power*/

++    int32_t unsharp_amount;

++    /*!< direct_metric_update Update coefficient for direction metric with 2nd direction*/

++    int32_t direct_metric_update;

++    /*!< directional_smooth_en Enable smoothing of best direction with second best direction*/

++    int32_t directional_smooth_en;

++    /*!< rad_enable Enable radial dependency flag*/

++    int32_t rad_enable;

++    /*!< rad_xreset Radial reset of  x (width)*/

++    int32_t rad_xreset;

++    /*!< rad_yreset Radial reset of y (height)*/

++    int32_t rad_yreset;

++    /*!< rad_x2reset Radial reset of x^2 (width^2)*/

++    int32_t rad_x2reset;

++    /*!< rad_y2reset Radial reset of y^2 (height^2)*/

++    int32_t rad_y2reset;

++    /*!< rad_nf Scaling down factor of radius^2*/

++    int32_t rad_nf;

++    /*!< rad_inv_r2 Normalization factor of inverse of radius^2*/

++    int32_t rad_inv_r2;

++    /*!< rad_dir_far_sharp_w Weight of wide kernel direct sharpening in the periphery*/

++    int32_t rad_dir_far_sharp_w;

++    /*!< rad_cu6_ndir_shrpn_pwr Power of direct sharpening n the periphery*/

++    int32_t rad_cu6_ndir_shrpn_pwr;

++    /*!< rad_cuun_shrpn_pwr Power of unsharp-mask sharpening in the periphery*/

++    int32_t rad_cuun_shrpn_pwr;

++    /*!< rad_cu6_x1 X1 point of ConfigUnit1 in the periphery*/

++    int32_t rad_cu6_x1;

++    /*!< rad_cuunshrp_x1 X1 point of ConfigUnitUnsharpMask in the periphery*/

++    int32_t rad_cuunshrp_x1;

++    /*!< rad_dir_far_dns_w Weight of wide kernel direct denoising in the periphery*/

++    int32_t rad_dir_far_dns_w;

++    /*!< rad_ndir_dns_power Power of non-direct denoising in the periphery*/

++    int32_t rad_ndir_dns_power;

++    /*!< vssnlm_enable Enable of edge denoising flag*/

++    int32_t vssnlm_enable;

++    /*!< vs_x0 Edge denoising LUT x0*/

++    int32_t vs_x0;

++    /*!< vs_x1 Edge denoising LUT x1*/

++    int32_t vs_x1;

++    /*!< vs_x2 Edge denoising LUT x2*/

++    int32_t vs_x2;

++    /*!< vs_y1 Edge denoising LUT y0*/

++    int32_t vs_y1;

++    /*!< vs_y2 Edge denoising LUT y1*/

++    int32_t vs_y2;

++    /*!< vs_y3 Edge denoising LUT y2*/

++    int32_t vs_y3;

++    /*!< unsharpfilter[15] Unsharp-mask filter coefficients*/

++    int32_t unsharpfilter[15];

++    /*!< denoisefilter[6] Denoising filter coefficients*/

++    int32_t denoisefilter[6];

++    /*!< configunit1_x[2] CU1 x points*/

++    int32_t configunit1_x[2];

++    /*!< configunit1_slope[1] CU1 slope values*/

++    int32_t configunit1_slope[1];

++    /*!< configunit3_x[2] CU3 x points*/

++    int32_t configunit3_x[2];

++    /*!< configunit3_slope[1] CU3 slope values*/

++    int32_t configunit3_slope[1];

++    /*!< configunit5_x[2] CU5 x points*/

++    int32_t configunit5_x[2];

++    /*!< configunit5_y[1] CU5 y points*/

++    int32_t configunit5_y[1];

++    /*!< configunit5_slope[1] CU5 x slope values*/

++    int32_t configunit5_slope[1];

++    /*!< configunit6_opt_x[4] CU6 x points*/

++    int32_t configunit6_opt_x[4];

++    /*!< configunit6_opt_y[3] CU6 y points*/

++    int32_t configunit6_opt_y[3];

++    /*!< configunit6_opt_slope[3] CU6 slope values*/

++    int32_t configunit6_opt_slope[3];

++    /*!< configunit7_x[2] CU7 x points*/

++    int32_t configunit7_x[2];

++    /*!< configunit7_slope[1] CU7 slope vlaues*/

++    int32_t configunit7_slope[1];

++    /*!< configunited_x[6] CU_ED x points*/

++    int32_t configunited_x[6];

++    /*!< configunited_y[5] CU_ED y points*/

++    int32_t configunited_y[5];

++    /*!< configunited_slope[5] CU_ED slope values*/

++    int32_t configunited_slope[5];

++    /*!< configunitunsharp_opt_x[4] CU_UnsharpMask x points*/

++    int32_t configunitunsharp_opt_x[4];

++    /*!< configunitunsharp_opt_y[3] CU_UnsharpMask y points*/

++    int32_t configunitunsharp_opt_y[3];

++    /*!< configunitunsharp_opt_slope[3] CU_UnsharpMask slope values*/

++    int32_t configunitunsharp_opt_slope[3];

++    /*!< configunitradial_x[6] CU_RAD x points*/

++    int32_t configunitradial_x[6];

++    /*!< configunitradial_y[5] CU_RAD y points*/

++    int32_t configunitradial_y[5];

++    /*!< configunitradial_slope[5] CU_RAD slope values*/

++    int32_t configunitradial_slope[5];

++    /*!< configunitvssnlm_x[2] CU_VSSNLM x points*/

++    int32_t configunitvssnlm_x[2];

++    /*!< configunitvssnlm_slope[1] CU_VSSNLM slope values*/

++    int32_t configunitvssnlm_slope[1];

++    /*!< configunitusmpownorm_x[6] CU_USM_POW x points*/

++    int32_t configunitusmpownorm_x[6];

++    /*!< configunitusmpownorm_y[5] CU_USM_POW y points*/

++    int32_t configunitusmpownorm_y[5];

++    /*!< configunitusmpownorm_slope[5] CU_USM_POW slope values*/

++    int32_t configunitusmpownorm_slope[5];

++    /*!< unsharpmet Enable gradient protection*/

++    int32_t unsharpmet;

++    /*!< gradth Threshold for zeroing derivative*/

++    int32_t gradth;

++

++} ia_pal_isp_sc_iefd_v2_t;

++

++/*! \isp struct sc_outputscaler_dp

++

++*/

++typedef struct

++{

++    /*!< bypass bypass the scaler*/

++    int32_t bypass;

++    /*!< block_width Horizontal size of output block*/

++    int32_t block_width;

++    /*!< block_height Vertical size of output block*/

++    int32_t block_height;

++    /*!< chunk_width Horizontal size of input chunk*/

++    int32_t chunk_width;

++    /*!< chunk_height Vertical size of input chunk*/

++    int32_t chunk_height;

++    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_y_start_column;

++    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_uv_start_column;

++    /*!< in_width_y Width of the input image Y plane (in pixels)*/

++    int32_t in_width_y;

++    /*!< in_height_y Height of the input image Y plane (in pixels)*/

++    int32_t in_height_y;

++    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

++    int32_t in_width_uv;

++    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

++    int32_t in_height_uv;

++    /*!< out_width_y Width of the output image Y plane (in pixels)*/

++    int32_t out_width_y;

++    /*!< out_height_y Height of the output image Y plane (in pixels)*/

++    int32_t out_height_y;

++    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

++    int32_t out_width_uv;

++    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

++    int32_t out_height_uv;

++    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

++    int32_t updown_sel;

++    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

++    int32_t coeff_lut_y[128];

++    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

++    int32_t coeff_lut_uv[64];

++    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

++    int32_t scaling_ratio;

++    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

++    int32_t phase_init_y_top;

++    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

++    int32_t phase_init_y_left;

++    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

++    int32_t phase_init_uv_top;

++    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

++    int32_t phase_init_uv_left;

++    /*!< pad_left_y Image left padding: Y component*/

++    int32_t pad_left_y;

++    /*!< pad_left_uv Image left padding: U/V components*/

++    int32_t pad_left_uv;

++    /*!< pad_right_y Image right padding: Y component*/

++    int32_t pad_right_y;

++    /*!< pad_right_uv Image right padding: U/V components*/

++    int32_t pad_right_uv;

++    /*!< pad_top_y Image top padding: Y component*/

++    int32_t pad_top_y;

++    /*!< pad_top_uv Image top padding: U/V components*/

++    int32_t pad_top_uv;

++    /*!< pad_bttm_y Image bottom padding: Y component*/

++    int32_t pad_bttm_y;

++    /*!< pad_bttm_uv Image bottom padding: U/V components*/

++    int32_t pad_bttm_uv;

++    /*!< exp_shift Scaling filter coefficients exponent shift*/

++    int32_t exp_shift;

++    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

++    int32_t output0_out_y_left_crop;

++    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

++    int32_t output0_out_uv_left_crop;

++    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

++    int32_t output0_out_y_top_crop;

++    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

++    int32_t output0_out_uv_top_crop;

++

++} ia_pal_isp_sc_outputscaler_dp_t;

++

++/*! \isp struct sc_outputscaler_dp_1_1

++

++*/

++typedef struct

++{

++    /*!< bypass bypass the scaler*/

++    int32_t bypass;

++    /*!< block_width Horizontal size of output block*/

++    int32_t block_width;

++    /*!< block_height Vertical size of output block*/

++    int32_t block_height;

++    /*!< chunk_width Horizontal size of input chunk*/

++    int32_t chunk_width;

++    /*!< chunk_height Vertical size of input chunk*/

++    int32_t chunk_height;

++    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_y_start_column;

++    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_uv_start_column;

++    /*!< in_width_y Width of the input image Y plane (in pixels)*/

++    int32_t in_width_y;

++    /*!< in_height_y Height of the input image Y plane (in pixels)*/

++    int32_t in_height_y;

++    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

++    int32_t in_width_uv;

++    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

++    int32_t in_height_uv;

++    /*!< out_width_y Width of the output image Y plane (in pixels)*/

++    int32_t out_width_y;

++    /*!< out_height_y Height of the output image Y plane (in pixels)*/

++    int32_t out_height_y;

++    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

++    int32_t out_width_uv;

++    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

++    int32_t out_height_uv;

++    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

++    int32_t updown_sel;

++    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

++    int32_t coeff_lut_y[128];

++    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

++    int32_t coeff_lut_uv[64];

++    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

++    int32_t scaling_ratio;

++    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

++    int32_t phase_init_y_top;

++    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

++    int32_t phase_init_y_left;

++    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

++    int32_t phase_init_uv_top;

++    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

++    int32_t phase_init_uv_left;

++    /*!< pad_left_y Image left padding: Y component*/

++    int32_t pad_left_y;

++    /*!< pad_left_uv Image left padding: U/V components*/

++    int32_t pad_left_uv;

++    /*!< pad_right_y Image right padding: Y component*/

++    int32_t pad_right_y;

++    /*!< pad_right_uv Image right padding: U/V components*/

++    int32_t pad_right_uv;

++    /*!< pad_top_y Image top padding: Y component*/

++    int32_t pad_top_y;

++    /*!< pad_top_uv Image top padding: U/V components*/

++    int32_t pad_top_uv;

++    /*!< pad_bttm_y Image bottom padding: Y component*/

++    int32_t pad_bttm_y;

++    /*!< pad_bttm_uv Image bottom padding: U/V components*/

++    int32_t pad_bttm_uv;

++    /*!< exp_shift Scaling filter coefficients exponent shift*/

++    int32_t exp_shift;

++    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

++    int32_t output0_out_y_left_crop;

++    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

++    int32_t output0_out_uv_left_crop;

++    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

++    int32_t output0_out_y_top_crop;

++    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

++    int32_t output0_out_uv_top_crop;

++    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/

++    int32_t input_bpp;

++

++} ia_pal_isp_sc_outputscaler_dp_1_1_t;

++

++/*! \isp struct sc_outputscaler_ppp

++

++*/

++typedef struct

++{

++    /*!< bypass bypass the scaler*/

++    int32_t bypass;

++    /*!< block_width Horizontal size of output block*/

++    int32_t block_width;

++    /*!< block_height Vertical size of output block*/

++    int32_t block_height;

++    /*!< chunk_width Horizontal size of input chunk*/

++    int32_t chunk_width;

++    /*!< chunk_height Vertical size of input chunk*/

++    int32_t chunk_height;

++    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_y_start_column;

++    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_uv_start_column;

++    /*!< in_width_y Width of the input image Y plane (in pixels)*/

++    int32_t in_width_y;

++    /*!< in_height_y Height of the input image Y plane (in pixels)*/

++    int32_t in_height_y;

++    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

++    int32_t in_width_uv;

++    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

++    int32_t in_height_uv;

++    /*!< out_width_y Width of the output image Y plane (in pixels)*/

++    int32_t out_width_y;

++    /*!< out_height_y Height of the output image Y plane (in pixels)*/

++    int32_t out_height_y;

++    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

++    int32_t out_width_uv;

++    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

++    int32_t out_height_uv;

++    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

++    int32_t updown_sel;

++    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

++    int32_t coeff_lut_y[128];

++    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

++    int32_t coeff_lut_uv[64];

++    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

++    int32_t scaling_ratio;

++    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

++    int32_t phase_init_y_top;

++    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

++    int32_t phase_init_y_left;

++    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

++    int32_t phase_init_uv_top;

++    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

++    int32_t phase_init_uv_left;

++    /*!< pad_left_y Image left padding: Y component*/

++    int32_t pad_left_y;

++    /*!< pad_left_uv Image left padding: U/V components*/

++    int32_t pad_left_uv;

++    /*!< pad_right_y Image right padding: Y component*/

++    int32_t pad_right_y;

++    /*!< pad_right_uv Image right padding: U/V components*/

++    int32_t pad_right_uv;

++    /*!< pad_top_y Image top padding: Y component*/

++    int32_t pad_top_y;

++    /*!< pad_top_uv Image top padding: U/V components*/

++    int32_t pad_top_uv;

++    /*!< pad_bttm_y Image bottom padding: Y component*/

++    int32_t pad_bttm_y;

++    /*!< pad_bttm_uv Image bottom padding: U/V components*/

++    int32_t pad_bttm_uv;

++    /*!< exp_shift Scaling filter coefficients exponent shift*/

++    int32_t exp_shift;

++    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

++    int32_t output0_out_y_left_crop;

++    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

++    int32_t output0_out_uv_left_crop;

++    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

++    int32_t output0_out_y_top_crop;

++    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

++    int32_t output0_out_uv_top_crop;

++

++} ia_pal_isp_sc_outputscaler_ppp_t;

++

++/*! \isp struct sc_outputscaler_ppp_1_1

++

++*/

++typedef struct

++{

++    /*!< bypass bypass the scaler*/

++    int32_t bypass;

++    /*!< block_width Horizontal size of output block*/

++    int32_t block_width;

++    /*!< block_height Vertical size of output block*/

++    int32_t block_height;

++    /*!< chunk_width Horizontal size of input chunk*/

++    int32_t chunk_width;

++    /*!< chunk_height Vertical size of input chunk*/

++    int32_t chunk_height;

++    /*!< input_image_y_start_column AKA 'Start column' of the Y plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_y_start_column;

++    /*!< input_image_uv_start_column AKA 'Start column' of the UV plane: support for left croping. Always 0 unless striping mode is applied.*/

++    int32_t input_image_uv_start_column;

++    /*!< in_width_y Width of the input image Y plane (in pixels)*/

++    int32_t in_width_y;

++    /*!< in_height_y Height of the input image Y plane (in pixels)*/

++    int32_t in_height_y;

++    /*!< in_width_uv Width of the input image UV plane (in pixels)*/

++    int32_t in_width_uv;

++    /*!< in_height_uv Height of the input image UV plane (in pixels)*/

++    int32_t in_height_uv;

++    /*!< out_width_y Width of the output image Y plane (in pixels)*/

++    int32_t out_width_y;

++    /*!< out_height_y Height of the output image Y plane (in pixels)*/

++    int32_t out_height_y;

++    /*!< out_width_uv Width of the output image UV plane (in pixels)*/

++    int32_t out_width_uv;

++    /*!< out_height_uv Height of the output image UV plane (in pixels)*/

++    int32_t out_height_uv;

++    /*!< updown_sel Processing mode: 0-bypass. 1-upscale. 2-downscale*/

++    int32_t updown_sel;

++    /*!< coeff_lut_y[128] Polyphase Y look-up table*/

++    int32_t coeff_lut_y[128];

++    /*!< coeff_lut_uv[64] Polyphase U/V look-up table*/

++    int32_t coeff_lut_uv[64];

++    /*!< scaling_ratio AKA 'phase_step' - defines up- or downscaling factor. For up-scaling minimum is 682 and for down scaling minimum is 171. maximum is for both 2048.*/

++    int32_t scaling_ratio;

++    /*!< phase_init_y_top Starting phase of polyphase Y filter on top image boundary*/

++    int32_t phase_init_y_top;

++    /*!< phase_init_y_left Starting phase of polyphase Y filter on left image boundary*/

++    int32_t phase_init_y_left;

++    /*!< phase_init_uv_top Starting phase of polyphase U/V filter on top image boundary*/

++    int32_t phase_init_uv_top;

++    /*!< phase_init_uv_left Starting phase of polyphase U/V filter on left image boundary*/

++    int32_t phase_init_uv_left;

++    /*!< pad_left_y Image left padding: Y component*/

++    int32_t pad_left_y;

++    /*!< pad_left_uv Image left padding: U/V components*/

++    int32_t pad_left_uv;

++    /*!< pad_right_y Image right padding: Y component*/

++    int32_t pad_right_y;

++    /*!< pad_right_uv Image right padding: U/V components*/

++    int32_t pad_right_uv;

++    /*!< pad_top_y Image top padding: Y component*/

++    int32_t pad_top_y;

++    /*!< pad_top_uv Image top padding: U/V components*/

++    int32_t pad_top_uv;

++    /*!< pad_bttm_y Image bottom padding: Y component*/

++    int32_t pad_bttm_y;

++    /*!< pad_bttm_uv Image bottom padding: U/V components*/

++    int32_t pad_bttm_uv;

++    /*!< exp_shift Scaling filter coefficients exponent shift*/

++    int32_t exp_shift;

++    /*!< output0_out_y_left_crop Left cropping of filter output Y plane*/

++    int32_t output0_out_y_left_crop;

++    /*!< output0_out_uv_left_crop Left cropping of filter output U/V planes*/

++    int32_t output0_out_uv_left_crop;

++    /*!< output0_out_y_top_crop Top cropping of filter output Y plane*/

++    int32_t output0_out_y_top_crop;

++    /*!< output0_out_uv_top_crop Top cropping of filter output U/V planes*/

++    int32_t output0_out_uv_top_crop;

++    /*!< input_bpp 0- 8 bpp 1 -10 bpp 2- 12 bpp*/

++    int32_t input_bpp;

++

++} ia_pal_isp_sc_outputscaler_ppp_1_1_t;

++

++/*! \isp struct sc_ylpf

++

++*/

++typedef struct

++{

++    /*!< m_bypass Block Bypass. Must be set to 0 for operatinal mode*/

++    int32_t m_bypass;

++    /*!< m_vec_kernels[8] configuration DS kernel vector*/

++    int32_t m_vec_kernels[8];

++    /*!< m_decimationmode decimationMode{0.m444,1.m422,2.m420}*/

++    int32_t m_decimationmode;

++

++} ia_pal_isp_sc_ylpf_t;

++

++/*! \isp struct sdp_scp

++

++*/

++typedef struct

++{

++    /*!< remove_thresh Threshold for Outlier removal in RSM. 8bit integer (8.0)*/

++    uint32_t remove_thresh;

++    /*!< slo_rau_diff_thresh Threshold for SLO and RAU disparity difference in RSM. Fixed point 7bit (2.5)*/

++    uint32_t slo_rau_diff_thresh;

++    /*!< diff_thresh Threshold for SLO disparity difference to Center in RSM. Fixed point 8bit (3.5)*/

++    uint32_t diff_thresh;

++    /*!< rsm_bypass RSM Bypass mode. 1=Bypass (default). At Bypass mode, SLO disparity input will be bypassed to RSM disparity output.*/

++    uint32_t rsm_bypass;

++    /*!< rsm_bypass_cg Clock gate control for the block which is not used at RSM Bypass mode. 1=Clock gate. 0=Clock enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition.*/

++    uint32_t rsm_bypass_cg;

++    /*!< rsm_bypass_sd SRAM shutdown control for SRAM1 which is not used at RSM Bypass mode in RSM. 1=Shutdown. 0=Enabled (default). RSM_Bypass_CG must be 0 (=clock enabled) at least 1 clock period before and after RSM_Bypass_SD transition. Also need to not read/write SRAM for 30 sclk cycle when SD goes low (waking up)*/

++    uint32_t rsm_bypass_sd;

++    /*!< additional_vblank Define number of scan line to add to 4 scan line censusPipeStall for V blank. When set N at this additional_vblank, censusPipeStall will be high for 4 + N scan line period for V blank. N can be set as 0 (default) to 15. For RSM bypass mode, please set 3. For RSM mode, please set 9.*/

++    uint32_t additional_vblank;

++    /*!< en_scp_local_clk_gate Enable SCP local clock gate for DS5-B0. 1=Enable (default). 0=Disable.*/

++    uint32_t en_scp_local_clk_gate;

++    /*!< en One bit per census pixel*/

++    uint32_t en;

++    /*!< width Number of pixels per line in the input/output images. Valid values 256 to 1280*/

++    uint32_t width;

++    /*!< height Number of lines in the input/output images. Valid values 40 to 1024*/

++    uint32_t height;

++    /*!< plus_increment This value is added to the running-median estimate of the estimate is below the sequentially-sampled correlation score.*/

++    uint32_t plus_increment;

++    /*!< minus_decrement This value is subtracted from the running-median estimate of the estimate is above the sequentially-sampled correlation score.*/

++    uint32_t minus_decrement;

++    /*!< score_thresh_a Contains a 10-bit binary number used directly as a threshold for the winning Left-Right score. Interest operator bit 0 asserts if the winning score is greater than or equal Score Thresh A .*/

++    uint32_t score_thresh_a;

++    /*!< score_thresh_b Contains a 12-bit binary threshold for the winning Left-Right score. Interest operator bit 1 asserts if the winning score is greater than Score Thresh B.*/

++    uint32_t score_thresh_b;

++    /*!< deepsea_neighbor_threshold Contains a 10-bit binary number compared against the difference of the pre (and post) score and the winning score. Interest operator bit 2 asserts if the post score is greater than Neighbor Threshold. Interest operator bit 3 asserts if the pre score is greater than Neighbor Threshold.*/

++    uint32_t deepsea_neighbor_threshold;

++    /*!< lr_agree_threshold Contain an 11-bit binary number used directly as LR threshold. Interest operator bit 8 asserts if difference between the LR and RL disparities are less than threshold.*/

++    uint32_t lr_agree_threshold;

++    /*!< lr_score_average_disable Disables the averaging of LR and RL scores when set.*/

++    uint32_t lr_score_average_disable;

++    /*!< texture_difference_threshold Bits 0..11 of the {Texture Thresh} configuration register contain a 12-bit binary number which is used directly. This value defines the threshold to use in the the Texture operator difference calculation.*/

++    uint32_t texture_difference_threshold;

++    /*!< texture_count_threshold Bits 12..17 of the {Texture Thresh} configuration register contain a 5-bit binary number which is used directly to compare to the count of the number of significantly different pixel locations in the active census kernel neighborhood.*/

++    uint32_t texture_count_threshold;

++    /*!< deepsea_second_peak_threshold Second Peak Threshold*/

++    uint32_t deepsea_second_peak_threshold;

++    /*!< deepsea_median_threshold Median Threshold*/

++    uint32_t deepsea_median_threshold;

++    /*!< or_mask_bits_zencoder0 Bits [15:0] are ORed with the Z output data to generate prs_dout*/

++    uint32_t or_mask_bits_zencoder0;

++    /*!< and_mask_bits_zencoder0 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/

++    uint32_t and_mask_bits_zencoder0;

++    /*!< or_mask_bits_zencoder1 Bits [15:0] are ORed with the Z output data to generate prs_dout*/

++    uint32_t or_mask_bits_zencoder1;

++    /*!< and_mask_bits_zencoder1 Bits [31:16] are ANDed with the Z output data to generate prs_dout*/

++    uint32_t and_mask_bits_zencoder1;

++    /*!< minwest Sets the left Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minWest defines the west offset for a fixed region.*/

++    uint32_t minwest;

++    /*!< mineast Sets the right Horizontal Minimum when the color differences calculation has Fewer than horizontalSumMin pixels. If the Color Control register has RAU color disabled, then minEast defines the east offset for a fixed region.*/

++    uint32_t mineast;

++    /*!< minwesum Sets the horizontal sum minimum, usually leftMin + rightMin +1. Valid values 3 through 15.*/

++    uint32_t minwesum;

++    /*!< minnorth Sets the up vertical minimimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minNorth defines the north offset for a fixed region.*/

++    uint32_t minnorth;

++    /*!< minsouth Sets the down Vertical Minimum when the color differences calculation has Fewer than verticalSumMin pixels. If the Color Control register has RAU color disabled, then minSouth defines the south offset for a fixed region.*/

++    uint32_t minsouth;

++    /*!< minnssum Sets the vertical sum minimum- usually upMin+downMin+1. Valid values 1 through 7.*/

++    uint32_t minnssum;

++    /*!< ushrink Sets the horizontal shrink factor. Valid values 0 through 4.*/

++    uint32_t ushrink;

++    /*!< vshrink Sets the vertical shrink factor. Valid values 0 and 1.*/

++    uint32_t vshrink;

++    /*!< disablesadcolor Disables Sum of Absolute Differences function*/

++    uint32_t disablesadcolor;

++    /*!< disableraucolor disable RAU color function and use region defined by minimum support vectors*/

++    uint32_t disableraucolor;

++    /*!< disableslorightcolor disable SLO right image color function and use default penalties*/

++    uint32_t disableslorightcolor;

++    /*!< disablesloleftcolor disable SLO left image color function and use default penalties*/

++    uint32_t disablesloleftcolor;

++    /*!< disablesadnormalize In the SAD function, disable normalization and use the unmodified RGB values.*/

++    uint32_t disablesadnormalize;

++    /*!< raudiffthresholdred Sets the RAU color difference comparison threshold for the Red component.*/

++    uint32_t raudiffthresholdred;

++    /*!< raudiffthresholdgreen Sets the RAU color difference comparison threshold for the Green component.*/

++    uint32_t raudiffthresholdgreen;

++    /*!< raudiffthresholdblue Sets the RAU color difference comparison threshold for the Blue component.*/

++    uint32_t raudiffthresholdblue;

++    /*!< diffthresholdred Sets the SLO color difference comparison threshold for the Red component.*/

++    uint32_t diffthresholdred;

++    /*!< diffthresholdgreen Sets the SLO color difference comparison threshold for the Green component.*/

++    uint32_t diffthresholdgreen;

++    /*!< diffthresholdblue Sets the SLO color difference comparison threshold for the Blue component.*/

++    uint32_t diffthresholdblue;

++    /*!< k1penalty Sets the SLO K1 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

++    uint32_t k1penalty;

++    /*!< k2penalty Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

++    uint32_t k2penalty;

++    /*!< k1penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

++    uint32_t k1penaltymod1;

++    /*!< k1penaltymod2 Sets the SLO K2 Penalty to apply when not modified by color comparisons. Valid values 1 through 511.*/

++    uint32_t k1penaltymod2;

++    /*!< k2penaltymod1 Sets the SLO K1 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

++    uint32_t k2penaltymod1;

++    /*!< k2penaltymod2 Sets the SLO K2 Penalty to apply when modified by one color comparison. Valid values 1 through 511.*/

++    uint32_t k2penaltymod2;

++    /*!< x_start First pixel in the row for the WOI of the FFC, min value 0, max value 1279*/

++    uint32_t x_start;

++    /*!< y_start First pixel in the column for the WOI of the FFC, min value 0, max value 1023*/

++    uint32_t y_start;

++    /*!< woi_width Width of the WOI for the FFC, min value 1, max value 1280*/

++    uint32_t woi_width;

++    /*!< woi_height Height of the WOI for the FFC, min value 1, max value 1024*/

++    uint32_t woi_height;

++    /*!< nonvalid_mask Mask the map values for identifying nonvalid pixels*/

++    uint32_t nonvalid_mask;

++    /*!< nonvalid_value Expected value of nonvalid pixels*/

++    uint32_t nonvalid_value;

++    /*!< pmu_scp_pre_clk_gate_enable if set, enable clock gating for SCP-PRE module managed by pmu*/

++    uint32_t pmu_scp_pre_clk_gate_enable;

++    /*!< pmu_scp_rau_clk_gate_enable if set, enable clock gating for SCP-RAU module managed by pmu*/

++    uint32_t pmu_scp_rau_clk_gate_enable;

++    /*!< pmu_scp_post_clk_gate_enable if set, enable clock gating for SCP-POST module managed by pmu*/

++    uint32_t pmu_scp_post_clk_gate_enable;

++    /*!< hamming_dist_lut[32] 32 deep by 8-bit lookup table for scaling Hamming Distance Values in bcc. Addressed by Hamming Distance, output is scaled value*/

++    uint32_t hamming_dist_lut[32];

++    /*!< sad_lut[256] 256 deep by 8-bit lookup table for scaling color Sum Of Distance Values in bcc. Addressed by SAD, output is scaled value*/

++    uint32_t sad_lut[256];

++    /*!< rau_inverse_lut[106] 106 deep by 16-bit lookup table for scaling color Sum Of Distance Values in bcc. addressed by RAU pixel sum, output is inverse value*/

++    uint32_t rau_inverse_lut[106];

++    /*!< interest_lut[512] 512 deep lookup table for converting thresholds to interest. Data is the 2 bit interest value*/

++    uint32_t interest_lut[512];

++    /*!< alpha_lut[128] 128 deep Alpha lookup table for RSM. Data is the 5 bit Weighting Factor Alpha value*/

++    uint32_t alpha_lut[128];

++    /*!< sub_pixel_lut[4096] 4096 entry lookup table for converting left-right score values to a 5-bit sub-pixel value. Data is 5 bits sub pixel value*/

++    uint32_t sub_pixel_lut[4096];

++    /*!< data_range_lookup[16384] 4 sets of 4096 deep lookup table for converting disparity to range data. Data is the 16 bit range value*/

++    uint32_t data_range_lookup[16384];

++

++} ia_pal_isp_sdp_scp_t;

++

++/*! \isp struct see

++

++*/

++typedef struct

++{

++    /*!< Alpha_LUT[64] edge enhance gain*/

++    int32_t Alpha_LUT[64];

++    /*!< Edge_Max max edge value for clamping*/

++    int32_t Edge_Max;

++    /*!< Edge_Thres threshold for coring*/

++    int32_t Edge_Thres;

++

++} ia_pal_isp_see_t;

++

++/*! \isp struct see2

++

++*/

++typedef struct

++{

++    /*!< Alpha_LUT[64] edge enhance gain*/

++    int32_t Alpha_LUT[64];

++    /*!< Edge_Max max edge value for clamping*/

++    int32_t Edge_Max;

++    /*!< Edge_Thres threshold for coring*/

++    int32_t Edge_Thres;

++

++} ia_pal_isp_see2_t;

++

++/*! \isp struct sharpening_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Enable sharpening*/

++    int32_t enable;

++

++} ia_pal_isp_sharpening_1_0_t;

++

++/*! \isp struct sie_vcsc1_1

++

++*/

++typedef struct

++{

++    /*!< csc_enable csc_bypass*/

++    int32_t csc_enable;

++    /*!< csc_matrix[9] conversion matrix for RGB2YUV*/

++    int32_t csc_matrix[9];

++    /*!< csc_matrix_norm normalization factor for RGB2YUV*/

++    int32_t csc_matrix_norm;

++    /*!< csc_bias_vec[3] conversion bias for RGB2YUV*/

++    int32_t csc_bias_vec[3];

++    /*!< cds_coeff_array[8] conversion kernel from 444->420*/

++    int32_t cds_coeff_array[8];

++    /*!< cds_coeff_array_norm normalization factor for 444->420 kernel*/

++    int32_t cds_coeff_array_norm;

++

++} ia_pal_isp_sie_vcsc1_1_t;

++

++/*! \isp struct sis_1

++

++*/

++typedef struct

++{

++    /*!< enable 0- disable filter. 1- enable filter.*/

++    int32_t enable;

++    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

++    int32_t DSF;

++

++} ia_pal_isp_sis_1_t;

++

++/*! \isp struct sis_1_0_a

++

++*/

++typedef struct

++{

++    /*!< enable 0- disable filter. 1- enable filter.*/

++    int32_t enable;

++    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

++    int32_t DSF;

++

++} ia_pal_isp_sis_1_0_a_t;

++

++/*! \isp struct sis_1_0_b

++

++*/

++typedef struct

++{

++    /*!< enable 0- disable filter. 1- enable filter.*/

++    int32_t enable;

++    /*!< DSF Down Scale Factor: 0- scale factor 2. 1- scale factor 4. 2- scale factor 8. 3- scale factor 16.*/

++    int32_t DSF;

++

++} ia_pal_isp_sis_1_0_b_t;

++

++/*! \isp struct spa_sis_a

++

++*/

++typedef struct

++{

++    /*!< m_pixinprec HW Parameter  - Input Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixinprec;

++    /*!< m_pixoutprec HW Parameter  - Output Pixel precision (with sign) : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixoutprec;

++    /*!< m_pixminprec HW Parameter - Minimum possible pixel precision for the input/output Pixel : FIXME needs to be removed as this is a HW Parameter*/

++    int32_t m_pixminprec;

++    /*!< m_isbayer Is Bayer? - RGB(0) Bayer(1)*/

++    int32_t m_isbayer;

++    /*!< m_cliptous 0 - Do not clip, 1 - Clip to unsigned*/

++    int32_t m_cliptous;

++    /*!< m_shiftlen 0 - Perform ShiftR Round, 1 - Perfom ShiftL*/

++    int32_t m_shiftlen;

++    /*!< m_shiftval Shift Value {0..7}*/

++    int32_t m_shiftval;

++

++} ia_pal_isp_spa_sis_a_t;

++

++/*! \isp struct stream2mmio

++Stream2mmio

++*/

++typedef struct

++{

++    /*!< m_bypass bypass*/

++    int32_t m_bypass;

++    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

++    int32_t m_TopCrop;

++

++} ia_pal_isp_stream2mmio_t;

++

++/*! \isp struct stream2mmio_b

++Stream2mmio

++*/

++typedef struct

++{

++    /*!< m_bypass bypass*/

++    int32_t m_bypass;

++    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

++    int32_t m_TopCrop;

++

++} ia_pal_isp_stream2mmio_b_t;

++

++/*! \isp struct stream2mmio_c

++Stream2mmio

++*/

++typedef struct

++{

++    /*!< m_bypass bypass*/

++    int32_t m_bypass;

++    /*!< m_TopCrop Top crop; the row cropping is enabled when this value is odd*/

++    int32_t m_TopCrop;

++

++} ia_pal_isp_stream2mmio_c_t;

++

++/*! \isp struct strm_crop_psa

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_t;

++

++/*! \isp struct strm_crop_psa_c

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA C Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_c_t;

++

++/*! \isp struct strm_crop_psa_d

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA D Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_d_t;

++

++/*! \isp struct strm_crop_psa_e

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA E Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_e_t;

++

++/*! \isp struct strm_crop_psa_f

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA J Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_f_t;

++

++/*! \isp struct strm_crop_psa_g

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA G Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_g_t;

++

++/*! \isp struct strm_crop_psa_h

++

++*/

++typedef struct

++{

++    /*!< enable Enable PSA H Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_psa_h_t;

++

++/*! \isp struct strm_crop_sis_a

++

++*/

++typedef struct

++{

++    /*!< enable Enable pre SIS crop*/

++    int32_t enable;

++    /*!< crop_col_start crop_col_start*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_sis_a_t;

++

++/*! \isp struct strm_crop_sis_b

++

++*/

++typedef struct

++{

++    /*!< enable Enable post SIS Crop*/

++    int32_t enable;

++    /*!< crop_col_start Start column of image data (columns before will be cropped)*/

++    int32_t crop_col_start;

++    /*!< crop_row_start Start row of image data (rows before will be cropped)*/

++    int32_t crop_row_start;

++    /*!< crop_col_end End column of image data (excess will be cropped)*/

++    int32_t crop_col_end;

++    /*!< crop_row_end End line of image data (excess will be cropped)*/

++    int32_t crop_row_end;

++

++} ia_pal_isp_strm_crop_sis_b_t;

++

++/*! \isp struct sve_1_0

++SVE

++*/

++typedef struct

++{

++    /*!< enable enable*/

++    int32_t enable;

++    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/

++    int32_t sve_bayer_pattern_cropped_mask_bit[16];

++    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/

++    int32_t label_long_pixels_mask;

++    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/

++    int32_t max_saturation_val;

++    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/

++    int32_t wb_multiplied_etr[16];

++    /*!< max_input_val U.0.20 - max value of input pixel*/

++    int32_t max_input_val;

++    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta0[16];

++    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta1[16];

++    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta2[16];

++    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/

++    int32_t wb_etr_post_noise_clip_negative[16];

++    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/

++    int32_t etr_noise_norm_shift[16];

++    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/

++    int32_t sve_bayer_pattern_cropped_mask[16];

++    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/

++    int32_t interp_kernels_arr[64];

++    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/

++    int32_t interp_max_weight_th;

++    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/

++    int32_t interp_bayer_pattern_mask;

++    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t short_blur_kernels_arr[144];

++    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/

++    int32_t short_blur_sow_th;

++    /*!< short_blur_power U.1.7 power for pixel blur*/

++    int32_t short_blur_power;

++    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t content_short_kernels_arr[144];

++    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t content_long_kernels_arr[144];

++    /*!< motion_short_g_th U.0.15 threshold for content*/

++    int32_t motion_short_g_th;

++    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/

++    int32_t motion_detector_gain;

++    /*!< motion_detector_power U.1.7 motion detector power for content*/

++    int32_t motion_detector_power;

++    /*!< signal_detector_power U.1.7 signal detector power for content*/

++    int32_t signal_detector_power;

++    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/

++    int32_t signal_detector_gain;

++    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/

++    int32_t enable_wh_interp;

++    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/

++    int32_t enable_wv_interp;

++    /*!< cu_blend_x[4] U.20 cu_blend_x*/

++    int32_t cu_blend_x[4];

++    /*!< cu_blend_y[3] U.11 cu_compression_y*/

++    int32_t cu_blend_y[3];

++    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/

++    int32_t cu_blend_slope[3];

++    /*!< cu_compression_x[8] U.20 cu_compression_x*/

++    int32_t cu_compression_x[8];

++    /*!< cu_compression_y[7] U.15 cu_compression_y*/

++    int32_t cu_compression_y[7];

++    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/

++    int32_t cu_compression_slope[7];

++    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/

++    int32_t long_burnt_dilut_mode;

++    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/

++    int32_t max_resolution_quantization_th;

++    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/

++    int32_t rad_enable;

++    /*!< rad_x_center U.13.0 rad_x_center*/

++    int32_t rad_x_center;

++    /*!< rad_y_center U.13.0 rad_y_center*/

++    int32_t rad_y_center;

++    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/

++    int32_t rad_norm_shift;

++    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/

++    int32_t rad_lut_4_channels[256];

++

++} ia_pal_isp_sve_1_0_t;

++

++/*! \isp struct sve_1_1

++SVE

++*/

++typedef struct

++{

++    /*!< enable enable*/

++    int32_t enable;

++    /*!< sve_bayer_pattern_cropped_mask_bit[16] bit mask define pixel type, according to exp length and bayer color*/

++    int32_t sve_bayer_pattern_cropped_mask_bit[16];

++    /*!< label_long_pixels_mask bit mask for define long pixels in radiance*/

++    int32_t label_long_pixels_mask;

++    /*!< max_saturation_val U.0.15 define pixel saturation level in radiance*/

++    int32_t max_saturation_val;

++    /*!< wb_multiplied_etr[16] U.4.14 - WB * ETR*/

++    int32_t wb_multiplied_etr[16];

++    /*!< max_input_val U.0.20 - max value of input pixel*/

++    int32_t max_input_val;

++    /*!< wb_etr_post_noise_beta0[16] U.0.30 - noise model alpha_0*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta0[16];

++    /*!< wb_etr_post_noise_beta1[16] U.0.15 - noise model alpha_1*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta1[16];

++    /*!< wb_etr_post_noise_beta2[16] U.0.15 - noise model alpha_2*WB * ETR*POST_NOISE_GAIN*/

++    int32_t wb_etr_post_noise_beta2[16];

++    /*!< wb_etr_post_noise_clip_negative[16] U.0.30 - noise model clip negative values*/

++    int32_t wb_etr_post_noise_clip_negative[16];

++    /*!< etr_noise_norm_shift[16] U.4.0 - etr normalization*/

++    int32_t etr_noise_norm_shift[16];

++    /*!< sve_bayer_pattern_cropped_mask[16] enum define pixel type, according to exp length and bayer color*/

++    int32_t sve_bayer_pattern_cropped_mask[16];

++    /*!< interp_kernels_arr[64] U.6.0 define which pixel to use for interpolation according to pattern, 3lsb X 3msb Y location*/

++    int32_t interp_kernels_arr[64];

++    /*!< interp_max_weight_th U.1.7 max weight threshold for interpolation*/

++    int32_t interp_max_weight_th;

++    /*!< interp_bayer_pattern_mask bit mask for define pixels for interpolation*/

++    int32_t interp_bayer_pattern_mask;

++    /*!< short_blur_kernels_arr[144] U.6.0 define which pixel to use for short blur according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t short_blur_kernels_arr[144];

++    /*!< short_blur_sow_th U.4.7 sow threshold for pixel blur*/

++    int32_t short_blur_sow_th;

++    /*!< short_blur_power U.1.7 power for pixel blur*/

++    int32_t short_blur_power;

++    /*!< content_short_kernels_arr[144] U.6.0 define which short pixel to use for content detector according to pattern,  val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t content_short_kernels_arr[144];

++    /*!< content_long_kernels_arr[144] U.6.0 define which long pixel to use for content detector according to pattern, val 63 mens pixel not valid for filtering 3lsb X 3msb Y location*/

++    int32_t content_long_kernels_arr[144];

++    /*!< motion_short_g_th U.0.15 threshold for content*/

++    int32_t motion_short_g_th;

++    /*!< motion_detector_gain U.4.4  motion detector sensitivity for content*/

++    int32_t motion_detector_gain;

++    /*!< motion_detector_power U.1.7 motion detector power for content*/

++    int32_t motion_detector_power;

++    /*!< signal_detector_power U.1.7 signal detector power for content*/

++    int32_t signal_detector_power;

++    /*!< signal_detector_gain S.4.0 signal detector sensitivity for content (4bit include sign )*/

++    int32_t signal_detector_gain;

++    /*!< enable_wh_interp U.1 allow to ignore the horizontal interpolation in interlace use case*/

++    int32_t enable_wh_interp;

++    /*!< enable_wv_interp U.1 allow to ignore the vertical interpolation in interlace use case*/

++    int32_t enable_wv_interp;

++    /*!< cu_blend_x[4] U.20 cu_blend_x*/

++    int32_t cu_blend_x[4];

++    /*!< cu_blend_y[3] U.11 cu_compression_y*/

++    int32_t cu_blend_y[3];

++    /*!< cu_blend_slope[3] U.6.10 cu_blend_slope (16 bit )*/

++    int32_t cu_blend_slope[3];

++    /*!< cu_compression_x[8] U.20 cu_compression_x*/

++    int32_t cu_compression_x[8];

++    /*!< cu_compression_y[7] U.15 cu_compression_y*/

++    int32_t cu_compression_y[7];

++    /*!< cu_compression_slope[7] U.1.10 cu_compression_slope (11 bit )*/

++    int32_t cu_compression_slope[7];

++    /*!< long_burnt_dilut_mode U.2, 0 - pass-through, 1 - directional dilation 2 - traditional dilation*/

++    int32_t long_burnt_dilut_mode;

++    /*!< max_resolution_quantization_th S.1.20 define max resolution quantization threshold in signal detector (21 bit include sign)*/

++    int32_t max_resolution_quantization_th;

++    /*!< rad_enable U.1.0 enable radial compensation when LSC before SVE*/

++    int32_t rad_enable;

++    /*!< rad_x_center U.13.0 rad_x_center*/

++    int32_t rad_x_center;

++    /*!< rad_y_center U.13.0 rad_y_center*/

++    int32_t rad_y_center;

++    /*!< rad_norm_shift U.5.0 radial normalization factor according to image resolution*/

++    int32_t rad_norm_shift;

++    /*!< rad_lut_4_channels[256] U.4.6 - 4 radial luts each lut 64 entries for radial compensation according to LSC tables*/

++    int32_t rad_lut_4_channels[256];

++    /*!< enable_four_cell U.1 Allows the block to work in 4Cell mode*/

++    int32_t enable_four_cell;

++    /*!< four_cell_pattern[16] 4Cell pattern of CFA and exposures, 0-3 - RGGB short, 4-7 - RGGB long*/

++    int32_t four_cell_pattern[16];

++

++} ia_pal_isp_sve_1_1_t;

++

++/*! \isp struct tnr_6_0

++Hardware fixed-function temporal noise reduction

++*/

++typedef struct

++{

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< feedback_image_bittage bit reduction in feedback loop*/

++    int32_t feedback_image_bittage;

++    /*!< spatial_luma_kernel[25] Spatial filtering spatial kernel (Luma, 5x5)*/

++    int32_t spatial_luma_kernel[25];

++    /*!< spatial_chroma_kernel[9] Spatial filtering spatial kernel (Chroma, 3x3)*/

++    int32_t spatial_chroma_kernel[9];

++    /*!< spatial_luma_denoise_control Control weight deviation in Luma spatial denoising*/

++    int32_t spatial_luma_denoise_control;

++    /*!< spatial_chroma_denoise_luma_control Control weight deviation in Chroma spatial denoising*/

++    int32_t spatial_chroma_denoise_luma_control;

++    /*!< spatial_chroma_denoise_chroma_control Control weight deviation in Chroma spatial denoising*/

++    int32_t spatial_chroma_denoise_chroma_control;

++    /*!< blending_inlier_th_motion blending:*/

++    int32_t blending_inlier_th_motion;

++    /*!< blending_inlier_th_static blending:*/

++    int32_t blending_inlier_th_static;

++    /*!< blending_inlier_gain blending:*/

++    int32_t blending_inlier_gain;

++    /*!< blending_da_rec_sim_motion_knees[2] blending:*/

++    int32_t blending_da_rec_sim_motion_knees[2];

++    /*!< blending_da_rec_sim_motion_a[2] blending:*/

++    int32_t blending_da_rec_sim_motion_a[2];

++    /*!< blending_da_rec_sim_motion_b[2] blending:*/

++    int32_t blending_da_rec_sim_motion_b[2];

++    /*!< blending_da_rec_sim_static_knees[2] blending:*/

++    int32_t blending_da_rec_sim_static_knees[2];

++    /*!< blending_da_rec_sim_static_a[2] blending:*/

++    int32_t blending_da_rec_sim_static_a[2];

++    /*!< blending_da_rec_sim_static_b[2] blending:*/

++    int32_t blending_da_rec_sim_static_b[2];

++    /*!< blending_da_winp_knees[2] blending:*/

++    int32_t blending_da_winp_knees[2];

++    /*!< blending_da_winp_a[2] blending:*/

++    int32_t blending_da_winp_a[2];

++    /*!< blending_da_winp_b[2] blending:*/

++    int32_t blending_da_winp_b[2];

++    /*!< sharpening_rec_sim_damp sharpening: rec-sim based damping*/

++    int32_t sharpening_rec_sim_damp;

++    /*!< sharpening_texture_coeff_norm sharpening: texture metric normalization power*/

++    int32_t sharpening_texture_coeff_norm;

++    /*!< sharpening_texture_undershoot sharpening: allowed undershoot for textured pixels*/

++    int32_t sharpening_texture_undershoot;

++    /*!< sharpening_edge_undershoot sharpening: allowed undershoot for edge pixels*/

++    int32_t sharpening_edge_undershoot;

++    /*!< sharpening_texture_overshoot sharpening: allowed overshoot for textured pixels*/

++    int32_t sharpening_texture_overshoot;

++    /*!< sharpening_edge_overshoot sharpening: allowed overshoot for edge pixels*/

++    int32_t sharpening_edge_overshoot;

++    /*!< sharpening_undershoot_power sharpening: undershoot enhancement. To enhance use positive, to weaken use a negative.*/

++    int32_t sharpening_undershoot_power;

++    /*!< sharpening_overshoot_power sharpening: overshoot enhancement. To enhance use positive, to weaken use a negative.*/

++    int32_t sharpening_overshoot_power;

++    /*!< sharpening_cu_x_points_pos_th[6] sharpening: x points for overshoot config unit*/

++    int32_t sharpening_cu_x_points_pos_th[6];

++    /*!< sharpening_cu_a_points_pos_th[5] sharpening: a points for overshoot config unit*/

++    int32_t sharpening_cu_a_points_pos_th[5];

++    /*!< sharpening_cu_b_points_pos_th[5] sharpening: b points for overshoot config unit*/

++    int32_t sharpening_cu_b_points_pos_th[5];

++    /*!< sharpening_cu_x_points_neg_th[6] sharpening: x points for undershoot config unit*/

++    int32_t sharpening_cu_x_points_neg_th[6];

++    /*!< sharpening_cu_a_points_neg_th[5] sharpening: a points for undershoot config unit*/

++    int32_t sharpening_cu_a_points_neg_th[5];

++    /*!< sharpening_cu_b_points_neg_th[5] sharpening: b points for undershoot config unit*/

++    int32_t sharpening_cu_b_points_neg_th[5];

++    /*!< sharpening_cu_x_points_pixval_th[6] sharpening: x points for pixel value config unit*/

++    int32_t sharpening_cu_x_points_pixval_th[6];

++    /*!< sharpening_cu_a_points_pixval_th[5] sharpening: a points for pixel value config unit*/

++    int32_t sharpening_cu_a_points_pixval_th[5];

++    /*!< sharpening_cu_b_points_pixval_th[5] sharpening: b points for pixel value config unit*/

++    int32_t sharpening_cu_b_points_pixval_th[5];

++    /*!< sharpening_cu_x_points_noise_th[6] sharpening: x points for noise th config unit*/

++    int32_t sharpening_cu_x_points_noise_th[6];

++    /*!< sharpening_cu_a_points_noise_th[5] sharpening: a  points for noise th config unit*/

++    int32_t sharpening_cu_a_points_noise_th[5];

++    /*!< sharpening_cu_b_points_noise_th[5] sharpening: b  points for noise th config unit*/

++    int32_t sharpening_cu_b_points_noise_th[5];

++    /*!< sharpening_kernel_coeffs[6] sharpening: kernel coefficients*/

++    int32_t sharpening_kernel_coeffs[6];

++    /*!< op_fragment_width fragmentation*/

++    int32_t op_fragment_width;

++    /*!< op_fragment_height fragmentation*/

++    int32_t op_fragment_height;

++    /*!< start_block_id_X fragmentation*/

++    int32_t start_block_id_X;

++    /*!< start_block_id_Y fragmentation*/

++    int32_t start_block_id_Y;

++    /*!< frame_width fragmentation*/

++    int32_t frame_width;

++    /*!< frame_height fragmentation*/

++    int32_t frame_height;

++    /*!< tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type bit reduction in feedback loop*/

++    int32_t tnr_top_i_tnr6_reg_tnr6_bpp_control_Info_type;

++    /*!< output_bpp bit reduction in feedback loop*/

++    int32_t output_bpp;

++

++} ia_pal_isp_tnr_6_0_t;

++

++/*! \isp struct tnr_scale_1_0

++

++*/

++typedef struct

++{

++    /*!< enable enable TNR_SCALE_1_0 filter*/

++    int32_t enable;

++    /*!< inWidth Number of pixels per row at output*/

++    int32_t inWidth;

++    /*!< inHeight Number of rows at output*/

++    int32_t inHeight;

++    /*!< bitReductionBypass bypass of bit reduction of input pixels*/

++    int32_t bitReductionBypass;

++    /*!< inputShift shift on input pixels*/

++    int32_t inputShift;

++    /*!< cu_bit_reduce_x[6] input bit reduction config unit - x values*/

++    int32_t cu_bit_reduce_x[6];

++    /*!< cu_bit_reduce_y[5] input bit reduction config unit - y values*/

++    int32_t cu_bit_reduce_y[5];

++    /*!< cu_bit_reduce_slope[5] input bit reduction config unit - slope values*/

++    int32_t cu_bit_reduce_slope[5];

++

++} ia_pal_isp_tnr_scale_1_0_t;

++

++/*! \isp struct tnr5_21

++

++*/

++typedef struct

++{

++    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

++    int32_t NM_Rad2_Shift;

++    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

++    int32_t nm_radial_y_center;

++    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

++    int32_t nm_radial_x_center;

++    /*!< nm_R_xcu[128] LUT for radial noise model*/

++    int32_t nm_R_xcu[128];

++    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

++    int32_t nm_YY_xcu[64];

++    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

++    int32_t nm_YC_xcu[64];

++    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

++    int32_t nm_CY_xcu[64];

++    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

++    int32_t nm_CC_xcu[64];

++    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

++    int32_t nm_Y_log_est_min;

++    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

++    int32_t nm_Y_log_est_max;

++    /*!< nm_C_log_est_min Min value for log space C noise model*/

++    int32_t nm_C_log_est_min;

++    /*!< nm_C_log_est_max Max value for log space C noise model*/

++    int32_t nm_C_log_est_max;

++    /*!< nm_lut_frac Fractional bit for noise model LUT*/

++    int32_t nm_lut_frac;

++    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

++    int32_t nm_idx_frac;

++    /*!< nm_pow[64] LUT for power function*/

++    int32_t nm_pow[64];

++    /*!< nm_pow_frac Fractional bit for POW LUT*/

++    int32_t nm_pow_frac;

++    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

++    int32_t nm_shift_num;

++    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

++    int32_t nm_Y_alpha;

++    /*!< nm_C_alpha Scaling coefficient for C noise model*/

++    int32_t nm_C_alpha;

++    /*!< co_var_thres Variance threshold*/

++    int32_t co_var_thres;

++    /*!< co_var_gain Variance gain*/

++    int32_t co_var_gain;

++    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

++    int32_t tbd_sad_Y_gain;

++    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

++    int32_t tbd_sim_arg_gain_m;

++    /*!< tbd_con_thres Content level threshold*/

++    int32_t tbd_con_thres;

++    /*!< tbd_con_gain Content level gain*/

++    int32_t tbd_con_gain;

++    /*!< tbd_sim_lut[64] Similarity LUT*/

++    int32_t tbd_sim_lut[64];

++    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

++    int32_t tbd_rec_sim_thres;

++    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

++    int32_t tbd_rec_gain0;

++    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

++    int32_t tbd_rec_gain1;

++    /*!< pb_weight_in input weight*/

++    int32_t pb_weight_in;

++    /*!< pb_weight_pre_max max weight of temporal filter output*/

++    int32_t pb_weight_pre_max;

++    /*!< pb_weight_sp_thres Spatial filter weight threshold*/

++    int32_t pb_weight_sp_thres;

++    /*!< pb_weight_sp_gain Spatial filter weight gain*/

++    int32_t pb_weight_sp_gain;

++    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/

++    int32_t pb_weight_sp_max0;

++    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/

++    int32_t pb_weight_sp_max1;

++    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/

++    int32_t NS_weight_LUT[64];

++    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/

++    int32_t NS_ConLv_w_LUT[64];

++    /*!< NS_out_max Max value for clipping noise stream*/

++    int32_t NS_out_max;

++    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/

++    int32_t NS_Norm_bias;

++    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/

++    int32_t NS_Norm_coef;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< framenumber frame number*/

++    int32_t framenumber;

++    /*!< g_mv_x global  MV_X*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y*/

++    int32_t g_mv_y;

++    /*!< bypass_NS bypass noise stream*/

++    int32_t bypass_NS;

++

++} ia_pal_isp_tnr5_21_t;

++

++/*! \isp struct tnr5_22

++

++*/

++typedef struct

++{

++    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

++    int32_t NM_Rad2_Shift;

++    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

++    int32_t nm_radial_y_center;

++    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

++    int32_t nm_radial_x_center;

++    /*!< nm_R_xcu[128] LUT for radial noise model*/

++    int32_t nm_R_xcu[128];

++    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

++    int32_t nm_YY_xcu[64];

++    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

++    int32_t nm_YC_xcu[64];

++    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

++    int32_t nm_CY_xcu[64];

++    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

++    int32_t nm_CC_xcu[64];

++    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

++    int32_t nm_Y_log_est_min;

++    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

++    int32_t nm_Y_log_est_max;

++    /*!< nm_C_log_est_min Min value for log space C noise model*/

++    int32_t nm_C_log_est_min;

++    /*!< nm_C_log_est_max Max value for log space C noise model*/

++    int32_t nm_C_log_est_max;

++    /*!< nm_lut_frac Fractional bit for noise model LUT*/

++    int32_t nm_lut_frac;

++    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

++    int32_t nm_idx_frac;

++    /*!< nm_pow_Y[64] LUT for power function for Y*/

++    int32_t nm_pow_Y[64];

++    /*!< nm_pow_C[64] LUT for power function for C*/

++    int32_t nm_pow_C[64];

++    /*!< nm_pow_frac Fractional bit for POW LUT*/

++    int32_t nm_pow_frac;

++    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

++    int32_t nm_shift_num;

++    /*!< co_var_thres Variance threshold*/

++    int32_t co_var_thres;

++    /*!< co_var_gain Variance gain*/

++    int32_t co_var_gain;

++    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

++    int32_t tbd_sad_Y_gain;

++    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

++    int32_t tbd_sim_arg_gain_m;

++    /*!< tbd_con_thres Content level threshold*/

++    int32_t tbd_con_thres;

++    /*!< tbd_con_gain Content level gain*/

++    int32_t tbd_con_gain;

++    /*!< tbd_sim_lut[64] Similarity LUT*/

++    int32_t tbd_sim_lut[64];

++    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

++    int32_t tbd_rec_sim_thres;

++    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

++    int32_t tbd_rec_gain0;

++    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

++    int32_t tbd_rec_gain1;

++    /*!< pb_weight_in input weight*/

++    int32_t pb_weight_in;

++    /*!< pb_weight_pre_max max weight of temporal filter output*/

++    int32_t pb_weight_pre_max;

++    /*!< pb_weight_sp_thres Spatial filter weight threshold*/

++    int32_t pb_weight_sp_thres;

++    /*!< pb_weight_sp_gain Spatial filter weight gain*/

++    int32_t pb_weight_sp_gain;

++    /*!< pb_weight_sp_max0 Spatial filter weight max at high similarity region*/

++    int32_t pb_weight_sp_max0;

++    /*!< pb_weight_sp_max1 Spatial filter weight max at low similarity region*/

++    int32_t pb_weight_sp_max1;

++    /*!< NS_weight_LUT[64] LUT for Noise stream weight control by similarity*/

++    int32_t NS_weight_LUT[64];

++    /*!< NS_ConLv_w_LUT[64] LUT for Noise stream weight control by content*/

++    int32_t NS_ConLv_w_LUT[64];

++    /*!< NS_out_max Max value for clipping noise stream*/

++    int32_t NS_out_max;

++    /*!< NS_Norm_bias Bias for noise stream luma dependency model*/

++    int32_t NS_Norm_bias;

++    /*!< NS_Norm_coef Slope for noise stream luma dependency model*/

++    int32_t NS_Norm_coef;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< framenumber frame number*/

++    int32_t framenumber;

++    /*!< g_mv_x global  MV_X*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y*/

++    int32_t g_mv_y;

++    /*!< bypass_NS bypass noise stream*/

++    int32_t bypass_NS;

++

++} ia_pal_isp_tnr5_22_t;

++

++/*! \isp struct tnr5_25

++

++*/

++typedef struct

++{

++    /*!< NM_Rad2_Shift Bit shift bumber to calculate index for nm_R_xcu*/

++    int32_t NM_Rad2_Shift;

++    /*!< nm_radial_y_center Opical center y coordinate in chroma resolution*/

++    int32_t nm_radial_y_center;

++    /*!< nm_radial_x_center Opical center x coordinate in chroma resolution*/

++    int32_t nm_radial_x_center;

++    /*!< nm_R_xcu[128] LUT for radial noise model*/

++    int32_t nm_R_xcu[128];

++    /*!< nm_YY_xcu[64] LUT for Y noise model – Y dependency*/

++    int32_t nm_YY_xcu[64];

++    /*!< nm_YC_xcu[64] LUT for Y noise model – C dependency*/

++    int32_t nm_YC_xcu[64];

++    /*!< nm_CY_xcu[64] LUT for C noise model – Y dependency*/

++    int32_t nm_CY_xcu[64];

++    /*!< nm_CC_xcu[64] LUT for C noise model – C dependency*/

++    int32_t nm_CC_xcu[64];

++    /*!< nm_Y_log_est_min Min value for log space Y noise model*/

++    int32_t nm_Y_log_est_min;

++    /*!< nm_Y_log_est_max Max value for log space Y noise model*/

++    int32_t nm_Y_log_est_max;

++    /*!< nm_C_log_est_min Min value for log space C noise model*/

++    int32_t nm_C_log_est_min;

++    /*!< nm_C_log_est_max Max value for log space C noise model*/

++    int32_t nm_C_log_est_max;

++    /*!< nm_lut_frac Fractional bit for noise model LUT*/

++    int32_t nm_lut_frac;

++    /*!< nm_idx_frac Bit number for adjusting to POW LUT index*/

++    int32_t nm_idx_frac;

++    /*!< nm_pow[64] LUT for power function*/

++    int32_t nm_pow[64];

++    /*!< nm_pow_frac Fractional bit for POW LUT*/

++    int32_t nm_pow_frac;

++    /*!< nm_shift_num Pre-calculation of nm_lut_frac - nm_idx_frac*/

++    int32_t nm_shift_num;

++    /*!< nm_Y_alpha Scaling coefficient for Y noise model*/

++    int32_t nm_Y_alpha;

++    /*!< nm_C_alpha Scaling coefficient for C noise model*/

++    int32_t nm_C_alpha;

++    /*!< tbd_sad_Y_gain Y SAD sensitivity gain*/

++    int32_t tbd_sad_Y_gain;

++    /*!< tbd_sim_arg_gain_m Similarity argument gain for dynamic*/

++    int32_t tbd_sim_arg_gain_m;

++    /*!< tbd_sim_lut[64] Similarity LUT*/

++    int32_t tbd_sim_lut[64];

++    /*!< tbd_rec_sim_thres Similarity threshold for recursive filter*/

++    int32_t tbd_rec_sim_thres;

++    /*!< tbd_rec_gain0 Gain of recursive filter for static region*/

++    int32_t tbd_rec_gain0;

++    /*!< tbd_rec_gain1 Gain of recursive filter for dynamic region*/

++    int32_t tbd_rec_gain1;

++    /*!< pb_weight_in input weight*/

++    int32_t pb_weight_in;

++    /*!< pb_weight_pre_max max weight of temporal filter output*/

++    int32_t pb_weight_pre_max;

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< framenumber frame number*/

++    int32_t framenumber;

++    /*!< g_mv_x global  MV_X*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y*/

++    int32_t g_mv_y;

++

++} ia_pal_isp_tnr5_25_t;

++

++/*! \isp struct tnr5_3

++

++*/

++typedef struct

++{

++    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/

++    int32_t nm_luma_lut[256];

++    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/

++    int32_t nm_chroma_lut[256];

++    /*!< nm_radial_lut[128] Noise model radial Lut*/

++    int32_t nm_radial_lut[128];

++    /*!< nm_radial_r2_shift Noise model radial shift*/

++    int32_t nm_radial_r2_shift;

++    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

++    int32_t nm_radial_x_center;

++    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

++    int32_t nm_radial_y_center;

++    /*!< co_max_content maximal value for the content*/

++    int32_t co_max_content;

++    /*!< co_content_shift shift right for content*/

++    int32_t co_content_shift;

++    /*!< fm_bma_sad_shift shift value for the BMA*/

++    int32_t fm_bma_sad_shift;

++    /*!< fm_chroma_shift shift value for chroma in fmve*/

++    int32_t fm_chroma_shift;

++    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/

++    int32_t fm_sim_lut[256];

++    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

++    int32_t fm_dist_weights[128];

++    /*!< mvd_sim_lut[256] MVD Similarity LUT*/

++    int32_t mvd_sim_lut[256];

++    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

++    int32_t mvd_sad_shift;

++    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

++    int32_t mvd_arg_g_static;

++    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

++    int32_t mvd_arg_g_static_local;

++    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

++    int32_t mvd_arg_g_move;

++    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

++    int32_t mvd_arg_g_move_local;

++    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/

++    int32_t mvd_chroma_l_shift;

++    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/

++    int32_t mvd_central_pix_l_shift;

++    /*!< spnr_range_lut[7] range lut for the BFA*/

++    int32_t spnr_range_lut[7];

++    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/

++    int32_t spnr_spatial_lut[25];

++    /*!< spnr_shift shift value for the BFA*/

++    int32_t spnr_shift;

++    /*!< spnr_nm_shift shift value for the noise model of SPNR*/

++    int32_t spnr_nm_shift;

++    /*!< pb_weight_pre_max maximal spTNR weight*/

++    int32_t pb_weight_pre_max;

++    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/

++    int32_t pb_weight_spnr_max;

++    /*!< g_mv_x global  MV_X. Should be in PAL*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y. Should be in PAL*/

++    int32_t g_mv_y;

++

++} ia_pal_isp_tnr5_3_t;

++

++/*! \isp struct tnr5_3_1

++

++*/

++typedef struct

++{

++    /*!< nm_luma_lut[256] Noise model LUMA lut (for I core)*/

++    int32_t nm_luma_lut[256];

++    /*!< nm_chroma_lut[256] Noise model Chroma LUT (for I core)*/

++    int32_t nm_chroma_lut[256];

++    /*!< nm_radial_lut[128] Noise model radial Lut*/

++    int32_t nm_radial_lut[128];

++    /*!< nm_radial_r2_shift Noise model radial shift*/

++    int32_t nm_radial_r2_shift;

++    /*!< nm_radial_x_center Noise model radial- center of image x corr*/

++    int32_t nm_radial_x_center;

++    /*!< nm_radial_y_center Noise model radial- center of image y corr*/

++    int32_t nm_radial_y_center;

++    /*!< co_max_content maximal value for the content*/

++    int32_t co_max_content;

++    /*!< co_content_shift shift right for content*/

++    int32_t co_content_shift;

++    /*!< fm_bma_sad_shift shift value for the BMA*/

++    int32_t fm_bma_sad_shift;

++    /*!< fm_chroma_shift shift value for chroma in fmve*/

++    int32_t fm_chroma_shift;

++    /*!< fm_sim_lut[256] FMVE Similarity LUT for grade calculation*/

++    int32_t fm_sim_lut[256];

++    /*!< fm_dist_weights[128] FMVE distance weight for the tow BMA unit*/

++    int32_t fm_dist_weights[128];

++    /*!< mvd_sim_lut[256] MVD Similarity LUT*/

++    int32_t mvd_sim_lut[256];

++    /*!< mvd_sad_shift shift for the SAD values in the MVD sub-block (using realigning)*/

++    int32_t mvd_sad_shift;

++    /*!< mvd_arg_g_static The gain for the recursive similarity at case of static MV . together  with neighbors*/

++    int32_t mvd_arg_g_static;

++    /*!< mvd_arg_g_static_local The gain for the recursive similarity at case of static MV, neighbors have a different MV*/

++    int32_t mvd_arg_g_static_local;

++    /*!< mvd_arg_g_move The gain for the recursive similarity at case of non-static MV,  together  with neighbors*/

++    int32_t mvd_arg_g_move;

++    /*!< mvd_arg_g_move_local The gain for the recursive similarity at case of non-static MV,neighbors have a different MV*/

++    int32_t mvd_arg_g_move_local;

++    /*!< mvd_chroma_l_shift shift value for chroma in mvd*/

++    int32_t mvd_chroma_l_shift;

++    /*!< mvd_central_pix_l_shift shift value for centeral pixel in mvd*/

++    int32_t mvd_central_pix_l_shift;

++    /*!< spnr_range_lut[7] range lut for the BFA*/

++    int32_t spnr_range_lut[7];

++    /*!< spnr_spatial_lut[25] spatial lut for the BFA*/

++    int32_t spnr_spatial_lut[25];

++    /*!< spnr_shift shift value for the BFA*/

++    int32_t spnr_shift;

++    /*!< spnr_nm_shift shift value for the noise model of SPNR*/

++    int32_t spnr_nm_shift;

++    /*!< pb_weight_pre_max maximal spTNR weight*/

++    int32_t pb_weight_pre_max;

++    /*!< pb_weight_spnr_max maximal spNR weight (vs. input)*/

++    int32_t pb_weight_spnr_max;

++    /*!< g_mv_x global  MV_X. Should be in PAL*/

++    int32_t g_mv_x;

++    /*!< g_mv_y global  MV_Y. Should be in PAL*/

++    int32_t g_mv_y;

++

++} ia_pal_isp_tnr5_3_1_t;

++

++/*! \isp struct tnr7_bc_1_0

++

++*/

++typedef struct

++{

++    /*!< enable block enable*/

++    int32_t enable;

++    /*!< is_first_frame If first frame, ignore input rec-sim*/

++    int32_t is_first_frame;

++    /*!< do_update Limit of S&R parameter update mechanism*/

++    int32_t do_update;

++    /*!< coeffs[3] Per-region mult-and-clamp coefficients*/

++    int32_t coeffs[3];

++    /*!< coeffs_user[3] Per-region mult-and-clamp coefficients (specified by user during offline calibration)*/

++    int32_t coeffs_user[3];

++    /*!< gpu_mode meta parameter controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/

++    int32_t gpu_mode;

++    /*!< tune_sensitivity user tuning - alignment-conf sensitivity*/

++    int32_t tune_sensitivity;

++    /*!< global_protection global protection enable*/

++    int32_t global_protection;

++    /*!< global_protection_sensitivity_lut_values[3] global protection - LUT values*/

++    int32_t global_protection_sensitivity_lut_values[3];

++    /*!< global_protection_sensitivity_lut_slopes[2] global protection - LUT slopes*/

++    int32_t global_protection_sensitivity_lut_slopes[2];

++    /*!< global_protection_motion_level average alignment conf of previous frame*/

++    int32_t global_protection_motion_level;

++    /*!< global_protection_motion_level_user average alignment conf of previous frame (specified by user during offline calibration)*/

++    int32_t global_protection_motion_level_user;

++

++} ia_pal_isp_tnr7_bc_1_0_t;

++

++/*! \isp struct tnr7_blend_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Enable TNR7 blend*/

++    int32_t enable;

++    /*!< enable_main_output Enable blend main output*/

++    int32_t enable_main_output;

++    /*!< enable_vision_output Enable blend computer vision output*/

++    int32_t enable_vision_output;

++    /*!< single_output_mode Both outputs use the same blend*/

++    int32_t single_output_mode;

++    /*!< spatial_weight_coeff Spatial weight coeff to be used in single_output_mode*/

++    int32_t spatial_weight_coeff;

++    /*!< max_recursive_similarity Maximum value of recursive similarity*/

++    int32_t max_recursive_similarity;

++    /*!< spatial_alpha Use of spatial filtering in the feedback output*/

++    int32_t spatial_alpha;

++    /*!< w_out_prev_LUT[32] Weight of reference in the main output*/

++    int32_t w_out_prev_LUT[32];

++    /*!< w_out_spl_LUT[32] Weight of spatial in the main output*/

++    int32_t w_out_spl_LUT[32];

++    /*!< output_cu_x[6] output config unit - x values*/

++    int32_t output_cu_x[6];

++    /*!< output_cu_a[5] output config unit - slope values*/

++    int32_t output_cu_a[5];

++    /*!< output_cu_b[5] output config unit - b values*/

++    int32_t output_cu_b[5];

++    /*!< max_recursive_similarity_vsn Vision - Maximum value of recursive similarity*/

++    int32_t max_recursive_similarity_vsn;

++    /*!< w_vsn_out_prev_LUT[32] Vision - Weight of reference in the main output*/

++    int32_t w_vsn_out_prev_LUT[32];

++    /*!< w_vsn_out_spl_LUT[32] Vision - Weight of spatial in the main output*/

++    int32_t w_vsn_out_spl_LUT[32];

++

++} ia_pal_isp_tnr7_blend_1_0_t;

++

++/*! \isp struct tnr7_cme_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Enable TNR7 CME (Course Motion Estimation)*/

++    int32_t enable;

++    /*!< input_width Input Base and Dest Image Width*/

++    int32_t input_width;

++    /*!< input_height Input Base and Dest Image Height*/

++    int32_t input_height;

++    /*!< hor_search_enable Enable Horizontal MV Estimation*/

++    int32_t hor_search_enable;

++    /*!< ver_search_enable Enable Vertical MV Estimation*/

++    int32_t ver_search_enable;

++    /*!< half_pel_enable Enable Half-Pixel MV Estimation*/

++    int32_t half_pel_enable;

++    /*!< quarter_pel_enable Enable Quarter-Pixel MV Estimation*/

++    int32_t quarter_pel_enable;

++    /*!< search_range_x Integer MV Search Displacement X*/

++    int32_t search_range_x;

++    /*!< search_range_y Integer MV Search Displacement Y*/

++    int32_t search_range_y;

++    /*!< spatial_reg_mod_factor Spatial Noise Level to Regularization Factor*/

++    int32_t spatial_reg_mod_factor;

++    /*!< temporal_reg_mod_factor Temporal Noise Level to Regularization Factor*/

++    int32_t temporal_reg_mod_factor;

++    /*!< noise_confidence_factor Confidence Base Noise Scale Factor*/

++    int32_t noise_confidence_factor;

++    /*!< confidence_thr High Confidence Model Minimum Threshold*/

++    int32_t confidence_thr;

++    /*!< model_confidence_deadzone Valid Confidence Model Minimum Threshold*/

++    int32_t model_confidence_deadzone;

++    /*!< noise_thr_est_enable Enable Automatic Noise Level Estimation*/

++    int32_t noise_thr_est_enable;

++    /*!< noise_thr Characterization Specified Noise Level*/

++    int32_t noise_thr;

++    /*!< noise_apu_min Noise APU Minimum Threshold*/

++    int32_t noise_apu_min;

++    /*!< noise_apu_alpha_limit Noise APU Alpha Limit*/

++    int32_t noise_apu_alpha_limit;

++    /*!< noise_apu_alpha_power Noise APU Alpha Power*/

++    int32_t noise_apu_alpha_power;

++    /*!< predictor_enable Enable Predictor (Parametric Model)*/

++    int32_t predictor_enable;

++    /*!< model_valid SaveRestore Predictor Model Valid*/

++    int32_t model_valid;

++    /*!< model_confidence SaveRestore Predictor Model Confidence*/

++    int32_t model_confidence;

++    /*!< model_ax0 SaveRestore Predictor Model X Component Shift*/

++    int32_t model_ax0;

++    /*!< model_ay0 SaveRestore Predictor Model Y Component Shift*/

++    int32_t model_ay0;

++    /*!< model_ax1 SaveRestore Predictor Model X Component Scale*/

++    int32_t model_ax1;

++    /*!< model_ay1 SaveRestore Predictor Model Y Component Scale*/

++    int32_t model_ay1;

++    /*!< noise_estimator_level_valid SaveRestore Noise Estimator Level Valid*/

++    int32_t noise_estimator_level_valid;

++    /*!< noise_estimator_level SaveRestore Noise Estimator Level*/

++    int32_t noise_estimator_level;

++

++} ia_pal_isp_tnr7_cme_1_0_t;

++

++/*! \isp struct tnr7_ims_1_0

++

++*/

++typedef struct

++{

++    /*!< enable block enable*/

++    int32_t enable;

++    /*!< update_limit Limit of S&R parameter update mechanism*/

++    int32_t update_limit;

++    /*!< update_coeff S&R parameter update coefficient*/

++    int32_t update_coeff;

++    /*!< do_update Enables S&R update mechanism for distance log-likelihood distribution*/

++    int32_t do_update;

++    /*!< d_ml[16] Maximum-likelihood of distance distribution*/

++    int32_t d_ml[16];

++    /*!< d_slopes[16] Distance log-likelihood slopes*/

++    int32_t d_slopes[16];

++    /*!< d_top[16] Distance log-likelihood constants*/

++    int32_t d_top[16];

++    /*!< outofbounds[16] Is ml value out-of-hostogram-bounds?*/

++    int32_t outofbounds[16];

++    /*!< d_ml_user[16] Maximum-likelihood of distance distribution (specified by user during offline calibration)*/

++    int32_t d_ml_user[16];

++    /*!< d_slopes_user[16] Distance log-likelihood slopes (specified by user during offline calibration)*/

++    int32_t d_slopes_user[16];

++    /*!< d_top_user[16] Distance log-likelihood constants (specified by user during offline calibration)*/

++    int32_t d_top_user[16];

++    /*!< gpu_mode meta parameter for controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/

++    int32_t gpu_mode;

++    /*!< mbd_enable Enable bit of motion boundary detection submodule*/

++    int32_t mbd_enable;

++    /*!< mbd_sensitivity Gradient threshold sensitivity modifer parameter U3.6*/

++    int32_t mbd_sensitivity;

++    /*!< mbd_gradient_threshold Automatically estimated gradient threshold U1.8*/

++    int32_t mbd_gradient_threshold;

++    /*!< mbd_global_mag Automatically estimated global motion vector magnitude U9.3*/

++    int32_t mbd_global_mag;

++    /*!< mbd_stationary_mag_offset Global motion soft threshold - offset U9.3*/

++    int32_t mbd_stationary_mag_offset;

++    /*!< mbd_stationary_mag_slope Global motion soft threshold - slope S+3.10*/

++    int32_t mbd_stationary_mag_slope;

++    /*!< mbd_gradient_percentile Gradient CDF search threshold U0.7*/

++    int32_t mbd_gradient_percentile;

++    /*!< mbd_gradient_thr_user 1) When > 0, statically specified gradient threshold 2) When == 0, dynamic threshold estimated from histogram U1.8*/

++    int32_t mbd_gradient_thr_user;

++    /*!< mbd_gradient_thr_update Gradient estimate update rate U1.6*/

++    int32_t mbd_gradient_thr_update;

++    /*!< mbd_threshold_slope Slope of normalized gradient mult&clamp curve*/

++    int32_t mbd_threshold_slope;

++    /*!< mbd_mag_alpha_limit Global magnitude APU alpha limit*/

++    int32_t mbd_mag_alpha_limit;

++    /*!< mbd_mag_alpha_power Global magnitude alpha power*/

++    int32_t mbd_mag_alpha_power;

++    /*!< mbd_safe_pixel_thr IMS threshold for rejecting safe pixels based on MBS score Rejected pixels are > mbd_safe_pixel_thr*/

++    int32_t mbd_safe_pixel_thr;

++

++} ia_pal_isp_tnr7_ims_1_0_t;

++

++/*! \isp struct tnr7_mc_1_0

++

++*/

++typedef struct

++{

++    /*!< passThrough Passthrough (set the motion vectors to zero when enabled)*/

++    int32_t passThrough;

++    /*!< imageHeightFR Height (pixels) of the full-resolution image*/

++    int32_t imageHeightFR;

++    /*!< imageWidthFR Width (pixels) of the full-resolution image*/

++    int32_t imageWidthFR;

++    /*!< imageHeightDS Height (pixels) of the small-resoltion image*/

++    int32_t imageHeightDS;

++    /*!< imageWidthDS Width (pixels) of the small-resoltion image*/

++    int32_t imageWidthDS;

++

++} ia_pal_isp_tnr7_mc_1_0_t;

++

++/*! \isp struct tnr7_rme_1_0

++

++*/

++typedef struct

++{

++    /*!< rme16_image_height The height of base16y_in*/

++    int32_t rme16_image_height;

++    /*!< rme16_image_width The width of base16y_in*/

++    int32_t rme16_image_width;

++    /*!< rme4_image_height The height of base4y_in*/

++    int32_t rme4_image_height;

++    /*!< rme4_image_width The width of base4y_in*/

++    int32_t rme4_image_width;

++    /*!< rme_mv64_grid_height The height of the input motion grid*/

++    int32_t rme_mv64_grid_height;

++    /*!< rme_mv64_grid_width The width of the input motion grid*/

++    int32_t rme_mv64_grid_width;

++    /*!< rme_mv16y_max Maximal |mv16y| value*/

++    int32_t rme_mv16y_max;

++    /*!< rme_mv16x_max Maximal |mv16x| value*/

++    int32_t rme_mv16x_max;

++    /*!< rme16_band_height The height of the band update by rem16. Valid values: 1, 2, 4*/

++    int32_t rme16_band_height;

++    /*!< rme16_n_iterations Number of update iterations for each window location of the rme16 run. 0 = bypass update stage.*/

++    int32_t rme16_n_iterations;

++    /*!< rme4_n_iterations Number of update iterations for each window location of the rme4 run. 0 = bypass update stage.*/

++    int32_t rme4_n_iterations;

++    /*!< rme16_sv_wd_int Motion regulation parameter for rme16: SvWd*/

++    int32_t rme16_sv_wd_int;

++    /*!< rme4_sv_wd_int Motion regulation parameter for rme4: SvWd*/

++    int32_t rme4_sv_wd_int;

++    /*!< rme16_sv2_inv_man_int Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/

++    int32_t rme16_sv2_inv_man_int;

++    /*!< rme4_sv2_inv_man_int Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/

++    int32_t rme4_sv2_inv_man_int;

++    /*!< rme16_sv2_inv_exp Motion regulation parameter for rme16: sv2inv = sv2inv_man * 2^sv2inv_exp*/

++    int32_t rme16_sv2_inv_exp;

++    /*!< rme4_sv2_inv_exp Motion regulation parameter for rme4: sv2inv = sv2inv_man * 2^sv2inv_exp*/

++    int32_t rme4_sv2_inv_exp;

++    /*!< rme16_median_enable Enable median for rme16, when rme is not in pass-through mode*/

++    int32_t rme16_median_enable;

++    /*!< rme4_median_enable Enable median for rme4, when rme is not in pass-through mode*/

++    int32_t rme4_median_enable;

++    /*!< rme_out_resample_enable enable down-sampling of the final output, when resampling is enabled. 0: disabled, base4 density. 1: enabled, base16 density*/

++    int32_t rme_out_resample_enable;

++    /*!< rme_out_down_sample_enable down-sampling ratio of the final output, when resampling is enabled. 0 means no down-sampling, i.e. base4 density. 1 means down sampling x4, i.e. base 16 density*/

++    int32_t rme_out_down_sample_enable;

++    /*!< rme16_mc_pass_through motion compensation in pass through mode during rme16 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/

++    int32_t rme16_mc_pass_through;

++    /*!< rme4_mc_pass_through motion compensation in pass through mode during rme4 run (for validation purposes). 0: normal operation. 1: pass-through mode (assu,es zero motion)*/

++    int32_t rme4_mc_pass_through;

++

++} ia_pal_isp_tnr7_rme_1_0_t;

++

++/*! \isp struct tnr7_spatial_1_0

++

++*/

++typedef struct

++{

++    /*!< enable Enable TNR7 spatial fallback filter*/

++    int32_t enable;

++    /*!< noise_model_radius Controls noise model radius*/

++    int32_t noise_model_radius;

++    /*!< iir_luma_power iir luma filtering strength (0-only fir, 64-only iir)*/

++    int32_t iir_luma_power;

++    /*!< iir_chroma_power iir chroma filtering strength (0-only fir, 64-only iir)*/

++    int32_t iir_chroma_power;

++    /*!< luma_strength blending coef for luma channel (blend with input)*/

++    int32_t luma_strength;

++    /*!< chroma_strength blending coef for chroma channel (blend with input)*/

++    int32_t chroma_strength;

++    /*!< lumaLUT_v[16] self calibrating noise model (NM) state variables, luma*/

++    int32_t lumaLUT_v[16];

++    /*!< lumaLUT_v_bins[16] self calibrating noise model (NM) state variables, luma*/

++    int32_t lumaLUT_v_bins[16];

++    /*!< lumaLUT_v_limits[2] vertical luma NM limnits*/

++    int32_t lumaLUT_v_limits[2];

++    /*!< nmGain_h_limits[2] horizontal luma NM limnits*/

++    int32_t nmGain_h_limits[2];

++    /*!< nmGain_iir_limits[2] iir luma NM limnits*/

++    int32_t nmGain_iir_limits[2];

++    /*!< nmGain_h horizontal NM gain*/

++    int32_t nmGain_h;

++    /*!< nmGain_iir iir NM gain*/

++    int32_t nmGain_iir;

++    /*!< update_limit update rate of N lut (0-no update, 256-current frame only)*/

++    int32_t update_limit;

++    /*!< update_coeff slope of the update rate as a function of #samples*/

++    int32_t update_coeff;

++

++} ia_pal_isp_tnr7_spatial_1_0_t;

++

++/*! \isp struct tvs_1_0

++Trainable visual scaler

++*/

++typedef struct

++{

++    /*!< bypass Bypass TVS*/

++    int32_t bypass;

++    /*!< ds_bypass Bypass downscale computation in TVS*/

++    int32_t ds_bypass;

++    /*!< metadata_bypass Bypass metadata of TVS output*/

++    int32_t metadata_bypass;

++    /*!< ds_factor_hor_int Integer part of downscale factor in horizontal*/

++    int32_t ds_factor_hor_int;

++    /*!< ds_factor_hor_frac Fractional part of downscale factor in horizontal (Must be 0 when ds_factor_hor_int=1)*/

++    int32_t ds_factor_hor_frac;

++    /*!< ds_factor_ver_int Integer part of downscale factor in vertical*/

++    int32_t ds_factor_ver_int;

++    /*!< ds_factor_ver_frac Fractional part of downscale factor in vertical (Must be 0 when ds_factor_ver_int=1)*/

++    int32_t ds_factor_ver_frac;

++    /*!< input_frame_width Input frame width (must be even number)*/

++    int32_t input_frame_width;

++    /*!< input_frame_height Input frame height (must be even number)*/

++    int32_t input_frame_height;

++    /*!< csc_kernels[9] CSC layer kernel weights*/

++    int32_t csc_kernels[9];

++    /*!< csc_kernels_shift CSC layer kernels fixed point value shift*/

++    int32_t csc_kernels_shift;

++    /*!< csc_biases[3] CSC layer bias weights*/

++    int32_t csc_biases[3];

++    /*!< csc_biases_shift_offset CSC layer biases fixed point value shift offset compared with csc_kernels_shift*/

++    int32_t csc_biases_shift_offset;

++    /*!< csc_data_shift CSC layer output data value shift*/

++    int32_t csc_data_shift;

++    /*!< conv_depth_kernels[588] Conv layer deptheise kernel weights*/

++    int32_t conv_depth_kernels[588];

++    /*!< conv_depth_kernels_shift Conv layer depthwise kernels fixed point value shift*/

++    int32_t conv_depth_kernels_shift;

++    /*!< conv_point_kernels[360] Conv layer pointwise kernel weights*/

++    int32_t conv_point_kernels[360];

++    /*!< conv_point_kernels_shift Conv layer pointwise kernels fixed point value shift*/

++    int32_t conv_point_kernels_shift;

++    /*!< conv_biases[30] Conv layer bias weights*/

++    int32_t conv_biases[30];

++    /*!< conv_biases_shift_offset Conv layer biases fixed point value shift offset compared with conv_point_kernels_shift*/

++    int32_t conv_biases_shift_offset;

++    /*!< conv_data_shift Conv layer output data value shift*/

++    int32_t conv_data_shift;

++    /*!< cu_act_func_x[15] Activation function ConfigUnit x vector*/

++    int32_t cu_act_func_x[15];

++    /*!< cu_act_func_y[14] Activation function ConfigUnit y vector*/

++    int32_t cu_act_func_y[14];

++    /*!< cu_act_func_slope[14] Activation function ConfigUnit slope vector*/

++    int32_t cu_act_func_slope[14];

++    /*!< act_func_output_offset Offset after Activation function*/

++    int32_t act_func_output_offset;

++    /*!< avg_weights[30] Avg layer weights*/

++    int32_t avg_weights[30];

++    /*!< avg_weights_shift[3] Avg layer weights fixed point value shift for each output channel*/

++    int32_t avg_weights_shift[3];

++    /*!< avg_biases[3] Avg layer biases*/

++    int32_t avg_biases[3];

++    /*!< avg_biases_shift_offset[3] Avg layer biases fixed point value shift offet compared with avg_weights_shift for each output channel*/

++    int32_t avg_biases_shift_offset[3];

++    /*!< avg_data_shift[3] Weighted averaging fixed point value shift for each output channel*/

++    int32_t avg_data_shift[3];

++    /*!< output_format_420 Output data format (0: YUV444; 1: YUV420. It will be forced to 1 if either ds_bypass or bypass is enabled)*/

++    int32_t output_format_420;

++    /*!< output_bpp_scale Bit precision scale of output data (1: 2bpp; 2: 4bpp; 3:8bpp)*/

++    int32_t output_bpp_scale;

++    /*!< metadata_avg_factor Division approximated factor for metadata average*/

++    int32_t metadata_avg_factor;

++    /*!< metadata_avg_shift Division approximated shift for metadata average*/

++    int32_t metadata_avg_shift;

++

++} ia_pal_isp_tvs_1_0_t;

++

++/*! \isp struct vcr_3_1

++

++*/

++typedef struct

++{

++    /*!< enable enables the filter (YUV420 --> RGB444)*/

++    int32_t enable;

++    /*!< nb1 offset 1 yuv2rgb conversion, rgb = m * yuv + nb*/

++    int32_t nb1;

++    /*!< nb2 offset 2 yuv2rgb conversion, rgb = m * yuv + nb*/

++    int32_t nb2;

++    /*!< nb3 offset 3 yuv2rgb conversion, rgb = m * yuv + nb*/

++    int32_t nb3;

++    /*!< yuv2rgb_matrix[9] yuv to rgb conversion matrix, S4.11*/

++    int32_t yuv2rgb_matrix[9];

++

++} ia_pal_isp_vcr_3_1_t;

++

++/*! \isp struct vcr3

++

++*/

++typedef struct

++{

++    /*!< bypass_0_1 Bypass VCR2*/

++    int32_t bypass_0_1;

++    /*!< input_format_420 0 - input 4:4:4 , 1 - input 4:2:0*/

++    int32_t input_format_420;

++

++} ia_pal_isp_vcr3_t;

++

++/*! \isp struct vcsc_2_0

++

++*/

++typedef struct

++{

++    /*!< csc_c_matrix_arr[9] CSC Matrix components (S0.15)*/

++    int32_t csc_c_matrix_arr[9];

++    /*!< csc_b_vec_arr[3] CSC Vector components (S0.15)*/

++    int32_t csc_b_vec_arr[3];

++    /*!< chroma_ds_coeff_arr[8] Chroma downsample 4x2 filter coefficients (U2.0)*/

++    int32_t chroma_ds_coeff_arr[8];

++    /*!< chroma_ds_nf Chroma downsample 4x2 filter normalization factor*/

++    int32_t chroma_ds_nf;

++    /*!< enable Bypassing CSC. Outputting RGB to the Chroma downscale*/

++    int32_t enable;

++    /*!< uv_bin_output 0 = YUV4:2:0 output, 1 = YUV4:2:2 output*/

++    int32_t uv_bin_output;

++

++} ia_pal_isp_vcsc_2_0_t;

++

++/*! \isp struct vertical_padding_1_0

++padding

++*/

++typedef struct

++{

++    /*!< padding_top lines padding top*/

++    int32_t padding_top;

++    /*!< padding_bottom lines padding bottom*/

++    int32_t padding_bottom;

++

++} ia_pal_isp_vertical_padding_1_0_t;

++

++/*! \isp struct vltm_1_0

++

++*/

++typedef struct

++{

++    /*!< bypass bypass*/

++    int32_t bypass;

++    /*!< alpha U4.12 boost factor*/

++    int32_t alpha;

++    /*!< alpha_shift_factor U4.0 shift_factor for fixed point conversion*/

++    int32_t alpha_shift_factor;

++    /*!< cu_vltm_x[6] U12.0 cu_vltm_x*/

++    int32_t cu_vltm_x[6];

++    /*!< cu_vltm_y[5] U12.0 cu_vltm_y*/

++    int32_t cu_vltm_y[5];

++    /*!< cu_vltm_slope[5] S.12.4 cu_vltm_slope (16 bits including sign)*/

++    int32_t cu_vltm_slope[5];

++

++} ia_pal_isp_vltm_1_0_t;

++

++/*! \isp struct wb_1_1

++

++*/

++typedef struct

++{

++    /*!< bypass Bypass            {0,1}*/

++    int32_t bypass;

++    /*!< gainch0 Gain Channel0 (Gr) (U8.12)*/

++    int32_t gainch0;

++    /*!< gainch1 Gain Channel1 (Gb) (U8.12)*/

++    int32_t gainch1;

++    /*!< gainch2 Gain Channel2 (G)  (U8.12)*/

++    int32_t gainch2;

++    /*!< gainch3 Gain Channel3 (B)  (U8.12)*/

++    int32_t gainch3;

++    /*!< gainch4 Gain Channel4 (R)  (U8.12)*/

++    int32_t gainch4;

++    /*!< gainch5 Gain Channel5 (W)  (U8.12)*/

++    int32_t gainch5;

++    /*!< gainch6 Gain Channel6 (U8.12)*/

++    int32_t gainch6;

++    /*!< gainch7 Gain Channel7 (U8.12)*/

++    int32_t gainch7;

++    /*!< sensormode Sensor CFA size: 1x1 (0), 2x2 (1), 4x4 (2)*/

++    int32_t sensormode;

++    /*!< wbindmat[16] Vector WB matrix*/

++    int32_t wbindmat[16];

++

++} ia_pal_isp_wb_1_1_t;

++

++/*! \isp struct wb_sis

++

++*/

++typedef struct

++{

++    /*!< m_bypass Bypass            {0,1}*/

++    int32_t m_bypass;

++    /*!< m_gainch0 Gain Channel0 (Gr) (U4.12)*/

++    int32_t m_gainch0;

++    /*!< m_gainch1 Gain Channel1 (Gb) (U4.12)*/

++    int32_t m_gainch1;

++    /*!< m_gainch2 Gain Channel2 (G)  (U4.12)*/

++    int32_t m_gainch2;

++    /*!< m_gainch3 Gain Channel3 (B)  (U4.12)*/

++    int32_t m_gainch3;

++    /*!< m_gainch4 Gain Channel4 (R)  (U4.12)*/

++    int32_t m_gainch4;

++    /*!< m_gainch5 Gain Channel5 (W)  (U4.12)*/

++    int32_t m_gainch5;

++    /*!< m_gainch6 Gain Channel6 (U4.12)*/

++    int32_t m_gainch6;

++    /*!< m_gainch7 Gain Channel7 (U4.12)*/

++    int32_t m_gainch7;

++    /*!< m_sensormode 1x1 (0), 2x2 (1), 4x4 (2)*/

++    int32_t m_sensormode;

++    /*!< m_wbindmat[16] Vector WB matrix*/

++    int32_t m_wbindmat[16];

++

++} ia_pal_isp_wb_sis_t;

++

++/*! \isp struct x2i_md_1_0

++Monocular Depth

++*/

++typedef struct

++{

++    /*!< bypass by pass*/

++    int32_t bypass;

++    /*!< ver_bin_bypass bypass vertical binning when input is 2x4 PDAF*/

++    int32_t ver_bin_bypass;

++    /*!< bin_only do binning only and not calculate depth information*/

++    int32_t bin_only;

++    /*!< depth_map_bypass bypass depth map generation*/

++    int32_t depth_map_bypass;

++    /*!< bayer2y_bypass bypass bayer2y estimation when input is single channel phase disparity*/

++    int32_t bayer2y_bypass;

++    /*!< is_sve is input sve signal? If not, use simple Y computation; otherwise, use special Y computation*/

++    int32_t is_sve;

++    /*!< ver_bin_by_averaging whether to do vertical binning by averaging (0: by adding; 1: by averaging)*/

++    int32_t ver_bin_by_averaging;

++    /*!< hor_bin_by_averaging whether to do horizontal binning by averaging (0: by adding; 1: by averaging)*/

++    int32_t hor_bin_by_averaging;

++    /*!< win_width sliding window width for SAD computation*/

++    int32_t win_width;

++    /*!< min_shift minimum possible phase shift that estimation process will search*/

++    int32_t min_shift;

++    /*!< max_shift maximum possible phase shift that estimation process will search*/

++    int32_t max_shift;

++    /*!< shift_steps phase shift candidate steps*/

++    int32_t shift_steps;

++    /*!< y_compute_weights[16] Weights for y computation 3x3 filter (row by row, 6th, 7th, 8th, 10th, 11th, 12th, 14th, 15th, and 16th elements are used) in 2PD/4PD mode or 4x4 filter (row by row) in SVE mode. Sum of weights should be power of 2.*/

++    int32_t y_compute_weights[16];

++    /*!< y_compute_shift_0 shift scale of weight value for y computation at first stage  (the shift before saving to local buffer). The bit precision in local buffer is S18.*/

++    int32_t y_compute_shift_0;

++    /*!< y_compute_shift_1 shift scale of weight value for y computation at second stage (the shift before outputing final value)*/

++    int32_t y_compute_shift_1;

++    /*!< min_depth minimum depth showed in depth map (uint: mm) for visualization purpose*/

++    int32_t min_depth;

++    /*!< max_depth maximum depth showed in depth map (uint: mm) for visualization purpose*/

++    int32_t max_depth;

++    /*!< mono_radius number of neighbors at each side of SAD minimum point is monotonously increasing to be regarded as valid estimation result*/

++    int32_t mono_radius;

++    /*!< sad_diff_thresh_scale local SAD difference threshold dividing factor of power 2*/

++    int32_t sad_diff_thresh_scale;

++    /*!< min_sad_diff_thresh minimum SAD difference threshold to be considered as valid point*/

++    int32_t min_sad_diff_thresh;

++    /*!< max_sad_diff_thresh maximum SAD difference threshold to be considered as valid point*/

++    int32_t max_sad_diff_thresh;

++    /*!< interp_div_value_shift shift scale of division result used in equi-angle v interpolation*/

++    int32_t interp_div_value_shift;

++    /*!< vcm_value_shift shift scale of VCM value*/

++    int32_t vcm_value_shift;

++    /*!< phase_vcm_mapping_grid_width grid width of phase shift vs VCM mapping slope table in power of 2*/

++    int32_t phase_vcm_mapping_grid_width;

++    /*!< phase_vcm_mapping_grid_height grid height of phase shift vs VCM mapping slope table in power of 2*/

++    int32_t phase_vcm_mapping_grid_height;

++    /*!< phase_vcm_mapping_grid_block_num_hor horizontal block number in grid of phase shift vs VCM mapping slope table*/

++    int32_t phase_vcm_mapping_grid_block_num_hor;

++    /*!< phase_vcm_mapping_grid_block_num_ver vertical block number in grid of phase shift vs VCM mapping slope table*/

++    int32_t phase_vcm_mapping_grid_block_num_ver;

++    /*!< phase_vcm_mapping_slope[256] phase shift vs VCM mapping slope table*/

++    int32_t phase_vcm_mapping_slope[256];

++    /*!< current_vcm current VCM value*/

++    int32_t current_vcm;

++    /*!< phase_value_shift shift scale of phase shift value*/

++    int32_t phase_value_shift;

++    /*!< depth_lut_size size of depth look-up table*/

++    int32_t depth_lut_size;

++    /*!< depth_lutbase_levels[2] base levels of depth look-up table*/

++    int32_t depth_lutbase_levels[2];

++    /*!< depth_lut_start_bins[2] number of bins in depth look-up table*/

++    int32_t depth_lut_start_bins[2];

++    /*!< depth_lut_steps[2] step sizes of bins in depth look-up table in power of 2*/

++    int32_t depth_lut_steps[2];

++    /*!< depth_lut_values[187] value of depth look-up tables*/

++    int32_t depth_lut_values[187];

++

++} ia_pal_isp_x2i_md_1_0_t;

++

++/*! \isp struct xnr_5_1

++Low Frequency Chroma Denoiser

++*/

++typedef struct

++{

++    /*!< top_frame_width XNR5 input frame width*/

++    int32_t top_frame_width;

++    /*!< top_frame_height XNR5 input frame height*/

++    int32_t top_frame_height;

++    /*!< top_xnr_bypass Bypass entire xnr*/

++    int32_t top_xnr_bypass;

++    /*!< vhf_frame_width XNR5 input frame width*/

++    int32_t vhf_frame_width;

++    /*!< vhf_frame_height XNR5 input frame height*/

++    int32_t vhf_frame_height;

++    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t vhf_low_band_disable;

++    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t vhf_low_band_only;

++    /*!< hf_frame_width XNR5 input frame width*/

++    int32_t hf_frame_width;

++    /*!< hf_frame_height XNR5 input frame height*/

++    int32_t hf_frame_height;

++    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t hf_low_band_disable;

++    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t hf_low_band_only;

++    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t hf_nr_bypass;

++    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t hf_se_bypass;

++    /*!< hf_se_bypass_val SE bypass value*/

++    int32_t hf_se_bypass_val;

++    /*!< mf_frame_width XNR5 input frame width*/

++    int32_t mf_frame_width;

++    /*!< mf_frame_height XNR5 input frame height*/

++    int32_t mf_frame_height;

++    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t mf_low_band_disable;

++    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t mf_low_band_only;

++    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t mf_nr_bypass;

++    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t mf_se_bypass;

++    /*!< mf_se_bypass_val SE bypass value*/

++    int32_t mf_se_bypass_val;

++    /*!< lf_frame_width XNR5 input frame width*/

++    int32_t lf_frame_width;

++    /*!< lf_frame_height XNR5 input frame height*/

++    int32_t lf_frame_height;

++    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t lf_low_band_disable;

++    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t lf_low_band_only;

++    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t lf_nr_bypass;

++    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t lf_se_bypass;

++    /*!< lf_se_bypass_val SE bypass value*/

++    int32_t lf_se_bypass_val;

++    /*!< vlf_frame_width XNR5 input frame width*/

++    int32_t vlf_frame_width;

++    /*!< vlf_frame_height XNR5 input frame height*/

++    int32_t vlf_frame_height;

++    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t vlf_low_band_disable;

++    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t vlf_low_band_only;

++    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t vlf_nr_bypass;

++    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t vlf_se_bypass;

++    /*!< vlf_se_bypass_val SE bypass value*/

++    int32_t vlf_se_bypass_val;

++    /*!< Bypass Deprecated bypass parameter - to be removed!*/

++    int32_t Bypass;

++    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/

++    int32_t top_viir_coefs_b[3];

++    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/

++    int32_t top_viir_coefs_a[2];

++    /*!< top_viir_offset Param_Top_VIIR_offset*/

++    int32_t top_viir_offset;

++    /*!< top_viir_alpha Param_Top_VIIR_alpha*/

++    int32_t top_viir_alpha;

++    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/

++    int32_t top_hus_vlf_image_coefs[9];

++    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/

++    int32_t top_hus_vlf_delta_coefs[9];

++    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/

++    int32_t top_hus_lf_image_coefs[5];

++    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/

++    int32_t top_hus_lf_delta_coefs[5];

++    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/

++    int32_t top_hus_mf_image_coefs[5];

++    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/

++    int32_t top_hus_mf_delta_coefs[5];

++    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/

++    int32_t hf_blf_2dfir_filter_length;

++    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/

++    int32_t hf_blf_2dfir_dcdc_bypass_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;

++    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/

++    int32_t hf_blf_2dfir_dcdc_bypass_uv;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;

++    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/

++    int32_t hf_blf_colorspace;

++    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_y_wbg;

++    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_u_wbg;

++    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_v_wbg;

++    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t hf_blf_noisemodel_weight_uv_y;

++    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t hf_blf_noisemodel_weight_uv_u;

++    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t hf_blf_noisemodel_weight_uv_v;

++    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t hf_blf_noisemodel_radialdependent_bypass;

++    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/

++    int32_t hf_blf_noisemodel_colordependent_bypass;

++    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t hf_blf_noisemodel_graydependent_bypass;

++    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t hf_blf_noisemodel_radialdependent_x0_square;

++    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/

++    int32_t hf_blf_noisemodel_radialdependent_x0;

++    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t hf_blf_noisemodel_radialdependent_y0_square;

++    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/

++    int32_t hf_blf_noisemodel_radialdependent_y0;

++    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/

++    int32_t hf_blf_noisemodel_colordependent_a[32];

++    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/

++    int32_t hf_blf_noisemodel_colordependent_b[32];

++    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/

++    int32_t hf_blf_noisemodel_colordependent_c[32];

++    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t hf_blf_noisemodel_colordependent_norm_offset;

++    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t hf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t hf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t hf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t hf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/

++    int32_t hf_blf_noisemodel_normfactor_uv_y;

++    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/

++    int32_t hf_blf_noisemodel_normfactor_uv_u;

++    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/

++    int32_t hf_blf_noisemodel_normfactor_uv_v;

++    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/

++    int32_t hf_blf_snrm_bypass;

++    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/

++    int32_t hf_blf_snrm_slope_uv;

++    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/

++    int32_t hf_blf_snrm_xoffset_uv;

++    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/

++    int32_t hf_blf_snrm_maxval_uv;

++    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/

++    int32_t hf_blf_snrm_minval_uv;

++    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/

++    int32_t hf_afc_bypass;

++    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/

++    int32_t hf_afc_weight_snr;

++    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/

++    int32_t hf_afc_weight_chroma;

++    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/

++    int32_t hf_min_distance_clamp;

++    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/

++    int32_t mf_blf_2dfir_filter_length;

++    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/

++    int32_t mf_blf_2dfir_luma_coefs[10];

++    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/

++    int32_t mf_blf_2dfir_luma_denom_bits;

++    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/

++    int32_t mf_blf_2dfir_dcdc_bypass_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;

++    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/

++    int32_t mf_blf_2dfir_dcdc_bypass_uv;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;

++    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/

++    int32_t mf_blf_2dfir_bypass_snr_y;

++    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/

++    int32_t mf_blf_colorspace;

++    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_y_wbg;

++    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_u_wbg;

++    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_v_wbg;

++    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t mf_blf_noisemodel_weight_y_y;

++    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t mf_blf_noisemodel_weight_y_u;

++    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t mf_blf_noisemodel_weight_y_v;

++    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t mf_blf_noisemodel_weight_uv_y;

++    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t mf_blf_noisemodel_weight_uv_u;

++    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t mf_blf_noisemodel_weight_uv_v;

++    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t mf_blf_noisemodel_radialdependent_bypass;

++    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t mf_blf_noisemodel_colordependent_bypass;

++    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t mf_blf_noisemodel_graydependent_bypass;

++    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t mf_blf_noisemodel_radialdependent_x0_square;

++    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t mf_blf_noisemodel_radialdependent_x0;

++    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t mf_blf_noisemodel_radialdependent_y0_square;

++    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t mf_blf_noisemodel_radialdependent_y0;

++    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/

++    int32_t mf_blf_noisemodel_colordependent_a[32];

++    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/

++    int32_t mf_blf_noisemodel_colordependent_b[32];

++    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/

++    int32_t mf_blf_noisemodel_colordependent_c[32];

++    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t mf_blf_noisemodel_colordependent_norm_offset;

++    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t mf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t mf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t mf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t mf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/

++    int32_t mf_blf_noisemodel_normfactor_y_y;

++    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/

++    int32_t mf_blf_noisemodel_normfactor_y_u;

++    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/

++    int32_t mf_blf_noisemodel_normfactor_y_v;

++    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t mf_blf_noisemodel_normfactor_uv_y;

++    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t mf_blf_noisemodel_normfactor_uv_u;

++    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t mf_blf_noisemodel_normfactor_uv_v;

++    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/

++    int32_t mf_blf_snrm_bypass;

++    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/

++    int32_t mf_blf_snrm_bypass_y;

++    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/

++    int32_t mf_blf_snrm_slope_y;

++    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/

++    int32_t mf_blf_snrm_xoffset_y;

++    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/

++    int32_t mf_blf_snrm_maxval_y;

++    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/

++    int32_t mf_blf_snrm_minval_y;

++    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/

++    int32_t mf_blf_snrm_slope_uv;

++    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/

++    int32_t mf_blf_snrm_xoffset_uv;

++    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/

++    int32_t mf_blf_snrm_maxval_uv;

++    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/

++    int32_t mf_blf_snrm_minval_uv;

++    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/

++    int32_t mf_afc_bypass;

++    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/

++    int32_t mf_afc_weight_snr;

++    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/

++    int32_t mf_afc_weight_chroma;

++    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/

++    int32_t mf_min_distance_clamp;

++    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/

++    int32_t lf_blf_fir_filter_length;

++    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/

++    int32_t lf_blf_fir_luma_coefs[6];

++    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/

++    int32_t lf_blf_fir_luma_denom_bits;

++    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/

++    int32_t lf_blf_fir_bypass_snr_y;

++    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/

++    int32_t lf_blf_colorspace;

++    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_y_wbg;

++    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_u_wbg;

++    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_v_wbg;

++    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t lf_blf_noisemodel_weight_y_y;

++    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t lf_blf_noisemodel_weight_y_u;

++    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t lf_blf_noisemodel_weight_y_v;

++    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t lf_blf_noisemodel_weight_uv_y;

++    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t lf_blf_noisemodel_weight_uv_u;

++    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t lf_blf_noisemodel_weight_uv_v;

++    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t lf_blf_noisemodel_radialdependent_bypass;

++    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t lf_blf_noisemodel_colordependent_bypass;

++    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t lf_blf_noisemodel_graydependent_bypass;

++    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t lf_blf_noisemodel_radialdependent_x0_square;

++    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t lf_blf_noisemodel_radialdependent_x0;

++    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t lf_blf_noisemodel_radialdependent_y0_square;

++    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t lf_blf_noisemodel_radialdependent_y0;

++    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/

++    int32_t lf_blf_noisemodel_colordependent_a[32];

++    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/

++    int32_t lf_blf_noisemodel_colordependent_b[32];

++    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/

++    int32_t lf_blf_noisemodel_colordependent_c[32];

++    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t lf_blf_noisemodel_colordependent_norm_offset;

++    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t lf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t lf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t lf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t lf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/

++    int32_t lf_blf_noisemodel_normfactor_y_y;

++    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/

++    int32_t lf_blf_noisemodel_normfactor_y_u;

++    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/

++    int32_t lf_blf_noisemodel_normfactor_y_v;

++    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t lf_blf_noisemodel_normfactor_uv_y;

++    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t lf_blf_noisemodel_normfactor_uv_u;

++    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t lf_blf_noisemodel_normfactor_uv_v;

++    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/

++    int32_t lf_blf_snrm_bypass;

++    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/

++    int32_t lf_blf_snrm_bypass_y;

++    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/

++    int32_t lf_blf_snrm_slope_y;

++    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/

++    int32_t lf_blf_snrm_xoffset_y;

++    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/

++    int32_t lf_blf_snrm_maxval_y;

++    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/

++    int32_t lf_blf_snrm_minval_y;

++    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/

++    int32_t lf_blf_snrm_slope_uv;

++    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/

++    int32_t lf_blf_snrm_xoffset_uv;

++    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/

++    int32_t lf_blf_snrm_maxval_uv;

++    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/

++    int32_t lf_blf_snrm_minval_uv;

++    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/

++    int32_t lf_blf_iir_alpha_y;

++    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/

++    int32_t lf_blf_iir_alpha_uv;

++    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/

++    int32_t lf_cs_bypass;

++    /*!< lf_cs_coef Param_LF_CS_coef*/

++    int32_t lf_cs_coef;

++    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/

++    int32_t lf_min_distance_clamp;

++    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/

++    int32_t vlf_blf_fir_filter_length;

++    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/

++    int32_t vlf_blf_fir_luma_coefs[6];

++    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/

++    int32_t vlf_blf_fir_luma_denom_bits;

++    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/

++    int32_t vlf_blf_fir_bypass_snr_y;

++    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/

++    int32_t vlf_blf_colorspace;

++    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_y_wbg;

++    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_u_wbg;

++    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_v_wbg;

++    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t vlf_blf_noisemodel_weight_y_y;

++    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t vlf_blf_noisemodel_weight_y_u;

++    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t vlf_blf_noisemodel_weight_y_v;

++    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t vlf_blf_noisemodel_weight_uv_y;

++    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t vlf_blf_noisemodel_weight_uv_u;

++    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t vlf_blf_noisemodel_weight_uv_v;

++    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t vlf_blf_noisemodel_radialdependent_bypass;

++    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t vlf_blf_noisemodel_colordependent_bypass;

++    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t vlf_blf_noisemodel_radialdependent_x0_square;

++    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t vlf_blf_noisemodel_radialdependent_x0;

++    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t vlf_blf_noisemodel_radialdependent_y0_square;

++    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t vlf_blf_noisemodel_radialdependent_y0;

++    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/

++    int32_t vlf_blf_noisemodel_colordependent_a[32];

++    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/

++    int32_t vlf_blf_noisemodel_colordependent_b[32];

++    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/

++    int32_t vlf_blf_noisemodel_colordependent_c[32];

++    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t vlf_blf_noisemodel_colordependent_norm_offset;

++    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/

++    int32_t vlf_blf_noisemodel_normfactor_y_y;

++    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/

++    int32_t vlf_blf_noisemodel_normfactor_y_u;

++    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/

++    int32_t vlf_blf_noisemodel_normfactor_y_v;

++    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_y;

++    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_u;

++    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_v;

++    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/

++    int32_t vlf_blf_iir_alpha_y;

++    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/

++    int32_t vlf_blf_iir_alpha_uv;

++    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/

++    int32_t vlf_cs_bypass;

++    /*!< vlf_cs_coef Param_VLF_CS_coef*/

++    int32_t vlf_cs_coef;

++    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/

++    int32_t vlf_min_distance_clamp;

++    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t vhf_blf_noisemodel_basefunc_y_wbg;

++    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t vhf_blf_noisemodel_weight_y_y;

++    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t vhf_blf_noisemodel_radialdependent_bypass;

++    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t vhf_blf_noisemodel_radialdependent_x0_square;

++    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t vhf_blf_noisemodel_radialdependent_x0;

++    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t vhf_blf_noisemodel_radialdependent_y0_square;

++    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t vhf_blf_noisemodel_radialdependent_y0;

++    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/

++    int32_t vhf_blf_noisemodel_normfactor_y_y;

++    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/

++    int32_t vhf_blf_bypass;

++    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/

++    int32_t vhf_min_distance_clamp;

++

++} ia_pal_isp_xnr_5_1_t;

++

++/*! \isp struct xnr_5_2

++Low Frequency Chroma Denoiser

++*/

++typedef struct

++{

++    /*!< top_frame_width XNR5 input frame width*/

++    int32_t top_frame_width;

++    /*!< top_frame_height XNR5 input frame height*/

++    int32_t top_frame_height;

++    /*!< top_xnr_bypass Bypass entire xnr*/

++    int32_t top_xnr_bypass;

++    /*!< vhf_frame_width XNR5 input frame width*/

++    int32_t vhf_frame_width;

++    /*!< vhf_frame_height XNR5 input frame height*/

++    int32_t vhf_frame_height;

++    /*!< vhf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t vhf_low_band_disable;

++    /*!< vhf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t vhf_low_band_only;

++    /*!< hf_frame_width XNR5 input frame width*/

++    int32_t hf_frame_width;

++    /*!< hf_frame_height XNR5 input frame height*/

++    int32_t hf_frame_height;

++    /*!< hf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t hf_low_band_disable;

++    /*!< hf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t hf_low_band_only;

++    /*!< hf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t hf_nr_bypass;

++    /*!< hf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t hf_se_bypass;

++    /*!< hf_se_bypass_val SE bypass value*/

++    int32_t hf_se_bypass_val;

++    /*!< mf_frame_width XNR5 input frame width*/

++    int32_t mf_frame_width;

++    /*!< mf_frame_height XNR5 input frame height*/

++    int32_t mf_frame_height;

++    /*!< mf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t mf_low_band_disable;

++    /*!< mf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t mf_low_band_only;

++    /*!< mf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t mf_nr_bypass;

++    /*!< mf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t mf_se_bypass;

++    /*!< mf_se_bypass_val SE bypass value*/

++    int32_t mf_se_bypass_val;

++    /*!< lf_frame_width XNR5 input frame width*/

++    int32_t lf_frame_width;

++    /*!< lf_frame_height XNR5 input frame height*/

++    int32_t lf_frame_height;

++    /*!< lf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t lf_low_band_disable;

++    /*!< lf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t lf_low_band_only;

++    /*!< lf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t lf_nr_bypass;

++    /*!< lf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t lf_se_bypass;

++    /*!< lf_se_bypass_val SE bypass value*/

++    int32_t lf_se_bypass_val;

++    /*!< vlf_frame_width XNR5 input frame width*/

++    int32_t vlf_frame_width;

++    /*!< vlf_frame_height XNR5 input frame height*/

++    int32_t vlf_frame_height;

++    /*!< vlf_low_band_disable Lower band is disabled and zero on inputs*/

++    int32_t vlf_low_band_disable;

++    /*!< vlf_low_band_only Lower band directly goes to output and other inputs are zeroes*/

++    int32_t vlf_low_band_only;

++    /*!< vlf_nr_bypass Input YUV goes directly to output after vertical delay*/

++    int32_t vlf_nr_bypass;

++    /*!< vlf_se_bypass Replace all SE outputs with se_bypass_val*/

++    int32_t vlf_se_bypass;

++    /*!< vlf_se_bypass_val SE bypass value*/

++    int32_t vlf_se_bypass_val;

++    /*!< Bypass Deprecated bypass parameter - to be removed!*/

++    int32_t Bypass;

++    /*!< top_viir_coefs_b[3] Param_Top_VIIR_b*/

++    int32_t top_viir_coefs_b[3];

++    /*!< top_viir_coefs_a[2] Param_Top_VIIR_a*/

++    int32_t top_viir_coefs_a[2];

++    /*!< top_viir_offset Param_Top_VIIR_offset*/

++    int32_t top_viir_offset;

++    /*!< top_viir_alpha Param_Top_VIIR_alpha*/

++    int32_t top_viir_alpha;

++    /*!< top_hus_vlf_image_coefs[9] Param_Top_HUS_VLF_Image_func*/

++    int32_t top_hus_vlf_image_coefs[9];

++    /*!< top_hus_vlf_delta_coefs[9] Param_Top_HUS_VLF_Delta_func*/

++    int32_t top_hus_vlf_delta_coefs[9];

++    /*!< top_hus_lf_image_coefs[5] Param_Top_HUS_LF_Image_func*/

++    int32_t top_hus_lf_image_coefs[5];

++    /*!< top_hus_lf_delta_coefs[5] Param_Top_HUS_LF_Delta_func*/

++    int32_t top_hus_lf_delta_coefs[5];

++    /*!< top_hus_mf_image_coefs[5] Param_Top_HUS_MF_Image_func*/

++    int32_t top_hus_mf_image_coefs[5];

++    /*!< top_hus_mf_delta_coefs[5] Param_Top_HUS_MF_Delta_func*/

++    int32_t top_hus_mf_delta_coefs[5];

++    /*!< hf_blf_2dfir_filter_length Param_HFC_BLF_FIR_BfLen*/

++    int32_t hf_blf_2dfir_filter_length;

++    /*!< hf_blf_2dfir_dcdc_bypass_y Param_HFC_BLF_FIR_bypassDCDifferentialCompensationY*/

++    int32_t hf_blf_2dfir_dcdc_bypass_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_y Param_HFC_BLF_FIR_DCDiffThYy*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_u Param_HFC_BLF_FIR_DCDiffThYu*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_u;

++    /*!< hf_blf_2dfir_dcdc_thresh_y_v Param_HFC_BLF_FIR_DCDiffThYv*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_y_v;

++    /*!< hf_blf_2dfir_dcdc_bypass_uv Param_HFC_BLF_FIR_bypassDCDifferentialCompensationUV*/

++    int32_t hf_blf_2dfir_dcdc_bypass_uv;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_y Param_HFC_BLF_FIR_DCDiffThUVy*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_y;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_u Param_HFC_BLF_FIR_DCDiffThUVu*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_u;

++    /*!< hf_blf_2dfir_dcdc_thresh_uv_v Param_HFC_BLF_FIR_DCDiffThUVv*/

++    uint32_t hf_blf_2dfir_dcdc_thresh_uv_v;

++    /*!< hf_blf_colorspace Param_HFC_BLF_colorspaceYRB*/

++    int32_t hf_blf_colorspace;

++    /*!< hf_blf_noisemodel_basefunc_y_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Y*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_a_slope[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_A_Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_y_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_y_wbg Param_HFC_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_y_wbg;

++    /*!< hf_blf_noisemodel_basefunc_u_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_u_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_u_wbg Param_HFC_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_u_wbg;

++    /*!< hf_blf_noisemodel_basefunc_v_a_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_a_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_b_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_b_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_c_x[5] Param_HFC_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< hf_blf_noisemodel_basefunc_v_c_y[4] Param_HFC_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< hf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t hf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< hf_blf_noisemodel_basefunc_v_wbg Param_HFC_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t hf_blf_noisemodel_basefunc_v_wbg;

++    /*!< hf_blf_noisemodel_weight_uv_y Param_HFC_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t hf_blf_noisemodel_weight_uv_y;

++    /*!< hf_blf_noisemodel_weight_uv_u Param_HFC_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t hf_blf_noisemodel_weight_uv_u;

++    /*!< hf_blf_noisemodel_weight_uv_v Param_HFC_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t hf_blf_noisemodel_weight_uv_v;

++    /*!< hf_blf_noisemodel_radialdependent_bypass Param_HFC_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t hf_blf_noisemodel_radialdependent_bypass;

++    /*!< hf_blf_noisemodel_colordependent_bypass Param_HFC_BLF_NoiseModel_bypassColorDependent*/

++    int32_t hf_blf_noisemodel_colordependent_bypass;

++    /*!< hf_blf_noisemodel_graydependent_bypass Param_HFC_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t hf_blf_noisemodel_graydependent_bypass;

++    /*!< hf_blf_noisemodel_radialdependent_x0_square Param_HFC_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t hf_blf_noisemodel_radialdependent_x0_square;

++    /*!< hf_blf_noisemodel_radialdependent_x0 Param_HFC_BLF_NoiseModel_radialDependent_x0*/

++    int32_t hf_blf_noisemodel_radialdependent_x0;

++    /*!< hf_blf_noisemodel_radialdependent_y0_square Param_HFC_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t hf_blf_noisemodel_radialdependent_y0_square;

++    /*!< hf_blf_noisemodel_radialdependent_y0 Param_HFC_BLF_NoiseModel_radialDependent_y0*/

++    int32_t hf_blf_noisemodel_radialdependent_y0;

++    /*!< hf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_HFC_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t hf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< hf_blf_noisemodel_radialdependent_gain_x[4] Param_HFC_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< hf_blf_noisemodel_radialdependent_gain_y[3] Param_HFC_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< hf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t hf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< hf_blf_noisemodel_colordependent_a[32] Param_HFC_BLF_NoiseModel_colorDependent_A*/

++    int32_t hf_blf_noisemodel_colordependent_a[32];

++    /*!< hf_blf_noisemodel_colordependent_b[32] Param_HFC_BLF_NoiseModel_colorDependent_B*/

++    int32_t hf_blf_noisemodel_colordependent_b[32];

++    /*!< hf_blf_noisemodel_colordependent_c[32] Param_HFC_BLF_NoiseModel_colorDependent_C*/

++    int32_t hf_blf_noisemodel_colordependent_c[32];

++    /*!< hf_blf_noisemodel_colordependent_norm_offset Param_HFC_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t hf_blf_noisemodel_colordependent_norm_offset;

++    /*!< hf_blf_noisemodel_colordependent_gain_x[6] Param_HFC_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t hf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< hf_blf_noisemodel_colordependent_gain_y[5] Param_HFC_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t hf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< hf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t hf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< hf_blf_noisemodel_graydependent_graylevel_thresh Param_HFC_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t hf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< hf_blf_noisemodel_graydependent_graylevel_slope Param_HFC_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t hf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< hf_blf_noisemodel_graydependent_gain_x[6] Param_HFC_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t hf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< hf_blf_noisemodel_graydependent_gain_y[5] Param_HFC_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t hf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< hf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t hf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< hf_blf_noisemodel_normfactor_uv_y Param_HFC_BLF_NoiseModel_invSigmaUVy*/

++    int32_t hf_blf_noisemodel_normfactor_uv_y;

++    /*!< hf_blf_noisemodel_normfactor_uv_u Param_HFC_BLF_NoiseModel_invSigmaUVu*/

++    int32_t hf_blf_noisemodel_normfactor_uv_u;

++    /*!< hf_blf_noisemodel_normfactor_uv_v Param_HFC_BLF_NoiseModel_invSigmaUVv*/

++    int32_t hf_blf_noisemodel_normfactor_uv_v;

++    /*!< hf_blf_snrm_bypass Param_HFC_BLF_SNRM_bypassSNRManagement*/

++    int32_t hf_blf_snrm_bypass;

++    /*!< hf_blf_snrm_slope_uv Param_HFC_BLF_SNRM_slopeUV*/

++    int32_t hf_blf_snrm_slope_uv;

++    /*!< hf_blf_snrm_xoffset_uv Param_HFC_BLF_SNRM_xoffsetUV*/

++    int32_t hf_blf_snrm_xoffset_uv;

++    /*!< hf_blf_snrm_maxval_uv Param_HFC_BLF_SNRM_maxValUV*/

++    int32_t hf_blf_snrm_maxval_uv;

++    /*!< hf_blf_snrm_minval_uv Param_HFC_BLF_SNRM_minValUV*/

++    int32_t hf_blf_snrm_minval_uv;

++    /*!< hf_afc_bypass Param_HFC_AFC_bypassAntiFalseColor*/

++    int32_t hf_afc_bypass;

++    /*!< hf_afc_weight_snr Param_HFC_AFC_wgtSnr*/

++    int32_t hf_afc_weight_snr;

++    /*!< hf_afc_weight_chroma Param_HFC_AFC_wgtC*/

++    int32_t hf_afc_weight_chroma;

++    /*!< hf_min_distance_clamp Param_HFC_min_distance_clamp*/

++    int32_t hf_min_distance_clamp;

++    /*!< mf_blf_2dfir_filter_length Param_MF_BLF_FIR_BfLen*/

++    int32_t mf_blf_2dfir_filter_length;

++    /*!< mf_blf_2dfir_luma_coefs[10] Param_MF_BLF_FIR_Kn_coef*/

++    int32_t mf_blf_2dfir_luma_coefs[10];

++    /*!< mf_blf_2dfir_luma_denom_bits Param_MF_BLF_FIR_Kn_denom_bits*/

++    int32_t mf_blf_2dfir_luma_denom_bits;

++    /*!< mf_blf_2dfir_dcdc_bypass_y Param_MF_BLF_FIR_bypassDCDifferentialCompensationY*/

++    int32_t mf_blf_2dfir_dcdc_bypass_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_y Param_MF_BLF_FIR_DCDiffThYy*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_u Param_MF_BLF_FIR_DCDiffThYu*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_u;

++    /*!< mf_blf_2dfir_dcdc_thresh_y_v Param_MF_BLF_FIR_DCDiffThYv*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_y_v;

++    /*!< mf_blf_2dfir_dcdc_bypass_uv Param_MF_BLF_FIR_bypassDCDifferentialCompensationUV*/

++    int32_t mf_blf_2dfir_dcdc_bypass_uv;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_y Param_MF_BLF_FIR_DCDiffThUVy*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_y;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_u Param_MF_BLF_FIR_DCDiffThUVu*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_u;

++    /*!< mf_blf_2dfir_dcdc_thresh_uv_v Param_MF_BLF_FIR_DCDiffThUVv*/

++    uint32_t mf_blf_2dfir_dcdc_thresh_uv_v;

++    /*!< mf_blf_2dfir_bypass_snr_y Param_MF_BLF_FIR_bypasssSnrY*/

++    int32_t mf_blf_2dfir_bypass_snr_y;

++    /*!< mf_blf_colorspace Param_MF_BLF_colorspaceYRB*/

++    int32_t mf_blf_colorspace;

++    /*!< mf_blf_noisemodel_basefunc_y_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_y_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_y_wbg Param_MF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_y_wbg;

++    /*!< mf_blf_noisemodel_basefunc_u_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_u_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_u_wbg Param_MF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_u_wbg;

++    /*!< mf_blf_noisemodel_basefunc_v_a_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_a_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_b_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_b_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_c_x[5] Param_MF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< mf_blf_noisemodel_basefunc_v_c_y[4] Param_MF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< mf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t mf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< mf_blf_noisemodel_basefunc_v_wbg Param_MF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t mf_blf_noisemodel_basefunc_v_wbg;

++    /*!< mf_blf_noisemodel_weight_y_y Param_MF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t mf_blf_noisemodel_weight_y_y;

++    /*!< mf_blf_noisemodel_weight_y_u Param_MF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t mf_blf_noisemodel_weight_y_u;

++    /*!< mf_blf_noisemodel_weight_y_v Param_MF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t mf_blf_noisemodel_weight_y_v;

++    /*!< mf_blf_noisemodel_weight_uv_y Param_MF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t mf_blf_noisemodel_weight_uv_y;

++    /*!< mf_blf_noisemodel_weight_uv_u Param_MF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t mf_blf_noisemodel_weight_uv_u;

++    /*!< mf_blf_noisemodel_weight_uv_v Param_MF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t mf_blf_noisemodel_weight_uv_v;

++    /*!< mf_blf_noisemodel_radialdependent_bypass Param_MF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t mf_blf_noisemodel_radialdependent_bypass;

++    /*!< mf_blf_noisemodel_colordependent_bypass Param_MF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t mf_blf_noisemodel_colordependent_bypass;

++    /*!< mf_blf_noisemodel_graydependent_bypass Param_MF_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t mf_blf_noisemodel_graydependent_bypass;

++    /*!< mf_blf_noisemodel_radialdependent_x0_square Param_MF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t mf_blf_noisemodel_radialdependent_x0_square;

++    /*!< mf_blf_noisemodel_radialdependent_x0 Param_MF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t mf_blf_noisemodel_radialdependent_x0;

++    /*!< mf_blf_noisemodel_radialdependent_y0_square Param_MF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t mf_blf_noisemodel_radialdependent_y0_square;

++    /*!< mf_blf_noisemodel_radialdependent_y0 Param_MF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t mf_blf_noisemodel_radialdependent_y0;

++    /*!< mf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_MF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t mf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< mf_blf_noisemodel_radialdependent_gain_x[4] Param_MF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< mf_blf_noisemodel_radialdependent_gain_y[3] Param_MF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< mf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t mf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< mf_blf_noisemodel_colordependent_a[32] Param_MF_BLF_NoiseModel_colorDependent_A*/

++    int32_t mf_blf_noisemodel_colordependent_a[32];

++    /*!< mf_blf_noisemodel_colordependent_b[32] Param_MF_BLF_NoiseModel_colorDependent_B*/

++    int32_t mf_blf_noisemodel_colordependent_b[32];

++    /*!< mf_blf_noisemodel_colordependent_c[32] Param_MF_BLF_NoiseModel_colorDependent_C*/

++    int32_t mf_blf_noisemodel_colordependent_c[32];

++    /*!< mf_blf_noisemodel_colordependent_norm_offset Param_MF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t mf_blf_noisemodel_colordependent_norm_offset;

++    /*!< mf_blf_noisemodel_colordependent_gain_x[6] Param_MF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t mf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< mf_blf_noisemodel_colordependent_gain_y[5] Param_MF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t mf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< mf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t mf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< mf_blf_noisemodel_graydependent_graylevel_thresh Param_MF_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t mf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< mf_blf_noisemodel_graydependent_graylevel_slope Param_MF_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t mf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< mf_blf_noisemodel_graydependent_gain_x[6] Param_MF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t mf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< mf_blf_noisemodel_graydependent_gain_y[5] Param_MF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t mf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< mf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t mf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< mf_blf_noisemodel_normfactor_y_y Param_MF_BLF_NoiseModel_invSigmaYy*/

++    int32_t mf_blf_noisemodel_normfactor_y_y;

++    /*!< mf_blf_noisemodel_normfactor_y_u Param_MF_BLF_NoiseModel_invSigmaYu*/

++    int32_t mf_blf_noisemodel_normfactor_y_u;

++    /*!< mf_blf_noisemodel_normfactor_y_v Param_MF_BLF_NoiseModel_invSigmaYv*/

++    int32_t mf_blf_noisemodel_normfactor_y_v;

++    /*!< mf_blf_noisemodel_normfactor_uv_y Param_MF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t mf_blf_noisemodel_normfactor_uv_y;

++    /*!< mf_blf_noisemodel_normfactor_uv_u Param_MF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t mf_blf_noisemodel_normfactor_uv_u;

++    /*!< mf_blf_noisemodel_normfactor_uv_v Param_MF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t mf_blf_noisemodel_normfactor_uv_v;

++    /*!< mf_blf_snrm_bypass Param_MF_BLF_SNRM_bypassSNRManagement*/

++    int32_t mf_blf_snrm_bypass;

++    /*!< mf_blf_snrm_bypass_y Param_MF_BLF_SNRM_bypassY*/

++    int32_t mf_blf_snrm_bypass_y;

++    /*!< mf_blf_snrm_slope_y Param_MF_BLF_SNRM_slopeY*/

++    int32_t mf_blf_snrm_slope_y;

++    /*!< mf_blf_snrm_xoffset_y Param_MF_BLF_SNRM_xoffsetY*/

++    int32_t mf_blf_snrm_xoffset_y;

++    /*!< mf_blf_snrm_maxval_y Param_MF_BLF_SNRM_maxValY*/

++    int32_t mf_blf_snrm_maxval_y;

++    /*!< mf_blf_snrm_minval_y Param_MF_BLF_SNRM_minValY*/

++    int32_t mf_blf_snrm_minval_y;

++    /*!< mf_blf_snrm_slope_uv Param_MF_BLF_SNRM_slopeUV*/

++    int32_t mf_blf_snrm_slope_uv;

++    /*!< mf_blf_snrm_xoffset_uv Param_MF_BLF_SNRM_xoffsetUV*/

++    int32_t mf_blf_snrm_xoffset_uv;

++    /*!< mf_blf_snrm_maxval_uv Param_MF_BLF_SNRM_maxValUV*/

++    int32_t mf_blf_snrm_maxval_uv;

++    /*!< mf_blf_snrm_minval_uv Param_MF_BLF_SNRM_minValUV*/

++    int32_t mf_blf_snrm_minval_uv;

++    /*!< mf_afc_bypass Param_MF_AFC_bypassAntiFalseColor*/

++    int32_t mf_afc_bypass;

++    /*!< mf_afc_weight_snr Param_MF_AFC_wgtSnr*/

++    int32_t mf_afc_weight_snr;

++    /*!< mf_afc_weight_chroma Param_MF_AFC_wgtC*/

++    int32_t mf_afc_weight_chroma;

++    /*!< mf_min_distance_clamp Param_MF_min_distance_clamp*/

++    int32_t mf_min_distance_clamp;

++    /*!< lf_blf_fir_filter_length Param_LF_BLF_FIR_BfLen*/

++    int32_t lf_blf_fir_filter_length;

++    /*!< lf_blf_fir_luma_coefs[6] Param_LF_BLF_FIR_Kn_coef*/

++    int32_t lf_blf_fir_luma_coefs[6];

++    /*!< lf_blf_fir_luma_denom_bits Param_LF_BLF_FIR_Kn_denom_bits*/

++    int32_t lf_blf_fir_luma_denom_bits;

++    /*!< lf_blf_fir_bypass_snr_y Param_LF_BLF_FIR_bypasssSnrY*/

++    int32_t lf_blf_fir_bypass_snr_y;

++    /*!< lf_blf_colorspace Param_LF_BLF_colorspaceYRB*/

++    int32_t lf_blf_colorspace;

++    /*!< lf_blf_noisemodel_basefunc_y_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_y_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_y_wbg Param_LF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_y_wbg;

++    /*!< lf_blf_noisemodel_basefunc_u_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_u_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_u_wbg Param_LF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_u_wbg;

++    /*!< lf_blf_noisemodel_basefunc_v_a_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_a_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_b_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_b_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_c_x[5] Param_LF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< lf_blf_noisemodel_basefunc_v_c_y[4] Param_LF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< lf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t lf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< lf_blf_noisemodel_basefunc_v_wbg Param_LF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t lf_blf_noisemodel_basefunc_v_wbg;

++    /*!< lf_blf_noisemodel_weight_y_y Param_LF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t lf_blf_noisemodel_weight_y_y;

++    /*!< lf_blf_noisemodel_weight_y_u Param_LF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t lf_blf_noisemodel_weight_y_u;

++    /*!< lf_blf_noisemodel_weight_y_v Param_LF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t lf_blf_noisemodel_weight_y_v;

++    /*!< lf_blf_noisemodel_weight_uv_y Param_LF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t lf_blf_noisemodel_weight_uv_y;

++    /*!< lf_blf_noisemodel_weight_uv_u Param_LF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t lf_blf_noisemodel_weight_uv_u;

++    /*!< lf_blf_noisemodel_weight_uv_v Param_LF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t lf_blf_noisemodel_weight_uv_v;

++    /*!< lf_blf_noisemodel_radialdependent_bypass Param_LF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t lf_blf_noisemodel_radialdependent_bypass;

++    /*!< lf_blf_noisemodel_colordependent_bypass Param_LF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t lf_blf_noisemodel_colordependent_bypass;

++    /*!< lf_blf_noisemodel_graydependent_bypass Param_LF_BLF_NoiseModel_bypassGrayDependent*/

++    int32_t lf_blf_noisemodel_graydependent_bypass;

++    /*!< lf_blf_noisemodel_radialdependent_x0_square Param_LF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t lf_blf_noisemodel_radialdependent_x0_square;

++    /*!< lf_blf_noisemodel_radialdependent_x0 Param_LF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t lf_blf_noisemodel_radialdependent_x0;

++    /*!< lf_blf_noisemodel_radialdependent_y0_square Param_LF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t lf_blf_noisemodel_radialdependent_y0_square;

++    /*!< lf_blf_noisemodel_radialdependent_y0 Param_LF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t lf_blf_noisemodel_radialdependent_y0;

++    /*!< lf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_LF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t lf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< lf_blf_noisemodel_radialdependent_gain_x[4] Param_LF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< lf_blf_noisemodel_radialdependent_gain_y[3] Param_LF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< lf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t lf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< lf_blf_noisemodel_colordependent_a[32] Param_LF_BLF_NoiseModel_colorDependent_A*/

++    int32_t lf_blf_noisemodel_colordependent_a[32];

++    /*!< lf_blf_noisemodel_colordependent_b[32] Param_LF_BLF_NoiseModel_colorDependent_B*/

++    int32_t lf_blf_noisemodel_colordependent_b[32];

++    /*!< lf_blf_noisemodel_colordependent_c[32] Param_LF_BLF_NoiseModel_colorDependent_C*/

++    int32_t lf_blf_noisemodel_colordependent_c[32];

++    /*!< lf_blf_noisemodel_colordependent_norm_offset Param_LF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t lf_blf_noisemodel_colordependent_norm_offset;

++    /*!< lf_blf_noisemodel_colordependent_gain_x[6] Param_LF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t lf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< lf_blf_noisemodel_colordependent_gain_y[5] Param_LF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t lf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< lf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t lf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< lf_blf_noisemodel_graydependent_graylevel_thresh Param_LF_BLF_NoiseModel_grayDependent_grayThrsh*/

++    int32_t lf_blf_noisemodel_graydependent_graylevel_thresh;

++    /*!< lf_blf_noisemodel_graydependent_graylevel_slope Param_LF_BLF_NoiseModel_grayDependent_graySlope*/

++    int32_t lf_blf_noisemodel_graydependent_graylevel_slope;

++    /*!< lf_blf_noisemodel_graydependent_gain_x[6] Param_LF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t lf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< lf_blf_noisemodel_graydependent_gain_y[5] Param_LF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t lf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< lf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t lf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< lf_blf_noisemodel_normfactor_y_y Param_LF_BLF_NoiseModel_invSigmaYy*/

++    int32_t lf_blf_noisemodel_normfactor_y_y;

++    /*!< lf_blf_noisemodel_normfactor_y_u Param_LF_BLF_NoiseModel_invSigmaYu*/

++    int32_t lf_blf_noisemodel_normfactor_y_u;

++    /*!< lf_blf_noisemodel_normfactor_y_v Param_LF_BLF_NoiseModel_invSigmaYv*/

++    int32_t lf_blf_noisemodel_normfactor_y_v;

++    /*!< lf_blf_noisemodel_normfactor_uv_y Param_LF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t lf_blf_noisemodel_normfactor_uv_y;

++    /*!< lf_blf_noisemodel_normfactor_uv_u Param_LF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t lf_blf_noisemodel_normfactor_uv_u;

++    /*!< lf_blf_noisemodel_normfactor_uv_v Param_LF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t lf_blf_noisemodel_normfactor_uv_v;

++    /*!< lf_blf_snrm_bypass Param_LF_BLF_SNRM_bypassSNRManagement*/

++    int32_t lf_blf_snrm_bypass;

++    /*!< lf_blf_snrm_bypass_y Param_LF_BLF_SNRM_bypassY*/

++    int32_t lf_blf_snrm_bypass_y;

++    /*!< lf_blf_snrm_slope_y Param_LF_BLF_SNRM_slopeY*/

++    int32_t lf_blf_snrm_slope_y;

++    /*!< lf_blf_snrm_xoffset_y Param_LF_BLF_SNRM_xoffsetY*/

++    int32_t lf_blf_snrm_xoffset_y;

++    /*!< lf_blf_snrm_maxval_y Param_LF_BLF_SNRM_maxValY*/

++    int32_t lf_blf_snrm_maxval_y;

++    /*!< lf_blf_snrm_minval_y Param_LF_BLF_SNRM_minValY*/

++    int32_t lf_blf_snrm_minval_y;

++    /*!< lf_blf_snrm_slope_uv Param_LF_BLF_SNRM_slopeUV*/

++    int32_t lf_blf_snrm_slope_uv;

++    /*!< lf_blf_snrm_xoffset_uv Param_LF_BLF_SNRM_xoffsetUV*/

++    int32_t lf_blf_snrm_xoffset_uv;

++    /*!< lf_blf_snrm_maxval_uv Param_LF_BLF_SNRM_maxValUV*/

++    int32_t lf_blf_snrm_maxval_uv;

++    /*!< lf_blf_snrm_minval_uv Param_LF_BLF_SNRM_minValUV*/

++    int32_t lf_blf_snrm_minval_uv;

++    /*!< lf_blf_iir_alpha_y Param_LF_BLF_IIR_alphaY*/

++    int32_t lf_blf_iir_alpha_y;

++    /*!< lf_blf_iir_alpha_uv Param_LF_BLF_IIR_alphaUV*/

++    int32_t lf_blf_iir_alpha_uv;

++    /*!< lf_cs_bypass Param_LF_CS_bypassChromaSuppression*/

++    int32_t lf_cs_bypass;

++    /*!< lf_cs_coef Param_LF_CS_coef*/

++    int32_t lf_cs_coef;

++    /*!< lf_min_distance_clamp Param_LF_min_distance_clamp*/

++    int32_t lf_min_distance_clamp;

++    /*!< vlf_blf_fir_filter_length Param_VLF_BLF_FIR_BfLen*/

++    int32_t vlf_blf_fir_filter_length;

++    /*!< vlf_blf_fir_luma_coefs[6] Param_VLF_BLF_FIR_Kn_coef*/

++    int32_t vlf_blf_fir_luma_coefs[6];

++    /*!< vlf_blf_fir_luma_denom_bits Param_VLF_BLF_FIR_Kn_denom_bits*/

++    int32_t vlf_blf_fir_luma_denom_bits;

++    /*!< vlf_blf_fir_bypass_snr_y Param_VLF_BLF_FIR_bypasssSnrY*/

++    int32_t vlf_blf_fir_bypass_snr_y;

++    /*!< vlf_blf_colorspace Param_VLF_BLF_colorspaceYRB*/

++    int32_t vlf_blf_colorspace;

++    /*!< vlf_blf_noisemodel_basefunc_y_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacY_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacY_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_y_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_y_wbg Param_VLF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_y_wbg;

++    /*!< vlf_blf_noisemodel_basefunc_u_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacU_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacU_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_u_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_u_wbg Param_VLF_BLF_NoiseModel_sigmaParafacU_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_u_wbg;

++    /*!< vlf_blf_noisemodel_basefunc_v_a_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_A_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_a_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_A Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_a_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_a_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_B_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_B Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_b_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_b_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_x[5] Param_VLF_BLF_NoiseModel_sigmaParafacV_C_X*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_x[5];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_y[4] Param_VLF_BLF_NoiseModel_sigmaParafacV_C Config Unit Value*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_y[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_c_slope[4] Slope*/

++    int32_t vlf_blf_noisemodel_basefunc_v_c_slope[4];

++    /*!< vlf_blf_noisemodel_basefunc_v_wbg Param_VLF_BLF_NoiseModel_sigmaParafacV_DEF*/

++    int32_t vlf_blf_noisemodel_basefunc_v_wbg;

++    /*!< vlf_blf_noisemodel_weight_y_y Param_VLF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t vlf_blf_noisemodel_weight_y_y;

++    /*!< vlf_blf_noisemodel_weight_y_u Param_VLF_BLF_NoiseModel_sigmaWgtYu*/

++    int32_t vlf_blf_noisemodel_weight_y_u;

++    /*!< vlf_blf_noisemodel_weight_y_v Param_VLF_BLF_NoiseModel_sigmaWgtYv*/

++    int32_t vlf_blf_noisemodel_weight_y_v;

++    /*!< vlf_blf_noisemodel_weight_uv_y Param_VLF_BLF_NoiseModel_sigmaWgtUVy*/

++    int32_t vlf_blf_noisemodel_weight_uv_y;

++    /*!< vlf_blf_noisemodel_weight_uv_u Param_VLF_BLF_NoiseModel_sigmaWgtUVu*/

++    int32_t vlf_blf_noisemodel_weight_uv_u;

++    /*!< vlf_blf_noisemodel_weight_uv_v Param_VLF_BLF_NoiseModel_sigmaWgtUVv*/

++    int32_t vlf_blf_noisemodel_weight_uv_v;

++    /*!< vlf_blf_noisemodel_radialdependent_bypass Param_VLF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t vlf_blf_noisemodel_radialdependent_bypass;

++    /*!< vlf_blf_noisemodel_colordependent_bypass Param_VLF_BLF_NoiseModel_bypassColorDependent*/

++    int32_t vlf_blf_noisemodel_colordependent_bypass;

++    /*!< vlf_blf_noisemodel_radialdependent_x0_square Param_VLF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t vlf_blf_noisemodel_radialdependent_x0_square;

++    /*!< vlf_blf_noisemodel_radialdependent_x0 Param_VLF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t vlf_blf_noisemodel_radialdependent_x0;

++    /*!< vlf_blf_noisemodel_radialdependent_y0_square Param_VLF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t vlf_blf_noisemodel_radialdependent_y0_square;

++    /*!< vlf_blf_noisemodel_radialdependent_y0 Param_VLF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t vlf_blf_noisemodel_radialdependent_y0;

++    /*!< vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VLF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t vlf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< vlf_blf_noisemodel_radialdependent_gain_x[4] Param_VLF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< vlf_blf_noisemodel_radialdependent_gain_y[3] Param_VLF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< vlf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t vlf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< vlf_blf_noisemodel_colordependent_a[32] Param_VLF_BLF_NoiseModel_colorDependent_A*/

++    int32_t vlf_blf_noisemodel_colordependent_a[32];

++    /*!< vlf_blf_noisemodel_colordependent_b[32] Param_VLF_BLF_NoiseModel_colorDependent_B*/

++    int32_t vlf_blf_noisemodel_colordependent_b[32];

++    /*!< vlf_blf_noisemodel_colordependent_c[32] Param_VLF_BLF_NoiseModel_colorDependent_C*/

++    int32_t vlf_blf_noisemodel_colordependent_c[32];

++    /*!< vlf_blf_noisemodel_colordependent_norm_offset Param_VLF_BLF_NoiseModel_colorDependent_normalization_offset*/

++    int32_t vlf_blf_noisemodel_colordependent_norm_offset;

++    /*!< vlf_blf_noisemodel_colordependent_gain_x[6] Param_VLF_BLF_NoiseModel_colorDependent_Lut_X*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_x[6];

++    /*!< vlf_blf_noisemodel_colordependent_gain_y[5] Param_VLF_BLF_NoiseModel_colorDependent_Lut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_y[5];

++    /*!< vlf_blf_noisemodel_colordependent_gain_slope[5] Slope*/

++    int32_t vlf_blf_noisemodel_colordependent_gain_slope[5];

++    /*!< vlf_blf_noisemodel_graydependent_gain_x[6] Param_VLF_BLF_NoiseModel_grayDependent_transLut_X*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_x[6];

++    /*!< vlf_blf_noisemodel_graydependent_gain_y[5] Param_VLF_BLF_NoiseModel_grayDependent_transLut Config Unit Value*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_y[5];

++    /*!< vlf_blf_noisemodel_graydependent_gain_slope[5] Slope*/

++    int32_t vlf_blf_noisemodel_graydependent_gain_slope[5];

++    /*!< vlf_blf_noisemodel_normfactor_y_y Param_VLF_BLF_NoiseModel_invSigmaYy*/

++    int32_t vlf_blf_noisemodel_normfactor_y_y;

++    /*!< vlf_blf_noisemodel_normfactor_y_u Param_VLF_BLF_NoiseModel_invSigmaYu*/

++    int32_t vlf_blf_noisemodel_normfactor_y_u;

++    /*!< vlf_blf_noisemodel_normfactor_y_v Param_VLF_BLF_NoiseModel_invSigmaYv*/

++    int32_t vlf_blf_noisemodel_normfactor_y_v;

++    /*!< vlf_blf_noisemodel_normfactor_uv_y Param_VLF_BLF_NoiseModel_invSigmaUVy*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_y;

++    /*!< vlf_blf_noisemodel_normfactor_uv_u Param_VLF_BLF_NoiseModel_invSigmaUVu*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_u;

++    /*!< vlf_blf_noisemodel_normfactor_uv_v Param_VLF_BLF_NoiseModel_invSigmaUVv*/

++    int32_t vlf_blf_noisemodel_normfactor_uv_v;

++    /*!< vlf_blf_iir_alpha_y Param_VLF_BLF_IIR_alphaY*/

++    int32_t vlf_blf_iir_alpha_y;

++    /*!< vlf_blf_iir_alpha_uv Param_VLF_BLF_IIR_alphaUV*/

++    int32_t vlf_blf_iir_alpha_uv;

++    /*!< vlf_cs_bypass Param_VLF_CS_bypassChromaSuppression*/

++    int32_t vlf_cs_bypass;

++    /*!< vlf_cs_coef Param_VLF_CS_coef*/

++    int32_t vlf_cs_coef;

++    /*!< vlf_min_distance_clamp Param_VLF_min_distance_clamp*/

++    int32_t vlf_min_distance_clamp;

++    /*!< vhf_blf_noisemodel_basefunc_y_a_x[5] Param_VHF_BLF_NoiseModel_sigmaParafacY_A_X*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_x[5];

++    /*!< vhf_blf_noisemodel_basefunc_y_a_y[4] Param_VHF_BLF_NoiseModel_sigmaParafacY_A Config Unit Value*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_y[4];

++    /*!< vhf_blf_noisemodel_basefunc_y_a_slope[4] Slope*/

++    int32_t vhf_blf_noisemodel_basefunc_y_a_slope[4];

++    /*!< vhf_blf_noisemodel_basefunc_y_wbg Param_VHF_BLF_NoiseModel_sigmaParafacY_DEF*/

++    int32_t vhf_blf_noisemodel_basefunc_y_wbg;

++    /*!< vhf_blf_noisemodel_weight_y_y Param_VHF_BLF_NoiseModel_sigmaWgtYy*/

++    int32_t vhf_blf_noisemodel_weight_y_y;

++    /*!< vhf_blf_noisemodel_radialdependent_bypass Param_VHF_BLF_NoiseModel_bypassRadialCorrection*/

++    int32_t vhf_blf_noisemodel_radialdependent_bypass;

++    /*!< vhf_blf_noisemodel_radialdependent_x0_square Param_VHF_BLF_NoiseModel_radialDependent_x0_square*/

++    int32_t vhf_blf_noisemodel_radialdependent_x0_square;

++    /*!< vhf_blf_noisemodel_radialdependent_x0 Param_VHF_BLF_NoiseModel_radialDependent_x0*/

++    int32_t vhf_blf_noisemodel_radialdependent_x0;

++    /*!< vhf_blf_noisemodel_radialdependent_y0_square Param_VHF_BLF_NoiseModel_radialDependent_y0_square*/

++    int32_t vhf_blf_noisemodel_radialdependent_y0_square;

++    /*!< vhf_blf_noisemodel_radialdependent_y0 Param_VHF_BLF_NoiseModel_radialDependent_y0*/

++    int32_t vhf_blf_noisemodel_radialdependent_y0;

++    /*!< vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance Param_VHF_BLF_NoiseModel_radialDependent_rshiftNormSquareDist*/

++    int32_t vhf_blf_noisemodel_radialdependent_rshift_norm_square_distance;

++    /*!< vhf_blf_noisemodel_radialdependent_gain_x[4] Param_VHF_BLF_NoiseModel_radialDependent_radialLut_X*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_x[4];

++    /*!< vhf_blf_noisemodel_radialdependent_gain_y[3] Param_VHF_BLF_NoiseModel_radialDependent_radialLut Config Unit Value*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_y[3];

++    /*!< vhf_blf_noisemodel_radialdependent_gain_slope[3] Slope*/

++    int32_t vhf_blf_noisemodel_radialdependent_gain_slope[3];

++    /*!< vhf_blf_noisemodel_normfactor_y_y Param_VHF_BLF_NoiseModel_invSigmaYy*/

++    int32_t vhf_blf_noisemodel_normfactor_y_y;

++    /*!< vhf_blf_bypass Param_VHF_BLF_bypass*/

++    int32_t vhf_blf_bypass;

++    /*!< vhf_min_distance_clamp Param_VHF_min_distance_clamp*/

++    int32_t vhf_min_distance_clamp;

++    /*!< hf_lcs_cu_slope[5] PARAM_HFC_LCS_CU_SLOPE*/

++    int32_t hf_lcs_cu_slope[5];

++    /*!< hf_lcs_cu_x[6] PARAM_HFC_LCS_CU_X*/

++    int32_t hf_lcs_cu_x[6];

++    /*!< hf_lcs_cu_y[5] PARAM_HFC_LCS_CU_Y*/

++    int32_t hf_lcs_cu_y[5];

++    /*!< hf_lcs_bypass Param_HFC_LCS_bypass*/

++    int32_t hf_lcs_bypass;

++    /*!< hf_lcs_thresh_high HFC_LCS_THRESHOLD_HIGH*/

++    uint32_t hf_lcs_thresh_high;

++    /*!< hf_lcs_thresh_low PARAM_HFC_LCS_THRESH_LOW*/

++    uint32_t hf_lcs_thresh_low;

++    /*!< hf_lcs_chm_gain PARAM_HFC_LCS_CHM_GAIN*/

++    uint32_t hf_lcs_chm_gain;

++    /*!< hf_lcs_ylocal_size ylocal filter size 0 - 5x5, 1 - 7x7*/

++    uint32_t hf_lcs_ylocal_size;

++    /*!< hf_lcs_chm_size chroma metric filter size 0 - 5x5, 1 - 7x7*/

++    uint32_t hf_lcs_chm_size;

++    /*!< vlf_power_uv VLF denoise power chroma*/

++    int32_t vlf_power_uv;

++    /*!< vlf_power_y VLF denoise power luma*/

++    int32_t vlf_power_y;

++    /*!< lf_power_uv LF denoise power chroma*/

++    int32_t lf_power_uv;

++    /*!< lf_power_y VLF denoise power luma*/

++    int32_t lf_power_y;

++    /*!< mf_power_uv MF denoise power chroma*/

++    int32_t mf_power_uv;

++    /*!< mf_power_y MF denoise power luma*/

++    int32_t mf_power_y;

++    /*!< hf_power_uv HF denoise power chroma*/

++    int32_t hf_power_uv;

++    /*!< vhf_power_y VHF denoise power luma*/

++    int32_t vhf_power_y;

++    /*!< top_ds_2x_coefs[5] 1:2 downscaling filter coefficients*/

++    int32_t top_ds_2x_coefs[5];

++    /*!< top_ds_4x_coefs[7] 1:4 downscaling filter coefficients*/

++    int32_t top_ds_4x_coefs[7];

++

++} ia_pal_isp_xnr_5_2_t;

++

++/*! \isp struct xnr_dss

++Scalable Chroma and Luma Denoise, Medium and High Frequency

++*/

++typedef struct

++{

++    /*!< jbl_mf_bypass_y Bypass JBL MF Luma*/

++    int32_t jbl_mf_bypass_y;

++    /*!< jbl_mf_bypass_c Bypass MF Chroma*/

++    int32_t jbl_mf_bypass_c;

++    /*!< noise_sigma_mf_y_y Noise Sigma MF Luma per Luma*/

++    int32_t noise_sigma_mf_y_y;

++    /*!< noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration*/

++    int32_t noise_sigma_mf_y_s;

++    /*!< noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma*/

++    int32_t noise_sigma_mf_c_y;

++    /*!< noise_sigma_mf_c_u Noise Sigma MF Chroma per U*/

++    int32_t noise_sigma_mf_c_u;

++    /*!< noise_sigma_mf_c_v Noise Sigma MF Chroma per V*/

++    int32_t noise_sigma_mf_c_v;

++    /*!< rad_noise_sigma_mf_y_y Noise Sigma MF Luma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_y_y;

++    /*!< rad_noise_sigma_mf_y_s Noise Sigma MF Luma per Satoration - radial*/

++    int32_t rad_noise_sigma_mf_y_s;

++    /*!< rad_noise_sigma_mf_c_y Noise Sigma MF Chroma per Luma - radial*/

++    int32_t rad_noise_sigma_mf_c_y;

++    /*!< rad_noise_sigma_mf_c_u Noise Sigma MF Chroma per U - radial*/

++    int32_t rad_noise_sigma_mf_c_u;

++    /*!< rad_noise_sigma_mf_c_v Noise Sigma MF Chroma per V - radial*/

++    int32_t rad_noise_sigma_mf_c_v;

++    /*!< noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_y_y;

++    /*!< noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12*/

++    int32_t noise_epsilon_mf_c_y;

++    /*!< noise_epsilon_mf_c_u Chroma min noise variance per U , Q12*/

++    int32_t noise_epsilon_mf_c_u;

++    /*!< noise_epsilon_mf_c_v Chroma min noise variance per V , Q12*/

++    int32_t noise_epsilon_mf_c_v;

++    /*!< rad_noise_epsilon_mf_y_y Luma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_y_y;

++    /*!< rad_noise_epsilon_mf_c_y Chroma min noise variance per Luma , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_y;

++    /*!< rad_noise_epsilon_mf_c_u Chroma min noise variance per U , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_u;

++    /*!< rad_noise_epsilon_mf_c_v Chroma min noise variance per V , Q12 - radial*/

++    int32_t rad_noise_epsilon_mf_c_v;

++    /*!< jbl_weight_th_mf_y Luma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_y;

++    /*!< jbl_weight_th_mf_c Chroma Weight threshold of MF JBL*/

++    int32_t jbl_weight_th_mf_c;

++    /*!< lpf_mf_coef_y[49] MF JBL Spatial coefs for Luma*/

++    int32_t lpf_mf_coef_y[49];

++    /*!< lpf_mf_coef_c[49] MF JBL Spatial coefs for Chroma*/

++    int32_t lpf_mf_coef_c[49];

++    /*!< range_weight_lut[7] JBL range Weight LUT*/

++    int32_t range_weight_lut[7];

++    /*!< blend_mf_power_y MF denoise blending power y*/

++    int32_t blend_mf_power_y;

++    /*!< blend_mf_power_c MF denoise blending power chroma*/

++    int32_t blend_mf_power_c;

++    /*!< rad_blend_mf_power_y MF denoise blending power y - radial*/

++    int32_t rad_blend_mf_power_y;

++    /*!< rad_blend_mf_power_c MF denoise blending power chroma -radial*/

++    int32_t rad_blend_mf_power_c;

++    /*!< noise_beta_y_0 noise model for y - coef 0, Q12*/

++    int32_t noise_beta_y_0;

++    /*!< noise_beta_u_0 noise model for u - coef 0, Q12*/

++    int32_t noise_beta_u_0;

++    /*!< noise_beta_u_1 noise model for u - coef 1, Q12*/

++    int32_t noise_beta_u_1;

++    /*!< noise_beta_v_0 noise model for v - coef 0, Q12*/

++    int32_t noise_beta_v_0;

++    /*!< noise_beta_v_2 noise model for v - coef 2, Q12*/

++    int32_t noise_beta_v_2;

++    /*!< rad_center_x X location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_x;

++    /*!< rad_center_y Y location of the radial center location relative to the top left pixel*/

++    int32_t rad_center_y;

++    /*!< rad_exp Radial scale bit into the Lut*/

++    int32_t rad_exp;

++    /*!< rad_lut[128] Radial LUT*/

++    int32_t rad_lut[128];

++    /*!< one_div_64_lut[64] 1/SQRT(x), first 64 values LUT*/

++    int32_t one_div_64_lut[64];

++    /*!< xcu_divsqrt_exp XCU divsqrt exponent*/

++    int32_t xcu_divsqrt_exp;

++    /*!< xcu_divsqrt_slp_a_res XCU divsqrt slope precision*/

++    int32_t xcu_divsqrt_slp_a_res;

++    /*!< xcu_divsqrt_offset[16] XCU divsqrt offset(y) vector*/

++    int32_t xcu_divsqrt_offset[16];

++    /*!< xcu_divsqrt_slope[16] XCU divsqrt slope vector*/

++    int32_t xcu_divsqrt_slope[16];

++    /*!< xcu_divsqrt_x[17] XCU divsqrt x points vector + maximal x value*/

++    int32_t xcu_divsqrt_x[17];

++    /*!< lcs_th_low Low Chroma Suppertion threshold for black level*/

++    int32_t lcs_th_low;

++    /*!< lcs_th_high_delta Low Chroma Suppertion threshold for white level (delta from black)*/

++    int32_t lcs_th_high_delta;

++    /*!< rad_lcs_th_low Low Chroma Suppertion threshold for black level - radial (delta from low)*/

++    int32_t rad_lcs_th_low;

++    /*!< rad_lcs_th_high_delta Low Chroma Suppertion threshold for white level -radial (delta form high delta)*/

++    int32_t rad_lcs_th_high_delta;

++    /*!< xcu_lcs_exp XCU ed exponent*/

++    int32_t xcu_lcs_exp;

++    /*!< xcu_lcs_slp_a_res XCU ed slope precision*/

++    int32_t xcu_lcs_slp_a_res;

++    /*!< xcu_lcs_offset[32] XCU ed offset(y) vector*/

++    int32_t xcu_lcs_offset[32];

++    /*!< xcu_lcs_slope[32] XCU ed slope vector*/

++    int32_t xcu_lcs_slope[32];

++    /*!< xcu_lcs_x[33] XCU ed x points vector + maximal x value*/

++    int32_t xcu_lcs_x[33];

++    /*!< hf_luma_power HF Luma denoise power, Q15*/

++    int32_t hf_luma_power;

++    /*!< blend_hf_power_y HF blending power luma*/

++    int32_t blend_hf_power_y;

++    /*!< blend_hf_power_c HF blending power chroma*/

++    int32_t blend_hf_power_c;

++

++} ia_pal_isp_xnr_dss_t;

++

++

++

++/* System API Structs */

++

++#pragma pack(push, 4)

++

++typedef struct

++{

++    uint16_t system_api_uuid;

++} ia_pal_system_api_record_header_t;

++

++/*! \system api struct gdc7

++

++*/

++typedef struct

++{

++    /*!< gdc_sp_standalone indicated if gdc_sp is used in standalone mode ( 0: used with gdc_FP, 1: used in standalone)*/

++    uint8_t gdc_sp_standalone;

++

++} ia_pal_system_api_gdc7_t;

++

++/*! \system api struct io_buffer

++

++*/

++typedef struct

++{

++    /*!< aligner_data_size amount of valid bits per valid cycle to be accumulate and use the aligner (valid when dpa_bypass is set). LSB represent 2b resolution (meaning value can be 2, 4, 6, 8, … up to 72 which is the size bus)*/

++    int32_t aligner_data_size;

++    /*!< arbiter_pin MIPI CSI arbiter pin location of the stream*/

++    int32_t arbiter_pin;

++    /*!< block_height buffer block height configuration in lines*/

++    uint16_t block_height;

++    /*!< block_width buffer block width configuration in pixels*/

++    uint16_t block_width;

++    /*!< buffer_1d_enable Valid only for 1 plane and 1 queue streams. 0-the buffer is described as 2D; 1-the buffer is described as 1D (continues from start to end w/o stride ignoring lines)*/

++    uint8_t buffer_1d_enable;

++    /*!< chroma_base_conversion chroma converted from zero-based to half-based or vice versa*/

++    uint8_t chroma_base_conversion;

++    /*!< chroma_duplication Valid when format 420 is configured to provide 422 (2P2Q with SIF count of 4 or 2). when reset - duplicate the chroma and provide the same value each two Y lines, when set - send the chroma components only with the even Y (at odd Y lines doesn’t send any chroma)*/

++    uint8_t chroma_duplication;

++    /*!< chroma_planes_order Chroma planes ordering: 0 - U before V; 1 - V before U (valid for half planer configuration)*/

++    uint8_t chroma_planes_order;

++    /*!< component_in_valid_pixel Provides amount of valid component per valid pixel*/

++    uint8_t component_in_valid_pixel;

++    /*!< component_precision Pixel element precision in bits: 0=>8b, 1=>10b, 2=>12b, 3=>16, 4=>32, 5=>2, 6=>4, 7..15=>reserved*/

++    uint8_t component_precision;

++    /*!< compression_mode Valid for streaming that are tiled: 1-the stream is written/fetched to/from DDR through compression engine; 0-not going through compression*/

++    uint8_t compression_mode;

++    /*!< dpa_bypass When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

++    uint8_t dpa_bypass;

++    /*!< first_row_blocks_height buffer block height configuration in lines of all the blocks in the first row of blocks. If zero - use streaming_buffer_blocks_height*/

++    uint16_t first_row_blocks_height;

++    /*!< granularity_pointer_update Valid according the streaming mode: number of lines (LB)/lines of blocks (BB) to be written/release before sending a pointer update (reporting always done with producer view)*/

++    uint16_t granularity_pointer_update;

++    /*!< in_chroma_signed chroma in input is signed (1) or unsigned (0)*/

++    uint8_t in_chroma_signed;

++    /*!< in_luma_signed luma in input is signed (1) or unsigned (0)*/

++    uint8_t in_luma_signed;

++    /*!< last_row_blocks_height buffer block height configuration in lines of all the blocks in the last row of blocks. If zero - use streaming_buffer_blocks_height*/

++    uint16_t last_row_blocks_height;

++    /*!< local_link_id indicates the stream used at the current connectlon*/

++    uint8_t local_link_id;

++    /*!< luma_base_conversion luma converted from zero-based to half-based or vice versa*/

++    uint8_t luma_base_conversion;

++    /*!< max_credits provides the maximum amount of credits for eliminating the need to calculate it in HW according the next formula: (end_address-start_address)/Max_Stride*/

++    uint32_t max_credits;

++    /*!< max_stride provides the maximum stride value to be used at the connection*/

++    uint16_t max_stride;

++    /*!< middle_ack_enable If set, enable the mechansim to generate middle ack when consumed amount of configured lines*/

++    uint8_t middle_ack_enable;

++    /*!< middle_ack_line_number Valid if ack enable  If enabled, the device should generate middle ack when delivers the EOL of the configured line (global number) assuming the first line delievered at SOF is zero.  In case of multiple planes the counting is done using plane1 but only when all the planes are synced*/

++    uint16_t middle_ack_line_number;

++    /*!< middle_ack_mode_stall Valid only when ack_enable is set When set, the device should stall once sending the middle ack*/

++    uint8_t middle_ack_mode_stall;

++    /*!< mipi_csi_eof When set indicate the end of MIPI frame (used for MIPI CSI sub frames)*/

++    uint8_t mipi_csi_eof;

++    /*!< num_of_planes Amount of valid planes (supported 1, 2, 3, 4 - depends also on HW parameter of max planes and data type)*/

++    uint8_t num_of_planes;

++    /*!< num_of_queues Amount of total active queues (YUV FP - 4, YUV SP - 3 YUV SP Tile - 2. RGB - 1,1,1. Bayer -2). Must be up to amount of maximum queue supported. Can be changed per frame. At LBFF used dynamicly for PDAF*/

++    uint8_t num_of_queues;

++    /*!< onep_pixel_order Set the ordering of the first plane (lines-N, pixels-M) 4PPC: 0-(N, M), (N, M+1), (N+1, M), (N+1, M+1), horizontal raster; 1-(N, M), (N+1, M), (N, M+1), (N+1, M+1), vertical raster 2PPC: 0-first cyc: (N, M), (N+1, M), second cyc: (N, M+1), (N+1, M+1); 1-first cyc: (N, M), (N, M+1),*/

++    uint8_t onep_pixel_order;

++    /*!< out_chroma_signed chroma in output is signed (1) or unsigned (0)*/

++    uint8_t out_chroma_signed;

++    /*!< out_luma_signed luma in output is signed (1) or unsigned (0)*/

++    uint8_t out_luma_signed;

++    /*!< pace_message_pace_line Provides the line number indicating to stop measuring the activity and pace and sending pace meesage (at IFD - get the last data of the line, at ODR - getnon-buf ack on last data of the line)*/

++    uint16_t pace_message_pace_line;

++    /*!< pace_message_ref_line Provides the line number that when start indicating start measuring the pace and active  (ODR - send first WR of the line, IFD send first RD of line)*/

++    uint16_t pace_message_ref_line;

++    /*!< pixels_in_valid_cycle Provides amount of valid pixels per valid cycle*/

++    uint8_t pixels_in_valid_cycle;

++    /*!< plane_horiz_subsample_config[3] Plane Horiz subsample (width>>N).  Affect tile width and width resolution=>Bayer - 0, Y/UV at YUV SP - 0, Y at YUV FP -0, UV U/V at YUV FP-1)*/

++    uint8_t plane_horiz_subsample_config[3];

++    /*!< plane_max_burst_size[3] Plane maximum burst size: used to specify the transfer size in CL granularity (Max limited to 16, possible values - 1, 2, 4, 8, 16)*/

++    uint8_t plane_max_burst_size[3];

++    /*!< plane_offset_end_address[3] Per plane: End offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

++    uint32_t plane_offset_end_address[3];

++    /*!< plane_offset_start_address[3] Per plane: Start offset address of plane with regarding to the base_offset, in bytes, CL aligned, unsigned.*/

++    uint32_t plane_offset_start_address[3];

++    /*!< plane_stride[3] Per plane: provides the difference between two horizontal pixels, in bytes, CL aligned, unsigned.  At tile mode - provide the difference between two lines of tiles in bytes*/

++    uint32_t plane_stride[3];

++    /*!< plane_tile_height[3] Per plane: buffer tile height configuration in lines*/

++    uint8_t plane_tile_height[3];

++    /*!< plane_tile_width[3] Per plane: buffer tile width configuration in bytes*/

++    uint8_t plane_tile_width[3];

++    /*!< plane_vert_subsample_config[3] Plane Vertical subsample (height>>N). Affect tile highet and highet resolution=>Bayer - 0, Y atYUV SP - 0, UV at YUV SP - 1, Y at YUV FP -0, U/V at YUV FP-1)*/

++    uint8_t plane_vert_subsample_config[3];

++    /*!< plane_zlr_granularity[3] Plane ZLR page granularity: if 0 - 4KB, if 1 - 2KB. Valid only if ZLR is enalbe*/

++    uint8_t plane_zlr_granularity[3];

++    /*!< ppc provides the amount of pixel per cycle*/

++    uint8_t ppc;

++    /*!< proc_ff_bypass when set indicates the FF in the pipe (FCVT & ESPA) need to be bypass*/

++    uint8_t proc_ff_bypass;

++    /*!< progress_message_line Provides the line number that when is done generate progress message (IFD - last byte of the line arrive, ODR - last byte of the line acked by nbuf)*/

++    uint16_t progress_message_line;

++    /*!< stream_dt stream data type as need to be used by the MIPI*/

++    uint8_t stream_dt;

++    /*!< stream_dt_for_mipi_packet stream data type as need to be used in the header of mipi packet - not affect the proc*/

++    int32_t stream_dt_for_mipi_packet;

++    /*!< stream_vc stream virtual channel number as need to be used in MIPI*/

++    uint8_t stream_vc;

++    /*!< stream_wc stream word count as need to be used by the MIPI*/

++    uint16_t stream_wc;

++    /*!< streaming_mode The streaming unified buffer protocol:  0-static offline (producer/consumer write/read from DDR after kick);  1-dynamic offline (producer/consumer send wr/rd EOF/SOF, producer write after kick, consumer read after full frame at DDR);  2-buffer chasing large memory (producer/consumer send wr/rd EOF/SOF, producer send wr update, consumer read according to wr update);  3-buffer chasing on small memory (producer/consumer send wr/rd EOF/SOF, producer write released buffers and sends wr pointers, consumer read valid buffer and sends rd pointer);  4-S&R like 3 with option to change the link (supporting modes 2 and 3 with dynamic change) 5-buffer chasing small memory - fix starting point, single buffer 6-buffer chasing small memory - float starting point 7-buffer chasing small memory - fix starting point, double buffer*/

++    uint8_t streaming_mode;

++    /*!< streaming_sw_managed When set - the SW verify the shared buffer is fully consumed by  the producer and can be written immediately*/

++    uint8_t streaming_sw_managed;

++    /*!< stride_ratio provides the BCSM max_stride/stride ratio with possible values of 1-8, 16, 32, 64, 128*/

++    uint8_t stride_ratio;

++    /*!< subsample_YUV444_to_YUV422 Used by ODR to convert YUV444 to YUV422: 0-use amount of element as written at components_in_valid_cycle, 1-drop the chroma components any odd cycle*/

++    uint8_t subsample_YUV444_to_YUV422;

++    /*!< tile_mode Valid for IO that can provide tile format: 0-no tiling; 1-the IO should use tiling with the configured height, width, and tiling type (internal tiling or external Tile-4)*/

++    uint8_t tile_mode;

++    /*!< tiling_type Tiling Type: 0 - internal tiling; 1 - external tiling (Tile-4)*/

++    uint8_t tiling_type;

++    /*!< unpack_alignment Valid for unpacked vectors: 0-element located at LSB and MSB is zero; 1-element located at MSB and LSB is zero*/

++    uint8_t unpack_alignment;

++    /*!< use_attributes This capability impact the ODR. When set, ODR should use the EOL/EOF attributes to detect frame dimensions. In general, this capability is used when the height or width or both are not known or cannot be expressed. Using this capability disable the option using crop/pad mechanism and force SW to provide the same dimension in input/output region (if known) and zero the offset values.*/

++    uint8_t use_attributes;

++    /*!< vector_format Vector CL format: 0-unpacked using 2B container; 1-packed*/

++    uint8_t vector_format;

++    /*!< vertical_ordering_enable If set, the walking order should be vertical using the sub_line value to indicate how many CL generate vertical movement*/

++    uint8_t vertical_ordering_enable;

++    /*!< vertical_ordering_sub_line valid when vertical_ordering is set, indicates the size of the sub line to generate vertical step in CL granularity*/

++    uint8_t vertical_ordering_sub_line;

++    /*!< zlr_transaction_enable when set enable sending zlr request for prefetch address translation and compression status*/

++    uint8_t zlr_transaction_enable;

++

++} ia_pal_system_api_io_buffer_t;

++

++/*! \system api struct tvs_1_0

++Trainable visual scaler

++*/

++typedef struct

++{

++    /*!< output_420 Output data format (0: YUV444; 1: YUV420. It will be forced to 1 if either ds_bypass or bypass is enabled)*/

++    uint8_t output_420;

++

++} ia_pal_system_api_tvs_1_0_t;

++

++

++

++#pragma pack(pop)

++

++#ifdef __cplusplus

++}

++#endif

+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
+new file mode 100644
+index 000000000000..7057b1124c88
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
+@@ -0,0 +1,111 @@
++/*
++ * Copyright 2018-2019 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_STATISTICS_TYPES_H_
++#define __IA_STATISTICS_TYPES_H_
++
++#include "ia_types.h"
++#include "ia_configuration.h"
++
++#define IA_RGBS_GRID_SIZE (IA_RGBS_GRID_WIDTH * IA_RGBS_GRID_HEIGHT)
++
++ /*!
++ * \brief Bayer color channels grouped into one structure.
++ */
++typedef struct
++{
++    unsigned char gr;
++    unsigned char r;
++    unsigned char b;
++    unsigned char gb;
++} ia_color_channels;
++
++/*!
++ * \brief Statistics grid with averaged RGBS color channels and saturation percentage.
++ * Total size of each color channel array is defined by width * height of the grid.
++ */
++typedef struct
++{
++    unsigned int grid_width;                        /*!< Mandatory. Width of RGBYS grids. */
++    unsigned int grid_height;                       /*!< Mandatory. Height of RGBYS grids. */
++    ia_color_channels avg[IA_RGBS_GRID_SIZE];       /*!< Mandatory. Averaged R, Gr, Gb and B channel data. */
++    unsigned char sat[IA_RGBS_GRID_SIZE];           /*!< Mandatory. Saturation percentage of pixels within collected data. [0, 255] = [0, 100]%. */
++} ia_rgbs_grid;
++
++#define IA_FILTER_RESPONSE_GRID_SIZE (IA_FILTER_RESPONSE_GRID_WIDTH * IA_FILTER_RESPONSE_GRID_HEIGHT)
++
++/*!
++ * \brief Filter responses interleaved.
++ */
++typedef struct
++{
++    int filter_1;    /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
++    int filter_2;    /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
++} ia_filter_response;
++
++/*!
++ * \brief Convolution filter respose statistics
++ * As defined in the AIQ statistics specification.
++ */
++typedef struct
++{
++    unsigned int grid_width;                                    /*!< Number of block elements horizontally in a grid. */
++    unsigned int grid_height;                                   /*!< Number of block elements vertically in a grid. */
++    ia_filter_response responses[IA_FILTER_RESPONSE_GRID_SIZE]; /*!< Interleaved filter responses. */
++} ia_filter_response_grid;
++
++typedef struct
++{
++    unsigned int element_count;                     /*!< Number of elements in the histogram. */
++    unsigned int bins[IA_HISTOGRAM_SIZE];           /*!< Histogram data. */
++} ia_histogram;
++
++typedef struct
++{
++    ia_rectangle   face_area;                 /*!< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
++    int32_t        tracking_id;               /*!< Tracking id of the face. */
++    int32_t        confidence;                /*!< Confidence in face detection result. */
++    ia_coordinate  mouth;                     /*!< Mid-point of the mouth. */
++    ia_coordinate  left_eye;                  /*!< Left eye */
++    ia_coordinate  right_eye;                 /*!< Right eye */
++    bool           eye_validity;              /*!< Indicates whether a face was processed to get eye positions */
++    float          skin_type_dark_likelihood; /*!< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
++    bool           skin_type_validity;        /*!< Validity of the Skin Likelihood */
++} ia_face_roi;
++
++
++#define IA_DEPTH_GRID_SIZE (IA_DEPTH_GRID_WIDTH * IA_DEPTH_GRID_HEIGHT)
++
++typedef enum
++{
++    ia_depth_data_type_vcm,     /*!< VCM units */
++    ia_depth_data_type_mm,      /*!< Distance to the object in mm */
++} ia_depth_data_type;
++
++/*!
++ * Depth statistics grid.
++ */
++typedef struct
++{
++    unsigned int grid_width;                      /*!< Number of grid elements horizontally */
++    unsigned int grid_height;                     /*!< Number of grid elements vertically */
++    ia_depth_data_type type;                      /*!< Data type (VCM units/mm)*/
++    ia_rectangle grid_rect;                       /*!< ROI for the grid */
++    int depth_data[IA_DEPTH_GRID_SIZE];           /*!< Depth data (type of data is defined by ia_depth_data_type) */
++    unsigned char confidence[IA_DEPTH_GRID_SIZE]; /*!< Confidence level */
++} ia_depth_grid;
++
++#endif /* __IA_STATISTICS_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
+new file mode 100644
+index 000000000000..b0f2c77786d5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
+@@ -0,0 +1,316 @@
++/*
++ * Copyright 2012-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _IA_TYPES_H_
++#define _IA_TYPES_H_
++
++#include <stdlib.h>
++#include <stdarg.h>
++#include <stdint.h>
++
++#if defined(_MSC_VER)
++    #if !defined(__BOOL_DEFINED)
++        #if _MSC_VER >= 1800 /* stdbool.h is available starting from VS2013. */
++            #include <stdbool.h>
++        #else /* Fallback for older VS versions. */
++            typedef unsigned char bool;
++            #define true 1
++            #define false 0
++        #endif
++    #endif
++#else
++    #include <stdbool.h>
++#endif
++
++#ifdef _WIN32
++    #ifndef BUILD_SHARED_LIBS
++        #define LIBEXPORT
++    #else
++        #ifdef BUILD_SHARED_LIBS
++            #define LIBEXPORT __declspec(dllexport)
++        #else
++            #define LIBEXPORT __declspec(dllimport)
++        #endif
++    #endif
++#else
++    #define LIBEXPORT
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ *  \brief Bundles binary data pointer with size.
++ */
++typedef struct
++{
++    void        *data;
++    unsigned int size;
++} ia_binary_data;
++
++/**
++ *  \brief Defines a common record header.
++ */
++typedef struct
++{
++    unsigned int uuid;
++    unsigned int size;
++} ia_record_header;
++
++typedef struct {
++    int major;
++    int minor;
++} ia_version;
++
++typedef enum {
++    CAPTURE_OUTPUT,
++    CAPTURE_VFPP,
++    PREVIEW_VFPP,
++    ACC_QOS
++} ia_acceleration_fw_dst;
++
++typedef struct {
++    void *isp;
++    void *(*open_firmware)     (const char *fw_path, unsigned *size);
++    int   (*load_firmware)     (void *isp, void *fw, unsigned size, unsigned *handle);
++    int   (*unload_firmware)   (void *isp, unsigned handle);
++    int   (*map_firmware_arg)  (void *isp, void *usr_ptr, size_t size, unsigned long *css_ptr);
++    int   (*unmap_firmware_arg)(void *isp, unsigned long css_ptr, size_t size);
++    int   (*set_firmware_arg)  (void *isp, unsigned handle, unsigned num, void *val, size_t size);
++    int   (*set_mapped_arg)    (void *isp, unsigned handle, unsigned mem, unsigned long css_ptr, size_t size);
++    int   (*start_firmware)    (void *isp, unsigned handle);
++    int   (*wait_for_firmware) (void *isp, unsigned handle);
++    int   (*abort_firmware)    (void *isp, unsigned handle, unsigned timeout);
++    ia_version version_isp;
++    ia_version version_css;
++    int   (*set_stage_state)   (void *isp, unsigned int handle, bool enable);
++    int   (*wait_stage_update) (void *isp, unsigned int handle);
++    int   (*load_firmware_ext) (void *isp, void *fw, unsigned size, unsigned *handle, int fw_dst);
++} ia_acceleration;
++
++typedef enum {
++    ia_frame_format_nv12,       /* 12 bit YUV 420, Y, UV plane */
++    ia_frame_format_yuv420,     /* 12 bit YUV 420, Y, U, V plane */
++    ia_frame_format_yuv444,     /* 24 bit YUV 444, Y, U, V plane */
++    ia_frame_format_raw,        /* RAW, 1 plane */
++    ia_frame_format_rgba32,     /* RGBA 8 bits per channel */
++    ia_frame_format_yuy2,       /* 16 bit YUV 422, YUYV plane */
++    ia_frame_format_raw16,      /* 16 bit RAW, 1 plane */
++    ia_frame_format_rgb16p,     /* 16 bits per channel, 3 planes */
++    ia_frame_format_yuv420sp16, /* 24 bit YUV 420, Y, UV plane */
++    ia_frame_format_yuv420p16,  /* 24 bit YUV 420, Y, U, V plane */
++    ia_frame_format_yuv444p16,  /* 48 bit YUV 444, Y, U, V plane */
++} ia_frame_format;
++
++typedef struct {
++    void           *data;     /**< Pointer to the image data */
++    int             size;     /**< Total number of bytes in data*/
++    int             width;    /**< Width of the frame in pixels */
++    int             height;   /**< Height of the frame in lines */
++    ia_frame_format format;   /**< Frame format */
++    int             stride;   /**< Stride, bytes per line*/
++    int             rotation; /**< degrees 0-360 */
++} ia_frame;
++
++/*!
++* \brief Raw image data format.
++*/
++typedef enum
++{
++    ia_image_data_format_rawplain16,             /*!< Data is 16 bits per pixel. */
++    ia_image_data_format_rawplain8,              /*!< Data is 8 bits per pixel. */
++    ia_image_data_format_rgb16,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 16 bits per pixel. */
++    ia_image_data_format_smia10,                 /*!< SMIA 10 format groups 4 pixels: MSBs of four pixels in 4 bytes + LSBs of same 4 pixels in 1 byte. */
++    ia_image_data_format_nv12,                   /*!< Data is 12 bit YUV 420, Y, UV plane. */
++    ia_image_data_format_yuv420_planar,          /*!< Data is YUV 420 planar. */
++    ia_image_data_format_rawplain16_interleaved, /*!< Data is 16 bits per pixel interleaved so that all bayer quad pixels are one after another. Example: GRBGGRBG...*/
++    ia_image_data_format_rawplain32,             /*!< Data is 32 bits per pixel. */
++    ia_image_data_format_rgb32,                  /*!< Data is in a buffer containing planes: R, G and B one after another. Data size is 32 bits per pixel. */
++    ia_image_data_format_ov20bit                 /*!< Data is in as 2x10bit pixels [13 12 11 10 f e d c][x x x x x x b a] [9 8 7 6 5 4 3 2][x x x x x x 1 0]*/
++} ia_image_data_format;
++
++/*!
++* \brief Raw image essential information.
++* If raw image data doesn't contain any extra bytes/lines/columns, the image can be decoded with this info.
++* For all signed values in the structs below, negative value indicates N/A.
++*/
++typedef struct
++{
++    unsigned char data_format;   /*!< RawPlain16, RawPlain8 etc. as defined in the enum ia_image_data_format */
++    char bayer_order;            /*!< GRBG, RGGB, BGGR or GBRG as defined in the enum cmc_bayer_order. -1 if N/A */
++    char data_format_bpp;        /*!< Bits per pixel for a given data_format. eg. 16 for RawPlain16 etc. -1 if N/A*/
++    char data_bpp;               /*!< Bits per pixel used by the image data. -1 if N/A */
++    unsigned int width_cols;     /*!< Visible image width (640, 800, 1280, 1600, etc.) */
++    unsigned int height_lines;   /*!< Visible image height (480, 600, 960, 1200, etc.) */
++} ia_image_info;
++
++/*!
++* \brief Raw image info with additional details about extra bytes/lines/columns to skip when decoding the raw image.
++* This structure is stored inside header of Intel raw (IRAW) image as a makernote record. If a raw capture consists of multiple sub-images
++* (for example from multiple exposures or cameras), each sub-image needs to have own makernote record (with different name id).
++* image_start_offset defines start location of particular sub-image in the IRAW buffer/file.
++*/
++typedef struct
++{
++    ia_image_info raw_image;            /*!< Essential information needed to decode the image. */
++    unsigned int header_size_bytes;     /*!< Variable size header */
++    unsigned int footer_size_bytes;     /*!< Variable size footer */
++
++    unsigned short extra_bytes_left;    /*!< e.g. CCP sync codes */
++    unsigned short extra_bytes_right;   /*!< e.g. CCP sync codes */
++
++    unsigned short extra_lines_top;     /*!< Non-image data, e.g. embedded data lines */
++    unsigned short extra_cols_left;     /*!< Non-image data, extra columns at left */
++    unsigned short extra_cols_right;    /*!< Non-image data, extra columns at right */
++    unsigned short extra_lines_bottom;  /*!< Non-image data, e.g. embedded data lines */
++
++    char byte_order_xor;                /*!< 0, 1 or 3 (for the cases when byte order has been modified for whatever reason) */
++    char spatial_sampling;              /*!< 0 or 1 = Bayer or Co-sited */
++    unsigned short reserved;            /*!< Reserved to padding for 32 bit boundary. */
++    unsigned int image_start_offset;    /*!< Offset to beginning of image buffer. 0 if one image is present in the RAW image buffer. */
++} ia_image_full_info;
++
++/** Floating point range struct. */
++typedef struct {
++    float min;
++    float max;
++} ia_float_range;
++
++/*!
++ * Needs to be agreed with ia_imaging error codes.
++ * \brief Error codes.
++*/
++typedef enum {
++    ia_err_none     =  0,       /*!< No errors*/
++    ia_err_general  = (1 << 1), /*!< General error*/
++    ia_err_nomemory = (1 << 2), /*!< Out of memory*/
++    ia_err_data     = (1 << 3), /*!< Corrupted data*/
++    ia_err_internal = (1 << 4), /*!< Error in code*/
++    ia_err_argument = (1 << 5), /*!< Invalid argument for a function*/
++    ia_err_disabled = (1 << 6)  /*!< Functionality is disabled*/
++} ia_err;
++
++#define IA_RESOLUTION_STATIC_GRAPH_PACK 4
++#pragma pack(push, IA_RESOLUTION_STATIC_GRAPH_PACK)
++typedef struct {
++    /*
++     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
++     * This struct is being used by casting data from a binary file and hence cannot be changed.
++     */
++    int left;
++    int top;
++    int right;
++    int bottom;
++} ia_rectangle;
++#pragma pack(pop)
++
++/** Vector, used for image stabilization. */
++typedef struct {
++    int x;
++    int y;
++} ia_vector;
++
++/** Coordinate, used in red-eye correction. */
++typedef struct {
++    int x;
++    int y;
++} ia_coordinate;
++
++typedef struct {
++    void (*vdebug)(const char *fmt, va_list ap);
++    void (*verror)(const char *fmt, va_list ap);
++    void (*vinfo)(const char *fmt, va_list ap);
++} ia_env;
++
++typedef struct {
++    void *(*alloc) (void *isp, size_t size);
++    void  (*free)  (void *isp, void *usr_ptr, size_t size);
++} ia_mem_env;
++
++
++/*!
++* \brief Structure describes the media formats which AIC supports
++*/
++typedef enum
++{
++    media_format_legacy                = 0x00,    //ipu4 default
++    media_format_bt601_8b              = 0x20,    //bt601
++    media_format_bt601_8b_narrow       = 0x22,    //bt601
++    media_format_bt709_8b              = 0x30,    //bt709
++    media_format_bt709_8b_narrow       = 0x32,    //bt709
++    media_format_bt709_10b             = 0x40,    //bt709
++    media_format_bt709_10b_narrow      = 0x42,    //bt709
++    media_format_bt2020_10b            = 0x50,    //bt2020
++    media_format_bt2020_10b_narrow     = 0x52,    //bt2020
++    media_format_bt2020_12b            = 0x51,    //bt2020
++    media_format_bt2020_12b_narrow     = 0x53,    //bt2020
++    media_format_bt2100_10b            = 0x60,    //bt2100
++    media_format_bt2100_10b_narrow     = 0x62,    //bt2100
++    media_format_bt2100_12b            = 0x61,    //bt2100
++    media_format_bt2100_12b_narrow     = 0x63,    //bt2100
++    media_format_bt2100_10b_cl         = 0x64,    //bt2100
++    media_format_bt2100_10b_cl_narrow  = 0x66,    //bt2100
++    media_format_bt2100_12b_cl         = 0x65,    //bt2100
++    media_format_bt2100_12b_cl_narrow  = 0x67,    //bt2100
++    media_format_srgb_jpeg             = 0x80,    //srgb_jpeg
++    media_format_linear_mono           = 0xE0,    //linear gamma with "mono-srgb" space for e.g. IR mode.
++    media_format_custom                = 0xF0     //custom
++} ia_media_format;
++
++/** @brief Representing eyes.
++ * This structure represents the eye position and the blink state.
++ */
++typedef struct {
++    ia_coordinate position;                  /**< Position of the eye. */
++    int32_t       blink_confidence;          /**< Blink status in [0..100] range where 0 means wide open eye and 100 means fully closed eye.
++                                             negative integer means blink result is invalid (based on invalid ED position result) */
++} ia_atbx_eye;
++
++typedef struct {
++    ia_rectangle   face_area;                /**< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */
++    int32_t        rip_angle;                /**< RIP (rotation in plane) angle in degrees. */
++    int32_t        rop_angle;                /**< ROP (rotation out of plane) angle in degrees. */
++    int32_t        tracking_id;              /**< Tracking id of the face. */
++    int32_t        confidence;               /**< Confidence in face detection result. */
++    int32_t        person_id;                /**< Person id (typically positive number) of the face. Filled after face recognition. -1 if not recognized. */
++    int32_t        similarity;               /**< Similarity value between this face and the face in the database which was recognized as the person. */
++    int32_t        best_ratio;               /**< Indicates the ratio between the most similar face and the 2nd similar face. */
++    int32_t        face_condition;           /**< Indicates the light condition of the face. Not used at this moment. */
++    int32_t        smile_state;              /**< Smile state of the face. -1 : invalid info (based on invalid ED position result)
++                                             0 : Non-smile, 1 : Smile, 2 : Start of the smile. Auxiliary variable for smile shutter. */
++    int32_t        smile_score;              /**< Smile score in the range of [0..100] where 0 is non-smile state and 100 is full smile state. */
++    ia_coordinate  mouth;                    /**< Mid-point of the mouth. */
++    ia_atbx_eye    left_eye;                 /**< Left eye */
++    ia_atbx_eye    right_eye;                /**< Right eye */
++    int32_t        eye_validity;             /**< Indicates whether a face was processed to get eye positions */
++    int32_t        skin_type_dark_likelihood;/**< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */
++    int32_t        skin_type_validity;       /**< Validity of the Skin Likelihood */
++} ia_atbx_face;
++
++/** @brief Face state data.
++ * This structure is used to hold inputs and outputs of functions and also works as a handle of the engine instance.
++ */
++typedef struct {
++    int32_t        num_faces;                /**< Number of faces in the recently processed input frame. */
++    ia_atbx_face  *faces;                    /**< Array of face information. */
++} ia_atbx_face_state;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IA_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
+new file mode 100644
+index 000000000000..7654701f0a87
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
+@@ -0,0 +1,163 @@
++/*
++ * Copyright 2017 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++
++#ifndef __IA_VIEW_H__
++#define __IA_VIEW_H__
++
++
++#include "ia_view_types.h"
++#include "ia_cmc_types.h"
++
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*! \brief Initialize the view module.
++ *
++ * \param[out]  view_handle    handle maintaining the view instance
++ * \param[in]  cmc    The CMC parameters
++ * \return                        0 for no error, others for error.
++ *
++ * This function initializes the view module. This is expected to be called before any
++ * other ia_view* function.
++ */
++LIBEXPORT ia_err
++ia_view_init(ia_view_handle *view_handle, const ia_cmc_t *cmc);
++
++
++/*! \brief Deinitialize the view module.
++ *
++ * \param[in]  ia_view_handle    handle maintaining the view instance
++ *
++ * This function deinitilizes the view module and frees internal memory
++ */
++LIBEXPORT ia_err
++ia_view_deinit(ia_view_handle *view_handle);
++
++
++/*! \brief Set configuration parameters
++*
++* \param[in]  ia_view_handle   handle maintaining the view instance
++* \param[in]  config           Sets the basic configuration for the view
++*
++* This function sets the basic configurations parameters
++*/
++LIBEXPORT ia_err
++ia_view_set_configuration(ia_view_handle view_handle,
++    const ia_view_config_t *config);
++
++
++/*! \brief Get configuration parameters
++*
++* \param[in]  ia_view_handle   handle maintaining the view instance
++* \param[out] config           Sets the basic configuration for the view
++*
++* This function gets the basic configurations parameters
++*/
++LIBEXPORT ia_err
++ia_view_get_configuration(ia_view_handle view_handle,
++    ia_view_config_t *config);
++
++/*! \brief Run the view parameter calculation
++*
++* \param[in]  ia_view_handle   handle maintaining the view instance
++* \param[in]  camera_rotation  camera rotation matrix from DVS
++*
++* This function does the calculation of parameters
++*/
++LIBEXPORT ia_err
++ia_view_run(ia_view_handle view_handle,
++    const float camera_rotation[3][3]);
++
++/*! \brief Get the last calculated view parameters
++*
++* \param[in]  ia_view_handle   handle maintaining the view instance
++* \param[out] view_params      Get calculated view parameters
++*
++* This function returns the view parameters
++*/
++LIBEXPORT ia_err
++ia_view_get_view_parameters(ia_view_handle view_handle,
++    ia_view_params_t *view_params);
++
++
++/*! \brief Set view rotation
++*
++* \param[in]  ia_view_handle    handle maintaining the view instance
++* \param[in]  view_rotation     New rotation to apply
++*
++* This function sets the new view rotation
++*/
++LIBEXPORT ia_err
++ia_view_set_view_rotation(ia_view_handle view_handle,
++    const ia_view_rotation_t *view_rotation);
++
++/*! \brief Set camera rotation
++*
++* \param[in]  ia_view_handle    handle maintaining the view instance
++* \param[in]  view_rotation     New rotation to apply
++*
++* This function sets the new camera rotation
++*/
++LIBEXPORT ia_err
++ia_view_set_camera_rotation(ia_view_handle view_handle,
++    const ia_view_rotation_t *camera_rotation);
++
++/*! \brief Get view rotation
++*
++* \param[in]  ia_view_handle    handle maintaining the view instance
++* \param[out] view_rotation    The current rotation settings
++*
++* This function get the current view rotation
++*/
++LIBEXPORT ia_err
++ia_view_get_view_rotation(ia_view_handle view_handle,
++     ia_view_rotation_t *view_rotation);
++
++
++/*! \brief Set window adjustment parameters
++*
++* \param[in] ia_view_handle    handle maintaining the view instance
++* \param[in] fine_adjustments  Set the window adjustment parameters
++*
++* This function sets the window adjustment
++*/
++LIBEXPORT ia_err
++ia_view_set_fine_adjustments(ia_view_handle view_handle,
++    const ia_view_fine_adjustments_t *fine_adjustments);
++
++
++/*! \brief Get window adjustment parameters
++*
++* \param[in]  ia_view_handle   handle maintaining the view instance
++* \param[out] fine_adjustments Get the window adjustment parameters
++*
++* This function gets the current window adjustment
++*/
++LIBEXPORT ia_err
++ia_view_get_fine_adjustments(ia_view_handle view_handle,
++    ia_view_fine_adjustments_t *fine_adjustments);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __IA_VIEW_H__ */
++
++
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
+new file mode 100644
+index 000000000000..0c75a357e534
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
+@@ -0,0 +1,220 @@
++/*
++ * Copyright 2017-2020 Intel Corporation
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *     http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++
++#ifndef __IA_VIEW_TYPES_H_
++#define __IA_VIEW_TYPES_H_
++
++#include <stdint.h>
++#include "ia_types.h"
++
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/*!< ia_view_status_t: ia_view enable/disable and configure status */
++typedef enum {
++    ia_view_bypass=0,
++    ia_view_user_input_configured,
++    ia_view_resolution_configured,
++} ia_view_status_t;
++
++/*!< ia_view_proc_enabled_t: The processing blocks enabled in GDC. Used in PAL*/
++typedef enum {
++    ia_view_proc_enabled_none=0,
++    ia_view_proc_enabled_pre_affine=(1<<0),
++    ia_view_proc_enabled_rotation=(1<<1),
++    ia_view_proc_enabled_post_affine=(1<<2),
++} ia_view_proc_enabled_t;
++
++
++/*!< ia_view_resolution_params_t: The frame resolutions at various points in the pipe*/
++typedef enum {
++    ia_view_resolution_at_sensor_output=0, /*Resolution at sensor output */
++    ia_view_resolution_at_gdc_input,       /*Resolution at gdc input */
++    ia_view_resolution_at_gdc_output,      /*Resolution at gdc output */
++    ia_view_resolution_at_pipe_output,     /*Resolution at pipe output */
++    ia_view_resolution_max,
++} ia_view_resolution_params_t;
++
++
++/*!< Invalid coordinate size: Number of color channels possible to be specified.*/
++#define IA_VIEW_INVALID_COORD_SIZE      (4)
++
++/*!< ia_view_projection_type_t: User controllable projection type*/
++typedef enum {
++    ia_view_projection_rectilinear,
++    ia_view_projection_conical,
++    ia_view_projection_equirectangular,
++    ia_view_projection_2Dbowl,
++    ia_view_projection_cylindrical
++} ia_view_projection_type_t;
++
++/*!< ia_view_camera_mount_type_t: User controllable camera mount type*/
++typedef enum {
++    ia_view_wall_mounted,
++    ia_view_ceiling_mounted,
++} ia_view_camera_mount_type_t;
++
++/*!< ia_view_fine_adjustments_t: Control fine adjustments of the viewing window*/
++typedef struct
++{
++    float horizontal_shift;    /*!< Horizontal shift in pixels*/
++    float vertical_shift;      /*!< Vertical shift in pixels*/
++    float window_rotation;     /*!< Rotate the window, angle in degrees*/
++    float vertical_stretch;    /*!< Vertical stretch factor*/
++} ia_view_fine_adjustments_t;
++
++
++/*!< ia_view_rotation_t: Set view rotation in x, y, z axis*/
++typedef struct
++{
++    float pitch;   /*!< pitch angle in degrees: rotation along X axis*/
++    float yaw;     /*!< yaw angle in degrees: rotation along Y axis*/
++    float roll;    /*!< roll angle in degrees: rotation along Z axis*/
++} ia_view_rotation_t;
++
++
++/*!< ia_view_resolution_t: The resolution required for view*/
++typedef struct
++{
++    int width;      /*!< Resolution width */
++    int height;     /*!< Resolution height */
++    int horz_offset;    /*!< Horizontal offset */
++    int vert_offset;    /*!< Vertical offset */
++    float scale_factor; /*!< Scale factor */
++} ia_view_resolution_t;
++
++/*!< translation array size*/
++#define IA_VIEW_3D_TRANSLATION_SIZE (3)
++
++/*!< ia_view_config_t: Set view parameters*/
++typedef struct
++{
++    ia_view_projection_type_t type;   /*!< type: The projection type desired*/
++    float zoom;                       /*!< zoom: Zoom configuration*/
++    float cone_angle;                 /*!< cone_angle used only for ia_view_projection_conical*/
++    double bowl_radius_sqr;            /*!< bowl_radius_sqr used only for ia_view_projection_2Dbowl*/
++    double bowl_scale;                 /*!< bowl_scale used only for ia_view_projection_2Dbowl*/
++    ia_view_camera_mount_type_t camera_mount_type; /*! camera mount type: The mounting position of the camera: wall, ceiling*/
++    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE]; /*!< Used to fill for each color channel when coordinates falls out of bounds */
++
++    ia_view_rotation_t          camera_rotation;     /*(< Camera rotation configuration */
++    ia_view_rotation_t          view_rotation;       /*!< View rotation configuration */
++    float translation[IA_VIEW_3D_TRANSLATION_SIZE];  /*!< Translation3D vector for Bowl projection*/
++    ia_view_fine_adjustments_t  fine_adjustments;    /*!< Fine adjustment configuration */
++} ia_view_config_t, *ia_isp_bxt_view_params_t;
++
++/*!< ia_view_mbr_limits_t: Set mbr limits for view parameters*/
++typedef struct
++{
++    /*!< Min Zooming on projection*/
++    float  zoom;
++    /*!< max pitch of view*/
++    float pitch;
++    /*!< max yaw of view*/
++    float yaw;
++    /*!< max roll view*/
++    float roll;
++    /*!<  max Window rotation*/
++    float winrotation;
++    /*!< max vertical scale*/
++    float vertical_stretch;
++    /*!< max horizontal shift*/
++    float horizontal_shift;
++    /*!< max vertical shift*/
++    float vertical_shift;
++} ia_view_limits_t;
++
++typedef struct
++{
++    ia_view_limits_t cylindrical;
++    ia_view_limits_t equirectangular;
++    ia_view_limits_t rectilinear;
++    ia_view_limits_t conical_m40;
++    ia_view_limits_t conical_m20;
++    ia_view_limits_t conical_p20;
++    ia_view_limits_t conical_p40;
++}ia_view_mbr_limits_t,ia_isp_bxt_gdc_limits;
++
++
++
++/*!< ia_view_projection_t: Calculated parameter used in PAL*/
++typedef struct
++{
++    ia_view_projection_type_t type; /*!< type: Projection type to be used*/
++    double scale_factor_1[2];   /*!< scale_factor_1: Internal scale factor calculated*/
++    double scale_factor_2[2];   /*!< scale_factor_2: Internal scale factor calculated*/
++    double inv_f_pi;            /*!< inv_f_pi is inverse focal lenght pi: Internal parameter*/
++    double bowl_radius_sqr;
++    double bowl_scale;
++} ia_view_projection_t;
++
++
++/*!< ia_view_params_t: Calculated parameter to be used in PAL*/
++typedef struct
++{
++    /*!< Mask indicating what parameters are enabled*/
++    int32_t enabled_mask;
++
++    /*!< Projections the view */
++    ia_view_projection_t projection;
++
++    /*!< Pre Affine Matrix: Window rotatoin and scale*/
++    float pre_affine_scale_matrix[2][2];
++
++    /*!< Pre Affine Matrix: Translation*/
++    double pre_affine_translation_matrix[2];
++
++    /*!< Rotation Matrix combines camera and view rotations */
++    float rotation_matrix[3][3];
++
++    /*!< Translation3D Matrix for Bowl Projection*/
++    float translation_matrix[IA_VIEW_3D_TRANSLATION_SIZE];
++
++    /*!< Post Affine Matrix */
++    float post_affine_scale_matrix[2][2];
++
++    /*!< Post Affine Matrix */
++    double post_affine_translation_matrix[2];
++
++    /*!< Invalid coordinate mask for each color channel */
++    int32_t invalid_coordinate_mask[IA_VIEW_INVALID_COORD_SIZE];
++
++} ia_view_params_t;
++
++typedef struct
++{
++    ia_view_status_t is_configured;
++    ia_view_config_t config;
++    ia_view_resolution_t resolution[ia_view_resolution_max]; /*!< View resolution at different stages in the pipe */
++    float cmc_affine_scale_matrix[2][2];
++    double cmc_affine_translation_matrix[2];
++    float cmc_focal_length;
++
++    ia_view_params_t isp_params;
++} ia_view_t;
++
++typedef ia_view_t* ia_view_handle;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __IA_VIEW_TYPES_H_ */
++
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
+new file mode 100644
+index 000000000000..4ff38da2ac59
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
+@@ -0,0 +1,218 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2019 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_BLINK_DETECTION_H__
++#define __PVL_BLINK_DETECTION_H__
++
++/** @file    pvl_blink_detection.h
++ *  @brief   This file declares the structures and native APIs of blink detection component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_blink_detection_get_parameters() and pvl_blink_detection_set_parameters() respectively.
++ */
++struct pvl_blink_detection_parameters
++{
++    int32_t threshold;                      /**< A threshold value which is the determinant of the blink. If the given blink score on the eye is
++                                                 greater than or equal to this value, the state of the eye will be estimated as 'closed'. */
++};
++typedef struct pvl_blink_detection_parameters pvl_blink_detection_parameters;
++
++
++/** @brief The enumerated values to represent the blink state of an eye.
++ */
++enum pvl_blink_detection_state
++{
++    pvl_blink_detection_state_open    = 0,   /**< The state representing the eye open. */
++    pvl_blink_detection_state_closed  = 1    /**< The state representing the eye closed. */
++};
++typedef enum pvl_blink_detection_state pvl_blink_detection_state;
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_blink_detection_result
++{
++    int32_t left_score;                     /**< The blink score on the left eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
++    pvl_blink_detection_state left_state;   /**< The blink state on the left eye. */
++    int32_t right_score;                    /**< The blink score on the right eye in range between 0 and 100, where 0 means wide opened eye and 100 means fully closed eye. */
++    pvl_blink_detection_state right_state;  /**< The blink state on the right eye. */
++};
++typedef struct pvl_blink_detection_result pvl_blink_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the blink detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_blink_detection
++{
++    const pvl_version version;          /**< The version information. */
++
++    const int32_t default_threshold;    /**< The default threshold value recommended. */
++    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
++                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
++};
++typedef struct pvl_blink_detection pvl_blink_detection;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the blink detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the blink detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] bd      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_create(const pvl_config *config, pvl_blink_detection **bd);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  bd   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_blink_detection_destroy(pvl_blink_detection *bd);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  bd  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_reset(pvl_blink_detection *bd);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_blink_detection_get_parameters() before setting something.
++ *
++ *  @param[in]  bd      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_set_parameters(pvl_blink_detection *bd, const pvl_blink_detection_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_blink_detection_set_parameters().
++ *
++ *  @param[in]  bd      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_get_parameters(pvl_blink_detection *bd, pvl_blink_detection_parameters *params);
++
++
++/** @brief Detect blink on the face in the input image.
++ *
++ *  This function runs blink detection on the face in the given image.
++ *  It runs on both eyes. It's not allowed to run with only one eye.
++ *  The caller is responsible for allocating the buffer for the result.
++ *
++ *  @param[in]  bd          The handle of the blink detection component.
++ *  @param[in]  image       The input image. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  left_eye    The center point on the left eye of the face.
++ *  @param[in]  right_eye   The center point on the right eye of the face.
++ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_blink_detection_run(pvl_blink_detection *bd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
++                        pvl_blink_detection_result *result);
++
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example face_detection_sample.cpp
++ *  Sample of Face  Detection
++ */
++
++#endif /* __PVL_BLINK_DETECTION_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
+new file mode 100644
+index 000000000000..912b3809046e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
+@@ -0,0 +1,93 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_CONFIG_H__
++#define __PVL_CONFIG_H__
++
++/** @file   pvl_config.h
++ *  @brief  This file defines common data structures for configuration of components.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "pvl_types.h"
++
++
++/** @brief A structure to hold HW acceleration contexts.
++ *  This structure is not actively used now and subjected to change for the future release.
++ */
++struct pvl_acceleration {
++    const pvl_bool is_supporting_gpu;   /**< The supportability of the GPU acceleration by the component. The value should be defined by each component. */
++    const pvl_bool is_supporting_ipu;   /**< The supportability of the IPU acceleration by the component. The value should be defined by each component. */
++
++    pvl_bool enable_gpu;                /**< GPU acceleration switch. Setting pvl_true enables the GPU acceleration mode of the component.
++                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_gpu'. */
++    pvl_bool enable_ipu;                /**< IPU acceleration switch. Setting pvl_true enables the IPU acceleration mode of the component.
++                                             The default value is defined by each component, and the possible values are limited by 'is_supporting_ipu'. */
++
++    void *gpu_context;                  /**< The user-provided GPU acceleration context data. */
++    void *ipu_context;                  /**< The user-provided IPU acceleration context data. */
++};
++typedef struct pvl_acceleration pvl_acceleration;
++
++
++/** @brief A structure to hold default or user-provided log functions.
++ *  This structure is not actively used now and subject to change in future release.
++ */
++struct pvl_log_apis {
++    void (*debug)(const char *fmt, va_list ap);             /**< The logging function for debugging. */
++    void (*error)(const char *fmt, va_list ap);             /**< The logging function for error reporting. */
++    void (*warning)(const char *fmt, va_list ap);           /**< The logging function for warning message. */
++    void (*info)(const char *fmt, va_list ap);              /**< The logging function for information. */
++    void (*dump)(int32_t id, uint8_t *data, uint32_t size); /**< The logging function for dumping binary data. */
++};
++typedef struct pvl_log_apis pvl_log_apis;
++
++
++/**
++ * @brief A structure to hold the configuration of the component.
++ *
++ * This structure is used as a parameter for the initial configuration of the component.
++ *
++ * @code
++ * // Sample usage
++ * pvl_err pvl_xxx_get_default_config(pvl_config* config);
++ * pvl_err pvl_xxx_create(const pvl_config* config, pvl_xxx** component);
++ * @endcode
++ *
++ */
++struct pvl_config {
++    const pvl_version version;      /**< The version information of the component (non-modifiable). */
++    pvl_acceleration acceleration;  /**< The configuration of the HW acceleration. The user can enable or disable the HW acceleration via this structure */
++    pvl_log_apis log_apis;          /**< The logging functions. The users can dispatch logging messages via this structure. */
++};
++typedef struct pvl_config pvl_config;
++
++
++#ifdef __cplusplus
++}
++#endif
++
++
++#endif // __PVL_TYPES_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
+new file mode 100644
+index 000000000000..5fcb4aa4c3c3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
+@@ -0,0 +1,161 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_EYE_DETECTION_H__
++#define __PVL_EYE_DETECTION_H__
++
++/** @file    pvl_eye_detection.h
++ *  @brief   This file declares the structures and native APIs of eye detection component.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_eye_detection_result
++{
++    pvl_point left_eye;         /**< The center position on the left eye (in the view of the observer).
++                                     The origin (0,0) of the point is the upper-left corner of the input image. */
++    pvl_point right_eye;        /**< The center position on the right eye (in the view of the observer). */
++    int32_t confidence;         /**< The confidence value of the detected eyes. The value is negative if the eye detection failed. */
++};
++typedef struct pvl_eye_detection_result pvl_eye_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the eye detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_eye_detection
++{
++    const pvl_version version;              /**< The version information. */
++
++    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the eye distance,
++                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two eyes).
++                                                 The eye detection accuracy will be dropped if the estimated face region (as the parameter of pvl_eye_detection_run) is too large compared to the actual face size. */
++    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
++                                                 The eye detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
++};
++typedef struct pvl_eye_detection pvl_eye_detection;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the eye detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_eye_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the eye detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] ed      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_eye_detection_create(const pvl_config *config, pvl_eye_detection **ed);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  ed   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_eye_detection_destroy(pvl_eye_detection *ed);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  ed  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_eye_detection_reset(pvl_eye_detection *ed);
++
++
++/** @brief Detect left and right eye positions from a region of faces in the image.
++ *
++ *  This function will do the eye detection in the given a region of faces in the image.
++ *  The function caller is responsible for allocation of the buffer for result.
++ *
++ *  @param[in]  ed          The handle of the eye detection component.
++ *  @param[in]  image       The input image for detecting the positions of eyes. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  face_region The struct of rectangular regions of faces.
++ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
++ *  @param[out] result      The result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_eye_detection_run(pvl_eye_detection *ed, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_eye_detection_result *result);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++/** @example face_detection_sample.cpp
++ *  Sample of Eye Detection
++ */
++
++#endif // __PVL_EYE_DETECTION_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
+new file mode 100644
+index 000000000000..754d3d9e5a6e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
+@@ -0,0 +1,275 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++#ifndef __FD_PVL_FACE_DETECTION_H__
++#define __FD_PVL_FACE_DETECTION_H__
++
++/** @file    pvl_face_detection.h
++ *  @brief   This file declares the structures and native APIs of face detection component.
++ */
++
++#include "pvl_config.h"
++#include "pvl_types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/** @brief A enum to present usage modes.
++ *
++ * Will help to choose best parameters for needed work.
++ */
++enum pvl_mode {
++    normal,     /**< Most accurate face detection. */
++    low_power,  /**< Accuracy is sacrificed to get CPU load to minimun. */
++    high_accuracy = normal,
++};
++
++typedef pvl_mode pvl_accuracy; // for backwards compatibility
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_face_detection_get_parameters() and pvl_face_detection_set_parameters() respectively,
++ */
++struct pvl_face_detection_parameters {
++    uint32_t max_num_faces;            /**< The maximum number of detectable faces in one frame.
++                                            max_supported_num_faces in pvl_face_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
++                                            The default value is set to maximum when the component is created. */
++
++    float min_face_ratio;              /**< The ratio of minimum detectable face size to the shorter side of the input image.
++                                            The value has the range between 0.0 and 1.0.
++                                            The smallest detectable face size is calculated as min_face_ratio * min(image width, image height).
++                                            The faces smaller than the minimum size may not be detected. */
++
++    uint16_t rip_range;                /**< The degree of RIP (Rotation In-Plane) ranges, representing [-rip_range, +rip_range]. */
++
++    uint16_t rop_range;                /**< The degree of ROP (Rotation Out-of-Plane) ranges, representing [-rop_range, +rop_range]. */
++
++    uint32_t num_rollover_frames;      /**< The number of rollover frames indicating how many frames the entire scanning will be distributed.
++                                            The value works in the preview mode, only. */
++};
++typedef struct pvl_face_detection_parameters pvl_face_detection_parameters;
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_face_detection_result {
++    pvl_rect rect;                     /**< The rectangular region of the detected face. */
++    int32_t confidence;                /**< The confidence value of the detected face [0, 100]. */
++    int32_t rip_angle;                 /**< The approximated value of RIP angle (in degree) of the detected face. */
++    int32_t rop_angle;                 /**< The approximated of ROP angle (in degree) of the detected face. */
++    int32_t tracking_id;               /**< The tracking id of the face. Only valid in preview mode.
++                                            The value will be unique throughout the component life cycle, unless pvl_face_detection_reset() is called. */
++};
++typedef struct pvl_face_detection_result pvl_face_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the face detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_face_detection {
++    const pvl_version version;                  /**< The version information. */
++
++    const uint32_t max_supported_num_faces;     /**< The maximum number of faces supported by this component. */
++    const uint32_t min_face_size;               /**< The minimum size in pixel of detectable faces of this component. */
++
++    const uint16_t rip_range_max;               /**< The maximum value of RIP range (in degree). */
++    const int16_t rip_range_resolution;         /**< The resolution of RIP range value. RIP range should be multiple of this value. */
++
++    const uint16_t rop_range_max;               /**< The maximum value of ROP range (in degree). */
++    const int16_t rop_range_resolution;         /**< The resolution of ROP range value. ROP range should be multiple of this value. */
++};
++typedef struct pvl_face_detection pvl_face_detection;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the face detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_face_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the face detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] fd      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_face_detection_create(const pvl_config *config, pvl_face_detection **fd);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  fd   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_face_detection_destroy(pvl_face_detection *fd);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states including face tracking information and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  fd  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_face_detection_reset(pvl_face_detection *fd);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
++ *
++ *  @param[in]  fd      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
++ */
++PVLAPI pvl_err
++pvl_face_detection_set_parameters(pvl_face_detection *fd, const pvl_face_detection_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_face_detection_set_parameters().
++ *
++ *  @param[in]  fd      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_face_detection_get_parameters(pvl_face_detection *fd, pvl_face_detection_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++*
++*  Get the predefined parameters.
++*  This function can be used to get good values for diffent needs.
++*
++*  @param[in]  mode     The requested usage mode.
++*  @param[out] params   The buffer which will hold parameters. Its allocation must be managed by the caller.
++*
++*  @return     On success, @ref pvl_success.
++*
++*  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++*/
++PVLAPI pvl_err
++pvl_face_detection_default_parameters(pvl_mode mode, pvl_face_detection_parameters *params);
++
++
++/** @brief Detect faces from the input image.
++ *
++ *  This function will run the face detection in the given image.
++ *  The caller is responsible for allocating the buffer for the result.
++ *
++ *  @param[in]  fd          The handle of the face detection component.
++ *  @param[in]  image       The input image. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[out] result      The result buffer.
++ *  @param[in]  max_result  The number of results that the buffers can hold.
++ *
++ *  @return     On success, the number of detected faces.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null instance of fd or non-positive max_result.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI int32_t
++pvl_face_detection_run_in_image(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
++
++
++/** @brief Detect faces from the gray image, a part of the sequence of preview frame.
++ *
++ *  This function performs the face detection to the given image, assuming that the image is a part of the sequence of preview or video frames.
++ *  The function re-uses the result of the previous frames to detect faces faster, i.e. the result will be affected by previous calls of this function,
++ *  whereas each call of pvl_face_detection_run_in_image() works independently.
++ *  The caller is responsible for allocating the result buffer.
++ *
++ *  @param[in]  fd          The handle of the face detection component.
++ *  @param[in]  image       The input image. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[out] result      The result buffer.
++ *  @param[in]  max_result  The number of results that the buffer can hold.
++ *
++ *  @return     On success, the number of detected faces, which is non-negative value.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or non-positive max_result.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI int32_t
++pvl_face_detection_run_in_preview(pvl_face_detection *fd, const pvl_image *image, pvl_face_detection_result *result, int32_t max_result);
++
++
++#ifdef __cplusplus
++}
++#endif   // __cplusplus
++
++/** @example face_detection_sample.cpp
++ *  Sample of Face Detection
++ */
++
++#endif   // __FD_PVL_FACE_DETECTION_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
+new file mode 100644
+index 000000000000..1ce4653a4850
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
+@@ -0,0 +1,478 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2016 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_FACE_RECOGNITION_H__
++#define __PVL_FACE_RECOGNITION_H__
++
++/** @file    pvl_face_recognition.h
++ *  @brief   This file declares the structures and native APIs of face recognition component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define FACE_RECOGNIZER_UNKNOWN_PERSON_ID   (-10000)   /**< The "unknown person", which will be assigned to person_id of the structure, 'pvl_face_recognition_facedata'. */
++
++
++/** @brief A structure to hold a set of data representing a face which is used in face recognition.
++ *
++ *  The user is recommended to use the struct returned from pvl_face_recognition_run_in_image() when registering the facedata
++ *  with assigning unique positive number to person_id field.
++ */
++struct pvl_face_recognition_facedata{
++    uint64_t face_id;       /**< The unique id of the face data. */
++    int32_t  person_id;     /**< The unique id of the person associated with the face data. The valid person will have positive person_id (i.e. person_id > 0). */
++    uint32_t time_stamp;    /**< The timestamp when the face data was generated. */
++    int32_t  condition;     /**< The environmental information of the face. Reserved for future use. */
++    int32_t  checksum;      /**< The checksum value of the face data. */
++    uint8_t  *data;         /**< The pointer to the actual face data. Face data is essentially a binary encoded representation of the face generated from the gray face image.
++                                 The size will be stored in facedata_size of the structure 'pvl_face_recognition'. */
++};
++typedef struct pvl_face_recognition_facedata pvl_face_recognition_facedata;
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_face_recognition_get_parameters() and pvl_face_recognition_set_parameters() respectively.
++ */
++struct pvl_face_recognition_parameters{
++    uint32_t max_faces_in_preview;  /**< The maximum number of recognizable faces in one frame.
++                                         The maximum allowable value is 'max_supported_faces_in_preview' in the structure 'pvl_face_recognition',
++                                         and the minimum allowable value is 1. The default value is set to maximum while the component created.
++                                         (i.e. 1 <= max_faces_inpreview <= max_supported_faces_in_preview) */
++};
++typedef struct pvl_face_recognition_parameters pvl_face_recognition_parameters;
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_face_recognition_result{
++    pvl_face_recognition_facedata facedata;     /**< The extracted face data from the face. If recognition succeeded, a valid person-id will be allocated in the field 'person_id'. */
++    int32_t similarity;                         /**< The estimated similarity between the input face and the faces in the database. The biggest value will be assigned. */
++};
++typedef struct pvl_face_recognition_result pvl_face_recognition_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the blink detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_face_recognition{
++    const pvl_version version;                      /**< The version information. */
++
++    const uint32_t max_supported_faces_in_preview;  /**< The maximum number of faces supported by this component. */
++    const uint32_t max_faces_in_database;           /**< The maximum number of faces that the database can hold in the current version. */
++    const uint32_t max_persons_in_database;         /**< The maximum number of persons that the database can hold in the current version. */
++    const uint32_t max_faces_per_person;            /**< The maximum number of faces per person in the current version. */
++    const uint32_t facedata_size;                   /**< The fixed size of the face data (in bytes) for the current version. */
++};
++typedef struct pvl_face_recognition pvl_face_recognition;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the face recognition component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the face recognition component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] fr      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_nomem               Failed in allocating the memory.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_create(const pvl_config *config, pvl_face_recognition **fr);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  fr   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_face_recognition_destroy(pvl_face_recognition *fr);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states, the internal database and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  fr  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or database.
++ *  @retval     pvl_err_nomem               Failed in re-allocating the memory.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_reset(pvl_face_recognition *fr);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_face_recognition_get_parameters() before setting something.
++ *
++ *  @param[in]  fr      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in re-allocating the memory for parameter changes.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_set_parameters(pvl_face_recognition *fr, const pvl_face_recognition_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  @param[in]  fr      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Memory needs to be managed by caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_get_parameters(pvl_face_recognition *fr, pvl_face_recognition_parameters *params);
++
++
++/** @brief The main function that run the face recognition for the faces in image.
++ *
++ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
++ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
++ *  If the recognition succeeded, person_id field at corresponding index of the result will be filled with valid (+) person_id.
++ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
++ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
++ *  the positive person_id does not guarantee that the recognition result is correct.
++ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_image_with_rect instead.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
++ *  @param[in]  left_eyes   The array of the center points on the left eyes of faces to be recognized.
++ *  @param[in]  right_eyes  The array of the center points on the right eyes of faces to be recognized.
++ *  @param[out] results     The array of the result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
++ */
++DEPRECATED_PVLAPI pvl_err
++pvl_face_recognition_run_in_image(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
++                                  const pvl_point *left_eyes, const pvl_point *right_eyes,
++                                  pvl_face_recognition_result *results);
++
++
++/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
++ *
++ *  This function is basically the same as pvl_face_recognition_run_in_image(), but assuming that the input image is the part of the sequence of preview or video frames.
++ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
++ *  @deprecated This function is deprecated, consider using pvl_face_recognition_run_in_preview_with_rect instead.
++ *
++ *  @param[in]  fr              The handle of the face recognition component.
++ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
++ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
++ *  @param[in]  left_eyes       The array of the center points on the left eyes of faces to be recognized.
++ *  @param[in]  right_eyes      The array of the center points on the right eyes of faces to be recognized.
++ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
++ *  @param[out] results         The array of the result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
++ */
++DEPRECATED_PVLAPI pvl_err
++pvl_face_recognition_run_in_preview(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
++                                    const pvl_point *left_eyes, const pvl_point *right_eyes, const int32_t *tracking_ids,
++                                    pvl_face_recognition_result *results);
++
++/** @brief The main function that run the face recognition for the faces in image.
++ *
++ *  This function conducts the face recognition by trying to match query faces (input faces) against the faces in the internal database.
++ *  The internal database should be populated in advance, via pvl_face_recognition_register_facedata().
++ *  If the recognition succeeded, person_ids at corresponding index will be filled with valid (+) person_id.
++ *  Otherwise, person_id will be @ref FACE_RECOGNIZER_UNKNOWN_PERSON_ID.
++ *  Since the face recognition result could be the false-alarm (i.e. incorrect recognition.),
++ *  the positive person_id does not guarantee that the recognition result is correct.
++ *  This function need face rectangle and face angle instead of eye position.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  image       The input image that contains the query faces (input faces). All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  num_faces   The number of query faces (input faces) to recognize.
++ *  @param[in]  face_rect   The array of the rectangle of detected faces to be recognized.
++ *  @param[in]  face_angle  The array of RIP (Rotation in Plane) value of the faces in degree.
++ *  @param[out] results     The array of the result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_run_in_image_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
++                                            const pvl_rect* face_rect, const int32_t* face_angle, pvl_face_recognition_result *results);
++
++
++/** @brief Run the face recognition component for the faces in image assuming the image is a part of series of preview frames.
++ *
++ *  This function is basically the same as pvl_face_recognition_run_in_image_with_rect(), but assuming that the input image is the part of the sequence of preview or video frames.
++ *  Utilizing results from previous frames, this function shows faster and more reliable recognition results.
++ *  This function need face rectangle and face angle instead of eye position.
++ *
++ *  @param[in]  fr              The handle of the face recognition component.
++ *  @param[in]  image           The input image that contains the query faces (input faces). All image formats are supported.
++ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_iamge_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  num_faces       The number of query faces (input faces) to recognize.
++ *  @param[in]  face_rect       The array of the rectangle of detected faces to be recognized.
++ *  @param[in]  face_angle      The array of RIP (Rotation in Plane) value of the faces in degree.
++ *  @param[in]  tracking_ids    Tracking-ids returned from face detector. Using pvl_face_recognition_run_in_image() is recommended if tracking-id is not available.
++ *  @param[out] results         The array of the result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or negative num_faces.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_run_in_preview_with_rect(pvl_face_recognition *fr, const pvl_image *image, int32_t num_faces,
++                                              const pvl_rect* face_rect, const int32_t* face_angle, const int32_t *tracking_ids, pvl_face_recognition_result *results);
++
++
++/** @brief Register one face data to the internal database of the component.
++ *
++ *  This function registers the given face data into the internal database.
++ *  It is common practice for the user to read face data from the external database (e.g. SQLite, MySQL, file system, etc.) and register each face data to the internal database.
++ *  Before using pvl_face_recognition_run_in_image() or pvl_face_recognition_run_in_preview(),
++ *  the user should call this function to register faces to the database.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  facedata    A face data instance to be registered.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or wrong facedata.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
++ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_register_facedata(pvl_face_recognition *fr, const pvl_face_recognition_facedata *facedata);
++
++
++/** @brief Unregister the face from the internal database.
++ *
++ *  This function deletes the face data from internal database.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  face_id     Face id to be unregistered.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
++ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_unregister_facedata(pvl_face_recognition *fr, uint64_t face_id);
++
++
++/** @brief Unregister all faces associated with the person_id.
++ *
++ *  This function is used to remove all registered faces of specified person.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  person_id   Person id to be unregistered.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given person_id.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_unregister_person(pvl_face_recognition *fr, int32_t person_id);
++
++
++/** @brief Update person_id of specified face data.
++ *
++ *  This function is used to modify person id of specific face data. Usually used to assign a person id to unknown face or incorrectly recognized face.
++ *
++ *  @param[in]  fr              The handle of the face recognition component.
++ *  @param[in]  face_id         Face id to modify.
++ *  @param[in]  new_person_id   Person id to update with.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr parameter, or negative value to the face_id/new_person_id.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_database_full       Not enough memory left to insert new data.
++ *  @retval     pvl_err_no_such_item        Face data not found from the database that matches the given face_id.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_update_person(pvl_face_recognition *fr, uint64_t face_id, int32_t new_person_id);
++
++
++/** @brief Get number of faces in the internal database.
++ *
++ *  This function returns the number of faces registered in the internal database.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *
++ *  @return     On success, returns number of faces (non-negative value.)
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI int32_t
++pvl_face_recognition_get_num_faces_in_database(pvl_face_recognition *fr);
++
++
++/** @brief Get number of persons in the internal database.
++ *
++ *  This function returns the number of persons registered in the internal database.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *
++ *  @return     On success, returns number of persons (non-negative value.)
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI int32_t
++pvl_face_recognition_get_num_persons_in_database(pvl_face_recognition *fr);
++
++
++/** @brief Get number of faces of a specific person_id in the internal database.
++ *
++ *  This function returns the number of faces of a specific person_id registered in the internal database.
++ *
++ *  @param[in]  fr          The handle of the face recognition component.
++ *  @param[in]  person_id   Person id to retrieve number of faces.
++ *
++ *  @return     On success, returns number of faces (non-negative value.)
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI int32_t
++pvl_face_recognition_get_num_faces_of_person_in_database(pvl_face_recognition *fr, int32_t person_id);
++
++
++/** @brief Allocate the memory of result buffers.
++ *
++ *  This function is used to allocate memory for the result buffers which contain the array of face feature data.
++ *  The memory for result buffers should be allocated in the form of the array of 'pvl_face_recognition_result' before
++ *   the functions which conduct face recognition are called.
++ *  This function conducts the memory allocation for the output buffers.
++ *
++ *  @param[in]  fr            The handle of the face recognition component.
++ *  @param[in]  max_faces     The maximum number of recognizable faces, which is used for allocating results buffer.
++ *  @param[out] fr_results    The initialized array of the result buffer.
++ *
++ *  @return     On success,   @ref pvl_success.
++ *  @return     On failure,   @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the fr or fr_results parameter, or negative value to the max_faces.
++ *  @retval     pvl_err_out_of_bound        Parameters or condition for the allocation is not acceptable.
++ *  @retval     pvl_err_nomem               Failed in allocating the memory of the internal buffers or the database.
++ */
++PVLAPI pvl_err
++pvl_face_recognition_create_result_buffer(pvl_face_recognition *fr, int max_faces, pvl_face_recognition_result **fr_results);
++
++
++/** @brief Destroy the memory buffer.
++ *
++ * This function releases internal allocated buffers and destroys the data.
++ *
++ *  @param[in]  fr_results   The handle of the result buffer to be destroyed.
++ *
++ */
++PVLAPI void
++pvl_face_recognition_destroy_result_buffer(pvl_face_recognition_result *fr_results);
++
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example face_recognition_sample.cpp
++ *  Sample of Face Recognition
++ */
++
++#endif /* __PVL_FACE_RECOGNITION_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
+new file mode 100644
+index 000000000000..909b4041c3b9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
+@@ -0,0 +1,234 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2016 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_IMAGE_MONTAGE_H__
++#define __PVL_IMAGE_MONTAGE_H__
++
++/** @file    pvl_image_montage.h
++ *  @brief   This file declares the structures and native APIs of image montage component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_image_montage_get_parameters() and pvl_image_montage_set_parameters() respectively.
++ */
++struct pvl_image_montage_parameters
++{
++    int search_region_margin_percentage;    /**< The percentage of the region to be searched to the entire sub image (default: 20). */
++};
++typedef struct pvl_image_montage_parameters pvl_image_montage_parameters;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the image montage instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_image_montage
++{
++    const pvl_version version;              /**< The version information. */
++
++    const int default_search_region_margin; /**< The default percentage of the region to be search to the entire sub image (recommended to use) */
++};
++typedef struct pvl_image_montage pvl_image_montage;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the image montage component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_image_montage_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the image montage component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] im      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_image_montage_create(const pvl_config *config, pvl_image_montage **im);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  im   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_image_montage_destroy(pvl_image_montage *im);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  im  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_image_montage_reset(pvl_image_montage *im);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_image_montage_get_parameters() before setting something.
++
++ *  @param[in]  im      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
++ */
++PVLAPI pvl_err
++pvl_image_montage_set_parameters(pvl_image_montage *im, const pvl_image_montage_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_image_montage_set_parameters().
++ *
++ *  @param[in]  im      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_image_montage_get_parameters(pvl_image_montage *im, pvl_image_montage_parameters *params);
++
++
++/** @brief Set the main image.
++ *
++ *  This functions stores information about the main image.
++ *  The main image is labelled as the "background" of image montage.
++ *  Input image data and an array of the objects coordinates which have been stored into internal
++ *  memory by this function could be used when the function pvl_image_montage_run() runs.
++ *
++ *  @param[in]  im           The handle of the image montage component.
++ *  @param[in]  main_img     The main image. Currently, only pvl_image_format_rgba32 is supported.
++ *  @param[in]  objects      The coordinates of the objects.
++ *  @param[in]  num_objects  The number of objects.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_image_montage_set_main_image(pvl_image_montage *im, const pvl_image *main_img, pvl_rect *objects, int num_objects);
++
++
++/** @brief Set the sub image where the object patches come from.
++ *
++ *  This functions stores information about the sub image.
++ *  The sub image contains the target objects which would be fetched in composing function.
++ *  Input image data and an array of the objects coordinates which have been stored by this
++ *  function could be used when the function pvl_image_montage_run() runs.
++ *
++ *  @param[in]  im           The handle of the image montage component.
++ *  @param[in]  sub_img      The sub image. Currently, only pvl_image_format_rgba32 is supported.
++ *  @param[in]  objects      The coordinates of the objects.
++ *  @param[in]  num_objects  The number of objects.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_image_montage_set_sub_image(pvl_image_montage *im, const pvl_image *sub_img, pvl_rect *objects, int num_objects);
++
++
++/** @brief Compose the montage on the main image, cropping the patch from the sub image.
++ *
++ *  This function is to combine two images(main,sub), cropping an object image patch which is placed on the N-th coordinate
++ *  of object array in the sub image, overlaying the patch onto the N-th coordinate of objects array in the main image.
++ *
++ *  @param[in]  im           The handle of the image montage component.
++ *  @param[in]  idx_on_main  The index of the object on the main image.
++ *  @param[in]  idx_on_sub   The index of the object on the sub image.
++ *  @param[out] result       The composed image. Must allocate memory big enough as the main image size to data field of 'result' before this function is called.
++ *                           The image format should be same as the formats of main/sub images, which is currently pvl_image_format_rgba32 only.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of im.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_image_montage_run(pvl_image_montage *im, int idx_on_main, int idx_on_sub, pvl_image *result);
++
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example image_montage_sample.c
++ *  Sample of Image Montage
++ */
++
++#endif /* __PVL_IMAGE_MONTAGE_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
+new file mode 100644
+index 000000000000..122ca08084d4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
+@@ -0,0 +1,140 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2019 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_LANDMARK_DETECTION_H__
++#define __PVL_LANDMARK_DETECTION_H__
++
++/** @file    pvl_landmark_detection.h
++ *  @brief   This file declares the structures and native APIs of facial landmark detection component.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++/** @brief The enumerated values to specify the facial landmark shape points.
++*/
++enum pvl_facial_landmark_shape_point_num {
++    pvl_facial_landmark_shape27 = 27,           /**< 27 point */
++    pvl_facial_landmark_shape50 = 50,           /**< 50 point */
++    pvl_facial_landmark_shape78 = 78,           /**< 78 point */
++};
++typedef enum pvl_facial_landmark_shape_point_num pvl_facial_landmark_shape_point_num;
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_facial_landmark_detection_result
++{
++    float points[pvl_facial_landmark_shape78 * 2];
++};
++typedef struct pvl_facial_landmark_detection_result pvl_facial_landmark_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the facial landmark detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_facial_landmark_detection
++{
++    const pvl_version version;              /**< The version information. */
++    pvl_facial_landmark_shape_point_num shape_point_num;
++};
++typedef struct pvl_facial_landmark_detection pvl_facial_landmark_detection_context;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the facial landmark detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_facial_landmark_detection_get_default_config(pvl_config* config);
++
++
++/** @brief Create an instance of the facial landmark detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] ed      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_facial_landmark_detection_create(const pvl_config* config, pvl_facial_landmark_detection_context** fld, const pvl_facial_landmark_shape_point_num point_num = pvl_facial_landmark_shape78);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  ed   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_facial_landmark_detection_destroy(pvl_facial_landmark_detection_context* fld);
++
++/** @brief Detect facial landmark positions from one of face in the image.
++ *
++ *  This function will do the facial landmark detection in the given face in the image.
++ *  The function caller is responsible for allocation of the buffer for result.
++ *
++ *  @param[in]  fld             The handle of the facial landmark detection component.
++ *  @param[in]  image           The input image for detecting the positions of facial landmark detection. All image formats are supported.
++ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  face_regions    The struct of rectangular region of the face.
++ *  @param[in]  rip_angles      The value of RIP (Rotation in Plane) of the face in degree.
++ *  @param[out] result          The result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++
++PVLAPI pvl_err pvl_facial_landmark_detection_run(pvl_facial_landmark_detection_context* fld,
++    const pvl_image* image, pvl_rect face_region, int32_t rip_angle,
++    pvl_facial_landmark_detection_result* result);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // __PVL_LANDMARK_DETECTION_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
+new file mode 100644
+index 000000000000..2988d11e5540
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
+@@ -0,0 +1,159 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2016 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_MOUTH_DETECTION_H__
++#define __PVL_MOUTH_DETECTION_H__
++
++/** @file    pvl_mouth_detection.h
++ *  @brief   This file declares the structures and native APIs of mouth detection component.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_mouth_detection_result
++{
++    pvl_point mouth;
++    int32_t confidence;
++};
++typedef struct pvl_mouth_detection_result pvl_mouth_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the mouth detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_mouth_detection
++{
++    const pvl_version version;              /**< The version information. */
++
++    const float max_face_width_ratio;       /**< The maximum supported ratio of the width of the face to the mouth distance,
++                                                 s.t. max_face_with_ratio = (the width of the face)/(the distance between two mouths).
++                                                 The mouth detection accuracy will be dropped if the estimated face region (as the parameter of pvl_mouth_detection_run) is too large compared to the actual face size. */
++    const float max_rip_error_tolerance;    /**< The maximum supported value (in degree) of the difference between the actual RIP degree and the input RIP degree.
++                                                 The mouth detection accuracy will be dropped if the actual RIP degree is greater than (input RIP angle)±(max_rip_error_tolerance). */
++};
++typedef struct pvl_mouth_detection pvl_mouth_detection;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the mouth detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_mouth_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the mouth detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] md      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_mouth_detection_create(const pvl_config *config, pvl_mouth_detection **md);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  md   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_mouth_detection_destroy(pvl_mouth_detection *md);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  md  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_mouth_detection_reset(pvl_mouth_detection *md);
++
++
++/** @brief Detect left and right mouth positions from a region of faces in the image.
++ *
++ *  This function will do the mouth detection in the given a region of faces in the image.
++ *  The function caller is responsible for allocation of the buffer for result.
++ *
++ *  @param[in]  md          The handle of the mouth detection component.
++ *  @param[in]  image       The input image for detecting the positions of mouths. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  face_region The struct of rectangular regions of faces.
++ *  @param[in]  rip_angle   The value of RIP (Rotation in Plane) of the faces in degree.
++ *  @param[out] result      The result buffer.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_mouth_detection_run(pvl_mouth_detection *md, const pvl_image *image, const pvl_rect *face_region, int32_t rip_angle, pvl_mouth_detection_result *result);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++/** @example face_detection_sample.cpp
++ *  Sample of Mouth Detection
++ */
++
++#endif // __PVL_MOUTH_DETECTION_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
+new file mode 100644
+index 000000000000..3b2220b58662
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
+@@ -0,0 +1,243 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_OBJECT_TRACKING_H__
++#define __PVL_OBJECT_TRACKING_H__
++
++/** @file    pvl_object_tracking.h
++ *  @brief   This file declares the structure and native APIs of object tracking component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *  The variables in this structure will be retrieved and asigned, via pvl_object_tracking_get_parameters() and pvl_object_tracking_set_parameters() respectively,
++ */
++struct pvl_object_tracking_parameters
++{
++    int32_t num_concurrent_tracking;                      /**< the number of maximum tracking context inside the handle */
++    int32_t tracking_type;                                /**< the options about how the tracking started. Reserved for future usage. */
++};
++
++typedef struct pvl_object_tracking_parameters pvl_object_tracking_parameters;
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_object_tracking_result
++{
++    pvl_bool is_tracking_succeed;        /**< The tracking state of the object. */
++    int32_t tracking_id;                 /**< The ID for a certain object starting at 1. This is unique among the sessions until the handle is destroyed. */
++    int32_t score;                       /**< The tracking score of the object in the range of 0 to 100, where 0 means it doesn't like the object at all, and 100 means quite sure of that object. */
++    pvl_rect tracked_region;             /**< The tracking area */
++};
++
++typedef struct pvl_object_tracking_result pvl_object_tracking_result;
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the object tracking instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_object_tracking
++{
++    const pvl_version version;                /**< The version information. */
++
++    const int32_t max_supported_num_object;   /**< The maximum number of objects supported by this component. */
++};
++
++typedef struct pvl_object_tracking pvl_object_tracking;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the face detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_get_default_config(pvl_config* config);
++
++
++/** @brief Create an instance of the object tracking component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config      The configuration information of the component.
++ *  @param[out] ot          A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_create(const pvl_config* config, pvl_object_tracking **ot);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  ot  The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_object_tracking_destroy(pvl_object_tracking *ot);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states including object tracking information and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  ot  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_reset(pvl_object_tracking *ot);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_face_detection_get_parameters() before setting something.
++ *
++ *  @param[in]  ot      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_set_parameters(pvl_object_tracking *ot, const pvl_object_tracking_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_face_detection_set_parameters().
++ *
++ *  @param[in]  ot      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_get_parameters(pvl_object_tracking *ot, pvl_object_tracking_parameters *params);
++
++
++/** @brief Specify the start ROI for a new tracking session.
++ *
++ *  This function will initialize the object tracking in the input image.
++ *  The tracking context will be created and kept in the handle, which is supposed to be used at next OT processing.
++ *
++ *  Caller is responsible for allocating the the buffer for the result.
++ *
++ *  @param[in]  ot          The handle of this component.
++ *  @param[in]  image       The input image. Currently, only pvl_image_format_nv12 is supported.
++ *  @param[in]  the_object  The ROI of the object to track.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or image or the object.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_out_of_bound        Current number of tracking object is already full.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_add_object(pvl_object_tracking *ot, const pvl_image *image, const pvl_rect *the_object);
++
++
++/** @brief Remove specified object from object tracking.
++ *
++ *  This function will stop tracking the object which have same tracking id with the input parameter.
++ *  The tracking context will be removed in the handle.
++ *
++ *  Caller is responsible for allocating the pvl_rect.
++ *
++ *  @param[in]  ot          The handle of this component.
++ *  @param[in]  tracking_id Tracking id of the object which will be removed.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or non-positive tracking_id.
++ *  @retval     pvl_err_no_such_item        Failed to find tracking object having tracking_id.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_object_tracking_remove_object(pvl_object_tracking *ot, const int32_t tracking_id);
++
++
++/** @brief Main function to run object tracking on all of the object in the input image as a part of preview or video frames.
++ *
++ *  This function will run object tracking on the input image with the tracking context held inside the OT handle.
++ *  As this is a tracking component, there's an assumption this frame has temporal correlation with previous and next input images.
++ *  The tracking result will be stored up to max_result, no matter how many contexts are inside handle.
++ *
++ *  Caller is responsible for allocating the buffer for result.
++ *
++ *  @param[in]  ot             The handle of this component.
++ *  @param[in]  image          The input image. Currently, only pvl_image_format_n12 is supported.
++ *  @param[out] result         Buffer to write the result back. Must have enough memory to hold the result.
++ *  @param[in]  max_result     The number of results that the buffers can hold.
++ *
++ *  @return     On success, the number of current tracking objects.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of ot or result, or non-positive max_result.
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI int32_t
++pvl_object_tracking_run(pvl_object_tracking *ot, const pvl_image *image, pvl_object_tracking_result *result, int32_t max_result);
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example object_tracking_sample.cpp
++*  Sample of Object Tracking
++*/
++
++#endif /* __PVL_OBJECT_TRACKING_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
+new file mode 100644
+index 000000000000..108314cdd422
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
+@@ -0,0 +1,267 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2016 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_PANORAMA_H__
++#define __PVL_PANORAMA_H__
++
++/** @file    pvl_panorama.h
++ *  @brief   This file declares the structures and native APIs of panorama component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @brief The enumerated values to specify the 1D panning direction of panoramic stitch.
++ */
++enum pvl_panorama_direction {
++    pvl_panorama_direction_still,           /**< No direction - still */
++    pvl_panorama_direction_right,           /**< Left to right panning */
++    pvl_panorama_direction_left,            /**< Right to left panning */
++    pvl_panorama_direction_down,            /**< Downward panning */
++    pvl_panorama_direction_up,              /**< Upward panning */
++    pvl_panorama_direction_preview_auto     /**< The direction of panning is automatically detected in preview mode. */
++};
++typedef enum pvl_panorama_direction pvl_panorama_direction;
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_panorama_get_parameters() and pvl_panorama_set_parameters() respectively.
++ */
++struct pvl_panorama_parameters {
++    uint32_t overlapping_ratio;         /**< The expected overlapping ratio between adjacent input images (in percent).
++                                             Smaller value results in larger FoV and also larger output image and vice versa.
++                                             In addition, however, larger value tends to result in more accurate alignments.
++                                             The min/max and default values are defined in pvl_panorama structure in runtime. */
++
++    pvl_panorama_direction direction;   /**< The assumed panning direction of input images. If pvl_panorama_direction_preview_auto is set
++                                             the direction would be automatically estimated while processing preview.(See pvl_parnorama_detect_frame_to_stitch()
++                                             Otherwise, the direction is assumed to be explicitly specified. */
++};
++typedef struct pvl_panorama_parameters pvl_panorama_parameters;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the panorama instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_panorama {
++    const pvl_version version;                  /**< The version information. */
++
++    const uint32_t max_supported_num_images;    /**< The maximum number of input images supported by this component. */
++
++    const uint32_t min_overlapping_ratio;       /**< The minimum configurable value of overlapping ratio (in percent) */
++    const uint32_t max_overlapping_ratio;       /**< The maximum configurable value of overlapping ratio. (in percent) */
++    const uint32_t default_overlapping_ratio;   /**< The default value of overlapping ratio. (in percent) */
++};
++typedef struct pvl_panorama pvl_panorama;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the panorama component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_panorama_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the panorama component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] pano    A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration or fail to load MDF program.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_panorama_create(const pvl_config *config, pvl_panorama **pano);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  pano The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_panorama_destroy(pvl_panorama *pano);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states, the stitched images, the composed output image and context will be reset except the run-time parameters set by user.
++ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
++ *
++ *  @param[in]  pano    The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_panorama_reset(pvl_panorama *pano);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_panorama_get_parameters() before setting something.
++ *
++ *  @param[in]  pano    The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory for parameter changes.
++ */
++PVLAPI pvl_err
++pvl_panorama_set_parameters(pvl_panorama *pano, const pvl_panorama_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_panorama_set_parameters().
++ *
++ *  @param[in]  pano    The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_panorama_get_parameters(const pvl_panorama *pano, pvl_panorama_parameters *params);
++
++
++/** @brief Detect preview frames to capture.
++ *
++ *  This function will detect preview frames that matches well with the imaginary frame the component is expecting.
++ *  The overlapping_ratio parameter affects the offset of expecting scene projected from the last stitched image.
++ *  This function should be called after the first image is stitched.
++ *
++ *  In normal scenario this function returns...
++ *  @verbatim
++    0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 ...
++              |                 |           |                     |
++              2nd image         3rd image   4th image             5th image ... @endverbatim
++ *
++ *  @param[in]  pano            The handle of the panorama component.
++ *  @param[in]  preview_frame   The input preview frame. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
++ *  @param[out] offset          The 2D offset of input frame from the last stitched image.
++ *  @param[out] direction       The direction(left/right/up/down) to which input image is moving.
++ *
++ *  @return     On success, the stitch order, or equivalently the stitch index(>0) where the image to be captured stitched at.
++ *                  0(= pvl_success) means that 'successful but not detected yet'.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null instance of pano, preview_frame or offset.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI int32_t
++pvl_panorama_detect_frame_to_stitch(pvl_panorama *pano, const pvl_image *preview_frame, pvl_point *offset, pvl_panorama_direction *direction);
++
++
++/** @brief Stitch a input image at the tail of stitched images so far
++ *
++ *  This function will stitch a input image with the last stitched image using given offset as an initial guess.
++ *  The series of input images are assumed to be given in the right order in terms of the panning direction.
++ *  If it's the first image this function just register it and return.
++ *  The maximum number of registerable images is bounded by 'max_supported_num_images' attribute of pvl_panorama structure.
++ *
++ *  @param[in]  pano            The handle of the panorama component.
++ *  @param[in]  input_image     The input image to be stitched. Currently, only pvl_image_format_nv12 and pvl_image_format_nv21 are supported.
++ *  @param[in]  offset          (Optional) The 2D offset of input image from the previous image. If NULL is given the offset values will be estimated.
++ *                                         If it's the first image the offset parameter will be ignored.
++ *
++ *  @return     On success, @ref pvl_success
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or input_image.
++ *  @retval     pvl_err_out_of_bound        stitch_index < 0 or stitch_index >= max_supported_num_image
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_panorama_stitch_one_image(pvl_panorama *pano, pvl_image *input_image, const pvl_point *offset);
++
++
++/** @brief Compose all the stitched image so far into the final output image.
++ *
++ *  This function will compose all the stitched images and allocate internal image buffer to save the final output image.
++ *
++ *  @param[in]  pano            The handle of the panorama component.
++ *  @param[out] output_image    The final output image. The component manages the memory. Do not free the internal data buffer.
++ *                              After resetting or destroying the component handle this data would be not reachable.
++ *                              If panorama direction are up or down, rotation value of output image has 90 degree. otherwise, it has 0 degree.
++ *
++ *  @return     On success, @ref pvl_success
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of pvl_pano or output_image.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle or no stitched images.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_panorama_run(pvl_panorama *pano, pvl_image *output_image);
++
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example panorama_sample.c
++ *  Sample of Panorama
++ */
++
++#endif /* __PVL_PANORAMA_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
+new file mode 100644
+index 000000000000..af494293b5a6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
+@@ -0,0 +1,227 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2016 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PD_PVL_PEDESTRIAN_DETECTION_H__
++#define __PD_PVL_PEDESTRIAN_DETECTION_H__
++
++/** @file    pvl_pedestrian_detection.h
++ *  @brief   This file declares the structure and native APIs of pedestrian detection component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned via pvl_pedestrian_detection_get_parameters() and pvl_pedestrian_detection_set_parameters() respectively.
++ */
++struct pvl_pedestrian_detection_parameters
++{
++    int32_t max_num_pedestrians;                /* The maximum number of detectable pedestrian in one frame.
++                                                max_supported_pedestrians in pvl_pedestrian_detection structure represents the maximum allowable value, and minimum allowable value set to 1.
++                                                The default value is set to maximum when the component is created. */
++
++    int32_t min_pedestrian_height;              /* The minimum height(pixel)size of detectable pedestrian on preview mode.
++                                                It should be bigger than 'default_pedestrian_height'.
++                                                It should be smaller than 'default_pedestrian_height'*2. */
++};
++typedef struct pvl_pedestrian_detection_parameters pvl_pedestrian_detection_parameters;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the pedestrian_detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_pedestrian_detection_context
++{
++    const pvl_version version;                      /**< The version information. */
++
++    const int32_t max_supported_num_pedestrians;    /**< The maximum number of pedestrians supported by this component. */
++    const int32_t default_pedestrian_height;        /**< The default value of minimum detectable height(pixel) size.
++                                                    Current version: 128 */
++};
++typedef struct pvl_pedestrian_detection_context pvl_pedestrian_detection_context;
++
++/** @brief A structure to hold the outcomes from the Pedestrian Detection component.
++*/
++struct pvl_pedestrian_detection_result {
++    pvl_rect rect;                  /**< The rectangular region of the detected pedestrian. */
++
++    int32_t  confidence;            /**< The confidence value of the detected pedestrian. (0~100) */
++
++    int32_t  tracking_id;           /**< The tracking id of the pedestrian. Only valid in the outcomes of pvl_pedestrian_detection_process_frame().
++                                    The value will be unique throughout the component life cycle, unless pvl_pedestrian_detection_reset() is called. */
++};
++typedef struct pvl_pedestrian_detection_result pvl_pedestrian_detection_result;
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the pedestrina detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_pedestrian_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the pedestrina detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] pd      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_pedestrian_detection_create(const pvl_config *config, pvl_pedestrian_detection_context **pd);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  pd   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_pedestrian_detection_destroy(pvl_pedestrian_detection_context *pd);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  pd  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_pedestrian_detection_reset(pvl_pedestrian_detection_context *pd);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_pedestrian_detection_get_parameters() before setting something.
++ *
++ *  @param[in]  pd      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_pedestrian_detection_set_parameters(pvl_pedestrian_detection_context *pd, const pvl_pedestrian_detection_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_pedestrian_detection_set_parameters().
++ *
++ *  @param[in]  pd      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_pedestrian_detection_get_parameters(pvl_pedestrian_detection_context *pd, pvl_pedestrian_detection_parameters *params);
++
++
++/** @brief Detect pedestrian from an input image.
++*
++*  This function will conduct pedestrian detection.
++*
++*  @param[in]  pd          The handle of the pedestrian detection component.
++*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
++*  @param[out] result      The result buffer.
++*  @param[in]  max_result  The number of 'result' that the buffers can hold.
++*
++*  @return     On success, @ref integer    Number of the detected pedestrians from the input image(positive integer).
++*  @return     On failure, @ref pvl_err    Error code(negative integer), which will be the one of the following return value(s).
++*
++*  @retval     pvl_err_not_supported       Unsupported image format specified.
++*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
++*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++*/
++PVLAPI int32_t
++pvl_pedestrian_detection_process_image(pvl_pedestrian_detection_context *pd, const pvl_image* image, pvl_pedestrian_detection_result* result, int max_result);
++
++
++/** @brief process continuous frames for conducting pedestrian detection.
++*
++*  This function will conduct pedestrian detection.
++*
++*  @param[in]  pd           The handle of the pedestrian detection component.
++*  @param[in]  image       The input image. Currently, pvl_image_format_rgba32 and pvl_image_format_nv12 are supported.
++*  @param[out] result      The result buffer.
++*  @param[in]  max_result  The number of 'result' that the buffer can hold.
++*
++*  @return     On success, @ref integer.   The number of the detected pedestrians at the current input frame(positive integer).
++*  @return     On failure, @ref pvl_err    Error code, which will be the one of the following return value(s).
++*
++*  @retval     pvl_err_not_supported       Unsupported image format specified.
++*  @retval     pvl_err_invalid_argument    Passing null pointer/negative value to the params or non-matching values in num_rois and rois.
++*  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++*  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++*/
++PVLAPI int32_t
++pvl_pedestrian_detection_process_frame(pvl_pedestrian_detection_context *pd, const pvl_image *image, pvl_pedestrian_detection_result* result, int max_result);
++
++#ifdef __cplusplus
++}
++#endif  // __cplusplus
++
++/** @example pedestrian_detection_sample.cpp
++ *  Sample of Pedestrian Detection
++ */
++
++#endif  // __PD_PVL_PEDESTRIAN_DETECTION_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
+new file mode 100644
+index 000000000000..74b1ffe7d04b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
+@@ -0,0 +1,413 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_PERSPECTIVE_CONTROL_H__
++#define __PVL_PERSPECTIVE_CONTROL_H__
++
++/** @file    pvl_perspective_control.h
++ *  @brief   This file declares the structures and native APIs of perspective control component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MAX_VANISHING_POINT 3
++#define MAX_VERTEX_POINT 4
++
++/** @brief The enumerated values to specify correcting mode
++ *
++ *  This enumeration indicates setting of how the perspective_control engine conducts image warping.
++ */
++typedef enum {
++    PC_SCAN_MODE = 0,   /**< Suitable for using indoor scenes */
++    PC_BUILDING_MODE,   /**< Suitable for using outdoor scenes */
++    NUM_PC_MODES
++} pvl_perspective_control_mode;
++
++typedef enum
++{
++    PC_ORI_VERTICAL = 0,    /**< The orientation for the vertical direction */
++    PC_ORI_HORIZONTAL,      /**< The orientation for the horizontal direction */
++    NUM_ORI
++} pvl_pc_orientation;
++
++struct pvl_pc_correction_range
++{
++    float min_vertical;     /**< The minimum value of available correction range in vertical orientation */
++    float max_vertical;     /**< The maximum value of available correction range in vertical orientation */
++    float min_horizontal;   /**< The minimum value of available correction range in horizontal orientation */
++    float max_horizontal;   /**< The maximum value of available correction range in horizontal orientation */
++};
++typedef struct pvl_pc_correction_range pvl_pc_correction_range;
++
++/** @Deprecated
++ * @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_perspective_control_get_parameters() and pvl_perspective_control_set_parameters() respectively.
++ */
++struct pvl_perspective_control_parameters {
++
++    pvl_perspective_control_mode  control_mode;
++                                      /* To choose mode of perspective control(the PC engine recommends direction and intensity)
++                                         If a user wants to use this engine for indoor usage, then set this parameter PC_SCAN_MODE.
++                                         If a user wants to change the intensity or to choose a certain direction(a certain direction among vanishig points), then set this paramter PC_MANUAL_OUTDOOR_MODE.
++                                         [Default : PC_AUTO_OUTDOOR_MODE]
++                                      */
++    // Intensity and orientation of perspective correction ('correction_range' parameters will be applied only if 'control_mode' is PC_MANUAL_OUTPUT_MODE)
++    float vertical_correction_range;         /* For vertical direction
++                                              [Valid Range: -1.0 ~ 1.0] [Default: 0]
++                                              -1 means full perspective control for the case that the vanishing point is located down direction.
++                                               0 means no perspective control to maintain input image.
++                                               1 means full perspective control for the case that the vanishing point is located up direction.
++                                              */
++    float horizontal_correction_range;       /* For horizontal direction
++                                               [Valid Range: -1.0 ~ 1.0] [Default: 0]
++                                              -1 means full perspective control for the case that the vanishing point is located left direction.
++                                               0 means no perspective control to maintain input image.
++                                               1 means full perspective control for the case that the vanishing point is located right direction.
++                                              */
++};
++typedef struct pvl_perspective_control_parameters pvl_perspective_control_parameters;
++
++/** @brief A structure to supply the public information of this component.
++ *
++ *  This structure represents the perspective_control instance which is used as the handle over most of API.
++ *  It holds its own properties, constant context information.
++ */
++struct pvl_perspective_control {
++    const pvl_version                  version;                   /**< The version information. */
++    const int                          max_vanishing_point;       /**< The maximum configurable value of the number of vanishing point from input image.
++                                                                          Refers to MAX_VANISHING_POINT. (This value is not modifiable in any purpose) */
++    const pvl_perspective_control_mode  default_control_mode;      /**< Default value of the 'PC_AUTO_OUTDOOR_MODE' */
++    const int                          default_limit_angle;       /**< Default value of limited angle: 20 degree */
++};
++typedef struct pvl_perspective_control pvl_perspective_control;
++
++
++/** @ Deprecated
++ * @brief A structure to hold the analysis data of vanishing points from input image.
++ */
++struct pvl_vanishing_orientation {
++    int       angle;                                /**< (To divide an input image into 4 quadrants and locate the origin on the centre point of the image.)
++                                                       The value is degree of each vanishing point in a counter-clockwise rotation from X axis.*/
++    pvl_bool  is_outside;                           /**< This value is related to how far each vanishing point is from the centre point.
++                                                         'pvl_true' means this vanishing point is located outside of an image.
++                                                         'pvl_true' means this vanishing point is located inside of an image.
++                                                         if this value is false, then the image warping based on this target VaP can cause too severe image warping*/
++};
++typedef struct pvl_vanishing_orientation pvl_vanishing_orientation;
++
++struct pvl_perspective_data {
++    int                       num_vanishing_points;                        /**< The number of vanishing point of the input image */
++    pvl_vanishing_orientation vanishing_point[MAX_VANISHING_POINT];        /**< Information of each vanishing point.
++                                                                            Users can choose the vanishing point based on angle. */
++};
++typedef struct pvl_perspective_data pvl_perspective_data;
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_perspective_control_result{
++    pvl_image         output_image;        /**< The final output image. The component manages the memory. Do not free the internal data buffer of this structure.
++                                                 After resetting or destroying the 'perspective_control' component handle, this data would not be reachable. */
++    pvl_rect crop_hint;
++    float v_correction_value;
++    float h_correction_value;
++};
++typedef struct pvl_perspective_control_result pvl_perspective_control_result;
++
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the perspective_control component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_perspective_control_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the perspective_control component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] pc      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle. Failure in loading run-time library related to GPU or IPU acceleration.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_perspective_control_create(const pvl_config *config, pvl_perspective_control **pc);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  pc   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_perspective_control_destroy(pvl_perspective_control *pc);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states, the analysis information, the composed output image and context will be reset except the run-time parameters set by user.
++ *  If there are any ongoing processes(maybe on another thread) it cancels them or waits until done.
++ *
++ *  @param[in]  pc      The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_perspective_control_reset(pvl_perspective_control *pc);
++
++/** @brief Set the perspective control mode for the given instance.
++ *
++ *  Current control mode of given instance will be changed to the designated control mode.
++ *  If the input mode is same with the previous mode, it will return pvl_success without changing the internal status of current instance.
++ *  but if it's changed, it will reset all internal states. so user should perform the process_image() or process_frame() with new input image.
++ *
++ *  @param[in]  pc      The handle of perspective control instance.
++ *  @parma[in]  mode    The new perspective mode want to set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       Passing not supported perspective control mode.
++ */
++PVLAPI pvl_err pvl_perspective_control_set_control_mode(pvl_perspective_control* pc, pvl_perspective_control_mode mode);
++
++/** @brief Set and analyze input image for the perspective control.
++ *
++ *  Given image will be set as source image and perform analysis to detect characteristics depending on the current control mode.
++ *  If the current control mode is PC_SCAN_MODE, it will try to find quadrangle points from the input image.
++ *  And if the control mode is PC_BUILDING_MODE, it will try to find primary lines in both vertical and horizontal orientations.
++ *  By calling this, user can get corresponding characteristics such as quadrangle points and primary lines using other APIs.
++ *
++ *  @param[in]  pc          The handle of perspective control instance.
++ *  @parma[in]  input_image The image that want to be used as source image to the perspective control.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
++ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
++ */
++PVLAPI pvl_err pvl_perspective_control_process_image(pvl_perspective_control* pc, pvl_image* input_image);
++
++/** @brief Set and analyze input image for the perspective control.
++ *
++ *  The most of funtionality is same with process_image(). but it is designed to use for the preview processing.
++ *  In the input image analysis phase, it will try to detect characteristics using the sequance of input frames.
++ *  It means that the input image analysis will be performed partially. so the corresponding characteristics could not be retrived
++ *  after calling this API.
++ *
++ *  @param[in]  pc          The handle of perspective control instance.
++ *  @param[in]  input_frame The image that want to be used as source image to analyze characteristics for the perspective control.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
++ *                                          Supported image formats are @refs pvl_image_format_nv12 and @refs pvl_image_format_rgba32
++ */
++PVLAPI pvl_err pvl_perspective_control_process_frame(pvl_perspective_control* pc, pvl_image* input_frame);
++
++/** @brief Get perspective corrected image with selected 'control_mode'.
++ *
++ *  This API will produce perspective-corrected output image using the configured parameters.
++ *  In PC_SCAN_MODE, detected quadrangle points or configured one by user will be used for the image warping.
++ *  And horizontal/vertical correction values and primary lines will be used for the correction of PC_BUILDING_MODE.
++ *  This API should be called after calling process_image() or process_frame().
++ *  The output image could have blank area since source image will be warped in vertical and/or horizontal direction.
++ *  so, the crop_hint in the result structure could be used to get the soild image from the output image by cutting out the blank area.
++ *
++ *  @param[in]  pc      The handle of perspective control instance.
++ *  @param[out]  result  The final output contains an output image. The component manages the memory. Do not allocate or free the internal 'data' buffer in 'output_image'.
++ *                      After resetting or destroying the component handle this data would be not reachable.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ *  @retval     pvl_err_not_supported       When the image format of input_image is not supported format.
++ *                                          Supported image format is only @refs pvl_image_format_rgba32
++ */
++PVLAPI pvl_err pvl_perspective_control_get_warped_image(pvl_perspective_control* pc, pvl_perspective_control_result* result);
++
++/** @brief Get the detected quadrangle points.
++ *
++ *  As a result of the process_image() or process_frame under the PC_SCAN_MODE, this API will return the detected quadrangle points.
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_SCAN_MODE.
++ *
++ *  @param[in]  pc      The handle of perspective control instance.
++ *  @parma[out] points  The array of pvl_point struct to be filled with detected quadrangle's points.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ *  @retval     pvl_err_no_such_item        There is no detcted quadrangle from the latest result of process_image() or process_frame().
++ */
++PVLAPI pvl_err pvl_perspective_control_get_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
++
++/** @brief Set the user customized quadrangle points.
++ *
++ *  If the output coodinates of get_quadrangle() API are not correct, user can adjust them using this API.
++ *  Once quadrangle points were configured by this API, those coodinates will be used for the final processing of the perspective contorl
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_SCAN_MODE.
++ *
++ *  @param[in]  pc      The handle of perspective control instance.
++ *  @param[in]  points  The array of pvl_point struct which contains user-customized quadrangle points.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       Called in the PC_BUILDING_MODE
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ */
++PVLAPI pvl_err pvl_perspective_control_set_quadrangle(pvl_perspective_control* pc, pvl_point points[4]);
++
++/** @brief Get the available orientation of the input image.
++ *
++ *  As a result of process_image() or process_frame() in the PC_BUILDING_MODE, perspective control engine will detect available
++ *  orientation of perspective correction. it will be represented to the available correction range and filled to the correction_range structure.
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_BUILDING_MODE.
++ *
++ *  @param[in]  pc              The handle of perspective control instance.
++ *  @param[out] available_range The correction range structure which will be filled with available correction range values.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ */
++PVLAPI pvl_err pvl_perspective_control_get_available_correction_range(pvl_perspective_control* pc, pvl_pc_correction_range* available_range);
++
++/** @brief Set the correction value for the given orientation.
++ *
++ *  To set the valid correction value, user should refer the result of get_available_correction_range() API.
++ *  Valid range of 'value' is [pvl_pc_correction_range::min_vertical, pvl_pc_correction_range::max_vertical] where 'ori' is PC_ORI_VERTICAL,
++ *  and [pvl_pc_correction_range::min_horizontal, pvl_pc_correction_range::min_horizontal] where 'ori' is PC_ORI_HORIZONTAL.
++ *  Note taht tha zero value means no correction and 1.0 or -1.0 means the maximum correction.
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_BUILDING_MODE.
++ *
++ *  @param[in]  pc      The handle of perspective control instance.
++ *  @parma[in]  ori     The orientation for the correction value.
++ *  @param[in]  value   The correction value to the given orientation.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the arguments.
++ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE or 'value' is out of avaliable range.
++ */
++PVLAPI pvl_err pvl_perspective_control_set_correction_value(pvl_perspective_control* pc, pvl_pc_orientation ori, float value);
++
++/** @brief Get the information of primary lines.
++ *
++ *  If the available range have non-zero value for the vertical/horizontal orientation, user can get the primary lines for that orientation
++ *  to provide guide-line to the user using this API.
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_BUILDING_MODE.
++ *
++ *  @param[in]  pc      The handle of the perspective_control component.
++ *  @param[in]  ori     The orientation for the primary lines.
++ *  @param[out] line1   The array of pvl_point to be represented a line with two points.
++ *  @param[out] line2   The array of pvl_point to be represented a line with two points.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ *  @retval     pvl_err_no_such_item        There is no detected primary line from the source image.
++ *                                          The source image may not have any vanishing point at the given orientation.
++ */
++PVLAPI pvl_err pvl_perspective_control_get_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
++
++/** @brief Set the customized primary lines for the given orientation.
++ *
++ *  User can mannually customize primary lines for the perspective correction using this API.
++ *  This API should be called after calling process_image() or process_frame().
++ *  And available only for the PC_BUILDING_MODE.
++ *
++ *  @param[in]  pc      The handle of the perspective_control component.
++ *  @param[in]  ori     The orientation for the primary lines.
++ *  @param[in]  line1   The array of pvl_point to be represented a line with two points.
++ *  @param[in]  line2   The array of pvl_point to be represented a line with two points.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null instance of pc.
++ *  @retval     pvl_err_not_supported       Called in the PC_SCAN_MODE.
++ *  @retval     pvl_err_invalid_status      If it called before calling process_image() or process_frame().
++ */
++PVLAPI pvl_err pvl_perspective_control_set_primary_lines(pvl_perspective_control* pc, pvl_pc_orientation ori, pvl_point line1[2], pvl_point line2[2]);
++
++PVLAPI pvl_err
++pvl_perspective_control_enhance_contrast(pvl_perspective_control *pc, pvl_image *image);
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example perspective_control_sample.c
++ *  Sample of Perspective_control
++ */
++
++#endif /* __PVL_PERSPECTIVE_CONTROL_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
+new file mode 100644
+index 000000000000..d6f4998a99ea
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
+@@ -0,0 +1,247 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_SMILE_DETECTION_H__
++#define __PVL_SMILE_DETECTION_H__
++
++/** @file    pvl_smile_detection.h
++ *  @brief   This file declares the structure and native APIs of smile detection component.
++ */
++
++#include "pvl_types.h"
++#include "pvl_config.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/** @brief A structure to hold run-time configurable parameters for this component.
++ *
++ *  The variables in this structure will be retrieved and assigned, via pvl_smile_detection_get_parameters() and pvl_smile_detection_set_parameters() respectively.
++ */
++struct pvl_smile_detection_parameters
++{
++    int32_t threshold;                  /**< The threshold value that evaluates the status smile or not if the score greater than or equal to this threshold.
++                                             The range of the value may be in [0..100], though, recommended to use the default value set in the structure pvl_smile_detection. */
++};
++typedef struct pvl_smile_detection_parameters pvl_smile_detection_parameters;
++
++
++/** @brief The enumerated values to represent smile state of each face.
++ */
++enum pvl_smile_detection_state
++{
++    pvl_smile_detection_state_not_smiling   = 0,    /**< The state representing the face is 'NOT smiling'. */
++    pvl_smile_detection_state_smiling       = 1,    /**< The state representing the face is 'smiling'. */
++};
++typedef enum pvl_smile_detection_state pvl_smile_detection_state;
++
++
++/** @brief A structure to hold the outcomes from this component.
++ */
++struct pvl_smile_detection_result
++{
++    int32_t score;                      /**< The smile score of the face in the range of 0 to 100, where 0 means non-smile and 100 means full smile. */
++    pvl_smile_detection_state state;    /**< The state of the smile of the face. */
++};
++typedef struct pvl_smile_detection_result pvl_smile_detection_result;
++
++
++/** @brief A structure to hold the run-time context of this component.
++ *
++ *  This structure represents the smile detection instance which is used as the handle over most of API.
++ *  It holds its own properties, constant parameters and internal context inside.
++ */
++struct pvl_smile_detection
++{
++    const pvl_version version;          /**< The version information. */
++
++    const int32_t default_threshold;    /**< The default threshold value recommended. */
++    const int32_t rop_tolerance;        /**< The maximum range of ROP (Rotation Out of Plane) tolerance of the face.
++                                             The accuracy may not be guaranteed if the ROP angle is out of range. */
++};
++typedef struct pvl_smile_detection pvl_smile_detection;
++
++
++/** @brief Get default configuration of this component.
++ *
++ *  This function returns default configuration of the smile detection component.
++ *  The returned configuration could be customized as per its usage.
++ *
++ *  @param[out] config  The structure to load default configuration.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_get_default_config(pvl_config *config);
++
++
++/** @brief Create an instance of the smile detection component.
++ *
++ *  This function initializes and returns an instance of this component.
++ *  Multiple instances are allowed to be created concurrently.
++ *
++ *  @param[in]  config  The configuration information of the component.
++ *  @param[out] sd      A pointer to indicate the handle newly created.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported configuration.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_create(const pvl_config *config, pvl_smile_detection **sd);
++
++
++/** @brief Destroy the instance of this component.
++ *
++ *  @param[in]  sd   The handle of this component to be destroyed.
++ */
++PVLAPI void
++pvl_smile_detection_destroy(pvl_smile_detection *sd);
++
++
++/** @brief Reset the instance of this component.
++ *
++ *  All the internal states and context will be reset except the run-time parameters set by user.
++ *
++ *  @param[in]  sd  The handle of this component.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_reset(pvl_smile_detection *sd);
++
++
++/** @brief Set run-time parameters of this component.
++ *
++ *  Set given parameters to the handle.
++ *  It is required to get proper parameters instance by pvl_smile_detection_get_parameters() before setting something.
++ *
++ *  @param[in]  sd      The handle of this component.
++ *  @param[in]  params  The parameters to be set.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params or wrong value is specified in the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to re-allocate the memory.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_set_parameters(pvl_smile_detection *sd, const pvl_smile_detection_parameters *params);
++
++
++/** @brief Get current run-time parameters of this component.
++ *
++ *  Get the parameters from the handle.
++ *  This function should be called before calling pvl_smile_detection_set_parameters().
++ *
++ *  @param[in]  sd      The handle of this component.
++ *  @param[out] params  The buffer which will hold parameters. Its allocation must be managed by the caller.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_get_parameters(pvl_smile_detection *sd, pvl_smile_detection_parameters *params);
++
++
++/** @brief Detect smile on the face in the input image.
++ *
++ *  This function runs smile detection on the face in the given image.
++ *  In contrast with pvl_smile_detection_run_in_preview(), temporal correlation with previous input images will not be considered.
++ *  The caller is responsible for allocating the buffer for the result.
++ *
++ *  @param[in]  sd          The handle of the smile detection component.
++ *  @param[in]  image       The input image. All image formats are supported.
++ *                          pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  left_eye    The center point of the left eye of the face.
++ *  @param[in]  right_eye   The center point of the right eye of the face.
++ *  @param[out] result      The result of the component. It must be allocated with enough memory to hold the result.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_run_in_image(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
++                                 pvl_smile_detection_result *result);
++
++
++/** @brief Detect smile on the faces in the input image which is the part of the preview or the video frames.
++ *
++ *  This function will run smile detection on the faces in the input image assuming that the input image is the part of preview or video frames,
++ *  meaning this frame has temporal correlation with previous and next input frames.
++ *  Using the information from the previous frame may show better result in terms of the jitter or the noise.
++ *
++ *  The caller is responsible for allocating the buffer for result.
++ *
++ *  @param[in]  sd              The handle of the smile detection component.
++ *  @param[in]  image           The input image. All image formats are supported.
++ *                              pvl_image_format_gray, pvl_image_format_nv12, pvl_image_format_nv21 and pvl_image_format_yv12 are preferred in terms of speed.
++ *  @param[in]  left_eye        The center point of the left eye of the face.
++ *  @param[in]  right_eye       The center point of the right eye of the face.
++ *  @param[in]  tracking_id     The tracking-id returned from face detection component. Use pvl_smile_detection_run_in_image() if tracking-id is not available.
++ *  @param[out] result          The result of the component. Must have enough memory to hold the result.
++ *
++ *  @return     On success, @ref pvl_success.
++ *  @return     On failure, @ref pvl_err error code, which will be the one of the following return value(s).
++ *
++ *  @retval     pvl_err_not_supported       Unsupported image format specified.
++ *  @retval     pvl_err_invalid_argument    Passing null pointer to the params.
++ *  @retval     pvl_err_invalid_status      Invalid internal status of the handle.
++ *  @retval     pvl_err_nomem               Failed to allocate the internal memory buffers.
++ */
++PVLAPI pvl_err
++pvl_smile_detection_run_in_preview(pvl_smile_detection *sd, const pvl_image *image, const pvl_point *left_eye, const pvl_point *right_eye,
++                                   int32_t tracking_id, pvl_smile_detection_result *result);
++
++
++#ifdef __cplusplus
++}
++#endif // __cplusplus
++
++/** @example face_detection_sample.cpp
++ *  Sample of Smile Detection
++ */
++
++#endif /* __PVL_SMILE_DETECTION_H__ */
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
+new file mode 100644
+index 000000000000..1df95531d449
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
+@@ -0,0 +1,177 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright 2012-2018 Intel Corporation
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or
++ * its suppliers and licensors. The Material contains trade secrets and
++ * proprietary and confidential information of Intel or its suppliers and
++ * licensors. The Material is protected by worldwide copyright and trade secret
++ * laws and treaty provisions. No part of the Material may be used, copied,
++ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
++ * or disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be express
++ * and approved by Intel in writing.
++ */
++
++
++#ifndef __PVL_TYPES_H__
++#define __PVL_TYPES_H__
++
++/**
++ * @file    pvl_types.h
++ * @brief   This file declares common structures for PVL.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdint.h>
++#include <stdarg.h>
++
++#if (defined (_WIN32) || defined (WIN32)) && !defined (DISABLE_PVLAPI)
++    #if defined (PVL_EXPORT)
++        #define DEPRECATED_PVLAPI __declspec(dllexport, deprecated)
++        #define DEPRECATED __declspec(deprecated)
++        #define PVLAPI __declspec(dllexport)
++    #else
++        #define DEPRECATED_PVLAPI __declspec(dllimport, deprecated)
++        #define DEPRECATED __declspec(deprecated)
++        #define PVLAPI __declspec(dllimport)
++    #endif
++#elif defined (__linux__) || defined (__linux) || defined (linux)
++    #define DEPRECATED_PVLAPI __attribute__((visibility("default"), deprecated))
++    #define DEPRECATED __attribute__((deprecated))
++    #define PVLAPI __attribute__((visibility("default")))
++#else
++    #define DEPRECATED_PVLAPI
++    #define DEPRECATED
++    #define PVLAPI
++#endif
++
++
++/**
++ * @brief A structure to represent a rectangle.
++ */
++struct pvl_rect {
++    int32_t left;
++    int32_t top;
++    int32_t right;
++    int32_t bottom;
++};
++typedef struct pvl_rect pvl_rect;
++
++
++/**
++ * @brief A structure to represent a 2D point.
++ */
++struct pvl_point {
++    int32_t x;
++    int32_t y;
++};
++typedef struct pvl_point pvl_point;
++
++
++/**
++ * @brief A structure to represent a size.
++ */
++struct pvl_size {
++    int32_t width;
++    int32_t height;
++};
++typedef struct pvl_size pvl_size;
++
++
++/**
++ * @brief A structure to represent 2D vector type composed with single precision floating types.
++ */
++struct pvl_vector2d {
++    float x;
++    float y;
++};
++typedef struct pvl_vector2d pvl_vector2d;
++
++
++/**
++ * @brief The enumerated values of the definitions of the error codes.
++ */
++enum pvl_err {
++    pvl_success                 =  0,   /**< Successfully completed. */
++    pvl_err_general             = -1,   /**< Function returned with unspecified error which does not fit to any other error codes. */
++    pvl_err_not_supported       = -2,   /**< Specified parameter is not supported by the library. */
++    pvl_err_invalid_argument    = -3,   /**< At least one function parameter is not valid. */
++    pvl_err_out_of_bound        = -4,   /**< Specified parameter exceeds limit of allowed value. */
++    pvl_err_interrupted         = -5,   /**< Function was interrupted due to change in internal state (usually caused by another thread.) */
++    pvl_err_invalid_status      = -6,   /**< Operation cannot be completed because precondition is not met or information is insufficient. */
++    pvl_err_nomem               = -7,   /**< Memory allocation has failed. */
++    pvl_err_database_full       = -8,   /**< Internal database is full. */
++    pvl_err_no_such_item        = -9,   /**< Requested item to look up was not found in the internal database. */
++};
++typedef enum pvl_err pvl_err;
++
++
++/**
++ * @brief The enumerated values of the definition of the boolean type.
++ */
++enum pvl_bool {
++    pvl_false   = 0,
++    pvl_true    = 1
++};
++typedef enum pvl_bool pvl_bool;
++
++
++/**
++ * @brief A structure to represent a version information.
++ */
++struct pvl_version {
++    const uint16_t major;
++    const uint16_t minor;
++    const uint16_t patch;
++    const char *description;
++};
++typedef struct pvl_version pvl_version;
++
++
++/**
++ * @brief The enumerated values of the definitions of possible image types.
++ */
++enum pvl_image_format {
++    pvl_image_format_nv12,     /**< 12 bit YUV 420, Y plane first followed by UV-interleaved plane. e.g. YYYYYYYY UVUV */
++    pvl_image_format_yv12,     /**< 12 bit YUV 420, Y plane first, U plane and then V plane. e.g. YYYYYYYY UU VV */
++    pvl_image_format_gray,     /**< 8 bit, Y plane only. */
++    pvl_image_format_rgba32,   /**< 32 bit RGBA, 8 bits per channel. e.g. RGBA RGBA RGBA  */
++    pvl_image_format_yuy2,     /**< 16 bit YUV 422, YUYV interleaved. e.g. YUYV YUYV YUYV */
++    pvl_image_format_nv21,     /**< 12 bit YUV 420, Y plane first followed by VU-interleaved plane. e.g. YYYYYYYY VUVU */
++    pvl_image_format_bgr,
++    pvl_image_format_rgb,
++};
++typedef enum pvl_image_format pvl_image_format;
++
++
++/**
++ * @brief A structure to represent the image for PVL engines.
++ */
++struct pvl_image {
++    uint8_t *data;             /**< The pointer to the image data */
++    uint32_t size;             /**< The total number of bytes of the data */
++    int32_t width;             /**< The width of the image in pixels */
++    int32_t height;            /**< The height of the image in lines */
++    pvl_image_format format;   /**< The format of the image */
++    int32_t stride;            /**< The stride that represents the number of bytes per row. */
++    int32_t rotation;          /**< The rotation of the image. (in degree, [0..360])
++                                     It rotates in a clockwise direction. */
++};
++typedef struct pvl_image pvl_image;
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif // #ifndef __PVL_TYPES_H__
+diff --git a/camera/hal/intel/ipu6/include/ia_imaging/tnr7us_parameters_definition.h b/camera/hal/intel/ipu6/include/ia_imaging/tnr7us_parameters_definition.h
+new file mode 100644
+index 000000000000..403961af4e31
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_imaging/tnr7us_parameters_definition.h
+@@ -0,0 +1,114 @@
++#pragma once
++
++/*! \struct tnr7_bc_1_0
++*/
++typedef struct
++{
++/*!< enable block enable*/
++    int32_t enable;
++    /*!< is_first_frame If first frame, ignore input rec-sim*/
++    int32_t is_first_frame;
++    /*!< do_update Limit of S&R parameter update mechanism*/
++    int32_t do_update;
++    /*!< coeffs[3] Per-region mult-and-clamp coefficients*/
++    int32_t coeffs[3];
++    /*!< gpu_mode meta parameter controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/
++    int32_t gpu_mode;
++    /*!< tune_sensitivity user tuning - alignment-conf sensitivity*/
++    int32_t tune_sensitivity;
++    /*!< global_protection global protection enable*/
++    int32_t global_protection;
++    /*!< global_protection_sensitivity_lut_values[3] global protection - LUT values*/
++    int32_t global_protection_sensitivity_lut_values[3];
++    /*!< global_protection_sensitivity_lut_slopes[2] global protection - LUT slopes*/
++    int32_t global_protection_sensitivity_lut_slopes[2];
++    /*!< global_protection_motion_level average alignment conf of previous frame*/
++    int32_t global_protection_motion_level;
++
++} tnr7_bc_1_0_t;
++
++/*! \struct tnr7_blend_1_0
++
++*/
++typedef struct
++{
++/*!< enable Enable TNR7 blend*/
++    int32_t enable;
++    /*!< enable_main_output Enable blend main output*/
++    int32_t enable_main_output;
++    /*!< enable_vision_output Enable blend computer vision output*/
++    int32_t enable_vision_output;
++    /*!< single_output_mode Both outputs use the same blend*/
++    int32_t single_output_mode;
++    /*!< spatial_weight_coeff Spatial weight coeff to be used in single_output_mode*/
++    int32_t spatial_weight_coeff;
++    /*!< max_recursive_similarity Maximum value of recursive similarity*/
++    int32_t max_recursive_similarity;
++    /*!< spatial_alpha Use of spatial filtering in the feedback output*/
++    int32_t spatial_alpha;
++    /*!< w_out_prev_LUT[32] Weight of reference in the main output*/
++    int32_t w_out_prev_LUT[32];
++    /*!< w_out_spl_LUT[32] Weight of spatial in the main output*/
++    int32_t w_out_spl_LUT[32];
++    /*!< output_cu_x[6] output config unit - x values*/
++    int32_t output_cu_x[6];
++    /*!< output_cu_a[5] output config unit - slope values*/
++    int32_t output_cu_a[5];
++    /*!< output_cu_b[5] output config unit - b values*/
++    int32_t output_cu_b[5];
++    /*!< max_recursive_similarity_vsn Vision - Maximum value of recursive similarity*/
++    int32_t max_recursive_similarity_vsn;
++    /*!< w_vsn_out_prev_LUT[32] Vision - Weight of reference in the main output*/
++    int32_t w_vsn_out_prev_LUT[32];
++    /*!< w_vsn_out_spl_LUT[32] Vision - Weight of spatial in the main output*/
++    int32_t w_vsn_out_spl_LUT[32];
++
++} tnr7_blend_1_0_t;
++
++/*! \struct tnr7_ims_1_0
++
++*/
++typedef struct
++{
++/*!< enable block enable*/
++    int32_t enable;
++    /*!< update_limit Limit of S&R parameter update mechanism*/
++    int32_t update_limit;
++    /*!< update_coeff S&R parameter update coefficient*/
++    int32_t update_coeff;
++    /*!< d_ml[16] Maximum-likelihood of distance distribution*/
++    int32_t d_ml[16];
++    /*!< d_slopes[16] Distance log-likelihood slopes*/
++    int32_t d_slopes[16];
++    /*!< d_top[16] Distance log-likelihood constants*/
++    int32_t d_top[16];
++    /*!< gpu_mode meta parameter for controlling convolution implementation: 0 - HW implementation  1 - GPU implementation*/
++    int32_t gpu_mode;
++    /*!< outofbounds[16] Is ml value out-of-hostogram-bounds?*/
++    int32_t outofbounds[16];
++
++} tnr7_ims_1_0_t;
++
++/*! \struct tnr_scale_1_0
++
++*/
++typedef struct
++{
++/*!< enable enable TNR_SCALE_1_0 filter*/
++    int32_t enable;
++    /*!< inWidth Number of pixels per row at output*/
++    int32_t inWidth;
++    /*!< inHeight Number of rows at output*/
++    int32_t inHeight;
++    /*!< bitReductionBypass bypass of bit reduction of input pixels*/
++    int32_t bitReductionBypass;
++    /*!< inputShift shift on input pixels*/
++    int32_t inputShift;
++    /*!< cu_bit_reduce_x[6] input bit reduction config unit - x values*/
++    int32_t cu_bit_reduce_x[6];
++    /*!< cu_bit_reduce_y[5] input bit reduction config unit - y values*/
++    int32_t cu_bit_reduce_y[5];
++    /*!< cu_bit_reduce_slope[5] input bit reduction config unit - slope values*/
++    int32_t cu_bit_reduce_slope[5];
++
++} tnr_scale_1_0_t;
+\ No newline at end of file
+diff --git a/camera/hal/intel/ipu6/include/ia_tools/css_types.h b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
+new file mode 100644
+index 000000000000..608e67a13b6c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
+@@ -0,0 +1,62 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2013-2017 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef __CSS_TYPES_H__
++#define __CSS_TYPES_H__
++
++#include <stdint.h>
++#include <stdbool.h>
++
++/*!
++ * \brief Error codes.
++ * \ingroup ia_tools
++*/
++typedef int32_t css_err_t;
++#define css_err_none     0         /*!< No errors*/
++#define css_err_general  (-(1 << 1))  /*!< General error*/
++#define css_err_nomemory (-(1 << 2))  /*!< Out of memory*/
++#define css_err_data     (-(1 << 3))  /*!< Corrupted data*/
++#define css_err_internal (-(1 << 4))  /*!< Error in code*/
++#define css_err_argument (-(1 << 5))  /*!< Invalid argument for a function*/
++#define css_err_noentry  (-(1 << 6))  /*!< No such entry/entity/file */
++#define css_err_timeout  (-(1 << 7))  /*!< Time out*/
++#define css_err_end      (-(1 << 8))  /*!< End of values*/
++#define css_err_full     (-(1 << 9))  /*!< Exchange full */
++#define css_err_again    (-(1 << 10)) /*!< Operation requires additional call */
++#define css_err_nimpl    (-(1 << 11)) /*!< Not implemented */
++
++#ifndef __cplusplus
++
++/* Define bool type as int for strict C89 */
++#ifndef __bool_true_false_are_defined
++#define bool int
++#define false 0
++#define true 1
++#endif
++
++/* inline keyword compliance for ansi */
++#if (__STDC_VERSION__ < 199901L)
++#define inline
++#endif
++
++#endif /* __cplusplus */
++
++#endif /* _CSS_TYPES_H_ */
+diff --git a/camera/hal/intel/ipu6/include/ia_tools/ia_list.h b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
+new file mode 100644
+index 000000000000..2a99e70e2bf5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
+@@ -0,0 +1,116 @@
++/*
++ * INTEL CONFIDENTIAL
++ * Copyright (c) 2013-2017 Intel Corporation. All Rights Reserved.
++ *
++ * The source code contained or described herein and all documents related to
++ * the source code ("Material") are owned by Intel Corporation or its suppliers
++ * or licensors. Title to the Material remains with Intel Corporation or its
++ * suppliers and licensors. The Material contains trade secrets and proprietary
++ * and confidential information of Intel or its suppliers and licensors. The
++ * Material is protected by worldwide copyright and trade secret laws and
++ * treaty provisions. No part of the Material may be used, copied, reproduced,
++ * modified, published, uploaded, posted, transmitted, distributed, or
++ * disclosed in any way without Intel's prior express written permission.
++ *
++ * No license under any patent, copyright, trade secret or other intellectual
++ * property right is granted to or conferred upon you by disclosure or delivery
++ * of the Materials, either expressly, by implication, inducement, estoppel or
++ * otherwise. Any license under such intellectual property rights must be
++ * express and approved by Intel in writing.
++ */
++
++#ifndef _IA_LIST_H_
++#define _IA_LIST_H_
++
++#include <stdbool.h>
++#include <ia_tools/css_types.h>
++
++/**
++ * \ingroup ia_tools
++ */
++typedef struct ia_list {
++    void *data;
++    struct ia_list *next;
++} ia_list_t;
++
++/**
++ * Create a ia_list
++ * \ingroup ia_tools
++ * \return pointer to the list. NULL if failed.
++ */
++ia_list_t *
++ia_list_create(void);
++
++/**
++ * Destroy a ia_list
++ * \ingroup ia_tools
++ * \param *list the list
++ */
++void
++ia_list_destroy(ia_list_t *list);
++
++/**
++ * Add a new element to a list head. If *list is NULL, a new ia_list element is
++ * allocated and inserted to *list.
++ * \ingroup ia_tools
++ * \param **list a pointer to the list pointer
++ * \param *data the data for the list element
++ * \return css_err_none on success
++ * Add data to a ia_list
++ */
++css_err_t
++ia_list_prepend(ia_list_t **list, void *data);
++
++/**
++ * Add a new element to a list tail. If *list is NULL, a new ia_list element is
++ * allocated and inserted to *list.
++ * \ingroup ia_tools
++ * \param **list a pointer to the list pointer
++ * \param *data the data for the list element
++ * \return css_err_none on success
++ * Add data to a ia_list
++ */
++css_err_t
++ia_list_append(ia_list_t **list, void *data);
++
++/**
++ * Tell whether data is in the list
++ * \ingroup ia_tools
++ * \param *list handle to the list object
++ * \param *data the data pointer
++ * \return true if data is in the list, false otherwise
++ */
++bool
++ia_list_contains(const ia_list_t *list, void *data);
++
++/**
++ * Remove data if it exists in the list.
++ * \ingroup ia_tools
++ * \param **list a pointer to the list pointer.
++ * \param *data the data to remove from list.
++ * \return true if data was removed. False otherwise.
++ */
++bool
++ia_list_remove(ia_list_t **list, void *data);
++
++/**
++ * Tell the length of the list.
++ * \ingroup ia_tools
++ * \param *list a pointer to the list.
++ * \return length of the list.
++ */
++uint32_t
++ia_list_length(const ia_list_t *list);
++
++/**
++ * Return data at an index of the list.
++ * \ingroup ia_tools
++ * \param *list a pointer to the list.
++ * \param index element index
++ * \return pointer to the data at the element at the distance "index" from the
++ * given list element
++ */
++void*
++ia_list_data_at(const ia_list_t *list, uint32_t index);
++
++#endif /* _IA_LIST_H_ */
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_hw_vebox_cmd_g10.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_hw_vebox_cmd_g10.h
+new file mode 100644
+index 000000000000..a9af78f2e67a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_hw_vebox_cmd_g10.h
+@@ -0,0 +1,27995 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++#pragma once
++#pragma pack(1)
++
++#include <cstdint>
++#include <cstddef>
++
++class CmHwVeboxCmdG10
++{
++public:
++    // Internal Macros
++    #define __CODEGEN_MAX(_a, _b) (((_a) > (_b)) ? (_a) : (_b))
++    #define __CODEGEN_BITFIELD(l, h) (h) - (l) + 1
++    #define __CODEGEN_OP_LENGTH_BIAS 2
++    #define __CODEGEN_OP_LENGTH( x ) (uint32_t)((__CODEGEN_MAX(x, __CODEGEN_OP_LENGTH_BIAS)) - __CODEGEN_OP_LENGTH_BIAS)
++    //!
++    //! \brief VEBOX_ACE_LACE_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for ACE
++    //!     state.
++    //!
++    struct VEBOX_ACE_LACE_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 AceEnable                                        : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 Reserved1                                        : __CODEGEN_BITFIELD( 1,  1)    ; ///< U1
++                uint32_t                 SkinThreshold                                    : __CODEGEN_BITFIELD( 2,  6)    ; ///< U5
++                uint32_t                 Reserved7                                        : __CODEGEN_BITFIELD( 7, 11)    ; ///< U5
++                uint32_t                 LaceHistogramEnable                              : __CODEGEN_BITFIELD(12, 12)    ; ///< U1
++                uint32_t                 LaceHistogramSize                                : __CODEGEN_BITFIELD(13, 13)    ; ///< U1
++                uint32_t                 LaceSingleHistogramSet                           : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 MinAceLuma                                       : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 Ymin                                             : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Y1                                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Y2                                               : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Y3                                               : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 Y4                                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Y5                                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Y6                                               : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Y7                                               : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 Y8                                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Y9                                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Y10                                              : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Ymax                                             : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 B1                                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 B2                                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 B3                                               : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 B4                                               : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 B5                                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 B6                                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 B7                                               : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 B8                                               : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 B9                                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 B10                                              : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Reserved208                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 S0                                               : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved235                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 S1                                               : __CODEGEN_BITFIELD(16, 26)    ; ///< U110
++                uint32_t                 Reserved251                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 S2                                               : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved267                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 S3                                               : __CODEGEN_BITFIELD(16, 26)    ; ///< U110
++                uint32_t                 Reserved283                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 S4                                               : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved299                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 S5                                               : __CODEGEN_BITFIELD(16, 26)    ; ///< U110
++                uint32_t                 Reserved315                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 S6                                               : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved331                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 S7                                               : __CODEGEN_BITFIELD(16, 26)    ; ///< U110
++                uint32_t                 Reserved347                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 S8                                               : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved363                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 S9                                               : __CODEGEN_BITFIELD(16, 26)    ; ///< U110
++                uint32_t                 Reserved379                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 S10                                              : __CODEGEN_BITFIELD( 0, 10)    ; ///< U110
++                uint32_t                 Reserved395                                      : __CODEGEN_BITFIELD(11, 15)    ; ///< U5
++                uint32_t                 MaxAceLuma                                       : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW12;
++
++        //! \name Local enumerations
++
++        enum SKIN_THRESHOLD
++        {
++            SKIN_THRESHOLD_UNNAMED26                                         = 26, ///<
++        };
++        enum LACE_HISTOGRAM_ENABLE
++        {
++            LACE_HISTOGRAM_ENABLE_UNNAMED0                                   = 0, ///<
++        };
++        enum LACE_HISTOGRAM_SIZE
++        {
++            LACE_HISTOGRAM_SIZE_128_BINHISTOGRAM                             = 0, ///<
++            LACE_HISTOGRAM_SIZE_256_BINHISTOGRAM                             = 1, ///<
++        };
++        enum LACE_SINGLE_HISTOGRAM_SET
++        {
++            LACE_SINGLE_HISTOGRAM_SET_CURRENT                                = 0, ///< The histogram includes only the current frame.
++            LACE_SINGLE_HISTOGRAM_SET_PREVIOUS                               = 1, ///< The histogram includes only the previous frame.
++            LACE_SINGLE_HISTOGRAM_SET_CURRENTPREVIOUS                        = 2, ///< The histogram includes pixels from both the current and previous frame.
++            LACE_SINGLE_HISTOGRAM_SET_PREVIOUSCURRENT                        = 3, ///< The histogram includes the previous frame followed by the current frame.
++        };
++        enum YMIN
++        {
++            YMIN_UNNAMED16                                                   = 16, ///<
++        };
++        enum Y1
++        {
++            Y1_UNNAMED36                                                     = 36, ///<
++        };
++        enum Y2
++        {
++            Y2_UNNAMED56                                                     = 56, ///<
++        };
++        enum Y3
++        {
++            Y3_UNNAMED76                                                     = 76, ///<
++        };
++        enum Y4
++        {
++            Y4_UNNAMED96                                                     = 96, ///<
++        };
++        enum Y5
++        {
++            Y5_UNNAMED116                                                    = 116, ///<
++        };
++        enum Y6
++        {
++            Y6_UNNAMED136                                                    = 136, ///<
++        };
++        enum Y7
++        {
++            Y7_UNNAMED156                                                    = 156, ///<
++        };
++        enum Y8
++        {
++            Y8_UNNAMED176                                                    = 176, ///<
++        };
++        enum Y9
++        {
++            Y9_UNNAMED196                                                    = 196, ///<
++        };
++        enum Y10
++        {
++            Y10_UNNAMED216                                                   = 216, ///<
++        };
++        enum YMAX
++        {
++            YMAX_UNNAMED235                                                  = 235, ///<
++        };
++        enum B1
++        {
++            B1_UNNAMED36                                                     = 36, ///<
++        };
++        enum B2
++        {
++            B2_UNNAMED56                                                     = 56, ///<
++        };
++        enum B3
++        {
++            B3_UNNAMED76                                                     = 76, ///<
++        };
++        enum B4
++        {
++            B4_UNNAMED96                                                     = 96, ///<
++        };
++        enum B5
++        {
++            B5_UNNAMED116                                                    = 116, ///<
++        };
++        enum B6
++        {
++            B6_UNNAMED136                                                    = 136, ///<
++        };
++        enum B7
++        {
++            B7_UNNAMED156                                                    = 156, ///<
++        };
++        enum B8
++        {
++            B8_UNNAMED176                                                    = 176, ///<
++        };
++        enum B9
++        {
++            B9_UNNAMED196                                                    = 196, ///<
++        };
++        enum B10
++        {
++            B10_UNNAMED216                                                   = 216, ///<
++        };
++        enum S0
++        {
++            S0_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S1
++        {
++            S1_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S2
++        {
++            S2_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S3
++        {
++            S3_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S4
++        {
++            S4_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S5
++        {
++            S5_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S6
++        {
++            S6_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S7
++        {
++            S7_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S8
++        {
++            S8_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S9
++        {
++            S9_UNNAMED1024                                                   = 1024, ///<
++        };
++        enum S10
++        {
++            S10_UNNAMED1024                                                  = 1024, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API  VEBOX_ACE_LACE_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.SkinThreshold = SKIN_THRESHOLD_UNNAMED26;
++            DW0.LaceHistogramEnable = LACE_HISTOGRAM_ENABLE_UNNAMED0;
++            DW0.LaceHistogramSize = LACE_HISTOGRAM_SIZE_128_BINHISTOGRAM;
++            DW0.LaceSingleHistogramSet = LACE_SINGLE_HISTOGRAM_SET_CURRENT;
++
++            DW1.Value = 0;
++            DW1.Ymin = YMIN_UNNAMED16;
++            DW1.Y1 = Y1_UNNAMED36;
++            DW1.Y2 = Y2_UNNAMED56;
++            DW1.Y3 = Y3_UNNAMED76;
++
++            DW2.Value = 0;
++            DW2.Y4 = Y4_UNNAMED96;
++            DW2.Y5 = Y5_UNNAMED116;
++            DW2.Y6 = Y6_UNNAMED136;
++            DW2.Y7 = Y7_UNNAMED156;
++
++            DW3.Value = 0;
++            DW3.Y8 = Y8_UNNAMED176;
++            DW3.Y9 = Y9_UNNAMED196;
++            DW3.Y10 = Y10_UNNAMED216;
++            DW3.Ymax = YMAX_UNNAMED235;
++
++            DW4.Value = 0;
++            DW4.B1 = B1_UNNAMED36;
++            DW4.B2 = B2_UNNAMED56;
++            DW4.B3 = B3_UNNAMED76;
++            DW4.B4 = B4_UNNAMED96;
++
++            DW5.Value = 0;
++            DW5.B5 = B5_UNNAMED116;
++            DW5.B6 = B6_UNNAMED136;
++            DW5.B7 = B7_UNNAMED156;
++            DW5.B8 = B8_UNNAMED176;
++
++            DW6.Value = 0;
++            DW6.B9 = B9_UNNAMED196;
++            DW6.B10 = B10_UNNAMED216;
++
++            DW7.Value = 0;
++            DW7.S0 = S0_UNNAMED1024;
++            DW7.S1 = S1_UNNAMED1024;
++
++            DW8.Value = 0;
++            DW8.S2 = S2_UNNAMED1024;
++            DW8.S3 = S3_UNNAMED1024;
++
++            DW9.Value = 0;
++            DW9.S4 = S4_UNNAMED1024;
++            DW9.S5 = S5_UNNAMED1024;
++
++            DW10.Value = 0;
++            DW10.S6 = S6_UNNAMED1024;
++            DW10.S7 = S7_UNNAMED1024;
++
++            DW11.Value = 0;
++            DW11.S8 = S8_UNNAMED1024;
++            DW11.S9 = S9_UNNAMED1024;
++
++            DW12.Value = 0;
++            DW12.S10 = S10_UNNAMED1024;
++
++        };
++
++        static const size_t DW_SIZE = 13;
++        static const size_t BYTE_SIZE = 52;
++    };
++
++    //!
++    //! \brief VEBOX_ALPHA_AOI_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for Fixed
++    //!     Alpha State and Area of Interest State.
++    //!
++    struct VEBOX_ALPHA_AOI_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 ColorPipeAlpha                                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 AlphaFromStateSelect                             : __CODEGEN_BITFIELD(16, 16)    ; ///< U1
++                uint32_t                 FullImageHistogram                               : __CODEGEN_BITFIELD(17, 17)    ; ///< U1
++                uint32_t                 Reserved18                                       : __CODEGEN_BITFIELD(18, 31)    ; ///< U14
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 AoiMinX                                          : __CODEGEN_BITFIELD( 0, 13)    ; ///< U14
++                uint32_t                 Reserved46                                       : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 AoiMaxX                                          : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 Reserved62                                       : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 AoiMinY                                          : __CODEGEN_BITFIELD( 0, 13)    ; ///< U14
++                uint32_t                 Reserved78                                       : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 AoiMaxY                                          : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 Reserved94                                       : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW2;
++
++        //! \name Local enumerations
++
++        enum ALPHA_FROM_STATE_SELECT
++        {
++            ALPHA_FROM_STATE_SELECT_ALPHAISTAKENFROMMESSAGE                  = 0, ///<
++            ALPHA_FROM_STATE_SELECT_ALPHAISTAKENFROMSTATE                    = 1, ///<
++        };
++        enum AOI_MIN_X
++        {
++            AOI_MIN_X_UNNAMED0                                               = 0, ///<
++        };
++        enum AOI_MAX_X
++        {
++            AOI_MAX_X_UNNAMED3                                               = 3, ///<
++        };
++        enum AOI_MIN_Y
++        {
++            AOI_MIN_Y_UNNAMED0                                               = 0, ///<
++        };
++        enum AOI_MAX_Y
++        {
++            AOI_MAX_Y_UNNAMED3                                               = 3, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API  VEBOX_ALPHA_AOI_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.AlphaFromStateSelect = ALPHA_FROM_STATE_SELECT_ALPHAISTAKENFROMMESSAGE;
++
++            DW1.Value = 0;
++            DW1.AoiMinX = AOI_MIN_X_UNNAMED0;
++            DW1.AoiMaxX = AOI_MAX_X_UNNAMED3;
++
++            DW2.Value = 0;
++            DW2.AoiMinY = AOI_MIN_Y_UNNAMED0;
++            DW2.AoiMaxY = AOI_MAX_Y_UNNAMED3;
++        };
++
++        static const size_t DW_SIZE = 3;
++        static const size_t BYTE_SIZE = 12;
++    };
++
++    //!
++    //! \brief VEBOX_CAPTURE_PIPE_STATE
++    //! \details
++    //!     This command  contains variables for controlling Demosaic and the White
++    //!     Balance Statistics.
++    //!
++    struct VEBOX_CAPTURE_PIPE_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 GoodPixelNeighborThreshold                       : __CODEGEN_BITFIELD( 0,  5)    ; ///< U6
++                uint32_t                 Reserved6                                        : __CODEGEN_BITFIELD( 6,  7)    ; ///< U2
++                uint32_t                 AverageColorThreshold                            : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 GreenImbalanceThreshold                          : __CODEGEN_BITFIELD(16, 19)    ; ///< U4
++                uint32_t                 ShiftMinCost                                     : __CODEGEN_BITFIELD(20, 22)    ; ///< U3
++                uint32_t                 Reserved23                                       : __CODEGEN_BITFIELD(23, 23)    ; ///< U1
++                uint32_t                 GoodPixelThreshold                               : __CODEGEN_BITFIELD(24, 29)    ; ///< U6
++                uint32_t                 DirmapScale                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 BadColorThreshold3                               : __CODEGEN_BITFIELD( 0,  3)    ; ///< U4
++                uint32_t                 NumberBigPixelThreshold                          : __CODEGEN_BITFIELD( 4,  7)    ; ///< U4
++                uint32_t                 BadColorThreshold2                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 BadColorThreshold1                               : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 GoodIntesityThreshold                            : __CODEGEN_BITFIELD(24, 27)    ; ///< U4
++                uint32_t                 ScaleForMinCost                                  : __CODEGEN_BITFIELD(28, 31)    ; ///< U4
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 WhiteBalanceCorrectionEnable                     : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 BlackPointCorrectionEnable                       : __CODEGEN_BITFIELD( 1,  1)    ; ///< U1
++                uint32_t                 VignetteCorrectionFormat                         : __CODEGEN_BITFIELD( 2,  2)    ; ///< U1
++                uint32_t                 RgbHistogramEnable                               : __CODEGEN_BITFIELD( 3,  3)    ; ///< U1
++                uint32_t                 BlackPointOffsetGreenBottomMsb                   : __CODEGEN_BITFIELD( 4,  4)    ; ///< U1
++                uint32_t                 BlackPointOffsetBlueMsb                          : __CODEGEN_BITFIELD( 5,  5)    ; ///< U1
++                uint32_t                 BlackPointOffsetGreenTopMsb                      : __CODEGEN_BITFIELD( 6,  6)    ; ///< U1
++                uint32_t                 BlackPointOffsetRedMsb                           : __CODEGEN_BITFIELD( 7,  7)    ; ///< U1
++                uint32_t                 UvThresholdValue                                 : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 YOutlierValue                                    : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 YBrightValue                                     : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 BlackPointOffsetGreenTop                         : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 BlackPointOffsetRed                              : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 BlackPointOffsetGreenBottom                      : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 BlackPointOffsetBlue                             : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 WhiteBalanceGreenTopCorrection                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U4.12
++                uint32_t                 WhiteBalanceRedCorrection                        : __CODEGEN_BITFIELD(16, 31)    ; ///< U4.12
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 WhiteBalanceGreenBottomCorrection                : __CODEGEN_BITFIELD( 0, 15)    ; ///< U4.12
++                uint32_t                 WhiteBalanceBlueCorrection                       : __CODEGEN_BITFIELD(16, 31)    ; ///< U4.12
++            };
++            uint32_t                     Value;
++        } DW6;
++
++        //! \name Local enumerations
++
++        enum GOOD_PIXEL_NEIGHBOR_THRESHOLD
++        {
++            GOOD_PIXEL_NEIGHBOR_THRESHOLD_UNNAMED35                          = 35, ///<
++        };
++        enum AVERAGE_COLOR_THRESHOLD
++        {
++            AVERAGE_COLOR_THRESHOLD_UNNAMED255                               = 255, ///<
++        };
++        enum GREEN_IMBALANCE_THRESHOLD
++        {
++            GREEN_IMBALANCE_THRESHOLD_UNNAMED1                               = 1, ///<
++        };
++        enum SHIFT_MIN_COST
++        {
++            SHIFT_MIN_COST_UNNAMED1                                          = 1, ///<
++        };
++        enum GOOD_PIXEL_THRESHOLD
++        {
++            GOOD_PIXEL_THRESHOLD_UNNAMED5                                    = 5, ///<
++        };
++        enum DIRMAP_SCALE
++        {
++            DIRMAP_SCALE_UNNAMED2                                            = 2, ///<
++        };
++        enum BAD_COLOR_THRESHOLD_3
++        {
++            BAD_COLOR_THRESHOLD_3_UNNAMED10                                  = 10, ///<
++        };
++        enum NUMBER_BIG_PIXEL_THRESHOLD
++        {
++            NUMBER_BIG_PIXEL_THRESHOLD_UNNAMED10                             = 10, ///<
++        };
++        enum BAD_COLOR_THRESHOLD_2
++        {
++            BAD_COLOR_THRESHOLD_2_UNNAMED175                                 = 175, ///<
++        };
++        enum BAD_COLOR_THRESHOLD_1
++        {
++            BAD_COLOR_THRESHOLD_1_UNNAMED100                                 = 100, ///<
++        };
++        enum GOOD_INTESITY_THRESHOLD
++        {
++            GOOD_INTESITY_THRESHOLD_UNNAMED10                                = 10, ///<
++        };
++        enum SCALE_FOR_MIN_COST
++        {
++            SCALE_FOR_MIN_COST_UNNAMED10                                     = 10, ///<
++        };
++        enum VIGNETTE_CORRECTION_FORMAT
++        {
++            VIGNETTE_CORRECTION_FORMAT_U88                                   = 0, ///<
++            VIGNETTE_CORRECTION_FORMAT_U412                                  = 1, ///<
++        };
++        enum UV_THRESHOLD_VALUE
++        {
++            UV_THRESHOLD_VALUE_UNNAMED64                                     = 64, ///< 0.25 * 255 = 64
++        };
++        enum Y_OUTLIER_VALUE
++        {
++            Y_OUTLIER_VALUE_UNNAMED253                                       = 253, ///<
++        };
++        enum Y_BRIGHT_VALUE
++        {
++            Y_BRIGHT_VALUE_UNNAMED230                                        = 230, ///<
++        };
++        enum BLACK_POINT_OFFSET_GREEN_TOP
++        {
++            BLACK_POINT_OFFSET_GREEN_TOP_UNNAMED0                            = 0, ///<
++        };
++        enum BLACK_POINT_OFFSET_RED
++        {
++            BLACK_POINT_OFFSET_RED_UNNAMED0                                  = 0, ///<
++        };
++        enum BLACK_POINT_OFFSET_GREEN_BOTTOM
++        {
++            BLACK_POINT_OFFSET_GREEN_BOTTOM_UNNAMED0                         = 0, ///<
++        };
++        enum BLACK_POINT_OFFSET_BLUE
++        {
++            BLACK_POINT_OFFSET_BLUE_UNNAMED0                                 = 0, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_CAPTURE_PIPE_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.GoodPixelNeighborThreshold = GOOD_PIXEL_NEIGHBOR_THRESHOLD_UNNAMED35;
++            DW0.AverageColorThreshold = AVERAGE_COLOR_THRESHOLD_UNNAMED255;
++            DW0.GreenImbalanceThreshold = GREEN_IMBALANCE_THRESHOLD_UNNAMED1;
++            DW0.ShiftMinCost = SHIFT_MIN_COST_UNNAMED1;
++            DW0.GoodPixelThreshold = GOOD_PIXEL_THRESHOLD_UNNAMED5;
++            DW0.DirmapScale = DIRMAP_SCALE_UNNAMED2;
++
++            DW1.Value = 0;
++            DW1.BadColorThreshold3 = BAD_COLOR_THRESHOLD_3_UNNAMED10;
++            DW1.NumberBigPixelThreshold = NUMBER_BIG_PIXEL_THRESHOLD_UNNAMED10;
++            DW1.BadColorThreshold2 = BAD_COLOR_THRESHOLD_2_UNNAMED175;
++            DW1.BadColorThreshold1 = BAD_COLOR_THRESHOLD_1_UNNAMED100;
++            DW1.GoodIntesityThreshold = GOOD_INTESITY_THRESHOLD_UNNAMED10;
++            DW1.ScaleForMinCost = SCALE_FOR_MIN_COST_UNNAMED10;
++
++            DW2.Value = 0;
++            DW2.VignetteCorrectionFormat = VIGNETTE_CORRECTION_FORMAT_U88;
++            DW2.UvThresholdValue = UV_THRESHOLD_VALUE_UNNAMED64;
++            DW2.YOutlierValue = Y_OUTLIER_VALUE_UNNAMED253;
++            DW2.YBrightValue = Y_BRIGHT_VALUE_UNNAMED230;
++
++            DW3.Value = 0;
++            DW3.BlackPointOffsetGreenTop = BLACK_POINT_OFFSET_GREEN_TOP_UNNAMED0;
++            DW3.BlackPointOffsetRed = BLACK_POINT_OFFSET_RED_UNNAMED0;
++
++            DW4.Value = 0;
++            DW4.BlackPointOffsetGreenBottom = BLACK_POINT_OFFSET_GREEN_BOTTOM_UNNAMED0;
++            DW4.BlackPointOffsetBlue = BLACK_POINT_OFFSET_BLUE_UNNAMED0;
++
++            DW5.Value = 0;
++
++            DW6.Value = 0;
++        };
++
++        static const size_t DW_SIZE = 7;
++        static const size_t BYTE_SIZE = 28;
++    };
++
++    //!
++    //! \brief VEBOX_CCM_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for the
++    //!     Color Correction Matrix State.
++    //!
++    struct VEBOX_CCM_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 C1                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved21                                       : __CODEGEN_BITFIELD(21, 30)    ; ///< U10
++                uint32_t                 ColorCorrectionMatrixEnable                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 C0                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved53                                       : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 C3                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved85                                       : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 C2                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved117                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 C5                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved149                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 C4                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved181                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 C7                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved213                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 C6                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved245                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 C8                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved277                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 OffsetInR                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved305                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 OffsetInG                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved337                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 OffsetInB                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved369                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 OffsetOutR                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved401                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 OffsetOutG                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved433                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 OffsetOutB                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved465                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW14;
++
++        //! \name Local enumerations
++
++        enum C1
++        {
++            C1_1825665536                                                    = 18256, ///<
++        };
++        enum C0
++        {
++            C0_4467265536                                                    = 44672, ///<
++        };
++        enum C3
++        {
++            C3_113665536                                                     = 1136, ///<
++        };
++        enum C2
++        {
++            C2_54465536                                                      = 544, ///<
++        };
++        enum C5
++        {
++            C5_83265536                                                      = 2096320, ///<
++        };
++        enum C4
++        {
++            C4_5380865536                                                    = 53808, ///<
++        };
++        enum C7
++        {
++            C7_268865536                                                     = 2688, ///<
++        };
++        enum C6
++        {
++            C6_19265536                                                      = 2096960, ///<
++        };
++        enum C8
++        {
++            C8_5494465536                                                    = 54944, ///<
++        };
++        enum OFFSET_IN_R
++        {
++            OFFSET_IN_R_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_IN_G
++        {
++            OFFSET_IN_G_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_IN_B
++        {
++            OFFSET_IN_B_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_OUT_R
++        {
++            OFFSET_OUT_R_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_OUT_G
++        {
++            OFFSET_OUT_G_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_OUT_B
++        {
++            OFFSET_OUT_B_UNNAMED0                                            = 0, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_CCM_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.C1 = C1_1825665536;
++
++            DW1.Value = 0;
++            DW1.C0 = C0_4467265536;
++
++            DW2.Value = 0;
++            DW2.C3 = C3_113665536;
++
++            DW3.Value = 0;
++            DW3.C2 = C2_54465536;
++
++            DW4.Value = 0;
++            DW4.C5 = C5_83265536;
++
++            DW5.Value = 0;
++            DW5.C4 = C4_5380865536;
++
++            DW6.Value = 0;
++            DW6.C7 = C7_268865536;
++
++            DW7.Value = 0;
++            DW7.C6 = C6_19265536;
++
++            DW8.Value = 0;
++            DW8.C8 = C8_5494465536;
++
++            DW9.Value = 0;
++            DW9.OffsetInR = OFFSET_IN_R_UNNAMED0;
++
++            DW10.Value = 0;
++            DW10.OffsetInG = OFFSET_IN_G_UNNAMED0;
++
++            DW11.Value = 0;
++            DW11.OffsetInB = OFFSET_IN_B_UNNAMED0;
++
++            DW12.Value = 0;
++            DW12.OffsetOutR = OFFSET_OUT_R_UNNAMED0;
++
++            DW13.Value = 0;
++            DW13.OffsetOutG = OFFSET_OUT_G_UNNAMED0;
++
++            DW14.Value = 0;
++            DW14.OffsetOutB = OFFSET_OUT_B_UNNAMED0;
++        };
++
++        static const size_t DW_SIZE = 15;
++        static const size_t BYTE_SIZE = 60;
++    };
++
++    //!
++    //! \brief VEBOX_CSC_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for CSC
++    //!     state.
++    //!
++    struct VEBOX_CSC_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 C0                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved19                                       : __CODEGEN_BITFIELD(19, 30)    ; ///< U11
++                uint32_t                 TransformEnable                                  : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 C1                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved51                                       : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 C2                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved83                                       : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 C3                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved115                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 C4                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved147                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 C5                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved179                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 C6                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved211                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 C7                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved243                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 C8                                               : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved275                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 OffsetIn1                                        : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 OffsetOut1                                       : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 OffsetIn2                                        : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 OffsetOut2                                       : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 OffsetIn3                                        : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 OffsetOut3                                       : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW11;
++
++        //! \name Local enumerations
++
++        enum C0
++        {
++            C0_OR10                                                          = 65536, ///<
++        };
++        enum C1
++        {
++            C1_UNNAMED0                                                      = 0, ///<
++        };
++        enum C2
++        {
++            C2_UNNAMED0                                                      = 0, ///<
++        };
++        enum C3
++        {
++            C3_UNNAMED0                                                      = 0, ///<
++        };
++        enum C4
++        {
++            C4_OR10                                                          = 65536, ///<
++        };
++        enum C5
++        {
++            C5_UNNAMED0                                                      = 0, ///<
++        };
++        enum C6
++        {
++            C6_UNNAMED0                                                      = 0, ///<
++        };
++        enum C7
++        {
++            C7_UNNAMED0                                                      = 0, ///<
++        };
++        enum C8
++        {
++            C8_OR10                                                          = 65536, ///<
++        };
++        enum OFFSET_IN_1
++        {
++            OFFSET_IN_1_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_OUT_1
++        {
++            OFFSET_OUT_1_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_IN_2
++        {
++            OFFSET_IN_2_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_OUT_2
++        {
++            OFFSET_OUT_2_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_IN_3
++        {
++            OFFSET_IN_3_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_OUT_3
++        {
++            OFFSET_OUT_3_UNNAMED0                                            = 0, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_CSC_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.C0 = C0_OR10;
++
++            DW1.Value = 0;
++            DW1.C1 = C1_UNNAMED0;
++
++            DW2.Value = 0;
++            DW2.C2 = C2_UNNAMED0;
++
++            DW3.Value = 0;
++            DW3.C3 = C3_UNNAMED0;
++
++            DW4.Value = 0;
++            DW4.C4 = C4_OR10;
++
++            DW5.Value = 0;
++            DW5.C5 = C5_UNNAMED0;
++
++            DW6.Value = 0;
++            DW6.C6 = C6_UNNAMED0;
++
++            DW7.Value = 0;
++            DW7.C7 = C7_UNNAMED0;
++
++            DW8.Value = 0;
++            DW8.C8 = C8_OR10;
++
++            DW9.Value = 0;
++            DW9.OffsetIn1 = OFFSET_IN_1_UNNAMED0;
++            DW9.OffsetOut1 = OFFSET_OUT_1_UNNAMED0;
++
++            DW10.Value = 0;
++            DW10.OffsetIn2 = OFFSET_IN_2_UNNAMED0;
++            DW10.OffsetOut2 = OFFSET_OUT_2_UNNAMED0;
++
++            DW11.Value = 0;
++            DW11.OffsetIn3 = OFFSET_IN_3_UNNAMED0;
++            DW11.OffsetOut3 = OFFSET_OUT_3_UNNAMED0;
++        };
++
++        static const size_t DW_SIZE = 12;
++        static const size_t BYTE_SIZE = 48;
++    };
++
++    //!
++    //! \brief VEBOX_DNDI_STATE
++    //! \details
++    //!     This state table is used by the Denoise and Deinterlacer functions. 
++    //!     DW0 to 2 are for Temporal Denoise
++    //!      DW3 is for global noise estimate and hot pixel detection
++    //!      DW4 is for Chroma Denoise
++    //!      DW5 to 11 are for 5x5 spatial denoise
++    //!      DW12 to 17 are for Deinterlacer
++    //!      DW18 to 24 [CNL+] Added controls for Deinterlace. Added Deflicker
++    //!     filter at output of DI.
++    //! 
++    //!
++    struct VEBOX_DNDI_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 DenoiseMovingPixelThreshold                      : __CODEGEN_BITFIELD( 0,  4)    ; ///< U5
++                uint32_t                 Reserved5                                        : __CODEGEN_BITFIELD( 5,  7)    ; ///< U3
++                uint32_t                 DenoiseHistoryIncrease                           : __CODEGEN_BITFIELD( 8, 11)    ; ///< U4
++                uint32_t                 DenoiseMaximumHistory                            : __CODEGEN_BITFIELD(12, 19)    ; ///< U8
++                uint32_t                 DenoiseStadThreshold                             : __CODEGEN_BITFIELD(20, 31)    ; ///< U12
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 LowTemporalDifferenceThreshold                   : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 TemporalDifferenceThreshold                      : __CODEGEN_BITFIELD(10, 19)    ; ///< U10
++                uint32_t                 DenoiseAsdThreshold                              : __CODEGEN_BITFIELD(20, 31)    ; ///< U12
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 Reserved64                                       : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 InitialDenoiseHistory                            : __CODEGEN_BITFIELD(10, 15)    ; ///< U6
++                uint32_t                 DenoiseThresholdForSumOfComplexityMeasure        : __CODEGEN_BITFIELD(16, 27)    ; ///< U12
++                uint32_t                 ProgressiveDn                                    : __CODEGEN_BITFIELD(28, 28)    ; ///< U1
++                uint32_t                 Reserved93                                       : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 BlockNoiseEstimateNoiseThreshold                 : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 BlockNoiseEstimateEdgeThreshold                  : __CODEGEN_BITFIELD(12, 19)    ; ///< U8
++                uint32_t                 HotPixelThreshold                                : __CODEGEN_BITFIELD(20, 27)    ; ///< U8
++                uint32_t                 HotPixelCount                                    : __CODEGEN_BITFIELD(28, 31)    ; ///< U4
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 ChromaLowTemporalDifferenceThreshold             : __CODEGEN_BITFIELD( 0,  5)    ; ///< U6
++                uint32_t                 ChromaTemporalDifferenceThreshold                : __CODEGEN_BITFIELD( 6, 11)    ; ///< U6
++                uint32_t                 ChromaDenoiseEnable                              : __CODEGEN_BITFIELD(12, 12)    ; ///< U1
++                uint32_t                 Reserved141                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 ChromaDenoiseStadThreshold                       : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Reserved152                                      : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 DnWr0                                            : __CODEGEN_BITFIELD( 0,  4)    ; ///< U5
++                uint32_t                 DnWr1                                            : __CODEGEN_BITFIELD( 5,  9)    ; ///< U5
++                uint32_t                 DnWr2                                            : __CODEGEN_BITFIELD(10, 14)    ; ///< U5
++                uint32_t                 DnWr3                                            : __CODEGEN_BITFIELD(15, 19)    ; ///< U5
++                uint32_t                 DnWr4                                            : __CODEGEN_BITFIELD(20, 24)    ; ///< U5
++                uint32_t                 DnWr5                                            : __CODEGEN_BITFIELD(25, 29)    ; ///< U5
++                uint32_t                 Reserved190                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 DnThmin                                          : __CODEGEN_BITFIELD( 0, 12)    ; ///< U13
++                uint32_t                 Reserved205                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 DnThmax                                          : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved221                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 DnDynThmin                                       : __CODEGEN_BITFIELD( 0, 12)    ; ///< U13
++                uint32_t                 Reserved237                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 DnPrt5                                           : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved253                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 DnPrt3                                           : __CODEGEN_BITFIELD( 0, 12)    ; ///< U13
++                uint32_t                 Reserved269                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 DnPrt4                                           : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved285                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 DnPrt1                                           : __CODEGEN_BITFIELD( 0, 12)    ; ///< U13
++                uint32_t                 Reserved301                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 DnPrt2                                           : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved317                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 DnWd20                                           : __CODEGEN_BITFIELD( 0,  4)    ; ///< U5
++                uint32_t                 DnWd21                                           : __CODEGEN_BITFIELD( 5,  9)    ; ///< U5
++                uint32_t                 DnWd22                                           : __CODEGEN_BITFIELD(10, 14)    ; ///< U5
++                uint32_t                 Reserved335                                      : __CODEGEN_BITFIELD(15, 15)    ; ///< U1
++                uint32_t                 DnPrt0                                           : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved349                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 DnWd00                                           : __CODEGEN_BITFIELD( 0,  4)    ; ///< U5
++                uint32_t                 DnWd01                                           : __CODEGEN_BITFIELD( 5,  9)    ; ///< U5
++                uint32_t                 DnWd02                                           : __CODEGEN_BITFIELD(10, 14)    ; ///< U5
++                uint32_t                 DnWd10                                           : __CODEGEN_BITFIELD(15, 19)    ; ///< U5
++                uint32_t                 DnWd11                                           : __CODEGEN_BITFIELD(20, 24)    ; ///< U5
++                uint32_t                 DnWd12                                           : __CODEGEN_BITFIELD(25, 29)    ; ///< U5
++                uint32_t                 Reserved382                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 SmoothMvThreshold                                : __CODEGEN_BITFIELD( 0,  1)    ; ///< U2
++                uint32_t                 SadTightThreshold                                : __CODEGEN_BITFIELD( 2,  5)    ; ///< U4
++                uint32_t                 ContentAdaptiveThresholdSlope                    : __CODEGEN_BITFIELD( 6,  9)    ; ///< U4
++                uint32_t                 StmmC2                                           : __CODEGEN_BITFIELD(10, 12)    ; ///< U3
++                uint32_t                 Reserved397                                      : __CODEGEN_BITFIELD(13, 31)    ; ///< U19
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 MaximumStmm                                      : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 MultiplierForVecm                                : __CODEGEN_BITFIELD( 8, 13)    ; ///< U6
++                uint32_t                 Reserved430                                      : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 BlendingConstantAcrossTimeForSmallValuesOfStmm   : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 BlendingConstantAcrossTimeForLargeValuesOfStmm   : __CODEGEN_BITFIELD(24, 30)    ; ///< U7
++                uint32_t                 StmmBlendingConstantSelect                       : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 FmdTemporalDifferenceThreshold                   : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 LumatdmWt                                        : __CODEGEN_BITFIELD( 8, 11)    ; ///< U22
++                uint32_t                 ChromatdmWt                                      : __CODEGEN_BITFIELD(12, 15)    ; ///< U22
++                uint32_t                 StmmOutputShift                                  : __CODEGEN_BITFIELD(16, 19)    ; ///< U4
++                uint32_t                 StmmShiftUp                                      : __CODEGEN_BITFIELD(20, 21)    ; ///< U2
++                uint32_t                 StmmShiftDown                                    : __CODEGEN_BITFIELD(22, 23)    ; ///< U2
++                uint32_t                 MinimumStmm                                      : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW14;
++        union
++        {
++            struct
++            {
++                /// uint32_t 15
++                uint32_t                 CoringThresholdForSvcm                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 DeltabitValueForSvcm                             : __CODEGEN_BITFIELD( 8, 11)    ; ///< U4
++                uint32_t                 Reserved492                                      : __CODEGEN_BITFIELD(12, 15)    ; ///< U4
++                uint32_t                 CoringThresholdForShcm                           : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 DeltabitValueForShcm                             : __CODEGEN_BITFIELD(24, 27)    ; ///< U4
++                uint32_t                 Reserved508                                      : __CODEGEN_BITFIELD(28, 31)    ; ///< U4
++            };
++            uint32_t                     Value;
++        } DW15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 Reserved512                                      : __CODEGEN_BITFIELD( 0,  2)    ; ///< U3
++                uint32_t                 DnDiTopFirst                                     : __CODEGEN_BITFIELD( 3,  3)    ; ///< U1
++                uint32_t                 Reserved516                                      : __CODEGEN_BITFIELD( 4,  6)    ; ///< U3
++                uint32_t                 McdiEnable                                       : __CODEGEN_BITFIELD( 7,  7)    ; ///< U1
++                uint32_t                 FmdTearThreshold                                 : __CODEGEN_BITFIELD( 8, 13)    ; ///< U6
++                uint32_t                 CatThreshold                                     : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 Fmd2VerticalDifferenceThreshold                  : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Fmd1VerticalDifferenceThreshold                  : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 SadTha                                           : __CODEGEN_BITFIELD( 0,  3)    ; ///< U4
++                uint32_t                 SadThb                                           : __CODEGEN_BITFIELD( 4,  7)    ; ///< U4
++                uint32_t                 ProgressiveCadenceReconstructionFor1StFieldOfCurrentFrame : __CODEGEN_BITFIELD( 8,  9)    ; ///< U2
++                uint32_t                 McPixelConsistencyThreshold                      : __CODEGEN_BITFIELD(10, 15)    ; ///< U6
++                uint32_t                 ProgressiveCadenceReconstructionFor2NdFieldOfPreviousFrame : __CODEGEN_BITFIELD(16, 17)    ; ///< U2
++                uint32_t                 Reserved562                                      : __CODEGEN_BITFIELD(18, 18)    ; ///< U1
++                uint32_t                 NeighborPixelThreshold                           : __CODEGEN_BITFIELD(19, 22)    ; ///< U4
++                uint32_t                 ChromaSmallerWindowForTdm                        : __CODEGEN_BITFIELD(23, 23)    ; ///< U1
++                uint32_t                 LumaSmallerWindowForTdm                          : __CODEGEN_BITFIELD(24, 24)    ; ///< U1
++                uint32_t                 Fastercovergence                                 : __CODEGEN_BITFIELD(25, 25)    ; ///< U1
++                uint32_t                 Reserved570                                      : __CODEGEN_BITFIELD(26, 31)    ; ///< U6
++            };
++            uint32_t                     Value;
++        } DW17;
++        union
++        {
++            struct
++            {
++                /// uint32_t 18
++                uint32_t                 SadWt0                                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 SadWt1                                           : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 SadWt2                                           : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 SadWt3                                           : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW18;
++        union
++        {
++            struct
++            {
++                /// uint32_t 19
++                uint32_t                 SadWt4                                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 SadWt6                                           : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 CoringThresholdForLumaSadCalculation             : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 CoringThresholdForChromaSadCalculation           : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW19;
++        union
++        {
++            struct
++            {
++                /// uint32_t 20
++                uint32_t                 ParDiffcheckslackthreshold                       : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 ParTearinghighthreshold                          : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 ParTearinglowthreshold                           : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 ParDirectioncheckth                              : __CODEGEN_BITFIELD(24, 26)    ; ///< U3
++                uint32_t                 ParSyntheticcontentcheck                         : __CODEGEN_BITFIELD(27, 27)    ; ///< U1
++                uint32_t                 ParLocalcheck                                    : __CODEGEN_BITFIELD(28, 28)    ; ///< U1
++                uint32_t                 ParUsesyntheticcontentmedian                     : __CODEGEN_BITFIELD(29, 29)    ; ///< U1
++                uint32_t                 BypassDeflicker                                  : __CODEGEN_BITFIELD(30, 30)    ; ///< U1
++                uint32_t                 Reserved671                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW20;
++        union
++        {
++            struct
++            {
++                /// uint32_t 21
++                uint32_t                 Lpfwtlut0                                        : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Lpfwtlut1                                        : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Lpfwtlut2                                        : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Lpfwtlut3                                        : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW21;
++        union
++        {
++            struct
++            {
++                /// uint32_t 22
++                uint32_t                 Lpfwtlut4                                        : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Lpfwtlut5                                        : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Lpfwtlut6                                        : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 Lpfwtlut7                                        : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW22;
++
++        //! \name Local enumerations
++
++        enum DENOISE_HISTORY_INCREASE
++        {
++            DENOISE_HISTORY_INCREASE_UNNAMED8                                = 8, ///<
++            DENOISE_HISTORY_INCREASE_UNNAMED15                               = 15, ///< Maximum Allowed
++        };
++        enum INITIAL_DENOISE_HISTORY
++        {
++            INITIAL_DENOISE_HISTORY_UNNAMED32                                = 32, ///<
++        };
++        enum BLOCK_NOISE_ESTIMATE_EDGE_THRESHOLD
++        {
++            BLOCK_NOISE_ESTIMATE_EDGE_THRESHOLD_UNNAMED16                    = 16, ///<
++            BLOCK_NOISE_ESTIMATE_EDGE_THRESHOLD_UNNAMED255                   = 255, ///< Maximium Value
++        };
++        enum CHROMA_DENOISE_ENABLE
++        {
++            CHROMA_DENOISE_ENABLE_UNNAMED0                                   = 0, ///< The U and V channels will be passed to the next stage after DN unchanged.
++            CHROMA_DENOISE_ENABLE_UNNAMED1                                   = 1, ///< The U and V chroma channels will be denoise filtered.
++        };
++        enum SAD_TIGHT_THRESHOLD
++        {
++            SAD_TIGHT_THRESHOLD_UNNAMED5                                     = 5, ///<
++        };
++        enum CONTENT_ADAPTIVE_THRESHOLD_SLOPE
++        {
++            CONTENT_ADAPTIVE_THRESHOLD_SLOPE_UNNAMED9                        = 9, ///< CAT_slope value = 10
++        };
++        enum STMM_BLENDING_CONSTANT_SELECT
++        {
++            STMM_BLENDING_CONSTANT_SELECT_UNNAMED0                           = 0, ///< Use the blending constant for small values of STMM for stmm_md_th
++            STMM_BLENDING_CONSTANT_SELECT_UNNAMED1                           = 1, ///< Use the blending constant for large values of STMM for stmm_md_th
++        };
++        enum LUMATDM_WT
++        {
++            LUMATDM_WT_UNNAMED4                                              = 4, ///<
++        };
++        enum CHROMATDM_WT
++        {
++            CHROMATDM_WT_UNNAMED0                                            = 0, ///<
++        };
++        enum STMM_SHIFT_UP
++        {
++            STMM_SHIFT_UP_SHIFTBY6                                           = 0, ///<
++            STMM_SHIFT_UP_SHIFTBY7                                           = 1, ///<
++            STMM_SHIFT_UP_SHIFTBY8                                           = 2, ///<
++        };
++        enum STMM_SHIFT_DOWN
++        {
++            STMM_SHIFT_DOWN_SHIFTBY4                                         = 0, ///<
++            STMM_SHIFT_DOWN_SHIFTBY5                                         = 1, ///<
++            STMM_SHIFT_DOWN_SHIFTBY6                                         = 2, ///<
++        };
++        enum CORING_THRESHOLD_FOR_SVCM
++        {
++            CORING_THRESHOLD_FOR_SVCM_UNNAMED255                             = 255, ///<
++        };
++        enum DELTABIT_VALUE_FOR_SVCM
++        {
++            DELTABIT_VALUE_FOR_SVCM_UNNAMED5                                 = 5, ///<
++        };
++        enum CORING_THRESHOLD_FOR_SHCM
++        {
++            CORING_THRESHOLD_FOR_SHCM_UNNAMED255                             = 255, ///<
++        };
++        enum DELTABIT_VALUE_FOR_SHCM
++        {
++            DELTABIT_VALUE_FOR_SHCM_UNNAMED5                                 = 5, ///<
++        };
++        enum CAT_THRESHOLD
++        {
++            CAT_THRESHOLD_UNNAMED0                                           = 0, ///<
++        };
++        enum SAD_THA
++        {
++            SAD_THA_UNNAMED5                                                 = 5, ///<
++        };
++        enum SAD_THB
++        {
++            SAD_THB_UNNAMED10                                                = 10, ///<
++        };
++        enum PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_1ST_FIELD_OF_CURRENT_FRAME
++        {
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_1ST_FIELD_OF_CURRENT_FRAME_DEINTERLACE = 0, ///<
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_1ST_FIELD_OF_CURRENT_FRAME_PUTTOGETHERWITHPREVIOUSFIELDINSEQUENCE = 1, ///< 2^nd field of previous frame
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_1ST_FIELD_OF_CURRENT_FRAME_PUTTOGETHERWITHNEXTFIELDINSEQUENCE = 2, ///< 2^nd field of current frame
++        };
++        enum MC_PIXEL_CONSISTENCY_THRESHOLD
++        {
++            MC_PIXEL_CONSISTENCY_THRESHOLD_UNNAMED25                         = 25, ///<
++        };
++        enum PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_2ND_FIELD_OF_PREVIOUS_FRAME
++        {
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_2ND_FIELD_OF_PREVIOUS_FRAME_DEINTERLACE = 0, ///<
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_2ND_FIELD_OF_PREVIOUS_FRAME_PUTTOGETHERWITHPREVIOUSFIELDINSEQUENCE = 1, ///< 1^st field of previous frame
++            PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_2ND_FIELD_OF_PREVIOUS_FRAME_PUTTOGETHERWITHNEXTFIELDINSEQUENCE = 2, ///< 1^st field of current frame
++        };
++        enum NEIGHBOR_PIXEL_THRESHOLD
++        {
++            NEIGHBOR_PIXEL_THRESHOLD_UNNAMED10                               = 10, ///<
++        };
++        enum FASTERCOVERGENCE
++        {
++            FASTERCOVERGENCE_UNNAMED0                                        = 0, ///<
++        };
++        enum SAD_WT0
++        {
++            SAD_WT0_DEFAULTFORNATURALANDSYNTHETIC                            = 0, ///<
++        };
++        enum SAD_WT1
++        {
++            SAD_WT1_DEFAULTFORSYNTHETICANDDIENABLED                          = 12, ///<
++            SAD_WT1_DEFAULTFORSYNTHETICANDAVSENABLED                         = 38, ///<
++            SAD_WT1_DEFAULTFORNATURALANDDIENABLED                            = 63, ///<
++            SAD_WT1_DEFAULTFORNATURALANDAVSENABLED                           = 166, ///<
++        };
++        enum SAD_WT2
++        {
++            SAD_WT2_DEFAULTFORSYNTHETICANDDIENABLED                          = 25, ///<
++            SAD_WT2_DEFAULTFORSYNTHETICANDAVSENABLED                         = 51, ///<
++            SAD_WT2_DEFAULTFORNATURALANDDIENABLED                            = 76, ///<
++            SAD_WT2_DEFAULTFORNATURALANDAVSENABLED                           = 179, ///<
++        };
++        enum SAD_WT3
++        {
++            SAD_WT3_DEFAULTFORSYNTHETICANDDIENABLED                          = 38, ///<
++            SAD_WT3_DEFAULTFORSYNTHETICANDAVSENABLED                         = 64, ///<
++            SAD_WT3_DEFAULTFORNATURALANDDIENABLED                            = 89, ///<
++            SAD_WT3_DEFAULTFORNATURALANDAVSENABLED                           = 192, ///<
++        };
++        enum SAD_WT4
++        {
++            SAD_WT4_DEFAULTFORSYNTHETICANDDIENABLED                          = 63, ///<
++            SAD_WT4_DEFAULTFORSYNTHETICANDAVSENABLED                         = 90, ///<
++            SAD_WT4_DEFAULTFORNATURALANDDIENABLED                            = 114, ///<
++            SAD_WT4_DEFAULTFORNATURALANDAVSENABLED                           = 218, ///<
++        };
++        enum SAD_WT6
++        {
++            SAD_WT6_DEFAULTFORSYNTHETIC                                      = 64, ///<
++            SAD_WT6_DEFAULTFORNATURAL                                        = 217, ///<
++        };
++        enum CORING_THRESHOLD_FOR_LUMA_SAD_CALCULATION
++        {
++            CORING_THRESHOLD_FOR_LUMA_SAD_CALCULATION_UNNAMED0               = 0, ///<
++        };
++        enum CORING_THRESHOLD_FOR_CHROMA_SAD_CALCULATION
++        {
++            CORING_THRESHOLD_FOR_CHROMA_SAD_CALCULATION_UNNAMED0             = 0, ///<
++        };
++        enum PAR_DIFFCHECKSLACKTHRESHOLD
++        {
++            PAR_DIFFCHECKSLACKTHRESHOLD_UNNAMED15                            = 15, ///<
++        };
++        enum PAR_TEARINGHIGHTHRESHOLD
++        {
++            PAR_TEARINGHIGHTHRESHOLD_UNNAMED100                              = 100, ///<
++        };
++        enum PAR_TEARINGLOWTHRESHOLD
++        {
++            PAR_TEARINGLOWTHRESHOLD_UNNAMED20                                = 20, ///<
++        };
++        enum PAR_DIRECTIONCHECKTH
++        {
++            PAR_DIRECTIONCHECKTH_UNNAMED3                                    = 3, ///<
++        };
++        enum PAR_SYNTHETICCONTENTCHECK
++        {
++            PAR_SYNTHETICCONTENTCHECK_UNNAMED0                               = 0, ///<
++        };
++        enum PAR_LOCALCHECK
++        {
++            PAR_LOCALCHECK_UNNAMED1                                          = 1, ///<
++        };
++        enum PAR_USESYNTHETICCONTENTMEDIAN
++        {
++            PAR_USESYNTHETICCONTENTMEDIAN_UNNAMED0                           = 0, ///<
++        };
++        enum LPFWTLUT0
++        {
++            LPFWTLUT0_UNNAMED0                                               = 0, ///<
++        };
++        enum LPFWTLUT1
++        {
++            LPFWTLUT1_UNNAMED0                                               = 0, ///<
++        };
++        enum LPFWTLUT2
++        {
++            LPFWTLUT2_UNNAMED0                                               = 0, ///<
++        };
++        enum LPFWTLUT3
++        {
++            LPFWTLUT3_UNNAMED0                                               = 0, ///<
++        };
++        enum LPFWTLUT4
++        {
++            LPFWTLUT4_UNNAMED32                                              = 32, ///<
++        };
++        enum LPFWTLUT5
++        {
++            LPFWTLUT5_UNNAMED64                                              = 64, ///<
++        };
++        enum LPFWTLUT6
++        {
++            LPFWTLUT6_UNNAMED128                                             = 128, ///<
++        };
++        enum LPFWTLUT7
++        {
++            LPFWTLUT7_UNNAMED255                                             = 255, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API  VEBOX_DNDI_STATE_CMD() {
++
++            DW0.Value = 0;
++            DW0.DenoiseHistoryIncrease = DENOISE_HISTORY_INCREASE_UNNAMED8;
++
++            DW1.Value = 0;
++
++            DW2.Value = 0;
++            DW2.InitialDenoiseHistory = INITIAL_DENOISE_HISTORY_UNNAMED32;
++
++            DW3.Value = 0;
++            DW3.BlockNoiseEstimateEdgeThreshold = BLOCK_NOISE_ESTIMATE_EDGE_THRESHOLD_UNNAMED16;
++
++            DW4.Value = 0;
++            DW4.ChromaDenoiseEnable = CHROMA_DENOISE_ENABLE_UNNAMED1;
++
++            DW5.Value = 0;
++
++            DW6.Value = 0;
++
++            DW7.Value = 0;
++
++            DW8.Value = 0;
++
++            DW9.Value = 0;
++
++            DW10.Value = 0;
++
++            DW11.Value = 0;
++
++            DW12.Value = 0;
++            DW12.SadTightThreshold = SAD_TIGHT_THRESHOLD_UNNAMED5;
++            DW12.ContentAdaptiveThresholdSlope = CONTENT_ADAPTIVE_THRESHOLD_SLOPE_UNNAMED9;
++
++            DW13.Value = 0;
++            DW13.StmmBlendingConstantSelect = STMM_BLENDING_CONSTANT_SELECT_UNNAMED0;
++
++            DW14.Value = 0;
++            DW14.LumatdmWt = LUMATDM_WT_UNNAMED4;
++            DW14.ChromatdmWt = CHROMATDM_WT_UNNAMED0;
++            DW14.StmmShiftUp = STMM_SHIFT_UP_SHIFTBY6;
++            DW14.StmmShiftDown = STMM_SHIFT_DOWN_SHIFTBY4;
++
++            DW15.Value = 0;
++            DW15.CoringThresholdForSvcm = CORING_THRESHOLD_FOR_SVCM_UNNAMED255;
++            DW15.DeltabitValueForSvcm = DELTABIT_VALUE_FOR_SVCM_UNNAMED5;
++            DW15.CoringThresholdForShcm = CORING_THRESHOLD_FOR_SHCM_UNNAMED255;
++            DW15.DeltabitValueForShcm = DELTABIT_VALUE_FOR_SHCM_UNNAMED5;
++
++            DW16.Value = 0;
++            DW16.CatThreshold = CAT_THRESHOLD_UNNAMED0;
++
++            DW17.Value = 0;
++            DW17.SadTha = SAD_THA_UNNAMED5;
++            DW17.SadThb = SAD_THB_UNNAMED10;
++            DW17.ProgressiveCadenceReconstructionFor1StFieldOfCurrentFrame = PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_1ST_FIELD_OF_CURRENT_FRAME_DEINTERLACE;
++            DW17.McPixelConsistencyThreshold = MC_PIXEL_CONSISTENCY_THRESHOLD_UNNAMED25;
++            DW17.ProgressiveCadenceReconstructionFor2NdFieldOfPreviousFrame = PROGRESSIVE_CADENCE_RECONSTRUCTION_FOR_2ND_FIELD_OF_PREVIOUS_FRAME_DEINTERLACE;
++            DW17.NeighborPixelThreshold = NEIGHBOR_PIXEL_THRESHOLD_UNNAMED10;
++            DW17.Fastercovergence = FASTERCOVERGENCE_UNNAMED0;
++
++            DW18.Value = 0;
++            DW18.SadWt0 = SAD_WT0_DEFAULTFORNATURALANDSYNTHETIC;
++            DW18.SadWt1 = SAD_WT1_DEFAULTFORNATURALANDAVSENABLED;
++            DW18.SadWt2 = SAD_WT2_DEFAULTFORNATURALANDAVSENABLED;
++            DW18.SadWt3 = SAD_WT3_DEFAULTFORNATURALANDAVSENABLED;
++
++            DW19.Value = 0;
++            DW19.SadWt4 = SAD_WT4_DEFAULTFORNATURALANDAVSENABLED;
++            DW19.SadWt6 = SAD_WT6_DEFAULTFORNATURAL;
++            DW19.CoringThresholdForLumaSadCalculation = CORING_THRESHOLD_FOR_LUMA_SAD_CALCULATION_UNNAMED0;
++            DW19.CoringThresholdForChromaSadCalculation = CORING_THRESHOLD_FOR_CHROMA_SAD_CALCULATION_UNNAMED0;
++
++            DW20.Value = 0;
++            DW20.ParDiffcheckslackthreshold = PAR_DIFFCHECKSLACKTHRESHOLD_UNNAMED15;
++            DW20.ParTearinghighthreshold = PAR_TEARINGHIGHTHRESHOLD_UNNAMED100;
++            DW20.ParTearinglowthreshold = PAR_TEARINGLOWTHRESHOLD_UNNAMED20;
++            DW20.ParDirectioncheckth = PAR_DIRECTIONCHECKTH_UNNAMED3;
++            DW20.ParSyntheticcontentcheck = PAR_SYNTHETICCONTENTCHECK_UNNAMED0;
++            DW20.ParLocalcheck = PAR_LOCALCHECK_UNNAMED1;
++            DW20.ParUsesyntheticcontentmedian = PAR_USESYNTHETICCONTENTMEDIAN_UNNAMED0;
++
++            DW21.Value = 0;
++            DW21.Lpfwtlut0 = LPFWTLUT0_UNNAMED0;
++            DW21.Lpfwtlut1 = LPFWTLUT1_UNNAMED0;
++            DW21.Lpfwtlut2 = LPFWTLUT2_UNNAMED0;
++            DW21.Lpfwtlut3 = LPFWTLUT3_UNNAMED0;
++
++            DW22.Value = 0;
++            DW22.Lpfwtlut4 = LPFWTLUT4_UNNAMED32;
++            DW22.Lpfwtlut5 = LPFWTLUT5_UNNAMED64;
++            DW22.Lpfwtlut6 = LPFWTLUT6_UNNAMED128;
++            DW22.Lpfwtlut7 = LPFWTLUT7_UNNAMED255;
++        }
++
++        static const size_t DW_SIZE = 23;
++        static const size_t BYTE_SIZE = 92;
++    };
++
++    //!
++    //! \brief VEBOX_FRONT_END_CSC_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for
++    //!     Front-end CSC state.
++    //!
++    struct VEBOX_FRONT_END_CSC_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 FecscC0TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved19                                       : __CODEGEN_BITFIELD(19, 30)    ; ///< U12
++                uint32_t                 FrontEndCscTransformEnable                       : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 FecscC1TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved51                                       : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 FecscC2TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved83                                       : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 FecscC3TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved115                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 FecscC4TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved147                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 FecscC5TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved179                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 FecscC6TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved211                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 FecscC7TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved243                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 FecscC8TransformCoefficient                      : __CODEGEN_BITFIELD( 0, 18)    ; ///< S316
++                uint32_t                 Reserved275                                      : __CODEGEN_BITFIELD(19, 31)    ; ///< U13
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 FecScOffsetIn1OffsetInForYR                      : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 FecScOffsetOut1OffsetOutForYR                    : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 FecScOffsetIn2OffsetOutForUG                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 FecScOffsetOut2OffsetOutForUG                    : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 FecScOffsetIn3OffsetOutForVB                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< S16
++                uint32_t                 FecScOffsetOut3OffsetOutForVB                    : __CODEGEN_BITFIELD(16, 31)    ; ///< S16
++            };
++            uint32_t                     Value;
++        } DW11;
++
++        //! \name Local enumerations
++
++        enum FECSC_C0_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C0_TRANSFORM_COEFFICIENT_OR10                              = 65536, ///<
++        };
++        enum FECSC_C1_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C1_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C2_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C2_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C3_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C3_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C4_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C4_TRANSFORM_COEFFICIENT_OR10                              = 65536, ///<
++        };
++        enum FECSC_C5_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C5_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C6_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C6_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C7_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C7_TRANSFORM_COEFFICIENT_OR00                              = 0, ///<
++        };
++        enum FECSC_C8_TRANSFORM_COEFFICIENT
++        {
++            FECSC_C8_TRANSFORM_COEFFICIENT_OR10                              = 65536, ///<
++        };
++        enum FEC_SC_OFFSET_IN_1_OFFSET_IN_FOR_YR
++        {
++            FEC_SC_OFFSET_IN_1_OFFSET_IN_FOR_YR_UNNAMED0                     = 0, ///<
++        };
++        enum FEC_SC_OFFSET_OUT_1_OFFSET_OUT_FOR_YR
++        {
++            FEC_SC_OFFSET_OUT_1_OFFSET_OUT_FOR_YR_UNNAMED0                   = 0, ///<
++        };
++        enum FEC_SC_OFFSET_IN_2_OFFSET_OUT_FOR_UG
++        {
++            FEC_SC_OFFSET_IN_2_OFFSET_OUT_FOR_UG_UNNAMED0                    = 0, ///<
++        };
++        enum FEC_SC_OFFSET_OUT_2_OFFSET_OUT_FOR_UG
++        {
++            FEC_SC_OFFSET_OUT_2_OFFSET_OUT_FOR_UG_UNNAMED0                   = 0, ///<
++        };
++        enum FEC_SC_OFFSET_IN_3_OFFSET_OUT_FOR_VB
++        {
++            FEC_SC_OFFSET_IN_3_OFFSET_OUT_FOR_VB_UNNAMED0                    = 0, ///<
++        };
++        enum FEC_SC_OFFSET_OUT_3_OFFSET_OUT_FOR_VB
++        {
++            FEC_SC_OFFSET_OUT_3_OFFSET_OUT_FOR_VB_UNNAMED0                   = 0, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_FRONT_END_CSC_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.FecscC0TransformCoefficient = FECSC_C0_TRANSFORM_COEFFICIENT_OR10;
++
++            DW1.Value = 0;
++            DW1.FecscC1TransformCoefficient = FECSC_C1_TRANSFORM_COEFFICIENT_OR00;
++
++            DW2.Value = 0;
++            DW2.FecscC2TransformCoefficient = FECSC_C2_TRANSFORM_COEFFICIENT_OR00;
++
++            DW3.Value = 0;
++            DW3.FecscC3TransformCoefficient = FECSC_C3_TRANSFORM_COEFFICIENT_OR00;
++
++            DW4.Value = 0;
++            DW4.FecscC4TransformCoefficient = FECSC_C4_TRANSFORM_COEFFICIENT_OR10;
++
++            DW5.Value = 0;
++            DW5.FecscC5TransformCoefficient = FECSC_C5_TRANSFORM_COEFFICIENT_OR00;
++
++            DW6.Value = 0;
++            DW6.FecscC6TransformCoefficient = FECSC_C6_TRANSFORM_COEFFICIENT_OR00;
++
++            DW7.Value = 0;
++            DW7.FecscC7TransformCoefficient = FECSC_C7_TRANSFORM_COEFFICIENT_OR00;
++
++            DW8.Value = 0;
++            DW8.FecscC8TransformCoefficient = FECSC_C8_TRANSFORM_COEFFICIENT_OR10;
++
++            DW9.Value = 0;
++            DW9.FecScOffsetIn1OffsetInForYR = FEC_SC_OFFSET_IN_1_OFFSET_IN_FOR_YR_UNNAMED0;
++            DW9.FecScOffsetOut1OffsetOutForYR = FEC_SC_OFFSET_OUT_1_OFFSET_OUT_FOR_YR_UNNAMED0;
++
++            DW10.Value = 0;
++            DW10.FecScOffsetIn2OffsetOutForUG = FEC_SC_OFFSET_IN_2_OFFSET_OUT_FOR_UG_UNNAMED0;
++            DW10.FecScOffsetOut2OffsetOutForUG = FEC_SC_OFFSET_OUT_2_OFFSET_OUT_FOR_UG_UNNAMED0;
++
++            DW11.Value = 0;
++            DW11.FecScOffsetIn3OffsetOutForVB = FEC_SC_OFFSET_IN_3_OFFSET_OUT_FOR_VB_UNNAMED0;
++            DW11.FecScOffsetOut3OffsetOutForVB = FEC_SC_OFFSET_OUT_3_OFFSET_OUT_FOR_VB_UNNAMED0;
++        };
++
++        static const size_t DW_SIZE = 12;
++        static const size_t BYTE_SIZE = 48;
++    };
++
++    //!
++    //! \brief VEBOX_GAMUT_CONTROL_STATE
++    //! \details
++    //! 
++    //!
++    struct VEBOX_GAMUT_CONTROL_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 C1                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved21                                       : __CODEGEN_BITFIELD(21, 21)    ; ///< U1
++                uint32_t                 GlobalModeEnable                                 : __CODEGEN_BITFIELD(22, 22)    ; ///< U1
++                uint32_t                 AR                                               : __CODEGEN_BITFIELD(23, 31)    ; ///< U9
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 C0                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved53                                       : __CODEGEN_BITFIELD(21, 21)    ; ///< U1
++                uint32_t                 CmW                                              : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 C3                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved85                                       : __CODEGEN_BITFIELD(21, 21)    ; ///< U1
++                uint32_t                 CmS                                              : __CODEGEN_BITFIELD(22, 31)    ; ///< U2.8
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 C2                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved117                                      : __CODEGEN_BITFIELD(21, 24)    ; ///< U4
++                uint32_t                 AG                                               : __CODEGEN_BITFIELD(25, 31)    ; ///< U7
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 C5                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved149                                      : __CODEGEN_BITFIELD(21, 24)    ; ///< U4
++                uint32_t                 AB                                               : __CODEGEN_BITFIELD(25, 31)    ; ///< U7
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 C4                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved181                                      : __CODEGEN_BITFIELD(21, 21)    ; ///< U1
++                uint32_t                 RS                                               : __CODEGEN_BITFIELD(22, 31)    ; ///< U2.8
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 C7                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved213                                      : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 CmI                                              : __CODEGEN_BITFIELD(24, 31)    ; ///< U0.8
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 C6                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved245                                      : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 RI                                               : __CODEGEN_BITFIELD(24, 31)    ; ///< U0.8
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 C8                                               : __CODEGEN_BITFIELD( 0, 20)    ; ///< S516
++                uint32_t                 Reserved277                                      : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 OffsetInR                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved305                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 OffsetInG                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved337                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 OffsetInB                                        : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved369                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 OffsetOutR                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved401                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 OffsetOutG                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved433                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 OffsetOutB                                       : __CODEGEN_BITFIELD( 0, 16)    ; ///< S17
++                uint32_t                 Reserved465                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW14;
++        union
++        {
++            struct
++            {
++                /// uint32_t 15
++                uint32_t                 D1Out                                            : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 DOutDefault                                      : __CODEGEN_BITFIELD(10, 19)    ; ///< U10
++                uint32_t                 DInDefault                                       : __CODEGEN_BITFIELD(20, 29)    ; ///< U10
++                uint32_t                 Fullrangemappingenable                           : __CODEGEN_BITFIELD(30, 30)    ; ///< U1
++                uint32_t                 Reserved511                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 D1In                                             : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 Reserved522                                      : __CODEGEN_BITFIELD(10, 27)    ; ///< U18
++                uint32_t                 Compressionlineshift                             : __CODEGEN_BITFIELD(28, 30)    ; ///< U3
++                uint32_t                 Xvyccdecencenable                                : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 CpiOverride                                      : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 Reserved545                                      : __CODEGEN_BITFIELD( 1, 10)    ; ///< U10
++                uint32_t                 Basicmodescalingfactor                           : __CODEGEN_BITFIELD(11, 24)    ; ///< U2.12
++                uint32_t                 Reserved569                                      : __CODEGEN_BITFIELD(25, 28)    ; ///< U4
++                uint32_t                 Lumachormaonlycorrection                         : __CODEGEN_BITFIELD(29, 29)    ; ///< U1
++                uint32_t                 GccBasicmodeselection                            : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW17;
++
++        //! \name Local enumerations
++
++        enum C1
++        {
++            C1_1825665536                                                    = 18256, ///<
++        };
++        enum GLOBAL_MODE_ENABLE
++        {
++            GLOBAL_MODE_ENABLE_ADVANCEMODE                                   = 0, ///<
++            GLOBAL_MODE_ENABLE_BASICMODE                                     = 1, ///<
++        };
++        enum AR
++        {
++            AR_UNNAMED436                                                    = 436, ///<
++        };
++        enum C0
++        {
++            C0_4467265536                                                    = 44672, ///<
++        };
++        enum C3
++        {
++            C3_113665536                                                     = 1136, ///<
++        };
++        enum C2
++        {
++            C2_54465536                                                      = 544, ///<
++        };
++        enum C5
++        {
++            C5_83265536                                                      = 2096320, ///<
++        };
++        enum C4
++        {
++            C4_5380865536                                                    = 53808, ///<
++        };
++        enum C7
++        {
++            C7_268865536                                                     = 2688, ///<
++        };
++        enum C6
++        {
++            C6_19265536                                                      = 2096960, ///<
++        };
++        enum C8
++        {
++            C8_5494465536                                                    = 54944, ///<
++        };
++        enum OFFSET_IN_R
++        {
++            OFFSET_IN_R_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_IN_G
++        {
++            OFFSET_IN_G_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_IN_B
++        {
++            OFFSET_IN_B_UNNAMED0                                             = 0, ///<
++        };
++        enum OFFSET_OUT_R
++        {
++            OFFSET_OUT_R_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_OUT_G
++        {
++            OFFSET_OUT_G_UNNAMED0                                            = 0, ///<
++        };
++        enum OFFSET_OUT_B
++        {
++            OFFSET_OUT_B_UNNAMED0                                            = 0, ///<
++        };
++        enum D1OUT
++        {
++            D1OUT_UNNAMED287                                                 = 287, ///<
++        };
++        enum DOUT_DEFAULT
++        {
++            DOUT_DEFAULT_UNNAMED164                                          = 164, ///<
++        };
++        enum DINDEFAULT
++        {
++            DINDEFAULT_UNNAMED205                                            = 205, ///<
++        };
++        enum FULLRANGEMAPPINGENABLE
++        {
++            FULLRANGEMAPPINGENABLE_BASICMODE                                 = 0, ///<
++            FULLRANGEMAPPINGENABLE_ADVANCEMODE                               = 1, ///<
++        };
++        enum D1IN
++        {
++            D1IN_UNNAMED820                                                  = 820, ///<
++        };
++        enum COMPRESSIONLINESHIFT
++        {
++            COMPRESSIONLINESHIFT_UNNAMED0                                    = 0, ///<
++            COMPRESSIONLINESHIFT_UNNAMED3                                    = 3, ///<
++            COMPRESSIONLINESHIFT_UNNAMED4                                    = 4, ///<
++        };
++        enum XVYCCDECENCENABLE
++        {
++            XVYCCDECENCENABLE_TODISABLEBOTHXVYCCDECODEANDXVYCCENCODE         = 0, ///<
++            XVYCCDECENCENABLE_BOTHXVYCCDECODEANDXVYCCENCODEAREENABLED        = 1, ///<
++        };
++        enum CPI_OVERRIDE
++        {
++            CPI_OVERRIDE_UNNAMED0                                            = 0, ///<
++            CPI_OVERRIDE_OVERRIDECPICALCULATION                              = 1, ///<
++        };
++        enum LUMACHORMAONLYCORRECTION
++        {
++            LUMACHORMAONLYCORRECTION_LUMAONLYCORRECTION                      = 0, ///<
++            LUMACHORMAONLYCORRECTION_CHORMAONLYCORRECTION                    = 1, ///<
++        };
++        enum GCC_BASICMODESELECTION
++        {
++            GCC_BASICMODESELECTION_DEFAULT                                   = 0, ///<
++            GCC_BASICMODESELECTION_SCALINGFACTOR                             = 1, ///< Used along with Dword66 Bits 28:11
++            GCC_BASICMODESELECTION_SINGLEAXISGAMMACORRECTION                 = 2, ///< Used along with Dword67 Bit 29
++            GCC_BASICMODESELECTION_SCALINGFACTORWITHFIXEDLUMA                = 3, ///< Used along with Dword37 Bits 28:11
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_GAMUT_CONTROL_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.C1 = C1_1825665536;
++            DW0.GlobalModeEnable = GLOBAL_MODE_ENABLE_ADVANCEMODE;
++            DW0.AR = AR_UNNAMED436;
++
++            DW1.Value = 0;
++            DW1.C0 = C0_4467265536;
++
++            DW2.Value = 0;
++            DW2.C3 = C3_113665536;
++
++            DW3.Value = 0;
++            DW3.C2 = C2_54465536;
++
++            DW4.Value = 0;
++            DW4.C5 = C5_83265536;
++
++            DW5.Value = 0;
++            DW5.C4 = C4_5380865536;
++
++            DW6.Value = 0;
++            DW6.C7 = C7_268865536;
++
++            DW7.Value = 0;
++            DW7.C6 = C6_19265536;
++
++            DW8.Value = 0;
++            DW8.C8 = C8_5494465536;
++
++            DW9.Value = 0;
++            DW9.OffsetInR = OFFSET_IN_R_UNNAMED0;
++
++            DW10.Value = 0;
++            DW10.OffsetInG = OFFSET_IN_G_UNNAMED0;
++
++            DW11.Value = 0;
++            DW11.OffsetInB = OFFSET_IN_B_UNNAMED0;
++
++            DW12.Value = 0;
++            DW12.OffsetOutR = OFFSET_OUT_R_UNNAMED0;
++
++            DW13.Value = 0;
++            DW13.OffsetOutG = OFFSET_OUT_G_UNNAMED0;
++
++            DW14.Value = 0;
++            DW14.OffsetOutB = OFFSET_OUT_B_UNNAMED0;
++
++            DW15.Value = 0;
++            DW15.D1Out = D1OUT_UNNAMED287;
++            DW15.DOutDefault = DOUT_DEFAULT_UNNAMED164;
++            DW15.DInDefault = DINDEFAULT_UNNAMED205;
++            DW15.Fullrangemappingenable = FULLRANGEMAPPINGENABLE_BASICMODE;
++
++            DW16.Value = 0;
++            DW16.D1In = D1IN_UNNAMED820;
++            DW16.Compressionlineshift = COMPRESSIONLINESHIFT_UNNAMED3;
++            DW16.Xvyccdecencenable = XVYCCDECENCENABLE_BOTHXVYCCDECODEANDXVYCCENCODEAREENABLED;
++
++            DW17.Value = 0;
++            DW17.CpiOverride = CPI_OVERRIDE_UNNAMED0;
++            DW17.Lumachormaonlycorrection = LUMACHORMAONLYCORRECTION_LUMAONLYCORRECTION;
++            DW17.GccBasicmodeselection = GCC_BASICMODESELECTION_DEFAULT;
++        };
++
++        static const size_t DW_SIZE = 18;
++        static const size_t BYTE_SIZE = 72;
++    };
++
++    //!
++    //! \brief VEBOX_STD_STE_STATE
++    //! \details
++    //!     This state structure contains the state used by the STD/STE function.
++    //!
++    struct VEBOX_STD_STE_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 StdEnable                                        : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 SteEnable                                        : __CODEGEN_BITFIELD( 1,  1)    ; ///< U1
++                uint32_t                 OutputControl                                    : __CODEGEN_BITFIELD( 2,  2)    ; ///< U1
++                uint32_t                 Reserved3                                        : __CODEGEN_BITFIELD( 3,  3)    ; ///< U1
++                uint32_t                 SatMax                                           : __CODEGEN_BITFIELD( 4,  9)    ; ///< U6
++                uint32_t                 HueMax                                           : __CODEGEN_BITFIELD(10, 15)    ; ///< U6
++                uint32_t                 UMid                                             : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 VMid                                             : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 Sin                                              : __CODEGEN_BITFIELD( 0,  7)    ; ///< S17
++                uint32_t                 Reserved40                                       : __CODEGEN_BITFIELD( 8,  9)    ; ///< U2
++                uint32_t                 Cos                                              : __CODEGEN_BITFIELD(10, 17)    ; ///< S17
++                uint32_t                 HsMargin                                         : __CODEGEN_BITFIELD(18, 20)    ; ///< U3
++                uint32_t                 DiamondDu                                        : __CODEGEN_BITFIELD(21, 27)    ; ///< S7
++                uint32_t                 DiamondMargin                                    : __CODEGEN_BITFIELD(28, 30)    ; ///< U3
++                uint32_t                 StdScoreOutput                                   : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 DiamondDv                                        : __CODEGEN_BITFIELD( 0,  6)    ; ///< S7
++                uint32_t                 DiamondTh                                        : __CODEGEN_BITFIELD( 7, 12)    ; ///< U6
++                uint32_t                 DiamondAlpha                                     : __CODEGEN_BITFIELD(13, 20)    ; ///< U26
++                uint32_t                 Reserved85                                       : __CODEGEN_BITFIELD(21, 31)    ; ///< U11
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 Reserved96                                       : __CODEGEN_BITFIELD( 0,  6)    ; ///< U7
++                uint32_t                 VyStdEnable                                      : __CODEGEN_BITFIELD( 7,  7)    ; ///< U1
++                uint32_t                 YPoint1                                          : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 YPoint2                                          : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 YPoint3                                          : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 YPoint4                                          : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 YSlope1                                          : __CODEGEN_BITFIELD( 8, 12)    ; ///< U23
++                uint32_t                 YSlope2                                          : __CODEGEN_BITFIELD(13, 17)    ; ///< U23
++                uint32_t                 Reserved146                                      : __CODEGEN_BITFIELD(18, 31)    ; ///< U14
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 InvMarginVyl                                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< U0.16
++                uint32_t                 InvSkinTypesMargin                               : __CODEGEN_BITFIELD(16, 31)    ; ///< U016
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 InvMarginVyu                                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< U016
++                uint32_t                 P0L                                              : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 P1L                                              : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 P2L                                              : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 P3L                                              : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 B0L                                              : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 B1L                                              : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 B2L                                              : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 B3L                                              : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 S0L                                              : __CODEGEN_BITFIELD(16, 26)    ; ///< S38
++                uint32_t                 Reserved283                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 S1L                                              : __CODEGEN_BITFIELD( 0, 10)    ; ///< S38
++                uint32_t                 S2L                                              : __CODEGEN_BITFIELD(11, 21)    ; ///< S38
++                uint32_t                 Reserved310                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 S3L                                              : __CODEGEN_BITFIELD( 0, 10)    ; ///< S38
++                uint32_t                 P0U                                              : __CODEGEN_BITFIELD(11, 18)    ; ///< U8
++                uint32_t                 P1U                                              : __CODEGEN_BITFIELD(19, 26)    ; ///< U8
++                uint32_t                 Reserved347                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 P2U                                              : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 P3U                                              : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 B0U                                              : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 B1U                                              : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 B2U                                              : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 B3U                                              : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 S0U                                              : __CODEGEN_BITFIELD(16, 26)    ; ///< S38
++                uint32_t                 Reserved411                                      : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 S1U                                              : __CODEGEN_BITFIELD( 0, 10)    ; ///< S38
++                uint32_t                 S2U                                              : __CODEGEN_BITFIELD(11, 21)    ; ///< S38
++                uint32_t                 Reserved438                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 S3U                                              : __CODEGEN_BITFIELD( 0, 10)    ; ///< S38
++                uint32_t                 SkinTypesEnable                                  : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 SkinTypesThresh                                  : __CODEGEN_BITFIELD(12, 19)    ; ///< U8
++                uint32_t                 SkinTypesMargin                                  : __CODEGEN_BITFIELD(20, 27)    ; ///< U8
++                uint32_t                 Reserved476                                      : __CODEGEN_BITFIELD(28, 31)    ; ///< U4
++            };
++            uint32_t                     Value;
++        } DW14;
++        union
++        {
++            struct
++            {
++                /// uint32_t 15
++                uint32_t                 Satp1                                            : __CODEGEN_BITFIELD( 0,  6)    ; ///< S7
++                uint32_t                 Satp2                                            : __CODEGEN_BITFIELD( 7, 13)    ; ///< S7
++                uint32_t                 Satp3                                            : __CODEGEN_BITFIELD(14, 20)    ; ///< S7
++                uint32_t                 Satb1                                            : __CODEGEN_BITFIELD(21, 30)    ; ///< S82
++                uint32_t                 Reserved511                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 Satb2                                            : __CODEGEN_BITFIELD( 0,  9)    ; ///< S82
++                uint32_t                 Satb3                                            : __CODEGEN_BITFIELD(10, 19)    ; ///< S82
++                uint32_t                 Sats0                                            : __CODEGEN_BITFIELD(20, 30)    ; ///< U38
++                uint32_t                 Reserved543                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 Sats1                                            : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Sats2                                            : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved566                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW17;
++        union
++        {
++            struct
++            {
++                /// uint32_t 18
++                uint32_t                 Sats3                                            : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Huep1                                            : __CODEGEN_BITFIELD(11, 17)    ; ///< S7
++                uint32_t                 Huep2                                            : __CODEGEN_BITFIELD(18, 24)    ; ///< S7
++                uint32_t                 Huep3                                            : __CODEGEN_BITFIELD(25, 31)    ; ///< S7
++            };
++            uint32_t                     Value;
++        } DW18;
++        union
++        {
++            struct
++            {
++                /// uint32_t 19
++                uint32_t                 Hueb1                                            : __CODEGEN_BITFIELD( 0,  9)    ; ///< S82
++                uint32_t                 Hueb2                                            : __CODEGEN_BITFIELD(10, 19)    ; ///< S82
++                uint32_t                 Hueb3                                            : __CODEGEN_BITFIELD(20, 29)    ; ///< S82
++                uint32_t                 Reserved638                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW19;
++        union
++        {
++            struct
++            {
++                /// uint32_t 20
++                uint32_t                 Hues0                                            : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Hues1                                            : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved662                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW20;
++        union
++        {
++            struct
++            {
++                /// uint32_t 21
++                uint32_t                 Hues2                                            : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Hues3                                            : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved694                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW21;
++        union
++        {
++            struct
++            {
++                /// uint32_t 22
++                uint32_t                 Satp1Dark                                        : __CODEGEN_BITFIELD( 0,  6)    ; ///< S7
++                uint32_t                 Satp2Dark                                        : __CODEGEN_BITFIELD( 7, 13)    ; ///< S7
++                uint32_t                 Satp3Dark                                        : __CODEGEN_BITFIELD(14, 20)    ; ///< S7
++                uint32_t                 Satb1Dark                                        : __CODEGEN_BITFIELD(21, 30)    ; ///< S82
++                uint32_t                 Reserved735                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW22;
++        union
++        {
++            struct
++            {
++                /// uint32_t 23
++                uint32_t                 Satb2Dark                                        : __CODEGEN_BITFIELD( 0,  9)    ; ///< S82
++                uint32_t                 Satb3Dark                                        : __CODEGEN_BITFIELD(10, 19)    ; ///< S82
++                uint32_t                 Sats0Dark                                        : __CODEGEN_BITFIELD(20, 30)    ; ///< U38
++                uint32_t                 Reserved767                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW23;
++        union
++        {
++            struct
++            {
++                /// uint32_t 24
++                uint32_t                 Sats1Dark                                        : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Sats2Dark                                        : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved790                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW24;
++        union
++        {
++            struct
++            {
++                /// uint32_t 25
++                uint32_t                 Sats3Dark                                        : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Huep1Dark                                        : __CODEGEN_BITFIELD(11, 17)    ; ///< S7
++                uint32_t                 Huep2Dark                                        : __CODEGEN_BITFIELD(18, 24)    ; ///< S7
++                uint32_t                 Huep3Dark                                        : __CODEGEN_BITFIELD(25, 31)    ; ///< S7
++            };
++            uint32_t                     Value;
++        } DW25;
++        union
++        {
++            struct
++            {
++                /// uint32_t 26
++                uint32_t                 Hueb1Dark                                        : __CODEGEN_BITFIELD( 0,  9)    ; ///< S82
++                uint32_t                 Hueb2Dark                                        : __CODEGEN_BITFIELD(10, 19)    ; ///< S82
++                uint32_t                 Hueb3Dark                                        : __CODEGEN_BITFIELD(20, 29)    ; ///< S82
++                uint32_t                 Reserved862                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW26;
++        union
++        {
++            struct
++            {
++                /// uint32_t 27
++                uint32_t                 Hues0Dark                                        : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Hues1Dark                                        : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved886                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW27;
++        union
++        {
++            struct
++            {
++                /// uint32_t 28
++                uint32_t                 Hues2Dark                                        : __CODEGEN_BITFIELD( 0, 10)    ; ///< U38
++                uint32_t                 Hues3Dark                                        : __CODEGEN_BITFIELD(11, 21)    ; ///< U38
++                uint32_t                 Reserved918                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW28;
++
++        //! \name Local enumerations
++
++        enum OUTPUT_CONTROL
++        {
++            OUTPUT_CONTROL_OUTPUTPIXELS                                      = 0, ///<
++            OUTPUT_CONTROL_OUTPUTSTDDECISIONS                                = 1, ///<
++        };
++        enum SAT_MAX
++        {
++            SAT_MAX_UNNAMED31                                                = 31, ///<
++        };
++        enum HUE_MAX
++        {
++            HUE_MAX_UNNAMED14                                                = 14, ///<
++        };
++        enum U_MID
++        {
++            U_MID_UNNAMED110                                                 = 110, ///<
++        };
++        enum V_MID
++        {
++            V_MID_UNNAMED154                                                 = 154, ///<
++        };
++        enum SIN
++        {
++            SIN_UNNAMED101                                                  = 101, ///<
++        };
++        enum COS
++        {
++            COS_UNNAMED79                                                   = 79, ///<
++        };
++        enum HS_MARGIN
++        {
++            HS_MARGIN_UNNAMED3                                               = 3, ///<
++        };
++        enum DIAMOND_DU
++        {
++            DIAMOND_DU_UNNAMED0                                              = 0, ///<
++        };
++        enum DIAMOND_MARGIN
++        {
++            DIAMOND_MARGIN_UNNAMED4                                          = 4, ///<
++        };
++        enum DIAMOND_DV
++        {
++            DIAMOND_DV_UNNAMED0                                              = 0, ///<
++        };
++        enum DIAMOND_TH
++        {
++            DIAMOND_TH_UNNAMED35                                             = 35, ///<
++        };
++        enum DIAMOND_ALPHA
++        {
++            DIAMOND_ALPHA_UNNAMED100                                         = 100, ///<
++        };
++        enum Y_POINT_1
++        {
++            Y_POINT_1_UNNAMED46                                              = 46, ///<
++        };
++        enum Y_POINT_2
++        {
++            Y_POINT_2_UNNAMED47                                              = 47, ///<
++        };
++        enum Y_POINT_3
++        {
++            Y_POINT_3_UNNAMED254                                             = 254, ///<
++        };
++        enum Y_POINT_4
++        {
++            Y_POINT_4_UNNAMED255                                             = 255, ///<
++        };
++        enum Y_SLOPE_1
++        {
++            Y_SLOPE_1_UNNAMED31                                              = 31, ///<
++        };
++        enum Y_SLOPE_2
++        {
++            Y_SLOPE_2_UNNAMED31                                              = 31, ///<
++        };
++        enum INV_SKIN_TYPES_MARGIN
++        {
++            INV_SKIN_TYPES_MARGIN_SKINTYPEMARGIN                             = 20, ///<
++        };
++        enum INV_MARGIN_VYU
++        {
++            INV_MARGIN_VYU_UNNAMED1600                                       = 1600, ///<
++        };
++        enum P0L
++        {
++            P0L_UNNAMED46                                                    = 46, ///<
++        };
++        enum P1L
++        {
++            P1L_UNNAMED216                                                   = 216, ///<
++        };
++        enum P2L
++        {
++            P2L_UNNAMED236                                                   = 236, ///<
++        };
++        enum P3L
++        {
++            P3L_UNNAMED236                                                   = 236, ///<
++        };
++        enum B0L
++        {
++            B0L_UNNAMED133                                                   = 133, ///<
++        };
++        enum B1L
++        {
++            B1L_UNNAMED130                                                   = 130, ///<
++        };
++        enum B2L
++        {
++            B2L_UNNAMED130                                                   = 130, ///<
++        };
++        enum B3L
++        {
++            B3L_UNNAMED130                                                   = 130, ///<
++        };
++        enum S0L
++        {
++            S0L_UNNAMED2043                                                  = 2043, ///<
++        };
++        enum S1L
++        {
++            S1L_UNNAMED0                                                     = 0, ///<
++        };
++        enum S2L
++        {
++            S2L_UNNAMED0                                                     = 0, ///<
++        };
++        enum S3L
++        {
++            S3L_UNNAMED0                                                     = 0, ///<
++        };
++        enum P0U
++        {
++            P0U_UNNAMED46                                                    = 46, ///<
++        };
++        enum P1U
++        {
++            P1U_UNNAMED66                                                    = 66, ///<
++        };
++        enum P2U
++        {
++            P2U_UNNAMED150                                                   = 150, ///<
++        };
++        enum P3U
++        {
++            P3U_UNNAMED236                                                   = 236, ///<
++        };
++        enum B0U
++        {
++            B0U_UNNAMED143                                                   = 143, ///<
++        };
++        enum B1U
++        {
++            B1U_UNNAMED163                                                   = 163, ///<
++        };
++        enum B2U
++        {
++            B2U_UNNAMED200                                                   = 200, ///<
++        };
++        enum B3U
++        {
++            B3U_UNNAMED200                                                   = 200, ///<
++        };
++        enum S0U
++        {
++            S0U_UNNAMED256                                                   = 256, ///<
++        };
++        enum S1U
++        {
++            S1U_UNNAMED113                                                   = 113, ///<
++        };
++        enum S2U
++        {
++            S2U_UNNAMED1869                                                  = 1896, ///<
++        };
++        enum S3U
++        {
++            S3U_UNNAMED0                                                     = 0, ///<
++        };
++        enum SKIN_TYPES_THRESH
++        {
++            SKIN_TYPES_THRESH_UNNAMED120                                     = 120, ///<
++        };
++        enum SKIN_TYPES_MARGIN
++        {
++            SKIN_TYPES_MARGIN_UNNAMED20                                      = 20, ///<
++        };
++        enum SATP1
++        {
++            SATP1_UNNAMED6                                                   = 6, ///<
++        };
++        enum SATP2
++        {
++            SATP2_UNNAMED6                                                   = 6, ///<
++        };
++        enum SATP3
++        {
++            SATP3_UNNAMED31                                                  = 31, ///<
++        };
++        enum SATB1
++        {
++            SATB1_UNNAMED8                                                   = 8, ///<
++        };
++        enum SATB2
++        {
++            SATB2_UNNAMED8                                                   = 8, ///<
++        };
++        enum SATB3
++        {
++            SATB3_UNNAMED124                                                 = 124, ///<
++        };
++        enum SATS0
++        {
++            SATS0_UNNAMED297                                                 = 297, ///<
++        };
++        enum SATS1
++        {
++            SATS1_UNNAMED85                                                  = 85, ///<
++        };
++        enum SATS2
++        {
++            SATS2_UNNAMED297                                                 = 297, ///<
++        };
++        enum SATS3
++        {
++            SATS3_UNNAMED256                                                 = 256, ///<
++        };
++        enum HUEP1
++        {
++            HUEP1_6                                                          = 122, ///<
++        };
++        enum HUEP2
++        {
++            HUEP2_UNNAMED6                                                   = 6, ///<
++        };
++        enum HUEP3
++        {
++            HUEP3_UNNAMED14                                                  = 14, ///<
++        };
++        enum HUEB1
++        {
++            HUEB1_UNNAMED8                                                   = 8, ///<
++        };
++        enum HUEB2
++        {
++            HUEB2_UNNAMED8                                                   = 8, ///<
++        };
++        enum HUEB3
++        {
++            HUEB3_UNNAMED56                                                  = 56, ///<
++        };
++        enum HUES0
++        {
++            HUES0_UNNAMED384                                                 = 384, ///<
++        };
++        enum HUES1
++        {
++            HUES1_UNNAMED85                                                  = 85, ///<
++        };
++        enum HUES2
++        {
++            HUES2_UNNAMED384                                                 = 384, ///<
++        };
++        enum HUES3
++        {
++            HUES3_UNNAMED256                                                 = 256, ///<
++        };
++        enum SATP1_DARK
++        {
++            SATP1_DARK_UNNAMED123                                            = 123, ///<
++        };
++        enum SATP2_DARK
++        {
++            SATP2_DARK_UNNAMED31                                             = 31, ///<
++        };
++        enum SATP3_DARK
++        {
++            SATP3_DARK_UNNAMED31                                             = 31, ///<
++        };
++        enum SATB1_DARK
++        {
++            SATB1_DARK_UNNAMED0                                              = 0, ///<
++        };
++        enum SATB2_DARK
++        {
++            SATB2_DARK_UNNAMED124                                            = 124, ///<
++        };
++        enum SATB3_DARK
++        {
++            SATB3_DARK_UNNAMED124                                            = 124, ///<
++        };
++        enum SATS0_DARK
++        {
++            SATS0_DARK_UNNAMED397                                            = 397, ///<
++        };
++        enum SATS1_DARK
++        {
++            SATS1_DARK_UNNAMED189                                            = 189, ///<
++        };
++        enum SATS2_DARK
++        {
++            SATS2_DARK_UNNAMED256                                            = 256, ///<
++        };
++        enum SATS3_DARK
++        {
++            SATS3_DARK_UNNAMED256                                            = 256, ///<
++        };
++        enum HUEP1_DARK
++        {
++            HUEP1_DARK_UNNAMED0                                              = 0, ///<
++        };
++        enum HUEP2_DARK
++        {
++            HUEP2_DARK_UNNAMED2                                              = 2, ///<
++        };
++        enum HUEP3_DARK
++        {
++            HUEP3_DARK_UNNAMED14                                             = 14, ///<
++        };
++        enum HUEB1_DARK
++        {
++            HUEB1_DARK_UNNAMED0                                              = 0, ///<
++        };
++        enum HUEB2_DARK
++        {
++            HUEB2_DARK_UNNAMED0                                              = 0, ///<
++        };
++        enum HUEB3_DARK
++        {
++            HUEB3_DARK_UNNAMED56                                             = 56, ///<
++        };
++        enum HUES0_DARK
++        {
++            HUES0_DARK_UNNAMED299                                            = 299, ///<
++        };
++        enum HUES1_DARK
++        {
++            HUES1_DARK_UNNAMED256                                            = 256, ///<
++        };
++        enum HUES2_DARK
++        {
++            HUES2_DARK_UNNAMED299                                            = 299, ///<
++        };
++        enum HUES3_DARK
++        {
++            HUES3_DARK_UNNAMED256                                            = 256, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_STD_STE_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.OutputControl = OUTPUT_CONTROL_OUTPUTPIXELS;
++            DW0.SatMax = SAT_MAX_UNNAMED31;
++            DW0.HueMax = HUE_MAX_UNNAMED14;
++            DW0.UMid = U_MID_UNNAMED110;
++            DW0.VMid = V_MID_UNNAMED154;
++
++            DW1.Value = 0;
++            DW1.Sin = SIN_UNNAMED101;
++            DW1.Cos = COS_UNNAMED79;
++            DW1.HsMargin = HS_MARGIN_UNNAMED3;
++            DW1.DiamondDu = DIAMOND_DU_UNNAMED0;
++            DW1.DiamondMargin = DIAMOND_MARGIN_UNNAMED4;
++
++            DW2.Value = 0;
++            DW2.DiamondDv = DIAMOND_DV_UNNAMED0;
++            DW2.DiamondTh = DIAMOND_TH_UNNAMED35;
++            DW2.DiamondAlpha = DIAMOND_ALPHA_UNNAMED100;
++
++            DW3.Value = 0;
++            DW3.YPoint1 = Y_POINT_1_UNNAMED46;
++            DW3.YPoint2 = Y_POINT_2_UNNAMED47;
++            DW3.YPoint3 = Y_POINT_3_UNNAMED254;
++
++            DW4.Value = 0;
++            DW4.YPoint4 = Y_POINT_4_UNNAMED255;
++            DW4.YSlope1 = Y_SLOPE_1_UNNAMED31;
++            DW4.YSlope2 = Y_SLOPE_2_UNNAMED31;
++
++            DW5.Value = 0;
++            DW5.InvSkinTypesMargin = INV_SKIN_TYPES_MARGIN_SKINTYPEMARGIN;
++
++            DW6.Value = 0;
++            DW6.InvMarginVyu = INV_MARGIN_VYU_UNNAMED1600;
++            DW6.P0L = P0L_UNNAMED46;
++            DW6.P1L = P1L_UNNAMED216;
++
++            DW7.Value = 0;
++            DW7.P2L = P2L_UNNAMED236;
++            DW7.P3L = P3L_UNNAMED236;
++            DW7.B0L = B0L_UNNAMED133;
++            DW7.B1L = B1L_UNNAMED130;
++
++            DW8.Value = 0;
++            DW8.B2L = B2L_UNNAMED130;
++            DW8.B3L = B3L_UNNAMED130;
++            DW8.S0L = S0L_UNNAMED2043;
++
++            DW9.Value = 0;
++            DW9.S1L = S1L_UNNAMED0;
++            DW9.S2L = S2L_UNNAMED0;
++
++            DW10.Value = 0;
++            DW10.S3L = S3L_UNNAMED0;
++            DW10.P0U = P0U_UNNAMED46;
++            DW10.P1U = P1U_UNNAMED66;
++
++            DW11.Value = 0;
++            DW11.P2U = P2U_UNNAMED150;
++            DW11.P3U = P3U_UNNAMED236;
++            DW11.B0U = B0U_UNNAMED143;
++            DW11.B1U = B1U_UNNAMED163;
++
++            DW12.Value = 0;
++            DW12.B2U = B2U_UNNAMED200;
++            DW12.B3U = B3U_UNNAMED200;
++            DW12.S0U = S0U_UNNAMED256;
++
++            DW13.Value = 0;
++            DW13.S1U = S1U_UNNAMED113;
++            DW13.S2U = S2U_UNNAMED1869;
++
++            DW14.Value = 0;
++            DW14.S3U = S3U_UNNAMED0;
++            DW14.SkinTypesThresh = SKIN_TYPES_THRESH_UNNAMED120;
++            DW14.SkinTypesMargin = SKIN_TYPES_MARGIN_UNNAMED20;
++
++            DW15.Value = 0;
++            DW15.Satp1 = SATP1_UNNAMED6;
++            DW15.Satp2 = SATP2_UNNAMED6;
++            DW15.Satp3 = SATP3_UNNAMED31;
++            DW15.Satb1 = SATB1_UNNAMED8;
++
++            DW16.Value = 0;
++            DW16.Satb2 = SATB2_UNNAMED8;
++            DW16.Satb3 = SATB3_UNNAMED124;
++            DW16.Sats0 = SATS0_UNNAMED297;
++
++            DW17.Value = 0;
++            DW17.Sats1 = SATS1_UNNAMED85;
++            DW17.Sats2 = SATS2_UNNAMED297;
++
++            DW18.Value = 0;
++            DW18.Sats3 = SATS3_UNNAMED256;
++            DW18.Huep1 = HUEP1_6;
++            DW18.Huep2 = HUEP2_UNNAMED6;
++            DW18.Huep3 = HUEP3_UNNAMED14;
++
++            DW19.Value = 0;
++            DW19.Hueb1 = HUEB1_UNNAMED8;
++            DW19.Hueb2 = HUEB2_UNNAMED8;
++            DW19.Hueb3 = HUEB3_UNNAMED56;
++
++            DW20.Value = 0;
++            DW20.Hues0 = HUES0_UNNAMED384;
++            DW20.Hues1 = HUES1_UNNAMED85;
++
++            DW21.Value = 0;
++            DW21.Hues2 = HUES2_UNNAMED384;
++            DW21.Hues3 = HUES3_UNNAMED256;
++
++            DW22.Value = 0;
++            DW22.Satp1Dark = SATP1_DARK_UNNAMED123;
++            DW22.Satp2Dark = SATP2_DARK_UNNAMED31;
++            DW22.Satp3Dark = SATP3_DARK_UNNAMED31;
++            DW22.Satb1Dark = SATB1_DARK_UNNAMED0;
++
++            DW23.Value = 0;
++            DW23.Satb2Dark = SATB2_DARK_UNNAMED124;
++            DW23.Satb3Dark = SATB3_DARK_UNNAMED124;
++            DW23.Sats0Dark = SATS0_DARK_UNNAMED397;
++
++            DW24.Value = 0;
++            DW24.Sats1Dark = SATS1_DARK_UNNAMED189;
++            DW24.Sats2Dark = SATS2_DARK_UNNAMED256;
++
++            DW25.Value = 0;
++            DW25.Sats3Dark = SATS3_DARK_UNNAMED256;
++            DW25.Huep1Dark = HUEP1_DARK_UNNAMED0;
++            DW25.Huep2Dark = HUEP2_DARK_UNNAMED2;
++            DW25.Huep3Dark = HUEP3_DARK_UNNAMED14;
++
++            DW26.Value = 0;
++            DW26.Hueb1Dark = HUEB1_DARK_UNNAMED0;
++            DW26.Hueb2Dark = HUEB2_DARK_UNNAMED0;
++            DW26.Hueb3Dark = HUEB3_DARK_UNNAMED56;
++
++            DW27.Value = 0;
++            DW27.Hues0Dark = HUES0_DARK_UNNAMED299;
++            DW27.Hues1Dark = HUES1_DARK_UNNAMED256;
++
++            DW28.Value = 0;
++            DW28.Hues2Dark = HUES2_DARK_UNNAMED299;
++            DW28.Hues3Dark = HUES3_DARK_UNNAMED256;
++
++        };
++
++        static const size_t DW_SIZE = 29;
++        static const size_t BYTE_SIZE = 116;
++    };
++
++    //!
++    //! \brief VEBOX_TCC_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for TCC
++    //!     state.
++    //!
++    struct VEBOX_TCC_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 Reserved0                                        : __CODEGEN_BITFIELD( 0,  6)    ; ///< U7
++                uint32_t                 TccEnable                                        : __CODEGEN_BITFIELD( 7,  7)    ; ///< U1
++                uint32_t                 Satfactor1                                       : __CODEGEN_BITFIELD( 8, 15)    ; ///< U17
++                uint32_t                 Satfactor2                                       : __CODEGEN_BITFIELD(16, 23)    ; ///< U17
++                uint32_t                 Satfactor3                                       : __CODEGEN_BITFIELD(24, 31)    ; ///< U17
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 Reserved32                                       : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Satfactor4                                       : __CODEGEN_BITFIELD( 8, 15)    ; ///< U17
++                uint32_t                 Satfactor5                                       : __CODEGEN_BITFIELD(16, 23)    ; ///< U17
++                uint32_t                 Satfactor6                                       : __CODEGEN_BITFIELD(24, 31)    ; ///< U17
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 Basecolor1                                       : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 Basecolor2                                       : __CODEGEN_BITFIELD(10, 19)    ; ///< U10
++                uint32_t                 Basecolor3                                       : __CODEGEN_BITFIELD(20, 29)    ; ///< U10
++                uint32_t                 Reserved94                                       : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 Basecolo4                                        : __CODEGEN_BITFIELD( 0,  9)    ; ///< U10
++                uint32_t                 Basecolor5                                       : __CODEGEN_BITFIELD(10, 19)    ; ///< U10
++                uint32_t                 Basecolor6                                       : __CODEGEN_BITFIELD(20, 29)    ; ///< U10
++                uint32_t                 Reserved126                                      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 Colortransitslope2                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U016
++                uint32_t                 Colortransitslope23                              : __CODEGEN_BITFIELD(16, 31)    ; ///< U016
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 Colortransitslope34                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U016
++                uint32_t                 Colortransitslope45                              : __CODEGEN_BITFIELD(16, 31)    ; ///< U016
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 Colortransitslope56                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U016
++                uint32_t                 Colortransitslope61                              : __CODEGEN_BITFIELD(16, 31)    ; ///< U016
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 Reserved224                                      : __CODEGEN_BITFIELD( 0,  1)    ; ///< U2
++                uint32_t                 Colorbias1                                       : __CODEGEN_BITFIELD( 2, 11)    ; ///< U28
++                uint32_t                 Colorbias2                                       : __CODEGEN_BITFIELD(12, 21)    ; ///< U28
++                uint32_t                 Colorbias3                                       : __CODEGEN_BITFIELD(22, 31)    ; ///< U28
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 Reserved256                                      : __CODEGEN_BITFIELD( 0,  1)    ; ///< U2
++                uint32_t                 Colorbias4                                       : __CODEGEN_BITFIELD( 2, 11)    ; ///< U28
++                uint32_t                 Colorbias5                                       : __CODEGEN_BITFIELD(12, 21)    ; ///< U28
++                uint32_t                 Colorbias6                                       : __CODEGEN_BITFIELD(22, 31)    ; ///< U28
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 SteSlopeBits                                     : __CODEGEN_BITFIELD( 0,  2)    ; ///< U3
++                uint32_t                 Reserved291                                      : __CODEGEN_BITFIELD( 3,  7)    ; ///< U5
++                uint32_t                 SteThreshold                                     : __CODEGEN_BITFIELD( 8, 12)    ; ///< U5
++                uint32_t                 Reserved301                                      : __CODEGEN_BITFIELD(13, 15)    ; ///< U3
++                uint32_t                 UvThresholdBits                                  : __CODEGEN_BITFIELD(16, 18)    ; ///< U3
++                uint32_t                 Reserved307                                      : __CODEGEN_BITFIELD(19, 23)    ; ///< U5
++                uint32_t                 UvThreshold                                      : __CODEGEN_BITFIELD(24, 30)    ; ///< U7
++                uint32_t                 Reserved319                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 Uvmaxcolor                                       : __CODEGEN_BITFIELD( 0,  8)    ; ///< U9
++                uint32_t                 Reserved329                                      : __CODEGEN_BITFIELD( 9, 15)    ; ///< U7
++                uint32_t                 InvUvmaxcolor                                    : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW10;
++
++        //! \name Local enumerations
++
++        enum SATFACTOR1
++        {
++            SATFACTOR1_UNNAMED220                                            = 220, ///<
++        };
++        enum SATFACTOR2
++        {
++            SATFACTOR2_UNNAMED220                                            = 220, ///<
++        };
++        enum SATFACTOR3
++        {
++            SATFACTOR3_UNNAMED220                                            = 220, ///<
++        };
++        enum SATFACTOR4
++        {
++            SATFACTOR4_UNNAMED220                                            = 220, ///<
++        };
++        enum SATFACTOR5
++        {
++            SATFACTOR5_UNNAMED220                                            = 220, ///<
++        };
++        enum SATFACTOR6
++        {
++            SATFACTOR6_UNNAMED220                                            = 220, ///<
++        };
++        enum BASECOLOR1
++        {
++            BASECOLOR1_UNNAMED145                                            = 145, ///<
++        };
++        enum BASECOLOR2
++        {
++            BASECOLOR2_UNNAMED307                                            = 307, ///<
++        };
++        enum BASECOLOR3
++        {
++            BASECOLOR3_UNNAMED483                                            = 483, ///<
++        };
++        enum BASECOLO4
++        {
++            BASECOLO4_UNNAMED657                                             = 657, ///<
++        };
++        enum BASECOLOR5
++        {
++            BASECOLOR5_UNNAMED819                                            = 819, ///<
++        };
++        enum BASECOLOR6
++        {
++            BASECOLOR6_UNNAMED995                                            = 995, ///<
++        };
++        enum COLORTRANSITSLOPE2
++        {
++            COLORTRANSITSLOPE2_UNNAMED405                                    = 405, ///<
++        };
++        enum COLORTRANSITSLOPE23
++        {
++            COLORTRANSITSLOPE23_UNNAMED744                                   = 744, ///<
++        };
++        enum COLORTRANSITSLOPE34
++        {
++            COLORTRANSITSLOPE34_UNNAMED1131                                  = 1131, ///<
++        };
++        enum COLORTRANSITSLOPE45
++        {
++            COLORTRANSITSLOPE45_UNNAMED407                                   = 407, ///<
++        };
++        enum COLORTRANSITSLOPE56
++        {
++            COLORTRANSITSLOPE56_UNNAMED372                                   = 372, ///<
++        };
++        enum COLORTRANSITSLOPE61
++        {
++            COLORTRANSITSLOPE61_UNNAMED377                                   = 377, ///<
++        };
++        enum COLORBIAS1
++        {
++            COLORBIAS1_UNNAMED0                                              = 0, ///<
++        };
++        enum COLORBIAS2
++        {
++            COLORBIAS2_UNNAMED150                                            = 150, ///<
++        };
++        enum COLORBIAS3
++        {
++            COLORBIAS3_UNNAMED0                                              = 0, ///<
++        };
++        enum COLORBIAS4
++        {
++            COLORBIAS4_UNNAMED0                                              = 0, ///<
++        };
++        enum COLORBIAS5
++        {
++            COLORBIAS5_UNNAMED0                                              = 0, ///<
++        };
++        enum COLORBIAS6
++        {
++            COLORBIAS6_UNNAMED0                                              = 0, ///<
++        };
++        enum STE_SLOPE_BITS
++        {
++            STE_SLOPE_BITS_UNNAMED0                                          = 0, ///<
++        };
++        enum STE_THRESHOLD
++        {
++            STE_THRESHOLD_UNNAMED0                                           = 0, ///<
++        };
++        enum UV_THRESHOLD_BITS
++        {
++            UV_THRESHOLD_BITS_UNNAMED3                                       = 3, ///<
++        };
++        enum UV_THRESHOLD
++        {
++            UV_THRESHOLD_UNNAMED3                                            = 3, ///<
++        };
++        enum UVMAXCOLOR
++        {
++            UVMAXCOLOR_UNNAMED448                                            = 448, ///<
++        };
++        enum INV_UVMAXCOLOR
++        {
++            INV_UVMAXCOLOR_UNNAMED146                                        = 146, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_TCC_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.Satfactor1 = SATFACTOR1_UNNAMED220;
++            DW0.Satfactor2 = SATFACTOR2_UNNAMED220;
++            DW0.Satfactor3 = SATFACTOR3_UNNAMED220;
++
++            DW1.Value = 0;
++            DW1.Satfactor4 = SATFACTOR4_UNNAMED220;
++            DW1.Satfactor5 = SATFACTOR5_UNNAMED220;
++            DW1.Satfactor6 = SATFACTOR6_UNNAMED220;
++
++            DW2.Value = 0;
++            DW2.Basecolor1 = BASECOLOR1_UNNAMED145;
++            DW2.Basecolor2 = BASECOLOR2_UNNAMED307;
++            DW2.Basecolor3 = BASECOLOR3_UNNAMED483;
++
++            DW3.Value = 0;
++            DW3.Basecolo4 = BASECOLO4_UNNAMED657;
++            DW3.Basecolor5 = BASECOLOR5_UNNAMED819;
++            DW3.Basecolor6 = BASECOLOR6_UNNAMED995;
++
++            DW4.Value = 0;
++            DW4.Colortransitslope2 = COLORTRANSITSLOPE2_UNNAMED405;
++            DW4.Colortransitslope23 = COLORTRANSITSLOPE23_UNNAMED744;
++
++            DW5.Value = 0;
++            DW5.Colortransitslope34 = COLORTRANSITSLOPE34_UNNAMED1131;
++            DW5.Colortransitslope45 = COLORTRANSITSLOPE45_UNNAMED407;
++
++            DW6.Value = 0;
++            DW6.Colortransitslope56 = COLORTRANSITSLOPE56_UNNAMED372;
++            DW6.Colortransitslope61 = COLORTRANSITSLOPE61_UNNAMED377;
++
++            DW7.Value = 0;
++            DW7.Colorbias1 = COLORBIAS1_UNNAMED0;
++            DW7.Colorbias2 = COLORBIAS2_UNNAMED150;
++            DW7.Colorbias3 = COLORBIAS3_UNNAMED0;
++
++            DW8.Value = 0;
++            DW8.Colorbias4 = COLORBIAS4_UNNAMED0;
++            DW8.Colorbias5 = COLORBIAS5_UNNAMED0;
++            DW8.Colorbias6 = COLORBIAS6_UNNAMED0;
++
++            DW9.Value = 0;
++            DW9.SteSlopeBits = STE_SLOPE_BITS_UNNAMED0;
++            DW9.SteThreshold = STE_THRESHOLD_UNNAMED0;
++            DW9.UvThresholdBits = UV_THRESHOLD_BITS_UNNAMED3;
++            DW9.UvThreshold = UV_THRESHOLD_UNNAMED3;
++
++            DW10.Value = 0;
++            DW10.Uvmaxcolor = UVMAXCOLOR_UNNAMED448;
++            DW10.InvUvmaxcolor = INV_UVMAXCOLOR_UNNAMED146;
++        };
++
++        static const size_t DW_SIZE = 11;
++        static const size_t BYTE_SIZE = 44;
++    };
++
++    //!
++    //! \brief VEBOX_PROCAMP_STATE
++    //! \details
++    //!     This state structure contains the IECP State Table Contents for ProcAmp
++    //!     state.
++    //!
++    struct VEBOX_PROCAMP_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 ProcampEnable                                    : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 Brightness                                       : __CODEGEN_BITFIELD( 1, 12)    ; ///< S84
++                uint32_t                 Reserved13                                       : __CODEGEN_BITFIELD(13, 16)    ; ///< U4
++                uint32_t                 Contrast                                         : __CODEGEN_BITFIELD(17, 27)    ; ///< U47
++                uint32_t                 Reserved28                                       : __CODEGEN_BITFIELD(28, 31)    ; ///< U4
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 SinCS                                            : __CODEGEN_BITFIELD( 0, 15)    ; ///< S88
++                uint32_t                 CosCS                                            : __CODEGEN_BITFIELD(16, 31)    ; ///< S88
++            };
++            uint32_t                     Value;
++        } DW1;
++
++        //! \name Local enumerations
++
++        enum BRIGHTNESS
++        {
++            BRIGHTNESS_OR00                                                  = 0, ///<
++        };
++        enum CONTRAST
++        {
++            CONTRAST_10INFIXEDPOINTU47                                       = 128, ///<
++        };
++        enum SIN_C_S
++        {
++            SIN_C_S_UNNAMED0                                                 = 0, ///<
++        };
++        enum COS_C_S
++        {
++            COS_C_S_UNNAMED256                                               = 256, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_PROCAMP_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.Brightness = BRIGHTNESS_OR00;
++            DW0.Contrast = CONTRAST_10INFIXEDPOINTU47;
++
++            DW1.Value = 0;
++            DW1.SinCS = SIN_C_S_UNNAMED0;
++            DW1.CosCS = COS_C_S_UNNAMED256;
++        };
++
++        static const size_t DW_SIZE = 2;
++        static const size_t BYTE_SIZE = 8;
++    };
++
++    //!
++    //! \brief VEBOX_IECP_STATE
++    //! \details
++    //! 
++    //!
++    struct VEBOX_IECP_STATE_CMD
++    {
++        VEBOX_STD_STE_STATE_CMD       StdSteState                                                                      ; ///< VEBOX_STD_STE_STATE
++        VEBOX_ACE_LACE_STATE_CMD      AceState                                                                         ; ///< VEBOX_ACE_LACE_STATE
++        VEBOX_TCC_STATE_CMD           TccState                                                                         ; ///< VEBOX_TCC_STATE
++        VEBOX_PROCAMP_STATE_CMD       ProcampState                                                                     ; ///< VEBOX_PROCAMP_STATE
++        VEBOX_CSC_STATE_CMD           CscState                                                                         ; ///< VEBOX_CSC_STATE
++        VEBOX_ALPHA_AOI_STATE_CMD     AlphaAoiState                                                                    ; ///< VEBOX_ALPHA_AOI_STATE
++        VEBOX_CCM_STATE_CMD           CcmState                                                                         ; ///< VEBOX_CCM_STATE
++        VEBOX_FRONT_END_CSC_STATE_CMD FrontEndCsc                                                                      ; ///< VEBOX_FRONT_END_CSC_STATE
++        VEBOX_GAMUT_CONTROL_STATE_CMD GamutState                                                                       ; ///< VEBOX_GAMUT_CONTROL_STATE
++
++        //! \name Local enumerations
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_IECP_STATE_CMD() {
++        };
++
++        static const size_t DW_SIZE = 115;
++        static const size_t BYTE_SIZE = 460;
++    };
++
++    //!
++    //! \brief VEBOX_CH_DIR_FILTER_COEFFICIENT
++    //! \details
++    //! 
++    //!
++    struct VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 FilterCoefficient0                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< S2.6
++                uint32_t                 FilterCoefficient1                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< S2.6
++                uint32_t                 FilterCoefficient2                               : __CODEGEN_BITFIELD(16, 23)    ; ///< S2.6
++                uint32_t                 FilterCoefficient3                               : __CODEGEN_BITFIELD(24, 31)    ; ///< S2.6
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 FilterCoefficient4                               : __CODEGEN_BITFIELD( 0,  7)    ; ///< S2.6
++                uint32_t                 FilterCoefficient5                               : __CODEGEN_BITFIELD( 8, 15)    ; ///< S2.6
++                uint32_t                 FilterCoefficient6                               : __CODEGEN_BITFIELD(16, 23)    ; ///< S2.6
++                uint32_t                 FilterCoefficient7                               : __CODEGEN_BITFIELD(24, 31)    ; ///< S2.6
++            };
++            uint32_t                     Value;
++        } DW1;
++
++        //! \name Local enumerations
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD() {
++            DW0.Value = 0;
++
++            DW1.Value = 0;
++        };
++
++        static const size_t DW_SIZE = 2;
++        static const size_t BYTE_SIZE = 8;
++    };
++
++    //!
++    //! \brief VEBOX_Scalar_State
++    //! \details
++    //! 
++    //!
++    struct VEBOX_Scalar_State_CMD
++    {
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableYChXDirFilterCoefficient070                                                 ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableYChYDirFilterCoefficient070                                                 ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableYChXDirFilterCoefficient170                                                 ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableYChYDirFilterCoefficient170                                                 ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChXDirFilterCoefficient070                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChYDirFilterCoefficient070                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChXDirFilterCoefficient170                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChYDirFilterCoefficient170                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChXDirFilterCoefficient270                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChYDirFilterCoefficient270                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChXDirFilterCoefficient370                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        VEBOX_CH_DIR_FILTER_COEFFICIENT_CMD TableUvChYDirFilterCoefficient370                                                ; ///< VEBOX_Ch_Dir_Filter_Coefficient
++        union
++        {
++            struct
++            {
++                /// uint32_t 24
++                uint32_t                 TransitionAreaWith8Pixels                        : __CODEGEN_BITFIELD( 0,  2)    ; ///< U3
++                uint32_t                 Reserved771                                      : __CODEGEN_BITFIELD( 3,  3)    ; ///< U1
++                uint32_t                 TransitionAreaWith4Pixels                        : __CODEGEN_BITFIELD( 4,  6)    ; ///< U3
++                uint32_t                 DisableAdaptiveFilter                            : __CODEGEN_BITFIELD( 7,  7)    ; ///< U1
++                uint32_t                 MaxDerivative8Pixels                             : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 MaxDerivative4Pixels                             : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 DefaultSharpnessLevel                            : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW24;
++        union
++        {
++            struct
++            {
++                /// uint32_t 25
++                uint32_t                 EdgeTh                                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 Reserved808                                      : __CODEGEN_BITFIELD( 8, 31)    ; ///< U24
++            };
++            uint32_t                     Value;
++        } DW25;
++        union
++        {
++            struct
++            {
++                /// uint32_t 26
++                uint32_t                 NumTransTh                                       : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 ChromaCoSitedVerticalPosition                    : __CODEGEN_BITFIELD( 8,  9)    ; ///< U2
++                uint32_t                 ChromaCoSitedHorizontalPosition                  : __CODEGEN_BITFIELD(10, 11)    ; ///< U2
++                uint32_t                 DisableChromaChannelDiagonalInterpolation        : __CODEGEN_BITFIELD(12, 12)    ; ///< U1
++                uint32_t                 Mode                                             : __CODEGEN_BITFIELD(13, 13)    ; ///< U1
++                uint32_t                 Dir2Threshold                                    : __CODEGEN_BITFIELD(14, 17)    ; ///< U4
++                uint32_t                 DirdiagThreshold                                 : __CODEGEN_BITFIELD(18, 21)    ; ///< U4
++                uint32_t                 Reserved854                                      : __CODEGEN_BITFIELD(22, 31)    ; ///< U10
++            };
++            uint32_t                     Value;
++        } DW26;
++        union
++        {
++            struct
++            {
++                /// uint32_t 27
++                uint32_t                 TearingTh                                        : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 Reserved876                                      : __CODEGEN_BITFIELD(12, 31)    ; ///< U20
++            };
++            uint32_t                     Value;
++        } DW27;
++        union
++        {
++            struct
++            {
++                /// uint32_t 28
++                uint32_t                 SadWt0                                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 SadWt1                                           : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 SadWt2                                           : __CODEGEN_BITFIELD(16, 23)    ; ///< U8
++                uint32_t                 SadWt3                                           : __CODEGEN_BITFIELD(24, 31)    ; ///< U8
++            };
++            uint32_t                     Value;
++        } DW28;
++        union
++        {
++            struct
++            {
++                /// uint32_t 29
++                uint32_t                 SadWt4                                           : __CODEGEN_BITFIELD( 0,  7)    ; ///< U8
++                uint32_t                 SadWt5                                           : __CODEGEN_BITFIELD( 8, 15)    ; ///< U8
++                uint32_t                 Reserved944                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW29;
++
++        //! \name Local enumerations
++
++        enum DEFAULT_SHARPNESS_LEVEL
++        {
++            DEFAULT_SHARPNESS_LEVEL_SMOOTH                                   = 0, ///< Contribute 1 from the smooth scalar
++            DEFAULT_SHARPNESS_LEVEL_SHARP                                    = 255, ///< Contribute 1 from the sharp scalar
++        };
++        enum EDGE_TH
++        {
++            EDGE_TH_UNNAMED32                                                = 32, ///<
++        };
++        enum NUM_TRANS_TH
++        {
++            NUM_TRANS_TH_UNNAMED3                                            = 3, ///<
++        };
++        enum CHROMA_CO_SITED_VERTICAL_POSITION
++        {
++            CHROMA_CO_SITED_VERTICAL_POSITION_UNNAMED0                       = 0, ///<
++        };
++        enum CHROMA_CO_SITED_HORIZONTAL_POSITION
++        {
++            CHROMA_CO_SITED_HORIZONTAL_POSITION_UNNAMED0                     = 0, ///<
++        };
++        enum DISABLE_CHROMA_CHANNEL_DIAGONAL_INTERPOLATION
++        {
++            DISABLE_CHROMA_CHANNEL_DIAGONAL_INTERPOLATION_UNNAMED0           = 0, ///<
++        };
++        enum MODE
++        {
++            MODE_UNNAMED1                                                    = 1, ///<
++        };
++        enum DIR2_THRESHOLD
++        {
++            DIR2_THRESHOLD_DEFAULT                                           = 2, ///<
++        };
++        enum DIRDIAG_THRESHOLD
++        {
++            DIRDIAG_THRESHOLD_DEFAULT                                        = 2, ///<
++        };
++        enum TEARING_TH
++        {
++            TEARING_TH_UNNAMED1800                                           = 1800, ///<
++        };
++        enum SAD_WT0
++        {
++            SAD_WT0_UNNAMED0                                                 = 0, ///<
++        };
++        enum SAD_WT1
++        {
++            SAD_WT1_UNNAMED12                                                = 12, ///<
++        };
++        enum SAD_WT2
++        {
++            SAD_WT2_UNNAMED25                                                = 25, ///<
++        };
++        enum SAD_WT3
++        {
++            SAD_WT3_UNNAMED38                                                = 38, ///<
++        };
++        enum SAD_WT4
++        {
++            SAD_WT4_UNNAMED51                                                = 51, ///<
++        };
++        enum SAD_WT5
++        {
++            SAD_WT5_UNNAMED64                                                = 64, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_Scalar_State_CMD() {
++            DW24.Value = 0;
++            DW24.DefaultSharpnessLevel = DEFAULT_SHARPNESS_LEVEL_SMOOTH;
++
++            DW25.Value = 0;
++            DW25.EdgeTh = EDGE_TH_UNNAMED32;
++
++            DW26.Value = 0;
++            DW26.NumTransTh = NUM_TRANS_TH_UNNAMED3;
++            DW26.ChromaCoSitedVerticalPosition = CHROMA_CO_SITED_VERTICAL_POSITION_UNNAMED0;
++            DW26.ChromaCoSitedHorizontalPosition = CHROMA_CO_SITED_HORIZONTAL_POSITION_UNNAMED0;
++            DW26.DisableChromaChannelDiagonalInterpolation = DISABLE_CHROMA_CHANNEL_DIAGONAL_INTERPOLATION_UNNAMED0;
++            DW26.Mode = MODE_UNNAMED1;
++            DW26.Dir2Threshold = DIR2_THRESHOLD_DEFAULT;
++            DW26.DirdiagThreshold = DIRDIAG_THRESHOLD_DEFAULT;
++
++            DW27.Value = 0;
++            DW27.TearingTh = TEARING_TH_UNNAMED1800;
++
++            DW28.Value = 0;
++            DW28.SadWt0 = SAD_WT0_UNNAMED0;
++            DW28.SadWt1 = SAD_WT1_UNNAMED12;
++            DW28.SadWt2 = SAD_WT2_UNNAMED25;
++            DW28.SadWt3 = SAD_WT3_UNNAMED38;
++
++            DW29.Value = 0;
++            DW29.SadWt4 = SAD_WT4_UNNAMED51;
++            DW29.SadWt5 = SAD_WT5_UNNAMED64;
++        };
++
++        static const size_t DW_SIZE = 30;
++        static const size_t BYTE_SIZE = 120;
++    };
++
++    //!
++    //! \brief VEBOX_STATE
++    //! \details
++    //!     This command controls the internal functions of the VEBOX. This command
++    //!     has a set of indirect state buffers:  DN/DI state
++    //!      IECP general state
++    //!      IECP Gamut Expansion/Compression state
++    //!      IECP Gamut Vertex Table state
++    //!      Capture Pipe state
++    //! 
++    //! 
++    //!     [DevSKL+]: Adds the LACE LUT Table as an indirect state buffer.
++    //!
++    struct VEBOX_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 DwordLength                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< =N
++                uint32_t                 Reserved12                                       : __CODEGEN_BITFIELD(12, 15)    ; ///< U4
++                uint32_t                 SubopcodeB                                       : __CODEGEN_BITFIELD(16, 20)    ; ///< U5
++                uint32_t                 SubopcodeA                                       : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 CommandOpcode                                    : __CODEGEN_BITFIELD(24, 26)    ; ///< U3
++                uint32_t                 Pipeline                                         : __CODEGEN_BITFIELD(27, 28)    ; ///< U2
++                uint32_t                 CommandType                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 ColorGamutExpansionEnable                        : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 ColorGamutCompressionEnable                      : __CODEGEN_BITFIELD( 1,  1)    ; ///< U1
++                uint32_t                 GlobalIecpEnable                                 : __CODEGEN_BITFIELD( 2,  2)    ; ///< U1
++                uint32_t                 DnEnable                                         : __CODEGEN_BITFIELD( 3,  3)    ; ///< U1
++                uint32_t                 DiEnable                                         : __CODEGEN_BITFIELD( 4,  4)    ; ///< U1
++                uint32_t                 DnDiFirstFrame                                   : __CODEGEN_BITFIELD( 5,  5)    ; ///< U1
++                uint32_t                 Reserved38                                       : __CODEGEN_BITFIELD( 6,  7)    ; ///< U2
++                uint32_t                 DiOutputFrames                                   : __CODEGEN_BITFIELD( 8,  9)    ; ///< U2
++                uint32_t                 DemosaicEnable                                   : __CODEGEN_BITFIELD(10, 10)    ; ///< U1
++                uint32_t                 VignetteEnable                                   : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 AlphaPlaneEnable                                 : __CODEGEN_BITFIELD(12, 12)    ; ///< U1
++                uint32_t                 HotPixelFilteringEnable                          : __CODEGEN_BITFIELD(13, 13)    ; ///< U1
++                uint32_t                 SingleSliceVeboxEnable                           : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 LaceCorrectionEnable                             : __CODEGEN_BITFIELD(16, 16)    ; ///< U1
++                uint32_t                 DisableEncoderStatistics                         : __CODEGEN_BITFIELD(17, 17)    ; ///< U1
++                uint32_t                 DisableTemporalDenoiseFilter                     : __CODEGEN_BITFIELD(18, 18)    ; ///< U1
++                uint32_t                 SinglePipeEnable                                 : __CODEGEN_BITFIELD(19, 19)    ; ///< U1
++                uint32_t                 ScalarMode                                       : __CODEGEN_BITFIELD(20, 20)    ; ///< U1
++                uint32_t                 ForwardGammaCorrectionEnable                     : __CODEGEN_BITFIELD(21, 21)    ; ///< U1
++                uint32_t                 GamutExpansionPosition                           : __CODEGEN_BITFIELD(22, 22)    ; ///< U1
++                uint32_t                 Reserved55                                       : __CODEGEN_BITFIELD(23, 24)    ; ///< U2
++                uint32_t                 StateSurfaceControlBits                          : __CODEGEN_BITFIELD(25, 31)    ; ///< U7
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 Reserved64                                       : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 DnDiStatePointerLow                              : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 DnDiStatePointerHigh                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved112                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 Reserved128                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 IecpStatePointerLow                              : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 IecpStatePointerHigh                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved176                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 Reserved192                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 GamutStatePointerLow                             : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 GamutStatePointerHigh                            : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved240                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 Reserved256                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 VertexTableStatePointerLow                       : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 VertexTableStatePointerHigh                      : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved304                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 Reserved320                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 CapturePipeStatePointerLow                       : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 CapturePipeStatePointerHigh                      : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved368                                      : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 Reserved384                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 LaceLutTableStatePointerLow                      : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 LaceLutTableStatePointerHigh                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved432                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 ArbitrationPriorityControlForLaceLut             : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14..15
++                uint64_t                 Reserved448                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint64_t                 GammaCorrectionValuesAddressGraphicsaddress4712  : __CODEGEN_BITFIELD(12, 47)    ; ///< Sub-structure
++                uint64_t                 GammaCorrectionValuesAddressReserved             : __CODEGEN_BITFIELD(48, 63)    ; ///< Sub-structure
++            };
++            uint32_t                     Value[2];
++        } DW14_15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 Reserved512                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< U12
++                uint32_t                 Lut3DStatePointerLow                             : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicAddress[31:12]
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 Lut3DStatePointerHigh                            : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicAddress[47:32]
++                uint32_t                 Reserved560                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 ArbitrationPriorityControlForLut3D               : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW17;
++        union
++        {
++            struct
++            {
++                /// uint32_t 18
++                uint32_t                 ChromaUpsamplingCoSitedHorizontalOffset          : __CODEGEN_BITFIELD( 0,  1)    ; ///< U2
++                uint32_t                 ChromaUpsamplingCoSitedVerticalOffset            : __CODEGEN_BITFIELD( 2,  4)    ; ///< U3
++                uint32_t                 ChromaDownsamplingCoSitedHorizontalOffset        : __CODEGEN_BITFIELD( 5,  6)    ; ///< U2
++                uint32_t                 ChromaDownsamplingCoSitedVerticalOffset          : __CODEGEN_BITFIELD( 7,  9)    ; ///< U3
++                uint32_t                 BypassChromaUpsampling                           : __CODEGEN_BITFIELD(10, 10)    ; ///< U1
++                uint32_t                 BypassChromaDownsampling                         : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 Reserved588                                      : __CODEGEN_BITFIELD(12, 28)    ; ///< U2
++                uint32_t                 Lut3DSize                                        : __CODEGEN_BITFIELD(29, 30)    ; ///< U2
++                uint32_t                 Lut3DEnable                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW18;
++
++        //! \name Local enumerations
++
++        enum SUBOPCODE_B
++        {
++            SUBOPCODE_B_UNNAMED2                                             = 2, ///<
++        };
++        enum SUBOPCODE_A
++        {
++            SUBOPCODE_A_UNNAMED0                                             = 0, ///<
++        };
++        enum COMMAND_OPCODE
++        {
++            COMMAND_OPCODE_VEBOX                                             = 4, ///<
++        };
++        enum PIPELINE
++        {
++            PIPELINE_MEDIA                                                   = 2, ///<
++        };
++        enum COMMAND_TYPE
++        {
++            COMMAND_TYPE_PARALLELVIDEOPIPE                                   = 3, ///<
++        };
++        enum DI_OUTPUT_FRAMES
++        {
++            DI_OUTPUT_FRAMES_OUTPUTBOTHFRAMES                                = 0, ///<
++            DI_OUTPUT_FRAMES_OUTPUTPREVIOUSFRAMEONLY                         = 1, ///<
++            DI_OUTPUT_FRAMES_OUTPUTCURRENTFRAMEONLY                          = 2, ///<
++        };
++        enum SINGLE_SLICE_VEBOX_ENABLE
++        {
++            SINGLE_SLICE_VEBOX_ENABLE_BOTHSLICESENABLED                      = 0, ///<
++            SINGLE_SLICE_VEBOX_ENABLE_SLICE0ENABLED                          = 1, ///<
++            SINGLE_SLICE_VEBOX_ENABLE_SLICE1ENABLES                          = 2, ///<
++        };
++        enum SINGLE_PIPE_ENABLE
++        {
++            SINGLE_PIPE_ENABLE_DEFAULT                                       = 0, ///<
++            SINGLE_PIPE_ENABLE_ENABLE                                        = 1, ///<
++        };
++        enum GAMUT_EXPANSION_POSITION
++        {
++            GAMUT_EXPANSION_POSITION_GAMUTEXPANSIONATTHEBACKENDOFIECPPIPE    = 0, ///<
++            GAMUT_EXPANSION_POSITION_GAMUTEXPANSIONATTHEFRONTOFIECPPIPE      = 1, ///<
++        };
++        enum ARBITRATION_PRIORITY_CONTROL__FOR_LACE_LUT
++        {
++            ARBITRATION_PRIORITY_CONTROL_FOR_LACE_LUT_HIGHESTPRIORITY        = 0, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_LACE_LUT_SECONDHIGHESTPRIORITY  = 1, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_LACE_LUT_THIRDHIGHESTPRIORITY   = 2, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_LACE_LUT_LOWESTPRIORITY         = 3, ///<
++        };
++        enum ARBITRATION_PRIORITY_CONTROL__FOR_3D_LUT
++        {
++            ARBITRATION_PRIORITY_CONTROL_FOR_3D_LUT_HIGHESTPRIORITY          = 0, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_3D_LUT_SECONDHIGHESTPRIORITY    = 1, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_3D_LUT_THIRDHIGHESTPRIORITY     = 2, ///<
++            ARBITRATION_PRIORITY_CONTROL_FOR_3D_LUT_LOWESTPRIORITY           = 3, ///<
++        };
++        enum CHROMA_UPSAMPLING_CO_SITED_HORIZONTAL_OFFSET
++        {
++            CHROMA_UPSAMPLING_CO_SITED_HORIZONTAL_OFFSET_UNNAMED0            = 0, ///<
++        };
++        enum CHROMA_UPSAMPLING_CO_SITED_VERTICAL_OFFSET
++        {
++            CHROMA_UPSAMPLING_CO_SITED_VERTICAL_OFFSET_UNNAMED0              = 0, ///<
++        };
++        enum CHROMA_DOWNSAMPLING_CO_SITED_HORIZONTAL_OFFSET
++        {
++            CHROMA_DOWNSAMPLING_CO_SITED_HORIZONTAL_OFFSET_UNNAMED0          = 0, ///<
++        };
++        enum CHROMA_DOWNSAMPLING_CO_SITED_VERTICAL_OFFSET
++        {
++            CHROMA_DOWNSAMPLING_CO_SITED_VERTICAL_OFFSET_UNNAMED0            = 0, ///<
++        };
++        enum BYPASS_CHROMA_UPSAMPLING
++        {
++            BYPASS_CHROMA_UPSAMPLING_UNNAMED1                                = 1, ///<
++        };
++        enum BYPASS_CHROMA_DOWNSAMPLING
++        {
++            BYPASS_CHROMA_DOWNSAMPLING_UNNAMED1                              = 1, ///<
++        };
++        enum _3D_LUT_SIZE
++        {
++            _3D_LUT_SIZE_33X33X33                                            = 0, ///<
++            _3D_LUT_SIZE_17X17X17                                            = 1, ///<
++            _3D_LUT_SIZE_65X65X65                                            = 2, ///<
++        };
++        enum PATCH_CONSTANTS
++        {
++            DNDISTATEPOINTERLOW_BYTEOFFSET                                   = 8, ///<
++            DNDISTATEPOINTERLOW_INDEX                                        = 2, ///<
++            DNDISTATEPOINTERHIGH_BYTEOFFSET                                  = 12, ///<
++            DNDISTATEPOINTERHIGH_INDEX                                       = 3, ///<
++            IECPSTATEPOINTERLOW_BYTEOFFSET                                   = 16, ///<
++            IECPSTATEPOINTERLOW_INDEX                                        = 4, ///<
++            IECPSTATEPOINTERHIGH_BYTEOFFSET                                  = 20, ///<
++            IECPSTATEPOINTERHIGH_INDEX                                       = 5, ///<
++            GAMUTSTATEPOINTERLOW_BYTEOFFSET                                  = 24, ///<
++            GAMUTSTATEPOINTERLOW_INDEX                                       = 6, ///<
++            GAMUTSTATEPOINTERHIGH_BYTEOFFSET                                 = 28, ///<
++            GAMUTSTATEPOINTERHIGH_INDEX                                      = 7, ///<
++            VERTEXTABLESTATEPOINTERLOW_BYTEOFFSET                            = 32, ///<
++            VERTEXTABLESTATEPOINTERLOW_INDEX                                 = 8, ///<
++            VERTEXTABLESTATEPOINTERHIGH_BYTEOFFSET                           = 36, ///<
++            VERTEXTABLESTATEPOINTERHIGH_INDEX                                = 9, ///<
++            CAPTUREPIPESTATEPOINTERLOW_BYTEOFFSET                            = 40, ///<
++            CAPTUREPIPESTATEPOINTERLOW_INDEX                                 = 10, ///<
++            CAPTUREPIPESTATEPOINTERHIGH_BYTEOFFSET                           = 44, ///<
++            CAPTUREPIPESTATEPOINTERHIGH_INDEX                                = 11, ///<
++            LACELUTTABLESTATEPOINTERLOW_BYTEOFFSET                           = 48, ///<
++            LACELUTTABLESTATEPOINTERLOW_INDEX                                = 12, ///<
++            LACELUTTABLESTATEPOINTERHIGH_BYTEOFFSET                          = 52, ///<
++            LACELUTTABLESTATEPOINTERHIGH_INDEX                               = 13, ///<
++            LUT3DSTATEPOINTERLOW_BYTEOFFSET = 64, ///<
++            LUT3DSTATEPOINTERLOW_INDEX = 16, ///<
++            LUT3DSTATEPOINTERHIGH_BYTEOFFSET = 68, ///<
++            LUT3DSTATEPOINTERHIGH_INDEX = 17, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.DwordLength = __CODEGEN_OP_LENGTH(DW_SIZE);
++            DW0.SubopcodeB = SUBOPCODE_B_UNNAMED2;
++            DW0.SubopcodeA = SUBOPCODE_A_UNNAMED0;
++            DW0.CommandOpcode = COMMAND_OPCODE_VEBOX;
++            DW0.Pipeline = PIPELINE_MEDIA;
++            DW0.CommandType = COMMAND_TYPE_PARALLELVIDEOPIPE;
++
++            DW1.Value = 0;
++            DW1.DiOutputFrames = DI_OUTPUT_FRAMES_OUTPUTBOTHFRAMES;
++            DW1.SingleSliceVeboxEnable = SINGLE_SLICE_VEBOX_ENABLE_BOTHSLICESENABLED;
++            DW1.SinglePipeEnable = SINGLE_PIPE_ENABLE_DEFAULT;
++            DW1.GamutExpansionPosition = GAMUT_EXPANSION_POSITION_GAMUTEXPANSIONATTHEBACKENDOFIECPPIPE;
++
++            DW2.Value = 0;
++
++            DW3.Value = 0;
++
++            DW4.Value = 0;
++
++            DW5.Value = 0;
++
++            DW6.Value = 0;
++
++            DW7.Value = 0;
++
++            DW8.Value = 0;
++
++            DW9.Value = 0;
++
++            DW10.Value = 0;
++
++            DW11.Value = 0;
++
++            DW12.Value = 0;
++
++            DW13.Value = 0;
++            DW13.ArbitrationPriorityControlForLaceLut = ARBITRATION_PRIORITY_CONTROL_FOR_LACE_LUT_HIGHESTPRIORITY;
++
++            DW14_15.Value[0] = DW14_15.Value[1] = 0;
++
++            DW16.Value = 0;
++
++            DW17.Value = 0;
++            DW17.ArbitrationPriorityControlForLut3D = ARBITRATION_PRIORITY_CONTROL_FOR_3D_LUT_HIGHESTPRIORITY;
++
++            DW18.Value = 0;
++            DW18.ChromaUpsamplingCoSitedHorizontalOffset = CHROMA_UPSAMPLING_CO_SITED_HORIZONTAL_OFFSET_UNNAMED0;
++            DW18.ChromaUpsamplingCoSitedVerticalOffset = CHROMA_UPSAMPLING_CO_SITED_VERTICAL_OFFSET_UNNAMED0;
++            DW18.ChromaDownsamplingCoSitedHorizontalOffset = CHROMA_DOWNSAMPLING_CO_SITED_HORIZONTAL_OFFSET_UNNAMED0;
++            DW18.ChromaDownsamplingCoSitedVerticalOffset = CHROMA_DOWNSAMPLING_CO_SITED_VERTICAL_OFFSET_UNNAMED0;
++            DW18.BypassChromaUpsampling = BYPASS_CHROMA_UPSAMPLING_UNNAMED1;
++            DW18.BypassChromaDownsampling = BYPASS_CHROMA_DOWNSAMPLING_UNNAMED1;
++            DW18.Lut3DSize = _3D_LUT_SIZE_33X33X33;
++        };
++
++        static const size_t DW_SIZE = 19;
++        static const size_t BYTE_SIZE = 76;
++    };
++
++    //!
++    //! \brief VEBOX_SURFACE_STATE
++    //! \details
++    //!     The input and output data containers accessed are called "surfaces".
++    //!     Surface state is sent to VEBOX via an inline state command rather than
++    //!     using binding tables. SURFACE_STATE contains the parameters defining
++    //!     each surface to be accessed, including its size, format, and offsets to
++    //!     its subsurfaces. The surface's base address is in the execution command.
++    //!     Despite having multiple input and output surfaces, we limit the number
++    //!     of surface states to one for input surfaces and one for output surfaces.
++    //!     The other surfaces are derived from the input/output surface states.
++    //! 
++    //!     The Current Frame Input surface uses the Input SURFACE_STATE
++    //! 
++    //!     The Previous Denoised Input surface uses the Input SURFACE_STATE. (For
++    //!     16-bit Bayer pattern inputs this will be 16-bit.)
++    //! 
++    //!     The Current Denoised Output surface uses the Input SURFACE_STATE. (For
++    //!     16-bit Bayer pattern inputs this will be 16-bit.)
++    //! 
++    //!     The STMM/Noise History Input surface uses the Input SURFACE_STATE with
++    //!     Tile-Y and Width/Height a multiple of 4.
++    //! 
++    //!     The STMM/Noise History Output surface uses the Input SURFACE_STATE with
++    //!     Tile-Y and Width/Height a multiple of 4.
++    //! 
++    //!     The Current Deinterlaced/IECP Frame Output surface uses the Output
++    //!     SURFACE_STATE.
++    //! 
++    //!     The Previous Deinterlaced/IECP Frame Output surface uses the Output
++    //!     SURFACE_STATE.
++    //! 
++    //!     The FMD per block output / per Frame Output surface uses the Linear
++    //!     SURFACE_STATE (see note below).
++    //! 
++    //!     The Alpha surface uses the Linear A8 SURFACE_STATE with Width/Height
++    //!     equal to Input Surface. Pitch is width rounded to next 64.
++    //! 
++    //!     The Skin Score surface uses the Output SURFACE_STATE.
++    //! 
++    //!     The STMM height is the same as the Input Surface height except when the
++    //!     input Surface Format is Bayer Pattern and the Bayer Pattern Offset is 10
++    //!     or 11, in  which case the height is the input height + 4. For Bayer
++    //!     pattern inputs when the Bayer Pattern Offset is 10 or 11, the Current
++    //!     Denoised Output/Previous Denoised Input will also have a height which is
++    //!     the input height + 4. For Bayer pattern inputs only the Current Denoised
++    //!     Output/Previous Denoised Input are in Tile-Y.
++    //! 
++    //!     The linear surface for FMD statistics is linear (not tiled). The height
++    //!     of the per block statistics is (Input Height +3)/4 - the Input Surface
++    //!     height in pixels is rounded up to the next even 4 and divided by 4. The
++    //!     width of the per block section in bytes is equal to the width of the
++    //!     Input Surface in pixels rounded up to the next 16 bytes. The pitch of
++    //!     the per block section in bytes is equal to the width of the Input
++    //!     Surface in pixels rounded up to the next 64 bytes.
++    //! 
++    //!     The STMM surfaces must be identical to the Input surface except for the
++    //!     tiling mode must be Tile-Y and the pitch is specified in DW7. The pitch
++    //!     for the Current Denoised Output/Previous Denoised Input is specified in
++    //!     DW7. The width and height must be a multiple of 4 rounded up from the
++    //!     input height.
++    //! 
++    //!     The Vignette Correction surface uses the Linear 16-bit SURFACE_STATE
++    //!     with :
++    //!     Width=(Ceil(Image Width / 4) +1) * 4
++    //!     Height= Ceil(Image Height / 4) +1
++    //!     Pitch in bytes is (vignette width *2) rounded to the next 64
++    //! 
++    //!     VEBOX may write to memory between the surface width and the surface
++    //!     pitch for output surfaces.
++    //! 
++    //!     VEBOX can support a frame level X/Y offset which allows processing of 2
++    //!     side-by-side frames for certain 3D video formats.
++    //! 
++    //!     The X/Y Offset for Frame state applies only to the Current Frame Input
++    //!     and the Current Deinterlaced/IECP Frame Output and Previous
++    //!     Deinterlaced/IECP Frame Output. The statistics surfaces, the denoise
++    //!     feedback surfaces and the alpha/vignette surfaces have no X/Y offsets.
++    //! 
++    //!     For 8bit Alpha input, when converted to 16bit output, the 8 bit alpha
++    //!     value is replicated to both the upper and lower 8 bits to form the 16
++    //!     bit alpha value.
++    //! 
++    //!     Skin Score Output Surface uses the same tiling format as the Output
++    //!     surface.
++    //! 
++    //!     The input and Output surface for scalar is defined by this command.
++    //!     Derived pitch is not used with the scalar command.
++    //!
++    struct VEBOX_SURFACE_STATE_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 DwordLength                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< =N
++                uint32_t                 Reserved12                                       : __CODEGEN_BITFIELD(12, 15)    ; ///< U4
++                uint32_t                 SubopcodeB                                       : __CODEGEN_BITFIELD(16, 20)    ; ///< U5
++                uint32_t                 SubopcodeA                                       : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 MediaCommandOpcode                               : __CODEGEN_BITFIELD(24, 26)    ; ///< U3
++                uint32_t                 MediaCommandPipeline                             : __CODEGEN_BITFIELD(27, 28)    ; ///< U2
++                uint32_t                 CommandType                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 SurfaceIdentification                            : __CODEGEN_BITFIELD( 0,  0)    ; ///< U1
++                uint32_t                 Reserved33                                       : __CODEGEN_BITFIELD( 1, 31)    ; ///< U31
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 Reserved64                                       : __CODEGEN_BITFIELD( 0,  3)    ; ///< U4
++                uint32_t                 Width                                            : __CODEGEN_BITFIELD( 4, 17)    ; ///< U14
++                uint32_t                 Height                                           : __CODEGEN_BITFIELD(18, 31)    ; ///< U14
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 TileWalk                                         : __CODEGEN_BITFIELD( 0,  0)    ; ///< _3D_TILEWALK
++                uint32_t                 TiledSurface                                     : __CODEGEN_BITFIELD( 1,  1)    ; ///< U1
++                uint32_t                 HalfPitchForChroma                               : __CODEGEN_BITFIELD( 2,  2)    ; ///< U1
++                uint32_t                 SurfacePitch                                     : __CODEGEN_BITFIELD( 3, 19)    ; ///< U17
++                uint32_t                 InterleaveChroma                                 : __CODEGEN_BITFIELD(20, 20)    ; ///< U1
++                uint32_t                 Reserved117                                      : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 BayerPatternFormat                               : __CODEGEN_BITFIELD(24, 24)    ; ///< U1
++                uint32_t                 BayerPatternOffset                               : __CODEGEN_BITFIELD(25, 26)    ; ///< U2
++                uint32_t                 SurfaceFormat                                    : __CODEGEN_BITFIELD(27, 31)    ; ///< U5
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 YOffsetForU                                      : __CODEGEN_BITFIELD( 0, 14)    ; ///< U15
++                uint32_t                 Reserved143                                      : __CODEGEN_BITFIELD(15, 15)    ; ///< U1
++                uint32_t                 XOffsetForU                                      : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved157                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 YOffsetForV                                      : __CODEGEN_BITFIELD( 0, 14)    ; ///< U15
++                uint32_t                 Reserved175                                      : __CODEGEN_BITFIELD(15, 15)    ; ///< U1
++                uint32_t                 XOffsetForV                                      : __CODEGEN_BITFIELD(16, 28)    ; ///< U13
++                uint32_t                 Reserved189                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 YOffsetForFrame                                  : __CODEGEN_BITFIELD( 0, 14)    ; ///< U15
++                uint32_t                 Reserved207                                      : __CODEGEN_BITFIELD(15, 15)    ; ///< U1
++                uint32_t                 XOffsetForFrame                                  : __CODEGEN_BITFIELD(16, 30)    ; ///< U15
++                uint32_t                 Reserved223                                      : __CODEGEN_BITFIELD(31, 31)    ; ///< U1
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 DerivedSurfacePitch                              : __CODEGEN_BITFIELD( 0, 16)    ; ///< U17
++                uint32_t                 Reserved241                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 SurfacePitchForSkinScoreOutputSurfaces           : __CODEGEN_BITFIELD( 0, 16)    ; ///< U17
++                uint32_t                 Reserved273                                      : __CODEGEN_BITFIELD(17, 31)    ; ///< U15
++            };
++            uint32_t                     Value;
++        } DW8;
++
++        //! \name Local enumerations
++
++        enum SUBOPCODE_B
++        {
++            SUBOPCODE_B_VEBOX                                                = 0, ///<
++        };
++        enum SUBOPCODE_A
++        {
++            SUBOPCODE_A_VEBOX                                                = 0, ///<
++        };
++        enum MEDIA_COMMAND_OPCODE
++        {
++            MEDIA_COMMAND_OPCODE_VEBOX                                       = 4, ///<
++        };
++        enum MEDIA_COMMAND_PIPELINE
++        {
++            MEDIA_COMMAND_PIPELINE_MEDIA                                     = 2, ///<
++        };
++        enum COMMAND_TYPE
++        {
++            COMMAND_TYPE_PARALLELVIDEOPIPE                                   = 3, ///<
++        };
++        enum SURFACE_IDENTIFICATION
++        {
++            SURFACE_IDENTIFICATION_INPUTSURFACEANDDENOISEDCURRENTOUTPUTSURFACE = 0, ///<
++            SURFACE_IDENTIFICATION_OUTPUTSURFACEALLEXCEPTTHEDENOISEDCURRENTOUTPUTSURFACE = 1, ///<
++        };
++        //! \brief 3D_TileWalk
++        enum TILE_WALK
++        {
++            TILE_WALK_TILEWALKXMAJOR                                         = 0, ///<
++            TILE_WALK_TILEWALKYMAJOR                                         = 1, ///<
++        };
++        enum BAYER_PATTERN_FORMAT
++        {
++            BAYER_PATTERN_FORMAT_8_BITINPUTATA8_BITSTRIDE                    = 0, ///<
++            BAYER_PATTERN_FORMAT_16_BITINPUTATA16_BITSTRIDE                  = 1, ///<
++        };
++        enum BAYER_PATTERN_OFFSET
++        {
++            BAYER_PATTERN_OFFSET_PIXELATX0_Y0ISBLUE                          = 0, ///<
++            BAYER_PATTERN_OFFSET_PIXELATX0_Y0ISRED                           = 1, ///<
++            BAYER_PATTERN_OFFSET_PIXELATX0_Y0ISGREEN_PIXELATX1_Y0ISRED       = 2, ///<
++            BAYER_PATTERN_OFFSET_PIXELATX0_Y0ISGREEN_PIXELATX1_Y0ISBLUE      = 3, ///<
++        };
++        enum SURFACE_FORMAT
++        {
++            SURFACE_FORMAT_YCRCBNORMAL                                       = 0, ///<
++            SURFACE_FORMAT_YCRCBSWAPUVY                                      = 1, ///<
++            SURFACE_FORMAT_YCRCBSWAPUV                                       = 2, ///<
++            SURFACE_FORMAT_YCRCBSWAPY                                        = 3, ///<
++            SURFACE_FORMAT_PLANAR4208                                        = 4, ///< NV12 with Interleave Chroma set
++            SURFACE_FORMAT_PACKED444A8                                       = 5, ///<
++            SURFACE_FORMAT_PACKED42216                                       = 6, ///<
++            SURFACE_FORMAT_R10G10B10A2UNORMR10G10B10A2UNORMSRGB              = 7, ///<
++            SURFACE_FORMAT_R8G8B8A8UNORMR8G8B8A8UNORMSRGB                    = 8, ///<
++            SURFACE_FORMAT_PACKED44416                                       = 9, ///<
++            SURFACE_FORMAT_PLANAR42216                                       = 10, ///<
++            SURFACE_FORMAT_Y8UNORM                                           = 11, ///<
++            SURFACE_FORMAT_PLANAR42016                                       = 12, ///<
++            SURFACE_FORMAT_R16G16B16A16                                      = 13, ///<
++            SURFACE_FORMAT_BAYERPATTERN                                      = 14, ///<
++            SURFACE_FORMAT_Y16UNORM                                          = 15, ///<
++            SURFACE_FORMAT_PACKED44410                                       = 16, ///<
++            SURFACE_FORMAT_B8G8R8A8UNORM                                     = 17, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_SURFACE_STATE_CMD() {
++            DW0.Value = 0;
++            DW0.DwordLength = __CODEGEN_OP_LENGTH(DW_SIZE);
++            DW0.SubopcodeB = SUBOPCODE_B_VEBOX;
++            DW0.SubopcodeA = SUBOPCODE_A_VEBOX;
++            DW0.MediaCommandOpcode = MEDIA_COMMAND_OPCODE_VEBOX;
++            DW0.MediaCommandPipeline = MEDIA_COMMAND_PIPELINE_MEDIA;
++            DW0.CommandType = COMMAND_TYPE_PARALLELVIDEOPIPE;
++
++            DW1.Value = 0;
++            DW1.SurfaceIdentification = SURFACE_IDENTIFICATION_INPUTSURFACEANDDENOISEDCURRENTOUTPUTSURFACE;
++
++            DW2.Value = 0;
++
++            DW3.Value = 0;
++            DW3.TileWalk = TILE_WALK_TILEWALKXMAJOR;
++            DW3.BayerPatternFormat = BAYER_PATTERN_FORMAT_8_BITINPUTATA8_BITSTRIDE;
++            DW3.BayerPatternOffset = BAYER_PATTERN_OFFSET_PIXELATX0_Y0ISBLUE;
++            DW3.SurfaceFormat = SURFACE_FORMAT_YCRCBNORMAL;
++
++            DW4.Value = 0;
++
++            DW5.Value = 0;
++
++            DW6.Value = 0;
++
++            DW7.Value = 0;
++
++            DW8.Value = 0;
++        };
++
++        static const size_t DW_SIZE = 9;
++        static const size_t BYTE_SIZE = 36;
++    };
++
++    //!
++    //! \brief VEBOX_TILING_CONVERT
++    //! \details
++    //!     This command takes the input surface and writes directly to the output
++    //!     surface at high speed.  The surface format and width/height of the input
++    //!     and output must be the same, only the tiling mode and pitch can change.
++    //!
++    struct VEBOX_TILING_CONVERT_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 DwordLength                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< =N
++                uint32_t                 Reserved12                                       : __CODEGEN_BITFIELD(12, 15)    ; ///< U4
++                uint32_t                 SubopcodeB                                       : __CODEGEN_BITFIELD(16, 20)    ; ///< U5
++                uint32_t                 SubopcodeA                                       : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 CommandOpcode                                    : __CODEGEN_BITFIELD(24, 26)    ; ///< U3
++                uint32_t                 Pipeline                                         : __CODEGEN_BITFIELD(27, 28)    ; ///< U2
++                uint32_t                 CommandType                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1..2
++                uint64_t                 InputSurfaceControlBits                          : __CODEGEN_BITFIELD( 0, 10)    ; ///< VEB_DI_IECP_COMMAND_SURFACE_CONTROL_BITS_SKL+
++                uint64_t                 Reserved43                                       : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint64_t                 InputAddressGraphicsaddress4712                  : __CODEGEN_BITFIELD(12, 47)    ; ///< Sub-structure
++                uint64_t                 InputAddressReserved                             : __CODEGEN_BITFIELD(48, 63)    ; ///< Sub-structure
++            };
++            uint32_t                     Value[2];
++        } DW1_2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3..4
++                uint64_t                 OutputSurfaceControlBits                         : __CODEGEN_BITFIELD( 0, 10)    ; ///< VEB_DI_IECP_COMMAND_SURFACE_CONTROL_BITS_SKL+
++                uint64_t                 Reserved107                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint64_t                 OutputAddressGraphicsaddress4712                 : __CODEGEN_BITFIELD(12, 47)    ; ///< Sub-structure
++                uint64_t                 OutputAddressReserved                            : __CODEGEN_BITFIELD(48, 63)    ; ///< Sub-structure
++            };
++            uint32_t                     Value[2];
++        } DW3_4;
++
++        //! \name Local enumerations
++
++        enum SUBOPCODE_B
++        {
++            SUBOPCODE_B_UNNAMED1                                             = 1, ///<
++        };
++        enum SUBOPCODE_A
++        {
++            SUBOPCODE_A_UNNAMED0                                             = 0, ///<
++        };
++        enum COMMAND_OPCODE
++        {
++            COMMAND_OPCODE_VEBOX                                             = 4, ///<
++        };
++        enum PIPELINE
++        {
++            PIPELINE_MEDIA                                                   = 2, ///<
++        };
++        enum COMMAND_TYPE
++        {
++            COMMAND_TYPE_PARALLELVIDEOPIPE                                   = 3, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API VEBOX_TILING_CONVERT_CMD() {
++            DW0.Value = 0;
++            DW0.DwordLength = __CODEGEN_OP_LENGTH(DW_SIZE);
++            DW0.SubopcodeB = SUBOPCODE_B_UNNAMED1;
++            DW0.SubopcodeA = SUBOPCODE_A_UNNAMED0;
++            DW0.CommandOpcode = COMMAND_OPCODE_VEBOX;
++            DW0.Pipeline = PIPELINE_MEDIA;
++            DW0.CommandType = COMMAND_TYPE_PARALLELVIDEOPIPE;
++
++            DW1_2.Value[0] = DW1_2.Value[1] = 0;
++
++            DW3_4.Value[0] = DW3_4.Value[1] = 0;
++        };
++
++        static const size_t DW_SIZE = 5;
++        static const size_t BYTE_SIZE = 20;
++    };
++
++    //!
++    //! \brief VEB_DI_IECP
++    //! \details
++    //!     The VEB_DI_IECP command causes the VEBOX to start processing the frames
++    //!     specified by VEB_SURFACE_STATE using the parameters specified by
++    //!     VEB_DI_STATE and VEB_IECP_STATE.  The processing can start and end at
++    //!     any 64 pixel column in the frame. If Starting X and Ending X are used to
++    //!     split the frame into sections, it should not be split into more than 4
++    //!     sections.
++    //!     Each VEB_DI_IECP command should be preceded by a VEB_STATE command and
++    //!     the input/output VEB_SURFACE_STATE commands.
++    //! 
++    //!     When DI is enabled, only the Current Frame skin scores are outputted to
++    //!     the Skin Score Output surface.
++    //! 
++    //!     When Scalar is enabled only Current frame input and output surface
++    //!     pointers are valid in this command. LACE/ACE histogram pointers are also
++    //!     used if LACE/ACE is enabled. StartX and EndX is not supported with
++    //!     Scalar.
++    //!
++    struct VEB_DI_IECP_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 DwordLength                                      : __CODEGEN_BITFIELD( 0, 11)    ; ///< =N
++                uint32_t                 Reserved12                                       : __CODEGEN_BITFIELD(12, 15)    ; ///< U4
++                uint32_t                 Subopb                                           : __CODEGEN_BITFIELD(16, 20)    ; ///< U5
++                uint32_t                 Subopa                                           : __CODEGEN_BITFIELD(21, 23)    ; ///< U3
++                uint32_t                 Opcode                                           : __CODEGEN_BITFIELD(24, 26)    ; ///< U3
++                uint32_t                 Pipeline                                         : __CODEGEN_BITFIELD(27, 28)    ; ///< U2
++                uint32_t                 CommandType                                      : __CODEGEN_BITFIELD(29, 31)    ; ///< U3
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 EndingX                                          : __CODEGEN_BITFIELD( 0, 13)    ; ///< U14
++                uint32_t                 Reserved46                                       : __CODEGEN_BITFIELD(14, 15)    ; ///< U2
++                uint32_t                 StartingX                                        : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 Reserved62                                       : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 CurrentFrameSurfaceControlBitsReserved0          : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved75                                       : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 CurrentFrameInputAddress                         : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 CurrentFrameInputAddressHigh                     : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved112                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 CurrentFrameInputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 PreviousFrameSurfaceControlBitsReserved0         : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved139                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 PreviousFrameInputAddress                        : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 PreviousFrameInputAddressHigh                    : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved176                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 PreviousFrameInputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 StmmInputSurfaceControlBitsReserved0             : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 StmmInputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 StmmInputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 StmmInputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 StmmInputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved203                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 StmmInputAddress                                 : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 StmmInputAddressHigh                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved240                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 StmmInputSurfaceArbitrationPriorityControl       : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 StmmOutputSurfaceControlBitsReserved0            : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 StmmOutputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 StmmOutputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 StmmOutputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 StmmOutputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved267                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 StmmOutputAddress                                : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 StmmOutputAddressHigh                            : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved304                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 StmmOutputSurfaceArbitrationPriorityControl      : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 DenoisedCurrentOutputSurfaceControlBitsReserved0 : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 DenoisedCurrentOutputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 DenoisedCurrentOutputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 DenoisedCurrentOutputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 DenoisedCurrentOutputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved331                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 DenoisedCurrentFrameOutputAddress                : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 DenoisedCurrentFrameOutputAddressHigh            : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved368                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 DenoisedCurrentOutputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 CurrentFrameOutputSurfaceControlBitsReserved0    : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameOutputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameOutputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameOutputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 CurrentFrameOutputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved395                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 CurrentFrameOutputAddress                        : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 CurrentFrameOutputAddressHigh                    : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved432                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 CurrentFrameOutputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 PreviousFrameOutputSurfaceControlBitsReserved0   : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameOutputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameOutputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameOutputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 PreviousFrameOutputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved459                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 PreviousFrameOutputAddress                       : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW14;
++        union
++        {
++            struct
++            {
++                /// uint32_t 15
++                uint32_t                 PreviousFrameOutputAddressHigh                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved496                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 PreviousFrameOutputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 StatisticsOutputSurfaceControlBitsReserved0      : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 StatisticsOutputSurfaceControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 StatisticsOutputSurfaceControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 StatisticsOutputSurfaceControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 StatisticsOutputSurfaceControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved523                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 StatisticsOutputAddress                          : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 StatisticsOutputAddressHigh                      : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved560                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 StatisticsOutputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW17;
++        union
++        {
++            struct
++            {
++                /// uint32_t 18
++                uint32_t                 AlphaVignetteControlBitsReserved0                : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 AlphaVignetteControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 AlphaVignetteControlBitsMemoryCompressionEnable  : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 AlphaVignetteControlBitsMemoryCompressionMode    : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 AlphaVignetteControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved587                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 AlphaVignetteCorrectionAddress                   : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW18;
++        union
++        {
++            struct
++            {
++                /// uint32_t 19
++                uint32_t                 AlphaVignetteCorrectionAddressHigh               : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved624                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 AlphaVignetteCorrectionSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW19;
++        union
++        {
++            struct
++            {
++                /// uint32_t 20
++                uint32_t                 LaceAceRgbHistogramControlBitsReserved0          : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 LaceAceRgbHistogramControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 LaceAceRgbHistogramControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 LaceAceRgbHistogramControlBitsMemoryCompressionMode : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 LaceAceRgbHistogramControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved651                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 LaceAceRgbHistogramOutputAddress                 : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW20;
++        union
++        {
++            struct
++            {
++                /// uint32_t 21
++                uint32_t                 LaceAceRgbHistogramOutputAddressHigh             : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved688                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 LaceAceRgbHistogramSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW21;
++        union
++        {
++            struct
++            {
++                /// uint32_t 22
++                uint32_t                 SkinScoreOutputControlBitsReserved0              : __CODEGEN_BITFIELD( 0,  0)    ; ///< Sub-structure
++                uint32_t                 SkinScoreOutputControlBitsIndexToMemoryObjectControlStateMocsTables : __CODEGEN_BITFIELD( 1,  6)    ; ///< Sub-structure
++                uint32_t                 SkinScoreOutputControlBitsMemoryCompressionEnable : __CODEGEN_BITFIELD( 7,  7)    ; ///< Sub-structure
++                uint32_t                 SkinScoreOutputControlBitsMemoryCompressionMode  : __CODEGEN_BITFIELD( 8,  8)    ; ///< Sub-structure
++                uint32_t                 SkinScoreOutputControlBitsTiledResourceModeForOutputFrameSurfaceBaseAddress : __CODEGEN_BITFIELD( 9, 10)    ; ///< Sub-structure
++                uint32_t                 Reserved715                                      : __CODEGEN_BITFIELD(11, 11)    ; ///< U1
++                uint32_t                 SkinScoreOutputAddress                           : __CODEGEN_BITFIELD(12, 31)    ; ///< GraphicsAddress
++            };
++            uint32_t                     Value;
++        } DW22;
++        union
++        {
++            struct
++            {
++                /// uint32_t 23
++                uint32_t                 SkinScoreOutputAddressHigh                       : __CODEGEN_BITFIELD( 0, 15)    ; ///< GraphicsAddress
++                uint32_t                 Reserved752                                      : __CODEGEN_BITFIELD(16, 29)    ; ///< U14
++                uint32_t                 SkinScoreOutputSurfaceArbitrationPriorityControl : __CODEGEN_BITFIELD(30, 31)    ; ///< U2
++            };
++            uint32_t                     Value;
++        } DW23;
++
++        //! \name Local enumerations
++
++        enum SUBOPB
++        {
++            SUBOPB_VEBDIIECP                                                 = 3, ///<
++        };
++        enum SUBOPA
++        {
++            SUBOPA_VEBDIIECP                                                 = 0, ///<
++        };
++        enum OPCODE
++        {
++            OPCODE_VEBOX                                                     = 4, ///<
++        };
++        enum PIPELINE
++        {
++            PIPELINE_MEDIA                                                   = 2, ///<
++        };
++        enum COMMAND_TYPE
++        {
++            COMMAND_TYPE_PARALLELVIDEOPIPE                                   = 3, ///<
++        };
++        enum CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY  = 0, ///<
++            STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY   = 3, ///<
++        };
++        enum STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY  = 3, ///<
++        };
++        enum DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL
++        {
++            SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY = 0, ///<
++            SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_SECONDHIGHESTPRIORITY = 1, ///<
++            SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_THIRDHIGHESTPRIORITY = 2, ///<
++            SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_LOWESTPRIORITY = 3, ///<
++        };
++        enum PATCH_CONSTANTS
++        {
++            CURRENTFRAMEINPUTADDRESS_BYTEOFFSET                              = 8, ///<
++            CURRENTFRAMEINPUTADDRESS_INDEX                                   = 2, ///<
++            CURRENTFRAMEINPUTADDRESSHIGH_BYTEOFFSET                          = 12, ///<
++            CURRENTFRAMEINPUTADDRESSHIGH_INDEX                               = 3, ///<
++            PREVIOUSFRAMEINPUTADDRESS_BYTEOFFSET                             = 16, ///<
++            PREVIOUSFRAMEINPUTADDRESS_INDEX                                  = 4, ///<
++            PREVIOUSFRAMEINPUTADDRESSHIGH_BYTEOFFSET                         = 20, ///<
++            PREVIOUSFRAMEINPUTADDRESSHIGH_INDEX                              = 5, ///<
++            STMMINPUTADDRESS_BYTEOFFSET                                      = 24, ///<
++            STMMINPUTADDRESS_INDEX                                           = 6, ///<
++            STMMINPUTADDRESSHIGH_BYTEOFFSET                                  = 28, ///<
++            STMMINPUTADDRESSHIGH_INDEX                                       = 7, ///<
++            STMMOUTPUTADDRESS_BYTEOFFSET                                     = 32, ///<
++            STMMOUTPUTADDRESS_INDEX                                          = 8, ///<
++            STMMOUTPUTADDRESSHIGH_BYTEOFFSET                                 = 36, ///<
++            STMMOUTPUTADDRESSHIGH_INDEX                                      = 9, ///<
++            DENOISEDCURRENTFRAMEOUTPUTADDRESS_BYTEOFFSET                     = 40, ///<
++            DENOISEDCURRENTFRAMEOUTPUTADDRESS_INDEX                          = 10, ///<
++            DENOISEDCURRENTFRAMEOUTPUTADDRESSHIGH_BYTEOFFSET                 = 44, ///<
++            DENOISEDCURRENTFRAMEOUTPUTADDRESSHIGH_INDEX                      = 11, ///<
++            CURRENTFRAMEOUTPUTADDRESS_BYTEOFFSET                             = 48, ///<
++            CURRENTFRAMEOUTPUTADDRESS_INDEX                                  = 12, ///<
++            CURRENTFRAMEOUTPUTADDRESSHIGH_BYTEOFFSET                         = 52, ///<
++            CURRENTFRAMEOUTPUTADDRESSHIGH_INDEX                              = 13, ///<
++            PREVIOUSFRAMEOUTPUTADDRESS_BYTEOFFSET                            = 56, ///<
++            PREVIOUSFRAMEOUTPUTADDRESS_INDEX                                 = 14, ///<
++            PREVIOUSFRAMEOUTPUTADDRESSHIGH_BYTEOFFSET                        = 60, ///<
++            PREVIOUSFRAMEOUTPUTADDRESSHIGH_INDEX                             = 15, ///<
++            STATISTICSOUTPUTADDRESS_BYTEOFFSET                               = 64, ///<
++            STATISTICSOUTPUTADDRESS_INDEX                                    = 16, ///<
++            STATISTICSOUTPUTADDRESSHIGH_BYTEOFFSET                           = 68, ///<
++            STATISTICSOUTPUTADDRESSHIGH_INDEX                                = 17, ///<
++            ALPHAVIGNETTECORRECTIONADDRESS_BYTEOFFSET                        = 72, ///<
++            ALPHAVIGNETTECORRECTIONADDRESS_INDEX                             = 18, ///<
++            ALPHAVIGNETTECORRECTIONADDRESSHIGH_BYTEOFFSET                    = 76, ///<
++            ALPHAVIGNETTECORRECTIONADDRESSHIGH_INDEX                         = 19, ///<
++            LACEACERGBHISTOGRAMOUTPUTADDRESS_BYTEOFFSET                      = 80, ///<
++            LACEACERGBHISTOGRAMOUTPUTADDRESS_INDEX                           = 20, ///<
++            LACEACERGBHISTOGRAMOUTPUTADDRESSHIGH_BYTEOFFSET                  = 84, ///<
++            LACEACERGBHISTOGRAMOUTPUTADDRESSHIGH_INDEX                       = 21, ///<
++            SKINSCOREOUTPUTADDRESS_BYTEOFFSET                                = 88, ///<
++            SKINSCOREOUTPUTADDRESS_INDEX                                     = 22, ///<
++            SKINSCOREOUTPUTADDRESSHIGH_BYTEOFFSET                            = 92, ///<
++            SKINSCOREOUTPUTADDRESSHIGH_INDEX                                 = 23, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API  VEB_DI_IECP_CMD() {
++            DW0.Value = 0;
++            DW0.DwordLength = __CODEGEN_OP_LENGTH(DW_SIZE);
++            DW0.Subopb = SUBOPB_VEBDIIECP;
++            DW0.Subopa = SUBOPA_VEBDIIECP;
++            DW0.Opcode = OPCODE_VEBOX;
++            DW0.Pipeline = PIPELINE_MEDIA;
++            DW0.CommandType = COMMAND_TYPE_PARALLELVIDEOPIPE;
++
++            DW1.Value = 0;
++
++            DW2.Value = 0;
++
++            DW3.Value = 0;
++            DW3.CurrentFrameInputSurfaceArbitrationPriorityControl = CURRENT_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW4.Value = 0;
++
++            DW5.Value = 0;
++            DW5.PreviousFrameInputSurfaceArbitrationPriorityControl = PREVIOUS_FRAME_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW6.Value = 0;
++
++            DW7.Value = 0;
++            DW7.StmmInputSurfaceArbitrationPriorityControl = STMM_INPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW8.Value = 0;
++
++            DW9.Value = 0;
++            DW9.StmmOutputSurfaceArbitrationPriorityControl = STMM_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW10.Value = 0;
++
++            DW11.Value = 0;
++            DW11.DenoisedCurrentOutputSurfaceArbitrationPriorityControl = DENOISED_CURRENT_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW12.Value = 0;
++
++            DW13.Value = 0;
++            DW13.CurrentFrameOutputSurfaceArbitrationPriorityControl = CURRENT_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW14.Value = 0;
++
++            DW15.Value = 0;
++            DW15.PreviousFrameOutputSurfaceArbitrationPriorityControl = PREVIOUS_FRAME_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW16.Value = 0;
++
++            DW17.Value = 0;
++            DW17.StatisticsOutputSurfaceArbitrationPriorityControl = STATISTICS_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW18.Value = 0;
++
++            DW19.Value = 0;
++            DW19.AlphaVignetteCorrectionSurfaceArbitrationPriorityControl = ALPHAVIGNETTE_CORRECTION_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW20.Value = 0;
++
++            DW21.Value = 0;
++            DW21.LaceAceRgbHistogramSurfaceArbitrationPriorityControl = LACEACERGB_HISTOGRAM_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++
++            DW22.Value = 0;
++
++            DW23.Value = 0;
++            DW23.SkinScoreOutputSurfaceArbitrationPriorityControl = SKIN_SCORE_OUTPUT_SURFACE_ARBITRATION_PRIORITY_CONTROL_HIGHESTPRIORITY;
++        };
++
++        static const size_t DW_SIZE = 24;
++        static const size_t BYTE_SIZE = 96;
++    };
++
++    //!
++    //! \brief Gamut_Expansion_Gamma_Correction
++    //! \details
++    //!     The default values follow the pattern suggested by incomplete table
++    //!     below. 
++    //!
++    struct Gamut_Expansion_Gamma_Correction_CMD
++    {
++        union
++        {
++            struct
++            {
++                /// uint32_t 0
++                uint32_t                 InverseGChGammaCorrectedValue0                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue0                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW0;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1
++                uint32_t                 InversePixelValue0                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue0                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1;
++        union
++        {
++            struct
++            {
++                /// uint32_t 2
++                uint32_t                 ForwardGChGammaCorrectedValue0                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue0                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW2;
++        union
++        {
++            struct
++            {
++                /// uint32_t 3
++                uint32_t                 ForwardPixelValue0                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue0                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW3;
++        union
++        {
++            struct
++            {
++                /// uint32_t 4
++                uint32_t                 InverseGChGammaCorrectedValue1                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue1                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW4;
++        union
++        {
++            struct
++            {
++                /// uint32_t 5
++                uint32_t                 InversePixelValue1                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue1                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW5;
++        union
++        {
++            struct
++            {
++                /// uint32_t 6
++                uint32_t                 ForwardGChGammaCorrectedValue1                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue1                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW6;
++        union
++        {
++            struct
++            {
++                /// uint32_t 7
++                uint32_t                 ForwardPixelValue1                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue1                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW7;
++        union
++        {
++            struct
++            {
++                /// uint32_t 8
++                uint32_t                 InverseGChGammaCorrectedValue2                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue2                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW8;
++        union
++        {
++            struct
++            {
++                /// uint32_t 9
++                uint32_t                 InversePixelValue2                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue2                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW9;
++        union
++        {
++            struct
++            {
++                /// uint32_t 10
++                uint32_t                 ForwardGChGammaCorrectedValue2                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue2                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW10;
++        union
++        {
++            struct
++            {
++                /// uint32_t 11
++                uint32_t                 ForwardPixelValue2                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue2                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW11;
++        union
++        {
++            struct
++            {
++                /// uint32_t 12
++                uint32_t                 InverseGChGammaCorrectedValue3                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue3                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW12;
++        union
++        {
++            struct
++            {
++                /// uint32_t 13
++                uint32_t                 InversePixelValue3                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue3                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW13;
++        union
++        {
++            struct
++            {
++                /// uint32_t 14
++                uint32_t                 ForwardGChGammaCorrectedValue3                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue3                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW14;
++        union
++        {
++            struct
++            {
++                /// uint32_t 15
++                uint32_t                 ForwardPixelValue3                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue3                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW15;
++        union
++        {
++            struct
++            {
++                /// uint32_t 16
++                uint32_t                 InverseGChGammaCorrectedValue4                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue4                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW16;
++        union
++        {
++            struct
++            {
++                /// uint32_t 17
++                uint32_t                 InversePixelValue4                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue4                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW17;
++        union
++        {
++            struct
++            {
++                /// uint32_t 18
++                uint32_t                 ForwardGChGammaCorrectedValue4                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue4                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW18;
++        union
++        {
++            struct
++            {
++                /// uint32_t 19
++                uint32_t                 ForwardPixelValue4                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue4                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW19;
++        union
++        {
++            struct
++            {
++                /// uint32_t 20
++                uint32_t                 InverseGChGammaCorrectedValue5                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue5                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW20;
++        union
++        {
++            struct
++            {
++                /// uint32_t 21
++                uint32_t                 InversePixelValue5                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue5                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW21;
++        union
++        {
++            struct
++            {
++                /// uint32_t 22
++                uint32_t                 ForwardGChGammaCorrectedValue5                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue5                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW22;
++        union
++        {
++            struct
++            {
++                /// uint32_t 23
++                uint32_t                 ForwardPixelValue5                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue5                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW23;
++        union
++        {
++            struct
++            {
++                /// uint32_t 24
++                uint32_t                 InverseGChGammaCorrectedValue6                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue6                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW24;
++        union
++        {
++            struct
++            {
++                /// uint32_t 25
++                uint32_t                 InversePixelValue6                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue6                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW25;
++        union
++        {
++            struct
++            {
++                /// uint32_t 26
++                uint32_t                 ForwardGChGammaCorrectedValue6                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue6                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW26;
++        union
++        {
++            struct
++            {
++                /// uint32_t 27
++                uint32_t                 ForwardPixelValue6                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue6                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW27;
++        union
++        {
++            struct
++            {
++                /// uint32_t 28
++                uint32_t                 InverseGChGammaCorrectedValue7                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue7                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW28;
++        union
++        {
++            struct
++            {
++                /// uint32_t 29
++                uint32_t                 InversePixelValue7                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue7                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW29;
++        union
++        {
++            struct
++            {
++                /// uint32_t 30
++                uint32_t                 ForwardGChGammaCorrectedValue7                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue7                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW30;
++        union
++        {
++            struct
++            {
++                /// uint32_t 31
++                uint32_t                 ForwardPixelValue7                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue7                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW31;
++        union
++        {
++            struct
++            {
++                /// uint32_t 32
++                uint32_t                 InverseGChGammaCorrectedValue8                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue8                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW32;
++        union
++        {
++            struct
++            {
++                /// uint32_t 33
++                uint32_t                 InversePixelValue8                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue8                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW33;
++        union
++        {
++            struct
++            {
++                /// uint32_t 34
++                uint32_t                 ForwardGChGammaCorrectedValue8                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue8                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW34;
++        union
++        {
++            struct
++            {
++                /// uint32_t 35
++                uint32_t                 ForwardPixelValue8                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue8                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW35;
++        union
++        {
++            struct
++            {
++                /// uint32_t 36
++                uint32_t                 InverseGChGammaCorrectedValue9                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue9                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW36;
++        union
++        {
++            struct
++            {
++                /// uint32_t 37
++                uint32_t                 InversePixelValue9                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue9                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW37;
++        union
++        {
++            struct
++            {
++                /// uint32_t 38
++                uint32_t                 ForwardGChGammaCorrectedValue9                   : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue9                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW38;
++        union
++        {
++            struct
++            {
++                /// uint32_t 39
++                uint32_t                 ForwardPixelValue9                               : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue9                   : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW39;
++        union
++        {
++            struct
++            {
++                /// uint32_t 40
++                uint32_t                 InverseGChGammaCorrectedValue10                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue10                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW40;
++        union
++        {
++            struct
++            {
++                /// uint32_t 41
++                uint32_t                 InversePixelValue10                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue10                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW41;
++        union
++        {
++            struct
++            {
++                /// uint32_t 42
++                uint32_t                 ForwardGChGammaCorrectedValue10                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue10                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW42;
++        union
++        {
++            struct
++            {
++                /// uint32_t 43
++                uint32_t                 ForwardPixelValue10                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue10                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW43;
++        union
++        {
++            struct
++            {
++                /// uint32_t 44
++                uint32_t                 InverseGChGammaCorrectedValue11                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue11                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW44;
++        union
++        {
++            struct
++            {
++                /// uint32_t 45
++                uint32_t                 InversePixelValue11                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue11                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW45;
++        union
++        {
++            struct
++            {
++                /// uint32_t 46
++                uint32_t                 ForwardGChGammaCorrectedValue11                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue11                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW46;
++        union
++        {
++            struct
++            {
++                /// uint32_t 47
++                uint32_t                 ForwardPixelValue11                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue11                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW47;
++        union
++        {
++            struct
++            {
++                /// uint32_t 48
++                uint32_t                 InverseGChGammaCorrectedValue12                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue12                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW48;
++        union
++        {
++            struct
++            {
++                /// uint32_t 49
++                uint32_t                 InversePixelValue12                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue12                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW49;
++        union
++        {
++            struct
++            {
++                /// uint32_t 50
++                uint32_t                 ForwardGChGammaCorrectedValue12                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue12                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW50;
++        union
++        {
++            struct
++            {
++                /// uint32_t 51
++                uint32_t                 ForwardPixelValue12                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue12                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW51;
++        union
++        {
++            struct
++            {
++                /// uint32_t 52
++                uint32_t                 InverseGChGammaCorrectedValue13                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue13                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW52;
++        union
++        {
++            struct
++            {
++                /// uint32_t 53
++                uint32_t                 InversePixelValue13                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue13                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW53;
++        union
++        {
++            struct
++            {
++                /// uint32_t 54
++                uint32_t                 ForwardGChGammaCorrectedValue13                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue13                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW54;
++        union
++        {
++            struct
++            {
++                /// uint32_t 55
++                uint32_t                 ForwardPixelValue13                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue13                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW55;
++        union
++        {
++            struct
++            {
++                /// uint32_t 56
++                uint32_t                 InverseGChGammaCorrectedValue14                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue14                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW56;
++        union
++        {
++            struct
++            {
++                /// uint32_t 57
++                uint32_t                 InversePixelValue14                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue14                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW57;
++        union
++        {
++            struct
++            {
++                /// uint32_t 58
++                uint32_t                 ForwardGChGammaCorrectedValue14                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue14                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW58;
++        union
++        {
++            struct
++            {
++                /// uint32_t 59
++                uint32_t                 ForwardPixelValue14                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue14                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW59;
++        union
++        {
++            struct
++            {
++                /// uint32_t 60
++                uint32_t                 InverseGChGammaCorrectedValue15                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue15                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW60;
++        union
++        {
++            struct
++            {
++                /// uint32_t 61
++                uint32_t                 InversePixelValue15                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue15                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW61;
++        union
++        {
++            struct
++            {
++                /// uint32_t 62
++                uint32_t                 ForwardGChGammaCorrectedValue15                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue15                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW62;
++        union
++        {
++            struct
++            {
++                /// uint32_t 63
++                uint32_t                 ForwardPixelValue15                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue15                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW63;
++        union
++        {
++            struct
++            {
++                /// uint32_t 64
++                uint32_t                 InverseGChGammaCorrectedValue16                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue16                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW64;
++        union
++        {
++            struct
++            {
++                /// uint32_t 65
++                uint32_t                 InversePixelValue16                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue16                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW65;
++        union
++        {
++            struct
++            {
++                /// uint32_t 66
++                uint32_t                 ForwardGChGammaCorrectedValue16                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue16                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW66;
++        union
++        {
++            struct
++            {
++                /// uint32_t 67
++                uint32_t                 ForwardPixelValue16                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue16                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW67;
++        union
++        {
++            struct
++            {
++                /// uint32_t 68
++                uint32_t                 InverseGChGammaCorrectedValue17                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue17                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW68;
++        union
++        {
++            struct
++            {
++                /// uint32_t 69
++                uint32_t                 InversePixelValue17                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue17                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW69;
++        union
++        {
++            struct
++            {
++                /// uint32_t 70
++                uint32_t                 ForwardGChGammaCorrectedValue17                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue17                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW70;
++        union
++        {
++            struct
++            {
++                /// uint32_t 71
++                uint32_t                 ForwardPixelValue17                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue17                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW71;
++        union
++        {
++            struct
++            {
++                /// uint32_t 72
++                uint32_t                 InverseGChGammaCorrectedValue18                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue18                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW72;
++        union
++        {
++            struct
++            {
++                /// uint32_t 73
++                uint32_t                 InversePixelValue18                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue18                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW73;
++        union
++        {
++            struct
++            {
++                /// uint32_t 74
++                uint32_t                 ForwardGChGammaCorrectedValue18                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue18                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW74;
++        union
++        {
++            struct
++            {
++                /// uint32_t 75
++                uint32_t                 ForwardPixelValue18                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue18                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW75;
++        union
++        {
++            struct
++            {
++                /// uint32_t 76
++                uint32_t                 InverseGChGammaCorrectedValue19                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue19                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW76;
++        union
++        {
++            struct
++            {
++                /// uint32_t 77
++                uint32_t                 InversePixelValue19                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue19                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW77;
++        union
++        {
++            struct
++            {
++                /// uint32_t 78
++                uint32_t                 ForwardGChGammaCorrectedValue19                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue19                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW78;
++        union
++        {
++            struct
++            {
++                /// uint32_t 79
++                uint32_t                 ForwardPixelValue19                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue19                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW79;
++        union
++        {
++            struct
++            {
++                /// uint32_t 80
++                uint32_t                 InverseGChGammaCorrectedValue20                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue20                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW80;
++        union
++        {
++            struct
++            {
++                /// uint32_t 81
++                uint32_t                 InversePixelValue20                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue20                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW81;
++        union
++        {
++            struct
++            {
++                /// uint32_t 82
++                uint32_t                 ForwardGChGammaCorrectedValue20                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue20                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW82;
++        union
++        {
++            struct
++            {
++                /// uint32_t 83
++                uint32_t                 ForwardPixelValue20                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue20                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW83;
++        union
++        {
++            struct
++            {
++                /// uint32_t 84
++                uint32_t                 InverseGChGammaCorrectedValue21                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue21                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW84;
++        union
++        {
++            struct
++            {
++                /// uint32_t 85
++                uint32_t                 InversePixelValue21                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue21                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW85;
++        union
++        {
++            struct
++            {
++                /// uint32_t 86
++                uint32_t                 ForwardGChGammaCorrectedValue21                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue21                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW86;
++        union
++        {
++            struct
++            {
++                /// uint32_t 87
++                uint32_t                 ForwardPixelValue21                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue21                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW87;
++        union
++        {
++            struct
++            {
++                /// uint32_t 88
++                uint32_t                 InverseGChGammaCorrectedValue22                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue22                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW88;
++        union
++        {
++            struct
++            {
++                /// uint32_t 89
++                uint32_t                 InversePixelValue22                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue22                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW89;
++        union
++        {
++            struct
++            {
++                /// uint32_t 90
++                uint32_t                 ForwardGChGammaCorrectedValue22                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue22                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW90;
++        union
++        {
++            struct
++            {
++                /// uint32_t 91
++                uint32_t                 ForwardPixelValue22                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue22                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW91;
++        union
++        {
++            struct
++            {
++                /// uint32_t 92
++                uint32_t                 InverseGChGammaCorrectedValue23                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue23                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW92;
++        union
++        {
++            struct
++            {
++                /// uint32_t 93
++                uint32_t                 InversePixelValue23                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue23                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW93;
++        union
++        {
++            struct
++            {
++                /// uint32_t 94
++                uint32_t                 ForwardGChGammaCorrectedValue23                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue23                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW94;
++        union
++        {
++            struct
++            {
++                /// uint32_t 95
++                uint32_t                 ForwardPixelValue23                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue23                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW95;
++        union
++        {
++            struct
++            {
++                /// uint32_t 96
++                uint32_t                 InverseGChGammaCorrectedValue24                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue24                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW96;
++        union
++        {
++            struct
++            {
++                /// uint32_t 97
++                uint32_t                 InversePixelValue24                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue24                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW97;
++        union
++        {
++            struct
++            {
++                /// uint32_t 98
++                uint32_t                 ForwardGChGammaCorrectedValue24                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue24                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW98;
++        union
++        {
++            struct
++            {
++                /// uint32_t 99
++                uint32_t                 ForwardPixelValue24                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue24                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW99;
++        union
++        {
++            struct
++            {
++                /// uint32_t 100
++                uint32_t                 InverseGChGammaCorrectedValue25                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue25                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW100;
++        union
++        {
++            struct
++            {
++                /// uint32_t 101
++                uint32_t                 InversePixelValue25                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue25                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW101;
++        union
++        {
++            struct
++            {
++                /// uint32_t 102
++                uint32_t                 ForwardGChGammaCorrectedValue25                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue25                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW102;
++        union
++        {
++            struct
++            {
++                /// uint32_t 103
++                uint32_t                 ForwardPixelValue25                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue25                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW103;
++        union
++        {
++            struct
++            {
++                /// uint32_t 104
++                uint32_t                 InverseGChGammaCorrectedValue26                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue26                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW104;
++        union
++        {
++            struct
++            {
++                /// uint32_t 105
++                uint32_t                 InversePixelValue26                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue26                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW105;
++        union
++        {
++            struct
++            {
++                /// uint32_t 106
++                uint32_t                 ForwardGChGammaCorrectedValue26                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue26                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW106;
++        union
++        {
++            struct
++            {
++                /// uint32_t 107
++                uint32_t                 ForwardPixelValue26                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue26                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW107;
++        union
++        {
++            struct
++            {
++                /// uint32_t 108
++                uint32_t                 InverseGChGammaCorrectedValue27                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue27                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW108;
++        union
++        {
++            struct
++            {
++                /// uint32_t 109
++                uint32_t                 InversePixelValue27                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue27                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW109;
++        union
++        {
++            struct
++            {
++                /// uint32_t 110
++                uint32_t                 ForwardGChGammaCorrectedValue27                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue27                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW110;
++        union
++        {
++            struct
++            {
++                /// uint32_t 111
++                uint32_t                 ForwardPixelValue27                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue27                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW111;
++        union
++        {
++            struct
++            {
++                /// uint32_t 112
++                uint32_t                 InverseGChGammaCorrectedValue28                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue28                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW112;
++        union
++        {
++            struct
++            {
++                /// uint32_t 113
++                uint32_t                 InversePixelValue28                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue28                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW113;
++        union
++        {
++            struct
++            {
++                /// uint32_t 114
++                uint32_t                 ForwardGChGammaCorrectedValue28                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue28                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW114;
++        union
++        {
++            struct
++            {
++                /// uint32_t 115
++                uint32_t                 ForwardPixelValue28                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue28                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW115;
++        union
++        {
++            struct
++            {
++                /// uint32_t 116
++                uint32_t                 InverseGChGammaCorrectedValue29                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue29                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW116;
++        union
++        {
++            struct
++            {
++                /// uint32_t 117
++                uint32_t                 InversePixelValue29                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue29                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW117;
++        union
++        {
++            struct
++            {
++                /// uint32_t 118
++                uint32_t                 ForwardGChGammaCorrectedValue29                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue29                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW118;
++        union
++        {
++            struct
++            {
++                /// uint32_t 119
++                uint32_t                 ForwardPixelValue29                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue29                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW119;
++        union
++        {
++            struct
++            {
++                /// uint32_t 120
++                uint32_t                 InverseGChGammaCorrectedValue30                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue30                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW120;
++        union
++        {
++            struct
++            {
++                /// uint32_t 121
++                uint32_t                 InversePixelValue30                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue30                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW121;
++        union
++        {
++            struct
++            {
++                /// uint32_t 122
++                uint32_t                 ForwardGChGammaCorrectedValue30                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue30                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW122;
++        union
++        {
++            struct
++            {
++                /// uint32_t 123
++                uint32_t                 ForwardPixelValue30                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue30                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW123;
++        union
++        {
++            struct
++            {
++                /// uint32_t 124
++                uint32_t                 InverseGChGammaCorrectedValue31                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue31                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW124;
++        union
++        {
++            struct
++            {
++                /// uint32_t 125
++                uint32_t                 InversePixelValue31                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue31                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW125;
++        union
++        {
++            struct
++            {
++                /// uint32_t 126
++                uint32_t                 ForwardGChGammaCorrectedValue31                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue31                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW126;
++        union
++        {
++            struct
++            {
++                /// uint32_t 127
++                uint32_t                 ForwardPixelValue31                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue31                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW127;
++        union
++        {
++            struct
++            {
++                /// uint32_t 128
++                uint32_t                 InverseGChGammaCorrectedValue32                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue32                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW128;
++        union
++        {
++            struct
++            {
++                /// uint32_t 129
++                uint32_t                 InversePixelValue32                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue32                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW129;
++        union
++        {
++            struct
++            {
++                /// uint32_t 130
++                uint32_t                 ForwardGChGammaCorrectedValue32                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue32                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW130;
++        union
++        {
++            struct
++            {
++                /// uint32_t 131
++                uint32_t                 ForwardPixelValue32                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue32                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW131;
++        union
++        {
++            struct
++            {
++                /// uint32_t 132
++                uint32_t                 InverseGChGammaCorrectedValue33                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue33                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW132;
++        union
++        {
++            struct
++            {
++                /// uint32_t 133
++                uint32_t                 InversePixelValue33                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue33                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW133;
++        union
++        {
++            struct
++            {
++                /// uint32_t 134
++                uint32_t                 ForwardGChGammaCorrectedValue33                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue33                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW134;
++        union
++        {
++            struct
++            {
++                /// uint32_t 135
++                uint32_t                 ForwardPixelValue33                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue33                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW135;
++        union
++        {
++            struct
++            {
++                /// uint32_t 136
++                uint32_t                 InverseGChGammaCorrectedValue34                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue34                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW136;
++        union
++        {
++            struct
++            {
++                /// uint32_t 137
++                uint32_t                 InversePixelValue34                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue34                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW137;
++        union
++        {
++            struct
++            {
++                /// uint32_t 138
++                uint32_t                 ForwardGChGammaCorrectedValue34                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue34                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW138;
++        union
++        {
++            struct
++            {
++                /// uint32_t 139
++                uint32_t                 ForwardPixelValue34                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue34                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW139;
++        union
++        {
++            struct
++            {
++                /// uint32_t 140
++                uint32_t                 InverseGChGammaCorrectedValue35                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue35                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW140;
++        union
++        {
++            struct
++            {
++                /// uint32_t 141
++                uint32_t                 InversePixelValue35                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue35                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW141;
++        union
++        {
++            struct
++            {
++                /// uint32_t 142
++                uint32_t                 ForwardGChGammaCorrectedValue35                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue35                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW142;
++        union
++        {
++            struct
++            {
++                /// uint32_t 143
++                uint32_t                 ForwardPixelValue35                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue35                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW143;
++        union
++        {
++            struct
++            {
++                /// uint32_t 144
++                uint32_t                 InverseGChGammaCorrectedValue36                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue36                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW144;
++        union
++        {
++            struct
++            {
++                /// uint32_t 145
++                uint32_t                 InversePixelValue36                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue36                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW145;
++        union
++        {
++            struct
++            {
++                /// uint32_t 146
++                uint32_t                 ForwardGChGammaCorrectedValue36                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue36                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW146;
++        union
++        {
++            struct
++            {
++                /// uint32_t 147
++                uint32_t                 ForwardPixelValue36                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue36                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW147;
++        union
++        {
++            struct
++            {
++                /// uint32_t 148
++                uint32_t                 InverseGChGammaCorrectedValue37                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue37                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW148;
++        union
++        {
++            struct
++            {
++                /// uint32_t 149
++                uint32_t                 InversePixelValue37                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue37                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW149;
++        union
++        {
++            struct
++            {
++                /// uint32_t 150
++                uint32_t                 ForwardGChGammaCorrectedValue37                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue37                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW150;
++        union
++        {
++            struct
++            {
++                /// uint32_t 151
++                uint32_t                 ForwardPixelValue37                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue37                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW151;
++        union
++        {
++            struct
++            {
++                /// uint32_t 152
++                uint32_t                 InverseGChGammaCorrectedValue38                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue38                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW152;
++        union
++        {
++            struct
++            {
++                /// uint32_t 153
++                uint32_t                 InversePixelValue38                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue38                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW153;
++        union
++        {
++            struct
++            {
++                /// uint32_t 154
++                uint32_t                 ForwardGChGammaCorrectedValue38                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue38                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW154;
++        union
++        {
++            struct
++            {
++                /// uint32_t 155
++                uint32_t                 ForwardPixelValue38                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue38                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW155;
++        union
++        {
++            struct
++            {
++                /// uint32_t 156
++                uint32_t                 InverseGChGammaCorrectedValue39                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue39                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW156;
++        union
++        {
++            struct
++            {
++                /// uint32_t 157
++                uint32_t                 InversePixelValue39                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue39                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW157;
++        union
++        {
++            struct
++            {
++                /// uint32_t 158
++                uint32_t                 ForwardGChGammaCorrectedValue39                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue39                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW158;
++        union
++        {
++            struct
++            {
++                /// uint32_t 159
++                uint32_t                 ForwardPixelValue39                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue39                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW159;
++        union
++        {
++            struct
++            {
++                /// uint32_t 160
++                uint32_t                 InverseGChGammaCorrectedValue40                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue40                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW160;
++        union
++        {
++            struct
++            {
++                /// uint32_t 161
++                uint32_t                 InversePixelValue40                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue40                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW161;
++        union
++        {
++            struct
++            {
++                /// uint32_t 162
++                uint32_t                 ForwardGChGammaCorrectedValue40                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue40                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW162;
++        union
++        {
++            struct
++            {
++                /// uint32_t 163
++                uint32_t                 ForwardPixelValue40                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue40                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW163;
++        union
++        {
++            struct
++            {
++                /// uint32_t 164
++                uint32_t                 InverseGChGammaCorrectedValue41                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue41                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW164;
++        union
++        {
++            struct
++            {
++                /// uint32_t 165
++                uint32_t                 InversePixelValue41                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue41                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW165;
++        union
++        {
++            struct
++            {
++                /// uint32_t 166
++                uint32_t                 ForwardGChGammaCorrectedValue41                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue41                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW166;
++        union
++        {
++            struct
++            {
++                /// uint32_t 167
++                uint32_t                 ForwardPixelValue41                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue41                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW167;
++        union
++        {
++            struct
++            {
++                /// uint32_t 168
++                uint32_t                 InverseGChGammaCorrectedValue42                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue42                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW168;
++        union
++        {
++            struct
++            {
++                /// uint32_t 169
++                uint32_t                 InversePixelValue42                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue42                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW169;
++        union
++        {
++            struct
++            {
++                /// uint32_t 170
++                uint32_t                 ForwardGChGammaCorrectedValue42                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue42                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW170;
++        union
++        {
++            struct
++            {
++                /// uint32_t 171
++                uint32_t                 ForwardPixelValue42                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue42                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW171;
++        union
++        {
++            struct
++            {
++                /// uint32_t 172
++                uint32_t                 InverseGChGammaCorrectedValue43                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue43                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW172;
++        union
++        {
++            struct
++            {
++                /// uint32_t 173
++                uint32_t                 InversePixelValue43                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue43                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW173;
++        union
++        {
++            struct
++            {
++                /// uint32_t 174
++                uint32_t                 ForwardGChGammaCorrectedValue43                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue43                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW174;
++        union
++        {
++            struct
++            {
++                /// uint32_t 175
++                uint32_t                 ForwardPixelValue43                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue43                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW175;
++        union
++        {
++            struct
++            {
++                /// uint32_t 176
++                uint32_t                 InverseGChGammaCorrectedValue44                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue44                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW176;
++        union
++        {
++            struct
++            {
++                /// uint32_t 177
++                uint32_t                 InversePixelValue44                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue44                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW177;
++        union
++        {
++            struct
++            {
++                /// uint32_t 178
++                uint32_t                 ForwardGChGammaCorrectedValue44                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue44                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW178;
++        union
++        {
++            struct
++            {
++                /// uint32_t 179
++                uint32_t                 ForwardPixelValue44                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue44                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW179;
++        union
++        {
++            struct
++            {
++                /// uint32_t 180
++                uint32_t                 InverseGChGammaCorrectedValue45                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue45                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW180;
++        union
++        {
++            struct
++            {
++                /// uint32_t 181
++                uint32_t                 InversePixelValue45                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue45                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW181;
++        union
++        {
++            struct
++            {
++                /// uint32_t 182
++                uint32_t                 ForwardGChGammaCorrectedValue45                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue45                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW182;
++        union
++        {
++            struct
++            {
++                /// uint32_t 183
++                uint32_t                 ForwardPixelValue45                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue45                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW183;
++        union
++        {
++            struct
++            {
++                /// uint32_t 184
++                uint32_t                 InverseGChGammaCorrectedValue46                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue46                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW184;
++        union
++        {
++            struct
++            {
++                /// uint32_t 185
++                uint32_t                 InversePixelValue46                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue46                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW185;
++        union
++        {
++            struct
++            {
++                /// uint32_t 186
++                uint32_t                 ForwardGChGammaCorrectedValue46                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue46                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW186;
++        union
++        {
++            struct
++            {
++                /// uint32_t 187
++                uint32_t                 ForwardPixelValue46                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue46                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW187;
++        union
++        {
++            struct
++            {
++                /// uint32_t 188
++                uint32_t                 InverseGChGammaCorrectedValue47                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue47                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW188;
++        union
++        {
++            struct
++            {
++                /// uint32_t 189
++                uint32_t                 InversePixelValue47                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue47                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW189;
++        union
++        {
++            struct
++            {
++                /// uint32_t 190
++                uint32_t                 ForwardGChGammaCorrectedValue47                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue47                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW190;
++        union
++        {
++            struct
++            {
++                /// uint32_t 191
++                uint32_t                 ForwardPixelValue47                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue47                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW191;
++        union
++        {
++            struct
++            {
++                /// uint32_t 192
++                uint32_t                 InverseGChGammaCorrectedValue48                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue48                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW192;
++        union
++        {
++            struct
++            {
++                /// uint32_t 193
++                uint32_t                 InversePixelValue48                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue48                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW193;
++        union
++        {
++            struct
++            {
++                /// uint32_t 194
++                uint32_t                 ForwardGChGammaCorrectedValue48                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue48                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW194;
++        union
++        {
++            struct
++            {
++                /// uint32_t 195
++                uint32_t                 ForwardPixelValue48                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue48                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW195;
++        union
++        {
++            struct
++            {
++                /// uint32_t 196
++                uint32_t                 InverseGChGammaCorrectedValue49                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue49                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW196;
++        union
++        {
++            struct
++            {
++                /// uint32_t 197
++                uint32_t                 InversePixelValue49                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue49                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW197;
++        union
++        {
++            struct
++            {
++                /// uint32_t 198
++                uint32_t                 ForwardGChGammaCorrectedValue49                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue49                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW198;
++        union
++        {
++            struct
++            {
++                /// uint32_t 199
++                uint32_t                 ForwardPixelValue49                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue49                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW199;
++        union
++        {
++            struct
++            {
++                /// uint32_t 200
++                uint32_t                 InverseGChGammaCorrectedValue50                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue50                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW200;
++        union
++        {
++            struct
++            {
++                /// uint32_t 201
++                uint32_t                 InversePixelValue50                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue50                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW201;
++        union
++        {
++            struct
++            {
++                /// uint32_t 202
++                uint32_t                 ForwardGChGammaCorrectedValue50                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue50                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW202;
++        union
++        {
++            struct
++            {
++                /// uint32_t 203
++                uint32_t                 ForwardPixelValue50                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue50                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW203;
++        union
++        {
++            struct
++            {
++                /// uint32_t 204
++                uint32_t                 InverseGChGammaCorrectedValue51                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue51                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW204;
++        union
++        {
++            struct
++            {
++                /// uint32_t 205
++                uint32_t                 InversePixelValue51                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue51                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW205;
++        union
++        {
++            struct
++            {
++                /// uint32_t 206
++                uint32_t                 ForwardGChGammaCorrectedValue51                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue51                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW206;
++        union
++        {
++            struct
++            {
++                /// uint32_t 207
++                uint32_t                 ForwardPixelValue51                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue51                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW207;
++        union
++        {
++            struct
++            {
++                /// uint32_t 208
++                uint32_t                 InverseGChGammaCorrectedValue52                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue52                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW208;
++        union
++        {
++            struct
++            {
++                /// uint32_t 209
++                uint32_t                 InversePixelValue52                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue52                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW209;
++        union
++        {
++            struct
++            {
++                /// uint32_t 210
++                uint32_t                 ForwardGChGammaCorrectedValue52                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue52                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW210;
++        union
++        {
++            struct
++            {
++                /// uint32_t 211
++                uint32_t                 ForwardPixelValue52                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue52                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW211;
++        union
++        {
++            struct
++            {
++                /// uint32_t 212
++                uint32_t                 InverseGChGammaCorrectedValue53                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue53                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW212;
++        union
++        {
++            struct
++            {
++                /// uint32_t 213
++                uint32_t                 InversePixelValue53                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue53                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW213;
++        union
++        {
++            struct
++            {
++                /// uint32_t 214
++                uint32_t                 ForwardGChGammaCorrectedValue53                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue53                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW214;
++        union
++        {
++            struct
++            {
++                /// uint32_t 215
++                uint32_t                 ForwardPixelValue53                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue53                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW215;
++        union
++        {
++            struct
++            {
++                /// uint32_t 216
++                uint32_t                 InverseGChGammaCorrectedValue54                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue54                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW216;
++        union
++        {
++            struct
++            {
++                /// uint32_t 217
++                uint32_t                 InversePixelValue54                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue54                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW217;
++        union
++        {
++            struct
++            {
++                /// uint32_t 218
++                uint32_t                 ForwardGChGammaCorrectedValue54                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue54                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW218;
++        union
++        {
++            struct
++            {
++                /// uint32_t 219
++                uint32_t                 ForwardPixelValue54                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue54                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW219;
++        union
++        {
++            struct
++            {
++                /// uint32_t 220
++                uint32_t                 InverseGChGammaCorrectedValue55                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue55                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW220;
++        union
++        {
++            struct
++            {
++                /// uint32_t 221
++                uint32_t                 InversePixelValue55                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue55                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW221;
++        union
++        {
++            struct
++            {
++                /// uint32_t 222
++                uint32_t                 ForwardGChGammaCorrectedValue55                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue55                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW222;
++        union
++        {
++            struct
++            {
++                /// uint32_t 223
++                uint32_t                 ForwardPixelValue55                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue55                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW223;
++        union
++        {
++            struct
++            {
++                /// uint32_t 224
++                uint32_t                 InverseGChGammaCorrectedValue56                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue56                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW224;
++        union
++        {
++            struct
++            {
++                /// uint32_t 225
++                uint32_t                 InversePixelValue56                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue56                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW225;
++        union
++        {
++            struct
++            {
++                /// uint32_t 226
++                uint32_t                 ForwardGChGammaCorrectedValue56                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue56                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW226;
++        union
++        {
++            struct
++            {
++                /// uint32_t 227
++                uint32_t                 ForwardPixelValue56                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue56                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW227;
++        union
++        {
++            struct
++            {
++                /// uint32_t 228
++                uint32_t                 InverseGChGammaCorrectedValue57                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue57                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW228;
++        union
++        {
++            struct
++            {
++                /// uint32_t 229
++                uint32_t                 InversePixelValue57                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue57                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW229;
++        union
++        {
++            struct
++            {
++                /// uint32_t 230
++                uint32_t                 ForwardGChGammaCorrectedValue57                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue57                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW230;
++        union
++        {
++            struct
++            {
++                /// uint32_t 231
++                uint32_t                 ForwardPixelValue57                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue57                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW231;
++        union
++        {
++            struct
++            {
++                /// uint32_t 232
++                uint32_t                 InverseGChGammaCorrectedValue58                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue58                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW232;
++        union
++        {
++            struct
++            {
++                /// uint32_t 233
++                uint32_t                 InversePixelValue58                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue58                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW233;
++        union
++        {
++            struct
++            {
++                /// uint32_t 234
++                uint32_t                 ForwardGChGammaCorrectedValue58                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue58                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW234;
++        union
++        {
++            struct
++            {
++                /// uint32_t 235
++                uint32_t                 ForwardPixelValue58                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue58                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW235;
++        union
++        {
++            struct
++            {
++                /// uint32_t 236
++                uint32_t                 InverseGChGammaCorrectedValue59                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue59                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW236;
++        union
++        {
++            struct
++            {
++                /// uint32_t 237
++                uint32_t                 InversePixelValue59                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue59                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW237;
++        union
++        {
++            struct
++            {
++                /// uint32_t 238
++                uint32_t                 ForwardGChGammaCorrectedValue59                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue59                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW238;
++        union
++        {
++            struct
++            {
++                /// uint32_t 239
++                uint32_t                 ForwardPixelValue59                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue59                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW239;
++        union
++        {
++            struct
++            {
++                /// uint32_t 240
++                uint32_t                 InverseGChGammaCorrectedValue60                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue60                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW240;
++        union
++        {
++            struct
++            {
++                /// uint32_t 241
++                uint32_t                 InversePixelValue60                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue60                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW241;
++        union
++        {
++            struct
++            {
++                /// uint32_t 242
++                uint32_t                 ForwardGChGammaCorrectedValue60                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue60                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW242;
++        union
++        {
++            struct
++            {
++                /// uint32_t 243
++                uint32_t                 ForwardPixelValue60                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue60                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW243;
++        union
++        {
++            struct
++            {
++                /// uint32_t 244
++                uint32_t                 InverseGChGammaCorrectedValue61                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue61                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW244;
++        union
++        {
++            struct
++            {
++                /// uint32_t 245
++                uint32_t                 InversePixelValue61                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue61                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW245;
++        union
++        {
++            struct
++            {
++                /// uint32_t 246
++                uint32_t                 ForwardGChGammaCorrectedValue61                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue61                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW246;
++        union
++        {
++            struct
++            {
++                /// uint32_t 247
++                uint32_t                 ForwardPixelValue61                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue61                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW247;
++        union
++        {
++            struct
++            {
++                /// uint32_t 248
++                uint32_t                 InverseGChGammaCorrectedValue62                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue62                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW248;
++        union
++        {
++            struct
++            {
++                /// uint32_t 249
++                uint32_t                 InversePixelValue62                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue62                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW249;
++        union
++        {
++            struct
++            {
++                /// uint32_t 250
++                uint32_t                 ForwardGChGammaCorrectedValue62                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue62                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW250;
++        union
++        {
++            struct
++            {
++                /// uint32_t 251
++                uint32_t                 ForwardPixelValue62                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue62                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW251;
++        union
++        {
++            struct
++            {
++                /// uint32_t 252
++                uint32_t                 InverseGChGammaCorrectedValue63                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue63                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW252;
++        union
++        {
++            struct
++            {
++                /// uint32_t 253
++                uint32_t                 InversePixelValue63                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue63                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW253;
++        union
++        {
++            struct
++            {
++                /// uint32_t 254
++                uint32_t                 ForwardGChGammaCorrectedValue63                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue63                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW254;
++        union
++        {
++            struct
++            {
++                /// uint32_t 255
++                uint32_t                 ForwardPixelValue63                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue63                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW255;
++        union
++        {
++            struct
++            {
++                /// uint32_t 256
++                uint32_t                 InverseGChGammaCorrectedValue64                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue64                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW256;
++        union
++        {
++            struct
++            {
++                /// uint32_t 257
++                uint32_t                 InversePixelValue64                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue64                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW257;
++        union
++        {
++            struct
++            {
++                /// uint32_t 258
++                uint32_t                 ForwardGChGammaCorrectedValue64                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue64                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW258;
++        union
++        {
++            struct
++            {
++                /// uint32_t 259
++                uint32_t                 ForwardPixelValue64                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue64                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW259;
++        union
++        {
++            struct
++            {
++                /// uint32_t 260
++                uint32_t                 InverseGChGammaCorrectedValue65                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue65                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW260;
++        union
++        {
++            struct
++            {
++                /// uint32_t 261
++                uint32_t                 InversePixelValue65                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue65                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW261;
++        union
++        {
++            struct
++            {
++                /// uint32_t 262
++                uint32_t                 ForwardGChGammaCorrectedValue65                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue65                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW262;
++        union
++        {
++            struct
++            {
++                /// uint32_t 263
++                uint32_t                 ForwardPixelValue65                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue65                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW263;
++        union
++        {
++            struct
++            {
++                /// uint32_t 264
++                uint32_t                 InverseGChGammaCorrectedValue66                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue66                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW264;
++        union
++        {
++            struct
++            {
++                /// uint32_t 265
++                uint32_t                 InversePixelValue66                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue66                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW265;
++        union
++        {
++            struct
++            {
++                /// uint32_t 266
++                uint32_t                 ForwardGChGammaCorrectedValue66                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue66                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW266;
++        union
++        {
++            struct
++            {
++                /// uint32_t 267
++                uint32_t                 ForwardPixelValue66                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue66                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW267;
++        union
++        {
++            struct
++            {
++                /// uint32_t 268
++                uint32_t                 InverseGChGammaCorrectedValue67                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue67                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW268;
++        union
++        {
++            struct
++            {
++                /// uint32_t 269
++                uint32_t                 InversePixelValue67                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue67                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW269;
++        union
++        {
++            struct
++            {
++                /// uint32_t 270
++                uint32_t                 ForwardGChGammaCorrectedValue67                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue67                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW270;
++        union
++        {
++            struct
++            {
++                /// uint32_t 271
++                uint32_t                 ForwardPixelValue67                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue67                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW271;
++        union
++        {
++            struct
++            {
++                /// uint32_t 272
++                uint32_t                 InverseGChGammaCorrectedValue68                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue68                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW272;
++        union
++        {
++            struct
++            {
++                /// uint32_t 273
++                uint32_t                 InversePixelValue68                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue68                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW273;
++        union
++        {
++            struct
++            {
++                /// uint32_t 274
++                uint32_t                 ForwardGChGammaCorrectedValue68                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue68                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW274;
++        union
++        {
++            struct
++            {
++                /// uint32_t 275
++                uint32_t                 ForwardPixelValue68                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue68                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW275;
++        union
++        {
++            struct
++            {
++                /// uint32_t 276
++                uint32_t                 InverseGChGammaCorrectedValue69                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue69                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW276;
++        union
++        {
++            struct
++            {
++                /// uint32_t 277
++                uint32_t                 InversePixelValue69                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue69                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW277;
++        union
++        {
++            struct
++            {
++                /// uint32_t 278
++                uint32_t                 ForwardGChGammaCorrectedValue69                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue69                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW278;
++        union
++        {
++            struct
++            {
++                /// uint32_t 279
++                uint32_t                 ForwardPixelValue69                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue69                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW279;
++        union
++        {
++            struct
++            {
++                /// uint32_t 280
++                uint32_t                 InverseGChGammaCorrectedValue70                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue70                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW280;
++        union
++        {
++            struct
++            {
++                /// uint32_t 281
++                uint32_t                 InversePixelValue70                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue70                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW281;
++        union
++        {
++            struct
++            {
++                /// uint32_t 282
++                uint32_t                 ForwardGChGammaCorrectedValue70                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue70                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW282;
++        union
++        {
++            struct
++            {
++                /// uint32_t 283
++                uint32_t                 ForwardPixelValue70                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue70                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW283;
++        union
++        {
++            struct
++            {
++                /// uint32_t 284
++                uint32_t                 InverseGChGammaCorrectedValue71                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue71                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW284;
++        union
++        {
++            struct
++            {
++                /// uint32_t 285
++                uint32_t                 InversePixelValue71                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue71                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW285;
++        union
++        {
++            struct
++            {
++                /// uint32_t 286
++                uint32_t                 ForwardGChGammaCorrectedValue71                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue71                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW286;
++        union
++        {
++            struct
++            {
++                /// uint32_t 287
++                uint32_t                 ForwardPixelValue71                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue71                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW287;
++        union
++        {
++            struct
++            {
++                /// uint32_t 288
++                uint32_t                 InverseGChGammaCorrectedValue72                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue72                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW288;
++        union
++        {
++            struct
++            {
++                /// uint32_t 289
++                uint32_t                 InversePixelValue72                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue72                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW289;
++        union
++        {
++            struct
++            {
++                /// uint32_t 290
++                uint32_t                 ForwardGChGammaCorrectedValue72                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue72                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW290;
++        union
++        {
++            struct
++            {
++                /// uint32_t 291
++                uint32_t                 ForwardPixelValue72                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue72                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW291;
++        union
++        {
++            struct
++            {
++                /// uint32_t 292
++                uint32_t                 InverseGChGammaCorrectedValue73                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue73                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW292;
++        union
++        {
++            struct
++            {
++                /// uint32_t 293
++                uint32_t                 InversePixelValue73                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue73                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW293;
++        union
++        {
++            struct
++            {
++                /// uint32_t 294
++                uint32_t                 ForwardGChGammaCorrectedValue73                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue73                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW294;
++        union
++        {
++            struct
++            {
++                /// uint32_t 295
++                uint32_t                 ForwardPixelValue73                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue73                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW295;
++        union
++        {
++            struct
++            {
++                /// uint32_t 296
++                uint32_t                 InverseGChGammaCorrectedValue74                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue74                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW296;
++        union
++        {
++            struct
++            {
++                /// uint32_t 297
++                uint32_t                 InversePixelValue74                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue74                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW297;
++        union
++        {
++            struct
++            {
++                /// uint32_t 298
++                uint32_t                 ForwardGChGammaCorrectedValue74                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue74                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW298;
++        union
++        {
++            struct
++            {
++                /// uint32_t 299
++                uint32_t                 ForwardPixelValue74                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue74                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW299;
++        union
++        {
++            struct
++            {
++                /// uint32_t 300
++                uint32_t                 InverseGChGammaCorrectedValue75                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue75                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW300;
++        union
++        {
++            struct
++            {
++                /// uint32_t 301
++                uint32_t                 InversePixelValue75                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue75                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW301;
++        union
++        {
++            struct
++            {
++                /// uint32_t 302
++                uint32_t                 ForwardGChGammaCorrectedValue75                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue75                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW302;
++        union
++        {
++            struct
++            {
++                /// uint32_t 303
++                uint32_t                 ForwardPixelValue75                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue75                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW303;
++        union
++        {
++            struct
++            {
++                /// uint32_t 304
++                uint32_t                 InverseGChGammaCorrectedValue76                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue76                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW304;
++        union
++        {
++            struct
++            {
++                /// uint32_t 305
++                uint32_t                 InversePixelValue76                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue76                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW305;
++        union
++        {
++            struct
++            {
++                /// uint32_t 306
++                uint32_t                 ForwardGChGammaCorrectedValue76                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue76                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW306;
++        union
++        {
++            struct
++            {
++                /// uint32_t 307
++                uint32_t                 ForwardPixelValue76                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue76                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW307;
++        union
++        {
++            struct
++            {
++                /// uint32_t 308
++                uint32_t                 InverseGChGammaCorrectedValue77                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue77                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW308;
++        union
++        {
++            struct
++            {
++                /// uint32_t 309
++                uint32_t                 InversePixelValue77                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue77                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW309;
++        union
++        {
++            struct
++            {
++                /// uint32_t 310
++                uint32_t                 ForwardGChGammaCorrectedValue77                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue77                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW310;
++        union
++        {
++            struct
++            {
++                /// uint32_t 311
++                uint32_t                 ForwardPixelValue77                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue77                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW311;
++        union
++        {
++            struct
++            {
++                /// uint32_t 312
++                uint32_t                 InverseGChGammaCorrectedValue78                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue78                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW312;
++        union
++        {
++            struct
++            {
++                /// uint32_t 313
++                uint32_t                 InversePixelValue78                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue78                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW313;
++        union
++        {
++            struct
++            {
++                /// uint32_t 314
++                uint32_t                 ForwardGChGammaCorrectedValue78                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue78                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW314;
++        union
++        {
++            struct
++            {
++                /// uint32_t 315
++                uint32_t                 ForwardPixelValue78                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue78                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW315;
++        union
++        {
++            struct
++            {
++                /// uint32_t 316
++                uint32_t                 InverseGChGammaCorrectedValue79                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue79                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW316;
++        union
++        {
++            struct
++            {
++                /// uint32_t 317
++                uint32_t                 InversePixelValue79                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue79                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW317;
++        union
++        {
++            struct
++            {
++                /// uint32_t 318
++                uint32_t                 ForwardGChGammaCorrectedValue79                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue79                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW318;
++        union
++        {
++            struct
++            {
++                /// uint32_t 319
++                uint32_t                 ForwardPixelValue79                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue79                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW319;
++        union
++        {
++            struct
++            {
++                /// uint32_t 320
++                uint32_t                 InverseGChGammaCorrectedValue80                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue80                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW320;
++        union
++        {
++            struct
++            {
++                /// uint32_t 321
++                uint32_t                 InversePixelValue80                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue80                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW321;
++        union
++        {
++            struct
++            {
++                /// uint32_t 322
++                uint32_t                 ForwardGChGammaCorrectedValue80                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue80                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW322;
++        union
++        {
++            struct
++            {
++                /// uint32_t 323
++                uint32_t                 ForwardPixelValue80                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue80                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW323;
++        union
++        {
++            struct
++            {
++                /// uint32_t 324
++                uint32_t                 InverseGChGammaCorrectedValue81                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue81                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW324;
++        union
++        {
++            struct
++            {
++                /// uint32_t 325
++                uint32_t                 InversePixelValue81                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue81                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW325;
++        union
++        {
++            struct
++            {
++                /// uint32_t 326
++                uint32_t                 ForwardGChGammaCorrectedValue81                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue81                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW326;
++        union
++        {
++            struct
++            {
++                /// uint32_t 327
++                uint32_t                 ForwardPixelValue81                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue81                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW327;
++        union
++        {
++            struct
++            {
++                /// uint32_t 328
++                uint32_t                 InverseGChGammaCorrectedValue82                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue82                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW328;
++        union
++        {
++            struct
++            {
++                /// uint32_t 329
++                uint32_t                 InversePixelValue82                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue82                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW329;
++        union
++        {
++            struct
++            {
++                /// uint32_t 330
++                uint32_t                 ForwardGChGammaCorrectedValue82                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue82                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW330;
++        union
++        {
++            struct
++            {
++                /// uint32_t 331
++                uint32_t                 ForwardPixelValue82                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue82                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW331;
++        union
++        {
++            struct
++            {
++                /// uint32_t 332
++                uint32_t                 InverseGChGammaCorrectedValue83                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue83                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW332;
++        union
++        {
++            struct
++            {
++                /// uint32_t 333
++                uint32_t                 InversePixelValue83                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue83                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW333;
++        union
++        {
++            struct
++            {
++                /// uint32_t 334
++                uint32_t                 ForwardGChGammaCorrectedValue83                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue83                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW334;
++        union
++        {
++            struct
++            {
++                /// uint32_t 335
++                uint32_t                 ForwardPixelValue83                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue83                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW335;
++        union
++        {
++            struct
++            {
++                /// uint32_t 336
++                uint32_t                 InverseGChGammaCorrectedValue84                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue84                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW336;
++        union
++        {
++            struct
++            {
++                /// uint32_t 337
++                uint32_t                 InversePixelValue84                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue84                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW337;
++        union
++        {
++            struct
++            {
++                /// uint32_t 338
++                uint32_t                 ForwardGChGammaCorrectedValue84                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue84                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW338;
++        union
++        {
++            struct
++            {
++                /// uint32_t 339
++                uint32_t                 ForwardPixelValue84                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue84                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW339;
++        union
++        {
++            struct
++            {
++                /// uint32_t 340
++                uint32_t                 InverseGChGammaCorrectedValue85                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue85                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW340;
++        union
++        {
++            struct
++            {
++                /// uint32_t 341
++                uint32_t                 InversePixelValue85                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue85                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW341;
++        union
++        {
++            struct
++            {
++                /// uint32_t 342
++                uint32_t                 ForwardGChGammaCorrectedValue85                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue85                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW342;
++        union
++        {
++            struct
++            {
++                /// uint32_t 343
++                uint32_t                 ForwardPixelValue85                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue85                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW343;
++        union
++        {
++            struct
++            {
++                /// uint32_t 344
++                uint32_t                 InverseGChGammaCorrectedValue86                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue86                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW344;
++        union
++        {
++            struct
++            {
++                /// uint32_t 345
++                uint32_t                 InversePixelValue86                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue86                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW345;
++        union
++        {
++            struct
++            {
++                /// uint32_t 346
++                uint32_t                 ForwardGChGammaCorrectedValue86                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue86                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW346;
++        union
++        {
++            struct
++            {
++                /// uint32_t 347
++                uint32_t                 ForwardPixelValue86                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue86                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW347;
++        union
++        {
++            struct
++            {
++                /// uint32_t 348
++                uint32_t                 InverseGChGammaCorrectedValue87                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue87                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW348;
++        union
++        {
++            struct
++            {
++                /// uint32_t 349
++                uint32_t                 InversePixelValue87                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue87                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW349;
++        union
++        {
++            struct
++            {
++                /// uint32_t 350
++                uint32_t                 ForwardGChGammaCorrectedValue87                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue87                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW350;
++        union
++        {
++            struct
++            {
++                /// uint32_t 351
++                uint32_t                 ForwardPixelValue87                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue87                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW351;
++        union
++        {
++            struct
++            {
++                /// uint32_t 352
++                uint32_t                 InverseGChGammaCorrectedValue88                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue88                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW352;
++        union
++        {
++            struct
++            {
++                /// uint32_t 353
++                uint32_t                 InversePixelValue88                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue88                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW353;
++        union
++        {
++            struct
++            {
++                /// uint32_t 354
++                uint32_t                 ForwardGChGammaCorrectedValue88                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue88                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW354;
++        union
++        {
++            struct
++            {
++                /// uint32_t 355
++                uint32_t                 ForwardPixelValue88                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue88                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW355;
++        union
++        {
++            struct
++            {
++                /// uint32_t 356
++                uint32_t                 InverseGChGammaCorrectedValue89                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue89                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW356;
++        union
++        {
++            struct
++            {
++                /// uint32_t 357
++                uint32_t                 InversePixelValue89                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue89                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW357;
++        union
++        {
++            struct
++            {
++                /// uint32_t 358
++                uint32_t                 ForwardGChGammaCorrectedValue89                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue89                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW358;
++        union
++        {
++            struct
++            {
++                /// uint32_t 359
++                uint32_t                 ForwardPixelValue89                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue89                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW359;
++        union
++        {
++            struct
++            {
++                /// uint32_t 360
++                uint32_t                 InverseGChGammaCorrectedValue90                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue90                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW360;
++        union
++        {
++            struct
++            {
++                /// uint32_t 361
++                uint32_t                 InversePixelValue90                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue90                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW361;
++        union
++        {
++            struct
++            {
++                /// uint32_t 362
++                uint32_t                 ForwardGChGammaCorrectedValue90                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue90                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW362;
++        union
++        {
++            struct
++            {
++                /// uint32_t 363
++                uint32_t                 ForwardPixelValue90                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue90                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW363;
++        union
++        {
++            struct
++            {
++                /// uint32_t 364
++                uint32_t                 InverseGChGammaCorrectedValue91                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue91                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW364;
++        union
++        {
++            struct
++            {
++                /// uint32_t 365
++                uint32_t                 InversePixelValue91                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue91                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW365;
++        union
++        {
++            struct
++            {
++                /// uint32_t 366
++                uint32_t                 ForwardGChGammaCorrectedValue91                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue91                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW366;
++        union
++        {
++            struct
++            {
++                /// uint32_t 367
++                uint32_t                 ForwardPixelValue91                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue91                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW367;
++        union
++        {
++            struct
++            {
++                /// uint32_t 368
++                uint32_t                 InverseGChGammaCorrectedValue92                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue92                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW368;
++        union
++        {
++            struct
++            {
++                /// uint32_t 369
++                uint32_t                 InversePixelValue92                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue92                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW369;
++        union
++        {
++            struct
++            {
++                /// uint32_t 370
++                uint32_t                 ForwardGChGammaCorrectedValue92                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue92                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW370;
++        union
++        {
++            struct
++            {
++                /// uint32_t 371
++                uint32_t                 ForwardPixelValue92                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue92                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW371;
++        union
++        {
++            struct
++            {
++                /// uint32_t 372
++                uint32_t                 InverseGChGammaCorrectedValue93                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue93                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW372;
++        union
++        {
++            struct
++            {
++                /// uint32_t 373
++                uint32_t                 InversePixelValue93                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue93                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW373;
++        union
++        {
++            struct
++            {
++                /// uint32_t 374
++                uint32_t                 ForwardGChGammaCorrectedValue93                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue93                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW374;
++        union
++        {
++            struct
++            {
++                /// uint32_t 375
++                uint32_t                 ForwardPixelValue93                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue93                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW375;
++        union
++        {
++            struct
++            {
++                /// uint32_t 376
++                uint32_t                 InverseGChGammaCorrectedValue94                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue94                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW376;
++        union
++        {
++            struct
++            {
++                /// uint32_t 377
++                uint32_t                 InversePixelValue94                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue94                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW377;
++        union
++        {
++            struct
++            {
++                /// uint32_t 378
++                uint32_t                 ForwardGChGammaCorrectedValue94                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue94                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW378;
++        union
++        {
++            struct
++            {
++                /// uint32_t 379
++                uint32_t                 ForwardPixelValue94                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue94                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW379;
++        union
++        {
++            struct
++            {
++                /// uint32_t 380
++                uint32_t                 InverseGChGammaCorrectedValue95                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue95                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW380;
++        union
++        {
++            struct
++            {
++                /// uint32_t 381
++                uint32_t                 InversePixelValue95                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue95                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW381;
++        union
++        {
++            struct
++            {
++                /// uint32_t 382
++                uint32_t                 ForwardGChGammaCorrectedValue95                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue95                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW382;
++        union
++        {
++            struct
++            {
++                /// uint32_t 383
++                uint32_t                 ForwardPixelValue95                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue95                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW383;
++        union
++        {
++            struct
++            {
++                /// uint32_t 384
++                uint32_t                 InverseGChGammaCorrectedValue96                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue96                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW384;
++        union
++        {
++            struct
++            {
++                /// uint32_t 385
++                uint32_t                 InversePixelValue96                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue96                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW385;
++        union
++        {
++            struct
++            {
++                /// uint32_t 386
++                uint32_t                 ForwardGChGammaCorrectedValue96                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue96                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW386;
++        union
++        {
++            struct
++            {
++                /// uint32_t 387
++                uint32_t                 ForwardPixelValue96                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue96                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW387;
++        union
++        {
++            struct
++            {
++                /// uint32_t 388
++                uint32_t                 InverseGChGammaCorrectedValue97                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue97                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW388;
++        union
++        {
++            struct
++            {
++                /// uint32_t 389
++                uint32_t                 InversePixelValue97                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue97                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW389;
++        union
++        {
++            struct
++            {
++                /// uint32_t 390
++                uint32_t                 ForwardGChGammaCorrectedValue97                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue97                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW390;
++        union
++        {
++            struct
++            {
++                /// uint32_t 391
++                uint32_t                 ForwardPixelValue97                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue97                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW391;
++        union
++        {
++            struct
++            {
++                /// uint32_t 392
++                uint32_t                 InverseGChGammaCorrectedValue98                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue98                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW392;
++        union
++        {
++            struct
++            {
++                /// uint32_t 393
++                uint32_t                 InversePixelValue98                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue98                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW393;
++        union
++        {
++            struct
++            {
++                /// uint32_t 394
++                uint32_t                 ForwardGChGammaCorrectedValue98                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue98                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW394;
++        union
++        {
++            struct
++            {
++                /// uint32_t 395
++                uint32_t                 ForwardPixelValue98                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue98                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW395;
++        union
++        {
++            struct
++            {
++                /// uint32_t 396
++                uint32_t                 InverseGChGammaCorrectedValue99                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue99                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW396;
++        union
++        {
++            struct
++            {
++                /// uint32_t 397
++                uint32_t                 InversePixelValue99                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue99                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW397;
++        union
++        {
++            struct
++            {
++                /// uint32_t 398
++                uint32_t                 ForwardGChGammaCorrectedValue99                  : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue99                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW398;
++        union
++        {
++            struct
++            {
++                /// uint32_t 399
++                uint32_t                 ForwardPixelValue99                              : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue99                  : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW399;
++        union
++        {
++            struct
++            {
++                /// uint32_t 400
++                uint32_t                 InverseGChGammaCorrectedValue100                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue100                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW400;
++        union
++        {
++            struct
++            {
++                /// uint32_t 401
++                uint32_t                 InversePixelValue100                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue100                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW401;
++        union
++        {
++            struct
++            {
++                /// uint32_t 402
++                uint32_t                 ForwardGChGammaCorrectedValue100                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue100                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW402;
++        union
++        {
++            struct
++            {
++                /// uint32_t 403
++                uint32_t                 ForwardPixelValue100                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue100                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW403;
++        union
++        {
++            struct
++            {
++                /// uint32_t 404
++                uint32_t                 InverseGChGammaCorrectedValue101                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue101                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW404;
++        union
++        {
++            struct
++            {
++                /// uint32_t 405
++                uint32_t                 InversePixelValue101                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue101                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW405;
++        union
++        {
++            struct
++            {
++                /// uint32_t 406
++                uint32_t                 ForwardGChGammaCorrectedValue101                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue101                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW406;
++        union
++        {
++            struct
++            {
++                /// uint32_t 407
++                uint32_t                 ForwardPixelValue101                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue101                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW407;
++        union
++        {
++            struct
++            {
++                /// uint32_t 408
++                uint32_t                 InverseGChGammaCorrectedValue102                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue102                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW408;
++        union
++        {
++            struct
++            {
++                /// uint32_t 409
++                uint32_t                 InversePixelValue102                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue102                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW409;
++        union
++        {
++            struct
++            {
++                /// uint32_t 410
++                uint32_t                 ForwardGChGammaCorrectedValue102                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue102                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW410;
++        union
++        {
++            struct
++            {
++                /// uint32_t 411
++                uint32_t                 ForwardPixelValue102                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue102                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW411;
++        union
++        {
++            struct
++            {
++                /// uint32_t 412
++                uint32_t                 InverseGChGammaCorrectedValue103                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue103                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW412;
++        union
++        {
++            struct
++            {
++                /// uint32_t 413
++                uint32_t                 InversePixelValue103                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue103                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW413;
++        union
++        {
++            struct
++            {
++                /// uint32_t 414
++                uint32_t                 ForwardGChGammaCorrectedValue103                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue103                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW414;
++        union
++        {
++            struct
++            {
++                /// uint32_t 415
++                uint32_t                 ForwardPixelValue103                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue103                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW415;
++        union
++        {
++            struct
++            {
++                /// uint32_t 416
++                uint32_t                 InverseGChGammaCorrectedValue104                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue104                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW416;
++        union
++        {
++            struct
++            {
++                /// uint32_t 417
++                uint32_t                 InversePixelValue104                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue104                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW417;
++        union
++        {
++            struct
++            {
++                /// uint32_t 418
++                uint32_t                 ForwardGChGammaCorrectedValue104                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue104                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW418;
++        union
++        {
++            struct
++            {
++                /// uint32_t 419
++                uint32_t                 ForwardPixelValue104                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue104                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW419;
++        union
++        {
++            struct
++            {
++                /// uint32_t 420
++                uint32_t                 InverseGChGammaCorrectedValue105                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue105                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW420;
++        union
++        {
++            struct
++            {
++                /// uint32_t 421
++                uint32_t                 InversePixelValue105                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue105                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW421;
++        union
++        {
++            struct
++            {
++                /// uint32_t 422
++                uint32_t                 ForwardGChGammaCorrectedValue105                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue105                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW422;
++        union
++        {
++            struct
++            {
++                /// uint32_t 423
++                uint32_t                 ForwardPixelValue105                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue105                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW423;
++        union
++        {
++            struct
++            {
++                /// uint32_t 424
++                uint32_t                 InverseGChGammaCorrectedValue106                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue106                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW424;
++        union
++        {
++            struct
++            {
++                /// uint32_t 425
++                uint32_t                 InversePixelValue106                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue106                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW425;
++        union
++        {
++            struct
++            {
++                /// uint32_t 426
++                uint32_t                 ForwardGChGammaCorrectedValue106                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue106                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW426;
++        union
++        {
++            struct
++            {
++                /// uint32_t 427
++                uint32_t                 ForwardPixelValue106                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue106                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW427;
++        union
++        {
++            struct
++            {
++                /// uint32_t 428
++                uint32_t                 InverseGChGammaCorrectedValue107                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue107                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW428;
++        union
++        {
++            struct
++            {
++                /// uint32_t 429
++                uint32_t                 InversePixelValue107                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue107                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW429;
++        union
++        {
++            struct
++            {
++                /// uint32_t 430
++                uint32_t                 ForwardGChGammaCorrectedValue107                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue107                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW430;
++        union
++        {
++            struct
++            {
++                /// uint32_t 431
++                uint32_t                 ForwardPixelValue107                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue107                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW431;
++        union
++        {
++            struct
++            {
++                /// uint32_t 432
++                uint32_t                 InverseGChGammaCorrectedValue108                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue108                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW432;
++        union
++        {
++            struct
++            {
++                /// uint32_t 433
++                uint32_t                 InversePixelValue108                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue108                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW433;
++        union
++        {
++            struct
++            {
++                /// uint32_t 434
++                uint32_t                 ForwardGChGammaCorrectedValue108                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue108                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW434;
++        union
++        {
++            struct
++            {
++                /// uint32_t 435
++                uint32_t                 ForwardPixelValue108                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue108                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW435;
++        union
++        {
++            struct
++            {
++                /// uint32_t 436
++                uint32_t                 InverseGChGammaCorrectedValue109                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue109                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW436;
++        union
++        {
++            struct
++            {
++                /// uint32_t 437
++                uint32_t                 InversePixelValue109                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue109                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW437;
++        union
++        {
++            struct
++            {
++                /// uint32_t 438
++                uint32_t                 ForwardGChGammaCorrectedValue109                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue109                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW438;
++        union
++        {
++            struct
++            {
++                /// uint32_t 439
++                uint32_t                 ForwardPixelValue109                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue109                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW439;
++        union
++        {
++            struct
++            {
++                /// uint32_t 440
++                uint32_t                 InverseGChGammaCorrectedValue110                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue110                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW440;
++        union
++        {
++            struct
++            {
++                /// uint32_t 441
++                uint32_t                 InversePixelValue110                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue110                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW441;
++        union
++        {
++            struct
++            {
++                /// uint32_t 442
++                uint32_t                 ForwardGChGammaCorrectedValue110                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue110                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW442;
++        union
++        {
++            struct
++            {
++                /// uint32_t 443
++                uint32_t                 ForwardPixelValue110                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue110                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW443;
++        union
++        {
++            struct
++            {
++                /// uint32_t 444
++                uint32_t                 InverseGChGammaCorrectedValue111                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue111                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW444;
++        union
++        {
++            struct
++            {
++                /// uint32_t 445
++                uint32_t                 InversePixelValue111                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue111                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW445;
++        union
++        {
++            struct
++            {
++                /// uint32_t 446
++                uint32_t                 ForwardGChGammaCorrectedValue111                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue111                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW446;
++        union
++        {
++            struct
++            {
++                /// uint32_t 447
++                uint32_t                 ForwardPixelValue111                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue111                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW447;
++        union
++        {
++            struct
++            {
++                /// uint32_t 448
++                uint32_t                 InverseGChGammaCorrectedValue112                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue112                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW448;
++        union
++        {
++            struct
++            {
++                /// uint32_t 449
++                uint32_t                 InversePixelValue112                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue112                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW449;
++        union
++        {
++            struct
++            {
++                /// uint32_t 450
++                uint32_t                 ForwardGChGammaCorrectedValue112                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue112                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW450;
++        union
++        {
++            struct
++            {
++                /// uint32_t 451
++                uint32_t                 ForwardPixelValue112                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue112                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW451;
++        union
++        {
++            struct
++            {
++                /// uint32_t 452
++                uint32_t                 InverseGChGammaCorrectedValue113                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue113                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW452;
++        union
++        {
++            struct
++            {
++                /// uint32_t 453
++                uint32_t                 InversePixelValue113                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue113                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW453;
++        union
++        {
++            struct
++            {
++                /// uint32_t 454
++                uint32_t                 ForwardGChGammaCorrectedValue113                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue113                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW454;
++        union
++        {
++            struct
++            {
++                /// uint32_t 455
++                uint32_t                 ForwardPixelValue113                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue113                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW455;
++        union
++        {
++            struct
++            {
++                /// uint32_t 456
++                uint32_t                 InverseGChGammaCorrectedValue114                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue114                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW456;
++        union
++        {
++            struct
++            {
++                /// uint32_t 457
++                uint32_t                 InversePixelValue114                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue114                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW457;
++        union
++        {
++            struct
++            {
++                /// uint32_t 458
++                uint32_t                 ForwardGChGammaCorrectedValue114                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue114                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW458;
++        union
++        {
++            struct
++            {
++                /// uint32_t 459
++                uint32_t                 ForwardPixelValue114                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue114                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW459;
++        union
++        {
++            struct
++            {
++                /// uint32_t 460
++                uint32_t                 InverseGChGammaCorrectedValue115                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue115                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW460;
++        union
++        {
++            struct
++            {
++                /// uint32_t 461
++                uint32_t                 InversePixelValue115                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue115                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW461;
++        union
++        {
++            struct
++            {
++                /// uint32_t 462
++                uint32_t                 ForwardGChGammaCorrectedValue115                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue115                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW462;
++        union
++        {
++            struct
++            {
++                /// uint32_t 463
++                uint32_t                 ForwardPixelValue115                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue115                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW463;
++        union
++        {
++            struct
++            {
++                /// uint32_t 464
++                uint32_t                 InverseGChGammaCorrectedValue116                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue116                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW464;
++        union
++        {
++            struct
++            {
++                /// uint32_t 465
++                uint32_t                 InversePixelValue116                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue116                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW465;
++        union
++        {
++            struct
++            {
++                /// uint32_t 466
++                uint32_t                 ForwardGChGammaCorrectedValue116                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue116                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW466;
++        union
++        {
++            struct
++            {
++                /// uint32_t 467
++                uint32_t                 ForwardPixelValue116                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue116                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW467;
++        union
++        {
++            struct
++            {
++                /// uint32_t 468
++                uint32_t                 InverseGChGammaCorrectedValue117                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue117                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW468;
++        union
++        {
++            struct
++            {
++                /// uint32_t 469
++                uint32_t                 InversePixelValue117                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue117                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW469;
++        union
++        {
++            struct
++            {
++                /// uint32_t 470
++                uint32_t                 ForwardGChGammaCorrectedValue117                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue117                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW470;
++        union
++        {
++            struct
++            {
++                /// uint32_t 471
++                uint32_t                 ForwardPixelValue117                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue117                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW471;
++        union
++        {
++            struct
++            {
++                /// uint32_t 472
++                uint32_t                 InverseGChGammaCorrectedValue118                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue118                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW472;
++        union
++        {
++            struct
++            {
++                /// uint32_t 473
++                uint32_t                 InversePixelValue118                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue118                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW473;
++        union
++        {
++            struct
++            {
++                /// uint32_t 474
++                uint32_t                 ForwardGChGammaCorrectedValue118                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue118                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW474;
++        union
++        {
++            struct
++            {
++                /// uint32_t 475
++                uint32_t                 ForwardPixelValue118                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue118                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW475;
++        union
++        {
++            struct
++            {
++                /// uint32_t 476
++                uint32_t                 InverseGChGammaCorrectedValue119                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue119                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW476;
++        union
++        {
++            struct
++            {
++                /// uint32_t 477
++                uint32_t                 InversePixelValue119                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue119                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW477;
++        union
++        {
++            struct
++            {
++                /// uint32_t 478
++                uint32_t                 ForwardGChGammaCorrectedValue119                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue119                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW478;
++        union
++        {
++            struct
++            {
++                /// uint32_t 479
++                uint32_t                 ForwardPixelValue119                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue119                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW479;
++        union
++        {
++            struct
++            {
++                /// uint32_t 480
++                uint32_t                 InverseGChGammaCorrectedValue120                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue120                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW480;
++        union
++        {
++            struct
++            {
++                /// uint32_t 481
++                uint32_t                 InversePixelValue120                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue120                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW481;
++        union
++        {
++            struct
++            {
++                /// uint32_t 482
++                uint32_t                 ForwardGChGammaCorrectedValue120                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue120                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW482;
++        union
++        {
++            struct
++            {
++                /// uint32_t 483
++                uint32_t                 ForwardPixelValue120                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue120                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW483;
++        union
++        {
++            struct
++            {
++                /// uint32_t 484
++                uint32_t                 InverseGChGammaCorrectedValue121                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue121                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW484;
++        union
++        {
++            struct
++            {
++                /// uint32_t 485
++                uint32_t                 InversePixelValue121                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue121                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW485;
++        union
++        {
++            struct
++            {
++                /// uint32_t 486
++                uint32_t                 ForwardGChGammaCorrectedValue121                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue121                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW486;
++        union
++        {
++            struct
++            {
++                /// uint32_t 487
++                uint32_t                 ForwardPixelValue121                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue121                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW487;
++        union
++        {
++            struct
++            {
++                /// uint32_t 488
++                uint32_t                 InverseGChGammaCorrectedValue122                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue122                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW488;
++        union
++        {
++            struct
++            {
++                /// uint32_t 489
++                uint32_t                 InversePixelValue122                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue122                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW489;
++        union
++        {
++            struct
++            {
++                /// uint32_t 490
++                uint32_t                 ForwardGChGammaCorrectedValue122                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue122                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW490;
++        union
++        {
++            struct
++            {
++                /// uint32_t 491
++                uint32_t                 ForwardPixelValue122                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue122                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW491;
++        union
++        {
++            struct
++            {
++                /// uint32_t 492
++                uint32_t                 InverseGChGammaCorrectedValue123                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue123                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW492;
++        union
++        {
++            struct
++            {
++                /// uint32_t 493
++                uint32_t                 InversePixelValue123                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue123                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW493;
++        union
++        {
++            struct
++            {
++                /// uint32_t 494
++                uint32_t                 ForwardGChGammaCorrectedValue123                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue123                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW494;
++        union
++        {
++            struct
++            {
++                /// uint32_t 495
++                uint32_t                 ForwardPixelValue123                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue123                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW495;
++        union
++        {
++            struct
++            {
++                /// uint32_t 496
++                uint32_t                 InverseGChGammaCorrectedValue124                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue124                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW496;
++        union
++        {
++            struct
++            {
++                /// uint32_t 497
++                uint32_t                 InversePixelValue124                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue124                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW497;
++        union
++        {
++            struct
++            {
++                /// uint32_t 498
++                uint32_t                 ForwardGChGammaCorrectedValue124                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue124                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW498;
++        union
++        {
++            struct
++            {
++                /// uint32_t 499
++                uint32_t                 ForwardPixelValue124                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue124                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW499;
++        union
++        {
++            struct
++            {
++                /// uint32_t 500
++                uint32_t                 InverseGChGammaCorrectedValue125                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue125                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW500;
++        union
++        {
++            struct
++            {
++                /// uint32_t 501
++                uint32_t                 InversePixelValue125                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue125                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW501;
++        union
++        {
++            struct
++            {
++                /// uint32_t 502
++                uint32_t                 ForwardGChGammaCorrectedValue125                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue125                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW502;
++        union
++        {
++            struct
++            {
++                /// uint32_t 503
++                uint32_t                 ForwardPixelValue125                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue125                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW503;
++        union
++        {
++            struct
++            {
++                /// uint32_t 504
++                uint32_t                 InverseGChGammaCorrectedValue126                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue126                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW504;
++        union
++        {
++            struct
++            {
++                /// uint32_t 505
++                uint32_t                 InversePixelValue126                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue126                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW505;
++        union
++        {
++            struct
++            {
++                /// uint32_t 506
++                uint32_t                 ForwardGChGammaCorrectedValue126                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue126                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW506;
++        union
++        {
++            struct
++            {
++                /// uint32_t 507
++                uint32_t                 ForwardPixelValue126                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue126                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW507;
++        union
++        {
++            struct
++            {
++                /// uint32_t 508
++                uint32_t                 InverseGChGammaCorrectedValue127                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue127                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW508;
++        union
++        {
++            struct
++            {
++                /// uint32_t 509
++                uint32_t                 InversePixelValue127                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue127                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW509;
++        union
++        {
++            struct
++            {
++                /// uint32_t 510
++                uint32_t                 ForwardGChGammaCorrectedValue127                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue127                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW510;
++        union
++        {
++            struct
++            {
++                /// uint32_t 511
++                uint32_t                 ForwardPixelValue127                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue127                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW511;
++        union
++        {
++            struct
++            {
++                /// uint32_t 512
++                uint32_t                 InverseGChGammaCorrectedValue128                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue128                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW512;
++        union
++        {
++            struct
++            {
++                /// uint32_t 513
++                uint32_t                 InversePixelValue128                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue128                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW513;
++        union
++        {
++            struct
++            {
++                /// uint32_t 514
++                uint32_t                 ForwardGChGammaCorrectedValue128                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue128                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW514;
++        union
++        {
++            struct
++            {
++                /// uint32_t 515
++                uint32_t                 ForwardPixelValue128                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue128                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW515;
++        union
++        {
++            struct
++            {
++                /// uint32_t 516
++                uint32_t                 InverseGChGammaCorrectedValue129                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue129                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW516;
++        union
++        {
++            struct
++            {
++                /// uint32_t 517
++                uint32_t                 InversePixelValue129                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue129                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW517;
++        union
++        {
++            struct
++            {
++                /// uint32_t 518
++                uint32_t                 ForwardGChGammaCorrectedValue129                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue129                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW518;
++        union
++        {
++            struct
++            {
++                /// uint32_t 519
++                uint32_t                 ForwardPixelValue129                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue129                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW519;
++        union
++        {
++            struct
++            {
++                /// uint32_t 520
++                uint32_t                 InverseGChGammaCorrectedValue130                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue130                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW520;
++        union
++        {
++            struct
++            {
++                /// uint32_t 521
++                uint32_t                 InversePixelValue130                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue130                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW521;
++        union
++        {
++            struct
++            {
++                /// uint32_t 522
++                uint32_t                 ForwardGChGammaCorrectedValue130                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue130                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW522;
++        union
++        {
++            struct
++            {
++                /// uint32_t 523
++                uint32_t                 ForwardPixelValue130                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue130                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW523;
++        union
++        {
++            struct
++            {
++                /// uint32_t 524
++                uint32_t                 InverseGChGammaCorrectedValue131                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue131                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW524;
++        union
++        {
++            struct
++            {
++                /// uint32_t 525
++                uint32_t                 InversePixelValue131                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue131                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW525;
++        union
++        {
++            struct
++            {
++                /// uint32_t 526
++                uint32_t                 ForwardGChGammaCorrectedValue131                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue131                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW526;
++        union
++        {
++            struct
++            {
++                /// uint32_t 527
++                uint32_t                 ForwardPixelValue131                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue131                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW527;
++        union
++        {
++            struct
++            {
++                /// uint32_t 528
++                uint32_t                 InverseGChGammaCorrectedValue132                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue132                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW528;
++        union
++        {
++            struct
++            {
++                /// uint32_t 529
++                uint32_t                 InversePixelValue132                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue132                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW529;
++        union
++        {
++            struct
++            {
++                /// uint32_t 530
++                uint32_t                 ForwardGChGammaCorrectedValue132                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue132                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW530;
++        union
++        {
++            struct
++            {
++                /// uint32_t 531
++                uint32_t                 ForwardPixelValue132                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue132                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW531;
++        union
++        {
++            struct
++            {
++                /// uint32_t 532
++                uint32_t                 InverseGChGammaCorrectedValue133                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue133                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW532;
++        union
++        {
++            struct
++            {
++                /// uint32_t 533
++                uint32_t                 InversePixelValue133                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue133                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW533;
++        union
++        {
++            struct
++            {
++                /// uint32_t 534
++                uint32_t                 ForwardGChGammaCorrectedValue133                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue133                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW534;
++        union
++        {
++            struct
++            {
++                /// uint32_t 535
++                uint32_t                 ForwardPixelValue133                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue133                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW535;
++        union
++        {
++            struct
++            {
++                /// uint32_t 536
++                uint32_t                 InverseGChGammaCorrectedValue134                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue134                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW536;
++        union
++        {
++            struct
++            {
++                /// uint32_t 537
++                uint32_t                 InversePixelValue134                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue134                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW537;
++        union
++        {
++            struct
++            {
++                /// uint32_t 538
++                uint32_t                 ForwardGChGammaCorrectedValue134                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue134                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW538;
++        union
++        {
++            struct
++            {
++                /// uint32_t 539
++                uint32_t                 ForwardPixelValue134                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue134                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW539;
++        union
++        {
++            struct
++            {
++                /// uint32_t 540
++                uint32_t                 InverseGChGammaCorrectedValue135                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue135                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW540;
++        union
++        {
++            struct
++            {
++                /// uint32_t 541
++                uint32_t                 InversePixelValue135                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue135                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW541;
++        union
++        {
++            struct
++            {
++                /// uint32_t 542
++                uint32_t                 ForwardGChGammaCorrectedValue135                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue135                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW542;
++        union
++        {
++            struct
++            {
++                /// uint32_t 543
++                uint32_t                 ForwardPixelValue135                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue135                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW543;
++        union
++        {
++            struct
++            {
++                /// uint32_t 544
++                uint32_t                 InverseGChGammaCorrectedValue136                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue136                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW544;
++        union
++        {
++            struct
++            {
++                /// uint32_t 545
++                uint32_t                 InversePixelValue136                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue136                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW545;
++        union
++        {
++            struct
++            {
++                /// uint32_t 546
++                uint32_t                 ForwardGChGammaCorrectedValue136                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue136                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW546;
++        union
++        {
++            struct
++            {
++                /// uint32_t 547
++                uint32_t                 ForwardPixelValue136                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue136                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW547;
++        union
++        {
++            struct
++            {
++                /// uint32_t 548
++                uint32_t                 InverseGChGammaCorrectedValue137                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue137                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW548;
++        union
++        {
++            struct
++            {
++                /// uint32_t 549
++                uint32_t                 InversePixelValue137                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue137                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW549;
++        union
++        {
++            struct
++            {
++                /// uint32_t 550
++                uint32_t                 ForwardGChGammaCorrectedValue137                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue137                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW550;
++        union
++        {
++            struct
++            {
++                /// uint32_t 551
++                uint32_t                 ForwardPixelValue137                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue137                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW551;
++        union
++        {
++            struct
++            {
++                /// uint32_t 552
++                uint32_t                 InverseGChGammaCorrectedValue138                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue138                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW552;
++        union
++        {
++            struct
++            {
++                /// uint32_t 553
++                uint32_t                 InversePixelValue138                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue138                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW553;
++        union
++        {
++            struct
++            {
++                /// uint32_t 554
++                uint32_t                 ForwardGChGammaCorrectedValue138                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue138                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW554;
++        union
++        {
++            struct
++            {
++                /// uint32_t 555
++                uint32_t                 ForwardPixelValue138                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue138                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW555;
++        union
++        {
++            struct
++            {
++                /// uint32_t 556
++                uint32_t                 InverseGChGammaCorrectedValue139                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue139                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW556;
++        union
++        {
++            struct
++            {
++                /// uint32_t 557
++                uint32_t                 InversePixelValue139                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue139                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW557;
++        union
++        {
++            struct
++            {
++                /// uint32_t 558
++                uint32_t                 ForwardGChGammaCorrectedValue139                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue139                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW558;
++        union
++        {
++            struct
++            {
++                /// uint32_t 559
++                uint32_t                 ForwardPixelValue139                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue139                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW559;
++        union
++        {
++            struct
++            {
++                /// uint32_t 560
++                uint32_t                 InverseGChGammaCorrectedValue140                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue140                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW560;
++        union
++        {
++            struct
++            {
++                /// uint32_t 561
++                uint32_t                 InversePixelValue140                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue140                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW561;
++        union
++        {
++            struct
++            {
++                /// uint32_t 562
++                uint32_t                 ForwardGChGammaCorrectedValue140                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue140                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW562;
++        union
++        {
++            struct
++            {
++                /// uint32_t 563
++                uint32_t                 ForwardPixelValue140                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue140                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW563;
++        union
++        {
++            struct
++            {
++                /// uint32_t 564
++                uint32_t                 InverseGChGammaCorrectedValue141                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue141                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW564;
++        union
++        {
++            struct
++            {
++                /// uint32_t 565
++                uint32_t                 InversePixelValue141                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue141                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW565;
++        union
++        {
++            struct
++            {
++                /// uint32_t 566
++                uint32_t                 ForwardGChGammaCorrectedValue141                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue141                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW566;
++        union
++        {
++            struct
++            {
++                /// uint32_t 567
++                uint32_t                 ForwardPixelValue141                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue141                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW567;
++        union
++        {
++            struct
++            {
++                /// uint32_t 568
++                uint32_t                 InverseGChGammaCorrectedValue142                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue142                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW568;
++        union
++        {
++            struct
++            {
++                /// uint32_t 569
++                uint32_t                 InversePixelValue142                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue142                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW569;
++        union
++        {
++            struct
++            {
++                /// uint32_t 570
++                uint32_t                 ForwardGChGammaCorrectedValue142                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue142                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW570;
++        union
++        {
++            struct
++            {
++                /// uint32_t 571
++                uint32_t                 ForwardPixelValue142                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue142                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW571;
++        union
++        {
++            struct
++            {
++                /// uint32_t 572
++                uint32_t                 InverseGChGammaCorrectedValue143                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue143                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW572;
++        union
++        {
++            struct
++            {
++                /// uint32_t 573
++                uint32_t                 InversePixelValue143                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue143                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW573;
++        union
++        {
++            struct
++            {
++                /// uint32_t 574
++                uint32_t                 ForwardGChGammaCorrectedValue143                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue143                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW574;
++        union
++        {
++            struct
++            {
++                /// uint32_t 575
++                uint32_t                 ForwardPixelValue143                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue143                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW575;
++        union
++        {
++            struct
++            {
++                /// uint32_t 576
++                uint32_t                 InverseGChGammaCorrectedValue144                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue144                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW576;
++        union
++        {
++            struct
++            {
++                /// uint32_t 577
++                uint32_t                 InversePixelValue144                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue144                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW577;
++        union
++        {
++            struct
++            {
++                /// uint32_t 578
++                uint32_t                 ForwardGChGammaCorrectedValue144                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue144                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW578;
++        union
++        {
++            struct
++            {
++                /// uint32_t 579
++                uint32_t                 ForwardPixelValue144                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue144                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW579;
++        union
++        {
++            struct
++            {
++                /// uint32_t 580
++                uint32_t                 InverseGChGammaCorrectedValue145                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue145                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW580;
++        union
++        {
++            struct
++            {
++                /// uint32_t 581
++                uint32_t                 InversePixelValue145                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue145                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW581;
++        union
++        {
++            struct
++            {
++                /// uint32_t 582
++                uint32_t                 ForwardGChGammaCorrectedValue145                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue145                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW582;
++        union
++        {
++            struct
++            {
++                /// uint32_t 583
++                uint32_t                 ForwardPixelValue145                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue145                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW583;
++        union
++        {
++            struct
++            {
++                /// uint32_t 584
++                uint32_t                 InverseGChGammaCorrectedValue146                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue146                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW584;
++        union
++        {
++            struct
++            {
++                /// uint32_t 585
++                uint32_t                 InversePixelValue146                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue146                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW585;
++        union
++        {
++            struct
++            {
++                /// uint32_t 586
++                uint32_t                 ForwardGChGammaCorrectedValue146                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue146                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW586;
++        union
++        {
++            struct
++            {
++                /// uint32_t 587
++                uint32_t                 ForwardPixelValue146                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue146                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW587;
++        union
++        {
++            struct
++            {
++                /// uint32_t 588
++                uint32_t                 InverseGChGammaCorrectedValue147                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue147                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW588;
++        union
++        {
++            struct
++            {
++                /// uint32_t 589
++                uint32_t                 InversePixelValue147                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue147                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW589;
++        union
++        {
++            struct
++            {
++                /// uint32_t 590
++                uint32_t                 ForwardGChGammaCorrectedValue147                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue147                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW590;
++        union
++        {
++            struct
++            {
++                /// uint32_t 591
++                uint32_t                 ForwardPixelValue147                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue147                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW591;
++        union
++        {
++            struct
++            {
++                /// uint32_t 592
++                uint32_t                 InverseGChGammaCorrectedValue148                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue148                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW592;
++        union
++        {
++            struct
++            {
++                /// uint32_t 593
++                uint32_t                 InversePixelValue148                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue148                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW593;
++        union
++        {
++            struct
++            {
++                /// uint32_t 594
++                uint32_t                 ForwardGChGammaCorrectedValue148                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue148                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW594;
++        union
++        {
++            struct
++            {
++                /// uint32_t 595
++                uint32_t                 ForwardPixelValue148                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue148                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW595;
++        union
++        {
++            struct
++            {
++                /// uint32_t 596
++                uint32_t                 InverseGChGammaCorrectedValue149                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue149                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW596;
++        union
++        {
++            struct
++            {
++                /// uint32_t 597
++                uint32_t                 InversePixelValue149                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue149                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW597;
++        union
++        {
++            struct
++            {
++                /// uint32_t 598
++                uint32_t                 ForwardGChGammaCorrectedValue149                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue149                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW598;
++        union
++        {
++            struct
++            {
++                /// uint32_t 599
++                uint32_t                 ForwardPixelValue149                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue149                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW599;
++        union
++        {
++            struct
++            {
++                /// uint32_t 600
++                uint32_t                 InverseGChGammaCorrectedValue150                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue150                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW600;
++        union
++        {
++            struct
++            {
++                /// uint32_t 601
++                uint32_t                 InversePixelValue150                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue150                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW601;
++        union
++        {
++            struct
++            {
++                /// uint32_t 602
++                uint32_t                 ForwardGChGammaCorrectedValue150                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue150                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW602;
++        union
++        {
++            struct
++            {
++                /// uint32_t 603
++                uint32_t                 ForwardPixelValue150                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue150                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW603;
++        union
++        {
++            struct
++            {
++                /// uint32_t 604
++                uint32_t                 InverseGChGammaCorrectedValue151                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue151                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW604;
++        union
++        {
++            struct
++            {
++                /// uint32_t 605
++                uint32_t                 InversePixelValue151                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue151                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW605;
++        union
++        {
++            struct
++            {
++                /// uint32_t 606
++                uint32_t                 ForwardGChGammaCorrectedValue151                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue151                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW606;
++        union
++        {
++            struct
++            {
++                /// uint32_t 607
++                uint32_t                 ForwardPixelValue151                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue151                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW607;
++        union
++        {
++            struct
++            {
++                /// uint32_t 608
++                uint32_t                 InverseGChGammaCorrectedValue152                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue152                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW608;
++        union
++        {
++            struct
++            {
++                /// uint32_t 609
++                uint32_t                 InversePixelValue152                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue152                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW609;
++        union
++        {
++            struct
++            {
++                /// uint32_t 610
++                uint32_t                 ForwardGChGammaCorrectedValue152                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue152                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW610;
++        union
++        {
++            struct
++            {
++                /// uint32_t 611
++                uint32_t                 ForwardPixelValue152                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue152                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW611;
++        union
++        {
++            struct
++            {
++                /// uint32_t 612
++                uint32_t                 InverseGChGammaCorrectedValue153                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue153                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW612;
++        union
++        {
++            struct
++            {
++                /// uint32_t 613
++                uint32_t                 InversePixelValue153                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue153                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW613;
++        union
++        {
++            struct
++            {
++                /// uint32_t 614
++                uint32_t                 ForwardGChGammaCorrectedValue153                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue153                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW614;
++        union
++        {
++            struct
++            {
++                /// uint32_t 615
++                uint32_t                 ForwardPixelValue153                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue153                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW615;
++        union
++        {
++            struct
++            {
++                /// uint32_t 616
++                uint32_t                 InverseGChGammaCorrectedValue154                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue154                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW616;
++        union
++        {
++            struct
++            {
++                /// uint32_t 617
++                uint32_t                 InversePixelValue154                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue154                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW617;
++        union
++        {
++            struct
++            {
++                /// uint32_t 618
++                uint32_t                 ForwardGChGammaCorrectedValue154                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue154                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW618;
++        union
++        {
++            struct
++            {
++                /// uint32_t 619
++                uint32_t                 ForwardPixelValue154                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue154                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW619;
++        union
++        {
++            struct
++            {
++                /// uint32_t 620
++                uint32_t                 InverseGChGammaCorrectedValue155                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue155                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW620;
++        union
++        {
++            struct
++            {
++                /// uint32_t 621
++                uint32_t                 InversePixelValue155                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue155                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW621;
++        union
++        {
++            struct
++            {
++                /// uint32_t 622
++                uint32_t                 ForwardGChGammaCorrectedValue155                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue155                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW622;
++        union
++        {
++            struct
++            {
++                /// uint32_t 623
++                uint32_t                 ForwardPixelValue155                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue155                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW623;
++        union
++        {
++            struct
++            {
++                /// uint32_t 624
++                uint32_t                 InverseGChGammaCorrectedValue156                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue156                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW624;
++        union
++        {
++            struct
++            {
++                /// uint32_t 625
++                uint32_t                 InversePixelValue156                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue156                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW625;
++        union
++        {
++            struct
++            {
++                /// uint32_t 626
++                uint32_t                 ForwardGChGammaCorrectedValue156                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue156                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW626;
++        union
++        {
++            struct
++            {
++                /// uint32_t 627
++                uint32_t                 ForwardPixelValue156                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue156                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW627;
++        union
++        {
++            struct
++            {
++                /// uint32_t 628
++                uint32_t                 InverseGChGammaCorrectedValue157                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue157                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW628;
++        union
++        {
++            struct
++            {
++                /// uint32_t 629
++                uint32_t                 InversePixelValue157                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue157                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW629;
++        union
++        {
++            struct
++            {
++                /// uint32_t 630
++                uint32_t                 ForwardGChGammaCorrectedValue157                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue157                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW630;
++        union
++        {
++            struct
++            {
++                /// uint32_t 631
++                uint32_t                 ForwardPixelValue157                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue157                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW631;
++        union
++        {
++            struct
++            {
++                /// uint32_t 632
++                uint32_t                 InverseGChGammaCorrectedValue158                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue158                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW632;
++        union
++        {
++            struct
++            {
++                /// uint32_t 633
++                uint32_t                 InversePixelValue158                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue158                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW633;
++        union
++        {
++            struct
++            {
++                /// uint32_t 634
++                uint32_t                 ForwardGChGammaCorrectedValue158                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue158                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW634;
++        union
++        {
++            struct
++            {
++                /// uint32_t 635
++                uint32_t                 ForwardPixelValue158                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue158                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW635;
++        union
++        {
++            struct
++            {
++                /// uint32_t 636
++                uint32_t                 InverseGChGammaCorrectedValue159                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue159                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW636;
++        union
++        {
++            struct
++            {
++                /// uint32_t 637
++                uint32_t                 InversePixelValue159                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue159                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW637;
++        union
++        {
++            struct
++            {
++                /// uint32_t 638
++                uint32_t                 ForwardGChGammaCorrectedValue159                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue159                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW638;
++        union
++        {
++            struct
++            {
++                /// uint32_t 639
++                uint32_t                 ForwardPixelValue159                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue159                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW639;
++        union
++        {
++            struct
++            {
++                /// uint32_t 640
++                uint32_t                 InverseGChGammaCorrectedValue160                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue160                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW640;
++        union
++        {
++            struct
++            {
++                /// uint32_t 641
++                uint32_t                 InversePixelValue160                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue160                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW641;
++        union
++        {
++            struct
++            {
++                /// uint32_t 642
++                uint32_t                 ForwardGChGammaCorrectedValue160                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue160                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW642;
++        union
++        {
++            struct
++            {
++                /// uint32_t 643
++                uint32_t                 ForwardPixelValue160                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue160                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW643;
++        union
++        {
++            struct
++            {
++                /// uint32_t 644
++                uint32_t                 InverseGChGammaCorrectedValue161                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue161                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW644;
++        union
++        {
++            struct
++            {
++                /// uint32_t 645
++                uint32_t                 InversePixelValue161                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue161                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW645;
++        union
++        {
++            struct
++            {
++                /// uint32_t 646
++                uint32_t                 ForwardGChGammaCorrectedValue161                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue161                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW646;
++        union
++        {
++            struct
++            {
++                /// uint32_t 647
++                uint32_t                 ForwardPixelValue161                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue161                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW647;
++        union
++        {
++            struct
++            {
++                /// uint32_t 648
++                uint32_t                 InverseGChGammaCorrectedValue162                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue162                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW648;
++        union
++        {
++            struct
++            {
++                /// uint32_t 649
++                uint32_t                 InversePixelValue162                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue162                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW649;
++        union
++        {
++            struct
++            {
++                /// uint32_t 650
++                uint32_t                 ForwardGChGammaCorrectedValue162                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue162                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW650;
++        union
++        {
++            struct
++            {
++                /// uint32_t 651
++                uint32_t                 ForwardPixelValue162                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue162                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW651;
++        union
++        {
++            struct
++            {
++                /// uint32_t 652
++                uint32_t                 InverseGChGammaCorrectedValue163                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue163                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW652;
++        union
++        {
++            struct
++            {
++                /// uint32_t 653
++                uint32_t                 InversePixelValue163                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue163                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW653;
++        union
++        {
++            struct
++            {
++                /// uint32_t 654
++                uint32_t                 ForwardGChGammaCorrectedValue163                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue163                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW654;
++        union
++        {
++            struct
++            {
++                /// uint32_t 655
++                uint32_t                 ForwardPixelValue163                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue163                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW655;
++        union
++        {
++            struct
++            {
++                /// uint32_t 656
++                uint32_t                 InverseGChGammaCorrectedValue164                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue164                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW656;
++        union
++        {
++            struct
++            {
++                /// uint32_t 657
++                uint32_t                 InversePixelValue164                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue164                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW657;
++        union
++        {
++            struct
++            {
++                /// uint32_t 658
++                uint32_t                 ForwardGChGammaCorrectedValue164                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue164                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW658;
++        union
++        {
++            struct
++            {
++                /// uint32_t 659
++                uint32_t                 ForwardPixelValue164                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue164                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW659;
++        union
++        {
++            struct
++            {
++                /// uint32_t 660
++                uint32_t                 InverseGChGammaCorrectedValue165                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue165                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW660;
++        union
++        {
++            struct
++            {
++                /// uint32_t 661
++                uint32_t                 InversePixelValue165                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue165                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW661;
++        union
++        {
++            struct
++            {
++                /// uint32_t 662
++                uint32_t                 ForwardGChGammaCorrectedValue165                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue165                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW662;
++        union
++        {
++            struct
++            {
++                /// uint32_t 663
++                uint32_t                 ForwardPixelValue165                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue165                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW663;
++        union
++        {
++            struct
++            {
++                /// uint32_t 664
++                uint32_t                 InverseGChGammaCorrectedValue166                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue166                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW664;
++        union
++        {
++            struct
++            {
++                /// uint32_t 665
++                uint32_t                 InversePixelValue166                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue166                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW665;
++        union
++        {
++            struct
++            {
++                /// uint32_t 666
++                uint32_t                 ForwardGChGammaCorrectedValue166                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue166                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW666;
++        union
++        {
++            struct
++            {
++                /// uint32_t 667
++                uint32_t                 ForwardPixelValue166                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue166                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW667;
++        union
++        {
++            struct
++            {
++                /// uint32_t 668
++                uint32_t                 InverseGChGammaCorrectedValue167                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue167                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW668;
++        union
++        {
++            struct
++            {
++                /// uint32_t 669
++                uint32_t                 InversePixelValue167                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue167                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW669;
++        union
++        {
++            struct
++            {
++                /// uint32_t 670
++                uint32_t                 ForwardGChGammaCorrectedValue167                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue167                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW670;
++        union
++        {
++            struct
++            {
++                /// uint32_t 671
++                uint32_t                 ForwardPixelValue167                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue167                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW671;
++        union
++        {
++            struct
++            {
++                /// uint32_t 672
++                uint32_t                 InverseGChGammaCorrectedValue168                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue168                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW672;
++        union
++        {
++            struct
++            {
++                /// uint32_t 673
++                uint32_t                 InversePixelValue168                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue168                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW673;
++        union
++        {
++            struct
++            {
++                /// uint32_t 674
++                uint32_t                 ForwardGChGammaCorrectedValue168                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue168                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW674;
++        union
++        {
++            struct
++            {
++                /// uint32_t 675
++                uint32_t                 ForwardPixelValue168                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue168                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW675;
++        union
++        {
++            struct
++            {
++                /// uint32_t 676
++                uint32_t                 InverseGChGammaCorrectedValue169                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue169                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW676;
++        union
++        {
++            struct
++            {
++                /// uint32_t 677
++                uint32_t                 InversePixelValue169                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue169                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW677;
++        union
++        {
++            struct
++            {
++                /// uint32_t 678
++                uint32_t                 ForwardGChGammaCorrectedValue169                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue169                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW678;
++        union
++        {
++            struct
++            {
++                /// uint32_t 679
++                uint32_t                 ForwardPixelValue169                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue169                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW679;
++        union
++        {
++            struct
++            {
++                /// uint32_t 680
++                uint32_t                 InverseGChGammaCorrectedValue170                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue170                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW680;
++        union
++        {
++            struct
++            {
++                /// uint32_t 681
++                uint32_t                 InversePixelValue170                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue170                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW681;
++        union
++        {
++            struct
++            {
++                /// uint32_t 682
++                uint32_t                 ForwardGChGammaCorrectedValue170                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue170                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW682;
++        union
++        {
++            struct
++            {
++                /// uint32_t 683
++                uint32_t                 ForwardPixelValue170                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue170                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW683;
++        union
++        {
++            struct
++            {
++                /// uint32_t 684
++                uint32_t                 InverseGChGammaCorrectedValue171                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue171                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW684;
++        union
++        {
++            struct
++            {
++                /// uint32_t 685
++                uint32_t                 InversePixelValue171                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue171                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW685;
++        union
++        {
++            struct
++            {
++                /// uint32_t 686
++                uint32_t                 ForwardGChGammaCorrectedValue171                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue171                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW686;
++        union
++        {
++            struct
++            {
++                /// uint32_t 687
++                uint32_t                 ForwardPixelValue171                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue171                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW687;
++        union
++        {
++            struct
++            {
++                /// uint32_t 688
++                uint32_t                 InverseGChGammaCorrectedValue172                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue172                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW688;
++        union
++        {
++            struct
++            {
++                /// uint32_t 689
++                uint32_t                 InversePixelValue172                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue172                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW689;
++        union
++        {
++            struct
++            {
++                /// uint32_t 690
++                uint32_t                 ForwardGChGammaCorrectedValue172                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue172                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW690;
++        union
++        {
++            struct
++            {
++                /// uint32_t 691
++                uint32_t                 ForwardPixelValue172                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue172                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW691;
++        union
++        {
++            struct
++            {
++                /// uint32_t 692
++                uint32_t                 InverseGChGammaCorrectedValue173                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue173                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW692;
++        union
++        {
++            struct
++            {
++                /// uint32_t 693
++                uint32_t                 InversePixelValue173                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue173                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW693;
++        union
++        {
++            struct
++            {
++                /// uint32_t 694
++                uint32_t                 ForwardGChGammaCorrectedValue173                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue173                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW694;
++        union
++        {
++            struct
++            {
++                /// uint32_t 695
++                uint32_t                 ForwardPixelValue173                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue173                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW695;
++        union
++        {
++            struct
++            {
++                /// uint32_t 696
++                uint32_t                 InverseGChGammaCorrectedValue174                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue174                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW696;
++        union
++        {
++            struct
++            {
++                /// uint32_t 697
++                uint32_t                 InversePixelValue174                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue174                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW697;
++        union
++        {
++            struct
++            {
++                /// uint32_t 698
++                uint32_t                 ForwardGChGammaCorrectedValue174                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue174                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW698;
++        union
++        {
++            struct
++            {
++                /// uint32_t 699
++                uint32_t                 ForwardPixelValue174                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue174                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW699;
++        union
++        {
++            struct
++            {
++                /// uint32_t 700
++                uint32_t                 InverseGChGammaCorrectedValue175                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue175                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW700;
++        union
++        {
++            struct
++            {
++                /// uint32_t 701
++                uint32_t                 InversePixelValue175                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue175                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW701;
++        union
++        {
++            struct
++            {
++                /// uint32_t 702
++                uint32_t                 ForwardGChGammaCorrectedValue175                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue175                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW702;
++        union
++        {
++            struct
++            {
++                /// uint32_t 703
++                uint32_t                 ForwardPixelValue175                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue175                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW703;
++        union
++        {
++            struct
++            {
++                /// uint32_t 704
++                uint32_t                 InverseGChGammaCorrectedValue176                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue176                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW704;
++        union
++        {
++            struct
++            {
++                /// uint32_t 705
++                uint32_t                 InversePixelValue176                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue176                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW705;
++        union
++        {
++            struct
++            {
++                /// uint32_t 706
++                uint32_t                 ForwardGChGammaCorrectedValue176                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue176                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW706;
++        union
++        {
++            struct
++            {
++                /// uint32_t 707
++                uint32_t                 ForwardPixelValue176                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue176                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW707;
++        union
++        {
++            struct
++            {
++                /// uint32_t 708
++                uint32_t                 InverseGChGammaCorrectedValue177                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue177                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW708;
++        union
++        {
++            struct
++            {
++                /// uint32_t 709
++                uint32_t                 InversePixelValue177                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue177                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW709;
++        union
++        {
++            struct
++            {
++                /// uint32_t 710
++                uint32_t                 ForwardGChGammaCorrectedValue177                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue177                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW710;
++        union
++        {
++            struct
++            {
++                /// uint32_t 711
++                uint32_t                 ForwardPixelValue177                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue177                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW711;
++        union
++        {
++            struct
++            {
++                /// uint32_t 712
++                uint32_t                 InverseGChGammaCorrectedValue178                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue178                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW712;
++        union
++        {
++            struct
++            {
++                /// uint32_t 713
++                uint32_t                 InversePixelValue178                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue178                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW713;
++        union
++        {
++            struct
++            {
++                /// uint32_t 714
++                uint32_t                 ForwardGChGammaCorrectedValue178                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue178                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW714;
++        union
++        {
++            struct
++            {
++                /// uint32_t 715
++                uint32_t                 ForwardPixelValue178                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue178                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW715;
++        union
++        {
++            struct
++            {
++                /// uint32_t 716
++                uint32_t                 InverseGChGammaCorrectedValue179                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue179                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW716;
++        union
++        {
++            struct
++            {
++                /// uint32_t 717
++                uint32_t                 InversePixelValue179                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue179                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW717;
++        union
++        {
++            struct
++            {
++                /// uint32_t 718
++                uint32_t                 ForwardGChGammaCorrectedValue179                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue179                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW718;
++        union
++        {
++            struct
++            {
++                /// uint32_t 719
++                uint32_t                 ForwardPixelValue179                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue179                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW719;
++        union
++        {
++            struct
++            {
++                /// uint32_t 720
++                uint32_t                 InverseGChGammaCorrectedValue180                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue180                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW720;
++        union
++        {
++            struct
++            {
++                /// uint32_t 721
++                uint32_t                 InversePixelValue180                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue180                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW721;
++        union
++        {
++            struct
++            {
++                /// uint32_t 722
++                uint32_t                 ForwardGChGammaCorrectedValue180                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue180                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW722;
++        union
++        {
++            struct
++            {
++                /// uint32_t 723
++                uint32_t                 ForwardPixelValue180                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue180                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW723;
++        union
++        {
++            struct
++            {
++                /// uint32_t 724
++                uint32_t                 InverseGChGammaCorrectedValue181                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue181                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW724;
++        union
++        {
++            struct
++            {
++                /// uint32_t 725
++                uint32_t                 InversePixelValue181                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue181                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW725;
++        union
++        {
++            struct
++            {
++                /// uint32_t 726
++                uint32_t                 ForwardGChGammaCorrectedValue181                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue181                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW726;
++        union
++        {
++            struct
++            {
++                /// uint32_t 727
++                uint32_t                 ForwardPixelValue181                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue181                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW727;
++        union
++        {
++            struct
++            {
++                /// uint32_t 728
++                uint32_t                 InverseGChGammaCorrectedValue182                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue182                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW728;
++        union
++        {
++            struct
++            {
++                /// uint32_t 729
++                uint32_t                 InversePixelValue182                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue182                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW729;
++        union
++        {
++            struct
++            {
++                /// uint32_t 730
++                uint32_t                 ForwardGChGammaCorrectedValue182                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue182                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW730;
++        union
++        {
++            struct
++            {
++                /// uint32_t 731
++                uint32_t                 ForwardPixelValue182                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue182                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW731;
++        union
++        {
++            struct
++            {
++                /// uint32_t 732
++                uint32_t                 InverseGChGammaCorrectedValue183                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue183                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW732;
++        union
++        {
++            struct
++            {
++                /// uint32_t 733
++                uint32_t                 InversePixelValue183                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue183                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW733;
++        union
++        {
++            struct
++            {
++                /// uint32_t 734
++                uint32_t                 ForwardGChGammaCorrectedValue183                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue183                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW734;
++        union
++        {
++            struct
++            {
++                /// uint32_t 735
++                uint32_t                 ForwardPixelValue183                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue183                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW735;
++        union
++        {
++            struct
++            {
++                /// uint32_t 736
++                uint32_t                 InverseGChGammaCorrectedValue184                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue184                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW736;
++        union
++        {
++            struct
++            {
++                /// uint32_t 737
++                uint32_t                 InversePixelValue184                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue184                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW737;
++        union
++        {
++            struct
++            {
++                /// uint32_t 738
++                uint32_t                 ForwardGChGammaCorrectedValue184                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue184                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW738;
++        union
++        {
++            struct
++            {
++                /// uint32_t 739
++                uint32_t                 ForwardPixelValue184                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue184                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW739;
++        union
++        {
++            struct
++            {
++                /// uint32_t 740
++                uint32_t                 InverseGChGammaCorrectedValue185                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue185                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW740;
++        union
++        {
++            struct
++            {
++                /// uint32_t 741
++                uint32_t                 InversePixelValue185                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue185                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW741;
++        union
++        {
++            struct
++            {
++                /// uint32_t 742
++                uint32_t                 ForwardGChGammaCorrectedValue185                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue185                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW742;
++        union
++        {
++            struct
++            {
++                /// uint32_t 743
++                uint32_t                 ForwardPixelValue185                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue185                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW743;
++        union
++        {
++            struct
++            {
++                /// uint32_t 744
++                uint32_t                 InverseGChGammaCorrectedValue186                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue186                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW744;
++        union
++        {
++            struct
++            {
++                /// uint32_t 745
++                uint32_t                 InversePixelValue186                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue186                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW745;
++        union
++        {
++            struct
++            {
++                /// uint32_t 746
++                uint32_t                 ForwardGChGammaCorrectedValue186                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue186                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW746;
++        union
++        {
++            struct
++            {
++                /// uint32_t 747
++                uint32_t                 ForwardPixelValue186                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue186                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW747;
++        union
++        {
++            struct
++            {
++                /// uint32_t 748
++                uint32_t                 InverseGChGammaCorrectedValue187                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue187                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW748;
++        union
++        {
++            struct
++            {
++                /// uint32_t 749
++                uint32_t                 InversePixelValue187                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue187                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW749;
++        union
++        {
++            struct
++            {
++                /// uint32_t 750
++                uint32_t                 ForwardGChGammaCorrectedValue187                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue187                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW750;
++        union
++        {
++            struct
++            {
++                /// uint32_t 751
++                uint32_t                 ForwardPixelValue187                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue187                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW751;
++        union
++        {
++            struct
++            {
++                /// uint32_t 752
++                uint32_t                 InverseGChGammaCorrectedValue188                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue188                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW752;
++        union
++        {
++            struct
++            {
++                /// uint32_t 753
++                uint32_t                 InversePixelValue188                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue188                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW753;
++        union
++        {
++            struct
++            {
++                /// uint32_t 754
++                uint32_t                 ForwardGChGammaCorrectedValue188                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue188                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW754;
++        union
++        {
++            struct
++            {
++                /// uint32_t 755
++                uint32_t                 ForwardPixelValue188                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue188                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW755;
++        union
++        {
++            struct
++            {
++                /// uint32_t 756
++                uint32_t                 InverseGChGammaCorrectedValue189                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue189                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW756;
++        union
++        {
++            struct
++            {
++                /// uint32_t 757
++                uint32_t                 InversePixelValue189                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue189                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW757;
++        union
++        {
++            struct
++            {
++                /// uint32_t 758
++                uint32_t                 ForwardGChGammaCorrectedValue189                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue189                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW758;
++        union
++        {
++            struct
++            {
++                /// uint32_t 759
++                uint32_t                 ForwardPixelValue189                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue189                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW759;
++        union
++        {
++            struct
++            {
++                /// uint32_t 760
++                uint32_t                 InverseGChGammaCorrectedValue190                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue190                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW760;
++        union
++        {
++            struct
++            {
++                /// uint32_t 761
++                uint32_t                 InversePixelValue190                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue190                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW761;
++        union
++        {
++            struct
++            {
++                /// uint32_t 762
++                uint32_t                 ForwardGChGammaCorrectedValue190                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue190                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW762;
++        union
++        {
++            struct
++            {
++                /// uint32_t 763
++                uint32_t                 ForwardPixelValue190                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue190                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW763;
++        union
++        {
++            struct
++            {
++                /// uint32_t 764
++                uint32_t                 InverseGChGammaCorrectedValue191                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue191                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW764;
++        union
++        {
++            struct
++            {
++                /// uint32_t 765
++                uint32_t                 InversePixelValue191                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue191                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW765;
++        union
++        {
++            struct
++            {
++                /// uint32_t 766
++                uint32_t                 ForwardGChGammaCorrectedValue191                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue191                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW766;
++        union
++        {
++            struct
++            {
++                /// uint32_t 767
++                uint32_t                 ForwardPixelValue191                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue191                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW767;
++        union
++        {
++            struct
++            {
++                /// uint32_t 768
++                uint32_t                 InverseGChGammaCorrectedValue192                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue192                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW768;
++        union
++        {
++            struct
++            {
++                /// uint32_t 769
++                uint32_t                 InversePixelValue192                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue192                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW769;
++        union
++        {
++            struct
++            {
++                /// uint32_t 770
++                uint32_t                 ForwardGChGammaCorrectedValue192                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue192                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW770;
++        union
++        {
++            struct
++            {
++                /// uint32_t 771
++                uint32_t                 ForwardPixelValue192                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue192                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW771;
++        union
++        {
++            struct
++            {
++                /// uint32_t 772
++                uint32_t                 InverseGChGammaCorrectedValue193                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue193                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW772;
++        union
++        {
++            struct
++            {
++                /// uint32_t 773
++                uint32_t                 InversePixelValue193                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue193                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW773;
++        union
++        {
++            struct
++            {
++                /// uint32_t 774
++                uint32_t                 ForwardGChGammaCorrectedValue193                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue193                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW774;
++        union
++        {
++            struct
++            {
++                /// uint32_t 775
++                uint32_t                 ForwardPixelValue193                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue193                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW775;
++        union
++        {
++            struct
++            {
++                /// uint32_t 776
++                uint32_t                 InverseGChGammaCorrectedValue194                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue194                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW776;
++        union
++        {
++            struct
++            {
++                /// uint32_t 777
++                uint32_t                 InversePixelValue194                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue194                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW777;
++        union
++        {
++            struct
++            {
++                /// uint32_t 778
++                uint32_t                 ForwardGChGammaCorrectedValue194                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue194                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW778;
++        union
++        {
++            struct
++            {
++                /// uint32_t 779
++                uint32_t                 ForwardPixelValue194                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue194                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW779;
++        union
++        {
++            struct
++            {
++                /// uint32_t 780
++                uint32_t                 InverseGChGammaCorrectedValue195                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue195                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW780;
++        union
++        {
++            struct
++            {
++                /// uint32_t 781
++                uint32_t                 InversePixelValue195                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue195                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW781;
++        union
++        {
++            struct
++            {
++                /// uint32_t 782
++                uint32_t                 ForwardGChGammaCorrectedValue195                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue195                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW782;
++        union
++        {
++            struct
++            {
++                /// uint32_t 783
++                uint32_t                 ForwardPixelValue195                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue195                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW783;
++        union
++        {
++            struct
++            {
++                /// uint32_t 784
++                uint32_t                 InverseGChGammaCorrectedValue196                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue196                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW784;
++        union
++        {
++            struct
++            {
++                /// uint32_t 785
++                uint32_t                 InversePixelValue196                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue196                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW785;
++        union
++        {
++            struct
++            {
++                /// uint32_t 786
++                uint32_t                 ForwardGChGammaCorrectedValue196                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue196                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW786;
++        union
++        {
++            struct
++            {
++                /// uint32_t 787
++                uint32_t                 ForwardPixelValue196                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue196                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW787;
++        union
++        {
++            struct
++            {
++                /// uint32_t 788
++                uint32_t                 InverseGChGammaCorrectedValue197                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue197                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW788;
++        union
++        {
++            struct
++            {
++                /// uint32_t 789
++                uint32_t                 InversePixelValue197                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue197                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW789;
++        union
++        {
++            struct
++            {
++                /// uint32_t 790
++                uint32_t                 ForwardGChGammaCorrectedValue197                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue197                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW790;
++        union
++        {
++            struct
++            {
++                /// uint32_t 791
++                uint32_t                 ForwardPixelValue197                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue197                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW791;
++        union
++        {
++            struct
++            {
++                /// uint32_t 792
++                uint32_t                 InverseGChGammaCorrectedValue198                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue198                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW792;
++        union
++        {
++            struct
++            {
++                /// uint32_t 793
++                uint32_t                 InversePixelValue198                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue198                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW793;
++        union
++        {
++            struct
++            {
++                /// uint32_t 794
++                uint32_t                 ForwardGChGammaCorrectedValue198                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue198                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW794;
++        union
++        {
++            struct
++            {
++                /// uint32_t 795
++                uint32_t                 ForwardPixelValue198                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue198                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW795;
++        union
++        {
++            struct
++            {
++                /// uint32_t 796
++                uint32_t                 InverseGChGammaCorrectedValue199                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue199                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW796;
++        union
++        {
++            struct
++            {
++                /// uint32_t 797
++                uint32_t                 InversePixelValue199                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue199                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW797;
++        union
++        {
++            struct
++            {
++                /// uint32_t 798
++                uint32_t                 ForwardGChGammaCorrectedValue199                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue199                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW798;
++        union
++        {
++            struct
++            {
++                /// uint32_t 799
++                uint32_t                 ForwardPixelValue199                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue199                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW799;
++        union
++        {
++            struct
++            {
++                /// uint32_t 800
++                uint32_t                 InverseGChGammaCorrectedValue200                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue200                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW800;
++        union
++        {
++            struct
++            {
++                /// uint32_t 801
++                uint32_t                 InversePixelValue200                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue200                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW801;
++        union
++        {
++            struct
++            {
++                /// uint32_t 802
++                uint32_t                 ForwardGChGammaCorrectedValue200                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue200                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW802;
++        union
++        {
++            struct
++            {
++                /// uint32_t 803
++                uint32_t                 ForwardPixelValue200                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue200                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW803;
++        union
++        {
++            struct
++            {
++                /// uint32_t 804
++                uint32_t                 InverseGChGammaCorrectedValue201                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue201                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW804;
++        union
++        {
++            struct
++            {
++                /// uint32_t 805
++                uint32_t                 InversePixelValue201                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue201                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW805;
++        union
++        {
++            struct
++            {
++                /// uint32_t 806
++                uint32_t                 ForwardGChGammaCorrectedValue201                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue201                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW806;
++        union
++        {
++            struct
++            {
++                /// uint32_t 807
++                uint32_t                 ForwardPixelValue201                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue201                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW807;
++        union
++        {
++            struct
++            {
++                /// uint32_t 808
++                uint32_t                 InverseGChGammaCorrectedValue202                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue202                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW808;
++        union
++        {
++            struct
++            {
++                /// uint32_t 809
++                uint32_t                 InversePixelValue202                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue202                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW809;
++        union
++        {
++            struct
++            {
++                /// uint32_t 810
++                uint32_t                 ForwardGChGammaCorrectedValue202                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue202                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW810;
++        union
++        {
++            struct
++            {
++                /// uint32_t 811
++                uint32_t                 ForwardPixelValue202                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue202                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW811;
++        union
++        {
++            struct
++            {
++                /// uint32_t 812
++                uint32_t                 InverseGChGammaCorrectedValue203                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue203                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW812;
++        union
++        {
++            struct
++            {
++                /// uint32_t 813
++                uint32_t                 InversePixelValue203                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue203                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW813;
++        union
++        {
++            struct
++            {
++                /// uint32_t 814
++                uint32_t                 ForwardGChGammaCorrectedValue203                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue203                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW814;
++        union
++        {
++            struct
++            {
++                /// uint32_t 815
++                uint32_t                 ForwardPixelValue203                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue203                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW815;
++        union
++        {
++            struct
++            {
++                /// uint32_t 816
++                uint32_t                 InverseGChGammaCorrectedValue204                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue204                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW816;
++        union
++        {
++            struct
++            {
++                /// uint32_t 817
++                uint32_t                 InversePixelValue204                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue204                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW817;
++        union
++        {
++            struct
++            {
++                /// uint32_t 818
++                uint32_t                 ForwardGChGammaCorrectedValue204                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue204                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW818;
++        union
++        {
++            struct
++            {
++                /// uint32_t 819
++                uint32_t                 ForwardPixelValue204                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue204                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW819;
++        union
++        {
++            struct
++            {
++                /// uint32_t 820
++                uint32_t                 InverseGChGammaCorrectedValue205                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue205                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW820;
++        union
++        {
++            struct
++            {
++                /// uint32_t 821
++                uint32_t                 InversePixelValue205                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue205                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW821;
++        union
++        {
++            struct
++            {
++                /// uint32_t 822
++                uint32_t                 ForwardGChGammaCorrectedValue205                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue205                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW822;
++        union
++        {
++            struct
++            {
++                /// uint32_t 823
++                uint32_t                 ForwardPixelValue205                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue205                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW823;
++        union
++        {
++            struct
++            {
++                /// uint32_t 824
++                uint32_t                 InverseGChGammaCorrectedValue206                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue206                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW824;
++        union
++        {
++            struct
++            {
++                /// uint32_t 825
++                uint32_t                 InversePixelValue206                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue206                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW825;
++        union
++        {
++            struct
++            {
++                /// uint32_t 826
++                uint32_t                 ForwardGChGammaCorrectedValue206                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue206                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW826;
++        union
++        {
++            struct
++            {
++                /// uint32_t 827
++                uint32_t                 ForwardPixelValue206                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue206                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW827;
++        union
++        {
++            struct
++            {
++                /// uint32_t 828
++                uint32_t                 InverseGChGammaCorrectedValue207                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue207                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW828;
++        union
++        {
++            struct
++            {
++                /// uint32_t 829
++                uint32_t                 InversePixelValue207                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue207                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW829;
++        union
++        {
++            struct
++            {
++                /// uint32_t 830
++                uint32_t                 ForwardGChGammaCorrectedValue207                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue207                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW830;
++        union
++        {
++            struct
++            {
++                /// uint32_t 831
++                uint32_t                 ForwardPixelValue207                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue207                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW831;
++        union
++        {
++            struct
++            {
++                /// uint32_t 832
++                uint32_t                 InverseGChGammaCorrectedValue208                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue208                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW832;
++        union
++        {
++            struct
++            {
++                /// uint32_t 833
++                uint32_t                 InversePixelValue208                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue208                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW833;
++        union
++        {
++            struct
++            {
++                /// uint32_t 834
++                uint32_t                 ForwardGChGammaCorrectedValue208                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue208                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW834;
++        union
++        {
++            struct
++            {
++                /// uint32_t 835
++                uint32_t                 ForwardPixelValue208                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue208                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW835;
++        union
++        {
++            struct
++            {
++                /// uint32_t 836
++                uint32_t                 InverseGChGammaCorrectedValue209                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue209                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW836;
++        union
++        {
++            struct
++            {
++                /// uint32_t 837
++                uint32_t                 InversePixelValue209                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue209                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW837;
++        union
++        {
++            struct
++            {
++                /// uint32_t 838
++                uint32_t                 ForwardGChGammaCorrectedValue209                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue209                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW838;
++        union
++        {
++            struct
++            {
++                /// uint32_t 839
++                uint32_t                 ForwardPixelValue209                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue209                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW839;
++        union
++        {
++            struct
++            {
++                /// uint32_t 840
++                uint32_t                 InverseGChGammaCorrectedValue210                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue210                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW840;
++        union
++        {
++            struct
++            {
++                /// uint32_t 841
++                uint32_t                 InversePixelValue210                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue210                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW841;
++        union
++        {
++            struct
++            {
++                /// uint32_t 842
++                uint32_t                 ForwardGChGammaCorrectedValue210                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue210                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW842;
++        union
++        {
++            struct
++            {
++                /// uint32_t 843
++                uint32_t                 ForwardPixelValue210                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue210                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW843;
++        union
++        {
++            struct
++            {
++                /// uint32_t 844
++                uint32_t                 InverseGChGammaCorrectedValue211                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue211                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW844;
++        union
++        {
++            struct
++            {
++                /// uint32_t 845
++                uint32_t                 InversePixelValue211                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue211                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW845;
++        union
++        {
++            struct
++            {
++                /// uint32_t 846
++                uint32_t                 ForwardGChGammaCorrectedValue211                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue211                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW846;
++        union
++        {
++            struct
++            {
++                /// uint32_t 847
++                uint32_t                 ForwardPixelValue211                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue211                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW847;
++        union
++        {
++            struct
++            {
++                /// uint32_t 848
++                uint32_t                 InverseGChGammaCorrectedValue212                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue212                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW848;
++        union
++        {
++            struct
++            {
++                /// uint32_t 849
++                uint32_t                 InversePixelValue212                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue212                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW849;
++        union
++        {
++            struct
++            {
++                /// uint32_t 850
++                uint32_t                 ForwardGChGammaCorrectedValue212                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue212                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW850;
++        union
++        {
++            struct
++            {
++                /// uint32_t 851
++                uint32_t                 ForwardPixelValue212                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue212                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW851;
++        union
++        {
++            struct
++            {
++                /// uint32_t 852
++                uint32_t                 InverseGChGammaCorrectedValue213                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue213                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW852;
++        union
++        {
++            struct
++            {
++                /// uint32_t 853
++                uint32_t                 InversePixelValue213                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue213                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW853;
++        union
++        {
++            struct
++            {
++                /// uint32_t 854
++                uint32_t                 ForwardGChGammaCorrectedValue213                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue213                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW854;
++        union
++        {
++            struct
++            {
++                /// uint32_t 855
++                uint32_t                 ForwardPixelValue213                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue213                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW855;
++        union
++        {
++            struct
++            {
++                /// uint32_t 856
++                uint32_t                 InverseGChGammaCorrectedValue214                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue214                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW856;
++        union
++        {
++            struct
++            {
++                /// uint32_t 857
++                uint32_t                 InversePixelValue214                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue214                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW857;
++        union
++        {
++            struct
++            {
++                /// uint32_t 858
++                uint32_t                 ForwardGChGammaCorrectedValue214                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue214                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW858;
++        union
++        {
++            struct
++            {
++                /// uint32_t 859
++                uint32_t                 ForwardPixelValue214                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue214                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW859;
++        union
++        {
++            struct
++            {
++                /// uint32_t 860
++                uint32_t                 InverseGChGammaCorrectedValue215                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue215                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW860;
++        union
++        {
++            struct
++            {
++                /// uint32_t 861
++                uint32_t                 InversePixelValue215                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue215                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW861;
++        union
++        {
++            struct
++            {
++                /// uint32_t 862
++                uint32_t                 ForwardGChGammaCorrectedValue215                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue215                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW862;
++        union
++        {
++            struct
++            {
++                /// uint32_t 863
++                uint32_t                 ForwardPixelValue215                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue215                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW863;
++        union
++        {
++            struct
++            {
++                /// uint32_t 864
++                uint32_t                 InverseGChGammaCorrectedValue216                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue216                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW864;
++        union
++        {
++            struct
++            {
++                /// uint32_t 865
++                uint32_t                 InversePixelValue216                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue216                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW865;
++        union
++        {
++            struct
++            {
++                /// uint32_t 866
++                uint32_t                 ForwardGChGammaCorrectedValue216                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue216                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW866;
++        union
++        {
++            struct
++            {
++                /// uint32_t 867
++                uint32_t                 ForwardPixelValue216                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue216                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW867;
++        union
++        {
++            struct
++            {
++                /// uint32_t 868
++                uint32_t                 InverseGChGammaCorrectedValue217                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue217                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW868;
++        union
++        {
++            struct
++            {
++                /// uint32_t 869
++                uint32_t                 InversePixelValue217                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue217                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW869;
++        union
++        {
++            struct
++            {
++                /// uint32_t 870
++                uint32_t                 ForwardGChGammaCorrectedValue217                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue217                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW870;
++        union
++        {
++            struct
++            {
++                /// uint32_t 871
++                uint32_t                 ForwardPixelValue217                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue217                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW871;
++        union
++        {
++            struct
++            {
++                /// uint32_t 872
++                uint32_t                 InverseGChGammaCorrectedValue218                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue218                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW872;
++        union
++        {
++            struct
++            {
++                /// uint32_t 873
++                uint32_t                 InversePixelValue218                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue218                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW873;
++        union
++        {
++            struct
++            {
++                /// uint32_t 874
++                uint32_t                 ForwardGChGammaCorrectedValue218                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue218                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW874;
++        union
++        {
++            struct
++            {
++                /// uint32_t 875
++                uint32_t                 ForwardPixelValue218                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue218                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW875;
++        union
++        {
++            struct
++            {
++                /// uint32_t 876
++                uint32_t                 InverseGChGammaCorrectedValue219                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue219                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW876;
++        union
++        {
++            struct
++            {
++                /// uint32_t 877
++                uint32_t                 InversePixelValue219                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue219                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW877;
++        union
++        {
++            struct
++            {
++                /// uint32_t 878
++                uint32_t                 ForwardGChGammaCorrectedValue219                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue219                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW878;
++        union
++        {
++            struct
++            {
++                /// uint32_t 879
++                uint32_t                 ForwardPixelValue219                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue219                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW879;
++        union
++        {
++            struct
++            {
++                /// uint32_t 880
++                uint32_t                 InverseGChGammaCorrectedValue220                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue220                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW880;
++        union
++        {
++            struct
++            {
++                /// uint32_t 881
++                uint32_t                 InversePixelValue220                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue220                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW881;
++        union
++        {
++            struct
++            {
++                /// uint32_t 882
++                uint32_t                 ForwardGChGammaCorrectedValue220                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue220                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW882;
++        union
++        {
++            struct
++            {
++                /// uint32_t 883
++                uint32_t                 ForwardPixelValue220                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue220                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW883;
++        union
++        {
++            struct
++            {
++                /// uint32_t 884
++                uint32_t                 InverseGChGammaCorrectedValue221                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue221                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW884;
++        union
++        {
++            struct
++            {
++                /// uint32_t 885
++                uint32_t                 InversePixelValue221                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue221                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW885;
++        union
++        {
++            struct
++            {
++                /// uint32_t 886
++                uint32_t                 ForwardGChGammaCorrectedValue221                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue221                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW886;
++        union
++        {
++            struct
++            {
++                /// uint32_t 887
++                uint32_t                 ForwardPixelValue221                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue221                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW887;
++        union
++        {
++            struct
++            {
++                /// uint32_t 888
++                uint32_t                 InverseGChGammaCorrectedValue222                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue222                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW888;
++        union
++        {
++            struct
++            {
++                /// uint32_t 889
++                uint32_t                 InversePixelValue222                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue222                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW889;
++        union
++        {
++            struct
++            {
++                /// uint32_t 890
++                uint32_t                 ForwardGChGammaCorrectedValue222                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue222                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW890;
++        union
++        {
++            struct
++            {
++                /// uint32_t 891
++                uint32_t                 ForwardPixelValue222                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue222                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW891;
++        union
++        {
++            struct
++            {
++                /// uint32_t 892
++                uint32_t                 InverseGChGammaCorrectedValue223                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue223                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW892;
++        union
++        {
++            struct
++            {
++                /// uint32_t 893
++                uint32_t                 InversePixelValue223                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue223                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW893;
++        union
++        {
++            struct
++            {
++                /// uint32_t 894
++                uint32_t                 ForwardGChGammaCorrectedValue223                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue223                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW894;
++        union
++        {
++            struct
++            {
++                /// uint32_t 895
++                uint32_t                 ForwardPixelValue223                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue223                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW895;
++        union
++        {
++            struct
++            {
++                /// uint32_t 896
++                uint32_t                 InverseGChGammaCorrectedValue224                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue224                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW896;
++        union
++        {
++            struct
++            {
++                /// uint32_t 897
++                uint32_t                 InversePixelValue224                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue224                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW897;
++        union
++        {
++            struct
++            {
++                /// uint32_t 898
++                uint32_t                 ForwardGChGammaCorrectedValue224                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue224                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW898;
++        union
++        {
++            struct
++            {
++                /// uint32_t 899
++                uint32_t                 ForwardPixelValue224                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue224                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW899;
++        union
++        {
++            struct
++            {
++                /// uint32_t 900
++                uint32_t                 InverseGChGammaCorrectedValue225                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue225                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW900;
++        union
++        {
++            struct
++            {
++                /// uint32_t 901
++                uint32_t                 InversePixelValue225                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue225                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW901;
++        union
++        {
++            struct
++            {
++                /// uint32_t 902
++                uint32_t                 ForwardGChGammaCorrectedValue225                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue225                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW902;
++        union
++        {
++            struct
++            {
++                /// uint32_t 903
++                uint32_t                 ForwardPixelValue225                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue225                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW903;
++        union
++        {
++            struct
++            {
++                /// uint32_t 904
++                uint32_t                 InverseGChGammaCorrectedValue226                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue226                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW904;
++        union
++        {
++            struct
++            {
++                /// uint32_t 905
++                uint32_t                 InversePixelValue226                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue226                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW905;
++        union
++        {
++            struct
++            {
++                /// uint32_t 906
++                uint32_t                 ForwardGChGammaCorrectedValue226                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue226                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW906;
++        union
++        {
++            struct
++            {
++                /// uint32_t 907
++                uint32_t                 ForwardPixelValue226                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue226                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW907;
++        union
++        {
++            struct
++            {
++                /// uint32_t 908
++                uint32_t                 InverseGChGammaCorrectedValue227                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue227                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW908;
++        union
++        {
++            struct
++            {
++                /// uint32_t 909
++                uint32_t                 InversePixelValue227                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue227                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW909;
++        union
++        {
++            struct
++            {
++                /// uint32_t 910
++                uint32_t                 ForwardGChGammaCorrectedValue227                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue227                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW910;
++        union
++        {
++            struct
++            {
++                /// uint32_t 911
++                uint32_t                 ForwardPixelValue227                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue227                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW911;
++        union
++        {
++            struct
++            {
++                /// uint32_t 912
++                uint32_t                 InverseGChGammaCorrectedValue228                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue228                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW912;
++        union
++        {
++            struct
++            {
++                /// uint32_t 913
++                uint32_t                 InversePixelValue228                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue228                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW913;
++        union
++        {
++            struct
++            {
++                /// uint32_t 914
++                uint32_t                 ForwardGChGammaCorrectedValue228                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue228                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW914;
++        union
++        {
++            struct
++            {
++                /// uint32_t 915
++                uint32_t                 ForwardPixelValue228                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue228                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW915;
++        union
++        {
++            struct
++            {
++                /// uint32_t 916
++                uint32_t                 InverseGChGammaCorrectedValue229                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue229                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW916;
++        union
++        {
++            struct
++            {
++                /// uint32_t 917
++                uint32_t                 InversePixelValue229                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue229                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW917;
++        union
++        {
++            struct
++            {
++                /// uint32_t 918
++                uint32_t                 ForwardGChGammaCorrectedValue229                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue229                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW918;
++        union
++        {
++            struct
++            {
++                /// uint32_t 919
++                uint32_t                 ForwardPixelValue229                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue229                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW919;
++        union
++        {
++            struct
++            {
++                /// uint32_t 920
++                uint32_t                 InverseGChGammaCorrectedValue230                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue230                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW920;
++        union
++        {
++            struct
++            {
++                /// uint32_t 921
++                uint32_t                 InversePixelValue230                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue230                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW921;
++        union
++        {
++            struct
++            {
++                /// uint32_t 922
++                uint32_t                 ForwardGChGammaCorrectedValue230                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue230                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW922;
++        union
++        {
++            struct
++            {
++                /// uint32_t 923
++                uint32_t                 ForwardPixelValue230                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue230                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW923;
++        union
++        {
++            struct
++            {
++                /// uint32_t 924
++                uint32_t                 InverseGChGammaCorrectedValue231                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue231                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW924;
++        union
++        {
++            struct
++            {
++                /// uint32_t 925
++                uint32_t                 InversePixelValue231                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue231                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW925;
++        union
++        {
++            struct
++            {
++                /// uint32_t 926
++                uint32_t                 ForwardGChGammaCorrectedValue231                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue231                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW926;
++        union
++        {
++            struct
++            {
++                /// uint32_t 927
++                uint32_t                 ForwardPixelValue231                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue231                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW927;
++        union
++        {
++            struct
++            {
++                /// uint32_t 928
++                uint32_t                 InverseGChGammaCorrectedValue232                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue232                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW928;
++        union
++        {
++            struct
++            {
++                /// uint32_t 929
++                uint32_t                 InversePixelValue232                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue232                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW929;
++        union
++        {
++            struct
++            {
++                /// uint32_t 930
++                uint32_t                 ForwardGChGammaCorrectedValue232                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue232                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW930;
++        union
++        {
++            struct
++            {
++                /// uint32_t 931
++                uint32_t                 ForwardPixelValue232                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue232                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW931;
++        union
++        {
++            struct
++            {
++                /// uint32_t 932
++                uint32_t                 InverseGChGammaCorrectedValue233                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue233                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW932;
++        union
++        {
++            struct
++            {
++                /// uint32_t 933
++                uint32_t                 InversePixelValue233                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue233                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW933;
++        union
++        {
++            struct
++            {
++                /// uint32_t 934
++                uint32_t                 ForwardGChGammaCorrectedValue233                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue233                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW934;
++        union
++        {
++            struct
++            {
++                /// uint32_t 935
++                uint32_t                 ForwardPixelValue233                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue233                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW935;
++        union
++        {
++            struct
++            {
++                /// uint32_t 936
++                uint32_t                 InverseGChGammaCorrectedValue234                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue234                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW936;
++        union
++        {
++            struct
++            {
++                /// uint32_t 937
++                uint32_t                 InversePixelValue234                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue234                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW937;
++        union
++        {
++            struct
++            {
++                /// uint32_t 938
++                uint32_t                 ForwardGChGammaCorrectedValue234                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue234                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW938;
++        union
++        {
++            struct
++            {
++                /// uint32_t 939
++                uint32_t                 ForwardPixelValue234                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue234                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW939;
++        union
++        {
++            struct
++            {
++                /// uint32_t 940
++                uint32_t                 InverseGChGammaCorrectedValue235                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue235                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW940;
++        union
++        {
++            struct
++            {
++                /// uint32_t 941
++                uint32_t                 InversePixelValue235                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue235                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW941;
++        union
++        {
++            struct
++            {
++                /// uint32_t 942
++                uint32_t                 ForwardGChGammaCorrectedValue235                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue235                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW942;
++        union
++        {
++            struct
++            {
++                /// uint32_t 943
++                uint32_t                 ForwardPixelValue235                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue235                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW943;
++        union
++        {
++            struct
++            {
++                /// uint32_t 944
++                uint32_t                 InverseGChGammaCorrectedValue236                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue236                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW944;
++        union
++        {
++            struct
++            {
++                /// uint32_t 945
++                uint32_t                 InversePixelValue236                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue236                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW945;
++        union
++        {
++            struct
++            {
++                /// uint32_t 946
++                uint32_t                 ForwardGChGammaCorrectedValue236                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue236                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW946;
++        union
++        {
++            struct
++            {
++                /// uint32_t 947
++                uint32_t                 ForwardPixelValue236                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue236                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW947;
++        union
++        {
++            struct
++            {
++                /// uint32_t 948
++                uint32_t                 InverseGChGammaCorrectedValue237                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue237                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW948;
++        union
++        {
++            struct
++            {
++                /// uint32_t 949
++                uint32_t                 InversePixelValue237                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue237                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW949;
++        union
++        {
++            struct
++            {
++                /// uint32_t 950
++                uint32_t                 ForwardGChGammaCorrectedValue237                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue237                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW950;
++        union
++        {
++            struct
++            {
++                /// uint32_t 951
++                uint32_t                 ForwardPixelValue237                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue237                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW951;
++        union
++        {
++            struct
++            {
++                /// uint32_t 952
++                uint32_t                 InverseGChGammaCorrectedValue238                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue238                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW952;
++        union
++        {
++            struct
++            {
++                /// uint32_t 953
++                uint32_t                 InversePixelValue238                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue238                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW953;
++        union
++        {
++            struct
++            {
++                /// uint32_t 954
++                uint32_t                 ForwardGChGammaCorrectedValue238                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue238                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW954;
++        union
++        {
++            struct
++            {
++                /// uint32_t 955
++                uint32_t                 ForwardPixelValue238                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue238                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW955;
++        union
++        {
++            struct
++            {
++                /// uint32_t 956
++                uint32_t                 InverseGChGammaCorrectedValue239                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue239                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW956;
++        union
++        {
++            struct
++            {
++                /// uint32_t 957
++                uint32_t                 InversePixelValue239                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue239                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW957;
++        union
++        {
++            struct
++            {
++                /// uint32_t 958
++                uint32_t                 ForwardGChGammaCorrectedValue239                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue239                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW958;
++        union
++        {
++            struct
++            {
++                /// uint32_t 959
++                uint32_t                 ForwardPixelValue239                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue239                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW959;
++        union
++        {
++            struct
++            {
++                /// uint32_t 960
++                uint32_t                 InverseGChGammaCorrectedValue240                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue240                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW960;
++        union
++        {
++            struct
++            {
++                /// uint32_t 961
++                uint32_t                 InversePixelValue240                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue240                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW961;
++        union
++        {
++            struct
++            {
++                /// uint32_t 962
++                uint32_t                 ForwardGChGammaCorrectedValue240                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue240                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW962;
++        union
++        {
++            struct
++            {
++                /// uint32_t 963
++                uint32_t                 ForwardPixelValue240                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue240                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW963;
++        union
++        {
++            struct
++            {
++                /// uint32_t 964
++                uint32_t                 InverseGChGammaCorrectedValue241                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue241                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW964;
++        union
++        {
++            struct
++            {
++                /// uint32_t 965
++                uint32_t                 InversePixelValue241                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue241                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW965;
++        union
++        {
++            struct
++            {
++                /// uint32_t 966
++                uint32_t                 ForwardGChGammaCorrectedValue241                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue241                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW966;
++        union
++        {
++            struct
++            {
++                /// uint32_t 967
++                uint32_t                 ForwardPixelValue241                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue241                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW967;
++        union
++        {
++            struct
++            {
++                /// uint32_t 968
++                uint32_t                 InverseGChGammaCorrectedValue242                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue242                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW968;
++        union
++        {
++            struct
++            {
++                /// uint32_t 969
++                uint32_t                 InversePixelValue242                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue242                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW969;
++        union
++        {
++            struct
++            {
++                /// uint32_t 970
++                uint32_t                 ForwardGChGammaCorrectedValue242                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue242                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW970;
++        union
++        {
++            struct
++            {
++                /// uint32_t 971
++                uint32_t                 ForwardPixelValue242                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue242                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW971;
++        union
++        {
++            struct
++            {
++                /// uint32_t 972
++                uint32_t                 InverseGChGammaCorrectedValue243                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue243                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW972;
++        union
++        {
++            struct
++            {
++                /// uint32_t 973
++                uint32_t                 InversePixelValue243                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue243                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW973;
++        union
++        {
++            struct
++            {
++                /// uint32_t 974
++                uint32_t                 ForwardGChGammaCorrectedValue243                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue243                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW974;
++        union
++        {
++            struct
++            {
++                /// uint32_t 975
++                uint32_t                 ForwardPixelValue243                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue243                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW975;
++        union
++        {
++            struct
++            {
++                /// uint32_t 976
++                uint32_t                 InverseGChGammaCorrectedValue244                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue244                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW976;
++        union
++        {
++            struct
++            {
++                /// uint32_t 977
++                uint32_t                 InversePixelValue244                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue244                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW977;
++        union
++        {
++            struct
++            {
++                /// uint32_t 978
++                uint32_t                 ForwardGChGammaCorrectedValue244                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue244                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW978;
++        union
++        {
++            struct
++            {
++                /// uint32_t 979
++                uint32_t                 ForwardPixelValue244                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue244                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW979;
++        union
++        {
++            struct
++            {
++                /// uint32_t 980
++                uint32_t                 InverseGChGammaCorrectedValue245                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue245                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW980;
++        union
++        {
++            struct
++            {
++                /// uint32_t 981
++                uint32_t                 InversePixelValue245                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue245                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW981;
++        union
++        {
++            struct
++            {
++                /// uint32_t 982
++                uint32_t                 ForwardGChGammaCorrectedValue245                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue245                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW982;
++        union
++        {
++            struct
++            {
++                /// uint32_t 983
++                uint32_t                 ForwardPixelValue245                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue245                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW983;
++        union
++        {
++            struct
++            {
++                /// uint32_t 984
++                uint32_t                 InverseGChGammaCorrectedValue246                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue246                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW984;
++        union
++        {
++            struct
++            {
++                /// uint32_t 985
++                uint32_t                 InversePixelValue246                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue246                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW985;
++        union
++        {
++            struct
++            {
++                /// uint32_t 986
++                uint32_t                 ForwardGChGammaCorrectedValue246                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue246                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW986;
++        union
++        {
++            struct
++            {
++                /// uint32_t 987
++                uint32_t                 ForwardPixelValue246                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue246                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW987;
++        union
++        {
++            struct
++            {
++                /// uint32_t 988
++                uint32_t                 InverseGChGammaCorrectedValue247                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue247                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW988;
++        union
++        {
++            struct
++            {
++                /// uint32_t 989
++                uint32_t                 InversePixelValue247                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue247                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW989;
++        union
++        {
++            struct
++            {
++                /// uint32_t 990
++                uint32_t                 ForwardGChGammaCorrectedValue247                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue247                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW990;
++        union
++        {
++            struct
++            {
++                /// uint32_t 991
++                uint32_t                 ForwardPixelValue247                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue247                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW991;
++        union
++        {
++            struct
++            {
++                /// uint32_t 992
++                uint32_t                 InverseGChGammaCorrectedValue248                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue248                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW992;
++        union
++        {
++            struct
++            {
++                /// uint32_t 993
++                uint32_t                 InversePixelValue248                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue248                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW993;
++        union
++        {
++            struct
++            {
++                /// uint32_t 994
++                uint32_t                 ForwardGChGammaCorrectedValue248                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue248                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW994;
++        union
++        {
++            struct
++            {
++                /// uint32_t 995
++                uint32_t                 ForwardPixelValue248                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue248                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW995;
++        union
++        {
++            struct
++            {
++                /// uint32_t 996
++                uint32_t                 InverseGChGammaCorrectedValue249                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue249                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW996;
++        union
++        {
++            struct
++            {
++                /// uint32_t 997
++                uint32_t                 InversePixelValue249                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue249                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW997;
++        union
++        {
++            struct
++            {
++                /// uint32_t 998
++                uint32_t                 ForwardGChGammaCorrectedValue249                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue249                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW998;
++        union
++        {
++            struct
++            {
++                /// uint32_t 999
++                uint32_t                 ForwardPixelValue249                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue249                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW999;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1000
++                uint32_t                 InverseGChGammaCorrectedValue250                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue250                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1000;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1001
++                uint32_t                 InversePixelValue250                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue250                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1001;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1002
++                uint32_t                 ForwardGChGammaCorrectedValue250                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue250                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1002;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1003
++                uint32_t                 ForwardPixelValue250                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue250                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1003;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1004
++                uint32_t                 InverseGChGammaCorrectedValue251                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue251                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1004;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1005
++                uint32_t                 InversePixelValue251                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue251                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1005;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1006
++                uint32_t                 ForwardGChGammaCorrectedValue251                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue251                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1006;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1007
++                uint32_t                 ForwardPixelValue251                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue251                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1007;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1008
++                uint32_t                 InverseGChGammaCorrectedValue252                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue252                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1008;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1009
++                uint32_t                 InversePixelValue252                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue252                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1009;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1010
++                uint32_t                 ForwardGChGammaCorrectedValue252                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue252                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1010;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1011
++                uint32_t                 ForwardPixelValue252                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue252                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1011;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1012
++                uint32_t                 InverseGChGammaCorrectedValue253                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue253                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1012;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1013
++                uint32_t                 InversePixelValue253                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue253                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1013;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1014
++                uint32_t                 ForwardGChGammaCorrectedValue253                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue253                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1014;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1015
++                uint32_t                 ForwardPixelValue253                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue253                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1015;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1016
++                uint32_t                 InverseGChGammaCorrectedValue254                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue254                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1016;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1017
++                uint32_t                 InversePixelValue254                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue254                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1017;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1018
++                uint32_t                 ForwardGChGammaCorrectedValue254                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue254                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1018;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1019
++                uint32_t                 ForwardPixelValue254                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue254                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1019;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1020
++                uint32_t                 InverseGChGammaCorrectedValue255                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseBChGammaCorrectedValue255                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1020;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1021
++                uint32_t                 InversePixelValue255                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 InverseRChGammaCorrectedValue255                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1021;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1022
++                uint32_t                 ForwardGChGammaCorrectedValue255                 : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardBChGammaCorrectedValue255                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1022;
++        union
++        {
++            struct
++            {
++                /// uint32_t 1023
++                uint32_t                 ForwardPixelValue255                             : __CODEGEN_BITFIELD( 0, 15)    ; ///< U16
++                uint32_t                 ForwardRChGammaCorrectedValue255                 : __CODEGEN_BITFIELD(16, 31)    ; ///< U16
++            };
++            uint32_t                     Value;
++        } DW1023;
++
++        //! \name Local enumerations
++
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_0
++        {
++            INVERSE_PIXEL_VALUE_0_UNNAMED0                                   = 0, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_0
++        {
++            FORWARD_PIXEL_VALUE_0_UNNAMED0                                   = 0, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_0
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0                    = 0, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_1
++        {
++            INVERSE_PIXEL_VALUE_1_UNNAMED256                                 = 256, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_1
++        {
++            FORWARD_PIXEL_VALUE_1_UNNAMED256                                 = 256, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_1
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256                  = 256, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_2
++        {
++            INVERSE_PIXEL_VALUE_2_UNNAMED512                                 = 512, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_2
++        {
++            FORWARD_PIXEL_VALUE_2_UNNAMED512                                 = 512, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_2
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512                  = 512, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_3
++        {
++            INVERSE_PIXEL_VALUE_3_UNNAMED768                                 = 768, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_3
++        {
++            FORWARD_PIXEL_VALUE_3_UNNAMED768                                 = 768, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_3
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768                  = 768, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_4
++        {
++            INVERSE_PIXEL_VALUE_4_UNNAMED1024                                = 1024, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_4
++        {
++            FORWARD_PIXEL_VALUE_4_UNNAMED1024                                = 1024, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_4
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024                 = 1024, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_5
++        {
++            INVERSE_PIXEL_VALUE_5_UNNAMED1280                                = 1280, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_5
++        {
++            FORWARD_PIXEL_VALUE_5_UNNAMED1280                                = 1280, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_5
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280                 = 1280, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_6
++        {
++            INVERSE_PIXEL_VALUE_6_UNNAMED1536                                = 1536, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_6
++        {
++            FORWARD_PIXEL_VALUE_6_UNNAMED1536                                = 1536, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_6
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536                 = 1536, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_7
++        {
++            INVERSE_PIXEL_VALUE_7_UNNAMED1792                                = 1792, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_7
++        {
++            FORWARD_PIXEL_VALUE_7_UNNAMED1792                                = 1792, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_7
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792                 = 1792, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_8
++        {
++            INVERSE_PIXEL_VALUE_8_UNNAMED2048                                = 2048, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_8
++        {
++            FORWARD_PIXEL_VALUE_8_UNNAMED2048                                = 2048, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_8
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048                 = 2048, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_9
++        {
++            INVERSE_PIXEL_VALUE_9_UNNAMED2304                                = 2304, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_9
++        {
++            FORWARD_PIXEL_VALUE_9_UNNAMED2304                                = 2304, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_9
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304                 = 2304, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_10
++        {
++            INVERSE_PIXEL_VALUE_10_UNNAMED2560                               = 2560, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_10
++        {
++            FORWARD_PIXEL_VALUE_10_UNNAMED2560                               = 2560, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_10
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560                = 2560, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_11
++        {
++            INVERSE_PIXEL_VALUE_11_UNNAMED2816                               = 2816, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_11
++        {
++            FORWARD_PIXEL_VALUE_11_UNNAMED2816                               = 2816, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_11
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816                = 2816, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_12
++        {
++            INVERSE_PIXEL_VALUE_12_UNNAMED3072                               = 3072, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_12
++        {
++            FORWARD_PIXEL_VALUE_12_UNNAMED3072                               = 3072, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_12
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072                = 3072, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_13
++        {
++            INVERSE_PIXEL_VALUE_13_UNNAMED3328                               = 3328, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_13
++        {
++            FORWARD_PIXEL_VALUE_13_UNNAMED3328                               = 3328, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_13
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328                = 3328, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_14
++        {
++            INVERSE_PIXEL_VALUE_14_UNNAMED3584                               = 3584, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_14
++        {
++            FORWARD_PIXEL_VALUE_14_UNNAMED3584                               = 3584, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_14
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584                = 3584, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_15
++        {
++            INVERSE_PIXEL_VALUE_15_UNNAMED3840                               = 3840, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_15
++        {
++            FORWARD_PIXEL_VALUE_15_UNNAMED3840                               = 3840, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_15
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840                = 3840, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_16
++        {
++            INVERSE_PIXEL_VALUE_16_UNNAMED4096                               = 4096, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_16
++        {
++            FORWARD_PIXEL_VALUE_16_UNNAMED4096                               = 4096, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_16
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096                = 4096, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_17
++        {
++            INVERSE_PIXEL_VALUE_17_UNNAMED4352                               = 4352, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_17
++        {
++            FORWARD_PIXEL_VALUE_17_UNNAMED4352                               = 4352, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_17
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352                = 4352, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_18
++        {
++            INVERSE_PIXEL_VALUE_18_UNNAMED4608                               = 4608, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_18
++        {
++            FORWARD_PIXEL_VALUE_18_UNNAMED4608                               = 4608, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_18
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608                = 4608, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_19
++        {
++            INVERSE_PIXEL_VALUE_19_UNNAMED4864                               = 4864, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_19
++        {
++            FORWARD_PIXEL_VALUE_19_UNNAMED4864                               = 4864, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_19
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864                = 4864, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_20
++        {
++            INVERSE_PIXEL_VALUE_20_UNNAMED5120                               = 5120, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_20
++        {
++            FORWARD_PIXEL_VALUE_20_UNNAMED5120                               = 5120, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_20
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120                = 5120, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_21
++        {
++            INVERSE_PIXEL_VALUE_21_UNNAMED5376                               = 5376, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_21
++        {
++            FORWARD_PIXEL_VALUE_21_UNNAMED5376                               = 5376, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_21
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376                = 5376, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_22
++        {
++            INVERSE_PIXEL_VALUE_22_UNNAMED5632                               = 5632, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_22
++        {
++            FORWARD_PIXEL_VALUE_22_UNNAMED5632                               = 5632, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_22
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632                = 5632, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_23
++        {
++            INVERSE_PIXEL_VALUE_23_UNNAMED5888                               = 5888, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_23
++        {
++            FORWARD_PIXEL_VALUE_23_UNNAMED5888                               = 5888, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_23
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888                = 5888, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_24
++        {
++            INVERSE_PIXEL_VALUE_24_UNNAMED6144                               = 6144, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_24
++        {
++            FORWARD_PIXEL_VALUE_24_UNNAMED6144                               = 6144, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_24
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144                = 6144, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_25
++        {
++            INVERSE_PIXEL_VALUE_25_UNNAMED6400                               = 6400, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_25
++        {
++            FORWARD_PIXEL_VALUE_25_UNNAMED6400                               = 6400, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_25
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400                = 6400, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_26
++        {
++            INVERSE_PIXEL_VALUE_26_UNNAMED6656                               = 6656, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_26
++        {
++            FORWARD_PIXEL_VALUE_26_UNNAMED6656                               = 6656, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_26
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656                = 6656, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_27
++        {
++            INVERSE_PIXEL_VALUE_27_UNNAMED6912                               = 6912, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_27
++        {
++            FORWARD_PIXEL_VALUE_27_UNNAMED6912                               = 6912, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_27
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912                = 6912, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_28
++        {
++            INVERSE_PIXEL_VALUE_28_UNNAMED7168                               = 7168, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_28
++        {
++            FORWARD_PIXEL_VALUE_28_UNNAMED7168                               = 7168, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_28
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168                = 7168, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_29
++        {
++            INVERSE_PIXEL_VALUE_29_UNNAMED7424                               = 7424, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_29
++        {
++            FORWARD_PIXEL_VALUE_29_UNNAMED7424                               = 7424, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_29
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424                = 7424, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_30
++        {
++            INVERSE_PIXEL_VALUE_30_UNNAMED7680                               = 7680, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_30
++        {
++            FORWARD_PIXEL_VALUE_30_UNNAMED7680                               = 7680, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_30
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680                = 7680, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_31
++        {
++            INVERSE_PIXEL_VALUE_31_UNNAMED7936                               = 7936, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_31
++        {
++            FORWARD_PIXEL_VALUE_31_UNNAMED7936                               = 7936, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_31
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936                = 7936, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_32
++        {
++            INVERSE_PIXEL_VALUE_32_UNNAMED8192                               = 8192, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_32
++        {
++            FORWARD_PIXEL_VALUE_32_UNNAMED8192                               = 8192, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_32
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192                = 8192, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_33
++        {
++            INVERSE_PIXEL_VALUE_33_UNNAMED8448                               = 8448, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_33
++        {
++            FORWARD_PIXEL_VALUE_33_UNNAMED8448                               = 8448, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_33
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448                = 8448, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_34
++        {
++            INVERSE_PIXEL_VALUE_34_UNNAMED8704                               = 8704, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_34
++        {
++            FORWARD_PIXEL_VALUE_34_UNNAMED8704                               = 8704, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_34
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704                = 8704, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_35
++        {
++            INVERSE_PIXEL_VALUE_35_UNNAMED8960                               = 8960, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_35
++        {
++            FORWARD_PIXEL_VALUE_35_UNNAMED8960                               = 8960, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_35
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960                = 8960, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_36
++        {
++            INVERSE_PIXEL_VALUE_36_UNNAMED9216                               = 9216, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_36
++        {
++            FORWARD_PIXEL_VALUE_36_UNNAMED9216                               = 9216, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_36
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216                = 9216, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_37
++        {
++            INVERSE_PIXEL_VALUE_37_UNNAMED9472                               = 9472, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_37
++        {
++            FORWARD_PIXEL_VALUE_37_UNNAMED9472                               = 9472, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_37
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472                = 9472, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_38
++        {
++            INVERSE_PIXEL_VALUE_38_UNNAMED9728                               = 9728, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_38
++        {
++            FORWARD_PIXEL_VALUE_38_UNNAMED9728                               = 9728, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_38
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728                = 9728, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_39
++        {
++            INVERSE_PIXEL_VALUE_39_UNNAMED9984                               = 9984, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_39
++        {
++            FORWARD_PIXEL_VALUE_39_UNNAMED9984                               = 9984, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_39
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984                = 9984, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_40
++        {
++            INVERSE_PIXEL_VALUE_40_UNNAMED10240                              = 10240, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_40
++        {
++            FORWARD_PIXEL_VALUE_40_UNNAMED10240                              = 10240, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_40
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240               = 10240, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_41
++        {
++            INVERSE_PIXEL_VALUE_41_UNNAMED10496                              = 10496, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_41
++        {
++            FORWARD_PIXEL_VALUE_41_UNNAMED10496                              = 10496, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_41
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496               = 10496, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_42
++        {
++            INVERSE_PIXEL_VALUE_42_UNNAMED10752                              = 10752, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_42
++        {
++            FORWARD_PIXEL_VALUE_42_UNNAMED10752                              = 10752, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_42
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752               = 10752, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_43
++        {
++            INVERSE_PIXEL_VALUE_43_UNNAMED11008                              = 11008, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_43
++        {
++            FORWARD_PIXEL_VALUE_43_UNNAMED11008                              = 11008, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_43
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008               = 11008, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_44
++        {
++            INVERSE_PIXEL_VALUE_44_UNNAMED11264                              = 11264, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_44
++        {
++            FORWARD_PIXEL_VALUE_44_UNNAMED11264                              = 11264, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_44
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264               = 11264, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_45
++        {
++            INVERSE_PIXEL_VALUE_45_UNNAMED11520                              = 11520, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_45
++        {
++            FORWARD_PIXEL_VALUE_45_UNNAMED11520                              = 11520, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_45
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520               = 11520, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_46
++        {
++            INVERSE_PIXEL_VALUE_46_UNNAMED11776                              = 11776, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_46
++        {
++            FORWARD_PIXEL_VALUE_46_UNNAMED11776                              = 11776, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_46
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776               = 11776, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_47
++        {
++            INVERSE_PIXEL_VALUE_47_UNNAMED12032                              = 12032, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_47
++        {
++            FORWARD_PIXEL_VALUE_47_UNNAMED12032                              = 12032, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_47
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032               = 12032, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_48
++        {
++            INVERSE_PIXEL_VALUE_48_UNNAMED12288                              = 12288, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_48
++        {
++            FORWARD_PIXEL_VALUE_48_UNNAMED12288                              = 12288, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_48
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288               = 12288, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_49
++        {
++            INVERSE_PIXEL_VALUE_49_UNNAMED12544                              = 12544, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_49
++        {
++            FORWARD_PIXEL_VALUE_49_UNNAMED12544                              = 12544, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_49
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544               = 12544, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_50
++        {
++            INVERSE_PIXEL_VALUE_50_UNNAMED12800                              = 12800, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_50
++        {
++            FORWARD_PIXEL_VALUE_50_UNNAMED12800                              = 12800, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_50
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800               = 12800, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_51
++        {
++            INVERSE_PIXEL_VALUE_51_UNNAMED13056                              = 13056, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_51
++        {
++            FORWARD_PIXEL_VALUE_51_UNNAMED13056                              = 13056, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_51
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056               = 13056, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_52
++        {
++            INVERSE_PIXEL_VALUE_52_UNNAMED13312                              = 13312, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_52
++        {
++            FORWARD_PIXEL_VALUE_52_UNNAMED13312                              = 13312, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_52
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312               = 13312, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_53
++        {
++            INVERSE_PIXEL_VALUE_53_UNNAMED13568                              = 13568, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_53
++        {
++            FORWARD_PIXEL_VALUE_53_UNNAMED13568                              = 13568, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_53
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568               = 13568, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_54
++        {
++            INVERSE_PIXEL_VALUE_54_UNNAMED13824                              = 13824, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_54
++        {
++            FORWARD_PIXEL_VALUE_54_UNNAMED13824                              = 13824, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_54
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824               = 13824, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_55
++        {
++            INVERSE_PIXEL_VALUE_55_UNNAMED14080                              = 14080, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_55
++        {
++            FORWARD_PIXEL_VALUE_55_UNNAMED14080                              = 14080, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_55
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080               = 14080, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_56
++        {
++            INVERSE_PIXEL_VALUE_56_UNNAMED14336                              = 14336, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_56
++        {
++            FORWARD_PIXEL_VALUE_56_UNNAMED14336                              = 14336, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_56
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336               = 14336, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_57
++        {
++            INVERSE_PIXEL_VALUE_57_UNNAMED14592                              = 14592, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_57
++        {
++            FORWARD_PIXEL_VALUE_57_UNNAMED14592                              = 14592, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_57
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592               = 14592, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_58
++        {
++            INVERSE_PIXEL_VALUE_58_UNNAMED14848                              = 14848, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_58
++        {
++            FORWARD_PIXEL_VALUE_58_UNNAMED14848                              = 14848, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_58
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848               = 14848, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_59
++        {
++            INVERSE_PIXEL_VALUE_59_UNNAMED15104                              = 15104, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_59
++        {
++            FORWARD_PIXEL_VALUE_59_UNNAMED15104                              = 15104, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_59
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104               = 15104, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_60
++        {
++            INVERSE_PIXEL_VALUE_60_UNNAMED15360                              = 15360, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_60
++        {
++            FORWARD_PIXEL_VALUE_60_UNNAMED15360                              = 15360, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_60
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360               = 15360, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_61
++        {
++            INVERSE_PIXEL_VALUE_61_UNNAMED15616                              = 15616, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_61
++        {
++            FORWARD_PIXEL_VALUE_61_UNNAMED15616                              = 15616, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_61
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616               = 15616, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_62
++        {
++            INVERSE_PIXEL_VALUE_62_UNNAMED15872                              = 15872, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_62
++        {
++            FORWARD_PIXEL_VALUE_62_UNNAMED15872                              = 15872, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_62
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872               = 15872, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_63
++        {
++            INVERSE_PIXEL_VALUE_63_UNNAMED16128                              = 16128, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_63
++        {
++            FORWARD_PIXEL_VALUE_63_UNNAMED16128                              = 16128, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_63
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128               = 16128, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_64
++        {
++            INVERSE_PIXEL_VALUE_64_UNNAMED16384                              = 16384, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_64
++        {
++            FORWARD_PIXEL_VALUE_64_UNNAMED16384                              = 16384, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_64
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384               = 16384, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_65
++        {
++            INVERSE_PIXEL_VALUE_65_UNNAMED16640                              = 16640, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_65
++        {
++            FORWARD_PIXEL_VALUE_65_UNNAMED16640                              = 16640, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_65
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640               = 16640, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_66
++        {
++            INVERSE_PIXEL_VALUE_66_UNNAMED16896                              = 16896, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_66
++        {
++            FORWARD_PIXEL_VALUE_66_UNNAMED16896                              = 16896, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_66
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896               = 16896, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_67
++        {
++            INVERSE_PIXEL_VALUE_67_UNNAMED17152                              = 17152, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_67
++        {
++            FORWARD_PIXEL_VALUE_67_UNNAMED17152                              = 17152, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_67
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152               = 17152, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_68
++        {
++            INVERSE_PIXEL_VALUE_68_UNNAMED17408                              = 17408, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_68
++        {
++            FORWARD_PIXEL_VALUE_68_UNNAMED17408                              = 17408, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_68
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408               = 17408, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_69
++        {
++            INVERSE_PIXEL_VALUE_69_UNNAMED17664                              = 17664, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_69
++        {
++            FORWARD_PIXEL_VALUE_69_UNNAMED17664                              = 17664, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_69
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664               = 17664, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_70
++        {
++            INVERSE_PIXEL_VALUE_70_UNNAMED17920                              = 17920, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_70
++        {
++            FORWARD_PIXEL_VALUE_70_UNNAMED17920                              = 17920, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_70
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920               = 17920, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_71
++        {
++            INVERSE_PIXEL_VALUE_71_UNNAMED18176                              = 18176, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_71
++        {
++            FORWARD_PIXEL_VALUE_71_UNNAMED18176                              = 18176, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_71
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176               = 18176, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_72
++        {
++            INVERSE_PIXEL_VALUE_72_UNNAMED18432                              = 18432, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_72
++        {
++            FORWARD_PIXEL_VALUE_72_UNNAMED18432                              = 18432, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_72
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432               = 18432, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_73
++        {
++            INVERSE_PIXEL_VALUE_73_UNNAMED18688                              = 18688, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_73
++        {
++            FORWARD_PIXEL_VALUE_73_UNNAMED18688                              = 18688, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_73
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688               = 18688, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_74
++        {
++            INVERSE_PIXEL_VALUE_74_UNNAMED18944                              = 18944, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_74
++        {
++            FORWARD_PIXEL_VALUE_74_UNNAMED18944                              = 18944, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_74
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944               = 18944, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_75
++        {
++            INVERSE_PIXEL_VALUE_75_UNNAMED19200                              = 19200, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_75
++        {
++            FORWARD_PIXEL_VALUE_75_UNNAMED19200                              = 19200, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_75
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200               = 19200, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_76
++        {
++            INVERSE_PIXEL_VALUE_76_UNNAMED19456                              = 19456, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_76
++        {
++            FORWARD_PIXEL_VALUE_76_UNNAMED19456                              = 19456, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_76
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456               = 19456, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_77
++        {
++            INVERSE_PIXEL_VALUE_77_UNNAMED19712                              = 19712, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_77
++        {
++            FORWARD_PIXEL_VALUE_77_UNNAMED19712                              = 19712, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_77
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712               = 19712, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_78
++        {
++            INVERSE_PIXEL_VALUE_78_UNNAMED19968                              = 19968, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_78
++        {
++            FORWARD_PIXEL_VALUE_78_UNNAMED19968                              = 19968, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_78
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968               = 19968, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_79
++        {
++            INVERSE_PIXEL_VALUE_79_UNNAMED20224                              = 20224, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_79
++        {
++            FORWARD_PIXEL_VALUE_79_UNNAMED20224                              = 20224, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_79
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224               = 20224, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_80
++        {
++            INVERSE_PIXEL_VALUE_80_UNNAMED20480                              = 20480, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_80
++        {
++            FORWARD_PIXEL_VALUE_80_UNNAMED20480                              = 20480, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_80
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480               = 20480, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_81
++        {
++            INVERSE_PIXEL_VALUE_81_UNNAMED20736                              = 20736, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_81
++        {
++            FORWARD_PIXEL_VALUE_81_UNNAMED20736                              = 20736, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_81
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736               = 20736, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_82
++        {
++            INVERSE_PIXEL_VALUE_82_UNNAMED20992                              = 20992, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_82
++        {
++            FORWARD_PIXEL_VALUE_82_UNNAMED20992                              = 20992, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_82
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992               = 20992, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_83
++        {
++            INVERSE_PIXEL_VALUE_83_UNNAMED21248                              = 21248, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_83
++        {
++            FORWARD_PIXEL_VALUE_83_UNNAMED21248                              = 21248, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_83
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248               = 21248, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_84
++        {
++            INVERSE_PIXEL_VALUE_84_UNNAMED21504                              = 21504, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_84
++        {
++            FORWARD_PIXEL_VALUE_84_UNNAMED21504                              = 21504, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_84
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504               = 21504, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_85
++        {
++            INVERSE_PIXEL_VALUE_85_UNNAMED21760                              = 21760, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_85
++        {
++            FORWARD_PIXEL_VALUE_85_UNNAMED21760                              = 21760, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_85
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760               = 21760, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_86
++        {
++            INVERSE_PIXEL_VALUE_86_UNNAMED22016                              = 22016, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_86
++        {
++            FORWARD_PIXEL_VALUE_86_UNNAMED22016                              = 22016, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_86
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016               = 22016, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_87
++        {
++            INVERSE_PIXEL_VALUE_87_UNNAMED22272                              = 22272, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_87
++        {
++            FORWARD_PIXEL_VALUE_87_UNNAMED22272                              = 22272, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_87
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272               = 22272, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_88
++        {
++            INVERSE_PIXEL_VALUE_88_UNNAMED22528                              = 22528, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_88
++        {
++            FORWARD_PIXEL_VALUE_88_UNNAMED22528                              = 22528, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_88
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528               = 22528, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_89
++        {
++            INVERSE_PIXEL_VALUE_89_UNNAMED22784                              = 22784, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_89
++        {
++            FORWARD_PIXEL_VALUE_89_UNNAMED22784                              = 22784, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_89
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784               = 22784, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_90
++        {
++            INVERSE_PIXEL_VALUE_90_UNNAMED23040                              = 23040, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_90
++        {
++            FORWARD_PIXEL_VALUE_90_UNNAMED23040                              = 23040, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_90
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040               = 23040, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_91
++        {
++            INVERSE_PIXEL_VALUE_91_UNNAMED23296                              = 23296, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_91
++        {
++            FORWARD_PIXEL_VALUE_91_UNNAMED23296                              = 23296, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_91
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296               = 23296, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_92
++        {
++            INVERSE_PIXEL_VALUE_92_UNNAMED23552                              = 23552, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_92
++        {
++            FORWARD_PIXEL_VALUE_92_UNNAMED23552                              = 23552, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_92
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552               = 23552, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_93
++        {
++            INVERSE_PIXEL_VALUE_93_UNNAMED23808                              = 23808, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_93
++        {
++            FORWARD_PIXEL_VALUE_93_UNNAMED23808                              = 23808, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_93
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808               = 23808, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_94
++        {
++            INVERSE_PIXEL_VALUE_94_UNNAMED24064                              = 24064, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_94
++        {
++            FORWARD_PIXEL_VALUE_94_UNNAMED24064                              = 24064, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_94
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064               = 24064, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_95
++        {
++            INVERSE_PIXEL_VALUE_95_UNNAMED24320                              = 24320, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_95
++        {
++            FORWARD_PIXEL_VALUE_95_UNNAMED24320                              = 24320, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_95
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320               = 24320, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_96
++        {
++            INVERSE_PIXEL_VALUE_96_UNNAMED24576                              = 24576, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_96
++        {
++            FORWARD_PIXEL_VALUE_96_UNNAMED24576                              = 24576, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_96
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576               = 24576, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_97
++        {
++            INVERSE_PIXEL_VALUE_97_UNNAMED24832                              = 24832, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_97
++        {
++            FORWARD_PIXEL_VALUE_97_UNNAMED24832                              = 24832, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_97
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832               = 24832, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_98
++        {
++            INVERSE_PIXEL_VALUE_98_UNNAMED25088                              = 25088, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_98
++        {
++            FORWARD_PIXEL_VALUE_98_UNNAMED25088                              = 25088, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_98
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088               = 25088, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_99
++        {
++            INVERSE_PIXEL_VALUE_99_UNNAMED25344                              = 25344, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_99
++        {
++            FORWARD_PIXEL_VALUE_99_UNNAMED25344                              = 25344, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_99
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344               = 25344, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_100
++        {
++            INVERSE_PIXEL_VALUE_100_UNNAMED25600                             = 25600, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_100
++        {
++            FORWARD_PIXEL_VALUE_100_UNNAMED25600                             = 25600, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_100
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600              = 25600, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_101
++        {
++            INVERSE_PIXEL_VALUE_101_UNNAMED25856                             = 25856, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_101
++        {
++            FORWARD_PIXEL_VALUE_101_UNNAMED25856                             = 25856, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_101
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856              = 25856, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_102
++        {
++            INVERSE_PIXEL_VALUE_102_UNNAMED26112                             = 26112, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_102
++        {
++            FORWARD_PIXEL_VALUE_102_UNNAMED26112                             = 26112, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_102
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112              = 26112, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_103
++        {
++            INVERSE_PIXEL_VALUE_103_UNNAMED26368                             = 26368, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_103
++        {
++            FORWARD_PIXEL_VALUE_103_UNNAMED26368                             = 26368, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_103
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368              = 26368, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_104
++        {
++            INVERSE_PIXEL_VALUE_104_UNNAMED26624                             = 26624, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_104
++        {
++            FORWARD_PIXEL_VALUE_104_UNNAMED26624                             = 26624, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_104
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624              = 26624, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_105
++        {
++            INVERSE_PIXEL_VALUE_105_UNNAMED26880                             = 26880, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_105
++        {
++            FORWARD_PIXEL_VALUE_105_UNNAMED26880                             = 26880, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_105
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880              = 26880, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_106
++        {
++            INVERSE_PIXEL_VALUE_106_UNNAMED27136                             = 27136, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_106
++        {
++            FORWARD_PIXEL_VALUE_106_UNNAMED27136                             = 27136, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_106
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136              = 27136, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_107
++        {
++            INVERSE_PIXEL_VALUE_107_UNNAMED27392                             = 27392, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_107
++        {
++            FORWARD_PIXEL_VALUE_107_UNNAMED27392                             = 27392, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_107
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392              = 27392, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_108
++        {
++            INVERSE_PIXEL_VALUE_108_UNNAMED27648                             = 27648, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_108
++        {
++            FORWARD_PIXEL_VALUE_108_UNNAMED27648                             = 27648, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_108
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648              = 27648, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_109
++        {
++            INVERSE_PIXEL_VALUE_109_UNNAMED27904                             = 27904, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_109
++        {
++            FORWARD_PIXEL_VALUE_109_UNNAMED27904                             = 27904, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_109
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904              = 27904, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_110
++        {
++            INVERSE_PIXEL_VALUE_110_UNNAMED28160                             = 28160, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_110
++        {
++            FORWARD_PIXEL_VALUE_110_UNNAMED28160                             = 28160, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_110
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160              = 28160, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_111
++        {
++            INVERSE_PIXEL_VALUE_111_UNNAMED28416                             = 28416, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_111
++        {
++            FORWARD_PIXEL_VALUE_111_UNNAMED28416                             = 28416, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_111
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416              = 28416, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_112
++        {
++            INVERSE_PIXEL_VALUE_112_UNNAMED28672                             = 28672, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_112
++        {
++            FORWARD_PIXEL_VALUE_112_UNNAMED28672                             = 28672, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_112
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672              = 28672, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_113
++        {
++            INVERSE_PIXEL_VALUE_113_UNNAMED28928                             = 28928, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_113
++        {
++            FORWARD_PIXEL_VALUE_113_UNNAMED28928                             = 28928, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_113
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928              = 28928, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_114
++        {
++            INVERSE_PIXEL_VALUE_114_UNNAMED29184                             = 29184, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_114
++        {
++            FORWARD_PIXEL_VALUE_114_UNNAMED29184                             = 29184, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_114
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184              = 29184, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_115
++        {
++            INVERSE_PIXEL_VALUE_115_UNNAMED29440                             = 29440, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_115
++        {
++            FORWARD_PIXEL_VALUE_115_UNNAMED29440                             = 29440, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_115
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440              = 29440, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_116
++        {
++            INVERSE_PIXEL_VALUE_116_UNNAMED29696                             = 29696, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_116
++        {
++            FORWARD_PIXEL_VALUE_116_UNNAMED29696                             = 29696, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_116
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696              = 29696, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_117
++        {
++            INVERSE_PIXEL_VALUE_117_UNNAMED29952                             = 29952, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_117
++        {
++            FORWARD_PIXEL_VALUE_117_UNNAMED29952                             = 29952, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_117
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952              = 29952, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_118
++        {
++            INVERSE_PIXEL_VALUE_118_UNNAMED30208                             = 30208, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_118
++        {
++            FORWARD_PIXEL_VALUE_118_UNNAMED30208                             = 30208, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_118
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208              = 30208, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_119
++        {
++            INVERSE_PIXEL_VALUE_119_UNNAMED30464                             = 30464, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_119
++        {
++            FORWARD_PIXEL_VALUE_119_UNNAMED30464                             = 30464, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_119
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464              = 30464, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_120
++        {
++            INVERSE_PIXEL_VALUE_120_UNNAMED30720                             = 30720, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_120
++        {
++            FORWARD_PIXEL_VALUE_120_UNNAMED30720                             = 30720, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_120
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720              = 30720, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_121
++        {
++            INVERSE_PIXEL_VALUE_121_UNNAMED30976                             = 30976, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_121
++        {
++            FORWARD_PIXEL_VALUE_121_UNNAMED30976                             = 30976, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_121
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976              = 30976, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_122
++        {
++            INVERSE_PIXEL_VALUE_122_UNNAMED31232                             = 31232, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_122
++        {
++            FORWARD_PIXEL_VALUE_122_UNNAMED31232                             = 31232, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_122
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232              = 31232, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_123
++        {
++            INVERSE_PIXEL_VALUE_123_UNNAMED31488                             = 31488, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_123
++        {
++            FORWARD_PIXEL_VALUE_123_UNNAMED31488                             = 31488, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_123
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488              = 31488, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_124
++        {
++            INVERSE_PIXEL_VALUE_124_UNNAMED31744                             = 31744, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_124
++        {
++            FORWARD_PIXEL_VALUE_124_UNNAMED31744                             = 31744, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_124
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744              = 31744, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_125
++        {
++            INVERSE_PIXEL_VALUE_125_UNNAMED32000                             = 32000, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_125
++        {
++            FORWARD_PIXEL_VALUE_125_UNNAMED32000                             = 32000, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_125
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000              = 32000, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_126
++        {
++            INVERSE_PIXEL_VALUE_126_UNNAMED32256                             = 32256, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_126
++        {
++            FORWARD_PIXEL_VALUE_126_UNNAMED32256                             = 32256, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_126
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256              = 32256, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_127
++        {
++            INVERSE_PIXEL_VALUE_127_UNNAMED32512                             = 32512, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_127
++        {
++            FORWARD_PIXEL_VALUE_127_UNNAMED32512                             = 32512, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_127
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512              = 32512, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_128
++        {
++            INVERSE_PIXEL_VALUE_128_UNNAMED32768                             = 32768, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_128
++        {
++            FORWARD_PIXEL_VALUE_128_UNNAMED32768                             = 32768, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_128
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768              = 32768, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_129
++        {
++            INVERSE_PIXEL_VALUE_129_UNNAMED33024                             = 33024, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_129
++        {
++            FORWARD_PIXEL_VALUE_129_UNNAMED33024                             = 33024, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_129
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024              = 33024, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_130
++        {
++            INVERSE_PIXEL_VALUE_130_UNNAMED33280                             = 33280, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_130
++        {
++            FORWARD_PIXEL_VALUE_130_UNNAMED33280                             = 33280, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_130
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280              = 33280, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_131
++        {
++            INVERSE_PIXEL_VALUE_131_UNNAMED33536                             = 33536, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_131
++        {
++            FORWARD_PIXEL_VALUE_131_UNNAMED33536                             = 33536, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_131
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536              = 33536, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_132
++        {
++            INVERSE_PIXEL_VALUE_132_UNNAMED33792                             = 33792, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_132
++        {
++            FORWARD_PIXEL_VALUE_132_UNNAMED33792                             = 33792, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_132
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792              = 33792, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_133
++        {
++            INVERSE_PIXEL_VALUE_133_UNNAMED34048                             = 34048, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_133
++        {
++            FORWARD_PIXEL_VALUE_133_UNNAMED34048                             = 34048, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_133
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048              = 34048, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_134
++        {
++            INVERSE_PIXEL_VALUE_134_UNNAMED34304                             = 34304, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_134
++        {
++            FORWARD_PIXEL_VALUE_134_UNNAMED34304                             = 34304, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_134
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304              = 34304, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_135
++        {
++            INVERSE_PIXEL_VALUE_135_UNNAMED34560                             = 34560, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_135
++        {
++            FORWARD_PIXEL_VALUE_135_UNNAMED34560                             = 34560, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_135
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560              = 34560, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_136
++        {
++            INVERSE_PIXEL_VALUE_136_UNNAMED34816                             = 34816, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_136
++        {
++            FORWARD_PIXEL_VALUE_136_UNNAMED34816                             = 34816, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_136
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816              = 34816, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_137
++        {
++            INVERSE_PIXEL_VALUE_137_UNNAMED35072                             = 35072, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_137
++        {
++            FORWARD_PIXEL_VALUE_137_UNNAMED35072                             = 35072, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_137
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072              = 35072, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_138
++        {
++            INVERSE_PIXEL_VALUE_138_UNNAMED35328                             = 35328, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_138
++        {
++            FORWARD_PIXEL_VALUE_138_UNNAMED35328                             = 35328, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_138
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328              = 35328, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_139
++        {
++            INVERSE_PIXEL_VALUE_139_UNNAMED35584                             = 35584, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_139
++        {
++            FORWARD_PIXEL_VALUE_139_UNNAMED35584                             = 35584, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_139
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584              = 35584, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_140
++        {
++            INVERSE_PIXEL_VALUE_140_UNNAMED35840                             = 35840, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_140
++        {
++            FORWARD_PIXEL_VALUE_140_UNNAMED35840                             = 35840, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_140
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840              = 35840, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_141
++        {
++            INVERSE_PIXEL_VALUE_141_UNNAMED36096                             = 36096, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_141
++        {
++            FORWARD_PIXEL_VALUE_141_UNNAMED36096                             = 36096, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_141
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096              = 36096, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_142
++        {
++            INVERSE_PIXEL_VALUE_142_UNNAMED36352                             = 36352, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_142
++        {
++            FORWARD_PIXEL_VALUE_142_UNNAMED36352                             = 36352, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_142
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352              = 36352, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_143
++        {
++            INVERSE_PIXEL_VALUE_143_UNNAMED36608                             = 36608, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_143
++        {
++            FORWARD_PIXEL_VALUE_143_UNNAMED36608                             = 36608, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_143
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608              = 36608, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_144
++        {
++            INVERSE_PIXEL_VALUE_144_UNNAMED36864                             = 36864, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_144
++        {
++            FORWARD_PIXEL_VALUE_144_UNNAMED36864                             = 36864, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_144
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864              = 36864, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_145
++        {
++            INVERSE_PIXEL_VALUE_145_UNNAMED37120                             = 37120, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_145
++        {
++            FORWARD_PIXEL_VALUE_145_UNNAMED37120                             = 37120, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_145
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120              = 37120, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_146
++        {
++            INVERSE_PIXEL_VALUE_146_UNNAMED37376                             = 37376, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_146
++        {
++            FORWARD_PIXEL_VALUE_146_UNNAMED37376                             = 37376, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_146
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376              = 37376, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_147
++        {
++            INVERSE_PIXEL_VALUE_147_UNNAMED37632                             = 37632, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_147
++        {
++            FORWARD_PIXEL_VALUE_147_UNNAMED37632                             = 37632, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_147
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632              = 37632, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_148
++        {
++            INVERSE_PIXEL_VALUE_148_UNNAMED37888                             = 37888, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_148
++        {
++            FORWARD_PIXEL_VALUE_148_UNNAMED37888                             = 37888, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_148
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888              = 37888, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_149
++        {
++            INVERSE_PIXEL_VALUE_149_UNNAMED38144                             = 38144, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_149
++        {
++            FORWARD_PIXEL_VALUE_149_UNNAMED38144                             = 38144, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_149
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144              = 38144, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_150
++        {
++            INVERSE_PIXEL_VALUE_150_UNNAMED38400                             = 38400, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_150
++        {
++            FORWARD_PIXEL_VALUE_150_UNNAMED38400                             = 38400, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_150
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400              = 38400, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_151
++        {
++            INVERSE_PIXEL_VALUE_151_UNNAMED38656                             = 38656, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_151
++        {
++            FORWARD_PIXEL_VALUE_151_UNNAMED38656                             = 38656, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_151
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656              = 38656, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_152
++        {
++            INVERSE_PIXEL_VALUE_152_UNNAMED38912                             = 38912, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_152
++        {
++            FORWARD_PIXEL_VALUE_152_UNNAMED38912                             = 38912, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_152
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912              = 38912, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_153
++        {
++            INVERSE_PIXEL_VALUE_153_UNNAMED39168                             = 39168, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_153
++        {
++            FORWARD_PIXEL_VALUE_153_UNNAMED39168                             = 39168, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_153
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168              = 39168, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_154
++        {
++            INVERSE_PIXEL_VALUE_154_UNNAMED39424                             = 39424, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_154
++        {
++            FORWARD_PIXEL_VALUE_154_UNNAMED39424                             = 39424, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_154
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424              = 39424, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_155
++        {
++            INVERSE_PIXEL_VALUE_155_UNNAMED39680                             = 39680, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_155
++        {
++            FORWARD_PIXEL_VALUE_155_UNNAMED39680                             = 39680, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_155
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680              = 39680, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_156
++        {
++            INVERSE_PIXEL_VALUE_156_UNNAMED39936                             = 39936, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_156
++        {
++            FORWARD_PIXEL_VALUE_156_UNNAMED39936                             = 39936, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_156
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936              = 39936, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_157
++        {
++            INVERSE_PIXEL_VALUE_157_UNNAMED40192                             = 40192, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_157
++        {
++            FORWARD_PIXEL_VALUE_157_UNNAMED40192                             = 40192, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_157
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192              = 40192, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_158
++        {
++            INVERSE_PIXEL_VALUE_158_UNNAMED40448                             = 40448, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_158
++        {
++            FORWARD_PIXEL_VALUE_158_UNNAMED40448                             = 40448, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_158
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448              = 40448, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_159
++        {
++            INVERSE_PIXEL_VALUE_159_UNNAMED40704                             = 40704, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_159
++        {
++            FORWARD_PIXEL_VALUE_159_UNNAMED40704                             = 40704, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_159
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704              = 40704, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_160
++        {
++            INVERSE_PIXEL_VALUE_160_UNNAMED40960                             = 40960, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_160
++        {
++            FORWARD_PIXEL_VALUE_160_UNNAMED40960                             = 40960, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_160
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960              = 40960, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_161
++        {
++            INVERSE_PIXEL_VALUE_161_UNNAMED41216                             = 41216, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_161
++        {
++            FORWARD_PIXEL_VALUE_161_UNNAMED41216                             = 41216, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_161
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216              = 41216, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_162
++        {
++            INVERSE_PIXEL_VALUE_162_UNNAMED41472                             = 41472, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_162
++        {
++            FORWARD_PIXEL_VALUE_162_UNNAMED41472                             = 41472, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_162
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472              = 41472, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_163
++        {
++            INVERSE_PIXEL_VALUE_163_UNNAMED41728                             = 41728, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_163
++        {
++            FORWARD_PIXEL_VALUE_163_UNNAMED41728                             = 41728, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_163
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728              = 41728, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_164
++        {
++            INVERSE_PIXEL_VALUE_164_UNNAMED41984                             = 41984, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_164
++        {
++            FORWARD_PIXEL_VALUE_164_UNNAMED41984                             = 41984, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_164
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984              = 41984, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_165
++        {
++            INVERSE_PIXEL_VALUE_165_UNNAMED42240                             = 42240, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_165
++        {
++            FORWARD_PIXEL_VALUE_165_UNNAMED42240                             = 42240, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_165
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240              = 42240, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_166
++        {
++            INVERSE_PIXEL_VALUE_166_UNNAMED42496                             = 42496, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_166
++        {
++            FORWARD_PIXEL_VALUE_166_UNNAMED42496                             = 42496, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_166
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496              = 42496, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_167
++        {
++            INVERSE_PIXEL_VALUE_167_UNNAMED42752                             = 42752, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_167
++        {
++            FORWARD_PIXEL_VALUE_167_UNNAMED42752                             = 42752, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_167
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752              = 42752, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_168
++        {
++            INVERSE_PIXEL_VALUE_168_UNNAMED43008                             = 43008, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_168
++        {
++            FORWARD_PIXEL_VALUE_168_UNNAMED43008                             = 43008, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_168
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008              = 43008, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_169
++        {
++            INVERSE_PIXEL_VALUE_169_UNNAMED43264                             = 43264, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_169
++        {
++            FORWARD_PIXEL_VALUE_169_UNNAMED43264                             = 43264, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_169
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264              = 43264, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_170
++        {
++            INVERSE_PIXEL_VALUE_170_UNNAMED43520                             = 43520, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_170
++        {
++            FORWARD_PIXEL_VALUE_170_UNNAMED43520                             = 43520, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_170
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520              = 43520, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_171
++        {
++            INVERSE_PIXEL_VALUE_171_UNNAMED43776                             = 43776, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_171
++        {
++            FORWARD_PIXEL_VALUE_171_UNNAMED43776                             = 43776, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_171
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776              = 43776, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_172
++        {
++            INVERSE_PIXEL_VALUE_172_UNNAMED44032                             = 44032, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_172
++        {
++            FORWARD_PIXEL_VALUE_172_UNNAMED44032                             = 44032, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_172
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032              = 44032, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_173
++        {
++            INVERSE_PIXEL_VALUE_173_UNNAMED44288                             = 44288, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_173
++        {
++            FORWARD_PIXEL_VALUE_173_UNNAMED44288                             = 44288, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_173
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288              = 44288, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_174
++        {
++            INVERSE_PIXEL_VALUE_174_UNNAMED44544                             = 44544, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_174
++        {
++            FORWARD_PIXEL_VALUE_174_UNNAMED44544                             = 44544, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_174
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544              = 44544, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_175
++        {
++            INVERSE_PIXEL_VALUE_175_UNNAMED44800                             = 44800, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_175
++        {
++            FORWARD_PIXEL_VALUE_175_UNNAMED44800                             = 44800, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_175
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800              = 44800, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_176
++        {
++            INVERSE_PIXEL_VALUE_176_UNNAMED45056                             = 45056, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_176
++        {
++            FORWARD_PIXEL_VALUE_176_UNNAMED45056                             = 45056, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_176
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056              = 45056, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_177
++        {
++            INVERSE_PIXEL_VALUE_177_UNNAMED45312                             = 45312, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_177
++        {
++            FORWARD_PIXEL_VALUE_177_UNNAMED45312                             = 45312, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_177
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312              = 45312, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_178
++        {
++            INVERSE_PIXEL_VALUE_178_UNNAMED45568                             = 45568, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_178
++        {
++            FORWARD_PIXEL_VALUE_178_UNNAMED45568                             = 45568, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_178
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568              = 45568, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_179
++        {
++            INVERSE_PIXEL_VALUE_179_UNNAMED45824                             = 45824, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_179
++        {
++            FORWARD_PIXEL_VALUE_179_UNNAMED45824                             = 45824, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_179
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824              = 45824, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_180
++        {
++            INVERSE_PIXEL_VALUE_180_UNNAMED46080                             = 46080, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_180
++        {
++            FORWARD_PIXEL_VALUE_180_UNNAMED46080                             = 46080, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_180
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080              = 46080, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_181
++        {
++            INVERSE_PIXEL_VALUE_181_UNNAMED46336                             = 46336, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_181
++        {
++            FORWARD_PIXEL_VALUE_181_UNNAMED46336                             = 46336, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_181
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336              = 46336, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_182
++        {
++            INVERSE_PIXEL_VALUE_182_UNNAMED46592                             = 46592, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_182
++        {
++            FORWARD_PIXEL_VALUE_182_UNNAMED46592                             = 46592, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_182
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592              = 46592, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_183
++        {
++            INVERSE_PIXEL_VALUE_183_UNNAMED46848                             = 46848, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_183
++        {
++            FORWARD_PIXEL_VALUE_183_UNNAMED46848                             = 46848, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_183
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848              = 46848, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_184
++        {
++            INVERSE_PIXEL_VALUE_184_UNNAMED47104                             = 47104, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_184
++        {
++            FORWARD_PIXEL_VALUE_184_UNNAMED47104                             = 47104, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_184
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104              = 47104, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_185
++        {
++            INVERSE_PIXEL_VALUE_185_UNNAMED47360                             = 47360, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_185
++        {
++            FORWARD_PIXEL_VALUE_185_UNNAMED47360                             = 47360, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_185
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360              = 47360, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_186
++        {
++            INVERSE_PIXEL_VALUE_186_UNNAMED47616                             = 47616, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_186
++        {
++            FORWARD_PIXEL_VALUE_186_UNNAMED47616                             = 47616, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_186
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616              = 47616, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_187
++        {
++            INVERSE_PIXEL_VALUE_187_UNNAMED47872                             = 47872, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_187
++        {
++            FORWARD_PIXEL_VALUE_187_UNNAMED47872                             = 47872, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_187
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872              = 47872, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_188
++        {
++            INVERSE_PIXEL_VALUE_188_UNNAMED48128                             = 48128, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_188
++        {
++            FORWARD_PIXEL_VALUE_188_UNNAMED48128                             = 48128, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_188
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128              = 48128, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_189
++        {
++            INVERSE_PIXEL_VALUE_189_UNNAMED48384                             = 48384, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_189
++        {
++            FORWARD_PIXEL_VALUE_189_UNNAMED48384                             = 48384, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_189
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384              = 48384, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_190
++        {
++            INVERSE_PIXEL_VALUE_190_UNNAMED48640                             = 48640, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_190
++        {
++            FORWARD_PIXEL_VALUE_190_UNNAMED48640                             = 48640, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_190
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640              = 48640, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_191
++        {
++            INVERSE_PIXEL_VALUE_191_UNNAMED48896                             = 48896, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_191
++        {
++            FORWARD_PIXEL_VALUE_191_UNNAMED48896                             = 48896, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_191
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896              = 48896, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_192
++        {
++            INVERSE_PIXEL_VALUE_192_UNNAMED49152                             = 49152, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_192
++        {
++            FORWARD_PIXEL_VALUE_192_UNNAMED49152                             = 49152, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_192
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152              = 49152, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_193
++        {
++            INVERSE_PIXEL_VALUE_193_UNNAMED49408                             = 49408, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_193
++        {
++            FORWARD_PIXEL_VALUE_193_UNNAMED49408                             = 49408, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_193
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408              = 49408, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_194
++        {
++            INVERSE_PIXEL_VALUE_194_UNNAMED49664                             = 49664, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_194
++        {
++            FORWARD_PIXEL_VALUE_194_UNNAMED49664                             = 49664, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_194
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664              = 49664, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_195
++        {
++            INVERSE_PIXEL_VALUE_195_UNNAMED49920                             = 49920, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_195
++        {
++            FORWARD_PIXEL_VALUE_195_UNNAMED49920                             = 49920, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_195
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920              = 49920, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_196
++        {
++            INVERSE_PIXEL_VALUE_196_UNNAMED50176                             = 50176, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_196
++        {
++            FORWARD_PIXEL_VALUE_196_UNNAMED50176                             = 50176, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_196
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176              = 50176, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_197
++        {
++            INVERSE_PIXEL_VALUE_197_UNNAMED50432                             = 50432, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_197
++        {
++            FORWARD_PIXEL_VALUE_197_UNNAMED50432                             = 50432, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_197
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432              = 50432, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_198
++        {
++            INVERSE_PIXEL_VALUE_198_UNNAMED50688                             = 50688, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_198
++        {
++            FORWARD_PIXEL_VALUE_198_UNNAMED50688                             = 50688, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_198
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688              = 50688, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_199
++        {
++            INVERSE_PIXEL_VALUE_199_UNNAMED50944                             = 50944, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_199
++        {
++            FORWARD_PIXEL_VALUE_199_UNNAMED50944                             = 50944, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_199
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944              = 50944, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_200
++        {
++            INVERSE_PIXEL_VALUE_200_UNNAMED51200                             = 51200, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_200
++        {
++            FORWARD_PIXEL_VALUE_200_UNNAMED51200                             = 51200, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_200
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200              = 51200, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_201
++        {
++            INVERSE_PIXEL_VALUE_201_UNNAMED51456                             = 51456, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_201
++        {
++            FORWARD_PIXEL_VALUE_201_UNNAMED51456                             = 51456, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_201
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456              = 51456, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_202
++        {
++            INVERSE_PIXEL_VALUE_202_UNNAMED51712                             = 51712, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_202
++        {
++            FORWARD_PIXEL_VALUE_202_UNNAMED51712                             = 51712, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_202
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712              = 51712, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_203
++        {
++            INVERSE_PIXEL_VALUE_203_UNNAMED51968                             = 51968, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_203
++        {
++            FORWARD_PIXEL_VALUE_203_UNNAMED51968                             = 51968, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_203
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968              = 51968, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_204
++        {
++            INVERSE_PIXEL_VALUE_204_UNNAMED52224                             = 52224, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_204
++        {
++            FORWARD_PIXEL_VALUE_204_UNNAMED52224                             = 52224, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_204
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224              = 52224, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_205
++        {
++            INVERSE_PIXEL_VALUE_205_UNNAMED52480                             = 52480, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_205
++        {
++            FORWARD_PIXEL_VALUE_205_UNNAMED52480                             = 52480, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_205
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480              = 52480, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_206
++        {
++            INVERSE_PIXEL_VALUE_206_UNNAMED52736                             = 52736, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_206
++        {
++            FORWARD_PIXEL_VALUE_206_UNNAMED52736                             = 52736, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_206
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736              = 52736, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_207
++        {
++            INVERSE_PIXEL_VALUE_207_UNNAMED52992                             = 52992, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_207
++        {
++            FORWARD_PIXEL_VALUE_207_UNNAMED52992                             = 52992, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_207
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992              = 52992, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_208
++        {
++            INVERSE_PIXEL_VALUE_208_UNNAMED53248                             = 53248, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_208
++        {
++            FORWARD_PIXEL_VALUE_208_UNNAMED53248                             = 53248, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_208
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248              = 53248, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_209
++        {
++            INVERSE_PIXEL_VALUE_209_UNNAMED53504                             = 53504, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_209
++        {
++            FORWARD_PIXEL_VALUE_209_UNNAMED53504                             = 53504, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_209
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504              = 53504, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_210
++        {
++            INVERSE_PIXEL_VALUE_210_UNNAMED53760                             = 53760, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_210
++        {
++            FORWARD_PIXEL_VALUE_210_UNNAMED53760                             = 53760, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_210
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760              = 53760, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_211
++        {
++            INVERSE_PIXEL_VALUE_211_UNNAMED54016                             = 54016, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_211
++        {
++            FORWARD_PIXEL_VALUE_211_UNNAMED54016                             = 54016, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_211
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016              = 54016, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_212
++        {
++            INVERSE_PIXEL_VALUE_212_UNNAMED54272                             = 54272, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_212
++        {
++            FORWARD_PIXEL_VALUE_212_UNNAMED54272                             = 54272, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_212
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272              = 54272, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_213
++        {
++            INVERSE_PIXEL_VALUE_213_UNNAMED54528                             = 54528, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_213
++        {
++            FORWARD_PIXEL_VALUE_213_UNNAMED54528                             = 54528, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_213
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528              = 54528, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_214
++        {
++            INVERSE_PIXEL_VALUE_214_UNNAMED54784                             = 54784, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_214
++        {
++            FORWARD_PIXEL_VALUE_214_UNNAMED54784                             = 54784, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_214
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784              = 54784, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_215
++        {
++            INVERSE_PIXEL_VALUE_215_UNNAMED55040                             = 55040, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_215
++        {
++            FORWARD_PIXEL_VALUE_215_UNNAMED55040                             = 55040, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_215
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040              = 55040, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_216
++        {
++            INVERSE_PIXEL_VALUE_216_UNNAMED55296                             = 55296, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_216
++        {
++            FORWARD_PIXEL_VALUE_216_UNNAMED55296                             = 55296, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_216
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296              = 55296, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_217
++        {
++            INVERSE_PIXEL_VALUE_217_UNNAMED55552                             = 55552, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_217
++        {
++            FORWARD_PIXEL_VALUE_217_UNNAMED55552                             = 55552, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_217
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552              = 55552, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_218
++        {
++            INVERSE_PIXEL_VALUE_218_UNNAMED55808                             = 55808, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_218
++        {
++            FORWARD_PIXEL_VALUE_218_UNNAMED55808                             = 55808, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_218
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808              = 55808, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_219
++        {
++            INVERSE_PIXEL_VALUE_219_UNNAMED56064                             = 56064, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_219
++        {
++            FORWARD_PIXEL_VALUE_219_UNNAMED56064                             = 56064, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_219
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064              = 56064, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_220
++        {
++            INVERSE_PIXEL_VALUE_220_UNNAMED56320                             = 56320, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_220
++        {
++            FORWARD_PIXEL_VALUE_220_UNNAMED56320                             = 56320, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_220
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320              = 56320, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_221
++        {
++            INVERSE_PIXEL_VALUE_221_UNNAMED56576                             = 56576, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_221
++        {
++            FORWARD_PIXEL_VALUE_221_UNNAMED56576                             = 56576, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_221
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576              = 56576, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_222
++        {
++            INVERSE_PIXEL_VALUE_222_UNNAMED56832                             = 56832, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_222
++        {
++            FORWARD_PIXEL_VALUE_222_UNNAMED56832                             = 56832, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_222
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832              = 56832, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_223
++        {
++            INVERSE_PIXEL_VALUE_223_UNNAMED57088                             = 57088, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_223
++        {
++            FORWARD_PIXEL_VALUE_223_UNNAMED57088                             = 57088, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_223
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088              = 57088, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_224
++        {
++            INVERSE_PIXEL_VALUE_224_UNNAMED57344                             = 57344, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_224
++        {
++            FORWARD_PIXEL_VALUE_224_UNNAMED57344                             = 57344, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_224
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344              = 57344, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_225
++        {
++            INVERSE_PIXEL_VALUE_225_UNNAMED57600                             = 57600, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_225
++        {
++            FORWARD_PIXEL_VALUE_225_UNNAMED57600                             = 57600, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_225
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600              = 57600, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_226
++        {
++            INVERSE_PIXEL_VALUE_226_UNNAMED57856                             = 57856, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_226
++        {
++            FORWARD_PIXEL_VALUE_226_UNNAMED57856                             = 57856, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_226
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856              = 57856, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_227
++        {
++            INVERSE_PIXEL_VALUE_227_UNNAMED58112                             = 58112, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_227
++        {
++            FORWARD_PIXEL_VALUE_227_UNNAMED58112                             = 58112, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_227
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112              = 58112, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_228
++        {
++            INVERSE_PIXEL_VALUE_228_UNNAMED58368                             = 58368, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_228
++        {
++            FORWARD_PIXEL_VALUE_228_UNNAMED58368                             = 58368, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_228
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368              = 58368, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_229
++        {
++            INVERSE_PIXEL_VALUE_229_UNNAMED58624                             = 58624, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_229
++        {
++            FORWARD_PIXEL_VALUE_229_UNNAMED58624                             = 58624, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_229
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624              = 58624, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_230
++        {
++            INVERSE_PIXEL_VALUE_230_UNNAMED58880                             = 58880, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_230
++        {
++            FORWARD_PIXEL_VALUE_230_UNNAMED58880                             = 58880, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_230
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880              = 58880, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_231
++        {
++            INVERSE_PIXEL_VALUE_231_UNNAMED59136                             = 59136, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_231
++        {
++            FORWARD_PIXEL_VALUE_231_UNNAMED59136                             = 59136, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_231
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136              = 59136, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_232
++        {
++            INVERSE_PIXEL_VALUE_232_UNNAMED59392                             = 59392, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_232
++        {
++            FORWARD_PIXEL_VALUE_232_UNNAMED59392                             = 59392, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_232
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392              = 59392, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_233
++        {
++            INVERSE_PIXEL_VALUE_233_UNNAMED59648                             = 59648, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_233
++        {
++            FORWARD_PIXEL_VALUE_233_UNNAMED59648                             = 59648, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_233
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648              = 59648, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_234
++        {
++            INVERSE_PIXEL_VALUE_234_UNNAMED59904                             = 59904, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_234
++        {
++            FORWARD_PIXEL_VALUE_234_UNNAMED59904                             = 59904, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_234
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904              = 59904, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_235
++        {
++            INVERSE_PIXEL_VALUE_235_UNNAMED60160                             = 60160, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_235
++        {
++            FORWARD_PIXEL_VALUE_235_UNNAMED60160                             = 60160, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_235
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160              = 60160, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_236
++        {
++            INVERSE_PIXEL_VALUE_236_UNNAMED60416                             = 60416, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_236
++        {
++            FORWARD_PIXEL_VALUE_236_UNNAMED60416                             = 60416, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_236
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416              = 60416, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_237
++        {
++            INVERSE_PIXEL_VALUE_237_UNNAMED60672                             = 60672, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_237
++        {
++            FORWARD_PIXEL_VALUE_237_UNNAMED60672                             = 60672, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_237
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672              = 60672, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_238
++        {
++            INVERSE_PIXEL_VALUE_238_UNNAMED60928                             = 60928, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_238
++        {
++            FORWARD_PIXEL_VALUE_238_UNNAMED60928                             = 60928, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_238
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928              = 60928, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_239
++        {
++            INVERSE_PIXEL_VALUE_239_UNNAMED61184                             = 61184, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_239
++        {
++            FORWARD_PIXEL_VALUE_239_UNNAMED61184                             = 61184, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_239
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184              = 61184, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_240
++        {
++            INVERSE_PIXEL_VALUE_240_UNNAMED61440                             = 61440, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_240
++        {
++            FORWARD_PIXEL_VALUE_240_UNNAMED61440                             = 61440, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_240
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440              = 61440, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_241
++        {
++            INVERSE_PIXEL_VALUE_241_UNNAMED61696                             = 61696, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_241
++        {
++            FORWARD_PIXEL_VALUE_241_UNNAMED61696                             = 61696, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_241
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696              = 61696, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_242
++        {
++            INVERSE_PIXEL_VALUE_242_UNNAMED61952                             = 61952, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_242
++        {
++            FORWARD_PIXEL_VALUE_242_UNNAMED61952                             = 61952, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_242
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952              = 61952, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_243
++        {
++            INVERSE_PIXEL_VALUE_243_UNNAMED62208                             = 62208, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_243
++        {
++            FORWARD_PIXEL_VALUE_243_UNNAMED62208                             = 62208, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_243
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208              = 62208, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_244
++        {
++            INVERSE_PIXEL_VALUE_244_UNNAMED62464                             = 62464, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_244
++        {
++            FORWARD_PIXEL_VALUE_244_UNNAMED62464                             = 62464, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_244
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464              = 62464, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_245
++        {
++            INVERSE_PIXEL_VALUE_245_UNNAMED62720                             = 62720, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_245
++        {
++            FORWARD_PIXEL_VALUE_245_UNNAMED62720                             = 62720, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_245
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720              = 62720, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_246
++        {
++            INVERSE_PIXEL_VALUE_246_UNNAMED62976                             = 62976, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_246
++        {
++            FORWARD_PIXEL_VALUE_246_UNNAMED62976                             = 62976, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_246
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976              = 62976, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_247
++        {
++            INVERSE_PIXEL_VALUE_247_UNNAMED63232                             = 63232, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_247
++        {
++            FORWARD_PIXEL_VALUE_247_UNNAMED63232                             = 63232, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_247
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232              = 63232, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_248
++        {
++            INVERSE_PIXEL_VALUE_248_UNNAMED63488                             = 63488, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_248
++        {
++            FORWARD_PIXEL_VALUE_248_UNNAMED63488                             = 63488, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_248
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488              = 63488, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_249
++        {
++            INVERSE_PIXEL_VALUE_249_UNNAMED63744                             = 63744, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_249
++        {
++            FORWARD_PIXEL_VALUE_249_UNNAMED63744                             = 63744, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_249
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744              = 63744, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_250
++        {
++            INVERSE_PIXEL_VALUE_250_UNNAMED64000                             = 64000, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_250
++        {
++            FORWARD_PIXEL_VALUE_250_UNNAMED64000                             = 64000, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_250
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000              = 64000, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_251
++        {
++            INVERSE_PIXEL_VALUE_251_UNNAMED64256                             = 64256, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_251
++        {
++            FORWARD_PIXEL_VALUE_251_UNNAMED64256                             = 64256, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_251
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256              = 64256, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_252
++        {
++            INVERSE_PIXEL_VALUE_252_UNNAMED64512                             = 64512, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_252
++        {
++            FORWARD_PIXEL_VALUE_252_UNNAMED64512                             = 64512, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_252
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512              = 64512, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_253
++        {
++            INVERSE_PIXEL_VALUE_253_UNNAMED64768                             = 64768, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_253
++        {
++            FORWARD_PIXEL_VALUE_253_UNNAMED64768                             = 64768, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_253
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768              = 64768, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_254
++        {
++            INVERSE_PIXEL_VALUE_254_UNNAMED65024                             = 65024, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_254
++        {
++            FORWARD_PIXEL_VALUE_254_UNNAMED65024                             = 65024, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_254
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024              = 65024, ///<
++        };
++        enum INVERSE_G_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            INVERSE_G_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++        enum INVERSE_B_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            INVERSE_B_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++        enum INVERSE_PIXEL_VALUE_255
++        {
++            INVERSE_PIXEL_VALUE_255_UNNAMED65535                             = 65535, ///<
++        };
++        enum INVERSE_R_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            INVERSE_R_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++        enum FORWARD_G_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            FORWARD_G_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++        enum FORWARD_B_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            FORWARD_B_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++        enum FORWARD_PIXEL_VALUE_255
++        {
++            FORWARD_PIXEL_VALUE_255_UNNAMED65535                             = 65535, ///<
++        };
++        enum FORWARD_R_CH_GAMMA_CORRECTED_VALUE_255
++        {
++            FORWARD_R_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535              = 65535, ///<
++        };
++
++        //! \name Initializations
++
++        //! \brief Explicit member initialization function
++        CM_RT_API Gamut_Expansion_Gamma_Correction_CMD() {
++            DW0.Value = 0;
++            DW0.InverseGChGammaCorrectedValue0 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++            DW0.InverseBChGammaCorrectedValue0 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++
++            DW1.Value = 0;
++            DW1.InversePixelValue0 = INVERSE_PIXEL_VALUE_0_UNNAMED0;
++            DW1.InverseRChGammaCorrectedValue0 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++
++            DW2.Value = 0;
++            DW2.ForwardGChGammaCorrectedValue0 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++            DW2.ForwardBChGammaCorrectedValue0 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++
++            DW3.Value = 0;
++            DW3.ForwardPixelValue0 = FORWARD_PIXEL_VALUE_0_UNNAMED0;
++            DW3.ForwardRChGammaCorrectedValue0 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_0_UNNAMED0;
++
++            DW4.Value = 0;
++            DW4.InverseGChGammaCorrectedValue1 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++            DW4.InverseBChGammaCorrectedValue1 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++
++            DW5.Value = 0;
++            DW5.InversePixelValue1 = INVERSE_PIXEL_VALUE_1_UNNAMED256;
++            DW5.InverseRChGammaCorrectedValue1 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++
++            DW6.Value = 0;
++            DW6.ForwardGChGammaCorrectedValue1 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++            DW6.ForwardBChGammaCorrectedValue1 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++
++            DW7.Value = 0;
++            DW7.ForwardPixelValue1 = FORWARD_PIXEL_VALUE_1_UNNAMED256;
++            DW7.ForwardRChGammaCorrectedValue1 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_1_UNNAMED256;
++
++            DW8.Value = 0;
++            DW8.InverseGChGammaCorrectedValue2 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++            DW8.InverseBChGammaCorrectedValue2 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++
++            DW9.Value = 0;
++            DW9.InversePixelValue2 = INVERSE_PIXEL_VALUE_2_UNNAMED512;
++            DW9.InverseRChGammaCorrectedValue2 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++
++            DW10.Value = 0;
++            DW10.ForwardGChGammaCorrectedValue2 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++            DW10.ForwardBChGammaCorrectedValue2 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++
++            DW11.Value = 0;
++            DW11.ForwardPixelValue2 = FORWARD_PIXEL_VALUE_2_UNNAMED512;
++            DW11.ForwardRChGammaCorrectedValue2 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_2_UNNAMED512;
++
++            DW12.Value = 0;
++            DW12.InverseGChGammaCorrectedValue3 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++            DW12.InverseBChGammaCorrectedValue3 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++
++            DW13.Value = 0;
++            DW13.InversePixelValue3 = INVERSE_PIXEL_VALUE_3_UNNAMED768;
++            DW13.InverseRChGammaCorrectedValue3 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++
++            DW14.Value = 0;
++            DW14.ForwardGChGammaCorrectedValue3 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++            DW14.ForwardBChGammaCorrectedValue3 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++
++            DW15.Value = 0;
++            DW15.ForwardPixelValue3 = FORWARD_PIXEL_VALUE_3_UNNAMED768;
++            DW15.ForwardRChGammaCorrectedValue3 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_3_UNNAMED768;
++
++            DW16.Value = 0;
++            DW16.InverseGChGammaCorrectedValue4 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++            DW16.InverseBChGammaCorrectedValue4 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++
++            DW17.Value = 0;
++            DW17.InversePixelValue4 = INVERSE_PIXEL_VALUE_4_UNNAMED1024;
++            DW17.InverseRChGammaCorrectedValue4 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++
++            DW18.Value = 0;
++            DW18.ForwardGChGammaCorrectedValue4 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++            DW18.ForwardBChGammaCorrectedValue4 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++
++            DW19.Value = 0;
++            DW19.ForwardPixelValue4 = FORWARD_PIXEL_VALUE_4_UNNAMED1024;
++            DW19.ForwardRChGammaCorrectedValue4 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_4_UNNAMED1024;
++
++            DW20.Value = 0;
++            DW20.InverseGChGammaCorrectedValue5 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++            DW20.InverseBChGammaCorrectedValue5 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++
++            DW21.Value = 0;
++            DW21.InversePixelValue5 = INVERSE_PIXEL_VALUE_5_UNNAMED1280;
++            DW21.InverseRChGammaCorrectedValue5 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++
++            DW22.Value = 0;
++            DW22.ForwardGChGammaCorrectedValue5 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++            DW22.ForwardBChGammaCorrectedValue5 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++
++            DW23.Value = 0;
++            DW23.ForwardPixelValue5 = FORWARD_PIXEL_VALUE_5_UNNAMED1280;
++            DW23.ForwardRChGammaCorrectedValue5 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_5_UNNAMED1280;
++
++            DW24.Value = 0;
++            DW24.InverseGChGammaCorrectedValue6 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++            DW24.InverseBChGammaCorrectedValue6 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++
++            DW25.Value = 0;
++            DW25.InversePixelValue6 = INVERSE_PIXEL_VALUE_6_UNNAMED1536;
++            DW25.InverseRChGammaCorrectedValue6 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++
++            DW26.Value = 0;
++            DW26.ForwardGChGammaCorrectedValue6 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++            DW26.ForwardBChGammaCorrectedValue6 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++
++            DW27.Value = 0;
++            DW27.ForwardPixelValue6 = FORWARD_PIXEL_VALUE_6_UNNAMED1536;
++            DW27.ForwardRChGammaCorrectedValue6 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_6_UNNAMED1536;
++
++            DW28.Value = 0;
++            DW28.InverseGChGammaCorrectedValue7 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++            DW28.InverseBChGammaCorrectedValue7 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++
++            DW29.Value = 0;
++            DW29.InversePixelValue7 = INVERSE_PIXEL_VALUE_7_UNNAMED1792;
++            DW29.InverseRChGammaCorrectedValue7 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++
++            DW30.Value = 0;
++            DW30.ForwardGChGammaCorrectedValue7 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++            DW30.ForwardBChGammaCorrectedValue7 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++
++            DW31.Value = 0;
++            DW31.ForwardPixelValue7 = FORWARD_PIXEL_VALUE_7_UNNAMED1792;
++            DW31.ForwardRChGammaCorrectedValue7 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_7_UNNAMED1792;
++
++            DW32.Value = 0;
++            DW32.InverseGChGammaCorrectedValue8 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++            DW32.InverseBChGammaCorrectedValue8 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++
++            DW33.Value = 0;
++            DW33.InversePixelValue8 = INVERSE_PIXEL_VALUE_8_UNNAMED2048;
++            DW33.InverseRChGammaCorrectedValue8 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++
++            DW34.Value = 0;
++            DW34.ForwardGChGammaCorrectedValue8 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++            DW34.ForwardBChGammaCorrectedValue8 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++
++            DW35.Value = 0;
++            DW35.ForwardPixelValue8 = FORWARD_PIXEL_VALUE_8_UNNAMED2048;
++            DW35.ForwardRChGammaCorrectedValue8 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_8_UNNAMED2048;
++
++            DW36.Value = 0;
++            DW36.InverseGChGammaCorrectedValue9 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++            DW36.InverseBChGammaCorrectedValue9 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++
++            DW37.Value = 0;
++            DW37.InversePixelValue9 = INVERSE_PIXEL_VALUE_9_UNNAMED2304;
++            DW37.InverseRChGammaCorrectedValue9 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++
++            DW38.Value = 0;
++            DW38.ForwardGChGammaCorrectedValue9 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++            DW38.ForwardBChGammaCorrectedValue9 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++
++            DW39.Value = 0;
++            DW39.ForwardPixelValue9 = FORWARD_PIXEL_VALUE_9_UNNAMED2304;
++            DW39.ForwardRChGammaCorrectedValue9 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_9_UNNAMED2304;
++
++            DW40.Value = 0;
++            DW40.InverseGChGammaCorrectedValue10 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++            DW40.InverseBChGammaCorrectedValue10 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++
++            DW41.Value = 0;
++            DW41.InversePixelValue10 = INVERSE_PIXEL_VALUE_10_UNNAMED2560;
++            DW41.InverseRChGammaCorrectedValue10 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++
++            DW42.Value = 0;
++            DW42.ForwardGChGammaCorrectedValue10 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++            DW42.ForwardBChGammaCorrectedValue10 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++
++            DW43.Value = 0;
++            DW43.ForwardPixelValue10 = FORWARD_PIXEL_VALUE_10_UNNAMED2560;
++            DW43.ForwardRChGammaCorrectedValue10 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_10_UNNAMED2560;
++
++            DW44.Value = 0;
++            DW44.InverseGChGammaCorrectedValue11 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++            DW44.InverseBChGammaCorrectedValue11 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++
++            DW45.Value = 0;
++            DW45.InversePixelValue11 = INVERSE_PIXEL_VALUE_11_UNNAMED2816;
++            DW45.InverseRChGammaCorrectedValue11 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++
++            DW46.Value = 0;
++            DW46.ForwardGChGammaCorrectedValue11 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++            DW46.ForwardBChGammaCorrectedValue11 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++
++            DW47.Value = 0;
++            DW47.ForwardPixelValue11 = FORWARD_PIXEL_VALUE_11_UNNAMED2816;
++            DW47.ForwardRChGammaCorrectedValue11 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_11_UNNAMED2816;
++
++            DW48.Value = 0;
++            DW48.InverseGChGammaCorrectedValue12 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++            DW48.InverseBChGammaCorrectedValue12 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++
++            DW49.Value = 0;
++            DW49.InversePixelValue12 = INVERSE_PIXEL_VALUE_12_UNNAMED3072;
++            DW49.InverseRChGammaCorrectedValue12 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++
++            DW50.Value = 0;
++            DW50.ForwardGChGammaCorrectedValue12 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++            DW50.ForwardBChGammaCorrectedValue12 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++
++            DW51.Value = 0;
++            DW51.ForwardPixelValue12 = FORWARD_PIXEL_VALUE_12_UNNAMED3072;
++            DW51.ForwardRChGammaCorrectedValue12 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_12_UNNAMED3072;
++
++            DW52.Value = 0;
++            DW52.InverseGChGammaCorrectedValue13 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++            DW52.InverseBChGammaCorrectedValue13 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++
++            DW53.Value = 0;
++            DW53.InversePixelValue13 = INVERSE_PIXEL_VALUE_13_UNNAMED3328;
++            DW53.InverseRChGammaCorrectedValue13 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++
++            DW54.Value = 0;
++            DW54.ForwardGChGammaCorrectedValue13 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++            DW54.ForwardBChGammaCorrectedValue13 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++
++            DW55.Value = 0;
++            DW55.ForwardPixelValue13 = FORWARD_PIXEL_VALUE_13_UNNAMED3328;
++            DW55.ForwardRChGammaCorrectedValue13 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_13_UNNAMED3328;
++
++            DW56.Value = 0;
++            DW56.InverseGChGammaCorrectedValue14 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++            DW56.InverseBChGammaCorrectedValue14 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++
++            DW57.Value = 0;
++            DW57.InversePixelValue14 = INVERSE_PIXEL_VALUE_14_UNNAMED3584;
++            DW57.InverseRChGammaCorrectedValue14 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++
++            DW58.Value = 0;
++            DW58.ForwardGChGammaCorrectedValue14 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++            DW58.ForwardBChGammaCorrectedValue14 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++
++            DW59.Value = 0;
++            DW59.ForwardPixelValue14 = FORWARD_PIXEL_VALUE_14_UNNAMED3584;
++            DW59.ForwardRChGammaCorrectedValue14 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_14_UNNAMED3584;
++
++            DW60.Value = 0;
++            DW60.InverseGChGammaCorrectedValue15 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++            DW60.InverseBChGammaCorrectedValue15 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++
++            DW61.Value = 0;
++            DW61.InversePixelValue15 = INVERSE_PIXEL_VALUE_15_UNNAMED3840;
++            DW61.InverseRChGammaCorrectedValue15 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++
++            DW62.Value = 0;
++            DW62.ForwardGChGammaCorrectedValue15 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++            DW62.ForwardBChGammaCorrectedValue15 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++
++            DW63.Value = 0;
++            DW63.ForwardPixelValue15 = FORWARD_PIXEL_VALUE_15_UNNAMED3840;
++            DW63.ForwardRChGammaCorrectedValue15 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_15_UNNAMED3840;
++
++            DW64.Value = 0;
++            DW64.InverseGChGammaCorrectedValue16 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++            DW64.InverseBChGammaCorrectedValue16 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++
++            DW65.Value = 0;
++            DW65.InversePixelValue16 = INVERSE_PIXEL_VALUE_16_UNNAMED4096;
++            DW65.InverseRChGammaCorrectedValue16 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++
++            DW66.Value = 0;
++            DW66.ForwardGChGammaCorrectedValue16 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++            DW66.ForwardBChGammaCorrectedValue16 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++
++            DW67.Value = 0;
++            DW67.ForwardPixelValue16 = FORWARD_PIXEL_VALUE_16_UNNAMED4096;
++            DW67.ForwardRChGammaCorrectedValue16 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_16_UNNAMED4096;
++
++            DW68.Value = 0;
++            DW68.InverseGChGammaCorrectedValue17 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++            DW68.InverseBChGammaCorrectedValue17 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++
++            DW69.Value = 0;
++            DW69.InversePixelValue17 = INVERSE_PIXEL_VALUE_17_UNNAMED4352;
++            DW69.InverseRChGammaCorrectedValue17 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++
++            DW70.Value = 0;
++            DW70.ForwardGChGammaCorrectedValue17 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++            DW70.ForwardBChGammaCorrectedValue17 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++
++            DW71.Value = 0;
++            DW71.ForwardPixelValue17 = FORWARD_PIXEL_VALUE_17_UNNAMED4352;
++            DW71.ForwardRChGammaCorrectedValue17 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_17_UNNAMED4352;
++
++            DW72.Value = 0;
++            DW72.InverseGChGammaCorrectedValue18 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++            DW72.InverseBChGammaCorrectedValue18 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++
++            DW73.Value = 0;
++            DW73.InversePixelValue18 = INVERSE_PIXEL_VALUE_18_UNNAMED4608;
++            DW73.InverseRChGammaCorrectedValue18 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++
++            DW74.Value = 0;
++            DW74.ForwardGChGammaCorrectedValue18 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++            DW74.ForwardBChGammaCorrectedValue18 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++
++            DW75.Value = 0;
++            DW75.ForwardPixelValue18 = FORWARD_PIXEL_VALUE_18_UNNAMED4608;
++            DW75.ForwardRChGammaCorrectedValue18 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_18_UNNAMED4608;
++
++            DW76.Value = 0;
++            DW76.InverseGChGammaCorrectedValue19 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++            DW76.InverseBChGammaCorrectedValue19 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++
++            DW77.Value = 0;
++            DW77.InversePixelValue19 = INVERSE_PIXEL_VALUE_19_UNNAMED4864;
++            DW77.InverseRChGammaCorrectedValue19 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++
++            DW78.Value = 0;
++            DW78.ForwardGChGammaCorrectedValue19 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++            DW78.ForwardBChGammaCorrectedValue19 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++
++            DW79.Value = 0;
++            DW79.ForwardPixelValue19 = FORWARD_PIXEL_VALUE_19_UNNAMED4864;
++            DW79.ForwardRChGammaCorrectedValue19 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_19_UNNAMED4864;
++
++            DW80.Value = 0;
++            DW80.InverseGChGammaCorrectedValue20 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++            DW80.InverseBChGammaCorrectedValue20 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++
++            DW81.Value = 0;
++            DW81.InversePixelValue20 = INVERSE_PIXEL_VALUE_20_UNNAMED5120;
++            DW81.InverseRChGammaCorrectedValue20 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++
++            DW82.Value = 0;
++            DW82.ForwardGChGammaCorrectedValue20 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++            DW82.ForwardBChGammaCorrectedValue20 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++
++            DW83.Value = 0;
++            DW83.ForwardPixelValue20 = FORWARD_PIXEL_VALUE_20_UNNAMED5120;
++            DW83.ForwardRChGammaCorrectedValue20 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_20_UNNAMED5120;
++
++            DW84.Value = 0;
++            DW84.InverseGChGammaCorrectedValue21 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++            DW84.InverseBChGammaCorrectedValue21 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++
++            DW85.Value = 0;
++            DW85.InversePixelValue21 = INVERSE_PIXEL_VALUE_21_UNNAMED5376;
++            DW85.InverseRChGammaCorrectedValue21 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++
++            DW86.Value = 0;
++            DW86.ForwardGChGammaCorrectedValue21 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++            DW86.ForwardBChGammaCorrectedValue21 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++
++            DW87.Value = 0;
++            DW87.ForwardPixelValue21 = FORWARD_PIXEL_VALUE_21_UNNAMED5376;
++            DW87.ForwardRChGammaCorrectedValue21 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_21_UNNAMED5376;
++
++            DW88.Value = 0;
++            DW88.InverseGChGammaCorrectedValue22 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++            DW88.InverseBChGammaCorrectedValue22 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++
++            DW89.Value = 0;
++            DW89.InversePixelValue22 = INVERSE_PIXEL_VALUE_22_UNNAMED5632;
++            DW89.InverseRChGammaCorrectedValue22 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++
++            DW90.Value = 0;
++            DW90.ForwardGChGammaCorrectedValue22 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++            DW90.ForwardBChGammaCorrectedValue22 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++
++            DW91.Value = 0;
++            DW91.ForwardPixelValue22 = FORWARD_PIXEL_VALUE_22_UNNAMED5632;
++            DW91.ForwardRChGammaCorrectedValue22 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_22_UNNAMED5632;
++
++            DW92.Value = 0;
++            DW92.InverseGChGammaCorrectedValue23 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++            DW92.InverseBChGammaCorrectedValue23 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++
++            DW93.Value = 0;
++            DW93.InversePixelValue23 = INVERSE_PIXEL_VALUE_23_UNNAMED5888;
++            DW93.InverseRChGammaCorrectedValue23 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++
++            DW94.Value = 0;
++            DW94.ForwardGChGammaCorrectedValue23 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++            DW94.ForwardBChGammaCorrectedValue23 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++
++            DW95.Value = 0;
++            DW95.ForwardPixelValue23 = FORWARD_PIXEL_VALUE_23_UNNAMED5888;
++            DW95.ForwardRChGammaCorrectedValue23 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_23_UNNAMED5888;
++
++            DW96.Value = 0;
++            DW96.InverseGChGammaCorrectedValue24 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++            DW96.InverseBChGammaCorrectedValue24 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++
++            DW97.Value = 0;
++            DW97.InversePixelValue24 = INVERSE_PIXEL_VALUE_24_UNNAMED6144;
++            DW97.InverseRChGammaCorrectedValue24 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++
++            DW98.Value = 0;
++            DW98.ForwardGChGammaCorrectedValue24 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++            DW98.ForwardBChGammaCorrectedValue24 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++
++            DW99.Value = 0;
++            DW99.ForwardPixelValue24 = FORWARD_PIXEL_VALUE_24_UNNAMED6144;
++            DW99.ForwardRChGammaCorrectedValue24 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_24_UNNAMED6144;
++
++            DW100.Value = 0;
++            DW100.InverseGChGammaCorrectedValue25 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++            DW100.InverseBChGammaCorrectedValue25 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++
++            DW101.Value = 0;
++            DW101.InversePixelValue25 = INVERSE_PIXEL_VALUE_25_UNNAMED6400;
++            DW101.InverseRChGammaCorrectedValue25 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++
++            DW102.Value = 0;
++            DW102.ForwardGChGammaCorrectedValue25 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++            DW102.ForwardBChGammaCorrectedValue25 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++
++            DW103.Value = 0;
++            DW103.ForwardPixelValue25 = FORWARD_PIXEL_VALUE_25_UNNAMED6400;
++            DW103.ForwardRChGammaCorrectedValue25 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_25_UNNAMED6400;
++
++            DW104.Value = 0;
++            DW104.InverseGChGammaCorrectedValue26 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++            DW104.InverseBChGammaCorrectedValue26 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++
++            DW105.Value = 0;
++            DW105.InversePixelValue26 = INVERSE_PIXEL_VALUE_26_UNNAMED6656;
++            DW105.InverseRChGammaCorrectedValue26 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++
++            DW106.Value = 0;
++            DW106.ForwardGChGammaCorrectedValue26 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++            DW106.ForwardBChGammaCorrectedValue26 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++
++            DW107.Value = 0;
++            DW107.ForwardPixelValue26 = FORWARD_PIXEL_VALUE_26_UNNAMED6656;
++            DW107.ForwardRChGammaCorrectedValue26 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_26_UNNAMED6656;
++
++            DW108.Value = 0;
++            DW108.InverseGChGammaCorrectedValue27 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++            DW108.InverseBChGammaCorrectedValue27 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++
++            DW109.Value = 0;
++            DW109.InversePixelValue27 = INVERSE_PIXEL_VALUE_27_UNNAMED6912;
++            DW109.InverseRChGammaCorrectedValue27 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++
++            DW110.Value = 0;
++            DW110.ForwardGChGammaCorrectedValue27 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++            DW110.ForwardBChGammaCorrectedValue27 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++
++            DW111.Value = 0;
++            DW111.ForwardPixelValue27 = FORWARD_PIXEL_VALUE_27_UNNAMED6912;
++            DW111.ForwardRChGammaCorrectedValue27 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_27_UNNAMED6912;
++
++            DW112.Value = 0;
++            DW112.InverseGChGammaCorrectedValue28 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++            DW112.InverseBChGammaCorrectedValue28 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++
++            DW113.Value = 0;
++            DW113.InversePixelValue28 = INVERSE_PIXEL_VALUE_28_UNNAMED7168;
++            DW113.InverseRChGammaCorrectedValue28 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++
++            DW114.Value = 0;
++            DW114.ForwardGChGammaCorrectedValue28 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++            DW114.ForwardBChGammaCorrectedValue28 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++
++            DW115.Value = 0;
++            DW115.ForwardPixelValue28 = FORWARD_PIXEL_VALUE_28_UNNAMED7168;
++            DW115.ForwardRChGammaCorrectedValue28 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_28_UNNAMED7168;
++
++            DW116.Value = 0;
++            DW116.InverseGChGammaCorrectedValue29 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++            DW116.InverseBChGammaCorrectedValue29 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++
++            DW117.Value = 0;
++            DW117.InversePixelValue29 = INVERSE_PIXEL_VALUE_29_UNNAMED7424;
++            DW117.InverseRChGammaCorrectedValue29 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++
++            DW118.Value = 0;
++            DW118.ForwardGChGammaCorrectedValue29 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++            DW118.ForwardBChGammaCorrectedValue29 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++
++            DW119.Value = 0;
++            DW119.ForwardPixelValue29 = FORWARD_PIXEL_VALUE_29_UNNAMED7424;
++            DW119.ForwardRChGammaCorrectedValue29 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_29_UNNAMED7424;
++
++            DW120.Value = 0;
++            DW120.InverseGChGammaCorrectedValue30 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++            DW120.InverseBChGammaCorrectedValue30 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++
++            DW121.Value = 0;
++            DW121.InversePixelValue30 = INVERSE_PIXEL_VALUE_30_UNNAMED7680;
++            DW121.InverseRChGammaCorrectedValue30 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++
++            DW122.Value = 0;
++            DW122.ForwardGChGammaCorrectedValue30 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++            DW122.ForwardBChGammaCorrectedValue30 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++
++            DW123.Value = 0;
++            DW123.ForwardPixelValue30 = FORWARD_PIXEL_VALUE_30_UNNAMED7680;
++            DW123.ForwardRChGammaCorrectedValue30 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_30_UNNAMED7680;
++
++            DW124.Value = 0;
++            DW124.InverseGChGammaCorrectedValue31 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++            DW124.InverseBChGammaCorrectedValue31 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++
++            DW125.Value = 0;
++            DW125.InversePixelValue31 = INVERSE_PIXEL_VALUE_31_UNNAMED7936;
++            DW125.InverseRChGammaCorrectedValue31 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++
++            DW126.Value = 0;
++            DW126.ForwardGChGammaCorrectedValue31 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++            DW126.ForwardBChGammaCorrectedValue31 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++
++            DW127.Value = 0;
++            DW127.ForwardPixelValue31 = FORWARD_PIXEL_VALUE_31_UNNAMED7936;
++            DW127.ForwardRChGammaCorrectedValue31 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_31_UNNAMED7936;
++
++            DW128.Value = 0;
++            DW128.InverseGChGammaCorrectedValue32 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++            DW128.InverseBChGammaCorrectedValue32 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++
++            DW129.Value = 0;
++            DW129.InversePixelValue32 = INVERSE_PIXEL_VALUE_32_UNNAMED8192;
++            DW129.InverseRChGammaCorrectedValue32 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++
++            DW130.Value = 0;
++            DW130.ForwardGChGammaCorrectedValue32 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++            DW130.ForwardBChGammaCorrectedValue32 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++
++            DW131.Value = 0;
++            DW131.ForwardPixelValue32 = FORWARD_PIXEL_VALUE_32_UNNAMED8192;
++            DW131.ForwardRChGammaCorrectedValue32 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_32_UNNAMED8192;
++
++            DW132.Value = 0;
++            DW132.InverseGChGammaCorrectedValue33 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++            DW132.InverseBChGammaCorrectedValue33 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++
++            DW133.Value = 0;
++            DW133.InversePixelValue33 = INVERSE_PIXEL_VALUE_33_UNNAMED8448;
++            DW133.InverseRChGammaCorrectedValue33 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++
++            DW134.Value = 0;
++            DW134.ForwardGChGammaCorrectedValue33 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++            DW134.ForwardBChGammaCorrectedValue33 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++
++            DW135.Value = 0;
++            DW135.ForwardPixelValue33 = FORWARD_PIXEL_VALUE_33_UNNAMED8448;
++            DW135.ForwardRChGammaCorrectedValue33 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_33_UNNAMED8448;
++
++            DW136.Value = 0;
++            DW136.InverseGChGammaCorrectedValue34 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++            DW136.InverseBChGammaCorrectedValue34 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++
++            DW137.Value = 0;
++            DW137.InversePixelValue34 = INVERSE_PIXEL_VALUE_34_UNNAMED8704;
++            DW137.InverseRChGammaCorrectedValue34 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++
++            DW138.Value = 0;
++            DW138.ForwardGChGammaCorrectedValue34 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++            DW138.ForwardBChGammaCorrectedValue34 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++
++            DW139.Value = 0;
++            DW139.ForwardPixelValue34 = FORWARD_PIXEL_VALUE_34_UNNAMED8704;
++            DW139.ForwardRChGammaCorrectedValue34 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_34_UNNAMED8704;
++
++            DW140.Value = 0;
++            DW140.InverseGChGammaCorrectedValue35 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++            DW140.InverseBChGammaCorrectedValue35 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++
++            DW141.Value = 0;
++            DW141.InversePixelValue35 = INVERSE_PIXEL_VALUE_35_UNNAMED8960;
++            DW141.InverseRChGammaCorrectedValue35 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++
++            DW142.Value = 0;
++            DW142.ForwardGChGammaCorrectedValue35 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++            DW142.ForwardBChGammaCorrectedValue35 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++
++            DW143.Value = 0;
++            DW143.ForwardPixelValue35 = FORWARD_PIXEL_VALUE_35_UNNAMED8960;
++            DW143.ForwardRChGammaCorrectedValue35 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_35_UNNAMED8960;
++
++            DW144.Value = 0;
++            DW144.InverseGChGammaCorrectedValue36 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++            DW144.InverseBChGammaCorrectedValue36 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++
++            DW145.Value = 0;
++            DW145.InversePixelValue36 = INVERSE_PIXEL_VALUE_36_UNNAMED9216;
++            DW145.InverseRChGammaCorrectedValue36 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++
++            DW146.Value = 0;
++            DW146.ForwardGChGammaCorrectedValue36 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++            DW146.ForwardBChGammaCorrectedValue36 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++
++            DW147.Value = 0;
++            DW147.ForwardPixelValue36 = FORWARD_PIXEL_VALUE_36_UNNAMED9216;
++            DW147.ForwardRChGammaCorrectedValue36 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_36_UNNAMED9216;
++
++            DW148.Value = 0;
++            DW148.InverseGChGammaCorrectedValue37 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++            DW148.InverseBChGammaCorrectedValue37 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++
++            DW149.Value = 0;
++            DW149.InversePixelValue37 = INVERSE_PIXEL_VALUE_37_UNNAMED9472;
++            DW149.InverseRChGammaCorrectedValue37 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++
++            DW150.Value = 0;
++            DW150.ForwardGChGammaCorrectedValue37 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++            DW150.ForwardBChGammaCorrectedValue37 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++
++            DW151.Value = 0;
++            DW151.ForwardPixelValue37 = FORWARD_PIXEL_VALUE_37_UNNAMED9472;
++            DW151.ForwardRChGammaCorrectedValue37 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_37_UNNAMED9472;
++
++            DW152.Value = 0;
++            DW152.InverseGChGammaCorrectedValue38 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++            DW152.InverseBChGammaCorrectedValue38 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++
++            DW153.Value = 0;
++            DW153.InversePixelValue38 = INVERSE_PIXEL_VALUE_38_UNNAMED9728;
++            DW153.InverseRChGammaCorrectedValue38 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++
++            DW154.Value = 0;
++            DW154.ForwardGChGammaCorrectedValue38 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++            DW154.ForwardBChGammaCorrectedValue38 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++
++            DW155.Value = 0;
++            DW155.ForwardPixelValue38 = FORWARD_PIXEL_VALUE_38_UNNAMED9728;
++            DW155.ForwardRChGammaCorrectedValue38 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_38_UNNAMED9728;
++
++            DW156.Value = 0;
++            DW156.InverseGChGammaCorrectedValue39 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++            DW156.InverseBChGammaCorrectedValue39 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++
++            DW157.Value = 0;
++            DW157.InversePixelValue39 = INVERSE_PIXEL_VALUE_39_UNNAMED9984;
++            DW157.InverseRChGammaCorrectedValue39 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++
++            DW158.Value = 0;
++            DW158.ForwardGChGammaCorrectedValue39 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++            DW158.ForwardBChGammaCorrectedValue39 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++
++            DW159.Value = 0;
++            DW159.ForwardPixelValue39 = FORWARD_PIXEL_VALUE_39_UNNAMED9984;
++            DW159.ForwardRChGammaCorrectedValue39 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_39_UNNAMED9984;
++
++            DW160.Value = 0;
++            DW160.InverseGChGammaCorrectedValue40 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++            DW160.InverseBChGammaCorrectedValue40 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++
++            DW161.Value = 0;
++            DW161.InversePixelValue40 = INVERSE_PIXEL_VALUE_40_UNNAMED10240;
++            DW161.InverseRChGammaCorrectedValue40 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++
++            DW162.Value = 0;
++            DW162.ForwardGChGammaCorrectedValue40 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++            DW162.ForwardBChGammaCorrectedValue40 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++
++            DW163.Value = 0;
++            DW163.ForwardPixelValue40 = FORWARD_PIXEL_VALUE_40_UNNAMED10240;
++            DW163.ForwardRChGammaCorrectedValue40 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_40_UNNAMED10240;
++
++            DW164.Value = 0;
++            DW164.InverseGChGammaCorrectedValue41 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++            DW164.InverseBChGammaCorrectedValue41 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++
++            DW165.Value = 0;
++            DW165.InversePixelValue41 = INVERSE_PIXEL_VALUE_41_UNNAMED10496;
++            DW165.InverseRChGammaCorrectedValue41 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++
++            DW166.Value = 0;
++            DW166.ForwardGChGammaCorrectedValue41 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++            DW166.ForwardBChGammaCorrectedValue41 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++
++            DW167.Value = 0;
++            DW167.ForwardPixelValue41 = FORWARD_PIXEL_VALUE_41_UNNAMED10496;
++            DW167.ForwardRChGammaCorrectedValue41 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_41_UNNAMED10496;
++
++            DW168.Value = 0;
++            DW168.InverseGChGammaCorrectedValue42 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++            DW168.InverseBChGammaCorrectedValue42 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++
++            DW169.Value = 0;
++            DW169.InversePixelValue42 = INVERSE_PIXEL_VALUE_42_UNNAMED10752;
++            DW169.InverseRChGammaCorrectedValue42 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++
++            DW170.Value = 0;
++            DW170.ForwardGChGammaCorrectedValue42 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++            DW170.ForwardBChGammaCorrectedValue42 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++
++            DW171.Value = 0;
++            DW171.ForwardPixelValue42 = FORWARD_PIXEL_VALUE_42_UNNAMED10752;
++            DW171.ForwardRChGammaCorrectedValue42 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_42_UNNAMED10752;
++
++            DW172.Value = 0;
++            DW172.InverseGChGammaCorrectedValue43 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++            DW172.InverseBChGammaCorrectedValue43 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++
++            DW173.Value = 0;
++            DW173.InversePixelValue43 = INVERSE_PIXEL_VALUE_43_UNNAMED11008;
++            DW173.InverseRChGammaCorrectedValue43 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++
++            DW174.Value = 0;
++            DW174.ForwardGChGammaCorrectedValue43 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++            DW174.ForwardBChGammaCorrectedValue43 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++
++            DW175.Value = 0;
++            DW175.ForwardPixelValue43 = FORWARD_PIXEL_VALUE_43_UNNAMED11008;
++            DW175.ForwardRChGammaCorrectedValue43 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_43_UNNAMED11008;
++
++            DW176.Value = 0;
++            DW176.InverseGChGammaCorrectedValue44 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++            DW176.InverseBChGammaCorrectedValue44 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++
++            DW177.Value = 0;
++            DW177.InversePixelValue44 = INVERSE_PIXEL_VALUE_44_UNNAMED11264;
++            DW177.InverseRChGammaCorrectedValue44 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++
++            DW178.Value = 0;
++            DW178.ForwardGChGammaCorrectedValue44 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++            DW178.ForwardBChGammaCorrectedValue44 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++
++            DW179.Value = 0;
++            DW179.ForwardPixelValue44 = FORWARD_PIXEL_VALUE_44_UNNAMED11264;
++            DW179.ForwardRChGammaCorrectedValue44 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_44_UNNAMED11264;
++
++            DW180.Value = 0;
++            DW180.InverseGChGammaCorrectedValue45 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++            DW180.InverseBChGammaCorrectedValue45 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++
++            DW181.Value = 0;
++            DW181.InversePixelValue45 = INVERSE_PIXEL_VALUE_45_UNNAMED11520;
++            DW181.InverseRChGammaCorrectedValue45 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++
++            DW182.Value = 0;
++            DW182.ForwardGChGammaCorrectedValue45 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++            DW182.ForwardBChGammaCorrectedValue45 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++
++            DW183.Value = 0;
++            DW183.ForwardPixelValue45 = FORWARD_PIXEL_VALUE_45_UNNAMED11520;
++            DW183.ForwardRChGammaCorrectedValue45 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_45_UNNAMED11520;
++
++            DW184.Value = 0;
++            DW184.InverseGChGammaCorrectedValue46 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++            DW184.InverseBChGammaCorrectedValue46 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++
++            DW185.Value = 0;
++            DW185.InversePixelValue46 = INVERSE_PIXEL_VALUE_46_UNNAMED11776;
++            DW185.InverseRChGammaCorrectedValue46 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++
++            DW186.Value = 0;
++            DW186.ForwardGChGammaCorrectedValue46 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++            DW186.ForwardBChGammaCorrectedValue46 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++
++            DW187.Value = 0;
++            DW187.ForwardPixelValue46 = FORWARD_PIXEL_VALUE_46_UNNAMED11776;
++            DW187.ForwardRChGammaCorrectedValue46 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_46_UNNAMED11776;
++
++            DW188.Value = 0;
++            DW188.InverseGChGammaCorrectedValue47 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++            DW188.InverseBChGammaCorrectedValue47 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++
++            DW189.Value = 0;
++            DW189.InversePixelValue47 = INVERSE_PIXEL_VALUE_47_UNNAMED12032;
++            DW189.InverseRChGammaCorrectedValue47 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++
++            DW190.Value = 0;
++            DW190.ForwardGChGammaCorrectedValue47 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++            DW190.ForwardBChGammaCorrectedValue47 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++
++            DW191.Value = 0;
++            DW191.ForwardPixelValue47 = FORWARD_PIXEL_VALUE_47_UNNAMED12032;
++            DW191.ForwardRChGammaCorrectedValue47 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_47_UNNAMED12032;
++
++            DW192.Value = 0;
++            DW192.InverseGChGammaCorrectedValue48 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++            DW192.InverseBChGammaCorrectedValue48 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++
++            DW193.Value = 0;
++            DW193.InversePixelValue48 = INVERSE_PIXEL_VALUE_48_UNNAMED12288;
++            DW193.InverseRChGammaCorrectedValue48 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++
++            DW194.Value = 0;
++            DW194.ForwardGChGammaCorrectedValue48 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++            DW194.ForwardBChGammaCorrectedValue48 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++
++            DW195.Value = 0;
++            DW195.ForwardPixelValue48 = FORWARD_PIXEL_VALUE_48_UNNAMED12288;
++            DW195.ForwardRChGammaCorrectedValue48 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_48_UNNAMED12288;
++
++            DW196.Value = 0;
++            DW196.InverseGChGammaCorrectedValue49 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++            DW196.InverseBChGammaCorrectedValue49 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++
++            DW197.Value = 0;
++            DW197.InversePixelValue49 = INVERSE_PIXEL_VALUE_49_UNNAMED12544;
++            DW197.InverseRChGammaCorrectedValue49 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++
++            DW198.Value = 0;
++            DW198.ForwardGChGammaCorrectedValue49 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++            DW198.ForwardBChGammaCorrectedValue49 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++
++            DW199.Value = 0;
++            DW199.ForwardPixelValue49 = FORWARD_PIXEL_VALUE_49_UNNAMED12544;
++            DW199.ForwardRChGammaCorrectedValue49 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_49_UNNAMED12544;
++
++            DW200.Value = 0;
++            DW200.InverseGChGammaCorrectedValue50 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++            DW200.InverseBChGammaCorrectedValue50 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++
++            DW201.Value = 0;
++            DW201.InversePixelValue50 = INVERSE_PIXEL_VALUE_50_UNNAMED12800;
++            DW201.InverseRChGammaCorrectedValue50 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++
++            DW202.Value = 0;
++            DW202.ForwardGChGammaCorrectedValue50 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++            DW202.ForwardBChGammaCorrectedValue50 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++
++            DW203.Value = 0;
++            DW203.ForwardPixelValue50 = FORWARD_PIXEL_VALUE_50_UNNAMED12800;
++            DW203.ForwardRChGammaCorrectedValue50 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_50_UNNAMED12800;
++
++            DW204.Value = 0;
++            DW204.InverseGChGammaCorrectedValue51 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++            DW204.InverseBChGammaCorrectedValue51 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++
++            DW205.Value = 0;
++            DW205.InversePixelValue51 = INVERSE_PIXEL_VALUE_51_UNNAMED13056;
++            DW205.InverseRChGammaCorrectedValue51 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++
++            DW206.Value = 0;
++            DW206.ForwardGChGammaCorrectedValue51 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++            DW206.ForwardBChGammaCorrectedValue51 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++
++            DW207.Value = 0;
++            DW207.ForwardPixelValue51 = FORWARD_PIXEL_VALUE_51_UNNAMED13056;
++            DW207.ForwardRChGammaCorrectedValue51 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_51_UNNAMED13056;
++
++            DW208.Value = 0;
++            DW208.InverseGChGammaCorrectedValue52 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++            DW208.InverseBChGammaCorrectedValue52 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++
++            DW209.Value = 0;
++            DW209.InversePixelValue52 = INVERSE_PIXEL_VALUE_52_UNNAMED13312;
++            DW209.InverseRChGammaCorrectedValue52 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++
++            DW210.Value = 0;
++            DW210.ForwardGChGammaCorrectedValue52 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++            DW210.ForwardBChGammaCorrectedValue52 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++
++            DW211.Value = 0;
++            DW211.ForwardPixelValue52 = FORWARD_PIXEL_VALUE_52_UNNAMED13312;
++            DW211.ForwardRChGammaCorrectedValue52 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_52_UNNAMED13312;
++
++            DW212.Value = 0;
++            DW212.InverseGChGammaCorrectedValue53 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++            DW212.InverseBChGammaCorrectedValue53 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++
++            DW213.Value = 0;
++            DW213.InversePixelValue53 = INVERSE_PIXEL_VALUE_53_UNNAMED13568;
++            DW213.InverseRChGammaCorrectedValue53 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++
++            DW214.Value = 0;
++            DW214.ForwardGChGammaCorrectedValue53 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++            DW214.ForwardBChGammaCorrectedValue53 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++
++            DW215.Value = 0;
++            DW215.ForwardPixelValue53 = FORWARD_PIXEL_VALUE_53_UNNAMED13568;
++            DW215.ForwardRChGammaCorrectedValue53 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_53_UNNAMED13568;
++
++            DW216.Value = 0;
++            DW216.InverseGChGammaCorrectedValue54 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++            DW216.InverseBChGammaCorrectedValue54 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++
++            DW217.Value = 0;
++            DW217.InversePixelValue54 = INVERSE_PIXEL_VALUE_54_UNNAMED13824;
++            DW217.InverseRChGammaCorrectedValue54 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++
++            DW218.Value = 0;
++            DW218.ForwardGChGammaCorrectedValue54 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++            DW218.ForwardBChGammaCorrectedValue54 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++
++            DW219.Value = 0;
++            DW219.ForwardPixelValue54 = FORWARD_PIXEL_VALUE_54_UNNAMED13824;
++            DW219.ForwardRChGammaCorrectedValue54 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_54_UNNAMED13824;
++
++            DW220.Value = 0;
++            DW220.InverseGChGammaCorrectedValue55 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++            DW220.InverseBChGammaCorrectedValue55 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++
++            DW221.Value = 0;
++            DW221.InversePixelValue55 = INVERSE_PIXEL_VALUE_55_UNNAMED14080;
++            DW221.InverseRChGammaCorrectedValue55 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++
++            DW222.Value = 0;
++            DW222.ForwardGChGammaCorrectedValue55 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++            DW222.ForwardBChGammaCorrectedValue55 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++
++            DW223.Value = 0;
++            DW223.ForwardPixelValue55 = FORWARD_PIXEL_VALUE_55_UNNAMED14080;
++            DW223.ForwardRChGammaCorrectedValue55 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_55_UNNAMED14080;
++
++            DW224.Value = 0;
++            DW224.InverseGChGammaCorrectedValue56 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++            DW224.InverseBChGammaCorrectedValue56 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++
++            DW225.Value = 0;
++            DW225.InversePixelValue56 = INVERSE_PIXEL_VALUE_56_UNNAMED14336;
++            DW225.InverseRChGammaCorrectedValue56 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++
++            DW226.Value = 0;
++            DW226.ForwardGChGammaCorrectedValue56 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++            DW226.ForwardBChGammaCorrectedValue56 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++
++            DW227.Value = 0;
++            DW227.ForwardPixelValue56 = FORWARD_PIXEL_VALUE_56_UNNAMED14336;
++            DW227.ForwardRChGammaCorrectedValue56 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_56_UNNAMED14336;
++
++            DW228.Value = 0;
++            DW228.InverseGChGammaCorrectedValue57 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++            DW228.InverseBChGammaCorrectedValue57 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++
++            DW229.Value = 0;
++            DW229.InversePixelValue57 = INVERSE_PIXEL_VALUE_57_UNNAMED14592;
++            DW229.InverseRChGammaCorrectedValue57 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++
++            DW230.Value = 0;
++            DW230.ForwardGChGammaCorrectedValue57 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++            DW230.ForwardBChGammaCorrectedValue57 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++
++            DW231.Value = 0;
++            DW231.ForwardPixelValue57 = FORWARD_PIXEL_VALUE_57_UNNAMED14592;
++            DW231.ForwardRChGammaCorrectedValue57 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_57_UNNAMED14592;
++
++            DW232.Value = 0;
++            DW232.InverseGChGammaCorrectedValue58 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++            DW232.InverseBChGammaCorrectedValue58 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++
++            DW233.Value = 0;
++            DW233.InversePixelValue58 = INVERSE_PIXEL_VALUE_58_UNNAMED14848;
++            DW233.InverseRChGammaCorrectedValue58 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++
++            DW234.Value = 0;
++            DW234.ForwardGChGammaCorrectedValue58 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++            DW234.ForwardBChGammaCorrectedValue58 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++
++            DW235.Value = 0;
++            DW235.ForwardPixelValue58 = FORWARD_PIXEL_VALUE_58_UNNAMED14848;
++            DW235.ForwardRChGammaCorrectedValue58 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_58_UNNAMED14848;
++
++            DW236.Value = 0;
++            DW236.InverseGChGammaCorrectedValue59 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++            DW236.InverseBChGammaCorrectedValue59 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++
++            DW237.Value = 0;
++            DW237.InversePixelValue59 = INVERSE_PIXEL_VALUE_59_UNNAMED15104;
++            DW237.InverseRChGammaCorrectedValue59 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++
++            DW238.Value = 0;
++            DW238.ForwardGChGammaCorrectedValue59 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++            DW238.ForwardBChGammaCorrectedValue59 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++
++            DW239.Value = 0;
++            DW239.ForwardPixelValue59 = FORWARD_PIXEL_VALUE_59_UNNAMED15104;
++            DW239.ForwardRChGammaCorrectedValue59 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_59_UNNAMED15104;
++
++            DW240.Value = 0;
++            DW240.InverseGChGammaCorrectedValue60 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++            DW240.InverseBChGammaCorrectedValue60 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++
++            DW241.Value = 0;
++            DW241.InversePixelValue60 = INVERSE_PIXEL_VALUE_60_UNNAMED15360;
++            DW241.InverseRChGammaCorrectedValue60 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++
++            DW242.Value = 0;
++            DW242.ForwardGChGammaCorrectedValue60 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++            DW242.ForwardBChGammaCorrectedValue60 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++
++            DW243.Value = 0;
++            DW243.ForwardPixelValue60 = FORWARD_PIXEL_VALUE_60_UNNAMED15360;
++            DW243.ForwardRChGammaCorrectedValue60 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_60_UNNAMED15360;
++
++            DW244.Value = 0;
++            DW244.InverseGChGammaCorrectedValue61 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++            DW244.InverseBChGammaCorrectedValue61 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++
++            DW245.Value = 0;
++            DW245.InversePixelValue61 = INVERSE_PIXEL_VALUE_61_UNNAMED15616;
++            DW245.InverseRChGammaCorrectedValue61 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++
++            DW246.Value = 0;
++            DW246.ForwardGChGammaCorrectedValue61 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++            DW246.ForwardBChGammaCorrectedValue61 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++
++            DW247.Value = 0;
++            DW247.ForwardPixelValue61 = FORWARD_PIXEL_VALUE_61_UNNAMED15616;
++            DW247.ForwardRChGammaCorrectedValue61 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_61_UNNAMED15616;
++
++            DW248.Value = 0;
++            DW248.InverseGChGammaCorrectedValue62 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++            DW248.InverseBChGammaCorrectedValue62 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++
++            DW249.Value = 0;
++            DW249.InversePixelValue62 = INVERSE_PIXEL_VALUE_62_UNNAMED15872;
++            DW249.InverseRChGammaCorrectedValue62 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++
++            DW250.Value = 0;
++            DW250.ForwardGChGammaCorrectedValue62 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++            DW250.ForwardBChGammaCorrectedValue62 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++
++            DW251.Value = 0;
++            DW251.ForwardPixelValue62 = FORWARD_PIXEL_VALUE_62_UNNAMED15872;
++            DW251.ForwardRChGammaCorrectedValue62 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_62_UNNAMED15872;
++
++            DW252.Value = 0;
++            DW252.InverseGChGammaCorrectedValue63 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++            DW252.InverseBChGammaCorrectedValue63 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++
++            DW253.Value = 0;
++            DW253.InversePixelValue63 = INVERSE_PIXEL_VALUE_63_UNNAMED16128;
++            DW253.InverseRChGammaCorrectedValue63 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++
++            DW254.Value = 0;
++            DW254.ForwardGChGammaCorrectedValue63 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++            DW254.ForwardBChGammaCorrectedValue63 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++
++            DW255.Value = 0;
++            DW255.ForwardPixelValue63 = FORWARD_PIXEL_VALUE_63_UNNAMED16128;
++            DW255.ForwardRChGammaCorrectedValue63 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_63_UNNAMED16128;
++
++            DW256.Value = 0;
++            DW256.InverseGChGammaCorrectedValue64 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++            DW256.InverseBChGammaCorrectedValue64 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++
++            DW257.Value = 0;
++            DW257.InversePixelValue64 = INVERSE_PIXEL_VALUE_64_UNNAMED16384;
++            DW257.InverseRChGammaCorrectedValue64 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++
++            DW258.Value = 0;
++            DW258.ForwardGChGammaCorrectedValue64 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++            DW258.ForwardBChGammaCorrectedValue64 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++
++            DW259.Value = 0;
++            DW259.ForwardPixelValue64 = FORWARD_PIXEL_VALUE_64_UNNAMED16384;
++            DW259.ForwardRChGammaCorrectedValue64 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_64_UNNAMED16384;
++
++            DW260.Value = 0;
++            DW260.InverseGChGammaCorrectedValue65 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++            DW260.InverseBChGammaCorrectedValue65 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++
++            DW261.Value = 0;
++            DW261.InversePixelValue65 = INVERSE_PIXEL_VALUE_65_UNNAMED16640;
++            DW261.InverseRChGammaCorrectedValue65 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++
++            DW262.Value = 0;
++            DW262.ForwardGChGammaCorrectedValue65 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++            DW262.ForwardBChGammaCorrectedValue65 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++
++            DW263.Value = 0;
++            DW263.ForwardPixelValue65 = FORWARD_PIXEL_VALUE_65_UNNAMED16640;
++            DW263.ForwardRChGammaCorrectedValue65 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_65_UNNAMED16640;
++
++            DW264.Value = 0;
++            DW264.InverseGChGammaCorrectedValue66 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++            DW264.InverseBChGammaCorrectedValue66 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++
++            DW265.Value = 0;
++            DW265.InversePixelValue66 = INVERSE_PIXEL_VALUE_66_UNNAMED16896;
++            DW265.InverseRChGammaCorrectedValue66 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++
++            DW266.Value = 0;
++            DW266.ForwardGChGammaCorrectedValue66 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++            DW266.ForwardBChGammaCorrectedValue66 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++
++            DW267.Value = 0;
++            DW267.ForwardPixelValue66 = FORWARD_PIXEL_VALUE_66_UNNAMED16896;
++            DW267.ForwardRChGammaCorrectedValue66 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_66_UNNAMED16896;
++
++            DW268.Value = 0;
++            DW268.InverseGChGammaCorrectedValue67 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++            DW268.InverseBChGammaCorrectedValue67 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++
++            DW269.Value = 0;
++            DW269.InversePixelValue67 = INVERSE_PIXEL_VALUE_67_UNNAMED17152;
++            DW269.InverseRChGammaCorrectedValue67 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++
++            DW270.Value = 0;
++            DW270.ForwardGChGammaCorrectedValue67 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++            DW270.ForwardBChGammaCorrectedValue67 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++
++            DW271.Value = 0;
++            DW271.ForwardPixelValue67 = FORWARD_PIXEL_VALUE_67_UNNAMED17152;
++            DW271.ForwardRChGammaCorrectedValue67 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_67_UNNAMED17152;
++
++            DW272.Value = 0;
++            DW272.InverseGChGammaCorrectedValue68 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++            DW272.InverseBChGammaCorrectedValue68 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++
++            DW273.Value = 0;
++            DW273.InversePixelValue68 = INVERSE_PIXEL_VALUE_68_UNNAMED17408;
++            DW273.InverseRChGammaCorrectedValue68 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++
++            DW274.Value = 0;
++            DW274.ForwardGChGammaCorrectedValue68 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++            DW274.ForwardBChGammaCorrectedValue68 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++
++            DW275.Value = 0;
++            DW275.ForwardPixelValue68 = FORWARD_PIXEL_VALUE_68_UNNAMED17408;
++            DW275.ForwardRChGammaCorrectedValue68 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_68_UNNAMED17408;
++
++            DW276.Value = 0;
++            DW276.InverseGChGammaCorrectedValue69 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++            DW276.InverseBChGammaCorrectedValue69 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++
++            DW277.Value = 0;
++            DW277.InversePixelValue69 = INVERSE_PIXEL_VALUE_69_UNNAMED17664;
++            DW277.InverseRChGammaCorrectedValue69 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++
++            DW278.Value = 0;
++            DW278.ForwardGChGammaCorrectedValue69 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++            DW278.ForwardBChGammaCorrectedValue69 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++
++            DW279.Value = 0;
++            DW279.ForwardPixelValue69 = FORWARD_PIXEL_VALUE_69_UNNAMED17664;
++            DW279.ForwardRChGammaCorrectedValue69 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_69_UNNAMED17664;
++
++            DW280.Value = 0;
++            DW280.InverseGChGammaCorrectedValue70 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++            DW280.InverseBChGammaCorrectedValue70 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++
++            DW281.Value = 0;
++            DW281.InversePixelValue70 = INVERSE_PIXEL_VALUE_70_UNNAMED17920;
++            DW281.InverseRChGammaCorrectedValue70 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++
++            DW282.Value = 0;
++            DW282.ForwardGChGammaCorrectedValue70 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++            DW282.ForwardBChGammaCorrectedValue70 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++
++            DW283.Value = 0;
++            DW283.ForwardPixelValue70 = FORWARD_PIXEL_VALUE_70_UNNAMED17920;
++            DW283.ForwardRChGammaCorrectedValue70 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_70_UNNAMED17920;
++
++            DW284.Value = 0;
++            DW284.InverseGChGammaCorrectedValue71 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++            DW284.InverseBChGammaCorrectedValue71 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++
++            DW285.Value = 0;
++            DW285.InversePixelValue71 = INVERSE_PIXEL_VALUE_71_UNNAMED18176;
++            DW285.InverseRChGammaCorrectedValue71 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++
++            DW286.Value = 0;
++            DW286.ForwardGChGammaCorrectedValue71 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++            DW286.ForwardBChGammaCorrectedValue71 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++
++            DW287.Value = 0;
++            DW287.ForwardPixelValue71 = FORWARD_PIXEL_VALUE_71_UNNAMED18176;
++            DW287.ForwardRChGammaCorrectedValue71 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_71_UNNAMED18176;
++
++            DW288.Value = 0;
++            DW288.InverseGChGammaCorrectedValue72 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++            DW288.InverseBChGammaCorrectedValue72 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++
++            DW289.Value = 0;
++            DW289.InversePixelValue72 = INVERSE_PIXEL_VALUE_72_UNNAMED18432;
++            DW289.InverseRChGammaCorrectedValue72 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++
++            DW290.Value = 0;
++            DW290.ForwardGChGammaCorrectedValue72 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++            DW290.ForwardBChGammaCorrectedValue72 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++
++            DW291.Value = 0;
++            DW291.ForwardPixelValue72 = FORWARD_PIXEL_VALUE_72_UNNAMED18432;
++            DW291.ForwardRChGammaCorrectedValue72 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_72_UNNAMED18432;
++
++            DW292.Value = 0;
++            DW292.InverseGChGammaCorrectedValue73 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++            DW292.InverseBChGammaCorrectedValue73 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++
++            DW293.Value = 0;
++            DW293.InversePixelValue73 = INVERSE_PIXEL_VALUE_73_UNNAMED18688;
++            DW293.InverseRChGammaCorrectedValue73 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++
++            DW294.Value = 0;
++            DW294.ForwardGChGammaCorrectedValue73 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++            DW294.ForwardBChGammaCorrectedValue73 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++
++            DW295.Value = 0;
++            DW295.ForwardPixelValue73 = FORWARD_PIXEL_VALUE_73_UNNAMED18688;
++            DW295.ForwardRChGammaCorrectedValue73 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_73_UNNAMED18688;
++
++            DW296.Value = 0;
++            DW296.InverseGChGammaCorrectedValue74 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++            DW296.InverseBChGammaCorrectedValue74 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++
++            DW297.Value = 0;
++            DW297.InversePixelValue74 = INVERSE_PIXEL_VALUE_74_UNNAMED18944;
++            DW297.InverseRChGammaCorrectedValue74 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++
++            DW298.Value = 0;
++            DW298.ForwardGChGammaCorrectedValue74 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++            DW298.ForwardBChGammaCorrectedValue74 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++
++            DW299.Value = 0;
++            DW299.ForwardPixelValue74 = FORWARD_PIXEL_VALUE_74_UNNAMED18944;
++            DW299.ForwardRChGammaCorrectedValue74 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_74_UNNAMED18944;
++
++            DW300.Value = 0;
++            DW300.InverseGChGammaCorrectedValue75 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++            DW300.InverseBChGammaCorrectedValue75 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++
++            DW301.Value = 0;
++            DW301.InversePixelValue75 = INVERSE_PIXEL_VALUE_75_UNNAMED19200;
++            DW301.InverseRChGammaCorrectedValue75 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++
++            DW302.Value = 0;
++            DW302.ForwardGChGammaCorrectedValue75 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++            DW302.ForwardBChGammaCorrectedValue75 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++
++            DW303.Value = 0;
++            DW303.ForwardPixelValue75 = FORWARD_PIXEL_VALUE_75_UNNAMED19200;
++            DW303.ForwardRChGammaCorrectedValue75 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_75_UNNAMED19200;
++
++            DW304.Value = 0;
++            DW304.InverseGChGammaCorrectedValue76 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++            DW304.InverseBChGammaCorrectedValue76 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++
++            DW305.Value = 0;
++            DW305.InversePixelValue76 = INVERSE_PIXEL_VALUE_76_UNNAMED19456;
++            DW305.InverseRChGammaCorrectedValue76 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++
++            DW306.Value = 0;
++            DW306.ForwardGChGammaCorrectedValue76 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++            DW306.ForwardBChGammaCorrectedValue76 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++
++            DW307.Value = 0;
++            DW307.ForwardPixelValue76 = FORWARD_PIXEL_VALUE_76_UNNAMED19456;
++            DW307.ForwardRChGammaCorrectedValue76 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_76_UNNAMED19456;
++
++            DW308.Value = 0;
++            DW308.InverseGChGammaCorrectedValue77 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++            DW308.InverseBChGammaCorrectedValue77 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++
++            DW309.Value = 0;
++            DW309.InversePixelValue77 = INVERSE_PIXEL_VALUE_77_UNNAMED19712;
++            DW309.InverseRChGammaCorrectedValue77 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++
++            DW310.Value = 0;
++            DW310.ForwardGChGammaCorrectedValue77 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++            DW310.ForwardBChGammaCorrectedValue77 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++
++            DW311.Value = 0;
++            DW311.ForwardPixelValue77 = FORWARD_PIXEL_VALUE_77_UNNAMED19712;
++            DW311.ForwardRChGammaCorrectedValue77 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_77_UNNAMED19712;
++
++            DW312.Value = 0;
++            DW312.InverseGChGammaCorrectedValue78 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++            DW312.InverseBChGammaCorrectedValue78 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++
++            DW313.Value = 0;
++            DW313.InversePixelValue78 = INVERSE_PIXEL_VALUE_78_UNNAMED19968;
++            DW313.InverseRChGammaCorrectedValue78 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++
++            DW314.Value = 0;
++            DW314.ForwardGChGammaCorrectedValue78 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++            DW314.ForwardBChGammaCorrectedValue78 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++
++            DW315.Value = 0;
++            DW315.ForwardPixelValue78 = FORWARD_PIXEL_VALUE_78_UNNAMED19968;
++            DW315.ForwardRChGammaCorrectedValue78 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_78_UNNAMED19968;
++
++            DW316.Value = 0;
++            DW316.InverseGChGammaCorrectedValue79 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++            DW316.InverseBChGammaCorrectedValue79 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++
++            DW317.Value = 0;
++            DW317.InversePixelValue79 = INVERSE_PIXEL_VALUE_79_UNNAMED20224;
++            DW317.InverseRChGammaCorrectedValue79 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++
++            DW318.Value = 0;
++            DW318.ForwardGChGammaCorrectedValue79 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++            DW318.ForwardBChGammaCorrectedValue79 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++
++            DW319.Value = 0;
++            DW319.ForwardPixelValue79 = FORWARD_PIXEL_VALUE_79_UNNAMED20224;
++            DW319.ForwardRChGammaCorrectedValue79 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_79_UNNAMED20224;
++
++            DW320.Value = 0;
++            DW320.InverseGChGammaCorrectedValue80 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++            DW320.InverseBChGammaCorrectedValue80 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++
++            DW321.Value = 0;
++            DW321.InversePixelValue80 = INVERSE_PIXEL_VALUE_80_UNNAMED20480;
++            DW321.InverseRChGammaCorrectedValue80 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++
++            DW322.Value = 0;
++            DW322.ForwardGChGammaCorrectedValue80 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++            DW322.ForwardBChGammaCorrectedValue80 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++
++            DW323.Value = 0;
++            DW323.ForwardPixelValue80 = FORWARD_PIXEL_VALUE_80_UNNAMED20480;
++            DW323.ForwardRChGammaCorrectedValue80 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_80_UNNAMED20480;
++
++            DW324.Value = 0;
++            DW324.InverseGChGammaCorrectedValue81 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++            DW324.InverseBChGammaCorrectedValue81 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++
++            DW325.Value = 0;
++            DW325.InversePixelValue81 = INVERSE_PIXEL_VALUE_81_UNNAMED20736;
++            DW325.InverseRChGammaCorrectedValue81 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++
++            DW326.Value = 0;
++            DW326.ForwardGChGammaCorrectedValue81 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++            DW326.ForwardBChGammaCorrectedValue81 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++
++            DW327.Value = 0;
++            DW327.ForwardPixelValue81 = FORWARD_PIXEL_VALUE_81_UNNAMED20736;
++            DW327.ForwardRChGammaCorrectedValue81 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_81_UNNAMED20736;
++
++            DW328.Value = 0;
++            DW328.InverseGChGammaCorrectedValue82 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++            DW328.InverseBChGammaCorrectedValue82 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++
++            DW329.Value = 0;
++            DW329.InversePixelValue82 = INVERSE_PIXEL_VALUE_82_UNNAMED20992;
++            DW329.InverseRChGammaCorrectedValue82 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++
++            DW330.Value = 0;
++            DW330.ForwardGChGammaCorrectedValue82 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++            DW330.ForwardBChGammaCorrectedValue82 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++
++            DW331.Value = 0;
++            DW331.ForwardPixelValue82 = FORWARD_PIXEL_VALUE_82_UNNAMED20992;
++            DW331.ForwardRChGammaCorrectedValue82 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_82_UNNAMED20992;
++
++            DW332.Value = 0;
++            DW332.InverseGChGammaCorrectedValue83 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++            DW332.InverseBChGammaCorrectedValue83 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++
++            DW333.Value = 0;
++            DW333.InversePixelValue83 = INVERSE_PIXEL_VALUE_83_UNNAMED21248;
++            DW333.InverseRChGammaCorrectedValue83 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++
++            DW334.Value = 0;
++            DW334.ForwardGChGammaCorrectedValue83 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++            DW334.ForwardBChGammaCorrectedValue83 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++
++            DW335.Value = 0;
++            DW335.ForwardPixelValue83 = FORWARD_PIXEL_VALUE_83_UNNAMED21248;
++            DW335.ForwardRChGammaCorrectedValue83 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_83_UNNAMED21248;
++
++            DW336.Value = 0;
++            DW336.InverseGChGammaCorrectedValue84 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++            DW336.InverseBChGammaCorrectedValue84 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++
++            DW337.Value = 0;
++            DW337.InversePixelValue84 = INVERSE_PIXEL_VALUE_84_UNNAMED21504;
++            DW337.InverseRChGammaCorrectedValue84 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++
++            DW338.Value = 0;
++            DW338.ForwardGChGammaCorrectedValue84 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++            DW338.ForwardBChGammaCorrectedValue84 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++
++            DW339.Value = 0;
++            DW339.ForwardPixelValue84 = FORWARD_PIXEL_VALUE_84_UNNAMED21504;
++            DW339.ForwardRChGammaCorrectedValue84 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_84_UNNAMED21504;
++
++            DW340.Value = 0;
++            DW340.InverseGChGammaCorrectedValue85 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++            DW340.InverseBChGammaCorrectedValue85 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++
++            DW341.Value = 0;
++            DW341.InversePixelValue85 = INVERSE_PIXEL_VALUE_85_UNNAMED21760;
++            DW341.InverseRChGammaCorrectedValue85 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++
++            DW342.Value = 0;
++            DW342.ForwardGChGammaCorrectedValue85 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++            DW342.ForwardBChGammaCorrectedValue85 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++
++            DW343.Value = 0;
++            DW343.ForwardPixelValue85 = FORWARD_PIXEL_VALUE_85_UNNAMED21760;
++            DW343.ForwardRChGammaCorrectedValue85 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_85_UNNAMED21760;
++
++            DW344.Value = 0;
++            DW344.InverseGChGammaCorrectedValue86 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++            DW344.InverseBChGammaCorrectedValue86 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++
++            DW345.Value = 0;
++            DW345.InversePixelValue86 = INVERSE_PIXEL_VALUE_86_UNNAMED22016;
++            DW345.InverseRChGammaCorrectedValue86 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++
++            DW346.Value = 0;
++            DW346.ForwardGChGammaCorrectedValue86 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++            DW346.ForwardBChGammaCorrectedValue86 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++
++            DW347.Value = 0;
++            DW347.ForwardPixelValue86 = FORWARD_PIXEL_VALUE_86_UNNAMED22016;
++            DW347.ForwardRChGammaCorrectedValue86 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_86_UNNAMED22016;
++
++            DW348.Value = 0;
++            DW348.InverseGChGammaCorrectedValue87 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++            DW348.InverseBChGammaCorrectedValue87 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++
++            DW349.Value = 0;
++            DW349.InversePixelValue87 = INVERSE_PIXEL_VALUE_87_UNNAMED22272;
++            DW349.InverseRChGammaCorrectedValue87 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++
++            DW350.Value = 0;
++            DW350.ForwardGChGammaCorrectedValue87 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++            DW350.ForwardBChGammaCorrectedValue87 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++
++            DW351.Value = 0;
++            DW351.ForwardPixelValue87 = FORWARD_PIXEL_VALUE_87_UNNAMED22272;
++            DW351.ForwardRChGammaCorrectedValue87 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_87_UNNAMED22272;
++
++            DW352.Value = 0;
++            DW352.InverseGChGammaCorrectedValue88 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++            DW352.InverseBChGammaCorrectedValue88 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++
++            DW353.Value = 0;
++            DW353.InversePixelValue88 = INVERSE_PIXEL_VALUE_88_UNNAMED22528;
++            DW353.InverseRChGammaCorrectedValue88 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++
++            DW354.Value = 0;
++            DW354.ForwardGChGammaCorrectedValue88 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++            DW354.ForwardBChGammaCorrectedValue88 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++
++            DW355.Value = 0;
++            DW355.ForwardPixelValue88 = FORWARD_PIXEL_VALUE_88_UNNAMED22528;
++            DW355.ForwardRChGammaCorrectedValue88 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_88_UNNAMED22528;
++
++            DW356.Value = 0;
++            DW356.InverseGChGammaCorrectedValue89 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++            DW356.InverseBChGammaCorrectedValue89 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++
++            DW357.Value = 0;
++            DW357.InversePixelValue89 = INVERSE_PIXEL_VALUE_89_UNNAMED22784;
++            DW357.InverseRChGammaCorrectedValue89 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++
++            DW358.Value = 0;
++            DW358.ForwardGChGammaCorrectedValue89 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++            DW358.ForwardBChGammaCorrectedValue89 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++
++            DW359.Value = 0;
++            DW359.ForwardPixelValue89 = FORWARD_PIXEL_VALUE_89_UNNAMED22784;
++            DW359.ForwardRChGammaCorrectedValue89 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_89_UNNAMED22784;
++
++            DW360.Value = 0;
++            DW360.InverseGChGammaCorrectedValue90 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++            DW360.InverseBChGammaCorrectedValue90 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++
++            DW361.Value = 0;
++            DW361.InversePixelValue90 = INVERSE_PIXEL_VALUE_90_UNNAMED23040;
++            DW361.InverseRChGammaCorrectedValue90 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++
++            DW362.Value = 0;
++            DW362.ForwardGChGammaCorrectedValue90 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++            DW362.ForwardBChGammaCorrectedValue90 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++
++            DW363.Value = 0;
++            DW363.ForwardPixelValue90 = FORWARD_PIXEL_VALUE_90_UNNAMED23040;
++            DW363.ForwardRChGammaCorrectedValue90 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_90_UNNAMED23040;
++
++            DW364.Value = 0;
++            DW364.InverseGChGammaCorrectedValue91 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++            DW364.InverseBChGammaCorrectedValue91 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++
++            DW365.Value = 0;
++            DW365.InversePixelValue91 = INVERSE_PIXEL_VALUE_91_UNNAMED23296;
++            DW365.InverseRChGammaCorrectedValue91 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++
++            DW366.Value = 0;
++            DW366.ForwardGChGammaCorrectedValue91 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++            DW366.ForwardBChGammaCorrectedValue91 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++
++            DW367.Value = 0;
++            DW367.ForwardPixelValue91 = FORWARD_PIXEL_VALUE_91_UNNAMED23296;
++            DW367.ForwardRChGammaCorrectedValue91 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_91_UNNAMED23296;
++
++            DW368.Value = 0;
++            DW368.InverseGChGammaCorrectedValue92 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++            DW368.InverseBChGammaCorrectedValue92 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++
++            DW369.Value = 0;
++            DW369.InversePixelValue92 = INVERSE_PIXEL_VALUE_92_UNNAMED23552;
++            DW369.InverseRChGammaCorrectedValue92 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++
++            DW370.Value = 0;
++            DW370.ForwardGChGammaCorrectedValue92 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++            DW370.ForwardBChGammaCorrectedValue92 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++
++            DW371.Value = 0;
++            DW371.ForwardPixelValue92 = FORWARD_PIXEL_VALUE_92_UNNAMED23552;
++            DW371.ForwardRChGammaCorrectedValue92 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_92_UNNAMED23552;
++
++            DW372.Value = 0;
++            DW372.InverseGChGammaCorrectedValue93 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++            DW372.InverseBChGammaCorrectedValue93 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++
++            DW373.Value = 0;
++            DW373.InversePixelValue93 = INVERSE_PIXEL_VALUE_93_UNNAMED23808;
++            DW373.InverseRChGammaCorrectedValue93 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++
++            DW374.Value = 0;
++            DW374.ForwardGChGammaCorrectedValue93 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++            DW374.ForwardBChGammaCorrectedValue93 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++
++            DW375.Value = 0;
++            DW375.ForwardPixelValue93 = FORWARD_PIXEL_VALUE_93_UNNAMED23808;
++            DW375.ForwardRChGammaCorrectedValue93 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_93_UNNAMED23808;
++
++            DW376.Value = 0;
++            DW376.InverseGChGammaCorrectedValue94 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++            DW376.InverseBChGammaCorrectedValue94 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++
++            DW377.Value = 0;
++            DW377.InversePixelValue94 = INVERSE_PIXEL_VALUE_94_UNNAMED24064;
++            DW377.InverseRChGammaCorrectedValue94 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++
++            DW378.Value = 0;
++            DW378.ForwardGChGammaCorrectedValue94 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++            DW378.ForwardBChGammaCorrectedValue94 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++
++            DW379.Value = 0;
++            DW379.ForwardPixelValue94 = FORWARD_PIXEL_VALUE_94_UNNAMED24064;
++            DW379.ForwardRChGammaCorrectedValue94 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_94_UNNAMED24064;
++
++            DW380.Value = 0;
++            DW380.InverseGChGammaCorrectedValue95 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++            DW380.InverseBChGammaCorrectedValue95 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++
++            DW381.Value = 0;
++            DW381.InversePixelValue95 = INVERSE_PIXEL_VALUE_95_UNNAMED24320;
++            DW381.InverseRChGammaCorrectedValue95 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++
++            DW382.Value = 0;
++            DW382.ForwardGChGammaCorrectedValue95 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++            DW382.ForwardBChGammaCorrectedValue95 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++
++            DW383.Value = 0;
++            DW383.ForwardPixelValue95 = FORWARD_PIXEL_VALUE_95_UNNAMED24320;
++            DW383.ForwardRChGammaCorrectedValue95 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_95_UNNAMED24320;
++
++            DW384.Value = 0;
++            DW384.InverseGChGammaCorrectedValue96 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++            DW384.InverseBChGammaCorrectedValue96 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++
++            DW385.Value = 0;
++            DW385.InversePixelValue96 = INVERSE_PIXEL_VALUE_96_UNNAMED24576;
++            DW385.InverseRChGammaCorrectedValue96 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++
++            DW386.Value = 0;
++            DW386.ForwardGChGammaCorrectedValue96 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++            DW386.ForwardBChGammaCorrectedValue96 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++
++            DW387.Value = 0;
++            DW387.ForwardPixelValue96 = FORWARD_PIXEL_VALUE_96_UNNAMED24576;
++            DW387.ForwardRChGammaCorrectedValue96 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_96_UNNAMED24576;
++
++            DW388.Value = 0;
++            DW388.InverseGChGammaCorrectedValue97 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++            DW388.InverseBChGammaCorrectedValue97 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++
++            DW389.Value = 0;
++            DW389.InversePixelValue97 = INVERSE_PIXEL_VALUE_97_UNNAMED24832;
++            DW389.InverseRChGammaCorrectedValue97 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++
++            DW390.Value = 0;
++            DW390.ForwardGChGammaCorrectedValue97 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++            DW390.ForwardBChGammaCorrectedValue97 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++
++            DW391.Value = 0;
++            DW391.ForwardPixelValue97 = FORWARD_PIXEL_VALUE_97_UNNAMED24832;
++            DW391.ForwardRChGammaCorrectedValue97 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_97_UNNAMED24832;
++
++            DW392.Value = 0;
++            DW392.InverseGChGammaCorrectedValue98 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++            DW392.InverseBChGammaCorrectedValue98 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++
++            DW393.Value = 0;
++            DW393.InversePixelValue98 = INVERSE_PIXEL_VALUE_98_UNNAMED25088;
++            DW393.InverseRChGammaCorrectedValue98 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++
++            DW394.Value = 0;
++            DW394.ForwardGChGammaCorrectedValue98 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++            DW394.ForwardBChGammaCorrectedValue98 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++
++            DW395.Value = 0;
++            DW395.ForwardPixelValue98 = FORWARD_PIXEL_VALUE_98_UNNAMED25088;
++            DW395.ForwardRChGammaCorrectedValue98 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_98_UNNAMED25088;
++
++            DW396.Value = 0;
++            DW396.InverseGChGammaCorrectedValue99 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++            DW396.InverseBChGammaCorrectedValue99 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++
++            DW397.Value = 0;
++            DW397.InversePixelValue99 = INVERSE_PIXEL_VALUE_99_UNNAMED25344;
++            DW397.InverseRChGammaCorrectedValue99 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++
++            DW398.Value = 0;
++            DW398.ForwardGChGammaCorrectedValue99 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++            DW398.ForwardBChGammaCorrectedValue99 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++
++            DW399.Value = 0;
++            DW399.ForwardPixelValue99 = FORWARD_PIXEL_VALUE_99_UNNAMED25344;
++            DW399.ForwardRChGammaCorrectedValue99 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_99_UNNAMED25344;
++
++            DW400.Value = 0;
++            DW400.InverseGChGammaCorrectedValue100 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++            DW400.InverseBChGammaCorrectedValue100 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++
++            DW401.Value = 0;
++            DW401.InversePixelValue100 = INVERSE_PIXEL_VALUE_100_UNNAMED25600;
++            DW401.InverseRChGammaCorrectedValue100 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++
++            DW402.Value = 0;
++            DW402.ForwardGChGammaCorrectedValue100 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++            DW402.ForwardBChGammaCorrectedValue100 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++
++            DW403.Value = 0;
++            DW403.ForwardPixelValue100 = FORWARD_PIXEL_VALUE_100_UNNAMED25600;
++            DW403.ForwardRChGammaCorrectedValue100 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_100_UNNAMED25600;
++
++            DW404.Value = 0;
++            DW404.InverseGChGammaCorrectedValue101 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++            DW404.InverseBChGammaCorrectedValue101 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++
++            DW405.Value = 0;
++            DW405.InversePixelValue101 = INVERSE_PIXEL_VALUE_101_UNNAMED25856;
++            DW405.InverseRChGammaCorrectedValue101 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++
++            DW406.Value = 0;
++            DW406.ForwardGChGammaCorrectedValue101 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++            DW406.ForwardBChGammaCorrectedValue101 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++
++            DW407.Value = 0;
++            DW407.ForwardPixelValue101 = FORWARD_PIXEL_VALUE_101_UNNAMED25856;
++            DW407.ForwardRChGammaCorrectedValue101 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_101_UNNAMED25856;
++
++            DW408.Value = 0;
++            DW408.InverseGChGammaCorrectedValue102 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++            DW408.InverseBChGammaCorrectedValue102 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++
++            DW409.Value = 0;
++            DW409.InversePixelValue102 = INVERSE_PIXEL_VALUE_102_UNNAMED26112;
++            DW409.InverseRChGammaCorrectedValue102 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++
++            DW410.Value = 0;
++            DW410.ForwardGChGammaCorrectedValue102 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++            DW410.ForwardBChGammaCorrectedValue102 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++
++            DW411.Value = 0;
++            DW411.ForwardPixelValue102 = FORWARD_PIXEL_VALUE_102_UNNAMED26112;
++            DW411.ForwardRChGammaCorrectedValue102 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_102_UNNAMED26112;
++
++            DW412.Value = 0;
++            DW412.InverseGChGammaCorrectedValue103 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++            DW412.InverseBChGammaCorrectedValue103 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++
++            DW413.Value = 0;
++            DW413.InversePixelValue103 = INVERSE_PIXEL_VALUE_103_UNNAMED26368;
++            DW413.InverseRChGammaCorrectedValue103 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++
++            DW414.Value = 0;
++            DW414.ForwardGChGammaCorrectedValue103 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++            DW414.ForwardBChGammaCorrectedValue103 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++
++            DW415.Value = 0;
++            DW415.ForwardPixelValue103 = FORWARD_PIXEL_VALUE_103_UNNAMED26368;
++            DW415.ForwardRChGammaCorrectedValue103 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_103_UNNAMED26368;
++
++            DW416.Value = 0;
++            DW416.InverseGChGammaCorrectedValue104 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++            DW416.InverseBChGammaCorrectedValue104 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++
++            DW417.Value = 0;
++            DW417.InversePixelValue104 = INVERSE_PIXEL_VALUE_104_UNNAMED26624;
++            DW417.InverseRChGammaCorrectedValue104 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++
++            DW418.Value = 0;
++            DW418.ForwardGChGammaCorrectedValue104 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++            DW418.ForwardBChGammaCorrectedValue104 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++
++            DW419.Value = 0;
++            DW419.ForwardPixelValue104 = FORWARD_PIXEL_VALUE_104_UNNAMED26624;
++            DW419.ForwardRChGammaCorrectedValue104 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_104_UNNAMED26624;
++
++            DW420.Value = 0;
++            DW420.InverseGChGammaCorrectedValue105 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++            DW420.InverseBChGammaCorrectedValue105 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++
++            DW421.Value = 0;
++            DW421.InversePixelValue105 = INVERSE_PIXEL_VALUE_105_UNNAMED26880;
++            DW421.InverseRChGammaCorrectedValue105 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++
++            DW422.Value = 0;
++            DW422.ForwardGChGammaCorrectedValue105 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++            DW422.ForwardBChGammaCorrectedValue105 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++
++            DW423.Value = 0;
++            DW423.ForwardPixelValue105 = FORWARD_PIXEL_VALUE_105_UNNAMED26880;
++            DW423.ForwardRChGammaCorrectedValue105 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_105_UNNAMED26880;
++
++            DW424.Value = 0;
++            DW424.InverseGChGammaCorrectedValue106 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++            DW424.InverseBChGammaCorrectedValue106 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++
++            DW425.Value = 0;
++            DW425.InversePixelValue106 = INVERSE_PIXEL_VALUE_106_UNNAMED27136;
++            DW425.InverseRChGammaCorrectedValue106 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++
++            DW426.Value = 0;
++            DW426.ForwardGChGammaCorrectedValue106 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++            DW426.ForwardBChGammaCorrectedValue106 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++
++            DW427.Value = 0;
++            DW427.ForwardPixelValue106 = FORWARD_PIXEL_VALUE_106_UNNAMED27136;
++            DW427.ForwardRChGammaCorrectedValue106 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_106_UNNAMED27136;
++
++            DW428.Value = 0;
++            DW428.InverseGChGammaCorrectedValue107 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++            DW428.InverseBChGammaCorrectedValue107 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++
++            DW429.Value = 0;
++            DW429.InversePixelValue107 = INVERSE_PIXEL_VALUE_107_UNNAMED27392;
++            DW429.InverseRChGammaCorrectedValue107 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++
++            DW430.Value = 0;
++            DW430.ForwardGChGammaCorrectedValue107 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++            DW430.ForwardBChGammaCorrectedValue107 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++
++            DW431.Value = 0;
++            DW431.ForwardPixelValue107 = FORWARD_PIXEL_VALUE_107_UNNAMED27392;
++            DW431.ForwardRChGammaCorrectedValue107 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_107_UNNAMED27392;
++
++            DW432.Value = 0;
++            DW432.InverseGChGammaCorrectedValue108 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++            DW432.InverseBChGammaCorrectedValue108 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++
++            DW433.Value = 0;
++            DW433.InversePixelValue108 = INVERSE_PIXEL_VALUE_108_UNNAMED27648;
++            DW433.InverseRChGammaCorrectedValue108 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++
++            DW434.Value = 0;
++            DW434.ForwardGChGammaCorrectedValue108 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++            DW434.ForwardBChGammaCorrectedValue108 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++
++            DW435.Value = 0;
++            DW435.ForwardPixelValue108 = FORWARD_PIXEL_VALUE_108_UNNAMED27648;
++            DW435.ForwardRChGammaCorrectedValue108 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_108_UNNAMED27648;
++
++            DW436.Value = 0;
++            DW436.InverseGChGammaCorrectedValue109 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++            DW436.InverseBChGammaCorrectedValue109 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++
++            DW437.Value = 0;
++            DW437.InversePixelValue109 = INVERSE_PIXEL_VALUE_109_UNNAMED27904;
++            DW437.InverseRChGammaCorrectedValue109 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++
++            DW438.Value = 0;
++            DW438.ForwardGChGammaCorrectedValue109 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++            DW438.ForwardBChGammaCorrectedValue109 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++
++            DW439.Value = 0;
++            DW439.ForwardPixelValue109 = FORWARD_PIXEL_VALUE_109_UNNAMED27904;
++            DW439.ForwardRChGammaCorrectedValue109 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_109_UNNAMED27904;
++
++            DW440.Value = 0;
++            DW440.InverseGChGammaCorrectedValue110 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++            DW440.InverseBChGammaCorrectedValue110 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++
++            DW441.Value = 0;
++            DW441.InversePixelValue110 = INVERSE_PIXEL_VALUE_110_UNNAMED28160;
++            DW441.InverseRChGammaCorrectedValue110 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++
++            DW442.Value = 0;
++            DW442.ForwardGChGammaCorrectedValue110 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++            DW442.ForwardBChGammaCorrectedValue110 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++
++            DW443.Value = 0;
++            DW443.ForwardPixelValue110 = FORWARD_PIXEL_VALUE_110_UNNAMED28160;
++            DW443.ForwardRChGammaCorrectedValue110 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_110_UNNAMED28160;
++
++            DW444.Value = 0;
++            DW444.InverseGChGammaCorrectedValue111 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++            DW444.InverseBChGammaCorrectedValue111 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++
++            DW445.Value = 0;
++            DW445.InversePixelValue111 = INVERSE_PIXEL_VALUE_111_UNNAMED28416;
++            DW445.InverseRChGammaCorrectedValue111 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++
++            DW446.Value = 0;
++            DW446.ForwardGChGammaCorrectedValue111 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++            DW446.ForwardBChGammaCorrectedValue111 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++
++            DW447.Value = 0;
++            DW447.ForwardPixelValue111 = FORWARD_PIXEL_VALUE_111_UNNAMED28416;
++            DW447.ForwardRChGammaCorrectedValue111 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_111_UNNAMED28416;
++
++            DW448.Value = 0;
++            DW448.InverseGChGammaCorrectedValue112 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++            DW448.InverseBChGammaCorrectedValue112 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++
++            DW449.Value = 0;
++            DW449.InversePixelValue112 = INVERSE_PIXEL_VALUE_112_UNNAMED28672;
++            DW449.InverseRChGammaCorrectedValue112 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++
++            DW450.Value = 0;
++            DW450.ForwardGChGammaCorrectedValue112 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++            DW450.ForwardBChGammaCorrectedValue112 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++
++            DW451.Value = 0;
++            DW451.ForwardPixelValue112 = FORWARD_PIXEL_VALUE_112_UNNAMED28672;
++            DW451.ForwardRChGammaCorrectedValue112 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_112_UNNAMED28672;
++
++            DW452.Value = 0;
++            DW452.InverseGChGammaCorrectedValue113 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++            DW452.InverseBChGammaCorrectedValue113 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++
++            DW453.Value = 0;
++            DW453.InversePixelValue113 = INVERSE_PIXEL_VALUE_113_UNNAMED28928;
++            DW453.InverseRChGammaCorrectedValue113 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++
++            DW454.Value = 0;
++            DW454.ForwardGChGammaCorrectedValue113 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++            DW454.ForwardBChGammaCorrectedValue113 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++
++            DW455.Value = 0;
++            DW455.ForwardPixelValue113 = FORWARD_PIXEL_VALUE_113_UNNAMED28928;
++            DW455.ForwardRChGammaCorrectedValue113 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_113_UNNAMED28928;
++
++            DW456.Value = 0;
++            DW456.InverseGChGammaCorrectedValue114 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++            DW456.InverseBChGammaCorrectedValue114 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++
++            DW457.Value = 0;
++            DW457.InversePixelValue114 = INVERSE_PIXEL_VALUE_114_UNNAMED29184;
++            DW457.InverseRChGammaCorrectedValue114 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++
++            DW458.Value = 0;
++            DW458.ForwardGChGammaCorrectedValue114 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++            DW458.ForwardBChGammaCorrectedValue114 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++
++            DW459.Value = 0;
++            DW459.ForwardPixelValue114 = FORWARD_PIXEL_VALUE_114_UNNAMED29184;
++            DW459.ForwardRChGammaCorrectedValue114 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_114_UNNAMED29184;
++
++            DW460.Value = 0;
++            DW460.InverseGChGammaCorrectedValue115 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++            DW460.InverseBChGammaCorrectedValue115 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++
++            DW461.Value = 0;
++            DW461.InversePixelValue115 = INVERSE_PIXEL_VALUE_115_UNNAMED29440;
++            DW461.InverseRChGammaCorrectedValue115 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++
++            DW462.Value = 0;
++            DW462.ForwardGChGammaCorrectedValue115 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++            DW462.ForwardBChGammaCorrectedValue115 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++
++            DW463.Value = 0;
++            DW463.ForwardPixelValue115 = FORWARD_PIXEL_VALUE_115_UNNAMED29440;
++            DW463.ForwardRChGammaCorrectedValue115 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_115_UNNAMED29440;
++
++            DW464.Value = 0;
++            DW464.InverseGChGammaCorrectedValue116 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++            DW464.InverseBChGammaCorrectedValue116 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++
++            DW465.Value = 0;
++            DW465.InversePixelValue116 = INVERSE_PIXEL_VALUE_116_UNNAMED29696;
++            DW465.InverseRChGammaCorrectedValue116 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++
++            DW466.Value = 0;
++            DW466.ForwardGChGammaCorrectedValue116 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++            DW466.ForwardBChGammaCorrectedValue116 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++
++            DW467.Value = 0;
++            DW467.ForwardPixelValue116 = FORWARD_PIXEL_VALUE_116_UNNAMED29696;
++            DW467.ForwardRChGammaCorrectedValue116 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_116_UNNAMED29696;
++
++            DW468.Value = 0;
++            DW468.InverseGChGammaCorrectedValue117 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++            DW468.InverseBChGammaCorrectedValue117 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++
++            DW469.Value = 0;
++            DW469.InversePixelValue117 = INVERSE_PIXEL_VALUE_117_UNNAMED29952;
++            DW469.InverseRChGammaCorrectedValue117 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++
++            DW470.Value = 0;
++            DW470.ForwardGChGammaCorrectedValue117 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++            DW470.ForwardBChGammaCorrectedValue117 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++
++            DW471.Value = 0;
++            DW471.ForwardPixelValue117 = FORWARD_PIXEL_VALUE_117_UNNAMED29952;
++            DW471.ForwardRChGammaCorrectedValue117 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_117_UNNAMED29952;
++
++            DW472.Value = 0;
++            DW472.InverseGChGammaCorrectedValue118 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++            DW472.InverseBChGammaCorrectedValue118 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++
++            DW473.Value = 0;
++            DW473.InversePixelValue118 = INVERSE_PIXEL_VALUE_118_UNNAMED30208;
++            DW473.InverseRChGammaCorrectedValue118 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++
++            DW474.Value = 0;
++            DW474.ForwardGChGammaCorrectedValue118 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++            DW474.ForwardBChGammaCorrectedValue118 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++
++            DW475.Value = 0;
++            DW475.ForwardPixelValue118 = FORWARD_PIXEL_VALUE_118_UNNAMED30208;
++            DW475.ForwardRChGammaCorrectedValue118 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_118_UNNAMED30208;
++
++            DW476.Value = 0;
++            DW476.InverseGChGammaCorrectedValue119 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++            DW476.InverseBChGammaCorrectedValue119 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++
++            DW477.Value = 0;
++            DW477.InversePixelValue119 = INVERSE_PIXEL_VALUE_119_UNNAMED30464;
++            DW477.InverseRChGammaCorrectedValue119 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++
++            DW478.Value = 0;
++            DW478.ForwardGChGammaCorrectedValue119 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++            DW478.ForwardBChGammaCorrectedValue119 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++
++            DW479.Value = 0;
++            DW479.ForwardPixelValue119 = FORWARD_PIXEL_VALUE_119_UNNAMED30464;
++            DW479.ForwardRChGammaCorrectedValue119 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_119_UNNAMED30464;
++
++            DW480.Value = 0;
++            DW480.InverseGChGammaCorrectedValue120 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++            DW480.InverseBChGammaCorrectedValue120 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++
++            DW481.Value = 0;
++            DW481.InversePixelValue120 = INVERSE_PIXEL_VALUE_120_UNNAMED30720;
++            DW481.InverseRChGammaCorrectedValue120 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++
++            DW482.Value = 0;
++            DW482.ForwardGChGammaCorrectedValue120 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++            DW482.ForwardBChGammaCorrectedValue120 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++
++            DW483.Value = 0;
++            DW483.ForwardPixelValue120 = FORWARD_PIXEL_VALUE_120_UNNAMED30720;
++            DW483.ForwardRChGammaCorrectedValue120 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_120_UNNAMED30720;
++
++            DW484.Value = 0;
++            DW484.InverseGChGammaCorrectedValue121 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++            DW484.InverseBChGammaCorrectedValue121 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++
++            DW485.Value = 0;
++            DW485.InversePixelValue121 = INVERSE_PIXEL_VALUE_121_UNNAMED30976;
++            DW485.InverseRChGammaCorrectedValue121 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++
++            DW486.Value = 0;
++            DW486.ForwardGChGammaCorrectedValue121 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++            DW486.ForwardBChGammaCorrectedValue121 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++
++            DW487.Value = 0;
++            DW487.ForwardPixelValue121 = FORWARD_PIXEL_VALUE_121_UNNAMED30976;
++            DW487.ForwardRChGammaCorrectedValue121 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_121_UNNAMED30976;
++
++            DW488.Value = 0;
++            DW488.InverseGChGammaCorrectedValue122 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++            DW488.InverseBChGammaCorrectedValue122 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++
++            DW489.Value = 0;
++            DW489.InversePixelValue122 = INVERSE_PIXEL_VALUE_122_UNNAMED31232;
++            DW489.InverseRChGammaCorrectedValue122 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++
++            DW490.Value = 0;
++            DW490.ForwardGChGammaCorrectedValue122 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++            DW490.ForwardBChGammaCorrectedValue122 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++
++            DW491.Value = 0;
++            DW491.ForwardPixelValue122 = FORWARD_PIXEL_VALUE_122_UNNAMED31232;
++            DW491.ForwardRChGammaCorrectedValue122 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_122_UNNAMED31232;
++
++            DW492.Value = 0;
++            DW492.InverseGChGammaCorrectedValue123 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++            DW492.InverseBChGammaCorrectedValue123 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++
++            DW493.Value = 0;
++            DW493.InversePixelValue123 = INVERSE_PIXEL_VALUE_123_UNNAMED31488;
++            DW493.InverseRChGammaCorrectedValue123 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++
++            DW494.Value = 0;
++            DW494.ForwardGChGammaCorrectedValue123 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++            DW494.ForwardBChGammaCorrectedValue123 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++
++            DW495.Value = 0;
++            DW495.ForwardPixelValue123 = FORWARD_PIXEL_VALUE_123_UNNAMED31488;
++            DW495.ForwardRChGammaCorrectedValue123 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_123_UNNAMED31488;
++
++            DW496.Value = 0;
++            DW496.InverseGChGammaCorrectedValue124 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++            DW496.InverseBChGammaCorrectedValue124 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++
++            DW497.Value = 0;
++            DW497.InversePixelValue124 = INVERSE_PIXEL_VALUE_124_UNNAMED31744;
++            DW497.InverseRChGammaCorrectedValue124 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++
++            DW498.Value = 0;
++            DW498.ForwardGChGammaCorrectedValue124 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++            DW498.ForwardBChGammaCorrectedValue124 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++
++            DW499.Value = 0;
++            DW499.ForwardPixelValue124 = FORWARD_PIXEL_VALUE_124_UNNAMED31744;
++            DW499.ForwardRChGammaCorrectedValue124 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_124_UNNAMED31744;
++
++            DW500.Value = 0;
++            DW500.InverseGChGammaCorrectedValue125 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++            DW500.InverseBChGammaCorrectedValue125 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++
++            DW501.Value = 0;
++            DW501.InversePixelValue125 = INVERSE_PIXEL_VALUE_125_UNNAMED32000;
++            DW501.InverseRChGammaCorrectedValue125 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++
++            DW502.Value = 0;
++            DW502.ForwardGChGammaCorrectedValue125 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++            DW502.ForwardBChGammaCorrectedValue125 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++
++            DW503.Value = 0;
++            DW503.ForwardPixelValue125 = FORWARD_PIXEL_VALUE_125_UNNAMED32000;
++            DW503.ForwardRChGammaCorrectedValue125 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_125_UNNAMED32000;
++
++            DW504.Value = 0;
++            DW504.InverseGChGammaCorrectedValue126 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++            DW504.InverseBChGammaCorrectedValue126 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++
++            DW505.Value = 0;
++            DW505.InversePixelValue126 = INVERSE_PIXEL_VALUE_126_UNNAMED32256;
++            DW505.InverseRChGammaCorrectedValue126 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++
++            DW506.Value = 0;
++            DW506.ForwardGChGammaCorrectedValue126 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++            DW506.ForwardBChGammaCorrectedValue126 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++
++            DW507.Value = 0;
++            DW507.ForwardPixelValue126 = FORWARD_PIXEL_VALUE_126_UNNAMED32256;
++            DW507.ForwardRChGammaCorrectedValue126 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_126_UNNAMED32256;
++
++            DW508.Value = 0;
++            DW508.InverseGChGammaCorrectedValue127 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++            DW508.InverseBChGammaCorrectedValue127 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++
++            DW509.Value = 0;
++            DW509.InversePixelValue127 = INVERSE_PIXEL_VALUE_127_UNNAMED32512;
++            DW509.InverseRChGammaCorrectedValue127 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++
++            DW510.Value = 0;
++            DW510.ForwardGChGammaCorrectedValue127 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++            DW510.ForwardBChGammaCorrectedValue127 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++
++            DW511.Value = 0;
++            DW511.ForwardPixelValue127 = FORWARD_PIXEL_VALUE_127_UNNAMED32512;
++            DW511.ForwardRChGammaCorrectedValue127 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_127_UNNAMED32512;
++
++            DW512.Value = 0;
++            DW512.InverseGChGammaCorrectedValue128 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++            DW512.InverseBChGammaCorrectedValue128 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++
++            DW513.Value = 0;
++            DW513.InversePixelValue128 = INVERSE_PIXEL_VALUE_128_UNNAMED32768;
++            DW513.InverseRChGammaCorrectedValue128 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++
++            DW514.Value = 0;
++            DW514.ForwardGChGammaCorrectedValue128 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++            DW514.ForwardBChGammaCorrectedValue128 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++
++            DW515.Value = 0;
++            DW515.ForwardPixelValue128 = FORWARD_PIXEL_VALUE_128_UNNAMED32768;
++            DW515.ForwardRChGammaCorrectedValue128 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_128_UNNAMED32768;
++
++            DW516.Value = 0;
++            DW516.InverseGChGammaCorrectedValue129 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++            DW516.InverseBChGammaCorrectedValue129 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++
++            DW517.Value = 0;
++            DW517.InversePixelValue129 = INVERSE_PIXEL_VALUE_129_UNNAMED33024;
++            DW517.InverseRChGammaCorrectedValue129 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++
++            DW518.Value = 0;
++            DW518.ForwardGChGammaCorrectedValue129 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++            DW518.ForwardBChGammaCorrectedValue129 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++
++            DW519.Value = 0;
++            DW519.ForwardPixelValue129 = FORWARD_PIXEL_VALUE_129_UNNAMED33024;
++            DW519.ForwardRChGammaCorrectedValue129 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_129_UNNAMED33024;
++
++            DW520.Value = 0;
++            DW520.InverseGChGammaCorrectedValue130 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++            DW520.InverseBChGammaCorrectedValue130 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++
++            DW521.Value = 0;
++            DW521.InversePixelValue130 = INVERSE_PIXEL_VALUE_130_UNNAMED33280;
++            DW521.InverseRChGammaCorrectedValue130 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++
++            DW522.Value = 0;
++            DW522.ForwardGChGammaCorrectedValue130 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++            DW522.ForwardBChGammaCorrectedValue130 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++
++            DW523.Value = 0;
++            DW523.ForwardPixelValue130 = FORWARD_PIXEL_VALUE_130_UNNAMED33280;
++            DW523.ForwardRChGammaCorrectedValue130 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_130_UNNAMED33280;
++
++            DW524.Value = 0;
++            DW524.InverseGChGammaCorrectedValue131 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++            DW524.InverseBChGammaCorrectedValue131 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++
++            DW525.Value = 0;
++            DW525.InversePixelValue131 = INVERSE_PIXEL_VALUE_131_UNNAMED33536;
++            DW525.InverseRChGammaCorrectedValue131 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++
++            DW526.Value = 0;
++            DW526.ForwardGChGammaCorrectedValue131 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++            DW526.ForwardBChGammaCorrectedValue131 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++
++            DW527.Value = 0;
++            DW527.ForwardPixelValue131 = FORWARD_PIXEL_VALUE_131_UNNAMED33536;
++            DW527.ForwardRChGammaCorrectedValue131 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_131_UNNAMED33536;
++
++            DW528.Value = 0;
++            DW528.InverseGChGammaCorrectedValue132 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++            DW528.InverseBChGammaCorrectedValue132 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++
++            DW529.Value = 0;
++            DW529.InversePixelValue132 = INVERSE_PIXEL_VALUE_132_UNNAMED33792;
++            DW529.InverseRChGammaCorrectedValue132 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++
++            DW530.Value = 0;
++            DW530.ForwardGChGammaCorrectedValue132 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++            DW530.ForwardBChGammaCorrectedValue132 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++
++            DW531.Value = 0;
++            DW531.ForwardPixelValue132 = FORWARD_PIXEL_VALUE_132_UNNAMED33792;
++            DW531.ForwardRChGammaCorrectedValue132 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_132_UNNAMED33792;
++
++            DW532.Value = 0;
++            DW532.InverseGChGammaCorrectedValue133 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++            DW532.InverseBChGammaCorrectedValue133 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++
++            DW533.Value = 0;
++            DW533.InversePixelValue133 = INVERSE_PIXEL_VALUE_133_UNNAMED34048;
++            DW533.InverseRChGammaCorrectedValue133 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++
++            DW534.Value = 0;
++            DW534.ForwardGChGammaCorrectedValue133 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++            DW534.ForwardBChGammaCorrectedValue133 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++
++            DW535.Value = 0;
++            DW535.ForwardPixelValue133 = FORWARD_PIXEL_VALUE_133_UNNAMED34048;
++            DW535.ForwardRChGammaCorrectedValue133 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_133_UNNAMED34048;
++
++            DW536.Value = 0;
++            DW536.InverseGChGammaCorrectedValue134 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++            DW536.InverseBChGammaCorrectedValue134 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++
++            DW537.Value = 0;
++            DW537.InversePixelValue134 = INVERSE_PIXEL_VALUE_134_UNNAMED34304;
++            DW537.InverseRChGammaCorrectedValue134 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++
++            DW538.Value = 0;
++            DW538.ForwardGChGammaCorrectedValue134 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++            DW538.ForwardBChGammaCorrectedValue134 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++
++            DW539.Value = 0;
++            DW539.ForwardPixelValue134 = FORWARD_PIXEL_VALUE_134_UNNAMED34304;
++            DW539.ForwardRChGammaCorrectedValue134 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_134_UNNAMED34304;
++
++            DW540.Value = 0;
++            DW540.InverseGChGammaCorrectedValue135 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++            DW540.InverseBChGammaCorrectedValue135 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++
++            DW541.Value = 0;
++            DW541.InversePixelValue135 = INVERSE_PIXEL_VALUE_135_UNNAMED34560;
++            DW541.InverseRChGammaCorrectedValue135 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++
++            DW542.Value = 0;
++            DW542.ForwardGChGammaCorrectedValue135 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++            DW542.ForwardBChGammaCorrectedValue135 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++
++            DW543.Value = 0;
++            DW543.ForwardPixelValue135 = FORWARD_PIXEL_VALUE_135_UNNAMED34560;
++            DW543.ForwardRChGammaCorrectedValue135 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_135_UNNAMED34560;
++
++            DW544.Value = 0;
++            DW544.InverseGChGammaCorrectedValue136 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++            DW544.InverseBChGammaCorrectedValue136 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++
++            DW545.Value = 0;
++            DW545.InversePixelValue136 = INVERSE_PIXEL_VALUE_136_UNNAMED34816;
++            DW545.InverseRChGammaCorrectedValue136 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++
++            DW546.Value = 0;
++            DW546.ForwardGChGammaCorrectedValue136 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++            DW546.ForwardBChGammaCorrectedValue136 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++
++            DW547.Value = 0;
++            DW547.ForwardPixelValue136 = FORWARD_PIXEL_VALUE_136_UNNAMED34816;
++            DW547.ForwardRChGammaCorrectedValue136 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_136_UNNAMED34816;
++
++            DW548.Value = 0;
++            DW548.InverseGChGammaCorrectedValue137 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++            DW548.InverseBChGammaCorrectedValue137 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++
++            DW549.Value = 0;
++            DW549.InversePixelValue137 = INVERSE_PIXEL_VALUE_137_UNNAMED35072;
++            DW549.InverseRChGammaCorrectedValue137 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++
++            DW550.Value = 0;
++            DW550.ForwardGChGammaCorrectedValue137 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++            DW550.ForwardBChGammaCorrectedValue137 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++
++            DW551.Value = 0;
++            DW551.ForwardPixelValue137 = FORWARD_PIXEL_VALUE_137_UNNAMED35072;
++            DW551.ForwardRChGammaCorrectedValue137 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_137_UNNAMED35072;
++
++            DW552.Value = 0;
++            DW552.InverseGChGammaCorrectedValue138 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++            DW552.InverseBChGammaCorrectedValue138 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++
++            DW553.Value = 0;
++            DW553.InversePixelValue138 = INVERSE_PIXEL_VALUE_138_UNNAMED35328;
++            DW553.InverseRChGammaCorrectedValue138 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++
++            DW554.Value = 0;
++            DW554.ForwardGChGammaCorrectedValue138 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++            DW554.ForwardBChGammaCorrectedValue138 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++
++            DW555.Value = 0;
++            DW555.ForwardPixelValue138 = FORWARD_PIXEL_VALUE_138_UNNAMED35328;
++            DW555.ForwardRChGammaCorrectedValue138 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_138_UNNAMED35328;
++
++            DW556.Value = 0;
++            DW556.InverseGChGammaCorrectedValue139 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++            DW556.InverseBChGammaCorrectedValue139 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++
++            DW557.Value = 0;
++            DW557.InversePixelValue139 = INVERSE_PIXEL_VALUE_139_UNNAMED35584;
++            DW557.InverseRChGammaCorrectedValue139 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++
++            DW558.Value = 0;
++            DW558.ForwardGChGammaCorrectedValue139 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++            DW558.ForwardBChGammaCorrectedValue139 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++
++            DW559.Value = 0;
++            DW559.ForwardPixelValue139 = FORWARD_PIXEL_VALUE_139_UNNAMED35584;
++            DW559.ForwardRChGammaCorrectedValue139 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_139_UNNAMED35584;
++
++            DW560.Value = 0;
++            DW560.InverseGChGammaCorrectedValue140 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++            DW560.InverseBChGammaCorrectedValue140 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++
++            DW561.Value = 0;
++            DW561.InversePixelValue140 = INVERSE_PIXEL_VALUE_140_UNNAMED35840;
++            DW561.InverseRChGammaCorrectedValue140 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++
++            DW562.Value = 0;
++            DW562.ForwardGChGammaCorrectedValue140 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++            DW562.ForwardBChGammaCorrectedValue140 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++
++            DW563.Value = 0;
++            DW563.ForwardPixelValue140 = FORWARD_PIXEL_VALUE_140_UNNAMED35840;
++            DW563.ForwardRChGammaCorrectedValue140 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_140_UNNAMED35840;
++
++            DW564.Value = 0;
++            DW564.InverseGChGammaCorrectedValue141 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++            DW564.InverseBChGammaCorrectedValue141 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++
++            DW565.Value = 0;
++            DW565.InversePixelValue141 = INVERSE_PIXEL_VALUE_141_UNNAMED36096;
++            DW565.InverseRChGammaCorrectedValue141 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++
++            DW566.Value = 0;
++            DW566.ForwardGChGammaCorrectedValue141 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++            DW566.ForwardBChGammaCorrectedValue141 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++
++            DW567.Value = 0;
++            DW567.ForwardPixelValue141 = FORWARD_PIXEL_VALUE_141_UNNAMED36096;
++            DW567.ForwardRChGammaCorrectedValue141 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_141_UNNAMED36096;
++
++            DW568.Value = 0;
++            DW568.InverseGChGammaCorrectedValue142 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++            DW568.InverseBChGammaCorrectedValue142 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++
++            DW569.Value = 0;
++            DW569.InversePixelValue142 = INVERSE_PIXEL_VALUE_142_UNNAMED36352;
++            DW569.InverseRChGammaCorrectedValue142 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++
++            DW570.Value = 0;
++            DW570.ForwardGChGammaCorrectedValue142 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++            DW570.ForwardBChGammaCorrectedValue142 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++
++            DW571.Value = 0;
++            DW571.ForwardPixelValue142 = FORWARD_PIXEL_VALUE_142_UNNAMED36352;
++            DW571.ForwardRChGammaCorrectedValue142 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_142_UNNAMED36352;
++
++            DW572.Value = 0;
++            DW572.InverseGChGammaCorrectedValue143 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++            DW572.InverseBChGammaCorrectedValue143 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++
++            DW573.Value = 0;
++            DW573.InversePixelValue143 = INVERSE_PIXEL_VALUE_143_UNNAMED36608;
++            DW573.InverseRChGammaCorrectedValue143 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++
++            DW574.Value = 0;
++            DW574.ForwardGChGammaCorrectedValue143 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++            DW574.ForwardBChGammaCorrectedValue143 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++
++            DW575.Value = 0;
++            DW575.ForwardPixelValue143 = FORWARD_PIXEL_VALUE_143_UNNAMED36608;
++            DW575.ForwardRChGammaCorrectedValue143 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_143_UNNAMED36608;
++
++            DW576.Value = 0;
++            DW576.InverseGChGammaCorrectedValue144 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++            DW576.InverseBChGammaCorrectedValue144 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++
++            DW577.Value = 0;
++            DW577.InversePixelValue144 = INVERSE_PIXEL_VALUE_144_UNNAMED36864;
++            DW577.InverseRChGammaCorrectedValue144 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++
++            DW578.Value = 0;
++            DW578.ForwardGChGammaCorrectedValue144 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++            DW578.ForwardBChGammaCorrectedValue144 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++
++            DW579.Value = 0;
++            DW579.ForwardPixelValue144 = FORWARD_PIXEL_VALUE_144_UNNAMED36864;
++            DW579.ForwardRChGammaCorrectedValue144 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_144_UNNAMED36864;
++
++            DW580.Value = 0;
++            DW580.InverseGChGammaCorrectedValue145 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++            DW580.InverseBChGammaCorrectedValue145 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++
++            DW581.Value = 0;
++            DW581.InversePixelValue145 = INVERSE_PIXEL_VALUE_145_UNNAMED37120;
++            DW581.InverseRChGammaCorrectedValue145 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++
++            DW582.Value = 0;
++            DW582.ForwardGChGammaCorrectedValue145 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++            DW582.ForwardBChGammaCorrectedValue145 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++
++            DW583.Value = 0;
++            DW583.ForwardPixelValue145 = FORWARD_PIXEL_VALUE_145_UNNAMED37120;
++            DW583.ForwardRChGammaCorrectedValue145 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_145_UNNAMED37120;
++
++            DW584.Value = 0;
++            DW584.InverseGChGammaCorrectedValue146 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++            DW584.InverseBChGammaCorrectedValue146 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++
++            DW585.Value = 0;
++            DW585.InversePixelValue146 = INVERSE_PIXEL_VALUE_146_UNNAMED37376;
++            DW585.InverseRChGammaCorrectedValue146 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++
++            DW586.Value = 0;
++            DW586.ForwardGChGammaCorrectedValue146 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++            DW586.ForwardBChGammaCorrectedValue146 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++
++            DW587.Value = 0;
++            DW587.ForwardPixelValue146 = FORWARD_PIXEL_VALUE_146_UNNAMED37376;
++            DW587.ForwardRChGammaCorrectedValue146 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_146_UNNAMED37376;
++
++            DW588.Value = 0;
++            DW588.InverseGChGammaCorrectedValue147 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++            DW588.InverseBChGammaCorrectedValue147 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++
++            DW589.Value = 0;
++            DW589.InversePixelValue147 = INVERSE_PIXEL_VALUE_147_UNNAMED37632;
++            DW589.InverseRChGammaCorrectedValue147 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++
++            DW590.Value = 0;
++            DW590.ForwardGChGammaCorrectedValue147 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++            DW590.ForwardBChGammaCorrectedValue147 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++
++            DW591.Value = 0;
++            DW591.ForwardPixelValue147 = FORWARD_PIXEL_VALUE_147_UNNAMED37632;
++            DW591.ForwardRChGammaCorrectedValue147 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_147_UNNAMED37632;
++
++            DW592.Value = 0;
++            DW592.InverseGChGammaCorrectedValue148 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++            DW592.InverseBChGammaCorrectedValue148 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++
++            DW593.Value = 0;
++            DW593.InversePixelValue148 = INVERSE_PIXEL_VALUE_148_UNNAMED37888;
++            DW593.InverseRChGammaCorrectedValue148 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++
++            DW594.Value = 0;
++            DW594.ForwardGChGammaCorrectedValue148 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++            DW594.ForwardBChGammaCorrectedValue148 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++
++            DW595.Value = 0;
++            DW595.ForwardPixelValue148 = FORWARD_PIXEL_VALUE_148_UNNAMED37888;
++            DW595.ForwardRChGammaCorrectedValue148 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_148_UNNAMED37888;
++
++            DW596.Value = 0;
++            DW596.InverseGChGammaCorrectedValue149 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++            DW596.InverseBChGammaCorrectedValue149 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++
++            DW597.Value = 0;
++            DW597.InversePixelValue149 = INVERSE_PIXEL_VALUE_149_UNNAMED38144;
++            DW597.InverseRChGammaCorrectedValue149 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++
++            DW598.Value = 0;
++            DW598.ForwardGChGammaCorrectedValue149 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++            DW598.ForwardBChGammaCorrectedValue149 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++
++            DW599.Value = 0;
++            DW599.ForwardPixelValue149 = FORWARD_PIXEL_VALUE_149_UNNAMED38144;
++            DW599.ForwardRChGammaCorrectedValue149 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_149_UNNAMED38144;
++
++            DW600.Value = 0;
++            DW600.InverseGChGammaCorrectedValue150 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++            DW600.InverseBChGammaCorrectedValue150 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++
++            DW601.Value = 0;
++            DW601.InversePixelValue150 = INVERSE_PIXEL_VALUE_150_UNNAMED38400;
++            DW601.InverseRChGammaCorrectedValue150 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++
++            DW602.Value = 0;
++            DW602.ForwardGChGammaCorrectedValue150 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++            DW602.ForwardBChGammaCorrectedValue150 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++
++            DW603.Value = 0;
++            DW603.ForwardPixelValue150 = FORWARD_PIXEL_VALUE_150_UNNAMED38400;
++            DW603.ForwardRChGammaCorrectedValue150 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_150_UNNAMED38400;
++
++            DW604.Value = 0;
++            DW604.InverseGChGammaCorrectedValue151 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++            DW604.InverseBChGammaCorrectedValue151 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++
++            DW605.Value = 0;
++            DW605.InversePixelValue151 = INVERSE_PIXEL_VALUE_151_UNNAMED38656;
++            DW605.InverseRChGammaCorrectedValue151 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++
++            DW606.Value = 0;
++            DW606.ForwardGChGammaCorrectedValue151 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++            DW606.ForwardBChGammaCorrectedValue151 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++
++            DW607.Value = 0;
++            DW607.ForwardPixelValue151 = FORWARD_PIXEL_VALUE_151_UNNAMED38656;
++            DW607.ForwardRChGammaCorrectedValue151 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_151_UNNAMED38656;
++
++            DW608.Value = 0;
++            DW608.InverseGChGammaCorrectedValue152 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++            DW608.InverseBChGammaCorrectedValue152 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++
++            DW609.Value = 0;
++            DW609.InversePixelValue152 = INVERSE_PIXEL_VALUE_152_UNNAMED38912;
++            DW609.InverseRChGammaCorrectedValue152 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++
++            DW610.Value = 0;
++            DW610.ForwardGChGammaCorrectedValue152 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++            DW610.ForwardBChGammaCorrectedValue152 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++
++            DW611.Value = 0;
++            DW611.ForwardPixelValue152 = FORWARD_PIXEL_VALUE_152_UNNAMED38912;
++            DW611.ForwardRChGammaCorrectedValue152 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_152_UNNAMED38912;
++
++            DW612.Value = 0;
++            DW612.InverseGChGammaCorrectedValue153 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++            DW612.InverseBChGammaCorrectedValue153 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++
++            DW613.Value = 0;
++            DW613.InversePixelValue153 = INVERSE_PIXEL_VALUE_153_UNNAMED39168;
++            DW613.InverseRChGammaCorrectedValue153 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++
++            DW614.Value = 0;
++            DW614.ForwardGChGammaCorrectedValue153 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++            DW614.ForwardBChGammaCorrectedValue153 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++
++            DW615.Value = 0;
++            DW615.ForwardPixelValue153 = FORWARD_PIXEL_VALUE_153_UNNAMED39168;
++            DW615.ForwardRChGammaCorrectedValue153 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_153_UNNAMED39168;
++
++            DW616.Value = 0;
++            DW616.InverseGChGammaCorrectedValue154 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++            DW616.InverseBChGammaCorrectedValue154 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++
++            DW617.Value = 0;
++            DW617.InversePixelValue154 = INVERSE_PIXEL_VALUE_154_UNNAMED39424;
++            DW617.InverseRChGammaCorrectedValue154 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++
++            DW618.Value = 0;
++            DW618.ForwardGChGammaCorrectedValue154 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++            DW618.ForwardBChGammaCorrectedValue154 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++
++            DW619.Value = 0;
++            DW619.ForwardPixelValue154 = FORWARD_PIXEL_VALUE_154_UNNAMED39424;
++            DW619.ForwardRChGammaCorrectedValue154 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_154_UNNAMED39424;
++
++            DW620.Value = 0;
++            DW620.InverseGChGammaCorrectedValue155 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++            DW620.InverseBChGammaCorrectedValue155 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++
++            DW621.Value = 0;
++            DW621.InversePixelValue155 = INVERSE_PIXEL_VALUE_155_UNNAMED39680;
++            DW621.InverseRChGammaCorrectedValue155 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++
++            DW622.Value = 0;
++            DW622.ForwardGChGammaCorrectedValue155 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++            DW622.ForwardBChGammaCorrectedValue155 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++
++            DW623.Value = 0;
++            DW623.ForwardPixelValue155 = FORWARD_PIXEL_VALUE_155_UNNAMED39680;
++            DW623.ForwardRChGammaCorrectedValue155 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_155_UNNAMED39680;
++
++            DW624.Value = 0;
++            DW624.InverseGChGammaCorrectedValue156 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++            DW624.InverseBChGammaCorrectedValue156 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++
++            DW625.Value = 0;
++            DW625.InversePixelValue156 = INVERSE_PIXEL_VALUE_156_UNNAMED39936;
++            DW625.InverseRChGammaCorrectedValue156 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++
++            DW626.Value = 0;
++            DW626.ForwardGChGammaCorrectedValue156 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++            DW626.ForwardBChGammaCorrectedValue156 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++
++            DW627.Value = 0;
++            DW627.ForwardPixelValue156 = FORWARD_PIXEL_VALUE_156_UNNAMED39936;
++            DW627.ForwardRChGammaCorrectedValue156 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_156_UNNAMED39936;
++
++            DW628.Value = 0;
++            DW628.InverseGChGammaCorrectedValue157 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++            DW628.InverseBChGammaCorrectedValue157 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++
++            DW629.Value = 0;
++            DW629.InversePixelValue157 = INVERSE_PIXEL_VALUE_157_UNNAMED40192;
++            DW629.InverseRChGammaCorrectedValue157 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++
++            DW630.Value = 0;
++            DW630.ForwardGChGammaCorrectedValue157 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++            DW630.ForwardBChGammaCorrectedValue157 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++
++            DW631.Value = 0;
++            DW631.ForwardPixelValue157 = FORWARD_PIXEL_VALUE_157_UNNAMED40192;
++            DW631.ForwardRChGammaCorrectedValue157 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_157_UNNAMED40192;
++
++            DW632.Value = 0;
++            DW632.InverseGChGammaCorrectedValue158 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++            DW632.InverseBChGammaCorrectedValue158 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++
++            DW633.Value = 0;
++            DW633.InversePixelValue158 = INVERSE_PIXEL_VALUE_158_UNNAMED40448;
++            DW633.InverseRChGammaCorrectedValue158 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++
++            DW634.Value = 0;
++            DW634.ForwardGChGammaCorrectedValue158 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++            DW634.ForwardBChGammaCorrectedValue158 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++
++            DW635.Value = 0;
++            DW635.ForwardPixelValue158 = FORWARD_PIXEL_VALUE_158_UNNAMED40448;
++            DW635.ForwardRChGammaCorrectedValue158 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_158_UNNAMED40448;
++
++            DW636.Value = 0;
++            DW636.InverseGChGammaCorrectedValue159 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++            DW636.InverseBChGammaCorrectedValue159 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++
++            DW637.Value = 0;
++            DW637.InversePixelValue159 = INVERSE_PIXEL_VALUE_159_UNNAMED40704;
++            DW637.InverseRChGammaCorrectedValue159 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++
++            DW638.Value = 0;
++            DW638.ForwardGChGammaCorrectedValue159 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++            DW638.ForwardBChGammaCorrectedValue159 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++
++            DW639.Value = 0;
++            DW639.ForwardPixelValue159 = FORWARD_PIXEL_VALUE_159_UNNAMED40704;
++            DW639.ForwardRChGammaCorrectedValue159 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_159_UNNAMED40704;
++
++            DW640.Value = 0;
++            DW640.InverseGChGammaCorrectedValue160 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++            DW640.InverseBChGammaCorrectedValue160 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++
++            DW641.Value = 0;
++            DW641.InversePixelValue160 = INVERSE_PIXEL_VALUE_160_UNNAMED40960;
++            DW641.InverseRChGammaCorrectedValue160 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++
++            DW642.Value = 0;
++            DW642.ForwardGChGammaCorrectedValue160 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++            DW642.ForwardBChGammaCorrectedValue160 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++
++            DW643.Value = 0;
++            DW643.ForwardPixelValue160 = FORWARD_PIXEL_VALUE_160_UNNAMED40960;
++            DW643.ForwardRChGammaCorrectedValue160 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_160_UNNAMED40960;
++
++            DW644.Value = 0;
++            DW644.InverseGChGammaCorrectedValue161 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++            DW644.InverseBChGammaCorrectedValue161 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++
++            DW645.Value = 0;
++            DW645.InversePixelValue161 = INVERSE_PIXEL_VALUE_161_UNNAMED41216;
++            DW645.InverseRChGammaCorrectedValue161 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++
++            DW646.Value = 0;
++            DW646.ForwardGChGammaCorrectedValue161 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++            DW646.ForwardBChGammaCorrectedValue161 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++
++            DW647.Value = 0;
++            DW647.ForwardPixelValue161 = FORWARD_PIXEL_VALUE_161_UNNAMED41216;
++            DW647.ForwardRChGammaCorrectedValue161 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_161_UNNAMED41216;
++
++            DW648.Value = 0;
++            DW648.InverseGChGammaCorrectedValue162 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++            DW648.InverseBChGammaCorrectedValue162 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++
++            DW649.Value = 0;
++            DW649.InversePixelValue162 = INVERSE_PIXEL_VALUE_162_UNNAMED41472;
++            DW649.InverseRChGammaCorrectedValue162 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++
++            DW650.Value = 0;
++            DW650.ForwardGChGammaCorrectedValue162 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++            DW650.ForwardBChGammaCorrectedValue162 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++
++            DW651.Value = 0;
++            DW651.ForwardPixelValue162 = FORWARD_PIXEL_VALUE_162_UNNAMED41472;
++            DW651.ForwardRChGammaCorrectedValue162 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_162_UNNAMED41472;
++
++            DW652.Value = 0;
++            DW652.InverseGChGammaCorrectedValue163 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++            DW652.InverseBChGammaCorrectedValue163 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++
++            DW653.Value = 0;
++            DW653.InversePixelValue163 = INVERSE_PIXEL_VALUE_163_UNNAMED41728;
++            DW653.InverseRChGammaCorrectedValue163 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++
++            DW654.Value = 0;
++            DW654.ForwardGChGammaCorrectedValue163 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++            DW654.ForwardBChGammaCorrectedValue163 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++
++            DW655.Value = 0;
++            DW655.ForwardPixelValue163 = FORWARD_PIXEL_VALUE_163_UNNAMED41728;
++            DW655.ForwardRChGammaCorrectedValue163 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_163_UNNAMED41728;
++
++            DW656.Value = 0;
++            DW656.InverseGChGammaCorrectedValue164 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++            DW656.InverseBChGammaCorrectedValue164 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++
++            DW657.Value = 0;
++            DW657.InversePixelValue164 = INVERSE_PIXEL_VALUE_164_UNNAMED41984;
++            DW657.InverseRChGammaCorrectedValue164 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++
++            DW658.Value = 0;
++            DW658.ForwardGChGammaCorrectedValue164 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++            DW658.ForwardBChGammaCorrectedValue164 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++
++            DW659.Value = 0;
++            DW659.ForwardPixelValue164 = FORWARD_PIXEL_VALUE_164_UNNAMED41984;
++            DW659.ForwardRChGammaCorrectedValue164 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_164_UNNAMED41984;
++
++            DW660.Value = 0;
++            DW660.InverseGChGammaCorrectedValue165 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++            DW660.InverseBChGammaCorrectedValue165 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++
++            DW661.Value = 0;
++            DW661.InversePixelValue165 = INVERSE_PIXEL_VALUE_165_UNNAMED42240;
++            DW661.InverseRChGammaCorrectedValue165 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++
++            DW662.Value = 0;
++            DW662.ForwardGChGammaCorrectedValue165 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++            DW662.ForwardBChGammaCorrectedValue165 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++
++            DW663.Value = 0;
++            DW663.ForwardPixelValue165 = FORWARD_PIXEL_VALUE_165_UNNAMED42240;
++            DW663.ForwardRChGammaCorrectedValue165 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_165_UNNAMED42240;
++
++            DW664.Value = 0;
++            DW664.InverseGChGammaCorrectedValue166 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++            DW664.InverseBChGammaCorrectedValue166 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++
++            DW665.Value = 0;
++            DW665.InversePixelValue166 = INVERSE_PIXEL_VALUE_166_UNNAMED42496;
++            DW665.InverseRChGammaCorrectedValue166 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++
++            DW666.Value = 0;
++            DW666.ForwardGChGammaCorrectedValue166 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++            DW666.ForwardBChGammaCorrectedValue166 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++
++            DW667.Value = 0;
++            DW667.ForwardPixelValue166 = FORWARD_PIXEL_VALUE_166_UNNAMED42496;
++            DW667.ForwardRChGammaCorrectedValue166 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_166_UNNAMED42496;
++
++            DW668.Value = 0;
++            DW668.InverseGChGammaCorrectedValue167 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++            DW668.InverseBChGammaCorrectedValue167 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++
++            DW669.Value = 0;
++            DW669.InversePixelValue167 = INVERSE_PIXEL_VALUE_167_UNNAMED42752;
++            DW669.InverseRChGammaCorrectedValue167 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++
++            DW670.Value = 0;
++            DW670.ForwardGChGammaCorrectedValue167 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++            DW670.ForwardBChGammaCorrectedValue167 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++
++            DW671.Value = 0;
++            DW671.ForwardPixelValue167 = FORWARD_PIXEL_VALUE_167_UNNAMED42752;
++            DW671.ForwardRChGammaCorrectedValue167 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_167_UNNAMED42752;
++
++            DW672.Value = 0;
++            DW672.InverseGChGammaCorrectedValue168 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++            DW672.InverseBChGammaCorrectedValue168 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++
++            DW673.Value = 0;
++            DW673.InversePixelValue168 = INVERSE_PIXEL_VALUE_168_UNNAMED43008;
++            DW673.InverseRChGammaCorrectedValue168 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++
++            DW674.Value = 0;
++            DW674.ForwardGChGammaCorrectedValue168 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++            DW674.ForwardBChGammaCorrectedValue168 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++
++            DW675.Value = 0;
++            DW675.ForwardPixelValue168 = FORWARD_PIXEL_VALUE_168_UNNAMED43008;
++            DW675.ForwardRChGammaCorrectedValue168 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_168_UNNAMED43008;
++
++            DW676.Value = 0;
++            DW676.InverseGChGammaCorrectedValue169 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++            DW676.InverseBChGammaCorrectedValue169 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++
++            DW677.Value = 0;
++            DW677.InversePixelValue169 = INVERSE_PIXEL_VALUE_169_UNNAMED43264;
++            DW677.InverseRChGammaCorrectedValue169 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++
++            DW678.Value = 0;
++            DW678.ForwardGChGammaCorrectedValue169 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++            DW678.ForwardBChGammaCorrectedValue169 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++
++            DW679.Value = 0;
++            DW679.ForwardPixelValue169 = FORWARD_PIXEL_VALUE_169_UNNAMED43264;
++            DW679.ForwardRChGammaCorrectedValue169 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_169_UNNAMED43264;
++
++            DW680.Value = 0;
++            DW680.InverseGChGammaCorrectedValue170 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++            DW680.InverseBChGammaCorrectedValue170 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++
++            DW681.Value = 0;
++            DW681.InversePixelValue170 = INVERSE_PIXEL_VALUE_170_UNNAMED43520;
++            DW681.InverseRChGammaCorrectedValue170 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++
++            DW682.Value = 0;
++            DW682.ForwardGChGammaCorrectedValue170 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++            DW682.ForwardBChGammaCorrectedValue170 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++
++            DW683.Value = 0;
++            DW683.ForwardPixelValue170 = FORWARD_PIXEL_VALUE_170_UNNAMED43520;
++            DW683.ForwardRChGammaCorrectedValue170 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_170_UNNAMED43520;
++
++            DW684.Value = 0;
++            DW684.InverseGChGammaCorrectedValue171 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++            DW684.InverseBChGammaCorrectedValue171 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++
++            DW685.Value = 0;
++            DW685.InversePixelValue171 = INVERSE_PIXEL_VALUE_171_UNNAMED43776;
++            DW685.InverseRChGammaCorrectedValue171 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++
++            DW686.Value = 0;
++            DW686.ForwardGChGammaCorrectedValue171 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++            DW686.ForwardBChGammaCorrectedValue171 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++
++            DW687.Value = 0;
++            DW687.ForwardPixelValue171 = FORWARD_PIXEL_VALUE_171_UNNAMED43776;
++            DW687.ForwardRChGammaCorrectedValue171 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_171_UNNAMED43776;
++
++            DW688.Value = 0;
++            DW688.InverseGChGammaCorrectedValue172 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++            DW688.InverseBChGammaCorrectedValue172 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++
++            DW689.Value = 0;
++            DW689.InversePixelValue172 = INVERSE_PIXEL_VALUE_172_UNNAMED44032;
++            DW689.InverseRChGammaCorrectedValue172 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++
++            DW690.Value = 0;
++            DW690.ForwardGChGammaCorrectedValue172 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++            DW690.ForwardBChGammaCorrectedValue172 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++
++            DW691.Value = 0;
++            DW691.ForwardPixelValue172 = FORWARD_PIXEL_VALUE_172_UNNAMED44032;
++            DW691.ForwardRChGammaCorrectedValue172 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_172_UNNAMED44032;
++
++            DW692.Value = 0;
++            DW692.InverseGChGammaCorrectedValue173 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++            DW692.InverseBChGammaCorrectedValue173 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++
++            DW693.Value = 0;
++            DW693.InversePixelValue173 = INVERSE_PIXEL_VALUE_173_UNNAMED44288;
++            DW693.InverseRChGammaCorrectedValue173 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++
++            DW694.Value = 0;
++            DW694.ForwardGChGammaCorrectedValue173 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++            DW694.ForwardBChGammaCorrectedValue173 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++
++            DW695.Value = 0;
++            DW695.ForwardPixelValue173 = FORWARD_PIXEL_VALUE_173_UNNAMED44288;
++            DW695.ForwardRChGammaCorrectedValue173 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_173_UNNAMED44288;
++
++            DW696.Value = 0;
++            DW696.InverseGChGammaCorrectedValue174 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++            DW696.InverseBChGammaCorrectedValue174 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++
++            DW697.Value = 0;
++            DW697.InversePixelValue174 = INVERSE_PIXEL_VALUE_174_UNNAMED44544;
++            DW697.InverseRChGammaCorrectedValue174 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++
++            DW698.Value = 0;
++            DW698.ForwardGChGammaCorrectedValue174 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++            DW698.ForwardBChGammaCorrectedValue174 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++
++            DW699.Value = 0;
++            DW699.ForwardPixelValue174 = FORWARD_PIXEL_VALUE_174_UNNAMED44544;
++            DW699.ForwardRChGammaCorrectedValue174 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_174_UNNAMED44544;
++
++            DW700.Value = 0;
++            DW700.InverseGChGammaCorrectedValue175 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++            DW700.InverseBChGammaCorrectedValue175 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++
++            DW701.Value = 0;
++            DW701.InversePixelValue175 = INVERSE_PIXEL_VALUE_175_UNNAMED44800;
++            DW701.InverseRChGammaCorrectedValue175 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++
++            DW702.Value = 0;
++            DW702.ForwardGChGammaCorrectedValue175 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++            DW702.ForwardBChGammaCorrectedValue175 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++
++            DW703.Value = 0;
++            DW703.ForwardPixelValue175 = FORWARD_PIXEL_VALUE_175_UNNAMED44800;
++            DW703.ForwardRChGammaCorrectedValue175 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_175_UNNAMED44800;
++
++            DW704.Value = 0;
++            DW704.InverseGChGammaCorrectedValue176 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++            DW704.InverseBChGammaCorrectedValue176 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++
++            DW705.Value = 0;
++            DW705.InversePixelValue176 = INVERSE_PIXEL_VALUE_176_UNNAMED45056;
++            DW705.InverseRChGammaCorrectedValue176 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++
++            DW706.Value = 0;
++            DW706.ForwardGChGammaCorrectedValue176 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++            DW706.ForwardBChGammaCorrectedValue176 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++
++            DW707.Value = 0;
++            DW707.ForwardPixelValue176 = FORWARD_PIXEL_VALUE_176_UNNAMED45056;
++            DW707.ForwardRChGammaCorrectedValue176 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_176_UNNAMED45056;
++
++            DW708.Value = 0;
++            DW708.InverseGChGammaCorrectedValue177 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++            DW708.InverseBChGammaCorrectedValue177 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++
++            DW709.Value = 0;
++            DW709.InversePixelValue177 = INVERSE_PIXEL_VALUE_177_UNNAMED45312;
++            DW709.InverseRChGammaCorrectedValue177 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++
++            DW710.Value = 0;
++            DW710.ForwardGChGammaCorrectedValue177 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++            DW710.ForwardBChGammaCorrectedValue177 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++
++            DW711.Value = 0;
++            DW711.ForwardPixelValue177 = FORWARD_PIXEL_VALUE_177_UNNAMED45312;
++            DW711.ForwardRChGammaCorrectedValue177 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_177_UNNAMED45312;
++
++            DW712.Value = 0;
++            DW712.InverseGChGammaCorrectedValue178 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++            DW712.InverseBChGammaCorrectedValue178 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++
++            DW713.Value = 0;
++            DW713.InversePixelValue178 = INVERSE_PIXEL_VALUE_178_UNNAMED45568;
++            DW713.InverseRChGammaCorrectedValue178 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++
++            DW714.Value = 0;
++            DW714.ForwardGChGammaCorrectedValue178 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++            DW714.ForwardBChGammaCorrectedValue178 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++
++            DW715.Value = 0;
++            DW715.ForwardPixelValue178 = FORWARD_PIXEL_VALUE_178_UNNAMED45568;
++            DW715.ForwardRChGammaCorrectedValue178 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_178_UNNAMED45568;
++
++            DW716.Value = 0;
++            DW716.InverseGChGammaCorrectedValue179 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++            DW716.InverseBChGammaCorrectedValue179 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++
++            DW717.Value = 0;
++            DW717.InversePixelValue179 = INVERSE_PIXEL_VALUE_179_UNNAMED45824;
++            DW717.InverseRChGammaCorrectedValue179 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++
++            DW718.Value = 0;
++            DW718.ForwardGChGammaCorrectedValue179 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++            DW718.ForwardBChGammaCorrectedValue179 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++
++            DW719.Value = 0;
++            DW719.ForwardPixelValue179 = FORWARD_PIXEL_VALUE_179_UNNAMED45824;
++            DW719.ForwardRChGammaCorrectedValue179 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_179_UNNAMED45824;
++
++            DW720.Value = 0;
++            DW720.InverseGChGammaCorrectedValue180 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++            DW720.InverseBChGammaCorrectedValue180 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++
++            DW721.Value = 0;
++            DW721.InversePixelValue180 = INVERSE_PIXEL_VALUE_180_UNNAMED46080;
++            DW721.InverseRChGammaCorrectedValue180 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++
++            DW722.Value = 0;
++            DW722.ForwardGChGammaCorrectedValue180 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++            DW722.ForwardBChGammaCorrectedValue180 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++
++            DW723.Value = 0;
++            DW723.ForwardPixelValue180 = FORWARD_PIXEL_VALUE_180_UNNAMED46080;
++            DW723.ForwardRChGammaCorrectedValue180 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_180_UNNAMED46080;
++
++            DW724.Value = 0;
++            DW724.InverseGChGammaCorrectedValue181 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++            DW724.InverseBChGammaCorrectedValue181 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++
++            DW725.Value = 0;
++            DW725.InversePixelValue181 = INVERSE_PIXEL_VALUE_181_UNNAMED46336;
++            DW725.InverseRChGammaCorrectedValue181 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++
++            DW726.Value = 0;
++            DW726.ForwardGChGammaCorrectedValue181 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++            DW726.ForwardBChGammaCorrectedValue181 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++
++            DW727.Value = 0;
++            DW727.ForwardPixelValue181 = FORWARD_PIXEL_VALUE_181_UNNAMED46336;
++            DW727.ForwardRChGammaCorrectedValue181 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_181_UNNAMED46336;
++
++            DW728.Value = 0;
++            DW728.InverseGChGammaCorrectedValue182 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++            DW728.InverseBChGammaCorrectedValue182 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++
++            DW729.Value = 0;
++            DW729.InversePixelValue182 = INVERSE_PIXEL_VALUE_182_UNNAMED46592;
++            DW729.InverseRChGammaCorrectedValue182 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++
++            DW730.Value = 0;
++            DW730.ForwardGChGammaCorrectedValue182 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++            DW730.ForwardBChGammaCorrectedValue182 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++
++            DW731.Value = 0;
++            DW731.ForwardPixelValue182 = FORWARD_PIXEL_VALUE_182_UNNAMED46592;
++            DW731.ForwardRChGammaCorrectedValue182 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_182_UNNAMED46592;
++
++            DW732.Value = 0;
++            DW732.InverseGChGammaCorrectedValue183 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++            DW732.InverseBChGammaCorrectedValue183 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++
++            DW733.Value = 0;
++            DW733.InversePixelValue183 = INVERSE_PIXEL_VALUE_183_UNNAMED46848;
++            DW733.InverseRChGammaCorrectedValue183 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++
++            DW734.Value = 0;
++            DW734.ForwardGChGammaCorrectedValue183 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++            DW734.ForwardBChGammaCorrectedValue183 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++
++            DW735.Value = 0;
++            DW735.ForwardPixelValue183 = FORWARD_PIXEL_VALUE_183_UNNAMED46848;
++            DW735.ForwardRChGammaCorrectedValue183 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_183_UNNAMED46848;
++
++            DW736.Value = 0;
++            DW736.InverseGChGammaCorrectedValue184 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++            DW736.InverseBChGammaCorrectedValue184 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++
++            DW737.Value = 0;
++            DW737.InversePixelValue184 = INVERSE_PIXEL_VALUE_184_UNNAMED47104;
++            DW737.InverseRChGammaCorrectedValue184 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++
++            DW738.Value = 0;
++            DW738.ForwardGChGammaCorrectedValue184 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++            DW738.ForwardBChGammaCorrectedValue184 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++
++            DW739.Value = 0;
++            DW739.ForwardPixelValue184 = FORWARD_PIXEL_VALUE_184_UNNAMED47104;
++            DW739.ForwardRChGammaCorrectedValue184 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_184_UNNAMED47104;
++
++            DW740.Value = 0;
++            DW740.InverseGChGammaCorrectedValue185 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++            DW740.InverseBChGammaCorrectedValue185 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++
++            DW741.Value = 0;
++            DW741.InversePixelValue185 = INVERSE_PIXEL_VALUE_185_UNNAMED47360;
++            DW741.InverseRChGammaCorrectedValue185 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++
++            DW742.Value = 0;
++            DW742.ForwardGChGammaCorrectedValue185 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++            DW742.ForwardBChGammaCorrectedValue185 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++
++            DW743.Value = 0;
++            DW743.ForwardPixelValue185 = FORWARD_PIXEL_VALUE_185_UNNAMED47360;
++            DW743.ForwardRChGammaCorrectedValue185 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_185_UNNAMED47360;
++
++            DW744.Value = 0;
++            DW744.InverseGChGammaCorrectedValue186 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++            DW744.InverseBChGammaCorrectedValue186 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++
++            DW745.Value = 0;
++            DW745.InversePixelValue186 = INVERSE_PIXEL_VALUE_186_UNNAMED47616;
++            DW745.InverseRChGammaCorrectedValue186 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++
++            DW746.Value = 0;
++            DW746.ForwardGChGammaCorrectedValue186 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++            DW746.ForwardBChGammaCorrectedValue186 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++
++            DW747.Value = 0;
++            DW747.ForwardPixelValue186 = FORWARD_PIXEL_VALUE_186_UNNAMED47616;
++            DW747.ForwardRChGammaCorrectedValue186 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_186_UNNAMED47616;
++
++            DW748.Value = 0;
++            DW748.InverseGChGammaCorrectedValue187 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++            DW748.InverseBChGammaCorrectedValue187 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++
++            DW749.Value = 0;
++            DW749.InversePixelValue187 = INVERSE_PIXEL_VALUE_187_UNNAMED47872;
++            DW749.InverseRChGammaCorrectedValue187 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++
++            DW750.Value = 0;
++            DW750.ForwardGChGammaCorrectedValue187 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++            DW750.ForwardBChGammaCorrectedValue187 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++
++            DW751.Value = 0;
++            DW751.ForwardPixelValue187 = FORWARD_PIXEL_VALUE_187_UNNAMED47872;
++            DW751.ForwardRChGammaCorrectedValue187 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_187_UNNAMED47872;
++
++            DW752.Value = 0;
++            DW752.InverseGChGammaCorrectedValue188 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++            DW752.InverseBChGammaCorrectedValue188 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++
++            DW753.Value = 0;
++            DW753.InversePixelValue188 = INVERSE_PIXEL_VALUE_188_UNNAMED48128;
++            DW753.InverseRChGammaCorrectedValue188 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++
++            DW754.Value = 0;
++            DW754.ForwardGChGammaCorrectedValue188 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++            DW754.ForwardBChGammaCorrectedValue188 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++
++            DW755.Value = 0;
++            DW755.ForwardPixelValue188 = FORWARD_PIXEL_VALUE_188_UNNAMED48128;
++            DW755.ForwardRChGammaCorrectedValue188 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_188_UNNAMED48128;
++
++            DW756.Value = 0;
++            DW756.InverseGChGammaCorrectedValue189 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++            DW756.InverseBChGammaCorrectedValue189 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++
++            DW757.Value = 0;
++            DW757.InversePixelValue189 = INVERSE_PIXEL_VALUE_189_UNNAMED48384;
++            DW757.InverseRChGammaCorrectedValue189 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++
++            DW758.Value = 0;
++            DW758.ForwardGChGammaCorrectedValue189 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++            DW758.ForwardBChGammaCorrectedValue189 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++
++            DW759.Value = 0;
++            DW759.ForwardPixelValue189 = FORWARD_PIXEL_VALUE_189_UNNAMED48384;
++            DW759.ForwardRChGammaCorrectedValue189 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_189_UNNAMED48384;
++
++            DW760.Value = 0;
++            DW760.InverseGChGammaCorrectedValue190 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++            DW760.InverseBChGammaCorrectedValue190 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++
++            DW761.Value = 0;
++            DW761.InversePixelValue190 = INVERSE_PIXEL_VALUE_190_UNNAMED48640;
++            DW761.InverseRChGammaCorrectedValue190 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++
++            DW762.Value = 0;
++            DW762.ForwardGChGammaCorrectedValue190 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++            DW762.ForwardBChGammaCorrectedValue190 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++
++            DW763.Value = 0;
++            DW763.ForwardPixelValue190 = FORWARD_PIXEL_VALUE_190_UNNAMED48640;
++            DW763.ForwardRChGammaCorrectedValue190 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_190_UNNAMED48640;
++
++            DW764.Value = 0;
++            DW764.InverseGChGammaCorrectedValue191 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++            DW764.InverseBChGammaCorrectedValue191 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++
++            DW765.Value = 0;
++            DW765.InversePixelValue191 = INVERSE_PIXEL_VALUE_191_UNNAMED48896;
++            DW765.InverseRChGammaCorrectedValue191 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++
++            DW766.Value = 0;
++            DW766.ForwardGChGammaCorrectedValue191 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++            DW766.ForwardBChGammaCorrectedValue191 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++
++            DW767.Value = 0;
++            DW767.ForwardPixelValue191 = FORWARD_PIXEL_VALUE_191_UNNAMED48896;
++            DW767.ForwardRChGammaCorrectedValue191 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_191_UNNAMED48896;
++
++            DW768.Value = 0;
++            DW768.InverseGChGammaCorrectedValue192 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++            DW768.InverseBChGammaCorrectedValue192 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++
++            DW769.Value = 0;
++            DW769.InversePixelValue192 = INVERSE_PIXEL_VALUE_192_UNNAMED49152;
++            DW769.InverseRChGammaCorrectedValue192 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++
++            DW770.Value = 0;
++            DW770.ForwardGChGammaCorrectedValue192 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++            DW770.ForwardBChGammaCorrectedValue192 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++
++            DW771.Value = 0;
++            DW771.ForwardPixelValue192 = FORWARD_PIXEL_VALUE_192_UNNAMED49152;
++            DW771.ForwardRChGammaCorrectedValue192 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_192_UNNAMED49152;
++
++            DW772.Value = 0;
++            DW772.InverseGChGammaCorrectedValue193 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++            DW772.InverseBChGammaCorrectedValue193 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++
++            DW773.Value = 0;
++            DW773.InversePixelValue193 = INVERSE_PIXEL_VALUE_193_UNNAMED49408;
++            DW773.InverseRChGammaCorrectedValue193 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++
++            DW774.Value = 0;
++            DW774.ForwardGChGammaCorrectedValue193 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++            DW774.ForwardBChGammaCorrectedValue193 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++
++            DW775.Value = 0;
++            DW775.ForwardPixelValue193 = FORWARD_PIXEL_VALUE_193_UNNAMED49408;
++            DW775.ForwardRChGammaCorrectedValue193 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_193_UNNAMED49408;
++
++            DW776.Value = 0;
++            DW776.InverseGChGammaCorrectedValue194 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++            DW776.InverseBChGammaCorrectedValue194 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++
++            DW777.Value = 0;
++            DW777.InversePixelValue194 = INVERSE_PIXEL_VALUE_194_UNNAMED49664;
++            DW777.InverseRChGammaCorrectedValue194 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++
++            DW778.Value = 0;
++            DW778.ForwardGChGammaCorrectedValue194 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++            DW778.ForwardBChGammaCorrectedValue194 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++
++            DW779.Value = 0;
++            DW779.ForwardPixelValue194 = FORWARD_PIXEL_VALUE_194_UNNAMED49664;
++            DW779.ForwardRChGammaCorrectedValue194 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_194_UNNAMED49664;
++
++            DW780.Value = 0;
++            DW780.InverseGChGammaCorrectedValue195 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++            DW780.InverseBChGammaCorrectedValue195 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++
++            DW781.Value = 0;
++            DW781.InversePixelValue195 = INVERSE_PIXEL_VALUE_195_UNNAMED49920;
++            DW781.InverseRChGammaCorrectedValue195 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++
++            DW782.Value = 0;
++            DW782.ForwardGChGammaCorrectedValue195 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++            DW782.ForwardBChGammaCorrectedValue195 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++
++            DW783.Value = 0;
++            DW783.ForwardPixelValue195 = FORWARD_PIXEL_VALUE_195_UNNAMED49920;
++            DW783.ForwardRChGammaCorrectedValue195 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_195_UNNAMED49920;
++
++            DW784.Value = 0;
++            DW784.InverseGChGammaCorrectedValue196 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++            DW784.InverseBChGammaCorrectedValue196 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++
++            DW785.Value = 0;
++            DW785.InversePixelValue196 = INVERSE_PIXEL_VALUE_196_UNNAMED50176;
++            DW785.InverseRChGammaCorrectedValue196 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++
++            DW786.Value = 0;
++            DW786.ForwardGChGammaCorrectedValue196 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++            DW786.ForwardBChGammaCorrectedValue196 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++
++            DW787.Value = 0;
++            DW787.ForwardPixelValue196 = FORWARD_PIXEL_VALUE_196_UNNAMED50176;
++            DW787.ForwardRChGammaCorrectedValue196 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_196_UNNAMED50176;
++
++            DW788.Value = 0;
++            DW788.InverseGChGammaCorrectedValue197 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++            DW788.InverseBChGammaCorrectedValue197 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++
++            DW789.Value = 0;
++            DW789.InversePixelValue197 = INVERSE_PIXEL_VALUE_197_UNNAMED50432;
++            DW789.InverseRChGammaCorrectedValue197 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++
++            DW790.Value = 0;
++            DW790.ForwardGChGammaCorrectedValue197 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++            DW790.ForwardBChGammaCorrectedValue197 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++
++            DW791.Value = 0;
++            DW791.ForwardPixelValue197 = FORWARD_PIXEL_VALUE_197_UNNAMED50432;
++            DW791.ForwardRChGammaCorrectedValue197 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_197_UNNAMED50432;
++
++            DW792.Value = 0;
++            DW792.InverseGChGammaCorrectedValue198 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++            DW792.InverseBChGammaCorrectedValue198 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++
++            DW793.Value = 0;
++            DW793.InversePixelValue198 = INVERSE_PIXEL_VALUE_198_UNNAMED50688;
++            DW793.InverseRChGammaCorrectedValue198 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++
++            DW794.Value = 0;
++            DW794.ForwardGChGammaCorrectedValue198 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++            DW794.ForwardBChGammaCorrectedValue198 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++
++            DW795.Value = 0;
++            DW795.ForwardPixelValue198 = FORWARD_PIXEL_VALUE_198_UNNAMED50688;
++            DW795.ForwardRChGammaCorrectedValue198 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_198_UNNAMED50688;
++
++            DW796.Value = 0;
++            DW796.InverseGChGammaCorrectedValue199 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++            DW796.InverseBChGammaCorrectedValue199 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++
++            DW797.Value = 0;
++            DW797.InversePixelValue199 = INVERSE_PIXEL_VALUE_199_UNNAMED50944;
++            DW797.InverseRChGammaCorrectedValue199 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++
++            DW798.Value = 0;
++            DW798.ForwardGChGammaCorrectedValue199 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++            DW798.ForwardBChGammaCorrectedValue199 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++
++            DW799.Value = 0;
++            DW799.ForwardPixelValue199 = FORWARD_PIXEL_VALUE_199_UNNAMED50944;
++            DW799.ForwardRChGammaCorrectedValue199 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_199_UNNAMED50944;
++
++            DW800.Value = 0;
++            DW800.InverseGChGammaCorrectedValue200 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++            DW800.InverseBChGammaCorrectedValue200 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++
++            DW801.Value = 0;
++            DW801.InversePixelValue200 = INVERSE_PIXEL_VALUE_200_UNNAMED51200;
++            DW801.InverseRChGammaCorrectedValue200 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++
++            DW802.Value = 0;
++            DW802.ForwardGChGammaCorrectedValue200 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++            DW802.ForwardBChGammaCorrectedValue200 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++
++            DW803.Value = 0;
++            DW803.ForwardPixelValue200 = FORWARD_PIXEL_VALUE_200_UNNAMED51200;
++            DW803.ForwardRChGammaCorrectedValue200 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_200_UNNAMED51200;
++
++            DW804.Value = 0;
++            DW804.InverseGChGammaCorrectedValue201 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++            DW804.InverseBChGammaCorrectedValue201 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++
++            DW805.Value = 0;
++            DW805.InversePixelValue201 = INVERSE_PIXEL_VALUE_201_UNNAMED51456;
++            DW805.InverseRChGammaCorrectedValue201 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++
++            DW806.Value = 0;
++            DW806.ForwardGChGammaCorrectedValue201 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++            DW806.ForwardBChGammaCorrectedValue201 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++
++            DW807.Value = 0;
++            DW807.ForwardPixelValue201 = FORWARD_PIXEL_VALUE_201_UNNAMED51456;
++            DW807.ForwardRChGammaCorrectedValue201 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_201_UNNAMED51456;
++
++            DW808.Value = 0;
++            DW808.InverseGChGammaCorrectedValue202 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++            DW808.InverseBChGammaCorrectedValue202 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++
++            DW809.Value = 0;
++            DW809.InversePixelValue202 = INVERSE_PIXEL_VALUE_202_UNNAMED51712;
++            DW809.InverseRChGammaCorrectedValue202 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++
++            DW810.Value = 0;
++            DW810.ForwardGChGammaCorrectedValue202 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++            DW810.ForwardBChGammaCorrectedValue202 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++
++            DW811.Value = 0;
++            DW811.ForwardPixelValue202 = FORWARD_PIXEL_VALUE_202_UNNAMED51712;
++            DW811.ForwardRChGammaCorrectedValue202 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_202_UNNAMED51712;
++
++            DW812.Value = 0;
++            DW812.InverseGChGammaCorrectedValue203 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++            DW812.InverseBChGammaCorrectedValue203 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++
++            DW813.Value = 0;
++            DW813.InversePixelValue203 = INVERSE_PIXEL_VALUE_203_UNNAMED51968;
++            DW813.InverseRChGammaCorrectedValue203 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++
++            DW814.Value = 0;
++            DW814.ForwardGChGammaCorrectedValue203 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++            DW814.ForwardBChGammaCorrectedValue203 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++
++            DW815.Value = 0;
++            DW815.ForwardPixelValue203 = FORWARD_PIXEL_VALUE_203_UNNAMED51968;
++            DW815.ForwardRChGammaCorrectedValue203 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_203_UNNAMED51968;
++
++            DW816.Value = 0;
++            DW816.InverseGChGammaCorrectedValue204 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++            DW816.InverseBChGammaCorrectedValue204 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++
++            DW817.Value = 0;
++            DW817.InversePixelValue204 = INVERSE_PIXEL_VALUE_204_UNNAMED52224;
++            DW817.InverseRChGammaCorrectedValue204 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++
++            DW818.Value = 0;
++            DW818.ForwardGChGammaCorrectedValue204 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++            DW818.ForwardBChGammaCorrectedValue204 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++
++            DW819.Value = 0;
++            DW819.ForwardPixelValue204 = FORWARD_PIXEL_VALUE_204_UNNAMED52224;
++            DW819.ForwardRChGammaCorrectedValue204 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_204_UNNAMED52224;
++
++            DW820.Value = 0;
++            DW820.InverseGChGammaCorrectedValue205 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++            DW820.InverseBChGammaCorrectedValue205 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++
++            DW821.Value = 0;
++            DW821.InversePixelValue205 = INVERSE_PIXEL_VALUE_205_UNNAMED52480;
++            DW821.InverseRChGammaCorrectedValue205 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++
++            DW822.Value = 0;
++            DW822.ForwardGChGammaCorrectedValue205 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++            DW822.ForwardBChGammaCorrectedValue205 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++
++            DW823.Value = 0;
++            DW823.ForwardPixelValue205 = FORWARD_PIXEL_VALUE_205_UNNAMED52480;
++            DW823.ForwardRChGammaCorrectedValue205 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_205_UNNAMED52480;
++
++            DW824.Value = 0;
++            DW824.InverseGChGammaCorrectedValue206 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++            DW824.InverseBChGammaCorrectedValue206 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++
++            DW825.Value = 0;
++            DW825.InversePixelValue206 = INVERSE_PIXEL_VALUE_206_UNNAMED52736;
++            DW825.InverseRChGammaCorrectedValue206 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++
++            DW826.Value = 0;
++            DW826.ForwardGChGammaCorrectedValue206 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++            DW826.ForwardBChGammaCorrectedValue206 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++
++            DW827.Value = 0;
++            DW827.ForwardPixelValue206 = FORWARD_PIXEL_VALUE_206_UNNAMED52736;
++            DW827.ForwardRChGammaCorrectedValue206 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_206_UNNAMED52736;
++
++            DW828.Value = 0;
++            DW828.InverseGChGammaCorrectedValue207 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++            DW828.InverseBChGammaCorrectedValue207 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++
++            DW829.Value = 0;
++            DW829.InversePixelValue207 = INVERSE_PIXEL_VALUE_207_UNNAMED52992;
++            DW829.InverseRChGammaCorrectedValue207 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++
++            DW830.Value = 0;
++            DW830.ForwardGChGammaCorrectedValue207 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++            DW830.ForwardBChGammaCorrectedValue207 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++
++            DW831.Value = 0;
++            DW831.ForwardPixelValue207 = FORWARD_PIXEL_VALUE_207_UNNAMED52992;
++            DW831.ForwardRChGammaCorrectedValue207 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_207_UNNAMED52992;
++
++            DW832.Value = 0;
++            DW832.InverseGChGammaCorrectedValue208 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++            DW832.InverseBChGammaCorrectedValue208 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++
++            DW833.Value = 0;
++            DW833.InversePixelValue208 = INVERSE_PIXEL_VALUE_208_UNNAMED53248;
++            DW833.InverseRChGammaCorrectedValue208 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++
++            DW834.Value = 0;
++            DW834.ForwardGChGammaCorrectedValue208 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++            DW834.ForwardBChGammaCorrectedValue208 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++
++            DW835.Value = 0;
++            DW835.ForwardPixelValue208 = FORWARD_PIXEL_VALUE_208_UNNAMED53248;
++            DW835.ForwardRChGammaCorrectedValue208 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_208_UNNAMED53248;
++
++            DW836.Value = 0;
++            DW836.InverseGChGammaCorrectedValue209 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++            DW836.InverseBChGammaCorrectedValue209 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++
++            DW837.Value = 0;
++            DW837.InversePixelValue209 = INVERSE_PIXEL_VALUE_209_UNNAMED53504;
++            DW837.InverseRChGammaCorrectedValue209 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++
++            DW838.Value = 0;
++            DW838.ForwardGChGammaCorrectedValue209 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++            DW838.ForwardBChGammaCorrectedValue209 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++
++            DW839.Value = 0;
++            DW839.ForwardPixelValue209 = FORWARD_PIXEL_VALUE_209_UNNAMED53504;
++            DW839.ForwardRChGammaCorrectedValue209 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_209_UNNAMED53504;
++
++            DW840.Value = 0;
++            DW840.InverseGChGammaCorrectedValue210 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++            DW840.InverseBChGammaCorrectedValue210 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++
++            DW841.Value = 0;
++            DW841.InversePixelValue210 = INVERSE_PIXEL_VALUE_210_UNNAMED53760;
++            DW841.InverseRChGammaCorrectedValue210 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++
++            DW842.Value = 0;
++            DW842.ForwardGChGammaCorrectedValue210 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++            DW842.ForwardBChGammaCorrectedValue210 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++
++            DW843.Value = 0;
++            DW843.ForwardPixelValue210 = FORWARD_PIXEL_VALUE_210_UNNAMED53760;
++            DW843.ForwardRChGammaCorrectedValue210 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_210_UNNAMED53760;
++
++            DW844.Value = 0;
++            DW844.InverseGChGammaCorrectedValue211 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++            DW844.InverseBChGammaCorrectedValue211 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++
++            DW845.Value = 0;
++            DW845.InversePixelValue211 = INVERSE_PIXEL_VALUE_211_UNNAMED54016;
++            DW845.InverseRChGammaCorrectedValue211 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++
++            DW846.Value = 0;
++            DW846.ForwardGChGammaCorrectedValue211 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++            DW846.ForwardBChGammaCorrectedValue211 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++
++            DW847.Value = 0;
++            DW847.ForwardPixelValue211 = FORWARD_PIXEL_VALUE_211_UNNAMED54016;
++            DW847.ForwardRChGammaCorrectedValue211 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_211_UNNAMED54016;
++
++            DW848.Value = 0;
++            DW848.InverseGChGammaCorrectedValue212 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++            DW848.InverseBChGammaCorrectedValue212 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++
++            DW849.Value = 0;
++            DW849.InversePixelValue212 = INVERSE_PIXEL_VALUE_212_UNNAMED54272;
++            DW849.InverseRChGammaCorrectedValue212 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++
++            DW850.Value = 0;
++            DW850.ForwardGChGammaCorrectedValue212 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++            DW850.ForwardBChGammaCorrectedValue212 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++
++            DW851.Value = 0;
++            DW851.ForwardPixelValue212 = FORWARD_PIXEL_VALUE_212_UNNAMED54272;
++            DW851.ForwardRChGammaCorrectedValue212 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_212_UNNAMED54272;
++
++            DW852.Value = 0;
++            DW852.InverseGChGammaCorrectedValue213 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++            DW852.InverseBChGammaCorrectedValue213 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++
++            DW853.Value = 0;
++            DW853.InversePixelValue213 = INVERSE_PIXEL_VALUE_213_UNNAMED54528;
++            DW853.InverseRChGammaCorrectedValue213 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++
++            DW854.Value = 0;
++            DW854.ForwardGChGammaCorrectedValue213 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++            DW854.ForwardBChGammaCorrectedValue213 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++
++            DW855.Value = 0;
++            DW855.ForwardPixelValue213 = FORWARD_PIXEL_VALUE_213_UNNAMED54528;
++            DW855.ForwardRChGammaCorrectedValue213 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_213_UNNAMED54528;
++
++            DW856.Value = 0;
++            DW856.InverseGChGammaCorrectedValue214 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++            DW856.InverseBChGammaCorrectedValue214 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++
++            DW857.Value = 0;
++            DW857.InversePixelValue214 = INVERSE_PIXEL_VALUE_214_UNNAMED54784;
++            DW857.InverseRChGammaCorrectedValue214 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++
++            DW858.Value = 0;
++            DW858.ForwardGChGammaCorrectedValue214 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++            DW858.ForwardBChGammaCorrectedValue214 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++
++            DW859.Value = 0;
++            DW859.ForwardPixelValue214 = FORWARD_PIXEL_VALUE_214_UNNAMED54784;
++            DW859.ForwardRChGammaCorrectedValue214 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_214_UNNAMED54784;
++
++            DW860.Value = 0;
++            DW860.InverseGChGammaCorrectedValue215 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++            DW860.InverseBChGammaCorrectedValue215 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++
++            DW861.Value = 0;
++            DW861.InversePixelValue215 = INVERSE_PIXEL_VALUE_215_UNNAMED55040;
++            DW861.InverseRChGammaCorrectedValue215 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++
++            DW862.Value = 0;
++            DW862.ForwardGChGammaCorrectedValue215 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++            DW862.ForwardBChGammaCorrectedValue215 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++
++            DW863.Value = 0;
++            DW863.ForwardPixelValue215 = FORWARD_PIXEL_VALUE_215_UNNAMED55040;
++            DW863.ForwardRChGammaCorrectedValue215 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_215_UNNAMED55040;
++
++            DW864.Value = 0;
++            DW864.InverseGChGammaCorrectedValue216 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++            DW864.InverseBChGammaCorrectedValue216 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++
++            DW865.Value = 0;
++            DW865.InversePixelValue216 = INVERSE_PIXEL_VALUE_216_UNNAMED55296;
++            DW865.InverseRChGammaCorrectedValue216 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++
++            DW866.Value = 0;
++            DW866.ForwardGChGammaCorrectedValue216 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++            DW866.ForwardBChGammaCorrectedValue216 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++
++            DW867.Value = 0;
++            DW867.ForwardPixelValue216 = FORWARD_PIXEL_VALUE_216_UNNAMED55296;
++            DW867.ForwardRChGammaCorrectedValue216 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_216_UNNAMED55296;
++
++            DW868.Value = 0;
++            DW868.InverseGChGammaCorrectedValue217 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++            DW868.InverseBChGammaCorrectedValue217 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++
++            DW869.Value = 0;
++            DW869.InversePixelValue217 = INVERSE_PIXEL_VALUE_217_UNNAMED55552;
++            DW869.InverseRChGammaCorrectedValue217 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++
++            DW870.Value = 0;
++            DW870.ForwardGChGammaCorrectedValue217 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++            DW870.ForwardBChGammaCorrectedValue217 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++
++            DW871.Value = 0;
++            DW871.ForwardPixelValue217 = FORWARD_PIXEL_VALUE_217_UNNAMED55552;
++            DW871.ForwardRChGammaCorrectedValue217 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_217_UNNAMED55552;
++
++            DW872.Value = 0;
++            DW872.InverseGChGammaCorrectedValue218 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++            DW872.InverseBChGammaCorrectedValue218 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++
++            DW873.Value = 0;
++            DW873.InversePixelValue218 = INVERSE_PIXEL_VALUE_218_UNNAMED55808;
++            DW873.InverseRChGammaCorrectedValue218 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++
++            DW874.Value = 0;
++            DW874.ForwardGChGammaCorrectedValue218 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++            DW874.ForwardBChGammaCorrectedValue218 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++
++            DW875.Value = 0;
++            DW875.ForwardPixelValue218 = FORWARD_PIXEL_VALUE_218_UNNAMED55808;
++            DW875.ForwardRChGammaCorrectedValue218 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_218_UNNAMED55808;
++
++            DW876.Value = 0;
++            DW876.InverseGChGammaCorrectedValue219 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++            DW876.InverseBChGammaCorrectedValue219 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++
++            DW877.Value = 0;
++            DW877.InversePixelValue219 = INVERSE_PIXEL_VALUE_219_UNNAMED56064;
++            DW877.InverseRChGammaCorrectedValue219 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++
++            DW878.Value = 0;
++            DW878.ForwardGChGammaCorrectedValue219 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++            DW878.ForwardBChGammaCorrectedValue219 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++
++            DW879.Value = 0;
++            DW879.ForwardPixelValue219 = FORWARD_PIXEL_VALUE_219_UNNAMED56064;
++            DW879.ForwardRChGammaCorrectedValue219 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_219_UNNAMED56064;
++
++            DW880.Value = 0;
++            DW880.InverseGChGammaCorrectedValue220 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++            DW880.InverseBChGammaCorrectedValue220 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++
++            DW881.Value = 0;
++            DW881.InversePixelValue220 = INVERSE_PIXEL_VALUE_220_UNNAMED56320;
++            DW881.InverseRChGammaCorrectedValue220 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++
++            DW882.Value = 0;
++            DW882.ForwardGChGammaCorrectedValue220 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++            DW882.ForwardBChGammaCorrectedValue220 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++
++            DW883.Value = 0;
++            DW883.ForwardPixelValue220 = FORWARD_PIXEL_VALUE_220_UNNAMED56320;
++            DW883.ForwardRChGammaCorrectedValue220 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_220_UNNAMED56320;
++
++            DW884.Value = 0;
++            DW884.InverseGChGammaCorrectedValue221 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++            DW884.InverseBChGammaCorrectedValue221 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++
++            DW885.Value = 0;
++            DW885.InversePixelValue221 = INVERSE_PIXEL_VALUE_221_UNNAMED56576;
++            DW885.InverseRChGammaCorrectedValue221 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++
++            DW886.Value = 0;
++            DW886.ForwardGChGammaCorrectedValue221 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++            DW886.ForwardBChGammaCorrectedValue221 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++
++            DW887.Value = 0;
++            DW887.ForwardPixelValue221 = FORWARD_PIXEL_VALUE_221_UNNAMED56576;
++            DW887.ForwardRChGammaCorrectedValue221 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_221_UNNAMED56576;
++
++            DW888.Value = 0;
++            DW888.InverseGChGammaCorrectedValue222 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++            DW888.InverseBChGammaCorrectedValue222 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++
++            DW889.Value = 0;
++            DW889.InversePixelValue222 = INVERSE_PIXEL_VALUE_222_UNNAMED56832;
++            DW889.InverseRChGammaCorrectedValue222 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++
++            DW890.Value = 0;
++            DW890.ForwardGChGammaCorrectedValue222 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++            DW890.ForwardBChGammaCorrectedValue222 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++
++            DW891.Value = 0;
++            DW891.ForwardPixelValue222 = FORWARD_PIXEL_VALUE_222_UNNAMED56832;
++            DW891.ForwardRChGammaCorrectedValue222 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_222_UNNAMED56832;
++
++            DW892.Value = 0;
++            DW892.InverseGChGammaCorrectedValue223 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++            DW892.InverseBChGammaCorrectedValue223 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++
++            DW893.Value = 0;
++            DW893.InversePixelValue223 = INVERSE_PIXEL_VALUE_223_UNNAMED57088;
++            DW893.InverseRChGammaCorrectedValue223 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++
++            DW894.Value = 0;
++            DW894.ForwardGChGammaCorrectedValue223 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++            DW894.ForwardBChGammaCorrectedValue223 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++
++            DW895.Value = 0;
++            DW895.ForwardPixelValue223 = FORWARD_PIXEL_VALUE_223_UNNAMED57088;
++            DW895.ForwardRChGammaCorrectedValue223 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_223_UNNAMED57088;
++
++            DW896.Value = 0;
++            DW896.InverseGChGammaCorrectedValue224 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++            DW896.InverseBChGammaCorrectedValue224 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++
++            DW897.Value = 0;
++            DW897.InversePixelValue224 = INVERSE_PIXEL_VALUE_224_UNNAMED57344;
++            DW897.InverseRChGammaCorrectedValue224 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++
++            DW898.Value = 0;
++            DW898.ForwardGChGammaCorrectedValue224 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++            DW898.ForwardBChGammaCorrectedValue224 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++
++            DW899.Value = 0;
++            DW899.ForwardPixelValue224 = FORWARD_PIXEL_VALUE_224_UNNAMED57344;
++            DW899.ForwardRChGammaCorrectedValue224 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_224_UNNAMED57344;
++
++            DW900.Value = 0;
++            DW900.InverseGChGammaCorrectedValue225 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++            DW900.InverseBChGammaCorrectedValue225 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++
++            DW901.Value = 0;
++            DW901.InversePixelValue225 = INVERSE_PIXEL_VALUE_225_UNNAMED57600;
++            DW901.InverseRChGammaCorrectedValue225 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++
++            DW902.Value = 0;
++            DW902.ForwardGChGammaCorrectedValue225 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++            DW902.ForwardBChGammaCorrectedValue225 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++
++            DW903.Value = 0;
++            DW903.ForwardPixelValue225 = FORWARD_PIXEL_VALUE_225_UNNAMED57600;
++            DW903.ForwardRChGammaCorrectedValue225 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_225_UNNAMED57600;
++
++            DW904.Value = 0;
++            DW904.InverseGChGammaCorrectedValue226 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++            DW904.InverseBChGammaCorrectedValue226 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++
++            DW905.Value = 0;
++            DW905.InversePixelValue226 = INVERSE_PIXEL_VALUE_226_UNNAMED57856;
++            DW905.InverseRChGammaCorrectedValue226 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++
++            DW906.Value = 0;
++            DW906.ForwardGChGammaCorrectedValue226 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++            DW906.ForwardBChGammaCorrectedValue226 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++
++            DW907.Value = 0;
++            DW907.ForwardPixelValue226 = FORWARD_PIXEL_VALUE_226_UNNAMED57856;
++            DW907.ForwardRChGammaCorrectedValue226 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_226_UNNAMED57856;
++
++            DW908.Value = 0;
++            DW908.InverseGChGammaCorrectedValue227 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++            DW908.InverseBChGammaCorrectedValue227 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++
++            DW909.Value = 0;
++            DW909.InversePixelValue227 = INVERSE_PIXEL_VALUE_227_UNNAMED58112;
++            DW909.InverseRChGammaCorrectedValue227 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++
++            DW910.Value = 0;
++            DW910.ForwardGChGammaCorrectedValue227 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++            DW910.ForwardBChGammaCorrectedValue227 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++
++            DW911.Value = 0;
++            DW911.ForwardPixelValue227 = FORWARD_PIXEL_VALUE_227_UNNAMED58112;
++            DW911.ForwardRChGammaCorrectedValue227 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_227_UNNAMED58112;
++
++            DW912.Value = 0;
++            DW912.InverseGChGammaCorrectedValue228 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++            DW912.InverseBChGammaCorrectedValue228 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++
++            DW913.Value = 0;
++            DW913.InversePixelValue228 = INVERSE_PIXEL_VALUE_228_UNNAMED58368;
++            DW913.InverseRChGammaCorrectedValue228 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++
++            DW914.Value = 0;
++            DW914.ForwardGChGammaCorrectedValue228 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++            DW914.ForwardBChGammaCorrectedValue228 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++
++            DW915.Value = 0;
++            DW915.ForwardPixelValue228 = FORWARD_PIXEL_VALUE_228_UNNAMED58368;
++            DW915.ForwardRChGammaCorrectedValue228 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_228_UNNAMED58368;
++
++            DW916.Value = 0;
++            DW916.InverseGChGammaCorrectedValue229 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++            DW916.InverseBChGammaCorrectedValue229 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++
++            DW917.Value = 0;
++            DW917.InversePixelValue229 = INVERSE_PIXEL_VALUE_229_UNNAMED58624;
++            DW917.InverseRChGammaCorrectedValue229 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++
++            DW918.Value = 0;
++            DW918.ForwardGChGammaCorrectedValue229 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++            DW918.ForwardBChGammaCorrectedValue229 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++
++            DW919.Value = 0;
++            DW919.ForwardPixelValue229 = FORWARD_PIXEL_VALUE_229_UNNAMED58624;
++            DW919.ForwardRChGammaCorrectedValue229 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_229_UNNAMED58624;
++
++            DW920.Value = 0;
++            DW920.InverseGChGammaCorrectedValue230 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++            DW920.InverseBChGammaCorrectedValue230 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++
++            DW921.Value = 0;
++            DW921.InversePixelValue230 = INVERSE_PIXEL_VALUE_230_UNNAMED58880;
++            DW921.InverseRChGammaCorrectedValue230 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++
++            DW922.Value = 0;
++            DW922.ForwardGChGammaCorrectedValue230 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++            DW922.ForwardBChGammaCorrectedValue230 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++
++            DW923.Value = 0;
++            DW923.ForwardPixelValue230 = FORWARD_PIXEL_VALUE_230_UNNAMED58880;
++            DW923.ForwardRChGammaCorrectedValue230 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_230_UNNAMED58880;
++
++            DW924.Value = 0;
++            DW924.InverseGChGammaCorrectedValue231 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++            DW924.InverseBChGammaCorrectedValue231 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++
++            DW925.Value = 0;
++            DW925.InversePixelValue231 = INVERSE_PIXEL_VALUE_231_UNNAMED59136;
++            DW925.InverseRChGammaCorrectedValue231 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++
++            DW926.Value = 0;
++            DW926.ForwardGChGammaCorrectedValue231 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++            DW926.ForwardBChGammaCorrectedValue231 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++
++            DW927.Value = 0;
++            DW927.ForwardPixelValue231 = FORWARD_PIXEL_VALUE_231_UNNAMED59136;
++            DW927.ForwardRChGammaCorrectedValue231 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_231_UNNAMED59136;
++
++            DW928.Value = 0;
++            DW928.InverseGChGammaCorrectedValue232 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++            DW928.InverseBChGammaCorrectedValue232 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++
++            DW929.Value = 0;
++            DW929.InversePixelValue232 = INVERSE_PIXEL_VALUE_232_UNNAMED59392;
++            DW929.InverseRChGammaCorrectedValue232 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++
++            DW930.Value = 0;
++            DW930.ForwardGChGammaCorrectedValue232 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++            DW930.ForwardBChGammaCorrectedValue232 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++
++            DW931.Value = 0;
++            DW931.ForwardPixelValue232 = FORWARD_PIXEL_VALUE_232_UNNAMED59392;
++            DW931.ForwardRChGammaCorrectedValue232 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_232_UNNAMED59392;
++
++            DW932.Value = 0;
++            DW932.InverseGChGammaCorrectedValue233 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++            DW932.InverseBChGammaCorrectedValue233 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++
++            DW933.Value = 0;
++            DW933.InversePixelValue233 = INVERSE_PIXEL_VALUE_233_UNNAMED59648;
++            DW933.InverseRChGammaCorrectedValue233 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++
++            DW934.Value = 0;
++            DW934.ForwardGChGammaCorrectedValue233 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++            DW934.ForwardBChGammaCorrectedValue233 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++
++            DW935.Value = 0;
++            DW935.ForwardPixelValue233 = FORWARD_PIXEL_VALUE_233_UNNAMED59648;
++            DW935.ForwardRChGammaCorrectedValue233 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_233_UNNAMED59648;
++
++            DW936.Value = 0;
++            DW936.InverseGChGammaCorrectedValue234 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++            DW936.InverseBChGammaCorrectedValue234 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++
++            DW937.Value = 0;
++            DW937.InversePixelValue234 = INVERSE_PIXEL_VALUE_234_UNNAMED59904;
++            DW937.InverseRChGammaCorrectedValue234 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++
++            DW938.Value = 0;
++            DW938.ForwardGChGammaCorrectedValue234 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++            DW938.ForwardBChGammaCorrectedValue234 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++
++            DW939.Value = 0;
++            DW939.ForwardPixelValue234 = FORWARD_PIXEL_VALUE_234_UNNAMED59904;
++            DW939.ForwardRChGammaCorrectedValue234 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_234_UNNAMED59904;
++
++            DW940.Value = 0;
++            DW940.InverseGChGammaCorrectedValue235 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++            DW940.InverseBChGammaCorrectedValue235 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++
++            DW941.Value = 0;
++            DW941.InversePixelValue235 = INVERSE_PIXEL_VALUE_235_UNNAMED60160;
++            DW941.InverseRChGammaCorrectedValue235 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++
++            DW942.Value = 0;
++            DW942.ForwardGChGammaCorrectedValue235 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++            DW942.ForwardBChGammaCorrectedValue235 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++
++            DW943.Value = 0;
++            DW943.ForwardPixelValue235 = FORWARD_PIXEL_VALUE_235_UNNAMED60160;
++            DW943.ForwardRChGammaCorrectedValue235 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_235_UNNAMED60160;
++
++            DW944.Value = 0;
++            DW944.InverseGChGammaCorrectedValue236 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++            DW944.InverseBChGammaCorrectedValue236 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++
++            DW945.Value = 0;
++            DW945.InversePixelValue236 = INVERSE_PIXEL_VALUE_236_UNNAMED60416;
++            DW945.InverseRChGammaCorrectedValue236 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++
++            DW946.Value = 0;
++            DW946.ForwardGChGammaCorrectedValue236 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++            DW946.ForwardBChGammaCorrectedValue236 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++
++            DW947.Value = 0;
++            DW947.ForwardPixelValue236 = FORWARD_PIXEL_VALUE_236_UNNAMED60416;
++            DW947.ForwardRChGammaCorrectedValue236 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_236_UNNAMED60416;
++
++            DW948.Value = 0;
++            DW948.InverseGChGammaCorrectedValue237 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++            DW948.InverseBChGammaCorrectedValue237 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++
++            DW949.Value = 0;
++            DW949.InversePixelValue237 = INVERSE_PIXEL_VALUE_237_UNNAMED60672;
++            DW949.InverseRChGammaCorrectedValue237 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++
++            DW950.Value = 0;
++            DW950.ForwardGChGammaCorrectedValue237 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++            DW950.ForwardBChGammaCorrectedValue237 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++
++            DW951.Value = 0;
++            DW951.ForwardPixelValue237 = FORWARD_PIXEL_VALUE_237_UNNAMED60672;
++            DW951.ForwardRChGammaCorrectedValue237 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_237_UNNAMED60672;
++
++            DW952.Value = 0;
++            DW952.InverseGChGammaCorrectedValue238 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++            DW952.InverseBChGammaCorrectedValue238 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++
++            DW953.Value = 0;
++            DW953.InversePixelValue238 = INVERSE_PIXEL_VALUE_238_UNNAMED60928;
++            DW953.InverseRChGammaCorrectedValue238 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++
++            DW954.Value = 0;
++            DW954.ForwardGChGammaCorrectedValue238 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++            DW954.ForwardBChGammaCorrectedValue238 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++
++            DW955.Value = 0;
++            DW955.ForwardPixelValue238 = FORWARD_PIXEL_VALUE_238_UNNAMED60928;
++            DW955.ForwardRChGammaCorrectedValue238 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_238_UNNAMED60928;
++
++            DW956.Value = 0;
++            DW956.InverseGChGammaCorrectedValue239 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++            DW956.InverseBChGammaCorrectedValue239 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++
++            DW957.Value = 0;
++            DW957.InversePixelValue239 = INVERSE_PIXEL_VALUE_239_UNNAMED61184;
++            DW957.InverseRChGammaCorrectedValue239 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++
++            DW958.Value = 0;
++            DW958.ForwardGChGammaCorrectedValue239 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++            DW958.ForwardBChGammaCorrectedValue239 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++
++            DW959.Value = 0;
++            DW959.ForwardPixelValue239 = FORWARD_PIXEL_VALUE_239_UNNAMED61184;
++            DW959.ForwardRChGammaCorrectedValue239 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_239_UNNAMED61184;
++
++            DW960.Value = 0;
++            DW960.InverseGChGammaCorrectedValue240 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++            DW960.InverseBChGammaCorrectedValue240 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++
++            DW961.Value = 0;
++            DW961.InversePixelValue240 = INVERSE_PIXEL_VALUE_240_UNNAMED61440;
++            DW961.InverseRChGammaCorrectedValue240 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++
++            DW962.Value = 0;
++            DW962.ForwardGChGammaCorrectedValue240 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++            DW962.ForwardBChGammaCorrectedValue240 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++
++            DW963.Value = 0;
++            DW963.ForwardPixelValue240 = FORWARD_PIXEL_VALUE_240_UNNAMED61440;
++            DW963.ForwardRChGammaCorrectedValue240 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_240_UNNAMED61440;
++
++            DW964.Value = 0;
++            DW964.InverseGChGammaCorrectedValue241 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++            DW964.InverseBChGammaCorrectedValue241 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++
++            DW965.Value = 0;
++            DW965.InversePixelValue241 = INVERSE_PIXEL_VALUE_241_UNNAMED61696;
++            DW965.InverseRChGammaCorrectedValue241 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++
++            DW966.Value = 0;
++            DW966.ForwardGChGammaCorrectedValue241 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++            DW966.ForwardBChGammaCorrectedValue241 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++
++            DW967.Value = 0;
++            DW967.ForwardPixelValue241 = FORWARD_PIXEL_VALUE_241_UNNAMED61696;
++            DW967.ForwardRChGammaCorrectedValue241 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_241_UNNAMED61696;
++
++            DW968.Value = 0;
++            DW968.InverseGChGammaCorrectedValue242 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++            DW968.InverseBChGammaCorrectedValue242 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++
++            DW969.Value = 0;
++            DW969.InversePixelValue242 = INVERSE_PIXEL_VALUE_242_UNNAMED61952;
++            DW969.InverseRChGammaCorrectedValue242 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++
++            DW970.Value = 0;
++            DW970.ForwardGChGammaCorrectedValue242 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++            DW970.ForwardBChGammaCorrectedValue242 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++
++            DW971.Value = 0;
++            DW971.ForwardPixelValue242 = FORWARD_PIXEL_VALUE_242_UNNAMED61952;
++            DW971.ForwardRChGammaCorrectedValue242 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_242_UNNAMED61952;
++
++            DW972.Value = 0;
++            DW972.InverseGChGammaCorrectedValue243 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++            DW972.InverseBChGammaCorrectedValue243 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++
++            DW973.Value = 0;
++            DW973.InversePixelValue243 = INVERSE_PIXEL_VALUE_243_UNNAMED62208;
++            DW973.InverseRChGammaCorrectedValue243 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++
++            DW974.Value = 0;
++            DW974.ForwardGChGammaCorrectedValue243 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++            DW974.ForwardBChGammaCorrectedValue243 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++
++            DW975.Value = 0;
++            DW975.ForwardPixelValue243 = FORWARD_PIXEL_VALUE_243_UNNAMED62208;
++            DW975.ForwardRChGammaCorrectedValue243 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_243_UNNAMED62208;
++
++            DW976.Value = 0;
++            DW976.InverseGChGammaCorrectedValue244 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++            DW976.InverseBChGammaCorrectedValue244 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++
++            DW977.Value = 0;
++            DW977.InversePixelValue244 = INVERSE_PIXEL_VALUE_244_UNNAMED62464;
++            DW977.InverseRChGammaCorrectedValue244 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++
++            DW978.Value = 0;
++            DW978.ForwardGChGammaCorrectedValue244 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++            DW978.ForwardBChGammaCorrectedValue244 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++
++            DW979.Value = 0;
++            DW979.ForwardPixelValue244 = FORWARD_PIXEL_VALUE_244_UNNAMED62464;
++            DW979.ForwardRChGammaCorrectedValue244 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_244_UNNAMED62464;
++
++            DW980.Value = 0;
++            DW980.InverseGChGammaCorrectedValue245 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++            DW980.InverseBChGammaCorrectedValue245 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++
++            DW981.Value = 0;
++            DW981.InversePixelValue245 = INVERSE_PIXEL_VALUE_245_UNNAMED62720;
++            DW981.InverseRChGammaCorrectedValue245 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++
++            DW982.Value = 0;
++            DW982.ForwardGChGammaCorrectedValue245 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++            DW982.ForwardBChGammaCorrectedValue245 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++
++            DW983.Value = 0;
++            DW983.ForwardPixelValue245 = FORWARD_PIXEL_VALUE_245_UNNAMED62720;
++            DW983.ForwardRChGammaCorrectedValue245 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_245_UNNAMED62720;
++
++            DW984.Value = 0;
++            DW984.InverseGChGammaCorrectedValue246 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++            DW984.InverseBChGammaCorrectedValue246 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++
++            DW985.Value = 0;
++            DW985.InversePixelValue246 = INVERSE_PIXEL_VALUE_246_UNNAMED62976;
++            DW985.InverseRChGammaCorrectedValue246 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++
++            DW986.Value = 0;
++            DW986.ForwardGChGammaCorrectedValue246 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++            DW986.ForwardBChGammaCorrectedValue246 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++
++            DW987.Value = 0;
++            DW987.ForwardPixelValue246 = FORWARD_PIXEL_VALUE_246_UNNAMED62976;
++            DW987.ForwardRChGammaCorrectedValue246 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_246_UNNAMED62976;
++
++            DW988.Value = 0;
++            DW988.InverseGChGammaCorrectedValue247 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++            DW988.InverseBChGammaCorrectedValue247 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++
++            DW989.Value = 0;
++            DW989.InversePixelValue247 = INVERSE_PIXEL_VALUE_247_UNNAMED63232;
++            DW989.InverseRChGammaCorrectedValue247 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++
++            DW990.Value = 0;
++            DW990.ForwardGChGammaCorrectedValue247 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++            DW990.ForwardBChGammaCorrectedValue247 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++
++            DW991.Value = 0;
++            DW991.ForwardPixelValue247 = FORWARD_PIXEL_VALUE_247_UNNAMED63232;
++            DW991.ForwardRChGammaCorrectedValue247 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_247_UNNAMED63232;
++
++            DW992.Value = 0;
++            DW992.InverseGChGammaCorrectedValue248 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++            DW992.InverseBChGammaCorrectedValue248 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++
++            DW993.Value = 0;
++            DW993.InversePixelValue248 = INVERSE_PIXEL_VALUE_248_UNNAMED63488;
++            DW993.InverseRChGammaCorrectedValue248 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++
++            DW994.Value = 0;
++            DW994.ForwardGChGammaCorrectedValue248 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++            DW994.ForwardBChGammaCorrectedValue248 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++
++            DW995.Value = 0;
++            DW995.ForwardPixelValue248 = FORWARD_PIXEL_VALUE_248_UNNAMED63488;
++            DW995.ForwardRChGammaCorrectedValue248 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_248_UNNAMED63488;
++
++            DW996.Value = 0;
++            DW996.InverseGChGammaCorrectedValue249 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++            DW996.InverseBChGammaCorrectedValue249 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++
++            DW997.Value = 0;
++            DW997.InversePixelValue249 = INVERSE_PIXEL_VALUE_249_UNNAMED63744;
++            DW997.InverseRChGammaCorrectedValue249 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++
++            DW998.Value = 0;
++            DW998.ForwardGChGammaCorrectedValue249 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++            DW998.ForwardBChGammaCorrectedValue249 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++
++            DW999.Value = 0;
++            DW999.ForwardPixelValue249 = FORWARD_PIXEL_VALUE_249_UNNAMED63744;
++            DW999.ForwardRChGammaCorrectedValue249 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_249_UNNAMED63744;
++
++            DW1000.Value = 0;
++            DW1000.InverseGChGammaCorrectedValue250 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++            DW1000.InverseBChGammaCorrectedValue250 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++
++            DW1001.Value = 0;
++            DW1001.InversePixelValue250 = INVERSE_PIXEL_VALUE_250_UNNAMED64000;
++            DW1001.InverseRChGammaCorrectedValue250 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++
++            DW1002.Value = 0;
++            DW1002.ForwardGChGammaCorrectedValue250 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++            DW1002.ForwardBChGammaCorrectedValue250 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++
++            DW1003.Value = 0;
++            DW1003.ForwardPixelValue250 = FORWARD_PIXEL_VALUE_250_UNNAMED64000;
++            DW1003.ForwardRChGammaCorrectedValue250 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_250_UNNAMED64000;
++
++            DW1004.Value = 0;
++            DW1004.InverseGChGammaCorrectedValue251 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++            DW1004.InverseBChGammaCorrectedValue251 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++
++            DW1005.Value = 0;
++            DW1005.InversePixelValue251 = INVERSE_PIXEL_VALUE_251_UNNAMED64256;
++            DW1005.InverseRChGammaCorrectedValue251 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++
++            DW1006.Value = 0;
++            DW1006.ForwardGChGammaCorrectedValue251 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++            DW1006.ForwardBChGammaCorrectedValue251 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++
++            DW1007.Value = 0;
++            DW1007.ForwardPixelValue251 = FORWARD_PIXEL_VALUE_251_UNNAMED64256;
++            DW1007.ForwardRChGammaCorrectedValue251 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_251_UNNAMED64256;
++
++            DW1008.Value = 0;
++            DW1008.InverseGChGammaCorrectedValue252 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++            DW1008.InverseBChGammaCorrectedValue252 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++
++            DW1009.Value = 0;
++            DW1009.InversePixelValue252 = INVERSE_PIXEL_VALUE_252_UNNAMED64512;
++            DW1009.InverseRChGammaCorrectedValue252 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++
++            DW1010.Value = 0;
++            DW1010.ForwardGChGammaCorrectedValue252 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++            DW1010.ForwardBChGammaCorrectedValue252 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++
++            DW1011.Value = 0;
++            DW1011.ForwardPixelValue252 = FORWARD_PIXEL_VALUE_252_UNNAMED64512;
++            DW1011.ForwardRChGammaCorrectedValue252 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_252_UNNAMED64512;
++
++            DW1012.Value = 0;
++            DW1012.InverseGChGammaCorrectedValue253 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++            DW1012.InverseBChGammaCorrectedValue253 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++
++            DW1013.Value = 0;
++            DW1013.InversePixelValue253 = INVERSE_PIXEL_VALUE_253_UNNAMED64768;
++            DW1013.InverseRChGammaCorrectedValue253 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++
++            DW1014.Value = 0;
++            DW1014.ForwardGChGammaCorrectedValue253 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++            DW1014.ForwardBChGammaCorrectedValue253 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++
++            DW1015.Value = 0;
++            DW1015.ForwardPixelValue253 = FORWARD_PIXEL_VALUE_253_UNNAMED64768;
++            DW1015.ForwardRChGammaCorrectedValue253 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_253_UNNAMED64768;
++
++            DW1016.Value = 0;
++            DW1016.InverseGChGammaCorrectedValue254 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++            DW1016.InverseBChGammaCorrectedValue254 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++
++            DW1017.Value = 0;
++            DW1017.InversePixelValue254 = INVERSE_PIXEL_VALUE_254_UNNAMED65024;
++            DW1017.InverseRChGammaCorrectedValue254 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++
++            DW1018.Value = 0;
++            DW1018.ForwardGChGammaCorrectedValue254 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++            DW1018.ForwardBChGammaCorrectedValue254 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++
++            DW1019.Value = 0;
++            DW1019.ForwardPixelValue254 = FORWARD_PIXEL_VALUE_254_UNNAMED65024;
++            DW1019.ForwardRChGammaCorrectedValue254 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_254_UNNAMED65024;
++
++            DW1020.Value = 0;
++            DW1020.InverseGChGammaCorrectedValue255 = INVERSE_G_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++            DW1020.InverseBChGammaCorrectedValue255 = INVERSE_B_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++
++            DW1021.Value = 0;
++            DW1021.InversePixelValue255 = INVERSE_PIXEL_VALUE_255_UNNAMED65535;
++            DW1021.InverseRChGammaCorrectedValue255 = INVERSE_R_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++
++            DW1022.Value = 0;
++            DW1022.ForwardGChGammaCorrectedValue255 = FORWARD_G_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++            DW1022.ForwardBChGammaCorrectedValue255 = FORWARD_B_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++
++            DW1023.Value = 0;
++            DW1023.ForwardPixelValue255 = FORWARD_PIXEL_VALUE_255_UNNAMED65535;
++            DW1023.ForwardRChGammaCorrectedValue255 = FORWARD_R_CH_GAMMA_CORRECTED_VALUE_255_UNNAMED65535;
++        };
++
++        static const size_t DW_SIZE = 1024;
++        static const size_t BYTE_SIZE = 4096;
++    };
++
++};
++
++#pragma pack()
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt.h
+new file mode 100644
+index 000000000000..5ce6789d7686
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt.h
+@@ -0,0 +1,1562 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt.h
++//! \brief     Contains all exposed APIs and Definitions for CM
++//!
++
++#ifndef __CM_RT_H__
++#define __CM_RT_H__
++
++//**********************************************************************
++// Version
++//**********************************************************************
++#ifndef CM_1_0
++#define CM_1_0          100
++#endif
++#ifndef CM_2_0
++#define CM_2_0          200
++#endif
++#ifndef CM_2_1
++#define CM_2_1          201
++#endif
++#ifndef CM_2_2
++#define CM_2_2          202
++#endif
++#ifndef CM_2_3
++#define CM_2_3          203
++#endif
++#ifndef CM_2_4
++#define CM_2_4          204
++#endif
++#ifndef CM_3_0
++#define CM_3_0          300
++#endif
++#ifndef CM_4_0
++#define CM_4_0          400
++#endif
++#ifndef CM_5_0
++#define CM_5_0          500
++#endif
++#ifndef CM_6_0
++#define CM_6_0          600
++#endif
++#ifndef CM_7_0
++#define CM_7_0          700
++#endif
++#ifndef CM_7_2
++#define CM_7_2          702 //for MDFRT API refreshment.
++#endif
++
++//Legacy MACRO, will be removed later
++#ifndef __INTEL_MDF
++#define __INTEL_MDF     (CM_7_2)
++#endif
++
++//New MACRO
++#ifndef __INTEL_CM
++#define __INTEL_CM      (CM_7_2)
++#endif
++
++//**********************************************************************
++// external headers
++//**********************************************************************
++#include <stdint.h>
++
++//**********************************************************************
++// Macros
++//**********************************************************************
++#ifdef __cplusplus
++#define EXTERN_C     extern "C"
++#else
++#define EXTERN_C
++#endif
++#define CM_RT_API
++#define CM_KERNEL_FUNCTION(...) CM_KERNEL_FUNCTION2(__VA_ARGS__)
++
++#define _NAME_MERGE_(x, y)                      x ## y
++#define _NAME_LABEL_(name, id)                  _NAME_MERGE_(name, id)
++#define __CODEGEN_UNIQUE(name)                  _NAME_LABEL_(name, __LINE__)
++#define BITFIELD_RANGE( startbit, endbit )     ((endbit)-(startbit)+1)
++#define BITFIELD_BIT(bit)                        1
++
++#define CM_MIN_SURF_WIDTH   1
++#define CM_MIN_SURF_HEIGHT  1
++#define CM_MIN_SURF_DEPTH   2
++
++#define CM_MAX_1D_SURF_WIDTH    0x80000000 // 2^31 2 GB
++
++#define CM_MAX_2D_SURF_WIDTH    16384
++#define CM_MAX_2D_SURF_HEIGHT   16384
++
++#define CM_MAX_3D_SURF_WIDTH    2048
++#define CM_MAX_3D_SURF_HEIGHT   2048
++#define CM_MAX_3D_SURF_DEPTH    2048
++
++#define CM_MAX_OPTION_SIZE_IN_BYTE          512
++#define CM_MAX_KERNEL_NAME_SIZE_IN_BYTE     256
++#define CM_MAX_ISA_FILE_NAME_SIZE_IN_BYTE   256
++
++#define CM_MAX_THREADSPACE_WIDTH_FOR_MW        511
++#define CM_MAX_THREADSPACE_HEIGHT_FOR_MW       511
++#define CM_MAX_THREADSPACE_WIDTH_FOR_MO        512
++#define CM_MAX_THREADSPACE_HEIGHT_FOR_MO       512
++#define CM_MAX_THREADSPACE_WIDTH_SKLUP_FOR_MW  2047
++#define CM_MAX_THREADSPACE_HEIGHT_SKLUP_FOR_MW 2047
++
++
++//Time in seconds before kernel should timeout
++#define CM_MAX_TIMEOUT 2
++//Time in milliseconds before kernel should timeout
++#define CM_MAX_TIMEOUT_MS CM_MAX_TIMEOUT*1000
++
++#define CM_NO_EVENT  ((CmEvent *)(-1))  //NO Event
++
++// Cm Device Create Option
++#define CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE       1
++#define CM_DEVICE_CREATE_OPTION_TDR_DISABLE                 64
++
++#define CM_DEVICE_CONFIG_DISABLE_TASKFLUSHEDSEMAPHORE_OFFSET  6
++#define CM_DEVICE_CONFIG_DISABLE_TASKFLUSHEDSEMAPHORE_MASK   (1<<CM_DEVICE_CONFIG_DISABLE_TASKFLUSHEDSEMAPHORE_OFFSET)
++#define CM_DEVICE_CREATE_OPTION_TASKFLUSHEDSEMAPHORE_DISABLE  1   //to disable the semaphore for task flushed
++#define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET           22
++#define CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_DISENABLE         (1 << CM_DEVICE_CONFIG_MIDTHREADPREEMPTION_OFFSET)
++#define CM_DEVICE_CONFIG_KERNEL_DEBUG_OFFSET                  23
++#define CM_DEVICE_CONFIG_KERNEL_DEBUG_ENABLE               (1 << CM_DEVICE_CONFIG_KERNEL_DEBUG_OFFSET)
++#define CM_DEVICE_CONFIG_VEBOX_OFFSET                      28
++#define CM_DEVICE_CONFIG_VEBOX_DISABLE                     (1 << CM_DEVICE_CONFIG_VEBOX_OFFSET)
++#define CM_DEVICE_CONFIG_GPUCOPY_OFFSET                    29
++#define CM_DEVICE_CONFIG_GPUCOPY_DISABLE                   (1 << CM_DEVICE_CONFIG_GPUCOPY_OFFSET)
++#define CM_DEVICE_CONFIG_FAST_PATH_OFFSET                  30
++#define CM_DEVICE_CONFIG_FAST_PATH_ENABLE                  (1 << CM_DEVICE_CONFIG_FAST_PATH_OFFSET)
++
++#define CM_DEVICE_CREATE_OPTION_DEFAULT                    CM_DEVICE_CONFIG_FAST_PATH_ENABLE
++
++#define CM_MAX_DEPENDENCY_COUNT         8
++#define CM_NUM_DWORD_FOR_MW_PARAM       16
++
++#define CM_NUM_COEFF_ROWS 17
++#define CM_NUM_COEFF_ROWS_SKL 32
++
++#define CM_NUM_CONVOLVE_ROWS 16
++#define CM_NUM_CONVOLVE_ROWS_SKL 32
++
++#define    CM_CHROMA_SITING_NONE           0,
++#define    CM_CHROMA_SITING_HORZ_LEFT      1 << 0
++#define    CM_CHROMA_SITING_HORZ_CENTER    1 << 1
++#define    CM_CHROMA_SITING_HORZ_RIGHT     1 << 2
++#define    CM_CHROMA_SITING_VERT_TOP       1 << 4
++#define    CM_CHROMA_SITING_VERT_CENTER    1 << 5
++#define    CM_CHROMA_SITING_VERT_BOTTOM    1 << 6
++
++#define CM_NULL_SURFACE                     0xFFFF
++
++#define  CM_FUSED_EU_DISABLE                 0
++#define  CM_FUSED_EU_ENABLE                  1
++#define  CM_FUSED_EU_DEFAULT                 CM_FUSED_EU_DISABLE
++
++#define  CM_TURBO_BOOST_DISABLE               0
++#define  CM_TURBO_BOOST_ENABLE                1
++#define  CM_TURBO_BOOST_DEFAULT              CM_TURBO_BOOST_ENABLE
++
++#define CM_CALLBACK __cdecl
++
++// SVM buffer access flags definition
++#define CM_SVM_ACCESS_FLAG_COARSE_GRAINED    (0)                                 //Coarse-grained SVM buffer, IA/GT cache coherency disabled
++#define CM_SVM_ACCESS_FLAG_FINE_GRAINED      (1 << 0)                            //Fine-grained SVM buffer, IA/GT cache coherency enabled
++#define CM_SVM_ACCESS_FLAG_ATOMICS           (1 << 1)                            //Crosse IA/GT atomics supported SVM buffer, need CM_SVM_ACCESS_FLAG_FINE_GRAINED flag is set as well
++#define CM_SVM_ACCESS_FLAG_DEFAULT           CM_SVM_ACCESS_FLAG_COARSE_GRAINED   //default is coarse-grained SVM buffer
++
++#define CM_BUFFER_STATELESS_CREATE_OPTION_GFX_MEM 0
++#define CM_BUFFER_STATELESS_CREATE_OPTION_SYS_MEM 1
++#define CM_BUFFER_STATELESS_CREATE_OPTION_DEGAULT CM_BUFFER_STATELESS_CREATE_OPTION_GFX_MEM
++
++//**********************************************************************
++// OS-specific includings and types
++//**********************************************************************
++#include "cm_rt_def_os.h"
++
++//**********************************************************************
++// Enumerations
++//**********************************************************************
++typedef enum _CM_RETURN_CODE
++{
++    CM_SUCCESS                                  = 0,
++    /*
++     * RANGE -1 ~ -9999 FOR EXTERNAL ERROR CODE
++     */
++    CM_FAILURE                                  = -1,
++    CM_NOT_IMPLEMENTED                          = -2,
++    CM_SURFACE_ALLOCATION_FAILURE               = -3,
++    CM_OUT_OF_HOST_MEMORY                       = -4,
++    CM_SURFACE_FORMAT_NOT_SUPPORTED             = -5,
++    CM_EXCEED_SURFACE_AMOUNT                    = -6,
++    CM_EXCEED_KERNEL_ARG_AMOUNT                 = -7,
++    CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE           = -8,
++    CM_INVALID_ARG_INDEX                        = -9,
++    CM_INVALID_ARG_VALUE                        = -10,
++    CM_INVALID_ARG_SIZE                         = -11,
++    CM_INVALID_THREAD_INDEX                     = -12,
++    CM_INVALID_WIDTH                            = -13,
++    CM_INVALID_HEIGHT                           = -14,
++    CM_INVALID_DEPTH                            = -15,
++    CM_INVALID_COMMON_ISA                       = -16,
++    CM_OPEN_VIDEO_DEVICE_FAILURE                = -17,
++    CM_VIDEO_DEVICE_LOCKED                      = -18,  // Video device is already locked.
++    CM_LOCK_VIDEO_DEVICE_FAILURE                = -19,  // Video device is not locked but can't be locked.
++    CM_EXCEED_SAMPLER_AMOUNT                    = -20,
++    CM_EXCEED_MAX_KERNEL_PER_ENQUEUE            = -21,
++    CM_EXCEED_MAX_KERNEL_SIZE_IN_BYTE           = -22,
++    CM_EXCEED_MAX_THREAD_AMOUNT_PER_ENQUEUE     = -23,
++    CM_EXCEED_VME_STATE_G6_AMOUNT               = -24,
++    CM_INVALID_THREAD_SPACE                     = -25,
++    CM_EXCEED_MAX_TIMEOUT                       = -26,
++    CM_JITDLL_LOAD_FAILURE                      = -27,
++    CM_JIT_COMPILE_FAILURE                      = -28,
++    CM_JIT_COMPILESIM_FAILURE                   = -29,
++    CM_INVALID_THREAD_GROUP_SPACE               = -30,
++    CM_THREAD_ARG_NOT_ALLOWED                   = -31,
++    CM_INVALID_GLOBAL_BUFFER_INDEX              = -32,
++    CM_INVALID_BUFFER_HANDLER                   = -33,
++    CM_EXCEED_MAX_SLM_SIZE                      = -34,
++    CM_JITDLL_OLDER_THAN_ISA                    = -35,
++    CM_INVALID_HARDWARE_THREAD_NUMBER           = -36,
++    CM_GTPIN_INVOKE_FAILURE                     = -37,
++    CM_INVALIDE_L3_CONFIGURATION                = -38,
++    CM_INVALID_TEXTURE2D_USAGE                  = -39,
++    CM_INTEL_GFX_NOTFOUND                       = -40,
++    CM_GPUCOPY_INVALID_SYSMEM                   = -41,
++    CM_GPUCOPY_INVALID_WIDTH                    = -42,
++    CM_GPUCOPY_INVALID_STRIDE                   = -43,
++    CM_EVENT_DRIVEN_FAILURE                     = -44,
++    CM_LOCK_SURFACE_FAIL                        = -45, // Lock surface failed
++    CM_INVALID_GENX_BINARY                      = -46,
++    CM_FEATURE_NOT_SUPPORTED_IN_DRIVER          = -47, // driver out-of-sync
++    CM_QUERY_DLL_VERSION_FAILURE                = -48, //Fail in getting DLL file version
++    CM_KERNELPAYLOAD_PERTHREADARG_MUTEX_FAIL    = -49,
++    CM_KERNELPAYLOAD_PERKERNELARG_MUTEX_FAIL    = -50,
++    CM_KERNELPAYLOAD_SETTING_FAILURE            = -51,
++    CM_KERNELPAYLOAD_SURFACE_INVALID_BTINDEX    = -52,
++    CM_NOT_SET_KERNEL_ARGUMENT                  = -53,
++    CM_GPUCOPY_INVALID_SURFACES                 = -54,
++    CM_GPUCOPY_INVALID_SIZE                     = -55,
++    CM_GPUCOPY_OUT_OF_RESOURCE                  = -56,
++    CM_INVALID_VIDEO_DEVICE                     = -57,
++    CM_SURFACE_DELAY_DESTROY                    = -58,
++    CM_INVALID_VEBOX_STATE                      = -59,
++    CM_INVALID_VEBOX_SURFACE                    = -60,
++    CM_FEATURE_NOT_SUPPORTED_BY_HARDWARE        = -61,
++    CM_RESOURCE_USAGE_NOT_SUPPORT_READWRITE     = -62,
++    CM_MULTIPLE_MIPLEVELS_NOT_SUPPORTED         = -63,
++    CM_INVALID_UMD_CONTEXT                      = -64,
++    CM_INVALID_LIBVA_SURFACE                    = -65,
++    CM_INVALID_LIBVA_INITIALIZE                 = -66,
++    CM_KERNEL_THREADSPACE_NOT_SET               = -67,
++    CM_INVALID_KERNEL_THREADSPACE               = -68,
++    CM_KERNEL_THREADSPACE_THREADS_NOT_ASSOCIATED= -69,
++    CM_KERNEL_THREADSPACE_INTEGRITY_FAILED      = -70,
++    CM_INVALID_USERPROVIDED_GENBINARY           = -71,
++    CM_INVALID_PRIVATE_DATA                     = -72,
++    CM_INVALID_MOS_RESOURCE_HANDLE              = -73,
++    CM_SURFACE_CACHED                           = -74,
++    CM_SURFACE_IN_USE                           = -75,
++    CM_INVALID_GPUCOPY_KERNEL                   = -76,
++    CM_INVALID_DEPENDENCY_WITH_WALKING_PATTERN  = -77,
++    CM_INVALID_MEDIA_WALKING_PATTERN            = -78,
++    CM_FAILED_TO_ALLOCATE_SVM_BUFFER            = -79,
++    CM_EXCEED_MAX_POWER_OPTION_FOR_PLATFORM     = -80,
++    CM_INVALID_KERNEL_THREADGROUPSPACE          = -81,
++    CM_INVALID_KERNEL_SPILL_CODE                = -82,
++    CM_UMD_DRIVER_NOT_SUPPORTED                 = -83,
++    CM_INVALID_GPU_FREQUENCY_VALUE              = -84,
++    CM_SYSTEM_MEMORY_NOT_4KPAGE_ALIGNED         = -85,
++    CM_KERNEL_ARG_SETTING_FAILED                = -86,
++    CM_NO_AVAILABLE_SURFACE                     = -87,
++    CM_VA_SURFACE_NOT_SUPPORTED                 = -88,
++    CM_TOO_MUCH_THREADS                         = -89,
++    CM_NULL_POINTER                             = -90,
++    CM_EXCEED_MAX_NUM_2D_ALIASES                = -91,
++    CM_INVALID_PARAM_SIZE                       = -92,
++    CM_GT_UNSUPPORTED                           = -93,
++    CM_GTPIN_FLAG_NO_LONGER_SUPPORTED           = -94,
++    CM_PLATFORM_UNSUPPORTED_FOR_API             = -95,
++    CM_TASK_MEDIA_RESET                         = -96,
++    CM_KERNELPAYLOAD_SAMPLER_INVALID_BTINDEX    = -97,
++    CM_EXCEED_MAX_NUM_BUFFER_ALIASES            = -98,
++    CM_SYSTEM_MEMORY_NOT_4PIXELS_ALIGNED        = -99,
++    CM_FAILED_TO_CREATE_CURBE_SURFACE           = -100,
++    CM_INVALID_CAP_NAME                         = -101,
++    CM_INVALID_PARAM_FOR_CREATE_QUEUE_EX        = -102,
++    CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS = -103,
++    CM_INVALID_KERNEL_ARG_POINTER                 = -104,
++    CM_LOAD_LIBRARY_FAILED                        = -105,
++    CM_NO_SUPPORTED_ADAPTER                       = -106,
++
++    /*
++     * RANGE <=-10000 FOR INTERNAL ERROR CODE
++     */
++    CM_INTERNAL_ERROR_CODE_OFFSET               = -10000,
++} CM_RETURN_CODE;
++
++typedef enum _CM_STATUS
++{
++    CM_STATUS_QUEUED         = 0,
++    CM_STATUS_FLUSHED        = 1,
++    CM_STATUS_FINISHED       = 2,
++    CM_STATUS_STARTED        = 3,
++    CM_STATUS_RESET          = 4
++
++} CM_STATUS;
++
++typedef enum _CM_PIXEL_TYPE
++{
++    CM_PIXEL_UINT,
++    CM_PIXEL_SINT,
++    CM_PIXEL_OTHER
++} CM_PIXEL_TYPE;
++
++enum GPU_PLATFORM{
++    PLATFORM_INTEL_UNKNOWN     = 0,
++    PLATFORM_INTEL_BDW         = 4,
++    PLATFORM_INTEL_SKL         = 7,
++    PLATFORM_INTEL_BXT         = 8,
++    PLATFORM_INTEL_KBL         = 11,
++    PLATFORM_INTEL_ICLLP       = 13,
++    PLATFORM_INTEL_TGLLP       = 15,
++    PLATFORM_INTEL_GLK         = 16,
++    PLATFORM_INTEL_CFL         = 17,
++};
++
++enum GPU_GT_PLATFORM{
++    PLATFORM_INTEL_GT_UNKNOWN  = 0,
++    PLATFORM_INTEL_GT1         = 1,
++    PLATFORM_INTEL_GT2         = 2,
++    PLATFORM_INTEL_GT3         = 3,
++    PLATFORM_INTEL_GT4         = 4,
++    PLATFORM_INTEL_GT1_5       = 10
++};
++
++typedef enum _CM_DEVICE_CAP_NAME
++{
++    CAP_KERNEL_COUNT_PER_TASK,
++    CAP_KERNEL_BINARY_SIZE,
++    CAP_SAMPLER_COUNT ,
++    CAP_SAMPLER_COUNT_PER_KERNEL,
++    CAP_BUFFER_COUNT ,
++    CAP_SURFACE2D_COUNT,
++    CAP_SURFACE3D_COUNT,
++    CAP_SURFACE_COUNT_PER_KERNEL,
++    CAP_ARG_COUNT_PER_KERNEL,
++    CAP_ARG_SIZE_PER_KERNEL ,
++    CAP_USER_DEFINED_THREAD_COUNT_PER_TASK,
++    CAP_HW_THREAD_COUNT,
++    CAP_SURFACE2D_FORMAT_COUNT,
++    CAP_SURFACE2D_FORMATS,
++    CAP_SURFACE3D_FORMAT_COUNT,
++    CAP_SURFACE3D_FORMATS,
++    CAP_VME_STATE_COUNT,
++    CAP_GPU_PLATFORM,
++    CAP_GT_PLATFORM,
++    CAP_MIN_FREQUENCY,
++    CAP_MAX_FREQUENCY,
++    CAP_L3_CONFIG,
++    CAP_GPU_CURRENT_FREQUENCY,
++    CAP_USER_DEFINED_THREAD_COUNT_PER_TASK_NO_THREAD_ARG,
++    CAP_USER_DEFINED_THREAD_COUNT_PER_MEDIA_WALKER,
++    CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP,
++    CAP_SURFACE2DUP_COUNT,
++    CAP_PLATFORM_INFO,
++    CAP_MAX_BUFFER_SIZE,
++    CAP_MAX_SUBDEV_COUNT //for app to retrieve the total count of sub devices
++} CM_DEVICE_CAP_NAME;
++
++typedef enum _CM_FASTCOPY_OPTION
++{
++    CM_FASTCOPY_OPTION_NONBLOCKING  = 0x00,
++    CM_FASTCOPY_OPTION_BLOCKING     = 0x01
++} CM_FASTCOPY_OPTION;
++
++typedef enum _CM_DEPENDENCY_PATTERN
++{
++    CM_NONE_DEPENDENCY          = 0,    //All threads run parallel, scanline dispatch
++    CM_WAVEFRONT                = 1,
++    CM_WAVEFRONT26              = 2,
++    CM_VERTICAL_WAVE            = 3,
++    CM_HORIZONTAL_WAVE          = 4,
++    CM_WAVEFRONT26Z             = 5,
++    CM_WAVEFRONT26X             = 6,
++    CM_WAVEFRONT26ZIG           = 7,
++    CM_WAVEFRONT26ZI            = 8
++} CM_DEPENDENCY_PATTERN;
++
++typedef enum _CM_WALKING_PATTERN
++{
++    CM_WALK_DEFAULT      = 0,
++    CM_WALK_WAVEFRONT    = 1,
++    CM_WALK_WAVEFRONT26  = 2,
++    CM_WALK_VERTICAL     = 3,
++    CM_WALK_HORIZONTAL   = 4,
++    CM_WALK_WAVEFRONT26X = 5,
++    CM_WALK_WAVEFRONT26ZIG = 6,
++    CM_WALK_WAVEFRONT45D = 7,
++    CM_WALK_WAVEFRONT45XD_2 = 8
++} CM_WALKING_PATTERN;
++
++typedef enum _CM_26ZI_DISPATCH_PATTERN
++{
++    VVERTICAL_HVERTICAL_26           = 0,
++    VVERTICAL_HHORIZONTAL_26         = 1,
++    VVERTICAL26_HHORIZONTAL26        = 2,
++    VVERTICAL1X26_HHORIZONTAL1X26    = 3
++} CM_26ZI_DISPATCH_PATTERN;
++
++typedef enum _CM_MW_GROUP_SELECT
++{
++    CM_MW_GROUP_NONE        = 0,
++    CM_MW_GROUP_COLORLOOP   = 1,
++    CM_MW_GROUP_INNERLOCAL  = 2,
++    CM_MW_GROUP_MIDLOCAL    = 3,
++    CM_MW_GROUP_OUTERLOCAL  = 4,
++    CM_MW_GROUP_INNERGLOBAL = 5,
++} CM_MW_GROUP_SELECT;
++
++/**************** L3/Cache ***************/
++enum MEMORY_OBJECT_CONTROL
++{
++    MEMORY_OBJECT_CONTROL_SKL_DEFAULT = 0,
++    MEMORY_OBJECT_CONTROL_SKL_NO_L3,
++    MEMORY_OBJECT_CONTROL_SKL_NO_LLC_ELLC,
++    MEMORY_OBJECT_CONTROL_SKL_NO_LLC,
++    MEMORY_OBJECT_CONTROL_SKL_NO_ELLC,
++    MEMORY_OBJECT_CONTROL_SKL_NO_LLC_L3,
++    MEMORY_OBJECT_CONTROL_SKL_NO_ELLC_L3,
++    MEMORY_OBJECT_CONTROL_SKL_NO_CACHE,
++    MEMORY_OBJECT_CONTROL_SKL_COUNT,
++
++    MEMORY_OBJECT_CONTROL_CNL_DEFAULT = 0,
++    MEMORY_OBJECT_CONTROL_CNL_NO_L3,
++    MEMORY_OBJECT_CONTROL_CNL_NO_LLC_ELLC,
++    MEMORY_OBJECT_CONTROL_CNL_NO_LLC,
++    MEMORY_OBJECT_CONTROL_CNL_NO_ELLC,
++    MEMORY_OBJECT_CONTROL_CNL_NO_LLC_L3,
++    MEMORY_OBJECT_CONTROL_CNL_NO_ELLC_L3,
++    MEMORY_OBJECT_CONTROL_CNL_NO_CACHE,
++    MEMORY_OBJECT_CONTROL_CNL_COUNT,
++
++    // Unified memory object control type for SKL+
++    MEMORY_OBJECT_CONTROL_DEFAULT = 0x0,
++    MEMORY_OBJECT_CONTROL_NO_L3,
++    MEMORY_OBJECT_CONTROL_NO_LLC_ELLC,
++    MEMORY_OBJECT_CONTROL_NO_LLC,
++    MEMORY_OBJECT_CONTROL_NO_ELLC,
++    MEMORY_OBJECT_CONTROL_NO_LLC_L3,
++    MEMORY_OBJECT_CONTROL_NO_ELLC_L3,
++    MEMORY_OBJECT_CONTROL_NO_CACHE,
++    MEMORY_OBJECT_CONTROL_L1_ENABLED,
++
++    MEMORY_OBJECT_CONTROL_UNKNOWN = 0xff
++};
++
++typedef enum _MEMORY_TYPE {
++    CM_USE_PTE,
++    CM_UN_CACHEABLE,
++    CM_WRITE_THROUGH,
++    CM_WRITE_BACK,
++
++    // BDW
++    MEMORY_TYPE_BDW_UC_WITH_FENCE = 0,
++    MEMORY_TYPE_BDW_UC,
++    MEMORY_TYPE_BDW_WT,
++    MEMORY_TYPE_BDW_WB
++
++} MEMORY_TYPE;
++
++typedef enum _L3_SUGGEST_CONFIG
++{
++   CM_L3_PLANE_DEFAULT = 0,
++   CM_L3_PLANE_1,
++   CM_L3_PLANE_2,
++   CM_L3_PLANE_3,
++   CM_L3_PLANE_4,
++   CM_L3_PLANE_5,
++   CM_L3_PLANE_6,
++   CM_L3_PLANE_7,
++   CM_L3_PLANE_8,
++} L3_SUGGEST_CONFIG;
++
++typedef enum _CM_SAMPLER8x8_SURFACE_
++{
++    CM_AVS_SURFACE = 0,
++    CM_VA_SURFACE = 1
++}CM_SAMPLER8x8_SURFACE;
++
++typedef enum _CM_SURFACE_ADDRESS_CONTROL_MODE_
++{
++    CM_SURFACE_CLAMP = 0,
++    CM_SURFACE_MIRROR = 1
++}CM_SURFACE_ADDRESS_CONTROL_MODE;
++
++typedef enum _CM_MESSAGE_SEQUENCE_
++{
++    CM_MS_1x1   = 0,
++    CM_MS_16x1  = 1,
++    CM_MS_16x4  = 2,
++    CM_MS_32x1  = 3,
++    CM_MS_32x4  = 4,
++    CM_MS_64x1  = 5,
++    CM_MS_64x4  = 6
++}CM_MESSAGE_SEQUENCE;
++
++typedef enum _CM_MIN_MAX_FILTER_CONTROL_
++{
++    CM_MIN_FILTER   = 0,
++    CM_MAX_FILTER   = 1,
++    CM_BOTH_FILTER  = 3
++}CM_MIN_MAX_FILTER_CONTROL;
++
++typedef enum _CM_VA_FUNCTION_
++{
++    CM_VA_MINMAXFILTER  = 0,
++    CM_VA_DILATE        = 1,
++    CM_VA_ERODE         = 2
++} CM_VA_FUNCTION;
++
++typedef enum _CM_EVENT_PROFILING_INFO
++{
++    CM_EVENT_PROFILING_HWSTART,
++    CM_EVENT_PROFILING_HWEND,
++    CM_EVENT_PROFILING_SUBMIT,
++    CM_EVENT_PROFILING_COMPLETE,
++    CM_EVENT_PROFILING_KERNELCOUNT,
++    CM_EVENT_PROFILING_KERNELNAMES,
++    CM_EVENT_PROFILING_THREADSPACE
++}CM_EVENT_PROFILING_INFO;
++
++// CM Convolve type for SKL+
++typedef enum _CM_CONVOLVE_SKL_TYPE
++{
++    CM_CONVOLVE_SKL_TYPE_2D = 0,
++    CM_CONVOLVE_SKL_TYPE_1D = 1,
++    CM_CONVOLVE_SKL_TYPE_1P = 2
++} CM_CONVOLVE_SKL_TYPE;
++
++typedef enum _CM_ROTATION
++{
++    CM_ROTATION_IDENTITY = 0,      //!< Rotation 0 degrees
++    CM_ROTATION_90,                //!< Rotation 90 degrees
++    CM_ROTATION_180,               //!< Rotation 180 degrees
++    CM_ROTATION_270,               //!< Rotation 270 degrees
++} CM_ROTATION;
++
++// to define frame type for interlace frame support
++typedef enum _CM_FRAME_TYPE
++{
++    CM_FRAME,     // singe frame, not interlaced
++    CM_TOP_FIELD,
++    CM_BOTTOM_FIELD,
++    MAX_FRAME_TYPE
++} CM_FRAME_TYPE;
++
++enum CM_QUEUE_TYPE
++{
++    CM_QUEUE_TYPE_NONE = 0,
++    CM_QUEUE_TYPE_RENDER = 1,
++    CM_QUEUE_TYPE_COMPUTE = 2
++};
++
++enum CM_QUEUE_SSEU_USAGE_HINT_TYPE
++{
++    CM_QUEUE_SSEU_USAGE_HINT_DEFAULT = 0,
++    CM_QUEUE_SSEU_USAGE_HINT_VME     = 1
++};
++
++//**********************************************************************
++// Structures
++//**********************************************************************
++typedef struct _CM_SAMPLER_STATE
++{
++    CM_TEXTURE_FILTER_TYPE minFilterType;
++    CM_TEXTURE_FILTER_TYPE magFilterType;
++    CM_TEXTURE_ADDRESS_TYPE addressU;
++    CM_TEXTURE_ADDRESS_TYPE addressV;
++    CM_TEXTURE_ADDRESS_TYPE addressW;
++} CM_SAMPLER_STATE;
++
++typedef struct _CM_SAMPLER_STATE_EX
++{
++    CM_TEXTURE_FILTER_TYPE minFilterType;
++    CM_TEXTURE_FILTER_TYPE magFilterType;
++    CM_TEXTURE_ADDRESS_TYPE addressU;
++    CM_TEXTURE_ADDRESS_TYPE addressV;
++    CM_TEXTURE_ADDRESS_TYPE addressW;
++
++    CM_PIXEL_TYPE SurfaceFormat;
++    union {
++        DWORD BorderColorRedU;
++        INT BorderColorRedS;
++        FLOAT BorderColorRedF;
++    };
++
++    union {
++        DWORD BorderColorGreenU;
++        INT BorderColorGreenS;
++        FLOAT BorderColorGreenF;
++    };
++
++    union {
++        DWORD BorderColorBlueU;
++        INT BorderColorBlueS;
++        FLOAT BorderColorBlueF;
++    };
++
++    union {
++        DWORD BorderColorAlphaU;
++        INT BorderColorAlphaS;
++        FLOAT BorderColorAlphaF;
++    };
++} CM_SAMPLER_STATE_EX;
++
++typedef struct _CM_PLATFORM_INFO
++{
++    UINT numSlices;
++    UINT numSubSlices;
++    UINT numEUsPerSubSlice;
++    UINT numHWThreadsPerEU;
++    UINT numMaxEUsPerPool;
++}CM_PLATFORM_INFO, *PCM_PLATFORM_INFO;
++
++// CM RT DLL File Version
++typedef struct _CM_DLL_FILE_VERSION
++{
++    WORD    wMANVERSION;
++    WORD    wMANREVISION;
++    WORD    wSUBREVISION;
++    WORD    wBUILD_NUMBER;
++    //Version constructed as : "wMANVERSION.wMANREVISION.wSUBREVISION.wBUILD_NUMBER"
++} CM_DLL_FILE_VERSION, *PCM_DLL_FILE_VERSION;
++
++// parameters used to set the surface state of the CmSurface
++struct CM_VME_SURFACE_STATE_PARAM
++{
++    UINT    width;
++    UINT    height;
++};
++
++typedef struct _CM_WALKING_PARAMETERS
++{
++    DWORD Value[CM_NUM_DWORD_FOR_MW_PARAM];
++} CM_WALKING_PARAMETERS, *PCM_WALKING_PARAMETERS;
++
++typedef struct _CM_DEPENDENCY
++{
++    UINT    count;
++    INT     deltaX[CM_MAX_DEPENDENCY_COUNT];
++    INT     deltaY[CM_MAX_DEPENDENCY_COUNT];
++}CM_DEPENDENCY;
++
++typedef struct _CM_COORDINATE
++{
++    INT x;
++    INT y;
++} CM_COORDINATE, *PCM_COORDINATE;
++
++typedef struct _CM_THREAD_PARAM
++{
++    CM_COORDINATE   scoreboardCoordinates;
++    BYTE            scoreboardColor;
++    BYTE            sliceDestinationSelect;
++    BYTE            subSliceDestinationSelect;
++} CM_THREAD_PARAM, *PCM_THREAD_PARAM;
++
++struct L3ConfigRegisterValues
++{
++    unsigned int config_register0;
++    unsigned int config_register1;
++    unsigned int config_register2;
++    unsigned int config_register3;
++};
++
++//GT-PIN
++typedef struct _CM_SURFACE_DETAILS{
++    UINT        width;
++    UINT        height;
++    UINT        depth;
++    CM_SURFACE_FORMAT   format;
++    UINT        planeIndex;
++    UINT        pitch;
++    UINT        slicePitch;
++    UINT        SurfaceBaseAddress;
++    UINT8       TiledSurface;
++    UINT8       TileWalk;
++    UINT        XOffset;
++    UINT        YOffset;
++
++}CM_SURFACE_DETAILS;
++
++/*
++ *  AVS SAMPLER8x8 STATE
++ */
++typedef struct _CM_AVS_COEFF_TABLE{
++    float   FilterCoeff_0_0;
++    float   FilterCoeff_0_1;
++    float   FilterCoeff_0_2;
++    float   FilterCoeff_0_3;
++    float   FilterCoeff_0_4;
++    float   FilterCoeff_0_5;
++    float   FilterCoeff_0_6;
++    float   FilterCoeff_0_7;
++}CM_AVS_COEFF_TABLE;
++
++typedef struct _CM_AVS_INTERNEL_COEFF_TABLE{
++    BYTE   FilterCoeff_0_0;
++    BYTE   FilterCoeff_0_1;
++    BYTE   FilterCoeff_0_2;
++    BYTE   FilterCoeff_0_3;
++    BYTE   FilterCoeff_0_4;
++    BYTE   FilterCoeff_0_5;
++    BYTE   FilterCoeff_0_6;
++    BYTE   FilterCoeff_0_7;
++}CM_AVS_INTERNEL_COEFF_TABLE;
++
++typedef struct _CM_AVS_NONPIPLINED_STATE{
++    bool BypassXAF;
++    bool BypassYAF;
++    BYTE DefaultSharpLvl;
++    BYTE maxDerivative4Pixels;
++    BYTE maxDerivative8Pixels;
++    BYTE transitionArea4Pixels;
++    BYTE transitionArea8Pixels;
++    CM_AVS_COEFF_TABLE Tbl0X[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_COEFF_TABLE Tbl0Y[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_COEFF_TABLE Tbl1X[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_COEFF_TABLE Tbl1Y[ CM_NUM_COEFF_ROWS_SKL ];
++    bool bEnableRGBAdaptive;
++    bool bAdaptiveFilterAllChannels;
++}CM_AVS_NONPIPLINED_STATE;
++
++typedef struct _CM_AVS_INTERNEL_NONPIPLINED_STATE{
++    bool BypassXAF;
++    bool BypassYAF;
++    BYTE DefaultSharpLvl;
++    BYTE maxDerivative4Pixels;
++    BYTE maxDerivative8Pixels;
++    BYTE transitionArea4Pixels;
++    BYTE transitionArea8Pixels;
++    CM_AVS_INTERNEL_COEFF_TABLE Tbl0X[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_INTERNEL_COEFF_TABLE Tbl0Y[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_INTERNEL_COEFF_TABLE Tbl1X[ CM_NUM_COEFF_ROWS_SKL ];
++    CM_AVS_INTERNEL_COEFF_TABLE Tbl1Y[ CM_NUM_COEFF_ROWS_SKL ];
++    bool bEnableRGBAdaptive;
++    bool bAdaptiveFilterAllChannels;
++}CM_AVS_INTERNEL_NONPIPLINED_STATE;
++
++typedef struct _CM_AVS_STATE_MSG{
++    bool AVSTYPE; //true nearest, false adaptive
++    bool EightTapAFEnable; //HSW+
++    bool BypassIEF; //ignored for BWL, moved to sampler8x8 payload.
++    bool ShuffleOutputWriteback; //SKL mode only to be set when AVS msg sequence is 4x4 or 8x4
++    bool HDCDirectWriteEnable;
++    unsigned short GainFactor;
++    unsigned char GlobalNoiseEstm;
++    unsigned char StrongEdgeThr;
++    unsigned char WeakEdgeThr;
++    unsigned char StrongEdgeWght;
++    unsigned char RegularWght;
++    unsigned char NonEdgeWght;
++    unsigned short wR3xCoefficient;
++    unsigned short wR3cCoefficient;
++    unsigned short wR5xCoefficient;
++    unsigned short wR5cxCoefficient;
++    unsigned short wR5cCoefficient;
++    //For Non-piplined states
++    unsigned short stateID;
++    CM_AVS_NONPIPLINED_STATE * AvsState;
++} CM_AVS_STATE_MSG;
++
++struct CM_AVS_STATE_MSG_EX {
++  CM_AVS_STATE_MSG_EX();
++
++  bool enable_all_channel_adaptive_filter;  // adaptive filter for all channels. validValues => [true..false]
++  bool enable_rgb_adaptive_filter;          // adaptive filter for all channels. validValues => [true..false]
++  bool enable_8_tap_adaptive_filter;        // enable 8-tap filter. validValues => [true..false]
++  bool enable_uv_8_tap_filter;              // enable 8-tap filter on UV/RB channels. validValues => [true..false]
++  bool writeback_format;                    // true sampleunorm, false standard. validValues => [true..false]
++  bool writeback_mode;                      // true vsa, false ief. validValues => [true..false]
++  BYTE state_selection;                     // 0=>first,1=>second scaler8x8 state. validValues => [0..1]
++
++  // Image enhancement filter settings.
++  bool enable_ief;        // image enhancement filter enable. validValues => [true..false]
++  bool ief_type;          // true "basic" or false "advanced". validValues => [true..false]
++  bool enable_ief_smooth; // true based on 3x3, false based on 5x5 validValues => [true..false]
++  float r3c_coefficient;  // smoothing coeffient. Valid values => [0.0..0.96875]
++  float r3x_coefficient;  // smoothing coeffient. Valid values => [0.0..0.96875]
++  float r5c_coefficient;  // smoothing coeffient. validValues => [0.0..0.96875]
++  float r5cx_coefficient; // smoothing coeffient. validValues => [0.0..0.96875]
++  float r5x_coefficient;  // smoothing coeffient. validValues => [0.0..0.96875]
++
++  // Edge processing settings.
++  BYTE strong_edge_threshold; // validValues => [0..64]
++  BYTE strong_edge_weight;    // Sharpening strength when a strong edge. validValues => [0..7]
++  BYTE weak_edge_threshold;   // validValues => [0..64]
++  BYTE regular_edge_weight;   // Sharpening strength when a weak edge. validValues => [0..7]
++  BYTE non_edge_weight;       // Sharpening strength when no edge. validValues => [0..7]
++
++  // Chroma key.
++  bool enable_chroma_key; // Chroma keying be performed. validValues => [true..false]
++  BYTE chroma_key_index;  // ChromaKey Table entry. validValues => [0..3]
++
++  // Skin tone settings.
++  bool enable_skin_tone;              // SkinToneTunedIEF_Enable. validValues => [true..false]
++  bool enable_vy_skin_tone_detection; // Enables STD in the VY subspace. validValues => [true..false]
++  bool skin_detail_factor;            // validValues => [true..false]
++  BYTE skin_types_margin;             // validValues => [0..255]
++  BYTE skin_types_threshold;          // validValues => [0..255]
++
++  // Miscellaneous settings.
++  BYTE gain_factor;             // validValues => [0..63]
++  BYTE global_noise_estimation; // validValues => [0..255]
++  bool mr_boost;                // validValues => [true..false]
++  BYTE mr_smooth_threshold;     // validValues => [0..3]
++  BYTE mr_threshold;
++  bool steepness_boost;         // validValues => [true..false]
++  BYTE steepness_threshold;     // validValues => [0..15]
++  bool texture_coordinate_mode; // true: clamp, false: mirror. validValues => [true..false]
++  BYTE max_hue;                 // Rectangle half width. validValued => [0..63]
++  BYTE max_saturation;          // Rectangle half length. validValued => [0..63]
++  int angles;                   // validValued => [0..360]
++  BYTE diamond_margin ;         // validValues => [0..7]
++  char diamond_du;              // Rhombus center shift in the sat-direction. validValues => [-64..63]
++  char diamond_dv;              // Rhombus center shift in the hue-direction. validValues => [-64..63]
++  float diamond_alpha;          // validValues => [0.0..4.0]
++  BYTE diamond_threshold;       // validValues => [0..63]
++  BYTE rectangle_margin;        // validValues => [0..7]
++  BYTE rectangle_midpoint[2];   // validValues => [[0..255, 0..255]]
++  float vy_inverse_margin[2];   // validValues => [[0.0..1.0, 0.0..1.0]]
++
++  // Piecewise linear function settings.
++  BYTE piecewise_linear_y_points[4];      // validValues => [[0..255, 0..255, 0..255, 0..255]]
++  float piecewise_linear_y_slopes[2];     // validValues => [[-4.0...4.0, -4.0...4.0]]
++  BYTE piecewise_linear_points_lower[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
++  BYTE piecewise_linear_points_upper[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
++  float piecewise_linear_slopes_lower[4]; // validValues => [[-4.0...4.0, -4.0...4.0, -4.0...4.0, -4.0...4.0]]
++  float piecewise_linear_slopes_upper[4]; // validValues => [[-4.0...4.0, -4.0...4.0, -4.0...4.0, -4.0...4.0]]
++  BYTE piecewise_linear_biases_lower[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
++  BYTE piecewise_linear_biases_upper[4];  // validValues => [[0..255, 0..255, 0..255, 0..255]]
++
++  // AVS non-pipelined states.
++  BYTE default_sharpness_level;   // default coefficient between smooth and sharp filtering. validValues => [0..255]
++  bool enable_x_adaptive_filter;  // validValues => [true, false]
++  bool enable_y_adaptive_filter;  // validValues => [true, false]
++  BYTE max_derivative_4_pixels;   // lower boundary of the smooth 4 pixel area. validValues => [0..255]
++  BYTE max_derivative_8_pixels;   // lower boundary of the smooth 8 pixel area. validValues => [0..255]
++  BYTE transition_area_4_pixels;  // used in adaptive filtering to specify the width of the transition area for the 4 pixel calculation. validValues => [0..8]
++  BYTE transition_area_8_pixels;  // Used in adaptive filtering to specify the width of the transition area for the 8 pixel calculation. validValues => [0..8]
++  CM_AVS_COEFF_TABLE table0_x[CM_NUM_COEFF_ROWS_SKL];
++  CM_AVS_COEFF_TABLE table0_y[CM_NUM_COEFF_ROWS_SKL];
++  CM_AVS_COEFF_TABLE table1_x[CM_NUM_COEFF_ROWS_SKL];
++  CM_AVS_COEFF_TABLE table1_y[CM_NUM_COEFF_ROWS_SKL];
++};
++
++/*
++ *  CONVOLVE STATE DATA STRUCTURES
++ */
++
++typedef struct _CM_CONVOLVE_COEFF_TABLE{
++    float   FilterCoeff_0_0;
++    float   FilterCoeff_0_1;
++    float   FilterCoeff_0_2;
++    float   FilterCoeff_0_3;
++    float   FilterCoeff_0_4;
++    float   FilterCoeff_0_5;
++    float   FilterCoeff_0_6;
++    float   FilterCoeff_0_7;
++    float   FilterCoeff_0_8;
++    float   FilterCoeff_0_9;
++    float   FilterCoeff_0_10;
++    float   FilterCoeff_0_11;
++    float   FilterCoeff_0_12;
++    float   FilterCoeff_0_13;
++    float   FilterCoeff_0_14;
++    float   FilterCoeff_0_15;
++    float   FilterCoeff_0_16;
++    float   FilterCoeff_0_17;
++    float   FilterCoeff_0_18;
++    float   FilterCoeff_0_19;
++    float   FilterCoeff_0_20;
++    float   FilterCoeff_0_21;
++    float   FilterCoeff_0_22;
++    float   FilterCoeff_0_23;
++    float   FilterCoeff_0_24;
++    float   FilterCoeff_0_25;
++    float   FilterCoeff_0_26;
++    float   FilterCoeff_0_27;
++    float   FilterCoeff_0_28;
++    float   FilterCoeff_0_29;
++    float   FilterCoeff_0_30;
++    float   FilterCoeff_0_31;
++}CM_CONVOLVE_COEFF_TABLE;
++
++typedef struct _CM_CONVOLVE_STATE_MSG{
++    bool CoeffSize; //true 16-bit, false 8-bit
++    byte SclDwnValue; //Scale down value
++    byte Width; //Kernel Width
++    byte Height; //Kernel Height
++    //SKL mode
++    bool isVertical32Mode;
++    bool isHorizontal32Mode;
++    CM_CONVOLVE_SKL_TYPE nConvolveType;
++    CM_CONVOLVE_COEFF_TABLE Table[CM_NUM_CONVOLVE_ROWS_SKL];
++} CM_CONVOLVE_STATE_MSG;
++
++/*
++ *   MISC SAMPLER8x8 State
++ */
++typedef struct _CM_MISC_STATE {
++    //DWORD 0
++    union{
++        struct{
++            DWORD   Row0      : 16;
++            DWORD   Reserved  : 8;
++            DWORD   Width     : 4;
++            DWORD   Height    : 4;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW0;
++
++    //DWORD 1
++    union{
++        struct{
++            DWORD   Row1      : 16;
++            DWORD   Row2      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW1;
++
++    //DWORD 2
++    union{
++        struct{
++            DWORD   Row3      : 16;
++            DWORD   Row4      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW2;
++
++    //DWORD 3
++    union{
++        struct{
++            DWORD   Row5      : 16;
++            DWORD   Row6      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW3;
++
++    //DWORD 4
++    union{
++        struct{
++            DWORD   Row7      : 16;
++            DWORD   Row8      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW4;
++
++    //DWORD 5
++    union{
++        struct{
++            DWORD   Row9      : 16;
++            DWORD   Row10      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW5;
++
++    //DWORD 6
++    union{
++        struct{
++            DWORD   Row11      : 16;
++            DWORD   Row12      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW6;
++
++    //DWORD 7
++    union{
++        struct{
++            DWORD   Row13      : 16;
++            DWORD   Row14      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    } DW7;
++} CM_MISC_STATE;
++
++typedef struct _CM_MISC_STATE_MSG{
++    //DWORD 0
++    union{
++        struct{
++            DWORD   Row0      : 16;
++            DWORD   Reserved  : 8;
++            DWORD   Width     : 4;
++            DWORD   Height    : 4;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW0;
++
++    //DWORD 1
++    union{
++        struct{
++            DWORD   Row1      : 16;
++            DWORD   Row2      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW1;
++
++    //DWORD 2
++    union{
++        struct{
++            DWORD   Row3      : 16;
++            DWORD   Row4      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW2;
++
++    //DWORD 3
++    union{
++        struct{
++            DWORD   Row5      : 16;
++            DWORD   Row6      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW3;
++
++    //DWORD 4
++    union{
++        struct{
++            DWORD   Row7      : 16;
++            DWORD   Row8      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW4;
++
++    //DWORD 5
++    union{
++        struct{
++            DWORD   Row9      : 16;
++            DWORD   Row10      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW5;
++
++    //DWORD 6
++    union{
++        struct{
++            DWORD   Row11      : 16;
++            DWORD   Row12      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW6;
++
++    //DWORD 7
++    union{
++        struct{
++            DWORD   Row13      : 16;
++            DWORD   Row14      : 16;
++        };
++        struct{
++            DWORD value;
++        };
++    }DW7;
++} CM_MISC_STATE_MSG;
++
++enum CM_SAMPLER_STATE_TYPE {
++  CM_SAMPLER8X8_AVS = 0,
++  CM_SAMPLER8X8_CONV = 1,
++  CM_SAMPLER8X8_MISC = 3,
++  CM_SAMPLER8X8_CONV1DH = 4,
++  CM_SAMPLER8X8_CONV1DV = 5,
++  CM_SAMPLER8X8_AVS_EX = 6,
++  CM_SAMPLER8X8_NONE
++};
++
++struct CM_SAMPLER_8X8_DESCR {
++  CM_SAMPLER_STATE_TYPE stateType;
++  union {
++    CM_AVS_STATE_MSG *avs;
++    CM_AVS_STATE_MSG_EX *avs_ex;
++    CM_CONVOLVE_STATE_MSG *conv;
++    CM_MISC_STATE_MSG *misc; //ERODE/DILATE/MINMAX
++  };
++};
++
++typedef struct _CM_VEBOX_STATE
++{
++
++    DWORD       ColorGamutExpansionEnable : 1;
++    DWORD       ColorGamutCompressionEnable : 1;
++    DWORD       GlobalIECPEnable : 1;
++    DWORD       DNEnable : 1;
++    DWORD       DIEnable : 1;
++    DWORD       DNDIFirstFrame : 1;
++    DWORD       DownsampleMethod422to420 : 1;
++    DWORD       DownsampleMethod444to422 : 1;
++    DWORD       DIOutputFrames : 2;
++    DWORD       DemosaicEnable : 1;
++    DWORD       VignetteEnable : 1;
++    DWORD       AlphaPlaneEnable : 1;
++    DWORD       HotPixelFilteringEnable : 1;
++    DWORD       SingleSliceVeboxEnable : 1;
++    DWORD       LaceCorrectionEnable : BITFIELD_BIT(16);
++    DWORD       DisableEncoderStatistics : BITFIELD_BIT(17);
++    DWORD       DisableTemporalDenoiseFilter : BITFIELD_BIT(18);
++    DWORD       SinglePipeEnable : BITFIELD_BIT(19);
++    DWORD      __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(20);
++    DWORD       ForwardGammaCorrectionEnable : BITFIELD_BIT(21);
++    DWORD        __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 24);
++    DWORD       StateSurfaceControlBits : BITFIELD_RANGE(25, 31);
++}  CM_VEBOX_STATE, *PCM_VEBOX_STATE;
++
++typedef struct _CM_POWER_OPTION
++{
++    USHORT nSlice;                      // set number of slice to use: 0(default number), 1, 2...
++    USHORT nSubSlice;                   // set number of subslice to use: 0(default number), 1, 2...
++    USHORT nEU;                         // set number of EU to use: 0(default number), 1, 2...
++} CM_POWER_OPTION, *PCM_POWER_OPTION;
++
++// to support new flag with current API
++// new flag/field could be add to the end of this structure
++//
++struct CM_FLAG {
++    CM_FLAG();
++    CM_ROTATION rotationFlag;
++    INT chromaSiting;
++};
++
++struct _CM_TASK_CONFIG {
++    bool     turboBoostFlag     : 1;
++    bool     fusedEuDispatchFlag : 1;
++    uint32_t reserved_bits      :30;
++    uint32_t reserved0;
++    uint32_t reserved1;
++    uint32_t reserved2;
++};
++
++typedef enum _CM_KERNEL_EXEC_MODE {
++    CM_KERNEL_EXECUTION_MODE_MONOPOLIZED =  0, // Kernel can occupy all DSS for execution */
++    CM_KERNEL_EXECUTION_MODE_CONCURRENT,       // Kernel can occupy part of DSS  and concurrently execute together with other workloads.
++} CM_KERNEL_EXEC_MODE;
++
++struct CM_EXECUTION_CONFIG {
++    CM_KERNEL_EXEC_MODE kernelExecutionMode = CM_KERNEL_EXECUTION_MODE_MONOPOLIZED;
++    int                 concurrentPolicy    = 0; // Reserve for future extension.
++};
++
++#define CM_TASK_CONFIG _CM_TASK_CONFIG
++
++// parameters used to set the surface state of the buffer
++typedef struct _CM_SURFACE_MEM_OBJ_CTRL {
++    MEMORY_OBJECT_CONTROL mem_ctrl;
++    MEMORY_TYPE mem_type;
++    INT age;
++} CM_SURFACE_MEM_OBJ_CTRL;
++
++typedef struct _CM_BUFFER_STATE_PARAM
++{
++    UINT                      uiSize;               // the new size of the buffer, if it is 0, set it as the (original width - offset)
++    UINT                      uiBaseAddressOffset;  // offset should be 16-aligned
++    CM_SURFACE_MEM_OBJ_CTRL   mocs;                 // if not set (all zeros), then the aliases mocs setting is the same as the origin
++}CM_BUFFER_STATE_PARAM;
++
++typedef struct _CM_SURFACE2D_STATE_PARAM
++{
++    UINT format;
++    UINT width;
++    UINT height;
++    UINT depth;
++    UINT pitch;
++    WORD memory_object_control;
++    UINT surface_x_offset;
++    UINT surface_y_offset;
++    UINT reserved[4]; // for future usage
++} CM_SURFACE2D_STATE_PARAM;
++
++struct _CM_QUEUE_CREATE_OPTION
++{
++    CM_QUEUE_TYPE                 QueueType               : 3;
++    bool                          RAMode                  : 1;
++    unsigned int                  Reserved0               : 3;
++    bool                          UserGPUContext          : 1; // Is the user-provided GPU Context already created externally
++    unsigned int                  GPUContext              : 8; // user-provided GPU Context ordinal
++    CM_QUEUE_SSEU_USAGE_HINT_TYPE SseuUsageHint           : 3;
++    unsigned int                  Reserved1               : 1;
++    unsigned int                  Reserved2               : 12;
++};
++#define CM_QUEUE_CREATE_OPTION _CM_QUEUE_CREATE_OPTION
++
++typedef enum _CM_CONDITIONAL_END_OPERATOR_CODE {
++    MAD_GREATER_THAN_IDD = 0,
++    MAD_GREATER_THAN_OR_EQUAL_IDD,
++    MAD_LESS_THAN_IDD,
++    MAD_LESS_THAN_OR_EQUAL_IDD,
++    MAD_EQUAL_IDD,
++    MAD_NOT_EQUAL_IDD
++} CM_CONDITIONAL_END_OPERATOR_CODE;
++
++struct CM_CONDITIONAL_END_PARAM {
++    DWORD opValue;
++    CM_CONDITIONAL_END_OPERATOR_CODE  opCode;
++    bool  opMask;
++    bool  opLevel;
++};
++
++struct CM_KERNEL_SYNC_CONFIG {
++    bool     dataCacheFlush   : 1; // true: cache will be flushed;
++    uint32_t reserved         : 31;
++};
++
++//**********************************************************************
++// Classes forward declarations
++//**********************************************************************
++class CmSampler8x8;
++class CmEvent;
++class CmThreadGroupSpace;
++class CmKernel;
++class CmTask;
++class CmProgram;
++class CmBuffer;
++class CmBufferUP;
++class CmBufferSVM;
++class CmBufferStateless;
++class CmSurface2D;
++class CmSurface2DUP;
++class CmSurface2DStateless;
++class CmSurface3D;
++class CmSampler;
++class CmThreadSpace;
++class CmVebox;
++class CmQueue;
++class SurfaceIndex;
++class SamplerIndex;
++
++//**********************************************************************
++// Extended definitions if any
++//**********************************************************************
++#include "cm_rt_extension.h"
++
++//**********************************************************************
++// Constants
++//**********************************************************************
++const CM_QUEUE_CREATE_OPTION CM_DEFAULT_QUEUE_CREATE_OPTION = { CM_QUEUE_TYPE_RENDER, false, 0, false, 0, CM_QUEUE_SSEU_USAGE_HINT_DEFAULT, 0, 0 };
++
++//**********************************************************************
++// Classes
++//**********************************************************************
++class CmSampler8x8
++{
++public:
++    CM_RT_API virtual INT GetIndex( SamplerIndex* & pIndex ) = 0 ;
++protected:
++    ~CmSampler8x8(){};
++};
++
++class CmEvent
++{
++public:
++    CM_RT_API virtual INT GetStatus( CM_STATUS& status) = 0 ;
++    CM_RT_API virtual INT GetExecutionTime(UINT64& time) = 0;
++    CM_RT_API virtual INT WaitForTaskFinished(DWORD dwTimeOutMs = CM_MAX_TIMEOUT_MS) = 0 ;
++    CM_RT_API virtual INT GetSurfaceDetails( UINT kernIndex, UINT surfBTI,CM_SURFACE_DETAILS& outDetails )=0;
++    CM_RT_API virtual INT GetProfilingInfo(CM_EVENT_PROFILING_INFO infoType, size_t paramSize, PVOID pInputValue, PVOID pValue) = 0;
++    CM_RT_API virtual INT GetExecutionTickTime(UINT64& ticks) = 0;
++protected:
++   ~CmEvent(){};
++};
++
++class CmKernel
++{
++public:
++    CM_RT_API virtual INT SetThreadCount(UINT count ) = 0;
++    CM_RT_API virtual INT SetKernelArg(UINT index, size_t size, const void * pValue ) = 0;
++    CM_RT_API virtual INT SetThreadArg(UINT threadId, UINT index, size_t size, const void * pValue ) = 0;
++    CM_RT_API virtual INT SetStaticBuffer(UINT index, const void * pValue ) = 0;
++    CM_RT_API virtual INT SetSurfaceBTI(SurfaceIndex* pSurface, UINT BTIndex) = 0;
++    CM_RT_API virtual INT AssociateThreadSpace(CmThreadSpace* & pTS) = 0;
++    CM_RT_API virtual INT AssociateThreadGroupSpace(CmThreadGroupSpace* & pTGS) = 0;
++    CM_RT_API virtual INT SetSamplerBTI(SamplerIndex* pSampler, UINT nIndex) = 0;
++    CM_RT_API virtual INT DeAssociateThreadSpace(CmThreadSpace* & pTS) = 0;
++    CM_RT_API virtual INT DeAssociateThreadGroupSpace(CmThreadGroupSpace* & pTGS) = 0;
++    CM_RT_API virtual INT QuerySpillSize(unsigned int &spillSize) = 0;
++    CM_RT_API virtual INT SetKernelArgPointer(UINT index, size_t size, const void *pValue) = 0;
++
++protected:
++   ~CmKernel(){};
++};
++
++class CmTask
++{
++public:
++    CM_RT_API virtual INT AddKernel(CmKernel *pKernel) = 0;
++    CM_RT_API virtual INT Reset(void) = 0;
++    CM_RT_API virtual INT AddSync(void) = 0;
++    CM_RT_API virtual INT SetPowerOption( PCM_POWER_OPTION pCmPowerOption ) = 0;
++    CM_RT_API virtual INT AddConditionalEnd(SurfaceIndex* pSurface, UINT offset, CM_CONDITIONAL_END_PARAM *pCondParam) = 0;
++    CM_RT_API virtual INT SetProperty(const CM_TASK_CONFIG &taskConfig) = 0;
++    CM_RT_API virtual INT AddKernelWithConfig( CmKernel *pKernel, const CM_EXECUTION_CONFIG *config ) = 0;
++    CM_RT_API virtual INT GetProperty(CM_TASK_CONFIG &taskConfig) = 0;
++    CM_RT_API virtual INT AddSyncEx(const CM_KERNEL_SYNC_CONFIG *config) = 0;
++protected:
++   ~CmTask(){};
++};
++
++class CmBuffer
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++    CM_RT_API virtual INT ReadSurface( unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT WriteSurface( const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
++    CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
++    CM_RT_API virtual INT SetSurfaceStateParam(SurfaceIndex *pSurfIndex, const CM_BUFFER_STATE_PARAM *pSSParam) = 0;
++protected:
++   ~CmBuffer(){};
++};
++
++class CmBufferUP
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++    CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
++protected:
++   ~CmBufferUP(){};
++};
++
++class CmBufferSVM
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++    CM_RT_API virtual INT GetAddress( void * &pAddr) = 0;
++protected:
++    ~CmBufferSVM(){};
++};
++
++class CmBufferStateless
++{
++public:
++    CM_RT_API virtual INT GetGfxAddress(uint64_t &gfxAddr) = 0;
++    CM_RT_API virtual INT GetSysAddress(void *&pSysAddr) = 0;
++    CM_RT_API virtual INT ReadSurface(unsigned char *pSysMem,
++                                      CmEvent *pEvent,
++                                      uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
++    CM_RT_API virtual INT WriteSurface(const unsigned char *pSysMem,
++                                       CmEvent *pEvent,
++                                       uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
++protected:
++    ~CmBufferStateless() {};
++};
++
++class CmSurface2DUP
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++    CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
++    CM_RT_API virtual INT SetProperty(CM_FRAME_TYPE frameType) = 0;
++protected:
++    ~CmSurface2DUP(){};
++};
++
++class CmSurface2DStateless
++{
++public:
++    CM_RT_API virtual INT GetGfxAddress(uint64_t &gfxAddr) = 0;
++    CM_RT_API virtual INT ReadSurface(unsigned char *pSysMem,
++                                      CmEvent *pEvent,
++                                      uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
++    CM_RT_API virtual INT WriteSurface(const unsigned char *pSysMem,
++                                       CmEvent *pEvent,
++                                       uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
++protected:
++    ~CmSurface2DStateless(){};
++};
++
++class CmSurface3D
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++    CM_RT_API virtual INT ReadSurface( unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT WriteSurface( const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
++    CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
++protected:
++   ~CmSurface3D(){};
++};
++
++class CmSampler
++{
++public:
++    CM_RT_API virtual INT GetIndex( SamplerIndex* & pIndex ) = 0 ;
++protected:
++    ~CmSampler(){};
++};
++
++class CmThreadSpace
++{
++public:
++    CM_RT_API virtual INT AssociateThread( UINT x, UINT y, CmKernel* pKernel , UINT threadId ) = 0;
++    CM_RT_API virtual INT SelectThreadDependencyPattern ( CM_DEPENDENCY_PATTERN pattern ) = 0;
++    CM_RT_API virtual INT AssociateThreadWithMask( UINT x, UINT y, CmKernel* pKernel , UINT threadId, BYTE nDependencyMask ) = 0;
++    CM_RT_API virtual INT SetThreadSpaceColorCount( UINT colorCount ) = 0;
++    CM_RT_API virtual INT SelectMediaWalkingPattern( CM_WALKING_PATTERN pattern ) = 0;
++    CM_RT_API virtual INT Set26ZIDispatchPattern( CM_26ZI_DISPATCH_PATTERN pattern ) = 0;
++    CM_RT_API virtual INT Set26ZIMacroBlockSize( UINT width, UINT height )  = 0;
++    CM_RT_API virtual INT SetMediaWalkerGroupSelect(CM_MW_GROUP_SELECT groupSelect) = 0;
++    CM_RT_API virtual INT SelectMediaWalkingParameters( CM_WALKING_PARAMETERS paramaters ) = 0;
++    CM_RT_API virtual INT SelectThreadDependencyVectors( CM_DEPENDENCY dependVectors ) = 0;
++    CM_RT_API virtual INT SetThreadSpaceOrder(UINT threadCount, PCM_THREAD_PARAM pThreadSpaceOrder) = 0;
++protected:
++    ~CmThreadSpace(){};
++};
++
++class CmVebox
++{
++public:
++    CM_RT_API virtual INT SetState(CM_VEBOX_STATE& VeBoxState) = 0;
++
++    CM_RT_API virtual INT SetCurFrameInputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetCurFrameInputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetPrevFrameInputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetPrevFrameInputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetSTMMInputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetSTMMInputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetSTMMOutputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetSTMMOutputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetDenoisedCurFrameOutputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetDenoisedCurOutputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetCurFrameOutputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetCurFrameOutputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetPrevFrameOutputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetPrevFrameOutputSurfaceControlBits( const WORD ctrlBits ) = 0;
++
++    CM_RT_API virtual INT SetStatisticsOutputSurface( CmSurface2D* pSurf ) = 0;
++    CM_RT_API virtual INT SetStatisticsOutputSurfaceControlBits( const WORD ctrlBits ) = 0;
++    CM_RT_API virtual INT SetParam(CmBufferUP *pParamBuffer) = 0;
++protected:
++   ~CmVebox(){};
++};
++
++class CmQueue
++{
++public:
++    CM_RT_API virtual INT Enqueue( CmTask* pTask, CmEvent* & pEvent, const CmThreadSpace* pTS = nullptr ) = 0;
++    CM_RT_API virtual INT DestroyEvent( CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueWithGroup( CmTask* pTask, CmEvent* & pEvent, const CmThreadGroupSpace* pTGS = nullptr )=0;
++    CM_RT_API virtual INT EnqueueCopyCPUToGPU( CmSurface2D* pSurface, const unsigned char* pSysMem, CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueCopyGPUToCPU( CmSurface2D* pSurface, unsigned char* pSysMem, CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueInitSurface2D( CmSurface2D* pSurface, const DWORD initValue, CmEvent* &pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueCopyGPUToGPU( CmSurface2D* pOutputSurface, CmSurface2D* pInputSurface, UINT option, CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueCopyCPUToCPU( unsigned char* pDstSysMem, unsigned char* pSrcSysMem, UINT size, UINT option, CmEvent* & pEvent ) = 0;
++
++    CM_RT_API virtual INT EnqueueCopyCPUToGPUFullStride( CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueCopyGPUToCPUFullStride( CmSurface2D* pSurface, unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent ) = 0;
++
++    CM_RT_API virtual INT EnqueueCopyCPUToGPUFullStrideDup( CmSurface2D* pSurface, const unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent ) = 0;
++    CM_RT_API virtual INT EnqueueCopyGPUToCPUFullStrideDup( CmSurface2D* pSurface, unsigned char* pSysMem, const UINT widthStride, const UINT heightStride, const UINT option, CmEvent* & pEvent ) = 0;
++
++    CM_RT_API virtual INT EnqueueWithHints( CmTask* pTask, CmEvent* & pEvent, UINT hints = 0) = 0;
++    CM_RT_API virtual INT EnqueueVebox( CmVebox* pVebox, CmEvent* & pEvent ) = 0;
++
++    CM_RT_API virtual INT EnqueueFast(CmTask *task,
++                              CmEvent *&event,
++                              const CmThreadSpace *threadSpace = nullptr) = 0;
++    CM_RT_API virtual INT DestroyEventFast(CmEvent *&event) = 0;
++    CM_RT_API virtual INT EnqueueWithGroupFast(CmTask *task,
++                                  CmEvent *&event,
++                                  const CmThreadGroupSpace *threadGroupSpace = nullptr) = 0;
++
++    CM_RT_API virtual int32_t EnqueueReadBuffer(CmBuffer* buffer, size_t offset, const unsigned char* sysMem, uint64_t sysMemSize, CmEvent* wait_event, CmEvent*& event, unsigned option) = 0;
++    CM_RT_API virtual int32_t EnqueueWriteBuffer(CmBuffer* buffer, size_t offset, const unsigned char* sysMem, uint64_t sysMemSize, CmEvent* wait_event, CmEvent*& event, unsigned option) = 0;
++
++    CM_RT_API virtual INT SetResidentGroupAndParallelThreadNum(uint32_t residentGroupNum, uint32_t parallelThreadNum) = 0;
++
++protected:
++    ~CmQueue(){};
++};
++
++//**********************************************************************
++// Function pointer types
++//**********************************************************************
++typedef void (CM_CALLBACK *callback_function)(CmEvent*, void *);
++typedef void (*IMG_WALKER_FUNTYPE)(void* img, void* arg);
++
++//**********************************************************************
++// OS-specific APIs and classes
++//**********************************************************************
++#include "cm_rt_api_os.h"
++
++//**********************************************************************
++// Functions declaration
++//**********************************************************************
++EXTERN_C CM_RT_API INT DestroyCmDevice(CmDevice* &device);
++EXTERN_C CM_RT_API INT CMRT_Enqueue(CmQueue* queue, CmTask* task, CmEvent** event, const CmThreadSpace* threadSpace = nullptr);
++EXTERN_C CM_RT_API const char* GetCmErrorString(int errCode);
++
++//**********************************************************************
++// Platfom specific definitions
++//**********************************************************************
++#include "cm_rt_g8.h"
++#include "cm_rt_g9.h"
++#include "cm_rt_g10.h"
++#include "cm_rt_g11.h"
++#include "cm_rt_g12_tgl.h"
++
++#endif //__CM_RT_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_api_os.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_api_os.h
+new file mode 100644
+index 000000000000..6a53b9c058e3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_api_os.h
+@@ -0,0 +1,220 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_api_os.h
++//! \brief     Contains Linux Specific APIs and Definitions for CM
++//!
++
++#ifndef __CM_RT_API_OS_H__
++#define __CM_RT_API_OS_H__
++
++class CmSurface2D
++{
++public:
++    CM_RT_API virtual INT GetIndex( SurfaceIndex*& pIndex ) = 0;
++
++    CM_RT_API virtual INT ReadSurface( unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT WriteSurface( const unsigned char* pSysMem, CmEvent* pEvent, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT ReadSurfaceStride( unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT WriteSurfaceStride( const unsigned char* pSysMem, CmEvent* pEvent, const UINT stride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL ) = 0;
++    CM_RT_API virtual INT InitSurface(const DWORD initValue, CmEvent* pEvent) = 0;
++
++    CM_RT_API virtual INT GetVaSurfaceID( VASurfaceID  &iVASurface) = 0;
++
++    CM_RT_API virtual INT ReadSurfaceHybridStrides( unsigned char* pSysMem, CmEvent* pEvent, const UINT iWidthStride, const UINT iHeightStride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL, UINT uiOption = 0 ) = 0;
++    CM_RT_API virtual INT WriteSurfaceHybridStrides( const unsigned char* pSysMem, CmEvent* pEvent, const UINT iWidthStride, const UINT iHeightStride, UINT64 sysMemSize = 0xFFFFFFFFFFFFFFFFULL, UINT uiOption = 0 ) = 0;
++    CM_RT_API virtual INT SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL option) = 0;
++    CM_RT_API virtual INT SetProperty(CM_FRAME_TYPE frameType) = 0;
++    CM_RT_API virtual INT SetSurfaceStateParam( SurfaceIndex *pSurfIndex, const CM_SURFACE2D_STATE_PARAM *pSSParam ) = 0;
++protected:
++    ~CmSurface2D(){}
++};
++
++class CmDevice
++{
++public:
++
++    CM_RT_API virtual INT CreateBuffer(UINT size, CmBuffer* & pSurface )=0;
++    CM_RT_API virtual INT CreateSurface2D(UINT width, UINT height, CM_SURFACE_FORMAT format, CmSurface2D* & pSurface ) = 0;
++    CM_RT_API virtual INT CreateSurface3D(UINT width, UINT height, UINT depth, CM_SURFACE_FORMAT format, CmSurface3D* & pSurface ) = 0;
++
++    CM_RT_API virtual INT CreateSurface2D( VASurfaceID iVASurface, CmSurface2D* & pSurface ) = 0;
++    CM_RT_API virtual INT CreateSurface2D( VASurfaceID* iVASurface, const UINT surfaceCount, CmSurface2D** pSurface ) = 0;
++
++    CM_RT_API virtual INT DestroySurface( CmBuffer* & pSurface) = 0;
++    CM_RT_API virtual INT DestroySurface( CmSurface2D* & pSurface) = 0;
++    CM_RT_API virtual INT DestroySurface( CmSurface3D* & pSurface) = 0;
++
++    CM_RT_API virtual INT CreateQueue( CmQueue* & pQueue) = 0;
++    CM_RT_API virtual INT LoadProgram( void* pCommonISACode, const UINT size, CmProgram*& pProgram, const char* options = nullptr ) = 0;
++    CM_RT_API virtual INT CreateKernel( CmProgram* pProgram, const char* kernelName, CmKernel* & pKernel, const char* options = nullptr) = 0;
++    CM_RT_API virtual INT CreateKernel( CmProgram* pProgram, const char* kernelName, const void * fncPnt, CmKernel* & pKernel, const char* options = nullptr) = 0;
++    CM_RT_API virtual INT CreateSampler( const CM_SAMPLER_STATE & sampleState, CmSampler* & pSampler ) = 0;
++
++    CM_RT_API virtual INT DestroyKernel( CmKernel*& pKernel) = 0;
++    CM_RT_API virtual INT DestroySampler( CmSampler*& pSampler ) = 0;
++    CM_RT_API virtual INT DestroyProgram( CmProgram*& pProgram ) = 0;
++    CM_RT_API virtual INT DestroyThreadSpace( CmThreadSpace* & pTS ) = 0;
++
++    CM_RT_API virtual INT CreateTask(CmTask *& pTask)=0;
++    CM_RT_API virtual INT DestroyTask(CmTask*& pTask)=0;
++
++    CM_RT_API virtual INT GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void* pCapValue ) = 0;
++
++    CM_RT_API virtual INT CreateThreadSpace( UINT width, UINT height, CmThreadSpace* & pTS ) = 0;
++
++    CM_RT_API virtual INT CreateBufferUP(UINT size, void* pSystMem, CmBufferUP* & pSurface )=0;
++    CM_RT_API virtual INT DestroyBufferUP( CmBufferUP* & pSurface) = 0;
++
++    CM_RT_API virtual INT GetSurface2DInfo( UINT width, UINT height, CM_SURFACE_FORMAT format, UINT & pitch, UINT & physicalSize)= 0;
++    CM_RT_API virtual INT CreateSurface2DUP( UINT width, UINT height, CM_SURFACE_FORMAT format, void* pSysMem, CmSurface2DUP* & pSurface )= 0;
++    CM_RT_API virtual INT DestroySurface2DUP( CmSurface2DUP* & pSurface) = 0;
++
++    CM_RT_API virtual INT CreateVmeSurfaceG7_5 ( CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex )=0;
++    CM_RT_API virtual INT DestroyVmeSurfaceG7_5( SurfaceIndex* & pVmeIndex ) = 0;
++    CM_RT_API virtual INT CreateSampler8x8(const CM_SAMPLER_8X8_DESCR  & smplDescr, CmSampler8x8*& psmplrState)=0;
++    CM_RT_API virtual INT DestroySampler8x8( CmSampler8x8*& pSampler )=0;
++    CM_RT_API virtual INT CreateSampler8x8Surface(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE address_mode = CM_SURFACE_CLAMP )=0;
++    CM_RT_API virtual INT DestroySampler8x8Surface(SurfaceIndex* & pDIIndex)=0;
++
++    CM_RT_API virtual INT CreateThreadGroupSpace( UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT grpSpaceWidth, UINT grpSpaceHeight, CmThreadGroupSpace*& pTGS ) = 0;
++    CM_RT_API virtual INT DestroyThreadGroupSpace(CmThreadGroupSpace*& pTGS) = 0;
++    CM_RT_API virtual INT SetL3Config(const L3ConfigRegisterValues *l3_c) = 0;
++    CM_RT_API virtual INT SetSuggestedL3Config( L3_SUGGEST_CONFIG l3_s_c) = 0;
++
++    CM_RT_API virtual INT SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* pCapValue) = 0;
++
++    CM_RT_API virtual INT CreateSamplerSurface2D(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
++    CM_RT_API virtual INT CreateSamplerSurface3D(CmSurface3D* p3DSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
++    CM_RT_API virtual INT DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex) = 0;
++
++    CM_RT_API virtual INT InitPrintBuffer(size_t printbufsize = 1048576) = 0;
++    CM_RT_API virtual INT FlushPrintBuffer() = 0;
++
++    CM_RT_API virtual INT CreateVebox( CmVebox* & pVebox ) = 0;
++    CM_RT_API virtual INT DestroyVebox( CmVebox* & pVebox ) = 0;
++
++    CM_RT_API virtual INT GetVaDpy(VADisplay* & pva_dpy) = 0;
++    CM_RT_API virtual INT CreateVaSurface2D( UINT width, UINT height, CM_SURFACE_FORMAT format, VASurfaceID & iVASurface, CmSurface2D* & pSurface) = 0;
++
++    CM_RT_API virtual INT CreateBufferSVM(UINT size, void* & pSystMem, uint32_t accessFlag, CmBufferSVM* & pSurface ) = 0;
++    CM_RT_API virtual INT DestroyBufferSVM( CmBufferSVM* & pSurface) = 0;
++    CM_RT_API virtual INT CreateSamplerSurface2DUP(CmSurface2DUP* p2DUPSurface, SurfaceIndex* & pSamplerSurfaceIndex) = 0;
++
++    CM_RT_API virtual INT CloneKernel( CmKernel * &pKernelDest, CmKernel * pKernelSrc ) = 0;
++
++    CM_RT_API virtual INT CreateSurface2DAlias(CmSurface2D* p2DSurface, SurfaceIndex* &aliasSurfaceIndex) = 0;
++
++    CM_RT_API virtual INT CreateHevcVmeSurfaceG10 ( CmSurface2D* pCurSurface, CmSurface2D** pForwardSurface, CmSurface2D** pBackwardSurface, const UINT surfaceCountForward, const UINT surfaceCountBackward, SurfaceIndex* & pVmeIndex )=0;
++    CM_RT_API virtual INT DestroyHevcVmeSurfaceG10( SurfaceIndex* & pVmeIndex )=0;
++    CM_RT_API virtual INT CreateSamplerEx( const CM_SAMPLER_STATE_EX & sampleState, CmSampler* & pSampler ) = 0;
++    CM_RT_API virtual INT FlushPrintBufferIntoFile(const char *filename) = 0;
++    CM_RT_API virtual INT CreateThreadGroupSpaceEx(UINT thrdSpaceWidth, UINT thrdSpaceHeight, UINT thrdSpaceDepth, UINT grpSpaceWidth, UINT grpSpaceHeight, UINT grpSpaceDepth, CmThreadGroupSpace*& pTGS) = 0;
++
++    CM_RT_API virtual INT CreateSampler8x8SurfaceEx(CmSurface2D* p2DSurface, SurfaceIndex* & pDIIndex, CM_SAMPLER8x8_SURFACE surf_type = CM_VA_SURFACE, CM_SURFACE_ADDRESS_CONTROL_MODE address_mode = CM_SURFACE_CLAMP, CM_FLAG* pFlag = nullptr) = 0;
++    CM_RT_API virtual INT CreateSamplerSurface2DEx(CmSurface2D* p2DSurface, SurfaceIndex* & pSamplerSurfaceIndex, CM_FLAG* pFlag = nullptr) = 0;
++    CM_RT_API virtual INT CreateBufferAlias(CmBuffer *pBuffer, SurfaceIndex* &pAliasIndex) = 0;
++
++    CM_RT_API virtual INT SetVmeSurfaceStateParam(SurfaceIndex* pVmeIndex, CM_VME_SURFACE_STATE_PARAM *pSSParam) = 0;
++
++    CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion, uint32_t& minorVersion) = 0;
++    CM_RT_API virtual int32_t CreateQueueEx(CmQueue *&pQueue, CM_QUEUE_CREATE_OPTION QueueCreateOption = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0;
++
++    CM_RT_API virtual INT CreateBufferStateless(size_t size,
++                                                uint32_t option,
++                                                void *sysMem,
++                                                CmBufferStateless *&pBufferStateless) = 0;
++    CM_RT_API virtual INT DestroyBufferStateless(CmBufferStateless *&pSurface) = 0;
++
++    CM_RT_API virtual int32_t DispatchTask() = 0;
++
++    CM_RT_API virtual INT CreateSurface2DStateless(uint32_t width,
++                                                   uint32_t height,
++                                                   uint32_t &pitch,
++                                                   CmSurface2DStateless *&pSurface) = 0;
++
++    CM_RT_API virtual int32_t DestroySurface2DStateless(CmSurface2DStateless *&pSurface) = 0;
++
++    //adding new functions in the bottom is a must
++protected:
++    ~CmDevice(){}
++};
++
++#ifndef __SURFACE_SAMPLER_INDEX_DEFINED__
++#define __SURFACE_SAMPLER_INDEX_DEFINED__
++
++class SurfaceIndex
++{
++public:
++    CM_NOINLINE SurfaceIndex() { index = 0; };
++    CM_NOINLINE SurfaceIndex(const SurfaceIndex& _src) { index = _src.index; };
++    CM_NOINLINE SurfaceIndex(const unsigned int& _n) { index = _n; };
++    CM_NOINLINE SurfaceIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; };
++    CM_NOINLINE SurfaceIndex& operator + (const unsigned int& _n) { this->index += _n; return *this; };
++    virtual unsigned int get_data(void) { return index; };
++
++    virtual ~SurfaceIndex(){};
++private:
++    unsigned int index;
++    unsigned char extra_byte; // an extra byte to align the object size among OSes
++};
++
++class SamplerIndex
++{
++public:
++    CM_NOINLINE SamplerIndex() { index = 0; };
++    CM_NOINLINE SamplerIndex(SamplerIndex& _src) { index = _src.get_data(); };
++    CM_NOINLINE SamplerIndex(const unsigned int& _n) { index = _n; };
++    CM_NOINLINE SamplerIndex& operator = (const unsigned int& _n) { this->index = _n; return *this; };
++    virtual unsigned int get_data(void) { return index; };
++
++    virtual ~SamplerIndex(){};
++private:
++    unsigned int index;
++    unsigned char extra_byte; // an extra byte to align the object size among OSes
++};
++
++#endif /* __SURFACE_SAMPLER_INDEX_DEFINED__ */
++typedef enum _AdapterInfoType
++{
++    Description,                    //    char Description[ 256 ];
++    VendorId,                       //    uint32_t VendorId;
++    DeviceId,                       //    uint32_t DeviceId;
++    SubSysId,                       //    uint32_t SubSysId;
++    Revision,                       //    uint32_t Revision;
++    DedicatedVideoMemory,           //    uint32_t DedicatedVideoMemory;
++    DedicatedSystemMemory,          //    uint32_t DedicatedSystemMemory;
++    SharedSystemMemory,             //    uint32_t SharedSystemMemory;
++    MaxThread,                      //    uint32_t hardware thread count
++    EuNumber,                       //    uint32_t EU count
++    TileNumber,                     //    uint32_t Tile count
++    Reserved                        //    uint32_t
++} AdapterInfoType;
++
++EXTERN_C CM_RT_API int32_t GetCmSupportedAdapters(uint32_t& count);
++EXTERN_C CM_RT_API int32_t QueryCmAdapterInfo(uint32_t AdapterIndex, AdapterInfoType infoName, void *info, uint32_t infoSize, uint32_t *OutInfoSize);
++EXTERN_C CM_RT_API int32_t CreateCmDeviceFromAdapter(CmDevice* &pCmDev, uint32_t& version, uint32_t AdapterIndex, uint32_t DevCreateOption = 0);
++
++EXTERN_C CM_RT_API INT CreateCmDevice(CmDevice* &device, UINT& version, VADisplay vaDisplay = nullptr);
++EXTERN_C CM_RT_API INT CreateCmDeviceEx(CmDevice* &device, UINT& version, VADisplay vaDisplay, UINT DevCreateOption = CM_DEVICE_CREATE_OPTION_DEFAULT);
++
++#endif //__CM_RT_API_OS_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_def_os.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_def_os.h
+new file mode 100644
+index 000000000000..52d33197c824
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_def_os.h
+@@ -0,0 +1,378 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_def_os.h
++//! \brief     Contains linux-specific Definitions for CM
++//!
++
++#ifndef __CM_RT_DEF_OS_H__
++#define __CM_RT_DEF_OS_H__
++
++#include <time.h>
++#include <va/va.h>
++
++#define _tmain main
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <stdint.h>
++#include <math.h>
++#include <malloc.h>
++#include <string.h>
++#include <sys/time.h>
++#include <pthread.h>
++#include <x86intrin.h>
++#include <iostream>
++
++#ifndef CM_NOINLINE
++    #define CM_NOINLINE __attribute__((noinline)) 
++#endif
++
++typedef int BOOL;
++typedef char byte;
++typedef unsigned char BYTE;
++typedef unsigned int UINT32;
++typedef UINT32 DWORD;
++typedef int INT;
++typedef unsigned int UINT;
++typedef signed char INT8;
++typedef unsigned char UINT8;
++typedef signed short INT16;
++typedef unsigned short UINT16;
++typedef signed int INT32;
++typedef signed long long INT64;
++typedef unsigned long long UINT64;
++
++typedef enum _VACMTEXTUREADDRESS {
++    VACMTADDRESS_WRAP            = 1,
++    VACMTADDRESS_MIRROR          = 2,
++    VACMTADDRESS_CLAMP           = 3,
++    VACMTADDRESS_BORDER          = 4,
++    VACMTADDRESS_MIRRORONCE      = 5,
++
++    VACMTADDRESS_FORCE_DWORD     = 0x7fffffff
++} VACMTEXTUREADDRESS;
++
++typedef enum _VACMTEXTUREFILTERTYPE {
++    VACMTEXF_NONE            = 0,
++    VACMTEXF_POINT           = 1,
++    VACMTEXF_LINEAR          = 2,
++    VACMTEXF_ANISOTROPIC     = 3,
++    VACMTEXF_FLATCUBIC       = 4,
++    VACMTEXF_GAUSSIANCUBIC   = 5,
++    VACMTEXF_PYRAMIDALQUAD   = 6,
++    VACMTEXF_GAUSSIANQUAD    = 7,
++    VACMTEXF_CONVOLUTIONMONO = 8,    // Convolution filter for monochrome textures
++    VACMTEXF_FORCE_DWORD     = 0x7fffffff
++} VACMTEXTUREFILTERTYPE;
++
++#define CM_ATTRIBUTE(attribute) __attribute__((attribute))
++
++typedef enum _VA_CM_FORMAT {
++
++    VA_CM_FMT_UNKNOWN              =   0,
++
++    VA_CM_FMT_A8R8G8B8             =  21,
++    VA_CM_FMT_X8R8G8B8             =  22,
++    VA_CM_FMT_A8                   =  28,
++    VA_CM_FMT_A2B10G10R10          =  31,
++    VA_CM_FMT_A8B8G8R8             =  32,
++    VA_CM_FMT_R16G16UN             =  35,
++    VA_CM_FMT_A16B16G16R16         =  36,
++    VA_CM_FMT_A8P8                 =  40,
++    VA_CM_FMT_P8                   =  41,
++    VA_CM_FMT_R32U                 =  42,
++    VA_CM_FMT_R8G8UN               =  49,
++    VA_CM_FMT_L8                   =  50,
++    VA_CM_FMT_A8L8                 =  51,
++    VA_CM_FMT_R16UN                =  56,
++    VA_CM_FMT_R16U                 =  57,
++    VA_CM_FMT_V8U8                 =  60,
++    VA_CM_FMT_R8UN                 =  61,
++    VA_CM_FMT_R8U                  =  62,
++    VA_CM_FMT_R32S                 =  71,
++    VA_CM_FMT_D16                  =  80,
++    VA_CM_FMT_L16                  =  81,
++    VA_CM_FMT_R16F                 = 111,
++    VA_CM_FMT_IA44                 = 112,
++    VA_CM_FMT_A16B16G16R16F        = 113,
++    VA_CM_FMT_R32F                 = 114,
++    VA_CM_FMT_R32G32B32A32F        = 115,
++    VA_CM_FMT_I420                 =  VA_FOURCC('I','4','2','0'),
++    VA_CM_FMT_P216                 =  VA_FOURCC('P','2','1','6'),
++    VA_CM_FMT_400P                 =  VA_FOURCC('4','0','0','P'),
++    VA_CM_FMT_Y8UN                 =  VA_FOURCC('Y','8','U','N'),
++    VA_CM_FMT_NV12                 =  VA_FOURCC_NV12,
++    VA_CM_FMT_UYVY                 =  VA_FOURCC_UYVY,
++    VA_CM_FMT_YUY2                 =  VA_FOURCC_YUY2,
++    VA_CM_FMT_444P                 =  VA_FOURCC_444P,
++    VA_CM_FMT_411P                 =  VA_FOURCC_411P,
++    VA_CM_FMT_422H                 =  VA_FOURCC_422H,
++    VA_CM_FMT_422V                 =  VA_FOURCC_422V,
++    VA_CM_FMT_411R                 =  VA_FOURCC_411R,
++    VA_CM_FMT_RGBP                 =  VA_FOURCC_RGBP,
++    VA_CM_FMT_BGRP                 =  VA_FOURCC_BGRP,
++    VA_CM_FMT_IMC3                 =  VA_FOURCC_IMC3,
++    VA_CM_FMT_YV12                 =  VA_FOURCC_YV12,
++    VA_CM_FMT_P010                 =  VA_FOURCC_P010,
++    VA_CM_FMT_P012                 =  VA_FOURCC_P012,
++    VA_CM_FMT_P016                 =  VA_FOURCC_P016,
++    VA_CM_FMT_P208                 =  VA_FOURCC_P208,
++    VA_CM_FMT_AYUV                 =  VA_FOURCC_AYUV,
++    VA_CM_FMT_Y210                 =  VA_FOURCC_Y210,
++    VA_CM_FMT_Y410                 =  VA_FOURCC_Y410,
++    VA_CM_FMT_Y216                 =  VA_FOURCC_Y216,
++    VA_CM_FMT_Y416                 =  VA_FOURCC_Y416,
++    VA_CM_FMT_AI44                 =  VA_FOURCC_AI44,
++
++    VA_CM_FMT_MAX                  =  0xFFFFFFFF
++} VA_CM_FORMAT;
++
++template<typename T>
++inline const char * CM_TYPE_NAME_UNMANGLED();
++
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<char>() { return "char"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<signed char>() { return "signed char"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned char>() { return "unsigned char"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<short>() { return "short"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned short>() { return "unsigned short"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<int>() { return "int"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned int>() { return "unsigned int"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<long>() { return "long"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned long>() { return "unsigned long"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<float>() { return "float"; }
++template<> inline const char * CM_TYPE_NAME_UNMANGLED<double>() { return "double"; }
++
++#define CM_TYPE_NAME(type)   CM_TYPE_NAME_UNMANGLED<type>()
++
++inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment) 
++{
++  return memalign(alignment, size);
++} 
++
++inline void CM_ALIGNED_FREE(void * memory) 
++{
++  free(memory);
++}
++
++//multi-thread API: 
++#define THREAD_HANDLE pthread_t
++inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg) 
++{
++    int err = 0;
++    err = pthread_create(handle , NULL, (void * (*)(void *))start_routine, arg);
++    if (err) {
++        printf(" cm create thread failed! \n");
++        exit(-1);
++    }
++}
++inline void CM_THREAD_EXIT(void * retval) 
++{
++    pthread_exit(retval);
++}
++
++inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt) 
++{
++    void *tret;
++    for(int i = 0; i < thread_cnt; i++)
++    {
++        pthread_join( handle_array[i], &tret);
++    }
++    return 0;
++}
++
++#define CM_SURFACE_FORMAT                       VA_CM_FORMAT
++
++#define CM_SURFACE_FORMAT_UNKNOWN               VA_CM_FMT_UNKNOWN
++#define CM_SURFACE_FORMAT_A8R8G8B8              VA_CM_FMT_A8R8G8B8
++#define CM_SURFACE_FORMAT_X8R8G8B8              VA_CM_FMT_X8R8G8B8
++#define CM_SURFACE_FORMAT_A8B8G8R8              VA_CM_FMT_A8B8G8R8
++#define CM_SURFACE_FORMAT_A8                    VA_CM_FMT_A8
++#define CM_SURFACE_FORMAT_P8                    VA_CM_FMT_P8
++#define CM_SURFACE_FORMAT_R32F                  VA_CM_FMT_R32F
++#define CM_SURFACE_FORMAT_NV12                  VA_CM_FMT_NV12
++#define CM_SURFACE_FORMAT_UYVY                  VA_CM_FMT_UYVY
++#define CM_SURFACE_FORMAT_YUY2                  VA_CM_FMT_YUY2
++#define CM_SURFACE_FORMAT_V8U8                  VA_CM_FMT_V8U8
++
++#define CM_SURFACE_FORMAT_R8_UINT               VA_CM_FMT_R8U
++#define CM_SURFACE_FORMAT_R16_UINT              VA_CM_FMT_R16U
++#define CM_SURFACE_FORMAT_R16_SINT              VA_CM_FMT_A8L8
++#define CM_SURFACE_FORMAT_D16                   VA_CM_FMT_D16
++#define CM_SURFACE_FORMAT_L16                   VA_CM_FMT_L16
++#define CM_SURFACE_FORMAT_A16B16G16R16          VA_CM_FMT_A16B16G16R16
++#define CM_SURFACE_FORMAT_R10G10B10A2           VA_CM_FMT_A2B10G10R10 
++#define CM_SURFACE_FORMAT_A16B16G16R16F         VA_CM_FMT_A16B16G16R16F
++#define CM_SURFACE_FORMAT_R32G32B32A32F         VA_CM_FMT_R32G32B32A32F
++
++#define CM_SURFACE_FORMAT_444P                  VA_CM_FMT_444P
++#define CM_SURFACE_FORMAT_422H                  VA_CM_FMT_422H
++#define CM_SURFACE_FORMAT_422V                  VA_CM_FMT_422V
++#define CM_SURFACE_FORMAT_411P                  VA_CM_FMT_411P
++#define CM_SURFACE_FORMAT_411R                  VA_CM_FMT_411R
++#define CM_SURFACE_FORMAT_RGBP                  VA_CM_FMT_RGBP
++#define CM_SURFACE_FORMAT_BGRP                  VA_CM_FMT_BGRP
++#define CM_SURFACE_FORMAT_IMC3                  VA_CM_FMT_IMC3
++#define CM_SURFACE_FORMAT_YV12                  VA_CM_FMT_YV12
++#define CM_SURFACE_FORMAT_P010                  VA_CM_FMT_P010
++#define CM_SURFACE_FORMAT_P016                  VA_CM_FMT_P016
++#define CM_SURFACE_FORMAT_P208                  VA_CM_FMT_P208
++#define CM_SURFACE_FORMAT_AYUV                  VA_CM_FMT_AYUV
++#define CM_SURFACE_FORMAT_Y210                  VA_CM_FMT_Y210
++#define CM_SURFACE_FORMAT_Y410                  VA_CM_FMT_Y410
++#define CM_SURFACE_FORMAT_Y216                  VA_CM_FMT_Y216
++#define CM_SURFACE_FORMAT_Y416                  VA_CM_FMT_Y416
++
++#define CM_SURFACE_FORMAT_IA44                  VA_CM_FMT_IA44
++#define CM_SURFACE_FORMAT_AI44                  VA_CM_FMT_AI44
++#define CM_SURFACE_FORMAT_I420                  VA_CM_FMT_I420
++#define CM_SURFACE_FORMAT_P216                  VA_CM_FMT_P216
++#define CM_SURFACE_FORMAT_400P                  VA_CM_FMT_400P
++#define CM_SURFACE_FORMAT_R16_FLOAT             VA_CM_FMT_R16F
++#define CM_SURFACE_FORMAT_Y8_UNORM              VA_CM_FMT_Y8UN
++#define CM_SURFACE_FORMAT_A8P8                  VA_CM_FMT_A8P8
++#define CM_SURFACE_FORMAT_R32_SINT              VA_CM_FMT_R32S
++#define CM_SURFACE_FORMAT_R32_UINT              VA_CM_FMT_R32U
++#define CM_SURFACE_FORMAT_R8G8_UNORM            VA_CM_FMT_R8G8UN
++#define CM_SURFACE_FORMAT_R8_UNORM              VA_CM_FMT_R8UN
++#define CM_SURFACE_FORMAT_R16G16_UNORM          VA_CM_FMT_R16G16UN
++#define CM_SURFACE_FORMAT_R16_UNORM             VA_CM_FMT_R16UN
++
++
++#define CM_TEXTURE_ADDRESS_TYPE                 VACMTEXTUREADDRESS
++#define CM_TEXTURE_ADDRESS_WRAP                 VACMTADDRESS_WRAP
++#define CM_TEXTURE_ADDRESS_MIRROR               VACMTADDRESS_MIRROR
++#define CM_TEXTURE_ADDRESS_CLAMP                VACMTADDRESS_CLAMP
++#define CM_TEXTURE_ADDRESS_BORDER               VACMTADDRESS_BORDER
++#define CM_TEXTURE_ADDRESS_MIRRORONCE           VACMTADDRESS_MIRRORONCE
++
++#define CM_TEXTURE_FILTER_TYPE                  VACMTEXTUREFILTERTYPE
++#define CM_TEXTURE_FILTER_TYPE_NONE             VACMTEXF_NONE
++#define CM_TEXTURE_FILTER_TYPE_POINT            VACMTEXF_POINT
++#define CM_TEXTURE_FILTER_TYPE_LINEAR           VACMTEXF_LINEAR
++#define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC      VACMTEXF_ANISOTROPIC
++#define CM_TEXTURE_FILTER_TYPE_FLATCUBIC        VACMTEXF_FLATCUBIC
++#define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC    VACMTEXF_GAUSSIANCUBIC
++#define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD    VACMTEXF_PYRAMIDALQUAD
++#define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD     VACMTEXF_GAUSSIANQUAD
++#define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO  VACMTEXF_CONVOLUTIONMONO
++
++/* Surrport for common-used data type */
++#define  _TCHAR char
++#define __cdecl 
++#ifndef TRUE
++#define TRUE 1
++#endif
++
++typedef int HKEY;
++
++typedef unsigned int uint;
++typedef unsigned int* PUINT;
++
++typedef float FLOAT;
++typedef unsigned long long DWORDLONG;
++#ifndef ULONG_PTR 
++    #define ULONG_PTR unsigned long 
++#endif 
++
++/* Handle Type */
++typedef void *HMODULE;
++typedef void *HINSTANCE;
++typedef int HANDLE;
++typedef void *PVOID;
++typedef int WINBOOL;
++typedef BOOL *PBOOL;
++typedef unsigned long ULONG;
++typedef ULONG *PULONG;
++typedef unsigned short USHORT;
++typedef USHORT *PUSHORT;
++typedef unsigned char UCHAR;
++typedef UCHAR *PUCHAR;
++typedef char CHAR;
++typedef short SHORT;
++typedef long LONG;
++typedef double DOUBLE;
++
++#define __int8 char
++#define __int16 short
++#define __int32 int
++#define __int64 long long
++
++typedef unsigned short WORD;
++typedef float FLOAT;
++typedef FLOAT *PFLOAT;
++typedef BYTE *PBYTE;
++typedef int *PINT;
++typedef WORD *PWORD;
++typedef DWORD *PDWORD;
++typedef unsigned int *PUINT;
++typedef LONG HRESULT;
++typedef long long LONGLONG; 
++
++typedef union _LARGE_INTEGER {
++    struct {
++        uint32_t LowPart;
++        int32_t HighPart;
++    } u;
++    int64_t QuadPart;
++} LARGE_INTEGER;
++
++//Performance
++EXTERN_C INT QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
++EXTERN_C INT QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);    
++
++struct BITMAPFILEHEADER
++{
++  WORD  bfType;
++  DWORD bfSize;
++  WORD  bfReserved1;
++  WORD  bfReserved2;
++  DWORD bfOffBits;
++}  __attribute__((packed)) ;
++
++struct BITMAPINFOHEADER
++{
++  DWORD biSize;
++  DWORD  biWidth;
++  DWORD  biHeight;
++  WORD  biPlanes;
++  WORD  biBitCount;
++  DWORD biCompression;
++  DWORD biSizeImage;
++  DWORD  biXPelsPerMeter;
++  DWORD  biYPelsPerMeter;
++  DWORD biClrUsed;
++  DWORD biClrImportant;
++};
++
++struct RGBQUAD 
++{
++  BYTE rgbBlue;
++  BYTE rgbGreen;
++  BYTE rgbRed;
++  BYTE rgbReserved;
++};
++
++#define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__
++#define _NAME(...) #__VA_ARGS__
++
++#endif //__CM_RT_DEF_OS_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_extension.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_extension.h
+new file mode 100644
+index 000000000000..2a335e8c89ae
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_extension.h
+@@ -0,0 +1 @@
++//empty file for future implementation
+\ No newline at end of file
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g10.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g10.h
+new file mode 100644
+index 000000000000..d861172dc9c3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g10.h
+@@ -0,0 +1,70 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_g10.h
++//! \brief     Contains Definitions for CM on Gen 10
++//!
++
++#ifndef __CM_RT_G10_H__
++#define __CM_RT_G10_H__
++
++#include "cm_hw_vebox_cmd_g10.h"
++
++#define CNL_L3_PLANE_DEFAULT    CM_L3_PLANE_DEFAULT
++#define CNL_L3_PLANE_1          CM_L3_PLANE_1
++#define CNL_L3_PLANE_2          CM_L3_PLANE_2
++#define CNL_L3_PLANE_3          CM_L3_PLANE_3
++#define CNL_L3_PLANE_4          CM_L3_PLANE_4
++#define CNL_L3_PLANE_5          CM_L3_PLANE_5
++#define CNL_L3_PLANE_6          CM_L3_PLANE_6
++#define CNL_L3_PLANE_7          CM_L3_PLANE_7
++#define CNL_L3_PLANE_8          CM_L3_PLANE_8
++#define CNL_L3_CONFIG_COUNT     9
++
++static const L3ConfigRegisterValues CNL_L3_PLANES[CNL_L3_CONFIG_COUNT] =
++{                            // SLM  URB  Rest  DC   RO   Sum (in KB)
++    {0, 0, 0, 0x80000080},   // 0    128  128   0    0    256
++    {0, 0, 0, 0x418080},     // 0    128  0     32   96   256
++    {0, 0, 0, 0x420060},     // 0    96   0     32   128  256
++    {0, 0, 0, 0x30040},      // 0    64   0     0    192  256
++    {0, 0, 0, 0xC0000040},   // 0    64   192   0    0    256
++    {0, 0, 0, 0x428040},     // 0    64   0     32   160  256
++    {0, 0, 0, 0xA0000021},   // 32   32   160   0    0    256
++    {0, 0, 0, 0x1008021},    // 32   32   0     128  32   256
++    {0, 0, 0, 0xC0000001}    // 32   0    192   0    0    256
++};
++
++typedef struct __CM_VEBOX_PARAM_G10
++{
++    unsigned char                padding1[4024];
++    unsigned char                padding2[3732];
++    PVEBOX_GAMUT_STATE_G75       pGamutState;
++    unsigned char                padding3[3936];
++    PVEBOX_VERTEX_TABLE_G75      pVertexTable;
++    unsigned char                padding4[2048];
++
++    CmHwVeboxCmdG10::VEBOX_CAPTURE_PIPE_STATE_CMD *pCapturePipe;
++    CmHwVeboxCmdG10::VEBOX_DNDI_STATE_CMD         *pDndiState;
++    CmHwVeboxCmdG10::VEBOX_IECP_STATE_CMD         *pIecpState;
++}CM_VEBOX_PARAM_G10, PCM_VEBOX_PARAM_G10;
++
++#endif //__CM_RT_G10_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g11.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g11.h
+new file mode 100644
+index 000000000000..96fcd1dc44d6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g11.h
+@@ -0,0 +1,62 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_g11.h
++//! \brief     Contains Definitions for CM on Gen 11
++//!
++
++#ifndef __CM_RT_G11_H__
++#define __CM_RT_G11_H__
++
++#define ICL_L3_PLANE_DEFAULT    CM_L3_PLANE_DEFAULT
++#define ICL_L3_PLANE_1          CM_L3_PLANE_1
++#define ICL_L3_PLANE_2          CM_L3_PLANE_2
++#define ICL_L3_PLANE_3          CM_L3_PLANE_3
++#define ICL_L3_PLANE_4          CM_L3_PLANE_4
++#define ICL_L3_PLANE_5          CM_L3_PLANE_5
++#define ICL_L3_CONFIG_COUNT     6
++
++#define ICLLP_L3_PLANE_DEFAULT  CM_L3_PLANE_DEFAULT
++#define ICLLP_L3_PLANE_1        CM_L3_PLANE_1
++#define ICLLP_L3_PLANE_2        CM_L3_PLANE_2
++#define ICLLP_L3_PLANE_3        CM_L3_PLANE_3
++#define ICLLP_L3_PLANE_4        CM_L3_PLANE_4
++#define ICLLP_L3_PLANE_5        CM_L3_PLANE_5
++#define ICLLP_L3_PLANE_6        CM_L3_PLANE_6
++#define ICLLP_L3_PLANE_7        CM_L3_PLANE_7
++#define ICLLP_L3_PLANE_8        CM_L3_PLANE_8
++#define ICLLP_L3_CONFIG_COUNT   9
++
++static const L3ConfigRegisterValues ICLLP_L3_PLANES[ICLLP_L3_CONFIG_COUNT] =
++{                                    //  URB  Rest  DC  RO   Z    Color  UTC  CB  Sum (in KB)
++    {0x80000080, 0xD,        0, 0},  //  128  128   0   0    0    0      0    0   256
++    {0x70000080, 0x40804D,   0, 0},  //  128  112   0   0    64   64     0    16  384
++    {0x41C060,   0x40804D,   0, 0},  //  96   0     32  112  64   64     0    16  384
++    {0x2C040,    0x20C04D,   0, 0},  //  64   0     0   176  32   96     0    16  384
++    {0x30000040, 0x81004D,   0, 0},  //  64   48    0   0    128  128    0    16  384
++    {0xC040,     0x8000004D, 0, 0},  //  64   0     0   48   0    0      256  16  384
++    {0xA0000420, 0xD,        0, 0},  //  64   320   0   0    0    0      0    0   384
++    {0xC0000040, 0x4000000D, 0, 0},  //  64   192   0   0    0    0      128  0   384
++    {0xB0000040, 0x4000004D, 0, 0},  //  64   176   0   0    0    0      128  16  384
++};
++
++#endif //__CM_RT_G11_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g12_tgl.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g12_tgl.h
+new file mode 100644
+index 000000000000..3d223bfe7df6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g12_tgl.h
+@@ -0,0 +1,51 @@
++/*
++* Copyright (c) 2019, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_g12_tgl.h
++//! \brief     Contains Definitions for CM on Gen 12 TGL
++//!
++
++#ifndef __CM_RT_G12_TGL_H__
++#define __CM_RT_G12_TGL_H__
++
++#define TGL_L3_PLANE_DEFAULT    CM_L3_PLANE_DEFAULT
++#define TGL_L3_PLANE_1          CM_L3_PLANE_1
++#define TGL_L3_PLANE_2          CM_L3_PLANE_2
++#define TGL_L3_PLANE_3          CM_L3_PLANE_3
++#define TGL_L3_PLANE_4          CM_L3_PLANE_4
++#define TGL_L3_PLANE_5          CM_L3_PLANE_5
++#define TGL_L3_PLANE_6          CM_L3_PLANE_6
++#define TGL_L3_CONFIG_COUNT     7
++
++
++static const L3ConfigRegisterValues TGL_L3_PLANES[TGL_L3_CONFIG_COUNT] =
++{                                    //  URB  Rest  DC  RO   Z    Color  UTC  CB  Sum (in KB)
++    {0xD0000020, 0x4,        0, 0},  //  64   416   0   0    0    0      0    0   480
++    {0x78000040, 0x306044,   0, 0},  //  128  240   0   0    48   48     0    16  480
++    {0x21E020,   0x408044,   0, 0},  //  64   0     32  240  64   64     0    16  480
++    {0x48000020, 0x810044,   0, 0},  //  64   144   0   0    128  128    0    16  480
++    {0x18000020, 0xB0000044, 0, 0},  //  64   48    0   0    0    0      352  16  480
++    {0x88000020, 0x40000044, 0, 0},  //  64   272   0   0    0    0      128  16  480
++    {0xC8000020, 0x44,       0, 0},  //  64   400   0   0    0    0      0    16  480
++};
++
++#endif //__CM_RT_G12_TGL_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g8.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g8.h
+new file mode 100644
+index 000000000000..19c7916b3aff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g8.h
+@@ -0,0 +1,3742 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_g8.h
++//! \brief     Contains Definitions for CM on Gen 8
++//!
++
++#ifndef __CM_RT_G8_H__
++#define __CM_RT_G8_H__
++
++#define BDW_L3_PLANE_DEFAULT    CM_L3_PLANE_DEFAULT
++#define BDW_L3_PLANE_1          CM_L3_PLANE_1
++#define BDW_L3_PLANE_2          CM_L3_PLANE_2
++#define BDW_L3_PLANE_3          CM_L3_PLANE_3
++#define BDW_L3_PLANE_4          CM_L3_PLANE_4
++#define BDW_L3_PLANE_5          CM_L3_PLANE_5
++#define BDW_L3_PLANE_6          CM_L3_PLANE_6
++#define BDW_L3_PLANE_7          CM_L3_PLANE_7
++#define BDW_L3_CONFIG_COUNT     8
++
++#define BDW_SLM_PLANE_DEFAULT = BDW_L3_PLANE_5
++
++static const L3ConfigRegisterValues BDW_L3_PLANE[BDW_L3_CONFIG_COUNT] =
++{                                                 // SLM    URB   Rest     DC     RO     I/S    C    T      Sum ( BDW GT2; for GT1, half of the values; for GT3, double the values )
++    { 0, 0, 0, 0x60000060 },                      //{  0,   384,    384,     0,     0,    0,    0,    0,    768},
++    { 0, 0, 0, 0x00410060 },                      //{  0,   384,      0,   128,   256,    0,    0,    0,    768},
++    { 0, 0, 0, 0x00418040 },                      //{  0,   256,      0,   128,   384,    0,    0,    0,    768},
++    { 0, 0, 0, 0x00020040 },                      //{  0,   256,      0,     0,   512,    0,    0,    0,    768},
++    { 0, 0, 0, 0x80000040 },                      //{  0,   256,    512,     0,     0,    0,    0,    0,    768},
++    { 0, 0, 0, 0x60000021 },                      //{192,   128,    384,     0,     0,    0,    0,    0,    768},
++    { 0, 0, 0, 0x00410021 },                      //{192,   128,      0,   128,   256,    0,    0,    0,    768},
++    { 0, 0, 0, 0x00808021 }                       //{192,   128,      0,   256,   128,    0,    0,    0,    768}
++};
++
++// Defined in vol2b "Media"
++typedef struct _VEBOX_DNDI_STATE_G75
++{
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       DWordLength                         : 12;
++            DWORD                                           : 4;
++            DWORD       InstructionSubOpcodeB               : 5;
++            DWORD       InstructionSubOpcodeA               : 3;
++            DWORD       InstructionOpcode                   : 3;
++            DWORD       InstructionPipeline                 : 2;
++            DWORD       CommandType                         : 3;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       DenoiseASDThreshold                 : 8; // U8
++            DWORD       DnmhDelta                           : 4; // UINT4
++            DWORD                                           : 4; // Reserved
++            DWORD       DnmhHistoryMax                      : 8; // U8
++            DWORD       DenoiseSTADThreshold                : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++            DWORD       SCMDenoiseThreshold                 : 8; // U8
++            DWORD       DenoiseMovingPixelThreshold         : 5; // U5
++            DWORD       STMMC2                              : 3; // U3
++            DWORD       LowTemporalDifferenceThreshold      : 6; // U6
++            DWORD                                           : 2; // Reserved
++            DWORD       TemporalDifferenceThreshold         : 6; // U6
++            DWORD                                           : 2; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // DWORD 3
++    union
++    {
++        struct
++        {
++            DWORD       BlockNoiseEstimateNoiseThreshold    : 8; // U8
++            DWORD       BneEdgeTh                           : 4; // UINT4
++            DWORD                                           : 2; // Reserved
++            DWORD       SmoothMvTh                          : 2; // U2
++            DWORD       SADTightTh                          : 4; // U4
++            DWORD       CATSlopeMinus1                      : 4; // U4
++            DWORD       GoodNeighborThreshold               : 6; // UINT6
++            DWORD                                           : 2; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW3;
++
++    // DWORD 4
++    union
++    {
++        struct
++        {
++            DWORD       MaximumSTMM                         : 8; // U8
++            DWORD       MultiplierforVECM                   : 6; // U6
++            DWORD                                           : 2;
++            DWORD       BlendingConstantForSmallSTMM        : 8; // U8
++            DWORD       BlendingConstantForLargeSTMM        : 7; // U7
++            DWORD       STMMBlendingConstantSelect          : 1; // U1
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW4;
++
++    // DWORD 5
++    union
++    {
++        struct
++        {
++            DWORD       SDIDelta                            : 8; // U8
++            DWORD       SDIThreshold                        : 8; // U8
++            DWORD       STMMOutputShift                     : 4; // U4
++            DWORD       STMMShiftUp                         : 2; // U2
++            DWORD       STMMShiftDown                       : 2; // U2
++            DWORD       MinimumSTMM                         : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW5;
++
++    // DWORD 6
++    union
++    {
++        struct
++        {
++            DWORD       FMDTemporalDifferenceThreshold      : 8; // U8
++            DWORD       SDIFallbackMode2Constant            : 8; // U8
++            DWORD       SDIFallbackMode1T2Constant          : 8; // U8
++            DWORD       SDIFallbackMode1T1Constant          : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW6;
++
++    // DWORD 7
++    union
++    {
++        struct
++        {
++            DWORD                                           : 3; // Reserved
++            DWORD       DNDITopFirst                        : 1; // Enable
++            DWORD                                           : 2; // Reserved
++            DWORD       ProgressiveDN                       : 1; // Enable
++            DWORD       MCDIEnable                          : 1;
++            DWORD       FMDTearThreshold                    : 6; // U6
++            DWORD       CATTh1                              : 2; // U2
++            DWORD       FMD2VerticalDifferenceThreshold     : 8; // U8
++            DWORD       FMD1VerticalDifferenceThreshold     : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW7;
++
++    // DWORD 8
++    union
++    {
++        struct
++        {
++            DWORD       SADTHA                              : 4; // U4
++            DWORD       SADTHB                              : 4; // U4
++            DWORD       FMDFirstFieldCurrentFrame           : 2; // U2
++            DWORD       MCPixelConsistencyTh                : 6; // U6
++            DWORD       FMDSecondFieldPreviousFrame         : 2; // U2
++            DWORD                                           : 1; // Reserved
++            DWORD       NeighborPixelTh                     : 4; // U4
++            DWORD       DnmhHistoryInit                     : 6; // U6
++            DWORD                                           : 3; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW8;
++
++    // DWORD 9
++    union
++    {
++        struct
++        {
++            DWORD       ChromaLTDThreshold                  : 6; // U6
++            DWORD       ChromaTDTheshold                    : 6; // U6
++            DWORD       ChromaDenoiseEnable                 : 1; // Enable
++            DWORD                                           : 3; // Reserved
++            DWORD       ChromaDnSTADThreshold               : 8; // U8
++            DWORD                                           : 8; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW9;
++
++    // Padding for 32-byte alignment, VEBOX_DNDI_STATE_G75 is 10 DWORDs
++    DWORD dwPad[6];
++} VEBOX_DNDI_STATE_G75, *PVEBOX_DNDI_STATE_G75;
++
++// Defined in vol2b "Media"
++typedef struct _VEBOX_IECP_STATE_G75
++{
++    // STD/STE state
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       STDEnable                       : 1;    
++            DWORD       STEEnable                       : 1;    
++            DWORD       OutputCtrl                      : 1;    
++            DWORD                                       : 1;    
++            DWORD       SatMax                          : 6;    // U6;
++            DWORD       HueMax                          : 6;    // U6;
++            DWORD       UMid                            : 8;    // U8;
++            DWORD       VMid                            : 8;    // U8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       SinAlpha                        : 8;    // S0.7
++            DWORD                                       : 2; 
++            DWORD       CosAlpha                        : 8;    // S0.7    
++            DWORD       HSMargin                        : 3;    // U3   
++            DWORD       DiamondDu                       : 7;    // S7    
++            DWORD       DiamondMargin                   : 3;    // U3    
++            DWORD                                       : 1;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++            DWORD       DiamondDv                       : 7;    // S7  
++            DWORD       DiamondTh                       : 6;    // U6  
++            DWORD       DiamondAlpha                    : 8;    // U2.6  
++            DWORD                                       : 11;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // DWORD 3
++    union
++    {
++        struct
++        {
++            DWORD                                       : 7;  
++            DWORD       VYSTDEnable                     : 1;    
++            DWORD       YPoint1                         : 8;    // U8   
++            DWORD       YPoint2                         : 8;    // U8   
++            DWORD       YPoint3                         : 8;    // U8   
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW3;
++
++    // DWORD 4
++    union
++    {
++        struct
++        {
++            DWORD       YPoint4                         : 8;    // U8
++            DWORD       YSlope1                         : 5;    // U2.3
++            DWORD       YSlope2                         : 5;    // U2.3
++            DWORD                                       : 14;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW4;
++
++    // DWORD 5
++    union
++    {
++        struct
++        {
++            DWORD       INVMarginVYL                    : 16;    // U0.16
++            DWORD       INVSkinTypesMargin              : 16;    // U0.16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW5;
++
++    // DWORD 6
++    union
++    {
++        struct
++        {
++            DWORD       INVMarginVYU                    : 16;    // U0.16
++            DWORD       P0L                             : 8;     // U8
++            DWORD       P1L                             : 8;     // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW6;
++
++    // DWORD 7
++    union
++    {
++        struct
++        {
++            DWORD       P2L                             : 8;     // U8
++            DWORD       P3L                             : 8;     // U8
++            DWORD       B0L                             : 8;     // U8
++            DWORD       B1L                             : 8;     // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW7;
++
++    // DWORD 8
++    union
++    {
++        struct
++        {
++            DWORD       B2L                             : 8;     // U8
++            DWORD       B3L                             : 8;     // U8
++            DWORD       S0L                             : 11;    // S2.8
++            DWORD                                       : 5;     
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW8;
++
++    // DWORD 9
++    union
++    {
++        struct
++        {
++            DWORD       S1L                             : 11;    // S2.8
++            DWORD       S2L                             : 11;    // S2.8
++            DWORD                                       : 10;     
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW9;
++
++    // DWORD 10
++    union
++    {
++        struct
++        {
++            DWORD       S3L                             : 11;    // S2.8
++            DWORD       P0U                             : 8;     // U8
++            DWORD       P1U                             : 8;     // U8
++            DWORD                                       : 5;     
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW10;
++
++    // DWORD 11
++    union
++    {
++        struct
++        {
++            DWORD       P2U                             : 8;     // U8
++            DWORD       P3U                             : 8;     // U8
++            DWORD       B0U                             : 8;     // U8
++            DWORD       B1U                             : 8;     // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW11;
++
++    // DWORD 12
++    union
++    {
++        struct
++        {
++            DWORD       B2U                             : 8;     // U8
++            DWORD       B3U                             : 8;     // U8
++            DWORD       S0U                             : 11;    // S2.8
++            DWORD                                       : 5;     
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW12;
++
++    // DWORD 13
++    union
++    {
++        struct
++        {
++            DWORD       S1U                             : 11;     // S2.8
++            DWORD       S2U                             : 11;     // S2.8
++            DWORD                                       : 10;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW13;
++
++    // DWORD 14
++    union
++    {
++        struct
++        {
++            DWORD       S3U                             : 11;     // S2.8
++            DWORD       SkinTypesEnable                 : 1;
++            DWORD       SkinTypesThresh                 : 8;      // U8
++            DWORD       SkinTypesMargin                 : 8;      // U8
++            DWORD                                       : 4;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW14;
++
++    // DWORD 15
++    union
++    {
++        struct
++        {
++            DWORD       SATP1                           : 7;     // S6
++            DWORD       SATP2                           : 7;     // S6
++            DWORD       SATP3                           : 7;     // S6
++            DWORD       SATB1                           : 10;    // S7.2
++            DWORD                                       : 1;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW15;
++
++    // DWORD 16
++    union
++    {
++        struct
++        {
++            DWORD       SATB2                           : 10;     // S7.2
++            DWORD       SATB3                           : 10;     // S7.2
++            DWORD       SATS0                           : 11;     // U3.8
++            DWORD                                       : 1;    
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW16;
++
++    // DWORD 17
++    union
++    {
++        struct
++        {
++            DWORD       SATS1                           : 11;     // U3.8
++            DWORD       SATS2                           : 11;     // U3.8
++            DWORD                                       : 10;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW17;
++
++    // DWORD 18
++    union
++    {
++        struct
++        {
++            DWORD       SATS3                           : 11;    // U3.8
++            DWORD       HUEP1                           : 7;     // U3.8
++            DWORD       HUEP2                           : 7;     // U3.8
++            DWORD       HUEP3                           : 7;     // U3.8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW18;
++
++    // DWORD 19
++    union
++    {
++        struct
++        {
++            DWORD       HUEB1                           : 10;    // S7.2
++            DWORD       HUEB2                           : 10;    // S7.2
++            DWORD       HUEB3                           : 10;    // S7.2
++            DWORD                                       : 2; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW19;
++
++    // DWORD 20
++    union
++    {
++        struct
++        {
++            DWORD       HUES0                           : 11;    // U3.8
++            DWORD       HUES1                           : 11;    // U3.8
++            DWORD                                       : 10; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW20;
++
++    // DWORD 21
++    union
++    {
++        struct
++        {
++            DWORD       HUES2                           : 11;    // U3.8
++            DWORD       HUES3                           : 11;    // U3.8
++            DWORD                                       : 10; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW21;
++
++    // DWORD 22
++    union
++    {
++        struct
++        {
++            DWORD       SATP1DARK                      : 7;     // S6
++            DWORD       SATP2DARK                      : 7;     // S6
++            DWORD       SATP3DARK                      : 7;     // S6
++            DWORD       SATB1DARK                      : 10;    // S7.2
++            DWORD                                      : 1; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW22;
++
++    // DWORD 23
++    union
++    {
++        struct
++        {
++            DWORD       SATB2DARK                      : 10;    // S7.2
++            DWORD       SATB3DARK                      : 10;    // S7.2
++            DWORD       SATS0DARK                      : 11;    // U3.8
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW23;
++
++    // DWORD 24
++    union
++    {
++        struct
++        {
++            DWORD       SATS1DARK                      : 11;    // U3.8
++            DWORD       SATS2DARK                      : 11;    // U3.8
++            DWORD                                      : 10; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW24;
++
++    // DWORD 25
++    union
++    {
++        struct
++        {
++            DWORD       SATS3DARK                      : 11;   // U3.8
++            DWORD       HUEP1DARK                      : 7;    // S6
++            DWORD       HUEP2DARK                      : 7;    // S6
++            DWORD       HUEP3DARK                      : 7;    // S6
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW25;
++
++    // DWORD 26
++    union
++    {
++        struct
++        {
++            DWORD       HUEB1DARK                      : 10;    // S7.2
++            DWORD       HUEB2DARK                      : 10;    // S7.2
++            DWORD       HUEB3DARK                      : 10;    // S7.2
++            DWORD                                      : 2; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW26;
++
++    // DWORD 27
++    union
++    {
++        struct
++        {
++            DWORD       HUES0DARK                      : 11;    // U3.8
++            DWORD       HUES1DARK                      : 11;    // U3.8
++            DWORD                                      : 10; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW27;
++
++    // DWORD 28
++    union
++    {
++        struct
++        {
++            DWORD       HUES2DARK                      : 11;    // U3.8
++            DWORD       HUES3DARK                      : 11;    // U3.8
++            DWORD                                      : 10; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW28;
++
++    // DWORD 29
++    union
++    {
++        struct
++        {
++            DWORD       ACEEnable                       : 1;  
++            DWORD       FullImageHistogram              : 1;
++            DWORD       SkinThreshold                   : 5;    // U5
++            DWORD                                       : 25; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW29;
++
++    // DWORD 30
++    union
++    {
++        struct
++        {
++            DWORD       Ymin                            : 8;  
++            DWORD       Y1                              : 8;
++            DWORD       Y2                              : 8;
++            DWORD       Y3                              : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW30;
++
++    // DWORD 31
++    union
++    {
++        struct
++        {
++            DWORD       Y4                              : 8;  
++            DWORD       Y5                              : 8;
++            DWORD       Y6                              : 8;
++            DWORD       Y7                              : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW31;
++
++    // DWORD 32
++    union
++    {
++        struct
++        {
++            DWORD       Y8                              : 8;  
++            DWORD       Y9                              : 8;
++            DWORD       Y10                             : 8;
++            DWORD       Ymax                            : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW32;
++
++    // DWORD 33
++    union
++    {
++        struct
++        {
++            DWORD       B1                              : 8;  // U8
++            DWORD       B2                              : 8;  // U8
++            DWORD       B3                              : 8;  // U8
++            DWORD       B4                              : 8;  // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW33;
++
++    // DWORD 34
++    union
++    {
++        struct
++        {
++            DWORD       B5                              : 8;  // U8
++            DWORD       B6                              : 8;  // U8
++            DWORD       B7                              : 8;  // U8
++            DWORD       B8                              : 8;  // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW34;
++
++    // DWORD 35
++    union
++    {
++        struct
++        {
++            DWORD       B9                              : 8;   // U8
++            DWORD       B10                             : 8;   // U8
++            DWORD                                       : 16;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW35;
++
++    // DWORD 36
++    union
++    {
++        struct
++        {
++            DWORD       S0                              : 11;   // U11
++            DWORD                                       : 5; 
++            DWORD       S1                              : 11;   // U11
++            DWORD                                       : 5; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW36;
++
++    // DWORD 37
++    union
++    {
++        struct
++        {
++            DWORD       S2                              : 11;   // U11
++            DWORD                                       : 5; 
++            DWORD       S3                              : 11;   // U11
++            DWORD                                       : 5; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW37;
++
++    // DWORD 38
++    union
++    {
++        struct
++        {
++            DWORD       S4                              : 11;   // U11
++            DWORD                                       : 5; 
++            DWORD       S5                              : 11;   // U11
++            DWORD                                       : 5; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW38;
++
++    // DWORD 39
++    union
++    {
++        struct
++        {
++            DWORD       S6                              : 11;   // U11
++            DWORD                                       : 5; 
++            DWORD       S7                              : 11;   // U11
++            DWORD                                       : 5; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW39;
++
++    // DWORD 40
++    union
++    {
++        struct
++        {
++            DWORD       S8                              : 11;   // U11
++            DWORD                                       : 5; 
++            DWORD       S9                              : 11;   // U11
++            DWORD                                       : 5; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW40;
++
++    // DWORD 41
++    union
++    {
++        struct
++        {
++            DWORD       S10                             : 11;   // U11
++            DWORD                                       : 21; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW41;
++
++    // TCC State
++    // DWORD 42
++    union
++    {
++        struct
++        {
++            DWORD                                       : 7; 
++            DWORD       TCCEnable                       : 1; 
++            DWORD       SatFactor1                      : 8;    // U8 
++            DWORD       SatFactor2                      : 8;    // U8 
++            DWORD       SatFactor3                      : 8;    // U8 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW42;
++
++    // DWORD 43
++    union
++    {
++        struct
++        {
++            DWORD                                       : 8; 
++            DWORD       SatFactor4                      : 8;    // U8 
++            DWORD       SatFactor5                      : 8;    // U8 
++            DWORD       SatFactor6                      : 8;    // U8 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW43;
++
++    // DWORD 44
++    union
++    {
++        struct
++        {
++            DWORD       BaseColor1                      : 10;    // U10 
++            DWORD       BaseColor2                      : 10;    // U10 
++            DWORD       BaseColor3                      : 10;    // U10 
++            DWORD                                       : 2; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW44;
++
++    // DWORD 45
++    union
++    {
++        struct
++        {
++            DWORD       BaseColor4                      : 10;    // U10 
++            DWORD       BaseColor5                      : 10;    // U10 
++            DWORD       BaseColor6                      : 10;    // U10 
++            DWORD                                       : 2; 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW45;
++
++    // DWORD 46
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope12              : 16;    // U16
++            DWORD       ColorTransitSlope23              : 16;    // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW46;
++
++    // DWORD 47
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope34              : 16;    // U16
++            DWORD       ColorTransitSlope45              : 16;    // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW47;
++
++    // DWORD 48
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope56              : 16;    // U16
++            DWORD       ColorTransitSlope61              : 16;    // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW48;
++
++    // DWORD 49
++    union
++    {
++        struct
++        {
++            DWORD                                       : 2;    
++            DWORD       ColorBias1                      : 10;    // U10
++            DWORD       ColorBias2                      : 10;    // U10
++            DWORD       ColorBias3                      : 10;    // U10
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW49;
++
++    // DWORD 50
++    union
++    {
++        struct
++        {
++            DWORD                                       : 2;    
++            DWORD       ColorBias4                      : 10;    // U10
++            DWORD       ColorBias5                      : 10;    // U10
++            DWORD       ColorBias6                      : 10;    // U10
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW50;
++
++    // DWORD 51
++    union
++    {
++        struct
++        {
++            DWORD       STESlopeBits                    : 3;    // U3
++            DWORD                                       : 5;
++            DWORD       STEThreshold                    : 5;    // U5
++            DWORD                                       : 3;
++            DWORD       UVThresholdBits                 : 3;    // U5
++            DWORD                                       : 5;
++            DWORD       UVThreshold                     : 7;    // U7
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW51;
++
++    // DWORD 52
++    union
++    {
++        struct
++        {
++            DWORD       UVMaxColor                      : 9;    // U9
++            DWORD                                       : 7;
++            DWORD       InvUVMaxColor                   : 16;   // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW52;
++
++    // ProcAmp
++    // DWORD 53
++    union
++    {
++        struct
++        {
++            DWORD       ProcAmpEnable                   : 1;    
++            DWORD       Brightness                      : 12;    // S7.4
++            DWORD                                       : 4;
++            DWORD       Contrast                        : 11;    // U7.4
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW53;
++
++    // DWORD 54
++    union
++    {
++        struct
++        {
++            DWORD       SINCS                           : 16;    // S7.8    
++            DWORD       COSCS                           : 16;    // S7.8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW54;
++
++    // CSC State
++    // DWORD 55
++    union
++    {
++        struct
++        {
++            DWORD       TransformEnable                 : 1;
++            DWORD       YUVChannelSwap                  : 1;
++            DWORD                                       : 1;
++            DWORD       C0                              : 13;  // S2.10
++            DWORD       C1                              : 13;  // S2.10
++            DWORD                                       : 3;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW55;
++
++    // DWORD 56
++    union
++    {
++        struct
++        {
++            DWORD       C2                              : 13;  // S2.10
++            DWORD       C3                              : 13;  // S2.10
++            DWORD                                       : 6;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW56;
++
++    // DWORD 57
++    union
++    {
++        struct
++        {
++            DWORD       C4                              : 13;  // S2.10
++            DWORD       C5                              : 13;  // S2.10
++            DWORD                                       : 6;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW57;
++
++    // DWORD 58
++    union
++    {
++        struct
++        {
++            DWORD       C6                              : 13;  // S2.10
++            DWORD       C7                              : 13;  // S2.10
++            DWORD                                       : 6;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW58;
++
++    // DWORD 59
++    union
++    {
++        struct
++        {
++            DWORD       C8                              : 13;   // S2.10
++            DWORD                                       : 19;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW59;
++
++    // DWORD 60
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn1                       : 11;   // S8.2
++            DWORD       OffsetOut1                      : 11;   // S8.2
++            DWORD                                       : 10;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW60;
++
++    // DWORD 61
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn2                       : 11;   // S8.2
++            DWORD       OffsetOut2                      : 11;   // S8.2
++            DWORD                                       : 10;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW61;
++
++    // DWORD 62
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn3                       : 11;  // S8.2
++            DWORD       OffsetOut3                      : 11;  // S8.2
++            DWORD                                       : 10;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW62;
++
++    // DWORD 63
++    union
++    {
++        struct
++        {
++            DWORD       ColorPipeAlpha                  : 12;  // U12
++            DWORD                                       : 4;
++            DWORD       AlphaFromStateSelect            : 1;   
++            DWORD                                       : 15;  
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW63;
++
++    // Area of Interest
++    // DWORD 64
++    union
++    {
++        struct
++        {
++            DWORD       AOIMinX                         : 16;  // U16
++            DWORD       AOIMaxX                         : 16;  // U16
++    };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW64;
++
++    // DWORD 65
++    union
++    {
++        struct
++        {
++            DWORD       AOIMinY                         : 16;  // U16
++            DWORD       AOIMaxY                         : 16;  // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW65;
++
++    // Padding for 32-byte alignment, VEBOX_IECP_STATE_G75 is 66 DWORDs
++    DWORD dwPad[6];
++} VEBOX_IECP_STATE_G75, *PVEBOX_IECP_STATE_G75;
++
++// Defined in vol2b "Media"
++typedef struct _VEBOX_GAMUT_STATE_G75
++{
++    // GEC State
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       WeightingFactorForGainFactor    : 10;
++            DWORD                                       : 5;
++            DWORD       GlobalModeEnable                : 1;
++            DWORD       GainFactorR                     : 9;
++            DWORD                                       : 7;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       GainFactorB                     : 7;
++            DWORD                                       : 1;
++            DWORD       GainFactorG                     : 7;
++            DWORD                                       : 1;
++            DWORD       AccurateColorComponentScaling   : 10;
++            DWORD                                       : 6;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++            DWORD       RedOffset                       : 8;
++            DWORD       AccurateColorComponentOffset    : 8;
++            DWORD       RedScaling                      : 10;
++            DWORD                                           : 6;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // 3x3 Transform Coefficient
++    // DWORD 3
++    union
++    {
++        struct
++        {
++            DWORD       C0Coeff                         : 15; 
++            DWORD                                       : 1;
++            DWORD       C1Coeff                         : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW3;
++
++    // DWORD 4
++    union
++    {
++        struct
++        {
++            DWORD       C2Coeff                         : 15;
++            DWORD                                       : 1;
++            DWORD       C3Coeff                         : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW4;
++
++    // DWORD 5
++    union
++    {
++        struct
++        {
++            DWORD       C4Coeff                         : 15;
++            DWORD                                       : 1;
++            DWORD       C5Coeff                         : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW5;
++
++    // DWORD 6
++    union
++    {
++        struct
++        {
++            DWORD       C6Coeff                         : 15;
++            DWORD                                       : 1;
++            DWORD       C7Coeff                         : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW6;
++
++    // DWORD 7
++    union
++    {
++        struct
++        {
++            DWORD       C8Coeff                         : 15;
++            DWORD                                       : 17;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW7;
++    
++    // PWL Values for Gamma Correction
++    // DWORD 8
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaPoint1                  : 8;
++            DWORD       PWLGammaPoint2                  : 8;
++            DWORD       PWLGammaPoint3                  : 8;
++            DWORD       PWLGammaPoint4                  : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW8;
++
++    // DWORD 9
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaPoint5                  : 8;
++            DWORD       PWLGammaPoint6                  : 8;
++            DWORD       PWLGammaPoint7                  : 8;
++            DWORD       PWLGammaPoint8                  : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW9;
++
++    // DWORD 10
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaPoint9                  : 8;
++            DWORD       PWLGammaPoint10                 : 8;
++            DWORD       PWLGammaPoint11                 : 8;
++            DWORD                                       : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW10;
++
++    // DWORD 11
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaBias1                   : 8;
++            DWORD       PWLGammaBias2                   : 8;
++            DWORD       PWLGammaBias3                   : 8;
++            DWORD       PWLGammaBias4                   : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW11;
++
++
++    // DWORD 12
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaBias5                   : 8;
++            DWORD       PWLGammaBias6                   : 8;
++            DWORD       PWLGammaBias7                   : 8;
++            DWORD       PWLGammaBias8                   : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW12;
++
++    // DWORD 13
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaBias9                   : 8;
++            DWORD       PWLGammaBias10                  : 8;   
++            DWORD       PWLGammaBias11                  : 8;
++            DWORD                                       : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW13;
++
++    // DWORD 14
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope0                  : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope1                  : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW14;
++
++    // DWORD 15
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope2                  : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope3                  : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW15;
++
++    // DWORD 16
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope4                  : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope5                  : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW16;
++
++    // DWORD 17
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope6                  : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope7                  : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW17;
++
++    // DWORD 18
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope8                  : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope9                  : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW18;
++
++    // DWORD 19
++    union
++    {
++        struct
++        {
++            DWORD       PWLGammaSlope10                 : 12;
++            DWORD                                       : 4; 
++            DWORD       PWLGammaSlope11                 : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW19;
++
++    // PWL Values for Inverse Gamma Correction
++    // DWORD 20
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaPoint1               : 8;
++            DWORD       PWLInvGammaPoint2               : 8;
++            DWORD       PWLInvGammaPoint3               : 8;
++            DWORD       PWLInvGammaPoint4               : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW20;
++
++    // DWORD 21
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaPoint5               : 8;
++            DWORD       PWLInvGammaPoint6               : 8;
++            DWORD       PWLInvGammaPoint7               : 8;
++            DWORD       PWLInvGammaPoint8               : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW21;
++
++    // DWORD 22
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaPoint9               : 8;
++            DWORD       PWLInvGammaPoint10              : 8;
++            DWORD       PWLInvGammaPoint11              : 8;
++            DWORD                                       : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW22;
++
++    // DWORD 23
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaBias1                : 8;
++            DWORD       PWLInvGammaBias2                : 8;
++            DWORD       PWLInvGammaBias3                : 8;
++            DWORD       PWLInvGammaBias4                : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW23;
++
++    // DWORD 24
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaBias5                : 8;
++            DWORD       PWLInvGammaBias6                : 8;
++            DWORD       PWLInvGammaBias7                : 8;
++            DWORD       PWLInvGammaBias8                : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW24;
++
++    // DWORD 25
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaBias9                : 8;
++            DWORD       PWLInvGammaBias10               : 8;
++            DWORD       PWLInvGammaBias11               : 8;
++            DWORD                                       : 8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW25;
++
++    // DWORD 26
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope0               : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope1               : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW26;
++
++    // DWORD 27
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope2               : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope3               : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW27;
++
++    // DWORD 28
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope4               : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope5               : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW28;
++
++    // DWORD 29
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope6               : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope7               : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW29;
++
++    // DWORD 30
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope8               : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope9               : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW30;
++
++    // DWORD 31
++    union
++    {
++        struct
++        {
++            DWORD       PWLInvGammaSlope10              : 12;
++            DWORD                                       : 4;
++            DWORD       PWLInvGammaSlope11              : 12;
++            DWORD                                       : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW31;
++
++    // Offset value for R, G, B for the Transform
++    // DWORD 32
++    union
++    {
++        struct
++        {
++            DWORD       OffsetInR                       : 15; 
++            DWORD                                       : 1;
++            DWORD       OffsetInG                       : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW32;
++
++    // DWORD 33
++    union
++    {
++        struct
++        {
++            DWORD       OffsetInB                       : 15; 
++            DWORD                                       : 1;
++            DWORD       OffsetOutB                      : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW33;
++
++    // DWORD 34
++    union
++    {
++        struct
++        {
++            DWORD       OffsetOutR                      : 15; 
++            DWORD                                       : 1;
++            DWORD       OffsetOutG                      : 15;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW34;
++
++    // GCC State
++    // DWORD 35
++    union
++    {
++        struct
++        {
++            DWORD       OuterTriangleMappingLengthBelow : 10;  // U10
++            DWORD       OuterTriangleMappingLength      : 10;  // U10
++            DWORD       InnerTriangleMappingLength      : 10;  // U10
++            DWORD       FullRangeMappingEnable          : 1;
++            DWORD                                       : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW35;
++
++    // DWORD 36
++    union
++    {
++        struct
++        {
++            DWORD       InnerTriangleMappingLengthBelow : 10;   // U10
++            DWORD                                       : 18;
++            DWORD       CompressionLineShift            : 3;
++            DWORD       xvYccDecEncEnable               : 1;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW36;
++
++    // DWORD 37
++    union
++    {
++        struct
++        {
++            DWORD       CpiOverride                     : 1;
++            DWORD                                       : 10;
++            DWORD       BasicModeScalingFactor          : 14;
++            DWORD                                       : 4;
++            DWORD       LumaChromaOnlyCorrection        : 1;
++            DWORD       GCCBasicModeSelection           : 2;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW37;
++
++    // Padding for 32-byte alignment, VEBOX_GAMUT_STATE_G75 is 38 DWORDs
++    DWORD dwPad[2];
++} VEBOX_GAMUT_STATE_G75, *PVEBOX_GAMUT_STATE_G75;
++
++#define CM_NUM_VERTEX_TABLE_ENTRIES_G75        512
++// Defined in vol2b "Media"
++typedef struct _VEBOX_VERTEX_TABLE_ENTRY_G75
++{
++    union
++    {
++        struct
++        {
++            DWORD       VertexTableEntryCv                  : 12;
++            DWORD                                           : 4;
++            DWORD       VertexTableEntryLv                  : 12;
++            DWORD                                           : 4;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    };
++} VEBOX_VERTEX_TABLE_ENTRY_G75, *PVEBOX_VERTEX_TABLE_ENTRY_G75;
++
++// Defined in vol2b "Media"
++typedef struct _VEBOX_VERTEX_TABLE_G75
++{
++    VEBOX_VERTEX_TABLE_ENTRY_G75 VertexTableEntry[CM_NUM_VERTEX_TABLE_ENTRIES_G75];
++} VEBOX_VERTEX_TABLE_G75, *PVEBOX_VERTEX_TABLE_G75;
++
++
++
++typedef struct _VEBOX_DNDI_STATE_G8
++{
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       DenoiseASDThreshold : 8; // U8
++            DWORD       DnmhDelta : 4; // UINT4
++        DWORD: 4; // Reserved
++            DWORD       DnmhHistoryMax : 8; // U8
++            DWORD       DenoiseSTADThreshold : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       SCMDenoiseThreshold : 8; // U8
++            DWORD       DenoiseMovingPixelThreshold : 5; // U5
++            DWORD       STMMC2 : 3; // U3
++            DWORD       LowTemporalDifferenceThreshold : 6; // U6
++        DWORD: 2; // Reserved
++            DWORD       TemporalDifferenceThreshold : 6; // U6
++        DWORD: 2; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++            DWORD       BlockNoiseEstimateNoiseThreshold : 8; // U8
++            DWORD       BneEdgeTh : 4; // UINT4
++        DWORD: 2; // Reserved
++            DWORD       SmoothMvTh : 2; // U2
++            DWORD       SADTightTh : 4; // U4
++            DWORD       CATSlopeMinus1 : 4; // U4
++            DWORD       GoodNeighborThreshold : 6; // UINT6
++        DWORD: 2; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // DWORD 3
++    union
++    {
++        struct
++        {
++            DWORD       MaximumSTMM : 8; // U8
++            DWORD       MultiplierforVECM : 6; // U6
++        DWORD: 2;
++            DWORD       BlendingConstantForSmallSTMM : 8; // U8
++            DWORD       BlendingConstantForLargeSTMM : 7; // U7
++            DWORD       STMMBlendingConstantSelect : 1; // U1
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW3;
++
++    // DWORD 4
++    union
++    {
++        struct
++        {
++            DWORD       SDIDelta : 8; // U8
++            DWORD       SDIThreshold : 8; // U8
++            DWORD       STMMOutputShift : 4; // U4
++            DWORD       STMMShiftUp : 2; // U2
++            DWORD       STMMShiftDown : 2; // U2
++            DWORD       MinimumSTMM : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW4;
++
++    // DWORD 5
++    union
++    {
++        struct
++        {
++            DWORD       FMDTemporalDifferenceThreshold : 8; // U8
++            DWORD       SDIFallbackMode2Constant : 8; // U8
++            DWORD       SDIFallbackMode1T2Constant : 8; // U8
++            DWORD       SDIFallbackMode1T1Constant : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW5;
++
++    // DWORD 6
++    union
++    {
++        struct
++        {
++        DWORD: 3; // Reserved
++            DWORD       DNDITopFirst : 1; // Enable
++        DWORD: 2; // Reserved
++            DWORD       ProgressiveDN : 1; // Enable
++            DWORD       MCDIEnable : 1;
++            DWORD       FMDTearThreshold : 6; // U6
++            DWORD       CATTh1 : 2; // U2
++            DWORD       FMD2VerticalDifferenceThreshold : 8; // U8
++            DWORD       FMD1VerticalDifferenceThreshold : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW6;
++
++    // DWORD 7
++    union
++    {
++        struct
++        {
++            DWORD       SADTHA : 4; // U4
++            DWORD       SADTHB : 4; // U4
++            DWORD       FMDFirstFieldCurrentFrame : 2; // U2
++            DWORD       MCPixelConsistencyTh : 6; // U6
++            DWORD       FMDSecondFieldPreviousFrame : 2; // U2
++        DWORD: 1; // Reserved
++            DWORD       NeighborPixelTh : 4; // U4
++            DWORD       DnmhHistoryInit : 6; // U6
++        DWORD: 3; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW7;
++
++    // DWORD 8
++    union
++    {
++        struct
++        {
++            DWORD       ChromaLTDThreshold : 6; // U6
++            DWORD       ChromaTDTheshold : 6; // U6
++            DWORD       ChromaDenoiseEnable : 1; // Enable
++        DWORD: 3; // Reserved
++            DWORD       ChromaDnSTADThreshold : 8; // U8
++        DWORD: 8; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW8;
++
++    // DWORD 9
++    union
++    {
++        struct
++        {
++            DWORD       HotPixelThreshold : 8;
++            DWORD       HotPixelCount : 4;
++        DWORD: 20; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW9;
++
++    // Padding for 32-byte alignment, VEBOX_DNDI_STATE_G8 is 10 DWORDs
++    DWORD dwPad[6];
++} VEBOX_DNDI_STATE_G8, *PVEBOX_DNDI_STATE_G8;
++
++// Defined in vol2b "Media"
++typedef struct _VEBOX_IECP_STATE_G8
++{
++    // STD/STE state
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       STDEnable : BITFIELD_BIT(0);
++            DWORD       STEEnable : BITFIELD_BIT(1);
++            DWORD       OutputCtrl : BITFIELD_BIT(2);
++        DWORD: BITFIELD_BIT(3);
++            DWORD       SatMax : BITFIELD_RANGE(4, 9);      // U6;
++            DWORD       HueMax : BITFIELD_RANGE(10, 15);    // U6;
++            DWORD       UMid : BITFIELD_RANGE(16, 23);    // U8;
++            DWORD       VMid : BITFIELD_RANGE(24, 31);    // U8;
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       SinAlpha : BITFIELD_RANGE(0, 7);    // S0.7
++        DWORD: BITFIELD_RANGE(8, 9);
++            DWORD       CosAlpha : BITFIELD_RANGE(10, 17);  // S0.7
++            DWORD       HSMargin : BITFIELD_RANGE(18, 20);  // U3   
++            DWORD       DiamondDu : BITFIELD_RANGE(21, 27);  // S7    
++            DWORD       DiamondMargin : BITFIELD_RANGE(28, 30);  // U3    
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++            DWORD       DiamondDv : BITFIELD_RANGE(0, 6);    // S8.0
++            DWORD       DiamondTh : BITFIELD_RANGE(7, 12);   // U6  
++            DWORD       DiamondAlpha : BITFIELD_RANGE(13, 20);  // U1.6
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // DWORD 3
++    union
++    {
++        struct
++        {
++        DWORD: BITFIELD_RANGE(0, 6);
++            DWORD       VYSTDEnable : BITFIELD_BIT(7);
++            DWORD       YPoint1 : BITFIELD_RANGE(8, 15);    // U8   
++            DWORD       YPoint2 : BITFIELD_RANGE(16, 23);   // U8   
++            DWORD       YPoint3 : BITFIELD_RANGE(24, 31);   // U8   
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW3;
++
++    // DWORD 4
++    union
++    {
++        struct
++        {
++            DWORD       YPoint4 : BITFIELD_RANGE(0, 7);    // U8
++            DWORD       YSlope1 : BITFIELD_RANGE(8, 12);   // U2.3
++            DWORD       YSlope2 : BITFIELD_RANGE(13, 17);  // U2.3
++        DWORD: BITFIELD_RANGE(18, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW4;
++
++    // DWORD 5
++    union
++    {
++        struct
++        {
++            DWORD       INVMarginVYL : BITFIELD_RANGE(0, 15);    // U0.16
++            DWORD       INVSkinTypesMargin : BITFIELD_RANGE(16, 31);   // U0.16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW5;
++
++    // DWORD 6
++    union
++    {
++        struct
++        {
++            DWORD       INVMarginVYU : BITFIELD_RANGE(0, 15);    // U0.16
++            DWORD       P0L : BITFIELD_RANGE(16, 23);   // U8
++            DWORD       P1L : BITFIELD_RANGE(24, 31);   // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW6;
++
++    // DWORD 7
++    union
++    {
++        struct
++        {
++            DWORD       P2L : BITFIELD_RANGE(0, 7);     // U8
++            DWORD       P3L : BITFIELD_RANGE(8, 15);    // U8
++            DWORD       B0L : BITFIELD_RANGE(16, 23);   // U8
++            DWORD       B1L : BITFIELD_RANGE(24, 31);   // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW7;
++
++    // DWORD 8
++    union
++    {
++        struct
++        {
++            DWORD       B2L : BITFIELD_RANGE(0, 7);     // U8
++            DWORD       B3L : BITFIELD_RANGE(8, 15);    // U8
++            DWORD       S0L : BITFIELD_RANGE(16, 26);   // S2.8
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW8;
++
++    // DWORD 9
++    union
++    {
++        struct
++        {
++            DWORD       S1L : BITFIELD_RANGE(0, 10);    // S2.8
++            DWORD       S2L : BITFIELD_RANGE(11, 21);   // S2.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW9;
++
++    // DWORD 10
++    union
++    {
++        struct
++        {
++            DWORD       S3L : BITFIELD_RANGE(0, 10);    // S2.8
++            DWORD       P0U : BITFIELD_RANGE(11, 18);   // U8
++            DWORD       P1U : BITFIELD_RANGE(19, 26);   // U8
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW10;
++
++    // DWORD 11
++    union
++    {
++        struct
++        {
++            DWORD       P2U : BITFIELD_RANGE(0, 7);     // U8
++            DWORD       P3U : BITFIELD_RANGE(8, 15);    // U8
++            DWORD       B0U : BITFIELD_RANGE(16, 23);   // U8
++            DWORD       B1U : BITFIELD_RANGE(24, 31);   // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW11;
++
++    // DWORD 12
++    union
++    {
++        struct
++        {
++            DWORD       B2U : BITFIELD_RANGE(0, 7);     // U8
++            DWORD       B3U : BITFIELD_RANGE(8, 15);    // U8
++            DWORD       S0U : BITFIELD_RANGE(16, 26);   // S2.8
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW12;
++
++    // DWORD 13
++    union
++    {
++        struct
++        {
++            DWORD       S1U : BITFIELD_RANGE(0, 10);     // S2.8
++            DWORD       S2U : BITFIELD_RANGE(11, 21);    // S2.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW13;
++
++    // DWORD 14
++    union
++    {
++        struct
++        {
++            DWORD       S3U : BITFIELD_RANGE(0, 10);     // S2.8
++            DWORD       SkinTypesEnable : BITFIELD_BIT(11);
++            DWORD       SkinTypesThresh : BITFIELD_RANGE(12, 19);    // U8
++            DWORD       SkinTypesMargin : BITFIELD_RANGE(20, 27);    // U8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW14;
++
++    // DWORD 15
++    union
++    {
++        struct
++        {
++            DWORD       SATP1 : BITFIELD_RANGE(0, 6);     // S6
++            DWORD       SATP2 : BITFIELD_RANGE(7, 13);    // S6
++            DWORD       SATP3 : BITFIELD_RANGE(14, 20);   // S6
++            DWORD       SATB1 : BITFIELD_RANGE(21, 30);   // S2.7
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW15;
++
++    // DWORD 16
++    union
++    {
++        struct
++        {
++            DWORD       SATB2 : BITFIELD_RANGE(0, 9);     // S2.7
++            DWORD       SATB3 : BITFIELD_RANGE(10, 19);   // S2.7
++            DWORD       SATS0 : BITFIELD_RANGE(20, 30);   // U3.8
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW16;
++
++    // DWORD 17
++    union
++    {
++        struct
++        {
++            DWORD       SATS1 : BITFIELD_RANGE(0, 10);     // U3.8
++            DWORD       SATS2 : BITFIELD_RANGE(11, 21);    // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW17;
++
++    // DWORD 18
++    union
++    {
++        struct
++        {
++            DWORD       SATS3 : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       HUEP1 : BITFIELD_RANGE(11, 17);   // U3.8
++            DWORD       HUEP2 : BITFIELD_RANGE(18, 24);   // U3.8
++            DWORD       HUEP3 : BITFIELD_RANGE(25, 31);   // U3.8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW18;
++
++    // DWORD 19
++    union
++    {
++        struct
++        {
++            DWORD       HUEB1 : BITFIELD_RANGE(0, 9);    // S2.7
++            DWORD       HUEB2 : BITFIELD_RANGE(10, 19);  // S2.7
++            DWORD       HUEB3 : BITFIELD_RANGE(20, 29);  // S2.7
++        DWORD: BITFIELD_RANGE(30, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW19;
++
++    // DWORD 20
++    union
++    {
++        struct
++        {
++            DWORD       HUES0 : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       HUES1 : BITFIELD_RANGE(11, 21);   // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW20;
++
++    // DWORD 21
++    union
++    {
++        struct
++        {
++            DWORD       HUES2 : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       HUES3 : BITFIELD_RANGE(11, 21);   // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW21;
++
++    // DWORD 22
++    union
++    {
++        struct
++        {
++            DWORD       SATP1DARK : BITFIELD_RANGE(0, 6);     // S6
++            DWORD       SATP2DARK : BITFIELD_RANGE(7, 13);    // S6
++            DWORD       SATP3DARK : BITFIELD_RANGE(14, 20);   // S6
++            DWORD       SATB1DARK : BITFIELD_RANGE(21, 30);   // S2.7
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW22;
++
++    // DWORD 23
++    union
++    {
++        struct
++        {
++            DWORD       SATB2DARK : BITFIELD_RANGE(0, 9);    // S2.7
++            DWORD       SATB3DARK : BITFIELD_RANGE(10, 19);  // S2.7
++            DWORD       SATS0DARK : BITFIELD_RANGE(20, 30);  // U3.8
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW23;
++
++    // DWORD 24
++    union
++    {
++        struct
++        {
++            DWORD       SATS1DARK : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       SATS2DARK : BITFIELD_RANGE(11, 21);   // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW24;
++
++    // DWORD 25
++    union
++    {
++        struct
++        {
++            DWORD       SATS3DARK : BITFIELD_RANGE(0, 10);   // U3.8
++            DWORD       HUEP1DARK : BITFIELD_RANGE(11, 17);  // S6
++            DWORD       HUEP2DARK : BITFIELD_RANGE(18, 24);  // S6
++            DWORD       HUEP3DARK : BITFIELD_RANGE(25, 31);  // S6
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW25;
++
++    // DWORD 26
++    union
++    {
++        struct
++        {
++            DWORD       HUEB1DARK : BITFIELD_RANGE(0, 9);    // S2.7
++            DWORD       HUEB2DARK : BITFIELD_RANGE(10, 19);  // S2.7
++            DWORD       HUEB3DARK : BITFIELD_RANGE(20, 29);  // S2.7
++        DWORD: BITFIELD_RANGE(30, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW26;
++
++    // DWORD 27
++    union
++    {
++        struct
++        {
++            DWORD       HUES0DARK : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       HUES1DARK : BITFIELD_RANGE(11, 21);   // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW27;
++
++    // DWORD 28
++    union
++    {
++        struct
++        {
++            DWORD       HUES2DARK : BITFIELD_RANGE(0, 10);    // U3.8
++            DWORD       HUES3DARK : BITFIELD_RANGE(11, 21);   // U3.8
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW28;
++
++    // ACE state
++    // DWORD 29
++    union
++    {
++        struct
++        {
++            DWORD       ACEEnable : BITFIELD_BIT(0);
++            DWORD       FullImageHistogram : BITFIELD_BIT(1);
++            DWORD       SkinThreshold : BITFIELD_RANGE(2, 6);    // U5
++        DWORD: BITFIELD_RANGE(7, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW29;
++
++    // DWORD 30
++    union
++    {
++        struct
++        {
++            DWORD       Ymin : BITFIELD_RANGE(0, 7);
++            DWORD       Y1 : BITFIELD_RANGE(8, 15);
++            DWORD       Y2 : BITFIELD_RANGE(16, 23);
++            DWORD       Y3 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW30;
++
++    // DWORD 31
++    union
++    {
++        struct
++        {
++            DWORD       Y4 : BITFIELD_RANGE(0, 7);
++            DWORD       Y5 : BITFIELD_RANGE(8, 15);
++            DWORD       Y6 : BITFIELD_RANGE(16, 23);
++            DWORD       Y7 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW31;
++
++    // DWORD 32
++    union
++    {
++        struct
++        {
++            DWORD       Y8 : BITFIELD_RANGE(0, 7);
++            DWORD       Y9 : BITFIELD_RANGE(8, 15);
++            DWORD       Y10 : BITFIELD_RANGE(16, 23);
++            DWORD       Ymax : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW32;
++
++    // DWORD 33
++    union
++    {
++        struct
++        {
++            DWORD       B1 : BITFIELD_RANGE(0, 7);   // U8
++            DWORD       B2 : BITFIELD_RANGE(8, 15);  // U8
++            DWORD       B3 : BITFIELD_RANGE(16, 23); // U8
++            DWORD       B4 : BITFIELD_RANGE(24, 31); // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW33;
++
++    // DWORD 34
++    union
++    {
++        struct
++        {
++            DWORD       B5 : BITFIELD_RANGE(0, 7);   // U8
++            DWORD       B6 : BITFIELD_RANGE(8, 15);  // U8
++            DWORD       B7 : BITFIELD_RANGE(16, 23); // U8
++            DWORD       B8 : BITFIELD_RANGE(24, 31); // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW34;
++
++    // DWORD 35
++    union
++    {
++        struct
++        {
++            DWORD       B9 : BITFIELD_RANGE(0, 7);   // U8
++            DWORD       B10 : BITFIELD_RANGE(8, 15);  // U8
++        DWORD: BITFIELD_RANGE(16, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW35;
++
++    // DWORD 36
++    union
++    {
++        struct
++        {
++            DWORD       S0 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 15);
++            DWORD       S1 : BITFIELD_RANGE(16, 26);  // U11
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW36;
++
++    // DWORD 37
++    union
++    {
++        struct
++        {
++            DWORD       S2 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 15);
++            DWORD       S3 : BITFIELD_RANGE(16, 26);  // U11
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW37;
++
++    // DWORD 38
++    union
++    {
++        struct
++        {
++            DWORD       S4 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 15);
++            DWORD       S5 : BITFIELD_RANGE(16, 26);  // U11
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW38;
++
++    // DWORD 39
++    union
++    {
++        struct
++        {
++            DWORD       S6 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 15);
++            DWORD       S7 : BITFIELD_RANGE(16, 26);  // U11
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW39;
++
++    // DWORD 40
++    union
++    {
++        struct
++        {
++            DWORD       S8 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 15);
++            DWORD       S9 : BITFIELD_RANGE(16, 26);  // U11
++        DWORD: BITFIELD_RANGE(27, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW40;
++
++    // DWORD 41
++    union
++    {
++        struct
++        {
++            DWORD       S10 : BITFIELD_RANGE(0, 10);   // U11
++        DWORD: BITFIELD_RANGE(11, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW41;
++
++    // TCC State
++    // DWORD 42
++    union
++    {
++        struct
++        {
++        DWORD: BITFIELD_RANGE(0, 6);
++            DWORD       TCCEnable : BITFIELD_BIT(7);
++            DWORD       SatFactor1 : BITFIELD_RANGE(8, 15);    // U8 
++            DWORD       SatFactor2 : BITFIELD_RANGE(16, 23);   // U8 
++            DWORD       SatFactor3 : BITFIELD_RANGE(24, 31);   // U8 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW42;
++
++    // DWORD 43
++    union
++    {
++        struct
++        {
++        DWORD: BITFIELD_RANGE(0, 7);
++            DWORD       SatFactor4 : BITFIELD_RANGE(8, 15);    // U8 
++            DWORD       SatFactor5 : BITFIELD_RANGE(16, 23);   // U8 
++            DWORD       SatFactor6 : BITFIELD_RANGE(24, 31);   // U8 
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW43;
++
++    // DWORD 44
++    union
++    {
++        struct
++        {
++            DWORD       BaseColor1 : BITFIELD_RANGE(0, 9);    // U10 
++            DWORD       BaseColor2 : BITFIELD_RANGE(10, 19);  // U10 
++            DWORD       BaseColor3 : BITFIELD_RANGE(20, 29);  // U10 
++        DWORD: BITFIELD_RANGE(30, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW44;
++
++    // DWORD 45
++    union
++    {
++        struct
++        {
++            DWORD       BaseColor4 : BITFIELD_RANGE(0, 9);    // U10 
++            DWORD       BaseColor5 : BITFIELD_RANGE(10, 19);  // U10 
++            DWORD       BaseColor6 : BITFIELD_RANGE(20, 29);  // U10 
++        DWORD: BITFIELD_RANGE(30, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW45;
++
++    // DWORD 46
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope12 : BITFIELD_RANGE(0, 15);    // U16
++            DWORD       ColorTransitSlope23 : BITFIELD_RANGE(16, 31);   // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW46;
++
++    // DWORD 47
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope34 : BITFIELD_RANGE(0, 15);    // U16
++            DWORD       ColorTransitSlope45 : BITFIELD_RANGE(16, 31);   // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW47;
++
++    // DWORD 48
++    union
++    {
++        struct
++        {
++            DWORD       ColorTransitSlope56 : BITFIELD_RANGE(0, 15);    // U16
++            DWORD       ColorTransitSlope61 : BITFIELD_RANGE(16, 31);   // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW48;
++
++    // DWORD 49
++    union
++    {
++        struct
++        {
++        DWORD: BITFIELD_RANGE(0, 1);
++            DWORD       ColorBias1 : BITFIELD_RANGE(2, 11);    // U10
++            DWORD       ColorBias2 : BITFIELD_RANGE(12, 21);   // U10
++            DWORD       ColorBias3 : BITFIELD_RANGE(22, 31);   // U10
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW49;
++
++    // DWORD 50
++    union
++    {
++        struct
++        {
++        DWORD: BITFIELD_RANGE(0, 1);
++            DWORD       ColorBias4 : BITFIELD_RANGE(2, 11);    // U10
++            DWORD       ColorBias5 : BITFIELD_RANGE(12, 21);   // U10
++            DWORD       ColorBias6 : BITFIELD_RANGE(22, 31);   // U10
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW50;
++
++    // DWORD 51
++    union
++    {
++        struct
++        {
++            DWORD       STESlopeBits : BITFIELD_RANGE(0, 2);    // U3
++        DWORD: BITFIELD_RANGE(3, 7);
++            DWORD       STEThreshold : BITFIELD_RANGE(8, 12);   // U5
++        DWORD: BITFIELD_RANGE(13, 15);
++            DWORD       UVThresholdBits : BITFIELD_RANGE(16, 18);  // U5
++        DWORD: BITFIELD_RANGE(19, 23);
++            DWORD       UVThreshold : BITFIELD_RANGE(24, 30);  // U7
++        DWORD: BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW51;
++
++    // DWORD 52
++    union
++    {
++        struct
++        {
++            DWORD       UVMaxColor : BITFIELD_RANGE(0, 8);    // U9
++        DWORD: BITFIELD_RANGE(9, 15);
++            DWORD       InvUVMaxColor : BITFIELD_RANGE(16, 31);  // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW52;
++
++    // ProcAmp State
++    // DWORD 53
++    union
++    {
++        struct
++        {
++            DWORD       ProcAmpEnable : BITFIELD_BIT(0);
++            DWORD       Brightness : BITFIELD_RANGE(1, 12);    // S7.4
++        DWORD: BITFIELD_RANGE(13, 16);
++            DWORD       Contrast : BITFIELD_RANGE(17, 27);   // U7.4
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW53;
++
++    // DWORD 54
++    union
++    {
++        struct
++        {
++            DWORD       SINCS : BITFIELD_RANGE(0, 15);    // S7.8    
++            DWORD       COSCS : BITFIELD_RANGE(16, 31);   // S7.8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW54;
++
++    // CSC State
++    // DWORD 55
++    union
++    {
++        struct
++        {
++            DWORD       TransformEnable : BITFIELD_BIT(0);
++            DWORD       YUVChannelSwap : BITFIELD_BIT(1);
++        DWORD: BITFIELD_BIT(2);
++            DWORD       C0 : BITFIELD_RANGE(3, 15);  // S2.10
++            DWORD       C1 : BITFIELD_RANGE(16, 28); // S2.10
++        DWORD: BITFIELD_RANGE(29, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW55;
++
++    // DWORD 56
++    union
++    {
++        struct
++        {
++            DWORD       C2 : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       C3 : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW56;
++
++    // DWORD 57
++    union
++    {
++        struct
++        {
++            DWORD       C4 : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       C5 : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW57;
++
++    // DWORD 58
++    union
++    {
++        struct
++        {
++            DWORD       C6 : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       C7 : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW58;
++
++    // DWORD 59
++    union
++    {
++        struct
++        {
++            DWORD       C8 : BITFIELD_RANGE(0, 12);   // S2.10
++        DWORD: BITFIELD_RANGE(13, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW59;
++
++    // DWORD 60
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn1 : BITFIELD_RANGE(0, 10);   // S10
++            DWORD       OffsetOut1 : BITFIELD_RANGE(11, 21);  // S10
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW60;
++
++    // DWORD 61
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn2 : BITFIELD_RANGE(0, 10);   // S10
++            DWORD       OffsetOut2 : BITFIELD_RANGE(11, 21);  // S10
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW61;
++
++    // DWORD 62
++    union
++    {
++        struct
++        {
++            DWORD       OffsetIn3 : BITFIELD_RANGE(0, 10);  // S10
++            DWORD       OffsetOut3 : BITFIELD_RANGE(11, 21); // S10
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW62;
++
++    // DWORD 63
++    union
++    {
++        struct
++        {
++            DWORD       ColorPipeAlpha : BITFIELD_RANGE(0, 11);  // U12
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       AlphaFromStateSelect : BITFIELD_BIT(16);
++        DWORD: BITFIELD_RANGE(17, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW63;
++
++    // Area of Interest
++    // DWORD 64
++    union
++    {
++        struct
++        {
++            DWORD       AOIMinX : BITFIELD_RANGE(0, 15);  // U16
++            DWORD       AOIMaxX : BITFIELD_RANGE(16, 31); // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW64;
++
++    // DWORD 65
++    union
++    {
++        struct
++        {
++            DWORD       AOIMinY : BITFIELD_RANGE(0, 15);  // U16
++            DWORD       AOIMaxY : BITFIELD_RANGE(16, 31); // U16
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW65;
++
++    // Color Correction Matrix
++    // DWORD 66
++    union
++    {
++        struct
++        {
++            DWORD       C1Coeff : BITFIELD_RANGE(0, 20);  // S8.12
++        DWORD: BITFIELD_RANGE(21, 29);
++            DWORD       VignetteCorrectionFormat : BITFIELD_BIT(30);
++            DWORD       ColorCorrectionMatrixEnable : BITFIELD_BIT(31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW66;
++
++    // DWORD 67
++    union
++    {
++        struct
++        {
++            DWORD       C0Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW67;
++
++    // DWORD 68
++    union
++    {
++        struct
++        {
++            DWORD       C3Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW68;
++
++    // DWORD 69
++    union
++    {
++        struct
++        {
++            DWORD       C2Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW69;
++
++    // DWORD 70
++    union
++    {
++        struct
++        {
++            DWORD       C5Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW70;
++
++    // DWORD 71
++    union
++    {
++        struct
++        {
++            DWORD       C4Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW71;
++
++    // DWORD 72
++    union
++    {
++        struct
++        {
++            DWORD       C7Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW72;
++
++    // DWORD 73
++    union
++    {
++        struct
++        {
++            DWORD       C6Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW73;
++
++    // DWORD 74
++    union
++    {
++        struct
++        {
++            DWORD       C8Coeff : BITFIELD_RANGE(0, 20); // S8.12
++        DWORD: BITFIELD_RANGE(21, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW74;
++
++    // DWORD 75
++    union
++    {
++        struct
++        {
++            DWORD       BlackPointOffsetR : BITFIELD_RANGE(0, 12); // S12
++        DWORD: BITFIELD_RANGE(13, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW75;
++
++    // DWORD 76
++    union
++    {
++        struct
++        {
++            DWORD       BlackPointOffsetB : BITFIELD_RANGE(0, 12);  // S12
++            DWORD       BlackPointOffsetG : BITFIELD_RANGE(13, 25); // S12
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW76;
++
++    // Forward Gamma Correction
++    // DWORD 77
++    union
++    {
++        struct
++        {
++            DWORD       ForwardGammaCorrectionEnable : BITFIELD_BIT(0);
++        DWORD: BITFIELD_RANGE(1, 7);
++            DWORD       PWLFwdGammaPoint1 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaPoint2 : BITFIELD_RANGE(16, 23);
++            DWORD       PWLFwdGammaPoint3 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW77;
++
++    // DWORD 78
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaPoint4 : BITFIELD_RANGE(0, 7);
++            DWORD       PWLFwdGammaPoint5 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaPoint6 : BITFIELD_RANGE(16, 23);
++            DWORD       PWLFwdGammaPoint7 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW78;
++
++    // DWORD 79
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaPoint8 : BITFIELD_RANGE(0, 7);
++            DWORD       PWLFwdGammaPoint9 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaPoint10 : BITFIELD_RANGE(16, 23);
++            DWORD       PWLFwdGammaPoint11 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW79;
++
++    // DWORD 80
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaBias1 : BITFIELD_RANGE(0, 7);
++            DWORD       PWLFwdGammaBias2 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaBias3 : BITFIELD_RANGE(16, 23);
++            DWORD       PWLFwdGammaBias4 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW80;
++
++    // DWORD 81
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaBias5 : BITFIELD_RANGE(0, 7);
++            DWORD       PWLFwdGammaBias6 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaBias7 : BITFIELD_RANGE(16, 23);
++            DWORD       PWLFwdGammaBias8 : BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW81;
++
++    // DWORD 82
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaBias9 : BITFIELD_RANGE(0, 7);
++            DWORD       PWLFwdGammaBias10 : BITFIELD_RANGE(8, 15);
++            DWORD       PWLFwdGammaBias11 : BITFIELD_RANGE(16, 23);
++        DWORD: BITFIELD_RANGE(24, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW82;
++
++    // DWORD 83
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope0 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope1 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW83;
++
++    // DWORD 84
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope2 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope3 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW84;
++
++    // DWORD 85
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope4 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope5 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW85;
++
++    // DWORD 86
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope6 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope7 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW86;
++
++    // DWORD 87
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope8 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope9 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW87;
++
++    // DWORD 88
++    union
++    {
++        struct
++        {
++            DWORD       PWLFwdGammaSlope10 : BITFIELD_RANGE(0, 11);  // U4.8
++        DWORD: BITFIELD_RANGE(12, 15);
++            DWORD       PWLFwdGammaSlope11 : BITFIELD_RANGE(16, 27); // U4.8
++        DWORD: BITFIELD_RANGE(28, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW88;
++
++    // Front-End CSC
++    // DWORD 89
++    union
++    {
++        struct
++        {
++            DWORD       FrontEndCSCTransformEnable : BITFIELD_BIT(0);
++        DWORD: BITFIELD_RANGE(1, 2);
++            DWORD       FECSCC0Coeff : BITFIELD_RANGE(3, 15);  // S2.10
++            DWORD       FECSCC1Coeff : BITFIELD_RANGE(16, 28); // S2.10
++        DWORD: BITFIELD_RANGE(29, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW89;
++
++    // DWORD 90
++    union
++    {
++        struct
++        {
++            DWORD       FECSCC2Coeff : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       FECSCC3Coeff : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW90;
++
++    // DWORD 91
++    union
++    {
++        struct
++        {
++            DWORD       FECSCC4Coeff : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       FECSCC5Coeff : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW91;
++
++    // DWORD 92
++    union
++    {
++        struct
++        {
++            DWORD       FECSCC6Coeff : BITFIELD_RANGE(0, 12);  // S2.10
++            DWORD       FECSCC7Coeff : BITFIELD_RANGE(13, 25); // S2.10
++        DWORD: BITFIELD_RANGE(26, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW92;
++
++    // DWORD 93
++    union
++    {
++        struct
++        {
++            DWORD       FECSCC8Coeff : BITFIELD_RANGE(0, 12);  // S2.10
++        DWORD: BITFIELD_RANGE(13, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW93;
++
++    // DWORD 94
++    union
++    {
++        struct
++        {
++            DWORD       FECSCCOffsetIn1 : BITFIELD_RANGE(0, 10);
++            DWORD       FECSCCOffsetOut1 : BITFIELD_RANGE(11, 21);
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW94;
++
++    // DWORD 95
++    union
++    {
++        struct
++        {
++            DWORD       FECSCCOffsetIn2 : BITFIELD_RANGE(0, 10);
++            DWORD       FECSCCOffsetOut2 : BITFIELD_RANGE(11, 21);
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW95;
++
++    // DWORD 96
++    union
++    {
++        struct
++        {
++            DWORD       FECSCCOffsetIn3 : BITFIELD_RANGE(0, 10);
++            DWORD       FECSCCOffsetOut3 : BITFIELD_RANGE(11, 21);
++        DWORD: BITFIELD_RANGE(22, 31);
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW96;
++
++    // Padding for 32-byte alignment, VEBOX_IECP_STATE_G8 is 97 DWORDs
++    DWORD dwPad[7];
++} VEBOX_IECP_STATE_G8, *PVEBOX_IECP_STATE_G8;
++
++typedef struct _VEBOX_CAPTURE_PIPE_STATE_G8
++{
++    // DWORD 0
++    union
++    {
++        struct
++        {
++            DWORD       BadAvgMinCostTh : 8; // U8
++            DWORD       THColorTh : 8; // U8
++            DWORD       ScaleForAvgMinCost : 4; // U4
++            DWORD       ShiftMinCost : 3; // U3
++        DWORD: 1; // Reserved
++            DWORD       GoodPixelTh : 6; // U6
++        DWORD: 2; // Reserved
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW0;
++
++    // DWORD 1
++    union
++    {
++        struct
++        {
++            DWORD       BadTH3 : 4; // U4
++        DWORD: 4; // Reserved
++            DWORD       BadTH2 : 8; // U8
++            DWORD       BadTH1 : 8; // U8
++        DWORD: 4; // Reserved
++            DWORD       ScaleForMinCost : 4; // U4
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW1;
++
++    // DWORD 2
++    union
++    {
++        struct
++        {
++        DWORD: 8; // Reserved
++            DWORD       UVThresholdValue : 8; // U8
++            DWORD       YOutlierValue : 8; // U8
++            DWORD       YBrightValue : 8; // U8
++        };
++        struct
++        {
++            DWORD       Value;
++        };
++    } DW2;
++
++    // Padding for 32-byte alignment, VEBOX_CAPTURE_PIPE_STATE_G8 is 3 DWORDs
++    DWORD dwPad[5];
++} VEBOX_CAPTURE_PIPE_STATE_G8, *PVEBOX_CAPTURE_PIPE_STATE_G8;
++
++typedef struct __CM_VEBOX_PARAM_G8
++{
++    PVEBOX_DNDI_STATE_G8          pDndiState;
++    unsigned char                 padding1[4032];
++    PVEBOX_IECP_STATE_G8          pIecpState;
++    unsigned char                 padding2[3680];
++    PVEBOX_GAMUT_STATE_G75        pGamutState;
++    unsigned char                 padding3[3936];
++    PVEBOX_VERTEX_TABLE_G75       pVertexTable;
++    unsigned char                 padding4[2048];
++    PVEBOX_CAPTURE_PIPE_STATE_G8 pCapturePipe;
++}CM_VEBOX_PARAM_G8, PCM_VEBOX_PARAM_G8;
++
++#endif // __CM_RT_G8_H__
+diff --git a/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g9.h b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g9.h
+new file mode 100644
+index 000000000000..b37a11aa9bce
+--- /dev/null
++++ b/camera/hal/intel/ipu6/include/igfxcmrt/cm_rt_g9.h
+@@ -0,0 +1,1417 @@
++/*
++* Copyright (c) 2017, Intel Corporation
++*
++* Permission is hereby granted, free of charge, to any person obtaining a
++* copy of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++* OTHER DEALINGS IN THE SOFTWARE.
++*/
++//!
++//! \file      cm_rt_g9.h
++//! \brief     Contains Definitions for CM on Gen 9
++//!
++
++#ifndef __CM_RT_G9_H__
++#define __CM_RT_G9_H__
++
++#define SKL_L3_PLANE_DEFAULT    CM_L3_PLANE_DEFAULT
++#define SKL_L3_PLANE_1          CM_L3_PLANE_1
++#define SKL_L3_PLANE_2          CM_L3_PLANE_2
++#define SKL_L3_PLANE_3          CM_L3_PLANE_3
++#define SKL_L3_PLANE_4          CM_L3_PLANE_4
++#define SKL_L3_PLANE_5          CM_L3_PLANE_5
++#define SKL_L3_PLANE_6          CM_L3_PLANE_6
++#define SKL_L3_PLANE_7          CM_L3_PLANE_7
++#define SKL_L3_CONFIG_COUNT     8
++
++#define SKL_SLM_PLANE_DEFAULT = SKL_L3_PLANE_5
++
++static const L3ConfigRegisterValues SKL_L3_PLANE[SKL_L3_CONFIG_COUNT] =
++{                                                                                 // SLM    URB   Rest   DC    RO    I/S    C     T     Sum
++    {0x00000000, 0x00000000, 0x00000000, 0x60000060},                             //{0,     48,    48,    0,    0,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x00808060},                              //{0,     48,    0,    16,   32,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x00818040},                              //{0,     32,    0,    16,   48,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x00030040},                              //{0,     32,    0,     0,   64,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x80000040},                              //{0,     32,    64,    0,    0,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x60000121},                              //{32,    16,    48,    0,    0,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x00410121},                              //{32,    16,    0,    16,   32,    0,    0,    0,    96},
++    {0x00000000, 0x00000000, 0x00000000,0x00808121}                               //{32,    16,    0,    32,   16,    0,    0,    0,    96}
++};
++
++typedef struct _VEBOX_SURFACE_CONTROL_BITS_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       Reserved0 : BITFIELD_BIT(0);
++            DWORD       IndexToMemoryObjectControlStateMocsTables : BITFIELD_RANGE(1, 6);
++            DWORD       MemoryCompressionEnable : BITFIELD_BIT(7);
++            DWORD       MemoryCompressionMode : BITFIELD_BIT(8);
++            DWORD       TiledResourceMode : BITFIELD_RANGE(9, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 31);
++        };
++        DWORD Value;
++    } DW0;
++} VEBOX_SURFACE_CONTROL_BITS_G9, *PVEBOX_SURFACE_CONTROL_BITS_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_DNDI_STATE_G9
++{
++    // Temporal DN
++    // DWORD 0
++    union {
++        struct {
++            DWORD       DenoiseMovingPixelThreshold : BITFIELD_RANGE(0, 4);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(5, 7);
++            DWORD       DenoiseHistoryIncrease : BITFIELD_RANGE(8, 11);
++            DWORD       DenoiseMaximumHistory : BITFIELD_RANGE(12, 19);
++            DWORD       DenoiseStadThreshold : BITFIELD_RANGE(20, 31);
++        };
++        DWORD       Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       LowTemporalDifferenceThreshold : BITFIELD_RANGE(0, 9);
++            DWORD       TemporalDifferenceThreshold : BITFIELD_RANGE(10, 19);
++            DWORD       DenoiseAsdThreshold : BITFIELD_RANGE(20, 31);
++        };
++        DWORD       Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 9);
++            DWORD       InitialDenoiseHistory : BITFIELD_RANGE(10, 15);
++            DWORD       DenoiseThresholdForSumOfComplexityMeasure : BITFIELD_RANGE(16, 27);
++            DWORD       ProgressiveDn : BITFIELD_BIT(28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW2;
++
++    // Global Noise estimate and hot pixel detection
++    // DWORD 3
++    union {
++        struct {
++            DWORD       BlockNoiseEstimateNoiseThreshold : BITFIELD_RANGE(0, 11);
++            DWORD       BlockNoiseEstimateEdgeThreshold : BITFIELD_RANGE(12, 19);
++            DWORD       HotPixelThreshold : BITFIELD_RANGE(20, 27);
++            DWORD       HotPixelCount : BITFIELD_RANGE(28, 31);
++        };
++        DWORD       Value;
++    } DW3;
++
++    // Chroma DN
++    // DWORD 4
++    union {
++        struct {
++            DWORD       ChromaLowTemporalDifferenceThreshold : BITFIELD_RANGE(0, 5);
++            DWORD       ChromaTemporalDifferenceThreshold : BITFIELD_RANGE(6, 11);
++            DWORD       ChromaDenoiseEnable : BITFIELD_BIT(12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       ChromaDenoiseStadThreshold : BITFIELD_RANGE(16, 23);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(24, 31);
++        };
++        DWORD       Value;
++    } DW4;
++
++    // 5x5 Spatial Denoise
++    // DWORD 5
++    union {
++        struct {
++            DWORD       DnWr0 : BITFIELD_RANGE(0, 4);
++            DWORD       DnWr1 : BITFIELD_RANGE(5, 9);
++            DWORD       DnWr2 : BITFIELD_RANGE(10, 14);
++            DWORD       DnWr3 : BITFIELD_RANGE(15, 19);
++            DWORD       DnWr4 : BITFIELD_RANGE(20, 24);
++            DWORD       DnWr5 : BITFIELD_RANGE(25, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD       Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       DnThmin : BITFIELD_RANGE(0, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       DnThmax : BITFIELD_RANGE(16, 28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       DnDynThmin : BITFIELD_RANGE(0, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       DnPrt5 : BITFIELD_RANGE(16, 28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       DnPrt3 : BITFIELD_RANGE(0, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       DnPrt4 : BITFIELD_RANGE(16, 28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       DnPrt1 : BITFIELD_RANGE(0, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       DnPrt2 : BITFIELD_RANGE(16, 28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       DnWd20 : BITFIELD_RANGE(0, 4);
++            DWORD       DnWd21 : BITFIELD_RANGE(5, 9);
++            DWORD       DnWd22 : BITFIELD_RANGE(10, 14);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(15);
++            DWORD       DnPrt0 : BITFIELD_RANGE(16, 28);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(29, 31);
++        };
++        DWORD       Value;
++    } DW10;
++
++    // DWORD 11
++    union {
++        struct {
++            DWORD       DnWd00 : BITFIELD_RANGE(0, 4);
++            DWORD       DnWd01 : BITFIELD_RANGE(5, 9);
++            DWORD       DnWd02 : BITFIELD_RANGE(10, 14);
++            DWORD       DnWd10 : BITFIELD_RANGE(15, 19);
++            DWORD       DnWd11 : BITFIELD_RANGE(20, 24);
++            DWORD       DnWd12 : BITFIELD_RANGE(25, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD       Value;
++    } DW11;
++
++    // FMD and DI
++    // DWORD 12
++    union {
++        struct {
++            DWORD       SmoothMvThreshold : BITFIELD_RANGE(0, 1);
++            DWORD       SadTightThreshold : BITFIELD_RANGE(2, 5);
++            DWORD       ContentAdaptiveThresholdSlope : BITFIELD_RANGE(6, 9);
++            DWORD       StmmC2 : BITFIELD_RANGE(10, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 31);
++        };
++        DWORD       Value;
++    } DW12;
++
++    // DWORD 13
++    union {
++        struct {
++            DWORD       MaximumStmm : BITFIELD_RANGE(0, 7);
++            DWORD       MultiplierForVecm : BITFIELD_RANGE(8, 13);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(14, 15);
++            DWORD       BlendingConstantAcrossTimeForSmallValuesOfStmm : BITFIELD_RANGE(16, 23);
++            DWORD       BlendingConstantAcrossTimeForLargeValuesOfStmm : BITFIELD_RANGE(24, 30);
++            DWORD       StmmBlendingConstantSelect : BITFIELD_BIT(31);
++        };
++        DWORD       Value;
++    } DW13;
++
++    // DWORD 14
++    union {
++        struct {
++            DWORD       SdiDelta : BITFIELD_RANGE(0, 7);
++            DWORD       SdiThreshold : BITFIELD_RANGE(8, 15);
++            DWORD       StmmOutputShift : BITFIELD_RANGE(16, 19);
++            DWORD       StmmShiftUp : BITFIELD_RANGE(20, 21);
++            DWORD       StmmShiftDown : BITFIELD_RANGE(22, 23);
++            DWORD       MinimumStmm : BITFIELD_RANGE(24, 31);
++        };
++        DWORD       Value;
++    } DW14;
++
++    // DWORD 15
++    union {
++        struct {
++            DWORD       FmdTemporalDifferenceThreshold : BITFIELD_RANGE(0, 7);
++            DWORD       SdiFallbackMode2ConstantAngle2X1 : BITFIELD_RANGE(8, 15);
++            DWORD       SdiFallbackMode1T2Constant : BITFIELD_RANGE(16, 23);
++            DWORD       SdiFallbackMode1T1Constant : BITFIELD_RANGE(24, 31);
++        };
++        DWORD       Value;
++    } DW15;
++
++    // DWORD 16
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 2);
++            DWORD       DnDiTopFirst : BITFIELD_BIT(3);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(4, 6);
++            DWORD       McdiEnable : BITFIELD_BIT(7);
++            DWORD       FmdTearThreshold : BITFIELD_RANGE(8, 13);
++            DWORD       CatThreshold : BITFIELD_RANGE(14, 15);
++            DWORD       Fmd2VerticalDifferenceThreshold : BITFIELD_RANGE(16, 23);
++            DWORD       Fmd1VerticalDifferenceThreshold : BITFIELD_RANGE(24, 31);
++        };
++        DWORD       Value;
++    } DW16;
++
++    // DWORD 17
++    union {
++        struct {
++            DWORD       SadTha : BITFIELD_RANGE(0, 3);
++            DWORD       SadThb : BITFIELD_RANGE(4, 7);
++            DWORD       FmdFor1StFieldOfCurrentFrame : BITFIELD_RANGE(8, 9);
++            DWORD       McPixelConsistencyThreshold : BITFIELD_RANGE(10, 15);
++            DWORD       FmdFor2NdFieldOfPreviousFrame : BITFIELD_RANGE(16, 17);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(18);
++            DWORD       NeighborPixelThreshold : BITFIELD_RANGE(19, 22);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(23, 31);
++        };
++        DWORD       Value;
++    } DW17;
++} VEBOX_DNDI_STATE_G9, *PVEBOX_DNDI_STATE_G9;
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_STD_STE_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       StdEnable : BITFIELD_BIT(0);
++            DWORD       SteEnable : BITFIELD_BIT(1);
++            DWORD       OutputControl : BITFIELD_BIT(2);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(3);
++            DWORD       SatMax : BITFIELD_RANGE(4, 9);
++            DWORD       HueMax : BITFIELD_RANGE(10, 15);
++            DWORD       UMid : BITFIELD_RANGE(16, 23);
++            DWORD       VMid : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       Sin : BITFIELD_RANGE(0, 7);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(8, 9);
++            DWORD       Cos : BITFIELD_RANGE(10, 17);
++            DWORD       HsMargin : BITFIELD_RANGE(18, 20);
++            DWORD       DiamondDu : BITFIELD_RANGE(21, 27);
++            DWORD       DiamondMargin : BITFIELD_RANGE(28, 30);
++            DWORD       StdScoreOutput : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       DiamondDv : BITFIELD_RANGE(0, 6);
++            DWORD       DiamondTh : BITFIELD_RANGE(7, 12);
++            DWORD       DiamondAlpha : BITFIELD_RANGE(13, 20);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(21, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 6);
++            DWORD       VyStdEnable : BITFIELD_BIT(7);
++            DWORD       YPoint1 : BITFIELD_RANGE(8, 15);
++            DWORD       YPoint2 : BITFIELD_RANGE(16, 23);
++            DWORD       YPoint3 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       YPoint4 : BITFIELD_RANGE(0, 7);
++            DWORD       YSlope1 : BITFIELD_RANGE(8, 12);
++            DWORD       YSlope2 : BITFIELD_RANGE(13, 17);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(18, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       InvMarginVyl : BITFIELD_RANGE(0, 15);
++            DWORD       InvSkinTypesMargin : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       InvMarginVyu : BITFIELD_RANGE(0, 15);
++            DWORD       P0L : BITFIELD_RANGE(16, 23);
++            DWORD       P1L : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       P2L : BITFIELD_RANGE(0, 7);
++            DWORD       P3L : BITFIELD_RANGE(8, 15);
++            DWORD       B0L : BITFIELD_RANGE(16, 23);
++            DWORD       B1L : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       B2L : BITFIELD_RANGE(0, 7);
++            DWORD       B3L : BITFIELD_RANGE(8, 15);
++            DWORD       S0L : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       S1L : BITFIELD_RANGE(0, 10);
++            DWORD       S2L : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       S3L : BITFIELD_RANGE(0, 10);
++            DWORD       P0U : BITFIELD_RANGE(11, 18);
++            DWORD       P1U : BITFIELD_RANGE(19, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW10;
++
++    // DWORD 11
++    union {
++        struct {
++            DWORD       P2U : BITFIELD_RANGE(0, 7);
++            DWORD       P3U : BITFIELD_RANGE(8, 15);
++            DWORD       B0U : BITFIELD_RANGE(16, 23);
++            DWORD       B1U : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW11;
++
++    // DWORD 12
++    union {
++        struct {
++            DWORD       B2U : BITFIELD_RANGE(0, 7);
++            DWORD       B3U : BITFIELD_RANGE(8, 15);
++            DWORD       S0U : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW12;
++
++    // DWORD 13
++    union {
++        struct {
++            DWORD       S1U : BITFIELD_RANGE(0, 10);
++            DWORD       S2U : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW13;
++
++    // DWORD 14
++    union {
++        struct {
++            DWORD       S3U : BITFIELD_RANGE(0, 10);
++            DWORD       SkinTypesEnable : BITFIELD_BIT(11);
++            DWORD       SkinTypesThresh : BITFIELD_RANGE(12, 19);
++            DWORD       SkinTypesMargin : BITFIELD_RANGE(20, 27);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(28, 31);
++        };
++        DWORD           Value;
++    } DW14;
++
++    // DWORD 15
++    union {
++        struct {
++            DWORD       Satp1 : BITFIELD_RANGE(0, 6);
++            DWORD       Satp2 : BITFIELD_RANGE(7, 13);
++            DWORD       Satp3 : BITFIELD_RANGE(14, 20);
++            DWORD       Satb1 : BITFIELD_RANGE(21, 30);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW15;
++
++    // DWORD 16
++    union {
++        struct {
++            DWORD       Satb2 : BITFIELD_RANGE(0, 9);
++            DWORD       Satb3 : BITFIELD_RANGE(10, 19);
++            DWORD       Sats0 : BITFIELD_RANGE(20, 30);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW16;
++
++    // DWORD 17
++    union {
++        struct {
++            DWORD       Sats1 : BITFIELD_RANGE(0, 10);
++            DWORD       Sats2 : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW17;
++
++    // DWORD 18
++    union {
++        struct {
++            DWORD       Sats3 : BITFIELD_RANGE(0, 10);
++            DWORD       Huep1 : BITFIELD_RANGE(11, 17);
++            DWORD       Huep2 : BITFIELD_RANGE(18, 24);
++            DWORD       Huep3 : BITFIELD_RANGE(25, 31);
++        };
++        DWORD           Value;
++    } DW18;
++
++    // DWORD 19
++    union {
++        struct {
++            DWORD       Hueb1 : BITFIELD_RANGE(0, 9);
++            DWORD       Hueb2 : BITFIELD_RANGE(10, 19);
++            DWORD       Hueb3 : BITFIELD_RANGE(20, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW19;
++
++    // DWORD 20
++    union {
++        struct {
++            DWORD       Hues0 : BITFIELD_RANGE(0, 10);
++            DWORD       Hues1 : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW20;
++
++    // DWORD 21
++    union {
++        struct {
++            DWORD       Hues2 : BITFIELD_RANGE(0, 10);
++            DWORD       Hues3 : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW21;
++
++    // DWORD 22
++    union {
++        struct {
++            DWORD       Satp1Dark : BITFIELD_RANGE(0, 6);
++            DWORD       Satp2Dark : BITFIELD_RANGE(7, 13);
++            DWORD       Satp3Dark : BITFIELD_RANGE(14, 20);
++            DWORD       Satb1Dark : BITFIELD_RANGE(21, 30);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW22;
++
++    // DWORD 23
++    union {
++        struct {
++            DWORD       Satb2Dark : BITFIELD_RANGE(0, 9);
++            DWORD       Satb3Dark : BITFIELD_RANGE(10, 19);
++            DWORD       Sats0Dark : BITFIELD_RANGE(20, 30);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW23;
++
++    // DWORD 24
++    union {
++        struct {
++            DWORD       Sats1Dark : BITFIELD_RANGE(0, 10);
++            DWORD       Sats2Dark : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW24;
++
++    // DWORD 25
++    union {
++        struct {
++            DWORD       Sats3Dark : BITFIELD_RANGE(0, 10);
++            DWORD       Huep1Dark : BITFIELD_RANGE(11, 17);
++            DWORD       Huep2Dark : BITFIELD_RANGE(18, 24);
++            DWORD       Huep3Dark : BITFIELD_RANGE(25, 31);
++        };
++        DWORD           Value;
++    } DW25;
++
++    // DWORD 26
++    union {
++        struct {
++            DWORD       Hueb1Dark : BITFIELD_RANGE(0, 9);
++            DWORD       Hueb2Dark : BITFIELD_RANGE(10, 19);
++            DWORD       Hueb3Dark : BITFIELD_RANGE(20, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW26;
++
++    // DWORD 27
++    union {
++        struct {
++            DWORD       Hues0Dark : BITFIELD_RANGE(0, 10);
++            DWORD       Hues1Dark : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW27;
++
++    // DWORD 28
++    union {
++        struct {
++            DWORD       Hues2Dark : BITFIELD_RANGE(0, 10);
++            DWORD       Hues3Dark : BITFIELD_RANGE(11, 21);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW28;
++} VEBOX_STD_STE_STATE_G9, *PVEBOX_STD_STE_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_ACE_LACE_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       AceEnable : BITFIELD_BIT(0);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(1);
++            DWORD       SkinThreshold : BITFIELD_RANGE(2, 6);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(7, 11);
++            DWORD       LaceHistogramEnable : BITFIELD_BIT(12);
++            DWORD       LaceHistogramSize : BITFIELD_BIT(13);
++            DWORD       LaceSingleHistogramSet : BITFIELD_RANGE(14, 15);
++            DWORD       MinAceLuma : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       Ymin : BITFIELD_RANGE(0, 7);
++            DWORD       Y1 : BITFIELD_RANGE(8, 15);
++            DWORD       Y2 : BITFIELD_RANGE(16, 23);
++            DWORD       Y3 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       Y4 : BITFIELD_RANGE(0, 7);
++            DWORD       Y5 : BITFIELD_RANGE(8, 15);
++            DWORD       Y6 : BITFIELD_RANGE(16, 23);
++            DWORD       Y7 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       Y8 : BITFIELD_RANGE(0, 7);
++            DWORD       Y9 : BITFIELD_RANGE(8, 15);
++            DWORD       Y10 : BITFIELD_RANGE(16, 23);
++            DWORD       Ymax : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       B1 : BITFIELD_RANGE(0, 7);
++            DWORD       B2 : BITFIELD_RANGE(8, 15);
++            DWORD       B3 : BITFIELD_RANGE(16, 23);
++            DWORD       B4 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       B5 : BITFIELD_RANGE(0, 7);
++            DWORD       B6 : BITFIELD_RANGE(8, 15);
++            DWORD       B7 : BITFIELD_RANGE(16, 23);
++            DWORD       B8 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       B9 : BITFIELD_RANGE(0, 7);
++            DWORD       B10 : BITFIELD_RANGE(8, 15);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       S0 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       S1 : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       S2 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       S3 : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       S4 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       S5 : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       S6 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       S7 : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW10;
++
++    // DWORD 11
++    union {
++        struct {
++            DWORD       S8 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       S9 : BITFIELD_RANGE(16, 26);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(27, 31);
++        };
++        DWORD           Value;
++    } DW11;
++
++    // DWORD 12
++    union {
++        struct {
++            DWORD       S10 : BITFIELD_RANGE(0, 10);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(11, 15);
++            DWORD       MaxAceLuma : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW12;
++
++} VEBOX_ACE_LACE_STATE_G9, *PVEBOX_ACE_LACE_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_TCC_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 6);
++            DWORD       TccEnable : BITFIELD_BIT(7);
++            DWORD       SatFactor1 : BITFIELD_RANGE(8, 15);
++            DWORD       SatFactor2 : BITFIELD_RANGE(16, 23);
++            DWORD       SatFactor3 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 7);
++            DWORD       SatFactor4 : BITFIELD_RANGE(8, 15);
++            DWORD       SatFactor5 : BITFIELD_RANGE(16, 23);
++            DWORD       SatFactor6 : BITFIELD_RANGE(24, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       BaseColor1 : BITFIELD_RANGE(0, 9);
++            DWORD       BaseColor2 : BITFIELD_RANGE(10, 19);
++            DWORD       BaseColor3 : BITFIELD_RANGE(20, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       BaseColo4 : BITFIELD_RANGE(0, 9);
++            DWORD       BaseColor5 : BITFIELD_RANGE(10, 19);
++            DWORD       BaseColor6 : BITFIELD_RANGE(20, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       ColorTransitSlope2 : BITFIELD_RANGE(0, 15);
++            DWORD       ColorTransitSlope23 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       ColorTransitSlope34 : BITFIELD_RANGE(0, 15);
++            DWORD       ColorTransitSlope45 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       ColorTransitSlope56 : BITFIELD_RANGE(0, 15);
++            DWORD       ColorTransitSlope61 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 1);
++            DWORD       ColorBias1 : BITFIELD_RANGE(2, 11);
++            DWORD       ColorBias2 : BITFIELD_RANGE(12, 21);
++            DWORD       ColorBias3 : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(0, 1);
++            DWORD       ColorBias4 : BITFIELD_RANGE(2, 11);
++            DWORD       ColorBias5 : BITFIELD_RANGE(12, 21);
++            DWORD       ColorBias6 : BITFIELD_RANGE(22, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       SteSlopeBits : BITFIELD_RANGE(0, 2);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(3, 7);
++            DWORD       SteThreshold : BITFIELD_RANGE(8, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 15);
++            DWORD       UvThresholdBits : BITFIELD_RANGE(16, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 23);
++            DWORD       UvThreshold : BITFIELD_RANGE(24, 30);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       UVMaxColor : BITFIELD_RANGE(0, 8);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(9, 15);
++            DWORD       InvUvmaxColor : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW10;
++
++} VEBOX_TCC_STATE_G9, *PVEBOX_TCC_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_PROCAMP_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       ProcampEnable : BITFIELD_BIT(0);
++            DWORD       Brightness : BITFIELD_RANGE(1, 12);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(13, 16);
++            DWORD       Contrast : BITFIELD_RANGE(17, 27);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(28, 31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       SinCS : BITFIELD_RANGE(0, 15);
++            DWORD       CosCS : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++} VEBOX_PROCAMP_STATE_G9, *PVEBOX_PROCAMP_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_CSC_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       C0 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 29);
++            DWORD       YuvChannelSwap : BITFIELD_BIT(30);
++            DWORD       TransformEnable : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       C1 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       C2 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       C3 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       C4 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       C5 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       C6 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       C7 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       C8 : BITFIELD_RANGE(0, 18);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       OffsetIn1 : BITFIELD_RANGE(0, 15);
++            DWORD       OffsetOut1 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       OffsetIn2 : BITFIELD_RANGE(0, 15);
++            DWORD       OffsetOut2 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW10;
++
++    // DWORD 11
++    union {
++        struct {
++            DWORD       OffsetIn3 : BITFIELD_RANGE(0, 15);
++            DWORD       OffsetOut3 : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW11;
++
++} VEBOX_CSC_STATE_G9, *PVEBOX_CSC_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_ALPHA_AOI_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       ColorPipeAlpha : BITFIELD_RANGE(0, 15);
++            DWORD       AlphaFromStateSelect : BITFIELD_BIT(16);
++            DWORD       FullImageHistogram : BITFIELD_BIT(17);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(18, 31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       AoiMinX : BITFIELD_RANGE(0, 13);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(14, 15);
++            DWORD       AoiMaxX : BITFIELD_RANGE(16, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       AoiMinY : BITFIELD_RANGE(0, 13);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(14, 15);
++            DWORD       AoiMaxY : BITFIELD_RANGE(16, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++} VEBOX_ALPHA_AOI_STATE_G9, *PVEBOX_ALPHA_AOI_STATE_G9;
++
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_CCM_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       C1 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 30);
++            DWORD       ColorCorrectionMatrixEnable : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       C0 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       C3 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       C2 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       C5 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       C4 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       C7 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       C6 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       C8 : BITFIELD_RANGE(0, 16);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(17, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++} VEBOX_CCM_STATE_G9, *PVEBOX_CCM_STATE_G9;
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_FRONT_END_CSC_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       FecscC0TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 30);
++            DWORD       FrontEndCscTransformEnable : BITFIELD_BIT(31);
++        };
++        DWORD           Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       FecscC1TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       FecscC2TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       FecscC3TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       FecscC4TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       FecscC5TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       FecscC6TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW6;
++
++    // DWORD 7
++    union {
++        struct {
++            DWORD       FecscC7TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW7;
++
++    // DWORD 8
++    union {
++        struct {
++            DWORD       FecscC8TransformCoefficient : BITFIELD_RANGE(0, 18);
++            DWORD       Rserved : BITFIELD_RANGE(19, 31);
++        };
++        DWORD           Value;
++    } DW8;
++
++    // DWORD 9
++    union {
++        struct {
++            DWORD       FecScOffsetIn1OffsetInForYR : BITFIELD_RANGE(0, 15);
++            DWORD       FecScOffsetOut1OffsetOutForYR : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW9;
++
++    // DWORD 10
++    union {
++        struct {
++            DWORD       FecScOffsetIn2OffsetOutForUG : BITFIELD_RANGE(0, 15);
++            DWORD       FecScOffsetOut2OffsetOutForUG : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW10;
++
++    // DWORD 11
++    union {
++        struct {
++            DWORD       FecScOffsetIn3OffsetOutForVB : BITFIELD_RANGE(0, 15);
++            DWORD       FecScOffsetOut3OffsetOutForVB : BITFIELD_RANGE(16, 31);
++        };
++        DWORD           Value;
++    } DW11;
++
++} VEBOX_FRONT_END_CSC_STATE_G9, *PVEBOX_FRONT_END_CSC_STATE_G9;
++
++// Defined in vol2c "Vebox"
++typedef struct _VEBOX_IECP_STATE_G9
++{
++    // DWORD 0_28
++    VEBOX_STD_STE_STATE_G9                      StdSteState;
++
++    // DWORD 29_41
++    VEBOX_ACE_LACE_STATE_G9                     AceLaceState;
++
++    // DWORD 42_52
++    VEBOX_TCC_STATE_G9                          TccState;
++
++    // DWORD 53_54
++    VEBOX_PROCAMP_STATE_G9                      ProcAmpState;
++
++    // DWORD 55_66
++    VEBOX_CSC_STATE_G9                          CscState;
++
++    // DWORD 67_69
++    VEBOX_ALPHA_AOI_STATE_G9                    AlphaAoiState;
++
++    // DWORD 70_78
++    VEBOX_CCM_STATE_G9                          CcmState;
++
++    // DWORD 79_90
++    VEBOX_FRONT_END_CSC_STATE_G9                FrontEndCscState;
++} VEBOX_IECP_STATE_G9, *PVEBOX_IECP_STATE_G9;
++
++
++// Defined in vol2c "VEBOX"
++typedef struct _VEBOX_CAPTURE_PIPE_STATE_G9
++{
++    // DWORD 0
++    union {
++        struct {
++            DWORD       GoodPixelNeighborThreshold : BITFIELD_RANGE(0, 5);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(6, 7);
++            DWORD       AverageColorThreshold : BITFIELD_RANGE(8, 15);
++            DWORD       GreenImbalanceThreshold : BITFIELD_RANGE(16, 19);
++            DWORD       ShiftMinCost : BITFIELD_RANGE(20, 22);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_BIT(23);
++            DWORD       GoodPixelThreshold : BITFIELD_RANGE(24, 29);
++            DWORD       __CODEGEN_UNIQUE(Reserved) : BITFIELD_RANGE(30, 31);
++        };
++        DWORD Value;
++    } DW0;
++
++    // DWORD 1
++    union {
++        struct {
++            DWORD       BadColorThreshold3 : BITFIELD_RANGE(0, 3);
++            DWORD       NumberBigPixelTheshold : BITFIELD_RANGE(4, 7);
++            DWORD       BadColorThreshold2 : BITFIELD_RANGE(8, 15);
++            DWORD       BadColorThreshold1 : BITFIELD_RANGE(16, 23);
++            DWORD       GoodIntesityThreshold : BITFIELD_RANGE(24, 27);
++            DWORD       ScaleForMinCost : BITFIELD_RANGE(28, 31);
++        };
++        DWORD Value;
++    } DW1;
++
++    // DWORD 2
++    union {
++        struct {
++            DWORD       WhiteBalanceCorrectionEnable : BITFIELD_BIT(0);
++            DWORD       BlackPointCorrectionEnable : BITFIELD_BIT(1);
++            DWORD       VignetteCorrectionFormat : BITFIELD_BIT(2);
++            DWORD       RgbHistogramEnable : BITFIELD_BIT(3);
++            DWORD       BlackPointOffsetGreenBottomMsb : BITFIELD_BIT(4);
++            DWORD       BlackPointOffsetBlueMsb : BITFIELD_BIT(5);
++            DWORD       BlackPointOffsetGreenTopMsb : BITFIELD_BIT(6);
++            DWORD       BlackPointOffsetRedMsb : BITFIELD_BIT(7);
++            DWORD       UvThresholdValue : BITFIELD_RANGE(8, 15);
++            DWORD       YOutlierValue : BITFIELD_RANGE(16, 23);
++            DWORD       YBrightValue : BITFIELD_RANGE(24, 31);
++        };
++        DWORD Value;
++    } DW2;
++
++    // DWORD 3
++    union {
++        struct {
++            DWORD       BlackPointOffsetGreenTop : BITFIELD_RANGE(0, 15);
++            DWORD       BlackPointOffsetRed : BITFIELD_RANGE(16, 31);
++        };
++        DWORD Value;
++    } DW3;
++
++    // DWORD 4
++    union {
++        struct {
++            DWORD       BlackPointOffsetGreenBottom : BITFIELD_RANGE(0, 15);
++            DWORD       BlackPointOffsetBlue : BITFIELD_RANGE(16, 31);
++        };
++        DWORD Value;
++    } DW4;
++
++    // DWORD 5
++    union {
++        struct {
++            DWORD       WhiteBalanceGreenTopCorrection : BITFIELD_RANGE(0, 15);
++            DWORD       WhiteBalanceRedCorrection : BITFIELD_RANGE(16, 31);
++        };
++        DWORD Value;
++    } DW5;
++
++    // DWORD 6
++    union {
++        struct {
++            DWORD       WhiteBalanceGreenBottomCorrection : BITFIELD_RANGE(0, 15);
++            DWORD       WhiteBalanceBlueCorrection : BITFIELD_RANGE(16, 31);
++        };
++        DWORD Value;
++    } DW6;
++
++} VEBOX_CAPTURE_PIPE_STATE_G9, *PVEBOX_CAPTURE_PIPE_STATE_G9;
++
++
++
++
++typedef struct __CM_VEBOX_PARAM_G9
++{
++    PVEBOX_DNDI_STATE_G9         pDndiState;
++    unsigned char                padding1[4024];
++    PVEBOX_IECP_STATE_G9         pIecpState;
++    unsigned char                padding2[3732];
++    PVEBOX_GAMUT_STATE_G75       pGamutState;
++    unsigned char                padding3[3936];
++    PVEBOX_VERTEX_TABLE_G75      pVertexTable;
++    unsigned char                padding4[2048];
++    PVEBOX_CAPTURE_PIPE_STATE_G9 pCapturePipe;
++}CM_VEBOX_PARAM_G9, PCM_VEBOX_PARAM_G9;
++
++#endif //__CM_RT_G9_H__
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h
+new file mode 100644
+index 000000000000..8de45c184b8e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h
+@@ -0,0 +1,62 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <unordered_set>
++
++#include "Types.h"
++#include "Utils.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++namespace CIPR {
++class Buffer {
++ public:
++    Buffer(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory);
++    Buffer(Buffer* parent, uint32_t offset, uint32_t size);
++    ~Buffer();
++
++    bool isRegion() const;
++    Buffer* getParent();
++    Result getMemoryCpuPtr(void** ptr);
++    Result getMemorySize(int* size);
++    Result attatchDevice(Context* ctx);
++
++ private:
++    MemoryDesc mMemoryDesc;
++    uint32_t mOffset = 0;
++    std::unordered_set<Buffer*> mRegions;
++    bool mInitialized = false;
++    Context* mContext;
++
++ private:
++    Result createWithUserMemory(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory);
++    Result createWithUserMemoryWithCpuPtr(MemoryFlag flags, const MemoryDesc* userMemory);
++    Result createWithUserMemoryCommon(MemoryFlag flags, const MemoryDesc* userMemory);
++
++    Result validateBuffer(const MemoryDesc* memory);
++    Result allocateCommon();
++    Result allocate();
++    Result getMemory(MemoryDesc* mem);
++    Result getMemoryCommon(MemoryDesc* mem);
++    void destroy();
++    friend Command;
++
++    DISALLOW_COPY_AND_ASSIGN(Buffer);
++};
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
+new file mode 100644
+index 000000000000..9c125eeab88c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++
++#include "Buffer.h"
++#include "Context.h"
++#include "Types.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++namespace CIPR {
++class Command {
++ public:
++    explicit Command(const PSysCommandConfig& cfg);
++    ~Command();
++
++    Result getConfig(PSysCommandConfig* cfg);
++    Result setConfig(const PSysCommandConfig& cfg);
++    Result enqueue(Context* ctx);
++
++ private:
++    Result grokBuffers(const PSysCommandConfig& cfg);
++    Result updatePG(const PSysCommandConfig& cfg);
++    Result updateKernel(const PSysCommandConfig& cfg, const MemoryDesc& memory);
++    Result getLegacyPGMem(const PSysCommandConfig& cfg, MemoryDesc* memory);
++
++ private:
++    PSysCommand* mCmd = nullptr;
++    bool mInitialized = false;
++
++    DISALLOW_COPY_AND_ASSIGN(Command);
++};
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
+new file mode 100644
+index 000000000000..9beef1228e2a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
+@@ -0,0 +1,69 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <vector>
++
++#include "Buffer.h"
++#include "Types.h"
++#include "Utils.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++namespace CIPR {
++class ContextPoller;
++class Context : public MemoryOper {
++ public:
++    Context();
++    virtual ~Context();
++
++    Result getCapabilities(PSYSCapability* cap);
++    Result getManifest(uint32_t index, uint32_t* mainfestSize, void* manifest);
++    Result allocate(MemoryDesc* mem) final;
++    Result migrate(MemoryDesc* mem) final;
++    Result getMemory(MemoryDesc* mem, MemoryDesc* out) final;
++    Result destroy(MemoryDesc* mem) final;
++    Result doIoctl(int request, void* ptr);
++    ContextPoller getPoller(int event, int timeout);
++
++ private:
++    enum class Flags { DEBUG, NONE };
++    int mFd = -1;
++    Flags mInitFlag = Flags::NONE;
++    bool mInitialized;
++
++ private:
++    Result registerBuffer(MemoryDesc* mem);
++    Result unregisterBuffer(MemoryDesc* mem);
++    static Result psysClose(int fd);
++
++    DISALLOW_COPY_AND_ASSIGN(Context);
++};
++
++class ContextPoller {
++ public:
++    int poll();
++
++ private:
++    int mTimeout;
++    int mEvents;
++    int mFd;
++
++    friend Context;
++};
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h
+new file mode 100644
+index 000000000000..8aae6bf2acee
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "Types.h"
++#include "iutils/Utils.h"
++
++namespace icamera {
++namespace CIPR {
++class Event {
++ public:
++    explicit Event(const PSysEventConfig& eventConfig);
++    ~Event();
++
++    Result getConfig(PSysEventConfig* eventConfig);
++    Result setConfig(const PSysEventConfig& eventConfig);
++    Result wait(Context* ctx);
++
++ private:
++    PSysEvent* mEvent = nullptr;
++    bool mInitialized = false;
++
++    DISALLOW_COPY_AND_ASSIGN(Event);
++};
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
+new file mode 100644
+index 000000000000..0779ad3b6684
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
+@@ -0,0 +1,198 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include <vector>
++
++#include "modules/ia_cipr/include/ipu-psys.h"
++
++namespace icamera {
++namespace CIPR {
++enum class Result {
++    OK,
++    GeneralError,
++    NoMemory,
++    DataError,
++    InternalError,
++    InvaildArg,
++    NoEntry,
++    TimeOut,
++    End,
++    Full,
++    Retry,
++    NoImple
++};
++
++enum MemoryFlag : uint32_t {
++    CpuPtr = (uint32_t)(1 << 0),
++    MemoryHandle = (uint32_t)(1 << 1),
++    AllocateCpuPtr = (uint32_t)(1 << 2),
++    CopyFromUser = (uint32_t)(1 << 3),
++    HardwareOnly = (uint32_t)(1 << 4),
++    ReadOnly = (uint32_t)(1 << 5),
++    WriteOnly = (uint32_t)(1 << 6),
++    UnCached = (uint32_t)(1 << 7),
++    Uninitialized = (uint32_t)(1 << 8),
++    Secured = (uint32_t)(1 << 9),
++    CpuOnly = (uint32_t)(1 << 10),
++    FlushCpuCache = (uint32_t)(1 << 11),
++    Allocated = (uint32_t)(1 << 13),
++    MemoryFromUser = (uint32_t)(1 << 14),
++    Migrated = (uint32_t)(1 << 15),
++    NoFlush = (uint32_t)(1 << 17),
++    PSysAPI = (uint32_t)(1 << 31),
++    DeviceMask = (uint32_t)0xFFFF0000
++};
++
++inline MemoryFlag operator|(MemoryFlag a, MemoryFlag b) {
++    return static_cast<MemoryFlag>(static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
++}
++
++inline MemoryFlag operator&(MemoryFlag a, MemoryFlag b) {
++    return static_cast<MemoryFlag>(static_cast<uint32_t>(a) & static_cast<uint32_t>(b));
++}
++
++inline MemoryFlag operator~(MemoryFlag a) {
++    return static_cast<MemoryFlag>(~static_cast<uint32_t>(a));
++}
++
++// NOLINTNEXTLINE
++inline MemoryFlag& operator|=(MemoryFlag& a, MemoryFlag b) {
++    return a = static_cast<MemoryFlag>(static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
++}
++
++// NOLINTNEXTLINE
++inline MemoryFlag& operator&=(MemoryFlag& a, MemoryFlag b) {
++    return a = static_cast<MemoryFlag>(static_cast<uint32_t>(a) & static_cast<uint32_t>(b));
++}
++
++class Command;
++class Event;
++class Buffer;
++class Context;
++
++typedef ipu_psys_buffer IPUPSysBuffer;
++struct MemoryDesc {
++    uint32_t size;
++    void* cpuPtr;
++    uint64_t handle;
++    MemoryFlag flags;
++    Buffer* anchor;
++    IPUPSysBuffer* sysBuff;
++};
++
++struct PSysEvent {
++    struct ipu_psys_event event;
++    int32_t timeout;
++};
++
++struct PSysEventConfig {
++    uint32_t type;
++    uint64_t id;
++    uint64_t commandToken;
++    uint64_t commandIssueID;
++    uint64_t bufferHandoverBitmap;
++    uint32_t error;
++    int32_t timeout;
++};
++
++const int PSYS_CAP_DRIVER_FIELD_LENGTH = 20;
++const int PSYS_CAP_DEVMODEL_FIELD_LENGTH = 32;
++struct PSYSCapability {
++    uint32_t version;
++    uint8_t driver[PSYS_CAP_DRIVER_FIELD_LENGTH];
++    uint8_t devModel[PSYS_CAP_DEVMODEL_FIELD_LENGTH];
++    uint32_t programGroupCount;
++};
++
++#define psys_command_ext_na 0
++#define psys_command_ext_ppg_0 1
++#define psys_command_ext_ppg_1 2
++struct PSysCmdExtHeader {
++    uint32_t offset;
++    uint64_t size;
++    uint32_t version;
++};
++
++struct ProcessGroupCommand {
++    PSysCmdExtHeader header;
++    uint8_t frameCounter;
++    uint8_t queueID;
++    uint16_t fragmentState;
++    uint64_t eventReqBitmap;
++    uint64_t irqReqBitmap;
++    uint32_t dynamicKernelBitmap[4];
++};
++
++struct PSysCommandConfig {
++    PSysCommandConfig()
++            : id(0),
++              token(0),
++              issueID(0),
++              priority(0),
++              psysFrequency(0),
++              extBuf(nullptr),
++              pgParamsBuf(nullptr),
++              pgManifestBuf(nullptr),
++              pg(nullptr) {}
++    uint64_t id;
++    uint64_t token;
++    uint64_t issueID;
++    uint32_t priority;
++    uint32_t psysFrequency;
++    std::vector<Buffer*> buffers;
++    Buffer* extBuf;
++    Buffer* pgParamsBuf;
++    Buffer* pgManifestBuf;
++    Buffer* pg;
++};
++
++struct PSysCommand {
++    PSysCommand()
++            : pg(nullptr),
++              pgParams(nullptr),
++              pgParamsSize(0),
++              extBuf(nullptr),
++              pgManifestBuf(nullptr) {
++        memset(&iocCmd, 0, sizeof(iocCmd));
++    }
++
++    struct ipu_psys_command iocCmd;
++    std::vector<Buffer*> userBuffers;
++    Buffer* pg;
++    void* pgParams;
++    uint32_t pgParamsSize;
++    Buffer* extBuf;
++    Buffer* pgManifestBuf;
++};
++
++class MemoryOper {
++ public:
++    virtual ~MemoryOper() = default;
++
++    virtual Result allocate(MemoryDesc* mem) = 0;
++    virtual Result migrate(MemoryDesc* mem) = 0;
++    virtual Result getMemory(MemoryDesc* mem, MemoryDesc* out) = 0;
++    virtual Result destroy(MemoryDesc* mem) = 0;
++};
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h
+new file mode 100644
+index 000000000000..b5c413b2858f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#pragma once
++
++#include "Types.h"
++
++namespace icamera {
++namespace CIPR {
++void* mallocMemory(size_t sz);
++void* callocMemory(size_t cnt, size_t sz);
++void* mallocAlignedMemory(size_t sz, size_t fact);
++void freeMemory(void* ptr);
++void memoryCopy(void* dst, size_t dsz, const void* src, size_t sz);
++size_t getPageSize();
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
+new file mode 100644
+index 000000000000..657027a5a3ec
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/ipu-psys.h
+@@ -0,0 +1,112 @@
++/****************************************************************************
++ * Copyright (C) 2019 Intel Corporation.
++ ****************************************************************************
++ ***
++ ***   This header was automatically generated from a Linux kernel header
++ ***   of the same name, to make information necessary for userspace to
++ ***   call into the kernel available to libc.  It contains only constants,
++ ***   structures, and macros generated from the original header, and thus,
++ ***   contains no copyrightable information.
++ ***
++ ***   To edit the content of this header, modify the corresponding
++ ***   source file (e.g. under external/kernel-headers/original/) then
++ ***   run bionic/libc/kernel/tools/update_all.py
++ ***
++ ***   Any manual change here will be lost the next time this script will
++ ***   be run. You've been warned!
++ ***
++ ****************************************************************************
++ ****************************************************************************/
++#ifndef _UAPI_IPU_PSYS_H
++#define _UAPI_IPU_PSYS_H
++#include <linux/types.h>
++struct ipu_psys_capability {
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t version;
++  uint8_t driver[20];
++  uint32_t pg_count;
++  uint8_t dev_model[32];
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t reserved[17];
++} __attribute__((packed));
++struct ipu_psys_event {
++  uint32_t type;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint64_t user_token;
++  uint64_t issue_id;
++  uint32_t buffer_idx;
++  uint32_t error;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  int32_t reserved[2];
++} __attribute__((packed));
++#define IPU_PSYS_EVENT_TYPE_CMD_COMPLETE 1
++#define IPU_PSYS_EVENT_TYPE_BUFFER_COMPLETE 2
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++struct ipu_psys_buffer {
++  uint64_t len;
++  union {
++    int fd;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++    void* userptr;
++    uint64_t reserved;
++  } base;
++  uint32_t data_offset;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t bytes_used;
++  uint32_t flags;
++  uint32_t reserved[2];
++} __attribute__((packed));
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define IPU_BUFFER_FLAG_INPUT (1 << 0)
++#define IPU_BUFFER_FLAG_OUTPUT (1 << 1)
++#define IPU_BUFFER_FLAG_MAPPED (1 << 2)
++#define IPU_BUFFER_FLAG_NO_FLUSH (1 << 3)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define IPU_BUFFER_FLAG_DMA_HANDLE (1 << 4)
++#define IPU_BUFFER_FLAG_USERPTR (1 << 5)
++#define IPU_PSYS_CMD_PRIORITY_HIGH 0
++#define IPU_PSYS_CMD_PRIORITY_MED 1
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define IPU_PSYS_CMD_PRIORITY_LOW 2
++#define IPU_PSYS_CMD_PRIORITY_NUM 3
++struct ipu_psys_command {
++  uint64_t issue_id;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint64_t user_token;
++  uint32_t priority;
++  void* pg_manifest;
++  struct ipu_psys_buffer* buffers;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  int pg;
++  uint32_t pg_manifest_size;
++  uint32_t bufcount;
++  uint32_t min_psys_freq;
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t frame_counter;
++  uint32_t kernel_enable_bitmap[4];
++  uint32_t terminal_enable_bitmap[4];
++  uint32_t routing_enable_bitmap[4];
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t rbm[5];
++  uint32_t reserved[2];
++} __attribute__((packed));
++struct ipu_psys_manifest {
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++  uint32_t index;
++  uint32_t size;
++  void* manifest;
++  uint32_t reserved[5];
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++} __attribute__((packed));
++#define IPU_IOC_QUERYCAP _IOR('A', 1, struct ipu_psys_capability)
++#define IPU_IOC_MAPBUF _IOWR('A', 2, int)
++#define IPU_IOC_UNMAPBUF _IOWR('A', 3, int)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define IPU_IOC_GETBUF _IOWR('A', 4, struct ipu_psys_buffer)
++#define IPU_IOC_PUTBUF _IOWR('A', 5, struct ipu_psys_buffer)
++#define IPU_IOC_QCMD _IOWR('A', 6, struct ipu_psys_command)
++#define IPU_IOC_DQEVENT _IOWR('A', 7, struct ipu_psys_event)
++/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
++#define IPU_IOC_CMD_CANCEL _IOWR('A', 8, struct ipu_psys_command)
++#define IPU_IOC_GET_MANIFEST _IOWR('A', 9, struct ipu_psys_manifest)
++#endif
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp
+new file mode 100644
+index 000000000000..fcaaa46575cb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp
+@@ -0,0 +1,388 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CIPR_BUFFER"
++
++#include "modules/ia_cipr/include/Buffer.h"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++#include "modules/ia_cipr/include/Context.h"
++
++using icamera::CAMERA_DEBUG_LOG_DBG;
++using icamera::CAMERA_DEBUG_LOG_ERR;
++using icamera::CAMERA_DEBUG_LOG_VERBOSE;
++using icamera::CAMERA_DEBUG_LOG_WARNING;
++
++namespace icamera {
++namespace CIPR {
++Result Buffer::allocateCommon() {
++    if (mMemoryDesc.flags & MemoryFlag::DeviceMask) {
++        CheckError(mContext == nullptr, Result::InvaildArg,
++                   "%s: device memory flags specified, migrate first!", __func__);
++    }
++
++    CheckError(mMemoryDesc.cpuPtr && !(mMemoryDesc.flags & MemoryFlag::CopyFromUser),
++               Result::InvaildArg, "%s: already allocated", __func__);
++
++    void* cpuPtr = CIPR::mallocMemory(mMemoryDesc.size);
++    CheckError(!cpuPtr, Result::NoMemory, "@%s, cpuPtr is nullptr", __func__);
++
++    if (mMemoryDesc.flags & MemoryFlag::CopyFromUser) {
++        if (mMemoryDesc.cpuPtr) {
++            memoryCopy(cpuPtr, mMemoryDesc.size, mMemoryDesc.cpuPtr, mMemoryDesc.size);
++        } else if (mMemoryDesc.flags & MemoryFlag::MemoryHandle) {
++            icamera::LOGE("%s: copy from handle to host only memory not implemented", __func__);
++            if (cpuPtr) CIPR::freeMemory(cpuPtr);
++            return Result::GeneralError;
++        }
++        mMemoryDesc.flags &= ~MemoryFlag::CopyFromUser;
++    }
++
++    mMemoryDesc.cpuPtr = cpuPtr;
++    mMemoryDesc.flags &= ~MemoryFlag::AllocateCpuPtr;
++    mMemoryDesc.flags |= MemoryFlag::CpuPtr | MemoryFlag::Allocated;
++
++    return Result::OK;
++}
++
++void Buffer::destroy() {
++    if ((mMemoryDesc.flags & MemoryFlag::Allocated) && (mMemoryDesc.flags & MemoryFlag::CpuPtr) &&
++        mMemoryDesc.cpuPtr) {
++        CIPR::freeMemory(mMemoryDesc.cpuPtr);
++    }
++}
++
++Result Buffer::getMemoryCommon(MemoryDesc* out) {
++    if (mMemoryDesc.flags & MemoryFlag::AllocateCpuPtr) {
++        CheckError(mMemoryDesc.cpuPtr, Result::InternalError,
++                   "%s: ALLOCATE_CPU_PTR not handled but pointer exists!", __func__);
++
++        Result ret = allocate();
++        CheckError(ret != Result::OK, ret, "@%s allocate failed.", __func__);
++    }
++
++    *out = mMemoryDesc;
++    return Result::OK;
++}
++
++Result Buffer::validateBuffer(const MemoryDesc* memory) {
++    bool valid = true;
++    bool haveMemory = false;
++    const MemoryDesc* mem = (memory) ? memory : &mMemoryDesc;
++
++    CheckError(!mInitialized, Result::InternalError, "Buffer::validateBuffer mInitialized error");
++
++    haveMemory = mem->flags & MemoryFlag::Allocated || mem->flags & MemoryFlag::MemoryFromUser;
++
++    // cppcheck-suppress clarifyCondition
++    if ((!(mem->flags & MemoryFlag::CpuPtr)) ^ (mem->cpuPtr == nullptr)) {
++        valid &= false;
++    }
++
++    // cppcheck-suppress clarifyCondition
++    if ((!(mem->flags & MemoryFlag::MemoryHandle)) ^ (mem->handle == 0)) {
++        valid &= false;
++    }
++
++    if ((mem->flags & MemoryFlag::CpuOnly) && (mem->flags & MemoryFlag::HardwareOnly)) {
++        valid &= false;
++    }
++
++    if (!haveMemory &&
++        ((mem->flags & MemoryFlag::MemoryHandle) || (mem->flags & MemoryFlag::CpuPtr))) {
++        valid &= false;
++    }
++
++    if (haveMemory && (mem->flags & MemoryFlag::AllocateCpuPtr)) {
++        valid &= false;
++    }
++
++    if (haveMemory && (mem->flags & MemoryFlag::CopyFromUser)) {
++        valid &= false;
++    }
++
++    if (haveMemory &&
++        !((mem->flags & MemoryFlag::MemoryHandle) || (mem->flags & MemoryFlag::CpuPtr) ||
++          (mem->flags & MemoryFlag::HardwareOnly))) {
++        valid &= false;
++    }
++
++    return (valid) ? Result::OK : Result::GeneralError;
++}
++
++Result Buffer::allocate() {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++
++    Result ret = mContext ? mContext->allocate(&mMemoryDesc) : allocateCommon();
++    CheckError(ret != Result::OK, ret, "%s: allocation failed", __func__);
++
++    ret = validateBuffer(nullptr);
++    CheckError(ret != Result::OK, ret, "%s: bitfield validation after allocate failed", __func__);
++
++    return Result::OK;
++}
++
++Result Buffer::createWithUserMemory(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory) {
++    if (size < userMemory->size) {
++        icamera::LOG2(
++            "%s: requested bytes to allocate less than provided user memory in argument, "
++            "truncating",
++            __func__);
++    }
++
++    CheckError(userMemory->size < size, Result::InternalError,
++               "@%s: requested bytes to allocate more than provided user memory in argument",
++               __func__);
++
++    if (userMemory->flags & MemoryFlag::CpuPtr) {
++        if (createWithUserMemoryWithCpuPtr(flags, userMemory) != Result::OK) {
++            return Result::InternalError;
++        }
++    } else if (userMemory->flags & MemoryFlag::MemoryHandle) {
++        if (createWithUserMemoryCommon(flags, userMemory) != Result::OK) {
++            return Result::InternalError;
++        }
++    }
++
++    CheckError(userMemory->anchor, Result::InternalError,
++               "@%s: inheriting object from another not supported!", __func__);
++
++    CheckError(mMemoryDesc.cpuPtr == nullptr && mMemoryDesc.handle == 0, Result::InternalError,
++               "@%s: Invalid user memory given as argument!", __func__);
++
++    return Result::OK;
++}
++
++Result Buffer::createWithUserMemoryWithCpuPtr(MemoryFlag flags, const MemoryDesc* userMemory) {
++    CheckError(!userMemory->cpuPtr, Result::InternalError,
++               "@%s: user did not provide pointer with "
++               "IA_CIPR_MEMORY_CPU_PTR",
++               __func__);
++
++    CheckError(userMemory->flags & MemoryFlag::MemoryHandle, Result::InternalError,
++               "@%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
++               "IA_CIPR_MEMORY_HANDLE",
++               __func__);
++
++    CheckError(flags & MemoryFlag::AllocateCpuPtr && !(flags & MemoryFlag::CopyFromUser),
++               Result::InternalError,
++               "@%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
++               "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR",
++               __func__);
++
++    mMemoryDesc.cpuPtr = userMemory->cpuPtr;
++    mMemoryDesc.flags |= MemoryFlag::CpuPtr | MemoryFlag::MemoryFromUser;
++
++    return Result::OK;
++}
++
++Result Buffer::createWithUserMemoryCommon(MemoryFlag flags, const MemoryDesc* userMemory) {
++    CheckError(!userMemory->handle, Result::InternalError,
++               "@%s: user did not provide handle with "
++               "MemoryFlag::MemoryHandle",
++               __func__);
++
++    CheckError(userMemory->flags & MemoryFlag::CpuPtr, Result::InternalError,
++               "@%s: MemoryFlag::MemoryHandle conflict with "
++               "MemoryFlag::cpuPtr",
++               __func__);
++
++    CheckError(flags & MemoryFlag::CopyFromUser, Result::InternalError,
++               "@%s: MemoryFlag::CopyFromUser conflict! ", __func__);
++
++    CheckError(flags & MemoryFlag::AllocateCpuPtr && !(flags & MemoryFlag::MemoryHandle),
++               Result::InternalError,
++               "@%s: MemoryFlag::MemoryHandle conflict with "
++               "MemoryFlag::AllocateCpuPtr",
++               __func__);
++
++    mMemoryDesc.handle = userMemory->handle;
++    mMemoryDesc.flags |= MemoryFlag::MemoryHandle | MemoryFlag::MemoryFromUser;
++
++    return Result::OK;
++}
++
++Buffer::Buffer(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory) {
++    Result ret;
++    mInitialized = false;
++    mContext = nullptr;
++
++    if (size == 0) {
++        return;
++    }
++
++    memset(&mMemoryDesc, 0, sizeof(MemoryDesc));
++    mMemoryDesc.anchor = this;
++    mMemoryDesc.size = size;
++
++    if (userMemory) {
++        ret = createWithUserMemory(size, flags, userMemory);
++        CheckError(ret != Result::OK, VOID_VALUE, "@s: Buffer::Buffer Error", __func__);
++        mMemoryDesc.flags |= userMemory->flags;
++    }
++
++    mMemoryDesc.flags |= flags;
++
++    mInitialized = true;
++    ret = validateBuffer(nullptr);
++    if (ret != Result::OK) {
++        icamera::LOG2("Buffer::Buffer validateBuffer Error");
++        mInitialized = false;
++    }
++}
++
++Buffer::Buffer(Buffer* parent, uint32_t offset, uint32_t size) {
++    mInitialized = false;
++    mContext = nullptr;
++
++    if (!parent || size == 0) {
++        return;
++    }
++
++    CheckError(parent->mMemoryDesc.size < offset + size, VOID_VALUE,
++               "%s: parent buffer size %d not enough for region requested (offset %d, size %d)",
++               __func__, parent->mMemoryDesc.size, offset, size);
++
++    CheckError(parent->isRegion(), VOID_VALUE, "%s: Nested regions are illecal", __func__);
++
++    memset(&mMemoryDesc, 0, sizeof(MemoryDesc));
++    mMemoryDesc.size = size;
++    this->mOffset = offset;
++    mMemoryDesc.anchor = parent;
++    mMemoryDesc.flags = parent->mMemoryDesc.flags;
++
++    parent->mRegions.insert(this);
++
++    mInitialized = true;
++}
++
++Buffer::~Buffer() {
++    if (!mInitialized) {
++        return;
++    }
++
++    mInitialized = false;
++
++    if (isRegion()) {
++        if (!mMemoryDesc.anchor) {
++            icamera::LOG2("%s: parent already released", __func__);
++        } else {
++            mMemoryDesc.anchor->mRegions.erase(this);
++        }
++    }
++
++    if (!mRegions.empty()) {
++        icamera::LOG2("%s: parent buffer destroy leaves stale regions", __func__);
++
++        for (auto& x : mRegions) {
++            x->mMemoryDesc.anchor = nullptr;
++            delete x;
++        }
++    }
++
++    if (mContext) {
++        mContext->destroy(&mMemoryDesc);
++    }
++
++    destroy();
++}
++
++bool Buffer::isRegion() const {
++    return mMemoryDesc.anchor != this;
++}
++
++Result Buffer::getMemory(MemoryDesc* out) {
++    Buffer* region = nullptr;
++    Buffer* buffer = this;
++    Result ret;
++
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!out, Result::InvaildArg, "@%s, out is nullptr", __func__);
++
++    if (isRegion()) {
++        region = this;
++        buffer = mMemoryDesc.anchor;
++    }
++
++    if (buffer->mContext) {
++        ret = mContext->getMemory(&buffer->mMemoryDesc, out);
++    } else {
++        ret = buffer->getMemoryCommon(out);
++    }
++    CheckError(ret != Result::OK, ret, "@%s: getMemory() failed", __func__);
++
++    ret = buffer->validateBuffer(out);
++    CheckError(ret != Result::OK, ret, "@%s: bitfield validation failed", __func__);
++
++    if (region) {
++        CheckError(region->mOffset + region->mMemoryDesc.size > out->size, Result::InternalError,
++                   "@%s: memory region doesn't fit in parent store!", __func__);
++
++        if (out->cpuPtr) {
++            out->cpuPtr = reinterpret_cast<uint8_t*>(out->cpuPtr) + region->mOffset;
++        }
++
++        out->size = region->mMemoryDesc.size;
++        out->anchor = region;
++    }
++
++    return Result::OK;
++}
++
++Result Buffer::getMemoryCpuPtr(void** ptr) {
++    CIPR::MemoryDesc memory;
++
++    CheckError(!ptr, Result::InvaildArg, "@%s: ptr == null", __func__);
++
++    auto ret = getMemory(&memory);
++    CheckError(ret != Result::OK, ret, "@%s: getMemory failed.", __func__);
++
++    *ptr = memory.cpuPtr;
++
++    return Result::OK;
++}
++
++Result Buffer::getMemorySize(int* size) {
++    CheckError(!size, Result::InvaildArg, "@%s: size == 0", __func__);
++    *size = mMemoryDesc.size;
++
++    return Result::OK;
++}
++
++Buffer* Buffer::getParent() {
++    if (!isRegion()) {
++        icamera::LOGE("%s: not a child object", __func__);
++        return nullptr;
++    }
++
++    if (!mMemoryDesc.anchor) {
++        return nullptr;
++    }
++    return mMemoryDesc.anchor;
++}
++
++Result Buffer::attatchDevice(Context* ctx) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
++    CheckError(mMemoryDesc.anchor != this, Result::InvaildArg,
++               "%s: buffer regions cannot be independently migrated", __func__);
++
++    mContext = ctx;
++    return mContext->migrate(&mMemoryDesc);
++}
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
+new file mode 100644
+index 000000000000..e71a19ae1889
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
+@@ -0,0 +1,203 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CIPR_COMMAND"
++
++#include "modules/ia_cipr/include/Command.h"
++
++#include <algorithm>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++using icamera::CAMERA_DEBUG_LOG_DBG;
++using icamera::CAMERA_DEBUG_LOG_ERR;
++using icamera::CAMERA_DEBUG_LOG_VERBOSE;
++using icamera::CAMERA_DEBUG_LOG_WARNING;
++
++namespace icamera {
++namespace CIPR {
++Command::Command(const PSysCommandConfig& cfg) {
++    mInitialized = false;
++
++    mCmd = new PSysCommand;
++
++    if (cfg.buffers.size() > 0) {
++        mCmd->iocCmd.bufcount = cfg.buffers.size();
++        mCmd->iocCmd.buffers = static_cast<struct ipu_psys_buffer*>(
++            CIPR::callocMemory(cfg.buffers.size(), sizeof(struct ipu_psys_buffer)));
++
++        if (!mCmd->iocCmd.buffers) {
++            icamera::LOG2("Could not allocate DMA-BUF handle array");
++            delete mCmd;
++            return;
++        }
++
++        mCmd->userBuffers.resize(cfg.buffers.size());
++        std::fill(mCmd->userBuffers.begin(), mCmd->userBuffers.end(), nullptr);
++    }
++    mInitialized = true;
++}
++
++Command::~Command() {
++    if (!mInitialized) return;
++
++    mInitialized = false;
++    if (!mCmd) return;
++
++    CIPR::freeMemory(mCmd->iocCmd.buffers);
++    delete mCmd;
++}
++
++Result Command::getConfig(PSysCommandConfig* cfg) {
++    CheckError(!mInitialized, Result::InternalError, "@%s mInitialized false", __func__);
++    CheckError(!cfg, Result::InvaildArg, "@%s, cfg is nullptr", __func__);
++
++    cfg->token = mCmd->iocCmd.user_token;
++    cfg->issueID = mCmd->iocCmd.issue_id;
++    cfg->priority = mCmd->iocCmd.priority;
++    cfg->psysFrequency = mCmd->iocCmd.min_psys_freq;
++    cfg->pg = mCmd->pg;
++    cfg->extBuf = mCmd->extBuf;
++    cfg->pgManifestBuf = mCmd->pgManifestBuf;
++    cfg->id = 0;
++
++    cfg->buffers = mCmd->userBuffers;
++
++    return Result::OK;
++}
++
++Result Command::updateKernel(const PSysCommandConfig& cfg, const MemoryDesc& memory) {
++    ProcessGroupCommand* ppg_command_ext = reinterpret_cast<ProcessGroupCommand*>(memory.cpuPtr);
++
++    CheckError(ppg_command_ext->header.size != memory.size ||
++                   ppg_command_ext->header.offset != sizeof(PSysCmdExtHeader) ||
++                   (ppg_command_ext->header.version != psys_command_ext_ppg_0 &&
++                    ppg_command_ext->header.version != psys_command_ext_ppg_1),
++               Result::InvaildArg, "Invalid command extension buffer received! (%p)", cfg.extBuf);
++
++    if (ppg_command_ext->header.version == psys_command_ext_ppg_1) {
++        CIPR::memoryCopy(
++            &(mCmd->iocCmd.kernel_enable_bitmap), sizeof(mCmd->iocCmd.kernel_enable_bitmap),
++            ppg_command_ext->dynamicKernelBitmap, sizeof(ppg_command_ext->dynamicKernelBitmap));
++    }
++
++    mCmd->iocCmd.frame_counter = static_cast<uint32_t>(ppg_command_ext->frameCounter);
++
++    return Result::OK;
++}
++
++Result Command::getLegacyPGMem(const PSysCommandConfig& cfg, MemoryDesc* memory) {
++    auto ret = cfg.extBuf->getMemory(memory);
++    if (ret != Result::OK && cfg.pgParamsBuf != nullptr) {
++        icamera::LOG2("pg_params_buf-field of CIPR command deprecated!");
++        ret = cfg.pgParamsBuf->getMemory(memory);
++        if (ret != Result::OK) {
++            return ret;
++        }
++    }
++
++    return Result::OK;
++}
++
++Result Command::updatePG(const PSysCommandConfig& cfg) {
++    MemoryDesc memory = {};
++
++    Result ret = cfg.pgManifestBuf->getMemory(&memory);
++    if (ret != Result::OK) return ret;
++
++    mCmd->iocCmd.pg_manifest = memory.cpuPtr;
++    mCmd->iocCmd.pg_manifest_size = memory.size;
++    mCmd->pgManifestBuf = cfg.pgManifestBuf;
++
++    ret = getLegacyPGMem(cfg, &memory);
++    CheckError(ret != Result::OK, ret, "@%s: getLegacyPGMem error", __func__);
++
++    if (memory.flags & MemoryFlag::PSysAPI) {
++        updateKernel(cfg, memory);
++    } else {
++        mCmd->pgParams = memory.cpuPtr;
++        mCmd->pgParamsSize = memory.size;
++    }
++
++    return Result::OK;
++}
++
++Result Command::setConfig(const PSysCommandConfig& cfg) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized == false", __func__);
++    CheckError(mCmd->userBuffers.size() < cfg.buffers.size(), Result::InvaildArg,
++               "Config bufcount cannot be higher than in the command!");
++    CheckError(cfg.buffers.empty() && mCmd->iocCmd.buffers, Result::InvaildArg,
++               "To nullify buffers, create command with bufcount 0");
++
++    Result ret = updatePG(cfg);
++    if (ret != Result::OK) return ret;
++
++    mCmd->extBuf = cfg.extBuf;
++    if (cfg.id != 0) {
++        icamera::LOG2("ID-field of CIPR command deprecated!");
++    }
++
++    mCmd->iocCmd.user_token = cfg.token;
++    mCmd->iocCmd.issue_id = cfg.issueID;
++    mCmd->iocCmd.priority = cfg.priority;
++    mCmd->iocCmd.min_psys_freq = cfg.psysFrequency;
++    mCmd->iocCmd.bufcount = cfg.buffers.size();
++    mCmd->pg = cfg.pg;
++    if (cfg.pg && cfg.pg->mMemoryDesc.sysBuff) {
++        CheckError(!((cfg.pg->mMemoryDesc.sysBuff)->flags & IPU_BUFFER_FLAG_DMA_HANDLE),
++                   Result::GeneralError, "Wrong flag!", __func__);
++
++        mCmd->iocCmd.pg = cfg.pg->mMemoryDesc.sysBuff->base.fd;
++    }
++
++    if (!mCmd->iocCmd.buffers) return Result::OK;
++
++    return grokBuffers(cfg);
++}
++
++Result Command::grokBuffers(const PSysCommandConfig& cfg) {
++    for (size_t i = 0; i < cfg.buffers.size(); ++i) {
++        auto current = cfg.buffers[i];
++        if (!current) {
++            memset(&mCmd->iocCmd.buffers[i], 0, sizeof(mCmd->iocCmd.buffers[i]));
++            continue;
++        } else if (!current->mMemoryDesc.sysBuff && current->isRegion()) {
++            current = current->getParent();
++            CheckError(!current, Result::InvaildArg, "Cannot find the parent of buffer:%p",
++                       cfg.buffers[i]);
++        }
++
++        CheckError(
++            !current->mMemoryDesc.sysBuff || !(current->mMemoryDesc.flags & MemoryFlag::Migrated),
++            Result::InvaildArg, "%s, Cannot queue singular buffer object %p", __func__, current);
++
++        mCmd->iocCmd.buffers[i] = *current->mMemoryDesc.sysBuff;
++        mCmd->iocCmd.buffers[i].data_offset = current->mOffset;
++        mCmd->iocCmd.buffers[i].bytes_used = current->mMemoryDesc.size;
++    }
++
++    return Result::OK;
++}
++
++Result Command::enqueue(Context* ctx) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
++
++    return ctx->doIoctl(static_cast<int>(IPU_IOC_QCMD), mCmd);
++}
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
+new file mode 100644
+index 000000000000..0f391cab95c7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
+@@ -0,0 +1,313 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CIPR_CONTEXT"
++
++#include <errno.h>
++#include <fcntl.h>
++#include <poll.h>
++#include <stdio.h>
++#include <string.h>
++#include <sys/ioctl.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <unistd.h>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++using icamera::CAMERA_DEBUG_LOG_DBG;
++using icamera::CAMERA_DEBUG_LOG_ERR;
++using icamera::CAMERA_DEBUG_LOG_VERBOSE;
++using icamera::CAMERA_DEBUG_LOG_WARNING;
++
++#include "modules/ia_cipr/include/Context.h"
++#include "modules/ia_cipr/include/ipu-psys.h"
++
++const char* DRIVER_NAME = "/dev/ipu-psys0";
++
++namespace icamera {
++namespace CIPR {
++Result Context::allocate(MemoryDesc* mem) {
++    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
++    CheckError(mem->cpuPtr, Result::InvaildArg, "%s: already has an address!", __func__);
++
++    mem->cpuPtr = CIPR::mallocAlignedMemory(mem->size, CIPR::getPageSize());
++    CheckError(!mem->cpuPtr, Result::NoMemory, "@%s, mem is out", __func__);
++
++    if (!(mem->flags & MemoryFlag::Uninitialized)) {
++        memset(mem->cpuPtr, 0, mem->size);
++    }
++
++    mem->flags &= ~MemoryFlag::AllocateCpuPtr;
++    mem->flags |= MemoryFlag::CpuPtr | MemoryFlag::Allocated;
++
++    return Result::OK;
++}
++
++Result Context::migrate(MemoryDesc* mem) {
++    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
++
++    if (mem->flags & MemoryFlag::AllocateCpuPtr) {
++        Result ret = allocate(mem);
++        CheckError(ret != Result::OK, ret, "@%s: allocate failed.", __func__);
++    }
++
++    if (mem->flags & MemoryFlag::PSysAPI) {
++        return Result::OK;
++    }
++
++    return registerBuffer(mem);
++}
++
++Result Context::getMemory(MemoryDesc* mem, MemoryDesc* out) {
++    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
++    CheckError(!out, Result::InvaildArg, "@%s, out is nullptr", __func__);
++
++    if (!(mInitFlag == Context::Flags::DEBUG) && (mem->flags & MemoryFlag::HardwareOnly)) {
++        icamera::LOG2("%s: host cannot access HW only memory!", __func__);
++        return Result::GeneralError;
++    }
++
++    if ((mem->flags & MemoryFlag::MemoryHandle) && !(mem->flags & MemoryFlag::CpuPtr)) {
++        icamera::LOG2("%s: fallback host address mapping not implemented!", __func__);
++        return Result::GeneralError;
++    }
++
++    *out = *mem;
++    return Result::OK;
++}
++
++Result Context::destroy(MemoryDesc* mem) {
++    return unregisterBuffer(mem);
++}
++
++Context::Context() {
++    mInitialized = false;
++    mFd = open(DRIVER_NAME, 0, O_RDWR | O_NONBLOCK);
++    int errnoCopy = errno;
++
++    CheckError(mFd < 0, VOID_VALUE, "%s: Failed to open PSYS device! open returned error: %s",
++               __func__, strerror(errnoCopy));
++
++    mInitFlag = Context::Flags::NONE;
++    mInitialized = true;
++}
++
++Context::~Context() {
++    if (!mInitialized) {
++        return;
++    }
++
++    mInitialized = false;
++
++    int rv = ::close(mFd);
++    int errnoCopy = errno;
++
++    CheckError(rv < 0, VOID_VALUE, "Close returned error: %s", strerror(errnoCopy));
++}
++
++Result Context::getCapabilities(PSYSCapability* cap) {
++    struct ipu_psys_capability psys_capability = {};
++
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!cap, Result::InvaildArg, "@%s, cap is nullptr", __func__);
++
++    Result ret = doIoctl(static_cast<int>(IPU_IOC_QUERYCAP), &psys_capability);
++    CheckError(ret != Result::OK, ret, "%s: failed to retrieve capabilities", __func__);
++
++    cap->version = psys_capability.version;
++    CIPR::memoryCopy(cap->driver, sizeof(cap->driver), psys_capability.driver,
++                     sizeof(psys_capability.driver));
++
++    CIPR::memoryCopy(cap->devModel, sizeof(cap->devModel), psys_capability.dev_model,
++                     sizeof(psys_capability.dev_model));
++
++    cap->programGroupCount = psys_capability.pg_count;
++
++    return Result::OK;
++}
++
++Result Context::getManifest(uint32_t index, uint32_t* mainfestSize, void* manifest) {
++    struct ipu_psys_manifest pg_manifest = {};
++
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!mainfestSize, Result::InvaildArg, "@%s, mainfestSize is nullptr", __func__);
++
++    pg_manifest.index = index;
++    pg_manifest.size = 0;
++    pg_manifest.manifest = manifest;
++
++    Result ret = doIoctl(static_cast<int>(IPU_IOC_GET_MANIFEST), &pg_manifest);
++    CheckError(ret != Result::OK, ret, "%s: Failed to retrieve manifest with index %d", __func__,
++               index);
++
++    *mainfestSize = pg_manifest.size;
++    return Result::OK;
++}
++
++Result Context::doIoctl(int request, void* ptr) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++
++#ifdef ANDROID
++    int res = ::ioctl(mFd, request, ptr);
++#else
++    int res = ::ioctl(mFd, (unsigned int)request, ptr);
++#endif
++    int errnoCopy = errno;
++
++    if (res < 0) {
++        icamera::LOG2("Ioctl returned error: %s", strerror(errnoCopy));
++        switch (errnoCopy) {
++            case ENOMEM:
++                return Result::NoMemory;
++            case EINVAL:
++                return Result::InvaildArg;
++            case EFAULT:
++                return Result::InvaildArg;
++            case ENOENT:
++                return Result::NoEntry;
++            default:
++                return Result::GeneralError;
++        }
++    }
++    return Result::OK;
++}
++
++Result Context::registerBuffer(MemoryDesc* mem) {
++    Result res;
++
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
++    CheckError(mem->flags & MemoryFlag::Migrated, Result::InvaildArg,
++               "Buffer already migrated with device.");
++
++    struct ipu_psys_buffer* ioc_buffer =
++        reinterpret_cast<ipu_psys_buffer*>(callocMemory(1, sizeof(*ioc_buffer)));
++    CheckError(!ioc_buffer, Result::NoMemory, "Could not create psys buffer");
++
++    ioc_buffer->len = mem->size;
++    if (mem->flags & MemoryFlag::CpuPtr) {
++        ioc_buffer->base.userptr = mem->cpuPtr;
++        ioc_buffer->flags |= IPU_BUFFER_FLAG_USERPTR;
++        res = doIoctl(static_cast<int>(IPU_IOC_GETBUF), ioc_buffer);
++
++        if (res != Result::OK) {
++            CIPR::freeMemory(ioc_buffer);
++            return res;
++        }
++
++        if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
++            icamera::LOG2("CIPR: IOC_GETBUF succeed but did not return dma handle");
++            CIPR::freeMemory(ioc_buffer);
++            return Result::InternalError;
++        } else if (ioc_buffer->flags & IPU_BUFFER_FLAG_USERPTR) {
++            icamera::LOG2("CIPR: IOC_GETBUF succeed but did not consume the userptr flag");
++            CIPR::freeMemory(ioc_buffer);
++            return Result::InternalError;
++        }
++        ioc_buffer->flags |= IPU_BUFFER_FLAG_NO_FLUSH;
++    } else if (mem->flags & MemoryFlag::MemoryHandle) {
++        ioc_buffer->base.fd = static_cast<int>(mem->handle);
++        ioc_buffer->flags |= IPU_BUFFER_FLAG_DMA_HANDLE;
++    }
++
++    res = doIoctl(static_cast<int>(IPU_IOC_MAPBUF),
++                  reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
++
++    if (res != Result::OK) {
++        CIPR::freeMemory(ioc_buffer);
++        return res;
++    }
++
++    mem->sysBuff = ioc_buffer;
++    mem->flags |= MemoryFlag::Migrated;
++
++    icamera::LOG2("%s: registered %p -> fd %d size:%u offset:%u bytes_used:%u", __func__,
++                  mem->cpuPtr, ioc_buffer->base.fd, ioc_buffer->len, ioc_buffer->data_offset,
++                  ioc_buffer->bytes_used);
++
++    return res;
++}
++
++Result Context::unregisterBuffer(MemoryDesc* mem) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized == false", __func__);
++    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
++
++    if (mem->sysBuff == nullptr) {
++        return Result::OK;
++    }
++
++    struct ipu_psys_buffer* ioc_buffer = mem->sysBuff;
++    CheckError(!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE), Result::GeneralError,
++               "Wrong flag!", __func__);
++
++    Result res = doIoctl(static_cast<int>(IPU_IOC_UNMAPBUF),
++                         reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
++    if (res != Result::OK) {
++        icamera::LOG2("%s: cannot unmap buffer fd %d, possibly already unmapped", __func__,
++                      ioc_buffer->base.fd);
++    }
++
++    if (mem->flags & MemoryFlag::CpuPtr) {
++        res = psysClose(ioc_buffer->base.fd);
++        CheckError(res != Result::OK, res, "@%s: pSysClose failed", __func__);
++    }
++
++    CIPR::freeMemory(ioc_buffer);
++    mem->sysBuff = nullptr;
++
++    return res;
++}
++
++Result Context::psysClose(int fd) {
++    int res = close(fd);
++    int error = errno;
++
++    if (res < 0) {
++        icamera::LOG2("Close returned error: %s", strerror(error));
++        switch (error) {
++            case EBADF:
++                return Result::InvaildArg;
++            case EIO:
++            case EINTR:
++            default:
++                return Result::GeneralError;
++        }
++    }
++
++    return Result::OK;
++}
++
++ContextPoller Context::getPoller(int events, int timeout) {
++    ContextPoller poller;
++    poller.mFd = mFd;
++    poller.mEvents = events;
++    poller.mTimeout = timeout;
++
++    return poller;
++}
++
++int ContextPoller::poll() {
++    struct pollfd fds;
++
++    fds.fd = mFd;
++    fds.events = mEvents;
++
++    return ::poll(&fds, 1, mTimeout);
++}
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
+new file mode 100644
+index 000000000000..781fa03cfa0d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
+@@ -0,0 +1,118 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#define LOG_TAG "CIPR_EVENT"
++
++#include <errno.h>
++#include <fcntl.h>
++#include <poll.h>
++#include <stdio.h>
++#include <string.h>
++#include <sys/ioctl.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <unistd.h>
++
++#include <cstring>
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++using icamera::CAMERA_DEBUG_LOG_DBG;
++using icamera::CAMERA_DEBUG_LOG_ERR;
++using icamera::CAMERA_DEBUG_LOG_VERBOSE;
++using icamera::CAMERA_DEBUG_LOG_WARNING;
++
++#include "modules/ia_cipr/include/Context.h"
++#include "modules/ia_cipr/include/Event.h"
++#include "modules/ia_cipr/include/Utils.h"
++
++namespace icamera {
++namespace CIPR {
++Event::Event(const PSysEventConfig& eventConfig) {
++    mInitialized = false;
++    mEvent = reinterpret_cast<PSysEvent*>(CIPR::callocMemory(1, sizeof(*mEvent)));
++
++    CheckError(!mEvent, VOID_VALUE, "%s: could not allocate mEvent", __func__);
++
++    if (eventConfig.id != 0) {
++        icamera::LOG2("ID-field of CIPR mEvent deprecated!");
++    }
++
++    mEvent->event.type = eventConfig.type;
++    mEvent->event.user_token = eventConfig.commandToken;
++    mEvent->event.issue_id = eventConfig.commandIssueID;
++    mEvent->event.buffer_idx = 0;
++    mEvent->event.error = eventConfig.error;
++    mEvent->timeout = eventConfig.timeout;
++
++    mInitialized = true;
++}
++
++Event::~Event() {
++    if (!mInitialized) {
++        return;
++    }
++
++    mInitialized = false;
++    CIPR::freeMemory(mEvent);
++}
++
++Result Event::getConfig(PSysEventConfig* eventConfig) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!eventConfig, Result::InvaildArg, "@%s, eventConfig is nullptr", __func__);
++
++    eventConfig->type = mEvent->event.type;
++    eventConfig->commandToken = mEvent->event.user_token;
++    eventConfig->commandIssueID = mEvent->event.issue_id;
++    eventConfig->bufferHandoverBitmap = UINT64_MAX; /* Not used */
++    eventConfig->error = mEvent->event.error;
++    eventConfig->timeout = mEvent->timeout;
++    eventConfig->id = 0;
++
++    return Result::OK;
++}
++
++Result Event::setConfig(const PSysEventConfig& eventConfig) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++
++    mEvent->event.type = eventConfig.type;
++    mEvent->event.user_token = eventConfig.commandToken;
++    mEvent->event.issue_id = eventConfig.commandIssueID;
++    mEvent->event.buffer_idx = 0;
++    mEvent->event.error = eventConfig.error;
++    mEvent->timeout = eventConfig.timeout;
++
++    return Result::OK;
++}
++
++Result Event::wait(Context* ctx) {
++    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
++    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
++
++    auto poller = ctx->getPoller(POLLIN | POLLHUP | POLLERR, mEvent->timeout);
++    int res = poller.poll();
++    if (res == 1) {
++        return ctx->doIoctl(static_cast<int>(IPU_IOC_DQEVENT), mEvent);
++    } else if (res == 0) {
++        return Result::TimeOut;
++    }
++
++    icamera::LOG2("%s: poll returned error: %s", __func__, strerror(res));
++    return Result::GeneralError;
++}
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
+new file mode 100755
+index 000000000000..89ff3abd98fc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
+@@ -0,0 +1,64 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "modules/ia_cipr/include/Utils.h"
++
++#include <unistd.h>
++
++#define LOG_TAG "IA_CIPR_UTILS"
++
++#include "iutils/CameraLog.h"
++#include "iutils/Utils.h"
++
++using icamera::CAMERA_DEBUG_LOG_DBG;
++using icamera::CAMERA_DEBUG_LOG_ERR;
++using icamera::CAMERA_DEBUG_LOG_VERBOSE;
++using icamera::CAMERA_DEBUG_LOG_WARNING;
++
++namespace icamera {
++namespace CIPR {
++void* mallocMemory(size_t sz) {
++    return ::malloc(sz);
++}
++
++void* callocMemory(size_t cnt, size_t sz) {
++    return ::calloc(cnt, sz);
++}
++
++void* mallocAlignedMemory(size_t sz, size_t alignment) {
++    void* p = nullptr;
++    int ret = ::posix_memalign(&p, alignment, sz);
++
++    return ret ? nullptr : p;
++}
++
++void freeMemory(void* p) {
++    ::free(p);
++}
++
++void memoryCopy(void* dst, size_t dsz, const void* src, size_t sz) {
++    if (dsz < sz) {
++        icamera::LOG2("%s: destination size < source size, potential coding error", __func__);
++    }
++
++    MEMCPY_S(dst, dsz, src, sz);
++}
++
++size_t getPageSize() {
++    return static_cast<size_t>(sysconf(_SC_PAGESIZE));
++}
++}  // namespace CIPR
++}  // namespace icamera
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
+new file mode 100644
+index 000000000000..aa1724c75c1e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/assert_support.h
+@@ -0,0 +1,210 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __ASSERT_SUPPORT_H
++#define __ASSERT_SUPPORT_H
++
++/* This file provides support for run-time assertions
++ * and compile-time assertions.
++ *
++ * Run-time asstions are provided via the following syntax:
++ *     assert(condition)
++ * Run-time assertions are disabled using the NDEBUG flag.
++ *
++ * Compile time assertions are provided via the following syntax:
++ *     COMPILATION_ERROR_IF(condition);
++ * A compile-time assertion will fail to compile if the condition is false.
++ * The condition must be constant, such that it can be evaluated
++ * at compile time.
++ *
++ * OP___assert is deprecated.
++ */
++
++#define IA_CSS_ASSERT(expr) assert(expr)
++
++#ifdef __KLOCWORK__
++/* Klocwork does not see that assert will lead to abortion
++ * as there is no good way to tell this to KW and the code
++ * should not depend on assert to function (actually the assert
++ * could be disabled in a release build) it was decided to
++ * disable the assert for KW scans (by defining NDEBUG)
++ * see also:
++ * http://www.klocwork.com/products/documentation/current/
++ * Tuning_C/C%2B%2B_analysis#Assertions
++ */
++#define NDEBUG
++#endif /* __KLOCWORK__ */
++
++/**
++ * The following macro can help to test the size of a struct at compile
++ * time rather than at run-time. It does not work for all compilers; see
++ * below.
++ *
++ * Depending on the value of 'condition', the following macro is expanded to:
++ * - condition==true:
++ *     an expression containing an array declaration with negative size,
++ *     usually resulting in a compilation error
++ * - condition==false:
++ *     (void) 1; // C statement with no effect
++ *
++ * example:
++ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
++ *            SIZE_OF_HOST_SP_QUEUES_STRUCT);
++ *
++ * verify that the macro indeed triggers a compilation error with your compiler:
++ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
++ *            (sizeof(struct host_sp_queues)+1) );
++ *
++ * Not all compilers will trigger an error with this macro;
++ * use a search engine to search for BUILD_BUG_ON to find other methods.
++ */
++#ifdef __XTENSA_FW__
++
++#include "assert_support_xtensa.h"
++
++#else
++
++#define COMPILATION_ERROR_IF(condition) \
++((void)sizeof(char[1 - 2*!!(condition)]))
++
++#endif
++/* Compile time assertion */
++#ifndef CT_ASSERT
++#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
++#endif /* CT_ASSERT */
++
++#ifdef NDEBUG
++
++#define assert(cnd) ((void)0)
++
++#else
++
++#include "storage_class.h"
++
++#if defined(_MSC_VER)
++#ifdef _KERNEL_MODE
++/* Windows kernel mode compilation */
++#include <ntddk.h>
++#define assert(cnd) ASSERT(cnd)
++#else
++/* Windows usermode compilation */
++#include <assert.h>
++#endif
++
++#elif defined(__XTENSA_FW__)
++/* assert added in assert_support_xtensa*/
++#elif defined(__HIVECC)
++
++/*
++ * target: assert disabled
++ * sched: assert enabled only when SCHED_DEBUG is defined
++ * unsched: assert enabled
++ */
++#if defined(HRT_HW)
++#define assert(cnd) ((void)0)
++#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
++#define assert(cnd) ((void)0)
++#elif defined(PIPE_GENERATION)
++#define assert(cnd) ((void)0)
++#else
++#include <hive/support.h>
++#define assert(cnd) OP___csim_assert(cnd)
++#endif
++
++#elif defined(__KERNEL__)
++#include <linux/bug.h>
++
++#ifndef KERNEL_ASSERT_TO_BUG
++#ifndef KERNEL_ASSERT_TO_BUG_ON
++#ifndef KERNEL_ASSERT_TO_WARN_ON
++#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
++#ifndef KERNEL_ASSERT_UNDEFINED
++/* Default */
++#define KERNEL_ASSERT_TO_BUG
++#endif /*KERNEL_ASSERT_UNDEFINED*/
++#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
++#endif /*KERNEL_ASSERT_TO_WARN_ON*/
++#endif /*KERNEL_ASSERT_TO_BUG_ON*/
++#endif /*KERNEL_ASSERT_TO_BUG*/
++
++#ifdef KERNEL_ASSERT_TO_BUG
++/* TODO: it would be cleaner to use this:
++ * #define assert(cnd) BUG_ON(cnd)
++ * but that causes many compiler warnings (==errors) under Android
++ * because it seems that the BUG_ON() macro is not seen as a check by
++ * gcc like the BUG() macro is. */
++#define assert(cnd)                            \
++    do {                                \
++        if (!(cnd)) {                        \
++            BUG();                        \
++        }                            \
++    } while (0)
++#endif /*KERNEL_ASSERT_TO_BUG*/
++
++#ifdef KERNEL_ASSERT_TO_BUG_ON
++#define assert(cnd) BUG_ON(!(cnd))
++#endif /*KERNEL_ASSERT_TO_BUG_ON*/
++
++#ifdef KERNEL_ASSERT_TO_WARN_ON
++#define assert(cnd) WARN_ON(!(cnd))
++#endif /*KERNEL_ASSERT_TO_WARN_ON*/
++
++#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
++#define assert(cnd)                            \
++    do {                                \
++        int not_cnd = !(cnd);                    \
++        WARN_ON(not_cnd);                    \
++        if (not_cnd) {                        \
++            for (;;) {                    \
++            }                        \
++        }                            \
++    } while (0)
++#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
++
++#ifdef KERNEL_ASSERT_UNDEFINED
++#include KERNEL_ASSERT_DEFINITION_FILESTRING
++#endif /*KERNEL_ASSERT_UNDEFINED*/
++
++#elif defined(__FIST__) || defined(__GNUC__)
++
++#include "assert.h"
++
++#else /* default is for unknown environments */
++#define assert(cnd) ((void)0)
++#endif
++
++#endif /* NDEBUG */
++#ifndef PIPE_GENERATION
++/* Deprecated OP___assert, this is still used in ~1000 places
++ * in the code. This will be removed over time.
++ * The implementation for the pipe generation tool is in see support.isp.h */
++#define OP___assert(cnd) assert(cnd)
++
++#ifdef C_RUN
++#define compile_time_assert(cond) OP___assert(cond)
++#else
++#include "storage_class.h"
++extern void _compile_time_assert(void);
++STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
++{
++    /* Call undefined function if cond is false */
++    if (!cond)
++        _compile_time_assert();
++}
++#endif
++#endif /* PIPE_GENERATION */
++
++#endif /* __ASSERT_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
+new file mode 100644
+index 000000000000..98fd104f05a8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/cpu_mem_support.h
+@@ -0,0 +1,239 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __CPU_MEM_SUPPORT_H
++#define __CPU_MEM_SUPPORT_H
++
++#include "storage_class.h"
++#include "assert_support.h"
++#include "type_support.h"
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
++{
++    /* memcpy cannot be used in in Windows (function is not allowed),
++     * and the safer function memcpy_s is not available on other platforms.
++     * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
++     * but sub-optimal way.
++     */
++    unsigned int i;
++
++    assert(dst != NULL && src != NULL);
++
++    if (!(dst != NULL && src != NULL)) {
++        return NULL;
++    }
++    for (i = 0; i < size; i++) {
++        ((char *)dst)[i] = ((char *)src)[i];
++    }
++    return dst;
++}
++
++#if defined(__KERNEL__)
++
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/types.h>
++#include <asm/cacheflush.h>
++
++/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
++ * error checking code added to SDK that uses calls to exit function
++ */
++#define exit(a) return
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++    return kmalloc(size, GFP_KERNEL);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++    return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
++{
++    /* nothing here yet */
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++    return memset(dst, 0, size); /* available in kernel in linux/string.h */
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++    kfree(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++    /* parameter check here */
++    if (ptr == NULL)
++        return;
++
++    clflush_cache_range(ptr, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++    /* for now same as flush */
++    ia_css_cpu_mem_cache_flush(ptr, size);
++}
++
++#elif defined(_MSC_VER)
++
++#include <stdlib.h>
++#include <string.h>
++#include <stddef.h>
++
++extern void *hrt_malloc(size_t bytes, int zero_mem);
++extern void *hrt_free(void *ptr);
++extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
++extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
++
++#define malloc(a)    hrt_malloc(a, 1)
++#define free(a)        hrt_free(a)
++
++#define CSS_PAGE_SIZE    (1<<12)
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++    return malloc(size);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++    unsigned int buffer_size = size;
++
++    /* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
++     * to request system memory. If the number of bytes is equal or bigger
++     * than the page size, then the returned address is page aligned,
++     * but if it's smaller it's not necessarily page-aligned We agreed
++     * with Windows team that we allocate a full page
++     * if it's less than page size
++    */
++    if (buffer_size < CSS_PAGE_SIZE)
++        buffer_size = CSS_PAGE_SIZE;
++
++    return ia_css_cpu_mem_alloc(buffer_size);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++    return memset(dst, 0, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++    free(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++#ifdef _KERNEL_MODE
++    hrt_mem_cache_flush(ptr, size);
++#else
++    (void)ptr;
++    (void)size;
++#endif
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++#ifdef _KERNEL_MODE
++    hrt_mem_cache_invalidate(ptr, size);
++#else
++    (void)ptr;
++    (void)size;
++#endif
++}
++
++#else
++
++#include <stdlib.h>
++#include <string.h>
++#include <stddef.h>
++/* Needed for the MPROTECT */
++#include <unistd.h>
++#include <sys/types.h>
++
++/* For host only, not fw */
++#ifndef __XTENSA_FW__
++#include <sys/mman.h>
++#include <malloc.h>
++#endif
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++    return malloc(size);
++}
++
++#ifdef _SC_PAGE_SIZE
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++    int pagesize;
++
++    pagesize = sysconf(_SC_PAGE_SIZE);
++    return memalign(pagesize, size);
++}
++#endif /*_SC_PAGE_SIZE*/
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++    return memset(dst, 0, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++    free(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++    /* not needed in simulation */
++    (void)ptr;
++    (void)size;
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++    /* not needed in simulation */
++    (void)ptr;
++    (void)size;
++}
++
++#endif
++#endif /* __CPU_MEM_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
+new file mode 100644
+index 000000000000..54d3496d6635
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/error_support.h
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __ERROR_SUPPORT_H
++#define __ERROR_SUPPORT_H
++
++#if defined(__KERNEL__)
++#include <linux/errno.h>
++#else
++#include <errno.h>
++#endif
++#include <assert_support.h>
++
++/* OS-independent definition of IA_CSS errno values */
++/* #define IA_CSS_EINVAL 1 */
++/* #define IA_CSS_EFAULT 2 */
++
++#ifdef __HIVECC
++#define ERR_EMBEDDED 1
++#else
++#define ERR_EMBEDDED 0
++#endif
++
++#if ERR_EMBEDDED
++#define DECLARE_ERRVAL
++#else
++#define DECLARE_ERRVAL \
++    int _errval = 0;
++#endif
++
++/* Use "owl" in while to prevent compiler warnings in Windows */
++#define ALWAYS_FALSE ((void)0, 0)
++
++#define verifret(cond, error_type) \
++do {                               \
++    if (!(cond)) {             \
++        return error_type; \
++    }                          \
++} while (ALWAYS_FALSE)
++
++#define verifjmp(cond, error_tag)    \
++do {                                \
++    if (!(cond)) {                   \
++        goto error_tag;             \
++    }                               \
++} while (ALWAYS_FALSE)
++
++#define verifexit(cond)  \
++do {                               \
++    if (!(cond)) {              \
++        goto EXIT;         \
++    }                          \
++} while (ALWAYS_FALSE)
++
++#if ERR_EMBEDDED
++#define verifexitval(cond, error_tag) \
++do {                               \
++    assert(cond);           \
++} while (ALWAYS_FALSE)
++#else
++#define verifexitval(cond, error_tag) \
++do {                               \
++    if (!(cond)) {              \
++        _errval = (error_tag); \
++        goto EXIT;         \
++    }                          \
++} while (ALWAYS_FALSE)
++#endif
++
++#if ERR_EMBEDDED
++#define haserror(error_tag) (0)
++#else
++#define haserror(error_tag) \
++    (_errval == (error_tag))
++#endif
++
++#if ERR_EMBEDDED
++#define noerror() (1)
++#else
++#define noerror() \
++    (_errval == 0)
++#endif
++
++#define verifjmpexit(cond)         \
++do {                               \
++    if (!(cond)) {             \
++        goto EXIT;         \
++    }                          \
++} while (ALWAYS_FALSE)
++
++#define verifjmpexitsetretval(cond, retval)         \
++do {                               \
++    if (!(cond)) {              \
++        retval = -1;       \
++        goto EXIT;         \
++    }                          \
++} while (ALWAYS_FALSE)
++
++#endif /* __ERROR_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
+new file mode 100644
+index 000000000000..b5120abe45fb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/frame_support.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __FRAME_SUPPORT_H
++#define __FRAME_SUPPORT_H
++
++#define INTERLEAVED_FRAME_TYPE_NUM_PLANES    1
++#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES    2
++#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES    3
++#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES    4
++
++/* genpipe doesn't support B = A in enum definition */
++#ifndef PIPE_GENERATION
++
++enum image_iterator_planes {
++    IMG_ITER_PLANE_0 = 0,
++    IMG_ITER_PLANE_1,
++    IMG_ITER_PLANE_2,
++    IMG_ITER_PLANE_3,
++    IMG_ITER_MAX_NUM_PLANES
++};
++
++enum interleaved_frames_types_planes {
++    INTERLEAVED_FRAME_MAIN_PLANE = 0,
++    INTERLEAVED_FRAME_NUM_PLANES
++};
++
++enum yuv_semi_planar_frame_types_planes {
++    YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
++    YUV_SEMI_PLANAR_FRAME_UV_PLANE,
++    YUV_SEMI_PLANAR_FRAME_NUM_PLANES
++};
++
++enum yuv_planar_frame_types_planes {
++    YUV_PLANAR_FRAME_Y_PLANE = 0,
++    YUV_PLANAR_FRAME_U_PLANE,
++    YUV_PLANAR_FRAME_V_PLANE,
++    YUV_PLANAR_FRAME_NUM_PLANES
++};
++
++enum bayer_planar_frame_types_planes {
++    BAYER_PLANAR_FRAME_GR_PLANE = 0,
++    BAYER_PLANAR_FRAME_R_PLANE,
++    BAYER_PLANAR_FRAME_B_PLANE,
++    BAYER_PLANAR_FRAME_GB_PLANE,
++    BAYER_PLANAR_FRAME_NUM_PLANES
++};
++
++#endif /* PIPE_GENERATION */
++#endif    /* __FRAME_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
+new file mode 100644
+index 000000000000..8a8af09ea279
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_base_types.h
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_BASE_TYPES_H
++#define __IA_CSS_BASE_TYPES_H
++
++#include "type_support.h"
++
++#define VIED_VADDRESS_BITS                32
++
++#define DEVICE_DESCRIPTOR_ID_BITS            32
++
++#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
++    (2 * IA_CSS_UINT32_T_BITS + \
++    VIED_VADDRESS_BITS + \
++    2 * IA_CSS_UINT16_T_BITS)
++
++#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
++    (2 * IA_CSS_UINT32_T_BITS + \
++    VIED_VADDRESS_BITS + \
++    2 * IA_CSS_UINT16_T_BITS)
++
++#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
++#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
++
++typedef uint32_t vied_vaddress_t;
++
++typedef struct {
++    uint8_t device_id;
++    uint8_t instance_id;
++    uint8_t channel_id;
++    uint8_t section_id;
++} device_descriptor_fields_t;
++
++typedef union {
++    device_descriptor_fields_t fields;
++    uint32_t data;
++} device_descriptor_id_t;
++
++typedef uint16_t ia_css_process_id_t;
++
++#endif /* __IA_CSS_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
+new file mode 100644
+index 000000000000..683c2f5d23e1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs.h
+@@ -0,0 +1,789 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
++#define __IA_CSS_ISA_PARAMETER_DEFS_H
++
++#include "ia_css_isa_parameter_defs_dep.h"
++
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL            (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL        (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN            (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC            (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS            (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF        (1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM        (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE        (1)
++
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE            (0)
++
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF        (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE        (0)
++
++#define IA_CSS_ISA_NEEDS_SLICED_IN_INL                (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC                (1)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS                (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE            (0)
++
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC            (1)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE            (0)
++
++/* ==================== INL specs - START ==================== */
++/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT                        (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0                        (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0                    (0x204)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1                        (0x204)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1                    (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT                        (0)
++
++/* Spatial Parameter Terminal In does not exist for INL */
++
++/* Spatial Parameter Terminal Out does not exist for INL */
++
++/* Sliced Parameter Terminal In does not exist for INL */
++
++/* Sliced Parameter Terminal Out does not exist for INL */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT                            (0)
++/* ==================== INL specs - END ==================== */
++
++/* ==================== BLC_GLOBAL specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0                    (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0                    (0xC08)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1                    (0x20)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1                    (0xC0C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT                    (0)
++
++/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
++
++/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
++
++/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT                        (0)
++/* ==================== BLC_GLOBAL specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT                (0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT            (4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (8)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT                (0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT            (4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT                (0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT            (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1    (0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2    (0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3    (0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4    (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5    (0x380)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6    (0x680)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7        (0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7    (0x980)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7        (0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
++
++/* ==================== PCLN specs - START ==================== */
++/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT                        (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0                        (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0                    (0x820)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1                        (0x820)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1                    (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT                        (0)
++
++/* Spatial Parameter Terminal In does not exist for PCLN */
++
++/* Spatial Parameter Terminal Out does not exist for PCLN */
++
++/* Sliced Parameter Terminal In does not exist for PCLN */
++
++/* Sliced Parameter Terminal Out does not exist for PCLN */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT                            (0)
++/* ==================== PCLN specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0                (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0                (0xC00)
++/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
++
++/* ==================== BNR specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
++/* ==================== BNR specs - END ==================== */
++
++/* ==================== ISA_DM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
++
++/* ==================== ISA_DM specs - END ==================== */
++
++/* ==================== IDS specs - START ==================== */
++/* IDS is HW revision dependent */
++/* ==================== IDS specs - END ==================== */
++
++/* ==================== 3A_STAT_AWB specs - START ==================== */
++/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
++/* ==================== 3A_STAT_AWB specs - END ==================== */
++
++/* ==================== 3A_STAT_AF specs - START ==================== */
++/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0x88)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x40C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                    (0)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT                (2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM            (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE        (32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH        (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH        (32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT        (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT        (32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0            (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0            (0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0        (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1            (0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1            (0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1        (0x200)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1        (0x100)
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT                        (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0                    (0xC)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0                    (0x400)
++/* ==================== 3A_STAT_AF specs - END ==================== */
++
++/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0                (0x7C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0                (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
++
++/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT                    (0)
++/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
++
++/* ==================== 3A_STAT_AE specs - START ==================== */
++/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
++   found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x18C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0                (0x2000)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0                (0x200)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
++
++/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT                        (2)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0                    (0xC)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0                    (0x180)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1                    (0x180)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1                    (0x0)
++/* ==================== 3A_STAT_AE specs - END ==================== */
++
++/* TODO: REMOVE BACKWARD COMPATIBILITY */
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
++
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
++/* END OF TODO */
++
++#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
+new file mode 100644
+index 000000000000..3de76b774bba
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_isa_parameter_defs_dep.h
+@@ -0,0 +1,580 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
++#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
++
++#include "ia_css_ff_awb_statistics_param_defs.h"
++
++/*
++ * TODO: Adapt this file for IPU6!
++ */
++
++/* ==================== DPC_V2 specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2            (1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2            (1)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2            (1)
++
++/* ==================== PDAF specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF                (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF            (1)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF                (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF                (0)
++
++/* ==================== DPC_PEXT specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT            (0)
++
++/* ==================== SIS specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS            (0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS            (0)
++
++/* ==================== STREAM_CROP specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP            (0)
++
++/* ========== PIFCONV_A_INPUT specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT        (0)
++
++/* ========== PIFCONV_B_INPUT specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT        (0)
++
++/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED        (0)
++
++/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED        (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED        (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED        (0)
++
++/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS            (0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS            (0)
++
++/* ==================== IDS specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT                        (5)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                    (0x0C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x00)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1                    (0x10)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1                    (0x14)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2                    (0x18)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2                    (0x50)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3                    (0x20C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3                    (0x68)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4                    (0x24)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4                    (0x274)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT                        (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0                        (0x08)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0                    (0x0C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT                    (0)
++
++/* Spatial Parameter Terminal In does not exist for IDS */
++
++/* Spatial Parameter Terminal Out does not exist for IDS */
++
++/* Sliced Parameter Terminal In does not exist for IDS */
++
++/* Sliced Parameter Terminal Out does not exist for IDS */
++
++/* ==================== IDS specs - END ==================== */
++
++/* ==================== DPC specs used in PSYS - START ==================== */
++/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT                        (5)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4                    (0x8)        /* AF Statistics pixels */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4                    (0x34D4)    /* AF Statistics pixels */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT                        (4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                    (0x4)        /* GDC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x3378)    /* GDC/DPC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                    (0x1C0)        /* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x3000)    /* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                    (0x40)        /* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3488)    /* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3                    (0x4)        /* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3                    (0x34C8)    /* AF Grid Enable */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (0)
++
++/* Spatial Parameter Terminal In does not exist for DPC */
++
++/* Spatial Parameter Terminal Out does not exist for DPC */
++
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT                    (2)
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x3380)    /* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x1000)    /* DPC static LUT */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x0)        /* DPC static LUT */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x1000)    /* DPC static LUT */
++
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT                    (2)
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0            (0x4)        /* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0            (0x34CC)    /* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0            (0x4)        /* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1            (0x800)        /* AF Pixels metadata */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1            (0x2000)    /* AF Pixels metadata */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1            (0x800)        /* AF Pixels metadata */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT                        (3)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0                        (0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0                    (0x337C) /* DPC Control */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1                        (0x1B8)        /* CfgUnitMapping */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1                    (0x31C0)    /* CfgUnitMapping */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2                        (0x100)        /* AF pixels grid cfg */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2                    (0x3388)    /* AF pixels grid cfg */
++
++/* ==================== DPC specs - END ==================== */
++
++/* ==================== DPC_PEXT specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT                        (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0                    (0x8)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0                    (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1                    (0x8)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1                    (0xC)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT                    (0)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT                        (0)
++/* ==================== DPC_PEXT specs - END ==================== */
++
++/* TODO check ae values */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
++
++/* todo check gddpc_pext values when enabling this terminal */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
++
++/* ==================== PAF specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT                            (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0                        (0x18)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0                        (0x0)
++
++/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1                        (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1                        (-0xB0)
++
++#define    IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                        (0)
++/* Number of PAF blocks = 12*16 PAF blocks
++ * Max number of phase steps in each block: 11 steps (0-10)
++ *     for step 10, only the LSB values are valid and MSB 2bytes are reserved
++ *     Hence for each block height, we will have to read in 12 steps
++ * Size of each phase value =  2 bytes
++ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
++ * */
++
++/* Spatial Parameter Terminal In does not exist for PAF*/
++
++/* Spatial Parameter Terminal Out for PAF*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT                    (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM                (1)    /**/
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0                (0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0                (0x18)    /*Size of each phase output in a grid*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0            (0x200)    /*FF register offset from kernel base*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0            (0x180)    /*Determines the next FF location*/
++
++/* Sliced Parameter Terminal In does not exist for PAF*/
++
++/* Sliced Parameter Terminal Out does not exist for PAF*/
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT                            (0)
++/* ==================== PAF specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT                (0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT            (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM        (2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0        (0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0            (0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT                (0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT            (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM        (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE        (128)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (64)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0        (0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0            (0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT                (0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT            (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM        (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE        (32)    /* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH    (32)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT    (8)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT    (32)    /* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0        (0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0            (0x20)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0        (0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4            IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT            IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT                IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0            IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4                IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT                IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT            IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1        IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1    IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT                    IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2                IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
++
++/* ==================== LCA specs -- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT            (6)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0    (0xc) /* 0x0 to 0xb */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1    (0xcc) /* 0x10 to 0xdb */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1    (0x10)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2    (0x510) /* 0x100 to 0x60f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2    (0x100)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3    (0x510) /* 0x6c0 to 0xbcf */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3    (0x6c0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4    (0x510) /* 0xc80 to 0x118f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4    (0xc80)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5    (0x510) /* 0x1240 to 0x174f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5    (0x1240)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT        (0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0        (4) /* 0x1800 to 0x1803*/
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0    (0x1800)
++/* ==================== LCA specs -- END ==================== */
++
++/* ==================== WBA_WBA specs - START ==================== */
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
++/* ==================== WBA_WBA specs - END ==================== */
++
++/* leave those for now to pass isys compilation */
++/* ==================== SIS_WB_SIS specs - START ==================== */
++/* This device is similar to the WBA device in the PSA (with respect to registermap) */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
++
++/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
++
++/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
++/* ==================== SIS_WB_SIS specs - END ==================== */
++
++/* ==================== SIS_SIS specs - START ==================== */
++/* TODO: The SIS device does not yet expose the functionality for cropping */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
++
++/* Spatial Parameter Terminal In does not exist for SIS_SIS */
++
++/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
++/* ==================== SIS_SIS specs - END ==================== */
++
++/* ==================== STREAM_CROP specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT    (0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT        (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0    (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0    (0x4)
++/* ==================== STREAM_CROP specs - END ==================== */
++
++/* ==================== BNR specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT            (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0    (0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1    (0xA4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1    (0x34)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0        (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0    (0x2C)
++/* ==================== BNR specs - END ==================== */
++
++/* ==================== ISA_DM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0        (0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0    (0x0)
++
++/* ==================== ISA_DM specs - END ==================== */
++
++/* ====================  specs PIFCONV_SIS_A- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0        (0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT        (0)
++/* ====================  specs PIFCONV_SIS_A- END ==================== */
++
++/* ====================  specs PIFCONV_SIS_B- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0        (0x12)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT        (0)
++/* ====================  specs PIFCONV_SIS_B- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0        (0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT        (0)
++/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0        (0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT        (0)
++/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0        (0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT        (0)
++/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0        (0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT        (0)
++/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
++
++/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT            (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0        (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT        (0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT            (2)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0        (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0        (0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1        (0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1        (0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
++/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
++
++/* ==================== PIXEL FORMATTER specs - START ==================== */
++/* The base address of the Pixel Formatter device is 0x271000 */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0    (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT        (0x0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT        (1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0        (0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0    (0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
++                                            and base address of size register in the Pixel Formatter device is 0x24. */
++
++/* TODO: REMOVE BACKWARD COMPATIBILITY */
++/* NOT USED defs - needed for legacy*/
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0            IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0                IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT                    IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
++/* END OF TODO */
++
++#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
+new file mode 100644
+index 000000000000..508ca278ba65
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap.h
+@@ -0,0 +1,262 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_H
++#define __IA_CSS_KERNEL_BITMAP_H
++
++/*! \file */
++
++/** @file ia_css_kernel_bitmap.h
++ *
++ * The types and operations to make logic decisions given kernel bitmaps
++ * "ia_css_kernel_bitmap_t" can be larger than native types
++ */
++
++#include <type_support.h>
++#include "vied_nci_psys_resource_model.h"
++#include "ia_css_kernel_bitmap_storage_class.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
++#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
++    (sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
++#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
++    ((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
++
++/** An element is a 32 bit unsigned integer. 64 bit integers might cause
++ * problems in the compiler.
++ */
++typedef struct {
++    IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
++} ia_css_kernel_bitmap_elems_t;
++
++/** Users should make no assumption about the actual type of
++ * ia_css_kernel_bitmap_t.
++ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
++ * case they erroneously assume that this type is uint64_t and they
++ * cannot change their implementation.
++ */
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
++#else
++typedef uint64_t ia_css_kernel_bitmap_t;
++#if IA_CSS_KERNEL_BITMAP_BITS > 64
++#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
++    with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++#endif
++#endif
++
++/*! Print the bits of a kernel bitmap
++
++ @return < 0 on error
++ */
++extern int ia_css_kernel_bitmap_print(
++    const ia_css_kernel_bitmap_t    bitmap,
++    void                *fid);
++
++/*! Create an empty kernel bitmap
++
++ @return bitmap = 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
++
++/*! Creates the complement of a kernel bitmap
++ * @param    [in] bitmap kernel bitmap
++ * @return ~bitmap
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
++    const ia_css_kernel_bitmap_t bitmap);
++
++/*! Create the union of two kernel bitmaps
++
++ @param    [in] bitmap0                    kernel bitmap 0
++ @param    [in] bitmap1                    kernel bitmap 1
++
++ @return bitmap0 | bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1);
++
++/*! Create the intersection of two kernel bitmaps
++
++ @param    [in] bitmap0                    kernel bitmap 0
++ @param    [in] bitmap1                    kernel bitmap 1
++
++ @return bitmap0 & bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1);
++
++/*! Check if the kernel bitmaps is empty
++
++ @param    [in] bitmap                    kernel bitmap
++
++ @return bitmap == 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_empty(
++    const ia_css_kernel_bitmap_t            bitmap);
++
++/*! Check if the intersection of two kernel bitmaps is empty
++
++ @param    [in] bitmap0                    kernel bitmap 0
++ @param    [in] bitmap1                    kernel bitmap 1
++
++ @return (bitmap0 & bitmap1) == 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_intersection_empty(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1);
++
++/*! Check if the second kernel bitmap is a subset of the first (or equal)
++
++ @param    [in] bitmap0                    kernel bitmap 0
++ @param    [in] bitmap1                    kernel bitmap 1
++
++ Note: An empty set is always a subset, this function
++ returns true if bitmap 1 is empty
++
++ @return (bitmap0 & bitmap1) == bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_subset(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1);
++
++/*! Check if the kernel bitmaps are equal
++
++ @param    [in] bitmap0                    kernel bitmap 0
++ @param    [in] bitmap1                    kernel bitmap 1
++
++ @return bitmap0 == bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_equal(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1);
++
++/*! Right shift kernel bitmap
++
++ @param    [in] bitmap                    kernel bitmap 0
++
++ @return bitmap >> 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
++    const ia_css_kernel_bitmap_t            bitmap);
++
++/*! Check if the kernel bitmaps contains only a single element
++
++ @param    [in] bitmap                    kernel bitmap
++
++ @return weight(bitmap) == 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_onehot(
++    const ia_css_kernel_bitmap_t            bitmap);
++
++/*! Checks whether a specific kernel bit is set
++ * @return bitmap[index] == 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++int ia_css_is_kernel_bitmap_set(
++    const ia_css_kernel_bitmap_t    bitmap,
++    const unsigned int        index);
++
++/*! Create the union of a kernel bitmap with a onehot bitmap
++ * with a bit set at index
++
++ @return bitmap[index] |= 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
++    const ia_css_kernel_bitmap_t            bitmap,
++    const unsigned int                        index);
++
++/*! Set elem_index-th 32-bit element of the bitmap
++ * to elem_value
++
++ @return updated bitmap
++ */
++extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
++    ia_css_kernel_bitmap_t            bitmap,
++    const unsigned int            elem_index,
++    const uint32_t                elem_value);
++
++/*! Creates kernel bitmap using a uint64 value.
++ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
++ */
++extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
++    const uint64_t    value);
++
++/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
++ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
++ *  are returned.
++ *  @return uint64_t representation of value
++*/
++extern uint64_t ia_css_kernel_bitmap_to_uint64(
++    const ia_css_kernel_bitmap_t value);
++
++/*! Creates a kernel bitmap with the bit at index 'index' removed.
++ * @return ~(1 << index) & bitmap
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
++    const ia_css_kernel_bitmap_t    bitmap,
++    const unsigned int        index);
++
++/*! Set a previously clear field of a kernel bitmap at index
++
++ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
++    const ia_css_kernel_bitmap_t            bitmap,
++    const unsigned int                        index);
++
++/*! Create a onehot kernel bitmap with a bit set at index
++
++ @return bitmap[index] = 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
++    const unsigned int                        index);
++
++/*! Create a random bitmap
++
++ @return bitmap[index] = 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
++
++/*! @} */
++
++#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
++#include "ia_css_kernel_bitmap_impl.h"
++#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
++
++#endif /* __IA_CSS_KERNEL_BITMAP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
+new file mode 100644
+index 000000000000..45dbcda2da4d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_impl.h
+@@ -0,0 +1,340 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
++#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
++
++#include <ia_css_kernel_bitmap.h>
++#include <type_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include "math_support.h"
++#include "ia_css_psys_kernel_trace.h"
++#include "ia_css_kernel_bitmap_storage_class.h"
++
++STORAGE_CLASS_INLINE
++int ia_css_kernel_bitmap_compute_weight(
++    const ia_css_kernel_bitmap_t            bitmap)
++{
++    ia_css_kernel_bitmap_t    loc_bitmap;
++    int    weight = 0;
++    int    i;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_compute_weight(): enter:\n");
++
++    loc_bitmap = bitmap;
++
++    /* In fact; do not need the iterator "i" */
++    for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
++            !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
++        weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
++        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
++    }
++
++    return weight;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_intersection_empty(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1)
++{
++    ia_css_kernel_bitmap_t intersection;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
++
++    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
++    return ia_css_is_kernel_bitmap_empty(intersection);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_empty(
++    const ia_css_kernel_bitmap_t            bitmap)
++{
++    unsigned int i;
++    bool is_empty = true;
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_is_kernel_bitmap_empty(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        is_empty &= bitmap.data[i] == 0;
++    }
++#else
++    NOT_USED(i);
++    is_empty = (bitmap == 0);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return is_empty;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_equal(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1)
++{
++    unsigned int i;
++    bool is_equal = true;
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_is_kernel_bitmap_equal(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
++    }
++#else
++    NOT_USED(i);
++    is_equal = (bitmap0 == bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return is_equal;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_onehot(
++    const ia_css_kernel_bitmap_t            bitmap)
++{
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_is_kernel_bitmap_onehot(): enter:\n");
++    return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_subset(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1)
++{
++    ia_css_kernel_bitmap_t intersection;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_is_kernel_bitmap_subset(): enter:\n");
++
++    intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
++    return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
++{
++    unsigned int i;
++    ia_css_kernel_bitmap_t bitmap = {{0} };
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_clear(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        bitmap.data[i] = 0;
++    }
++#else
++    NOT_USED(i);
++    bitmap = 0;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return bitmap;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
++    const ia_css_kernel_bitmap_t bitmap)
++{
++    unsigned int i;
++    ia_css_kernel_bitmap_t result = {{0} };
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_complement(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        result.data[i] = ~bitmap.data[i];
++    }
++#else
++    NOT_USED(i);
++    result = ~bitmap;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1)
++{
++    unsigned int i;
++    ia_css_kernel_bitmap_t result = {{0} };
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_union(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
++    }
++#else
++    NOT_USED(i);
++    result = (bitmap0 | bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
++    const ia_css_kernel_bitmap_t            bitmap0,
++    const ia_css_kernel_bitmap_t            bitmap1)
++{
++    unsigned int i;
++    ia_css_kernel_bitmap_t result = {{0} };
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_intersection(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
++    }
++#else
++    NOT_USED(i);
++    result = (bitmap0 & bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
++    const ia_css_kernel_bitmap_t            bitmap,
++    const unsigned int                        index)
++{
++    ia_css_kernel_bitmap_t    bit_mask;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_set(): enter:\n");
++
++    bit_mask = ia_css_kernel_bit_mask(index);
++    return ia_css_kernel_bitmap_union(bitmap, bit_mask);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
++    const ia_css_kernel_bitmap_t    bitmap,
++    const unsigned int        index)
++{
++    ia_css_kernel_bitmap_t result;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_unset(): enter:\n");
++
++    result = ia_css_kernel_bit_mask(index);
++    result = ia_css_kernel_bitmap_complement(result);
++    return ia_css_kernel_bitmap_intersection(bitmap, result);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
++    const ia_css_kernel_bitmap_t            bitmap,
++    const unsigned int                        index)
++{
++    ia_css_kernel_bitmap_t    ret;
++    ia_css_kernel_bitmap_t    bit_mask;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_set_unique(): enter:\n");
++
++    ret = ia_css_kernel_bitmap_clear();
++    bit_mask = ia_css_kernel_bit_mask(index);
++
++    if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
++            && !ia_css_is_kernel_bitmap_empty(bit_mask)) {
++        ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
++    }
++    return ret;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
++    const unsigned int                        index)
++{
++    unsigned int elem_index;
++    unsigned int elem_bit_index;
++    ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
++
++    /* Assert disabled for staging, because some PGs do not satisfy this condition */
++    /* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bit_mask(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
++        elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++        elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++        assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
++
++        bit_mask.data[elem_index] = 1 << elem_bit_index;
++    }
++#else
++    NOT_USED(elem_index);
++    NOT_USED(elem_bit_index);
++    if (index < IA_CSS_KERNEL_BITMAP_BITS) {
++        bit_mask = (ia_css_kernel_bitmap_t)1 << index;
++    }
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return bit_mask;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++int ia_css_is_kernel_bitmap_set(
++    const ia_css_kernel_bitmap_t    bitmap,
++    const unsigned int                index)
++{
++    unsigned int elem_index;
++    unsigned int elem_bit_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_is_kernel_bitmap_set(): enter:\n");
++
++    assert(index < IA_CSS_KERNEL_BITMAP_BITS);
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++    elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++    assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
++    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
++#else
++    NOT_USED(elem_index);
++    NOT_USED(elem_bit_index);
++    return (((bitmap >> index) & 0x1) == 1);
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
++    const ia_css_kernel_bitmap_t            bitmap)
++{
++    int i;
++    unsigned int lsb_current_elem = 0;
++    unsigned int lsb_previous_elem = 0;
++    ia_css_kernel_bitmap_t loc_bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++               "ia_css_kernel_bitmap_shift(): enter:\n");
++
++    loc_bitmap = bitmap;
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
++        lsb_current_elem = bitmap.data[i] & 0x01;
++        loc_bitmap.data[i] >>= 1;
++        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
++        lsb_previous_elem = lsb_current_elem;
++    }
++#else
++    NOT_USED(i);
++    NOT_USED(lsb_current_elem);
++    NOT_USED(lsb_previous_elem);
++    loc_bitmap >>= 1;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++    return loc_bitmap;
++}
++
++#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
+new file mode 100644
+index 000000000000..8b7cd391bd1b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_bitmap_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++#else
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
+new file mode 100644
+index 000000000000..b4619aab0db9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_kernel_user_param_types.h
+@@ -0,0 +1,88 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
++#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
++
++#include "type_support.h"
++
++#define KERNEL_USER_PARAM_S_PADDING 4
++
++#define SIZE_OF_KERNEL_USER_PARAM_S ( \
++      (1 * IA_CSS_UINT64_T_BITS) \
++    + (1 * IA_CSS_UINT32_T_BITS) \
++    + (4 * IA_CSS_UINT16_T_BITS) \
++    + (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
++
++/** \brief A kernel user parameter object.
++ * Always use ia_css_kernel_user_param_get_descriptor_size or
++ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
++ * appropriate size for the kernel user parameter object.
++ *
++ * Use an init function like ia_css_kernel_user_param_init to initialize
++ * the kernel user parameter object.
++ *
++ * Never instantiate this struct in a different way.
++ */
++typedef struct ia_css_kernel_user_param_s {
++    /* Parameter buffer handle attached to the terminal */
++    union {
++        void *p;
++        uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
++    } payload_buffer;
++    /* Buffer size */
++    uint32_t payload_buffer_size;
++    /* Points to the variable array of ia_css_kernel_user_param_desc_s */
++    uint16_t kernel_desc_offset;
++    /* Number of kernels in program group */
++    uint16_t kernel_count;
++    /* Number of fragments in frame */
++    uint16_t fragment_count;
++    /* Fragment stride in bytes */
++    uint16_t fragment_stride;
++    /* padding */
++    uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
++} ia_css_kernel_user_param_t;
++
++typedef struct ia_css_kernel_user_param_kernel_desc_s {
++    /* kernel identifier */
++    uint32_t kernel_id;
++    /* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
++    uint16_t cfg_desc_offset;
++    /* Number of configurations for this kernel */
++    uint16_t cfg_desc_count;
++} ia_css_kernel_user_param_kernel_desc_t;
++
++typedef struct ia_css_kernel_user_param_cfg_desc_s {
++    /* Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /* Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++} ia_css_kernel_user_param_cfg_desc_t;
++
++/*!
++ * Construction information to construct a kernel user param object.
++ * This type is only used for ia_css_kernel_user_param_init and
++ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
++ */
++typedef struct ia_css_kernel_user_param_kernel_info_s {
++    uint32_t kernel_id;
++    uint16_t section_count;
++    uint32_t *section_sizes; /**< Array of size section_count. Each element
++        encode the size in bytes or a kernel config (section). */
++} ia_css_kernel_user_param_kernel_info_t;
++
++#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
+new file mode 100644
+index 000000000000..6716c1ec30f2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_param_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
++#define __IA_CSS_PARAM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __INLINE_PARAMETERS__
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
++#else
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
+new file mode 100644
+index 000000000000..fc1cd1ce94e0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data.h
+@@ -0,0 +1,449 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_H
++
++#include "ia_css_psys_data_storage_class.h"
++
++/*! \file */
++
++/** @file ia_css_program_group_data.h
++ *
++ * Define the data objects that are passed to the process groups
++ * i.e. frames and matrices with their sub-structures
++ *
++ * The data objects are separate from the process group terminal,
++ * although they are stored by value rather than by reference and
++ * make the process group terminal dependendent on its definition
++ *
++ * This frame definition overloads the current CSS frame definition
++ * they are the same object, just a slightly different implementation
++ */
++
++#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
++
++#include <type_support.h>
++#include "ia_css_program_group_data_defs.h"    /* ia_css_frame_format_type */
++
++#include "ia_css_terminal_defs.h"
++
++/**
++ * Frame buffer state used for sequencing
++ * (see FAS 5.5.3)
++ *
++ * The buffer can be in DDR or a handle to a stream
++ */
++typedef enum ia_css_buffer_state {
++    IA_CSS_BUFFER_NULL = 0,
++    IA_CSS_BUFFER_UNDEFINED,
++    IA_CSS_BUFFER_EMPTY,
++    IA_CSS_BUFFER_NONEMPTY,
++    IA_CSS_BUFFER_FULL,
++    IA_CSS_N_BUFFER_STATES
++} ia_css_buffer_state_t;
++
++#define IA_CSS_BUFFER_STATE_IN_BITS    32
++
++/**
++ * Pointer state used to signal MMU invalidation
++ */
++typedef enum ia_css_pointer_state {
++    IA_CSS_POINTER_INVALID = 0,
++    IA_CSS_POINTER_VALID,
++    IA_CSS_N_POINTER_STATES
++} ia_css_pointer_state_t;
++
++#define IA_CSS_POINTER_STATE_IN_BITS    32
++
++/**
++ * Access direction needed to select the access port
++ *
++ * @note No known use of any literal in this
++ * enumeration.
++ */
++typedef enum ia_css_access_type {
++    IA_CSS_ACCESS_LOCKED = 0,
++    IA_CSS_ACCESS_READ,
++    IA_CSS_ACCESS_WRITE,
++    IA_CSS_ACCESS_MODIFY,
++    IA_CSS_N_ACCESS_TYPES
++} ia_css_access_type_t;
++
++#define IA_CSS_ACCESS_TYPE_IN_BITS    32
++
++/**
++ * Access attribute needed to select the access port
++ *    - public : snooped
++ *    - private: non-snooped
++ * Naming is a bit awkward, lack of inspiration
++ *
++ * @note No known use of any literal in this
++ * enumeration.
++ */
++typedef enum ia_css_access_scope {
++    IA_CSS_ACCESS_PRIVATE = 0,
++    IA_CSS_ACCESS_PUBLIC,
++    IA_CSS_N_ACCESS_SCOPES
++} ia_css_access_scopes_t;
++
++#define IA_CSS_ACCESS_SCOPES_IN_BITS    32
++
++#define IA_CSS_N_FRAME_PLANES            6
++
++#define IA_CSS_FRAME_FORMAT_BITMAP_BITS    64
++
++typedef uint64_t ia_css_frame_format_bitmap_t;
++
++typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
++typedef struct ia_css_param_frame_s        ia_css_param_frame_t;
++
++typedef struct ia_css_frame_descriptor_s    ia_css_frame_descriptor_t;
++typedef struct ia_css_frame_s                ia_css_frame_t;
++typedef struct ia_css_fragment_descriptor_s    ia_css_fragment_descriptor_t;
++
++typedef struct ia_css_stream_s            ia_css_stream_t;
++
++#define    N_UINT64_IN_STREAM_STRUCT            1
++
++#define    IA_CSS_STREAM_STRUCT_BITS \
++    (N_UINT64_IN_STREAM_STRUCT * 64)
++
++struct ia_css_stream_s {
++    uint64_t dummy;
++};
++
++struct ia_css_param_frame_descriptor_s {
++    uint16_t    size;        /**< Size of the descriptor */
++    uint32_t    buffer_count;    /**< Number of parameter buffers */
++};
++
++struct ia_css_param_frame_s {
++    /** Base virtual addresses to parameters in subsystem virtual
++     * memory space
++     */
++    vied_vaddress_t *data;
++};
++
++#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
++
++#define N_UINT32_IN_FRAME_DESC_STRUCT \
++    (1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
++#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
++#define N_UINT8_IN_FRAME_DESC_STRUCT 4
++#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
++
++#define    IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
++    (IA_CSS_FRAME_FORMAT_TYPE_BITS \
++    + (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
++    + (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
++    + (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
++    + (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
++
++/**
++ * Structure defining the frame (size and access) properties for
++ * inbuild types only.
++ *
++ * The inbuild types like FourCC, MIPI and CSS private types are supported
++ * by FW all other types are custom types which interpretation must be encoded
++ * on the buffer itself or known by the source and sink
++ */
++struct ia_css_frame_descriptor_s {
++    /** Indicates if this is a generic type or inbuild with
++      * variable size descriptor.
++      */
++    ia_css_frame_format_type_t frame_format_type;
++    /** Number of data planes (pointers) */
++    uint32_t plane_count;
++    /** Plane offsets accounting for fragments */
++    uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
++    /** Physical size aspects */
++    uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
++    /** Tile status buffer offsets for DEC400 compression */
++    uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
++    /** Logical dimensions */
++    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
++    /** Size of this descriptor */
++    uint16_t size;
++    /** Bits per pixel (meaningful bits, AKA precision) */
++    uint8_t bpp;
++    /** Bits per element (bits required for storage of the pixel in memory) */
++    uint8_t bpe;
++    /** 1 if terminal uses compressed datatype, 0 otherwise */
++    uint8_t is_compressed;
++    /** 1 if pixel data is signed, 0 otherwise */
++    uint8_t is_signed;
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
++};
++
++#define    N_UINT32_IN_FRAME_STRUCT        2
++#define    N_PADDING_UINT8_IN_FRAME_STRUCT    4
++
++#define    IA_CSS_FRAME_STRUCT_BITS \
++    (IA_CSS_BUFFER_STATE_IN_BITS \
++    + IA_CSS_ACCESS_TYPE_IN_BITS \
++    + IA_CSS_POINTER_STATE_IN_BITS \
++    + IA_CSS_ACCESS_SCOPES_IN_BITS \
++    + VIED_VADDRESS_BITS \
++    + (N_UINT32_IN_FRAME_STRUCT * 32) \
++    + (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
++
++/**
++ * Main frame structure holding the main store and auxilary access properties
++ * the "pointer_state" and "access_scope" should be encoded on the
++ * "vied_vaddress_t" type
++ *
++ * @note A number of fields in this structure are either no longer
++ * used, or their use is trivialized, in the current code base.  This is
++ * due to the Persistent Program Group (PPG) concept which separated the
++ * attatchment of frame buffers into a separate structure, the buffer set.
++ * @par Set all unused fields to zero, unless otherwise noted.
++ * @see ia_css_buffer_set_s
++ */
++struct ia_css_frame_s {
++    /** State of the frame for purpose of sequencing.
++     *
++     *  @note This field is apparently a leftover from the pre-PPG
++     *  type of program group and no longer has any real use.
++     *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
++     *  IA_CSS_BUFFER_EMPTY for output frames */
++    ia_css_buffer_state_t buffer_state;
++    /** Access direction, may change when buffer state changes.
++     *
++     *  @note Cannot find any use of this. */
++    ia_css_access_type_t access_type;
++    /** State of the pointer for purpose of embedded MMU coherency
++     * @note No known non-trivial use of the field.
++     */
++    ia_css_pointer_state_t pointer_state;
++    /** Access to the pointer for purpose of host cache coherency
++    *  @note Cannot find any use of this. */
++    ia_css_access_scopes_t access_scope;
++    /** Base virtual address to data in IPU subsystem virtual memory space.
++     *  @note No longer used for PPG's */
++    vied_vaddress_t data;
++    /** Index into the array of buffer addresses within the buffer set structure
++     *  which is sent separately. The value at that location replaces the
++     *  "data" field in this structure.  */
++    uint32_t data_index;
++    /** Total buffer allocation size in bytes */
++    uint32_t data_bytes;
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
++};
++
++#define    N_UINT16_IN_FRAGMENT_DESC_STRUCT    (3 * IA_CSS_N_DATA_DIMENSION)
++#define    N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
++
++#define    IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
++    ((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
++    + (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
++
++/**
++ * Structure defining the fragment (size and access) properties.
++ *
++ * All cropping and padding effects are described by the difference between
++ * the frame size and its location and the fragment size(s) and location(s)
++ */
++struct ia_css_fragment_descriptor_s {
++    /** Logical dimensions of the fragment */
++    uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
++    /** Logical location of the fragment in the frame */
++    uint16_t index[IA_CSS_N_DATA_DIMENSION];
++    /** Fractional start (phase) of the fragment in the access unit */
++    uint16_t offset[IA_CSS_N_DATA_DIMENSION];
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
++};
++
++/*! Print the frame object to file/stream
++
++ @param    frame[in]            frame object
++ @param    fid[out]            file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_print(
++    const ia_css_frame_t *frame, void *fid);
++
++/*! Get the data buffer handle from the frame object
++
++@param    frame[in]            frame object
++
++@return buffer pointer, VIED_NULL on error
++*/
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
++    const ia_css_frame_t *frame);
++
++/*! Get the data buffer handle from the frame object
++
++ @param    frame[in]            frame object
++
++ @return buffer pointer, VIED_NULL on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
++
++/*! Set the data buffer handle on the frame object
++
++ @param    frame[in]            frame object
++ @param    buffer[in]            buffer pointer
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_buffer(
++    ia_css_frame_t *frame, vied_vaddress_t buffer);
++
++/*! Get the data buffer index in the frame object
++
++ @param    frame[in]            frame object
++
++ @return data buffer index on success, -1 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_get_data_index(
++    const ia_css_frame_t *frame);
++
++/*! Set the data buffer index in the frame object
++
++ @param    frame[in]            frame object
++ @param    data_index[in]            data buffer index
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_data_index(
++    ia_css_frame_t *frame,
++    unsigned int data_index);
++
++/*! Set the data buffer size on the frame object
++
++ @param    frame[in]            frame object
++ @param    size[in]            number of data bytes
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_data_bytes(
++    ia_css_frame_t *frame, unsigned size);
++
++/*! Get the data buffer state from the frame object
++
++ @param    frame[in]            frame object
++
++ @return buffer state, limit value on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_buffer_state_t ia_css_frame_get_buffer_state(
++    const ia_css_frame_t *frame);
++
++/*! Set the data buffer state of the frame object
++
++ @param    frame[in]            frame object
++ @param    buffer_state[in]        buffer state
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
++    const ia_css_buffer_state_t buffer_state);
++
++/*! Get the data pointer state from the frame object
++
++ @param    frame[in]            frame object
++
++ @return pointer state, limit value on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_pointer_state_t ia_css_frame_get_pointer_state(
++    const ia_css_frame_t *frame);
++
++/*! Set the data pointer state of the frame object
++
++ @param    frame[in]            frame object
++ @param    pointer_state[in]        pointer state
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
++    const ia_css_pointer_state_t pointer_state);
++
++/*! Print the frame descriptor object to file/stream
++
++ @param    frame_descriptor[in]    frame descriptor object
++ @param    fid[out]        file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_descriptor_print(
++    const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
++
++/*! Print the fragment descriptor object to file/stream
++
++ @param    fragment_descriptor[in]    fragment descriptor object
++ @param    fid[out]        file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_fragment_descriptor_print(
++    const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
++
++/*! Compute the bitmap for the frame format type
++
++ @param    frame_format_type[in]    frame format type
++
++ @return 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
++    const ia_css_frame_format_type_t frame_format_type);
++
++/*! clear frame format bitmap
++
++ @return cleared bitmap
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
++
++/*! Compute the size of storage required for the data descriptor object
++ * on a terminal
++ *@param       plane_count[in]    The number of data planes in the buffer
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++size_t ia_css_sizeof_frame_descriptor(
++        const uint8_t plane_count);
++/*! Compute the size of storage required for the kernel parameter descriptor
++ * object on a terminal
++
++ @param    section_count[in]    The number of parameter sections in the buffer
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_kernel_param_descriptor(
++    const uint16_t section_count);
++
++#ifdef __IA_CSS_PSYS_DATA_INLINE__
++#include "ia_css_program_group_data_impl.h"
++#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
+new file mode 100644
+index 000000000000..9d1ddac9d25c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_defs.h
+@@ -0,0 +1,244 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
++
++#include "frame_support.h"
++
++/**
++ * Pre-defined frame format
++ *
++ * Those formats have inbuild support of traffic
++ * and access functions
++ *
++ * Note that the formats are for terminals, so there
++ * is no distinction between input and output formats
++ *    - Custom formats with ot without descriptor
++ *    - 4CC formats such as YUV variants
++ *    - MIPI (line) formats as produced by CSI receivers
++ *    - MIPI (sensor) formats such as Bayer or RGBC
++ *    - CSS internal formats (private types)
++ *  - CSS parameters (type 1 - 6)
++ */
++#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
++typedef enum ia_css_frame_format_type {
++    IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
++    IA_CSS_DATA_CUSTOM,
++
++    /** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV11,
++    /** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
++    IA_CSS_DATA_FORMAT_YUV420,
++    /** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
++    IA_CSS_DATA_FORMAT_YV12,
++    /** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV12,
++    /** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV12_16,
++    /** 12 bit YUV 420, Intel proprietary tiled format, TileY */
++    IA_CSS_DATA_FORMAT_NV12_TILEY,
++    /** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV21,
++    /** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
++    IA_CSS_DATA_FORMAT_YUV422,
++    /** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_YV16,
++    /** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV16,
++    /** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_NV61,
++    /** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_UYVY,
++    /** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_YUYV,
++    /** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
++    IA_CSS_DATA_FORMAT_YUV444,
++    /** 8 bit monochrome plane */
++    IA_CSS_DATA_FORMAT_Y800,
++
++    /** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
++    IA_CSS_DATA_FORMAT_RGB565,
++    /** 24 bit RGB, 3 planes  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_RGB888,
++    /** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
++    IA_CSS_DATA_FORMAT_RGBA888,
++
++    /** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_BAYER_GRBG,
++    /** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_BAYER_RGGB,
++    /** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_BAYER_BGGR,
++    /** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_BAYER_GBRG,
++
++    /** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
++     * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
++     */
++    IA_CSS_DATA_FORMAT_YUV420_LINE,
++    /** Deprecated RAW, 1 plane */
++    IA_CSS_DATA_FORMAT_RAW,
++    /** Deprecated RAW, 1 plane, packed */
++    IA_CSS_DATA_FORMAT_RAW_PACKED,
++    /** Internal, for advanced ISP */
++    IA_CSS_DATA_FORMAT_QPLANE6,
++    /** 1D byte stream, used for jpeg 1-plane */
++    IA_CSS_DATA_FORMAT_BINARY_8,
++    /** Deprecated MIPI frame, 1D byte stream 1 plane */
++    IA_CSS_DATA_FORMAT_MIPI,
++    /** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
++     * (8 bit per element)
++     */
++    IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
++    /** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
++     * (10 bit per element)
++     */
++    IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
++    /** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
++    IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
++
++    /** Type 1-5 parameter, not fragmentable */
++    IA_CSS_DATA_GENERIC_PARAMETER,
++    /** Video stabilisation Type 6 parameter, fragmentable */
++    IA_CSS_DATA_DVS_PARAMETER,
++    /** Video stabilisation Type 6 parameter, coordinates */
++    IA_CSS_DATA_DVS_COORDINATES,
++    /** Dead Pixel correction Type 6 parameter, fragmentable */
++    IA_CSS_DATA_DPC_PARAMETER,
++    /** Lens Shading Correction Type 6 parameter, fragmentable */
++    IA_CSS_DATA_LSC_PARAMETER,
++    /** 3A statistics output HI. */
++    IA_CSS_DATA_S3A_STATISTICS_HI,
++    /** 3A statistics output LO. */
++    IA_CSS_DATA_S3A_STATISTICS_LO,
++    /** histogram output */
++    IA_CSS_DATA_S3A_HISTOGRAM,
++    /** GammaStar grid */
++    IA_CSS_DATA_GAMMASTAR_GRID,
++
++    /** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
++    IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
++    /** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
++    IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
++    /** Gr R B Gb 4-planes */
++    IA_CSS_DATA_FORMAT_BAYER_PLANAR,
++    /** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
++    IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
++
++    /** 16 bit YUV 420, Y even plane, Y uneven plane,
++     * UV plane vector interleaved
++     */
++    IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
++    /** 16 bit YUV 420, YYUVYY vector interleaved */
++    IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
++
++    /** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
++    IA_CSS_DATA_FORMAT_NV12_TILEYF,
++
++    /** Y samples appear first in the memory. All Y samples are array of WORDs;
++    * even number of lines ;
++    * Surface stride can be larger than the width of Y plane.
++    * This array is followed immediately by chroma array.
++    * Chroma array is an array of WORDs, with interleaved U/V samples.
++    * If the interleaved U/V plane is addresses as an * array of DWORDs,
++    * the least significant word contains U sample. The stride of the
++    * interleaved U/V plane is equal to Y plane. 10 bit data.
++    */
++    IA_CSS_DATA_FORMAT_P010,
++
++    /** MSB aligned version of P010*/
++    IA_CSS_DATA_FORMAT_P010_MSB,
++
++    /** P016/P012 Y samples appear first in the memory.
++    * All Y samples are array of WORDs;
++    * even number of lines ;
++    * Surface stride can be larger than the width of Y plane.
++    * This array is followed immediately by chroma array.
++    * Chroma array is an array of WORDs, with interleaved U/V samples.
++    * If the interleaved U/V plane is addresses as an * array of DWORDs,
++    * the least significant word contains U sample. The stride of the
++    * interleaved U/V plane is equal to Y plane. 12 bit data.
++    */
++    IA_CSS_DATA_FORMAT_P016,
++
++    /** MSB aligned version of P016*/
++    IA_CSS_DATA_FORMAT_P016_MSB,
++
++    /** TILEY representation of P010 LSB-aligned format */
++    IA_CSS_DATA_FORMAT_P010_TILEY,
++
++    /** TILEY representation of P010 MSB-aligned format */
++    IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
++
++    /** TILEY representation of P016 LSB-aligned format */
++    IA_CSS_DATA_FORMAT_P016_TILEY,
++
++    /** TILEY representation of P016 MSB-aligned format*/
++    IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
++
++    /** TILEYf representation of P010*/
++    IA_CSS_DATA_FORMAT_P010_TILEYF,
++
++    /** TILEYf representation of P010 MSB aligned*/
++    IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
++
++    /** TILEYf representation of P016*/
++    IA_CSS_DATA_FORMAT_P016_TILEYF,
++
++    /** TILEYf representation of P016 MSB aligned*/
++    IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
++
++    /** consists of L and R PDAF pixel line pairs.
++     * If line n is L pixel line, n+1 will be R pixel line.
++     * Depending on mode - First line can be L or R pixel line and
++     * the line pair sequence can also alternate. 1-plane (bpp == bpe)
++     */
++    IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
++
++    /** consists of L and R PDAF pixel pairs.
++         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
++         * alternating between the above two as well. 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
++
++    /** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
++    IA_CSS_DATA_FORMAT_IR,
++
++    /** MSB aligned version of P012*/
++    IA_CSS_DATA_FORMAT_P012_MSB,
++
++    /* Each tile is stored in consecutive addresses in DDR.
++     * The scanning walking order within a tile is raster order
++     * (line-by-line).
++     */
++    /* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
++     * followed by an interleaved 8 bit U/V
++     * samples plane.
++     */
++    IA_CSS_DATA_FORMAT_NV12_TILE,
++    /*P010 is similar to NV12, but with 10 bit values,
++     * each stored in a 16b container (msb aligned, 6 lsb are zero).
++     */
++    IA_CSS_DATA_FORMAT_P010_TILE,
++    /* P012 is similar to P010, but with 12 bit values,
++     * each stored in a 16b containers (msb aligned, 4 lsb are zero).
++     */
++    IA_CSS_DATA_FORMAT_P012_TILE,
++
++    IA_CSS_N_FRAME_FORMAT_TYPES
++} ia_css_frame_format_type_t;
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
+new file mode 100644
+index 000000000000..5f1a2856ead4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_data_impl.h
+@@ -0,0 +1,461 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
++
++#include "ia_css_program_group_data.h"
++#include "ia_css_psys_data_trace.h"
++#include <error_support.h>    /* for verifexit */
++#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
++#include <misc_support.h>    /* for NOT_USED */
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_print(
++    const ia_css_frame_t *frame, void *fid)
++{
++    int retval = -1;
++
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
++
++    verifexit(frame != NULL);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
++    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
++     * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
++     */
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++           "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
++    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
++     * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
++     */
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tdata_bytes = %d\n", frame->data_bytes);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
++    const ia_css_frame_t *frame) {
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
++
++    verifexit(frame != NULL);
++    return &(frame->data);
++
++EXIT:
++    if (NULL == frame) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++            "ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
++    }
++    return NULL;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++vied_vaddress_t    ia_css_frame_get_buffer(
++    const ia_css_frame_t *frame)
++{
++    vied_vaddress_t    buffer = VIED_NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_get_buffer(): enter:\n");
++
++    verifexit(frame != NULL);
++    buffer = frame->data;
++
++EXIT:
++    if (NULL == frame) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++               "ia_css_frame_get_buffer invalid argument\n");
++    }
++    return buffer;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_buffer(
++    ia_css_frame_t *frame,
++    vied_vaddress_t buffer)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_set_buffer(): enter:\n");
++
++    verifexit(frame != NULL);
++    frame->data = buffer;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_set_buffer failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_get_data_index(
++    const ia_css_frame_t *frame)
++{
++    int data_index = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_get_data_index(): enter:\n");
++
++    verifexit(frame != NULL);
++
++    data_index = frame->data_index;
++
++EXIT:
++    if (NULL == frame) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++               "ia_css_frame_get_data_index invalid argument\n");
++    }
++    return data_index;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_data_index(
++    ia_css_frame_t *frame,
++    unsigned int data_index)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_set_data_index(): enter:\n");
++
++    verifexit(frame != NULL);
++
++    frame->data_index = data_index;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_set_data_index failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_data_bytes(
++    ia_css_frame_t *frame,
++    unsigned int size)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_set_data_bytes(): enter:\n");
++
++    verifexit(frame != NULL);
++    frame->data_bytes = size;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_set_data_bytes failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_buffer_state_t ia_css_frame_get_buffer_state(
++    const ia_css_frame_t *frame)
++{
++    ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_get_buffer_state(): enter:\n");
++
++    verifexit(frame != NULL);
++    buffer_state = frame->buffer_state;
++
++EXIT:
++    if (NULL == frame) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++            "ia_css_frame_get_buffer_state invalid argument\n");
++    }
++    return buffer_state;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_buffer_state(
++    ia_css_frame_t *frame,
++    const ia_css_buffer_state_t buffer_state)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_set_buffer_state(): enter:\n");
++
++    verifexit(frame != NULL);
++    frame->buffer_state = buffer_state;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_set_buffer_state failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_pointer_state_t ia_css_frame_get_pointer_state(
++    const ia_css_frame_t *frame)
++{
++    ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_get_pointer_state(): enter:\n");
++
++    verifexit(frame != NULL);
++    pointer_state = frame->pointer_state;
++
++EXIT:
++    if (NULL == frame) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++            "ia_css_frame_get_pointer_state invalid argument\n");
++    }
++    return pointer_state;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_pointer_state(
++    ia_css_frame_t *frame,
++    const ia_css_pointer_state_t pointer_state)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_set_pointer_state(): enter:\n");
++
++    verifexit(frame != NULL);
++    frame->pointer_state = pointer_state;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_set_pointer_state failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_descriptor_print(
++    const ia_css_frame_descriptor_t *frame_descriptor,
++    void *fid)
++{
++    int retval = -1;
++    int i;
++    uint8_t frame_plane_count;
++
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++        "ia_css_frame_descriptor_print(): enter:\n");
++
++    COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
++
++    verifexit(frame_descriptor != NULL);
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++        "ia_css_frame_descriptor_print(): enter:\n");
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tframe_format_type = %d\n",
++        frame_descriptor->frame_format_type);
++    /* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
++     * ia_css_frame_format_string(frame_descriptor->frame_format_type));
++     */
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tbpp = %d\n", frame_descriptor->bpp);
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tbpe = %d\n", frame_descriptor->bpe);
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tis_compressed = %d\n", frame_descriptor->is_compressed);
++
++    frame_plane_count = IA_CSS_N_FRAME_PLANES;
++    /* frame_plane_count =
++     * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
++     */
++
++    verifexit(frame_plane_count > 0);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tplane_offsets[%d]: [\n", frame_plane_count);
++    for (i = 0; i < (int)frame_plane_count - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", frame_descriptor->plane_offsets[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d ]\n", frame_descriptor->plane_offsets[i]);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tts_offsets[%d]: [\n", frame_plane_count);
++    for (i = 0; i < (int)frame_plane_count - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", frame_descriptor->ts_offsets[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d ]\n", frame_descriptor->ts_offsets[i]);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", frame_descriptor->dimension[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d }\n", frame_descriptor->dimension[i]);
++
++    COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
++    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", frame_descriptor->stride[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d }\n", frame_descriptor->stride[i]);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++            "ia_css_frame_descriptor_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_fragment_descriptor_print(
++    const ia_css_fragment_descriptor_t *fragment_descriptor,
++    void *fid)
++{
++    int retval = -1;
++    int i;
++
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++        "ia_css_fragment_descriptor_print(): enter:\n");
++
++    verifexit(fragment_descriptor != NULL);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", fragment_descriptor->dimension[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d }\n", fragment_descriptor->dimension[i]);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", fragment_descriptor->index[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "\t%4d }\n", fragment_descriptor->index[i]);
++
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++        "offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++    for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++            "\t%4d,\n", fragment_descriptor->offset[i]);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
++        fragment_descriptor->offset[i]);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++              "ia_css_fragment_descriptor_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
++    const ia_css_frame_format_type_t frame_format_type)
++{
++    ia_css_frame_format_bitmap_t bit_mask = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++        "ia_css_frame_format_bit_mask(): enter:\n");
++
++    if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
++        bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++            "ia_css_frame_format_bit_mask invalid argument\n");
++    }
++
++    return bit_mask;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++               "ia_css_frame_format_bitmap_clear(): enter:\n");
++
++    return 0;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++size_t ia_css_sizeof_frame_descriptor(
++        const uint8_t plane_count)
++{
++    size_t size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++               "ia_css_sizeof_frame_descriptor(): enter:\n");
++
++    verifexit(plane_count > 0);
++    size += sizeof(ia_css_frame_descriptor_t);
++    size += plane_count * sizeof(uint32_t);
++
++EXIT:
++    if (0 == plane_count) {
++        IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++            "ia_css_sizeof_frame_descriptor invalid argument\n");
++    }
++    return size;
++}
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
+new file mode 100644
+index 000000000000..a8a155223430
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.h
+@@ -0,0 +1,295 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param.h
++ *
++ * Define the methods on the program group parameter object that are not part
++ * of a single interface
++ */
++#include <ia_css_program_group_param_types.h>
++
++#include <ia_css_program_group_param.sim.h>
++
++#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
++
++#include <type_support.h>
++
++/*! Get the stored size of the program group parameter object
++
++ @param    param[in]            program group parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_program_group_param_get_size(
++    const ia_css_program_group_param_t        *param);
++
++/*! initialize program_group_param
++
++ @param    blob[in]    program group parameter object
++ @param    program_count[in]        number of  terminals.
++ @param    terminal_count[in]        number of  terminals.
++ @param    fragment_count[in]        number of  terminals.
++
++ @return 0 if success, else failure.
++ */
++extern int ia_css_program_group_param_init(
++    ia_css_program_group_param_t *blob,
++    const uint8_t    program_count,
++    const uint8_t    terminal_count,
++    const uint16_t    fragment_count,
++    const enum ia_css_frame_format_type *frame_format_types);
++/*! Get the program parameter object from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++ @param    i[in]                program parameter index
++
++ @return program parameter pointer, NULL on error
++ */
++extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
++    const ia_css_program_group_param_t *param,
++    const int i);
++
++/*! Get the terminal parameter object from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++ @param    i[in]                terminal parameter index
++
++ @return terminal parameter pointer, NULL on error
++ */
++extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
++    const ia_css_program_group_param_t *param,
++    const int i);
++
++/*! Get the fragment count from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return fragment count, 0 on error
++ */
++extern uint16_t ia_css_program_group_param_get_fragment_count(
++    const ia_css_program_group_param_t        *param);
++
++/*! Get the program count from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return program count, 0 on error
++ */
++extern uint8_t ia_css_program_group_param_get_program_count(
++    const ia_css_program_group_param_t        *param);
++
++/*! Get the terminal count from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return terminal count, 0 on error
++ */
++extern uint8_t ia_css_program_group_param_get_terminal_count(
++    const ia_css_program_group_param_t        *param);
++
++/*! Set the protocol version in a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++ @param    protocol_version[in]        protocol version
++
++ @return nonzero on error
++*/
++extern int
++ia_css_program_group_param_set_protocol_version(
++    ia_css_program_group_param_t *param,
++    uint8_t protocol_version);
++
++/*! Get the protocol version from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return protocol version
++*/
++extern uint8_t
++ia_css_program_group_param_get_protocol_version(
++    const ia_css_program_group_param_t *param);
++
++/*! Set the kernel enable bitmap from a program group parameter object
++
++ @param    param[in]            program group parameter object
++ @param    bitmap[in]            kernel enable bitmap
++
++ @return non-zero on error
++ */
++extern int ia_css_program_group_param_set_kernel_enable_bitmap(
++    ia_css_program_group_param_t    *param,
++    const ia_css_kernel_bitmap_t    bitmap);
++
++/*! Get the kernel enable bitmap from a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return kernel enable bitmap, 0 on error
++*/
++extern ia_css_kernel_bitmap_t
++ia_css_program_group_param_get_kernel_enable_bitmap(
++    const ia_css_program_group_param_t *param);
++
++/*! Get the stored size of the program parameter object
++
++ @param    param[in]            program parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_program_param_get_size(
++    const ia_css_program_param_t            *param);
++
++/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
++
++ @param    program_param[in]        program parameter object
++ @param    bitmap[in]            kernel enable bitmap
++
++ @return non-zero on error
++ */
++extern int ia_css_program_param_set_kernel_enable_bitmap(
++    ia_css_program_param_t    *program_param,
++    const ia_css_kernel_bitmap_t    bitmap);
++
++/*! Get the kernel enable bitmap from a program parameter object
++
++ @param    program_param[in]        program parameter object DEPRECATED
++
++ Note: This function returns in fact the kernel enable of the program group
++      parameters
++
++ @return kernel enable bitmap, 0 on error
++ */
++extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
++    const ia_css_program_param_t            *param);
++
++/*! Get the stored size of the terminal parameter object
++
++ @param    param[in]            terminal parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_terminal_param_get_size(
++    const ia_css_terminal_param_t            *param);
++
++/*! Get the kernel enable bitmap from a terminal parameter object
++
++ @param    terminal_param[in]        terminal parameter object
++
++ Note: This function returns in fact the kernel enable of the program group
++       parameters
++
++ @return kernel enable bitmap, 0 on error
++ */
++extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
++    const ia_css_terminal_param_t            *param);
++
++/*! Get the parent object for this terminal param.
++
++ @param    terminal_param[in]        terminal parameter object
++
++ @return parent program group param object
++ */
++extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
++    const ia_css_terminal_param_t            *param);
++
++/*! Get the data format type associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++
++ @return data format type (ia_css_data_format_type_t)
++ */
++extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
++    const ia_css_terminal_param_t    *terminal_param);
++
++/*! Set the data format type associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++ @param data_format_type[in]        data format type
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_frame_format_type(
++    ia_css_terminal_param_t    *terminal_param,
++    const ia_css_frame_format_type_t data_format_type);
++
++/*! Get bits per pixel on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++
++ @return bits per pixel
++ */
++extern uint8_t ia_css_terminal_param_get_bpp(
++    const ia_css_terminal_param_t    *terminal_param);
++
++/*! Set bits per pixel on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++ @param bpp[in]                bits per pixel
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_bpp(
++    ia_css_terminal_param_t    *terminal_param,
++    const uint8_t bpp);
++
++/*! Get dimensions on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++ @param    dimensions[out]            dimension array
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_get_dimensions(
++    const ia_css_terminal_param_t    *terminal_param,
++    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set dimensions on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++ @param    dimensions[in]            dimension array
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_dimensions(
++    ia_css_terminal_param_t    *terminal_param,
++    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get stride on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++
++ @return stride of the frame to be attached.
++ */
++extern uint32_t ia_css_terminal_param_get_stride(
++    const ia_css_terminal_param_t    *terminal_param);
++
++/*! Set stride on the frame associated with the terminal.
++
++ @param    terminal_param[in]        terminal parameter object
++ @param    stride[in]                stride
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_stride(
++    ia_css_terminal_param_t    *terminal_param,
++    const uint32_t stride);
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
+new file mode 100644
+index 000000000000..820ac6109b81
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param.sim.h
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param.sim.h
++ *
++ * Define the methods on the program group parameter object: Simulation only
++ */
++#include <ia_css_program_group_param_types.h>
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>
++
++/* Simulation */
++
++/*! Create a program group parameter object from specification
++
++ @param    specification[in]        specification (index)
++ @param    manifest[in]            program group manifest
++
++ @return NULL on error
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_create(
++    const unsigned int            specification,
++    const ia_css_program_group_manifest_t    *manifest);
++
++/*! Destroy the program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return NULL
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
++    ia_css_program_group_param_t            *param);
++
++/*! Compute the size of storage required for allocating
++ * the program group parameter object
++
++ @param    program_count[in]    Number of programs in the process group
++ @param    terminal_count[in]    Number of terminals on the process group
++ @param    fragment_count[in]    Number of fragments on the terminals of
++                the process group
++
++ @return 0 on error
++ */
++size_t ia_css_sizeof_program_group_param(
++    const uint8_t    program_count,
++    const uint8_t    terminal_count,
++    const uint16_t    fragment_count);
++
++/*! Allocate (the store of) a program group parameter object
++
++ @param    program_count[in]    Number of programs in the process group
++ @param    terminal_count[in]    Number of terminals on the process group
++ @param    fragment_count[in]    Number of fragments on the terminals of
++                the process group
++
++ @return program group parameter pointer, NULL on error
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
++    const uint8_t    program_count,
++    const uint8_t    terminal_count,
++    const uint16_t    fragment_count);
++
++/*! Free (the store of) a program group parameter object
++
++ @param    program_group_param[in]        program group parameter object
++
++ @return NULL
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_free(
++    ia_css_program_group_param_t            *param);
++
++/*! Print the program group parameter object to file/stream
++
++ @param    param[in]    program group parameter object
++ @param    fid[out]    file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_param_print(
++    const ia_css_program_group_param_t    *param,
++    void                    *fid);
++
++/*! Allocate (the store of) a program parameter object
++
++ @return program parameter pointer, NULL on error
++ */
++extern ia_css_program_param_t *ia_css_program_param_alloc(void);
++
++/*! Free (the store of) a program parameter object
++
++ @param    param[in]    program parameter object
++
++ @return NULL
++ */
++extern ia_css_program_param_t *ia_css_program_param_free(
++    ia_css_program_param_t                    *param);
++
++/*! Print the program parameter object to file/stream
++
++ @param    param[in]                    program parameter object
++ @param    fid[out]                    file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_param_print(
++    const ia_css_program_param_t    *param,
++    void                *fid);
++
++/*! Allocate (the store of) a terminal parameter object
++
++ @return terminal parameter pointer, NULL on error
++ */
++extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
++
++/*! Free (the store of) a terminal parameter object
++
++ @param    param[in]    terminal parameter object
++
++ @return NULL
++ */
++extern ia_css_terminal_param_t *ia_css_terminal_param_free(
++    ia_css_terminal_param_t                    *param);
++
++/*! Print the terminal parameter object to file/stream
++
++ @param    param[in]    terminal parameter object
++ @param    fid[out]    file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_terminal_param_print(
++    const ia_css_terminal_param_t    *param,
++    void                *fid);
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
+new file mode 100644
+index 000000000000..b03f27c97f3d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_private.h
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
++
++#include <ia_css_program_group_param.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_kernel_bitmap.h>
++#include <ia_css_program_group_data.h>
++#include <type_support.h>
++
++#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
++#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
++    (IA_CSS_KERNEL_BITMAP_BITS \
++    + (3 * IA_CSS_UINT32_T_BITS) \
++    + IA_CSS_UINT16_T_BITS \
++    + (3 * IA_CSS_UINT8_T_BITS) \
++    + (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/* tentative; co-design with ISP algorithm */
++struct ia_css_program_group_param_s {
++    /** The enable bits for each individual kernel */
++    ia_css_kernel_bitmap_t kernel_enable_bitmap;
++    /** Size of this structure */
++    uint32_t size;
++    /** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
++    uint32_t program_param_offset;
++    /** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
++    uint32_t terminal_param_offset;
++    /** Number of (explicit) fragments to use in a frame */
++    uint16_t fragment_count;
++    /** Number of active programs */
++    uint8_t program_count;
++    /** Number of active terminals */
++    uint8_t terminal_count;
++    /** Program group protocol version */
++    uint8_t protocol_version;
++    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
++};
++
++#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
++    (IA_CSS_KERNEL_BITMAP_BITS \
++    + IA_CSS_UINT32_T_BITS \
++    + IA_CSS_INT32_T_BITS)
++
++/* private */
++struct ia_css_program_param_s {
++    /** Bitmap of kernel encapsulated by this program.  If all of these kernels are
++     *  disabled, the program will be disabled too. */
++    ia_css_kernel_bitmap_t kernel_enable_bitmap;
++    /** Size of this structure */
++    uint32_t size;
++    /** Offset to add to reach parent. This is negative value.*/
++    int32_t parent_offset;
++};
++
++#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
++    (IA_CSS_UINT32_T_BITS \
++    + IA_CSS_FRAME_FORMAT_TYPE_BITS \
++    + IA_CSS_INT32_T_BITS \
++    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++    + (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++    + IA_CSS_INT32_T_BITS \
++    + IA_CSS_UINT16_T_BITS \
++    + IA_CSS_UINT8_T_BITS \
++    + (IA_CSS_UINT8_T_BITS * 1))
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
+new file mode 100644
+index 000000000000..816882cb466f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_program_group_param_types.h
+@@ -0,0 +1,66 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param_types.h
++ *
++ * Define the parameter objects that are necessary to create the process
++ * groups i.e. enable parameters and parameters to set-up frame descriptors
++ */
++
++#include <ia_css_program_group_data.h>
++#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
++#include <ia_css_terminal_defs.h>
++
++#include <type_support.h>
++/*! make this public so that driver can populate,
++ * size, bpp, dimensions for all terminals.
++ *
++ * Currently one API is provided to get frame_format_type.
++ *
++ * frame_format_type is set during ia_css_terminal_param_init().
++ * Value for that is const and binary specific.
++ */
++struct ia_css_terminal_param_s {
++    uint32_t size;    /**< Size of this structure */
++    /** Indicates if this is a generic type or inbuild
++     * with variable size descriptor
++     */
++    ia_css_frame_format_type_t frame_format_type;
++    /** offset to add to reach parent. This is negative value.*/
++    int32_t parent_offset;
++    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
++    /** Mapping to the index field of the terminal descriptor */
++    uint16_t index[IA_CSS_N_DATA_DIMENSION];
++    /** Logical fragment dimension,
++     * TODO: fragment dimensions can be different per fragment
++     */
++    uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
++    uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
++    uint16_t offset;/**< Offset in bytes to first fragment */
++    uint8_t bpp;    /**< Bits per pixel.  The number of bits with significant data. */
++    uint8_t bpe;    /**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
++};
++
++typedef struct ia_css_program_group_param_s    ia_css_program_group_param_t;
++typedef struct ia_css_program_param_s        ia_css_program_param_t;
++typedef struct ia_css_terminal_param_s        ia_css_terminal_param_t;
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
+new file mode 100644
+index 000000000000..8e5816c6fd7f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_buffer_set.h
+@@ -0,0 +1,290 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_BUFFER_SET_H
++#define __IA_CSS_PSYS_BUFFER_SET_H
++
++#include "ia_css_base_types.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_process_types.h"
++#include "ia_css_terminal_types.h"
++#include "ia_css_kernel_bitmap.h"
++#include "ia_css_rbm.h"
++
++#define N_UINT64_IN_BUFFER_SET_STRUCT        1
++#define N_UINT16_IN_BUFFER_SET_STRUCT        1
++#define N_UINT8_IN_BUFFER_SET_STRUCT        1
++#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT    1
++#define SIZE_OF_BUFFER_SET \
++    (N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
++    + IA_CSS_KERNEL_BITMAP_BITS \
++    + IA_CSS_KERNEL_BITMAP_BITS \
++    + IA_CSS_KERNEL_BITMAP_BITS \
++    + IA_CSS_RBM_BITS \
++    + VIED_VADDRESS_BITS \
++    + VIED_VADDRESS_BITS \
++    + N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
++    + N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
++
++typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
++
++struct ia_css_buffer_set_s {
++    /** Token for user context reference */
++    uint64_t token;
++    /** Enable bits for each individual kernel
++     * For integration, all 0's should be treated as uninitialized and
++     * assume all processes are enabled */
++    ia_css_kernel_bitmap_t kernel_enable_bitmap;
++    /** Enable bits for each individual terminals per call */
++    ia_css_kernel_bitmap_t terminal_enable_bitmap;
++    /** Enable bits for each individual routing per call */
++    ia_css_kernel_bitmap_t routing_enable_bitmap;
++    /** Enable bits for routing per call */
++    ia_css_rbm_t rbm;
++    /** IPU virtual address of this buffer set */
++    vied_vaddress_t ipu_virtual_address;
++    /** IPU virtual address of the process group corresponding to this buffer set */
++    vied_vaddress_t process_group_handle;
++    /** Number of terminal buffer addresses in this structure */
++    uint16_t terminal_count;
++    /** Frame id to associate with this buffer set */
++    uint8_t frame_counter;
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
++};
++
++#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT    3
++#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
++    VIED_VADDRESS_BITS \
++    + ( 1 * IA_CSS_UINT8_T_BITS) \
++    + ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
++
++typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
++struct ia_css_dynamic_terminal_descriptor_s {
++    /** Terminal buffer virtual address */
++    vied_vaddress_t virtual_buffer_address;
++    /** Per-frame compression control, boolean semantics */
++    uint8_t enable_compression;
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
++};
++
++/*! Construct a buffer set object at specified location
++
++ @param    buffer_set_mem[in]    memory location to create buffer set object
++ @param    process_group[in]    process group corresponding to this buffer set
++ @param    frame_counter[in]    frame number for this buffer set object
++
++ @return pointer to buffer set object on success, NULL on error
++ */
++ia_css_buffer_set_t *ia_css_buffer_set_create(
++    void *buffer_set_mem,
++    const ia_css_process_group_t *process_group,
++    const unsigned int frame_counter);
++
++/*! Compute size (in bytes) required for full buffer set object
++
++ @param    process_group[in]    process group corresponding to this buffer set
++
++ @return size in bytes of buffer set object on success, 0 on error
++ */
++size_t ia_css_sizeof_buffer_set(
++    const ia_css_process_group_t *process_group);
++
++/*! Set a buffer address in a buffer set object
++
++ @param    buffer_set[in]        buffer set object to set buffer in
++ @param    terminal_index[in]    terminal index to use as a reference between
++                buffer and terminal
++ @param    buffer[in]        buffer address to store
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_buffer(
++    ia_css_buffer_set_t *buffer_set,
++    const unsigned int terminal_index,
++    const vied_vaddress_t buffer);
++
++/*! Get virtual buffer address from a buffer set object and terminal object by
++   resolving the index used
++
++ @param    buffer_set[in]        buffer set object to get buffer from
++ @param    terminal[in]        terminal object to get buffer of
++
++ @return virtual buffer address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_buffer(
++    const ia_css_buffer_set_t *buffer_set,
++    const ia_css_terminal_t *terminal);
++
++/*! Set ipu virtual address of a buffer set object within the buffer set object
++
++ @param    buffer_set[in]        buffer set object to set ipu address in
++ @param    ipu_vaddress[in]    ipu virtual address of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_ipu_address(
++    ia_css_buffer_set_t *buffer_set,
++    const vied_vaddress_t ipu_vaddress);
++
++/*! Get ipu virtual address from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get ipu address from
++
++ @return virtual buffer set address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_ipu_address(
++    const ia_css_buffer_set_t *buffer_set);
++
++/*! Set kernel enable bitmap of a buffer set object within the buffer set object
++
++ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
++ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_kernel_enable_bitmap(
++    ia_css_buffer_set_t *buffer_set,
++    const ia_css_kernel_bitmap_t kernel_enable_bitmap);
++
++/*! Get kernel enable bitmap from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
++
++ @return buffer set kernel enable bitmap on success, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
++    const ia_css_buffer_set_t *buffer_set);
++
++/*! Set terminal enable bitmap of a buffer set object within the buffer set object
++
++ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
++ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_terminal_enable_bitmap(
++    ia_css_buffer_set_t *buffer_set,
++    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
++
++/*! Get terminal enable bitmap from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
++
++ @return buffer set terminal enable bitmap on success, 0 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
++    const ia_css_buffer_set_t *buffer_set);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_routing_enable_bitmap(
++    ia_css_buffer_set_t *buffer_set,
++    const ia_css_kernel_bitmap_t terminal_enable_bitmap);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
++    const ia_css_buffer_set_t *buffer_set);
++
++/*! Set Routing BitMap of a buffer set object within the buffer set object
++
++ @param    buffer_set[in]            buffer set object to set kernel enable bitmap in
++ @param    kernel_enable_bitmap[in]    kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_rbm(
++    ia_css_buffer_set_t *buffer_set,
++    const ia_css_rbm_t rbm);
++
++/*! Get Routing BitMap from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get kernel enable bitmap from
++
++ @return buffer set terminal enable bitmap on success, 0 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_buffer_set_get_rbm(
++    const ia_css_buffer_set_t *buffer_set);
++
++/*! Set process group handle in a buffer set object
++
++ @param    buffer_set[in]            buffer set object to set handle in
++ @param    process_group_handle[in]    process group handle of the buffer set
++                    object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_process_group_handle(
++    ia_css_buffer_set_t *buffer_set,
++    const vied_vaddress_t process_group_handle);
++
++/*! Get process group handle from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get handle from
++
++ @return virtual process group address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
++    const ia_css_buffer_set_t *buffer_set);
++
++/*! Set token of a buffer set object within the buffer set object
++
++ @param    buffer_set[in]        buffer set object to set ipu address in
++ @param    token[in]        token of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_token(
++    ia_css_buffer_set_t *buffer_set,
++    const uint64_t token);
++
++/*! Get token from a buffer set object
++
++ @param    buffer_set[in]        buffer set object to get token from
++
++ @return token on success, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint64_t ia_css_buffer_set_get_token(
++    const ia_css_buffer_set_t *buffer_set);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_buffer_set_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
+new file mode 100644
+index 000000000000..5721d46d2cff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_DATA_INLINE__
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
+new file mode 100644
+index 000000000000..fc2e10251601
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_data_trace.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DATA_TRACE_H
++#define __IA_CSS_PSYS_DATA_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
++     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_DATA_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_DATA_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_DATA_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_DATA_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_DATA_TRACE_METHOD \
++        PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++        PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++        PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++        PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++        PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++        PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++        PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
+new file mode 100644
+index 000000000000..4aab0d4b9916
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
+new file mode 100644
+index 000000000000..5c3323d24546
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_dynamic_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
++#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
++     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
++        PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_DYNAMIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_DYNAMIC_TRACE_METHOD \
++        PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++        PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++        PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++        PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++        PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++        PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++        PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
+new file mode 100644
+index 000000000000..2a90e8121a34
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_kernel_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
++#define __IA_CSS_PSYS_KERNEL_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
++     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
++        PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_KERNEL_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_KERNEL_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_KERNEL_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_KERNEL_TRACE_METHOD \
++        PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++        PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++        PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++        PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++        PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++        PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++        PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
+new file mode 100644
+index 000000000000..bd7bf4eec326
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_manifest_types.h
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
++#define __IA_CSS_PSYS_MANIFEST_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_psys_manifest_types.h
++ *
++ * The types belonging to the terminal/program/
++ * program group manifest static module
++ */
++
++#include <type_support.h>
++#include "vied_nci_psys_resource_model.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++/** This value is used in the manifest to indicate that the resource
++ * offset field must be ignored and the resource is relocatable
++ */
++#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
++
++#define IA_CSS_CONNECTION_BITMAP_BITS 8
++typedef uint8_t ia_css_connection_bitmap_t;
++
++#define IA_CSS_CONNECTION_TYPE_BITS 32
++
++/** Describes the tranfer method of data between terminals */
++typedef enum ia_css_connection_type {
++    /** The data buffer must be fully written to main memory by the producer
++     *  before it can be read by the consumer */
++    IA_CSS_CONNECTION_MEMORY = 0,
++    /** The data transfer is a (watermark) queued stream over main memory.
++     *  The consumer may begin reading data before the data
++     *  buffer is completely written in a controlled manner. */
++    IA_CSS_CONNECTION_MEMORY_STREAM,
++    /** The data transfer is via device ports connected such that no data
++     *  is read or written to main memory. */
++    IA_CSS_CONNECTION_STREAM,
++    IA_CSS_N_CONNECTION_TYPES
++} ia_css_connection_type_t;
++
++#define IA_CSS_PROGRAM_TYPE_BITS 8
++typedef enum ia_css_program_type {
++    IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
++    IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
++    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
++    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
++    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
++/*
++ * Future extension; A bitmap coding starts making more sense
++ *
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
++    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
++ */
++    IA_CSS_N_PROGRAM_TYPES
++} ia_css_program_type_t;
++
++#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
++typedef uint32_t ia_css_program_group_ID_t;
++#define IA_CSS_PROGRAM_ID_BITS 8
++typedef uint8_t ia_css_program_ID_t;
++
++#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
++#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
++
++typedef struct ia_css_program_group_manifest_s
++ia_css_program_group_manifest_t;
++typedef struct ia_css_program_manifest_s
++ia_css_program_manifest_t;
++typedef struct ia_css_program_manifest_ext_s
++ia_css_program_manifest_ext_t;
++typedef struct ia_css_data_terminal_manifest_s
++ia_css_data_terminal_manifest_t;
++
++/* ============ Program Control Init Terminal Manifest - START ============ */
++typedef struct ia_css_program_control_init_manifest_program_desc_s
++    ia_css_program_control_init_manifest_program_desc_t;
++
++typedef struct ia_css_program_control_init_terminal_manifest_s
++    ia_css_program_control_init_terminal_manifest_t;
++/* ============ Program Control Init Terminal Manifest - END ============ */
++
++/** @} */
++
++#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
+new file mode 100644
+index 000000000000..688ccd0ad23a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_param_trace.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
++#define __IA_CSS_PSYS_PARAM_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
++     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_PARAM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_PARAM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_PARAM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_PARAM_TRACE_METHOD \
++        PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++        PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++        PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++        PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++        PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++        PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++        PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
+new file mode 100644
+index 000000000000..743de9d9edf3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_private_pg_data.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
++#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
++
++#include "ipu_device_acb_devices.h"
++#include "ipu_device_gp_devices.h"
++#include "type_support.h"
++
++#define PRIV_CONF_INVALID    0xFF
++#define MAX_INPUT_BUFFER    (2)
++#define MAX_OUTPUT_BUFFER    (2)
++
++struct ia_css_psys_pg_buffer_information_s {
++    unsigned int link_id; /* Terminal the buffer is connected to */
++    unsigned int buffer_base_addr;
++    unsigned int bpe;
++    unsigned int buffer_width;
++    unsigned int buffer_height;
++    unsigned int num_of_buffers;
++    unsigned int dfm_port_addr;
++};
++
++typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
++
++typedef struct {
++    uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
++    uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
++} ia_css_psys_private_pg_data_acb_t;
++
++struct ia_css_psys_private_pg_data {
++    ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
++    uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
++    uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
++    ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
++    ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
++};
++
++#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
+new file mode 100644
+index 000000000000..1e2b04e6269f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.h
+@@ -0,0 +1,395 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_H
++#define __IA_CSS_PSYS_PROCESS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process.h
++ *
++ * Define the methods on the process object that are not part of
++ * a single interface
++ */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_dynamic_storage_class.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>                    /* uint8_t */
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_process.hsys.user.h>
++
++/*
++ * Internal resources
++ */
++#include <ia_css_psys_process.hsys.kernel.h>
++
++/*
++ * Process manager
++ */
++#include <ia_css_psys_process.psys.h>
++
++/*
++ * Command processor
++ */
++
++/*! Execute a command locally or send it to be processed remotely
++
++ @param    process[in]    process object
++ @param    cmd[in]        command
++
++ @return < 0 on invalid argument(s) or process state
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_cmd(
++    ia_css_process_t *process,
++    const ia_css_process_cmd_t cmd);
++
++/*! Get the internal memory offset of the process object
++
++ @param    process[in]    process object
++ @param    mem_id[in]    memory id
++
++ @return internal memory offset,
++    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
++    const ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_id);
++
++/*! Get the external memory offset of the process object
++
++ @param    process[in]    process object
++ @param    mem_id[in]    memory id
++
++ @return external memory offset,
++    IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
++    const ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type_id);
++
++/*! Get the stored size of the process object
++
++ @param    process[in]    process object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_process_get_size(const ia_css_process_t *process);
++
++/*! Get the (pointer to) the process group parent of the process object
++
++ @param    process[in]    process object
++
++ @return the pointer to the parent, NULL on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_t *ia_css_process_get_parent(
++    const ia_css_process_t *process);
++
++/*! Set the (pointer to) the process group parent of the process object
++
++ @param    process[in]    process object
++ @param    parent[in]    (pointer to the) process group parent object
++
++ @return < 0 on invalid argument(s)
++ */
++extern int ia_css_process_set_parent(
++    ia_css_process_t *process,
++    ia_css_process_group_t *parent);
++
++/*! Get the unique ID of program used by the process object
++
++ @param    process[in]    process object
++
++ @return ID, 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_ID_t ia_css_process_get_program_ID(
++    const ia_css_process_t *process);
++
++/*! Get the state of the process object
++
++ @param    process[in]    process object
++
++ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_state_t ia_css_process_get_state(
++    const ia_css_process_t *process);
++
++/*! Set the state of the process object
++
++ @param    process[in]    process object
++ @param    state[in]    state of the process
++
++ @return < 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_set_state(
++    ia_css_process_t *process,
++    ia_css_process_state_t state);
++
++/*! Get the assigned cell of the the process object
++
++ @param    process[in]    process object
++
++ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_cell_ID_t ia_css_process_get_cell(
++    const ia_css_process_t *process);
++
++/*! Get the number of cells the process object depends on
++
++ @param    process[in]    process object
++
++ @return number of cells
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_cell_dependency_count(
++    const ia_css_process_t *process);
++
++/*! Get the number of terminals the process object depends on
++
++ @param    process[in]    process object
++
++ @return number of terminals
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_terminal_dependency_count(
++    const ia_css_process_t *process);
++
++/*! Set n-th cell dependency of a process object
++
++ @param    process[in]    Process object
++ @param    dep_index[in]    dep index
++ @param    id[in]        dep id
++
++ @return < 0 on invalid process argument
++ */
++extern int ia_css_process_set_cell_dependency(
++    const ia_css_process_t *process,
++    const unsigned int dep_index,
++    const vied_nci_resource_id_t id);
++
++/*! Get n-th cell dependency of a process object
++
++ @param    process[in]    Process object
++ @param    cell_num[in]    n-th cell
++
++ @return n-th cell dependency,
++    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_id_t ia_css_process_get_cell_dependency(
++    const ia_css_process_t *process,
++    const unsigned int cell_num);
++
++/*! Set n-th terminal dependency of a process object
++
++ @param    process[in]    Process object
++ @param    dep_index[in]    dep index
++ @param    id[in]        dep id
++
++ @return < 0 on on invalid argument(s)
++ */
++extern int ia_css_process_set_terminal_dependency(
++    const ia_css_process_t *process,
++    const unsigned int dep_index,
++    const vied_nci_resource_id_t id);
++
++/*! Get n-th terminal dependency of a process object
++
++ @param    process[in]        Process object
++ @param    terminal_num[in]    n-th cell
++
++ @return n-th terminal dependency,
++    IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_terminal_dependency(
++    const ia_css_process_t *process,
++    const unsigned int terminal_num);
++
++#if HAS_DFM
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
++    ia_css_process_t *process);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
++    ia_css_process_t *process);
++#endif
++
++/*! Get the cells bitmap of the the process object
++
++ @param    process[in]    process object
++
++ @return process cells bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
++    const ia_css_process_t *process);
++
++/*! Sets the dfm device resource allocation bitmap of
++ * the process object
++
++ @param    process[in]    process object
++ @param    dfm_dev_id[in]    dfm device id
++ @param bitmap[in]    resource bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dfm_port_bitmap(
++    ia_css_process_t *process,
++    const vied_nci_dev_dfm_id_t dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap);
++
++/*! Sets the active dfm ports bitmap of
++ * the process object
++
++ @param    process[in]    process object
++ @param    dfm_dev_id[in]    dfm device id
++ @param bitmap[in]    active ports bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dfm_active_port_bitmap(
++    ia_css_process_t *process,
++    const vied_nci_dev_dfm_id_t dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap);
++
++#if HAS_DFM
++/*! Get the dfm port bitmap of the the process object
++
++ @param    process[in]    process object
++ @param    dfm_res_id    dfm resource id
++
++ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
++    const ia_css_process_t *process,
++    vied_nci_dev_dfm_id_t  dfm_res_id);
++#endif
++/*! Get the dfm active port bitmap of the the process object
++
++ @param    process[in]    process object
++ @param    dfm_res_id[in]    dfm resource id
++
++ @return bitmap of all active DFM ports used by the process, corresponding to the input
++ dfm resource id
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
++    const ia_css_process_t *process,
++    vied_nci_dev_dfm_id_t  dfm_res_id);
++
++/*! Sets the cells bitmap of
++ * the process object
++
++ @param    process[in]    process object
++ @param bitmap[in]    bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_cells_bitmap(
++    ia_css_process_t *process,
++    const vied_nci_resource_bitmap_t bitmap);
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++/*! Get the device channel id-n resource allocation offset of the process object
++
++ @param    process[in]    process object
++ @param    dev_chn_id[in]    channel id
++
++ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_dev_chn(
++    const ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id);
++#endif
++/*! Get the ext mem type-n resource id of the the process object
++
++ @param    process[in]    process object
++ @param    mem_type[in]    mem type
++
++ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
++    const ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type);
++
++/*! Sets the device channel id-n resource allocation offset of
++ * the process object
++
++ @param    process[in]    process object
++ @param    dev_chn_id[in]    channel id
++ @param offset[in]    resource offset
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dev_chn(
++    ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id,
++    const vied_nci_resource_size_t offset);
++
++/*! Boolean test if the process object type is valid
++
++ @param    process[in]    process object
++ @param    p_manifest[in]    program manifest
++
++ @return true if the process object is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_process_valid(
++    const ia_css_process_t *process,
++    const ia_css_program_manifest_t *p_manifest);
++
++/*! Gets the program_idx from the process object
++
++ @param    process[in] process object
++
++ @return program index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_get_program_idx(
++    const ia_css_process_t *process);
++
++/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
++ * @param process[in] process object
++ * @return process entension, NULL if there is none.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_ext_t *ia_css_process_get_extension(
++    const ia_css_process_t *process);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROCESS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
+new file mode 100644
+index 000000000000..2ef42d15aef7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.kernel.h
+@@ -0,0 +1,159 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
++
++/**
++ * @file ia_css_psys_process.hsys.kernel.h
++ *
++ * Define the methods on the process object: Hsys kernel interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++#include <vied_nci_psys_system_global.h>
++
++/*
++ * Internal resources
++ */
++
++/*!
++ * @brief Clear all resource (offset) specifications
++ *
++ * @param[in]    process                process object
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_all(ia_css_process_t *process);
++
++/*!
++ * @brief Set the cell ID resource specification
++ *
++ * @param[in]    process                process object
++ * @param[in]    cell_id                cell ID
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_cell(
++    ia_css_process_t                    *process,
++    const vied_nci_cell_ID_t                cell_id);
++
++/*!
++ * @brief Clear cell ID resource specification
++ *
++ * @param[in]    process                process object
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_cell(ia_css_process_t *process);
++
++/*!
++ * @brief Set the memory resource (offset) specification for a memory
++ * that belongs to the cell that is assigned to the process.
++ *
++ * @param[in]    process                process object
++ * @param[in]    mem_type_id            mem type ID
++ * @param[in]    offset                offset
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_int_mem(
++    ia_css_process_t        *process,
++    const    vied_nci_mem_type_ID_t    mem_type_id,
++    const vied_nci_resource_size_t    offset);
++
++/*!
++ * @brief Clear the memory resource (offset) specification for a memory
++ * type that belongs to the cell that is assigned to the process.
++ *
++ * @param[in]    process                process object
++ * @param[in]    mem_id                mem ID
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_int_mem(
++    ia_css_process_t        *process,
++    const vied_nci_mem_type_ID_t    mem_type_id);
++
++/*!
++ * @brief Set the memory resource (offset) specification for a memory
++ * that does not belong to the cell that is assigned to the process.
++ *
++ * @param[in]    process                process object
++ * @param[in]    mem_type_id                mem type ID
++ * @param[in]    offset                offset
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_ext_mem(
++    ia_css_process_t        *process,
++    const vied_nci_mem_ID_t        mem_id,
++    const vied_nci_resource_size_t    offset);
++
++/*!
++ * @brief Clear the memory resource (offset) specification for a memory
++ * type that does not belong to the cell that is assigned to the process.
++ *
++ * @param[in]    process                process object
++ * @param[in]    mem_id                mem ID
++ *
++ * Precondition: The cell ID must be set
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_ext_mem(
++    ia_css_process_t        *process,
++    const vied_nci_mem_type_ID_t    mem_type_id);
++
++/*!
++ * @brief Set a device channel resource (offset) specification.
++ *
++ * @param[in]    process                process object
++ * @param[in]    dev_chn_id            device channel ID
++ * @param[in]    offset                offset
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_dev_chn(
++    ia_css_process_t        *process,
++    const vied_nci_dev_chn_ID_t    dev_chn_id,
++    const vied_nci_resource_size_t    offset);
++
++/*!
++ * @brief Clear a device channel resource (offset) specification
++ *
++ * @param[in]    process                process object
++ * @param[in]    dev_chn_id            device channel ID
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_dev_chn(
++    ia_css_process_t        *process,
++    const vied_nci_dev_chn_ID_t    dev_chn_id);
++
++#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
+new file mode 100644
+index 000000000000..8c45d7735ea2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.hsys.user.h
+@@ -0,0 +1,94 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
++#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
++
++/**
++ *  @file ia_css_psys_process.hsys.user.h
++ *
++ *  Define the methods on the process object: Hsys user interface
++ */
++
++#include <ia_css_program_group_param.h>        /* ia_css_program_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>                    /* uint8_t */
++
++/*
++ * Creation
++ */
++
++/*!
++ * @brief Compute the size of storage required for allocating the process object.
++ *
++ * @param [in]    manifest            program manifest
++ * @param [in]    param                program parameters
++ *
++ * @return 0 on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern size_t ia_css_sizeof_process(
++    const ia_css_program_manifest_t            *manifest,
++    const ia_css_program_param_t            *param);
++
++/*!
++ * @brief Create the process object
++ *
++ * @param [in]    raw_mem                pre allocated memory
++ * @param [in]    manifest            program manifest
++ * @param [in]    param                program parameters
++ *
++ * @return NULL on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern ia_css_process_t *ia_css_process_create(
++    void                *raw_mem,
++    const ia_css_program_manifest_t    *manifest,
++    const ia_css_program_param_t    *param,
++    const uint32_t            program_idx);
++
++/*!
++ * @brief Destroy (the storage of) the process object
++ *
++ * @param [in]    process                process object
++ *
++ * @return NULL
++ * @ingroup group_psysapi_process_host_user
++ */
++extern ia_css_process_t *ia_css_process_destroy(
++    ia_css_process_t    *process);
++
++/*
++ * Access functions
++ */
++
++/*!
++ * @brief Print the process object to file/stream
++ *
++ * @param [in]    process                process object
++ * @param [out]    fid                file/stream handle
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern int ia_css_process_print(
++    const ia_css_process_t    *process,
++    void            *fid);
++
++#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
+new file mode 100644
+index 000000000000..a208fdff1d61
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process.psys.h
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
++#define __IA_CSS_PSYS_PROCESS_PSYS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process.psys.h
++ *
++ * Define the methods on the process object: Psys embedded interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++/*
++ * Process manager
++ */
++
++/*! Acquire the resources specificed in process object
++
++ @param    process[in]                process object
++
++ Postcondition: This is a try process if any of the
++ resources is not available, all succesfully acquired
++ ones will be release and the function will return an
++ error
++
++ @return < 0 on error
++ */
++extern int ia_css_process_acquire(ia_css_process_t *process);
++
++/*! Release the resources specificed in process object
++
++ @param    process[in]                process object
++
++ @return < 0 on error
++ */
++extern int ia_css_process_release(ia_css_process_t *process);
++
++#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
+new file mode 100644
+index 000000000000..6bcea8925adf
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.h
+@@ -0,0 +1,487 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.h
++ *
++ * Define the methods on the process object that are not part of
++ * a single interface
++ */
++#include "ia_css_rbm.h"
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_dynamic_storage_class.h>
++
++#include <type_support.h>                    /* uint8_t */
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_process_group.hsys.user.h>
++
++/*
++ * Registration of user contexts / callback info
++ * External resources
++ * Sequencing resources
++ */
++#include <ia_css_psys_process_group.hsys.kernel.h>
++
++/*
++ * Dispatcher
++ */
++#include <ia_css_psys_process_group.psys.h>
++
++/*
++ * Access to sub-structure handles / fields
++ */
++
++#include "ia_css_terminal.h"
++
++#include "ia_css_terminal_manifest_base_types.h"
++#include "ia_css_terminal_manifest_types.h"
++
++/*! Get the number of fragments on the process group
++
++ @param    process_group[in]        process group object
++
++ Note: Future change is to have a fragment count per
++ independent subgraph
++
++ @return the fragment count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_process_group_get_fragment_count(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the fragment state on the process group
++
++ @param     process_group[in]        process group object
++ @param     fragment_state[in]        current fragment of processing
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_get_fragment_state(
++    const ia_css_process_group_t        *process_group,
++    uint16_t                *fragment_state);
++
++/*! Set the fragment state on the process group
++
++ @param    process_group[in]        process group object
++ @param    fragment_state[in]        current fragment of processing
++
++ @return -1 on error
++  */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_fragment_state(
++    ia_css_process_group_t            *process_group,
++    uint16_t                fragment_state);
++
++/*! Get the number of processes on the process group
++
++ @param    process_group[in]        process group object
++
++ @return the process count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_process_count(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the number of terminals on the process group
++
++ @param    process_group[in]        process group object
++
++ Note: Future change is to have a terminal count per
++ independent subgraph
++
++ @return the terminal count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_terminal_count(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the PSYS server init time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PSYS server init time, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_psys_server_init_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! \deprecated this is old and will get removed */
++/*! Get the PG load start timestamp
++
++ @param    process_group[in]        process group object
++
++ @return PG load start timestamp, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_load_start_ts(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the PG load time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PG load time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_load_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the PG init time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PG init time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_init_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the PG processing time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_processing_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the PG next frame init time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the PG complete time in cycles
++
++ @param    process_group[in]        process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_complete_cycles(
++    const ia_css_process_group_t            *process_group);
++
++/*! Get the (pointer to) the <terminal type> terminal of the process group object
++
++ @param    process_group[in]               process group object
++ @param    terminal_type[in]               terminal type of terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
++        const ia_css_process_group_t *process_group,
++        const ia_css_terminal_type_t terminal_type);
++
++/*! Get the (pointer to) the <terminal type> terminal of the process group object
++ * for terminals which have only a single instance
++ * (cached in, cached out, program, program_ctrl_init)
++
++ @param    process_group[in]               process group object
++ @param    terminal_type[in]               terminal type of terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
++    const ia_css_process_group_t     *process_group,
++    ia_css_terminal_type_t        term_type);
++
++/*! Get the (pointer to) the manifest indexed terminal of the process group object
++
++ @param    process_group[in]        process group object
++ @param    manifest_idx[in]        index of the terminal in manifest
++
++ @return the pointer to the terminal, NULL on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
++    const ia_css_process_group_t *process_grp,
++    const unsigned int manifest_idx);
++
++/*! Get the (pointer to) the indexed terminal of the process group object
++
++ @param    process_group[in]        process group object
++ @param    terminal_index[in]        index of the terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_terminal(
++    const ia_css_process_group_t        *process_group,
++    const unsigned int            terminal_index);
++
++/*! Get the (pointer to) the indexed process of the process group object
++
++ @param    process_group[in]        process group object
++ @param    process_index[in]        index of the process
++
++ @return the pointer to the process, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_t *ia_css_process_group_get_process(
++    const ia_css_process_group_t        *process_group,
++    const unsigned int            process_index);
++
++/*! Get the stored size of the process group object
++
++ @param    process_group[in]                process group object
++
++ @return size, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_process_group_get_size(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the state of the the process group object
++
++ @param    process_group[in]        process group object
++
++ @return state, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_state_t ia_css_process_group_get_state(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the unique ID of program group used by the process group object
++
++ @param    process_group[in]        process group object
++
++ @return ID, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
++    const ia_css_process_group_t        *process_group);
++
++/*! Get the resource bitmap of the process group
++
++ @param    process_group[in]        process group object
++
++ @return the reource bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
++    const ia_css_process_group_t        *process_group);
++
++/*! Set the resource bitmap of the process group
++
++ @param    process_group[in]        process group object
++ @param    resource_bitmap[in]        the resource bitmap
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_resource_bitmap(
++    ia_css_process_group_t            *process_group,
++    const vied_nci_resource_bitmap_t    resource_bitmap);
++
++/*! Get the kernel bitmap of the the process group object
++
++ @param    process_group[in] process group object
++
++ @return process group kernel bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
++    const ia_css_process_group_t *process_group);
++
++/*! Get the routing bitmap of the process group
++
++ @param    process_group[in]   process group object
++
++ @return routing bitmap (pointer)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
++    const ia_css_process_group_t *process_group);
++
++/*! Set the routing bitmap of the process group
++
++ @param    process_group[in]   process group object
++ @param    rbm[in]                routing bitmap
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_routing_bitmap(
++    ia_css_process_group_t *process_group,
++    const ia_css_rbm_t rbm);
++
++/*! Get IPU virtual address of process group
++
++ @param     process_group[in]        process group object
++ @param     ipu_vaddress[in/out]    process group ipu virtual address
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_get_ipu_vaddress(
++    const ia_css_process_group_t        *process_group,
++    vied_vaddress_t            *ipu_vaddress);
++
++/*! Set IPU virtual address of process group
++
++ @param    process_group[in]        process group object
++ @param    ipu_vaddress[in]        process group ipu address
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_ipu_vaddress(
++    ia_css_process_group_t            *process_group,
++    vied_vaddress_t            ipu_vaddress);
++
++/*! Get protocol version used by a process group
++
++ @param    process_group[in]        process group object
++
++ @return invalid protocol version on error
++
++ @todo Add new protocol version for IPU7.  Defer this for now,
++ because it will create a LOT of disruption.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_protocol_version(
++    const ia_css_process_group_t *process_group);
++
++/*! Get base queue id used by a process group
++
++ @param    process_group[in]        process group object
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_base_queue_id(
++    ia_css_process_group_t *process_group);
++
++/*! Set base queue id used by a process group
++
++ @param    process_group[in]        process group object
++ @param    queue_id[in]            process group queue id
++
++ @return invalid queue id on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_base_queue_id(
++    ia_css_process_group_t *process_group,
++    uint8_t queue_id);
++
++/*! Get number of queues used by a process group
++
++ @param    process_group[in]        process group object
++
++ @return invalid number of queues (0) on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_num_queues(
++    ia_css_process_group_t *process_group);
++
++/*! Set number of queues used by a process group
++
++ @param    process_group[in]        process group object
++ @param    num_queues[in]            process group number of queues
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_num_queues(
++    ia_css_process_group_t *process_group,
++    uint8_t num_queues);
++
++/*! Set error handling enable flag used by process group
++
++ @param    process_group[in]        process group object
++ @param    error_handling_enable[in]    flag to control error handling
++
++ @return -1 on error, 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_error_handling_enable(
++    ia_css_process_group_t *process_group,
++    const bool error_handling_enable);
++
++/*! Get the error handling enable flag associated to the process group
++
++ @param    process_group[in]        process group object
++
++ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_error_handling_enable(
++    const ia_css_process_group_t *process_group);
++
++/** Return true if the process group requires vector processor (i.e. DSP)
++ *  resources  */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
++
++/*! Check if terminal is enabled based on kernel enable bitmap
++
++ @param    terminal_manifest[in]        terminal manifest object
++ @param    enable_bitmap[in]        kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_terminal_enabled(
++    const ia_css_terminal_manifest_t *terminal_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Check if data terminal is enabled based on kernel enable bitmap
++
++ @param    data_term_manifest[in]        data terminal manifest object
++ @param    enable_bitmap[in]        kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_data_terminal_enabled(
++    const ia_css_data_terminal_manifest_t    *data_term_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Check if spatial terminal is enabled based on kernel enable bitmap
++
++ @param    spatial_term_man[in]    spatial    terminal manifest object
++ @param    enable_bitmap[in]        kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_spatial_terminal_enabled(
++    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
++    ia_css_kernel_bitmap_t enable_bitmap);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_group_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
+new file mode 100644
+index 000000000000..3c43d58580e5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.kernel.h
+@@ -0,0 +1,379 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.hsys.kernel.h
++ *
++ * Define the methods on the process group object: Hsys kernel interface
++ *
++ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
++ *  defines the functions required to manage the lifetime of a process group.
++ *
++ * Sequence for settup up and queueing processing tasks with a persistent program group
++ * to IPU is:
++ *
++ * # Get Program Group manifest by ID
++ * # Create process group object based on that program group manifest
++ * # Configure process group
++ * ## Set kernel and terminal enables
++ * ## Set terminal attributes
++ * # Submit processs group
++ * # Start process group
++ * # Disown process group
++ * # Frame/Fragment processing loop
++ * ## Enqueue buffer sets - This sends the terminal buffers to FW
++ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
++ * process group will process any available buffer sets until suspended or stopped, pending
++ * available resources.
++ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
++ * processing of one group, which allows another PG to run with the same resources. Buffer
++ * sets for the suspended PG may continue to be queued, but will not be processed until
++ * the PG is resumed.  The decision when to suspend/resume is scheduling.
++ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
++ *
++ */
++
++#include <ia_css_psys_process_types.h>
++
++#include <ia_css_psys_buffer_set.h>
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>                    /* uint8_t */
++
++/*
++ * Registration of user contexts / callback info
++ */
++
++/*! Get the user (callback) token as registered in the process group
++
++ @param    process_group[in]        process group object
++
++ @return 0 on error
++ */
++extern uint64_t ia_css_process_group_get_token(
++    ia_css_process_group_t                    *process_group);
++
++/*! Set (register) a user (callback) token in the process group
++
++ The token value shall be non-zero. This token is
++ returned in each return message related to the process
++ group the token is registered with.
++
++ @param    process_group[in]        process group object
++ @param    token[in]                user token
++ @return < 0 on error
++ */
++extern int ia_css_process_group_set_token(
++    ia_css_process_group_t                    *process_group,
++    const uint64_t                            token);
++
++/*
++ * Passing of a (fragment) watermark
++ */
++
++/*! Get the fragment progress limit of the process group
++
++ @see ia_css_process_group_set_fragment_limit()
++
++ @param    process_group[in]        process group object
++
++ @return 0 on error
++
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_process_group_get_fragment_limit(
++    const ia_css_process_group_t                *process_group);
++
++/*! Set the new fragment progress limit of the process group
++
++ @param    process_group[in]        process group object
++ @param    fragment_limit[in]        New limit value
++
++ @note The limit value must be less or equal to the fragment
++ count value. The process group will not make progress beyond
++ the limit value. The limit value can be modified asynchronously
++ If the limit value is reached before an update happens, the
++ process group will suspend and will not automatically resume.
++
++ The limit is monotonically increasing. The default value is
++ equal to the fragment count
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_fragment_limit(
++    ia_css_process_group_t                *process_group,
++    const uint16_t                    fragment_limit);
++
++/*! Clear the fragment progress limit of the process group
++
++ @see ia_css_process_group_set_fragment_limit()
++
++ @param    process_group[in]        process group object
++
++ @note This function sets the fragment limit to zero.
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_clear_fragment_limit(
++    ia_css_process_group_t                    *process_group);
++
++/*
++ * Commands
++ */
++
++/*! Perform the start command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Start is an action of the l-Scheduler it makes the
++ process group eligible for execution.
++ For PPG's, execution will not occur until the resume
++ command is issued.  See ia_css_process_group_resume()
++
++ @par For persistent program/process groups () the start
++ command must be called once per stream instance,
++ at stream creation.
++
++ @par Precondition: The external resources that are attached to
++ the process group must be in the correct state, i.e. input
++ buffers are not-empty and output buffers not-full
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_start(
++    ia_css_process_group_t                    *process_group);
++
++/*! Perform the suspend command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Suspend indicates that the process group execution
++ is halted at the next fragment boundary. The process group
++ will not automatically resume
++
++ @par Precondition: The process group must be running
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_suspend(
++    ia_css_process_group_t                    *process_group);
++
++/*! Perform the resume command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Resume indicates that the process group is again
++ eligible for execution
++
++ @par Precondition: The process group must be started
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_resume(
++    ia_css_process_group_t                    *process_group);
++
++/*! Perform the reset command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Return the process group to the started state
++
++ @par Precondition: The process group must be running or stopped
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_reset(
++    ia_css_process_group_t                    *process_group);
++
++/*! Perform the abort command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Force the process group to the stopped state
++
++ @par Precondition: The process group must be running or started
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_abort(
++    ia_css_process_group_t                    *process_group);
++
++/*! Release ownership of the process group
++
++  For PPG's, this is the last step required before buffer
++  sets can be enqueued.
++
++ @param    process_group[in]        process group object
++
++ @note Release notifies PSYS and hands over ownership of the
++ process group from SW to FW.
++
++ @par Precondition: The process group must be in the started state
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_disown(
++    ia_css_process_group_t                    *process_group);
++
++/*
++ * External resources
++ */
++
++/*! Set (register) a data buffer to the indexed terminal in the process group
++
++ @param    process_group[in]        process group object
++ @param    buffer[in]            buffer handle
++ @param    buffer_state[in]        state of the buffer
++ @param    terminal_index[in]        index of the terminal
++
++ @note For legacy program groups (== non-PPG), the buffer handle
++ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
++
++ @par For PPG's, buffer is ignored as the buffers will be sent
++ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
++ called before ia_css_process_group_submit() as sets up some internal bookeeping.
++
++ @note The buffer can be in memory or streaming over memory
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_attach_buffer(
++    ia_css_process_group_t            *process_group,
++    vied_vaddress_t                buffer,
++    const ia_css_buffer_state_t        buffer_state,
++    const unsigned int            terminal_index);
++
++/*! Get (unregister) the data buffer on the indexed terminal of
++ * the process group
++
++ @param    process_group[in]        process group object
++ @param    terminal_index[in]        index of the terminal
++
++ @note Precondition: The process group must be stopped
++
++ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
++ state to BUFFER_NULL
++
++ @par This function is meaningless for PPG's
++
++ @return VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_process_group_detach_buffer(
++    ia_css_process_group_t            *process_group,
++    const unsigned int            terminal_index);
++
++/*! Set (register) a data buffer to the indexed terminal in the process group
++
++ @param    process_group[in]        process group object
++ @param    stream[in]                stream handle
++ @param    buffer_state[in]        state of the buffer
++ @param    terminal_index[in]        index of the terminal
++
++ @note The stream handle shall not be zero, the buffer
++ state can be undefined; BUFFER_UNDEFINED
++
++ @note The stream is used exclusive to a buffer; the latter can be in memory
++ or streaming over memory
++
++ @todo Unclear what this function is for.  Clarify!
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_attach_stream(
++    ia_css_process_group_t            *process_group,
++    uint32_t                stream,
++    const ia_css_buffer_state_t        buffer_state,
++    const unsigned int            terminal_index);
++
++/*! Get (unregister) the stream handle on the indexed terminal of
++ * the process group
++
++ @param    process_group[in]        process group object
++ @param    terminal_index[in]        index of the terminal
++
++ @par Precondition: The process group must be stopped
++
++ @par Postcondition: The stream handle shall be reset to zero, the buffer
++ state to BUFFER_NULL
++
++ @todo Unclear what this function is for.  Clarify!
++
++ @return 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_detach_stream(
++    ia_css_process_group_t            *process_group,
++    const unsigned int            terminal_index);
++
++/*
++ * Sequencing resources
++ */
++
++/*! Set (an artificial) blocking resource (barrier) in
++ * the process group resource map
++
++ @param    process_group[in]        process group object
++ @param    barrier_index[in]        index of the barrier
++
++ @note The barriers have to be set to force sequence between started
++ process groups
++
++ @return < 0 on error
++
++ @todo Seems this function no longer has any use.  Clarify!
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_barrier(
++    ia_css_process_group_t                    *process_group,
++    const vied_nci_barrier_ID_t                barrier_index);
++
++/*! Clear a previously set blocking resource (barrier) in
++ * the process group resource map
++
++ @param    process_group[in]        process group object
++ @param    barrier_index[in]        index of the barrier
++
++ @par Precondition: The barriers must have been set
++
++ @return < 0 on error
++
++ @todo Seems this function no longer has any use.  Clarify!
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_clear_barrier(
++    ia_css_process_group_t                    *process_group,
++    const vied_nci_barrier_ID_t                barrier_index);
++
++/*! Boolean test if the process group preconditions for start are satisfied
++
++ @param    process_group[in]        process group object
++
++ @return true if the process group can be started
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_process_group_start(
++    const ia_css_process_group_t            *process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
+new file mode 100644
+index 000000000000..e166c5b4e283
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.hsys.user.h
+@@ -0,0 +1,224 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.hsys.user.h
++ *
++ * Define the methods on the process group object: Hsys user interface
++ *
++ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
++ *  defines the functions required to manage the lifetime of a process group.
++ */
++
++#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_buffer_set.h>
++
++#include "ia_css_psys_dynamic_storage_class.h"
++
++#include <type_support.h>                    /* uint8_t */
++
++/*
++ * Creation
++ */
++
++/*! Compute the size of storage required for allocating the process group object
++
++ @param    manifest[in]            program group manifest
++ @param    param[in]            program group parameters
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_process_group(
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t    *param);
++
++/*! Checks whether a certain program is enabled.
++ *   FUNCTION IS PRIVATE TO THIS MODULE
++
++ @param    program_manifest[in] program manifest
++ @param    enable_bitmap[in]   kernel enable bitmap corresponding to process group
++
++ @return true if program is enabled (and process will be instantiated)
++ */
++extern bool ia_css_process_group_is_program_enabled(
++    const ia_css_program_manifest_t *program_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Create (the storage for) the process group object
++
++ @param    process_grp_mem[in/out]    raw memory for process group
++ @param    manifest[in]            program group manifest
++ @param    param[in]            program group parameters
++
++ @return NULL on error
++ */
++extern ia_css_process_group_t *ia_css_process_group_create(
++    void                    *process_grp_mem,
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t    *param);
++
++/*! Destroy (the storage of) the process group object
++
++ @param    process_group[in]        process group object
++
++ @return NULL
++ */
++extern ia_css_process_group_t *ia_css_process_group_destroy(
++    ia_css_process_group_t                    *process_group);
++
++/*! Print the process group object to file/stream in
++  textual format
++
++ @param    process_group[in]        process group object
++ @param    fid[out]                file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_print(
++    const ia_css_process_group_t        *process_group,
++    void                    *fid);
++
++/*
++ * Commands
++ */
++
++/*! Perform the submit command on the process group
++
++ @param    process_group[in]        process group object
++
++ @note Submit is an action of the h-Scheduler it makes the
++ process group eligible for the l-Scheduler
++
++ @par Precondition : The external resources must be attached to
++ the process group
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_submit(
++    ia_css_process_group_t                    *process_group);
++
++/*! Boolean test if the process group object type is valid
++
++ @param    process_group[in]        process group object
++ @param    manifest[in]            program group manifest
++ @param    param[in]                program group parameters
++
++ @return true if the process group is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_process_group_valid(
++    const ia_css_process_group_t        *process_group,
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t    *param);
++
++/*! Boolean test if the process group preconditions for submit are satisfied
++
++ @param    process_group[in]        process group object
++
++ @return true if the process group can be submitted
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_process_group_submit(
++    const ia_css_process_group_t            *process_group);
++
++/*! Boolean test if the preconditions on process group and buffer set are
++    satisfied for enqueuing buffer set
++
++ @param    process_group[in]        process group object
++ @param    buffer_set[in]            buffer set object
++
++ @return true if the buffer set can be enqueued
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_enqueue_buffer_set(
++    const ia_css_process_group_t            *process_group,
++    const ia_css_buffer_set_t            *buffer_set);
++
++/*! Compute the cyclecount required for executing the process group object
++
++ @param    manifest[in]            program group manifest
++ @param    param[in]                program group parameters
++
++ @return 0 on error
++
++ @note Current implementation is trivial
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_compute_cycle_count(
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t    *param);
++
++/*! Compute the number of processes required for
++ * executing the process group object
++
++ @param    manifest[in]            program group manifest
++ @param    param[in]                program group parameters
++
++ @return 0 on error
++ */
++extern uint8_t ia_css_process_group_compute_process_count(
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t        *param);
++
++/*! Compute the number of terminals required for
++ * executing the process group object
++
++ @param    manifest[in]            program group manifest
++ @param    param[in]                program group parameters
++
++ @return 0 on error
++ */
++extern uint8_t ia_css_process_group_compute_terminal_count(
++    const ia_css_program_group_manifest_t    *manifest,
++    const ia_css_program_group_param_t        *param);
++
++/*! Get private token as registered in the process group by the implementation
++
++ @note The token value shall be non-zero. This token is private
++ to the implementation. This is in addition to the user token.
++ See ia_css_process_group_set_token()
++
++ @param    process_group[in]        process group object
++
++ @return 0 on error
++ */
++extern uint64_t ia_css_process_group_get_private_token(
++    ia_css_process_group_t                    *process_group);
++
++/*! Set private token in the process group as needed by the implementation
++
++ @param    process_group[in]        process group object
++ @param    token[in]                user token
++
++ @note The token value shall be non-zero. This token is private
++ to the implementation. This is in addition to the user token.
++ see ia_css_process_group_get_token()
++
++ @return < 0 on error, 0 on success
++ */
++extern int ia_css_process_group_set_private_token(
++    ia_css_process_group_t                    *process_group,
++    const uint64_t                            token);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
+new file mode 100644
+index 000000000000..49c04df55d7d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group.psys.h
+@@ -0,0 +1,61 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.psys.h
++ *
++ * Define the methods on the process group object: Psys embedded interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++/*
++ * Dispatcher
++ */
++
++/*! Perform the run command on the process group
++
++ @param    process_group[in]        process group object
++
++ Note: Run indicates that the process group will execute
++
++ Precondition: The process group must be started or
++ suspended and the processes have acquired the necessary
++ internal resources
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_run(
++    ia_css_process_group_t                    *process_group);
++
++/*! Perform the stop command on the process group
++
++ @param    process_group[in]        process group object
++
++ Note: Stop indicates that the process group has completed execution
++
++ Postcondition: The external resoruces can now be detached
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_stop(
++    ia_css_process_group_t                    *process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
+new file mode 100644
+index 000000000000..de0b78f71aeb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_cmd_impl.h
+@@ -0,0 +1,280 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
++
++#include "type_support.h"
++#include "ia_css_psys_process_group.h"
++#include "ia_css_rbm_manifest_types.h"
++
++#define N_UINT64_IN_PROCESS_GROUP_STRUCT    2
++#define N_UINT32_IN_PROCESS_GROUP_STRUCT    8
++#define N_UINT16_IN_PROCESS_GROUP_STRUCT    5
++#define N_UINT8_IN_PROCESS_GROUP_STRUCT        8
++#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT    2
++
++#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
++    (IA_CSS_RBM_BITS \
++    + IA_CSS_KERNEL_BITMAP_BITS \
++    + N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
++    + N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
++    + IA_CSS_PROGRAM_GROUP_ID_BITS \
++    + IA_CSS_PROCESS_GROUP_STATE_BITS \
++    + VIED_VADDRESS_BITS \
++    + VIED_NCI_RESOURCE_BITMAP_BITS \
++    + N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
++    + N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/** Process group object describing an instance of a Program Group
++ *
++ *  This is the root structure passed in a number of PG commands via
++ *  the syscom queuing interface to firmware from the host.  A pointer
++ *  to this structure in main memroy is passed in the following
++ *  PG commands: start, resume, suspend, stop, abort.
++ *
++ *  A process group is created based on a program group specification
++ *  described in the program group manifest.  Briefly, a program group
++ *  contains programs which in turn contain kernels.  A program group
++ *  also has terminals, which connect it to the outside world.  Each
++ *  terminal represents either parameters or image data flowing in or
++ *  out of the group.  Terminals come in different types and may have
++ *  addtional attributes.  For example, a data termainal will have
++ *  a frame format attribute.
++ *  @see ia_css_process_group_create()
++ *  @see ia_css_program_group_manifest_t and related API and:
++ *  @see ia_css_pkg_dir_entry_get_type() and
++ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
++ *  ia_css_pkg_dir* functions) for how to get the program group manifest
++ *  array from the binary release package.
++ *
++ *  @note Some of the fields within are used internally within the
++ *  firmware only, after the firmware copies the process group structure
++ *  to its internel cache.  The original in main memory is not updated.
++ *  All such fields should be initialized to zero, unless otherwise
++ *  noted.
++ *  See the individual field descriptions for which fields are "internal".
++ */
++struct ia_css_process_group_s {
++    /** User (callback) token / user context reference,
++     * zero is an error value
++     */
++    uint64_t token;
++    /** private token / context reference, zero is an error value */
++    uint64_t private_token;
++    /** PG routing bitmap used to set connection between program group
++     *  components */
++    ia_css_rbm_t routing_bitmap;
++    /** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
++     *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
++    ia_css_kernel_bitmap_t kernel_bitmap;
++    /** Size of this structure in bytes */
++    uint32_t size;
++    /** The timestamp when PG load starts
++     *  @note Internal firmware use only. */
++    /**< PSYS server init time in cycless */
++    uint32_t psys_server_init_cycles;
++    /**< The timestamp when PG load starts */
++    uint32_t pg_load_start_ts;
++    /** PG load time in cycles
++     *  @note Internal firmware use only. */
++    uint32_t pg_load_cycles;
++    /** PG init time in cycles
++     *  @note Internal firmware use only. */
++    uint32_t pg_init_cycles;
++    /** PG processing time in cycles
++     *  @note Internal firmware use only. */
++    uint32_t pg_processing_cycles;
++    /** Referral ID to program group FW.  This identifies the "type" of the process group
++     *  and associcates the process group with the program group defined in the manifest. */
++    /**< PG next frame init time in cycles */
++    uint32_t pg_next_frame_init_cycles;
++    /**< PG complete time in cycles */
++    uint32_t pg_complete_cycles;
++    /**< Referral ID to program group FW */
++    ia_css_program_group_ID_t ID;
++    /** State of the process group FSM */
++    ia_css_process_group_state_t state;
++    /** Virtual address of process group in the IPU address space */
++    vied_vaddress_t ipu_virtual_address;
++    /** Bitmap of the compute resources used by the process group  */
++    vied_nci_resource_bitmap_t resource_bitmap;
++    /** Number of fragments offered on each terminal */
++    uint16_t fragment_count;
++    /** Current fragment of processing */
++    uint16_t fragment_state;
++    /** Watermark to control fragment processing.  Set to the same value as "fragment_count"
++     *  unless you know what you are doing.
++     *  @see  fragment_count in this structure. */
++    uint16_t fragment_limit;
++    /** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
++     *  Must be aligned to a 64 bit boundary.
++     *  process_offset_table is an array of size "process_count", containing offsets to process objects
++     *  (each an instance of ia_css_process_t) belonging to this process group.
++     *  @see process_count in this structure.
++     *
++     *  Usually follows this process group structure. */
++    uint16_t processes_offset;
++    /** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
++     *  Must be aligned to a 64 bit boundary.
++     *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
++     *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
++     *  @see terminal_count in this structure.
++     *
++     *  Usually follows process_offset_table, aligned to 64-bit boundary. */
++    uint16_t terminals_offset;
++    /** Parameter dependent number of processes in this process group, determined at process
++     *  group creation taking into account the enabled kernels. That is, if all of a program's
++     *  associcated kernels are disabled, then no process is instantiated for that program and
++     *  it must not be counted in the process count.
++     *
++     *  @see processes_offset in this structure
++     *  @see ia_css_program_group_manifest_get_program_count()
++     *  @see ia_css_program_manifest_get_kernel_bitmap()
++     *  @see ia_css_process_group_compute_process_count() */
++    uint8_t process_count;
++    /** Parameter dependent number of terminals on this process group, determined at process
++     *  group creation.  Must not be greater than the terminal count as defined in the manifest,
++     *  but taking into account the enabled kernels.  That is, for those terminal types that have
++     *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
++     *  Execptions by terminal type:
++     *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
++     *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
++     *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
++     *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
++     *
++     *  @see terminals_offset in this structure
++     *  @see ia_css_program_group_manifest_get_terminal_count()
++     *  @see ia_css_program_manifest_get_kernel_bitmap()
++     *  @see ia_css_process_group_is_terminal_enabled()
++     *  @see ia_css_process_group_compute_terminal_count() */
++    uint8_t terminal_count;
++    /** Parameter dependent number of independent subgraphs in
++     * this process group.
++     * @note Apparently no longer used.
++     */
++    uint8_t subgraph_count;
++    /** Process group protocol version.  Identifies the state machine and
++     *  message protocol for this process group. */
++    uint8_t protocol_version;
++    /** Dedicated base queue id used for enqueueing payload buffer sets.
++     *  Each buffer set is either a frame (or fragment) processing request,
++     *  or an opportunistic parameter update (AKA "late binding")
++     *  This queue is enabled once the process group start command has
++     *  been issued. */
++    uint8_t base_queue_id;
++    /** Number of dedicated queues used */
++    uint8_t num_queues;
++    /**< Mask the send_pg_done IRQ */
++    uint8_t mask_irq;
++    /** Error handling enable\disable flag */
++    uint8_t error_handling_enable;
++#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
++    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
++#endif
++};
++
++/*! Callback after process group is created. Implementations can provide
++ * suitable actions needed when process group is created.
++
++ @param    process_group[in]            process group object
++ @param    program_group_manifest[in]        program group manifest
++ @param    program_group_param[in]            program group parameters
++
++ @return 0 on success and non-zero on failure
++ */
++extern int ia_css_process_group_on_create(
++    ia_css_process_group_t            *process_group,
++    const ia_css_program_group_manifest_t    *program_group_manifest,
++    const ia_css_program_group_param_t    *program_group_param);
++
++/*! Callback before process group is about to be destoyed. Any implementation
++ * specific cleanups can be done here.
++
++ @param    process_group[in]                process group object
++
++ @return 0 on success and non-zero on failure
++ */
++extern int ia_css_process_group_on_destroy(
++    ia_css_process_group_t                    *process_group);
++
++/*
++ * Command processor
++ */
++
++/*! Execute a command locally or send it to be processed remotely
++
++ @param    process_group[in]        process group object
++ @param    cmd[in]                    command
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_exec_cmd(
++    ia_css_process_group_t                *process_group,
++    const ia_css_process_group_cmd_t        cmd);
++
++/*! Enqueue a buffer set corresponding to a persistent program group by
++ * sending a command to subsystem.
++
++ @param    process_group[in]        process group object
++ @param    buffer_set[in]            buffer set
++ @param    queue_offset[in]        offset to be used from the queue id
++                    specified in the process group object
++                    (0 for first buffer set for frame, 1
++                    for late binding)
++
++ @return < 0 on error
++ */
++extern int ia_css_enqueue_buffer_set(
++    ia_css_process_group_t                *process_group,
++    ia_css_buffer_set_t                *buffer_set,
++    unsigned int                    queue_offset);
++
++/*! Enqueue a parameter buffer set corresponding to a persistent program
++ *  group by sending a command to subsystem.  This allows for
++    opportunistic late parameters update, AKA "late binding".
++
++ @param    process_group[in]        process group object
++ @param    buffer_set[in]            parameter buffer set
++
++ @return < 0 on error
++ */
++extern int ia_css_enqueue_param_buffer_set(
++    ia_css_process_group_t                *process_group,
++    ia_css_buffer_set_t                *buffer_set);
++
++/*! Need to store the 'secure' mode for each PG for FW test app only
++ *
++ * @param    process_group[in]        process group object
++ * @param    secure[in]            parameter buffer set
++ *
++ * @return < 0 on error
++ */
++extern int ia_css_process_group_store(
++    ia_css_process_group_t                *process_group,
++    bool                        secure);
++
++/*! Need to get the right context for each PG for FW test app only
++ *
++ * @param    process_group[in]        process group object
++ *
++ * @return    psys_syscom context
++ */
++extern struct ia_css_syscom_context *ia_css_process_group_get_context(
++    ia_css_process_group_t *process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
+new file mode 100644
+index 000000000000..4ada788bed49
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_group_impl.h
+@@ -0,0 +1,1846 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
++
++#include <ia_css_psysapi_fw_version.h>
++#include <ia_css_psys_process_group.h>
++#include "ia_css_psys_process_group_cmd_impl.h"
++#include <ia_css_psys_terminal.h>
++#include <ia_css_psys_transport.h>
++#include <ia_css_psys_process.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include "ia_css_terminal_manifest_types.h"
++
++#include "ia_css_rbm.h"
++
++#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
++
++#include <vied_nci_psys_system_global.h>
++#include <ia_css_program_group_data.h>
++#include "ia_css_rbm_manifest_types.h"
++#include <type_support.h>
++#include <error_support.h>
++#include <misc_support.h>
++#include <math_support.h>
++
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_terminal_manifest.h"
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_data_terminal_enabled(
++    const ia_css_data_terminal_manifest_t    *data_term_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    bool is_terminal_enabled = false;
++
++    ia_css_kernel_bitmap_t term_bitmap =
++        ia_css_data_terminal_manifest_get_kernel_bitmap(
++                data_term_manifest);
++    /*
++     * Terminals depend on a kernel,
++     * if the kernel is present the program it contains and
++     * the terminal the program depends on are active
++     */
++    is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
++            enable_bitmap,
++            term_bitmap);
++    return is_terminal_enabled;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_spatial_terminal_enabled(
++    const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    bool is_terminal_enabled = false;
++    ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++
++    term_kernel_bitmap =
++        ia_css_kernel_bitmap_set(
++            term_kernel_bitmap,
++            spatial_term_man->kernel_id);
++    is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++            enable_bitmap, term_kernel_bitmap);
++    return is_terminal_enabled;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_terminal_enabled(
++    const ia_css_terminal_manifest_t *terminal_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    ia_css_terminal_type_t terminal_type;
++    bool is_terminal_enabled = false;
++
++    verifjmpexit(NULL != terminal_manifest);
++    terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
++
++    if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
++        ia_css_data_terminal_manifest_t    *data_term_manifest =
++                        (ia_css_data_terminal_manifest_t *)terminal_manifest;
++        is_terminal_enabled =
++                ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
++    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                terminal_manifest)) {
++        ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
++            (ia_css_spatial_param_terminal_manifest_t *)
++            terminal_manifest;
++         is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
++            enable_bitmap);
++    } else if (ia_css_is_terminal_manifest_parameter_terminal(
++            terminal_manifest) && terminal_type ==
++            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
++        /*
++         * For parameter out and program control terminals, we
++         * disable the terminals if ALL the corresponding kernels
++         * are disabled, for parameter in terminals we cannot do this;
++         * even if kernels are disabled, it may be required that
++         * (HW) parameters must be supplied via the parameter
++         * in terminal (e.g. bypass bits).
++         */
++        is_terminal_enabled = true;
++
++    } else if (ia_css_is_terminal_manifest_parameter_terminal(
++            terminal_manifest) && terminal_type ==
++            IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++        ia_css_param_terminal_manifest_t *param_term_man =
++            (ia_css_param_terminal_manifest_t *)terminal_manifest;
++        ia_css_param_manifest_section_desc_t *section_desc;
++        unsigned int section = 0;
++        uint8_t kernel_id;
++
++        for (section = 0; section < param_term_man->
++                param_manifest_section_desc_count; section++) {
++            section_desc =
++        ia_css_param_terminal_manifest_get_prm_sct_desc(
++                        param_term_man, section);
++            verifjmpexit(section_desc != NULL);
++            kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
++            term_kernel_bitmap = ia_css_kernel_bitmap_set(
++                    term_kernel_bitmap,
++                    kernel_id);
++        }
++
++        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++                    enable_bitmap, term_kernel_bitmap);
++    } else if (ia_css_is_terminal_manifest_program_terminal(
++                terminal_manifest)) {
++        ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++        ia_css_program_terminal_manifest_t *prog_term_man =
++            (ia_css_program_terminal_manifest_t *)terminal_manifest;
++        unsigned int section = 0;
++
++        for (section = 0;
++            section < prog_term_man->fragment_param_manifest_section_desc_count;
++            section++) {
++            ia_css_fragment_param_manifest_section_desc_t *desc =
++                ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++                    prog_term_man,
++                    section);
++            verifjmpexit(desc != NULL);
++
++            term_kernel_bitmap = ia_css_kernel_bitmap_set(
++                    term_kernel_bitmap,
++                    ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
++        }
++
++        is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++                    enable_bitmap, term_kernel_bitmap);
++    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++                terminal_manifest)) {
++        is_terminal_enabled = true;
++    }
++    return is_terminal_enabled;
++EXIT:
++    return false;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_process_group_get_fragment_limit(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint16_t fragment_limit = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_fragment_limit(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    fragment_limit = process_group->fragment_limit;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_limit invalid argument\n");
++    }
++    return fragment_limit;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_fragment_limit(
++    ia_css_process_group_t *process_group,
++    const uint16_t fragment_limit)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    uint16_t fragment_state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_fragment_limit(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    retval = ia_css_process_group_get_fragment_state(process_group,
++        &fragment_state);
++
++    verifexitval(retval == 0, EINVAL);
++    verifexitval(fragment_limit > fragment_state, EINVAL);
++    verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
++                process_group), EINVAL);
++
++    process_group->fragment_limit = fragment_limit;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_limit invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_limit failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_clear_fragment_limit(
++    ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_clear_fragment_limit(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    process_group->fragment_limit = 0;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_clear_fragment_limit failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_attach_buffer(
++    ia_css_process_group_t *process_group,
++    vied_vaddress_t buffer,
++    const ia_css_buffer_state_t buffer_state,
++    const unsigned int terminal_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    ia_css_terminal_t *terminal = NULL;
++
++    NOT_USED(buffer_state);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_attach_buffer(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    terminal = ia_css_process_group_get_terminal(
++                process_group, terminal_index);
++
++    verifexitval(terminal != NULL, EINVAL);
++    verifexitval(ia_css_process_group_get_state(process_group) ==
++        IA_CSS_PROCESS_GROUP_READY, EINVAL);
++    verifexitval(process_group->protocol_version ==
++        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
++        process_group->protocol_version ==
++        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
++
++    if (process_group->protocol_version ==
++        IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
++        /*
++         * Legacy flow:
++         * Terminal address is part of the process group structure
++         */
++        retval = ia_css_terminal_set_buffer(
++            terminal, buffer);
++    } else if (process_group->protocol_version ==
++        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
++        /*
++         * PPG flow:
++         * Terminal address is part of external buffer set structure
++         */
++        retval = ia_css_terminal_set_terminal_index(
++            terminal, terminal_index);
++    }
++    verifexitval(retval == 0, EFAULT);
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
++
++    if (ia_css_is_terminal_data_terminal(terminal) == true) {
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(
++                (ia_css_data_terminal_t *)terminal);
++        verifexitval(frame != NULL, EINVAL);
++
++        retval = ia_css_frame_set_buffer_state(frame, buffer_state);
++        verifexitval(retval == 0, EINVAL);
++    }
++
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_attach_buffer invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_attach_buffer failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_vaddress_t ia_css_process_group_detach_buffer(
++    ia_css_process_group_t *process_group,
++    const unsigned int terminal_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    vied_vaddress_t buffer = VIED_NULL;
++
++    ia_css_terminal_t *terminal = NULL;
++    ia_css_process_group_state_t state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_detach_buffer(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    terminal =
++        ia_css_process_group_get_terminal(
++                process_group, terminal_index);
++    state = ia_css_process_group_get_state(process_group);
++
++    verifexitval(terminal != NULL, EINVAL);
++    verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
++
++    buffer = ia_css_terminal_get_buffer(terminal);
++
++    if (ia_css_is_terminal_data_terminal(terminal) == true) {
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++        verifexitval(frame != NULL, EINVAL);
++
++        retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
++        verifexitval(retval == 0, EINVAL);
++    }
++    ia_css_terminal_set_buffer(terminal, VIED_NULL);
++
++    retval = 0;
++EXIT:
++    /*
++     * buffer pointer will appear on output,
++     * regardless of subsequent fails to avoid memory leaks
++     */
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_detach_buffer invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_detach_buffer failed (%i)\n",
++            retval);
++    }
++    return buffer;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_attach_stream(
++    ia_css_process_group_t *process_group,
++    uint32_t stream,
++    const ia_css_buffer_state_t buffer_state,
++    const unsigned int terminal_index)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_attach_stream(): enter:\n");
++
++    NOT_USED(process_group);
++    NOT_USED(stream);
++    NOT_USED(buffer_state);
++    NOT_USED(terminal_index);
++
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_attach_stream failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_detach_stream(
++    ia_css_process_group_t *process_group,
++    const unsigned int terminal_index)
++{
++    int retval = -1;
++    uint32_t stream = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_detach_stream(): enter:\n");
++
++    NOT_USED(process_group);
++    NOT_USED(terminal_index);
++
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_detach_stream failed (%i)\n",
++            retval);
++    }
++    return stream;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_barrier(
++    ia_css_process_group_t *process_group,
++    const vied_nci_barrier_ID_t barrier_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    vied_nci_resource_bitmap_t bit_mask;
++    vied_nci_resource_bitmap_t resource_bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_barrier(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    resource_bitmap =
++        ia_css_process_group_get_resource_bitmap(process_group);
++
++    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
++
++    verifexitval(bit_mask != 0, EINVAL);
++    verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
++
++    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
++
++    retval =
++        ia_css_process_group_set_resource_bitmap(
++            process_group, resource_bitmap);
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_barrier invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_barrier failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_clear_barrier(
++    ia_css_process_group_t *process_group,
++    const vied_nci_barrier_ID_t barrier_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_clear_barrier(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    resource_bitmap =
++        ia_css_process_group_get_resource_bitmap(process_group);
++
++    bit_mask = vied_nci_barrier_bit_mask(barrier_index);
++
++    verifexitval(bit_mask != 0, EINVAL);
++    verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
++
++    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
++
++    retval =
++        ia_css_process_group_set_resource_bitmap(
++                process_group, resource_bitmap);
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_clear_barrier invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_clear_barrier failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_print(
++    const ia_css_process_group_t *process_group,
++    void *fid)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    int i;
++
++    uint8_t    process_count;
++    uint8_t terminal_count;
++    vied_vaddress_t ipu_vaddress = VIED_NULL;
++    ia_css_rbm_t routing_bitmap;
++
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_print(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
++    verifexitval(retval == 0, EINVAL);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "=============== Process group print start ===============\n");
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\tipu_virtual_address = %x\n", ipu_vaddress);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\tsizeof(process_group) = %d\n",
++        (int)ia_css_process_group_get_size(process_group));
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\tfragment_count = %d\n",
++        (int)ia_css_process_group_get_fragment_count(process_group));
++
++    routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
++    for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++            "\trouting_bitmap[index = %d] = 0x%X\n",
++            i, (int)routing_bitmap.data[i]);
++    }
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\tprogram_group(process_group) = %d\n",
++        (int)ia_css_process_group_get_program_group_ID(process_group));
++    process_count = ia_css_process_group_get_process_count(process_group);
++    terminal_count =
++        ia_css_process_group_get_terminal_count(process_group);
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\t%d processes\n", (int)process_count);
++    for (i = 0; i < (int)process_count; i++) {
++        ia_css_process_t *process =
++            ia_css_process_group_get_process(process_group, i);
++
++        retval = ia_css_process_print(process, fid);
++        verifjmpexit(retval == 0);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\t%d terminals\n", (int)terminal_count);
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_t *terminal =
++            ia_css_process_group_get_terminal(process_group, i);
++
++        retval = ia_css_terminal_print(terminal, fid);
++        verifjmpexit(retval == 0);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "\terror_handling_enable = %u\n", process_group->error_handling_enable);
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "=============== Process group print end ===============\n");
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_print invalid argument\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_process_group_valid(
++    const ia_css_process_group_t *process_group,
++    const ia_css_program_group_manifest_t *pg_manifest,
++    const ia_css_program_group_param_t *param)
++{
++    DECLARE_ERRVAL
++    bool invalid_flag = false;
++    uint8_t proc_idx;
++    uint8_t proc_term_idx;
++    uint8_t    process_count;
++    uint8_t    program_count;
++    uint8_t terminal_count;
++    uint8_t man_terminal_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_process_group_valid(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    verifexitval(pg_manifest != NULL, EFAULT);
++    NOT_USED(param);
++
++    process_count = process_group->process_count;
++    terminal_count = process_group->terminal_count;
++    program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
++    man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
++
++    /* Validate process group */
++    invalid_flag = invalid_flag ||
++        !(program_count >= process_count) ||
++        !(man_terminal_count >= terminal_count) ||
++        !(process_group->size > process_group->processes_offset) ||
++        !(process_group->size > process_group->terminals_offset);
++
++    /* Validate processes */
++    for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
++        const ia_css_process_t *process;
++        ia_css_program_manifest_t *p_manifest = NULL;
++        ia_css_program_ID_t prog_id;
++        bool no_match_found = true;
++
++        process = ia_css_process_group_get_process(process_group, proc_idx);
++        verifexitval(NULL != process, EFAULT);
++        prog_id = ia_css_process_get_program_ID(process);
++        p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
++                                       ia_css_process_get_program_idx(process));
++        verifexitval(NULL != p_manifest, EFAULT);
++
++        if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
++            invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
++            no_match_found = false;
++        }
++
++        invalid_flag = invalid_flag || no_match_found;
++    }
++
++    /* Validate terminals */
++    for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
++        int man_term_idx;
++        const ia_css_terminal_t *terminal;
++        const ia_css_terminal_manifest_t *terminal_manifest;
++
++        terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
++        verifexitval(NULL != terminal, EFAULT);
++        man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
++        terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
++
++        invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_process_group_valid() invalid argument\n");
++        return false;
++    } else {
++        return (!invalid_flag);
++    }
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_process_group_submit(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    int i;
++    bool can_submit = false;
++    int retval = -1;
++    uint8_t    terminal_count =
++        ia_css_process_group_get_terminal_count(process_group);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_can_process_group_submit(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_t *terminal =
++            ia_css_process_group_get_terminal(process_group, i);
++        vied_vaddress_t buffer;
++        ia_css_buffer_state_t buffer_state;
++
++        verifexitval(terminal != NULL, EINVAL);
++
++        if (process_group->protocol_version ==
++            IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
++            /*
++             * For legacy pg flow, buffer addresses are contained inside
++             * the process group structure, so these need to be validated
++             * on process group submission.
++             */
++            buffer = ia_css_terminal_get_buffer(terminal);
++            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++                "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
++                i, (unsigned long int)terminal, buffer);
++        }
++
++        /* buffer_state is applicable only for data terminals*/
++        if (ia_css_is_terminal_data_terminal(terminal) == true) {
++            ia_css_frame_t *frame =
++                ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++
++            verifexitval(frame != NULL, EINVAL);
++            buffer_state = ia_css_frame_get_buffer_state(frame);
++            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
++                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
++                break;
++            }
++        } else if (
++            (ia_css_is_terminal_parameter_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_program_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_program_control_init_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_spatial_parameter_terminal(
++                terminal) != true)) {
++            /* neither data nor parameter terminal, so error.*/
++            break;
++        }
++
++    }
++    /* Only true if no check failed */
++    can_submit = (i == terminal_count);
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_process_group_submit invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_process_group_submit failed (%i)\n",
++            retval);
++    }
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_can_process_group_submit(): leave:\n");
++    return can_submit;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_enqueue_buffer_set(
++    const ia_css_process_group_t *process_group,
++    const ia_css_buffer_set_t *buffer_set)
++{
++    DECLARE_ERRVAL
++    int i;
++    bool can_enqueue = false;
++    int retval = -1;
++    uint8_t    terminal_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_can_enqueue_buffer_set(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    verifexitval(buffer_set != NULL, EFAULT);
++
++    terminal_count =
++        ia_css_process_group_get_terminal_count(process_group);
++
++    /*
++     * For ppg flow, buffer addresses are contained in the
++     * external buffer set structure, so these need to be
++     * validated before enqueueing.
++     */
++    verifexitval(process_group->protocol_version ==
++        IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
++
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_t *terminal =
++            ia_css_process_group_get_terminal(process_group, i);
++        vied_vaddress_t buffer;
++        ia_css_buffer_state_t buffer_state;
++
++        verifexitval(terminal != NULL, EINVAL);
++
++        buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
++        IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++            "\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
++            i, (unsigned long int)terminal, buffer);
++
++        /* buffer_state is applicable only for data terminals*/
++        if (ia_css_is_terminal_data_terminal(terminal) == true) {
++            ia_css_frame_t *frame =
++                ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++
++            verifexitval(frame != NULL, EINVAL);
++            buffer_state = ia_css_frame_get_buffer_state(frame);
++            if ((buffer_state == IA_CSS_BUFFER_NULL) ||
++                (buffer_state == IA_CSS_N_BUFFER_STATES)) {
++                break;
++            }
++        } else if (
++            (ia_css_is_terminal_parameter_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_program_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_program_control_init_terminal(terminal)
++                != true) &&
++            (ia_css_is_terminal_spatial_parameter_terminal(
++                terminal) != true)) {
++            /* neither data nor parameter terminal, so error.*/
++            break;
++        }
++    }
++    /* Only true if no check failed */
++    can_enqueue = (i == terminal_count);
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_enqueue_buffer_set invalid argument\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_enqueue_buffer_set failed (%i)\n",
++            retval);
++    }
++    return can_enqueue;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_process_group_start(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    int i;
++    bool can_start = false;
++    int retval = -1;
++    uint8_t    terminal_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_can_process_group_start(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    terminal_count =
++        ia_css_process_group_get_terminal_count(process_group);
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_t *terminal =
++            ia_css_process_group_get_terminal(process_group, i);
++        ia_css_buffer_state_t buffer_state;
++        bool ok = false;
++
++        verifexitval(terminal != NULL, EINVAL);
++        if (ia_css_is_terminal_data_terminal(terminal) == true) {
++            /*
++             * buffer_state is applicable only for data terminals
++             */
++            ia_css_frame_t *frame =
++                ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++            bool is_input = ia_css_is_terminal_input(terminal);
++            /*
++             * check for NULL here.
++             * then invoke next 2 statements
++             */
++            verifexitval(frame != NULL, EINVAL);
++            IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
++                "\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
++                i, frame->buffer_state, frame->access_type,
++                frame->data_bytes, frame->data);
++            buffer_state = ia_css_frame_get_buffer_state(frame);
++
++            ok = ((is_input &&
++                (buffer_state == IA_CSS_BUFFER_FULL)) ||
++                    (!is_input && (buffer_state ==
++                            IA_CSS_BUFFER_EMPTY)));
++
++        } else if (ia_css_is_terminal_parameter_terminal(terminal) ==
++                true) {
++            /*
++             * FIXME:
++             * is there any pre-requisite for param_terminal?
++             */
++            ok = true;
++        } else if (ia_css_is_terminal_program_terminal(terminal) ==
++                true) {
++            ok = true;
++        } else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
++                true) {
++            ok = true;
++        } else if (ia_css_is_terminal_spatial_parameter_terminal(
++                    terminal) == true) {
++            ok = true;
++        } else {
++            /* neither data nor parameter terminal, so error.*/
++            break;
++        }
++
++        if (!ok)
++            break;
++    }
++    /* Only true if no check failed */
++    can_start = (i == terminal_count);
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_process_group_submit invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_can_process_group_start failed (%i)\n",
++            retval);
++    }
++    return can_start;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_process_group_get_size(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    size_t size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_size(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    size = process_group->size;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_size invalid argument\n");
++    }
++    return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_state_t ia_css_process_group_get_state(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_state(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    state = process_group->state;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_state invalid argument\n");
++    }
++    return state;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_group_get_kernel_bitmap(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    bitmap = process_group->kernel_bitmap;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
++    }
++    return bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    const ia_css_rbm_t *rbm = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_routing_bitmap(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    rbm = &(process_group->routing_bitmap);
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_routing_bitmap invalid argument\n");
++    }
++    return rbm;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_process_group_get_fragment_count(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint16_t fragment_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_fragment_count(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    fragment_count = process_group->fragment_count;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_count invalid argument\n");
++    }
++    return fragment_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_process_count(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t process_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_process_count(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    process_count = process_group->process_count;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_process_count invalid argument\n");
++    }
++    return process_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_terminal_count(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t terminal_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_terminal_count(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    terminal_count = process_group->terminal_count;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_terminal_count invalid argument\n");
++    }
++    return terminal_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_psys_server_init_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t psys_server_init_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    psys_server_init_cycles = process_group->psys_server_init_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
++    }
++    return psys_server_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_load_start_ts(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_load_start_ts = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_load_start_ts(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_load_start_ts = process_group->pg_load_start_ts;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_load_start_ts invalid argument\n");
++    }
++    return pg_load_start_ts;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_load_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_load_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_load_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_load_cycles = process_group->pg_load_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_load_cycles invalid argument\n");
++    }
++    return pg_load_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_init_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_init_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_init_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_init_cycles = process_group->pg_init_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_init_cycles invalid argument\n");
++    }
++    return pg_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_processing_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_processing_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_processing_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_processing_cycles = process_group->pg_processing_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_processing_cycles invalid argument\n");
++    }
++    return pg_processing_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_next_frame_init_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
++    }
++    return pg_next_frame_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_complete_cycles(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint32_t pg_complete_cycles = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_pg_complete_cycles(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    pg_complete_cycles = process_group->pg_complete_cycles;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_pg_complete_cycles invalid argument\n");
++    }
++    return pg_complete_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
++        const ia_css_process_group_t *process_group,
++        const ia_css_terminal_type_t terminal_type)
++{
++    unsigned int proc_cnt;
++    ia_css_terminal_t *terminal = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++            "ia_css_process_group_get_terminal_from_type(): enter:\n");
++
++    for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
++        terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
++        if (terminal == NULL) {
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++                    "ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
++            goto EXIT;
++        }
++        if (ia_css_terminal_get_type(terminal) == terminal_type) {
++            return terminal;
++        }
++        terminal = NULL; /* If not the expected type, return NULL */
++    }
++EXIT:
++    return terminal;
++}
++
++/* Returns the terminal or NULL if it was not found
++   For some of those maybe valid to not exist at all in the process group */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
++    const ia_css_process_group_t     *process_group,
++    ia_css_terminal_type_t        term_type)
++{
++    int i, term_count;
++
++    assert(process_group != NULL);
++
++    /* Those below have at most one instance per process group */
++    assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++        term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
++        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
++        term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++
++    term_count = ia_css_process_group_get_terminal_count(process_group);
++
++    for (i = 0; i < term_count; i++) {
++        const ia_css_terminal_t    *terminal = ia_css_process_group_get_terminal(process_group, i);
++
++        if (ia_css_terminal_get_type(terminal) == term_type) {
++            /* Only one parameter terminal per process group */
++            return terminal;
++        }
++    }
++
++    return NULL;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
++    const ia_css_process_group_t *process_grp,
++    const unsigned int manifest_idx)
++{
++    DECLARE_ERRVAL
++    uint8_t i = 0;
++    uint8_t terminal_count;
++
++    terminal_count =
++        ia_css_process_group_get_terminal_count(process_grp);
++
++    for ( i = 0; i < terminal_count;
++            i++) {
++        unsigned int man_term_idx;
++        ia_css_terminal_t *terminal;
++
++        terminal =
++            ia_css_process_group_get_terminal(
++                    process_grp, i);
++        verifexitval(NULL != terminal, EFAULT);
++        man_term_idx =
++            ia_css_terminal_get_terminal_manifest_index(terminal);
++        if (man_term_idx == manifest_idx)
++            return terminal;
++    }
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_manifest_idx_terminal Error\n");
++    }
++    return NULL;
++
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_terminal(
++    const ia_css_process_group_t *process_grp,
++    const unsigned int terminal_num)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_t *terminal_ptr = NULL;
++    uint16_t *terminal_offset_table;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_terminal(): enter:\n");
++
++    verifexitval(process_grp != NULL, EFAULT);
++    verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
++
++    terminal_offset_table =
++        (uint16_t *)((char *)process_grp +
++                process_grp->terminals_offset);
++    terminal_ptr =
++        (ia_css_terminal_t *)((char *)process_grp +
++                terminal_offset_table[terminal_num]);
++
++    verifexitval(terminal_ptr != NULL, EFAULT);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_terminal invalid argument\n");
++    }
++    return terminal_ptr;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_t *ia_css_process_group_get_process(
++    const ia_css_process_group_t *process_grp,
++    const unsigned int process_num)
++{
++    DECLARE_ERRVAL
++    ia_css_process_t *process_ptr = NULL;
++    uint16_t *process_offset_table;
++
++    verifexitval(process_grp != NULL, EFAULT);
++    verifexitval(process_num < process_grp->process_count, EINVAL);
++
++    process_offset_table =
++        (uint16_t *)((char *)process_grp +
++                process_grp->processes_offset);
++    process_ptr =
++        (ia_css_process_t *)((char *)process_grp +
++                process_offset_table[process_num]);
++
++    verifexitval(process_ptr != NULL, EFAULT);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_process invalid argument\n");
++    }
++    return process_ptr;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    ia_css_program_group_ID_t id = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_program_group_ID(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    id = process_group->ID;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_program_group_ID invalid argument\n");
++    }
++    return id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t resource_bitmap = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_resource_bitmap(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    resource_bitmap = process_group->resource_bitmap;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_resource_bitmap invalid argument\n");
++    }
++    return resource_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_resource_bitmap(
++    ia_css_process_group_t *process_group,
++    const vied_nci_resource_bitmap_t resource_bitmap)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_resource_bitmap(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    process_group->resource_bitmap = resource_bitmap;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_resource_bitmap failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_routing_bitmap(
++    ia_css_process_group_t *process_group,
++    const ia_css_rbm_t rbm)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_routing_bitmap(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    process_group->routing_bitmap = rbm;
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_routing_bitmap failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_compute_cycle_count(
++    const ia_css_program_group_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    DECLARE_ERRVAL
++    uint32_t cycle_count = 0;
++
++    NOT_USED(manifest);
++    NOT_USED(param);
++
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(param != NULL, EFAULT);
++
++    cycle_count = 1;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_compute_cycle_count invalid argument\n");
++    }
++    return cycle_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_fragment_state(
++    ia_css_process_group_t *process_group,
++    uint16_t fragment_state)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_set_fragment_state(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
++                process_group), EINVAL);
++
++    process_group->fragment_state = fragment_state;
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_fragment_state invalid argument process_group\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_fragment_state failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_get_fragment_state(
++    const ia_css_process_group_t *process_group,
++    uint16_t *fragment_state)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_fragment_state(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    verifexitval(fragment_state != NULL, EFAULT);
++
++    *fragment_state = process_group->fragment_state;
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_state invalid argument\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_fragment_state failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_get_ipu_vaddress(
++    const ia_css_process_group_t *process_group,
++    vied_vaddress_t *ipu_vaddress)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_ipu_vaddress(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++    verifexitval(ipu_vaddress != NULL, EFAULT);
++
++    *ipu_vaddress = process_group->ipu_virtual_address;
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_ipu_vaddress invalid argument\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_ipu_vaddress failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_ipu_vaddress(
++    ia_css_process_group_t *process_group,
++    vied_vaddress_t ipu_vaddress)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_ipu_vaddress(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    process_group->ipu_virtual_address = ipu_vaddress;
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_ipu_vaddress invalid argument\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_ipu_vaddress failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_protocol_version(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_protocol_version(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    protocol_version = process_group->protocol_version;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_protocol_version invalid argument\n");
++    }
++    return protocol_version;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_base_queue_id(
++    ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_base_queue_id(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    queue_id = process_group->base_queue_id;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_base_queue_id invalid argument\n");
++    }
++    return queue_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_base_queue_id(
++    ia_css_process_group_t *process_group,
++    uint8_t queue_id)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_base_queue_id(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    /* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
++    if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
++        process_group->base_queue_id = queue_id;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
++                       queue_id, (unsigned long int)process_group);
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_base_queue_id invalid argument\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_num_queues(
++    ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t num_queues = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_num_queues(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    num_queues = process_group->num_queues;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_num_queues invalid argument\n");
++    }
++    return num_queues;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_num_queues(
++    ia_css_process_group_t *process_group,
++    uint8_t num_queues)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_num_queues(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    process_group->num_queues = num_queues;
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_num_queues invalid argument\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_error_handling_enable(
++    ia_css_process_group_t *process_group,
++    const bool error_handling_enable)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_error_handling_enable(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
++    retval = 0;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_error_handling_enable invalid argument\n");
++    }
++
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_error_handling_enable(
++    const ia_css_process_group_t *process_group)
++{
++    DECLARE_ERRVAL
++    uint8_t error_handling_enable = UINT8_MAX;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_error_handling_enable(): enter:\n");
++
++    verifexitval(process_group != NULL, EFAULT);
++
++    /* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
++    assert(process_group->error_handling_enable <= (uint8_t)1);
++    error_handling_enable = process_group->error_handling_enable;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_get_error_handling_enable invalid argument\n");
++    }
++
++    return error_handling_enable;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
++{
++#if NUM_OF_VP_CELLS > 0
++    bool has_vp = false;
++#ifdef HAS_VP
++    uint32_t i;
++
++    uint8_t process_count = ia_css_process_group_get_process_count(process_group);
++
++    for (i = 0; i < process_count; i++) {
++        ia_css_process_t *process;
++        vied_nci_cell_ID_t cell_id;
++
++        process = ia_css_process_group_get_process(process_group, i);
++        cell_id = ia_css_process_get_cell(process);
++
++        if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
++            has_vp = true;
++            break;
++        }
++    }
++#else /* not HAS_VP */
++        NOT_USED(process_group);
++#endif /* HAS_VP */
++
++    return has_vp;
++#else
++    NOT_USED(process_group);
++    return false;
++#endif
++}
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
+new file mode 100644
+index 000000000000..de5719c70522
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_impl.h
+@@ -0,0 +1,694 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_IMPL_H
++
++#include <ia_css_psys_process.h>
++
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_program_manifest.h>
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_psys_process_private_types.h"
++
++/** Function only to be used in FW */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
++{
++    DECLARE_ERRVAL
++    verifexitval(process != NULL, EFAULT);
++    if (process->process_extension_offset != 0) {
++        return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_get_extension invalid argument\n");
++    }
++    return NULL;
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
++STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
++{
++    assert(index < IA_CSS_PROCESS_MAX_CELLS);
++    return process->cells[index];
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
++STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
++{
++    assert(index < IA_CSS_PROCESS_MAX_CELLS);
++    process->cells[index] = cell_id;
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
++STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
++{
++    int i;
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
++    }
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_cell_ID_t ia_css_process_get_cell(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    vied_nci_cell_ID_t    cell_id = VIED_NCI_N_CELL_ID;
++    int i = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_cell(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++    }
++    cell_id = ia_css_process_cells_get_cell(process, 0);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_cell invalid argument\n");
++    }
++    return cell_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
++    const ia_css_process_t        *process,
++    const vied_nci_mem_type_ID_t    mem_type)
++{
++    DECLARE_ERRVAL
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_ext_mem(): enter:\n");
++
++    verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_ext_mem invalid argument\n");
++        return IA_CSS_PROCESS_INVALID_OFFSET;
++    }
++    return process_ext->ext_mem_id[mem_type];
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_get_program_idx(
++    const ia_css_process_t        *process)
++{
++    DECLARE_ERRVAL
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_program_idx(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_program_idx invalid argument\n");
++        return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
++    }
++    return process->program_idx;
++}
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_dev_chn(
++    const ia_css_process_t        *process,
++    const vied_nci_dev_chn_ID_t    dev_chn_id)
++{
++    DECLARE_ERRVAL
++    ia_css_process_ext_t *process_ext = NULL;
++
++    COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_dev_chn(): enter:\n");
++    verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_dev_chn(): invalid arguments\n");
++        return IA_CSS_PROCESS_INVALID_OFFSET;
++    }
++    return process_ext->dev_chn_offset[dev_chn_id];
++}
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
++    const ia_css_process_t                *process,
++    const vied_nci_mem_type_ID_t            mem_id)
++{
++    (void)process;
++    (void)mem_id;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_get_int_mem_offset always returns 0"
++        "(internally memory feature not used).\n");
++    return 0;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
++    const ia_css_process_t                *process,
++    const vied_nci_mem_type_ID_t            mem_type_id)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_ext_mem_offset(): enter:\n");
++
++    verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++    if (noerror()) {
++        ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_ext_mem_offset invalid argument\n");
++    }
++
++    return ext_mem_offset;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_process_get_size(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_size(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++EXIT:
++    if (noerror()) {
++        size = process->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                   "ia_css_process_get_size invalid argument\n");
++    }
++
++    return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_state_t ia_css_process_get_state(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    ia_css_process_state_t    state = IA_CSS_N_PROCESS_STATES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_state(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++EXIT:
++    if (noerror()) {
++        state = (ia_css_process_state_t)process->state;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                   "ia_css_process_get_state invalid argument\n");
++    }
++
++    return state;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_set_state(
++    ia_css_process_t                    *process,
++    ia_css_process_state_t                state)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_state(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++    assert(state <= UINT8_MAX);
++    process->state = state;
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_state invalid argument\n");
++    }
++
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_cell_dependency_count(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    uint8_t    cell_dependency_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_cell_dependency_count(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    cell_dependency_count = process->cell_dependency_count;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++        "ia_css_process_get_cell_dependency_count invalid argument\n");
++    }
++    return cell_dependency_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_terminal_dependency_count(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    uint8_t    terminal_dependency_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_terminal_dependency_count(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    terminal_dependency_count = process->terminal_dependency_count;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_terminal_dependency_count invalid argument process\n");
++    }
++    return terminal_dependency_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_t *ia_css_process_get_parent(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    ia_css_process_group_t    *parent = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_parent(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    if (process->parent_offset == 0) {
++        return NULL;
++    };
++    parent =
++    (ia_css_process_group_t *) ((char *)process + process->parent_offset);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_parent invalid argument process\n");
++    }
++    return parent;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_ID_t ia_css_process_get_program_ID(
++    const ia_css_process_t                    *process)
++{
++    DECLARE_ERRVAL
++    ia_css_program_ID_t        id = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_program_ID(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++    id = process->ID;
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_get_program_ID invalid argument process\n");
++    }
++    return id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_id_t ia_css_process_get_cell_dependency(
++    const ia_css_process_t *process,
++    const unsigned int cell_num)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_id_t cell_dependency =
++        IA_CSS_PROCESS_INVALID_DEPENDENCY;
++    vied_nci_resource_id_t *cell_dep_ptr = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_get_cell_dependency(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    verifexitval(cell_num < process->cell_dependency_count, EFAULT);
++
++    cell_dep_ptr =
++        (vied_nci_resource_id_t *)
++        ((char *)process + process->cell_dependencies_offset);
++    cell_dependency = *(cell_dep_ptr + cell_num);
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++               "ia_css_process_get_cell_dependency invalid argument\n");
++    }
++    return cell_dependency;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_terminal_dependency(
++    const ia_css_process_t                    *process,
++    const unsigned int                    terminal_num)
++{
++    DECLARE_ERRVAL
++    uint8_t *ter_dep_ptr = NULL;
++    uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
++
++    verifexitval(process != NULL, EFAULT);
++    verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
++
++    ter_dep_ptr = (uint8_t *) ((char *)process +
++                   process->terminal_dependencies_offset);
++
++    ter_dep = *(ter_dep_ptr + terminal_num);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++               "ia_css_process_get_terminal_dependency invalid argument\n");
++    }
++    return ter_dep;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
++    const ia_css_process_t *process)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t bitmap = 0;
++    vied_nci_cell_ID_t cell_id;
++    int i = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_cell_bitmap(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        cell_id = ia_css_process_cells_get_cell(process, i);
++        if (VIED_NCI_N_CELL_ID != cell_id) {
++            bitmap |= (1 << cell_id);
++        }
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_get_cells_bitmap invalid argument process\n");
++    }
++
++    return bitmap;
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
++    ia_css_process_t *process)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t *p_bitmap = NULL;
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return NULL;
++    }
++
++    p_bitmap = &process_ext->dfm_port_bitmap[0];
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++    }
++
++    return p_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
++    ia_css_process_t *process)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t *p_bitmap = NULL;
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return NULL;
++    }
++
++    p_bitmap = &process_ext->dfm_active_port_bitmap[0];
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++    }
++
++    return p_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
++    const ia_css_process_t *process,
++    vied_nci_dev_dfm_id_t  dfm_res_id)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t bitmap = 0;
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++    bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++    }
++
++    return bitmap;
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
++    const ia_css_process_t *process,
++    vied_nci_dev_dfm_id_t  dfm_res_id)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t bitmap = 0;
++    ia_css_process_ext_t *process_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
++
++    verifexitval(process != NULL, EFAULT);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++#if HAS_DFM
++    verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++    bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
++#else
++    NOT_USED(dfm_res_id);
++#endif
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++         "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
++    }
++    return bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_process_valid(
++    const ia_css_process_t        *process,
++    const ia_css_program_manifest_t    *p_manifest)
++{
++    DECLARE_ERRVAL
++    bool invalid_flag = false;
++    ia_css_program_ID_t prog_id;
++
++    verifexitval(NULL != process, EFAULT);
++    verifexitval(NULL != p_manifest, EFAULT);
++
++    prog_id = ia_css_process_get_program_ID(process);
++    verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
++
++    invalid_flag = (process->size <= process->cell_dependencies_offset) ||
++           (process->size <= process->terminal_dependencies_offset);
++
++    if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
++        vied_nci_cell_ID_t cell_id;
++
++        cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
++        invalid_flag = invalid_flag ||
++                (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
++    }
++    invalid_flag = invalid_flag ||
++        ((process->cell_dependency_count +
++          process->terminal_dependency_count) == 0) ||
++        (process->cell_dependency_count !=
++    ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
++        (process->terminal_dependency_count !=
++    ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
++
++    /* TODO: to be removed once all PGs pass validation */
++    if (invalid_flag == true) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++            "ia_css_is_process_valid(): false\n");
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_process_valid() invalid argument\n");
++        return false;
++    } else {
++        return (!invalid_flag);
++    }
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_cmd(
++    ia_css_process_t                    *process,
++    const ia_css_process_cmd_t                cmd)
++{
++    int    retval = -1;
++    ia_css_process_state_t    state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
++
++    verifexit(process != NULL);
++
++    state = ia_css_process_get_state(process);
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
++
++    verifexit(state != IA_CSS_PROCESS_ERROR);
++    verifexit(state < IA_CSS_N_PROCESS_STATES);
++
++    switch (cmd) {
++    case IA_CSS_PROCESS_CMD_NOP:
++        break;
++    case IA_CSS_PROCESS_CMD_ACQUIRE:
++        verifexit(state == IA_CSS_PROCESS_READY);
++        break;
++    case IA_CSS_PROCESS_CMD_RELEASE:
++        verifexit(state == IA_CSS_PROCESS_READY);
++        break;
++    case IA_CSS_PROCESS_CMD_START:
++        verifexit((state == IA_CSS_PROCESS_READY)
++              || (state == IA_CSS_PROCESS_STOPPED));
++        process->state = IA_CSS_PROCESS_STARTED;
++        break;
++    case IA_CSS_PROCESS_CMD_LOAD:
++        verifexit((state == IA_CSS_PROCESS_STARTED)
++                || (state == IA_CSS_PROCESS_READY)
++                || (state == IA_CSS_PROCESS_STOPPED));
++        process->state = IA_CSS_PROCESS_RUNNING;
++        break;
++    case IA_CSS_PROCESS_CMD_STOP:
++        verifexit((state == IA_CSS_PROCESS_RUNNING)
++              || (state == IA_CSS_PROCESS_SUSPENDED));
++        process->state = IA_CSS_PROCESS_STOPPED;
++        break;
++    case IA_CSS_PROCESS_CMD_SUSPEND:
++        verifexit(state == IA_CSS_PROCESS_RUNNING);
++        process->state = IA_CSS_PROCESS_SUSPENDED;
++        break;
++    case IA_CSS_PROCESS_CMD_RESUME:
++        verifexit(state == IA_CSS_PROCESS_SUSPENDED);
++        process->state = IA_CSS_PROCESS_RUNNING;
++        break;
++    case IA_CSS_N_PROCESS_CMDS:    /* Fall through */
++    default:
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
++        goto EXIT;
++    }
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_cmd invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_cmd failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
+new file mode 100644
+index 000000000000..e2252295212e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_private_types.h
+@@ -0,0 +1,135 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
++#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
++
++#include "ia_css_psys_process_types.h"
++#include "vied_nci_psys_resource_model.h"
++
++#define    N_UINT32_IN_PROCESS_STRUCT                0
++#define    N_UINT16_IN_PROCESS_STRUCT                1
++#define    N_UINT8_IN_PROCESS_STRUCT                8
++
++#if IA_CSS_PROCESS_STATE_BITS != 8
++#error IA_CSS_PROCESS_STATE_BITS expected to be 8
++#endif
++
++#define SIZE_OF_PROCESS_EXTENSION \
++     ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
++    + (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
++    + (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
++    + (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
++
++/** Extended process attributes describing more resource requirements
++ *  (and some DFM handling details ) beyond those covered in
++ *  ia_css_process_s.
++ */
++struct ia_css_process_ext_s {
++#if VIED_NCI_N_DEV_DFM_ID > 0
++    /** DFM port allocated to this process */
++    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++    /** Active DFM ports which need a kick */
++    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++    /** (external) Memory allocation offset given to this process */
++    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if VIED_NCI_N_DEV_CHN_ID > 0
++    /** Device channel allocation offset given to this process */
++    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++    /** (external) Memory ID */
++    vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
++    /** Number of processes (mapped on cells) this process depends on */
++    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
++#endif
++};
++
++#define SIZE_OF_PROCESS_STRUCT_BITS \
++    ((N_UINT32_IN_PROCESS_STRUCT * 32) \
++    + (IA_CSS_PROGRAM_ID_BITS) \
++    + (N_UINT16_IN_PROCESS_STRUCT * 16) \
++    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
++    + (N_UINT8_IN_PROCESS_STRUCT * 8) \
++    + ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
++
++/** Process attributes describing the instantiation of a single Program
++ *  within a Program Group.
++ */
++struct ia_css_process_s {
++    /** Reference to the containing process group */
++    int16_t parent_offset;
++    /** Size of this structure */
++    uint8_t size;
++    /** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
++     *  of the cells that provide input to this process.
++     *  Align to 64 bit boundary.
++     *  Set to zero if dependency_count is zero.
++     *  @see cell_dependency_count in this structure */
++    uint8_t cell_dependencies_offset;
++    /** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
++     *  of connected terminals (that is, the terminals that are associated with this process).
++     *  Each index is a key into to the process group terminal list.
++     *  Set to zero if dependency_count is zero.
++     *  @see terminal_dependency_count in this structure
++     *  @see ia_css_process_group_get_terminal() */
++    uint8_t terminal_dependencies_offset;
++    /** Offset in bytes to process extension structure, ia_css_process_ext_s
++     *  Align to 32 bit boundary.
++     *  Set to zero if extension is not used. The manifest must be queried to
++     *  find out if the extensino is necessary.
++     *  @see ia_css_program_manifest_process_requires_extension() */
++    uint8_t process_extension_offset;
++    /** Referal ID to a specific program.  This ID is unique across PG's and
++     *  can be used to retreive program meta data (AKA "program descriptor")
++     *  from the client package, including the program manifest and even
++     *  firmware program code, if the program is to be executed on a DSP. */
++    ia_css_program_ID_t ID;
++    /** Program index into the list of programs in the containing PG */
++    uint8_t program_idx;
++    /** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
++     *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
++     *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
++     *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
++    uint8_t state;
++    /** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
++    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
++    /** Size of the array of dependent cells pointed at by cell_dependencies_offset
++     *  Value must be set to the corresponding value from the manifest entry for this program.
++     *  As each program implies a cell (logically, if not physically) to execute the program,
++     *  the dependent cell count value in the process is the same as the dependent program count.
++     *  @see ia_css_program_manifest_get_program_dependency_count() */
++    uint8_t cell_dependency_count;
++    /** Number of terminals this process depends on.  This is the size of the array
++     *  pointed at by terminal_dependencies_offset
++     *  Value must be set to the corresponding value from the manifest entry for this program.
++     *  @see ia_css_program_manifest_get_terminal_dependency_count()
++     */
++    uint8_t terminal_dependency_count;
++#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
++    /** Padding bytes for 64bit alignment*/
++    uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
++#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
++};
++
++#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
+new file mode 100644
+index 000000000000..748db439fd8e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_process_types.h
+@@ -0,0 +1,98 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
++#define __IA_CSS_PSYS_PROCESS_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_types.h
++ *
++ * The types belonging to the terminal/process/process group dynamic module
++ */
++
++#include <type_support.h>
++#include <vied_nci_psys_system_global.h>
++
++#include <ia_css_psys_manifest_types.h>
++
++#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
++
++/* private */
++typedef enum ia_css_process_group_cmd {
++    IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
++    IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
++    IA_CSS_PROCESS_GROUP_CMD_ATTACH,
++    IA_CSS_PROCESS_GROUP_CMD_DETACH,
++    IA_CSS_PROCESS_GROUP_CMD_START,
++    IA_CSS_PROCESS_GROUP_CMD_DISOWN,
++    IA_CSS_PROCESS_GROUP_CMD_RUN,
++    IA_CSS_PROCESS_GROUP_CMD_STOP,
++    IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
++    IA_CSS_PROCESS_GROUP_CMD_RESUME,
++    IA_CSS_PROCESS_GROUP_CMD_ABORT,
++    IA_CSS_PROCESS_GROUP_CMD_RESET,
++    IA_CSS_N_PROCESS_GROUP_CMDS
++} ia_css_process_group_cmd_t;
++
++/* private */
++#define IA_CSS_PROCESS_GROUP_STATE_BITS    32
++typedef enum ia_css_process_group_state {
++    IA_CSS_PROCESS_GROUP_ERROR = 0,
++    IA_CSS_PROCESS_GROUP_CREATED,
++    IA_CSS_PROCESS_GROUP_READY,
++    IA_CSS_PROCESS_GROUP_BLOCKED,
++    IA_CSS_PROCESS_GROUP_STARTED,
++    IA_CSS_PROCESS_GROUP_RUNNING,
++    IA_CSS_PROCESS_GROUP_STALLED,
++    IA_CSS_PROCESS_GROUP_STOPPED,
++    IA_CSS_N_PROCESS_GROUP_STATES
++} ia_css_process_group_state_t;
++
++/* private */
++typedef enum ia_css_process_cmd {
++    IA_CSS_PROCESS_CMD_NOP = 0,
++    IA_CSS_PROCESS_CMD_ACQUIRE,
++    IA_CSS_PROCESS_CMD_RELEASE,
++    IA_CSS_PROCESS_CMD_START,
++    IA_CSS_PROCESS_CMD_LOAD,
++    IA_CSS_PROCESS_CMD_STOP,
++    IA_CSS_PROCESS_CMD_SUSPEND,
++    IA_CSS_PROCESS_CMD_RESUME,
++    IA_CSS_N_PROCESS_CMDS
++} ia_css_process_cmd_t;
++
++/* private */
++#define IA_CSS_PROCESS_STATE_BITS    8
++typedef enum ia_css_process_state {
++    IA_CSS_PROCESS_ERROR = 0,
++    IA_CSS_PROCESS_CREATED,
++    IA_CSS_PROCESS_READY,
++    IA_CSS_PROCESS_STARTED,
++    IA_CSS_PROCESS_RUNNING,
++    IA_CSS_PROCESS_STOPPED,
++    IA_CSS_PROCESS_SUSPENDED,
++    IA_CSS_N_PROCESS_STATES
++} ia_css_process_state_t;
++
++/* public */
++typedef struct ia_css_process_group_s    ia_css_process_group_t;
++typedef struct ia_css_process_s        ia_css_process_t;
++typedef struct ia_css_process_ext_s    ia_css_process_ext_t;
++
++typedef struct ia_css_data_terminal_s    ia_css_data_terminal_t;
++
++#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
+new file mode 100644
+index 000000000000..9a06e995aa88
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.h
+@@ -0,0 +1,320 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
++
++#include "ia_css_psys_static_storage_class.h"
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.h
++ *
++ * Define the methods on the program group manifest object that are not part of
++ * a single interface.
++ *
++ * Set functions in this file are for not for production use by the
++ * users (testing/simulation only).
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>            /* uint8_t */
++
++#include <ia_css_psys_program_group_manifest.sim.h>
++
++#include <ia_css_psys_program_group_manifest.hsys.user.h>
++
++#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_rbm_manifest_types.h"
++
++#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT        ((uint8_t)(-1))
++
++/*! Get the stored size of the program group manifest object
++
++ @param    manifest[in]            program group manifest object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_program_group_manifest_get_size(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the program group ID of the program group manifest object
++
++ @param    manifest[in]            program group manifest object
++
++ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_ID_t
++ia_css_program_group_manifest_get_program_group_ID(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the program group ID of the program group manifest object
++
++ @param    manifest[in]            program group manifest object
++
++ @param program group ID
++
++ @return 0 on success, -1 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_program_group_manifest_set_program_group_ID(
++    ia_css_program_group_manifest_t *manifest,
++    ia_css_program_group_ID_t id);
++
++/*! Get the storage alignment constraint of the program group binary data
++
++ @param    manifest[in]            program group manifest object
++
++ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
++    argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_alignment(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the storage alignment constraint of the program group binary data
++
++ @param    manifest[in]            program group manifest object
++ @param    alignment[in]            alignment desired
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_program_group_manifest_set_alignment(
++    ia_css_program_group_manifest_t *manifest,
++    const uint8_t alignment);
++
++/*! Get the kernel enable bitmap of the program group
++
++ @param    manifest[in]            program group manifest object
++
++ @return bitmap, 0 on invalid manifest argument
++ */
++extern ia_css_kernel_bitmap_t
++ia_css_program_group_manifest_get_kernel_bitmap(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the kernel enable bitmap of the program group
++
++ @param    manifest[in]            program group manifest object
++ @param    kernel bitmap[in]        kernel enable bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_group_manifest_set_kernel_bitmap(
++    ia_css_program_group_manifest_t *manifest,
++    const ia_css_kernel_bitmap_t bitmap);
++
++/*! Get the number of programs in the program group manifest object
++
++ @param    manifest[in]            program group manifest object
++
++ @return program count, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_program_count(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the number of terminals in the program group manifest object
++
++ @param    manifest[in]            program group manifest object
++
++ @return terminal count, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_terminal_count(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) private data blob in the manifest
++
++  Private data is used by FW and is opauque to the SW stack
++
++ @param    manifest[in]            program group manifest object
++
++ @return private data blob, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++void *ia_css_program_group_manifest_get_private_data(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) routing bitmap (rbm) manifest
++
++ @param    manifest[in]            program group manifest object
++
++ @return rbm manifest, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_rbm_manifest_t *
++ia_css_program_group_manifest_get_rbm_manifest(
++    const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) indexed program manifest in the program group manifest
++ * object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the program manifest object
++
++ @return program manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_manifest_t *
++ia_css_program_group_manifest_get_prgrm_mnfst(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int program_index);
++
++/*! Get the (pointer to) indexed terminal manifest in the program group
++ * manifest object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the terminal manifest object
++
++ @return terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_manifest_t *
++ia_css_program_group_manifest_get_term_mnfst(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed data terminal manifest in the program group
++ * manifest object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the terminal manifest object
++
++ @return data terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_data_terminal_manifest_t *
++ia_css_program_group_manifest_get_data_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed parameter terminal manifest in the program
++ * group manifest object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the terminal manifest object
++
++ @return parameter terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed spatial param terminal manifest in the program
++ * group manifest object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the terminal manifest object
++
++ @return spatial param terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_spatial_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed sliced param terminal manifest in the program
++ * group manifest object
++
++ @param    manifest[in]            program group manifest object
++ @param    program_index[in]        index of the terminal manifest object
++
++ @return sliced param terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_sliced_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed program terminal manifest in the program group
++ * manifest object
++
++ @parammanifest[in]program group manifest object
++ @paramprogram_index[in]index of the terminal manifest object
++
++ @return program terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_terminal_manifest_t *
++ia_css_program_group_manifest_get_program_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index);
++
++/*!    initialize program group manifest
++
++ @param    manifest[in]        program group manifest object
++ @param    program_count[in]    number of programs.
++ @param    terminal_count[in]    number of terminals.
++ @param program_needs_extension[in] Array[program count]
++ @param    program_deps[in]    program dependencies for programs in pg.
++ @param    terminal_deps[in]    terminal dependencies for programs in pg.
++ @param    terminal_type[in]    array of terminal types, binary specific
++                static frame data
++ @param    cached_in_param_section_count[in]Number of parameter terminal sections
++ @param cached_out_param_section_count[in]    Number of parameter out terminal
++ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
++                        with sections per cached out
++                        terminal
++ @param sliced_in_param_section_count[in]    Array[sliced_in_terminal_count]
++                        with sections per sliced in
++                        terminal
++ @param sliced_out_param_section_count[in]    Array[sliced_out_terminal_count]
++                        with sections per sliced out
++                        terminal
++ @param    fragment_param_section_count[in]    Number of fragment parameter
++                        sections of the program init
++                        terminal,
++ @param    kernel_fragment_seq_count[in]        Number of kernel fragment
++                        seqence info.
++ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
++                        sections (size of array is program_count)
++ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
++                        sections (size of array is program_count)
++ @return none;
++ */
++extern void ia_css_program_group_manifest_init(
++    ia_css_program_group_manifest_t *blob,
++    const uint8_t program_count,
++    const uint8_t terminal_count,
++    const uint8_t *program_needs_extension,
++    const uint8_t *program_dependencies,
++    const uint8_t *terminal_dependencies,
++    const ia_css_terminal_type_t *terminal_type,
++    const uint16_t *cached_in_param_section_count,
++    const uint16_t *cached_out_param_section_count,
++    const uint16_t *spatial_param_section_count,
++    const uint16_t *fragment_param_section_count,
++    const uint16_t *sliced_in_param_section_count,
++    const uint16_t *sliced_out_param_section_count,
++    const uint16_t *kernel_fragment_seq_count,
++    const uint16_t *progctrlinit_load_section_counts,
++    const uint16_t *progctrlinit_connect_section_counts);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_group_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..dc79168a38d7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.hsys.user.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.hsys.user.h
++ *
++ * Define the methods on the program group manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>    /* bool */
++
++/*! Print the program group manifest object to file/stream
++    in textual format
++
++ @param    manifest[in]        program group manifest object
++ @param    fid[out]        file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_manifest_print(
++    const ia_css_program_group_manifest_t *manifest,
++    void *fid);
++
++/*! Read the program group manifest object from file/stream
++  in binary format.
++
++ @see ia_css_program_group_manifest_write()
++
++ @param    fid[in]            file/stream handle
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
++    void *fid);
++
++/*! Write the program group manifest object to file/stream
++  in binary format
++
++ @see ia_css_program_group_manifest_read()
++
++ @param    manifest[in]        program group manifest object
++ @param    fid[out]        file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_manifest_write(
++    const ia_css_program_group_manifest_t *manifest,
++    void *fid);
++
++/*! Boolean test if the program group manifest is valid
++
++ @param    manifest[in]        program group manifest
++
++ @return true if program group manifest is correct, false on error
++ */
++extern bool ia_css_is_program_group_manifest_valid(
++    const ia_css_program_group_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
+new file mode 100644
+index 000000000000..98d6a0235f3d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest.sim.h
+@@ -0,0 +1,131 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.sim.h
++ *
++ * Define the methods on the program group manifest object: Simulation only
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>    /* uint8_t */
++#include "ia_css_terminal_defs.h"
++
++/*! Create a program group manifest object from specification
++
++ @param    specification[in]        specification (index)
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
++    const unsigned int specification);
++
++/*! Destroy the program group manifest object
++
++ @param    manifest[in]            program group manifest
++
++ @return NULL
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
++    ia_css_program_group_manifest_t            *manifest);
++
++/*! Compute the size of storage required for allocating
++ * the program group (PG) manifest object
++
++ @param    program_count[in]            Number of programs in the PG
++ @param    terminal_count[in]            Number of terminals on the PG
++ @param program_needs_extension[in]        Array[program count]
++ @param    program_dependency_count[in]        Array[program_count] with the PG
++ @param    terminal_dependency_count[in]        Array[program_count] with the
++                        terminal dependencies
++ @param    terminal_type[in]            Array[terminal_count] with the
++                        terminal type
++ @param    cached_in_param_section_count[in]    Number of parameter
++                        in terminal sections
++ @param    cached_out_param_section_count[in]    Number of parameter
++                        out terminal sections
++ @param    sliced_param_section_count[in]        Array[sliced_terminal_count]
++                        with sections per
++                        sliced in terminal
++ @param    sliced_out_param_section_count[in]    Array[sliced_terminal_count]
++                        with sections per
++                        sliced out terminal
++ @param    spatial_param_section_count[in]        Array[spatial_terminal_count]
++                        with sections per
++                        spatial terminal
++ @param    fragment_param_section_count[in]    Number of fragment parameter
++                        sections of the
++                        program init terminal,
++ @param    kernel_fragment_seq_count[in]        Number of
++                        kernel_fragment_seq_count.
++ @param    progctrlinit_load_section_counts[in]    Number of progctrinit load
++                        sections (size of array is program_count)
++ @param    progctrlinit_connect_section_counts[in]    Number of progctrinit connect
++                        sections (size of array is program_count)
++ @return 0 on error
++ */
++size_t ia_css_sizeof_program_group_manifest(
++    const uint8_t            program_count,
++    const uint8_t            terminal_count,
++    const uint8_t            *program_needs_extension,
++    const uint8_t            *program_dependency_count,
++    const uint8_t            *terminal_dependency_count,
++    const ia_css_terminal_type_t    *terminal_type,
++    const uint16_t            *cached_in_param_section_count,
++    const uint16_t            *cached_out_param_section_count,
++    const uint16_t            *spatial_param_section_count,
++    const uint16_t            *fragment_param_section_count,
++    const uint16_t            *sliced_param_section_count,
++    const uint16_t            *sliced_out_param_section_count,
++    const uint16_t            *kernel_fragment_seq_count,
++    const uint16_t            *progctrlinit_load_section_counts,
++    const uint16_t            *progctrlinit_connect_section_counts);
++
++/*! Create (the storage for) the program group manifest object
++
++ @param    program_count[in]        Number of programs in the program group
++ @param    terminal_count[in]        Number of terminals on the program group
++ @param    program_dependency_count[in]    Array[program_count] with the
++                    program dependencies
++ @param    terminal_dependency_count[in]    Array[program_count] with the
++                    terminal dependencies
++ @param    terminal_type[in]        Array[terminal_count] with the
++                    terminal type
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
++    const uint8_t            program_count,
++    const uint8_t            terminal_count,
++    const uint8_t            *program_dependency_count,
++    const uint8_t            *terminal_dependency_count,
++    const ia_css_terminal_type_t    *terminal_type);
++
++/*! Free (the storage of) the program group manifest object
++
++ @param    manifest[in]            program group manifest
++
++ @return NULL
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
++    ia_css_program_group_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
+new file mode 100644
+index 000000000000..e86ff93995e6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_manifest_impl.h
+@@ -0,0 +1,417 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
++
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_kernel_bitmap.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_psys_private_pg_data.h"
++#include <vied_nci_psys_system_global.h>    /* Safer bit mask functions */
++#include "ia_css_psys_static_trace.h"
++#include "ia_css_rbm_manifest_types.h"
++#include <error_support.h>
++#include <assert_support.h>
++#include <misc_support.h>
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_program_group_manifest_get_size(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    size_t size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_size(): enter:\n");
++
++    if (manifest != NULL) {
++        size = manifest->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_size invalid argument\n");
++    }
++    return size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_ID_t
++ia_css_program_group_manifest_get_program_group_ID(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        id = manifest->ID;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
++    }
++    return id;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_program_group_manifest_set_program_group_ID(
++    ia_css_program_group_manifest_t *manifest,
++    ia_css_program_group_ID_t id)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->ID = id;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_program_group_manifest_set_alignment(
++    ia_css_program_group_manifest_t *manifest,
++    const uint8_t alignment)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_set_alignment(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->alignment = alignment;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_set_alignment invalid argument\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_alignment(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    uint8_t alignment = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_alignment(): enter:\n");
++
++    if (manifest != NULL) {
++        alignment = manifest->alignment;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_alignment invalid argument\n");
++    }
++    return alignment;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++void *ia_css_program_group_manifest_get_private_data(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    void *private_data = NULL;
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_private_data(%p): enter:\n",
++        manifest);
++
++    verifexit(manifest != NULL);
++
++    private_data = (void *)((const char *)manifest +
++                manifest->private_data_offset);
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_private_data invalid argument\n");
++    }
++    return private_data;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    ia_css_rbm_manifest_t *rbm_manifest = NULL;
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
++        manifest);
++
++    verifexit(manifest != NULL);
++
++    rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
++                manifest->rbm_manifest_offset);
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
++    }
++    return rbm_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_manifest_t *
++ia_css_program_group_manifest_get_prgrm_mnfst(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int program_index)
++{
++    ia_css_program_manifest_t *prg_manifest_base;
++    uint8_t *program_manifest = NULL;
++    uint8_t program_count;
++    unsigned int i;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
++        manifest, program_index);
++
++    program_count =
++        ia_css_program_group_manifest_get_program_count(manifest);
++
++    verifexit(manifest != NULL);
++    verifexit(program_index < program_count);
++
++    prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
++        manifest->program_manifest_offset);
++    if (program_index < program_count) {
++        program_manifest = (uint8_t *)prg_manifest_base;
++        for (i = 0; i < program_index; i++) {
++            program_manifest += ((ia_css_program_manifest_t *)
++                    program_manifest)->size;
++        }
++    }
++
++EXIT:
++    if (NULL == manifest || program_index >= program_count) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
++    }
++    return (ia_css_program_manifest_t *)program_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_data_terminal_manifest_t *
++ia_css_program_group_manifest_get_data_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
++        manifest, (int)terminal_index);
++
++    terminal_manifest =
++        ia_css_program_group_manifest_get_term_mnfst(manifest,
++            terminal_index);
++
++    verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
++
++    data_terminal_manifest =
++        (ia_css_data_terminal_manifest_t *)terminal_manifest;
++EXIT:
++    return data_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
++        manifest, (int)terminal_index);
++
++    terminal_manifest =
++        ia_css_program_group_manifest_get_term_mnfst(manifest,
++            terminal_index);
++
++    verifexit(ia_css_is_terminal_manifest_parameter_terminal(
++            terminal_manifest));
++    param_terminal_manifest =
++        (ia_css_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++    return param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_spatial_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_spatial_param_terminal_manifest_t *
++        spatial_param_terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
++        manifest, (int)terminal_index);
++
++    terminal_manifest =
++        ia_css_program_group_manifest_get_term_mnfst(manifest,
++            terminal_index);
++
++    verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
++            terminal_manifest));
++
++    spatial_param_terminal_manifest =
++        (ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++    return spatial_param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_sliced_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_sliced_param_terminal_manifest_t *
++        sliced_param_terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
++        manifest, (int)terminal_index);
++
++    terminal_manifest =
++        ia_css_program_group_manifest_get_term_mnfst(manifest,
++            terminal_index);
++
++    verifexit(ia_css_is_terminal_manifest_sliced_terminal(
++            terminal_manifest));
++
++    sliced_param_terminal_manifest =
++        (ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++    return sliced_param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_terminal_manifest_t *
++ia_css_program_group_manifest_get_program_terminal_manifest(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
++        manifest, (int)terminal_index);
++
++    terminal_manifest =
++        ia_css_program_group_manifest_get_term_mnfst(manifest,
++            terminal_index);
++
++    verifexit(ia_css_is_terminal_manifest_program_terminal(
++            terminal_manifest));
++
++    program_terminal_manifest =
++        (ia_css_program_terminal_manifest_t *)terminal_manifest;
++ EXIT:
++    return program_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_manifest_t *
++ia_css_program_group_manifest_get_term_mnfst(
++    const ia_css_program_group_manifest_t *manifest,
++    const unsigned int terminal_index)
++{
++    ia_css_terminal_manifest_t *terminal_manifest = NULL;
++    ia_css_terminal_manifest_t *terminal_manifest_base;
++    uint8_t terminal_count;
++    uint8_t i = 0;
++    uint32_t offset;
++
++    IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
++        manifest, (int)terminal_index);
++
++    verifexit(manifest != NULL);
++
++    terminal_count =
++        ia_css_program_group_manifest_get_terminal_count(manifest);
++
++    verifexit(terminal_index < terminal_count);
++
++    terminal_manifest_base =
++        (ia_css_terminal_manifest_t *)((char *)manifest +
++        manifest->terminal_manifest_offset);
++    terminal_manifest = terminal_manifest_base;
++    while (i < terminal_index) {
++        offset =
++        (uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
++        terminal_manifest = (ia_css_terminal_manifest_t *)
++                ((char *)terminal_manifest + offset);
++        i++;
++    }
++EXIT:
++    return terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_program_count(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    uint8_t program_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_program_count(): enter:\n");
++
++    if (manifest != NULL) {
++        program_count = manifest->program_count;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_program_count invalid argument\n");
++    }
++    return program_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_terminal_count(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    uint8_t terminal_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_terminal_count(): enter:\n");
++
++    if (manifest != NULL) {
++        terminal_count = manifest->terminal_count;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_terminal_count invalid argument\n");
++    }
++    return terminal_count;
++}
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
+new file mode 100644
+index 000000000000..04c826a3164b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_group_private.h
+@@ -0,0 +1,278 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
++
++#include "ia_css_psys_manifest_types.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_kernel_bitmap.h"
++#include "ia_css_program_group_data.h"
++#include "vied_nci_psys_resource_model.h"
++#include "ia_css_rbm_manifest_types.h"
++#include <type_support.h>
++#include <math_support.h>
++#include <platform_support.h>
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
++    ((IA_CSS_KERNEL_BITMAP_BITS) \
++    + (IA_CSS_PROGRAM_GROUP_ID_BITS) \
++    + (5 * IA_CSS_UINT16_T_BITS) \
++    + (5 * IA_CSS_UINT8_T_BITS) \
++    + (5 * IA_CSS_UINT8_T_BITS))
++
++/** @brief Meta-data for a program group
++ *
++ * Describes the contents and layout of the program group
++ * components in memory.
++ *
++ * Offsets are relative to the base address of the program group
++ * manifest object.
++ */
++struct ia_css_program_group_manifest_s {
++    /** Indicate kernels are present in this program group */
++    ia_css_kernel_bitmap_t kernel_bitmap;
++    /** Referral ID to program group FW */
++    ia_css_program_group_ID_t ID;
++    /** Offset to program manifest list.  One entry for each program. */
++    uint16_t program_manifest_offset;
++    /** Offset to terminal manifest list.  One entry for each terminal. */
++    uint16_t terminal_manifest_offset;
++    /** Offset to private data (not part of the official API) */
++    uint16_t private_data_offset;
++    /** Offset to RBM manifest */
++    uint16_t rbm_manifest_offset;
++    /** Size of this structure */
++    uint16_t size;
++    /** Storage alignment requirement (in uint8_t) */
++    uint8_t alignment;
++    /** Total number of kernels in this program group */
++    uint8_t kernel_count;
++    /** Total number of program in this program group */
++    uint8_t program_count;
++    /** Total number of terminals on this program group */
++    uint8_t terminal_count;
++    /** Total number of independent subgraphs in this program group */
++    uint8_t subgraph_count;
++    /** Padding; esnures that rbm_manifest starts on 64bit alignment */
++    uint8_t reserved[5];
++};
++
++#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
++    ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++    + (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
++    + (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
++    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
++    + (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
++    + (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
++    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
++
++/** "Extended" meta-data for a single program
++ *
++ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
++ */
++struct ia_css_program_manifest_ext_s {
++#if VIED_NCI_N_DEV_DFM_ID > 0
++    /** DFM port allocation of this program */
++    vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++    /** Active DFM ports which need a kick
++     * If an empty port is configured to run in active mode, the empty
++     * port and the corresponding full port(s) in the stream must be kicked.
++     * The empty port must always be kicked after the full port.
++     */
++    vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++    /** (external) Memory allocation size needs of this program */
++    vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
++    vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if VIED_NCI_N_DEV_CHN_ID > 0
++    /** Device channel allocation size needs of this program */
++    vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
++    vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
++#endif
++#if VIED_NCI_N_DEV_DFM_ID > 0
++    /** DFM ports are relocatable if value is set to 1.
++     * The flag is per dfm port type.
++     * This will not be supported for now.
++     */
++    uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++    /** DEC compression flush service entry, describing which streams
++     *  require flush service handling for decompression (input).
++     *  @note stream ID's are the ID's used by the MMU
++     */
++    uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
++    /** Association of streams in dec_resources_input with the terminal
++     *  they belong to.
++     */
++    uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
++#endif
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++    /** DEC compression flush service entry, describing which streams
++     *  require flush service handling for compression (output).
++     *  @note stream ID's are the ID's used by the MMU
++     */
++    uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
++    /** Association of streams in dec_resources_output with the terminal
++     *  they belong to.
++     */
++    uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
++#endif
++/** Padding bytes for 32bit alignment*/
++#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
++    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
++#endif
++};
++
++#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
++    (IA_CSS_KERNEL_BITMAP_BITS \
++    + IA_CSS_PROGRAM_ID_BITS \
++    + IA_CSS_PROGRAM_TYPE_BITS \
++    + (1 * IA_CSS_UINT16_T_BITS) \
++    + (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
++    + (VIED_NCI_RESOURCE_ID_BITS) \
++    + (6 * IA_CSS_UINT8_T_BITS) \
++    + (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
++
++/** Meta-data for a single program
++ *
++ * This structure contains only the information required for resource
++ * management and construction of the process group.
++ */
++struct ia_css_program_manifest_s {
++    /** Indicate which kernels lead to this program being used */
++    ia_css_kernel_bitmap_t kernel_bitmap;
++    /** offset to add to reach parent. This is negative value.*/
++    int16_t parent_offset;
++    uint8_t program_dependency_offset;
++    uint8_t terminal_dependency_offset;
++    /** Size of this structure */
++    uint8_t size;
++    /** offset to ia_css_program_manifest_ext_s, 0 if there is none */
++    uint8_t program_extension_offset;
++    /** Specification of for exclusive or parallel programs */
++    uint8_t program_type; /* ia_css_program_type_t */
++    /** Referral ID to a specific program FW, valid ID's != 0 */
++    ia_css_program_ID_t ID;
++    /** Array of all the cells this program needs */
++    vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
++    /** (exclusive) indication of a cell type to be used by this program */
++    vied_nci_resource_id_t cell_type_id;
++    /** Number of programs this program depends on */
++    uint8_t program_dependency_count;
++    /** Number of terminals this program depends on */
++    uint8_t terminal_dependency_count;
++    /** Padding bytes for 32bit alignment*/
++#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
++    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
++#endif
++};
++
++/*
++ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
++ */
++#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    + IA_CSS_FRAME_FORMAT_BITMAP_BITS \
++    + IA_CSS_CONNECTION_BITMAP_BITS \
++    + IA_CSS_KERNEL_BITMAP_BITS \
++    + (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
++    + IA_CSS_UINT16_T_BITS \
++    + IA_CSS_UINT8_T_BITS \
++    + (4*IA_CSS_UINT8_T_BITS))
++
++/** Meta-data specific for a data terminal
++ *
++ * Contains mostly capability and constraints information
++ */
++struct ia_css_data_terminal_manifest_s {
++    /** Data terminal base */
++    ia_css_terminal_manifest_t base;
++    /** Supported (4CC / MIPI / parameter) formats */
++    ia_css_frame_format_bitmap_t frame_format_bitmap;
++    /** Indicate which kernels lead to this terminal being used */
++    ia_css_kernel_bitmap_t kernel_bitmap;
++    /** Minimum size of the frame */
++    uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
++    /** Maximum size of the frame */
++    uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
++    /** Minimum size of a fragment that the program port can accept */
++    uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
++    /** Maximum size of a fragment that the program port can accept */
++    uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
++    /** Indicate if this terminal is derived from a principal terminal
++     *  @note Can't find meaningful use of this field. */
++    uint16_t terminal_dependency;
++    /** Indicate what (streaming) interface types this terminal supports */
++    ia_css_connection_bitmap_t connection_bitmap;
++    /** Indicates if compression is supported on the data associated with
++     * this terminal. '1' indicates compression is supported,
++     * '0' otherwise
++     */
++    uint8_t compression_support;
++    uint8_t reserved[4];
++};
++
++/* ============  Program Control Init Terminal Manifest - START ============ */
++#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
++struct ia_css_program_control_init_manifest_program_desc_s {
++    uint16_t load_section_count;
++    uint16_t connect_section_count;
++    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
++};
++
++#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
++/** Meta-data specific for a program control init terminal
++ *
++ * Program control init terminals have parameters related
++ * to system device (i.e. non-algorithmic devices, like DMA's)
++ * configuration.
++ */
++struct ia_css_program_control_init_terminal_manifest_s {
++    ia_css_terminal_manifest_t base;
++    /** Number of programs in program group.  This terminal can contain
++     * parameters for each program.  Also size of the array at program_desc_offset.
++    */
++    uint32_t program_count;
++    /**
++     * Points to array of ia_css_program_control_init_manifest_program_desc_t
++     * with size program_count.  The descriptor describes the format of the
++     * parameter payload, which is sent separately.
++     */
++    uint16_t program_desc_offset;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
++};
++/* ============  Program Control Init Terminal Manifest - END ============ */
++
++extern void ia_css_program_manifest_init(
++    ia_css_program_manifest_t    *blob,
++    const uint8_t    program_needs_extension,
++    const uint8_t    program_dependency_count,
++    const uint8_t    terminal_dependency_count);
++
++/** @} */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
+new file mode 100644
+index 000000000000..db426f95c3a4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.h
+@@ -0,0 +1,679 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.h
++ *
++ * Define the methods on the program manifest object that are not part of a
++ * single interface.
++ *
++ * @note The "set" functions here are for testing simulation only.
++ * Real manifests are generated in advance and must be considered read-only from
++ * the production user's perspective.
++ */
++
++#include "ia_css_psys_static_storage_class.h"
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>            /* uint8_t */
++
++#include <ia_css_psys_program_manifest.sim.h>
++
++#include <ia_css_psys_program_manifest.hsys.user.h>
++
++#include <ia_css_kernel_bitmap.h>        /* ia_css_kernel_bitmap_t */
++
++/*
++ * Resources needs
++ */
++#include <ia_css_psys_program_manifest.hsys.kernel.h>
++
++#define IA_CSS_PROGRAM_INVALID_DEPENDENCY    ((uint8_t)(-1))
++#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG    ((uint8_t)(-1))
++
++/** Retrieve extended manifest information generally not visible
++ *  to the SW stack
++ *
++ *  @see ia_css_program_manifest_ext_t
++ *  @note Function only to be used in FW
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
++
++/*! Check if the program manifest object specifies a fixed cell allocation
++
++ @param    manifest[in]            program manifest object
++
++ @return has_fixed_cell, false on invalid argument
++ */
++extern bool ia_css_has_program_manifest_fixed_cell(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the stored size of the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_program_manifest_get_size(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the program ID of the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Set the program ID of the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @param program ID
++
++ @return 0 on success, -1 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_program_ID(
++    ia_css_program_manifest_t            *manifest,
++    ia_css_program_ID_t id);
++
++/*! Get the (pointer to) the program *group* manifest which contains
++ * this program manifest
++
++ @param    manifest[in]            program manifest object
++
++ @return the pointer to the parent, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Set the offset to the beginning of the program *group* manifest
++ * which contains this program manifest
++
++ @param    manifest[in]            program manifest object
++ @param    program_offset[in]        this program's offset from
++                    program_group_manifest's base address.
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_parent_offset(
++    ia_css_program_manifest_t            *manifest,
++    int32_t program_offset);
++
++/*! Get the type of the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
++    argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_type_t ia_css_program_manifest_get_type(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Set the type of the program manifest object
++
++ @param    manifest[in]            program manifest object
++ @param    program_type[in]        program type
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_type(
++    ia_css_program_manifest_t            *manifest,
++    const ia_css_program_type_t            program_type);
++
++/*! Set the cell id of the program manifest object
++
++ @param    manifest[in]            program manifest object
++ @param    program_cell_id[in]        program cell id
++
++ @return < 0 on invalid manifest argument
++  */
++extern int ia_css_program_manifest_set_cell_ID(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_cell_ID_t            cell_id);
++
++/*! Set the cell type of the program manifest object
++
++ @param    manifest[in]            program manifest object
++ @param    program_cell_type[in]        program cell type
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_cell_type_ID(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_cell_type_ID_t            cell_type_id);
++
++/*!
++ * Get input terminal id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ *
++ * @return registered terminal_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_input_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                   idx);
++
++/*!
++ * Get output terminal id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ *
++ * @return registered terminal_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_output_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                    idx);
++
++/*!
++ * Set output terminal id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ * @param    val[in]            value
++ *
++ */
++extern void ia_css_program_manifest_set_output_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    uint8_t                    idx,
++    uint8_t                    val);
++
++/*!
++ * Set input terminal id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ * @param    val[in]            value
++ *
++ */
++extern void ia_css_program_manifest_set_input_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    uint8_t                    idx,
++    uint8_t                    val);
++
++/*!
++ * Get compression input MMU stream id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ *
++ * @return registered stream_id for idx
++ */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_input_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                   idx);
++
++/*!
++ * Get compression output MMU stream id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ *
++ * @return registered stream_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_output_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                    idx);
++
++/*!
++ * Set compression output MMU stream id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ * @param    val[in]            value
++ *
++ */
++extern void ia_css_program_manifest_set_output_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    uint8_t                    idx,
++    uint8_t                    val);
++
++/*!
++ * Set *compression* input MMU stream id [val] at [idx]
++ *
++ * @param    manifest[in]        program manifest object
++ * @param    idx[in]            index
++ * @param    val[in]            value
++ *
++ */
++extern void ia_css_program_manifest_set_input_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    uint8_t                    idx,
++    uint8_t                    val);
++
++/*! Set cells bitmap for the program
++
++ @param    manifest[in]            program manifest object
++ @param    bitmap[in]                bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_cells_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_resource_bitmap_t    bitmap);
++
++/*! Get cells bitmap for the program
++
++ @param    manifest[in]            program manifest object
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Set DFM port bitmap for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++ @param    bitmap[in]                bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_dfm_port_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id,
++    const vied_nci_resource_bitmap_t    bitmap);
++#if HAS_DFM
++/*! Get bitmap of DFM ports requested for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++
++ @return DFM port bitmap
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id);
++#endif
++
++/*! Set active DFM port specification bitmap for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++ @param    bitmap[in]                bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id,
++    const vied_nci_resource_bitmap_t    bitmap);
++
++#if HAS_DFM
++/*! Get active DFM port specification bitmap for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id);
++#endif
++
++/*! Set DFM device relocatability specification for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++ @param is_relocatable[in]        1 if dfm device ports are relocatable, 0 otherwise
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_is_dfm_relocatable(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id,
++    const uint8_t                        is_relocatable);
++
++#if HAS_DFM
++/*! Get DFM device relocatability specification for the program
++
++ @param    manifest[in]            program manifest object
++ @param    dfm_type_id[in]            DFM resource type ID
++
++ @return 1 if dfm device ports are relocatable, 0 otherwise
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t            dfm_type_id);
++#endif
++
++/*! Get the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type ID
++
++ @return 0 when not applicable and/or invalid arguments
++
++ @deprecated Implementation is trival (returns 0) and
++ no known users or known intention for future use.
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id);
++
++/*! Set the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type id
++ @param    int_mem_size[in]        internal memory size
++
++ @return < 0 on invalid arguments
++ @deprecated see ia_css_program_manifest_get_int_mem_size()
++ */
++extern int ia_css_program_manifest_set_int_mem_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            int_mem_size);
++
++/*! Get the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type ID
++
++ @return 0 when not applicable and/or invalid arguments
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id);
++
++/*! Set the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type id
++ @param    ext_mem_size[in]        external memory size
++
++ @return < 0 on invalid arguments
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++ */
++extern int ia_css_program_manifest_set_ext_mem_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            ext_mem_size);
++
++#if HAS_DFM
++/*! Get a device channel resource (size) specification
++
++ @param    manifest[in]            program manifest object
++ @param    dev_chn_id[in]            device channel ID
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t            dev_chn_id);
++#endif
++
++/*! Set a device channel resource (size) specification
++
++ @param    manifest[in]            program manifest object
++ @param    dev_chn_id[in]            device channel ID
++ @param    dev_chn_size[in]        device channel size
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_dev_chn_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t            dev_chn_id,
++    const vied_nci_resource_size_t            dev_chn_size);
++
++/*! Set a device channel resource (offset) specification
++
++ @param    manifest[in]            program manifest object
++ @param    dev_chn_id[in]            device channel ID
++ @param    dev_chn_offset[in]        device channel offset
++
++ @see ia_css_program_manifest_get_dev_chn_offset()
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_dev_chn_offset(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t            dev_chn_id,
++    const vied_nci_resource_size_t            dev_chn_offset);
++
++/*! Set the memory resource (offset) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type id
++ @param    ext_mem_offset[in]        external memory offset
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_ext_mem_offset(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            ext_mem_offset);
++
++#if HAS_DFM
++/*! Get a device channel resource (offset) specification
++
++ Used to define a resource dependency on devices that support
++ parallel users via channel multiplexing within the device.
++
++ Channel resources can be "relocatable". That is, some channel
++ is required, but the exact channel is not important and
++ can be assigned at runtime.
++
++ Other channel resources are static "fixed" in advance.  Either
++ each channel is customized for a particular need such that
++ the exact channel needs to be specified.  Alternatively, there
++ are enough channels resources available for the worst case
++ system requirement such that the channels can be statically
++ assigned in advance "fixed" channels.
++
++ Both kinds of resource dependency specification are supported here.
++
++ @param    manifest[in]            program manifest object
++ @param    dev_chn_id[in]            device channel ID
++
++ @return Valid fixed offset (if value is greater or equal to 0) or
++  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
++  is relocatable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t                dev_chn_id);
++#endif
++
++/*! Get the memory resource (offset) specification for a memory
++ that does not belong to the cell where the program will be mapped.
++
++ Memory specified here is typically SRAM within IPU used for
++ intermediate storage during data transfer between processing
++ stages/main memory or as computation scratch space.
++
++ The offset specified essentially defines the location of the memory
++ within the memory device.  It can be fixed in advance (static allocation)
++ or left to the system to determine at runtime.
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type ID
++
++ @return Valid fixed offset (if value is greater or equal to 0) or
++  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
++  is relocatable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id);
++
++/*! Get the kernel composition of the program manifest object
++
++  The collection of kernels described in the bitmap is defined
++  at the program group level. This function returns the subset
++  of kernels that are part of this program.
++ @param    manifest[in]            program manifest object
++
++ @return bitmap, 0 on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Set the kernel dependency of the program manifest object
++
++ @param    manifest[in]            program manifest object
++ @param    kernel_bitmap[in]        kernel composition bitmap
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_kernel_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const ia_css_kernel_bitmap_t            kernel_bitmap);
++
++/*! Get the number of programs this programs depends on from the program group
++ * manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program dependency count
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_program_dependency_count(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the index of the program which the programs at this index depends on
++    from the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program dependency,
++    IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
++    */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_program_dependency(
++    const ia_css_program_manifest_t            *manifest,
++    const unsigned int                index);
++
++/*! Set the index of the program which the programs at this index depends on
++    in the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program dependency
++ */
++extern int ia_css_program_manifest_set_program_dependency(
++    ia_css_program_manifest_t            *manifest,
++    const uint8_t                    program_dependency,
++    const unsigned int                index);
++
++/*! Get the number of terminals this programs depends on from the program group
++ * manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return program dependency count
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_terminal_dependency_count(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the index of the terminal which the programs at this index depends on
++    from the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_terminal_dependency(
++    const ia_css_program_manifest_t            *manifest,
++    const unsigned int                index);
++
++/*! Set the index of the terminal which the programs at this index depends on
++    in the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_terminal_dependency(
++    ia_css_program_manifest_t            *manifest,
++    const uint8_t                    terminal_dependency,
++    const unsigned int                index);
++
++/*! Check if the program manifest object specifies a subnode program
++
++ @param    manifest[in]            program manifest object
++
++ @return is_subnode, false on invalid argument
++ @deprecated for IPU7
++ */
++extern bool ia_css_is_program_manifest_subnode_program_type(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Check if the program manifest object specifies a supernode program
++
++ @param    manifest[in]            program manifest object
++
++ @return is_supernode, false on invalid argument
++ @deprecated for IPU7
++ */
++extern bool ia_css_is_program_manifest_supernode_program_type(
++    const ia_css_program_manifest_t            *manifest);
++/*! Check if the program manifest object specifies a singular program
++
++ @param    manifest[in]            program manifest object
++
++ @return is_singular, false on invalid argument
++ @deprecated for IPU7
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_program_manifest_singular_program_type(
++    const ia_css_program_manifest_t            *manifest);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
+new file mode 100644
+index 000000000000..30e31d22579b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.kernel.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.hsys.kernel.h
++ *
++ * Define the methods on the program manifest object: Hsys kernel interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>                    /* uint8_t */
++#include "ia_css_psys_static_storage_class.h"
++
++/*
++ * Resources needs
++ */
++
++/*! Get the cell ID from the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ Note: If the cell ID is specified, the program this manifest belongs to
++ must be mapped on that instance. If the cell ID is invalid (limit value)
++ then the cell type ID must be specified instead
++
++ @return cell ID, limit value if not specified
++ */
++extern
++vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the cell type ID from the program manifest object
++
++ @param    manifest[in]            program manifest object
++
++ Note: If the cell type ID is specified, the program this manifest belongs
++ to can be mapped on any instance of this clee type. If the cell type ID is
++ invalid (limit value) then a specific cell ID must be specified instead
++
++ @return cell ID, limit value if not specified
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
++    const ia_css_program_manifest_t            *manifest);
++
++/*! Get the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id);
++
++/*! Get the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param    manifest[in]            program manifest object
++ @param    mem_type_id[in]            mem type ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id);
++
++#if HAS_DFM
++/*! Get a device channel resource (size) specification
++
++ @param    manifest[in]            program manifest object
++ @param    dev_chn_id[in]            device channel ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++    const ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t                dev_chn_id);
++#endif
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..12a777003226
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.hsys.user.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.hsys.user.h
++ *
++ * Define the methods on the program manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++/*! Print the program manifest object to file/stream
++    in textual format
++
++ @param    manifest[in]            program manifest object
++ @param    fid[out]                file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_manifest_print(
++    const ia_css_program_manifest_t    *manifest,
++    void                *fid);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
+new file mode 100644
+index 000000000000..50ecd3ee8611
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest.sim.h
+@@ -0,0 +1,65 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.sim.h
++ *
++ * Define the methods on the program manifest object: Simulation only
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>    /* uint8_t */
++
++/*! Compute the size of storage required for allocating
++ * the program manifest object
++
++ @param program_needs_extension[in]    ==1 if program manifest needs an extension struct
++ @param    program_dependency_count[in]    Number of programs this one depends on
++ @param    terminal_dependency_count[in]    Number of terminals this one depends on
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_program_manifest(
++    const uint8_t    program_needs_extension,
++    const uint8_t    program_dependency_count,
++    const uint8_t    terminal_dependency_count);
++
++/*! Create (the storage for) the program manifest object
++
++ @param    program_dependency_count[in]    Number of programs this one depends on
++ @param    terminal_dependency_count[in]    Number of terminals this one depends on
++
++ @return NULL on error
++ */
++extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
++    const uint8_t    program_dependency_count,
++    const uint8_t    terminal_dependency_count);
++
++/*! Destroy (the storage of) the program manifest object
++
++ @param    manifest[in]            program manifest
++
++ @return NULL
++ */
++extern ia_css_program_manifest_t *ia_css_program_manifest_free(
++    ia_css_program_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
+new file mode 100644
+index 000000000000..04803a3812e3
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_program_manifest_impl.h
+@@ -0,0 +1,577 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
++
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
++#include <ia_css_kernel_bitmap.h>
++
++#include <vied_nci_psys_system_global.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_psys_static_trace.h"
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <storage_class.h>
++#include <math_support.h>
++
++/** Function only to be used in FW */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
++{
++    DECLARE_ERRVAL
++    verifexitval(program != NULL, EFAULT);
++    if (program->program_extension_offset != 0) {
++        return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_extension invalid argument\n");
++    }
++    return NULL;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_mem_type_ID_t     mem_type_id)
++{
++    (void)manifest;
++    (void)mem_type_id;
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++                   "ia_css_program_manifest_get_int_mem_size always returns 0"
++                   "(internally memory feature not used).\n");
++    return 0;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_input_terminal_id(
++    ia_css_program_manifest_t *manifest,
++    unsigned char              idx)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++EXIT:
++    if (!noerror()) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++    return manifest_ext->dec_resources_input_terminal[idx];
++#else
++    (void) idx;
++    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_output_terminal_id(
++    ia_css_program_manifest_t *manifest,
++    unsigned char              idx)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++EXIT:
++    if (!noerror()) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++    return manifest_ext->dec_resources_output_terminal[idx];
++#else
++    (void) idx;
++    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_input_stream_id(
++    ia_css_program_manifest_t  *manifest,
++    unsigned char               idx)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_input_stream_id(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++EXIT:
++    if (!noerror()) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++    return manifest_ext->dec_resources_input[idx];
++#else
++    (void) idx;
++    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_output_stream_id(
++    ia_css_program_manifest_t *manifest,
++    unsigned char              idx)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_output_stream_id(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++EXIT:
++    if (!noerror()) {
++        return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++    }
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++    return manifest_ext->dec_resources_output[idx];
++#else
++    (void) idx;
++    return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_dev_dfm_id_t      dfm_type_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
++        return 0;
++    }
++    return manifest_ext->is_dfm_relocatable[dfm_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
++    const ia_css_program_manifest_t  *manifest,
++    const vied_nci_dev_dfm_id_t       dfm_type_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
++        return 0;
++    }
++    return manifest_ext->dfm_port_bitmap[dfm_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
++    const ia_css_program_manifest_t  *manifest,
++    const vied_nci_dev_dfm_id_t       dfm_type_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
++        return 0;
++    }
++    return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_mem_type_ID_t     mem_type_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
++        return 0;
++    }
++    return manifest_ext->ext_mem_size[mem_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_mem_type_ID_t     mem_type_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
++         return 0;
++    }
++    return manifest_ext->ext_mem_offset[mem_type_id];
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_dev_chn_ID_t      dev_chn_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_dev_chn_size(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
++        return 0;
++    }
++    return manifest_ext->dev_chn_size[dev_chn_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
++    const ia_css_program_manifest_t *manifest,
++    const vied_nci_dev_chn_ID_t      dev_chn_id)
++{
++    DECLARE_ERRVAL
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
++         return 0;
++    }
++    return manifest_ext->dev_chn_offset[dev_chn_id];
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_program_manifest_get_size(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_size(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_size invalid argument\n");
++        return 0;
++    }
++
++    return manifest->size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_program_ID(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_program_ID invalid argument\n");
++        return IA_CSS_PROGRAM_INVALID_ID;
++    }
++    return manifest->ID;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++    char *base = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_parent(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++
++    base = (char *)((char *)manifest + manifest->parent_offset);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_parent invalid argument\n");
++        return NULL;
++    }
++    return (ia_css_program_group_manifest_t *)(base);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_cell_type_ID(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
++        return VIED_NCI_N_CELL_TYPE_ID;
++    }
++    return manifest->cell_type_id;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_type_t ia_css_program_manifest_get_type(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_type(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_type invalid argument\n");
++        return IA_CSS_N_PROGRAM_TYPES;
++    }
++    return manifest->program_type;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_terminal_dependency_count(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
++        return 0;
++    }
++    return manifest->terminal_dependency_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_terminal_dependency(
++    const ia_css_program_manifest_t *manifest,
++    const unsigned int index)
++{
++    DECLARE_ERRVAL
++    uint8_t *terminal_dep_ptr = NULL;
++    uint8_t terminal_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_terminal_dependency(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++    verifexitval(index < terminal_dependency_count, EFAULT);
++
++    terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++            manifest->terminal_dependency_offset + index);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_terminal_dependency invalid argument\n");
++        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
++    }
++    return *terminal_dep_ptr;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_program_manifest_singular_program_type(
++    const ia_css_program_manifest_t *manifest)
++{
++    ia_css_program_type_t        program_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_is_program_manifest_singular_program_type(): enter:\n");
++
++    program_type = ia_css_program_manifest_get_type(manifest);
++
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++    return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_program_dependency_count(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
++        return 0;
++    }
++    return manifest->program_dependency_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_program_dependency(
++    const ia_css_program_manifest_t *manifest,
++    const unsigned int index)
++{
++    DECLARE_ERRVAL
++    uint8_t *program_dep_ptr = NULL;
++    uint8_t program_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_program_dependency(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++
++    verifexitval(index < program_dependency_count, EFAULT);
++    program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
++            manifest->program_dependency_offset +
++            index * sizeof(uint8_t));
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                       "ia_css_program_manifest_get_program_dependency invalid argument\n");
++        return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
++    }
++    return *program_dep_ptr;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++                   "ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
++    verifexitval(manifest != NULL, EFAULT);
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++          "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
++        return ia_css_kernel_bitmap_clear();
++    }
++    return manifest->kernel_bitmap;
++}
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
+new file mode 100644
+index 000000000000..f1ef454e6890
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_SIM_INLINE__
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
+new file mode 100644
+index 000000000000..a5cf6f78aa0e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_sim_trace.h
+@@ -0,0 +1,97 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_SIM_TRACE_H
++#define __IA_CSS_PSYS_SIM_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
++     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_SIM_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_SIM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_SIM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_SIM_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_SIM_TRACE_METHOD    PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_SIM_TRACE_LEVEL_ASSERT    PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_SIM_TRACE_LEVEL_ERROR    PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_SIM_TRACE_LEVEL_WARNING    PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_SIM_TRACE_LEVEL_INFO    PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_SIM_TRACE_LEVEL_DEBUG    PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE    PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
+new file mode 100644
+index 000000000000..b6a4bd600c5b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
+new file mode 100644
+index 000000000000..03c355b350fb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_static_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
++#define __IA_CSS_PSYS_STATIC_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT    PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
++     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
++    PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
++    /* Module/sub-module specific trace setting */
++    #if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_STATIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_STATIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_STATIC_TRACE_METHOD \
++            IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++            IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++            IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_DATA Tracing level defined"
++    #endif
++#else
++    /* Inherit Module trace setting */
++    #define PSYSAPI_STATIC_TRACE_METHOD \
++        PSYSAPI_TRACE_METHOD
++    #define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++        PSYSAPI_TRACE_LEVEL_ASSERT
++    #define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++        PSYSAPI_TRACE_LEVEL_ERROR
++    #define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++        PSYSAPI_TRACE_LEVEL_WARNING
++    #define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++        PSYSAPI_TRACE_LEVEL_INFO
++    #define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++        PSYSAPI_TRACE_LEVEL_DEBUG
++    #define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++        PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
+new file mode 100644
+index 000000000000..1dcb3b3c828f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.h
+@@ -0,0 +1,403 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_H
++#define __IA_CSS_PSYS_TERMINAL_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.h
++ *
++ * Define the methods on the terminal object that are not part of
++ * a single interface
++ */
++
++#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
++#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>        /* bool */
++#include <print_support.h>        /* FILE */
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest_base_types.h"
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_terminal.hsys.user.h>
++
++/*! Boolean test if the terminal object type is input
++
++ @param    terminal[in]            terminal object
++
++ @return true if the terminal is input, false otherwise or on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_input(
++    const ia_css_terminal_t                    *terminal);
++
++/*! Get the stored size of the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return size, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_terminal_get_size(
++    const ia_css_terminal_t                    *terminal);
++
++/*! Get the type of the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return the type of the terminal, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_type_t ia_css_terminal_get_type(
++    const ia_css_terminal_t                    *terminal);
++
++/*! Set the type of the terminal object
++
++ @param    terminal[in]            terminal object
++ @param    terminal_type[in]        type of the terminal
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_type(
++    ia_css_terminal_t        *terminal,
++    const ia_css_terminal_type_t    terminal_type);
++
++/*! Get the index of the terminal manifest object
++
++ @param    terminal[in]            terminal object
++
++ @return the index of the terminal manifest object, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_terminal_get_terminal_manifest_index(
++    const ia_css_terminal_t                    *terminal);
++
++/*! Set the index of the terminal manifest object
++
++ @param    terminal[in]            terminal object
++ @param    tm_index[in]            terminal manifest index
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_terminal_manifest_index(
++    ia_css_terminal_t    *terminal,
++    const uint16_t        tm_index);
++
++/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
++
++ @param    terminal[in]            terminal object
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_terminal_get_payload_size(
++    const ia_css_terminal_t *terminal);
++
++/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
++
++ @param    terminal[in]            terminal object
++ @param    payload_size[in]        Size of buffer that will be supplied to the terminal
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_payload_size(
++    ia_css_terminal_t *terminal,
++    uint32_t payload_size);
++
++/*! Get id of the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_get_ID(
++    const ia_css_terminal_t            *terminal);
++
++/*! Get compressed byte of the data terminal object
++
++ @param    dterminal[in]            data terminal object
++ @param val[out]            is_compressed value
++
++ @@return < 0 on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_is_compressed(
++    const ia_css_data_terminal_t *dterminal,
++    uint8_t *val);
++
++/*! Get kernel id of the data terminal object
++
++ @param    dterminal[in]            data terminal object
++
++ @return kernel id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_get_kernel_id(
++    const ia_css_data_terminal_t            *dterminal);
++
++/*! Get the connection type from the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return buffer type, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
++    const ia_css_data_terminal_t    *dterminal);
++
++/*! Set the connection type of the terminal object
++
++ @param    terminal[in]            terminal object
++ @param    connection_type[in]        connection type
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_connection_type(
++    ia_css_data_terminal_t                *dterminal,
++    const ia_css_connection_type_t            connection_type);
++
++/*! Get link id of the data terminal object
++
++ @param    dterminal[in]            data terminal object
++
++ @return link id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_get_link_id(
++    const ia_css_data_terminal_t            *dterminal);
++
++/*! Set link id of the terminal object
++
++ @param    terminal[in]            data terminal object
++ @param    link_id[in]            synchronization link id
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_link_id(
++    ia_css_data_terminal_t                *dterminal,
++    const uint8_t                    link_id);
++
++/*! Set stream2gen buffer size used in stream to GEN connection
++ * This function should be called, in case we are in streaming use-case, and
++ * we need to configure the stream2gen_buffer_size to be less than full image's height.
++ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
++ * during terminal_create function.
++
++ * @param    terminal[in]            data terminal object
++ * @param    stream2gen_buffer_size[in]        Buffer size (Size's units are lines)
++
++ * @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_stream2gen_buffer_size(
++    ia_css_data_terminal_t *dterminal,
++    const uint16_t stream2gen_buffer_size);
++
++/*! Get the (pointer to) the process group parent of the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return the pointer to the parent, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_t *ia_css_terminal_get_parent(
++    const ia_css_terminal_t                    *terminal);
++
++/*! Set the (pointer to) the process group parent of the terminal object
++
++ @param    terminal[in]    terminal object
++ @param    parent[in]    (pointer to the) process group parent object
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_parent(
++    ia_css_terminal_t    *terminal,
++    ia_css_process_group_t    *parent);
++
++/*! Boolean test if the terminal object type is valid
++
++ @param    terminal[in]            process terminal object
++ @param    terminal_manifest[in]        program terminal manifest
++
++ @return true if the process terminal object is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_valid(
++    const ia_css_terminal_t         *terminal,
++    const ia_css_terminal_manifest_t *terminal_manifest);
++
++/* ================= Program Control Init Terminal - START ================= */
++
++/*!
++ * Gets the program init terminal descripor size
++ * @param manifest[in]        program control init terminal manifest
++ * @param pg_manifest[in]    program group manifest
++ * @param kernel_bitmap[in]    kernel enable bitmap
++ * @return size, error if < 0.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int
++ia_css_program_control_init_terminal_get_descriptor_size(
++    const ia_css_program_control_init_terminal_manifest_t *manifest,
++    const ia_css_program_group_manifest_t *pg_manifest,
++    ia_css_kernel_bitmap_t kernel_bitmap);
++
++/*!
++ * Initialize program control init terminal
++ * @param nof_fragments[in]    Number of fragments
++ * @param terminal[in]        program control init terminal
++ * @param manifest[in]        program control init terminal manifest
++ * @param pg_manifest[in]    program group manifest
++ * @param kernel_bitmap[in]    kernel enable bitmap
++ * @return < 0 on erro
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int
++ia_css_program_control_init_terminal_init(
++    ia_css_program_control_init_terminal_t *terminal,
++    const ia_css_program_control_init_terminal_manifest_t *manifest,
++    const ia_css_program_group_manifest_t *pg_manifest,
++    ia_css_kernel_bitmap_t kernel_bitmap);
++
++/*!
++ * Get a program desc for a program control init terminal
++  * @param terminal[in]        program control init terminal
++ * @param manifest[in]        program control init terminal manifest
++ * @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_program_desc_t *
++ia_css_program_control_init_terminal_get_program_desc(
++    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
++    const unsigned int program_index
++);
++
++/*!
++ * Pretty prints the program control init termnial
++ * @param terminal[in]        program control init terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++void ia_css_program_control_init_terminal_print(
++    const ia_css_program_control_init_terminal_t *terminal);
++
++/*!
++ * Returns the number of connect sections per program
++ * @param program_desc[in] program control init terminal program desc
++ * @return number of connect sections
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
++    const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Returns the number of connect sections per program
++ * @param program_desc[in] program control init terminal program desc
++ * @return number of connect sections
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_load_section_count(
++    const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Returns the memory offset of the first load section in the program
++ * @param program_desc[in] program control init terminal program desc
++ * @return memory offset
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
++    const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Gets a load section desc for a program desc
++ * of a program control init terminal
++ * @param program_desc[in]        program control init terminal program desc
++ * @param load_section_index[in]    section index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_load_section_desc_t *
++ia_css_program_control_init_terminal_get_load_section_desc(
++    const ia_css_program_control_init_program_desc_t *program_desc,
++    const unsigned int load_section_index
++);
++
++/*!
++ * Gets process_id from program desc
++ * of a program control init terminal
++ * @param program_desc[in]        program control init terminal program desc
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
++    const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Set control info of program desc
++ * of a program control init terminal
++ * @param program_desc[in]    program control init terminal program desc
++ * @param process_id         unique process id used to identify the process
++ * among all active process
++ * @param num_done_events     number of events required to close the process
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++void ia_css_program_control_init_terminal_set_control_info(
++    ia_css_program_control_init_program_desc_t *program_desc,
++    ia_css_process_id_t process_id,
++    uint8_t num_done_events);
++
++/*!
++ * Gets num_done_events value from program desc
++ * of a program control init terminal
++ * @param program_desc[in]        program control init terminal program desc
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_program_control_init_terminal_get_num_done_events(
++    const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Gets a connect section desc for a program desc
++ * of a program control init terminal
++ * @param program_desc[in]        program control init terminal program desc
++ * @param connect_section_index[in]    section index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_connect_section_desc_t *
++ia_css_program_control_init_terminal_get_connect_section_desc(
++    const ia_css_program_control_init_program_desc_t *program_desc,
++    const unsigned int connect_section_index
++);
++
++/* ================= Program Control Init Terminal - END ================= */
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_terminal_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
+new file mode 100644
+index 000000000000..5abd321174df
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal.hsys.user.h
+@@ -0,0 +1,257 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
++#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.hsys.user.h
++ *
++ * Define the methods on the terminal object: Hsys user interface
++ */
++
++#include <ia_css_program_group_data.h>    /* ia_css_frame_t */
++#include <ia_css_program_group_param.h>    /* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>                    /* bool */
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_kernel_bitmap.h"
++
++/*
++ * Creation
++ */
++
++/*
++ * This source file is created with the intention of sharing and
++ * compiled for host and firmware. Since there is no native 64bit
++ * data type support for firmware this wouldn't compile for SP
++ * tile. The part of the file that is not compilable are marked
++ * with the following __VIED_CELL marker and this comment. Once we
++ * come up with a solution to address this issue this will be
++ * removed.
++ */
++#if !defined(__VIED_CELL)
++/*! Compute the size of storage required for allocating the terminal object
++
++ @param    manifest[in]            terminal manifest
++ @param    param[in]                program group parameters
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_terminal(
++    const ia_css_terminal_manifest_t        *manifest,
++    const ia_css_program_group_param_t        *param);
++
++/*! Create the terminal object
++
++ @param    raw_mem[in]                pre allocated memory
++ @param    manifest[in]            terminal manifest
++ @param    terminal_param[in]        terminal parameter
++ @param enable_bitmap            program group enable bitmap
++
++ @return NULL on error
++ */
++extern ia_css_terminal_t *ia_css_terminal_create(
++    void *raw_mem,
++    const ia_css_terminal_manifest_t        *manifest,
++    const ia_css_terminal_param_t            *terminal_param,
++    ia_css_kernel_bitmap_t                enable_bitmap);
++
++/*! Destroy (the storage of) the process object
++
++ @param    terminal[in]            terminal object
++
++ @return NULL
++ */
++extern ia_css_terminal_t *ia_css_terminal_destroy(
++    ia_css_terminal_t *terminal);
++#endif /* !defined(__VIED_CELL) */
++
++/*! Print the terminal object to file/stream
++
++ @param    terminal[in]            terminal object
++ @param    fid[out]                file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_print(
++    const ia_css_terminal_t                    *terminal,
++    void *fid);
++
++/*! Get the (pointer to) the frame object in the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return the pointer to the frame, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_frame_t *ia_css_data_terminal_get_frame(
++    const ia_css_data_terminal_t        *terminal);
++
++/*! Get the (pointer to) the frame descriptor object in the terminal object
++
++ @param    terminal[in]            terminal object
++
++ @return the pointer to the frame descriptor, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
++    const ia_css_data_terminal_t        *dterminal);
++
++/*! Get the (pointer to) the fragment descriptor object in the terminal object
++
++ @param    terminal[in]            terminal object
++
++@return the pointer to the fragment descriptor, NULL on error
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_fragment_descriptor_t
++    *ia_css_data_terminal_get_fragment_descriptor(
++        const ia_css_data_terminal_t        *dterminal,
++        const unsigned int            fragment_index);
++
++/*! Get the number of fragments on the terminal
++
++ @param    terminal[in]            terminal object
++
++ @return the fragment count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_data_terminal_get_fragment_count(
++    const ia_css_data_terminal_t        *dterminal);
++
++/*! Get the number of section on the (param)terminal
++ @param    manifest[in]            terminal manifest
++ @param    terminal_param[in]        terminal parameter
++
++ @return the section count, 0 on error
++ */
++extern uint16_t ia_css_param_terminal_compute_section_count(
++    const ia_css_terminal_manifest_t    *manifest,
++    const ia_css_program_group_param_t    *param);
++
++/*! Get the number of planes on the (data)terminal
++ @param    manifest[in]            terminal manifest
++ @param    terminal_param[in]        terminal parameter
++
++ @return the plane count, 1(default) on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_compute_plane_count(
++    const ia_css_terminal_manifest_t        *manifest,
++    const ia_css_program_group_param_t        *param);
++
++/*! check if given terminal is parameter terminal.
++
++ @param    terminal[in]            (base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_parameter_terminal(
++    const ia_css_terminal_t                    *terminal);
++
++/*! check if given terminal is program terminal.
++
++ @program    terminal[in]            (base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_program_terminal(
++    const ia_css_terminal_t                    *terminal);
++
++/*! check if given terminal is program control init terminal.
++
++ @program control init    terminal[in]            (base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_program_control_init_terminal(
++    const ia_css_terminal_t                    *terminal);
++
++/*! check if given terminal is spatial parameter terminal.
++
++ @spatial    terminal[in]            (base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_spatial_parameter_terminal(
++    const ia_css_terminal_t                    *terminal);
++
++/*! check if given terminal is data terminal.
++
++ @param    terminal[in]            (base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_data_terminal(
++    const ia_css_terminal_t                    *terminal);
++
++/*! obtain buffer out of terminal(both data & param terminals can call this)
++
++ @param    terminal[in]    (base)terminal object of either data or param terminal.
++
++ @return vied address of buffer stored in terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t  ia_css_terminal_get_buffer(
++        const ia_css_terminal_t *terminal);
++
++/*!store a buffer in the terminal.
++
++ @param    terminal[in]    (base)terminal object of either data or param terminal.
++ @param buffer[in]    buffer in vied (hrt address) space.
++
++ @return 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
++                vied_vaddress_t buffer);
++
++/*! Obtain terminal buffer index out of terminal object
++
++ @param    terminal[in]    (base)terminal object of either data or param terminal.
++
++ @return terminal buffer index stored in terminal object on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_get_terminal_index(
++    const ia_css_terminal_t *terminal);
++
++/*! Store a terminal buffer index in the terminal object
++
++ @param    terminal[in]        (base)terminal object of either data or param terminal.
++ @param terminal_index[in]    terminal buffer index
++
++ @return 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_index(
++    ia_css_terminal_t *terminal,
++    unsigned int terminal_index);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
+new file mode 100644
+index 000000000000..5a9657945524
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_impl.h
+@@ -0,0 +1,2053 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
++#define __IA_CSS_PSYS_TERMINAL_IMPL_H
++
++#include <ia_css_psys_terminal.h>
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_terminal_manifest.h>
++
++#include <ia_css_program_group_data.h>
++#include <ia_css_program_group_param.h>
++
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_process_group.hsys.user.h>
++
++#include <type_support.h>
++#include <error_support.h>    /* for verifexit, verifjmpexit */
++#include <assert_support.h>    /* for COMPILATION_ERROR_IF */
++#include <misc_support.h>    /* for NOT_USED */
++#include "ia_css_psys_terminal_private_types.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_psys_manifest_types.h"
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_types.h"
++
++STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
++    void *fid) {
++
++    DECLARE_ERRVAL
++    int retval = -1;
++    int i;
++    ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
++    uint16_t fragment_count =
++        ia_css_data_terminal_get_fragment_count(dterminal);
++    verifexitval(fragment_count != 0, EINVAL);
++
++    retval = ia_css_frame_descriptor_print(
++        ia_css_data_terminal_get_frame_descriptor(dterminal),
++        fid);
++    verifexitval(retval == 0, EINVAL);
++
++    retval = ia_css_frame_print(
++        ia_css_data_terminal_get_frame(dterminal), fid);
++    verifexitval(retval == 0, EINVAL);
++
++    for (i = 0; i < (int)fragment_count; i++) {
++        retval = ia_css_fragment_descriptor_print(
++            ia_css_data_terminal_get_fragment_descriptor(
++                dterminal, i), fid);
++        verifexitval(retval == 0, EINVAL);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
++
++    retval = 0;
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_print(
++    const ia_css_terminal_t *terminal,
++    void *fid)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_terminal_print(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++        "\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
++        (unsigned long int)terminal,
++        (int)ia_css_terminal_get_size(terminal),
++        (int)ia_css_terminal_get_type(terminal),
++        (unsigned long int)ia_css_terminal_get_parent(terminal));
++
++    switch (term_type) {
++    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++        ia_css_program_control_init_terminal_print(
++            (ia_css_program_control_init_terminal_t *)terminal);
++    break;
++    case IA_CSS_TERMINAL_TYPE_DATA_IN:
++    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++        ia_css_data_terminal_print(terminal, fid);
++    break;
++    default:
++        /* other terminal prints are currently not supported */
++    break;
++    }
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_print invalid argument terminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_input(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    bool is_input = false;
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_input(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++    switch (terminal_type) {
++    case IA_CSS_TERMINAL_TYPE_DATA_IN:        /* Fall through */
++    case IA_CSS_TERMINAL_TYPE_STATE_IN:        /* Fall through */
++    case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:        /* Fall through */
++    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++    case IA_CSS_TERMINAL_TYPE_PROGRAM:
++    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++        is_input = true;
++        break;
++    case IA_CSS_TERMINAL_TYPE_DATA_OUT:        /* Fall through */
++    case IA_CSS_TERMINAL_TYPE_STATE_OUT:
++    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++        is_input = false;
++        break;
++    default:
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_input: Unknown terminal type (%d)\n",
++            terminal_type);
++        goto EXIT;
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_input invalid argument\n");
++    }
++    return is_input;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_terminal_get_size(
++    const ia_css_terminal_t    *terminal)
++{
++    DECLARE_ERRVAL
++    size_t size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_size(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    size = terminal->size;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_size invalid argument\n");
++    }
++    return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_type_t ia_css_terminal_get_type(
++    const ia_css_terminal_t    *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_type(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    terminal_type = terminal->terminal_type;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_type invalid argument\n");
++    }
++    return terminal_type;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_type(
++    ia_css_terminal_t *terminal,
++    const ia_css_terminal_type_t terminal_type)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_type(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    terminal->terminal_type = terminal_type;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_type invalid argument terminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_type failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_terminal_get_terminal_manifest_index(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    uint16_t terminal_manifest_index;
++
++    terminal_manifest_index = 0xffff;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_terminal_manifest_index(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    terminal_manifest_index = terminal->tm_index;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
++    }
++    return terminal_manifest_index;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_manifest_index(
++    ia_css_terminal_t *terminal,
++    const uint16_t terminal_manifest_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_terminal_manifest_index(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++    terminal->tm_index = terminal_manifest_index;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_terminal_get_payload_size(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    uint32_t payload_size;
++
++    payload_size = 0;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_payload_size(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    payload_size = terminal->payload_size;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_payload_size: invalid argument\n");
++    }
++    return payload_size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_payload_size(
++    ia_css_terminal_t *terminal,
++    uint32_t payload_size)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_payload_size(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++    terminal->payload_size = payload_size;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_payload_size: invalid argument terminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_payload_size: failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_ID_t ia_css_terminal_get_ID(
++    const ia_css_terminal_t    *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_ID(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    retval = terminal->ID;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_ID invalid argument\n");
++        retval = 0;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_get_kernel_id(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    uint8_t retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_kernel_id(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    retval = dterminal->kernel_id;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_kernel_id: invalid argument\n");
++        retval =  0;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_is_compressed(
++    const ia_css_data_terminal_t *dterminal,
++    uint8_t *val)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    const ia_css_frame_descriptor_t *frame_descriptor;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_is_compressed enter\n");
++
++    frame_descriptor =
++        ia_css_data_terminal_get_frame_descriptor(dterminal);
++
++    verifexitval(frame_descriptor != NULL, EFAULT);
++
++    *val = frame_descriptor->is_compressed;
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_is_compressed: Null frame descriptor\n");
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_connection_type(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    connection_type = dterminal->connection_type;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_connection_type: invalid argument\n");
++    }
++    return connection_type;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_get_link_id(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    uint8_t link_id = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_link_id(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    link_id = dterminal->link_id;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_link_id: invalid argument\n");
++    }
++    return link_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_link_id(
++    ia_css_data_terminal_t *dterminal,
++    const uint8_t link_id)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_set_link_id(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++    dterminal->link_id = link_id;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_link_id: invalid argument terminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_link_id: failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_connection_type(
++    ia_css_data_terminal_t *dterminal,
++    const ia_css_connection_type_t connection_type)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_set_connection_type(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    dterminal->connection_type = connection_type;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_connection_type failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_stream2gen_buffer_size(
++    ia_css_data_terminal_t *dterminal,
++    const uint16_t stream2gen_buffer_size)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
++        "ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
++    dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
++            retval);
++    }
++
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_t *ia_css_terminal_get_parent(
++    const ia_css_terminal_t    *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_process_group_t *parent = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_parent(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++    if (terminal->parent_offset == 0) {
++        return NULL;
++    }
++
++    parent = (ia_css_process_group_t *) ((char *)terminal +
++                    terminal->parent_offset);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_parent invalid argument\n");
++    }
++    return parent;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_parent(
++    ia_css_terminal_t *terminal,
++    ia_css_process_group_t *parent)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_parent(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++    verifexitval(parent != NULL, EFAULT);
++
++    terminal->parent_offset = (uint16_t) ((char *)parent -
++                        (char *)terminal);
++
++    retval = 0;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_parent invalid argument\n");
++    }
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_parent failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_frame_t *ia_css_data_terminal_get_frame(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    ia_css_frame_t *frame = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_frame(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    frame = (ia_css_frame_t    *)(&(dterminal->frame));
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_frame invalid argument\n");
++    }
++    return frame;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    ia_css_frame_descriptor_t *frame_descriptor = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
++
++    verifexitval(dterminal != NULL, EFAULT);
++
++    frame_descriptor =
++        (ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
++    }
++    return frame_descriptor;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
++    const ia_css_data_terminal_t *dterminal,
++    const unsigned int fragment_index)
++{
++    DECLARE_ERRVAL
++    ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
++    uint16_t fragment_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_frame_descriptor(): enter:\n");
++
++    fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
++
++    verifexitval(dterminal != NULL, EFAULT);
++    verifexitval(fragment_count != 0, EINVAL);
++    verifexitval(fragment_index < fragment_count, EINVAL);
++
++    fragment_descriptor = (ia_css_fragment_descriptor_t *)
++        ((char *)dterminal + dterminal->fragment_descriptor_offset);
++
++    fragment_descriptor += fragment_index;
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
++    }
++    return fragment_descriptor;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_data_terminal_get_fragment_count(
++    const ia_css_data_terminal_t *dterminal)
++{
++    DECLARE_ERRVAL
++    ia_css_process_group_t *parent;
++    uint16_t fragment_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_get_fragment_count(): enter:\n");
++
++    parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
++
++    verifexitval(dterminal != NULL, EFAULT);
++    verifexitval(parent != NULL, EFAULT);
++
++    fragment_count = ia_css_process_group_get_fragment_count(parent);
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_get_fragment_count: invalid argument\n");
++    }
++    return fragment_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_parameter_terminal(
++    const ia_css_terminal_t    *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_parameter_terminal(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    /* will return an error value on error */
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_parameter_terminal: invalid argument\n");
++    }
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_data_terminal(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_data_terminal(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    /* will return an error value on error */
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_data_terminal invalid argument\n");
++    }
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
++            terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_program_terminal(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_program_terminal(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    /* will return an error value on error */
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_program_terminal: invalid argument\n");
++    }
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_program_control_init_terminal(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t    terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_program_control_init_terminal(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    /* will return an error value on error */
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
++    }
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_spatial_parameter_terminal(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++
++    /* will return an error value on error */
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
++    }
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_compute_plane_count(
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    DECLARE_ERRVAL
++    uint8_t    plane_count = 1;
++
++    NOT_USED(manifest);
++    NOT_USED(param);
++
++    verifexitval(manifest != NULL, EFAULT);
++    verifexitval(param != NULL, EFAULT);
++    /* TODO: Implementation Missing*/
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_data_terminal_compute_plane_count(): enter:\n");
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_data_terminal_compute_plane_count: invalid argument\n");
++    }
++    return plane_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_vaddress_t  ia_css_terminal_get_buffer(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    vied_vaddress_t buffer = VIED_NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_buffer(): enter:\n");
++
++    verifexitval(terminal != NULL, EFAULT);
++    if (ia_css_is_terminal_data_terminal(terminal)) {
++        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++
++        verifexitval(frame != NULL, EFAULT);
++        buffer = ia_css_frame_get_buffer(frame);
++    } else if (ia_css_is_terminal_parameter_terminal(terminal)) {
++        const ia_css_param_terminal_t *param_terminal =
++            (const ia_css_param_terminal_t *)terminal;
++
++        verifexitval(param_terminal != NULL, EFAULT);
++        buffer = param_terminal->param_payload.buffer;
++    }  else if (ia_css_is_terminal_program_terminal(terminal)) {
++        const ia_css_program_terminal_t *program_terminal =
++            (const ia_css_program_terminal_t *)terminal;
++
++        verifexitval(program_terminal != NULL, EFAULT);
++        buffer = program_terminal->param_payload.buffer;
++    }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
++        const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
++            (const ia_css_program_control_init_terminal_t *)terminal;
++
++        verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
++        buffer = program_ctrl_init_terminal->param_payload.buffer;
++    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
++        const ia_css_spatial_param_terminal_t *spatial_terminal =
++            (const ia_css_spatial_param_terminal_t *)terminal;
++
++        verifexitval(spatial_terminal != NULL, EFAULT);
++        buffer = spatial_terminal->param_payload.buffer;
++    }
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_buffer: invalid argument terminal\n");
++    }
++    return buffer;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_buffer(
++    ia_css_terminal_t *terminal,
++    vied_vaddress_t buffer)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++    ia_css_param_terminal_t *pterminal = NULL;
++    ia_css_program_terminal_t *prog_terminal = NULL;
++    ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
++    ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_buffer(): enter:\n");
++
++    if (ia_css_is_terminal_data_terminal(terminal) == true) {
++        /* Currently using Frames inside data terminal ,
++         * TODO: start directly using data.
++         */
++        ia_css_data_terminal_t *dterminal =
++            (ia_css_data_terminal_t *)terminal;
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(dterminal);
++
++        verifexitval(frame != NULL, EFAULT);
++        retval = ia_css_frame_set_buffer(frame, buffer);
++        verifexitval(retval == 0, EINVAL);
++    } else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
++        pterminal = (ia_css_param_terminal_t *)terminal;
++        verifexitval(pterminal != NULL, EFAULT);
++        pterminal->param_payload.buffer = buffer;
++        retval = 0;
++    } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
++        prog_terminal = (ia_css_program_terminal_t *)terminal;
++        verifexitval(prog_terminal != NULL, EFAULT);
++        prog_terminal->param_payload.buffer = buffer;
++        retval = 0;
++    } else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
++        progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
++        verifexitval(progctrl_terminal != NULL, EFAULT);
++        progctrl_terminal->param_payload.buffer = buffer;
++        retval = 0;
++    } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
++            true) {
++        spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
++        verifexitval(spatial_terminal != NULL, EFAULT);
++        spatial_terminal->param_payload.buffer = buffer;
++        retval = 0;
++    } else {
++        return retval;
++    }
++
++    retval = 0;
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_buffer failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_get_terminal_index(
++    const ia_css_terminal_t *terminal)
++{
++    DECLARE_ERRVAL
++    int terminal_index = -1;
++    verifexitval(terminal != NULL, EFAULT);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_get_terminal_index(): enter:\n");
++
++    if (ia_css_is_terminal_data_terminal(terminal)) {
++        ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
++                    (ia_css_data_terminal_t *)terminal);
++
++        verifexitval(frame != NULL, EFAULT);
++        terminal_index = ia_css_frame_get_data_index(frame);
++    } else {
++        if (ia_css_is_terminal_parameter_terminal(terminal)) {
++            const ia_css_param_terminal_t *param_terminal =
++                (const ia_css_param_terminal_t *)terminal;
++            verifexitval(param_terminal != NULL, EFAULT);
++            terminal_index = param_terminal->param_payload.terminal_index;
++        }  else if (ia_css_is_terminal_program_terminal(terminal)) {
++            const ia_css_program_terminal_t *program_terminal =
++                (const ia_css_program_terminal_t *)terminal;
++            verifexitval(program_terminal != NULL, EFAULT);
++            terminal_index = program_terminal->param_payload.terminal_index;
++        }  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
++            const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
++                (const ia_css_program_control_init_terminal_t *)terminal;
++            verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
++            terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
++        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
++            const ia_css_spatial_param_terminal_t *spatial_terminal =
++                (const ia_css_spatial_param_terminal_t *)terminal;
++            verifexitval(spatial_terminal != NULL, EFAULT);
++            terminal_index = spatial_terminal->param_payload.terminal_index;
++        } else {
++            verifjmpexit(0);
++        }
++    }
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_get_terminal_index: invalid argument\n");
++    }
++    return terminal_index;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_index(
++    ia_css_terminal_t *terminal,
++    unsigned int terminal_index)
++{
++    DECLARE_ERRVAL
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_terminal_set_terminal_index(): enter:\n");
++
++    if (ia_css_is_terminal_data_terminal(terminal) == true) {
++        /* Currently using Frames inside data terminal ,
++         * TODO: start directly using data.
++         */
++        ia_css_data_terminal_t *dterminal =
++            (ia_css_data_terminal_t *)terminal;
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(dterminal);
++
++        verifexitval(frame != NULL, EFAULT);
++        retval = ia_css_frame_set_data_index(frame, terminal_index);
++        verifexitval(retval == 0, EINVAL);
++    } else {
++        if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
++            ia_css_param_terminal_t *pterminal =
++                (ia_css_param_terminal_t *)terminal;
++
++            pterminal->param_payload.terminal_index = terminal_index;
++            retval = 0;
++        } else if (ia_css_is_terminal_program_terminal(terminal) == true) {
++            ia_css_program_terminal_t *pterminal =
++                (ia_css_program_terminal_t *)terminal;
++
++            pterminal->param_payload.terminal_index = terminal_index;
++            retval = 0;
++        } else if (ia_css_is_terminal_program_control_init_terminal(terminal)
++                == true) {
++            ia_css_program_control_init_terminal_t *pterminal =
++                (ia_css_program_control_init_terminal_t *)terminal;
++
++            pterminal->param_payload.terminal_index = terminal_index;
++            retval = 0;
++        } else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
++                true) {
++            ia_css_spatial_param_terminal_t *pterminal =
++                (ia_css_spatial_param_terminal_t *)terminal;
++
++            pterminal->param_payload.terminal_index = terminal_index;
++            retval = 0;
++        } else {
++            return retval;
++        }
++    }
++
++    retval = 0;
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_set_terminal_index failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
++    const ia_css_terminal_t *terminal,
++    const ia_css_terminal_manifest_t *terminal_manifest,
++    const uint16_t nof_fragments)
++{
++    DECLARE_ERRVAL
++    bool invalid_flag = false;
++
++    const ia_css_data_terminal_t *dterminal =
++        (ia_css_data_terminal_t *)terminal;
++    const ia_css_data_terminal_manifest_t *dt_manifest =
++        (ia_css_data_terminal_manifest_t *)terminal_manifest;
++    const ia_css_frame_descriptor_t *frame_descriptor;
++    ia_css_frame_format_bitmap_t man_frame_format_bitmap;
++    ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
++    uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
++    uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_data_terminal_valid enter\n");
++
++    frame_descriptor =
++        ia_css_data_terminal_get_frame_descriptor(dterminal);
++    verifexitval(frame_descriptor != NULL, EFAULT);
++    man_frame_format_bitmap =
++        ia_css_data_terminal_manifest_get_frame_format_bitmap(
++                    dt_manifest);
++    proc_frame_format_bitmap =
++        ia_css_frame_format_bit_mask(
++                frame_descriptor->frame_format_type);
++    /*
++     * TODO: Replace by 'validation of frame format type'.
++     * Currently frame format type is not correctly set by manifest,
++     * waiting for HSD 1804260604
++     */
++    if (man_frame_format_bitmap > 0) {
++        if ((man_frame_format_bitmap &
++                    proc_frame_format_bitmap) == 0) {
++            uint32_t *bitmap_arr =
++                (uint32_t *)&man_frame_format_bitmap;
++
++            NOT_USED(bitmap_arr);
++            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++                "Frame format type not defined in manifest\n");
++            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++                " man bitmap_arr[]: %d,%d\n",
++                bitmap_arr[1], bitmap_arr[0]);
++            bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
++            IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++                " proc bitmap_arr[]: %d,%d\n",
++                bitmap_arr[1], bitmap_arr[0]);
++        }
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "Frame format bitmap not defined in manifest\n");
++    }
++    ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
++    /*
++     * TODO: Replace by validation of Minimal frame column dimensions.
++     *  Currently not correctly set by manifest yet,
++     *  waiting for HSD 1804260604
++     */
++    if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
++        min_value[IA_CSS_COL_DIMENSION])) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "Minimal frame column dimensions not set correctly (by manifest)\n");
++    }
++    /*
++     * TODO: Replace by validation of Minimal frame row dimensions.
++     * Currently not correctly set by manifest yet,
++     * waiting for HSD 1804260604
++     */
++    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
++        min_value[IA_CSS_ROW_DIMENSION]) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "Minimal frame row dimensions not set correctly (by manifest)\n");
++    }
++
++    ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
++    /*
++     * TODO: Replace by validation of Maximal frame column dimensions.
++     * Currently not correctly set by manifest yet,
++     * waiting for HSD 1804260604
++     */
++    if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
++        max_value[IA_CSS_COL_DIMENSION]) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "Maximal frame column dimensions not set correctly (by manifest)\n");
++    }
++    /*
++     * TODO: Replace by validation of Maximal frame row dimensions.
++     * Currently not correctly set by manifest yet,
++     * waiting for HSD 1804260604
++     */
++    if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
++        max_value[IA_CSS_ROW_DIMENSION]) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "Maximal frame row dimensions not set correctly (by manifest)\n");
++    }
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
++        min_value[IA_CSS_COL_DIMENSION],
++        min_value[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
++        max_value[IA_CSS_COL_DIMENSION],
++        max_value[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
++        frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
++        frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
++    /*
++     * TODO: Add validation of fragment dimensions.
++     * Currently not set by manifest yet, waiting for HSD 1804260604
++     */
++    NOT_USED(nof_fragments);
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_data_terminal_valid() invalid argument\n");
++        return false;
++    } else {
++        return (!invalid_flag);
++    }
++}
++
++STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
++    const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
++        *man_seq_info_desc,
++    const ia_css_kernel_fragment_sequencer_info_desc_t
++        *term_seq_info_desc)
++{
++    NOT_USED(man_seq_info_desc);
++    NOT_USED(term_seq_info_desc);
++
++    /* slice dimension column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_slice_dimension: %d\n",
++        term_seq_info_desc->
++        fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_slice_dimension: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_slice_dimension: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++
++    /* slice dimension row */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_slice_dimension: %d\n",
++        term_seq_info_desc->
++        fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_slice_dimension: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_slice_dimension: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++
++    /* slice count column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_slice_count: %d\n",
++        term_seq_info_desc->
++        fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_slice_count: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_slice_count: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++
++    /* slice count row */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_slice_count: %d\n",
++        term_seq_info_desc->
++        fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_slice_count: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_slice_count: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++
++    /* decimation factor column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_point_decimation_factor: %d\n",
++        term_seq_info_desc->
++        fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_point_decimation_factor: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
++        );
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_point_decimation_factor: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
++        );
++
++    /* decimation factor row */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_point_decimation_factor: %d\n",
++        term_seq_info_desc->
++        fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_point_decimation_factor: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_point_decimation_factor[
++                    IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_point_decimation_factor: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_point_decimation_factor[
++                    IA_CSS_ROW_DIMENSION]);
++
++    /* index column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_overlay_pixel_topleft_index: %d\n",
++        term_seq_info_desc->
++        fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION]);
++
++    /* index row */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_overlay_pixel_topleft_index: %d\n",
++        term_seq_info_desc->
++        fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_overlay_pixel_topleft_index: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_overlay_pixel_topleft_index: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++
++    /* dimension column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_overlay_pixel_dimension: %d\n",
++        term_seq_info_desc->
++        fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_overlay_pixel_dimension: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_overlay_pixel_dimension: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION]);
++
++    /* dimension column */
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "fragment_grid_overlay_pixel_dimension: %d\n",
++        term_seq_info_desc->
++        fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "max_fragment_grid_overlay_pixel_dimension: %d\n",
++        man_seq_info_desc->
++        max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++        "min_fragment_grid_overlay_pixel_dimension: %d\n",
++        man_seq_info_desc->
++        min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
++    const ia_css_terminal_t    *terminal,
++    const ia_css_terminal_manifest_t *terminal_manifest,
++    const uint16_t nof_fragments)
++{
++    DECLARE_ERRVAL
++    bool invalid_flag = false;
++    uint16_t frag_idx;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_program_terminal_valid enter\n");
++
++    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
++        uint16_t frag_seq_info_count, seq_idx;
++        const ia_css_program_terminal_t *prog_term;
++        const ia_css_program_terminal_manifest_t *prog_term_man;
++
++        prog_term = (const ia_css_program_terminal_t *)terminal;
++        prog_term_man =
++            (const ia_css_program_terminal_manifest_t *)
++            terminal_manifest;
++        frag_seq_info_count =
++            prog_term_man->
++            kernel_fragment_sequencer_info_manifest_info_count;
++
++        for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
++            const ia_css_kernel_fragment_sequencer_info_desc_t
++            *term_seq_info_desc;
++            const
++            ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++            man_seq_info_desc;
++
++            term_seq_info_desc =
++        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++                    prog_term, frag_idx, seq_idx,
++                    frag_seq_info_count);
++            verifexitval(term_seq_info_desc != NULL, EFAULT);
++            man_seq_info_desc =
++        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
++                    (prog_term_man, seq_idx);
++            verifexitval(man_seq_info_desc != NULL, EFAULT);
++
++            ia_css_program_terminal_seq_info_print(
++                man_seq_info_desc, term_seq_info_desc);
++            /* slice dimension column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION]);
++
++            /* slice dimension row */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++
++            /* slice count column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION]);
++
++            /* slice count row */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION]);
++
++            /* decimation factor column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION]);
++
++            /* decimation factor row */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION]);
++
++            /* index column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION]);
++
++            /* index row */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++
++            /* dimension column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION]);
++
++            /* dimension column */
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION] >
++                man_seq_info_desc->
++                max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++            invalid_flag = invalid_flag ||
++                (term_seq_info_desc->
++                fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION] <
++                man_seq_info_desc->
++                min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++        }
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_program_terminal_valid() invalid argument\n");
++        return false;
++    }
++    if (invalid_flag == true) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_is_program_terminal_valid(): validation failed\n");
++        /* TODO: program terminal parameters not correctly defined,
++         * disable validation result until issues has been solved
++         */
++        return true;
++    }
++    return (!invalid_flag);
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
++    const ia_css_terminal_t *terminal,
++    const ia_css_terminal_manifest_t *terminal_manifest,
++    const uint16_t nof_fragments)
++{
++    DECLARE_ERRVAL
++    bool invalid_flag = false;
++    uint16_t frag_idx;
++
++    uint16_t slice_idx, section_idx;
++
++    const ia_css_sliced_param_terminal_t *sliced_term =
++        (const ia_css_sliced_param_terminal_t *)terminal;
++    verifexitval(sliced_term != NULL, EFAULT);
++    const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
++        (const ia_css_sliced_param_terminal_manifest_t *)
++        terminal_manifest;
++    verifexitval(sliced_term_man != NULL, EFAULT);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_sliced_terminal_valid enter\n");
++
++    for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
++        const ia_css_fragment_slice_desc_t *fragment_slice_desc =
++            ia_css_sliced_param_terminal_get_fragment_slice_desc(
++                sliced_term, frag_idx);
++
++        verifexitval(fragment_slice_desc != NULL, EFAULT);
++
++        for (slice_idx = 0;
++            slice_idx < fragment_slice_desc->slice_count;
++            slice_idx++) {
++            for (section_idx = 0;
++                section_idx <
++                sliced_term_man->sliced_param_section_count;
++                section_idx++) {
++                const
++                ia_css_sliced_param_manifest_section_desc_t *
++                    slice_man_section_desc;
++                const ia_css_slice_param_section_desc_t *
++                    slice_section_desc;
++
++                slice_man_section_desc =
++        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++                        sliced_term_man, section_idx);
++                slice_section_desc =
++        ia_css_sliced_param_terminal_get_slice_param_section_desc(
++                        sliced_term, frag_idx,
++                        slice_idx, section_idx,
++                        sliced_term_man->
++                        sliced_param_section_count);
++                verifexitval(slice_man_section_desc != NULL, EFAULT);
++                verifexitval(slice_section_desc != NULL, EFAULT);
++
++                invalid_flag = invalid_flag ||
++                    (slice_section_desc->mem_size >
++                    slice_man_section_desc->max_mem_size);
++            }
++        }
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                "ia_css_is_sliced_terminal_valid() invalid argument\n");
++        return false;
++    } else {
++        return (!invalid_flag);
++    }
++
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_valid(
++    const ia_css_terminal_t    *terminal,
++    const ia_css_terminal_manifest_t *terminal_manifest)
++{
++    DECLARE_ERRVAL
++    bool is_valid = false;
++    uint16_t nof_fragments;
++    ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
++
++    verifexitval(NULL != terminal, EFAULT);
++    verifexitval(NULL != terminal_manifest, EFAULT);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_is_terminal_valid enter\n");
++
++    nof_fragments = ia_css_data_terminal_get_fragment_count(
++                (const ia_css_data_terminal_t *)terminal);
++    terminal_type = ia_css_terminal_get_type(terminal);
++
++    switch (terminal_type) {
++    case IA_CSS_TERMINAL_TYPE_DATA_IN:
++    case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++        is_valid = ia_css_is_data_terminal_valid(terminal,
++                terminal_manifest, nof_fragments);
++        break;
++    case IA_CSS_TERMINAL_TYPE_PROGRAM:
++        is_valid = ia_css_is_program_terminal_valid(terminal,
++                terminal_manifest, nof_fragments);
++        break;
++    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++    case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++    case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++        /* Nothing to be validated for cached and spatial
++        *  parameters, return valid
++        */
++        is_valid = true;
++        break;
++    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++    case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++        is_valid = ia_css_is_sliced_terminal_valid(terminal,
++                terminal_manifest, nof_fragments);
++        break;
++    default:
++        /* Terminal type unknown, return invalid */
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_is_terminal_valid() Terminal type %x unknown\n",
++            (int)terminal_type);
++        is_valid = false;
++        break;
++    }
++
++EXIT:
++    if (haserror(EFAULT)) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_is_terminal_valid() invalid argument\n");
++        return false;
++    }
++    /* TODO: to be removed once all PGs pass validation */
++    if (is_valid == false) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "ia_css_is_terminal_valid(): type: %d validation failed\n",
++            terminal_type);
++    }
++    return is_valid;
++}
++
++/* ================= Program Control Init Terminal - START ================= */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int
++ia_css_program_control_init_terminal_init(
++    ia_css_program_control_init_terminal_t *terminal,
++    const ia_css_program_control_init_terminal_manifest_t *manifest,
++    const ia_css_program_group_manifest_t *pg_manifest,
++    ia_css_kernel_bitmap_t kernel_bitmap)
++{
++    int retval = -1;
++    unsigned int i;
++    unsigned int base_load_sec;
++    unsigned int base_connect_sec;
++    unsigned int load_index = 0;
++    unsigned int connect_index = 0;
++    unsigned int load_section_count = 0;
++    unsigned int connect_section_count = 0;
++
++    ia_css_program_control_init_manifest_program_desc_t *man_progs;
++    ia_css_program_manifest_t *prog_manifest;
++
++    verifjmpexit(terminal != NULL);
++
++    man_progs =
++    ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
++    verifjmpexit(man_progs != NULL);
++
++    for (i = 0; i < manifest->program_count; i++) {
++        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++        verifjmpexit(prog_manifest != NULL);
++        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++            continue;
++        }
++        load_section_count += man_progs[i].load_section_count;
++        connect_section_count += man_progs[i].connect_section_count;
++    }
++
++    terminal->program_count = manifest->program_count;
++    terminal->program_section_desc_offset =
++        sizeof(ia_css_program_control_init_terminal_t);
++
++    base_load_sec = /* base_load_sec relative to first program */
++        terminal->program_count *
++        sizeof(ia_css_program_control_init_program_desc_t);
++
++    base_connect_sec = base_load_sec +
++        load_section_count *
++        sizeof(ia_css_program_control_init_load_section_desc_t);
++
++    for (i = 0; i < terminal->program_count; i++) {
++        ia_css_program_control_init_program_desc_t *prog;
++
++        prog = ia_css_program_control_init_terminal_get_program_desc(
++                terminal, i);
++        verifjmpexit(prog != NULL);
++
++        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++        verifjmpexit(prog_manifest != NULL);
++        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++            prog->load_section_count = 0;
++            prog->connect_section_count = 0;
++            prog->load_section_desc_offset = 0;
++            prog->connect_section_desc_offset  = 0;
++            continue;
++        }
++
++        prog->load_section_count = man_progs[i].load_section_count;
++        prog->connect_section_count = man_progs[i].connect_section_count;
++
++        prog->load_section_desc_offset =
++            base_load_sec +
++            load_index *
++            sizeof(ia_css_program_control_init_load_section_desc_t) -
++            i * sizeof(ia_css_program_control_init_program_desc_t);
++        prog->connect_section_desc_offset =
++            base_connect_sec +
++            connect_index *
++            sizeof(ia_css_program_control_init_connect_section_desc_t) -
++            i * sizeof(ia_css_program_control_init_program_desc_t);
++
++        load_index += man_progs[i].load_section_count;
++        connect_index += man_progs[i].connect_section_count;
++    }
++    retval = 0;
++EXIT:
++    return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int
++ia_css_program_control_init_terminal_get_descriptor_size(
++        const ia_css_program_control_init_terminal_manifest_t *manifest,
++        const ia_css_program_group_manifest_t *pg_manifest,
++        ia_css_kernel_bitmap_t kernel_bitmap)
++{
++    unsigned int i;
++    unsigned size = 0;
++    unsigned load_section_count = 0;
++    unsigned connect_section_count = 0;
++    ia_css_program_control_init_manifest_program_desc_t *man_progs;
++    ia_css_program_manifest_t *prog_manifest;
++    verifjmpexit(manifest != NULL);
++
++    man_progs =
++        ia_css_program_control_init_terminal_manifest_get_program_desc(
++            manifest, 0);
++    verifjmpexit(man_progs != NULL);
++
++    for (i = 0; i < manifest->program_count; i++) {
++        prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++        verifjmpexit(prog_manifest != NULL);
++        if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++            continue;
++        }
++        load_section_count += man_progs[i].load_section_count;
++        connect_section_count += man_progs[i].connect_section_count;
++    }
++
++    size = sizeof(ia_css_program_control_init_terminal_t) +
++        manifest->program_count *
++        sizeof(struct ia_css_program_control_init_program_desc_s) +
++        load_section_count *
++        sizeof(struct ia_css_program_control_init_load_section_desc_s) +
++        connect_section_count  *
++        sizeof(struct ia_css_program_control_init_connect_section_desc_s);
++EXIT:
++    return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++void ia_css_program_control_init_terminal_print(
++    const ia_css_program_control_init_terminal_t *terminal)
++{
++    unsigned int prog_idx, sec_idx;
++    ia_css_program_control_init_program_desc_t *prog;
++    ia_css_program_control_init_load_section_desc_t *load_sec;
++    ia_css_program_control_init_connect_section_desc_t *connect_sec;
++    unsigned mem_offset;
++    verifjmpexit(terminal != NULL);
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "program_count: %d, payload_fragment_stride: %d\n",
++        terminal->program_count,
++        terminal->payload_fragment_stride);
++
++    for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
++        prog = ia_css_program_control_init_terminal_get_program_desc(
++            terminal, prog_idx);
++        verifjmpexit(prog != NULL);
++        mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
++
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
++        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
++            prog->control_info.process_id,
++            prog->control_info.num_done_events);
++
++        if (prog->load_section_count > 0) {
++            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
++        }
++        for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
++            load_sec =
++                ia_css_program_control_init_terminal_get_load_section_desc(
++                    prog, sec_idx);
++            verifjmpexit(load_sec != NULL);
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
++                "mem_size: %d, mode_bitmask: %x\n",
++                load_sec->device_descriptor_id.data,
++                mem_offset,
++                load_sec->mem_size,
++                load_sec->mode_bitmask);
++            mem_offset += load_sec->mem_size;
++        }
++        if (prog->connect_section_count > 0) {
++            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
++        }
++        for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
++            connect_sec =
++                ia_css_program_control_init_terminal_get_connect_section_desc(
++                    prog, sec_idx);
++            verifjmpexit(connect_sec != NULL);
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\t\tdevice_descriptor_id: 0x%08x, "
++                "connect_terminal_ID: %d, connect_section_idx: %d, "
++                "mode_bitmask: %x\n",
++                connect_sec->device_descriptor_id.data,
++                connect_sec->connect_terminal_ID,
++                connect_sec->connect_section_idx,
++                connect_sec->mode_bitmask);
++        }
++    }
++EXIT:
++    return;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_program_desc_t *
++ia_css_program_control_init_terminal_get_program_desc(
++    const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
++    const unsigned int program_index)
++{
++    ia_css_program_control_init_program_desc_t *program_desc_base;
++    ia_css_program_control_init_program_desc_t *program_desc = NULL;
++
++    verifjmpexit(prog_ctrl_init_terminal != NULL);
++    verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
++
++    program_desc_base = (ia_css_program_control_init_program_desc_t *)
++        (((const char *)prog_ctrl_init_terminal) +
++         prog_ctrl_init_terminal->program_section_desc_offset);
++    program_desc = &(program_desc_base[program_index]);
++
++EXIT:
++    return program_desc;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
++    const ia_css_program_control_init_program_desc_t *program_desc)
++{
++    ia_css_process_id_t process_id = 0;
++
++    verifjmpexit(program_desc != NULL);
++
++    process_id = program_desc->control_info.process_id;
++
++EXIT:
++    return process_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_program_control_init_terminal_get_num_done_events(
++    const ia_css_program_control_init_program_desc_t *program_desc)
++{
++    uint8_t num_done_events = 0;
++
++    verifjmpexit(program_desc != NULL);
++
++    num_done_events = program_desc->control_info.num_done_events;
++
++EXIT:
++    return num_done_events;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++void ia_css_program_control_init_terminal_set_control_info(
++    ia_css_program_control_init_program_desc_t *program_desc,
++    ia_css_process_id_t process_id,
++    uint8_t num_done_events)
++{
++    verifjmpexit(program_desc != NULL);
++
++    program_desc->control_info.process_id = process_id;
++    program_desc->control_info.num_done_events = num_done_events;
++
++EXIT:
++    return;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
++    const ia_css_program_control_init_program_desc_t *program_desc)
++{
++    assert(program_desc != NULL);
++    return program_desc->connect_section_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_load_section_count(
++    const ia_css_program_control_init_program_desc_t *program_desc)
++{
++    assert(program_desc != NULL);
++    return program_desc->load_section_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
++    const ia_css_program_control_init_program_desc_t *program_desc)
++{
++    assert(program_desc != NULL);
++    return program_desc->load_section_mem_offset;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_load_section_desc_t *
++ia_css_program_control_init_terminal_get_load_section_desc(
++    const ia_css_program_control_init_program_desc_t *program_desc,
++    const unsigned int load_section_index)
++{
++    ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
++    ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
++
++    verifjmpexit(program_desc != NULL);
++    verifjmpexit(load_section_index < program_desc->load_section_count);
++
++    load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
++        (((const char *)program_desc) +
++         program_desc->load_section_desc_offset);
++    load_section_desc = &(load_section_desc_base[load_section_index]);
++
++EXIT:
++    return load_section_desc;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_connect_section_desc_t *
++ia_css_program_control_init_terminal_get_connect_section_desc(
++    const ia_css_program_control_init_program_desc_t *program_desc,
++    const unsigned int connect_section_index)
++{
++    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
++    ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
++
++    verifjmpexit(program_desc != NULL);
++    verifjmpexit(connect_section_index < program_desc->connect_section_count);
++
++    connect_sec_desc_base =
++        (ia_css_program_control_init_connect_section_desc_t *)
++        (((const char *)program_desc) +
++         program_desc->connect_section_desc_offset);
++    connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
++
++EXIT:
++    return connect_sec_desc;
++}
++
++/* ================= Program Control Init Terminal - END ================= */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
+new file mode 100644
+index 000000000000..3255e10f9f7e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.h
+@@ -0,0 +1,621 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal_manifest.h
++ *
++ * Define the methods on the terminal manifest object that are not part of a
++ * single interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <ia_css_psys_terminal_manifest.sim.h>
++
++#include <ia_css_psys_terminal_manifest.hsys.user.h>
++
++#include <ia_css_program_group_data.h>    /* ia_css_frame_format_bitmap_t */
++#include <ia_css_kernel_bitmap.h>    /* ia_css_kernel_bitmap_t */
++
++#include <type_support.h>        /* size_t */
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_base_types.h"
++#include "ia_css_psys_static_storage_class.h"
++
++/*!
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++/*! Check if the terminal manifest object specifies a spatial param terminal
++ * type
++
++ @param [in]    manifest            terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Check if the terminal manifest object specifies a program terminal type
++
++ @param [in]    manifest            terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_program_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Check if the terminal manifest object specifies a program control init terminal type
++ *
++ * @param [in]    manifest            terminal manifest object
++ *
++ * @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_program_control_init_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Check if the terminal manifest object specifies a (cached) parameter
++ * terminal type
++
++ @param [in]    manifest            terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_parameter_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Check if the terminal manifest object specifies a (sliced) parameter
++ * terminal type
++
++ @param [in]    manifest            terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_sliced_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Check if the terminal manifest object specifies a data terminal type
++
++ @param [in]    manifest            terminal manifest object
++
++ @return is_data_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_data_terminal(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Get the broad terminal category
++
++ @param    manifest[in]            terminal manifest object
++
++ @return Terminal category enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the broad terminal category
++
++ @param    manifest[in]            terminal manifest object
++ @param    category[in]            terminal category
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_category(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_cat_t category);
++
++/*! Get the direction of data flow for the terminal payload
++
++ @param    manifest[in]            terminal manifest object
++
++ @return Terminal direction enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the direction of data flow for the terminal payload
++
++ @param    manifest[in]            terminal manifest object
++ @param    direction[in]            terminal direction
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_direction(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_dir_t direction);
++
++/*! Get the Rate Of Update (ROU) for the terminal payload
++
++ @param    manifest[in]            terminal manifest object
++
++ @return Terminal rate-of-update enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the Rate Of Update (ROU) for the terminal payload
++
++ @param    manifest[in]            terminal manifest object
++ @param    rate_of_update[in]        terminal rate of update
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_rate_of_update(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_rou_t rate_of_update);
++
++/*! Get the buffer type for the connect terminal pointer
++
++ This function is intended for connect terminals only.  If called
++ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
++
++ @param    manifest[in]            terminal manifest object
++
++ @return Connect terminal buffer type enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the buffer type for the connect terminal pointer
++
++  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
++
++ @param    manifest[in]            terminal manifest object
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_buffer_type(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_connect_buf_type_t connect_buf_type);
++
++/*! Get the stored size of the terminal manifest object
++
++ @param [in]    manifest            terminal manifest object
++
++ @return size, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_terminal_manifest_get_size(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Get the (pointer to) the program group manifest parent of the terminal
++ * manifest object
++
++ @param [in]    manifest            terminal manifest object
++
++ @return the pointer to the parent, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the (pointer to) the program group manifest parent of the terminal
++ * manifest object
++
++ @param [in]    manifest            terminal manifest object
++ @param    [in]    terminal_offset        this terminal's offset from
++                    program_group_manifest base address.
++
++ @return < 0 on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_parent_offset(
++    ia_css_terminal_manifest_t            *manifest,
++    int32_t                        terminal_offset);
++
++/*! Get the type of the terminal manifest object
++
++ @param [in]    manifest            terminal manifest object
++
++ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
++    manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the type of the terminal manifest object
++
++ @param [in]    manifest            terminal manifest object
++ @param    [in]    terminal_type        terminal type
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_type(
++    ia_css_terminal_manifest_t            *manifest,
++    const ia_css_terminal_type_t            terminal_type);
++
++/*! Set the ID of the terminal manifest object
++
++ @param [in]    manifest            terminal manifest object
++ @param    [in]    ID                terminal ID
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_ID(
++    ia_css_terminal_manifest_t            *manifest,
++    const ia_css_terminal_ID_t            ID);
++
++/*! Get the type of the terminal manifest object
++
++ @param [in]    manifest            terminal manifest object
++
++ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Get the ID of the associated connection terminal
++
++  Only valid for load terminals.
++
++  @param    manifest[in]            terminal manifest object
++
++  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
++  OR if there is no associated connect terminal
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
++    const ia_css_terminal_manifest_t        *manifest);
++
++/*! Set the ID of the associated connection terminal
++
++  Only valid for load terminals.
++
++  @param    manifest[in]            terminal manifest object
++  @param    ID[in]                terminal ID
++
++  @return < 0 on invalid manifest argument (including when
++  manifest describes a connect terminal, unless ID is
++  IA_CSS_TERMINAL_INVALID_ID)
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_ID(
++    ia_css_terminal_manifest_t            *manifest,
++    const ia_css_terminal_ID_t            ID);
++
++/*! Returns the maximum payload size for an instance of the terminal
++   described in a manifest entry.
++
++   The payload size is the sum of the sizes of all
++   parameter sections for load terminals, or the maximum buffer size
++   for connect terminals.
++
++   @param manifest[in] Terminal manifest handle
++
++   @return Maximum size in bytes of the terminal payload
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_terminal_manifest_get_max_payload_size(
++    const ia_css_terminal_manifest_t *manifest);
++
++/*! Returns the maximum payload size for an instance of the terminal
++   described in a manifest entry.
++
++   The payload size is the sum of the sizes of all
++   parameter sections for load terminals, or the maximum buffer size
++   for connect terminals.
++
++   @param manifest[in] Terminal manifest handle
++   @param max_payload_size[in] Maximum payload size
++
++  @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_max_payload_size(
++    ia_css_terminal_manifest_t            *manifest,
++    uint32_t                             max_payload_size);
++
++/*! Get the supported frame types of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++
++ @return frame format bitmap, 0 on invalid manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t
++    ia_css_data_terminal_manifest_get_frame_format_bitmap(
++        const ia_css_data_terminal_manifest_t        *manifest);
++
++/*! Set the chosen frame type for the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    bitmap            frame format bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_frame_format_bitmap(
++    ia_css_data_terminal_manifest_t            *manifest,
++    ia_css_frame_format_bitmap_t            bitmap);
++
++/*! Check if the (data) terminal manifest object supports compression
++
++ @param [in]    manifest            (data) terminal manifest object
++
++ @return compression_support, true if compression is supported
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_data_terminal_manifest_can_support_compression(
++    const ia_css_data_terminal_manifest_t        *manifest);
++
++/*! Set the compression support feature of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    compression_support        set true to support compression
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_compression_support(
++    ia_css_data_terminal_manifest_t            *manifest,
++    bool                        compression_support);
++
++/*! Set the supported connection types of the terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    bitmap            connection bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_connection_bitmap(
++    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
++
++/*! Get the connection bitmap of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++
++ @return connection bitmap, 0 on invalid manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
++        const ia_css_data_terminal_manifest_t        *manifest);
++
++/*! Get the kernel dependency of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++
++ @return kernel bitmap, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
++    const ia_css_data_terminal_manifest_t        *manifest);
++
++/*! Set the kernel dependency of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    kernel_bitmap        kernel dependency bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_kernel_bitmap(
++    ia_css_data_terminal_manifest_t            *manifest,
++    const ia_css_kernel_bitmap_t            kernel_bitmap);
++
++/*! Set the unique kernel dependency of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    index            kernel dependency bitmap index
++
++ @return < 0 on invalid argument(s)
++ */
++extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
++    ia_css_data_terminal_manifest_t            *manifest,
++    const unsigned int                index);
++
++/*! Set the min size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    min_size            Minimum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_set_min_size(
++    ia_css_data_terminal_manifest_t *manifest,
++    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the max size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    max_size            Maximum size of the frame array
++
++  @return < 0 on invalid manifest argument
++  */
++extern int ia_css_data_terminal_manifest_set_max_size(
++    ia_css_data_terminal_manifest_t *manifest,
++    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the min size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    min_size            Minimum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_min_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the max size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    max_size            Maximum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_max_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the min fragment size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    min_size            Minimum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_set_min_fragment_size(
++    ia_css_data_terminal_manifest_t *manifest,
++    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the max fragment size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    max_size            Maximum size of the fragment array
++
++  @return < 0 on invalid manifest argument
++  */
++extern int ia_css_data_terminal_manifest_set_max_fragment_size(
++    ia_css_data_terminal_manifest_t *manifest,
++    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the min fragment size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    min_size            Minimum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_min_fragment_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the max fragment size of the (data) terminal manifest object
++
++ @param [in]    manifest            (data) terminal manifest object
++ @param    [in]    max_size            Maximum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_max_fragment_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*!
++ * Get the program control init connect section count for program prog.
++ * @param [in] prog program control init terminal program desc
++ * @return number of connect section for program prog.
++ */
++
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
++    const ia_css_program_control_init_manifest_program_desc_t *prog);
++
++/*!
++ * Get the program control init load section count for program prog.
++ * @param [in] prog program control init terminal program desc
++ * @return number of load section for program prog.
++ */
++
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
++    const ia_css_program_control_init_manifest_program_desc_t *prog);
++
++/*!
++ * Get the program control init terminal manifest size.
++ * @param [in] nof_programs        Number of programs.
++ * @param [in] nof_load_sections        Array of size nof_programs,
++ *                    encoding the number of load sections.
++ * @param [in] nof_connect_sections    Array of size nof_programs,
++ *                    encoding the number of connect sections.
++ * @return < 0 on invalid manifest argument
++ */
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_size(
++    const uint16_t nof_programs,
++    const uint16_t *nof_load_sections,
++    const uint16_t *nof_connect_sections);
++
++/*!
++ * Get the program control init terminal manifest program desc.
++ * @param [in] terminal        Program control init terminal.
++ * @param [in] program        Number of programs.
++ * @return program control init terminal program desc (or NULL if error).
++ */
++extern
++ia_css_program_control_init_manifest_program_desc_t *
++ia_css_program_control_init_terminal_manifest_get_program_desc(
++    const ia_css_program_control_init_terminal_manifest_t *terminal,
++    unsigned int program);
++
++/*!
++ * Initialize the program control init terminal manifest.
++ * @param [in] nof_programs        Number of programs
++ * @param [in] nof_load_sections        Array of size nof_programs,
++ *                    encoding the number of load sections.
++ * @param [in] nof_connect_sections    Array of size nof_programs,
++ *                    encoding the number of connect sections.
++ * @return < 0 on invalid manifest argument
++ */
++extern
++int ia_css_program_control_init_terminal_manifest_init(
++    ia_css_program_control_init_terminal_manifest_t *terminal,
++    const uint16_t nof_programs,
++    const uint16_t *nof_load_sections,
++    const uint16_t *nof_connect_sections);
++
++/*!
++ * Pretty prints the program control init terminal manifest.
++ * @param [in] terminal        Program control init terminal.
++ */
++extern
++void ia_css_program_control_init_terminal_manifest_print(
++    ia_css_program_control_init_terminal_manifest_t *terminal);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_terminal_manifest_impl.h"
++#endif
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..1a7b7995a848
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.hsys.user.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.hsys.user.h
++ *
++ * Define the methods on the termianl manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++/*! Print the terminal manifest object to file/stream
++
++ @param    manifest[in]            terminal manifest object
++ @param    fid[out]                file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_terminal_manifest_print(
++    const ia_css_terminal_manifest_t    *manifest,
++    void                    *fid);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
+new file mode 100644
+index 000000000000..22c40422fce7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest.sim.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal_manifest.sim.h
++ *
++ * Define the methods on the terminal manifest object: Simulation only
++ */
++
++#include <type_support.h>                    /* size_t */
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_defs.h"
++
++/*! Create (the storage for) the terminal manifest object
++
++ @param    terminal_type[in]    type of the terminal manifest {parameter, data}
++
++ @return NULL on error
++ */
++extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
++    const ia_css_terminal_type_t            terminal_type);
++
++/*! Destroy (the storage of) the terminal manifest object
++
++ @param    manifest[in]            terminal manifest
++
++ @return NULL
++ */
++extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
++    ia_css_terminal_manifest_t                *manifest);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
+new file mode 100644
+index 000000000000..8c99fa5d0782
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_manifest_impl.h
+@@ -0,0 +1,745 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
++
++#include <ia_css_psys_terminal_manifest.h>
++
++/* Data object types on the terminals */
++#include <ia_css_program_group_data.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
++#include <ia_css_kernel_bitmap.h>
++
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#include <error_support.h>
++#include <print_support.h>
++#include <misc_support.h>
++#include "ia_css_psys_static_trace.h"
++#include "ia_css_psys_static_storage_class.h"
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_program_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_program_control_init_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_parameter_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    /* will return an error value on error */
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_data_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    /* will return an error value on error */
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_data_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++        (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_sliced_terminal(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_type_t terminal_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
++
++    terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++    return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
++        (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_terminal_manifest_get_size(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    size_t size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_size(): enter:\n");
++
++    if (manifest != NULL) {
++        size = manifest->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_terminal_manifest_get_size: invalid argument\n");
++    }
++    return size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_type(): enter:\n");
++
++    if (manifest != NULL) {
++        terminal_type = manifest->terminal_type;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_terminal_manifest_get_type: invalid argument\n");
++    }
++    return terminal_type;
++}
++
++/** Temporary implementation of attributes based on terminal type ID
++ *
++ *  A later implementation in the PG manifest generator tool will
++ *  replace this and thus remove the dependency on the legacy
++ *  terminal type.
++ */
++static void ia_css_terminal_manifest_set_attributes_by_type(
++    ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_type_t terminal_type)
++{
++    /* Set defaults for most cases, and change in the later code for the rest. */
++    ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
++    ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
++    ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
++    ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
++
++    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
++        category = IA_CSS_TERMINAL_CAT_CONNECT;
++    }
++    ia_css_terminal_manifest_set_category(manifest, category);
++
++    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
++        direction = IA_CSS_TERMINAL_DIR_OUT;
++    }
++    ia_css_terminal_manifest_set_direction(manifest, direction);
++
++    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
++        rou = IA_CSS_TERMINAL_ROU_FRAG;
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++            rou = IA_CSS_TERMINAL_ROU_STREAM;
++    }
++    ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
++
++    if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++         (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
++        connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
++    } else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++             (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
++            connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
++    }
++    ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
++}
++
++/** Temporary implementation for new fields until the manfifest generator
++ *  tool will be enhance to set values directly.
++ *
++ *  - Attibutes are set to meaningful values by mapping terminal type to
++ *  attributes
++ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
++ *  - max_payload_size is set to UINT32_MAX
++ */
++static void ia_css_terminal_manifest_set_new_fields(
++    ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_type_t terminal_type)
++{
++    ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
++    assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
++    assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_type(
++    ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_type_t terminal_type)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_type(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->terminal_type = terminal_type;
++        ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_type failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_ID(
++    ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_ID_t ID)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->ID = ID;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_ID failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_ID_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = manifest->ID;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_ID failed\n");
++        retval = IA_CSS_TERMINAL_INVALID_ID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
++    const ia_css_terminal_manifest_t        *manifest)
++{
++    ia_css_terminal_ID_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_connect_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = manifest->assoc_ID;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_connect_ID failed\n");
++        retval = IA_CSS_TERMINAL_INVALID_ID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
++    const ia_css_terminal_manifest_t        *manifest)
++{
++    ia_css_terminal_cat_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_category(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = (ia_css_terminal_cat_t)manifest->attributes.category;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_category failed\n");
++        retval = IA_CSS_TERMINAL_CAT_INVALID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_category(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_cat_t category)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_category(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->attributes.category = category;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_category failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
++    const ia_css_terminal_manifest_t        *manifest)
++{
++    ia_css_terminal_dir_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_direction(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_direction failed\n");
++        retval = IA_CSS_TERMINAL_DIR_INVALID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_direction(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_dir_t direction)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_direction(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->attributes.direction = direction;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_direction failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
++    const ia_css_terminal_manifest_t        *manifest)
++{
++    ia_css_terminal_rou_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_rate_of_update failed\n");
++        retval = IA_CSS_TERMINAL_ROU_INVALID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_rate_of_update(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_terminal_rou_t rate_of_update)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->attributes.rou = rate_of_update;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
++    const ia_css_terminal_manifest_t        *manifest)
++{
++    ia_css_connect_buf_type_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_connect_buffer_type failed\n");
++        retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_buffer_type(
++    ia_css_terminal_manifest_t        *manifest,
++    ia_css_connect_buf_type_t connect_buf_type)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->attributes.connect_buf_type = connect_buf_type;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_ID(
++    ia_css_terminal_manifest_t            *manifest,
++    const ia_css_terminal_ID_t            ID)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_connect_ID(): enter:\n");
++
++    if (manifest != NULL &&
++        ((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
++        (IA_CSS_TERMINAL_INVALID_ID == ID))) {
++        manifest->assoc_ID = ID;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_terminal_manifest_get_max_payload_size(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_terminal_ID_t retval;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
++
++    if (manifest != NULL) {
++        retval = manifest->max_payload_size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_get_max_payload_size failed\n");
++        retval = IA_CSS_TERMINAL_INVALID_ID;
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_max_payload_size(
++    ia_css_terminal_manifest_t            *manifest,
++    uint32_t                             max_payload_size)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->max_payload_size = max_payload_size;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
++    const ia_css_terminal_manifest_t *manifest)
++{
++    ia_css_program_group_manifest_t    *parent = NULL;
++    char *base;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_get_parent(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    base = (char *)((char *)manifest + manifest->parent_offset);
++
++    parent = (ia_css_program_group_manifest_t *)(base);
++EXIT:
++    return parent;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_parent_offset(
++    ia_css_terminal_manifest_t *manifest,
++    int32_t terminal_offset)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_terminal_manifest_set_parent_offset(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    /* parent is at negative offset away from current terminal offset*/
++    manifest->parent_offset = -terminal_offset;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
++ia_css_data_terminal_manifest_get_frame_format_bitmap(
++    const ia_css_data_terminal_manifest_t *manifest)
++{
++    ia_css_frame_format_bitmap_t bitmap = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        bitmap = manifest->frame_format_bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_frame_format_bitmap(
++    ia_css_data_terminal_manifest_t *manifest,
++    ia_css_frame_format_bitmap_t bitmap)
++{
++    int ret = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->frame_format_bitmap = bitmap;
++        ret = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
++            ret);
++    }
++
++    return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_data_terminal_manifest_can_support_compression(
++    const ia_css_data_terminal_manifest_t *manifest)
++{
++    bool compression_support = false;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
++
++    if (manifest != NULL) {
++        /* compression_support is used boolean encoded in uint8_t.
++         * So we only need to check
++         * if this is non-zero
++         */
++        compression_support = (manifest->compression_support != 0);
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
++    }
++
++    return compression_support;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_compression_support(
++    ia_css_data_terminal_manifest_t *manifest,
++    bool compression_support)
++{
++    int ret = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->compression_support =
++            (compression_support == true) ? 1 : 0;
++        ret = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
++            ret);
++    }
++
++    return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
++    const ia_css_data_terminal_manifest_t *manifest)
++{
++    ia_css_connection_bitmap_t connection_bitmap = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        connection_bitmap = manifest->connection_bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
++    }
++    return connection_bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_connection_bitmap(
++    ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
++{
++    int ret = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
++        assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
++
++        manifest->connection_bitmap = bitmap;
++        ret = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
++    }
++    return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
++    const ia_css_data_terminal_manifest_t *manifest)
++{
++    ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        kernel_bitmap = manifest->kernel_bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
++    }
++    return kernel_bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_kernel_bitmap(
++    ia_css_data_terminal_manifest_t    *manifest,
++    const ia_css_kernel_bitmap_t kernel_bitmap)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->kernel_bitmap = kernel_bitmap;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
++            retval);
++    }
++
++    return retval;
++}
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
+new file mode 100644
+index 000000000000..ef3b79157d43
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_terminal_private_types.h
+@@ -0,0 +1,102 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
++#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
++
++#include "ia_css_terminal_types.h"
++#include "ia_css_program_group_data.h"
++#include "ia_css_psys_manifest_types.h"
++
++#define    N_UINT16_IN_DATA_TERMINAL_STRUCT    2
++#define    N_UINT8_IN_DATA_TERMINAL_STRUCT        3
++#define    N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT    1
++
++/* ========================= Data terminal - START ========================= */
++
++#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
++    + IA_CSS_FRAME_STRUCT_BITS \
++    + IA_CSS_STREAM_STRUCT_BITS \
++    + IA_CSS_UINT32_T_BITS \
++    + IA_CSS_CONNECTION_TYPE_BITS \
++    + (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
++    + (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)    \
++    + (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
++
++/**
++ * The (data) terminal can be attached to a buffer or a stream.
++ * The stream interface is not necessarily limited to strict in-order access.
++ * For a stream the restriction is that contrary to a buffer it cannot be
++ * addressed directly, i.e. it behaves as a port,
++ * but it may support stream_pos() and/or seek() operations
++ */
++struct ia_css_data_terminal_s {
++    /** Data terminal base class */
++    ia_css_terminal_t base;
++    /** Properties of the image data attached to the terminal */
++    ia_css_frame_descriptor_t frame_descriptor;
++    /** Data buffer handle attached to the terminal */
++    ia_css_frame_t frame;
++    /** (exclusive) Data stream handle attached to the terminal
++     * if the data is sourced over a device port
++     *
++     * @note No known use of the field.
++     */
++    ia_css_stream_t stream;
++    /** Reserved
++    * @note No known intent for this reservation field. */
++    uint32_t reserved;
++    /** Tranfer method for send/receving data to/from this terminal. */
++    ia_css_connection_type_t connection_type;
++    /** Offset in bytes from the start of this structure to a Array[fragment_count] of
++     *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
++     *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
++     */
++    uint16_t fragment_descriptor_offset;
++    /** Size of streaming to GEN buffer in lines. This field will be used only
++     *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
++     */
++    uint16_t stream2gen_buffer_size;
++    /** Kernel id that this terminal is associated with.  If that kernel
++     *  is disabled, this terminal is considered disabled as well.
++     *  Must be set the single kernel defined in the manifest for this terminal's
++     *  ID (ia_css_terminal_s::ID). */
++    uint8_t kernel_id;
++    /** Indicate to which subgraph this terminal belongs
++     * for common constraints
++     *
++     * @note No known use.
++     */
++    uint8_t subgraph_id;
++    /** Link ID of the data terminal.  Two terminals can optionally be
++     *  marked as linked to each other by setting the same link ID.
++     *  Hardware topology or logical or algorithmic constraints may restrict the
++     *  terminal that can be so linked.
++     *  In current practice, link ID's have special meaning related to
++     *  the connection type (see "connection_type" field in this structure) or
++     *  synchronization of program groups.
++     *  @see ia_css_isys_link_id_t
++     *  @see ia_css_data_barrier_link_id_t
++     *  @see ia_css_stream2gen_link_id_t */
++    uint8_t link_id;
++    /** Padding for 64bit alignment */
++    uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
++};
++/* ========================== Data terminal - END ========================== */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
+new file mode 100644
+index 000000000000..23f84fd981be
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TRANSPORT_H
++#define __IA_CSS_PSYS_TRANSPORT_H
++
++#include <ia_css_psys_transport_dep.h>        /* ia_css_psys_cmd_queues */
++#include <vied_nci_psys_system_global.h>    /* vied_vaddress_t */
++
++#include <type_support.h>
++
++typedef enum ia_css_psys_event_queues {
++    /** The in-order queue for event returns */
++    IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
++    IA_CSS_N_PSYS_EVENT_QUEUE_ID
++} ia_css_psys_event_queue_ID_t;
++
++typedef enum ia_css_psys_event_types {
++    /** No error to report. */
++    IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
++    /** Unknown unhandled error */
++    IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
++    /* Retrieving remote object: */
++    /** Object ID not found */
++    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
++    /** Objects too big, or size is zero. */
++    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
++    /** Failed to load whole process group from tproxy/dma  */
++    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
++    /** The proper package could not be found */
++    IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
++    /* Process group: */
++    /** Failed to run, error while loading frame */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
++    /** Failed to run, error while loading fragment */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
++    /** The process count of the process group is zero */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
++    /** Process(es) initialization */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
++    /** Aborted (after host request) */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
++    /** NULL pointer in the process group */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
++    /** Process group validation failed */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
++    /** Error handling- invalid frame detected by CSI (ISYS) */
++    IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
++} ia_css_psys_event_type_t;
++
++#define IA_CSS_PSYS_CMD_BITS    64
++struct ia_css_psys_cmd_s {
++    /** The command issued to the process group */
++    uint16_t    command;
++    /** Message field of the command */
++    uint16_t    msg;
++    /** The context reference (process group/buffer set/...) */
++    uint32_t    context_handle;
++};
++
++#define IA_CSS_PSYS_EVENT_BITS    128
++typedef struct ia_css_psys_event_s {
++    /** The (return) status of the command issued to
++     * the process group this event refers to
++     */
++    uint16_t    status;
++    /** The command issued to the process group this event refers to */
++    uint16_t    command;
++    /** The context reference (process group/buffer set/...) */
++    uint32_t    context_handle;
++    /** This token (size) must match the token registered
++     * in a process group
++     */
++    uint64_t    token;
++} ia_css_psys_event_s_t;
++
++struct ia_css_psys_buffer_s {
++    /** The in-order queue for scheduled process groups */
++    void        *host_buffer;
++    vied_vaddress_t    *isp_buffer;
++};
++
++#endif /* __IA_CSS_PSYS_TRANSPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
+new file mode 100644
+index 000000000000..5010c5b7a7e7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psys_transport_dep.h
+@@ -0,0 +1,66 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
++#define __IA_CSS_PSYS_TRANSPORT_DEP_H
++
++/*
++ * The ID's of the Psys specific queues.
++ */
++typedef enum ia_css_psys_cmd_queues {
++    /**< The in-order queue for scheduled process groups */
++    IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
++    /**< The in-order queue for commands changing psys or
++     * process group state
++     */
++    IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
++    /**< All in-order queues for dedicated PPG commands */
++    IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG6_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG7_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG8_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG9_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG10_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG11_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG12_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG13_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG14_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG15_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG16_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG17_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG18_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG19_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG20_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG21_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG22_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG23_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG24_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG25_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG26_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG27_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG28_COMMAND_ID,
++    IA_CSS_PSYS_CMD_QUEUE_PPG29_COMMAND_ID,
++    IA_CSS_N_PSYS_CMD_QUEUE_ID
++} ia_css_psys_cmd_queue_ID_t;
++
++#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
++
++#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
+new file mode 100644
+index 000000000000..9033b8d1a19a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi.h
+@@ -0,0 +1,25 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_H
++#define __IA_CSS_PSYSAPI_H
++
++#include <ia_css_psys_process.hsys.user.h>
++#include <ia_css_psys_process.hsys.kernel.h>
++#include <ia_css_psys_process_group.hsys.user.h>
++#include <ia_css_psys_process_group.hsys.kernel.h>
++
++#endif /* __IA_CSS_PSYSAPI_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
+new file mode 100644
+index 000000000000..89c63a75c817
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_fw_version.h
+@@ -0,0 +1,35 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
++#define __IA_CSS_PSYSAPI_FW_VERSION_H
++
++/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
++#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
++
++enum ia_css_process_group_protocol_version {
++    /**
++     * Legacy protocol
++     */
++    IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
++    /**
++     * Persistent process group support protocol
++     */
++    IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
++    IA_CSS_PROCESS_GROUP_N_PROTOCOLS
++};
++
++#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
+new file mode 100644
+index 000000000000..a98c47c3ecf4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_psysapi_trace.h
+@@ -0,0 +1,80 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_TRACE_H
++#define __IA_CSS_PSYSAPI_TRACE_H
++
++#include "ia_css_trace.h"
++
++#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
++#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
++#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
++
++/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
++ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
++ * psysapi.mk fill it will be set by default to no trace
++ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
++ */
++#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++#if !defined(PSYSAPI_TRACE_CONFIG)
++    #define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
++#endif
++
++/* Module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_TRACE_CONFIG))
++    /* Module specific trace setting */
++    #if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
++        /* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++        /* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
++        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
++    #elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++        /* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++        #define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++        #define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
++        #define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
++    #else
++        #error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
++    #endif
++#else
++    #error "PSYSAPI_TRACE_CONFIG not defined"
++#endif
++
++/* Overriding submodules in PSYSAPI with a specific tracing level */
++/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
++
++#endif /* __IA_CSS_PSYSAPI_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
+new file mode 100644
+index 000000000000..fbe6222a4e0a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm.h
+@@ -0,0 +1,199 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_H
++#define __IA_CSS_RBM_H
++
++#include "ia_css_rbm_storage_class.h"
++#include <type_support.h>
++
++/*
++ * IPU6 adds a lot of mux/demux/blk,
++ * 96 bits is not enough
++ * need 160 bits (has to multiply of 32 bits)
++ * after X2B / DOL / PAF enabled in isa_lb PG
++ */
++#define IA_CSS_RBM_BITS 160
++/** An element is a 32 bit unsigned integer. 64 bit integers might cause
++ * problems in the compiler.
++ */
++#define IA_CSS_RBM_ELEM_TYPE uint32_t
++#define IA_CSS_RBM_ELEM_BITS \
++    (sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
++#define IA_CSS_RBM_NOF_ELEMS \
++    ((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
++
++/** Users should make no assumption about the actual type of
++ * ia_css_rbm_t.
++ */
++typedef struct {
++    IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
++} ia_css_rbm_elems_t;
++typedef ia_css_rbm_elems_t ia_css_rbm_t;
++
++/** Print the bits of a routing bitmap
++ * @return < 0 on error
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_rbm_print(
++    const ia_css_rbm_t    bitmap,
++    void *fid);
++
++/** Create an empty routing bitmap
++ * @return bitmap = 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_clear(void);
++
++/** Creates the complement of a routing bitmap
++ * @param    bitmap[in] routing bitmap
++ * @return ~bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_complement(
++    const ia_css_rbm_t bitmap);
++
++/** Create the union of two routing bitmaps
++ * @param    bitmap0[in]    routing bitmap 0
++ * @param    bitmap1[in]    routing bitmap 1
++ * @return bitmap0 | bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_union(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1);
++
++/** Create the intersection of two routing bitmaps
++ * @param    bitmap0[in]    routing bitmap 0
++ * @param    bitmap1[in] routing bitmap 1
++ * @return bitmap0 & bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_intersection(
++    const ia_css_rbm_t            bitmap0,
++    const ia_css_rbm_t            bitmap1);
++
++/** Check if the routing bitmaps is empty
++ * @param bitmap[in] routing bitmap
++ * @return bitmap == 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_empty(
++    const ia_css_rbm_t bitmap);
++
++/** Check if the intersection of two routing bitmaps is empty
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in] routing bitmap 1
++ * @return (bitmap0 & bitmap1) == 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_intersection_empty(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1);
++
++/** Check if the second routing bitmap is a subset of the first (or equal)
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in routing bitmap 1
++ * Note: An empty set is always a subset, this function
++ * returns true if bitmap 1 is empty
++ * @return (bitmap0 & bitmap1) == bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_subset(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1);
++
++/** Check if the routing bitmaps are equal
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in] routing bitmap 1
++ * @return bitmap0 == bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_equal(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1);
++
++/** Checks whether a specific kernel bit is set
++ * @return bitmap[index] == 1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_is_rbm_set(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index);
++
++/** Returns range of bits as integer
++ * @return bitmap[index, index+size]
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_rbm_range_val(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index,
++    const unsigned int size);
++
++/** Create the union of a routing bitmap with a onehot bitmap
++ * with a bit set at index
++ * @return bitmap[index] |= 1
++*/
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_set(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index);
++
++/*! Set elem_index-th 32-bit element of the bitmap to elem_value
++ * @return updated bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
++    const ia_css_rbm_t bitmap,
++    const unsigned int elem_index,
++    const uint32_t     elem_value);
++
++/** Creates routing bitmap using a uint64 value.
++ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_create_from_uint64(
++    const uint64_t    value);
++
++/** Converts an ia_css_rbm_t type to uint64_t. Note that if
++ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
++ *  are returned.
++ *  @return uint64_t representation of value
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++uint64_t ia_css_rbm_to_uint64(
++    const ia_css_rbm_t value);
++
++/** Creates a routing bitmap with the bit at index 'index' removed.
++ * @return ~(1 << index) & bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_unset(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index);
++
++/** Create a onehot routing bitmap with a bit set at index
++ * @return bitmap[index] = 1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_bit_mask(
++    const unsigned int index);
++
++#ifdef __IA_CSS_RBM_INLINE__
++#include "ia_css_rbm_impl.h"
++#endif /* __IA_CSS_RBM_INLINE__ */
++
++#endif /* __IA_CSS_RBM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
+new file mode 100644
+index 000000000000..0ed5684219c7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_impl.h
+@@ -0,0 +1,410 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_rbm.h"
++#include "type_support.h"
++#include "misc_support.h"
++#include "assert_support.h"
++#include "math_support.h"
++#include "ia_css_rbm_trace.h"
++
++STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
++    const ia_css_rbm_t bitmap);
++
++STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
++    const ia_css_rbm_t bitmap);
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_intersection_empty(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1)
++{
++    ia_css_rbm_t intersection;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_is_rbm_intersection_empty(): enter:\n");
++
++    intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
++    return ia_css_is_rbm_empty(intersection);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_empty(
++    const ia_css_rbm_t bitmap)
++{
++    unsigned int i;
++    bool is_empty = true;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_is_rbm_empty(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        is_empty &= bitmap.data[i] == 0;
++    }
++    return is_empty;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_equal(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1)
++{
++    unsigned int i;
++    bool is_equal = true;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_is_rbm_equal(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
++    }
++    return is_equal;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_subset(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1)
++{
++    unsigned int i;
++    bool is_subset = true;
++
++    /* checks if bitmap1 is subset of bitmap 0 */
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_is_rbm_subset(): enter:\n");
++
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
++    }
++
++    return is_subset;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_clear(void)
++{
++    unsigned int i;
++    ia_css_rbm_t bitmap = {{0} };
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_clear(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        bitmap.data[i] = 0;
++    }
++    return bitmap;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_complement(
++    const ia_css_rbm_t bitmap)
++{
++    unsigned int i;
++    ia_css_rbm_t result = {{0} };
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_complement(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        result.data[i] = ~bitmap.data[i];
++    }
++    return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_union(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1)
++{
++    unsigned int i;
++    ia_css_rbm_t result = {{0} };
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_union(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
++    }
++    return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_intersection(
++    const ia_css_rbm_t bitmap0,
++    const ia_css_rbm_t bitmap1)
++{
++    unsigned int i;
++    ia_css_rbm_t result = {{0} };
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_intersection(): enter:\n");
++    for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
++    }
++    return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_set(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index)
++{
++    ia_css_rbm_t bit_mask;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_set(): enter:\n");
++
++    bit_mask = ia_css_rbm_bit_mask(index);
++    return ia_css_rbm_union(bitmap, bit_mask);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
++    const ia_css_rbm_t bitmap,
++    const unsigned int elem_index,
++    const uint32_t     elem_value)
++{
++    ia_css_rbm_t result = bitmap;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_set_element_from_uint32(): enter:\n");
++
++    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
++
++    if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
++        result.data[elem_index] = elem_value;
++    } else {
++        assert(0);
++    }
++
++    return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_create_from_uint64(
++    const uint64_t value)
++{
++    unsigned int i;
++    ia_css_rbm_t result;
++    const unsigned int bits64 = sizeof(uint64_t) * 8;
++    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_create_from_uint64(): enter:\n");
++
++    result = ia_css_rbm_clear();
++    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
++        /* masking is done implictly, the MSB bits of casting will be chopped off */
++        result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
++            (value >> (i * IA_CSS_RBM_ELEM_BITS));
++    }
++
++    return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++uint64_t ia_css_rbm_to_uint64(
++    const ia_css_rbm_t value)
++{
++    const unsigned int bits64 = sizeof(uint64_t) * 8;
++    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
++    unsigned int i;
++    uint64_t res = 0;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_to_uint64(): enter:\n");
++
++    assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
++    assert(nof_elems_bits64 > 0);
++
++    for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
++        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
++    }
++    for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++        assert(value.data[i] == 0);
++    }
++    return res;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_unset(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index)
++{
++    ia_css_rbm_t result;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_unset(): enter:\n");
++
++    result = ia_css_rbm_bit_mask(index);
++    result = ia_css_rbm_complement(result);
++    return ia_css_rbm_intersection(bitmap, result);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_bit_mask(
++    const unsigned int index)
++{
++    unsigned int elem_index;
++    unsigned int elem_bit_index;
++    ia_css_rbm_t bit_mask = ia_css_rbm_clear();
++
++    assert(index < IA_CSS_RBM_BITS);
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_bit_mask(): enter:\n");
++    if (index < IA_CSS_RBM_BITS) {
++        elem_index = index / IA_CSS_RBM_ELEM_BITS;
++        elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++        assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++
++        bit_mask.data[elem_index] = 1 << elem_bit_index;
++    }
++    return bit_mask;
++}
++
++STORAGE_CLASS_INLINE
++int ia_css_rbm_compute_weight(
++    const ia_css_rbm_t bitmap)
++{
++    ia_css_rbm_t loc_bitmap;
++    int weight = 0;
++    int i;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_compute_weight(): enter:\n");
++
++    loc_bitmap = bitmap;
++
++    /* In fact; do not need the iterator "i" */
++    for (i = 0; (i < IA_CSS_RBM_BITS) &&
++        !ia_css_is_rbm_empty(loc_bitmap); i++) {
++        weight += ia_css_is_rbm_set(loc_bitmap, 0);
++        loc_bitmap = ia_css_rbm_shift(loc_bitmap);
++    }
++
++    return weight;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_rbm_range_val(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index,
++    const unsigned int size)
++{
++    unsigned int elem_index;
++    unsigned int elem_bit_index;
++    unsigned int res;
++    unsigned int elem_index_end;
++    unsigned int mask;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
++    assert(index < IA_CSS_RBM_BITS);
++    /* Extract the bit range from the data array relevane entry */
++    elem_index = index / IA_CSS_RBM_ELEM_BITS;
++    elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
++    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++    mask =  (1 << size) - 1;
++    res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
++    /* In case that the bit range is divided between 2 different data array entries */
++    if (elem_index != elem_index_end) {
++        unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
++        unsigned int second_elem_size = size - first_elem_size;
++
++        mask = (1 << second_elem_size) - 1;
++        res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
++    }
++    return res;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_is_rbm_set(
++    const ia_css_rbm_t bitmap,
++    const unsigned int index)
++{
++    unsigned int elem_index;
++    unsigned int elem_bit_index;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_is_rbm_set(): enter:\n");
++
++    assert(index < IA_CSS_RBM_BITS);
++
++    elem_index = index / IA_CSS_RBM_ELEM_BITS;
++    elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++    assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++    return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
++}
++
++STORAGE_CLASS_INLINE
++ia_css_rbm_t ia_css_rbm_shift(
++    const ia_css_rbm_t bitmap)
++{
++    int i;
++    unsigned int lsb_current_elem = 0;
++    unsigned int lsb_previous_elem = 0;
++    ia_css_rbm_t loc_bitmap;
++
++    IA_CSS_TRACE_0(RBM, VERBOSE,
++        "ia_css_rbm_shift(): enter:\n");
++
++    loc_bitmap = bitmap;
++
++    for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
++        lsb_current_elem = bitmap.data[i] & 0x01;
++        loc_bitmap.data[i] >>= 1;
++        loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
++        lsb_previous_elem = lsb_current_elem;
++    }
++    return loc_bitmap;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_rbm_print(
++    const ia_css_rbm_t bitmap,
++    void               *fid)
++{
++    int i;
++    const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
++
++    NOT_USED(fid);
++
++    CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
++    CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
++
++    if (IA_CSS_RBM_NOF_ELEMS == 1) {
++        IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
++            data[0]);
++
++    } else if (IA_CSS_RBM_NOF_ELEMS == 2) {
++        IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
++            data[1], data[0]);
++
++    } else if (IA_CSS_RBM_NOF_ELEMS == 3) {
++        IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
++            data[2], data[1], data[0]);
++
++    } else if (IA_CSS_RBM_NOF_ELEMS == 4) {
++        IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
++            data[3], data[2], data[1], data[0]);
++
++    } else {
++        IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
++
++        for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
++            IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
++        }
++        IA_CSS_TRACE_0(RBM, INFO, "}\n");
++    }
++
++    return 0;
++}
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
+new file mode 100644
+index 000000000000..3145e0e10f2e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest.h
+@@ -0,0 +1,146 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_MANIFEST_H
++#define __IA_CSS_RBM_MANIFEST_H
++
++#include "type_support.h"
++#include "ia_css_rbm_manifest_types.h"
++
++/** Returns the descriptor size of the RBM manifest.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_size(void);
++
++/** Initializes the RBM manifest.
++ * @param rbm[in] Routing bitmap.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++void
++ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
++
++/** Returns a pointer to the array of mux descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_mux_desc_t *
++ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns the size of mux descriptors array.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns a pointer to the array of validation descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_validation_rule_t *
++ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns the size of the validation descriptor array.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns a pointer to the array of terminal routing descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_terminal_routing_desc_t *
++ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
++
++/** \brief Returns the size of the terminal routing descriptor array.
++ * Note: pretty printing differs from on host and on IPU.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Pretty prints the routing bitmap manifest.
++ * @param manifest[in] Routing bitmap manifest.
++ */
++void
++ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
++
++/** \brief Pretty prints a RBM (routing bitmap).
++ * Note: pretty printing differs from on host and on IPU.
++ * @param rbm[in]             Routing bitmap.
++ * @param mux[in]             List of mux descriptors corresponding to rbm.
++ * @param mux_desc_count[in]  Number of muxes in list mux.
++ */
++void
++ia_css_rbm_pretty_print(
++    const ia_css_rbm_t *rbm,
++    const ia_css_rbm_mux_desc_t *mux,
++    unsigned int mux_desc_count);
++
++/** \brief check for the validity of a routing bitmap.
++ * @param manifest[in] Routing bitmap manifest.
++ * @param rbm[in]      Routing bitmap
++ * @return true on match.
++ */
++bool
++ia_css_rbm_manifest_check_rbm_validity(
++    const ia_css_rbm_manifest_t *manifest,
++    const ia_css_rbm_t *rbm);
++
++/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
++ * @param rbm[in]             Routing bitmap.
++ * @param mux[in]             List of mux descriptors corresponding to rbm.
++ * @param mux_count[in]       Number of muxes in list mux.
++ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
++ * @param mux_id[in]          ID of mux to set configuration for.
++ * @param value[in]           Value of the mux.
++ * @return routing bitmap.
++ */
++ia_css_rbm_t
++ia_css_rbm_set_mux(
++    ia_css_rbm_t rbm,
++    ia_css_rbm_mux_desc_t *mux,
++    unsigned int mux_count,
++    unsigned int gp_dev_id,
++    unsigned int mux_id,
++    unsigned int value);
++
++/** \brief Gets the value of a mux.
++ * @param rbm      routing bitmap
++ * @param mux_desc mux descriptor
++ * @return Mux value corresponding to mux_desc, -1 on error.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++int
++ia_css_rbm_get_mux_value(
++    const ia_css_rbm_t *rbm,
++    const ia_css_rbm_mux_desc_t *mux_desc);
++
++#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
++#include "ia_css_rbm_manifest_impl.h"
++#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
++
++#endif /* __IA_CSS_RBM_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
+new file mode 100644
+index 000000000000..662b9ef342fb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_manifest_types.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
++#define __IA_CSS_RBM_MANIFEST_TYPES_H
++
++#include "ia_css_rbm.h"
++#include "vied_nci_psys_resource_model.h"
++
++#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
++#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
++#endif
++#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
++#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
++#endif
++#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
++#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
++#endif
++#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
++#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
++#endif
++
++#define SIZE_OF_RBM_MUX_DESC_S ( \
++    (4 * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_mux_desc_s {
++    uint8_t gp_dev_id;
++    uint8_t mux_id;
++    uint8_t offset;
++    uint8_t size_bits;
++} ia_css_rbm_mux_desc_t;
++
++#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
++      (1 * IA_CSS_RBM_BITS) \
++    + (1 * IA_CSS_UINT32_T_BITS))
++
++typedef struct ia_css_rbm_validation_rule_s {
++    ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
++    uint32_t expected_value;
++} ia_css_rbm_validation_rule_t;
++
++#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
++    (4 * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_terminal_routing_desc_s {
++    uint8_t terminal_id;
++    uint8_t connection_state;
++    uint8_t mux_id;
++    uint8_t state;
++} ia_css_rbm_terminal_routing_desc_t;
++
++#define SIZE_OF_RBM_MANIFEST_S ( \
++      (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
++    + (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
++    + (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
++    + (3 * IA_CSS_UINT16_T_BITS) \
++    + (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_manifest_s {
++#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
++    ia_css_rbm_validation_rule_t
++        validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
++#endif
++    uint16_t mux_desc_count;
++    uint16_t validation_rule_count;
++    uint16_t terminal_routing_desc_count;
++
++#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
++    ia_css_rbm_mux_desc_t
++        mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
++#endif
++
++#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
++    ia_css_rbm_terminal_routing_desc_t
++        terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
++#endif
++
++#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
++    uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
++#endif
++} ia_css_rbm_manifest_t;
++
++#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
+new file mode 100644
+index 000000000000..5f72bd1736f5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_storage_class.h
+@@ -0,0 +1,38 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
++#define __IA_CSS_RBM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_RBM_INLINE__
++#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_RBM_STORAGE_CLASS_C
++#else
++#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
++#else
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
+new file mode 100644
+index 000000000000..80086ca502f8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_rbm_trace.h
+@@ -0,0 +1,79 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_TRACE_H
++#define __IA_CSS_RBM_TRACE_H
++
++#include "ia_css_trace.h"
++
++/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
++* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
++*/
++#define RBM_TRACE_LOG_LEVEL_OFF 1
++#define RBM_TRACE_LOG_LEVEL_NORMAL 2
++#define RBM_TRACE_LOG_LEVEL_DEBUG 3
++
++#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
++
++#if !defined(RBM_TRACE_CONFIG)
++#    define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
++#endif
++
++/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
++#ifdef __HIVECC
++#    ifndef HRT_CSIM
++#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
++#    else
++#        define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++#    endif
++#else
++#    define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++#endif
++
++#if (defined(RBM_TRACE_CONFIG))
++/* Module specific trace setting */
++#    if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
++/* RBM_TRACE_LOG_LEVEL_OFF */
++#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
++#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
++/* RBM_TRACE_LOG_LEVEL_NORMAL */
++#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_DISABLED
++#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_DISABLED
++#    elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
++/* RBM_TRACE_LOG_LEVEL_DEBUG */
++#        define RBM_TRACE_LEVEL_ASSERT    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_ERROR    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_WARNING    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_INFO    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_DEBUG    IA_CSS_TRACE_LEVEL_ENABLED
++#        define RBM_TRACE_LEVEL_VERBOSE    IA_CSS_TRACE_LEVEL_ENABLED
++#    else
++#        error "No RBM_TRACE_CONFIG Tracing level defined"
++#    endif
++#else
++#    error "RBM_TRACE_CONFIG not defined"
++#endif
++
++#endif /* __RBM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
+new file mode 100644
+index 000000000000..9959c01f6dcc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal.h
+@@ -0,0 +1,187 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_H
++#define __IA_CSS_TERMINAL_H
++
++#include "type_support.h"
++#include "ia_css_terminal_types.h"
++#include "ia_css_param_storage_class.h"
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_in_terminal_get_descriptor_size(
++    const unsigned int nof_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_section_desc_t *
++ia_css_param_in_terminal_get_param_section_desc(
++    const ia_css_param_terminal_t *param_terminal,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_out_terminal_get_descriptor_size(
++    const unsigned int nof_sections,
++    const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_section_desc_t *
++ia_css_param_out_terminal_get_param_section_desc(
++    const ia_css_param_terminal_t *param_terminal,
++    const unsigned int section_index,
++    const unsigned int nof_sections,
++    const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_param_terminal_create(
++    ia_css_param_terminal_t *param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++    const unsigned int nof_frame_param_sections,
++    const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_grid_desc_t *
++ia_css_spatial_param_terminal_get_fragment_grid_desc(
++    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_frame_grid_param_section_desc_t *
++ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
++    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_spatial_param_terminal_create(
++    ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal,
++    const unsigned int nof_fragments,
++    const uint32_t kernel_id
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
++    const unsigned int nof_slice_param_sections,
++    const unsigned int nof_slices[],
++    const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_slice_desc_t *
++ia_css_sliced_param_terminal_get_fragment_slice_desc(
++    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_slice_param_section_desc_t *
++ia_css_sliced_param_terminal_get_slice_param_section_desc(
++    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const unsigned int fragment_index,
++    const unsigned int slice_index,
++    const unsigned int section_index,
++    const unsigned int nof_slice_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_sliced_param_terminal_create(
++    ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal,
++    const unsigned int nof_slice_param_sections,
++    const unsigned int nof_slices[],
++    const unsigned int nof_fragments,
++    const uint32_t kernel_id
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_program_terminal_get_descriptor_size(
++    const unsigned int nof_fragments,
++    const unsigned int nof_fragment_param_sections,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int nof_command_objs
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_param_section_desc_t *
++ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int fragment_index,
++    const unsigned int section_index,
++    const unsigned int nof_fragment_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_kernel_fragment_sequencer_info_desc_t *
++ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int fragment_index,
++    const unsigned int info_index,
++    const unsigned int nof_kernel_fragment_sequencer_infos
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_create(
++    ia_css_program_terminal_t *program_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const unsigned int nof_fragments,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int nof_command_objs
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_get_command_base_offset(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int nof_fragments,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int commands_slots_used,
++    uint16_t *command_desc_offset
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++uint16_t *ia_css_program_terminal_get_line_count(
++    const ia_css_kernel_fragment_sequencer_command_desc_t
++    *kernel_fragment_sequencer_command_desc_base,
++    const unsigned int set_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++    const unsigned int nof_frame_param_sections,
++    const unsigned int nof_fragments
++);
++
++#ifdef __INLINE_PARAMETERS__
++#include "ia_css_terminal_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
++
++#endif /* __IA_CSS_TERMINAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
+new file mode 100644
+index 000000000000..91dfc139ea9d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_base_types.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
++#define __IA_CSS_TERMINAL_BASE_TYPES_H
++
++#include "type_support.h"
++#include "ia_css_terminal_defs.h"
++
++#define N_UINT16_IN_TERMINAL_STRUCT        3
++#define N_UINT32_IN_TERMINAL_STRUCT        1
++#define N_PADDING_UINT8_IN_TERMINAL_STRUCT    1
++
++#define SIZE_OF_TERMINAL_STRUCT_BITS \
++    (IA_CSS_TERMINAL_TYPE_BITS \
++    + N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
++    + IA_CSS_TERMINAL_ID_BITS  \
++    + N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/* ==================== Base Terminal - START ==================== */
++/** Base structure for all terminal types.
++ *
++ *  Terminals describe an opening between a program group and the outside world.
++ *  They come in various types (data, statisitics, parameters, etc.) which may have
++ *  extensions specific to those types.  This structure is the base for all of those and
++ *  must be the first field in any  subclassed terminal structure type.
++ */
++struct ia_css_terminal_s {                        /**< Base terminal */
++    ia_css_terminal_type_t            terminal_type;        /**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
++    uint32_t                payload_size;    /**< Size of buffer passed in buffer set for this terminal */
++    int16_t                    parent_offset;        /**< Offset to the containing process group */
++    uint16_t                size;            /**< Size of this whole terminal layout-structure, including subclassed extensions. */
++    uint16_t                tm_index;        /**< Index of the terminal manifest object in the program group manifest. */
++    ia_css_terminal_ID_t            ID;            /**< Absolute referal ID for this terminal, valid ID's != 0 */
++    uint8_t                    padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
++};
++/* ==================== Base Terminal - END ==================== */
++
++#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
+new file mode 100644
+index 000000000000..0766c323681f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_defs.h
+@@ -0,0 +1,209 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_DEFS_H
++#define __IA_CSS_TERMINAL_DEFS_H
++
++#include "type_support.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define IA_CSS_TERMINAL_ID_BITS        8
++typedef uint8_t                ia_css_terminal_ID_t;
++#define IA_CSS_TERMINAL_INVALID_ID    ((ia_css_terminal_ID_t)(-1))
++
++/**
++ * Terminal category
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_cat {
++    IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
++    IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
++    IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_cat_t;
++#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
++
++/**
++ * Terminal direction
++ *
++ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
++ * output generated by IPU.
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_dir {
++    IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
++    IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
++    IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_dir_t;
++#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
++
++/**
++ * Terminal Rate Of Update (ROU)
++ *
++ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
++ * output generated by IPU.
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_rou {
++    IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
++    IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
++    IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
++    IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_rou_t;
++#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
++
++/**
++ * Connect terminal payload content type
++ *
++ * Defines the broad usage of the buffers defined in connect terminals
++ */
++typedef enum ia_css_connect_buf_type {
++    IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
++    IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
++    IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
++    IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
++} ia_css_connect_buf_type_t;
++
++/** Unknown or irrelevant buffer type */
++#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
++
++/**
++ * Terminal type identifier
++ *
++ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
++ * and ia_css_connect_buf_type_t
++ * To stage the changes, this type will remain - for now...
++ *
++ * Inital type to attribute mapping table for staging:
++ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
++ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
++ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
++ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
++ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
++ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
++ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
++ */
++typedef enum ia_css_terminal_type {
++    /** Data input */
++    IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
++    /** Data output */
++    IA_CSS_TERMINAL_TYPE_DATA_OUT,
++    /** Type 6 parameter input */
++    IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
++    /** Type 1-5 parameter input.  Constant for all fragments in a frame. */
++    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
++    /** Type 1-5 parameter output */
++    IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
++    /** Represent the new type of terminal for the
++     * "spatial dependent parameters", when params go in
++     */
++    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
++    /** Represent the new type of terminal for the
++     * "spatial dependent parameters", when params go out
++     */
++    IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
++    /** Represent the new type of terminal for the
++     * explicit slicing, when params go in
++     */
++    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
++    /** Represent the new type of terminal for the
++     * explicit slicing, when params go out
++     */
++    IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
++    /** State (private data) input */
++    IA_CSS_TERMINAL_TYPE_STATE_IN,
++    /** State (private data) output */
++    IA_CSS_TERMINAL_TYPE_STATE_OUT,
++    /** Program parameters, may change per fragment */
++    IA_CSS_TERMINAL_TYPE_PROGRAM,
++    /** Program control parameters.  Non-alogrithmic parameters for system devices. */
++    IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
++    IA_CSS_N_TERMINAL_TYPES
++} ia_css_terminal_type_t;
++
++#define IA_CSS_TERMINAL_TYPE_BITS                32
++
++/* Temporary redirection needed to facilicate merging with the drivers
++   in a backwards compatible manner */
++#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
++
++/**
++ * Dimensions of the data objects. Note that a C-style
++ * data order is assumed. Data stored by row.
++ */
++typedef enum ia_css_dimension {
++    /** The number of columns, i.e. the size of the row */
++    IA_CSS_COL_DIMENSION = 0,
++    /** The number of rows, i.e. the size of the column */
++    IA_CSS_ROW_DIMENSION = 1,
++    IA_CSS_N_DATA_DIMENSION = 2
++} ia_css_dimension_t;
++
++#define IA_CSS_N_COMMAND_COUNT (4)
++
++#ifndef PIPE_GENERATION
++/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
++/**
++ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
++ */
++typedef enum ia_css_isys_link_id {
++    IA_CSS_ISYS_LINK_OFFLINE = 0,
++    IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
++    IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
++} ia_css_isys_link_id_t;
++#define N_IA_CSS_ISYS_LINK_ID    (IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
++
++/**
++ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
++ */
++typedef enum ia_css_data_barrier_link_id {
++    IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
++    IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
++    IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
++    IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
++    IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
++    N_IA_CSS_DATA_BARRIER_LINK_ID
++} ia_css_data_barrier_link_id_t;
++
++/**
++ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
++ * support.
++ */
++typedef enum ia_css_stream2gen_link_id {
++    IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
++    IA_CSS_STREAM2GEN_LINK_ID_1,
++    IA_CSS_STREAM2GEN_LINK_ID_2,
++    IA_CSS_STREAM2GEN_LINK_ID_3,
++    N_IA_CSS_STREAM2GEN_LINK_ID
++} ia_css_stream2gen_link_id_t;
++
++#endif /* #ifndef PIPE_GENERATION */
++/** @} */
++#endif /* __IA_CSS_TERMINAL_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
+new file mode 100644
+index 000000000000..ff6ff35c5bb8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_impl.h
+@@ -0,0 +1,497 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_IMPL_H
++#define __IA_CSS_TERMINAL_IMPL_H
++
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_types.h"
++#include "error_support.h"
++#include "assert_support.h"
++#include "storage_class.h"
++#include "misc_support.h" /* for NOT_USED */
++
++/* Param Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_in_terminal_get_descriptor_size(
++    const unsigned int nof_sections)
++{
++    return sizeof(ia_css_param_terminal_t) +
++        nof_sections*sizeof(ia_css_param_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
++    const ia_css_param_terminal_t *param_terminal,
++    const unsigned int section_index)
++{
++    ia_css_param_section_desc_t *param_section_base;
++    ia_css_param_section_desc_t *param_section_desc = NULL;
++
++    verifjmpexit(param_terminal != NULL);
++
++    param_section_base =
++        (ia_css_param_section_desc_t *)
++        (((const char *)param_terminal) +
++                param_terminal->param_section_desc_offset);
++    param_section_desc = &(param_section_base[section_index]);
++
++EXIT:
++    return param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_out_terminal_get_descriptor_size(
++    const unsigned int nof_sections,
++    const unsigned int nof_fragments)
++{
++    return sizeof(ia_css_param_terminal_t) +
++        nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
++    const ia_css_param_terminal_t *param_terminal,
++    const unsigned int section_index,
++    const unsigned int nof_sections,
++    const unsigned int fragment_index)
++{
++    ia_css_param_section_desc_t *param_section_base;
++    ia_css_param_section_desc_t *param_section_desc = NULL;
++
++    verifjmpexit(param_terminal != NULL);
++
++    param_section_base =
++        (ia_css_param_section_desc_t *)
++            (((const char *)param_terminal) +
++                param_terminal->param_section_desc_offset);
++    param_section_desc =
++        &(param_section_base[(nof_sections * fragment_index) +
++                section_index]);
++
++EXIT:
++    return param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_param_terminal_create(
++    ia_css_param_terminal_t *param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal)
++{
++    if (param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    if (terminal_offset > (1<<15)) {
++        return -EINVAL;
++    }
++
++    param_terminal->base.terminal_type =
++        is_input_terminal ?
++        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
++        IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
++    param_terminal->base.parent_offset =
++        0 - ((int16_t)terminal_offset);
++    param_terminal->base.size = terminal_size;
++    param_terminal->param_section_desc_offset =
++        sizeof(ia_css_param_terminal_t);
++
++    return 0;
++}
++
++/* Spatial Param Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++    const unsigned int nof_frame_param_sections,
++    const unsigned int nof_fragments)
++{
++    return sizeof(ia_css_spatial_param_terminal_t) +
++        nof_frame_param_sections * sizeof(
++                ia_css_frame_grid_param_section_desc_t) +
++        nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_grid_desc_t *
++ia_css_spatial_param_terminal_get_fragment_grid_desc(
++    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const unsigned int fragment_index)
++{
++    ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
++    ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
++
++    verifjmpexit(spatial_param_terminal != NULL);
++
++    fragment_grid_desc_base =
++        (ia_css_fragment_grid_desc_t *)
++            (((const char *)spatial_param_terminal) +
++            spatial_param_terminal->fragment_grid_desc_offset);
++    fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
++
++EXIT:
++    return fragment_grid_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_frame_grid_param_section_desc_t *
++ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
++    const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const unsigned int section_index)
++{
++    ia_css_frame_grid_param_section_desc_t *
++        frame_grid_param_section_base;
++    ia_css_frame_grid_param_section_desc_t *
++        frame_grid_param_section_desc = NULL;
++
++    verifjmpexit(spatial_param_terminal != NULL);
++
++    frame_grid_param_section_base =
++        (ia_css_frame_grid_param_section_desc_t *)
++            (((const char *)spatial_param_terminal) +
++        spatial_param_terminal->frame_grid_param_section_desc_offset);
++    frame_grid_param_section_desc =
++        &(frame_grid_param_section_base[section_index]);
++
++EXIT:
++    return frame_grid_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_spatial_param_terminal_create(
++    ia_css_spatial_param_terminal_t *spatial_param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal,
++    const unsigned int nof_fragments,
++    const uint32_t kernel_id)
++{
++    if (spatial_param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    if (terminal_offset > (1<<15)) {
++        return -EINVAL;
++    }
++
++    spatial_param_terminal->base.terminal_type =
++        is_input_terminal ?
++        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
++        IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
++    spatial_param_terminal->base.parent_offset =
++        0 - ((int16_t)terminal_offset);
++    spatial_param_terminal->base.size = terminal_size;
++    spatial_param_terminal->kernel_id = kernel_id;
++    spatial_param_terminal->fragment_grid_desc_offset =
++        sizeof(ia_css_spatial_param_terminal_t);
++    spatial_param_terminal->frame_grid_param_section_desc_offset =
++        spatial_param_terminal->fragment_grid_desc_offset +
++        (nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
++
++    return 0;
++}
++
++/* Sliced terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
++    const unsigned int nof_slice_param_sections,
++    const unsigned int nof_slices[],
++    const unsigned int nof_fragments)
++{
++    unsigned int descriptor_size = 0;
++    unsigned int fragment_index;
++    unsigned int nof_slices_total = 0;
++
++    verifjmpexit(nof_slices != NULL);
++
++    for (fragment_index = 0;
++            fragment_index < nof_fragments; fragment_index++) {
++        nof_slices_total += nof_slices[fragment_index];
++    }
++
++    descriptor_size =
++        sizeof(ia_css_sliced_param_terminal_t) +
++        nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
++        nof_slices_total*nof_slice_param_sections*sizeof(
++            ia_css_fragment_param_section_desc_t);
++
++EXIT:
++    return descriptor_size;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_slice_desc_t *
++ia_css_sliced_param_terminal_get_fragment_slice_desc(
++    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const unsigned int fragment_index
++)
++{
++    ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
++    ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
++
++    verifjmpexit(sliced_param_terminal != NULL);
++
++    fragment_slice_desc_base =
++        (ia_css_fragment_slice_desc_t *)
++            (((const char *)sliced_param_terminal) +
++            sliced_param_terminal->fragment_slice_desc_offset);
++    fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
++
++EXIT:
++    return fragment_slice_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_slice_param_section_desc_t *
++ia_css_sliced_param_terminal_get_slice_param_section_desc(
++    const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const unsigned int fragment_index,
++    const unsigned int slice_index,
++    const unsigned int section_index,
++    const unsigned int nof_slice_param_sections)
++{
++    ia_css_fragment_slice_desc_t *fragment_slice_desc;
++    ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
++    ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
++
++    fragment_slice_desc =
++        ia_css_sliced_param_terminal_get_fragment_slice_desc(
++            sliced_param_terminal,
++            fragment_index
++            );
++    verifjmpexit(fragment_slice_desc != NULL);
++
++    slice_param_section_desc_base =
++        (ia_css_slice_param_section_desc_t *)
++        (((const char *)sliced_param_terminal) +
++        fragment_slice_desc->slice_section_desc_offset);
++    slice_param_section_desc =
++        &(slice_param_section_desc_base[(
++            slice_index * nof_slice_param_sections) +
++                section_index]);
++
++EXIT:
++    return slice_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_sliced_param_terminal_create(
++    ia_css_sliced_param_terminal_t *sliced_param_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const uint16_t is_input_terminal,
++    const unsigned int nof_slice_param_sections,
++    const unsigned int nof_slices[],
++    const unsigned int nof_fragments,
++    const uint32_t kernel_id)
++{
++    unsigned int fragment_index;
++    unsigned int nof_slices_total = 0;
++
++    if (sliced_param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    if (terminal_offset > (1<<15)) {
++        return -EINVAL;
++    }
++
++    sliced_param_terminal->base.terminal_type =
++        is_input_terminal ?
++        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
++        IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
++    sliced_param_terminal->base.parent_offset =
++        0 - ((int16_t)terminal_offset);
++    sliced_param_terminal->base.size = terminal_size;
++    sliced_param_terminal->kernel_id = kernel_id;
++    /* set here to use below to find the pointer */
++    sliced_param_terminal->fragment_slice_desc_offset =
++        sizeof(ia_css_sliced_param_terminal_t);
++    for (fragment_index = 0;
++            fragment_index < nof_fragments; fragment_index++) {
++        ia_css_fragment_slice_desc_t *fragment_slice_desc =
++            ia_css_sliced_param_terminal_get_fragment_slice_desc(
++                sliced_param_terminal,
++                fragment_index);
++        /*
++         * Error handling not required at this point
++         * since everything has been constructed/validated just above
++         */
++        fragment_slice_desc->slice_count = nof_slices[fragment_index];
++        fragment_slice_desc->slice_section_desc_offset =
++            sliced_param_terminal->fragment_slice_desc_offset +
++            (nof_fragments * sizeof(
++                    ia_css_fragment_slice_desc_t)) +
++            (nof_slices_total * nof_slice_param_sections * sizeof(
++                    ia_css_slice_param_section_desc_t));
++        nof_slices_total += nof_slices[fragment_index];
++    }
++
++    return 0;
++}
++
++/* Program terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_program_terminal_get_descriptor_size(
++    const unsigned int nof_fragments,
++    const unsigned int nof_fragment_param_sections,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int nof_command_objs)
++{
++    /*only one fragment used*/
++    return sizeof(ia_css_program_terminal_t) +
++        nof_fragment_param_sections *
++        sizeof(ia_css_fragment_param_section_desc_t) +
++        nof_fragments * nof_kernel_fragment_sequencer_infos *
++        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
++        nof_command_objs * sizeof(
++            ia_css_kernel_fragment_sequencer_command_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_param_section_desc_t *
++ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int fragment_index,
++    const unsigned int section_index,
++    const unsigned int nof_fragment_param_sections)
++{
++    ia_css_fragment_param_section_desc_t *
++        fragment_param_section_desc_base;
++    ia_css_fragment_param_section_desc_t *
++        fragment_param_section_desc = NULL;
++    NOT_USED(fragment_index);
++
++    verifjmpexit(program_terminal != NULL);
++    verifjmpexit(section_index < nof_fragment_param_sections);
++
++    fragment_param_section_desc_base =
++        (ia_css_fragment_param_section_desc_t *)
++            (((const char *)program_terminal) +
++            program_terminal->fragment_param_section_desc_offset);
++    fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
++EXIT:
++    return fragment_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_kernel_fragment_sequencer_info_desc_t *
++ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int fragment_index,
++    const unsigned int info_index,
++    const unsigned int nof_kernel_fragment_sequencer_infos)
++{
++    ia_css_kernel_fragment_sequencer_info_desc_t *
++        kernel_fragment_sequencer_info_desc_base;
++    ia_css_kernel_fragment_sequencer_info_desc_t *
++        kernel_fragment_sequencer_info_desc = NULL;
++
++    verifjmpexit(program_terminal != NULL);
++    if (nof_kernel_fragment_sequencer_infos > 0) {
++        verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
++    }
++
++    kernel_fragment_sequencer_info_desc_base =
++        (ia_css_kernel_fragment_sequencer_info_desc_t *)
++        (((const char *)program_terminal) +
++        program_terminal->kernel_fragment_sequencer_info_desc_offset);
++    kernel_fragment_sequencer_info_desc =
++        &(kernel_fragment_sequencer_info_desc_base[(fragment_index *
++            nof_kernel_fragment_sequencer_infos) + info_index]);
++
++EXIT:
++    return kernel_fragment_sequencer_info_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_create(
++    ia_css_program_terminal_t *program_terminal,
++    const uint16_t terminal_offset,
++    const uint16_t terminal_size,
++    const unsigned int nof_fragments,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int nof_command_objs)
++{
++    if (program_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    if (terminal_offset > (1<<15)) {
++        return -EINVAL;
++    }
++
++    program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
++    program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
++    program_terminal->base.size = terminal_size;
++    program_terminal->kernel_fragment_sequencer_info_desc_offset =
++        sizeof(ia_css_program_terminal_t);
++    program_terminal->fragment_param_section_desc_offset =
++        program_terminal->kernel_fragment_sequencer_info_desc_offset +
++        (nof_fragments * nof_kernel_fragment_sequencer_infos *
++        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++        (nof_command_objs * sizeof(
++            ia_css_kernel_fragment_sequencer_command_desc_t));
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_get_command_base_offset(
++    const ia_css_program_terminal_t *program_terminal,
++    const unsigned int nof_fragments,
++    const unsigned int nof_kernel_fragment_sequencer_infos,
++    const unsigned int commands_slots_used,
++    uint16_t *command_desc_offset)
++{
++    if (command_desc_offset == NULL) {
++        return -EFAULT;
++    }
++
++    *command_desc_offset = 0;
++
++    if (program_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    *command_desc_offset =
++        program_terminal->kernel_fragment_sequencer_info_desc_offset +
++        (nof_fragments * nof_kernel_fragment_sequencer_infos *
++        sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++        (commands_slots_used * sizeof(
++            ia_css_kernel_fragment_sequencer_command_desc_t));
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint16_t *ia_css_program_terminal_get_line_count(
++    const ia_css_kernel_fragment_sequencer_command_desc_t
++    *kernel_fragment_sequencer_command_desc_base,
++    const unsigned int set_count)
++{
++    uint16_t *line_count = NULL;
++
++    verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
++    line_count =
++        (uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
++            set_count >> 2].line_count[set_count & 0x00000003]);
++EXIT:
++    return line_count;
++}
++
++#endif /* __IA_CSS_TERMINAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
+new file mode 100644
+index 000000000000..1868b15708b7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest.h
+@@ -0,0 +1,233 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_H
++#define __IA_CSS_TERMINAL_MANIFEST_H
++
++#include "type_support.h"
++#include "ia_css_param_storage_class.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
++#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
++#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
++#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
++#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
++#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
++
++/** Returns the size in bytes required to store this
++ *  terminal's manifest entry.
++ *
++ *  Used as part of binary manifest generation. It helps
++ *  to determine the amount of memory required
++ *  to store a parameter terminal manifest entry for
++ *  allocation before initialization
++ *
++ *  @param [in] nof_sections Number of sections (==
++ *  number of descriptors)
++ *
++ *  @return Size in bytes required for an entry.
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_terminal_manifest_get_size(
++    const unsigned int nof_sections
++);
++
++/** Initialize a parameter terminal manifest entry.
++ *
++ *  Used as part of binary manifest generation.
++ *
++ *  @param param_terminal Terminal entry to initialize.  Must
++ *  have been allocated with the size determined by
++ *  ia_css_param_terminal_manifest_get_size().
++ *
++ *  @return 0 on success, -EFAULT if param_terminal is NULL.
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_param_terminal_manifest_init(
++    ia_css_param_terminal_manifest_t *param_terminal,
++    const uint16_t section_count
++);
++
++/** Returns a section descriptor for a parameter terminal.
++ *
++ *  @param param_terminal_manifest Parameter terminal manifest handle
++ *  @param section_index Index of descriptor.  Must be smaller than the
++ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
++ *
++ *  @return Pointer to a descriptor structure
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_manifest_section_desc_t *
++ia_css_param_terminal_manifest_get_prm_sct_desc(
++    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_manifest_get_size(
++    const unsigned int nof_frame_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_spatial_param_terminal_manifest_init(
++    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
++    const uint16_t section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_frame_grid_param_manifest_section_desc_t *
++ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++    const ia_css_spatial_param_terminal_manifest_t *
++        spatial_param_terminal_manifest,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_sliced_param_terminal_manifest_get_size(
++    const unsigned int nof_slice_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_sliced_param_terminal_manifest_init(
++    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
++    const uint16_t section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_sliced_param_manifest_section_desc_t *
++ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++    const ia_css_sliced_param_terminal_manifest_t *
++        sliced_param_terminal_manifest,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_program_terminal_manifest_get_size(
++    const unsigned int nof_fragment_param_sections,
++    const unsigned int nof_kernel_fragment_sequencer_infos
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_manifest_init(
++    ia_css_program_terminal_manifest_t *program_terminal,
++    const uint16_t fragment_param_section_count,
++    const uint16_t kernel_fragment_seq_info_section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_param_manifest_section_desc_t *
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++    const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
++    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++    const unsigned int info_index
++);
++
++/*! Getter for kernel id
++
++  The function return the kernel id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] param manifest section desc
++
++ @return kernel_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
++ia_css_param_manifest_section_desc_get_kernel_id(
++    const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for  region_id
++
++  The function return the region_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] param manifest section desc
++
++ @return region_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_region_id(
++    const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for mem_type_id
++
++  The function return the mem_type_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] param manifest section desc
++
++ @return mem_type_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
++    const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for kernel id
++
++  The function return the kernel id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] fragment manifest section desc
++
++ @return kernel_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section);
++
++/*! Getter for  region_id
++
++  The function return the region_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] fragment manifest section desc
++
++ @return region_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section);
++
++/*! Getter for mem_type_id
++
++  The function return the mem_type_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param    [in] fragment manifest section desc
++
++ @return mem_type_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section);
++
++#ifdef __INLINE_PARAMETERS__
++#include "ia_css_terminal_manifest_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
+new file mode 100644
+index 000000000000..bf4f46c80b91
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_base_types.h
+@@ -0,0 +1,75 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
++#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
++
++#include "ia_css_terminal_defs.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++typedef struct ia_css_terminal_manifest_attributes_t {
++    uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
++    uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
++    uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
++    uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
++    uint16_t reserved:10;
++    } ia_css_terminal_manifest_attributes_t;
++#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
++
++#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT    0
++#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    (IA_CSS_TERMINAL_TYPE_BITS \
++    + IA_CSS_UINT32_T_BITS \
++    + IA_CSS_UINT16_T_BITS \
++    + IA_CSS_UINT16_T_BITS \
++    + IA_CSS_TERMINAL_ATTRIBUTE_BITS \
++    + IA_CSS_TERMINAL_ID_BITS \
++    + IA_CSS_TERMINAL_ID_BITS \
++    + (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
++
++/* ==================== Base Terminal Manifest - START ==================== */
++struct ia_css_terminal_manifest_s {
++    ia_css_terminal_type_t                terminal_type;        /**< Type ia_css_terminal_type_t */
++    /**  Max size of payload buffer for instances of this terminal
++     *
++     *   For load terminals, this is the size of all sections, as defined in the manifest
++     *   descriptors.  For connect terminals, this is the max buffer size.
++     */
++    uint32_t                    max_payload_size;
++    int16_t                        parent_offset;        /**< Offset to the program group manifest */
++    uint16_t                    size;            /**< Size of this whole terminal-manifest layout-structure */
++    ia_css_terminal_manifest_attributes_t    attributes; /**< Bit fields describing the terminal attributes */
++    ia_css_terminal_ID_t                ID; /**< The unique identifier of this terminal in the PG */
++    /** The unique identifier of another terminal in the PG, associated with this one.
++     *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
++    ia_css_terminal_ID_t                assoc_ID;
++#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
++    uint8_t                        padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
++#endif
++};
++
++typedef struct ia_css_terminal_manifest_s
++    ia_css_terminal_manifest_t;
++
++/* ==================== Base Terminal Manifest - END ==================== */
++
++/** @} */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
+new file mode 100644
+index 000000000000..450a4b290434
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_impl.h
+@@ -0,0 +1,391 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
++#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
++
++#include "ia_css_terminal_manifest.h"
++#include "error_support.h"
++#include "assert_support.h"
++#include "storage_class.h"
++
++STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
++{
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_param_manifest_section_desc_t) %
++            sizeof(uint32_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_spatial_param_terminal_manifest_t) %
++            sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(
++            ia_css_frame_grid_param_manifest_section_desc_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
++            sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(
++            ia_css_fragment_param_manifest_section_desc_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_fragment_param_manifest_section_desc_t) %
++            sizeof(uint32_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(
++            ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
++        );
++
++    COMPILATION_ERROR_IF(0 != sizeof(
++        ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
++            sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_sliced_param_terminal_manifest_t) %
++            sizeof(uint64_t));
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++        (CHAR_BIT * sizeof
++            (ia_css_sliced_param_manifest_section_desc_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++        sizeof(ia_css_sliced_param_manifest_section_desc_t) %
++            sizeof(uint64_t));
++}
++
++/* Parameter Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_terminal_manifest_get_size(
++    const unsigned int nof_sections)
++{
++
++    return sizeof(ia_css_param_terminal_manifest_t) +
++        nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_param_terminal_manifest_init(
++    ia_css_param_terminal_manifest_t *param_terminal,
++    const uint16_t section_count)
++{
++    if (param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    param_terminal->param_manifest_section_desc_count = section_count;
++    param_terminal->param_manifest_section_desc_offset = sizeof(
++                ia_css_param_terminal_manifest_t);
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_manifest_section_desc_t *
++ia_css_param_terminal_manifest_get_prm_sct_desc(
++    const ia_css_param_terminal_manifest_t *param_terminal_manifest,
++    const unsigned int section_index)
++{
++    ia_css_param_manifest_section_desc_t *param_manifest_section_base;
++    ia_css_param_manifest_section_desc_t *
++        param_manifest_section_desc = NULL;
++
++    verifjmpexit(param_terminal_manifest != NULL);
++
++    param_manifest_section_base =
++        (ia_css_param_manifest_section_desc_t *)
++        (((const char *)param_terminal_manifest)
++        + param_terminal_manifest->param_manifest_section_desc_offset);
++
++    param_manifest_section_desc =
++        &(param_manifest_section_base[section_index]);
++
++EXIT:
++    return param_manifest_section_desc;
++}
++
++/* Spatial Parameter Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_spatial_param_terminal_manifest_get_size(
++    const unsigned int nof_frame_param_sections)
++{
++    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
++        nof_frame_param_sections * sizeof(
++            ia_css_frame_grid_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_spatial_param_terminal_manifest_init(
++    ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
++    const uint16_t section_count)
++{
++    if (spatial_param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    spatial_param_terminal->
++        frame_grid_param_manifest_section_desc_count = section_count;
++    spatial_param_terminal->
++        frame_grid_param_manifest_section_desc_offset =
++        sizeof(ia_css_spatial_param_terminal_manifest_t);
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_frame_grid_param_manifest_section_desc_t *
++ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++    const ia_css_spatial_param_terminal_manifest_t *
++        spatial_param_terminal_manifest,
++    const unsigned int section_index)
++{
++    ia_css_frame_grid_param_manifest_section_desc_t *
++        frame_param_manifest_section_base;
++    ia_css_frame_grid_param_manifest_section_desc_t *
++        frame_param_manifest_section_desc = NULL;
++
++    verifjmpexit(spatial_param_terminal_manifest != NULL);
++
++    frame_param_manifest_section_base =
++        (ia_css_frame_grid_param_manifest_section_desc_t *)
++        (((const char *)spatial_param_terminal_manifest) +
++            spatial_param_terminal_manifest->
++            frame_grid_param_manifest_section_desc_offset);
++    frame_param_manifest_section_desc =
++        &(frame_param_manifest_section_base[section_index]);
++
++EXIT:
++    return frame_param_manifest_section_desc;
++}
++
++/* Sliced Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_sliced_param_terminal_manifest_get_size(
++    const unsigned int nof_slice_param_sections)
++{
++    return sizeof(ia_css_spatial_param_terminal_manifest_t) +
++        nof_slice_param_sections *
++        sizeof(ia_css_sliced_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_sliced_param_terminal_manifest_init(
++    ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
++    const uint16_t section_count)
++{
++    if (sliced_param_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    sliced_param_terminal->sliced_param_section_count = section_count;
++    sliced_param_terminal->sliced_param_section_offset =
++        sizeof(ia_css_sliced_param_terminal_manifest_t);
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_sliced_param_manifest_section_desc_t *
++ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++    const ia_css_sliced_param_terminal_manifest_t *
++        sliced_param_terminal_manifest,
++    const unsigned int section_index)
++{
++    ia_css_sliced_param_manifest_section_desc_t *
++        sliced_param_manifest_section_base;
++    ia_css_sliced_param_manifest_section_desc_t *
++        sliced_param_manifest_section_desc = NULL;
++
++    verifjmpexit(sliced_param_terminal_manifest != NULL);
++
++    sliced_param_manifest_section_base =
++        (ia_css_sliced_param_manifest_section_desc_t *)
++        (((const char *)sliced_param_terminal_manifest) +
++            sliced_param_terminal_manifest->
++            sliced_param_section_offset);
++    sliced_param_manifest_section_desc =
++        &(sliced_param_manifest_section_base[section_index]);
++
++EXIT:
++    return sliced_param_manifest_section_desc;
++}
++
++/* Program Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_program_terminal_manifest_get_size(
++    const unsigned int nof_fragment_param_sections,
++    const unsigned int nof_kernel_fragment_sequencer_infos)
++{
++    return sizeof(ia_css_program_terminal_manifest_t) +
++        nof_fragment_param_sections *
++        sizeof(ia_css_fragment_param_manifest_section_desc_t) +
++        nof_kernel_fragment_sequencer_infos *
++        sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_manifest_init(
++    ia_css_program_terminal_manifest_t *program_terminal,
++    const uint16_t fragment_param_section_count,
++    const uint16_t kernel_fragment_seq_info_section_count)
++{
++    if (program_terminal == NULL) {
++        return -EFAULT;
++    }
++
++    program_terminal->fragment_param_manifest_section_desc_count =
++        fragment_param_section_count;
++    program_terminal->fragment_param_manifest_section_desc_offset =
++        sizeof(ia_css_program_terminal_manifest_t);
++
++    program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
++        kernel_fragment_seq_info_section_count;
++    program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
++        sizeof(ia_css_program_terminal_manifest_t) +
++        fragment_param_section_count*sizeof(
++            ia_css_fragment_param_manifest_section_desc_t);
++
++    return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_param_manifest_section_desc_t *
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++    const unsigned int section_index)
++{
++    ia_css_fragment_param_manifest_section_desc_t *
++        fragment_param_manifest_section_base;
++    ia_css_fragment_param_manifest_section_desc_t *
++        fragment_param_manifest_section = NULL;
++
++    verifjmpexit(program_terminal_manifest != NULL);
++
++    fragment_param_manifest_section_base =
++        (ia_css_fragment_param_manifest_section_desc_t *)
++        (((const char *)program_terminal_manifest) +
++        program_terminal_manifest->
++        fragment_param_manifest_section_desc_offset);
++    fragment_param_manifest_section =
++        &(fragment_param_manifest_section_base[section_index]);
++
++EXIT:
++    return fragment_param_manifest_section;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
++    const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++    const unsigned int info_index)
++{
++    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++        kernel_manifest_fragment_sequencer_info_manifest_desc_base;
++    ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++        kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
++
++    verifjmpexit(program_terminal_manifest != NULL);
++
++    kernel_manifest_fragment_sequencer_info_manifest_desc_base =
++        (ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
++        (((const char *)program_terminal_manifest) +
++        program_terminal_manifest->
++        kernel_fragment_sequencer_info_manifest_info_offset);
++
++    kernel_manifest_fragment_sequencer_info_manifest_desc =
++        &(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
++                info_index]);
++
++EXIT:
++    return kernel_manifest_fragment_sequencer_info_manifest_desc;
++}
++
++/* Start ...*/
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
++    const ia_css_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_region_id(
++    const ia_css_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
++    const ia_css_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
++    const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++    return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
++}
++
++/* End ...*/
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
+new file mode 100644
+index 000000000000..220ac9b3faa8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_manifest_types.h
+@@ -0,0 +1,349 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
++#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
++
++#include "ia_css_terminal_defs.h"
++#include "type_support.h"
++#include "ia_css_base_types.h"
++#include "ia_css_terminal_manifest_base_types.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
++    (2 * IA_CSS_UINT16_T_BITS)
++
++/* =============== Cached Param Terminal Manifest - START ============== */
++/** Descriptor for a single manifest parameter section.
++ *
++ * Each descriptor describes a single contiguous parameter payload that will
++ * be written to hardware registers or other memory.  It defines the maximum
++ * size of the section payload (critical for allocation and security), the device the
++ * section belongs to, and the target memory type (usually device registers).
++ *
++ * A region ID allows specifying multiple sections for a single device when a
++ * device's configuration registers are not all contigous.
++ */
++struct ia_css_param_manifest_section_desc_s {
++    /** Maximum size of the related parameter region */
++    uint16_t max_mem_size;
++    /** mem_type, region and kernel_id
++      * - mem_type - Memory targeted by this section
++      * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++      * - Region - subsection id within the specified memory
++      * - kernel_id - Indication of the kernel/device this parameter belongs to */
++    uint16_t info;
++};
++
++typedef struct ia_css_param_manifest_section_desc_s
++    ia_css_param_manifest_section_desc_t;
++
++#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
++#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    + (2*IA_CSS_UINT16_T_BITS) \
++    + (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/** Frame constant parameters terminal manifest
++ *
++ * This is the "header" for a list of parameter sections described by
++ * ia_css_param_manifest_section_desc_s.
++ */
++struct ia_css_param_terminal_manifest_s {
++    /** Parameter terminal manifest base */
++    ia_css_terminal_manifest_t base;
++    /**
++     * Number of cached parameter sections, coming from manifest
++     * but also shared by the terminal
++     */
++    uint16_t param_manifest_section_desc_count;
++    /**
++     * Points to the variable array of
++     * struct ia_css_param_section_desc_s
++     */
++    uint16_t param_manifest_section_desc_offset;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
++};
++
++typedef struct ia_css_param_terminal_manifest_s
++    ia_css_param_terminal_manifest_t;
++/* ================= Cached Param Terminal Manifest - End ================ */
++
++/* ================= Spatial Param Terminal Manifest - START ============= */
++
++#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
++    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
++    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
++
++struct ia_css_fragment_grid_manifest_desc_s {
++    /* Min resolution width/height of the spatial parameters
++     * for the fragment measured in compute units
++     */
++    uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++    /* Max resolution width/height of the spatial parameters
++     * for the fragment measured in compute units
++     */
++    uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_fragment_grid_manifest_desc_s
++    ia_css_fragment_grid_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
++#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
++    (1 * IA_CSS_UINT32_T_BITS \
++    + 3 * IA_CSS_UINT8_T_BITS \
++    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_frame_grid_param_manifest_section_desc_s {
++    /* Maximum buffer total size allowed for
++     * this frame of parameters
++     */
++    uint32_t max_mem_size;
++    /* Memory space targeted by this section
++     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++     */
++    uint8_t mem_type_id;
++    /* Region id within the specified memory space */
++    uint8_t region_id;
++    /* size in bytes of each compute unit for
++     * the specified memory space and region
++     */
++    uint8_t elem_size;
++    /* align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
++};
++
++typedef struct ia_css_frame_grid_param_manifest_section_desc_s
++    ia_css_frame_grid_param_manifest_section_desc_t;
++
++#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
++    ((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
++    + (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
++
++struct ia_css_frame_grid_manifest_desc_s {
++    /* Min resolution width/height of the spatial parameters for
++     * the frame measured in compute units
++     */
++    uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++    /* Max resolution width/height of the spatial parameters for
++     * the frame measured in compute units
++     */
++    uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_frame_grid_manifest_desc_s
++    ia_css_frame_grid_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
++#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
++    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
++    + (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
++    + (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
++    + (2 * IA_CSS_UINT16_T_BITS) \
++    + (2 * IA_CSS_UINT8_T_BITS) \
++    + (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
++    IA_CSS_UINT8_T_BITS))
++
++/** Spatial parameters terminal manifest */
++struct ia_css_spatial_param_terminal_manifest_s {
++    /** terminal manifest base object */
++    ia_css_terminal_manifest_t base;
++    /** Contains limits for the frame spatial parameters */
++    ia_css_frame_grid_manifest_desc_t frame_grid_desc;
++    /**
++     * Constains limits for the fragment spatial parameters
++     * - COMMON AMONG FRAGMENTS
++     */
++    ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
++    /**
++     * Number of frame spatial parameter sections, they are set
++     * in slice-steps through frame processing
++     */
++    uint16_t frame_grid_param_manifest_section_desc_count;
++    /**
++     * Points to the variable array of
++     * ia_css_frame_spatial_param_manifest_section_desc_t
++     */
++    uint16_t frame_grid_param_manifest_section_desc_offset;
++    /**
++     * Indication of the kernel this spatial parameter terminal belongs to
++     * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
++     */
++    uint8_t kernel_id;
++    /**
++     * Groups together compute units in order to achieve alignment
++     * requirements for transfes and to achieve canonical frame
++     * representation
++     */
++    uint8_t compute_units_p_elem;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
++};
++
++typedef struct ia_css_spatial_param_terminal_manifest_s
++    ia_css_spatial_param_terminal_manifest_t;
++
++/* ================= Spatial Param Terminal Manifest - END ================ */
++
++/* ================= Sliced Param Terminal Manifest - START =============== */
++
++#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
++#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
++    (1 * IA_CSS_UINT32_T_BITS \
++    + 2 * IA_CSS_UINT8_T_BITS \
++    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_sliced_param_manifest_section_desc_s {
++    /** Maximum size of the related parameter region */
++    uint32_t max_mem_size;
++    /**
++     * Memory targeted by this section
++     * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++     */
++    uint8_t mem_type_id;
++    /** Region id within the specified memory */
++    uint8_t region_id;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
++};
++
++typedef struct ia_css_sliced_param_manifest_section_desc_s
++    ia_css_sliced_param_manifest_section_desc_t;
++
++#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
++#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    (SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++    + 2 * IA_CSS_UINT16_T_BITS \
++    + 1 * IA_CSS_UINT8_T_BITS \
++    + N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/* Frame constant parameters terminal manifest */
++struct ia_css_sliced_param_terminal_manifest_s {
++    /** terminal manifest base object */
++    ia_css_terminal_manifest_t base;
++    /**
++     * Number of the array elements
++     * sliced_param_section_offset points to
++     */
++    uint16_t sliced_param_section_count;
++    /**
++     * Points to array of ia_css_sliced_param_manifest_section_desc_s
++     * which constain info for the slicing of the parameters
++     */
++    uint16_t sliced_param_section_offset;
++    /** Kernel identifier */
++    uint8_t kernel_id;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
++};
++
++typedef struct ia_css_sliced_param_terminal_manifest_s
++    ia_css_sliced_param_terminal_manifest_t;
++
++/* ================= Slice Param Terminal Manifest - End =============== */
++
++/* ================= Program Terminal Manifest - START ================= */
++
++#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
++    (2 * IA_CSS_UINT16_T_BITS)
++
++/** Fragment constant parameters manifest */
++struct ia_css_fragment_param_manifest_section_desc_s {
++    /** Maximum size of the related parameter region */
++    uint16_t max_mem_size;
++    /** (mem_type, region and kernel_id) */
++    uint16_t info;
++};
++
++typedef struct ia_css_fragment_param_manifest_section_desc_s
++    ia_css_fragment_param_manifest_section_desc_t;
++
++#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
++    (10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
++
++struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
++    /* Slice dimensions */
++    uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++    /* Slice dimensions */
++    uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++    /* Nof slices */
++    uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++    /* Nof slices */
++    uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++    /* Grid point decimation factor */
++    uint16_t
++    min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++    /* Grid point decimation factor */
++    uint16_t
++    max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++    /* Relative position of grid origin to pixel origin */
++    int16_t
++    min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++    /* Relative position of grid origin to pixel origin */
++    int16_t
++    max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++    /* Dimension of grid */
++    int16_t
++    min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++    /* Dimension of grid */
++    int16_t
++    max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
++    ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
++#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
++    ((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
++    + (IA_CSS_UINT32_T_BITS) \
++    + (5*IA_CSS_UINT16_T_BITS) \
++    + (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/** Program parameters terminal */
++struct ia_css_program_terminal_manifest_s {
++    /** terminal manifest base object */
++    ia_css_terminal_manifest_t base;
++    /** Connection manager passes seq info as single blob at the moment */
++    uint32_t sequencer_info_kernel_id;
++    /** Maximum number of command secriptors supported
++     * by the program group
++     */
++    uint16_t max_kernel_fragment_sequencer_command_desc;
++    /** The total count of prog-init parameter descriptors */
++    uint16_t fragment_param_manifest_section_desc_count;
++    /** The offset of the manifest section descriptor from the base of this structure */
++    uint16_t fragment_param_manifest_section_desc_offset;
++    uint16_t kernel_fragment_sequencer_info_manifest_info_count;
++    uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
++    /** align to 64 */
++    uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
++};
++
++typedef struct ia_css_program_terminal_manifest_s
++    ia_css_program_terminal_manifest_t;
++
++/* ==================== Program Terminal Manifest - END ==================== */
++
++/** @} */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
+new file mode 100644
+index 000000000000..7e6350820f22
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_terminal_types.h
+@@ -0,0 +1,477 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_TYPES_H
++#define __IA_CSS_TERMINAL_TYPES_H
++
++#include "type_support.h"
++#include "ia_css_base_types.h"
++#include "ia_css_terminal_base_types.h"
++
++typedef struct ia_css_program_control_init_load_section_desc_s
++    ia_css_program_control_init_load_section_desc_t;
++typedef struct ia_css_program_control_init_connect_section_desc_s
++    ia_css_program_control_init_connect_section_desc_t;
++typedef struct ia_css_program_control_init_program_desc_s
++    ia_css_program_control_init_program_desc_t;
++typedef struct ia_css_program_control_init_terminal_s
++    ia_css_program_control_init_terminal_t;
++
++typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
++typedef struct ia_css_fragment_param_section_desc_s
++    ia_css_fragment_param_section_desc_t;
++typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
++    ia_css_kernel_fragment_sequencer_info_desc_t;
++typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
++    ia_css_kernel_fragment_sequencer_command_desc_t;
++
++typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
++typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
++typedef struct ia_css_slice_param_section_desc_s
++    ia_css_slice_param_section_desc_t;
++
++typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
++typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
++typedef struct ia_css_frame_grid_param_section_desc_s
++    ia_css_frame_grid_param_section_desc_t;
++typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
++
++typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
++typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
++
++typedef struct ia_css_param_payload_s ia_css_param_payload_t;
++typedef struct ia_css_terminal_s ia_css_terminal_t;
++
++/* =================== Generic Parameter Payload - START =================== */
++#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT    1
++#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT    1
++
++#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    (N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
++    + VIED_VADDRESS_BITS \
++    + N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
++
++struct ia_css_param_payload_s {
++    /**
++     * Temporary variable holding the host address of the parameter buffer
++     * as PSYS is handling the parameters on the host side for the moment
++     */
++    uint64_t host_buffer;
++    /**
++     * Base virtual addresses to parameters in subsystem virtual
++     * memory space
++     * NOTE: Used in legacy pg flow
++     */
++    vied_vaddress_t buffer;
++    /**
++     * Offset to buffer address within external buffer set structure
++     * NOTE: Used in ppg flow
++     */
++    uint32_t terminal_index;
++};
++/* =================== Generic Parameter Payload - End ==================== */
++
++/* ==================== Cached Param Terminal - START ==================== */
++#define N_UINT32_IN_PARAM_SEC_STRUCT 2
++
++#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
++    (N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** Parameters section */
++struct ia_css_param_section_desc_s {
++    /** Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /** Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++};
++
++#define N_UINT16_IN_PARAM_TERMINAL_STRUCT        1
++#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT    6
++
++#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    + N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/** "Cached" parameters terminal for parameter that do not change
++ * at frame scope.
++ */
++struct ia_css_param_terminal_s {
++    /** Parameter terminal base */
++    ia_css_terminal_t base;
++    /** Helps to identify the parameter buffer when sent later on with the buffer set  */
++    ia_css_param_payload_t param_payload;
++    /** Points to the variable array of ia_css_param_section_desc_t */
++    uint16_t param_section_desc_offset;
++    uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
++};
++/* ==================== Cached Param Terminal - End ==================== */
++
++/* ==================== Spatial Param Terminal - START ==================== */
++#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
++
++#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
++    (N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_fragment_grid_desc_s {
++    /**
++     * Offset width/height of the top-left compute unit of the
++     * fragment compared to the frame
++     */
++    uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
++    /**
++     * Resolution width/height of the spatial parameters that
++     * correspond to the fragment measured in compute units
++     */
++    uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT        3
++#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT    4
++
++#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
++    (N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
++    + N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/**
++ * A plane of parameters with spatial aspect
++ * (compute units correlated to pixel data)
++ */
++struct ia_css_frame_grid_param_section_desc_s {
++    /** Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /** Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++    /**
++     * stride in bytes of each line of compute units for
++     * the specified memory space and region
++     */
++    uint32_t stride;
++    uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
++};
++
++#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
++#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
++
++#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
++    (N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_frame_grid_desc_s {
++    /** Resolution width/height of the frame of
++     * spatial parameters measured in compute units
++     */
++    uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++    uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
++};
++
++#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
++#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
++
++#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    + SIZE_OF_FRAME_GRID_STRUCT_BITS \
++    + N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
++    + N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_spatial_param_terminal_s {
++    /** Spatial Parameter terminal base */
++    ia_css_terminal_t base;
++    /** Spatial Parameter buffer handle attached to the terminal */
++    ia_css_param_payload_t param_payload;
++    /** Contains info for the frame of spatial parameters */
++    ia_css_frame_grid_desc_t frame_grid_desc;
++    /** Kernel identifier */
++    uint32_t kernel_id;
++    /**
++     * Points to the variable array of
++     * ia_css_frame_grid_param_section_desc_t
++     */
++    uint16_t frame_grid_param_section_desc_offset;
++    /**
++     * Points to array of ia_css_fragment_spatial_desc_t
++     * which constain info for the fragments of spatial parameters
++     */
++    uint16_t fragment_grid_desc_offset;
++};
++/* ==================== Spatial Param Terminal - END ==================== */
++
++/* ==================== Sliced Param Terminal - START ==================== */
++#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
++
++#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
++    (N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** A Slice of parameters ready to be trasferred from/to registers */
++struct ia_css_slice_param_section_desc_s {
++    /** Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /** Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++};
++
++#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT        2
++#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT    4
++
++#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
++    (N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_fragment_slice_desc_s {
++    /**
++     * Points to array of ia_css_slice_param_section_desc_t
++     * which constain info for each prameter slice
++     */
++    uint16_t slice_section_desc_offset;
++    /** Number of slices for the parameters for this fragment */
++    uint16_t slice_count;
++    uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
++};
++
++#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT    1
++#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT    1
++#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT    2
++
++#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    + N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
++    + N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_sliced_param_terminal_s {
++    /** Spatial Parameter terminal base */
++    ia_css_terminal_t base;
++    /** Spatial Parameter buffer handle attached to the terminal */
++    ia_css_param_payload_t param_payload;
++    /** Kernel identifier */
++    uint32_t kernel_id;
++    /**
++     * Points to array of ia_css_fragment_slice_desc_t
++     * which constain info for the slicing of the parameters
++     */
++    uint16_t fragment_slice_desc_offset;
++    uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
++};
++/* ==================== Sliced Param Terminal - END ==================== */
++
++/* ================= Program Control Init Terminal - START ================= */
++#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS    \
++    (DEVICE_DESCRIPTOR_ID_BITS    \
++    + (2 * IA_CSS_UINT16_T_BITS)    \
++    )
++struct ia_css_program_control_init_load_section_desc_s {
++    /** Device descriptor */
++    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
++    /** Memory allocation size needs of this parameter */
++    uint16_t mem_size;
++    /** (Applicable to) mode bitmask */
++    uint16_t mode_bitmask;
++};
++
++#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
++#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
++#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
++#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
++#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
++#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
++#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
++
++struct connect_section_idx_bitfields_s {
++    uint16_t plane_id : 4;
++    uint16_t bottom_lines : 6;
++    uint16_t top_lines : 6;
++};
++
++union connect_section_idx_t {
++    struct connect_section_idx_bitfields_s as_bitfield;
++    uint16_t as_uint_16;
++};
++
++#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS    \
++    (DEVICE_DESCRIPTOR_ID_BITS    \
++    + (1 * IA_CSS_UINT16_T_BITS)    \
++    + (1 * IA_CSS_UINT8_T_BITS)    \
++    + IA_CSS_TERMINAL_ID_BITS    \
++    )
++struct ia_css_program_control_init_connect_section_desc_s {
++    /** Device descriptor */
++    device_descriptor_id_t device_descriptor_id;    /* 32 bits */
++    /** Connected terminal section (plane) index */
++    uint16_t connect_section_idx;
++    /** (Applicable to) mode bitmask */
++    uint8_t mode_bitmask;
++    /** Absolute referral ID for the connected terminal */
++    ia_css_terminal_ID_t connect_terminal_ID;
++};
++
++#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO    (1)
++#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
++#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
++    (1 * IA_CSS_UINT16_T_BITS)    \
++    + (1 * IA_CSS_UINT8_T_BITS)    \
++    + (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
++
++#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS    \
++    (4 * IA_CSS_UINT16_T_BITS)    \
++    + (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
++    + (2 * IA_CSS_UINT8_T_BITS) \
++    + (1 * IA_CSS_UINT16_T_BITS) \
++    + (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
++        IA_CSS_UINT8_T_BITS)
++
++struct ia_css_program_desc_control_info_s {
++    /** 12-bit process identifier */
++    ia_css_process_id_t process_id;
++    /** number of done acks required to close the process */
++    uint8_t num_done_events;
++    uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
++};
++
++struct ia_css_program_control_init_program_desc_s {
++    /** Number of load sections in this program */
++    uint16_t load_section_count;
++    /** Points to variable size array of
++     * ia_css_program_control_init_load_section_desc_s
++     * in relation to its program_desc
++     */
++    uint16_t load_section_desc_offset;
++    /** Number of connect sections in this program */
++    uint16_t connect_section_count;
++    /** Points to variable size array of
++     * ia_css_program_control_init_connect_section_desc_s
++     * in relation to its program_desc
++     */
++    uint16_t connect_section_desc_offset;
++    struct ia_css_program_desc_control_info_s control_info;
++    /** number of load sections that are filled */
++    uint8_t filled_load_sections;
++    /** number of connect sections that are filled */
++    uint8_t filled_connect_sections;
++    /** mem_offset for the first load section */
++    uint16_t load_section_mem_offset;
++    /* align to 64 bits */
++    /* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
++};
++
++#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    + (1 * IA_CSS_UINT32_T_BITS) \
++    + (2 * IA_CSS_UINT16_T_BITS) \
++    )
++struct ia_css_program_control_init_terminal_s {
++    /** Parameter terminal base */
++    ia_css_terminal_t base;
++    /** Parameter buffer handle attached to the terminal */
++    ia_css_param_payload_t param_payload;
++    /** Fragment stride for the payload, used to find the base
++     * of the payload for a given fragment
++     */
++    uint32_t payload_fragment_stride;
++    /** Points to the variable array of
++     * ia_css_program_control_init_program_desc_s
++     */
++    uint16_t program_section_desc_offset;
++    /** Number of instantiated programs in program group (processes) */
++    uint16_t program_count;
++};
++/* ================= Program Control Init Terminal - END ================= */
++
++/* ==================== Program Terminal - START ==================== */
++
++#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
++
++#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
++    (N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** Fragment constant parameters section */
++struct ia_css_fragment_param_section_desc_s {
++    /** Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /** Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++};
++
++#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
++
++#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
++    (N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
++
++/** 4 commands packe together to save memory space */
++struct ia_css_kernel_fragment_sequencer_command_desc_s {
++    /** Contains the "(command_index%4) == index" command desc */
++    uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
++};
++
++#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
++
++#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
++    (N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_kernel_fragment_sequencer_info_desc_s {
++    /** Slice dimensions */
++    uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++    /** Nof slices */
++    uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++    /** Grid point decimation factor */
++    uint16_t
++    fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++    /** Relative position of grid origin to pixel origin */
++    int16_t
++    fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++    /** Size of active fragment region */
++    int16_t
++    fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++    /** If >0 it overrides the standard fragment sequencer info */
++    uint16_t command_count;
++    /**
++     * To be used only if command_count>0, points to the descriptors
++     * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
++     */
++    uint16_t command_desc_offset;
++};
++
++#define N_UINT16_IN_PROG_TERM_STRUCT        2
++#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT    0
++#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
++#define UNIFIED_PROG_TERM_FRAG_DESC
++
++#define SIZE_OF_PROG_TERM_STRUCT_BITS \
++    (SIZE_OF_TERMINAL_STRUCT_BITS \
++    + IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++    + N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
++    + N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_program_terminal_s {
++    /** Program terminal base */
++    ia_css_terminal_t base;
++    /** Program terminal buffer handle attached to the terminal */
++    ia_css_param_payload_t param_payload;
++    /** Points to array of ia_css_fragment_param_desc_s */
++    uint16_t fragment_param_section_desc_offset;
++    /** Points to array of ia_css_kernel_fragment_sequencer_info_s */
++    uint16_t kernel_fragment_sequencer_info_desc_offset;
++    /* stride to next fragment*/
++    uint32_t payload_fragment_stride;
++    /** align to 64 */
++    /*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
++};
++/* ==================== Program Terminal - END ==================== */
++
++#endif /* __IA_CSS_TERMINAL_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
+new file mode 100644
+index 000000000000..6ab5e289b096
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ia_css_trace.h
+@@ -0,0 +1,1002 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*! \file */
++
++#ifndef __IA_CSS_TRACE_H
++#define __IA_CSS_TRACE_H
++
++/*
++** Configurations
++*/
++
++/**
++ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
++ *         Where:
++ *             {Module Name} is the name of the targeted module.
++ *
++ *         Example:
++ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++ */
++
++/**< Use whatever method of tracing that best suits the platform
++ * this code is compiled for.
++ */
++#define IA_CSS_TRACE_METHOD_NATIVE  1
++/**< Use the Tracing NCI. */
++#define IA_CSS_TRACE_METHOD_TRACE   2
++
++/**
++ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
++ *         Where:
++ *             {Module Name} is the name of the targeted module.
++ *             {Level}, in decreasing order of severity, is one of the
++ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
++ *                       VERBOSE, FATAL}.
++ *         Example:
++ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
++ */
++/**< Disables the corresponding trace level. */
++#define IA_CSS_TRACE_LEVEL_DISABLED 0
++/**< Enables the corresponding trace level. */
++#define IA_CSS_TRACE_LEVEL_ENABLED  1
++
++/*
++ * Used in macro definition with do-while loop
++ * for removing checkpatch warnings
++ */
++#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
++
++/**
++ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
++ * line printed with every log message.
++ *
++ *       Example:
++ *           #define IA_CSS_TRACE_PRINT_FILE_LINE
++ */
++
++/*
++** Interface
++*/
++
++/*
++** Static
++*/
++
++/**
++ * Logs a message with zero arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @param module The targeted module.
++ * @param severity The severity level of the trace message. In decreasing order:
++ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
++ * @param format The message to be traced.
++ */
++#define IA_CSS_TRACE_0(module, severity, format) \
++    IA_CSS_TRACE_IMPL(module, 0, severity, format)
++
++/**
++ * Logs a message with one argument if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_1(module, severity, format, a1) \
++    IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
++
++/**
++ * Logs a message with two arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
++    IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
++
++/**
++ * Logs a message with three arguments if the targeted severity level
++ * is enabled at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
++    IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
++
++/**
++ * Logs a message with four arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
++    IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
++
++/**
++ * Logs a message with five arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
++    IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
++
++/**
++ * Logs a message with six arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
++    IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
++
++/**
++ * Logs a message with seven arguments if the targeted severity level
++ * is enabled at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
++    IA_CSS_TRACE_IMPL(module, 7, severity, format, \
++                    a1, a2, a3, a4, a5, a6, a7)
++
++/*
++** Dynamic
++*/
++
++/**
++* Declares, but does not define, dynamic tracing functions and variables
++* for module \p module.  For each module, place an instance of this macro
++* in the compilation unit in which you want to use dynamic tracing facility
++* so as to inform the compiler of the declaration of the available functions.
++* An invocation of this function does not enable any of the available tracing
++* levels.  Do not place a semicolon after a call to this macro.
++* @see IA_CSS_TRACE_DYNAMIC_DEFINE
++*/
++#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
++    IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
++/**
++* Declares the configuration function for the dynamic api seperatly, if one
++* wants to use it.
++*/
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
++    IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
++
++/**
++* Defines dynamic tracing functions and variables for module \p module.
++* For each module, place an instance of this macro in one, and only one,
++* of your SOURCE files so as to allow the linker resolve the related symbols.
++* An invocation of this macro does not enable any of the available tracing
++* levels.  Do not place a semicolon after a call to this macro.
++* @see IA_CSS_TRACE_DYNAMIC_DECLARE
++*/
++#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
++    IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
++/**
++* Defines the configuration function for the dynamic api seperatly, if one
++* wants to use it.
++*/
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
++    IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
++
++/**
++ * Logs a message with zero arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @param module The targeted module.
++ * @param severity The severity level of the trace message. In decreasing order:
++ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
++ * @param format The message to be traced.
++ */
++#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
++
++/**
++ * Logs a message with one argument if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
++
++/**
++ * Logs a message with two arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
++
++/**
++ * Logs a message with three arguments if the targeted severity level
++ * is enabled both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
++
++/**
++ * Logs a message with four arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
++
++/**
++ * Logs a message with five arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
++                        a1, a2, a3, a4, a5)
++
++/**
++ * Logs a message with six arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
++                        a1, a2, a3, a4, a5, a6) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
++                        a1, a2, a3, a4, a5, a6)
++
++/**
++ * Logs a message with seven arguments if the targeted severity level
++ * is enabled both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++    IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
++                        a1, a2, a3, a4, a5, a6, a7)
++
++/*
++** Implementation
++*/
++
++/* CAT */
++#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
++#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
++
++/* Bridge */
++#if defined(__HIVECC) || defined(__GNUC__)
++#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
++    IA_CSS_TRACE_CAT( \
++        IA_CSS_TRACE_CAT( \
++            IA_CSS_TRACE_CAT( \
++                IA_CSS_TRACE_CAT( \
++                    IA_CSS_TRACE_CAT( \
++                        IA_CSS_TRACE_, \
++                        argument_count \
++                    ), \
++                    _ \
++                ), \
++                IA_CSS_TRACE_CAT( \
++                    module, \
++                    _TRACE_METHOD \
++                ) \
++            ), \
++            _ \
++        ), \
++        IA_CSS_TRACE_CAT( \
++            IA_CSS_TRACE_CAT( \
++                module, \
++                _TRACE_LEVEL_ \
++            ), \
++            severity \
++        ) \
++        ( \
++            IA_CSS_TRACE_CAT( \
++                IA_CSS_TRACE_CAT( \
++                    IA_CSS_TRACE_CAT( \
++                        IA_CSS_TRACE_SEVERITY_, \
++                        severity \
++                    ), \
++                    _ \
++                ), \
++                IA_CSS_TRACE_CAT( \
++                    module, \
++                    _TRACE_METHOD \
++                ) \
++            ), \
++            #module, \
++            ## arguments \
++        ) \
++    )
++
++/* Bridge */
++#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
++                            arguments ...) \
++    do { \
++        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
++                            severity)) { \
++            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
++                            ## arguments); \
++        } \
++    } while (0)
++#elif defined(_MSC_VER)
++#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
++    IA_CSS_TRACE_CAT( \
++        IA_CSS_TRACE_CAT( \
++            IA_CSS_TRACE_CAT( \
++                IA_CSS_TRACE_CAT( \
++                    IA_CSS_TRACE_CAT( \
++                        IA_CSS_TRACE_, \
++                        argument_count \
++                    ), \
++                    _ \
++                ), \
++                IA_CSS_TRACE_CAT( \
++                    module, \
++                    _TRACE_METHOD \
++                ) \
++            ), \
++            _ \
++        ), \
++        IA_CSS_TRACE_CAT( \
++            IA_CSS_TRACE_CAT( \
++                module, \
++                _TRACE_LEVEL_ \
++            ), \
++            severity \
++        ) \
++        ( \
++            IA_CSS_TRACE_CAT( \
++                IA_CSS_TRACE_CAT( \
++                    IA_CSS_TRACE_CAT( \
++                        IA_CSS_TRACE_SEVERITY_, \
++                        severity \
++                    ), \
++                    _ \
++                ), \
++                IA_CSS_TRACE_CAT( \
++                    module, \
++                    _TRACE_METHOD \
++                ) \
++            ), \
++            #module, \
++            __VA_ARGS__  \
++        ) \
++    )
++
++/* Bridge */
++#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
++    do { \
++        if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
++                            severity)) { \
++            IA_CSS_TRACE_IMPL(module, argument_count, severity, \
++                            __VA_ARGS__); \
++        } \
++    } while (0)
++#endif
++
++/*
++** Native Backend
++*/
++
++#if defined(__HIVECC)
++    #define IA_CSS_TRACE_PLATFORM_CELL
++#elif defined(__XTENSA__)
++    #define IA_CSS_TRACE_PLATFORM_XTENSA
++#elif defined(XTENSA_HOST)
++    #define IA_CSS_TRACE_PLATFORM_XTENSA
++#elif defined(__GNUC__)
++    #define IA_CSS_TRACE_PLATFORM_HOST
++
++    #define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
++    do { \
++        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++        PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
++                        format),  ## arguments); \
++    } while (0)
++    /* TODO: In case Host Side tracing is needed to be mapped to the
++     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++     * PRINT to vied_nci_tunit_print function calls
++    */
++    #define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
++    do { \
++        IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++        PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
++                        format),  ## arguments); \
++    } while (0)
++
++#elif defined(_MSC_VER)
++    #define IA_CSS_TRACE_PLATFORM_HOST
++
++#ifdef _KERNEL_MODE
++    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
++        do { \
++            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++            P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
++                    module, format),  __VA_ARGS__); \
++        } while (0)
++    /* TODO: In case Host Side tracing is needed to be mapped to the
++     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++     * PRINT to vied_nci_tunit_print function calls
++    */
++    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
++        do { \
++            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++            P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
++                    module, format),  __VA_ARGS__); \
++        } while (0)
++#else
++    #define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
++        do { \
++            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++            PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
++                    module, format),  __VA_ARGS__); \
++        } while (0)
++    /* TODO: In case Host Side tracing is needed to be mapped to the
++     * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++     * PRINT to vied_nci_tunit_print function calls
++    */
++    #define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
++        do { \
++            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++            PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
++                    module, format),  __VA_ARGS__); \
++        } while (0)
++#endif
++#else
++    #error Unsupported platform!
++#endif /* Platform */
++
++#if defined(IA_CSS_TRACE_PLATFORM_CELL)
++    #include <hive/attributes.h> /* VOLATILE */
++
++    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
++        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
++            do { \
++                OP___printstring(__FILE__":") VOLATILE; \
++                OP___printdec(__LINE__) VOLATILE; \
++                OP___printstring("\n") VOLATILE; \
++            } while (0)
++    #else
++        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
++    #endif
++
++    #define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
++        do { \
++            IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
++            OP___printstring("["module"]:["severity"]:") \
++            VOLATILE; \
++        } while (0)
++
++    #define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
++        do { \
++            IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++            OP___printstring("["module"]:["severity"]: "format) \
++            VOLATILE; \
++        } while (0)
++
++    #define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
++        do { \
++            IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
++            OP___dump(i, value) VOLATILE; \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++        IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
++
++    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++                        a1, a2, a3, a4) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
++        } while (0)
++
++    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++        do { \
++            IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
++            IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
++        } while (0)
++    /*
++    ** Tracing Backend
++    */
++#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
++    #include "vied_nci_tunit.h"
++#endif
++    #define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
++        "[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
++
++    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
++        vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity)
++
++    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
++        vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1)
++
++    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
++        vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2)
++
++    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
++        vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2, a3)
++
++    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
++        vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2, a3, a4)
++
++    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++        vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2, a3, a4, a5)
++
++    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++        vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2, a3, a4, a5, a6)
++
++    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++        vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++                                module), \
++            severity, a1, a2, a3, a4, a5, a6, a7)
++
++#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
++    #include "print_support_xtensa.h"
++
++    /* TODO: Tunit tracing is not yet supported on Xtensa platforms,
++     * proper Trace functions will be created once supported.
++     */
++
++    #define IA_CSS_TRACE_TRACE_0(severity, module, format)
++    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
++    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
++    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
++    #define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
++    #define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
++    #define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
++    #define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
++
++#ifdef __XTENSA_FW__
++    #define SOURCE "FW"
++#else
++    #define SOURCE "HOST"
++#endif
++
++#if defined(XTENSA_PRINT_USE_SIMCALL)
++
++    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++    simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
++
++    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++    simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
++
++    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++    simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
++
++    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++    simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
++
++    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++                        a1, a2, a3, a4) \
++    simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
++
++    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++    simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
++
++    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++    simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
++
++    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++    simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
++
++#elif defined(XTENSA_PRINT_USE_PRINTF)
++
++    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
++
++    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
++
++    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
++
++    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
++
++    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++                        a1, a2, a3, a4) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
++
++    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
++
++    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
++
++    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++    PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
++
++#endif
++#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
++    #include "print_support.h"
++
++    #ifdef IA_CSS_TRACE_PRINT_FILE_LINE
++        #define IA_CSS_TRACE_FILE_PRINT_COMMAND \
++                PRINT("%s:%d:\n", __FILE__, __LINE__)
++    #else
++        #define IA_CSS_TRACE_FILE_PRINT_COMMAND
++    #endif
++
++    #define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
++            "[" module "]:[" severity "]: " format
++
++    #define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++        IA_CSS_TRACE_NATIVE(severity, module, format)
++
++    #define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, a1)
++
++    #define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
++
++    #define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
++
++    #define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++                        a1, a2, a3, a4) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
++
++    #define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, \
++                        a1, a2, a3, a4, a5)
++
++    #define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6)
++
++    #define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++        IA_CSS_TRACE_NATIVE(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7)
++
++    #define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
++            "["module"]:["severity"]: "format
++
++    #define IA_CSS_TRACE_TRACE_0(severity, module, format) \
++        IA_CSS_TRACE_TRACE(severity, module, format)
++
++    #define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
++        IA_CSS_TRACE_TRACE(severity, module, format, a1)
++
++    #define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
++        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
++
++    #define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
++        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
++
++    #define IA_CSS_TRACE_TRACE_4(severity, module, format, \
++                        a1, a2, a3, a4) \
++        IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
++
++    #define IA_CSS_TRACE_TRACE_5(severity, module, format, \
++                        a1, a2, a3, a4, a5) \
++        IA_CSS_TRACE_TRACE(severity, module, format, \
++                        a1, a2, a3, a4, a5)
++
++    #define IA_CSS_TRACE_TRACE_6(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6) \
++        IA_CSS_TRACE_TRACE(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6)
++
++    #define IA_CSS_TRACE_TRACE_7(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7) \
++        IA_CSS_TRACE_TRACE(severity, module, format, \
++                        a1, a2, a3, a4, a5, a6, a7)
++#endif
++
++/* Disabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_1_0(severity, module, format)
++#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
++#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
++#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
++#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
++#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5)
++#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5, arg6)
++#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5, arg6, arg7)
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
++#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
++#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
++#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
++#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
++#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
++#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
++#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
++
++#if defined(_MSC_VER) && defined(_KERNEL_MODE)
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
++#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
++#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
++#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
++#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
++#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
++#else
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
++#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
++#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
++#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
++#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
++#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
++#endif
++/* Disabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_2_0(severity, module, format)
++#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
++#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
++#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
++#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
++#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5)
++#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5, arg6)
++#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++                            arg5, arg6, arg7)
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
++#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
++#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
++#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
++#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
++#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
++#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
++#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
++#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
++#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
++#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
++#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
++
++/*
++** Dynamicism
++*/
++
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
++    do { \
++        void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
++        void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
++    } while (0)
++
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
++    do { \
++        IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
++        void IA_CSS_TRACE_CAT(module, _trace_configure)\
++            (int argc, const char *const *argv); \
++    } while (0)
++
++#include "platform_support.h"
++#include "type_support.h"
++
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
++    static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
++    } \
++    \
++    void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
++    { \
++        IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
++    }
++
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
++void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
++                const char *const *const argv) \
++{ \
++    int i = 1; \
++    const char *levels = 0; \
++    \
++    while (i < argc) { \
++        if (!strcmp(argv[i], "-" #module "_trace")) { \
++            ++i; \
++            \
++            if (i < argc) { \
++                levels = argv[i]; \
++                \
++                while (*levels) { \
++                    switch (*levels++) { \
++                    case 'a': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_assert_enable)(); \
++                        break; \
++                        \
++                    case 'e': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_error_enable)(); \
++                        break; \
++                        \
++                    case 'w': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_warning_enable)(); \
++                        break; \
++                        \
++                    case 'i': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_info_enable)(); \
++                        break; \
++                        \
++                    case 'd': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_debug_enable)(); \
++                        break; \
++                        \
++                    case 'v': \
++                        IA_CSS_TRACE_CAT \
++                    (module, _trace_verbose_enable)(); \
++                        break; \
++                        \
++                    default: \
++                    } \
++                } \
++            } \
++        } \
++        \
++    ++i; \
++    } \
++}
++
++#endif /* __IA_CSS_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
+new file mode 100644
+index 000000000000..0fc17cca1a74
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_acb_devices.h
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IPU_DEVICE_ACB_DEVICES_H
++#define __IPU_DEVICE_ACB_DEVICES_H
++
++enum ipu_device_acb_id {
++    /* PSA accelerators */
++    IPU_DEVICE_ACB_RYNR_ID = 0,
++    IPU_DEVICE_ACB_DEMOSAIC_ID,
++    IPU_DEVICE_ACB_VCSC_ID,
++    IPU_DEVICE_ACB_GLTM_ID,
++    IPU_DEVICE_ACB_XNR_ID,
++    IPU_DEVICE_ACB_ACM_ID, /* ACM is called VCA in HW */
++    IPU_DEVICE_ACB_GAMMASTAR_ID,
++    IPU_DEVICE_ACB_GTC_ID,
++    IPU_DEVICE_ACB_YUV1_ID,
++    IPU_DEVICE_ACB_DVS_ID,
++    /* ISA accelerators */
++    IPU_DEVICE_ACB_X2B_MD_ID,
++    IPU_DEVICE_ACB_X2B_SVE_RGBIR_ID,
++    IPU_DEVICE_ACB_B2B_ID,
++    IPU_DEVICE_ACB_B2R_ID,
++    IPU_DEVICE_ACB_ICA_ID,
++    IPU_DEVICE_ACB_LSC_ID,
++    IPU_DEVICE_ACB_DPC_ID,
++    IPU_DEVICE_ACB_R2I_SIE_ID,
++    IPU_DEVICE_ACB_R2I_DS_A_ID,
++    IPU_DEVICE_ACB_R2I_DS_B_ID,
++    IPU_DEVICE_ACB_AWB_ID,
++    IPU_DEVICE_ACB_AF_ID,
++    IPU_DEVICE_ACB_PAF_ID,
++    IPU_DEVICE_ACB_AE_ID,
++    IPU_DEVICE_ACB_SIS_A_ID,
++    IPU_DEVICE_ACB_SIS_B_ID,
++    IPU_DEVICE_ACB_ICA_S_ID,
++    IPU_DEVICE_ACB_ICA_M_ID,
++    IPU_DEVICE_ACB_DOL_ID,
++    IPU_DEVICE_ACB_NUM_ACB
++};
++
++#define IPU_DEVICE_ACB_NUM_PSA_ACB (IPU_DEVICE_ACB_DVS_ID + 1)
++#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB - IPU_DEVICE_ACB_NUM_PSA_ACB)
++
++#endif /* __IPU_DEVICE_ACB_DEVICES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
+new file mode 100644
+index 000000000000..a531352bc640
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/ipu_device_gp_devices.h
+@@ -0,0 +1,205 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IPU_DEVICE_GP_DEVICES_H
++#define __IPU_DEVICE_GP_DEVICES_H
++#include "math_support.h"
++#include "type_support.h"
++
++enum ipu_device_gp_id {
++    IPU_DEVICE_GP_PSA = 0,
++    IPU_DEVICE_GP_ISA_STATIC,
++    IPU_DEVICE_GP_ISA_RUNTIME,
++    IPU_DEVICE_GP_NUM_GP
++};
++
++/* The PSA_* naming in the enum members refers to the internal separation of
++ * the PSA. Using it this way should make this change transparent
++ * to higher layers.
++ *
++ * For details on the values and usage of the muxes see Figures 3-1
++ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
++ * Fixed Function MAS. Additionally, refer to the respective description
++ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
++ * or isa_ps_system.rdl).
++ */
++enum ipu_device_gp_psa_mux_id {
++    /* Mux/demuxes */
++    /* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
++    IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
++    /* 0 - To XNR; 1 - WB/DM */
++    IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
++    /* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
++    IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
++    /* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
++    IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
++    /* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
++    IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
++    /* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
++    IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
++    /* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
++    IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
++    /* Device blockers */
++    /* BNLM pixel output block enable */
++    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
++    /* BNLM pixel output block enable */
++    IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
++    /* BNLM delta output block enable */
++    IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
++    /* Block pixel stream to gltm from vcsc */
++    IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
++    /* Block pixel stream to gltm from bnlm */
++    IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
++    /* Frame size reg for strmCrop H */
++    IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
++    IPU_DEVICE_GP_PSA_MUX_NUM_MUX
++};
++
++enum ipu_device_gp_isa_static_mux_id {
++    /* Muxes/demuxes */
++    /* 0 - to ISL.S2V; 1 - to PSA */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
++    /* 0 - to ISL.S2V; 1 - to PSA */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
++    /* 0 - Input Correction; 1 - B2B mux */
++    IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
++    /* 0 - Input Correction; 1 - B2B mux */
++    IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
++    /* 0 - Input Correction; 1 - B2B mux */
++    IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
++    /* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
++    /* 0 - Input correction; 1 - Dpc; 2 - X2b */
++    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
++    /* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
++    IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
++    /* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
++    IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
++    /* 0 - Lsc; 1 - Input correction; 2 - X2b */
++    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
++    /* 0 - Lsc; 1 - X2b; 2 - Input correction */
++    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
++    /* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
++    IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
++    /* 0 - Lsc; 1 - Dpc; 2 - X2b */
++    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
++    /* 0 - Through X2B SVE RGBIR; 1 - Bypass */
++    IPU_DEVICE_GP_ISA_STATIC_SVE_RGBIR_BP_MUX_DEMUX_SEL,
++    /* 0 - X2B SVE RGBIR; 1- X2B MD */
++    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_MUX_SEL,
++    /* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
++    IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
++    /* 0 - to Dol mux; 1 - to Dol */
++    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
++    /* 0 - Main input; 1 - Dol */
++    IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
++    /* Blockers */
++    /* ISA input correction Port block */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
++    /* AWB Mux input correction Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
++    /* AE Mux input correction Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
++    /* AF Mux input correction Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
++    /* AWB Mux B2B Mux Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
++    /* AE Mux B2B Mux Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
++    /* AF Mux B2B Mux Port block */
++    IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
++    /* PAF stream sync configuration */
++    IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
++    /* Paf Mux gddpc Port block */
++    IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
++    /* Paf Mux input isa Port block */
++    IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
++    /* Paf Mux X2B Port block */
++    IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
++    /* SIS A port block */
++    IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
++    /* SIS B port block */
++    IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
++    /* Lsc mux Input Corr demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++    /* Dpc mux Lsc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++    /* Dpc mux Lsc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
++    /* Dpc mux X2b demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
++    /* Dpc mux Lsc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
++    /* Lsc mux X2b demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
++    /* X2b mux Lsc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
++    /* X2b mux Dpc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
++    /* X2b mux Input Corr demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++    /* B2b mux Lsc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
++    /* B2b mux X2b demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
++    /* B2b mux Dpc demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
++    /* B2b B2b mux port block */
++    IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
++    /* Stat B2b mux port block */
++    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
++    /* Stat Input correction mux port block */
++    IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
++    /* Sis A B2b port block */
++    IPU_DEVICE_GP_ISA_STATIC_SIS_A_B2B_PORT_BLK,
++    /* Sis B B2b port block */
++    IPU_DEVICE_GP_ISA_STATIC_SIS_B_B2B_PORT_BLK,
++    /* ISA Orig B2b port block */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
++    /* B2r B2b port block */
++    IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
++    /* ISA Scaled A Out R2i port block */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
++    /* ISA Scaled B Out R2i port block */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
++    /* ISA Full Out R2i port block */
++    IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
++    /* Ir Depth Out X2b port block */
++    IPU_DEVICE_GP_ISA_STATIC_IR_DEPTH_OUT_X2B_PORT_BLK,
++    /* Main input Dol demux port block */
++    IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
++    /* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
++    IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
++    IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
++};
++
++enum ipu_device_gp_isa_runtime_mux_id {
++    /* frame dim */
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
++    IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
++    IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
++};
++
++/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
++#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
++
++#endif /* __IPU_DEVICE_GP_DEVICES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
+new file mode 100644
+index 000000000000..05180a3b927f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/math_support.h
+@@ -0,0 +1,328 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __MATH_SUPPORT_H
++#define __MATH_SUPPORT_H
++
++#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
++#include "type_support.h"
++#include "assert_support.h"
++
++/* in case we have min/max/MIN/MAX macro's undefine them */
++#ifdef min
++#undef min
++#endif
++#ifdef max
++#undef max
++#endif
++#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
++#undef MIN
++#endif
++#ifdef MAX
++#undef MAX
++#endif
++
++#ifndef INT8_MIN
++#define INT8_MIN        (-127 - 1)
++#endif
++
++#ifndef INT8_MAX
++#define INT8_MAX        (127)
++#endif
++
++#ifndef UINT8_MAX
++#define UINT8_MAX       (0xffUL)
++#endif
++
++#ifndef UINT16_MAX
++#define UINT16_MAX       (0xffffUL)
++#endif
++
++#ifndef UINT32_MAX
++#define UINT32_MAX       (0xffffffffUL)
++#endif
++
++#define IS_ODD(a) ((a) & 0x1)
++#define IS_EVEN(a) (!IS_ODD(a))
++#define IS_POWER2(a) (!((a)&((a)-1)))
++#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
++#define IS_MASK_BITS_SET(a, b)    ((a & b) != 0)
++
++/*To Find next power of 2 number from x */
++#define bit2(x)            ((x)      | ((x) >> 1))
++#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
++#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
++#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
++#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
++#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
++
++/* force a value to a lower even value */
++#define EVEN_FLOOR(x)    ((x) & ~1UL)
++
++/* A => B */
++#define IMPLIES(a, b) (!(a) || (b))
++
++/* The ORIG_BITS th bit is the sign bit */
++/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
++/* By type casting it can relimited to any valid type-size
++ * (32-bit signed or 16-bit or 8-bit)
++ */
++/* By masking it can be transformed to any arbitrary bit size */
++#define SIGN_EXTEND(VAL, ORIG_BITS) \
++((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
++
++#define EXTRACT_BIT(a, b)    ((a >> b) & 1)
++
++/* for preprocessor and array sizing use MIN and MAX
++   otherwise use min and max */
++#define MAX(a, b)        (((a) > (b)) ? (a) : (b))
++#define MIN(a, b)        (((a) < (b)) ? (a) : (b))
++#define CLIP(a, b, c)        MIN((MAX((a), (b))), (c))
++/* Integer round-down division of a with b */
++#define FLOOR_DIV(a, b)        ((b) ? ((a) / (b)) : 0)
++/* Align a to the lower multiple of b */
++#define FLOOR_MUL(a, b)        (FLOOR_DIV(a, b) * (b))
++/* Integer round-up division of a with b */
++#define CEIL_DIV(a, b)        ((b) ? (((a) + (b) - 1) / (b)) : 0)
++/* Align a to the upper multiple of b */
++#define CEIL_MUL(a, b)        (CEIL_DIV(a, b) * (b))
++/* Align a to the upper multiple of b - fast implementation
++ * for cases when b=pow(2,n)
++ */
++#define CEIL_MUL2(a, b)        (((a) + (b) - 1) & ~((b) - 1))
++/* integer round-up division of a with pow(2,b) */
++#define CEIL_SHIFT(a, b)    (((a) + (1UL << (b)) - 1) >> (b))
++/* Align a to the upper multiple of pow(2,b) */
++#define CEIL_SHIFT_MUL(a, b)    (CEIL_SHIFT(a, b) << (b))
++/* Absolute difference of a and b */
++#define ABS_DIF(a, b)        (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
++#define ABS(a) ABS_DIF(a, 0)
++/* Square of x */
++#define SQR(x)            ((x)*(x))
++/* Integer round-half-down division of a nad b */
++#define ROUND_HALF_DOWN_DIV(a, b)    ((b) ? ((a) + (b / 2) - 1) / (b) : 0)
++/* Align a to the round-half-down multiple of b */
++#define ROUND_HALF_DOWN_MUL(a, b)    (ROUND_HALF_DOWN_DIV(a, b) * (b))
++
++#define MAX3(a, b, c)        MAX((a), MAX((b), (c)))
++#define MIN3(a, b, c)        MIN((a), MIN((b), (c)))
++#define MAX4(a, b, c, d)    MAX((MAX((a), (b))), (MAX((c), (d))))
++#define MIN4(a, b, c, d)    MIN((MIN((a), (b))), (MIN((c), (d))))
++
++/* min and max should not be macros as they will evaluate their arguments twice.
++   if you really need a macro (e.g. for CPP or for initializing an array)
++   use MIN() and MAX(), otherwise use min() and max() */
++
++#ifndef ARRAY_SIZE
++#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
++#endif
++
++#ifndef BYTES
++#define BYTES(bit) (((bit)+7)/8)
++#endif
++
++#if !defined(PIPE_GENERATION)
++STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
++{
++    return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
++}
++STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
++{
++    return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
++}
++STORAGE_CLASS_INLINE int max(int a, int b)
++{
++    return MAX(a, b);
++}
++
++STORAGE_CLASS_INLINE int min(int a, int b)
++{
++    return MIN(a, b);
++}
++
++STORAGE_CLASS_INLINE int clip(int a, int b, int c)
++{
++    return min(max(a, b), c);
++}
++
++STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
++{
++    return MAX(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
++{
++    return MIN(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
++                    unsigned int c)
++{
++    return umin(umax(a, b), c);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
++{
++    return CEIL_DIV(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
++{
++    return CEIL_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
++{
++    return CEIL_MUL2(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
++{
++    return CEIL_SHIFT(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
++{
++    return CEIL_SHIFT_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE int abs_dif(int a, int b)
++{
++    return ABS_DIF(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
++{
++    return ABS_DIF(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
++        unsigned int b)
++{
++    return ROUND_HALF_DOWN_DIV(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
++        unsigned int b)
++{
++    return ROUND_HALF_DOWN_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
++{
++    unsigned int retval = 0;
++
++    if (IS_POWER2(a)) {
++        retval =  (unsigned int)a;
++    } else {
++        unsigned int v = a;
++
++        v |= v>>1;
++        v |= v>>2;
++        v |= v>>4;
++        v |= v>>8;
++        v |= v>>16;
++        retval =  (unsigned int)(v+1);
++    }
++    return retval;
++}
++
++STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
++{
++    static const uint8_t de_bruijn[] = {
++        0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
++        8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
++    };
++    uint32_t v = a;
++
++    v |= v>>1;
++    v |= v>>2;
++    v |= v>>4;
++    v |= v>>8;
++    v |= v>>16;
++    return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
++}
++
++/* Divide by small power of two */
++STORAGE_CLASS_INLINE unsigned int
++udiv2_small_i(uint32_t a, uint32_t b)
++{
++    assert(b <= 2);
++    return a >> (b-1);
++}
++
++/* optimized divide for small results
++ * a will be divided by b
++ * outbits is the number of bits needed for the result
++ * the smaller the cheaper the function will be.
++ * if the result doesn't fit in the number of output bits
++ * the result is incorrect and the function will assert
++ */
++STORAGE_CLASS_INLINE unsigned int
++udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
++{
++    int bit;
++    unsigned res = 0;
++    unsigned mask;
++
++#ifdef VOLCANO
++#pragma ipu unroll
++#endif
++    for (bit = outbits-1 ; bit >= 0; bit--) {
++        mask = 1<<bit;
++        if (a >= (b<<bit)) {
++            res |= mask; /* set the bit */
++            a = a - (b<<bit);
++        }
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++    }
++    /* check if the remainder is smaller than the divisor.
++     * if not we didn't produce enough output bits
++     */
++    assert(a < b);
++    return res;
++}
++
++#if !defined(__VIED_CELL)
++/*
++ * For SP and ISP, SDK provides the definition of OP_std_modadd.
++ * We need it only for host
++ */
++STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
++{
++    return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
++}
++
++/*
++ * For SP and ISP, SDK provides the definition of OP_asp_slor.
++ * We need it only for host
++ */
++STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
++{
++    return ((a << c) | b);
++}
++#else
++#include "hive/customops.h"
++#endif /* !defined(__VIED_CELL) */
++
++#endif /* !defined(PIPE_GENERATION) */
++#if !defined(__KERNEL__)
++#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
++#endif /* !defined(__KERNEL__) */
++
++#endif /* __MATH_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
+new file mode 100644
+index 000000000000..c7b2debe8bcb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/misc_support.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __MISC_SUPPORT_H
++#define __MISC_SUPPORT_H
++
++/* suppress compiler warnings on unused variables */
++#ifndef NOT_USED
++#define NOT_USED(a) ((void)(a))
++#endif
++
++/* Calculate the  total bytes for pow(2) byte alignment */
++#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
++    ((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
++
++/* Display the macro value given a string */
++#define _STR(x) #x
++#define STR(x) _STR(x)
++
++/* Concatenate */
++#ifndef CAT /* also defined in <hive/attributes.h> */
++#define _CAT(a, b)    a ## b
++#define CAT(a, b)    _CAT(a, b)
++#endif
++
++#define _CAT3(a, b, c)    a ## b ## c
++#define CAT3(a, b, c)    _CAT3(a, b, c)
++
++/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
++#ifndef __HIVECC
++#ifndef NO_HOIST
++#define NO_HOIST
++#endif
++#ifndef NO_CSE
++#define NO_CSE
++#endif
++#ifndef NO_ALIAS
++#define NO_ALIAS
++#endif
++#endif
++
++enum hive_method_id {
++    HIVE_METHOD_ID_CRUN,
++    HIVE_METHOD_ID_UNSCHED,
++    HIVE_METHOD_ID_SCHED,
++    HIVE_METHOD_ID_TARGET
++};
++
++/* Derive METHOD */
++#if defined(C_RUN)
++    #define HIVE_METHOD "crun"
++    #define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
++#elif defined(HRT_UNSCHED)
++    #define HIVE_METHOD "unsched"
++    #define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
++#elif defined(HRT_SCHED)
++    #define HIVE_METHOD "sched"
++    #define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
++#else
++    #define HIVE_METHOD "target"
++    #define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
++    #define HRT_TARGET 1
++#endif
++
++#endif /* __MISC_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
+new file mode 100644
+index 000000000000..8c7a6e1b9400
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
++#define __PG_CONTROL_INIT_FRAMEWORK_H
++
++#include <type_support.h>
++#include <ia_css_psys_process_types.h>
++#include <ia_css_terminal_types.h>
++#include <ia_css_kernel_user_param_types.h>
++
++#pragma GCC visibility push(default)
++
++enum pg_control_init_ret_type {
++    PG_CONTROL_INIT_SUCCESS  = 0,
++    PG_CONTROL_INIT_FAILURE = (1 << 0)
++};
++
++/*
++ * @brief  Fill the program control init desc.
++ *
++ * @param[in]  process_group Process group.
++ * @param[out] terminal      Program control init terminal.
++ *
++ * @retval  0  Successful.
++ * @retval  1  Error.
++ */
++
++int pg_control_init_terminal_init(
++        ia_css_process_group_t *process_group,
++        ia_css_program_control_init_terminal_t *terminal);
++
++/**
++ * @brief  Fill the program control init payload.
++ *
++ * @param[in]  process_group    Process group.
++ * @param[in]  params           Kernel user parameters object.
++ * @param[in]  payload_address  Host address in payload.
++ *
++ * @retval 0   Successful.
++ * @retval 1  Error.
++ */
++
++int pg_control_init_fill_payload(
++    const ia_css_process_group_t *process_group,
++    const ia_css_kernel_user_param_t *params,
++    void *payload_address);
++
++/**
++ * @brief  Get the payload size
++ *
++ * @param[in]   process_group Process group
++ * @param[out]  payload_size  Payload size to be allocated for the process.
++ *
++ * @retval 0   Successful.
++ * @retval 1  Error.
++ */
++
++int pg_control_init_get_payload_size(
++    const ia_css_process_group_t *process_group,
++    unsigned int *payload_size);
++
++#pragma GCC visibility pop
++
++#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
+new file mode 100644
+index 000000000000..4f779ef53241
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/platform_support.h
+@@ -0,0 +1,194 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PLATFORM_SUPPORT_H
++#define __PLATFORM_SUPPORT_H
++
++#include "storage_class.h"
++
++#define MSEC_IN_SEC 1000
++#define NSEC_IN_MSEC 1000000
++
++#define NUM_SLEEP_MSEC_WA_XTENSA 1
++
++#if defined(_MSC_VER)
++#include <string.h>
++
++#define IA_CSS_EXTERN
++#define SYNC_WITH(x)
++#define CSS_ALIGN(d, a) _declspec(align(a)) d
++
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    /* Placeholder for driver team*/
++}
++
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++    /* Placeholder for driver team*/
++    (void)delay_time_ms;
++}
++
++#elif defined(__HIVECC)
++#include <string.h>
++#include <hive/support.h>
++#include <hive/attributes.h>
++
++#define IA_CSS_EXTERN extern
++#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    OP___schedule();
++}
++
++#elif defined(__KERNEL__)
++#include <linux/string.h>
++#include <linux/delay.h>
++
++#define IA_CSS_EXTERN
++#define CSS_ALIGN(d, a) d __aligned(a)
++
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    usleep_range(1, 50);
++}
++#elif defined(__XTENSA_FW__)
++
++#include <hive/support.h>
++
++#define ALIAS_ATTR(target) __attribute__((alias(#target)))
++#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
++
++#elif defined(__GNUC__)
++#include <string.h>
++
++#define IA_CSS_EXTERN
++#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
++
++/* Define some __HIVECC specific macros to nothing to allow host code compilation */
++#ifndef NO_ALIAS
++#define NO_ALIAS
++#endif
++
++#ifndef SYNC_WITH
++#define SYNC_WITH(x)
++#endif
++
++#if defined(HRT_CSIM)
++#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    /* For the SDK still using hrt_sleep */
++    hrt_sleep();
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++    /* For the SDK still using hrt_sleep */
++    unsigned int long i = 0;
++
++    for (i = 0; i < delay_time_ms; i++) {
++        hrt_sleep();
++    }
++}
++#elif defined(__XTENSA_FW__) /* XTENSA FW */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    /* do nothing */
++}
++#elif defined(IPUSIM_SLEEP)
++#include "hrt/host.h"
++#include "misc_support.h" /* for NOT_USED macro */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    hrt_sleep();
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++    /* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
++     * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
++     * This is because ia_css_sleep_msec is used thousands of times (BUG).
++     * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
++     */
++    NOT_USED(delay_time_ms);
++    hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
++}
++#else
++#include <time.h>
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++    struct timespec delay_time;
++
++    delay_time.tv_sec = 0;
++    delay_time.tv_nsec = 10;
++    nanosleep(&delay_time, NULL);
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++    struct timespec delay_time;
++
++    if (delay_time_ms >= MSEC_IN_SEC) {
++        delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
++        delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
++    } else {
++        delay_time.tv_sec = 0;
++        delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
++    }
++    nanosleep(&delay_time, NULL);
++}
++#endif
++
++#else
++
++#if defined(__XTENSA_FW__)
++
++#define CSS_ALIGN(d, a) d
++
++#define ia_css_sleep()
++
++#if defined(__XTENSA_EL__)
++#define __IEEE_LITTLE_ENDIAN
++#else
++#define __IEEE_BIG_ENDIAN
++#endif
++
++#endif
++#include <string.h>
++#endif
++
++/*needed for the include in stdint.h for various environments */
++#include "type_support.h"
++#include "storage_class.h"
++
++#define MAX_ALIGNMENT            8
++#define aligned_uint8(type, obj)    CSS_ALIGN(uint8_t obj, 1)
++#define aligned_int8(type, obj)        CSS_ALIGN(int8_t obj, 1)
++#define aligned_uint16(type, obj)    CSS_ALIGN(uint16_t obj, 2)
++#define aligned_int16(type, obj)    CSS_ALIGN(int16_t obj, 2)
++#define aligned_uint32(type, obj)    CSS_ALIGN(uint32_t obj, 4)
++#define aligned_int32(type, obj)    CSS_ALIGN(int32_t obj, 4)
++
++/* needed as long as hivecc does not define the type (u)int64_t */
++#if defined(__HIVECC)
++#define aligned_uint64(type, obj)    CSS_ALIGN(unsigned long long obj, 8)
++#define aligned_int64(type, obj)    CSS_ALIGN(signed long long obj, 8)
++#else
++#define aligned_uint64(type, obj)    CSS_ALIGN(uint64_t obj, 8)
++#define aligned_int64(type, obj)    CSS_ALIGN(int64_t obj, 8)
++#endif
++#define aligned_enum(enum_type, obj)    CSS_ALIGN(uint32_t obj, 4)
++#define aligned_struct(struct_type, obj)    struct_type obj
++
++#endif /* __PLATFORM_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
+new file mode 100644
+index 000000000000..9ddffb4b5c41
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/print_support.h
+@@ -0,0 +1,121 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PRINT_SUPPORT_H
++#define __PRINT_SUPPORT_H
++
++#if defined(_MSC_VER)
++#ifdef _KERNEL_MODE
++
++/* TODO: Windows driver team to provide tracing mechanism for kernel mode
++ * e.g. DbgPrint and DbgPrintEx
++ */
++extern void FwTracePrintPWARN(const char *fmt, ...);
++extern void FwTracePrintPRINT(const char *fmt, ...);
++extern void FwTracePrintPERROR(const char *fmt, ...);
++extern void FwTracePrintPDEBUG(const char *fmt, ...);
++extern void FwTracePrintPFATAL(const char *fmt, ...);
++
++#define PWARN(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
++#define PWARNING(format, ...)    FwTracePrintPWARN(format, __VA_ARGS__)
++#define PRINT(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
++#define PINFO(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
++#define PERROR(format, ...)    FwTracePrintPERROR(format, __VA_ARGS__)
++#define PDEBUG(format, ...)    FwTracePrintPDEBUG(format, __VA_ARGS__)
++#define PVERBOSE(format, ...)    FwTracePrintPRINT(format, __VA_ARGS__)
++#define PFATAL(format, ...)    FwTracePrintPFATAL(format, __VA_ARGS__)
++
++#else
++/* Windows usermode compilation */
++#include <stdio.h>
++
++/* To change the defines below, communicate with Windows team first
++ * to ensure they will not get flooded with prints
++ */
++/* This is temporary workaround to avoid flooding userspace
++ * Windows driver with prints
++ */
++
++#define PWARN(format, ...)
++#define PWARNING(format, ...)
++#define PRINT(format, ...)
++#define PINFO(format, ...)
++#define PERROR(format, ...)    printf("error: " format, __VA_ARGS__)
++#define PDEBUG(format, ...)
++#define PVERBOSE(format, ...)
++#define PFATAL(format, ...)
++
++#endif /* _KERNEL_MODE */
++#elif defined(__HIVECC)
++#include <hive/support.h>
++/* To be revised
++
++#define PWARN(format)
++#define PRINT(format)                OP___printstring(format)
++#define PERROR(variable)            OP___dump(9999, arguments)
++#define PDEBUG(variable)            OP___dump(__LINE__, arguments)
++
++*/
++
++#define PRINTSTRING(str) OP___printstring(str)
++
++#elif defined(__KERNEL__)
++#include <linux/kernel.h>
++#include <linux/printk.h>
++
++#define PWARN(format, arguments...)    pr_debug(format, ##arguments)
++#define PRINT(format, arguments...)    pr_debug(format, ##arguments)
++#define PERROR(format, arguments...)    pr_debug(format, ##arguments)
++#define PDEBUG(format, arguments...)    pr_debug(format, ##arguments)
++
++#elif defined(__XTENSA_FW__)
++
++#include "print_support_xtensa.h"
++
++#elif defined(XTENSA_HOST)
++
++#include "print_support_xtensa.h"
++
++#else
++
++#include <stdio.h>
++
++#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
++
++/** WA_1507432540 - Limit prints to PERROR only
++ * Workaround to avoid flooding host with prints.
++ */
++#ifdef HOST_LOGLEVEL_ERROR_ONLY
++
++/* The trailing "" allows the edge case of printing single string */
++#define PWARN(...)
++#define PRINT(...)
++#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
++#define PDEBUG(...)
++
++#else
++
++/* The trailing "" allows the edge case of printing single string */
++#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
++#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
++#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
++#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
++
++#endif
++#define PRINTSTRING(str) PRINT(str)
++
++#endif
++#endif /* __PRINT_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
+new file mode 100644
+index 000000000000..72eb0cf5bc09
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/psys_system_global_impl.h
+@@ -0,0 +1,504 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
++#define __PSYS_SYSTEM_GLOBAL_IMPL_H
++
++#include <vied_nci_psys_system_global.h>
++
++#include "ia_css_psys_sim_trace.h"
++#include <assert_support.h>
++
++/* Use vied_bits instead, however for test purposes we uses explicit type
++ * checking
++ */
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bit_mask(
++    const unsigned int                        index)
++{
++    vied_nci_resource_bitmap_t    bit_mask = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
++
++    if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
++        bit_mask = (vied_nci_resource_bitmap_t)1 << index;
++
++    return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask)
++{
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
++
++/*
++    assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++    return bitmap | bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask)
++{
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_bitmap_clear(): enter:\n");
++
++/*
++    assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++    return bitmap & (~bit_mask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
++        const unsigned int position,
++        const unsigned int size)
++{
++    vied_nci_resource_bitmap_t    bit_mask = 0;
++    vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++               "vied_nci_bitfield_mask(): enter:\n");
++
++    if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
++        bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
++
++    return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const unsigned int                        index,
++    const unsigned int                        size)
++{
++    vied_nci_resource_bitmap_t    ret = 0;
++    vied_nci_resource_bitmap_t    bit_mask = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++               "vied_nci_bit_mask_set_bitfield(): enter:\n");
++
++    bit_mask = vied_nci_bitfield_mask(index, size);
++    ret = vied_nci_bitmap_set(bitmap, bit_mask);
++
++    return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask)
++{
++    vied_nci_resource_bitmap_t    ret = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_bitmap_set_unique(): enter:\n");
++
++    if ((bitmap & bit_mask) == 0)
++        ret = bitmap | bit_mask;
++
++    return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const unsigned int                        index)
++{
++    vied_nci_resource_bitmap_t    ret = 0;
++    vied_nci_resource_bitmap_t    bit_mask;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++               "vied_nci_bit_mask_set_unique(): enter:\n");
++
++    bit_mask = vied_nci_bit_mask(index);
++
++    if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
++        ret = bitmap | bit_mask;
++
++    return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_empty(
++    const vied_nci_resource_bitmap_t        bitmap)
++{
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_bitmap_empty(): enter:\n");
++
++    return (bitmap == 0);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_set(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask)
++{
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_bitmap_set(): enter:\n");
++
++/*
++    assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++    return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bit_set_in_bitmap(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const unsigned int        index)
++{
++
++    vied_nci_resource_bitmap_t bitmask;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_bit_set_in_bitmap(): enter:\n");
++    bitmask = vied_nci_bit_mask(index);
++    return vied_nci_is_bitmap_set(bitmap, bitmask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_clear(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask)
++{
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_bitmap_clear(): enter:\n");
++
++/*
++    assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++    return ((bitmap & bit_mask) == 0);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++int vied_nci_bitmap_compute_weight(
++    const vied_nci_resource_bitmap_t        bitmap)
++{
++    vied_nci_resource_bitmap_t    loc_bitmap = bitmap;
++    int    weight = 0;
++    int    i;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_bitmap_compute_weight(): enter:\n");
++
++    /* Do not need the iterator "i" */
++    for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
++            (loc_bitmap != 0); i++) {
++        weight += loc_bitmap & 0x01;
++        loc_bitmap >>= 1;
++    }
++
++    return weight;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_union(
++    const vied_nci_resource_bitmap_t    bitmap0,
++    const vied_nci_resource_bitmap_t    bitmap1)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_bitmap_union(): enter:\n");
++    return (bitmap0 | bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
++    const vied_nci_resource_bitmap_t        bitmap0,
++    const vied_nci_resource_bitmap_t        bitmap1)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "ia_css_kernel_bitmap_intersection(): enter:\n");
++    return (bitmap0 & bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
++    const vied_nci_resource_bitmap_t        bitmap0,
++    const vied_nci_resource_bitmap_t        bitmap1)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
++    return (bitmap0 ^ bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
++    const vied_nci_cell_ID_t        cell_id)
++{
++    vied_nci_resource_bitmap_t    bit_mask = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_cell_bit_mask(): enter:\n");
++
++    if (cell_id < VIED_NCI_N_CELL_ID) {
++        bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
++    }
++    return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
++    const vied_nci_barrier_ID_t        barrier_id)
++{
++    vied_nci_resource_bitmap_t    bit_mask = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_barrier_bit_mask(): enter:\n");
++
++    if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
++        bit_mask = (vied_nci_resource_bitmap_t)1 <<
++                (barrier_id + VIED_NCI_N_CELL_ID);
++    }
++    return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_cell_type_ID_t vied_nci_cell_get_type(
++    const vied_nci_cell_ID_t        cell_id)
++{
++    vied_nci_cell_type_ID_t    cell_type = VIED_NCI_N_CELL_TYPE_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_cell_get_type(): enter:\n");
++
++    if (cell_id < VIED_NCI_N_CELL_ID) {
++        cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++            "vied_nci_cell_get_type(): invalid argument\n");
++    }
++
++    return cell_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
++    const vied_nci_mem_type_ID_t        mem_type)
++{
++    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_ext_mem_get_id_from_type(): enter:\n");
++
++    if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
++        mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++            "vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
++    }
++
++    return mem_id;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_mem_get_type(
++    const vied_nci_mem_ID_t            mem_id)
++{
++    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_mem_get_type(): enter:\n");
++
++    if (mem_id < VIED_NCI_N_MEM_ID) {
++        mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++            "vied_nci_mem_get_type(): invalid argument\n");
++    }
++
++    return mem_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_mem_get_size(
++    const vied_nci_mem_ID_t            mem_id)
++{
++    uint16_t    mem_size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_mem_get_size(): enter:\n");
++
++    if (mem_id < VIED_NCI_N_MEM_ID) {
++        mem_size = vied_nci_mem_size[mem_id];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++            "vied_nci_mem_get_size(): invalid argument\n");
++    }
++
++    return mem_size;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_dev_chn_get_size(
++    const vied_nci_dev_chn_ID_t        dev_chn_id)
++{
++    uint16_t    dev_chn_size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_dev_chn_get_size(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++    if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++        dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++            "vied_nci_dev_chn_get_size(): invalid argument\n");
++    }
++#else
++    ((void)(dev_chn_id)); /* not used in ipu7 */
++#endif
++    return dev_chn_size;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_cell_of_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const vied_nci_cell_type_ID_t    cell_type_id)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_cell_of_type(): enter:\n");
++
++    return ((vied_nci_cell_get_type(cell_id) ==
++         cell_type_id) && (cell_type_id !=
++         VIED_NCI_N_CELL_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_mem_of_type(
++    const vied_nci_mem_ID_t            mem_id,
++    const vied_nci_mem_type_ID_t    mem_type_id)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_mem_of_type(): enter:\n");
++
++    return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
++        (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_cell_mem_of_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index,
++    const vied_nci_mem_type_ID_t    mem_type_id)
++{
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_is_cell_mem_of_type(): enter:\n");
++
++    return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
++        && (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_has_cell_mem_of_id(
++    const vied_nci_cell_ID_t        cell_id,
++    const vied_nci_mem_ID_t            mem_id)
++{
++    uint16_t        mem_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_has_cell_mem_of_id(): enter:\n");
++
++    for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
++        if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
++            (mem_id != VIED_NCI_N_MEM_ID)) {
++            break;
++        }
++    }
++
++    return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_cell_get_mem_count(
++    const vied_nci_cell_ID_t        cell_id)
++{
++    uint16_t    mem_count = 0;
++    vied_nci_cell_type_ID_t    cell_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_cell_get_mem_count(): enter:\n");
++
++    cell_type = vied_nci_cell_get_type(cell_id);
++
++    if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
++        mem_count = vied_nci_N_cell_mem[cell_type];
++
++    return mem_count;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index)
++{
++    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_cell_get_mem_type(): enter:\n");
++
++    if ((cell_id < VIED_NCI_N_CELL_ID) &&
++        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
++                vied_nci_cell_get_type(cell_id)][mem_index]);
++    }
++
++    return mem_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_ID_t vied_nci_cell_get_mem(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index)
++{
++    vied_nci_mem_ID_t    mem_id = VIED_NCI_N_MEM_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++        "vied_nci_cell_get_mem(): enter:\n");
++
++    if ((cell_id < VIED_NCI_N_CELL_ID) &&
++        (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++        mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
++    }
++
++    return mem_id;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
++    const vied_nci_cell_type_ID_t    cell_type_id,
++    const uint16_t                    mem_index)
++{
++    vied_nci_mem_type_ID_t    mem_type = VIED_NCI_N_MEM_TYPE_ID;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++               "vied_nci_cell_type_get_mem_type(): enter:\n");
++
++    if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
++            && (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++        mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
++    }
++
++    return mem_type;
++}
++
++#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
+new file mode 100644
+index 000000000000..aeb9ffb3b367
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/storage_class.h
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __STORAGE_CLASS_H
++#define __STORAGE_CLASS_H
++
++#define STORAGE_CLASS_EXTERN \
++extern
++
++#if defined(_MSC_VER)
++#define STORAGE_CLASS_INLINE \
++static __inline
++#elif defined(__HIVECC)
++#define STORAGE_CLASS_INLINE \
++static inline
++#elif defined(__XTENSA_FW__)
++#include "storage_class_xtensa.h"
++#else
++#define STORAGE_CLASS_INLINE \
++static inline
++#endif
++
++/* Register struct */
++#ifndef __register
++#if defined(__HIVECC) && !defined(PIPE_GENERATION)
++#define __register register
++#else
++#define __register
++#endif
++#endif
++
++/* Memory attribute */
++#ifndef MEM
++#ifdef PIPE_GENERATION
++#elif defined(__HIVECC)
++#include <hive/attributes.h>
++#else
++#define MEM(any_mem)
++#endif
++#endif
++
++#endif /* __STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
+new file mode 100644
+index 000000000000..57fea54527a8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/type_support.h
+@@ -0,0 +1,82 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __TYPE_SUPPORT_H
++#define __TYPE_SUPPORT_H
++
++/* Per the DLI spec, types are in "type_support.h" and
++ * "platform_support.h" is for unclassified/to be refactored
++ * platform specific definitions.
++ */
++#define IA_CSS_UINT8_T_BITS    8
++#define IA_CSS_UINT16_T_BITS    16
++#define IA_CSS_UINT32_T_BITS    32
++#define IA_CSS_INT32_T_BITS    32
++#define IA_CSS_UINT64_T_BITS    64
++
++#if defined(_MSC_VER)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#if defined(_M_X64)
++#define HOST_ADDRESS(x) (unsigned long long)(x)
++#else
++#define HOST_ADDRESS(x) (unsigned long)(x)
++#endif
++
++#elif defined(PARAM_GENERATION)
++/* Nothing */
++#elif defined(__HIVECC)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++typedef long long int64_t;
++typedef unsigned long long uint64_t;
++
++#elif defined(__XTENSA_FW__)
++#include "type_support_xtensa.h"
++#elif defined(__KERNEL__)
++#include <linux/types.h>
++#include <linux/limits.h>
++
++#define CHAR_BIT (8)
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#elif defined(__GNUC__)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#else /* default is for the FIST environment */
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#endif
++#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
++/* genpipe cannot handle the void* syntax */
++typedef void *HANDLE;
++#endif
++
++#endif /* __TYPE_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
+new file mode 100644
+index 000000000000..3ceb0c70c2db
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_acb_route_type.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
++#define VIED_NCI_ACB_ROUTE_TYPE_H_
++
++#include "type_support.h"
++
++typedef enum {
++    NCI_ACB_PORT_ISP = 0,
++    NCI_ACB_PORT_ACC = 1,
++    NCI_ACB_PORT_INVALID = 0xFF
++} nci_acb_port_t;
++
++typedef struct {
++    /* 0 = ISP, 1 = Acc */
++    nci_acb_port_t in_select;
++    /* 0 = ISP, 1 = Acc */
++    nci_acb_port_t out_select;
++    /* When set, Ack will be sent only when Eof arrives */
++    uint32_t ignore_line_num;
++    /* Fork adapter to enable streaming to both output
++     * (next acb out and isp out)
++     */
++    uint32_t fork_acb_output;
++} nci_acb_route_t;
++
++#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
+new file mode 100644
+index 000000000000..c8da2bdde07b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_resource_model.h
+@@ -0,0 +1,380 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
++#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
++
++#include "type_support.h"
++#include "storage_class.h"
++
++#define HAS_DFM                 1
++#define HAS_DMA_INTERNAL        1
++#define NON_RELOC_RESOURCE_SUPPORT    1
++#define IA_CSS_KERNEL_BITMAP_BITS     128
++
++/* Defines for the routing bitmap in the program group manifest.
++ */
++#define VIED_NCI_RBM_MAX_MUX_COUNT            46
++#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT        17
++#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT        4
++#define N_PADDING_UINT8_IN_RBM_MANIFEST            2
++
++/* The amount of padding bytes needed to make
++ * ia_css_process_s/ia_css_process_ext_s/
++ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
++ * structures 32 bit aligned (source files have check on this)
++ */
++#define    N_PADDING_UINT8_IN_PROCESS_STRUCT        0
++#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT        0
++#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST        0
++#define    N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT        2
++
++/*
++ * Cell IDs
++ */
++typedef enum {
++    VIED_NCI_SP0_ID = 0,
++    VIED_NCI_VP0_ID,
++    VIED_NCI_PSA_ACC_BNLM_ID,
++    VIED_NCI_PSA_ACC_DM_ID,
++    VIED_NCI_PSA_ACC_ACM_ID,
++    VIED_NCI_PSA_ACC_GTC_YUV1_ID,
++    VIED_NCI_BB_ACC_OFS_PIN_MAIN_ID,
++    VIED_NCI_BB_ACC_OFS_PIN_DISPLAY_ID,
++    VIED_NCI_BB_ACC_OFS_PIN_PP_ID,
++    VIED_NCI_PSA_ACC_GAMMASTAR_ID,
++    VIED_NCI_PSA_ACC_GLTM_ID,
++    VIED_NCI_PSA_ACC_XNR_ID,
++    VIED_NCI_PSA_VCSC_ID,    /* VCSC */
++    VIED_NCI_ISA_ICA_ID,
++    VIED_NCI_ISA_LSC_ID,
++    VIED_NCI_ISA_DPC_ID,
++    VIED_NCI_ISA_SIS_A_ID,
++    VIED_NCI_ISA_SIS_B_ID,
++    VIED_NCI_ISA_B2B_ID,
++    VIED_NCI_ISA_B2R_R2I_SIE_ID,
++    VIED_NCI_ISA_R2I_DS_A_ID,
++    VIED_NCI_ISA_R2I_DS_B_ID,
++    VIED_NCI_ISA_AWB_ID,
++    VIED_NCI_ISA_AE_ID,
++    VIED_NCI_ISA_AF_ID,
++    VIED_NCI_ISA_DOL_ID,
++    VIED_NCI_ISA_ICA_MEDIUM_ID,
++    VIED_NCI_ISA_X2B_MD_ID,
++    VIED_NCI_ISA_X2B_SVE_RGBIR_ID,
++    VIED_NCI_ISA_PAF_ID,
++    VIED_NCI_BB_ACC_GDC0_ID,
++    VIED_NCI_BB_ACC_TNR_ID,
++} vied_nci_cell_ID_t;
++
++#define VIED_NCI_N_CELL_ID (VIED_NCI_BB_ACC_TNR_ID + 1)
++
++/*
++ * In several places we don't need to size the look up tables for the full amount of cells
++ * because they are only used for the VP and SP cells and not for the accelerator cells.
++ * It is important that these cells are in the beginning of the LUT
++ */
++#define VIED_NCI_N_PROG_CELLS (VIED_NCI_VP0_ID + 1)
++
++/*
++ * Barrier bits (to model process group dependencies)
++ * todo verify that this is valid for ipu6
++ */
++typedef enum {
++    VIED_NCI_BARRIER0_ID,
++    VIED_NCI_BARRIER1_ID,
++    VIED_NCI_BARRIER2_ID,
++    VIED_NCI_BARRIER3_ID,
++    VIED_NCI_BARRIER4_ID,
++    VIED_NCI_BARRIER5_ID,
++    VIED_NCI_BARRIER6_ID,
++    VIED_NCI_BARRIER7_ID
++} vied_nci_barrier_ID_t;
++
++#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
++/*
++ * Cell types
++ */
++typedef enum {
++    VIED_NCI_SP_CTRL_TYPE_ID = 0,
++    VIED_NCI_SP_SERVER_TYPE_ID,
++    VIED_NCI_VP_TYPE_ID,
++    VIED_NCI_ACC_PSA_TYPE_ID,
++    VIED_NCI_ACC_ISA_TYPE_ID,
++    VIED_NCI_ACC_OSA_TYPE_ID,
++    VIED_NCI_GDC_TYPE_ID,
++    VIED_NCI_TNR_TYPE_ID,
++    VIED_NCI_N_CELL_TYPE_ID
++} vied_nci_cell_type_ID_t;
++
++/*
++ * Memory IDs
++ */
++typedef enum {
++    VIED_NCI_VMEM0_ID = 0, /* ISP0 VMEM */
++    VIED_NCI_TRANSFER_VMEM0_ID, /* TRANSFER VMEM 0 */
++    VIED_NCI_TRANSFER_VMEM1_ID, /* TRANSFER VMEM 1 */
++    VIED_NCI_LB_VMEM_ID, /* LB VMEM */
++    VIED_NCI_BAMEM0_ID, /* ISP0 BAMEM */
++    VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
++    VIED_NCI_DMEM1_ID, /* SPP0 Dmem */
++    VIED_NCI_DMEM2_ID, /* SPP1 Dmem */
++    VIED_NCI_DMEM3_ID, /* ISP0 Dmem */
++    VIED_NCI_PMEM0_ID  /* ISP0 PMEM */
++} vied_nci_mem_ID_t;
++
++#define VIED_NCI_N_MEM_ID (VIED_NCI_PMEM0_ID + 1)
++/*
++ * Memory types
++ */
++typedef enum {
++    VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
++    VIED_NCI_TRANSFER_VMEM1_TYPE_ID,
++    VIED_NCI_LB_VMEM_TYPE_ID,
++    VIED_NCI_DMEM_TYPE_ID,
++    VIED_NCI_VMEM_TYPE_ID,
++    VIED_NCI_BAMEM_TYPE_ID,
++    VIED_NCI_PMEM_TYPE_ID
++} vied_nci_mem_type_ID_t;
++
++#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
++/******************************************************/
++
++/* Excluding PMEM */
++#define VIED_NCI_N_DATA_MEM_TYPE_ID     6 /* = MAX(vied_nci_mem_type_ID_t) */
++
++#define VIED_NCI_N_SP_CTRL_MEM        2
++#define VIED_NCI_N_SP_SERVER_MEM    2
++#define VIED_NCI_N_VP_MEM        4
++#define VIED_NCI_N_ACC_PSA_MEM        0
++#define VIED_NCI_N_ACC_ISA_MEM        0
++#define VIED_NCI_N_ACC_OSA_MEM        0
++#define VIED_NCI_N_GDC_MEM        0
++#define VIED_NCI_N_TNR_MEM        0
++
++#define VIED_NCI_N_VP_CELL        1
++#define VIED_NCI_N_ACC_CELL        13
++/******************************************************/
++/*
++ * Device IDs
++ * todo verify that this is valid for ipu6
++ */
++typedef enum {
++    VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0,
++    VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID,
++    VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID,
++    VIED_NCI_DEV_CHN_DMA_INTERNAL_ID,
++    VIED_NCI_DEV_CHN_DMA_ISA_ID,
++} vied_nci_dev_chn_ID_t;
++
++#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
++
++/*
++ * DFM devices
++ */
++typedef enum {
++    VIED_NCI_DEV_DFM_BB_FULL_PORT_ID = 0,
++    VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID,
++    VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID,
++    VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID,
++    VIED_NCI_DEV_DFM_LB_FULL_PORT_ID,
++    VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID
++} vied_nci_dev_dfm_id_t;
++
++#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID + 1)
++
++/*
++ * Link IDs
++ */
++typedef enum {
++    VIED_NCI_LINK_OTF_OFFLINE = 0,
++    VIED_NCI_LINK_OTF_MAIN_OUTPUT,
++    VIED_NCI_LINK_OTF_PDAF_OUTPUT,
++    VIED_NCI_LINK_DATA_BARRIER_0,
++    VIED_NCI_LINK_DATA_BARRIER_1,
++    VIED_NCI_LINK_DATA_BARRIER_2,
++    VIED_NCI_LINK_DATA_BARRIER_3,
++    VIED_NCI_LINK_DATA_BARRIER_4,
++    VIED_NCI_N_LINK_ID
++} vied_nci_link_ID_t;
++
++/*
++ * Psys server local object caches space
++ */
++typedef enum {
++    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
++    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
++    VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_2,
++    VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
++} vied_nci_psys_server_local_object_cache_t;
++
++/******************************************************/
++/*todo verify  for ipu6*/
++/*
++ * Memory size (previously in vied_nci_psys_system.c)
++ * VMEM: in words, 64 Byte per word.
++ * TRANSFER VMEM0: in words, 64 Byte per word
++ * TRANSFER VMEM1: in words, 64 Byte per word
++ * LB VMEM: in words, 64 Byte per word.
++ * BAMEM: in words, 64 Byte per word
++ * DMEM: in words, 4 Byte per word.
++ * PMEM: in words, 64 Byte per word.
++ */
++#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
++#define VIED_NCI_TRANSFER_VMEM1_WORD_SIZE     64
++#define VIED_NCI_LB_VMEM_WORD_SIZE     64
++#define VIED_NCI_DMEM_WORD_SIZE      4
++#define VIED_NCI_VMEM_WORD_SIZE     64
++#define VIED_NCI_BAMEM_WORD_SIZE    64
++#define VIED_NCI_PMEM_WORD_SIZE     64
++
++/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
++#define VIED_NCI_VMEM0_MAX_SIZE            (0x0800)
++#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE    (0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
++#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE    (0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
++#define VIED_NCI_LB_VMEM_MAX_SIZE        (0x0400) /* LB VMEM words */
++/* ISP BAMEM words $HIVECORES/idsp/include/hive/cell_params.h */
++#define VIED_NCI_BAMEM0_MAX_SIZE        (0x0800)
++#define VIED_NCI_DMEM0_MAX_SIZE            (0x4000)
++#define VIED_NCI_DMEM1_MAX_SIZE            (0x1000)
++#define VIED_NCI_DMEM2_MAX_SIZE            (0x1000)
++#define VIED_NCI_DMEM3_MAX_SIZE            (0x1000)
++#define VIED_NCI_PMEM0_MAX_SIZE            (0x0500)
++
++/*
++ * Number of channels per device
++ */
++#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE        (30)
++#define VIED_NCI_DEV_CHN_GDC_MAX_SIZE            (0)
++#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE        (30)
++/*
++ NOTE: once FW code will support DMA with one unit
++ descriptor #channels will be cut but half (36->18).
++*/
++#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE    (43)
++#define VIED_NCI_DEV_CHN_DMA_INTERNAL_MAX_SIZE        (8)
++#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE        (0)
++#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE        (2)
++
++/*
++ * Number of ports per DFM device
++ */
++#define VIED_NCI_DEV_DFM_BB_FULL_PORT_ID_MAX_SIZE        (32)
++#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE        (32)
++#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE        (32)
++#define VIED_NCI_DEV_DFM_BB_EMPTY_PORT_ID_MAX_SIZE        (32)
++#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE        (32)
++#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE        (32)
++/******************************************************/
++
++/*
++ * Storage of the resource and resource type enumerators
++ */
++#define VIED_NCI_RESOURCE_ID_BITS    8
++typedef uint8_t                vied_nci_resource_id_t;
++
++#define VIED_NCI_RESOURCE_SIZE_BITS    16
++typedef uint16_t            vied_nci_resource_size_t;
++
++#define VIED_NCI_RESOURCE_BITMAP_BITS    32
++typedef uint32_t            vied_nci_resource_bitmap_t;
++
++#define IA_CSS_PROCESS_INVALID_DEPENDENCY    ((vied_nci_resource_id_t)(-1))
++#define IA_CSS_PROCESS_INVALID_OFFSET        ((vied_nci_resource_size_t)(-1))
++#define IA_CSS_PROCESS_MAX_CELLS        1
++
++#define IA_CSS_MAX_INPUT_DEC_RESOURCES        4
++#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES        4
++/*
++ * Resource specifications
++ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
++ * these are called internal/external memory.
++ */
++
++/* resource spec for internal (local) memory */
++struct vied_nci_resource_spec_int_mem_s {
++    vied_nci_resource_id_t        type_id;
++    vied_nci_resource_size_t    size;
++    vied_nci_resource_size_t    offset;
++};
++
++typedef struct vied_nci_resource_spec_int_mem_s
++    vied_nci_resource_spec_int_mem_t;
++
++/* resource spec for external (remote) memory */
++struct vied_nci_resource_spec_ext_mem_s {
++    vied_nci_resource_id_t        type_id;
++    vied_nci_resource_size_t    size;
++    vied_nci_resource_size_t    offset;
++};
++
++typedef struct vied_nci_resource_spec_ext_mem_s
++    vied_nci_resource_spec_ext_mem_t;
++
++/* resource spec for device channel */
++struct vied_nci_resource_spec_dev_chn_s {
++    vied_nci_resource_id_t        type_id;
++    vied_nci_resource_size_t    size;
++    vied_nci_resource_size_t    offset;
++};
++
++typedef struct vied_nci_resource_spec_dev_chn_s
++    vied_nci_resource_spec_dev_chn_t;
++
++/* resource spec for DFM port */
++struct vied_nci_resource_spec_dfm_port_s {
++    vied_nci_resource_id_t        type_id;
++    vied_nci_resource_bitmap_t    bitmask;
++};
++
++typedef struct vied_nci_resource_spec_dfm_port_s
++    vied_nci_resource_spec_dfm_port_t;
++
++/* resource spec for all contiguous resources */
++struct vied_nci_resource_spec_s {
++    vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
++    vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
++    vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
++};
++
++typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
++
++#ifndef PIPE_GENERATION
++
++extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
++extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
++extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_type_ID_t */
++    vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_ID_t */
++    vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_ID_t */
++    vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
++extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
++extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
++extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
++extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
++
++STORAGE_CLASS_INLINE
++uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
++{
++    return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
++        (mem_type_id == VIED_NCI_TRANSFER_VMEM1_TYPE_ID) ||
++        (mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
++}
++
++#endif /* PIPE_GENERATION */
++#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
+new file mode 100644
+index 000000000000..5597ab02a4f2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/vied_nci_psys_system_global.h
+@@ -0,0 +1,186 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
++#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
++
++#include <type_support.h>
++#include "ia_css_base_types.h"
++#include "ia_css_psys_sim_storage_class.h"
++#include "vied_nci_psys_resource_model.h"
++
++/*
++ * Key system types
++ */
++/* Subsystem internal physical address */
++#define VIED_ADDRESS_BITS 32
++
++/* typedef uint32_t vied_address_t; */
++
++/* Subsystem internal virtual address */
++
++/* Subsystem internal data bus */
++#define VIED_DATA_BITS 32
++typedef uint32_t vied_data_t;
++
++#define VIED_NULL ((vied_vaddress_t)0)
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bit_mask(
++    const unsigned                    index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_empty(
++    const vied_nci_resource_bitmap_t        bitmap);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_set(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bit_set_in_bitmap(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const unsigned int        index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_clear(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++int vied_nci_bitmap_compute_weight(
++    const vied_nci_resource_bitmap_t        bitmap);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_union(
++    const vied_nci_resource_bitmap_t        bitmap0,
++    const vied_nci_resource_bitmap_t        bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
++    const vied_nci_resource_bitmap_t        bitmap0,
++    const vied_nci_resource_bitmap_t        bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
++    const vied_nci_resource_bitmap_t        bitmap0,
++    const vied_nci_resource_bitmap_t        bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const vied_nci_resource_bitmap_t        bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
++        const unsigned int position,
++        const unsigned int size);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
++const vied_nci_resource_bitmap_t        bitmap,
++const unsigned int                        index,
++const unsigned int                        size);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
++    const vied_nci_resource_bitmap_t        bitmap,
++    const unsigned                    index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
++    const vied_nci_cell_ID_t        cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
++    const vied_nci_barrier_ID_t        barrier_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_cell_type_ID_t vied_nci_cell_get_type(
++    const vied_nci_cell_ID_t        cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
++    const vied_nci_mem_type_ID_t        mem_type);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_mem_get_type(
++    const vied_nci_mem_ID_t            mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_mem_get_size(
++    const vied_nci_mem_ID_t            mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_dev_chn_get_size(
++    const vied_nci_dev_chn_ID_t        dev_chn_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_cell_of_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const vied_nci_cell_type_ID_t    cell_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_mem_of_type(
++    const vied_nci_mem_ID_t            mem_id,
++    const vied_nci_mem_type_ID_t    mem_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_cell_mem_of_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index,
++    const vied_nci_mem_type_ID_t    mem_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_has_cell_mem_of_id(
++    const vied_nci_cell_ID_t        cell_id,
++    const vied_nci_mem_ID_t            mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_cell_get_mem_count(
++    const vied_nci_cell_ID_t        cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_ID_t vied_nci_cell_get_mem(
++    const vied_nci_cell_ID_t        cell_id,
++    const uint16_t                    mem_index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
++    const vied_nci_cell_type_ID_t    cell_type_id,
++    const uint16_t                    mem_index);
++
++#ifdef __IA_CSS_PSYS_SIM_INLINE__
++#include "psys_system_global_impl.h"
++#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
++
++#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
+new file mode 100644
+index 000000000000..35a1dcc78de2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_kernel_bitmap.c
+@@ -0,0 +1,151 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_kernel_bitmap.h>
++#include <type_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include "math_support.h"
++#include "ia_css_psys_kernel_trace.h"
++
++#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
++#include "ia_css_kernel_bitmap_impl.h"
++#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
++
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
++    ia_css_kernel_bitmap_t                bitmap,
++    const unsigned int                elem_index,
++    const uint32_t                    elem_value)
++{
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
++
++    if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
++        bitmap.data[elem_index] = elem_value;
++    } else {
++        assert(0);
++    }
++#else
++    COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
++
++    bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
++                            (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++    bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
++#endif
++
++    return bitmap;
++}
++
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
++    const uint64_t value)
++{
++    const unsigned int bits64 = sizeof(uint64_t) * 8;
++    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++    unsigned int i;
++    ia_css_kernel_bitmap_t result;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    result = ia_css_kernel_bitmap_clear();
++    for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
++        /* masking is done implictly, the MSB bits of casting will bel chopped off */
++        result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
++            (value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++    }
++
++#if IA_CSS_KERNEL_BITMAP_BITS < 64
++    if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
++            "ia_css_kernel_bitmap_create_from_uint64(): "
++            "kernel bitmap is not wide enough to encode value\n");
++        assert(0);
++    }
++#endif
++#else
++    NOT_USED(i);
++    NOT_USED(nof_elems_bits64);
++    result = value;
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++    return result;
++}
++
++uint64_t ia_css_kernel_bitmap_to_uint64(
++    const ia_css_kernel_bitmap_t value)
++{
++    const unsigned int bits64 = sizeof(uint64_t) * 8;
++    const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++    unsigned int i;
++    uint64_t res = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++        "ia_css_kernel_bitmap_to_uint64(): enter:\n");
++
++    assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
++    assert(nof_elems_bits64 > 0);
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++    for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
++        res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++    }
++    for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++        assert(value.data[i] == 0);
++    }
++    return res;
++#else
++    (void)i;
++    (void)res;
++    (void)nof_elems_bits64;
++    return (uint64_t)value;
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++}
++
++int ia_css_kernel_bitmap_print(
++    const ia_css_kernel_bitmap_t            bitmap,
++    void                        *fid)
++{
++    int retval = -1;
++    int bit;
++    unsigned int bit_index = 0;
++    ia_css_kernel_bitmap_t loc_bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
++        "ia_css_kernel_bitmap_print(): enter:\n");
++
++    NOT_USED(fid);
++    NOT_USED(bit);
++
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
++
++    loc_bitmap = bitmap;
++
++    for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
++        !ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
++
++        bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
++        loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
++        IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
++    }
++    IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
++
++    retval = 0;
++    return retval;
++}
++
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
+new file mode 100644
+index 000000000000..62369e7d8308
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_data.c
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_data_storage_class.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifdef __IA_CSS_PSYS_DATA_INLINE__
++STORAGE_CLASS_INLINE int
++__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __IA_CSS_PSYS_DATA_INLINE__ */
++#include "ia_css_program_group_data_impl.h"
++#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
+new file mode 100644
+index 000000000000..e4ab5b901a4a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_program_group_param.c
+@@ -0,0 +1,769 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_program_group_param.h>
++#include <ia_css_program_group_param_private.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psysapi_fw_version.h>
++#include <error_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include <type_support.h>
++#include <print_support.h>
++
++#include "ia_css_psys_param_trace.h"
++
++static int
++ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
++               uint32_t offset,
++               enum ia_css_frame_format_type frame_format_type);
++
++static int
++ia_css_program_param_init(ia_css_program_param_t *program_param,
++                int32_t offset);
++
++size_t ia_css_sizeof_program_group_param(
++    const uint8_t program_count,
++    const uint8_t terminal_count,
++    const uint16_t fragment_count)
++{
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_sizeof_program_group_param(): enter:\n");
++
++    verifexit(program_count != 0);
++    verifexit(terminal_count != 0);
++    verifexit(fragment_count != 0);
++
++    size += sizeof(ia_css_program_group_param_t);
++    size += program_count * fragment_count * sizeof(ia_css_program_param_t);
++    size += terminal_count * sizeof(ia_css_terminal_param_t);
++EXIT:
++    if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_sizeof_program_group_param invalid argument\n");
++    }
++    return size;
++}
++
++size_t ia_css_program_group_param_get_size(
++    const ia_css_program_group_param_t        *program_group_param)
++{
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++               "ia_css_program_group_param_get_size(): enter:\n");
++
++    if (program_group_param != NULL) {
++        size = program_group_param->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++              "ia_css_program_group_param_get_size invalid argument\n");
++    }
++    return size;
++}
++
++size_t ia_css_program_param_get_size(
++    const ia_css_program_param_t            *param)
++{
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++               "ia_css_program_param_get_size(): enter:\n");
++
++    if (param != NULL) {
++        size = param->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_param_get_size invalid argument\n");
++    }
++    return size;
++}
++
++ia_css_program_param_t *ia_css_program_group_param_get_program_param(
++    const ia_css_program_group_param_t *param,
++    const int i)
++{
++    ia_css_program_param_t    *program_param = NULL;
++    ia_css_program_param_t    *program_param_base;
++    int program_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_program_group_param_get_program_param(): enter:\n");
++
++    verifexit(param != NULL);
++
++    program_count =
++        (int)ia_css_program_group_param_get_program_count(param);
++
++    verifexit(i < program_count);
++
++    program_param_base = (ia_css_program_param_t *)
++            (((char *)param) + param->program_param_offset);
++
++    program_param = &program_param_base[i];
++
++EXIT:
++    if (NULL == param || i >= program_count) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_program_param invalid argument\n");
++    }
++    return program_param;
++}
++
++size_t ia_css_terminal_param_get_size(
++    const ia_css_terminal_param_t            *param)
++{
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_get_size(): enter:\n");
++
++    if (param != NULL) {
++        size = param->size;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_terminal_param_get_size invalid argument\n");
++    }
++
++    return size;
++}
++
++ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
++    const ia_css_program_group_param_t        *param,
++    const int        i)
++{
++    ia_css_terminal_param_t    *terminal_param = NULL;
++    ia_css_terminal_param_t    *terminal_param_base;
++    int program_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_program_group_param_get_terminal_param(): enter:\n");
++
++    verifexit(param != NULL);
++
++    program_count =
++        (int)ia_css_program_group_param_get_terminal_count(param);
++
++    verifexit(i < program_count);
++
++    terminal_param_base = (ia_css_terminal_param_t *)
++            (((char *)param) + param->terminal_param_offset);
++    terminal_param = &terminal_param_base[i];
++EXIT:
++    if (NULL == param || i >= program_count) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_terminal_param invalid argument\n");
++    }
++    return terminal_param;
++}
++
++uint8_t ia_css_program_group_param_get_program_count(
++    const ia_css_program_group_param_t        *param)
++{
++    uint8_t    program_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_program_group_param_get_program_count(): enter:\n");
++
++    if (param != NULL) {
++        program_count = param->program_count;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_program_count invalid argument\n");
++    }
++    return program_count;
++}
++
++uint8_t ia_css_program_group_param_get_terminal_count(
++    const ia_css_program_group_param_t        *param)
++{
++    uint8_t    terminal_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_program_group_param_get_terminal_count(): enter:\n");
++
++    if (param != NULL) {
++        terminal_count = param->terminal_count;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_terminal_count invalid argument\n");
++    }
++    return terminal_count;
++}
++
++uint16_t ia_css_program_group_param_get_fragment_count(
++    const ia_css_program_group_param_t        *param)
++{
++    uint8_t    fragment_count = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_program_group_param_get_fragment_count(): enter:\n");
++
++    if (param != NULL) {
++        fragment_count = (uint8_t)param->fragment_count;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_fragment_count invalid argument\n");
++    }
++    return fragment_count;
++}
++
++int ia_css_program_group_param_set_protocol_version(
++    ia_css_program_group_param_t *param,
++    uint8_t protocol_version)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++         "ia_css_program_group_param_set_protocol_version(): enter:\n");
++
++    if (param != NULL) {
++        param->protocol_version = protocol_version;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_program_group_param_set_protocol_version failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++uint8_t ia_css_program_group_param_get_protocol_version(
++    const ia_css_program_group_param_t *param)
++{
++    uint8_t protocol_version = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++         "ia_css_program_group_param_get_protocol_version(): enter:\n");
++
++    if (param != NULL) {
++        protocol_version = param->protocol_version;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_protocol_version invalid argument\n");
++    }
++    return protocol_version;
++}
++
++int ia_css_program_group_param_set_kernel_enable_bitmap(
++    ia_css_program_group_param_t    *param,
++    const ia_css_kernel_bitmap_t    bitmap)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++         "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
++
++    if (param != NULL) {
++        param->kernel_enable_bitmap = bitmap;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
++    const ia_css_program_group_param_t        *param)
++{
++    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++         "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
++
++    if (param != NULL) {
++        bitmap = param->kernel_enable_bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++int ia_css_program_param_set_kernel_enable_bitmap(
++    ia_css_program_param_t        *program_param,
++    const ia_css_kernel_bitmap_t    bitmap)
++{
++    assert(0);
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++        "ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
++
++    if (program_param != NULL) {
++        program_param->kernel_enable_bitmap = bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++            "ia_css_program_param_set_kernel_enable_bitmap failed\n");
++    }
++    return -1;
++}
++
++ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
++    const ia_css_program_param_t    *program_param)
++{
++    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
++    char *base;
++
++    assert(0);
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++        "ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
++
++    verifexit(program_param != NULL);
++    verifexit(program_param->parent_offset != 0);
++
++    base = (char *)((char *)program_param + program_param->parent_offset);
++    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
++EXIT:
++    if (NULL == program_param || 0 == program_param->parent_offset)    {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
++    const ia_css_terminal_param_t            *param)
++{
++    ia_css_kernel_bitmap_t    bitmap = ia_css_kernel_bitmap_clear();
++    char *base;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
++
++    verifexit(param != NULL);
++    verifexit(param->parent_offset != 0);
++
++    base = (char *)((char *)param + param->parent_offset);
++    bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
++EXIT:
++    if (NULL == param || 0 == param->parent_offset) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
++    const ia_css_terminal_param_t    *param)
++{
++    ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_get_frame_format_type(): enter:\n");
++
++    verifexit(param != NULL);
++
++    ft = param->frame_format_type;
++EXIT:
++    if (NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_terminal_param_get_frame_format_type invalid argument\n");
++    }
++    return ft;
++}
++
++int ia_css_terminal_param_set_frame_format_type(
++    ia_css_terminal_param_t        *param,
++    const ia_css_frame_format_type_t    data_format_type)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_set_frame_format_type(): enter:\n");
++
++    if (param != NULL) {
++        param->frame_format_type = data_format_type;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_terminal_param_set_frame_format_type failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++uint8_t ia_css_terminal_param_get_bpp(
++    const ia_css_terminal_param_t    *param)
++{
++    uint8_t bpp = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++               "ia_css_terminal_param_get_bpp(): enter:\n");
++
++    verifexit(param != NULL);
++
++    bpp = param->bpp;
++
++EXIT:
++    if (NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_terminal_param_get_bpp invalid argument\n");
++    }
++    return bpp;
++}
++
++int ia_css_terminal_param_set_bpp(
++    ia_css_terminal_param_t    *param,
++    const uint8_t bpp)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++               "ia_css_terminal_param_set_bpp(): enter:\n");
++
++    if (param != NULL) {
++        param->bpp = bpp;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_terminal_param_set_bpp failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_terminal_param_get_dimensions(
++    const ia_css_terminal_param_t    *param,
++    uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_get_dimensions(): enter:\n");
++
++    if (param != NULL) {
++        dimensions[IA_CSS_COL_DIMENSION] =
++            param->dimensions[IA_CSS_COL_DIMENSION];
++        dimensions[IA_CSS_ROW_DIMENSION] =
++            param->dimensions[IA_CSS_ROW_DIMENSION];
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++          "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_terminal_param_set_dimensions(
++    ia_css_terminal_param_t    *param,
++    const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++        "ia_css_terminal_param_set_dimensions(): enter:\n");
++
++    if (param != NULL) {
++        param->dimensions[IA_CSS_COL_DIMENSION] =
++                dimensions[IA_CSS_COL_DIMENSION];
++        param->dimensions[IA_CSS_ROW_DIMENSION] =
++                dimensions[IA_CSS_ROW_DIMENSION];
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++          "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_terminal_param_set_stride(
++    ia_css_terminal_param_t        *param,
++    const uint32_t stride)
++{
++    int retval = -1;
++
++    verifexit(param != NULL);
++    param->stride = stride;
++    retval = 0;
++
++EXIT:
++    return retval;
++}
++
++uint32_t ia_css_terminal_param_get_stride(
++    const ia_css_terminal_param_t    *param)
++{
++    uint32_t stride = 0;
++
++    verifexit(param != NULL);
++    stride = param->stride;
++
++EXIT:
++    return stride;
++}
++
++static int ia_css_program_param_init(
++        ia_css_program_param_t *program_param,
++        int32_t offset)
++{
++    int retval = -1;
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
++                (CHAR_BIT * sizeof(ia_css_program_param_t)));
++    verifexit(program_param != NULL);
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++        "ia_css_program_param_init(): enter:\n");
++
++    program_param->size = sizeof(ia_css_program_param_t);
++    /* parent is at negative offset from current program.*/
++    program_param->parent_offset = -offset;
++    /*TODO: Kernel_bitmap setting. ?*/
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_program_param_init failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++static int
++ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
++            uint32_t offset,
++            enum ia_css_frame_format_type frame_format_type)
++{
++    int retval = -1;
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_terminal_param_t)));
++    verifexit(terminal_param != NULL);
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++        "ia_css_terminal_param_init(): enter:\n");
++
++    terminal_param->size = sizeof(ia_css_terminal_param_t);
++    /* parent is at negative offset from current program.*/
++    terminal_param->parent_offset = -((int32_t)offset);
++    /*TODO: Kernel_bitmap setting. ?*/
++    terminal_param->frame_format_type = frame_format_type;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_terminal_param_init failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++ia_css_program_group_param_t *
++ia_css_terminal_param_get_parent(
++    const ia_css_terminal_param_t            *param)
++{
++    ia_css_program_group_param_t *parent = NULL;
++    char *base;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++               "ia_css_terminal_param_get_parent(): enter:\n");
++
++    verifexit(NULL != param);
++
++    base = (char *)((char *)param + param->parent_offset);
++
++    parent = (ia_css_program_group_param_t *)(base);
++EXIT:
++    if (NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++            "ia_css_terminal_param_get_parent invalid argument\n");
++    }
++    return parent;
++}
++
++int ia_css_program_group_param_init(
++    ia_css_program_group_param_t *blob,
++    const uint8_t    program_count,
++    const uint8_t    terminal_count,
++    const uint16_t    fragment_count,
++    const enum ia_css_frame_format_type *frame_format_types)
++{
++    int i = 0;
++    char *param_base;
++    uint32_t offset;
++    int  retval = -1;
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_program_group_param_t)));
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++        "ia_css_program_group_param_init(): enter:\n");
++
++    assert(blob != 0);
++
++    verifexit(blob != NULL);
++    verifexit(frame_format_types != NULL);
++
++    blob->program_count = program_count;
++    blob->fragment_count = fragment_count;
++    blob->terminal_count = terminal_count;
++    blob->program_param_offset = sizeof(ia_css_program_group_param_t);
++    blob->terminal_param_offset = blob->program_param_offset +
++                sizeof(ia_css_program_param_t) * program_count;
++
++    param_base = (char *)((char *)blob + blob->program_param_offset);
++    offset = blob->program_param_offset;
++
++    for (i = 0; i < program_count; i++) {
++        ia_css_program_param_init(
++            (ia_css_program_param_t *)param_base, offset);
++        offset += sizeof(ia_css_program_param_t);
++        param_base += sizeof(ia_css_program_param_t);
++    }
++
++    param_base = (char *)((char *)blob + blob->terminal_param_offset);
++    offset = blob->terminal_param_offset;
++
++    for (i = 0; i < terminal_count; i++) {
++        ia_css_terminal_param_init(
++            (ia_css_terminal_param_t *)param_base,
++            offset,
++            frame_format_types[i]);
++
++        offset += sizeof(ia_css_terminal_param_t);
++        param_base += sizeof(ia_css_terminal_param_t);
++    }
++
++    /*
++     * For now, set legacy flow by default. This can be removed as soon
++     * as all hosts/drivers explicitly set the protocol version.
++     */
++    blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
++
++    blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
++                                terminal_count,
++                                fragment_count);
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++               "ia_css_program_group_param_init failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_program_group_param_print(
++    const ia_css_program_group_param_t        *param,
++    void                        *fid)
++{
++    int    retval = -1;
++    int        i;
++    uint8_t    program_count, terminal_count;
++    ia_css_kernel_bitmap_t    bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++               "ia_css_program_group_param_print(): enter:\n");
++
++    verifexit(param != NULL);
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++        "sizeof(program_group_param) = %d\n",
++        (int)ia_css_program_group_param_get_size(param));
++
++    program_count = ia_css_program_group_param_get_program_count(param);
++    terminal_count = ia_css_program_group_param_get_terminal_count(param);
++
++    bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
++    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++        "%d program params\n", (int)program_count);
++    for (i = 0; i < (int)program_count; i++) {
++        ia_css_program_param_t *program_param =
++            ia_css_program_group_param_get_program_param(param, i);
++
++        retval = ia_css_program_param_print(program_param, fid);
++        verifjmpexit(retval == 0);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
++               (int)terminal_count);
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_param_t    *terminal_param =
++            ia_css_program_group_param_get_terminal_param(param, i);
++
++        retval = ia_css_terminal_param_print(terminal_param, fid);
++        verifjmpexit(retval == 0);
++    }
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++              "ia_css_program_group_param_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_terminal_param_print(
++    const ia_css_terminal_param_t            *param,
++    void                        *fid)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++        "ia_css_terminal_param_print(): enter:\n");
++
++    verifexit(param != NULL);
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++        "sizeof(terminal_param) = %d\n",
++        (int)ia_css_terminal_param_get_size(param));
++
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++        "\tframe_format_type = %d\n", param->frame_format_type);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_terminal_param_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_program_param_print(
++    const ia_css_program_param_t            *param,
++    void                        *fid)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++        "ia_css_program_param_print(): enter:\n");
++
++    verifexit(param != NULL);
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
++               (int)ia_css_program_param_get_size(param));
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++            "ia_css_program_param_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
+new file mode 100644
+index 000000000000..a05e1075a48f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process.c
+@@ -0,0 +1,1038 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_process_private_types.h"
++#include "ia_css_program_group_param_private.h"
++#include "math_support.h"
++
++/* *****************************************************
++ * Functions to possibly inline
++ * ******************************************************/
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/* *****************************************************
++ * Functions not to inline and not available to firmware
++ * ******************************************************/
++#if !defined(__HIVECC)
++STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
++    const ia_css_program_manifest_t            *manifest)
++{
++    int i;
++    bool requires_extension = false;
++
++    verifexit(manifest != NULL);
++
++    for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
++    }
++
++#if HAS_DFM
++    for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
++    }
++    for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
++        requires_extension |=
++            (ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
++    }
++#endif /* HAS_DFM */
++EXIT:
++    return requires_extension;
++}
++
++size_t ia_css_sizeof_process(
++    const ia_css_program_manifest_t            *manifest,
++    const ia_css_program_param_t            *param)
++{
++    size_t    size = 0;
++
++    uint8_t    program_dependency_count;
++    uint8_t terminal_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_sizeof_process(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    size += sizeof(ia_css_process_t);
++
++    if (ia_css_program_manifest_process_requires_extension(manifest)) {
++        /* align start of extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        size += sizeof(ia_css_process_ext_t);
++    }
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++
++    size += program_dependency_count*sizeof(vied_nci_resource_id_t);
++    size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
++
++    /* align whole structure to 32 bit */
++    size = CEIL_MUL(size, sizeof(uint32_t));
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_sizeof_process invalid argument\n");
++    }
++    return size;
++}
++
++ia_css_process_t *ia_css_process_create(
++    void                    *raw_mem,
++    const ia_css_program_manifest_t        *manifest,
++    const ia_css_program_param_t        *param,
++    const uint32_t                program_idx)
++{
++    int retval = -1, size = 0;
++    ia_css_process_t *process = NULL;
++    bool create_extension;
++
++    uint8_t    program_dependency_count;
++    uint8_t    terminal_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_create(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++    verifexit(raw_mem != NULL);
++
++    process = (ia_css_process_t *)raw_mem;;
++    verifexit(process != NULL);
++    create_extension = ia_css_program_manifest_process_requires_extension(manifest);
++
++    process->state = IA_CSS_PROCESS_CREATED;
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++
++    /* A process requires at least one input or output */
++    verifexit((program_dependency_count +
++           terminal_dependency_count) != 0);
++
++    size += sizeof(ia_css_process_t);
++
++    if (create_extension == true) {
++        /* align start of extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        process->process_extension_offset = (uint8_t)size;
++        size += sizeof(ia_css_process_ext_t);
++    } else {
++        process->process_extension_offset = 0;
++    }
++    if (program_dependency_count != 0) {
++        process->cell_dependencies_offset = (uint8_t)size;
++        size += program_dependency_count * sizeof(vied_nci_resource_id_t);
++    } else {
++        process->cell_dependencies_offset = 0;
++    }
++    if (terminal_dependency_count != 0) {
++        process->terminal_dependencies_offset = (uint8_t)size;;
++        size += terminal_dependency_count * sizeof(uint8_t);
++    } else {
++        process->terminal_dependencies_offset = 0;
++    }
++
++    /* align whole structure to 32 bit */
++    size = CEIL_MUL(size, sizeof(uint32_t));
++
++    process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
++    assert((size_t)size == process->size);
++    /* The following assert also implies that:
++     * process->terminal_dependencies_offset,
++     * process->cell_dependencies_offset,
++     * process->process_extension_offset,
++     * are <= UINT8_MAX
++     */
++    assert(size <= UINT8_MAX);
++
++    process->ID = ia_css_program_manifest_get_program_ID(manifest);
++    verifexit(process->ID != 0);
++    assert(program_idx <= UINT8_MAX);
++    process->program_idx = program_idx;
++
++    process->cell_dependency_count = program_dependency_count;
++    process->terminal_dependency_count = terminal_dependency_count;
++
++    process->parent_offset = 0;
++    verifexit(ia_css_process_clear_all(process) == 0);
++
++    process->state = IA_CSS_PROCESS_READY;
++    retval = 0;
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
++        (unsigned long int)process, process->ID);
++
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_create invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_create failed (%i)\n", retval);
++        process = ia_css_process_destroy(process);
++    }
++    return process;
++}
++
++ia_css_process_t *ia_css_process_destroy(
++    ia_css_process_t *process)
++{
++
++    return process;
++}
++
++int ia_css_process_set_cell(
++    ia_css_process_t                    *process,
++    const vied_nci_cell_ID_t                cell_id)
++{
++    int    retval = -1;
++    vied_nci_resource_bitmap_t        bit_mask;
++    vied_nci_resource_bitmap_t        resource_bitmap;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_cell(): enter:\n");
++
++    verifexit(process != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++/* Some programs are mapped on a fixed cell,
++ * when the process group is created
++ */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
++        /* If the process group has already been created, but no VP cell
++         * has been assigned to this process (i.e. not fixed in
++         * manifest), then we need to set the cell of this process
++         * while its parent state is READY (the ready state is set at
++         * the end of ia_css_process_group_create)
++         */
++        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++/* Some programs are mapped on a fixed cell, thus check is not secure,
++ * but it will detect a preset, the process manager will do the secure check
++ */
++    verifexit(ia_css_process_get_cell(process) ==
++          VIED_NCI_N_CELL_ID);
++
++    bit_mask = vied_nci_cell_bit_mask(cell_id);
++    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
++
++    verifexit(bit_mask != 0);
++    verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
++
++    ia_css_process_cells_clear(process);
++    ia_css_process_cells_set_cell(process, 0, cell_id);
++
++    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
++
++    retval = ia_css_process_group_set_resource_bitmap(
++            parent, resource_bitmap);
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_cell invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_cell failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_clear_cell(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++    vied_nci_cell_ID_t                cell_id;
++    ia_css_process_group_t            *parent;
++    vied_nci_resource_bitmap_t        resource_bitmap;
++    vied_nci_resource_bitmap_t        bit_mask;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_cell(): enter:\n");
++    verifexit(process != NULL);
++
++    cell_id = ia_css_process_get_cell(process);
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
++           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    bit_mask = vied_nci_cell_bit_mask(cell_id);
++    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
++
++    verifexit(bit_mask != 0);
++    verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
++
++    ia_css_process_cells_clear(process);
++
++    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
++
++    retval = ia_css_process_group_set_resource_bitmap(
++            parent, resource_bitmap);
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_cell invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_cell failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_int_mem(
++    ia_css_process_t                *process,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            offset)
++{
++    (void)process;
++    (void)mem_type_id;
++    (void)offset;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++        "ia_css_process_set_int_mem should not be called"
++        "(internally memory feature not used).\n");
++    return 0;
++}
++
++int ia_css_process_clear_int_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type_id)
++{
++    (void)process;
++    (void)mem_type_id;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++        "ia_css_process_clear_int_mem should not be called"
++        "(internally memory feature not used).\n");
++    return 0;
++}
++
++int ia_css_process_set_ext_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_ID_t mem_id,
++    const vied_nci_resource_size_t offset)
++{
++    int    retval = -1;
++    ia_css_process_group_t    *parent;
++    vied_nci_cell_ID_t    cell_id;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t    state;
++    vied_nci_mem_type_ID_t mem_type_id;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_ext_mem(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    cell_id = ia_css_process_get_cell(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    /* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
++    * will return false on error
++    */
++
++    mem_type_id = vied_nci_mem_get_type(mem_id);
++#ifdef HAS_PMEM
++    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
++        (mem_type_id != VIED_NCI_PMEM_TYPE_ID))
++        || vied_nci_mem_is_ext_type(mem_type_id)) &&
++        (mem_id < VIED_NCI_N_MEM_ID)) {
++
++        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++        process_ext->ext_mem_id[mem_type_id] = mem_id;
++        process_ext->ext_mem_offset[mem_type_id] = offset;
++        retval = 0;
++    }
++#else /* not HAS_PMEM */
++    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
++            || vied_nci_mem_is_ext_type(mem_type_id)) &&
++            (mem_id < VIED_NCI_N_MEM_ID)) {
++
++        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++        process_ext->ext_mem_id[mem_type_id] = mem_id;
++        process_ext->ext_mem_offset[mem_type_id] = offset;
++        retval = 0;
++    }
++#endif /* HAS_PMEM */
++
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_ext_mem invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_ext_mem failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_clear_ext_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type_id)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_ext_mem(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++
++    process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
++    process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
++
++    retval = 0;
++EXIT:
++    if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_ext_mem invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_ext_mem failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_cells_bitmap(
++    ia_css_process_t *process,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    int array_index = 0;
++    int bit_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_cells_bitmap(): enter:\n");
++
++    verifexit(process != NULL);
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
++        if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
++            verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
++            ia_css_process_cells_set_cell(process,
++                array_index, (vied_nci_cell_ID_t)bit_index);
++            array_index++;
++        }
++    }
++    for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
++        ia_css_process_cells_set_cell(process,
++            array_index, VIED_NCI_N_CELL_ID);
++    }
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_cells_bitmap invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_cells_bitmap failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++int ia_css_process_set_dev_chn(
++    ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id,
++    const vied_nci_resource_size_t offset)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dev_chn(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
++    process_ext = ia_css_process_get_extension(process);
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    process_ext->dev_chn_offset[dev_chn_id] = offset;
++
++    retval = 0;
++EXIT:
++    if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_dev_chn invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                    "ia_css_process_set_dev_chn invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_process_clear_dev_chn(
++    ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_dev_chn(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
++           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
++
++    process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++             "ia_css_process_clear_dev_chn invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_dev_chn failed (%i)\n", retval);
++    }
++    return retval;
++}
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++
++#if HAS_DFM
++int ia_css_process_set_dfm_port_bitmap(
++    ia_css_process_t                 *process,
++    const vied_nci_dev_dfm_id_t      dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dfm_port(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
++    process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_dfm_port invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_process_set_dfm_active_port_bitmap(
++    ia_css_process_t                 *process,
++    const vied_nci_dev_dfm_id_t      dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
++    process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
++    }
++    return retval;
++}
++#endif /* HAS_DFM */
++
++int ia_css_process_clear_all(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++    int    mem_index;
++    int    dev_chn_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_all(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++
++    state = ia_css_process_get_state(process);
++
++    parent = ia_css_process_get_parent(process);
++    if (parent != NULL) {
++        parent_state = ia_css_process_group_get_state(parent);
++    } else {
++        parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
++    }
++
++/* Resource clear can only be called in excluded states contrary to set */
++    verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
++           (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
++    verifexit((state == IA_CSS_PROCESS_CREATED) ||
++          (state == IA_CSS_PROCESS_READY));
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++    if (process_ext != NULL) {
++        for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
++            dev_chn_index++) {
++            process_ext->dev_chn_offset[dev_chn_index] =
++                IA_CSS_PROCESS_INVALID_OFFSET;
++        }
++    }
++#else
++    NOT_USED(dev_chn_index);
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++    if (process_ext != NULL) {
++        /* No difference whether a cell_id has been set or not, clear all */
++        for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
++            mem_index++) {
++            process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
++            process_ext->ext_mem_offset[mem_index] =
++                IA_CSS_PROCESS_INVALID_OFFSET;
++        }
++    }
++
++    ia_css_process_cells_clear(process);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_all invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_all failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_acquire(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_acquire(): enter:\n");
++
++    verifexit(process != NULL);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_acquire invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_acquire failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_release(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_release(): enter:\n");
++
++    verifexit(process != NULL);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_t invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_release failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_print(const ia_css_process_t *process, void *fid)
++{
++    int        retval = -1;
++    int        i, dev_chn_index;
++    uint16_t mem_index;
++    uint8_t    cell_dependency_count, terminal_dependency_count;
++    ia_css_process_ext_t *process_ext;
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++
++    IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
++    "\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
++        (unsigned long int)process,
++        (int)ia_css_process_get_size(process),
++        (int)ia_css_process_get_program_idx(process),
++        (int)ia_css_process_get_program_ID(process),
++        (int)ia_css_process_get_state(process),
++        (unsigned long int)ia_css_process_get_parent(process),
++        (int)ia_css_process_get_cell(process));
++
++    if (process_ext != NULL) {
++        for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
++            mem_index++) {
++            /* TODO: in case of an cells_bitmap = [],
++            * vied_nci_cell_get_mem_type will return a wrong result.
++            */
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\texternal index %d, type %d, id %d offset 0x%x\n",
++                mem_index,
++                (int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
++                                mem_index),
++                (int)(process_ext->ext_mem_id[mem_index]),
++                process_ext->ext_mem_offset[mem_index]);
++        }
++#if VIED_NCI_N_DEV_CHN_ID > 0
++        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
++            dev_chn_index++) {
++            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++                "\tdevice channel index %d, type %d, offset 0x%x\n",
++                dev_chn_index,
++                (int)dev_chn_index,
++                process_ext->dev_chn_offset[dev_chn_index]);
++        }
++#else
++        NOT_USED(dev_chn_index);
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++#if HAS_DFM
++        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
++            dev_chn_index++) {
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
++                dev_chn_index, dev_chn_index,
++                process_ext->dfm_port_bitmap[dev_chn_index],
++                process_ext->dfm_active_port_bitmap[dev_chn_index]);
++        }
++#endif
++    }
++
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++            "\tcells[%d] = 0x%x\n",
++            i, ia_css_process_cells_get_cell(process, i));
++    }
++
++    cell_dependency_count =
++        ia_css_process_get_cell_dependency_count(process);
++    if (cell_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tcell_dependencies[%d] {};\n", cell_dependency_count);
++    } else {
++        vied_nci_resource_id_t cell_dependency;
++
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tcell_dependencies[%d] {", cell_dependency_count);
++        for (i = 0; i < (int)cell_dependency_count - 1; i++) {
++            cell_dependency =
++                ia_css_process_get_cell_dependency(process, i);
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                "%4d, ", cell_dependency);
++        }
++        cell_dependency =
++            ia_css_process_get_cell_dependency(process, i);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "%4d}\n", cell_dependency);
++        (void)cell_dependency;
++    }
++
++    terminal_dependency_count =
++        ia_css_process_get_terminal_dependency_count(process);
++    if (terminal_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tterminal_dependencies[%d] {};\n",
++            terminal_dependency_count);
++    } else {
++        uint8_t terminal_dependency;
++
++        terminal_dependency_count =
++            ia_css_process_get_terminal_dependency_count(process);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tterminal_dependencies[%d] {",
++            terminal_dependency_count);
++        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
++            terminal_dependency =
++                 ia_css_process_get_terminal_dependency(process, i);
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                "%4d, ", terminal_dependency);
++        }
++        terminal_dependency =
++            ia_css_process_get_terminal_dependency(process, i);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "%4d}\n", terminal_dependency);
++        (void)terminal_dependency;
++    }
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_print invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_parent(
++    ia_css_process_t                    *process,
++    ia_css_process_group_t                    *parent)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_parent(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(parent != NULL);
++
++    process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
++    retval = 0;
++EXIT:
++    if (NULL == process || NULL == parent) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_parent invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_parent failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_cell_dependency(
++    const ia_css_process_t                    *process,
++    const unsigned int                    dep_index,
++    const vied_nci_resource_id_t                id)
++{
++    int retval = -1;
++    uint8_t *process_dep_ptr;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_cell_dependency(): enter:\n");
++    verifexit(process != NULL);
++
++    process_dep_ptr =
++        (uint8_t *)process + process->cell_dependencies_offset +
++               dep_index*sizeof(vied_nci_resource_id_t);
++
++    *process_dep_ptr = id;
++    retval = 0;
++EXIT:
++    return retval;
++}
++
++int ia_css_process_set_terminal_dependency(
++    const ia_css_process_t                *process,
++    const unsigned int                dep_index,
++    const vied_nci_resource_id_t        id)
++{
++    int retval = -1;
++    uint8_t *terminal_dep_ptr;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_terminal_dependency(): enter:\n");
++    verifexit(process != NULL);
++    verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
++
++    terminal_dep_ptr =
++        (uint8_t *)process + process->terminal_dependencies_offset +
++               dep_index*sizeof(uint8_t);
++
++    *terminal_dep_ptr = id;
++    retval = 0;
++EXIT:
++    return retval;
++}
++
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
+new file mode 100644
+index 000000000000..5b3c65023bb7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group.c
+@@ -0,0 +1,826 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process_group.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_program_group_param_private.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_group_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/* This header is need for cpu memset to 0
++* and process groups are not created in SP
++*/
++#if !defined(__VIED_CELL)
++#include "cpu_mem_support.h"
++#endif
++
++/* This source file is created with the intention of sharing and
++* compiled for host and firmware. Since there is no native 64bit
++* data type support for firmware this wouldn't compile for SP
++* tile. The part of the file that is not compilable are marked
++* with the following __VIED_CELL marker and this comment. Once we
++* come up with a solution to address this issue this will be
++* removed.
++*/
++#if !defined(__VIED_CELL)
++
++/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
++bool ia_css_process_group_is_program_enabled(
++    const ia_css_program_manifest_t *program_manifest,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    ia_css_kernel_bitmap_t program_bitmap =
++        ia_css_program_manifest_get_kernel_bitmap(program_manifest);
++    ia_css_program_type_t program_type =
++        ia_css_program_manifest_get_type(program_manifest);
++    ia_css_kernel_bitmap_t program_enable_bitmap;
++
++    if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
++                program_bitmap)) {
++
++        if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
++            program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
++            program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++            /*
++             * EXCLUSIVE_SUB programs are subsets of
++             * EXCLUSIVE_SUPER so the bits of the enable_bitmap
++             * that refer to those are those of their
++             * EXCLUSIVE_SUPER program (on which the depend) and
++             * not the subset that their own program_bitmap has
++             */
++            if (program_type ==
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
++                    program_type ==
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++                ia_css_kernel_bitmap_t super_program_bitmap;
++
++                const ia_css_program_group_manifest_t *
++                    prog_group_manifest =
++            ia_css_program_manifest_get_parent(program_manifest);
++                uint8_t super_prog_idx =
++                ia_css_program_manifest_get_program_dependency(
++                        program_manifest, 0);
++                const ia_css_program_manifest_t    *
++                    super_program_manifest =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                    prog_group_manifest, super_prog_idx);
++
++                verifexit(super_program_manifest != NULL);
++                if (((program_type ==
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++                    (ia_css_program_manifest_get_type(
++                    super_program_manifest) !=
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
++                    || ((program_type ==
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
++                    (ia_css_program_manifest_get_type(
++                    super_program_manifest) !=
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
++                    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                        "ia_css_process_group_is_program_enabled(): Error\n");
++                    verifexit(0);
++                }
++
++                super_program_bitmap =
++                ia_css_program_manifest_get_kernel_bitmap(
++                        super_program_manifest);
++                program_enable_bitmap =
++                    ia_css_kernel_bitmap_intersection(
++                        enable_bitmap,
++                        super_program_bitmap);
++            } else {
++                program_enable_bitmap =
++                    ia_css_kernel_bitmap_intersection(
++                        enable_bitmap, program_bitmap);
++            }
++
++            if (ia_css_is_kernel_bitmap_equal(
++                program_enable_bitmap, program_bitmap)) {
++                return true;
++            }
++        } else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
++            /*
++             * Virtual super programs are not selectable
++             * only the virtual sub programs
++             */
++            return false;
++        } else {
++            return true;
++        }
++    }
++
++EXIT:
++    return false;
++}
++
++size_t ia_css_sizeof_process_group(
++    const ia_css_program_group_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    size_t size = 0, tmp_size;
++    int i, error_val = -1;
++    uint8_t    process_count, process_num;
++    uint8_t terminal_count;
++    ia_css_kernel_bitmap_t enable_bitmap;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_sizeof_process_group(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
++            (CHAR_BIT * sizeof(ia_css_process_group_t)));
++
++    COMPILATION_ERROR_IF(0 !=
++            sizeof(ia_css_process_group_t) % sizeof(uint64_t));
++
++    process_count =
++        ia_css_process_group_compute_process_count(manifest, param);
++    terminal_count =
++        ia_css_process_group_compute_terminal_count(manifest, param);
++
++    verifexit(process_count != 0);
++    verifexit(terminal_count != 0);
++
++    size += sizeof(ia_css_process_group_t);
++
++    tmp_size = process_count * sizeof(uint16_t);
++    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
++
++    tmp_size = terminal_count * sizeof(uint16_t);
++    size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
++
++    enable_bitmap =
++        ia_css_program_group_param_get_kernel_enable_bitmap(param);
++    process_num = 0;
++    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
++                manifest); i++) {
++        ia_css_program_manifest_t *program_manifest =
++        ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
++        ia_css_program_param_t *program_param =
++            ia_css_program_group_param_get_program_param(param, i);
++
++        if (ia_css_process_group_is_program_enabled(
++                    program_manifest, enable_bitmap)) {
++            verifexit(process_num < process_count);
++            size += ia_css_sizeof_process(
++                    program_manifest, program_param);
++            process_num++;
++        }
++    }
++
++    verifexit(process_num == process_count);
++
++    for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
++                manifest); i++) {
++        ia_css_terminal_manifest_t *terminal_manifest =
++            ia_css_program_group_manifest_get_term_mnfst(
++                    manifest, i);
++
++        if (ia_css_process_group_is_terminal_enabled(
++                    terminal_manifest, enable_bitmap)) {
++            size += ia_css_sizeof_terminal(
++                    terminal_manifest, param);
++        }
++    }
++
++    error_val = 0;
++
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_sizeof_process_group invalid argument\n");
++    }
++    if (error_val != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_sizeof_process_group ERROR(%d)\n", error_val);
++    }
++    return error_val ? 0 : size;
++}
++
++ia_css_process_group_t *ia_css_process_group_create(
++    void *process_grp_mem,
++    const ia_css_program_group_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    size_t size = ia_css_sizeof_process_group(manifest, param);
++    int retval = -1;
++    int ret;
++    int i;
++    ia_css_process_group_t *process_group = NULL;
++    uint8_t process_count, process_num;
++    uint8_t    terminal_count, terminal_num;
++    uint16_t fragment_count;
++    char *process_grp_raw_ptr;
++    uint16_t *process_tab_ptr, *terminal_tab_ptr;
++    ia_css_kernel_bitmap_t enable_bitmap;
++    uint8_t manifest_terminal_count;
++
++    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
++        process_grp_mem, manifest, param);
++
++    verifexit(process_grp_mem != NULL);
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++    verifexit(ia_css_is_program_group_manifest_valid(manifest));
++    verifexit(size != 0);
++
++    process_group = (ia_css_process_group_t    *)process_grp_mem;
++    ia_css_cpu_mem_set_zero(process_group, size);
++    process_grp_raw_ptr = (char *) process_group;
++
++    process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
++
++    process_group->protocol_version =
++        ia_css_program_group_param_get_protocol_version(param);
++
++    fragment_count = ia_css_program_group_param_get_fragment_count(param);
++    process_count =
++        ia_css_process_group_compute_process_count(manifest, param);
++    terminal_count =
++        ia_css_process_group_compute_terminal_count(manifest, param);
++    enable_bitmap =
++        ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++    process_group->fragment_count = fragment_count;
++    process_group->process_count = process_count;
++    process_group->terminal_count = terminal_count;
++    process_group->kernel_bitmap = enable_bitmap;
++
++    process_grp_raw_ptr += sizeof(ia_css_process_group_t);
++    process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
++    process_group->processes_offset =
++        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
++
++    process_grp_raw_ptr += tot_bytes_for_pow2_align(
++            sizeof(uint64_t), process_count * sizeof(uint16_t));
++    terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
++    process_group->terminals_offset =
++        (uint16_t)(process_grp_raw_ptr - (char *)process_group);
++
++    /* Move raw pointer to the first process */
++    process_grp_raw_ptr += tot_bytes_for_pow2_align(
++            sizeof(uint64_t), terminal_count * sizeof(uint16_t));
++
++    /* Set default */
++    verifexit(ia_css_process_group_set_fragment_limit(
++                process_group, fragment_count) == 0);
++
++    /* Set process group terminal dependency list */
++    /* This list is used during creating the process dependency list */
++    manifest_terminal_count =
++        ia_css_program_group_manifest_get_terminal_count(manifest);
++
++    terminal_num = 0;
++    for (i = 0; i < (int)manifest_terminal_count; i++) {
++        ia_css_terminal_manifest_t *t_manifest =
++            ia_css_program_group_manifest_get_term_mnfst(
++                    manifest, i);
++
++        verifexit(NULL != t_manifest);
++
++        if (ia_css_process_group_is_terminal_enabled(
++                    t_manifest, enable_bitmap)) {
++            ia_css_terminal_t *terminal = NULL;
++            ia_css_terminal_param_t *terminal_param =
++                ia_css_program_group_param_get_terminal_param(
++                        param, i);
++
++            verifexit(NULL != terminal_param);
++            terminal_tab_ptr[terminal_num] =
++                (uint16_t)(process_grp_raw_ptr -
++                        (char *)process_group);
++            terminal = ia_css_terminal_create(
++                    process_grp_raw_ptr, t_manifest,
++                    terminal_param, enable_bitmap);
++            verifexit(terminal != NULL);
++            verifexit((ia_css_terminal_set_parent(
++                    terminal, process_group) == 0));
++            verifexit((ia_css_terminal_set_terminal_manifest_index(
++                    terminal, i) == 0));
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                "ia_css_process_group_create: terminal_manifest_index %d\n",
++                i);
++
++            process_grp_raw_ptr += ia_css_terminal_get_size(
++                            terminal);
++            terminal_num++;
++        } else {
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
++        }
++    }
++    verifexit(terminal_num == terminal_count);
++
++    process_num = 0;
++    for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
++                manifest); i++) {
++        ia_css_process_t *process = NULL;
++        ia_css_program_manifest_t *program_manifest =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                    manifest, i);
++        ia_css_program_param_t *program_param =
++            ia_css_program_group_param_get_program_param(param, i);
++        unsigned int prog_dep_index, proc_dep_index;
++        unsigned int term_dep_index, term_index;
++
++        verifexit(program_manifest != 0);
++        verifexit(program_param    != NULL);
++
++        if (ia_css_process_group_is_program_enabled(
++                    program_manifest, enable_bitmap)) {
++
++            verifexit(process_num < process_count);
++
++            process_tab_ptr[process_num] =
++                (uint16_t)(process_grp_raw_ptr -
++                        (char *)process_group);
++
++            /* instead of using program_param,
++             * we can provide this directly to ia_css_process_create.
++             * The corresponding public setter function is deprecated and will assert
++             * upon use. */
++            program_param->kernel_enable_bitmap =
++                ia_css_kernel_bitmap_intersection(
++                        ia_css_program_manifest_get_kernel_bitmap(program_manifest),
++                        /*pg*/enable_bitmap);
++
++            process = ia_css_process_create(
++                    process_grp_raw_ptr,
++                    program_manifest,
++                    program_param,
++                    i);
++            verifexit(process != NULL);
++
++            ia_css_process_set_parent(process, process_group);
++            if (ia_css_has_program_manifest_fixed_cell(
++                        program_manifest)) {
++                vied_nci_cell_ID_t cell_id =
++                    ia_css_program_manifest_get_cell_ID(
++                            program_manifest);
++
++                IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                    "ia_css_process_group_create: cell_id %d\n",
++                    cell_id);
++                ia_css_process_set_cell(process, cell_id);
++            }
++
++            process_grp_raw_ptr += ia_css_process_get_size(
++                    process);
++            /*
++             * Set process dependencies of process derived
++             * from program manifest
++             */
++            for (prog_dep_index = 0; prog_dep_index <
++            ia_css_program_manifest_get_program_dependency_count(
++                program_manifest); prog_dep_index++) {
++                uint8_t dep_prog_idx =
++                ia_css_program_manifest_get_program_dependency(
++                    program_manifest, prog_dep_index);
++                const ia_css_program_manifest_t *
++                dep_prg_manifest =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                    manifest, dep_prog_idx);
++                ia_css_program_ID_t id =
++                ia_css_program_manifest_get_program_ID(
++                        dep_prg_manifest);
++
++                verifexit(id != 0);
++                for (proc_dep_index = 0;
++                        proc_dep_index < process_num;
++                        proc_dep_index++) {
++                    ia_css_process_t *dep_process =
++                    ia_css_process_group_get_process(
++                            process_group,
++                            proc_dep_index);
++
++                    ia_css_process_set_cell_dependency(
++                            process,
++                            prog_dep_index, 0);
++
++                if (ia_css_process_get_program_ID(
++                        dep_process) == id) {
++                    ia_css_process_set_cell_dependency(
++                            process,
++                            prog_dep_index,
++                            proc_dep_index);
++                        break;
++                    }
++                }
++            }
++            process_num++;
++
++            /*
++             * Set terminal dependencies of process derived
++             * from program manifest
++             */
++            for (term_dep_index = 0; term_dep_index <
++            ia_css_program_manifest_get_terminal_dependency_count(
++                program_manifest); term_dep_index++) {
++                uint8_t pm_term_index =
++                ia_css_program_manifest_get_terminal_dependency
++                    (program_manifest, term_dep_index);
++
++                verifexit(pm_term_index < manifest_terminal_count);
++                IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++                    "ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
++                    term_dep_index, pm_term_index);
++                for (term_index = 0;
++                    term_index < terminal_count;
++                    term_index++) {
++                    ia_css_terminal_t *terminal =
++                    ia_css_process_group_get_terminal(
++                            process_group,
++                            term_index);
++
++                if (ia_css_terminal_get_terminal_manifest_index
++                        (terminal) == pm_term_index) {
++                    ia_css_process_set_terminal_dependency(
++                            process,
++                            term_dep_index,
++                            term_index);
++                    IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++                        "ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
++                        i, term_dep_index, term_index);
++
++                        break;
++                    }
++                }
++            }
++        }
++    }
++    verifexit(process_num == process_count);
++
++    process_group->size =
++        (uint32_t)ia_css_sizeof_process_group(manifest, param);
++    process_group->ID =
++        ia_css_program_group_manifest_get_program_group_ID(manifest);
++
++    /* Initialize performance measurement fields to zero */
++    process_group->pg_load_start_ts        = 0;
++    process_group->pg_load_cycles        = 0;
++    process_group->pg_init_cycles        = 0;
++    process_group->pg_processing_cycles    = 0;
++    process_group->pg_complete_cycles    = 0;
++
++    process_group->error_handling_enable = 0;
++
++    verifexit(process_group->size != 0);
++    verifexit(process_group->ID != 0);
++
++    ret = ia_css_process_group_on_create(process_group, manifest, param);
++    verifexit(ret == 0);
++
++    process_group->state = IA_CSS_PROCESS_GROUP_READY;
++    retval = 0;
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
++        process_group->ID);
++
++EXIT:
++    if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_create invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_create failed (%i)\n", retval);
++        process_group = ia_css_process_group_destroy(process_group);
++    }
++    return process_group;
++}
++
++ia_css_process_group_t *ia_css_process_group_destroy(
++    ia_css_process_group_t *process_group)
++{
++    if (process_group != NULL) {
++        ia_css_process_group_on_destroy(process_group);
++        process_group = NULL;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_destroy invalid argument\n");
++    }
++    return process_group;
++}
++
++int ia_css_process_group_submit(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_submit(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
++}
++
++int ia_css_process_group_start(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_start(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_START);
++}
++
++int ia_css_process_group_stop(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_stop(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_STOP);
++}
++
++int ia_css_process_group_run(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_run(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_RUN);
++}
++
++int ia_css_process_group_suspend(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_suspend(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
++}
++
++int ia_css_process_group_resume(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_resume(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_RESUME);
++}
++
++int ia_css_process_group_reset(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_reset(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_RESET);
++}
++
++int ia_css_process_group_abort(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_abort(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_ABORT);
++}
++
++int ia_css_process_group_disown(
++    ia_css_process_group_t *process_group)
++{
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_group_disown(): enter:\n");
++
++    return ia_css_process_group_exec_cmd(process_group,
++        IA_CSS_PROCESS_GROUP_CMD_DISOWN);
++}
++
++uint64_t ia_css_process_group_get_token(
++    ia_css_process_group_t *process_group)
++{
++    uint64_t token = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_token(): enter:\n");
++
++    verifexit(process_group != NULL);
++
++    token = process_group->token;
++
++EXIT:
++    if (NULL == process_group) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_get_token invalid argument\n");
++    }
++    return token;
++}
++
++int ia_css_process_group_set_token(
++    ia_css_process_group_t *process_group,
++    const uint64_t token)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_token(): enter:\n");
++
++    verifexit(process_group != NULL);
++    verifexit(token != 0);
++
++    process_group->token = token;
++
++    retval = 0;
++EXIT:
++    if (NULL == process_group || 0 == token) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_set_token invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_token failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++uint64_t ia_css_process_group_get_private_token(
++    ia_css_process_group_t *process_group)
++{
++    uint64_t token = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_get_private_token(): enter:\n");
++
++    verifexit(process_group != NULL);
++
++    token = process_group->private_token;
++
++EXIT:
++    if (NULL == process_group) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_get_private_token invalid argument\n");
++    }
++    return token;
++}
++
++int ia_css_process_group_set_private_token(
++    ia_css_process_group_t *process_group,
++    const uint64_t token)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_set_private_token(): enter:\n");
++
++    verifexit(process_group != NULL);
++    verifexit(token != 0);
++
++    process_group->private_token = token;
++
++    retval = 0;
++EXIT:
++    if (NULL == process_group || 0 == token) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_set_private_token invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_group_set_private_token failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++uint8_t ia_css_process_group_compute_process_count(
++    const ia_css_program_group_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    uint8_t process_count = 0;
++    ia_css_kernel_bitmap_t total_bitmap;
++    ia_css_kernel_bitmap_t enable_bitmap;
++    int i;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_compute_process_count(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    total_bitmap =
++        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++    enable_bitmap =
++        ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++    verifexit(ia_css_is_program_group_manifest_valid(manifest));
++    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
++    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
++
++    for (i = 0; i <
++        (int)ia_css_program_group_manifest_get_program_count(manifest);
++            i++) {
++        ia_css_program_manifest_t *program_manifest =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                    manifest, i);
++        ia_css_kernel_bitmap_t program_bitmap =
++            ia_css_program_manifest_get_kernel_bitmap(
++                    program_manifest);
++        /*
++         * Programs can be orthogonal,
++         * a mutually exclusive subset,
++         * or a concurrent subset
++         */
++        if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
++                    program_bitmap)) {
++            ia_css_program_type_t program_type =
++                ia_css_program_manifest_get_type(
++                        program_manifest);
++            /*
++             * An exclusive subnode < exclusive supernode,
++             * so simply don't count it
++             */
++            if (program_type !=
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
++                program_type !=
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++                process_count++;
++            }
++        }
++    }
++
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_compute_process_count invalid argument\n");
++    }
++    return process_count;
++}
++
++uint8_t ia_css_process_group_compute_terminal_count(
++    const ia_css_program_group_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    uint8_t terminal_count = 0;
++    ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
++    int i;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_group_compute_terminal_count(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    total_bitmap =
++        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++    enable_bitmap =
++        ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++    verifexit(ia_css_is_program_group_manifest_valid(manifest));
++    verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
++    verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
++
++    for (i = 0; i <
++        (int)ia_css_program_group_manifest_get_terminal_count(
++            manifest); i++) {
++        ia_css_terminal_manifest_t *tmanifest =
++            ia_css_program_group_manifest_get_term_mnfst(
++                    manifest, i);
++
++        if (ia_css_process_group_is_terminal_enabled(
++                    tmanifest, enable_bitmap)) {
++            terminal_count++;
++        }
++    }
++
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_group_compute_terminal_count invalid argument\n");
++    }
++    return terminal_count;
++}
++#endif /* !defined(__VIED_CELL) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
+new file mode 100644
+index 000000000000..07c42c7c10c9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_process_group_cmd_impl.c
+@@ -0,0 +1,137 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process_group_cmd_impl.h"
++#include "ia_css_psysapi.h"
++#include "ia_css_psys_process.h"
++#include "ia_css_psys_process.psys.h"
++#include "ia_css_psys_process_group.h"
++#include "ia_css_psys_process_group.psys.h"
++#include "error_support.h"
++#include "vied_nci_psys_system_global.h"
++#include "misc_support.h"
++
++#include "ia_css_psys_sim_trace.h"
++
++/* Dummy implementation for sim */
++int ia_css_process_group_on_create(
++    ia_css_process_group_t                    *process_group,
++    const ia_css_program_group_manifest_t    *program_group_manifest,
++    const ia_css_program_group_param_t        *program_group_param)
++{
++    NOT_USED(process_group);
++    NOT_USED(program_group_manifest);
++    NOT_USED(program_group_param);
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
++
++    return 0;
++}
++
++/* Dummy implementation for sim */
++int ia_css_process_group_on_destroy(
++    ia_css_process_group_t                    *process_group)
++{
++    NOT_USED(process_group);
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
++
++    return 0;
++}
++
++int ia_css_process_group_exec_cmd(
++    ia_css_process_group_t                    *process_group,
++    const ia_css_process_group_cmd_t        cmd)
++{
++    int    retval = -1;
++    ia_css_process_group_state_t    state;
++
++    IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
++
++    state = ia_css_process_group_get_state(process_group);
++
++    verifexit(process_group != NULL);
++    verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
++    verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
++
++    switch (cmd) {
++    case IA_CSS_PROCESS_GROUP_CMD_NOP:
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
++        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++
++/* External resource availability checks */
++        verifexit(ia_css_can_process_group_submit(process_group));
++
++        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
++        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_DETACH:
++        verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_START:
++        verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
++
++/* External resource state checks */
++        verifexit(ia_css_can_process_group_start(process_group));
++
++        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
++
++        /* empty call to match API ownership change between host and firmware */
++
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_RUN:
++        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
++        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_STOP:
++        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
++        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
++        verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
++        process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_RESUME:
++        verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
++        process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_ABORT:
++        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
++        process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
++        break;
++    case IA_CSS_PROCESS_GROUP_CMD_RESET:
++/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
++        verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
++        process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
++        break;
++    case IA_CSS_N_PROCESS_GROUP_CMDS:    /* Fall through */
++    default:
++        verifexit(false);
++        break;
++    }
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
++    }
++    return retval;
++}
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
+new file mode 100644
+index 000000000000..c8f33b2b6211
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_group_manifest.c
+@@ -0,0 +1,1081 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_static_storage_class.h"
++#include "ia_css_psys_program_group_manifest.h"
++#include "ia_css_rbm_manifest.h"
++
++#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
++#include "vied_nci_acb_route_type.h" /* only used for printing. */
++#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_group_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/*
++ * We need to refactor those files in order to
++ * build in the firmware only what is needed,
++ * switches are put current to workaround compilation problems
++ * in the firmware (for example lack of uint64_t support)
++ * supported in the firmware
++ */
++#if !defined(__HIVECC)
++size_t ia_css_sizeof_program_group_manifest(
++    const uint8_t program_count,
++    const uint8_t terminal_count,
++    const uint8_t *program_needs_extension,
++    const uint8_t *program_dependency_count,
++    const uint8_t *terminal_dependency_count,
++    const ia_css_terminal_type_t *terminal_type,
++    const uint16_t *cached_in_param_section_count,
++    const uint16_t *cached_out_param_section_count,
++    const uint16_t *spatial_param_section_count,
++    const uint16_t *fragment_param_section_count,
++    const uint16_t *sliced_param_section_count,
++    const uint16_t *sliced_out_param_section_count,
++    const uint16_t *kernel_fragment_seq_count,
++    const uint16_t *progctrlinit_load_section_counts,
++    const uint16_t *progctrlinit_connect_section_counts)
++{
++    size_t size = 0;
++    int i = 0;
++    int j = 0;
++    int k = 0;
++    int l = 0;
++    int m = 0;
++    int n = 0;
++    int o = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_sizeof_program_group_manifest(): enter:\n");
++
++    verifexit(program_count != 0);
++    verifexit(program_dependency_count != NULL);
++    verifexit(terminal_dependency_count != NULL);
++
++    size += sizeof(ia_css_program_group_manifest_t);
++
++    /* Private payload in the program group manifest */
++    size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
++                sizeof(uint64_t));
++    /* RBM manifest in the program group manifest */
++    size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
++                sizeof(uint64_t));
++
++    for (i = 0; i < (int)program_count; i++) {
++        size += ia_css_sizeof_program_manifest(
++                program_needs_extension[i],
++                program_dependency_count[i],
++                terminal_dependency_count[i]);
++    }
++
++    for (i = 0; i < (int)terminal_count; i++) {
++        switch (terminal_type[i]) {
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++            size += ia_css_param_terminal_manifest_get_size(
++                    cached_in_param_section_count[j]);
++            j++;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++            size += ia_css_param_terminal_manifest_get_size(
++                    cached_out_param_section_count[k]);
++            k++;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++            size += ia_css_spatial_param_terminal_manifest_get_size(
++                    spatial_param_section_count[l]);
++            l++;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PROGRAM:
++            size += ia_css_program_terminal_manifest_get_size(
++                    fragment_param_section_count[m],
++                    kernel_fragment_seq_count[m]);
++            m++;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++            size += ia_css_program_control_init_terminal_manifest_get_size(
++                program_count,
++                progctrlinit_load_section_counts,
++                progctrlinit_connect_section_counts);
++            break;
++        case IA_CSS_TERMINAL_TYPE_DATA_IN:
++        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++            size += sizeof(ia_css_data_terminal_manifest_t);
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++            size += ia_css_sliced_param_terminal_manifest_get_size(
++                    sliced_param_section_count[n]);
++            n++;
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++            size += ia_css_sliced_param_terminal_manifest_get_size(
++                sliced_out_param_section_count[o]);
++            o++;
++            break;
++        default:
++            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                "ia_css_sizeof_program_group_manifest invalid argument\n");
++        }
++    }
++
++EXIT:
++    if (0 == program_count || 0 == terminal_count ||
++        NULL == program_dependency_count ||
++        NULL == terminal_dependency_count) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_sizeof_program_group_manifest invalid argument\n");
++    }
++    return size;
++}
++
++/*
++ * Currently, the design of XNR kernel inside the *_pregdc program group,
++ * does not fit the exact model as is being asserted on in
++ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
++ * Further investigation is needed to determine whether *_pregdc program group
++ * can be canged or that the model must be changed.
++ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
++ * connected to the same terminal, and it allows a kernel be mapped over
++ * multiple programs.
++ */
++#define USE_SIMPLIFIED_GRAPH_MODEL 1
++
++/*
++ * Model and/or check refinements
++ * - Parallel programs do not yet have mutual exclusive alternatives
++ * - The pgram dependencies do not need to be acyclic
++ * - Parallel programs need to have an equal kernel requirement
++ */
++bool ia_css_is_program_group_manifest_valid(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    int i;
++    bool is_valid = false;
++    uint8_t terminal_count;
++    uint8_t program_count;
++    ia_css_kernel_bitmap_t total_bitmap;
++    ia_css_kernel_bitmap_t check_bitmap;
++    ia_css_kernel_bitmap_t terminal_bitmap;
++    /*
++     * Use a standard bitmap type for the minimum logic to check the DAG,
++     * generic functions can be used for the kernel enable bitmaps; Later
++     */
++    vied_nci_resource_bitmap_t resource_bitmap;
++    int terminal_bitmap_weight;
++    int num_parameter_terminal_in = 0;
++    int num_parameter_terminal_out = 0;
++    int num_program_terminal = 0;
++    int num_program_terminal_sequencer_info = 0;
++    bool has_program_control_init_terminal = false;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_program_group_manifest_valid(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
++    verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
++    verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
++
++    terminal_count =
++        ia_css_program_group_manifest_get_terminal_count(manifest);
++    program_count =
++        ia_css_program_group_manifest_get_program_count(manifest);
++    total_bitmap =
++        ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++    check_bitmap = ia_css_kernel_bitmap_clear();
++    resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
++    terminal_bitmap = ia_css_kernel_bitmap_clear();
++
++    verifexit(program_count != 0);
++    verifexit(terminal_count != 0);
++    verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
++    verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
++
++    /* Check the kernel bitmaps for terminals */
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_manifest_t *terminal_manifest_i =
++            ia_css_program_group_manifest_get_term_mnfst(
++                manifest, i);
++        bool is_parameter_in =
++            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
++            ia_css_terminal_manifest_get_type(
++                terminal_manifest_i));
++        bool is_parameter_out =
++            (IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
++            ia_css_terminal_manifest_get_type(
++                terminal_manifest_i));
++        bool is_data =
++            ia_css_is_terminal_manifest_data_terminal(
++                terminal_manifest_i);
++        bool is_program =
++            ia_css_is_terminal_manifest_program_terminal(
++                terminal_manifest_i);
++        bool is_spatial_param =
++            ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                terminal_manifest_i);
++        bool is_program_control_init =
++            ia_css_is_terminal_manifest_program_control_init_terminal(
++                terminal_manifest_i);
++
++        if (is_parameter_in) {
++            num_parameter_terminal_in = is_parameter_in;
++        } else if (is_parameter_out) {
++            num_parameter_terminal_out = is_parameter_out;
++        } else if (is_data) {
++            ia_css_data_terminal_manifest_t *dterminal_manifest_i =
++                (ia_css_data_terminal_manifest_t *)
++                terminal_manifest_i;
++            ia_css_kernel_bitmap_t terminal_bitmap_i =
++                ia_css_data_terminal_manifest_get_kernel_bitmap(
++                    dterminal_manifest_i);
++            /*
++             * A terminal must depend on kernels that are a subset
++             * of the total, correction, it can only depend on one
++             * kernel
++             */
++            verifexit(!ia_css_is_kernel_bitmap_empty(
++                    terminal_bitmap_i));
++            verifexit(ia_css_is_kernel_bitmap_subset(
++                    total_bitmap, terminal_bitmap_i));
++            verifexit(ia_css_is_kernel_bitmap_onehot(
++                    terminal_bitmap_i));
++        } else if (is_program) {
++            verifexit(terminal_manifest_i);
++            num_program_terminal += is_program;
++            num_program_terminal_sequencer_info +=
++                ((ia_css_program_terminal_manifest_t *)
++                terminal_manifest_i)->
++            kernel_fragment_sequencer_info_manifest_info_count;
++        } else if (is_program_control_init) {
++            has_program_control_init_terminal = is_program_control_init;
++        } else {
++            const ia_css_spatial_param_terminal_manifest_t
++                *spatial_param_man =
++            (const ia_css_spatial_param_terminal_manifest_t *)
++                terminal_manifest_i;
++            verifexit(spatial_param_man);
++            verifexit(is_spatial_param);
++
++            terminal_bitmap =
++                ia_css_kernel_bitmap_set(terminal_bitmap,
++                spatial_param_man->kernel_id);
++            verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
++            verifexit(ia_css_is_kernel_bitmap_subset(
++                    total_bitmap, terminal_bitmap));
++        }
++    }
++
++    /* Check the kernel bitmaps for programs */
++    for (i = 0; i < (int)program_count; i++) {
++        int j;
++        ia_css_program_manifest_t *program_manifest_i =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                manifest, i);
++        ia_css_program_type_t program_type_i =
++            ia_css_program_manifest_get_type(program_manifest_i);
++        ia_css_kernel_bitmap_t program_bitmap_i =
++            ia_css_program_manifest_get_kernel_bitmap(
++                program_manifest_i);
++        uint8_t program_dependency_count_i =
++            ia_css_program_manifest_get_program_dependency_count(
++                program_manifest_i);
++        uint8_t terminal_dependency_count_i =
++            ia_css_program_manifest_get_terminal_dependency_count(
++                program_manifest_i);
++        uint8_t program_dependency_i0 =
++            ia_css_program_manifest_get_program_dependency(
++                program_manifest_i, 0);
++        bool is_sub_i =
++            ia_css_is_program_manifest_subnode_program_type(
++                program_manifest_i);
++        bool is_exclusive_sub_i =
++            (program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
++        bool is_virtual_sub_i =
++            (program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++        bool is_super_i =
++            ia_css_is_program_manifest_supernode_program_type(
++                program_manifest_i);
++
++        /*
++         * A program must have kernels that
++         * are a subset of the total
++         */
++        verifexit(!ia_css_is_kernel_bitmap_empty(
++                program_bitmap_i));
++        verifexit(ia_css_is_kernel_bitmap_subset(
++                total_bitmap, program_bitmap_i));
++        verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
++        verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
++        /*
++         * Checks for subnodes
++         * - Parallel subnodes cannot depend on terminals
++         * - Exclusive subnodes must depend on
++         *   fewer terminals than the supernode
++         * - Subnodes only depend on a supernode of the same type
++         * - Must have a subset of the supernode's kernels
++         *   (but not equal)
++         * - This tests only positive cases
++         * Checks for singular or supernodes
++         * - Cannot depend on exclusive subnodes
++         * - No intersection between kernels
++         *   (too strict for multiple instances ?)
++         */
++        if (is_sub_i) {
++            /* Subnode */
++            ia_css_program_manifest_t *program_manifest_k =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                manifest, program_dependency_i0);
++            ia_css_program_type_t program_type_k =
++                ia_css_program_manifest_get_type(
++                    program_manifest_k);
++            ia_css_kernel_bitmap_t program_bitmap_k =
++                ia_css_program_manifest_get_kernel_bitmap(
++                    program_manifest_k);
++
++            verifexit(program_dependency_count_i == 1);
++            if (is_exclusive_sub_i || is_virtual_sub_i) {
++                verifexit(terminal_dependency_count_i <=
++                    ia_css_program_manifest_get_terminal_dependency_count(
++                        program_manifest_k));
++            } else{
++                verifexit(terminal_dependency_count_i == 0);
++            }
++            verifexit(program_type_k ==
++                (is_exclusive_sub_i ?
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
++                is_virtual_sub_i ?
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
++                    IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
++            verifexit(!ia_css_is_kernel_bitmap_equal(
++                    program_bitmap_k, program_bitmap_i));
++            verifexit(ia_css_is_kernel_bitmap_subset(
++                    program_bitmap_k, program_bitmap_i));
++        } else {
++            /* Singular or Supernode */
++            int k;
++            ia_css_kernel_bitmap_t program_bitmap_k;
++
++            for (k = 0; k < program_dependency_count_i; k++) {
++                uint8_t program_dependency_k =
++                ia_css_program_manifest_get_program_dependency(
++                    program_manifest_i, k);
++                ia_css_program_manifest_t *program_manifest_k =
++                ia_css_program_group_manifest_get_prgrm_mnfst(
++                manifest, (int)program_dependency_k);
++                ia_css_program_type_t program_type_k =
++                ia_css_program_manifest_get_type(
++                    program_manifest_k);
++                program_bitmap_k =
++                ia_css_program_manifest_get_kernel_bitmap(
++                    program_manifest_k);
++
++                verifexit(program_dependency_k <
++                    program_count);
++                verifexit((program_type_k !=
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++                    (program_type_k !=
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
++                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++                ia_css_is_kernel_bitmap_intersection_empty(
++                    program_bitmap_i, program_bitmap_k));
++            }
++        }
++
++        /* Check for relations */
++        for (j = 0; j < (int)program_count; j++) {
++            int k;
++            ia_css_program_manifest_t *program_manifest_j =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                manifest, j);
++            ia_css_program_type_t program_type_j =
++            ia_css_program_manifest_get_type(program_manifest_j);
++            ia_css_kernel_bitmap_t program_bitmap_j =
++            ia_css_program_manifest_get_kernel_bitmap(
++                program_manifest_j);
++            uint8_t program_dependency_count_j =
++            ia_css_program_manifest_get_program_dependency_count(
++                program_manifest_j);
++            uint8_t program_dependency_j0 =
++            ia_css_program_manifest_get_program_dependency(
++                program_manifest_j, 0);
++            bool is_sub_j =
++            ia_css_is_program_manifest_subnode_program_type(
++                program_manifest_j);
++            bool is_super_j =
++            ia_css_is_program_manifest_supernode_program_type(
++                program_manifest_j);
++            bool is_virtual_sub_j =
++            (program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++            bool is_j_subset_i =
++            ia_css_is_kernel_bitmap_subset(
++                program_bitmap_i, program_bitmap_j);
++            bool is_i_subset_j =
++            ia_css_is_kernel_bitmap_subset(
++                program_bitmap_j, program_bitmap_i);
++
++            /* Test below would fail for i==j */
++            if (i == j)
++                continue;
++
++            /* Empty sets are always subsets, but meaningless */
++            verifexit(!ia_css_is_kernel_bitmap_empty(
++                    program_bitmap_j));
++
++            /*
++             * Checks for mutual subnodes
++             * - Parallel subnodes must have an equal
++             *   set of kernels
++             * - Exclusive and virtual subnodes must
++             *   have an unequal set of kernels
++             * Checks for subnodes
++             * - Subnodes must have a subset of kernels
++             */
++            if (((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
++                ((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
++                ((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
++
++                verifexit(program_dependency_count_j == 1);
++                verifexit(program_dependency_i0 != i);
++                verifexit(program_dependency_j0 != i);
++
++                if (program_dependency_i0 ==
++                    program_dependency_j0) {
++                    verifexit(is_sub_i);
++                    /*
++                     * Subnodes are subsets,
++                     * not for virtual nodes
++                     */
++                    if (!is_virtual_sub_i)
++                        verifexit(
++                            ((is_j_subset_i ||
++                            is_i_subset_j)));
++                    /*
++                     * That must be equal for
++                     * parallel subnodes,
++                     * must be unequal for
++                     * exlusive and virtual subnodes
++                     */
++                    verifexit(
++                    ((is_j_subset_i && is_i_subset_j) ^
++                    (is_exclusive_sub_i |
++                    is_virtual_sub_i)));
++
++                }
++                if (is_j_subset_i || is_i_subset_j) {
++                    /* One being subset of the other does not necessarily mean that they are part
++                     * of the same "cluster" (i.e. having same super dependency).
++                     */
++                    /* verifexit(program_dependency_i0 ==
++                     *    program_dependency_j0);
++                     */
++                }
++                /* If subnodes are the same, they need different program dependency. */
++                if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
++                    verifexit(program_dependency_i0 != program_dependency_j0);
++                }
++            }
++
++            if (((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
++                ((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
++                ((program_type_i ==
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
++                (program_type_j ==
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
++
++                verifexit(program_dependency_count_j == 1);
++                verifexit(!is_i_subset_j);
++
++                if (program_dependency_j0 == i) {
++                    verifexit(program_dependency_i0 !=
++                        program_dependency_j0);
++                    verifexit(is_super_i);
++                    verifexit(is_j_subset_i);
++
++                }
++                if (is_j_subset_i) {
++                    /* verifexit(program_dependency_j0 == i); */
++                    /* A sub that is subset of a super, is not necessarily dependent to it. */
++                }
++            }
++
++            /*
++             * Checks for dependent nodes
++             * - Cannot depend on exclusive subnodes
++             * - No intersection between kernels
++             *   (too strict for multiple instances ?)
++             *   unless a subnode
++             */
++            for (k = 0; k < (int)program_dependency_count_j; k++) {
++                uint8_t program_dependency_k =
++                ia_css_program_manifest_get_program_dependency(
++                    program_manifest_j, k);
++
++                verifexit((program_dependency_k <
++                    program_count));
++                if (program_dependency_k == i) {
++                    /* program[j] depends on program[i] */
++                    verifexit((i != j));
++                    verifexit((program_type_i !=
++                    IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++                    (program_type_i !=
++                    IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
++                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++                (ia_css_is_kernel_bitmap_intersection_empty(
++                program_bitmap_i, program_bitmap_j) ^ is_sub_j));
++                }
++            }
++
++            /*
++             * Checks for supernodes and subnodes
++             * - Detect nodes that kernel-wise are subsets,
++             *   but not connected to the correct supernode
++             * - We do not (yet) detect if programs properly
++             *   depend on all parallel nodes
++             */
++            if (!ia_css_is_kernel_bitmap_intersection_empty(
++                program_bitmap_i, program_bitmap_j)) {
++                /*
++                 * This test will pass if
++                 * the program manifest is NULL,
++                 * but that's no concern here
++                 */
++                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++            !ia_css_is_program_manifest_singular_program_type(
++                program_manifest_i));
++                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++            !ia_css_is_program_manifest_singular_program_type(
++                program_manifest_j));
++                if (!is_virtual_sub_j)
++                    verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++                    (is_j_subset_i || is_i_subset_j));
++                if (is_super_i) {
++                    /* verifexit(is_sub_j); */
++                    /* verifexit(program_dependency_j0 == i); */
++                }
++                if (is_super_j) {
++                    /* verifexit(is_sub_i); */
++                    /* verifexit(program_dependency_i0 == j); */
++                }
++                if (is_super_i && is_super_j) {
++                    /* Allow two supernodes to intersect as long as they are different */
++                    verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
++                }
++                /* A bitmap intersect does not necessarily need to mean super and sub. */
++                /* A sub that intersects with a super, is not necessarily dependent to it. */
++            }
++        }
++        check_bitmap = ia_css_kernel_bitmap_union(
++                    check_bitmap, program_bitmap_i);
++        /*
++         * A terminal can be bound to only a single
++         * (of multiple concurrent) program(s),
++         * i.e. the one that holds the iterator to control it
++         * Only singular and super nodes can depend on a terminal.
++         * This loop accumulates all terminal
++         * dependencies over all programs
++         */
++        for (j = 0; j < (int)terminal_dependency_count_i; j++) {
++            uint8_t terminal_dependency =
++            ia_css_program_manifest_get_terminal_dependency(
++                    program_manifest_i, j);
++
++            verifexit(terminal_dependency < terminal_count);
++            if ((program_type_i !=
++                IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++                (program_type_i !=
++                IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
++                /* If the subnode always came after the */
++                /* supernode we could check for presence */
++                resource_bitmap =
++                    vied_nci_bit_mask_set_unique(
++                        resource_bitmap,
++                        terminal_dependency);
++                verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++                    !vied_nci_is_bitmap_empty(
++                        resource_bitmap));
++            }
++        }
++    }
++    verifexit(ia_css_is_kernel_bitmap_equal(
++            total_bitmap, check_bitmap));
++
++    terminal_bitmap_weight =
++        vied_nci_bitmap_compute_weight(resource_bitmap);
++    verifexit(terminal_bitmap_weight >= 0);
++    if (num_parameter_terminal_in ||
++        num_parameter_terminal_out ||
++        num_program_terminal ||
++        has_program_control_init_terminal) {
++        int skip_terminal_count = 0;
++
++        skip_terminal_count += num_parameter_terminal_in;
++        skip_terminal_count += num_parameter_terminal_out;
++        skip_terminal_count += num_program_terminal;
++        skip_terminal_count -= num_program_terminal_sequencer_info;
++        if (has_program_control_init_terminal) {
++            skip_terminal_count++;
++        }
++        verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++            (terminal_bitmap_weight ==
++            (terminal_count - skip_terminal_count)));
++    } else
++        verifexit((terminal_bitmap_weight == terminal_count));
++
++    is_valid = true;
++EXIT:
++    if (is_valid == false) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_is_program_group_manifest_valid: failed\n");
++    }
++    return is_valid;
++}
++
++#if !defined(__HIVECC)
++int ia_css_program_group_manifest_set_kernel_bitmap(
++    ia_css_program_group_manifest_t *manifest,
++    const ia_css_kernel_bitmap_t bitmap)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->kernel_bitmap = bitmap;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
++    }
++    return retval;
++}
++#endif
++
++ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
++    const ia_css_program_group_manifest_t *manifest)
++{
++    ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        bitmap = manifest->kernel_bitmap;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++#if !defined(__HIVECC)
++void ia_css_program_group_manifest_init(
++    ia_css_program_group_manifest_t *blob,
++    const uint8_t program_count,
++    const uint8_t terminal_count,
++    const uint8_t *program_needs_extension,
++    const uint8_t *program_dependencies,
++    const uint8_t *terminal_dependencies,
++    const ia_css_terminal_type_t *terminal_type,
++    const uint16_t *cached_in_param_section_count,
++    const uint16_t *cached_out_param_section_count,
++    const uint16_t *spatial_param_section_count,
++    const uint16_t *fragment_param_section_count,
++    const uint16_t *sliced_in_param_section_count,
++    const uint16_t *sliced_out_param_section_count,
++    const uint16_t *kernel_fragment_seq_count,
++    const uint16_t *progctrlinit_load_section_counts,
++    const uint16_t *progctrlinit_connect_section_counts)
++{
++    int i = 0;
++    int j = 0;
++    int k = 0;
++    int l = 0;
++    int m = 0;
++    int n = 0;
++    int o = 0;
++    int result;
++    uint32_t offset = 0;
++    char *prg_manifest_base, *terminal_manifest_base;
++    size_t program_size = 0;
++
++    /*
++     * assert(blob != NULL);
++     */
++    COMPILATION_ERROR_IF(
++        SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
++            (CHAR_BIT * sizeof(ia_css_program_manifest_t)));
++    COMPILATION_ERROR_IF(
++        SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
++            (CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
++
++    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
++    COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++        "ia_css_program_group_manifest_init(): enter:\n");
++
++    for (i = 0; i < (int)program_count; i++) {
++        program_size +=
++            ia_css_sizeof_program_manifest(
++                program_needs_extension[i],
++                program_dependencies[i],
++                terminal_dependencies[i]);
++    }
++
++    /* A program group ID cannot be zero */
++    blob->ID = 1;
++    blob->program_count = program_count;
++    blob->terminal_count = terminal_count;
++    blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
++    blob->terminal_manifest_offset =
++        (uint32_t)blob->program_manifest_offset + program_size;
++
++    prg_manifest_base = (char *)
++        (((char *)blob) + blob->program_manifest_offset);
++    offset = blob->program_manifest_offset;
++    for (i = 0; i < (int)program_count; i++) {
++        ia_css_program_manifest_init(
++            (ia_css_program_manifest_t *)prg_manifest_base,
++            program_needs_extension[i],
++            program_dependencies[i], terminal_dependencies[i]);
++        ia_css_program_manifest_set_parent_offset(
++            (ia_css_program_manifest_t *)prg_manifest_base, offset);
++        program_size =
++            ia_css_sizeof_program_manifest(
++                program_needs_extension[i],
++                program_dependencies[i],
++                terminal_dependencies[i]);
++        prg_manifest_base += program_size;
++        offset += (uint32_t)program_size;
++    }
++
++    offset = blob->terminal_manifest_offset;
++    terminal_manifest_base = (char *) (((char *)blob) + offset);
++    for (i = 0; i < (int)terminal_count; i++) {
++        size_t terminal_size = 0;
++        ia_css_terminal_manifest_t *term_manifest =
++            (ia_css_terminal_manifest_t *)terminal_manifest_base;
++
++        ia_css_terminal_manifest_set_parent_offset(
++                (ia_css_terminal_manifest_t *)
++                terminal_manifest_base,
++                offset);
++        switch (terminal_type[i]) {
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++            result = ia_css_param_terminal_manifest_init(
++                (ia_css_param_terminal_manifest_t *)
++                term_manifest,
++                cached_in_param_section_count[j]);
++            if (0 == result) {
++                terminal_size =
++                ia_css_param_terminal_manifest_get_size(
++                    cached_in_param_section_count[j]);
++                j++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_param_terminal_manifest_init failed in cached in terminal\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++            result = ia_css_param_terminal_manifest_init(
++                (ia_css_param_terminal_manifest_t *)
++                term_manifest,
++                cached_out_param_section_count[k]);
++            if (0 == result) {
++                terminal_size =
++                ia_css_param_terminal_manifest_get_size(
++                    cached_out_param_section_count[k]);
++                k++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_param_terminal_manifest_init failed\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++        case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++            result = ia_css_spatial_param_terminal_manifest_init(
++                (ia_css_spatial_param_terminal_manifest_t *)
++                term_manifest,
++                spatial_param_section_count[l]);
++            if (0 == result) {
++                terminal_size =
++            ia_css_spatial_param_terminal_manifest_get_size(
++                spatial_param_section_count[l]);
++                l++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_PROGRAM:
++            result = ia_css_program_terminal_manifest_init(
++                (ia_css_program_terminal_manifest_t *)
++                term_manifest,
++                fragment_param_section_count[m],
++                kernel_fragment_seq_count[m]);
++            if (0 == result) {
++                terminal_size =
++                ia_css_program_terminal_manifest_get_size(
++                    fragment_param_section_count[m],
++                    kernel_fragment_seq_count[m]);
++                m++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_program_terminal_manifest_init failed in program terminal\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++            result = ia_css_program_control_init_terminal_manifest_init(
++                (ia_css_program_control_init_terminal_manifest_t *)
++                term_manifest,
++                program_count,
++                progctrlinit_load_section_counts,
++                progctrlinit_connect_section_counts);
++            if (0 == result) {
++                terminal_size =
++                ia_css_program_control_init_terminal_manifest_get_size(
++                    program_count,
++                    NULL,
++                    NULL);
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_program_control_init_terminal_manifest_init failed\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_DATA_IN:
++        case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++            terminal_size = sizeof(ia_css_data_terminal_manifest_t);
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++            result = ia_css_sliced_param_terminal_manifest_init(
++                (ia_css_sliced_param_terminal_manifest_t *)
++                term_manifest,
++                sliced_in_param_section_count[n]);
++            if (0 == result) {
++                terminal_size =
++            ia_css_sliced_param_terminal_manifest_get_size(
++                sliced_in_param_section_count[n]);
++                n++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_param_terminal_manifest_init in sliced terminal failed\n");
++            }
++            break;
++        case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++            result = ia_css_sliced_param_terminal_manifest_init(
++                (ia_css_sliced_param_terminal_manifest_t *)
++                term_manifest,
++                sliced_out_param_section_count[o]);
++            if (0 == result) {
++                terminal_size =
++                ia_css_sliced_param_terminal_manifest_get_size(
++                    sliced_out_param_section_count[o]);
++                n++;
++            } else {
++                IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++                    "ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
++            }
++            break;
++        default:
++            IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                "ia_css_program_group_manifest_init invalid argument\n");
++        }
++        term_manifest->size = (uint16_t)terminal_size;
++        /* index: i equal to terminal ID due to sorted of the terminals array */
++        term_manifest->ID = i;
++        term_manifest->terminal_type = terminal_type[i];
++        terminal_manifest_base += terminal_size;
++        offset += (uint32_t)terminal_size;
++    }
++
++    /* Set the private program group manifest blob offset */
++    blob->private_data_offset = offset;
++    offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
++                sizeof(uint64_t));
++
++    /* Set the RBM manifest blob offset */
++    blob->rbm_manifest_offset = offset;
++    offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
++                sizeof(uint64_t));
++
++    assert(offset <= UINT16_MAX);
++    blob->size = (uint16_t)offset;
++}
++#endif
++
++int ia_css_program_group_manifest_print(
++    const ia_css_program_group_manifest_t *manifest,
++    void *fid)
++{
++    int retval = -1;
++    int i;
++    uint8_t program_count, terminal_count;
++    ia_css_kernel_bitmap_t bitmap;
++    struct ia_css_psys_private_pg_data *priv_data;
++    ia_css_rbm_manifest_t *rbm_manifest;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++        "ia_css_program_group_manifest_print(): enter:\n");
++
++    NOT_USED(fid);
++
++    verifexit(manifest != NULL);
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "sizeof(manifest) = %d\n",
++        (int)ia_css_program_group_manifest_get_size(manifest));
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "alignment(manifest) = %d\n",
++        (int)ia_css_program_group_manifest_get_alignment(manifest));
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "program group ID = %d\n",
++        (int)ia_css_program_group_manifest_get_program_group_ID(
++            manifest));
++
++    program_count =
++        ia_css_program_group_manifest_get_program_count(manifest);
++    terminal_count =
++        ia_css_program_group_manifest_get_terminal_count(manifest);
++
++    bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "%d program manifests\n", (int)program_count);
++    for (i = 0; i < (int)program_count; i++) {
++        ia_css_program_manifest_t *program_manifest =
++            ia_css_program_group_manifest_get_prgrm_mnfst(
++                manifest, i);
++
++        retval = ia_css_program_manifest_print(program_manifest, fid);
++        verifjmpexit(retval == 0);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "%d terminal manifests\n", (int)terminal_count);
++    for (i = 0; i < (int)terminal_count; i++) {
++        ia_css_terminal_manifest_t *terminal_manifest =
++            ia_css_program_group_manifest_get_term_mnfst(
++                manifest, i);
++
++        retval = ia_css_terminal_manifest_print(
++                terminal_manifest, fid);
++        verifjmpexit(retval == 0);
++    }
++
++    priv_data =
++        (struct ia_css_psys_private_pg_data *)
++        ia_css_program_group_manifest_get_private_data(manifest);
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++        "private_data_offset %d\n", manifest->private_data_offset);
++
++    for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++            "PSA MUX id %d mux val %d\n", i,
++            priv_data->psa_mux_conf[i]);
++
++    }
++
++    for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++            "ISA MUX id %d mux val %d\n", i,
++            priv_data->isa_mux_conf[i]);
++
++    }
++
++#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
++    for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
++
++        if (priv_data->acb_route[i].in_select !=
++            NCI_ACB_PORT_INVALID) {
++
++            assert(priv_data->acb_route[i].in_select !=
++                NCI_ACB_PORT_INVALID &&
++                priv_data->acb_route[i].out_select !=
++                NCI_ACB_PORT_INVALID);
++
++            IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
++                "Route Cell id %d In %d Out %d\n", i,
++                priv_data->acb_route[i].in_select,
++                priv_data->acb_route[i].out_select);
++        }
++
++    }
++#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
++
++    for (i = 0; i < MAX_INPUT_BUFFER; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
++                priv_data->input_buffer_info[i].link_id);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
++                priv_data->input_buffer_info[i].buffer_base_addr);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
++                priv_data->input_buffer_info[i].bpe);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
++                priv_data->input_buffer_info[i].buffer_width);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
++                priv_data->input_buffer_info[i].buffer_height);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
++                priv_data->input_buffer_info[i].num_of_buffers);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
++                priv_data->input_buffer_info[i].dfm_port_addr);
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
++    }
++
++    rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
++    ia_css_rbm_manifest_print(rbm_manifest);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_group_manifest_print failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
+new file mode 100644
+index 000000000000..185baec014aa
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_program_manifest.c
+@@ -0,0 +1,972 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
++#include <ia_css_kernel_bitmap.h>
++
++#include <vied_nci_psys_system_global.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_psys_static_trace.h"
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <storage_class.h>
++#include <math_support.h>
++
++/* *****************************************************
++ * Functions to possibly inline
++ * ******************************************************/
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++/* *****************************************************
++ * Functions not to inline and available to firmware
++ * ******************************************************/
++bool ia_css_has_program_manifest_fixed_cell(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++    bool has_fixed_cell = false;
++    vied_nci_cell_ID_t cell_id;
++    vied_nci_cell_type_ID_t    cell_type_id;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_has_program_manifest_fixed_cell(): enter:\n");
++
++    verifexitval(manifest != NULL, EFAULT);
++
++    cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
++    cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
++
++    has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
++              (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++           "ia_css_has_program_manifest_fixed_cell invalid argument\n");
++        return false;
++    }
++    return has_fixed_cell;
++}
++
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
++    const ia_css_program_manifest_t            *manifest)
++{
++    DECLARE_ERRVAL
++    vied_nci_resource_bitmap_t    bitmap = 0;
++    int i = 0;
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_get_cells_bitmap(): enter:\n");
++
++    verifexitval(manifest != NULL, EFAULT);
++
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
++            bitmap |= (1 << manifest->cells[i]);
++        }
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++    }
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
++    }
++    return bitmap;
++}
++
++bool ia_css_is_program_manifest_subnode_program_type(
++    const ia_css_program_manifest_t *manifest)
++{
++    ia_css_program_type_t        program_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_is_program_manifest_subnode_program_type(): enter:\n");
++
++    program_type = ia_css_program_manifest_get_type(manifest);
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
++            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
++            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++}
++
++bool ia_css_is_program_manifest_supernode_program_type(
++    const ia_css_program_manifest_t *manifest)
++{
++    ia_css_program_type_t program_type;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++           "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
++
++    program_type = ia_css_program_manifest_get_type(manifest);
++
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++    return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
++            (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
++            (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
++}
++
++vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
++    const ia_css_program_manifest_t *manifest)
++{
++    DECLARE_ERRVAL
++
++    vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
++    int i = 0;
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_get_cell_ID(): enter:\n");
++
++    verifexitval(manifest != NULL, EFAULT);
++
++    for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++    }
++    cell_id = manifest->cells[0];
++EXIT:
++    if (!noerror()) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++          "ia_css_program_manifest_get_cell_ID invalid argument\n");
++        return VIED_NCI_N_CELL_ID;
++    }
++    return cell_id;
++}
++
++/* *****************************************************
++ * Functions not to inline and not available to firmware
++ * ******************************************************/
++#if !defined(__HIVECC)
++size_t ia_css_sizeof_program_manifest(
++    const uint8_t program_needs_extension,
++    const uint8_t program_dependency_count,
++    const uint8_t terminal_dependency_count)
++{
++    size_t    size = 0;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_sizeof_program_manifest(): enter:\n");
++
++    size += sizeof(ia_css_program_manifest_t);
++    if (program_needs_extension == 1) {
++        /* align manifest extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        size += sizeof(ia_css_program_manifest_ext_t);
++    }
++    size += program_dependency_count * sizeof(uint8_t);
++    size += terminal_dependency_count * sizeof(uint8_t);
++    /* align whole structure to 32 bit */
++    size = ceil_mul(size, sizeof(uint32_t));
++
++    return size;
++}
++
++int ia_css_program_manifest_set_program_ID(
++    ia_css_program_manifest_t            *manifest,
++    ia_css_program_ID_t id)
++{
++    int ret = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_program_ID(): enter:\n");
++
++    if (manifest != NULL) {
++        assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
++        manifest->ID = id;
++        ret = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++           "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
++    }
++    return ret;
++}
++
++int ia_css_program_manifest_set_parent_offset(
++    ia_css_program_manifest_t    *manifest,
++    int32_t program_offset)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_parent_offset(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    /* parent is at negative offset away from current program offset*/
++    assert((int16_t)(-program_offset) == -program_offset);
++    manifest->parent_offset = (int16_t)(-program_offset);
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_parent_offset failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_type(
++    ia_css_program_manifest_t                *manifest,
++    const ia_css_program_type_t                program_type)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_type(): enter:\n");
++
++    if (manifest != NULL) {
++        assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
++        manifest->program_type = (ia_css_program_type_t)program_type;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++              "ia_css_program_manifest_set_type failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_kernel_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const ia_css_kernel_bitmap_t            kernel_bitmap)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        manifest->kernel_bitmap = kernel_bitmap;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_cell_ID(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_cell_ID_t            cell_id)
++{
++    int    retval = -1;
++    int i = 0;
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_cell_ID(): enter:\n");
++    if (manifest != NULL) {
++        manifest->cells[0] = cell_id;
++        for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++            manifest->cells[i] = VIED_NCI_N_CELL_ID;
++        }
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++           "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_cell_type_ID(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_cell_type_ID_t            cell_type_id)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_cell_type_ID(): enter:\n");
++    if (manifest != NULL) {
++        manifest->cell_type_id = cell_type_id;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++void ia_css_program_manifest_set_input_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                   idx,
++    unsigned char                   val)
++{
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
++    if (manifest != NULL) {
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++        ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++        manifest_ext = ia_css_program_manifest_get_extension(manifest);
++        if (manifest_ext == NULL) {
++            return;
++        }
++        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
++        manifest_ext->dec_resources_input_terminal[idx] = val;
++#else
++        (void) idx;
++        (void) val;
++#endif
++    }
++}
++
++void ia_css_program_manifest_set_output_terminal_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                    idx,
++    unsigned char                    val)
++{
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
++    if (manifest != NULL) {
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++        ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++        manifest_ext = ia_css_program_manifest_get_extension(manifest);
++        if (manifest_ext == NULL) {
++            return;
++        }
++        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
++        manifest_ext->dec_resources_output_terminal[idx] = val;
++#else
++        (void) idx;
++        (void) val;
++        (void) manifest_ext;
++#endif
++    }
++}
++
++void ia_css_program_manifest_set_input_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                   idx,
++    unsigned char                   val)
++{
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_input_stream_id(): enter:\n");
++    if (manifest != NULL) {
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++        ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++        manifest_ext = ia_css_program_manifest_get_extension(manifest);
++        if (manifest_ext == NULL) {
++            return;
++        }
++        assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
++        manifest_ext->dec_resources_input[idx] = val;
++#else
++        (void) idx;
++        (void) val;
++#endif
++    }
++}
++
++void ia_css_program_manifest_set_output_stream_id(
++    ia_css_program_manifest_t   *manifest,
++    unsigned char                    idx,
++    unsigned char                    val)
++{
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_output_stream_id(): enter:\n");
++    if (manifest != NULL) {
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++        ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++        manifest_ext = ia_css_program_manifest_get_extension(manifest);
++        if (manifest_ext == NULL) {
++            return;
++        }
++        assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
++        manifest_ext->dec_resources_output[idx] = val;
++#else
++        (void) idx;
++        (void) val;
++#endif
++    }
++}
++
++int ia_css_program_manifest_set_cells_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_resource_bitmap_t    bitmap)
++{
++    int retval = -1;
++    int array_index = 0;
++    int bit_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
++
++    if (manifest != NULL) {
++        for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
++            if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
++                verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
++                manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
++                array_index++;
++            }
++        }
++        for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
++            manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
++        }
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
++    }
++EXIT:
++    return retval;
++}
++
++#if HAS_DFM
++int ia_css_program_manifest_set_dfm_port_bitmap(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_dfm_id_t          dfm_type_id,
++    const vied_nci_resource_bitmap_t     bitmap)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(manifest_ext != NULL);
++    manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
++    retval = 0;
++
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                "ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_dfm_active_port_bitmap(
++    ia_css_program_manifest_t           *manifest,
++    const vied_nci_dev_dfm_id_t          dfm_type_id,
++    const vied_nci_resource_bitmap_t     bitmap)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++            "ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(manifest_ext != NULL);
++    manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
++    retval = 0;
++
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                "ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_is_dfm_relocatable(
++    ia_css_program_manifest_t       *manifest,
++    const vied_nci_dev_dfm_id_t      dfm_type_id,
++    const uint8_t                    is_relocatable)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++            "ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL) {
++        return 0;
++    }
++    manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
++    retval = 0;
++
++    EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++                "ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
++    }
++
++    return retval;
++}
++#endif /* HAS_DFM */
++
++int ia_css_program_manifest_set_int_mem_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            int_mem_size)
++{
++    (void)manifest;
++    (void)mem_type_id;
++    if (int_mem_size != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_int_mem_size should not be called"
++            "(internally memory feature not used).\n");
++        return -1;
++    }
++    return 0;
++}
++
++int ia_css_program_manifest_set_ext_mem_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            ext_mem_size)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    if (manifest == NULL) {
++        return retval;
++    }
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && ext_mem_size == 0) {
++        return 0;
++    } else if (manifest_ext == NULL) {
++        return retval;
++    }
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
++
++    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
++        manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
++    }
++
++    return retval;
++}
++
++int ia_css_program_manifest_set_ext_mem_offset(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            ext_mem_offset)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    if (manifest == NULL) {
++        return retval;
++    }
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && ext_mem_offset ==
++        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
++        return 0;
++    } else if (manifest_ext == NULL) {
++        return retval;
++    }
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
++
++    if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
++        manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
++    }
++
++    return retval;
++}
++
++int ia_css_program_manifest_set_dev_chn_size(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t            dev_chn_id,
++    const vied_nci_resource_size_t            dev_chn_size)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    if (manifest == NULL) {
++        return retval;
++    }
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && dev_chn_size == 0) {
++        return 0;
++    } else if (manifest_ext == NULL) {
++        return retval;
++    }
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++        manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
++    }
++#else
++    NOT_USED(dev_chn_id);
++#endif
++    return retval;
++}
++
++int ia_css_program_manifest_set_dev_chn_offset(
++    ia_css_program_manifest_t            *manifest,
++    const vied_nci_dev_chn_ID_t            dev_chn_id,
++    const vied_nci_resource_size_t            dev_chn_offset)
++{
++    int retval = -1;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    if (manifest == NULL) {
++        return retval;
++    }
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext == NULL && dev_chn_offset ==
++        (vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
++        return 0;
++    } else if (manifest_ext == NULL) {
++        return retval;
++    }
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++               "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++    if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++        manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
++        retval = 0;
++    } else {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++         "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
++    }
++#else
++    NOT_USED(dev_chn_id);
++#endif
++    return retval;
++}
++
++int ia_css_program_manifest_set_program_dependency(
++    ia_css_program_manifest_t    *manifest,
++    const uint8_t            program_dependency,
++    const unsigned int        index)
++{
++    int    retval = -1;
++    uint8_t *program_dep_ptr;
++    uint8_t    program_dependency_count;
++    uint8_t    program_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_program_dependency(): enter:\n");
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    program_count =
++        ia_css_program_group_manifest_get_program_count(
++            ia_css_program_manifest_get_parent(manifest));
++
++    if ((index < program_dependency_count) &&
++        (program_dependency < program_count)) {
++        program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++                  manifest->program_dependency_offset +
++                  index*sizeof(uint8_t));
++         *program_dep_ptr = program_dependency;
++        retval = 0;
++    }
++
++    if (retval != 0) {
++        IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
++            program_dependency, index, retval);
++    }
++    return retval;
++}
++
++int ia_css_program_manifest_set_terminal_dependency(
++    ia_css_program_manifest_t            *manifest,
++    const uint8_t                    terminal_dependency,
++    const unsigned int                index)
++{
++    int    retval = -1;
++    uint8_t *terminal_dep_ptr;
++    uint8_t terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++    uint8_t terminal_count =
++        ia_css_program_group_manifest_get_terminal_count(
++            ia_css_program_manifest_get_parent(manifest));
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_program_manifest_set_terminal_dependency(): enter:\n");
++
++    if ((index < terminal_dependency_count) &&
++            (terminal_dependency < terminal_count)) {
++        terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++                  manifest->terminal_dependency_offset + index);
++         *terminal_dep_ptr = terminal_dependency;
++        retval = 0;
++    }
++
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++void ia_css_program_manifest_init(
++    ia_css_program_manifest_t    *blob,
++    const uint8_t    program_needs_extension,
++    const uint8_t    program_dependency_count,
++    const uint8_t    terminal_dependency_count)
++{
++    size_t size = 0;
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++        "ia_css_program_manifest_init(): enter:\n");
++
++    /*TODO: add assert*/
++    if (!blob)
++        return;
++
++    blob->ID = 1;
++    blob->program_dependency_count = program_dependency_count;
++    blob->terminal_dependency_count = terminal_dependency_count;
++
++    size += sizeof(ia_css_program_manifest_t);
++    if (program_needs_extension == 1) {
++        /* align start of extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        blob->program_extension_offset = size;
++        size += sizeof(ia_css_program_manifest_ext_t);
++    } else {
++        blob->program_extension_offset = 0;
++    }
++    blob->program_dependency_offset = size;
++    size += sizeof(uint8_t) * program_dependency_count;
++    blob->terminal_dependency_offset = size;
++    size += sizeof(uint8_t) * terminal_dependency_count;
++    /* align whole structure to 32 bit */
++    size = CEIL_MUL(size, sizeof(uint32_t));
++
++    blob->size = (uint8_t)ia_css_sizeof_program_manifest(
++        program_needs_extension,
++        program_dependency_count,
++        terminal_dependency_count);
++
++    assert(blob->size == size);
++    /* The following assert also implies that:
++     * blob->program_extension_offset,
++     * blob->program_dependency_offset,
++     * blob->terminal_dependency_offset,
++     * are <= UINT8_MAX
++     */
++    assert(size <= UINT8_MAX);
++}
++
++int ia_css_program_manifest_print(
++    const ia_css_program_manifest_t *manifest,
++    void *fid)
++{
++    int            retval = -1;
++    int            i, mem_index, dev_chn_index;
++
++    vied_nci_cell_type_ID_t    cell_type_id;
++    uint8_t                    program_dependency_count;
++    uint8_t                    terminal_dependency_count;
++    ia_css_kernel_bitmap_t    bitmap;
++    ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++               "ia_css_program_manifest_print(): enter:\n");
++
++    verifexit(manifest != NULL);
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
++        (int)ia_css_program_manifest_get_size(manifest));
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
++        (int)ia_css_program_manifest_get_program_ID(manifest));
++
++    bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
++    verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++    if (ia_css_has_program_manifest_fixed_cell(manifest)) {
++        vied_nci_cell_ID_t cell_id =
++                  ia_css_program_manifest_get_cell_ID(manifest);
++
++        cell_type_id = vied_nci_cell_get_type(cell_id);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
++            (int)cell_id);
++    } else {
++        cell_type_id =
++            ia_css_program_manifest_get_cell_type_ID(manifest);
++    }
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
++        (int)cell_type_id);
++
++    manifest_ext = ia_css_program_manifest_get_extension(manifest);
++    if (manifest_ext != NULL) {
++    for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
++         mem_index++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(internal mem) type = %d\n",
++        (int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
++    }
++
++    for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
++         mem_index++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(external mem) type = %d\n",
++            (int)(vied_nci_mem_type_ID_t)mem_index);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(external mem) size = %d\n",
++            manifest_ext->ext_mem_size[mem_index]);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(external mem) offset = %d\n",
++            manifest_ext->ext_mem_offset[mem_index]);
++    }
++#if HAS_DFM
++    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
++         dev_chn_index++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(device channel) type = %d\n",
++            (int)dev_chn_index);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(device channel) size = %d\n",
++            manifest_ext->dev_chn_size[dev_chn_index]);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(device channel) offset = %d\n",
++            manifest_ext->dev_chn_offset[dev_chn_index]);
++    }
++    for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
++        dev_chn_index++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(dfm port) type = %d\n",
++            (int)dev_chn_index);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(dfm port) port_bitmap = %x\n",
++            manifest_ext->dfm_port_bitmap[dev_chn_index]);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(dfm port) active_port_bitmap = %x\n",
++            manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(dfm port) is_dfm_relocatable = %d\n",
++            manifest_ext->is_dfm_relocatable[dev_chn_index]);
++    }
++#else
++    NOT_USED(dev_chn_index);
++#endif /* HAS_DFM */
++#ifdef USE_DEC400
++    for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++            "\tEncoder stream id for idx = %d is: %d \n",
++            i,
++            manifest_ext->dec_resources_input[i]);
++
++    }
++    for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++            "\tDecoder stream id for idx: = %d is: %d\n",
++            i,
++            manifest_ext->dec_resources_output[i]);
++
++    }
++#endif
++    }
++
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\ttype(cells) bitmap = %d\n",
++            manifest->cells[i]);
++    }
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    if (program_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "program_dependencies[%d] {};\n",
++            program_dependency_count);
++    } else {
++        uint8_t prog_dep;
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "program_dependencies[%d] {\n",
++            program_dependency_count);
++        for (i = 0; i < (int)program_dependency_count - 1; i++) {
++            prog_dep =
++            ia_css_program_manifest_get_program_dependency(
++                manifest, i);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "\t %4d,\n", prog_dep);
++        }
++        prog_dep =
++        ia_css_program_manifest_get_program_dependency(manifest, i);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
++        (void)prog_dep;
++    }
++
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++    if (terminal_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "terminal_dependencies[%d] {};\n",
++            terminal_dependency_count);
++    } else {
++        uint8_t term_dep;
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "terminal_dependencies[%d] {\n",
++            terminal_dependency_count);
++        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
++            term_dep =
++            ia_css_program_manifest_get_terminal_dependency(
++                manifest, i);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "\t %4d,\n", term_dep);
++        }
++        term_dep =
++           ia_css_program_manifest_get_terminal_dependency(manifest, i);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
++        (void)term_dep;
++    }
++    (void)cell_type_id;
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_program_manifest_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
+new file mode 100644
+index 000000000000..c71219549595
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal.c
+@@ -0,0 +1,534 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_terminal_private_types.h"
++#include "ia_css_terminal_types.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_terminal_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/*
++ * This source file is created with the intention of sharing and
++ * compiled for host and firmware. Since there is no native 64bit
++ * data type support for firmware this wouldn't compile for SP
++ * tile. The part of the file that is not compilable are marked
++ * with the following __VIED_CELL marker and this comment. Once we
++ * come up with a solution to address this issue this will be
++ * removed.
++ */
++#if !defined(__VIED_CELL)
++size_t ia_css_sizeof_terminal(
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    size_t size = 0;
++    uint16_t fragment_count =
++        ia_css_program_group_param_get_fragment_count(param);
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
++        (CHAR_BIT * sizeof(ia_css_data_terminal_t)));
++
++    COMPILATION_ERROR_IF(
++        0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_sizeof_terminal(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
++        const ia_css_param_terminal_manifest_t *param_term_man =
++            (const ia_css_param_terminal_manifest_t *)manifest;
++        verifexit(param_term_man != NULL);
++        if (ia_css_terminal_manifest_get_type(manifest) ==
++                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
++            size = ia_css_param_in_terminal_get_descriptor_size(
++            param_term_man->param_manifest_section_desc_count);
++        } else if (ia_css_terminal_manifest_get_type(manifest) ==
++                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++            size = ia_css_param_out_terminal_get_descriptor_size(
++            param_term_man->param_manifest_section_desc_count,
++            fragment_count);
++        } else {
++            assert(NULL == "Invalid parameter terminal type");
++            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                "ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
++            verifjmpexit(0);
++        }
++    } else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
++        size += sizeof(ia_css_data_terminal_t);
++        size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
++    } else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
++        ia_css_program_terminal_manifest_t *prog_term_man =
++            (ia_css_program_terminal_manifest_t *)manifest;
++
++        size = ia_css_program_terminal_get_descriptor_size(
++            fragment_count,
++            prog_term_man->
++            fragment_param_manifest_section_desc_count,
++            prog_term_man->
++            kernel_fragment_sequencer_info_manifest_info_count,
++            (fragment_count * prog_term_man->
++            max_kernel_fragment_sequencer_command_desc));
++    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                manifest)) {
++        ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
++            (ia_css_spatial_param_terminal_manifest_t *)manifest;
++        size = ia_css_spatial_param_terminal_get_descriptor_size(
++        spatial_param_term->
++        frame_grid_param_manifest_section_desc_count,
++            fragment_count);
++    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++                manifest)) {
++        ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
++            (ia_css_program_control_init_terminal_manifest_t *)manifest;
++        ia_css_program_group_manifest_t *pg_manifest =
++            ia_css_terminal_manifest_get_parent(manifest);
++        ia_css_kernel_bitmap_t kernel_bitmap =
++            ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++        verifjmpexit(pg_manifest != NULL);
++        size = ia_css_program_control_init_terminal_get_descriptor_size(
++            progctrlinit_term_man, pg_manifest, kernel_bitmap);
++    }
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_sizeof_terminal invalid argument\n");
++    }
++    return size;
++}
++
++ia_css_terminal_t *ia_css_terminal_create(
++    void *raw_mem,
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_param_t *terminal_param,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    char *terminal_raw_ptr;
++    ia_css_terminal_t *terminal = NULL;
++    uint16_t fragment_count;
++    int i, j;
++    int retval = -1;
++    ia_css_program_group_param_t *param;
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
++        manifest, terminal_param);
++
++    param = ia_css_terminal_param_get_parent(terminal_param);
++    fragment_count = ia_css_program_group_param_get_fragment_count(param);
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    terminal_raw_ptr = (char *) raw_mem;
++
++    terminal = (ia_css_terminal_t *) terminal_raw_ptr;
++    verifexit(terminal != NULL);
++
++    terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
++    verifexit(ia_css_terminal_set_type(
++        terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
++
++    terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
++
++    verifexit(ia_css_terminal_set_buffer(terminal,
++                VIED_NULL) == 0);
++
++    if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
++        ia_css_data_terminal_t *dterminal =
++            (ia_css_data_terminal_t *)terminal;
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(dterminal);
++        ia_css_kernel_bitmap_t intersection =
++            ia_css_kernel_bitmap_intersection(enable_bitmap,
++            ia_css_data_terminal_manifest_get_kernel_bitmap(
++            (const ia_css_data_terminal_manifest_t *)manifest));
++
++        verifexit(frame != NULL);
++        verifexit(ia_css_frame_set_buffer_state(
++                frame, IA_CSS_BUFFER_NULL) == 0);
++        verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
++                    true);
++
++        terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
++        dterminal->fragment_descriptor_offset =
++            (uint16_t) (terminal_raw_ptr - (char *)terminal);
++
++        dterminal->kernel_id = 0;
++        while (!ia_css_is_kernel_bitmap_empty(intersection)) {
++            intersection = ia_css_kernel_bitmap_shift(
++                    intersection);
++            dterminal->kernel_id++;
++        }
++        assert(dterminal->kernel_id > 0);
++        dterminal->kernel_id -= 1;
++
++        /* some terminal and fragment initialization */
++        dterminal->frame_descriptor.frame_format_type =
++            terminal_param->frame_format_type;
++        for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
++            dterminal->frame_descriptor.dimension[i] =
++                terminal_param->dimensions[i];
++        }
++        dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
++            terminal_param->stride;
++        dterminal->frame_descriptor.bpp = terminal_param->bpp;
++        dterminal->frame_descriptor.bpe = terminal_param->bpe;
++        switch (dterminal->frame_descriptor.frame_format_type) {
++        case IA_CSS_DATA_FORMAT_UYVY:
++        case IA_CSS_DATA_FORMAT_YUYV:
++        case IA_CSS_DATA_FORMAT_YUV420_LINE:
++        case IA_CSS_DATA_FORMAT_Y800:
++        case IA_CSS_DATA_FORMAT_RGB565:
++        case IA_CSS_DATA_FORMAT_RGBA888:
++        case IA_CSS_DATA_FORMAT_BAYER_GRBG:
++        case IA_CSS_DATA_FORMAT_BAYER_RGGB:
++        case IA_CSS_DATA_FORMAT_BAYER_BGGR:
++        case IA_CSS_DATA_FORMAT_BAYER_GBRG:
++        case IA_CSS_DATA_FORMAT_RAW:
++        case IA_CSS_DATA_FORMAT_RAW_PACKED:
++        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
++        case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
++        case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
++        case IA_CSS_DATA_FORMAT_IR:
++            dterminal->frame_descriptor.plane_count = 1;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            break;
++        case IA_CSS_DATA_FORMAT_NV12:
++        case IA_CSS_DATA_FORMAT_NV21:
++        case IA_CSS_DATA_FORMAT_NV16:
++        case IA_CSS_DATA_FORMAT_NV61:
++        case IA_CSS_DATA_FORMAT_P010:
++        case IA_CSS_DATA_FORMAT_P010_MSB:
++        case IA_CSS_DATA_FORMAT_P016:
++        case IA_CSS_DATA_FORMAT_P016_MSB:
++        case IA_CSS_DATA_FORMAT_P012_MSB:
++            dterminal->frame_descriptor.plane_count = 2;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            break;
++        case IA_CSS_DATA_FORMAT_P010_TILEY:
++        case IA_CSS_DATA_FORMAT_P016_TILEY:
++        case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
++        case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
++        case IA_CSS_DATA_FORMAT_NV12_TILEY:
++            dterminal->frame_descriptor.plane_count = 2;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
++            break;
++        case IA_CSS_DATA_FORMAT_YUV444:
++        case IA_CSS_DATA_FORMAT_RGB888:
++        case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
++            dterminal->frame_descriptor.plane_count = 3;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            break;
++        case IA_CSS_DATA_FORMAT_YUV420:
++        case IA_CSS_DATA_FORMAT_YV12:
++            dterminal->frame_descriptor.plane_count = 3;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            break;
++        case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
++            dterminal->frame_descriptor.plane_count = 4;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
++            dterminal->frame_descriptor.plane_offsets[3] =
++                dterminal->frame_descriptor.plane_offsets[2] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            break;
++        default:
++            /* Unset, resulting in potential terminal connect issues */
++            dterminal->frame_descriptor.plane_count = 1;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            break;
++        }
++        /*
++         * Initial solution for single fragment initialization
++         * TODO:
++         * where to get the fragment description params from???
++         */
++        if (fragment_count > 0) {
++            ia_css_fragment_descriptor_t *fragment_descriptor =
++                (ia_css_fragment_descriptor_t *)
++                terminal_raw_ptr;
++
++            fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
++                terminal_param->index[IA_CSS_COL_DIMENSION];
++            fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
++                terminal_param->index[IA_CSS_ROW_DIMENSION];
++            fragment_descriptor->offset[0] =
++                terminal_param->offset;
++            for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
++                fragment_descriptor->dimension[i] =
++                    terminal_param->fragment_dimensions[i];
++            }
++        }
++        /* end fragment stuff */
++
++        /* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
++        dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++    } else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
++            true) {
++        ia_css_param_terminal_t *pterminal =
++            (ia_css_param_terminal_t *)terminal;
++        uint16_t section_count =
++            ((const ia_css_param_terminal_manifest_t *)manifest)->
++            param_manifest_section_desc_count;
++        size_t curr_offset = 0;
++
++        pterminal->param_section_desc_offset =
++            sizeof(ia_css_param_terminal_t);
++
++        for (i = 0; i < section_count; i++) {
++            ia_css_param_section_desc_t *section =
++            ia_css_param_in_terminal_get_param_section_desc(
++                    pterminal, i);
++            const ia_css_param_manifest_section_desc_t *
++                man_section =
++        ia_css_param_terminal_manifest_get_prm_sct_desc(
++            (const ia_css_param_terminal_manifest_t *)manifest, i);
++
++            verifjmpexit(man_section != NULL);
++            verifjmpexit(section != NULL);
++
++            section->mem_size = man_section->max_mem_size;
++            section->mem_offset = curr_offset;
++            curr_offset += man_section->max_mem_size;
++        }
++    } else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
++            true &&
++        ia_css_terminal_manifest_get_type(manifest) ==
++        IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
++        ia_css_program_terminal_t *prog_terminal =
++            (ia_css_program_terminal_t *)terminal;
++        const ia_css_program_terminal_manifest_t *prog_terminal_man =
++            (const ia_css_program_terminal_manifest_t *)manifest;
++        verifjmpexit(prog_terminal_man != NULL);
++
++        ia_css_kernel_fragment_sequencer_info_desc_t
++        *sequencer_info_desc_base = NULL;
++        uint16_t section_count = prog_terminal_man->
++        fragment_param_manifest_section_desc_count;
++        uint16_t manifest_info_count =
++            prog_terminal_man->
++            kernel_fragment_sequencer_info_manifest_info_count;
++        /* information needs to come from user or manifest once
++         * the size sizeof function is updated.
++         */
++        uint16_t nof_command_objs = 0;
++        size_t curr_offset = 0;
++
++        prog_terminal->kernel_fragment_sequencer_info_desc_offset =
++            sizeof(ia_css_program_terminal_t);
++        prog_terminal->fragment_param_section_desc_offset =
++            prog_terminal->
++            kernel_fragment_sequencer_info_desc_offset +
++            (fragment_count * manifest_info_count *
++            sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++            (nof_command_objs *
++            sizeof(
++            ia_css_kernel_fragment_sequencer_command_desc_t));
++
++        NOT_USED(sequencer_info_desc_base);
++        /*Save fragments set fragment_count to 1*/
++        fragment_count = 1;
++        for (i = 0; i < fragment_count; i++) {
++            for (j = 0; j < section_count; j++) {
++                ia_css_fragment_param_section_desc_t *section =
++            ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++                    prog_terminal, i, j, section_count);
++            const ia_css_fragment_param_manifest_section_desc_t *
++            man_section =
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
++                (prog_terminal_man, j);
++
++                verifjmpexit(man_section != NULL);
++                verifjmpexit(section != NULL);
++
++                section->mem_size = man_section->max_mem_size;
++                section->mem_offset = curr_offset;
++                curr_offset += man_section->max_mem_size;
++            }
++
++            sequencer_info_desc_base =
++        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++                    prog_terminal, i, 0,
++                    manifest_info_count);
++        prog_terminal->payload_fragment_stride = curr_offset;
++
++            /*
++             * This offset cannot be initialized properly
++             * since the number of commands in every sequencer
++             * is not known at this point
++             */
++            /*for (j = 0; j < manifest_info_count; j++) {
++                sequencer_info_desc_base[j].
++                    command_desc_offset =
++                prog_terminal->
++                kernel_fragment_sequencer_info_desc_offset +
++                (manifest_info_count *
++                sizeof(
++                ia_css_kernel_fragment_sequencer_info_desc_t) +
++                (nof_command_objs *
++                sizeof(
++                ia_css_kernel_fragment_sequencer_command_desc_t
++                ));
++            }*/
++        }
++    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                manifest) == true) {
++        ia_css_spatial_param_terminal_t *spatial_param_terminal =
++            (ia_css_spatial_param_terminal_t *)terminal;
++        ia_css_spatial_param_terminal_manifest_t *
++            spatia_param_terminal_man =
++            (ia_css_spatial_param_terminal_manifest_t *)manifest;
++
++        /* Initialize the spatial terminal structure */
++        spatial_param_terminal->fragment_grid_desc_offset =
++            sizeof(ia_css_spatial_param_terminal_t);
++        spatial_param_terminal->frame_grid_param_section_desc_offset =
++            spatial_param_terminal->fragment_grid_desc_offset +
++            (fragment_count * sizeof(ia_css_fragment_grid_desc_t));
++        spatial_param_terminal->kernel_id =
++            spatia_param_terminal_man->kernel_id;
++    } else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
++            true) {
++        ia_css_sliced_param_terminal_t *sliced_param_terminal =
++            (ia_css_sliced_param_terminal_t *)terminal;
++        ia_css_sliced_param_terminal_manifest_t
++        *sliced_param_terminal_man =
++            (ia_css_sliced_param_terminal_manifest_t *)manifest;
++
++        /* Initialize the sliced terminal structure */
++        sliced_param_terminal->fragment_slice_desc_offset =
++            sizeof(ia_css_sliced_param_terminal_t);
++        sliced_param_terminal->kernel_id =
++            sliced_param_terminal_man->kernel_id;
++    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++            manifest) == true) {
++        ia_css_program_group_manifest_t *pg_manifest =
++            ia_css_terminal_manifest_get_parent(manifest);
++        ia_css_program_group_param_t *pg_param =
++            ia_css_terminal_param_get_parent(terminal_param);
++        ia_css_kernel_bitmap_t kernel_bitmap;
++
++        verifjmpexit(pg_manifest != NULL && pg_param != NULL);
++        kernel_bitmap =
++            ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
++
++        verifjmpexit(ia_css_program_control_init_terminal_init(
++            (ia_css_program_control_init_terminal_t *)
++            terminal,
++            (const ia_css_program_control_init_terminal_manifest_t *)
++            manifest, pg_manifest, kernel_bitmap) == 0);
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
++            EFAULT);
++        goto EXIT;
++    }
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++                   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
++                   terminal->ID);
++
++    retval = 0;
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_terminal_create invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_create failed (%i)\n", retval);
++        terminal = ia_css_terminal_destroy(terminal);
++    }
++    return terminal;
++}
++
++ia_css_terminal_t *ia_css_terminal_destroy(
++    ia_css_terminal_t *terminal)
++{
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
++    return terminal;
++}
++
++uint16_t ia_css_param_terminal_compute_section_count(
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
++{
++    uint16_t section_count = 0;
++
++    NOT_USED(param);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_param_terminal_compute_section_count(): enter:\n");
++
++    verifexit(manifest != NULL);
++    section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
++                param_manifest_section_desc_count;
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_param_terminal_compute_section_count: invalid argument\n");
++    }
++    return section_count;
++}
++#endif /* !defined(__VIED_CELL) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
+new file mode 100644
+index 000000000000..dcb58a915aca
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_psys_terminal_manifest.c
+@@ -0,0 +1,776 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_psys_terminal_manifest.h>
++
++/* Data object types on the terminals */
++#include <ia_css_program_group_data.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
++#include <ia_css_kernel_bitmap.h>
++
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#include <error_support.h>
++#include <print_support.h>
++#include <misc_support.h>
++#include "ia_css_psys_static_trace.h"
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_terminal_manifest_impl.h"
++#endif
++#include "ia_css_terminal_manifest.h"
++
++/* We need to refactor those files in order to build in the firmware only
++   what is needed, switches are put current to workaround compilation problems
++   in the firmware (for example lack of uint64_t support)
++   supported in the firmware
++  */
++#if !defined(__HIVECC)
++static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
++    "IA_CSS_TERMINAL_TYPE_DATA_IN",
++    "IA_CSS_TERMINAL_TYPE_DATA_OUT",
++    "IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
++    /**< Type 1-5 parameter input */
++    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
++    /**< Type 1-5 parameter output */
++    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
++    /**< Represent the new type of terminal for
++     * the "spatial dependent parameters", when params go in
++     */
++    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
++    /**< Represent the new type of terminal for
++     * the "spatial dependent parameters", when params go out
++     */
++    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
++    /**< Represent the new type of terminal for
++     * the explicit slicing, when params go in
++     */
++    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
++    /**< Represent the new type of terminal for
++     * the explicit slicing, when params go out
++     */
++    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
++    /**< State (private data) input */
++    "IA_CSS_TERMINAL_TYPE_STATE_IN",
++    /**< State (private data) output */
++    "IA_CSS_TERMINAL_TYPE_STATE_OUT",
++    "IA_CSS_TERMINAL_TYPE_PROGRAM",
++    "IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
++    "UNDEFINED_TERMINAL_TYPE"};
++
++int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
++    ia_css_data_terminal_manifest_t *manifest,
++    const unsigned int index)
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
++
++    if (manifest != NULL) {
++        ia_css_kernel_bitmap_t kernel_bitmap =
++                    ia_css_kernel_bitmap_clear();
++
++        kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
++        verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
++        verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
++                manifest, kernel_bitmap) == 0);
++        retval = 0;
++    }
++
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++int ia_css_data_terminal_manifest_set_min_size(
++    ia_css_data_terminal_manifest_t    *manifest,
++    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_min_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    manifest->min_size[IA_CSS_COL_DIMENSION] =
++        min_size[IA_CSS_COL_DIMENSION];
++    manifest->min_size[IA_CSS_ROW_DIMENSION] =
++        min_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_data_terminal_manifest_set_max_size(
++    ia_css_data_terminal_manifest_t    *manifest,
++    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_max_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    manifest->max_size[IA_CSS_COL_DIMENSION] =
++        max_size[IA_CSS_COL_DIMENSION];
++    manifest->max_size[IA_CSS_ROW_DIMENSION] =
++        max_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
++    }
++    return retval;
++}
++#endif
++
++int ia_css_data_terminal_manifest_get_min_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_min_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    min_size[IA_CSS_COL_DIMENSION] =
++        manifest->min_size[IA_CSS_COL_DIMENSION];
++    min_size[IA_CSS_ROW_DIMENSION] =
++        manifest->min_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_data_terminal_manifest_get_max_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_max_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    max_size[IA_CSS_COL_DIMENSION] =
++        manifest->max_size[IA_CSS_COL_DIMENSION];
++    max_size[IA_CSS_ROW_DIMENSION] =
++        manifest->max_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
++    }
++    return retval;
++}
++
++#if !defined(__HIVECC)
++int ia_css_data_terminal_manifest_set_min_fragment_size(
++    ia_css_data_terminal_manifest_t    *manifest,
++    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
++        min_size[IA_CSS_COL_DIMENSION];
++    manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
++        min_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_data_terminal_manifest_set_max_fragment_size(
++    ia_css_data_terminal_manifest_t    *manifest,
++    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
++        max_size[IA_CSS_COL_DIMENSION];
++    manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
++        max_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
++    }
++    return retval;
++}
++#endif
++
++int ia_css_data_terminal_manifest_get_min_fragment_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    min_size[IA_CSS_COL_DIMENSION] =
++        manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
++    min_size[IA_CSS_ROW_DIMENSION] =
++        manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_data_terminal_manifest_get_max_fragment_size(
++    const ia_css_data_terminal_manifest_t *manifest,
++    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++    int retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++        "ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
++
++    verifexit(manifest != NULL);
++
++    max_size[IA_CSS_COL_DIMENSION] =
++        manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
++    max_size[IA_CSS_ROW_DIMENSION] =
++        manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
++    retval = 0;
++
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++            "ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
++    }
++    return retval;
++}
++
++/* We need to refactor those files in order to build in the firmware only
++   what is needed, switches are put current to workaround compilation problems
++   in the firmware (for example lack of uint64_t support)
++   supported in the firmware
++  */
++#if !defined(__HIVECC)
++
++#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
++    INFO, "%s:\t%d %d\n", \
++    (name), \
++    (var)[IA_CSS_COL_DIMENSION], \
++    (var)[IA_CSS_ROW_DIMENSION])
++
++int ia_css_terminal_manifest_print(
++    const ia_css_terminal_manifest_t *manifest,
++    void *fid)
++{
++    int retval = -1;
++    ia_css_terminal_type_t terminal_type =
++        ia_css_terminal_manifest_get_type(manifest);
++
++    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++        "ia_css_terminal_manifest_print(): enter:\n");
++
++    verifexit(manifest != NULL);
++    NOT_USED(fid);
++    NOT_USED(terminal_type_strings);
++
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
++        (int)ia_css_terminal_manifest_get_size(manifest));
++#ifndef __XTENSA_FW__
++    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
++            terminal_type_strings[terminal_type]);
++#endif
++    if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++        ia_css_param_terminal_manifest_t *pterminal_manifest =
++            (ia_css_param_terminal_manifest_t *)manifest;
++        uint16_t section_count =
++            pterminal_manifest->param_manifest_section_desc_count;
++        int    i;
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "sections(manifest) = %d\n", (int)section_count);
++        for (i = 0; i < section_count; i++) {
++            const ia_css_param_manifest_section_desc_t *manifest =
++        ia_css_param_terminal_manifest_get_prm_sct_desc(
++            pterminal_manifest, i);
++            verifjmpexit(manifest != NULL);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "mem_type_id = %d\n",
++                (int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "max_mem_size = %d\n",
++                (int)manifest->max_mem_size);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "region_id = %d\n",
++                (int)ia_css_param_manifest_section_desc_get_region_id(manifest));
++        }
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
++        ia_css_sliced_param_terminal_manifest_t
++        *sliced_terminal_manifest =
++            (ia_css_sliced_param_terminal_manifest_t *)manifest;
++        uint32_t kernel_id;
++        uint16_t section_count;
++        uint16_t section_idx;
++
++        kernel_id = sliced_terminal_manifest->kernel_id;
++        section_count =
++            sliced_terminal_manifest->sliced_param_section_count;
++
++        NOT_USED(kernel_id);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "kernel_id = %d\n", (int)kernel_id);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "section_count = %d\n", (int)section_count);
++
++        for (section_idx = 0; section_idx < section_count;
++            section_idx++) {
++            ia_css_sliced_param_manifest_section_desc_t
++                *sliced_param_manifest_section_desc;
++
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "section %d\n", (int)section_idx);
++            sliced_param_manifest_section_desc =
++        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++                sliced_terminal_manifest, section_idx);
++            verifjmpexit(sliced_param_manifest_section_desc !=
++                NULL);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "mem_type_id = %d\n",
++            (int)sliced_param_manifest_section_desc->mem_type_id);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "region_id = %d\n",
++            (int)sliced_param_manifest_section_desc->region_id);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "max_mem_size = %d\n",
++            (int)sliced_param_manifest_section_desc->max_mem_size);
++        }
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
++        ia_css_program_terminal_manifest_t *program_terminal_manifest =
++            (ia_css_program_terminal_manifest_t *)manifest;
++        uint32_t sequencer_info_kernel_id;
++        uint16_t max_kernel_fragment_sequencer_command_desc;
++        uint16_t kernel_fragment_sequencer_info_manifest_info_count;
++        uint16_t seq_info_idx;
++        uint16_t section_count =
++            program_terminal_manifest->fragment_param_manifest_section_desc_count;
++        uint16_t sec_idx;
++
++        sequencer_info_kernel_id =
++            program_terminal_manifest->sequencer_info_kernel_id;
++        max_kernel_fragment_sequencer_command_desc =
++            program_terminal_manifest->
++            max_kernel_fragment_sequencer_command_desc;
++        kernel_fragment_sequencer_info_manifest_info_count =
++            program_terminal_manifest->
++            kernel_fragment_sequencer_info_manifest_info_count;
++
++        NOT_USED(sequencer_info_kernel_id);
++        NOT_USED(max_kernel_fragment_sequencer_command_desc);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "sequencer_info_kernel_id = %d\n",
++            (int)sequencer_info_kernel_id);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "max_kernel_fragment_sequencer_command_desc = %d\n",
++            (int)max_kernel_fragment_sequencer_command_desc);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "kernel_fragment_sequencer_info_manifest_info_count = %d\n",
++            (int)
++            kernel_fragment_sequencer_info_manifest_info_count);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
++        for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
++            const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
++        ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++            program_terminal_manifest, sec_idx);
++            NOT_USED(ptmanifest);
++            verifjmpexit(manifest != NULL);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "mem_type_id = %d\n",
++                (int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "max_mem_size = %d\n",
++                (int)ptmanifest->max_mem_size);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "region_id = %d\n",
++                (int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
++        }
++        for (seq_info_idx = 0; seq_info_idx <
++            kernel_fragment_sequencer_info_manifest_info_count;
++                seq_info_idx++) {
++            ia_css_kernel_fragment_sequencer_info_manifest_desc_t
++                *sequencer_info_manifest_desc;
++
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "sequencer info %d\n", (int)seq_info_idx);
++            sequencer_info_manifest_desc =
++        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
++                (program_terminal_manifest, seq_info_idx);
++            verifjmpexit(sequencer_info_manifest_desc != NULL);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "min_fragment_grid_slice_dimension[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "max_fragment_grid_slice_dimension[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_slice_dimension[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_slice_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "min_fragment_grid_slice_count[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "max_fragment_grid_slice_count[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_slice_count[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_slice_count[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_point_decimation_factor[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_point_decimation_factor[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++            min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++            min_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++            max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++            max_fragment_grid_overlay_pixel_topleft_index[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                min_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++                "max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_COL_DIMENSION],
++                (int)sequencer_info_manifest_desc->
++                max_fragment_grid_overlay_pixel_dimension[
++                        IA_CSS_ROW_DIMENSION]);
++        }
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++        ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
++            (ia_css_program_control_init_terminal_manifest_t *)manifest;
++        ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
++
++        ia_css_data_terminal_manifest_t *dterminal_manifest =
++            (ia_css_data_terminal_manifest_t *)manifest;
++        int i;
++
++        NOT_USED(dterminal_manifest);
++
++        verifexit(ia_css_kernel_bitmap_print(
++            ia_css_data_terminal_manifest_get_kernel_bitmap(
++                dterminal_manifest), fid) == 0);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "formats(manifest) = %04x\n",
++        (int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
++            dterminal_manifest));
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "connection(manifest) = %04x\n",
++        (int)ia_css_data_terminal_manifest_get_connection_bitmap(
++            dterminal_manifest));
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "dependent(manifest) = %d\n",
++            (int)dterminal_manifest->terminal_dependency);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\tmin_size[%d]   = {\n",
++            IA_CSS_N_DATA_DIMENSION);
++        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "\t\t%4d,\n", dterminal_manifest->min_size[i]);
++        }
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\t\t%4d }\n", dterminal_manifest->min_size[i]);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
++        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\t\t%4d,\n", dterminal_manifest->max_size[i]);
++        }
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\t\t%4d }\n", dterminal_manifest->max_size[i]);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\tmin_fragment_size[%d]   = {\n",
++            IA_CSS_N_DATA_DIMENSION);
++        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "\t\t%4d,\n",
++                dterminal_manifest->min_fragment_size[i]);
++        }
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\t\t%4d }\n",
++            dterminal_manifest->min_fragment_size[i]);
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\tmax_fragment_size[%d]   = {\n",
++            IA_CSS_N_DATA_DIMENSION);
++        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++                "\t\t%4d,\n",
++                dterminal_manifest->max_fragment_size[i]);
++        }
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++            "\t\t%4d }\n",
++            dterminal_manifest->max_fragment_size[i]);
++
++    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
++        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
++
++        ia_css_spatial_param_terminal_manifest_t *stm =
++            (ia_css_spatial_param_terminal_manifest_t *)manifest;
++        ia_css_frame_grid_param_manifest_section_desc_t *sec;
++        int sec_count =
++            stm->frame_grid_param_manifest_section_desc_count;
++        int sec_index;
++
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
++            stm->kernel_id);
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
++            stm->compute_units_p_elem);
++#ifndef __XTENSA_FW__
++        PRINT_DIMENSION("min_fragment_grid_dimension",
++            stm->common_fragment_grid_desc.min_fragment_grid_dimension);
++        PRINT_DIMENSION("max_fragment_grid_dimension",
++            stm->common_fragment_grid_desc.max_fragment_grid_dimension);
++        PRINT_DIMENSION("min_frame_grid_dimension",
++            stm->frame_grid_desc.min_frame_grid_dimension);
++        PRINT_DIMENSION("max_frame_grid_dimension",
++            stm->frame_grid_desc.max_frame_grid_dimension);
++#endif
++        for (sec_index = 0; sec_index < sec_count; sec_index++) {
++            sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++                stm, sec_index);
++            verifjmpexit(sec != NULL);
++
++            IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
++                sec->mem_type_id);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
++                sec->region_id);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
++                sec->elem_size);
++            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
++                sec->max_mem_size);
++        }
++    } else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
++        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++            "terminal type can not be pretty printed, not supported\n");
++    }
++
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++            "ia_css_terminal_manifest_print failed (%i)\n",
++            retval);
++    }
++    return retval;
++}
++
++/* Program control init Terminal */
++unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
++    const ia_css_program_control_init_manifest_program_desc_t *prog)
++{
++    assert(prog);
++    return prog->connect_section_count;
++}
++
++unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
++    const ia_css_program_control_init_manifest_program_desc_t *prog)
++{
++    assert(prog);
++    return prog->load_section_count;
++}
++
++unsigned int ia_css_program_control_init_terminal_manifest_get_size(
++    const uint16_t nof_programs,
++    const uint16_t *nof_load_sections,
++    const uint16_t *nof_connect_sections)
++{
++    (void)nof_load_sections; /* might be needed in future */
++    (void)nof_connect_sections; /* might be needed in future */
++
++    return sizeof(ia_css_program_control_init_terminal_manifest_t) +
++        nof_programs *
++        sizeof(ia_css_program_control_init_manifest_program_desc_t);
++}
++
++ia_css_program_control_init_manifest_program_desc_t *
++ia_css_program_control_init_terminal_manifest_get_program_desc(
++    const ia_css_program_control_init_terminal_manifest_t *terminal,
++    unsigned int program)
++{
++    ia_css_program_control_init_manifest_program_desc_t *progs;
++
++    assert(terminal != NULL);
++    assert(program < terminal->program_count);
++
++    progs = (ia_css_program_control_init_manifest_program_desc_t *)
++        ((const char *)terminal + terminal->program_desc_offset);
++
++    return &progs[program];
++}
++
++int ia_css_program_control_init_terminal_manifest_init(
++    ia_css_program_control_init_terminal_manifest_t *terminal,
++    const uint16_t nof_programs,
++    const uint16_t *nof_load_sections,
++    const uint16_t *nof_connect_sections)
++{
++    unsigned int i;
++    ia_css_program_control_init_manifest_program_desc_t *progs;
++
++    if (terminal == NULL) {
++        return -EFAULT;
++    }
++
++    terminal->program_count = nof_programs;
++    terminal->program_desc_offset =
++        sizeof(ia_css_program_control_init_terminal_manifest_t);
++
++    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
++        terminal, 0);
++
++    for (i = 0; i < nof_programs; i++) {
++        progs[i].load_section_count = nof_load_sections[i];
++        progs[i].connect_section_count = nof_connect_sections[i];
++    }
++    return 0;
++}
++
++void ia_css_program_control_init_terminal_manifest_print(
++    ia_css_program_control_init_terminal_manifest_t *terminal)
++{
++    unsigned int i;
++
++    ia_css_program_control_init_manifest_program_desc_t *progs;
++
++    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
++        terminal, 0);
++
++    assert(progs);
++    (void)progs;
++
++    for (i = 0; i < terminal->program_count; i++) {
++        IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
++            "program index: %d, load sec: %d, connect sec: %d\n",
++            i,
++            progs[i].load_section_count,
++            progs[i].connect_section_count);
++    }
++}
++
++#endif
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
+new file mode 100644
+index 000000000000..85982fb184a4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_rbm.c
+@@ -0,0 +1,19 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_INLINE__
++#include "ia_css_rbm_impl.h"
++#endif /* __IA_CSS_RBM_INLINE__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
+new file mode 100644
+index 000000000000..4a124962fefb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal.c
+@@ -0,0 +1,22 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifdef __INLINE_PARAMETERS__
++#include "storage_class.h"
++STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __INLINE_PARAMETERS__ */
++#include "ia_css_terminal_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
+new file mode 100644
+index 000000000000..d051f1d38657
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/ia_css_terminal_manifest.c
+@@ -0,0 +1,22 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifdef __INLINE_PARAMETERS__
++#include "storage_class.h"
++STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __INLINE_PARAMETERS__ */
++#include "ia_css_terminal_manifest_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
+new file mode 100644
+index 000000000000..8d69d999c9ba
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/src/vied_nci_psys_system.c
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_sim_storage_class.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifdef __IA_CSS_PSYS_SIM_INLINE__
++STORAGE_CLASS_INLINE int
++__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __IA_CSS_PSYS_SIM_INLINE__ */
++#include "psys_system_global_impl.h"
++#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
+new file mode 100644
+index 000000000000..1cd354e845a1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/assert_support.h
+@@ -0,0 +1,210 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __ASSERT_SUPPORT_H
++#define __ASSERT_SUPPORT_H
++
++/* This file provides support for run-time assertions
++ * and compile-time assertions.
++ *
++ * Run-time asstions are provided via the following syntax:
++ *     assert(condition)
++ * Run-time assertions are disabled using the NDEBUG flag.
++ *
++ * Compile time assertions are provided via the following syntax:
++ *     COMPILATION_ERROR_IF(condition);
++ * A compile-time assertion will fail to compile if the condition is false.
++ * The condition must be constant, such that it can be evaluated
++ * at compile time.
++ *
++ * OP___assert is deprecated.
++ */
++
++#define IA_CSS_ASSERT(expr) assert(expr)
++
++#ifdef __KLOCWORK__
++/* Klocwork does not see that assert will lead to abortion
++ * as there is no good way to tell this to KW and the code
++ * should not depend on assert to function (actually the assert
++ * could be disabled in a release build) it was decided to
++ * disable the assert for KW scans (by defining NDEBUG)
++ * see also:
++ * http://www.klocwork.com/products/documentation/current/
++ * Tuning_C/C%2B%2B_analysis#Assertions
++ */
++#define NDEBUG
++#endif /* __KLOCWORK__ */
++
++/**
++ * The following macro can help to test the size of a struct at compile
++ * time rather than at run-time. It does not work for all compilers; see
++ * below.
++ *
++ * Depending on the value of 'condition', the following macro is expanded to:
++ * - condition==true:
++ *     an expression containing an array declaration with negative size,
++ *     usually resulting in a compilation error
++ * - condition==false:
++ *     (void) 1; // C statement with no effect
++ *
++ * example:
++ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
++ *			SIZE_OF_HOST_SP_QUEUES_STRUCT);
++ *
++ * verify that the macro indeed triggers a compilation error with your compiler:
++ *  COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) !=
++ *			(sizeof(struct host_sp_queues)+1) );
++ *
++ * Not all compilers will trigger an error with this macro;
++ * use a search engine to search for BUILD_BUG_ON to find other methods.
++ */
++#ifdef __XTENSA_FW__
++
++#include "assert_support_xtensa.h"
++
++#else
++
++#define COMPILATION_ERROR_IF(condition) \
++((void)sizeof(char[1 - 2*!!(condition)]))
++
++#endif
++/* Compile time assertion */
++#ifndef CT_ASSERT
++#define CT_ASSERT(cnd) ((void)sizeof(char[(cnd)?1 :  -1]))
++#endif /* CT_ASSERT */
++
++#ifdef NDEBUG
++
++#define assert(cnd) ((void)0)
++
++#else
++
++#include "storage_class.h"
++
++#if defined(_MSC_VER)
++#ifdef _KERNEL_MODE
++/* Windows kernel mode compilation */
++#include <ntddk.h>
++#define assert(cnd) ASSERT(cnd)
++#else
++/* Windows usermode compilation */
++#include <assert.h>
++#endif
++
++#elif defined(__XTENSA_FW__)
++/* assert added in assert_support_xtensa*/
++#elif defined(__HIVECC)
++
++/*
++ * target: assert disabled
++ * sched: assert enabled only when SCHED_DEBUG is defined
++ * unsched: assert enabled
++ */
++#if defined(HRT_HW)
++#define assert(cnd) ((void)0)
++#elif defined(HRT_SCHED) && !defined(DEBUG_SCHED)
++#define assert(cnd) ((void)0)
++#elif defined(PIPE_GENERATION)
++#define assert(cnd) ((void)0)
++#else
++#include <hive/support.h>
++#define assert(cnd) OP___csim_assert(cnd)
++#endif
++
++#elif defined(__KERNEL__)
++#include <linux/bug.h>
++
++#ifndef KERNEL_ASSERT_TO_BUG
++#ifndef KERNEL_ASSERT_TO_BUG_ON
++#ifndef KERNEL_ASSERT_TO_WARN_ON
++#ifndef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
++#ifndef KERNEL_ASSERT_UNDEFINED
++/* Default */
++#define KERNEL_ASSERT_TO_BUG
++#endif /*KERNEL_ASSERT_UNDEFINED*/
++#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
++#endif /*KERNEL_ASSERT_TO_WARN_ON*/
++#endif /*KERNEL_ASSERT_TO_BUG_ON*/
++#endif /*KERNEL_ASSERT_TO_BUG*/
++
++#ifdef KERNEL_ASSERT_TO_BUG
++/* TODO: it would be cleaner to use this:
++ * #define assert(cnd) BUG_ON(cnd)
++ * but that causes many compiler warnings (==errors) under Android
++ * because it seems that the BUG_ON() macro is not seen as a check by
++ * gcc like the BUG() macro is. */
++#define assert(cnd)							\
++	do {								\
++		if (!(cnd)) {						\
++			BUG();						\
++		}							\
++	} while (0)
++#endif /*KERNEL_ASSERT_TO_BUG*/
++
++#ifdef KERNEL_ASSERT_TO_BUG_ON
++#define assert(cnd) BUG_ON(!(cnd))
++#endif /*KERNEL_ASSERT_TO_BUG_ON*/
++
++#ifdef KERNEL_ASSERT_TO_WARN_ON
++#define assert(cnd) WARN_ON(!(cnd))
++#endif /*KERNEL_ASSERT_TO_WARN_ON*/
++
++#ifdef KERNEL_ASSERT_TO_WARN_ON_INF_LOOP
++#define assert(cnd)							\
++	do {								\
++		int not_cnd = !(cnd);					\
++		WARN_ON(not_cnd);					\
++		if (not_cnd) {						\
++			for (;;) {					\
++			}						\
++		}							\
++	} while (0)
++#endif /*KERNEL_ASSERT_TO_WARN_ON_INF_LOOP*/
++
++#ifdef KERNEL_ASSERT_UNDEFINED
++#include KERNEL_ASSERT_DEFINITION_FILESTRING
++#endif /*KERNEL_ASSERT_UNDEFINED*/
++
++#elif defined(__FIST__) || defined(__GNUC__)
++
++#include "assert.h"
++
++#else /* default is for unknown environments */
++#define assert(cnd) ((void)0)
++#endif
++
++#endif /* NDEBUG */
++#ifndef PIPE_GENERATION
++/* Deprecated OP___assert, this is still used in ~1000 places
++ * in the code. This will be removed over time.
++ * The implementation for the pipe generation tool is in see support.isp.h */
++#define OP___assert(cnd) assert(cnd)
++
++#ifdef C_RUN
++#define compile_time_assert(cond) OP___assert(cond)
++#else
++#include "storage_class.h"
++extern void _compile_time_assert(void);
++STORAGE_CLASS_INLINE void compile_time_assert(unsigned cond)
++{
++	/* Call undefined function if cond is false */
++	if (!cond)
++		_compile_time_assert();
++}
++#endif
++#endif /* PIPE_GENERATION */
++
++#endif /* __ASSERT_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
+new file mode 100644
+index 000000000000..88ef0971fed8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/cpu_mem_support.h
+@@ -0,0 +1,239 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __CPU_MEM_SUPPORT_H
++#define __CPU_MEM_SUPPORT_H
++
++#include "storage_class.h"
++#include "assert_support.h"
++#include "type_support.h"
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
++{
++	/* memcpy cannot be used in in Windows (function is not allowed),
++	 * and the safer function memcpy_s is not available on other platforms.
++	 * Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
++	 * but sub-optimal way.
++	 */
++	unsigned int i;
++
++	assert(dst != NULL && src != NULL);
++
++	if (!(dst != NULL && src != NULL)) {
++		return NULL;
++	}
++	for (i = 0; i < size; i++) {
++		((char *)dst)[i] = ((char *)src)[i];
++	}
++	return dst;
++}
++
++#if defined(__KERNEL__)
++
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/types.h>
++#include <asm/cacheflush.h>
++
++/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
++ * error checking code added to SDK that uses calls to exit function
++ */
++#define exit(a) return
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++	return kmalloc(size, GFP_KERNEL);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++	return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
++{
++	/* nothing here yet */
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++	return memset(dst, 0, size); /* available in kernel in linux/string.h */
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++	kfree(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++	/* parameter check here */
++	if (ptr == NULL)
++		return;
++
++	clflush_cache_range(ptr, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++	/* for now same as flush */
++	ia_css_cpu_mem_cache_flush(ptr, size);
++}
++
++#elif defined(_MSC_VER)
++
++#include <stdlib.h>
++#include <string.h>
++#include <stddef.h>
++
++extern void *hrt_malloc(size_t bytes, int zero_mem);
++extern void *hrt_free(void *ptr);
++extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
++extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
++
++#define malloc(a)	hrt_malloc(a, 1)
++#define free(a)		hrt_free(a)
++
++#define CSS_PAGE_SIZE	(1<<12)
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++	return malloc(size);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++	unsigned int buffer_size = size;
++
++	/* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
++	 * to request system memory. If the number of bytes is equal or bigger
++	 * than the page size, then the returned address is page aligned,
++	 * but if it's smaller it's not necessarily page-aligned We agreed
++	 * with Windows team that we allocate a full page
++	 * if it's less than page size
++	*/
++	if (buffer_size < CSS_PAGE_SIZE)
++		buffer_size = CSS_PAGE_SIZE;
++
++	return ia_css_cpu_mem_alloc(buffer_size);
++}
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++	return memset(dst, 0, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++	free(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++#ifdef _KERNEL_MODE
++	hrt_mem_cache_flush(ptr, size);
++#else
++	(void)ptr;
++	(void)size;
++#endif
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++#ifdef _KERNEL_MODE
++	hrt_mem_cache_invalidate(ptr, size);
++#else
++	(void)ptr;
++	(void)size;
++#endif
++}
++
++#else
++
++#include <stdlib.h>
++#include <string.h>
++#include <stddef.h>
++/* Needed for the MPROTECT */
++#include <unistd.h>
++#include <sys/types.h>
++
++/* For host only, not fw */
++#ifndef __XTENSA_FW__
++#include <sys/mman.h>
++#include <malloc.h>
++#endif
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc(unsigned int size)
++{
++	return malloc(size);
++}
++
++#ifdef _SC_PAGE_SIZE
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
++{
++	int pagesize;
++
++	pagesize = sysconf(_SC_PAGE_SIZE);
++	return memalign(pagesize, size);
++}
++#endif /*_SC_PAGE_SIZE*/
++
++STORAGE_CLASS_INLINE void*
++ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
++{
++	return memset(dst, 0, size);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_free(void *ptr)
++{
++	free(ptr);
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
++{
++	/* not needed in simulation */
++	(void)ptr;
++	(void)size;
++}
++
++STORAGE_CLASS_INLINE void
++ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
++{
++	/* not needed in simulation */
++	(void)ptr;
++	(void)size;
++}
++
++#endif
++#endif /* __CPU_MEM_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
+new file mode 100644
+index 000000000000..ede5d846e67e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/error_support.h
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __ERROR_SUPPORT_H
++#define __ERROR_SUPPORT_H
++
++#if defined(__KERNEL__)
++#include <linux/errno.h>
++#else
++#include <errno.h>
++#endif
++#include <assert_support.h>
++
++/* OS-independent definition of IA_CSS errno values */
++/* #define IA_CSS_EINVAL 1 */
++/* #define IA_CSS_EFAULT 2 */
++
++#ifdef __HIVECC
++#define ERR_EMBEDDED 1
++#else
++#define ERR_EMBEDDED 0
++#endif
++
++#if ERR_EMBEDDED
++#define DECLARE_ERRVAL
++#else
++#define DECLARE_ERRVAL \
++	int _errval = 0;
++#endif
++
++/* Use "owl" in while to prevent compiler warnings in Windows */
++#define ALWAYS_FALSE ((void)0, 0)
++
++#define verifret(cond, error_type) \
++do {                               \
++	if (!(cond)) {             \
++		return error_type; \
++	}                          \
++} while (ALWAYS_FALSE)
++
++#define verifjmp(cond, error_tag)    \
++do {                                \
++	if (!(cond)) {                   \
++		goto error_tag;             \
++	}                               \
++} while (ALWAYS_FALSE)
++
++#define verifexit(cond)  \
++do {                               \
++	if (!(cond)) {              \
++		goto EXIT;         \
++	}                          \
++} while (ALWAYS_FALSE)
++
++#if ERR_EMBEDDED
++#define verifexitval(cond, error_tag) \
++do {                               \
++	assert(cond);		   \
++} while (ALWAYS_FALSE)
++#else
++#define verifexitval(cond, error_tag) \
++do {                               \
++	if (!(cond)) {              \
++		_errval = (error_tag); \
++		goto EXIT;         \
++	}                          \
++} while (ALWAYS_FALSE)
++#endif
++
++#if ERR_EMBEDDED
++#define haserror(error_tag) (0)
++#else
++#define haserror(error_tag) \
++	(_errval == (error_tag))
++#endif
++
++#if ERR_EMBEDDED
++#define noerror() (1)
++#else
++#define noerror() \
++	(_errval == 0)
++#endif
++
++#define verifjmpexit(cond)         \
++do {                               \
++	if (!(cond)) {             \
++		goto EXIT;         \
++	}                          \
++} while (ALWAYS_FALSE)
++
++#define verifjmpexitsetretval(cond, retval)         \
++do {                               \
++	if (!(cond)) {              \
++		retval = -1;	   \
++		goto EXIT;         \
++	}                          \
++} while (ALWAYS_FALSE)
++
++#endif /* __ERROR_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
+new file mode 100644
+index 000000000000..6142ecb43058
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/frame_support.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __FRAME_SUPPORT_H
++#define __FRAME_SUPPORT_H
++
++#define INTERLEAVED_FRAME_TYPE_NUM_PLANES	1
++#define YUV_SEMI_PLANAR_FRAME_TYPE_NUM_PLANES	2
++#define YUV_PLANAR_FRAME_TYPE_NUM_PLANES	3
++#define BAYER_PLANAR_FRAME_TYPE_NUM_PLANES	4
++
++/* genpipe doesn't support B = A in enum definition */
++#ifndef PIPE_GENERATION
++
++enum image_iterator_planes {
++	IMG_ITER_PLANE_0 = 0,
++	IMG_ITER_PLANE_1,
++	IMG_ITER_PLANE_2,
++	IMG_ITER_PLANE_3,
++	IMG_ITER_MAX_NUM_PLANES
++};
++
++enum interleaved_frames_types_planes {
++	INTERLEAVED_FRAME_MAIN_PLANE = 0,
++	INTERLEAVED_FRAME_NUM_PLANES
++};
++
++enum yuv_semi_planar_frame_types_planes {
++	YUV_SEMI_PLANAR_FRAME_Y_PLANE = 0,
++	YUV_SEMI_PLANAR_FRAME_UV_PLANE,
++	YUV_SEMI_PLANAR_FRAME_NUM_PLANES
++};
++
++enum yuv_planar_frame_types_planes {
++	YUV_PLANAR_FRAME_Y_PLANE = 0,
++	YUV_PLANAR_FRAME_U_PLANE,
++	YUV_PLANAR_FRAME_V_PLANE,
++	YUV_PLANAR_FRAME_NUM_PLANES
++};
++
++enum bayer_planar_frame_types_planes {
++	BAYER_PLANAR_FRAME_GR_PLANE = 0,
++	BAYER_PLANAR_FRAME_R_PLANE,
++	BAYER_PLANAR_FRAME_B_PLANE,
++	BAYER_PLANAR_FRAME_GB_PLANE,
++	BAYER_PLANAR_FRAME_NUM_PLANES
++};
++
++#endif /* PIPE_GENERATION */
++#endif	/* __FRAME_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
+new file mode 100644
+index 000000000000..d0de17c1e224
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_base_types.h
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_BASE_TYPES_H
++#define __IA_CSS_BASE_TYPES_H
++
++#include "type_support.h"
++
++#define VIED_VADDRESS_BITS				32
++
++#define DEVICE_DESCRIPTOR_ID_BITS			32
++
++#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS \
++	(2 * IA_CSS_UINT32_T_BITS + \
++	VIED_VADDRESS_BITS + \
++	2 * IA_CSS_UINT16_T_BITS)
++
++#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS \
++	(2 * IA_CSS_UINT32_T_BITS + \
++	VIED_VADDRESS_BITS + \
++	2 * IA_CSS_UINT16_T_BITS)
++
++#define SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT (SIZE_OF_TERMINAL_LOAD_TRANSFER_STRUCT_BITS / CHAR_BIT)
++#define SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT (SIZE_OF_TERMINAL_STORE_TRANSFER_STRUCT_BITS / CHAR_BIT)
++
++typedef uint32_t vied_vaddress_t;
++
++typedef struct {
++	uint8_t device_id;
++	uint8_t instance_id;
++	uint8_t channel_id;
++	uint8_t section_id;
++} device_descriptor_fields_t;
++
++typedef union {
++	device_descriptor_fields_t fields;
++	uint32_t data;
++} device_descriptor_id_t;
++
++typedef uint16_t ia_css_process_id_t;
++
++#endif /* __IA_CSS_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
+new file mode 100644
+index 000000000000..b4a152592471
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs.h
+@@ -0,0 +1,789 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_ISA_PARAMETER_DEFS_H
++#define __IA_CSS_ISA_PARAMETER_DEFS_H
++
++#include "ia_css_isa_parameter_defs_dep.h"
++
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_INL			(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL		(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN			(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC			(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS			(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF		(1)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM		(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE		(1)
++
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_INL			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE			(0)
++
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF		(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE		(0)
++
++#define IA_CSS_ISA_NEEDS_SLICED_IN_INL				(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PCLN			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC				(1)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_IDS				(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE			(0)
++
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_INL			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC			(1)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_IDS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE			(0)
++
++/* ==================== INL specs - START ==================== */
++/* in addition to register bank, it has a 0x200 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT						(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0						(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0					(0x204)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1						(0x204)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1					(0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT						(0)
++
++/* Spatial Parameter Terminal In does not exist for INL */
++
++/* Spatial Parameter Terminal Out does not exist for INL */
++
++/* Sliced Parameter Terminal In does not exist for INL */
++
++/* Sliced Parameter Terminal Out does not exist for INL */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT							(0)
++/* ==================== INL specs - END ==================== */
++
++/* ==================== BLC_GLOBAL specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0					(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0					(0xC08)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1					(0x20)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1					(0xC0C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT					(0)
++
++/* Spatial Parameter Terminal In does not exist for BLC_GLOBAL */
++
++/* Spatial Parameter Terminal Out does not exist for BLC_GLOBAL */
++
++/* Sliced Parameter Terminal In does not exist for BLC_GLOBAL */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_GLOBAL */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT						(0)
++/* ==================== BLC_GLOBAL specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_0 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT				(0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT			(4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(8)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_0 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== BLC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT				(0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT			(4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_1 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== BLC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== BLC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT				(0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT			(8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1	(0x300)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2	(0x600)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3	(0x900)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4	(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5	(0x380)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6	(0x680)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7		(0x80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7	(0x980)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7		(0x100)
++
++/* Spatial Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for BLC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for BLC_SENSOR_TYPE_2 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== BLC_SENSOR_TYPE_2 specs - END ==================== */
++
++/* ==================== PCLN specs - START ==================== */
++/* in addition to register bank, it has a 0x800 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT						(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0						(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0					(0x820)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1						(0x820)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1					(0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT						(0)
++
++/* Spatial Parameter Terminal In does not exist for PCLN */
++
++/* Spatial Parameter Terminal Out does not exist for PCLN */
++
++/* Sliced Parameter Terminal In does not exist for PCLN */
++
++/* Sliced Parameter Terminal Out does not exist for PCLN */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT							(0)
++/* ==================== PCLN specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC08)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0				(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0				(0xC00)
++/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
++
++/* ==================== BNR specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
++/* ==================== BNR specs - END ==================== */
++
++/* ==================== ISA_DM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
++
++/* ==================== ISA_DM specs - END ==================== */
++
++/* ==================== IDS specs - START ==================== */
++/* IDS is HW revision dependent */
++/* ==================== IDS specs - END ==================== */
++
++/* ==================== 3A_STAT_AWB specs - START ==================== */
++/* AWB parameter properties are in the platform specific ia_css_parameter_defs_dep.h file */
++/* ==================== 3A_STAT_AWB specs - END ==================== */
++
++/* ==================== 3A_STAT_AF specs - START ==================== */
++/* in addition to register bank, it has a 0x400 memory bank to store output, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0x88)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x40C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT					(0)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AF */
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT				(2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM			(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE		(32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH		(16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH		(32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT		(16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT		(32)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0			(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0			(0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0		(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1			(0x100)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1			(0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1		(0x200)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1		(0x100)
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AF */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AF */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT						(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0					(0xC)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0					(0x400)
++/* ==================== 3A_STAT_AF specs - END ==================== */
++
++/* ==================== 3A_STAT_AE_CCM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0				(0x7C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0				(0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT					(0)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
++
++/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE_CCM */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE_CCM */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT					(0)
++/* ==================== 3A_STAT_AE_CCM specs - END ==================== */
++
++/* ==================== 3A_STAT_AE specs - START ==================== */
++/* in addition to register bank, it has a 0x180 memory bank to store LUT and a 0x2000 memory bank to store output,
++   found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT						(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x18C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT					(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0				(0x2000)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0				(0x200)
++
++/* Spatial Parameter Terminal In does not exist for 3A_STAT_AE */
++
++/* Spatial Parameter Terminal Out does not exist for 3A_STAT_AE */
++
++/* Sliced Parameter Terminal In does not exist for 3A_STAT_AE */
++
++/* Sliced Parameter Terminal Out does not exist for 3A_STAT_AE */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT						(2)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0					(0xC)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0					(0x180)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1					(0x180)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1					(0x0)
++/* ==================== 3A_STAT_AE specs - END ==================== */
++
++/* TODO: REMOVE BACKWARD COMPATIBILITY */
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_INL_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_INL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_INL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_GLOBAL_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_GLOBAL_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_2
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_3
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_4
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_5
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_6
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_7
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_BLC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_7
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_BLC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_PCLN_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_PCLN_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_PCLN_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_LSC_SENSOR_TYPE_2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_COMPUTE_UNITS_PER_ELEM
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_PER_SLICE
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_ELEM_SIZE_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_3A_STAT_AF_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AF_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_CCM_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_CCM_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AE_DEST_OFFSET_SECTION_1
++
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_INL IA_CSS_ISA_KERNEL_IS_PRIMARY_INL
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_GLOBAL IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_GLOBAL
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_PCLN IA_CSS_ISA_KERNEL_IS_PRIMARY_PCLN
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2 IA_CSS_ISA_KERNEL_IS_PRIMARY_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_DPC IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_IDS IA_CSS_ISA_KERNEL_IS_PRIMARY_IDS
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AWB IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AWB
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AF IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AF
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_KERNEL_IS_PRIMARY_3A_STAT_AE IA_CSS_ISA_KERNEL_IS_PRIMARY_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_INL IA_CSS_ISA_NEEDS_SPATIAL_IN_INL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_PCLN IA_CSS_ISA_NEEDS_SPATIAL_IN_PCLN
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_IN_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_DPC IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_IDS IA_CSS_ISA_NEEDS_SPATIAL_IN_IDS
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SPATIAL_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_IN_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_INL IA_CSS_ISA_NEEDS_SPATIAL_OUT_INL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_PCLN IA_CSS_ISA_NEEDS_SPATIAL_OUT_PCLN
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SPATIAL_OUT_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_DPC IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_IDS IA_CSS_ISA_NEEDS_SPATIAL_OUT_IDS
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SPATIAL_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SPATIAL_OUT_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_INL IA_CSS_ISA_NEEDS_SLICED_IN_INL
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_IN_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_PCLN IA_CSS_ISA_NEEDS_SLICED_IN_PCLN
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_IN_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_DPC IA_CSS_ISA_NEEDS_SLICED_IN_DPC
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_IDS IA_CSS_ISA_NEEDS_SLICED_IN_IDS
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SLICED_IN_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_IN_3A_STAT_AE
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_INL IA_CSS_ISA_NEEDS_SLICED_OUT_INL
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_GLOBAL IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_GLOBAL
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_BLC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_PCLN IA_CSS_ISA_NEEDS_SLICED_OUT_PCLN
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_0
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_1
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2 IA_CSS_ISA_NEEDS_SLICED_OUT_LSC_SENSOR_TYPE_2
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_DPC IA_CSS_ISA_NEEDS_SLICED_OUT_DPC
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_IDS IA_CSS_ISA_NEEDS_SLICED_OUT_IDS
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AWB IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AWB
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AF IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AF
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE_CCM IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE_CCM
++#define IA_CSS_ISYS_NEEDS_SLICED_OUT_3A_STAT_AE IA_CSS_ISA_NEEDS_SLICED_OUT_3A_STAT_AE
++/* END OF TODO */
++
++#endif /* __IA_CSS_ISA_PARAMETER_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
+new file mode 100644
+index 000000000000..4310e41192f4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_isa_parameter_defs_dep.h
+@@ -0,0 +1,580 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
++#define __IA_CSS_ISA_PARAMETER_DEFS_DEP_H
++
++#include "ia_css_ff_awb_statistics_param_defs.h"
++
++/*
++ * TODO: Adapt this file for IPU6!
++ */
++
++/* ==================== DPC_V2 specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_V2			(1)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_V2			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_V2			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_V2			(1)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_V2			(1)
++
++/* ==================== PDAF specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PAF			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PAF				(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PAF			(1)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PAF				(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PAF				(0)
++
++/* ==================== DPC_PEXT specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_DPC_PEXT			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_DPC_PEXT			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_DPC_PEXT			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_DPC_PEXT			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_DPC_PEXT			(0)
++
++/* ==================== SIS specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_WB_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_WB_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_WB_SIS			(0)
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_SIS_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_SIS_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_SIS_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_WB_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_SIS_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_WB_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_SIS_SIS			(0)
++
++/* ==================== STREAM_CROP specific properties ==================== */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_STREAM_CROP		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_STREAM_CROP			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_STREAM_CROP		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_STREAM_CROP			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_STREAM_CROP			(0)
++
++/* ========== PIFCONV_A_INPUT specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_A_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_A_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_A_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_A_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_A_INPUT		(0)
++
++/* ========== PIFCONV_B_INPUT specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_B_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_B_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_B_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_B_INPUT		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_B_INPUT		(0)
++
++/* ========== PIFCONV_OUTPUT_NONSCALED specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_NONSCALED		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_NONSCALED		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_NONSCALED		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_NONSCALED		(0)
++
++/* ========== PIFCONV_OUTPUT_SCALED specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SCALED		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SCALED		(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SCALED		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SCALED		(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SCALED		(0)
++
++/* ========== PIFCONV_OUTPUT_SIS specific properties ================= */
++#define IA_CSS_ISA_KERNEL_IS_PRIMARY_PIFCONV_OUTPUT_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_IN_PIFCONV_OUTPUT_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SPATIAL_OUT_PIFCONV_OUTPUT_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_IN_PIFCONV_OUTPUT_SIS			(0)
++#define IA_CSS_ISA_NEEDS_SLICED_OUT_PIFCONV_OUTPUT_SIS			(0)
++
++/* ==================== IDS specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT						(5)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0					(0x0C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x00)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1					(0x10)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1					(0x14)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2					(0x18)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2					(0x50)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3					(0x20C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3					(0x68)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4					(0x24)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4					(0x274)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT						(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0						(0x08)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0					(0x0C)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT					(0)
++
++/* Spatial Parameter Terminal In does not exist for IDS */
++
++/* Spatial Parameter Terminal Out does not exist for IDS */
++
++/* Sliced Parameter Terminal In does not exist for IDS */
++
++/* Sliced Parameter Terminal Out does not exist for IDS */
++
++/* ==================== IDS specs - END ==================== */
++
++/* ==================== DPC specs used in PSYS - START ==================== */
++/* in addition to register bank, it has a 0x3000 memory bank to store LUT, found in reg_descr.hsd */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT						(5)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4					(0x8)		/* AF Statistics pixels */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4					(0x34D4)	/* AF Statistics pixels */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_SECTION_COUNT						(4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0					(0x4)		/* GDC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x3378)	/* GDC/DPC Control */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1					(0x1C0)		/* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x3000)	/* CfgTable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2					(0x40)		/* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3488)	/* HDR factors */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_MAX_SIZE_SECTION_3					(0x4)		/* AF Grid Enable */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_3					(0x34C8)	/* AF Grid Enable */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(0)
++
++/* Spatial Parameter Terminal In does not exist for DPC */
++
++/* Spatial Parameter Terminal Out does not exist for DPC */
++
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT					(2)
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x3380)	/* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* DPC static LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x1000)	/* DPC static LUT */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x0)		/* DPC static LUT */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x1000)	/* DPC static LUT */
++
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT					(2)
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0			(0x4)		/* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0			(0x34CC)	/* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0			(0x4)		/* AF LUT limit */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1			(0x800)		/* AF Pixels metadata */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1			(0x2000)	/* AF Pixels metadata */
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1			(0x800)		/* AF Pixels metadata */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT						(3)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0						(0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0					(0x337C) /* DPC Control */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1						(0x1B8)		/* CfgUnitMapping */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1					(0x31C0)	/* CfgUnitMapping */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2						(0x100)		/* AF pixels grid cfg */
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2					(0x3388)	/* AF pixels grid cfg */
++
++/* ==================== DPC specs - END ==================== */
++
++/* ==================== DPC_PEXT specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_SECTION_COUNT						(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_0					(0x8)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_0					(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_MAX_SIZE_SECTION_1					(0x8)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_PEXT_DEST_OFFSET_SECTION_1					(0xC)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_PEXT_SECTION_COUNT					(0)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_PEXT_SECTION_COUNT						(0)
++/* ==================== DPC_PEXT specs - END ==================== */
++
++/* TODO check ae values */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_COMPUTE_UNITS_PER_ELEM (1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_ELEM_SIZE_SECTION_0 (0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (16)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_AE_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (80)
++
++/* todo check gddpc_pext values when enabling this terminal */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_COMPUTE_UNITS_PER_ELEM (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT (8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_ELEM_SIZE_SECTION_0 (0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH (64)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_GDDPC_PEXT_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT (64)
++
++/* ==================== PAF specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_SECTION_COUNT							(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_0						(0x18)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_0						(0x0)
++
++/* This is an PAF ACB configuration an not really the configuration on PAF FF. Hence giving - offsets*/
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_MAX_SIZE_SECTION_1						(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PAF_DEST_OFFSET_SECTION_1						(-0xB0)
++
++#define	IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT						(0)
++/* Number of PAF blocks = 12*16 PAF blocks
++ * Max number of phase steps in each block: 11 steps (0-10)
++ * 	for step 10, only the LSB values are valid and MSB 2bytes are reserved
++ * 	Hence for each block height, we will have to read in 12 steps
++ * Size of each phase value =  2 bytes
++ * Total size required for PAF output = 2bytes * 12*16 blocks *12 steps
++ * */
++
++/* Spatial Parameter Terminal In does not exist for PAF*/
++
++/* Spatial Parameter Terminal Out for PAF*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SECTION_COUNT					(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_COMPUTE_UNITS_PER_ELEM				(1)	/**/
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_MAX_SLICE_SIZE_SECTION_0				(0x1200) /*12*16 #PAF blocks# * 2bytes*12 #Phase output size per block#*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_ELEM_SIZE_SECTION_0				(0x18)	/*Size of each phase output in a grid*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_SLICE_0_DEST_OFFSET_SECTION_0			(0x200)	/*FF register offset from kernel base*/
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_OUT_PAF_NEXT_SLICE_OFFSET_SECTION_0			(0x180)	/*Determines the next FF location*/
++
++/* Sliced Parameter Terminal In does not exist for PAF*/
++
++/* Sliced Parameter Terminal Out does not exist for PAF*/
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PAF_SECTION_COUNT							(0)
++/* ==================== PAF specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_0 specs - START ==================== */
++/* in addition to register bank, it has a 0xC00 memory bank to store LUT, found in reg_descr.hsd */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_0_SECTION_COUNT				(0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SECTION_COUNT			(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_COMPUTE_UNITS_PER_ELEM		(2)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_MAX_SLICE_SIZE_SECTION_0		(0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_ELEM_SIZE_SECTION_0			(0x4)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_0_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_0 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_0 */
++/* ==================== LSC_SENSOR_TYPE_0 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_1 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_1_SECTION_COUNT				(0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SECTION_COUNT			(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_COMPUTE_UNITS_PER_ELEM		(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_PER_SLICE		(128)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(64)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_MAX_SLICE_SIZE_SECTION_0		(0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_ELEM_SIZE_SECTION_0			(0x8)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_1_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_1 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_1 */
++/* ==================== LSC_SENSOR_TYPE_1 specs - END ==================== */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LSC_SENSOR_TYPE_2_SECTION_COUNT				(0)
++
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SECTION_COUNT			(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_COMPUTE_UNITS_PER_ELEM		(1)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_PER_SLICE		(32)	/* HW limit for slice height calculation */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_WIDTH	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_WIDTH	(32)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MIN_COMPUTE_UNITS_FRAGMENT_HEIGHT	(8)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_COMPUTE_UNITS_FRAGMENT_HEIGHT	(32)	/* HW limit for checking only */
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_MAX_SLICE_SIZE_SECTION_0		(0x400)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_ELEM_SIZE_SECTION_0			(0x20)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_SLICE_0_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_SPATIAL_PARAMETER_TERMINAL_IN_LSC_SENSOR_TYPE_2_NEXT_SLICE_OFFSET_SECTION_0		(0x400)
++
++/* Spatial Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal In does not exist for LSC_SENSOR_TYPE_2 */
++
++/* Sliced Parameter Terminal Out does not exist for LSC_SENSOR_TYPE_2 */
++
++/* ==================== LSC_SENSOR_TYPE_2 specs - END ==================== */
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4			IA_CSS_ISA_PARAMETER_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT			IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT				IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0			IA_CSS_ISA_PROGRAM_TERMINAL_IDS_V3_1_DEST_OFFSET_SECTION_0
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_MAX_SIZE_SECTION_4
++#define IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_4				IA_CSS_ISA_PARAMETER_TERMINAL_DPC_V3_DEST_OFFSET_SECTION_4
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT				IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT			IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1		IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1	IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_V2_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT					IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_MAX_SIZE_SECTION_2
++#define IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_2				IA_CSS_ISA_PROGRAM_TERMINAL_DPC_V2_DEST_OFFSET_SECTION_2
++
++/* ==================== LCA specs -- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_SECTION_COUNT			(6)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_0	(0xc) /* 0x0 to 0xb */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_1	(0xcc) /* 0x10 to 0xdb */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_1	(0x10)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_2	(0x510) /* 0x100 to 0x60f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_2	(0x100)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_3	(0x510) /* 0x6c0 to 0xbcf */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_3	(0x6c0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_4	(0x510) /* 0xc80 to 0x118f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_4	(0xc80)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_MAX_SIZE_SECTION_5	(0x510) /* 0x1240 to 0x174f */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_LCA_DEST_OFFSET_SECTION_5	(0x1240)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_LCA_SECTION_COUNT		(0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_MAX_SIZE_SECTION_0		(4) /* 0x1800 to 0x1803*/
++#define IA_CSS_ISA_PROGRAM_TERMINAL_LCA_DEST_OFFSET_SECTION_0	(0x1800)
++/* ==================== LCA specs -- END ==================== */
++
++/* ==================== WBA_WBA specs - START ==================== */
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_SECTION_COUNT               (1)
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_MAX_SIZE_SECTION_0          (0x20)
++#define IA_CSS_PSA_PARAMETER_TERMINAL_B2B_WBA_DEST_OFFSET_SECTION_0       (0x0)
++/* ==================== WBA_WBA specs - END ==================== */
++
++/* leave those for now to pass isys compilation */
++/* ==================== SIS_WB_SIS specs - START ==================== */
++/* This device is similar to the WBA device in the PSA (with respect to registermap) */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_SECTION_COUNT            (2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_0       (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_0    (0x1C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_MAX_SIZE_SECTION_1       (0x1C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_WB_SIS_DEST_OFFSET_SECTION_1    (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_WB_SIS_SECTION_COUNT        (0)
++
++/* Spatial Parameter Terminal In does not exist for SIS_WB_SIS */
++
++/* Spatial Parameter Terminal Out does not exist for SIS_WB_SIS */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_WB_SIS_SECTION_COUNT              (0)
++/* ==================== SIS_WB_SIS specs - END ==================== */
++
++/* ==================== SIS_SIS specs - START ==================== */
++/* TODO: The SIS device does not yet expose the functionality for cropping */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_SECTION_COUNT               (1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_MAX_SIZE_SECTION_0          (0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_SIS_SIS_DEST_OFFSET_SECTION_0       (0x0)
++
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_SIS_SIS_SECTION_COUNT           (0)
++
++/* Spatial Parameter Terminal In does not exist for SIS_SIS */
++
++/* Spatial Parameter Terminal Out does not exist for SIS_SIS */
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_SIS_SIS_SECTION_COUNT                 (0)
++/* ==================== SIS_SIS specs - END ==================== */
++
++/* ==================== STREAM_CROP specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_STREAM_CROP_SECTION_COUNT	(0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_SECTION_COUNT		(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_MAX_SIZE_SECTION_0	(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_STREAM_CROP_DEST_OFFSET_SECTION_0	(0x4)
++/* ==================== STREAM_CROP specs - END ==================== */
++
++/* ==================== BNR specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_SECTION_COUNT			(2)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_0	(0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_MAX_SIZE_SECTION_1	(0xA4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_BNR_DEST_OFFSET_SECTION_1	(0x34)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_MAX_SIZE_SECTION_0		(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_BNR_DEST_OFFSET_SECTION_0	(0x2C)
++/* ==================== BNR specs - END ==================== */
++
++/* ==================== ISA_DM specs - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_MAX_SIZE_SECTION_0		(0x2C)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_ISA_DEMOSAIC_DEST_OFFSET_SECTION_0	(0x0)
++
++/* ==================== ISA_DM specs - END ==================== */
++
++/* ====================  specs PIFCONV_SIS_A- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_MAX_SIZE_SECTION_0		(0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_A_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_A_SECTION_COUNT		(0)
++/* ====================  specs PIFCONV_SIS_A- END ==================== */
++
++/* ====================  specs PIFCONV_SIS_B- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_MAX_SIZE_SECTION_0		(0x12)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SIS_B_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SIS_B_SECTION_COUNT		(0)
++/* ====================  specs PIFCONV_SIS_B- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_ORIG- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_MAX_SIZE_SECTION_0		(0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_ORIG_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_ORIG_SECTION_COUNT		(0)
++/* ====================  specs PIFCONV_ISA_ORIG- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_SCALED_A- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_MAX_SIZE_SECTION_0		(0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_A_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_A_SECTION_COUNT		(0)
++/* ====================  specs PIFCONV_ISA_SCALED_A- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_SCALED_B- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_MAX_SIZE_SECTION_0		(0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_SCALED_B_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_SCALED_B_SECTION_COUNT		(0)
++/* ====================  specs PIFCONV_ISA_SCALED_B- END ==================== */
++
++/* ====================  specs PIFCONV_ISA_FULL- START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_MAX_SIZE_SECTION_0		(0xc)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_OUTPUT_ISA_FULL_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_OUTPUT_ISA_FULL_SECTION_COUNT		(0)
++/* ====================  specs -PIFCONV_ISA_FULL_OUT END ==================== */
++
++/* ====================  specs PIFCONV_ISA_IR_DEPTH - START ==================== */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT			(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_MAX_SIZE_SECTION_0		(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x0)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIFCONV_ISA_IR_DEPTH_OUTPUT_IR_DEPTH_SECTION_COUNT		(0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_SECTION_COUNT			(2)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_0		(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_0		(0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_MAX_SIZE_SECTION_1		(0x4)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIFCONV_OUTPUT_ISA_IR_DEPTH_DEST_OFFSET_SECTION_1		(0x0) /* 0 because this register is in GPreg, NOT in Pifconv device. */
++/* ====================  specs PIFCONV_ISA_IR_DEPTH - END ==================== */
++
++/* ==================== PIXEL FORMATTER specs - START ==================== */
++/* The base address of the Pixel Formatter device is 0x271000 */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0	(0x4)
++#define IA_CSS_ISA_PARAMETER_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x0) /* Base address of the Config register in the Pixel Formatter device: Taken from MAS */
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_PIXEL_FORMATTER_SECTION_COUNT		(0x0)
++
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_SECTION_COUNT		(1)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_MAX_SIZE_SECTION_0		(0x8)
++#define IA_CSS_ISA_PROGRAM_TERMINAL_PIXEL_FORMATTER_DEST_OFFSET_SECTION_0	(0x20) /* Base address of Start register in the Pixel Formatter device: Taken from MAS
++											and base address of size register in the Pixel Formatter device is 0x24. */
++
++/* TODO: REMOVE BACKWARD COMPATIBILITY */
++/* NOT USED defs - needed for legacy*/
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
++#define IA_CSS_ISA_PARAMETER_TERMINAL_3A_STAT_AWB_DEST_OFFSET_SECTION_0			IA_P2P_PARAM_IN_TERMINAL_FF_AWB_STATISTICS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISA_PARAMETER_TERMINAL_OUT_3A_STAT_AWB_SECTION_COUNT				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_MAX_SIZE_SECTION_0				IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_0_SIZE
++#define IA_CSS_ISA_PROGRAM_TERMINAL_3A_STAT_AWB_SECTION_COUNT					IA_P2P_PROGRAM_TERMINAL_FF_AWB_STATISTICS_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_MAX_SIZE_SECTION_4
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4 IA_CSS_ISA_PARAMETER_TERMINAL_IDS_DEST_OFFSET_SECTION_4
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_MAX_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_IDS_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_IDS_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_2
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_MAX_SIZE_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3 IA_CSS_ISA_PARAMETER_TERMINAL_DPC_DEST_OFFSET_SECTION_3
++#define IA_CSS_ISYS_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_IN_DPC_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_0
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_MAX_SLICE_SIZE_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_SLICE_0_DEST_OFFSET_SECTION_1
++#define IA_CSS_ISYS_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1 IA_CSS_ISA_SLICED_PARAMETER_TERMINAL_OUT_DPC_NEXT_SLICE_OFFSET_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_SECTION_COUNT IA_CSS_ISA_PROGRAM_TERMINAL_DPC_SECTION_COUNT
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_0
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_MAX_SIZE_SECTION_1
++#define IA_CSS_ISYS_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1 IA_CSS_ISA_PROGRAM_TERMINAL_DPC_DEST_OFFSET_SECTION_1
++/* END OF TODO */
++
++#endif /* __IA_CSS_ISA_PARAMETER_DEFS_DEP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
+new file mode 100644
+index 000000000000..8670a1c80d4c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap.h
+@@ -0,0 +1,262 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_H
++#define __IA_CSS_KERNEL_BITMAP_H
++
++/*! \file */
++
++/** @file ia_css_kernel_bitmap.h
++ *
++ * The types and operations to make logic decisions given kernel bitmaps
++ * "ia_css_kernel_bitmap_t" can be larger than native types
++ */
++
++#include <type_support.h>
++#include "vied_nci_psys_resource_model.h"
++#include "ia_css_kernel_bitmap_storage_class.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define IA_CSS_KERNEL_BITMAP_ELEM_TYPE uint32_t
++#define IA_CSS_KERNEL_BITMAP_ELEM_BITS \
++	(sizeof(IA_CSS_KERNEL_BITMAP_ELEM_TYPE)*8)
++#define IA_CSS_KERNEL_BITMAP_NOF_ELEMS \
++	((IA_CSS_KERNEL_BITMAP_BITS) / (IA_CSS_KERNEL_BITMAP_ELEM_BITS))
++
++/** An element is a 32 bit unsigned integer. 64 bit integers might cause
++ * problems in the compiler.
++ */
++typedef struct {
++	IA_CSS_KERNEL_BITMAP_ELEM_TYPE data[IA_CSS_KERNEL_BITMAP_NOF_ELEMS];
++} ia_css_kernel_bitmap_elems_t;
++
++/** Users should make no assumption about the actual type of
++ * ia_css_kernel_bitmap_t.
++ * Users should use IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS in
++ * case they erroneously assume that this type is uint64_t and they
++ * cannot change their implementation.
++ */
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++typedef ia_css_kernel_bitmap_elems_t ia_css_kernel_bitmap_t;
++#else
++typedef uint64_t ia_css_kernel_bitmap_t;
++#if IA_CSS_KERNEL_BITMAP_BITS > 64
++#error IA_CSS_KERNEL_BITMAP_BITS > 64 not supported \
++	with IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++#endif
++#endif
++
++/*! Print the bits of a kernel bitmap
++
++ @return < 0 on error
++ */
++extern int ia_css_kernel_bitmap_print(
++	const ia_css_kernel_bitmap_t	bitmap,
++	void				*fid);
++
++/*! Create an empty kernel bitmap
++
++ @return bitmap = 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void);
++
++/*! Creates the complement of a kernel bitmap
++ * @param	[in] bitmap kernel bitmap
++ * @return ~bitmap
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
++	const ia_css_kernel_bitmap_t bitmap);
++
++/*! Create the union of two kernel bitmaps
++
++ @param	[in] bitmap0					kernel bitmap 0
++ @param	[in] bitmap1					kernel bitmap 1
++
++ @return bitmap0 | bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1);
++
++/*! Create the intersection of two kernel bitmaps
++
++ @param	[in] bitmap0					kernel bitmap 0
++ @param	[in] bitmap1					kernel bitmap 1
++
++ @return bitmap0 & bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1);
++
++/*! Check if the kernel bitmaps is empty
++
++ @param	[in] bitmap					kernel bitmap
++
++ @return bitmap == 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_empty(
++	const ia_css_kernel_bitmap_t			bitmap);
++
++/*! Check if the intersection of two kernel bitmaps is empty
++
++ @param	[in] bitmap0					kernel bitmap 0
++ @param	[in] bitmap1					kernel bitmap 1
++
++ @return (bitmap0 & bitmap1) == 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_intersection_empty(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1);
++
++/*! Check if the second kernel bitmap is a subset of the first (or equal)
++
++ @param	[in] bitmap0					kernel bitmap 0
++ @param	[in] bitmap1					kernel bitmap 1
++
++ Note: An empty set is always a subset, this function
++ returns true if bitmap 1 is empty
++
++ @return (bitmap0 & bitmap1) == bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_subset(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1);
++
++/*! Check if the kernel bitmaps are equal
++
++ @param	[in] bitmap0					kernel bitmap 0
++ @param	[in] bitmap1					kernel bitmap 1
++
++ @return bitmap0 == bitmap1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_equal(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1);
++
++/*! Right shift kernel bitmap
++
++ @param	[in] bitmap					kernel bitmap 0
++
++ @return bitmap >> 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
++	const ia_css_kernel_bitmap_t			bitmap);
++
++/*! Check if the kernel bitmaps contains only a single element
++
++ @param	[in] bitmap					kernel bitmap
++
++ @return weight(bitmap) == 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++bool ia_css_is_kernel_bitmap_onehot(
++	const ia_css_kernel_bitmap_t			bitmap);
++
++/*! Checks whether a specific kernel bit is set
++ * @return bitmap[index] == 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++int ia_css_is_kernel_bitmap_set(
++	const ia_css_kernel_bitmap_t	bitmap,
++	const unsigned int		index);
++
++/*! Create the union of a kernel bitmap with a onehot bitmap
++ * with a bit set at index
++
++ @return bitmap[index] |= 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
++	const ia_css_kernel_bitmap_t			bitmap,
++	const unsigned int						index);
++
++/*! Set elem_index-th 32-bit element of the bitmap
++ * to elem_value
++
++ @return updated bitmap
++ */
++extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
++	ia_css_kernel_bitmap_t			bitmap,
++	const unsigned int			elem_index,
++	const uint32_t				elem_value);
++
++/*! Creates kernel bitmap using a uint64 value.
++ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
++ */
++extern ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
++	const uint64_t	value);
++
++/*! Converts an ia_css_kernel_bitmap_t type to uint64_t. Note that if
++ *  ia_css_kernel_bitmap_t contains more then 64 bits, only the lowest 64 bits
++ *  are returned.
++ *  @return uint64_t representation of value
++*/
++extern uint64_t ia_css_kernel_bitmap_to_uint64(
++	const ia_css_kernel_bitmap_t value);
++
++/*! Creates a kernel bitmap with the bit at index 'index' removed.
++ * @return ~(1 << index) & bitmap
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
++	const ia_css_kernel_bitmap_t	bitmap,
++	const unsigned int		index);
++
++/*! Set a previously clear field of a kernel bitmap at index
++
++ @return if bitmap[index] == 0, bitmap[index] -> 1, else 0
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
++	const ia_css_kernel_bitmap_t			bitmap,
++	const unsigned int						index);
++
++/*! Create a onehot kernel bitmap with a bit set at index
++
++ @return bitmap[index] = 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
++	const unsigned int						index);
++
++/*! Create a random bitmap
++
++ @return bitmap[index] = 1
++ */
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_kernel_ran_bitmap(void);
++
++/*! @} */
++
++#ifdef __IA_CSS_KERNEL_BITMAP_INLINE__
++#include "ia_css_kernel_bitmap_impl.h"
++#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
++
++#endif /* __IA_CSS_KERNEL_BITMAP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
+new file mode 100644
+index 000000000000..b0b9ea9c0add
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_impl.h
+@@ -0,0 +1,340 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
++#define __IA_CSS_KERNEL_BITMAP_IMPL_IMPL_H
++
++#include <ia_css_kernel_bitmap.h>
++#include <type_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include "math_support.h"
++#include "ia_css_psys_kernel_trace.h"
++#include "ia_css_kernel_bitmap_storage_class.h"
++
++STORAGE_CLASS_INLINE
++int ia_css_kernel_bitmap_compute_weight(
++	const ia_css_kernel_bitmap_t			bitmap)
++{
++	ia_css_kernel_bitmap_t	loc_bitmap;
++	int	weight = 0;
++	int	i;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_compute_weight(): enter:\n");
++
++	loc_bitmap = bitmap;
++
++	/* In fact; do not need the iterator "i" */
++	for (i = 0; (i < IA_CSS_KERNEL_BITMAP_BITS) &&
++		    !ia_css_is_kernel_bitmap_empty(loc_bitmap); i++) {
++		weight += ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
++		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
++	}
++
++	return weight;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_intersection_empty(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1)
++{
++	ia_css_kernel_bitmap_t intersection;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_is_kernel_bitmap_intersection_empty(): enter:\n");
++
++	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
++	return ia_css_is_kernel_bitmap_empty(intersection);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_empty(
++	const ia_css_kernel_bitmap_t			bitmap)
++{
++	unsigned int i;
++	bool is_empty = true;
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_is_kernel_bitmap_empty(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		is_empty &= bitmap.data[i] == 0;
++	}
++#else
++	NOT_USED(i);
++	is_empty = (bitmap == 0);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return is_empty;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_equal(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1)
++{
++	unsigned int i;
++	bool is_equal = true;
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_is_kernel_bitmap_equal(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
++	}
++#else
++	NOT_USED(i);
++	is_equal = (bitmap0 == bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return is_equal;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_onehot(
++	const ia_css_kernel_bitmap_t			bitmap)
++{
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_is_kernel_bitmap_onehot(): enter:\n");
++	return ia_css_kernel_bitmap_compute_weight(bitmap) == 1;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++bool ia_css_is_kernel_bitmap_subset(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1)
++{
++	ia_css_kernel_bitmap_t intersection;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_is_kernel_bitmap_subset(): enter:\n");
++
++	intersection = ia_css_kernel_bitmap_intersection(bitmap0, bitmap1);
++	return ia_css_is_kernel_bitmap_equal(intersection, bitmap1);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_clear(void)
++{
++	unsigned int i;
++	ia_css_kernel_bitmap_t bitmap = {{0} };
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_clear(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		bitmap.data[i] = 0;
++	}
++#else
++	NOT_USED(i);
++	bitmap = 0;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return bitmap;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_complement(
++	const ia_css_kernel_bitmap_t bitmap)
++{
++	unsigned int i;
++	ia_css_kernel_bitmap_t result = {{0} };
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_complement(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		result.data[i] = ~bitmap.data[i];
++	}
++#else
++	NOT_USED(i);
++	result = ~bitmap;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_union(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1)
++{
++	unsigned int i;
++	ia_css_kernel_bitmap_t result = {{0} };
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_union(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
++	}
++#else
++	NOT_USED(i);
++	result = (bitmap0 | bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_intersection(
++	const ia_css_kernel_bitmap_t			bitmap0,
++	const ia_css_kernel_bitmap_t			bitmap1)
++{
++	unsigned int i;
++	ia_css_kernel_bitmap_t result = {{0} };
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_intersection(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
++	}
++#else
++	NOT_USED(i);
++	result = (bitmap0 & bitmap1);
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return result;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set(
++	const ia_css_kernel_bitmap_t			bitmap,
++	const unsigned int						index)
++{
++	ia_css_kernel_bitmap_t	bit_mask;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_set(): enter:\n");
++
++	bit_mask = ia_css_kernel_bit_mask(index);
++	return ia_css_kernel_bitmap_union(bitmap, bit_mask);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_unset(
++	const ia_css_kernel_bitmap_t	bitmap,
++	const unsigned int		index)
++{
++	ia_css_kernel_bitmap_t result;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_unset(): enter:\n");
++
++	result = ia_css_kernel_bit_mask(index);
++	result = ia_css_kernel_bitmap_complement(result);
++	return ia_css_kernel_bitmap_intersection(bitmap, result);
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_unique(
++	const ia_css_kernel_bitmap_t			bitmap,
++	const unsigned int						index)
++{
++	ia_css_kernel_bitmap_t	ret;
++	ia_css_kernel_bitmap_t	bit_mask;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_set_unique(): enter:\n");
++
++	ret = ia_css_kernel_bitmap_clear();
++	bit_mask = ia_css_kernel_bit_mask(index);
++
++	if (ia_css_is_kernel_bitmap_intersection_empty(bitmap, bit_mask)
++			&& !ia_css_is_kernel_bitmap_empty(bit_mask)) {
++		ret = ia_css_kernel_bitmap_union(bitmap, bit_mask);
++	}
++	return ret;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bit_mask(
++	const unsigned int						index)
++{
++	unsigned int elem_index;
++	unsigned int elem_bit_index;
++	ia_css_kernel_bitmap_t bit_mask = ia_css_kernel_bitmap_clear();
++
++	/* Assert disabled for staging, because some PGs do not satisfy this condition */
++	/* assert(index < IA_CSS_KERNEL_BITMAP_BITS); */
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bit_mask(): enter:\n");
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
++		elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++		elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++		assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
++
++		bit_mask.data[elem_index] = 1 << elem_bit_index;
++	}
++#else
++	NOT_USED(elem_index);
++	NOT_USED(elem_bit_index);
++	if (index < IA_CSS_KERNEL_BITMAP_BITS) {
++		bit_mask = (ia_css_kernel_bitmap_t)1 << index;
++	}
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return bit_mask;
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++int ia_css_is_kernel_bitmap_set(
++	const ia_css_kernel_bitmap_t	bitmap,
++	const unsigned int				index)
++{
++	unsigned int elem_index;
++	unsigned int elem_bit_index;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_is_kernel_bitmap_set(): enter:\n");
++
++	assert(index < IA_CSS_KERNEL_BITMAP_BITS);
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	elem_index     = index / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++	elem_bit_index = index % IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++	assert(elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS);
++	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
++#else
++	NOT_USED(elem_index);
++	NOT_USED(elem_bit_index);
++	return (((bitmap >> index) & 0x1) == 1);
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++}
++
++IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_shift(
++	const ia_css_kernel_bitmap_t			bitmap)
++{
++	int i;
++	unsigned int lsb_current_elem = 0;
++	unsigned int lsb_previous_elem = 0;
++	ia_css_kernel_bitmap_t loc_bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		       "ia_css_kernel_bitmap_shift(): enter:\n");
++
++	loc_bitmap = bitmap;
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = IA_CSS_KERNEL_BITMAP_NOF_ELEMS - 1; i >= 0; i--) {
++		lsb_current_elem = bitmap.data[i] & 0x01;
++		loc_bitmap.data[i] >>= 1;
++		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_KERNEL_BITMAP_ELEM_BITS - 1));
++		lsb_previous_elem = lsb_current_elem;
++	}
++#else
++	NOT_USED(i);
++	NOT_USED(lsb_current_elem);
++	NOT_USED(lsb_previous_elem);
++	loc_bitmap >>= 1;
++#endif /* IA_CSS_KERNEL_BITMAP_USE_ELEMS */
++	return loc_bitmap;
++}
++
++#endif /* __IA_CSS_KERNEL_BITMAP_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
+new file mode 100644
+index 000000000000..8b7cd391bd1b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_bitmap_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++#define __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C
++#else
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_KERNEL_BITMAP_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
+new file mode 100644
+index 000000000000..b4619aab0db9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_kernel_user_param_types.h
+@@ -0,0 +1,88 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_KERNEL_USER_PARAM_TYPES_H
++#define __IA_CSS_KERNEL_USER_PARAM_TYPES_H
++
++#include "type_support.h"
++
++#define KERNEL_USER_PARAM_S_PADDING 4
++
++#define SIZE_OF_KERNEL_USER_PARAM_S ( \
++      (1 * IA_CSS_UINT64_T_BITS) \
++    + (1 * IA_CSS_UINT32_T_BITS) \
++    + (4 * IA_CSS_UINT16_T_BITS) \
++    + (KERNEL_USER_PARAM_S_PADDING * IA_CSS_UINT8_T_BITS))
++
++/** \brief A kernel user parameter object.
++ * Always use ia_css_kernel_user_param_get_descriptor_size or
++ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info to get the
++ * appropriate size for the kernel user parameter object.
++ *
++ * Use an init function like ia_css_kernel_user_param_init to initialize
++ * the kernel user parameter object.
++ *
++ * Never instantiate this struct in a different way.
++ */
++typedef struct ia_css_kernel_user_param_s {
++    /* Parameter buffer handle attached to the terminal */
++    union {
++        void *p;
++        uint64_t not_used;  /* ensures same struct layout on 64 and 32 bit compilations */
++    } payload_buffer;
++    /* Buffer size */
++    uint32_t payload_buffer_size;
++    /* Points to the variable array of ia_css_kernel_user_param_desc_s */
++    uint16_t kernel_desc_offset;
++    /* Number of kernels in program group */
++    uint16_t kernel_count;
++    /* Number of fragments in frame */
++    uint16_t fragment_count;
++    /* Fragment stride in bytes */
++    uint16_t fragment_stride;
++    /* padding */
++    uint8_t padding[KERNEL_USER_PARAM_S_PADDING];
++} ia_css_kernel_user_param_t;
++
++typedef struct ia_css_kernel_user_param_kernel_desc_s {
++    /* kernel identifier */
++    uint32_t kernel_id;
++    /* Points to the variable array of ia_css_kernel_user_param_cfg_desc_t */
++    uint16_t cfg_desc_offset;
++    /* Number of configurations for this kernel */
++    uint16_t cfg_desc_count;
++} ia_css_kernel_user_param_kernel_desc_t;
++
++typedef struct ia_css_kernel_user_param_cfg_desc_s {
++    /* Offset of the parameter allocation in memory */
++    uint32_t mem_offset;
++    /* Memory allocation size needs of this parameter */
++    uint32_t mem_size;
++} ia_css_kernel_user_param_cfg_desc_t;
++
++/*!
++ * Construction information to construct a kernel user param object.
++ * This type is only used for ia_css_kernel_user_param_init and
++ * ia_css_kernel_user_param_get_descriptor_size_using_kernel_info.
++ */
++typedef struct ia_css_kernel_user_param_kernel_info_s {
++    uint32_t kernel_id;
++    uint16_t section_count;
++    uint32_t *section_sizes; /**< Array of size section_count. Each element
++        encode the size in bytes or a kernel config (section). */
++} ia_css_kernel_user_param_kernel_info_t;
++
++#endif /* __IA_CSS_KERNEL_USER_PARAM_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
+new file mode 100644
+index 000000000000..6716c1ec30f2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_param_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PARAM_STORAGE_CLASS_H
++#define __IA_CSS_PARAM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __INLINE_PARAMETERS__
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_C
++#else
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PARAMETERS_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PARAM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
+new file mode 100644
+index 000000000000..a12da5873188
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data.h
+@@ -0,0 +1,449 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_H
++
++#include "ia_css_psys_data_storage_class.h"
++
++/*! \file */
++
++/** @file ia_css_program_group_data.h
++ *
++ * Define the data objects that are passed to the process groups
++ * i.e. frames and matrices with their sub-structures
++ *
++ * The data objects are separate from the process group terminal,
++ * although they are stored by value rather than by reference and
++ * make the process group terminal dependendent on its definition
++ *
++ * This frame definition overloads the current CSS frame definition
++ * they are the same object, just a slightly different implementation
++ */
++
++#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
++
++#include <type_support.h>
++#include "ia_css_program_group_data_defs.h"	/* ia_css_frame_format_type */
++
++#include "ia_css_terminal_defs.h"
++
++/**
++ * Frame buffer state used for sequencing
++ * (see FAS 5.5.3)
++ *
++ * The buffer can be in DDR or a handle to a stream
++ */
++typedef enum ia_css_buffer_state {
++	IA_CSS_BUFFER_NULL = 0,
++	IA_CSS_BUFFER_UNDEFINED,
++	IA_CSS_BUFFER_EMPTY,
++	IA_CSS_BUFFER_NONEMPTY,
++	IA_CSS_BUFFER_FULL,
++	IA_CSS_N_BUFFER_STATES
++} ia_css_buffer_state_t;
++
++#define IA_CSS_BUFFER_STATE_IN_BITS	32
++
++/**
++ * Pointer state used to signal MMU invalidation
++ */
++typedef enum ia_css_pointer_state {
++	IA_CSS_POINTER_INVALID = 0,
++	IA_CSS_POINTER_VALID,
++	IA_CSS_N_POINTER_STATES
++} ia_css_pointer_state_t;
++
++#define IA_CSS_POINTER_STATE_IN_BITS	32
++
++/**
++ * Access direction needed to select the access port
++ *
++ * @note No known use of any literal in this
++ * enumeration.
++ */
++typedef enum ia_css_access_type {
++	IA_CSS_ACCESS_LOCKED = 0,
++	IA_CSS_ACCESS_READ,
++	IA_CSS_ACCESS_WRITE,
++	IA_CSS_ACCESS_MODIFY,
++	IA_CSS_N_ACCESS_TYPES
++} ia_css_access_type_t;
++
++#define IA_CSS_ACCESS_TYPE_IN_BITS	32
++
++/**
++ * Access attribute needed to select the access port
++ *	- public : snooped
++ *	- private: non-snooped
++ * Naming is a bit awkward, lack of inspiration
++ *
++ * @note No known use of any literal in this
++ * enumeration.
++ */
++typedef enum ia_css_access_scope {
++	IA_CSS_ACCESS_PRIVATE = 0,
++	IA_CSS_ACCESS_PUBLIC,
++	IA_CSS_N_ACCESS_SCOPES
++} ia_css_access_scopes_t;
++
++#define IA_CSS_ACCESS_SCOPES_IN_BITS	32
++
++#define IA_CSS_N_FRAME_PLANES			6
++
++#define IA_CSS_FRAME_FORMAT_BITMAP_BITS	64
++
++typedef uint64_t ia_css_frame_format_bitmap_t;
++
++typedef struct ia_css_param_frame_descriptor_s ia_css_param_frame_descriptor_t;
++typedef struct ia_css_param_frame_s		ia_css_param_frame_t;
++
++typedef struct ia_css_frame_descriptor_s	ia_css_frame_descriptor_t;
++typedef struct ia_css_frame_s				ia_css_frame_t;
++typedef struct ia_css_fragment_descriptor_s	ia_css_fragment_descriptor_t;
++
++typedef struct ia_css_stream_s			ia_css_stream_t;
++
++#define	N_UINT64_IN_STREAM_STRUCT			1
++
++#define	IA_CSS_STREAM_STRUCT_BITS \
++	(N_UINT64_IN_STREAM_STRUCT * 64)
++
++struct ia_css_stream_s {
++	uint64_t dummy;
++};
++
++struct ia_css_param_frame_descriptor_s {
++	uint16_t	size;		/**< Size of the descriptor */
++	uint32_t	buffer_count;	/**< Number of parameter buffers */
++};
++
++struct ia_css_param_frame_s {
++	/** Base virtual addresses to parameters in subsystem virtual
++	 * memory space
++	 */
++	vied_vaddress_t *data;
++};
++
++#define IA_CSS_N_CMPR_OFFSET_PLANES  IA_CSS_N_FRAME_PLANES
++
++#define N_UINT32_IN_FRAME_DESC_STRUCT \
++	(1 + IA_CSS_N_FRAME_PLANES + IA_CSS_N_CMPR_OFFSET_PLANES + (IA_CSS_N_DATA_DIMENSION - 1))
++#define N_UINT16_IN_FRAME_DESC_STRUCT (1 + IA_CSS_N_DATA_DIMENSION)
++#define N_UINT8_IN_FRAME_DESC_STRUCT 4
++#define N_PADDING_UINT8_IN_FRAME_DESC_STRUCT 2
++
++#define	IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
++	(IA_CSS_FRAME_FORMAT_TYPE_BITS \
++	+ (N_UINT32_IN_FRAME_DESC_STRUCT * 32) \
++	+ (N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
++	+ (N_UINT8_IN_FRAME_DESC_STRUCT * 8) \
++	+ (N_PADDING_UINT8_IN_FRAME_DESC_STRUCT * 8))
++
++/**
++ * Structure defining the frame (size and access) properties for
++ * inbuild types only.
++ *
++ * The inbuild types like FourCC, MIPI and CSS private types are supported
++ * by FW all other types are custom types which interpretation must be encoded
++ * on the buffer itself or known by the source and sink
++ */
++struct ia_css_frame_descriptor_s {
++	/** Indicates if this is a generic type or inbuild with
++	  * variable size descriptor.
++	  */
++	ia_css_frame_format_type_t frame_format_type;
++	/** Number of data planes (pointers) */
++	uint32_t plane_count;
++	/** Plane offsets accounting for fragments */
++	uint32_t plane_offsets[IA_CSS_N_FRAME_PLANES];
++	/** Physical size aspects */
++	uint32_t stride[IA_CSS_N_DATA_DIMENSION - 1];
++	/** Tile status buffer offsets for DEC400 compression */
++	uint32_t ts_offsets[IA_CSS_N_FRAME_PLANES];
++	/** Logical dimensions */
++	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
++	/** Size of this descriptor */
++	uint16_t size;
++	/** Bits per pixel (meaningful bits, AKA precision) */
++	uint8_t bpp;
++	/** Bits per element (bits required for storage of the pixel in memory) */
++	uint8_t bpe;
++	/** 1 if terminal uses compressed datatype, 0 otherwise */
++	uint8_t is_compressed;
++	/** 1 if pixel data is signed, 0 otherwise */
++	uint8_t is_signed;
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_FRAME_DESC_STRUCT];
++};
++
++#define	N_UINT32_IN_FRAME_STRUCT		2
++#define	N_PADDING_UINT8_IN_FRAME_STRUCT	4
++
++#define	IA_CSS_FRAME_STRUCT_BITS \
++	(IA_CSS_BUFFER_STATE_IN_BITS \
++	+ IA_CSS_ACCESS_TYPE_IN_BITS \
++	+ IA_CSS_POINTER_STATE_IN_BITS \
++	+ IA_CSS_ACCESS_SCOPES_IN_BITS \
++	+ VIED_VADDRESS_BITS \
++	+ (N_UINT32_IN_FRAME_STRUCT * 32) \
++	+ (N_PADDING_UINT8_IN_FRAME_STRUCT * 8))
++
++/**
++ * Main frame structure holding the main store and auxilary access properties
++ * the "pointer_state" and "access_scope" should be encoded on the
++ * "vied_vaddress_t" type
++ *
++ * @note A number of fields in this structure are either no longer
++ * used, or their use is trivialized, in the current code base.  This is
++ * due to the Persistent Program Group (PPG) concept which separated the
++ * attatchment of frame buffers into a separate structure, the buffer set.
++ * @par Set all unused fields to zero, unless otherwise noted.
++ * @see ia_css_buffer_set_s
++ */
++struct ia_css_frame_s {
++	/** State of the frame for purpose of sequencing.
++	 *
++	 *  @note This field is apparently a leftover from the pre-PPG
++	 *  type of program group and no longer has any real use.
++	 *  For PPG's, set to IA_CSS_BUFFER_FULL for input frames and
++	 *  IA_CSS_BUFFER_EMPTY for output frames */
++	ia_css_buffer_state_t buffer_state;
++	/** Access direction, may change when buffer state changes.
++	 *
++	 *  @note Cannot find any use of this. */
++	ia_css_access_type_t access_type;
++	/** State of the pointer for purpose of embedded MMU coherency
++	 * @note No known non-trivial use of the field.
++	 */
++	ia_css_pointer_state_t pointer_state;
++	/** Access to the pointer for purpose of host cache coherency
++	*  @note Cannot find any use of this. */
++	ia_css_access_scopes_t access_scope;
++	/** Base virtual address to data in IPU subsystem virtual memory space.
++	 *  @note No longer used for PPG's */
++	vied_vaddress_t data;
++	/** Index into the array of buffer addresses within the buffer set structure
++	 *  which is sent separately. The value at that location replaces the
++	 *  "data" field in this structure.  */
++	uint32_t data_index;
++	/** Total buffer allocation size in bytes */
++	uint32_t data_bytes;
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_FRAME_STRUCT];
++};
++
++#define	N_UINT16_IN_FRAGMENT_DESC_STRUCT	(3 * IA_CSS_N_DATA_DIMENSION)
++#define	N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT 4
++
++#define	IA_CSS_FRAGMENT_DESCRIPTOR_STRUCT_BITS \
++	((N_UINT16_IN_FRAME_DESC_STRUCT * 16) \
++	+ (N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT * 8))
++
++/**
++ * Structure defining the fragment (size and access) properties.
++ *
++ * All cropping and padding effects are described by the difference between
++ * the frame size and its location and the fragment size(s) and location(s)
++ */
++struct ia_css_fragment_descriptor_s {
++	/** Logical dimensions of the fragment */
++	uint16_t dimension[IA_CSS_N_DATA_DIMENSION];
++	/** Logical location of the fragment in the frame */
++	uint16_t index[IA_CSS_N_DATA_DIMENSION];
++	/** Fractional start (phase) of the fragment in the access unit */
++	uint16_t offset[IA_CSS_N_DATA_DIMENSION];
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_FRAGMENT_DESC_STRUCT];
++};
++
++/*! Print the frame object to file/stream
++
++ @param	frame[in]			frame object
++ @param	fid[out]			file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_print(
++	const ia_css_frame_t *frame, void *fid);
++
++/*! Get the data buffer handle from the frame object
++
++@param	frame[in]			frame object
++
++@return buffer pointer, VIED_NULL on error
++*/
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
++	const ia_css_frame_t *frame);
++
++/*! Get the data buffer handle from the frame object
++
++ @param	frame[in]			frame object
++
++ @return buffer pointer, VIED_NULL on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++vied_vaddress_t ia_css_frame_get_buffer(const ia_css_frame_t *frame);
++
++/*! Set the data buffer handle on the frame object
++
++ @param	frame[in]			frame object
++ @param	buffer[in]			buffer pointer
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_buffer(
++	ia_css_frame_t *frame, vied_vaddress_t buffer);
++
++/*! Get the data buffer index in the frame object
++
++ @param	frame[in]			frame object
++
++ @return data buffer index on success, -1 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_get_data_index(
++	const ia_css_frame_t *frame);
++
++/*! Set the data buffer index in the frame object
++
++ @param	frame[in]			frame object
++ @param	data_index[in]			data buffer index
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_data_index(
++	ia_css_frame_t *frame,
++	unsigned int data_index);
++
++/*! Set the data buffer size on the frame object
++
++ @param	frame[in]			frame object
++ @param	size[in]			number of data bytes
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_data_bytes(
++	ia_css_frame_t *frame, unsigned size);
++
++/*! Get the data buffer state from the frame object
++
++ @param	frame[in]			frame object
++
++ @return buffer state, limit value on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_buffer_state_t ia_css_frame_get_buffer_state(
++	const ia_css_frame_t *frame);
++
++/*! Set the data buffer state of the frame object
++
++ @param	frame[in]			frame object
++ @param	buffer_state[in]		buffer state
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_buffer_state(ia_css_frame_t *frame,
++	const ia_css_buffer_state_t buffer_state);
++
++/*! Get the data pointer state from the frame object
++
++ @param	frame[in]			frame object
++
++ @return pointer state, limit value on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_pointer_state_t ia_css_frame_get_pointer_state(
++	const ia_css_frame_t *frame);
++
++/*! Set the data pointer state of the frame object
++
++ @param	frame[in]			frame object
++ @param	pointer_state[in]		pointer state
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_set_pointer_state(ia_css_frame_t *frame,
++	const ia_css_pointer_state_t pointer_state);
++
++/*! Print the frame descriptor object to file/stream
++
++ @param	frame_descriptor[in]	frame descriptor object
++ @param	fid[out]		file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_frame_descriptor_print(
++	const ia_css_frame_descriptor_t *frame_descriptor, void *fid);
++
++/*! Print the fragment descriptor object to file/stream
++
++ @param	fragment_descriptor[in]	fragment descriptor object
++ @param	fid[out]		file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++int ia_css_fragment_descriptor_print(
++	const ia_css_fragment_descriptor_t *fragment_descriptor, void *fid);
++
++/*! Compute the bitmap for the frame format type
++
++ @param	frame_format_type[in]	frame format type
++
++ @return 0 on error
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
++	const ia_css_frame_format_type_t frame_format_type);
++
++/*! clear frame format bitmap
++
++ @return cleared bitmap
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void);
++
++/*! Compute the size of storage required for the data descriptor object
++ * on a terminal
++ *@param       plane_count[in]	The number of data planes in the buffer
++ */
++IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++size_t ia_css_sizeof_frame_descriptor(
++		const uint8_t plane_count);
++/*! Compute the size of storage required for the kernel parameter descriptor
++ * object on a terminal
++
++ @param	section_count[in]	The number of parameter sections in the buffer
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_kernel_param_descriptor(
++	const uint16_t section_count);
++
++#ifdef __IA_CSS_PSYS_DATA_INLINE__
++#include "ia_css_program_group_data_impl.h"
++#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
+new file mode 100644
+index 000000000000..6033eee6d191
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_defs.h
+@@ -0,0 +1,244 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H
++
++#include "frame_support.h"
++
++/**
++ * Pre-defined frame format
++ *
++ * Those formats have inbuild support of traffic
++ * and access functions
++ *
++ * Note that the formats are for terminals, so there
++ * is no distinction between input and output formats
++ *	- Custom formats with ot without descriptor
++ *	- 4CC formats such as YUV variants
++ *	- MIPI (line) formats as produced by CSI receivers
++ *	- MIPI (sensor) formats such as Bayer or RGBC
++ *	- CSS internal formats (private types)
++ *  - CSS parameters (type 1 - 6)
++ */
++#define IA_CSS_FRAME_FORMAT_TYPE_BITS 32
++typedef enum ia_css_frame_format_type {
++	IA_CSS_DATA_CUSTOM_NO_DESCRIPTOR = 0,
++	IA_CSS_DATA_CUSTOM,
++
++	/** 12 bit YUV 411, Y, UV 2-plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV11,
++	/** bpp bit YUV 420, Y, U, V 3-plane (bpp/1.5 bpe) */
++	IA_CSS_DATA_FORMAT_YUV420,
++	/** 12 bit YUV 420, Y, V, U 3-plane (8 bit per element) */
++	IA_CSS_DATA_FORMAT_YV12,
++	/** 12 bit YUV 420, Y, UV 2-plane (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV12,
++	/** 16 bit YUV 420, Y, UV 2-plane (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV12_16,
++	/** 12 bit YUV 420, Intel proprietary tiled format, TileY */
++	IA_CSS_DATA_FORMAT_NV12_TILEY,
++	/** 12 bit YUV 420, Y, VU 2-plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV21,
++	/** bpp bit YUV 422, Y, U, V 3-plane (bpp/2 bpe) */
++	IA_CSS_DATA_FORMAT_YUV422,
++	/** 16 bit YUV 422, Y, V, U 3-plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_YV16,
++	/** 16 bit YUV 422, Y, UV 2-plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV16,
++	/** 16 bit YUV 422, Y, VU 2-plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_NV61,
++	/** 16 bit YUV 422, UYVY 1-plane interleaved  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_UYVY,
++	/** 16 bit YUV 422, YUYV 1-plane interleaved  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_YUYV,
++	/** bpp bit YUV 444, Y, U, V 3-plane (bpp/3 bpe) */
++	IA_CSS_DATA_FORMAT_YUV444,
++	/** 8 bit monochrome plane */
++	IA_CSS_DATA_FORMAT_Y800,
++
++	/** 5-6-5 bit packed (1-plane) RGB (16bpp, ~5 bpe) */
++	IA_CSS_DATA_FORMAT_RGB565,
++	/** 24 bit RGB, 3 planes  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_RGB888,
++	/** 32 bit RGB-Alpha, 1 plane  (8 bit per element) */
++	IA_CSS_DATA_FORMAT_RGBA888,
++
++	/** bpp bit raw, [[Gr, R];[B, Gb]] 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_BAYER_GRBG,
++	/** bpp bit raw, [[R, Gr];[Gb, B]] 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_BAYER_RGGB,
++	/** bpp bit raw, [[B, Gb];[Gr, R]] 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_BAYER_BGGR,
++	/** bpp bit raw, [[Gb, B];[R, Gr]] 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_BAYER_GBRG,
++
++	/** bpp bit (NV12) YUV 420, Y, UV 2-plane derived 3-line,
++	 * 2-Y, 1-UV (bpp/1.5 bpe): M420 format
++	 */
++	IA_CSS_DATA_FORMAT_YUV420_LINE,
++	/** Deprecated RAW, 1 plane */
++	IA_CSS_DATA_FORMAT_RAW,
++	/** Deprecated RAW, 1 plane, packed */
++	IA_CSS_DATA_FORMAT_RAW_PACKED,
++	/** Internal, for advanced ISP */
++	IA_CSS_DATA_FORMAT_QPLANE6,
++	/** 1D byte stream, used for jpeg 1-plane */
++	IA_CSS_DATA_FORMAT_BINARY_8,
++	/** Deprecated MIPI frame, 1D byte stream 1 plane */
++	IA_CSS_DATA_FORMAT_MIPI,
++	/** 12 bit [[YY];[UYVY]] 1-plane interleaved 2-line
++	 * (8 bit per element)
++	 */
++	IA_CSS_DATA_FORMAT_MIPI_YUV420_8,
++	/** 15 bit [[YY];[UYVY]] 1-plane interleaved 2-line
++	 * (10 bit per element)
++	 */
++	IA_CSS_DATA_FORMAT_MIPI_YUV420_10,
++	/** 12 bit [[UY];[VY]] 1-plane interleaved 2-line (8 bit per element) */
++	IA_CSS_DATA_FORMAT_MIPI_LEGACY_YUV420_8,
++
++	/** Type 1-5 parameter, not fragmentable */
++	IA_CSS_DATA_GENERIC_PARAMETER,
++	/** Video stabilisation Type 6 parameter, fragmentable */
++	IA_CSS_DATA_DVS_PARAMETER,
++	/** Video stabilisation Type 6 parameter, coordinates */
++	IA_CSS_DATA_DVS_COORDINATES,
++	/** Dead Pixel correction Type 6 parameter, fragmentable */
++	IA_CSS_DATA_DPC_PARAMETER,
++	/** Lens Shading Correction Type 6 parameter, fragmentable */
++	IA_CSS_DATA_LSC_PARAMETER,
++	/** 3A statistics output HI. */
++	IA_CSS_DATA_S3A_STATISTICS_HI,
++	/** 3A statistics output LO. */
++	IA_CSS_DATA_S3A_STATISTICS_LO,
++	/** histogram output */
++	IA_CSS_DATA_S3A_HISTOGRAM,
++	/** GammaStar grid */
++	IA_CSS_DATA_GAMMASTAR_GRID,
++
++	/** Gr R B Gb Gr R B Gb  in PIXELS  (also called isys interleaved) */
++	IA_CSS_DATA_FORMAT_BAYER_LINE_INTERLEAVED,
++	/** Gr R B Gb Gr R B Gb  in VECTORS (VCC IMAGE, ISP NWAY depentdent) */
++	IA_CSS_DATA_FORMAT_BAYER_VECTORIZED,
++	/** Gr R B Gb 4-planes */
++	IA_CSS_DATA_FORMAT_BAYER_PLANAR,
++	/** Gr R Gr R ... | B Gb B Gb ..  in VECTORS (ISP NWAY depentdent) */
++	IA_CSS_DATA_FORMAT_BAYER_GRBG_VECTORIZED,
++
++	/** 16 bit YUV 420, Y even plane, Y uneven plane,
++	 * UV plane vector interleaved
++	 */
++	IA_CSS_DATA_FORMAT_YUV420_VECTORIZED,
++	/** 16 bit YUV 420, YYUVYY vector interleaved */
++	IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED,
++
++	/** 12 bit YUV 420, Intel proprietary tiled format, TileYf */
++	IA_CSS_DATA_FORMAT_NV12_TILEYF,
++
++	/** Y samples appear first in the memory. All Y samples are array of WORDs;
++	* even number of lines ;
++	* Surface stride can be larger than the width of Y plane.
++	* This array is followed immediately by chroma array.
++	* Chroma array is an array of WORDs, with interleaved U/V samples.
++	* If the interleaved U/V plane is addresses as an * array of DWORDs,
++	* the least significant word contains U sample. The stride of the
++	* interleaved U/V plane is equal to Y plane. 10 bit data.
++	*/
++	IA_CSS_DATA_FORMAT_P010,
++
++	/** MSB aligned version of P010*/
++	IA_CSS_DATA_FORMAT_P010_MSB,
++
++	/** P016/P012 Y samples appear first in the memory.
++	* All Y samples are array of WORDs;
++	* even number of lines ;
++	* Surface stride can be larger than the width of Y plane.
++	* This array is followed immediately by chroma array.
++	* Chroma array is an array of WORDs, with interleaved U/V samples.
++	* If the interleaved U/V plane is addresses as an * array of DWORDs,
++	* the least significant word contains U sample. The stride of the
++	* interleaved U/V plane is equal to Y plane. 12 bit data.
++	*/
++	IA_CSS_DATA_FORMAT_P016,
++
++	/** MSB aligned version of P016*/
++	IA_CSS_DATA_FORMAT_P016_MSB,
++
++	/** TILEY representation of P010 LSB-aligned format */
++	IA_CSS_DATA_FORMAT_P010_TILEY,
++
++	/** TILEY representation of P010 MSB-aligned format */
++	IA_CSS_DATA_FORMAT_P010_MSB_TILEY,
++
++	/** TILEY representation of P016 LSB-aligned format */
++	IA_CSS_DATA_FORMAT_P016_TILEY,
++
++	/** TILEY representation of P016 MSB-aligned format*/
++	IA_CSS_DATA_FORMAT_P016_MSB_TILEY,
++
++	/** TILEYf representation of P010*/
++	IA_CSS_DATA_FORMAT_P010_TILEYF,
++
++	/** TILEYf representation of P010 MSB aligned*/
++	IA_CSS_DATA_FORMAT_P010_MSB_TILEYF,
++
++	/** TILEYf representation of P016*/
++	IA_CSS_DATA_FORMAT_P016_TILEYF,
++
++	/** TILEYf representation of P016 MSB aligned*/
++	IA_CSS_DATA_FORMAT_P016_MSB_TILEYF,
++
++	/** consists of L and R PDAF pixel line pairs.
++	 * If line n is L pixel line, n+1 will be R pixel line.
++	 * Depending on mode - First line can be L or R pixel line and
++	 * the line pair sequence can also alternate. 1-plane (bpp == bpe)
++	 */
++	IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED,
++
++	/** consists of L and R PDAF pixel pairs.
++         * Depending on mode - Pixel pairs can be LRLR.., RLRL.. and
++         * alternating between the above two as well. 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_PAF_INTERLEAVED,
++
++	/** bpp bit raw, INFRA-RED (IR) 1-plane (bpp == bpe) */
++	IA_CSS_DATA_FORMAT_IR,
++
++	/** MSB aligned version of P012*/
++	IA_CSS_DATA_FORMAT_P012_MSB,
++
++	/* Each tile is stored in consecutive addresses in DDR.
++	 * The scanning walking order within a tile is raster order
++	 * (line-by-line).
++	 */
++	/* NV12 is a semi-planar (two planes) format: A plane of 8 bit Y samples
++	 * followed by an interleaved 8 bit U/V
++	 * samples plane.
++	 */
++	IA_CSS_DATA_FORMAT_NV12_TILE,
++	/*P010 is similar to NV12, but with 10 bit values,
++	 * each stored in a 16b container (msb aligned, 6 lsb are zero).
++	 */
++	IA_CSS_DATA_FORMAT_P010_TILE,
++	/* P012 is similar to P010, but with 12 bit values,
++	 * each stored in a 16b containers (msb aligned, 4 lsb are zero).
++	 */
++	IA_CSS_DATA_FORMAT_P012_TILE,
++
++	IA_CSS_N_FRAME_FORMAT_TYPES
++} ia_css_frame_format_type_t;
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
+new file mode 100644
+index 000000000000..461e29bfef5f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_data_impl.h
+@@ -0,0 +1,461 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
++#define __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H
++
++#include "ia_css_program_group_data.h"
++#include "ia_css_psys_data_trace.h"
++#include <error_support.h>	/* for verifexit */
++#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
++#include <misc_support.h>	/* for NOT_USED */
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_print(
++	const ia_css_frame_t *frame, void *fid)
++{
++	int retval = -1;
++
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO, "ia_css_frame_print(): enter:\n");
++
++	verifexit(frame != NULL);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tbuffer = %d\n", ia_css_frame_get_buffer(frame));
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tbuffer_state = %d\n", ia_css_frame_get_buffer_state(frame));
++	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tbuffer_state = %s\n",
++	 * ia_css_buffer_state_string(ia_css_frame_get_buffer_state(frame)));
++	 */
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++	       "\tpointer_state = %d\n", ia_css_frame_get_pointer_state(frame));
++	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tpointer_state = %s\n",
++	 * ia_css_pointer_state_string(ia_css_frame_get_pointer_state(frame)));
++	 */
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tdata_bytes = %d\n", frame->data_bytes);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++const vied_vaddress_t *ia_css_frame_get_buffer_host_virtual_address(
++	const ia_css_frame_t *frame) {
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_get_buffer_host_virtual_address(): enter:\n");
++
++	verifexit(frame != NULL);
++	return &(frame->data);
++
++EXIT:
++	if (NULL == frame) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++			"ia_css_frame_get_buffer_host_virtual_address invalid argument\n");
++	}
++	return NULL;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++vied_vaddress_t	ia_css_frame_get_buffer(
++	const ia_css_frame_t *frame)
++{
++	vied_vaddress_t	buffer = VIED_NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_get_buffer(): enter:\n");
++
++	verifexit(frame != NULL);
++	buffer = frame->data;
++
++EXIT:
++	if (NULL == frame) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++		       "ia_css_frame_get_buffer invalid argument\n");
++	}
++	return buffer;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_buffer(
++	ia_css_frame_t *frame,
++	vied_vaddress_t buffer)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_set_buffer(): enter:\n");
++
++	verifexit(frame != NULL);
++	frame->data = buffer;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_set_buffer failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_get_data_index(
++	const ia_css_frame_t *frame)
++{
++	int data_index = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_get_data_index(): enter:\n");
++
++	verifexit(frame != NULL);
++
++	data_index = frame->data_index;
++
++EXIT:
++	if (NULL == frame) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++		       "ia_css_frame_get_data_index invalid argument\n");
++	}
++	return data_index;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_data_index(
++	ia_css_frame_t *frame,
++	unsigned int data_index)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_set_data_index(): enter:\n");
++
++	verifexit(frame != NULL);
++
++	frame->data_index = data_index;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_set_data_index failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_data_bytes(
++	ia_css_frame_t *frame,
++	unsigned int size)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_set_data_bytes(): enter:\n");
++
++	verifexit(frame != NULL);
++	frame->data_bytes = size;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_set_data_bytes failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_buffer_state_t ia_css_frame_get_buffer_state(
++	const ia_css_frame_t *frame)
++{
++	ia_css_buffer_state_t buffer_state = IA_CSS_N_BUFFER_STATES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_get_buffer_state(): enter:\n");
++
++	verifexit(frame != NULL);
++	buffer_state = frame->buffer_state;
++
++EXIT:
++	if (NULL == frame) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++			"ia_css_frame_get_buffer_state invalid argument\n");
++	}
++	return buffer_state;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_buffer_state(
++	ia_css_frame_t *frame,
++	const ia_css_buffer_state_t buffer_state)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_set_buffer_state(): enter:\n");
++
++	verifexit(frame != NULL);
++	frame->buffer_state = buffer_state;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_set_buffer_state failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_pointer_state_t ia_css_frame_get_pointer_state(
++	const ia_css_frame_t *frame)
++{
++	ia_css_pointer_state_t pointer_state = IA_CSS_N_POINTER_STATES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_get_pointer_state(): enter:\n");
++
++	verifexit(frame != NULL);
++	pointer_state = frame->pointer_state;
++
++EXIT:
++	if (NULL == frame) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++			"ia_css_frame_get_pointer_state invalid argument\n");
++	}
++	return pointer_state;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_set_pointer_state(
++	ia_css_frame_t *frame,
++	const ia_css_pointer_state_t pointer_state)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_set_pointer_state(): enter:\n");
++
++	verifexit(frame != NULL);
++	frame->pointer_state = pointer_state;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_set_pointer_state failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_frame_descriptor_print(
++	const ia_css_frame_descriptor_t *frame_descriptor,
++	void *fid)
++{
++	int retval = -1;
++	int i;
++	uint8_t frame_plane_count;
++
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++		"ia_css_frame_descriptor_print(): enter:\n");
++
++	COMPILATION_ERROR_IF(IA_CSS_N_DATA_DIMENSION <= 0);
++
++	verifexit(frame_descriptor != NULL);
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++		"ia_css_frame_descriptor_print(): enter:\n");
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tframe_format_type = %d\n",
++		frame_descriptor->frame_format_type);
++	/* IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\tframe_format_type = %s\n",
++	 * ia_css_frame_format_string(frame_descriptor->frame_format_type));
++	 */
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tbpp = %d\n", frame_descriptor->bpp);
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tbpe = %d\n", frame_descriptor->bpe);
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tis_compressed = %d\n", frame_descriptor->is_compressed);
++
++	frame_plane_count = IA_CSS_N_FRAME_PLANES;
++	/* frame_plane_count =
++	 * ia_css_frame_plane_count(frame_descriptor->frame_format_type);
++	 */
++
++	verifexit(frame_plane_count > 0);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tplane_offsets[%d]: [\n", frame_plane_count);
++	for (i = 0; i < (int)frame_plane_count - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", frame_descriptor->plane_offsets[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d ]\n", frame_descriptor->plane_offsets[i]);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tts_offsets[%d]: [\n", frame_plane_count);
++	for (i = 0; i < (int)frame_plane_count - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", frame_descriptor->ts_offsets[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d ]\n", frame_descriptor->ts_offsets[i]);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tdimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", frame_descriptor->dimension[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d }\n", frame_descriptor->dimension[i]);
++
++	COMPILATION_ERROR_IF(0 > (IA_CSS_N_DATA_DIMENSION - 2));
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\tstride[%d] = {\n", IA_CSS_N_DATA_DIMENSION - 1);
++	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 2; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", frame_descriptor->stride[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d }\n", frame_descriptor->stride[i]);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++			"ia_css_frame_descriptor_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++int ia_css_fragment_descriptor_print(
++	const ia_css_fragment_descriptor_t *fragment_descriptor,
++	void *fid)
++{
++	int retval = -1;
++	int i;
++
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, INFO,
++		"ia_css_fragment_descriptor_print(): enter:\n");
++
++	verifexit(fragment_descriptor != NULL);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"dimension[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", fragment_descriptor->dimension[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d }\n", fragment_descriptor->dimension[i]);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"index[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", fragment_descriptor->index[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"\t%4d }\n", fragment_descriptor->index[i]);
++
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++		"offset[%d] = {\n", IA_CSS_N_DATA_DIMENSION);
++	for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, INFO,
++			"\t%4d,\n", fragment_descriptor->offset[i]);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DATA, INFO, "\t%4d }\n",
++		fragment_descriptor->offset[i]);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DATA, ERROR,
++		      "ia_css_fragment_descriptor_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_frame_format_bitmap_t ia_css_frame_format_bit_mask(
++	const ia_css_frame_format_type_t frame_format_type)
++{
++	ia_css_frame_format_bitmap_t bit_mask = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		"ia_css_frame_format_bit_mask(): enter:\n");
++
++	if (frame_format_type < IA_CSS_N_FRAME_FORMAT_TYPES) {
++		bit_mask = (ia_css_frame_format_bitmap_t)1 << frame_format_type;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++			"ia_css_frame_format_bit_mask invalid argument\n");
++	}
++
++	return bit_mask;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++ia_css_frame_format_bitmap_t ia_css_frame_format_bitmap_clear(void)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		       "ia_css_frame_format_bitmap_clear(): enter:\n");
++
++	return 0;
++}
++
++IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++size_t ia_css_sizeof_frame_descriptor(
++		const uint8_t plane_count)
++{
++	size_t size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DATA, VERBOSE,
++		       "ia_css_sizeof_frame_descriptor(): enter:\n");
++
++	verifexit(plane_count > 0);
++	size += sizeof(ia_css_frame_descriptor_t);
++	size += plane_count * sizeof(uint32_t);
++
++EXIT:
++	if (0 == plane_count) {
++		IA_CSS_TRACE_0(PSYSAPI_DATA, WARNING,
++			"ia_css_sizeof_frame_descriptor invalid argument\n");
++	}
++	return size;
++}
++
++#endif /* __IA_CSS_PROGRAM_GROUP_DATA_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
+new file mode 100644
+index 000000000000..94d5ff4555df
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.h
+@@ -0,0 +1,295 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param.h
++ *
++ * Define the methods on the program group parameter object that are not part
++ * of a single interface
++ */
++#include <ia_css_program_group_param_types.h>
++
++#include <ia_css_program_group_param.sim.h>
++
++#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
++
++#include <type_support.h>
++
++/*! Get the stored size of the program group parameter object
++
++ @param	param[in]			program group parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_program_group_param_get_size(
++	const ia_css_program_group_param_t		*param);
++
++/*! initialize program_group_param
++
++ @param	blob[in]	program group parameter object
++ @param	program_count[in]		number of  terminals.
++ @param	terminal_count[in]		number of  terminals.
++ @param	fragment_count[in]		number of  terminals.
++
++ @return 0 if success, else failure.
++ */
++extern int ia_css_program_group_param_init(
++	ia_css_program_group_param_t *blob,
++	const uint8_t	program_count,
++	const uint8_t	terminal_count,
++	const uint16_t	fragment_count,
++	const enum ia_css_frame_format_type *frame_format_types);
++/*! Get the program parameter object from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++ @param	i[in]				program parameter index
++
++ @return program parameter pointer, NULL on error
++ */
++extern ia_css_program_param_t *ia_css_program_group_param_get_program_param(
++	const ia_css_program_group_param_t *param,
++	const int i);
++
++/*! Get the terminal parameter object from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++ @param	i[in]				terminal parameter index
++
++ @return terminal parameter pointer, NULL on error
++ */
++extern ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
++	const ia_css_program_group_param_t *param,
++	const int i);
++
++/*! Get the fragment count from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return fragment count, 0 on error
++ */
++extern uint16_t ia_css_program_group_param_get_fragment_count(
++	const ia_css_program_group_param_t		*param);
++
++/*! Get the program count from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return program count, 0 on error
++ */
++extern uint8_t ia_css_program_group_param_get_program_count(
++	const ia_css_program_group_param_t		*param);
++
++/*! Get the terminal count from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return terminal count, 0 on error
++ */
++extern uint8_t ia_css_program_group_param_get_terminal_count(
++	const ia_css_program_group_param_t		*param);
++
++/*! Set the protocol version in a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++ @param	protocol_version[in]		protocol version
++
++ @return nonzero on error
++*/
++extern int
++ia_css_program_group_param_set_protocol_version(
++	ia_css_program_group_param_t *param,
++	uint8_t protocol_version);
++
++/*! Get the protocol version from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return protocol version
++*/
++extern uint8_t
++ia_css_program_group_param_get_protocol_version(
++	const ia_css_program_group_param_t *param);
++
++/*! Set the kernel enable bitmap from a program group parameter object
++
++ @param	param[in]			program group parameter object
++ @param	bitmap[in]			kernel enable bitmap
++
++ @return non-zero on error
++ */
++extern int ia_css_program_group_param_set_kernel_enable_bitmap(
++	ia_css_program_group_param_t	*param,
++	const ia_css_kernel_bitmap_t	bitmap);
++
++/*! Get the kernel enable bitmap from a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return kernel enable bitmap, 0 on error
++*/
++extern ia_css_kernel_bitmap_t
++ia_css_program_group_param_get_kernel_enable_bitmap(
++	const ia_css_program_group_param_t *param);
++
++/*! Get the stored size of the program parameter object
++
++ @param	param[in]			program parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_program_param_get_size(
++	const ia_css_program_param_t			*param);
++
++/*! Set the kernel enable bitmap from a program parameter object, DEPRECATED
++
++ @param	program_param[in]		program parameter object
++ @param	bitmap[in]			kernel enable bitmap
++
++ @return non-zero on error
++ */
++extern int ia_css_program_param_set_kernel_enable_bitmap(
++	ia_css_program_param_t	*program_param,
++	const ia_css_kernel_bitmap_t	bitmap);
++
++/*! Get the kernel enable bitmap from a program parameter object
++
++ @param	program_param[in]		program parameter object DEPRECATED
++
++ Note: This function returns in fact the kernel enable of the program group
++      parameters
++
++ @return kernel enable bitmap, 0 on error
++ */
++extern ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
++	const ia_css_program_param_t			*param);
++
++/*! Get the stored size of the terminal parameter object
++
++ @param	param[in]			terminal parameter object
++
++ @return size, 0 on error
++ */
++extern size_t ia_css_terminal_param_get_size(
++	const ia_css_terminal_param_t			*param);
++
++/*! Get the kernel enable bitmap from a terminal parameter object
++
++ @param	terminal_param[in]		terminal parameter object
++
++ Note: This function returns in fact the kernel enable of the program group
++       parameters
++
++ @return kernel enable bitmap, 0 on error
++ */
++extern ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
++	const ia_css_terminal_param_t			*param);
++
++/*! Get the parent object for this terminal param.
++
++ @param	terminal_param[in]		terminal parameter object
++
++ @return parent program group param object
++ */
++extern ia_css_program_group_param_t *ia_css_terminal_param_get_parent(
++	const ia_css_terminal_param_t			*param);
++
++/*! Get the data format type associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++
++ @return data format type (ia_css_data_format_type_t)
++ */
++extern ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
++	const ia_css_terminal_param_t	*terminal_param);
++
++/*! Set the data format type associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++ @param data_format_type[in]		data format type
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_frame_format_type(
++	ia_css_terminal_param_t	*terminal_param,
++	const ia_css_frame_format_type_t data_format_type);
++
++/*! Get bits per pixel on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++
++ @return bits per pixel
++ */
++extern uint8_t ia_css_terminal_param_get_bpp(
++	const ia_css_terminal_param_t	*terminal_param);
++
++/*! Set bits per pixel on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++ @param bpp[in]				bits per pixel
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_bpp(
++	ia_css_terminal_param_t	*terminal_param,
++	const uint8_t bpp);
++
++/*! Get dimensions on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++ @param	dimensions[out]			dimension array
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_get_dimensions(
++	const ia_css_terminal_param_t	*terminal_param,
++	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set dimensions on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++ @param	dimensions[in]			dimension array
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_dimensions(
++	ia_css_terminal_param_t	*terminal_param,
++	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get stride on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++
++ @return stride of the frame to be attached.
++ */
++extern uint32_t ia_css_terminal_param_get_stride(
++	const ia_css_terminal_param_t	*terminal_param);
++
++/*! Set stride on the frame associated with the terminal.
++
++ @param	terminal_param[in]		terminal parameter object
++ @param	stride[in]				stride
++
++ @return non-zero on error.
++ */
++extern int ia_css_terminal_param_set_stride(
++	ia_css_terminal_param_t	*terminal_param,
++	const uint32_t stride);
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
+new file mode 100644
+index 000000000000..3b98832312e1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param.sim.h
+@@ -0,0 +1,155 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param.sim.h
++ *
++ * Define the methods on the program group parameter object: Simulation only
++ */
++#include <ia_css_program_group_param_types.h>
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>
++
++/* Simulation */
++
++/*! Create a program group parameter object from specification
++
++ @param	specification[in]		specification (index)
++ @param	manifest[in]			program group manifest
++
++ @return NULL on error
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_create(
++	const unsigned int			specification,
++	const ia_css_program_group_manifest_t	*manifest);
++
++/*! Destroy the program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return NULL
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_destroy(
++	ia_css_program_group_param_t			*param);
++
++/*! Compute the size of storage required for allocating
++ * the program group parameter object
++
++ @param	program_count[in]	Number of programs in the process group
++ @param	terminal_count[in]	Number of terminals on the process group
++ @param	fragment_count[in]	Number of fragments on the terminals of
++				the process group
++
++ @return 0 on error
++ */
++size_t ia_css_sizeof_program_group_param(
++	const uint8_t	program_count,
++	const uint8_t	terminal_count,
++	const uint16_t	fragment_count);
++
++/*! Allocate (the store of) a program group parameter object
++
++ @param	program_count[in]	Number of programs in the process group
++ @param	terminal_count[in]	Number of terminals on the process group
++ @param	fragment_count[in]	Number of fragments on the terminals of
++				the process group
++
++ @return program group parameter pointer, NULL on error
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_alloc(
++	const uint8_t	program_count,
++	const uint8_t	terminal_count,
++	const uint16_t	fragment_count);
++
++/*! Free (the store of) a program group parameter object
++
++ @param	program_group_param[in]		program group parameter object
++
++ @return NULL
++ */
++extern ia_css_program_group_param_t *ia_css_program_group_param_free(
++	ia_css_program_group_param_t			*param);
++
++/*! Print the program group parameter object to file/stream
++
++ @param	param[in]	program group parameter object
++ @param	fid[out]	file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_param_print(
++	const ia_css_program_group_param_t	*param,
++	void					*fid);
++
++/*! Allocate (the store of) a program parameter object
++
++ @return program parameter pointer, NULL on error
++ */
++extern ia_css_program_param_t *ia_css_program_param_alloc(void);
++
++/*! Free (the store of) a program parameter object
++
++ @param	param[in]	program parameter object
++
++ @return NULL
++ */
++extern ia_css_program_param_t *ia_css_program_param_free(
++	ia_css_program_param_t					*param);
++
++/*! Print the program parameter object to file/stream
++
++ @param	param[in]					program parameter object
++ @param	fid[out]					file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_param_print(
++	const ia_css_program_param_t	*param,
++	void				*fid);
++
++/*! Allocate (the store of) a terminal parameter object
++
++ @return terminal parameter pointer, NULL on error
++ */
++extern ia_css_terminal_param_t *ia_css_terminal_param_alloc(void);
++
++/*! Free (the store of) a terminal parameter object
++
++ @param	param[in]	terminal parameter object
++
++ @return NULL
++ */
++extern ia_css_terminal_param_t *ia_css_terminal_param_free(
++	ia_css_terminal_param_t					*param);
++
++/*! Print the terminal parameter object to file/stream
++
++ @param	param[in]	terminal parameter object
++ @param	fid[out]	file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_terminal_param_print(
++	const ia_css_terminal_param_t	*param,
++	void				*fid);
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
+new file mode 100644
+index 000000000000..6b8bdb23fc10
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_private.h
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H
++
++#include <ia_css_program_group_param.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_kernel_bitmap.h>
++#include <ia_css_program_group_data.h>
++#include <type_support.h>
++
++#define N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT 7
++#define SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS \
++	(IA_CSS_KERNEL_BITMAP_BITS \
++	+ (3 * IA_CSS_UINT32_T_BITS) \
++	+ IA_CSS_UINT16_T_BITS \
++	+ (3 * IA_CSS_UINT8_T_BITS) \
++	+ (N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/* tentative; co-design with ISP algorithm */
++struct ia_css_program_group_param_s {
++	/** The enable bits for each individual kernel */
++	ia_css_kernel_bitmap_t kernel_enable_bitmap;
++	/** Size of this structure */
++	uint32_t size;
++	/** Offset of program parameters array from the base of this structure.  See ia_css_program_param_s */
++	uint32_t program_param_offset;
++	/** Offset of terminal parameters array from the base of this structure.  See ia_css_terminal_param_s */
++	uint32_t terminal_param_offset;
++	/** Number of (explicit) fragments to use in a frame */
++	uint16_t fragment_count;
++	/** Number of active programs */
++	uint8_t program_count;
++	/** Number of active terminals */
++	uint8_t terminal_count;
++	/** Program group protocol version */
++	uint8_t protocol_version;
++	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_GROUP_PARAM_STRUCT];
++};
++
++#define SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS \
++	(IA_CSS_KERNEL_BITMAP_BITS \
++	+ IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_INT32_T_BITS)
++
++/* private */
++struct ia_css_program_param_s {
++	/** Bitmap of kernel encapsulated by this program.  If all of these kernels are
++	 *  disabled, the program will be disabled too. */
++	ia_css_kernel_bitmap_t kernel_enable_bitmap;
++	/** Size of this structure */
++	uint32_t size;
++	/** Offset to add to reach parent. This is negative value.*/
++	int32_t parent_offset;
++};
++
++#define SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS \
++	(IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_FRAME_FORMAT_TYPE_BITS \
++	+ IA_CSS_INT32_T_BITS \
++	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++	+ (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION) \
++	+ IA_CSS_INT32_T_BITS \
++	+ IA_CSS_UINT16_T_BITS \
++	+ IA_CSS_UINT8_T_BITS \
++	+ (IA_CSS_UINT8_T_BITS * 1))
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_PRIVATE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
+new file mode 100644
+index 000000000000..4d81cca96eb4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_program_group_param_types.h
+@@ -0,0 +1,66 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
++#define __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_program_group_param_types.h
++ *
++ * Define the parameter objects that are necessary to create the process
++ * groups i.e. enable parameters and parameters to set-up frame descriptors
++ */
++
++#include <ia_css_program_group_data.h>
++#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
++#include <ia_css_terminal_defs.h>
++
++#include <type_support.h>
++/*! make this public so that driver can populate,
++ * size, bpp, dimensions for all terminals.
++ *
++ * Currently one API is provided to get frame_format_type.
++ *
++ * frame_format_type is set during ia_css_terminal_param_init().
++ * Value for that is const and binary specific.
++ */
++struct ia_css_terminal_param_s {
++	uint32_t size;	/**< Size of this structure */
++	/** Indicates if this is a generic type or inbuild
++	 * with variable size descriptor
++	 */
++	ia_css_frame_format_type_t frame_format_type;
++	/** offset to add to reach parent. This is negative value.*/
++	int32_t parent_offset;
++	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION];/**< Logical dimensions */
++	/** Mapping to the index field of the terminal descriptor */
++	uint16_t index[IA_CSS_N_DATA_DIMENSION];
++	/** Logical fragment dimension,
++	 * TODO: fragment dimensions can be different per fragment
++	 */
++	uint16_t fragment_dimensions[IA_CSS_N_DATA_DIMENSION];
++	uint32_t stride;/**< Stride (buffer width) of a frame in bytes */
++	uint16_t offset;/**< Offset in bytes to first fragment */
++	uint8_t bpp;	/**< Bits per pixel.  The number of bits with significant data. */
++	uint8_t bpe;	/**< Bits per element  The number of bits required to store the pixel.  Must be >= bpp. */
++};
++
++typedef struct ia_css_program_group_param_s	ia_css_program_group_param_t;
++typedef struct ia_css_program_param_s		ia_css_program_param_t;
++typedef struct ia_css_terminal_param_s		ia_css_terminal_param_t;
++
++#endif /* __IA_CSS_PROGRAM_GROUP_PARAM_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
+new file mode 100644
+index 000000000000..27ae62d79211
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_buffer_set.h
+@@ -0,0 +1,290 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_BUFFER_SET_H
++#define __IA_CSS_PSYS_BUFFER_SET_H
++
++#include "ia_css_base_types.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_process_types.h"
++#include "ia_css_terminal_types.h"
++#include "ia_css_kernel_bitmap.h"
++#include "ia_css_rbm.h"
++
++#define N_UINT64_IN_BUFFER_SET_STRUCT		1
++#define N_UINT16_IN_BUFFER_SET_STRUCT		1
++#define N_UINT8_IN_BUFFER_SET_STRUCT		1
++#define N_PADDING_UINT8_IN_BUFFER_SET_STRUCT	1
++#define SIZE_OF_BUFFER_SET \
++	(N_UINT64_IN_BUFFER_SET_STRUCT * IA_CSS_UINT64_T_BITS \
++	+ IA_CSS_KERNEL_BITMAP_BITS \
++	+ IA_CSS_KERNEL_BITMAP_BITS \
++	+ IA_CSS_KERNEL_BITMAP_BITS \
++	+ IA_CSS_RBM_BITS \
++	+ VIED_VADDRESS_BITS \
++	+ VIED_VADDRESS_BITS \
++	+ N_UINT16_IN_BUFFER_SET_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS \
++	+ N_PADDING_UINT8_IN_BUFFER_SET_STRUCT * IA_CSS_UINT8_T_BITS)
++
++typedef struct ia_css_buffer_set_s ia_css_buffer_set_t;
++
++struct ia_css_buffer_set_s {
++	/** Token for user context reference */
++	uint64_t token;
++	/** Enable bits for each individual kernel
++	 * For integration, all 0's should be treated as uninitialized and
++	 * assume all processes are enabled */
++	ia_css_kernel_bitmap_t kernel_enable_bitmap;
++	/** Enable bits for each individual terminals per call */
++	ia_css_kernel_bitmap_t terminal_enable_bitmap;
++	/** Enable bits for each individual routing per call */
++	ia_css_kernel_bitmap_t routing_enable_bitmap;
++	/** Enable bits for routing per call */
++	ia_css_rbm_t rbm;
++	/** IPU virtual address of this buffer set */
++	vied_vaddress_t ipu_virtual_address;
++	/** IPU virtual address of the process group corresponding to this buffer set */
++	vied_vaddress_t process_group_handle;
++	/** Number of terminal buffer addresses in this structure */
++	uint16_t terminal_count;
++	/** Frame id to associate with this buffer set */
++	uint8_t frame_counter;
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_BUFFER_SET_STRUCT];
++};
++
++#define N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT	3
++#define SIZE_OF_DYNAMIC_TERMINAL_DESCRIPTOR \
++	VIED_VADDRESS_BITS \
++	+ ( 1 * IA_CSS_UINT8_T_BITS) \
++	+ ( N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT * IA_CSS_UINT8_T_BITS)
++
++typedef struct ia_css_dynamic_terminal_descriptor_s ia_css_dynamic_terminal_descriptor_t;
++struct ia_css_dynamic_terminal_descriptor_s {
++	/** Terminal buffer virtual address */
++	vied_vaddress_t virtual_buffer_address;
++	/** Per-frame compression control, boolean semantics */
++	uint8_t enable_compression;
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_DYNAMIC_TERMINAL_DESCRIPTOR_STRUCT];
++};
++
++/*! Construct a buffer set object at specified location
++
++ @param	buffer_set_mem[in]	memory location to create buffer set object
++ @param	process_group[in]	process group corresponding to this buffer set
++ @param	frame_counter[in]	frame number for this buffer set object
++
++ @return pointer to buffer set object on success, NULL on error
++ */
++ia_css_buffer_set_t *ia_css_buffer_set_create(
++	void *buffer_set_mem,
++	const ia_css_process_group_t *process_group,
++	const unsigned int frame_counter);
++
++/*! Compute size (in bytes) required for full buffer set object
++
++ @param	process_group[in]	process group corresponding to this buffer set
++
++ @return size in bytes of buffer set object on success, 0 on error
++ */
++size_t ia_css_sizeof_buffer_set(
++	const ia_css_process_group_t *process_group);
++
++/*! Set a buffer address in a buffer set object
++
++ @param	buffer_set[in]		buffer set object to set buffer in
++ @param	terminal_index[in]	terminal index to use as a reference between
++				buffer and terminal
++ @param	buffer[in]		buffer address to store
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_buffer(
++	ia_css_buffer_set_t *buffer_set,
++	const unsigned int terminal_index,
++	const vied_vaddress_t buffer);
++
++/*! Get virtual buffer address from a buffer set object and terminal object by
++   resolving the index used
++
++ @param	buffer_set[in]		buffer set object to get buffer from
++ @param	terminal[in]		terminal object to get buffer of
++
++ @return virtual buffer address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_buffer(
++	const ia_css_buffer_set_t *buffer_set,
++	const ia_css_terminal_t *terminal);
++
++/*! Set ipu virtual address of a buffer set object within the buffer set object
++
++ @param	buffer_set[in]		buffer set object to set ipu address in
++ @param	ipu_vaddress[in]	ipu virtual address of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_ipu_address(
++	ia_css_buffer_set_t *buffer_set,
++	const vied_vaddress_t ipu_vaddress);
++
++/*! Get ipu virtual address from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get ipu address from
++
++ @return virtual buffer set address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_ipu_address(
++	const ia_css_buffer_set_t *buffer_set);
++
++/*! Set kernel enable bitmap of a buffer set object within the buffer set object
++
++ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
++ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_kernel_enable_bitmap(
++	ia_css_buffer_set_t *buffer_set,
++	const ia_css_kernel_bitmap_t kernel_enable_bitmap);
++
++/*! Get kernel enable bitmap from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
++
++ @return buffer set kernel enable bitmap on success, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_kernel_enable_bitmap(
++	const ia_css_buffer_set_t *buffer_set);
++
++/*! Set terminal enable bitmap of a buffer set object within the buffer set object
++
++ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
++ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_terminal_enable_bitmap(
++	ia_css_buffer_set_t *buffer_set,
++	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
++
++/*! Get terminal enable bitmap from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
++
++ @return buffer set terminal enable bitmap on success, 0 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_terminal_enable_bitmap(
++	const ia_css_buffer_set_t *buffer_set);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_routing_enable_bitmap(
++	ia_css_buffer_set_t *buffer_set,
++	const ia_css_kernel_bitmap_t terminal_enable_bitmap);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_buffer_set_get_routing_enable_bitmap(
++	const ia_css_buffer_set_t *buffer_set);
++
++/*! Set Routing BitMap of a buffer set object within the buffer set object
++
++ @param	buffer_set[in]			buffer set object to set kernel enable bitmap in
++ @param	kernel_enable_bitmap[in]	kernel enable bitmap of the buffer set object
++
++ @return 0 on success, -1 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_rbm(
++	ia_css_buffer_set_t *buffer_set,
++	const ia_css_rbm_t rbm);
++
++/*! Get Routing BitMap from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get kernel enable bitmap from
++
++ @return buffer set terminal enable bitmap on success, 0 on error
++
++ @todo New for POC
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_buffer_set_get_rbm(
++	const ia_css_buffer_set_t *buffer_set);
++
++/*! Set process group handle in a buffer set object
++
++ @param	buffer_set[in]			buffer set object to set handle in
++ @param	process_group_handle[in]	process group handle of the buffer set
++					object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_process_group_handle(
++	ia_css_buffer_set_t *buffer_set,
++	const vied_vaddress_t process_group_handle);
++
++/*! Get process group handle from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get handle from
++
++ @return virtual process group address on success, VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_buffer_set_get_process_group_handle(
++	const ia_css_buffer_set_t *buffer_set);
++
++/*! Set token of a buffer set object within the buffer set object
++
++ @param	buffer_set[in]		buffer set object to set ipu address in
++ @param	token[in]		token of the buffer set object
++
++ @return 0 on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_buffer_set_set_token(
++	ia_css_buffer_set_t *buffer_set,
++	const uint64_t token);
++
++/*! Get token from a buffer set object
++
++ @param	buffer_set[in]		buffer set object to get token from
++
++ @return token on success, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint64_t ia_css_buffer_set_get_token(
++	const ia_css_buffer_set_t *buffer_set);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_buffer_set_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_BUFFER_SET_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
+new file mode 100644
+index 000000000000..5721d46d2cff
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_DATA_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_DATA_INLINE__
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_DATA_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_DATA_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
+new file mode 100644
+index 000000000000..9905be3794a2
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_data_trace.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DATA_TRACE_H
++#define __IA_CSS_PSYS_DATA_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_DATA_TRACING_OVERRIDE))
++     #define PSYS_DATA_TRACE_LEVEL_CONFIG PSYS_DATA_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_DATA_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_DATA_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_DATA_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_DATA_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_DATA_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_DATA_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_DATA_TRACE_METHOD \
++		PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_DATA_TRACE_LEVEL_ASSERT \
++		PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_DATA_TRACE_LEVEL_ERROR \
++		PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_DATA_TRACE_LEVEL_WARNING \
++		PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_DATA_TRACE_LEVEL_INFO \
++		PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_DATA_TRACE_LEVEL_DEBUG \
++		PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_DATA_TRACE_LEVEL_VERBOSE \
++		PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_DATA_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
+new file mode 100644
+index 000000000000..4aab0d4b9916
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
+new file mode 100644
+index 000000000000..fc31bb79adbe
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_dynamic_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_TRACE_H
++#define __IA_CSS_PSYS_DYNAMIC_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
++     #define PSYS_DYNAMIC_TRACE_LEVEL_CONFIG \
++		PSYS_DYNAMIC_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_DYNAMIC_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_DYNAMIC_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_DYNAMIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_DYNAMIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_DYNAMIC_TRACE_METHOD \
++		PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ASSERT \
++		PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_ERROR \
++		PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_WARNING \
++		PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_INFO \
++		PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_DEBUG \
++		PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_DYNAMIC_TRACE_LEVEL_VERBOSE \
++		PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_DYNAMIC_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
+new file mode 100644
+index 000000000000..f0f23d9895dc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_kernel_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_KERNEL_TRACE_H
++#define __IA_CSS_PSYS_KERNEL_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
++     #define PSYS_KERNEL_TRACE_LEVEL_CONFIG \
++		PSYS_KERNEL_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_KERNEL_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_KERNEL_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_KERNEL_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_KERNEL_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_KERNEL_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_KERNEL_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_KERNEL_TRACE_METHOD \
++		PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_ASSERT \
++		PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_ERROR \
++		PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_WARNING \
++		PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_INFO \
++		PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_DEBUG \
++		PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_KERNEL_TRACE_LEVEL_VERBOSE \
++		PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_KERNEL_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
+new file mode 100644
+index 000000000000..b4512e603a2a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_manifest_types.h
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_MANIFEST_TYPES_H
++#define __IA_CSS_PSYS_MANIFEST_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_psys_manifest_types.h
++ *
++ * The types belonging to the terminal/program/
++ * program group manifest static module
++ */
++
++#include <type_support.h>
++#include "vied_nci_psys_resource_model.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++/** This value is used in the manifest to indicate that the resource
++ * offset field must be ignored and the resource is relocatable
++ */
++#define IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE ((vied_nci_resource_size_t)(-1))
++
++#define IA_CSS_CONNECTION_BITMAP_BITS 8
++typedef uint8_t ia_css_connection_bitmap_t;
++
++#define IA_CSS_CONNECTION_TYPE_BITS 32
++
++/** Describes the tranfer method of data between terminals */
++typedef enum ia_css_connection_type {
++	/** The data buffer must be fully written to main memory by the producer
++	 *  before it can be read by the consumer */
++	IA_CSS_CONNECTION_MEMORY = 0,
++	/** The data transfer is a (watermark) queued stream over main memory.
++	 *  The consumer may begin reading data before the data
++	 *  buffer is completely written in a controlled manner. */
++	IA_CSS_CONNECTION_MEMORY_STREAM,
++	/** The data transfer is via device ports connected such that no data
++	 *  is read or written to main memory. */
++	IA_CSS_CONNECTION_STREAM,
++	IA_CSS_N_CONNECTION_TYPES
++} ia_css_connection_type_t;
++
++#define IA_CSS_PROGRAM_TYPE_BITS 8
++typedef enum ia_css_program_type {
++	IA_CSS_PROGRAM_TYPE_SINGULAR = 0,
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB,
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER,
++	IA_CSS_PROGRAM_TYPE_PARALLEL_SUB,
++	IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER,
++	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB,
++	IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER,
++/*
++ * Future extension; A bitmap coding starts making more sense
++ *
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUB,
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB_PARALLEL_SUPER,
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUB,
++	IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER_PARALLEL_SUPER,
++ */
++	IA_CSS_N_PROGRAM_TYPES
++} ia_css_program_type_t;
++
++#define IA_CSS_PROGRAM_GROUP_ID_BITS 32
++typedef uint32_t ia_css_program_group_ID_t;
++#define IA_CSS_PROGRAM_ID_BITS 8
++typedef uint8_t ia_css_program_ID_t;
++
++#define IA_CSS_PROGRAM_INVALID_ID ((uint8_t)(-1))
++#define IA_CSS_PROGRAM_GROUP_INVALID_ID ((uint32_t)(-1))
++
++typedef struct ia_css_program_group_manifest_s
++ia_css_program_group_manifest_t;
++typedef struct ia_css_program_manifest_s
++ia_css_program_manifest_t;
++typedef struct ia_css_program_manifest_ext_s
++ia_css_program_manifest_ext_t;
++typedef struct ia_css_data_terminal_manifest_s
++ia_css_data_terminal_manifest_t;
++
++/* ============ Program Control Init Terminal Manifest - START ============ */
++typedef struct ia_css_program_control_init_manifest_program_desc_s
++	ia_css_program_control_init_manifest_program_desc_t;
++
++typedef struct ia_css_program_control_init_terminal_manifest_s
++	ia_css_program_control_init_terminal_manifest_t;
++/* ============ Program Control Init Terminal Manifest - END ============ */
++
++/** @} */
++
++#endif /* __IA_CSS_PSYS_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
+new file mode 100644
+index 000000000000..834e02663334
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_param_trace.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PARAM_TRACE_H
++#define __IA_CSS_PSYS_PARAM_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
++     #define PSYS_PARAM_TRACE_LEVEL_CONFIG PSYS_PARAM_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_PARAM_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_PARAM_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_PARAM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_PARAM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_PARAM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_PARAM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_PARAM_TRACE_METHOD \
++		PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_PARAM_TRACE_LEVEL_ASSERT \
++		PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_PARAM_TRACE_LEVEL_ERROR \
++		PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_PARAM_TRACE_LEVEL_WARNING \
++		PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_PARAM_TRACE_LEVEL_INFO \
++		PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_PARAM_TRACE_LEVEL_DEBUG \
++		PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_PARAM_TRACE_LEVEL_VERBOSE \
++		PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_PARAM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
+new file mode 100644
+index 000000000000..7c2af2cfb6f8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_private_pg_data.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PRIVATE_PG_DATA_H
++#define __IA_CSS_PSYS_PRIVATE_PG_DATA_H
++
++#include "ipu_device_acb_devices.h"
++#include "ipu_device_gp_devices.h"
++#include "type_support.h"
++
++#define PRIV_CONF_INVALID	0xFF
++#define MAX_INPUT_BUFFER	(2)
++#define MAX_OUTPUT_BUFFER	(2)
++
++struct ia_css_psys_pg_buffer_information_s {
++	unsigned int link_id; /* Terminal the buffer is connected to */
++	unsigned int buffer_base_addr;
++	unsigned int bpe;
++	unsigned int buffer_width;
++	unsigned int buffer_height;
++	unsigned int num_of_buffers;
++	unsigned int dfm_port_addr;
++};
++
++typedef struct ia_css_psys_pg_buffer_information_s ia_css_psys_pg_buffer_information_t;
++
++typedef struct {
++	uint8_t in_select; /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
++	uint8_t out_select;  /**< corresponds to type nci_acb_port_t  0 = ISP, 1 = Acc */
++} ia_css_psys_private_pg_data_acb_t;
++
++struct ia_css_psys_private_pg_data {
++	ia_css_psys_private_pg_data_acb_t acb_route[IPU_DEVICE_ACB_NUM_ACB];
++	uint8_t psa_mux_conf[IPU_DEVICE_GP_PSA_MUX_NUM_MUX];
++	uint8_t isa_mux_conf[IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX];
++	ia_css_psys_pg_buffer_information_t input_buffer_info[MAX_INPUT_BUFFER];
++	ia_css_psys_pg_buffer_information_t output_buffer_info[MAX_OUTPUT_BUFFER];
++};
++
++#endif /* __IA_CSS_PSYS_PRIVATE_PG_DATA_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
+new file mode 100644
+index 000000000000..39122a072ceb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.h
+@@ -0,0 +1,395 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_H
++#define __IA_CSS_PSYS_PROCESS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process.h
++ *
++ * Define the methods on the process object that are not part of
++ * a single interface
++ */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_dynamic_storage_class.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>					/* uint8_t */
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_process.hsys.user.h>
++
++/*
++ * Internal resources
++ */
++#include <ia_css_psys_process.hsys.kernel.h>
++
++/*
++ * Process manager
++ */
++#include <ia_css_psys_process.psys.h>
++
++/*
++ * Command processor
++ */
++
++/*! Execute a command locally or send it to be processed remotely
++
++ @param	process[in]	process object
++ @param	cmd[in]		command
++
++ @return < 0 on invalid argument(s) or process state
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_cmd(
++	ia_css_process_t *process,
++	const ia_css_process_cmd_t cmd);
++
++/*! Get the internal memory offset of the process object
++
++ @param	process[in]	process object
++ @param	mem_id[in]	memory id
++
++ @return internal memory offset,
++	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
++	const ia_css_process_t *process,
++	const vied_nci_mem_type_ID_t mem_id);
++
++/*! Get the external memory offset of the process object
++
++ @param	process[in]	process object
++ @param	mem_id[in]	memory id
++
++ @return external memory offset,
++	IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
++	const ia_css_process_t *process,
++	const vied_nci_mem_type_ID_t mem_type_id);
++
++/*! Get the stored size of the process object
++
++ @param	process[in]	process object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_process_get_size(const ia_css_process_t *process);
++
++/*! Get the (pointer to) the process group parent of the process object
++
++ @param	process[in]	process object
++
++ @return the pointer to the parent, NULL on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_t *ia_css_process_get_parent(
++	const ia_css_process_t *process);
++
++/*! Set the (pointer to) the process group parent of the process object
++
++ @param	process[in]	process object
++ @param	parent[in]	(pointer to the) process group parent object
++
++ @return < 0 on invalid argument(s)
++ */
++extern int ia_css_process_set_parent(
++	ia_css_process_t *process,
++	ia_css_process_group_t *parent);
++
++/*! Get the unique ID of program used by the process object
++
++ @param	process[in]	process object
++
++ @return ID, 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_ID_t ia_css_process_get_program_ID(
++	const ia_css_process_t *process);
++
++/*! Get the state of the process object
++
++ @param	process[in]	process object
++
++ @return state, limit value (IA_CSS_N_PROCESS_STATES) on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_state_t ia_css_process_get_state(
++	const ia_css_process_t *process);
++
++/*! Set the state of the process object
++
++ @param	process[in]	process object
++ @param	state[in]	state of the process
++
++ @return < 0 on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_set_state(
++	ia_css_process_t *process,
++	ia_css_process_state_t state);
++
++/*! Get the assigned cell of the the process object
++
++ @param	process[in]	process object
++
++ @return cell ID, limit value (VIED_NCI_N_CELL_ID) on invalid argument
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_cell_ID_t ia_css_process_get_cell(
++	const ia_css_process_t *process);
++
++/*! Get the number of cells the process object depends on
++
++ @param	process[in]	process object
++
++ @return number of cells
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_cell_dependency_count(
++	const ia_css_process_t *process);
++
++/*! Get the number of terminals the process object depends on
++
++ @param	process[in]	process object
++
++ @return number of terminals
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_terminal_dependency_count(
++	const ia_css_process_t *process);
++
++/*! Set n-th cell dependency of a process object
++
++ @param	process[in]	Process object
++ @param	dep_index[in]	dep index
++ @param	id[in]		dep id
++
++ @return < 0 on invalid process argument
++ */
++extern int ia_css_process_set_cell_dependency(
++	const ia_css_process_t *process,
++	const unsigned int dep_index,
++	const vied_nci_resource_id_t id);
++
++/*! Get n-th cell dependency of a process object
++
++ @param	process[in]	Process object
++ @param	cell_num[in]	n-th cell
++
++ @return n-th cell dependency,
++	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_id_t ia_css_process_get_cell_dependency(
++	const ia_css_process_t *process,
++	const unsigned int cell_num);
++
++/*! Set n-th terminal dependency of a process object
++
++ @param	process[in]	Process object
++ @param	dep_index[in]	dep index
++ @param	id[in]		dep id
++
++ @return < 0 on on invalid argument(s)
++ */
++extern int ia_css_process_set_terminal_dependency(
++	const ia_css_process_t *process,
++	const unsigned int dep_index,
++	const vied_nci_resource_id_t id);
++
++/*! Get n-th terminal dependency of a process object
++
++ @param	process[in]		Process object
++ @param	terminal_num[in]	n-th cell
++
++ @return n-th terminal dependency,
++	IA_CSS_PROCESS_INVALID_DEPENDENCY on invalid argument(s)
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_get_terminal_dependency(
++	const ia_css_process_t *process,
++	const unsigned int terminal_num);
++
++#if HAS_DFM
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
++	ia_css_process_t *process);
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
++	ia_css_process_t *process);
++#endif
++
++/*! Get the cells bitmap of the the process object
++
++ @param	process[in]	process object
++
++ @return process cells bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
++	const ia_css_process_t *process);
++
++/*! Sets the dfm device resource allocation bitmap of
++ * the process object
++
++ @param	process[in]	process object
++ @param	dfm_dev_id[in]	dfm device id
++ @param bitmap[in]	resource bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dfm_port_bitmap(
++	ia_css_process_t *process,
++	const vied_nci_dev_dfm_id_t dfm_dev_id,
++	const vied_nci_resource_bitmap_t bitmap);
++
++/*! Sets the active dfm ports bitmap of
++ * the process object
++
++ @param	process[in]	process object
++ @param	dfm_dev_id[in]	dfm device id
++ @param bitmap[in]	active ports bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dfm_active_port_bitmap(
++	ia_css_process_t *process,
++	const vied_nci_dev_dfm_id_t dfm_dev_id,
++	const vied_nci_resource_bitmap_t bitmap);
++
++#if HAS_DFM
++/*! Get the dfm port bitmap of the the process object
++
++ @param	process[in]	process object
++ @param	dfm_res_id	dfm resource id
++
++ @return bitmap of all DFM ports used by process, corresponding to the input dfm resource id
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
++	const ia_css_process_t *process,
++	vied_nci_dev_dfm_id_t  dfm_res_id);
++#endif
++/*! Get the dfm active port bitmap of the the process object
++
++ @param	process[in]	process object
++ @param	dfm_res_id[in]	dfm resource id
++
++ @return bitmap of all active DFM ports used by the process, corresponding to the input
++ dfm resource id
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
++	const ia_css_process_t *process,
++	vied_nci_dev_dfm_id_t  dfm_res_id);
++
++/*! Sets the cells bitmap of
++ * the process object
++
++ @param	process[in]	process object
++ @param bitmap[in]	bitmap
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_cells_bitmap(
++	ia_css_process_t *process,
++	const vied_nci_resource_bitmap_t bitmap);
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++/*! Get the device channel id-n resource allocation offset of the process object
++
++ @param	process[in]	process object
++ @param	dev_chn_id[in]	channel id
++
++ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_process_get_dev_chn(
++	const ia_css_process_t *process,
++	const vied_nci_dev_chn_ID_t dev_chn_id);
++#endif
++/*! Get the ext mem type-n resource id of the the process object
++
++ @param	process[in]	process object
++ @param	mem_type[in]	mem type
++
++ @return resource offset, IA_CSS_PROCESS_INVALID_OFFSET on invalid argument(s)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
++	const ia_css_process_t *process,
++	const vied_nci_mem_type_ID_t mem_type);
++
++/*! Sets the device channel id-n resource allocation offset of
++ * the process object
++
++ @param	process[in]	process object
++ @param	dev_chn_id[in]	channel id
++ @param offset[in]	resource offset
++
++ @return < 0 on invalid argument(s) or process state
++ */
++int ia_css_process_set_dev_chn(
++	ia_css_process_t *process,
++	const vied_nci_dev_chn_ID_t dev_chn_id,
++	const vied_nci_resource_size_t offset);
++
++/*! Boolean test if the process object type is valid
++
++ @param	process[in]	process object
++ @param	p_manifest[in]	program manifest
++
++ @return true if the process object is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_process_valid(
++	const ia_css_process_t *process,
++	const ia_css_program_manifest_t *p_manifest);
++
++/*! Gets the program_idx from the process object
++
++ @param	process[in] process object
++
++ @return program index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_get_program_idx(
++	const ia_css_process_t *process);
++
++/*! Returns the process extension (ONLY ALLOWED TO BE USED BY FIRMWARE).
++ * @param process[in] process object
++ * @return process entension, NULL if there is none.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_ext_t *ia_css_process_get_extension(
++	const ia_css_process_t *process);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROCESS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
+new file mode 100644
+index 000000000000..0ffff491156a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.kernel.h
+@@ -0,0 +1,159 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H
++
++/**
++ * @file ia_css_psys_process.hsys.kernel.h
++ *
++ * Define the methods on the process object: Hsys kernel interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++#include <vied_nci_psys_system_global.h>
++
++/*
++ * Internal resources
++ */
++
++/*!
++ * @brief Clear all resource (offset) specifications
++ *
++ * @param[in]	process				process object
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_all(ia_css_process_t *process);
++
++/*!
++ * @brief Set the cell ID resource specification
++ *
++ * @param[in]	process				process object
++ * @param[in]	cell_id				cell ID
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_cell(
++	ia_css_process_t					*process,
++	const vied_nci_cell_ID_t				cell_id);
++
++/*!
++ * @brief Clear cell ID resource specification
++ *
++ * @param[in]	process				process object
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_cell(ia_css_process_t *process);
++
++/*!
++ * @brief Set the memory resource (offset) specification for a memory
++ * that belongs to the cell that is assigned to the process.
++ *
++ * @param[in]	process				process object
++ * @param[in]	mem_type_id			mem type ID
++ * @param[in]	offset				offset
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_int_mem(
++	ia_css_process_t		*process,
++	const	vied_nci_mem_type_ID_t	mem_type_id,
++	const vied_nci_resource_size_t	offset);
++
++/*!
++ * @brief Clear the memory resource (offset) specification for a memory
++ * type that belongs to the cell that is assigned to the process.
++ *
++ * @param[in]	process				process object
++ * @param[in]	mem_id				mem ID
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_int_mem(
++	ia_css_process_t		*process,
++	const vied_nci_mem_type_ID_t	mem_type_id);
++
++/*!
++ * @brief Set the memory resource (offset) specification for a memory
++ * that does not belong to the cell that is assigned to the process.
++ *
++ * @param[in]	process				process object
++ * @param[in]	mem_type_id				mem type ID
++ * @param[in]	offset				offset
++ *
++ * @pre The cell ID must be set
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_ext_mem(
++	ia_css_process_t		*process,
++	const vied_nci_mem_ID_t		mem_id,
++	const vied_nci_resource_size_t	offset);
++
++/*!
++ * @brief Clear the memory resource (offset) specification for a memory
++ * type that does not belong to the cell that is assigned to the process.
++ *
++ * @param[in]	process				process object
++ * @param[in]	mem_id				mem ID
++ *
++ * Precondition: The cell ID must be set
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_ext_mem(
++	ia_css_process_t		*process,
++	const vied_nci_mem_type_ID_t	mem_type_id);
++
++/*!
++ * @brief Set a device channel resource (offset) specification.
++ *
++ * @param[in]	process				process object
++ * @param[in]	dev_chn_id			device channel ID
++ * @param[in]	offset				offset
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_set_dev_chn(
++	ia_css_process_t		*process,
++	const vied_nci_dev_chn_ID_t	dev_chn_id,
++	const vied_nci_resource_size_t	offset);
++
++/*!
++ * @brief Clear a device channel resource (offset) specification
++ *
++ * @param[in]	process				process object
++ * @param[in]	dev_chn_id			device channel ID
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_kernel
++ */
++extern int ia_css_process_clear_dev_chn(
++	ia_css_process_t		*process,
++	const vied_nci_dev_chn_ID_t	dev_chn_id);
++
++#endif /* __IA_CSS_PSYS_PROCESS_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
+new file mode 100644
+index 000000000000..119ae30af523
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.hsys.user.h
+@@ -0,0 +1,94 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_HSYS_USER_H
++#define __IA_CSS_PSYS_PROCESS_HSYS_USER_H
++
++/**
++ *  @file ia_css_psys_process.hsys.user.h
++ *
++ *  Define the methods on the process object: Hsys user interface
++ */
++
++#include <ia_css_program_group_param.h>		/* ia_css_program_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>					/* uint8_t */
++
++/*
++ * Creation
++ */
++
++/*!
++ * @brief Compute the size of storage required for allocating the process object.
++ *
++ * @param [in]	manifest			program manifest
++ * @param [in]	param				program parameters
++ *
++ * @return 0 on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern size_t ia_css_sizeof_process(
++	const ia_css_program_manifest_t			*manifest,
++	const ia_css_program_param_t			*param);
++
++/*!
++ * @brief Create the process object
++ *
++ * @param [in]	raw_mem				pre allocated memory
++ * @param [in]	manifest			program manifest
++ * @param [in]	param				program parameters
++ *
++ * @return NULL on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern ia_css_process_t *ia_css_process_create(
++	void				*raw_mem,
++	const ia_css_program_manifest_t	*manifest,
++	const ia_css_program_param_t	*param,
++	const uint32_t			program_idx);
++
++/*!
++ * @brief Destroy (the storage of) the process object
++ *
++ * @param [in]	process				process object
++ *
++ * @return NULL
++ * @ingroup group_psysapi_process_host_user
++ */
++extern ia_css_process_t *ia_css_process_destroy(
++	ia_css_process_t	*process);
++
++/*
++ * Access functions
++ */
++
++/*!
++ * @brief Print the process object to file/stream
++ *
++ * @param [in]	process				process object
++ * @param [out]	fid				file/stream handle
++ *
++ * @return < 0 on error
++ * @ingroup group_psysapi_process_host_user
++ */
++extern int ia_css_process_print(
++	const ia_css_process_t	*process,
++	void			*fid);
++
++#endif /* __IA_CSS_PSYS_PROCESS_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
+new file mode 100644
+index 000000000000..fd1ca0c6d288
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process.psys.h
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_PSYS_H
++#define __IA_CSS_PSYS_PROCESS_PSYS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process.psys.h
++ *
++ * Define the methods on the process object: Psys embedded interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++/*
++ * Process manager
++ */
++
++/*! Acquire the resources specificed in process object
++
++ @param	process[in]				process object
++
++ Postcondition: This is a try process if any of the
++ resources is not available, all succesfully acquired
++ ones will be release and the function will return an
++ error
++
++ @return < 0 on error
++ */
++extern int ia_css_process_acquire(ia_css_process_t *process);
++
++/*! Release the resources specificed in process object
++
++ @param	process[in]				process object
++
++ @return < 0 on error
++ */
++extern int ia_css_process_release(ia_css_process_t *process);
++
++#endif /* __IA_CSS_PSYS_PROCESS_PSYS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
+new file mode 100644
+index 000000000000..1966f6d31ebc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.h
+@@ -0,0 +1,487 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.h
++ *
++ * Define the methods on the process object that are not part of
++ * a single interface
++ */
++#include "ia_css_rbm.h"
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_dynamic_storage_class.h>
++
++#include <type_support.h>					/* uint8_t */
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_process_group.hsys.user.h>
++
++/*
++ * Registration of user contexts / callback info
++ * External resources
++ * Sequencing resources
++ */
++#include <ia_css_psys_process_group.hsys.kernel.h>
++
++/*
++ * Dispatcher
++ */
++#include <ia_css_psys_process_group.psys.h>
++
++/*
++ * Access to sub-structure handles / fields
++ */
++
++#include "ia_css_terminal.h"
++
++#include "ia_css_terminal_manifest_base_types.h"
++#include "ia_css_terminal_manifest_types.h"
++
++/*! Get the number of fragments on the process group
++
++ @param	process_group[in]		process group object
++
++ Note: Future change is to have a fragment count per
++ independent subgraph
++
++ @return the fragment count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_process_group_get_fragment_count(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the fragment state on the process group
++
++ @param	 process_group[in]		process group object
++ @param	 fragment_state[in]		current fragment of processing
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_get_fragment_state(
++	const ia_css_process_group_t		*process_group,
++	uint16_t				*fragment_state);
++
++/*! Set the fragment state on the process group
++
++ @param	process_group[in]		process group object
++ @param	fragment_state[in]		current fragment of processing
++
++ @return -1 on error
++  */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_fragment_state(
++	ia_css_process_group_t			*process_group,
++	uint16_t				fragment_state);
++
++/*! Get the number of processes on the process group
++
++ @param	process_group[in]		process group object
++
++ @return the process count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_process_count(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the number of terminals on the process group
++
++ @param	process_group[in]		process group object
++
++ Note: Future change is to have a terminal count per
++ independent subgraph
++
++ @return the terminal count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_terminal_count(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the PSYS server init time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PSYS server init time, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_psys_server_init_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! \deprecated this is old and will get removed */
++/*! Get the PG load start timestamp
++
++ @param	process_group[in]		process group object
++
++ @return PG load start timestamp, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_load_start_ts(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the PG load time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PG load time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_load_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the PG init time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PG init time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_init_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the PG processing time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_processing_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the PG next frame init time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the PG complete time in cycles
++
++ @param	process_group[in]		process group object
++
++ @return PG processing time in cycles, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_get_pg_complete_cycles(
++	const ia_css_process_group_t			*process_group);
++
++/*! Get the (pointer to) the <terminal type> terminal of the process group object
++
++ @param	process_group[in]               process group object
++ @param	terminal_type[in]               terminal type of terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
++		const ia_css_process_group_t *process_group,
++		const ia_css_terminal_type_t terminal_type);
++
++/*! Get the (pointer to) the <terminal type> terminal of the process group object
++ * for terminals which have only a single instance
++ * (cached in, cached out, program, program_ctrl_init)
++
++ @param	process_group[in]               process group object
++ @param	terminal_type[in]               terminal type of terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
++	const ia_css_process_group_t 	*process_group,
++	ia_css_terminal_type_t		term_type);
++
++/*! Get the (pointer to) the manifest indexed terminal of the process group object
++
++ @param	process_group[in]		process group object
++ @param	manifest_idx[in]		index of the terminal in manifest
++
++ @return the pointer to the terminal, NULL on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
++	const ia_css_process_group_t *process_grp,
++	const unsigned int manifest_idx);
++
++/*! Get the (pointer to) the indexed terminal of the process group object
++
++ @param	process_group[in]		process group object
++ @param	terminal_index[in]		index of the terminal
++
++ @return the pointer to the terminal, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_t *ia_css_process_group_get_terminal(
++	const ia_css_process_group_t		*process_group,
++	const unsigned int			terminal_index);
++
++/*! Get the (pointer to) the indexed process of the process group object
++
++ @param	process_group[in]		process group object
++ @param	process_index[in]		index of the process
++
++ @return the pointer to the process, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_t *ia_css_process_group_get_process(
++	const ia_css_process_group_t		*process_group,
++	const unsigned int			process_index);
++
++/*! Get the stored size of the process group object
++
++ @param	process_group[in]				process group object
++
++ @return size, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_process_group_get_size(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the state of the the process group object
++
++ @param	process_group[in]		process group object
++
++ @return state, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_state_t ia_css_process_group_get_state(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the unique ID of program group used by the process group object
++
++ @param	process_group[in]		process group object
++
++ @return ID, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
++	const ia_css_process_group_t		*process_group);
++
++/*! Get the resource bitmap of the process group
++
++ @param	process_group[in]		process group object
++
++ @return the reource bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
++	const ia_css_process_group_t		*process_group);
++
++/*! Set the resource bitmap of the process group
++
++ @param	process_group[in]		process group object
++ @param	resource_bitmap[in]		the resource bitmap
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_resource_bitmap(
++	ia_css_process_group_t			*process_group,
++	const vied_nci_resource_bitmap_t	resource_bitmap);
++
++/*! Get the kernel bitmap of the the process group object
++
++ @param	process_group[in] process group object
++
++ @return process group kernel bitmap
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
++	const ia_css_process_group_t *process_group);
++
++/*! Get the routing bitmap of the process group
++
++ @param	process_group[in]   process group object
++
++ @return routing bitmap (pointer)
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
++	const ia_css_process_group_t *process_group);
++
++/*! Set the routing bitmap of the process group
++
++ @param	process_group[in]   process group object
++ @param	rbm[in]		        routing bitmap
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_routing_bitmap(
++	ia_css_process_group_t *process_group,
++	const ia_css_rbm_t rbm);
++
++/*! Get IPU virtual address of process group
++
++ @param	 process_group[in]		process group object
++ @param	 ipu_vaddress[in/out]	process group ipu virtual address
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_get_ipu_vaddress(
++	const ia_css_process_group_t		*process_group,
++	vied_vaddress_t			*ipu_vaddress);
++
++/*! Set IPU virtual address of process group
++
++ @param	process_group[in]		process group object
++ @param	ipu_vaddress[in]		process group ipu address
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_ipu_vaddress(
++	ia_css_process_group_t			*process_group,
++	vied_vaddress_t			ipu_vaddress);
++
++/*! Get protocol version used by a process group
++
++ @param	process_group[in]		process group object
++
++ @return invalid protocol version on error
++
++ @todo Add new protocol version for IPU7.  Defer this for now,
++ because it will create a LOT of disruption.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_protocol_version(
++	const ia_css_process_group_t *process_group);
++
++/*! Get base queue id used by a process group
++
++ @param	process_group[in]		process group object
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_base_queue_id(
++	ia_css_process_group_t *process_group);
++
++/*! Set base queue id used by a process group
++
++ @param	process_group[in]		process group object
++ @param	queue_id[in]			process group queue id
++
++ @return invalid queue id on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_base_queue_id(
++	ia_css_process_group_t *process_group,
++	uint8_t queue_id);
++
++/*! Get number of queues used by a process group
++
++ @param	process_group[in]		process group object
++
++ @return invalid number of queues (0) on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_num_queues(
++	ia_css_process_group_t *process_group);
++
++/*! Set number of queues used by a process group
++
++ @param	process_group[in]		process group object
++ @param	num_queues[in]			process group number of queues
++
++ @return -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_num_queues(
++	ia_css_process_group_t *process_group,
++	uint8_t num_queues);
++
++/*! Set error handling enable flag used by process group
++
++ @param	process_group[in]		process group object
++ @param	error_handling_enable[in]	flag to control error handling
++
++ @return -1 on error, 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_error_handling_enable(
++	ia_css_process_group_t *process_group,
++	const bool error_handling_enable);
++
++/*! Get the error handling enable flag associated to the process group
++
++ @param	process_group[in]		process group object
++
++ @return error_handlnig_enable flag of the process group. On error UINT8_MAX
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_process_group_get_error_handling_enable(
++	const ia_css_process_group_t *process_group);
++
++/** Return true if the process group requires vector processor (i.e. DSP)
++ *  resources  */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group);
++
++/*! Check if terminal is enabled based on kernel enable bitmap
++
++ @param	terminal_manifest[in]		terminal manifest object
++ @param	enable_bitmap[in]		kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_terminal_enabled(
++	const ia_css_terminal_manifest_t *terminal_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Check if data terminal is enabled based on kernel enable bitmap
++
++ @param	data_term_manifest[in]		data terminal manifest object
++ @param	enable_bitmap[in]		kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_data_terminal_enabled(
++	const ia_css_data_terminal_manifest_t	*data_term_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Check if spatial terminal is enabled based on kernel enable bitmap
++
++ @param	spatial_term_man[in]	spatial	terminal manifest object
++ @param	enable_bitmap[in]		kernel enable bitmap
++
++ @return true if enabled, false if not enabled
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_process_group_is_spatial_terminal_enabled(
++	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
++	ia_css_kernel_bitmap_t enable_bitmap);
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_group_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
+new file mode 100644
+index 000000000000..87f127c8ed76
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.kernel.h
+@@ -0,0 +1,379 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.hsys.kernel.h
++ *
++ * Define the methods on the process group object: Hsys kernel interface
++ *
++ *  This file, together with the user space header, ia_css_psys_process_group.hsys.user.h,
++ *  defines the functions required to manage the lifetime of a process group.
++ *
++ * Sequence for settup up and queueing processing tasks with a persistent program group
++ * to IPU is:
++ *
++ * # Get Program Group manifest by ID
++ * # Create process group object based on that program group manifest
++ * # Configure process group
++ * ## Set kernel and terminal enables
++ * ## Set terminal attributes
++ * # Submit processs group
++ * # Start process group
++ * # Disown process group
++ * # Frame/Fragment processing loop
++ * ## Enqueue buffer sets - This sends the terminal buffers to FW
++ * ## Resume process group - This actually instructs FW to start processing with this PG.  The
++ * process group will process any available buffer sets until suspended or stopped, pending
++ * available resources.
++ * ## Suspend process group - Only required when multiple PG's are active, this suspends the
++ * processing of one group, which allows another PG to run with the same resources. Buffer
++ * sets for the suspended PG may continue to be queued, but will not be processed until
++ * the PG is resumed.  The decision when to suspend/resume is scheduling.
++ * # Stop process group - No more buffer sets or resume/suspend commands may be sent.
++ *
++ */
++
++#include <ia_css_psys_process_types.h>
++
++#include <ia_css_psys_buffer_set.h>
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>					/* uint8_t */
++
++/*
++ * Registration of user contexts / callback info
++ */
++
++/*! Get the user (callback) token as registered in the process group
++
++ @param	process_group[in]		process group object
++
++ @return 0 on error
++ */
++extern uint64_t ia_css_process_group_get_token(
++	ia_css_process_group_t					*process_group);
++
++/*! Set (register) a user (callback) token in the process group
++
++ The token value shall be non-zero. This token is
++ returned in each return message related to the process
++ group the token is registered with.
++
++ @param	process_group[in]		process group object
++ @param	token[in]				user token
++ @return < 0 on error
++ */
++extern int ia_css_process_group_set_token(
++	ia_css_process_group_t					*process_group,
++	const uint64_t							token);
++
++/*
++ * Passing of a (fragment) watermark
++ */
++
++/*! Get the fragment progress limit of the process group
++
++ @see ia_css_process_group_set_fragment_limit()
++
++ @param	process_group[in]		process group object
++
++ @return 0 on error
++
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_process_group_get_fragment_limit(
++	const ia_css_process_group_t				*process_group);
++
++/*! Set the new fragment progress limit of the process group
++
++ @param	process_group[in]		process group object
++ @param	fragment_limit[in]		New limit value
++
++ @note The limit value must be less or equal to the fragment
++ count value. The process group will not make progress beyond
++ the limit value. The limit value can be modified asynchronously
++ If the limit value is reached before an update happens, the
++ process group will suspend and will not automatically resume.
++
++ The limit is monotonically increasing. The default value is
++ equal to the fragment count
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_fragment_limit(
++	ia_css_process_group_t				*process_group,
++	const uint16_t					fragment_limit);
++
++/*! Clear the fragment progress limit of the process group
++
++ @see ia_css_process_group_set_fragment_limit()
++
++ @param	process_group[in]		process group object
++
++ @note This function sets the fragment limit to zero.
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_clear_fragment_limit(
++	ia_css_process_group_t					*process_group);
++
++/*
++ * Commands
++ */
++
++/*! Perform the start command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Start is an action of the l-Scheduler it makes the
++ process group eligible for execution.
++ For PPG's, execution will not occur until the resume
++ command is issued.  See ia_css_process_group_resume()
++
++ @par For persistent program/process groups () the start
++ command must be called once per stream instance,
++ at stream creation.
++
++ @par Precondition: The external resources that are attached to
++ the process group must be in the correct state, i.e. input
++ buffers are not-empty and output buffers not-full
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_start(
++	ia_css_process_group_t					*process_group);
++
++/*! Perform the suspend command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Suspend indicates that the process group execution
++ is halted at the next fragment boundary. The process group
++ will not automatically resume
++
++ @par Precondition: The process group must be running
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_suspend(
++	ia_css_process_group_t					*process_group);
++
++/*! Perform the resume command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Resume indicates that the process group is again
++ eligible for execution
++
++ @par Precondition: The process group must be started
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_resume(
++	ia_css_process_group_t					*process_group);
++
++/*! Perform the reset command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Return the process group to the started state
++
++ @par Precondition: The process group must be running or stopped
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_reset(
++	ia_css_process_group_t					*process_group);
++
++/*! Perform the abort command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Force the process group to the stopped state
++
++ @par Precondition: The process group must be running or started
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_abort(
++	ia_css_process_group_t					*process_group);
++
++/*! Release ownership of the process group
++
++  For PPG's, this is the last step required before buffer
++  sets can be enqueued.
++
++ @param	process_group[in]		process group object
++
++ @note Release notifies PSYS and hands over ownership of the
++ process group from SW to FW.
++
++ @par Precondition: The process group must be in the started state
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_disown(
++	ia_css_process_group_t					*process_group);
++
++/*
++ * External resources
++ */
++
++/*! Set (register) a data buffer to the indexed terminal in the process group
++
++ @param	process_group[in]		process group object
++ @param	buffer[in]			buffer handle
++ @param	buffer_state[in]		state of the buffer
++ @param	terminal_index[in]		index of the terminal
++
++ @note For legacy program groups (== non-PPG), the buffer handle
++ shall not be VIED_NULL, but the buffer state can be undefined; BUFFER_UNDEFINED
++
++ @par For PPG's, buffer is ignored as the buffers will be sent
++ later on with ia_css_enqueue_buffer_set().  Nonetheless, this function must be
++ called before ia_css_process_group_submit() as sets up some internal bookeeping.
++
++ @note The buffer can be in memory or streaming over memory
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_attach_buffer(
++	ia_css_process_group_t			*process_group,
++	vied_vaddress_t				buffer,
++	const ia_css_buffer_state_t		buffer_state,
++	const unsigned int			terminal_index);
++
++/*! Get (unregister) the data buffer on the indexed terminal of
++ * the process group
++
++ @param	process_group[in]		process group object
++ @param	terminal_index[in]		index of the terminal
++
++ @note Precondition: The process group must be stopped
++
++ @par Postcondition: The buffer handle shall be reset to VIED_NULL, the buffer
++ state to BUFFER_NULL
++
++ @par This function is meaningless for PPG's
++
++ @return VIED_NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t ia_css_process_group_detach_buffer(
++	ia_css_process_group_t			*process_group,
++	const unsigned int			terminal_index);
++
++/*! Set (register) a data buffer to the indexed terminal in the process group
++
++ @param	process_group[in]		process group object
++ @param	stream[in]				stream handle
++ @param	buffer_state[in]		state of the buffer
++ @param	terminal_index[in]		index of the terminal
++
++ @note The stream handle shall not be zero, the buffer
++ state can be undefined; BUFFER_UNDEFINED
++
++ @note The stream is used exclusive to a buffer; the latter can be in memory
++ or streaming over memory
++
++ @todo Unclear what this function is for.  Clarify!
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_attach_stream(
++	ia_css_process_group_t			*process_group,
++	uint32_t				stream,
++	const ia_css_buffer_state_t		buffer_state,
++	const unsigned int			terminal_index);
++
++/*! Get (unregister) the stream handle on the indexed terminal of
++ * the process group
++
++ @param	process_group[in]		process group object
++ @param	terminal_index[in]		index of the terminal
++
++ @par Precondition: The process group must be stopped
++
++ @par Postcondition: The stream handle shall be reset to zero, the buffer
++ state to BUFFER_NULL
++
++ @todo Unclear what this function is for.  Clarify!
++
++ @return 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_detach_stream(
++	ia_css_process_group_t			*process_group,
++	const unsigned int			terminal_index);
++
++/*
++ * Sequencing resources
++ */
++
++/*! Set (an artificial) blocking resource (barrier) in
++ * the process group resource map
++
++ @param	process_group[in]		process group object
++ @param	barrier_index[in]		index of the barrier
++
++ @note The barriers have to be set to force sequence between started
++ process groups
++
++ @return < 0 on error
++
++ @todo Seems this function no longer has any use.  Clarify!
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_barrier(
++	ia_css_process_group_t					*process_group,
++	const vied_nci_barrier_ID_t				barrier_index);
++
++/*! Clear a previously set blocking resource (barrier) in
++ * the process group resource map
++
++ @param	process_group[in]		process group object
++ @param	barrier_index[in]		index of the barrier
++
++ @par Precondition: The barriers must have been set
++
++ @return < 0 on error
++
++ @todo Seems this function no longer has any use.  Clarify!
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_clear_barrier(
++	ia_css_process_group_t					*process_group,
++	const vied_nci_barrier_ID_t				barrier_index);
++
++/*! Boolean test if the process group preconditions for start are satisfied
++
++ @param	process_group[in]		process group object
++
++ @return true if the process group can be started
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_process_group_start(
++	const ia_css_process_group_t			*process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
+new file mode 100644
+index 000000000000..fcae13370148
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.hsys.user.h
+@@ -0,0 +1,224 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.hsys.user.h
++ *
++ * Define the methods on the process group object: Hsys user interface
++ *
++ * This file, together with the user space header, ia_css_psys_process_group.hsys.kernel.h,
++ *  defines the functions required to manage the lifetime of a process group.
++ */
++
++#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_buffer_set.h>
++
++#include "ia_css_psys_dynamic_storage_class.h"
++
++#include <type_support.h>					/* uint8_t */
++
++/*
++ * Creation
++ */
++
++/*! Compute the size of storage required for allocating the process group object
++
++ @param	manifest[in]			program group manifest
++ @param	param[in]			program group parameters
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_process_group(
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t	*param);
++
++/*! Checks whether a certain program is enabled.
++ *   FUNCTION IS PRIVATE TO THIS MODULE
++
++ @param	program_manifest[in] program manifest
++ @param	enable_bitmap[in]   kernel enable bitmap corresponding to process group
++
++ @return true if program is enabled (and process will be instantiated)
++ */
++extern bool ia_css_process_group_is_program_enabled(
++	const ia_css_program_manifest_t *program_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap);
++
++/*! Create (the storage for) the process group object
++
++ @param	process_grp_mem[in/out]	raw memory for process group
++ @param	manifest[in]			program group manifest
++ @param	param[in]			program group parameters
++
++ @return NULL on error
++ */
++extern ia_css_process_group_t *ia_css_process_group_create(
++	void					*process_grp_mem,
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t	*param);
++
++/*! Destroy (the storage of) the process group object
++
++ @param	process_group[in]		process group object
++
++ @return NULL
++ */
++extern ia_css_process_group_t *ia_css_process_group_destroy(
++	ia_css_process_group_t					*process_group);
++
++/*! Print the process group object to file/stream in
++  textual format
++
++ @param	process_group[in]		process group object
++ @param	fid[out]				file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_print(
++	const ia_css_process_group_t		*process_group,
++	void					*fid);
++
++/*
++ * Commands
++ */
++
++/*! Perform the submit command on the process group
++
++ @param	process_group[in]		process group object
++
++ @note Submit is an action of the h-Scheduler it makes the
++ process group eligible for the l-Scheduler
++
++ @par Precondition : The external resources must be attached to
++ the process group
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_submit(
++	ia_css_process_group_t					*process_group);
++
++/*! Boolean test if the process group object type is valid
++
++ @param	process_group[in]		process group object
++ @param	manifest[in]			program group manifest
++ @param	param[in]				program group parameters
++
++ @return true if the process group is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_process_group_valid(
++	const ia_css_process_group_t		*process_group,
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t	*param);
++
++/*! Boolean test if the process group preconditions for submit are satisfied
++
++ @param	process_group[in]		process group object
++
++ @return true if the process group can be submitted
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_process_group_submit(
++	const ia_css_process_group_t			*process_group);
++
++/*! Boolean test if the preconditions on process group and buffer set are
++    satisfied for enqueuing buffer set
++
++ @param	process_group[in]		process group object
++ @param	buffer_set[in]			buffer set object
++
++ @return true if the buffer set can be enqueued
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_can_enqueue_buffer_set(
++	const ia_css_process_group_t			*process_group,
++	const ia_css_buffer_set_t			*buffer_set);
++
++/*! Compute the cyclecount required for executing the process group object
++
++ @param	manifest[in]			program group manifest
++ @param	param[in]				program group parameters
++
++ @return 0 on error
++
++ @note Current implementation is trivial
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_process_group_compute_cycle_count(
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t	*param);
++
++/*! Compute the number of processes required for
++ * executing the process group object
++
++ @param	manifest[in]			program group manifest
++ @param	param[in]				program group parameters
++
++ @return 0 on error
++ */
++extern uint8_t ia_css_process_group_compute_process_count(
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t		*param);
++
++/*! Compute the number of terminals required for
++ * executing the process group object
++
++ @param	manifest[in]			program group manifest
++ @param	param[in]				program group parameters
++
++ @return 0 on error
++ */
++extern uint8_t ia_css_process_group_compute_terminal_count(
++	const ia_css_program_group_manifest_t	*manifest,
++	const ia_css_program_group_param_t		*param);
++
++/*! Get private token as registered in the process group by the implementation
++
++ @note The token value shall be non-zero. This token is private
++ to the implementation. This is in addition to the user token.
++ See ia_css_process_group_set_token()
++
++ @param	process_group[in]		process group object
++
++ @return 0 on error
++ */
++extern uint64_t ia_css_process_group_get_private_token(
++	ia_css_process_group_t					*process_group);
++
++/*! Set private token in the process group as needed by the implementation
++
++ @param	process_group[in]		process group object
++ @param	token[in]				user token
++
++ @note The token value shall be non-zero. This token is private
++ to the implementation. This is in addition to the user token.
++ see ia_css_process_group_get_token()
++
++ @return < 0 on error, 0 on success
++ */
++extern int ia_css_process_group_set_private_token(
++	ia_css_process_group_t					*process_group,
++	const uint64_t							token);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
+new file mode 100644
+index 000000000000..a1c47ae83066
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group.psys.h
+@@ -0,0 +1,61 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_group.psys.h
++ *
++ * Define the methods on the process group object: Psys embedded interface
++ */
++
++#include <ia_css_psys_process_types.h>
++
++/*
++ * Dispatcher
++ */
++
++/*! Perform the run command on the process group
++
++ @param	process_group[in]		process group object
++
++ Note: Run indicates that the process group will execute
++
++ Precondition: The process group must be started or
++ suspended and the processes have acquired the necessary
++ internal resources
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_run(
++	ia_css_process_group_t					*process_group);
++
++/*! Perform the stop command on the process group
++
++ @param	process_group[in]		process group object
++
++ Note: Stop indicates that the process group has completed execution
++
++ Postcondition: The external resoruces can now be detached
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_stop(
++	ia_css_process_group_t					*process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_PSYS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
+new file mode 100644
+index 000000000000..ea4464e13d9c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_cmd_impl.h
+@@ -0,0 +1,280 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H
++
++#include "type_support.h"
++#include "ia_css_psys_process_group.h"
++#include "ia_css_rbm_manifest_types.h"
++
++#define N_UINT64_IN_PROCESS_GROUP_STRUCT	2
++#define N_UINT32_IN_PROCESS_GROUP_STRUCT	8
++#define N_UINT16_IN_PROCESS_GROUP_STRUCT	5
++#define N_UINT8_IN_PROCESS_GROUP_STRUCT		8
++#define N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT	2
++
++#define SIZE_OF_PROCESS_GROUP_STRUCT_BITS \
++	(IA_CSS_RBM_BITS \
++	+ IA_CSS_KERNEL_BITMAP_BITS \
++	+ N_UINT64_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT64_T_BITS \
++	+ N_UINT32_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_PROGRAM_GROUP_ID_BITS \
++	+ IA_CSS_PROCESS_GROUP_STATE_BITS \
++	+ VIED_VADDRESS_BITS \
++	+ VIED_NCI_RESOURCE_BITMAP_BITS \
++	+ N_UINT16_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS \
++	+ N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/** Process group object describing an instance of a Program Group
++ *
++ *  This is the root structure passed in a number of PG commands via
++ *  the syscom queuing interface to firmware from the host.  A pointer
++ *  to this structure in main memroy is passed in the following
++ *  PG commands: start, resume, suspend, stop, abort.
++ *
++ *  A process group is created based on a program group specification
++ *  described in the program group manifest.  Briefly, a program group
++ *  contains programs which in turn contain kernels.  A program group
++ *  also has terminals, which connect it to the outside world.  Each
++ *  terminal represents either parameters or image data flowing in or
++ *  out of the group.  Terminals come in different types and may have
++ *  addtional attributes.  For example, a data termainal will have
++ *  a frame format attribute.
++ *  @see ia_css_process_group_create()
++ *  @see ia_css_program_group_manifest_t and related API and:
++ *  @see ia_css_pkg_dir_entry_get_type() and
++ *  ia_css_client_pkg_get_pg_manifest_offset_size() (and in general the
++ *  ia_css_pkg_dir* functions) for how to get the program group manifest
++ *  array from the binary release package.
++ *
++ *  @note Some of the fields within are used internally within the
++ *  firmware only, after the firmware copies the process group structure
++ *  to its internel cache.  The original in main memory is not updated.
++ *  All such fields should be initialized to zero, unless otherwise
++ *  noted.
++ *  See the individual field descriptions for which fields are "internal".
++ */
++struct ia_css_process_group_s {
++	/** User (callback) token / user context reference,
++	 * zero is an error value
++	 */
++	uint64_t token;
++	/** private token / context reference, zero is an error value */
++	uint64_t private_token;
++	/** PG routing bitmap used to set connection between program group
++	 *  components */
++	ia_css_rbm_t routing_bitmap;
++	/** PG kernel bitmap.  Marks which program kernels (i.e. kernel==device, when impelementation is fixed)
++	 *  are enabled. This bitmap covers all kernels in the group, no matter which program they belong to. */
++	ia_css_kernel_bitmap_t kernel_bitmap;
++	/** Size of this structure in bytes */
++	uint32_t size;
++	/** The timestamp when PG load starts
++	 *  @note Internal firmware use only. */
++	/**< PSYS server init time in cycless */
++	uint32_t psys_server_init_cycles;
++	/**< The timestamp when PG load starts */
++	uint32_t pg_load_start_ts;
++	/** PG load time in cycles
++	 *  @note Internal firmware use only. */
++	uint32_t pg_load_cycles;
++	/** PG init time in cycles
++	 *  @note Internal firmware use only. */
++	uint32_t pg_init_cycles;
++	/** PG processing time in cycles
++	 *  @note Internal firmware use only. */
++	uint32_t pg_processing_cycles;
++	/** Referral ID to program group FW.  This identifies the "type" of the process group
++	 *  and associcates the process group with the program group defined in the manifest. */
++	/**< PG next frame init time in cycles */
++	uint32_t pg_next_frame_init_cycles;
++	/**< PG complete time in cycles */
++	uint32_t pg_complete_cycles;
++	/**< Referral ID to program group FW */
++	ia_css_program_group_ID_t ID;
++	/** State of the process group FSM */
++	ia_css_process_group_state_t state;
++	/** Virtual address of process group in the IPU address space */
++	vied_vaddress_t ipu_virtual_address;
++	/** Bitmap of the compute resources used by the process group  */
++	vied_nci_resource_bitmap_t resource_bitmap;
++	/** Number of fragments offered on each terminal */
++	uint16_t fragment_count;
++	/** Current fragment of processing */
++	uint16_t fragment_state;
++	/** Watermark to control fragment processing.  Set to the same value as "fragment_count"
++	 *  unless you know what you are doing.
++	 *  @see  fragment_count in this structure. */
++	uint16_t fragment_limit;
++	/** Offset in bytes relative to the beginning of this structure, to process_offset_table[process_count].
++	 *  Must be aligned to a 64 bit boundary.
++	 *  process_offset_table is an array of size "process_count", containing offsets to process objects
++	 *  (each an instance of ia_css_process_t) belonging to this process group.
++	 *  @see process_count in this structure.
++	 *
++	 *  Usually follows this process group structure. */
++	uint16_t processes_offset;
++	/** Offset in bytes, relative to the beginning of this structure, to terminal_offset_table[terminal_count].
++	 *  Must be aligned to a 64 bit boundary.
++	 *  terminal_offset_table is an array of size "terminal_count", containing offsets to terminal objects
++	 *  (each an instance of ia_css_terminal_t or a derivative of it) belonging to this process group.
++	 *  @see terminal_count in this structure.
++	 *
++	 *  Usually follows process_offset_table, aligned to 64-bit boundary. */
++	uint16_t terminals_offset;
++	/** Parameter dependent number of processes in this process group, determined at process
++	 *  group creation taking into account the enabled kernels. That is, if all of a program's
++	 *  associcated kernels are disabled, then no process is instantiated for that program and
++	 *  it must not be counted in the process count.
++	 *
++	 *  @see processes_offset in this structure
++	 *  @see ia_css_program_group_manifest_get_program_count()
++	 *  @see ia_css_program_manifest_get_kernel_bitmap()
++	 *  @see ia_css_process_group_compute_process_count() */
++	uint8_t process_count;
++	/** Parameter dependent number of terminals on this process group, determined at process
++	 *  group creation.  Must not be greater than the terminal count as defined in the manifest,
++	 *  but taking into account the enabled kernels.  That is, for those terminal types that have
++	 *  kernel associations, the terminal is diabled if all of its associated kernels are disabled.
++	 *  Execptions by terminal type:
++	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM - As described above, but parameter descriptors are examined to determine the
++	 *  kernel association, as the terminal type itself does not have an associated kernel field or kernel bitmap field.
++	 *  - IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT -- Always enabled
++	 *  - IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN -- Always enabled, to allow HW disabling configuration to be loaded
++	 *
++	 *  @see terminals_offset in this structure
++	 *  @see ia_css_program_group_manifest_get_terminal_count()
++	 *  @see ia_css_program_manifest_get_kernel_bitmap()
++	 *  @see ia_css_process_group_is_terminal_enabled()
++	 *  @see ia_css_process_group_compute_terminal_count() */
++	uint8_t terminal_count;
++	/** Parameter dependent number of independent subgraphs in
++	 * this process group.
++	 * @note Apparently no longer used.
++	 */
++	uint8_t subgraph_count;
++	/** Process group protocol version.  Identifies the state machine and
++	 *  message protocol for this process group. */
++	uint8_t protocol_version;
++	/** Dedicated base queue id used for enqueueing payload buffer sets.
++	 *  Each buffer set is either a frame (or fragment) processing request,
++	 *  or an opportunistic parameter update (AKA "late binding")
++	 *  This queue is enabled once the process group start command has
++	 *  been issued. */
++	uint8_t base_queue_id;
++	/** Number of dedicated queues used */
++	uint8_t num_queues;
++	/**< Mask the send_pg_done IRQ */
++	uint8_t mask_irq;
++	/** Error handling enable\disable flag */
++	uint8_t error_handling_enable;
++#if N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT > 0
++	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_GROUP_STRUCT];
++#endif
++};
++
++/*! Callback after process group is created. Implementations can provide
++ * suitable actions needed when process group is created.
++
++ @param	process_group[in]			process group object
++ @param	program_group_manifest[in]		program group manifest
++ @param	program_group_param[in]			program group parameters
++
++ @return 0 on success and non-zero on failure
++ */
++extern int ia_css_process_group_on_create(
++	ia_css_process_group_t			*process_group,
++	const ia_css_program_group_manifest_t	*program_group_manifest,
++	const ia_css_program_group_param_t	*program_group_param);
++
++/*! Callback before process group is about to be destoyed. Any implementation
++ * specific cleanups can be done here.
++
++ @param	process_group[in]				process group object
++
++ @return 0 on success and non-zero on failure
++ */
++extern int ia_css_process_group_on_destroy(
++	ia_css_process_group_t					*process_group);
++
++/*
++ * Command processor
++ */
++
++/*! Execute a command locally or send it to be processed remotely
++
++ @param	process_group[in]		process group object
++ @param	cmd[in]					command
++
++ @return < 0 on error
++ */
++extern int ia_css_process_group_exec_cmd(
++	ia_css_process_group_t				*process_group,
++	const ia_css_process_group_cmd_t		cmd);
++
++/*! Enqueue a buffer set corresponding to a persistent program group by
++ * sending a command to subsystem.
++
++ @param	process_group[in]		process group object
++ @param	buffer_set[in]			buffer set
++ @param	queue_offset[in]		offset to be used from the queue id
++					specified in the process group object
++					(0 for first buffer set for frame, 1
++					for late binding)
++
++ @return < 0 on error
++ */
++extern int ia_css_enqueue_buffer_set(
++	ia_css_process_group_t				*process_group,
++	ia_css_buffer_set_t				*buffer_set,
++	unsigned int					queue_offset);
++
++/*! Enqueue a parameter buffer set corresponding to a persistent program
++ *  group by sending a command to subsystem.  This allows for
++    opportunistic late parameters update, AKA "late binding".
++
++ @param	process_group[in]		process group object
++ @param	buffer_set[in]			parameter buffer set
++
++ @return < 0 on error
++ */
++extern int ia_css_enqueue_param_buffer_set(
++	ia_css_process_group_t				*process_group,
++	ia_css_buffer_set_t				*buffer_set);
++
++/*! Need to store the 'secure' mode for each PG for FW test app only
++ *
++ * @param	process_group[in]		process group object
++ * @param	secure[in]			parameter buffer set
++ *
++ * @return < 0 on error
++ */
++extern int ia_css_process_group_store(
++	ia_css_process_group_t				*process_group,
++	bool						secure);
++
++/*! Need to get the right context for each PG for FW test app only
++ *
++ * @param	process_group[in]		process group object
++ *
++ * @return	psys_syscom context
++ */
++extern struct ia_css_syscom_context *ia_css_process_group_get_context(
++	ia_css_process_group_t *process_group);
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_CMD_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
+new file mode 100644
+index 000000000000..5e074b71f932
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_group_impl.h
+@@ -0,0 +1,1846 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H
++
++#include <ia_css_psysapi_fw_version.h>
++#include <ia_css_psys_process_group.h>
++#include "ia_css_psys_process_group_cmd_impl.h"
++#include <ia_css_psys_terminal.h>
++#include <ia_css_psys_transport.h>
++#include <ia_css_psys_process.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include "ia_css_terminal_manifest_types.h"
++
++#include "ia_css_rbm.h"
++
++#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
++
++#include <vied_nci_psys_system_global.h>
++#include <ia_css_program_group_data.h>
++#include "ia_css_rbm_manifest_types.h"
++#include <type_support.h>
++#include <error_support.h>
++#include <misc_support.h>
++#include <math_support.h>
++
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_terminal_manifest.h"
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_data_terminal_enabled(
++	const ia_css_data_terminal_manifest_t	*data_term_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap)
++{
++	bool is_terminal_enabled = false;
++
++	ia_css_kernel_bitmap_t term_bitmap =
++		ia_css_data_terminal_manifest_get_kernel_bitmap(
++				data_term_manifest);
++	/*
++	 * Terminals depend on a kernel,
++	 * if the kernel is present the program it contains and
++	 * the terminal the program depends on are active
++	 */
++	is_terminal_enabled  = !ia_css_is_kernel_bitmap_intersection_empty(
++			enable_bitmap,
++			term_bitmap);
++	return is_terminal_enabled;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_spatial_terminal_enabled(
++	const ia_css_spatial_param_terminal_manifest_t *spatial_term_man,
++	ia_css_kernel_bitmap_t enable_bitmap)
++{
++	bool is_terminal_enabled = false;
++	ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++
++	term_kernel_bitmap =
++		ia_css_kernel_bitmap_set(
++			term_kernel_bitmap,
++			spatial_term_man->kernel_id);
++	is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++			enable_bitmap, term_kernel_bitmap);
++	return is_terminal_enabled;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_is_terminal_enabled(
++	const ia_css_terminal_manifest_t *terminal_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap)
++{
++	ia_css_terminal_type_t terminal_type;
++	bool is_terminal_enabled = false;
++
++	verifjmpexit(NULL != terminal_manifest);
++	terminal_type = ia_css_terminal_manifest_get_type(terminal_manifest);
++
++	if (ia_css_is_terminal_manifest_data_terminal(terminal_manifest)) {
++		ia_css_data_terminal_manifest_t	*data_term_manifest =
++						(ia_css_data_terminal_manifest_t *)terminal_manifest;
++		is_terminal_enabled =
++				ia_css_process_group_is_data_terminal_enabled(data_term_manifest, enable_bitmap);
++	} else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++				terminal_manifest)) {
++		ia_css_spatial_param_terminal_manifest_t *spatial_term_man =
++			(ia_css_spatial_param_terminal_manifest_t *)
++			terminal_manifest;
++		 is_terminal_enabled = ia_css_process_group_is_spatial_terminal_enabled(spatial_term_man,
++			enable_bitmap);
++	} else if (ia_css_is_terminal_manifest_parameter_terminal(
++			terminal_manifest) && terminal_type ==
++			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
++		/*
++		 * For parameter out and program control terminals, we
++		 * disable the terminals if ALL the corresponding kernels
++		 * are disabled, for parameter in terminals we cannot do this;
++		 * even if kernels are disabled, it may be required that
++		 * (HW) parameters must be supplied via the parameter
++		 * in terminal (e.g. bypass bits).
++		 */
++		is_terminal_enabled = true;
++
++	} else if (ia_css_is_terminal_manifest_parameter_terminal(
++			terminal_manifest) && terminal_type ==
++			IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++		ia_css_param_terminal_manifest_t *param_term_man =
++			(ia_css_param_terminal_manifest_t *)terminal_manifest;
++		ia_css_param_manifest_section_desc_t *section_desc;
++		unsigned int section = 0;
++		uint8_t kernel_id;
++
++		for (section = 0; section < param_term_man->
++				param_manifest_section_desc_count; section++) {
++			section_desc =
++		ia_css_param_terminal_manifest_get_prm_sct_desc(
++						param_term_man, section);
++			verifjmpexit(section_desc != NULL);
++			kernel_id = ia_css_param_manifest_section_desc_get_kernel_id(section_desc);
++			term_kernel_bitmap = ia_css_kernel_bitmap_set(
++					term_kernel_bitmap,
++					kernel_id);
++		}
++
++		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++					enable_bitmap, term_kernel_bitmap);
++	} else if (ia_css_is_terminal_manifest_program_terminal(
++				terminal_manifest)) {
++		ia_css_kernel_bitmap_t term_kernel_bitmap = ia_css_kernel_bitmap_clear();
++		ia_css_program_terminal_manifest_t *prog_term_man =
++			(ia_css_program_terminal_manifest_t *)terminal_manifest;
++		unsigned int section = 0;
++
++		for (section = 0;
++			section < prog_term_man->fragment_param_manifest_section_desc_count;
++			section++) {
++			ia_css_fragment_param_manifest_section_desc_t *desc =
++				ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++					prog_term_man,
++					section);
++			verifjmpexit(desc != NULL);
++
++			term_kernel_bitmap = ia_css_kernel_bitmap_set(
++					term_kernel_bitmap,
++					ia_css_fragment_param_manifest_section_desc_get_kernel_id(desc));
++		}
++
++		is_terminal_enabled = !ia_css_is_kernel_bitmap_intersection_empty(
++					enable_bitmap, term_kernel_bitmap);
++	} else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++				terminal_manifest)) {
++		is_terminal_enabled = true;
++	}
++	return is_terminal_enabled;
++EXIT:
++	return false;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_process_group_get_fragment_limit(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint16_t fragment_limit = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_fragment_limit(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	fragment_limit = process_group->fragment_limit;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_limit invalid argument\n");
++	}
++	return fragment_limit;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_fragment_limit(
++	ia_css_process_group_t *process_group,
++	const uint16_t fragment_limit)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	uint16_t fragment_state;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_fragment_limit(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	retval = ia_css_process_group_get_fragment_state(process_group,
++		&fragment_state);
++
++	verifexitval(retval == 0, EINVAL);
++	verifexitval(fragment_limit > fragment_state, EINVAL);
++	verifexitval(fragment_limit <= ia_css_process_group_get_fragment_count(
++				process_group), EINVAL);
++
++	process_group->fragment_limit = fragment_limit;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_limit invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_limit failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_clear_fragment_limit(
++	ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_clear_fragment_limit(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	process_group->fragment_limit = 0;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_clear_fragment_limit invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_clear_fragment_limit failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_attach_buffer(
++	ia_css_process_group_t *process_group,
++	vied_vaddress_t buffer,
++	const ia_css_buffer_state_t buffer_state,
++	const unsigned int terminal_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	ia_css_terminal_t *terminal = NULL;
++
++	NOT_USED(buffer_state);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_attach_buffer(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	terminal = ia_css_process_group_get_terminal(
++				process_group, terminal_index);
++
++	verifexitval(terminal != NULL, EINVAL);
++	verifexitval(ia_css_process_group_get_state(process_group) ==
++		IA_CSS_PROCESS_GROUP_READY, EINVAL);
++	verifexitval(process_group->protocol_version ==
++		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY ||
++		process_group->protocol_version ==
++		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EINVAL);
++
++	if (process_group->protocol_version ==
++		IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
++		/*
++		 * Legacy flow:
++		 * Terminal address is part of the process group structure
++		 */
++		retval = ia_css_terminal_set_buffer(
++			terminal, buffer);
++	} else if (process_group->protocol_version ==
++		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG) {
++		/*
++		 * PPG flow:
++		 * Terminal address is part of external buffer set structure
++		 */
++		retval = ia_css_terminal_set_terminal_index(
++			terminal, terminal_index);
++	}
++	verifexitval(retval == 0, EFAULT);
++
++	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++		"\tTerminal 0x%lx has buffer 0x%x\n", (unsigned long int)terminal, buffer);
++
++	if (ia_css_is_terminal_data_terminal(terminal) == true) {
++		ia_css_frame_t *frame =
++			ia_css_data_terminal_get_frame(
++				(ia_css_data_terminal_t *)terminal);
++		verifexitval(frame != NULL, EINVAL);
++
++		retval = ia_css_frame_set_buffer_state(frame, buffer_state);
++		verifexitval(retval == 0, EINVAL);
++	}
++
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_attach_buffer invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_attach_buffer failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_vaddress_t ia_css_process_group_detach_buffer(
++	ia_css_process_group_t *process_group,
++	const unsigned int terminal_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	vied_vaddress_t buffer = VIED_NULL;
++
++	ia_css_terminal_t *terminal = NULL;
++	ia_css_process_group_state_t state;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_detach_buffer(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	terminal =
++		ia_css_process_group_get_terminal(
++				process_group, terminal_index);
++	state = ia_css_process_group_get_state(process_group);
++
++	verifexitval(terminal != NULL, EINVAL);
++	verifexitval(state == IA_CSS_PROCESS_GROUP_READY, EINVAL);
++
++	buffer = ia_css_terminal_get_buffer(terminal);
++
++	if (ia_css_is_terminal_data_terminal(terminal) == true) {
++		ia_css_frame_t *frame =
++			ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++		verifexitval(frame != NULL, EINVAL);
++
++		retval = ia_css_frame_set_buffer_state(frame, IA_CSS_BUFFER_NULL);
++		verifexitval(retval == 0, EINVAL);
++	}
++	ia_css_terminal_set_buffer(terminal, VIED_NULL);
++
++	retval = 0;
++EXIT:
++	/*
++	 * buffer pointer will appear on output,
++	 * regardless of subsequent fails to avoid memory leaks
++	 */
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_detach_buffer invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_detach_buffer failed (%i)\n",
++			retval);
++	}
++	return buffer;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_attach_stream(
++	ia_css_process_group_t *process_group,
++	uint32_t stream,
++	const ia_css_buffer_state_t buffer_state,
++	const unsigned int terminal_index)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_attach_stream(): enter:\n");
++
++	NOT_USED(process_group);
++	NOT_USED(stream);
++	NOT_USED(buffer_state);
++	NOT_USED(terminal_index);
++
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_attach_stream failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_detach_stream(
++	ia_css_process_group_t *process_group,
++	const unsigned int terminal_index)
++{
++	int retval = -1;
++	uint32_t stream = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_detach_stream(): enter:\n");
++
++	NOT_USED(process_group);
++	NOT_USED(terminal_index);
++
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_detach_stream failed (%i)\n",
++			retval);
++	}
++	return stream;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_barrier(
++	ia_css_process_group_t *process_group,
++	const vied_nci_barrier_ID_t barrier_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	vied_nci_resource_bitmap_t bit_mask;
++	vied_nci_resource_bitmap_t resource_bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_barrier(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	resource_bitmap =
++		ia_css_process_group_get_resource_bitmap(process_group);
++
++	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
++
++	verifexitval(bit_mask != 0, EINVAL);
++	verifexitval(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap), EINVAL);
++
++	resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
++
++	retval =
++		ia_css_process_group_set_resource_bitmap(
++			process_group, resource_bitmap);
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_barrier invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_barrier failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_clear_barrier(
++	ia_css_process_group_t *process_group,
++	const vied_nci_barrier_ID_t barrier_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	vied_nci_resource_bitmap_t bit_mask, resource_bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_clear_barrier(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	resource_bitmap =
++		ia_css_process_group_get_resource_bitmap(process_group);
++
++	bit_mask = vied_nci_barrier_bit_mask(barrier_index);
++
++	verifexitval(bit_mask != 0, EINVAL);
++	verifexitval(vied_nci_is_bitmap_set(bit_mask, resource_bitmap), EINVAL);
++
++	resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
++
++	retval =
++		ia_css_process_group_set_resource_bitmap(
++				process_group, resource_bitmap);
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_clear_barrier invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_clear_barrier failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_print(
++	const ia_css_process_group_t *process_group,
++	void *fid)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	int i;
++
++	uint8_t	process_count;
++	uint8_t terminal_count;
++	vied_vaddress_t ipu_vaddress = VIED_NULL;
++	ia_css_rbm_t routing_bitmap;
++
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_print(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	retval = ia_css_process_group_get_ipu_vaddress(process_group, &ipu_vaddress);
++	verifexitval(retval == 0, EINVAL);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"=============== Process group print start ===============\n");
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\tprocess_group cpu address = 0x%lx\n", (unsigned long int)process_group);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\tipu_virtual_address = %x\n", ipu_vaddress);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\tsizeof(process_group) = %d\n",
++		(int)ia_css_process_group_get_size(process_group));
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\tfragment_count = %d\n",
++		(int)ia_css_process_group_get_fragment_count(process_group));
++
++	routing_bitmap = *ia_css_process_group_get_routing_bitmap(process_group);
++	for (i = 0; i < (int)IA_CSS_RBM_NOF_ELEMS; i++) {
++		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++			"\trouting_bitmap[index = %d] = 0x%X\n",
++			i, (int)routing_bitmap.data[i]);
++	}
++
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\tprogram_group(process_group) = %d\n",
++		(int)ia_css_process_group_get_program_group_ID(process_group));
++	process_count = ia_css_process_group_get_process_count(process_group);
++	terminal_count =
++		ia_css_process_group_get_terminal_count(process_group);
++
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\t%d processes\n", (int)process_count);
++	for (i = 0; i < (int)process_count; i++) {
++		ia_css_process_t *process =
++			ia_css_process_group_get_process(process_group, i);
++
++		retval = ia_css_process_print(process, fid);
++		verifjmpexit(retval == 0);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\t%d terminals\n", (int)terminal_count);
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_t *terminal =
++			ia_css_process_group_get_terminal(process_group, i);
++
++		retval = ia_css_terminal_print(terminal, fid);
++		verifjmpexit(retval == 0);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"\terror_handling_enable = %u\n", process_group->error_handling_enable);
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"=============== Process group print end ===============\n");
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_print invalid argument\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_process_group_valid(
++	const ia_css_process_group_t *process_group,
++	const ia_css_program_group_manifest_t *pg_manifest,
++	const ia_css_program_group_param_t *param)
++{
++	DECLARE_ERRVAL
++	bool invalid_flag = false;
++	uint8_t proc_idx;
++	uint8_t proc_term_idx;
++	uint8_t	process_count;
++	uint8_t	program_count;
++	uint8_t terminal_count;
++	uint8_t man_terminal_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_process_group_valid(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	verifexitval(pg_manifest != NULL, EFAULT);
++	NOT_USED(param);
++
++	process_count = process_group->process_count;
++	terminal_count = process_group->terminal_count;
++	program_count = ia_css_program_group_manifest_get_program_count(pg_manifest);
++	man_terminal_count = ia_css_program_group_manifest_get_terminal_count(pg_manifest);
++
++	/* Validate process group */
++	invalid_flag = invalid_flag ||
++		!(program_count >= process_count) ||
++		!(man_terminal_count >= terminal_count) ||
++		!(process_group->size > process_group->processes_offset) ||
++		!(process_group->size > process_group->terminals_offset);
++
++	/* Validate processes */
++	for (proc_idx = 0; proc_idx < process_count; proc_idx++) {
++		const ia_css_process_t *process;
++		ia_css_program_manifest_t *p_manifest = NULL;
++		ia_css_program_ID_t prog_id;
++		bool no_match_found = true;
++
++		process = ia_css_process_group_get_process(process_group, proc_idx);
++		verifexitval(NULL != process, EFAULT);
++		prog_id = ia_css_process_get_program_ID(process);
++		p_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest,
++									   ia_css_process_get_program_idx(process));
++		verifexitval(NULL != p_manifest, EFAULT);
++
++		if (prog_id == ia_css_program_manifest_get_program_ID(p_manifest)) {
++			invalid_flag = invalid_flag || !ia_css_is_process_valid(process, p_manifest);
++			no_match_found = false;
++		}
++
++		invalid_flag = invalid_flag || no_match_found;
++	}
++
++	/* Validate terminals */
++	for (proc_term_idx = 0; proc_term_idx < terminal_count; proc_term_idx++) {
++		int man_term_idx;
++		const ia_css_terminal_t *terminal;
++		const ia_css_terminal_manifest_t *terminal_manifest;
++
++		terminal = ia_css_process_group_get_terminal(process_group, proc_term_idx);
++		verifexitval(NULL != terminal, EFAULT);
++		man_term_idx = ia_css_terminal_get_terminal_manifest_index(terminal);
++		terminal_manifest = ia_css_program_group_manifest_get_term_mnfst(pg_manifest, man_term_idx);
++
++		invalid_flag = invalid_flag || !ia_css_is_terminal_valid(terminal, terminal_manifest);
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_process_group_valid() invalid argument\n");
++		return false;
++	} else {
++		return (!invalid_flag);
++	}
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_process_group_submit(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	int i;
++	bool can_submit = false;
++	int retval = -1;
++	uint8_t	terminal_count =
++		ia_css_process_group_get_terminal_count(process_group);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_can_process_group_submit(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_t *terminal =
++			ia_css_process_group_get_terminal(process_group, i);
++		vied_vaddress_t buffer;
++		ia_css_buffer_state_t buffer_state;
++
++		verifexitval(terminal != NULL, EINVAL);
++
++		if (process_group->protocol_version ==
++			IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY) {
++			/*
++			 * For legacy pg flow, buffer addresses are contained inside
++			 * the process group structure, so these need to be validated
++			 * on process group submission.
++			 */
++			buffer = ia_css_terminal_get_buffer(terminal);
++			IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++				"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
++				i, (unsigned long int)terminal, buffer);
++		}
++
++		/* buffer_state is applicable only for data terminals*/
++		if (ia_css_is_terminal_data_terminal(terminal) == true) {
++			ia_css_frame_t *frame =
++				ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++
++			verifexitval(frame != NULL, EINVAL);
++			buffer_state = ia_css_frame_get_buffer_state(frame);
++			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
++				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
++				break;
++			}
++		} else if (
++			(ia_css_is_terminal_parameter_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_program_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_program_control_init_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_spatial_parameter_terminal(
++				terminal) != true)) {
++			/* neither data nor parameter terminal, so error.*/
++			break;
++		}
++
++	}
++	/* Only true if no check failed */
++	can_submit = (i == terminal_count);
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_process_group_submit invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_process_group_submit failed (%i)\n",
++			retval);
++	}
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_can_process_group_submit(): leave:\n");
++	return can_submit;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_enqueue_buffer_set(
++	const ia_css_process_group_t *process_group,
++	const ia_css_buffer_set_t *buffer_set)
++{
++	DECLARE_ERRVAL
++	int i;
++	bool can_enqueue = false;
++	int retval = -1;
++	uint8_t	terminal_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_can_enqueue_buffer_set(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	verifexitval(buffer_set != NULL, EFAULT);
++
++	terminal_count =
++		ia_css_process_group_get_terminal_count(process_group);
++
++	/*
++	 * For ppg flow, buffer addresses are contained in the
++	 * external buffer set structure, so these need to be
++	 * validated before enqueueing.
++	 */
++	verifexitval(process_group->protocol_version ==
++		IA_CSS_PROCESS_GROUP_PROTOCOL_PPG, EFAULT);
++
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_t *terminal =
++			ia_css_process_group_get_terminal(process_group, i);
++		vied_vaddress_t buffer;
++		ia_css_buffer_state_t buffer_state;
++
++		verifexitval(terminal != NULL, EINVAL);
++
++		buffer = ia_css_buffer_set_get_buffer(buffer_set, terminal);
++		IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++			"\tH: Terminal number(%d) is 0x%lx having buffer 0x%x\n",
++			i, (unsigned long int)terminal, buffer);
++
++		/* buffer_state is applicable only for data terminals*/
++		if (ia_css_is_terminal_data_terminal(terminal) == true) {
++			ia_css_frame_t *frame =
++				ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++
++			verifexitval(frame != NULL, EINVAL);
++			buffer_state = ia_css_frame_get_buffer_state(frame);
++			if ((buffer_state == IA_CSS_BUFFER_NULL) ||
++				(buffer_state == IA_CSS_N_BUFFER_STATES)) {
++				break;
++			}
++		} else if (
++			(ia_css_is_terminal_parameter_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_program_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_program_control_init_terminal(terminal)
++				!= true) &&
++			(ia_css_is_terminal_spatial_parameter_terminal(
++				terminal) != true)) {
++			/* neither data nor parameter terminal, so error.*/
++			break;
++		}
++	}
++	/* Only true if no check failed */
++	can_enqueue = (i == terminal_count);
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_enqueue_buffer_set invalid argument\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_enqueue_buffer_set failed (%i)\n",
++			retval);
++	}
++	return can_enqueue;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_can_process_group_start(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	int i;
++	bool can_start = false;
++	int retval = -1;
++	uint8_t	terminal_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_can_process_group_start(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	terminal_count =
++		ia_css_process_group_get_terminal_count(process_group);
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_t *terminal =
++			ia_css_process_group_get_terminal(process_group, i);
++		ia_css_buffer_state_t buffer_state;
++		bool ok = false;
++
++		verifexitval(terminal != NULL, EINVAL);
++		if (ia_css_is_terminal_data_terminal(terminal) == true) {
++			/*
++			 * buffer_state is applicable only for data terminals
++			 */
++			ia_css_frame_t *frame =
++				ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++			bool is_input = ia_css_is_terminal_input(terminal);
++			/*
++			 * check for NULL here.
++			 * then invoke next 2 statements
++			 */
++			verifexitval(frame != NULL, EINVAL);
++			IA_CSS_TRACE_5(PSYSAPI_DYNAMIC, VERBOSE,
++				"\tTerminal %d: buffer_state %u, access_type %u, data_bytes %u, data %u\n",
++				i, frame->buffer_state, frame->access_type,
++				frame->data_bytes, frame->data);
++			buffer_state = ia_css_frame_get_buffer_state(frame);
++
++			ok = ((is_input &&
++				(buffer_state == IA_CSS_BUFFER_FULL)) ||
++					(!is_input && (buffer_state ==
++							IA_CSS_BUFFER_EMPTY)));
++
++		} else if (ia_css_is_terminal_parameter_terminal(terminal) ==
++				true) {
++			/*
++			 * FIXME:
++			 * is there any pre-requisite for param_terminal?
++			 */
++			ok = true;
++		} else if (ia_css_is_terminal_program_terminal(terminal) ==
++				true) {
++			ok = true;
++		} else if (ia_css_is_terminal_program_control_init_terminal(terminal) ==
++				true) {
++			ok = true;
++		} else if (ia_css_is_terminal_spatial_parameter_terminal(
++					terminal) == true) {
++			ok = true;
++		} else {
++			/* neither data nor parameter terminal, so error.*/
++			break;
++		}
++
++		if (!ok)
++			break;
++	}
++	/* Only true if no check failed */
++	can_start = (i == terminal_count);
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_process_group_submit invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_can_process_group_start failed (%i)\n",
++			retval);
++	}
++	return can_start;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_process_group_get_size(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	size_t size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_size(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	size = process_group->size;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_size invalid argument\n");
++	}
++	return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_state_t ia_css_process_group_get_state(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	ia_css_process_group_state_t state = IA_CSS_N_PROCESS_GROUP_STATES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_state(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	state = process_group->state;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_state invalid argument\n");
++	}
++	return state;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_process_group_get_kernel_bitmap(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_group_get_kernel_bitmap(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	bitmap = process_group->kernel_bitmap;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_group_get_kernel_bitmap invalid argument process\n");
++	}
++	return bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++const ia_css_rbm_t *ia_css_process_group_get_routing_bitmap(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	const ia_css_rbm_t *rbm = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_routing_bitmap(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	rbm = &(process_group->routing_bitmap);
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_routing_bitmap invalid argument\n");
++	}
++	return rbm;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_process_group_get_fragment_count(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint16_t fragment_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_fragment_count(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	fragment_count = process_group->fragment_count;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_count invalid argument\n");
++	}
++	return fragment_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_process_count(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t process_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_process_count(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	process_count = process_group->process_count;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_process_count invalid argument\n");
++	}
++	return process_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_terminal_count(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t terminal_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_terminal_count(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	terminal_count = process_group->terminal_count;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_terminal_count invalid argument\n");
++	}
++	return terminal_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_psys_server_init_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t psys_server_init_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"uint32_t ia_css_process_group_get_psys_server_init_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	psys_server_init_cycles = process_group->psys_server_init_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"uint32_t ia_css_process_group_get_psys_server_init_cycles invalid argument\n");
++	}
++	return psys_server_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_load_start_ts(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_load_start_ts = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_load_start_ts(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_load_start_ts = process_group->pg_load_start_ts;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_load_start_ts invalid argument\n");
++	}
++	return pg_load_start_ts;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_load_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_load_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_load_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_load_cycles = process_group->pg_load_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_load_cycles invalid argument\n");
++	}
++	return pg_load_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_init_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_init_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_init_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_init_cycles = process_group->pg_init_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_init_cycles invalid argument\n");
++	}
++	return pg_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_processing_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_processing_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_processing_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_processing_cycles = process_group->pg_processing_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_processing_cycles invalid argument\n");
++	}
++	return pg_processing_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_next_frame_init_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_next_frame_init_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_next_frame_init_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_next_frame_init_cycles = process_group->pg_next_frame_init_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_next_frame_init_cycles invalid argument\n");
++	}
++	return pg_next_frame_init_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_get_pg_complete_cycles(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint32_t pg_complete_cycles = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_pg_complete_cycles(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	pg_complete_cycles = process_group->pg_complete_cycles;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_pg_complete_cycles invalid argument\n");
++	}
++	return pg_complete_cycles;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_terminal_from_type(
++		const ia_css_process_group_t *process_group,
++		const ia_css_terminal_type_t terminal_type)
++{
++	unsigned int proc_cnt;
++	ia_css_terminal_t *terminal = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++			"ia_css_process_group_get_terminal_from_type(): enter:\n");
++
++	for (proc_cnt = 0; proc_cnt < (unsigned int)ia_css_process_group_get_terminal_count(process_group); proc_cnt++) {
++		terminal = ia_css_process_group_get_terminal(process_group, proc_cnt);
++		if (terminal == NULL) {
++			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++					"ia_css_process_group_get_terminal_from_type() Failed to get terminal %d", proc_cnt);
++			goto EXIT;
++		}
++		if (ia_css_terminal_get_type(terminal) == terminal_type) {
++			return terminal;
++		}
++		terminal = NULL; /* If not the expected type, return NULL */
++	}
++EXIT:
++	return terminal;
++}
++
++/* Returns the terminal or NULL if it was not found
++   For some of those maybe valid to not exist at all in the process group */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++const ia_css_terminal_t *ia_css_process_group_get_single_instance_terminal(
++	const ia_css_process_group_t 	*process_group,
++	ia_css_terminal_type_t		term_type)
++{
++	int i, term_count;
++
++	assert(process_group != NULL);
++
++	/* Those below have at most one instance per process group */
++	assert(term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++		term_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ||
++		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM ||
++		term_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++
++	term_count = ia_css_process_group_get_terminal_count(process_group);
++
++	for (i = 0; i < term_count; i++) {
++		const ia_css_terminal_t	*terminal = ia_css_process_group_get_terminal(process_group, i);
++
++		if (ia_css_terminal_get_type(terminal) == term_type) {
++			/* Only one parameter terminal per process group */
++			return terminal;
++		}
++	}
++
++	return NULL;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_manifest_idx_terminal(
++	const ia_css_process_group_t *process_grp,
++	const unsigned int manifest_idx)
++{
++	DECLARE_ERRVAL
++	uint8_t i = 0;
++	uint8_t terminal_count;
++
++	terminal_count =
++		ia_css_process_group_get_terminal_count(process_grp);
++
++	for ( i = 0; i < terminal_count;
++			i++) {
++		unsigned int man_term_idx;
++		ia_css_terminal_t *terminal;
++
++		terminal =
++			ia_css_process_group_get_terminal(
++					process_grp, i);
++		verifexitval(NULL != terminal, EFAULT);
++		man_term_idx =
++			ia_css_terminal_get_terminal_manifest_index(terminal);
++		if (man_term_idx == manifest_idx)
++			return terminal;
++	}
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_manifest_idx_terminal Error\n");
++	}
++	return NULL;
++
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_t *ia_css_process_group_get_terminal(
++	const ia_css_process_group_t *process_grp,
++	const unsigned int terminal_num)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_t *terminal_ptr = NULL;
++	uint16_t *terminal_offset_table;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_terminal(): enter:\n");
++
++	verifexitval(process_grp != NULL, EFAULT);
++	verifexitval(terminal_num < process_grp->terminal_count, EINVAL);
++
++	terminal_offset_table =
++		(uint16_t *)((char *)process_grp +
++				process_grp->terminals_offset);
++	terminal_ptr =
++		(ia_css_terminal_t *)((char *)process_grp +
++				terminal_offset_table[terminal_num]);
++
++	verifexitval(terminal_ptr != NULL, EFAULT);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_terminal invalid argument\n");
++	}
++	return terminal_ptr;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_t *ia_css_process_group_get_process(
++	const ia_css_process_group_t *process_grp,
++	const unsigned int process_num)
++{
++	DECLARE_ERRVAL
++	ia_css_process_t *process_ptr = NULL;
++	uint16_t *process_offset_table;
++
++	verifexitval(process_grp != NULL, EFAULT);
++	verifexitval(process_num < process_grp->process_count, EINVAL);
++
++	process_offset_table =
++		(uint16_t *)((char *)process_grp +
++				process_grp->processes_offset);
++	process_ptr =
++		(ia_css_process_t *)((char *)process_grp +
++				process_offset_table[process_num]);
++
++	verifexitval(process_ptr != NULL, EFAULT);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_process invalid argument\n");
++	}
++	return process_ptr;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_group_ID_t ia_css_process_group_get_program_group_ID(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	ia_css_program_group_ID_t id = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_program_group_ID(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	id = process_group->ID;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_program_group_ID invalid argument\n");
++	}
++	return id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_group_get_resource_bitmap(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t resource_bitmap = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_resource_bitmap(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	resource_bitmap = process_group->resource_bitmap;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_resource_bitmap invalid argument\n");
++	}
++	return resource_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_resource_bitmap(
++	ia_css_process_group_t *process_group,
++	const vied_nci_resource_bitmap_t resource_bitmap)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_resource_bitmap(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	process_group->resource_bitmap = resource_bitmap;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_resource_bitmap invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_resource_bitmap failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_routing_bitmap(
++	ia_css_process_group_t *process_group,
++	const ia_css_rbm_t rbm)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_routing_bitmap(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	process_group->routing_bitmap = rbm;
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_routing_bitmap invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_routing_bitmap failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_group_compute_cycle_count(
++	const ia_css_program_group_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	DECLARE_ERRVAL
++	uint32_t cycle_count = 0;
++
++	NOT_USED(manifest);
++	NOT_USED(param);
++
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(param != NULL, EFAULT);
++
++	cycle_count = 1;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_compute_cycle_count invalid argument\n");
++	}
++	return cycle_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_fragment_state(
++	ia_css_process_group_t *process_group,
++	uint16_t fragment_state)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_set_fragment_state(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	verifexitval(fragment_state <= ia_css_process_group_get_fragment_count(
++				process_group), EINVAL);
++
++	process_group->fragment_state = fragment_state;
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_fragment_state invalid argument process_group\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_fragment_state failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_get_fragment_state(
++	const ia_css_process_group_t *process_group,
++	uint16_t *fragment_state)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_fragment_state(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	verifexitval(fragment_state != NULL, EFAULT);
++
++	*fragment_state = process_group->fragment_state;
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_state invalid argument\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_fragment_state failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_get_ipu_vaddress(
++	const ia_css_process_group_t *process_group,
++	vied_vaddress_t *ipu_vaddress)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_ipu_vaddress(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++	verifexitval(ipu_vaddress != NULL, EFAULT);
++
++	*ipu_vaddress = process_group->ipu_virtual_address;
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_ipu_vaddress invalid argument\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_ipu_vaddress failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_ipu_vaddress(
++	ia_css_process_group_t *process_group,
++	vied_vaddress_t ipu_vaddress)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_ipu_vaddress(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	process_group->ipu_virtual_address = ipu_vaddress;
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_ipu_vaddress invalid argument\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_ipu_vaddress failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_protocol_version(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t protocol_version = IA_CSS_PROCESS_GROUP_N_PROTOCOLS;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_protocol_version(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	protocol_version = process_group->protocol_version;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_protocol_version invalid argument\n");
++	}
++	return protocol_version;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_base_queue_id(
++	ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t queue_id = IA_CSS_N_PSYS_CMD_QUEUE_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_base_queue_id(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	queue_id = process_group->base_queue_id;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_base_queue_id invalid argument\n");
++	}
++	return queue_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_base_queue_id(
++	ia_css_process_group_t *process_group,
++	uint8_t queue_id)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_base_queue_id(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	/* Make sure that Driver\host don't use the main command queue or device queue for the ppg queues*/
++	if ((queue_id > IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID) && ((queue_id + process_group->num_queues - 1) < IA_CSS_N_PSYS_CMD_QUEUE_ID)) {
++		process_group->base_queue_id = queue_id;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_base_queue_id: queue_id %u out of range for process_group 0x%lx\n",
++					   queue_id, (unsigned long int)process_group);
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_base_queue_id invalid argument\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_num_queues(
++	ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t num_queues = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_num_queues(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	num_queues = process_group->num_queues;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_num_queues invalid argument\n");
++	}
++	return num_queues;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_group_set_num_queues(
++	ia_css_process_group_t *process_group,
++	uint8_t num_queues)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_num_queues(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	process_group->num_queues = num_queues;
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_num_queues invalid argument\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_process_group_set_error_handling_enable(
++	ia_css_process_group_t *process_group,
++	const bool error_handling_enable)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_error_handling_enable(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	process_group->error_handling_enable = (uint8_t)((error_handling_enable == true) ? 1 : 0);
++	retval = 0;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_error_handling_enable invalid argument\n");
++	}
++
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_group_get_error_handling_enable(
++	const ia_css_process_group_t *process_group)
++{
++	DECLARE_ERRVAL
++	uint8_t error_handling_enable = UINT8_MAX;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_error_handling_enable(): enter:\n");
++
++	verifexitval(process_group != NULL, EFAULT);
++
++	/* Error handling enable flag should serve as boolean type, so it can be either 0 or 1 */
++	assert(process_group->error_handling_enable <= (uint8_t)1);
++	error_handling_enable = process_group->error_handling_enable;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_get_error_handling_enable invalid argument\n");
++	}
++
++	return error_handling_enable;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_process_group_has_vp(const ia_css_process_group_t *process_group)
++{
++#if NUM_OF_VP_CELLS > 0
++	bool has_vp = false;
++#ifdef HAS_VP
++	uint32_t i;
++
++	uint8_t process_count = ia_css_process_group_get_process_count(process_group);
++
++	for (i = 0; i < process_count; i++) {
++		ia_css_process_t *process;
++		vied_nci_cell_ID_t cell_id;
++
++		process = ia_css_process_group_get_process(process_group, i);
++		cell_id = ia_css_process_get_cell(process);
++
++		if (VIED_NCI_VP_TYPE_ID == vied_nci_cell_get_type(cell_id)) {
++			has_vp = true;
++			break;
++		}
++	}
++#else /* not HAS_VP */
++		NOT_USED(process_group);
++#endif /* HAS_VP */
++
++	return has_vp;
++#else
++	NOT_USED(process_group);
++	return false;
++#endif
++}
++
++#endif /* __IA_CSS_PSYS_PROCESS_GROUP_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
+new file mode 100644
+index 000000000000..feb0e166dfda
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_impl.h
+@@ -0,0 +1,694 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_IMPL_H
++#define __IA_CSS_PSYS_PROCESS_IMPL_H
++
++#include <ia_css_psys_process.h>
++
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_program_manifest.h>
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_psys_process_private_types.h"
++
++/** Function only to be used in FW */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_ext_t *ia_css_process_get_extension(const ia_css_process_t *process)
++{
++	DECLARE_ERRVAL
++	verifexitval(process != NULL, EFAULT);
++	if (process->process_extension_offset != 0) {
++		return (ia_css_process_ext_t *)((uint8_t *)process + process->process_extension_offset);
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_get_extension invalid argument\n");
++	}
++	return NULL;
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
++STORAGE_CLASS_INLINE vied_nci_cell_ID_t ia_css_process_cells_get_cell(const ia_css_process_t *process, int index)
++{
++	assert(index < IA_CSS_PROCESS_MAX_CELLS);
++	return process->cells[index];
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process.h */
++STORAGE_CLASS_INLINE void ia_css_process_cells_set_cell(ia_css_process_t *process, int index, vied_nci_cell_ID_t cell_id)
++{
++	assert(index < IA_CSS_PROCESS_MAX_CELLS);
++	process->cells[index] = cell_id;
++}
++
++/** Function only to be used in ia_css_psys_process_impl.h and ia_css_psys_process */
++STORAGE_CLASS_INLINE void ia_css_process_cells_clear(ia_css_process_t *process)
++{
++	int i;
++	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		ia_css_process_cells_set_cell(process, i, VIED_NCI_N_CELL_ID);
++	}
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_cell_ID_t ia_css_process_get_cell(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	vied_nci_cell_ID_t	cell_id = VIED_NCI_N_CELL_ID;
++	int i = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_cell(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		assert(VIED_NCI_N_CELL_ID == ia_css_process_cells_get_cell(process, i));
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++	}
++	cell_id = ia_css_process_cells_get_cell(process, 0);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_cell invalid argument\n");
++	}
++	return cell_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_mem_ID_t ia_css_process_get_ext_mem_id(
++	const ia_css_process_t		*process,
++	const vied_nci_mem_type_ID_t	mem_type)
++{
++	DECLARE_ERRVAL
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_ext_mem(): enter:\n");
++
++	verifexitval(process != NULL && mem_type < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_ext_mem invalid argument\n");
++		return IA_CSS_PROCESS_INVALID_OFFSET;
++	}
++	return process_ext->ext_mem_id[mem_type];
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_process_get_program_idx(
++	const ia_css_process_t		*process)
++{
++	DECLARE_ERRVAL
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_program_idx(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_program_idx invalid argument\n");
++		return IA_CSS_PROCESS_INVALID_PROGRAM_IDX;
++	}
++	return process->program_idx;
++}
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_dev_chn(
++	const ia_css_process_t		*process,
++	const vied_nci_dev_chn_ID_t	dev_chn_id)
++{
++	DECLARE_ERRVAL
++	ia_css_process_ext_t *process_ext = NULL;
++
++	COMPILATION_ERROR_IF(VIED_NCI_N_DATA_MEM_TYPE_ID != VIED_NCI_N_MEM_TYPE_ID - 1); /* check for vied_nci_psys_resource_model.h correctness */
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_dev_chn(): enter:\n");
++	verifexitval(process != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_dev_chn(): invalid arguments\n");
++		return IA_CSS_PROCESS_INVALID_OFFSET;
++	}
++	return process_ext->dev_chn_offset[dev_chn_id];
++}
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_int_mem_offset(
++	const ia_css_process_t				*process,
++	const vied_nci_mem_type_ID_t			mem_id)
++{
++	(void)process;
++	(void)mem_id;
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_get_int_mem_offset always returns 0"
++		"(internally memory feature not used).\n");
++	return 0;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_process_get_ext_mem_offset(
++	const ia_css_process_t				*process,
++	const vied_nci_mem_type_ID_t			mem_type_id)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_size_t ext_mem_offset = IA_CSS_PROCESS_INVALID_OFFSET;
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_ext_mem_offset(): enter:\n");
++
++	verifexitval(process != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	verifexitval(process_ext != NULL, EFAULT);
++
++EXIT:
++	if (noerror()) {
++		ext_mem_offset = process_ext->ext_mem_offset[mem_type_id];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_ext_mem_offset invalid argument\n");
++	}
++
++	return ext_mem_offset;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_process_get_size(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_size(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++EXIT:
++	if (noerror()) {
++		size = process->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			       "ia_css_process_get_size invalid argument\n");
++	}
++
++	return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_state_t ia_css_process_get_state(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	ia_css_process_state_t	state = IA_CSS_N_PROCESS_STATES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_state(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++EXIT:
++	if (noerror()) {
++		state = (ia_css_process_state_t)process->state;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			       "ia_css_process_get_state invalid argument\n");
++	}
++
++	return state;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_set_state(
++	ia_css_process_t					*process,
++	ia_css_process_state_t				state)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_set_state(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++	assert(state <= UINT8_MAX);
++	process->state = state;
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_set_state invalid argument\n");
++	}
++
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_cell_dependency_count(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	uint8_t	cell_dependency_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_cell_dependency_count(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	cell_dependency_count = process->cell_dependency_count;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		"ia_css_process_get_cell_dependency_count invalid argument\n");
++	}
++	return cell_dependency_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_terminal_dependency_count(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	uint8_t	terminal_dependency_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_terminal_dependency_count(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	terminal_dependency_count = process->terminal_dependency_count;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_terminal_dependency_count invalid argument process\n");
++	}
++	return terminal_dependency_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_t *ia_css_process_get_parent(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	ia_css_process_group_t	*parent = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_parent(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	if (process->parent_offset == 0) {
++		return NULL;
++	};
++	parent =
++	(ia_css_process_group_t *) ((char *)process + process->parent_offset);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_get_parent invalid argument process\n");
++	}
++	return parent;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_ID_t ia_css_process_get_program_ID(
++	const ia_css_process_t					*process)
++{
++	DECLARE_ERRVAL
++	ia_css_program_ID_t		id = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_program_ID(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++	id = process->ID;
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		    "ia_css_process_get_program_ID invalid argument process\n");
++	}
++	return id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_id_t ia_css_process_get_cell_dependency(
++	const ia_css_process_t *process,
++	const unsigned int cell_num)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_id_t cell_dependency =
++		IA_CSS_PROCESS_INVALID_DEPENDENCY;
++	vied_nci_resource_id_t *cell_dep_ptr = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_get_cell_dependency(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	verifexitval(cell_num < process->cell_dependency_count, EFAULT);
++
++	cell_dep_ptr =
++		(vied_nci_resource_id_t *)
++		((char *)process + process->cell_dependencies_offset);
++	cell_dependency = *(cell_dep_ptr + cell_num);
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		       "ia_css_process_get_cell_dependency invalid argument\n");
++	}
++	return cell_dependency;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_process_get_terminal_dependency(
++	const ia_css_process_t					*process,
++	const unsigned int					terminal_num)
++{
++	DECLARE_ERRVAL
++	uint8_t *ter_dep_ptr = NULL;
++	uint8_t ter_dep = IA_CSS_PROCESS_INVALID_DEPENDENCY;
++
++	verifexitval(process != NULL, EFAULT);
++	verifexitval(terminal_num < process->terminal_dependency_count, EFAULT);
++
++	ter_dep_ptr = (uint8_t *) ((char *)process +
++				   process->terminal_dependencies_offset);
++
++	ter_dep = *(ter_dep_ptr + terminal_num);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		       "ia_css_process_get_terminal_dependency invalid argument\n");
++	}
++	return ter_dep;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_cells_bitmap(
++	const ia_css_process_t *process)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t bitmap = 0;
++	vied_nci_cell_ID_t cell_id;
++	int i = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_cell_bitmap(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++
++	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		cell_id = ia_css_process_cells_get_cell(process, i);
++		if (VIED_NCI_N_CELL_ID != cell_id) {
++			bitmap |= (1 << cell_id);
++		}
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_get_cells_bitmap invalid argument process\n");
++	}
++
++	return bitmap;
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_port_bitmap_ptr(
++	ia_css_process_t *process)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t *p_bitmap = NULL;
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	if (process_ext == NULL) {
++		return NULL;
++	}
++
++	p_bitmap = &process_ext->dfm_port_bitmap[0];
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++	}
++
++	return p_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t* ia_css_process_get_dfm_active_port_bitmap_ptr(
++	ia_css_process_t *process)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t *p_bitmap = NULL;
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	if (process_ext == NULL) {
++		return NULL;
++	}
++
++	p_bitmap = &process_ext->dfm_active_port_bitmap[0];
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++	}
++
++	return p_bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_port_bitmap(
++	const ia_css_process_t *process,
++	vied_nci_dev_dfm_id_t  dfm_res_id)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t bitmap = 0;
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_dfm_port_bitmap(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	if (process_ext == NULL) {
++		return 0;
++	}
++	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++	bitmap = process_ext->dfm_port_bitmap[dfm_res_id];
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_get_dfm_port_bitmap invalid argument process\n");
++	}
++
++	return bitmap;
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_process_get_dfm_active_port_bitmap(
++	const ia_css_process_t *process,
++	vied_nci_dev_dfm_id_t  dfm_res_id)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t bitmap = 0;
++	ia_css_process_ext_t *process_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		       "ia_css_process_get_dfm_active_port_bitmap(): enter:\n");
++
++	verifexitval(process != NULL, EFAULT);
++	process_ext = ia_css_process_get_extension(process);
++	if (process_ext == NULL) {
++		return 0;
++	}
++#if HAS_DFM
++	verifexitval(dfm_res_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++	bitmap = process_ext->dfm_active_port_bitmap[dfm_res_id];
++#else
++	NOT_USED(dfm_res_id);
++#endif
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++		 "ia_css_process_get_dfm_active_port_bitmap invalid argument process\n");
++	}
++	return bitmap;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_process_valid(
++	const ia_css_process_t		*process,
++	const ia_css_program_manifest_t	*p_manifest)
++{
++	DECLARE_ERRVAL
++	bool invalid_flag = false;
++	ia_css_program_ID_t prog_id;
++
++	verifexitval(NULL != process, EFAULT);
++	verifexitval(NULL != p_manifest, EFAULT);
++
++	prog_id = ia_css_process_get_program_ID(process);
++	verifjmpexit(prog_id == ia_css_program_manifest_get_program_ID(p_manifest));
++
++	invalid_flag = (process->size <= process->cell_dependencies_offset) ||
++		   (process->size <= process->terminal_dependencies_offset);
++
++	if (ia_css_has_program_manifest_fixed_cell(p_manifest)) {
++		vied_nci_cell_ID_t cell_id;
++
++		cell_id = ia_css_program_manifest_get_cell_ID(p_manifest);
++		invalid_flag = invalid_flag ||
++			    (cell_id != (vied_nci_cell_ID_t)(ia_css_process_get_cell(process)));
++	}
++	invalid_flag = invalid_flag ||
++		((process->cell_dependency_count +
++		  process->terminal_dependency_count) == 0) ||
++		(process->cell_dependency_count !=
++	ia_css_program_manifest_get_program_dependency_count(p_manifest)) ||
++		(process->terminal_dependency_count !=
++	ia_css_program_manifest_get_terminal_dependency_count(p_manifest));
++
++	/* TODO: to be removed once all PGs pass validation */
++	if (invalid_flag == true) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++			"ia_css_is_process_valid(): false\n");
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_process_valid() invalid argument\n");
++		return false;
++	} else {
++		return (!invalid_flag);
++	}
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_process_cmd(
++	ia_css_process_t					*process,
++	const ia_css_process_cmd_t				cmd)
++{
++	int	retval = -1;
++	ia_css_process_state_t	state;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): enter:\n");
++
++	verifexit(process != NULL);
++
++	state = ia_css_process_get_state(process);
++
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "ia_css_process_cmd(): state: %d\n", state);
++
++	verifexit(state != IA_CSS_PROCESS_ERROR);
++	verifexit(state < IA_CSS_N_PROCESS_STATES);
++
++	switch (cmd) {
++	case IA_CSS_PROCESS_CMD_NOP:
++		break;
++	case IA_CSS_PROCESS_CMD_ACQUIRE:
++		verifexit(state == IA_CSS_PROCESS_READY);
++		break;
++	case IA_CSS_PROCESS_CMD_RELEASE:
++		verifexit(state == IA_CSS_PROCESS_READY);
++		break;
++	case IA_CSS_PROCESS_CMD_START:
++		verifexit((state == IA_CSS_PROCESS_READY)
++			  || (state == IA_CSS_PROCESS_STOPPED));
++		process->state = IA_CSS_PROCESS_STARTED;
++		break;
++	case IA_CSS_PROCESS_CMD_LOAD:
++		verifexit((state == IA_CSS_PROCESS_STARTED)
++				|| (state == IA_CSS_PROCESS_READY)
++				|| (state == IA_CSS_PROCESS_STOPPED));
++		process->state = IA_CSS_PROCESS_RUNNING;
++		break;
++	case IA_CSS_PROCESS_CMD_STOP:
++		verifexit((state == IA_CSS_PROCESS_RUNNING)
++			  || (state == IA_CSS_PROCESS_SUSPENDED));
++		process->state = IA_CSS_PROCESS_STOPPED;
++		break;
++	case IA_CSS_PROCESS_CMD_SUSPEND:
++		verifexit(state == IA_CSS_PROCESS_RUNNING);
++		process->state = IA_CSS_PROCESS_SUSPENDED;
++		break;
++	case IA_CSS_PROCESS_CMD_RESUME:
++		verifexit(state == IA_CSS_PROCESS_SUSPENDED);
++		process->state = IA_CSS_PROCESS_RUNNING;
++		break;
++	case IA_CSS_N_PROCESS_CMDS:	/* Fall through */
++	default:
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_cmd invalid cmd (0x%x)\n", cmd);
++		goto EXIT;
++	}
++	retval = 0;
++EXIT:
++	if (NULL == process) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_cmd invalid argument process\n");
++	}
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_cmd failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++#endif /* __IA_CSS_PSYS_PROCESS_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
+new file mode 100644
+index 000000000000..d8d58835c1e6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_private_types.h
+@@ -0,0 +1,135 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
++#define __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H
++
++#include "ia_css_psys_process_types.h"
++#include "vied_nci_psys_resource_model.h"
++
++#define	N_UINT32_IN_PROCESS_STRUCT				0
++#define	N_UINT16_IN_PROCESS_STRUCT				1
++#define	N_UINT8_IN_PROCESS_STRUCT				8
++
++#if IA_CSS_PROCESS_STATE_BITS != 8
++#error IA_CSS_PROCESS_STATE_BITS expected to be 8
++#endif
++
++#define SIZE_OF_PROCESS_EXTENSION \
++	 ((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
++	+ (VIED_NCI_N_DEV_CHN_ID * VIED_NCI_RESOURCE_SIZE_BITS) \
++	+ (VIED_NCI_N_DATA_MEM_TYPE_ID * VIED_NCI_RESOURCE_ID_BITS) \
++	+ (N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT * 8))
++
++/** Extended process attributes describing more resource requirements
++ *  (and some DFM handling details ) beyond those covered in
++ *  ia_css_process_s.
++ */
++struct ia_css_process_ext_s {
++#if VIED_NCI_N_DEV_DFM_ID > 0
++	/** DFM port allocated to this process */
++	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++	/** Active DFM ports which need a kick */
++	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++	/** (external) Memory allocation offset given to this process */
++	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if VIED_NCI_N_DEV_CHN_ID > 0
++	/** Device channel allocation offset given to this process */
++	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++	/** (external) Memory ID */
++	vied_nci_resource_id_t ext_mem_id[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT > 0
++	/** Number of processes (mapped on cells) this process depends on */
++	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT];
++#endif
++};
++
++#define SIZE_OF_PROCESS_STRUCT_BITS \
++	((N_UINT32_IN_PROCESS_STRUCT * 32) \
++	+ (IA_CSS_PROGRAM_ID_BITS) \
++	+ (N_UINT16_IN_PROCESS_STRUCT * 16) \
++	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
++	+ (N_UINT8_IN_PROCESS_STRUCT * 8) \
++	+ ((N_PADDING_UINT8_IN_PROCESS_STRUCT) * 8))
++
++/** Process attributes describing the instantiation of a single Program
++ *  within a Program Group.
++ */
++struct ia_css_process_s {
++	/** Reference to the containing process group */
++	int16_t parent_offset;
++	/** Size of this structure */
++	uint8_t size;
++	/** Offset in bytes to Array[dependency_count] of ID's (type vied_nci_resource_id_t)
++	 *  of the cells that provide input to this process.
++	 *  Align to 64 bit boundary.
++	 *  Set to zero if dependency_count is zero.
++	 *  @see cell_dependency_count in this structure */
++	uint8_t cell_dependencies_offset;
++	/** Offset in bytes to Array[terminal_dependency_count] of indices (type: uint8_t)
++	 *  of connected terminals (that is, the terminals that are associated with this process).
++	 *  Each index is a key into to the process group terminal list.
++	 *  Set to zero if dependency_count is zero.
++	 *  @see terminal_dependency_count in this structure
++	 *  @see ia_css_process_group_get_terminal() */
++	uint8_t terminal_dependencies_offset;
++	/** Offset in bytes to process extension structure, ia_css_process_ext_s
++	 *  Align to 32 bit boundary.
++	 *  Set to zero if extension is not used. The manifest must be queried to
++	 *  find out if the extensino is necessary.
++	 *  @see ia_css_program_manifest_process_requires_extension() */
++	uint8_t process_extension_offset;
++	/** Referal ID to a specific program.  This ID is unique across PG's and
++	 *  can be used to retreive program meta data (AKA "program descriptor")
++	 *  from the client package, including the program manifest and even
++	 *  firmware program code, if the program is to be executed on a DSP. */
++	ia_css_program_ID_t ID;
++	/** Program index into the list of programs in the containing PG */
++	uint8_t program_idx;
++	/** State of the process FSM dependent on the parent FSM.  Type is actually: ia_css_process_state_t
++	 *  Used by the PSYSAPI for its own process state machine and internally by FW.  For the purposes of
++	 *  the ABI protocol definition, host code should just set this to IA_CSS_PROCESS_READY before sending
++	 *  an IA_CSS_PROCESS_GROUP_CMD_START command to firmware.  */
++	uint8_t state;
++	/** Execution resources (e.g. DSP "cells" or fixed HW) required by the process. */
++	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
++	/** Size of the array of dependent cells pointed at by cell_dependencies_offset
++	 *  Value must be set to the corresponding value from the manifest entry for this program.
++	 *  As each program implies a cell (logically, if not physically) to execute the program,
++	 *  the dependent cell count value in the process is the same as the dependent program count.
++	 *  @see ia_css_program_manifest_get_program_dependency_count() */
++	uint8_t cell_dependency_count;
++	/** Number of terminals this process depends on.  This is the size of the array
++	 *  pointed at by terminal_dependencies_offset
++	 *  Value must be set to the corresponding value from the manifest entry for this program.
++	 *  @see ia_css_program_manifest_get_terminal_dependency_count()
++	 */
++	uint8_t terminal_dependency_count;
++#if (N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)
++	/** Padding bytes for 64bit alignment*/
++	uint8_t padding[N_PADDING_UINT8_IN_PROCESS_STRUCT];
++#endif /*(N_PADDING_UINT8_IN_PROCESS_STRUCT > 0)*/
++};
++
++#endif /* __IA_CSS_PSYS_PROCESS_PRIVATE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
+new file mode 100644
+index 000000000000..d8f2ac4ebafc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_process_types.h
+@@ -0,0 +1,98 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROCESS_TYPES_H
++#define __IA_CSS_PSYS_PROCESS_TYPES_H
++
++/*! \file */
++
++/** @file ia_css_psys_process_types.h
++ *
++ * The types belonging to the terminal/process/process group dynamic module
++ */
++
++#include <type_support.h>
++#include <vied_nci_psys_system_global.h>
++
++#include <ia_css_psys_manifest_types.h>
++
++#define IA_CSS_PROCESS_INVALID_PROGRAM_IDX  ((uint32_t)-1)
++
++/* private */
++typedef enum ia_css_process_group_cmd {
++	IA_CSS_PROCESS_GROUP_CMD_NOP = 0,
++	IA_CSS_PROCESS_GROUP_CMD_SUBMIT,
++	IA_CSS_PROCESS_GROUP_CMD_ATTACH,
++	IA_CSS_PROCESS_GROUP_CMD_DETACH,
++	IA_CSS_PROCESS_GROUP_CMD_START,
++	IA_CSS_PROCESS_GROUP_CMD_DISOWN,
++	IA_CSS_PROCESS_GROUP_CMD_RUN,
++	IA_CSS_PROCESS_GROUP_CMD_STOP,
++	IA_CSS_PROCESS_GROUP_CMD_SUSPEND,
++	IA_CSS_PROCESS_GROUP_CMD_RESUME,
++	IA_CSS_PROCESS_GROUP_CMD_ABORT,
++	IA_CSS_PROCESS_GROUP_CMD_RESET,
++	IA_CSS_N_PROCESS_GROUP_CMDS
++} ia_css_process_group_cmd_t;
++
++/* private */
++#define IA_CSS_PROCESS_GROUP_STATE_BITS	32
++typedef enum ia_css_process_group_state {
++	IA_CSS_PROCESS_GROUP_ERROR = 0,
++	IA_CSS_PROCESS_GROUP_CREATED,
++	IA_CSS_PROCESS_GROUP_READY,
++	IA_CSS_PROCESS_GROUP_BLOCKED,
++	IA_CSS_PROCESS_GROUP_STARTED,
++	IA_CSS_PROCESS_GROUP_RUNNING,
++	IA_CSS_PROCESS_GROUP_STALLED,
++	IA_CSS_PROCESS_GROUP_STOPPED,
++	IA_CSS_N_PROCESS_GROUP_STATES
++} ia_css_process_group_state_t;
++
++/* private */
++typedef enum ia_css_process_cmd {
++	IA_CSS_PROCESS_CMD_NOP = 0,
++	IA_CSS_PROCESS_CMD_ACQUIRE,
++	IA_CSS_PROCESS_CMD_RELEASE,
++	IA_CSS_PROCESS_CMD_START,
++	IA_CSS_PROCESS_CMD_LOAD,
++	IA_CSS_PROCESS_CMD_STOP,
++	IA_CSS_PROCESS_CMD_SUSPEND,
++	IA_CSS_PROCESS_CMD_RESUME,
++	IA_CSS_N_PROCESS_CMDS
++} ia_css_process_cmd_t;
++
++/* private */
++#define IA_CSS_PROCESS_STATE_BITS	8
++typedef enum ia_css_process_state {
++	IA_CSS_PROCESS_ERROR = 0,
++	IA_CSS_PROCESS_CREATED,
++	IA_CSS_PROCESS_READY,
++	IA_CSS_PROCESS_STARTED,
++	IA_CSS_PROCESS_RUNNING,
++	IA_CSS_PROCESS_STOPPED,
++	IA_CSS_PROCESS_SUSPENDED,
++	IA_CSS_N_PROCESS_STATES
++} ia_css_process_state_t;
++
++/* public */
++typedef struct ia_css_process_group_s	ia_css_process_group_t;
++typedef struct ia_css_process_s		ia_css_process_t;
++typedef struct ia_css_process_ext_s	ia_css_process_ext_t;
++
++typedef struct ia_css_data_terminal_s	ia_css_data_terminal_t;
++
++#endif /* __IA_CSS_PSYS_PROCESS_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
+new file mode 100644
+index 000000000000..4657c82bba05
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.h
+@@ -0,0 +1,320 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H
++
++#include "ia_css_psys_static_storage_class.h"
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.h
++ *
++ * Define the methods on the program group manifest object that are not part of
++ * a single interface.
++ *
++ * Set functions in this file are for not for production use by the
++ * users (testing/simulation only).
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>			/* uint8_t */
++
++#include <ia_css_psys_program_group_manifest.sim.h>
++
++#include <ia_css_psys_program_group_manifest.hsys.user.h>
++
++#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_rbm_manifest_types.h"
++
++#define IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT		((uint8_t)(-1))
++
++/*! Get the stored size of the program group manifest object
++
++ @param	manifest[in]			program group manifest object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_program_group_manifest_get_size(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the program group ID of the program group manifest object
++
++ @param	manifest[in]			program group manifest object
++
++ @return program group ID, IA_CSS_PROGRAM_GROUP_INVALID_ID on invalid argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_ID_t
++ia_css_program_group_manifest_get_program_group_ID(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the program group ID of the program group manifest object
++
++ @param	manifest[in]			program group manifest object
++
++ @param program group ID
++
++ @return 0 on success, -1 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_program_group_manifest_set_program_group_ID(
++	ia_css_program_group_manifest_t *manifest,
++	ia_css_program_group_ID_t id);
++
++/*! Get the storage alignment constraint of the program group binary data
++
++ @param	manifest[in]			program group manifest object
++
++ @return alignment, IA_CSS_PROGRAM_GROUP_INVALID_ALIGNMENT on invalid manifest
++	argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_alignment(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the storage alignment constraint of the program group binary data
++
++ @param	manifest[in]			program group manifest object
++ @param	alignment[in]			alignment desired
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_program_group_manifest_set_alignment(
++	ia_css_program_group_manifest_t *manifest,
++	const uint8_t alignment);
++
++/*! Get the kernel enable bitmap of the program group
++
++ @param	manifest[in]			program group manifest object
++
++ @return bitmap, 0 on invalid manifest argument
++ */
++extern ia_css_kernel_bitmap_t
++ia_css_program_group_manifest_get_kernel_bitmap(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Set the kernel enable bitmap of the program group
++
++ @param	manifest[in]			program group manifest object
++ @param	kernel bitmap[in]		kernel enable bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_group_manifest_set_kernel_bitmap(
++	ia_css_program_group_manifest_t *manifest,
++	const ia_css_kernel_bitmap_t bitmap);
++
++/*! Get the number of programs in the program group manifest object
++
++ @param	manifest[in]			program group manifest object
++
++ @return program count, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_program_count(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the number of terminals in the program group manifest object
++
++ @param	manifest[in]			program group manifest object
++
++ @return terminal count, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_group_manifest_get_terminal_count(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) private data blob in the manifest
++
++  Private data is used by FW and is opauque to the SW stack
++
++ @param	manifest[in]			program group manifest object
++
++ @return private data blob, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++void *ia_css_program_group_manifest_get_private_data(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) routing bitmap (rbm) manifest
++
++ @param	manifest[in]			program group manifest object
++
++ @return rbm manifest, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_rbm_manifest_t *
++ia_css_program_group_manifest_get_rbm_manifest(
++	const ia_css_program_group_manifest_t *manifest);
++
++/*! Get the (pointer to) indexed program manifest in the program group manifest
++ * object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the program manifest object
++
++ @return program manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_manifest_t *
++ia_css_program_group_manifest_get_prgrm_mnfst(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int program_index);
++
++/*! Get the (pointer to) indexed terminal manifest in the program group
++ * manifest object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the terminal manifest object
++
++ @return terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_manifest_t *
++ia_css_program_group_manifest_get_term_mnfst(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed data terminal manifest in the program group
++ * manifest object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the terminal manifest object
++
++ @return data terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_data_terminal_manifest_t *
++ia_css_program_group_manifest_get_data_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed parameter terminal manifest in the program
++ * group manifest object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the terminal manifest object
++
++ @return parameter terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed spatial param terminal manifest in the program
++ * group manifest object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the terminal manifest object
++
++ @return spatial param terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_spatial_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed sliced param terminal manifest in the program
++ * group manifest object
++
++ @param	manifest[in]			program group manifest object
++ @param	program_index[in]		index of the terminal manifest object
++
++ @return sliced param terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_sliced_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*! Get the (pointer to) indexed program terminal manifest in the program group
++ * manifest object
++
++ @parammanifest[in]program group manifest object
++ @paramprogram_index[in]index of the terminal manifest object
++
++ @return program terminal manifest, NULL on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_terminal_manifest_t *
++ia_css_program_group_manifest_get_program_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index);
++
++/*!	initialize program group manifest
++
++ @param	manifest[in]		program group manifest object
++ @param	program_count[in]	number of programs.
++ @param	terminal_count[in]	number of terminals.
++ @param program_needs_extension[in] Array[program count]
++ @param	program_deps[in]	program dependencies for programs in pg.
++ @param	terminal_deps[in]	terminal dependencies for programs in pg.
++ @param	terminal_type[in]	array of terminal types, binary specific
++				static frame data
++ @param	cached_in_param_section_count[in]Number of parameter terminal sections
++ @param cached_out_param_section_count[in]	Number of parameter out terminal
++ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
++						with sections per cached out
++						terminal
++ @param sliced_in_param_section_count[in]	Array[sliced_in_terminal_count]
++						with sections per sliced in
++						terminal
++ @param sliced_out_param_section_count[in]	Array[sliced_out_terminal_count]
++						with sections per sliced out
++						terminal
++ @param	fragment_param_section_count[in]	Number of fragment parameter
++						sections of the program init
++						terminal,
++ @param	kernel_fragment_seq_count[in]		Number of kernel fragment
++						seqence info.
++ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
++						sections (size of array is program_count)
++ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
++						sections (size of array is program_count)
++ @return none;
++ */
++extern void ia_css_program_group_manifest_init(
++	ia_css_program_group_manifest_t *blob,
++	const uint8_t program_count,
++	const uint8_t terminal_count,
++	const uint8_t *program_needs_extension,
++	const uint8_t *program_dependencies,
++	const uint8_t *terminal_dependencies,
++	const ia_css_terminal_type_t *terminal_type,
++	const uint16_t *cached_in_param_section_count,
++	const uint16_t *cached_out_param_section_count,
++	const uint16_t *spatial_param_section_count,
++	const uint16_t *fragment_param_section_count,
++	const uint16_t *sliced_in_param_section_count,
++	const uint16_t *sliced_out_param_section_count,
++	const uint16_t *kernel_fragment_seq_count,
++	const uint16_t *progctrlinit_load_section_counts,
++	const uint16_t *progctrlinit_connect_section_counts);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_group_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..787a4f67f4de
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.hsys.user.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.hsys.user.h
++ *
++ * Define the methods on the program group manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>	/* bool */
++
++/*! Print the program group manifest object to file/stream
++    in textual format
++
++ @param	manifest[in]		program group manifest object
++ @param	fid[out]		file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_manifest_print(
++	const ia_css_program_group_manifest_t *manifest,
++	void *fid);
++
++/*! Read the program group manifest object from file/stream
++  in binary format.
++
++ @see ia_css_program_group_manifest_write()
++
++ @param	fid[in]			file/stream handle
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_read(
++	void *fid);
++
++/*! Write the program group manifest object to file/stream
++  in binary format
++
++ @see ia_css_program_group_manifest_read()
++
++ @param	manifest[in]		program group manifest object
++ @param	fid[out]		file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_group_manifest_write(
++	const ia_css_program_group_manifest_t *manifest,
++	void *fid);
++
++/*! Boolean test if the program group manifest is valid
++
++ @param	manifest[in]		program group manifest
++
++ @return true if program group manifest is correct, false on error
++ */
++extern bool ia_css_is_program_group_manifest_valid(
++	const ia_css_program_group_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
+new file mode 100644
+index 000000000000..997755e3e842
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest.sim.h
+@@ -0,0 +1,131 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_group_manifest.sim.h
++ *
++ * Define the methods on the program group manifest object: Simulation only
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>	/* uint8_t */
++#include "ia_css_terminal_defs.h"
++
++/*! Create a program group manifest object from specification
++
++ @param	specification[in]		specification (index)
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
++	const unsigned int specification);
++
++/*! Destroy the program group manifest object
++
++ @param	manifest[in]			program group manifest
++
++ @return NULL
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
++	ia_css_program_group_manifest_t			*manifest);
++
++/*! Compute the size of storage required for allocating
++ * the program group (PG) manifest object
++
++ @param	program_count[in]			Number of programs in the PG
++ @param	terminal_count[in]			Number of terminals on the PG
++ @param program_needs_extension[in]		Array[program count]
++ @param	program_dependency_count[in]		Array[program_count] with the PG
++ @param	terminal_dependency_count[in]		Array[program_count] with the
++						terminal dependencies
++ @param	terminal_type[in]			Array[terminal_count] with the
++						terminal type
++ @param	cached_in_param_section_count[in]	Number of parameter
++						in terminal sections
++ @param	cached_out_param_section_count[in]	Number of parameter
++						out terminal sections
++ @param	sliced_param_section_count[in]		Array[sliced_terminal_count]
++						with sections per
++						sliced in terminal
++ @param	sliced_out_param_section_count[in]	Array[sliced_terminal_count]
++						with sections per
++						sliced out terminal
++ @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
++						with sections per
++						spatial terminal
++ @param	fragment_param_section_count[in]	Number of fragment parameter
++						sections of the
++						program init terminal,
++ @param	kernel_fragment_seq_count[in]		Number of
++						kernel_fragment_seq_count.
++ @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
++						sections (size of array is program_count)
++ @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
++						sections (size of array is program_count)
++ @return 0 on error
++ */
++size_t ia_css_sizeof_program_group_manifest(
++	const uint8_t			program_count,
++	const uint8_t			terminal_count,
++	const uint8_t			*program_needs_extension,
++	const uint8_t			*program_dependency_count,
++	const uint8_t			*terminal_dependency_count,
++	const ia_css_terminal_type_t	*terminal_type,
++	const uint16_t			*cached_in_param_section_count,
++	const uint16_t			*cached_out_param_section_count,
++	const uint16_t			*spatial_param_section_count,
++	const uint16_t			*fragment_param_section_count,
++	const uint16_t			*sliced_param_section_count,
++	const uint16_t			*sliced_out_param_section_count,
++	const uint16_t			*kernel_fragment_seq_count,
++	const uint16_t			*progctrlinit_load_section_counts,
++	const uint16_t			*progctrlinit_connect_section_counts);
++
++/*! Create (the storage for) the program group manifest object
++
++ @param	program_count[in]		Number of programs in the program group
++ @param	terminal_count[in]		Number of terminals on the program group
++ @param	program_dependency_count[in]	Array[program_count] with the
++					program dependencies
++ @param	terminal_dependency_count[in]	Array[program_count] with the
++					terminal dependencies
++ @param	terminal_type[in]		Array[terminal_count] with the
++					terminal type
++
++ @return NULL on error
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
++	const uint8_t			program_count,
++	const uint8_t			terminal_count,
++	const uint8_t			*program_dependency_count,
++	const uint8_t			*terminal_dependency_count,
++	const ia_css_terminal_type_t	*terminal_type);
++
++/*! Free (the storage of) the program group manifest object
++
++ @param	manifest[in]			program group manifest
++
++ @return NULL
++ */
++extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
++	ia_css_program_group_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
+new file mode 100644
+index 000000000000..d37e5caa2611
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_manifest_impl.h
+@@ -0,0 +1,417 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H
++
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_terminal_manifest.h>
++#include <ia_css_kernel_bitmap.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_psys_private_pg_data.h"
++#include <vied_nci_psys_system_global.h>	/* Safer bit mask functions */
++#include "ia_css_psys_static_trace.h"
++#include "ia_css_rbm_manifest_types.h"
++#include <error_support.h>
++#include <assert_support.h>
++#include <misc_support.h>
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_program_group_manifest_get_size(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	size_t size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_size(): enter:\n");
++
++	if (manifest != NULL) {
++		size = manifest->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_size invalid argument\n");
++	}
++	return size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_ID_t
++ia_css_program_group_manifest_get_program_group_ID(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	ia_css_program_group_ID_t id = IA_CSS_PROGRAM_GROUP_INVALID_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_program_group_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		id = manifest->ID;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_program_group_ID invalid argument\n");
++	}
++	return id;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_program_group_manifest_set_program_group_ID(
++	ia_css_program_group_manifest_t *manifest,
++	ia_css_program_group_ID_t id)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_set_program_group_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->ID = id;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_set_program_group_ID invalid argument\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_program_group_manifest_set_alignment(
++	ia_css_program_group_manifest_t *manifest,
++	const uint8_t alignment)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_set_alignment(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->alignment = alignment;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_set_alignment invalid argument\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_alignment(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	uint8_t alignment = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_alignment(): enter:\n");
++
++	if (manifest != NULL) {
++		alignment = manifest->alignment;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_alignment invalid argument\n");
++	}
++	return alignment;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++void *ia_css_program_group_manifest_get_private_data(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	void *private_data = NULL;
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_private_data(%p): enter:\n",
++		manifest);
++
++	verifexit(manifest != NULL);
++
++	private_data = (void *)((const char *)manifest +
++				manifest->private_data_offset);
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_private_data invalid argument\n");
++	}
++	return private_data;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_rbm_manifest_t *ia_css_program_group_manifest_get_rbm_manifest(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	ia_css_rbm_manifest_t *rbm_manifest = NULL;
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_rbm_manifest(%p): enter:\n",
++		manifest);
++
++	verifexit(manifest != NULL);
++
++	rbm_manifest = (ia_css_rbm_manifest_t *)((const char *)manifest +
++				manifest->rbm_manifest_offset);
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_rbm_manifest invalid argument\n");
++	}
++	return rbm_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_manifest_t *
++ia_css_program_group_manifest_get_prgrm_mnfst(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int program_index)
++{
++	ia_css_program_manifest_t *prg_manifest_base;
++	uint8_t *program_manifest = NULL;
++	uint8_t program_count;
++	unsigned int i;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_prgrm_mnfst(%p,%d): enter:\n",
++		manifest, program_index);
++
++	program_count =
++		ia_css_program_group_manifest_get_program_count(manifest);
++
++	verifexit(manifest != NULL);
++	verifexit(program_index < program_count);
++
++	prg_manifest_base = (ia_css_program_manifest_t *)((char *)manifest +
++		manifest->program_manifest_offset);
++	if (program_index < program_count) {
++		program_manifest = (uint8_t *)prg_manifest_base;
++		for (i = 0; i < program_index; i++) {
++			program_manifest += ((ia_css_program_manifest_t *)
++					program_manifest)->size;
++		}
++	}
++
++EXIT:
++	if (NULL == manifest || program_index >= program_count) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_prgrm_mnfst invalid argument\n");
++	}
++	return (ia_css_program_manifest_t *)program_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_data_terminal_manifest_t *
++ia_css_program_group_manifest_get_data_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_data_terminal_manifest_t *data_terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_data_terminal_manifest(%p, %d): enter:\n",
++		manifest, (int)terminal_index);
++
++	terminal_manifest =
++		ia_css_program_group_manifest_get_term_mnfst(manifest,
++			terminal_index);
++
++	verifexit(ia_css_is_terminal_manifest_data_terminal(terminal_manifest));
++
++	data_terminal_manifest =
++		(ia_css_data_terminal_manifest_t *)terminal_manifest;
++EXIT:
++	return data_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_param_terminal_manifest_t *param_terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_param_terminal_manifest(%p, %d): enter:\n",
++		manifest, (int)terminal_index);
++
++	terminal_manifest =
++		ia_css_program_group_manifest_get_term_mnfst(manifest,
++			terminal_index);
++
++	verifexit(ia_css_is_terminal_manifest_parameter_terminal(
++			terminal_manifest));
++	param_terminal_manifest =
++		(ia_css_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++	return param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_spatial_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_spatial_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_spatial_param_terminal_manifest_t *
++		spatial_param_terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_spatial_param_terminal_manifest(%p, %d): enter:\n",
++		manifest, (int)terminal_index);
++
++	terminal_manifest =
++		ia_css_program_group_manifest_get_term_mnfst(manifest,
++			terminal_index);
++
++	verifexit(ia_css_is_terminal_manifest_spatial_parameter_terminal(
++			terminal_manifest));
++
++	spatial_param_terminal_manifest =
++		(ia_css_spatial_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++	return spatial_param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_sliced_param_terminal_manifest_t *
++ia_css_program_group_manifest_get_sliced_param_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_sliced_param_terminal_manifest_t *
++		sliced_param_terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_sliced_param_terminal_manifest(%p, %d): enter:\n",
++		manifest, (int)terminal_index);
++
++	terminal_manifest =
++		ia_css_program_group_manifest_get_term_mnfst(manifest,
++			terminal_index);
++
++	verifexit(ia_css_is_terminal_manifest_sliced_terminal(
++			terminal_manifest));
++
++	sliced_param_terminal_manifest =
++		(ia_css_sliced_param_terminal_manifest_t *)terminal_manifest;
++EXIT:
++	return sliced_param_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_terminal_manifest_t *
++ia_css_program_group_manifest_get_program_terminal_manifest(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_program_terminal_manifest_t *program_terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_program_terminal_manifest(%p, %d): enter:\n",
++		manifest, (int)terminal_index);
++
++	terminal_manifest =
++		ia_css_program_group_manifest_get_term_mnfst(manifest,
++			terminal_index);
++
++	verifexit(ia_css_is_terminal_manifest_program_terminal(
++			terminal_manifest));
++
++	program_terminal_manifest =
++		(ia_css_program_terminal_manifest_t *)terminal_manifest;
++ EXIT:
++	return program_terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_manifest_t *
++ia_css_program_group_manifest_get_term_mnfst(
++	const ia_css_program_group_manifest_t *manifest,
++	const unsigned int terminal_index)
++{
++	ia_css_terminal_manifest_t *terminal_manifest = NULL;
++	ia_css_terminal_manifest_t *terminal_manifest_base;
++	uint8_t terminal_count;
++	uint8_t i = 0;
++	uint32_t offset;
++
++	IA_CSS_TRACE_2(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_term_mnfst(%p,%d): enter:\n",
++		manifest, (int)terminal_index);
++
++	verifexit(manifest != NULL);
++
++	terminal_count =
++		ia_css_program_group_manifest_get_terminal_count(manifest);
++
++	verifexit(terminal_index < terminal_count);
++
++	terminal_manifest_base =
++		(ia_css_terminal_manifest_t *)((char *)manifest +
++		manifest->terminal_manifest_offset);
++	terminal_manifest = terminal_manifest_base;
++	while (i < terminal_index) {
++		offset =
++		(uint32_t)ia_css_terminal_manifest_get_size(terminal_manifest);
++		terminal_manifest = (ia_css_terminal_manifest_t *)
++				((char *)terminal_manifest + offset);
++		i++;
++	}
++EXIT:
++	return terminal_manifest;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_program_count(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	uint8_t program_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_program_count(): enter:\n");
++
++	if (manifest != NULL) {
++		program_count = manifest->program_count;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_program_count invalid argument\n");
++	}
++	return program_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_group_manifest_get_terminal_count(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	uint8_t terminal_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_terminal_count(): enter:\n");
++
++	if (manifest != NULL) {
++		terminal_count = manifest->terminal_count;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_terminal_count invalid argument\n");
++	}
++	return terminal_count;
++}
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
+new file mode 100644
+index 000000000000..482a5c994bd0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_group_private.h
+@@ -0,0 +1,278 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
++#define __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H
++
++#include "ia_css_psys_manifest_types.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_kernel_bitmap.h"
++#include "ia_css_program_group_data.h"
++#include "vied_nci_psys_resource_model.h"
++#include "ia_css_rbm_manifest_types.h"
++#include <type_support.h>
++#include <math_support.h>
++#include <platform_support.h>
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS \
++	((IA_CSS_KERNEL_BITMAP_BITS) \
++	+ (IA_CSS_PROGRAM_GROUP_ID_BITS) \
++	+ (5 * IA_CSS_UINT16_T_BITS) \
++	+ (5 * IA_CSS_UINT8_T_BITS) \
++	+ (5 * IA_CSS_UINT8_T_BITS))
++
++/** @brief Meta-data for a program group
++ *
++ * Describes the contents and layout of the program group
++ * components in memory.
++ *
++ * Offsets are relative to the base address of the program group
++ * manifest object.
++ */
++struct ia_css_program_group_manifest_s {
++	/** Indicate kernels are present in this program group */
++	ia_css_kernel_bitmap_t kernel_bitmap;
++	/** Referral ID to program group FW */
++	ia_css_program_group_ID_t ID;
++	/** Offset to program manifest list.  One entry for each program. */
++	uint16_t program_manifest_offset;
++	/** Offset to terminal manifest list.  One entry for each terminal. */
++	uint16_t terminal_manifest_offset;
++	/** Offset to private data (not part of the official API) */
++	uint16_t private_data_offset;
++	/** Offset to RBM manifest */
++	uint16_t rbm_manifest_offset;
++	/** Size of this structure */
++	uint16_t size;
++	/** Storage alignment requirement (in uint8_t) */
++	uint8_t alignment;
++	/** Total number of kernels in this program group */
++	uint8_t kernel_count;
++	/** Total number of program in this program group */
++	uint8_t program_count;
++	/** Total number of terminals on this program group */
++	uint8_t terminal_count;
++	/** Total number of independent subgraphs in this program group */
++	uint8_t subgraph_count;
++	/** Padding; esnures that rbm_manifest starts on 64bit alignment */
++	uint8_t reserved[5];
++};
++
++#define SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES \
++	((VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++	+ (VIED_NCI_RESOURCE_BITMAP_BITS * VIED_NCI_N_DEV_DFM_ID) \
++	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DATA_MEM_TYPE_ID * 2) \
++	+ (VIED_NCI_RESOURCE_SIZE_BITS * VIED_NCI_N_DEV_CHN_ID * 2) \
++	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_INPUT_DEC_RESOURCES) \
++	+ (2 * IA_CSS_UINT8_T_BITS * IA_CSS_MAX_OUTPUT_DEC_RESOURCES) \
++	+ (IA_CSS_UINT8_T_BITS * VIED_NCI_N_DEV_DFM_ID) + \
++	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT * IA_CSS_UINT8_T_BITS))
++
++/** "Extended" meta-data for a single program
++ *
++ * Mostly, if not completely, internal to FW and of no interest to the SW stack.
++ */
++struct ia_css_program_manifest_ext_s {
++#if VIED_NCI_N_DEV_DFM_ID > 0
++	/** DFM port allocation of this program */
++	vied_nci_resource_bitmap_t dfm_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++	/** Active DFM ports which need a kick
++	 * If an empty port is configured to run in active mode, the empty
++	 * port and the corresponding full port(s) in the stream must be kicked.
++	 * The empty port must always be kicked after the full port.
++	 */
++	vied_nci_resource_bitmap_t dfm_active_port_bitmap[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if VIED_NCI_N_DATA_MEM_TYPE_ID > 0
++	/** (external) Memory allocation size needs of this program */
++	vied_nci_resource_size_t ext_mem_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
++	vied_nci_resource_size_t ext_mem_offset[VIED_NCI_N_DATA_MEM_TYPE_ID];
++#endif
++#if VIED_NCI_N_DEV_CHN_ID > 0
++	/** Device channel allocation size needs of this program */
++	vied_nci_resource_size_t dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
++	vied_nci_resource_size_t dev_chn_offset[VIED_NCI_N_DEV_CHN_ID];
++#endif
++#if VIED_NCI_N_DEV_DFM_ID > 0
++	/** DFM ports are relocatable if value is set to 1.
++	 * The flag is per dfm port type.
++	 * This will not be supported for now.
++	 */
++	uint8_t is_dfm_relocatable[VIED_NCI_N_DEV_DFM_ID];
++#endif
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++	/** DEC compression flush service entry, describing which streams
++	 *  require flush service handling for decompression (input).
++	 *  @note stream ID's are the ID's used by the MMU
++	 */
++	uint8_t dec_resources_input[IA_CSS_MAX_INPUT_DEC_RESOURCES];
++	/** Association of streams in dec_resources_input with the terminal
++	 *  they belong to.
++	 */
++	uint8_t dec_resources_input_terminal[IA_CSS_MAX_INPUT_DEC_RESOURCES];
++#endif
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++	/** DEC compression flush service entry, describing which streams
++	 *  require flush service handling for compression (output).
++	 *  @note stream ID's are the ID's used by the MMU
++	 */
++	uint8_t dec_resources_output[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
++	/** Association of streams in dec_resources_output with the terminal
++	 *  they belong to.
++	 */
++	uint8_t dec_resources_output_terminal[IA_CSS_MAX_OUTPUT_DEC_RESOURCES];
++#endif
++/** Padding bytes for 32bit alignment*/
++#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT > 0
++	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT];
++#endif
++};
++
++#define SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS \
++	(IA_CSS_KERNEL_BITMAP_BITS \
++	+ IA_CSS_PROGRAM_ID_BITS \
++	+ IA_CSS_PROGRAM_TYPE_BITS \
++	+ (1 * IA_CSS_UINT16_T_BITS) \
++	+ (IA_CSS_PROCESS_MAX_CELLS * VIED_NCI_RESOURCE_ID_BITS) \
++	+ (VIED_NCI_RESOURCE_ID_BITS) \
++	+ (6 * IA_CSS_UINT8_T_BITS) \
++	+ (N_PADDING_UINT8_IN_PROGRAM_MANIFEST * IA_CSS_UINT8_T_BITS))
++
++/** Meta-data for a single program
++ *
++ * This structure contains only the information required for resource
++ * management and construction of the process group.
++ */
++struct ia_css_program_manifest_s {
++	/** Indicate which kernels lead to this program being used */
++	ia_css_kernel_bitmap_t kernel_bitmap;
++	/** offset to add to reach parent. This is negative value.*/
++	int16_t parent_offset;
++	uint8_t program_dependency_offset;
++	uint8_t terminal_dependency_offset;
++	/** Size of this structure */
++	uint8_t size;
++	/** offset to ia_css_program_manifest_ext_s, 0 if there is none */
++	uint8_t program_extension_offset;
++	/** Specification of for exclusive or parallel programs */
++	uint8_t program_type; /* ia_css_program_type_t */
++	/** Referral ID to a specific program FW, valid ID's != 0 */
++	ia_css_program_ID_t ID;
++	/** Array of all the cells this program needs */
++	vied_nci_resource_id_t cells[IA_CSS_PROCESS_MAX_CELLS];
++	/** (exclusive) indication of a cell type to be used by this program */
++	vied_nci_resource_id_t cell_type_id;
++	/** Number of programs this program depends on */
++	uint8_t program_dependency_count;
++	/** Number of terminals this program depends on */
++	uint8_t terminal_dependency_count;
++	/** Padding bytes for 32bit alignment*/
++#if N_PADDING_UINT8_IN_PROGRAM_MANIFEST > 0
++	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_MANIFEST];
++#endif
++};
++
++/*
++ *Calculation for manual size check for struct ia_css_data_terminal_manifest_s
++ */
++#define SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	+ IA_CSS_FRAME_FORMAT_BITMAP_BITS \
++	+ IA_CSS_CONNECTION_BITMAP_BITS \
++	+ IA_CSS_KERNEL_BITMAP_BITS \
++	+ (4 * (IA_CSS_UINT16_T_BITS * IA_CSS_N_DATA_DIMENSION)) \
++	+ IA_CSS_UINT16_T_BITS \
++	+ IA_CSS_UINT8_T_BITS \
++	+ (4*IA_CSS_UINT8_T_BITS))
++
++/** Meta-data specific for a data terminal
++ *
++ * Contains mostly capability and constraints information
++ */
++struct ia_css_data_terminal_manifest_s {
++	/** Data terminal base */
++	ia_css_terminal_manifest_t base;
++	/** Supported (4CC / MIPI / parameter) formats */
++	ia_css_frame_format_bitmap_t frame_format_bitmap;
++	/** Indicate which kernels lead to this terminal being used */
++	ia_css_kernel_bitmap_t kernel_bitmap;
++	/** Minimum size of the frame */
++	uint16_t min_size[IA_CSS_N_DATA_DIMENSION];
++	/** Maximum size of the frame */
++	uint16_t max_size[IA_CSS_N_DATA_DIMENSION];
++	/** Minimum size of a fragment that the program port can accept */
++	uint16_t min_fragment_size[IA_CSS_N_DATA_DIMENSION];
++	/** Maximum size of a fragment that the program port can accept */
++	uint16_t max_fragment_size[IA_CSS_N_DATA_DIMENSION];
++	/** Indicate if this terminal is derived from a principal terminal
++	 *  @note Can't find meaningful use of this field. */
++	uint16_t terminal_dependency;
++	/** Indicate what (streaming) interface types this terminal supports */
++	ia_css_connection_bitmap_t connection_bitmap;
++	/** Indicates if compression is supported on the data associated with
++	 * this terminal. '1' indicates compression is supported,
++	 * '0' otherwise
++	 */
++	uint8_t compression_support;
++	uint8_t reserved[4];
++};
++
++/* ============  Program Control Init Terminal Manifest - START ============ */
++#define N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT 4
++struct ia_css_program_control_init_manifest_program_desc_s {
++	uint16_t load_section_count;
++	uint16_t connect_section_count;
++	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_MANIFEST_PROGRAM_DESC_STRUCT];
++};
++
++#define N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT 2
++/** Meta-data specific for a program control init terminal
++ *
++ * Program control init terminals have parameters related
++ * to system device (i.e. non-algorithmic devices, like DMA's)
++ * configuration.
++ */
++struct ia_css_program_control_init_terminal_manifest_s {
++	ia_css_terminal_manifest_t base;
++	/** Number of programs in program group.  This terminal can contain
++	 * parameters for each program.  Also size of the array at program_desc_offset.
++	*/
++	uint32_t program_count;
++	/**
++	 * Points to array of ia_css_program_control_init_manifest_program_desc_t
++	 * with size program_count.  The descriptor describes the format of the
++	 * parameter payload, which is sent separately.
++	 */
++	uint16_t program_desc_offset;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_PROGCTRLINIT_TERMINAL_MANIFEST_STRUCT];
++};
++/* ============  Program Control Init Terminal Manifest - END ============ */
++
++extern void ia_css_program_manifest_init(
++	ia_css_program_manifest_t	*blob,
++	const uint8_t	program_needs_extension,
++	const uint8_t	program_dependency_count,
++	const uint8_t	terminal_dependency_count);
++
++/** @} */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_PRIVATE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
+new file mode 100644
+index 000000000000..778e387c5b73
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.h
+@@ -0,0 +1,679 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.h
++ *
++ * Define the methods on the program manifest object that are not part of a
++ * single interface.
++ *
++ * @note The "set" functions here are for testing simulation only.
++ * Real manifests are generated in advance and must be considered read-only from
++ * the production user's perspective.
++ */
++
++#include "ia_css_psys_static_storage_class.h"
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>			/* uint8_t */
++
++#include <ia_css_psys_program_manifest.sim.h>
++
++#include <ia_css_psys_program_manifest.hsys.user.h>
++
++#include <ia_css_kernel_bitmap.h>		/* ia_css_kernel_bitmap_t */
++
++/*
++ * Resources needs
++ */
++#include <ia_css_psys_program_manifest.hsys.kernel.h>
++
++#define IA_CSS_PROGRAM_INVALID_DEPENDENCY	((uint8_t)(-1))
++#define IA_CSS_PROGRAM_INVALID_DEC_CONFIG	((uint8_t)(-1))
++
++/** Retrieve extended manifest information generally not visible
++ *  to the SW stack
++ *
++ *  @see ia_css_program_manifest_ext_t
++ *  @note Function only to be used in FW
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program);
++
++/*! Check if the program manifest object specifies a fixed cell allocation
++
++ @param	manifest[in]			program manifest object
++
++ @return has_fixed_cell, false on invalid argument
++ */
++extern bool ia_css_has_program_manifest_fixed_cell(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the stored size of the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return size, 0 on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_program_manifest_get_size(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the program ID of the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program ID, IA_CSS_PROGRAM_INVALID_ID on invalid argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Set the program ID of the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @param program ID
++
++ @return 0 on success, -1 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_program_ID(
++	ia_css_program_manifest_t			*manifest,
++	ia_css_program_ID_t id);
++
++/*! Get the (pointer to) the program *group* manifest which contains
++ * this program manifest
++
++ @param	manifest[in]			program manifest object
++
++ @return the pointer to the parent, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Set the offset to the beginning of the program *group* manifest
++ * which contains this program manifest
++
++ @param	manifest[in]			program manifest object
++ @param	program_offset[in]		this program's offset from
++					program_group_manifest's base address.
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_parent_offset(
++	ia_css_program_manifest_t			*manifest,
++	int32_t program_offset);
++
++/*! Get the type of the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program type, limit value (IA_CSS_N_PROGRAM_TYPES) on invalid manifest
++	argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_type_t ia_css_program_manifest_get_type(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Set the type of the program manifest object
++
++ @param	manifest[in]			program manifest object
++ @param	program_type[in]		program type
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_type(
++	ia_css_program_manifest_t			*manifest,
++	const ia_css_program_type_t			program_type);
++
++/*! Set the cell id of the program manifest object
++
++ @param	manifest[in]			program manifest object
++ @param	program_cell_id[in]		program cell id
++
++ @return < 0 on invalid manifest argument
++  */
++extern int ia_css_program_manifest_set_cell_ID(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_cell_ID_t			cell_id);
++
++/*! Set the cell type of the program manifest object
++
++ @param	manifest[in]			program manifest object
++ @param	program_cell_type[in]		program cell type
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_program_manifest_set_cell_type_ID(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_cell_type_ID_t			cell_type_id);
++
++/*!
++ * Get input terminal id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ *
++ * @return registered terminal_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_input_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                   idx);
++
++/*!
++ * Get output terminal id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ *
++ * @return registered terminal_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_output_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                    idx);
++
++/*!
++ * Set output terminal id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ * @param	val[in]			value
++ *
++ */
++extern void ia_css_program_manifest_set_output_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	uint8_t                    idx,
++	uint8_t                    val);
++
++/*!
++ * Set input terminal id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ * @param	val[in]			value
++ *
++ */
++extern void ia_css_program_manifest_set_input_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	uint8_t                    idx,
++	uint8_t                    val);
++
++/*!
++ * Get compression input MMU stream id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ *
++ * @return registered stream_id for idx
++ */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_input_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                   idx);
++
++/*!
++ * Get compression output MMU stream id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ *
++ * @return registered stream_id for idx
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_output_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                    idx);
++
++/*!
++ * Set compression output MMU stream id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ * @param	val[in]			value
++ *
++ */
++extern void ia_css_program_manifest_set_output_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	uint8_t                    idx,
++	uint8_t                    val);
++
++/*!
++ * Set *compression* input MMU stream id [val] at [idx]
++ *
++ * @param	manifest[in]		program manifest object
++ * @param	idx[in]			index
++ * @param	val[in]			value
++ *
++ */
++extern void ia_css_program_manifest_set_input_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	uint8_t                    idx,
++	uint8_t                    val);
++
++/*! Set cells bitmap for the program
++
++ @param	manifest[in]			program manifest object
++ @param	bitmap[in]				bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_cells_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_resource_bitmap_t	bitmap);
++
++/*! Get cells bitmap for the program
++
++ @param	manifest[in]			program manifest object
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Set DFM port bitmap for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++ @param	bitmap[in]				bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_dfm_port_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id,
++	const vied_nci_resource_bitmap_t	bitmap);
++#if HAS_DFM
++/*! Get bitmap of DFM ports requested for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++
++ @return DFM port bitmap
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id);
++#endif
++
++/*! Set active DFM port specification bitmap for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++ @param	bitmap[in]				bitmap
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_dfm_active_port_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id,
++	const vied_nci_resource_bitmap_t	bitmap);
++
++#if HAS_DFM
++/*! Get active DFM port specification bitmap for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id);
++#endif
++
++/*! Set DFM device relocatability specification for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++ @param is_relocatable[in]		1 if dfm device ports are relocatable, 0 otherwise
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++extern int ia_css_program_manifest_set_is_dfm_relocatable(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id,
++	const uint8_t						is_relocatable);
++
++#if HAS_DFM
++/*! Get DFM device relocatability specification for the program
++
++ @param	manifest[in]			program manifest object
++ @param	dfm_type_id[in]			DFM resource type ID
++
++ @return 1 if dfm device ports are relocatable, 0 otherwise
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_dfm_id_t			dfm_type_id);
++#endif
++
++/*! Get the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type ID
++
++ @return 0 when not applicable and/or invalid arguments
++
++ @deprecated Implementation is trival (returns 0) and
++ no known users or known intention for future use.
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id);
++
++/*! Set the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type id
++ @param	int_mem_size[in]		internal memory size
++
++ @return < 0 on invalid arguments
++ @deprecated see ia_css_program_manifest_get_int_mem_size()
++ */
++extern int ia_css_program_manifest_set_int_mem_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			int_mem_size);
++
++/*! Get the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type ID
++
++ @return 0 when not applicable and/or invalid arguments
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id);
++
++/*! Set the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type id
++ @param	ext_mem_size[in]		external memory size
++
++ @return < 0 on invalid arguments
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++ */
++extern int ia_css_program_manifest_set_ext_mem_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			ext_mem_size);
++
++#if HAS_DFM
++/*! Get a device channel resource (size) specification
++
++ @param	manifest[in]			program manifest object
++ @param	dev_chn_id[in]			device channel ID
++
++ @return 0 when not applicable and/or invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t			dev_chn_id);
++#endif
++
++/*! Set a device channel resource (size) specification
++
++ @param	manifest[in]			program manifest object
++ @param	dev_chn_id[in]			device channel ID
++ @param	dev_chn_size[in]		device channel size
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_dev_chn_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t			dev_chn_id,
++	const vied_nci_resource_size_t			dev_chn_size);
++
++/*! Set a device channel resource (offset) specification
++
++ @param	manifest[in]			program manifest object
++ @param	dev_chn_id[in]			device channel ID
++ @param	dev_chn_offset[in]		device channel offset
++
++ @see ia_css_program_manifest_get_dev_chn_offset()
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_dev_chn_offset(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t			dev_chn_id,
++	const vied_nci_resource_size_t			dev_chn_offset);
++
++/*! Set the memory resource (offset) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type id
++ @param	ext_mem_offset[in]		external memory offset
++
++ @see ia_css_program_manifest_get_ext_mem_offset()
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_ext_mem_offset(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			ext_mem_offset);
++
++#if HAS_DFM
++/*! Get a device channel resource (offset) specification
++
++ Used to define a resource dependency on devices that support
++ parallel users via channel multiplexing within the device.
++
++ Channel resources can be "relocatable". That is, some channel
++ is required, but the exact channel is not important and
++ can be assigned at runtime.
++
++ Other channel resources are static "fixed" in advance.  Either
++ each channel is customized for a particular need such that
++ the exact channel needs to be specified.  Alternatively, there
++ are enough channels resources available for the worst case
++ system requirement such that the channels can be statically
++ assigned in advance "fixed" channels.
++
++ Both kinds of resource dependency specification are supported here.
++
++ @param	manifest[in]			program manifest object
++ @param	dev_chn_id[in]			device channel ID
++
++ @return Valid fixed offset (if value is greater or equal to 0) or
++  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
++  is relocatable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t				dev_chn_id);
++#endif
++
++/*! Get the memory resource (offset) specification for a memory
++ that does not belong to the cell where the program will be mapped.
++
++ Memory specified here is typically SRAM within IPU used for
++ intermediate storage during data transfer between processing
++ stages/main memory or as computation scratch space.
++
++ The offset specified essentially defines the location of the memory
++ within the memory device.  It can be fixed in advance (static allocation)
++ or left to the system to determine at runtime.
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type ID
++
++ @return Valid fixed offset (if value is greater or equal to 0) or
++  IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE if offset
++  is relocatable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id);
++
++/*! Get the kernel composition of the program manifest object
++
++  The collection of kernels described in the bitmap is defined
++  at the program group level. This function returns the subset
++  of kernels that are part of this program.
++ @param	manifest[in]			program manifest object
++
++ @return bitmap, 0 on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Set the kernel dependency of the program manifest object
++
++ @param	manifest[in]			program manifest object
++ @param	kernel_bitmap[in]		kernel composition bitmap
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_kernel_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const ia_css_kernel_bitmap_t			kernel_bitmap);
++
++/*! Get the number of programs this programs depends on from the program group
++ * manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program dependency count
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_program_dependency_count(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the index of the program which the programs at this index depends on
++    from the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program dependency,
++	IA_CSS_PROGRAM_INVALID_DEPENDENCY on invalid arguments
++	*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_program_dependency(
++	const ia_css_program_manifest_t			*manifest,
++	const unsigned int				index);
++
++/*! Set the index of the program which the programs at this index depends on
++    in the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program dependency
++ */
++extern int ia_css_program_manifest_set_program_dependency(
++	ia_css_program_manifest_t			*manifest,
++	const uint8_t					program_dependency,
++	const unsigned int				index);
++
++/*! Get the number of terminals this programs depends on from the program group
++ * manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return program dependency count
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_terminal_dependency_count(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the index of the terminal which the programs at this index depends on
++    from the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return terminal dependency, IA_CSS_PROGRAM_INVALID_DEPENDENCY on error
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++uint8_t ia_css_program_manifest_get_terminal_dependency(
++	const ia_css_program_manifest_t			*manifest,
++	const unsigned int				index);
++
++/*! Set the index of the terminal which the programs at this index depends on
++    in the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ @return < 0 on invalid arguments
++ */
++extern int ia_css_program_manifest_set_terminal_dependency(
++	ia_css_program_manifest_t			*manifest,
++	const uint8_t					terminal_dependency,
++	const unsigned int				index);
++
++/*! Check if the program manifest object specifies a subnode program
++
++ @param	manifest[in]			program manifest object
++
++ @return is_subnode, false on invalid argument
++ @deprecated for IPU7
++ */
++extern bool ia_css_is_program_manifest_subnode_program_type(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Check if the program manifest object specifies a supernode program
++
++ @param	manifest[in]			program manifest object
++
++ @return is_supernode, false on invalid argument
++ @deprecated for IPU7
++ */
++extern bool ia_css_is_program_manifest_supernode_program_type(
++	const ia_css_program_manifest_t			*manifest);
++/*! Check if the program manifest object specifies a singular program
++
++ @param	manifest[in]			program manifest object
++
++ @return is_singular, false on invalid argument
++ @deprecated for IPU7
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_program_manifest_singular_program_type(
++	const ia_css_program_manifest_t			*manifest);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
+new file mode 100644
+index 000000000000..25e7bdf40cdb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.kernel.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.hsys.kernel.h
++ *
++ * Define the methods on the program manifest object: Hsys kernel interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <vied_nci_psys_system_global.h>
++
++#include <type_support.h>					/* uint8_t */
++#include "ia_css_psys_static_storage_class.h"
++
++/*
++ * Resources needs
++ */
++
++/*! Get the cell ID from the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ Note: If the cell ID is specified, the program this manifest belongs to
++ must be mapped on that instance. If the cell ID is invalid (limit value)
++ then the cell type ID must be specified instead
++
++ @return cell ID, limit value if not specified
++ */
++extern
++vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the cell type ID from the program manifest object
++
++ @param	manifest[in]			program manifest object
++
++ Note: If the cell type ID is specified, the program this manifest belongs
++ to can be mapped on any instance of this clee type. If the cell type ID is
++ invalid (limit value) then a specific cell ID must be specified instead
++
++ @return cell ID, limit value if not specified
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
++	const ia_css_program_manifest_t			*manifest);
++
++/*! Get the memory resource (size) specification for a memory
++ that belongs to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id);
++
++/*! Get the memory resource (size) specification for a memory
++ that does not belong to the cell where the program will be mapped
++
++ @param	manifest[in]			program manifest object
++ @param	mem_type_id[in]			mem type ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id);
++
++#if HAS_DFM
++/*! Get a device channel resource (size) specification
++
++ @param	manifest[in]			program manifest object
++ @param	dev_chn_id[in]			device channel ID
++
++ @return 0 when not applicable
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++	const ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t				dev_chn_id);
++#endif
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_KERNEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..96a87f52fabb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.hsys.user.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.hsys.user.h
++ *
++ * Define the methods on the program manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++/*! Print the program manifest object to file/stream
++    in textual format
++
++ @param	manifest[in]			program manifest object
++ @param	fid[out]				file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_program_manifest_print(
++	const ia_css_program_manifest_t	*manifest,
++	void				*fid);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
+new file mode 100644
+index 000000000000..83000ad4eb97
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest.sim.h
+@@ -0,0 +1,65 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_program_manifest.sim.h
++ *
++ * Define the methods on the program manifest object: Simulation only
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>	/* uint8_t */
++
++/*! Compute the size of storage required for allocating
++ * the program manifest object
++
++ @param program_needs_extension[in]	==1 if program manifest needs an extension struct
++ @param	program_dependency_count[in]	Number of programs this one depends on
++ @param	terminal_dependency_count[in]	Number of terminals this one depends on
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_program_manifest(
++	const uint8_t	program_needs_extension,
++	const uint8_t	program_dependency_count,
++	const uint8_t	terminal_dependency_count);
++
++/*! Create (the storage for) the program manifest object
++
++ @param	program_dependency_count[in]	Number of programs this one depends on
++ @param	terminal_dependency_count[in]	Number of terminals this one depends on
++
++ @return NULL on error
++ */
++extern ia_css_program_manifest_t *ia_css_program_manifest_alloc(
++	const uint8_t	program_dependency_count,
++	const uint8_t	terminal_dependency_count);
++
++/*! Destroy (the storage of) the program manifest object
++
++ @param	manifest[in]			program manifest
++
++ @return NULL
++ */
++extern ia_css_program_manifest_t *ia_css_program_manifest_free(
++	ia_css_program_manifest_t *manifest);
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
+new file mode 100644
+index 000000000000..abbc0900d23e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_program_manifest_impl.h
+@@ -0,0 +1,577 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H
++
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
++#include <ia_css_kernel_bitmap.h>
++
++#include <vied_nci_psys_system_global.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_psys_static_trace.h"
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <storage_class.h>
++#include <math_support.h>
++
++/** Function only to be used in FW */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_manifest_ext_t *ia_css_program_manifest_get_extension(const ia_css_program_manifest_t *program)
++{
++	DECLARE_ERRVAL
++	verifexitval(program != NULL, EFAULT);
++	if (program->program_extension_offset != 0) {
++		return (ia_css_program_manifest_ext_t *)((uint8_t *)program + program->program_extension_offset);
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_manifest_get_extension invalid argument\n");
++	}
++	return NULL;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_int_mem_size(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_mem_type_ID_t     mem_type_id)
++{
++	(void)manifest;
++	(void)mem_type_id;
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++			"ia_css_program_manifest_get_int_mem_size always returns 0"
++			"(internally memory feature not used).\n");
++	return 0;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_input_terminal_id(
++	ia_css_program_manifest_t *manifest,
++	unsigned char              idx)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++EXIT:
++	if (!noerror()) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++	return manifest_ext->dec_resources_input_terminal[idx];
++#else
++	(void) idx;
++	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_output_terminal_id(
++	ia_css_program_manifest_t *manifest,
++	unsigned char              idx)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_output_terminal_id(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++EXIT:
++	if (!noerror()) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++	return manifest_ext->dec_resources_output_terminal[idx];
++#else
++	(void) idx;
++	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_input_stream_id(
++	ia_css_program_manifest_t  *manifest,
++	unsigned char               idx)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_input_stream_id(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++EXIT:
++	if (!noerror()) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++	return manifest_ext->dec_resources_input[idx];
++#else
++	(void) idx;
++	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_output_stream_id(
++	ia_css_program_manifest_t *manifest,
++	unsigned char              idx)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_output_stream_id(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++EXIT:
++	if (!noerror()) {
++		return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++	}
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++	return manifest_ext->dec_resources_output[idx];
++#else
++	(void) idx;
++	return IA_CSS_PROGRAM_INVALID_DEC_CONFIG;
++#endif
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_is_dfm_relocatable(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_dev_dfm_id_t      dfm_type_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_is_dfm_relocatable(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_is_dfm_relocatable invalid argument\n");
++		return 0;
++	}
++	return manifest_ext->is_dfm_relocatable[dfm_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_port_bitmap(
++	const ia_css_program_manifest_t  *manifest,
++	const vied_nci_dev_dfm_id_t       dfm_type_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_dfm_port_bitmap(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_dfm_port_bitmap invalid argument\n");
++		return 0;
++	}
++	return manifest_ext->dfm_port_bitmap[dfm_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_dfm_active_port_bitmap(
++	const ia_css_program_manifest_t  *manifest,
++	const vied_nci_dev_dfm_id_t       dfm_type_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_dfm_active_port_bitmap(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(dfm_type_id < VIED_NCI_N_DEV_DFM_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_dfm_active_port_bitmap invalid argument\n");
++		return 0;
++	}
++	return manifest_ext->dfm_active_port_bitmap[dfm_type_id];
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_size(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_mem_type_ID_t     mem_type_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_ext_mem_size(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_ext_mem_size invalid argument\n");
++		return 0;
++	}
++	return manifest_ext->ext_mem_size[mem_type_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_ext_mem_offset(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_mem_type_ID_t     mem_type_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_get_ext_mem_offset(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_ext_mem_offset invalid argument\n");
++		 return 0;
++	}
++	return manifest_ext->ext_mem_offset[mem_type_id];
++}
++
++#if HAS_DFM
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_size(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_dev_chn_ID_t      dev_chn_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_dev_chn_size(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_dev_chn_size invalid argument\n");
++		return 0;
++	}
++	return manifest_ext->dev_chn_size[dev_chn_id];
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_resource_size_t ia_css_program_manifest_get_dev_chn_offset(
++	const ia_css_program_manifest_t *manifest,
++	const vied_nci_dev_chn_ID_t      dev_chn_id)
++{
++	DECLARE_ERRVAL
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_dev_chn_offset(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(dev_chn_id < VIED_NCI_N_DEV_CHN_ID, EFAULT);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_dev_chn_offset invalid argument\n");
++		 return 0;
++	}
++	return manifest_ext->dev_chn_offset[dev_chn_id];
++}
++#endif /* HAS_DFM */
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_program_manifest_get_size(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_size(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_manifest_get_size invalid argument\n");
++		return 0;
++	}
++
++	return manifest->size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_ID_t ia_css_program_manifest_get_program_ID(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_program_ID(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_program_ID invalid argument\n");
++		return IA_CSS_PROGRAM_INVALID_ID;
++	}
++	return manifest->ID;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_manifest_t *ia_css_program_manifest_get_parent(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++	char *base = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_parent(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++
++	base = (char *)((char *)manifest + manifest->parent_offset);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_parent invalid argument\n");
++		return NULL;
++	}
++	return (ia_css_program_group_manifest_t *)(base);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++vied_nci_cell_type_ID_t ia_css_program_manifest_get_cell_type_ID(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_cell_type_ID(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_cell_type_ID invalid argument\n");
++		return VIED_NCI_N_CELL_TYPE_ID;
++	}
++	return manifest->cell_type_id;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_type_t ia_css_program_manifest_get_type(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_type(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_type invalid argument\n");
++		return IA_CSS_N_PROGRAM_TYPES;
++	}
++	return manifest->program_type;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_terminal_dependency_count(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_terminal_dependency_count(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_terminal_dependency_count invalid argument\n");
++		return 0;
++	}
++	return manifest->terminal_dependency_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_terminal_dependency(
++	const ia_css_program_manifest_t *manifest,
++	const unsigned int index)
++{
++	DECLARE_ERRVAL
++	uint8_t *terminal_dep_ptr = NULL;
++	uint8_t terminal_dependency_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_terminal_dependency(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++	terminal_dependency_count =
++		ia_css_program_manifest_get_terminal_dependency_count(manifest);
++	verifexitval(index < terminal_dependency_count, EFAULT);
++
++	terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++			manifest->terminal_dependency_offset + index);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_manifest_get_terminal_dependency invalid argument\n");
++		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
++	}
++	return *terminal_dep_ptr;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_program_manifest_singular_program_type(
++	const ia_css_program_manifest_t *manifest)
++{
++	ia_css_program_type_t		program_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_program_manifest_singular_program_type(): enter:\n");
++
++	program_type = ia_css_program_manifest_get_type(manifest);
++
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++	return (program_type == IA_CSS_PROGRAM_TYPE_SINGULAR);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_program_dependency_count(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++	    "ia_css_program_manifest_get_program_dependency_count(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_program_dependency_count invalid argument\n");
++		return 0;
++	}
++	return manifest->program_dependency_count;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++uint8_t ia_css_program_manifest_get_program_dependency(
++	const ia_css_program_manifest_t *manifest,
++	const unsigned int index)
++{
++	DECLARE_ERRVAL
++	uint8_t *program_dep_ptr = NULL;
++	uint8_t program_dependency_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_program_dependency(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++
++	program_dependency_count =
++		ia_css_program_manifest_get_program_dependency_count(manifest);
++
++	verifexitval(index < program_dependency_count, EFAULT);
++	program_dep_ptr =  (uint8_t *)((uint8_t *)manifest +
++			manifest->program_dependency_offset +
++			index * sizeof(uint8_t));
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_program_dependency invalid argument\n");
++		return IA_CSS_PROGRAM_INVALID_DEPENDENCY;
++	}
++	return *program_dep_ptr;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_program_manifest_get_kernel_bitmap(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_kernel_bitmap(): enter:\n");
++	verifexitval(manifest != NULL, EFAULT);
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_kernel_bitmap invalid argument\n");
++		return ia_css_kernel_bitmap_clear();
++	}
++	return manifest->kernel_bitmap;
++}
++
++#endif /* __IA_CSS_PSYS_PROGRAM_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
+new file mode 100644
+index 000000000000..f1ef454e6890
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_SIM_INLINE__
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_SIM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_SIM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
+new file mode 100644
+index 000000000000..e65e354397df
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_sim_trace.h
+@@ -0,0 +1,97 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_SIM_TRACE_H
++#define __IA_CSS_PSYS_SIM_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_SIM_TRACING_OVERRIDE))
++     #define PSYS_SIM_TRACE_LEVEL_CONFIG PSYS_SIM_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_SIM_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_SIM_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_SIM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_SIM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_SIM_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_SIM_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_SIM_TRACE_METHOD	PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_SIM_TRACE_LEVEL_ASSERT	PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_SIM_TRACE_LEVEL_ERROR	PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_SIM_TRACE_LEVEL_WARNING	PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_SIM_TRACE_LEVEL_INFO	PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_SIM_TRACE_LEVEL_DEBUG	PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_SIM_TRACE_LEVEL_VERBOSE	PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_SIM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
+new file mode 100644
+index 000000000000..b6a4bd600c5b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_storage_class.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++#define __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++#else
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_PSYS_STATIC_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_PSYS_STATIC_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
+new file mode 100644
+index 000000000000..4cf50b81ed52
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_static_trace.h
+@@ -0,0 +1,105 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_TRACE_H
++#define __IA_CSS_PSYS_STATIC_TRACE_H
++
++#include "ia_css_psysapi_trace.h"
++
++#define PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT	PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++/* Default sub-module tracing config */
++#if (!defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
++     #define PSYS_STATIC_TRACE_LEVEL_CONFIG \
++	PSYS_STATIC_TRACE_LEVEL_CONFIG_DEFAULT
++#endif
++
++/* Module/sub-module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_STATIC_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_STATIC_TRACING_OVERRIDE))
++	/* Module/sub-module specific trace setting */
++	#if PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_STATIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_STATIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_STATIC_TRACING_OVERRIDE == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_STATIC_TRACE_METHOD \
++			IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++			IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++			IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_DATA Tracing level defined"
++	#endif
++#else
++	/* Inherit Module trace setting */
++	#define PSYSAPI_STATIC_TRACE_METHOD \
++		PSYSAPI_TRACE_METHOD
++	#define PSYSAPI_STATIC_TRACE_LEVEL_ASSERT \
++		PSYSAPI_TRACE_LEVEL_ASSERT
++	#define PSYSAPI_STATIC_TRACE_LEVEL_ERROR \
++		PSYSAPI_TRACE_LEVEL_ERROR
++	#define PSYSAPI_STATIC_TRACE_LEVEL_WARNING \
++		PSYSAPI_TRACE_LEVEL_WARNING
++	#define PSYSAPI_STATIC_TRACE_LEVEL_INFO \
++		PSYSAPI_TRACE_LEVEL_INFO
++	#define PSYSAPI_STATIC_TRACE_LEVEL_DEBUG \
++		PSYSAPI_TRACE_LEVEL_DEBUG
++	#define PSYSAPI_STATIC_TRACE_LEVEL_VERBOSE \
++		PSYSAPI_TRACE_LEVEL_VERBOSE
++#endif
++
++#endif /* __IA_CSS_PSYSAPI_STATIC_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
+new file mode 100644
+index 000000000000..f6d2cc43c2b6
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.h
+@@ -0,0 +1,403 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_H
++#define __IA_CSS_PSYS_TERMINAL_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.h
++ *
++ * Define the methods on the terminal object that are not part of
++ * a single interface
++ */
++
++#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
++#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>		/* bool */
++#include <print_support.h>		/* FILE */
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest_base_types.h"
++
++/*
++ * Creation
++ */
++#include <ia_css_psys_terminal.hsys.user.h>
++
++/*! Boolean test if the terminal object type is input
++
++ @param	terminal[in]			terminal object
++
++ @return true if the terminal is input, false otherwise or on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_input(
++	const ia_css_terminal_t					*terminal);
++
++/*! Get the stored size of the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return size, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++size_t ia_css_terminal_get_size(
++	const ia_css_terminal_t					*terminal);
++
++/*! Get the type of the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return the type of the terminal, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_type_t ia_css_terminal_get_type(
++	const ia_css_terminal_t					*terminal);
++
++/*! Set the type of the terminal object
++
++ @param	terminal[in]			terminal object
++ @param	terminal_type[in]		type of the terminal
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_type(
++	ia_css_terminal_t		*terminal,
++	const ia_css_terminal_type_t	terminal_type);
++
++/*! Get the index of the terminal manifest object
++
++ @param	terminal[in]			terminal object
++
++ @return the index of the terminal manifest object, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_terminal_get_terminal_manifest_index(
++	const ia_css_terminal_t					*terminal);
++
++/*! Set the index of the terminal manifest object
++
++ @param	terminal[in]			terminal object
++ @param	tm_index[in]			terminal manifest index
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_terminal_manifest_index(
++	ia_css_terminal_t	*terminal,
++	const uint16_t		tm_index);
++
++/*! Get the payload (buffer) size for all buffers that will be supplied for the terminal
++
++ @param	terminal[in]			terminal object
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint32_t ia_css_terminal_get_payload_size(
++	const ia_css_terminal_t *terminal);
++
++/*! Set the payload (buffer) size for all buffers that will be supplied for the terminal
++
++ @param	terminal[in]			terminal object
++ @param	payload_size[in]		Size of buffer that will be supplied to the terminal
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_payload_size(
++	ia_css_terminal_t *terminal,
++	uint32_t payload_size);
++
++/*! Get id of the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_get_ID(
++	const ia_css_terminal_t			*terminal);
++
++/*! Get compressed byte of the data terminal object
++
++ @param	dterminal[in]			data terminal object
++ @param val[out]			is_compressed value
++
++ @@return < 0 on error
++ */
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_is_compressed(
++	const ia_css_data_terminal_t *dterminal,
++	uint8_t *val);
++
++/*! Get kernel id of the data terminal object
++
++ @param	dterminal[in]			data terminal object
++
++ @return kernel id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_get_kernel_id(
++	const ia_css_data_terminal_t			*dterminal);
++
++/*! Get the connection type from the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return buffer type, limit value on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
++	const ia_css_data_terminal_t	*dterminal);
++
++/*! Set the connection type of the terminal object
++
++ @param	terminal[in]			terminal object
++ @param	connection_type[in]		connection type
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_connection_type(
++	ia_css_data_terminal_t				*dterminal,
++	const ia_css_connection_type_t			connection_type);
++
++/*! Get link id of the data terminal object
++
++ @param	dterminal[in]			data terminal object
++
++ @return link id of terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_get_link_id(
++	const ia_css_data_terminal_t			*dterminal);
++
++/*! Set link id of the terminal object
++
++ @param	terminal[in]			data terminal object
++ @param	link_id[in]			synchronization link id
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_link_id(
++	ia_css_data_terminal_t				*dterminal,
++	const uint8_t					link_id);
++
++/*! Set stream2gen buffer size used in stream to GEN connection
++ * This function should be called, in case we are in streaming use-case, and
++ * we need to configure the stream2gen_buffer_size to be less than full image's height.
++ * Note, that the stream2gen_buffer_size is set to a defalut value of full image's height
++ * during terminal_create function.
++
++ * @param	terminal[in]			data terminal object
++ * @param	stream2gen_buffer_size[in]		Buffer size (Size's units are lines)
++
++ * @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_data_terminal_set_stream2gen_buffer_size(
++	ia_css_data_terminal_t *dterminal,
++	const uint16_t stream2gen_buffer_size);
++
++/*! Get the (pointer to) the process group parent of the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return the pointer to the parent, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_process_group_t *ia_css_terminal_get_parent(
++	const ia_css_terminal_t					*terminal);
++
++/*! Set the (pointer to) the process group parent of the terminal object
++
++ @param	terminal[in]	terminal object
++ @param	parent[in]	(pointer to the) process group parent object
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_parent(
++	ia_css_terminal_t	*terminal,
++	ia_css_process_group_t	*parent);
++
++/*! Boolean test if the terminal object type is valid
++
++ @param	terminal[in]			process terminal object
++ @param	terminal_manifest[in]		program terminal manifest
++
++ @return true if the process terminal object is correct, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_valid(
++	const ia_css_terminal_t		 *terminal,
++	const ia_css_terminal_manifest_t *terminal_manifest);
++
++/* ================= Program Control Init Terminal - START ================= */
++
++/*!
++ * Gets the program init terminal descripor size
++ * @param manifest[in]		program control init terminal manifest
++ * @param pg_manifest[in]	program group manifest
++ * @param kernel_bitmap[in]	kernel enable bitmap
++ * @return size, error if < 0.
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int
++ia_css_program_control_init_terminal_get_descriptor_size(
++	const ia_css_program_control_init_terminal_manifest_t *manifest,
++	const ia_css_program_group_manifest_t *pg_manifest,
++	ia_css_kernel_bitmap_t kernel_bitmap);
++
++/*!
++ * Initialize program control init terminal
++ * @param nof_fragments[in]	Number of fragments
++ * @param terminal[in]		program control init terminal
++ * @param manifest[in]		program control init terminal manifest
++ * @param pg_manifest[in]	program group manifest
++ * @param kernel_bitmap[in]	kernel enable bitmap
++ * @return < 0 on erro
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int
++ia_css_program_control_init_terminal_init(
++	ia_css_program_control_init_terminal_t *terminal,
++	const ia_css_program_control_init_terminal_manifest_t *manifest,
++	const ia_css_program_group_manifest_t *pg_manifest,
++	ia_css_kernel_bitmap_t kernel_bitmap);
++
++/*!
++ * Get a program desc for a program control init terminal
++  * @param terminal[in]		program control init terminal
++ * @param manifest[in]		program control init terminal manifest
++ * @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_program_desc_t *
++ia_css_program_control_init_terminal_get_program_desc(
++	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
++	const unsigned int program_index
++);
++
++/*!
++ * Pretty prints the program control init termnial
++ * @param terminal[in]		program control init terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++void ia_css_program_control_init_terminal_print(
++	const ia_css_program_control_init_terminal_t *terminal);
++
++/*!
++ * Returns the number of connect sections per program
++ * @param program_desc[in] program control init terminal program desc
++ * @return number of connect sections
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
++	const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Returns the number of connect sections per program
++ * @param program_desc[in] program control init terminal program desc
++ * @return number of connect sections
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_load_section_count(
++	const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Returns the memory offset of the first load section in the program
++ * @param program_desc[in] program control init terminal program desc
++ * @return memory offset
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
++	const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Gets a load section desc for a program desc
++ * of a program control init terminal
++ * @param program_desc[in]		program control init terminal program desc
++ * @param load_section_index[in]	section index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_load_section_desc_t *
++ia_css_program_control_init_terminal_get_load_section_desc(
++	const ia_css_program_control_init_program_desc_t *program_desc,
++	const unsigned int load_section_index
++);
++
++/*!
++ * Gets process_id from program desc
++ * of a program control init terminal
++ * @param program_desc[in]		program control init terminal program desc
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
++	const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Set control info of program desc
++ * of a program control init terminal
++ * @param program_desc[in]	program control init terminal program desc
++ * @param process_id 		unique process id used to identify the process
++ * among all active process
++ * @param num_done_events 	number of events required to close the process
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++void ia_css_program_control_init_terminal_set_control_info(
++	ia_css_program_control_init_program_desc_t *program_desc,
++	ia_css_process_id_t process_id,
++	uint8_t num_done_events);
++
++/*!
++ * Gets num_done_events value from program desc
++ * of a program control init terminal
++ * @param program_desc[in]		program control init terminal program desc
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_program_control_init_terminal_get_num_done_events(
++	const ia_css_program_control_init_program_desc_t *program_desc);
++
++/*!
++ * Gets a connect section desc for a program desc
++ * of a program control init terminal
++ * @param program_desc[in]		program control init terminal program desc
++ * @param connect_section_index[in]	section index
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_program_control_init_connect_section_desc_t *
++ia_css_program_control_init_terminal_get_connect_section_desc(
++	const ia_css_program_control_init_program_desc_t *program_desc,
++	const unsigned int connect_section_index
++);
++
++/* ================= Program Control Init Terminal - END ================= */
++
++#ifdef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_terminal_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
+new file mode 100644
+index 000000000000..11db05fb9191
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal.hsys.user.h
+@@ -0,0 +1,257 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
++#define __IA_CSS_PSYS_TERMINAL_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.hsys.user.h
++ *
++ * Define the methods on the terminal object: Hsys user interface
++ */
++
++#include <ia_css_program_group_data.h>	/* ia_css_frame_t */
++#include <ia_css_program_group_param.h>	/* ia_css_program_group_param_t */
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_manifest_types.h>
++
++#include <type_support.h>					/* bool */
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_kernel_bitmap.h"
++
++/*
++ * Creation
++ */
++
++/*
++ * This source file is created with the intention of sharing and
++ * compiled for host and firmware. Since there is no native 64bit
++ * data type support for firmware this wouldn't compile for SP
++ * tile. The part of the file that is not compilable are marked
++ * with the following __VIED_CELL marker and this comment. Once we
++ * come up with a solution to address this issue this will be
++ * removed.
++ */
++#if !defined(__VIED_CELL)
++/*! Compute the size of storage required for allocating the terminal object
++
++ @param	manifest[in]			terminal manifest
++ @param	param[in]				program group parameters
++
++ @return 0 on error
++ */
++extern size_t ia_css_sizeof_terminal(
++	const ia_css_terminal_manifest_t		*manifest,
++	const ia_css_program_group_param_t		*param);
++
++/*! Create the terminal object
++
++ @param	raw_mem[in]				pre allocated memory
++ @param	manifest[in]			terminal manifest
++ @param	terminal_param[in]		terminal parameter
++ @param enable_bitmap			program group enable bitmap
++
++ @return NULL on error
++ */
++extern ia_css_terminal_t *ia_css_terminal_create(
++	void *raw_mem,
++	const ia_css_terminal_manifest_t		*manifest,
++	const ia_css_terminal_param_t			*terminal_param,
++	ia_css_kernel_bitmap_t				enable_bitmap);
++
++/*! Destroy (the storage of) the process object
++
++ @param	terminal[in]			terminal object
++
++ @return NULL
++ */
++extern ia_css_terminal_t *ia_css_terminal_destroy(
++	ia_css_terminal_t *terminal);
++#endif /* !defined(__VIED_CELL) */
++
++/*! Print the terminal object to file/stream
++
++ @param	terminal[in]			terminal object
++ @param	fid[out]				file/stream handle
++
++ @return < 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_print(
++	const ia_css_terminal_t					*terminal,
++	void *fid);
++
++/*! Get the (pointer to) the frame object in the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return the pointer to the frame, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_frame_t *ia_css_data_terminal_get_frame(
++	const ia_css_data_terminal_t		*terminal);
++
++/*! Get the (pointer to) the frame descriptor object in the terminal object
++
++ @param	terminal[in]			terminal object
++
++ @return the pointer to the frame descriptor, NULL on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
++	const ia_css_data_terminal_t		*dterminal);
++
++/*! Get the (pointer to) the fragment descriptor object in the terminal object
++
++ @param	terminal[in]			terminal object
++
++@return the pointer to the fragment descriptor, NULL on error
++*/
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++ia_css_fragment_descriptor_t
++	*ia_css_data_terminal_get_fragment_descriptor(
++		const ia_css_data_terminal_t		*dterminal,
++		const unsigned int			fragment_index);
++
++/*! Get the number of fragments on the terminal
++
++ @param	terminal[in]			terminal object
++
++ @return the fragment count, 0 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint16_t ia_css_data_terminal_get_fragment_count(
++	const ia_css_data_terminal_t		*dterminal);
++
++/*! Get the number of section on the (param)terminal
++ @param	manifest[in]			terminal manifest
++ @param	terminal_param[in]		terminal parameter
++
++ @return the section count, 0 on error
++ */
++extern uint16_t ia_css_param_terminal_compute_section_count(
++	const ia_css_terminal_manifest_t	*manifest,
++	const ia_css_program_group_param_t	*param);
++
++/*! Get the number of planes on the (data)terminal
++ @param	manifest[in]			terminal manifest
++ @param	terminal_param[in]		terminal parameter
++
++ @return the plane count, 1(default) on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++uint8_t ia_css_data_terminal_compute_plane_count(
++	const ia_css_terminal_manifest_t		*manifest,
++	const ia_css_program_group_param_t		*param);
++
++/*! check if given terminal is parameter terminal.
++
++ @param	terminal[in]			(base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_parameter_terminal(
++	const ia_css_terminal_t					*terminal);
++
++/*! check if given terminal is program terminal.
++
++ @program	terminal[in]			(base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_program_terminal(
++	const ia_css_terminal_t					*terminal);
++
++/*! check if given terminal is program control init terminal.
++
++ @program control init	terminal[in]			(base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_program_control_init_terminal(
++	const ia_css_terminal_t					*terminal);
++
++/*! check if given terminal is spatial parameter terminal.
++
++ @spatial	terminal[in]			(base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_spatial_parameter_terminal(
++	const ia_css_terminal_t					*terminal);
++
++/*! check if given terminal is data terminal.
++
++ @param	terminal[in]			(base)terminal object
++
++ @return true on success, false on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_data_terminal(
++	const ia_css_terminal_t					*terminal);
++
++/*! obtain buffer out of terminal(both data & param terminals can call this)
++
++ @param	terminal[in]	(base)terminal object of either data or param terminal.
++
++ @return vied address of buffer stored in terminal
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++vied_vaddress_t  ia_css_terminal_get_buffer(
++		const ia_css_terminal_t *terminal);
++
++/*!store a buffer in the terminal.
++
++ @param	terminal[in]	(base)terminal object of either data or param terminal.
++ @param buffer[in]	buffer in vied (hrt address) space.
++
++ @return 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_H
++int ia_css_terminal_set_buffer(ia_css_terminal_t *terminal,
++				vied_vaddress_t buffer);
++
++/*! Obtain terminal buffer index out of terminal object
++
++ @param	terminal[in]	(base)terminal object of either data or param terminal.
++
++ @return terminal buffer index stored in terminal object on success, -1 on error
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_get_terminal_index(
++	const ia_css_terminal_t *terminal);
++
++/*! Store a terminal buffer index in the terminal object
++
++ @param	terminal[in]		(base)terminal object of either data or param terminal.
++ @param terminal_index[in]	terminal buffer index
++
++ @return 0 on success
++ */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_index(
++	ia_css_terminal_t *terminal,
++	unsigned int terminal_index);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
+new file mode 100644
+index 000000000000..2ca5d1901b95
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_impl.h
+@@ -0,0 +1,2053 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_IMPL_H
++#define __IA_CSS_PSYS_TERMINAL_IMPL_H
++
++#include <ia_css_psys_terminal.h>
++
++#include <ia_css_psys_process_types.h>
++#include <ia_css_psys_terminal_manifest.h>
++
++#include <ia_css_program_group_data.h>
++#include <ia_css_program_group_param.h>
++
++#include <ia_css_psys_process_group.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psys_process_group.hsys.user.h>
++
++#include <type_support.h>
++#include <error_support.h>	/* for verifexit, verifjmpexit */
++#include <assert_support.h>	/* for COMPILATION_ERROR_IF */
++#include <misc_support.h>	/* for NOT_USED */
++#include "ia_css_psys_terminal_private_types.h"
++#include "ia_css_terminal_manifest_types.h"
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_psys_manifest_types.h"
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_types.h"
++
++STORAGE_CLASS_INLINE int ia_css_data_terminal_print(const ia_css_terminal_t *terminal,
++	void *fid) {
++
++	DECLARE_ERRVAL
++	int retval = -1;
++	int i;
++	ia_css_data_terminal_t *dterminal = (ia_css_data_terminal_t *)terminal;
++	uint16_t fragment_count =
++		ia_css_data_terminal_get_fragment_count(dterminal);
++	verifexitval(fragment_count != 0, EINVAL);
++
++	retval = ia_css_frame_descriptor_print(
++		ia_css_data_terminal_get_frame_descriptor(dterminal),
++		fid);
++	verifexitval(retval == 0, EINVAL);
++
++	retval = ia_css_frame_print(
++		ia_css_data_terminal_get_frame(dterminal), fid);
++	verifexitval(retval == 0, EINVAL);
++
++	for (i = 0; i < (int)fragment_count; i++) {
++		retval = ia_css_fragment_descriptor_print(
++			ia_css_data_terminal_get_fragment_descriptor(
++				dterminal, i), fid);
++		verifexitval(retval == 0, EINVAL);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++			"stream2gen_buffer_size = %u\n", dterminal->stream2gen_buffer_size);
++
++	retval = 0;
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_print(
++	const ia_css_terminal_t *terminal,
++	void *fid)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	ia_css_terminal_type_t term_type = ia_css_terminal_get_type(terminal);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_terminal_print(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++		"\tTerminal 0x%lx sizeof %d, typeof %d, parent 0x%lx\n",
++		(unsigned long int)terminal,
++		(int)ia_css_terminal_get_size(terminal),
++		(int)ia_css_terminal_get_type(terminal),
++		(unsigned long int)ia_css_terminal_get_parent(terminal));
++
++	switch (term_type) {
++	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++		ia_css_program_control_init_terminal_print(
++			(ia_css_program_control_init_terminal_t *)terminal);
++	break;
++	case IA_CSS_TERMINAL_TYPE_DATA_IN:
++	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++		ia_css_data_terminal_print(terminal, fid);
++	break;
++	default:
++		/* other terminal prints are currently not supported */
++	break;
++	}
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_print invalid argument terminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_input(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	bool is_input = false;
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_input(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++	switch (terminal_type) {
++	case IA_CSS_TERMINAL_TYPE_DATA_IN:		/* Fall through */
++	case IA_CSS_TERMINAL_TYPE_STATE_IN:		/* Fall through */
++	case IA_CSS_TERMINAL_TYPE_PARAM_STREAM:		/* Fall through */
++	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++	case IA_CSS_TERMINAL_TYPE_PROGRAM:
++	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++		is_input = true;
++		break;
++	case IA_CSS_TERMINAL_TYPE_DATA_OUT:		/* Fall through */
++	case IA_CSS_TERMINAL_TYPE_STATE_OUT:
++	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++		is_input = false;
++		break;
++	default:
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_input: Unknown terminal type (%d)\n",
++			terminal_type);
++		goto EXIT;
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_input invalid argument\n");
++	}
++	return is_input;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++size_t ia_css_terminal_get_size(
++	const ia_css_terminal_t	*terminal)
++{
++	DECLARE_ERRVAL
++	size_t size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_size(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	size = terminal->size;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_size invalid argument\n");
++	}
++	return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_type_t ia_css_terminal_get_type(
++	const ia_css_terminal_t	*terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_type(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	terminal_type = terminal->terminal_type;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_type invalid argument\n");
++	}
++	return terminal_type;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_type(
++	ia_css_terminal_t *terminal,
++	const ia_css_terminal_type_t terminal_type)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_type(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	terminal->terminal_type = terminal_type;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_type invalid argument terminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_type failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_terminal_get_terminal_manifest_index(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	uint16_t terminal_manifest_index;
++
++	terminal_manifest_index = 0xffff;
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_terminal_manifest_index(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	terminal_manifest_index = terminal->tm_index;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_terminal_manifest_index: invalid argument\n");
++	}
++	return terminal_manifest_index;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_manifest_index(
++	ia_css_terminal_t *terminal,
++	const uint16_t terminal_manifest_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_terminal_manifest_index(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++	terminal->tm_index = terminal_manifest_index;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_terminal_manifest_index: invalid argument terminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_terminal_manifest_index: failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint32_t ia_css_terminal_get_payload_size(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	uint32_t payload_size;
++
++	payload_size = 0;
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_payload_size(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	payload_size = terminal->payload_size;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_payload_size: invalid argument\n");
++	}
++	return payload_size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_payload_size(
++	ia_css_terminal_t *terminal,
++	uint32_t payload_size)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_payload_size(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++	terminal->payload_size = payload_size;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_payload_size: invalid argument terminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_payload_size: failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_terminal_ID_t ia_css_terminal_get_ID(
++	const ia_css_terminal_t	*terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_ID_t retval = IA_CSS_TERMINAL_INVALID_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_ID(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	retval = terminal->ID;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_ID invalid argument\n");
++		retval = 0;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_get_kernel_id(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	uint8_t retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_kernel_id(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	retval = dterminal->kernel_id;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_kernel_id: invalid argument\n");
++		retval =  0;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_is_compressed(
++	const ia_css_data_terminal_t *dterminal,
++	uint8_t *val)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	const ia_css_frame_descriptor_t *frame_descriptor;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_is_compressed enter\n");
++
++	frame_descriptor =
++		ia_css_data_terminal_get_frame_descriptor(dterminal);
++
++	verifexitval(frame_descriptor != NULL, EFAULT);
++
++	*val = frame_descriptor->is_compressed;
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_is_compressed: Null frame descriptor\n");
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_connection_type_t ia_css_data_terminal_get_connection_type(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	ia_css_connection_type_t connection_type = IA_CSS_N_CONNECTION_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_connection_type(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	connection_type = dterminal->connection_type;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_connection_type: invalid argument\n");
++	}
++	return connection_type;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_get_link_id(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	uint8_t link_id = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_link_id(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	link_id = dterminal->link_id;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_link_id: invalid argument\n");
++	}
++	return link_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_link_id(
++	ia_css_data_terminal_t *dterminal,
++	const uint8_t link_id)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_set_link_id(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++	dterminal->link_id = link_id;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_link_id: invalid argument terminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_link_id: failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_connection_type(
++	ia_css_data_terminal_t *dterminal,
++	const ia_css_connection_type_t connection_type)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_set_connection_type(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	dterminal->connection_type = connection_type;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_connection_type: invalid argument dterminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_connection_type failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_data_terminal_set_stream2gen_buffer_size(
++	ia_css_data_terminal_t *dterminal,
++	const uint16_t stream2gen_buffer_size)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_set_stream2gen_buffer_size(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, DEBUG,
++		"ia_css_data_terminal_set_stream2gen_buffer_size(): stream2gen_buffer_size = %u\n", stream2gen_buffer_size);
++	dterminal->stream2gen_buffer_size = stream2gen_buffer_size;
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_stream2gen_buffer_size: invalid argument dterminal\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_set_stream2gen_buffer_size failed (%i)\n",
++			retval);
++	}
++
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_group_t *ia_css_terminal_get_parent(
++	const ia_css_terminal_t	*terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_process_group_t *parent = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_parent(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++	if (terminal->parent_offset == 0) {
++		return NULL;
++	}
++
++	parent = (ia_css_process_group_t *) ((char *)terminal +
++					terminal->parent_offset);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_parent invalid argument\n");
++	}
++	return parent;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_parent(
++	ia_css_terminal_t *terminal,
++	ia_css_process_group_t *parent)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_parent(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++	verifexitval(parent != NULL, EFAULT);
++
++	terminal->parent_offset = (uint16_t) ((char *)parent -
++						(char *)terminal);
++
++	retval = 0;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_parent invalid argument\n");
++	}
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_parent failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_frame_t *ia_css_data_terminal_get_frame(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	ia_css_frame_t *frame = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_frame(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	frame = (ia_css_frame_t	*)(&(dterminal->frame));
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_frame invalid argument\n");
++	}
++	return frame;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_frame_descriptor_t *ia_css_data_terminal_get_frame_descriptor(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	ia_css_frame_descriptor_t *frame_descriptor = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
++
++	verifexitval(dterminal != NULL, EFAULT);
++
++	frame_descriptor =
++		(ia_css_frame_descriptor_t *)(&(dterminal->frame_descriptor));
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
++	}
++	return frame_descriptor;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_fragment_descriptor_t *ia_css_data_terminal_get_fragment_descriptor(
++	const ia_css_data_terminal_t *dterminal,
++	const unsigned int fragment_index)
++{
++	DECLARE_ERRVAL
++	ia_css_fragment_descriptor_t *fragment_descriptor = NULL;
++	uint16_t fragment_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_frame_descriptor(): enter:\n");
++
++	fragment_count = ia_css_data_terminal_get_fragment_count(dterminal);
++
++	verifexitval(dterminal != NULL, EFAULT);
++	verifexitval(fragment_count != 0, EINVAL);
++	verifexitval(fragment_index < fragment_count, EINVAL);
++
++	fragment_descriptor = (ia_css_fragment_descriptor_t *)
++		((char *)dterminal + dterminal->fragment_descriptor_offset);
++
++	fragment_descriptor += fragment_index;
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_frame_descriptor: invalid argument\n");
++	}
++	return fragment_descriptor;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint16_t ia_css_data_terminal_get_fragment_count(
++	const ia_css_data_terminal_t *dterminal)
++{
++	DECLARE_ERRVAL
++	ia_css_process_group_t *parent;
++	uint16_t fragment_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_get_fragment_count(): enter:\n");
++
++	parent = ia_css_terminal_get_parent((ia_css_terminal_t *)dterminal);
++
++	verifexitval(dterminal != NULL, EFAULT);
++	verifexitval(parent != NULL, EFAULT);
++
++	fragment_count = ia_css_process_group_get_fragment_count(parent);
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_get_fragment_count: invalid argument\n");
++	}
++	return fragment_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_parameter_terminal(
++	const ia_css_terminal_t	*terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_parameter_terminal(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	/* will return an error value on error */
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_parameter_terminal: invalid argument\n");
++	}
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_data_terminal(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_data_terminal(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	/* will return an error value on error */
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_data_terminal invalid argument\n");
++	}
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
++			terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_program_terminal(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_program_terminal(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	/* will return an error value on error */
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_program_terminal: invalid argument\n");
++	}
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_program_control_init_terminal(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t	terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_program_control_init_terminal(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	/* will return an error value on error */
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_program_control_init_terminal: invalid argument\n");
++	}
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_spatial_parameter_terminal(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_spatial_parameter_terminal(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++
++	/* will return an error value on error */
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_spatial_param_terminal: invalid argument\n");
++	}
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT);
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_data_terminal_compute_plane_count(
++	const ia_css_terminal_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	DECLARE_ERRVAL
++	uint8_t	plane_count = 1;
++
++	NOT_USED(manifest);
++	NOT_USED(param);
++
++	verifexitval(manifest != NULL, EFAULT);
++	verifexitval(param != NULL, EFAULT);
++	/* TODO: Implementation Missing*/
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_data_terminal_compute_plane_count(): enter:\n");
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_data_terminal_compute_plane_count: invalid argument\n");
++	}
++	return plane_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++vied_vaddress_t  ia_css_terminal_get_buffer(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	vied_vaddress_t buffer = VIED_NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_buffer(): enter:\n");
++
++	verifexitval(terminal != NULL, EFAULT);
++	if (ia_css_is_terminal_data_terminal(terminal)) {
++		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++
++		verifexitval(frame != NULL, EFAULT);
++		buffer = ia_css_frame_get_buffer(frame);
++	} else if (ia_css_is_terminal_parameter_terminal(terminal)) {
++		const ia_css_param_terminal_t *param_terminal =
++			(const ia_css_param_terminal_t *)terminal;
++
++		verifexitval(param_terminal != NULL, EFAULT);
++		buffer = param_terminal->param_payload.buffer;
++	}  else if (ia_css_is_terminal_program_terminal(terminal)) {
++		const ia_css_program_terminal_t *program_terminal =
++			(const ia_css_program_terminal_t *)terminal;
++
++		verifexitval(program_terminal != NULL, EFAULT);
++		buffer = program_terminal->param_payload.buffer;
++	}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
++		const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
++			(const ia_css_program_control_init_terminal_t *)terminal;
++
++		verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
++		buffer = program_ctrl_init_terminal->param_payload.buffer;
++	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
++		const ia_css_spatial_param_terminal_t *spatial_terminal =
++			(const ia_css_spatial_param_terminal_t *)terminal;
++
++		verifexitval(spatial_terminal != NULL, EFAULT);
++		buffer = spatial_terminal->param_payload.buffer;
++	}
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_buffer: invalid argument terminal\n");
++	}
++	return buffer;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_buffer(
++	ia_css_terminal_t *terminal,
++	vied_vaddress_t buffer)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++	ia_css_param_terminal_t *pterminal = NULL;
++	ia_css_program_terminal_t *prog_terminal = NULL;
++	ia_css_program_control_init_terminal_t *progctrl_terminal = NULL;
++	ia_css_spatial_param_terminal_t *spatial_terminal = NULL;
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_buffer(): enter:\n");
++
++	if (ia_css_is_terminal_data_terminal(terminal) == true) {
++		/* Currently using Frames inside data terminal ,
++		 * TODO: start directly using data.
++		 */
++		ia_css_data_terminal_t *dterminal =
++			(ia_css_data_terminal_t *)terminal;
++		ia_css_frame_t *frame =
++			ia_css_data_terminal_get_frame(dterminal);
++
++		verifexitval(frame != NULL, EFAULT);
++		retval = ia_css_frame_set_buffer(frame, buffer);
++		verifexitval(retval == 0, EINVAL);
++	} else if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
++		pterminal = (ia_css_param_terminal_t *)terminal;
++		verifexitval(pterminal != NULL, EFAULT);
++		pterminal->param_payload.buffer = buffer;
++		retval = 0;
++	} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
++		prog_terminal = (ia_css_program_terminal_t *)terminal;
++		verifexitval(prog_terminal != NULL, EFAULT);
++		prog_terminal->param_payload.buffer = buffer;
++		retval = 0;
++	} else if (ia_css_is_terminal_program_control_init_terminal(terminal) == true) {
++		progctrl_terminal = (ia_css_program_control_init_terminal_t *)terminal;
++		verifexitval(progctrl_terminal != NULL, EFAULT);
++		progctrl_terminal->param_payload.buffer = buffer;
++		retval = 0;
++	} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
++			true) {
++		spatial_terminal = (ia_css_spatial_param_terminal_t *)terminal;
++		verifexitval(spatial_terminal != NULL, EFAULT);
++		spatial_terminal->param_payload.buffer = buffer;
++		retval = 0;
++	} else {
++		return retval;
++	}
++
++	retval = 0;
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_buffer failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_get_terminal_index(
++	const ia_css_terminal_t *terminal)
++{
++	DECLARE_ERRVAL
++	int terminal_index = -1;
++	verifexitval(terminal != NULL, EFAULT);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_get_terminal_index(): enter:\n");
++
++	if (ia_css_is_terminal_data_terminal(terminal)) {
++		ia_css_frame_t *frame = ia_css_data_terminal_get_frame(
++					(ia_css_data_terminal_t *)terminal);
++
++		verifexitval(frame != NULL, EFAULT);
++		terminal_index = ia_css_frame_get_data_index(frame);
++	} else {
++		if (ia_css_is_terminal_parameter_terminal(terminal)) {
++			const ia_css_param_terminal_t *param_terminal =
++				(const ia_css_param_terminal_t *)terminal;
++			verifexitval(param_terminal != NULL, EFAULT);
++			terminal_index = param_terminal->param_payload.terminal_index;
++		}  else if (ia_css_is_terminal_program_terminal(terminal)) {
++			const ia_css_program_terminal_t *program_terminal =
++				(const ia_css_program_terminal_t *)terminal;
++			verifexitval(program_terminal != NULL, EFAULT);
++			terminal_index = program_terminal->param_payload.terminal_index;
++		}  else if (ia_css_is_terminal_program_control_init_terminal(terminal)) {
++			const ia_css_program_control_init_terminal_t *program_ctrl_init_terminal =
++				(const ia_css_program_control_init_terminal_t *)terminal;
++			verifexitval(program_ctrl_init_terminal != NULL, EFAULT);
++			terminal_index = program_ctrl_init_terminal->param_payload.terminal_index;
++		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal)) {
++			const ia_css_spatial_param_terminal_t *spatial_terminal =
++				(const ia_css_spatial_param_terminal_t *)terminal;
++			verifexitval(spatial_terminal != NULL, EFAULT);
++			terminal_index = spatial_terminal->param_payload.terminal_index;
++		} else {
++			verifjmpexit(0);
++		}
++	}
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_get_terminal_index: invalid argument\n");
++	}
++	return terminal_index;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int ia_css_terminal_set_terminal_index(
++	ia_css_terminal_t *terminal,
++	unsigned int terminal_index)
++{
++	DECLARE_ERRVAL
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_terminal_set_terminal_index(): enter:\n");
++
++	if (ia_css_is_terminal_data_terminal(terminal) == true) {
++		/* Currently using Frames inside data terminal ,
++		 * TODO: start directly using data.
++		 */
++		ia_css_data_terminal_t *dterminal =
++			(ia_css_data_terminal_t *)terminal;
++		ia_css_frame_t *frame =
++			ia_css_data_terminal_get_frame(dterminal);
++
++		verifexitval(frame != NULL, EFAULT);
++		retval = ia_css_frame_set_data_index(frame, terminal_index);
++		verifexitval(retval == 0, EINVAL);
++	} else {
++		if (ia_css_is_terminal_parameter_terminal(terminal) == true) {
++			ia_css_param_terminal_t *pterminal =
++				(ia_css_param_terminal_t *)terminal;
++
++			pterminal->param_payload.terminal_index = terminal_index;
++			retval = 0;
++		} else if (ia_css_is_terminal_program_terminal(terminal) == true) {
++			ia_css_program_terminal_t *pterminal =
++				(ia_css_program_terminal_t *)terminal;
++
++			pterminal->param_payload.terminal_index = terminal_index;
++			retval = 0;
++		} else if (ia_css_is_terminal_program_control_init_terminal(terminal)
++				== true) {
++			ia_css_program_control_init_terminal_t *pterminal =
++				(ia_css_program_control_init_terminal_t *)terminal;
++
++			pterminal->param_payload.terminal_index = terminal_index;
++			retval = 0;
++		} else if (ia_css_is_terminal_spatial_parameter_terminal(terminal) ==
++				true) {
++			ia_css_spatial_param_terminal_t *pterminal =
++				(ia_css_spatial_param_terminal_t *)terminal;
++
++			pterminal->param_payload.terminal_index = terminal_index;
++			retval = 0;
++		} else {
++			return retval;
++		}
++	}
++
++	retval = 0;
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_terminal_set_terminal_index failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_data_terminal_valid(
++	const ia_css_terminal_t *terminal,
++	const ia_css_terminal_manifest_t *terminal_manifest,
++	const uint16_t nof_fragments)
++{
++	DECLARE_ERRVAL
++	bool invalid_flag = false;
++
++	const ia_css_data_terminal_t *dterminal =
++		(ia_css_data_terminal_t *)terminal;
++	const ia_css_data_terminal_manifest_t *dt_manifest =
++		(ia_css_data_terminal_manifest_t *)terminal_manifest;
++	const ia_css_frame_descriptor_t *frame_descriptor;
++	ia_css_frame_format_bitmap_t man_frame_format_bitmap;
++	ia_css_frame_format_bitmap_t proc_frame_format_bitmap;
++	uint16_t max_value[IA_CSS_N_DATA_DIMENSION];
++	uint16_t min_value[IA_CSS_N_DATA_DIMENSION];
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_data_terminal_valid enter\n");
++
++	frame_descriptor =
++		ia_css_data_terminal_get_frame_descriptor(dterminal);
++	verifexitval(frame_descriptor != NULL, EFAULT);
++	man_frame_format_bitmap =
++		ia_css_data_terminal_manifest_get_frame_format_bitmap(
++					dt_manifest);
++	proc_frame_format_bitmap =
++		ia_css_frame_format_bit_mask(
++				frame_descriptor->frame_format_type);
++	/*
++	 * TODO: Replace by 'validation of frame format type'.
++	 * Currently frame format type is not correctly set by manifest,
++	 * waiting for HSD 1804260604
++	 */
++	if (man_frame_format_bitmap > 0) {
++		if ((man_frame_format_bitmap &
++					proc_frame_format_bitmap) == 0) {
++			uint32_t *bitmap_arr =
++				(uint32_t *)&man_frame_format_bitmap;
++
++			NOT_USED(bitmap_arr);
++			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++				"Frame format type not defined in manifest\n");
++			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++				" man bitmap_arr[]: %d,%d\n",
++				bitmap_arr[1], bitmap_arr[0]);
++			bitmap_arr = (uint32_t *)&proc_frame_format_bitmap;
++			IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++				" proc bitmap_arr[]: %d,%d\n",
++				bitmap_arr[1], bitmap_arr[0]);
++		}
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"Frame format bitmap not defined in manifest\n");
++	}
++	ia_css_data_terminal_manifest_get_min_size(dt_manifest, min_value);
++	/*
++	 * TODO: Replace by validation of Minimal frame column dimensions.
++	 *  Currently not correctly set by manifest yet,
++	 *  waiting for HSD 1804260604
++	 */
++	if ((frame_descriptor->dimension[IA_CSS_COL_DIMENSION] <
++		min_value[IA_CSS_COL_DIMENSION])) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"Minimal frame column dimensions not set correctly (by manifest)\n");
++	}
++	/*
++	 * TODO: Replace by validation of Minimal frame row dimensions.
++	 * Currently not correctly set by manifest yet,
++	 * waiting for HSD 1804260604
++	 */
++	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] <
++		min_value[IA_CSS_ROW_DIMENSION]) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"Minimal frame row dimensions not set correctly (by manifest)\n");
++	}
++
++	ia_css_data_terminal_manifest_get_max_size(dt_manifest, max_value);
++	/*
++	 * TODO: Replace by validation of Maximal frame column dimensions.
++	 * Currently not correctly set by manifest yet,
++	 * waiting for HSD 1804260604
++	 */
++	if (frame_descriptor->dimension[IA_CSS_COL_DIMENSION] >
++		max_value[IA_CSS_COL_DIMENSION]) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"Maximal frame column dimensions not set correctly (by manifest)\n");
++	}
++	/*
++	 * TODO: Replace by validation of Maximal frame row dimensions.
++	 * Currently not correctly set by manifest yet,
++	 * waiting for HSD 1804260604
++	 */
++	if (frame_descriptor->dimension[IA_CSS_ROW_DIMENSION] >
++		max_value[IA_CSS_ROW_DIMENSION]) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"Maximal frame row dimensions not set correctly (by manifest)\n");
++	}
++	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "min_value: [%d,%d]\n",
++		min_value[IA_CSS_COL_DIMENSION],
++		min_value[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "max_value: [%d,%d]\n",
++		max_value[IA_CSS_COL_DIMENSION],
++		max_value[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, VERBOSE, "frame dim: [%d,%d]\n",
++		frame_descriptor->dimension[IA_CSS_COL_DIMENSION],
++		frame_descriptor->dimension[IA_CSS_ROW_DIMENSION]);
++	/*
++	 * TODO: Add validation of fragment dimensions.
++	 * Currently not set by manifest yet, waiting for HSD 1804260604
++	 */
++	NOT_USED(nof_fragments);
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_data_terminal_valid() invalid argument\n");
++		return false;
++	} else {
++		return (!invalid_flag);
++	}
++}
++
++STORAGE_CLASS_INLINE void ia_css_program_terminal_seq_info_print(
++	const ia_css_kernel_fragment_sequencer_info_manifest_desc_t
++		*man_seq_info_desc,
++	const ia_css_kernel_fragment_sequencer_info_desc_t
++		*term_seq_info_desc)
++{
++	NOT_USED(man_seq_info_desc);
++	NOT_USED(term_seq_info_desc);
++
++	/* slice dimension column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_slice_dimension: %d\n",
++		term_seq_info_desc->
++		fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_slice_dimension: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_slice_dimension: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_slice_dimension[IA_CSS_COL_DIMENSION]);
++
++	/* slice dimension row */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_slice_dimension: %d\n",
++		term_seq_info_desc->
++		fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_slice_dimension: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_slice_dimension: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_slice_dimension[IA_CSS_ROW_DIMENSION]);
++
++	/* slice count column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_slice_count: %d\n",
++		term_seq_info_desc->
++		fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_slice_count: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_slice_count: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_slice_count[IA_CSS_COL_DIMENSION]);
++
++	/* slice count row */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_slice_count: %d\n",
++		term_seq_info_desc->
++		fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_slice_count: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_slice_count: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_slice_count[IA_CSS_ROW_DIMENSION]);
++
++	/* decimation factor column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_point_decimation_factor: %d\n",
++		term_seq_info_desc->
++		fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_point_decimation_factor: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
++		);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_point_decimation_factor: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_point_decimation_factor[IA_CSS_COL_DIMENSION]
++		);
++
++	/* decimation factor row */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_point_decimation_factor: %d\n",
++		term_seq_info_desc->
++		fragment_grid_point_decimation_factor[IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_point_decimation_factor: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_point_decimation_factor[
++					IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_point_decimation_factor: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_point_decimation_factor[
++					IA_CSS_ROW_DIMENSION]);
++
++	/* index column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_overlay_pixel_topleft_index: %d\n",
++		term_seq_info_desc->
++		fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION]);
++
++	/* index row */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_overlay_pixel_topleft_index: %d\n",
++		term_seq_info_desc->
++		fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_overlay_pixel_topleft_index: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_overlay_pixel_topleft_index: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++
++	/* dimension column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_overlay_pixel_dimension: %d\n",
++		term_seq_info_desc->
++		fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_overlay_pixel_dimension: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_overlay_pixel_dimension: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION]);
++
++	/* dimension column */
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"fragment_grid_overlay_pixel_dimension: %d\n",
++		term_seq_info_desc->
++		fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"max_fragment_grid_overlay_pixel_dimension: %d\n",
++		man_seq_info_desc->
++		max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, VERBOSE,
++		"min_fragment_grid_overlay_pixel_dimension: %d\n",
++		man_seq_info_desc->
++		min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_program_terminal_valid(
++	const ia_css_terminal_t	*terminal,
++	const ia_css_terminal_manifest_t *terminal_manifest,
++	const uint16_t nof_fragments)
++{
++	DECLARE_ERRVAL
++	bool invalid_flag = false;
++	uint16_t frag_idx;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_program_terminal_valid enter\n");
++
++	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
++		uint16_t frag_seq_info_count, seq_idx;
++		const ia_css_program_terminal_t *prog_term;
++		const ia_css_program_terminal_manifest_t *prog_term_man;
++
++		prog_term = (const ia_css_program_terminal_t *)terminal;
++		prog_term_man =
++			(const ia_css_program_terminal_manifest_t *)
++			terminal_manifest;
++		frag_seq_info_count =
++			prog_term_man->
++			kernel_fragment_sequencer_info_manifest_info_count;
++
++		for (seq_idx = 0; seq_idx < frag_seq_info_count; seq_idx++) {
++			const ia_css_kernel_fragment_sequencer_info_desc_t
++			*term_seq_info_desc;
++			const
++			ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++			man_seq_info_desc;
++
++			term_seq_info_desc =
++		ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++					prog_term, frag_idx, seq_idx,
++					frag_seq_info_count);
++			verifexitval(term_seq_info_desc != NULL, EFAULT);
++			man_seq_info_desc =
++		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
++					(prog_term_man, seq_idx);
++			verifexitval(man_seq_info_desc != NULL, EFAULT);
++
++			ia_css_program_terminal_seq_info_print(
++				man_seq_info_desc, term_seq_info_desc);
++			/* slice dimension column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION]);
++
++			/* slice dimension row */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION]);
++
++			/* slice count column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION]);
++
++			/* slice count row */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION]);
++
++			/* decimation factor column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION]);
++
++			/* decimation factor row */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION]);
++
++			/* index column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION]);
++
++			/* index row */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++
++			/* dimension column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION]);
++
++			/* dimension column */
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION] >
++				man_seq_info_desc->
++				max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++			invalid_flag = invalid_flag ||
++				(term_seq_info_desc->
++				fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION] <
++				man_seq_info_desc->
++				min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++		}
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_program_terminal_valid() invalid argument\n");
++		return false;
++	}
++	if (invalid_flag == true) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_is_program_terminal_valid(): validation failed\n");
++		/* TODO: program terminal parameters not correctly defined,
++		 * disable validation result until issues has been solved
++		 */
++		return true;
++	}
++	return (!invalid_flag);
++}
++
++STORAGE_CLASS_INLINE bool ia_css_is_sliced_terminal_valid(
++	const ia_css_terminal_t *terminal,
++	const ia_css_terminal_manifest_t *terminal_manifest,
++	const uint16_t nof_fragments)
++{
++	DECLARE_ERRVAL
++	bool invalid_flag = false;
++	uint16_t frag_idx;
++
++	uint16_t slice_idx, section_idx;
++
++	const ia_css_sliced_param_terminal_t *sliced_term =
++		(const ia_css_sliced_param_terminal_t *)terminal;
++	verifexitval(sliced_term != NULL, EFAULT);
++	const ia_css_sliced_param_terminal_manifest_t *sliced_term_man =
++		(const ia_css_sliced_param_terminal_manifest_t *)
++		terminal_manifest;
++	verifexitval(sliced_term_man != NULL, EFAULT);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_sliced_terminal_valid enter\n");
++
++	for (frag_idx = 0; frag_idx < nof_fragments; frag_idx++) {
++		const ia_css_fragment_slice_desc_t *fragment_slice_desc =
++			ia_css_sliced_param_terminal_get_fragment_slice_desc(
++				sliced_term, frag_idx);
++
++		verifexitval(fragment_slice_desc != NULL, EFAULT);
++
++		for (slice_idx = 0;
++			slice_idx < fragment_slice_desc->slice_count;
++			slice_idx++) {
++			for (section_idx = 0;
++				section_idx <
++				sliced_term_man->sliced_param_section_count;
++				section_idx++) {
++				const
++				ia_css_sliced_param_manifest_section_desc_t *
++					slice_man_section_desc;
++				const ia_css_slice_param_section_desc_t *
++					slice_section_desc;
++
++				slice_man_section_desc =
++		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++						sliced_term_man, section_idx);
++				slice_section_desc =
++		ia_css_sliced_param_terminal_get_slice_param_section_desc(
++						sliced_term, frag_idx,
++						slice_idx, section_idx,
++						sliced_term_man->
++						sliced_param_section_count);
++				verifexitval(slice_man_section_desc != NULL, EFAULT);
++				verifexitval(slice_section_desc != NULL, EFAULT);
++
++				invalid_flag = invalid_flag ||
++					(slice_section_desc->mem_size >
++					slice_man_section_desc->max_mem_size);
++			}
++		}
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++				"ia_css_is_sliced_terminal_valid() invalid argument\n");
++		return false;
++	} else {
++		return (!invalid_flag);
++	}
++
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_valid(
++	const ia_css_terminal_t	*terminal,
++	const ia_css_terminal_manifest_t *terminal_manifest)
++{
++	DECLARE_ERRVAL
++	bool is_valid = false;
++	uint16_t nof_fragments;
++	ia_css_terminal_type_t terminal_type = IA_CSS_TERMINAL_INVALID_ID;
++
++	verifexitval(NULL != terminal, EFAULT);
++	verifexitval(NULL != terminal_manifest, EFAULT);
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_is_terminal_valid enter\n");
++
++	nof_fragments = ia_css_data_terminal_get_fragment_count(
++				(const ia_css_data_terminal_t *)terminal);
++	terminal_type = ia_css_terminal_get_type(terminal);
++
++	switch (terminal_type) {
++	case IA_CSS_TERMINAL_TYPE_DATA_IN:
++	case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++		is_valid = ia_css_is_data_terminal_valid(terminal,
++				terminal_manifest, nof_fragments);
++		break;
++	case IA_CSS_TERMINAL_TYPE_PROGRAM:
++		is_valid = ia_css_is_program_terminal_valid(terminal,
++				terminal_manifest, nof_fragments);
++		break;
++	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++	case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++	case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++		/* Nothing to be validated for cached and spatial
++		*  parameters, return valid
++		*/
++		is_valid = true;
++		break;
++	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++	case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++		is_valid = ia_css_is_sliced_terminal_valid(terminal,
++				terminal_manifest, nof_fragments);
++		break;
++	default:
++		/* Terminal type unknown, return invalid */
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_is_terminal_valid() Terminal type %x unknown\n",
++			(int)terminal_type);
++		is_valid = false;
++		break;
++	}
++
++EXIT:
++	if (haserror(EFAULT)) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_is_terminal_valid() invalid argument\n");
++		return false;
++	}
++	/* TODO: to be removed once all PGs pass validation */
++	if (is_valid == false) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++			"ia_css_is_terminal_valid(): type: %d validation failed\n",
++			terminal_type);
++	}
++	return is_valid;
++}
++
++/* ================= Program Control Init Terminal - START ================= */
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++int
++ia_css_program_control_init_terminal_init(
++	ia_css_program_control_init_terminal_t *terminal,
++	const ia_css_program_control_init_terminal_manifest_t *manifest,
++	const ia_css_program_group_manifest_t *pg_manifest,
++	ia_css_kernel_bitmap_t kernel_bitmap)
++{
++	int retval = -1;
++	unsigned int i;
++	unsigned int base_load_sec;
++	unsigned int base_connect_sec;
++	unsigned int load_index = 0;
++	unsigned int connect_index = 0;
++	unsigned int load_section_count = 0;
++	unsigned int connect_section_count = 0;
++
++	ia_css_program_control_init_manifest_program_desc_t *man_progs;
++	ia_css_program_manifest_t *prog_manifest;
++
++	verifjmpexit(terminal != NULL);
++
++	man_progs =
++	ia_css_program_control_init_terminal_manifest_get_program_desc(manifest, 0);
++	verifjmpexit(man_progs != NULL);
++
++	for (i = 0; i < manifest->program_count; i++) {
++		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++		verifjmpexit(prog_manifest != NULL);
++		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++			continue;
++		}
++		load_section_count += man_progs[i].load_section_count;
++		connect_section_count += man_progs[i].connect_section_count;
++	}
++
++	terminal->program_count = manifest->program_count;
++	terminal->program_section_desc_offset =
++		sizeof(ia_css_program_control_init_terminal_t);
++
++	base_load_sec = /* base_load_sec relative to first program */
++		terminal->program_count *
++		sizeof(ia_css_program_control_init_program_desc_t);
++
++	base_connect_sec = base_load_sec +
++		load_section_count *
++		sizeof(ia_css_program_control_init_load_section_desc_t);
++
++	for (i = 0; i < terminal->program_count; i++) {
++		ia_css_program_control_init_program_desc_t *prog;
++
++		prog = ia_css_program_control_init_terminal_get_program_desc(
++				terminal, i);
++		verifjmpexit(prog != NULL);
++
++		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++		verifjmpexit(prog_manifest != NULL);
++		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++			prog->load_section_count = 0;
++			prog->connect_section_count = 0;
++			prog->load_section_desc_offset = 0;
++			prog->connect_section_desc_offset  = 0;
++			continue;
++		}
++
++		prog->load_section_count = man_progs[i].load_section_count;
++		prog->connect_section_count = man_progs[i].connect_section_count;
++
++		prog->load_section_desc_offset =
++			base_load_sec +
++			load_index *
++			sizeof(ia_css_program_control_init_load_section_desc_t) -
++			i * sizeof(ia_css_program_control_init_program_desc_t);
++		prog->connect_section_desc_offset =
++			base_connect_sec +
++			connect_index *
++			sizeof(ia_css_program_control_init_connect_section_desc_t) -
++			i * sizeof(ia_css_program_control_init_program_desc_t);
++
++		load_index += man_progs[i].load_section_count;
++		connect_index += man_progs[i].connect_section_count;
++	}
++	retval = 0;
++EXIT:
++	return retval;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int
++ia_css_program_control_init_terminal_get_descriptor_size(
++		const ia_css_program_control_init_terminal_manifest_t *manifest,
++		const ia_css_program_group_manifest_t *pg_manifest,
++		ia_css_kernel_bitmap_t kernel_bitmap)
++{
++	unsigned int i;
++	unsigned size = 0;
++	unsigned load_section_count = 0;
++	unsigned connect_section_count = 0;
++	ia_css_program_control_init_manifest_program_desc_t *man_progs;
++	ia_css_program_manifest_t *prog_manifest;
++	verifjmpexit(manifest != NULL);
++
++	man_progs =
++		ia_css_program_control_init_terminal_manifest_get_program_desc(
++			manifest, 0);
++	verifjmpexit(man_progs != NULL);
++
++	for (i = 0; i < manifest->program_count; i++) {
++		prog_manifest = ia_css_program_group_manifest_get_prgrm_mnfst(pg_manifest, i);
++		verifjmpexit(prog_manifest != NULL);
++		if (!ia_css_process_group_is_program_enabled(prog_manifest, kernel_bitmap)) {
++			continue;
++		}
++		load_section_count += man_progs[i].load_section_count;
++		connect_section_count += man_progs[i].connect_section_count;
++	}
++
++	size = sizeof(ia_css_program_control_init_terminal_t) +
++		manifest->program_count *
++		sizeof(struct ia_css_program_control_init_program_desc_s) +
++		load_section_count *
++		sizeof(struct ia_css_program_control_init_load_section_desc_s) +
++		connect_section_count  *
++		sizeof(struct ia_css_program_control_init_connect_section_desc_s);
++EXIT:
++	return size;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++void ia_css_program_control_init_terminal_print(
++	const ia_css_program_control_init_terminal_t *terminal)
++{
++	unsigned int prog_idx, sec_idx;
++	ia_css_program_control_init_program_desc_t *prog;
++	ia_css_program_control_init_load_section_desc_t *load_sec;
++	ia_css_program_control_init_connect_section_desc_t *connect_sec;
++	unsigned mem_offset;
++	verifjmpexit(terminal != NULL);
++
++	IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++		"program_count: %d, payload_fragment_stride: %d\n",
++		terminal->program_count,
++		terminal->payload_fragment_stride);
++
++	for (prog_idx = 0; prog_idx < terminal->program_count; prog_idx++) {
++		prog = ia_css_program_control_init_terminal_get_program_desc(
++			terminal, prog_idx);
++		verifjmpexit(prog != NULL);
++		mem_offset = ia_css_program_control_init_terminal_get_load_section_mem_offset(prog);
++
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "program_idx: %d\n", prog_idx);
++		IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO, "\tprocess_id: %d, num_done_events: %d\n",
++			prog->control_info.process_id,
++			prog->control_info.num_done_events);
++
++		if (prog->load_section_count > 0) {
++			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tload_sections:\n");
++		}
++		for (sec_idx = 0; sec_idx < prog->load_section_count; sec_idx++) {
++			load_sec =
++				ia_css_program_control_init_terminal_get_load_section_desc(
++					prog, sec_idx);
++			verifjmpexit(load_sec != NULL);
++			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++				"\t\tdevice_descriptor_id: 0x%08x, mem_offset: %d, "
++				"mem_size: %d, mode_bitmask: %x\n",
++				load_sec->device_descriptor_id.data,
++				mem_offset,
++				load_sec->mem_size,
++				load_sec->mode_bitmask);
++			mem_offset += load_sec->mem_size;
++		}
++		if (prog->connect_section_count > 0) {
++			IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO, "\tconnect_sections:\n");
++		}
++		for (sec_idx = 0; sec_idx < prog->connect_section_count; sec_idx++) {
++			connect_sec =
++				ia_css_program_control_init_terminal_get_connect_section_desc(
++					prog, sec_idx);
++			verifjmpexit(connect_sec != NULL);
++			IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++				"\t\tdevice_descriptor_id: 0x%08x, "
++				"connect_terminal_ID: %d, connect_section_idx: %d, "
++				"mode_bitmask: %x\n",
++				connect_sec->device_descriptor_id.data,
++				connect_sec->connect_terminal_ID,
++				connect_sec->connect_section_idx,
++				connect_sec->mode_bitmask);
++		}
++	}
++EXIT:
++	return;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_program_desc_t *
++ia_css_program_control_init_terminal_get_program_desc(
++	const ia_css_program_control_init_terminal_t *prog_ctrl_init_terminal,
++	const unsigned int program_index)
++{
++	ia_css_program_control_init_program_desc_t *program_desc_base;
++	ia_css_program_control_init_program_desc_t *program_desc = NULL;
++
++	verifjmpexit(prog_ctrl_init_terminal != NULL);
++	verifjmpexit(program_index < prog_ctrl_init_terminal->program_count);
++
++	program_desc_base = (ia_css_program_control_init_program_desc_t *)
++		(((const char *)prog_ctrl_init_terminal) +
++		 prog_ctrl_init_terminal->program_section_desc_offset);
++	program_desc = &(program_desc_base[program_index]);
++
++EXIT:
++	return program_desc;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_process_id_t ia_css_program_control_init_terminal_get_process_id(
++	const ia_css_program_control_init_program_desc_t *program_desc)
++{
++	ia_css_process_id_t process_id = 0;
++
++	verifjmpexit(program_desc != NULL);
++
++	process_id = program_desc->control_info.process_id;
++
++EXIT:
++	return process_id;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++uint8_t ia_css_program_control_init_terminal_get_num_done_events(
++	const ia_css_program_control_init_program_desc_t *program_desc)
++{
++	uint8_t num_done_events = 0;
++
++	verifjmpexit(program_desc != NULL);
++
++	num_done_events = program_desc->control_info.num_done_events;
++
++EXIT:
++	return num_done_events;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++void ia_css_program_control_init_terminal_set_control_info(
++	ia_css_program_control_init_program_desc_t *program_desc,
++	ia_css_process_id_t process_id,
++	uint8_t num_done_events)
++{
++	verifjmpexit(program_desc != NULL);
++
++	program_desc->control_info.process_id = process_id;
++	program_desc->control_info.num_done_events = num_done_events;
++
++EXIT:
++	return;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_connect_section_count(
++	const ia_css_program_control_init_program_desc_t *program_desc)
++{
++	assert(program_desc != NULL);
++	return program_desc->connect_section_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_load_section_count(
++	const ia_css_program_control_init_program_desc_t *program_desc)
++{
++	assert(program_desc != NULL);
++	return program_desc->load_section_count;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++unsigned int ia_css_program_control_init_terminal_get_load_section_mem_offset(
++	const ia_css_program_control_init_program_desc_t *program_desc)
++{
++	assert(program_desc != NULL);
++	return program_desc->load_section_mem_offset;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_load_section_desc_t *
++ia_css_program_control_init_terminal_get_load_section_desc(
++	const ia_css_program_control_init_program_desc_t *program_desc,
++	const unsigned int load_section_index)
++{
++	ia_css_program_control_init_load_section_desc_t *load_section_desc_base;
++	ia_css_program_control_init_load_section_desc_t *load_section_desc = NULL;
++
++	verifjmpexit(program_desc != NULL);
++	verifjmpexit(load_section_index < program_desc->load_section_count);
++
++	load_section_desc_base = (ia_css_program_control_init_load_section_desc_t *)
++		(((const char *)program_desc) +
++		 program_desc->load_section_desc_offset);
++	load_section_desc = &(load_section_desc_base[load_section_index]);
++
++EXIT:
++	return load_section_desc;
++}
++
++IA_CSS_PSYS_DYNAMIC_STORAGE_CLASS_C
++ia_css_program_control_init_connect_section_desc_t *
++ia_css_program_control_init_terminal_get_connect_section_desc(
++	const ia_css_program_control_init_program_desc_t *program_desc,
++	const unsigned int connect_section_index)
++{
++	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc_base;
++	ia_css_program_control_init_connect_section_desc_t *connect_sec_desc = NULL;
++
++	verifjmpexit(program_desc != NULL);
++	verifjmpexit(connect_section_index < program_desc->connect_section_count);
++
++	connect_sec_desc_base =
++		(ia_css_program_control_init_connect_section_desc_t *)
++		(((const char *)program_desc) +
++		 program_desc->connect_section_desc_offset);
++	connect_sec_desc = &(connect_sec_desc_base[connect_section_index]);
++
++EXIT:
++	return connect_sec_desc;
++}
++
++/* ================= Program Control Init Terminal - END ================= */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
+new file mode 100644
+index 000000000000..7eb387fb5066
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.h
+@@ -0,0 +1,621 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal_manifest.h
++ *
++ * Define the methods on the terminal manifest object that are not part of a
++ * single interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++#include <ia_css_psys_terminal_manifest.sim.h>
++
++#include <ia_css_psys_terminal_manifest.hsys.user.h>
++
++#include <ia_css_program_group_data.h>	/* ia_css_frame_format_bitmap_t */
++#include <ia_css_kernel_bitmap.h>	/* ia_css_kernel_bitmap_t */
++
++#include <type_support.h>		/* size_t */
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_base_types.h"
++#include "ia_css_psys_static_storage_class.h"
++
++/*!
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++/*! Check if the terminal manifest object specifies a spatial param terminal
++ * type
++
++ @param [in]	manifest			terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Check if the terminal manifest object specifies a program terminal type
++
++ @param [in]	manifest			terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_program_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Check if the terminal manifest object specifies a program control init terminal type
++ *
++ * @param [in]	manifest			terminal manifest object
++ *
++ * @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_program_control_init_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Check if the terminal manifest object specifies a (cached) parameter
++ * terminal type
++
++ @param [in]	manifest			terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_parameter_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Check if the terminal manifest object specifies a (sliced) parameter
++ * terminal type
++
++ @param [in]	manifest			terminal manifest object
++
++ @return is_parameter_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_sliced_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Check if the terminal manifest object specifies a data terminal type
++
++ @param [in]	manifest			terminal manifest object
++
++ @return is_data_terminal, false on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_is_terminal_manifest_data_terminal(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Get the broad terminal category
++
++ @param	manifest[in]			terminal manifest object
++
++ @return Terminal category enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the broad terminal category
++
++ @param	manifest[in]			terminal manifest object
++ @param	category[in]			terminal category
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_category(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_cat_t category);
++
++/*! Get the direction of data flow for the terminal payload
++
++ @param	manifest[in]			terminal manifest object
++
++ @return Terminal direction enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the direction of data flow for the terminal payload
++
++ @param	manifest[in]			terminal manifest object
++ @param	direction[in]			terminal direction
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_direction(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_dir_t direction);
++
++/*! Get the Rate Of Update (ROU) for the terminal payload
++
++ @param	manifest[in]			terminal manifest object
++
++ @return Terminal rate-of-update enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the Rate Of Update (ROU) for the terminal payload
++
++ @param	manifest[in]			terminal manifest object
++ @param	rate_of_update[in]		terminal rate of update
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_rate_of_update(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_rou_t rate_of_update);
++
++/*! Get the buffer type for the connect terminal pointer
++
++ This function is intended for connect terminals only.  If called
++ on a load terminal, it will return IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
++
++ @param	manifest[in]			terminal manifest object
++
++ @return Connect terminal buffer type enum
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the buffer type for the connect terminal pointer
++
++  Load terminals must be set only to IA_CSS_CONNECT_BUF_TYPE_UNKNOWN
++
++ @param	manifest[in]			terminal manifest object
++
++ @return < 0 on invalid arguments
++
++  @note New for IPU7 POC
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_buffer_type(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_connect_buf_type_t connect_buf_type);
++
++/*! Get the stored size of the terminal manifest object
++
++ @param [in]	manifest			terminal manifest object
++
++ @return size, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++size_t ia_css_terminal_manifest_get_size(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Get the (pointer to) the program group manifest parent of the terminal
++ * manifest object
++
++ @param [in]	manifest			terminal manifest object
++
++ @return the pointer to the parent, NULL on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the (pointer to) the program group manifest parent of the terminal
++ * manifest object
++
++ @param [in]	manifest			terminal manifest object
++ @param	[in]	terminal_offset		this terminal's offset from
++					program_group_manifest base address.
++
++ @return < 0 on invalid arguments
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_parent_offset(
++	ia_css_terminal_manifest_t			*manifest,
++	int32_t						terminal_offset);
++
++/*! Get the type of the terminal manifest object
++
++ @param [in]	manifest			terminal manifest object
++
++ @return terminal type, limit value (IA_CSS_N_TERMINAL_TYPES) on invalid
++	manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the type of the terminal manifest object
++
++ @param [in]	manifest			terminal manifest object
++ @param	[in]	terminal_type		terminal type
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_type(
++	ia_css_terminal_manifest_t			*manifest,
++	const ia_css_terminal_type_t			terminal_type);
++
++/*! Set the ID of the terminal manifest object
++
++ @param [in]	manifest			terminal manifest object
++ @param	[in]	ID				terminal ID
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_ID(
++	ia_css_terminal_manifest_t			*manifest,
++	const ia_css_terminal_ID_t			ID);
++
++/*! Get the type of the terminal manifest object
++
++ @param [in]	manifest			terminal manifest object
++
++ @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Get the ID of the associated connection terminal
++
++  Only valid for load terminals.
++
++  @param	manifest[in]			terminal manifest object
++
++  @return  terminal id, IA_CSS_TERMINAL_INVALID_ID on invalid manifest argument
++  OR if there is no associated connect terminal
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
++	const ia_css_terminal_manifest_t		*manifest);
++
++/*! Set the ID of the associated connection terminal
++
++  Only valid for load terminals.
++
++  @param	manifest[in]			terminal manifest object
++  @param	ID[in]				terminal ID
++
++  @return < 0 on invalid manifest argument (including when
++  manifest describes a connect terminal, unless ID is
++  IA_CSS_TERMINAL_INVALID_ID)
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_ID(
++	ia_css_terminal_manifest_t			*manifest,
++	const ia_css_terminal_ID_t			ID);
++
++/*! Returns the maximum payload size for an instance of the terminal
++   described in a manifest entry.
++
++   The payload size is the sum of the sizes of all
++   parameter sections for load terminals, or the maximum buffer size
++   for connect terminals.
++
++   @param manifest[in] Terminal manifest handle
++
++   @return Maximum size in bytes of the terminal payload
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_terminal_manifest_get_max_payload_size(
++	const ia_css_terminal_manifest_t *manifest);
++
++/*! Returns the maximum payload size for an instance of the terminal
++   described in a manifest entry.
++
++   The payload size is the sum of the sizes of all
++   parameter sections for load terminals, or the maximum buffer size
++   for connect terminals.
++
++   @param manifest[in] Terminal manifest handle
++   @param max_payload_size[in] Maximum payload size
++
++  @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_max_payload_size(
++	ia_css_terminal_manifest_t			*manifest,
++	uint32_t 							max_payload_size);
++
++/*! Get the supported frame types of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++
++ @return frame format bitmap, 0 on invalid manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_frame_format_bitmap_t
++	ia_css_data_terminal_manifest_get_frame_format_bitmap(
++		const ia_css_data_terminal_manifest_t		*manifest);
++
++/*! Set the chosen frame type for the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	bitmap			frame format bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_frame_format_bitmap(
++	ia_css_data_terminal_manifest_t			*manifest,
++	ia_css_frame_format_bitmap_t			bitmap);
++
++/*! Check if the (data) terminal manifest object supports compression
++
++ @param [in]	manifest			(data) terminal manifest object
++
++ @return compression_support, true if compression is supported
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++bool ia_css_data_terminal_manifest_can_support_compression(
++	const ia_css_data_terminal_manifest_t		*manifest);
++
++/*! Set the compression support feature of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	compression_support		set true to support compression
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_compression_support(
++	ia_css_data_terminal_manifest_t			*manifest,
++	bool						compression_support);
++
++/*! Set the supported connection types of the terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	bitmap			connection bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_connection_bitmap(
++	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap);
++
++/*! Get the connection bitmap of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++
++ @return connection bitmap, 0 on invalid manifest argument
++*/
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
++		const ia_css_data_terminal_manifest_t		*manifest);
++
++/*! Get the kernel dependency of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++
++ @return kernel bitmap, 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
++	const ia_css_data_terminal_manifest_t		*manifest);
++
++/*! Set the kernel dependency of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	kernel_bitmap		kernel dependency bitmap
++
++ @return < 0 on invalid manifest argument
++ */
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_data_terminal_manifest_set_kernel_bitmap(
++	ia_css_data_terminal_manifest_t			*manifest,
++	const ia_css_kernel_bitmap_t			kernel_bitmap);
++
++/*! Set the unique kernel dependency of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	index			kernel dependency bitmap index
++
++ @return < 0 on invalid argument(s)
++ */
++extern int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
++	ia_css_data_terminal_manifest_t			*manifest,
++	const unsigned int				index);
++
++/*! Set the min size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	min_size			Minimum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_set_min_size(
++	ia_css_data_terminal_manifest_t *manifest,
++	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the max size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	max_size			Maximum size of the frame array
++
++  @return < 0 on invalid manifest argument
++  */
++extern int ia_css_data_terminal_manifest_set_max_size(
++	ia_css_data_terminal_manifest_t *manifest,
++	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the min size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	min_size			Minimum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_min_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the max size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	max_size			Maximum size of the frame array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_max_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the min fragment size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	min_size			Minimum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_set_min_fragment_size(
++	ia_css_data_terminal_manifest_t *manifest,
++	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Set the max fragment size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	max_size			Maximum size of the fragment array
++
++  @return < 0 on invalid manifest argument
++  */
++extern int ia_css_data_terminal_manifest_set_max_fragment_size(
++	ia_css_data_terminal_manifest_t *manifest,
++	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the min fragment size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	min_size			Minimum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_min_fragment_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t min_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*! Get the max fragment size of the (data) terminal manifest object
++
++ @param [in]	manifest			(data) terminal manifest object
++ @param	[in]	max_size			Maximum size of the fragment array
++
++ @return < 0 on invalid manifest argument
++ */
++extern int ia_css_data_terminal_manifest_get_max_fragment_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t max_size[IA_CSS_N_DATA_DIMENSION]);
++
++/*!
++ * Get the program control init connect section count for program prog.
++ * @param [in] prog program control init terminal program desc
++ * @return number of connect section for program prog.
++ */
++
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
++	const ia_css_program_control_init_manifest_program_desc_t *prog);
++
++/*!
++ * Get the program control init load section count for program prog.
++ * @param [in] prog program control init terminal program desc
++ * @return number of load section for program prog.
++ */
++
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
++	const ia_css_program_control_init_manifest_program_desc_t *prog);
++
++/*!
++ * Get the program control init terminal manifest size.
++ * @param [in] nof_programs		Number of programs.
++ * @param [in] nof_load_sections		Array of size nof_programs,
++ *					encoding the number of load sections.
++ * @param [in] nof_connect_sections	Array of size nof_programs,
++ *					encoding the number of connect sections.
++ * @return < 0 on invalid manifest argument
++ */
++extern
++unsigned int ia_css_program_control_init_terminal_manifest_get_size(
++	const uint16_t nof_programs,
++	const uint16_t *nof_load_sections,
++	const uint16_t *nof_connect_sections);
++
++/*!
++ * Get the program control init terminal manifest program desc.
++ * @param [in] terminal		Program control init terminal.
++ * @param [in] program		Number of programs.
++ * @return program control init terminal program desc (or NULL if error).
++ */
++extern
++ia_css_program_control_init_manifest_program_desc_t *
++ia_css_program_control_init_terminal_manifest_get_program_desc(
++	const ia_css_program_control_init_terminal_manifest_t *terminal,
++	unsigned int program);
++
++/*!
++ * Initialize the program control init terminal manifest.
++ * @param [in] nof_programs		Number of programs
++ * @param [in] nof_load_sections		Array of size nof_programs,
++ *					encoding the number of load sections.
++ * @param [in] nof_connect_sections	Array of size nof_programs,
++ *					encoding the number of connect sections.
++ * @return < 0 on invalid manifest argument
++ */
++extern
++int ia_css_program_control_init_terminal_manifest_init(
++	ia_css_program_control_init_terminal_manifest_t *terminal,
++	const uint16_t nof_programs,
++	const uint16_t *nof_load_sections,
++	const uint16_t *nof_connect_sections);
++
++/*!
++ * Pretty prints the program control init terminal manifest.
++ * @param [in] terminal		Program control init terminal.
++ */
++extern
++void ia_css_program_control_init_terminal_manifest_print(
++	ia_css_program_control_init_terminal_manifest_t *terminal);
++
++#ifdef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_terminal_manifest_impl.h"
++#endif
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
+new file mode 100644
+index 000000000000..9994318d4e33
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.hsys.user.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal.hsys.user.h
++ *
++ * Define the methods on the termianl manifest object: Hsys user interface
++ */
++
++#include <ia_css_psys_manifest_types.h>
++
++/*! Print the terminal manifest object to file/stream
++
++ @param	manifest[in]			terminal manifest object
++ @param	fid[out]				file/stream handle
++
++ @return < 0 on error
++ */
++extern int ia_css_terminal_manifest_print(
++	const ia_css_terminal_manifest_t	*manifest,
++	void					*fid);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_HSYS_USER_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
+new file mode 100644
+index 000000000000..7c1c6849b1c9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest.sim.h
+@@ -0,0 +1,50 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H
++
++/*! \file */
++
++/** @file ia_css_psys_terminal_manifest.sim.h
++ *
++ * Define the methods on the terminal manifest object: Simulation only
++ */
++
++#include <type_support.h>					/* size_t */
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_defs.h"
++
++/*! Create (the storage for) the terminal manifest object
++
++ @param	terminal_type[in]	type of the terminal manifest {parameter, data}
++
++ @return NULL on error
++ */
++extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_alloc(
++	const ia_css_terminal_type_t			terminal_type);
++
++/*! Destroy (the storage of) the terminal manifest object
++
++ @param	manifest[in]			terminal manifest
++
++ @return NULL
++ */
++extern ia_css_terminal_manifest_t *ia_css_terminal_manifest_free(
++	ia_css_terminal_manifest_t				*manifest);
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_SIM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
+new file mode 100644
+index 000000000000..eb30acd7045d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_manifest_impl.h
+@@ -0,0 +1,745 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
++#define __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H
++
++#include <ia_css_psys_terminal_manifest.h>
++
++/* Data object types on the terminals */
++#include <ia_css_program_group_data.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
++#include <ia_css_kernel_bitmap.h>
++
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#include <error_support.h>
++#include <print_support.h>
++#include <misc_support.h>
++#include "ia_css_psys_static_trace.h"
++#include "ia_css_psys_static_storage_class.h"
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_spatial_parameter_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_program_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_program_control_init_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_program_control_init_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_parameter_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	/* will return an error value on error */
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_parameter_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT);
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_data_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	/* will return an error value on error */
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_data_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++		(terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_is_terminal_manifest_sliced_terminal(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_type_t terminal_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_terminal_manifest_sliced_terminal(): enter:\n");
++
++	terminal_type = ia_css_terminal_manifest_get_type(manifest);
++
++	return ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN) ||
++		(terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++size_t ia_css_terminal_manifest_get_size(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	size_t size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_size(): enter:\n");
++
++	if (manifest != NULL) {
++		size = manifest->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_terminal_manifest_get_size: invalid argument\n");
++	}
++	return size;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_type_t ia_css_terminal_manifest_get_type(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_type_t terminal_type = IA_CSS_N_TERMINAL_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_type(): enter:\n");
++
++	if (manifest != NULL) {
++		terminal_type = manifest->terminal_type;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_terminal_manifest_get_type: invalid argument\n");
++	}
++	return terminal_type;
++}
++
++/** Temporary implementation of attributes based on terminal type ID
++ *
++ *  A later implementation in the PG manifest generator tool will
++ *  replace this and thus remove the dependency on the legacy
++ *  terminal type.
++ */
++static void ia_css_terminal_manifest_set_attributes_by_type(
++	ia_css_terminal_manifest_t *manifest,
++	const ia_css_terminal_type_t terminal_type)
++{
++	/* Set defaults for most cases, and change in the later code for the rest. */
++	ia_css_terminal_cat_t category = IA_CSS_TERMINAL_CAT_LOAD;
++	ia_css_terminal_dir_t direction = IA_CSS_TERMINAL_DIR_IN;
++	ia_css_terminal_rou_t rou = IA_CSS_TERMINAL_ROU_FRAME;
++	ia_css_connect_buf_type_t connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_UNKNOWN;
++
++	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
++		category = IA_CSS_TERMINAL_CAT_CONNECT;
++	}
++	ia_css_terminal_manifest_set_category(manifest, category);
++
++	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_STATE_OUT)) {
++		direction = IA_CSS_TERMINAL_DIR_OUT;
++	}
++	ia_css_terminal_manifest_set_direction(manifest, direction);
++
++	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
++		rou = IA_CSS_TERMINAL_ROU_FRAG;
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++			rou = IA_CSS_TERMINAL_ROU_STREAM;
++	}
++	ia_css_terminal_manifest_set_rate_of_update(manifest, rou);
++
++	if ((terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN) ||
++		 (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT)) {
++		connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_DATA;
++	} else if ((terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN) ||
++			 (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT)) {
++			connect_buf_type = IA_CSS_CONNECT_BUF_TYPE_META;
++	}
++	ia_css_terminal_manifest_set_connect_buffer_type(manifest, connect_buf_type);
++}
++
++/** Temporary implementation for new fields until the manfifest generator
++ *  tool will be enhance to set values directly.
++ *
++ *  - Attibutes are set to meaningful values by mapping terminal type to
++ *  attributes
++ *  - connect_ID is set to the invalid terminal ID value: IA_CSS_TERMINAL_INVALID_ID
++ *  - max_payload_size is set to UINT32_MAX
++ */
++static void ia_css_terminal_manifest_set_new_fields(
++	ia_css_terminal_manifest_t *manifest,
++	const ia_css_terminal_type_t terminal_type)
++{
++	ia_css_terminal_manifest_set_attributes_by_type(manifest, terminal_type);
++	assert(ia_css_terminal_manifest_set_connect_ID(manifest, IA_CSS_TERMINAL_INVALID_ID));
++	assert(ia_css_terminal_manifest_set_max_payload_size(manifest, UINT32_MAX));
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_type(
++	ia_css_terminal_manifest_t *manifest,
++	const ia_css_terminal_type_t terminal_type)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_type(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->terminal_type = terminal_type;
++		ia_css_terminal_manifest_set_new_fields(manifest, terminal_type);
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_type failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_ID(
++	ia_css_terminal_manifest_t *manifest,
++	const ia_css_terminal_ID_t ID)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->ID = ID;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_ID failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_ID(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_ID_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = manifest->ID;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_ID failed\n");
++		retval = IA_CSS_TERMINAL_INVALID_ID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_ID_t ia_css_terminal_manifest_get_connect_ID(
++	const ia_css_terminal_manifest_t		*manifest)
++{
++	ia_css_terminal_ID_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_connect_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = manifest->assoc_ID;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_connect_ID failed\n");
++		retval = IA_CSS_TERMINAL_INVALID_ID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_cat_t ia_css_terminal_manifest_get_category(
++	const ia_css_terminal_manifest_t		*manifest)
++{
++	ia_css_terminal_cat_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_category(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = (ia_css_terminal_cat_t)manifest->attributes.category;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_category failed\n");
++		retval = IA_CSS_TERMINAL_CAT_INVALID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_category(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_cat_t category)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_category(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->attributes.category = category;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_category failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_dir_t ia_css_terminal_manifest_get_direction(
++	const ia_css_terminal_manifest_t		*manifest)
++{
++	ia_css_terminal_dir_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_direction(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = (ia_css_terminal_dir_t)manifest->attributes.direction;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_direction failed\n");
++		retval = IA_CSS_TERMINAL_DIR_INVALID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_direction(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_dir_t direction)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_direction(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->attributes.direction = direction;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_direction failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_terminal_rou_t ia_css_terminal_manifest_get_rate_of_update(
++	const ia_css_terminal_manifest_t		*manifest)
++{
++	ia_css_terminal_rou_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_rate_of_update(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = (ia_css_terminal_rou_t)manifest->attributes.rou;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_rate_of_update failed\n");
++		retval = IA_CSS_TERMINAL_ROU_INVALID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_rate_of_update(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_terminal_rou_t rate_of_update)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_rate_of_update(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->attributes.rou = rate_of_update;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_rate_of_update failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++ia_css_connect_buf_type_t ia_css_terminal_manifest_get_connect_buffer_type(
++	const ia_css_terminal_manifest_t		*manifest)
++{
++	ia_css_connect_buf_type_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_connect_buffer_type(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = (ia_css_connect_buf_type_t)manifest->attributes.connect_buf_type;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_connect_buffer_type failed\n");
++		retval = IA_CSS_CONNECT_BUF_TYPE_INVALID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_buffer_type(
++	ia_css_terminal_manifest_t		*manifest,
++	ia_css_connect_buf_type_t connect_buf_type)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_connect_buffer_type(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->attributes.connect_buf_type = connect_buf_type;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_connect_buffer_type failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_connect_ID(
++	ia_css_terminal_manifest_t			*manifest,
++	const ia_css_terminal_ID_t			ID)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_connect_ID(): enter:\n");
++
++	if (manifest != NULL &&
++		((IA_CSS_TERMINAL_CAT_LOAD == ia_css_terminal_manifest_get_category(manifest)) ||
++		(IA_CSS_TERMINAL_INVALID_ID == ID))) {
++		manifest->assoc_ID = ID;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_connect_ID failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_terminal_manifest_get_max_payload_size(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_terminal_ID_t retval;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_max_payload_size(): enter:\n");
++
++	if (manifest != NULL) {
++		retval = manifest->max_payload_size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_get_max_payload_size failed\n");
++		retval = IA_CSS_TERMINAL_INVALID_ID;
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_H
++int ia_css_terminal_manifest_set_max_payload_size(
++	ia_css_terminal_manifest_t			*manifest,
++	uint32_t 							max_payload_size)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_max_payload_size(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->max_payload_size = max_payload_size;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_max_payload_size failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_program_group_manifest_t *ia_css_terminal_manifest_get_parent(
++	const ia_css_terminal_manifest_t *manifest)
++{
++	ia_css_program_group_manifest_t	*parent = NULL;
++	char *base;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_get_parent(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	base = (char *)((char *)manifest + manifest->parent_offset);
++
++	parent = (ia_css_program_group_manifest_t *)(base);
++EXIT:
++	return parent;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_terminal_manifest_set_parent_offset(
++	ia_css_terminal_manifest_t *manifest,
++	int32_t terminal_offset)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_terminal_manifest_set_parent_offset(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	/* parent is at negative offset away from current terminal offset*/
++	manifest->parent_offset = -terminal_offset;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_set_parent_offset failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C ia_css_frame_format_bitmap_t
++ia_css_data_terminal_manifest_get_frame_format_bitmap(
++	const ia_css_data_terminal_manifest_t *manifest)
++{
++	ia_css_frame_format_bitmap_t bitmap = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_frame_format_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		bitmap = manifest->frame_format_bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_data_terminal_manifest_get_frame_format_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_frame_format_bitmap(
++	ia_css_data_terminal_manifest_t *manifest,
++	ia_css_frame_format_bitmap_t bitmap)
++{
++	int ret = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_frame_format_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->frame_format_bitmap = bitmap;
++		ret = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_frame_format_bitmap failed (%i)\n",
++			ret);
++	}
++
++	return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++bool ia_css_data_terminal_manifest_can_support_compression(
++	const ia_css_data_terminal_manifest_t *manifest)
++{
++	bool compression_support = false;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_compression_support(): enter:\n");
++
++	if (manifest != NULL) {
++		/* compression_support is used boolean encoded in uint8_t.
++		 * So we only need to check
++		 * if this is non-zero
++		 */
++		compression_support = (manifest->compression_support != 0);
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_can_support_compression invalid argument\n");
++	}
++
++	return compression_support;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_compression_support(
++	ia_css_data_terminal_manifest_t *manifest,
++	bool compression_support)
++{
++	int ret = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_compression_support(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->compression_support =
++			(compression_support == true) ? 1 : 0;
++		ret = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_compression_support failed (%i)\n",
++			ret);
++	}
++
++	return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_connection_bitmap_t ia_css_data_terminal_manifest_get_connection_bitmap(
++	const ia_css_data_terminal_manifest_t *manifest)
++{
++	ia_css_connection_bitmap_t connection_bitmap = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_connection_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		connection_bitmap = manifest->connection_bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_data_terminal_manifest_get_connection_bitmap invalid argument\n");
++	}
++	return connection_bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_connection_bitmap(
++	ia_css_data_terminal_manifest_t *manifest, ia_css_connection_bitmap_t bitmap)
++{
++	int ret = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_connection_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		assert(bitmap != 0); /* zero means there is no connection, this is invalid. */
++		assert((bitmap >> IA_CSS_N_CONNECTION_TYPES) == 0);
++
++		manifest->connection_bitmap = bitmap;
++		ret = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_data_terminal_manifest_set_connection_bitmap invalid argument\n");
++	}
++	return ret;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++ia_css_kernel_bitmap_t ia_css_data_terminal_manifest_get_kernel_bitmap(
++	const ia_css_data_terminal_manifest_t *manifest)
++{
++	ia_css_kernel_bitmap_t kernel_bitmap = ia_css_kernel_bitmap_clear();
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_kernel_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		kernel_bitmap = manifest->kernel_bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_data_terminal_manifest_get_kernel_bitmap: invalid argument\n");
++	}
++	return kernel_bitmap;
++}
++
++IA_CSS_PSYS_STATIC_STORAGE_CLASS_C
++int ia_css_data_terminal_manifest_set_kernel_bitmap(
++	ia_css_data_terminal_manifest_t	*manifest,
++	const ia_css_kernel_bitmap_t kernel_bitmap)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_kernel_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->kernel_bitmap = kernel_bitmap;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_kernel_bitmap: failed (%i)\n",
++			retval);
++	}
++
++	return retval;
++}
++
++#endif /* __IA_CSS_PSYS_TERMINAL_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
+new file mode 100644
+index 000000000000..366623cdd72d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_terminal_private_types.h
+@@ -0,0 +1,102 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
++#define __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H
++
++#include "ia_css_terminal_types.h"
++#include "ia_css_program_group_data.h"
++#include "ia_css_psys_manifest_types.h"
++
++#define	N_UINT16_IN_DATA_TERMINAL_STRUCT	2
++#define	N_UINT8_IN_DATA_TERMINAL_STRUCT		3
++#define	N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT	1
++
++/* ========================= Data terminal - START ========================= */
++
++#define SIZE_OF_DATA_TERMINAL_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_FRAME_DESCRIPTOR_STRUCT_BITS \
++	+ IA_CSS_FRAME_STRUCT_BITS \
++	+ IA_CSS_STREAM_STRUCT_BITS \
++	+ IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_CONNECTION_TYPE_BITS \
++	+ (N_UINT16_IN_DATA_TERMINAL_STRUCT * 16) \
++	+ (N_UINT8_IN_DATA_TERMINAL_STRUCT * 8)	\
++	+ (N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT * 8))
++
++/**
++ * The (data) terminal can be attached to a buffer or a stream.
++ * The stream interface is not necessarily limited to strict in-order access.
++ * For a stream the restriction is that contrary to a buffer it cannot be
++ * addressed directly, i.e. it behaves as a port,
++ * but it may support stream_pos() and/or seek() operations
++ */
++struct ia_css_data_terminal_s {
++	/** Data terminal base class */
++	ia_css_terminal_t base;
++	/** Properties of the image data attached to the terminal */
++	ia_css_frame_descriptor_t frame_descriptor;
++	/** Data buffer handle attached to the terminal */
++	ia_css_frame_t frame;
++	/** (exclusive) Data stream handle attached to the terminal
++	 * if the data is sourced over a device port
++	 *
++	 * @note No known use of the field.
++	 */
++	ia_css_stream_t stream;
++	/** Reserved
++	* @note No known intent for this reservation field. */
++	uint32_t reserved;
++	/** Tranfer method for send/receving data to/from this terminal. */
++	ia_css_connection_type_t connection_type;
++	/** Offset in bytes from the start of this structure to a Array[fragment_count] of
++	 *  type "ia_css_fragment_descriptor_t", aligned to a 64 bit boundary.
++	 *  (fragment_count being equal for all terminals in a subgraph) of fragment descriptors
++	 */
++	uint16_t fragment_descriptor_offset;
++	/** Size of streaming to GEN buffer in lines. This field will be used only
++	 *  at streaming use-case (connection type != IA_CSS_CONNECTION_MEMORY)
++	 */
++	uint16_t stream2gen_buffer_size;
++	/** Kernel id that this terminal is associated with.  If that kernel
++	 *  is disabled, this terminal is considered disabled as well.
++	 *  Must be set the single kernel defined in the manifest for this terminal's
++	 *  ID (ia_css_terminal_s::ID). */
++	uint8_t kernel_id;
++	/** Indicate to which subgraph this terminal belongs
++	 * for common constraints
++	 *
++	 * @note No known use.
++	 */
++	uint8_t subgraph_id;
++	/** Link ID of the data terminal.  Two terminals can optionally be
++	 *  marked as linked to each other by setting the same link ID.
++	 *  Hardware topology or logical or algorithmic constraints may restrict the
++	 *  terminal that can be so linked.
++	 *  In current practice, link ID's have special meaning related to
++	 *  the connection type (see "connection_type" field in this structure) or
++	 *  synchronization of program groups.
++	 *  @see ia_css_isys_link_id_t
++	 *  @see ia_css_data_barrier_link_id_t
++	 *  @see ia_css_stream2gen_link_id_t */
++	uint8_t link_id;
++	/** Padding for 64bit alignment */
++	uint8_t padding[N_PADDING_UINT8_IN_DATA_TERMINAL_STRUCT];
++};
++/* ========================== Data terminal - END ========================== */
++
++#endif /* __IA_CSS_PSYS_TERMINAL_PRIVATE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
+new file mode 100644
+index 000000000000..da96da317016
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TRANSPORT_H
++#define __IA_CSS_PSYS_TRANSPORT_H
++
++#include <ia_css_psys_transport_dep.h>		/* ia_css_psys_cmd_queues */
++#include <vied_nci_psys_system_global.h>	/* vied_vaddress_t */
++
++#include <type_support.h>
++
++typedef enum ia_css_psys_event_queues {
++	/** The in-order queue for event returns */
++	IA_CSS_PSYS_EVENT_QUEUE_MAIN_ID,
++	IA_CSS_N_PSYS_EVENT_QUEUE_ID
++} ia_css_psys_event_queue_ID_t;
++
++typedef enum ia_css_psys_event_types {
++	/** No error to report. */
++	IA_CSS_PSYS_EVENT_TYPE_SUCCESS = 0,
++	/** Unknown unhandled error */
++	IA_CSS_PSYS_EVENT_TYPE_UNKNOWN_ERROR = 1,
++	/* Retrieving remote object: */
++	/** Object ID not found */
++	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NOT_FOUND = 2,
++	/** Objects too big, or size is zero. */
++	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_TOO_BIG = 3,
++	/** Failed to load whole process group from tproxy/dma  */
++	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_DDR_TRANS_ERR = 4,
++	/** The proper package could not be found */
++	IA_CSS_PSYS_EVENT_TYPE_RET_REM_OBJ_NULL_PKG_DIR_ADDR = 5,
++	/* Process group: */
++	/** Failed to run, error while loading frame */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAME_ERR = 6,
++	/** Failed to run, error while loading fragment */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_LOAD_FRAGMENT_ERR = 7,
++	/** The process count of the process group is zero */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_COUNT_ZERO = 8,
++	/** Process(es) initialization */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_PROCESS_INIT_ERR = 9,
++	/** Aborted (after host request) */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_ABORT = 10,
++	/** NULL pointer in the process group */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_NULL = 11,
++	/** Process group validation failed */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_VALIDATION_ERR = 12,
++	/** Error handling- invalid frame detected by CSI (ISYS) */
++	IA_CSS_PSYS_EVENT_TYPE_PROC_GRP_INVALID_FRAME = 13
++} ia_css_psys_event_type_t;
++
++#define IA_CSS_PSYS_CMD_BITS	64
++struct ia_css_psys_cmd_s {
++	/** The command issued to the process group */
++	uint16_t	command;
++	/** Message field of the command */
++	uint16_t	msg;
++	/** The context reference (process group/buffer set/...) */
++	uint32_t	context_handle;
++};
++
++#define IA_CSS_PSYS_EVENT_BITS	128
++typedef struct ia_css_psys_event_s {
++	/** The (return) status of the command issued to
++	 * the process group this event refers to
++	 */
++	uint16_t	status;
++	/** The command issued to the process group this event refers to */
++	uint16_t	command;
++	/** The context reference (process group/buffer set/...) */
++	uint32_t	context_handle;
++	/** This token (size) must match the token registered
++	 * in a process group
++	 */
++	uint64_t	token;
++} ia_css_psys_event_s_t;
++
++struct ia_css_psys_buffer_s {
++	/** The in-order queue for scheduled process groups */
++	void		*host_buffer;
++	vied_vaddress_t	*isp_buffer;
++};
++
++#endif /* __IA_CSS_PSYS_TRANSPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
+new file mode 100644
+index 000000000000..3c8e1abe41e1
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psys_transport_dep.h
+@@ -0,0 +1,47 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYS_TRANSPORT_DEP_H
++#define __IA_CSS_PSYS_TRANSPORT_DEP_H
++
++/*
++ * The ID's of the Psys specific queues.
++ */
++typedef enum ia_css_psys_cmd_queues {
++	/**< The in-order queue for scheduled process groups */
++	IA_CSS_PSYS_CMD_QUEUE_COMMAND_ID = 0,
++	/**< The in-order queue for commands changing psys or
++	 * process group state
++	 */
++	IA_CSS_PSYS_CMD_QUEUE_DEVICE_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG0_COMMAND_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG1_COMMAND_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG2_COMMAND_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG3_COMMAND_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG4_COMMAND_ID,
++	/**< An in-order queue for dedicated PPG commands */
++	IA_CSS_PSYS_CMD_QUEUE_PPG5_COMMAND_ID,
++	IA_CSS_N_PSYS_CMD_QUEUE_ID
++} ia_css_psys_cmd_queue_ID_t;
++
++#define IA_CSS_PSYS_LATE_BINDING_QUEUE_OFFSET 1
++
++#endif /* __IA_CSS_PSYS_TRANSPORT_DEP_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
+new file mode 100644
+index 000000000000..9033b8d1a19a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi.h
+@@ -0,0 +1,25 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_H
++#define __IA_CSS_PSYSAPI_H
++
++#include <ia_css_psys_process.hsys.user.h>
++#include <ia_css_psys_process.hsys.kernel.h>
++#include <ia_css_psys_process_group.hsys.user.h>
++#include <ia_css_psys_process_group.hsys.kernel.h>
++
++#endif /* __IA_CSS_PSYSAPI_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
+new file mode 100644
+index 000000000000..f9c30a40a5dc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_fw_version.h
+@@ -0,0 +1,35 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_FW_VERSION_H
++#define __IA_CSS_PSYSAPI_FW_VERSION_H
++
++/* PSYSAPI FW VERSION is taken from Makefile for FW tests */
++#define BXT_FW_RELEASE_VERSION PSYS_FIRMWARE_VERSION
++
++enum ia_css_process_group_protocol_version {
++	/**
++	 * Legacy protocol
++	 */
++	IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY = 0,
++	/**
++	 * Persistent process group support protocol
++	 */
++	IA_CSS_PROCESS_GROUP_PROTOCOL_PPG,
++	IA_CSS_PROCESS_GROUP_N_PROTOCOLS
++};
++
++#endif /* __IA_CSS_PSYSAPI_FW_VERSION_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
+new file mode 100644
+index 000000000000..0369bcfe9388
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_psysapi_trace.h
+@@ -0,0 +1,80 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_PSYSAPI_TRACE_H
++#define __IA_CSS_PSYSAPI_TRACE_H
++
++#include "ia_css_trace.h"
++
++#define PSYSAPI_TRACE_LOG_LEVEL_OFF 0
++#define PSYSAPI_TRACE_LOG_LEVEL_NORMAL 1
++#define PSYSAPI_TRACE_LOG_LEVEL_DEBUG 2
++
++/* PSYSAPI and all the submodules in PSYSAPI will have the default tracing
++ * level set to the PSYSAPI_TRACE_CONFIG level. If not defined in the
++ * psysapi.mk fill it will be set by default to no trace
++ * (PSYSAPI_TRACE_LOG_LEVEL_OFF)
++ */
++#define PSYSAPI_TRACE_CONFIG_DEFAULT PSYSAPI_TRACE_LOG_LEVEL_OFF
++
++#if !defined(PSYSAPI_TRACE_CONFIG)
++	#define PSYSAPI_TRACE_CONFIG PSYSAPI_TRACE_CONFIG_DEFAULT
++#endif
++
++/* Module specific trace setting will be used if
++ * the trace level is not specified from the module or
++  PSYSAPI_TRACING_OVERRIDE is defined
++ */
++#if (defined(PSYSAPI_TRACE_CONFIG))
++	/* Module specific trace setting */
++	#if PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_OFF
++		/* PSYSAPI_TRACE_LOG_LEVEL_OFF */
++		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_NORMAL
++		/* PSYSAPI_TRACE_LOG_LEVEL_NORMAL */
++		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_DISABLED
++		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_DISABLED
++	#elif PSYSAPI_TRACE_CONFIG == PSYSAPI_TRACE_LOG_LEVEL_DEBUG
++		/* PSYSAPI_TRACE_LOG_LEVEL_DEBUG */
++		#define PSYSAPI_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++		#define PSYSAPI_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_ERROR IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_WARNING IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_INFO IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_DEBUG IA_CSS_TRACE_LEVEL_ENABLED
++		#define PSYSAPI_TRACE_LEVEL_VERBOSE IA_CSS_TRACE_LEVEL_ENABLED
++	#else
++		#error "No PSYSAPI_TRACE_CONFIG Tracing level defined"
++	#endif
++#else
++	#error "PSYSAPI_TRACE_CONFIG not defined"
++#endif
++
++/* Overriding submodules in PSYSAPI with a specific tracing level */
++/* #define PSYSAPI_DYNAMIC_TRACING_OVERRIDE TRACE_LOG_LEVEL_VERBOSE */
++
++#endif /* __IA_CSS_PSYSAPI_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
+new file mode 100644
+index 000000000000..06ccb0738415
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm.h
+@@ -0,0 +1,199 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_H
++#define __IA_CSS_RBM_H
++
++#include "ia_css_rbm_storage_class.h"
++#include <type_support.h>
++
++/*
++ * IPU6 adds a lot of mux/demux/blk,
++ * 96 bits is not enough
++ * need 160 bits (has to multiply of 32 bits)
++ * after X2B / DOL / PAF enabled in isa_lb PG
++ */
++#define IA_CSS_RBM_BITS 160
++/** An element is a 32 bit unsigned integer. 64 bit integers might cause
++ * problems in the compiler.
++ */
++#define IA_CSS_RBM_ELEM_TYPE uint32_t
++#define IA_CSS_RBM_ELEM_BITS \
++	(sizeof(IA_CSS_RBM_ELEM_TYPE)*8)
++#define IA_CSS_RBM_NOF_ELEMS \
++	((IA_CSS_RBM_BITS) / (IA_CSS_RBM_ELEM_BITS))
++
++/** Users should make no assumption about the actual type of
++ * ia_css_rbm_t.
++ */
++typedef struct {
++	IA_CSS_RBM_ELEM_TYPE data[IA_CSS_RBM_NOF_ELEMS];
++} ia_css_rbm_elems_t;
++typedef ia_css_rbm_elems_t ia_css_rbm_t;
++
++/** Print the bits of a routing bitmap
++ * @return < 0 on error
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_rbm_print(
++	const ia_css_rbm_t	bitmap,
++	void *fid);
++
++/** Create an empty routing bitmap
++ * @return bitmap = 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_clear(void);
++
++/** Creates the complement of a routing bitmap
++ * @param	bitmap[in] routing bitmap
++ * @return ~bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_complement(
++	const ia_css_rbm_t bitmap);
++
++/** Create the union of two routing bitmaps
++ * @param	bitmap0[in]	routing bitmap 0
++ * @param	bitmap1[in]	routing bitmap 1
++ * @return bitmap0 | bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_union(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1);
++
++/** Create the intersection of two routing bitmaps
++ * @param	bitmap0[in]	routing bitmap 0
++ * @param	bitmap1[in] routing bitmap 1
++ * @return bitmap0 & bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_intersection(
++	const ia_css_rbm_t			bitmap0,
++	const ia_css_rbm_t			bitmap1);
++
++/** Check if the routing bitmaps is empty
++ * @param bitmap[in] routing bitmap
++ * @return bitmap == 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_empty(
++	const ia_css_rbm_t bitmap);
++
++/** Check if the intersection of two routing bitmaps is empty
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in] routing bitmap 1
++ * @return (bitmap0 & bitmap1) == 0
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_intersection_empty(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1);
++
++/** Check if the second routing bitmap is a subset of the first (or equal)
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in routing bitmap 1
++ * Note: An empty set is always a subset, this function
++ * returns true if bitmap 1 is empty
++ * @return (bitmap0 & bitmap1) == bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_subset(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1);
++
++/** Check if the routing bitmaps are equal
++ * @param bitmap0[in] routing bitmap 0
++ * @param bitmap1[in] routing bitmap 1
++ * @return bitmap0 == bitmap1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++bool ia_css_is_rbm_equal(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1);
++
++/** Checks whether a specific kernel bit is set
++ * @return bitmap[index] == 1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_is_rbm_set(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index);
++
++/** Returns range of bits as integer
++ * @return bitmap[index, index+size]
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++int ia_css_rbm_range_val(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index,
++	const unsigned int size);
++
++/** Create the union of a routing bitmap with a onehot bitmap
++ * with a bit set at index
++ * @return bitmap[index] |= 1
++*/
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_set(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index);
++
++/*! Set elem_index-th 32-bit element of the bitmap to elem_value
++ * @return updated bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
++	const ia_css_rbm_t bitmap,
++	const unsigned int elem_index,
++	const uint32_t     elem_value);
++
++/** Creates routing bitmap using a uint64 value.
++ * @return bitmap with the same bits set as in value (provided that width of bitmap is sufficient).
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_create_from_uint64(
++	const uint64_t	value);
++
++/** Converts an ia_css_rbm_t type to uint64_t. Note that if
++ *  ia_css_rbm_t contains more then 64 bits, only the lowest 64 bits
++ *  are returned.
++ *  @return uint64_t representation of value
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++uint64_t ia_css_rbm_to_uint64(
++	const ia_css_rbm_t value);
++
++/** Creates a routing bitmap with the bit at index 'index' removed.
++ * @return ~(1 << index) & bitmap
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_unset(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index);
++
++/** Create a onehot routing bitmap with a bit set at index
++ * @return bitmap[index] = 1
++ */
++IA_CSS_RBM_STORAGE_CLASS_H
++ia_css_rbm_t ia_css_rbm_bit_mask(
++	const unsigned int index);
++
++#ifdef __IA_CSS_RBM_INLINE__
++#include "ia_css_rbm_impl.h"
++#endif /* __IA_CSS_RBM_INLINE__ */
++
++#endif /* __IA_CSS_RBM_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
+new file mode 100644
+index 000000000000..26bf5bad63e4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_impl.h
+@@ -0,0 +1,410 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_rbm.h"
++#include "type_support.h"
++#include "misc_support.h"
++#include "assert_support.h"
++#include "math_support.h"
++#include "ia_css_rbm_trace.h"
++
++STORAGE_CLASS_INLINE int ia_css_rbm_compute_weight(
++	const ia_css_rbm_t bitmap);
++
++STORAGE_CLASS_INLINE ia_css_rbm_t ia_css_rbm_shift(
++	const ia_css_rbm_t bitmap);
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_intersection_empty(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1)
++{
++	ia_css_rbm_t intersection;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_is_rbm_intersection_empty(): enter:\n");
++
++	intersection = ia_css_rbm_intersection(bitmap0, bitmap1);
++	return ia_css_is_rbm_empty(intersection);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_empty(
++	const ia_css_rbm_t bitmap)
++{
++	unsigned int i;
++	bool is_empty = true;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_is_rbm_empty(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		is_empty &= bitmap.data[i] == 0;
++	}
++	return is_empty;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_equal(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1)
++{
++	unsigned int i;
++	bool is_equal = true;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_is_rbm_equal(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		is_equal = is_equal && (bitmap0.data[i] == bitmap1.data[i]);
++	}
++	return is_equal;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++bool ia_css_is_rbm_subset(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1)
++{
++	unsigned int i;
++	bool is_subset = true;
++
++	/* checks if bitmap1 is subset of bitmap 0 */
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_is_rbm_subset(): enter:\n");
++
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		is_subset &= ((bitmap0.data[i] & bitmap1.data[i]) == bitmap1.data[i]);
++	}
++
++	return is_subset;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_clear(void)
++{
++	unsigned int i;
++	ia_css_rbm_t bitmap = {{0} };
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_clear(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		bitmap.data[i] = 0;
++	}
++	return bitmap;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_complement(
++	const ia_css_rbm_t bitmap)
++{
++	unsigned int i;
++	ia_css_rbm_t result = {{0} };
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_complement(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		result.data[i] = ~bitmap.data[i];
++	}
++	return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_union(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1)
++{
++	unsigned int i;
++	ia_css_rbm_t result = {{0} };
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_union(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		result.data[i] = (bitmap0.data[i] | bitmap1.data[i]);
++	}
++	return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_intersection(
++	const ia_css_rbm_t bitmap0,
++	const ia_css_rbm_t bitmap1)
++{
++	unsigned int i;
++	ia_css_rbm_t result = {{0} };
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_intersection(): enter:\n");
++	for (i = 0; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		result.data[i] = (bitmap0.data[i] & bitmap1.data[i]);
++	}
++	return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_set(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index)
++{
++	ia_css_rbm_t bit_mask;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_set(): enter:\n");
++
++	bit_mask = ia_css_rbm_bit_mask(index);
++	return ia_css_rbm_union(bitmap, bit_mask);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_set_element_from_uint32(
++	const ia_css_rbm_t bitmap,
++	const unsigned int elem_index,
++	const uint32_t     elem_value)
++{
++	ia_css_rbm_t result = bitmap;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_set_element_from_uint32(): enter:\n");
++
++	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
++
++	if (elem_index < IA_CSS_RBM_NOF_ELEMS) {
++		result.data[elem_index] = elem_value;
++	} else {
++		assert(0);
++	}
++
++	return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_create_from_uint64(
++	const uint64_t value)
++{
++	unsigned int i;
++	ia_css_rbm_t result;
++	const unsigned int bits64 = sizeof(uint64_t) * 8;
++	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_create_from_uint64(): enter:\n");
++
++	result = ia_css_rbm_clear();
++	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_RBM_NOF_ELEMS); i++) {
++		/* masking is done implictly, the MSB bits of casting will be chopped off */
++		result.data[i] = (IA_CSS_RBM_ELEM_TYPE)
++			(value >> (i * IA_CSS_RBM_ELEM_BITS));
++	}
++
++	return result;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++uint64_t ia_css_rbm_to_uint64(
++	const ia_css_rbm_t value)
++{
++	const unsigned int bits64 = sizeof(uint64_t) * 8;
++	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_RBM_ELEM_BITS;
++	unsigned int i;
++	uint64_t res = 0;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_to_uint64(): enter:\n");
++
++	assert((bits64 % IA_CSS_RBM_ELEM_BITS) == 0);
++	assert(nof_elems_bits64 > 0);
++
++	for (i = 0; i < MIN(IA_CSS_RBM_NOF_ELEMS, nof_elems_bits64); i++) {
++		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_RBM_ELEM_BITS));
++	}
++	for (; i < IA_CSS_RBM_NOF_ELEMS; i++) {
++		assert(value.data[i] == 0);
++	}
++	return res;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_unset(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index)
++{
++	ia_css_rbm_t result;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_unset(): enter:\n");
++
++	result = ia_css_rbm_bit_mask(index);
++	result = ia_css_rbm_complement(result);
++	return ia_css_rbm_intersection(bitmap, result);
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++ia_css_rbm_t ia_css_rbm_bit_mask(
++	const unsigned int index)
++{
++	unsigned int elem_index;
++	unsigned int elem_bit_index;
++	ia_css_rbm_t bit_mask = ia_css_rbm_clear();
++
++	assert(index < IA_CSS_RBM_BITS);
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_bit_mask(): enter:\n");
++	if (index < IA_CSS_RBM_BITS) {
++		elem_index = index / IA_CSS_RBM_ELEM_BITS;
++		elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++		assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++
++		bit_mask.data[elem_index] = 1 << elem_bit_index;
++	}
++	return bit_mask;
++}
++
++STORAGE_CLASS_INLINE
++int ia_css_rbm_compute_weight(
++	const ia_css_rbm_t bitmap)
++{
++	ia_css_rbm_t loc_bitmap;
++	int weight = 0;
++	int i;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_compute_weight(): enter:\n");
++
++	loc_bitmap = bitmap;
++
++	/* In fact; do not need the iterator "i" */
++	for (i = 0; (i < IA_CSS_RBM_BITS) &&
++		!ia_css_is_rbm_empty(loc_bitmap); i++) {
++		weight += ia_css_is_rbm_set(loc_bitmap, 0);
++		loc_bitmap = ia_css_rbm_shift(loc_bitmap);
++	}
++
++	return weight;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_rbm_range_val(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index,
++	const unsigned int size)
++{
++	unsigned int elem_index;
++	unsigned int elem_bit_index;
++	unsigned int res;
++	unsigned int elem_index_end;
++	unsigned int mask;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE, "ia_css_rbm_range_val(): enter:\n");
++	assert(index < IA_CSS_RBM_BITS);
++	/* Extract the bit range from the data array relevane entry */
++	elem_index = index / IA_CSS_RBM_ELEM_BITS;
++	elem_index_end = (index + size - 1) / IA_CSS_RBM_ELEM_BITS;
++	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++	mask =  (1 << size) - 1;
++	res = (bitmap.data[elem_index] >> elem_bit_index) & mask;
++	/* In case that the bit range is divided between 2 different data array entries */
++	if (elem_index != elem_index_end) {
++		unsigned int first_elem_size = IA_CSS_RBM_ELEM_BITS - index;
++		unsigned int second_elem_size = size - first_elem_size;
++
++		mask = (1 << second_elem_size) - 1;
++		res |= ((bitmap.data[elem_index_end] & mask) << first_elem_size);
++	}
++	return res;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_is_rbm_set(
++	const ia_css_rbm_t bitmap,
++	const unsigned int index)
++{
++	unsigned int elem_index;
++	unsigned int elem_bit_index;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_is_rbm_set(): enter:\n");
++
++	assert(index < IA_CSS_RBM_BITS);
++
++	elem_index = index / IA_CSS_RBM_ELEM_BITS;
++	elem_bit_index = index % IA_CSS_RBM_ELEM_BITS;
++	assert(elem_index < IA_CSS_RBM_NOF_ELEMS);
++	return (((bitmap.data[elem_index] >> elem_bit_index) & 0x1) == 1);
++}
++
++STORAGE_CLASS_INLINE
++ia_css_rbm_t ia_css_rbm_shift(
++	const ia_css_rbm_t bitmap)
++{
++	int i;
++	unsigned int lsb_current_elem = 0;
++	unsigned int lsb_previous_elem = 0;
++	ia_css_rbm_t loc_bitmap;
++
++	IA_CSS_TRACE_0(RBM, VERBOSE,
++		"ia_css_rbm_shift(): enter:\n");
++
++	loc_bitmap = bitmap;
++
++	for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0; i--) {
++		lsb_current_elem = bitmap.data[i] & 0x01;
++		loc_bitmap.data[i] >>= 1;
++		loc_bitmap.data[i] |= (lsb_previous_elem << (IA_CSS_RBM_ELEM_BITS - 1));
++		lsb_previous_elem = lsb_current_elem;
++	}
++	return loc_bitmap;
++}
++
++IA_CSS_RBM_STORAGE_CLASS_C
++int ia_css_rbm_print(
++	const ia_css_rbm_t bitmap,
++	void               *fid)
++{
++	int i;
++	const IA_CSS_RBM_ELEM_TYPE *data = &bitmap.data[0];
++
++	NOT_USED(fid);
++
++	CT_ASSERT(IA_CSS_RBM_NOF_ELEMS > 0);
++	CT_ASSERT(IA_CSS_RBM_ELEM_BITS <= 32); /* because we print 32 bit integers */
++
++	if (IA_CSS_RBM_NOF_ELEMS == 1) {
++		IA_CSS_TRACE_1(RBM, INFO, "ia_css_rbm_print(): rbm: %08x\n",
++			data[0]);
++
++	} else if (IA_CSS_RBM_NOF_ELEMS == 2) {
++		IA_CSS_TRACE_2(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x\n",
++			data[1], data[0]);
++
++	} else if (IA_CSS_RBM_NOF_ELEMS == 3) {
++		IA_CSS_TRACE_3(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x\n",
++			data[2], data[1], data[0]);
++
++	} else if (IA_CSS_RBM_NOF_ELEMS == 4) {
++		IA_CSS_TRACE_4(RBM, INFO, "ia_css_rbm_print(): rbm: %08x %08x %08x %08x\n",
++			data[3], data[2], data[1], data[0]);
++
++	} else {
++		IA_CSS_TRACE_0(RBM, INFO, "ia_css_rbm_print(): rbm: {\n");
++
++		for (i = IA_CSS_RBM_NOF_ELEMS - 1; i >= 0 ; i--) {
++			IA_CSS_TRACE_1(RBM, INFO, "\t%08x\n", data[i]);
++		}
++		IA_CSS_TRACE_0(RBM, INFO, "}\n");
++	}
++
++	return 0;
++}
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
+new file mode 100644
+index 000000000000..d3c2423e7d02
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest.h
+@@ -0,0 +1,146 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_MANIFEST_H
++#define __IA_CSS_RBM_MANIFEST_H
++
++#include "type_support.h"
++#include "ia_css_rbm_manifest_types.h"
++
++/** Returns the descriptor size of the RBM manifest.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_size(void);
++
++/** Initializes the RBM manifest.
++ * @param rbm[in] Routing bitmap.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++void
++ia_css_rbm_manifest_init(struct ia_css_rbm_manifest_s *rbm);
++
++/** Returns a pointer to the array of mux descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_mux_desc_t *
++ia_css_rbm_manifest_get_muxes(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns the size of mux descriptors array.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_mux_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns a pointer to the array of validation descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_validation_rule_t *
++ia_css_rbm_manifest_get_validation_rules(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns the size of the validation descriptor array.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_validation_rule_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Returns a pointer to the array of terminal routing descriptors.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return NULL on error
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++ia_css_rbm_terminal_routing_desc_t *
++ia_css_rbm_manifest_get_terminal_routing_desc(const ia_css_rbm_manifest_t *manifest);
++
++/** \brief Returns the size of the terminal routing descriptor array.
++ * Note: pretty printing differs from on host and on IPU.
++ * @param manifest[in] Routing bitmap manifest.
++ * @return size
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++unsigned int
++ia_css_rbm_manifest_get_terminal_routing_desc_count(const ia_css_rbm_manifest_t *manifest);
++
++/** Pretty prints the routing bitmap manifest.
++ * @param manifest[in] Routing bitmap manifest.
++ */
++void
++ia_css_rbm_manifest_print(const ia_css_rbm_manifest_t *manifest);
++
++/** \brief Pretty prints a RBM (routing bitmap).
++ * Note: pretty printing differs from on host and on IPU.
++ * @param rbm[in]             Routing bitmap.
++ * @param mux[in]             List of mux descriptors corresponding to rbm.
++ * @param mux_desc_count[in]  Number of muxes in list mux.
++ */
++void
++ia_css_rbm_pretty_print(
++	const ia_css_rbm_t *rbm,
++	const ia_css_rbm_mux_desc_t *mux,
++	unsigned int mux_desc_count);
++
++/** \brief check for the validity of a routing bitmap.
++ * @param manifest[in] Routing bitmap manifest.
++ * @param rbm[in]      Routing bitmap
++ * @return true on match.
++ */
++bool
++ia_css_rbm_manifest_check_rbm_validity(
++	const ia_css_rbm_manifest_t *manifest,
++	const ia_css_rbm_t *rbm);
++
++/** \brief sets, using manifest info, the value of a mux in the routing bitmap.
++ * @param rbm[in]             Routing bitmap.
++ * @param mux[in]             List of mux descriptors corresponding to rbm.
++ * @param mux_count[in]       Number of muxes in list mux.
++ * @param gp_dev_id[in]       ID of sub system (PSA/ISA) where the mux is located.
++ * @param mux_id[in]          ID of mux to set configuration for.
++ * @param value[in]           Value of the mux.
++ * @return routing bitmap.
++ */
++ia_css_rbm_t
++ia_css_rbm_set_mux(
++	ia_css_rbm_t rbm,
++	ia_css_rbm_mux_desc_t *mux,
++	unsigned int mux_count,
++	unsigned int gp_dev_id,
++	unsigned int mux_id,
++	unsigned int value);
++
++/** \brief Gets the value of a mux.
++ * @param rbm      routing bitmap
++ * @param mux_desc mux descriptor
++ * @return Mux value corresponding to mux_desc, -1 on error.
++ */
++IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H
++int
++ia_css_rbm_get_mux_value(
++	const ia_css_rbm_t *rbm,
++	const ia_css_rbm_mux_desc_t *mux_desc);
++
++#ifdef __IA_CSS_RBM_MANIFEST_INLINE__
++#include "ia_css_rbm_manifest_impl.h"
++#endif /* __IA_CSS_RBM_MANIFEST_INLINE__ */
++
++#endif /* __IA_CSS_RBM_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
+new file mode 100644
+index 000000000000..45f77dbb89dc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_manifest_types.h
+@@ -0,0 +1,96 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_MANIFEST_TYPES_H
++#define __IA_CSS_RBM_MANIFEST_TYPES_H
++
++#include "ia_css_rbm.h"
++#include "vied_nci_psys_resource_model.h"
++
++#ifndef VIED_NCI_RBM_MAX_MUX_COUNT
++#error Please define VIED_NCI_RBM_MAX_MUX_COUNT
++#endif
++#ifndef VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
++#error Please define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT
++#endif
++#ifndef VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
++#error Please define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT
++#endif
++#ifndef N_PADDING_UINT8_IN_RBM_MANIFEST
++#error Please define N_PADDING_UINT8_IN_RBM_MANIFEST
++#endif
++
++#define SIZE_OF_RBM_MUX_DESC_S ( \
++	(4 * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_mux_desc_s {
++	uint8_t gp_dev_id;
++	uint8_t mux_id;
++	uint8_t offset;
++	uint8_t size_bits;
++} ia_css_rbm_mux_desc_t;
++
++#define SIZE_OF_RBM_VALIDATION_RULE_DESC_S ( \
++	  (1 * IA_CSS_RBM_BITS) \
++	+ (1 * IA_CSS_UINT32_T_BITS))
++
++typedef struct ia_css_rbm_validation_rule_s {
++	ia_css_rbm_t match; /* RBM is an array of 32 bit elements */
++	uint32_t expected_value;
++} ia_css_rbm_validation_rule_t;
++
++#define SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S ( \
++	(4 * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_terminal_routing_desc_s {
++	uint8_t terminal_id;
++	uint8_t connection_state;
++	uint8_t mux_id;
++	uint8_t state;
++} ia_css_rbm_terminal_routing_desc_t;
++
++#define SIZE_OF_RBM_MANIFEST_S ( \
++	  (VIED_NCI_RBM_MAX_MUX_COUNT * SIZE_OF_RBM_MUX_DESC_S) \
++	+ (VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT * SIZE_OF_RBM_VALIDATION_RULE_DESC_S) \
++	+ (VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT * SIZE_OF_RBM_TERMINAL_ROUTING_DESC_S) \
++	+ (3 * IA_CSS_UINT16_T_BITS) \
++	+ (N_PADDING_UINT8_IN_RBM_MANIFEST * IA_CSS_UINT8_T_BITS))
++
++typedef struct ia_css_rbm_manifest_s {
++#if VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT > 0
++	ia_css_rbm_validation_rule_t
++		validation_rules[VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT];
++#endif
++	uint16_t mux_desc_count;
++	uint16_t validation_rule_count;
++	uint16_t terminal_routing_desc_count;
++
++#if VIED_NCI_RBM_MAX_MUX_COUNT > 0
++	ia_css_rbm_mux_desc_t
++		mux_desc[VIED_NCI_RBM_MAX_MUX_COUNT];
++#endif
++
++#if VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT > 0
++	ia_css_rbm_terminal_routing_desc_t
++		terminal_routing_desc[VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT];
++#endif
++
++#if N_PADDING_UINT8_IN_RBM_MANIFEST > 0
++	uint8_t padding[N_PADDING_UINT8_IN_RBM_MANIFEST];
++#endif
++} ia_css_rbm_manifest_t;
++
++#endif /* __IA_CSS_RBM_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
+new file mode 100644
+index 000000000000..5f72bd1736f5
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_storage_class.h
+@@ -0,0 +1,38 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_STORAGE_CLASS_H
++#define __IA_CSS_RBM_STORAGE_CLASS_H
++
++#include "storage_class.h"
++
++#ifndef __IA_CSS_RBM_INLINE__
++#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_RBM_STORAGE_CLASS_C
++#else
++#define IA_CSS_RBM_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_RBM_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#ifndef __IA_CSS_RBM_MANIFEST_INLINE__
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_EXTERN
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C
++#else
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_H STORAGE_CLASS_INLINE
++#define IA_CSS_RBM_MANIFEST_STORAGE_CLASS_C STORAGE_CLASS_INLINE
++#endif
++
++#endif /* __IA_CSS_RBM_STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
+new file mode 100644
+index 000000000000..bcffc10c6e32
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_rbm_trace.h
+@@ -0,0 +1,79 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_TRACE_H
++#define __IA_CSS_RBM_TRACE_H
++
++#include "ia_css_trace.h"
++
++/* Not using 0 to identify wrong configuration being passed from the .mk file outside.
++* Log levels not in the range below will cause a "No RBM_TRACE_CONFIG Tracing level defined"
++*/
++#define RBM_TRACE_LOG_LEVEL_OFF 1
++#define RBM_TRACE_LOG_LEVEL_NORMAL 2
++#define RBM_TRACE_LOG_LEVEL_DEBUG 3
++
++#define RBM_TRACE_CONFIG_DEFAULT RBM_TRACE_LOG_LEVEL_NORMAL
++
++#if !defined(RBM_TRACE_CONFIG)
++#	define RBM_TRACE_CONFIG RBM_TRACE_CONFIG_DEFAULT
++#endif
++
++/* IPU_RESOURCE Module tracing backend is mapped to TUNIT tracing for target platforms */
++#ifdef __HIVECC
++#	ifndef HRT_CSIM
++#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_TRACE
++#	else
++#		define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++#	endif
++#else
++#	define RBM_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++#endif
++
++#if (defined(RBM_TRACE_CONFIG))
++/* Module specific trace setting */
++#	if RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_OFF
++/* RBM_TRACE_LOG_LEVEL_OFF */
++#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
++#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_NORMAL
++/* RBM_TRACE_LOG_LEVEL_NORMAL */
++#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_DISABLED
++#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_DISABLED
++#	elif RBM_TRACE_CONFIG == RBM_TRACE_LOG_LEVEL_DEBUG
++/* RBM_TRACE_LOG_LEVEL_DEBUG */
++#		define RBM_TRACE_LEVEL_ASSERT	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_ERROR	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_WARNING	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_INFO	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_DEBUG	IA_CSS_TRACE_LEVEL_ENABLED
++#		define RBM_TRACE_LEVEL_VERBOSE	IA_CSS_TRACE_LEVEL_ENABLED
++#	else
++#		error "No RBM_TRACE_CONFIG Tracing level defined"
++#	endif
++#else
++#	error "RBM_TRACE_CONFIG not defined"
++#endif
++
++#endif /* __RBM_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
+new file mode 100644
+index 000000000000..4c0af262a13b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal.h
+@@ -0,0 +1,187 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_H
++#define __IA_CSS_TERMINAL_H
++
++#include "type_support.h"
++#include "ia_css_terminal_types.h"
++#include "ia_css_param_storage_class.h"
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_in_terminal_get_descriptor_size(
++	const unsigned int nof_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_section_desc_t *
++ia_css_param_in_terminal_get_param_section_desc(
++	const ia_css_param_terminal_t *param_terminal,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_out_terminal_get_descriptor_size(
++	const unsigned int nof_sections,
++	const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_section_desc_t *
++ia_css_param_out_terminal_get_param_section_desc(
++	const ia_css_param_terminal_t *param_terminal,
++	const unsigned int section_index,
++	const unsigned int nof_sections,
++	const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_param_terminal_create(
++	ia_css_param_terminal_t *param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++	const unsigned int nof_frame_param_sections,
++	const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_grid_desc_t *
++ia_css_spatial_param_terminal_get_fragment_grid_desc(
++	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_frame_grid_param_section_desc_t *
++ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
++	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_spatial_param_terminal_create(
++	ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal,
++	const unsigned int nof_fragments,
++	const uint32_t kernel_id
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
++	const unsigned int nof_slice_param_sections,
++	const unsigned int nof_slices[],
++	const unsigned int nof_fragments
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_slice_desc_t *
++ia_css_sliced_param_terminal_get_fragment_slice_desc(
++	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const unsigned int fragment_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_slice_param_section_desc_t *
++ia_css_sliced_param_terminal_get_slice_param_section_desc(
++	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const unsigned int fragment_index,
++	const unsigned int slice_index,
++	const unsigned int section_index,
++	const unsigned int nof_slice_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_sliced_param_terminal_create(
++	ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal,
++	const unsigned int nof_slice_param_sections,
++	const unsigned int nof_slices[],
++	const unsigned int nof_fragments,
++	const uint32_t kernel_id
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_program_terminal_get_descriptor_size(
++	const unsigned int nof_fragments,
++	const unsigned int nof_fragment_param_sections,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int nof_command_objs
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_param_section_desc_t *
++ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int fragment_index,
++	const unsigned int section_index,
++	const unsigned int nof_fragment_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_kernel_fragment_sequencer_info_desc_t *
++ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int fragment_index,
++	const unsigned int info_index,
++	const unsigned int nof_kernel_fragment_sequencer_infos
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_create(
++	ia_css_program_terminal_t *program_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const unsigned int nof_fragments,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int nof_command_objs
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_get_command_base_offset(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int nof_fragments,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int commands_slots_used,
++	uint16_t *command_desc_offset
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++uint16_t *ia_css_program_terminal_get_line_count(
++	const ia_css_kernel_fragment_sequencer_command_desc_t
++	*kernel_fragment_sequencer_command_desc_base,
++	const unsigned int set_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++	const unsigned int nof_frame_param_sections,
++	const unsigned int nof_fragments
++);
++
++#ifdef __INLINE_PARAMETERS__
++#include "ia_css_terminal_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
++
++#endif /* __IA_CSS_TERMINAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
+new file mode 100644
+index 000000000000..9a78969c4fcc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_base_types.h
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_BASE_TYPES_H
++#define __IA_CSS_TERMINAL_BASE_TYPES_H
++
++#include "type_support.h"
++#include "ia_css_terminal_defs.h"
++
++#define N_UINT16_IN_TERMINAL_STRUCT		3
++#define N_UINT32_IN_TERMINAL_STRUCT		1
++#define N_PADDING_UINT8_IN_TERMINAL_STRUCT	1
++
++#define SIZE_OF_TERMINAL_STRUCT_BITS \
++	(IA_CSS_TERMINAL_TYPE_BITS \
++	+ N_UINT32_IN_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_TERMINAL_ID_BITS  \
++	+ N_UINT16_IN_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_PADDING_UINT8_IN_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/* ==================== Base Terminal - START ==================== */
++/** Base structure for all terminal types.
++ *
++ *  Terminals describe an opening between a program group and the outside world.
++ *  They come in various types (data, statisitics, parameters, etc.) which may have
++ *  extensions specific to those types.  This structure is the base for all of those and
++ *  must be the first field in any  subclassed terminal structure type.
++ */
++struct ia_css_terminal_s {						/**< Base terminal */
++	ia_css_terminal_type_t			terminal_type;		/**< Type ID of the terminal.  This type enum defines the purpose of the terminal and its structure. */
++	uint32_t				payload_size;	/**< Size of buffer passed in buffer set for this terminal */
++	int16_t					parent_offset;		/**< Offset to the containing process group */
++	uint16_t				size;			/**< Size of this whole terminal layout-structure, including subclassed extensions. */
++	uint16_t				tm_index;		/**< Index of the terminal manifest object in the program group manifest. */
++	ia_css_terminal_ID_t			ID;			/**< Absolute referal ID for this terminal, valid ID's != 0 */
++	uint8_t					padding[N_PADDING_UINT8_IN_TERMINAL_STRUCT];
++};
++/* ==================== Base Terminal - END ==================== */
++
++#endif /* __IA_CSS_TERMINAL_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
+new file mode 100644
+index 000000000000..3ce4184e9c78
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_defs.h
+@@ -0,0 +1,209 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_DEFS_H
++#define __IA_CSS_TERMINAL_DEFS_H
++
++#include "type_support.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define IA_CSS_TERMINAL_ID_BITS		8
++typedef uint8_t				ia_css_terminal_ID_t;
++#define IA_CSS_TERMINAL_INVALID_ID	((ia_css_terminal_ID_t)(-1))
++
++/**
++ * Terminal category
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_cat {
++	IA_CSS_TERMINAL_CAT_LOAD = 0, /**< Load terminal.  Payload is made of up segmented value blobs for register load. */
++	IA_CSS_TERMINAL_CAT_CONNECT, /**< Connect terminal.  Payload is a memory pointer. */
++	IA_CSS_TERMINAL_CAT_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_cat_t;
++#define IA_CSS_TERMINAL_CAT_INVALID IA_CSS_TERMINAL_CAT_COUNT
++
++/**
++ * Terminal direction
++ *
++ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
++ * output generated by IPU.
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_dir {
++	IA_CSS_TERMINAL_DIR_IN = 0, /**< Input terminal. Input is consumed by IPU*/
++	IA_CSS_TERMINAL_DIR_OUT, /**< Output terminal. Output is generated by IPU */
++	IA_CSS_TERMINAL_DIR_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_dir_t;
++#define IA_CSS_TERMINAL_DIR_INVALID IA_CSS_TERMINAL_DIR_COUNT
++
++/**
++ * Terminal Rate Of Update (ROU)
++ *
++ * Direction is from the IPU perspective.  That is, "IN" is input consumed by IPU and "OUT" is
++ * output generated by IPU.
++ *
++ * @todo New for IPU7 POC
++ */
++typedef enum ia_css_terminal_rou {
++	IA_CSS_TERMINAL_ROU_STREAM = 0, /**< Constant for all frames in a stream */
++	IA_CSS_TERMINAL_ROU_FRAME, /**< Constant for all fragments in a frame */
++	IA_CSS_TERMINAL_ROU_FRAG, /**< Requires update (i.e. not constant) for all fragments */
++	IA_CSS_TERMINAL_ROU_COUNT /**< Number of entries in this enumeration */
++} ia_css_terminal_rou_t;
++#define IA_CSS_TERMINAL_ROU_INVALID IA_CSS_TERMINAL_ROU_COUNT
++
++/**
++ * Connect terminal payload content type
++ *
++ * Defines the broad usage of the buffers defined in connect terminals
++ */
++typedef enum ia_css_connect_buf_type {
++	IA_CSS_CONNECT_BUF_TYPE_DATA = 0, /**< Image data */
++	IA_CSS_CONNECT_BUF_TYPE_META, /**< Meta data */
++	IA_CSS_CONNECT_BUF_TYPE_UNKNOWN, /**< Unknown or irrelevant (e.g. load terminal) */
++	IA_CSS_CONNECT_BUF_TYPE_COUNT /**< Number of entries in this enumeration */
++} ia_css_connect_buf_type_t;
++
++/** Unknown or irrelevant buffer type */
++#define IA_CSS_CONNECT_BUF_TYPE_INVALID IA_CSS_CONNECT_BUF_TYPE_COUNT
++
++/**
++ * Terminal type identifier
++ *
++ * @note  Will be superseded by  ia_css_terminal_cat_t, ia_css_terminal_dir_t, ia_css_terminal_rou_t,
++ * and ia_css_connect_buf_type_t
++ * To stage the changes, this type will remain - for now...
++ *
++ * Inital type to attribute mapping table for staging:
++ * ia_css_terminal_type_t                    | ia_css_terminal_cat_t | ia_css_terminal_dir_t | ia_css_terminal_rou_t | ia_css_connect_buf_type_t    | notes
++ * ----------------------------------------- | --------------------- | --------------------- | --------------------- | ---------------------------- | -----
++ * IA_CSS_TERMINAL_TYPE_DATA_IN              | CAT_CONNECT           | DIR_IN                | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
++ * IA_CSS_TERMINAL_TYPE_DATA_OUT             | CAT_CONNECT           | DIR_OUT               | ROU_FRAG?             | BUF_TYPE_DATA                | Fragment handling unclear
++ * IA_CSS_TERMINAL_TYPE_PARAM_STREAM         | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME             | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN     | CAT_CONNECT           | DIR_IN                | ROU_FRAME             | BUF_TYPE_META                |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT    | CAT_CONNECT           | DIR_OUT               | ROU_FRAME             | BUF_TYPE_META                |
++ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN      | CAT_LOAD              | DIR_IN                | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
++ * IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT     | CAT_LOAD              | DIR_OUT               | ROU_FRAME?            | BUF_TYPE_UNKNOWN (load term) | Usage unclear
++ * IA_CSS_TERMINAL_TYPE_STATE_IN             | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_STATE_OUT            | OBSOLETE              | OBSOLETE              | OBSOLETE              | OBSOLETE                     | *No meaningful use found in FW*
++ * IA_CSS_TERMINAL_TYPE_PROGRAM              | CAT_LOAD              | DIR_IN                | ROU_FRAG              | BUF_TYPE_UNKNOWN (load term) |
++ * IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT | CAT_LOAD - see note   | DIR_IN                | ROU_STREAM - see note | BUF_TYPE_UNKNOWN (load term) | Belongs to FW team.  Used to have both load and connect sections.  Currently calculated based on PPG terminal information, and not buffer set.
++ */
++typedef enum ia_css_terminal_type {
++	/** Data input */
++	IA_CSS_TERMINAL_TYPE_DATA_IN = 0,
++	/** Data output */
++	IA_CSS_TERMINAL_TYPE_DATA_OUT,
++	/** Type 6 parameter input */
++	IA_CSS_TERMINAL_TYPE_PARAM_STREAM,
++	/** Type 1-5 parameter input.  Constant for all fragments in a frame. */
++	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN,
++	/** Type 1-5 parameter output */
++	IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT,
++	/** Represent the new type of terminal for the
++	 * "spatial dependent parameters", when params go in
++	 */
++	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN,
++	/** Represent the new type of terminal for the
++	 * "spatial dependent parameters", when params go out
++	 */
++	IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT,
++	/** Represent the new type of terminal for the
++	 * explicit slicing, when params go in
++	 */
++	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN,
++	/** Represent the new type of terminal for the
++	 * explicit slicing, when params go out
++	 */
++	IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT,
++	/** State (private data) input */
++	IA_CSS_TERMINAL_TYPE_STATE_IN,
++	/** State (private data) output */
++	IA_CSS_TERMINAL_TYPE_STATE_OUT,
++	/** Program parameters, may change per fragment */
++	IA_CSS_TERMINAL_TYPE_PROGRAM,
++	/** Program control parameters.  Non-alogrithmic parameters for system devices. */
++	IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT,
++	IA_CSS_N_TERMINAL_TYPES
++} ia_css_terminal_type_t;
++
++#define IA_CSS_TERMINAL_TYPE_BITS				32
++
++/* Temporary redirection needed to facilicate merging with the drivers
++   in a backwards compatible manner */
++#define IA_CSS_TERMINAL_TYPE_PARAM_CACHED IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN
++
++/**
++ * Dimensions of the data objects. Note that a C-style
++ * data order is assumed. Data stored by row.
++ */
++typedef enum ia_css_dimension {
++	/** The number of columns, i.e. the size of the row */
++	IA_CSS_COL_DIMENSION = 0,
++	/** The number of rows, i.e. the size of the column */
++	IA_CSS_ROW_DIMENSION = 1,
++	IA_CSS_N_DATA_DIMENSION = 2
++} ia_css_dimension_t;
++
++#define IA_CSS_N_COMMAND_COUNT (4)
++
++#ifndef PIPE_GENERATION
++/* Don't include these complex enum structures in Genpipe, it can't handle and it does not need them */
++/**
++ * enum ia_css_isys_link_id. Lists the link IDs used by the FW for On The Fly feature
++ */
++typedef enum ia_css_isys_link_id {
++	IA_CSS_ISYS_LINK_OFFLINE = 0,
++	IA_CSS_ISYS_LINK_MAIN_OUTPUT = 1,
++	IA_CSS_ISYS_LINK_PDAF_OUTPUT = 2
++} ia_css_isys_link_id_t;
++#define N_IA_CSS_ISYS_LINK_ID	(IA_CSS_ISYS_LINK_PDAF_OUTPUT + 1)
++
++/**
++ * enum ia_css_data_barrier_link_id. Lists the link IDs used by the FW for data barrier feature
++ */
++typedef enum ia_css_data_barrier_link_id {
++	IA_CSS_DATA_BARRIER_LINK_MEMORY_0 = N_IA_CSS_ISYS_LINK_ID,
++	IA_CSS_DATA_BARRIER_LINK_MEMORY_1,
++	IA_CSS_DATA_BARRIER_LINK_MEMORY_2,
++	IA_CSS_DATA_BARRIER_LINK_MEMORY_3,
++	IA_CSS_DATA_BARRIER_LINK_MEMORY_4,
++	N_IA_CSS_DATA_BARRIER_LINK_ID
++} ia_css_data_barrier_link_id_t;
++
++/**
++ * enum ia_css_stream2gen_link_id. Lists the link IDs used by the FW for streaming to GEN
++ * support.
++ */
++typedef enum ia_css_stream2gen_link_id {
++	IA_CSS_STREAM2GEN_LINK_ID_0 = N_IA_CSS_DATA_BARRIER_LINK_ID,
++	IA_CSS_STREAM2GEN_LINK_ID_1,
++	IA_CSS_STREAM2GEN_LINK_ID_2,
++	IA_CSS_STREAM2GEN_LINK_ID_3,
++	N_IA_CSS_STREAM2GEN_LINK_ID
++} ia_css_stream2gen_link_id_t;
++
++#endif /* #ifndef PIPE_GENERATION */
++/** @} */
++#endif /* __IA_CSS_TERMINAL_DEFS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
+new file mode 100644
+index 000000000000..94b535735836
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_impl.h
+@@ -0,0 +1,497 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_IMPL_H
++#define __IA_CSS_TERMINAL_IMPL_H
++
++#include "ia_css_terminal.h"
++#include "ia_css_terminal_types.h"
++#include "error_support.h"
++#include "assert_support.h"
++#include "storage_class.h"
++#include "misc_support.h" /* for NOT_USED */
++
++/* Param Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_in_terminal_get_descriptor_size(
++	const unsigned int nof_sections)
++{
++	return sizeof(ia_css_param_terminal_t) +
++		nof_sections*sizeof(ia_css_param_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_section_desc_t *ia_css_param_in_terminal_get_param_section_desc(
++	const ia_css_param_terminal_t *param_terminal,
++	const unsigned int section_index)
++{
++	ia_css_param_section_desc_t *param_section_base;
++	ia_css_param_section_desc_t *param_section_desc = NULL;
++
++	verifjmpexit(param_terminal != NULL);
++
++	param_section_base =
++		(ia_css_param_section_desc_t *)
++		(((const char *)param_terminal) +
++				param_terminal->param_section_desc_offset);
++	param_section_desc = &(param_section_base[section_index]);
++
++EXIT:
++	return param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_out_terminal_get_descriptor_size(
++	const unsigned int nof_sections,
++	const unsigned int nof_fragments)
++{
++	return sizeof(ia_css_param_terminal_t) +
++		nof_fragments*nof_sections*sizeof(ia_css_param_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_section_desc_t *ia_css_param_out_terminal_get_param_section_desc(
++	const ia_css_param_terminal_t *param_terminal,
++	const unsigned int section_index,
++	const unsigned int nof_sections,
++	const unsigned int fragment_index)
++{
++	ia_css_param_section_desc_t *param_section_base;
++	ia_css_param_section_desc_t *param_section_desc = NULL;
++
++	verifjmpexit(param_terminal != NULL);
++
++	param_section_base =
++		(ia_css_param_section_desc_t *)
++			(((const char *)param_terminal) +
++				param_terminal->param_section_desc_offset);
++	param_section_desc =
++		&(param_section_base[(nof_sections * fragment_index) +
++				section_index]);
++
++EXIT:
++	return param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_param_terminal_create(
++	ia_css_param_terminal_t *param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal)
++{
++	if (param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	if (terminal_offset > (1<<15)) {
++		return -EINVAL;
++	}
++
++	param_terminal->base.terminal_type =
++		is_input_terminal ?
++		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN :
++		IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT;
++	param_terminal->base.parent_offset =
++		0 - ((int16_t)terminal_offset);
++	param_terminal->base.size = terminal_size;
++	param_terminal->param_section_desc_offset =
++		sizeof(ia_css_param_terminal_t);
++
++	return 0;
++}
++
++/* Spatial Param Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_spatial_param_terminal_get_descriptor_size(
++	const unsigned int nof_frame_param_sections,
++	const unsigned int nof_fragments)
++{
++	return sizeof(ia_css_spatial_param_terminal_t) +
++		nof_frame_param_sections * sizeof(
++				ia_css_frame_grid_param_section_desc_t) +
++		nof_fragments * sizeof(ia_css_fragment_grid_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_grid_desc_t *
++ia_css_spatial_param_terminal_get_fragment_grid_desc(
++	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const unsigned int fragment_index)
++{
++	ia_css_fragment_grid_desc_t *fragment_grid_desc_base;
++	ia_css_fragment_grid_desc_t *fragment_grid_desc = NULL;
++
++	verifjmpexit(spatial_param_terminal != NULL);
++
++	fragment_grid_desc_base =
++		(ia_css_fragment_grid_desc_t *)
++			(((const char *)spatial_param_terminal) +
++			spatial_param_terminal->fragment_grid_desc_offset);
++	fragment_grid_desc = &(fragment_grid_desc_base[fragment_index]);
++
++EXIT:
++	return fragment_grid_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_frame_grid_param_section_desc_t *
++ia_css_spatial_param_terminal_get_frame_grid_param_section_desc(
++	const ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const unsigned int section_index)
++{
++	ia_css_frame_grid_param_section_desc_t *
++		frame_grid_param_section_base;
++	ia_css_frame_grid_param_section_desc_t *
++		frame_grid_param_section_desc = NULL;
++
++	verifjmpexit(spatial_param_terminal != NULL);
++
++	frame_grid_param_section_base =
++		(ia_css_frame_grid_param_section_desc_t *)
++			(((const char *)spatial_param_terminal) +
++		spatial_param_terminal->frame_grid_param_section_desc_offset);
++	frame_grid_param_section_desc =
++		&(frame_grid_param_section_base[section_index]);
++
++EXIT:
++	return frame_grid_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_spatial_param_terminal_create(
++	ia_css_spatial_param_terminal_t *spatial_param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal,
++	const unsigned int nof_fragments,
++	const uint32_t kernel_id)
++{
++	if (spatial_param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	if (terminal_offset > (1<<15)) {
++		return -EINVAL;
++	}
++
++	spatial_param_terminal->base.terminal_type =
++		is_input_terminal ?
++		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN :
++		IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT;
++	spatial_param_terminal->base.parent_offset =
++		0 - ((int16_t)terminal_offset);
++	spatial_param_terminal->base.size = terminal_size;
++	spatial_param_terminal->kernel_id = kernel_id;
++	spatial_param_terminal->fragment_grid_desc_offset =
++		sizeof(ia_css_spatial_param_terminal_t);
++	spatial_param_terminal->frame_grid_param_section_desc_offset =
++		spatial_param_terminal->fragment_grid_desc_offset +
++		(nof_fragments * sizeof(ia_css_fragment_grid_desc_t));
++
++	return 0;
++}
++
++/* Sliced terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_sliced_param_terminal_get_descriptor_size(
++	const unsigned int nof_slice_param_sections,
++	const unsigned int nof_slices[],
++	const unsigned int nof_fragments)
++{
++	unsigned int descriptor_size = 0;
++	unsigned int fragment_index;
++	unsigned int nof_slices_total = 0;
++
++	verifjmpexit(nof_slices != NULL);
++
++	for (fragment_index = 0;
++			fragment_index < nof_fragments; fragment_index++) {
++		nof_slices_total += nof_slices[fragment_index];
++	}
++
++	descriptor_size =
++		sizeof(ia_css_sliced_param_terminal_t) +
++		nof_fragments*sizeof(ia_css_fragment_slice_desc_t) +
++		nof_slices_total*nof_slice_param_sections*sizeof(
++			ia_css_fragment_param_section_desc_t);
++
++EXIT:
++	return descriptor_size;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_slice_desc_t *
++ia_css_sliced_param_terminal_get_fragment_slice_desc(
++	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const unsigned int fragment_index
++)
++{
++	ia_css_fragment_slice_desc_t *fragment_slice_desc_base;
++	ia_css_fragment_slice_desc_t *fragment_slice_desc = NULL;
++
++	verifjmpexit(sliced_param_terminal != NULL);
++
++	fragment_slice_desc_base =
++		(ia_css_fragment_slice_desc_t *)
++			(((const char *)sliced_param_terminal) +
++			sliced_param_terminal->fragment_slice_desc_offset);
++	fragment_slice_desc = &(fragment_slice_desc_base[fragment_index]);
++
++EXIT:
++	return fragment_slice_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_slice_param_section_desc_t *
++ia_css_sliced_param_terminal_get_slice_param_section_desc(
++	const ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const unsigned int fragment_index,
++	const unsigned int slice_index,
++	const unsigned int section_index,
++	const unsigned int nof_slice_param_sections)
++{
++	ia_css_fragment_slice_desc_t *fragment_slice_desc;
++	ia_css_slice_param_section_desc_t *slice_param_section_desc_base;
++	ia_css_slice_param_section_desc_t *slice_param_section_desc = NULL;
++
++	fragment_slice_desc =
++		ia_css_sliced_param_terminal_get_fragment_slice_desc(
++			sliced_param_terminal,
++			fragment_index
++			);
++	verifjmpexit(fragment_slice_desc != NULL);
++
++	slice_param_section_desc_base =
++		(ia_css_slice_param_section_desc_t *)
++		(((const char *)sliced_param_terminal) +
++		fragment_slice_desc->slice_section_desc_offset);
++	slice_param_section_desc =
++		&(slice_param_section_desc_base[(
++			slice_index * nof_slice_param_sections) +
++				section_index]);
++
++EXIT:
++	return slice_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_sliced_param_terminal_create(
++	ia_css_sliced_param_terminal_t *sliced_param_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const uint16_t is_input_terminal,
++	const unsigned int nof_slice_param_sections,
++	const unsigned int nof_slices[],
++	const unsigned int nof_fragments,
++	const uint32_t kernel_id)
++{
++	unsigned int fragment_index;
++	unsigned int nof_slices_total = 0;
++
++	if (sliced_param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	if (terminal_offset > (1<<15)) {
++		return -EINVAL;
++	}
++
++	sliced_param_terminal->base.terminal_type =
++		is_input_terminal ?
++		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN :
++		IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT;
++	sliced_param_terminal->base.parent_offset =
++		0 - ((int16_t)terminal_offset);
++	sliced_param_terminal->base.size = terminal_size;
++	sliced_param_terminal->kernel_id = kernel_id;
++	/* set here to use below to find the pointer */
++	sliced_param_terminal->fragment_slice_desc_offset =
++		sizeof(ia_css_sliced_param_terminal_t);
++	for (fragment_index = 0;
++			fragment_index < nof_fragments; fragment_index++) {
++		ia_css_fragment_slice_desc_t *fragment_slice_desc =
++			ia_css_sliced_param_terminal_get_fragment_slice_desc(
++				sliced_param_terminal,
++				fragment_index);
++		/*
++		 * Error handling not required at this point
++		 * since everything has been constructed/validated just above
++		 */
++		fragment_slice_desc->slice_count = nof_slices[fragment_index];
++		fragment_slice_desc->slice_section_desc_offset =
++			sliced_param_terminal->fragment_slice_desc_offset +
++			(nof_fragments * sizeof(
++					ia_css_fragment_slice_desc_t)) +
++			(nof_slices_total * nof_slice_param_sections * sizeof(
++					ia_css_slice_param_section_desc_t));
++		nof_slices_total += nof_slices[fragment_index];
++	}
++
++	return 0;
++}
++
++/* Program terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_program_terminal_get_descriptor_size(
++	const unsigned int nof_fragments,
++	const unsigned int nof_fragment_param_sections,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int nof_command_objs)
++{
++	/*only one fragment used*/
++	return sizeof(ia_css_program_terminal_t) +
++		nof_fragment_param_sections *
++		sizeof(ia_css_fragment_param_section_desc_t) +
++		nof_fragments * nof_kernel_fragment_sequencer_infos *
++		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t) +
++		nof_command_objs * sizeof(
++			ia_css_kernel_fragment_sequencer_command_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_param_section_desc_t *
++ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int fragment_index,
++	const unsigned int section_index,
++	const unsigned int nof_fragment_param_sections)
++{
++	ia_css_fragment_param_section_desc_t *
++		fragment_param_section_desc_base;
++	ia_css_fragment_param_section_desc_t *
++		fragment_param_section_desc = NULL;
++	NOT_USED(fragment_index);
++
++	verifjmpexit(program_terminal != NULL);
++	verifjmpexit(section_index < nof_fragment_param_sections);
++
++	fragment_param_section_desc_base =
++		(ia_css_fragment_param_section_desc_t *)
++			(((const char *)program_terminal) +
++			program_terminal->fragment_param_section_desc_offset);
++	fragment_param_section_desc = &(fragment_param_section_desc_base[section_index]);
++EXIT:
++	return fragment_param_section_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_kernel_fragment_sequencer_info_desc_t *
++ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int fragment_index,
++	const unsigned int info_index,
++	const unsigned int nof_kernel_fragment_sequencer_infos)
++{
++	ia_css_kernel_fragment_sequencer_info_desc_t *
++		kernel_fragment_sequencer_info_desc_base;
++	ia_css_kernel_fragment_sequencer_info_desc_t *
++		kernel_fragment_sequencer_info_desc = NULL;
++
++	verifjmpexit(program_terminal != NULL);
++	if (nof_kernel_fragment_sequencer_infos > 0) {
++		verifjmpexit(info_index < nof_kernel_fragment_sequencer_infos);
++	}
++
++	kernel_fragment_sequencer_info_desc_base =
++		(ia_css_kernel_fragment_sequencer_info_desc_t *)
++		(((const char *)program_terminal) +
++		program_terminal->kernel_fragment_sequencer_info_desc_offset);
++	kernel_fragment_sequencer_info_desc =
++		&(kernel_fragment_sequencer_info_desc_base[(fragment_index *
++			nof_kernel_fragment_sequencer_infos) + info_index]);
++
++EXIT:
++	return kernel_fragment_sequencer_info_desc;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_create(
++	ia_css_program_terminal_t *program_terminal,
++	const uint16_t terminal_offset,
++	const uint16_t terminal_size,
++	const unsigned int nof_fragments,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int nof_command_objs)
++{
++	if (program_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	if (terminal_offset > (1<<15)) {
++		return -EINVAL;
++	}
++
++	program_terminal->base.terminal_type = IA_CSS_TERMINAL_TYPE_PROGRAM;
++	program_terminal->base.parent_offset = 0-((int16_t)terminal_offset);
++	program_terminal->base.size = terminal_size;
++	program_terminal->kernel_fragment_sequencer_info_desc_offset =
++		sizeof(ia_css_program_terminal_t);
++	program_terminal->fragment_param_section_desc_offset =
++		program_terminal->kernel_fragment_sequencer_info_desc_offset +
++		(nof_fragments * nof_kernel_fragment_sequencer_infos *
++		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++		(nof_command_objs * sizeof(
++			ia_css_kernel_fragment_sequencer_command_desc_t));
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_get_command_base_offset(
++	const ia_css_program_terminal_t *program_terminal,
++	const unsigned int nof_fragments,
++	const unsigned int nof_kernel_fragment_sequencer_infos,
++	const unsigned int commands_slots_used,
++	uint16_t *command_desc_offset)
++{
++	if (command_desc_offset == NULL) {
++		return -EFAULT;
++	}
++
++	*command_desc_offset = 0;
++
++	if (program_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	*command_desc_offset =
++		program_terminal->kernel_fragment_sequencer_info_desc_offset +
++		(nof_fragments * nof_kernel_fragment_sequencer_infos *
++		sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++		(commands_slots_used * sizeof(
++			ia_css_kernel_fragment_sequencer_command_desc_t));
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint16_t *ia_css_program_terminal_get_line_count(
++	const ia_css_kernel_fragment_sequencer_command_desc_t
++	*kernel_fragment_sequencer_command_desc_base,
++	const unsigned int set_count)
++{
++	uint16_t *line_count = NULL;
++
++	verifjmpexit(kernel_fragment_sequencer_command_desc_base != NULL);
++	line_count =
++		(uint16_t *)&(kernel_fragment_sequencer_command_desc_base[
++			set_count >> 2].line_count[set_count & 0x00000003]);
++EXIT:
++	return line_count;
++}
++
++#endif /* __IA_CSS_TERMINAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
+new file mode 100644
+index 000000000000..0000610e945c
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest.h
+@@ -0,0 +1,233 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_H
++#define __IA_CSS_TERMINAL_MANIFEST_H
++
++#include "type_support.h"
++#include "ia_css_param_storage_class.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#define MANIFEST_SECTION_DESC_KERNEL_ID_MASK     0xFF
++#define MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET   0
++#define MANIFEST_SECTION_DESC_REGION_ID_MASK     0xF
++#define MANIFEST_SECTION_DESC_REGION_ID_OFFSET   8
++#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK   0xF
++#define MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET 12
++
++/** Returns the size in bytes required to store this
++ *  terminal's manifest entry.
++ *
++ *  Used as part of binary manifest generation. It helps
++ *  to determine the amount of memory required
++ *  to store a parameter terminal manifest entry for
++ *  allocation before initialization
++ *
++ *  @param [in] nof_sections Number of sections (==
++ *  number of descriptors)
++ *
++ *  @return Size in bytes required for an entry.
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_param_terminal_manifest_get_size(
++	const unsigned int nof_sections
++);
++
++/** Initialize a parameter terminal manifest entry.
++ *
++ *  Used as part of binary manifest generation.
++ *
++ *  @param param_terminal Terminal entry to initialize.  Must
++ *  have been allocated with the size determined by
++ *  ia_css_param_terminal_manifest_get_size().
++ *
++ *  @return 0 on success, -EFAULT if param_terminal is NULL.
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_param_terminal_manifest_init(
++	ia_css_param_terminal_manifest_t *param_terminal,
++	const uint16_t section_count
++);
++
++/** Returns a section descriptor for a parameter terminal.
++ *
++ *  @param param_terminal_manifest Parameter terminal manifest handle
++ *  @param section_index Index of descriptor.  Must be smaller than the
++ *  value returned by ia_css_param_terminal_manifest_get_prm_sct_desc_count()
++ *
++ *  @return Pointer to a descriptor structure
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_param_manifest_section_desc_t *
++ia_css_param_terminal_manifest_get_prm_sct_desc(
++	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_spatial_param_terminal_manifest_get_size(
++	const unsigned int nof_frame_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_spatial_param_terminal_manifest_init(
++	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
++	const uint16_t section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_frame_grid_param_manifest_section_desc_t *
++ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++	const ia_css_spatial_param_terminal_manifest_t *
++		spatial_param_terminal_manifest,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_sliced_param_terminal_manifest_get_size(
++	const unsigned int nof_slice_param_sections
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_sliced_param_terminal_manifest_init(
++	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
++	const uint16_t section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_sliced_param_manifest_section_desc_t *
++ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++	const ia_css_sliced_param_terminal_manifest_t *
++		sliced_param_terminal_manifest,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++unsigned int ia_css_program_terminal_manifest_get_size(
++	const unsigned int nof_fragment_param_sections,
++	const unsigned int nof_kernel_fragment_sequencer_infos
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++int ia_css_program_terminal_manifest_init(
++	ia_css_program_terminal_manifest_t *program_terminal,
++	const uint16_t fragment_param_section_count,
++	const uint16_t kernel_fragment_seq_info_section_count
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_fragment_param_manifest_section_desc_t *
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++	const unsigned int section_index
++);
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_H
++ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
++	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++	const unsigned int info_index
++);
++
++/*! Getter for kernel id
++
++  The function return the kernel id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] param manifest section desc
++
++ @return kernel_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C uint8_t
++ia_css_param_manifest_section_desc_get_kernel_id(
++	const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for  region_id
++
++  The function return the region_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] param manifest section desc
++
++ @return region_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_region_id(
++	const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for mem_type_id
++
++  The function return the mem_type_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] param manifest section desc
++
++ @return mem_type_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
++	const ia_css_param_manifest_section_desc_t *section);
++
++/*! Getter for kernel id
++
++  The function return the kernel id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] fragment manifest section desc
++
++ @return kernel_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section);
++
++/*! Getter for  region_id
++
++  The function return the region_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] fragment manifest section desc
++
++ @return region_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section);
++
++/*! Getter for mem_type_id
++
++  The function return the mem_type_id
++  field from the section
++  This field shouldn't accessed directly
++  only with the getter function
++ @param	[in] fragment manifest section desc
++
++ @return mem_type_id
++ */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section);
++
++#ifdef __INLINE_PARAMETERS__
++#include "ia_css_terminal_manifest_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
+new file mode 100644
+index 000000000000..5b3226bbf9b0
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_base_types.h
+@@ -0,0 +1,75 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
++#define __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H
++
++#include "ia_css_terminal_defs.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++typedef struct ia_css_terminal_manifest_attributes_t {
++	uint16_t category:1; /**< load vs. connect.  @see ia_css_terminal_cat_t */
++	uint16_t direction:1; /**< input vs. output. @see ia_css_terminal_dir_t */
++	uint16_t rou:2; /**< Rate Of Update.  @see ia_css_terminal_rou_t */
++	uint16_t connect_buf_type:2; /**< image data vs. meta-data. @see ia_css_connect_buf_type_t */
++	uint16_t reserved:10;
++	} ia_css_terminal_manifest_attributes_t;
++#define IA_CSS_TERMINAL_ATTRIBUTE_BITS IA_CSS_UINT16_T_BITS
++
++#define N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT	0
++#define SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	(IA_CSS_TERMINAL_TYPE_BITS \
++	+ IA_CSS_UINT32_T_BITS \
++	+ IA_CSS_UINT16_T_BITS \
++	+ IA_CSS_UINT16_T_BITS \
++	+ IA_CSS_TERMINAL_ATTRIBUTE_BITS \
++	+ IA_CSS_TERMINAL_ID_BITS \
++	+ IA_CSS_TERMINAL_ID_BITS \
++	+ (N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT*IA_CSS_UINT8_T_BITS))
++
++/* ==================== Base Terminal Manifest - START ==================== */
++struct ia_css_terminal_manifest_s {
++	ia_css_terminal_type_t				terminal_type;		/**< Type ia_css_terminal_type_t */
++	/**  Max size of payload buffer for instances of this terminal
++	 *
++	 *   For load terminals, this is the size of all sections, as defined in the manifest
++	 *   descriptors.  For connect terminals, this is the max buffer size.
++	 */
++	uint32_t					max_payload_size;
++	int16_t						parent_offset;		/**< Offset to the program group manifest */
++	uint16_t					size;			/**< Size of this whole terminal-manifest layout-structure */
++	ia_css_terminal_manifest_attributes_t	attributes; /**< Bit fields describing the terminal attributes */
++	ia_css_terminal_ID_t				ID; /**< The unique identifier of this terminal in the PG */
++	/** The unique identifier of another terminal in the PG, associated with this one.
++	 *  Set to IA_CSS_TERMINAL_INVALID_ID by default (--> no associated terminal) */
++	ia_css_terminal_ID_t				assoc_ID;
++#if N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT > 0
++	uint8_t						padding[N_PADDING_UINT8_IN_TERMINAL_MAN_STRUCT];
++#endif
++};
++
++typedef struct ia_css_terminal_manifest_s
++	ia_css_terminal_manifest_t;
++
++/* ==================== Base Terminal Manifest - END ==================== */
++
++/** @} */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_BASE_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
+new file mode 100644
+index 000000000000..207bb7502208
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_impl.h
+@@ -0,0 +1,391 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_IMPL_H
++#define __IA_CSS_TERMINAL_MANIFEST_IMPL_H
++
++#include "ia_css_terminal_manifest.h"
++#include "error_support.h"
++#include "assert_support.h"
++#include "storage_class.h"
++
++STORAGE_CLASS_INLINE void __terminal_manifest_dummy_check_alignment(void)
++{
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_param_terminal_manifest_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_param_terminal_manifest_t) % sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(ia_css_param_manifest_section_desc_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_param_manifest_section_desc_t) %
++			sizeof(uint32_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(ia_css_spatial_param_terminal_manifest_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_spatial_param_terminal_manifest_t) %
++			sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(
++			ia_css_frame_grid_param_manifest_section_desc_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_frame_grid_param_manifest_section_desc_t) %
++			sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(ia_css_program_terminal_manifest_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_program_terminal_manifest_t)%sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(
++			ia_css_fragment_param_manifest_section_desc_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_fragment_param_manifest_section_desc_t) %
++			sizeof(uint32_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(
++			ia_css_kernel_fragment_sequencer_info_manifest_desc_t))
++		);
++
++	COMPILATION_ERROR_IF(0 != sizeof(
++		ia_css_kernel_fragment_sequencer_info_manifest_desc_t) %
++			sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof(ia_css_sliced_param_terminal_manifest_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_sliced_param_terminal_manifest_t) %
++			sizeof(uint64_t));
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS !=
++		(CHAR_BIT * sizeof
++			(ia_css_sliced_param_manifest_section_desc_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++		sizeof(ia_css_sliced_param_manifest_section_desc_t) %
++			sizeof(uint64_t));
++}
++
++/* Parameter Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_param_terminal_manifest_get_size(
++	const unsigned int nof_sections)
++{
++
++	return sizeof(ia_css_param_terminal_manifest_t) +
++		nof_sections*sizeof(ia_css_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_param_terminal_manifest_init(
++	ia_css_param_terminal_manifest_t *param_terminal,
++	const uint16_t section_count)
++{
++	if (param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	param_terminal->param_manifest_section_desc_count = section_count;
++	param_terminal->param_manifest_section_desc_offset = sizeof(
++				ia_css_param_terminal_manifest_t);
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_param_manifest_section_desc_t *
++ia_css_param_terminal_manifest_get_prm_sct_desc(
++	const ia_css_param_terminal_manifest_t *param_terminal_manifest,
++	const unsigned int section_index)
++{
++	ia_css_param_manifest_section_desc_t *param_manifest_section_base;
++	ia_css_param_manifest_section_desc_t *
++		param_manifest_section_desc = NULL;
++
++	verifjmpexit(param_terminal_manifest != NULL);
++
++	param_manifest_section_base =
++		(ia_css_param_manifest_section_desc_t *)
++		(((const char *)param_terminal_manifest)
++		+ param_terminal_manifest->param_manifest_section_desc_offset);
++
++	param_manifest_section_desc =
++		&(param_manifest_section_base[section_index]);
++
++EXIT:
++	return param_manifest_section_desc;
++}
++
++/* Spatial Parameter Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_spatial_param_terminal_manifest_get_size(
++	const unsigned int nof_frame_param_sections)
++{
++	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
++		nof_frame_param_sections * sizeof(
++			ia_css_frame_grid_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_spatial_param_terminal_manifest_init(
++	ia_css_spatial_param_terminal_manifest_t *spatial_param_terminal,
++	const uint16_t section_count)
++{
++	if (spatial_param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	spatial_param_terminal->
++		frame_grid_param_manifest_section_desc_count = section_count;
++	spatial_param_terminal->
++		frame_grid_param_manifest_section_desc_offset =
++		sizeof(ia_css_spatial_param_terminal_manifest_t);
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_frame_grid_param_manifest_section_desc_t *
++ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++	const ia_css_spatial_param_terminal_manifest_t *
++		spatial_param_terminal_manifest,
++	const unsigned int section_index)
++{
++	ia_css_frame_grid_param_manifest_section_desc_t *
++		frame_param_manifest_section_base;
++	ia_css_frame_grid_param_manifest_section_desc_t *
++		frame_param_manifest_section_desc = NULL;
++
++	verifjmpexit(spatial_param_terminal_manifest != NULL);
++
++	frame_param_manifest_section_base =
++		(ia_css_frame_grid_param_manifest_section_desc_t *)
++		(((const char *)spatial_param_terminal_manifest) +
++			spatial_param_terminal_manifest->
++			frame_grid_param_manifest_section_desc_offset);
++	frame_param_manifest_section_desc =
++		&(frame_param_manifest_section_base[section_index]);
++
++EXIT:
++	return frame_param_manifest_section_desc;
++}
++
++/* Sliced Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_sliced_param_terminal_manifest_get_size(
++	const unsigned int nof_slice_param_sections)
++{
++	return sizeof(ia_css_spatial_param_terminal_manifest_t) +
++		nof_slice_param_sections *
++		sizeof(ia_css_sliced_param_manifest_section_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_sliced_param_terminal_manifest_init(
++	ia_css_sliced_param_terminal_manifest_t *sliced_param_terminal,
++	const uint16_t section_count)
++{
++	if (sliced_param_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	sliced_param_terminal->sliced_param_section_count = section_count;
++	sliced_param_terminal->sliced_param_section_offset =
++		sizeof(ia_css_sliced_param_terminal_manifest_t);
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_sliced_param_manifest_section_desc_t *
++ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++	const ia_css_sliced_param_terminal_manifest_t *
++		sliced_param_terminal_manifest,
++	const unsigned int section_index)
++{
++	ia_css_sliced_param_manifest_section_desc_t *
++		sliced_param_manifest_section_base;
++	ia_css_sliced_param_manifest_section_desc_t *
++		sliced_param_manifest_section_desc = NULL;
++
++	verifjmpexit(sliced_param_terminal_manifest != NULL);
++
++	sliced_param_manifest_section_base =
++		(ia_css_sliced_param_manifest_section_desc_t *)
++		(((const char *)sliced_param_terminal_manifest) +
++			sliced_param_terminal_manifest->
++			sliced_param_section_offset);
++	sliced_param_manifest_section_desc =
++		&(sliced_param_manifest_section_base[section_index]);
++
++EXIT:
++	return sliced_param_manifest_section_desc;
++}
++
++/* Program Terminal */
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++unsigned int ia_css_program_terminal_manifest_get_size(
++	const unsigned int nof_fragment_param_sections,
++	const unsigned int nof_kernel_fragment_sequencer_infos)
++{
++	return sizeof(ia_css_program_terminal_manifest_t) +
++		nof_fragment_param_sections *
++		sizeof(ia_css_fragment_param_manifest_section_desc_t) +
++		nof_kernel_fragment_sequencer_infos *
++		sizeof(ia_css_kernel_fragment_sequencer_info_manifest_desc_t);
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++int ia_css_program_terminal_manifest_init(
++	ia_css_program_terminal_manifest_t *program_terminal,
++	const uint16_t fragment_param_section_count,
++	const uint16_t kernel_fragment_seq_info_section_count)
++{
++	if (program_terminal == NULL) {
++		return -EFAULT;
++	}
++
++	program_terminal->fragment_param_manifest_section_desc_count =
++		fragment_param_section_count;
++	program_terminal->fragment_param_manifest_section_desc_offset =
++		sizeof(ia_css_program_terminal_manifest_t);
++
++	program_terminal->kernel_fragment_sequencer_info_manifest_info_count =
++		kernel_fragment_seq_info_section_count;
++	program_terminal->kernel_fragment_sequencer_info_manifest_info_offset =
++		sizeof(ia_css_program_terminal_manifest_t) +
++		fragment_param_section_count*sizeof(
++			ia_css_fragment_param_manifest_section_desc_t);
++
++	return 0;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_fragment_param_manifest_section_desc_t *
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++	const unsigned int section_index)
++{
++	ia_css_fragment_param_manifest_section_desc_t *
++		fragment_param_manifest_section_base;
++	ia_css_fragment_param_manifest_section_desc_t *
++		fragment_param_manifest_section = NULL;
++
++	verifjmpexit(program_terminal_manifest != NULL);
++
++	fragment_param_manifest_section_base =
++		(ia_css_fragment_param_manifest_section_desc_t *)
++		(((const char *)program_terminal_manifest) +
++		program_terminal_manifest->
++		fragment_param_manifest_section_desc_offset);
++	fragment_param_manifest_section =
++		&(fragment_param_manifest_section_base[section_index]);
++
++EXIT:
++	return fragment_param_manifest_section;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc(
++	const ia_css_program_terminal_manifest_t *program_terminal_manifest,
++	const unsigned int info_index)
++{
++	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++		kernel_manifest_fragment_sequencer_info_manifest_desc_base;
++	ia_css_kernel_fragment_sequencer_info_manifest_desc_t *
++		kernel_manifest_fragment_sequencer_info_manifest_desc = NULL;
++
++	verifjmpexit(program_terminal_manifest != NULL);
++
++	kernel_manifest_fragment_sequencer_info_manifest_desc_base =
++		(ia_css_kernel_fragment_sequencer_info_manifest_desc_t *)
++		(((const char *)program_terminal_manifest) +
++		program_terminal_manifest->
++		kernel_fragment_sequencer_info_manifest_info_offset);
++
++	kernel_manifest_fragment_sequencer_info_manifest_desc =
++		&(kernel_manifest_fragment_sequencer_info_manifest_desc_base[
++				info_index]);
++
++EXIT:
++	return kernel_manifest_fragment_sequencer_info_manifest_desc;
++}
++
++/* Start ...*/
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_kernel_id(
++	const ia_css_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_region_id(
++	const ia_css_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_param_manifest_section_desc_get_mem_type_id(
++	const ia_css_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
++}
++
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_kernel_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_KERNEL_ID_OFFSET) & MANIFEST_SECTION_DESC_KERNEL_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_region_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_REGION_ID_OFFSET) & MANIFEST_SECTION_DESC_REGION_ID_MASK;
++}
++IA_CSS_PARAMETERS_STORAGE_CLASS_C
++uint8_t ia_css_fragment_param_manifest_section_desc_get_mem_type_id(
++	const ia_css_fragment_param_manifest_section_desc_t *section)
++{
++	return (section->info >> MANIFEST_SECTION_DESC_MEM_TYPE_ID_OFFSET) & MANIFEST_SECTION_DESC_MEM_TYPE_ID_MASK;
++}
++
++/* End ...*/
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
+new file mode 100644
+index 000000000000..41ec4ccf3ee9
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_manifest_types.h
+@@ -0,0 +1,349 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_MANIFEST_TYPES_H
++#define __IA_CSS_TERMINAL_MANIFEST_TYPES_H
++
++#include "ia_css_terminal_defs.h"
++#include "type_support.h"
++#include "ia_css_base_types.h"
++#include "ia_css_terminal_manifest_base_types.h"
++
++/**
++ * @addtogroup group_psysapi
++ * @{
++ */
++
++#define SIZE_OF_PARAM_TERMINAL_MANIFEST_SEC_STRUCT_IN_BITS \
++	(2 * IA_CSS_UINT16_T_BITS)
++
++/* =============== Cached Param Terminal Manifest - START ============== */
++/** Descriptor for a single manifest parameter section.
++ *
++ * Each descriptor describes a single contiguous parameter payload that will
++ * be written to hardware registers or other memory.  It defines the maximum
++ * size of the section payload (critical for allocation and security), the device the
++ * section belongs to, and the target memory type (usually device registers).
++ *
++ * A region ID allows specifying multiple sections for a single device when a
++ * device's configuration registers are not all contigous.
++ */
++struct ia_css_param_manifest_section_desc_s {
++	/** Maximum size of the related parameter region */
++	uint16_t max_mem_size;
++	/** mem_type, region and kernel_id
++	  * - mem_type - Memory targeted by this section
++	  * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++	  * - Region - subsection id within the specified memory
++	  * - kernel_id - Indication of the kernel/device this parameter belongs to */
++	uint16_t info;
++};
++
++typedef struct ia_css_param_manifest_section_desc_s
++	ia_css_param_manifest_section_desc_t;
++
++#define N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT 4
++#define SIZE_OF_PARAM_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	+ (2*IA_CSS_UINT16_T_BITS) \
++	+ (N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/** Frame constant parameters terminal manifest
++ *
++ * This is the "header" for a list of parameter sections described by
++ * ia_css_param_manifest_section_desc_s.
++ */
++struct ia_css_param_terminal_manifest_s {
++	/** Parameter terminal manifest base */
++	ia_css_terminal_manifest_t base;
++	/**
++	 * Number of cached parameter sections, coming from manifest
++	 * but also shared by the terminal
++	 */
++	uint16_t param_manifest_section_desc_count;
++	/**
++	 * Points to the variable array of
++	 * struct ia_css_param_section_desc_s
++	 */
++	uint16_t param_manifest_section_desc_offset;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_MAN_STRUCT];
++};
++
++typedef struct ia_css_param_terminal_manifest_s
++	ia_css_param_terminal_manifest_t;
++/* ================= Cached Param Terminal Manifest - End ================ */
++
++/* ================= Spatial Param Terminal Manifest - START ============= */
++
++#define SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS \
++	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
++	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
++
++struct ia_css_fragment_grid_manifest_desc_s {
++	/* Min resolution width/height of the spatial parameters
++	 * for the fragment measured in compute units
++	 */
++	uint16_t min_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++	/* Max resolution width/height of the spatial parameters
++	 * for the fragment measured in compute units
++	 */
++	uint16_t max_fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_fragment_grid_manifest_desc_s
++	ia_css_fragment_grid_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT 1
++#define SIZE_OF_FRAME_GRID_PARAM_MAN_SEC_STRUCT_IN_BITS \
++	(1 * IA_CSS_UINT32_T_BITS \
++	+ 3 * IA_CSS_UINT8_T_BITS \
++	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_frame_grid_param_manifest_section_desc_s {
++	/* Maximum buffer total size allowed for
++	 * this frame of parameters
++	 */
++	uint32_t max_mem_size;
++	/* Memory space targeted by this section
++	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++	 */
++	uint8_t mem_type_id;
++	/* Region id within the specified memory space */
++	uint8_t region_id;
++	/* size in bytes of each compute unit for
++	 * the specified memory space and region
++	 */
++	uint8_t elem_size;
++	/* align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_MAN_SEC_STRUCT];
++};
++
++typedef struct ia_css_frame_grid_param_manifest_section_desc_s
++	ia_css_frame_grid_param_manifest_section_desc_t;
++
++#define SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS \
++	((IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS) \
++	+ (IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS))
++
++struct ia_css_frame_grid_manifest_desc_s {
++	/* Min resolution width/height of the spatial parameters for
++	 * the frame measured in compute units
++	 */
++	uint16_t min_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++	/* Max resolution width/height of the spatial parameters for
++	 * the frame measured in compute units
++	 */
++	uint16_t max_frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_frame_grid_manifest_desc_s
++	ia_css_frame_grid_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT 2
++#define SIZE_OF_SPATIAL_PARAM_TERM_MAN_STRUCT_IN_BITS \
++	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
++	+ (SIZE_OF_FRAME_GRID_MAN_STRUCT_IN_BITS) \
++	+ (SIZE_OF_FRAG_GRID_MAN_STRUCT_IN_BITS) \
++	+ (2 * IA_CSS_UINT16_T_BITS) \
++	+ (2 * IA_CSS_UINT8_T_BITS) \
++	+ (N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT * \
++	IA_CSS_UINT8_T_BITS))
++
++/** Spatial parameters terminal manifest */
++struct ia_css_spatial_param_terminal_manifest_s {
++	/** terminal manifest base object */
++	ia_css_terminal_manifest_t base;
++	/** Contains limits for the frame spatial parameters */
++	ia_css_frame_grid_manifest_desc_t frame_grid_desc;
++	/**
++	 * Constains limits for the fragment spatial parameters
++	 * - COMMON AMONG FRAGMENTS
++	 */
++	ia_css_fragment_grid_manifest_desc_t common_fragment_grid_desc;
++	/**
++	 * Number of frame spatial parameter sections, they are set
++	 * in slice-steps through frame processing
++	 */
++	uint16_t frame_grid_param_manifest_section_desc_count;
++	/**
++	 * Points to the variable array of
++	 * ia_css_frame_spatial_param_manifest_section_desc_t
++	 */
++	uint16_t frame_grid_param_manifest_section_desc_offset;
++	/**
++	 * Indication of the kernel this spatial parameter terminal belongs to
++	 * SHOULD MATCH TO INDEX AND BE USED ONLY FOR CHECK
++	 */
++	uint8_t kernel_id;
++	/**
++	 * Groups together compute units in order to achieve alignment
++	 * requirements for transfes and to achieve canonical frame
++	 * representation
++	 */
++	uint8_t compute_units_p_elem;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_SPATIAL_PARAM_TERM_MAN_STRUCT];
++};
++
++typedef struct ia_css_spatial_param_terminal_manifest_s
++	ia_css_spatial_param_terminal_manifest_t;
++
++/* ================= Spatial Param Terminal Manifest - END ================ */
++
++/* ================= Sliced Param Terminal Manifest - START =============== */
++
++#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT (2)
++#define SIZE_OF_SLICED_PARAM_MAN_SEC_STRUCT_IN_BITS \
++	(1 * IA_CSS_UINT32_T_BITS \
++	+ 2 * IA_CSS_UINT8_T_BITS \
++	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_sliced_param_manifest_section_desc_s {
++	/** Maximum size of the related parameter region */
++	uint32_t max_mem_size;
++	/**
++	 * Memory targeted by this section
++	 * (Register MMIO Interface/DMEM/VMEM/GMEM etc)
++	 */
++	uint8_t mem_type_id;
++	/** Region id within the specified memory */
++	uint8_t region_id;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MAN_SECTION_STRUCT];
++};
++
++typedef struct ia_css_sliced_param_manifest_section_desc_s
++	ia_css_sliced_param_manifest_section_desc_t;
++
++#define N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT 3
++#define SIZE_OF_SLICED_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	(SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS \
++	+ 2 * IA_CSS_UINT16_T_BITS \
++	+ 1 * IA_CSS_UINT8_T_BITS \
++	+ N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/* Frame constant parameters terminal manifest */
++struct ia_css_sliced_param_terminal_manifest_s {
++	/** terminal manifest base object */
++	ia_css_terminal_manifest_t base;
++	/**
++	 * Number of the array elements
++	 * sliced_param_section_offset points to
++	 */
++	uint16_t sliced_param_section_count;
++	/**
++	 * Points to array of ia_css_sliced_param_manifest_section_desc_s
++	 * which constain info for the slicing of the parameters
++	 */
++	uint16_t sliced_param_section_offset;
++	/** Kernel identifier */
++	uint8_t kernel_id;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_SLICED_TERMINAL_MANIFEST_STRUCT];
++};
++
++typedef struct ia_css_sliced_param_terminal_manifest_s
++	ia_css_sliced_param_terminal_manifest_t;
++
++/* ================= Slice Param Terminal Manifest - End =============== */
++
++/* ================= Program Terminal Manifest - START ================= */
++
++#define SIZE_OF_FRAG_PARAM_MAN_SEC_STRUCT_IN_BITS \
++	(2 * IA_CSS_UINT16_T_BITS)
++
++/** Fragment constant parameters manifest */
++struct ia_css_fragment_param_manifest_section_desc_s {
++	/** Maximum size of the related parameter region */
++	uint16_t max_mem_size;
++	/** (mem_type, region and kernel_id) */
++	uint16_t info;
++};
++
++typedef struct ia_css_fragment_param_manifest_section_desc_s
++	ia_css_fragment_param_manifest_section_desc_t;
++
++#define SIZE_OF_KERNEL_FRAG_SEQ_INFO_MAN_STRUCT_IN_BITS \
++	(10*IA_CSS_N_DATA_DIMENSION*IA_CSS_UINT16_T_BITS)
++
++struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s {
++	/* Slice dimensions */
++	uint16_t min_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++	/* Slice dimensions */
++	uint16_t max_fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++	/* Nof slices */
++	uint16_t min_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++	/* Nof slices */
++	uint16_t max_fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++	/* Grid point decimation factor */
++	uint16_t
++	min_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++	/* Grid point decimation factor */
++	uint16_t
++	max_fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++	/* Relative position of grid origin to pixel origin */
++	int16_t
++	min_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++	/* Relative position of grid origin to pixel origin */
++	int16_t
++	max_fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++	/* Dimension of grid */
++	int16_t
++	min_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++	/* Dimension of grid */
++	int16_t
++	max_fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++typedef struct ia_css_kernel_fragment_sequencer_info_manifest_desc_s
++	ia_css_kernel_fragment_sequencer_info_manifest_desc_t;
++
++#define N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT 2
++#define SIZE_OF_PROG_TERM_MAN_STRUCT_IN_BITS \
++	((SIZE_OF_TERMINAL_MANIFEST_STRUCT_IN_BITS) \
++	+ (IA_CSS_UINT32_T_BITS) \
++	+ (5*IA_CSS_UINT16_T_BITS) \
++	+ (N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT * IA_CSS_UINT8_T_BITS))
++
++/** Program parameters terminal */
++struct ia_css_program_terminal_manifest_s {
++	/** terminal manifest base object */
++	ia_css_terminal_manifest_t base;
++	/** Connection manager passes seq info as single blob at the moment */
++	uint32_t sequencer_info_kernel_id;
++	/** Maximum number of command secriptors supported
++	 * by the program group
++	 */
++	uint16_t max_kernel_fragment_sequencer_command_desc;
++	/** The total count of prog-init parameter descriptors */
++	uint16_t fragment_param_manifest_section_desc_count;
++	/** The offset of the manifest section descriptor from the base of this structure */
++	uint16_t fragment_param_manifest_section_desc_offset;
++	uint16_t kernel_fragment_sequencer_info_manifest_info_count;
++	uint16_t kernel_fragment_sequencer_info_manifest_info_offset;
++	/** align to 64 */
++	uint8_t padding[N_PADDING_UINT8_IN_PROGRAM_TERM_MAN_STRUCT];
++};
++
++typedef struct ia_css_program_terminal_manifest_s
++	ia_css_program_terminal_manifest_t;
++
++/* ==================== Program Terminal Manifest - END ==================== */
++
++/** @} */
++
++#endif /* __IA_CSS_TERMINAL_MANIFEST_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
+new file mode 100644
+index 000000000000..2eb9c88468dc
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_terminal_types.h
+@@ -0,0 +1,477 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_TERMINAL_TYPES_H
++#define __IA_CSS_TERMINAL_TYPES_H
++
++#include "type_support.h"
++#include "ia_css_base_types.h"
++#include "ia_css_terminal_base_types.h"
++
++typedef struct ia_css_program_control_init_load_section_desc_s
++	ia_css_program_control_init_load_section_desc_t;
++typedef struct ia_css_program_control_init_connect_section_desc_s
++	ia_css_program_control_init_connect_section_desc_t;
++typedef struct ia_css_program_control_init_program_desc_s
++	ia_css_program_control_init_program_desc_t;
++typedef struct ia_css_program_control_init_terminal_s
++	ia_css_program_control_init_terminal_t;
++
++typedef struct ia_css_program_terminal_s ia_css_program_terminal_t;
++typedef struct ia_css_fragment_param_section_desc_s
++	ia_css_fragment_param_section_desc_t;
++typedef struct ia_css_kernel_fragment_sequencer_info_desc_s
++	ia_css_kernel_fragment_sequencer_info_desc_t;
++typedef struct ia_css_kernel_fragment_sequencer_command_desc_s
++	ia_css_kernel_fragment_sequencer_command_desc_t;
++
++typedef struct ia_css_sliced_param_terminal_s ia_css_sliced_param_terminal_t;
++typedef struct ia_css_fragment_slice_desc_s ia_css_fragment_slice_desc_t;
++typedef struct ia_css_slice_param_section_desc_s
++	ia_css_slice_param_section_desc_t;
++
++typedef struct ia_css_spatial_param_terminal_s ia_css_spatial_param_terminal_t;
++typedef struct ia_css_frame_grid_desc_s ia_css_frame_grid_desc_t;
++typedef struct ia_css_frame_grid_param_section_desc_s
++	ia_css_frame_grid_param_section_desc_t;
++typedef struct ia_css_fragment_grid_desc_s ia_css_fragment_grid_desc_t;
++
++typedef struct ia_css_param_terminal_s ia_css_param_terminal_t;
++typedef struct ia_css_param_section_desc_s ia_css_param_section_desc_t;
++
++typedef struct ia_css_param_payload_s ia_css_param_payload_t;
++typedef struct ia_css_terminal_s ia_css_terminal_t;
++
++/* =================== Generic Parameter Payload - START =================== */
++#define N_UINT64_IN_PARAM_PAYLOAD_STRUCT	1
++#define N_UINT32_IN_PARAM_PAYLOAD_STRUCT	1
++
++#define IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	(N_UINT64_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT64_T_BITS \
++	+ VIED_VADDRESS_BITS \
++	+ N_UINT32_IN_PARAM_PAYLOAD_STRUCT * IA_CSS_UINT32_T_BITS)
++
++struct ia_css_param_payload_s {
++	/**
++	 * Temporary variable holding the host address of the parameter buffer
++	 * as PSYS is handling the parameters on the host side for the moment
++	 */
++	uint64_t host_buffer;
++	/**
++	 * Base virtual addresses to parameters in subsystem virtual
++	 * memory space
++	 * NOTE: Used in legacy pg flow
++	 */
++	vied_vaddress_t buffer;
++	/**
++	 * Offset to buffer address within external buffer set structure
++	 * NOTE: Used in ppg flow
++	 */
++	uint32_t terminal_index;
++};
++/* =================== Generic Parameter Payload - End ==================== */
++
++/* ==================== Cached Param Terminal - START ==================== */
++#define N_UINT32_IN_PARAM_SEC_STRUCT 2
++
++#define SIZE_OF_PARAM_SEC_STRUCT_BITS \
++	(N_UINT32_IN_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** Parameters section */
++struct ia_css_param_section_desc_s {
++	/** Offset of the parameter allocation in memory */
++	uint32_t mem_offset;
++	/** Memory allocation size needs of this parameter */
++	uint32_t mem_size;
++};
++
++#define N_UINT16_IN_PARAM_TERMINAL_STRUCT		1
++#define N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT	6
++
++#define SIZE_OF_PARAM_TERMINAL_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	+ N_UINT16_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/** "Cached" parameters terminal for parameter that do not change
++ * at frame scope.
++ */
++struct ia_css_param_terminal_s {
++	/** Parameter terminal base */
++	ia_css_terminal_t base;
++	/** Helps to identify the parameter buffer when sent later on with the buffer set  */
++	ia_css_param_payload_t param_payload;
++	/** Points to the variable array of ia_css_param_section_desc_t */
++	uint16_t param_section_desc_offset;
++	uint8_t padding[N_PADDING_UINT8_IN_PARAM_TERMINAL_STRUCT];
++};
++/* ==================== Cached Param Terminal - End ==================== */
++
++/* ==================== Spatial Param Terminal - START ==================== */
++#define N_UINT16_IN_FRAG_GRID_STRUCT (2 * IA_CSS_N_DATA_DIMENSION)
++
++#define SIZE_OF_FRAG_GRID_STRUCT_BITS \
++	(N_UINT16_IN_FRAG_GRID_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_fragment_grid_desc_s {
++	/**
++	 * Offset width/height of the top-left compute unit of the
++	 * fragment compared to the frame
++	 */
++	uint16_t fragment_grid_index[IA_CSS_N_DATA_DIMENSION];
++	/**
++	 * Resolution width/height of the spatial parameters that
++	 * correspond to the fragment measured in compute units
++	 */
++	uint16_t fragment_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++};
++
++#define N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT		3
++#define N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT	4
++
++#define SIZE_OF_FRAME_GRID_PARAM_SEC_STRUCT_BITS \
++	(N_UINT32_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS \
++	+ N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++/**
++ * A plane of parameters with spatial aspect
++ * (compute units correlated to pixel data)
++ */
++struct ia_css_frame_grid_param_section_desc_s {
++	/** Offset of the parameter allocation in memory */
++	uint32_t mem_offset;
++	/** Memory allocation size needs of this parameter */
++	uint32_t mem_size;
++	/**
++	 * stride in bytes of each line of compute units for
++	 * the specified memory space and region
++	 */
++	uint32_t stride;
++	uint8_t  padding[N_PADDING_UINT8_IN_FRAME_GRID_PARAM_SEC_STRUCT];
++};
++
++#define N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT IA_CSS_N_DATA_DIMENSION
++#define N_PADDING_UINT8_IN_FRAME_GRID_STRUCT 4
++
++#define SIZE_OF_FRAME_GRID_STRUCT_BITS \
++	(N_UINT16_IN_FRAME_GRID_STRUCT_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_PADDING_UINT8_IN_FRAME_GRID_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_frame_grid_desc_s {
++	/** Resolution width/height of the frame of
++	 * spatial parameters measured in compute units
++	 */
++	uint16_t frame_grid_dimension[IA_CSS_N_DATA_DIMENSION];
++	uint8_t padding[N_PADDING_UINT8_IN_FRAME_GRID_STRUCT];
++};
++
++#define N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT 1
++#define N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT 2
++
++#define SIZE_OF_SPATIAL_PARAM_TERM_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	+ SIZE_OF_FRAME_GRID_STRUCT_BITS \
++	+ N_UINT32_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT32_T_BITS \
++	+ N_UINT16_IN_SPATIAL_PARAM_TERM_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_spatial_param_terminal_s {
++	/** Spatial Parameter terminal base */
++	ia_css_terminal_t base;
++	/** Spatial Parameter buffer handle attached to the terminal */
++	ia_css_param_payload_t param_payload;
++	/** Contains info for the frame of spatial parameters */
++	ia_css_frame_grid_desc_t frame_grid_desc;
++	/** Kernel identifier */
++	uint32_t kernel_id;
++	/**
++	 * Points to the variable array of
++	 * ia_css_frame_grid_param_section_desc_t
++	 */
++	uint16_t frame_grid_param_section_desc_offset;
++	/**
++	 * Points to array of ia_css_fragment_spatial_desc_t
++	 * which constain info for the fragments of spatial parameters
++	 */
++	uint16_t fragment_grid_desc_offset;
++};
++/* ==================== Spatial Param Terminal - END ==================== */
++
++/* ==================== Sliced Param Terminal - START ==================== */
++#define N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT 2
++
++#define SIZE_OF_SLICE_PARAM_SECTION_DESC_STRUCT_BITS \
++	(N_UINT32_IN_SLICE_PARAM_SECTION_DESC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** A Slice of parameters ready to be trasferred from/to registers */
++struct ia_css_slice_param_section_desc_s {
++	/** Offset of the parameter allocation in memory */
++	uint32_t mem_offset;
++	/** Memory allocation size needs of this parameter */
++	uint32_t mem_size;
++};
++
++#define N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT		2
++#define N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT	4
++
++#define SIZE_OF_FRAGMENT_SLICE_DESC_STRUCT_BITS \
++	(N_UINT16_IN_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_fragment_slice_desc_s {
++	/**
++	 * Points to array of ia_css_slice_param_section_desc_t
++	 * which constain info for each prameter slice
++	 */
++	uint16_t slice_section_desc_offset;
++	/** Number of slices for the parameters for this fragment */
++	uint16_t slice_count;
++	uint8_t padding[N_PADDING_UINT8_FRAGMENT_SLICE_DESC_STRUCT];
++};
++
++#define N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT	1
++#define N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT	1
++#define N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT	2
++
++#define SIZE_OF_SLICED_PARAM_TERM_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	+ N_UINT32_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT32_T_BITS \
++	+ N_UINT16_IN_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_sliced_param_terminal_s {
++	/** Spatial Parameter terminal base */
++	ia_css_terminal_t base;
++	/** Spatial Parameter buffer handle attached to the terminal */
++	ia_css_param_payload_t param_payload;
++	/** Kernel identifier */
++	uint32_t kernel_id;
++	/**
++	 * Points to array of ia_css_fragment_slice_desc_t
++	 * which constain info for the slicing of the parameters
++	 */
++	uint16_t fragment_slice_desc_offset;
++	uint8_t padding[N_PADDING_UINT8_SLICED_PARAM_TERMINAL_STRUCT];
++};
++/* ==================== Sliced Param Terminal - END ==================== */
++
++/* ================= Program Control Init Terminal - START ================= */
++#define SIZE_OF_PROG_CONTROL_INIT_LOAD_SECTION_DESC_STRUCT_BITS	\
++	(DEVICE_DESCRIPTOR_ID_BITS	\
++	+ (2 * IA_CSS_UINT16_T_BITS)	\
++	)
++struct ia_css_program_control_init_load_section_desc_s {
++	/** Device descriptor */
++	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
++	/** Memory allocation size needs of this parameter */
++	uint16_t mem_size;
++	/** (Applicable to) mode bitmask */
++	uint16_t mode_bitmask;
++};
++
++#define MODE_BITMASK_MEMORY          (1u << IA_CSS_CONNECTION_MEMORY)
++#define MODE_BITMASK_MEMORY_STREAM   (1u << IA_CSS_CONNECTION_MEMORY_STREAM)
++#define MODE_BITMASK_STREAM          (1u << IA_CSS_CONNECTION_STREAM)
++#define MODE_BITMASK_DONT_CARE       (MODE_BITMASK_MEMORY | MODE_BITMASK_MEMORY_STREAM | MODE_BITMASK_STREAM)
++#define MODE_BITMASK_TOP             (1u << (IA_CSS_CONNECTION_STREAM + 1))
++#define MODE_BITMASK_MIDDLE          (1u << (IA_CSS_CONNECTION_STREAM + 2))
++#define MODE_BITMASK_BOTTOM          (1u << (IA_CSS_CONNECTION_STREAM + 3))
++
++struct connect_section_idx_bitfields_s {
++	uint16_t plane_id : 4;
++	uint16_t bottom_lines : 6;
++	uint16_t top_lines : 6;
++};
++
++union connect_section_idx_t {
++	struct connect_section_idx_bitfields_s as_bitfield;
++	uint16_t as_uint_16;
++};
++
++#define SIZE_OF_PROG_CONTROL_INIT_CONNECT_SECTION_DESC_STRUCT_BITS	\
++	(DEVICE_DESCRIPTOR_ID_BITS	\
++	+ (1 * IA_CSS_UINT16_T_BITS)	\
++	+ (1 * IA_CSS_UINT8_T_BITS)	\
++	+ IA_CSS_TERMINAL_ID_BITS	\
++	)
++struct ia_css_program_control_init_connect_section_desc_s {
++	/** Device descriptor */
++	device_descriptor_id_t device_descriptor_id;	/* 32 bits */
++	/** Connected terminal section (plane) index */
++	uint16_t connect_section_idx;
++	/** (Applicable to) mode bitmask */
++	uint8_t mode_bitmask;
++	/** Absolute referral ID for the connected terminal */
++	ia_css_terminal_ID_t connect_terminal_ID;
++};
++
++#define N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO	(1)
++#define N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT (0)
++#define SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS \
++	(1 * IA_CSS_UINT16_T_BITS)	\
++	+ (1 * IA_CSS_UINT8_T_BITS)	\
++	+ (N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO * IA_CSS_UINT8_T_BITS)
++
++#define SIZE_OF_PROG_CONTROL_INIT_PROG_DESC_STRUCT_BITS	\
++	(4 * IA_CSS_UINT16_T_BITS)	\
++	+ (SIZE_OF_PROGRAM_DESC_CONTROL_INFO_STRUCT_BITS) \
++	+ (2 * IA_CSS_UINT8_T_BITS) \
++	+ (1 * IA_CSS_UINT16_T_BITS) \
++	+ (N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT * \
++		IA_CSS_UINT8_T_BITS)
++
++struct ia_css_program_desc_control_info_s {
++	/** 12-bit process identifier */
++	ia_css_process_id_t process_id;
++	/** number of done acks required to close the process */
++	uint8_t num_done_events;
++	uint8_t padding[N_PADDING_UINT8_IN_PROG_DESC_CONTROL_INFO];
++};
++
++struct ia_css_program_control_init_program_desc_s {
++	/** Number of load sections in this program */
++	uint16_t load_section_count;
++	/** Points to variable size array of
++	 * ia_css_program_control_init_load_section_desc_s
++	 * in relation to its program_desc
++	 */
++	uint16_t load_section_desc_offset;
++	/** Number of connect sections in this program */
++	uint16_t connect_section_count;
++	/** Points to variable size array of
++	 * ia_css_program_control_init_connect_section_desc_s
++	 * in relation to its program_desc
++	 */
++	uint16_t connect_section_desc_offset;
++	struct ia_css_program_desc_control_info_s control_info;
++	/** number of load sections that are filled */
++	uint8_t filled_load_sections;
++	/** number of connect sections that are filled */
++	uint8_t filled_connect_sections;
++	/** mem_offset for the first load section */
++	uint16_t load_section_mem_offset;
++	/* align to 64 bits */
++	/* uint8_t padding[N_PADDING_UINT8_IN_PROG_CTRL_INIT_PROGRAM_DESC_STRUCT];*/
++};
++
++#define SIZE_OF_PROG_CONTROL_INIT_TERM_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	+ (1 * IA_CSS_UINT32_T_BITS) \
++	+ (2 * IA_CSS_UINT16_T_BITS) \
++	)
++struct ia_css_program_control_init_terminal_s {
++	/** Parameter terminal base */
++	ia_css_terminal_t base;
++	/** Parameter buffer handle attached to the terminal */
++	ia_css_param_payload_t param_payload;
++	/** Fragment stride for the payload, used to find the base
++	 * of the payload for a given fragment
++	 */
++	uint32_t payload_fragment_stride;
++	/** Points to the variable array of
++	 * ia_css_program_control_init_program_desc_s
++	 */
++	uint16_t program_section_desc_offset;
++	/** Number of instantiated programs in program group (processes) */
++	uint16_t program_count;
++};
++/* ================= Program Control Init Terminal - END ================= */
++
++/* ==================== Program Terminal - START ==================== */
++
++#define N_UINT32_IN_FRAG_PARAM_SEC_STRUCT 2
++
++#define SIZE_OF_FRAG_PARAM_SEC_STRUCT_BITS \
++	(N_UINT32_IN_FRAG_PARAM_SEC_STRUCT * IA_CSS_UINT32_T_BITS)
++
++/** Fragment constant parameters section */
++struct ia_css_fragment_param_section_desc_s {
++	/** Offset of the parameter allocation in memory */
++	uint32_t mem_offset;
++	/** Memory allocation size needs of this parameter */
++	uint32_t mem_size;
++};
++
++#define N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT IA_CSS_N_COMMAND_COUNT
++
++#define SIZE_OF_FRAG_SEQ_COMMANDS_STRUCT_BITS \
++	(N_UINT16_IN_FRAG_SEQ_COMMAND_STRUCT * IA_CSS_UINT16_T_BITS)
++
++/** 4 commands packe together to save memory space */
++struct ia_css_kernel_fragment_sequencer_command_desc_s {
++	/** Contains the "(command_index%4) == index" command desc */
++	uint16_t line_count[IA_CSS_N_COMMAND_COUNT];
++};
++
++#define N_UINT16_IN_FRAG_SEQ_INFO_STRUCT (5 * IA_CSS_N_DATA_DIMENSION + 2)
++
++#define SIZE_OF_FRAG_SEQ_INFO_STRUCT_BITS \
++	(N_UINT16_IN_FRAG_SEQ_INFO_STRUCT * IA_CSS_UINT16_T_BITS)
++
++struct ia_css_kernel_fragment_sequencer_info_desc_s {
++	/** Slice dimensions */
++	uint16_t fragment_grid_slice_dimension[IA_CSS_N_DATA_DIMENSION];
++	/** Nof slices */
++	uint16_t fragment_grid_slice_count[IA_CSS_N_DATA_DIMENSION];
++	/** Grid point decimation factor */
++	uint16_t
++	fragment_grid_point_decimation_factor[IA_CSS_N_DATA_DIMENSION];
++	/** Relative position of grid origin to pixel origin */
++	int16_t
++	fragment_grid_overlay_pixel_topleft_index[IA_CSS_N_DATA_DIMENSION];
++	/** Size of active fragment region */
++	int16_t
++	fragment_grid_overlay_pixel_dimension[IA_CSS_N_DATA_DIMENSION];
++	/** If >0 it overrides the standard fragment sequencer info */
++	uint16_t command_count;
++	/**
++	 * To be used only if command_count>0, points to the descriptors
++	 * for the commands (ia_css_kernel_fragment_sequencer_command_desc_s)
++	 */
++	uint16_t command_desc_offset;
++};
++
++#define N_UINT16_IN_PROG_TERM_STRUCT		2
++#define N_PADDING_UINT8_IN_PROG_TERM_STRUCT	0
++#define N_UINT8_PROG_TERM_STRIDE_SIZE       4
++#define UNIFIED_PROG_TERM_FRAG_DESC
++
++#define SIZE_OF_PROG_TERM_STRUCT_BITS \
++	(SIZE_OF_TERMINAL_STRUCT_BITS \
++	+ IA_CSS_PARAM_PAYLOAD_STRUCT_BITS \
++	+ N_UINT16_IN_PROG_TERM_STRUCT * IA_CSS_UINT16_T_BITS \
++	+ N_UINT8_PROG_TERM_STRIDE_SIZE * IA_CSS_UINT8_T_BITS)
++
++struct ia_css_program_terminal_s {
++	/** Program terminal base */
++	ia_css_terminal_t base;
++	/** Program terminal buffer handle attached to the terminal */
++	ia_css_param_payload_t param_payload;
++	/** Points to array of ia_css_fragment_param_desc_s */
++	uint16_t fragment_param_section_desc_offset;
++	/** Points to array of ia_css_kernel_fragment_sequencer_info_s */
++	uint16_t kernel_fragment_sequencer_info_desc_offset;
++	/* stride to next fragment*/
++	uint32_t payload_fragment_stride;
++	/** align to 64 */
++	/*uint8_t padding[N_PADDING_UINT8_IN_PROG_TERM_STRUCT];*/
++};
++/* ==================== Program Terminal - END ==================== */
++
++#endif /* __IA_CSS_TERMINAL_TYPES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
+new file mode 100644
+index 000000000000..1fe223af1bd7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ia_css_trace.h
+@@ -0,0 +1,1002 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++/*! \file */
++
++#ifndef __IA_CSS_TRACE_H
++#define __IA_CSS_TRACE_H
++
++/*
++** Configurations
++*/
++
++/**
++ * STEP 1: Define {Module Name}_TRACE_METHOD to one of the following.
++ *         Where:
++ *             {Module Name} is the name of the targeted module.
++ *
++ *         Example:
++ *             #define NCI_DMA_TRACE_METHOD IA_CSS_TRACE_METHOD_NATIVE
++ */
++
++/**< Use whatever method of tracing that best suits the platform
++ * this code is compiled for.
++ */
++#define IA_CSS_TRACE_METHOD_NATIVE  1
++/**< Use the Tracing NCI. */
++#define IA_CSS_TRACE_METHOD_TRACE   2
++
++/**
++ * STEP 2: Define {Module Name}_TRACE_LEVEL_{Level} to one of the following.
++ *         Where:
++ *             {Module Name} is the name of the targeted module.
++ *             {Level}, in decreasing order of severity, is one of the
++ *     following values: {ASSERT, ERROR, WARNING, INFO, DEBUG,
++ *                       VERBOSE, FATAL}.
++ *         Example:
++ *             #define NCI_DMA_TRACE_LEVEL_ASSERT IA_CSS_TRACE_LEVEL_DISABLED
++ *             #define NCI_DMA_TRACE_LEVEL_ERROR  IA_CSS_TRACE_LEVEL_ENABLED
++ */
++/**< Disables the corresponding trace level. */
++#define IA_CSS_TRACE_LEVEL_DISABLED 0
++/**< Enables the corresponding trace level. */
++#define IA_CSS_TRACE_LEVEL_ENABLED  1
++
++/*
++ * Used in macro definition with do-while loop
++ * for removing checkpatch warnings
++ */
++#define IA_CSS_TRACE_FILE_DUMMY_DEFINE
++
++/**
++ * STEP 3: Define IA_CSS_TRACE_PRINT_FILE_LINE to have file name and
++ * line printed with every log message.
++ *
++ *	   Example:
++ *	       #define IA_CSS_TRACE_PRINT_FILE_LINE
++ */
++
++/*
++** Interface
++*/
++
++/*
++** Static
++*/
++
++/**
++ * Logs a message with zero arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @param module The targeted module.
++ * @param severity The severity level of the trace message. In decreasing order:
++ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
++ * @param format The message to be traced.
++ */
++#define IA_CSS_TRACE_0(module, severity, format) \
++	IA_CSS_TRACE_IMPL(module, 0, severity, format)
++
++/**
++ * Logs a message with one argument if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_1(module, severity, format, a1) \
++	IA_CSS_TRACE_IMPL(module, 1, severity, format, a1)
++
++/**
++ * Logs a message with two arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_2(module, severity, format, a1, a2) \
++	IA_CSS_TRACE_IMPL(module, 2, severity, format, a1, a2)
++
++/**
++ * Logs a message with three arguments if the targeted severity level
++ * is enabled at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_3(module, severity, format, a1, a2, a3) \
++	IA_CSS_TRACE_IMPL(module, 3, severity, format, a1, a2, a3)
++
++/**
++ * Logs a message with four arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_4(module, severity, format, a1, a2, a3, a4) \
++	IA_CSS_TRACE_IMPL(module, 4, severity, format, a1, a2, a3, a4)
++
++/**
++ * Logs a message with five arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_5(module, severity, format, a1, a2, a3, a4, a5) \
++	IA_CSS_TRACE_IMPL(module, 5, severity, format, a1, a2, a3, a4, a5)
++
++/**
++ * Logs a message with six arguments if the targeted severity level is enabled
++ * at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_6(module, severity, format, a1, a2, a3, a4, a5, a6) \
++	IA_CSS_TRACE_IMPL(module, 6, severity, format, a1, a2, a3, a4, a5, a6)
++
++/**
++ * Logs a message with seven arguments if the targeted severity level
++ * is enabled at compile-time.
++ * @see IA_CSS_TRACE_0
++ */
++#define IA_CSS_TRACE_7(module, severity, format, a1, a2, a3, a4, a5, a6, a7) \
++	IA_CSS_TRACE_IMPL(module, 7, severity, format, \
++					a1, a2, a3, a4, a5, a6, a7)
++
++/*
++** Dynamic
++*/
++
++/**
++* Declares, but does not define, dynamic tracing functions and variables
++* for module \p module.  For each module, place an instance of this macro
++* in the compilation unit in which you want to use dynamic tracing facility
++* so as to inform the compiler of the declaration of the available functions.
++* An invocation of this function does not enable any of the available tracing
++* levels.  Do not place a semicolon after a call to this macro.
++* @see IA_CSS_TRACE_DYNAMIC_DEFINE
++*/
++#define IA_CSS_TRACE_DYNAMIC_DECLARE(module) \
++	IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module)
++/**
++* Declares the configuration function for the dynamic api seperatly, if one
++* wants to use it.
++*/
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC(module) \
++	IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module)
++
++/**
++* Defines dynamic tracing functions and variables for module \p module.
++* For each module, place an instance of this macro in one, and only one,
++* of your SOURCE files so as to allow the linker resolve the related symbols.
++* An invocation of this macro does not enable any of the available tracing
++* levels.  Do not place a semicolon after a call to this macro.
++* @see IA_CSS_TRACE_DYNAMIC_DECLARE
++*/
++#define IA_CSS_TRACE_DYNAMIC_DEFINE(module) \
++	IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module)
++/**
++* Defines the configuration function for the dynamic api seperatly, if one
++* wants to use it.
++*/
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC(module) \
++	IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module)
++
++/**
++ * Logs a message with zero arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @param module The targeted module.
++ * @param severity The severity level of the trace message. In decreasing order:
++ *                 {ASSERT, ERROR, WARNING, INFO, DEBUG, VERBOSE}.
++ * @param format The message to be traced.
++ */
++#define IA_CSS_TRACE_DYNAMIC_0(module, severity, format) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 0, severity, format)
++
++/**
++ * Logs a message with one argument if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_1(module, severity, format, a1) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 1, severity, format, a1)
++
++/**
++ * Logs a message with two arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_2(module, severity, format, a1, a2) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 2, severity, format, a1, a2)
++
++/**
++ * Logs a message with three arguments if the targeted severity level
++ * is enabled both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_3(module, severity, format, a1, a2, a3) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 3, severity, format, a1, a2, a3)
++
++/**
++ * Logs a message with four arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_4(module, severity, format, a1, a2, a3, a4) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 4, severity, format, a1, a2, a3, a4)
++
++/**
++ * Logs a message with five arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_5(module, severity, format, a1, a2, a3, a4, a5) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 5, severity, format, \
++						a1, a2, a3, a4, a5)
++
++/**
++ * Logs a message with six arguments if the targeted severity level is enabled
++ * both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_6(module, severity, format, \
++						a1, a2, a3, a4, a5, a6) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 6, severity, format, \
++						a1, a2, a3, a4, a5, a6)
++
++/**
++ * Logs a message with seven arguments if the targeted severity level
++ * is enabled both at compile-time, and run-time.
++ * @see IA_CSS_TRACE_DYNAMIC_0
++ */
++#define IA_CSS_TRACE_DYNAMIC_7(module, severity, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++	IA_CSS_TRACE_DYNAMIC_IMPL(module, 7, severity, format, \
++						a1, a2, a3, a4, a5, a6, a7)
++
++/*
++** Implementation
++*/
++
++/* CAT */
++#define IA_CSS_TRACE_CAT_IMPL(a, b) a ## b
++#define IA_CSS_TRACE_CAT(a, b) IA_CSS_TRACE_CAT_IMPL(a, b)
++
++/* Bridge */
++#if defined(__HIVECC) || defined(__GNUC__)
++#define IA_CSS_TRACE_IMPL(module, argument_count, severity, arguments ...) \
++	IA_CSS_TRACE_CAT( \
++		IA_CSS_TRACE_CAT( \
++			IA_CSS_TRACE_CAT( \
++				IA_CSS_TRACE_CAT( \
++					IA_CSS_TRACE_CAT( \
++						IA_CSS_TRACE_, \
++						argument_count \
++					), \
++					_ \
++				), \
++				IA_CSS_TRACE_CAT( \
++					module, \
++					_TRACE_METHOD \
++				) \
++			), \
++			_ \
++		), \
++		IA_CSS_TRACE_CAT( \
++			IA_CSS_TRACE_CAT( \
++				module, \
++				_TRACE_LEVEL_ \
++			), \
++			severity \
++		) \
++		( \
++			IA_CSS_TRACE_CAT( \
++				IA_CSS_TRACE_CAT( \
++					IA_CSS_TRACE_CAT( \
++						IA_CSS_TRACE_SEVERITY_, \
++						severity \
++					), \
++					_ \
++				), \
++				IA_CSS_TRACE_CAT( \
++					module, \
++					_TRACE_METHOD \
++				) \
++			), \
++			#module, \
++			## arguments \
++		) \
++	)
++
++/* Bridge */
++#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, \
++							arguments ...) \
++	do { \
++		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
++							severity)) { \
++			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
++							## arguments); \
++		} \
++	} while (0)
++#elif defined(_MSC_VER)
++#define IA_CSS_TRACE_IMPL(module, argument_count, severity, ...) \
++	IA_CSS_TRACE_CAT( \
++		IA_CSS_TRACE_CAT( \
++			IA_CSS_TRACE_CAT( \
++				IA_CSS_TRACE_CAT( \
++					IA_CSS_TRACE_CAT( \
++						IA_CSS_TRACE_, \
++						argument_count \
++					), \
++					_ \
++				), \
++				IA_CSS_TRACE_CAT( \
++					module, \
++					_TRACE_METHOD \
++				) \
++			), \
++			_ \
++		), \
++		IA_CSS_TRACE_CAT( \
++			IA_CSS_TRACE_CAT( \
++				module, \
++				_TRACE_LEVEL_ \
++			), \
++			severity \
++		) \
++		( \
++			IA_CSS_TRACE_CAT( \
++				IA_CSS_TRACE_CAT( \
++					IA_CSS_TRACE_CAT( \
++						IA_CSS_TRACE_SEVERITY_, \
++						severity \
++					), \
++					_ \
++				), \
++				IA_CSS_TRACE_CAT( \
++					module, \
++					_TRACE_METHOD \
++				) \
++			), \
++			#module, \
++			__VA_ARGS__  \
++		) \
++	)
++
++/* Bridge */
++#define IA_CSS_TRACE_DYNAMIC_IMPL(module, argument_count, severity, ...) \
++	do { \
++		if (IA_CSS_TRACE_CAT(IA_CSS_TRACE_CAT(module, _trace_level_), \
++							severity)) { \
++			IA_CSS_TRACE_IMPL(module, argument_count, severity, \
++							__VA_ARGS__); \
++		} \
++	} while (0)
++#endif
++
++/*
++** Native Backend
++*/
++
++#if defined(__HIVECC)
++	#define IA_CSS_TRACE_PLATFORM_CELL
++#elif defined(__XTENSA__)
++	#define IA_CSS_TRACE_PLATFORM_XTENSA
++#elif defined(XTENSA_HOST)
++	#define IA_CSS_TRACE_PLATFORM_XTENSA
++#elif defined(__GNUC__)
++	#define IA_CSS_TRACE_PLATFORM_HOST
++
++	#define IA_CSS_TRACE_NATIVE(severity, module, format, arguments ...) \
++	do { \
++		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++		PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, \
++						format),  ## arguments); \
++	} while (0)
++	/* TODO: In case Host Side tracing is needed to be mapped to the
++	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++	 * PRINT to vied_nci_tunit_print function calls
++	*/
++	#define IA_CSS_TRACE_TRACE(severity, module, format, arguments ...) \
++	do { \
++		IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++		PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, \
++						format),  ## arguments); \
++	} while (0)
++
++#elif defined(_MSC_VER)
++	#define IA_CSS_TRACE_PLATFORM_HOST
++
++#ifdef _KERNEL_MODE
++	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
++		do { \
++			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++			P##severity(IA_CSS_TRACE_FORMAT_AUG_NATIVE(#severity, \
++					module, format),  __VA_ARGS__); \
++		} while (0)
++	/* TODO: In case Host Side tracing is needed to be mapped to the
++	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++	 * PRINT to vied_nci_tunit_print function calls
++	*/
++	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
++		do { \
++			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++			P##severity(IA_CSS_TRACE_FORMAT_AUG_TRACE(#severity, \
++					module, format),  __VA_ARGS__); \
++		} while (0)
++#else
++	#define IA_CSS_TRACE_NATIVE(severity, module, format, ...) \
++		do { \
++			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++			PRINT(IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, \
++					module, format),  __VA_ARGS__); \
++		} while (0)
++	/* TODO: In case Host Side tracing is needed to be mapped to the
++	 * Tunit, the following "IA_CSS_TRACE_TRACE" needs to be modified from
++	 * PRINT to vied_nci_tunit_print function calls
++	*/
++	#define IA_CSS_TRACE_TRACE(severity, module, format, ...) \
++		do { \
++			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++			PRINT(IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, \
++					module, format),  __VA_ARGS__); \
++		} while (0)
++#endif
++#else
++	#error Unsupported platform!
++#endif /* Platform */
++
++#if defined(IA_CSS_TRACE_PLATFORM_CELL)
++	#include <hive/attributes.h> /* VOLATILE */
++
++	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
++		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
++			do { \
++				OP___printstring(__FILE__":") VOLATILE; \
++				OP___printdec(__LINE__) VOLATILE; \
++				OP___printstring("\n") VOLATILE; \
++			} while (0)
++	#else
++		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
++	#endif
++
++	#define IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity) \
++		do { \
++			IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
++			OP___printstring("["module"]:["severity"]:") \
++			VOLATILE; \
++		} while (0)
++
++	#define IA_CSS_TRACE_MSG_NATIVE(severity, module, format) \
++		do { \
++			IA_CSS_TRACE_FILE_PRINT_COMMAND; \
++			OP___printstring("["module"]:["severity"]: "format) \
++			VOLATILE; \
++		} while (0)
++
++	#define IA_CSS_TRACE_ARG_NATIVE(module, severity, i, value) \
++		do { \
++			IA_CSS_TRACE_MODULE_SEVERITY_PRINT(module, severity); \
++			OP___dump(i, value) VOLATILE; \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++		IA_CSS_TRACE_MSG_NATIVE(severity, module, format)
++
++	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++						a1, a2, a3, a4) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
++		} while (0)
++
++	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++		do { \
++			IA_CSS_TRACE_MSG_NATIVE(severity, module, format); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 1, a1); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 2, a2); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 3, a3); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 4, a4); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 5, a5); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 6, a6); \
++			IA_CSS_TRACE_ARG_NATIVE(module, severity, 7, a7); \
++		} while (0)
++	/*
++	** Tracing Backend
++	*/
++#if !defined(HRT_CSIM) && !defined(NO_TUNIT)
++	#include "vied_nci_tunit.h"
++#endif
++	#define IA_CSS_TRACE_AUG_FORMAT_TRACE(format, module) \
++		"[" module "]" format " : PID = %x : Timestamp = %d : PC = %x"
++
++	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
++		vied_nci_tunit_print(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity)
++
++	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
++		vied_nci_tunit_print1i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1)
++
++	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
++		vied_nci_tunit_print2i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2)
++
++	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
++		vied_nci_tunit_print3i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2, a3)
++
++	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4) \
++		vied_nci_tunit_print4i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2, a3, a4)
++
++	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++		vied_nci_tunit_print5i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2, a3, a4, a5)
++
++	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++		vied_nci_tunit_print6i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2, a3, a4, a5, a6)
++
++	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++		vied_nci_tunit_print7i(IA_CSS_TRACE_AUG_FORMAT_TRACE(format, \
++								module), \
++			severity, a1, a2, a3, a4, a5, a6, a7)
++
++#elif defined(IA_CSS_TRACE_PLATFORM_XTENSA)
++	#include "print_support_xtensa.h"
++
++	/* TODO: Tunit tracing is not yet supported on Xtensa platforms,
++	 * proper Trace functions will be created once supported.
++	 */
++
++	#define IA_CSS_TRACE_TRACE_0(severity, module, format)
++	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1)
++	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2)
++	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3)
++	#define IA_CSS_TRACE_TRACE_4(severity, module, format, a1, a2, a3, a4)
++	#define IA_CSS_TRACE_TRACE_5(severity, module, format, a1, a2, a3, a4, a5)
++	#define IA_CSS_TRACE_TRACE_6(severity, module, format, a1, a2, a3, a4, a5, a6)
++	#define IA_CSS_TRACE_TRACE_7(severity, module, format, a1, a2, a3, a4, a5, a6, a7)
++
++#ifdef __XTENSA_FW__
++	#define SOURCE "FW"
++#else
++	#define SOURCE "HOST"
++#endif
++
++#if defined(XTENSA_PRINT_USE_SIMCALL)
++
++	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++	simcall_log_msg_0("[" SOURCE "]:[" module "]:[" severity "]: " format)
++
++	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++	simcall_log_msg_1("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
++
++	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++	simcall_log_msg_2("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
++
++	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++	simcall_log_msg_3("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
++
++	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++						a1, a2, a3, a4) \
++	simcall_log_msg_4("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
++
++	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++	simcall_log_msg_5("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
++
++	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++	simcall_log_msg_6("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
++
++	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++	simcall_log_msg_7("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
++
++#elif defined(XTENSA_PRINT_USE_PRINTF)
++
++	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format)
++
++	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1)
++
++	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2)
++
++	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3)
++
++	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++						a1, a2, a3, a4) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4)
++
++	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5)
++
++	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6)
++
++	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++	PRINT("[" SOURCE "]:[" module "]:[" severity "]: " format, a1, a2, a3, a4, a5, a6, a7)
++
++#endif
++#elif defined(IA_CSS_TRACE_PLATFORM_HOST)
++	#include "print_support.h"
++
++	#ifdef IA_CSS_TRACE_PRINT_FILE_LINE
++		#define IA_CSS_TRACE_FILE_PRINT_COMMAND \
++				PRINT("%s:%d:\n", __FILE__, __LINE__)
++	#else
++		#define IA_CSS_TRACE_FILE_PRINT_COMMAND
++	#endif
++
++	#define IA_CSS_TRACE_FORMAT_AUG_NATIVE(severity, module, format) \
++			"[" module "]:[" severity "]: " format
++
++	#define IA_CSS_TRACE_NATIVE_0(severity, module, format) \
++		IA_CSS_TRACE_NATIVE(severity, module, format)
++
++	#define IA_CSS_TRACE_NATIVE_1(severity, module, format, a1) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, a1)
++
++	#define IA_CSS_TRACE_NATIVE_2(severity, module, format, a1, a2) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2)
++
++	#define IA_CSS_TRACE_NATIVE_3(severity, module, format, a1, a2, a3) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3)
++
++	#define IA_CSS_TRACE_NATIVE_4(severity, module, format, \
++						a1, a2, a3, a4) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, a1, a2, a3, a4)
++
++	#define IA_CSS_TRACE_NATIVE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, \
++						a1, a2, a3, a4, a5)
++
++	#define IA_CSS_TRACE_NATIVE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, \
++						a1, a2, a3, a4, a5, a6)
++
++	#define IA_CSS_TRACE_NATIVE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++		IA_CSS_TRACE_NATIVE(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7)
++
++	#define IA_CSS_TRACE_FORMAT_AUG_TRACE(severity, module, format) \
++			"["module"]:["severity"]: "format
++
++	#define IA_CSS_TRACE_TRACE_0(severity, module, format) \
++		IA_CSS_TRACE_TRACE(severity, module, format)
++
++	#define IA_CSS_TRACE_TRACE_1(severity, module, format, a1) \
++		IA_CSS_TRACE_TRACE(severity, module, format, a1)
++
++	#define IA_CSS_TRACE_TRACE_2(severity, module, format, a1, a2) \
++		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2)
++
++	#define IA_CSS_TRACE_TRACE_3(severity, module, format, a1, a2, a3) \
++		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3)
++
++	#define IA_CSS_TRACE_TRACE_4(severity, module, format, \
++						a1, a2, a3, a4) \
++		IA_CSS_TRACE_TRACE(severity, module, format, a1, a2, a3, a4)
++
++	#define IA_CSS_TRACE_TRACE_5(severity, module, format, \
++						a1, a2, a3, a4, a5) \
++		IA_CSS_TRACE_TRACE(severity, module, format, \
++						a1, a2, a3, a4, a5)
++
++	#define IA_CSS_TRACE_TRACE_6(severity, module, format, \
++						a1, a2, a3, a4, a5, a6) \
++		IA_CSS_TRACE_TRACE(severity, module, format, \
++						a1, a2, a3, a4, a5, a6)
++
++	#define IA_CSS_TRACE_TRACE_7(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7) \
++		IA_CSS_TRACE_TRACE(severity, module, format, \
++						a1, a2, a3, a4, a5, a6, a7)
++#endif
++
++/* Disabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_1_0(severity, module, format)
++#define IA_CSS_TRACE_1_1_0(severity, module, format, arg1)
++#define IA_CSS_TRACE_2_1_0(severity, module, format, arg1, arg2)
++#define IA_CSS_TRACE_3_1_0(severity, module, format, arg1, arg2, arg3)
++#define IA_CSS_TRACE_4_1_0(severity, module, format, arg1, arg2, arg3, arg4)
++#define IA_CSS_TRACE_5_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5)
++#define IA_CSS_TRACE_6_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5, arg6)
++#define IA_CSS_TRACE_7_1_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5, arg6, arg7)
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_1_1 IA_CSS_TRACE_NATIVE_0
++#define IA_CSS_TRACE_1_1_1 IA_CSS_TRACE_NATIVE_1
++#define IA_CSS_TRACE_2_1_1 IA_CSS_TRACE_NATIVE_2
++#define IA_CSS_TRACE_3_1_1 IA_CSS_TRACE_NATIVE_3
++#define IA_CSS_TRACE_4_1_1 IA_CSS_TRACE_NATIVE_4
++#define IA_CSS_TRACE_5_1_1 IA_CSS_TRACE_NATIVE_5
++#define IA_CSS_TRACE_6_1_1 IA_CSS_TRACE_NATIVE_6
++#define IA_CSS_TRACE_7_1_1 IA_CSS_TRACE_NATIVE_7
++
++#if defined(_MSC_VER) && defined(_KERNEL_MODE)
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_1  ASSERT
++#define IA_CSS_TRACE_SEVERITY_ERROR_1   ERROR
++#define IA_CSS_TRACE_SEVERITY_WARNING_1 WARNING
++#define IA_CSS_TRACE_SEVERITY_INFO_1    INFO
++#define IA_CSS_TRACE_SEVERITY_DEBUG_1   DEBUG
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 VERBOSE
++#define IA_CSS_TRACE_SEVERITY_FATAL_1   FATAL
++#else
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_1  "Assert"
++#define IA_CSS_TRACE_SEVERITY_ERROR_1   "Error"
++#define IA_CSS_TRACE_SEVERITY_WARNING_1 "Warning"
++#define IA_CSS_TRACE_SEVERITY_INFO_1    "Info"
++#define IA_CSS_TRACE_SEVERITY_DEBUG_1   "Debug"
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_1 "Verbose"
++#define IA_CSS_TRACE_SEVERITY_FATAL_1   "Fatal"
++#endif
++/* Disabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_2_0(severity, module, format)
++#define IA_CSS_TRACE_1_2_0(severity, module, format, arg1)
++#define IA_CSS_TRACE_2_2_0(severity, module, format, arg1, arg2)
++#define IA_CSS_TRACE_3_2_0(severity, module, format, arg1, arg2, arg3)
++#define IA_CSS_TRACE_4_2_0(severity, module, format, arg1, arg2, arg3, arg4)
++#define IA_CSS_TRACE_5_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5)
++#define IA_CSS_TRACE_6_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5, arg6)
++#define IA_CSS_TRACE_7_2_0(severity, module, format, arg1, arg2, arg3, arg4, \
++							arg5, arg6, arg7)
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_{Argument Count}_{Backend ID}_{Enabled} */
++#define IA_CSS_TRACE_0_2_1 IA_CSS_TRACE_TRACE_0
++#define IA_CSS_TRACE_1_2_1 IA_CSS_TRACE_TRACE_1
++#define IA_CSS_TRACE_2_2_1 IA_CSS_TRACE_TRACE_2
++#define IA_CSS_TRACE_3_2_1 IA_CSS_TRACE_TRACE_3
++#define IA_CSS_TRACE_4_2_1 IA_CSS_TRACE_TRACE_4
++#define IA_CSS_TRACE_5_2_1 IA_CSS_TRACE_TRACE_5
++#define IA_CSS_TRACE_6_2_1 IA_CSS_TRACE_TRACE_6
++#define IA_CSS_TRACE_7_2_1 IA_CSS_TRACE_TRACE_7
++
++/* Enabled */
++/* Legend: IA_CSS_TRACE_SEVERITY_{Severity Level}_{Backend ID} */
++#define IA_CSS_TRACE_SEVERITY_ASSERT_2  VIED_NCI_TUNIT_MSG_SEVERITY_FATAL
++#define IA_CSS_TRACE_SEVERITY_ERROR_2   VIED_NCI_TUNIT_MSG_SEVERITY_ERROR
++#define IA_CSS_TRACE_SEVERITY_WARNING_2 VIED_NCI_TUNIT_MSG_SEVERITY_WARNING
++#define IA_CSS_TRACE_SEVERITY_INFO_2    VIED_NCI_TUNIT_MSG_SEVERITY_NORMAL
++#define IA_CSS_TRACE_SEVERITY_DEBUG_2   VIED_NCI_TUNIT_MSG_SEVERITY_USER1
++#define IA_CSS_TRACE_SEVERITY_VERBOSE_2 VIED_NCI_TUNIT_MSG_SEVERITY_USER2
++
++/*
++** Dynamicism
++*/
++
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_IMPL(module) \
++	do { \
++		void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void); \
++		void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void); \
++	} while (0)
++
++#define IA_CSS_TRACE_DYNAMIC_DECLARE_CONFIG_FUNC_IMPL(module) \
++	do { \
++		IA_CSS_TRACE_FILE_DUMMY_DEFINE; \
++		void IA_CSS_TRACE_CAT(module, _trace_configure)\
++			(int argc, const char *const *argv); \
++	} while (0)
++
++#include "platform_support.h"
++#include "type_support.h"
++
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_IMPL(module) \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_assert); \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_error); \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_warning); \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_info); \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_debug); \
++	static uint8_t IA_CSS_TRACE_CAT(module, _trace_level_verbose); \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_assert_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_assert_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_assert) = 0; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_error_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_error) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_error_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_error) = 0; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_warning_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_warning_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_warning) = 0; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_info_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_info) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_info_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_info) = 0; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_debug_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_debug_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_debug) = 0; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_verbose_enable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 1; \
++	} \
++	\
++	void IA_CSS_TRACE_CAT(module, _trace_verbose_disable)(void) \
++	{ \
++		IA_CSS_TRACE_CAT(module, _trace_level_verbose) = 0; \
++	}
++
++#define IA_CSS_TRACE_DYNAMIC_DEFINE_CONFIG_FUNC_IMPL(module) \
++void IA_CSS_TRACE_CAT(module, _trace_configure)(const int argc, \
++				const char *const *const argv) \
++{ \
++	int i = 1; \
++	const char *levels = 0; \
++	\
++	while (i < argc) { \
++		if (!strcmp(argv[i], "-" #module "_trace")) { \
++			++i; \
++			\
++			if (i < argc) { \
++				levels = argv[i]; \
++				\
++				while (*levels) { \
++					switch (*levels++) { \
++					case 'a': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_assert_enable)(); \
++						break; \
++						\
++					case 'e': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_error_enable)(); \
++						break; \
++						\
++					case 'w': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_warning_enable)(); \
++						break; \
++						\
++					case 'i': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_info_enable)(); \
++						break; \
++						\
++					case 'd': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_debug_enable)(); \
++						break; \
++						\
++					case 'v': \
++						IA_CSS_TRACE_CAT \
++					(module, _trace_verbose_enable)(); \
++						break; \
++						\
++					default: \
++					} \
++				} \
++			} \
++		} \
++		\
++	++i; \
++	} \
++}
++
++#endif /* __IA_CSS_TRACE_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
+new file mode 100644
+index 000000000000..d8bff58ee178
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_acb_devices.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IPU_DEVICE_ACB_DEVICES_H
++#define __IPU_DEVICE_ACB_DEVICES_H
++
++enum ipu_device_acb_id {
++	IPU_DEVICE_ACB_B2B_ID,
++	IPU_DEVICE_ACB_RYNR_ID,
++	IPU_DEVICE_ACB_DEMOSAIC_ID,
++	IPU_DEVICE_ACB_ICA_ID,
++	IPU_DEVICE_ACB_LSC_ID,
++	IPU_DEVICE_ACB_DPC_ID,
++	IPU_DEVICE_ACB_R2I_SIE_ID,
++	IPU_DEVICE_ACB_R2I_DS_A_ID,
++	IPU_DEVICE_ACB_R2I_DS_B_ID,
++	IPU_DEVICE_ACB_AWB_ID,
++	IPU_DEVICE_ACB_AF_ID,
++	IPU_DEVICE_ACB_PAF_ID,
++	IPU_DEVICE_ACB_AE_ID,
++	IPU_DEVICE_ACB_NUM_ACB
++};
++
++#define IPU_DEVICE_ACB_NUM_ISA_ACB (IPU_DEVICE_ACB_NUM_ACB)
++
++#endif /* __IPU_DEVICE_ACB_DEVICES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
+new file mode 100644
+index 000000000000..df91edd7a91f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/ipu_device_gp_devices.h
+@@ -0,0 +1,195 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IPU_DEVICE_GP_DEVICES_H
++#define __IPU_DEVICE_GP_DEVICES_H
++#include "math_support.h"
++#include "type_support.h"
++
++enum ipu_device_gp_id {
++	IPU_DEVICE_GP_PSA = 0,
++	IPU_DEVICE_GP_ISA_STATIC,
++	IPU_DEVICE_GP_ISA_RUNTIME,
++	IPU_DEVICE_GP_NUM_GP
++};
++
++/* The PSA_* naming in the enum members refers to the internal separation of
++ * the PSA. Using it this way should make this change transparent
++ * to higher layers.
++ *
++ * For details on the values and usage of the muxes see Figures 3-1
++ * in section 2.1.3 and Figure 3-3 in section 2.2.2 of the IPU-5 General
++ * Fixed Function MAS. Additionally, refer to the respective description
++ * fields in the RDL files on the SDK (either psa_ip_top_system.rdl
++ * or isa_ps_system.rdl).
++ */
++enum ipu_device_gp_psa_mux_id {
++	/* Mux/demuxes */
++	/* 0 - BNLM output pixel stream; 1 - BNLM output delta stream */
++	IPU_DEVICE_GP_PSA_1_NOISE_MUX = 0,
++	/* 0 - To XNR; 1 - WB/DM */
++	IPU_DEVICE_GP_PSA_2_STILLS_MODE_MUX,
++	/* 0 - To Gamma_Star; 1 - To VCA; 2 - To VCSC */
++	IPU_DEVICE_GP_PSA_2_V2S_RGB_4_DEMUX,
++	/* 0 - input from Gamma_star; 1 - input from VCA; 2 input from DMSC */
++	IPU_DEVICE_GP_PSA_2_S2V_F_INPUT_MUX,
++	/* 0 - To IEFD. 1 - To GLTM; 2 - To DM */
++	IPU_DEVICE_GP_PSA_2_V2S_5_DEMUX,
++	/* 0 - VCSC output is chosen; 1 - BNLM output is chosen */
++	IPU_DEVICE_GP_PSA_3_VCSC_BP_MUX,
++	/* 0 - v2s_1 output; 1 - ISA downscaled stream; 2 - ISA original sized stream */
++	IPU_DEVICE_GP_LBFF_V2S_1_OUTPUT_MUX,
++	/* Device blockers */
++	/* BNLM pixel output block enable */
++	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_YUV_STRM_BLK,
++	/* BNLM pixel output block enable */
++	IPU_DEVICE_GP_PSA_1_BNLM_PIXEL_BAYER_STRM_BLK,
++	/* BNLM delta output block enable */
++	IPU_DEVICE_GP_PSA_1_BNLM_DELTA_STRM_BLK,
++	/* Block pixel stream to gltm from vcsc */
++	IPU_DEVICE_GP_PSA_3_VCSC_TO_GLTM_BLK,
++	/* Block pixel stream to gltm from bnlm */
++	IPU_DEVICE_GP_PSA_3_BNLM_TO_GLTM_BLK,
++	/* Frame size reg for strmCrop H */
++	IPU_DEVICE_GP_LBFF_S2V_H_FRAME_SIZE,
++	IPU_DEVICE_GP_PSA_MUX_NUM_MUX
++};
++
++enum ipu_device_gp_isa_static_mux_id {
++	/* Muxes/demuxes */
++	/* 0 - to ISL.S2V; 1 - to PSA */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_OUT_DEMUX_SEL = 0,
++	/* 0 - to ISL.S2V; 1 - to PSA */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_DEMUX_SEL,
++	/* 0 - Input Correction; 1 - B2B mux */
++	IPU_DEVICE_GP_ISA_STATIC_AWB_MUX_SEL,
++	/* 0 - Input Correction; 1 - B2B mux */
++	IPU_DEVICE_GP_ISA_STATIC_AE_MUX_SEL,
++	/* 0 - Input Correction; 1 - B2B mux */
++	IPU_DEVICE_GP_ISA_STATIC_AF_MUX_SEL,
++	/* 0 - to Lsc; 1 - to Dpc; 2 - to X2b */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_DEMUX_SEL,
++	/* 0 - Input correction; 1 - Dpc; 2 - X2b */
++	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_SEL,
++	/* 0 - to B2b; 1 - to Dpc; 2 - X2b*/
++	IPU_DEVICE_GP_ISA_STATIC_LSC_DEMUX_SEL,
++	/* 0 - to Lsc; 1 - to B2b; 2 - to X2b */
++	IPU_DEVICE_GP_ISA_STATIC_DPC_DEMUX_SEL,
++	/* 0 - Lsc; 1 - Input correction; 2 - X2b */
++	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_SEL,
++	/* 0 - Lsc; 1 - X2b; 2 - Input correction */
++	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_SEL,
++	/* 0 - to Lsc; 1 - to Dpc; 2 - to B2b */
++	IPU_DEVICE_GP_ISA_STATIC_X2B_DEMUX_SEL,
++	/* 0 - Lsc; 1 - Dpc; 2 - X2b */
++	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_SEL,
++	/* 0 - External PAF CH0/1; 1 - DPC extracted PAF CH0/1; 2 - X2B extracted PAF CH0/1 */
++	IPU_DEVICE_GP_ISA_STATIC_PAF_SRC_SEL,
++	/* 0 - to Dol mux; 1 - to Dol */
++	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_SEL,
++	/* 0 - Main input; 1 - Dol */
++	IPU_DEVICE_GP_ISA_STATIC_DOL_MUX_SEL,
++	/* Blockers */
++	/* ISA input correction Port block */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_INPUT_CORR_PORT_BLK,
++	/* AWB Mux input correction Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_INPUT_CORR_PORT_BLK,
++	/* AE Mux input correction Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AEMUX_INPUT_CORR_PORT_BLK,
++	/* AF Mux input correction Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AFMUX_INPUT_CORR_PORT_BLK,
++	/* AWB Mux B2B Mux Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AWBMUX_B2B_MUX_PORT_BLK,
++	/* AE Mux B2B Mux Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AEMUX_B2B_MUX_PORT_BLK,
++	/* AF Mux B2B Mux Port block */
++	IPU_DEVICE_GP_ISA_STATIC_AFMUX_B2B_MUX_PORT_BLK,
++	/* PAF stream sync configuration */
++	IPU_DEVICE_GP_ISA_STATIC_PAF_STREAM_SYNC_CFG,
++	/* Paf Mux gddpc Port block */
++	IPU_DEVICE_GP_ISA_STATIC_PAF_GDDPC_PORT_BLK,
++	/* Paf Mux input isa Port block */
++	IPU_DEVICE_GP_ISA_STATIC_PAF_ISA_STREAM_PORT_BLK,
++	/* Paf Mux X2B Port block */
++	IPU_DEVICE_GP_ISA_STATIC_PAF_X2B_PORT_BLK,
++	/* SIS A port block */
++	IPU_DEVICE_GP_ISA_STATIC_SIS_A_PORT_BLK,
++	/* SIS B port block */
++	IPU_DEVICE_GP_ISA_STATIC_SIS_B_PORT_BLK,
++	/* Lsc mux Input Corr demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++	/* Dpc mux Lsc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++	/* Dpc mux Lsc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_LSC_DEMUX_PORT_BLK,
++	/* Dpc mux X2b demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_DPC_MUX_X2B_DEMUX_PORT_BLK,
++	/* Dpc mux Lsc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_DPC_DEMUX_PORT_BLK,
++	/* Lsc mux X2b demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_LSC_MUX_X2B_DEMUX_PORT_BLK,
++	/* X2b mux Lsc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_LSC_DEMUX_PORT_BLK,
++	/* X2b mux Dpc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_DPC_DEMUX_PORT_BLK,
++	/* X2b mux Input Corr demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_X2B_MUX_INPUT_CORR_DEMUX_PORT_BLK,
++	/* B2b mux Lsc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_LSC_DEMUX_PORT_BLK,
++	/* B2b mux X2b demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_X2B_DEMUX_PORT_BLK,
++	/* B2b mux Dpc demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_B2B_MUX_DPC_DEMUX_PORT_BLK,
++	/* B2b B2b mux port block */
++	IPU_DEVICE_GP_ISA_STATIC_B2B_B2B_MUX_PORT_BLK,
++	/* Stat B2b mux port block */
++	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_B2B_MUX_PORT_BLK,
++	/* Stat Input correction mux port block */
++	IPU_DEVICE_GP_ISA_STATIC_3A_STAT_INPUT_CORR_MUX_PORT_BLK,
++	/* ISA Orig B2b port block */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_ORIG_B2B_PORT_BLK,
++	/* B2r B2b port block */
++	IPU_DEVICE_GP_ISA_STATIC_B2R_B2B_PORT_BLK,
++	/* ISA Scaled A Out R2i port block */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_A_OUT_R2I_PORT_BLK,
++	/* ISA Scaled B Out R2i port block */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_SCALED_B_OUT_R2I_PORT_BLK,
++	/* ISA Full Out R2i port block */
++	IPU_DEVICE_GP_ISA_STATIC_ISA_FULL_OUT_R2I_PORT_BLK,
++	/* Main input Dol demux port block */
++	IPU_DEVICE_GP_ISA_STATIC_MAIN_INPUT_DOL_DEMUX_PORT_BLK,
++	/* 0 - pif_yuv_mode disabled; 1 - pif_yuv_mode enabled */
++	IPU_DEVICE_GP_ISA_PIF_YUV_MODE_EN,
++	IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX
++};
++
++enum ipu_device_gp_isa_runtime_mux_id {
++	/* frame dim */
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_ORIG_OUT,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_FULL_OUT,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_A,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SCALED_B,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_A,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_SIS_B,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_A,
++	IPU_DEVICE_GP_ISA_RUNTIME_FRAME_SIZE_STRMCROP_B,
++	IPU_DEVICE_GP_ISA_RUNTIME_MUX_NUM_MUX
++};
++
++/* The value below is the largest *MUX_NUM_MUX of the mux enums. */
++#define IPU_DEVICE_GP_MAX_NUM ((uint32_t)(IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX))
++
++#endif /* __IPU_DEVICE_GP_DEVICES_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
+new file mode 100644
+index 000000000000..4c756f1ffb24
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/math_support.h
+@@ -0,0 +1,328 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __MATH_SUPPORT_H
++#define __MATH_SUPPORT_H
++
++#include "storage_class.h" /* for STORAGE_CLASS_INLINE */
++#include "type_support.h"
++#include "assert_support.h"
++
++/* in case we have min/max/MIN/MAX macro's undefine them */
++#ifdef min
++#undef min
++#endif
++#ifdef max
++#undef max
++#endif
++#ifdef MIN /* also defined in include/hrt/numeric.h from SDK */
++#undef MIN
++#endif
++#ifdef MAX
++#undef MAX
++#endif
++
++#ifndef INT8_MIN
++#define INT8_MIN        (-127 - 1)
++#endif
++
++#ifndef INT8_MAX
++#define INT8_MAX        (127)
++#endif
++
++#ifndef UINT8_MAX
++#define UINT8_MAX       (0xffUL)
++#endif
++
++#ifndef UINT16_MAX
++#define UINT16_MAX       (0xffffUL)
++#endif
++
++#ifndef UINT32_MAX
++#define UINT32_MAX       (0xffffffffUL)
++#endif
++
++#define IS_ODD(a) ((a) & 0x1)
++#define IS_EVEN(a) (!IS_ODD(a))
++#define IS_POWER2(a) (!((a)&((a)-1)))
++#define IS_MULTIPLE_OF(a, b) ((a % b) == 0)
++#define IS_MASK_BITS_SET(a, b)	((a & b) != 0)
++
++/*To Find next power of 2 number from x */
++#define bit2(x)            ((x)      | ((x) >> 1))
++#define bit4(x)            (bit2(x)  | (bit2(x) >> 2))
++#define bit8(x)            (bit4(x)  | (bit4(x) >> 4))
++#define bit16(x)           (bit8(x)  | (bit8(x) >> 8))
++#define bit32(x)           (bit16(x) | (bit16(x) >> 16))
++#define NEXT_POWER_OF_2(x) (bit32(x-1) + 1)
++
++/* force a value to a lower even value */
++#define EVEN_FLOOR(x)	((x) & ~1UL)
++
++/* A => B */
++#define IMPLIES(a, b) (!(a) || (b))
++
++/* The ORIG_BITS th bit is the sign bit */
++/* Sign extends a ORIG_BITS bits long signed number to a 64-bit signed number */
++/* By type casting it can relimited to any valid type-size
++ * (32-bit signed or 16-bit or 8-bit)
++ */
++/* By masking it can be transformed to any arbitrary bit size */
++#define SIGN_EXTEND(VAL, ORIG_BITS) \
++((~(((VAL)&(1ULL<<((ORIG_BITS)-1)))-1))|(VAL))
++
++#define EXTRACT_BIT(a, b)	((a >> b) & 1)
++
++/* for preprocessor and array sizing use MIN and MAX
++   otherwise use min and max */
++#define MAX(a, b)		(((a) > (b)) ? (a) : (b))
++#define MIN(a, b)		(((a) < (b)) ? (a) : (b))
++#define CLIP(a, b, c)		MIN((MAX((a), (b))), (c))
++/* Integer round-down division of a with b */
++#define FLOOR_DIV(a, b)		((b) ? ((a) / (b)) : 0)
++/* Align a to the lower multiple of b */
++#define FLOOR_MUL(a, b)		(FLOOR_DIV(a, b) * (b))
++/* Integer round-up division of a with b */
++#define CEIL_DIV(a, b)		((b) ? (((a) + (b) - 1) / (b)) : 0)
++/* Align a to the upper multiple of b */
++#define CEIL_MUL(a, b)		(CEIL_DIV(a, b) * (b))
++/* Align a to the upper multiple of b - fast implementation
++ * for cases when b=pow(2,n)
++ */
++#define CEIL_MUL2(a, b)		(((a) + (b) - 1) & ~((b) - 1))
++/* integer round-up division of a with pow(2,b) */
++#define CEIL_SHIFT(a, b)	(((a) + (1UL << (b)) - 1) >> (b))
++/* Align a to the upper multiple of pow(2,b) */
++#define CEIL_SHIFT_MUL(a, b)	(CEIL_SHIFT(a, b) << (b))
++/* Absolute difference of a and b */
++#define ABS_DIF(a, b)		(((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
++#define ABS(a) ABS_DIF(a, 0)
++/* Square of x */
++#define SQR(x)			((x)*(x))
++/* Integer round-half-down division of a nad b */
++#define ROUND_HALF_DOWN_DIV(a, b)	((b) ? ((a) + (b / 2) - 1) / (b) : 0)
++/* Align a to the round-half-down multiple of b */
++#define ROUND_HALF_DOWN_MUL(a, b)	(ROUND_HALF_DOWN_DIV(a, b) * (b))
++
++#define MAX3(a, b, c)		MAX((a), MAX((b), (c)))
++#define MIN3(a, b, c)		MIN((a), MIN((b), (c)))
++#define MAX4(a, b, c, d)	MAX((MAX((a), (b))), (MAX((c), (d))))
++#define MIN4(a, b, c, d)	MIN((MIN((a), (b))), (MIN((c), (d))))
++
++/* min and max should not be macros as they will evaluate their arguments twice.
++   if you really need a macro (e.g. for CPP or for initializing an array)
++   use MIN() and MAX(), otherwise use min() and max() */
++
++#ifndef ARRAY_SIZE
++#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))))
++#endif
++
++#ifndef BYTES
++#define BYTES(bit) (((bit)+7)/8)
++#endif
++
++#if !defined(PIPE_GENERATION)
++STORAGE_CLASS_INLINE unsigned int max_value_bits(unsigned int bits)
++{
++	return (bits == 0) ? 0 : ((2 * ((1 << ((bits) - 1)) - 1)) + 1);
++}
++STORAGE_CLASS_INLINE unsigned int max_value_bytes(unsigned int bytes)
++{
++	return max_value_bits(IA_CSS_UINT8_T_BITS * bytes);
++}
++STORAGE_CLASS_INLINE int max(int a, int b)
++{
++	return MAX(a, b);
++}
++
++STORAGE_CLASS_INLINE int min(int a, int b)
++{
++	return MIN(a, b);
++}
++
++STORAGE_CLASS_INLINE int clip(int a, int b, int c)
++{
++	return min(max(a, b), c);
++}
++
++STORAGE_CLASS_INLINE unsigned int umax(unsigned int a, unsigned int b)
++{
++	return MAX(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int umin(unsigned int a, unsigned int b)
++{
++	return MIN(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int uclip(unsigned int a, unsigned int b,
++					unsigned int c)
++{
++	return umin(umax(a, b), c);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_div(unsigned int a, unsigned int b)
++{
++	return CEIL_DIV(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_mul(unsigned int a, unsigned int b)
++{
++	return CEIL_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_mul2(unsigned int a, unsigned int b)
++{
++	return CEIL_MUL2(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_shift(unsigned int a, unsigned int b)
++{
++	return CEIL_SHIFT(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_shift_mul(unsigned int a, unsigned int b)
++{
++	return CEIL_SHIFT_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE int abs_dif(int a, int b)
++{
++	return ABS_DIF(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int uabs_dif(unsigned int a, unsigned int b)
++{
++	return ABS_DIF(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int round_half_down_div(unsigned int a,
++		unsigned int b)
++{
++	return ROUND_HALF_DOWN_DIV(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int round_half_down_mul(unsigned int a,
++		unsigned int b)
++{
++	return ROUND_HALF_DOWN_MUL(a, b);
++}
++
++STORAGE_CLASS_INLINE unsigned int ceil_pow2(uint32_t a)
++{
++	unsigned int retval = 0;
++
++	if (IS_POWER2(a)) {
++		retval =  (unsigned int)a;
++	} else {
++		unsigned int v = a;
++
++		v |= v>>1;
++		v |= v>>2;
++		v |= v>>4;
++		v |= v>>8;
++		v |= v>>16;
++		retval =  (unsigned int)(v+1);
++	}
++	return retval;
++}
++
++STORAGE_CLASS_INLINE unsigned int floor_log2(uint32_t a)
++{
++	static const uint8_t de_bruijn[] = {
++		0,  9,  1, 10, 13, 21,  2, 29, 11, 14, 16, 18, 22, 25,  3, 30,
++		8, 12, 20, 28, 15, 17, 24,  7, 19, 27, 23,  6, 26,  5,  4, 31
++	};
++	uint32_t v = a;
++
++	v |= v>>1;
++	v |= v>>2;
++	v |= v>>4;
++	v |= v>>8;
++	v |= v>>16;
++	return (unsigned int)de_bruijn[(v*0x07C4ACDDU)>>27];
++}
++
++/* Divide by small power of two */
++STORAGE_CLASS_INLINE unsigned int
++udiv2_small_i(uint32_t a, uint32_t b)
++{
++	assert(b <= 2);
++	return a >> (b-1);
++}
++
++/* optimized divide for small results
++ * a will be divided by b
++ * outbits is the number of bits needed for the result
++ * the smaller the cheaper the function will be.
++ * if the result doesn't fit in the number of output bits
++ * the result is incorrect and the function will assert
++ */
++STORAGE_CLASS_INLINE unsigned int
++udiv_medium(uint32_t a, uint32_t b, unsigned outbits)
++{
++	int bit;
++	unsigned res = 0;
++	unsigned mask;
++
++#ifdef VOLCANO
++#pragma ipu unroll
++#endif
++	for (bit = outbits-1 ; bit >= 0; bit--) {
++		mask = 1<<bit;
++		if (a >= (b<<bit)) {
++			res |= mask; /* set the bit */
++			a = a - (b<<bit);
++		}
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++	}
++	/* check if the remainder is smaller than the divisor.
++	 * if not we didn't produce enough output bits
++	 */
++	assert(a < b);
++	return res;
++}
++
++#if !defined(__VIED_CELL)
++/*
++ * For SP and ISP, SDK provides the definition of OP_std_modadd.
++ * We need it only for host
++ */
++STORAGE_CLASS_INLINE unsigned int OP_std_modadd(int a, int b, int c)
++{
++	return (a+b < 0 ? a+b+c : a+b >= c ? a+b-c : a+b);
++}
++
++/*
++ * For SP and ISP, SDK provides the definition of OP_asp_slor.
++ * We need it only for host
++ */
++STORAGE_CLASS_INLINE unsigned int OP_asp_slor(int a, int b, int c)
++{
++	return ((a << c) | b);
++}
++#else
++#include "hive/customops.h"
++#endif /* !defined(__VIED_CELL) */
++
++#endif /* !defined(PIPE_GENERATION) */
++#if !defined(__KERNEL__)
++#define clamp(a, min_val, max_val) MIN(MAX((a), (min_val)), (max_val))
++#endif /* !defined(__KERNEL__) */
++
++#endif /* __MATH_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
+new file mode 100644
+index 000000000000..1d6c2c6e765e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/misc_support.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __MISC_SUPPORT_H
++#define __MISC_SUPPORT_H
++
++/* suppress compiler warnings on unused variables */
++#ifndef NOT_USED
++#define NOT_USED(a) ((void)(a))
++#endif
++
++/* Calculate the  total bytes for pow(2) byte alignment */
++#define tot_bytes_for_pow2_align(pow2, cur_bytes) \
++	((cur_bytes + (pow2 - 1)) & ~(pow2 - 1))
++
++/* Display the macro value given a string */
++#define _STR(x) #x
++#define STR(x) _STR(x)
++
++/* Concatenate */
++#ifndef CAT /* also defined in <hive/attributes.h> */
++#define _CAT(a, b)	a ## b
++#define CAT(a, b)	_CAT(a, b)
++#endif
++
++#define _CAT3(a, b, c)	a ## b ## c
++#define CAT3(a, b, c)	_CAT3(a, b, c)
++
++/* NO_HOIST, NO_CSE, NO_ALIAS attributes must be ignored for host code */
++#ifndef __HIVECC
++#ifndef NO_HOIST
++#define NO_HOIST
++#endif
++#ifndef NO_CSE
++#define NO_CSE
++#endif
++#ifndef NO_ALIAS
++#define NO_ALIAS
++#endif
++#endif
++
++enum hive_method_id {
++	HIVE_METHOD_ID_CRUN,
++	HIVE_METHOD_ID_UNSCHED,
++	HIVE_METHOD_ID_SCHED,
++	HIVE_METHOD_ID_TARGET
++};
++
++/* Derive METHOD */
++#if defined(C_RUN)
++	#define HIVE_METHOD "crun"
++	#define HIVE_METHOD_ID HIVE_METHOD_ID_CRUN
++#elif defined(HRT_UNSCHED)
++	#define HIVE_METHOD "unsched"
++	#define HIVE_METHOD_ID HIVE_METHOD_ID_UNSCHED
++#elif defined(HRT_SCHED)
++	#define HIVE_METHOD "sched"
++	#define HIVE_METHOD_ID HIVE_METHOD_ID_SCHED
++#else
++	#define HIVE_METHOD "target"
++	#define HIVE_METHOD_ID HIVE_METHOD_ID_TARGET
++	#define HRT_TARGET 1
++#endif
++
++#endif /* __MISC_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
+new file mode 100644
+index 000000000000..8c7a6e1b9400
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/pg_control_init_framework.h
+@@ -0,0 +1,78 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PG_CONTROL_INIT_FRAMEWORK_H
++#define __PG_CONTROL_INIT_FRAMEWORK_H
++
++#include <type_support.h>
++#include <ia_css_psys_process_types.h>
++#include <ia_css_terminal_types.h>
++#include <ia_css_kernel_user_param_types.h>
++
++#pragma GCC visibility push(default)
++
++enum pg_control_init_ret_type {
++    PG_CONTROL_INIT_SUCCESS  = 0,
++    PG_CONTROL_INIT_FAILURE = (1 << 0)
++};
++
++/*
++ * @brief  Fill the program control init desc.
++ *
++ * @param[in]  process_group Process group.
++ * @param[out] terminal      Program control init terminal.
++ *
++ * @retval  0  Successful.
++ * @retval  1  Error.
++ */
++
++int pg_control_init_terminal_init(
++        ia_css_process_group_t *process_group,
++        ia_css_program_control_init_terminal_t *terminal);
++
++/**
++ * @brief  Fill the program control init payload.
++ *
++ * @param[in]  process_group    Process group.
++ * @param[in]  params           Kernel user parameters object.
++ * @param[in]  payload_address  Host address in payload.
++ *
++ * @retval 0   Successful.
++ * @retval 1  Error.
++ */
++
++int pg_control_init_fill_payload(
++    const ia_css_process_group_t *process_group,
++    const ia_css_kernel_user_param_t *params,
++    void *payload_address);
++
++/**
++ * @brief  Get the payload size
++ *
++ * @param[in]   process_group Process group
++ * @param[out]  payload_size  Payload size to be allocated for the process.
++ *
++ * @retval 0   Successful.
++ * @retval 1  Error.
++ */
++
++int pg_control_init_get_payload_size(
++    const ia_css_process_group_t *process_group,
++    unsigned int *payload_size);
++
++#pragma GCC visibility pop
++
++#endif /*__PG_CONTROL_INIT_FRAMEWORK_H*/
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
+new file mode 100644
+index 000000000000..e8146f385362
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/platform_support.h
+@@ -0,0 +1,194 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PLATFORM_SUPPORT_H
++#define __PLATFORM_SUPPORT_H
++
++#include "storage_class.h"
++
++#define MSEC_IN_SEC 1000
++#define NSEC_IN_MSEC 1000000
++
++#define NUM_SLEEP_MSEC_WA_XTENSA 1
++
++#if defined(_MSC_VER)
++#include <string.h>
++
++#define IA_CSS_EXTERN
++#define SYNC_WITH(x)
++#define CSS_ALIGN(d, a) _declspec(align(a)) d
++
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	/* Placeholder for driver team*/
++}
++
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++	/* Placeholder for driver team*/
++	(void)delay_time_ms;
++}
++
++#elif defined(__HIVECC)
++#include <string.h>
++#include <hive/support.h>
++#include <hive/attributes.h>
++
++#define IA_CSS_EXTERN extern
++#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	OP___schedule();
++}
++
++#elif defined(__KERNEL__)
++#include <linux/string.h>
++#include <linux/delay.h>
++
++#define IA_CSS_EXTERN
++#define CSS_ALIGN(d, a) d __aligned(a)
++
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	usleep_range(1, 50);
++}
++#elif defined(__XTENSA_FW__)
++
++#include <hive/support.h>
++
++#define ALIAS_ATTR(target) __attribute__((alias(#target)))
++#define WEAK_ALIAS_ATTR(target) __attribute__((weak, alias(#target)))
++
++#elif defined(__GNUC__)
++#include <string.h>
++
++#define IA_CSS_EXTERN
++#define CSS_ALIGN(d, a) d __attribute__((aligned(a)))
++
++/* Define some __HIVECC specific macros to nothing to allow host code compilation */
++#ifndef NO_ALIAS
++#define NO_ALIAS
++#endif
++
++#ifndef SYNC_WITH
++#define SYNC_WITH(x)
++#endif
++
++#if defined(HRT_CSIM)
++#include "hrt/host.h" /* Using hrt_sleep from hrt/host.h */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	/* For the SDK still using hrt_sleep */
++	hrt_sleep();
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++	/* For the SDK still using hrt_sleep */
++	unsigned int long i = 0;
++
++	for (i = 0; i < delay_time_ms; i++) {
++		hrt_sleep();
++	}
++}
++#elif defined(__XTENSA_FW__) /* XTENSA FW */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	/* do nothing */
++}
++#elif defined(IPUSIM_SLEEP)
++#include "hrt/host.h"
++#include "misc_support.h" /* for NOT_USED macro */
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	hrt_sleep();
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++	/* if hrt_sleep_ns(delay_time_ms) is used here, it slows tests dramatically.
++	 * hrt_sleep_ns(delay_time_ms * 1000000) causes an effective hang.
++	 * This is because ia_css_sleep_msec is used thousands of times (BUG).
++	 * hrt_sleep_ns(1) is fine (NUM_SLEEP_MSEC_WA_XTENSA = 1).
++	 */
++	NOT_USED(delay_time_ms);
++	hrt_sleep_ns(NUM_SLEEP_MSEC_WA_XTENSA);
++}
++#else
++#include <time.h>
++STORAGE_CLASS_INLINE void ia_css_sleep(void)
++{
++	struct timespec delay_time;
++
++	delay_time.tv_sec = 0;
++	delay_time.tv_nsec = 10;
++	nanosleep(&delay_time, NULL);
++}
++STORAGE_CLASS_INLINE void ia_css_sleep_msec(unsigned int long delay_time_ms)
++{
++	struct timespec delay_time;
++
++	if (delay_time_ms >= MSEC_IN_SEC) {
++		delay_time.tv_sec = delay_time_ms / MSEC_IN_SEC;
++		delay_time.tv_nsec = (delay_time_ms % MSEC_IN_SEC) * NSEC_IN_MSEC;
++	} else {
++		delay_time.tv_sec = 0;
++		delay_time.tv_nsec = delay_time_ms * NSEC_IN_MSEC;
++	}
++	nanosleep(&delay_time, NULL);
++}
++#endif
++
++#else
++
++#if defined(__XTENSA_FW__)
++
++#define CSS_ALIGN(d, a) d
++
++#define ia_css_sleep()
++
++#if defined(__XTENSA_EL__)
++#define __IEEE_LITTLE_ENDIAN
++#else
++#define __IEEE_BIG_ENDIAN
++#endif
++
++#endif
++#include <string.h>
++#endif
++
++/*needed for the include in stdint.h for various environments */
++#include "type_support.h"
++#include "storage_class.h"
++
++#define MAX_ALIGNMENT			8
++#define aligned_uint8(type, obj)	CSS_ALIGN(uint8_t obj, 1)
++#define aligned_int8(type, obj)		CSS_ALIGN(int8_t obj, 1)
++#define aligned_uint16(type, obj)	CSS_ALIGN(uint16_t obj, 2)
++#define aligned_int16(type, obj)	CSS_ALIGN(int16_t obj, 2)
++#define aligned_uint32(type, obj)	CSS_ALIGN(uint32_t obj, 4)
++#define aligned_int32(type, obj)	CSS_ALIGN(int32_t obj, 4)
++
++/* needed as long as hivecc does not define the type (u)int64_t */
++#if defined(__HIVECC)
++#define aligned_uint64(type, obj)	CSS_ALIGN(unsigned long long obj, 8)
++#define aligned_int64(type, obj)	CSS_ALIGN(signed long long obj, 8)
++#else
++#define aligned_uint64(type, obj)	CSS_ALIGN(uint64_t obj, 8)
++#define aligned_int64(type, obj)	CSS_ALIGN(int64_t obj, 8)
++#endif
++#define aligned_enum(enum_type, obj)	CSS_ALIGN(uint32_t obj, 4)
++#define aligned_struct(struct_type, obj)	struct_type obj
++
++#endif /* __PLATFORM_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
+new file mode 100644
+index 000000000000..b36b67e5030a
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/print_support.h
+@@ -0,0 +1,121 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PRINT_SUPPORT_H
++#define __PRINT_SUPPORT_H
++
++#if defined(_MSC_VER)
++#ifdef _KERNEL_MODE
++
++/* TODO: Windows driver team to provide tracing mechanism for kernel mode
++ * e.g. DbgPrint and DbgPrintEx
++ */
++extern void FwTracePrintPWARN(const char *fmt, ...);
++extern void FwTracePrintPRINT(const char *fmt, ...);
++extern void FwTracePrintPERROR(const char *fmt, ...);
++extern void FwTracePrintPDEBUG(const char *fmt, ...);
++extern void FwTracePrintPFATAL(const char *fmt, ...);
++
++#define PWARN(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
++#define PWARNING(format, ...)	FwTracePrintPWARN(format, __VA_ARGS__)
++#define PRINT(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
++#define PINFO(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
++#define PERROR(format, ...)	FwTracePrintPERROR(format, __VA_ARGS__)
++#define PDEBUG(format, ...)	FwTracePrintPDEBUG(format, __VA_ARGS__)
++#define PVERBOSE(format, ...)	FwTracePrintPRINT(format, __VA_ARGS__)
++#define PFATAL(format, ...)	FwTracePrintPFATAL(format, __VA_ARGS__)
++
++#else
++/* Windows usermode compilation */
++#include <stdio.h>
++
++/* To change the defines below, communicate with Windows team first
++ * to ensure they will not get flooded with prints
++ */
++/* This is temporary workaround to avoid flooding userspace
++ * Windows driver with prints
++ */
++
++#define PWARN(format, ...)
++#define PWARNING(format, ...)
++#define PRINT(format, ...)
++#define PINFO(format, ...)
++#define PERROR(format, ...)	printf("error: " format, __VA_ARGS__)
++#define PDEBUG(format, ...)
++#define PVERBOSE(format, ...)
++#define PFATAL(format, ...)
++
++#endif /* _KERNEL_MODE */
++#elif defined(__HIVECC)
++#include <hive/support.h>
++/* To be revised
++
++#define PWARN(format)
++#define PRINT(format)				OP___printstring(format)
++#define PERROR(variable)			OP___dump(9999, arguments)
++#define PDEBUG(variable)			OP___dump(__LINE__, arguments)
++
++*/
++
++#define PRINTSTRING(str) OP___printstring(str)
++
++#elif defined(__KERNEL__)
++#include <linux/kernel.h>
++#include <linux/printk.h>
++
++#define PWARN(format, arguments...)	pr_debug(format, ##arguments)
++#define PRINT(format, arguments...)	pr_debug(format, ##arguments)
++#define PERROR(format, arguments...)	pr_debug(format, ##arguments)
++#define PDEBUG(format, arguments...)	pr_debug(format, ##arguments)
++
++#elif defined(__XTENSA_FW__)
++
++#include "print_support_xtensa.h"
++
++#elif defined(XTENSA_HOST)
++
++#include "print_support_xtensa.h"
++
++#else
++
++#include <stdio.h>
++
++#define PRINT_HELPER(prefix, format, ...) printf(prefix format "%s", __VA_ARGS__)
++
++/** WA_1507432540 - Limit prints to PERROR only
++ * Workaround to avoid flooding host with prints.
++ */
++#ifdef HOST_LOGLEVEL_ERROR_ONLY
++
++/* The trailing "" allows the edge case of printing single string */
++#define PWARN(...)
++#define PRINT(...)
++#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
++#define PDEBUG(...)
++
++#else
++
++/* The trailing "" allows the edge case of printing single string */
++#define PWARN(...)  PRINT_HELPER("warning: ", __VA_ARGS__, "")
++#define PRINT(...)  PRINT_HELPER("", __VA_ARGS__, "")
++#define PERROR(...) PRINT_HELPER("error: ", __VA_ARGS__, "")
++#define PDEBUG(...) PRINT_HELPER("debug: ", __VA_ARGS__, "")
++
++#endif
++#define PRINTSTRING(str) PRINT(str)
++
++#endif
++#endif /* __PRINT_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
+new file mode 100644
+index 000000000000..7c1279347537
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/psys_system_global_impl.h
+@@ -0,0 +1,504 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __PSYS_SYSTEM_GLOBAL_IMPL_H
++#define __PSYS_SYSTEM_GLOBAL_IMPL_H
++
++#include <vied_nci_psys_system_global.h>
++
++#include "ia_css_psys_sim_trace.h"
++#include <assert_support.h>
++
++/* Use vied_bits instead, however for test purposes we uses explicit type
++ * checking
++ */
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bit_mask(
++	const unsigned int						index)
++{
++	vied_nci_resource_bitmap_t	bit_mask = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bit_mask(): enter:\n");
++
++	if (index < VIED_NCI_RESOURCE_BITMAP_BITS)
++		bit_mask = (vied_nci_resource_bitmap_t)1 << index;
++
++	return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask)
++{
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_set(): enter:\n");
++
++/*
++	assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++	return bitmap | bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask)
++{
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_bitmap_clear(): enter:\n");
++
++/*
++	assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++	return bitmap & (~bit_mask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
++		const unsigned int position,
++		const unsigned int size)
++{
++	vied_nci_resource_bitmap_t	bit_mask = 0;
++	vied_nci_resource_bitmap_t ones = (vied_nci_resource_bitmap_t)-1;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		       "vied_nci_bitfield_mask(): enter:\n");
++
++	if (position < VIED_NCI_RESOURCE_BITMAP_BITS)
++		bit_mask = (ones >> (sizeof(vied_nci_resource_bitmap_t) - size)) << position;
++
++	return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const unsigned int						index,
++	const unsigned int						size)
++{
++	vied_nci_resource_bitmap_t	ret = 0;
++	vied_nci_resource_bitmap_t	bit_mask = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		       "vied_nci_bit_mask_set_bitfield(): enter:\n");
++
++	bit_mask = vied_nci_bitfield_mask(index, size);
++	ret = vied_nci_bitmap_set(bitmap, bit_mask);
++
++	return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask)
++{
++	vied_nci_resource_bitmap_t	ret = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_bitmap_set_unique(): enter:\n");
++
++	if ((bitmap & bit_mask) == 0)
++		ret = bitmap | bit_mask;
++
++	return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const unsigned int						index)
++{
++	vied_nci_resource_bitmap_t	ret = 0;
++	vied_nci_resource_bitmap_t	bit_mask;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		       "vied_nci_bit_mask_set_unique(): enter:\n");
++
++	bit_mask = vied_nci_bit_mask(index);
++
++	if (((bitmap & bit_mask) == 0) && (bit_mask != 0))
++		ret = bitmap | bit_mask;
++
++	return ret;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_empty(
++	const vied_nci_resource_bitmap_t		bitmap)
++{
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_bitmap_empty(): enter:\n");
++
++	return (bitmap == 0);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_set(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask)
++{
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_bitmap_set(): enter:\n");
++
++/*
++	assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++	return !vied_nci_is_bitmap_clear(bitmap, bit_mask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bit_set_in_bitmap(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const unsigned int		index)
++{
++
++	vied_nci_resource_bitmap_t bitmask;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_bit_set_in_bitmap(): enter:\n");
++	bitmask = vied_nci_bit_mask(index);
++	return vied_nci_is_bitmap_set(bitmap, bitmask);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_bitmap_clear(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask)
++{
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_bitmap_clear(): enter:\n");
++
++/*
++	assert(vied_nci_is_bitmap_one_hot(bit_mask));
++*/
++	return ((bitmap & bit_mask) == 0);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++int vied_nci_bitmap_compute_weight(
++	const vied_nci_resource_bitmap_t		bitmap)
++{
++	vied_nci_resource_bitmap_t	loc_bitmap = bitmap;
++	int	weight = 0;
++	int	i;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_bitmap_compute_weight(): enter:\n");
++
++	/* Do not need the iterator "i" */
++	for (i = 0; (i < VIED_NCI_RESOURCE_BITMAP_BITS) &&
++		    (loc_bitmap != 0); i++) {
++		weight += loc_bitmap & 0x01;
++		loc_bitmap >>= 1;
++	}
++
++	return weight;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_union(
++	const vied_nci_resource_bitmap_t	bitmap0,
++	const vied_nci_resource_bitmap_t	bitmap1)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_bitmap_union(): enter:\n");
++	return (bitmap0 | bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
++	const vied_nci_resource_bitmap_t		bitmap0,
++	const vied_nci_resource_bitmap_t		bitmap1)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"ia_css_kernel_bitmap_intersection(): enter:\n");
++	return (bitmap0 & bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
++	const vied_nci_resource_bitmap_t		bitmap0,
++	const vied_nci_resource_bitmap_t		bitmap1)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "vied_nci_bitmap_xor(): enter:\n");
++	return (bitmap0 ^ bitmap1);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
++	const vied_nci_cell_ID_t		cell_id)
++{
++	vied_nci_resource_bitmap_t	bit_mask = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_cell_bit_mask(): enter:\n");
++
++	if (cell_id < VIED_NCI_N_CELL_ID) {
++		bit_mask = (vied_nci_resource_bitmap_t)1 << cell_id;
++	}
++	return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
++	const vied_nci_barrier_ID_t		barrier_id)
++{
++	vied_nci_resource_bitmap_t	bit_mask = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_barrier_bit_mask(): enter:\n");
++
++	if (((barrier_id + VIED_NCI_N_CELL_ID) < VIED_NCI_RESOURCE_BITMAP_BITS)) {
++		bit_mask = (vied_nci_resource_bitmap_t)1 <<
++				(barrier_id + VIED_NCI_N_CELL_ID);
++	}
++	return bit_mask;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_cell_type_ID_t vied_nci_cell_get_type(
++	const vied_nci_cell_ID_t		cell_id)
++{
++	vied_nci_cell_type_ID_t	cell_type = VIED_NCI_N_CELL_TYPE_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_cell_get_type(): enter:\n");
++
++	if (cell_id < VIED_NCI_N_CELL_ID) {
++		cell_type = (vied_nci_cell_type_ID_t)vied_nci_cell_type[cell_id];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++			"vied_nci_cell_get_type(): invalid argument\n");
++	}
++
++	return cell_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
++	const vied_nci_mem_type_ID_t		mem_type)
++{
++	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_ext_mem_get_id_from_type(): enter:\n");
++
++	if (mem_type < (unsigned)VIED_NCI_N_MEM_ID && vied_nci_mem_is_ext_type(mem_type)) {
++		mem_id = (vied_nci_mem_ID_t)vied_nci_ext_mem[mem_type];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++			"vied_nci_ext_mem_get_id_from_type(): invalid argument\n");
++	}
++
++	return mem_id;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_mem_get_type(
++	const vied_nci_mem_ID_t			mem_id)
++{
++	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_mem_get_type(): enter:\n");
++
++	if (mem_id < VIED_NCI_N_MEM_ID) {
++		mem_type = (vied_nci_mem_type_ID_t)vied_nci_mem_type[mem_id];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++			"vied_nci_mem_get_type(): invalid argument\n");
++	}
++
++	return mem_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_mem_get_size(
++	const vied_nci_mem_ID_t			mem_id)
++{
++	uint16_t	mem_size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_mem_get_size(): enter:\n");
++
++	if (mem_id < VIED_NCI_N_MEM_ID) {
++		mem_size = vied_nci_mem_size[mem_id];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++			"vied_nci_mem_get_size(): invalid argument\n");
++	}
++
++	return mem_size;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_dev_chn_get_size(
++	const vied_nci_dev_chn_ID_t		dev_chn_id)
++{
++	uint16_t	dev_chn_size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_dev_chn_get_size(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++	if (dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++		dev_chn_size = vied_nci_dev_chn_size[dev_chn_id];
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_SIM, WARNING,
++			"vied_nci_dev_chn_get_size(): invalid argument\n");
++	}
++#else
++	((void)(dev_chn_id)); /* not used in ipu7 */
++#endif
++	return dev_chn_size;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_cell_of_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const vied_nci_cell_type_ID_t	cell_type_id)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_cell_of_type(): enter:\n");
++
++	return ((vied_nci_cell_get_type(cell_id) ==
++		 cell_type_id) && (cell_type_id !=
++		 VIED_NCI_N_CELL_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_mem_of_type(
++	const vied_nci_mem_ID_t			mem_id,
++	const vied_nci_mem_type_ID_t	mem_type_id)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_mem_of_type(): enter:\n");
++
++	return ((vied_nci_mem_get_type(mem_id) == mem_type_id) &&
++		(mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_is_cell_mem_of_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index,
++	const vied_nci_mem_type_ID_t	mem_type_id)
++{
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_is_cell_mem_of_type(): enter:\n");
++
++	return ((vied_nci_cell_get_mem_type(cell_id, mem_index) == mem_type_id)
++		&& (mem_type_id != VIED_NCI_N_MEM_TYPE_ID));
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++bool vied_nci_has_cell_mem_of_id(
++	const vied_nci_cell_ID_t		cell_id,
++	const vied_nci_mem_ID_t			mem_id)
++{
++	uint16_t		mem_index;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_has_cell_mem_of_id(): enter:\n");
++
++	for (mem_index = 0; mem_index < VIED_NCI_N_MEM_TYPE_ID; mem_index++) {
++		if ((vied_nci_cell_get_mem(cell_id, mem_index) == mem_id) &&
++		    (mem_id != VIED_NCI_N_MEM_ID)) {
++			break;
++		}
++	}
++
++	return (mem_index < VIED_NCI_N_MEM_TYPE_ID);
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++uint16_t vied_nci_cell_get_mem_count(
++	const vied_nci_cell_ID_t		cell_id)
++{
++	uint16_t	mem_count = 0;
++	vied_nci_cell_type_ID_t	cell_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_cell_get_mem_count(): enter:\n");
++
++	cell_type = vied_nci_cell_get_type(cell_id);
++
++	if (cell_type < VIED_NCI_N_CELL_TYPE_ID)
++		mem_count = vied_nci_N_cell_mem[cell_type];
++
++	return mem_count;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index)
++{
++	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_cell_get_mem_type(): enter:\n");
++
++	if ((cell_id < VIED_NCI_N_CELL_ID) &&
++	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[
++				vied_nci_cell_get_type(cell_id)][mem_index]);
++	}
++
++	return mem_type;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_ID_t vied_nci_cell_get_mem(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index)
++{
++	vied_nci_mem_ID_t	mem_id = VIED_NCI_N_MEM_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		"vied_nci_cell_get_mem(): enter:\n");
++
++	if ((cell_id < VIED_NCI_N_CELL_ID) &&
++	    (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++		mem_id = (vied_nci_mem_ID_t)(vied_nci_cell_mem[cell_id][mem_index]);
++	}
++
++	return mem_id;
++}
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_C
++vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
++	const vied_nci_cell_type_ID_t	cell_type_id,
++	const uint16_t					mem_index)
++{
++	vied_nci_mem_type_ID_t	mem_type = VIED_NCI_N_MEM_TYPE_ID;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE,
++		       "vied_nci_cell_type_get_mem_type(): enter:\n");
++
++	if ((cell_type_id < VIED_NCI_N_CELL_TYPE_ID)
++			&& (mem_index < VIED_NCI_N_MEM_TYPE_ID)) {
++		mem_type = (vied_nci_mem_type_ID_t)(vied_nci_cell_mem_type[cell_type_id][mem_index]);
++	}
++
++	return mem_type;
++}
++
++#endif /* __PSYS_SYSTEM_GLOBAL_IMPL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
+new file mode 100644
+index 000000000000..aeb9ffb3b367
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/storage_class.h
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __STORAGE_CLASS_H
++#define __STORAGE_CLASS_H
++
++#define STORAGE_CLASS_EXTERN \
++extern
++
++#if defined(_MSC_VER)
++#define STORAGE_CLASS_INLINE \
++static __inline
++#elif defined(__HIVECC)
++#define STORAGE_CLASS_INLINE \
++static inline
++#elif defined(__XTENSA_FW__)
++#include "storage_class_xtensa.h"
++#else
++#define STORAGE_CLASS_INLINE \
++static inline
++#endif
++
++/* Register struct */
++#ifndef __register
++#if defined(__HIVECC) && !defined(PIPE_GENERATION)
++#define __register register
++#else
++#define __register
++#endif
++#endif
++
++/* Memory attribute */
++#ifndef MEM
++#ifdef PIPE_GENERATION
++#elif defined(__HIVECC)
++#include <hive/attributes.h>
++#else
++#define MEM(any_mem)
++#endif
++#endif
++
++#endif /* __STORAGE_CLASS_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
+new file mode 100644
+index 000000000000..4078711380ec
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/type_support.h
+@@ -0,0 +1,82 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __TYPE_SUPPORT_H
++#define __TYPE_SUPPORT_H
++
++/* Per the DLI spec, types are in "type_support.h" and
++ * "platform_support.h" is for unclassified/to be refactored
++ * platform specific definitions.
++ */
++#define IA_CSS_UINT8_T_BITS	8
++#define IA_CSS_UINT16_T_BITS	16
++#define IA_CSS_UINT32_T_BITS	32
++#define IA_CSS_INT32_T_BITS	32
++#define IA_CSS_UINT64_T_BITS	64
++
++#if defined(_MSC_VER)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#if defined(_M_X64)
++#define HOST_ADDRESS(x) (unsigned long long)(x)
++#else
++#define HOST_ADDRESS(x) (unsigned long)(x)
++#endif
++
++#elif defined(PARAM_GENERATION)
++/* Nothing */
++#elif defined(__HIVECC)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++typedef long long int64_t;
++typedef unsigned long long uint64_t;
++
++#elif defined(__XTENSA_FW__)
++#include "type_support_xtensa.h"
++#elif defined(__KERNEL__)
++#include <linux/types.h>
++#include <linux/limits.h>
++
++#define CHAR_BIT (8)
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#elif defined(__GNUC__)
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#else /* default is for the FIST environment */
++#include <stdint.h>
++#include <stdbool.h>
++#include <stddef.h>
++#include <limits.h>
++#define HOST_ADDRESS(x) (unsigned long)(x)
++
++#endif
++#if !defined(PIPE_GENERATION) && !defined(IO_GENERATION)
++/* genpipe cannot handle the void* syntax */
++typedef void *HANDLE;
++#endif
++
++#endif /* __TYPE_SUPPORT_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
+new file mode 100644
+index 000000000000..da5866cca46b
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_acb_route_type.h
+@@ -0,0 +1,41 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef VIED_NCI_ACB_ROUTE_TYPE_H_
++#define VIED_NCI_ACB_ROUTE_TYPE_H_
++
++#include "type_support.h"
++
++typedef enum {
++	NCI_ACB_PORT_ISP = 0,
++	NCI_ACB_PORT_ACC = 1,
++	NCI_ACB_PORT_INVALID = 0xFF
++} nci_acb_port_t;
++
++typedef struct {
++	/* 0 = ISP, 1 = Acc */
++	nci_acb_port_t in_select;
++	/* 0 = ISP, 1 = Acc */
++	nci_acb_port_t out_select;
++	/* When set, Ack will be sent only when Eof arrives */
++	uint32_t ignore_line_num;
++	/* Fork adapter to enable streaming to both output
++	 * (next acb out and isp out)
++	 */
++	uint32_t fork_acb_output;
++} nci_acb_route_t;
++
++#endif /* VIED_NCI_ACB_ROUTE_TYPE_H_ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
+new file mode 100644
+index 000000000000..0aaa15614421
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_resource_model.h
+@@ -0,0 +1,342 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __VIED_NCI_PSYS_RESOURCE_MODEL_H
++#define __VIED_NCI_PSYS_RESOURCE_MODEL_H
++
++#include "type_support.h"
++#include "storage_class.h"
++
++#define HAS_DFM					1
++#define HAS_DMA_INTERNAL		0
++#define NON_RELOC_RESOURCE_SUPPORT	1
++#define IA_CSS_KERNEL_BITMAP_BITS 	128
++
++/* Defines for the routing bitmap in the program group manifest.
++ */
++#define VIED_NCI_RBM_MAX_MUX_COUNT			60
++#define VIED_NCI_RBM_MAX_VALIDATION_RULE_COUNT		27
++#define VIED_NCI_RBM_MAX_TERMINAL_DESC_COUNT		4
++#define N_PADDING_UINT8_IN_RBM_MANIFEST			2
++
++/* The amount of padding bytes needed to make
++ * ia_css_process_s/ia_css_process_ext_s/
++ * ia_css_program_manifest_s/ia_css_program_manifest_ext_s
++ * structures 32 bit aligned (source files have check on this)
++ */
++#define	N_PADDING_UINT8_IN_PROCESS_STRUCT		0
++#define N_PADDING_UINT8_IN_PROCESS_EXT_STRUCT	1
++#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST		0
++#define	N_PADDING_UINT8_IN_PROGRAM_MANIFEST_EXT	2
++
++/*
++ * Cell IDs
++ */
++typedef enum {
++	VIED_NCI_SP0_ID = 0,
++	VIED_NCI_ISA_ICA_ID,
++	VIED_NCI_ISA_LSC_ID,
++	VIED_NCI_ISA_DPC_ID,
++	VIED_NCI_ISA_B2B_ID,
++#if defined(IPU_SYSVER_ipu6v2)
++	VIED_NCI_ISA_B2R_R2I_SIE_ID,
++#elif defined(IPU_SYSVER_ipu6v3) || defined(IPU_SYSVER_ipu6v4)
++	VIED_NCI_ISA_BNLM_ID,
++	VIED_NCI_ISA_DM_ID,
++	VIED_NCI_ISA_R2I_SIE_ID,
++#else
++	#error assert 0
++#endif
++	VIED_NCI_ISA_R2I_DS_A_ID,
++	VIED_NCI_ISA_R2I_DS_B_ID,
++	VIED_NCI_ISA_AWB_ID,
++	VIED_NCI_ISA_AE_ID,
++	VIED_NCI_ISA_AF_ID,
++	VIED_NCI_ISA_PAF_ID,
++} vied_nci_cell_ID_t;
++
++#define VIED_NCI_N_CELL_ID (VIED_NCI_ISA_PAF_ID + 1)
++
++/*
++ * In several places we don't need to size the look up tables for the full amount of cells
++ * because they are only used for the VP and SP cells and not for the accelerator cells.
++ * It is important that these cells are in the beginning of the LUT
++ */
++#define VIED_NCI_N_PROG_CELLS (VIED_NCI_SP0_ID + 1)
++
++/*
++ * Barrier bits (to model process group dependencies)
++ * todo verify that this is valid for ipu6
++ */
++typedef enum {
++	VIED_NCI_BARRIER0_ID,
++	VIED_NCI_BARRIER1_ID,
++	VIED_NCI_BARRIER2_ID,
++	VIED_NCI_BARRIER3_ID,
++	VIED_NCI_BARRIER4_ID,
++	VIED_NCI_BARRIER5_ID,
++	VIED_NCI_BARRIER6_ID,
++	VIED_NCI_BARRIER7_ID
++} vied_nci_barrier_ID_t;
++
++#define VIED_NCI_N_BARRIER_ID (VIED_NCI_BARRIER7_ID + 1)
++/*
++ * Cell types
++ */
++typedef enum {
++	VIED_NCI_SP_CTRL_TYPE_ID = 0,
++	VIED_NCI_SP_SERVER_TYPE_ID,
++	VIED_NCI_ACC_ISA_TYPE_ID,
++	VIED_NCI_N_CELL_TYPE_ID
++} vied_nci_cell_type_ID_t;
++
++/* Not used cell types */
++#define VIED_NCI_ACC_PSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
++#define VIED_NCI_ACC_OSA_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
++#define VIED_NCI_GDC_TYPE_ID (VIED_NCI_N_CELL_TYPE_ID)
++
++/*
++ * Memory IDs
++ */
++typedef enum {
++	VIED_NCI_TRANSFER_VMEM0_ID = 0, /* TRANSFER VMEM 0 */
++	VIED_NCI_LB_VMEM_ID, /* LB VMEM */
++	VIED_NCI_DMEM0_ID, /* SPC0 Dmem */
++	VIED_NCI_DMEM1_ID /* SPP0 Dmem */
++} vied_nci_mem_ID_t;
++
++#define VIED_NCI_N_MEM_ID (VIED_NCI_DMEM1_ID + 1)
++/*
++ * Memory types
++ */
++typedef enum {
++	VIED_NCI_TRANSFER_VMEM0_TYPE_ID = 0,
++	VIED_NCI_LB_VMEM_TYPE_ID,
++	VIED_NCI_DMEM_TYPE_ID,
++	VIED_NCI_VMEM_TYPE_ID,
++	VIED_NCI_BAMEM_TYPE_ID,
++	VIED_NCI_PMEM_TYPE_ID
++} vied_nci_mem_type_ID_t;
++
++#define VIED_NCI_N_MEM_TYPE_ID (VIED_NCI_PMEM_TYPE_ID + 1)
++/******************************************************/
++
++/* Excluding PMEM */
++#define VIED_NCI_N_DATA_MEM_TYPE_ID	 5 /* = MAX(vied_nci_mem_type_ID_t) */
++
++#define VIED_NCI_N_SP_CTRL_MEM		2
++#define VIED_NCI_N_SP_SERVER_MEM	2
++#define VIED_NCI_N_VP_MEM			0
++#define VIED_NCI_N_ACC_PSA_MEM		0
++#define VIED_NCI_N_ACC_ISA_MEM		0
++#define VIED_NCI_N_ACC_OSA_MEM		0
++#define VIED_NCI_N_GDC_MEM			0
++#define VIED_NCI_N_TNR_MEM			0
++
++#define VIED_NCI_N_VP_CELL		0
++#define VIED_NCI_N_ACC_CELL		13
++/******************************************************/
++/*
++ * Device IDs
++ */
++typedef enum {
++	VIED_NCI_DEV_CHN_DMA_EXT0_ID = 0, /*DMA lb*/
++	VIED_NCI_DEV_CHN_DMA_EXT1_READ_ID, /*DMA hbfx*/
++	VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_ID, /*DMA hbtx*/
++	VIED_NCI_DEV_CHN_DMA_ISA_ID,
++} vied_nci_dev_chn_ID_t;
++
++#define VIED_NCI_N_DEV_CHN_ID (VIED_NCI_DEV_CHN_DMA_ISA_ID + 1)
++
++/*
++ * DFM devices
++ */
++typedef enum {
++	VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID = 0,
++	VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID
++} vied_nci_dev_dfm_id_t;
++
++#define VIED_NCI_N_DEV_DFM_ID (VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID + 1)
++
++/*
++ * Link IDs
++ */
++typedef enum {
++	VIED_NCI_LINK_OTF_OFFLINE = 0,
++	VIED_NCI_LINK_OTF_MAIN_OUTPUT,
++	VIED_NCI_LINK_OTF_PDAF_OUTPUT,
++	VIED_NCI_LINK_DATA_BARRIER_0,
++	VIED_NCI_LINK_DATA_BARRIER_1,
++	VIED_NCI_LINK_DATA_BARRIER_2,
++	VIED_NCI_LINK_DATA_BARRIER_3,
++	VIED_NCI_LINK_DATA_BARRIER_4,
++	VIED_NCI_N_LINK_ID
++} vied_nci_link_ID_t;
++
++/*
++ * Psys server local object caches space
++ */
++typedef enum {
++	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_0 = 0,
++	VIED_NCI_PSYS_SERVER_LOCAL_OBJECT_CACHE_1,
++	VIED_NCI_N_PSYS_SERVER_LOCAL_OBJECT_CACHES
++} vied_nci_psys_server_local_object_cache_t;
++
++/******************************************************/
++/*todo verify  for ipu6*/
++/*
++ * Memory size (previously in vied_nci_psys_system.c)
++ * VMEM: in words, 64 Byte per word.
++ * TRANSFER VMEM0: in words, 64 Byte per word
++ * LB VMEM: in words, 64 Byte per word.
++ * DMEM: in words, 4 Byte per word.
++ */
++#define VIED_NCI_TRANSFER_VMEM0_WORD_SIZE     64
++#define VIED_NCI_LB_VMEM_WORD_SIZE     64
++#define VIED_NCI_DMEM_WORD_SIZE      4
++#define VIED_NCI_VMEM_WORD_SIZE     64
++
++/* ISP VMEM  words $HIVECORES/idsp/include/hive/cell_params.h*/
++#define VIED_NCI_TRANSFER_VMEM0_MAX_SIZE	(0x0800) /* Transfer VMEM0 words, ref HAS Transfer*/
++#define VIED_NCI_TRANSFER_VMEM1_MAX_SIZE	(0x0800) /* Transfer VMEM1 words, ref HAS Transfer*/
++#define VIED_NCI_LB_VMEM_MAX_SIZE		(0x0400) /* LB VMEM words */
++#define VIED_NCI_DMEM0_MAX_SIZE			(0x4000)
++#define VIED_NCI_DMEM1_MAX_SIZE			(0x1000)
++
++/*
++ * Number of channels per device
++ */
++/*
++ * NOTE: once FW code will support DMA with one unit
++ * descriptor #channels will be cut but half (36->18).
++*/
++
++/* 3 defines below are inferred from pg/ipu6s_isa/src/ipu6s_isa.manifest.cpp */
++/* plus some orbitrary number - a safety margin */
++
++#define VIED_NCI_DEV_CHN_DMA_EXT0_MAX_SIZE			(22)
++#define VIED_NCI_DEV_CHN_DMA_EXT1_READ_MAX_SIZE		(22)
++#define VIED_NCI_DEV_CHN_DMA_EXT1_WRITE_MAX_SIZE	(22)
++
++#define VIED_NCI_DEV_CHN_DMA_IPFD_MAX_SIZE		(0)
++#define VIED_NCI_DEV_CHN_DMA_ISA_MAX_SIZE		(2)
++
++/*
++ * Number of ports per DFM device
++ */
++#define VIED_NCI_DEV_DFM_ISL_FULL_PORT_ID_MAX_SIZE		(32)
++#define VIED_NCI_DEV_DFM_LB_FULL_PORT_ID_MAX_SIZE		(32)
++#define VIED_NCI_DEV_DFM_ISL_EMPTY_PORT_ID_MAX_SIZE		(32)
++#define VIED_NCI_DEV_DFM_LB_EMPTY_PORT_ID_MAX_SIZE		(32)
++/******************************************************/
++
++/*
++ * Storage of the resource and resource type enumerators
++ */
++#define VIED_NCI_RESOURCE_ID_BITS	8
++typedef uint8_t				vied_nci_resource_id_t;
++
++#define VIED_NCI_RESOURCE_SIZE_BITS	16
++typedef uint16_t			vied_nci_resource_size_t;
++
++#define VIED_NCI_RESOURCE_BITMAP_BITS	32
++typedef uint32_t			vied_nci_resource_bitmap_t;
++
++#define IA_CSS_PROCESS_INVALID_DEPENDENCY	((vied_nci_resource_id_t)(-1))
++#define IA_CSS_PROCESS_INVALID_OFFSET		((vied_nci_resource_size_t)(-1))
++#define IA_CSS_PROCESS_MAX_CELLS		1
++
++#define IA_CSS_MAX_INPUT_DEC_RESOURCES		4
++#define IA_CSS_MAX_OUTPUT_DEC_RESOURCES		4
++/*
++ * Resource specifications
++ * Note that the FAS uses the terminology local/remote memory. In the PSYS API,
++ * these are called internal/external memory.
++ */
++
++/* resource spec for internal (local) memory */
++struct vied_nci_resource_spec_int_mem_s {
++	vied_nci_resource_id_t		type_id;
++	vied_nci_resource_size_t	size;
++	vied_nci_resource_size_t	offset;
++};
++
++typedef struct vied_nci_resource_spec_int_mem_s
++	vied_nci_resource_spec_int_mem_t;
++
++/* resource spec for external (remote) memory */
++struct vied_nci_resource_spec_ext_mem_s {
++	vied_nci_resource_id_t		type_id;
++	vied_nci_resource_size_t	size;
++	vied_nci_resource_size_t	offset;
++};
++
++typedef struct vied_nci_resource_spec_ext_mem_s
++	vied_nci_resource_spec_ext_mem_t;
++
++/* resource spec for device channel */
++struct vied_nci_resource_spec_dev_chn_s {
++	vied_nci_resource_id_t		type_id;
++	vied_nci_resource_size_t	size;
++	vied_nci_resource_size_t	offset;
++};
++
++typedef struct vied_nci_resource_spec_dev_chn_s
++	vied_nci_resource_spec_dev_chn_t;
++
++/* resource spec for DFM port */
++struct vied_nci_resource_spec_dfm_port_s {
++	vied_nci_resource_id_t		type_id;
++	vied_nci_resource_bitmap_t	bitmask;
++};
++
++typedef struct vied_nci_resource_spec_dfm_port_s
++	vied_nci_resource_spec_dfm_port_t;
++
++/* resource spec for all contiguous resources */
++struct vied_nci_resource_spec_s {
++	vied_nci_resource_spec_int_mem_t int_mem[VIED_NCI_N_MEM_TYPE_ID];
++	vied_nci_resource_spec_ext_mem_t ext_mem[VIED_NCI_N_DATA_MEM_TYPE_ID];
++	vied_nci_resource_spec_dev_chn_t dev_chn[VIED_NCI_N_DEV_CHN_ID];
++};
++
++typedef struct vied_nci_resource_spec_s vied_nci_resource_spec_t;
++
++#ifndef PIPE_GENERATION
++
++extern const uint8_t /* vied_nci_cell_type_ID_t */ vied_nci_cell_type[VIED_NCI_N_CELL_ID];
++extern const uint8_t /* vied_nci_mem_type_ID_t */ vied_nci_mem_type[VIED_NCI_N_MEM_ID];
++extern const uint16_t vied_nci_N_cell_mem[VIED_NCI_N_CELL_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_type_ID_t */
++	vied_nci_cell_mem_type[VIED_NCI_N_CELL_TYPE_ID][VIED_NCI_N_MEM_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_ID_t */
++	vied_nci_ext_mem[VIED_NCI_N_MEM_TYPE_ID];
++extern const uint8_t /* vied_nci_mem_ID_t */
++	vied_nci_cell_mem[VIED_NCI_N_CELL_ID][VIED_NCI_N_MEM_TYPE_ID];
++extern const uint16_t vied_nci_mem_size[VIED_NCI_N_MEM_ID];
++extern const uint16_t vied_nci_mem_word_size[VIED_NCI_N_DATA_MEM_TYPE_ID];
++extern const uint16_t vied_nci_dev_chn_size[VIED_NCI_N_DEV_CHN_ID];
++extern const uint16_t vied_nci_dfm_port_size[VIED_NCI_N_DEV_DFM_ID];
++
++STORAGE_CLASS_INLINE
++uint32_t vied_nci_mem_is_ext_type(const vied_nci_mem_type_ID_t mem_type_id)
++{
++	return((mem_type_id == VIED_NCI_TRANSFER_VMEM0_TYPE_ID) ||
++		(mem_type_id == VIED_NCI_LB_VMEM_TYPE_ID));
++}
++
++#endif /* PIPE_GENERATION */
++#endif /* __VIED_NCI_PSYS_RESOURCE_MODEL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
+new file mode 100644
+index 000000000000..d96f3605cb07
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/include/vied_nci_psys_system_global.h
+@@ -0,0 +1,186 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
++#define __VIED_NCI_PSYS_SYSTEM_GLOBAL_H
++
++#include <type_support.h>
++#include "ia_css_base_types.h"
++#include "ia_css_psys_sim_storage_class.h"
++#include "vied_nci_psys_resource_model.h"
++
++/*
++ * Key system types
++ */
++/* Subsystem internal physical address */
++#define VIED_ADDRESS_BITS 32
++
++/* typedef uint32_t vied_address_t; */
++
++/* Subsystem internal virtual address */
++
++/* Subsystem internal data bus */
++#define VIED_DATA_BITS 32
++typedef uint32_t vied_data_t;
++
++#define VIED_NULL ((vied_vaddress_t)0)
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bit_mask(
++	const unsigned					index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_clear(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_empty(
++	const vied_nci_resource_bitmap_t		bitmap);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_set(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bit_set_in_bitmap(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const unsigned int		index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_bitmap_clear(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++int vied_nci_bitmap_compute_weight(
++	const vied_nci_resource_bitmap_t		bitmap);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_union(
++	const vied_nci_resource_bitmap_t		bitmap0,
++	const vied_nci_resource_bitmap_t		bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_intersection(
++	const vied_nci_resource_bitmap_t		bitmap0,
++	const vied_nci_resource_bitmap_t		bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_xor(
++	const vied_nci_resource_bitmap_t		bitmap0,
++	const vied_nci_resource_bitmap_t		bitmap1);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_unique(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const vied_nci_resource_bitmap_t		bit_mask);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitfield_mask(
++		const unsigned int position,
++		const unsigned int size);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bitmap_set_bitfield(
++const vied_nci_resource_bitmap_t		bitmap,
++const unsigned int						index,
++const unsigned int						size);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_bit_mask_set_unique(
++	const vied_nci_resource_bitmap_t		bitmap,
++	const unsigned					index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_cell_bit_mask(
++	const vied_nci_cell_ID_t		cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_resource_bitmap_t vied_nci_barrier_bit_mask(
++	const vied_nci_barrier_ID_t		barrier_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_cell_type_ID_t vied_nci_cell_get_type(
++	const vied_nci_cell_ID_t		cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_ID_t vied_nci_ext_mem_get_id_from_type(
++	const vied_nci_mem_type_ID_t		mem_type);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_mem_get_type(
++	const vied_nci_mem_ID_t			mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_mem_get_size(
++	const vied_nci_mem_ID_t			mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_dev_chn_get_size(
++	const vied_nci_dev_chn_ID_t		dev_chn_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_cell_of_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const vied_nci_cell_type_ID_t	cell_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_mem_of_type(
++	const vied_nci_mem_ID_t			mem_id,
++	const vied_nci_mem_type_ID_t	mem_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_is_cell_mem_of_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index,
++	const vied_nci_mem_type_ID_t	mem_type_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++bool vied_nci_has_cell_mem_of_id(
++	const vied_nci_cell_ID_t		cell_id,
++	const vied_nci_mem_ID_t			mem_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++uint16_t vied_nci_cell_get_mem_count(
++	const vied_nci_cell_ID_t		cell_id);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_cell_get_mem_type(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_ID_t vied_nci_cell_get_mem(
++	const vied_nci_cell_ID_t		cell_id,
++	const uint16_t					mem_index);
++
++IA_CSS_PSYS_SIM_STORAGE_CLASS_H
++vied_nci_mem_type_ID_t vied_nci_cell_type_get_mem_type(
++	const vied_nci_cell_type_ID_t	cell_type_id,
++	const uint16_t					mem_index);
++
++#ifdef __IA_CSS_PSYS_SIM_INLINE__
++#include "psys_system_global_impl.h"
++#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
++
++#endif /* __VIED_NCI_PSYS_SYSTEM_GLOBAL_H */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
+new file mode 100644
+index 000000000000..191f13d8e75e
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_kernel_bitmap.c
+@@ -0,0 +1,151 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_kernel_bitmap.h>
++#include <type_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include "math_support.h"
++#include "ia_css_psys_kernel_trace.h"
++
++#ifndef __IA_CSS_KERNEL_BITMAP_INLINE__
++#include "ia_css_kernel_bitmap_impl.h"
++#endif /* __IA_CSS_KERNEL_BITMAP_INLINE__ */
++
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_set_element_from_uint32(
++	ia_css_kernel_bitmap_t				bitmap,
++	const unsigned int				elem_index,
++	const uint32_t					elem_value)
++{
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_set_element_from_uint32(): enter:\n");
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	COMPILATION_ERROR_IF(sizeof(bitmap.data[elem_index]) != sizeof(elem_value));
++
++	if (elem_index < IA_CSS_KERNEL_BITMAP_NOF_ELEMS) {
++		bitmap.data[elem_index] = elem_value;
++	} else {
++		assert(0);
++	}
++#else
++	COMPILATION_ERROR_IF(IA_CSS_KERNEL_BITMAP_BITS != 64);
++
++	bitmap &= ~((((ia_css_kernel_bitmap_t) 1 << IA_CSS_KERNEL_BITMAP_ELEM_BITS) - 1) <<
++							(elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++	bitmap |= (ia_css_kernel_bitmap_t) elem_value << (elem_index * IA_CSS_KERNEL_BITMAP_ELEM_BITS);
++#endif
++
++	return bitmap;
++}
++
++ia_css_kernel_bitmap_t ia_css_kernel_bitmap_create_from_uint64(
++	const uint64_t value)
++{
++	const unsigned int bits64 = sizeof(uint64_t) * 8;
++	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++	unsigned int i;
++	ia_css_kernel_bitmap_t result;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_create_from_uint64(): enter:\n");
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	result = ia_css_kernel_bitmap_clear();
++	for (i = 0; i < MIN(nof_elems_bits64, IA_CSS_KERNEL_BITMAP_NOF_ELEMS); i++) {
++		/* masking is done implictly, the MSB bits of casting will bel chopped off */
++		result.data[i] = (IA_CSS_KERNEL_BITMAP_ELEM_TYPE)
++			(value >> (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++	}
++
++#if IA_CSS_KERNEL_BITMAP_BITS < 64
++	if ((value >> IA_CSS_KERNEL_BITMAP_BITS) != 0) {
++		IA_CSS_TRACE_0(PSYSAPI_KERNEL, ERROR,
++			"ia_css_kernel_bitmap_create_from_uint64(): "
++			"kernel bitmap is not wide enough to encode value\n");
++		assert(0);
++	}
++#endif
++#else
++	NOT_USED(i);
++	NOT_USED(nof_elems_bits64);
++	result = value;
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++	return result;
++}
++
++uint64_t ia_css_kernel_bitmap_to_uint64(
++	const ia_css_kernel_bitmap_t value)
++{
++	const unsigned int bits64 = sizeof(uint64_t) * 8;
++	const unsigned int nof_elems_bits64 = bits64 / IA_CSS_KERNEL_BITMAP_ELEM_BITS;
++	unsigned int i;
++	uint64_t res = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, VERBOSE,
++		"ia_css_kernel_bitmap_to_uint64(): enter:\n");
++
++	assert((bits64 % IA_CSS_KERNEL_BITMAP_ELEM_BITS) == 0);
++	assert(nof_elems_bits64 > 0);
++
++#ifndef IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS
++	for (i = 0; i < MIN(IA_CSS_KERNEL_BITMAP_ELEM_BITS, nof_elems_bits64); i++) {
++		res |= ((uint64_t)(value.data[i]) << (i * IA_CSS_KERNEL_BITMAP_ELEM_BITS));
++	}
++	for (; i < IA_CSS_KERNEL_BITMAP_NOF_ELEMS; i++) {
++		assert(value.data[i] == 0);
++	}
++	return res;
++#else
++	(void)i;
++	(void)res;
++	(void)nof_elems_bits64;
++	return (uint64_t)value;
++#endif /* IA_CSS_KERNEL_BITMAP_DO_NOT_USE_ELEMS */
++}
++
++int ia_css_kernel_bitmap_print(
++	const ia_css_kernel_bitmap_t			bitmap,
++	void						*fid)
++{
++	int retval = -1;
++	int bit;
++	unsigned int bit_index = 0;
++	ia_css_kernel_bitmap_t loc_bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO,
++		"ia_css_kernel_bitmap_print(): enter:\n");
++
++	NOT_USED(fid);
++	NOT_USED(bit);
++
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "kernel bitmap {\n");
++
++	loc_bitmap = bitmap;
++
++	for (bit_index = 0; (bit_index < IA_CSS_KERNEL_BITMAP_BITS) &&
++		!ia_css_is_kernel_bitmap_empty(loc_bitmap); bit_index++) {
++
++		bit = ia_css_is_kernel_bitmap_set(loc_bitmap, 0);
++		loc_bitmap = ia_css_kernel_bitmap_shift(loc_bitmap);
++		IA_CSS_TRACE_2(PSYSAPI_KERNEL, INFO, "\t%d\t = %d\n", bit_index, bit);
++	}
++	IA_CSS_TRACE_0(PSYSAPI_KERNEL, INFO, "}\n");
++
++	retval = 0;
++	return retval;
++}
++
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
+new file mode 100644
+index 000000000000..62369e7d8308
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_data.c
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_data_storage_class.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifdef __IA_CSS_PSYS_DATA_INLINE__
++STORAGE_CLASS_INLINE int
++__ia_css_program_group_data_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __IA_CSS_PSYS_DATA_INLINE__ */
++#include "ia_css_program_group_data_impl.h"
++#endif /* __IA_CSS_PSYS_DATA_INLINE__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
+new file mode 100644
+index 000000000000..24802a648bb8
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_program_group_param.c
+@@ -0,0 +1,769 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_program_group_param.h>
++#include <ia_css_program_group_param_private.h>
++#include <ia_css_psys_manifest_types.h>
++#include <ia_css_psys_program_group_manifest.h>
++#include <ia_css_psysapi_fw_version.h>
++#include <error_support.h>
++#include <misc_support.h>
++#include <assert_support.h>
++#include <type_support.h>
++#include <print_support.h>
++
++#include "ia_css_psys_param_trace.h"
++
++static int
++ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
++			   uint32_t offset,
++			   enum ia_css_frame_format_type frame_format_type);
++
++static int
++ia_css_program_param_init(ia_css_program_param_t *program_param,
++				int32_t offset);
++
++size_t ia_css_sizeof_program_group_param(
++	const uint8_t program_count,
++	const uint8_t terminal_count,
++	const uint16_t fragment_count)
++{
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_sizeof_program_group_param(): enter:\n");
++
++	verifexit(program_count != 0);
++	verifexit(terminal_count != 0);
++	verifexit(fragment_count != 0);
++
++	size += sizeof(ia_css_program_group_param_t);
++	size += program_count * fragment_count * sizeof(ia_css_program_param_t);
++	size += terminal_count * sizeof(ia_css_terminal_param_t);
++EXIT:
++	if (0 == program_count || 0 == terminal_count || 0 == fragment_count) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_sizeof_program_group_param invalid argument\n");
++	}
++	return size;
++}
++
++size_t ia_css_program_group_param_get_size(
++	const ia_css_program_group_param_t		*program_group_param)
++{
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		       "ia_css_program_group_param_get_size(): enter:\n");
++
++	if (program_group_param != NULL) {
++		size = program_group_param->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++		      "ia_css_program_group_param_get_size invalid argument\n");
++	}
++	return size;
++}
++
++size_t ia_css_program_param_get_size(
++	const ia_css_program_param_t			*param)
++{
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		       "ia_css_program_param_get_size(): enter:\n");
++
++	if (param != NULL) {
++		size = param->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_param_get_size invalid argument\n");
++	}
++	return size;
++}
++
++ia_css_program_param_t *ia_css_program_group_param_get_program_param(
++	const ia_css_program_group_param_t *param,
++	const int i)
++{
++	ia_css_program_param_t	*program_param = NULL;
++	ia_css_program_param_t	*program_param_base;
++	int program_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_program_group_param_get_program_param(): enter:\n");
++
++	verifexit(param != NULL);
++
++	program_count =
++		(int)ia_css_program_group_param_get_program_count(param);
++
++	verifexit(i < program_count);
++
++	program_param_base = (ia_css_program_param_t *)
++			(((char *)param) + param->program_param_offset);
++
++	program_param = &program_param_base[i];
++
++EXIT:
++	if (NULL == param || i >= program_count) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_program_param invalid argument\n");
++	}
++	return program_param;
++}
++
++size_t ia_css_terminal_param_get_size(
++	const ia_css_terminal_param_t			*param)
++{
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_get_size(): enter:\n");
++
++	if (param != NULL) {
++		size = param->size;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_terminal_param_get_size invalid argument\n");
++	}
++
++	return size;
++}
++
++ia_css_terminal_param_t *ia_css_program_group_param_get_terminal_param(
++	const ia_css_program_group_param_t		*param,
++	const int		i)
++{
++	ia_css_terminal_param_t	*terminal_param = NULL;
++	ia_css_terminal_param_t	*terminal_param_base;
++	int program_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_program_group_param_get_terminal_param(): enter:\n");
++
++	verifexit(param != NULL);
++
++	program_count =
++		(int)ia_css_program_group_param_get_terminal_count(param);
++
++	verifexit(i < program_count);
++
++	terminal_param_base = (ia_css_terminal_param_t *)
++			(((char *)param) + param->terminal_param_offset);
++	terminal_param = &terminal_param_base[i];
++EXIT:
++	if (NULL == param || i >= program_count) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_terminal_param invalid argument\n");
++	}
++	return terminal_param;
++}
++
++uint8_t ia_css_program_group_param_get_program_count(
++	const ia_css_program_group_param_t		*param)
++{
++	uint8_t	program_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_program_group_param_get_program_count(): enter:\n");
++
++	if (param != NULL) {
++		program_count = param->program_count;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_program_count invalid argument\n");
++	}
++	return program_count;
++}
++
++uint8_t ia_css_program_group_param_get_terminal_count(
++	const ia_css_program_group_param_t		*param)
++{
++	uint8_t	terminal_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_program_group_param_get_terminal_count(): enter:\n");
++
++	if (param != NULL) {
++		terminal_count = param->terminal_count;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_terminal_count invalid argument\n");
++	}
++	return terminal_count;
++}
++
++uint16_t ia_css_program_group_param_get_fragment_count(
++	const ia_css_program_group_param_t		*param)
++{
++	uint8_t	fragment_count = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_program_group_param_get_fragment_count(): enter:\n");
++
++	if (param != NULL) {
++		fragment_count = (uint8_t)param->fragment_count;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_fragment_count invalid argument\n");
++	}
++	return fragment_count;
++}
++
++int ia_css_program_group_param_set_protocol_version(
++	ia_css_program_group_param_t *param,
++	uint8_t protocol_version)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++	     "ia_css_program_group_param_set_protocol_version(): enter:\n");
++
++	if (param != NULL) {
++		param->protocol_version = protocol_version;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_program_group_param_set_protocol_version failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++uint8_t ia_css_program_group_param_get_protocol_version(
++	const ia_css_program_group_param_t *param)
++{
++	uint8_t protocol_version = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++	     "ia_css_program_group_param_get_protocol_version(): enter:\n");
++
++	if (param != NULL) {
++		protocol_version = param->protocol_version;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_protocol_version invalid argument\n");
++	}
++	return protocol_version;
++}
++
++int ia_css_program_group_param_set_kernel_enable_bitmap(
++	ia_css_program_group_param_t	*param,
++	const ia_css_kernel_bitmap_t	bitmap)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++	     "ia_css_program_group_param_set_kernel_enable_bitmap(): enter:\n");
++
++	if (param != NULL) {
++		param->kernel_enable_bitmap = bitmap;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_program_group_param_set_kernel_enable_bitmap failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++ia_css_kernel_bitmap_t ia_css_program_group_param_get_kernel_enable_bitmap(
++	const ia_css_program_group_param_t		*param)
++{
++	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++	     "ia_css_program_group_param_get_kernel_enable_bitmap(): enter:\n");
++
++	if (param != NULL) {
++		bitmap = param->kernel_enable_bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_group_param_get_kernel_enable_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++int ia_css_program_param_set_kernel_enable_bitmap(
++	ia_css_program_param_t		*program_param,
++	const ia_css_kernel_bitmap_t	bitmap)
++{
++	assert(0);
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++		"ia_css_program_param_set_kernel_enable_bitmap(): deprecated API function:\n");
++
++	if (program_param != NULL) {
++		program_param->kernel_enable_bitmap = bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++			"ia_css_program_param_set_kernel_enable_bitmap failed\n");
++	}
++	return -1;
++}
++
++ia_css_kernel_bitmap_t ia_css_program_param_get_kernel_enable_bitmap(
++	const ia_css_program_param_t	*program_param)
++{
++	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
++	char *base;
++
++	assert(0);
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, ERROR,
++		"ia_css_program_param_get_kernel_enable_bitmap():  deprecated API function:\n");
++
++	verifexit(program_param != NULL);
++	verifexit(program_param->parent_offset != 0);
++
++	base = (char *)((char *)program_param + program_param->parent_offset);
++	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
++EXIT:
++	if (NULL == program_param || 0 == program_param->parent_offset)	{
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_program_param_get_kernel_enable_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++ia_css_kernel_bitmap_t ia_css_terminal_param_get_kernel_enable_bitmap(
++	const ia_css_terminal_param_t			*param)
++{
++	ia_css_kernel_bitmap_t	bitmap = ia_css_kernel_bitmap_clear();
++	char *base;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_get_kernel_enable_bitmap(): enter:\n");
++
++	verifexit(param != NULL);
++	verifexit(param->parent_offset != 0);
++
++	base = (char *)((char *)param + param->parent_offset);
++	bitmap = ((ia_css_program_group_param_t *)base)->kernel_enable_bitmap;
++EXIT:
++	if (NULL == param || 0 == param->parent_offset) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_terminal_param_get_kernel_enable_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++ia_css_frame_format_type_t ia_css_terminal_param_get_frame_format_type(
++	const ia_css_terminal_param_t	*param)
++{
++	ia_css_frame_format_type_t ft = IA_CSS_N_FRAME_FORMAT_TYPES;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_get_frame_format_type(): enter:\n");
++
++	verifexit(param != NULL);
++
++	ft = param->frame_format_type;
++EXIT:
++	if (NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_terminal_param_get_frame_format_type invalid argument\n");
++	}
++	return ft;
++}
++
++int ia_css_terminal_param_set_frame_format_type(
++	ia_css_terminal_param_t		*param,
++	const ia_css_frame_format_type_t	data_format_type)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_set_frame_format_type(): enter:\n");
++
++	if (param != NULL) {
++		param->frame_format_type = data_format_type;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_terminal_param_set_frame_format_type failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++uint8_t ia_css_terminal_param_get_bpp(
++	const ia_css_terminal_param_t	*param)
++{
++	uint8_t bpp = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		       "ia_css_terminal_param_get_bpp(): enter:\n");
++
++	verifexit(param != NULL);
++
++	bpp = param->bpp;
++
++EXIT:
++	if (NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_terminal_param_get_bpp invalid argument\n");
++	}
++	return bpp;
++}
++
++int ia_css_terminal_param_set_bpp(
++	ia_css_terminal_param_t	*param,
++	const uint8_t bpp)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		       "ia_css_terminal_param_set_bpp(): enter:\n");
++
++	if (param != NULL) {
++		param->bpp = bpp;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_terminal_param_set_bpp failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_terminal_param_get_dimensions(
++	const ia_css_terminal_param_t	*param,
++	uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_get_dimensions(): enter:\n");
++
++	if (param != NULL) {
++		dimensions[IA_CSS_COL_DIMENSION] =
++			param->dimensions[IA_CSS_COL_DIMENSION];
++		dimensions[IA_CSS_ROW_DIMENSION] =
++			param->dimensions[IA_CSS_ROW_DIMENSION];
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++		  "ia_css_terminal_param_get_dimensions failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_terminal_param_set_dimensions(
++	ia_css_terminal_param_t	*param,
++	const uint16_t dimensions[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		"ia_css_terminal_param_set_dimensions(): enter:\n");
++
++	if (param != NULL) {
++		param->dimensions[IA_CSS_COL_DIMENSION] =
++				dimensions[IA_CSS_COL_DIMENSION];
++		param->dimensions[IA_CSS_ROW_DIMENSION] =
++				dimensions[IA_CSS_ROW_DIMENSION];
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++		  "ia_css_terminal_param_set_dimensions failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_terminal_param_set_stride(
++	ia_css_terminal_param_t		*param,
++	const uint32_t stride)
++{
++	int retval = -1;
++
++	verifexit(param != NULL);
++	param->stride = stride;
++	retval = 0;
++
++EXIT:
++	return retval;
++}
++
++uint32_t ia_css_terminal_param_get_stride(
++	const ia_css_terminal_param_t	*param)
++{
++	uint32_t stride = 0;
++
++	verifexit(param != NULL);
++	stride = param->stride;
++
++EXIT:
++	return stride;
++}
++
++static int ia_css_program_param_init(
++		ia_css_program_param_t *program_param,
++		int32_t offset)
++{
++	int retval = -1;
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROGRAM_PARAM_STRUCT_IN_BITS !=
++				(CHAR_BIT * sizeof(ia_css_program_param_t)));
++	verifexit(program_param != NULL);
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		"ia_css_program_param_init(): enter:\n");
++
++	program_param->size = sizeof(ia_css_program_param_t);
++	/* parent is at negative offset from current program.*/
++	program_param->parent_offset = -offset;
++	/*TODO: Kernel_bitmap setting. ?*/
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_program_param_init failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++static int
++ia_css_terminal_param_init(ia_css_terminal_param_t *terminal_param,
++			uint32_t offset,
++			enum ia_css_frame_format_type frame_format_type)
++{
++	int retval = -1;
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_TERMINAL_PARAM_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_terminal_param_t)));
++	verifexit(terminal_param != NULL);
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		"ia_css_terminal_param_init(): enter:\n");
++
++	terminal_param->size = sizeof(ia_css_terminal_param_t);
++	/* parent is at negative offset from current program.*/
++	terminal_param->parent_offset = -((int32_t)offset);
++	/*TODO: Kernel_bitmap setting. ?*/
++	terminal_param->frame_format_type = frame_format_type;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_terminal_param_init failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++ia_css_program_group_param_t *
++ia_css_terminal_param_get_parent(
++	const ia_css_terminal_param_t			*param)
++{
++	ia_css_program_group_param_t *parent = NULL;
++	char *base;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, VERBOSE,
++		       "ia_css_terminal_param_get_parent(): enter:\n");
++
++	verifexit(NULL != param);
++
++	base = (char *)((char *)param + param->parent_offset);
++
++	parent = (ia_css_program_group_param_t *)(base);
++EXIT:
++	if (NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_PARAM, WARNING,
++			"ia_css_terminal_param_get_parent invalid argument\n");
++	}
++	return parent;
++}
++
++int ia_css_program_group_param_init(
++	ia_css_program_group_param_t *blob,
++	const uint8_t	program_count,
++	const uint8_t	terminal_count,
++	const uint16_t	fragment_count,
++	const enum ia_css_frame_format_type *frame_format_types)
++{
++	int i = 0;
++	char *param_base;
++	uint32_t offset;
++	int  retval = -1;
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROGRAM_GROUP_PARAM_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_program_group_param_t)));
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		"ia_css_program_group_param_init(): enter:\n");
++
++	assert(blob != 0);
++
++	verifexit(blob != NULL);
++	verifexit(frame_format_types != NULL);
++
++	blob->program_count = program_count;
++	blob->fragment_count = fragment_count;
++	blob->terminal_count = terminal_count;
++	blob->program_param_offset = sizeof(ia_css_program_group_param_t);
++	blob->terminal_param_offset = blob->program_param_offset +
++				sizeof(ia_css_program_param_t) * program_count;
++
++	param_base = (char *)((char *)blob + blob->program_param_offset);
++	offset = blob->program_param_offset;
++
++	for (i = 0; i < program_count; i++) {
++		ia_css_program_param_init(
++			(ia_css_program_param_t *)param_base, offset);
++		offset += sizeof(ia_css_program_param_t);
++		param_base += sizeof(ia_css_program_param_t);
++	}
++
++	param_base = (char *)((char *)blob + blob->terminal_param_offset);
++	offset = blob->terminal_param_offset;
++
++	for (i = 0; i < terminal_count; i++) {
++		ia_css_terminal_param_init(
++			(ia_css_terminal_param_t *)param_base,
++			offset,
++			frame_format_types[i]);
++
++		offset += sizeof(ia_css_terminal_param_t);
++		param_base += sizeof(ia_css_terminal_param_t);
++	}
++
++	/*
++	 * For now, set legacy flow by default. This can be removed as soon
++	 * as all hosts/drivers explicitly set the protocol version.
++	 */
++	blob->protocol_version = IA_CSS_PROCESS_GROUP_PROTOCOL_LEGACY;
++
++	blob->size = (uint32_t)ia_css_sizeof_program_group_param(program_count,
++								terminal_count,
++								fragment_count);
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++		       "ia_css_program_group_param_init failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_program_group_param_print(
++	const ia_css_program_group_param_t		*param,
++	void						*fid)
++{
++	int	retval = -1;
++	int		i;
++	uint8_t	program_count, terminal_count;
++	ia_css_kernel_bitmap_t	bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		       "ia_css_program_group_param_print(): enter:\n");
++
++	verifexit(param != NULL);
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++		"sizeof(program_group_param) = %d\n",
++		(int)ia_css_program_group_param_get_size(param));
++
++	program_count = ia_css_program_group_param_get_program_count(param);
++	terminal_count = ia_css_program_group_param_get_terminal_count(param);
++
++	bitmap = ia_css_program_group_param_get_kernel_enable_bitmap(param);
++	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++		"%d program params\n", (int)program_count);
++	for (i = 0; i < (int)program_count; i++) {
++		ia_css_program_param_t *program_param =
++			ia_css_program_group_param_get_program_param(param, i);
++
++		retval = ia_css_program_param_print(program_param, fid);
++		verifjmpexit(retval == 0);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "%d terminal params\n",
++		       (int)terminal_count);
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_param_t	*terminal_param =
++			ia_css_program_group_param_get_terminal_param(param, i);
++
++		retval = ia_css_terminal_param_print(terminal_param, fid);
++		verifjmpexit(retval == 0);
++	}
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++		      "ia_css_program_group_param_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_terminal_param_print(
++	const ia_css_terminal_param_t			*param,
++	void						*fid)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		"ia_css_terminal_param_print(): enter:\n");
++
++	verifexit(param != NULL);
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++		"sizeof(terminal_param) = %d\n",
++		(int)ia_css_terminal_param_get_size(param));
++
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO,
++		"\tframe_format_type = %d\n", param->frame_format_type);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_terminal_param_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_program_param_print(
++	const ia_css_program_param_t			*param,
++	void						*fid)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_PARAM, INFO,
++		"ia_css_program_param_print(): enter:\n");
++
++	verifexit(param != NULL);
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_1(PSYSAPI_PARAM, INFO, "sizeof(program_param) = %d\n",
++		       (int)ia_css_program_param_get_size(param));
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_PARAM, ERROR,
++			"ia_css_program_param_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
+new file mode 100644
+index 000000000000..a05e1075a48f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process.c
+@@ -0,0 +1,1038 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_process_private_types.h"
++#include "ia_css_program_group_param_private.h"
++#include "math_support.h"
++
++/* *****************************************************
++ * Functions to possibly inline
++ * ******************************************************/
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/* *****************************************************
++ * Functions not to inline and not available to firmware
++ * ******************************************************/
++#if !defined(__HIVECC)
++STORAGE_CLASS_INLINE bool  ia_css_program_manifest_process_requires_extension(
++    const ia_css_program_manifest_t            *manifest)
++{
++    int i;
++    bool requires_extension = false;
++
++    verifexit(manifest != NULL);
++
++    for (i = 0; i < VIED_NCI_N_DATA_MEM_TYPE_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_ext_mem_size(manifest, i) != 0);
++    }
++
++#if HAS_DFM
++    for (i = 0; i < VIED_NCI_N_DEV_CHN_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_dev_chn_size(manifest, i) != 0);
++    }
++    for (i = 0; i < VIED_NCI_N_DEV_DFM_ID; i++) {
++        requires_extension |=
++            (ia_css_program_manifest_get_dfm_port_bitmap(manifest, i) != 0);
++        requires_extension |=
++            (ia_css_program_manifest_get_dfm_active_port_bitmap(manifest, i) != 0);
++    }
++#endif /* HAS_DFM */
++EXIT:
++    return requires_extension;
++}
++
++size_t ia_css_sizeof_process(
++    const ia_css_program_manifest_t            *manifest,
++    const ia_css_program_param_t            *param)
++{
++    size_t    size = 0;
++
++    uint8_t    program_dependency_count;
++    uint8_t terminal_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_sizeof_process(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    size += sizeof(ia_css_process_t);
++
++    if (ia_css_program_manifest_process_requires_extension(manifest)) {
++        /* align start of extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        size += sizeof(ia_css_process_ext_t);
++    }
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++
++    size += program_dependency_count*sizeof(vied_nci_resource_id_t);
++    size += terminal_dependency_count*sizeof(vied_nci_resource_id_t);
++
++    /* align whole structure to 32 bit */
++    size = CEIL_MUL(size, sizeof(uint32_t));
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_sizeof_process invalid argument\n");
++    }
++    return size;
++}
++
++ia_css_process_t *ia_css_process_create(
++    void                    *raw_mem,
++    const ia_css_program_manifest_t        *manifest,
++    const ia_css_program_param_t        *param,
++    const uint32_t                program_idx)
++{
++    int retval = -1, size = 0;
++    ia_css_process_t *process = NULL;
++    bool create_extension;
++
++    uint8_t    program_dependency_count;
++    uint8_t    terminal_dependency_count;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_create(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++    verifexit(raw_mem != NULL);
++
++    process = (ia_css_process_t *)raw_mem;;
++    verifexit(process != NULL);
++    create_extension = ia_css_program_manifest_process_requires_extension(manifest);
++
++    process->state = IA_CSS_PROCESS_CREATED;
++
++    program_dependency_count =
++        ia_css_program_manifest_get_program_dependency_count(manifest);
++    terminal_dependency_count =
++        ia_css_program_manifest_get_terminal_dependency_count(manifest);
++
++    /* A process requires at least one input or output */
++    verifexit((program_dependency_count +
++           terminal_dependency_count) != 0);
++
++    size += sizeof(ia_css_process_t);
++
++    if (create_extension == true) {
++        /* align start of extension to 32 bit */
++        size = CEIL_MUL(size, sizeof(uint32_t));
++        process->process_extension_offset = (uint8_t)size;
++        size += sizeof(ia_css_process_ext_t);
++    } else {
++        process->process_extension_offset = 0;
++    }
++    if (program_dependency_count != 0) {
++        process->cell_dependencies_offset = (uint8_t)size;
++        size += program_dependency_count * sizeof(vied_nci_resource_id_t);
++    } else {
++        process->cell_dependencies_offset = 0;
++    }
++    if (terminal_dependency_count != 0) {
++        process->terminal_dependencies_offset = (uint8_t)size;;
++        size += terminal_dependency_count * sizeof(uint8_t);
++    } else {
++        process->terminal_dependencies_offset = 0;
++    }
++
++    /* align whole structure to 32 bit */
++    size = CEIL_MUL(size, sizeof(uint32_t));
++
++    process->size = (uint8_t)ia_css_sizeof_process(manifest, param);
++    assert((size_t)size == process->size);
++    /* The following assert also implies that:
++     * process->terminal_dependencies_offset,
++     * process->cell_dependencies_offset,
++     * process->process_extension_offset,
++     * are <= UINT8_MAX
++     */
++    assert(size <= UINT8_MAX);
++
++    process->ID = ia_css_program_manifest_get_program_ID(manifest);
++    verifexit(process->ID != 0);
++    assert(program_idx <= UINT8_MAX);
++    process->program_idx = program_idx;
++
++    process->cell_dependency_count = program_dependency_count;
++    process->terminal_dependency_count = terminal_dependency_count;
++
++    process->parent_offset = 0;
++    verifexit(ia_css_process_clear_all(process) == 0);
++
++    process->state = IA_CSS_PROCESS_READY;
++    retval = 0;
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_create(): Created successfully process 0x%lx ID 0x%x\n",
++        (unsigned long int)process, process->ID);
++
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_create invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_create failed (%i)\n", retval);
++        process = ia_css_process_destroy(process);
++    }
++    return process;
++}
++
++ia_css_process_t *ia_css_process_destroy(
++    ia_css_process_t *process)
++{
++
++    return process;
++}
++
++int ia_css_process_set_cell(
++    ia_css_process_t                    *process,
++    const vied_nci_cell_ID_t                cell_id)
++{
++    int    retval = -1;
++    vied_nci_resource_bitmap_t        bit_mask;
++    vied_nci_resource_bitmap_t        resource_bitmap;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_cell(): enter:\n");
++
++    verifexit(process != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++/* Some programs are mapped on a fixed cell,
++ * when the process group is created
++ */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
++        /* If the process group has already been created, but no VP cell
++         * has been assigned to this process (i.e. not fixed in
++         * manifest), then we need to set the cell of this process
++         * while its parent state is READY (the ready state is set at
++         * the end of ia_css_process_group_create)
++         */
++        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++/* Some programs are mapped on a fixed cell, thus check is not secure,
++ * but it will detect a preset, the process manager will do the secure check
++ */
++    verifexit(ia_css_process_get_cell(process) ==
++          VIED_NCI_N_CELL_ID);
++
++    bit_mask = vied_nci_cell_bit_mask(cell_id);
++    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
++
++    verifexit(bit_mask != 0);
++    verifexit(vied_nci_is_bitmap_clear(bit_mask, resource_bitmap));
++
++    ia_css_process_cells_clear(process);
++    ia_css_process_cells_set_cell(process, 0, cell_id);
++
++    resource_bitmap = vied_nci_bitmap_set(resource_bitmap, bit_mask);
++
++    retval = ia_css_process_group_set_resource_bitmap(
++            parent, resource_bitmap);
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_cell invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_cell failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_clear_cell(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++    vied_nci_cell_ID_t                cell_id;
++    ia_css_process_group_t            *parent;
++    vied_nci_resource_bitmap_t        resource_bitmap;
++    vied_nci_resource_bitmap_t        bit_mask;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_cell(): enter:\n");
++    verifexit(process != NULL);
++
++    cell_id = ia_css_process_get_cell(process);
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
++           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    bit_mask = vied_nci_cell_bit_mask(cell_id);
++    resource_bitmap = ia_css_process_group_get_resource_bitmap(parent);
++
++    verifexit(bit_mask != 0);
++    verifexit(vied_nci_is_bitmap_set(bit_mask, resource_bitmap));
++
++    ia_css_process_cells_clear(process);
++
++    resource_bitmap = vied_nci_bitmap_clear(resource_bitmap, bit_mask);
++
++    retval = ia_css_process_group_set_resource_bitmap(
++            parent, resource_bitmap);
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_cell invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_cell failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_int_mem(
++    ia_css_process_t                *process,
++    const vied_nci_mem_type_ID_t            mem_type_id,
++    const vied_nci_resource_size_t            offset)
++{
++    (void)process;
++    (void)mem_type_id;
++    (void)offset;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++        "ia_css_process_set_int_mem should not be called"
++        "(internally memory feature not used).\n");
++    return 0;
++}
++
++int ia_css_process_clear_int_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type_id)
++{
++    (void)process;
++    (void)mem_type_id;
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++        "ia_css_process_clear_int_mem should not be called"
++        "(internally memory feature not used).\n");
++    return 0;
++}
++
++int ia_css_process_set_ext_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_ID_t mem_id,
++    const vied_nci_resource_size_t offset)
++{
++    int    retval = -1;
++    ia_css_process_group_t    *parent;
++    vied_nci_cell_ID_t    cell_id;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t    state;
++    vied_nci_mem_type_ID_t mem_type_id;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_ext_mem(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    cell_id = ia_css_process_get_cell(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    /* Check that the memory actually exists, "vied_nci_has_cell_mem_of_id()"
++    * will return false on error
++    */
++
++    mem_type_id = vied_nci_mem_get_type(mem_id);
++#ifdef HAS_PMEM
++    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id) &&
++        (mem_type_id != VIED_NCI_PMEM_TYPE_ID))
++        || vied_nci_mem_is_ext_type(mem_type_id)) &&
++        (mem_id < VIED_NCI_N_MEM_ID)) {
++
++        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++        process_ext->ext_mem_id[mem_type_id] = mem_id;
++        process_ext->ext_mem_offset[mem_type_id] = offset;
++        retval = 0;
++    }
++#else /* not HAS_PMEM */
++    if (((!vied_nci_has_cell_mem_of_id(cell_id, mem_id))
++            || vied_nci_mem_is_ext_type(mem_type_id)) &&
++            (mem_id < VIED_NCI_N_MEM_ID)) {
++
++        verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++        process_ext->ext_mem_id[mem_type_id] = mem_id;
++        process_ext->ext_mem_offset[mem_type_id] = offset;
++        retval = 0;
++    }
++#endif /* HAS_PMEM */
++
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_ext_mem invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_ext_mem failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_clear_ext_mem(
++    ia_css_process_t *process,
++    const vied_nci_mem_type_ID_t mem_type_id)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_ext_mem(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++
++    process_ext->ext_mem_id[mem_type_id] = VIED_NCI_N_MEM_ID;
++    process_ext->ext_mem_offset[mem_type_id] = IA_CSS_PROCESS_INVALID_OFFSET;
++
++    retval = 0;
++EXIT:
++    if (NULL == process || mem_type_id >= VIED_NCI_N_DATA_MEM_TYPE_ID) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_ext_mem invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_ext_mem failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_cells_bitmap(
++    ia_css_process_t *process,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    int array_index = 0;
++    int bit_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_cells_bitmap(): enter:\n");
++
++    verifexit(process != NULL);
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_CREATED) ||
++        (parent_state == IA_CSS_PROCESS_GROUP_READY)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
++        if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
++            verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
++            ia_css_process_cells_set_cell(process,
++                array_index, (vied_nci_cell_ID_t)bit_index);
++            array_index++;
++        }
++    }
++    for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
++        ia_css_process_cells_set_cell(process,
++            array_index, VIED_NCI_N_CELL_ID);
++    }
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_cells_bitmap invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_cells_bitmap failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++int ia_css_process_set_dev_chn(
++    ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id,
++    const vied_nci_resource_size_t offset)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dev_chn(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
++    process_ext = ia_css_process_get_extension(process);
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    process_ext->dev_chn_offset[dev_chn_id] = offset;
++
++    retval = 0;
++EXIT:
++    if (NULL == process || dev_chn_id >= VIED_NCI_N_DEV_CHN_ID) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_dev_chn invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                    "ia_css_process_set_dev_chn invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_process_clear_dev_chn(
++    ia_css_process_t *process,
++    const vied_nci_dev_chn_ID_t dev_chn_id)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_dev_chn(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL) {
++        return 0;
++    }
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++
++    parent_state = ia_css_process_group_get_state(parent);
++    state = ia_css_process_get_state(process);
++
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED)
++           || (parent_state == IA_CSS_PROCESS_GROUP_STARTED)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    verifexit(dev_chn_id <= VIED_NCI_N_DEV_CHN_ID);
++
++    process_ext->dev_chn_offset[dev_chn_id] = IA_CSS_PROCESS_INVALID_OFFSET;
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++             "ia_css_process_clear_dev_chn invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_dev_chn failed (%i)\n", retval);
++    }
++    return retval;
++}
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++
++#if HAS_DFM
++int ia_css_process_set_dfm_port_bitmap(
++    ia_css_process_t                 *process,
++    const vied_nci_dev_dfm_id_t      dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dfm_port(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++
++    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
++    process_ext->dfm_port_bitmap[dfm_dev_id] = bitmap;
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_dfm_port invalid argument\n");
++    }
++    return retval;
++}
++
++int ia_css_process_set_dfm_active_port_bitmap(
++    ia_css_process_t                 *process,
++    const vied_nci_dev_dfm_id_t      dfm_dev_id,
++    const vied_nci_resource_bitmap_t bitmap)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_dfm_active_port_bitmap(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++    if (process_ext == NULL && bitmap == 0) {
++        return 0;
++    }
++    verifexit(process_ext != NULL);
++
++    parent = ia_css_process_get_parent(process);
++    verifexit(parent != NULL);
++    state = ia_css_process_get_state(process);
++
++    parent_state = ia_css_process_group_get_state(parent);
++
++    /* TODO : separate process group start and run from
++    *      process_group_exec_cmd()
++    */
++    verifexit(((parent_state == IA_CSS_PROCESS_GROUP_BLOCKED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_STARTED) ||
++           (parent_state == IA_CSS_PROCESS_GROUP_RUNNING)));
++    verifexit(state == IA_CSS_PROCESS_READY || state == IA_CSS_PROCESS_STOPPED);
++    verifexit(dfm_dev_id <= VIED_NCI_N_DEV_DFM_ID);
++    process_ext->dfm_active_port_bitmap[dfm_dev_id] = bitmap;
++    retval = 0;
++EXIT:
++    if (retval != 0) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_dfm_active_port_bitmap invalid argument\n");
++    }
++    return retval;
++}
++#endif /* HAS_DFM */
++
++int ia_css_process_clear_all(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++    ia_css_process_group_t            *parent;
++    ia_css_process_group_state_t    parent_state;
++    ia_css_process_state_t            state;
++    ia_css_process_ext_t *process_ext;
++    int    mem_index;
++    int    dev_chn_index;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_clear_all(): enter:\n");
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++
++    state = ia_css_process_get_state(process);
++
++    parent = ia_css_process_get_parent(process);
++    if (parent != NULL) {
++        parent_state = ia_css_process_group_get_state(parent);
++    } else {
++        parent_state = IA_CSS_N_PROCESS_GROUP_STATES;
++    }
++
++/* Resource clear can only be called in excluded states contrary to set */
++    verifexit((parent_state != IA_CSS_PROCESS_GROUP_RUNNING) ||
++           (parent_state == IA_CSS_N_PROCESS_GROUP_STATES));
++    verifexit((state == IA_CSS_PROCESS_CREATED) ||
++          (state == IA_CSS_PROCESS_READY));
++
++#if VIED_NCI_N_DEV_CHN_ID > 0
++    if (process_ext != NULL) {
++        for (dev_chn_index = 0; dev_chn_index < VIED_NCI_N_DEV_CHN_ID;
++            dev_chn_index++) {
++            process_ext->dev_chn_offset[dev_chn_index] =
++                IA_CSS_PROCESS_INVALID_OFFSET;
++        }
++    }
++#else
++    NOT_USED(dev_chn_index);
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++    if (process_ext != NULL) {
++        /* No difference whether a cell_id has been set or not, clear all */
++        for (mem_index = 0; mem_index < VIED_NCI_N_DATA_MEM_TYPE_ID;
++            mem_index++) {
++            process_ext->ext_mem_id[mem_index] = VIED_NCI_N_MEM_ID;
++            process_ext->ext_mem_offset[mem_index] =
++                IA_CSS_PROCESS_INVALID_OFFSET;
++        }
++    }
++
++    ia_css_process_cells_clear(process);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_clear_all invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_clear_all failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_acquire(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_acquire(): enter:\n");
++
++    verifexit(process != NULL);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_acquire invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_acquire failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_release(
++    ia_css_process_t *process)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_release(): enter:\n");
++
++    verifexit(process != NULL);
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_t invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_release failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_print(const ia_css_process_t *process, void *fid)
++{
++    int        retval = -1;
++    int        i, dev_chn_index;
++    uint16_t mem_index;
++    uint8_t    cell_dependency_count, terminal_dependency_count;
++    ia_css_process_ext_t *process_ext;
++    NOT_USED(fid);
++
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_process_print(process 0x%lx): enter:\n", (unsigned long int)process);
++
++    verifexit(process != NULL);
++    process_ext = ia_css_process_get_extension(process);
++
++    IA_CSS_TRACE_7(PSYSAPI_DYNAMIC, INFO,
++    "\tprocess 0x%lx, sizeof %d, program_idx %d, programID %d, state %d, parent 0x%lx, cell %d\n",
++        (unsigned long int)process,
++        (int)ia_css_process_get_size(process),
++        (int)ia_css_process_get_program_idx(process),
++        (int)ia_css_process_get_program_ID(process),
++        (int)ia_css_process_get_state(process),
++        (unsigned long int)ia_css_process_get_parent(process),
++        (int)ia_css_process_get_cell(process));
++
++    if (process_ext != NULL) {
++        for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
++            mem_index++) {
++            /* TODO: in case of an cells_bitmap = [],
++            * vied_nci_cell_get_mem_type will return a wrong result.
++            */
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\texternal index %d, type %d, id %d offset 0x%x\n",
++                mem_index,
++                (int)vied_nci_cell_get_mem_type(ia_css_process_get_cell(process),
++                                mem_index),
++                (int)(process_ext->ext_mem_id[mem_index]),
++                process_ext->ext_mem_offset[mem_index]);
++        }
++#if VIED_NCI_N_DEV_CHN_ID > 0
++        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
++            dev_chn_index++) {
++            IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++                "\tdevice channel index %d, type %d, offset 0x%x\n",
++                dev_chn_index,
++                (int)dev_chn_index,
++                process_ext->dev_chn_offset[dev_chn_index]);
++        }
++#else
++        NOT_USED(dev_chn_index);
++#endif /* VIED_NCI_N_DEV_CHN_ID */
++#if HAS_DFM
++        for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
++            dev_chn_index++) {
++            IA_CSS_TRACE_4(PSYSAPI_DYNAMIC, INFO,
++                "\tdfm device index %d, type %d, bitmap 0x%x active_ports_bitmap 0x%x\n",
++                dev_chn_index, dev_chn_index,
++                process_ext->dfm_port_bitmap[dev_chn_index],
++                process_ext->dfm_active_port_bitmap[dev_chn_index]);
++        }
++#endif
++    }
++
++    for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++        IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++            "\tcells[%d] = 0x%x\n",
++            i, ia_css_process_cells_get_cell(process, i));
++    }
++
++    cell_dependency_count =
++        ia_css_process_get_cell_dependency_count(process);
++    if (cell_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tcell_dependencies[%d] {};\n", cell_dependency_count);
++    } else {
++        vied_nci_resource_id_t cell_dependency;
++
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tcell_dependencies[%d] {", cell_dependency_count);
++        for (i = 0; i < (int)cell_dependency_count - 1; i++) {
++            cell_dependency =
++                ia_css_process_get_cell_dependency(process, i);
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                "%4d, ", cell_dependency);
++        }
++        cell_dependency =
++            ia_css_process_get_cell_dependency(process, i);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "%4d}\n", cell_dependency);
++        (void)cell_dependency;
++    }
++
++    terminal_dependency_count =
++        ia_css_process_get_terminal_dependency_count(process);
++    if (terminal_dependency_count == 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tterminal_dependencies[%d] {};\n",
++            terminal_dependency_count);
++    } else {
++        uint8_t terminal_dependency;
++
++        terminal_dependency_count =
++            ia_css_process_get_terminal_dependency_count(process);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "\tterminal_dependencies[%d] {",
++            terminal_dependency_count);
++        for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
++            terminal_dependency =
++                 ia_css_process_get_terminal_dependency(process, i);
++            IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++                "%4d, ", terminal_dependency);
++        }
++        terminal_dependency =
++            ia_css_process_get_terminal_dependency(process, i);
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++            "%4d}\n", terminal_dependency);
++        (void)terminal_dependency;
++    }
++
++    retval = 0;
++EXIT:
++    if (NULL == process) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_print invalid argument process\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_print failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_parent(
++    ia_css_process_t                    *process,
++    ia_css_process_group_t                    *parent)
++{
++    int    retval = -1;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++               "ia_css_process_set_parent(): enter:\n");
++
++    verifexit(process != NULL);
++    verifexit(parent != NULL);
++
++    process->parent_offset = (uint16_t) ((char *)parent - (char *)process);
++    retval = 0;
++EXIT:
++    if (NULL == process || NULL == parent) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_process_set_parent invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_process_set_parent failed (%i)\n", retval);
++    }
++    return retval;
++}
++
++int ia_css_process_set_cell_dependency(
++    const ia_css_process_t                    *process,
++    const unsigned int                    dep_index,
++    const vied_nci_resource_id_t                id)
++{
++    int retval = -1;
++    uint8_t *process_dep_ptr;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_cell_dependency(): enter:\n");
++    verifexit(process != NULL);
++
++    process_dep_ptr =
++        (uint8_t *)process + process->cell_dependencies_offset +
++               dep_index*sizeof(vied_nci_resource_id_t);
++
++    *process_dep_ptr = id;
++    retval = 0;
++EXIT:
++    return retval;
++}
++
++int ia_css_process_set_terminal_dependency(
++    const ia_css_process_t                *process,
++    const unsigned int                dep_index,
++    const vied_nci_resource_id_t        id)
++{
++    int retval = -1;
++    uint8_t *terminal_dep_ptr;
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_process_set_terminal_dependency(): enter:\n");
++    verifexit(process != NULL);
++    verifexit(ia_css_process_get_terminal_dependency_count(process) > dep_index);
++
++    terminal_dep_ptr =
++        (uint8_t *)process + process->terminal_dependencies_offset +
++               dep_index*sizeof(uint8_t);
++
++    *terminal_dep_ptr = id;
++    retval = 0;
++EXIT:
++    return retval;
++}
++
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
+new file mode 100644
+index 000000000000..f03eb53bc12f
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group.c
+@@ -0,0 +1,826 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process_group.h"
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_dynamic_trace.h"
++#include "ia_css_program_group_param_private.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_process_group_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/* This header is need for cpu memset to 0
++* and process groups are not created in SP
++*/
++#if !defined(__VIED_CELL)
++#include "cpu_mem_support.h"
++#endif
++
++/* This source file is created with the intention of sharing and
++* compiled for host and firmware. Since there is no native 64bit
++* data type support for firmware this wouldn't compile for SP
++* tile. The part of the file that is not compilable are marked
++* with the following __VIED_CELL marker and this comment. Once we
++* come up with a solution to address this issue this will be
++* removed.
++*/
++#if !defined(__VIED_CELL)
++
++/*  FUNCTION IS PRIVATE TO THIS MODULE; other C files in this module need it */
++bool ia_css_process_group_is_program_enabled(
++	const ia_css_program_manifest_t *program_manifest,
++	ia_css_kernel_bitmap_t enable_bitmap)
++{
++	ia_css_kernel_bitmap_t program_bitmap =
++		ia_css_program_manifest_get_kernel_bitmap(program_manifest);
++	ia_css_program_type_t program_type =
++		ia_css_program_manifest_get_type(program_manifest);
++	ia_css_kernel_bitmap_t program_enable_bitmap;
++
++	if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
++				program_bitmap)) {
++
++		if (program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
++			program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER ||
++			program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++			/*
++			 * EXCLUSIVE_SUB programs are subsets of
++			 * EXCLUSIVE_SUPER so the bits of the enable_bitmap
++			 * that refer to those are those of their
++			 * EXCLUSIVE_SUPER program (on which the depend) and
++			 * not the subset that their own program_bitmap has
++			 */
++			if (program_type ==
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB ||
++					program_type ==
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++				ia_css_kernel_bitmap_t super_program_bitmap;
++
++				const ia_css_program_group_manifest_t *
++					prog_group_manifest =
++			ia_css_program_manifest_get_parent(program_manifest);
++				uint8_t super_prog_idx =
++				ia_css_program_manifest_get_program_dependency(
++						program_manifest, 0);
++				const ia_css_program_manifest_t	*
++					super_program_manifest =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++					prog_group_manifest, super_prog_idx);
++
++				verifexit(super_program_manifest != NULL);
++				if (((program_type ==
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++					(ia_css_program_manifest_get_type(
++					super_program_manifest) !=
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER))
++					|| ((program_type ==
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
++					(ia_css_program_manifest_get_type(
++					super_program_manifest) !=
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER))) {
++					IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++						"ia_css_process_group_is_program_enabled(): Error\n");
++					verifexit(0);
++				}
++
++				super_program_bitmap =
++				ia_css_program_manifest_get_kernel_bitmap(
++						super_program_manifest);
++				program_enable_bitmap =
++					ia_css_kernel_bitmap_intersection(
++						enable_bitmap,
++						super_program_bitmap);
++			} else {
++				program_enable_bitmap =
++					ia_css_kernel_bitmap_intersection(
++						enable_bitmap, program_bitmap);
++			}
++
++			if (ia_css_is_kernel_bitmap_equal(
++				program_enable_bitmap, program_bitmap)) {
++				return true;
++			}
++		} else if (program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) {
++			/*
++			 * Virtual super programs are not selectable
++			 * only the virtual sub programs
++			 */
++			return false;
++		} else {
++			return true;
++		}
++	}
++
++EXIT:
++	return false;
++}
++
++size_t ia_css_sizeof_process_group(
++	const ia_css_program_group_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	size_t size = 0, tmp_size;
++	int i, error_val = -1;
++	uint8_t	process_count, process_num;
++	uint8_t terminal_count;
++	ia_css_kernel_bitmap_t enable_bitmap;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_sizeof_process_group(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(param != NULL);
++
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROCESS_GROUP_STRUCT_BITS !=
++			(CHAR_BIT * sizeof(ia_css_process_group_t)));
++
++	COMPILATION_ERROR_IF(0 !=
++			sizeof(ia_css_process_group_t) % sizeof(uint64_t));
++
++	process_count =
++		ia_css_process_group_compute_process_count(manifest, param);
++	terminal_count =
++		ia_css_process_group_compute_terminal_count(manifest, param);
++
++	verifexit(process_count != 0);
++	verifexit(terminal_count != 0);
++
++	size += sizeof(ia_css_process_group_t);
++
++	tmp_size = process_count * sizeof(uint16_t);
++	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
++
++	tmp_size = terminal_count * sizeof(uint16_t);
++	size += tot_bytes_for_pow2_align(sizeof(uint64_t), tmp_size);
++
++	enable_bitmap =
++		ia_css_program_group_param_get_kernel_enable_bitmap(param);
++	process_num = 0;
++	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
++				manifest); i++) {
++		ia_css_program_manifest_t *program_manifest =
++		ia_css_program_group_manifest_get_prgrm_mnfst(manifest, i);
++		ia_css_program_param_t *program_param =
++			ia_css_program_group_param_get_program_param(param, i);
++
++		if (ia_css_process_group_is_program_enabled(
++					program_manifest, enable_bitmap)) {
++			verifexit(process_num < process_count);
++			size += ia_css_sizeof_process(
++					program_manifest, program_param);
++			process_num++;
++		}
++	}
++
++	verifexit(process_num == process_count);
++
++	for (i = 0; i < (int)ia_css_program_group_manifest_get_terminal_count(
++				manifest); i++) {
++		ia_css_terminal_manifest_t *terminal_manifest =
++			ia_css_program_group_manifest_get_term_mnfst(
++					manifest, i);
++
++		if (ia_css_process_group_is_terminal_enabled(
++					terminal_manifest, enable_bitmap)) {
++			size += ia_css_sizeof_terminal(
++					terminal_manifest, param);
++		}
++	}
++
++	error_val = 0;
++
++EXIT:
++	if (NULL == manifest || NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_sizeof_process_group invalid argument\n");
++	}
++	if (error_val != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_sizeof_process_group ERROR(%d)\n", error_val);
++	}
++	return error_val ? 0 : size;
++}
++
++ia_css_process_group_t *ia_css_process_group_create(
++	void *process_grp_mem,
++	const ia_css_program_group_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	size_t size = ia_css_sizeof_process_group(manifest, param);
++	int retval = -1;
++	int ret;
++	int i;
++	ia_css_process_group_t *process_group = NULL;
++	uint8_t process_count, process_num;
++	uint8_t	terminal_count, terminal_num;
++	uint16_t fragment_count;
++	char *process_grp_raw_ptr;
++	uint16_t *process_tab_ptr, *terminal_tab_ptr;
++	ia_css_kernel_bitmap_t enable_bitmap;
++	uint8_t manifest_terminal_count;
++
++	IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_create(process_grp_mem %p, manifest %p, group_param %p): enter:\n",
++		process_grp_mem, manifest, param);
++
++	verifexit(process_grp_mem != NULL);
++	verifexit(manifest != NULL);
++	verifexit(param != NULL);
++	verifexit(ia_css_is_program_group_manifest_valid(manifest));
++	verifexit(size != 0);
++
++	process_group = (ia_css_process_group_t	*)process_grp_mem;
++	ia_css_cpu_mem_set_zero(process_group, size);
++	process_grp_raw_ptr = (char *) process_group;
++
++	process_group->state = IA_CSS_PROCESS_GROUP_CREATED;
++
++	process_group->protocol_version =
++		ia_css_program_group_param_get_protocol_version(param);
++
++	fragment_count = ia_css_program_group_param_get_fragment_count(param);
++	process_count =
++		ia_css_process_group_compute_process_count(manifest, param);
++	terminal_count =
++		ia_css_process_group_compute_terminal_count(manifest, param);
++	enable_bitmap =
++		ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++	process_group->fragment_count = fragment_count;
++	process_group->process_count = process_count;
++	process_group->terminal_count = terminal_count;
++	process_group->kernel_bitmap = enable_bitmap;
++
++	process_grp_raw_ptr += sizeof(ia_css_process_group_t);
++	process_tab_ptr = (uint16_t *) process_grp_raw_ptr;
++	process_group->processes_offset =
++		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
++
++	process_grp_raw_ptr += tot_bytes_for_pow2_align(
++			sizeof(uint64_t), process_count * sizeof(uint16_t));
++	terminal_tab_ptr = (uint16_t *) process_grp_raw_ptr;
++	process_group->terminals_offset =
++		(uint16_t)(process_grp_raw_ptr - (char *)process_group);
++
++	/* Move raw pointer to the first process */
++	process_grp_raw_ptr += tot_bytes_for_pow2_align(
++			sizeof(uint64_t), terminal_count * sizeof(uint16_t));
++
++	/* Set default */
++	verifexit(ia_css_process_group_set_fragment_limit(
++				process_group, fragment_count) == 0);
++
++	/* Set process group terminal dependency list */
++	/* This list is used during creating the process dependency list */
++	manifest_terminal_count =
++		ia_css_program_group_manifest_get_terminal_count(manifest);
++
++	terminal_num = 0;
++	for (i = 0; i < (int)manifest_terminal_count; i++) {
++		ia_css_terminal_manifest_t *t_manifest =
++			ia_css_program_group_manifest_get_term_mnfst(
++					manifest, i);
++
++		verifexit(NULL != t_manifest);
++
++		if (ia_css_process_group_is_terminal_enabled(
++					t_manifest, enable_bitmap)) {
++			ia_css_terminal_t *terminal = NULL;
++			ia_css_terminal_param_t *terminal_param =
++				ia_css_program_group_param_get_terminal_param(
++						param, i);
++
++			verifexit(NULL != terminal_param);
++			terminal_tab_ptr[terminal_num] =
++				(uint16_t)(process_grp_raw_ptr -
++						(char *)process_group);
++			terminal = ia_css_terminal_create(
++					process_grp_raw_ptr, t_manifest,
++					terminal_param, enable_bitmap);
++			verifexit(terminal != NULL);
++			verifexit((ia_css_terminal_set_parent(
++					terminal, process_group) == 0));
++			verifexit((ia_css_terminal_set_terminal_manifest_index(
++					terminal, i) == 0));
++			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++				"ia_css_process_group_create: terminal_manifest_index %d\n",
++				i);
++
++			process_grp_raw_ptr += ia_css_terminal_get_size(
++							terminal);
++			terminal_num++;
++		} else {
++			IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO, "Skip terminal %d\n", i);
++		}
++	}
++	verifexit(terminal_num == terminal_count);
++
++	process_num = 0;
++	for (i = 0; i < (int)ia_css_program_group_manifest_get_program_count(
++				manifest); i++) {
++		ia_css_process_t *process = NULL;
++		ia_css_program_manifest_t *program_manifest =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++					manifest, i);
++		ia_css_program_param_t *program_param =
++			ia_css_program_group_param_get_program_param(param, i);
++		unsigned int prog_dep_index, proc_dep_index;
++		unsigned int term_dep_index, term_index;
++
++		verifexit(program_manifest != 0);
++		verifexit(program_param    != NULL);
++
++		if (ia_css_process_group_is_program_enabled(
++					program_manifest, enable_bitmap)) {
++
++			verifexit(process_num < process_count);
++
++			process_tab_ptr[process_num] =
++				(uint16_t)(process_grp_raw_ptr -
++						(char *)process_group);
++
++			/* instead of using program_param,
++			 * we can provide this directly to ia_css_process_create.
++			 * The corresponding public setter function is deprecated and will assert
++			 * upon use. */
++			program_param->kernel_enable_bitmap =
++				ia_css_kernel_bitmap_intersection(
++						ia_css_program_manifest_get_kernel_bitmap(program_manifest),
++						/*pg*/enable_bitmap);
++
++			process = ia_css_process_create(
++					process_grp_raw_ptr,
++					program_manifest,
++					program_param,
++					i);
++			verifexit(process != NULL);
++
++			ia_css_process_set_parent(process, process_group);
++			if (ia_css_has_program_manifest_fixed_cell(
++						program_manifest)) {
++				vied_nci_cell_ID_t cell_id =
++					ia_css_program_manifest_get_cell_ID(
++							program_manifest);
++
++				IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++					"ia_css_process_group_create: cell_id %d\n",
++					cell_id);
++				ia_css_process_set_cell(process, cell_id);
++			}
++
++			process_grp_raw_ptr += ia_css_process_get_size(
++					process);
++			/*
++			 * Set process dependencies of process derived
++			 * from program manifest
++			 */
++			for (prog_dep_index = 0; prog_dep_index <
++			ia_css_program_manifest_get_program_dependency_count(
++				program_manifest); prog_dep_index++) {
++				uint8_t dep_prog_idx =
++				ia_css_program_manifest_get_program_dependency(
++					program_manifest, prog_dep_index);
++				const ia_css_program_manifest_t *
++				dep_prg_manifest =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++					manifest, dep_prog_idx);
++				ia_css_program_ID_t id =
++				ia_css_program_manifest_get_program_ID(
++						dep_prg_manifest);
++
++				verifexit(id != 0);
++				for (proc_dep_index = 0;
++						proc_dep_index < process_num;
++						proc_dep_index++) {
++					ia_css_process_t *dep_process =
++					ia_css_process_group_get_process(
++							process_group,
++							proc_dep_index);
++
++					ia_css_process_set_cell_dependency(
++							process,
++							prog_dep_index, 0);
++
++				if (ia_css_process_get_program_ID(
++						dep_process) == id) {
++					ia_css_process_set_cell_dependency(
++							process,
++							prog_dep_index,
++							proc_dep_index);
++						break;
++					}
++				}
++			}
++			process_num++;
++
++			/*
++			 * Set terminal dependencies of process derived
++			 * from program manifest
++			 */
++			for (term_dep_index = 0; term_dep_index <
++			ia_css_program_manifest_get_terminal_dependency_count(
++				program_manifest); term_dep_index++) {
++				uint8_t pm_term_index =
++				ia_css_program_manifest_get_terminal_dependency
++					(program_manifest, term_dep_index);
++
++				verifexit(pm_term_index < manifest_terminal_count);
++				IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++					"ia_css_process_group_create(): term_dep_index: %d, pm_term_index: %d\n",
++					term_dep_index, pm_term_index);
++				for (term_index = 0;
++					term_index < terminal_count;
++					term_index++) {
++					ia_css_terminal_t *terminal =
++					ia_css_process_group_get_terminal(
++							process_group,
++							term_index);
++
++				if (ia_css_terminal_get_terminal_manifest_index
++						(terminal) == pm_term_index) {
++					ia_css_process_set_terminal_dependency(
++							process,
++							term_dep_index,
++							term_index);
++					IA_CSS_TRACE_3(PSYSAPI_DYNAMIC, INFO,
++						"ia_css_process_group_create() set_terminal_dependency(process: %d, dep_idx: %d, term_idx: %d)\n",
++						i, term_dep_index, term_index);
++
++						break;
++					}
++				}
++			}
++		}
++	}
++	verifexit(process_num == process_count);
++
++	process_group->size =
++		(uint32_t)ia_css_sizeof_process_group(manifest, param);
++	process_group->ID =
++		ia_css_program_group_manifest_get_program_group_ID(manifest);
++
++	/* Initialize performance measurement fields to zero */
++	process_group->pg_load_start_ts		= 0;
++	process_group->pg_load_cycles		= 0;
++	process_group->pg_init_cycles		= 0;
++	process_group->pg_processing_cycles	= 0;
++	process_group->pg_complete_cycles	= 0;
++
++	process_group->error_handling_enable = 0;
++
++	verifexit(process_group->size != 0);
++	verifexit(process_group->ID != 0);
++
++	ret = ia_css_process_group_on_create(process_group, manifest, param);
++	verifexit(ret == 0);
++
++	process_group->state = IA_CSS_PROCESS_GROUP_READY;
++	retval = 0;
++
++	IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_create(): Created successfully process group ID 0x%x\n",
++		process_group->ID);
++
++EXIT:
++	if (NULL == process_grp_mem || NULL == manifest || NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_create invalid argument\n");
++	}
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_create failed (%i)\n", retval);
++		process_group = ia_css_process_group_destroy(process_group);
++	}
++	return process_group;
++}
++
++ia_css_process_group_t *ia_css_process_group_destroy(
++	ia_css_process_group_t *process_group)
++{
++	if (process_group != NULL) {
++		ia_css_process_group_on_destroy(process_group);
++		process_group = NULL;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_destroy invalid argument\n");
++	}
++	return process_group;
++}
++
++int ia_css_process_group_submit(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_submit(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_SUBMIT);
++}
++
++int ia_css_process_group_start(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_start(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_START);
++}
++
++int ia_css_process_group_stop(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_stop(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_STOP);
++}
++
++int ia_css_process_group_run(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_run(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_RUN);
++}
++
++int ia_css_process_group_suspend(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_suspend(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_SUSPEND);
++}
++
++int ia_css_process_group_resume(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_resume(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_RESUME);
++}
++
++int ia_css_process_group_reset(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_reset(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_RESET);
++}
++
++int ia_css_process_group_abort(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_abort(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_ABORT);
++}
++
++int ia_css_process_group_disown(
++	ia_css_process_group_t *process_group)
++{
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, INFO,
++		"ia_css_process_group_disown(): enter:\n");
++
++	return ia_css_process_group_exec_cmd(process_group,
++		IA_CSS_PROCESS_GROUP_CMD_DISOWN);
++}
++
++uint64_t ia_css_process_group_get_token(
++	ia_css_process_group_t *process_group)
++{
++	uint64_t token = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_token(): enter:\n");
++
++	verifexit(process_group != NULL);
++
++	token = process_group->token;
++
++EXIT:
++	if (NULL == process_group) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_get_token invalid argument\n");
++	}
++	return token;
++}
++
++int ia_css_process_group_set_token(
++	ia_css_process_group_t *process_group,
++	const uint64_t token)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_token(): enter:\n");
++
++	verifexit(process_group != NULL);
++	verifexit(token != 0);
++
++	process_group->token = token;
++
++	retval = 0;
++EXIT:
++	if (NULL == process_group || 0 == token) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_set_token invalid argument\n");
++	}
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_token failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++uint64_t ia_css_process_group_get_private_token(
++	ia_css_process_group_t *process_group)
++{
++	uint64_t token = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_get_private_token(): enter:\n");
++
++	verifexit(process_group != NULL);
++
++	token = process_group->private_token;
++
++EXIT:
++	if (NULL == process_group) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_get_private_token invalid argument\n");
++	}
++	return token;
++}
++
++int ia_css_process_group_set_private_token(
++	ia_css_process_group_t *process_group,
++	const uint64_t token)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_set_private_token(): enter:\n");
++
++	verifexit(process_group != NULL);
++	verifexit(token != 0);
++
++	process_group->private_token = token;
++
++	retval = 0;
++EXIT:
++	if (NULL == process_group || 0 == token) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_set_private_token invalid argument\n");
++	}
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++			"ia_css_process_group_set_private_token failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++uint8_t ia_css_process_group_compute_process_count(
++	const ia_css_program_group_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	uint8_t process_count = 0;
++	ia_css_kernel_bitmap_t total_bitmap;
++	ia_css_kernel_bitmap_t enable_bitmap;
++	int i;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_compute_process_count(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(param != NULL);
++
++	total_bitmap =
++		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++	enable_bitmap =
++		ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++	verifexit(ia_css_is_program_group_manifest_valid(manifest));
++	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
++	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
++
++	for (i = 0; i <
++		(int)ia_css_program_group_manifest_get_program_count(manifest);
++			i++) {
++		ia_css_program_manifest_t *program_manifest =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++					manifest, i);
++		ia_css_kernel_bitmap_t program_bitmap =
++			ia_css_program_manifest_get_kernel_bitmap(
++					program_manifest);
++		/*
++		 * Programs can be orthogonal,
++		 * a mutually exclusive subset,
++		 * or a concurrent subset
++		 */
++		if (!ia_css_is_kernel_bitmap_intersection_empty(enable_bitmap,
++					program_bitmap)) {
++			ia_css_program_type_t program_type =
++				ia_css_program_manifest_get_type(
++						program_manifest);
++			/*
++			 * An exclusive subnode < exclusive supernode,
++			 * so simply don't count it
++			 */
++			if (program_type !=
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB &&
++				program_type !=
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) {
++				process_count++;
++			}
++		}
++	}
++
++EXIT:
++	if (NULL == manifest || NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_compute_process_count invalid argument\n");
++	}
++	return process_count;
++}
++
++uint8_t ia_css_process_group_compute_terminal_count(
++	const ia_css_program_group_manifest_t *manifest,
++	const ia_css_program_group_param_t *param)
++{
++	uint8_t terminal_count = 0;
++	ia_css_kernel_bitmap_t total_bitmap, enable_bitmap;
++	int i;
++
++	IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++		"ia_css_process_group_compute_terminal_count(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(param != NULL);
++
++	total_bitmap =
++		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++	enable_bitmap =
++		ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++	verifexit(ia_css_is_program_group_manifest_valid(manifest));
++	verifexit(ia_css_is_kernel_bitmap_subset(total_bitmap, enable_bitmap));
++	verifexit(!ia_css_is_kernel_bitmap_empty(enable_bitmap));
++
++	for (i = 0; i <
++		(int)ia_css_program_group_manifest_get_terminal_count(
++			manifest); i++) {
++		ia_css_terminal_manifest_t *tmanifest =
++			ia_css_program_group_manifest_get_term_mnfst(
++					manifest, i);
++
++		if (ia_css_process_group_is_terminal_enabled(
++					tmanifest, enable_bitmap)) {
++			terminal_count++;
++		}
++	}
++
++EXIT:
++	if (NULL == manifest || NULL == param) {
++		IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++			"ia_css_process_group_compute_terminal_count invalid argument\n");
++	}
++	return terminal_count;
++}
++#endif /* !defined(__VIED_CELL) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
+new file mode 100644
+index 000000000000..7ee4448a894d
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_process_group_cmd_impl.c
+@@ -0,0 +1,137 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_process_group_cmd_impl.h"
++#include "ia_css_psysapi.h"
++#include "ia_css_psys_process.h"
++#include "ia_css_psys_process.psys.h"
++#include "ia_css_psys_process_group.h"
++#include "ia_css_psys_process_group.psys.h"
++#include "error_support.h"
++#include "vied_nci_psys_system_global.h"
++#include "misc_support.h"
++
++#include "ia_css_psys_sim_trace.h"
++
++/* Dummy implementation for sim */
++int ia_css_process_group_on_create(
++	ia_css_process_group_t					*process_group,
++	const ia_css_program_group_manifest_t	*program_group_manifest,
++	const ia_css_program_group_param_t		*program_group_param)
++{
++	NOT_USED(process_group);
++	NOT_USED(program_group_manifest);
++	NOT_USED(program_group_param);
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_create(): enter: \n");
++
++	return 0;
++}
++
++/* Dummy implementation for sim */
++int ia_css_process_group_on_destroy(
++	ia_css_process_group_t					*process_group)
++{
++	NOT_USED(process_group);
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, INFO, "ia_css_process_group_on_destroy(): enter: \n");
++
++	return 0;
++}
++
++int ia_css_process_group_exec_cmd(
++	ia_css_process_group_t					*process_group,
++	const ia_css_process_group_cmd_t		cmd)
++{
++	int	retval = -1;
++	ia_css_process_group_state_t	state;
++
++	IA_CSS_TRACE_0(PSYSAPI_SIM, VERBOSE, "ia_css_process_group_exec_cmd(): enter: \n");
++
++	state = ia_css_process_group_get_state(process_group);
++
++	verifexit(process_group != NULL);
++	verifexit(state != IA_CSS_PROCESS_GROUP_ERROR);
++	verifexit(state < IA_CSS_N_PROCESS_GROUP_STATES);
++
++	switch (cmd) {
++	case IA_CSS_PROCESS_GROUP_CMD_NOP:
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_SUBMIT:
++		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++
++/* External resource availability checks */
++		verifexit(ia_css_can_process_group_submit(process_group));
++
++		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_ATTACH:
++		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_DETACH:
++		verifexit(state == IA_CSS_PROCESS_GROUP_READY);
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_START:
++		verifexit(state == IA_CSS_PROCESS_GROUP_BLOCKED);
++
++/* External resource state checks */
++		verifexit(ia_css_can_process_group_start(process_group));
++
++		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_DISOWN:
++
++		/* empty call to match API ownership change between host and firmware */
++
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_RUN:
++		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
++		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_STOP:
++		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
++		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_SUSPEND:
++		verifexit(state == IA_CSS_PROCESS_GROUP_RUNNING);
++		process_group->state = IA_CSS_PROCESS_GROUP_STARTED;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_RESUME:
++		verifexit(state == IA_CSS_PROCESS_GROUP_STARTED);
++		process_group->state = IA_CSS_PROCESS_GROUP_RUNNING;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_ABORT:
++		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED)));
++		process_group->state = IA_CSS_PROCESS_GROUP_STOPPED;
++		break;
++	case IA_CSS_PROCESS_GROUP_CMD_RESET:
++/* We accept a reset command in the stopped state, mostly for simplifying the statemachine test */
++		verifexit(((state == IA_CSS_PROCESS_GROUP_RUNNING) || (state == IA_CSS_PROCESS_GROUP_STARTED) || (state == IA_CSS_PROCESS_GROUP_STOPPED)));
++		process_group->state = IA_CSS_PROCESS_GROUP_BLOCKED;
++		break;
++	case IA_CSS_N_PROCESS_GROUP_CMDS:	/* Fall through */
++	default:
++		verifexit(false);
++		break;
++	}
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_SIM, ERROR, "ia_css_process_group_exec_cmd failed (%i)\n", retval);
++	}
++	return retval;
++}
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
+new file mode 100644
+index 000000000000..d67493b83832
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_group_manifest.c
+@@ -0,0 +1,1081 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_static_storage_class.h"
++#include "ia_css_psys_program_group_manifest.h"
++#include "ia_css_rbm_manifest.h"
++
++#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
++#include "vied_nci_acb_route_type.h" /* only used for printing. */
++#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_group_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/*
++ * We need to refactor those files in order to
++ * build in the firmware only what is needed,
++ * switches are put current to workaround compilation problems
++ * in the firmware (for example lack of uint64_t support)
++ * supported in the firmware
++ */
++#if !defined(__HIVECC)
++size_t ia_css_sizeof_program_group_manifest(
++	const uint8_t program_count,
++	const uint8_t terminal_count,
++	const uint8_t *program_needs_extension,
++	const uint8_t *program_dependency_count,
++	const uint8_t *terminal_dependency_count,
++	const ia_css_terminal_type_t *terminal_type,
++	const uint16_t *cached_in_param_section_count,
++	const uint16_t *cached_out_param_section_count,
++	const uint16_t *spatial_param_section_count,
++	const uint16_t *fragment_param_section_count,
++	const uint16_t *sliced_param_section_count,
++	const uint16_t *sliced_out_param_section_count,
++	const uint16_t *kernel_fragment_seq_count,
++	const uint16_t *progctrlinit_load_section_counts,
++	const uint16_t *progctrlinit_connect_section_counts)
++{
++	size_t size = 0;
++	int i = 0;
++	int j = 0;
++	int k = 0;
++	int l = 0;
++	int m = 0;
++	int n = 0;
++	int o = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_sizeof_program_group_manifest(): enter:\n");
++
++	verifexit(program_count != 0);
++	verifexit(program_dependency_count != NULL);
++	verifexit(terminal_dependency_count != NULL);
++
++	size += sizeof(ia_css_program_group_manifest_t);
++
++	/* Private payload in the program group manifest */
++	size += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
++				sizeof(uint64_t));
++	/* RBM manifest in the program group manifest */
++	size += ceil_mul(sizeof(ia_css_rbm_manifest_t),
++				sizeof(uint64_t));
++
++	for (i = 0; i < (int)program_count; i++) {
++		size += ia_css_sizeof_program_manifest(
++				program_needs_extension[i],
++				program_dependency_count[i],
++				terminal_dependency_count[i]);
++	}
++
++	for (i = 0; i < (int)terminal_count; i++) {
++		switch (terminal_type[i]) {
++		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++			size += ia_css_param_terminal_manifest_get_size(
++					cached_in_param_section_count[j]);
++			j++;
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++			size += ia_css_param_terminal_manifest_get_size(
++					cached_out_param_section_count[k]);
++			k++;
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++			size += ia_css_spatial_param_terminal_manifest_get_size(
++					spatial_param_section_count[l]);
++			l++;
++			break;
++		case IA_CSS_TERMINAL_TYPE_PROGRAM:
++			size += ia_css_program_terminal_manifest_get_size(
++					fragment_param_section_count[m],
++					kernel_fragment_seq_count[m]);
++			m++;
++			break;
++		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++			size += ia_css_program_control_init_terminal_manifest_get_size(
++				program_count,
++				progctrlinit_load_section_counts,
++				progctrlinit_connect_section_counts);
++			break;
++		case IA_CSS_TERMINAL_TYPE_DATA_IN:
++		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++			size += sizeof(ia_css_data_terminal_manifest_t);
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++			size += ia_css_sliced_param_terminal_manifest_get_size(
++					sliced_param_section_count[n]);
++			n++;
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++			size += ia_css_sliced_param_terminal_manifest_get_size(
++				sliced_out_param_section_count[o]);
++			o++;
++			break;
++		default:
++			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++				"ia_css_sizeof_program_group_manifest invalid argument\n");
++		}
++	}
++
++EXIT:
++	if (0 == program_count || 0 == terminal_count ||
++		NULL == program_dependency_count ||
++		NULL == terminal_dependency_count) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_sizeof_program_group_manifest invalid argument\n");
++	}
++	return size;
++}
++
++/*
++ * Currently, the design of XNR kernel inside the *_pregdc program group,
++ * does not fit the exact model as is being asserted on in
++ * ia_css_is_program_group_manifest_valid. We therefore disable some checks.
++ * Further investigation is needed to determine whether *_pregdc program group
++ * can be canged or that the model must be changed.
++ * #define USE_SIMPLIFIED_GRAPH_MODEL 1 allows multiple programs to be
++ * connected to the same terminal, and it allows a kernel be mapped over
++ * multiple programs.
++ */
++#define USE_SIMPLIFIED_GRAPH_MODEL 1
++
++/*
++ * Model and/or check refinements
++ * - Parallel programs do not yet have mutual exclusive alternatives
++ * - The pgram dependencies do not need to be acyclic
++ * - Parallel programs need to have an equal kernel requirement
++ */
++bool ia_css_is_program_group_manifest_valid(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	int i;
++	bool is_valid = false;
++	uint8_t terminal_count;
++	uint8_t program_count;
++	ia_css_kernel_bitmap_t total_bitmap;
++	ia_css_kernel_bitmap_t check_bitmap;
++	ia_css_kernel_bitmap_t terminal_bitmap;
++	/*
++	 * Use a standard bitmap type for the minimum logic to check the DAG,
++	 * generic functions can be used for the kernel enable bitmaps; Later
++	 */
++	vied_nci_resource_bitmap_t resource_bitmap;
++	int terminal_bitmap_weight;
++	int num_parameter_terminal_in = 0;
++	int num_parameter_terminal_out = 0;
++	int num_program_terminal = 0;
++	int num_program_terminal_sequencer_info = 0;
++	bool has_program_control_init_terminal = false;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_program_group_manifest_valid(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(ia_css_program_group_manifest_get_size(manifest) != 0);
++	verifexit(ia_css_program_group_manifest_get_alignment(manifest) != 0);
++	verifexit(ia_css_program_group_manifest_get_program_group_ID(manifest) != 0);
++
++	terminal_count =
++		ia_css_program_group_manifest_get_terminal_count(manifest);
++	program_count =
++		ia_css_program_group_manifest_get_program_count(manifest);
++	total_bitmap =
++		ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++	check_bitmap = ia_css_kernel_bitmap_clear();
++	resource_bitmap = vied_nci_bit_mask(VIED_NCI_RESOURCE_BITMAP_BITS);
++	terminal_bitmap = ia_css_kernel_bitmap_clear();
++
++	verifexit(program_count != 0);
++	verifexit(terminal_count != 0);
++	verifexit(!ia_css_is_kernel_bitmap_empty(total_bitmap));
++	verifexit(vied_nci_is_bitmap_empty(resource_bitmap));
++
++	/* Check the kernel bitmaps for terminals */
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_manifest_t *terminal_manifest_i =
++			ia_css_program_group_manifest_get_term_mnfst(
++				manifest, i);
++		bool is_parameter_in =
++			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ==
++			ia_css_terminal_manifest_get_type(
++				terminal_manifest_i));
++		bool is_parameter_out =
++			(IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT ==
++			ia_css_terminal_manifest_get_type(
++				terminal_manifest_i));
++		bool is_data =
++			ia_css_is_terminal_manifest_data_terminal(
++				terminal_manifest_i);
++		bool is_program =
++			ia_css_is_terminal_manifest_program_terminal(
++				terminal_manifest_i);
++		bool is_spatial_param =
++			ia_css_is_terminal_manifest_spatial_parameter_terminal(
++				terminal_manifest_i);
++		bool is_program_control_init =
++			ia_css_is_terminal_manifest_program_control_init_terminal(
++				terminal_manifest_i);
++
++		if (is_parameter_in) {
++			num_parameter_terminal_in = is_parameter_in;
++		} else if (is_parameter_out) {
++			num_parameter_terminal_out = is_parameter_out;
++		} else if (is_data) {
++			ia_css_data_terminal_manifest_t *dterminal_manifest_i =
++				(ia_css_data_terminal_manifest_t *)
++				terminal_manifest_i;
++			ia_css_kernel_bitmap_t terminal_bitmap_i =
++				ia_css_data_terminal_manifest_get_kernel_bitmap(
++					dterminal_manifest_i);
++			/*
++			 * A terminal must depend on kernels that are a subset
++			 * of the total, correction, it can only depend on one
++			 * kernel
++			 */
++			verifexit(!ia_css_is_kernel_bitmap_empty(
++					terminal_bitmap_i));
++			verifexit(ia_css_is_kernel_bitmap_subset(
++					total_bitmap, terminal_bitmap_i));
++			verifexit(ia_css_is_kernel_bitmap_onehot(
++					terminal_bitmap_i));
++		} else if (is_program) {
++			verifexit(terminal_manifest_i);
++			num_program_terminal += is_program;
++			num_program_terminal_sequencer_info +=
++				((ia_css_program_terminal_manifest_t *)
++				terminal_manifest_i)->
++			kernel_fragment_sequencer_info_manifest_info_count;
++		} else if (is_program_control_init) {
++			has_program_control_init_terminal = is_program_control_init;
++		} else {
++			const ia_css_spatial_param_terminal_manifest_t
++				*spatial_param_man =
++			(const ia_css_spatial_param_terminal_manifest_t *)
++				terminal_manifest_i;
++			verifexit(spatial_param_man);
++			verifexit(is_spatial_param);
++
++			terminal_bitmap =
++				ia_css_kernel_bitmap_set(terminal_bitmap,
++				spatial_param_man->kernel_id);
++			verifexit(!ia_css_is_kernel_bitmap_empty(terminal_bitmap));
++			verifexit(ia_css_is_kernel_bitmap_subset(
++					total_bitmap, terminal_bitmap));
++		}
++	}
++
++	/* Check the kernel bitmaps for programs */
++	for (i = 0; i < (int)program_count; i++) {
++		int j;
++		ia_css_program_manifest_t *program_manifest_i =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++				manifest, i);
++		ia_css_program_type_t program_type_i =
++			ia_css_program_manifest_get_type(program_manifest_i);
++		ia_css_kernel_bitmap_t program_bitmap_i =
++			ia_css_program_manifest_get_kernel_bitmap(
++				program_manifest_i);
++		uint8_t program_dependency_count_i =
++			ia_css_program_manifest_get_program_dependency_count(
++				program_manifest_i);
++		uint8_t terminal_dependency_count_i =
++			ia_css_program_manifest_get_terminal_dependency_count(
++				program_manifest_i);
++		uint8_t program_dependency_i0 =
++			ia_css_program_manifest_get_program_dependency(
++				program_manifest_i, 0);
++		bool is_sub_i =
++			ia_css_is_program_manifest_subnode_program_type(
++				program_manifest_i);
++		bool is_exclusive_sub_i =
++			(program_type_i == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB);
++		bool is_virtual_sub_i =
++			(program_type_i == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++		bool is_super_i =
++			ia_css_is_program_manifest_supernode_program_type(
++				program_manifest_i);
++
++		/*
++		 * A program must have kernels that
++		 * are a subset of the total
++		 */
++		verifexit(!ia_css_is_kernel_bitmap_empty(
++				program_bitmap_i));
++		verifexit(ia_css_is_kernel_bitmap_subset(
++				total_bitmap, program_bitmap_i));
++		verifexit((program_type_i != IA_CSS_N_PROGRAM_TYPES));
++		verifexit((program_dependency_count_i + terminal_dependency_count_i) != 0);
++		/*
++		 * Checks for subnodes
++		 * - Parallel subnodes cannot depend on terminals
++		 * - Exclusive subnodes must depend on
++		 *   fewer terminals than the supernode
++		 * - Subnodes only depend on a supernode of the same type
++		 * - Must have a subset of the supernode's kernels
++		 *   (but not equal)
++		 * - This tests only positive cases
++		 * Checks for singular or supernodes
++		 * - Cannot depend on exclusive subnodes
++		 * - No intersection between kernels
++		 *   (too strict for multiple instances ?)
++		 */
++		if (is_sub_i) {
++			/* Subnode */
++			ia_css_program_manifest_t *program_manifest_k =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++				manifest, program_dependency_i0);
++			ia_css_program_type_t program_type_k =
++				ia_css_program_manifest_get_type(
++					program_manifest_k);
++			ia_css_kernel_bitmap_t program_bitmap_k =
++				ia_css_program_manifest_get_kernel_bitmap(
++					program_manifest_k);
++
++			verifexit(program_dependency_count_i == 1);
++			if (is_exclusive_sub_i || is_virtual_sub_i) {
++				verifexit(terminal_dependency_count_i <=
++					ia_css_program_manifest_get_terminal_dependency_count(
++						program_manifest_k));
++			} else{
++				verifexit(terminal_dependency_count_i == 0);
++			}
++			verifexit(program_type_k ==
++				(is_exclusive_sub_i ?
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER :
++				is_virtual_sub_i ?
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER :
++					IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER));
++			verifexit(!ia_css_is_kernel_bitmap_equal(
++					program_bitmap_k, program_bitmap_i));
++			verifexit(ia_css_is_kernel_bitmap_subset(
++					program_bitmap_k, program_bitmap_i));
++		} else {
++			/* Singular or Supernode */
++			int k;
++			ia_css_kernel_bitmap_t program_bitmap_k;
++
++			for (k = 0; k < program_dependency_count_i; k++) {
++				uint8_t program_dependency_k =
++				ia_css_program_manifest_get_program_dependency(
++					program_manifest_i, k);
++				ia_css_program_manifest_t *program_manifest_k =
++				ia_css_program_group_manifest_get_prgrm_mnfst(
++				manifest, (int)program_dependency_k);
++				ia_css_program_type_t program_type_k =
++				ia_css_program_manifest_get_type(
++					program_manifest_k);
++				program_bitmap_k =
++				ia_css_program_manifest_get_kernel_bitmap(
++					program_manifest_k);
++
++				verifexit(program_dependency_k <
++					program_count);
++				verifexit((program_type_k !=
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++					(program_type_k !=
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
++				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++				ia_css_is_kernel_bitmap_intersection_empty(
++					program_bitmap_i, program_bitmap_k));
++			}
++		}
++
++		/* Check for relations */
++		for (j = 0; j < (int)program_count; j++) {
++			int k;
++			ia_css_program_manifest_t *program_manifest_j =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++				manifest, j);
++			ia_css_program_type_t program_type_j =
++			ia_css_program_manifest_get_type(program_manifest_j);
++			ia_css_kernel_bitmap_t program_bitmap_j =
++			ia_css_program_manifest_get_kernel_bitmap(
++				program_manifest_j);
++			uint8_t program_dependency_count_j =
++			ia_css_program_manifest_get_program_dependency_count(
++				program_manifest_j);
++			uint8_t program_dependency_j0 =
++			ia_css_program_manifest_get_program_dependency(
++				program_manifest_j, 0);
++			bool is_sub_j =
++			ia_css_is_program_manifest_subnode_program_type(
++				program_manifest_j);
++			bool is_super_j =
++			ia_css_is_program_manifest_supernode_program_type(
++				program_manifest_j);
++			bool is_virtual_sub_j =
++			(program_type_j == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++			bool is_j_subset_i =
++			ia_css_is_kernel_bitmap_subset(
++				program_bitmap_i, program_bitmap_j);
++			bool is_i_subset_j =
++			ia_css_is_kernel_bitmap_subset(
++				program_bitmap_j, program_bitmap_i);
++
++			/* Test below would fail for i==j */
++			if (i == j)
++				continue;
++
++			/* Empty sets are always subsets, but meaningless */
++			verifexit(!ia_css_is_kernel_bitmap_empty(
++					program_bitmap_j));
++
++			/*
++			 * Checks for mutual subnodes
++			 * - Parallel subnodes must have an equal
++			 *   set of kernels
++			 * - Exclusive and virtual subnodes must
++			 *   have an unequal set of kernels
++			 * Checks for subnodes
++			 * - Subnodes must have a subset of kernels
++			 */
++			if (((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
++				((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
++				((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
++
++				verifexit(program_dependency_count_j == 1);
++				verifexit(program_dependency_i0 != i);
++				verifexit(program_dependency_j0 != i);
++
++				if (program_dependency_i0 ==
++					program_dependency_j0) {
++					verifexit(is_sub_i);
++					/*
++					 * Subnodes are subsets,
++					 * not for virtual nodes
++					 */
++					if (!is_virtual_sub_i)
++						verifexit(
++							((is_j_subset_i ||
++							is_i_subset_j)));
++					/*
++					 * That must be equal for
++					 * parallel subnodes,
++					 * must be unequal for
++					 * exlusive and virtual subnodes
++					 */
++					verifexit(
++					((is_j_subset_i && is_i_subset_j) ^
++					(is_exclusive_sub_i |
++					is_virtual_sub_i)));
++
++				}
++				if (is_j_subset_i || is_i_subset_j) {
++					/* One being subset of the other does not necessarily mean that they are part
++					 * of the same "cluster" (i.e. having same super dependency).
++					 */
++					/* verifexit(program_dependency_i0 ==
++					 *	program_dependency_j0);
++					 */
++				}
++				/* If subnodes are the same, they need different program dependency. */
++				if (ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j)) {
++					verifexit(program_dependency_i0 != program_dependency_j0);
++				}
++			}
++
++			if (((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_PARALLEL_SUB)) ||
++				((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB)) ||
++				((program_type_i ==
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER) &&
++				(program_type_j ==
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB))) {
++
++				verifexit(program_dependency_count_j == 1);
++				verifexit(!is_i_subset_j);
++
++				if (program_dependency_j0 == i) {
++					verifexit(program_dependency_i0 !=
++						program_dependency_j0);
++					verifexit(is_super_i);
++					verifexit(is_j_subset_i);
++
++				}
++				if (is_j_subset_i) {
++					/* verifexit(program_dependency_j0 == i); */
++					/* A sub that is subset of a super, is not necessarily dependent to it. */
++				}
++			}
++
++			/*
++			 * Checks for dependent nodes
++			 * - Cannot depend on exclusive subnodes
++			 * - No intersection between kernels
++			 *   (too strict for multiple instances ?)
++			 *   unless a subnode
++			 */
++			for (k = 0; k < (int)program_dependency_count_j; k++) {
++				uint8_t program_dependency_k =
++				ia_css_program_manifest_get_program_dependency(
++					program_manifest_j, k);
++
++				verifexit((program_dependency_k <
++					program_count));
++				if (program_dependency_k == i) {
++					/* program[j] depends on program[i] */
++					verifexit((i != j));
++					verifexit((program_type_i !=
++					IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++					(program_type_i !=
++					IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB));
++					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++				(ia_css_is_kernel_bitmap_intersection_empty(
++				program_bitmap_i, program_bitmap_j) ^ is_sub_j));
++				}
++			}
++
++			/*
++			 * Checks for supernodes and subnodes
++			 * - Detect nodes that kernel-wise are subsets,
++			 *   but not connected to the correct supernode
++			 * - We do not (yet) detect if programs properly
++			 *   depend on all parallel nodes
++			 */
++			if (!ia_css_is_kernel_bitmap_intersection_empty(
++				program_bitmap_i, program_bitmap_j)) {
++				/*
++				 * This test will pass if
++				 * the program manifest is NULL,
++				 * but that's no concern here
++				 */
++				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++			!ia_css_is_program_manifest_singular_program_type(
++				program_manifest_i));
++				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++			!ia_css_is_program_manifest_singular_program_type(
++				program_manifest_j));
++				if (!is_virtual_sub_j)
++					verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++					(is_j_subset_i || is_i_subset_j));
++				if (is_super_i) {
++					/* verifexit(is_sub_j); */
++					/* verifexit(program_dependency_j0 == i); */
++				}
++				if (is_super_j) {
++					/* verifexit(is_sub_i); */
++					/* verifexit(program_dependency_i0 == j); */
++				}
++				if (is_super_i && is_super_j) {
++					/* Allow two supernodes to intersect as long as they are different */
++					verifexit(!ia_css_is_kernel_bitmap_equal(program_bitmap_i, program_bitmap_j));
++				}
++				/* A bitmap intersect does not necessarily need to mean super and sub. */
++				/* A sub that intersects with a super, is not necessarily dependent to it. */
++			}
++		}
++		check_bitmap = ia_css_kernel_bitmap_union(
++					check_bitmap, program_bitmap_i);
++		/*
++		 * A terminal can be bound to only a single
++		 * (of multiple concurrent) program(s),
++		 * i.e. the one that holds the iterator to control it
++		 * Only singular and super nodes can depend on a terminal.
++		 * This loop accumulates all terminal
++		 * dependencies over all programs
++		 */
++		for (j = 0; j < (int)terminal_dependency_count_i; j++) {
++			uint8_t terminal_dependency =
++			ia_css_program_manifest_get_terminal_dependency(
++					program_manifest_i, j);
++
++			verifexit(terminal_dependency < terminal_count);
++			if ((program_type_i !=
++				IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) &&
++				(program_type_i !=
++				IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB)) {
++				/* If the subnode always came after the */
++				/* supernode we could check for presence */
++				resource_bitmap =
++					vied_nci_bit_mask_set_unique(
++						resource_bitmap,
++						terminal_dependency);
++				verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++					!vied_nci_is_bitmap_empty(
++						resource_bitmap));
++			}
++		}
++	}
++	verifexit(ia_css_is_kernel_bitmap_equal(
++			total_bitmap, check_bitmap));
++
++	terminal_bitmap_weight =
++		vied_nci_bitmap_compute_weight(resource_bitmap);
++	verifexit(terminal_bitmap_weight >= 0);
++	if (num_parameter_terminal_in ||
++		num_parameter_terminal_out ||
++		num_program_terminal ||
++		has_program_control_init_terminal) {
++		int skip_terminal_count = 0;
++
++		skip_terminal_count += num_parameter_terminal_in;
++		skip_terminal_count += num_parameter_terminal_out;
++		skip_terminal_count += num_program_terminal;
++		skip_terminal_count -= num_program_terminal_sequencer_info;
++		if (has_program_control_init_terminal) {
++			skip_terminal_count++;
++		}
++		verifexit(USE_SIMPLIFIED_GRAPH_MODEL ||
++			(terminal_bitmap_weight ==
++			(terminal_count - skip_terminal_count)));
++	} else
++		verifexit((terminal_bitmap_weight == terminal_count));
++
++	is_valid = true;
++EXIT:
++	if (is_valid == false) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_is_program_group_manifest_valid: failed\n");
++	}
++	return is_valid;
++}
++
++#if !defined(__HIVECC)
++int ia_css_program_group_manifest_set_kernel_bitmap(
++	ia_css_program_group_manifest_t *manifest,
++	const ia_css_kernel_bitmap_t bitmap)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_set_kernel_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->kernel_bitmap = bitmap;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_set_kernel_bitmap invalid argument\n");
++	}
++	return retval;
++}
++#endif
++
++ia_css_kernel_bitmap_t ia_css_program_group_manifest_get_kernel_bitmap(
++	const ia_css_program_group_manifest_t *manifest)
++{
++	ia_css_kernel_bitmap_t bitmap = ia_css_kernel_bitmap_clear();
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_group_manifest_get_kernel_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		bitmap = manifest->kernel_bitmap;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"ia_css_program_group_manifest_get_kernel_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++#if !defined(__HIVECC)
++void ia_css_program_group_manifest_init(
++	ia_css_program_group_manifest_t *blob,
++	const uint8_t program_count,
++	const uint8_t terminal_count,
++	const uint8_t *program_needs_extension,
++	const uint8_t *program_dependencies,
++	const uint8_t *terminal_dependencies,
++	const ia_css_terminal_type_t *terminal_type,
++	const uint16_t *cached_in_param_section_count,
++	const uint16_t *cached_out_param_section_count,
++	const uint16_t *spatial_param_section_count,
++	const uint16_t *fragment_param_section_count,
++	const uint16_t *sliced_in_param_section_count,
++	const uint16_t *sliced_out_param_section_count,
++	const uint16_t *kernel_fragment_seq_count,
++	const uint16_t *progctrlinit_load_section_counts,
++	const uint16_t *progctrlinit_connect_section_counts)
++{
++	int i = 0;
++	int j = 0;
++	int k = 0;
++	int l = 0;
++	int m = 0;
++	int n = 0;
++	int o = 0;
++	int result;
++	uint32_t offset = 0;
++	char *prg_manifest_base, *terminal_manifest_base;
++	size_t program_size = 0;
++
++	/*
++	 * assert(blob != NULL);
++	 */
++	COMPILATION_ERROR_IF(
++		SIZE_OF_DATA_TERMINAL_MANIFEST_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_data_terminal_manifest_t)));
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROGRAM_GROUP_MANIFEST_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_program_group_manifest_t)));
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROGRAM_MANIFEST_STRUCT_IN_BITS !=
++			(CHAR_BIT * sizeof(ia_css_program_manifest_t)));
++	COMPILATION_ERROR_IF(
++		SIZE_OF_PROGRAM_MANIFEST_EXT_STRUCT_IN_BYTES !=
++			(CHAR_BIT * sizeof(ia_css_program_manifest_ext_t)));
++
++	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_t)%sizeof(uint32_t));
++	COMPILATION_ERROR_IF(0 != sizeof(ia_css_program_manifest_ext_t)%sizeof(uint32_t));
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++		"ia_css_program_group_manifest_init(): enter:\n");
++
++	for (i = 0; i < (int)program_count; i++) {
++		program_size +=
++			ia_css_sizeof_program_manifest(
++				program_needs_extension[i],
++				program_dependencies[i],
++				terminal_dependencies[i]);
++	}
++
++	/* A program group ID cannot be zero */
++	blob->ID = 1;
++	blob->program_count = program_count;
++	blob->terminal_count = terminal_count;
++	blob->program_manifest_offset = sizeof(ia_css_program_group_manifest_t);
++	blob->terminal_manifest_offset =
++		(uint32_t)blob->program_manifest_offset + program_size;
++
++	prg_manifest_base = (char *)
++		(((char *)blob) + blob->program_manifest_offset);
++	offset = blob->program_manifest_offset;
++	for (i = 0; i < (int)program_count; i++) {
++		ia_css_program_manifest_init(
++			(ia_css_program_manifest_t *)prg_manifest_base,
++			program_needs_extension[i],
++			program_dependencies[i], terminal_dependencies[i]);
++		ia_css_program_manifest_set_parent_offset(
++			(ia_css_program_manifest_t *)prg_manifest_base, offset);
++		program_size =
++			ia_css_sizeof_program_manifest(
++				program_needs_extension[i],
++				program_dependencies[i],
++				terminal_dependencies[i]);
++		prg_manifest_base += program_size;
++		offset += (uint32_t)program_size;
++	}
++
++	offset = blob->terminal_manifest_offset;
++	terminal_manifest_base = (char *) (((char *)blob) + offset);
++	for (i = 0; i < (int)terminal_count; i++) {
++		size_t terminal_size = 0;
++		ia_css_terminal_manifest_t *term_manifest =
++			(ia_css_terminal_manifest_t *)terminal_manifest_base;
++
++		ia_css_terminal_manifest_set_parent_offset(
++				(ia_css_terminal_manifest_t *)
++				terminal_manifest_base,
++				offset);
++		switch (terminal_type[i]) {
++		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN:
++			result = ia_css_param_terminal_manifest_init(
++				(ia_css_param_terminal_manifest_t *)
++				term_manifest,
++				cached_in_param_section_count[j]);
++			if (0 == result) {
++				terminal_size =
++				ia_css_param_terminal_manifest_get_size(
++					cached_in_param_section_count[j]);
++				j++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_param_terminal_manifest_init failed in cached in terminal\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT:
++			result = ia_css_param_terminal_manifest_init(
++				(ia_css_param_terminal_manifest_t *)
++				term_manifest,
++				cached_out_param_section_count[k]);
++			if (0 == result) {
++				terminal_size =
++				ia_css_param_terminal_manifest_get_size(
++					cached_out_param_section_count[k]);
++				k++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_param_terminal_manifest_init failed\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN:
++		case IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT:
++			result = ia_css_spatial_param_terminal_manifest_init(
++				(ia_css_spatial_param_terminal_manifest_t *)
++				term_manifest,
++				spatial_param_section_count[l]);
++			if (0 == result) {
++				terminal_size =
++			ia_css_spatial_param_terminal_manifest_get_size(
++				spatial_param_section_count[l]);
++				l++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_spatial_param_terminal_manifest_init failed in spatial terminal\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_PROGRAM:
++			result = ia_css_program_terminal_manifest_init(
++				(ia_css_program_terminal_manifest_t *)
++				term_manifest,
++				fragment_param_section_count[m],
++				kernel_fragment_seq_count[m]);
++			if (0 == result) {
++				terminal_size =
++				ia_css_program_terminal_manifest_get_size(
++					fragment_param_section_count[m],
++					kernel_fragment_seq_count[m]);
++				m++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_program_terminal_manifest_init failed in program terminal\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT:
++			result = ia_css_program_control_init_terminal_manifest_init(
++				(ia_css_program_control_init_terminal_manifest_t *)
++				term_manifest,
++				program_count,
++				progctrlinit_load_section_counts,
++				progctrlinit_connect_section_counts);
++			if (0 == result) {
++				terminal_size =
++				ia_css_program_control_init_terminal_manifest_get_size(
++					program_count,
++					NULL,
++					NULL);
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_program_control_init_terminal_manifest_init failed\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_DATA_IN:
++		case IA_CSS_TERMINAL_TYPE_DATA_OUT:
++			terminal_size = sizeof(ia_css_data_terminal_manifest_t);
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN:
++			result = ia_css_sliced_param_terminal_manifest_init(
++				(ia_css_sliced_param_terminal_manifest_t *)
++				term_manifest,
++				sliced_in_param_section_count[n]);
++			if (0 == result) {
++				terminal_size =
++			ia_css_sliced_param_terminal_manifest_get_size(
++				sliced_in_param_section_count[n]);
++				n++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_param_terminal_manifest_init in sliced terminal failed\n");
++			}
++			break;
++		case IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT:
++			result = ia_css_sliced_param_terminal_manifest_init(
++				(ia_css_sliced_param_terminal_manifest_t *)
++				term_manifest,
++				sliced_out_param_section_count[o]);
++			if (0 == result) {
++				terminal_size =
++				ia_css_sliced_param_terminal_manifest_get_size(
++					sliced_out_param_section_count[o]);
++				n++;
++			} else {
++				IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++					"ia_css_param_terminal_manifest_init in sliced out terminal failed\n");
++			}
++			break;
++		default:
++			IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++				"ia_css_program_group_manifest_init invalid argument\n");
++		}
++		term_manifest->size = (uint16_t)terminal_size;
++		/* index: i equal to terminal ID due to sorted of the terminals array */
++		term_manifest->ID = i;
++		term_manifest->terminal_type = terminal_type[i];
++		terminal_manifest_base += terminal_size;
++		offset += (uint32_t)terminal_size;
++	}
++
++	/* Set the private program group manifest blob offset */
++	blob->private_data_offset = offset;
++	offset += ceil_mul(sizeof(struct ia_css_psys_private_pg_data),
++				sizeof(uint64_t));
++
++	/* Set the RBM manifest blob offset */
++	blob->rbm_manifest_offset = offset;
++	offset += ceil_mul(sizeof(ia_css_rbm_manifest_t),
++				sizeof(uint64_t));
++
++	assert(offset <= UINT16_MAX);
++	blob->size = (uint16_t)offset;
++}
++#endif
++
++int ia_css_program_group_manifest_print(
++	const ia_css_program_group_manifest_t *manifest,
++	void *fid)
++{
++	int retval = -1;
++	int i;
++	uint8_t program_count, terminal_count;
++	ia_css_kernel_bitmap_t bitmap;
++	struct ia_css_psys_private_pg_data *priv_data;
++	ia_css_rbm_manifest_t *rbm_manifest;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++		"ia_css_program_group_manifest_print(): enter:\n");
++
++	NOT_USED(fid);
++
++	verifexit(manifest != NULL);
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"sizeof(manifest) = %d\n",
++		(int)ia_css_program_group_manifest_get_size(manifest));
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"alignment(manifest) = %d\n",
++		(int)ia_css_program_group_manifest_get_alignment(manifest));
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"program group ID = %d\n",
++		(int)ia_css_program_group_manifest_get_program_group_ID(
++			manifest));
++
++	program_count =
++		ia_css_program_group_manifest_get_program_count(manifest);
++	terminal_count =
++		ia_css_program_group_manifest_get_terminal_count(manifest);
++
++	bitmap = ia_css_program_group_manifest_get_kernel_bitmap(manifest);
++	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"%d program manifests\n", (int)program_count);
++	for (i = 0; i < (int)program_count; i++) {
++		ia_css_program_manifest_t *program_manifest =
++			ia_css_program_group_manifest_get_prgrm_mnfst(
++				manifest, i);
++
++		retval = ia_css_program_manifest_print(program_manifest, fid);
++		verifjmpexit(retval == 0);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"%d terminal manifests\n", (int)terminal_count);
++	for (i = 0; i < (int)terminal_count; i++) {
++		ia_css_terminal_manifest_t *terminal_manifest =
++			ia_css_program_group_manifest_get_term_mnfst(
++				manifest, i);
++
++		retval = ia_css_terminal_manifest_print(
++				terminal_manifest, fid);
++		verifjmpexit(retval == 0);
++	}
++
++	priv_data =
++		(struct ia_css_psys_private_pg_data *)
++		ia_css_program_group_manifest_get_private_data(manifest);
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++		"private_data_offset %d\n", manifest->private_data_offset);
++
++	for (i = 0; i < IPU_DEVICE_GP_PSA_MUX_NUM_MUX; i++) {
++		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++			"PSA MUX id %d mux val %d\n", i,
++			priv_data->psa_mux_conf[i]);
++
++	}
++
++	for (i = 0; i < IPU_DEVICE_GP_ISA_STATIC_MUX_NUM_MUX; i++) {
++		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++			"ISA MUX id %d mux val %d\n", i,
++			priv_data->isa_mux_conf[i]);
++
++	}
++
++#ifndef IPU7_ERROR_MISSING_DISABLE_SECTION
++	for (i = 0; i < IPU_DEVICE_ACB_NUM_ACB; i++) {
++
++		if (priv_data->acb_route[i].in_select !=
++			NCI_ACB_PORT_INVALID) {
++
++			assert(priv_data->acb_route[i].in_select !=
++				NCI_ACB_PORT_INVALID &&
++				priv_data->acb_route[i].out_select !=
++				NCI_ACB_PORT_INVALID);
++
++			IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
++				"Route Cell id %d In %d Out %d\n", i,
++				priv_data->acb_route[i].in_select,
++				priv_data->acb_route[i].out_select);
++		}
++
++	}
++#endif /* IPU7_ERROR_MISSING_DISABLE_SECTION */
++
++	for (i = 0; i < MAX_INPUT_BUFFER; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: link_id = %d\n",
++				priv_data->input_buffer_info[i].link_id);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_base_addr 0x%x\n",
++				priv_data->input_buffer_info[i].buffer_base_addr);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: bpe = %d\n",
++				priv_data->input_buffer_info[i].bpe);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_width = %d\n",
++				priv_data->input_buffer_info[i].buffer_width);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: buffer_height = %d\n",
++				priv_data->input_buffer_info[i].buffer_height);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: num_of_buffers = %d\n",
++				priv_data->input_buffer_info[i].num_of_buffers);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "Input Buffer: dfm_port_addr = 0x%x\n",
++				priv_data->input_buffer_info[i].dfm_port_addr);
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "======== Input Buffer: end ===========\n");
++	}
++
++	rbm_manifest = ia_css_program_group_manifest_get_rbm_manifest((ia_css_program_group_manifest_t *)manifest);
++	ia_css_rbm_manifest_print(rbm_manifest);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_group_manifest_print failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
+new file mode 100644
+index 000000000000..9a279b28c019
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_program_manifest.c
+@@ -0,0 +1,972 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_psys_program_manifest.h>
++#include <ia_css_psys_program_group_manifest.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_print */
++#include <ia_css_kernel_bitmap.h>
++
++#include <vied_nci_psys_system_global.h>
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_psys_static_trace.h"
++
++#include <error_support.h>
++#include <misc_support.h>
++#include <storage_class.h>
++#include <math_support.h>
++
++/* *****************************************************
++ * Functions to possibly inline
++ * ******************************************************/
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_program_manifest_impl.h"
++#endif /* __IA_CSS_PSYS_STATIC_INLINE__ */
++
++/* *****************************************************
++ * Functions not to inline and available to firmware
++ * ******************************************************/
++bool ia_css_has_program_manifest_fixed_cell(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++	bool has_fixed_cell = false;
++	vied_nci_cell_ID_t cell_id;
++	vied_nci_cell_type_ID_t	cell_type_id;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_has_program_manifest_fixed_cell(): enter:\n");
++
++	verifexitval(manifest != NULL, EFAULT);
++
++	cell_id      = ia_css_program_manifest_get_cell_ID(manifest);
++	cell_type_id = ia_css_program_manifest_get_cell_type_ID(manifest);
++
++	has_fixed_cell = ((cell_id != VIED_NCI_N_CELL_ID) &&
++			  (cell_type_id == VIED_NCI_N_CELL_TYPE_ID));
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		   "ia_css_has_program_manifest_fixed_cell invalid argument\n");
++		return false;
++	}
++	return has_fixed_cell;
++}
++
++vied_nci_resource_bitmap_t ia_css_program_manifest_get_cells_bitmap(
++	const ia_css_program_manifest_t			*manifest)
++{
++	DECLARE_ERRVAL
++	vied_nci_resource_bitmap_t	bitmap = 0;
++	int i = 0;
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_cells_bitmap(): enter:\n");
++
++	verifexitval(manifest != NULL, EFAULT);
++
++	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		if (VIED_NCI_N_CELL_ID != manifest->cells[i]) {
++			bitmap |= (1 << manifest->cells[i]);
++		}
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++	}
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_get_cells_bitmap invalid argument\n");
++	}
++	return bitmap;
++}
++
++bool ia_css_is_program_manifest_subnode_program_type(
++	const ia_css_program_manifest_t *manifest)
++{
++	ia_css_program_type_t		program_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_is_program_manifest_subnode_program_type(): enter:\n");
++
++	program_type = ia_css_program_manifest_get_type(manifest);
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUB) ||
++			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUB) ||
++			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUB);
++}
++
++bool ia_css_is_program_manifest_supernode_program_type(
++	const ia_css_program_manifest_t *manifest)
++{
++	ia_css_program_type_t program_type;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++	       "ia_css_is_program_manifest_supernode_program_type(): enter:\n");
++
++	program_type = ia_css_program_manifest_get_type(manifest);
++
++/* The error return is the limit value, so no need to check on the manifest
++ * pointer
++ */
++	return (program_type == IA_CSS_PROGRAM_TYPE_PARALLEL_SUPER) ||
++			(program_type == IA_CSS_PROGRAM_TYPE_EXCLUSIVE_SUPER) ||
++			(program_type == IA_CSS_PROGRAM_TYPE_VIRTUAL_SUPER);
++}
++
++vied_nci_cell_ID_t ia_css_program_manifest_get_cell_ID(
++	const ia_css_program_manifest_t *manifest)
++{
++	DECLARE_ERRVAL
++
++	vied_nci_cell_ID_t cell_id = VIED_NCI_N_CELL_ID;
++	int i = 0;
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_get_cell_ID(): enter:\n");
++
++	verifexitval(manifest != NULL, EFAULT);
++
++	for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		assert(VIED_NCI_N_CELL_ID == manifest->cells[i]);
++#ifdef __HIVECC
++#pragma hivecc unroll
++#endif
++	}
++	cell_id = manifest->cells[0];
++EXIT:
++	if (!noerror()) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		  "ia_css_program_manifest_get_cell_ID invalid argument\n");
++		return VIED_NCI_N_CELL_ID;
++	}
++	return cell_id;
++}
++
++/* *****************************************************
++ * Functions not to inline and not available to firmware
++ * ******************************************************/
++#if !defined(__HIVECC)
++size_t ia_css_sizeof_program_manifest(
++	const uint8_t program_needs_extension,
++	const uint8_t program_dependency_count,
++	const uint8_t terminal_dependency_count)
++{
++	size_t	size = 0;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_sizeof_program_manifest(): enter:\n");
++
++	size += sizeof(ia_css_program_manifest_t);
++	if (program_needs_extension == 1) {
++		/* align manifest extension to 32 bit */
++		size = CEIL_MUL(size, sizeof(uint32_t));
++		size += sizeof(ia_css_program_manifest_ext_t);
++	}
++	size += program_dependency_count * sizeof(uint8_t);
++	size += terminal_dependency_count * sizeof(uint8_t);
++	/* align whole structure to 32 bit */
++	size = ceil_mul(size, sizeof(uint32_t));
++
++	return size;
++}
++
++int ia_css_program_manifest_set_program_ID(
++	ia_css_program_manifest_t			*manifest,
++	ia_css_program_ID_t id)
++{
++	int ret = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_program_ID(): enter:\n");
++
++	if (manifest != NULL) {
++		assert(id < UINT8_MAX && IA_CSS_PROGRAM_ID_BITS == 8);
++		manifest->ID = id;
++		ret = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++		   "ia_css_program_manifest_set_program_ID failed (%i)\n", ret);
++	}
++	return ret;
++}
++
++int ia_css_program_manifest_set_parent_offset(
++	ia_css_program_manifest_t	*manifest,
++	int32_t program_offset)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_parent_offset(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	/* parent is at negative offset away from current program offset*/
++	assert((int16_t)(-program_offset) == -program_offset);
++	manifest->parent_offset = (int16_t)(-program_offset);
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_parent_offset failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_type(
++	ia_css_program_manifest_t				*manifest,
++	const ia_css_program_type_t				program_type)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_type(): enter:\n");
++
++	if (manifest != NULL) {
++		assert(program_type < UINT8_MAX && IA_CSS_PROGRAM_TYPE_BITS == 8);
++		manifest->program_type = (ia_css_program_type_t)program_type;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++		      "ia_css_program_manifest_set_type failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_kernel_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const ia_css_kernel_bitmap_t			kernel_bitmap)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_kernel_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		manifest->kernel_bitmap = kernel_bitmap;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_kernel_bitmap failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_cell_ID(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_cell_ID_t			cell_id)
++{
++	int	retval = -1;
++	int i = 0;
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_cell_ID(): enter:\n");
++	if (manifest != NULL) {
++		manifest->cells[0] = cell_id;
++		for (i = 1; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++			manifest->cells[i] = VIED_NCI_N_CELL_ID;
++		}
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++		   "ia_css_program_manifest_set_cell_ID failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_cell_type_ID(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_cell_type_ID_t			cell_type_id)
++{
++	int	retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_cell_type_ID(): enter:\n");
++	if (manifest != NULL) {
++		manifest->cell_type_id = cell_type_id;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_cell_type_ID failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++void ia_css_program_manifest_set_input_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                   idx,
++	unsigned char                   val)
++{
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_input_terminal_id(): enter:\n");
++	if (manifest != NULL) {
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++		ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++		manifest_ext = ia_css_program_manifest_get_extension(manifest);
++		if (manifest_ext == NULL) {
++			return;
++		}
++		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
++		manifest_ext->dec_resources_input_terminal[idx] = val;
++#else
++		(void) idx;
++		(void) val;
++#endif
++	}
++}
++
++void ia_css_program_manifest_set_output_terminal_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                    idx,
++	unsigned char                    val)
++{
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_output_terminal_id(): enter:\n");
++	if (manifest != NULL) {
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++		ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++		manifest_ext = ia_css_program_manifest_get_extension(manifest);
++		if (manifest_ext == NULL) {
++			return;
++		}
++		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
++		manifest_ext->dec_resources_output_terminal[idx] = val;
++#else
++		(void) idx;
++		(void) val;
++		(void) manifest_ext;
++#endif
++	}
++}
++
++void ia_css_program_manifest_set_input_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                   idx,
++	unsigned char                   val)
++{
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_input_stream_id(): enter:\n");
++	if (manifest != NULL) {
++#if IA_CSS_MAX_INPUT_DEC_RESOURCES > 0
++		ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++		manifest_ext = ia_css_program_manifest_get_extension(manifest);
++		if (manifest_ext == NULL) {
++			return;
++		}
++		assert(idx < IA_CSS_MAX_INPUT_DEC_RESOURCES);
++		manifest_ext->dec_resources_input[idx] = val;
++#else
++		(void) idx;
++		(void) val;
++#endif
++	}
++}
++
++void ia_css_program_manifest_set_output_stream_id(
++	ia_css_program_manifest_t   *manifest,
++	unsigned char                    idx,
++	unsigned char                    val)
++{
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_output_stream_id(): enter:\n");
++	if (manifest != NULL) {
++#if IA_CSS_MAX_OUTPUT_DEC_RESOURCES > 0
++		ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++		manifest_ext = ia_css_program_manifest_get_extension(manifest);
++		if (manifest_ext == NULL) {
++			return;
++		}
++		assert(idx < IA_CSS_MAX_OUTPUT_DEC_RESOURCES);
++		manifest_ext->dec_resources_output[idx] = val;
++#else
++		(void) idx;
++		(void) val;
++#endif
++	}
++}
++
++int ia_css_program_manifest_set_cells_bitmap(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_resource_bitmap_t	bitmap)
++{
++	int retval = -1;
++	int array_index = 0;
++	int bit_index;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_cells_bitmap(): enter:\n");
++
++	if (manifest != NULL) {
++		for (bit_index = 0; bit_index < VIED_NCI_N_CELL_ID; bit_index++) {
++			if (vied_nci_is_bit_set_in_bitmap(bitmap, bit_index)) {
++				verifexit(array_index < IA_CSS_PROCESS_MAX_CELLS);
++				manifest->cells[array_index] = (vied_nci_cell_ID_t)bit_index;
++				array_index++;
++			}
++		}
++		for (; array_index < IA_CSS_PROCESS_MAX_CELLS; array_index++) {
++			manifest->cells[array_index] = VIED_NCI_N_CELL_ID;
++		}
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_set_cells_bitmap invalid argument\n");
++	}
++EXIT:
++	return retval;
++}
++
++#if HAS_DFM
++int ia_css_program_manifest_set_dfm_port_bitmap(
++	ia_css_program_manifest_t            *manifest,
++	const vied_nci_dev_dfm_id_t          dfm_type_id,
++	const vied_nci_resource_bitmap_t     bitmap)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_dfm_port_bitmap(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && bitmap == 0) {
++		return 0;
++	}
++	verifexit(manifest_ext != NULL);
++	manifest_ext->dfm_port_bitmap[dfm_type_id] = bitmap;
++	retval = 0;
++
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++				"ia_css_program_manifest_set_dfm_port_bitmap invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_dfm_active_port_bitmap(
++	ia_css_program_manifest_t           *manifest,
++	const vied_nci_dev_dfm_id_t          dfm_type_id,
++	const vied_nci_resource_bitmap_t     bitmap)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++			"ia_css_program_manifest_set_dfm_active_port_bitmap(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && bitmap == 0) {
++		return 0;
++	}
++	verifexit(manifest_ext != NULL);
++	manifest_ext->dfm_active_port_bitmap[dfm_type_id] = bitmap;
++	retval = 0;
++
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++				"ia_css_program_manifest_set_dfm_active_port_bitmap invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_is_dfm_relocatable(
++	ia_css_program_manifest_t       *manifest,
++	const vied_nci_dev_dfm_id_t      dfm_type_id,
++	const uint8_t                    is_relocatable)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++			"ia_css_program_manifest_set_is_dfm_relocatable(): enter:\n");
++
++	verifexit(manifest != NULL);
++	verifexit(dfm_type_id < VIED_NCI_N_DEV_DFM_ID);
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL) {
++		return 0;
++	}
++	manifest_ext->is_dfm_relocatable[dfm_type_id] = is_relocatable;
++	retval = 0;
++
++	EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++				"ia_css_program_manifest_set_is_dfm_relocatable invalid argument\n");
++	}
++
++	return retval;
++}
++#endif /* HAS_DFM */
++
++int ia_css_program_manifest_set_int_mem_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			int_mem_size)
++{
++	(void)manifest;
++	(void)mem_type_id;
++	if (int_mem_size != 0) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_int_mem_size should not be called"
++			"(internally memory feature not used).\n");
++		return -1;
++	}
++	return 0;
++}
++
++int ia_css_program_manifest_set_ext_mem_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			ext_mem_size)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	if (manifest == NULL) {
++		return retval;
++	}
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && ext_mem_size == 0) {
++		return 0;
++	} else if (manifest_ext == NULL) {
++		return retval;
++	}
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_ext_mem_size(): enter:\n");
++
++	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
++		manifest_ext->ext_mem_size[mem_type_id] = ext_mem_size;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_set_ext_mem_size invalid argument\n");
++	}
++
++	return retval;
++}
++
++int ia_css_program_manifest_set_ext_mem_offset(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_mem_type_ID_t			mem_type_id,
++	const vied_nci_resource_size_t			ext_mem_offset)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	if (manifest == NULL) {
++		return retval;
++	}
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && ext_mem_offset ==
++		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
++		return 0;
++	} else if (manifest_ext == NULL) {
++		return retval;
++	}
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_ext_mem_offset(): enter:\n");
++
++	if (manifest != NULL && mem_type_id < VIED_NCI_N_DATA_MEM_TYPE_ID) {
++		manifest_ext->ext_mem_offset[mem_type_id] = ext_mem_offset;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_set_ext_mem_offset invalid argument\n");
++	}
++
++	return retval;
++}
++
++int ia_css_program_manifest_set_dev_chn_size(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t			dev_chn_id,
++	const vied_nci_resource_size_t			dev_chn_size)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	if (manifest == NULL) {
++		return retval;
++	}
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && dev_chn_size == 0) {
++		return 0;
++	} else if (manifest_ext == NULL) {
++		return retval;
++	}
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_dev_chn_size(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++		manifest_ext->dev_chn_size[dev_chn_id] = dev_chn_size;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_set_dev_chn_size invalid argument\n");
++	}
++#else
++	NOT_USED(dev_chn_id);
++#endif
++	return retval;
++}
++
++int ia_css_program_manifest_set_dev_chn_offset(
++	ia_css_program_manifest_t			*manifest,
++	const vied_nci_dev_chn_ID_t			dev_chn_id,
++	const vied_nci_resource_size_t			dev_chn_offset)
++{
++	int retval = -1;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	if (manifest == NULL) {
++		return retval;
++	}
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext == NULL && dev_chn_offset ==
++		(vied_nci_resource_size_t)IA_CSS_PROGRAM_MANIFEST_RESOURCE_OFFSET_IS_RELOCATABLE) {
++		return 0;
++	} else if (manifest_ext == NULL) {
++		return retval;
++	}
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		       "ia_css_program_manifest_set_dev_chn_offset(): enter:\n");
++#ifndef IPU_SYSVER_ipu7v1
++	if (manifest != NULL && dev_chn_id < VIED_NCI_N_DEV_CHN_ID) {
++		manifest_ext->dev_chn_offset[dev_chn_id] = dev_chn_offset;
++		retval = 0;
++	} else {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++		 "ia_css_program_manifest_set_dev_chn_offset invalid argument\n");
++	}
++#else
++	NOT_USED(dev_chn_id);
++#endif
++	return retval;
++}
++
++int ia_css_program_manifest_set_program_dependency(
++	ia_css_program_manifest_t	*manifest,
++	const uint8_t			program_dependency,
++	const unsigned int		index)
++{
++	int	retval = -1;
++	uint8_t *program_dep_ptr;
++	uint8_t	program_dependency_count;
++	uint8_t	program_count;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_program_dependency(): enter:\n");
++
++	program_dependency_count =
++		ia_css_program_manifest_get_program_dependency_count(manifest);
++	program_count =
++		ia_css_program_group_manifest_get_program_count(
++			ia_css_program_manifest_get_parent(manifest));
++
++	if ((index < program_dependency_count) &&
++	    (program_dependency < program_count)) {
++		program_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++				  manifest->program_dependency_offset +
++				  index*sizeof(uint8_t));
++		 *program_dep_ptr = program_dependency;
++		retval = 0;
++	}
++
++	if (retval != 0) {
++		IA_CSS_TRACE_3(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_program_dependency(m, %d, %d) failed (%i)\n",
++			program_dependency, index, retval);
++	}
++	return retval;
++}
++
++int ia_css_program_manifest_set_terminal_dependency(
++	ia_css_program_manifest_t			*manifest,
++	const uint8_t					terminal_dependency,
++	const unsigned int				index)
++{
++	int	retval = -1;
++	uint8_t *terminal_dep_ptr;
++	uint8_t terminal_dependency_count =
++		ia_css_program_manifest_get_terminal_dependency_count(manifest);
++	uint8_t terminal_count =
++		ia_css_program_group_manifest_get_terminal_count(
++			ia_css_program_manifest_get_parent(manifest));
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_program_manifest_set_terminal_dependency(): enter:\n");
++
++	if ((index < terminal_dependency_count) &&
++			(terminal_dependency < terminal_count)) {
++		terminal_dep_ptr = (uint8_t *)((uint8_t *)manifest +
++				  manifest->terminal_dependency_offset + index);
++		 *terminal_dep_ptr = terminal_dependency;
++		retval = 0;
++	}
++
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_set_terminal_dependency failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++void ia_css_program_manifest_init(
++	ia_css_program_manifest_t	*blob,
++	const uint8_t	program_needs_extension,
++	const uint8_t	program_dependency_count,
++	const uint8_t	terminal_dependency_count)
++{
++	size_t size = 0;
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++		"ia_css_program_manifest_init(): enter:\n");
++
++	/*TODO: add assert*/
++	if (!blob)
++		return;
++
++	blob->ID = 1;
++	blob->program_dependency_count = program_dependency_count;
++	blob->terminal_dependency_count = terminal_dependency_count;
++
++	size += sizeof(ia_css_program_manifest_t);
++	if (program_needs_extension == 1) {
++		/* align start of extension to 32 bit */
++		size = CEIL_MUL(size, sizeof(uint32_t));
++		blob->program_extension_offset = size;
++		size += sizeof(ia_css_program_manifest_ext_t);
++	} else {
++		blob->program_extension_offset = 0;
++	}
++	blob->program_dependency_offset = size;
++	size += sizeof(uint8_t) * program_dependency_count;
++	blob->terminal_dependency_offset = size;
++	size += sizeof(uint8_t) * terminal_dependency_count;
++	/* align whole structure to 32 bit */
++	size = CEIL_MUL(size, sizeof(uint32_t));
++
++	blob->size = (uint8_t)ia_css_sizeof_program_manifest(
++		program_needs_extension,
++		program_dependency_count,
++		terminal_dependency_count);
++
++	assert(blob->size == size);
++	/* The following assert also implies that:
++	 * blob->program_extension_offset,
++	 * blob->program_dependency_offset,
++	 * blob->terminal_dependency_offset,
++	 * are <= UINT8_MAX
++	 */
++	assert(size <= UINT8_MAX);
++}
++
++int ia_css_program_manifest_print(
++	const ia_css_program_manifest_t *manifest,
++	void *fid)
++{
++	int			retval = -1;
++	int			i, mem_index, dev_chn_index;
++
++	vied_nci_cell_type_ID_t	cell_type_id;
++	uint8_t					program_dependency_count;
++	uint8_t					terminal_dependency_count;
++	ia_css_kernel_bitmap_t	bitmap;
++	ia_css_program_manifest_ext_t *manifest_ext = NULL;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++		       "ia_css_program_manifest_print(): enter:\n");
++
++	verifexit(manifest != NULL);
++	NOT_USED(fid);
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
++		(int)ia_css_program_manifest_get_size(manifest));
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "program ID = %d\n",
++		(int)ia_css_program_manifest_get_program_ID(manifest));
++
++	bitmap = ia_css_program_manifest_get_kernel_bitmap(manifest);
++	verifexit(ia_css_kernel_bitmap_print(bitmap, fid) == 0);
++
++	if (ia_css_has_program_manifest_fixed_cell(manifest)) {
++		vied_nci_cell_ID_t cell_id =
++				  ia_css_program_manifest_get_cell_ID(manifest);
++
++		cell_type_id = vied_nci_cell_get_type(cell_id);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell(program) = %d\n",
++			(int)cell_id);
++	} else {
++		cell_type_id =
++			ia_css_program_manifest_get_cell_type_ID(manifest);
++	}
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "cell type(program) = %d\n",
++		(int)cell_type_id);
++
++	manifest_ext = ia_css_program_manifest_get_extension(manifest);
++	if (manifest_ext != NULL) {
++	for (mem_index = 0; mem_index < (int)VIED_NCI_N_MEM_TYPE_ID;
++	     mem_index++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(internal mem) type = %d\n",
++		(int)vied_nci_cell_type_get_mem_type(cell_type_id, mem_index));
++	}
++
++	for (mem_index = 0; mem_index < (int)VIED_NCI_N_DATA_MEM_TYPE_ID;
++	     mem_index++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(external mem) type = %d\n",
++			(int)(vied_nci_mem_type_ID_t)mem_index);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(external mem) size = %d\n",
++			manifest_ext->ext_mem_size[mem_index]);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(external mem) offset = %d\n",
++			manifest_ext->ext_mem_offset[mem_index]);
++	}
++#if HAS_DFM
++	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_CHN_ID;
++	     dev_chn_index++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(device channel) type = %d\n",
++			(int)dev_chn_index);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(device channel) size = %d\n",
++			manifest_ext->dev_chn_size[dev_chn_index]);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(device channel) offset = %d\n",
++			manifest_ext->dev_chn_offset[dev_chn_index]);
++	}
++	for (dev_chn_index = 0; dev_chn_index < (int)VIED_NCI_N_DEV_DFM_ID;
++		dev_chn_index++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(dfm port) type = %d\n",
++			(int)dev_chn_index);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(dfm port) port_bitmap = %x\n",
++			manifest_ext->dfm_port_bitmap[dev_chn_index]);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(dfm port) active_port_bitmap = %x\n",
++			manifest_ext->dfm_active_port_bitmap[dev_chn_index]);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(dfm port) is_dfm_relocatable = %d\n",
++			manifest_ext->is_dfm_relocatable[dev_chn_index]);
++	}
++#else
++	NOT_USED(dev_chn_index);
++#endif /* HAS_DFM */
++#ifdef USE_DEC400
++	for (i = 0; i < IA_CSS_MAX_INPUT_DEC_RESOURCES; i++) {
++		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++			"\tEncoder stream id for idx = %d is: %d \n",
++			i,
++			manifest_ext->dec_resources_input[i]);
++
++	}
++	for (i = 0; i < IA_CSS_MAX_OUTPUT_DEC_RESOURCES; i++) {
++		IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++			"\tDecoder stream id for idx: = %d is: %d\n",
++			i,
++			manifest_ext->dec_resources_output[i]);
++
++	}
++#endif
++	}
++
++	for (i = 0; i < IA_CSS_PROCESS_MAX_CELLS; i++) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\ttype(cells) bitmap = %d\n",
++			manifest->cells[i]);
++	}
++	program_dependency_count =
++		ia_css_program_manifest_get_program_dependency_count(manifest);
++	if (program_dependency_count == 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"program_dependencies[%d] {};\n",
++			program_dependency_count);
++	} else {
++		uint8_t prog_dep;
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"program_dependencies[%d] {\n",
++			program_dependency_count);
++		for (i = 0; i < (int)program_dependency_count - 1; i++) {
++			prog_dep =
++			ia_css_program_manifest_get_program_dependency(
++				manifest, i);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"\t %4d,\n", prog_dep);
++		}
++		prog_dep =
++		ia_css_program_manifest_get_program_dependency(manifest, i);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", prog_dep);
++		(void)prog_dep;
++	}
++
++	terminal_dependency_count =
++		ia_css_program_manifest_get_terminal_dependency_count(manifest);
++	if (terminal_dependency_count == 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"terminal_dependencies[%d] {};\n",
++			terminal_dependency_count);
++	} else {
++		uint8_t term_dep;
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"terminal_dependencies[%d] {\n",
++			terminal_dependency_count);
++		for (i = 0; i < (int)terminal_dependency_count - 1; i++) {
++			term_dep =
++			ia_css_program_manifest_get_terminal_dependency(
++				manifest, i);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"\t %4d,\n", term_dep);
++		}
++		term_dep =
++		   ia_css_program_manifest_get_terminal_dependency(manifest, i);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\t %4d }\n", term_dep);
++		(void)term_dep;
++	}
++	(void)cell_type_id;
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_program_manifest_print failed (%i)\n", retval);
++	}
++	return retval;
++}
++
++#endif /* !defined(__HIVECC) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
+new file mode 100644
+index 000000000000..c71219549595
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal.c
+@@ -0,0 +1,534 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_dynamic_storage_class.h"
++#include "ia_css_psys_terminal_private_types.h"
++#include "ia_css_terminal_types.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifndef __IA_CSS_PSYS_DYNAMIC_INLINE__
++#include "ia_css_psys_terminal_impl.h"
++#endif /* __IA_CSS_PSYS_DYNAMIC_INLINE__ */
++
++/*
++ * Functions not to inline
++ */
++
++/*
++ * This source file is created with the intention of sharing and
++ * compiled for host and firmware. Since there is no native 64bit
++ * data type support for firmware this wouldn't compile for SP
++ * tile. The part of the file that is not compilable are marked
++ * with the following __VIED_CELL marker and this comment. Once we
++ * come up with a solution to address this issue this will be
++ * removed.
++ */
++#if !defined(__VIED_CELL)
++size_t ia_css_sizeof_terminal(
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_program_group_param_t *param)
++{
++    size_t size = 0;
++    uint16_t fragment_count =
++        ia_css_program_group_param_get_fragment_count(param);
++
++    COMPILATION_ERROR_IF(
++        SIZE_OF_DATA_TERMINAL_STRUCT_BITS !=
++        (CHAR_BIT * sizeof(ia_css_data_terminal_t)));
++
++    COMPILATION_ERROR_IF(
++        0 != sizeof(ia_css_data_terminal_t)%sizeof(uint64_t));
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_sizeof_terminal(): enter:\n");
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    if (ia_css_is_terminal_manifest_parameter_terminal(manifest)) {
++        const ia_css_param_terminal_manifest_t *param_term_man =
++            (const ia_css_param_terminal_manifest_t *)manifest;
++        verifexit(param_term_man != NULL);
++        if (ia_css_terminal_manifest_get_type(manifest) ==
++                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN) {
++            size = ia_css_param_in_terminal_get_descriptor_size(
++            param_term_man->param_manifest_section_desc_count);
++        } else if (ia_css_terminal_manifest_get_type(manifest) ==
++                IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++            size = ia_css_param_out_terminal_get_descriptor_size(
++            param_term_man->param_manifest_section_desc_count,
++            fragment_count);
++        } else {
++            assert(NULL == "Invalid parameter terminal type");
++            IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, ERROR,
++                "ia_css_sizeof_terminal(): Invalid parameter terminal type:\n");
++            verifjmpexit(0);
++        }
++    } else if (ia_css_is_terminal_manifest_data_terminal(manifest)) {
++        size += sizeof(ia_css_data_terminal_t);
++        size += fragment_count * sizeof(ia_css_fragment_descriptor_t);
++    } else if (ia_css_is_terminal_manifest_program_terminal(manifest)) {
++        ia_css_program_terminal_manifest_t *prog_term_man =
++            (ia_css_program_terminal_manifest_t *)manifest;
++
++        size = ia_css_program_terminal_get_descriptor_size(
++            fragment_count,
++            prog_term_man->
++            fragment_param_manifest_section_desc_count,
++            prog_term_man->
++            kernel_fragment_sequencer_info_manifest_info_count,
++            (fragment_count * prog_term_man->
++            max_kernel_fragment_sequencer_command_desc));
++    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                manifest)) {
++        ia_css_spatial_param_terminal_manifest_t *spatial_param_term =
++            (ia_css_spatial_param_terminal_manifest_t *)manifest;
++        size = ia_css_spatial_param_terminal_get_descriptor_size(
++        spatial_param_term->
++        frame_grid_param_manifest_section_desc_count,
++            fragment_count);
++    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++                manifest)) {
++        ia_css_program_control_init_terminal_manifest_t *progctrlinit_term_man =
++            (ia_css_program_control_init_terminal_manifest_t *)manifest;
++        ia_css_program_group_manifest_t *pg_manifest =
++            ia_css_terminal_manifest_get_parent(manifest);
++        ia_css_kernel_bitmap_t kernel_bitmap =
++            ia_css_program_group_param_get_kernel_enable_bitmap(param);
++
++        verifjmpexit(pg_manifest != NULL);
++        size = ia_css_program_control_init_terminal_get_descriptor_size(
++            progctrlinit_term_man, pg_manifest, kernel_bitmap);
++    }
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_sizeof_terminal invalid argument\n");
++    }
++    return size;
++}
++
++ia_css_terminal_t *ia_css_terminal_create(
++    void *raw_mem,
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_terminal_param_t *terminal_param,
++    ia_css_kernel_bitmap_t enable_bitmap)
++{
++    char *terminal_raw_ptr;
++    ia_css_terminal_t *terminal = NULL;
++    uint16_t fragment_count;
++    int i, j;
++    int retval = -1;
++    ia_css_program_group_param_t *param;
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_terminal_create(manifest %p, terminal_param %p): enter:\n",
++        manifest, terminal_param);
++
++    param = ia_css_terminal_param_get_parent(terminal_param);
++    fragment_count = ia_css_program_group_param_get_fragment_count(param);
++
++    verifexit(manifest != NULL);
++    verifexit(param != NULL);
++
++    terminal_raw_ptr = (char *) raw_mem;
++
++    terminal = (ia_css_terminal_t *) terminal_raw_ptr;
++    verifexit(terminal != NULL);
++
++    terminal->size = (uint16_t)ia_css_sizeof_terminal(manifest, param);
++    verifexit(ia_css_terminal_set_type(
++        terminal, ia_css_terminal_manifest_get_type(manifest)) == 0);
++
++    terminal->ID = ia_css_terminal_manifest_get_ID(manifest);
++
++    verifexit(ia_css_terminal_set_buffer(terminal,
++                VIED_NULL) == 0);
++
++    if (ia_css_is_terminal_manifest_data_terminal(manifest) == true) {
++        ia_css_data_terminal_t *dterminal =
++            (ia_css_data_terminal_t *)terminal;
++        ia_css_frame_t *frame =
++            ia_css_data_terminal_get_frame(dterminal);
++        ia_css_kernel_bitmap_t intersection =
++            ia_css_kernel_bitmap_intersection(enable_bitmap,
++            ia_css_data_terminal_manifest_get_kernel_bitmap(
++            (const ia_css_data_terminal_manifest_t *)manifest));
++
++        verifexit(frame != NULL);
++        verifexit(ia_css_frame_set_buffer_state(
++                frame, IA_CSS_BUFFER_NULL) == 0);
++        verifexit(ia_css_is_kernel_bitmap_onehot(intersection) ==
++                    true);
++
++        terminal_raw_ptr += sizeof(ia_css_data_terminal_t);
++        dterminal->fragment_descriptor_offset =
++            (uint16_t) (terminal_raw_ptr - (char *)terminal);
++
++        dterminal->kernel_id = 0;
++        while (!ia_css_is_kernel_bitmap_empty(intersection)) {
++            intersection = ia_css_kernel_bitmap_shift(
++                    intersection);
++            dterminal->kernel_id++;
++        }
++        assert(dterminal->kernel_id > 0);
++        dterminal->kernel_id -= 1;
++
++        /* some terminal and fragment initialization */
++        dterminal->frame_descriptor.frame_format_type =
++            terminal_param->frame_format_type;
++        for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
++            dterminal->frame_descriptor.dimension[i] =
++                terminal_param->dimensions[i];
++        }
++        dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] =
++            terminal_param->stride;
++        dterminal->frame_descriptor.bpp = terminal_param->bpp;
++        dterminal->frame_descriptor.bpe = terminal_param->bpe;
++        switch (dterminal->frame_descriptor.frame_format_type) {
++        case IA_CSS_DATA_FORMAT_UYVY:
++        case IA_CSS_DATA_FORMAT_YUYV:
++        case IA_CSS_DATA_FORMAT_YUV420_LINE:
++        case IA_CSS_DATA_FORMAT_Y800:
++        case IA_CSS_DATA_FORMAT_RGB565:
++        case IA_CSS_DATA_FORMAT_RGBA888:
++        case IA_CSS_DATA_FORMAT_BAYER_GRBG:
++        case IA_CSS_DATA_FORMAT_BAYER_RGGB:
++        case IA_CSS_DATA_FORMAT_BAYER_BGGR:
++        case IA_CSS_DATA_FORMAT_BAYER_GBRG:
++        case IA_CSS_DATA_FORMAT_RAW:
++        case IA_CSS_DATA_FORMAT_RAW_PACKED:
++        case IA_CSS_DATA_FORMAT_YYUVYY_VECTORIZED:
++        case IA_CSS_DATA_FORMAT_PAF_NON_INTERLEAVED:
++        case IA_CSS_DATA_FORMAT_PAF_INTERLEAVED:
++        case IA_CSS_DATA_FORMAT_IR:
++            dterminal->frame_descriptor.plane_count = 1;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            break;
++        case IA_CSS_DATA_FORMAT_NV12:
++        case IA_CSS_DATA_FORMAT_NV21:
++        case IA_CSS_DATA_FORMAT_NV16:
++        case IA_CSS_DATA_FORMAT_NV61:
++        case IA_CSS_DATA_FORMAT_P010:
++        case IA_CSS_DATA_FORMAT_P010_MSB:
++        case IA_CSS_DATA_FORMAT_P016:
++        case IA_CSS_DATA_FORMAT_P016_MSB:
++        case IA_CSS_DATA_FORMAT_P012_MSB:
++            dterminal->frame_descriptor.plane_count = 2;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            break;
++        case IA_CSS_DATA_FORMAT_P010_TILEY:
++        case IA_CSS_DATA_FORMAT_P016_TILEY:
++        case IA_CSS_DATA_FORMAT_P016_MSB_TILEY:
++        case IA_CSS_DATA_FORMAT_P010_MSB_TILEY:
++        case IA_CSS_DATA_FORMAT_NV12_TILEY:
++            dterminal->frame_descriptor.plane_count = 2;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                CEIL_MUL(dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION], 32);
++            break;
++        case IA_CSS_DATA_FORMAT_YUV444:
++        case IA_CSS_DATA_FORMAT_RGB888:
++        case IA_CSS_DATA_FORMAT_YUV420_VECTORIZED:
++            dterminal->frame_descriptor.plane_count = 3;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            break;
++        case IA_CSS_DATA_FORMAT_YUV420:
++        case IA_CSS_DATA_FORMAT_YV12:
++            dterminal->frame_descriptor.plane_count = 3;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION] *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            break;
++        case IA_CSS_DATA_FORMAT_BAYER_PLANAR:
++            dterminal->frame_descriptor.plane_count = 4;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            dterminal->frame_descriptor.plane_offsets[1] =
++                dterminal->frame_descriptor.plane_offsets[0] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            dterminal->frame_descriptor.plane_offsets[2] =
++                dterminal->frame_descriptor.plane_offsets[1] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/ 2;
++            dterminal->frame_descriptor.plane_offsets[3] =
++                dterminal->frame_descriptor.plane_offsets[2] +
++                dterminal->frame_descriptor.stride[IA_CSS_COL_DIMENSION]/2 *
++                dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION]/2;
++            break;
++        default:
++            /* Unset, resulting in potential terminal connect issues */
++            dterminal->frame_descriptor.plane_count = 1;
++            dterminal->frame_descriptor.plane_offsets[0] = 0;
++            break;
++        }
++        /*
++         * Initial solution for single fragment initialization
++         * TODO:
++         * where to get the fragment description params from???
++         */
++        if (fragment_count > 0) {
++            ia_css_fragment_descriptor_t *fragment_descriptor =
++                (ia_css_fragment_descriptor_t *)
++                terminal_raw_ptr;
++
++            fragment_descriptor->index[IA_CSS_COL_DIMENSION] =
++                terminal_param->index[IA_CSS_COL_DIMENSION];
++            fragment_descriptor->index[IA_CSS_ROW_DIMENSION] =
++                terminal_param->index[IA_CSS_ROW_DIMENSION];
++            fragment_descriptor->offset[0] =
++                terminal_param->offset;
++            for (i = 0; i < IA_CSS_N_DATA_DIMENSION; i++) {
++                fragment_descriptor->dimension[i] =
++                    terminal_param->fragment_dimensions[i];
++            }
++        }
++        /* end fragment stuff */
++
++        /* Set the stream2gen_buffer_size to the full frame height. Driver should override it using dynamic API if smaller buffer size is required */
++        dterminal->stream2gen_buffer_size = dterminal->frame_descriptor.dimension[IA_CSS_ROW_DIMENSION];
++    } else if (ia_css_is_terminal_manifest_parameter_terminal(manifest) ==
++            true) {
++        ia_css_param_terminal_t *pterminal =
++            (ia_css_param_terminal_t *)terminal;
++        uint16_t section_count =
++            ((const ia_css_param_terminal_manifest_t *)manifest)->
++            param_manifest_section_desc_count;
++        size_t curr_offset = 0;
++
++        pterminal->param_section_desc_offset =
++            sizeof(ia_css_param_terminal_t);
++
++        for (i = 0; i < section_count; i++) {
++            ia_css_param_section_desc_t *section =
++            ia_css_param_in_terminal_get_param_section_desc(
++                    pterminal, i);
++            const ia_css_param_manifest_section_desc_t *
++                man_section =
++        ia_css_param_terminal_manifest_get_prm_sct_desc(
++            (const ia_css_param_terminal_manifest_t *)manifest, i);
++
++            verifjmpexit(man_section != NULL);
++            verifjmpexit(section != NULL);
++
++            section->mem_size = man_section->max_mem_size;
++            section->mem_offset = curr_offset;
++            curr_offset += man_section->max_mem_size;
++        }
++    } else if (ia_css_is_terminal_manifest_program_terminal(manifest) ==
++            true &&
++        ia_css_terminal_manifest_get_type(manifest) ==
++        IA_CSS_TERMINAL_TYPE_PROGRAM) { /* for program terminal */
++        ia_css_program_terminal_t *prog_terminal =
++            (ia_css_program_terminal_t *)terminal;
++        const ia_css_program_terminal_manifest_t *prog_terminal_man =
++            (const ia_css_program_terminal_manifest_t *)manifest;
++        verifjmpexit(prog_terminal_man != NULL);
++
++        ia_css_kernel_fragment_sequencer_info_desc_t
++        *sequencer_info_desc_base = NULL;
++        uint16_t section_count = prog_terminal_man->
++        fragment_param_manifest_section_desc_count;
++        uint16_t manifest_info_count =
++            prog_terminal_man->
++            kernel_fragment_sequencer_info_manifest_info_count;
++        /* information needs to come from user or manifest once
++         * the size sizeof function is updated.
++         */
++        uint16_t nof_command_objs = 0;
++        size_t curr_offset = 0;
++
++        prog_terminal->kernel_fragment_sequencer_info_desc_offset =
++            sizeof(ia_css_program_terminal_t);
++        prog_terminal->fragment_param_section_desc_offset =
++            prog_terminal->
++            kernel_fragment_sequencer_info_desc_offset +
++            (fragment_count * manifest_info_count *
++            sizeof(ia_css_kernel_fragment_sequencer_info_desc_t)) +
++            (nof_command_objs *
++            sizeof(
++            ia_css_kernel_fragment_sequencer_command_desc_t));
++
++        NOT_USED(sequencer_info_desc_base);
++        /*Save fragments set fragment_count to 1*/
++        fragment_count = 1;
++        for (i = 0; i < fragment_count; i++) {
++            for (j = 0; j < section_count; j++) {
++                ia_css_fragment_param_section_desc_t *section =
++            ia_css_program_terminal_get_frgmnt_prm_sct_desc(
++                    prog_terminal, i, j, section_count);
++            const ia_css_fragment_param_manifest_section_desc_t *
++            man_section =
++ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc
++                (prog_terminal_man, j);
++
++                verifjmpexit(man_section != NULL);
++                verifjmpexit(section != NULL);
++
++                section->mem_size = man_section->max_mem_size;
++                section->mem_offset = curr_offset;
++                curr_offset += man_section->max_mem_size;
++            }
++
++            sequencer_info_desc_base =
++        ia_css_program_terminal_get_kernel_frgmnt_seq_info_desc(
++                    prog_terminal, i, 0,
++                    manifest_info_count);
++        prog_terminal->payload_fragment_stride = curr_offset;
++
++            /*
++             * This offset cannot be initialized properly
++             * since the number of commands in every sequencer
++             * is not known at this point
++             */
++            /*for (j = 0; j < manifest_info_count; j++) {
++                sequencer_info_desc_base[j].
++                    command_desc_offset =
++                prog_terminal->
++                kernel_fragment_sequencer_info_desc_offset +
++                (manifest_info_count *
++                sizeof(
++                ia_css_kernel_fragment_sequencer_info_desc_t) +
++                (nof_command_objs *
++                sizeof(
++                ia_css_kernel_fragment_sequencer_command_desc_t
++                ));
++            }*/
++        }
++    } else if (ia_css_is_terminal_manifest_spatial_parameter_terminal(
++                manifest) == true) {
++        ia_css_spatial_param_terminal_t *spatial_param_terminal =
++            (ia_css_spatial_param_terminal_t *)terminal;
++        ia_css_spatial_param_terminal_manifest_t *
++            spatia_param_terminal_man =
++            (ia_css_spatial_param_terminal_manifest_t *)manifest;
++
++        /* Initialize the spatial terminal structure */
++        spatial_param_terminal->fragment_grid_desc_offset =
++            sizeof(ia_css_spatial_param_terminal_t);
++        spatial_param_terminal->frame_grid_param_section_desc_offset =
++            spatial_param_terminal->fragment_grid_desc_offset +
++            (fragment_count * sizeof(ia_css_fragment_grid_desc_t));
++        spatial_param_terminal->kernel_id =
++            spatia_param_terminal_man->kernel_id;
++    } else if (ia_css_is_terminal_manifest_sliced_terminal(manifest) ==
++            true) {
++        ia_css_sliced_param_terminal_t *sliced_param_terminal =
++            (ia_css_sliced_param_terminal_t *)terminal;
++        ia_css_sliced_param_terminal_manifest_t
++        *sliced_param_terminal_man =
++            (ia_css_sliced_param_terminal_manifest_t *)manifest;
++
++        /* Initialize the sliced terminal structure */
++        sliced_param_terminal->fragment_slice_desc_offset =
++            sizeof(ia_css_sliced_param_terminal_t);
++        sliced_param_terminal->kernel_id =
++            sliced_param_terminal_man->kernel_id;
++    } else if (ia_css_is_terminal_manifest_program_control_init_terminal(
++            manifest) == true) {
++        ia_css_program_group_manifest_t *pg_manifest =
++            ia_css_terminal_manifest_get_parent(manifest);
++        ia_css_program_group_param_t *pg_param =
++            ia_css_terminal_param_get_parent(terminal_param);
++        ia_css_kernel_bitmap_t kernel_bitmap;
++
++        verifjmpexit(pg_manifest != NULL && pg_param != NULL);
++        kernel_bitmap =
++            ia_css_program_group_param_get_kernel_enable_bitmap(pg_param);
++
++        verifjmpexit(ia_css_program_control_init_terminal_init(
++            (ia_css_program_control_init_terminal_t *)
++            terminal,
++            (const ia_css_program_control_init_terminal_manifest_t *)
++            manifest, pg_manifest, kernel_bitmap) == 0);
++    } else {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_create failed, not a data or param terminal. Returning (%i)\n",
++            EFAULT);
++        goto EXIT;
++    }
++
++    IA_CSS_TRACE_2(PSYSAPI_DYNAMIC, INFO,
++                   "ia_css_terminal_create(): Created successfully terminal %p, terminal ID = %d\n", terminal,
++                   terminal->ID);
++
++    retval = 0;
++EXIT:
++    if (NULL == manifest) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_terminal_create invalid argument\n");
++    }
++    if (retval != 0) {
++        IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, ERROR,
++            "ia_css_terminal_create failed (%i)\n", retval);
++        terminal = ia_css_terminal_destroy(terminal);
++    }
++    return terminal;
++}
++
++ia_css_terminal_t *ia_css_terminal_destroy(
++    ia_css_terminal_t *terminal)
++{
++    IA_CSS_TRACE_1(PSYSAPI_DYNAMIC, INFO,
++        "ia_css_terminal_destroy(terminal %p): enter:\n", terminal);
++    return terminal;
++}
++
++uint16_t ia_css_param_terminal_compute_section_count(
++    const ia_css_terminal_manifest_t *manifest,
++    const ia_css_program_group_param_t *param) /* Delete 2nd argument*/
++{
++    uint16_t section_count = 0;
++
++    NOT_USED(param);
++
++    IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, VERBOSE,
++        "ia_css_param_terminal_compute_section_count(): enter:\n");
++
++    verifexit(manifest != NULL);
++    section_count = ((const ia_css_param_terminal_manifest_t *)manifest)->
++                param_manifest_section_desc_count;
++EXIT:
++    if (NULL == manifest || NULL == param) {
++        IA_CSS_TRACE_0(PSYSAPI_DYNAMIC, WARNING,
++            "ia_css_param_terminal_compute_section_count: invalid argument\n");
++    }
++    return section_count;
++}
++#endif /* !defined(__VIED_CELL) */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
+new file mode 100644
+index 000000000000..f0eb795707e7
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_psys_terminal_manifest.c
+@@ -0,0 +1,776 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <ia_css_psys_terminal_manifest.h>
++
++/* Data object types on the terminals */
++#include <ia_css_program_group_data.h>
++/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
++#include <ia_css_kernel_bitmap.h>
++
++#include "ia_css_psys_program_group_private.h"
++#include "ia_css_terminal_manifest.h"
++#include "ia_css_terminal_manifest_types.h"
++
++#include <error_support.h>
++#include <print_support.h>
++#include <misc_support.h>
++#include "ia_css_psys_static_trace.h"
++
++#ifndef __IA_CSS_PSYS_STATIC_INLINE__
++#include "ia_css_psys_terminal_manifest_impl.h"
++#endif
++#include "ia_css_terminal_manifest.h"
++
++/* We need to refactor those files in order to build in the firmware only
++   what is needed, switches are put current to workaround compilation problems
++   in the firmware (for example lack of uint64_t support)
++   supported in the firmware
++  */
++#if !defined(__HIVECC)
++static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
++	"IA_CSS_TERMINAL_TYPE_DATA_IN",
++	"IA_CSS_TERMINAL_TYPE_DATA_OUT",
++	"IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
++	/**< Type 1-5 parameter input */
++	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
++	/**< Type 1-5 parameter output */
++	"IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
++	/**< Represent the new type of terminal for
++	 * the "spatial dependent parameters", when params go in
++	 */
++	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
++	/**< Represent the new type of terminal for
++	 * the "spatial dependent parameters", when params go out
++	 */
++	"IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
++	/**< Represent the new type of terminal for
++	 * the explicit slicing, when params go in
++	 */
++	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
++	/**< Represent the new type of terminal for
++	 * the explicit slicing, when params go out
++	 */
++	"IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
++	/**< State (private data) input */
++	"IA_CSS_TERMINAL_TYPE_STATE_IN",
++	/**< State (private data) output */
++	"IA_CSS_TERMINAL_TYPE_STATE_OUT",
++	"IA_CSS_TERMINAL_TYPE_PROGRAM",
++	"IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
++	"UNDEFINED_TERMINAL_TYPE"};
++
++int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
++	ia_css_data_terminal_manifest_t *manifest,
++	const unsigned int index)
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");
++
++	if (manifest != NULL) {
++		ia_css_kernel_bitmap_t kernel_bitmap =
++					ia_css_kernel_bitmap_clear();
++
++		kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
++		verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
++		verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
++				manifest, kernel_bitmap) == 0);
++		retval = 0;
++	}
++
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++int ia_css_data_terminal_manifest_set_min_size(
++	ia_css_data_terminal_manifest_t	*manifest,
++	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_min_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	manifest->min_size[IA_CSS_COL_DIMENSION] =
++		min_size[IA_CSS_COL_DIMENSION];
++	manifest->min_size[IA_CSS_ROW_DIMENSION] =
++		min_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_data_terminal_manifest_set_max_size(
++	ia_css_data_terminal_manifest_t	*manifest,
++	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_max_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	manifest->max_size[IA_CSS_COL_DIMENSION] =
++		max_size[IA_CSS_COL_DIMENSION];
++	manifest->max_size[IA_CSS_ROW_DIMENSION] =
++		max_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
++	}
++	return retval;
++}
++#endif
++
++int ia_css_data_terminal_manifest_get_min_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_min_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	min_size[IA_CSS_COL_DIMENSION] =
++		manifest->min_size[IA_CSS_COL_DIMENSION];
++	min_size[IA_CSS_ROW_DIMENSION] =
++		manifest->min_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_data_terminal_manifest_get_max_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_max_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	max_size[IA_CSS_COL_DIMENSION] =
++		manifest->max_size[IA_CSS_COL_DIMENSION];
++	max_size[IA_CSS_ROW_DIMENSION] =
++		manifest->max_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
++	}
++	return retval;
++}
++
++#if !defined(__HIVECC)
++int ia_css_data_terminal_manifest_set_min_fragment_size(
++	ia_css_data_terminal_manifest_t	*manifest,
++	const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
++		min_size[IA_CSS_COL_DIMENSION];
++	manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
++		min_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_data_terminal_manifest_set_max_fragment_size(
++	ia_css_data_terminal_manifest_t	*manifest,
++	const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
++		max_size[IA_CSS_COL_DIMENSION];
++	manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
++		max_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
++	}
++	return retval;
++}
++#endif
++
++int ia_css_data_terminal_manifest_get_min_fragment_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	min_size[IA_CSS_COL_DIMENSION] =
++		manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
++	min_size[IA_CSS_ROW_DIMENSION] =
++		manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
++	}
++	return retval;
++}
++
++int ia_css_data_terminal_manifest_get_max_fragment_size(
++	const ia_css_data_terminal_manifest_t *manifest,
++	uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
++{
++	int retval = -1;
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
++		"ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");
++
++	verifexit(manifest != NULL);
++
++	max_size[IA_CSS_COL_DIMENSION] =
++		manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
++	max_size[IA_CSS_ROW_DIMENSION] =
++		manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
++	retval = 0;
++
++EXIT:
++	if (NULL == manifest) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
++			"ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
++	}
++	return retval;
++}
++
++/* We need to refactor those files in order to build in the firmware only
++   what is needed, switches are put current to workaround compilation problems
++   in the firmware (for example lack of uint64_t support)
++   supported in the firmware
++  */
++#if !defined(__HIVECC)
++
++#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
++	INFO, "%s:\t%d %d\n", \
++	(name), \
++	(var)[IA_CSS_COL_DIMENSION], \
++	(var)[IA_CSS_ROW_DIMENSION])
++
++int ia_css_terminal_manifest_print(
++	const ia_css_terminal_manifest_t *manifest,
++	void *fid)
++{
++	int retval = -1;
++	ia_css_terminal_type_t terminal_type =
++		ia_css_terminal_manifest_get_type(manifest);
++
++	IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
++		"ia_css_terminal_manifest_print(): enter:\n");
++
++	verifexit(manifest != NULL);
++	NOT_USED(fid);
++	NOT_USED(terminal_type_strings);
++
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
++		(int)ia_css_terminal_manifest_get_size(manifest));
++#ifndef __XTENSA_FW__
++	IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
++			terminal_type_strings[terminal_type]);
++#endif
++	if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
++		ia_css_param_terminal_manifest_t *pterminal_manifest =
++			(ia_css_param_terminal_manifest_t *)manifest;
++		uint16_t section_count =
++			pterminal_manifest->param_manifest_section_desc_count;
++		int	i;
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"sections(manifest) = %d\n", (int)section_count);
++		for (i = 0; i < section_count; i++) {
++			const ia_css_param_manifest_section_desc_t *manifest =
++		ia_css_param_terminal_manifest_get_prm_sct_desc(
++			pterminal_manifest, i);
++			verifjmpexit(manifest != NULL);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"mem_type_id = %d\n",
++				(int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"max_mem_size = %d\n",
++				(int)manifest->max_mem_size);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"region_id = %d\n",
++				(int)ia_css_param_manifest_section_desc_get_region_id(manifest));
++		}
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
++		ia_css_sliced_param_terminal_manifest_t
++		*sliced_terminal_manifest =
++			(ia_css_sliced_param_terminal_manifest_t *)manifest;
++		uint32_t kernel_id;
++		uint16_t section_count;
++		uint16_t section_idx;
++
++		kernel_id = sliced_terminal_manifest->kernel_id;
++		section_count =
++			sliced_terminal_manifest->sliced_param_section_count;
++
++		NOT_USED(kernel_id);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"kernel_id = %d\n", (int)kernel_id);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"section_count = %d\n", (int)section_count);
++
++		for (section_idx = 0; section_idx < section_count;
++			section_idx++) {
++			ia_css_sliced_param_manifest_section_desc_t
++				*sliced_param_manifest_section_desc;
++
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"section %d\n", (int)section_idx);
++			sliced_param_manifest_section_desc =
++		ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
++				sliced_terminal_manifest, section_idx);
++			verifjmpexit(sliced_param_manifest_section_desc !=
++				NULL);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"mem_type_id = %d\n",
++			(int)sliced_param_manifest_section_desc->mem_type_id);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"region_id = %d\n",
++			(int)sliced_param_manifest_section_desc->region_id);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"max_mem_size = %d\n",
++			(int)sliced_param_manifest_section_desc->max_mem_size);
++		}
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
++		ia_css_program_terminal_manifest_t *program_terminal_manifest =
++			(ia_css_program_terminal_manifest_t *)manifest;
++		uint32_t sequencer_info_kernel_id;
++		uint16_t max_kernel_fragment_sequencer_command_desc;
++		uint16_t kernel_fragment_sequencer_info_manifest_info_count;
++		uint16_t seq_info_idx;
++		uint16_t section_count =
++			program_terminal_manifest->fragment_param_manifest_section_desc_count;
++		uint16_t sec_idx;
++
++		sequencer_info_kernel_id =
++			program_terminal_manifest->sequencer_info_kernel_id;
++		max_kernel_fragment_sequencer_command_desc =
++			program_terminal_manifest->
++			max_kernel_fragment_sequencer_command_desc;
++		kernel_fragment_sequencer_info_manifest_info_count =
++			program_terminal_manifest->
++			kernel_fragment_sequencer_info_manifest_info_count;
++
++		NOT_USED(sequencer_info_kernel_id);
++		NOT_USED(max_kernel_fragment_sequencer_command_desc);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"sequencer_info_kernel_id = %d\n",
++			(int)sequencer_info_kernel_id);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"max_kernel_fragment_sequencer_command_desc = %d\n",
++			(int)max_kernel_fragment_sequencer_command_desc);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"kernel_fragment_sequencer_info_manifest_info_count = %d\n",
++			(int)
++			kernel_fragment_sequencer_info_manifest_info_count);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
++		for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
++			const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
++		ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
++			program_terminal_manifest, sec_idx);
++			NOT_USED(ptmanifest);
++			verifjmpexit(manifest != NULL);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"mem_type_id = %d\n",
++				(int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"max_mem_size = %d\n",
++				(int)ptmanifest->max_mem_size);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"region_id = %d\n",
++				(int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
++		}
++		for (seq_info_idx = 0; seq_info_idx <
++			kernel_fragment_sequencer_info_manifest_info_count;
++				seq_info_idx++) {
++			ia_css_kernel_fragment_sequencer_info_manifest_desc_t
++				*sequencer_info_manifest_desc;
++
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"sequencer info %d\n", (int)seq_info_idx);
++			sequencer_info_manifest_desc =
++		ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
++				(program_terminal_manifest, seq_info_idx);
++			verifjmpexit(sequencer_info_manifest_desc != NULL);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"min_fragment_grid_slice_dimension[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"max_fragment_grid_slice_dimension[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_slice_dimension[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_slice_dimension[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"min_fragment_grid_slice_count[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"max_fragment_grid_slice_count[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_slice_count[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_slice_count[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_point_decimation_factor[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_point_decimation_factor[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++			min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++			min_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++			max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++			max_fragment_grid_overlay_pixel_topleft_index[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				min_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++			IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
++				"max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_COL_DIMENSION],
++				(int)sequencer_info_manifest_desc->
++				max_fragment_grid_overlay_pixel_dimension[
++						IA_CSS_ROW_DIMENSION]);
++		}
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
++		ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
++			(ia_css_program_control_init_terminal_manifest_t *)manifest;
++		ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {
++
++		ia_css_data_terminal_manifest_t *dterminal_manifest =
++			(ia_css_data_terminal_manifest_t *)manifest;
++		int i;
++
++		NOT_USED(dterminal_manifest);
++
++		verifexit(ia_css_kernel_bitmap_print(
++			ia_css_data_terminal_manifest_get_kernel_bitmap(
++				dterminal_manifest), fid) == 0);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"formats(manifest) = %04x\n",
++		(int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
++			dterminal_manifest));
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"connection(manifest) = %04x\n",
++		(int)ia_css_data_terminal_manifest_get_connection_bitmap(
++			dterminal_manifest));
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"dependent(manifest) = %d\n",
++			(int)dterminal_manifest->terminal_dependency);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\tmin_size[%d]   = {\n",
++			IA_CSS_N_DATA_DIMENSION);
++		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"\t\t%4d,\n", dterminal_manifest->min_size[i]);
++		}
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\t\t%4d }\n", dterminal_manifest->min_size[i]);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
++		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\t\t%4d,\n", dterminal_manifest->max_size[i]);
++		}
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\t\t%4d }\n", dterminal_manifest->max_size[i]);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\tmin_fragment_size[%d]   = {\n",
++			IA_CSS_N_DATA_DIMENSION);
++		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"\t\t%4d,\n",
++				dterminal_manifest->min_fragment_size[i]);
++		}
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\t\t%4d }\n",
++			dterminal_manifest->min_fragment_size[i]);
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\tmax_fragment_size[%d]   = {\n",
++			IA_CSS_N_DATA_DIMENSION);
++		for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++				"\t\t%4d,\n",
++				dterminal_manifest->max_fragment_size[i]);
++		}
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
++			"\t\t%4d }\n",
++			dterminal_manifest->max_fragment_size[i]);
++
++	} else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
++		terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {
++
++		ia_css_spatial_param_terminal_manifest_t *stm =
++			(ia_css_spatial_param_terminal_manifest_t *)manifest;
++		ia_css_frame_grid_param_manifest_section_desc_t *sec;
++		int sec_count =
++			stm->frame_grid_param_manifest_section_desc_count;
++		int sec_index;
++
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
++			stm->kernel_id);
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
++			stm->compute_units_p_elem);
++#ifndef __XTENSA_FW__
++		PRINT_DIMENSION("min_fragment_grid_dimension",
++			stm->common_fragment_grid_desc.min_fragment_grid_dimension);
++		PRINT_DIMENSION("max_fragment_grid_dimension",
++			stm->common_fragment_grid_desc.max_fragment_grid_dimension);
++		PRINT_DIMENSION("min_frame_grid_dimension",
++			stm->frame_grid_desc.min_frame_grid_dimension);
++		PRINT_DIMENSION("max_frame_grid_dimension",
++			stm->frame_grid_desc.max_frame_grid_dimension);
++#endif
++		for (sec_index = 0; sec_index < sec_count; sec_index++) {
++			sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
++				stm, sec_index);
++			verifjmpexit(sec != NULL);
++
++			IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
++				sec->mem_type_id);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
++				sec->region_id);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
++				sec->elem_size);
++			IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
++				sec->max_mem_size);
++		}
++	} else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
++		IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
++			"terminal type can not be pretty printed, not supported\n");
++	}
++
++	retval = 0;
++EXIT:
++	if (retval != 0) {
++		IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
++			"ia_css_terminal_manifest_print failed (%i)\n",
++			retval);
++	}
++	return retval;
++}
++
++/* Program control init Terminal */
++unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
++	const ia_css_program_control_init_manifest_program_desc_t *prog)
++{
++	assert(prog);
++	return prog->connect_section_count;
++}
++
++unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
++	const ia_css_program_control_init_manifest_program_desc_t *prog)
++{
++	assert(prog);
++	return prog->load_section_count;
++}
++
++unsigned int ia_css_program_control_init_terminal_manifest_get_size(
++	const uint16_t nof_programs,
++	const uint16_t *nof_load_sections,
++	const uint16_t *nof_connect_sections)
++{
++	(void)nof_load_sections; /* might be needed in future */
++	(void)nof_connect_sections; /* might be needed in future */
++
++	return sizeof(ia_css_program_control_init_terminal_manifest_t) +
++		nof_programs *
++		sizeof(ia_css_program_control_init_manifest_program_desc_t);
++}
++
++ia_css_program_control_init_manifest_program_desc_t *
++ia_css_program_control_init_terminal_manifest_get_program_desc(
++	const ia_css_program_control_init_terminal_manifest_t *terminal,
++	unsigned int program)
++{
++	ia_css_program_control_init_manifest_program_desc_t *progs;
++
++	assert(terminal != NULL);
++	assert(program < terminal->program_count);
++
++	progs = (ia_css_program_control_init_manifest_program_desc_t *)
++		((const char *)terminal + terminal->program_desc_offset);
++
++	return &progs[program];
++}
++
++int ia_css_program_control_init_terminal_manifest_init(
++	ia_css_program_control_init_terminal_manifest_t *terminal,
++	const uint16_t nof_programs,
++	const uint16_t *nof_load_sections,
++	const uint16_t *nof_connect_sections)
++{
++	unsigned int i;
++	ia_css_program_control_init_manifest_program_desc_t *progs;
++
++	if (terminal == NULL) {
++		return -EFAULT;
++	}
++
++	terminal->program_count = nof_programs;
++	terminal->program_desc_offset =
++		sizeof(ia_css_program_control_init_terminal_manifest_t);
++
++	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
++		terminal, 0);
++
++	for (i = 0; i < nof_programs; i++) {
++		progs[i].load_section_count = nof_load_sections[i];
++		progs[i].connect_section_count = nof_connect_sections[i];
++	}
++	return 0;
++}
++
++void ia_css_program_control_init_terminal_manifest_print(
++	ia_css_program_control_init_terminal_manifest_t *terminal)
++{
++	unsigned int i;
++
++	ia_css_program_control_init_manifest_program_desc_t *progs;
++
++	progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
++		terminal, 0);
++
++	assert(progs);
++	(void)progs;
++
++	for (i = 0; i < terminal->program_count; i++) {
++		IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
++			"program index: %d, load sec: %d, connect sec: %d\n",
++			i,
++			progs[i].load_section_count,
++			progs[i].connect_section_count);
++	}
++}
++
++#endif
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
+new file mode 100644
+index 000000000000..85982fb184a4
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_rbm.c
+@@ -0,0 +1,19 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef __IA_CSS_RBM_INLINE__
++#include "ia_css_rbm_impl.h"
++#endif /* __IA_CSS_RBM_INLINE__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
+new file mode 100644
+index 000000000000..4a124962fefb
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal.c
+@@ -0,0 +1,22 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifdef __INLINE_PARAMETERS__
++#include "storage_class.h"
++STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __INLINE_PARAMETERS__ */
++#include "ia_css_terminal_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
+new file mode 100644
+index 000000000000..d051f1d38657
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/ia_css_terminal_manifest.c
+@@ -0,0 +1,22 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifdef __INLINE_PARAMETERS__
++#include "storage_class.h"
++STORAGE_CLASS_INLINE int __ia_css_param_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __INLINE_PARAMETERS__ */
++#include "ia_css_terminal_manifest_impl.h"
++#endif /* __INLINE_PARAMETERS__ */
+diff --git a/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
+new file mode 100644
+index 000000000000..8d69d999c9ba
+--- /dev/null
++++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6se/src/vied_nci_psys_system.c
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2020 Intel Corporation.
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "ia_css_psys_sim_storage_class.h"
++
++/*
++ * Functions to possibly inline
++ */
++
++#ifdef __IA_CSS_PSYS_SIM_INLINE__
++STORAGE_CLASS_INLINE int
++__ia_css_psys_system_global_avoid_warning_on_empty_file(void) { return 0; }
++#else /* __IA_CSS_PSYS_SIM_INLINE__ */
++#include "psys_system_global_impl.h"
++#endif /* __IA_CSS_PSYS_SIM_INLINE__ */
+-- 
+2.17.1
+
diff --git a/media-libs/cros-camera-hal-intel-ipu6-squash/files/99-mipicam.rules b/media-libs/cros-camera-hal-intel-ipu6-squash/files/99-mipicam.rules
new file mode 100644
index 0000000..f91eac6
--- /dev/null
+++ b/media-libs/cros-camera-hal-intel-ipu6-squash/files/99-mipicam.rules
@@ -0,0 +1,6 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+ACTION=="add", SUBSYSTEM=="video4linux", SUBSYSTEMS=="i2c", \
+  RUN+="/sbin/initctl emit --no-wait mipicam-device-added"
diff --git a/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r225.ebuild b/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r225.ebuild
deleted file mode 100644
index 8de78de..0000000
--- a/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r225.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "a8e0a9b94268e015df6ea8c92ca4151df30735a3" "65e27114752b7ab8f4cede066f4a586059bd7e61" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/ip camera/hal/usb camera/include camera/mojo common-mk metrics"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/hal/ip"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS IP camera HAL v3."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-RDEPEND="
-	media-libs/cros-camera-libcbm
-	media-libs/cros-camera-libjda
-	media-libs/libsync"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-android-headers
-	media-libs/cros-camera-libcamera_client
-	media-libs/cros-camera-libcamera_metadata
-	virtual/pkgconfig"
-
-src_install() {
-	cros-camera_dohal "${OUT}/lib/libcamera_hal.so" ip.so
-}
-
-platform_pkg_test() {
-	platform_test run "${OUT}"/request_queue_test
-}
diff --git a/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r300.ebuild b/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r300.ebuild
new file mode 100644
index 0000000..e07a0d8
--- /dev/null
+++ b/media-libs/cros-camera-hal-ip/cros-camera-hal-ip-0.0.1-r300.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "02066159cedbf2a7009bbb8c8259b7574a0d2df6" "3f2ee10a205c3f5536485cb276c251689e36c033" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/ip camera/hal/usb camera/include camera/mojo common-mk metrics"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal/ip"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS IP camera HAL v3."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+RDEPEND="
+	media-libs/cros-camera-libcbm
+	media-libs/cros-camera-libjda
+	media-libs/libsync"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-android-headers
+	media-libs/cros-camera-libcamera_client
+	media-libs/cros-camera-libcamera_metadata
+	virtual/pkgconfig"
+
+src_install() {
+	cros-camera_dohal "${OUT}/lib/libcamera_hal.so" ip.so
+}
+
+platform_pkg_test() {
+	platform_test run "${OUT}"/request_queue_test
+}
diff --git a/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r582.ebuild b/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r582.ebuild
deleted file mode 100644
index 031cb7f..0000000
--- a/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r582.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "65e27114752b7ab8f4cede066f4a586059bd7e61" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "6287b0913be5aaea79569d55d989b9b729396f10" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-# TODO(crbug.com/809389): Avoid directly including headers from other packages.
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/usb camera/include camera/mojo chromeos-config common-mk metrics"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/hal/usb"
-CROS_CAMERA_TESTS=(
-	"image_processor_test"
-)
-
-inherit cros-camera cros-workon platform udev
-
-DESCRIPTION="Chrome OS USB camera HAL v3."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="usb_camera_monocle generated_cros_config unibuild"
-
-RDEPEND="
-	dev-libs/re2
-	!media-libs/arc-camera3-hal-usb
-	media-libs/cros-camera-libcamera_client
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_exif
-	media-libs/cros-camera-libcamera_metadata
-	usb_camera_monocle? ( media-libs/librealtek-sdk )
-	media-libs/cros-camera-libcamera_timezone
-	media-libs/cros-camera-libcbm
-	media-libs/cros-camera-libjda
-	media-libs/libsync
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
-	)
-	chromeos-base/chromeos-config-tools"
-
-DEPEND="${RDEPEND}
-	chromeos-base/metrics
-	media-libs/cros-camera-android-headers
-	media-libs/libyuv
-	virtual/pkgconfig"
-
-src_install() {
-	cros-camera_dohal "${OUT}/lib/libcamera_hal.so" usb.so
-	udev_dorules udev/99-usbcam.rules
-}
diff --git a/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r688.ebuild b/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r688.ebuild
new file mode 100644
index 0000000..9545f48
--- /dev/null
+++ b/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-0.0.1-r688.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "3f2ee10a205c3f5536485cb276c251689e36c033" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+# TODO(crbug.com/809389): Avoid directly including headers from other packages.
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/hal/usb camera/include camera/mojo chromeos-config common-mk metrics"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal/usb"
+CROS_CAMERA_TESTS=(
+	"image_processor_test"
+)
+
+inherit cros-camera cros-workon platform udev
+
+DESCRIPTION="Chrome OS USB camera HAL v3."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="usb_camera_monocle generated_cros_config unibuild"
+
+RDEPEND="
+	dev-libs/re2
+	!media-libs/arc-camera3-hal-usb
+	media-libs/cros-camera-libcamera_client
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_exif
+	media-libs/cros-camera-libcamera_metadata
+	usb_camera_monocle? ( media-libs/librealtek-sdk )
+	media-libs/cros-camera-libcamera_timezone
+	media-libs/cros-camera-libcbm
+	media-libs/cros-camera-libjda
+	media-libs/libsync
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
+	)
+	chromeos-base/chromeos-config-tools"
+
+DEPEND="${RDEPEND}
+	>=chromeos-base/metrics-0.0.1-r3152
+	media-libs/cros-camera-android-headers
+	media-libs/libyuv
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	cros-camera_dohal "${OUT}/lib/libcamera_hal.so" usb.so
+	udev_dorules udev/99-usbcam.rules
+}
diff --git a/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-9999.ebuild b/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-9999.ebuild
index 80c4883..d17134d 100644
--- a/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-9999.ebuild
+++ b/media-libs/cros-camera-hal-usb/cros-camera-hal-usb-9999.ebuild
@@ -43,12 +43,13 @@
 	chromeos-base/chromeos-config-tools"
 
 DEPEND="${RDEPEND}
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	media-libs/cros-camera-android-headers
 	media-libs/libyuv
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	cros-camera_dohal "${OUT}/lib/libcamera_hal.so" usb.so
 	udev_dorules udev/99-usbcam.rules
 }
diff --git a/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r371.ebuild b/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r371.ebuild
deleted file mode 100644
index 05ef058..0000000
--- a/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r371.ebuild
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcab_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Test for camera algorithm bridge library"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	dev-cpp/gtest:=
-	!media-libs/arc-camera3-libcab-test
-	media-libs/cros-camera-libcab"
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dobin "${OUT}/libcab_test"
-	dolib.so "${OUT}/lib/libcam_algo_test.so"
-}
diff --git a/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r415.ebuild b/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r415.ebuild
new file mode 100644
index 0000000..076513e
--- /dev/null
+++ b/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-0.0.1-r415.ebuild
@@ -0,0 +1,34 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcab_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Test for camera algorithm bridge library"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	dev-cpp/gtest:=
+	!media-libs/arc-camera3-libcab-test
+	media-libs/cros-camera-libcab"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dobin "${OUT}/libcab_test"
+	dolib.so "${OUT}/lib/libcam_algo_test.so"
+}
diff --git a/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-9999.ebuild b/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-9999.ebuild
index 859b25a..d357092 100644
--- a/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-9999.ebuild
+++ b/media-libs/cros-camera-libcab-test/cros-camera-libcab-test-9999.ebuild
@@ -5,7 +5,7 @@
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
 CROS_WORKON_OUTOFTREE_BUILD="1"
 CROS_WORKON_INCREMENTAL_BUILD="1"
 
diff --git a/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r385.ebuild b/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r385.ebuild
deleted file mode 100644
index c77a3f4..0000000
--- a/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r385.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcab"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Camera algorithm bridge library for proprietary camera algorithm
-isolation"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!media-libs/arc-camera3-libcab
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_ipc"
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dobin "${OUT}/cros_camera_algo"
-
-	dolib.a "${OUT}/libcab.pic.a"
-
-	cros-camera_doheader ../../include/cros-camera/camera_algorithm.h \
-		../../include/cros-camera/camera_algorithm_bridge.h
-
-	cros-camera_dopc ../libcab.pc.template
-
-	insinto /etc/init
-	doins ../init/cros-camera-algo.conf
-
-	insinto /etc/dbus-1/system.d
-	doins ../dbus/CrosCameraAlgo.conf
-
-	insinto "/usr/share/policy"
-	newins "../cros-camera-algo-${ARCH}.policy" cros-camera-algo.policy
-}
diff --git a/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r431.ebuild b/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r431.ebuild
new file mode 100644
index 0000000..2d829af
--- /dev/null
+++ b/media-libs/cros-camera-libcab/cros-camera-libcab-0.0.1-r431.ebuild
@@ -0,0 +1,62 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcab"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Camera algorithm bridge library for proprietary camera algorithm
+isolation"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="camera_feature_portrait_mode ipu6se"
+
+RDEPEND="
+	!media-libs/arc-camera3-libcab
+	camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo )
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_ipc"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros_camera_algo"
+
+	dolib.a "${OUT}/libcab.pic.a"
+
+	cros-camera_doheader ../../include/cros-camera/camera_algorithm.h \
+		../../include/cros-camera/camera_algorithm_bridge.h
+
+	cros-camera_dopc ../libcab.pc.template
+
+	insinto /etc/init
+	doins ../init/cros-camera-algo.conf
+
+	insinto /etc/dbus-1/system.d
+	doins ../dbus/CrosCameraAlgo.conf
+
+	insinto "/usr/share/policy"
+	newins "../cros-camera-algo-${ARCH}.policy" cros-camera-algo.policy
+
+	# The sandboxed GPU service is used by Portrait Mode feature and IPU6SE
+	# camera HAL.
+	if use camera_feature_portrait_mode || use ipu6se ; then
+		insinto /etc/init
+		doins ../init/cros-camera-gpu-algo.conf
+
+		insinto "/usr/share/policy"
+		newins "../cros-camera-gpu-algo-${ARCH}.policy" cros-camera-gpu-algo.policy
+	fi
+}
diff --git a/media-libs/cros-camera-libcab/cros-camera-libcab-9999.ebuild b/media-libs/cros-camera-libcab/cros-camera-libcab-9999.ebuild
index b39ae05..f5c3d95 100644
--- a/media-libs/cros-camera-libcab/cros-camera-libcab-9999.ebuild
+++ b/media-libs/cros-camera-libcab/cros-camera-libcab-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2017 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=5
+EAPI=7
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="../platform2"
@@ -17,17 +17,19 @@
 isolation"
 
 LICENSE="BSD-Google"
-SLOT="0"
 KEYWORDS="~*"
+IUSE="camera_feature_portrait_mode ipu6se"
 
 RDEPEND="
 	!media-libs/arc-camera3-libcab
+	camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo )
 	media-libs/cros-camera-libcamera_common
 	media-libs/cros-camera-libcamera_ipc"
 
 DEPEND="${RDEPEND}"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros_camera_algo"
 
 	dolib.a "${OUT}/libcab.pic.a"
@@ -45,4 +47,14 @@
 
 	insinto "/usr/share/policy"
 	newins "../cros-camera-algo-${ARCH}.policy" cros-camera-algo.policy
+
+	# The sandboxed GPU service is used by Portrait Mode feature and IPU6SE
+	# camera HAL.
+	if use camera_feature_portrait_mode || use ipu6se ; then
+		insinto /etc/init
+		doins ../init/cros-camera-gpu-algo.conf
+
+		insinto "/usr/share/policy"
+		newins "../cros-camera-gpu-algo-${ARCH}.policy" cros-camera-gpu-algo.policy
+	fi
 }
diff --git a/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r112.ebuild b/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r112.ebuild
deleted file mode 100644
index 8f8c794..0000000
--- a/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r112.ebuild
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcam_gpu_algo"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera GPU algorithm library."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcam_gpu_algo.so"
-
-	insinto /etc/init
-	doins ../init/cros-camera-gpu-algo.conf
-
-	insinto "/usr/share/policy"
-	newins "../cros-camera-gpu-algo-${ARCH}.policy" cros-camera-gpu-algo.policy
-}
diff --git a/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r156.ebuild b/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r156.ebuild
new file mode 100644
index 0000000..2f01c86
--- /dev/null
+++ b/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-0.0.1-r156.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcam_gpu_algo"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera GPU algorithm library."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="media-libs/cros-camera-effect-portrait-mode"
+
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dolib.so "${OUT}/lib/libcam_gpu_algo.so"
+}
diff --git a/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-9999.ebuild b/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-9999.ebuild
index e84a7dc..4bf64ee 100644
--- a/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-9999.ebuild
+++ b/media-libs/cros-camera-libcam_gpu_algo/cros-camera-libcam_gpu_algo-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright 2019 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="../platform2"
@@ -16,19 +16,12 @@
 DESCRIPTION="Chrome OS camera GPU algorithm library."
 
 LICENSE="BSD-Google"
-SLOT="0"
 KEYWORDS="~*"
 
-RDEPEND=""
+RDEPEND="media-libs/cros-camera-effect-portrait-mode"
 
 DEPEND="${RDEPEND}"
 
 src_install() {
 	dolib.so "${OUT}/lib/libcam_gpu_algo.so"
-
-	insinto /etc/init
-	doins ../init/cros-camera-gpu-algo.conf
-
-	insinto "/usr/share/policy"
-	newins "../cros-camera-gpu-algo-${ARCH}.policy" cros-camera-gpu-algo.policy
 }
diff --git a/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r224.ebuild b/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r224.ebuild
deleted file mode 100644
index afeba32..0000000
--- a/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r224.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "e35f965a2c3451a2fe74ceb04da2875e20d17f95" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/android common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/android/libcamera_client"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Android libcamera_client"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!media-libs/arc-camera3-libcamera_client
-	media-libs/cros-camera-libcamera_metadata"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-android-headers"
-
-src_install() {
-	local INCLUDE_DIR="/usr/include/android"
-	local LIB_DIR="/usr/$(get_libdir)"
-	local PC_FILE_TEMPLATE=libcamera_client.pc.template
-	local PC_FILE="${WORKDIR}/${PC_FILE_TEMPLATE##*/}"
-	PC_FILE="${PC_FILE%%.template}"
-
-	dolib.so "${OUT}/lib/libcamera_client.so"
-
-	insinto "${INCLUDE_DIR}/camera"
-	doins include/camera/*.h
-
-	sed -e "s|@INCLUDE_DIR@|${INCLUDE_DIR}|" -e "s|@LIB_DIR@|${LIB_DIR}|" \
-		"${PC_FILE_TEMPLATE}" > "${PC_FILE}"
-	insinto "${LIB_DIR}/pkgconfig"
-	doins "${PC_FILE}"
-}
diff --git a/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r245.ebuild b/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r245.ebuild
new file mode 100644
index 0000000..a2453ef
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-0.0.1-r245.ebuild
@@ -0,0 +1,48 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "e35f965a2c3451a2fe74ceb04da2875e20d17f95" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/android common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/android/libcamera_client"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Android libcamera_client"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	!media-libs/arc-camera3-libcamera_client
+	media-libs/cros-camera-libcamera_metadata"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-android-headers"
+
+src_install() {
+	platform_src_install
+	local INCLUDE_DIR="/usr/include/android"
+	local LIB_DIR="/usr/$(get_libdir)"
+	local PC_FILE_TEMPLATE=libcamera_client.pc.template
+	local PC_FILE="${WORKDIR}/${PC_FILE_TEMPLATE##*/}"
+	PC_FILE="${PC_FILE%%.template}"
+
+	dolib.so "${OUT}/lib/libcamera_client.so"
+
+	insinto "${INCLUDE_DIR}/camera"
+	doins include/camera/*.h
+
+	sed -e "s|@INCLUDE_DIR@|${INCLUDE_DIR}|" -e "s|@LIB_DIR@|${LIB_DIR}|" \
+		"${PC_FILE_TEMPLATE}" > "${PC_FILE}"
+	insinto "${LIB_DIR}/pkgconfig"
+	doins "${PC_FILE}"
+}
diff --git a/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-9999.ebuild b/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-9999.ebuild
index bb0ad5f..c39b03d 100644
--- a/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_client/cros-camera-libcamera_client-9999.ebuild
@@ -27,6 +27,7 @@
 	media-libs/cros-camera-android-headers"
 
 src_install() {
+	platform_src_install
 	local INCLUDE_DIR="/usr/include/android"
 	local LIB_DIR="/usr/$(get_libdir)"
 	local PC_FILE_TEMPLATE=libcamera_client.pc.template
diff --git a/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r372.ebuild b/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r372.ebuild
deleted file mode 100644
index 53052e6..0000000
--- a/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r372.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_common"
-CROS_CAMERA_TESTS=(
-	"future_test"
-)
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS HAL common util."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!media-libs/arc-camera3-libcamera_common
-	virtual/libudev"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_common.so"
-
-	cros-camera_doheader ../../include/cros-camera/common.h \
-		../../include/cros-camera/constants.h \
-		../../include/cros-camera/export.h \
-		../../include/cros-camera/future.h \
-		../../include/cros-camera/future_internal.h \
-		../../include/cros-camera/camera_thread.h
-
-	cros-camera_dopc ../libcamera_common.pc.template
-}
diff --git a/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r417.ebuild b/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r417.ebuild
new file mode 100644
index 0000000..9e20827
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-0.0.1-r417.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_common"
+CROS_CAMERA_TESTS=(
+	"future_test"
+)
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS HAL common util."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	!media-libs/arc-camera3-libcamera_common
+	virtual/libudev"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcamera_common.so"
+
+	cros-camera_doheader ../../include/cros-camera/common.h \
+		../../include/cros-camera/constants.h \
+		../../include/cros-camera/cros_camera_hal.h \
+		../../include/cros-camera/export.h \
+		../../include/cros-camera/future.h \
+		../../include/cros-camera/future_internal.h \
+		../../include/cros-camera/camera_thread.h
+
+	cros-camera_dopc ../libcamera_common.pc.template
+}
diff --git a/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-9999.ebuild b/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-9999.ebuild
index a32d87b..a84bd36 100644
--- a/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_common/cros-camera-libcamera_common-9999.ebuild
@@ -30,10 +30,12 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcamera_common.so"
 
 	cros-camera_doheader ../../include/cros-camera/common.h \
 		../../include/cros-camera/constants.h \
+		../../include/cros-camera/cros_camera_hal.h \
 		../../include/cros-camera/export.h \
 		../../include/cros-camera/future.h \
 		../../include/cros-camera/future_internal.h \
diff --git a/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r119.ebuild b/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r119.ebuild
new file mode 100644
index 0000000..d7aa7d3
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r119.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_connector"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera connector for simpler uses."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+BDEPEND="virtual/pkgconfig"
+
+RDEPEND="
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_ipc
+	media-libs/cros-camera-libcamera_metadata
+	media-libs/libsync"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-android-headers
+	media-libs/cros-camera-libcamera_connector_headers
+	x11-libs/libdrm"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcamera_connector.so"
+	cros-camera_dopc ../libcamera_connector.pc.template
+}
+
diff --git a/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r75.ebuild b/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r75.ebuild
deleted file mode 100644
index 7563039..0000000
--- a/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-0.0.1-r75.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_connector"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera connector for simpler uses."
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-BDEPEND="virtual/pkgconfig"
-
-RDEPEND="
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_ipc
-	media-libs/cros-camera-libcamera_metadata
-	media-libs/libsync"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-android-headers
-	media-libs/cros-camera-libcamera_connector_headers
-	x11-libs/libdrm"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_connector.so"
-	cros-camera_dopc ../libcamera_connector.pc.template
-}
-
diff --git a/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-9999.ebuild b/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-9999.ebuild
index de0b155..5066c18 100644
--- a/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_connector/cros-camera-libcamera_connector-9999.ebuild
@@ -32,6 +32,7 @@
 	x11-libs/libdrm"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcamera_connector.so"
 	cros-camera_dopc ../libcamera_connector.pc.template
 }
diff --git a/media-libs/cros-camera-libcamera_connector_headers/Manifest b/media-libs/cros-camera-libcamera_connector_headers/Manifest
index d397340..3d32336 100644
--- a/media-libs/cros-camera-libcamera_connector_headers/Manifest
+++ b/media-libs/cros-camera-libcamera_connector_headers/Manifest
@@ -1 +1 @@
-DIST cros-camera-libcamera_connector_headers-0.0.1.tar.gz 3253 BLAKE2B 100372e8bc1bf3189a804005ce669dde7f36ffa7552b87e2cbdad6bcab6788570d82e5020216363368f9ac666f880adbb9258e4f518a2d490e56c1c5456f2fa9 SHA512 032651d58b23b1cc4b7d919b24148f894a193ce4418368f76c3342b663a196d57fd5c59802a8838663f3a26aee61cf4a15806cd6418937fd637bdd4bc56179b4
+DIST cros-camera-libcamera_connector_headers-0.0.4.tar.gz 3386 BLAKE2B fb2165c8a54d8fbc6ae0ea49b7dd9ee7d7fb01475ece099e82e7b8f6d5f7c9520b62a2062a62623475ccea29f70603c2677ca0f56ad0f26c1d6745083515d602 SHA512 2f1f4622d03ee4c3a225a2c302f672c75ba4e4b1535486a80ddac9e54deff422c0edfc6e369fd7f4de3986c3059d9489a28edaea1832c161f290de5a1f96477f
diff --git a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1-r2.ebuild b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1-r2.ebuild
deleted file mode 120000
index 9fad723..0000000
--- a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1-r2.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-cros-camera-libcamera_connector_headers-0.0.1.ebuild
\ No newline at end of file
diff --git a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1.ebuild b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1.ebuild
deleted file mode 100644
index 38daeb5..0000000
--- a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.1.ebuild
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="Installs header files for cros-camera-libcamera_connector."
-SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.gz"
-
-LICENSE="LICENSE.corel"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-S="${WORKDIR}/${PN}"
-# Versions before r62 install camera_service_connector.h, which causes a file
-# conflict with this package.
-RDEPEND="!<media-libs/cros-camera-libcamera_connector-0.0.1-r62"
-
-src_install() {
-	insinto "/usr/include/cros-camera"
-	doins "camera_service_connector.h"
-}
-
diff --git a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4-r1.ebuild b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4-r1.ebuild
new file mode 120000
index 0000000..acc2304
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4-r1.ebuild
@@ -0,0 +1 @@
+cros-camera-libcamera_connector_headers-0.0.4.ebuild
\ No newline at end of file
diff --git a/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4.ebuild b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4.ebuild
new file mode 100644
index 0000000..35e013a
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_connector_headers/cros-camera-libcamera_connector_headers-0.0.4.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="Installs header files for cros-camera-libcamera_connector."
+SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.gz"
+
+LICENSE="LICENSE.parallels"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+S="${WORKDIR}/${PN}"
+# Versions before r62 install camera_service_connector.h, which causes a file
+# conflict with this package.
+RDEPEND="!<media-libs/cros-camera-libcamera_connector-0.0.1-r62"
+
+src_install() {
+	insinto "/usr/include/cros-camera"
+	doins "camera_service_connector.h"
+}
+
diff --git a/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r54.ebuild b/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r54.ebuild
deleted file mode 100644
index 55b97df..0000000
--- a/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r54.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_connector_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera connector test."
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-RDEPEND="
-	media-libs/cros-camera-libcamera_connector
-	dev-cpp/gtest:=
-	media-libs/libyuv
-	virtual/jpeg:0"
-
-DEPEND="${RDEPEND}"
-
-BDEPEND="virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/cros_camera_connector_test"
-}
diff --git a/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r98.ebuild b/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r98.ebuild
new file mode 100644
index 0000000..a00bbbd
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-0.0.1-r98.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_connector_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera connector test."
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+RDEPEND="
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_connector
+	dev-cpp/gtest:=
+	media-libs/libyuv
+	virtual/jpeg:0"
+
+DEPEND="${RDEPEND}"
+
+BDEPEND="virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros_camera_connector_test"
+}
diff --git a/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-9999.ebuild b/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-9999.ebuild
index 573b85f..cff452c 100644
--- a/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_connector_test/cros-camera-libcamera_connector_test-9999.ebuild
@@ -19,6 +19,7 @@
 KEYWORDS="~*"
 
 RDEPEND="
+	media-libs/cros-camera-libcamera_common
 	media-libs/cros-camera-libcamera_connector
 	dev-cpp/gtest:=
 	media-libs/libyuv
@@ -29,5 +30,6 @@
 BDEPEND="virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros_camera_connector_test"
 }
diff --git a/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r370.ebuild b/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r370.ebuild
deleted file mode 100644
index d379df2..0000000
--- a/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r370.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_exif"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera HAL exif util."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!media-libs/arc-camera3-libcamera_exif
-	media-libs/libexif"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_exif.so"
-
-	cros-camera_doheader ../../include/cros-camera/exif_utils.h
-
-	cros-camera_dopc ../libcamera_exif.pc.template
-}
diff --git a/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r414.ebuild b/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r414.ebuild
new file mode 100644
index 0000000..00a9d93
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-0.0.1-r414.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_exif"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera HAL exif util."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	!media-libs/arc-camera3-libcamera_exif
+	media-libs/libexif"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcamera_exif.so"
+
+	cros-camera_doheader ../../include/cros-camera/exif_utils.h
+
+	cros-camera_dopc ../libcamera_exif.pc.template
+}
diff --git a/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-9999.ebuild b/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-9999.ebuild
index 7625338..db27a99 100644
--- a/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_exif/cros-camera-libcamera_exif-9999.ebuild
@@ -27,6 +27,7 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcamera_exif.so"
 
 	cros-camera_doheader ../../include/cros-camera/exif_utils.h
diff --git a/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r377.ebuild b/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r377.ebuild
deleted file mode 100644
index 59e83f3..0000000
--- a/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r377.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_ipc"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS HAL IPC util."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="media-libs/cros-camera-libcamera_metadata"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-libcamera_common
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_ipc.so"
-	dolib.a "${OUT}/libcamera_ipc_mojom.a"
-
-	cros-camera_doheader \
-		../../include/cros-camera/camera_mojo_channel_manager.h \
-		../../include/cros-camera/ipc_util.h
-
-	cros-camera_dopc ../libcamera_ipc.pc.template
-}
diff --git a/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r421.ebuild b/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r421.ebuild
new file mode 100644
index 0000000..d401619
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-0.0.1-r421.ebuild
@@ -0,0 +1,40 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_ipc"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS HAL IPC util."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="media-libs/cros-camera-libcamera_metadata"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-libcamera_common
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcamera_ipc.so"
+	dolib.a "${OUT}/libcamera_ipc_mojom.a"
+
+	cros-camera_doheader \
+		../../include/cros-camera/camera_mojo_channel_manager.h \
+		../../include/cros-camera/ipc_util.h
+
+	cros-camera_dopc ../libcamera_ipc.pc.template
+}
diff --git a/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-9999.ebuild b/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-9999.ebuild
index c9549a7..2a5f37f 100644
--- a/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_ipc/cros-camera-libcamera_ipc-9999.ebuild
@@ -26,6 +26,7 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcamera_ipc.so"
 	dolib.a "${OUT}/libcamera_ipc_mojom.a"
 
diff --git a/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r224.ebuild b/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r224.ebuild
deleted file mode 100644
index 3a4201d..0000000
--- a/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r224.ebuild
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "e35f965a2c3451a2fe74ceb04da2875e20d17f95" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/android common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/android/libcamera_metadata"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Android libcamera_metadata"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND="!media-libs/arc-camera3-libcamera_metadata"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-android-headers"
-
-src_install() {
-	local INCLUDE_DIR="/usr/include/android"
-	local LIB_DIR="/usr/$(get_libdir)"
-	local PC_FILE_TEMPLATE="libcamera_metadata.pc.template"
-	local PC_FILE="${WORKDIR}/${PC_FILE_TEMPLATE##*/}"
-	PC_FILE="${PC_FILE%%.template}"
-
-	dolib.so "${OUT}/lib/libcamera_metadata.so"
-
-	insinto "${INCLUDE_DIR}/system"
-	doins "include/system"/*.h
-	# Install into the system folder to avoid cros lint complaint of "include the
-	# directory when naming .h files"
-	doins "include/camera_metadata_hidden.h"
-
-	sed -e "s|@INCLUDE_DIR@|${INCLUDE_DIR}|" -e "s|@LIB_DIR@|${LIB_DIR}|" \
-		"${PC_FILE_TEMPLATE}" > "${PC_FILE}"
-	insinto "${LIB_DIR}/pkgconfig"
-	doins "${PC_FILE}"
-}
diff --git a/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r245.ebuild b/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r245.ebuild
new file mode 100644
index 0000000..9326d87
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-0.0.1-r245.ebuild
@@ -0,0 +1,50 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "e35f965a2c3451a2fe74ceb04da2875e20d17f95" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/android common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/android/libcamera_metadata"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Android libcamera_metadata"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND="!media-libs/arc-camera3-libcamera_metadata"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-android-headers"
+
+src_install() {
+	platform_src_install
+	local INCLUDE_DIR="/usr/include/android"
+	local LIB_DIR="/usr/$(get_libdir)"
+	local PC_FILE_TEMPLATE="libcamera_metadata.pc.template"
+	local PC_FILE="${WORKDIR}/${PC_FILE_TEMPLATE##*/}"
+	PC_FILE="${PC_FILE%%.template}"
+
+	dolib.so "${OUT}/lib/libcamera_metadata.so"
+
+	insinto "${INCLUDE_DIR}/system"
+	doins "include/system"/*.h
+	# Install into the system folder to avoid cros lint complaint of "include the
+	# directory when naming .h files"
+	doins "include/camera_metadata_hidden.h"
+
+	sed -e "s|@INCLUDE_DIR@|${INCLUDE_DIR}|" -e "s|@LIB_DIR@|${LIB_DIR}|" \
+		"${PC_FILE_TEMPLATE}" > "${PC_FILE}"
+	insinto "${LIB_DIR}/pkgconfig"
+	doins "${PC_FILE}"
+}
diff --git a/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-9999.ebuild b/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-9999.ebuild
index 71e96f8..9afe9d1 100644
--- a/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_metadata/cros-camera-libcamera_metadata-9999.ebuild
@@ -26,6 +26,7 @@
 	media-libs/cros-camera-android-headers"
 
 src_install() {
+	platform_src_install
 	local INCLUDE_DIR="/usr/include/android"
 	local LIB_DIR="/usr/$(get_libdir)"
 	local PC_FILE_TEMPLATE="libcamera_metadata.pc.template"
diff --git a/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r370.ebuild b/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r370.ebuild
deleted file mode 100644
index 6b5dc7b..0000000
--- a/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r370.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcamera_timezone"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera HAL Time zone util."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="!media-libs/arc-camera3-libcamera_timezone"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_timezone.so"
-
-	cros-camera_doheader ../../include/cros-camera/timezone.h
-
-	cros-camera_dopc ../libcamera_timezone.pc.template
-}
diff --git a/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r414.ebuild b/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r414.ebuild
new file mode 100644
index 0000000..ecfb43d
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-0.0.1-r414.ebuild
@@ -0,0 +1,36 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcamera_timezone"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera HAL Time zone util."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="!media-libs/arc-camera3-libcamera_timezone"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcamera_timezone.so"
+
+	cros-camera_doheader ../../include/cros-camera/timezone.h
+
+	cros-camera_dopc ../libcamera_timezone.pc.template
+}
diff --git a/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-9999.ebuild b/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-9999.ebuild
index 366c5aa..9266dea 100644
--- a/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-9999.ebuild
+++ b/media-libs/cros-camera-libcamera_timezone/cros-camera-libcamera_timezone-9999.ebuild
@@ -25,6 +25,7 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcamera_timezone.so"
 
 	cros-camera_doheader ../../include/cros-camera/timezone.h
diff --git a/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r274.ebuild b/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r274.ebuild
deleted file mode 100644
index bc58f2f..0000000
--- a/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r274.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "216b7541a029e8b42b69dcb77b4a43309868a9b1" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common/v4l2_device camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/v4l2_device"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera HAL v3 V4L2 device utility."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND=""
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcamera_v4l2_device.so"
-
-	cros-camera_doheader ../../include/cros-camera/v4l2_device.h
-
-	cros-camera_dopc libcamera_v4l2_device.pc.template
-}
diff --git a/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r301.ebuild b/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r301.ebuild
new file mode 100644
index 0000000..471a2da
--- /dev/null
+++ b/media-libs/cros-camera-libcamera_v4l2_device/cros-camera-libcamera_v4l2_device-0.0.1-r301.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "fc362cef3265b6ee77ccda3fa97a63a4431aec9c" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common/v4l2_device camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/v4l2_device"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera HAL v3 V4L2 device utility."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND=""
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	dolib.so "${OUT}/lib/libcamera_v4l2_device.so"
+
+	cros-camera_doheader ../../include/cros-camera/v4l2_device.h
+
+	cros-camera_dopc libcamera_v4l2_device.pc.template
+}
diff --git a/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r371.ebuild b/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r371.ebuild
deleted file mode 100644
index de4cb54..0000000
--- a/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r371.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/libcbm"
-CROS_CAMERA_TESTS=(
-	"cbm_unittest"
-)
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera HAL buffer manager."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	!media-libs/arc-camera3-libcbm
-	media-libs/minigbm
-	x11-libs/libdrm"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-android-headers
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.so "${OUT}/lib/libcbm.so"
-
-	cros-camera_doheader ../../include/cros-camera/camera_buffer_manager.h
-
-	cros-camera_dopc ../libcbm.pc.template
-}
diff --git a/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r415.ebuild b/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r415.ebuild
new file mode 100644
index 0000000..4036586
--- /dev/null
+++ b/media-libs/cros-camera-libcbm/cros-camera-libcbm-0.0.1-r415.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/libcbm"
+CROS_CAMERA_TESTS=(
+	"cbm_unittest"
+)
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera HAL buffer manager."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	!media-libs/arc-camera3-libcbm
+	media-libs/minigbm
+	x11-libs/libdrm"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-android-headers
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.so "${OUT}/lib/libcbm.so"
+
+	cros-camera_doheader ../../include/cros-camera/camera_buffer_manager.h
+
+	cros-camera_dopc ../libcbm.pc.template
+}
diff --git a/media-libs/cros-camera-libcbm/cros-camera-libcbm-9999.ebuild b/media-libs/cros-camera-libcbm/cros-camera-libcbm-9999.ebuild
index 7f443e3..e15a3f3 100644
--- a/media-libs/cros-camera-libcbm/cros-camera-libcbm-9999.ebuild
+++ b/media-libs/cros-camera-libcbm/cros-camera-libcbm-9999.ebuild
@@ -32,6 +32,7 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.so "${OUT}/lib/libcbm.so"
 
 	cros-camera_doheader ../../include/cros-camera/camera_buffer_manager.h
diff --git a/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r423.ebuild b/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r423.ebuild
deleted file mode 100644
index 13625a5..0000000
--- a/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r423.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk metrics"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/jpeg/libjda"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Library for using JPEG Decode Accelerator in Chrome"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_ipc"
-
-# cros-camera-libcbm is needed here because this package uses
-# //camera/common:libcamera_metrics rule. It doesn't directly use the package,
-# but another rule in that BUILD.gn requires libcbm upon opening the .gn file.
-# See crbug.com/995162 for detail.
-DEPEND="${RDEPEND}
-	chromeos-base/metrics
-	media-libs/cros-camera-libcbm
-	media-libs/libyuv
-	virtual/pkgconfig"
-
-src_install() {
-	dolib.a "${OUT}/libjda.pic.a"
-
-	cros-camera_doheader ../../../include/cros-camera/jpeg_decode_accelerator.h
-
-	cros-camera_dopc ../libjda.pc.template
-}
diff --git a/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r478.ebuild b/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r478.ebuild
new file mode 100644
index 0000000..f09796d
--- /dev/null
+++ b/media-libs/cros-camera-libjda/cros-camera-libjda-0.0.1-r478.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk metrics"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/jpeg/libjda"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Library for using JPEG Decode Accelerator in Chrome"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_ipc"
+
+# cros-camera-libcbm is needed here because this package uses
+# //camera/common:libcamera_metrics rule. It doesn't directly use the package,
+# but another rule in that BUILD.gn requires libcbm upon opening the .gn file.
+# See crbug.com/995162 for detail.
+DEPEND="${RDEPEND}
+	>=chromeos-base/metrics-0.0.1-r3152
+	media-libs/cros-camera-libcbm
+	media-libs/libyuv
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dolib.a "${OUT}/libjda.pic.a"
+
+	cros-camera_doheader ../../../include/cros-camera/jpeg_decode_accelerator.h
+
+	cros-camera_dopc ../libjda.pc.template
+}
diff --git a/media-libs/cros-camera-libjda/cros-camera-libjda-9999.ebuild b/media-libs/cros-camera-libjda/cros-camera-libjda-9999.ebuild
index 60f4a87..2d0caf5 100644
--- a/media-libs/cros-camera-libjda/cros-camera-libjda-9999.ebuild
+++ b/media-libs/cros-camera-libjda/cros-camera-libjda-9999.ebuild
@@ -28,12 +28,13 @@
 # but another rule in that BUILD.gn requires libcbm upon opening the .gn file.
 # See crbug.com/995162 for detail.
 DEPEND="${RDEPEND}
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	media-libs/cros-camera-libcbm
 	media-libs/libyuv
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dolib.a "${OUT}/libjda.pic.a"
 
 	cros-camera_doheader ../../../include/cros-camera/jpeg_decode_accelerator.h
diff --git a/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r374.ebuild b/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r374.ebuild
deleted file mode 100644
index 0693a47..0000000
--- a/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r374.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/jpeg/libjda_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="End to end test for JPEG decode accelerator"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="dev-cpp/gtest"
-
-DEPEND="${RDEPEND}
-	media-libs/cros-camera-libjda"
-
-src_install() {
-	dobin "${OUT}/libjda_test"
-}
diff --git a/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r418.ebuild b/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r418.ebuild
new file mode 100644
index 0000000..0f5f624
--- /dev/null
+++ b/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-0.0.1-r418.ebuild
@@ -0,0 +1,32 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/jpeg/libjda_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="End to end test for JPEG decode accelerator"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="dev-cpp/gtest"
+
+DEPEND="${RDEPEND}
+	media-libs/cros-camera-libjda"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/libjda_test"
+}
diff --git a/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-9999.ebuild b/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-9999.ebuild
index d816fe9..a9489ae 100644
--- a/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-9999.ebuild
+++ b/media-libs/cros-camera-libjda_test/cros-camera-libjda_test-9999.ebuild
@@ -25,5 +25,6 @@
 	media-libs/cros-camera-libjda"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/libjda_test"
 }
diff --git a/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r400.ebuild b/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r400.ebuild
deleted file mode 100644
index 7137c0b..0000000
--- a/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r400.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e" "7e189936f29d145c4191ea147e48256c92fac75d")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk metrics"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/common/jpeg/libjea_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="End to end test for JPEG encode accelerator"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/metrics
-	dev-cpp/gtest:=
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_exif
-	media-libs/cros-camera-libcamera_ipc
-	media-libs/cros-camera-libcamera_metadata
-	media-libs/cros-camera-libcbm
-	media-libs/libyuv"
-
-DEPEND="${RDEPEND}
-	chromeos-base/metrics
-	media-libs/libyuv
-	media-libs/cros-camera-android-headers"
-
-src_install() {
-	dobin "${OUT}/libjea_test"
-}
diff --git a/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r455.ebuild b/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r455.ebuild
new file mode 100644
index 0000000..85453cc
--- /dev/null
+++ b/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-0.0.1-r455.ebuild
@@ -0,0 +1,42 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="7d3a2b277f2f4d779beeacf456ea6ecb14799302"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079" "aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/mojo common-mk metrics"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/common/jpeg/libjea_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="End to end test for JPEG encode accelerator"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152
+	dev-cpp/gtest:=
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_exif
+	media-libs/cros-camera-libcamera_ipc
+	media-libs/cros-camera-libcamera_metadata
+	media-libs/cros-camera-libcbm
+	media-libs/libyuv"
+
+DEPEND="${RDEPEND}
+	>=chromeos-base/metrics-0.0.1-r3152
+	media-libs/libyuv
+	media-libs/cros-camera-android-headers"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/libjea_test"
+}
diff --git a/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-9999.ebuild b/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-9999.ebuild
index 2e5d6c3..79f48c9 100644
--- a/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-9999.ebuild
+++ b/media-libs/cros-camera-libjea_test/cros-camera-libjea_test-9999.ebuild
@@ -20,7 +20,7 @@
 KEYWORDS="~*"
 
 RDEPEND="
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	dev-cpp/gtest:=
 	media-libs/cros-camera-libcamera_common
 	media-libs/cros-camera-libcamera_exif
@@ -30,10 +30,11 @@
 	media-libs/libyuv"
 
 DEPEND="${RDEPEND}
-	chromeos-base/metrics
+	>=chromeos-base/metrics-0.0.1-r3152
 	media-libs/libyuv
 	media-libs/cros-camera-android-headers"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/libjea_test"
 }
diff --git a/media-libs/cros-camera-test/cros-camera-test-0.0.1-r405.ebuild b/media-libs/cros-camera-test/cros-camera-test-0.0.1-r405.ebuild
deleted file mode 100644
index f2c397d..0000000
--- a/media-libs/cros-camera-test/cros-camera-test-0.0.1-r405.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "863c7922f75134832ae31820e98b87604a29c8fe" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "84441b28a7584715021e2faf292e0cf5864ea8bf" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/camera3_test camera/common camera/include camera/mojo common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/camera3_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera HAL native test."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-
-RDEPEND="
-	!media-libs/arc-camera3-test
-	media-libs/cros-camera-libcamera_client
-	media-libs/cros-camera-libcamera_common
-	media-libs/cros-camera-libcamera_metadata
-	media-libs/cros-camera-libcbm
-	media-libs/libexif
-	media-libs/libsync
-	media-libs/minigbm
-	virtual/jpeg:0"
-
-DEPEND="${RDEPEND}
-	dev-cpp/gtest:=
-	media-libs/cros-camera-android-headers
-	media-libs/libyuv
-	virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/cros_camera_test"
-}
diff --git a/media-libs/cros-camera-test/cros-camera-test-0.0.1-r452.ebuild b/media-libs/cros-camera-test/cros-camera-test-0.0.1-r452.ebuild
new file mode 100644
index 0000000..05fa129
--- /dev/null
+++ b/media-libs/cros-camera-test/cros-camera-test-0.0.1-r452.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "be0f67e39e0d02b8352dcaa90e1b26a8bdf11de8" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "ab72b93074396d3428b557e2e00d64f487fab1e1" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/camera3_test camera/common camera/include camera/mojo common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/camera3_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera HAL native test."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan"
+
+RDEPEND="
+	!media-libs/arc-camera3-test
+	media-libs/cros-camera-libcamera_client
+	media-libs/cros-camera-libcamera_common
+	media-libs/cros-camera-libcamera_metadata
+	media-libs/cros-camera-libcbm
+	media-libs/libexif
+	media-libs/libsync
+	media-libs/minigbm
+	virtual/jpeg:0"
+
+DEPEND="${RDEPEND}
+	dev-cpp/gtest:=
+	media-libs/cros-camera-android-headers
+	media-libs/libyuv
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/cros_camera_test"
+}
diff --git a/media-libs/cros-camera-test/cros-camera-test-9999.ebuild b/media-libs/cros-camera-test/cros-camera-test-9999.ebuild
index 2a49365..28094c5 100644
--- a/media-libs/cros-camera-test/cros-camera-test-9999.ebuild
+++ b/media-libs/cros-camera-test/cros-camera-test-9999.ebuild
@@ -38,5 +38,6 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/cros_camera_test"
 }
diff --git a/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r194.ebuild b/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r194.ebuild
deleted file mode 100644
index b22edafb..0000000
--- a/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r194.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="7198886aa352d29ae07eea8ca3e25094e14c8189"
-CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "b99d8a0b7d7f0e2f844af457f29d449cdd953d43" "584f7cc8998d8fa6c9b041054ce4a352016f477a" "7d3546008b48acb50830aad744e1a6a19acb21c5" "6287b0913be5aaea79569d55d989b9b729396f10" "eec5ce9cfadd268344b02efdbec7465fbc391a9e")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/v4l2_test chromeos-config common-mk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-
-PLATFORM_SUBDIR="camera/v4l2_test"
-
-inherit cros-camera cros-workon platform
-
-DESCRIPTION="Chrome OS camera V4L2 test."
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="generated_cros_config unibuild"
-
-RDEPEND="
-	chromeos-base/chromeos-config-tools
-	chromeos-base/libbrillo:=
-	dev-cpp/gtest:=
-	dev-libs/re2:=
-	media-libs/libyuv
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
-	)
-	virtual/jpeg:0"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-src_install() {
-	dobin "${OUT}/media_v4l2_is_capture_device"
-	dobin "${OUT}/media_v4l2_test"
-}
diff --git a/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r275.ebuild b/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r275.ebuild
new file mode 100644
index 0000000..1ea6695
--- /dev/null
+++ b/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-0.0.1-r275.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="5be1e6be0e2256c73dd174671471428359561d05"
+CROS_WORKON_TREE=("e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb" "d58be6324ba2a1d0452d23bafb39c869c5ed2cd6" "208baf1260a799a3ae3ef54d4cecb2403669a4f6" "4cc600d625ecfdac13d984d9190d63a8970b0a4b" "3f2ee10a205c3f5536485cb276c251689e36c033" "9b4a2274d7e288e816c42f93f44fb938f82038ff" "aa81756947ecfdd38b22f42eed8eeafa40431079")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/hal/usb chromeos-config common-mk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+PLATFORM_SUBDIR="camera/hal/usb/v4l2_test"
+
+inherit cros-camera cros-workon platform
+
+DESCRIPTION="Chrome OS camera V4L2 test."
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="generated_cros_config unibuild"
+
+RDEPEND="
+	chromeos-base/chromeos-config-tools
+	chromeos-base/libbrillo:=
+	dev-cpp/gtest:=
+	dev-libs/re2:=
+	media-libs/libyuv
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
+	)
+	virtual/jpeg:0"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig"
+
+src_install() {
+	platform_src_install
+	dobin "${OUT}/media_v4l2_is_capture_device"
+	dobin "${OUT}/media_v4l2_test"
+}
diff --git a/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-9999.ebuild b/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-9999.ebuild
index 939b1ef..e5ec2b5 100644
--- a/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-9999.ebuild
+++ b/media-libs/cros-camera-v4l2_test/cros-camera-v4l2_test-9999.ebuild
@@ -5,11 +5,11 @@
 
 CROS_WORKON_PROJECT="chromiumos/platform2"
 CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/v4l2_test chromeos-config common-mk"
+CROS_WORKON_SUBTREE=".gn camera/build camera/common camera/include camera/hal/usb chromeos-config common-mk"
 CROS_WORKON_OUTOFTREE_BUILD="1"
 CROS_WORKON_INCREMENTAL_BUILD="1"
 
-PLATFORM_SUBDIR="camera/v4l2_test"
+PLATFORM_SUBDIR="camera/hal/usb/v4l2_test"
 
 inherit cros-camera cros-workon platform
 
@@ -36,6 +36,7 @@
 	virtual/pkgconfig"
 
 src_install() {
+	platform_src_install
 	dobin "${OUT}/media_v4l2_is_capture_device"
 	dobin "${OUT}/media_v4l2_test"
 }
diff --git a/media-libs/evdi/Manifest b/media-libs/evdi/Manifest
index a2e6d2b..6c4de65 100644
--- a/media-libs/evdi/Manifest
+++ b/media-libs/evdi/Manifest
@@ -1 +1 @@
-DIST evdi-1.6.4.tar.gz 59000 BLAKE2B 47a5adbb6d5802e9e1b61fa1ee52761affa38a61c8c6a9bf011bc4fa7241754cb01e1633209461e087bcbee64226d13d0cafee61d4ed6409c99ffb37bae15005 SHA512 9956f7d8566c199a1b323c919882f985b54e47ea426a2a78188e4f6b76f76076ad7aaec4f0f528fbb316bd29a4771806c087effda7fa7bfaf2607fb75594355a
+DIST evdi-1.8.0.tar.gz 62402 BLAKE2B a7c1f3f72a534f776dfc9f929e30a51230fec9fdaafd68667c71cc133ba2d6fe3592908a3b6d1cdde92d39b59119cfb00e529a11bedf4da1be7c48110cd15990 SHA512 60214f1b78ff7dee1f25fe3816d70d3269e79648d5414d2f5cda8de8579193c73c517edb9c867064b86c4249485fc2d04f2d935fc3dccdb1ce2f58ba93f7be4d
diff --git a/media-libs/evdi/evdi-1.6.4.ebuild b/media-libs/evdi/evdi-1.8.0.ebuild
similarity index 100%
rename from media-libs/evdi/evdi-1.6.4.ebuild
rename to media-libs/evdi/evdi-1.8.0.ebuild
diff --git a/media-libs/freetype/OWNERS b/media-libs/freetype/OWNERS
new file mode 100644
index 0000000..93eb632
--- /dev/null
+++ b/media-libs/freetype/OWNERS
@@ -0,0 +1 @@
+skau@chromium.org
diff --git a/media-libs/gmmlib/Manifest b/media-libs/gmmlib/Manifest
index 8facc4c..8c5bcbf 100644
--- a/media-libs/gmmlib/Manifest
+++ b/media-libs/gmmlib/Manifest
@@ -1 +1 @@
-DIST intel-gmmlib-19.4.1.tar.gz 707375 SHA256 bb874b41c499abb8f6253b1834e93a02ed9744de71f2503ee9cd4100af7c1860 SHA512 264f111348bbaccd6c14c31ab15c7b02e63def56b0d3effa01067fb5e696d6d3e2ad3d5a9cc3a36f33b835dda12ec3916a31d3a812443de9d5dd815e2e4cde53 WHIRLPOOL 754ca3d5bc315f0da66da975c314216d91f5fa255d03eaf2d76f0aa4c716f74e9b2faaa75303b5e1ab19dbf06210c5a023070cbb177a5f92fcd57e06576ca188
+DIST intel-gmmlib-20.2.2.tar.gz 728309 BLAKE2B 1c26661c5317d66797ca8a72fe910ae73a97c7bc3b5730b6c270daa3eac753287cd83334085c90ce081ff4a8a4d1f79b46e832059b08c36602c5c39f3b3a1af5 SHA512 ebd23658aec78ebdf7cd13577f5ca408e2995c4df6135c951d3bea4a59a84461690d71f6e7ebc2014daa5508e07d32ff20c25019d90255150e7c93e241d403fc
diff --git a/media-libs/gmmlib/files/Add-new-JSL-Device-ID-s.patch b/media-libs/gmmlib/files/Add-new-JSL-Device-ID-s.patch
new file mode 100644
index 0000000..1df1b9e
--- /dev/null
+++ b/media-libs/gmmlib/files/Add-new-JSL-Device-ID-s.patch
@@ -0,0 +1,40 @@
+From 84096c42c8f696e621d0a76caa200a509c524e64 Mon Sep 17 00:00:00 2001
+From: Mohanram Meenakshisundaram <mohanram.meenakshisundaram@intel.com>
+Date: Mon, 13 Jul 2020 20:28:51 +0530
+Subject: [PATCH] Add new JSL Device ID's
+
+Change-Id: I2366d8c86bf32ef199b29570a255ea7e7764a968
+---
+ Source/inc/common/igfxfmid.h | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/Source/inc/common/igfxfmid.h b/Source/inc/common/igfxfmid.h
+index cd35f059aedb..f3c78c88cf94 100644
+--- a/Source/inc/common/igfxfmid.h
++++ b/Source/inc/common/igfxfmid.h
+@@ -1207,11 +1207,22 @@ typedef enum __NATIVEGTTYPE
+ #define IEHL_1x4x4_DEVICE_A0_ID                 0x4551
+ #define IEHL_1x4x8_DEVICE_A0_ID                 0x4571
+ 
++#define DEV_ID_4500                             0x4500
++#define DEV_ID_4541                             0x4541
++#define DEV_ID_4551                             0x4551
++#define DEV_ID_4571                             0x4571
++#define DEV_ID_4555                             0x4555
++
+ //JSL+ Rev02
+ #define IJSL_1x4x4_DEVICE_B0_ID                 0x4E51
+ #define IJSL_1x4x6_DEVICE_B0_ID                 0x4E61
+ #define IJSL_1x4x8_DEVICE_B0_ID                 0x4E71
+ 
++#define DEV_ID_4E51                             0x4E51
++#define DEV_ID_4E61                             0x4E61
++#define DEV_ID_4E71                             0x4E71
++#define DEV_ID_4E55                             0x4E55
++
+ //ICL PCH LP Device IDs
+ #define ICP_LP_RESERVED_FUSE_ID                 0x3480
+ #define ICP_LP_U_SUPER_SKU_ID                   0x3481
+-- 
+2.7.4
+
diff --git a/media-libs/gmmlib/gmmlib-19.4.1-r1.ebuild b/media-libs/gmmlib/gmmlib-19.4.1-r1.ebuild
deleted file mode 120000
index 20f3bf2..0000000
--- a/media-libs/gmmlib/gmmlib-19.4.1-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-gmmlib-19.4.1.ebuild
\ No newline at end of file
diff --git a/media-libs/gmmlib/gmmlib-19.4.1.ebuild b/media-libs/gmmlib/gmmlib-19.4.1.ebuild
deleted file mode 100644
index f571782..0000000
--- a/media-libs/gmmlib/gmmlib-19.4.1.ebuild
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 1999-2018 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CMAKE_BUILD_TYPE="Release"
-inherit cmake-utils
-
-if [[ ${PV} == *9999 ]] ; then
-	: ${EGIT_REPO_URI:="https://github.com/intel/gmmlib"}
-	if [[ ${PV%9999} != "" ]] ; then
-		: ${EGIT_BRANCH:="release/${PV%.9999}"}
-	fi
-	inherit git-r3
-fi
-
-DESCRIPTION="Intel Graphics Memory Management Library"
-HOMEPAGE="https://github.com/intel/gmmlib"
-if [[ ${PV} == *9999 ]] ; then
-	SRC_URI=""
-	KEYWORDS=""
-else
-	SRC_URI="https://github.com/intel/gmmlib/archive/intel-${P}.tar.gz"
-	S="${WORKDIR}/${PN}-intel-${P}"
-	KEYWORDS="*"
-fi
-
-LICENSE="MIT"
-SLOT="0"
-IUSE=""
-
-DEPEND=""
-RDEPEND="${DEPEND}"
-
-src_configure() {
-	local mycmakeargs=(
-		-DRUN_TEST_SUITE=OFF
-	)
-
-	cmake-utils_src_configure
-}
diff --git a/media-libs/gmmlib/gmmlib-20.2.2-r2.ebuild b/media-libs/gmmlib/gmmlib-20.2.2-r2.ebuild
new file mode 120000
index 0000000..dbd5cd3
--- /dev/null
+++ b/media-libs/gmmlib/gmmlib-20.2.2-r2.ebuild
@@ -0,0 +1 @@
+gmmlib-20.2.2.ebuild
\ No newline at end of file
diff --git a/media-libs/gmmlib/gmmlib-20.2.2.ebuild b/media-libs/gmmlib/gmmlib-20.2.2.ebuild
new file mode 100644
index 0000000..dc34688
--- /dev/null
+++ b/media-libs/gmmlib/gmmlib-20.2.2.ebuild
@@ -0,0 +1,22 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CMAKE_ECLASS=cmake
+
+inherit cmake-multilib
+
+DESCRIPTION="Intel Graphics Memory Management Library"
+HOMEPAGE="https://github.com/intel/gmmlib"
+SRC_URI="https://github.com/intel/gmmlib/archive/intel-${P}.tar.gz"
+S="${WORKDIR}/${PN}-intel-${P}"
+KEYWORDS="*"
+LICENSE="MIT"
+SLOT="0"
+
+RDEPEND="${DEPEND}"
+
+PATCHES=(
+	"${FILESDIR}"/Add-new-JSL-Device-ID-s.patch
+)
diff --git a/media-libs/gmmlib/metadata.xml b/media-libs/gmmlib/metadata.xml
new file mode 100644
index 0000000..7ed71e5
--- /dev/null
+++ b/media-libs/gmmlib/metadata.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer type="project">
+	<email>media-video@gentoo.org</email>
+</maintainer>
+<maintainer type="person">
+	<email>marecki@gentoo.org</email>
+	<name>Marek Szuba</name>
+</maintainer>
+</pkgmetadata>
diff --git a/media-libs/libcamera/libcamera-0.0.1-r185.ebuild b/media-libs/libcamera/libcamera-0.0.1-r185.ebuild
deleted file mode 100644
index b2faf8c..0000000
--- a/media-libs/libcamera/libcamera-0.0.1-r185.ebuild
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="61f4296ac749f39896f151221ea0e20876842803"
-CROS_WORKON_TREE="b983d50cebc935c91f2b7d57f9f567d462b67daa"
-CROS_WORKON_PROJECT="chromiumos/third_party/libcamera"
-CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-
-inherit cros-workon meson
-
-DESCRIPTION="Camera support library for Linux"
-HOMEPAGE="https://www.libcamera.org"
-
-LICENSE="LGPL-2.1+"
-SLOT="0"
-KEYWORDS="*"
-IUSE="arc-camera3 doc ipu3 rkisp1 test udev"
-
-RDEPEND="udev? ( virtual/libudev )"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	local pipelines=(
-		"uvcvideo"
-		$(usev ipu3)
-		$(usev rkisp1)
-	)
-
-	pipeline_list() {
-		printf '%s,' "$@" | sed 's:,$::'
-	}
-
-	local emesonargs=(
-		$(meson_use arc-camera3 android)
-		$(meson_use doc documentation)
-		$(meson_use test)
-		-Dpipelines="$(pipeline_list "${pipelines[@]}")"
-	)
-	meson_src_configure
-}
-
-src_compile() {
-	meson_src_compile
-}
-
-src_install() {
-	meson_src_install
-
-	if use arc-camera3 ; then
-		dosym ../libcamera.so "/usr/$(get_libdir)/camera_hal/libcamera.so"
-	fi
-}
diff --git a/media-libs/libcamera/libcamera-0.0.1-r268.ebuild b/media-libs/libcamera/libcamera-0.0.1-r268.ebuild
new file mode 100644
index 0000000..dbf9288
--- /dev/null
+++ b/media-libs/libcamera/libcamera-0.0.1-r268.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="0b427b8ecffdb24a5e133cf7d3b4d89fa4bad22f"
+CROS_WORKON_TREE="04e4e4fb23a96779b2e28b2418c9e7e3e822c10f"
+CROS_WORKON_PROJECT="chromiumos/third_party/libcamera"
+CROS_WORKON_INCREMENTAL_BUILD="1"
+
+inherit cros-workon meson
+
+DESCRIPTION="Camera support library for Linux"
+HOMEPAGE="https://www.libcamera.org"
+
+LICENSE="LGPL-2.1+"
+SLOT="0"
+KEYWORDS="*"
+IUSE="doc ipu3 rkisp1 test udev"
+
+RDEPEND="udev? ( virtual/libudev )"
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	local pipelines=(
+		"uvcvideo"
+		$(usev ipu3)
+		$(usev rkisp1)
+	)
+
+	pipeline_list() {
+		printf '%s,' "$@" | sed 's:,$::'
+	}
+
+	BUILD_DIR="$(cros-workon_get_build_dir)"
+
+	local emesonargs=(
+		$(meson_use doc documentation)
+		$(meson_use test)
+		-Dandroid="enabled"
+		-Dpipelines="$(pipeline_list "${pipelines[@]}")"
+	)
+	meson_src_configure
+}
+
+src_compile() {
+	meson_src_compile
+}
+
+src_install() {
+	meson_src_install
+
+	dosym ../libcamera.so "/usr/$(get_libdir)/camera_hal/libcamera.so"
+}
diff --git a/media-libs/libcamera/libcamera-9999.ebuild b/media-libs/libcamera/libcamera-9999.ebuild
index dacc567..837d5d7 100644
--- a/media-libs/libcamera/libcamera-9999.ebuild
+++ b/media-libs/libcamera/libcamera-9999.ebuild
@@ -5,7 +5,6 @@
 
 CROS_WORKON_PROJECT="chromiumos/third_party/libcamera"
 CROS_WORKON_INCREMENTAL_BUILD="1"
-CROS_WORKON_OUTOFTREE_BUILD="1"
 
 inherit cros-workon meson
 
@@ -15,7 +14,7 @@
 LICENSE="LGPL-2.1+"
 SLOT="0"
 KEYWORDS="~*"
-IUSE="arc-camera3 doc ipu3 rkisp1 test udev"
+IUSE="doc ipu3 rkisp1 test udev"
 
 RDEPEND="udev? ( virtual/libudev )"
 DEPEND="${RDEPEND}"
@@ -31,10 +30,12 @@
 		printf '%s,' "$@" | sed 's:,$::'
 	}
 
+	BUILD_DIR="$(cros-workon_get_build_dir)"
+
 	local emesonargs=(
-		$(meson_use arc-camera3 android)
 		$(meson_use doc documentation)
 		$(meson_use test)
+		-Dandroid="enabled"
 		-Dpipelines="$(pipeline_list "${pipelines[@]}")"
 	)
 	meson_src_configure
@@ -47,7 +48,5 @@
 src_install() {
 	meson_src_install
 
-	if use arc-camera3 ; then
-		dosym ../libcamera.so "/usr/$(get_libdir)/camera_hal/libcamera.so"
-	fi
+	dosym ../libcamera.so "/usr/$(get_libdir)/camera_hal/libcamera.so"
 }
diff --git a/media-libs/libv4lplugins/libv4lplugins-0.0.1-r38.ebuild b/media-libs/libv4lplugins/libv4lplugins-0.0.1-r38.ebuild
deleted file mode 100644
index 1c73e7d..0000000
--- a/media-libs/libv4lplugins/libv4lplugins-0.0.1-r38.ebuild
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-
-CROS_WORKON_COMMIT="a4286c4564b9e1557ce5a9440096665887fa13fe"
-CROS_WORKON_TREE="a17b1841ff0f13b956704fe28506711345c64894"
-CROS_WORKON_PROJECT="chromiumos/third_party/libv4lplugins"
-inherit autotools cros-workon eutils
-
-MY_P=v4l-utils-1.18.1
-
-DESCRIPTION="Separate plugin library from upstream v4l-utils package"
-HOMEPAGE="http://git.linuxtv.org/v4l-utils.git"
-SRC_URI="http://linuxtv.org/downloads/v4l-utils/${MY_P}.tar.bz2"
-
-LICENSE="LGPL-2.1"
-SLOT="0"
-KEYWORDS="*"
-PLUGIN_IUSE="rockchip rockchip_v2"
-IUSE="${PLUGIN_IUSE}"
-REQUIRED_USE="^^ ( ${PLUGIN_IUSE} )"
-
-RDEPEND="media-libs/libv4l"
-DEPEND="${RDEPEND}"
-
-S=${WORKDIR}/${MY_P}
-
-src_unpack() {
-	cros-workon_src_unpack
-	default
-}
-
-src_prepare() {
-	if use rockchip; then
-		PLUGIN_DIR="libv4l-rockchip"
-	elif use rockchip_v2; then
-		PLUGIN_DIR="libv4l-rockchip_v2"
-	fi
-	mv ${PLUGIN_DIR} lib || die
-	# Append "SUBDIRS += ${PLUGIN_DIR}" at the end of lib/Makefile.am
-	sed -i -e "\$aSUBDIRS += ${PLUGIN_DIR}" lib/Makefile.am || die
-	# Add "lib/${PLUGIN_DIR}/Makefile" after lib/libv4l2rds/Makefile
-	sed -i -e "s:libv4l2rds/Makefile:&\n\tlib/${PLUGIN_DIR}/Makefile:" \
-		configure.ac || die
-	rm -rf include
-	eautoreconf
-}
-
-src_configure() {
-	econf \
-		--disable-static \
-		--disable-qv4l2 \
-		--disable-v4l-utils \
-		--without-jpeg
-}
-
-src_compile() {
-	emake -C lib/${PLUGIN_DIR}
-}
-
-src_install() {
-	emake -C lib/${PLUGIN_DIR} DESTDIR="${D}" install
-}
diff --git a/media-libs/libv4lplugins/libv4lplugins-0.0.1-r40.ebuild b/media-libs/libv4lplugins/libv4lplugins-0.0.1-r40.ebuild
new file mode 100644
index 0000000..43d8aec
--- /dev/null
+++ b/media-libs/libv4lplugins/libv4lplugins-0.0.1-r40.ebuild
@@ -0,0 +1,64 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+
+CROS_WORKON_COMMIT="2ae5b57e46eee84aab8f7a0f9909c60b4b770645"
+CROS_WORKON_TREE="694d607ee703be3eca76e8c7d5359e21813c7daf"
+CROS_WORKON_PROJECT="chromiumos/third_party/libv4lplugins"
+inherit autotools cros-workon eutils
+
+MY_P=v4l-utils-1.18.1
+
+DESCRIPTION="Separate plugin library from upstream v4l-utils package"
+HOMEPAGE="http://git.linuxtv.org/v4l-utils.git"
+SRC_URI="http://linuxtv.org/downloads/v4l-utils/${MY_P}.tar.bz2"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="*"
+PLUGIN_IUSE="rockchip rockchip_v2"
+IUSE="${PLUGIN_IUSE}"
+REQUIRED_USE="^^ ( ${PLUGIN_IUSE} )"
+
+RDEPEND="media-libs/libv4l"
+DEPEND="${RDEPEND}"
+
+S=${WORKDIR}/${MY_P}
+
+src_unpack() {
+	cros-workon_src_unpack
+	default
+}
+
+src_prepare() {
+	if use rockchip; then
+		PLUGIN_DIR="libv4l-rockchip"
+	elif use rockchip_v2; then
+		PLUGIN_DIR="libv4l-rockchip_v2"
+	fi
+	mv ${PLUGIN_DIR} lib || die
+	# Append "SUBDIRS += ${PLUGIN_DIR}" at the end of lib/Makefile.am
+	sed -i -e "\$aSUBDIRS += ${PLUGIN_DIR}" lib/Makefile.am || die
+	# Add "lib/${PLUGIN_DIR}/Makefile" after lib/libv4l2rds/Makefile
+	sed -i -e "s:libv4l2rds/Makefile:&\n\tlib/${PLUGIN_DIR}/Makefile:" \
+		configure.ac || die
+	rm -rf include
+	eautoreconf
+}
+
+src_configure() {
+	econf \
+		--disable-static \
+		--disable-qv4l2 \
+		--disable-v4l-utils \
+		--without-jpeg
+}
+
+src_compile() {
+	emake -C lib/${PLUGIN_DIR}
+}
+
+src_install() {
+	emake -C lib/${PLUGIN_DIR} DESTDIR="${D}" install
+}
diff --git a/media-libs/mesa-amd/mesa-amd-19.3.5-r16.ebuild b/media-libs/mesa-amd/mesa-amd-19.3.5-r16.ebuild
deleted file mode 100644
index 58edf1a..0000000
--- a/media-libs/mesa-amd/mesa-amd-19.3.5-r16.ebuild
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright 1999-2019 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
-
-EAPI=6
-
-CROS_WORKON_COMMIT="dc4b2c12e2874e57992aa18f5d0da035839f611e"
-CROS_WORKON_TREE="4a72b0bf5559447300d73c7a1f4cf1ef2fb09b2b"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-amd"
-CROS_WORKON_EGIT_BRANCH="chromeos-amd"
-
-inherit base flag-o-matic meson toolchain-funcs cros-workon
-
-DESCRIPTION="The Mesa 3D Graphics Library"
-HOMEPAGE="http://mesa3d.org/"
-
-LICENSE="MIT"
-SLOT="0"
-KEYWORDS="*"
-
-VIDEO_CARDS="intel amdgpu radeon freedreno llvmpipe"
-for card in ${VIDEO_CARDS}; do
-	IUSE_VIDEO_CARDS+=" video_cards_${card}"
-done
-
-IUSE="${IUSE_VIDEO_CARDS} debug vulkan"
-
-# keep correct libdrm and dri2proto dep
-# keep blocks in rdepend for binpkg
-RDEPEND="
-	virtual/libelf
-	dev-libs/expat
-	x11-libs/libdrm
-	!media-libs/mesa
-"
-
-DEPEND="${RDEPEND}
-	sys-devel/bison
-	sys-devel/flex
-	virtual/pkgconfig
-	x11-base/xorg-proto
-	x11-libs/libva
-	sys-devel/llvm
-"
-
-driver_list() {
-	local drivers="$(sort -u <<< "${1// /$'\n'}")"
-	echo "${drivers//$'\n'/,}"
-}
-
-src_configure() {
-	tc-getPROG PKG_CONFIG pkg-config
-
-	cros_optimize_package_for_speed
-
-	# Intel code
-	dri_driver_enable video_cards_intel i965
-
-	gallium_enable video_cards_llvmpipe swrast
-
-	# ATI code
-	gallium_enable video_cards_radeon r300 r600
-	gallium_enable video_cards_amdgpu radeonsi
-
-	# Freedreno code
-	gallium_enable video_cards_freedreno freedreno
-
-	if use vulkan; then
-		vulkan_enable video_cards_intel intel
-		vulkan_enable video_cards_amdgpu amd
-	fi
-
-	export LLVM_CONFIG=${SYSROOT}/usr/lib/llvm/bin/llvm-config-host
-
-	append-flags "-UENABLE_SHADER_CACHE"
-
-	emesonargs+=(
-		-Dglx=disabled
-		-Dllvm=true
-		-Dshared-llvm=false
-		-Dplatforms=surfaceless
-		-Degl=true
-		-Dgbm=false
-		-Dgl=false
-		-Dgles1=false
-		-Dgles2=true
-		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
-		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
-		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
-		--buildtype $(usex debug debug release)
-		-Dgallium-va=true
-		-Dva-libs-path="/usr/$(get_libdir)/va/drivers"
-	)
-
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	# Remove redundant GLES headers
-	rm -f "${D}"/usr/include/{EGL,GLES2,GLES3,KHR}/*.h || die "Removing GLES headers failed."
-
-	# Set driconf option to enable S3TC hardware decompression
-	insinto "/etc/"
-	doins "${FILESDIR}"/drirc
-}
-
-# $1 - VIDEO_CARDS flag (check skipped for "--")
-# other args - names of DRI drivers to enable
-dri_driver_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		DRI_DRIVERS+=("$@")
-	fi
-}
-
-gallium_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		GALLIUM_DRIVERS+=("$@")
-	fi
-}
-
-vulkan_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		VULKAN_DRIVERS+=("$@")
-	fi
-}
diff --git a/media-libs/mesa-amd/mesa-amd-19.3.5-r21.ebuild b/media-libs/mesa-amd/mesa-amd-19.3.5-r21.ebuild
new file mode 100644
index 0000000..591312a
--- /dev/null
+++ b/media-libs/mesa-amd/mesa-amd-19.3.5-r21.ebuild
@@ -0,0 +1,131 @@
+# Copyright 1999-2019 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
+
+EAPI=6
+
+CROS_WORKON_COMMIT="b200b637f218841b45b15c52ed76f537b4fe5400"
+CROS_WORKON_TREE="cadd4bad01f90199f6d3f096b73343801c9d5680"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-amd"
+CROS_WORKON_EGIT_BRANCH="chromeos-amd"
+
+inherit base flag-o-matic meson toolchain-funcs cros-workon
+
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+
+VIDEO_CARDS="intel amdgpu radeon freedreno llvmpipe"
+for card in ${VIDEO_CARDS}; do
+	IUSE_VIDEO_CARDS+=" video_cards_${card}"
+done
+
+IUSE="${IUSE_VIDEO_CARDS} debug vulkan"
+
+# keep correct libdrm and dri2proto dep
+# keep blocks in rdepend for binpkg
+RDEPEND="
+	virtual/libelf
+	dev-libs/expat
+	x11-libs/libdrm
+	!media-libs/mesa
+"
+
+DEPEND="${RDEPEND}
+	sys-devel/bison
+	sys-devel/flex
+	virtual/pkgconfig
+	x11-base/xorg-proto
+	x11-libs/libva
+	sys-devel/llvm
+"
+
+driver_list() {
+	local drivers="$(sort -u <<< "${1// /$'\n'}")"
+	echo "${drivers//$'\n'/,}"
+}
+
+src_configure() {
+	tc-getPROG PKG_CONFIG pkg-config
+
+	cros_optimize_package_for_speed
+
+	# Intel code
+	dri_driver_enable video_cards_intel i965
+
+	gallium_enable video_cards_llvmpipe swrast
+
+	# ATI code
+	gallium_enable video_cards_radeon r300 r600
+	gallium_enable video_cards_amdgpu radeonsi
+
+	# Freedreno code
+	gallium_enable video_cards_freedreno freedreno
+
+	if use vulkan; then
+		vulkan_enable video_cards_intel intel
+		vulkan_enable video_cards_amdgpu amd
+	fi
+
+	export LLVM_CONFIG=${SYSROOT}/usr/lib/llvm/bin/llvm-config-host
+
+	append-flags "-UENABLE_SHADER_CACHE"
+
+	emesonargs+=(
+		-Dglx=disabled
+		-Dllvm=true
+		-Dshared-llvm=false
+		-Dplatforms=surfaceless
+		-Degl=true
+		-Dgbm=false
+		-Dgl=false
+		-Dgles1=false
+		-Dgles2=true
+		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
+		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
+		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
+		--buildtype $(usex debug debug release)
+		-Dgallium-va=true
+		-Dva-libs-path="/usr/$(get_libdir)/va/drivers"
+	)
+
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	# Remove redundant GLES headers
+	rm -f "${D}"/usr/include/{EGL,GLES2,GLES3,KHR}/*.h || die "Removing GLES headers failed."
+
+	# Set driconf option to enable S3TC hardware decompression
+	insinto "/etc/"
+	doins "${FILESDIR}"/drirc
+}
+
+# $1 - VIDEO_CARDS flag (check skipped for "--")
+# other args - names of DRI drivers to enable
+dri_driver_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		DRI_DRIVERS+=("$@")
+	fi
+}
+
+gallium_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		GALLIUM_DRIVERS+=("$@")
+	fi
+}
+
+vulkan_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		VULKAN_DRIVERS+=("$@")
+	fi
+}
diff --git a/media-libs/mesa-freedreno/mesa-freedreno-20.2.0_pre-r30.ebuild b/media-libs/mesa-freedreno/mesa-freedreno-20.2.0_pre-r30.ebuild
deleted file mode 100644
index 54c49a5..0000000
--- a/media-libs/mesa-freedreno/mesa-freedreno-20.2.0_pre-r30.ebuild
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 1999-2010 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="254d32609070c25a67e354fcbdcf67074a8743b6"
-CROS_WORKON_TREE="8bb43c3865c00e0b9d17c8d2bebf941a4b570d26"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-freedreno"
-CROS_WORKON_EGIT_BRANCH="chromeos-freedreno"
-
-KEYWORDS="*"
-
-inherit base meson flag-o-matic cros-workon
-
-DESCRIPTION="The Mesa 3D Graphics Library"
-HOMEPAGE="http://mesa3d.org/"
-
-# Most of the code is MIT/X11.
-# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
-LICENSE="MIT SGI-B-2.0"
-
-IUSE="debug vulkan"
-
-COMMON_DEPEND="
-	dev-libs/expat:=
-	>=x11-libs/libdrm-2.4.94:=
-"
-
-RDEPEND="${COMMON_DEPEND}
-"
-
-DEPEND="${COMMON_DEPEND}
-"
-
-BDEPEND="
-	sys-devel/bison
-	sys-devel/flex
-	virtual/pkgconfig
-"
-
-src_configure() {
-	emesonargs+=(
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=false
-		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=false
-		-Dgles2=true
-		-Dshared-glapi=true
-		-Ddri-drivers=
-		-Dgallium-drivers=freedreno
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
-		-Dplatforms=surfaceless
-		-Dtools=freedreno
-		--buildtype $(usex debug debug release)
-		-Dvulkan-drivers=$(usex vulkan freedreno '')
-	)
-
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	find "${ED}" -name '*kgsl*' -exec rm -f {} +
-	rm -v -rf "${ED}/usr/include"
-}
diff --git a/media-libs/mesa-freedreno/mesa-freedreno-20.3.0_pre-r36.ebuild b/media-libs/mesa-freedreno/mesa-freedreno-20.3.0_pre-r36.ebuild
new file mode 100644
index 0000000..c06f633
--- /dev/null
+++ b/media-libs/mesa-freedreno/mesa-freedreno-20.3.0_pre-r36.ebuild
@@ -0,0 +1,71 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="772f8052b3f83c30476a7e4211a0ec29c4a2e8c7"
+CROS_WORKON_TREE="709132dcdf35676fc5ef0aa29e20d043aa4a5dd6"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-freedreno"
+CROS_WORKON_EGIT_BRANCH="chromeos-freedreno"
+
+KEYWORDS="*"
+
+inherit base meson flag-o-matic cros-workon
+
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
+
+# Most of the code is MIT/X11.
+# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
+LICENSE="MIT SGI-B-2.0"
+
+IUSE="debug vulkan"
+
+COMMON_DEPEND="
+	dev-libs/expat:=
+	>=x11-libs/libdrm-2.4.94:=
+"
+
+RDEPEND="${COMMON_DEPEND}
+"
+
+DEPEND="${COMMON_DEPEND}
+"
+
+BDEPEND="
+	sys-devel/bison
+	sys-devel/flex
+	virtual/pkgconfig
+"
+
+src_configure() {
+	emesonargs+=(
+		-Dllvm=disabled
+		-Ddri3=disabled
+		-Dshader-cache=disabled
+		-Dglx=disabled
+		-Degl=enabled
+		-Dgbm=disabled
+		-Dgles1=disabled
+		-Dgles2=enabled
+		-Dshared-glapi=enabled
+		-Ddri-drivers=
+		-Dgallium-drivers=freedreno
+		-Dgallium-vdpau=disabled
+		-Dgallium-xa=disabled
+		-Dplatforms=
+		-Dtools=freedreno
+		--buildtype $(usex debug debug release)
+		-Dvulkan-drivers=$(usex vulkan freedreno '')
+	)
+
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	find "${ED}" -name '*kgsl*' -exec rm -f {} +
+	rm -v -rf "${ED}/usr/include"
+}
diff --git a/media-libs/mesa-freedreno/mesa-freedreno-9999.ebuild b/media-libs/mesa-freedreno/mesa-freedreno-9999.ebuild
index 6cf6f1e..b3ed92c 100644
--- a/media-libs/mesa-freedreno/mesa-freedreno-9999.ebuild
+++ b/media-libs/mesa-freedreno/mesa-freedreno-9999.ebuild
@@ -39,20 +39,20 @@
 
 src_configure() {
 	emesonargs+=(
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=false
+		-Dllvm=disabled
+		-Ddri3=disabled
+		-Dshader-cache=disabled
 		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=false
-		-Dgles2=true
-		-Dshared-glapi=true
+		-Degl=enabled
+		-Dgbm=disabled
+		-Dgles1=disabled
+		-Dgles2=enabled
+		-Dshared-glapi=enabled
 		-Ddri-drivers=
 		-Dgallium-drivers=freedreno
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
-		-Dplatforms=surfaceless
+		-Dgallium-vdpau=disabled
+		-Dgallium-xa=disabled
+		-Dplatforms=
 		-Dtools=freedreno
 		--buildtype $(usex debug debug release)
 		-Dvulkan-drivers=$(usex vulkan freedreno '')
diff --git a/media-libs/mesa-iris/mesa-iris-20.2.0_pre-r11.ebuild b/media-libs/mesa-iris/mesa-iris-20.2.0_pre-r11.ebuild
deleted file mode 100644
index 6c1d0d5..0000000
--- a/media-libs/mesa-iris/mesa-iris-20.2.0_pre-r11.ebuild
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 1999-2010 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="a2539afdc3c0806884858c6dc753e63bdd8f9e74"
-CROS_WORKON_TREE="c74c7b6b64e5e219a9a2245a1ef2a8dfb98d8663"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_LOCALNAME="mesa-iris"
-CROS_WORKON_EGIT_BRANCH="chromeos-iris"
-
-KEYWORDS="*"
-
-inherit base meson flag-o-matic cros-workon
-
-DESCRIPTION="The Mesa 3D Graphics Library"
-HOMEPAGE="http://mesa3d.org/"
-
-# Most of the code is MIT/X11.
-# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
-LICENSE="MIT SGI-B-2.0"
-
-IUSE="debug vulkan tools"
-
-COMMON_DEPEND="
-	dev-libs/expat:=
-	>=x11-libs/libdrm-2.4.94:=
-"
-
-RDEPEND="${COMMON_DEPEND}
-"
-
-DEPEND="${COMMON_DEPEND}
-"
-
-BDEPEND="
-	sys-devel/bison
-	sys-devel/flex
-	virtual/pkgconfig
-"
-
-src_configure() {
-	emesonargs+=(
-		-Dllvm=false
-		-Ddri3=false
-		-Dshader-cache=false
-		-Dglx=disabled
-		-Degl=true
-		-Dgbm=false
-		-Dgles1=false
-		-Dgles2=true
-		-Dshared-glapi=true
-		-Ddri-drivers=
-		-Dgallium-drivers=iris
-		-Dgallium-vdpau=false
-		-Dgallium-xa=false
-		-Dplatforms=surfaceless
-		-Dtools=$(usex tools intel '')
-		--buildtype $(usex debug debug release)
- 		-Dvulkan-drivers=$(usex vulkan intel '')
-	)
-
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	rm -v -rf "${ED}/usr/include"
-}
diff --git a/media-libs/mesa-iris/mesa-iris-20.2.0_rc1-r12.ebuild b/media-libs/mesa-iris/mesa-iris-20.2.0_rc1-r12.ebuild
new file mode 100644
index 0000000..18d6a9f
--- /dev/null
+++ b/media-libs/mesa-iris/mesa-iris-20.2.0_rc1-r12.ebuild
@@ -0,0 +1,70 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="cbe5934fd21d579a7bcffa6c7ae2567d361a6705"
+CROS_WORKON_TREE="bfd09ab3e5c477cdb942fd0291460e01d1d37182"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_LOCALNAME="mesa-iris"
+CROS_WORKON_EGIT_BRANCH="chromeos-iris"
+
+KEYWORDS="*"
+
+inherit base meson flag-o-matic cros-workon
+
+DESCRIPTION="The Mesa 3D Graphics Library"
+HOMEPAGE="http://mesa3d.org/"
+
+# Most of the code is MIT/X11.
+# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
+LICENSE="MIT SGI-B-2.0"
+
+IUSE="debug vulkan tools"
+
+COMMON_DEPEND="
+	dev-libs/expat:=
+	>=x11-libs/libdrm-2.4.94:=
+"
+
+RDEPEND="${COMMON_DEPEND}
+"
+
+DEPEND="${COMMON_DEPEND}
+"
+
+BDEPEND="
+	sys-devel/bison
+	sys-devel/flex
+	virtual/pkgconfig
+"
+
+src_configure() {
+	emesonargs+=(
+		-Dllvm=false
+		-Ddri3=false
+		-Dshader-cache=false
+		-Dglx=disabled
+		-Degl=true
+		-Dgbm=false
+		-Dgles1=false
+		-Dgles2=true
+		-Dshared-glapi=true
+		-Ddri-drivers=
+		-Dgallium-drivers=iris
+		-Dgallium-vdpau=false
+		-Dgallium-xa=false
+		-Dplatforms=surfaceless
+		-Dtools=$(usex tools intel '')
+		--buildtype $(usex debug debug release)
+ 		-Dvulkan-drivers=$(usex vulkan intel '')
+	)
+
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	rm -v -rf "${ED}/usr/include"
+}
diff --git a/media-libs/mesa-llvmpipe/files/0001-BACKPORT-EGL-image-storage.patch b/media-libs/mesa-llvmpipe/files/0001-BACKPORT-EGL-image-storage.patch
deleted file mode 100644
index a75b44b..0000000
--- a/media-libs/mesa-llvmpipe/files/0001-BACKPORT-EGL-image-storage.patch
+++ /dev/null
@@ -1,650 +0,0 @@
-From 62cd1bdf41a2b1441a5b3fe21a46140808c05d9e Mon Sep 17 00:00:00 2001
-From: Gurchetan Singh <gurchetansingh@chromium.org>
-Date: Mon, 6 Jan 2020 18:02:26 -0800
-Subject: [PATCH] BACKPORT: EGL image storage
-
-Change-Id: I73fd96af28f74afbca080a6df00f1c1db1f94af8
----
- src/mapi/glapi/gen/EXT_EGL_image_storage.xml |  22 +++
- src/mapi/glapi/gen/es_EXT.xml                |   1 +
- src/mapi/glapi/gen/static_data.py            |   2 +
- src/mesa/drivers/dri/common/dri_util.c       | 111 +++++++++------
- src/mesa/drivers/dri/common/dri_util.h       |   3 +
- src/mesa/drivers/dri/i965/intel_extensions.c |   1 +
- src/mesa/drivers/dri/i965/intel_image.h      |   2 +
- src/mesa/drivers/dri/i965/intel_screen.c     |   1 +
- src/mesa/drivers/dri/i965/intel_tex_image.c  |  62 ++++++++-
- src/mesa/main/dd.h                           |   8 +-
- src/mesa/main/extensions_table.h             |   1 +
- src/mesa/main/mtypes.h                       |   1 +
- src/mesa/main/teximage.c                     | 137 ++++++++++++++++---
- src/mesa/main/teximage.h                     |   7 +
- 14 files changed, 293 insertions(+), 66 deletions(-)
- create mode 100644 src/mapi/glapi/gen/EXT_EGL_image_storage.xml
-
-diff --git a/src/mapi/glapi/gen/EXT_EGL_image_storage.xml b/src/mapi/glapi/gen/EXT_EGL_image_storage.xml
-new file mode 100644
-index 00000000000..9ce84d537aa
---- /dev/null
-+++ b/src/mapi/glapi/gen/EXT_EGL_image_storage.xml
-@@ -0,0 +1,22 @@
-+<?xml version="1.0"?>
-+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
-+
-+<OpenGLAPI>
-+
-+<category name="GL_EXT_EGL_image_storage" number="301">
-+
-+    <function name="EGLImageTargetTexStorageEXT" es2="3.0" desktop="false">
-+        <param name="target" type="GLenum"/>
-+        <param name="image" type="GLvoid *"/>
-+        <param name="attrib_list" type="const GLint *"/>
-+    </function>
-+
-+    <function name="EGLImageTargetTextureStorageEXT" es2="3.0" desktop="false">
-+        <param name="texture" type="GLuint"/>
-+        <param name="image" type="GLvoid *"/>
-+        <param name="attrib_list" type="const GLint *"/>
-+    </function>
-+
-+</category>
-+
-+</OpenGLAPI>
-diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index 3a797a50989..a3411679c19 100644
---- a/src/mapi/glapi/gen/es_EXT.xml
-+++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1490,4 +1490,5 @@
-    </function>
- </category>
- 
-+<xi:include href="EXT_EGL_image_storage.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
- </OpenGLAPI>
-diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index 24781390d30..62652112f3f 100644
---- a/src/mapi/glapi/gen/static_data.py
-+++ b/src/mapi/glapi/gen/static_data.py
-@@ -1455,6 +1455,8 @@ offsets = {
-     "PrimitiveBoundingBox": 1419,
-     "FramebufferParameteriMESA": 1420,
-     "GetFramebufferParameterivMESA": 1421,
-+    "EGLImageTargetTexStorageEXT" : 1422,
-+    "EGLImageTargetTextureStorageEXT" : 1423,
- }
- 
- functions = [
-diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
-index ac3a04bceff..cdf7aa92c24 100644
---- a/src/mesa/drivers/dri/common/dri_util.c
-+++ b/src/mesa/drivers/dri/common/dri_util.c
-@@ -873,86 +873,107 @@ driUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv)
- static const struct {
-    uint32_t    image_format;
-    mesa_format mesa_format;
-+   GLenum internal_format;
- } format_mapping[] = {
-    {
--      .image_format = __DRI_IMAGE_FORMAT_RGB565,
--      .mesa_format  =        MESA_FORMAT_B5G6R5_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_RGB565,
-+      .mesa_format     =        MESA_FORMAT_B5G6R5_UNORM,
-+      .internal_format =        GL_RGB565,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_ARGB1555,
--      .mesa_format  =        MESA_FORMAT_B5G5R5A1_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_ARGB1555,
-+      .mesa_format     =        MESA_FORMAT_B5G5R5A1_UNORM,
-+      .internal_format =        GL_RGB5_A1,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_XRGB8888,
--      .mesa_format  =        MESA_FORMAT_B8G8R8X8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_XRGB8888,
-+      .mesa_format     =        MESA_FORMAT_B8G8R8X8_UNORM,
-+      .internal_format =        GL_RGBA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_ARGB2101010,
--      .mesa_format  =        MESA_FORMAT_B10G10R10A2_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_ARGB2101010,
-+      .mesa_format     =        MESA_FORMAT_B10G10R10A2_UNORM,
-+      .internal_format =        GL_RGB10_A2,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_XRGB2101010,
--      .mesa_format  =        MESA_FORMAT_B10G10R10X2_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_XRGB2101010,
-+      .mesa_format     =        MESA_FORMAT_B10G10R10X2_UNORM,
-+      .internal_format =        GL_RGB10_A2,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_ABGR2101010,
--      .mesa_format  =        MESA_FORMAT_R10G10B10A2_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_ABGR2101010,
-+      .mesa_format     =        MESA_FORMAT_R10G10B10A2_UNORM,
-+      .internal_format =        GL_RGB10_A2,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_XBGR2101010,
--      .mesa_format  =        MESA_FORMAT_R10G10B10X2_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_XBGR2101010,
-+      .mesa_format     =        MESA_FORMAT_R10G10B10X2_UNORM,
-+      .internal_format =        GL_RGB10_A2,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_ARGB8888,
--      .mesa_format  =        MESA_FORMAT_B8G8R8A8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_ARGB8888,
-+      .mesa_format     =        MESA_FORMAT_B8G8R8A8_UNORM,
-+      .internal_format =        GL_RGBA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_ABGR8888,
--      .mesa_format  =        MESA_FORMAT_R8G8B8A8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_ABGR8888,
-+      .mesa_format     =        MESA_FORMAT_R8G8B8A8_UNORM,
-+      .internal_format =        GL_RGBA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_XBGR8888,
--      .mesa_format  =        MESA_FORMAT_R8G8B8X8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_XBGR8888,
-+      .mesa_format     =        MESA_FORMAT_R8G8B8X8_UNORM,
-+      .internal_format =        GL_RGBA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_R8,
--      .mesa_format  =        MESA_FORMAT_R_UNORM8,
-+      .image_format    = __DRI_IMAGE_FORMAT_R8,
-+      .mesa_format     =        MESA_FORMAT_R_UNORM8,
-+      .internal_format =        GL_R8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_R8,
--      .mesa_format  =        MESA_FORMAT_L_UNORM8,
-+      .image_format    = __DRI_IMAGE_FORMAT_R8,
-+      .mesa_format     =        MESA_FORMAT_L_UNORM8,
-+      .internal_format =        GL_R8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_GR88,
--      .mesa_format  =        MESA_FORMAT_R8G8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_GR88,
-+      .mesa_format     =        MESA_FORMAT_R8G8_UNORM,
-+      .internal_format =        GL_RG8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_GR88,
--      .mesa_format  =        MESA_FORMAT_L8A8_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_GR88,
-+      .mesa_format     =        MESA_FORMAT_L8A8_UNORM,
-+      .internal_format =        GL_RG8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_SABGR8,
--      .mesa_format  =        MESA_FORMAT_R8G8B8A8_SRGB,
-+      .image_format    = __DRI_IMAGE_FORMAT_SABGR8,
-+      .mesa_format     =        MESA_FORMAT_R8G8B8A8_SRGB,
-+      .internal_format =        GL_SRGB8_ALPHA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_SARGB8,
--      .mesa_format  =        MESA_FORMAT_B8G8R8A8_SRGB,
-+      .image_format    = __DRI_IMAGE_FORMAT_SARGB8,
-+      .mesa_format     =        MESA_FORMAT_B8G8R8A8_SRGB,
-+      .internal_format =        GL_SRGB8_ALPHA8,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_R16,
--      .mesa_format  =        MESA_FORMAT_R_UNORM16,
-+      .image_format    = __DRI_IMAGE_FORMAT_R16,
-+      .mesa_format     =        MESA_FORMAT_R_UNORM16,
-+      .internal_format =        GL_R16,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_R16,
--      .mesa_format  =        MESA_FORMAT_L_UNORM16,
-+      .image_format    = __DRI_IMAGE_FORMAT_R16,
-+      .mesa_format     =        MESA_FORMAT_L_UNORM16,
-+      .internal_format =        GL_R16,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_GR1616,
--      .mesa_format  =        MESA_FORMAT_R16G16_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_GR1616,
-+      .mesa_format     =        MESA_FORMAT_R16G16_UNORM,
-+      .internal_format =        GL_RG16,
-    },
-    {
--      .image_format = __DRI_IMAGE_FORMAT_GR1616,
--      .mesa_format  =        MESA_FORMAT_L16A16_UNORM,
-+      .image_format    = __DRI_IMAGE_FORMAT_GR1616,
-+      .mesa_format     =        MESA_FORMAT_L_UNORM16,
-+      .internal_format =        GL_RG16,
-    },
- };
- 
-@@ -976,6 +997,16 @@ driImageFormatToGLFormat(uint32_t image_format)
-    return MESA_FORMAT_NONE;
- }
- 
-+uint32_t
-+driGLFormatToSizedInternalGLFormat(mesa_format format)
-+{
-+   for (size_t i = 0; i < ARRAY_SIZE(format_mapping); i++)
-+      if (format_mapping[i].mesa_format == format)
-+         return format_mapping[i].internal_format;
-+
-+   return GL_NONE;
-+}
-+
- /** Image driver interface */
- const __DRIimageDriverExtension driImageDriverExtension = {
-     .base = { __DRI_IMAGE_DRIVER, 1 },
-diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
-index d6c7d07d4e0..1bc84ebddaa 100644
---- a/src/mesa/drivers/dri/common/dri_util.h
-+++ b/src/mesa/drivers/dri/common/dri_util.h
-@@ -320,6 +320,9 @@ struct __DRIdrawableRec {
- extern uint32_t
- driGLFormatToImageFormat(mesa_format format);
- 
-+extern uint32_t
-+driGLFormatToSizedInternalGLFormat(mesa_format format);
-+
- extern mesa_format
- driImageFormatToGLFormat(uint32_t image_format);
- 
-diff --git a/src/mesa/drivers/dri/i965/intel_extensions.c b/src/mesa/drivers/dri/i965/intel_extensions.c
-index d7080fb21b4..545d3b2e3b8 100644
---- a/src/mesa/drivers/dri/i965/intel_extensions.c
-+++ b/src/mesa/drivers/dri/i965/intel_extensions.c
-@@ -141,6 +141,7 @@ intelInitExtensions(struct gl_context *ctx)
-    ctx->Extensions.OES_texture_float_linear = true;
-    ctx->Extensions.OES_texture_half_float = true;
-    ctx->Extensions.OES_texture_half_float_linear = true;
-+   ctx->Extensions.EXT_EGL_image_storage = true;
- 
-    if (devinfo->gen >= 8)
-       ctx->Const.GLSLVersion = 450;
-diff --git a/src/mesa/drivers/dri/i965/intel_image.h b/src/mesa/drivers/dri/i965/intel_image.h
-index 4ab8a49b8bb..49f26d236f9 100644
---- a/src/mesa/drivers/dri/i965/intel_image.h
-+++ b/src/mesa/drivers/dri/i965/intel_image.h
-@@ -1,4 +1,5 @@
- /*
-+://gitlab.freedesktop.org/mesa/mesa/merge_requests/3299/diffs#diff-content-6d6f80af2b8ec8e1fe366c565ba85c6a1737c7c0 endif
-  * Copyright 2006 VMware, Inc.
-  * All Rights Reserved.
-  *
-@@ -110,6 +111,7 @@ struct __DRIimageRec {
-    /* \} */
- 
-    void *data;
-+   bool imported_dmabuf;
- };
- 
- #ifdef __cplusplus
-diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
-index d34b161f41e..a3ea3692833 100644
---- a/src/mesa/drivers/dri/i965/intel_screen.c
-+++ b/src/mesa/drivers/dri/i965/intel_screen.c
-@@ -1259,6 +1259,7 @@ intel_create_image_from_dma_bufs2(__DRIscreen *dri_screen,
-    image->sample_range = sample_range;
-    image->horizontal_siting = horizontal_siting;
-    image->vertical_siting = vertical_siting;
-+   image->imported_dmabuf = true;
- 
-    *error = __DRI_IMAGE_ERROR_SUCCESS;
-    return image;
-diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
-index 8d4ca7fed72..13ba2a0e506 100644
---- a/src/mesa/drivers/dri/i965/intel_tex_image.c
-+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
-@@ -599,10 +599,11 @@ intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
- }
- 
- static void
--intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
--			      struct gl_texture_object *texObj,
--			      struct gl_texture_image *texImage,
--			      GLeglImageOES image_handle)
-+intel_image_target_texture(struct gl_context *ctx, GLenum target,
-+                           struct gl_texture_object *texObj,
-+                           struct gl_texture_image *texImage,
-+                           GLeglImageOES image_handle,
-+                           bool storage)
- {
-    struct brw_context *brw = brw_context(ctx);
-    struct intel_mipmap_tree *mt;
-@@ -630,13 +631,63 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
-    struct intel_texture_object *intel_texobj = intel_texture_object(texObj);
-    intel_texobj->planar_format = image->planar_format;
- 
--   const GLenum internal_format =
-+   GLenum internal_format =
-       image->internal_format != 0 ?
-       image->internal_format : _mesa_get_format_base_format(mt->format);
-+
-+   /* Fix the internal format when _mesa_get_format_base_format(mt->format)
-+    * isn't a valid one for that particular format.
-+    */
-+   if (brw->mesa_format_supports_render[image->format]) {
-+      if (image->format == MESA_FORMAT_R10G10B10A2_UNORM ||
-+          image->format == MESA_FORMAT_R10G10B10X2_UNORM ||
-+          image->format == MESA_FORMAT_B10G10R10A2_UNORM ||
-+          image->format == MESA_FORMAT_B10G10R10X2_UNORM)
-+         internal_format = GL_RGB10_A2;
-+   }
-+
-+   /* Guess sized internal format for dma-bufs, as specified by
-+    * EXT_EGL_image_storage.
-+    */
-+   if (storage && target == GL_TEXTURE_2D && image->imported_dmabuf) {
-+      internal_format = driGLFormatToSizedInternalGLFormat(image->format);
-+      if (internal_format == GL_NONE) {
-+         _mesa_error(ctx, GL_INVALID_OPERATION, __func__);
-+         return;
-+      }
-+   }
-+
-    intel_set_texture_image_mt(brw, texImage, internal_format, mt->format, mt);
-    intel_miptree_release(&mt);
- }
- 
-+static void
-+intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
-+                              struct gl_texture_object *texObj,
-+                              struct gl_texture_image *texImage,
-+                              GLeglImageOES image_handle)
-+{
-+   intel_image_target_texture(ctx, target, texObj, texImage, image_handle,
-+                              false);
-+}
-+
-+static void
-+intel_image_target_tex_storage(struct gl_context *ctx, GLenum target,
-+                              struct gl_texture_object *texObj,
-+                              struct gl_texture_image *texImage,
-+                              GLeglImageOES image_handle)
-+{
-+   struct intel_texture_object *intel_texobj = intel_texture_object(texObj);
-+   intel_image_target_texture(ctx, target, texObj, texImage, image_handle,
-+                              true);
-+
-+   /* The miptree is in a validated state, so no need to check later. */
-+   intel_texobj->needs_validate = false;
-+   intel_texobj->validated_first_level = 0;
-+   intel_texobj->validated_last_level = 0;
-+   intel_texobj->_Format = texImage->TexFormat;
-+}
-+
- static bool
- intel_gettexsubimage_blorp(struct brw_context *brw,
-                            struct gl_texture_image *tex_image,
-@@ -929,6 +980,7 @@ intelInitTextureImageFuncs(struct dd_function_table *functions)
-    functions->TexSubImage = intelTexSubImage;
-    functions->CompressedTexSubImage = intelCompressedTexSubImage;
-    functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
-+   functions->EGLImageTargetTexStorage = intel_image_target_tex_storage;
-    functions->BindRenderbufferTexImage = intel_bind_renderbuffer_tex_image;
-    functions->GetTexSubImage = intel_get_tex_sub_image;
- }
-diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
-index 1214eeaa474..a09e11b1330 100644
---- a/src/mesa/main/dd.h
-+++ b/src/mesa/main/dd.h
-@@ -973,7 +973,13 @@ struct dd_function_table {
-    void (*EGLImageTargetRenderbufferStorage)(struct gl_context *ctx,
- 					     struct gl_renderbuffer *rb,
- 					     void *image_handle);
--
-+   /**
-+    * \name GL_EXT_EGL_image_storage interface
-+    */
-+   void (*EGLImageTargetTexStorage)(struct gl_context *ctx, GLenum target,
-+                                    struct gl_texture_object *texObj,
-+                                    struct gl_texture_image *texImage,
-+                                    GLeglImageOES image_handle);
-    /**
-     * \name GL_EXT_transform_feedback interface
-     */
-diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
-index bca4aa063f5..cf3271f73c6 100644
---- a/src/mesa/main/extensions_table.h
-+++ b/src/mesa/main/extensions_table.h
-@@ -201,6 +201,7 @@ EXT(ATI_texture_env_combine3                , ATI_texture_env_combine3
- EXT(ATI_texture_float                       , ARB_texture_float                      , GLL, GLC,  x ,  x , 2002)
- EXT(ATI_texture_mirror_once                 , ATI_texture_mirror_once                , GLL, GLC,  x ,  x , 2006)
- 
-+EXT(EXT_EGL_image_storage                   , EXT_EGL_image_storage                  , GLL, GLC , x ,  30, 2018)
- EXT(EXT_abgr                                , dummy_true                             , GLL, GLC,  x ,  x , 1995)
- EXT(EXT_base_instance                       , ARB_base_instance                      ,  x ,  x ,  x ,  30, 2014)
- EXT(EXT_bgra                                , dummy_true                             , GLL,  x ,  x ,  x , 1995)
-diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
-index 9bca5c153ad..9f6aaebbe95 100644
---- a/src/mesa/main/mtypes.h
-+++ b/src/mesa/main/mtypes.h
-@@ -4245,6 +4245,7 @@ struct gl_extensions
-    GLboolean EXT_depth_bounds_test;
-    GLboolean EXT_disjoint_timer_query;
-    GLboolean EXT_draw_buffers2;
-+   GLboolean EXT_EGL_image_storage;
-    GLboolean EXT_float_blend;
-    GLboolean EXT_framebuffer_multisample;
-    GLboolean EXT_framebuffer_multisample_blit_scaled;
-diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
-index a43915e18d9..3d7736a8119 100644
---- a/src/mesa/main/teximage.c
-+++ b/src/mesa/main/teximage.c
-@@ -3229,23 +3229,28 @@ _mesa_TexImage3D_no_error(GLenum target, GLint level, GLint internalFormat,
-                      width, height, depth, border, format, type, 0, pixels);
- }
- 
--
--void GLAPIENTRY
--_mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image)
-+/*
-+ * Helper used by __mesa_EGLImageTargetTexture2DOES and
-+ * _mesa_EGLImageTargetTexStorageEXT.
-+ */
-+static void
-+egl_image_target_texture(struct gl_context *ctx,
-+                         struct gl_texture_object *texObj, GLenum target,
-+                         GLeglImageOES image, bool tex_storage,
-+                         const char *caller)
- {
--   struct gl_texture_object *texObj;
-    struct gl_texture_image *texImage;
-    bool valid_target;
--   GET_CURRENT_CONTEXT(ctx);
-    FLUSH_VERTICES(ctx, 0);
- 
-    switch (target) {
-    case GL_TEXTURE_2D:
--      valid_target = ctx->Extensions.OES_EGL_image;
-+      valid_target = _mesa_has_OES_EGL_image(ctx) ||
-+                     (tex_storage && _mesa_has_EXT_EGL_image_storage(ctx));
-       break;
-    case GL_TEXTURE_EXTERNAL_OES:
-       valid_target =
--         _mesa_is_gles(ctx) ? ctx->Extensions.OES_EGL_image_external : false;
-+         _mesa_is_gles(ctx) ? _mesa_has_OES_EGL_image_external(ctx) : false;
-       break;
-    default:
-       valid_target = false;
-@@ -3253,47 +3258,139 @@ _mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image)
-    }
- 
-    if (!valid_target) {
--      _mesa_error(ctx, GL_INVALID_ENUM,
--                  "glEGLImageTargetTexture2D(target=%d)", target);
-+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(target=%d)", caller, target);
-       return;
-    }
- 
-    if (!image) {
--      _mesa_error(ctx, GL_INVALID_OPERATION,
--                  "glEGLImageTargetTexture2D(image=%p)", image);
-+      _mesa_error(ctx, GL_INVALID_VALUE, "%s(image=%p)", caller, image);
-       return;
-    }
- 
-    if (ctx->NewState & _NEW_PIXEL)
-       _mesa_update_state(ctx);
- 
--   texObj = _mesa_get_current_tex_object(ctx, target);
--   if (!texObj)
--      return;
--
-    _mesa_lock_texture(ctx, texObj);
- 
-    if (texObj->Immutable) {
--      _mesa_error(ctx, GL_INVALID_OPERATION,
--                  "glEGLImageTargetTexture2D(texture is immutable)");
-+      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture is immutable)", caller);
-       _mesa_unlock_texture(ctx, texObj);
-       return;
-    }
- 
-    texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
-    if (!texImage) {
--      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D");
-+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
-    } else {
-       ctx->Driver.FreeTextureImageBuffer(ctx, texImage);
- 
--      ctx->Driver.EGLImageTargetTexture2D(ctx, target,
--                                          texObj, texImage, image);
-+      if (tex_storage) {
-+         ctx->Driver.EGLImageTargetTexStorage(ctx, target, texObj, texImage,
-+                                              image);
-+      } else {
-+         ctx->Driver.EGLImageTargetTexture2D(ctx, target, texObj, texImage,
-+                                             image);
-+      }
- 
-       _mesa_dirty_texobj(ctx, texObj);
-    }
-+
-+   if (tex_storage)
-+      _mesa_set_texture_view_state(ctx, texObj, target, 1);
-+
-    _mesa_unlock_texture(ctx, texObj);
- }
- 
-+void GLAPIENTRY
-+_mesa_EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
-+{
-+   struct gl_texture_object *texObj;
-+   const char *func = "glEGLImageTargetTexture2D";
-+   GET_CURRENT_CONTEXT(ctx);
-+
-+   texObj = _mesa_get_current_tex_object(ctx, target);
-+   if (!texObj) {
-+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(target=%d)", func, target);
-+      return;
-+   }
-+
-+   egl_image_target_texture(ctx, texObj, target, image, false, func);
-+}
-+
-+static void
-+egl_image_target_texture_storage(struct gl_context *ctx,
-+                                 struct gl_texture_object *texObj, GLenum target,
-+                                 GLeglImageOES image, const GLint *attrib_list,
-+                                 const char *caller)
-+{
-+   /*
-+    * EXT_EGL_image_storage:
-+    *
-+    * "<attrib_list> must be NULL or a pointer to the value GL_NONE."
-+    */
-+   if (attrib_list && attrib_list[0] != GL_NONE) {
-+      _mesa_error(ctx, GL_INVALID_VALUE, "%s(image=%p)", caller, image);
-+      return;
-+   }
-+
-+   switch (target) {
-+   case GL_TEXTURE_2D:
-+   case GL_TEXTURE_EXTERNAL_OES:
-+      break;
-+   default:
-+    /*
-+     * The EXT_EGL_image_storage spec allows for many other targets besides
-+     * GL_TEXTURE_2D and GL_TEXTURE_EXTERNAL_OES, however these are complicated
-+     * to implement.
-+     */
-+     _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported target=%d)",
-+                 caller, target);
-+     return;
-+   }
-+
-+   egl_image_target_texture(ctx, texObj, target, image, true, caller);
-+}
-+
-+
-+void GLAPIENTRY
-+_mesa_EGLImageTargetTexStorageEXT(GLenum target, GLeglImageOES image,
-+                                  const GLint *attrib_list)
-+{
-+   struct gl_texture_object *texObj;
-+   const char *func = "glEGLImageTargetTexStorageEXT";
-+   GET_CURRENT_CONTEXT(ctx);
-+
-+   texObj = _mesa_get_current_tex_object(ctx, target);
-+   if (!texObj) {
-+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(target=%d)", func, target);
-+      return;
-+   }
-+
-+   egl_image_target_texture_storage(ctx, texObj, target, image, attrib_list,
-+                                    func);
-+}
-+
-+void GLAPIENTRY
-+_mesa_EGLImageTargetTextureStorageEXT(GLuint texture, GLeglImageOES image,
-+                                      const GLint *attrib_list)
-+{
-+   struct gl_texture_object *texObj;
-+   const char *func = "glEGLImageTargetTextureStorageEXT";
-+   GET_CURRENT_CONTEXT(ctx);
-+
-+   if (!(_mesa_is_desktop_gl(ctx) && ctx->Version >= 45) &&
-+       !_mesa_has_ARB_direct_state_access(ctx)) {
-+      _mesa_error(ctx, GL_INVALID_OPERATION, "direct access not supported");
-+      return;
-+   }
-+
-+   texObj = _mesa_lookup_texture_err(ctx, texture, func);
-+   if (!texObj)
-+      return;
-+
-+   egl_image_target_texture_storage(ctx, texObj, texObj->Target, image,
-+                                    attrib_list, func);
-+}
- 
- /**
-  * Helper that implements the glTexSubImage1/2/3D()
-diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
-index 266a9f3d83d..55c0ff87a48 100644
---- a/src/mesa/main/teximage.h
-+++ b/src/mesa/main/teximage.h
-@@ -299,6 +299,13 @@ _mesa_TexImage3D_no_error(GLenum target, GLint level, GLint internalformat,
- extern void GLAPIENTRY
- _mesa_EGLImageTargetTexture2DOES( GLenum target, GLeglImageOES image );
- 
-+extern void GLAPIENTRY
-+_mesa_EGLImageTargetTexStorageEXT(GLenum target, GLeglImageOES image,
-+                                  const GLint *attrib_list);
-+extern void GLAPIENTRY
-+_mesa_EGLImageTargetTextureStorageEXT(GLuint texture, GLeglImageOES image,
-+                                      const GLint *attrib_list);
-+
- void GLAPIENTRY
- _mesa_TexSubImage1D_no_error(GLenum target, GLint level, GLint xoffset,
-                              GLsizei width,
--- 
-2.24.1
-
diff --git a/media-libs/mesa-llvmpipe/files/0001-GL_MESA_framebuffer_flip_y-include-GLES2-Sync-GLES2-headers-with-Khronos.patch b/media-libs/mesa-llvmpipe/files/0001-GL_MESA_framebuffer_flip_y-include-GLES2-Sync-GLES2-headers-with-Khronos.patch
deleted file mode 100644
index 1c87c96..0000000
--- a/media-libs/mesa-llvmpipe/files/0001-GL_MESA_framebuffer_flip_y-include-GLES2-Sync-GLES2-headers-with-Khronos.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From a09ee21d476a64033fed13f1473119eb3b6d9ce3 Mon Sep 17 00:00:00 2001
-From: Fritz Koenig <frkoenig@google.com>
-Date: Mon, 7 Oct 2019 11:33:59 -0700
-Subject: [PATCH 1/5] include/GLES2: Sync GLES2 headers with Khronos
-
-Bring in glFramebufferParameteriMESA/glGetFramebufferParameterivMESA
-
-Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
----
- include/GLES2/gl2.h    |  2 +-
- include/GLES2/gl2ext.h | 74 +++++++++++++++++++++++++++++++++++++++++-
- 2 files changed, 74 insertions(+), 2 deletions(-)
-
-diff --git a/include/GLES2/gl2.h b/include/GLES2/gl2.h
-index b4051e5a7c5..bd5034a14bc 100644
---- a/include/GLES2/gl2.h
-+++ b/include/GLES2/gl2.h
-@@ -44,7 +44,7 @@ extern "C" {
- #define GL_GLES_PROTOTYPES 1
- #endif
- 
--/* Generated on date 20180725 */
-+/* Generated on date 20190911 */
- 
- /* Generated C header for:
-  * API: gles2
-diff --git a/include/GLES2/gl2ext.h b/include/GLES2/gl2ext.h
-index 559173dee45..b68d92366c7 100644
---- a/include/GLES2/gl2ext.h
-+++ b/include/GLES2/gl2ext.h
-@@ -38,7 +38,7 @@ extern "C" {
- #define GL_APIENTRYP GL_APIENTRY*
- #endif
- 
--/* Generated on date 20180725 */
-+/* Generated on date 20190911 */
- 
- /* Generated C header for:
-  * API: gles2
-@@ -197,6 +197,22 @@ GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location,
- #endif
- #endif /* GL_KHR_robustness */
- 
-+#ifndef GL_KHR_shader_subgroup
-+#define GL_KHR_shader_subgroup 1
-+#define GL_SUBGROUP_SIZE_KHR              0x9532
-+#define GL_SUBGROUP_SUPPORTED_STAGES_KHR  0x9533
-+#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534
-+#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR   0x9535
-+#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001
-+#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR  0x00000002
-+#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004
-+#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008
-+#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010
-+#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020
-+#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040
-+#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR  0x00000080
-+#endif /* GL_KHR_shader_subgroup */
-+
- #ifndef GL_KHR_texture_compression_astc_hdr
- #define GL_KHR_texture_compression_astc_hdr 1
- #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR   0x93B0
-@@ -2414,6 +2430,12 @@ GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint quer
- #ifndef GL_MESA_framebuffer_flip_y
- #define GL_MESA_framebuffer_flip_y 1
- #define GL_FRAMEBUFFER_FLIP_Y_MESA        0x8BBB
-+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param);
-+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint *params);
-+#ifdef GL_GLEXT_PROTOTYPES
-+GL_APICALL void GL_APIENTRY glFramebufferParameteriMESA (GLenum target, GLenum pname, GLint param);
-+GL_APICALL void GL_APIENTRY glGetFramebufferParameterivMESA (GLenum target, GLenum pname, GLint *params);
-+#endif
- #endif /* GL_MESA_framebuffer_flip_y */
- 
- #ifndef GL_MESA_program_binary_formats
-@@ -3352,6 +3374,56 @@ GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void);
- #define GL_NV_shader_noperspective_interpolation 1
- #endif /* GL_NV_shader_noperspective_interpolation */
- 
-+#ifndef GL_NV_shader_subgroup_partitioned
-+#define GL_NV_shader_subgroup_partitioned 1
-+#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100
-+#endif /* GL_NV_shader_subgroup_partitioned */
-+
-+#ifndef GL_NV_shader_texture_footprint
-+#define GL_NV_shader_texture_footprint 1
-+#endif /* GL_NV_shader_texture_footprint */
-+
-+#ifndef GL_NV_shading_rate_image
-+#define GL_NV_shading_rate_image 1
-+#define GL_SHADING_RATE_IMAGE_NV          0x9563
-+#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564
-+#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565
-+#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566
-+#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567
-+#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568
-+#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569
-+#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A
-+#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B
-+#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C
-+#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D
-+#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E
-+#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F
-+#define GL_SHADING_RATE_IMAGE_BINDING_NV  0x955B
-+#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C
-+#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D
-+#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E
-+#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F
-+#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE
-+#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF
-+#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0
-+typedef void (GL_APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture);
-+typedef void (GL_APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate);
-+typedef void (GL_APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location);
-+typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize);
-+typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates);
-+typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order);
-+typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations);
-+#ifdef GL_GLEXT_PROTOTYPES
-+GL_APICALL void GL_APIENTRY glBindShadingRateImageNV (GLuint texture);
-+GL_APICALL void GL_APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate);
-+GL_APICALL void GL_APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location);
-+GL_APICALL void GL_APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize);
-+GL_APICALL void GL_APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates);
-+GL_APICALL void GL_APIENTRY glShadingRateSampleOrderNV (GLenum order);
-+GL_APICALL void GL_APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations);
-+#endif
-+#endif /* GL_NV_shading_rate_image */
-+
- #ifndef GL_NV_shadow_samplers_array
- #define GL_NV_shadow_samplers_array 1
- #define GL_SAMPLER_2D_ARRAY_SHADOW_NV     0x8DC4
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/0001-Revert-meson-update-llvm-dependency-logic-for-meson-.patch b/media-libs/mesa-llvmpipe/files/0001-Revert-meson-update-llvm-dependency-logic-for-meson-.patch
new file mode 100644
index 0000000..35dac19
--- /dev/null
+++ b/media-libs/mesa-llvmpipe/files/0001-Revert-meson-update-llvm-dependency-logic-for-meson-.patch
@@ -0,0 +1,53 @@
+From 61729a39f173ecfdc31cb09ede4575f4c6bd481c Mon Sep 17 00:00:00 2001
+From: Rob Clark <robdclark@google.com>
+Date: Mon, 8 Jun 2020 09:09:06 -0700
+Subject: [PATCH 1/2] Revert "meson: update llvm dependency logic for meson
+ 0.54.0"
+
+This reverts commit 8d13ea15710f90485f1fec915e3ed0d5a4aecf5b.
+---
+ .pick_status.json |  2 +-
+ meson.build       | 14 ++++++--------
+ 2 files changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/.pick_status.json b/.pick_status.json
+index 60ea7967317..5ff6f169f16 100644
+--- a/.pick_status.json
++++ b/.pick_status.json
+@@ -9103,7 +9103,7 @@
+         "description": "meson: update llvm dependency logic for meson 0.54.0",
+         "nominated": true,
+         "nomination_type": 1,
+-        "resolution": 1,
++        "resolution": 0,
+         "master_sha": null,
+         "because_sha": "821cf6942a390f5f64d8a2cff9933b24c84f7dc1"
+     },
+diff --git a/meson.build b/meson.build
+index ef4bdc2cb02..ef7a602cb03 100644
+--- a/meson.build
++++ b/meson.build
+@@ -1389,14 +1389,12 @@ endif
+ _shared_llvm = get_option('shared-llvm')
+ _llvm = get_option('llvm')
+ 
+-# the cmake method can only link statically, so don't attempt to use it if we
+-# want to link dynamically. Before 0.54.0 meson will try cmake even when shared
+-# linking is requested, so we need to force the config-tool method to be used
+-# in that case, but in 0.54.0 meson won't try the cmake method if shared
+-# linking is requested.
+-_llvm_method = 'auto'
+-if meson.version().version_compare('< 0.54.0') and _shared_llvm
+-  _llvm_method = 'config-tool'
++# The cmake method will never find libllvm.so|dylib; this is fine for windows
++# because llvm doesn't support libllvm.dll
++_llvm_method = 'config-tool'
++if (meson.version().version_compare('>= 0.51.0') and
++    host_machine.system() == 'windows')
++  _llvm_method = 'cmake'
+ endif
+ 
+ dep_llvm = null_dep
+-- 
+2.26.2
+
diff --git a/media-libs/mesa-llvmpipe/files/0001-meson-Force-the-use-of-config-tool-for-llvm.patch b/media-libs/mesa-llvmpipe/files/0001-meson-Force-the-use-of-config-tool-for-llvm.patch
deleted file mode 100644
index 118691b..0000000
--- a/media-libs/mesa-llvmpipe/files/0001-meson-Force-the-use-of-config-tool-for-llvm.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 0d59459432cf077d768164091318af8fb1612500 Mon Sep 17 00:00:00 2001
-From: Dylan Baker <dylan@pnwbakers.com>
-Date: Tue, 7 May 2019 09:55:38 -0700
-Subject: [PATCH] meson: Force the use of config-tool for llvm
-
-meson git now has a cmake find method for llvm, but it lacks a couple of
-features that we use from the config tool version. Until that reaches
-parity we need to use the config-tool version.
-
-CC: 19.0 19.1 <<mesa-stable@lists.freedesktop.org>
-Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
----
- meson.build | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/meson.build b/meson.build
-index f72bdc946bfb..8ab8a550f56c 100644
---- a/meson.build
-+++ b/meson.build
-@@ -1258,6 +1258,7 @@ if _llvm != 'false'
-       with_gallium_opencl or _llvm == 'true'
-     ),
-     static : not _shared_llvm,
-+    method : 'config-tool',
-   )
-   with_llvm = dep_llvm.found()
- endif
--- 
-2.27.0.278.ge193c7cf3a9-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/0002-GL_MESA_framebuffer_flip_y-mesa-GetFramebufferParameteriv-spelling.patch b/media-libs/mesa-llvmpipe/files/0002-GL_MESA_framebuffer_flip_y-mesa-GetFramebufferParameteriv-spelling.patch
deleted file mode 100644
index d1c519a..0000000
--- a/media-libs/mesa-llvmpipe/files/0002-GL_MESA_framebuffer_flip_y-mesa-GetFramebufferParameteriv-spelling.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 59796bf4a5e15920b868e745015e5c255a95bdd8 Mon Sep 17 00:00:00 2001
-From: Fritz Koenig <frkoenig@google.com>
-Date: Mon, 7 Oct 2019 11:15:03 -0700
-Subject: [PATCH 2/5] mesa: GetFramebufferParameteriv spelling
-
-GetFramebufferParameteriv was incorrectly spelled as
-GetFramebufferParameteri.
-
-Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
----
- src/mapi/glapi/gen/apiexec.py | 2 +-
- src/mapi/glapi/gen/gl_API.xml | 8 ++++----
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/mapi/glapi/gen/apiexec.py b/src/mapi/glapi/gen/apiexec.py
-index e2fc124be22..4f9229d5fcd 100644
---- a/src/mapi/glapi/gen/apiexec.py
-+++ b/src/mapi/glapi/gen/apiexec.py
-@@ -148,7 +148,7 @@ functions = {
-     # OpenGL 4.3 / GL_ARB_framebuffer_no_attachments.  Mesa can expose the
-     # extension with OpenGL 3.0.
-     "FramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
--    "GetFramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
-+    "GetFramebufferParameteriv": exec_info(compatibility=30, core=31, es2=31),
- 
-     # OpenGL 4.5 / GL_ARB_direct_state_access.   Mesa can expose the extension
-     # with core profile.
-diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
-index 929e5f6b024..9ee91a4a6fb 100644
---- a/src/mapi/glapi/gen/gl_API.xml
-+++ b/src/mapi/glapi/gen/gl_API.xml
-@@ -10908,12 +10908,12 @@
- 
-     <enum name="FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB" value="0x9342">
-         <size name="FramebufferParameteri"/>
--        <size name="GetFramebufferParameteri"/>
-+        <size name="GetFramebufferParameteriv"/>
-     </enum>
- 
-     <enum name="FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB"    value="0x9343">
-         <size name="FramebufferParameteri"/>
--        <size name="GetFramebufferParameteri"/>
-+        <size name="GetFramebufferParameteriv"/>
-     </enum>
- 
-     <function name="FramebufferSampleLocationsfvARB" no_error="true">
-@@ -10960,12 +10960,12 @@
- 
-     <enum name="FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV" value="0x9342" alias="FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB">
-         <size name="FramebufferParameteri"/>
--        <size name="GetFramebufferParameteri"/>
-+        <size name="GetFramebufferParameteriv"/>
-     </enum>
- 
-     <enum name="FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV"    value="0x9343" alias="FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB">
-         <size name="FramebufferParameteri"/>
--        <size name="GetFramebufferParameteri"/>
-+        <size name="GetFramebufferParameteriv"/>
-     </enum>
- 
-     <function name="FramebufferSampleLocationsfvNV" no_error="true" es2="3.1" alias="FramebufferSampleLocationsfvARB">
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/0003-GL_MESA_framebuffer_flip_y-mesa-Allow-MESA_framebuffer_flip_y-for-GLES-3.patch b/media-libs/mesa-llvmpipe/files/0003-GL_MESA_framebuffer_flip_y-mesa-Allow-MESA_framebuffer_flip_y-for-GLES-3.patch
deleted file mode 100644
index 14fb6be..0000000
--- a/media-libs/mesa-llvmpipe/files/0003-GL_MESA_framebuffer_flip_y-mesa-Allow-MESA_framebuffer_flip_y-for-GLES-3.patch
+++ /dev/null
@@ -1,306 +0,0 @@
-From 98f2bc9e65ea6e8cbc4f15e02afae1c05010be08 Mon Sep 17 00:00:00 2001
-From: Fritz Koenig <frkoenig@google.com>
-Date: Tue, 30 Jul 2019 14:53:30 -0700
-Subject: [PATCH 3/5] mesa: Allow MESA_framebuffer_flip_y for GLES 3
-
-Implement glFramebufferParameteriMESA on GLES 3 so
-that the extension is not dependant on GLES 3.1
-
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
----
- docs/specs/MESA_framebuffer_flip_y.txt  | 35 ++++++++++++---
- src/mapi/glapi/gen/apiexec.py           |  4 ++
- src/mapi/glapi/gen/es_EXT.xml           | 15 +++++++
- src/mapi/glapi/gen/static_data.py       |  2 +
- src/mesa/main/extensions_table.h        |  2 +-
- src/mesa/main/fbobject.c                | 59 ++++++++++++++++++++-----
- src/mesa/main/fbobject.h                |  6 +++
- src/mesa/main/tests/dispatch_sanity.cpp |  8 ++++
- 8 files changed, 111 insertions(+), 20 deletions(-)
-
-diff --git a/docs/specs/MESA_framebuffer_flip_y.txt b/docs/specs/MESA_framebuffer_flip_y.txt
-index 697ab4e75d6..b13e4eeb388 100644
---- a/docs/specs/MESA_framebuffer_flip_y.txt
-+++ b/docs/specs/MESA_framebuffer_flip_y.txt
-@@ -22,7 +22,7 @@ Status
- 
- Version
- 
--    Version 1, June 7, 2018
-+    Version 3, August, 2019
- 
- Number
- 
-@@ -30,7 +30,7 @@ Number
- 
- Dependencies
- 
--    OpenGL ES 3.1 is required, for FramebufferParameteri.
-+    Requires OpenGL ES 3.0, OpenGL 4.3, or ARB_framebuffer_no_attachments.
- 
- Overview
- 
-@@ -57,7 +57,10 @@ Issues
- 
- New Procedures and Functions
- 
--    None
-+    OpenGL ES must provide the following functions:
-+
-+    void FramebufferParameteriMESA(enum target, enum pname, int param);
-+    void GetFramebufferParameterivMESA(enum target, enum pname, int *params);
- 
- New Types
- 
-@@ -65,17 +68,35 @@ New Types
- 
- New Tokens
- 
--    Accepted by the <pname> argument of FramebufferParameteri and
--    GetFramebufferParameteriv:
-+    Accepted by the <pname> argument of FramebufferParameteriMESA and
-+    GetFramebufferParameterivMESA:
- 
-         GL_FRAMEBUFFER_FLIP_Y_MESA                      0x8BBB
- 
-+Interactions with OpenGL 4.3, OpenGL ES 3.1, ARB_framebuffer_no_attachments
-+and any other versions and extensions that provide the entry points
-+FramebufferParameteri and GetFramebufferParameteriv
-+
-+        Token GL_FRAMEBUFFER_FLIP_Y_MESA is accepted as the <pname> argument of
-+        FramebufferParameteri and GetFramebufferParameteriv.
-+
- Errors
- 
--    An INVALID_OPERATION error is generated by GetFramebufferParameteriv if the
--    default framebuffer is bound to <target> and <pname> is FRAMEBUFFER_FLIP_Y_MESA.
-+    An INVALID_OPERATION error is generated by GetFramebufferParameteriv or
-+    GetFramebufferParameterivMESA if the default framebuffer is bound
-+    to <target> and <pname> is GL_FRAMEBUFFER_FLIP_Y_MESA.
-+
-+
- 
- Revision History
- 
-+    Version 3, August, 2019
-+        Allow OpenGL ES 3.0 to implement by adding functions
-+        FramebufferParameteriMESA and GetFramebufferParameterivMESA which were
-+        previously only available in OpenGL ES 3.1.
-+
-+    Version 2, June, 2019
-+        Enable extension for OpenGL 4.3 and beyond
-+
-     Version 1, June, 2018
-         Initial draft (Fritz Koenig)
-diff --git a/src/mapi/glapi/gen/apiexec.py b/src/mapi/glapi/gen/apiexec.py
-index 4f9229d5fcd..26adb00ae21 100644
---- a/src/mapi/glapi/gen/apiexec.py
-+++ b/src/mapi/glapi/gen/apiexec.py
-@@ -150,6 +150,10 @@ functions = {
-     "FramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
-     "GetFramebufferParameteriv": exec_info(compatibility=30, core=31, es2=31),
- 
-+    # OpenGL 4.3 / GL_MESA_framebuffer_flip_y.
-+    "FramebufferParameteriMESA": exec_info(core=31, es2=30),
-+    "GetFramebufferParameterivMESA": exec_info(core=31, es2=30),
-+
-     # OpenGL 4.5 / GL_ARB_direct_state_access.   Mesa can expose the extension
-     # with core profile.
-     "CreateTransformFeedbacks": exec_info(compatibility=31, core=31),
-diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
-index 917fed62f98..3a797a50989 100644
---- a/src/mapi/glapi/gen/es_EXT.xml
-+++ b/src/mapi/glapi/gen/es_EXT.xml
-@@ -1475,4 +1475,19 @@
-    </function>
- </category>
- 
-+<!-- 302. GL_MESA_framebuffer_flip_y -->
-+<category name="GL_MESA_framebuffer_flip_y" number="302">
-+   <enum name="GL_FRAMEBUFFER_FLIP_Y_MESA" value="0x8BBB"/>
-+   <function name="FramebufferParameteriMESA" es2="3.0">
-+       <param name="target" type="GLenum"/>
-+       <param name="pname"  type="GLenum"/>
-+       <param name="param"  type="GLint" />
-+   </function>
-+   <function name="GetFramebufferParameterivMESA" es2="3.0">
-+       <param name="target" type="GLenum" />
-+       <param name="pname"  type="GLenum" />
-+       <param name="params" type="GLint *" output="true" />
-+   </function>
-+</category>
-+
- </OpenGLAPI>
-diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
-index bc49324348f..24781390d30 100644
---- a/src/mapi/glapi/gen/static_data.py
-+++ b/src/mapi/glapi/gen/static_data.py
-@@ -1453,6 +1453,8 @@ offsets = {
-     "TexParameterxv": 1417,
-     "BlendBarrier": 1418,
-     "PrimitiveBoundingBox": 1419,
-+    "FramebufferParameteriMESA": 1420,
-+    "GetFramebufferParameterivMESA": 1421,
- }
- 
- functions = [
-diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
-index 05ed418d750..bca4aa063f5 100644
---- a/src/mesa/main/extensions_table.h
-+++ b/src/mesa/main/extensions_table.h
-@@ -342,7 +342,7 @@ EXT(KHR_texture_compression_astc_hdr        , KHR_texture_compression_astc_hdr
- EXT(KHR_texture_compression_astc_ldr        , KHR_texture_compression_astc_ldr       , GLL, GLC,  x , ES2, 2012)
- EXT(KHR_texture_compression_astc_sliced_3d  , KHR_texture_compression_astc_sliced_3d , GLL, GLC,  x , ES2, 2015)
- 
--EXT(MESA_framebuffer_flip_y                 , MESA_framebuffer_flip_y                ,   x,   x,  x ,  31, 2018)
-+EXT(MESA_framebuffer_flip_y                 , MESA_framebuffer_flip_y                ,  43,  43,  x ,  30, 2018)
- EXT(MESA_pack_invert                        , MESA_pack_invert                       , GLL, GLC,  x ,  x , 2002)
- EXT(MESA_shader_integer_functions           , MESA_shader_integer_functions          , GLL, GLC,  x ,  30, 2016)
- EXT(MESA_texture_signed_rgba                , EXT_texture_snorm                      , GLL, GLC,  x ,  x , 2009)
-diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
-index 047ef4ee395..3010de79818 100644
---- a/src/mesa/main/fbobject.c
-+++ b/src/mesa/main/fbobject.c
-@@ -1590,18 +1590,46 @@ invalid_pname_enum:
-    _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
- }
- 
-+static bool
-+validate_framebuffer_parameter_extensions(GLenum pname, const char *func)
-+{
-+   GET_CURRENT_CONTEXT(ctx);
-+
-+   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
-+       !ctx->Extensions.ARB_sample_locations &&
-+       !ctx->Extensions.MESA_framebuffer_flip_y) {
-+      _mesa_error(ctx, GL_INVALID_OPERATION,
-+                  "%s not supported "
-+                  "(none of ARB_framebuffer_no_attachments,"
-+                  " ARB_sample_locations, or"
-+                  " MESA_framebuffer_flip_y extensions are available)",
-+                  func);
-+      return false;
-+   }
-+
-+   /*
-+    * If only the MESA_framebuffer_flip_y extension is enabled
-+    * pname can only be GL_FRAMEBUFFER_FLIP_Y_MESA
-+    */
-+   if (ctx->Extensions.MESA_framebuffer_flip_y &&
-+       pname != GL_FRAMEBUFFER_FLIP_Y_MESA &&
-+       !(ctx->Extensions.ARB_framebuffer_no_attachments ||
-+         ctx->Extensions.ARB_sample_locations)) {
-+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
-+      return false;
-+   }
-+
-+   return true;
-+}
-+
- void GLAPIENTRY
- _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
- {
-    GET_CURRENT_CONTEXT(ctx);
-    struct gl_framebuffer *fb;
- 
--   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
--       !ctx->Extensions.ARB_sample_locations) {
--      _mesa_error(ctx, GL_INVALID_OPERATION,
--                  "glFramebufferParameteriv not supported "
--                  "(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
--                  " is available)");
-+   if (!validate_framebuffer_parameter_extensions(pname,
-+       "glFramebufferParameteri")) {
-       return;
-    }
- 
-@@ -1615,6 +1643,12 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
-    framebuffer_parameteri(ctx, fb, pname, param, "glFramebufferParameteri");
- }
- 
-+void GLAPIENTRY
-+_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param)
-+{
-+   _mesa_FramebufferParameteri(target, pname, param);
-+}
-+
- static bool
- validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx,
-                                            struct gl_framebuffer *fb,
-@@ -1744,12 +1778,8 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-    GET_CURRENT_CONTEXT(ctx);
-    struct gl_framebuffer *fb;
- 
--   if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
--       !ctx->Extensions.ARB_sample_locations) {
--      _mesa_error(ctx, GL_INVALID_OPERATION,
--                  "glGetFramebufferParameteriv not supported "
--                  "(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
--                  " is available)");
-+   if (!validate_framebuffer_parameter_extensions(pname,
-+       "glGetFramebufferParameteriv")) {
-       return;
-    }
- 
-@@ -1764,6 +1794,11 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
-                                "glGetFramebufferParameteriv");
- }
- 
-+void GLAPIENTRY
-+_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params)
-+{
-+   _mesa_GetFramebufferParameteriv(target, pname, params);
-+}
- 
- /**
-  * Remove the specified renderbuffer or texture from any attachment point in
-diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
-index fcf9835dfa4..6796571f809 100644
---- a/src/mesa/main/fbobject.h
-+++ b/src/mesa/main/fbobject.h
-@@ -369,9 +369,15 @@ _mesa_DiscardFramebufferEXT(GLenum target, GLsizei numAttachments,
- extern void GLAPIENTRY
- _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param);
- 
-+extern void GLAPIENTRY
-+_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param);
-+
- extern void GLAPIENTRY
- _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
- 
-+extern void GLAPIENTRY
-+_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params);
-+
- extern void GLAPIENTRY
- _mesa_FramebufferSampleLocationsfvARB(GLenum target, GLuint start,
-                                       GLsizei count, const GLfloat *v);
-diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
-index 672e4ce892a..57364041b6e 100644
---- a/src/mesa/main/tests/dispatch_sanity.cpp
-+++ b/src/mesa/main/tests/dispatch_sanity.cpp
-@@ -1198,6 +1198,10 @@ const struct function common_desktop_functions_possible[] = {
-    { "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
-    { "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
- 
-+   /* GL_MESA_framebuffer_flip_y */
-+   { "glFramebufferParameteriMESA", 43, -1 },
-+   { "glGetFramebufferParameterivMESA", 43, -1 },
-+
-    { NULL, 0, -1 }
- };
- 
-@@ -2433,6 +2437,10 @@ const struct function gles3_functions_possible[] = {
-    { "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
-    { "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
- 
-+   /* GL_MESA_framebuffer_flip_y */
-+   { "glFramebufferParameteriMESA", 30, -1 },
-+   { "glGetFramebufferParameterivMESA", 30, -1 },
-+
-    { NULL, 0, -1 }
- };
- 
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/0004-GL_MESA_framebuffer_flip_y-gallium-Enable-MESA_framebuffer_flip_y.patch b/media-libs/mesa-llvmpipe/files/0004-GL_MESA_framebuffer_flip_y-gallium-Enable-MESA_framebuffer_flip_y.patch
deleted file mode 100644
index 5e06ace..0000000
--- a/media-libs/mesa-llvmpipe/files/0004-GL_MESA_framebuffer_flip_y-gallium-Enable-MESA_framebuffer_flip_y.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From ca3dd1356efce1aea16ada65eb6aaf77523ca7f1 Mon Sep 17 00:00:00 2001
-From: Fritz Koenig <frkoenig@google.com>
-Date: Tue, 30 Jul 2019 14:40:33 -0700
-Subject: [PATCH 4/5] gallium: Enable MESA_framebuffer_flip_y
-
-Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
----
- src/mesa/state_tracker/st_atom_stipple.c | 2 +-
- src/mesa/state_tracker/st_cb_fbo.c       | 5 +----
- src/mesa/state_tracker/st_context.h      | 2 +-
- src/mesa/state_tracker/st_extensions.c   | 1 +
- 4 files changed, 4 insertions(+), 6 deletions(-)
-
-diff --git a/src/mesa/state_tracker/st_atom_stipple.c b/src/mesa/state_tracker/st_atom_stipple.c
-index 87599f94d50..3437553c154 100644
---- a/src/mesa/state_tracker/st_atom_stipple.c
-+++ b/src/mesa/state_tracker/st_atom_stipple.c
-@@ -74,7 +74,7 @@ st_update_polygon_stipple( struct st_context *st )
- 
-       memcpy(st->state.poly_stipple, ctx->PolygonStipple, sz);
- 
--      if (_mesa_is_user_fbo(ctx->DrawBuffer)) {
-+      if (ctx->DrawBuffer->FlipY) {
-          memcpy(newStipple.stipple, ctx->PolygonStipple, sizeof(newStipple.stipple));
-       } else {
-          invert_stipple(newStipple.stipple, ctx->PolygonStipple,
-diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
-index 3bd7fd4ad27..cd79c0be1db 100644
---- a/src/mesa/state_tracker/st_cb_fbo.c
-+++ b/src/mesa/state_tracker/st_cb_fbo.c
-@@ -857,13 +857,10 @@ st_MapRenderbuffer(struct gl_context *ctx,
-    struct st_context *st = st_context(ctx);
-    struct st_renderbuffer *strb = st_renderbuffer(rb);
-    struct pipe_context *pipe = st->pipe;
--   const GLboolean invert = rb->Name == 0;
-+   const GLboolean invert = flip_y;
-    GLuint y2;
-    GLubyte *map;
- 
--   /* driver does not support GL_FRAMEBUFFER_FLIP_Y_MESA */
--   assert((rb->Name == 0) == flip_y);
--
-    if (strb->software) {
-       /* software-allocated renderbuffer (probably an accum buffer) */
-       if (strb->data) {
-diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
-index 324a7f24178..323747c2802 100644
---- a/src/mesa/state_tracker/st_context.h
-+++ b/src/mesa/state_tracker/st_context.h
-@@ -369,7 +369,7 @@ st_invalidate_readpix_cache(struct st_context *st)
- static inline GLuint
- st_fb_orientation(const struct gl_framebuffer *fb)
- {
--   if (fb && _mesa_is_winsys_fbo(fb)) {
-+   if (fb && fb->FlipY) {
-       /* Drawing into a window (on-screen buffer).
-        *
-        * Negate Y scale to flip image vertically.
-diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
-index 528e6b74a54..f583ce389e8 100644
---- a/src/mesa/state_tracker/st_extensions.c
-+++ b/src/mesa/state_tracker/st_extensions.c
-@@ -1010,6 +1010,7 @@ void st_init_extensions(struct pipe_screen *screen,
-    extensions->ATI_fragment_shader = GL_TRUE;
-    extensions->ATI_texture_env_combine3 = GL_TRUE;
- 
-+   extensions->MESA_framebuffer_flip_y = GL_TRUE;
-    extensions->MESA_pack_invert = GL_TRUE;
- 
-    extensions->NV_fog_distance = GL_TRUE;
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/0005-GL_MESA_framebuffer_flip_y-st-mesa-Fix-inverted-polygon-stipple-condition.patch b/media-libs/mesa-llvmpipe/files/0005-GL_MESA_framebuffer_flip_y-st-mesa-Fix-inverted-polygon-stipple-condition.patch
deleted file mode 100644
index abd44c0..0000000
--- a/media-libs/mesa-llvmpipe/files/0005-GL_MESA_framebuffer_flip_y-st-mesa-Fix-inverted-polygon-stipple-condition.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 90d312591ca6ede95d7d79a4721ebcf7195a0004 Mon Sep 17 00:00:00 2001
-From: Kenneth Graunke <kenneth@whitecape.org>
-Date: Tue, 8 Oct 2019 15:20:19 -0700
-Subject: [PATCH 5/5] st/mesa: Fix inverted polygon stipple condition
-
-Fixes Piglit's gl-2.1-polygon-stipple-fs on iris.
-
-Fixes: 63f24c3c016 ("gallium: Enable MESA_framebuffer_flip_y")
-Reviewed-by: Fritz Koenig <frkoenig@google.com>
-Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
----
- src/mesa/state_tracker/st_atom_stipple.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/mesa/state_tracker/st_atom_stipple.c b/src/mesa/state_tracker/st_atom_stipple.c
-index 3437553c154..86a4247f326 100644
---- a/src/mesa/state_tracker/st_atom_stipple.c
-+++ b/src/mesa/state_tracker/st_atom_stipple.c
-@@ -74,7 +74,7 @@ st_update_polygon_stipple( struct st_context *st )
- 
-       memcpy(st->state.poly_stipple, ctx->PolygonStipple, sz);
- 
--      if (ctx->DrawBuffer->FlipY) {
-+      if (!ctx->DrawBuffer->FlipY) {
-          memcpy(newStipple.stipple, ctx->PolygonStipple, sizeof(newStipple.stipple));
-       } else {
-          invert_stipple(newStipple.stipple, ctx->PolygonStipple,
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/media-libs/mesa-llvmpipe/files/UPSTREAM-egl-Allow-software-rendering-for-vgem-virtio_gpu-in-.patch b/media-libs/mesa-llvmpipe/files/UPSTREAM-egl-Allow-software-rendering-for-vgem-virtio_gpu-in-.patch
new file mode 100644
index 0000000..764163a
--- /dev/null
+++ b/media-libs/mesa-llvmpipe/files/UPSTREAM-egl-Allow-software-rendering-for-vgem-virtio_gpu-in-.patch
@@ -0,0 +1,60 @@
+From 81c0e2ab63d7ee823d9a096019243797f071410b Mon Sep 17 00:00:00 2001
+From: Lepton Wu <lepton@chromium.org>
+Date: Thu, 9 Jul 2020 11:49:33 -0700
+Subject: [PATCH] egl: Allow software rendering for vgem/virtio_gpu in
+ platform_device
+
+Then user could explicitly choose the underlying device for software
+rendering when both vgem/virtio_vga are there.
+
+Signed-off-by: Lepton Wu <lepton@chromium.org>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5830>
+---
+ src/egl/drivers/dri2/platform_device.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/src/egl/drivers/dri2/platform_device.c b/src/egl/drivers/dri2/platform_device.c
+index 3aac62f2679..7c12b4792c2 100644
+--- a/src/egl/drivers/dri2/platform_device.c
++++ b/src/egl/drivers/dri2/platform_device.c
+@@ -41,6 +41,7 @@
+ 
+ #include "egl_dri2.h"
+ #include "loader.h"
++#include "util/debug.h"
+ 
+ static __DRIimage*
+ device_alloc_image(struct dri2_egl_display *dri2_dpy,
+@@ -252,8 +253,9 @@ static bool
+ device_probe_device(_EGLDisplay *disp)
+ {
+    struct dri2_egl_display *dri2_dpy = disp->DriverData;
++   bool request_software = env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);
+ 
+-   if (disp->Options.ForceSoftware)
++   if (request_software)
+       _eglLog(_EGL_WARNING, "Not allowed to force software rendering when "
+                             "API explicitly selects a hardware device.");
+    dri2_dpy->fd = device_get_fd(disp, disp->Device);
+@@ -264,6 +266,18 @@ device_probe_device(_EGLDisplay *disp)
+    if (!dri2_dpy->driver_name)
+       goto err_name;
+ 
++   /* When doing software rendering, some times user still want to explicitly
++    * choose the render node device since cross node import doesn't work between
++    * vgem/virtio_gpu yet. It would be nice to have a new EXTENSION for this.
++    * For now, just fallback to kms_swrast. */
++   if (disp->Options.ForceSoftware && !request_software &&
++       (strcmp(dri2_dpy->driver_name, "vgem") == 0 ||
++        strcmp(dri2_dpy->driver_name, "virtio_gpu") == 0)) {
++      free(dri2_dpy->driver_name);
++      _eglLog(_EGL_WARNING, "NEEDS EXTENSION: falling back to kms_swrast");
++      dri2_dpy->driver_name = strdup("kms_swrast");
++   }
++
+    if (!dri2_load_driver_dri3(disp))
+       goto err_load;
+ 
+-- 
+2.28.0.402.g5ffc5be6b7-goog
+
diff --git a/media-libs/mesa-llvmpipe/files/UPSTREAM-mesa-Expose-EXT_texture_query_lod-and-add-support-fo.patch b/media-libs/mesa-llvmpipe/files/UPSTREAM-mesa-Expose-EXT_texture_query_lod-and-add-support-fo.patch
deleted file mode 100644
index d66d96a..0000000
--- a/media-libs/mesa-llvmpipe/files/UPSTREAM-mesa-Expose-EXT_texture_query_lod-and-add-support-fo.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From 3214f20914134df07b070f471c0ca2d610ed3b81 Mon Sep 17 00:00:00 2001
-From: Gert Wollny <gert.wollny@collabora.com>
-Date: Mon, 25 Feb 2019 19:12:07 +0100
-Subject: [PATCH] mesa: Expose EXT_texture_query_lod and add support for its
- use shaders
-
-EXT_texture_query_lod provides the same functionality for GLES like
-the ARB extension with the same name for GL.
-
-v2: Set ES 3.0 as minimum GLES version as required by the extension
-
-Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
-Reviewed-by: Eric Anholt <eric@anholt.net>
----
- src/compiler/glsl/builtin_functions.cpp  | 3 ++-
- src/compiler/glsl/glsl_parser_extras.cpp | 1 +
- src/compiler/glsl/glsl_parser_extras.h   | 2 ++
- src/mesa/main/extensions_table.h         | 1 +
- 4 files changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
-index 0f747b947571..aba1a14bd902 100644
---- a/src/compiler/glsl/builtin_functions.cpp
-+++ b/src/compiler/glsl/builtin_functions.cpp
-@@ -405,7 +405,8 @@ static bool
- texture_query_lod(const _mesa_glsl_parse_state *state)
- {
-    return state->stage == MESA_SHADER_FRAGMENT &&
--          state->ARB_texture_query_lod_enable;
-+          (state->ARB_texture_query_lod_enable ||
-+           state->EXT_texture_query_lod_enable);
- }
- 
- static bool
-diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
-index bde93dd3f37e..fd3e9e55af1b 100644
---- a/src/compiler/glsl/glsl_parser_extras.cpp
-+++ b/src/compiler/glsl/glsl_parser_extras.cpp
-@@ -730,6 +730,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
-    EXT(EXT_texture_array),
-    EXT_AEP(EXT_texture_buffer),
-    EXT_AEP(EXT_texture_cube_map_array),
-+   EXT(EXT_texture_query_lod),
-    EXT(INTEL_conservative_rasterization),
-    EXT(INTEL_shader_atomic_float_minmax),
-    EXT(MESA_shader_integer_functions),
-diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
-index b17b5125e0b9..f404efd96109 100644
---- a/src/compiler/glsl/glsl_parser_extras.h
-+++ b/src/compiler/glsl/glsl_parser_extras.h
-@@ -834,6 +834,8 @@ struct _mesa_glsl_parse_state {
-    bool EXT_texture_buffer_warn;
-    bool EXT_texture_cube_map_array_enable;
-    bool EXT_texture_cube_map_array_warn;
-+   bool EXT_texture_query_lod_enable;
-+   bool EXT_texture_query_lod_warn;
-    bool INTEL_conservative_rasterization_enable;
-    bool INTEL_conservative_rasterization_warn;
-    bool INTEL_shader_atomic_float_minmax_enable;
-diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
-index 05ed418d7500..a9773f701b61 100644
---- a/src/mesa/main/extensions_table.h
-+++ b/src/mesa/main/extensions_table.h
-@@ -301,6 +301,7 @@ EXT(EXT_texture_lod_bias                    , dummy_true
- EXT(EXT_texture_mirror_clamp                , EXT_texture_mirror_clamp               , GLL, GLC,  x ,  x , 2004)
- EXT(EXT_texture_norm16                      , dummy_true                             ,  x ,  x ,  x ,  31, 2014)
- EXT(EXT_texture_object                      , dummy_true                             , GLL,  x ,  x ,  x , 1995)
-+EXT(EXT_texture_query_lod                   , ARB_texture_query_lod                  ,  x ,  x ,  x ,  30, 2019)
- EXT(EXT_texture_rectangle                   , NV_texture_rectangle                   , GLL,  x ,  x ,  x , 2004)
- EXT(EXT_texture_rg                          , ARB_texture_rg                         ,  x ,  x ,  x , ES2, 2011)
- EXT(EXT_texture_sRGB                        , EXT_texture_sRGB                       , GLL, GLC,  x ,  x , 2004)
--- 
-2.20.1
-
diff --git a/media-libs/mesa-llvmpipe/files/UPSTREAM-st-mesa-set-compressed_data-to-NULL-when-freed.patch b/media-libs/mesa-llvmpipe/files/UPSTREAM-st-mesa-set-compressed_data-to-NULL-when-freed.patch
new file mode 100644
index 0000000..74e39524
--- /dev/null
+++ b/media-libs/mesa-llvmpipe/files/UPSTREAM-st-mesa-set-compressed_data-to-NULL-when-freed.patch
@@ -0,0 +1,29 @@
+From 51bdaf0b601522dfc599bd352806e66ef56876a3 Mon Sep 17 00:00:00 2001
+From: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
+Date: Thu, 9 Jul 2020 16:59:39 +0200
+Subject: [PATCH] st/mesa: set compressed_data to NULL when freed
+
+Reported-by: Karol Herbst <kherbst@redhat.com>
+Fixes: b6db703e0f0 ("st/mesa: make texture views inherit compressed_data storage")
+Reviewed-by: Karol Herbst <kherbst@redhat.com>
+Tested-by: Dave Airlie <airlied@redhat.com>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5821>
+---
+ src/mesa/state_tracker/st_cb_texture.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
+index 72274579187..b0ea844c071 100644
+--- a/src/mesa/state_tracker/st_cb_texture.c
++++ b/src/mesa/state_tracker/st_cb_texture.c
+@@ -235,6 +235,7 @@ st_FreeTextureImageBuffer(struct gl_context *ctx,
+        pipe_reference(&stImage->compressed_data->reference, NULL)) {
+       free(stImage->compressed_data->ptr);
+       free(stImage->compressed_data);
++      stImage->compressed_data = NULL;
+    }
+ 
+    /* if the texture image is being deallocated, the structure of the
+-- 
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0-r3.ebuild b/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0-r3.ebuild
deleted file mode 120000
index 34c2826..0000000
--- a/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0-r3.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-mesa-llvmpipe-19.0.ebuild
\ No newline at end of file
diff --git a/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0.ebuild b/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0.ebuild
deleted file mode 100644
index 7140c67..0000000
--- a/media-libs/mesa-llvmpipe/mesa-llvmpipe-19.0.ebuild
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright 1999-2019 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
-
-EAPI=6
-
-MESON_AUTO_DEPEND=no
-
-CROS_WORKON_COMMIT="b43b55d4619489e603780adf3c92a36dadcc362b"
-CROS_WORKON_TREE="b09304eab38348e2a157c4adc75542a460746ce9"
-
-EGIT_REPO_URI="git://anongit.freedesktop.org/mesa/mesa"
-CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
-CROS_WORKON_BLACKLIST="1"
-CROS_WORKON_LOCALNAME="mesa"
-
-if [[ ${PV} = 9999* ]]; then
-	GIT_ECLASS="git-2"
-	EXPERIMENTAL="true"
-fi
-
-inherit base multilib flag-o-matic meson toolchain-funcs ${GIT_ECLASS} cros-workon
-
-FOLDER="${PV/_rc*/}"
-[[ ${PV/_rc*/} == ${PV} ]] || FOLDER+="/RC"
-
-DESCRIPTION="OpenGL-like graphic library for Linux"
-HOMEPAGE="http://mesa3d.sourceforge.net/"
-
-#SRC_PATCHES="mirror://gentoo/${P}-gentoo-patches-01.tar.bz2"
-if [[ $PV = 9999* ]] || [[ -n ${CROS_WORKON_COMMIT} ]]; then
-	SRC_URI="${SRC_PATCHES}"
-else
-	SRC_URI="ftp://ftp.freedesktop.org/pub/mesa/${FOLDER}/${P}.tar.bz2
-		${SRC_PATCHES}"
-fi
-
-# Most of the code is MIT/X11.
-# ralloc is LGPL-3
-# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
-LICENSE="MIT LGPL-3 SGI-B-2.0"
-SLOT="0"
-KEYWORDS="*"
-
-INTEL_CARDS="intel"
-RADEON_CARDS="amdgpu radeon"
-VIDEO_CARDS="${INTEL_CARDS} ${RADEON_CARDS} freedreno llvmpipe mach64 mga nouveau r128 radeonsi savage sis softpipe tdfx via virgl vmware"
-for card in ${VIDEO_CARDS}; do
-	IUSE_VIDEO_CARDS+=" video_cards_${card}"
-done
-
-IUSE="${IUSE_VIDEO_CARDS}
-	+classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD
-	kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X"
-
-LIBDRM_DEPSTRING=">=x11-libs/libdrm-2.4.60"
-
-REQUIRED_USE="video_cards_amdgpu? ( llvm )
-	video_cards_llvmpipe? ( llvm )"
-
-# keep correct libdrm and dri2proto dep
-# keep blocks in rdepend for binpkg
-RDEPEND="
-	X? (
-		!<x11-base/xorg-server-1.7
-		>=x11-libs/libX11-1.3.99.901
-		x11-libs/libXdamage
-		x11-libs/libXext
-		x11-libs/libXrandr
-		x11-libs/libXxf86vm
-	)
-	!media-libs/mesa
-	llvm? ( virtual/libelf )
-	dev-libs/expat
-	dev-libs/libgcrypt
-	virtual/udev
-	${LIBDRM_DEPSTRING}
-"
-
-DEPEND="${RDEPEND}
-	dev-libs/libxml2
-	sys-devel/bison
-	sys-devel/flex
-	virtual/pkgconfig
-	x11-base/xorg-proto
-	wayland? ( >=dev-libs/wayland-protocols-1.8 )
-	llvm? ( sys-devel/llvm )
-"
-
-driver_list() {
-	local drivers="$(sort -u <<< "${1// /$'\n'}")"
-	echo "${drivers//$'\n'/,}"
-}
-
-src_prepare() {
-	# apply patches
-	if [[ ${PV} != 9999* && -n ${SRC_PATCHES} ]]; then
-		EPATCH_FORCE="yes" \
-		EPATCH_SOURCE="${WORKDIR}/patches" \
-		EPATCH_SUFFIX="patch" \
-		epatch
-	fi
-	# FreeBSD 6.* doesn't have posix_memalign().
-	if [[ ${CHOST} == *-freebsd6.* ]]; then
-		sed -i \
-			-e "s/-DHAVE_POSIX_MEMALIGN//" \
-			configure.ac || die
-	fi
-
-	epatch "${FILESDIR}"/UPSTREAM-mesa-Expose-EXT_texture_query_lod-and-add-support-fo.patch
-	epatch "${FILESDIR}"/0001-GL_MESA_framebuffer_flip_y-include-GLES2-Sync-GLES2-headers-with-Khronos.patch
-	epatch "${FILESDIR}"/0002-GL_MESA_framebuffer_flip_y-mesa-GetFramebufferParameteriv-spelling.patch
-	epatch "${FILESDIR}"/0003-GL_MESA_framebuffer_flip_y-mesa-Allow-MESA_framebuffer_flip_y-for-GLES-3.patch
-	epatch "${FILESDIR}"/0004-GL_MESA_framebuffer_flip_y-gallium-Enable-MESA_framebuffer_flip_y.patch
-	epatch "${FILESDIR}"/0005-GL_MESA_framebuffer_flip_y-st-mesa-Fix-inverted-polygon-stipple-condition.patch
-	epatch "${FILESDIR}"/0001-BACKPORT-EGL-image-storage.patch
-	epatch "${FILESDIR}"/0001-meson-Force-the-use-of-config-tool-for-llvm.patch
-
-	default
-}
-
-src_configure() {
-	tc-getPROG PKG_CONFIG pkg-config
-
-	cros_optimize_package_for_speed
-	# For llvmpipe on ARM we'll get errors about being unable to resolve
-	# "__aeabi_unwind_cpp_pr1" if we don't include this flag; seems wise
-	# to include it for all platforms though.
-	use video_cards_llvmpipe && append-flags "-rtlib=libgcc -shared-libgcc"
-
-	if use !gallium && use !classic && use !vulkan; then
-		ewarn "You enabled neither classic, gallium, nor vulkan "
-		ewarn "USE flags. No hardware drivers will be built."
-	fi
-
-	if use classic; then
-	# Configurable DRI drivers
-		# Intel code
-		dri_driver_enable video_cards_intel i965
-	fi
-
-	if use gallium; then
-	# Configurable gallium drivers
-		gallium_enable video_cards_llvmpipe swrast
-		gallium_enable video_cards_softpipe swrast
-
-		# Nouveau code
-		gallium_enable video_cards_nouveau nouveau
-
-		# ATI code
-		gallium_enable video_cards_radeon r300 r600
-		gallium_enable video_cards_amdgpu radeonsi
-
-		# Freedreno code
-		gallium_enable video_cards_freedreno freedreno
-
-		gallium_enable video_cards_virgl virgl
-	fi
-
-	if use vulkan; then
-		vulkan_enable video_cards_intel intel
-		vulkan_enable video_cards_amdgpu amd
-	fi
-
-	LLVM_ENABLE=false
-	if use llvm && use !video_cards_softpipe; then
-		emesonargs+=( -Dshared-llvm=false )
-		export LLVM_CONFIG=${SYSROOT}/usr/lib/llvm/bin/llvm-config-host
-		LLVM_ENABLE=true
-	fi
-
-	local egl_platforms=""
-	if use egl; then
-		egl_platforms="surfaceless"
-
-		if use drm; then
-			egl_platforms="${egl_platforms},drm"
-		fi
-
-		if use wayland; then
-			egl_platforms="${egl_platforms},wayland"
-		fi
-
-		if use X; then
-			egl_platforms="${egl_platforms},x11"
-		fi
-	fi
-
-	if use X; then
-		glx="dri"
-	else
-		glx="disabled"
-	fi
-
-	append-flags "-UENABLE_SHADER_CACHE"
-
-	if use kvm_guest; then
-		emesonargs+=( -Ddri-search-path=/opt/google/cros-containers/lib )
-	fi
-
-	emesonargs+=(
-		-Dglx="${glx}"
-		-Dllvm="${LLVM_ENABLE}"
-		-Dplatforms="${egl_platforms}"
-		$(meson_use egl)
-		$(meson_use gbm)
-		$(meson_use X gl)
-		$(meson_use gles1)
-		$(meson_use gles2)
-		$(meson_use selinux)
-		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
-		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
-		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
-		--buildtype $(usex debug debug release)
-	)
-
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	# Remove redundant GLES headers
-	rm -f "${D}"/usr/include/{EGL,GLES2,GLES3,KHR}/*.h || die "Removing GLES headers failed."
-
-	dodir /usr/$(get_libdir)/dri
-	insinto "/usr/$(get_libdir)/dri/"
-	insopts -m0755
-	# install the gallium drivers we use
-	local gallium_drivers_files=( nouveau_dri.so r300_dri.so r600_dri.so msm_dri.so swrast_dri.so )
-	for x in ${gallium_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/gallium/${x}" ]; then
-			doins "${S}/$(get_libdir)/gallium/${x}"
-		fi
-	done
-
-	# install classic drivers we use
-	local classic_drivers_files=( i810_dri.so i965_dri.so nouveau_vieux_dri.so radeon_dri.so r200_dri.so )
-	for x in ${classic_drivers_files[@]}; do
-		if [ -f "${S}/$(get_libdir)/${x}" ]; then
-			doins "${S}/$(get_libdir)/${x}"
-		fi
-	done
-}
-
-# $1 - VIDEO_CARDS flag (check skipped for "--")
-# other args - names of DRI drivers to enable
-dri_driver_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		DRI_DRIVERS+=("$@")
-	fi
-}
-
-gallium_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		GALLIUM_DRIVERS+=("$@")
-	fi
-}
-
-vulkan_enable() {
-	if [[ $1 == -- ]] || use $1; then
-		shift
-		VULKAN_DRIVERS+=("$@")
-	fi
-}
diff --git a/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.3-r2.ebuild b/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.3-r2.ebuild
new file mode 120000
index 0000000..d07af1a
--- /dev/null
+++ b/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.3-r2.ebuild
@@ -0,0 +1 @@
+mesa-llvmpipe-20.1.ebuild
\ No newline at end of file
diff --git a/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.ebuild b/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.ebuild
new file mode 100644
index 0000000..65eeba0
--- /dev/null
+++ b/media-libs/mesa-llvmpipe/mesa-llvmpipe-20.1.ebuild
@@ -0,0 +1,271 @@
+# Copyright 1999-2019 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.9.ebuild,v 1.3 2010/12/05 17:19:14 arfrever Exp $
+
+EAPI=6
+
+MESON_AUTO_DEPEND=no
+
+CROS_WORKON_COMMIT="663fa46287dc7c3c03b784ac2162ee5081083e3a"
+CROS_WORKON_TREE="b8d78e509c717d068a0199e10811bffd817f2dd4"
+
+EGIT_REPO_URI="git://anongit.freedesktop.org/mesa/mesa"
+CROS_WORKON_PROJECT="chromiumos/third_party/mesa"
+CROS_WORKON_BLACKLIST="1"
+CROS_WORKON_LOCALNAME="mesa"
+
+if [[ ${PV} = 9999* ]]; then
+	GIT_ECLASS="git-2"
+	EXPERIMENTAL="true"
+fi
+
+inherit base multilib flag-o-matic meson toolchain-funcs ${GIT_ECLASS} cros-workon
+
+FOLDER="${PV/_rc*/}"
+[[ ${PV/_rc*/} == ${PV} ]] || FOLDER+="/RC"
+
+DESCRIPTION="OpenGL-like graphic library for Linux"
+HOMEPAGE="http://mesa3d.sourceforge.net/"
+
+#SRC_PATCHES="mirror://gentoo/${P}-gentoo-patches-01.tar.bz2"
+if [[ $PV = 9999* ]] || [[ -n ${CROS_WORKON_COMMIT} ]]; then
+	SRC_URI="${SRC_PATCHES}"
+else
+	SRC_URI="ftp://ftp.freedesktop.org/pub/mesa/${FOLDER}/${P}.tar.bz2
+		${SRC_PATCHES}"
+fi
+
+# Most of the code is MIT/X11.
+# ralloc is LGPL-3
+# GLES[2]/gl[2]{,ext,platform}.h are SGI-B-2.0
+LICENSE="MIT LGPL-3 SGI-B-2.0"
+SLOT="0"
+KEYWORDS="*"
+
+INTEL_CARDS="intel"
+RADEON_CARDS="amdgpu radeon"
+VIDEO_CARDS="${INTEL_CARDS} ${RADEON_CARDS} freedreno llvmpipe mach64 mga nouveau r128 radeonsi savage sis softpipe tdfx via virgl vmware"
+for card in ${VIDEO_CARDS}; do
+	IUSE_VIDEO_CARDS+=" video_cards_${card}"
+done
+
+IUSE="${IUSE_VIDEO_CARDS}
+	+classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD
+	kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X"
+
+LIBDRM_DEPSTRING=">=x11-libs/libdrm-2.4.60"
+
+REQUIRED_USE="video_cards_amdgpu? ( llvm )
+	video_cards_llvmpipe? ( llvm )"
+
+# keep correct libdrm and dri2proto dep
+# keep blocks in rdepend for binpkg
+RDEPEND="
+	X? (
+		!<x11-base/xorg-server-1.7
+		>=x11-libs/libX11-1.3.99.901
+		x11-libs/libXdamage
+		x11-libs/libXext
+		x11-libs/libXrandr
+		x11-libs/libXxf86vm
+	)
+	wayland? (
+		dev-libs/wayland
+		>=dev-libs/wayland-protocols-1.8
+	)
+	!media-libs/mesa
+	llvm? ( virtual/libelf )
+	dev-libs/expat
+	dev-libs/libgcrypt
+	virtual/udev
+	${LIBDRM_DEPSTRING}
+"
+
+DEPEND="${RDEPEND}
+	dev-libs/libxml2
+	sys-devel/bison
+	sys-devel/flex
+	virtual/pkgconfig
+	x11-base/xorg-proto
+	llvm? ( sys-devel/llvm )
+"
+
+driver_list() {
+	local drivers="$(sort -u <<< "${1// /$'\n'}")"
+	echo "${drivers//$'\n'/,}"
+}
+
+src_prepare() {
+	# apply patches
+	if [[ ${PV} != 9999* && -n ${SRC_PATCHES} ]]; then
+		EPATCH_FORCE="yes" \
+		EPATCH_SOURCE="${WORKDIR}/patches" \
+		EPATCH_SUFFIX="patch" \
+		epatch
+	fi
+	# FreeBSD 6.* doesn't have posix_memalign().
+	if [[ ${CHOST} == *-freebsd6.* ]]; then
+		sed -i \
+			-e "s/-DHAVE_POSIX_MEMALIGN//" \
+			configure.ac || die
+	fi
+
+	# Current meson 'auto' method does not work properly with cross
+	# compiling, so revert back to hard-coded 'config-tool' method.
+	# This should be fixed in a future meson release.  See:
+	# https://github.com/mesonbuild/meson/issues/7276
+	epatch "${FILESDIR}"/0001-Revert-meson-update-llvm-dependency-logic-for-meson-.patch
+
+	epatch "${FILESDIR}"/UPSTREAM-egl-Allow-software-rendering-for-vgem-virtio_gpu-in-.patch
+
+	epatch "${FILESDIR}"/UPSTREAM-st-mesa-set-compressed_data-to-NULL-when-freed.patch
+
+	default
+}
+
+src_configure() {
+	tc-getPROG PKG_CONFIG pkg-config
+
+	cros_optimize_package_for_speed
+	# For llvmpipe on ARM we'll get errors about being unable to resolve
+	# "__aeabi_unwind_cpp_pr1" if we don't include this flag; seems wise
+	# to include it for all platforms though.
+	use video_cards_llvmpipe && append-flags "-rtlib=libgcc -shared-libgcc"
+
+	if use !gallium && use !classic && use !vulkan; then
+		ewarn "You enabled neither classic, gallium, nor vulkan "
+		ewarn "USE flags. No hardware drivers will be built."
+	fi
+
+	if use classic; then
+	# Configurable DRI drivers
+		# Intel code
+		dri_driver_enable video_cards_intel i965
+	fi
+
+	if use gallium; then
+	# Configurable gallium drivers
+		gallium_enable video_cards_llvmpipe swrast
+		gallium_enable video_cards_softpipe swrast
+
+		# Nouveau code
+		gallium_enable video_cards_nouveau nouveau
+
+		# ATI code
+		gallium_enable video_cards_radeon r300 r600
+		gallium_enable video_cards_amdgpu radeonsi
+
+		# Freedreno code
+		gallium_enable video_cards_freedreno freedreno
+
+		gallium_enable video_cards_virgl virgl
+	fi
+
+	if use vulkan; then
+		vulkan_enable video_cards_intel intel
+		vulkan_enable video_cards_amdgpu amd
+	fi
+
+	LLVM_ENABLE=false
+	if use llvm && use !video_cards_softpipe; then
+		emesonargs+=( -Dshared-llvm=false )
+		export LLVM_CONFIG=${SYSROOT}/usr/lib/llvm/bin/llvm-config-host
+		LLVM_ENABLE=true
+	fi
+
+	local egl_platforms=""
+	if use egl; then
+		egl_platforms="surfaceless"
+
+		if use drm; then
+			egl_platforms="${egl_platforms},drm"
+		fi
+
+		if use wayland; then
+			egl_platforms="${egl_platforms},wayland"
+		fi
+
+		if use X; then
+			egl_platforms="${egl_platforms},x11"
+		fi
+	fi
+
+	if use X; then
+		glx="dri"
+	else
+		glx="disabled"
+	fi
+
+	append-flags "-UENABLE_SHADER_CACHE"
+
+	if use kvm_guest; then
+		emesonargs+=( -Ddri-search-path=/opt/google/cros-containers/lib )
+	fi
+
+	emesonargs+=(
+		-Dglx="${glx}"
+		-Dllvm="${LLVM_ENABLE}"
+		-Dplatforms="${egl_platforms}"
+		$(meson_use egl)
+		$(meson_use gbm)
+		$(meson_use X gl)
+		$(meson_use gles1)
+		$(meson_use gles2)
+		$(meson_use selinux)
+		-Ddri-drivers=$(driver_list "${DRI_DRIVERS[*]}")
+		-Dgallium-drivers=$(driver_list "${GALLIUM_DRIVERS[*]}")
+		-Dvulkan-drivers=$(driver_list "${VULKAN_DRIVERS[*]}")
+		--buildtype $(usex debug debug release)
+	)
+
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	# Remove redundant GLES headers
+	rm -f "${D}"/usr/include/{EGL,GLES2,GLES3,KHR}/*.h || die "Removing GLES headers failed."
+
+	dodir /usr/$(get_libdir)/dri
+	insinto "/usr/$(get_libdir)/dri/"
+	insopts -m0755
+	# install the gallium drivers we use
+	local gallium_drivers_files=( nouveau_dri.so r300_dri.so r600_dri.so msm_dri.so swrast_dri.so )
+	for x in ${gallium_drivers_files[@]}; do
+		if [ -f "${S}/$(get_libdir)/gallium/${x}" ]; then
+			doins "${S}/$(get_libdir)/gallium/${x}"
+		fi
+	done
+
+	# install classic drivers we use
+	local classic_drivers_files=( i810_dri.so i965_dri.so nouveau_vieux_dri.so radeon_dri.so r200_dri.so )
+	for x in ${classic_drivers_files[@]}; do
+		if [ -f "${S}/$(get_libdir)/${x}" ]; then
+			doins "${S}/$(get_libdir)/${x}"
+		fi
+	done
+}
+
+# $1 - VIDEO_CARDS flag (check skipped for "--")
+# other args - names of DRI drivers to enable
+dri_driver_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		DRI_DRIVERS+=("$@")
+	fi
+}
+
+gallium_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		GALLIUM_DRIVERS+=("$@")
+	fi
+}
+
+vulkan_enable() {
+	if [[ $1 == -- ]] || use $1; then
+		shift
+		VULKAN_DRIVERS+=("$@")
+	fi
+}
diff --git a/media-libs/mesa-llvmpipe/mesa-llvmpipe-9999.ebuild b/media-libs/mesa-llvmpipe/mesa-llvmpipe-9999.ebuild
index 59ffb5b..35a1c79 100644
--- a/media-libs/mesa-llvmpipe/mesa-llvmpipe-9999.ebuild
+++ b/media-libs/mesa-llvmpipe/mesa-llvmpipe-9999.ebuild
@@ -66,6 +66,10 @@
 		x11-libs/libXrandr
 		x11-libs/libXxf86vm
 	)
+	wayland? (
+		dev-libs/wayland
+		>=dev-libs/wayland-protocols-1.8
+	)
 	llvm? ( virtual/libelf )
 	!media-libs/mesa
 	dev-libs/expat
@@ -80,7 +84,6 @@
 	sys-devel/flex
 	virtual/pkgconfig
 	x11-base/xorg-proto
-	wayland? ( >=dev-libs/wayland-protocols-1.8 )
 	llvm? ( sys-devel/llvm )
 "
 
diff --git a/media-libs/mesa/mesa-20.1.0-r0.ebuild b/media-libs/mesa/mesa-20.1.4-r0.ebuild
similarity index 100%
rename from media-libs/mesa/mesa-20.1.0-r0.ebuild
rename to media-libs/mesa/mesa-20.1.4-r0.ebuild
diff --git a/media-libs/mesa/mesa-20.1.ebuild b/media-libs/mesa/mesa-20.1.ebuild
index b1a32bf..a1539e1 100644
--- a/media-libs/mesa/mesa-20.1.ebuild
+++ b/media-libs/mesa/mesa-20.1.ebuild
@@ -6,7 +6,7 @@
 
 MESON_AUTO_DEPEND=no
 
-CROS_WORKON_COMMIT="7de17e2520f1f264b721b72e5a77cca19d69409e"
+CROS_WORKON_COMMIT="d6154f155b4f12e974267db04849cb656ed21664"
 CROS_WORKON_TREE="b8d78e509c717d068a0199e10811bffd817f2dd4"
 
 EGIT_REPO_URI="git://anongit.freedesktop.org/mesa/mesa"
diff --git a/media-libs/minigbm/minigbm-0.0.1-r380.ebuild b/media-libs/minigbm/minigbm-0.0.1-r380.ebuild
deleted file mode 100644
index b25ec2b..0000000
--- a/media-libs/minigbm/minigbm-0.0.1-r380.ebuild
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="1de7f6655d09095d28ba05abab8c6f6279671c65"
-CROS_WORKON_TREE="ace310f1a73abd463d2bffeb930f6a8ae3036fc0"
-CROS_WORKON_PROJECT="chromiumos/platform/minigbm"
-CROS_WORKON_LOCALNAME="../platform/minigbm"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-sanitizers cros-workon cros-common.mk multilib
-
-DESCRIPTION="Mini GBM implementation"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/minigbm"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-VIDEO_CARDS="
-	amdgpu exynos intel marvell mediatek msm
-	radeon radeonsi rockchip tegra vc4 virgl
-"
-IUSE="-asan kernel-3_8 kernel-3_14 kernel-3_18"
-for card in ${VIDEO_CARDS}; do
-	IUSE+=" video_cards_${card}"
-done
-
-RDEPEND="
-	x11-libs/libdrm
-	!media-libs/mesa[gbm]"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig
-	video_cards_amdgpu? (
-		virtual/opengles
-		x11-drivers/opengles-headers
-	)"
-
-src_prepare() {
-	default
-	sanitizers-setup-env
-	cros-common.mk_src_prepare
-}
-
-src_configure() {
-	export LIBDIR="/usr/$(get_libdir)"
-	append-cppflags -DDRI_DRIVER_DIR="/usr/$(get_libdir)/dri"
-	use video_cards_amdgpu && append-cppflags -DDRV_AMDGPU && export DRV_AMDGPU=1
-	use video_cards_exynos && append-cppflags -DDRV_EXYNOS && export DRV_EXYNOS=1
-	use video_cards_intel && append-cppflags -DDRV_I915 && export DRV_I915=1
-	if use video_cards_intel ; then
-		if ! (use kernel-3_8 || use kernel-3_14 || use kernel-3_18); then
-			append-cppflags -DI915_SCANOUT_Y_TILED
-		fi
-	fi
-	use video_cards_marvell && append-cppflags -DDRV_MARVELL && export DRV_MARVELL=1
-	if [[ ${MTK_MINIGBM_PLATFORM} == "MT8183" ]] ; then
-		append-cppflags -DMTK_MT8183 && export MTK_MT8183=1
-	fi
-	use video_cards_mediatek && append-cppflags -DDRV_MEDIATEK && export DRV_MEDIATEK=1
-	use video_cards_msm && append-cppflags -DDRV_MSM && export DRV_MSM=1
-	use video_cards_radeon && append-cppflags -DDRV_RADEON && export DRV_RADEON=1
-	use video_cards_radeonsi && append-cppflags -DDRV_RADEON && export DRV_RADEON=1
-	use video_cards_rockchip && append-cppflags -DDRV_ROCKCHIP && export DRV_ROCKCHIP=1
-	use video_cards_tegra && append-cppflags -DDRV_TEGRA && export DRV_TEGRA=1
-	use video_cards_vc4 && append-cppflags -DDRV_VC4 && export DRV_VC4=1
-	use video_cards_virgl && append-cppflags -DDRV_VIRGL && export DRV_VIRGL=1
-	cros-common.mk_src_configure
-}
-
-src_compile() {
-	cros-common.mk_src_compile
-}
-
-src_install() {
-	insinto "${EPREFIX}/etc/udev/rules.d"
-	doins "${FILESDIR}/50-vgem.rules"
-
-	default
-}
diff --git a/media-libs/minigbm/minigbm-0.0.1-r403.ebuild b/media-libs/minigbm/minigbm-0.0.1-r403.ebuild
new file mode 100644
index 0000000..17f77fd
--- /dev/null
+++ b/media-libs/minigbm/minigbm-0.0.1-r403.ebuild
@@ -0,0 +1,85 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="ec9bbc28aadee94185feed9c3452e896c17ed929"
+CROS_WORKON_TREE="fc83b8e971487f9d9e09f6c05bbf637346542ce8"
+CROS_WORKON_PROJECT="chromiumos/platform/minigbm"
+CROS_WORKON_LOCALNAME="../platform/minigbm"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-sanitizers cros-workon cros-common.mk multilib
+
+DESCRIPTION="Mini GBM implementation"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/minigbm"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+VIDEO_CARDS="
+	amdgpu exynos intel marvell mediatek msm
+	radeon radeonsi rockchip tegra vc4 virgl
+"
+IUSE="-asan kernel-3_8 kernel-3_14 kernel-3_18"
+for card in ${VIDEO_CARDS}; do
+	IUSE+=" video_cards_${card}"
+done
+
+RDEPEND="
+	x11-libs/libdrm
+	!media-libs/mesa[gbm]"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig
+	video_cards_amdgpu? (
+		virtual/opengles
+		x11-drivers/opengles-headers
+	)"
+
+src_prepare() {
+	default
+	sanitizers-setup-env
+	cros-common.mk_src_prepare
+}
+
+src_configure() {
+	export LIBDIR="/usr/$(get_libdir)"
+	append-cppflags -DDRI_DRIVER_DIR="/usr/$(get_libdir)/dri"
+	use video_cards_amdgpu && append-cppflags -DDRV_AMDGPU && export DRV_AMDGPU=1
+	use video_cards_exynos && append-cppflags -DDRV_EXYNOS && export DRV_EXYNOS=1
+	use video_cards_intel && append-cppflags -DDRV_I915 && export DRV_I915=1
+	if use video_cards_intel ; then
+		if ! (use kernel-3_8 || use kernel-3_14 || use kernel-3_18); then
+			append-cppflags -DI915_SCANOUT_Y_TILED
+		fi
+	fi
+	use video_cards_marvell && append-cppflags -DDRV_MARVELL && export DRV_MARVELL=1
+	if [[ ${MTK_MINIGBM_PLATFORM} == "MT8183" ]] ; then
+		append-cppflags -DMTK_MT8183 && export MTK_MT8183=1
+	fi
+	use video_cards_mediatek && append-cppflags -DDRV_MEDIATEK && export DRV_MEDIATEK=1
+	use video_cards_msm && append-cppflags -DDRV_MSM && export DRV_MSM=1
+	use video_cards_radeon && append-cppflags -DDRV_RADEON && export DRV_RADEON=1
+	use video_cards_radeonsi && append-cppflags -DDRV_RADEON && export DRV_RADEON=1
+	use video_cards_rockchip && append-cppflags -DDRV_ROCKCHIP && export DRV_ROCKCHIP=1
+	use video_cards_tegra && append-cppflags -DDRV_TEGRA && export DRV_TEGRA=1
+	use video_cards_vc4 && append-cppflags -DDRV_VC4 && export DRV_VC4=1
+	use video_cards_virgl && append-cppflags -DDRV_VIRGL && export DRV_VIRGL=1
+	cros-common.mk_src_configure
+}
+
+src_compile() {
+	cros-common.mk_src_compile
+}
+
+src_install() {
+	insinto "${EPREFIX}/etc/udev/rules.d"
+	doins "${FILESDIR}/50-vgem.rules"
+
+	# Install cros_gralloc header files for arc-mali-* packages
+	insinto "${EPREFIX}/usr/include/cros_gralloc"
+	doins "${S}/cros_gralloc/cros_gralloc_handle.h"
+
+	default
+}
diff --git a/media-libs/minigbm/minigbm-9999.ebuild b/media-libs/minigbm/minigbm-9999.ebuild
index 69cd3f1..6b053d3 100644
--- a/media-libs/minigbm/minigbm-9999.ebuild
+++ b/media-libs/minigbm/minigbm-9999.ebuild
@@ -75,5 +75,9 @@
 	insinto "${EPREFIX}/etc/udev/rules.d"
 	doins "${FILESDIR}/50-vgem.rules"
 
+	# Install cros_gralloc header files for arc-mali-* packages
+	insinto "${EPREFIX}/usr/include/cros_gralloc"
+	doins "${S}/cros_gralloc/cros_gralloc_handle.h"
+
 	default
 }
diff --git a/media-libs/virglrenderer/files/0001-virgl-gbm-Also-convert-VIRGL_BIND_SAMPLER_VIEW.patch b/media-libs/virglrenderer/files/0001-virgl-gbm-Also-convert-VIRGL_BIND_SAMPLER_VIEW.patch
deleted file mode 100644
index 73948b4..0000000
--- a/media-libs/virglrenderer/files/0001-virgl-gbm-Also-convert-VIRGL_BIND_SAMPLER_VIEW.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From dbb0f1a32583c160ab43905159698a5e129ae53d Mon Sep 17 00:00:00 2001
-From: Lepton Wu <lepton@chromium.org>
-Date: Wed, 26 Feb 2020 15:36:23 -0800
-Subject: [PATCH] virgl: gbm: Also convert VIRGL_BIND_SAMPLER_VIEW
-
-We convert GBM_BO_USE_TEXTURING to VIRGL_BIND_SAMPLER_VIEW at
-Android side, so just convert VIRGL_BIND_SAMPLER_VIEW back to
-GBM_BO_USE_TEXTURING, otherwise the allocation won't go
-through gbm.
-
-Signed-off-by: Lepton Wu <lepton@chromium.org>
----
- src/virgl_gbm.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/virgl_gbm.c b/src/virgl_gbm.c
-index 20597b6..2c46dd8 100644
---- a/src/virgl_gbm.c
-+++ b/src/virgl_gbm.c
-@@ -380,6 +380,8 @@ int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iove
- uint32_t virgl_gbm_convert_flags(uint32_t virgl_bind_flags)
- {
-    uint32_t flags = 0;
-+   if (virgl_bind_flags & VIRGL_BIND_SAMPLER_VIEW)
-+      flags |= GBM_BO_USE_TEXTURING;
-    if (virgl_bind_flags & VIRGL_BIND_RENDER_TARGET)
-       flags |= GBM_BO_USE_RENDERING;
-    if (virgl_bind_flags & VIRGL_BIND_SCANOUT)
--- 
-2.25.1.481.gfbce0eb801-goog
-
diff --git a/media-libs/virglrenderer/files/FROMLIST-shader-Use-integer-type-for-ARM-MALI-GPU.patch b/media-libs/virglrenderer/files/FROMLIST-shader-Use-integer-type-for-ARM-MALI-GPU.patch
deleted file mode 100644
index 0e24f1f..0000000
--- a/media-libs/virglrenderer/files/FROMLIST-shader-Use-integer-type-for-ARM-MALI-GPU.patch
+++ /dev/null
@@ -1,307 +0,0 @@
-From 995d55b34c2ccd56e03d9e246983775935ecc732 Mon Sep 17 00:00:00 2001
-From: Lepton Wu <lepton@chromium.org>
-Date: Tue, 19 May 2020 16:25:59 -0700
-Subject: [PATCH] shader: Use integer type for ARM (MALI GPU)
-
-Currently, even the input/output buffers are integer formats, we still
-use float type for them. This is actually undefined behavior and MALI
-GPU will do type conversion and cause unexpected results. To fix this,
-we check the input buffer format for vertex shader and also color buffer
-format for fragment shader, if they are integer types, just use integer
-types in generated shaders. Since the old way works fine on other GPU,
-only enable this fix for ARM MALI.
-
-Signed-off-by: Lepton Wu <lepton@chromium.org>
----
- src/vrend_renderer.c | 43 +++++++++++++++++++++++++--
- src/vrend_shader.c   | 71 ++++++++++++++++++++++++++++++++++++++++----
- src/vrend_shader.h   |  5 ++++
- 3 files changed, 111 insertions(+), 8 deletions(-)
-
-diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
-index 5bf2b3be..33042be4 100644
---- a/src/vrend_renderer.c
-+++ b/src/vrend_renderer.c
-@@ -283,6 +283,7 @@ struct global_renderer_state {
-    bool finishing;
-    bool use_gles;
-    bool use_core_profile;
-+   bool use_integer;
- 
-    bool features[feat_last];
- 
-@@ -482,6 +483,8 @@ struct vrend_vertex_element_array {
-    unsigned count;
-    struct vrend_vertex_element elements[PIPE_MAX_ATTRIBS];
-    GLuint id;
-+   uint32_t signed_int_bitmask;
-+   uint32_t unsigned_int_bitmask;
- };
- 
- struct vrend_constants {
-@@ -646,6 +649,7 @@ struct vrend_context {
-    bool in_error;
-    bool ctx_switch_pending;
-    bool pstip_inited;
-+   bool drawing;
- 
-    GLuint pstipple_tex_id;
- 
-@@ -2657,8 +2661,15 @@ int vrend_create_vertex_elements_state(struct vrend_context *ctx,
-       for (i = 0; i < num_elements; i++) {
-          struct vrend_vertex_element *ve = &v->elements[i];
- 
--         if (util_format_is_pure_integer(ve->base.src_format))
-+         if (util_format_is_pure_integer(ve->base.src_format)) {
-+            if (vrend_state.use_integer) {
-+               if (util_format_is_pure_uint(ve->base.src_format))
-+                  v->unsigned_int_bitmask |= (1 << i);
-+               else
-+                  v->signed_int_bitmask |= (1 << i);
-+            }
-             glVertexAttribIFormat(i, ve->nr_chan, ve->type, ve->base.src_offset);
-+         }
-          else
-             glVertexAttribFormat(i, ve->nr_chan, ve->type, ve->norm, ve->base.src_offset);
-          glVertexAttribBinding(i, ve->base.vertex_buffer_index);
-@@ -3129,13 +3140,25 @@ static inline void vrend_fill_shader_key(struct vrend_context *ctx,
-       int i;
-       bool add_alpha_test = true;
-       key->cbufs_are_a8_bitmask = 0;
-+      // Only use integer info when drawing to avoid stale info.
-+      if (vrend_state.use_integer && ctx->drawing) {
-+         key->attrib_signed_int_bitmask = ctx->sub->ve->signed_int_bitmask;
-+         key->attrib_unsigned_int_bitmask = ctx->sub->ve->unsigned_int_bitmask;
-+      }
-       for (i = 0; i < ctx->sub->nr_cbufs; i++) {
-          if (!ctx->sub->surf[i])
-             continue;
-          if (vrend_format_is_emulated_alpha(ctx->sub->surf[i]->format))
-             key->cbufs_are_a8_bitmask |= (1 << i);
--         if (util_format_is_pure_integer(ctx->sub->surf[i]->format))
-+         if (util_format_is_pure_integer(ctx->sub->surf[i]->format)) {
-             add_alpha_test = false;
-+            if (vrend_state.use_integer) {
-+               if (util_format_is_pure_uint(ctx->sub->surf[i]->format))
-+                  key->cbufs_unsigned_int_bitmask |= (1 << i);
-+               else
-+                  key->cbufs_signed_int_bitmask |= (1 << i);
-+            }
-+         }
-          key->surface_component_bits[i] = util_format_get_component_bits(ctx->sub->surf[i]->format, UTIL_FORMAT_COLORSPACE_RGB, 0);
-       }
-       if (add_alpha_test) {
-@@ -4372,7 +4395,9 @@ int vrend_draw_vbo(struct vrend_context *ctx,
-          return 0;
-       }
- 
-+      ctx->drawing = true;
-       vrend_shader_select(ctx, ctx->sub->shaders[PIPE_SHADER_VERTEX], &vs_dirty);
-+      ctx->drawing = false;
- 
-       if (ctx->sub->shaders[PIPE_SHADER_TESS_CTRL] && ctx->sub->shaders[PIPE_SHADER_TESS_CTRL]->tokens)
-          vrend_shader_select(ctx, ctx->sub->shaders[PIPE_SHADER_TESS_CTRL], &tcs_dirty);
-@@ -5850,6 +5875,16 @@ vrend_renderer_get_pipe_callbacks(void)
-    return &callbacks;
- }
- 
-+static bool use_integer() {
-+   if (getenv("VIRGL_USE_INTEGER"))
-+      return true;
-+
-+   const char * a = (const char *) glGetString(GL_VENDOR);
-+   if (strcmp(a, "ARM") == 0)
-+      return true;
-+   return false;
-+}
-+
- int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags)
- {
-    bool gles;
-@@ -5910,6 +5945,9 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags)
-       vrend_printf( "gl_version %d - compat profile\n", gl_ver);
-    }
- 
-+   if (use_integer())
-+      vrend_state.use_integer = true;
-+
-    init_features(gles ? 0 : gl_ver,
-                  gles ? gl_ver : 0);
- 
-@@ -6142,6 +6180,7 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de
-    grctx->shader_cfg.has_gpu_shader5 = has_feature(feat_gpu_shader5);
-    grctx->shader_cfg.has_es31_compat = has_feature(feat_gles31_compatibility);
-    grctx->shader_cfg.has_conservative_depth = has_feature(feat_conservative_depth);
-+   grctx->shader_cfg.use_integer = vrend_state.use_integer;
- 
-    vrend_renderer_create_sub_ctx(grctx, 0);
-    vrend_renderer_set_sub_ctx(grctx, 0);
-diff --git a/src/vrend_shader.c b/src/vrend_shader.c
-index 03ad71bd..aae4f2fc 100644
---- a/src/vrend_shader.c
-+++ b/src/vrend_shader.c
-@@ -100,6 +100,8 @@ struct vrend_shader_io {
-    bool glsl_gl_block;
-    bool override_no_wm;
-    bool is_int;
-+   bool is_ivec;
-+   bool is_uvec;
-    bool fbfetch_used;
-    char glsl_name[128];
-    unsigned stream;
-@@ -915,6 +917,12 @@ iter_declaration(struct tgsi_iterate_context *iter,
-       }
-       if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
-          ctx->attrib_input_mask |= (1 << decl->Range.First);
-+         if (ctx->key->attrib_signed_int_bitmask &
-+             (1 << decl->Range.First))
-+            ctx->inputs[i].is_ivec = true;
-+         else if (ctx->key->attrib_unsigned_int_bitmask &
-+                  (1 << decl->Range.First))
-+            ctx->inputs[i].is_uvec = true;
-       }
-       ctx->inputs[i].name = decl->Semantic.Name;
-       ctx->inputs[i].sid = decl->Semantic.Index;
-@@ -1265,6 +1273,13 @@ iter_declaration(struct tgsi_iterate_context *iter,
-          }
-          break;
-       case TGSI_SEMANTIC_COLOR:
-+         if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
-+            if (ctx->key->cbufs_signed_int_bitmask & (1 << ctx->outputs[i].sid))
-+                ctx->outputs[i].is_ivec = true;
-+            else if (ctx->key->cbufs_unsigned_int_bitmask & (1 << ctx->outputs[i].sid))
-+                ctx->outputs[i].is_uvec = true;
-+          }
-+
-          if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
-             if (ctx->glsl_ver_required < 140) {
-                ctx->outputs[i].glsl_no_index = true;
-@@ -3572,6 +3587,16 @@ get_destination_info(struct dump_ctx *ctx,
-                         dinfo->dtypeprefix = FLOAT_BITS_TO_INT;
-                      dinfo->dstconv = INT;
-                   }
-+                  else if (ctx->outputs[j].is_uvec) {
-+                     if (dinfo->dtypeprefix == TYPE_CONVERSION_NONE)
-+                        dinfo->dtypeprefix = FLOAT_BITS_TO_UINT;
-+                     dinfo->dstconv = dinfo->udstconv;
-+                  }
-+                  else if (ctx->outputs[j].is_ivec) {
-+                     if (dinfo->dtypeprefix == TYPE_CONVERSION_NONE)
-+                        dinfo->dtypeprefix = FLOAT_BITS_TO_INT;
-+                     dinfo->dstconv = dinfo->idstconv;
-+                  }
-                   if (ctx->outputs[j].name == TGSI_SEMANTIC_PSIZE) {
-                      dinfo->dstconv = FLOAT;
-                      break;
-@@ -3868,6 +3893,16 @@ get_source_info(struct dump_ctx *ctx,
-                   if ((stype == TGSI_TYPE_UNSIGNED || stype == TGSI_TYPE_SIGNED) &&
-                       ctx->inputs[j].is_int)
-                      srcstypeprefix = TYPE_CONVERSION_NONE;
-+                  else if (ctx->inputs[j].is_ivec || ctx->inputs[j].is_uvec) {
-+                     if (stype == TGSI_TYPE_UNSIGNED)
-+                        srcstypeprefix = UVEC4;
-+                     else if (stype == TGSI_TYPE_SIGNED)
-+                        srcstypeprefix = IVEC4;
-+                     else if (ctx->inputs[j].is_ivec)
-+                        srcstypeprefix = INT_BITS_TO_FLOAT;
-+                     else // ctx->inputs[j].is_uvec
-+                        srcstypeprefix = UINT_BITS_TO_FLOAT;
-+                  }
- 
-                   if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) {
-                      strbuf_fmt(src_buf, "floatBitsToInt(%s%s%s%s)", prefix, ctx->inputs[j].glsl_name, arrayname, swizzle);
-@@ -5902,11 +5937,22 @@ emit_ios_generic(struct dump_ctx *ctx, enum io_type iot,  const char *prefix,
-                  const struct vrend_shader_io *io, const char *inout,
-                  const char *postfix)
- {
--   const char type[4][6] = {"float", " vec2", " vec3", " vec4"};
-+   const char *itype[4] = {"  int", "ivec2", "ivec3", "ivec4"};
-+   const char *utype[4] = {" uint", "uvec2", "uvec3", "uvec4"};
-+   const char *ftype[4] = {"float", " vec2", " vec3", " vec4"};
-    const char *t = " vec4";
-+   const char **type = ftype;
- 
-    char layout[128] = "";
- 
-+   if (io->is_uvec) {
-+      t = "uvec4";
-+      type = utype;
-+   } else if (io->is_ivec) {
-+      t = "ivec4";
-+      type = itype;
-+   }
-+
-    if (io->layout_location > 0) {
-       /* we need to define a layout here because interleaved arrays might be emited */
-       if (io->swizzle_offset)
-@@ -6072,7 +6118,13 @@ static void emit_ios_vs(struct dump_ctx *ctx)
-          }
-          if (ctx->inputs[i].first != ctx->inputs[i].last)
-             snprintf(postfix, sizeof(postfix), "[%d]", ctx->inputs[i].last - ctx->inputs[i].first + 1);
--         emit_hdrf(ctx, "in vec4 %s%s;\n", ctx->inputs[i].glsl_name, postfix);
-+         const char *vtype = "vec4";
-+         if (ctx->inputs[i].is_ivec)
-+             vtype = "ivec4";
-+         else if (ctx->inputs[i].is_uvec)
-+             vtype = "uvec4";
-+         emit_hdrf(ctx, "in %s %s%s;\n",
-+                   vtype, ctx->inputs[i].glsl_name, postfix);
-       }
-    }
- 
-@@ -6208,18 +6260,25 @@ static void emit_ios_fs(struct dump_ctx *ctx)
-    }
- 
-    if (ctx->write_all_cbufs) {
-+      const char* type = "vec4";
-+      if (ctx->key->cbufs_unsigned_int_bitmask)
-+         type = "uvec4";
-+      else if (ctx->key->cbufs_signed_int_bitmask)
-+         type = "ivec4";
-+
-       for (i = 0; i < (uint32_t)ctx->cfg->max_draw_buffers; i++) {
-          if (ctx->cfg->use_gles) {
-             if (ctx->key->fs_logicop_enabled)
--               emit_hdrf(ctx, "vec4 fsout_tmp_c%d;\n", i);
-+               emit_hdrf(ctx, "%s fsout_tmp_c%d;\n", type, i);
- 
-             if (logiop_require_inout(ctx->key)) {
-                const char *noncoherent = ctx->key->fs_logicop_emulate_coherent ? "" : ", noncoherent";
--               emit_hdrf(ctx, "layout (location=%d%s) inout highp vec4 fsout_c%d;\n", i, noncoherent, i);
-+               emit_hdrf(ctx, "layout (location=%d%s) inout highp %s fsout_c%d;\n", i, noncoherent, type, i);
-             } else
--               emit_hdrf(ctx, "layout (location=%d) out vec4 fsout_c%d;\n", i, i);
-+               emit_hdrf(ctx, "layout (location=%d) out %s fsout_c%d;\n", i,
-+			 type, i);
-          } else
--            emit_hdrf(ctx, "out vec4 fsout_c%d;\n", i);
-+            emit_hdrf(ctx, "out %s fsout_c%d;\n", type, i);
-       }
-    } else {
-       for (i = 0; i < ctx->num_outputs; i++) {
-diff --git a/src/vrend_shader.h b/src/vrend_shader.h
-index 8c94e250..3a098280 100644
---- a/src/vrend_shader.h
-+++ b/src/vrend_shader.h
-@@ -118,6 +118,10 @@ struct vrend_shader_key {
-    uint8_t prev_stage_num_cull_out;
-    bool next_stage_pervertex_in;
-    uint32_t cbufs_are_a8_bitmask;
-+   uint32_t cbufs_signed_int_bitmask;
-+   uint32_t cbufs_unsigned_int_bitmask;
-+   uint32_t attrib_signed_int_bitmask;
-+   uint32_t attrib_unsigned_int_bitmask;
-    uint8_t num_indirect_generic_outputs;
-    uint8_t num_indirect_patch_outputs;
-    uint8_t num_indirect_generic_inputs;
-@@ -137,6 +141,7 @@ struct vrend_shader_cfg {
-    bool has_gpu_shader5;
-    bool has_es31_compat;
-    bool has_conservative_depth;
-+   bool use_integer;
- };
- 
- struct vrend_context;
--- 
-2.26.2
-
diff --git a/media-libs/virglrenderer/virglrenderer-0.8.2-r15.ebuild b/media-libs/virglrenderer/virglrenderer-0.8.2-r15.ebuild
new file mode 100644
index 0000000..8b4f486
--- /dev/null
+++ b/media-libs/virglrenderer/virglrenderer-0.8.2-r15.ebuild
@@ -0,0 +1,75 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="a15838e4566205d9c8b58c26836dc6d54816af4a"
+CROS_WORKON_TREE="3f31fcc29b09462fd8a6eb6bfef036abcf781b58"
+CROS_WORKON_PROJECT="chromiumos/third_party/virglrenderer"
+
+# Prevent automatic uprevs of this package since upstream is out of our control.
+CROS_WORKON_BLACKLIST="1"
+
+inherit cros-fuzzer cros-sanitizers eutils flag-o-matic meson cros-workon
+
+DESCRIPTION="library used implement a virtual 3D GPU used by qemu"
+HOMEPAGE="https://virgil3d.github.io/"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE="debug fuzzer profiling test"
+
+RDEPEND="
+	>=x11-libs/libdrm-2.4.50
+	media-libs/libepoxy
+	media-libs/minigbm
+	fuzzer? (
+		virtual/opengles
+	)
+"
+# We need autoconf-archive for @CODE_COVERAGE_RULES@. #568624
+DEPEND="${RDEPEND}
+	sys-devel/autoconf-archive
+	fuzzer? ( >=dev-libs/check-0.9.4 )
+	test? ( >=dev-libs/check-0.9.4 )"
+
+src_prepare() {
+	default
+}
+
+src_configure() {
+	sanitizers-setup-env
+
+	if use profiling; then
+		append-flags -fprofile-instr-generate -fcoverage-mapping
+		append-ldflags -fprofile-instr-generate -fcoverage-mapping
+	fi
+
+	emesonargs+=(
+		-Dminigbm_allocation="true"
+		-Dplatforms="egl"
+		$(meson_use fuzzer)
+		--buildtype $(usex debug debug release)
+	)
+
+	# virgl_fuzzer is only built with tests.
+	if use test || use fuzzer; then
+		emesonargs+=( -Dtests="true" )
+	fi
+
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	fuzzer_install "${FILESDIR}/fuzzer-OWNERS" \
+		"${WORKDIR}/${P}-build"/tests/fuzzer/virgl_fuzzer \
+		--options "${FILESDIR}/virgl_fuzzer.options"
+	fuzzer_install "${FILESDIR}/fuzzer-OWNERS" \
+		"${WORKDIR}/${P}-build"/vtest/vtest_fuzzer \
+		--options "${FILESDIR}/vtest_fuzzer.options"
+
+	find "${ED}"/usr -name 'lib*.la' -delete
+}
diff --git a/media-libs/virglrenderer/virglrenderer-0.8.2-r9.ebuild b/media-libs/virglrenderer/virglrenderer-0.8.2-r9.ebuild
deleted file mode 100644
index f02dcdd..0000000
--- a/media-libs/virglrenderer/virglrenderer-0.8.2-r9.ebuild
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="cca3132795eb7c7a27fe7929d7fd71785b083414"
-CROS_WORKON_TREE="87ec43126822578e9777c6097a214ce925553356"
-CROS_WORKON_PROJECT="chromiumos/third_party/virglrenderer"
-
-# Prevent automatic uprevs of this package since upstream is out of our control.
-CROS_WORKON_BLACKLIST="1"
-
-inherit cros-fuzzer cros-sanitizers eutils flag-o-matic meson cros-workon
-
-DESCRIPTION="library used implement a virtual 3D GPU used by qemu"
-HOMEPAGE="https://virgil3d.github.io/"
-
-LICENSE="MIT"
-SLOT="0"
-KEYWORDS="*"
-IUSE="debug fuzzer profiling test"
-
-RDEPEND="
-	>=x11-libs/libdrm-2.4.50
-	media-libs/libepoxy
-	media-libs/minigbm
-	fuzzer? (
-		virtual/opengles
-	)
-"
-# We need autoconf-archive for @CODE_COVERAGE_RULES@. #568624
-DEPEND="${RDEPEND}
-	sys-devel/autoconf-archive
-	fuzzer? ( >=dev-libs/check-0.9.4 )
-	test? ( >=dev-libs/check-0.9.4 )"
-
-PATCHES=(
-	"${FILESDIR}"/FROMLIST-shader-Use-integer-type-for-ARM-MALI-GPU.patch
-)
-
-src_prepare() {
-	default
-}
-
-src_configure() {
-	sanitizers-setup-env
-
-	if use profiling; then
-		append-flags -fprofile-instr-generate -fcoverage-mapping
-		append-ldflags -fprofile-instr-generate -fcoverage-mapping
-	fi
-
-	emesonargs+=(
-		-Dminigbm_allocation="true"
-		-Dplatforms="egl"
-		$(meson_use fuzzer)
-		--buildtype $(usex debug debug release)
-	)
-
-	# virgl_fuzzer is only built with tests.
-	if use test || use fuzzer; then
-		emesonargs+=( -Dtests="true" )
-	fi
-
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	fuzzer_install "${FILESDIR}/fuzzer-OWNERS" \
-		"${WORKDIR}/${P}-build"/tests/fuzzer/virgl_fuzzer \
-		--options "${FILESDIR}/virgl_fuzzer.options"
-	fuzzer_install "${FILESDIR}/fuzzer-OWNERS" \
-		"${WORKDIR}/${P}-build"/vtest/vtest_fuzzer \
-		--options "${FILESDIR}/vtest_fuzzer.options"
-
-	find "${ED}"/usr -name 'lib*.la' -delete
-}
diff --git a/media-libs/virglrenderer/virglrenderer-9999.ebuild b/media-libs/virglrenderer/virglrenderer-9999.ebuild
index d3b4f96..9aff02d 100644
--- a/media-libs/virglrenderer/virglrenderer-9999.ebuild
+++ b/media-libs/virglrenderer/virglrenderer-9999.ebuild
@@ -32,10 +32,6 @@
 	fuzzer? ( >=dev-libs/check-0.9.4 )
 	test? ( >=dev-libs/check-0.9.4 )"
 
-PATCHES=(
-	"${FILESDIR}"/FROMLIST-shader-Use-integer-type-for-ARM-MALI-GPU.patch
-)
-
 src_prepare() {
 	default
 }
diff --git a/media-sound/adhd/adhd-0.0.6-r2060.ebuild b/media-sound/adhd/adhd-0.0.6-r2060.ebuild
deleted file mode 100644
index 28510a4..0000000
--- a/media-sound/adhd/adhd-0.0.6-r2060.ebuild
+++ /dev/null
@@ -1,133 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI=7
-CROS_WORKON_COMMIT="44fc7045bd1724862789ccb0e26c8b04a62922ab"
-CROS_WORKON_TREE="6573e6a91196049b3a8d481ab54475e150ace971"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_USE_VCSID=1
-
-inherit toolchain-funcs autotools cros-fuzzer cros-sanitizers cros-workon systemd user libchrome-version
-
-DESCRIPTION="Google A/V Daemon"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="asan +cras-apm fuzzer generated_cros_config selinux systemd unibuild"
-
-COMMON_DEPEND="
-	chromeos-base/metrics:=
-	dev-libs/iniparser:=
-	cras-apm? ( media-libs/webrtc-apm:= )
-	>=media-libs/alsa-lib-1.1.6-r3:=
-	media-libs/ladspa-sdk:=
-	media-libs/sbc:=
-	media-libs/speex:=
-	>=sys-apps/dbus-1.4.12:=
-	selinux? ( sys-libs/libselinux:= )
-	virtual/udev:=
-"
-
-RDEPEND="
-	${COMMON_DEPEND}
-	media-sound/alsa-utils
-	media-plugins/alsa-plugins
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
-	)
-	chromeos-base/chromeos-config-tools
-"
-
-DEPEND="
-	${COMMON_DEPEND}
-	dev-libs/libpthread-stubs:=
-	media-sound/cras_rust:=
-"
-
-src_prepare() {
-	cd cras
-	eautoreconf
-	default
-}
-
-src_configure() {
-	cros_optimize_package_for_speed
-	sanitizers-setup-env
-	if use amd64 ; then
-		export FUZZER_LDFLAGS="-fsanitize=fuzzer"
-	fi
-
-	cd cras
-	# Disable external libraries for fuzzers.
-	if use fuzzer ; then
-		# Disable "gc-sections" for fuzzer builds, https://crbug.com/1026125 .
-		append-ldflags "-Wl,--no-gc-sections"
-		econf $(use_enable cras-apm webrtc-apm) \
-			--with-system-cras-rust \
-			$(use_enable amd64 fuzzer)
-	else
-		econf $(use_enable selinux) \
-			$(use_enable cras-apm webrtc-apm) \
-			--enable-metrics \
-			--with-system-cras-rust \
-			$(use_enable amd64 fuzzer)
-	fi
-}
-
-src_compile() {
-	emake CC="$(tc-getCC)" || die "Unable to build ADHD"
-}
-
-src_test() {
-	if ! use x86 && ! use amd64 ; then
-		elog "Skipping unit tests on non-x86 platform"
-	else
-		cd cras
-		# This is an ugly hack that happens to work, but should not be copied.
-		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
-		emake check
-	fi
-}
-
-src_install() {
-	emake DESTDIR="${D}" SYSTEMD="$(usex systemd)" install
-
-	# install common ucm config files.
-	insinto /usr/share/alsa/ucm
-	doins -r ucm-config/for_all_boards/*
-
-	# install common cras config files.
-	insinto /etc/cras
-	doins -r cras-config/for_all_boards/*
-
-	# install dbus config allowing cras access
-	insinto /etc/dbus-1/system.d
-	doins dbus-config/org.chromium.cras.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp/cras-seccomp-${ARCH}.policy" cras-seccomp.policy
-
-	# Install asound.conf for CRAS alsa plugin
-	insinto /etc
-	doins "${FILESDIR}"/asound.conf
-
-	if use fuzzer ; then
-		# Install example dsp.ini file for fuzzer
-		insinto /etc/cras
-		doins cras-config/dsp.ini.sample
-		# Install fuzzer binary
-		fuzzer_install "${S}/OWNERS.fuzz" cras/src/cras_rclient_message_fuzzer
-		fuzzer_install "${S}/OWNERS.fuzz" cras/src/cras_hfp_slc_fuzzer \
-			--dict "${S}/cras/src/fuzz/cras_hfp_slc.dict"
-	fi
-}
-
-pkg_preinst() {
-	enewuser "cras"
-	enewgroup "cras"
-}
diff --git a/media-sound/adhd/adhd-0.0.6-r2112.ebuild b/media-sound/adhd/adhd-0.0.6-r2112.ebuild
new file mode 100644
index 0000000..fc3b0b4
--- /dev/null
+++ b/media-sound/adhd/adhd-0.0.6-r2112.ebuild
@@ -0,0 +1,134 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI=7
+CROS_WORKON_COMMIT="ec7ced6904430fc36873ee87cd2a70e60b24358b"
+CROS_WORKON_TREE="658abdba827b48e15f7b25ea5702fc1e5591f86c"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_USE_VCSID=1
+
+inherit toolchain-funcs autotools cros-fuzzer cros-sanitizers cros-workon systemd user libchrome-version
+
+DESCRIPTION="Google A/V Daemon"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="asan +cras-apm fuzzer generated_cros_config selinux systemd unibuild"
+
+COMMON_DEPEND="
+	>=chromeos-base/metrics-0.0.1-r3152:=
+	dev-libs/iniparser:=
+	cras-apm? ( media-libs/webrtc-apm:= )
+	>=media-libs/alsa-lib-1.1.6-r3:=
+	media-libs/ladspa-sdk:=
+	media-libs/sbc:=
+	media-libs/speex:=
+	>=sys-apps/dbus-1.4.12:=
+	selinux? ( sys-libs/libselinux:= )
+	virtual/udev:=
+"
+
+RDEPEND="
+	${COMMON_DEPEND}
+	media-sound/alsa-utils
+	media-plugins/alsa-plugins
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp )
+	)
+	chromeos-base/chromeos-config-tools
+"
+
+DEPEND="
+	${COMMON_DEPEND}
+	dev-libs/libpthread-stubs:=
+	media-sound/cras_rust:=
+"
+
+src_prepare() {
+	cd cras
+	eautoreconf
+	default
+}
+
+src_configure() {
+	cros_optimize_package_for_speed
+	sanitizers-setup-env
+	if use amd64 ; then
+		export FUZZER_LDFLAGS="-fsanitize=fuzzer"
+	fi
+
+	cd cras
+	# Disable external libraries for fuzzers.
+	if use fuzzer ; then
+		# Disable "gc-sections" for fuzzer builds, https://crbug.com/1026125 .
+		append-ldflags "-Wl,--no-gc-sections"
+		econf $(use_enable cras-apm webrtc-apm) \
+			--with-system-cras-rust \
+			$(use_enable amd64 fuzzer)
+	else
+		econf $(use_enable selinux) \
+			$(use_enable cras-apm webrtc-apm) \
+			--enable-metrics \
+			--with-system-cras-rust \
+			$(use_enable amd64 fuzzer) \
+			BASE_VER="$(libchrome_ver)"
+	fi
+}
+
+src_compile() {
+	emake CC="$(tc-getCC)" || die "Unable to build ADHD"
+}
+
+src_test() {
+	if ! use x86 && ! use amd64 ; then
+		elog "Skipping unit tests on non-x86 platform"
+	else
+		cd cras
+		# This is an ugly hack that happens to work, but should not be copied.
+		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
+		emake check
+	fi
+}
+
+src_install() {
+	emake DESTDIR="${D}" SYSTEMD="$(usex systemd)" install
+
+	# install common ucm config files.
+	insinto /usr/share/alsa/ucm
+	doins -r ucm-config/for_all_boards/*
+
+	# install common cras config files.
+	insinto /etc/cras
+	doins -r cras-config/for_all_boards/*
+
+	# install dbus config allowing cras access
+	insinto /etc/dbus-1/system.d
+	doins dbus-config/org.chromium.cras.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/cras-seccomp-${ARCH}.policy" cras-seccomp.policy
+
+	# Install asound.conf for CRAS alsa plugin
+	insinto /etc
+	doins "${FILESDIR}"/asound.conf
+
+	if use fuzzer ; then
+		# Install example dsp.ini file for fuzzer
+		insinto /etc/cras
+		doins cras-config/dsp.ini.sample
+		# Install fuzzer binary
+		fuzzer_install "${S}/OWNERS.fuzz" cras/src/cras_rclient_message_fuzzer
+		fuzzer_install "${S}/OWNERS.fuzz" cras/src/cras_hfp_slc_fuzzer \
+			--dict "${S}/cras/src/fuzz/cras_hfp_slc.dict"
+	fi
+}
+
+pkg_preinst() {
+	enewuser "cras"
+	enewgroup "cras"
+}
diff --git a/media-sound/adhd/adhd-9999.ebuild b/media-sound/adhd/adhd-9999.ebuild
index 3b1b752..9076260 100644
--- a/media-sound/adhd/adhd-9999.ebuild
+++ b/media-sound/adhd/adhd-9999.ebuild
@@ -17,7 +17,7 @@
 IUSE="asan +cras-apm fuzzer generated_cros_config selinux systemd unibuild"
 
 COMMON_DEPEND="
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 	dev-libs/iniparser:=
 	cras-apm? ( media-libs/webrtc-apm:= )
 	>=media-libs/alsa-lib-1.1.6-r3:=
@@ -72,7 +72,8 @@
 			$(use_enable cras-apm webrtc-apm) \
 			--enable-metrics \
 			--with-system-cras-rust \
-			$(use_enable amd64 fuzzer)
+			$(use_enable amd64 fuzzer) \
+			BASE_VER="$(libchrome_ver)"
 	fi
 }
 
diff --git a/media-sound/alsa-utils/alsa-utils-1.2.1-r1.ebuild b/media-sound/alsa-utils/alsa-utils-1.2.1-r2.ebuild
similarity index 100%
rename from media-sound/alsa-utils/alsa-utils-1.2.1-r1.ebuild
rename to media-sound/alsa-utils/alsa-utils-1.2.1-r2.ebuild
diff --git a/media-sound/alsa-utils/alsa-utils-1.2.1.ebuild b/media-sound/alsa-utils/alsa-utils-1.2.1.ebuild
index 9be3387..047ef10 100644
--- a/media-sound/alsa-utils/alsa-utils-1.2.1.ebuild
+++ b/media-sound/alsa-utils/alsa-utils-1.2.1.ebuild
@@ -25,6 +25,7 @@
 
 PATCHES=(
 	"${FILESDIR}"/${PN}-1.1.8-missing_header.patch
+	"${FILESDIR}"/${PN}-1.2.1-alsaucm-Fix-ending-with-quotes-commands.patch
 )
 
 src_configure() {
diff --git a/media-sound/alsa-utils/files/alsa-utils-1.2.1-alsaucm-Fix-ending-with-quotes-commands.patch b/media-sound/alsa-utils/files/alsa-utils-1.2.1-alsaucm-Fix-ending-with-quotes-commands.patch
new file mode 100644
index 0000000..0cd88fe
--- /dev/null
+++ b/media-sound/alsa-utils/files/alsa-utils-1.2.1-alsaucm-Fix-ending-with-quotes-commands.patch
@@ -0,0 +1,36 @@
+From 98945364f9ac58a4554155d8ced16bfbef700245 Mon Sep 17 00:00:00 2001
+From: Cheng Yueh <cyueh@chromium.org>
+Date: Wed, 8 Jul 2020 13:13:40 +0800
+Subject: [PATCH] alsaucm: Fix ending with quotes commands
+
+Upstream status:
+https://lore.kernel.org/alsa-devel/20200709062412.348-1-cyueh@chromium.org/T/
+
+If we use 'alsaucm -n -b -' with 'get "CapturePCM/Internal Mic"' then
+the alsaucm will report error and stop immediately. The reason is that
+the parse_line in usecase.c appends an empty argument if a command ends
+with quotes.
+
+This change adds a patch to fix the parse_line function in usecase.c.
+
+Signed-off-by: Cheng Yueh <cyueh@chromium.org>
+---
+ alsaucm/usecase.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/alsaucm/usecase.c b/alsaucm/usecase.c
+index 1ed91ea..d39a159 100644
+--- a/alsaucm/usecase.c
++++ b/alsaucm/usecase.c
+@@ -130,6 +130,8 @@ static int parse_line(struct context *context, char *line)
+ 							*line == '\n'))
+ 			line++;
+ 		c = *line;
++		if (c == '\0')
++			return 0;
+ 		if (c == '\"' || c == '\'') {
+ 			start = ++line;
+ 			while (*line && *line != c)
+-- 
+2.26.2
+
diff --git a/media-sound/audio_streams/audio_streams-0.1.0-r18.ebuild b/media-sound/audio_streams/audio_streams-0.1.0-r18.ebuild
deleted file mode 100644
index 36547c0..0000000
--- a/media-sound/audio_streams/audio_streams-0.1.0-r18.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="ba0fa4ed9988618b22ba072cf8fae8408efce7d3"
-CROS_WORKON_TREE="6a803c3c8c923f3e5ddbf3b4b7b50ec935525ad8"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since audio_streams/Cargo.toml
-# is using "provided by ebuild" macro which supported by cros-rust
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="audio_streams"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Crate provides a basic interface for playing audio."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/audio_streams"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	dev-rust/sync:=
-	dev-rust/sys_util:=
-"
-
-RDEPEND="!<=media-sound/audio_streams-0.1.0-r7"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/audio_streams"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/media-sound/audio_streams/audio_streams-0.1.0-r20.ebuild b/media-sound/audio_streams/audio_streams-0.1.0-r20.ebuild
new file mode 100644
index 0000000..bb13d2e
--- /dev/null
+++ b/media-sound/audio_streams/audio_streams-0.1.0-r20.ebuild
@@ -0,0 +1,52 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="2a85ee3e727f23f61cb62a6ce642da7e18c9f50a"
+CROS_WORKON_TREE="d3de0c7d6ef905e1a802f5f40b6848be14b6df0d"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since audio_streams/Cargo.toml
+# is using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="audio_streams"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Crate provides a basic interface for playing audio."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/audio_streams"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	dev-rust/sync:=
+	dev-rust/sys_util:=
+"
+
+RDEPEND="!<=media-sound/audio_streams-0.1.0-r7"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/audio_streams"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/media-sound/cras-sys/cras-sys-0.1.0-r22.ebuild b/media-sound/cras-sys/cras-sys-0.1.0-r22.ebuild
deleted file mode 100644
index dfbba2e..0000000
--- a/media-sound/cras-sys/cras-sys-0.1.0-r22.ebuild
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="32e05a11b7199e4a17dfadbdd6455dc571ba4262"
-CROS_WORKON_TREE="84e47edbd06517532e4b5127f53f0d2b4f6677a0"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
-# using "provided by ebuild" macro which supported by cros-rust.
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="cras/client/cras-sys"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Crate for CRAS C-structures generated by bindgen"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras-sys"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	dev-rust/data_model:=
-	media-sound/audio_streams:=
-"
-
-RDEPEND="!<=media-sound/cras-sys-0.1.0-r10"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/cras/client/cras-sys"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/media-sound/cras-sys/cras-sys-0.1.0-r26.ebuild b/media-sound/cras-sys/cras-sys-0.1.0-r26.ebuild
new file mode 100644
index 0000000..6ce62c2
--- /dev/null
+++ b/media-sound/cras-sys/cras-sys-0.1.0-r26.ebuild
@@ -0,0 +1,52 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="12e16baf47ac91c14168c4483f8f0b9d9852602a"
+CROS_WORKON_TREE="52718d5427f88cf2bccfe01260649ed8f3397a2d"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
+# using "provided by ebuild" macro which supported by cros-rust.
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="cras/client/cras-sys"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Crate for CRAS C-structures generated by bindgen"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras-sys"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	dev-rust/data_model:=
+	media-sound/audio_streams:=
+"
+
+RDEPEND="!<=media-sound/cras-sys-0.1.0-r10"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cras/client/cras-sys"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/media-sound/cras_rust/cras_rust-0.1.0-r3.ebuild b/media-sound/cras_rust/cras_rust-0.1.0-r3.ebuild
deleted file mode 100644
index 53b2f4e..0000000
--- a/media-sound/cras_rust/cras_rust-0.1.0-r3.ebuild
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="645ad21dee6be08fe9ead50e1ce8db4b60724384"
-CROS_WORKON_TREE="76209c09de86847598f3b5a4ac649bb9ab7a4e25"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras/src/server/rust is
-# using the `provided by ebuild` macro from the cros-rust eclass
-CROS_WORKON_SUBTREE="cras/src/server/rust"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Rust code which is used within cras"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/src/server/rust"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	dev-rust/libc:=
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/cras/src/server/rust"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	dolib.a "$(cros-rust_get_build_dir)/libcras_rust.a"
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/media-sound/cras_rust/cras_rust-0.1.0-r4.ebuild b/media-sound/cras_rust/cras_rust-0.1.0-r4.ebuild
new file mode 100644
index 0000000..9e7436c
--- /dev/null
+++ b/media-sound/cras_rust/cras_rust-0.1.0-r4.ebuild
@@ -0,0 +1,51 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="2aeb5b18b50d86eee0c43e1a01632bd65f67e2b2"
+CROS_WORKON_TREE="56f51edbec0ccbbca4e4cdd4694e849e4ae48f42"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras/src/server/rust is
+# using the `provided by ebuild` macro from the cros-rust eclass
+CROS_WORKON_SUBTREE="cras/src/server/rust"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust code which is used within cras"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/src/server/rust"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	dev-rust/libc:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cras/src/server/rust"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dolib.a "$(cros-rust_get_build_dir)/libcras_rust.a"
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/media-sound/cras_tests/cras_tests-0.1.0-r21.ebuild b/media-sound/cras_tests/cras_tests-0.1.0-r21.ebuild
deleted file mode 100644
index 5844855..0000000
--- a/media-sound/cras_tests/cras_tests-0.1.0-r21.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="1766efbca9be7cd2d24dacde95deb17532af808b"
-CROS_WORKON_TREE="2c8f6e1f8d249ffc9359b2ce4e8e8b345ceeeeab"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
-# using "provided by ebuild" macro which supported by cros-rust
-CROS_WORKON_SUBTREE="cras/client/cras_tests"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Rust version cras test client"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras_tests"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	>=dev-rust/getopts-0.2.18:=
-	!>=dev-rust/getopts-0.3
-	dev-rust/hound:=
-	media-sound/audio_streams:=
-	media-sound/libcras:=
-"
-
-RDEPEND="!<=media-sound/cras_tests-0.1.0-r12"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/cras/client/cras_tests"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	ecargo_build
-
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	dobin "$(cros-rust_get_build_dir)/cras_tests"
-}
diff --git a/media-sound/cras_tests/cras_tests-0.1.0-r22.ebuild b/media-sound/cras_tests/cras_tests-0.1.0-r22.ebuild
new file mode 100644
index 0000000..603a1f9
--- /dev/null
+++ b/media-sound/cras_tests/cras_tests-0.1.0-r22.ebuild
@@ -0,0 +1,56 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="2aeb5b18b50d86eee0c43e1a01632bd65f67e2b2"
+CROS_WORKON_TREE="8765fd6dccd3ad79d8874f02a7ba3401c2444862"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
+# using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_SUBTREE="cras/client/cras_tests"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust version cras test client"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras_tests"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	>=dev-rust/getopts-0.2.18:=
+	!>=dev-rust/getopts-0.3
+	dev-rust/hound:=
+	media-sound/audio_streams:=
+	media-sound/libcras:=
+"
+
+RDEPEND="!<=media-sound/cras_tests-0.1.0-r12"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cras/client/cras_tests"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)/cras_tests"
+}
diff --git a/media-sound/cros_alsa/cros_alsa-0.1.0-r1.ebuild b/media-sound/cros_alsa/cros_alsa-0.1.0-r1.ebuild
new file mode 100644
index 0000000..144ece4
--- /dev/null
+++ b/media-sound/cros_alsa/cros_alsa-0.1.0-r1.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="71fbf3c0e07df51c6c68a3677053d371c47e38cf"
+CROS_WORKON_TREE="8df34d11e8b707d596006d273308a7bc953387a6"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+CROS_WORKON_INCREMENTAL_BUILD=1
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cros_alsa/Cargo.toml
+# is using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_SUBTREE="cros_alsa"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust version alsa-lib"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cros_alsa"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	>=dev-rust/alsa-sys-0.2.0:= <dev-rust/alsa-sys-0.3.0
+	>=dev-rust/libc-0.2.65:=
+	<dev-rust/libc-0.3
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+	dev-rust/remain:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cros_alsa"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	pushd cros_alsa_derive > /dev/null
+	cros-rust_publish cros_alsa_derive "$(cros-rust_get_crate_version ${S}/cros_alsa_derive)"
+	popd > /dev/null
+
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
+
+pkg_postinst() {
+
+	cros-rust_pkg_postinst cros_alsa_derive
+	cros-rust_pkg_postinst cros_alsa
+}
+
+pkg_prerm() {
+	cros-rust_pkg_prerm cros_alsa_derive
+	cros-rust_pkg_prerm cros_alsa
+}
diff --git a/media-sound/cros_alsa/cros_alsa-9999.ebuild b/media-sound/cros_alsa/cros_alsa-9999.ebuild
new file mode 100644
index 0000000..f7ff980
--- /dev/null
+++ b/media-sound/cros_alsa/cros_alsa-9999.ebuild
@@ -0,0 +1,68 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+CROS_WORKON_INCREMENTAL_BUILD=1
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cros_alsa/Cargo.toml
+# is using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_SUBTREE="cros_alsa"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust version alsa-lib"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cros_alsa"
+
+LICENSE="BSD-Google"
+KEYWORDS="~*"
+IUSE="test"
+
+DEPEND="
+	>=dev-rust/alsa-sys-0.2.0:= <dev-rust/alsa-sys-0.3.0
+	>=dev-rust/libc-0.2.65:=
+	<dev-rust/libc-0.3
+	=dev-rust/proc-macro2-1*:=
+	=dev-rust/quote-1*:=
+	=dev-rust/syn-1*:=
+	dev-rust/remain:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cros_alsa"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	pushd cros_alsa_derive > /dev/null
+	cros-rust_publish cros_alsa_derive "$(cros-rust_get_crate_version ${S}/cros_alsa_derive)"
+	popd > /dev/null
+
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
+
+pkg_postinst() {
+
+	cros-rust_pkg_postinst cros_alsa_derive
+	cros-rust_pkg_postinst cros_alsa
+}
+
+pkg_prerm() {
+	cros-rust_pkg_prerm cros_alsa_derive
+	cros-rust_pkg_prerm cros_alsa
+}
diff --git a/media-sound/cros_alsa/files/chromeos-version.sh b/media-sound/cros_alsa/files/chromeos-version.sh
new file mode 100755
index 0000000..63b5a3b
--- /dev/null
+++ b/media-sound/cros_alsa/files/chromeos-version.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+#
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Assumes the first 'version =' line in the Cargo.toml is the version for the
+# crate.
+awk '/^version = / { print $3 }' "$1/cros_alsa/Cargo.toml" | head -n1 | tr -d '"'
diff --git a/media-sound/libcras/libcras-0.1.0-r45.ebuild b/media-sound/libcras/libcras-0.1.0-r45.ebuild
deleted file mode 100644
index 38073b0..0000000
--- a/media-sound/libcras/libcras-0.1.0-r45.ebuild
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-CROS_WORKON_COMMIT="ba0fa4ed9988618b22ba072cf8fae8408efce7d3"
-CROS_WORKON_TREE="f11682d3cf8411e58cd17fa4c6ad8d52c87973d4"
-CROS_WORKON_LOCALNAME="adhd"
-CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
-# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
-# using "provided by ebuild" macro which supported by cros-rust
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE="cras/client/libcras"
-
-inherit cros-workon cros-rust
-
-DESCRIPTION="Rust version libcras"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/libcras"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-DEPEND="
-	>=dev-rust/libc-0.2.44:=
-	dev-rust/data_model:=
-	dev-rust/sys_util:=
-	media-sound/audio_streams:=
-	media-sound/cras-sys:=
-"
-
-RDEPEND="!<=media-sound/libcras-0.1.0-r21"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/cras/client/libcras"
-
-	cros-rust_src_unpack
-}
-
-src_compile() {
-	use test && ecargo_test --no-run
-}
-
-src_test() {
-	if use x86 || use amd64; then
-		ecargo_test
-	else
-		elog "Skipping rust unit tests on non-x86 platform"
-	fi
-}
-
-src_install() {
-	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
-}
diff --git a/media-sound/libcras/libcras-0.1.0-r47.ebuild b/media-sound/libcras/libcras-0.1.0-r47.ebuild
new file mode 100644
index 0000000..b3c03bb
--- /dev/null
+++ b/media-sound/libcras/libcras-0.1.0-r47.ebuild
@@ -0,0 +1,55 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+CROS_WORKON_COMMIT="2aeb5b18b50d86eee0c43e1a01632bd65f67e2b2"
+CROS_WORKON_TREE="11b3200d6a54b9af5a5f2b322e1500081d5fd708"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since cras-sys/Cargo.toml is
+# using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="cras/client/libcras"
+
+inherit cros-workon cros-rust
+
+DESCRIPTION="Rust version libcras"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/libcras"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+DEPEND="
+	>=dev-rust/libc-0.2.44:=
+	dev-rust/data_model:=
+	dev-rust/sys_util:=
+	media-sound/audio_streams:=
+	media-sound/cras-sys:=
+"
+
+RDEPEND="!<=media-sound/libcras-0.1.0-r21"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/cras/client/libcras"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	cros-rust_publish "${PN}" "$(cros-rust_get_crate_version)"
+}
diff --git a/media-sound/sound_card_init/files/chromeos-version.sh b/media-sound/sound_card_init/files/chromeos-version.sh
new file mode 100755
index 0000000..1d24634
--- /dev/null
+++ b/media-sound/sound_card_init/files/chromeos-version.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+#
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Assumes the first 'version =' line in the Cargo.toml is the version for the
+# crate.
+awk '/^version = / { print $3 }' "$1/sound_card_init/Cargo.toml" | head -n1 | tr -d '"'
diff --git a/media-sound/sound_card_init/sound_card_init-0.1.0-r4.ebuild b/media-sound/sound_card_init/sound_card_init-0.1.0-r4.ebuild
new file mode 100644
index 0000000..8284c95
--- /dev/null
+++ b/media-sound/sound_card_init/sound_card_init-0.1.0-r4.ebuild
@@ -0,0 +1,72 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="d23474743a2732171c658632d591101faaeb12cc"
+CROS_WORKON_TREE="2f8d78da83ee766e65795ca52ceaf055f222e272"
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since sound_card_init/Cargo.toml
+# is using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="sound_card_init"
+
+inherit cros-workon cros-rust udev user
+
+DESCRIPTION="Sound Card Initializer"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/sound_card_init"
+
+LICENSE="BSD-Google"
+KEYWORDS="-* amd64"
+
+DEPEND="
+	dev-rust/cc:=
+	dev-rust/getopts:=
+	dev-rust/sys_util:=
+	dev-rust/serde_yaml:=
+	dev-rust/remain:=
+	media-sound/cros_alsa:=
+	media-sound/audio_streams:=
+	media-sound/libcras:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/sound_card_init"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)/sound_card_init"
+
+	# Add upstart job for sound_card_init.
+	insinto /etc/init
+	doins sound_card_init.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/sound_card_init-seccomp-${ARCH}.policy" sound_card_init-seccomp.policy
+
+	udev_dorules 99-sound_card_init.rules
+
+}
+
+pkg_preinst() {
+	enewuser "sound_card_init"
+	enewgroup "sound_card_init"
+}
diff --git a/media-sound/sound_card_init/sound_card_init-9999.ebuild b/media-sound/sound_card_init/sound_card_init-9999.ebuild
new file mode 100644
index 0000000..bd6bb8d
--- /dev/null
+++ b/media-sound/sound_card_init/sound_card_init-9999.ebuild
@@ -0,0 +1,70 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_LOCALNAME="adhd"
+CROS_WORKON_PROJECT="chromiumos/third_party/adhd"
+# We don't use CROS_WORKON_OUTOFTREE_BUILD here since sound_card_init/Cargo.toml
+# is using "provided by ebuild" macro which supported by cros-rust
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE="sound_card_init"
+
+inherit cros-workon cros-rust udev user
+
+DESCRIPTION="Sound Card Initializer"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/sound_card_init"
+
+LICENSE="BSD-Google"
+KEYWORDS="-* ~amd64"
+
+DEPEND="
+	dev-rust/cc:=
+	dev-rust/getopts:=
+	dev-rust/sys_util:=
+	dev-rust/serde_yaml:=
+	dev-rust/remain:=
+	media-sound/cros_alsa:=
+	media-sound/audio_streams:=
+	media-sound/libcras:=
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/sound_card_init"
+
+	cros-rust_src_unpack
+}
+
+src_compile() {
+	ecargo_build
+	use test && ecargo_test --no-run
+}
+
+src_test() {
+	if use x86 || use amd64; then
+		ecargo_test
+	else
+		elog "Skipping rust unit tests on non-x86 platform"
+	fi
+}
+
+src_install() {
+	dobin "$(cros-rust_get_build_dir)/sound_card_init"
+
+	# Add upstart job for sound_card_init.
+	insinto /etc/init
+	doins sound_card_init.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/sound_card_init-seccomp-${ARCH}.policy" sound_card_init-seccomp.policy
+
+	udev_dorules 99-sound_card_init.rules
+
+}
+
+pkg_preinst() {
+	enewuser "sound_card_init"
+	enewgroup "sound_card_init"
+}
diff --git a/media-video/libva-utils/libva-utils-2.6.0-r1.ebuild b/media-video/libva-utils/libva-utils-2.6.0-r2.ebuild
similarity index 100%
rename from media-video/libva-utils/libva-utils-2.6.0-r1.ebuild
rename to media-video/libva-utils/libva-utils-2.6.0-r2.ebuild
diff --git a/media-video/libva-utils/libva-utils-2.6.0.ebuild b/media-video/libva-utils/libva-utils-2.6.0.ebuild
index 4bd07d8..828ecc6 100644
--- a/media-video/libva-utils/libva-utils-2.6.0.ebuild
+++ b/media-video/libva-utils/libva-utils-2.6.0.ebuild
@@ -29,23 +29,15 @@
 	KEYWORDS=""
 fi
 
-IUSE="+drm test wayland X"
+IUSE="test"
 
 RDEPEND="
-	>=x11-libs/libva-2.1.0[drm?,wayland?,X?]
-	drm? ( >=x11-libs/libdrm-2.4 )
-	X? (
-		>=x11-libs/libX11-1.6.2
-		>=x11-libs/libXext-1.3.2
-		>=x11-libs/libXfixes-5.0.1
-	)
-	wayland? ( >=dev-libs/wayland-1.0.6 )"
+	>=x11-libs/libva-2.1.0
+	>=x11-libs/libdrm-2.4"
 
 DEPEND="${RDEPEND}
 	virtual/pkgconfig"
 
-REQUIRED_USE="|| ( drm wayland X )"
-
 DOCS=( CONTRIBUTING.md README.md )
 
 src_prepare() {
@@ -59,11 +51,11 @@
 
 src_configure() {
 	local myeconfargs=(
-		$(use_enable X x11)
-		$(use_enable wayland)
-		$(use_enable drm)
-		$(use_enable test tests)
-		$(use_enable test vendor_intel)
+		--disable-x11
+		--disable-wayland
+		--enable-drm
+		"$(use_enable test tests)"
+		"$(use_enable test vendor_intel)"
 	)
 	autotools-utils_src_configure
 }
diff --git a/metadata/md5-cache/app-accessibility/googletts-14 b/metadata/md5-cache/app-accessibility/googletts-14
deleted file mode 100644
index dbe1b6b..0000000
--- a/metadata/md5-cache/app-accessibility/googletts-14
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Google text-to-speech engine
-EAPI=6
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=!<chromeos-base/common-assets-0.0.2-r123
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/googletts-14.tar.xz
-_md5_=f1b25aa5aa260f37a86b357eff054f99
diff --git a/metadata/md5-cache/app-accessibility/googletts-14-r1 b/metadata/md5-cache/app-accessibility/googletts-14-r1
deleted file mode 100644
index dbe1b6b..0000000
--- a/metadata/md5-cache/app-accessibility/googletts-14-r1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Google text-to-speech engine
-EAPI=6
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=!<chromeos-base/common-assets-0.0.2-r123
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/googletts-14.tar.xz
-_md5_=f1b25aa5aa260f37a86b357eff054f99
diff --git a/metadata/md5-cache/app-accessibility/googletts-14.3 b/metadata/md5-cache/app-accessibility/googletts-14.3
new file mode 100644
index 0000000..7e771be
--- /dev/null
+++ b/metadata/md5-cache/app-accessibility/googletts-14.3
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Google text-to-speech engine
+EAPI=6
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=!<chromeos-base/common-assets-0.0.2-r123
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/googletts-14.3.tar.xz
+_md5_=5d2e42951e6bc40d79d0eb72c692e5a6
diff --git a/metadata/md5-cache/app-benchmarks/glmark2-285 b/metadata/md5-cache/app-benchmarks/glmark2-285
index 420608f..728665b 100644
--- a/metadata/md5-cache/app-benchmarks/glmark2-285
+++ b/metadata/md5-cache/app-benchmarks/glmark2-285
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( opengl opengles )
 SLOT=0
 SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/glmark2-bzr-285.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
 _md5_=4784991375a530b81f627209b2f2b599
diff --git a/metadata/md5-cache/app-benchmarks/glmark2-285-r16 b/metadata/md5-cache/app-benchmarks/glmark2-285-r16
index 420608f..728665b 100644
--- a/metadata/md5-cache/app-benchmarks/glmark2-285-r16
+++ b/metadata/md5-cache/app-benchmarks/glmark2-285-r16
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( opengl opengles )
 SLOT=0
 SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/glmark2-bzr-285.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
 _md5_=4784991375a530b81f627209b2f2b599
diff --git a/metadata/md5-cache/app-benchmarks/microbenchmarks-0.0.1-r7 b/metadata/md5-cache/app-benchmarks/microbenchmarks-0.0.1-r7
index 05bdd69..bbfdd7e 100644
--- a/metadata/md5-cache/app-benchmarks/microbenchmarks-0.0.1-r7
+++ b/metadata/md5-cache/app-benchmarks/microbenchmarks-0.0.1-r7
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0.0.1-r7
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=99cf2f4fbeab674a8075b65ea7c203d0
diff --git a/metadata/md5-cache/app-benchmarks/microbenchmarks-9999 b/metadata/md5-cache/app-benchmarks/microbenchmarks-9999
index eeae5c4..c0a3563 100644
--- a/metadata/md5-cache/app-benchmarks/microbenchmarks-9999
+++ b/metadata/md5-cache/app-benchmarks/microbenchmarks-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=83860851ebc4c3b3e5a54834192be6dd
diff --git a/metadata/md5-cache/app-benchmarks/stress-ng-0.09.57 b/metadata/md5-cache/app-benchmarks/stress-ng-0.09.57
deleted file mode 100644
index d53b883..0000000
--- a/metadata/md5-cache/app-benchmarks/stress-ng-0.09.57
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=dev-libs/libaio dev-libs/libbsd dev-libs/libgcrypt:0= sys-apps/attr sys-apps/keyutils sys-libs/libapparmor sys-libs/libcap sys-libs/zlib:=
-DESCRIPTION=Stress test for a computer system with various selectable ways
-EAPI=6
-HOMEPAGE=https://kernel.ubuntu.com/~cking/stress-ng/
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=dev-libs/libaio dev-libs/libbsd dev-libs/libgcrypt:0= sys-apps/attr sys-apps/keyutils sys-libs/libapparmor sys-libs/libcap sys-libs/zlib:=
-SLOT=0
-SRC_URI=https://kernel.ubuntu.com/~cking/tarballs/stress-ng/stress-ng-0.09.57.tar.xz
-_md5_=0540ce318f2b6dab7bef15c3aa494525
diff --git a/metadata/md5-cache/app-benchmarks/xfstests-0.0.1-r16 b/metadata/md5-cache/app-benchmarks/xfstests-0.0.1-r16
index df9c2bd..1f33940 100644
--- a/metadata/md5-cache/app-benchmarks/xfstests-0.0.1-r16
+++ b/metadata/md5-cache/app-benchmarks/xfstests-0.0.1-r16
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=sys-fs/e2fsprogs dev-lang/perl sys-apps/attr sys-apps/diffutils sys-apps/gawk sys-apps/util-linux sys-devel/bc sys-fs/xfsprogs
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=573b608aa3faacdecf53bab3bd143bf9
diff --git a/metadata/md5-cache/app-benchmarks/xfstests-9999 b/metadata/md5-cache/app-benchmarks/xfstests-9999
index 0635f42..d99a8d7 100644
--- a/metadata/md5-cache/app-benchmarks/xfstests-9999
+++ b/metadata/md5-cache/app-benchmarks/xfstests-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=sys-fs/e2fsprogs dev-lang/perl sys-apps/attr sys-apps/diffutils sys-apps/gawk sys-apps/util-linux sys-devel/bc sys-fs/xfsprogs
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bd7c11632b68a5469809c8ca2a5ebe8b
diff --git a/metadata/md5-cache/app-crypt/trousers-0.3.3-r91 b/metadata/md5-cache/app-crypt/trousers-0.3.3-r91
deleted file mode 100644
index 643d745..0000000
--- a/metadata/md5-cache/app-crypt/trousers-0.3.3-r91
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup unpack
-DEPEND=chromeos-base/metrics >=dev-libs/openssl-0.9.7:0= dev-util/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=An open-source TCG Software Stack (TSS) v1.1 implementation
-EAPI=5
-HOMEPAGE=http://trousers.sf.net
-IUSE=asan doc mocktpm systemd tss_trace cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_5858217ad29e54dd69c94a9be8da7ba4b050ff5c cros-debug
-KEYWORDS=*
-LICENSE=CPL-1.0
-PROPERTIES=live
-RDEPEND=chromeos-base/metrics >=dev-libs/openssl-0.9.7:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=17db4a92bfae346186621cfe88feeed5
diff --git a/metadata/md5-cache/app-crypt/trousers-0.3.3-r97 b/metadata/md5-cache/app-crypt/trousers-0.3.3-r97
new file mode 100644
index 0000000..d009a3e
--- /dev/null
+++ b/metadata/md5-cache/app-crypt/trousers-0.3.3-r97
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst prepare setup unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152 >=dev-libs/openssl-0.9.7:0= dev-util/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=An open-source TCG Software Stack (TSS) v1.1 implementation
+EAPI=5
+HOMEPAGE=http://trousers.sf.net
+IUSE=asan doc mocktpm systemd tss_trace cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_6e7dfce147d12e5fcc5389e16682e7b68ebb5597 cros-debug
+KEYWORDS=*
+LICENSE=CPL-1.0
+PROPERTIES=live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152 >=dev-libs/openssl-0.9.7:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=5044bac2392fdb895a1a6c51b5a05cdb
diff --git a/metadata/md5-cache/app-crypt/trousers-9999 b/metadata/md5-cache/app-crypt/trousers-9999
index 2f9cf0b..1598b31 100644
--- a/metadata/md5-cache/app-crypt/trousers-9999
+++ b/metadata/md5-cache/app-crypt/trousers-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install postinst prepare setup unpack
-DEPEND=chromeos-base/metrics >=dev-libs/openssl-0.9.7:0= dev-util/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] virtual/pkgconfig sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152 >=dev-libs/openssl-0.9.7:0= dev-util/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] virtual/pkgconfig sys-apps/baselayout
 DESCRIPTION=An open-source TCG Software Stack (TSS) v1.1 implementation
 EAPI=5
 HOMEPAGE=http://trousers.sf.net
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=CPL-1.0
 PROPERTIES=live
-RDEPEND=chromeos-base/metrics >=dev-libs/openssl-0.9.7:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152 >=dev-libs/openssl-0.9.7:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c3e038e84db641d4ca54226f8f60c58b
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=9b242deb1a2a28a851a3e9b28e83db33
diff --git a/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r80 b/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r80
deleted file mode 100644
index 5960d44..0000000
--- a/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r80
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=app-crypt/trousers !<chromeos-base/autotest-tests-0.0.1-r1521
-DESCRIPTION=Trousers TPM tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/trousers/
-IUSE=+autotest +tests_hardware_TPM cros_host cros_workon_tree_5858217ad29e54dd69c94a9be8da7ba4b050ff5c +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=app-crypt/trousers !<chromeos-base/autotest-tests-0.0.1-r1521 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=90a03b8f779aa8a2338d854cdf5d0132
diff --git a/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r84 b/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r84
new file mode 100644
index 0000000..99c882b
--- /dev/null
+++ b/metadata/md5-cache/app-crypt/trousers-tests-0.0.1-r84
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=app-crypt/trousers !<chromeos-base/autotest-tests-0.0.1-r1521
+DESCRIPTION=Trousers TPM tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/trousers/
+IUSE=+autotest +tests_hardware_TPM cros_host cros_workon_tree_6e7dfce147d12e5fcc5389e16682e7b68ebb5597 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=app-crypt/trousers !<chromeos-base/autotest-tests-0.0.1-r1521 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=63c8b81372b963a48d35dd6ff38c8e97
diff --git a/metadata/md5-cache/app-crypt/trousers-tests-9999 b/metadata/md5-cache/app-crypt/trousers-tests-9999
index 33c5dc2..003beff 100644
--- a/metadata/md5-cache/app-crypt/trousers-tests-9999
+++ b/metadata/md5-cache/app-crypt/trousers-tests-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-crypt/trousers !<chromeos-base/autotest-tests-0.0.1-r1521 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d7e48f6e3ddfdbe87ccad58fda73a78b
diff --git a/metadata/md5-cache/app-emulation/lxc-3.0.3 b/metadata/md5-cache/app-emulation/lxc-3.0.3
index ca617fd..44ac881 100644
--- a/metadata/md5-cache/app-emulation/lxc-3.0.3
+++ b/metadata/md5-cache/app-emulation/lxc-3.0.3
@@ -10,5 +10,5 @@
 RDEPEND=net-libs/gnutls sys-libs/libcap pam? ( virtual/pam ) seccomp? ( sys-libs/libseccomp ) selinux? ( sys-libs/libselinux ) sys-apps/util-linux app-misc/pax-utils virtual/awk
 SLOT=0
 SRC_URI=https://linuxcontainers.org/downloads/lxc/lxc-3.0.3.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=724647d789816730e4b2aa533dfa5974
diff --git a/metadata/md5-cache/app-emulation/lxc-3.0.3-r2 b/metadata/md5-cache/app-emulation/lxc-3.0.3-r2
index ca617fd..44ac881 100644
--- a/metadata/md5-cache/app-emulation/lxc-3.0.3-r2
+++ b/metadata/md5-cache/app-emulation/lxc-3.0.3-r2
@@ -10,5 +10,5 @@
 RDEPEND=net-libs/gnutls sys-libs/libcap pam? ( virtual/pam ) seccomp? ( sys-libs/libseccomp ) selinux? ( sys-libs/libselinux ) sys-apps/util-linux app-misc/pax-utils virtual/awk
 SLOT=0
 SRC_URI=https://linuxcontainers.org/downloads/lxc/lxc-3.0.3.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=724647d789816730e4b2aa533dfa5974
diff --git a/metadata/md5-cache/app-emulation/lxd-3.17 b/metadata/md5-cache/app-emulation/lxd-3.17
index cad0393..9aeaea3 100644
--- a/metadata/md5-cache/app-emulation/lxd-3.17
+++ b/metadata/md5-cache/app-emulation/lxd-3.17
@@ -10,5 +10,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=https://linuxcontainers.org/downloads/lxd/lxd-3.17.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cros-go	157c7bac0e032e424ec1c3316c127db8	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cros-go	157c7bac0e032e424ec1c3316c127db8	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=76448dcfd14509a0fc2972a5272750ba
diff --git a/metadata/md5-cache/app-emulation/lxd-3.17-r3 b/metadata/md5-cache/app-emulation/lxd-3.17-r3
index cad0393..9aeaea3 100644
--- a/metadata/md5-cache/app-emulation/lxd-3.17-r3
+++ b/metadata/md5-cache/app-emulation/lxd-3.17-r3
@@ -10,5 +10,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=https://linuxcontainers.org/downloads/lxd/lxd-3.17.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cros-go	157c7bac0e032e424ec1c3316c127db8	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cros-go	157c7bac0e032e424ec1c3316c127db8	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=76448dcfd14509a0fc2972a5272750ba
diff --git a/metadata/md5-cache/app-emulation/qemu-9999 b/metadata/md5-cache/app-emulation/qemu-9999
new file mode 100644
index 0000000..9067848
--- /dev/null
+++ b/metadata/md5-cache/app-emulation/qemu-9999
@@ -0,0 +1,17 @@
+BDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) dev-lang/perl sys-apps/texinfo virtual/pkgconfig doc? ( dev-python/sphinx ) gtk? ( nls? ( sys-devel/gettext ) ) test? ( dev-libs/glib[utils] sys-devel/bc ) dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install postinst postrm prepare pretend setup test unpack
+DEPEND=!static? ( >=dev-libs/glib-2.0 sys-libs/zlib python? ( python_targets_python3_6? ( dev-lang/python:3.6[ncurses,readline] ) python_targets_python3_7? ( dev-lang/python:3.7[ncurses,readline] ) python_targets_python3_8? ( dev-lang/python:3.8[ncurses,readline] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) systemtap? ( dev-util/systemtap ) xattr? ( sys-apps/attr ) dev-libs/libxml2 xkb? ( x11-libs/libxkbcommon ) >=x11-libs/pixman-0.28.0 accessibility? ( app-accessibility/brltty[api] app-accessibility/brltty ) aio? ( dev-libs/libaio ) alsa? ( >=media-libs/alsa-lib-1.0.13 ) bzip2? ( app-arch/bzip2 ) capstone? ( dev-libs/capstone:= ) caps? ( sys-libs/libcap-ng ) curl? ( >=net-misc/curl-7.15.4 ) fdt? ( >=sys-apps/dtc-1.5.0 ) glusterfs? ( >=sys-cluster/glusterfs-3.4.0 ) gnutls? ( dev-libs/nettle:= >=net-libs/gnutls-3.0:= ) gtk? ( x11-libs/gtk+:3 vte? ( x11-libs/vte:2.91 ) ) infiniband? ( sys-fabric/libibumad:= sys-fabric/libibverbs:= sys-fabric/librdmacm:= ) iscsi? ( net-libs/libiscsi ) io-uring? ( sys-libs/liburing ) jemalloc? ( dev-libs/jemalloc ) jpeg? ( virtual/jpeg:0= ) lzo? ( dev-libs/lzo:2 ) ncurses? ( sys-libs/ncurses:0=[unicode] sys-libs/ncurses:0= ) nfs? ( >=net-fs/libnfs-1.9.3:= ) numa? ( sys-process/numactl ) opengl? ( virtual/opengl media-libs/libepoxy media-libs/mesa media-libs/mesa[egl,gbm] ) png? ( media-libs/libpng:0= ) pulseaudio? ( media-sound/pulseaudio ) rbd? ( sys-cluster/ceph ) sasl? ( dev-libs/cyrus-sasl ) sdl? ( media-libs/libsdl2[video] media-libs/libsdl2 ) sdl-image? ( media-libs/sdl2-image ) seccomp? ( >=sys-libs/libseccomp-2.1.0 ) smartcard? ( >=app-emulation/libcacard-2.5.0 ) snappy? ( app-arch/snappy:= ) spice? ( >=app-emulation/spice-protocol-0.12.3 >=app-emulation/spice-0.12.0 ) ssh? ( >=net-libs/libssh-0.8.6 ) usb? ( >=virtual/libusb-1-r2 ) usbredir? ( >=sys-apps/usbredir-0.6 ) vde? ( net-misc/vde ) virgl? ( media-libs/virglrenderer ) virtfs? ( sys-libs/libcap ) xen? ( app-emulation/xen-tools:= ) xfs? ( sys-fs/xfsprogs ) zstd? ( >=app-arch/zstd-1.4.0 ) ) qemu_softmmu_targets_i386? ( pin-upstream-blobs? ( ~sys-firmware/ipxe-1.0.0_p20190728[binary] ~sys-firmware/seabios-1.11.0[binary,seavgabios] ~sys-firmware/sgabios-0.1_pre8[binary] ) !pin-upstream-blobs? ( sys-firmware/edk2-ovmf sys-firmware/ipxe >=sys-firmware/seabios-1.10.2[seavgabios] sys-firmware/sgabios ) ) qemu_softmmu_targets_x86_64? ( pin-upstream-blobs? ( ~sys-firmware/ipxe-1.0.0_p20190728[binary] ~sys-firmware/seabios-1.11.0[binary,seavgabios] ~sys-firmware/sgabios-0.1_pre8[binary] ) !pin-upstream-blobs? ( sys-firmware/edk2-ovmf sys-firmware/ipxe >=sys-firmware/seabios-1.10.2[seavgabios] sys-firmware/sgabios ) ) qemu_softmmu_targets_ppc64? ( pin-upstream-blobs? ( ~sys-firmware/seabios-1.12.0[binary,seavgabios] ) !pin-upstream-blobs? ( >=sys-firmware/seabios-1.10.2[seavgabios] ) ) kernel_linux? ( >=sys-kernel/linux-headers-2.6.35 ) static? ( >=dev-libs/glib-2.0[static-libs(+)] sys-libs/zlib[static-libs(+)] python? ( python_targets_python3_6? ( dev-lang/python:3.6[ncurses,readline] ) python_targets_python3_7? ( dev-lang/python:3.7[ncurses,readline] ) python_targets_python3_8? ( dev-lang/python:3.8[ncurses,readline] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) systemtap? ( dev-util/systemtap ) xattr? ( sys-apps/attr[static-libs(+)] ) dev-libs/libxml2[static-libs(+)] xkb? ( x11-libs/libxkbcommon[static-libs(+)] ) >=x11-libs/pixman-0.28.0[static-libs(+)] accessibility? ( app-accessibility/brltty[api] app-accessibility/brltty[static-libs(+)] ) aio? ( dev-libs/libaio[static-libs(+)] ) alsa? ( >=media-libs/alsa-lib-1.0.13 ) bzip2? ( app-arch/bzip2[static-libs(+)] ) capstone? ( dev-libs/capstone:= ) caps? ( sys-libs/libcap-ng[static-libs(+)] ) curl? ( >=net-misc/curl-7.15.4[static-libs(+)] ) fdt? ( >=sys-apps/dtc-1.5.0[static-libs(+)] ) glusterfs? ( >=sys-cluster/glusterfs-3.4.0[static-libs(+)] ) gnutls? ( dev-libs/nettle:=[static-libs(+)] >=net-libs/gnutls-3.0:=[static-libs(+)] ) gtk? ( x11-libs/gtk+:3 vte? ( x11-libs/vte:2.91 ) ) infiniband? ( sys-fabric/libibumad:=[static-libs(+)] sys-fabric/libibverbs:=[static-libs(+)] sys-fabric/librdmacm:=[static-libs(+)] ) iscsi? ( net-libs/libiscsi ) io-uring? ( sys-libs/liburing[static-libs(+)] ) jemalloc? ( dev-libs/jemalloc ) jpeg? ( virtual/jpeg:0=[static-libs(+)] ) lzo? ( dev-libs/lzo:2[static-libs(+)] ) ncurses? ( sys-libs/ncurses:0=[unicode] sys-libs/ncurses:0=[static-libs(+)] ) nfs? ( >=net-fs/libnfs-1.9.3:=[static-libs(+)] ) numa? ( sys-process/numactl[static-libs(+)] ) opengl? ( virtual/opengl media-libs/libepoxy[static-libs(+)] media-libs/mesa[static-libs(+)] media-libs/mesa[egl,gbm] ) png? ( media-libs/libpng:0=[static-libs(+)] ) pulseaudio? ( media-sound/pulseaudio ) rbd? ( sys-cluster/ceph ) sasl? ( dev-libs/cyrus-sasl[static-libs(+)] ) sdl? ( media-libs/libsdl2[video] media-libs/libsdl2[static-libs(+)] ) sdl-image? ( media-libs/sdl2-image[static-libs(+)] ) seccomp? ( >=sys-libs/libseccomp-2.1.0[static-libs(+)] ) smartcard? ( >=app-emulation/libcacard-2.5.0[static-libs(+)] ) snappy? ( app-arch/snappy:= ) spice? ( >=app-emulation/spice-protocol-0.12.3 >=app-emulation/spice-0.12.0[static-libs(+)] ) ssh? ( >=net-libs/libssh-0.8.6[static-libs(+)] ) usb? ( >=virtual/libusb-1-r2[static-libs(+)] ) usbredir? ( >=sys-apps/usbredir-0.6[static-libs(+)] ) vde? ( net-misc/vde[static-libs(+)] ) virgl? ( media-libs/virglrenderer[static-libs(+)] ) virtfs? ( sys-libs/libcap ) xen? ( app-emulation/xen-tools:= ) xfs? ( sys-fs/xfsprogs[static-libs(+)] ) zstd? ( >=app-arch/zstd-1.4.0[static-libs(+)] ) ) static-user? ( >=dev-libs/glib-2.0[static-libs(+)] sys-libs/zlib[static-libs(+)] python? ( python_targets_python3_6? ( dev-lang/python:3.6[ncurses,readline] ) python_targets_python3_7? ( dev-lang/python:3.7[ncurses,readline] ) python_targets_python3_8? ( dev-lang/python:3.8[ncurses,readline] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) systemtap? ( dev-util/systemtap ) xattr? ( sys-apps/attr[static-libs(+)] ) ) filecaps? ( sys-libs/libcap )
+DESCRIPTION=QEMU + Kernel-based Virtual Machine userland tools
+EAPI=7
+HOMEPAGE=http://www.qemu.org http://www.linux-kvm.org
+IUSE=accessibility +aio alsa bzip2 capstone +caps +curl debug doc +fdt glusterfs gnutls gtk infiniband iscsi io-uring jemalloc +jpeg kernel_linux kernel_FreeBSD lzo ncurses nfs nls numa opengl +oss +pin-upstream-blobs plugins +png pulseaudio python rbd sasl +seccomp sdl sdl-image selinux smartcard snappy spice ssh static static-user systemtap tci test usb usbredir vde +vhost-net vhost-user-fs virgl virtfs +vnc vte xattr xen xfs +xkb zstd qemu_softmmu_targets_aarch64 qemu_softmmu_targets_alpha qemu_softmmu_targets_arm qemu_softmmu_targets_cris qemu_softmmu_targets_hppa qemu_softmmu_targets_i386 qemu_softmmu_targets_m68k qemu_softmmu_targets_microblaze qemu_softmmu_targets_microblazeel qemu_softmmu_targets_mips qemu_softmmu_targets_mips64 qemu_softmmu_targets_mips64el qemu_softmmu_targets_mipsel qemu_softmmu_targets_nios2 qemu_softmmu_targets_or1k qemu_softmmu_targets_ppc qemu_softmmu_targets_ppc64 qemu_softmmu_targets_riscv32 qemu_softmmu_targets_riscv64 qemu_softmmu_targets_s390x qemu_softmmu_targets_sh4 qemu_softmmu_targets_sh4eb qemu_softmmu_targets_sparc qemu_softmmu_targets_sparc64 qemu_softmmu_targets_x86_64 qemu_softmmu_targets_xtensa qemu_softmmu_targets_xtensaeb qemu_softmmu_targets_lm32 qemu_softmmu_targets_moxie qemu_softmmu_targets_rx qemu_softmmu_targets_tricore qemu_softmmu_targets_unicore32 qemu_user_targets_aarch64 qemu_user_targets_alpha qemu_user_targets_arm qemu_user_targets_cris qemu_user_targets_hppa qemu_user_targets_i386 qemu_user_targets_m68k qemu_user_targets_microblaze qemu_user_targets_microblazeel qemu_user_targets_mips qemu_user_targets_mips64 qemu_user_targets_mips64el qemu_user_targets_mipsel qemu_user_targets_nios2 qemu_user_targets_or1k qemu_user_targets_ppc qemu_user_targets_ppc64 qemu_user_targets_riscv32 qemu_user_targets_riscv64 qemu_user_targets_s390x qemu_user_targets_sh4 qemu_user_targets_sh4eb qemu_user_targets_sparc qemu_user_targets_sparc64 qemu_user_targets_x86_64 qemu_user_targets_xtensa qemu_user_targets_xtensaeb qemu_user_targets_aarch64_be qemu_user_targets_armeb qemu_user_targets_mipsn32 qemu_user_targets_mipsn32el qemu_user_targets_ppc64abi32 qemu_user_targets_ppc64le qemu_user_targets_sparc32plus qemu_user_targets_tilegx cros_host cros_workon_tree_ kernel_linux python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 +filecaps
+KEYWORDS=~*
+LICENSE=GPL-2 LGPL-2 BSD-2
+PROPERTIES=live
+RDEPEND=!static? ( >=dev-libs/glib-2.0 sys-libs/zlib python? ( python_targets_python3_6? ( dev-lang/python:3.6[ncurses,readline] ) python_targets_python3_7? ( dev-lang/python:3.7[ncurses,readline] ) python_targets_python3_8? ( dev-lang/python:3.8[ncurses,readline] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) systemtap? ( dev-util/systemtap ) xattr? ( sys-apps/attr ) dev-libs/libxml2 xkb? ( x11-libs/libxkbcommon ) >=x11-libs/pixman-0.28.0 accessibility? ( app-accessibility/brltty[api] app-accessibility/brltty ) aio? ( dev-libs/libaio ) alsa? ( >=media-libs/alsa-lib-1.0.13 ) bzip2? ( app-arch/bzip2 ) capstone? ( dev-libs/capstone:= ) caps? ( sys-libs/libcap-ng ) curl? ( >=net-misc/curl-7.15.4 ) fdt? ( >=sys-apps/dtc-1.5.0 ) glusterfs? ( >=sys-cluster/glusterfs-3.4.0 ) gnutls? ( dev-libs/nettle:= >=net-libs/gnutls-3.0:= ) gtk? ( x11-libs/gtk+:3 vte? ( x11-libs/vte:2.91 ) ) infiniband? ( sys-fabric/libibumad:= sys-fabric/libibverbs:= sys-fabric/librdmacm:= ) iscsi? ( net-libs/libiscsi ) io-uring? ( sys-libs/liburing ) jemalloc? ( dev-libs/jemalloc ) jpeg? ( virtual/jpeg:0= ) lzo? ( dev-libs/lzo:2 ) ncurses? ( sys-libs/ncurses:0=[unicode] sys-libs/ncurses:0= ) nfs? ( >=net-fs/libnfs-1.9.3:= ) numa? ( sys-process/numactl ) opengl? ( virtual/opengl media-libs/libepoxy media-libs/mesa media-libs/mesa[egl,gbm] ) png? ( media-libs/libpng:0= ) pulseaudio? ( media-sound/pulseaudio ) rbd? ( sys-cluster/ceph ) sasl? ( dev-libs/cyrus-sasl ) sdl? ( media-libs/libsdl2[video] media-libs/libsdl2 ) sdl-image? ( media-libs/sdl2-image ) seccomp? ( >=sys-libs/libseccomp-2.1.0 ) smartcard? ( >=app-emulation/libcacard-2.5.0 ) snappy? ( app-arch/snappy:= ) spice? ( >=app-emulation/spice-protocol-0.12.3 >=app-emulation/spice-0.12.0 ) ssh? ( >=net-libs/libssh-0.8.6 ) usb? ( >=virtual/libusb-1-r2 ) usbredir? ( >=sys-apps/usbredir-0.6 ) vde? ( net-misc/vde ) virgl? ( media-libs/virglrenderer ) virtfs? ( sys-libs/libcap ) xen? ( app-emulation/xen-tools:= ) xfs? ( sys-fs/xfsprogs ) zstd? ( >=app-arch/zstd-1.4.0 ) ) qemu_softmmu_targets_i386? ( pin-upstream-blobs? ( ~sys-firmware/ipxe-1.0.0_p20190728[binary] ~sys-firmware/seabios-1.11.0[binary,seavgabios] ~sys-firmware/sgabios-0.1_pre8[binary] ) !pin-upstream-blobs? ( sys-firmware/edk2-ovmf sys-firmware/ipxe >=sys-firmware/seabios-1.10.2[seavgabios] sys-firmware/sgabios ) ) qemu_softmmu_targets_x86_64? ( pin-upstream-blobs? ( ~sys-firmware/ipxe-1.0.0_p20190728[binary] ~sys-firmware/seabios-1.11.0[binary,seavgabios] ~sys-firmware/sgabios-0.1_pre8[binary] ) !pin-upstream-blobs? ( sys-firmware/edk2-ovmf sys-firmware/ipxe >=sys-firmware/seabios-1.10.2[seavgabios] sys-firmware/sgabios ) ) qemu_softmmu_targets_ppc64? ( pin-upstream-blobs? ( ~sys-firmware/seabios-1.12.0[binary,seavgabios] ) !pin-upstream-blobs? ( >=sys-firmware/seabios-1.10.2[seavgabios] ) ) acct-group/kvm selinux? ( sec-policy/selinux-qemu )
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 ) qemu_softmmu_targets_arm? ( fdt ) qemu_softmmu_targets_microblaze? ( fdt ) qemu_softmmu_targets_mips64el? ( fdt ) qemu_softmmu_targets_ppc64? ( fdt ) qemu_softmmu_targets_ppc? ( fdt ) qemu_softmmu_targets_riscv32? ( fdt ) qemu_softmmu_targets_riscv64? ( fdt ) static? ( static-user !alsa !gtk !opengl !pulseaudio !plugins !rbd !snappy ) static-user? ( !plugins ) virtfs? ( xattr ) vte? ( gtk ) plugins? ( !static !static-user )
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=https://gitlab.freedesktop.org/slirp/libslirp/repository/archive.tar.gz?ref=2faae0f778f818fadc873308f983289df697eb93 -> qemu-20200729-slirp.tar.gz https://github.com/cota/berkeley-testfloat-3/archive/5a59dcec19327396a011a17fd924aed4fec416b3.tar.gz -> qemu-20200729-berkeley-testfloat-3.tar.gz https://github.com/qemu/keycodemapdb/archive/6b3d716e2b6472eb7189d3220552280ef3d832ce.tar.gz -> qemu-20200718-keycodemapdb.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	fcaps	eeefea88d5fef2853d4c1e3770340302	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	l10n	97f2753e3f1f3753d53d856c7c0bbb0b	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	pax-utils	3551398d6ede2b572568832730cc2a45	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=f257e57281abc8dc12b3e171e5f2596c
diff --git a/metadata/md5-cache/app-misc/evtest-1.31 b/metadata/md5-cache/app-misc/evtest-1.31
deleted file mode 100644
index 3617188..0000000
--- a/metadata/md5-cache/app-misc/evtest-1.31
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=configure prepare
-DEPEND=virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=A test program for capturing input device events.
-EAPI=4
-HOMEPAGE=http://cgit.freedesktop.org/evtest/
-IUSE=+xml
-KEYWORDS=*
-LICENSE=GPL-2
-SLOT=0
-SRC_URI=http://cgit.freedesktop.org/evtest/snapshot/evtest-1.31.tar.gz mirror://gentoo/evtest-1.31-mans.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=419fd7a0f302c31377e99f8a91914d5d
diff --git a/metadata/md5-cache/app-misc/evtest-1.31-r4 b/metadata/md5-cache/app-misc/evtest-1.31-r4
deleted file mode 100644
index 3617188..0000000
--- a/metadata/md5-cache/app-misc/evtest-1.31-r4
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=configure prepare
-DEPEND=virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=A test program for capturing input device events.
-EAPI=4
-HOMEPAGE=http://cgit.freedesktop.org/evtest/
-IUSE=+xml
-KEYWORDS=*
-LICENSE=GPL-2
-SLOT=0
-SRC_URI=http://cgit.freedesktop.org/evtest/snapshot/evtest-1.31.tar.gz mirror://gentoo/evtest-1.31-mans.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=419fd7a0f302c31377e99f8a91914d5d
diff --git a/metadata/md5-cache/app-misc/evtest-1.34 b/metadata/md5-cache/app-misc/evtest-1.34
new file mode 100644
index 0000000..5021791
--- /dev/null
+++ b/metadata/md5-cache/app-misc/evtest-1.34
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig >=app-portage/elt-patches-20170815
+DEFINED_PHASES=prepare
+DEPEND=!<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=A test program for capturing input device events.
+EAPI=7
+HOMEPAGE=https://gitlab.freedesktop.org/libevdev/evtest/
+IUSE=+xml
+KEYWORDS=*
+LICENSE=GPL-2
+SLOT=0
+SRC_URI=https://gitlab.freedesktop.org/libevdev/evtest/-/archive/evtest-1.34/evtest-evtest-1.34.tar.gz -> evtest-1.34.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a588ab751231ee0e50c6c658a7f60379
diff --git a/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8 b/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8
index d839025..914a44d 100644
--- a/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8
+++ b/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0
 SRC_URI=mirror://gentoo/gentoolkit-0.3.0.8.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=1ed2f70bb66f1826e7a2e51e3f40db40
diff --git a/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8-r4 b/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8-r4
index d839025..914a44d 100644
--- a/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8-r4
+++ b/metadata/md5-cache/app-portage/gentoolkit-0.3.0.8-r4
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0
 SRC_URI=mirror://gentoo/gentoolkit-0.3.0.8.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=1ed2f70bb66f1826e7a2e51e3f40db40
diff --git a/metadata/md5-cache/app-text/ghostscript-gpl-9.52 b/metadata/md5-cache/app-text/ghostscript-gpl-9.52
index 8f6adde..0aab201 100644
--- a/metadata/md5-cache/app-text/ghostscript-gpl-9.52
+++ b/metadata/md5-cache/app-text/ghostscript-gpl-9.52
@@ -10,4 +10,4 @@
 SLOT=0
 SRC_URI=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs952/ghostscript-9.52.tar.xz
 _eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=93d13f43ecbf09431d361a1457db5597
+_md5_=878ee1e0c8bf1907586375617ade8868
diff --git a/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r1 b/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r1
deleted file mode 100644
index 8f6adde..0000000
--- a/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare
-DEPEND=app-text/libpaper media-libs/fontconfig >=media-libs/freetype-2.4.9:2= >=media-libs/lcms-2.6:2 >=media-libs/libpng-1.6.2:0= >=sys-libs/zlib-1.2.7 virtual/jpeg:0 cups? ( >=net-print/cups-1.3.8 ) dbus? ( sys-apps/dbus ) gtk? ( || ( x11-libs/gtk+:3 x11-libs/gtk+:2 ) ) idn? ( net-dns/libidn ) tiff? ( >=media-libs/tiff-4.0.1:0= ) X? ( x11-libs/libXt x11-libs/libXext ) !!media-libs/jbig2dec virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Interpreter for the PostScript language and PDF
-EAPI=6
-HOMEPAGE=https://ghostscript.com/
-IUSE=asan cups dbus fuzzer gtk idn internal linguas_de crosfonts static-libs tiff unicode X linguas_ja linguas_ko linguas_zh_CN linguas_zh_TW fuzzer asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=internal? ( LICENSE.artifex_commercial ) !internal? ( AGPL-3 CPL-1.0 )
-RDEPEND=app-text/libpaper media-libs/fontconfig >=media-libs/freetype-2.4.9:2= >=media-libs/lcms-2.6:2 >=media-libs/libpng-1.6.2:0= >=sys-libs/zlib-1.2.7 virtual/jpeg:0 cups? ( >=net-print/cups-1.3.8 ) dbus? ( sys-apps/dbus ) gtk? ( || ( x11-libs/gtk+:3 x11-libs/gtk+:2 ) ) idn? ( net-dns/libidn ) tiff? ( >=media-libs/tiff-4.0.1:0= ) X? ( x11-libs/libXt x11-libs/libXext ) !!media-libs/jbig2dec !crosfonts? ( >=app-text/poppler-data-0.4.7 ) !crosfonts? ( >=media-fonts/urw-fonts-2.4.9 ) linguas_ja? ( media-fonts/kochi-substitute ) linguas_ko? ( media-fonts/baekmuk-fonts ) linguas_zh_CN? ( media-fonts/arphicfonts ) linguas_zh_TW? ( media-fonts/arphicfonts )
-SLOT=0
-SRC_URI=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs952/ghostscript-9.52.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=93d13f43ecbf09431d361a1457db5597
diff --git a/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r4 b/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r4
new file mode 100644
index 0000000..0aab201
--- /dev/null
+++ b/metadata/md5-cache/app-text/ghostscript-gpl-9.52-r4
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare
+DEPEND=app-text/libpaper media-libs/fontconfig >=media-libs/freetype-2.4.9:2= >=media-libs/lcms-2.6:2 >=media-libs/libpng-1.6.2:0= >=sys-libs/zlib-1.2.7 virtual/jpeg:0 cups? ( >=net-print/cups-1.3.8 ) dbus? ( sys-apps/dbus ) gtk? ( || ( x11-libs/gtk+:3 x11-libs/gtk+:2 ) ) idn? ( net-dns/libidn ) tiff? ( >=media-libs/tiff-4.0.1:0= ) X? ( x11-libs/libXt x11-libs/libXext ) !!media-libs/jbig2dec virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Interpreter for the PostScript language and PDF
+EAPI=6
+HOMEPAGE=https://ghostscript.com/
+IUSE=asan cups dbus fuzzer gtk idn internal linguas_de crosfonts static-libs tiff unicode X linguas_ja linguas_ko linguas_zh_CN linguas_zh_TW fuzzer asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=internal? ( LICENSE.artifex_commercial ) !internal? ( AGPL-3 CPL-1.0 )
+RDEPEND=app-text/libpaper media-libs/fontconfig >=media-libs/freetype-2.4.9:2= >=media-libs/lcms-2.6:2 >=media-libs/libpng-1.6.2:0= >=sys-libs/zlib-1.2.7 virtual/jpeg:0 cups? ( >=net-print/cups-1.3.8 ) dbus? ( sys-apps/dbus ) gtk? ( || ( x11-libs/gtk+:3 x11-libs/gtk+:2 ) ) idn? ( net-dns/libidn ) tiff? ( >=media-libs/tiff-4.0.1:0= ) X? ( x11-libs/libXt x11-libs/libXext ) !!media-libs/jbig2dec !crosfonts? ( >=app-text/poppler-data-0.4.7 ) !crosfonts? ( >=media-fonts/urw-fonts-2.4.9 ) linguas_ja? ( media-fonts/kochi-substitute ) linguas_ko? ( media-fonts/baekmuk-fonts ) linguas_zh_CN? ( media-fonts/arphicfonts ) linguas_zh_TW? ( media-fonts/arphicfonts )
+SLOT=0
+SRC_URI=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs952/ghostscript-9.52.tar.xz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_md5_=878ee1e0c8bf1907586375617ade8868
diff --git a/metadata/md5-cache/brillo-base/libsparse-0.0.1-r7 b/metadata/md5-cache/brillo-base/libsparse-0.0.1-r7
index af62443..fbe8b6a 100644
--- a/metadata/md5-cache/brillo-base/libsparse-0.0.1-r7
+++ b/metadata/md5-cache/brillo-base/libsparse-0.0.1-r7
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-libs/zlib:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=14fb29380bb561d5910a1905095ef944
diff --git a/metadata/md5-cache/brillo-base/libsparse-9999 b/metadata/md5-cache/brillo-base/libsparse-9999
index dfa2967..4c1f734 100644
--- a/metadata/md5-cache/brillo-base/libsparse-9999
+++ b/metadata/md5-cache/brillo-base/libsparse-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-libs/zlib:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=eeb1b3f5c600545bc46d3e1b3565f632
diff --git a/metadata/md5-cache/chromeos-base/android-sdk-5303910 b/metadata/md5-cache/chromeos-base/android-sdk-5303910
index 266c579..0c0ee18 100644
--- a/metadata/md5-cache/chromeos-base/android-sdk-5303910
+++ b/metadata/md5-cache/chromeos-base/android-sdk-5303910
@@ -4,8 +4,8 @@
 HOMEPAGE=http://developer.android.com
 KEYWORDS=*
 LICENSE=Apache-2.0 BSD BSD-2 BSD-4 CPL-1.0 EPL-1.0 FTL GPL-2 IJG ISC icu LGPL-2 LGPL-2.1 libpng MIT MPL-1.1 openssl SGI-B-2.0 UoI-NCSA ZLIB W3C
-RDEPEND=>=virtual/jdk-1.5 >=dev-java/ant-core-1.6.5 sys-libs/zlib
+RDEPEND=<=virtual/jdk-9 >=virtual/jdk-9 >=dev-java/ant-core-1.6.5 sys-libs/zlib
 RESTRICT=strip
 SLOT=0
 SRC_URI=https://ci.android.com/builds/submitted/5303910/sdk/latest/android-sdk_5303910_linux-x86.zip
-_md5_=88dde86cb581a8e376bb255cced103d6
+_md5_=4328477d628fdbbd76297206910e304b
diff --git a/metadata/md5-cache/chromeos-base/android-sdk-5303910-r3 b/metadata/md5-cache/chromeos-base/android-sdk-5303910-r3
new file mode 100644
index 0000000..0c0ee18
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/android-sdk-5303910-r3
@@ -0,0 +1,11 @@
+DEFINED_PHASES=install
+DESCRIPTION=Android SDK
+EAPI=7
+HOMEPAGE=http://developer.android.com
+KEYWORDS=*
+LICENSE=Apache-2.0 BSD BSD-2 BSD-4 CPL-1.0 EPL-1.0 FTL GPL-2 IJG ISC icu LGPL-2 LGPL-2.1 libpng MIT MPL-1.1 openssl SGI-B-2.0 UoI-NCSA ZLIB W3C
+RDEPEND=<=virtual/jdk-9 >=virtual/jdk-9 >=dev-java/ant-core-1.6.5 sys-libs/zlib
+RESTRICT=strip
+SLOT=0
+SRC_URI=https://ci.android.com/builds/submitted/5303910/sdk/latest/android-sdk_5303910_linux-x86.zip
+_md5_=4328477d628fdbbd76297206910e304b
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912 b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912
deleted file mode 100644
index be0c62a..0000000
--- a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install postinst test unpack
-DEPEND=dev-go/protobuf dev-libs/protobuf:= dev-lang/go
-DESCRIPTION=AOSP frameworks/base protobuf files
-EAPI=6
-HOMEPAGE=https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-dev/core/proto/
-KEYWORDS=*
-LICENSE=Apache-2.0
-SLOT=0
-SRC_URI=https://android.googlesource.com/platform/frameworks/base/+archive/873f1727e5c7af9174ca662ad26ba5b95096d1f8/core/proto.tar.gz -> aosp-frameworks-base-core-proto-20190912.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=46ec236a425c5812b758d3e8aadf57ad
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912-r1 b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912-r1
deleted file mode 100644
index be0c62a..0000000
--- a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20190912-r1
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install postinst test unpack
-DEPEND=dev-go/protobuf dev-libs/protobuf:= dev-lang/go
-DESCRIPTION=AOSP frameworks/base protobuf files
-EAPI=6
-HOMEPAGE=https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-dev/core/proto/
-KEYWORDS=*
-LICENSE=Apache-2.0
-SLOT=0
-SRC_URI=https://android.googlesource.com/platform/frameworks/base/+archive/873f1727e5c7af9174ca662ad26ba5b95096d1f8/core/proto.tar.gz -> aosp-frameworks-base-core-proto-20190912.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=46ec236a425c5812b758d3e8aadf57ad
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929 b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929
new file mode 100644
index 0000000..e5b399c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install postinst test unpack
+DEPEND=dev-go/protobuf dev-libs/protobuf:= dev-lang/go
+DESCRIPTION=AOSP frameworks/base protobuf files
+EAPI=6
+HOMEPAGE=https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android11-dev/core/proto/
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://android.googlesource.com/platform/frameworks/base/+archive/c29468777021f4970ab20b38601448fe81ecdcbb/core/proto.tar.gz -> aosp-frameworks-base-core-proto-20200929.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dfdf244b8a5b2fa0ce7d6b015f9441fb
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929-r1 b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929-r1
new file mode 100644
index 0000000..e5b399c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/aosp-frameworks-base-proto-20200929-r1
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install postinst test unpack
+DEPEND=dev-go/protobuf dev-libs/protobuf:= dev-lang/go
+DESCRIPTION=AOSP frameworks/base protobuf files
+EAPI=6
+HOMEPAGE=https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android11-dev/core/proto/
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://android.googlesource.com/platform/frameworks/base/+archive/c29468777021f4970ab20b38601448fe81ecdcbb/core/proto.tar.gz -> aosp-frameworks-base-core-proto-20200929.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dfdf244b8a5b2fa0ce7d6b015f9441fb
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r132 b/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r132
new file mode 100644
index 0000000..46731b3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r132
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/nnapi:= dev-libs/openssl:= sci-libs/tensorflow:= dev-libs/libtextclassifier >=dev-cpp/eigen-3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS port of the Android Neural Network API
+EAPI=7
+HOMEPAGE=https://developer.android.com/ndk/guides/neuralnetworks
+IUSE=cpu_flags_x86_avx2 vendor-nnhal minimal-driver nnapi_driver_tests cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_b51e097c1127c4a9fa83ddbcc88b5d4d5f95a60f_bbf597e1cd2e3f49a8a2aab9f85c903867311558 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_b51e097c1127c4a9fa83ddbcc88b5d4d5f95a60f_bbf597e1cd2e3f49a8a2aab9f85c903867311558 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google Apache-2.0
+PROPERTIES=live live
+RDEPEND=chromeos-base/nnapi:= dev-libs/openssl:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r132
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0261df87cf03812113f23c71cd0eb8d9
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r77 b/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r77
deleted file mode 100644
index e96f73b..0000000
--- a/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-0.0.1-r77
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/nnapi:= dev-libs/openssl:= sci-libs/tensorflow:= dev-libs/libtextclassifier >=dev-cpp/eigen-3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS port of the Android Neural Network API
-EAPI=7
-HOMEPAGE=https://developer.android.com/ndk/guides/neuralnetworks
-IUSE=cpu_flags_x86_avx2 vendor-nnhal minimal-driver cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_429fd9783b5c647054d49272a354d05ffcd7d9a1 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_429fd9783b5c647054d49272a354d05ffcd7d9a1 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google Apache-2.0
-PROPERTIES=live live
-RDEPEND=chromeos-base/nnapi:= dev-libs/openssl:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r77
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=24ab963639e6b60861c56d68182e7590
diff --git a/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-9999 b/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-9999
index a38edc7..4b5f132 100644
--- a/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-9999
+++ b/metadata/md5-cache/chromeos-base/aosp-frameworks-ml-nn-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=Chrome OS port of the Android Neural Network API
 EAPI=7
 HOMEPAGE=https://developer.android.com/ndk/guides/neuralnetworks
-IUSE=cpu_flags_x86_avx2 vendor-nnhal minimal-driver cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=cpu_flags_x86_avx2 vendor-nnhal minimal-driver nnapi_driver_tests cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google Apache-2.0
 PROPERTIES=live live
 RDEPEND=chromeos-base/nnapi:= dev-libs/openssl:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c06c1fe7c1a15364bbe955dc9a47c5ff
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0f665d5cfb651591ace0fc3999c29cc7
diff --git a/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r242 b/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r242
deleted file mode 100644
index 4904d31..0000000
--- a/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r242
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=arcvm? ( chromeos-base/patchpanel ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Container to run Android's adbd proxy.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/adbd
-IUSE=+seccomp fuzzer arcvm cros_host cros_workon_tree_b0c81def68dd6bc09ac090754b216cc52c917de2_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_b0c81def68dd6bc09ac090754b216cc52c917de2_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=arcvm? ( chromeos-base/patchpanel ) chromeos-base/minijail >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r242
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=839fa893d9264859bb8afad55c8de2ca
diff --git a/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r310 b/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r310
new file mode 100644
index 0000000..69b2d30
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-adbd-0.0.1-r310
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=arcvm? ( chromeos-base/patchpanel ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Container to run Android's adbd proxy.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/adbd
+IUSE=+seccomp fuzzer arcvm cros_host cros_workon_tree_0c865f852d3d0cb2847a8d8b2ea603dfd812447b_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_0c865f852d3d0cb2847a8d8b2ea603dfd812447b_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=arcvm? ( chromeos-base/patchpanel ) chromeos-base/minijail >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r310
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6b852f84666e50d8030c6533a1ef25a0
diff --git a/metadata/md5-cache/chromeos-base/arc-adbd-9999 b/metadata/md5-cache/chromeos-base/arc-adbd-9999
index 224d08a..e2e0ed9 100644
--- a/metadata/md5-cache/chromeos-base/arc-adbd-9999
+++ b/metadata/md5-cache/chromeos-base/arc-adbd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=arcvm? ( chromeos-base/patchpanel ) chromeos-base/minijail >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9156504b6d1fa573ceb92dc1fd2b0452
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ec91fe7cfcfdc1f0395e9acd73817d33
diff --git a/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r298 b/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r298
deleted file mode 100644
index d34c9ce..0000000
--- a/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r298
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-db/sqlite:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Maintains APK cache in ARC.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/apk-cache
-IUSE=+seccomp cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_4ac2033b6d4876a06f56e8571ef008373961bbd1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_4ac2033b6d4876a06f56e8571ef008373961bbd1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail dev-db/sqlite:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r298
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c56842c628aafc5924e74d7c7f165612
diff --git a/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r319 b/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r319
new file mode 100644
index 0000000..e2deebd
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-apk-cache-0.0.1-r319
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-db/sqlite:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Maintains APK cache in ARC.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/apk-cache
+IUSE=+seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1cd410cd154b1ff287a1424cdb3bfd4c0fe40952_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1cd410cd154b1ff287a1424cdb3bfd4c0fe40952_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail dev-db/sqlite:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r319
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5abcbbc569c36908dce0b4b38e7ec3ef
diff --git a/metadata/md5-cache/chromeos-base/arc-apk-cache-9999 b/metadata/md5-cache/chromeos-base/arc-apk-cache-9999
index 5c961fe..4e3a37a 100644
--- a/metadata/md5-cache/chromeos-base/arc-apk-cache-9999
+++ b/metadata/md5-cache/chromeos-base/arc-apk-cache-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/minijail dev-db/sqlite:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=016baeac60c03f8ba398f3554b6a9afd
diff --git a/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r227 b/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r227
deleted file mode 100644
index 379b5df..0000000
--- a/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r227
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=sys-apps/dbus:= sys-fs/fuse:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=D-Bus service to provide ARC Appfuse
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/appfuse
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a0d2a8563c4f3a1aad7d4257726179ad3294f00a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a0d2a8563c4f3a1aad7d4257726179ad3294f00a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-apps/dbus:= sys-fs/fuse:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r227
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=d93e307f389d8f39ebfc930d413d2be8
diff --git a/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r248 b/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r248
new file mode 100644
index 0000000..92761ff
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-appfuse-0.0.1-r248
@@ -0,0 +1,14 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=sys-apps/dbus:= sys-fs/fuse:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=D-Bus service to provide ARC Appfuse
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/appfuse
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_c8c2c74c9c7c509d1151cf979a1a9127d566d04b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_c8c2c74c9c7c509d1151cf979a1a9127d566d04b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-apps/dbus:= sys-fs/fuse:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r248
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=e2fb003f87b094bbb034ddd502a74083
diff --git a/metadata/md5-cache/chromeos-base/arc-appfuse-9999 b/metadata/md5-cache/chromeos-base/arc-appfuse-9999
index 36f83cc..2310b97 100644
--- a/metadata/md5-cache/chromeos-base/arc-appfuse-9999
+++ b/metadata/md5-cache/chromeos-base/arc-appfuse-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=sys-apps/dbus:= sys-fs/fuse:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=a25788692af7234fbbc3fa368f404ca6
diff --git a/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r315 b/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r315
deleted file mode 100644
index 8233b12..0000000
--- a/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r315
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install postinst preinst setup unpack
-DEPEND=!<chromeos-base/chromeos-cheets-scripts-0.0.3 sys-apps/baselayout
-DESCRIPTION=Container to run Android.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/container-bundle
-IUSE=android-container-pi arcpp arcvm cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_761a5c24652ef994b61896d217cfe1f0258f9887_569dbe30775407ebff384419f65741554131d462_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<chromeos-base/chromeos-cheets-scripts-0.0.3 sys-apps/baselayout
-REQUIRED_USE=|| ( arcpp arcvm )
-SLOT=0/0.0.1-r315
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=4bfe87a43e59463a9a3f58e15c8a1df4
diff --git a/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r340 b/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r340
new file mode 100644
index 0000000..5a9a7df
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-base-0.0.1-r340
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install postinst preinst setup unpack
+DEPEND=!<chromeos-base/chromeos-cheets-scripts-0.0.3 sys-apps/baselayout
+DESCRIPTION=Container to run Android.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/container-bundle
+IUSE=android-container-pi arcpp arcvm cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_db01bef3f173c69a40670602345d43fe22b6e43a_e854d2326138b30cc4e6f04570f2c8f50e2dfa80_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/chromeos-cheets-scripts-0.0.3 sys-apps/baselayout
+REQUIRED_USE=|| ( arcpp arcvm )
+SLOT=0/0.0.1-r340
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d0475d485c67c2dbce4b19238ad76a98
diff --git a/metadata/md5-cache/chromeos-base/arc-base-9999 b/metadata/md5-cache/chromeos-base/arc-base-9999
index 92b5891..fc10e9e 100644
--- a/metadata/md5-cache/chromeos-base/arc-base-9999
+++ b/metadata/md5-cache/chromeos-base/arc-base-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<chromeos-base/chromeos-cheets-scripts-0.0.3 sys-apps/baselayout
 REQUIRED_USE=|| ( arcpp arcvm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=4b7d7de601d834c1c69f77abdc22f5d4
diff --git a/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r104 b/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r104
deleted file mode 100644
index bf4df0d..0000000
--- a/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r104
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=ARC++/ARCVM common scripts.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/scripts
-IUSE=arcvm arcpp cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_569dbe30775407ebff384419f65741554131d462_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-misc/jq
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e89be5be6d9ae6c2f5472c942a07d5d4
diff --git a/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r125 b/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r125
new file mode 100644
index 0000000..35fbdc4
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-common-scripts-0.0.1-r125
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=ARC++/ARCVM common scripts.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/scripts
+IUSE=arcvm arcpp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e854d2326138b30cc4e6f04570f2c8f50e2dfa80_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-misc/jq
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=279599692c2fe3b0b17a4447eeb11f91
diff --git a/metadata/md5-cache/chromeos-base/arc-common-scripts-9999 b/metadata/md5-cache/chromeos-base/arc-common-scripts-9999
index d473c62..7e46a652 100644
--- a/metadata/md5-cache/chromeos-base/arc-common-scripts-9999
+++ b/metadata/md5-cache/chromeos-base/arc-common-scripts-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-misc/jq
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0da69bba234bf5e6490ed8049edd4551
diff --git a/metadata/md5-cache/chromeos-base/arc-data-snapshotd-0.0.1-r7 b/metadata/md5-cache/chromeos-base/arc-data-snapshotd-0.0.1-r7
new file mode 100644
index 0000000..3cf115d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-data-snapshotd-0.0.1-r7
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/minijail:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARC data snapshotd daemon in Chrome OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/data-snapshotd
+IUSE=+seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b5506183f669d3ac351bc7584751f332a238c6e8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b5506183f669d3ac351bc7584751f332a238c6e8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=1734a78318305948ff18624c94719982
diff --git a/metadata/md5-cache/chromeos-base/arc-data-snapshotd-9999 b/metadata/md5-cache/chromeos-base/arc-data-snapshotd-9999
new file mode 100644
index 0000000..9448dd7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-data-snapshotd-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/minijail:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARC data snapshotd daemon in Chrome OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/data-snapshotd
+IUSE=+seccomp cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=4547a1390f6609d53881001fe9f42507
diff --git a/metadata/md5-cache/chromeos-base/arc-host-clock-service-0.0.1-r6 b/metadata/md5-cache/chromeos-base/arc-host-clock-service-0.0.1-r6
new file mode 100644
index 0000000..9617275
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-host-clock-service-0.0.1-r6
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARC host clock service
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/vm/host_clock
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_16dee0336113553f488cfba1cd0cd13b84b8870f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_16dee0336113553f488cfba1cd0cd13b84b8870f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r6
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=e04c25a6007de1a9868f7edd9900aa52
diff --git a/metadata/md5-cache/chromeos-base/arc-host-clock-service-9999 b/metadata/md5-cache/chromeos-base/arc-host-clock-service-9999
new file mode 100644
index 0000000..0e2c4ac
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-host-clock-service-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARC host clock service
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/arc/vm/host_clock
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=852a09e9e92864be6e983d5ac8843282
diff --git a/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r155 b/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r155
deleted file mode 100644
index f54d6d2b..0000000
--- a/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r155
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6 dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=chromeos-base/chaps:= chromeos-base/cryptohome:= chromeos-base/minijail:= dev-libs/protobuf:= chromeos-base/session_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Android keymaster service in Chrome OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/keymaster
-IUSE=+seccomp cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a20e7828b56799e02ff03478691402713f90a094_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_6dbc19849752c206e135ab59349ebb1cc62bb435 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a20e7828b56799e02ff03478691402713f90a094_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_6dbc19849752c206e135ab59349ebb1cc62bb435 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chaps:= chromeos-base/cryptohome:= chromeos-base/minijail:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r155
-SRC_URI=https://github.com/google/boringssl/archive/3359.tar.gz -> boringssl-3359.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=3e63595fc80248c95e11227e5abac0e3
diff --git a/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r179 b/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r179
new file mode 100644
index 0000000..00220d1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-keymaster-0.0.1-r179
@@ -0,0 +1,15 @@
+BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6 dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
+DEPEND=chromeos-base/chaps:= chromeos-base/cryptohome:= chromeos-base/minijail:= dev-libs/protobuf:= chromeos-base/session_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Android keymaster service in Chrome OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/keymaster
+IUSE=+seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8e20bb2f75d932f889b631c1680e6e4b1887f23a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_6dbc19849752c206e135ab59349ebb1cc62bb435 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8e20bb2f75d932f889b631c1680e6e4b1887f23a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_6dbc19849752c206e135ab59349ebb1cc62bb435 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chaps:= chromeos-base/cryptohome:= chromeos-base/minijail:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r179
+SRC_URI=https://github.com/google/boringssl/archive/430a7423039682e4bbc7b522e3b57b2c8dca5e3b.tar.gz -> boringssl-430a7423039682e4bbc7b522e3b57b2c8dca5e3b.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=95bf6c91a14bf5c8447034df24cbb0f1
diff --git a/metadata/md5-cache/chromeos-base/arc-keymaster-9999 b/metadata/md5-cache/chromeos-base/arc-keymaster-9999
index c34f442..79be778 100644
--- a/metadata/md5-cache/chromeos-base/arc-keymaster-9999
+++ b/metadata/md5-cache/chromeos-base/arc-keymaster-9999
@@ -10,6 +10,6 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chaps:= chromeos-base/cryptohome:= chromeos-base/minijail:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-SRC_URI=https://github.com/google/boringssl/archive/3359.tar.gz -> boringssl-3359.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=0f354ccd937cee22a812409feb80cb81
+SRC_URI=https://github.com/google/boringssl/archive/430a7423039682e4bbc7b522e3b57b2c8dca5e3b.tar.gz -> boringssl-430a7423039682e4bbc7b522e3b57b2c8dca5e3b.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=cd094eee39846de7b725d05e6828cbfd
diff --git a/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r125 b/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r125
deleted file mode 100644
index 4b56eff..0000000
--- a/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r125
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Container to run Android's MyFiles daemon.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/myfiles
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7cd3aa8e49fcb501797fc2d50cf36fe52964dcde_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
-SLOT=0/0.0.1-r125
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4e07f2a390040005c8c86870a2ba8cd5
diff --git a/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r148 b/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r148
new file mode 100644
index 0000000..1835d06
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-myfiles-0.0.1-r148
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Container to run Android's MyFiles daemon.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/myfiles
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ffb2f47956ef0968f7461744ad1e8098dbc6b37c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
+SLOT=0/0.0.1-r148
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6b369fe5134f6ef037e1519d2efb7fdb
diff --git a/metadata/md5-cache/chromeos-base/arc-myfiles-9999 b/metadata/md5-cache/chromeos-base/arc-myfiles-9999
index 47f3798..6415b87 100644
--- a/metadata/md5-cache/chromeos-base/arc-myfiles-9999
+++ b/metadata/md5-cache/chromeos-base/arc-myfiles-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=58972967868ea61209e94fa05a7e0aa6
diff --git a/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r373 b/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r373
deleted file mode 100644
index a37f6ea..0000000
--- a/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r373
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=D-Bus service to mount OBB files
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/obb-mounter
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_eb321caa48fe66d57214d4c04fa9ca2b865155eb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_eb321caa48fe66d57214d4c04fa9ca2b865155eb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.2-r373
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bc350aeb7d7a4e69c14523e9bf1655de
diff --git a/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r397 b/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r397
new file mode 100644
index 0000000..cc96f63
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-obb-mounter-0.0.2-r397
@@ -0,0 +1,14 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=D-Bus service to mount OBB files
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/obb-mounter
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2b3a34a1269aa84a1014ce2ae0fe33d3fd498a97_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2b3a34a1269aa84a1014ce2ae0fe33d3fd498a97_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.2-r397
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c3a245eb3957faf6044af1d7c47dd86e
diff --git a/metadata/md5-cache/chromeos-base/arc-obb-mounter-9999 b/metadata/md5-cache/chromeos-base/arc-obb-mounter-9999
index 684ae40..4e6c35b 100644
--- a/metadata/md5-cache/chromeos-base/arc-obb-mounter-9999
+++ b/metadata/md5-cache/chromeos-base/arc-obb-mounter-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5ef00f817ea038f45646e148a9376674
diff --git a/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r219 b/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r219
deleted file mode 100644
index 397e94a..0000000
--- a/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r219
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Container to run Android's removable-media daemon.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/removable-media
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_65a61cec20faf98439decb1e8c98bbebf9f119e7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
-SLOT=0/0.0.1-r219
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=87ba8cffd9a0bc38aa81590d149ef57d
diff --git a/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r241 b/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r241
new file mode 100644
index 0000000..cf281fda6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-removable-media-0.0.1-r241
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Container to run Android's removable-media daemon.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/removable-media
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_65a61cec20faf98439decb1e8c98bbebf9f119e7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
+SLOT=0/0.0.1-r241
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=376419f76c2a82e39f46fe8b8ee8db64
diff --git a/metadata/md5-cache/chromeos-base/arc-removable-media-9999 b/metadata/md5-cache/chromeos-base/arc-removable-media-9999
index 2faadc0..c0116a05 100644
--- a/metadata/md5-cache/chromeos-base/arc-removable-media-9999
+++ b/metadata/md5-cache/chromeos-base/arc-removable-media-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/mount-passthrough !<chromeos-base/chromeos-cheets-scripts-0.0.2-r470
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=91da1b93b4557ba8ba467d777a708f26
diff --git a/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r220 b/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r220
deleted file mode 100644
index ecadbe0..0000000
--- a/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r220
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Container to run Android's sdcard daemon.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/sdcard
-IUSE=esdfs cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_31316a4a1ac841d2bf0c6a247512ab33283a4797_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_31316a4a1ac841d2bf0c6a247512ab33283a4797_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!esdfs? ( chromeos-base/arc-setup ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r220
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1a2cb8f9551c5ca9eeb5639a385a399e
diff --git a/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r242 b/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r242
new file mode 100644
index 0000000..918fadf
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-sdcard-0.0.1-r242
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Container to run Android's sdcard daemon.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/sdcard
+IUSE=esdfs cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_31316a4a1ac841d2bf0c6a247512ab33283a4797_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_31316a4a1ac841d2bf0c6a247512ab33283a4797_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!esdfs? ( chromeos-base/arc-setup ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r242
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=40b1025939eb42280abcef8e375a3633
diff --git a/metadata/md5-cache/chromeos-base/arc-sdcard-9999 b/metadata/md5-cache/chromeos-base/arc-sdcard-9999
index 11a7680..6711642 100644
--- a/metadata/md5-cache/chromeos-base/arc-sdcard-9999
+++ b/metadata/md5-cache/chromeos-base/arc-sdcard-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=!esdfs? ( chromeos-base/arc-setup ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f436eef8c383a0854edfdca7b242ee9c
diff --git a/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r2 b/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r2
deleted file mode 100644
index 0c13bbb..0000000
--- a/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r2
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=ARC sensor service.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/sensor_service
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_0adab83528ae576fefaed84291ea7b275b969bfe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_0adab83528ae576fefaed84291ea7b275b969bfe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r2
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e319de131356ccc1a1471cf8e4263acd
diff --git a/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r24 b/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r24
new file mode 100644
index 0000000..fdda6f6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-sensor-service-0.0.1-r24
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=ARC sensor service.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/sensor_service
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_92a9a97f67e8be63fb16a10b1bd601ed2ed31af3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_92a9a97f67e8be63fb16a10b1bd601ed2ed31af3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r24
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=88284a842d046cbc1fa339fadfcb4e89
diff --git a/metadata/md5-cache/chromeos-base/arc-sensor-service-9999 b/metadata/md5-cache/chromeos-base/arc-sensor-service-9999
index 41608b8..7c08826 100644
--- a/metadata/md5-cache/chromeos-base/arc-sensor-service-9999
+++ b/metadata/md5-cache/chromeos-base/arc-sensor-service-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0d7533600a203d466e3ba35979305cd0
diff --git a/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r1065 b/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r1065
new file mode 100644
index 0000000..70fd177
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r1065
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/patchpanel-client:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Set up environment to run ARC.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/setup
+IUSE=arcpp arcvm esdfs fuzzer generated_cros_config houdini houdini64 ndk_translation unibuild cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_4844e0caa0ec6820875f1dc1b32bcf90b72c1eb3_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_4844e0caa0ec6820875f1dc1b32bcf90b72c1eb3_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/patchpanel-client:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= chromeos-base/patchpanel arcvm? ( chromeos-base/crosvm ) arcpp? ( chromeos-base/swap-init esdfs? ( sys-apps/restorecon ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=|| ( arcpp arcvm )
+SLOT=0/0.0.1-r1065
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a70618abe0f3ccc4e6b985a0153b77d2
diff --git a/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r986 b/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r986
deleted file mode 100644
index 0bb5a85..0000000
--- a/metadata/md5-cache/chromeos-base/arc-setup-0.0.1-r986
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= chromeos-base/metrics:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Set up environment to run ARC.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/setup
-IUSE=arcpp arcvm esdfs fuzzer generated_cros_config houdini houdini64 ndk_translation unibuild cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b3f1e7c69f74d229924724b030ce3e07981b802c_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b3f1e7c69f74d229924724b030ce3e07981b802c_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= chromeos-base/metrics:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= chromeos-base/patchpanel arcvm? ( chromeos-base/crosvm ) arcpp? ( chromeos-base/swap-init esdfs? ( sys-apps/restorecon ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=|| ( arcpp arcvm )
-SLOT=0/0.0.1-r986
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=11673474514728b9de273cf9bd019d9c
diff --git a/metadata/md5-cache/chromeos-base/arc-setup-9999 b/metadata/md5-cache/chromeos-base/arc-setup-9999
index afc8983..fd39364 100644
--- a/metadata/md5-cache/chromeos-base/arc-setup-9999
+++ b/metadata/md5-cache/chromeos-base/arc-setup-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= chromeos-base/metrics:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/patchpanel-client:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Set up environment to run ARC.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/setup
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= chromeos-base/metrics:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= chromeos-base/patchpanel arcvm? ( chromeos-base/crosvm ) arcpp? ( chromeos-base/swap-init esdfs? ( sys-apps/restorecon ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=esdfs? ( chromeos-base/arc-sdcard ) chromeos-base/bootstat:= chromeos-base/chromeos-config-tools:= chromeos-base/cryptohome-client:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/patchpanel-client:= dev-libs/dbus-glib:= dev-libs/protobuf:= sys-libs/libselinux:= chromeos-base/minijail:= chromeos-base/patchpanel arcvm? ( chromeos-base/crosvm ) arcpp? ( chromeos-base/swap-init esdfs? ( sys-apps/restorecon ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=|| ( arcpp arcvm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d3fd04bcadd34dcd2a05476e180b2e23
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4eca727cc1968cc8dcbcb3a28d16e71d
diff --git a/metadata/md5-cache/chromeos-base/arc-sslh-init-0.0.1-r14 b/metadata/md5-cache/chromeos-base/arc-sslh-init-0.0.1-r15
similarity index 100%
rename from metadata/md5-cache/chromeos-base/arc-sslh-init-0.0.1-r14
rename to metadata/md5-cache/chromeos-base/arc-sslh-init-0.0.1-r15
diff --git a/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r25 b/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r25
deleted file mode 100644
index 484cfea..0000000
--- a/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r25
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=ARCVM boot notification server
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/boot_notification_server
-IUSE=+seccomp cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a168325216d22eca49bd5430736299e318967f42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a168325216d22eca49bd5430736299e318967f42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=feaa9827e588677234771f08207b009b
diff --git a/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r45 b/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r45
new file mode 100644
index 0000000..e624b89
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-0.0.1-r45
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARCVM boot notification server
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/boot_notification_server
+IUSE=+seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a168325216d22eca49bd5430736299e318967f42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a168325216d22eca49bd5430736299e318967f42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=397c414025fd50760b3f6e88aa20851b
diff --git a/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-9999 b/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-9999
index 61f21dd..1454a6d 100644
--- a/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-9999
+++ b/metadata/md5-cache/chromeos-base/arcvm-boot-notification-server-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=0e1888180962d5eab3e1e8b4e0b5ed8c
diff --git a/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r48 b/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r48
deleted file mode 100644
index dd6b185..0000000
--- a/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r48
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=ARCVM common scripts.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_09a61131ea1838e082971ed646ea21f1ee538934_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/arc-setup !chromeos-base/arcvm-launch
-SLOT=0/0.0.1-r48
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5aec2dec895ac73250c3d953d5f0945f
diff --git a/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r70 b/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r70
new file mode 100644
index 0000000..f34ab11
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arcvm-common-scripts-0.0.1-r70
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=ARCVM common scripts.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_978d0f831d0c93f7e13fe8fdf8fb48ed88c2df31_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/arc-setup chromeos-base/arcvm-mount-media-dirs
+SLOT=0/0.0.1-r70
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=eb90db900c9a505a53339a2968b6c02e
diff --git a/metadata/md5-cache/chromeos-base/arcvm-common-scripts-9999 b/metadata/md5-cache/chromeos-base/arcvm-common-scripts-9999
index bb564f5..8165644 100644
--- a/metadata/md5-cache/chromeos-base/arcvm-common-scripts-9999
+++ b/metadata/md5-cache/chromeos-base/arcvm-common-scripts-9999
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=chromeos-base/arc-setup !chromeos-base/arcvm-launch
+RDEPEND=chromeos-base/arc-setup chromeos-base/arcvm-mount-media-dirs
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e02375495381e1aa9f8322e55c579b47
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e82b25734ab1c5e4636417f1dd267eff
diff --git a/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-0.0.1-r10 b/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-0.0.1-r10
new file mode 100644
index 0000000..1d91d50
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-0.0.1-r10
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Mount media directories on a mount point shared with ARCVM.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts/init/mount-media-dirs
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e5fb965a42d43476ed5eca63c1e3a45e813b5ed7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/mount-passthrough
+SLOT=0/0.0.1-r10
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e12e1c2381ea27ded080d1c1303b03a4
diff --git a/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-9999 b/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-9999
new file mode 100644
index 0000000..f4cd830
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arcvm-mount-media-dirs-9999
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Mount media directories on a mount point shared with ARCVM.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/scripts/init/mount-media-dirs
+IUSE=cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/mount-passthrough
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b21739f095199dd8287ae166cdcc49b1
diff --git a/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r119 b/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r119
deleted file mode 100644
index 60ef5b4..0000000
--- a/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r119
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/protobuf:= sys-fs/fuse >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=ARCVM vsock proxy.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/vsock_proxy
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1421da02cd37a2de2db3e6ed1cc6265a6bb5250e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1421da02cd37a2de2db3e6ed1cc6265a6bb5250e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= sys-fs/fuse >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r119
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ff934f0071a8f1061c4026ea45b44f56
diff --git a/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r141 b/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r141
new file mode 100644
index 0000000..6beb491
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-0.0.1-r141
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= sys-fs/fuse >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=ARCVM vsock proxy.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/vsock_proxy
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_be73fa8e4deddec2ff667a0fdce86587b25185ce_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_be73fa8e4deddec2ff667a0fdce86587b25185ce_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= sys-fs/fuse >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r141
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1c748bdb8cecb55403f619a4b80b2c65
diff --git a/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-9999 b/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-9999
index 47ca137..8ea6e1af 100644
--- a/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-9999
+++ b/metadata/md5-cache/chromeos-base/arcvm-vsock-proxy-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= sys-fs/fuse >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f4028088c5b042421a2635051ba3cc18
diff --git a/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r902 b/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r902
deleted file mode 100644
index ecc4e02..0000000
--- a/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r902
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=CrOS daemon for the Atrus speakerphone
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/atrusctl/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_93173ba661d72e8a1f0ef822b38cce252deea172 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_93173ba661d72e8a1f0ef822b38cce252deea172 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=virtual/libusb:1 virtual/libudev:0= !sys-apps/atrusctl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r902
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=0a588e2f4986b900812c1aa5ecee2dd4
diff --git a/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r922 b/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r922
new file mode 100644
index 0000000..8745c87
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/atrusctl-0.0.1-r922
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=CrOS daemon for the Atrus speakerphone
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/atrusctl/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_93173ba661d72e8a1f0ef822b38cce252deea172 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_93173ba661d72e8a1f0ef822b38cce252deea172 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=virtual/libusb:1 virtual/libudev:0= !sys-apps/atrusctl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r922
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=e116574167470ef0fb58d14397809f8a
diff --git a/metadata/md5-cache/chromeos-base/atrusctl-9999 b/metadata/md5-cache/chromeos-base/atrusctl-9999
index 2638425..a7c116a 100644
--- a/metadata/md5-cache/chromeos-base/atrusctl-9999
+++ b/metadata/md5-cache/chromeos-base/atrusctl-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=virtual/libusb:1 virtual/libudev:0= !sys-apps/atrusctl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=f98821055cc3d7477ed44a3a63a2f2d4
diff --git a/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2893 b/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2893
deleted file mode 100644
index cf85905..0000000
--- a/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2893
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/tpm_manager:= test? ( chromeos-base/libhwsec:= ) chromeos-base/vboot_reference:= tpm2? ( chromeos-base/trunks:=[test?] chromeos-base/chromeos-ec-headers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Attestation service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/
-IUSE=distributed_cryptohome test tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_677b75140e4ae1b1d889f929c630579a8b13357e_a3f5ba63eea058fad5fcab6671f690a35328329d_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_677b75140e4ae1b1d889f929c630579a8b13357e_a3f5ba63eea058fad5fcab6671f690a35328329d_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live
-RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/tpm_manager:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0.0.1-r2893
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=77df79bbdc4b8f9ad3f86cd9459e4ac0
diff --git a/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2953 b/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2953
new file mode 100644
index 0000000..a4c715f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/attestation-0.0.1-r2953
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/tpm_manager:= test? ( chromeos-base/libhwsec:= ) chromeos-base/vboot_reference:= tpm2? ( chromeos-base/trunks:=[test?] chromeos-base/chromeos-ec-headers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Attestation service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/
+IUSE=test tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_264bb1bf0f00bb187ac184fd6dedeffeba8be970_e62cbc37d070a3060cb35a6478a549702a115b7c_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_264bb1bf0f00bb187ac184fd6dedeffeba8be970_e62cbc37d070a3060cb35a6478a549702a115b7c_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live
+RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/tpm_manager:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0.0.1-r2953
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d1eb0ba9b750908640a2ae02f230fc30
diff --git a/metadata/md5-cache/chromeos-base/attestation-9999 b/metadata/md5-cache/chromeos-base/attestation-9999
index c41b0f8..f2e0a53 100644
--- a/metadata/md5-cache/chromeos-base/attestation-9999
+++ b/metadata/md5-cache/chromeos-base/attestation-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/tpm_manager:= test? ( chromeos-base/libhwsec:= ) chromeos-base/vboot_reference:= tpm2? ( chromeos-base/trunks:=[test?] chromeos-base/chromeos-ec-headers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/tpm_manager:= test? ( chromeos-base/libhwsec:= ) chromeos-base/vboot_reference:= tpm2? ( chromeos-base/trunks:=[test?] chromeos-base/chromeos-ec-headers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Attestation service for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/
-IUSE=distributed_cryptohome test tpm tpm2 cros_host cros_workon_tree_ cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=test tpm tpm2 cros_host cros_workon_tree_ cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=Apache-2.0
 PROPERTIES=live live
-RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/tpm_manager:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/chaps:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/tpm_manager:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=9b85148492361a0eec0dbcebc35f6e86
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=882757f5a99453b4f00b28bd24c35e00
diff --git a/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r188 b/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r188
deleted file mode 100644
index 1a638c4..0000000
--- a/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r188
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 ) chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Attestation D-Bus client library for Chromium OS
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/client/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_677b75140e4ae1b1d889f929c630579a8b13357e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_677b75140e4ae1b1d889f929c630579a8b13357e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/attestation-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=22452e0aaa15477857a44f8835b98496
diff --git a/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r218 b/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r218
new file mode 100644
index 0000000..922002e
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/attestation-client-0.0.1-r218
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 ) chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Attestation D-Bus client library for Chromium OS
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/attestation/client/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_264bb1bf0f00bb187ac184fd6dedeffeba8be970_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_264bb1bf0f00bb187ac184fd6dedeffeba8be970_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/attestation-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=aef694c0ddbd227a253c00949c8cf172
diff --git a/metadata/md5-cache/chromeos-base/attestation-client-9999 b/metadata/md5-cache/chromeos-base/attestation-client-9999
index cf9ff10..349f577 100644
--- a/metadata/md5-cache/chromeos-base/attestation-client-9999
+++ b/metadata/md5-cache/chromeos-base/attestation-client-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/attestation-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=027eb9465b6df47d0395c41add601db0
diff --git a/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r86 b/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r86
deleted file mode 100644
index d55c14c2..0000000
--- a/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r86
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=media-libs/alsa-lib media-sound/adhd
-DESCRIPTION=Audio test tools
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/audiotest
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_94d7c33b250225b84506620a80116ef8a08e5309
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=media-libs/alsa-lib media-sound/adhd
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8bd52ed1181fc2de7232783f59ac43f7
diff --git a/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r87 b/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r87
new file mode 100644
index 0000000..6dc494a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/audiotest-0.0.1-r87
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=media-libs/alsa-lib media-sound/adhd
+DESCRIPTION=Audio test tools
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/audiotest
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_4c65ec62ee9747708372e195bc82934408b704b0
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=media-libs/alsa-lib media-sound/adhd
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d4e18426036db6db11e8d252657ecf43
diff --git a/metadata/md5-cache/chromeos-base/audiotest-9999 b/metadata/md5-cache/chromeos-base/audiotest-9999
index 32a87c2..21409d4 100644
--- a/metadata/md5-cache/chromeos-base/audiotest-9999
+++ b/metadata/md5-cache/chromeos-base/audiotest-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=media-libs/alsa-lib media-sound/adhd
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d2792c34fcde870b10fe4cf74475ed7a
diff --git a/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1491 b/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1491
deleted file mode 100644
index ea9ab01..0000000
--- a/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1491
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/metrics:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= dev-libs/dbus-glib:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Provides authentication to LDAP and fetching device/user policies
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/authpolicy/
-IUSE=+samba asan fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_23a48282e1fb642412f2831608580c645e077db2_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_23a48282e1fb642412f2831608580c645e077db2_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/metrics:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= dev-libs/dbus-glib:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=28043e4dc0ff1d046afaad884958bb7a
diff --git a/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1533 b/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1533
new file mode 100644
index 0000000..462bb20
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/authpolicy-0.0.1-r1533
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/metrics-0.0.1-r3152:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Provides authentication to LDAP and fetching device/user policies
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/authpolicy/
+IUSE=+samba asan fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_48305cf895fbfc291c6d58b9b08c99cd28e22f8c_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_48305cf895fbfc291c6d58b9b08c99cd28e22f8c_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/metrics-0.0.1-r3152:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=05c7d7b66bc8aa06414e711367cde8f9
diff --git a/metadata/md5-cache/chromeos-base/authpolicy-9999 b/metadata/md5-cache/chromeos-base/authpolicy-9999
index f352ea3..4a71731 100644
--- a/metadata/md5-cache/chromeos-base/authpolicy-9999
+++ b/metadata/md5-cache/chromeos-base/authpolicy-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/metrics:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= dev-libs/dbus-glib:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/metrics-0.0.1-r3152:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Provides authentication to LDAP and fetching device/user policies
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/authpolicy/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/metrics:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= dev-libs/dbus-glib:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/metrics-0.0.1-r3152:= >=chromeos-base/minijail-0.0.1-r1477:= dev-libs/protobuf:= samba? ( >=net-fs/samba-4.5.3-r6:= ) sys-apps/dbus:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=8c6f71c4014a6115b8f7b2ac44735a0c
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=c2ca64a1c3392b87fde2d76c069c5de5
diff --git a/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12366 b/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12366
deleted file mode 100644
index 0a07e0e..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12366
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install postinst prepare setup test unpack
-DEPEND=!<chromeos-base/autotest-chrome-0.0.1-r1788 !<chromeos-base/autotest-tests-0.0.1-r3291 !<chromeos-base/autotest-deps-0.0.2 virtual/autotest-libs virtual/autotest-assistant-libs
-DESCRIPTION=Autotest scripts and tools
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62_dd84017ea39c62ab8790679abd24e7d37367ac48
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-chrome-0.0.1-r1788 !<chromeos-base/autotest-tests-0.0.1-r3291 !<chromeos-base/autotest-deps-0.0.2 virtual/autotest-libs virtual/autotest-assistant-libs
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d9111817b721ae7f04c4eaf5915628f2
diff --git a/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12946 b/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12946
new file mode 100644
index 0000000..8f71aa9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-0.0.2-r12946
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install postinst prepare setup test unpack
+DEPEND=!<chromeos-base/autotest-chrome-0.0.1-r1788 !<chromeos-base/autotest-tests-0.0.1-r3291 !<chromeos-base/autotest-deps-0.0.2 virtual/autotest-libs virtual/autotest-assistant-libs
+DESCRIPTION=Autotest scripts and tools
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625_0ae43237ada86ff051625b38e4bfb48ff0e7da45
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-chrome-0.0.1-r1788 !<chromeos-base/autotest-tests-0.0.1-r3291 !<chromeos-base/autotest-deps-0.0.2 virtual/autotest-libs virtual/autotest-assistant-libs
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c033b9892ceb8b2f0baaab45a28235bf
diff --git a/metadata/md5-cache/chromeos-base/autotest-9999 b/metadata/md5-cache/chromeos-base/autotest-9999
index 7d61bb9..87f46fc 100644
--- a/metadata/md5-cache/chromeos-base/autotest-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-chrome-0.0.1-r1788 !<chromeos-base/autotest-tests-0.0.1-r3291 !<chromeos-base/autotest-deps-0.0.2 virtual/autotest-libs virtual/autotest-assistant-libs
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bd7b8813cfb5b9decbc2f09abbd4b322
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e8a8c5249534a2ceb9b5c744f26a2e07
diff --git a/metadata/md5-cache/chromeos-base/autotest-all-0.0.1 b/metadata/md5-cache/chromeos-base/autotest-all-0.0.1
index c7606b0..db814f3 100644
--- a/metadata/md5-cache/chromeos-base/autotest-all-0.0.1
+++ b/metadata/md5-cache/chromeos-base/autotest-all-0.0.1
@@ -1,12 +1,12 @@
 DEFINED_PHASES=install postinst unpack
-DEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) buffet? ( chromeos-base/autotest-tests-cloud-services ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
+DEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
 DESCRIPTION=Meta ebuild for all packages providing tests
 EAPI=5
 HOMEPAGE=http://www.chromium.org
-IUSE=cheets -chromeless_tests +bluetooth buffet +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2
+IUSE=cheets -chromeless_tests +bluetooth +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) buffet? ( chromeos-base/autotest-tests-cloud-services ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
+RDEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
 SLOT=0
 _eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda
-_md5_=b35f439d0a8cd7c61347b628db73a682
+_md5_=d175330780d5ca109325910e38fc2bd7
diff --git a/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r51 b/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r51
deleted file mode 100644
index c7606b0..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r51
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install postinst unpack
-DEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) buffet? ( chromeos-base/autotest-tests-cloud-services ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
-DESCRIPTION=Meta ebuild for all packages providing tests
-EAPI=5
-HOMEPAGE=http://www.chromium.org
-IUSE=cheets -chromeless_tests +bluetooth buffet +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) buffet? ( chromeos-base/autotest-tests-cloud-services ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda
-_md5_=b35f439d0a8cd7c61347b628db73a682
diff --git a/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r52 b/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r52
new file mode 100644
index 0000000..db814f3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-all-0.0.1-r52
@@ -0,0 +1,12 @@
+DEFINED_PHASES=install postinst unpack
+DEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
+DESCRIPTION=Meta ebuild for all packages providing tests
+EAPI=5
+HOMEPAGE=http://www.chromium.org
+IUSE=cheets -chromeless_tests +bluetooth +cellular +cras +cros_disks +cros_p2p +debugd -chromeless_tty kvm_host +power_management +shill +tpm tpm2
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=chromeos-base/autotest-client chromeos-base/autotest-private-all chromeos-base/autotest-server-tests chromeos-base/autotest-server-tests-tast chromeos-base/autotest-tests chromeos-base/autotest-tests-security chromeos-base/autotest-tests-toolchain bluetooth? ( chromeos-base/autotest-server-tests-bluetooth ) cellular? ( chromeos-base/autotest-tests-cellular ) cheets? ( chromeos-base/autotest-tests-arc-public ) !chromeless_tty? ( chromeos-base/autotest-tests-cryptohome !chromeless_tests? ( chromeos-base/autotest-chrome chromeos-base/autotest-server-tests-telemetry chromeos-base/autotest-tests-graphics chromeos-base/autotest-tests-ownershipapi chromeos-base/autotest-tests-touchpad ) ) cras? ( chromeos-base/autotest-tests-audio ) cros_disks? ( chromeos-base/autotest-tests-cros-disks ) cros_p2p? ( chromeos-base/autotest-tests-p2p ) debugd? ( chromeos-base/autotest-tests-debugd ) kvm_host? ( chromeos-base/autotest-tests-vm-host ) power_management? ( chromeos-base/autotest-tests-power ) shill? ( chromeos-base/autotest-server-tests-shill chromeos-base/autotest-tests-shill ) tpm2? ( chromeos-base/autotest-tests-tpm ) tpm? ( chromeos-base/autotest-tests-tpm )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda
+_md5_=d175330780d5ca109325910e38fc2bd7
diff --git a/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7702 b/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7702
deleted file mode 100644
index f0dc4aa..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7702
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!chromeos-base/autotest-telemetry !<chromeos-base/autotest-tests-0.0.4 !<chromeos-base/autotest-tests-cellular-0.0.1-r3203 chromeos-base/autotest-deps-graphics chromeos-base/autotest-deps-policy chromeos-base/autotest-deps-webgl-mpd chromeos-base/chromeos-chrome dev-python/mkvparse shill? ( chromeos-base/shill-test-scripts ) chromeos-base/telemetry sys-apps/ethtool vaapi? ( x11-libs/libva ) tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked ) virtual/autotest-private-libs
-DESCRIPTION=Autotest tests that require chrome_binary_test, or telemetry deps
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +cellular +shill +tpm tpm2 vaapi +tests_accessibility_Sanity +tests_accessibility_ChromeVoxSound +tests_audio_ActiveStreamStress +tests_audio_AudioCorruption +tests_audio_CrasSanity +tests_audio_PlaybackPower +tests_audio_SeekAudioFeedback +tests_autoupdate_CrashBrowserAfterUpdate +tests_autoupdate_EOL +tests_autoupdate_LoginStartUpdateLogout +tests_autoupdate_StartOOBEUpdate +tests_autoupdate_UpdateFromUI +tests_autoupdate_UserData +tests_bluetooth_AdapterReboot +tests_bluetooth_AdapterSanity +tests_bluetooth_IDCheck +tests_bluetooth_RegressionClient +tests_bluetooth_TurnOnOffUI +tests_desktopui_AudioFeedback +tests_desktopui_CheckRlzPingSent +tests_desktopui_ChromeSanity tests_desktopui_ConnectivityDiagnostics +tests_desktopui_FlashSanityCheck +tests_desktopui_MediaAudioFeedback +tests_desktopui_ScreenLocker +tests_desktopui_SimpleLogin +tests_desktopui_UrlFetchWithChromeDriver +tests_display_ClientChameleonConnection +tests_display_DisplayContainEdid +tests_dummy_IdleSuspend +tests_enterprise_FakeEnrollment +tests_enterprise_KioskEnrollment +tests_enterprise_OnlineDemoModeEnrollment +tests_enterprise_PowerManagement +tests_enterprise_RemoraRequisition +tests_graphics_Chrome +tests_graphics_HwOverlays +tests_graphics_Stress +tests_graphics_VideoRenderingPower +tests_graphics_VTSwitch +tests_graphics_WebGLAquarium +tests_graphics_WebGLManyPlanetsDeep tests_logging_AsanCrash +tests_logging_CrashServices +tests_logging_FeedbackReport +tests_login_ChromeProfileSanitary +tests_login_CryptohomeDataLeak +tests_login_CryptohomeIncognito +tests_login_GaiaLogin +tests_login_LoginSuccess +tests_login_OobeLocalization +tests_login_SavePassword +tests_login_UnicornLogin +tests_longevity_Tracker +tests_network_CastTDLS +tests_network_ChromeWifiConfigure +tests_platform_ChromeCgroups +tests_platform_InitLoginPerf +tests_platform_InputBrightness +tests_platform_InputBrowserNav +tests_platform_InputNewTab +tests_platform_InputScreenshot +tests_platform_InputVolume +tests_platform_LogoutPerf +tests_platform_LowMemoryTest +tests_platform_MouseScrollTest +tests_platform_PrintJob +tests_platform_SessionManagerBlockDevmodeSetting +tests_platform_ScrollTest +tests_policy_AccessibilityTest +tests_policy_AllowDeletingBrowserHistory +tests_policy_AllowScreenLock +tests_policy_AlternateErrorPages +tests_policy_ArcAudioCaptureAllowed +tests_policy_ArcBackupRestoreServiceEnabled +tests_policy_ArcExternalStorageDisabled +tests_policy_ArcVideoCaptureAllowed +tests_policy_ArcDisableScreenshots +tests_policy_AudioOutputAllowed +tests_policy_AutotestSanity +tests_policy_BookmarkBarEnabled +tests_policy_ChromeOsLockOnIdleSuspend +tests_policy_CookiesAllowedForUrls +tests_policy_CookiesBlockedForUrls +tests_policy_CookiesSessionOnlyForUrls +tests_policy_DefaultGeolocationSetting +tests_policy_DefaultImagesSetting +tests_policy_DefaultJavaScriptSetting +tests_policy_DefaultNotificationsSetting +tests_policy_DefaultSearchProvider +tests_policy_DeveloperToolsAvailability +tests_policy_DeviceAllowBluetooth +tests_policy_DeviceAutoUpdateDisabled +tests_policy_DeviceCharging +tests_policy_DeviceDockMacAddressSource +tests_policy_DeviceScheduledCharging +tests_policy_DeviceTargetVersionPrefix +tests_policy_DeviceWilcoDtcAllowed +tests_policy_DisableScreenshots +tests_policy_DownloadDirectory +tests_policy_DriveDisabled +tests_policy_EditBookmarksEnabled +tests_policy_DeviceEphemeralUsersEnabled +tests_policy_EnrollmentRetainment +tests_policy_EnterpriseForceInstallCustom +tests_policy_ExtensionAllowedTypes +tests_policy_ExtensionControls +tests_policy_ExtensionPolicy +tests_policy_ExternalStorageDisabled +tests_policy_ExternalStorageReadOnly +tests_policy_ForceGoogleSafeSearch +tests_policy_ForceYouTubeRestrict +tests_policy_ForceYouTubeSafetyMode +tests_policy_HomepageLocation +tests_policy_ImagesAllowedForUrls +tests_policy_ImagesBlockedForUrls +tests_policy_JavaScriptAllowedForUrls +tests_policy_JavaScriptBlockedForUrls +tests_policy_KeyboardDefaultToFunctionKeys +tests_policy_KeyPermissions +tests_policy_KioskModeEnabled +tests_policy_ManagedBookmarks +tests_policy_NativePrintersBulkAccessMode +tests_policy_NewTabPageLocation +tests_policy_NotificationsAllowedForUrls +tests_policy_NotificationsBlockedForUrls +tests_policy_PasswordManager +tests_policy_PinnedLauncherApps +tests_policy_PlatformKeys +tests_policy_PluginsAllowedForUrls +tests_policy_PluginsBlockedForUrls +tests_policy_PolicyRefreshRate +tests_policy_PopupsAllowedForUrls +tests_policy_PopupsBlockedForUrls +tests_policy_PowerManagementIdleSettings +tests_policy_PrintingEnabled +tests_policy_PromptForDownloadLocation +tests_policy_ProxySettings +tests_policy_ReportUploadFrequency +tests_policy_RestoreOnStartupURLs +tests_policy_SafeBrowsingEnabled +tests_policy_SavingBrowserHistoryDisabled +tests_policy_ScreenBrightnessPercent +tests_policy_SearchSuggestEnabled +tests_policy_SecondaryGoogleAccountSigninAllowed +tests_policy_ShowLogoutButtonInTray +tests_policy_ShowHomeButton +tests_policy_SystemTimezone +tests_policy_TranslateEnabled +tests_policy_UserNativePrintersAllowed +tests_policy_VirtualMachinesAllowed +tests_policy_WilcoOnNonWilcoDevice +tests_policy_WilcoUSBPowershare +tests_power_AudioDetector +tests_power_BatteryDrain +tests_power_Consumption +tests_power_Display +tests_power_FlashVideoSuspend +tests_power_Idle +tests_power_IdleSuspend +tests_power_LoadTest +tests_power_LowMemorySuspend +tests_power_MeetClient +tests_power_Speedometer2 +tests_power_ThermalLoad +tests_power_UiResume +tests_power_VideoCall +tests_power_VideoDetector +tests_power_VideoPlayback +tests_power_VideoSuspend +tests_power_WebGL +tests_security_BundledExtensions +tests_telemetry_AFDOGenerateClient +tests_telemetry_Sanity +tests_telemetry_UnitTests +tests_telemetry_UnitTestsServer +tests_touch_GestureNav +tests_touch_MouseScroll +tests_touch_ScrollDirection +tests_touch_TapSettings +tests_touch_TabSwitch +tests_touch_TouchscreenScroll +tests_touch_TouchscreenTaps +tests_touch_TouchscreenZoom +tests_touch_StylusTaps +tests_video_AVAnalysis cellular? ( +tests_cellular_ModemControl +tests_cellular_SuspendResume +tests_network_ChromeCellularEndToEnd +tests_network_ChromeCellularNetworkPresent +tests_network_ChromeCellularNetworkProperties +tests_network_ChromeCellularSmokeTest ) shill? ( +tests_network_ChromeWifiEndToEnd +tests_network_FirewallHolePunch +tests_network_RackWiFiConnect +tests_network_RoamSuspendEndToEnd +tests_network_RoamWifiEndToEnd +tests_policy_GlobalNetworkSettings +tests_policy_WiFiAutoconnect +tests_policy_WiFiPrecedence +tests_policy_WiFiTypes ) tpm? ( +tests_platform_Pkcs11InitOnLogin ) tpm2? ( +tests_platform_Pkcs11InitOnLogin ) +tests_graphics_Idle cros_host cros_workon_tree_0c04c6f35f8a964756856577c2900e4e4d975fcd +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!chromeos-base/autotest-telemetry !<chromeos-base/autotest-tests-0.0.4 !<chromeos-base/autotest-tests-cellular-0.0.1-r3203 chromeos-base/autotest-deps-graphics chromeos-base/autotest-deps-policy chromeos-base/autotest-deps-webgl-mpd chromeos-base/chromeos-chrome dev-python/mkvparse shill? ( chromeos-base/shill-test-scripts ) chromeos-base/telemetry sys-apps/ethtool vaapi? ( x11-libs/libva ) tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked ) virtual/autotest-private-libs autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=451296c9f0b17ec5c6bd744c91853567
diff --git a/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7738 b/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7738
new file mode 100644
index 0000000..28c552c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-chrome-0.0.1-r7738
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!chromeos-base/autotest-telemetry !<chromeos-base/autotest-tests-0.0.4 !<chromeos-base/autotest-tests-cellular-0.0.1-r3203 chromeos-base/autotest-deps-graphics chromeos-base/autotest-deps-policy chromeos-base/autotest-deps-webgl-mpd chromeos-base/chromeos-chrome dev-python/mkvparse shill? ( chromeos-base/shill-test-scripts ) chromeos-base/telemetry sys-apps/ethtool vaapi? ( x11-libs/libva ) tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked ) virtual/autotest-private-libs
+DESCRIPTION=Autotest tests that require chrome_binary_test, or telemetry deps
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +cellular +shill +tpm tpm2 vaapi +tests_accessibility_Sanity +tests_accessibility_ChromeVoxSound +tests_audio_ActiveStreamStress +tests_audio_AudioCorruption +tests_audio_CrasSanity +tests_audio_PlaybackPower +tests_audio_SeekAudioFeedback +tests_autoupdate_EOL +tests_autoupdate_LoginStartUpdateLogout +tests_autoupdate_StartOOBEUpdate +tests_autoupdate_UpdateFromUI +tests_autoupdate_UserData +tests_bluetooth_AdapterReboot +tests_bluetooth_AdapterSanity +tests_bluetooth_IDCheck +tests_bluetooth_RegressionClient +tests_bluetooth_TurnOnOffUI +tests_desktopui_AudioFeedback +tests_desktopui_CheckRlzPingSent +tests_desktopui_ChromeSanity tests_desktopui_ConnectivityDiagnostics +tests_desktopui_MediaAudioFeedback +tests_desktopui_ScreenLocker +tests_desktopui_SimpleLogin +tests_desktopui_UrlFetchWithChromeDriver +tests_display_ClientChameleonConnection +tests_display_DisplayContainEdid +tests_dummy_IdleSuspend +tests_enterprise_FakeEnrollment +tests_enterprise_KioskEnrollment +tests_enterprise_OnlineDemoModeEnrollment +tests_enterprise_PowerManagement +tests_enterprise_RemoraRequisition +tests_graphics_Chrome +tests_graphics_HwOverlays +tests_graphics_Stress +tests_graphics_VideoRenderingPower +tests_graphics_VTSwitch +tests_graphics_WebGLAquarium +tests_graphics_WebGLManyPlanetsDeep tests_logging_AsanCrash +tests_logging_CrashServices +tests_logging_FeedbackReport +tests_login_ChromeProfileSanitary +tests_login_CryptohomeDataLeak +tests_login_CryptohomeIncognito +tests_login_GaiaLogin +tests_login_LoginSuccess +tests_login_OobeLocalization +tests_login_SavePassword +tests_login_UnicornLogin +tests_longevity_Tracker +tests_network_CastTDLS +tests_network_ChromeWifiConfigure +tests_platform_ChromeCgroups +tests_platform_InitLoginPerf +tests_platform_InputBrightness +tests_platform_InputBrowserNav +tests_platform_InputNewTab +tests_platform_InputScreenshot +tests_platform_InputVolume +tests_platform_LogoutPerf +tests_platform_LowMemoryTest +tests_platform_MouseScrollTest +tests_platform_PrintJob +tests_platform_SessionManagerBlockDevmodeSetting +tests_platform_ScrollTest +tests_policy_AccessibilityTest +tests_policy_AlternateErrorPages +tests_policy_ArcAudioCaptureAllowed +tests_policy_ArcBackupRestoreServiceEnabled +tests_policy_ArcExternalStorageDisabled +tests_policy_ArcVideoCaptureAllowed +tests_policy_ArcDisableScreenshots +tests_policy_AudioOutputAllowed +tests_policy_AutotestSanity +tests_policy_BookmarkBarEnabled +tests_policy_ChromeOsLockOnIdleSuspend +tests_policy_CookiesAllowedForUrls +tests_policy_CookiesBlockedForUrls +tests_policy_CookiesSessionOnlyForUrls +tests_policy_DefaultGeolocationSetting +tests_policy_DefaultImagesSetting +tests_policy_DefaultJavaScriptSetting +tests_policy_DefaultNotificationsSetting +tests_policy_DefaultSearchProvider +tests_policy_DeveloperToolsAvailability +tests_policy_DeviceAllowBluetooth +tests_policy_DeviceAutoUpdateDisabled +tests_policy_DeviceCharging +tests_policy_DeviceDockMacAddressSource +tests_policy_DeviceScheduledCharging +tests_policy_DeviceTargetVersionPrefix +tests_policy_DeviceWilcoDtcAllowed +tests_policy_DisableScreenshots +tests_policy_DownloadDirectory +tests_policy_DriveDisabled +tests_policy_EditBookmarksEnabled +tests_policy_DeviceEphemeralUsersEnabled +tests_policy_EnrollmentRetainment +tests_policy_EnterpriseForceInstallCustom +tests_policy_ExtensionAllowedTypes +tests_policy_ExtensionControls +tests_policy_ExtensionPolicy +tests_policy_ExternalStorageDisabled +tests_policy_ExternalStorageReadOnly +tests_policy_ForceGoogleSafeSearch +tests_policy_ForceYouTubeRestrict +tests_policy_ForceYouTubeSafetyMode +tests_policy_HomepageLocation +tests_policy_ImagesAllowedForUrls +tests_policy_ImagesBlockedForUrls +tests_policy_JavaScriptAllowedForUrls +tests_policy_JavaScriptBlockedForUrls +tests_policy_KeyboardDefaultToFunctionKeys +tests_policy_KeyPermissions +tests_policy_KioskModeEnabled +tests_policy_ManagedBookmarks +tests_policy_NativePrintersBulkAccessMode +tests_policy_NewTabPageLocation +tests_policy_NotificationsAllowedForUrls +tests_policy_NotificationsBlockedForUrls +tests_policy_PinnedLauncherApps +tests_policy_PlatformKeys +tests_policy_PluginsAllowedForUrls +tests_policy_PluginsBlockedForUrls +tests_policy_PolicyRefreshRate +tests_policy_PopupsAllowedForUrls +tests_policy_PopupsBlockedForUrls +tests_policy_PowerManagementIdleSettings +tests_policy_PrintingEnabled +tests_policy_PromptForDownloadLocation +tests_policy_ProxySettings +tests_policy_ReportUploadFrequency +tests_policy_RestoreOnStartupURLs +tests_policy_SafeBrowsingEnabled +tests_policy_SavingBrowserHistoryDisabled +tests_policy_ScreenBrightnessPercent +tests_policy_SearchSuggestEnabled +tests_policy_SecondaryGoogleAccountSigninAllowed +tests_policy_ShowLogoutButtonInTray +tests_policy_ShowHomeButton +tests_policy_SystemTimezone +tests_policy_TranslateEnabled +tests_policy_UserNativePrintersAllowed +tests_policy_VirtualMachinesAllowed +tests_policy_WilcoOnNonWilcoDevice +tests_policy_WilcoUSBPowershare +tests_power_AudioDetector +tests_power_BatteryDrain +tests_power_Consumption +tests_power_Display +tests_power_FlashVideoSuspend +tests_power_Idle +tests_power_IdleSuspend +tests_power_LoadTest +tests_power_LowMemorySuspend +tests_power_MeetClient +tests_power_Speedometer2 +tests_power_ThermalLoad +tests_power_UiResume +tests_power_VideoCall +tests_power_VideoDetector +tests_power_VideoEncode +tests_power_VideoPlayback +tests_power_VideoSuspend +tests_power_WebGL +tests_power_WifiIdle +tests_security_BundledExtensions +tests_telemetry_AFDOGenerateClient +tests_telemetry_Sanity +tests_telemetry_UnitTests +tests_telemetry_UnitTestsServer +tests_touch_GestureNav +tests_touch_MouseScroll +tests_touch_ScrollDirection +tests_touch_TapSettings +tests_touch_TabSwitch +tests_touch_TouchscreenScroll +tests_touch_TouchscreenTaps +tests_touch_TouchscreenZoom +tests_touch_StylusTaps +tests_video_AVAnalysis cellular? ( +tests_cellular_ModemControl +tests_cellular_SuspendResume +tests_network_ChromeCellularEndToEnd +tests_network_ChromeCellularNetworkPresent +tests_network_ChromeCellularNetworkProperties +tests_network_ChromeCellularSmokeTest ) shill? ( +tests_network_ChromeWifiEndToEnd +tests_network_FirewallHolePunch +tests_network_RackWiFiConnect +tests_network_RoamSuspendEndToEnd +tests_network_RoamWifiEndToEnd +tests_policy_GlobalNetworkSettings +tests_policy_WiFiAutoconnect +tests_policy_WiFiPrecedence +tests_policy_WiFiTypes ) tpm? ( +tests_platform_Pkcs11InitOnLogin ) tpm2? ( +tests_platform_Pkcs11InitOnLogin ) +tests_graphics_Idle cros_host cros_workon_tree_9aa69630d79bff05bb1bd54c233962cd4ad62ed6 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!chromeos-base/autotest-telemetry !<chromeos-base/autotest-tests-0.0.4 !<chromeos-base/autotest-tests-cellular-0.0.1-r3203 chromeos-base/autotest-deps-graphics chromeos-base/autotest-deps-policy chromeos-base/autotest-deps-webgl-mpd chromeos-base/chromeos-chrome dev-python/mkvparse shill? ( chromeos-base/shill-test-scripts ) chromeos-base/telemetry sys-apps/ethtool vaapi? ( x11-libs/libva ) tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked ) virtual/autotest-private-libs autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b539c6cbc375383efa92a7f15c54dee2
diff --git a/metadata/md5-cache/chromeos-base/autotest-chrome-9999 b/metadata/md5-cache/chromeos-base/autotest-chrome-9999
index 3a007fa..9b8b1eb 100644
--- a/metadata/md5-cache/chromeos-base/autotest-chrome-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-chrome-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=Autotest tests that require chrome_binary_test, or telemetry deps
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +cellular +shill +tpm tpm2 vaapi +tests_accessibility_Sanity +tests_accessibility_ChromeVoxSound +tests_audio_ActiveStreamStress +tests_audio_AudioCorruption +tests_audio_CrasSanity +tests_audio_PlaybackPower +tests_audio_SeekAudioFeedback +tests_autoupdate_CrashBrowserAfterUpdate +tests_autoupdate_EOL +tests_autoupdate_LoginStartUpdateLogout +tests_autoupdate_StartOOBEUpdate +tests_autoupdate_UpdateFromUI +tests_autoupdate_UserData +tests_bluetooth_AdapterReboot +tests_bluetooth_AdapterSanity +tests_bluetooth_IDCheck +tests_bluetooth_RegressionClient +tests_bluetooth_TurnOnOffUI +tests_desktopui_AudioFeedback +tests_desktopui_CheckRlzPingSent +tests_desktopui_ChromeSanity tests_desktopui_ConnectivityDiagnostics +tests_desktopui_FlashSanityCheck +tests_desktopui_MediaAudioFeedback +tests_desktopui_ScreenLocker +tests_desktopui_SimpleLogin +tests_desktopui_UrlFetchWithChromeDriver +tests_display_ClientChameleonConnection +tests_display_DisplayContainEdid +tests_dummy_IdleSuspend +tests_enterprise_FakeEnrollment +tests_enterprise_KioskEnrollment +tests_enterprise_OnlineDemoModeEnrollment +tests_enterprise_PowerManagement +tests_enterprise_RemoraRequisition +tests_graphics_Chrome +tests_graphics_HwOverlays +tests_graphics_Stress +tests_graphics_VideoRenderingPower +tests_graphics_VTSwitch +tests_graphics_WebGLAquarium +tests_graphics_WebGLManyPlanetsDeep tests_logging_AsanCrash +tests_logging_CrashServices +tests_logging_FeedbackReport +tests_login_ChromeProfileSanitary +tests_login_CryptohomeDataLeak +tests_login_CryptohomeIncognito +tests_login_GaiaLogin +tests_login_LoginSuccess +tests_login_OobeLocalization +tests_login_SavePassword +tests_login_UnicornLogin +tests_longevity_Tracker +tests_network_CastTDLS +tests_network_ChromeWifiConfigure +tests_platform_ChromeCgroups +tests_platform_InitLoginPerf +tests_platform_InputBrightness +tests_platform_InputBrowserNav +tests_platform_InputNewTab +tests_platform_InputScreenshot +tests_platform_InputVolume +tests_platform_LogoutPerf +tests_platform_LowMemoryTest +tests_platform_MouseScrollTest +tests_platform_PrintJob +tests_platform_SessionManagerBlockDevmodeSetting +tests_platform_ScrollTest +tests_policy_AccessibilityTest +tests_policy_AllowDeletingBrowserHistory +tests_policy_AllowScreenLock +tests_policy_AlternateErrorPages +tests_policy_ArcAudioCaptureAllowed +tests_policy_ArcBackupRestoreServiceEnabled +tests_policy_ArcExternalStorageDisabled +tests_policy_ArcVideoCaptureAllowed +tests_policy_ArcDisableScreenshots +tests_policy_AudioOutputAllowed +tests_policy_AutotestSanity +tests_policy_BookmarkBarEnabled +tests_policy_ChromeOsLockOnIdleSuspend +tests_policy_CookiesAllowedForUrls +tests_policy_CookiesBlockedForUrls +tests_policy_CookiesSessionOnlyForUrls +tests_policy_DefaultGeolocationSetting +tests_policy_DefaultImagesSetting +tests_policy_DefaultJavaScriptSetting +tests_policy_DefaultNotificationsSetting +tests_policy_DefaultSearchProvider +tests_policy_DeveloperToolsAvailability +tests_policy_DeviceAllowBluetooth +tests_policy_DeviceAutoUpdateDisabled +tests_policy_DeviceCharging +tests_policy_DeviceDockMacAddressSource +tests_policy_DeviceScheduledCharging +tests_policy_DeviceTargetVersionPrefix +tests_policy_DeviceWilcoDtcAllowed +tests_policy_DisableScreenshots +tests_policy_DownloadDirectory +tests_policy_DriveDisabled +tests_policy_EditBookmarksEnabled +tests_policy_DeviceEphemeralUsersEnabled +tests_policy_EnrollmentRetainment +tests_policy_EnterpriseForceInstallCustom +tests_policy_ExtensionAllowedTypes +tests_policy_ExtensionControls +tests_policy_ExtensionPolicy +tests_policy_ExternalStorageDisabled +tests_policy_ExternalStorageReadOnly +tests_policy_ForceGoogleSafeSearch +tests_policy_ForceYouTubeRestrict +tests_policy_ForceYouTubeSafetyMode +tests_policy_HomepageLocation +tests_policy_ImagesAllowedForUrls +tests_policy_ImagesBlockedForUrls +tests_policy_JavaScriptAllowedForUrls +tests_policy_JavaScriptBlockedForUrls +tests_policy_KeyboardDefaultToFunctionKeys +tests_policy_KeyPermissions +tests_policy_KioskModeEnabled +tests_policy_ManagedBookmarks +tests_policy_NativePrintersBulkAccessMode +tests_policy_NewTabPageLocation +tests_policy_NotificationsAllowedForUrls +tests_policy_NotificationsBlockedForUrls +tests_policy_PasswordManager +tests_policy_PinnedLauncherApps +tests_policy_PlatformKeys +tests_policy_PluginsAllowedForUrls +tests_policy_PluginsBlockedForUrls +tests_policy_PolicyRefreshRate +tests_policy_PopupsAllowedForUrls +tests_policy_PopupsBlockedForUrls +tests_policy_PowerManagementIdleSettings +tests_policy_PrintingEnabled +tests_policy_PromptForDownloadLocation +tests_policy_ProxySettings +tests_policy_ReportUploadFrequency +tests_policy_RestoreOnStartupURLs +tests_policy_SafeBrowsingEnabled +tests_policy_SavingBrowserHistoryDisabled +tests_policy_ScreenBrightnessPercent +tests_policy_SearchSuggestEnabled +tests_policy_SecondaryGoogleAccountSigninAllowed +tests_policy_ShowLogoutButtonInTray +tests_policy_ShowHomeButton +tests_policy_SystemTimezone +tests_policy_TranslateEnabled +tests_policy_UserNativePrintersAllowed +tests_policy_VirtualMachinesAllowed +tests_policy_WilcoOnNonWilcoDevice +tests_policy_WilcoUSBPowershare +tests_power_AudioDetector +tests_power_BatteryDrain +tests_power_Consumption +tests_power_Display +tests_power_FlashVideoSuspend +tests_power_Idle +tests_power_IdleSuspend +tests_power_LoadTest +tests_power_LowMemorySuspend +tests_power_MeetClient +tests_power_Speedometer2 +tests_power_ThermalLoad +tests_power_UiResume +tests_power_VideoCall +tests_power_VideoDetector +tests_power_VideoPlayback +tests_power_VideoSuspend +tests_power_WebGL +tests_security_BundledExtensions +tests_telemetry_AFDOGenerateClient +tests_telemetry_Sanity +tests_telemetry_UnitTests +tests_telemetry_UnitTestsServer +tests_touch_GestureNav +tests_touch_MouseScroll +tests_touch_ScrollDirection +tests_touch_TapSettings +tests_touch_TabSwitch +tests_touch_TouchscreenScroll +tests_touch_TouchscreenTaps +tests_touch_TouchscreenZoom +tests_touch_StylusTaps +tests_video_AVAnalysis cellular? ( +tests_cellular_ModemControl +tests_cellular_SuspendResume +tests_network_ChromeCellularEndToEnd +tests_network_ChromeCellularNetworkPresent +tests_network_ChromeCellularNetworkProperties +tests_network_ChromeCellularSmokeTest ) shill? ( +tests_network_ChromeWifiEndToEnd +tests_network_FirewallHolePunch +tests_network_RackWiFiConnect +tests_network_RoamSuspendEndToEnd +tests_network_RoamWifiEndToEnd +tests_policy_GlobalNetworkSettings +tests_policy_WiFiAutoconnect +tests_policy_WiFiPrecedence +tests_policy_WiFiTypes ) tpm? ( +tests_platform_Pkcs11InitOnLogin ) tpm2? ( +tests_platform_Pkcs11InitOnLogin ) +tests_graphics_Idle cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest +cellular +shill +tpm tpm2 vaapi +tests_accessibility_Sanity +tests_accessibility_ChromeVoxSound +tests_audio_ActiveStreamStress +tests_audio_AudioCorruption +tests_audio_CrasSanity +tests_audio_PlaybackPower +tests_audio_SeekAudioFeedback +tests_autoupdate_EOL +tests_autoupdate_LoginStartUpdateLogout +tests_autoupdate_StartOOBEUpdate +tests_autoupdate_UpdateFromUI +tests_autoupdate_UserData +tests_bluetooth_AdapterReboot +tests_bluetooth_AdapterSanity +tests_bluetooth_IDCheck +tests_bluetooth_RegressionClient +tests_bluetooth_TurnOnOffUI +tests_desktopui_AudioFeedback +tests_desktopui_CheckRlzPingSent +tests_desktopui_ChromeSanity tests_desktopui_ConnectivityDiagnostics +tests_desktopui_MediaAudioFeedback +tests_desktopui_ScreenLocker +tests_desktopui_SimpleLogin +tests_desktopui_UrlFetchWithChromeDriver +tests_display_ClientChameleonConnection +tests_display_DisplayContainEdid +tests_dummy_IdleSuspend +tests_enterprise_FakeEnrollment +tests_enterprise_KioskEnrollment +tests_enterprise_OnlineDemoModeEnrollment +tests_enterprise_PowerManagement +tests_enterprise_RemoraRequisition +tests_graphics_Chrome +tests_graphics_HwOverlays +tests_graphics_Stress +tests_graphics_VideoRenderingPower +tests_graphics_VTSwitch +tests_graphics_WebGLAquarium +tests_graphics_WebGLManyPlanetsDeep tests_logging_AsanCrash +tests_logging_CrashServices +tests_logging_FeedbackReport +tests_login_ChromeProfileSanitary +tests_login_CryptohomeDataLeak +tests_login_CryptohomeIncognito +tests_login_GaiaLogin +tests_login_LoginSuccess +tests_login_OobeLocalization +tests_login_SavePassword +tests_login_UnicornLogin +tests_longevity_Tracker +tests_network_CastTDLS +tests_network_ChromeWifiConfigure +tests_platform_ChromeCgroups +tests_platform_InitLoginPerf +tests_platform_InputBrightness +tests_platform_InputBrowserNav +tests_platform_InputNewTab +tests_platform_InputScreenshot +tests_platform_InputVolume +tests_platform_LogoutPerf +tests_platform_LowMemoryTest +tests_platform_MouseScrollTest +tests_platform_PrintJob +tests_platform_SessionManagerBlockDevmodeSetting +tests_platform_ScrollTest +tests_policy_AccessibilityTest +tests_policy_AlternateErrorPages +tests_policy_ArcAudioCaptureAllowed +tests_policy_ArcBackupRestoreServiceEnabled +tests_policy_ArcExternalStorageDisabled +tests_policy_ArcVideoCaptureAllowed +tests_policy_ArcDisableScreenshots +tests_policy_AudioOutputAllowed +tests_policy_AutotestSanity +tests_policy_BookmarkBarEnabled +tests_policy_ChromeOsLockOnIdleSuspend +tests_policy_CookiesAllowedForUrls +tests_policy_CookiesBlockedForUrls +tests_policy_CookiesSessionOnlyForUrls +tests_policy_DefaultGeolocationSetting +tests_policy_DefaultImagesSetting +tests_policy_DefaultJavaScriptSetting +tests_policy_DefaultNotificationsSetting +tests_policy_DefaultSearchProvider +tests_policy_DeveloperToolsAvailability +tests_policy_DeviceAllowBluetooth +tests_policy_DeviceAutoUpdateDisabled +tests_policy_DeviceCharging +tests_policy_DeviceDockMacAddressSource +tests_policy_DeviceScheduledCharging +tests_policy_DeviceTargetVersionPrefix +tests_policy_DeviceWilcoDtcAllowed +tests_policy_DisableScreenshots +tests_policy_DownloadDirectory +tests_policy_DriveDisabled +tests_policy_EditBookmarksEnabled +tests_policy_DeviceEphemeralUsersEnabled +tests_policy_EnrollmentRetainment +tests_policy_EnterpriseForceInstallCustom +tests_policy_ExtensionAllowedTypes +tests_policy_ExtensionControls +tests_policy_ExtensionPolicy +tests_policy_ExternalStorageDisabled +tests_policy_ExternalStorageReadOnly +tests_policy_ForceGoogleSafeSearch +tests_policy_ForceYouTubeRestrict +tests_policy_ForceYouTubeSafetyMode +tests_policy_HomepageLocation +tests_policy_ImagesAllowedForUrls +tests_policy_ImagesBlockedForUrls +tests_policy_JavaScriptAllowedForUrls +tests_policy_JavaScriptBlockedForUrls +tests_policy_KeyboardDefaultToFunctionKeys +tests_policy_KeyPermissions +tests_policy_KioskModeEnabled +tests_policy_ManagedBookmarks +tests_policy_NativePrintersBulkAccessMode +tests_policy_NewTabPageLocation +tests_policy_NotificationsAllowedForUrls +tests_policy_NotificationsBlockedForUrls +tests_policy_PinnedLauncherApps +tests_policy_PlatformKeys +tests_policy_PluginsAllowedForUrls +tests_policy_PluginsBlockedForUrls +tests_policy_PolicyRefreshRate +tests_policy_PopupsAllowedForUrls +tests_policy_PopupsBlockedForUrls +tests_policy_PowerManagementIdleSettings +tests_policy_PrintingEnabled +tests_policy_PromptForDownloadLocation +tests_policy_ProxySettings +tests_policy_ReportUploadFrequency +tests_policy_RestoreOnStartupURLs +tests_policy_SafeBrowsingEnabled +tests_policy_SavingBrowserHistoryDisabled +tests_policy_ScreenBrightnessPercent +tests_policy_SearchSuggestEnabled +tests_policy_SecondaryGoogleAccountSigninAllowed +tests_policy_ShowLogoutButtonInTray +tests_policy_ShowHomeButton +tests_policy_SystemTimezone +tests_policy_TranslateEnabled +tests_policy_UserNativePrintersAllowed +tests_policy_VirtualMachinesAllowed +tests_policy_WilcoOnNonWilcoDevice +tests_policy_WilcoUSBPowershare +tests_power_AudioDetector +tests_power_BatteryDrain +tests_power_Consumption +tests_power_Display +tests_power_FlashVideoSuspend +tests_power_Idle +tests_power_IdleSuspend +tests_power_LoadTest +tests_power_LowMemorySuspend +tests_power_MeetClient +tests_power_Speedometer2 +tests_power_ThermalLoad +tests_power_UiResume +tests_power_VideoCall +tests_power_VideoDetector +tests_power_VideoEncode +tests_power_VideoPlayback +tests_power_VideoSuspend +tests_power_WebGL +tests_power_WifiIdle +tests_security_BundledExtensions +tests_telemetry_AFDOGenerateClient +tests_telemetry_Sanity +tests_telemetry_UnitTests +tests_telemetry_UnitTestsServer +tests_touch_GestureNav +tests_touch_MouseScroll +tests_touch_ScrollDirection +tests_touch_TapSettings +tests_touch_TabSwitch +tests_touch_TouchscreenScroll +tests_touch_TouchscreenTaps +tests_touch_TouchscreenZoom +tests_touch_StylusTaps +tests_video_AVAnalysis cellular? ( +tests_cellular_ModemControl +tests_cellular_SuspendResume +tests_network_ChromeCellularEndToEnd +tests_network_ChromeCellularNetworkPresent +tests_network_ChromeCellularNetworkProperties +tests_network_ChromeCellularSmokeTest ) shill? ( +tests_network_ChromeWifiEndToEnd +tests_network_FirewallHolePunch +tests_network_RackWiFiConnect +tests_network_RoamSuspendEndToEnd +tests_network_RoamWifiEndToEnd +tests_policy_GlobalNetworkSettings +tests_policy_WiFiAutoconnect +tests_policy_WiFiPrecedence +tests_policy_WiFiTypes ) tpm? ( +tests_platform_Pkcs11InitOnLogin ) tpm2? ( +tests_platform_Pkcs11InitOnLogin ) +tests_graphics_Idle cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=!chromeos-base/autotest-telemetry !<chromeos-base/autotest-tests-0.0.4 !<chromeos-base/autotest-tests-cellular-0.0.1-r3203 chromeos-base/autotest-deps-graphics chromeos-base/autotest-deps-policy chromeos-base/autotest-deps-webgl-mpd chromeos-base/chromeos-chrome dev-python/mkvparse shill? ( chromeos-base/shill-test-scripts ) chromeos-base/telemetry sys-apps/ethtool vaapi? ( x11-libs/libva ) tests_graphics_WebGLAquarium? ( app-benchmarks/microbenchmarks dev-util/memory-eater-locked ) virtual/autotest-private-libs autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=025148558a6d95352fadcffeffc4edc3
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=35ffe2f3d2096f0532fc26d10688df6a
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12361 b/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12361
deleted file mode 100644
index 9bb622c..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12361
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 sys-devel/binutils
-DESCRIPTION=Autotest common deps
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 sys-devel/binutils autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=34ce33ebb8f65302721b38570cfe52e5
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12924 b/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12924
new file mode 100644
index 0000000..1a3689f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-0.0.4-r12924
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 >=dev-python/psutil-5.5.0 sys-devel/binutils
+DESCRIPTION=Autotest common deps
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 >=dev-python/psutil-5.5.0 sys-devel/binutils autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f02866a01df785d919894ddde3ac2824
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-9999
index 3e2c3b5..e1b8c31 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 sys-devel/binutils
+DEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 >=dev-python/psutil-5.5.0 sys-devel/binutils
 DESCRIPTION=Autotest common deps
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
-RDEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 sys-devel/binutils autotest? ( chromeos-base/autotest )
+RDEPEND=dev-cpp/gtest:= dev-libs/libnl:0 >=dev-python/grpcio-1.19 >=dev-python/psutil-5.5.0 sys-devel/binutils autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=32dc3cd6ab9c78f9d87606d66b59a2de
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bf03bb6aeb8f585f5f56b359711339fd
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4382 b/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4382
deleted file mode 100644
index 2f380a7..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4382
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=media-libs/cros-camera-test
-DESCRIPTION=Dependencies for camera_HAL3 autotest
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=media-libs/cros-camera-test autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=419cb2f98d29f4fb051edb932fae53c6
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4945 b/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4945
new file mode 100644
index 0000000..d49f900
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-0.0.1-r4945
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=media-libs/cros-camera-test
+DESCRIPTION=Dependencies for camera_HAL3 autotest
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=media-libs/cros-camera-test autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=179fad463a1401f15b23ca2fdf13e557
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-9999
index 049c786..268e142 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-camera-hal3-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=media-libs/cros-camera-test autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c0ce99eda3080dbb61e8b861296db421
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7171 b/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7171
deleted file mode 100644
index 17826e2..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7171
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-deps-0.0.3 virtual/libgudev chromeos-base/autotest-fakemodem-conf dev-libs/dbus-glib
-DESCRIPTION=Autotest cellular deps
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-deps-0.0.3 virtual/libgudev chromeos-base/autotest-fakemodem-conf dev-libs/dbus-glib autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2bc313bc8ff29ae4eeabcbde8ec7a5d8
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7734 b/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7734
new file mode 100644
index 0000000..7353354
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-cellular-0.0.1-r7734
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-deps-0.0.3 virtual/libgudev chromeos-base/autotest-fakemodem-conf dev-libs/dbus-glib
+DESCRIPTION=Autotest cellular deps
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-deps-0.0.3 virtual/libgudev chromeos-base/autotest-fakemodem-conf dev-libs/dbus-glib autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7c908f8f2af1a0fefff03a727f6731a8
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-cellular-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-cellular-9999
index 6042cd8..39707ee 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-cellular-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-cellular-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-deps-0.0.3 virtual/libgudev chromeos-base/autotest-fakemodem-conf dev-libs/dbus-glib autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=986106e8edf172edd0aaa5dd28adbf99
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3055 b/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3055
deleted file mode 100644
index c1a3a4c..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3055
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=chromeos-base/system_api dev-libs/protobuf:=
-DESCRIPTION=Autotest D-Bus deps
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e9bc4584a07dcc5e1e75c0a81bfb91af
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3618 b/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3618
new file mode 100644
index 0000000..63b2142
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-dbus-0.0.1-r3618
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=chromeos-base/system_api dev-libs/protobuf:=
+DESCRIPTION=Autotest D-Bus deps
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f59be2298a953e0b1052ecc4558bae69
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-dbus-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-dbus-9999
index 95bcbf0..5fcf7d0 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-dbus-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-dbus-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2eee34ef0be6245d6af2a9170e07b3db
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r7542 b/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r7542
deleted file mode 100644
index f03f12b..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r7542
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare setup unpack
-DEPEND=app-benchmarks/glmark2
-DESCRIPTION=Autotest glmark2 dependency
-EAPI=7
-HOMEPAGE=https://launchpad.net/glmark2
-IUSE=-asan +autotest asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-3
-PROPERTIES=live
-RDEPEND=app-benchmarks/glmark2 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=818e989aedfa4d82f99f75d2abcfc7d9
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r8105 b/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r8105
new file mode 100644
index 0000000..6b16401
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-0.0.1-r8105
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare setup unpack
+DEPEND=app-benchmarks/glmark2
+DESCRIPTION=Autotest glmark2 dependency
+EAPI=7
+HOMEPAGE=https://launchpad.net/glmark2
+IUSE=-asan +autotest asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-3
+PROPERTIES=live
+RDEPEND=app-benchmarks/glmark2 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c61e152ce19e25426be619f67d899d63
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-9999
index e913d23..d0fc81a 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-glmark2-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-benchmarks/glmark2 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f136c14950040415964dab3b823bfc94
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r7522 b/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r7522
deleted file mode 100644
index 5648bcb..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r7522
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-deps-0.0.4
-DESCRIPTION=Dependencies for graphics autotests
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-deps-0.0.4 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=351c56be29b252da6aee111e739de72e
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r8085 b/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r8085
new file mode 100644
index 0000000..37fe168
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-graphics-0.0.1-r8085
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-deps-0.0.4
+DESCRIPTION=Dependencies for graphics autotests
+EAPI=4
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-deps-0.0.4 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4bc22677bb9ab7388fae3446538060eb
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-graphics-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-graphics-9999
index b439c97..6046068 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-graphics-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-graphics-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-deps-0.0.4 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c8b3de1f5d19d829d7736317b66d0573
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-ltp-0.20150119-r24 b/metadata/md5-cache/chromeos-base/autotest-deps-ltp-0.20150119-r24
index 355e13d..94b333e 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-ltp-0.20150119-r24
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-ltp-0.20150119-r24
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/0.20150119-r24
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8124a929ed8490da4851a597f2390d9a
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-ltp-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-ltp-9999
index 8c80f8c..1246ff6 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-ltp-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-ltp-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9ff7249b45298d2d65d1e56480101591
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7134 b/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7134
deleted file mode 100644
index 985db61..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7134
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-deps-0.0.4 dev-python/dpkt
-DESCRIPTION=Autotest p2p deps
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-deps-0.0.4 dev-python/dpkt autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a6ff2e70ff79c62e99ef1d1c099c5857
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7697 b/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7697
new file mode 100644
index 0000000..609ee9b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-p2p-0.0.1-r7697
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-deps-0.0.4 dev-python/dpkt
+DESCRIPTION=Autotest p2p deps
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-deps-0.0.4 dev-python/dpkt autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=abe9dd96d0a8314617480dbbf2e084ad
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-p2p-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-p2p-9999
index ebf4eb0..88a73e6 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-p2p-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-p2p-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-deps-0.0.4 dev-python/dpkt autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=615bf3cb9774363f9d043c5ef73d6e09
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r11785 b/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r11785
deleted file mode 100644
index 00d894b..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r11785
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare setup unpack
-DEPEND=opengl? ( virtual/glut ) opengl? ( virtual/opengl ) dev-python/mako dev-python/numpy media-libs/tiff media-libs/libpng sys-libs/zlib x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXtst x11-libs/libXau x11-libs/libXdmcp x11-libs/libXext x11-libs/libXi x11-libs/libXpm x11-libs/libXrender opengl? ( x11-proto/glproto )
-DESCRIPTION=dependencies for Piglit (collection of automated tests for OpenGl based on glean and mesa)
-EAPI=7
-HOMEPAGE=http://cgit.freedesktop.org/piglit
-IUSE=+autotest opengl cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2 LGPL-3
-PROPERTIES=live
-RDEPEND=opengl? ( virtual/glut ) opengl? ( virtual/opengl ) dev-python/mako dev-python/numpy media-libs/tiff media-libs/libpng sys-libs/zlib x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXtst x11-libs/libXau x11-libs/libXdmcp x11-libs/libXext x11-libs/libXi x11-libs/libXpm x11-libs/libXrender opengl? ( x11-proto/glproto ) autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=449d26642ef82033c2f2225770fac600
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r12348 b/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r12348
new file mode 100644
index 0000000..d8d3d94
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-piglit-0.0.1-r12348
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare setup unpack
+DEPEND=opengl? ( virtual/glut ) opengl? ( virtual/opengl ) dev-python/mako dev-python/numpy media-libs/tiff media-libs/libpng sys-libs/zlib x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXtst x11-libs/libXau x11-libs/libXdmcp x11-libs/libXext x11-libs/libXi x11-libs/libXpm x11-libs/libXrender opengl? ( x11-proto/glproto )
+DESCRIPTION=dependencies for Piglit (collection of automated tests for OpenGl based on glean and mesa)
+EAPI=7
+HOMEPAGE=http://cgit.freedesktop.org/piglit
+IUSE=+autotest opengl cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2 LGPL-3
+PROPERTIES=live
+RDEPEND=opengl? ( virtual/glut ) opengl? ( virtual/opengl ) dev-python/mako dev-python/numpy media-libs/tiff media-libs/libpng sys-libs/zlib x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXtst x11-libs/libXau x11-libs/libXdmcp x11-libs/libXext x11-libs/libXi x11-libs/libXpm x11-libs/libXrender opengl? ( x11-proto/glproto ) autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1a57b8528bd280a3d5e71f2d3ce8fba0
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-piglit-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-piglit-9999
index 41a68a0..fa89557 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-piglit-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-piglit-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=opengl? ( virtual/glut ) opengl? ( virtual/opengl ) dev-python/mako dev-python/numpy media-libs/tiff media-libs/libpng sys-libs/zlib x11-libs/libICE x11-libs/libSM x11-libs/libX11 x11-libs/libXtst x11-libs/libXau x11-libs/libXdmcp x11-libs/libXext x11-libs/libXi x11-libs/libXpm x11-libs/libXrender opengl? ( x11-proto/glproto ) autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f35b8431c314f549f18d7eff755360ea
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3131 b/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3131
deleted file mode 100644
index 7d35f3a..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3131
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=>=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api dev-libs/protobuf:=
-DESCRIPTION=Autotest policy deps
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=78cd887b19c94c5771cf83974b84ba88
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3694 b/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3694
new file mode 100644
index 0000000..b34cd1a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-policy-0.0.1-r3694
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=>=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api dev-libs/protobuf:=
+DESCRIPTION=Autotest policy deps
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=eef68e63ca6017a6f3fb586bb39ceefb
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-policy-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-policy-9999
index 15ad3a8..7ace46a 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-policy-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-policy-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c459cf27414f230a2127cebd625430ef
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8144 b/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8144
deleted file mode 100644
index 34a6337..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8144
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=x11-drivers/touchpad-tests chromeos-base/touch_firmware_test chromeos-base/mttools
-DESCRIPTION=Autotest touchpad deps
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=x11-drivers/touchpad-tests chromeos-base/touch_firmware_test chromeos-base/mttools autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=885936f6094cb3ce91a5f87e90aa5c6c
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8707 b/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8707
new file mode 100644
index 0000000..1e6b8c7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-0.0.1-r8707
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=x11-drivers/touchpad-tests chromeos-base/touch_firmware_test chromeos-base/mttools
+DESCRIPTION=Autotest touchpad deps
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=x11-drivers/touchpad-tests chromeos-base/touch_firmware_test chromeos-base/mttools autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2a592884a402dea5be7ead31845e997a
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-9999
index 593bc93..8e93df6 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-touchpad-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=x11-drivers/touchpad-tests chromeos-base/touch_firmware_test chromeos-base/mttools autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7fda568cba3006fad358c53d7b74c7ca
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r7694 b/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r7694
deleted file mode 100644
index 5480725..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r7694
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=Dependencies for WebGL many planets deep test
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0/0.0.1-r7694
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e1518eb8434555f1d185d83241118aea
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r8257 b/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r8257
new file mode 100644
index 0000000..aff420d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-0.0.1-r8257
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=Dependencies for WebGL many planets deep test
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0/0.0.1-r8257
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=23a54db1efa5dd4ec0a6de22c5a05d71
diff --git a/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-9999 b/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-9999
index 81d15c3..d969f15 100644
--- a/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-deps-webgl-mpd-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0/9999
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=10490e31cb9601468333ec4e9504a386
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4614 b/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4614
deleted file mode 100644
index faa994b..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4614
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-0.0.2
-DESCRIPTION=Autotest server tests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=android-container android-container-pi +autotest biod +cellular -chromeless_tests -chromeless_tty cros_p2p debugd has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2 +tests_android_ACTS +tests_android_EasySetup +tests_audio_AudioAfterReboot +tests_audio_AudioAfterSuspend +tests_audio_AudioArtifacts +tests_audio_AudioARCPlayback +tests_audio_AudioARCRecord +tests_audio_AudioBasicAssistant +tests_audio_AudioBasicBluetoothPlayback +tests_audio_AudioBasicBluetoothPlaybackRecord +tests_audio_AudioBasicBluetoothRecord +tests_audio_AudioBasicExternalMicrophone +tests_audio_AudioBasicHDMI +tests_audio_AudioBasicHeadphone +tests_audio_AudioBasicHotwording +tests_audio_AudioBasicInternalMicrophone +tests_audio_AudioBasicInternalSpeaker +tests_audio_AudioBasicUSBPlayback +tests_audio_AudioBasicUSBPlaybackRecord +tests_audio_AudioBasicUSBRecord +tests_audio_AudioBluetoothConnectionStability +tests_audio_AudioNodeSwitch +tests_audio_AudioPinnedStream +tests_audio_AudioQualityAfterSuspend +tests_audio_AudioSanityCheck +tests_audio_AudioVolume +tests_audio_AudioWebRTCLoopback +tests_audio_InternalCardNodes +tests_audio_LeftRightInternalSpeaker +tests_audio_MediaBasicVerification +tests_audio_PowerConsumption +tests_audiovideo_AVSync +tests_autotest_SyncCount +tests_autoupdate_CatchBadSignatures +tests_autoupdate_Cellular +tests_autoupdate_DataPreserved +tests_autoupdate_ForcedOOBEUpdate +tests_autoupdate_FromUI +tests_autoupdate_Interruptions +tests_autoupdate_NonBlockingOOBEUpdate +tests_autoupdate_OmahaResponse +tests_autoupdate_P2P +tests_autoupdate_Rollback has-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) is-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) +tests_brillo_gTests cellular? ( +tests_cellular_StaleModemReboot ) android-container-pi? ( +tests_cheets_CTS_Instant +tests_cheets_CTS_P +tests_cheets_GTS +tests_cheets_VTS ) +tests_component_UpdateFlash debugd? ( +tests_debugd_DevTools ) +tests_crosperf_Wrapper +tests_display_EdidStress +tests_display_HDCPScreen +tests_display_HotPlugAtBoot +tests_display_HotPlugAtSuspend +tests_display_HotPlugNoisy +tests_display_LidCloseOpen +tests_display_NoEdid +tests_display_Resolution +tests_display_ResolutionList +tests_display_ServerChameleonConnection +tests_display_SuspendStress +tests_display_SwitchMode +tests_dummy_PassServer +tests_dummy_FailServer +tests_dummy_FlakyTestServer +tests_dummy_SynchronousOffloadServer +tests_enterprise_ClearTPM +tests_enterprise_KioskEnrollmentServer +tests_enterprise_LongevityTrackerServer +tests_enterprise_OnlineDemoMode +tests_factory_Basic +tests_firmware_Bmpblk +tests_firmware_CgptStress +tests_firmware_ClearTPMOwnerAndReset +tests_firmware_ConsecutiveBoot +tests_firmware_ConsecutiveBootPowerButton +tests_firmware_ConsecutiveLidSwitch +tests_firmware_CorruptBothFwBodyAB +tests_firmware_CorruptBothFwSigAB +tests_firmware_CorruptBothKernelAB +tests_firmware_CorruptFwBodyA +tests_firmware_CorruptFwBodyB +tests_firmware_CorruptFwSigA +tests_firmware_CorruptFwSigB +tests_firmware_CorruptKernelA +tests_firmware_CorruptKernelB +tests_firmware_CorruptRecoveryCache +tests_firmware_Cr50BID +tests_firmware_Cr50CCDServoCap +tests_firmware_Cr50CCDUartStress +tests_firmware_Cr50CheckCap +tests_firmware_Cr50ConsoleCommands +tests_firmware_Cr50DeepSleepStress +tests_firmware_Cr50DeferredECReset +tests_firmware_Cr50DeviceState +tests_firmware_Cr50DevMode +tests_firmware_Cr50ECReset +tests_firmware_Cr50FactoryResetVC +tests_firmware_Cr50CCDFirmwareUpdate +tests_firmware_Cr50GetName +tests_firmware_Cr50InvalidateRW +tests_firmware_Cr50Open +tests_firmware_Cr50OpenWhileAPOff +tests_firmware_Cr50PartialBoardId +tests_firmware_Cr50Password +tests_firmware_Cr50PinWeaverServer +tests_firmware_Cr50RddG3 +tests_firmware_Cr50RejectUpdate +tests_firmware_Cr50RMAOpen +tests_firmware_Cr50SetBoardId +tests_firmware_Cr50ShortECC +tests_firmware_Cr50Testlab +tests_firmware_Cr50TpmManufactured +tests_firmware_Cr50TpmMode +tests_firmware_Cr50U2fCommands +tests_firmware_Cr50Unlock +tests_firmware_Cr50Update +tests_firmware_Cr50UpdateScriptStress +tests_firmware_Cr50USB +tests_firmware_Cr50WilcoEcrst +tests_firmware_Cr50WilcoRmaFactoryMode +tests_firmware_Cr50WPG3 +tests_firmware_DevBootUSB +tests_firmware_DevDefaultBoot +tests_firmware_DevMode +tests_firmware_DevModeStress +tests_firmware_DevScreenTimeout +tests_firmware_ECBattery +tests_firmware_ECBootTime +tests_firmware_ECCbiEeprom +tests_firmware_ECCharging +tests_firmware_ECChargingState +tests_firmware_ECHash +tests_firmware_ECKeyboard +tests_firmware_ECKeyboardReboot +tests_firmware_ECLidShutdown +tests_firmware_ECLidSwitch +tests_firmware_ECPeci +tests_firmware_ECPowerButton +tests_firmware_ECPowerG3 +tests_firmware_ECSharedMem +tests_firmware_ECThermal +tests_firmware_ECUpdateId +tests_firmware_ECUsbPorts +tests_firmware_ECWakeSource +tests_firmware_ECWatchdog +tests_firmware_EventLog +tests_firmware_FAFTPrepare +tests_firmware_FAFTModeTransitions +tests_firmware_FAFTRPC +tests_firmware_FAFTSetup biod? ( +tests_firmware_Fingerprint ) +tests_firmware_FMap +tests_firmware_FWMPDisableCCD +tests_firmware_FwScreenCloseLid +tests_firmware_FwScreenPressPower +tests_firmware_FWupdateWP +tests_firmware_FWtries +tests_firmware_FWupdateThenSleep +tests_firmware_FWupdateWP +tests_firmware_IntegratedU2F +tests_firmware_InvalidUSB +tests_firmware_LegacyRecovery +tests_firmware_MenuModeTransition +tests_firmware_Mosys +tests_firmware_PDConnect +tests_firmware_PDDataSwap +tests_firmware_PDPowerSwap +tests_firmware_PDProtocol +tests_firmware_PDResetHard +tests_firmware_PDResetSoft +tests_firmware_PDTrySrc +tests_firmware_PDVbusRequest +tests_firmware_RecoveryButton +tests_firmware_RecoveryCacheBootKeys +tests_firmware_RollbackFirmware +tests_firmware_RollbackKernel +tests_firmware_SelfSignedBoot +tests_firmware_SetSerialNumber +tests_firmware_SoftwareSync +tests_firmware_StandbyPowerConsumption +tests_firmware_SysfsVPD +tests_firmware_TPMNotCorruptedDevMode tpm? ( +tests_firmware_TPMExtend ) tpm? ( +tests_firmware_TPMVersionCheck ) tpm? ( +tests_firmware_TPMKernelVersion ) tpm2? ( +tests_firmware_TPMExtend ) tpm2? ( +tests_firmware_TPMVersionCheck ) tpm2? ( +tests_firmware_TPMKernelVersion ) +tests_firmware_TryFwB +tests_firmware_TypeCCharging +tests_firmware_TypeCProbeUSB3 +tests_firmware_UpdateFirmwareDataKeyVersion +tests_firmware_UpdateFirmwareVersion +tests_firmware_UpdateKernelDataKeyVersion +tests_firmware_UpdateKernelSubkeyVersion +tests_firmware_UpdateKernelVersion +tests_firmware_UpdaterModes +tests_firmware_UserRequestRecovery +tests_firmware_WilcoDiagnosticsMode +tests_firmware_WriteProtect +tests_firmware_WriteProtectFunc +tests_graphics_PowerConsumption +tests_graphics_MultipleDisplays +tests_hardware_DiskFirmwareUpgrade +tests_hardware_MemoryIntegrity +tests_hardware_StorageQual +tests_hardware_StorageQualBase +tests_hardware_StorageQualCheckSetup +tests_hardware_StorageQualSuspendStress +tests_hardware_StorageQualTrimStress +tests_hardware_StorageStress +tests_kernel_EmptyLines +tests_kernel_ExternalUsbPeripheralsDetectionTest +tests_kernel_IdlePerf +tests_kernel_MemoryRamoop +tests_logging_GenerateCrashFiles moblab? ( +tests_moblab_RunSuite +tests_moblab_StorageQual ) +tests_moblab_Setup cros_p2p? ( +tests_p2p_EndToEndTest ) +tests_network_FirewallHolePunchServer +tests_platform_ActivateDate +tests_platform_BootDevice +tests_platform_BootLockboxServer +tests_platform_BootPerfServer +tests_platform_CompromisedStatefulPartition +tests_platform_CorruptRootfs +tests_platform_CrashStateful +tests_platform_ExternalUsbPeripherals +tests_platform_FlashErasers +tests_platform_Flashrom +tests_platform_HWwatchdog +tests_platform_InitLoginPerfServer +tests_platform_InstallTestImage +tests_platform_InternalDisplay +tests_platform_KernelErrorPaths power_management? ( +tests_platform_PowerStatusStress +tests_power_DeferForFlashrom +tests_power_WakeSources ) +tests_platform_Powerwash +tests_platform_RotationFps +tests_platform_ServoPowerStateController +tests_platform_StageAndRecover +tests_platform_SuspendResumeTiming +tests_platform_SyncCrash readahead? ( +tests_platform_UReadAheadServer ) +tests_platform_Vpd +tests_policy_AUServer +tests_policy_DeviceChargingServer +tests_policy_DeviceServer +tests_policy_ExternalStorageServer +tests_policy_GlobalNetworkSettingsServer +tests_policy_WiFiAutoconnectServer +tests_policy_WiFiPrecedenceServer +tests_policy_WiFiTypesServer +tests_policy_WilcoServerDeviceDockMacAddressSource +tests_policy_WilcoServerOnNonWilcoDevice +tests_policy_WilcoServerUSBPowershare +tests_power_BrightnessResetAfterReboot +tests_power_ChargeControlWrapper +tests_power_MeetCall +tests_power_Monitoring +tests_power_LW +tests_power_PowerlogWrapper +tests_power_RPMTest +tests_power_ServoChargeStress +tests_power_ServodWrapper +tests_provision_AutoUpdate +tests_provision_CheetsUpdate +tests_provision_Cr50TOT +tests_provision_Cr50Update +tests_provision_FactoryImage +tests_provision_FirmwareUpdate +tests_rlz_CheckPing +tests_security_kASLR +tests_sequences +tests_servo_LabControlVerification +tests_servo_LabstationVerification +tests_servo_USBMuxVerification +tests_servo_LogGrab +tests_servo_Verification +tests_servohost_Reboot +tests_stress_ClientTestReboot +tests_stress_EnrollmentRetainment cros_host cros_workon_tree_86709f0035bdb7cbf6ce10941e69ed44014b66d4 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-REQUIRED_USE=?? ( has-kernelnext is-kernelnext )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=736ee762d892fa9267064ab009ee7a2d
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4783 b/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4783
new file mode 100644
index 0000000..6a229a6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-0.0.2-r4783
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-0.0.2
+DESCRIPTION=Autotest server tests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=android-container android-container-pi android-vm-rvc +autotest biod +cellular cheets_user_64 -chromeless_tests -chromeless_tty cros_p2p debugd dlc_test has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2 +tests_android_ACTS +tests_android_EasySetup +tests_audio_AudioAfterReboot +tests_audio_AudioAfterSuspend +tests_audio_AudioArtifacts +tests_audio_AudioARCPlayback +tests_audio_AudioARCRecord +tests_audio_AudioBasicAssistant +tests_audio_AudioBasicBluetoothPlayback +tests_audio_AudioBasicBluetoothPlaybackRecord +tests_audio_AudioBasicBluetoothRecord +tests_audio_AudioBasicExternalMicrophone +tests_audio_AudioBasicHDMI +tests_audio_AudioBasicHeadphone +tests_audio_AudioBasicHotwording +tests_audio_AudioBasicInternalMicrophone +tests_audio_AudioBasicInternalSpeaker +tests_audio_AudioBasicUSBPlayback +tests_audio_AudioBasicUSBPlaybackRecord +tests_audio_AudioBasicUSBRecord +tests_audio_AudioBluetoothConnectionStability +tests_audio_AudioNodeSwitch +tests_audio_AudioPinnedStream +tests_audio_AudioQualityAfterSuspend +tests_audio_AudioSanityCheck +tests_audio_AudioVolume +tests_audio_AudioWebRTCLoopback +tests_audio_InternalCardNodes +tests_audio_LeftRightInternalSpeaker +tests_audio_MediaBasicVerification +tests_audio_PowerConsumption +tests_audiovideo_AVSync +tests_autotest_SyncCount +tests_autoupdate_Basic +tests_autoupdate_CatchBadSignatures +tests_autoupdate_Cellular +tests_autoupdate_DataPreserved +tests_autoupdate_ForcedOOBEUpdate +tests_autoupdate_FromUI +tests_autoupdate_Interruptions +tests_autoupdate_NonBlockingOOBEUpdate +tests_autoupdate_OmahaResponse +tests_autoupdate_P2P +tests_autoupdate_Periodic +tests_autoupdate_Rollback dlc_test? ( +tests_autoupdate_WithDLC ) has-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) is-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) cellular? ( +tests_cellular_StaleModemReboot ) android-container-pi? ( +tests_cheets_CTS_Instant +tests_cheets_CTS_P +tests_cheets_GTS ) android-vm-rvc? ( cheets_user_64? ( +tests_cheets_CTS_R +tests_cheets_GTS_R ) !cheets_user_64? ( +tests_cheets_VTS_R ) ) +tests_cheets_LabDependencies debugd? ( +tests_debugd_DevTools ) +tests_crosperf_Wrapper +tests_display_EdidStress +tests_display_HDCPScreen +tests_display_HotPlugAtBoot +tests_display_HotPlugAtSuspend +tests_display_HotPlugNoisy +tests_display_LidCloseOpen +tests_display_NoEdid +tests_display_Resolution +tests_display_ResolutionList +tests_display_ServerChameleonConnection +tests_display_SuspendStress +tests_display_SwitchMode +tests_dummy_PassServer +tests_dummy_FailServer +tests_dummy_FlakyTestServer +tests_dummy_SynchronousOffloadServer +tests_enterprise_ClearTPM +tests_enterprise_KioskEnrollmentServer +tests_enterprise_LongevityTrackerServer +tests_enterprise_OnlineDemoMode +tests_factory_Basic +tests_firmware_Bmpblk +tests_firmware_CgptStress +tests_firmware_ClearTPMOwnerAndReset +tests_firmware_ConsecutiveBoot +tests_firmware_ConsecutiveBootPowerButton +tests_firmware_ConsecutiveLidSwitch +tests_firmware_CorruptBothFwBodyAB +tests_firmware_CorruptBothFwSigAB +tests_firmware_CorruptBothKernelAB +tests_firmware_CorruptFwBodyA +tests_firmware_CorruptFwBodyB +tests_firmware_CorruptFwSigA +tests_firmware_CorruptFwSigB +tests_firmware_CorruptKernelA +tests_firmware_CorruptKernelB +tests_firmware_CorruptRecoveryCache +tests_firmware_Cr50BID +tests_firmware_Cr50CCDServoCap +tests_firmware_Cr50CCDUartStress +tests_firmware_Cr50CheckCap +tests_firmware_Cr50ConsoleCommands +tests_firmware_Cr50DeepSleepStress +tests_firmware_Cr50DeferredECReset +tests_firmware_Cr50DeviceState +tests_firmware_Cr50DevMode +tests_firmware_Cr50ECReset +tests_firmware_Cr50FactoryResetVC +tests_firmware_Cr50CCDFirmwareUpdate +tests_firmware_Cr50GetName +tests_firmware_Cr50InvalidateRW +tests_firmware_Cr50Open +tests_firmware_Cr50OpenWhileAPOff +tests_firmware_Cr50PartialBoardId +tests_firmware_Cr50Password +tests_firmware_Cr50PinWeaverServer +tests_firmware_Cr50RddG3 +tests_firmware_Cr50RejectUpdate +tests_firmware_Cr50RMAOpen +tests_firmware_Cr50SetBoardId +tests_firmware_Cr50ShortECC +tests_firmware_Cr50Testlab +tests_firmware_Cr50TpmManufactured +tests_firmware_Cr50TpmMode +tests_firmware_Cr50U2fCommands +tests_firmware_Cr50Unlock +tests_firmware_Cr50Update +tests_firmware_Cr50UpdateScriptStress +tests_firmware_Cr50USB +tests_firmware_Cr50WilcoEcrst +tests_firmware_Cr50WilcoRmaFactoryMode +tests_firmware_Cr50WPG3 +tests_firmware_DevBootUSB +tests_firmware_DevDefaultBoot +tests_firmware_DevMode +tests_firmware_DevModeStress +tests_firmware_DevScreenTimeout +tests_firmware_ECBattery +tests_firmware_ECBootTime +tests_firmware_ECCbiEeprom +tests_firmware_ECCharging +tests_firmware_ECChargingState +tests_firmware_ECHash +tests_firmware_ECKeyboard +tests_firmware_ECKeyboardReboot +tests_firmware_ECLidShutdown +tests_firmware_ECLidSwitch +tests_firmware_ECPeci +tests_firmware_ECPowerButton +tests_firmware_ECPowerG3 +tests_firmware_ECSharedMem +tests_firmware_ECThermal +tests_firmware_ECUpdateId +tests_firmware_ECUsbPorts +tests_firmware_ECWakeSource +tests_firmware_ECWatchdog +tests_firmware_EventLog +tests_firmware_FAFTPrepare +tests_firmware_FAFTModeTransitions +tests_firmware_FAFTRPC +tests_firmware_FAFTSetup biod? ( +tests_firmware_Fingerprint +tests_firmware_FingerprintSigner ) +tests_firmware_FMap +tests_firmware_FWMPDisableCCD +tests_firmware_FwScreenCloseLid +tests_firmware_FwScreenPressPower +tests_firmware_FWupdateWP +tests_firmware_FWtries +tests_firmware_FWupdateThenSleep +tests_firmware_FWupdateWP +tests_firmware_IntegratedU2F +tests_firmware_InvalidUSB +tests_firmware_LegacyRecovery +tests_firmware_MenuModeTransition +tests_firmware_Mosys +tests_firmware_PDConnect +tests_firmware_PDDataSwap +tests_firmware_PDPowerSwap +tests_firmware_PDProtocol +tests_firmware_PDResetHard +tests_firmware_PDResetSoft +tests_firmware_PDTrySrc +tests_firmware_PDVbusRequest +tests_firmware_RecoveryButton +tests_firmware_RecoveryCacheBootKeys +tests_firmware_RollbackFirmware +tests_firmware_RollbackKernel +tests_firmware_SelfSignedBoot +tests_firmware_SetSerialNumber +tests_firmware_SoftwareSync +tests_firmware_StandbyPowerConsumption +tests_firmware_SysfsVPD +tests_firmware_TPMNotCorruptedDevMode tpm? ( +tests_firmware_TPMExtend ) tpm? ( +tests_firmware_TPMVersionCheck ) tpm? ( +tests_firmware_TPMKernelVersion ) tpm2? ( +tests_firmware_TPMExtend ) tpm2? ( +tests_firmware_TPMVersionCheck ) tpm2? ( +tests_firmware_TPMKernelVersion ) +tests_firmware_TryFwB +tests_firmware_TypeCCharging +tests_firmware_TypeCProbeUSB3 +tests_firmware_UpdateFirmwareDataKeyVersion +tests_firmware_UpdateFirmwareVersion +tests_firmware_UpdateKernelDataKeyVersion +tests_firmware_UpdateKernelSubkeyVersion +tests_firmware_UpdateKernelVersion +tests_firmware_UpdaterModes +tests_firmware_UserRequestRecovery +tests_firmware_WilcoDiagnosticsMode +tests_firmware_WriteProtect +tests_firmware_WriteProtectFunc +tests_graphics_PowerConsumption +tests_graphics_MultipleDisplays +tests_hardware_DiskFirmwareUpgrade +tests_hardware_MemoryIntegrity +tests_hardware_StorageQual +tests_hardware_StorageQualBase +tests_hardware_StorageQualCheckSetup +tests_hardware_StorageQualSuspendStress +tests_hardware_StorageQualTrimStress +tests_hardware_StorageStress +tests_infra_TLSExecDUTCommand +tests_kernel_EmptyLines +tests_kernel_ExternalUsbPeripheralsDetectionTest +tests_kernel_IdlePerf +tests_kernel_MemoryRamoop +tests_logging_GenerateCrashFiles moblab? ( +tests_moblab_RunSuite +tests_moblab_StorageQual ) +tests_moblab_Setup cros_p2p? ( +tests_p2p_EndToEndTest ) +tests_network_FirewallHolePunchServer +tests_platform_ActivateDate +tests_platform_BootDevice +tests_platform_BootLockboxServer +tests_platform_BootPerfServer +tests_platform_CompromisedStatefulPartition +tests_platform_CorruptRootfs +tests_platform_CrashStateful +tests_platform_ExternalUsbPeripherals +tests_platform_FlashErasers +tests_platform_Flashrom +tests_platform_HWwatchdog +tests_platform_InitLoginPerfServer +tests_platform_InstallTestImage +tests_platform_InternalDisplay +tests_platform_KernelErrorPaths power_management? ( +tests_platform_PowerStatusStress +tests_power_DeferForFlashrom +tests_power_WakeSources ) +tests_platform_Powerwash +tests_platform_RotationFps +tests_platform_ServoPowerStateController +tests_platform_StageAndRecover +tests_platform_SuspendResumeTiming +tests_platform_SyncCrash readahead? ( +tests_platform_UReadAheadServer ) +tests_platform_Vpd +tests_policy_AUServer +tests_policy_DeviceChargingServer +tests_policy_DeviceServer +tests_policy_ExternalStorageServer +tests_policy_GlobalNetworkSettingsServer +tests_policy_WiFiAutoconnectServer +tests_policy_WiFiPrecedenceServer +tests_policy_WiFiTypesServer +tests_policy_WilcoServerDeviceDockMacAddressSource +tests_policy_WilcoServerOnNonWilcoDevice +tests_policy_WilcoServerUSBPowershare +tests_power_BrightnessResetAfterReboot +tests_power_ChargeControlWrapper +tests_power_MeetCall +tests_power_Monitoring +tests_power_LW +tests_power_PowerlogWrapper +tests_power_RPMTest +tests_power_ServoChargeStress +tests_power_ServodWrapper +tests_provision_CheetsUpdate +tests_provision_Cr50TOT +tests_provision_Cr50Update +tests_provision_FactoryImage +tests_provision_FirmwareUpdate +tests_provision_QuickProvision +tests_rlz_CheckPing +tests_security_kASLR +tests_sequences +tests_servo_LabControlVerification +tests_servo_LabstationVerification +tests_servo_USBMuxVerification +tests_servo_LogGrab +tests_servo_Verification +tests_servohost_Reboot +tests_stress_ClientTestReboot +tests_stress_EnrollmentRetainment cros_host cros_workon_tree_32980198aed456bcd515bc81691376f75c84e8d1 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+REQUIRED_USE=?? ( has-kernelnext is-kernelnext )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7219ab6fec543073e23964dd2c4046c2
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-9999 b/metadata/md5-cache/chromeos-base/autotest-server-tests-9999
index b7f6bc8..f93f028 100644
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-9999
@@ -3,12 +3,12 @@
 DESCRIPTION=Autotest server tests
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=android-container android-container-pi +autotest biod +cellular -chromeless_tests -chromeless_tty cros_p2p debugd has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2 +tests_android_ACTS +tests_android_EasySetup +tests_audio_AudioAfterReboot +tests_audio_AudioAfterSuspend +tests_audio_AudioArtifacts +tests_audio_AudioARCPlayback +tests_audio_AudioARCRecord +tests_audio_AudioBasicAssistant +tests_audio_AudioBasicBluetoothPlayback +tests_audio_AudioBasicBluetoothPlaybackRecord +tests_audio_AudioBasicBluetoothRecord +tests_audio_AudioBasicExternalMicrophone +tests_audio_AudioBasicHDMI +tests_audio_AudioBasicHeadphone +tests_audio_AudioBasicHotwording +tests_audio_AudioBasicInternalMicrophone +tests_audio_AudioBasicInternalSpeaker +tests_audio_AudioBasicUSBPlayback +tests_audio_AudioBasicUSBPlaybackRecord +tests_audio_AudioBasicUSBRecord +tests_audio_AudioBluetoothConnectionStability +tests_audio_AudioNodeSwitch +tests_audio_AudioPinnedStream +tests_audio_AudioQualityAfterSuspend +tests_audio_AudioSanityCheck +tests_audio_AudioVolume +tests_audio_AudioWebRTCLoopback +tests_audio_InternalCardNodes +tests_audio_LeftRightInternalSpeaker +tests_audio_MediaBasicVerification +tests_audio_PowerConsumption +tests_audiovideo_AVSync +tests_autotest_SyncCount +tests_autoupdate_CatchBadSignatures +tests_autoupdate_Cellular +tests_autoupdate_DataPreserved +tests_autoupdate_ForcedOOBEUpdate +tests_autoupdate_FromUI +tests_autoupdate_Interruptions +tests_autoupdate_NonBlockingOOBEUpdate +tests_autoupdate_OmahaResponse +tests_autoupdate_P2P +tests_autoupdate_Rollback has-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) is-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) +tests_brillo_gTests cellular? ( +tests_cellular_StaleModemReboot ) android-container-pi? ( +tests_cheets_CTS_Instant +tests_cheets_CTS_P +tests_cheets_GTS +tests_cheets_VTS ) +tests_component_UpdateFlash debugd? ( +tests_debugd_DevTools ) +tests_crosperf_Wrapper +tests_display_EdidStress +tests_display_HDCPScreen +tests_display_HotPlugAtBoot +tests_display_HotPlugAtSuspend +tests_display_HotPlugNoisy +tests_display_LidCloseOpen +tests_display_NoEdid +tests_display_Resolution +tests_display_ResolutionList +tests_display_ServerChameleonConnection +tests_display_SuspendStress +tests_display_SwitchMode +tests_dummy_PassServer +tests_dummy_FailServer +tests_dummy_FlakyTestServer +tests_dummy_SynchronousOffloadServer +tests_enterprise_ClearTPM +tests_enterprise_KioskEnrollmentServer +tests_enterprise_LongevityTrackerServer +tests_enterprise_OnlineDemoMode +tests_factory_Basic +tests_firmware_Bmpblk +tests_firmware_CgptStress +tests_firmware_ClearTPMOwnerAndReset +tests_firmware_ConsecutiveBoot +tests_firmware_ConsecutiveBootPowerButton +tests_firmware_ConsecutiveLidSwitch +tests_firmware_CorruptBothFwBodyAB +tests_firmware_CorruptBothFwSigAB +tests_firmware_CorruptBothKernelAB +tests_firmware_CorruptFwBodyA +tests_firmware_CorruptFwBodyB +tests_firmware_CorruptFwSigA +tests_firmware_CorruptFwSigB +tests_firmware_CorruptKernelA +tests_firmware_CorruptKernelB +tests_firmware_CorruptRecoveryCache +tests_firmware_Cr50BID +tests_firmware_Cr50CCDServoCap +tests_firmware_Cr50CCDUartStress +tests_firmware_Cr50CheckCap +tests_firmware_Cr50ConsoleCommands +tests_firmware_Cr50DeepSleepStress +tests_firmware_Cr50DeferredECReset +tests_firmware_Cr50DeviceState +tests_firmware_Cr50DevMode +tests_firmware_Cr50ECReset +tests_firmware_Cr50FactoryResetVC +tests_firmware_Cr50CCDFirmwareUpdate +tests_firmware_Cr50GetName +tests_firmware_Cr50InvalidateRW +tests_firmware_Cr50Open +tests_firmware_Cr50OpenWhileAPOff +tests_firmware_Cr50PartialBoardId +tests_firmware_Cr50Password +tests_firmware_Cr50PinWeaverServer +tests_firmware_Cr50RddG3 +tests_firmware_Cr50RejectUpdate +tests_firmware_Cr50RMAOpen +tests_firmware_Cr50SetBoardId +tests_firmware_Cr50ShortECC +tests_firmware_Cr50Testlab +tests_firmware_Cr50TpmManufactured +tests_firmware_Cr50TpmMode +tests_firmware_Cr50U2fCommands +tests_firmware_Cr50Unlock +tests_firmware_Cr50Update +tests_firmware_Cr50UpdateScriptStress +tests_firmware_Cr50USB +tests_firmware_Cr50WilcoEcrst +tests_firmware_Cr50WilcoRmaFactoryMode +tests_firmware_Cr50WPG3 +tests_firmware_DevBootUSB +tests_firmware_DevDefaultBoot +tests_firmware_DevMode +tests_firmware_DevModeStress +tests_firmware_DevScreenTimeout +tests_firmware_ECBattery +tests_firmware_ECBootTime +tests_firmware_ECCbiEeprom +tests_firmware_ECCharging +tests_firmware_ECChargingState +tests_firmware_ECHash +tests_firmware_ECKeyboard +tests_firmware_ECKeyboardReboot +tests_firmware_ECLidShutdown +tests_firmware_ECLidSwitch +tests_firmware_ECPeci +tests_firmware_ECPowerButton +tests_firmware_ECPowerG3 +tests_firmware_ECSharedMem +tests_firmware_ECThermal +tests_firmware_ECUpdateId +tests_firmware_ECUsbPorts +tests_firmware_ECWakeSource +tests_firmware_ECWatchdog +tests_firmware_EventLog +tests_firmware_FAFTPrepare +tests_firmware_FAFTModeTransitions +tests_firmware_FAFTRPC +tests_firmware_FAFTSetup biod? ( +tests_firmware_Fingerprint ) +tests_firmware_FMap +tests_firmware_FWMPDisableCCD +tests_firmware_FwScreenCloseLid +tests_firmware_FwScreenPressPower +tests_firmware_FWupdateWP +tests_firmware_FWtries +tests_firmware_FWupdateThenSleep +tests_firmware_FWupdateWP +tests_firmware_IntegratedU2F +tests_firmware_InvalidUSB +tests_firmware_LegacyRecovery +tests_firmware_MenuModeTransition +tests_firmware_Mosys +tests_firmware_PDConnect +tests_firmware_PDDataSwap +tests_firmware_PDPowerSwap +tests_firmware_PDProtocol +tests_firmware_PDResetHard +tests_firmware_PDResetSoft +tests_firmware_PDTrySrc +tests_firmware_PDVbusRequest +tests_firmware_RecoveryButton +tests_firmware_RecoveryCacheBootKeys +tests_firmware_RollbackFirmware +tests_firmware_RollbackKernel +tests_firmware_SelfSignedBoot +tests_firmware_SetSerialNumber +tests_firmware_SoftwareSync +tests_firmware_StandbyPowerConsumption +tests_firmware_SysfsVPD +tests_firmware_TPMNotCorruptedDevMode tpm? ( +tests_firmware_TPMExtend ) tpm? ( +tests_firmware_TPMVersionCheck ) tpm? ( +tests_firmware_TPMKernelVersion ) tpm2? ( +tests_firmware_TPMExtend ) tpm2? ( +tests_firmware_TPMVersionCheck ) tpm2? ( +tests_firmware_TPMKernelVersion ) +tests_firmware_TryFwB +tests_firmware_TypeCCharging +tests_firmware_TypeCProbeUSB3 +tests_firmware_UpdateFirmwareDataKeyVersion +tests_firmware_UpdateFirmwareVersion +tests_firmware_UpdateKernelDataKeyVersion +tests_firmware_UpdateKernelSubkeyVersion +tests_firmware_UpdateKernelVersion +tests_firmware_UpdaterModes +tests_firmware_UserRequestRecovery +tests_firmware_WilcoDiagnosticsMode +tests_firmware_WriteProtect +tests_firmware_WriteProtectFunc +tests_graphics_PowerConsumption +tests_graphics_MultipleDisplays +tests_hardware_DiskFirmwareUpgrade +tests_hardware_MemoryIntegrity +tests_hardware_StorageQual +tests_hardware_StorageQualBase +tests_hardware_StorageQualCheckSetup +tests_hardware_StorageQualSuspendStress +tests_hardware_StorageQualTrimStress +tests_hardware_StorageStress +tests_kernel_EmptyLines +tests_kernel_ExternalUsbPeripheralsDetectionTest +tests_kernel_IdlePerf +tests_kernel_MemoryRamoop +tests_logging_GenerateCrashFiles moblab? ( +tests_moblab_RunSuite +tests_moblab_StorageQual ) +tests_moblab_Setup cros_p2p? ( +tests_p2p_EndToEndTest ) +tests_network_FirewallHolePunchServer +tests_platform_ActivateDate +tests_platform_BootDevice +tests_platform_BootLockboxServer +tests_platform_BootPerfServer +tests_platform_CompromisedStatefulPartition +tests_platform_CorruptRootfs +tests_platform_CrashStateful +tests_platform_ExternalUsbPeripherals +tests_platform_FlashErasers +tests_platform_Flashrom +tests_platform_HWwatchdog +tests_platform_InitLoginPerfServer +tests_platform_InstallTestImage +tests_platform_InternalDisplay +tests_platform_KernelErrorPaths power_management? ( +tests_platform_PowerStatusStress +tests_power_DeferForFlashrom +tests_power_WakeSources ) +tests_platform_Powerwash +tests_platform_RotationFps +tests_platform_ServoPowerStateController +tests_platform_StageAndRecover +tests_platform_SuspendResumeTiming +tests_platform_SyncCrash readahead? ( +tests_platform_UReadAheadServer ) +tests_platform_Vpd +tests_policy_AUServer +tests_policy_DeviceChargingServer +tests_policy_DeviceServer +tests_policy_ExternalStorageServer +tests_policy_GlobalNetworkSettingsServer +tests_policy_WiFiAutoconnectServer +tests_policy_WiFiPrecedenceServer +tests_policy_WiFiTypesServer +tests_policy_WilcoServerDeviceDockMacAddressSource +tests_policy_WilcoServerOnNonWilcoDevice +tests_policy_WilcoServerUSBPowershare +tests_power_BrightnessResetAfterReboot +tests_power_ChargeControlWrapper +tests_power_MeetCall +tests_power_Monitoring +tests_power_LW +tests_power_PowerlogWrapper +tests_power_RPMTest +tests_power_ServoChargeStress +tests_power_ServodWrapper +tests_provision_AutoUpdate +tests_provision_CheetsUpdate +tests_provision_Cr50TOT +tests_provision_Cr50Update +tests_provision_FactoryImage +tests_provision_FirmwareUpdate +tests_rlz_CheckPing +tests_security_kASLR +tests_sequences +tests_servo_LabControlVerification +tests_servo_LabstationVerification +tests_servo_USBMuxVerification +tests_servo_LogGrab +tests_servo_Verification +tests_servohost_Reboot +tests_stress_ClientTestReboot +tests_stress_EnrollmentRetainment cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=android-container android-container-pi android-vm-rvc +autotest biod +cellular cheets_user_64 -chromeless_tests -chromeless_tty cros_p2p debugd dlc_test has-kernelnext is-kernelnext -moblab +power_management +readahead +tpm tpm2 +tests_android_ACTS +tests_android_EasySetup +tests_audio_AudioAfterReboot +tests_audio_AudioAfterSuspend +tests_audio_AudioArtifacts +tests_audio_AudioARCPlayback +tests_audio_AudioARCRecord +tests_audio_AudioBasicAssistant +tests_audio_AudioBasicBluetoothPlayback +tests_audio_AudioBasicBluetoothPlaybackRecord +tests_audio_AudioBasicBluetoothRecord +tests_audio_AudioBasicExternalMicrophone +tests_audio_AudioBasicHDMI +tests_audio_AudioBasicHeadphone +tests_audio_AudioBasicHotwording +tests_audio_AudioBasicInternalMicrophone +tests_audio_AudioBasicInternalSpeaker +tests_audio_AudioBasicUSBPlayback +tests_audio_AudioBasicUSBPlaybackRecord +tests_audio_AudioBasicUSBRecord +tests_audio_AudioBluetoothConnectionStability +tests_audio_AudioNodeSwitch +tests_audio_AudioPinnedStream +tests_audio_AudioQualityAfterSuspend +tests_audio_AudioSanityCheck +tests_audio_AudioVolume +tests_audio_AudioWebRTCLoopback +tests_audio_InternalCardNodes +tests_audio_LeftRightInternalSpeaker +tests_audio_MediaBasicVerification +tests_audio_PowerConsumption +tests_audiovideo_AVSync +tests_autotest_SyncCount +tests_autoupdate_Basic +tests_autoupdate_CatchBadSignatures +tests_autoupdate_Cellular +tests_autoupdate_DataPreserved +tests_autoupdate_ForcedOOBEUpdate +tests_autoupdate_FromUI +tests_autoupdate_Interruptions +tests_autoupdate_NonBlockingOOBEUpdate +tests_autoupdate_OmahaResponse +tests_autoupdate_P2P +tests_autoupdate_Periodic +tests_autoupdate_Rollback dlc_test? ( +tests_autoupdate_WithDLC ) has-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) is-kernelnext? ( +tests_autoupdate_StatefulCompatibility ) cellular? ( +tests_cellular_StaleModemReboot ) android-container-pi? ( +tests_cheets_CTS_Instant +tests_cheets_CTS_P +tests_cheets_GTS ) android-vm-rvc? ( cheets_user_64? ( +tests_cheets_CTS_R +tests_cheets_GTS_R ) !cheets_user_64? ( +tests_cheets_VTS_R ) ) +tests_cheets_LabDependencies debugd? ( +tests_debugd_DevTools ) +tests_crosperf_Wrapper +tests_display_EdidStress +tests_display_HDCPScreen +tests_display_HotPlugAtBoot +tests_display_HotPlugAtSuspend +tests_display_HotPlugNoisy +tests_display_LidCloseOpen +tests_display_NoEdid +tests_display_Resolution +tests_display_ResolutionList +tests_display_ServerChameleonConnection +tests_display_SuspendStress +tests_display_SwitchMode +tests_dummy_PassServer +tests_dummy_FailServer +tests_dummy_FlakyTestServer +tests_dummy_SynchronousOffloadServer +tests_enterprise_ClearTPM +tests_enterprise_KioskEnrollmentServer +tests_enterprise_LongevityTrackerServer +tests_enterprise_OnlineDemoMode +tests_factory_Basic +tests_firmware_Bmpblk +tests_firmware_CgptStress +tests_firmware_ClearTPMOwnerAndReset +tests_firmware_ConsecutiveBoot +tests_firmware_ConsecutiveBootPowerButton +tests_firmware_ConsecutiveLidSwitch +tests_firmware_CorruptBothFwBodyAB +tests_firmware_CorruptBothFwSigAB +tests_firmware_CorruptBothKernelAB +tests_firmware_CorruptFwBodyA +tests_firmware_CorruptFwBodyB +tests_firmware_CorruptFwSigA +tests_firmware_CorruptFwSigB +tests_firmware_CorruptKernelA +tests_firmware_CorruptKernelB +tests_firmware_CorruptRecoveryCache +tests_firmware_Cr50BID +tests_firmware_Cr50CCDServoCap +tests_firmware_Cr50CCDUartStress +tests_firmware_Cr50CheckCap +tests_firmware_Cr50ConsoleCommands +tests_firmware_Cr50DeepSleepStress +tests_firmware_Cr50DeferredECReset +tests_firmware_Cr50DeviceState +tests_firmware_Cr50DevMode +tests_firmware_Cr50ECReset +tests_firmware_Cr50FactoryResetVC +tests_firmware_Cr50CCDFirmwareUpdate +tests_firmware_Cr50GetName +tests_firmware_Cr50InvalidateRW +tests_firmware_Cr50Open +tests_firmware_Cr50OpenWhileAPOff +tests_firmware_Cr50PartialBoardId +tests_firmware_Cr50Password +tests_firmware_Cr50PinWeaverServer +tests_firmware_Cr50RddG3 +tests_firmware_Cr50RejectUpdate +tests_firmware_Cr50RMAOpen +tests_firmware_Cr50SetBoardId +tests_firmware_Cr50ShortECC +tests_firmware_Cr50Testlab +tests_firmware_Cr50TpmManufactured +tests_firmware_Cr50TpmMode +tests_firmware_Cr50U2fCommands +tests_firmware_Cr50Unlock +tests_firmware_Cr50Update +tests_firmware_Cr50UpdateScriptStress +tests_firmware_Cr50USB +tests_firmware_Cr50WilcoEcrst +tests_firmware_Cr50WilcoRmaFactoryMode +tests_firmware_Cr50WPG3 +tests_firmware_DevBootUSB +tests_firmware_DevDefaultBoot +tests_firmware_DevMode +tests_firmware_DevModeStress +tests_firmware_DevScreenTimeout +tests_firmware_ECBattery +tests_firmware_ECBootTime +tests_firmware_ECCbiEeprom +tests_firmware_ECCharging +tests_firmware_ECChargingState +tests_firmware_ECHash +tests_firmware_ECKeyboard +tests_firmware_ECKeyboardReboot +tests_firmware_ECLidShutdown +tests_firmware_ECLidSwitch +tests_firmware_ECPeci +tests_firmware_ECPowerButton +tests_firmware_ECPowerG3 +tests_firmware_ECSharedMem +tests_firmware_ECThermal +tests_firmware_ECUpdateId +tests_firmware_ECUsbPorts +tests_firmware_ECWakeSource +tests_firmware_ECWatchdog +tests_firmware_EventLog +tests_firmware_FAFTPrepare +tests_firmware_FAFTModeTransitions +tests_firmware_FAFTRPC +tests_firmware_FAFTSetup biod? ( +tests_firmware_Fingerprint +tests_firmware_FingerprintSigner ) +tests_firmware_FMap +tests_firmware_FWMPDisableCCD +tests_firmware_FwScreenCloseLid +tests_firmware_FwScreenPressPower +tests_firmware_FWupdateWP +tests_firmware_FWtries +tests_firmware_FWupdateThenSleep +tests_firmware_FWupdateWP +tests_firmware_IntegratedU2F +tests_firmware_InvalidUSB +tests_firmware_LegacyRecovery +tests_firmware_MenuModeTransition +tests_firmware_Mosys +tests_firmware_PDConnect +tests_firmware_PDDataSwap +tests_firmware_PDPowerSwap +tests_firmware_PDProtocol +tests_firmware_PDResetHard +tests_firmware_PDResetSoft +tests_firmware_PDTrySrc +tests_firmware_PDVbusRequest +tests_firmware_RecoveryButton +tests_firmware_RecoveryCacheBootKeys +tests_firmware_RollbackFirmware +tests_firmware_RollbackKernel +tests_firmware_SelfSignedBoot +tests_firmware_SetSerialNumber +tests_firmware_SoftwareSync +tests_firmware_StandbyPowerConsumption +tests_firmware_SysfsVPD +tests_firmware_TPMNotCorruptedDevMode tpm? ( +tests_firmware_TPMExtend ) tpm? ( +tests_firmware_TPMVersionCheck ) tpm? ( +tests_firmware_TPMKernelVersion ) tpm2? ( +tests_firmware_TPMExtend ) tpm2? ( +tests_firmware_TPMVersionCheck ) tpm2? ( +tests_firmware_TPMKernelVersion ) +tests_firmware_TryFwB +tests_firmware_TypeCCharging +tests_firmware_TypeCProbeUSB3 +tests_firmware_UpdateFirmwareDataKeyVersion +tests_firmware_UpdateFirmwareVersion +tests_firmware_UpdateKernelDataKeyVersion +tests_firmware_UpdateKernelSubkeyVersion +tests_firmware_UpdateKernelVersion +tests_firmware_UpdaterModes +tests_firmware_UserRequestRecovery +tests_firmware_WilcoDiagnosticsMode +tests_firmware_WriteProtect +tests_firmware_WriteProtectFunc +tests_graphics_PowerConsumption +tests_graphics_MultipleDisplays +tests_hardware_DiskFirmwareUpgrade +tests_hardware_MemoryIntegrity +tests_hardware_StorageQual +tests_hardware_StorageQualBase +tests_hardware_StorageQualCheckSetup +tests_hardware_StorageQualSuspendStress +tests_hardware_StorageQualTrimStress +tests_hardware_StorageStress +tests_infra_TLSExecDUTCommand +tests_kernel_EmptyLines +tests_kernel_ExternalUsbPeripheralsDetectionTest +tests_kernel_IdlePerf +tests_kernel_MemoryRamoop +tests_logging_GenerateCrashFiles moblab? ( +tests_moblab_RunSuite +tests_moblab_StorageQual ) +tests_moblab_Setup cros_p2p? ( +tests_p2p_EndToEndTest ) +tests_network_FirewallHolePunchServer +tests_platform_ActivateDate +tests_platform_BootDevice +tests_platform_BootLockboxServer +tests_platform_BootPerfServer +tests_platform_CompromisedStatefulPartition +tests_platform_CorruptRootfs +tests_platform_CrashStateful +tests_platform_ExternalUsbPeripherals +tests_platform_FlashErasers +tests_platform_Flashrom +tests_platform_HWwatchdog +tests_platform_InitLoginPerfServer +tests_platform_InstallTestImage +tests_platform_InternalDisplay +tests_platform_KernelErrorPaths power_management? ( +tests_platform_PowerStatusStress +tests_power_DeferForFlashrom +tests_power_WakeSources ) +tests_platform_Powerwash +tests_platform_RotationFps +tests_platform_ServoPowerStateController +tests_platform_StageAndRecover +tests_platform_SuspendResumeTiming +tests_platform_SyncCrash readahead? ( +tests_platform_UReadAheadServer ) +tests_platform_Vpd +tests_policy_AUServer +tests_policy_DeviceChargingServer +tests_policy_DeviceServer +tests_policy_ExternalStorageServer +tests_policy_GlobalNetworkSettingsServer +tests_policy_WiFiAutoconnectServer +tests_policy_WiFiPrecedenceServer +tests_policy_WiFiTypesServer +tests_policy_WilcoServerDeviceDockMacAddressSource +tests_policy_WilcoServerOnNonWilcoDevice +tests_policy_WilcoServerUSBPowershare +tests_power_BrightnessResetAfterReboot +tests_power_ChargeControlWrapper +tests_power_MeetCall +tests_power_Monitoring +tests_power_LW +tests_power_PowerlogWrapper +tests_power_RPMTest +tests_power_ServoChargeStress +tests_power_ServodWrapper +tests_provision_CheetsUpdate +tests_provision_Cr50TOT +tests_provision_Cr50Update +tests_provision_FactoryImage +tests_provision_FirmwareUpdate +tests_provision_QuickProvision +tests_rlz_CheckPing +tests_security_kASLR +tests_sequences +tests_servo_LabControlVerification +tests_servo_LabstationVerification +tests_servo_USBMuxVerification +tests_servo_LogGrab +tests_servo_Verification +tests_servohost_Reboot +tests_stress_ClientTestReboot +tests_stress_EnrollmentRetainment cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 REQUIRED_USE=?? ( has-kernelnext is-kernelnext )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=79712d1c4cda8ef0105b8c8ffaf7c3b0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=34e1515ec621484dbe90914eccc10991
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3318 b/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3318
deleted file mode 100644
index 5e26a3e..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3318
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=Autotest server tests for Bluetooth
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_bluetooth_AdapterAdvSanity +tests_bluetooth_AdapterAudioLink +tests_bluetooth_AdapterAUSanity +tests_bluetooth_AdapterCLSanity +tests_bluetooth_AdapterLEAdvertising +tests_bluetooth_AdapterLEBetterTogether +tests_bluetooth_AdapterLEHIDSanity +tests_bluetooth_AdapterLESanity +tests_bluetooth_AdapterMDSanity +tests_bluetooth_AdapterMTBF +tests_bluetooth_AdapterPowerMeasure +tests_bluetooth_AdapterQuickSanity +tests_bluetooth_AdapterSASanity +tests_bluetooth_PeerUpdate +tests_bluetooth_AdapterSRSanity cros_host cros_workon_tree_e07884563021f42ffacc26736bff982f037483b4 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-server-tests-0.0.2-r4126 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0e1058cf58f5b6720e7531fa205454ca
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3366 b/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3366
new file mode 100644
index 0000000..50c1c01
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-0.0.1-r3366
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=Autotest server tests for Bluetooth
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_bluetooth_AdapterAdvSanity +tests_bluetooth_AdapterAUSanity +tests_bluetooth_AdapterCLSanity +tests_bluetooth_AdapterLEAdvertising +tests_bluetooth_AdapterLEBetterTogether +tests_bluetooth_AdapterLEHIDSanity +tests_bluetooth_AdapterLESanity +tests_bluetooth_AdapterMDSanity +tests_bluetooth_AdapterMTBF +tests_bluetooth_AdapterPowerMeasure +tests_bluetooth_AdapterQuickSanity +tests_bluetooth_AdapterSASanity +tests_bluetooth_PeerUpdate +tests_bluetooth_AdapterSRSanity cros_host cros_workon_tree_6e58ba458a13bf5c1b0262c0e00b5fc693215a51 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-server-tests-0.0.2-r4126 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=76ad8a676ffede68e4dd16a9e41f9c25
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-9999 b/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-9999
index 22fd5b8..e8bd299 100644
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-bluetooth-9999
@@ -2,11 +2,11 @@
 DESCRIPTION=Autotest server tests for Bluetooth
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_bluetooth_AdapterAdvSanity +tests_bluetooth_AdapterAudioLink +tests_bluetooth_AdapterAUSanity +tests_bluetooth_AdapterCLSanity +tests_bluetooth_AdapterLEAdvertising +tests_bluetooth_AdapterLEBetterTogether +tests_bluetooth_AdapterLEHIDSanity +tests_bluetooth_AdapterLESanity +tests_bluetooth_AdapterMDSanity +tests_bluetooth_AdapterMTBF +tests_bluetooth_AdapterPowerMeasure +tests_bluetooth_AdapterQuickSanity +tests_bluetooth_AdapterSASanity +tests_bluetooth_PeerUpdate +tests_bluetooth_AdapterSRSanity cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest +tests_bluetooth_AdapterAdvSanity +tests_bluetooth_AdapterAUSanity +tests_bluetooth_AdapterCLSanity +tests_bluetooth_AdapterLEAdvertising +tests_bluetooth_AdapterLEBetterTogether +tests_bluetooth_AdapterLEHIDSanity +tests_bluetooth_AdapterLESanity +tests_bluetooth_AdapterMDSanity +tests_bluetooth_AdapterMTBF +tests_bluetooth_AdapterPowerMeasure +tests_bluetooth_AdapterQuickSanity +tests_bluetooth_AdapterSASanity +tests_bluetooth_PeerUpdate +tests_bluetooth_AdapterSRSanity cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-server-tests-0.0.2-r4126 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=89fd150324d2619d7fa382276538a00a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=39a673713b1e6bb6354d572725774246
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3314 b/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3314
deleted file mode 100644
index 3a865ec..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3314
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=Autotest server tests for shill
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=-chromeless_tests +autotest -chromeless_tty +tests_network_WiFi_APSupportedRates +tests_network_WiFi_AssocConfigPerformance +tests_network_WiFi_AttenuatedPerf +tests_network_WiFi_BeaconInterval +tests_network_WiFi_BgscanBackoff +tests_network_WiFi_BluetoothScanPerf +tests_network_WiFi_BluetoothStreamPerf +tests_network_WiFi_BSSTMReq +tests_network_WiFi_BT_AntennaCoex +tests_network_WiFi_ChannelHop +tests_network_WiFi_ChannelScanDwellTime +tests_network_WiFi_ChaosConfigFailure +tests_network_WiFi_ChaosConnectDisconnect +tests_network_WiFi_ChaosLongConnect !chromeless_tty ( !chromeless_tests ( +tests_cellular_ChromeEndToEnd +tests_network_WiFi_ChromeEndToEnd +tests_network_WiFi_RoamEndToEnd +tests_network_WiFi_RoamSuspendEndToEnd ) ) +tests_network_WiFi_ConnectionIdentifier +tests_network_WiFi_CSA +tests_network_WiFi_CSADisconnect +tests_network_WiFi_DarkResumeActiveScans +tests_network_WiFi_DisableEnable +tests_network_WiFi_DisableRandomMACAddress +tests_network_WiFi_DisconnectClearsIP +tests_network_WiFi_DisconnectReason +tests_network_WiFi_DTIMPeriod +tests_network_WiFi_FastReconnectInDarkResume +tests_network_WiFi_GTK +tests_network_WiFi_HiddenRemains +tests_network_WiFi_HiddenScan +tests_network_WiFi_LinkMonitorFailure +tests_network_WiFi_MalformedProbeResp +tests_network_WiFi_MaskedBSSID +tests_network_WiFi_MissingBeacons +tests_network_WiFi_MultiAuth +tests_network_WiFi_OverlappingBSSScan +tests_network_WiFi_Perf +tests_network_WiFi_PMKSACaching +tests_network_WiFi_Powersave +tests_network_WiFi_Prefer5Ghz +tests_network_WiFi_ProfileBasic +tests_network_WiFi_ProfileGUID +tests_network_WiFi_PTK +tests_network_WiFi_RandomMACAddress +tests_network_WiFi_RateControl +tests_network_WiFi_Reassociate +tests_network_WiFi_ReconnectInDarkResume +tests_network_WiFi_Reset +tests_network_WiFi_Roam +tests_network_WiFi_RoamDbus +tests_network_WiFi_RoamFT +tests_network_WiFi_RoamSuspendTimeout +tests_network_WiFi_ScanPerformance +tests_network_WiFi_SecChange +tests_network_WiFi_SetOptionalDhcpProperties +tests_network_WiFi_SimpleConnect +tests_network_WiFi_SSIDSwitchBack +tests_network_WiFi_SuspendStress +tests_network_WiFi_StressTest +tests_network_WiFi_Throttle +tests_network_WiFi_UpdateRouter +tests_network_WiFi_VerifyRouter +tests_network_WiFi_VisibleScan +tests_network_WiFi_WakeOnDisconnect +tests_network_WiFi_WakeOnSSID +tests_network_WiFi_WakeOnWiFiThrottling +tests_network_WiFi_WoWLAN +tests_network_WiFi_WMM cros_host cros_workon_tree_00366af8c63b650d8db7bcfb1970e3575ed29a15 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d57afe4eb1d2119ecfa6f4838d6de597
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3338 b/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3338
new file mode 100644
index 0000000..42cd1c0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-0.0.1-r3338
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=Autotest server tests for shill
+EAPI=4
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=-chromeless_tests +autotest -chromeless_tty +tests_network_WiFi_APSupportedRates +tests_network_WiFi_AssocConfigPerformance +tests_network_WiFi_AttenuatedPerf +tests_network_WiFi_BeaconInterval +tests_network_WiFi_BgscanBackoff +tests_network_WiFi_BluetoothScanPerf +tests_network_WiFi_BluetoothStreamPerf +tests_network_WiFi_BSSTMReq +tests_network_WiFi_BT_AntennaCoex +tests_network_WiFi_ChannelHop +tests_network_WiFi_ChannelScanDwellTime +tests_network_WiFi_ChaosConfigFailure +tests_network_WiFi_ChaosConnectDisconnect +tests_network_WiFi_ChaosLongConnect !chromeless_tty ( !chromeless_tests ( +tests_cellular_ChromeEndToEnd +tests_network_WiFi_ChromeEndToEnd +tests_network_WiFi_RoamEndToEnd +tests_network_WiFi_RoamSuspendEndToEnd ) ) +tests_network_WiFi_ConnectionIdentifier +tests_network_WiFi_CSA +tests_network_WiFi_CSADisconnect +tests_network_WiFi_DarkResumeActiveScans +tests_network_WiFi_DisableEnable +tests_network_WiFi_DisableRandomMACAddress +tests_network_WiFi_DisconnectReason +tests_network_WiFi_DTIMPeriod +tests_network_WiFi_FastReconnectInDarkResume +tests_network_WiFi_GTK +tests_network_WiFi_HiddenRemains +tests_network_WiFi_HiddenScan +tests_network_WiFi_LinkMonitorFailure +tests_network_WiFi_MalformedProbeResp +tests_network_WiFi_MultiAuth +tests_network_WiFi_OverlappingBSSScan +tests_network_WiFi_Perf +tests_network_WiFi_PMKSACaching +tests_network_WiFi_Prefer5Ghz +tests_network_WiFi_ProfileBasic +tests_network_WiFi_ProfileGUID +tests_network_WiFi_PTK +tests_network_WiFi_RandomMACAddress +tests_network_WiFi_RateControl +tests_network_WiFi_Reassociate +tests_network_WiFi_ReconnectInDarkResume +tests_network_WiFi_Reset +tests_network_WiFi_Roam +tests_network_WiFi_RoamDbus +tests_network_WiFi_RoamFT +tests_network_WiFi_RoamSuspendTimeout +tests_network_WiFi_ScanPerformance +tests_network_WiFi_SecChange +tests_network_WiFi_SetOptionalDhcpProperties +tests_network_WiFi_SimpleConnect +tests_network_WiFi_SSIDSwitchBack +tests_network_WiFi_SuspendStress +tests_network_WiFi_StressTest +tests_network_WiFi_Throttle +tests_network_WiFi_UpdateRouter +tests_network_WiFi_VerifyRouter +tests_network_WiFi_VisibleScan +tests_network_WiFi_WakeOnDisconnect +tests_network_WiFi_WakeOnSSID +tests_network_WiFi_WakeOnWiFiThrottling +tests_network_WiFi_WoWLAN +tests_network_WiFi_WMM cros_host cros_workon_tree_1339b5cf7943176aeba9de65fa5a5b8bf7326758 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=247ef07b77e38208e0161bd65c6a0983
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-9999 b/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-9999
index d2140ba..6535b70 100644
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-shill-9999
@@ -2,11 +2,11 @@
 DESCRIPTION=Autotest server tests for shill
 EAPI=4
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=-chromeless_tests +autotest -chromeless_tty +tests_network_WiFi_APSupportedRates +tests_network_WiFi_AssocConfigPerformance +tests_network_WiFi_AttenuatedPerf +tests_network_WiFi_BeaconInterval +tests_network_WiFi_BgscanBackoff +tests_network_WiFi_BluetoothScanPerf +tests_network_WiFi_BluetoothStreamPerf +tests_network_WiFi_BSSTMReq +tests_network_WiFi_BT_AntennaCoex +tests_network_WiFi_ChannelHop +tests_network_WiFi_ChannelScanDwellTime +tests_network_WiFi_ChaosConfigFailure +tests_network_WiFi_ChaosConnectDisconnect +tests_network_WiFi_ChaosLongConnect !chromeless_tty ( !chromeless_tests ( +tests_cellular_ChromeEndToEnd +tests_network_WiFi_ChromeEndToEnd +tests_network_WiFi_RoamEndToEnd +tests_network_WiFi_RoamSuspendEndToEnd ) ) +tests_network_WiFi_ConnectionIdentifier +tests_network_WiFi_CSA +tests_network_WiFi_CSADisconnect +tests_network_WiFi_DarkResumeActiveScans +tests_network_WiFi_DisableEnable +tests_network_WiFi_DisableRandomMACAddress +tests_network_WiFi_DisconnectClearsIP +tests_network_WiFi_DisconnectReason +tests_network_WiFi_DTIMPeriod +tests_network_WiFi_FastReconnectInDarkResume +tests_network_WiFi_GTK +tests_network_WiFi_HiddenRemains +tests_network_WiFi_HiddenScan +tests_network_WiFi_LinkMonitorFailure +tests_network_WiFi_MalformedProbeResp +tests_network_WiFi_MaskedBSSID +tests_network_WiFi_MissingBeacons +tests_network_WiFi_MultiAuth +tests_network_WiFi_OverlappingBSSScan +tests_network_WiFi_Perf +tests_network_WiFi_PMKSACaching +tests_network_WiFi_Powersave +tests_network_WiFi_Prefer5Ghz +tests_network_WiFi_ProfileBasic +tests_network_WiFi_ProfileGUID +tests_network_WiFi_PTK +tests_network_WiFi_RandomMACAddress +tests_network_WiFi_RateControl +tests_network_WiFi_Reassociate +tests_network_WiFi_ReconnectInDarkResume +tests_network_WiFi_Reset +tests_network_WiFi_Roam +tests_network_WiFi_RoamDbus +tests_network_WiFi_RoamFT +tests_network_WiFi_RoamSuspendTimeout +tests_network_WiFi_ScanPerformance +tests_network_WiFi_SecChange +tests_network_WiFi_SetOptionalDhcpProperties +tests_network_WiFi_SimpleConnect +tests_network_WiFi_SSIDSwitchBack +tests_network_WiFi_SuspendStress +tests_network_WiFi_StressTest +tests_network_WiFi_Throttle +tests_network_WiFi_UpdateRouter +tests_network_WiFi_VerifyRouter +tests_network_WiFi_VisibleScan +tests_network_WiFi_WakeOnDisconnect +tests_network_WiFi_WakeOnSSID +tests_network_WiFi_WakeOnWiFiThrottling +tests_network_WiFi_WoWLAN +tests_network_WiFi_WMM cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=-chromeless_tests +autotest -chromeless_tty +tests_network_WiFi_APSupportedRates +tests_network_WiFi_AssocConfigPerformance +tests_network_WiFi_AttenuatedPerf +tests_network_WiFi_BeaconInterval +tests_network_WiFi_BgscanBackoff +tests_network_WiFi_BluetoothScanPerf +tests_network_WiFi_BluetoothStreamPerf +tests_network_WiFi_BSSTMReq +tests_network_WiFi_BT_AntennaCoex +tests_network_WiFi_ChannelHop +tests_network_WiFi_ChannelScanDwellTime +tests_network_WiFi_ChaosConfigFailure +tests_network_WiFi_ChaosConnectDisconnect +tests_network_WiFi_ChaosLongConnect !chromeless_tty ( !chromeless_tests ( +tests_cellular_ChromeEndToEnd +tests_network_WiFi_ChromeEndToEnd +tests_network_WiFi_RoamEndToEnd +tests_network_WiFi_RoamSuspendEndToEnd ) ) +tests_network_WiFi_ConnectionIdentifier +tests_network_WiFi_CSA +tests_network_WiFi_CSADisconnect +tests_network_WiFi_DarkResumeActiveScans +tests_network_WiFi_DisableEnable +tests_network_WiFi_DisableRandomMACAddress +tests_network_WiFi_DisconnectReason +tests_network_WiFi_DTIMPeriod +tests_network_WiFi_FastReconnectInDarkResume +tests_network_WiFi_GTK +tests_network_WiFi_HiddenRemains +tests_network_WiFi_HiddenScan +tests_network_WiFi_LinkMonitorFailure +tests_network_WiFi_MalformedProbeResp +tests_network_WiFi_MultiAuth +tests_network_WiFi_OverlappingBSSScan +tests_network_WiFi_Perf +tests_network_WiFi_PMKSACaching +tests_network_WiFi_Prefer5Ghz +tests_network_WiFi_ProfileBasic +tests_network_WiFi_ProfileGUID +tests_network_WiFi_PTK +tests_network_WiFi_RandomMACAddress +tests_network_WiFi_RateControl +tests_network_WiFi_Reassociate +tests_network_WiFi_ReconnectInDarkResume +tests_network_WiFi_Reset +tests_network_WiFi_Roam +tests_network_WiFi_RoamDbus +tests_network_WiFi_RoamFT +tests_network_WiFi_RoamSuspendTimeout +tests_network_WiFi_ScanPerformance +tests_network_WiFi_SecChange +tests_network_WiFi_SetOptionalDhcpProperties +tests_network_WiFi_SimpleConnect +tests_network_WiFi_SSIDSwitchBack +tests_network_WiFi_SuspendStress +tests_network_WiFi_StressTest +tests_network_WiFi_Throttle +tests_network_WiFi_UpdateRouter +tests_network_WiFi_VerifyRouter +tests_network_WiFi_VisibleScan +tests_network_WiFi_WakeOnDisconnect +tests_network_WiFi_WakeOnSSID +tests_network_WiFi_WakeOnWiFiThrottling +tests_network_WiFi_WoWLAN +tests_network_WiFi_WMM cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8dc36067f8e59752e7c5ddc105890de6
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=34dc9f76e7e7ea9a7ccd310f8565d47a
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r104 b/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r104
deleted file mode 100644
index 7b3ce7c..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r104
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=Autotest server tests for running Tast-based tests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
-IUSE=+autotest +tests_tast cros_host cros_workon_tree_2868716f83007fd99d02289fd2a0a7a20667ed8c +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=485e64a95a1c5969e06ddc0a725b5364
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r120 b/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r120
new file mode 100644
index 0000000..5d46d89
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-0.0.1-r120
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=Autotest server tests for running Tast-based tests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
+IUSE=+autotest +tests_tast cros_host cros_workon_tree_c830590e01847850fc31d3d2344ebb83a81d97db +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=24396939547ae08b1f85dd0955119d3b
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-9999 b/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-9999
index 296c7ff..f72d755 100644
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-tast-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e4e2659d83319eae9fc464823eebb696
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3233 b/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3233
deleted file mode 100644
index 948361f..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3233
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-server-tests-0.0.2
-DESCRIPTION=Autotest server tests for shill
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_telemetry_AFDOGenerate +tests_telemetry_Benchmarks +tests_telemetry_Crosperf +tests_telemetry_CrosTests +tests_telemetry_GpuTests cros_host cros_workon_tree_bc817163326c42ab8ae50f548186a35d78ee9670 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ca61bc96201892306995bcd9097a9640
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3237 b/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3237
new file mode 100644
index 0000000..3a9df84
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-0.0.1-r3237
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-server-tests-0.0.2
+DESCRIPTION=Autotest server tests for shill
+EAPI=4
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_telemetry_AFDOGenerate +tests_telemetry_Benchmarks +tests_telemetry_Crosperf +tests_telemetry_CrosTests cros_host cros_workon_tree_7a1273a39123e82c06eb32db5941fb784023e773 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c4cc834288b3efcc5be795a6ddc15905
diff --git a/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-9999 b/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-9999
index fedde37..7208012 100644
--- a/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-server-tests-telemetry-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=Autotest server tests for shill
 EAPI=4
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_telemetry_AFDOGenerate +tests_telemetry_Benchmarks +tests_telemetry_Crosperf +tests_telemetry_CrosTests +tests_telemetry_GpuTests cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest +tests_telemetry_AFDOGenerate +tests_telemetry_Benchmarks +tests_telemetry_Crosperf +tests_telemetry_CrosTests cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c68fe76cd37b24c3435079afc12c9691
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ea9276697dcedaecdfa639af453c8a00
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8829 b/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8829
deleted file mode 100644
index a2be5e5..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8829
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( chromeos-base/metrics dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) tests_security_SMMLocked? ( sys-apps/pciutils ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-DESCRIPTION=Autotest tests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups +encrypted_stateful +network_time +passive_metrics +profile vaapi +autotest x86? ( +tests_security_SMMLocked +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) amd64? ( +tests_security_SMMLocked +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) +tests_profiler_sync +tests_compilebench +tests_crashme +tests_dbench +tests_ddtest +tests_disktest +tests_fsx +tests_hackbench +tests_iperf +tests_bonnie +tests_iozone +tests_netpipe +tests_sleeptest +tests_kernel_sysrq_info +tests_unixbench +tests_autoupdate_Backoff +tests_autoupdate_BadMetadata +tests_autoupdate_CannedOmahaUpdate +tests_autoupdate_DisconnectReconnectNetwork +tests_autoupdate_UrlSwitch +tests_blktestsSuiteAll +tests_blktestsSuiteLoopOverBlk +tests_blktestsSuiteLoopOverFile +tests_blktestsSuiteRealBlk +tests_camera_V4L2 arc-camera3? ( +tests_camera_HAL3 +tests_camera_HAL3Perf ) +tests_dummy_Fail +tests_dummy_Pass +tests_dummy_SynchronousOffload tests_example_UnitTest +tests_firmware_LockedME +tests_firmware_RomSize +tests_firmware_SetFWMP +tests_firmware_VbootCrypto +tests_flaky_test +tests_hardware_Badblocks +tests_hardware_DiskSize +tests_hardware_EC +tests_hardware_EepromWriteProtect +tests_hardware_GobiGPS +tests_hardware_GPIOSwitches +tests_hardware_GPS +tests_hardware_I2CProbe +tests_hardware_Interrupt +tests_hardware_Keyboard +tests_hardware_LightSensor +tests_hardware_MemoryLatency +tests_hardware_MemoryThroughput +tests_hardware_MemoryZRAMThroughput +tests_hardware_Memtester +tests_hardware_MultiReader +tests_hardware_ProbeComponents +tests_hardware_RamFio +tests_hardware_RealtekCardReader +tests_hardware_Resolution +tests_hardware_SAT +tests_hardware_Smartctl +tests_hardware_SsdDetection +tests_hardware_StorageFio +tests_hardware_StorageFioOther +tests_hardware_StorageTrim +tests_hardware_StorageWearoutDetect +tests_hardware_TouchScreenPowerCycles tests_hardware_TouchScreenPresent +tests_hardware_TrimIntegrity +tests_infra_FirmwareAutoupdate +tests_kernel_AsyncDriverProbe +tests_kernel_FirmwareRequest +tests_kernel_CrosECSysfsAccel +tests_kernel_Delay +tests_kernel_fs_Punybench +tests_kernel_Ktime +tests_kernel_Lmbench +tests_kernel_Memory_Ramoop +tests_kernel_SchedBandwith crash_reporting? ( +tests_logging_CrashSender +tests_logging_KernelCrash +tests_logging_UdevCrash +tests_logging_UserCrash +tests_platform_AnomalyDetector ) +tests_network_EthCaps +tests_network_EthernetStressPlug +tests_network_Ipv6SimpleNegotiation +tests_network_NegotiatedLANSpeed +tests_platform_AccurateTime +tests_platform_AesThroughput !chromeless_tty? ( +tests_platform_BootPerf ) +tests_platform_CheckErrorsInLog +tests_platform_CleanShutdown +tests_platform_Crossystem +tests_platform_Crouton +tests_platform_DaemonsRespawn +tests_platform_DBusMachineIdRotation encrypted_stateful? ( +tests_platform_EncryptedStateful ) +tests_platform_ExternalUSBBootStress +tests_platform_ExternalUSBStress +tests_platform_FileNum +tests_platform_FileSize biod? ( +tests_platform_Fingerprint ) +tests_platform_Firewall +tests_platform_FullyChargedPowerStatus +tests_platform_HighResTimers +tests_platform_ImageLoader +tests_platform_ImageLoaderServer +tests_platform_KernelVersion +tests_platform_KernelVersionByBoard +tests_platform_LibCBench +tests_platform_LogDupSuppression +tests_platform_LogNonKernelKmsg +tests_platform_MemCheck +tests_platform_MemoryMonitor chromeless_tty? ( +tests_platform_MetricsUploader ) +tests_platform_NetParms +tests_platform_OpenSSLActual profile? ( +tests_platform_Perf +tests_platform_Quipper ) cups? ( +tests_platform_PrinterPpds ) +tests_platform_Rootdev +tests_platform_SecureEraseFile !chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration ) +tests_platform_TabletMode +tests_platform_TempFS network_time? ( +tests_platform_TLSDate +tests_platform_TLSDateActual ) +tests_platform_UdevVars +tests_suite_HWConfig +tests_suite_HWQual +tests_system_ColdBoot +tests_touch_HasInput +tests_touch_UpdateErrors +tests_touch_WakeupSource +tests_usbpd_DisplayPortSink +tests_vpd_ReadWrite cros-debug cros_host cros_workon_tree_14a9d8076c902f08a568ddb20ec257b32a4154b2 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( chromeos-base/metrics dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) tests_security_SMMLocked? ( sys-apps/pciutils ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5a8b59cc5a085765681a58ff1900a6d2
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8849 b/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8849
new file mode 100644
index 0000000..f1bf040
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-0.0.4-r8849
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( >=chromeos-base/metrics-0.0.1-r3152 dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DESCRIPTION=Autotest tests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups dlc_test +encrypted_stateful +network_time +passive_metrics +profile vaapi +autotest x86? ( +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) amd64? ( +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) +tests_profiler_sync +tests_compilebench +tests_crashme +tests_dbench +tests_ddtest +tests_disktest +tests_fsx +tests_hackbench +tests_iperf +tests_bonnie +tests_iozone +tests_netpipe +tests_sleeptest +tests_kernel_sysrq_info +tests_unixbench +tests_autoupdate_Backoff +tests_autoupdate_BadMetadata +tests_autoupdate_CannedOmahaUpdate +tests_autoupdate_DisconnectReconnectNetwork dlc_test? ( +tests_autoupdate_InstallAndUpdateDLC ) +tests_autoupdate_PeriodicCheck +tests_autoupdate_UrlSwitch +tests_blktestsSuiteAll +tests_blktestsSuiteLoopOverBlk +tests_blktestsSuiteLoopOverFile +tests_blktestsSuiteRealBlk +tests_camera_V4L2 arc-camera3? ( +tests_camera_HAL3 +tests_camera_HAL3Perf ) +tests_dummy_Fail +tests_dummy_Pass +tests_dummy_SynchronousOffload tests_example_UnitTest +tests_firmware_LockedME +tests_firmware_RomSize +tests_firmware_SetFWMP +tests_firmware_VbootCrypto +tests_flaky_test +tests_hardware_Badblocks +tests_hardware_DiskSize +tests_hardware_EC +tests_hardware_EepromWriteProtect +tests_hardware_GobiGPS +tests_hardware_GPIOSwitches +tests_hardware_GPS +tests_hardware_I2CProbe +tests_hardware_Interrupt +tests_hardware_Keyboard +tests_hardware_LightSensor +tests_hardware_MemoryLatency +tests_hardware_MemoryThroughput +tests_hardware_MemoryZRAMThroughput +tests_hardware_Memtester +tests_hardware_MultiReader +tests_hardware_ProbeComponents +tests_hardware_RamFio +tests_hardware_RealtekCardReader +tests_hardware_Resolution +tests_hardware_SAT +tests_hardware_Smartctl +tests_hardware_SsdDetection +tests_hardware_StorageFio +tests_hardware_StorageFioOther +tests_hardware_StorageTrim +tests_hardware_StorageWearoutDetect +tests_hardware_TouchScreenPowerCycles tests_hardware_TouchScreenPresent +tests_hardware_TrimIntegrity +tests_infra_FirmwareAutoupdate +tests_kernel_AsyncDriverProbe +tests_kernel_FirmwareRequest +tests_kernel_CrosECSysfsAccel +tests_kernel_Delay +tests_kernel_fs_Punybench +tests_kernel_Ktime +tests_kernel_Lmbench +tests_kernel_Memory_Ramoop +tests_kernel_SchedBandwith crash_reporting? ( +tests_logging_CrashSender +tests_logging_KernelCrash +tests_logging_UdevCrash +tests_logging_UserCrash +tests_platform_AnomalyDetector ) +tests_network_EthCaps +tests_network_EthernetStressPlug +tests_network_Ipv6SimpleNegotiation +tests_network_NegotiatedLANSpeed +tests_platform_AccurateTime +tests_platform_AesThroughput !chromeless_tty? ( +tests_platform_BootPerf ) +tests_platform_CheckErrorsInLog +tests_platform_CleanShutdown +tests_platform_Crossystem +tests_platform_Crouton +tests_platform_DaemonsRespawn +tests_platform_DBusMachineIdRotation encrypted_stateful? ( +tests_platform_EncryptedStateful ) +tests_platform_ExternalUSBBootStress +tests_platform_ExternalUSBStress +tests_platform_FileNum +tests_platform_FileSize biod? ( +tests_platform_Fingerprint ) +tests_platform_Firewall +tests_platform_FullyChargedPowerStatus +tests_platform_HighResTimers +tests_platform_ImageLoader +tests_platform_ImageLoaderServer +tests_platform_KernelVersion +tests_platform_LibCBench +tests_platform_LogDupSuppression +tests_platform_LogNonKernelKmsg +tests_platform_MemCheck +tests_platform_MemoryMonitor chromeless_tty? ( +tests_platform_MetricsUploader ) +tests_platform_NetParms +tests_platform_OpenSSLActual profile? ( +tests_platform_Perf +tests_platform_Quipper ) cups? ( +tests_platform_PrinterPpds ) +tests_platform_Rootdev +tests_platform_SecureEraseFile !chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration ) +tests_platform_TabletMode +tests_platform_TempFS network_time? ( +tests_platform_TLSDate +tests_platform_TLSDateActual ) +tests_platform_UdevVars +tests_suite_HWConfig +tests_suite_HWQual +tests_system_ColdBoot +tests_touch_HasInput +tests_touch_UpdateErrors +tests_touch_WakeupSource +tests_usbpd_DisplayPortSink +tests_vpd_ReadWrite cros-debug cros_host cros_workon_tree_1bf135b0628ee85fd6385a99f35b5526644b7d77 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( >=chromeos-base/metrics-0.0.1-r3152 dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8b3335cf868ac32301e1f2b6ef461144
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-9999
index 1aa6d55..33c8db4 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-9999
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( chromeos-base/metrics dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) tests_security_SMMLocked? ( sys-apps/pciutils ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( >=chromeos-base/metrics-0.0.1-r3152 dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 DESCRIPTION=Autotest tests
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups +encrypted_stateful +network_time +passive_metrics +profile vaapi +autotest x86? ( +tests_security_SMMLocked +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) amd64? ( +tests_security_SMMLocked +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) +tests_profiler_sync +tests_compilebench +tests_crashme +tests_dbench +tests_ddtest +tests_disktest +tests_fsx +tests_hackbench +tests_iperf +tests_bonnie +tests_iozone +tests_netpipe +tests_sleeptest +tests_kernel_sysrq_info +tests_unixbench +tests_autoupdate_Backoff +tests_autoupdate_BadMetadata +tests_autoupdate_CannedOmahaUpdate +tests_autoupdate_DisconnectReconnectNetwork +tests_autoupdate_UrlSwitch +tests_blktestsSuiteAll +tests_blktestsSuiteLoopOverBlk +tests_blktestsSuiteLoopOverFile +tests_blktestsSuiteRealBlk +tests_camera_V4L2 arc-camera3? ( +tests_camera_HAL3 +tests_camera_HAL3Perf ) +tests_dummy_Fail +tests_dummy_Pass +tests_dummy_SynchronousOffload tests_example_UnitTest +tests_firmware_LockedME +tests_firmware_RomSize +tests_firmware_SetFWMP +tests_firmware_VbootCrypto +tests_flaky_test +tests_hardware_Badblocks +tests_hardware_DiskSize +tests_hardware_EC +tests_hardware_EepromWriteProtect +tests_hardware_GobiGPS +tests_hardware_GPIOSwitches +tests_hardware_GPS +tests_hardware_I2CProbe +tests_hardware_Interrupt +tests_hardware_Keyboard +tests_hardware_LightSensor +tests_hardware_MemoryLatency +tests_hardware_MemoryThroughput +tests_hardware_MemoryZRAMThroughput +tests_hardware_Memtester +tests_hardware_MultiReader +tests_hardware_ProbeComponents +tests_hardware_RamFio +tests_hardware_RealtekCardReader +tests_hardware_Resolution +tests_hardware_SAT +tests_hardware_Smartctl +tests_hardware_SsdDetection +tests_hardware_StorageFio +tests_hardware_StorageFioOther +tests_hardware_StorageTrim +tests_hardware_StorageWearoutDetect +tests_hardware_TouchScreenPowerCycles tests_hardware_TouchScreenPresent +tests_hardware_TrimIntegrity +tests_infra_FirmwareAutoupdate +tests_kernel_AsyncDriverProbe +tests_kernel_FirmwareRequest +tests_kernel_CrosECSysfsAccel +tests_kernel_Delay +tests_kernel_fs_Punybench +tests_kernel_Ktime +tests_kernel_Lmbench +tests_kernel_Memory_Ramoop +tests_kernel_SchedBandwith crash_reporting? ( +tests_logging_CrashSender +tests_logging_KernelCrash +tests_logging_UdevCrash +tests_logging_UserCrash +tests_platform_AnomalyDetector ) +tests_network_EthCaps +tests_network_EthernetStressPlug +tests_network_Ipv6SimpleNegotiation +tests_network_NegotiatedLANSpeed +tests_platform_AccurateTime +tests_platform_AesThroughput !chromeless_tty? ( +tests_platform_BootPerf ) +tests_platform_CheckErrorsInLog +tests_platform_CleanShutdown +tests_platform_Crossystem +tests_platform_Crouton +tests_platform_DaemonsRespawn +tests_platform_DBusMachineIdRotation encrypted_stateful? ( +tests_platform_EncryptedStateful ) +tests_platform_ExternalUSBBootStress +tests_platform_ExternalUSBStress +tests_platform_FileNum +tests_platform_FileSize biod? ( +tests_platform_Fingerprint ) +tests_platform_Firewall +tests_platform_FullyChargedPowerStatus +tests_platform_HighResTimers +tests_platform_ImageLoader +tests_platform_ImageLoaderServer +tests_platform_KernelVersion +tests_platform_KernelVersionByBoard +tests_platform_LibCBench +tests_platform_LogDupSuppression +tests_platform_LogNonKernelKmsg +tests_platform_MemCheck +tests_platform_MemoryMonitor chromeless_tty? ( +tests_platform_MetricsUploader ) +tests_platform_NetParms +tests_platform_OpenSSLActual profile? ( +tests_platform_Perf +tests_platform_Quipper ) cups? ( +tests_platform_PrinterPpds ) +tests_platform_Rootdev +tests_platform_SecureEraseFile !chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration ) +tests_platform_TabletMode +tests_platform_TempFS network_time? ( +tests_platform_TLSDate +tests_platform_TLSDateActual ) +tests_platform_UdevVars +tests_suite_HWConfig +tests_suite_HWQual +tests_system_ColdBoot +tests_touch_HasInput +tests_touch_UpdateErrors +tests_touch_WakeupSource +tests_usbpd_DisplayPortSink +tests_vpd_ReadWrite cros-debug cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=arc-camera3 biod -chromeless_tests -chromeless_tty +crash_reporting cups dlc_test +encrypted_stateful +network_time +passive_metrics +profile vaapi +autotest x86? ( +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) amd64? ( +tests_xfsFilesystemTestSuite +tests_hardware_UnsafeMemory ) +tests_profiler_sync +tests_compilebench +tests_crashme +tests_dbench +tests_ddtest +tests_disktest +tests_fsx +tests_hackbench +tests_iperf +tests_bonnie +tests_iozone +tests_netpipe +tests_sleeptest +tests_kernel_sysrq_info +tests_unixbench +tests_autoupdate_Backoff +tests_autoupdate_BadMetadata +tests_autoupdate_CannedOmahaUpdate +tests_autoupdate_DisconnectReconnectNetwork dlc_test? ( +tests_autoupdate_InstallAndUpdateDLC ) +tests_autoupdate_PeriodicCheck +tests_autoupdate_UrlSwitch +tests_blktestsSuiteAll +tests_blktestsSuiteLoopOverBlk +tests_blktestsSuiteLoopOverFile +tests_blktestsSuiteRealBlk +tests_camera_V4L2 arc-camera3? ( +tests_camera_HAL3 +tests_camera_HAL3Perf ) +tests_dummy_Fail +tests_dummy_Pass +tests_dummy_SynchronousOffload tests_example_UnitTest +tests_firmware_LockedME +tests_firmware_RomSize +tests_firmware_SetFWMP +tests_firmware_VbootCrypto +tests_flaky_test +tests_hardware_Badblocks +tests_hardware_DiskSize +tests_hardware_EC +tests_hardware_EepromWriteProtect +tests_hardware_GobiGPS +tests_hardware_GPIOSwitches +tests_hardware_GPS +tests_hardware_I2CProbe +tests_hardware_Interrupt +tests_hardware_Keyboard +tests_hardware_LightSensor +tests_hardware_MemoryLatency +tests_hardware_MemoryThroughput +tests_hardware_MemoryZRAMThroughput +tests_hardware_Memtester +tests_hardware_MultiReader +tests_hardware_ProbeComponents +tests_hardware_RamFio +tests_hardware_RealtekCardReader +tests_hardware_Resolution +tests_hardware_SAT +tests_hardware_Smartctl +tests_hardware_SsdDetection +tests_hardware_StorageFio +tests_hardware_StorageFioOther +tests_hardware_StorageTrim +tests_hardware_StorageWearoutDetect +tests_hardware_TouchScreenPowerCycles tests_hardware_TouchScreenPresent +tests_hardware_TrimIntegrity +tests_infra_FirmwareAutoupdate +tests_kernel_AsyncDriverProbe +tests_kernel_FirmwareRequest +tests_kernel_CrosECSysfsAccel +tests_kernel_Delay +tests_kernel_fs_Punybench +tests_kernel_Ktime +tests_kernel_Lmbench +tests_kernel_Memory_Ramoop +tests_kernel_SchedBandwith crash_reporting? ( +tests_logging_CrashSender +tests_logging_KernelCrash +tests_logging_UdevCrash +tests_logging_UserCrash +tests_platform_AnomalyDetector ) +tests_network_EthCaps +tests_network_EthernetStressPlug +tests_network_Ipv6SimpleNegotiation +tests_network_NegotiatedLANSpeed +tests_platform_AccurateTime +tests_platform_AesThroughput !chromeless_tty? ( +tests_platform_BootPerf ) +tests_platform_CheckErrorsInLog +tests_platform_CleanShutdown +tests_platform_Crossystem +tests_platform_Crouton +tests_platform_DaemonsRespawn +tests_platform_DBusMachineIdRotation encrypted_stateful? ( +tests_platform_EncryptedStateful ) +tests_platform_ExternalUSBBootStress +tests_platform_ExternalUSBStress +tests_platform_FileNum +tests_platform_FileSize biod? ( +tests_platform_Fingerprint ) +tests_platform_Firewall +tests_platform_FullyChargedPowerStatus +tests_platform_HighResTimers +tests_platform_ImageLoader +tests_platform_ImageLoaderServer +tests_platform_KernelVersion +tests_platform_LibCBench +tests_platform_LogDupSuppression +tests_platform_LogNonKernelKmsg +tests_platform_MemCheck +tests_platform_MemoryMonitor chromeless_tty? ( +tests_platform_MetricsUploader ) +tests_platform_NetParms +tests_platform_OpenSSLActual profile? ( +tests_platform_Perf +tests_platform_Quipper ) cups? ( +tests_platform_PrinterPpds ) +tests_platform_Rootdev +tests_platform_SecureEraseFile !chromeless_tty? ( +tests_platform_SessionManagerStateKeyGeneration ) +tests_platform_TabletMode +tests_platform_TempFS network_time? ( +tests_platform_TLSDate +tests_platform_TLSDateActual ) +tests_platform_UdevVars +tests_suite_HWConfig +tests_suite_HWQual +tests_system_ColdBoot +tests_touch_HasInput +tests_touch_UpdateErrors +tests_touch_WakeupSource +tests_usbpd_DisplayPortSink +tests_vpd_ReadWrite cros-debug cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
-RDEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( chromeos-base/metrics dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) tests_security_SMMLocked? ( sys-apps/pciutils ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] autotest? ( chromeos-base/autotest )
+RDEPEND=>=chromeos-base/autotest-deps-0.0.3 !<=chromeos-base/autotest-factory-0.0.1-r4445 dev-python/numpy dev-python/pygobject dev-python/pytest dev-python/python-uinput media-sound/sox sys-apps/ethtool vaapi? ( x11-libs/libva ) virtual/autotest-tests tests_dbench? ( dev-libs/libaio ) tests_platform_MetricsUploader? ( >=chromeos-base/metrics-0.0.1-r3152 dev-python/protobuf-python ) tests_platform_SecureEraseFile? ( chromeos-base/secure-erase-file ) tests_hardware_MemoryLatency? ( app-benchmarks/lmbench ) tests_hardware_MemoryThroughput? ( app-benchmarks/lmbench ) tests_hardware_MemoryZRAMThroughput? ( app-benchmarks/microbenchmarks ) tests_kernel_Lmbench? ( app-benchmarks/lmbench ) arc-camera3? ( tests_camera_HAL3? ( chromeos-base/autotest-deps-camera-hal3 ) tests_camera_HAL3Perf? ( chromeos-base/autotest-deps-camera-hal3 ) ) tests_camera_V4L2? ( media-libs/libyuv dev-libs/re2 ) tests_xfsFilesystemTestSuite? ( app-benchmarks/xfstests ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=60aac8f37184bbfc73cc2d9c0c7db356
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=aa2abae91a4cd75a30dd03186ab21d05
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-0.0.1-r928 b/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-0.0.1-r928
index 2b113c0..da059a7 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-0.0.1-r928
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-0.0.1-r928
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=dev-python/pyxattr chromeos-base/chromeos-chrome chromeos-base/autotest-chrome chromeos-base/telemetry autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=da2a951e95f0becac892161e4d2716e1
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-9999
index c01d3db..1cf313a 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-arc-public-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=dev-python/pyxattr chromeos-base/chromeos-chrome chromeos-base/autotest-chrome chromeos-base/telemetry autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71f462f582c36cc717d33db49e40d592
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3204 b/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3204
deleted file mode 100644
index 51e2571..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3204
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest
-DESCRIPTION=Audio autotests
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_audio_Aconnect +tests_audio_AlsaLoopback +tests_audio_Aplay +tests_audio_CRASFormatConversion +tests_audio_CrasDevSwitchStress +tests_audio_CrasLoopback +tests_audio_CrasPinnedStream +tests_audio_CrasStress +tests_audio_LoopbackLatency cros_host cros_workon_tree_242ee15394971ce82ccce6138b23f63b9fffa635 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=32449c5a9bc07d15a7394727b60bd564
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3215 b/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3215
new file mode 100644
index 0000000..f230311
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-audio-0.0.1-r3215
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest !chromeless_tty? ( chromeos-base/telemetry )
+DESCRIPTION=Audio autotests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest -chromeless_tty +tests_audio_Aconnect +tests_audio_Aplay !chromeless_tty? ( +tests_audio_AudioInputGain +tests_audio_CrasGetNodes ) +tests_audio_CRASFormatConversion +tests_audio_CrasDevSwitchStress +tests_audio_CrasPinnedStream +tests_audio_CrasStress cros_host cros_workon_tree_f93558b8a70c6080afd69871b0752fdf060d768c +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest !chromeless_tty? ( chromeos-base/telemetry ) autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3a7b029ccbcea821f7eeee1484f4ceb7
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-audio-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-audio-9999
index 814f2fb..f71abd4 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-audio-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-audio-9999
@@ -1,13 +1,14 @@
+BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest
+DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest !chromeless_tty? ( chromeos-base/telemetry )
 DESCRIPTION=Audio autotests
-EAPI=4
+EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_audio_Aconnect +tests_audio_AlsaLoopback +tests_audio_Aplay +tests_audio_CRASFormatConversion +tests_audio_CrasDevSwitchStress +tests_audio_CrasLoopback +tests_audio_CrasPinnedStream +tests_audio_CrasStress +tests_audio_LoopbackLatency cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest -chromeless_tty +tests_audio_Aconnect +tests_audio_Aplay !chromeless_tty? ( +tests_audio_AudioInputGain +tests_audio_CrasGetNodes ) +tests_audio_CRASFormatConversion +tests_audio_CrasDevSwitchStress +tests_audio_CrasPinnedStream +tests_audio_CrasStress cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest autotest? ( chromeos-base/autotest )
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/audiotest !chromeless_tty? ( chromeos-base/telemetry ) autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3c9572811590985b78cbb299a0e914af
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=05874d4109d6dc81df032b30626081bf
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3231 b/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3231
deleted file mode 100644
index 4ee4968..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3231
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.2 chromeos-base/autotest-deps-cellular chromeos-base/shill-test-scripts dev-python/pygobject dev-python/pyusb sys-apps/ethtool
-DESCRIPTION=Cellular autotests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_cellular_ActivateLTE +tests_cellular_ConnectFailure +tests_cellular_DeferredRegistration +tests_cellular_DisableWhileConnecting +tests_cellular_DisconnectFailure +tests_cellular_Identifiers +tests_cellular_OutOfCreditsSubscriptionState +tests_cellular_SIMLocking +tests_cellular_SafetyDance +tests_cellular_ScanningProperty +tests_cellular_ServiceName +tests_cellular_Smoke +tests_cellular_StressEnable +tests_cellular_MbimComplianceControlCommand +tests_cellular_MbimComplianceControlRequest +tests_cellular_MbimComplianceDataTransfer +tests_cellular_MbimComplianceDescriptor +tests_cellular_MbimComplianceError cros_host cros_workon_tree_f32bcca367662af667f3f3bd9204618d002bb13a +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.2 chromeos-base/autotest-deps-cellular chromeos-base/shill-test-scripts dev-python/pygobject dev-python/pyusb sys-apps/ethtool autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e7e01053464ada97180b8fd7b13827c7
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3232 b/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3232
new file mode 100644
index 0000000..aec12ff
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cellular-0.0.1-r3232
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.2 chromeos-base/autotest-deps-cellular chromeos-base/shill-test-scripts dev-python/pygobject dev-python/pyusb sys-apps/ethtool
+DESCRIPTION=Cellular autotests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_cellular_ActivateLTE +tests_cellular_ConnectFailure +tests_cellular_DeferredRegistration +tests_cellular_DisableWhileConnecting +tests_cellular_DisconnectFailure +tests_cellular_Identifiers +tests_cellular_OutOfCreditsSubscriptionState +tests_cellular_SIMLocking +tests_cellular_SafetyDance +tests_cellular_ScanningProperty +tests_cellular_ServiceName +tests_cellular_Smoke +tests_cellular_StressEnable +tests_cellular_MbimComplianceControlCommand +tests_cellular_MbimComplianceControlRequest +tests_cellular_MbimComplianceDataTransfer +tests_cellular_MbimComplianceDescriptor +tests_cellular_MbimComplianceError cros_host cros_workon_tree_e0520deac538428a08c61ba6accd41590595dd7a +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.2 chromeos-base/autotest-deps-cellular chromeos-base/shill-test-scripts dev-python/pygobject dev-python/pyusb sys-apps/ethtool autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8730eff20acda1420445145d170196f0
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cellular-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-cellular-9999
index e6572ba..62db788 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cellular-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cellular-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.2 chromeos-base/autotest-deps-cellular chromeos-base/shill-test-scripts dev-python/pygobject dev-python/pyusb sys-apps/ethtool autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f8859b60a085fc24b8988e32f7a5b451
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-0.0.1-r2438 b/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-0.0.1-r2438
deleted file mode 100644
index cb89d2e..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-0.0.1-r2438
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=autotests for cloud services related functionality
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_buffet_BasicDBusAPI +tests_buffet_Registration +tests_buffet_RestartWhenRegistered +tests_buffet_RefreshAccessToken +tests_buffet_InvalidCredentials +tests_buffet_IntermittentConnectivity cros_host cros_workon_tree_0403c48eb6c76d705968f240a92353631701a279 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6a426dd88b313dcd14777df16192029d
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-9999
deleted file mode 100644
index de6ab86..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cloud-services-9999
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=autotests for cloud services related functionality
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_buffet_BasicDBusAPI +tests_buffet_Registration +tests_buffet_RestartWhenRegistered +tests_buffet_RefreshAccessToken +tests_buffet_InvalidCredentials +tests_buffet_IntermittentConnectivity cros_host cros_workon_tree_ +buildcheck autotest opengles
-KEYWORDS=~*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0bb183de77551917b84251dcd8ff32fa
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3185 b/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3185
deleted file mode 100644
index 2f9dbb5..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3185
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3
-DESCRIPTION=cros-disks autotests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_platform_CrosDisksArchive +tests_platform_CrosDisksFilesystem +tests_platform_CrosDisksFormat +tests_platform_CrosDisksRename +tests_platform_CrosDisksSshfs cros_host cros_workon_tree_fdedfbe7ec1ca9fc1a826d793c1579084ff956f3 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ded3984e5ecb819549d632e95488805b
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3196 b/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3196
new file mode 100644
index 0000000..5ae133a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-0.0.1-r3196
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3
+DESCRIPTION=cros-disks autotests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_platform_CrosDisksArchive +tests_platform_CrosDisksFilesystem +tests_platform_CrosDisksFormat +tests_platform_CrosDisksRename +tests_platform_CrosDisksSshfs cros_host cros_workon_tree_f93558b8a70c6080afd69871b0752fdf060d768c +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1ee31023f0996fa009108627d28ed913
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-9999
index 503782f..49f6e26 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cros-disks-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7f4ee1ccf94656cc8750ffac10ffdb2a
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3180 b/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3180
deleted file mode 100644
index 93a6f91..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3180
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3
-DESCRIPTION=Cryptohome autotests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_platform_BootLockbox +tests_platform_CryptohomeBadPerms +tests_platform_CryptohomeChangePassword +tests_platform_CryptohomeFio +tests_platform_CryptohomeGetEnrollmentId +tests_platform_CryptohomeKeyEviction +tests_platform_CryptohomeLECredentialManager +tests_platform_CryptohomeLECredentialManagerServer +tests_platform_CryptohomeMigrateChapsToken +tests_platform_CryptohomeMigrateChapsTokenClient +tests_platform_CryptohomeMigrateKey +tests_platform_CryptohomeMount +tests_platform_CryptohomeMultiple +tests_platform_CryptohomeNonDirs +tests_platform_CryptohomeStress +tests_platform_CryptohomeTestAuth +tests_platform_CryptohomeTpmLiveTest +tests_platform_CryptohomeTpmLiveTestServer +tests_platform_CryptohomeTPMReOwn +tests_platform_CryptohomeTPMReOwnServer cros_host cros_workon_tree_0403c48eb6c76d705968f240a92353631701a279 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/cryptohome-dev-utils autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5a1099d75773a1038253e086bf8f184e
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3181 b/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3181
new file mode 100644
index 0000000..ae39518
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-0.0.1-r3181
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3
+DESCRIPTION=Cryptohome autotests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_platform_BootLockbox +tests_platform_CryptohomeBadPerms +tests_platform_CryptohomeChangePassword +tests_platform_CryptohomeFio +tests_platform_CryptohomeKeyEviction +tests_platform_CryptohomeLECredentialManager +tests_platform_CryptohomeLECredentialManagerServer +tests_platform_CryptohomeMigrateChapsToken +tests_platform_CryptohomeMigrateChapsTokenClient +tests_platform_CryptohomeMigrateKey +tests_platform_CryptohomeMount +tests_platform_CryptohomeMultiple +tests_platform_CryptohomeNonDirs +tests_platform_CryptohomeStress +tests_platform_CryptohomeTestAuth +tests_platform_CryptohomeTpmLiveTest +tests_platform_CryptohomeTpmLiveTestServer +tests_platform_CryptohomeTPMReOwn +tests_platform_CryptohomeTPMReOwnServer cros_host cros_workon_tree_c34d264bfd49429b59f604ee48149e6d8c824b3d +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/cryptohome-dev-utils autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7f2c1deb4fbb58f75b34d110934155b8
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-9999
index a23da16..eade58a 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-cryptohome-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=Cryptohome autotests
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_platform_BootLockbox +tests_platform_CryptohomeBadPerms +tests_platform_CryptohomeChangePassword +tests_platform_CryptohomeFio +tests_platform_CryptohomeGetEnrollmentId +tests_platform_CryptohomeKeyEviction +tests_platform_CryptohomeLECredentialManager +tests_platform_CryptohomeLECredentialManagerServer +tests_platform_CryptohomeMigrateChapsToken +tests_platform_CryptohomeMigrateChapsTokenClient +tests_platform_CryptohomeMigrateKey +tests_platform_CryptohomeMount +tests_platform_CryptohomeMultiple +tests_platform_CryptohomeNonDirs +tests_platform_CryptohomeStress +tests_platform_CryptohomeTestAuth +tests_platform_CryptohomeTpmLiveTest +tests_platform_CryptohomeTpmLiveTestServer +tests_platform_CryptohomeTPMReOwn +tests_platform_CryptohomeTPMReOwnServer cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest +tests_platform_BootLockbox +tests_platform_CryptohomeBadPerms +tests_platform_CryptohomeChangePassword +tests_platform_CryptohomeFio +tests_platform_CryptohomeKeyEviction +tests_platform_CryptohomeLECredentialManager +tests_platform_CryptohomeLECredentialManagerServer +tests_platform_CryptohomeMigrateChapsToken +tests_platform_CryptohomeMigrateChapsTokenClient +tests_platform_CryptohomeMigrateKey +tests_platform_CryptohomeMount +tests_platform_CryptohomeMultiple +tests_platform_CryptohomeNonDirs +tests_platform_CryptohomeStress +tests_platform_CryptohomeTestAuth +tests_platform_CryptohomeTpmLiveTest +tests_platform_CryptohomeTpmLiveTestServer +tests_platform_CryptohomeTPMReOwn +tests_platform_CryptohomeTPMReOwnServer cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/cryptohome-dev-utils autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e1bc70e6d4bcf1f6a068787d35335785
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8d11cad846c3d4051389f36a2fc80a22
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-debugd-0.0.1-r3177 b/metadata/md5-cache/chromeos-base/autotest-tests-debugd-0.0.1-r3177
index b5da787..56ca376 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-debugd-0.0.1-r3177
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-debugd-0.0.1-r3177
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e0fa7cb857556ca264c1228d90d4a647
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-debugd-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-debugd-9999
index 668325b..d206a06 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-debugd-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-debugd-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2ae8be6d5185e85d7aedd1af934f52eb
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3238 b/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3238
deleted file mode 100644
index d433191..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3238
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-graphics tests_graphics_Gbm? ( media-libs/minigbm ) tests_graphics_GLBench? ( chromeos-base/glbench ) tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 ) tests_graphics_SanAngeles? ( media-libs/waffle )
-DESCRIPTION=Graphics autotests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_graphics_dEQP +tests_graphics_Gbm +tests_graphics_GLAPICheck +tests_graphics_GLBench +tests_graphics_GLMark2 +tests_graphics_KernelConfig +tests_graphics_KernelMemory +tests_graphics_LibDRM +tests_graphics_PerfControl +tests_graphics_SanAngeles +tests_graphics_SyncControlTest asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_0403c48eb6c76d705968f240a92353631701a279 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-graphics tests_graphics_Gbm? ( media-libs/minigbm ) tests_graphics_GLBench? ( chromeos-base/glbench ) tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 ) tests_graphics_SanAngeles? ( media-libs/waffle ) autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=93274a3af1a9ae647c0368bd1608cb41
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3240 b/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3240
new file mode 100644
index 0000000..640cae8
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-graphics-0.0.1-r3240
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-graphics tests_graphics_Gbm? ( media-libs/minigbm ) tests_graphics_GLBench? ( chromeos-base/glbench ) tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 ) tests_graphics_SanAngeles? ( media-libs/waffle )
+DESCRIPTION=Graphics autotests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_graphics_dEQP +tests_graphics_Gbm +tests_graphics_GLAPICheck +tests_graphics_GLBench +tests_graphics_GLMark2 +tests_graphics_KernelConfig +tests_graphics_KernelMemory +tests_graphics_LibDRM +tests_graphics_PerfControl +tests_graphics_SanAngeles +tests_graphics_SyncControlTest asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_351b54172e899e93c98ef90a9420a356aefaeabc +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-graphics tests_graphics_Gbm? ( media-libs/minigbm ) tests_graphics_GLBench? ( chromeos-base/glbench ) tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 ) tests_graphics_SanAngeles? ( media-libs/waffle ) autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ed306a7fa6d1a6f9dd5701b7884543e6
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-graphics-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-graphics-9999
index d18c6af..cfb07b7 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-graphics-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-graphics-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-graphics tests_graphics_Gbm? ( media-libs/minigbm ) tests_graphics_GLBench? ( chromeos-base/glbench ) tests_graphics_GLMark2? ( chromeos-base/autotest-deps-glmark2 ) tests_graphics_SanAngeles? ( media-libs/waffle ) autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2fc6ef6ee2e7af9b80815d45c897a935
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-ltp-0.0.1-r6722 b/metadata/md5-cache/chromeos-base/autotest-tests-ltp-0.0.1-r6722
index 000580b..d5efe28 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-ltp-0.0.1-r6722
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-ltp-0.0.1-r6722
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-ltp chromeos-base/protofiles dev-python/protobuf-python dev-python/pygobject !<chromeos-base/autotest-tests-0.0.1-r1723 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=878f3baefd7a701fe0b2d19575e2db6e
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-ltp-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-ltp-9999
index cfecf29..a2b52c9 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-ltp-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-ltp-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-ltp chromeos-base/protofiles dev-python/protobuf-python dev-python/pygobject !<chromeos-base/autotest-tests-0.0.1-r1723 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a5f0a5fff156b06a5ce44ff47a0bbc8d
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-0.0.1-r7891 b/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-0.0.1-r7891
index ea55ecd..44695ab 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-0.0.1-r7891
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-0.0.1-r7891
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-dbus chromeos-base/autotest-deps-policy chromeos-base/chromeos-chrome chromeos-base/telemetry dev-python/protobuf-python dev-python/pygobject autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6f9b654499d4fe2d303eb706472b1ec7
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-9999
index 7b91fc9..3eff390 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-ownershipapi-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-dbus chromeos-base/autotest-deps-policy chromeos-base/chromeos-chrome chromeos-base/telemetry dev-python/protobuf-python dev-python/pygobject autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d0e3f5ccc2a0eb23cdeda63e0535271e
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-p2p-0.0.1-r3163 b/metadata/md5-cache/chromeos-base/autotest-tests-p2p-0.0.1-r3163
index 2d2cdd4..896bb5f 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-p2p-0.0.1-r3163
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-p2p-0.0.1-r3163
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-p2p autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f41edd02427a192aef1c7365da436e2d
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-p2p-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-p2p-9999
index 1cb53d3..7e14fd9 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-p2p-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-p2p-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/autotest-deps-p2p autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=31fa0b52716282fb32256a3f4d37122e
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3222 b/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3222
deleted file mode 100644
index ff7e691..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3222
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=shill? ( chromeos-base/shill-test-scripts ) !<chromeos-base/autotest-tests-0.0.3
-DESCRIPTION=power autotests
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +shill +tests_hardware_Backlight +tests_power_ARMSettings +tests_power_Backlight +tests_power_BacklightControl +tests_power_BacklightSuspend +tests_power_BatteryCharge +tests_power_CameraSuspend +tests_power_CheckAC +tests_power_CheckAfterSuspend +tests_power_CPUFreq +tests_power_CPUIdle +tests_power_Draw +tests_power_Dummy +tests_power_HotCPUSuspend +tests_power_KernelSuspend +tests_power_MemorySuspend +tests_power_NoConsoleSuspend +tests_power_ProbeDriver shill? ( +tests_power_Resume ) +tests_power_Standby +tests_power_StatsCPUFreq +tests_power_StatsCPUIdle +tests_power_StatsUSB +tests_power_Status shill? ( +tests_power_SuspendStress +tests_power_SuspendToIdle ) +tests_power_WaitForCoolDown +tests_power_WakeupRTC cros_host cros_workon_tree_e7896d2d7bdc3febf5f53fabc2c82a82fbc38131 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=shill? ( chromeos-base/shill-test-scripts ) !<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4096c748abb4e25e2650f650e870d421
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3226 b/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3226
new file mode 100644
index 0000000..c41e6b2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-power-0.0.1-r3226
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=shill? ( chromeos-base/shill-test-scripts ) !<chromeos-base/autotest-tests-0.0.3
+DESCRIPTION=power autotests
+EAPI=4
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +shill +tests_hardware_Backlight +tests_power_ARMSettings +tests_power_Backlight +tests_power_BacklightControl +tests_power_BacklightSuspend +tests_power_BatteryCharge +tests_power_CheckAC +tests_power_CheckAfterSuspend +tests_power_CPUFreq +tests_power_CPUIdle +tests_power_Draw +tests_power_Dummy +tests_power_HotCPUSuspend +tests_power_KernelSuspend +tests_power_MemorySuspend +tests_power_NoConsoleSuspend +tests_power_ProbeDriver shill? ( +tests_power_Resume ) +tests_power_Standby +tests_power_StatsCPUFreq +tests_power_StatsCPUIdle +tests_power_StatsUSB +tests_power_Status shill? ( +tests_power_SuspendStress +tests_power_SuspendToIdle ) +tests_power_WaitForCoolDown +tests_power_WakeupRTC cros_host cros_workon_tree_147762ef4e023969c0cb78aef2ad2560f762c90f +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=shill? ( chromeos-base/shill-test-scripts ) !<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dee45c0057bec5f1ea08e7e21b93d71b
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-power-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-power-9999
index 00d0c7b..fbb10d3 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-power-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-power-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=power autotests
 EAPI=4
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +shill +tests_hardware_Backlight +tests_power_ARMSettings +tests_power_Backlight +tests_power_BacklightControl +tests_power_BacklightSuspend +tests_power_BatteryCharge +tests_power_CameraSuspend +tests_power_CheckAC +tests_power_CheckAfterSuspend +tests_power_CPUFreq +tests_power_CPUIdle +tests_power_Draw +tests_power_Dummy +tests_power_HotCPUSuspend +tests_power_KernelSuspend +tests_power_MemorySuspend +tests_power_NoConsoleSuspend +tests_power_ProbeDriver shill? ( +tests_power_Resume ) +tests_power_Standby +tests_power_StatsCPUFreq +tests_power_StatsCPUIdle +tests_power_StatsUSB +tests_power_Status shill? ( +tests_power_SuspendStress +tests_power_SuspendToIdle ) +tests_power_WaitForCoolDown +tests_power_WakeupRTC cros_host cros_workon_tree_ +buildcheck autotest opengles
+IUSE=+autotest +shill +tests_hardware_Backlight +tests_power_ARMSettings +tests_power_Backlight +tests_power_BacklightControl +tests_power_BacklightSuspend +tests_power_BatteryCharge +tests_power_CheckAC +tests_power_CheckAfterSuspend +tests_power_CPUFreq +tests_power_CPUIdle +tests_power_Draw +tests_power_Dummy +tests_power_HotCPUSuspend +tests_power_KernelSuspend +tests_power_MemorySuspend +tests_power_NoConsoleSuspend +tests_power_ProbeDriver shill? ( +tests_power_Resume ) +tests_power_Standby +tests_power_StatsCPUFreq +tests_power_StatsCPUIdle +tests_power_StatsUSB +tests_power_Status shill? ( +tests_power_SuspendStress +tests_power_SuspendToIdle ) +tests_power_WaitForCoolDown +tests_power_WakeupRTC cros_host cros_workon_tree_ +buildcheck autotest opengles
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=shill? ( chromeos-base/shill-test-scripts ) !<chromeos-base/autotest-tests-0.0.3 autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=31e8e86dcd2ce83378039a0dfbdced0f
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=87a2a8410bc4e7f66ab0531bdd57759e
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3299 b/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3299
deleted file mode 100644
index 91cbf25..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3299
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3 containers? ( tests_security_Libcontainer? ( chromeos-base/minijail chromeos-base/libcontainer ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-DESCRIPTION=Security autotests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest -chromeless_tests -chromeless_tty containers +seccomp selinux !chromeless_tty? ( !chromeless_tests? ( +tests_security_RendererSandbox +tests_security_SessionManagerDbusEndpoints ) ) seccomp? ( +tests_security_SeccompSyscallFilters ) containers? ( +tests_security_Libcontainer ) +tests_security_NosymfollowMountOption +tests_security_ProcessManagementPolicy +tests_security_RootfsOwners +tests_security_SysVIPC x86? ( +tests_security_x86Registers ) amd64? ( +tests_security_x86Registers ) cros_host cros_workon_tree_3dbede8d5e4384eb19daf7b80a82cbc312320791 +buildcheck autotest opengles cros-debug
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 containers? ( tests_security_Libcontainer? ( chromeos-base/minijail chromeos-base/libcontainer ) ) autotest? ( chromeos-base/autotest ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=30218f91085588adefe7e2ce972e1688
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3301 b/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3301
new file mode 100644
index 0000000..7163d56
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-security-0.0.1-r3301
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3 containers? ( tests_security_Libcontainer? ( chromeos-base/minijail chromeos-base/libcontainer ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DESCRIPTION=Security autotests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest -chromeless_tests -chromeless_tty containers +seccomp selinux !chromeless_tty? ( !chromeless_tests? ( +tests_security_RendererSandbox +tests_security_SessionManagerDbusEndpoints ) ) seccomp? ( +tests_security_SeccompSyscallFilters ) containers? ( +tests_security_Libcontainer ) +tests_security_NosymfollowMountOption +tests_security_ProcessManagementPolicy +tests_security_RootfsOwners +tests_security_SysVIPC x86? ( +tests_security_x86Registers ) amd64? ( +tests_security_x86Registers ) cros_host cros_workon_tree_88aeb70b515a41f329432d545d85f3b8a883666a +buildcheck autotest opengles cros-debug
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 containers? ( tests_security_Libcontainer? ( chromeos-base/minijail chromeos-base/libcontainer ) ) autotest? ( chromeos-base/autotest ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2aeb60f4bea372116cd9b916997d21d8
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-security-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-security-9999
index 80eb06c..5f54e9a2 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-security-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-security-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 containers? ( tests_security_Libcontainer? ( chromeos-base/minijail chromeos-base/libcontainer ) ) autotest? ( chromeos-base/autotest ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a9ec7441af874a191bf07e377f922585
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-shill-0.0.1-r3230 b/metadata/md5-cache/chromeos-base/autotest-tests-shill-0.0.1-r3230
index 21d4cbb..90d437c 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-shill-0.0.1-r3230
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-shill-0.0.1-r3230
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/shill-test-scripts autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=785512cce12f219f8e12231c98fd9d22
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-shill-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-shill-9999
index da6837c..a99455f 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-shill-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-shill-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/shill-test-scripts autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3919778a6a9a4a04f45fc657e5c0102c
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-0.0.1-r8 b/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-0.0.1-r8
index a43fd55..5899909 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-0.0.1-r8
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-0.0.1-r8
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-chrome chromeos-base/autotest-chrome autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a42596e348a9690b98bffaa68e9f47f0
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-9999
index 0afa13f..895a128 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-smbprovider-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-chrome chromeos-base/autotest-chrome autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0a46a6f0ed87aa540c0d3aa933100622
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-0.0.1-r7 b/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-0.0.1-r7
index 04ba666..8275bfe 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-0.0.1-r7
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-0.0.1-r7
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/toolchain-tests autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3e7f650b7ac7d16e4d4eab6ea349763a
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-9999
index 8aac986..dcc2ca1 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-toolchain-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 chromeos-base/toolchain-tests autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=efb1f6664bea2d10b7b5c2122370d8bb
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-0.0.1-r4171 b/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-0.0.1-r4171
index 9140077..8acf2dd 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-0.0.1-r4171
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-0.0.1-r4171
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-touchpad autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7eba7f22db65cebaf2779fcbc71001b9
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-9999
index 10df6ff..474cdcd 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-touchpad-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/autotest-deps-touchpad autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f38e34bccfeb2ff163756031b1ebb98c
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3179 b/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3179
deleted file mode 100644
index 740c9a9..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3179
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=!<chromeos-base/autotest-tests-0.0.3 tpm2? ( chromeos-base/g2f_tools )
-DESCRIPTION=Autotests involving the tpm
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest tpm2 +tests_firmware_Cr50VirtualNVRam +tests_firmware_Cr50VirtualNVRamServer +tests_firmware_Cr50U2fPowerwash +tests_hardware_TPMCheck +tests_kernel_TPMStress +tests_platform_Pkcs11InitUnderErrors +tests_platform_Pkcs11ChangeAuthData +tests_platform_Pkcs11Events +tests_platform_Pkcs11LoadPerf +tests_platform_TPMEvict cros_host cros_workon_tree_eda22a9d32fc23478a0375ca2ee83c57fd3ea143 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!<chromeos-base/autotest-tests-0.0.3 tpm2? ( chromeos-base/g2f_tools ) autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1356f293e1eebd53f8695ff3f45d8701
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3181 b/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3181
new file mode 100644
index 0000000..2a3b0ab
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-tpm-0.0.1-r3181
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=!<chromeos-base/autotest-tests-0.0.3 tpm2? ( chromeos-base/g2f_tools )
+DESCRIPTION=Autotests involving the tpm
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest tpm2 +tests_firmware_Cr50VirtualNVRam +tests_firmware_Cr50VirtualNVRamServer +tests_firmware_Cr50U2fPowerwash +tests_hardware_TPMCheck +tests_kernel_TPMStress +tests_platform_Pkcs11InitUnderErrors +tests_platform_Pkcs11ChangeAuthData +tests_platform_Pkcs11Events +tests_platform_Pkcs11LoadPerf +tests_platform_TPMEvict cros_host cros_workon_tree_6451cb30fa4cf9b6fddc40ecafa734b421239f7f +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!<chromeos-base/autotest-tests-0.0.3 tpm2? ( chromeos-base/g2f_tools ) autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d4082101f669281b6e19da9acd1f8ae6
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-tpm-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-tpm-9999
index 8790870..c907eac 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-tpm-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-tpm-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!<chromeos-base/autotest-tests-0.0.3 tpm2? ( chromeos-base/g2f_tools ) autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c29804d9583787c9a453a2994d292312
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r1280 b/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r1280
new file mode 100644
index 0000000..e969790
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r1280
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=kvm host autotests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=+autotest +tests_vm_CrosVmStart cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625 +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0242701eedc9c8c7b7144f72e3d2ef72
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r717 b/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r717
deleted file mode 100644
index 44fa40f..0000000
--- a/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-0.0.1-r717
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=kvm host autotests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=+autotest +tests_vm_CrosVmStart cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d7fd7977049b0a8beb3aa6edae737943
diff --git a/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-9999 b/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-9999
index ca32b48..c293a90 100644
--- a/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-9999
+++ b/metadata/md5-cache/chromeos-base/autotest-tests-vm-host-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e7265fb27c3e103602cd72bdfe5ac772
diff --git a/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r2996 b/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r2996
deleted file mode 100644
index 1738e40..0000000
--- a/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r2996
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=vaapi? ( x11-libs/libva )
-DESCRIPTION=Autotest label detector for audio/video/camera
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/avtest_label_detect
-IUSE=-asan v4l2_codec vaapi asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c11986ea7910ed5f894d61521de3c36440a2b812_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=vaapi? ( x11-libs/libva )
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3af0ca6a09b32a424582d574e8d62145
diff --git a/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r3017 b/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r3017
new file mode 100644
index 0000000..b74fe92
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/avtest_label_detect-0.0.1-r3017
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=vaapi? ( x11-libs/libva )
+DESCRIPTION=Autotest label detector for audio/video/camera
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/avtest_label_detect
+IUSE=-asan v4l2_codec vaapi asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_663c1accb23d479e49928219593b0f82d782ba9c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=vaapi? ( x11-libs/libva )
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1d2ebbfc4a283fb3c0c06763f1b4787f
diff --git a/metadata/md5-cache/chromeos-base/avtest_label_detect-9999 b/metadata/md5-cache/chromeos-base/avtest_label_detect-9999
index bc5fe84..d7cb5ef 100644
--- a/metadata/md5-cache/chromeos-base/avtest_label_detect-9999
+++ b/metadata/md5-cache/chromeos-base/avtest_label_detect-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=vaapi? ( x11-libs/libva )
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=17551db4d9d7ba2a09d09b923b8785e5
diff --git a/metadata/md5-cache/chromeos-base/battery_updater-0.0.1-r12 b/metadata/md5-cache/chromeos-base/battery_updater-0.0.1-r12
index e0224ec..e346f3d 100644
--- a/metadata/md5-cache/chromeos-base/battery_updater-0.0.1-r12
+++ b/metadata/md5-cache/chromeos-base/battery_updater-0.0.1-r12
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=933d027dfee22b1bc83108064f2ec0cd
diff --git a/metadata/md5-cache/chromeos-base/battery_updater-9999 b/metadata/md5-cache/chromeos-base/battery_updater-9999
index 99bc602..00bdff0 100644
--- a/metadata/md5-cache/chromeos-base/battery_updater-9999
+++ b/metadata/md5-cache/chromeos-base/battery_updater-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f5dbdf2d0327c927274e94a18a948c99
diff --git a/metadata/md5-cache/chromeos-base/biod-0.0.1-r1755 b/metadata/md5-cache/chromeos-base/biod-0.0.1-r1755
deleted file mode 100644
index a1f2293..0000000
--- a/metadata/md5-cache/chromeos-base/biod-0.0.1-r1755
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= chromeos-base/chromeos-ec-headers:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] dev-libs/openssl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Biometrics Daemon for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md
-IUSE=fp_on_power_button fpmcu_firmware_bloonchipper fpmcu_firmware_dartmonkey fpmcu_firmware_nami fpmcu_firmware_nocturne fuzzer generated_cros_config unibuild fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d976cad29494daaa43f5b4806faec13ac9684285_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d976cad29494daaa43f5b4806faec13ac9684285_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= sys-apps/flashrom virtual/chromeos-firmware-fpmcu fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper ) fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey ) fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami ) fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r1755
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=be36631bcc8fdaa63a7c97f883b797e7
diff --git a/metadata/md5-cache/chromeos-base/biod-0.0.1-r1839 b/metadata/md5-cache/chromeos-base/biod-0.0.1-r1839
new file mode 100644
index 0000000..f45e9b1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/biod-0.0.1-r1839
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= chromeos-base/chromeos-ec-headers:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] dev-libs/openssl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Biometrics Daemon for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md
+IUSE=fp_on_power_button fpmcu_firmware_bloonchipper fpmcu_firmware_dartmonkey fpmcu_firmware_nami fpmcu_firmware_nocturne fuzzer generated_cros_config unibuild fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa757d388d71b4ff74cb86f5b347b35fc9b65e46_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa757d388d71b4ff74cb86f5b347b35fc9b65e46_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= sys-apps/flashrom virtual/chromeos-firmware-fpmcu fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper ) fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey ) fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami ) fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r1839
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=48accfd31724c310d43940de66f870af
diff --git a/metadata/md5-cache/chromeos-base/biod-9999 b/metadata/md5-cache/chromeos-base/biod-9999
index ac107fb..08037fe 100644
--- a/metadata/md5-cache/chromeos-base/biod-9999
+++ b/metadata/md5-cache/chromeos-base/biod-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= chromeos-base/chromeos-ec-headers:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] dev-libs/openssl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= chromeos-base/chromeos-ec-headers:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] dev-libs/openssl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Biometrics Daemon for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= sys-apps/flashrom virtual/chromeos-firmware-fpmcu fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper ) fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey ) fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami ) fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= sys-apps/flashmap:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/biod_proxy:= sys-apps/flashrom virtual/chromeos-firmware-fpmcu fpmcu_firmware_bloonchipper? ( sys-firmware/chromeos-fpmcu-release-bloonchipper ) fpmcu_firmware_dartmonkey? ( sys-firmware/chromeos-fpmcu-release-dartmonkey ) fpmcu_firmware_nami? ( sys-firmware/chromeos-fpmcu-release-nami ) fpmcu_firmware_nocturne? ( sys-firmware/chromeos-fpmcu-release-nocturne ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=2cf24037aaccdff401d27a4ddcbf8e88
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=248cb1fa051fa408b4407a7c9eb5626b
diff --git a/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r47 b/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r47
new file mode 100644
index 0000000..b0cce57
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r47
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=DBus Proxy Library for Biometrics Daemon for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa757d388d71b4ff74cb86f5b347b35fc9b65e46_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa757d388d71b4ff74cb86f5b347b35fc9b65e46_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r47
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=87216afa2239e4d08222dae599a89b11
diff --git a/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r7 b/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r7
deleted file mode 100644
index ff60909..0000000
--- a/metadata/md5-cache/chromeos-base/biod_proxy-0.0.1-r7
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=DBus Proxy Library for Biometrics Daemon for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/biod/README.md
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d976cad29494daaa43f5b4806faec13ac9684285_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d976cad29494daaa43f5b4806faec13ac9684285_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r7
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f8013cd7cf4b63ab5e37869e13761c1a
diff --git a/metadata/md5-cache/chromeos-base/biod_proxy-9999 b/metadata/md5-cache/chromeos-base/biod_proxy-9999
index c57a4ee..17fec01 100644
--- a/metadata/md5-cache/chromeos-base/biod_proxy-9999
+++ b/metadata/md5-cache/chromeos-base/biod_proxy-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d9321d4ca71097984bd7b3db12bdc712
diff --git a/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r535 b/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r535
deleted file mode 100644
index 1e418a7..0000000
--- a/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r535
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chromeos-config-tools:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) net-wireless/bluez:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Bluetooth service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bluetooth
-IUSE=+bluetooth_suspend_management fuzzer generated_cros_config seccomp unibuild cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_933f0271b1e165dd2cf312b75f832c6d423a8e74_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_933f0271b1e165dd2cf312b75f832c6d423a8e74_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-config-tools:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) net-wireless/bluez:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r535
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6ef4bdc3edad7359d3646c0c32fb58eb
diff --git a/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r591 b/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r591
new file mode 100644
index 0000000..42f9224
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/bluetooth-0.0.1-r591
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chromeos-config-tools:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) net-wireless/bluez:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Bluetooth service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bluetooth
+IUSE=+bluetooth_suspend_management fuzzer generated_cros_config seccomp unibuild cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_5400381b0bd5ab89ecc95178a6d76a1520b57f96_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_5400381b0bd5ab89ecc95178a6d76a1520b57f96_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-config-tools:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) net-wireless/bluez:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r591
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c11e4b4fb0d6de760f1a73382166950a
diff --git a/metadata/md5-cache/chromeos-base/bluetooth-9999 b/metadata/md5-cache/chromeos-base/bluetooth-9999
index 142bc8e..0e783a5 100644
--- a/metadata/md5-cache/chromeos-base/bluetooth-9999
+++ b/metadata/md5-cache/chromeos-base/bluetooth-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chromeos-config-tools:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) net-wireless/bluez:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2b155b29e50e6488f5739ddfdd3e6747
diff --git a/metadata/md5-cache/chromeos-base/bootid-logger-0.0.1-r3 b/metadata/md5-cache/chromeos-base/bootid-logger-0.0.1-r3
new file mode 100644
index 0000000..3ea77c0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/bootid-logger-0.0.1-r3
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Log viewer for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bootid-logger
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_664fa34383cd9fe39960fcd4241965835a4e2bff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_664fa34383cd9fe39960fcd4241965835a4e2bff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<=chromeos-base/croslog-0.0.1-r44 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cf3b224b1d5a235bb18419bcbb00e966
diff --git a/metadata/md5-cache/chromeos-base/bootid-logger-9999 b/metadata/md5-cache/chromeos-base/bootid-logger-9999
new file mode 100644
index 0000000..8f665f6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/bootid-logger-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Log viewer for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bootid-logger
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<=chromeos-base/croslog-0.0.1-r44 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b1d23adb91394b5495ffbea16baf8ad6
diff --git a/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r708 b/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r708
deleted file mode 100644
index e9b8ca9..0000000
--- a/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r708
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=BootLockbox DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r708
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ec8af9cd5ce47f6bffd87211e7ff735e
diff --git a/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r810 b/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r810
new file mode 100644
index 0000000..a181e63
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/bootlockbox-client-0.0.1-r810
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=BootLockbox DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r810
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=785516c2a198c68d75d0c1c42bf0aad7
diff --git a/metadata/md5-cache/chromeos-base/bootlockbox-client-9999 b/metadata/md5-cache/chromeos-base/bootlockbox-client-9999
index d9f3037..9402d3a 100644
--- a/metadata/md5-cache/chromeos-base/bootlockbox-client-9999
+++ b/metadata/md5-cache/chromeos-base/bootlockbox-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8f9cde4a75ba5c6c1376af52a605bc08
diff --git a/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3038 b/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3038
deleted file mode 100644
index 1df85bf..0000000
--- a/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3038
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS Boot Time Statistics Utilities
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bootstat/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fcce853ccd0311b4673d6a8f6b37e1faf9afc395_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fcce853ccd0311b4673d6a8f6b37e1faf9afc395_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.2-r3038
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9b9c98d584d29beb9f398eb6e54fe8e9
diff --git a/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3059 b/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3059
new file mode 100644
index 0000000..208cbd8
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/bootstat-0.0.2-r3059
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS Boot Time Statistics Utilities
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/bootstat/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b6ba3795ea221ecda3ba2d051d2b5f299bb768a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b6ba3795ea221ecda3ba2d051d2b5f299bb768a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.2-r3059
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bda0a0bb2430e54ea3d9c7f49e411baf
diff --git a/metadata/md5-cache/chromeos-base/bootstat-9999 b/metadata/md5-cache/chromeos-base/bootstat-9999
index 337d75c..fbf5397 100644
--- a/metadata/md5-cache/chromeos-base/bootstat-9999
+++ b/metadata/md5-cache/chromeos-base/bootstat-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=de863e65e972c5f3660c5cd8cf92e72e
diff --git a/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2854 b/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2854
deleted file mode 100644
index 4ee28a3..0000000
--- a/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2854
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/libweave:= chromeos-base/shill-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Local and cloud communication services for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/buffet/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_03aecfc1ac4d322587fe2a5efc6c3e3abf118627_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_03aecfc1ac4d322587fe2a5efc6c3e3abf118627_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libweave:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2854
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=232b9391d3e6ce60c88284549f36d1eb
diff --git a/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2876 b/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2876
new file mode 100644
index 0000000..7faaf99
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/buffet-0.0.1-r2876
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libweave:= chromeos-base/shill-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Local and cloud communication services for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/buffet/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_33ae40ab689f1eb6e4700c7bae6ba213d4da50d7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_33ae40ab689f1eb6e4700c7bae6ba213d4da50d7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libweave:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r2876
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=955c57f3a89645d9702f0000ab61c81c
diff --git a/metadata/md5-cache/chromeos-base/buffet-9999 b/metadata/md5-cache/chromeos-base/buffet-9999
index 766a717..c449173 100644
--- a/metadata/md5-cache/chromeos-base/buffet-9999
+++ b/metadata/md5-cache/chromeos-base/buffet-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libweave:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=eaf5419aaf409e2d8565363e0e538483
diff --git a/metadata/md5-cache/chromeos-base/cbor-0.0.1-r32 b/metadata/md5-cache/chromeos-base/cbor-0.0.1-r32
deleted file mode 100644
index 08f37e2..0000000
--- a/metadata/md5-cache/chromeos-base/cbor-0.0.1-r32
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Concise Binary Object Representation (CBOR) library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/cbor
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64ddc93776d2e8ce9987bcce636e68a05565c96f cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64ddc93776d2e8ce9987bcce636e68a05565c96f cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ab7edd0355aa3e8d581ed40d3621d10f
diff --git a/metadata/md5-cache/chromeos-base/cbor-0.0.1-r52 b/metadata/md5-cache/chromeos-base/cbor-0.0.1-r52
new file mode 100644
index 0000000..9a24b25
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cbor-0.0.1-r52
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Concise Binary Object Representation (CBOR) library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/cbor
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64ddc93776d2e8ce9987bcce636e68a05565c96f cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64ddc93776d2e8ce9987bcce636e68a05565c96f cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5d80c4cdc84422689af0accbc9e43995
diff --git a/metadata/md5-cache/chromeos-base/cbor-9999 b/metadata/md5-cache/chromeos-base/cbor-9999
index c293006..f410f52 100644
--- a/metadata/md5-cache/chromeos-base/cbor-9999
+++ b/metadata/md5-cache/chromeos-base/cbor-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=36072f1884acce1db03fdfbd68fd599c
diff --git a/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r33 b/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r33
deleted file mode 100644
index cb6103a..0000000
--- a/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r33
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library to send firmware update notifications to CFM
-EAPI=7
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_30d44bb1fc4101536954f9209992b13ce5f5a584_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_30d44bb1fc4101536954f9209992b13ce5f5a584_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=dbdf1a07f46d2eb60965fda22a1c55f2
diff --git a/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r53 b/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r53
new file mode 100644
index 0000000..93746a7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cfm-dfu-notification-0.0.1-r53
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library to send firmware update notifications to CFM
+EAPI=7
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7f5c0bd150cc92f57377305d0863d3a4b6af10e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7f5c0bd150cc92f57377305d0863d3a4b6af10e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=884f22aa2993265cec58d0c6811a9b04
diff --git a/metadata/md5-cache/chromeos-base/cfm-dfu-notification-9999 b/metadata/md5-cache/chromeos-base/cfm-dfu-notification-9999
index 3704b8e..b9b9604 100644
--- a/metadata/md5-cache/chromeos-base/cfm-dfu-notification-9999
+++ b/metadata/md5-cache/chromeos-base/cfm-dfu-notification-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=37dff4729471bed9857be8bb6767f695
diff --git a/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r363 b/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r363
deleted file mode 100644
index ebd4c62..0000000
--- a/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r363
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=info install setup unpack
-DEPEND=dev-lang/python
-DESCRIPTION=Chameleon bundle for Autotest lab deployment
-EAPI=4
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/chameleon/
-IUSE=cros_host cros_workon_tree_717c22e200d9628017b0f18557d71a58d7161b6f
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-lang/python
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f786bce9400475ec9cee0f32e91ef93b
diff --git a/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r384 b/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r384
new file mode 100644
index 0000000..1b2e9a0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chameleon-0.0.2-r384
@@ -0,0 +1,13 @@
+DEFINED_PHASES=info install setup unpack
+DEPEND=dev-lang/python
+DESCRIPTION=Chameleon bundle for Autotest lab deployment
+EAPI=4
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/chameleon/
+IUSE=cros_host cros_workon_tree_59f2c87bed26a660e586154dd57306f9b4f5e956
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-lang/python
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c0e64d9cd4d9a37ee64b9d7d2744ebcd
diff --git a/metadata/md5-cache/chromeos-base/chameleon-9999 b/metadata/md5-cache/chromeos-base/chameleon-9999
index 147c328..3f6d10f 100644
--- a/metadata/md5-cache/chromeos-base/chameleon-9999
+++ b/metadata/md5-cache/chromeos-base/chameleon-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-lang/python
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=56b6292b5c9d08d6dc539b688844c639
diff --git a/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3160 b/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3160
deleted file mode 100644
index 186ffcf..0000000
--- a/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3160
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= chromeos-base/metrics:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= test? ( app-arch/gzip ) chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator ) tpm2? ( chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=PKCS #11 layer over TrouSerS
-EAPI=7
-HOMEPAGE=http://www.chromium.org/developers/design-documents/chaps-technical-design
-IUSE=systemd test tpm tpm2 fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a3f5ba63eea058fad5fcab6671f690a35328329d_7e189936f29d145c4191ea147e48256c92fac75d_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a3f5ba63eea058fad5fcab6671f690a35328329d_7e189936f29d145c4191ea147e48256c92fac75d_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= chromeos-base/metrics:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0.0.1-r3160
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=9e4414694549eca41fb8935bf1e3b934
diff --git a/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3203 b/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3203
new file mode 100644
index 0000000..e1608cd
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chaps-0.0.1-r3203
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= >=chromeos-base/metrics-0.0.1-r3152:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= test? ( app-arch/gzip ) chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator ) tpm2? ( chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=PKCS #11 layer over TrouSerS
+EAPI=7
+HOMEPAGE=http://www.chromium.org/developers/design-documents/chaps-technical-design
+IUSE=systemd test tpm tpm2 fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e62cbc37d070a3060cb35a6478a549702a115b7c_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e62cbc37d070a3060cb35a6478a549702a115b7c_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= >=chromeos-base/metrics-0.0.1-r3152:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0.0.1-r3203
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=684463317b174fdc03a9c04fda954fb6
diff --git a/metadata/md5-cache/chromeos-base/chaps-9999 b/metadata/md5-cache/chromeos-base/chaps-9999
index 001ff54..8b09f71 100644
--- a/metadata/md5-cache/chromeos-base/chaps-9999
+++ b/metadata/md5-cache/chromeos-base/chaps-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= chromeos-base/metrics:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= test? ( app-arch/gzip ) chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator ) tpm2? ( chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= >=chromeos-base/metrics-0.0.1-r3152:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= test? ( app-arch/gzip ) chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator ) tpm2? ( chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=PKCS #11 layer over TrouSerS
 EAPI=7
 HOMEPAGE=http://www.chromium.org/developers/design-documents/chaps-technical-design
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= chromeos-base/metrics:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=!tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/minijail:= >=chromeos-base/metrics-0.0.1-r3152:= !dev-db/leveldb dev-libs/leveldb:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=a79daa7df396fbfa9199ca90bc5bf11d
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=4f95efbc5886f84603bb64c1a689415d
diff --git a/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1 b/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1
index b8ea08b..6e4160b 100644
--- a/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1
+++ b/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1
@@ -7,4 +7,4 @@
 KEYWORDS=*
 LICENSE=BSD-Google
 SLOT=0
-_md5_=1f5319763fb8aabb761db94775b11a5d
+_md5_=f2e5bb936b330f2639c83906cf310d0a
diff --git a/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r12 b/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r12
deleted file mode 100644
index b8ea08b..0000000
--- a/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r12
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=install
-DEPEND=chromeos-base/chromeos-chrome
-DESCRIPTION=Install Chromium binary tests to test image
-EAPI=6
-HOMEPAGE=http://www.chromium.org
-IUSE=vaapi
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-_md5_=1f5319763fb8aabb761db94775b11a5d
diff --git a/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r15 b/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r15
new file mode 100644
index 0000000..6e4160b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chrome-binary-tests-0.0.1-r15
@@ -0,0 +1,10 @@
+DEFINED_PHASES=install
+DEPEND=chromeos-base/chromeos-chrome
+DESCRIPTION=Install Chromium binary tests to test image
+EAPI=6
+HOMEPAGE=http://www.chromium.org
+IUSE=vaapi
+KEYWORDS=*
+LICENSE=BSD-Google
+SLOT=0
+_md5_=f2e5bb936b330f2639c83906cf310d0a
diff --git a/metadata/md5-cache/chromeos-base/chrome-icu-86.0.4194.0_rc-r1 b/metadata/md5-cache/chromeos-base/chrome-icu-86.0.4194.0_rc-r1
deleted file mode 100644
index f73f04b..0000000
--- a/metadata/md5-cache/chromeos-base/chrome-icu-86.0.4194.0_rc-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup unpack
-DEPEND=net-print/cups
-DESCRIPTION=The ICU library copied from chrome/third_party
-EAPI=5
-HOMEPAGE=https://cs.chromium.org/chromium/src/third_party/icu/
-IUSE=asan chrome_internal component_build cups +libcxx msan neon +runhooks +thinlto ubsan verbose chrome_internal asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=BSD
-RDEPEND=!dev-libs/icu !<chromeos-base/chromeos-chrome-83.0.4098.4
-RESTRICT=network-sandbox mirror
-SLOT=0/86.0.4194.0_rc-r1
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	cb1e2772ade26c9cdedbfec2526f7e14	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9ffcf05a52b374f507a8cb2ac31cde7b
diff --git a/metadata/md5-cache/chromeos-base/chrome-icu-87.0.4280.0_rc-r1 b/metadata/md5-cache/chromeos-base/chrome-icu-87.0.4280.0_rc-r1
new file mode 100644
index 0000000..0071235c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chrome-icu-87.0.4280.0_rc-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare setup unpack
+DEPEND=net-print/cups
+DESCRIPTION=The ICU library copied from chrome/third_party
+EAPI=5
+HOMEPAGE=https://cs.chromium.org/chromium/src/third_party/icu/
+IUSE=asan chrome_internal component_build cups +libcxx msan neon +runhooks +thinlto ubsan verbose chrome_internal asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=icu-58
+RDEPEND=!dev-libs/icu !<chromeos-base/chromeos-chrome-83.0.4098.4
+RESTRICT=network-sandbox mirror
+SLOT=0/87.0.4280.0_rc-r1
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0041bd3bf730709f457b18f10ed0f1a2
diff --git a/metadata/md5-cache/chromeos-base/chrome-icu-9999 b/metadata/md5-cache/chromeos-base/chrome-icu-9999
index 38aa29b..2f2aa55 100644
--- a/metadata/md5-cache/chromeos-base/chrome-icu-9999
+++ b/metadata/md5-cache/chromeos-base/chrome-icu-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=The ICU library copied from chrome/third_party
 EAPI=5
 HOMEPAGE=https://cs.chromium.org/chromium/src/third_party/icu/
-IUSE=asan chrome_internal component_build cups +libcxx msan neon +runhooks +thinlto ubsan verbose chrome_internal asan coverage fuzzer msan tsan ubsan
+IUSE=asan chrome_internal component_build cups +libcxx msan neon +runhooks +thinlto ubsan verbose xkbcommon chrome_internal asan coverage fuzzer msan tsan ubsan
 KEYWORDS=~*
-LICENSE=BSD
-RDEPEND=!dev-libs/icu !<chromeos-base/chromeos-chrome-83.0.4098.4
+LICENSE=icu-58
+RDEPEND=!dev-libs/icu !<chromeos-base/chromeos-chrome-83.0.4098.4 xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config )
 RESTRICT=network-sandbox mirror
 SLOT=0/9999
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	cb1e2772ade26c9cdedbfec2526f7e14	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=52d213d49f7e66e0a47562d6b0fdb763
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d32bc521ecbb699c5c4a05a5ef0e84f2
diff --git a/metadata/md5-cache/chromeos-base/chromeos-accelerometer-init-0.0.1-r22 b/metadata/md5-cache/chromeos-base/chromeos-accelerometer-init-0.0.1-r23
similarity index 100%
rename from metadata/md5-cache/chromeos-base/chromeos-accelerometer-init-0.0.1-r22
rename to metadata/md5-cache/chromeos-base/chromeos-accelerometer-init-0.0.1-r23
diff --git a/metadata/md5-cache/chromeos-base/chromeos-base-0 b/metadata/md5-cache/chromeos-base/chromeos-base-0
deleted file mode 100644
index 671a351..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-base-0
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install preinst setup
-DEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout virtual/pkgconfig
-DESCRIPTION=ChromeOS specific system setup
-EAPI=5
-HOMEPAGE=http://src.chromium.org/
-IUSE=ac_only chromeless_tty cros_embedded cros_host pam vtconsole
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
-SLOT=0
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=1fda417a74456eeb06d56296e414b1ba
diff --git a/metadata/md5-cache/chromeos-base/chromeos-base-0-r158 b/metadata/md5-cache/chromeos-base/chromeos-base-0-r158
deleted file mode 100644
index 671a351..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-base-0-r158
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install preinst setup
-DEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout virtual/pkgconfig
-DESCRIPTION=ChromeOS specific system setup
-EAPI=5
-HOMEPAGE=http://src.chromium.org/
-IUSE=ac_only chromeless_tty cros_embedded cros_host pam vtconsole
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
-SLOT=0
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=1fda417a74456eeb06d56296e414b1ba
diff --git a/metadata/md5-cache/chromeos-base/chromeos-base-1-r1 b/metadata/md5-cache/chromeos-base/chromeos-base-1-r1
new file mode 100644
index 0000000..d71c110
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-base-1-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=info install preinst setup unpack
+DEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
+DESCRIPTION=ChromeOS specific system setup
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=ac_only chromeless_tty cros_embedded cros_host pam vtconsole cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=1c9deac23eb1e10db020d9054a591f20
diff --git a/metadata/md5-cache/chromeos-base/chromeos-base-9999 b/metadata/md5-cache/chromeos-base/chromeos-base-9999
new file mode 100644
index 0000000..59f4f06
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-base-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=info install preinst setup unpack
+DEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
+DESCRIPTION=ChromeOS specific system setup
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=ac_only chromeless_tty cros_embedded cros_host pam vtconsole cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=sys-apps/baselayout-2 !<sys-apps/baselayout-2.0.1-r227 !<sys-libs/timezone-data-2011d !<=app-admin/sudo-1.8.2 !<sys-apps/mawk-1.3.4 !<app-shells/bash-4.1 !<app-shells/dash-0.5.5 !<net-misc/openssh-5.2_p1-r8 app-shells/bash !cros_host? ( !pam? ( !app-admin/sudo ) !app-misc/editor-wrapper cros_embedded? ( app-shells/dash ) sys-libs/timezone-data ) sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=b9c4d066b43c4a76e755df2534da0d18
diff --git a/metadata/md5-cache/chromeos-base/chromeos-chrome-86.0.4194.0_rc-r1 b/metadata/md5-cache/chromeos-base/chromeos-chrome-86.0.4194.0_rc-r1
deleted file mode 100644
index 672d5ba..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-chrome-86.0.4194.0_rc-r1
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure install postinst preinst prepare setup unpack
-DEPEND=app-arch/bzip2 app-crypt/mit-krb5 app-misc/edid-decode authpolicy? ( chromeos-base/authpolicy ) ~chromeos-base/chrome-icu-86.0.4194.0_rc chromeos-base/gestures chromeos-base/libevdev fonts? ( chromeos-base/chromeos-fonts ) chrome_internal? ( chromeos-base/quickoffice ) dev-libs/nspr >=dev-libs/nss-3.12.2 >=media-libs/alsa-lib-1.0.19 media-libs/fontconfig media-libs/libsync x11-libs/libdrm ozone_platform_gbm? ( media-libs/minigbm ) v4lplugin? ( media-libs/libv4lplugins ) >=media-sound/adhd-0.0.1-r310 net-print/cups opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) sys-apps/dbus sys-apps/pciutils virtual/udev sys-libs/libcap chrome_remoting? ( sys-libs/pam ) vaapi? ( x11-libs/libva ) xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config ) accessibility? ( app-accessibility/brltty app-accessibility/espeak-ng app-accessibility/googletts ) libcxx? ( sys-libs/libcxxabi sys-libs/libcxx ) oobe_config? ( chromeos-base/oobe_config ) chromeos-base/protofiles >=dev-util/gperf-3.0.3 >=dev-util/pkgconfig-0.23 arm? ( x11-libs/libdrm ) sys-apps/baselayout
-DESCRIPTION=Open-source version of Google Chrome web browser
-EAPI=7
-HOMEPAGE=http://www.chromium.org/
-IUSE=+afdo_use afdo_verify +accessibility app_shell asan +authpolicy +build_tests +chrome_debug +cfi chrome_debug_tests chrome_internal chrome_media +chrome_remoting clang_tidy component_build +debug_fission +fonts goma +goma_thinlto +highdpi internal_gles_conform +libcxx mojo msan +nacl neon on_device_assistant oobe_config opengl opengles orderfile_generate +orderfile_use orderfile_verify +runhooks strict_toolchain_checks +thinlto touchview tpm_fallback ubsan v4l2_codec v4lplugin vaapi verbose vtable_verify xkbcommon ozone_platform_gbm ozone_platform_cast ozone_platform_test ozone_platform_egltest ozone_platform_caca ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_test ozone_platform_default_egltest ozone_platform_default_caca +autotest +buildcheck autotest opengles asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google chrome_internal? ( Google-TOS )
-PROPERTIES=live
-RDEPEND=app-arch/bzip2 app-crypt/mit-krb5 app-misc/edid-decode authpolicy? ( chromeos-base/authpolicy ) ~chromeos-base/chrome-icu-86.0.4194.0_rc chromeos-base/gestures chromeos-base/libevdev fonts? ( chromeos-base/chromeos-fonts ) chrome_internal? ( chromeos-base/quickoffice ) dev-libs/nspr >=dev-libs/nss-3.12.2 >=media-libs/alsa-lib-1.0.19 media-libs/fontconfig media-libs/libsync x11-libs/libdrm ozone_platform_gbm? ( media-libs/minigbm ) v4lplugin? ( media-libs/libv4lplugins ) >=media-sound/adhd-0.0.1-r310 net-print/cups opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) sys-apps/dbus sys-apps/pciutils virtual/udev sys-libs/libcap chrome_remoting? ( sys-libs/pam ) vaapi? ( x11-libs/libva ) xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config ) accessibility? ( app-accessibility/brltty app-accessibility/espeak-ng app-accessibility/googletts ) libcxx? ( sys-libs/libcxxabi sys-libs/libcxx ) oobe_config? ( chromeos-base/oobe_config ) autotest? ( chromeos-base/autotest ) sys-apps/baselayout
-REQUIRED_USE=cfi? ( thinlto ) afdo_verify? ( !afdo_use ) orderfile_generate? ( !orderfile_use ) ^^ ( ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_test ozone_platform_default_egltest ozone_platform_default_caca )
-RESTRICT=network-sandbox mirror
-SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=30d36382be3427ce5e192aa1d316796b
diff --git a/metadata/md5-cache/chromeos-base/chromeos-chrome-87.0.4280.0_rc-r1 b/metadata/md5-cache/chromeos-base/chromeos-chrome-87.0.4280.0_rc-r1
new file mode 100644
index 0000000..6a40581
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-chrome-87.0.4280.0_rc-r1
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure install postinst preinst prepare setup unpack
+DEPEND=app-arch/bzip2 app-crypt/mit-krb5 app-misc/edid-decode authpolicy? ( chromeos-base/authpolicy ) ~chromeos-base/chrome-icu-87.0.4280.0_rc chromeos-base/gestures chromeos-base/libevdev fonts? ( chromeos-base/chromeos-fonts ) chrome_internal? ( chromeos-base/quickoffice ) dev-libs/nspr >=dev-libs/nss-3.12.2 >=media-libs/alsa-lib-1.0.19 media-libs/fontconfig media-libs/libsync x11-libs/libdrm ozone_platform_gbm? ( media-libs/minigbm ) v4lplugin? ( media-libs/libv4lplugins ) >=media-sound/adhd-0.0.1-r310 net-print/cups opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) sys-apps/dbus sys-apps/pciutils virtual/udev sys-libs/libcap chrome_remoting? ( sys-libs/pam ) vaapi? ( x11-libs/libva ) xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config ) accessibility? ( app-accessibility/brltty app-accessibility/espeak-ng app-accessibility/googletts ) libcxx? ( sys-libs/libcxxabi sys-libs/libcxx ) oobe_config? ( chromeos-base/oobe_config ) chromeos-base/protofiles >=dev-util/gperf-3.0.3 >=dev-util/pkgconfig-0.23 arm? ( x11-libs/libdrm ) sys-apps/baselayout
+DESCRIPTION=Open-source version of Google Chrome web browser
+EAPI=7
+HOMEPAGE=http://www.chromium.org/
+IUSE=+afdo_use afdo_verify +accessibility app_shell asan +authpolicy +build_tests +chrome_debug +cfi cfm chrome_debug_tests chrome_internal chrome_media +chrome_remoting clang_tidy component_build +debug_fission +fonts goma goma_thinlto +highdpi internal_gles_conform +libcxx mojo msan +nacl neon on_device_assistant oobe_config opengl opengles orderfile_generate +orderfile_use orderfile_verify +runhooks strict_toolchain_checks +thinlto touchview tpm_fallback ubsan v4l2_codec v4lplugin vaapi verbose vtable_verify xkbcommon ozone_platform_gbm ozone_platform_cast ozone_platform_headless ozone_platform_egltest ozone_platform_caca ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_headless ozone_platform_default_egltest ozone_platform_default_caca +autotest +buildcheck autotest opengles chrome_internal asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google chrome_internal? ( Google-TOS )
+PROPERTIES=live
+RDEPEND=app-arch/bzip2 app-crypt/mit-krb5 app-misc/edid-decode authpolicy? ( chromeos-base/authpolicy ) ~chromeos-base/chrome-icu-87.0.4280.0_rc chromeos-base/gestures chromeos-base/libevdev fonts? ( chromeos-base/chromeos-fonts ) chrome_internal? ( chromeos-base/quickoffice ) dev-libs/nspr >=dev-libs/nss-3.12.2 >=media-libs/alsa-lib-1.0.19 media-libs/fontconfig media-libs/libsync x11-libs/libdrm ozone_platform_gbm? ( media-libs/minigbm ) v4lplugin? ( media-libs/libv4lplugins ) >=media-sound/adhd-0.0.1-r310 net-print/cups opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) sys-apps/dbus sys-apps/pciutils virtual/udev sys-libs/libcap chrome_remoting? ( sys-libs/pam ) vaapi? ( x11-libs/libva ) xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config ) accessibility? ( app-accessibility/brltty app-accessibility/espeak-ng app-accessibility/googletts ) libcxx? ( sys-libs/libcxxabi sys-libs/libcxx ) oobe_config? ( chromeos-base/oobe_config ) autotest? ( chromeos-base/autotest ) sys-apps/baselayout
+REQUIRED_USE=cfi? ( thinlto ) afdo_verify? ( !afdo_use ) orderfile_generate? ( !orderfile_use ) ^^ ( ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_headless ozone_platform_default_egltest ozone_platform_default_caca )
+RESTRICT=network-sandbox mirror
+SLOT=0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=3ee3f971c70e60447cc968e994742d38
diff --git a/metadata/md5-cache/chromeos-base/chromeos-chrome-9999 b/metadata/md5-cache/chromeos-base/chromeos-chrome-9999
index 8f2ccef0..635d289 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-chrome-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-chrome-9999
@@ -4,13 +4,13 @@
 DESCRIPTION=Open-source version of Google Chrome web browser
 EAPI=7
 HOMEPAGE=http://www.chromium.org/
-IUSE=+afdo_use afdo_verify +accessibility app_shell asan +authpolicy +build_tests +chrome_debug +cfi cfm chrome_debug_tests chrome_internal chrome_media +chrome_remoting clang_tidy component_build +debug_fission +fonts goma goma_thinlto +highdpi internal_gles_conform +libcxx mojo msan +nacl neon on_device_assistant oobe_config opengl opengles orderfile_generate +orderfile_use orderfile_verify +runhooks strict_toolchain_checks +thinlto touchview tpm_fallback ubsan v4l2_codec v4lplugin vaapi verbose vtable_verify xkbcommon ozone_platform_gbm ozone_platform_cast ozone_platform_test ozone_platform_egltest ozone_platform_caca ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_test ozone_platform_default_egltest ozone_platform_default_caca +autotest +buildcheck autotest opengles asan coverage fuzzer msan tsan ubsan
+IUSE=+afdo_use afdo_verify +accessibility app_shell asan +authpolicy +build_tests +chrome_debug +cfi cfm chrome_debug_tests chrome_internal chrome_media +chrome_remoting clang_tidy component_build +debug_fission +fonts goma goma_thinlto +highdpi internal_gles_conform +libcxx mojo msan +nacl neon on_device_assistant oobe_config opengl opengles orderfile_generate +orderfile_use orderfile_verify +runhooks strict_toolchain_checks +thinlto touchview tpm_fallback ubsan v4l2_codec v4lplugin vaapi verbose vtable_verify xkbcommon ozone_platform_gbm ozone_platform_cast ozone_platform_headless ozone_platform_egltest ozone_platform_caca ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_headless ozone_platform_default_egltest ozone_platform_default_caca +autotest +buildcheck autotest opengles chrome_internal asan coverage fuzzer msan tsan ubsan
 KEYWORDS=~*
 LICENSE=BSD-Google chrome_internal? ( Google-TOS )
 PROPERTIES=live
 RDEPEND=app-arch/bzip2 app-crypt/mit-krb5 app-misc/edid-decode authpolicy? ( chromeos-base/authpolicy ) ~chromeos-base/chrome-icu-9999 chromeos-base/gestures chromeos-base/libevdev fonts? ( chromeos-base/chromeos-fonts ) chrome_internal? ( chromeos-base/quickoffice ) dev-libs/nspr >=dev-libs/nss-3.12.2 >=media-libs/alsa-lib-1.0.19 media-libs/fontconfig media-libs/libsync x11-libs/libdrm ozone_platform_gbm? ( media-libs/minigbm ) v4lplugin? ( media-libs/libv4lplugins ) >=media-sound/adhd-0.0.1-r310 net-print/cups opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) sys-apps/dbus sys-apps/pciutils virtual/udev sys-libs/libcap chrome_remoting? ( sys-libs/pam ) vaapi? ( x11-libs/libva ) xkbcommon? ( x11-libs/libxkbcommon x11-misc/xkeyboard-config ) accessibility? ( app-accessibility/brltty app-accessibility/espeak-ng app-accessibility/googletts ) libcxx? ( sys-libs/libcxxabi sys-libs/libcxx ) oobe_config? ( chromeos-base/oobe_config ) autotest? ( chromeos-base/autotest ) sys-apps/baselayout
-REQUIRED_USE=cfi? ( thinlto ) afdo_verify? ( !afdo_use ) orderfile_generate? ( !orderfile_use ) ^^ ( ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_test ozone_platform_default_egltest ozone_platform_default_caca )
+REQUIRED_USE=cfi? ( thinlto ) afdo_verify? ( !afdo_use ) orderfile_generate? ( !orderfile_use ) ^^ ( ozone_platform_default_gbm ozone_platform_default_cast ozone_platform_default_headless ozone_platform_default_egltest ozone_platform_default_caca )
 RESTRICT=network-sandbox mirror
 SLOT=0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=5ef091dec01ad24dfdfcd139df8ad77c
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	autotest-deponly	9b1e5d19c437abea0e7c0fa90c192abd	binutils-funcs	6207477a739f6f25d13da27b9cc00160	chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=839143d0dedc9eba8ed95af69d4dd0ac
diff --git a/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r205 b/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r205
deleted file mode 100644
index 32a0ad4..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r205
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS storage info tools
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-common-script/
-IUSE=direncryption cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_0468cec41388f85dd89a5eb66bef35fcf7a5c524_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_0468cec41388f85dd89a5eb66bef35fcf7a5c524_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/chromeos-installer-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4bfb12e6ea76bc757e4cd59cf69d807c
diff --git a/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r228 b/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r228
new file mode 100644
index 0000000..aa8cb8d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-common-script-0.0.1-r228
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS storage info tools
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-common-script/
+IUSE=direncryption fsverity cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e137dc0c7282c263da7b118003b16c4ef4a97ea3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e137dc0c7282c263da7b118003b16c4ef4a97ea3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/chromeos-installer-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=089b6610c0f34b01c59fc959ee4224ef
diff --git a/metadata/md5-cache/chromeos-base/chromeos-common-script-9999 b/metadata/md5-cache/chromeos-base/chromeos-common-script-9999
index 1cf7af5..ff0251a 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-common-script-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-common-script-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=Chrome OS storage info tools
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-common-script/
-IUSE=direncryption cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=direncryption fsverity cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/chromeos-installer-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f7dc4737c3e174dd0ad264ca24a712ef
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=71541f108483699ddb0a69a991509326
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-0.0.2-r126 b/metadata/md5-cache/chromeos-base/chromeos-config-0.0.2-r126
index e0790f1..a4241c3 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-config-0.0.2-r126
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-0.0.2-r126
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!fuzzer? ( virtual/chromeos-config-bsp:= )
 SLOT=0/0.0.2-r126
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3153fe6c3f074ee5bada3cea29562686
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-9999 b/metadata/md5-cache/chromeos-base/chromeos-config-9999
index 2b06613..fa098d5 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-config-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!fuzzer? ( virtual/chromeos-config-bsp:= )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6c5d09e6fb73a034c40534a2a2117b8f
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r553 b/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r553
deleted file mode 100644
index 991b420..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r553
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=>=sys-fs/squashfs-tools-4.3 dev-python/jinja[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/chromeos-config-tools-0.0.4 dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-DESCRIPTION=Chrome OS configuration host tools
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config
-IUSE=cros_host cros_workon_tree_6287b0913be5aaea79569d55d989b9b729396f10 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=>=sys-fs/squashfs-tools-4.3 dev-python/jinja[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/chromeos-config-tools-0.0.4 python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=1a3b623c717452876e1ff1104bd4433e
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r587 b/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r587
new file mode 100644
index 0000000..3588c63
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-host-0.0.2-r587
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=>=sys-fs/squashfs-tools-4.3 dev-python/jinja[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/chromeos-config-tools-0.0.4 dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+DESCRIPTION=Chrome OS configuration host tools
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config
+IUSE=cros_host cros_workon_tree_9b4a2274d7e288e816c42f93f44fb938f82038ff python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=sys-fs/squashfs-tools-4.3 dev-python/jinja[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/chromeos-config-tools-0.0.4 python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=3f5e498c51760d6081a80c0f41909ca1
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-host-9999 b/metadata/md5-cache/chromeos-base/chromeos-config-host-9999
index 398bcc1..fefc3dc 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-config-host-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-host-9999
@@ -10,5 +10,5 @@
 RDEPEND=>=sys-fs/squashfs-tools-4.3 dev-python/jinja[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/chromeos-config-tools-0.0.4 python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=4bf29a8a2f9eeb4256e385f8723142ae
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1535 b/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1535
deleted file mode 100644
index 4e68b3a..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1535
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS configuration tools
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9efdfc45805ee63633125c94e8a81564
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1607 b/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1607
new file mode 100644
index 0000000..128c00e
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-tools-0.0.4-r1607
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS configuration tools
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-config
+IUSE=cros_host cros_workon_tree_4fdfdbe461ccedeaaf176391c0bbb0f74943be45_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_47494d35dcb27c2b0340dd8a7508845488139951 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_4fdfdbe461ccedeaaf176391c0bbb0f74943be45_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_47494d35dcb27c2b0340dd8a7508845488139951 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fee4e79e8ecde00423244fc1251b5495
diff --git a/metadata/md5-cache/chromeos-base/chromeos-config-tools-9999 b/metadata/md5-cache/chromeos-base/chromeos-config-tools-9999
index 8f61313..5304634 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-config-tools-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-config-tools-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b8e34dc01206c8243f7934b86e2c7776
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8d790d7e2adf4f02178bec3ac47bb864
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1 b/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1
index 6c4d4c5..5f6e390 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1
+++ b/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1
@@ -5,5 +5,5 @@
 LICENSE=BSD-Google
 RDEPEND=chromeos-base/chromeos-cr50-dev chromeos-base/chromeos-cr50-scripts
 SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.5.4.tbz2 gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.6.5_FFFF_00000000_00000010.tbz2
-_md5_=2898ca0acf270cd86658f477262fd17a
+SRC_URI=gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.5.6.tbz2 gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.6.7_FFFF_00000000_00000010.tbz2
+_md5_=b80ad227f5d13d4a3e35a234795a436d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r90 b/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r90
deleted file mode 100644
index 6c4d4c5..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r90
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Ebuild to support the Chrome OS CR50 device.
-EAPI=7
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=chromeos-base/chromeos-cr50-dev chromeos-base/chromeos-cr50-scripts
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.5.4.tbz2 gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.6.5_FFFF_00000000_00000010.tbz2
-_md5_=2898ca0acf270cd86658f477262fd17a
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r94 b/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r94
new file mode 100644
index 0000000..5f6e390
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-cr50-0.0.1-r94
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Ebuild to support the Chrome OS CR50 device.
+EAPI=7
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=chromeos-base/chromeos-cr50-dev chromeos-base/chromeos-cr50-scripts
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.5.6.tbz2 gs://chromeos-localmirror/distfiles//cr50.r0.0.11.w0.6.7_FFFF_00000000_00000010.tbz2
+_md5_=b80ad227f5d13d4a3e35a234795a436d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r120 b/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r120
deleted file mode 100644
index 29f1d89..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r120
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=dev-libs/openssl:0= virtual/libusb:1= fuzzer? ( dev-libs/protobuf:= ) fuzzer? ( dev-libs/libprotobuf-mutator:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
-DESCRIPTION=Google Security Chip firmware code
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab
-IUSE=quiet verbose fuzzer asan msan ubsan ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_fdddca9d2fb4dd911a01bcdf1260cfd2a9ea2749_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<chromeos-base/chromeos-ec-0.0.2 !<chromeos-base/ec-utils-0.0.2 dev-libs/openssl:0= virtual/libusb:1= fuzzer? ( dev-libs/protobuf:= )
-RESTRICT=binchecks
-SLOT=0/0.0.1-r120
-SRC_URI=gs://chromeos-localmirror/distfiles/cr50.prod.ro.A.0.0.11 gs://chromeos-localmirror/distfiles/cr50.prod.ro.B.0.0.11
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f253745b3aff281d3b16a4800063fb79
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r145 b/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r145
new file mode 100644
index 0000000..805c503
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-0.0.1-r145
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=dev-libs/openssl:0= virtual/libusb:1= fuzzer? ( dev-libs/protobuf:= ) fuzzer? ( dev-libs/libprotobuf-mutator:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
+DESCRIPTION=Google Security Chip firmware code
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab
+IUSE=asan cros_host fuzzer msan quiet ubsan verbose ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_25df89506f0624f5ee267483a103c428c4607be4_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/chromeos-ec-0.0.2 !<chromeos-base/ec-utils-0.0.2 dev-libs/openssl:0= virtual/libusb:1= fuzzer? ( dev-libs/protobuf:= )
+RESTRICT=binchecks
+SLOT=0/0.0.1-r145
+SRC_URI=gs://chromeos-localmirror/distfiles/cr50.prod.ro.A.0.0.11 gs://chromeos-localmirror/distfiles/cr50.prod.ro.B.0.0.11
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4a7e8cc1d6278edae3e87e4013399175
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-9999 b/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-9999
index 4ac73e0..bd2da55 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-cr50-dev-9999
@@ -4,7 +4,7 @@
 DESCRIPTION=Google Security Chip firmware code
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/cr50_stab
-IUSE=quiet verbose fuzzer asan msan ubsan ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_
+IUSE=asan cros_host fuzzer msan quiet ubsan verbose ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
@@ -12,5 +12,5 @@
 RESTRICT=binchecks
 SLOT=0/9999
 SRC_URI=gs://chromeos-localmirror/distfiles/cr50.prod.ro.A.0.0.11 gs://chromeos-localmirror/distfiles/cr50.prod.ro.B.0.0.11
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8875415836a76bf7bb267e8f98b2132a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7d239de518e10cae29530118723005eb
diff --git a/metadata/md5-cache/chromeos-base/chromeos-cr50-scripts-0.0.1-r66 b/metadata/md5-cache/chromeos-base/chromeos-cr50-scripts-0.0.1-r67
similarity index 100%
rename from metadata/md5-cache/chromeos-base/chromeos-cr50-scripts-0.0.1-r66
rename to metadata/md5-cache/chromeos-base/chromeos-cr50-scripts-0.0.1-r67
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2575 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2575
deleted file mode 100644
index a587820..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2575
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/expat sys-apps/dbus >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utility for building Chrome D-Bus bindings from an XML description
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7605f4da9f129a46d0c2b9c4cb06c3ddd1197fe8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7605f4da9f129a46d0c2b9c4cb06c3ddd1197fe8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/expat sys-apps/dbus >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=74b9153f9c50b17fda9173ed0ff697cb
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2597 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2597
new file mode 100644
index 0000000..8dad734
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-0.0.1-r2597
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/expat sys-apps/dbus >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utility for building Chrome D-Bus bindings from an XML description
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_af0686b23b50ef56914dbf3ab0f577f608b91f44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_af0686b23b50ef56914dbf3ab0f577f608b91f44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/expat sys-apps/dbus >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a814f0f25a4b99b5a07e72471182d622
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-9999 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-9999
index f70752a..400ef0b 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/expat sys-apps/dbus >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5cfd58620a6a3489d6ca905e98192525
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r13 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r13
deleted file mode 100644
index 4d941c3..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r13
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=>=virtual/rust-1.39.0:=
-DESCRIPTION=Chrome OS D-Bus bindings generator for Rust.
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings/
-IUSE=cros_host cros_workon_tree_7605f4da9f129a46d0c2b9c4cb06c3ddd1197fe8 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.24.52-r13
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=65e34b5b23d3b83be4680940bc5c8cbc
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r17 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r17
new file mode 100644
index 0000000..8c7f430
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r17
@@ -0,0 +1,14 @@
+BDEPEND=>=dev-rust/dbus-codegen-0.5.0 dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=Chrome OS D-Bus bindings generator for Rust.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings/
+IUSE=cros_host cros_workon_tree_af0686b23b50ef56914dbf3ab0f577f608b91f44 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.24.52-r17
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8e503dcb2da44c7286e201b98fc892db
diff --git a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-9999 b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-9999
index e5e8b93..a48571d 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-dbus-bindings-rust-9999
@@ -1,7 +1,8 @@
+BDEPEND=>=dev-rust/dbus-codegen-0.5.0 dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Chrome OS D-Bus bindings generator for Rust.
-EAPI=6
+EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-dbus-bindings/
 IUSE=cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
@@ -9,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a69e893dd10a262d39750f26d2bfa707
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2dba983bed6f4fb4964ba95ccd5a5220
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r7696 b/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r7696
deleted file mode 100644
index 9c4fa8a..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r7696
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=chromeos-base/chromeos-config-host-0.0.2 dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot )
-DESCRIPTION=Embedded Controller firmware code
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db
-KEYWORDS=*
-LICENSE=CrOS-EC
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
-RESTRICT=binchecks
-SLOT=0/0.0.2-r7696
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e190b19798277d76cbd9ea8461e07a04
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r8324 b/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r8324
new file mode 100644
index 0000000..9e57642
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-ec-0.0.2-r8324
@@ -0,0 +1,15 @@
+BDEPEND=>=chromeos-base/chromeos-config-host-0.0.2 dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot )
+DESCRIPTION=Embedded Controller firmware code
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5
+KEYWORDS=*
+LICENSE=CrOS-EC
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecks
+SLOT=0/0.0.2-r8324
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=003b2fafebe74de26f5ccc603ef0933d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-9999 b/metadata/md5-cache/chromeos-base/chromeos-ec-9999
index f23826a..2d54302 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-ec-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-ec-9999
@@ -4,12 +4,12 @@
 DESCRIPTION=Embedded Controller firmware code
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_
+IUSE=ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=CrOS-EC
 PROPERTIES=live live
 RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
 RESTRICT=binchecks
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=63ae652184920501a159870b40ca37bf
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r2945 b/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r2945
deleted file mode 100644
index ef7ddd4..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r2945
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DESCRIPTION=Exported headers from the embedded controller codebase.
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
-IUSE=cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65_fdddca9d2fb4dd911a01bcdf1260cfd2a9ea2749
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.0.1-r2945
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2a871df61ab758ff92e3b6c2e4926522
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r3586 b/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r3586
new file mode 100644
index 0000000..0fce6a8
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-ec-headers-0.0.1-r3586
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DESCRIPTION=Exported headers from the embedded controller codebase.
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
+IUSE=cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff_25df89506f0624f5ee267483a103c428c4607be4
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r3586
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7746471bdd161edd040e41b5b593f951
diff --git a/metadata/md5-cache/chromeos-base/chromeos-ec-headers-9999 b/metadata/md5-cache/chromeos-base/chromeos-ec-headers-9999
index ff0398b..802c5f9 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-ec-headers-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-ec-headers-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1791094695d150f595c21f2092e13971
diff --git a/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r156 b/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r156
deleted file mode 100644
index a236f90..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r156
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile info install setup test unpack
-DEPEND=chromeos-base/vboot_reference unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) app-arch/gzip app-arch/sharutils app-arch/tar sys-apps/util-linux bootimage? ( sys-boot/chromeos-bootimage ) cros_ec? ( chromeos-base/chromeos-ec )
-DESCRIPTION=Chrome OS Firmware (Template - change to board name)
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/firmware/
-IUSE=cros_host cros_workon_tree_bd5a0aab5cfa2cce33cd901716ef92d022d278a0 cros_host cros_workon_tree_bd5a0aab5cfa2cce33cd901716ef92d022d278a0 bootimage cros_ec cros_ish unibuild generated_cros_config
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/vboot_reference unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) app-arch/gzip app-arch/sharutils app-arch/tar sys-apps/util-linux chromeos-base/vpd sys-apps/flashrom sys-apps/mosys cros_ish? ( chromeos-base/chromeos-ish )
-RESTRICT=mirror
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-firmware	91b55a117e52b17b56b463f996a5311c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f27eef4d681c611e265a8e537e9e6fbb
diff --git a/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r159 b/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r159
new file mode 100644
index 0000000..22bd52c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-firmware-null-0.0.3-r159
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile info install setup test unpack
+DEPEND=chromeos-base/vboot_reference unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) app-arch/gzip app-arch/sharutils app-arch/tar sys-apps/util-linux bootimage? ( sys-boot/chromeos-bootimage ) cros_ec? ( chromeos-base/chromeos-ec )
+DESCRIPTION=Chrome OS Firmware (Template - change to board name)
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/firmware/
+IUSE=cros_host cros_workon_tree_9b119d2bf1a8adda71beea2e74ae3c59bc2f7e44 cros_host cros_workon_tree_9b119d2bf1a8adda71beea2e74ae3c59bc2f7e44 bootimage cros_ec cros_ish unibuild generated_cros_config
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/vboot_reference unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) app-arch/gzip app-arch/sharutils app-arch/tar sys-apps/util-linux chromeos-base/vpd sys-apps/flashrom sys-apps/mosys cros_ish? ( chromeos-base/chromeos-ish )
+RESTRICT=mirror
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-firmware	91b55a117e52b17b56b463f996a5311c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2507d99399f2c5f51b35520cf49d7013
diff --git a/metadata/md5-cache/chromeos-base/chromeos-firmware-null-9999 b/metadata/md5-cache/chromeos-base/chromeos-firmware-null-9999
index 0e70942..7e89d83a 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-firmware-null-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-firmware-null-9999
@@ -10,5 +10,5 @@
 RDEPEND=chromeos-base/vboot_reference unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) app-arch/gzip app-arch/sharutils app-arch/tar sys-apps/util-linux chromeos-base/vpd sys-apps/flashrom sys-apps/mosys cros_ish? ( chromeos-base/chromeos-ish )
 RESTRICT=mirror
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-firmware	91b55a117e52b17b56b463f996a5311c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-firmware	91b55a117e52b17b56b463f996a5311c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=de6ecd6d5e24caf9d8a8cf4f989341c6
diff --git a/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1 b/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1
index 08640d9..3d7deda 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1
+++ b/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1
@@ -1,11 +1,13 @@
+BDEPEND=chromeos-base/minijail
 DEFINED_PHASES=compile install setup
-DEPEND=internal? ( chromeos-base/monotype-fonts chromeos-base/google-sans-fonts ) media-fonts/croscorefonts media-fonts/crosextrafonts media-fonts/crosextrafonts-carlito media-fonts/noto-cjk media-fonts/notofonts media-fonts/ko-nanumfonts media-fonts/lohitfonts-cros media-fonts/robotofonts media-fonts/tibt-jomolhari media-libs/fontconfig !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-libs/glibc )
+DEPEND=internal? ( chromeos-base/monotype-fonts:= chromeos-base/google-sans-fonts:= ) media-fonts/croscorefonts:= media-fonts/crosextrafonts:= media-fonts/crosextrafonts-carlito:= media-fonts/noto-cjk:= media-fonts/notofonts:= media-fonts/ko-nanumfonts:= media-fonts/lohitfonts-cros:= media-fonts/robotofonts:= media-fonts/tibt-jomolhari:= media-libs/fontconfig:= !cros_host? ( sys-libs/gcc-libs:= ) cros_host? ( sys-libs/glibc:= )
 DESCRIPTION=Chrome OS Fonts (meta package)
-EAPI=6
+EAPI=7
 HOMEPAGE=http://src.chromium.org
 IUSE=cros_host internal
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=internal? ( chromeos-base/monotype-fonts chromeos-base/google-sans-fonts ) media-fonts/croscorefonts media-fonts/crosextrafonts media-fonts/crosextrafonts-carlito media-fonts/noto-cjk media-fonts/notofonts media-fonts/ko-nanumfonts media-fonts/lohitfonts-cros media-fonts/robotofonts media-fonts/tibt-jomolhari media-libs/fontconfig !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-libs/glibc )
+RDEPEND=internal? ( chromeos-base/monotype-fonts:= chromeos-base/google-sans-fonts:= ) media-fonts/croscorefonts:= media-fonts/crosextrafonts:= media-fonts/crosextrafonts-carlito:= media-fonts/noto-cjk:= media-fonts/notofonts:= media-fonts/ko-nanumfonts:= media-fonts/lohitfonts-cros:= media-fonts/robotofonts:= media-fonts/tibt-jomolhari:= media-libs/fontconfig:= !cros_host? ( sys-libs/gcc-libs:= ) cros_host? ( sys-libs/glibc:= )
 SLOT=0
-_md5_=68569f7a4ccd78206f9e90cf661ffb26
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda
+_md5_=4f72b104f60114cdca915ab0c43b699d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r45 b/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r45
deleted file mode 100644
index 08640d9..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r45
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install setup
-DEPEND=internal? ( chromeos-base/monotype-fonts chromeos-base/google-sans-fonts ) media-fonts/croscorefonts media-fonts/crosextrafonts media-fonts/crosextrafonts-carlito media-fonts/noto-cjk media-fonts/notofonts media-fonts/ko-nanumfonts media-fonts/lohitfonts-cros media-fonts/robotofonts media-fonts/tibt-jomolhari media-libs/fontconfig !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-libs/glibc )
-DESCRIPTION=Chrome OS Fonts (meta package)
-EAPI=6
-HOMEPAGE=http://src.chromium.org
-IUSE=cros_host internal
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=internal? ( chromeos-base/monotype-fonts chromeos-base/google-sans-fonts ) media-fonts/croscorefonts media-fonts/crosextrafonts media-fonts/crosextrafonts-carlito media-fonts/noto-cjk media-fonts/notofonts media-fonts/ko-nanumfonts media-fonts/lohitfonts-cros media-fonts/robotofonts media-fonts/tibt-jomolhari media-libs/fontconfig !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-libs/glibc )
-SLOT=0
-_md5_=68569f7a4ccd78206f9e90cf661ffb26
diff --git a/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r48 b/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r48
new file mode 100644
index 0000000..3d7deda
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-fonts-0.0.1-r48
@@ -0,0 +1,13 @@
+BDEPEND=chromeos-base/minijail
+DEFINED_PHASES=compile install setup
+DEPEND=internal? ( chromeos-base/monotype-fonts:= chromeos-base/google-sans-fonts:= ) media-fonts/croscorefonts:= media-fonts/crosextrafonts:= media-fonts/crosextrafonts-carlito:= media-fonts/noto-cjk:= media-fonts/notofonts:= media-fonts/ko-nanumfonts:= media-fonts/lohitfonts-cros:= media-fonts/robotofonts:= media-fonts/tibt-jomolhari:= media-libs/fontconfig:= !cros_host? ( sys-libs/gcc-libs:= ) cros_host? ( sys-libs/glibc:= )
+DESCRIPTION=Chrome OS Fonts (meta package)
+EAPI=7
+HOMEPAGE=http://src.chromium.org
+IUSE=cros_host internal
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=internal? ( chromeos-base/monotype-fonts:= chromeos-base/google-sans-fonts:= ) media-fonts/croscorefonts:= media-fonts/crosextrafonts:= media-fonts/crosextrafonts-carlito:= media-fonts/noto-cjk:= media-fonts/notofonts:= media-fonts/ko-nanumfonts:= media-fonts/lohitfonts-cros:= media-fonts/robotofonts:= media-fonts/tibt-jomolhari:= media-libs/fontconfig:= !cros_host? ( sys-libs/gcc-libs:= ) cros_host? ( sys-libs/glibc:= )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda
+_md5_=4f72b104f60114cdca915ab0c43b699d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-0.0.1-r181 b/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-0.0.1-r181
new file mode 100644
index 0000000..719c07d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-0.0.1-r181
@@ -0,0 +1,15 @@
+BDEPEND=>=chromeos-base/chromeos-config-host-0.0.2 dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot )
+DESCRIPTION=ChromeOS fingerprint MCU unittest binaries
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5
+KEYWORDS=*
+LICENSE=CrOS-EC
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecks
+SLOT=0/0.0.1-r181
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9ebcf7e5d6f919719953ed5790160504
diff --git a/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-9999 b/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-9999
new file mode 100644
index 0000000..259b482
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-fpmcu-unittests-9999
@@ -0,0 +1,15 @@
+BDEPEND=>=chromeos-base/chromeos-config-host-0.0.2 dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot )
+DESCRIPTION=ChromeOS fingerprint MCU unittest binaries
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=CrOS-EC
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecks
+SLOT=0/9999
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=aa432996ed74f04134d4569686259fc4
diff --git a/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3053 b/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3053
deleted file mode 100644
index b38d60c..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3053
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/dbus-glib dev-libs/glib sys-apps/rootdev chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Image-burning service for Chromium OS
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/image-burner/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_eb6a1368254e9a5e5f787ae6021b67abeddd3202_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_eb6a1368254e9a5e5f787ae6021b67abeddd3202_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/dbus-glib dev-libs/glib sys-apps/rootdev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f0a31b87abfcccc04c5142fee5ec6bed
diff --git a/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3075 b/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3075
new file mode 100644
index 0000000..d3a6205
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-imageburner-0.0.1-r3075
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/dbus-glib dev-libs/glib sys-apps/rootdev chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Image-burning service for Chromium OS
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/image-burner/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6d93bab895204ff24f1f087d6fd21737af87b549_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6d93bab895204ff24f1f087d6fd21737af87b549_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/dbus-glib dev-libs/glib sys-apps/rootdev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=043762b76b5ec0218e549b219b97c858
diff --git a/metadata/md5-cache/chromeos-base/chromeos-imageburner-9999 b/metadata/md5-cache/chromeos-base/chromeos-imageburner-9999
index 8c76e5c..15b0489 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-imageburner-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-imageburner-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/dbus-glib dev-libs/glib sys-apps/rootdev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c5e23ea088f9d4b75ae4259441df9c3b
diff --git a/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4073 b/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4073
deleted file mode 100644
index c674812..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4073
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= test? ( sys-process/psmisc dev-util/shunit2 sys-apps/diffutils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Upstart init scripts for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/init/
-IUSE=arcpp arcvm cros_embedded +debugd +encrypted_stateful frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi -s3halt +syslog systemd +udev vivid vtconsole cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d0d05330543de0caf86430a4fbe8a1ead43a14a0_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d0d05330543de0caf86430a4fbe8a1ead43a14a0_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= app-arch/tar app-misc/jq chromeos-base/bootstat !chromeos-base/chromeos-disableecho chromeos-base/chromeos-common-script chromeos-base/tty sys-apps/upstart sys-process/lsof virtual/chromeos-bootcomplete !cros_embedded? ( chromeos-base/common-assets chromeos-base/chromeos-storage-info chromeos-base/swap-init sys-fs/e2fsprogs ) frecon? ( sys-apps/frecon ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=e83fb04eca775cbfe5b8bc4ea9d4ab4a
diff --git a/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4123 b/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4123
new file mode 100644
index 0000000..5d66258
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-init-0.0.25-r4123
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= test? ( sys-process/psmisc dev-util/shunit2 sys-apps/diffutils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Upstart init scripts for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/init/
+IUSE=arcpp arcvm cros_embedded +debugd +encrypted_stateful +encrypted_reboot_vault frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi -s3halt +syslog systemd +udev vivid vtconsole cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_79d8199118fd10360cd65dcd53d67a89bb38dbe9_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_79d8199118fd10360cd65dcd53d67a89bb38dbe9_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= app-arch/tar app-misc/jq chromeos-base/bootstat !chromeos-base/chromeos-disableecho chromeos-base/chromeos-common-script chromeos-base/tty sys-apps/upstart sys-process/lsof virtual/chromeos-bootcomplete !cros_embedded? ( chromeos-base/common-assets chromeos-base/chromeos-storage-info chromeos-base/swap-init sys-fs/e2fsprogs ) frecon? ( sys-apps/frecon ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=04a51140d3fe886d13d9c2297a051a7d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-init-9999 b/metadata/md5-cache/chromeos-base/chromeos-init-9999
index 44b969d..63342d2 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-init-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-init-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= test? ( sys-process/psmisc dev-util/shunit2 sys-apps/diffutils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= test? ( sys-process/psmisc dev-util/shunit2 sys-apps/diffutils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Upstart init scripts for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/init/
-IUSE=arcpp arcvm cros_embedded +debugd +encrypted_stateful frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi -s3halt +syslog systemd +udev vivid vtconsole cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=arcpp arcvm cros_embedded +debugd +encrypted_stateful +encrypted_reboot_vault frecon kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 +midi -s3halt +syslog systemd +udev vivid vtconsole cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= app-arch/tar app-misc/jq chromeos-base/bootstat !chromeos-base/chromeos-disableecho chromeos-base/chromeos-common-script chromeos-base/tty sys-apps/upstart sys-process/lsof virtual/chromeos-bootcomplete !cros_embedded? ( chromeos-base/common-assets chromeos-base/chromeos-storage-info chromeos-base/swap-init sys-fs/e2fsprogs ) frecon? ( sys-apps/frecon ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/vboot_reference:= sys-apps/rootdev:= app-arch/tar app-misc/jq chromeos-base/bootstat !chromeos-base/chromeos-disableecho chromeos-base/chromeos-common-script chromeos-base/tty sys-apps/upstart sys-process/lsof virtual/chromeos-bootcomplete !cros_embedded? ( chromeos-base/common-assets chromeos-base/chromeos-storage-info chromeos-base/swap-init sys-fs/e2fsprogs ) frecon? ( sys-apps/frecon ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c99fe430b5e5077f34d11584de28b9e8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=53e4d150e6e2f4d7c0314324d4e65f66
diff --git a/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r357 b/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r357
deleted file mode 100644
index 3284baa..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r357
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install prepare setup unpack
-DEPEND=factory_netboot_ramfs? ( app-arch/lbzip2 app-arch/pigz app-arch/sharutils app-misc/jq app-shells/bash chromeos-base/chromeos-base chromeos-base/chromeos-installer chromeos-base/chromeos-installshim chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/factory_installer chromeos-base/vboot_reference chromeos-base/vpd dev-libs/openssl:0= dev-util/shflags dev-util/xxd net-misc/curl net-misc/htpdate net-misc/uftp net-misc/wget sys-apps/coreutils sys-apps/flashrom sys-apps/iproute2 sys-apps/mosys sys-apps/util-linux sys-block/parted sys-fs/dosfstools sys-fs/e2fsprogs sys-libs/ncurses virtual/udev ) factory_shim_ramfs? ( chromeos-base/factory_installer chromeos-base/vboot_reference ) recovery_ramfs? ( chromeos-base/chromeos-installer chromeos-base/common-assets chromeos-base/vboot_reference chromeos-base/vpd sys-apps/flashrom sys-apps/pv virtual/assets virtual/chromeos-regions ) hypervisor_ramfs? ( app-emulation/qemu virtual/linux-sources ) sys-apps/busybox[-make-symlinks] sys-fs/lvm2 virtual/chromeos-bsp-initramfs chromeos-base/chromeos-init sys-apps/frecon-lite power_management? ( chromeos-base/power_manager ) unibuild? ( chromeos-base/chromeos-config ) chromeos-base/chromeos-config-tools
-DESCRIPTION=Create Chrome OS initramfs
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/initramfs/
-IUSE=+cros_ec_utils detachable device_tree +interactive_recovery menu_ui -mtd +power_management physical_presence_power physical_presence_recovery unibuild factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs cros_host cros_workon_tree_a1246866b542ce61b72b3a67c2ab4a1597d171c1 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=|| ( factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs )
-SLOT=0
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=842be15cb0461bbd5dbd5807ab463f97
diff --git a/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r373 b/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r373
new file mode 100644
index 0000000..0ccba91
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-initramfs-0.0.1-r373
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install prepare setup unpack
+DEPEND=factory_netboot_ramfs? ( app-arch/lbzip2 app-arch/pigz app-arch/sharutils app-misc/jq app-shells/bash chromeos-base/chromeos-base chromeos-base/chromeos-installer chromeos-base/chromeos-installshim chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/factory_installer chromeos-base/vboot_reference chromeos-base/vpd dev-libs/openssl:0= dev-util/shflags dev-util/xxd net-misc/curl net-misc/htpdate net-misc/uftp net-misc/wget sys-apps/coreutils sys-apps/flashrom sys-apps/iproute2 sys-apps/mosys sys-apps/util-linux sys-block/parted sys-fs/dosfstools sys-fs/e2fsprogs sys-libs/ncurses virtual/udev ) factory_shim_ramfs? ( chromeos-base/factory_installer chromeos-base/vboot_reference ) recovery_ramfs? ( chromeos-base/chromeos-installer chromeos-base/common-assets chromeos-base/vboot_reference chromeos-base/vpd sys-apps/flashrom sys-apps/pv virtual/assets virtual/chromeos-regions ) hypervisor_ramfs? ( chromeos-base/crosvm chromeos-base/sirenia virtual/linux-sources ) sys-apps/busybox[-make-symlinks] sys-fs/lvm2 virtual/chromeos-bsp-initramfs chromeos-base/chromeos-init sys-apps/frecon-lite power_management? ( chromeos-base/power_manager ) unibuild? ( chromeos-base/chromeos-config ) chromeos-base/chromeos-config-tools
+DESCRIPTION=Create Chrome OS initramfs
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/initramfs/
+IUSE=+cros_ec_utils detachable device_tree +interactive_recovery menu_ui -mtd +power_management physical_presence_power physical_presence_recovery unibuild factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs cros_host cros_workon_tree_45dfea0fe9ae5afd06db7dab5b638db52dd22ea0 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=|| ( factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs )
+SLOT=0
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5e71f916d85fdacd77b9364a896d5217
diff --git a/metadata/md5-cache/chromeos-base/chromeos-initramfs-9999 b/metadata/md5-cache/chromeos-base/chromeos-initramfs-9999
index 7fd462b..fbf929d 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-initramfs-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-initramfs-9999
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile info install prepare setup unpack
-DEPEND=factory_netboot_ramfs? ( app-arch/lbzip2 app-arch/pigz app-arch/sharutils app-misc/jq app-shells/bash chromeos-base/chromeos-base chromeos-base/chromeos-installer chromeos-base/chromeos-installshim chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/factory_installer chromeos-base/vboot_reference chromeos-base/vpd dev-libs/openssl:0= dev-util/shflags dev-util/xxd net-misc/curl net-misc/htpdate net-misc/uftp net-misc/wget sys-apps/coreutils sys-apps/flashrom sys-apps/iproute2 sys-apps/mosys sys-apps/util-linux sys-block/parted sys-fs/dosfstools sys-fs/e2fsprogs sys-libs/ncurses virtual/udev ) factory_shim_ramfs? ( chromeos-base/factory_installer chromeos-base/vboot_reference ) recovery_ramfs? ( chromeos-base/chromeos-installer chromeos-base/common-assets chromeos-base/vboot_reference chromeos-base/vpd sys-apps/flashrom sys-apps/pv virtual/assets virtual/chromeos-regions ) hypervisor_ramfs? ( app-emulation/qemu virtual/linux-sources ) sys-apps/busybox[-make-symlinks] sys-fs/lvm2 virtual/chromeos-bsp-initramfs chromeos-base/chromeos-init sys-apps/frecon-lite power_management? ( chromeos-base/power_manager ) unibuild? ( chromeos-base/chromeos-config ) chromeos-base/chromeos-config-tools
+DEPEND=factory_netboot_ramfs? ( app-arch/lbzip2 app-arch/pigz app-arch/sharutils app-misc/jq app-shells/bash chromeos-base/chromeos-base chromeos-base/chromeos-installer chromeos-base/chromeos-installshim chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/factory_installer chromeos-base/vboot_reference chromeos-base/vpd dev-libs/openssl:0= dev-util/shflags dev-util/xxd net-misc/curl net-misc/htpdate net-misc/uftp net-misc/wget sys-apps/coreutils sys-apps/flashrom sys-apps/iproute2 sys-apps/mosys sys-apps/util-linux sys-block/parted sys-fs/dosfstools sys-fs/e2fsprogs sys-libs/ncurses virtual/udev ) factory_shim_ramfs? ( chromeos-base/factory_installer chromeos-base/vboot_reference ) recovery_ramfs? ( chromeos-base/chromeos-installer chromeos-base/common-assets chromeos-base/vboot_reference chromeos-base/vpd sys-apps/flashrom sys-apps/pv virtual/assets virtual/chromeos-regions ) hypervisor_ramfs? ( chromeos-base/crosvm chromeos-base/sirenia virtual/linux-sources ) sys-apps/busybox[-make-symlinks] sys-fs/lvm2 virtual/chromeos-bsp-initramfs chromeos-base/chromeos-init sys-apps/frecon-lite power_management? ( chromeos-base/power_manager ) unibuild? ( chromeos-base/chromeos-config ) chromeos-base/chromeos-config-tools
 DESCRIPTION=Create Chrome OS initramfs
 EAPI=6
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/initramfs/
-IUSE=+cros_ec_utils detachable device_tree +interactive_recovery menu_ui -mtd +power_management physical_presence_power physical_presence_recovery unibuild factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
+IUSE=+cros_ec_utils detachable device_tree +interactive_recovery menu_ui -mtd +power_management physical_presence_power physical_presence_recovery unibuild factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 REQUIRED_USE=|| ( factory_netboot_ramfs factory_shim_ramfs hypervisor_ramfs recovery_ramfs )
 SLOT=0
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=79ea2f22c6b66561b7ad310fa54a6b2c
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9675303d26dea4551ce8aa4096c81e7d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3381 b/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3381
deleted file mode 100644
index d459d9c..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3381
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:= chromeos-base/vboot_reference chromeos-base/verity dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
-DESCRIPTION=Chrome OS Installer
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/installer/
-IUSE=cros_embedded cros_host enable_slow_boot_notify -mtd pam systemd test +oobe_config cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3a608885c9d4dc5bc5fee48f1bac2c54e75363e1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3a608885c9d4dc5bc5fee48f1bac2c54e75363e1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:= chromeos-base/vboot_reference pam? ( app-admin/sudo ) chromeos-base/chromeos-common-script !cros_host? ( !cros_embedded? ( chromeos-base/chromeos-storage-info ) oobe_config? ( chromeos-base/oobe_config ) dev-libs/openssl:0= ) dev-util/shflags sys-apps/rootdev sys-apps/util-linux sys-apps/which sys-fs/e2fsprogs >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3a9de552ca35131d4b78d6409a9b30c0
diff --git a/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3412 b/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3412
new file mode 100644
index 0000000..ad0911b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-installer-0.0.3-r3412
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:= chromeos-base/vboot_reference chromeos-base/verity dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
+DESCRIPTION=Chrome OS Installer
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/installer/
+IUSE=cros_embedded cros_host enable_slow_boot_notify -mtd pam systemd test +oobe_config cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e9e3cf94b89dd01fc63d895c603e52eb316c513f_78f05413fa5932fd3644b2dc70442ba3f39fcbf0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e9e3cf94b89dd01fc63d895c603e52eb316c513f_78f05413fa5932fd3644b2dc70442ba3f39fcbf0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:= chromeos-base/vboot_reference pam? ( app-admin/sudo ) chromeos-base/chromeos-common-script !cros_host? ( !cros_embedded? ( chromeos-base/chromeos-storage-info ) oobe_config? ( chromeos-base/oobe_config ) dev-libs/openssl:0= ) dev-util/shflags sys-apps/rootdev sys-apps/util-linux sys-apps/which sys-fs/e2fsprogs >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dbf2499cb2c42425f52d6e1beca3909f
diff --git a/metadata/md5-cache/chromeos-base/chromeos-installer-9999 b/metadata/md5-cache/chromeos-base/chromeos-installer-9999
index 6ce1e14..84aec38 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-installer-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-installer-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libbrillo:= chromeos-base/vboot_reference pam? ( app-admin/sudo ) chromeos-base/chromeos-common-script !cros_host? ( !cros_embedded? ( chromeos-base/chromeos-storage-info ) oobe_config? ( chromeos-base/oobe_config ) dev-libs/openssl:0= ) dev-util/shflags sys-apps/rootdev sys-apps/util-linux sys-apps/which sys-fs/e2fsprogs >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b866c91d210b839fae78170f5c1ebbe2
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7e8bcd92ee2f895aaafe8a4f75b6f834
diff --git a/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4405 b/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4405
deleted file mode 100644
index 528d367..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4405
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Login manager for Chromium OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-login/
-IUSE=arc_adb_sideloading cheets fuzzer generated_cros_config systemd unibuild user_session_isolation cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_98c0db7e92836fcb71403a83973a9b5018fe6177_a90cb5e41531689eaaed6fa5fa99fefc4671dd7f_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_98c0db7e92836fcb71403a83973a9b5018fe6177_a90cb5e41531689eaaed6fa5fa99fefc4671dd7f_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.2-r4405
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=9c965de2e58a680ea8e3fc01dd41da83
diff --git a/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4501 b/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4501
new file mode 100644
index 0000000..a6554c7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-login-0.0.2-r4501
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Login manager for Chromium OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-login/
+IUSE=arc_adb_sideloading cheets fuzzer generated_cros_config systemd unibuild user_session_isolation cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_04a8a0274b23f4bbf01eb2645630f252331db474_377caa22e8416ce2388b9c099e85be393001947f_e806dcb7edc3d4f31afb9edf7056156cbbc63273_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_04a8a0274b23f4bbf01eb2645630f252331db474_377caa22e8416ce2388b9c099e85be393001947f_e806dcb7edc3d4f31afb9edf7056156cbbc63273_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.2-r4501
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=fd4aecbd260423fc13ae014832e87417
diff --git a/metadata/md5-cache/chromeos-base/chromeos-login-9999 b/metadata/md5-cache/chromeos-base/chromeos-login-9999
index 95b7c23..6620825 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-login-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-login-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/protofiles-0.0.39:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Login manager for Chromium OS.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/chromeos-login/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/bootstat:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/minijail:= chromeos-base/cryptohome:= chromeos-base/libchromeos-ui:= chromeos-base/libcontainer:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/nss:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-apps/util-linux:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=ad28e0e7c3d1de568926cf2ae398a621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=970c2b15e4b8509356c787e0944a5f5d
diff --git a/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r1 b/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r1
deleted file mode 100644
index 557bf8d..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install preinst setup unpack
-DEPEND=sys-apps/baselayout
-DESCRIPTION=Shell library for integrating the Novatek TCON Firmware updater
-EAPI=7
-IUSE=cros_host cros_workon_tree_809788aa7ecc2503360f53644223a0b1398403e0
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/chromeos-init chromeos-base/common-assets chromeos-base/minijail sys-apps/novatek-tcon-fw-update-tool sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=127d42b9996b46b1c13643a7c0e9b0f6
diff --git a/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r2 b/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r2
new file mode 100644
index 0000000..b98ae96
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-0.0.1-r2
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install preinst setup unpack
+DEPEND=sys-apps/baselayout
+DESCRIPTION=Shell library for integrating the Novatek TCON Firmware updater
+EAPI=7
+IUSE=cros_host cros_workon_tree_b349f1dab647f2028f8451aef030805eb8a13e64
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/chromeos-init chromeos-base/common-assets chromeos-base/minijail sys-apps/novatek-tcon-fw-update-tool sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=7b4d58261749d01b4e5fb7b18e353073
diff --git a/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-9999 b/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-9999
index 945a94f..bb78ea3 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-nvt-tcon-updater-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-init chromeos-base/common-assets chromeos-base/minijail sys-apps/novatek-tcon-fw-update-tool sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=4d23048ea58e8f447b9de1e64d2a5afa
diff --git a/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r200 b/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r200
deleted file mode 100644
index 068b4ad..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r200
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS storage info tools
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/storage_info/
-IUSE=+mmc nvme +sata test cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8d5d5e575da16bb48f735ef93feedcfae4b1586e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8d5d5e575da16bb48f735ef93feedcfae4b1586e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-common-script !<chromeos-base/chromeos-installer-0.0.3 sata? ( sys-apps/hdparm sys-apps/smartmontools ) nvme? ( sys-apps/smartmontools ) mmc? ( sys-apps/mmc-utils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=40ca8e18395f67a27da6ae272cbfa5cc
diff --git a/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r220 b/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r220
new file mode 100644
index 0000000..b53d8a2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-storage-info-0.0.1-r220
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS storage info tools
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/storage_info/
+IUSE=+mmc nvme +sata test cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8d5d5e575da16bb48f735ef93feedcfae4b1586e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8d5d5e575da16bb48f735ef93feedcfae4b1586e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-common-script !<chromeos-base/chromeos-installer-0.0.3 sata? ( sys-apps/hdparm sys-apps/smartmontools ) nvme? ( sys-apps/smartmontools ) mmc? ( sys-apps/mmc-utils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=74dac29739269405ee6036b901ef0202
diff --git a/metadata/md5-cache/chromeos-base/chromeos-storage-info-9999 b/metadata/md5-cache/chromeos-base/chromeos-storage-info-9999
index c571993..3180045 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-storage-info-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-storage-info-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chromeos-common-script !<chromeos-base/chromeos-installer-0.0.3 sata? ( sys-apps/hdparm sys-apps/smartmontools ) nvme? ( sys-apps/smartmontools ) mmc? ( sys-apps/mmc-utils ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bdfc84661bf6f98a7b5cfcc25f90bdea
diff --git a/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3155 b/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3155
deleted file mode 100644
index 7d79ae4..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3155
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Additional upstart jobs that will be installed on test images
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/init/
-IUSE=+encrypted_stateful tpm2 cros_host cros_workon_tree_26e984b6205ab9684bc709846aa1ac4659fdd7c2
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ac9968c8a78b6d873fa42a79deea4bb4
diff --git a/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3159 b/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3159
new file mode 100644
index 0000000..dbba1c9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-test-init-0.0.1-r3159
@@ -0,0 +1,12 @@
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Additional upstart jobs that will be installed on test images
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/init/
+IUSE=+encrypted_stateful tpm2 cros_host cros_workon_tree_2f29d2fb07aded06a517b2c828c25133d679de2d
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/hwsec-test-utils-0.0.1-r83
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=26afdcd546903593bf505f50d7b23486
diff --git a/metadata/md5-cache/chromeos-base/chromeos-test-init-9999 b/metadata/md5-cache/chromeos-base/chromeos-test-init-9999
index feabed2..30c4c09 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-test-init-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-test-init-9999
@@ -6,6 +6,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
+RDEPEND=!<chromeos-base/hwsec-test-utils-0.0.1-r83
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4251d0da8d122e0d482faf8ee9cfd226
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=85bdc92712b9001b9afa14966a25e655
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-common-0.0.1-r6 b/metadata/md5-cache/chromeos-base/chromeos-touch-common-0.0.1-r6
index 4ed4888..694dba2 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-common-0.0.1-r6
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-common-0.0.1-r6
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/mosys !<chromeos-base/touch_updater-0.0.1-r167
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a3917eb920998248a893ce20c5d132dd
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-common-9999 b/metadata/md5-cache/chromeos-base/chromeos-touch-common-9999
index b359d7b..76f2047 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-common-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-common-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/mosys !<chromeos-base/touch_updater-0.0.1-r167
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4486e42cf03b8f39e988d8813bf4c852
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-0.0.1-r6 b/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-0.0.1-r6
index 75f3487..c449e8d 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-0.0.1-r6
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-0.0.1-r6
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-touch-common sys-apps/etphidiap !<chromeos-base/touch_updater-0.0.1-r167 sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=2807a8f9ff83ce2ff08665f8d80e24e7
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-9999 b/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-9999
index c593d17..6260431 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-etphidiap-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-touch-common sys-apps/etphidiap !<chromeos-base/touch_updater-0.0.1-r167 sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=497aba3022c1ae69c021f51f809ba272
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-0.0.1-r6 b/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-0.0.1-r6
index 0059d5a..b38be7c 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-0.0.1-r6
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-0.0.1-r6
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-touch-common sys-apps/st-touch-fw-updater !<chromeos-base/touch_updater-0.0.1-r167 sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=51a51e6107e8e85c5a53aa9b1f5a4309
diff --git a/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-9999 b/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-9999
index 81555f8..a2c4ea3 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-touch-stupdate-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-touch-common sys-apps/st-touch-fw-updater !<chromeos-base/touch_updater-0.0.1-r167 sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=e55b82602fc10e628bb936b009197a72
diff --git a/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1585 b/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1585
deleted file mode 100644
index e01d4a9..0000000
--- a/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1585
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Stateful partition periodic trimmer
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trim/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_32889491ba02d445795d90f505ad4e9a07cfc0ed_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_32889491ba02d445795d90f505ad4e9a07cfc0ed_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-common-script chromeos-base/chromeos-init sys-apps/util-linux >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=21297394738550c9da460c18b2c48f17
diff --git a/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1606 b/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1606
new file mode 100644
index 0000000..cf92833
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-trim-0.0.1-r1606
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Stateful partition periodic trimmer
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trim/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1e69ede3d074afd135fa6f2136ea5d99c425702b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1e69ede3d074afd135fa6f2136ea5d99c425702b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-common-script chromeos-base/chromeos-init sys-apps/util-linux >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b7d448df02a260821710f05cd1efa4ca
diff --git a/metadata/md5-cache/chromeos-base/chromeos-trim-9999 b/metadata/md5-cache/chromeos-base/chromeos-trim-9999
index 4087655..80ff7a8 100644
--- a/metadata/md5-cache/chromeos-base/chromeos-trim-9999
+++ b/metadata/md5-cache/chromeos-base/chromeos-trim-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chromeos-common-script chromeos-base/chromeos-init sys-apps/util-linux >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=971be24137bdb2c4064a54770eaa8545
diff --git a/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-0.0.1-r12 b/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-0.0.1-r12
new file mode 100644
index 0000000..d11bd23
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-0.0.1-r12
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-python/docopt dev-python/pykwalify dev-util/ninja dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=chromeos-base/chromeos-config
+DESCRIPTION=Zephyr v2.3 based embedded controller firmware
+EAPI=7
+HOMEPAGE=http://src.chromium.org
+IUSE=cros_host cros_workon_tree_8ba3164cb59a3aab71c576b877561dd3f8fdac85_c8b449c296158acf7ce11ac65e2ac577247560da_c7037905e78a10c0920e0834700c2b5888c8d114_cbfc2404c2e411908f5e8db083daf3041b408522 unibuild cros_host cros_workon_tree_8ba3164cb59a3aab71c576b877561dd3f8fdac85_c8b449c296158acf7ce11ac65e2ac577247560da_c7037905e78a10c0920e0834700c2b5888c8d114_cbfc2404c2e411908f5e8db083daf3041b408522
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+REQUIRED_USE=unibuild
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	cros-zephyr	8bb3e1ecb4e8b7122615bdbbdf879df3	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d0bbedca488e132074be5fc272fd66f7
diff --git a/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-9999 b/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-9999
new file mode 100644
index 0000000..6d4a041
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromeos-zephyr-2_3-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-python/docopt dev-python/pykwalify dev-util/ninja dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=chromeos-base/chromeos-config
+DESCRIPTION=Zephyr v2.3 based embedded controller firmware
+EAPI=7
+HOMEPAGE=http://src.chromium.org
+IUSE=cros_host cros_workon_tree_ unibuild cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+REQUIRED_USE=unibuild
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	cros-zephyr	8bb3e1ecb4e8b7122615bdbbdf879df3	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=914e4ea1a194b7097c4aaca12a3be1b0
diff --git a/metadata/md5-cache/chromeos-base/chromite-0.0.2-r6963 b/metadata/md5-cache/chromeos-base/chromite-0.0.2-r6963
deleted file mode 100644
index ae8a116..0000000
--- a/metadata/md5-cache/chromeos-base/chromite-0.0.2-r6963
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Wrapper for running chromite unit tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/chromite/
-IUSE=cros_host cros_workon_tree_8193f8593a74fbd13c8e2dfd157f6eccd8c88a28 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RESTRICT=test
-SLOT=0/0.0.2-r6963
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b2d67b4f67ac368aede113a6a82bc9af
diff --git a/metadata/md5-cache/chromeos-base/chromite-0.0.2-r7250 b/metadata/md5-cache/chromeos-base/chromite-0.0.2-r7250
new file mode 100644
index 0000000..05c8710
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromite-0.0.2-r7250
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Wrapper for running chromite unit tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/chromite/
+IUSE=cros_host cros_workon_tree_4fb4c4e51179ff3ab16b44b5574cbb7cbb36f717 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RESTRICT=test
+SLOT=0/0.0.2-r7250
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a90fcaca64c640afb2d4cbb2433d8c8a
diff --git a/metadata/md5-cache/chromeos-base/chromite-9999 b/metadata/md5-cache/chromeos-base/chromite-9999
index ff0fe8c..c872456 100644
--- a/metadata/md5-cache/chromeos-base/chromite-9999
+++ b/metadata/md5-cache/chromeos-base/chromite-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RESTRICT=test
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=74283dbf10bd67de7c28a012e3143b30
diff --git a/metadata/md5-cache/chromeos-base/chromite-sdk-1 b/metadata/md5-cache/chromeos-base/chromite-sdk-1
index 5339bb9..4eb8b2b 100644
--- a/metadata/md5-cache/chromeos-base/chromite-sdk-1
+++ b/metadata/md5-cache/chromeos-base/chromite-sdk-1
@@ -6,5 +6,5 @@
 KEYWORDS=*
 LICENSE=BSD-Google
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a4a2b4bb586261336c589046670ef74e
diff --git a/metadata/md5-cache/chromeos-base/chromite-sdk-1-r1 b/metadata/md5-cache/chromeos-base/chromite-sdk-1-r1
index 5339bb9..4eb8b2b 100644
--- a/metadata/md5-cache/chromeos-base/chromite-sdk-1-r1
+++ b/metadata/md5-cache/chromeos-base/chromite-sdk-1-r1
@@ -6,5 +6,5 @@
 KEYWORDS=*
 LICENSE=BSD-Google
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a4a2b4bb586261336c589046670ef74e
diff --git a/metadata/md5-cache/chromeos-base/chromium-source-86.0.4194.0_rc-r1 b/metadata/md5-cache/chromeos-base/chromium-source-86.0.4194.0_rc-r1
deleted file mode 100644
index 2a88fe4..0000000
--- a/metadata/md5-cache/chromeos-base/chromium-source-86.0.4194.0_rc-r1
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=unpack
-DESCRIPTION=Source code for the open-source version of Google Chrome web browser
-EAPI=6
-HOMEPAGE=http://www.chromium.org/
-IUSE=chrome_internal
-KEYWORDS=*
-LICENSE=BSD-Google chrome_internal? ( Google-TOS )
-SLOT=0
-_eclasses_=chromium-source	cb1e2772ade26c9cdedbfec2526f7e14	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92
-_md5_=291ca4eadc26429efa91579c3fd47bc9
diff --git a/metadata/md5-cache/chromeos-base/chromium-source-87.0.4280.0_rc-r1 b/metadata/md5-cache/chromeos-base/chromium-source-87.0.4280.0_rc-r1
new file mode 100644
index 0000000..ed6853d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chromium-source-87.0.4280.0_rc-r1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=unpack
+DESCRIPTION=Source code for the open-source version of Google Chrome web browser
+EAPI=6
+HOMEPAGE=http://www.chromium.org/
+IUSE=chrome_internal
+KEYWORDS=*
+LICENSE=BSD-Google chrome_internal? ( Google-TOS )
+SLOT=0
+_eclasses_=chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92
+_md5_=291ca4eadc26429efa91579c3fd47bc9
diff --git a/metadata/md5-cache/chromeos-base/chromium-source-9999 b/metadata/md5-cache/chromeos-base/chromium-source-9999
index d3bee5d..5eaa9f8 100644
--- a/metadata/md5-cache/chromeos-base/chromium-source-9999
+++ b/metadata/md5-cache/chromeos-base/chromium-source-9999
@@ -6,5 +6,5 @@
 KEYWORDS=~*
 LICENSE=BSD-Google chrome_internal? ( Google-TOS )
 SLOT=0
-_eclasses_=chromium-source	cb1e2772ade26c9cdedbfec2526f7e14	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92
+_eclasses_=chromium-source	02ac5d86b66541750756714fe10f8f49	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92
 _md5_=bef178d3fd767cf3ba1477609fef309e
diff --git a/metadata/md5-cache/chromeos-base/chromiumos-assets-0.0.1-r13 b/metadata/md5-cache/chromeos-base/chromiumos-assets-0.0.1-r13
index 2b1b645..bb483e9 100644
--- a/metadata/md5-cache/chromeos-base/chromiumos-assets-0.0.1-r13
+++ b/metadata/md5-cache/chromeos-base/chromiumos-assets-0.0.1-r13
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f9d1b62682089a0bab4d43db7b689613
diff --git a/metadata/md5-cache/chromeos-base/chromiumos-assets-9999 b/metadata/md5-cache/chromeos-base/chromiumos-assets-9999
index 36de1b8..1ced628 100644
--- a/metadata/md5-cache/chromeos-base/chromiumos-assets-9999
+++ b/metadata/md5-cache/chromeos-base/chromiumos-assets-9999
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ac9c044d071d877406155729812ce5d2
diff --git a/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r13 b/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r13
new file mode 100644
index 0000000..4e4d685
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r13
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
+DEPEND=chromeos-base/system_api:= dev-rust/libchromeos:= dev-rust/sys_util:= =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.16.2:= <dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.16.2:= <dev-rust/protoc-rust-3 =dev-rust/tempfile-3*:= =dev-rust/remain-0.2*:= sys-apps/dbus:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DESCRIPTION=Tunnel between localhost in different netns
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel
+IUSE=kvm_host cros_host cros_workon_tree_4e2937d79e5021b5b73aa61d0581ae72a7fc229d cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/baselayout
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=77cf718a9f50ac9226f59b9d78d1eeb5
diff --git a/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r9 b/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r9
deleted file mode 100644
index 52ff7e3..0000000
--- a/metadata/md5-cache/chromeos-base/chunnel-0.1.0-r9
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= dev-rust/libchromeos:= dev-rust/sys_util:= =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/protobuf-2*:= =dev-rust/protoc-rust-2*:= =dev-rust/tempfile-3*:= =dev-rust/remain-0.2*:= sys-apps/dbus:= >=virtual/rust-1.39.0:= sys-apps/baselayout
-DESCRIPTION=Tunnel between localhost in different netns
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel
-IUSE=kvm_host cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_e6a19d66642822ea81050746041409c324f84fde
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-apps/baselayout
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=cc1d8152aa20ba63bd1f8af8b074b915
diff --git a/metadata/md5-cache/chromeos-base/chunnel-9999 b/metadata/md5-cache/chromeos-base/chunnel-9999
index ead952f..f0116b4 100644
--- a/metadata/md5-cache/chromeos-base/chunnel-9999
+++ b/metadata/md5-cache/chromeos-base/chunnel-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= dev-rust/libchromeos:= dev-rust/sys_util:= =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/protobuf-2*:= =dev-rust/protoc-rust-2*:= =dev-rust/tempfile-3*:= =dev-rust/remain-0.2*:= sys-apps/dbus:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DEPEND=chromeos-base/system_api:= dev-rust/libchromeos:= dev-rust/sys_util:= =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.16.2:= <dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.16.2:= <dev-rust/protoc-rust-3 =dev-rust/tempfile-3*:= =dev-rust/remain-0.2*:= sys-apps/dbus:= >=virtual/rust-1.39.0:= sys-apps/baselayout
 DESCRIPTION=Tunnel between localhost in different netns
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/chunnel
-IUSE=kvm_host cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_
+IUSE=kvm_host cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 RDEPEND=sys-apps/baselayout
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=75d2a9fd3b62092e4b4dbfb4c23d47af
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=37ffdf5e63b72d48f0aedf55f15aec67
diff --git a/metadata/md5-cache/chromeos-base/codelab-0.0.1-r103 b/metadata/md5-cache/chromeos-base/codelab-0.0.1-r103
new file mode 100644
index 0000000..5599786
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/codelab-0.0.1-r103
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Developer codelab for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/codelab/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_acb8671d02acc0370dcec2465461073d658a6a98_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_acb8671d02acc0370dcec2465461073d658a6a98_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r103
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2207777de5a5678c1709037f0689a324
diff --git a/metadata/md5-cache/chromeos-base/codelab-0.0.1-r83 b/metadata/md5-cache/chromeos-base/codelab-0.0.1-r83
deleted file mode 100644
index f35a2ab..0000000
--- a/metadata/md5-cache/chromeos-base/codelab-0.0.1-r83
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Developer codelab for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/codelab/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_acb8671d02acc0370dcec2465461073d658a6a98_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_acb8671d02acc0370dcec2465461073d658a6a98_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r83
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d3cdac6ea3da824499110071a4caaedb
diff --git a/metadata/md5-cache/chromeos-base/codelab-9999 b/metadata/md5-cache/chromeos-base/codelab-9999
index 8f5a61e..c280f17 100644
--- a/metadata/md5-cache/chromeos-base/codelab-9999
+++ b/metadata/md5-cache/chromeos-base/codelab-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a1292a0bad33a5c2279e2432e2e3a017
diff --git a/metadata/md5-cache/chromeos-base/common-assets-0.0.2-r128 b/metadata/md5-cache/chromeos-base/common-assets-0.0.2-r128
index c83b83b..152d68e 100644
--- a/metadata/md5-cache/chromeos-base/common-assets-0.0.2-r128
+++ b/metadata/md5-cache/chromeos-base/common-assets-0.0.2-r128
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=fonts? ( chromeos-base/chromeos-fonts ) x11-libs/pango
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ec2f3c4740ddd6cb062024011f5906bb
diff --git a/metadata/md5-cache/chromeos-base/common-assets-9999 b/metadata/md5-cache/chromeos-base/common-assets-9999
index 46a8a32..2543881 100644
--- a/metadata/md5-cache/chromeos-base/common-assets-9999
+++ b/metadata/md5-cache/chromeos-base/common-assets-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=fonts? ( chromeos-base/chromeos-fonts ) x11-libs/pango
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=340da8ce360ee9c3897bf81d59516681
diff --git a/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3312 b/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3312
deleted file mode 100644
index d5379cc..0000000
--- a/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3312
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?] chromeos-base/metrics:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/debugd-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= chromeos-base/vm_protos:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Crash reporting service that uploads crash reports with debug information
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/
-IUSE=cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_197046ff3b04ce2b8d6a73c415ec3b924bccdc44_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros_i686 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_197046ff3b04ce2b8d6a73c415ec3b924bccdc44_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_197046ff3b04ce2b8d6a73c415ec3b924bccdc44_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?] chromeos-base/metrics:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/chromeos-ca-certificates || ( sys-apps/journald:= sys-apps/systemd:= ) direncryption? ( sys-apps/keyutils:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r3312
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=49af175419c76181e8fe97ae2152f8f9
diff --git a/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3393 b/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3393
new file mode 100644
index 0000000..dbe0a98
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crash-reporter-0.0.1-r3393
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?] >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/debugd-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= chromeos-base/vm_protos:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Crash reporting service that uploads crash reports with debug information
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/
+IUSE=cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe6bc7b181ff1a027ce19e501f24cc9552eff36_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros_arm64 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe6bc7b181ff1a027ce19e501f24cc9552eff36_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros_i686 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe6bc7b181ff1a027ce19e501f24cc9552eff36_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe6bc7b181ff1a027ce19e501f24cc9552eff36_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live live
+RDEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?] >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/chromeos-ca-certificates || ( sys-apps/journald:= sys-apps/systemd:= ) direncryption? ( sys-apps/keyutils:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r3393
+_eclasses_=cros-arm64	f1a25262a61026d22719ab66e21b64c7	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=f39c6ee2b21439e344db48eeeb8ddafa
diff --git a/metadata/md5-cache/chromeos-base/crash-reporter-9999 b/metadata/md5-cache/chromeos-base/crash-reporter-9999
index 243925b..8faae60 100644
--- a/metadata/md5-cache/chromeos-base/crash-reporter-9999
+++ b/metadata/md5-cache/chromeos-base/crash-reporter-9999
@@ -1,14 +1,14 @@
-BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?] chromeos-base/metrics:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/debugd-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= chromeos-base/vm_protos:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?] >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/debugd-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= chromeos-base/vm_protos:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Crash reporting service that uploads crash reports with debug information
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/crash-reporter/
-IUSE=cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer cros_host cros_workon_tree_ cros_i686 cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=cheets chromeless_tty cros_embedded -direncryption kvm_guest systemd fuzzer cros_host cros_workon_tree_ cros_arm64 cros_host cros_workon_tree_ cros_i686 cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?] chromeos-base/metrics:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/chromeos-ca-certificates || ( sys-apps/journald:= sys-apps/systemd:= ) direncryption? ( sys-apps/keyutils:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+PROPERTIES=live live live live
+RDEPEND=chromeos-base/minijail:= chromeos-base/google-breakpad:=[cros_i686?,cros_arm64?] >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libpcre:= dev-libs/protobuf:= dev-libs/re2:= kvm_guest? ( net-libs/grpc:= ) net-misc/curl:= sys-libs/zlib:= chromeos-base/chromeos-ca-certificates || ( sys-apps/journald:= sys-apps/systemd:= ) direncryption? ( sys-apps/keyutils:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=0c30ddc0b1fe5de7a803914d89d4097e
+_eclasses_=cros-arm64	f1a25262a61026d22719ab66e21b64c7	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=0d0544b7a43dfcc8cbc11668afe69369
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r628 b/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r628
deleted file mode 100644
index 833c941..0000000
--- a/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r628
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= virtual/cros-camera-effects libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) chromeos-base/metrics:= media-libs/cros-camera-android-headers:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Chrome OS camera service. The service is in charge of accessing camera device. It uses unix domain socket to build a synchronous channel.
-EAPI=7
-IUSE=arc-camera1 cheets +cros-camera-algo-sandbox -libcamera cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_38141fe7ee3de0f6566dcc97771686826333dcfb_6a2b67fcc0394c08e3fe4dbddde59129bbd55899_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_38141fe7ee3de0f6566dcc97771686826333dcfb_6a2b67fcc0394c08e3fe4dbddde59129bbd55899_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_38141fe7ee3de0f6566dcc97771686826333dcfb_6a2b67fcc0394c08e3fe4dbddde59129bbd55899_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= virtual/cros-camera-effects libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r628
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=f689ec54ef46ec6d8f66f7a1aa37746b
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r716 b/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r716
new file mode 100644
index 0000000..de4bdfa
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cros-camera-0.0.1-r716
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/metrics-0.0.1-r3152:= media-libs/cros-camera-android-headers:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chrome OS camera service. The service is in charge of accessing camera device. It uses unix domain socket to build a synchronous channel.
+EAPI=7
+IUSE=arc-camera1 cheets +cros-camera-algo-sandbox -libcamera cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_c1b99373c190d9f41fdd16811e20200d01f47f3f_e885a36a16305efc80401bbc17d9a304c25e8b79_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_c1b99373c190d9f41fdd16811e20200d01f47f3f_e885a36a16305efc80401bbc17d9a304c25e8b79_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_c1b99373c190d9f41fdd16811e20200d01f47f3f_e885a36a16305efc80401bbc17d9a304c25e8b79_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r716
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=3f7060c3d7144716f2662f9e694e75ec
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-9999 b/metadata/md5-cache/chromeos-base/cros-camera-9999
index 9c0921c..c8a2cce 100644
--- a/metadata/md5-cache/chromeos-base/cros-camera-9999
+++ b/metadata/md5-cache/chromeos-base/cros-camera-9999
@@ -1,13 +1,13 @@
 BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= virtual/cros-camera-effects libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) chromeos-base/metrics:= media-libs/cros-camera-android-headers:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/metrics-0.0.1-r3152:= media-libs/cros-camera-android-headers:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Chrome OS camera service. The service is in charge of accessing camera device. It uses unix domain socket to build a synchronous channel.
 EAPI=7
 IUSE=arc-camera1 cheets +cros-camera-algo-sandbox -libcamera cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= virtual/cros-camera-effects libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=!media-libs/arc-camera3 cros-camera-algo-sandbox? ( media-libs/cros-camera-libcab:= ) media-libs/cros-camera-hal-usb:= media-libs/cros-camera-libcamera_common:= media-libs/cros-camera-libcamera_ipc:= media-libs/cros-camera-libcamera_metadata:= media-libs/libsync:= libcamera? ( media-libs/libcamera ) !libcamera? ( virtual/cros-camera-hal virtual/cros-camera-hal-configs ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=65a82b40c0729f78600900b39f0ef60a
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=b7b3a541bf8511bf43109fd016c73259
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r257 b/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r257
deleted file mode 100644
index 1eeab32..0000000
--- a/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r257
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera test utility.
-EAPI=7
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r257
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6edaf0d861b2020a8f3112a1cc15f15e
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r279 b/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r279
new file mode 100644
index 0000000..a6434b5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cros-camera-tool-0.0.1-r279
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera test utility.
+EAPI=7
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r279
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e20b38383964515fef455a20ae817e01
diff --git a/metadata/md5-cache/chromeos-base/cros-camera-tool-9999 b/metadata/md5-cache/chromeos-base/cros-camera-tool-9999
index 120cafa..fbf6aba 100644
--- a/metadata/md5-cache/chromeos-base/cros-camera-tool-9999
+++ b/metadata/md5-cache/chromeos-base/cros-camera-tool-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=84ed439728f324224f7241b0cbe971a2
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=56d816b4c5248142bbe0a5243f2f3aef
diff --git a/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r128 b/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r128
new file mode 100644
index 0000000..577a683
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r128
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+DESCRIPTION=Provides python and go bindings to the config API
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/config/+/master/python/
+IUSE=cros_host cros_workon_tree_90e55c7e9a54e8f86edf9ae58fad267f298c4814_e41089e531faee4a357ea7bc58c5caf4e09ed780 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3aedd71f50d88b737ef04f6f262313a0
diff --git a/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r84 b/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r84
deleted file mode 100644
index f74b3e1..0000000
--- a/metadata/md5-cache/chromeos-base/cros-config-api-0.0.1-r84
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-DESCRIPTION=Provides python and go bindings to the config API
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/config/+/master/python/
-IUSE=cros_host cros_workon_tree_b90b128a539b021e290702808a9335367ee63530_62a72939f51a8467019183b7fc7006f0f3e39fad python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e6840025091f7bcf35a5ff9ea9880df6
diff --git a/metadata/md5-cache/chromeos-base/cros-config-api-9999 b/metadata/md5-cache/chromeos-base/cros-config-api-9999
index 7e357d0..9bf8487 100644
--- a/metadata/md5-cache/chromeos-base/cros-config-api-9999
+++ b/metadata/md5-cache/chromeos-base/cros-config-api-9999
@@ -11,5 +11,5 @@
 RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=375dd7785c0e9be01a76a89279e25a26
diff --git a/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1 b/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1
index 9ab6cf6..af7860e 100644
--- a/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1
+++ b/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 RDEPEND=virtual/chromeos-bsp-test chromeos-base/tast-local-tests-cros
 SLOT=0
-_eclasses_=cros-config-test	f471acbbac2b4c021aba0d64bf01e79e	cros-unibuild	1705aff271243014135de65988f2348f
+_eclasses_=cros-config-test	f471acbbac2b4c021aba0d64bf01e79e	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633
 _md5_=4b06206dd507b88386911de8b948ddd3
diff --git a/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1-r4 b/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1-r4
index 9ab6cf6..af7860e 100644
--- a/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1-r4
+++ b/metadata/md5-cache/chromeos-base/cros-config-test-0.0.1-r4
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 RDEPEND=virtual/chromeos-bsp-test chromeos-base/tast-local-tests-cros
 SLOT=0
-_eclasses_=cros-config-test	f471acbbac2b4c021aba0d64bf01e79e	cros-unibuild	1705aff271243014135de65988f2348f
+_eclasses_=cros-config-test	f471acbbac2b4c021aba0d64bf01e79e	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633
 _md5_=4b06206dd507b88386911de8b948ddd3
diff --git a/metadata/md5-cache/chromeos-base/cros-devutils-0.0.4-r1243 b/metadata/md5-cache/chromeos-base/cros-devutils-0.0.4-r1243
index 81d0e5d..3dac830 100644
--- a/metadata/md5-cache/chromeos-base/cros-devutils-0.0.4-r1243
+++ b/metadata/md5-cache/chromeos-base/cros-devutils-0.0.4-r1243
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-portage/gentoolkit >=chromeos-base/devserver-0.0.2 dev-lang/python dev-util/shflags dev-util/toolchain-utils sys-apps/flashmap
 SLOT=0/0.0.4-r1243
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9b7631a26df1bf67874684f1e4bc0a51
diff --git a/metadata/md5-cache/chromeos-base/cros-devutils-9999 b/metadata/md5-cache/chromeos-base/cros-devutils-9999
index 7923f7e..0fb3f1c 100644
--- a/metadata/md5-cache/chromeos-base/cros-devutils-9999
+++ b/metadata/md5-cache/chromeos-base/cros-devutils-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-portage/gentoolkit >=chromeos-base/devserver-0.0.2 dev-lang/python dev-util/shflags dev-util/toolchain-utils sys-apps/flashmap
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7b96a204eb27ae9e19d14b2bc0b86084
diff --git a/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r2991 b/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r2991
deleted file mode 100644
index b093a33a..0000000
--- a/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r2991
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Disk mounting daemon for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-disks/
-IUSE=chromeless_tty fuzzer +seccomp cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9812fdfa7d98cce17d6ed40301ed50f131ac4df3_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9812fdfa7d98cce17d6ed40301ed50f131ac4df3_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= net-fs/sshfs sys-fs/dosfstools sys-fs/exfat-utils sys-fs/fuse-exfat sys-fs/fuse-zip sys-fs/ntfs3g sys-fs/rar2fs virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2991
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=b6fe662aff04cfc7321a7b6cbaf8eb74
diff --git a/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r3054 b/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r3054
new file mode 100644
index 0000000..b5cca62
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cros-disks-0.0.1-r3054
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Disk mounting daemon for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-disks/
+IUSE=chromeless_tty fuzzer +seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_0badf0f17c329cb5b71cc455bcf9227936790f8f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_0badf0f17c329cb5b71cc455bcf9227936790f8f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= net-fs/sshfs sys-fs/dosfstools sys-fs/exfat-utils sys-fs/fuse-exfat sys-fs/fuse-zip sys-fs/ntfs3g sys-fs/rar2fs virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r3054
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=b5a0440d20335395f73ceb562c5ac7e6
diff --git a/metadata/md5-cache/chromeos-base/cros-disks-9999 b/metadata/md5-cache/chromeos-base/cros-disks-9999
index 5321d38..f255396 100644
--- a/metadata/md5-cache/chromeos-base/cros-disks-9999
+++ b/metadata/md5-cache/chromeos-base/cros-disks-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Disk mounting daemon for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-disks/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= net-fs/sshfs sys-fs/dosfstools sys-fs/exfat-utils sys-fs/fuse-exfat sys-fs/fuse-zip sys-fs/ntfs3g sys-fs/rar2fs virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/session_manager-client:= sys-apps/rootdev:= sys-apps/util-linux:= net-fs/sshfs sys-fs/dosfstools sys-fs/exfat-utils sys-fs/fuse-exfat sys-fs/fuse-zip sys-fs/ntfs3g sys-fs/rar2fs virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=b4210e37349fb8df5a79be3d06365f11
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=6945de20eda9c3eed5ec28e9dc9a1dee
diff --git a/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r581 b/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r581
deleted file mode 100644
index 524ebe9..0000000
--- a/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r581
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=Host test utilities for ChromiumOS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/
-IUSE=cros_host cros_workon_tree_86c8cdb230be6edd6ac4510cc2b4c2193486647e
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-emulation/qemu app-portage/gentoolkit app-shells/bash chromeos-base/cros-devutils dev-python/django
-SLOT=0/0.0.1-r581
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=41ecb0b728ab8817e43f860f68bf7866
diff --git a/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r587 b/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r587
new file mode 100644
index 0000000..c2809985
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cros-testutils-0.0.1-r587
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=Host test utilities for ChromiumOS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/
+IUSE=cros_host cros_workon_tree_8146f648468b544a50e01b7ee01b268db5e744ea
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-emulation/qemu app-portage/gentoolkit app-shells/bash chromeos-base/cros-devutils dev-python/django
+SLOT=0/0.0.1-r587
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5e70379c80776b1bf90cbdf5bb73035c
diff --git a/metadata/md5-cache/chromeos-base/cros-testutils-9999 b/metadata/md5-cache/chromeos-base/cros-testutils-9999
index 920272f..d95dca8 100644
--- a/metadata/md5-cache/chromeos-base/cros-testutils-9999
+++ b/metadata/md5-cache/chromeos-base/cros-testutils-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-emulation/qemu app-portage/gentoolkit app-shells/bash chromeos-base/cros-devutils dev-python/django
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=dca0f1ac5f6f843b4e99526f86a26c33
diff --git a/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r216 b/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r216
deleted file mode 100644
index 209923a..0000000
--- a/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r216
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/minijail:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Local hostname modifier service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/crosdns
-IUSE=+seccomp asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_412eac584220652a95abba5231fef81bee97f5ea_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_412eac584220652a95abba5231fef81bee97f5ea_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/minijail:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=379da13d8c67b67b9837d9089459da9b
diff --git a/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r236 b/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r236
new file mode 100644
index 0000000..f7d2140
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crosdns-0.0.1-r236
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/minijail:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Local hostname modifier service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/crosdns
+IUSE=+seccomp asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f6f4cb8ed85c814dc20afad7accc96ad40f79492_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f6f4cb8ed85c814dc20afad7accc96ad40f79492_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/minijail:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=3750e2ae2f8b3fe83c7aa80112a3b5fb
diff --git a/metadata/md5-cache/chromeos-base/crosdns-9999 b/metadata/md5-cache/chromeos-base/crosdns-9999
index d9fb4d9..cd1052f 100644
--- a/metadata/md5-cache/chromeos-base/crosdns-9999
+++ b/metadata/md5-cache/chromeos-base/crosdns-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/minijail:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=c455306c83022bbd408e9715f01557a7
diff --git a/metadata/md5-cache/chromeos-base/crosh-0.24.52-r2994 b/metadata/md5-cache/chromeos-base/crosh-0.24.52-r2994
deleted file mode 100644
index 2e3a3fc..0000000
--- a/metadata/md5-cache/chromeos-base/crosh-0.24.52-r2994
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api-rust:= >=dev-rust/dbus-0.6.1:= <dev-rust/dbus-0.7.0 >=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0 dev-rust/remain:= >=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0 dev-rust/shell-words:= dev-rust/sys_util:= dev-rust/tempfile:= dev-rust/tlsdate_dbus:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Chrome OS developer command-line shell
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh/
-IUSE=rust-crosh cros_host cros_workon_tree_7f7e9f8a485e98c56fc4a18af24fedacf6d8defb cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-admin/sudo chromeos-base/vboot_reference net-misc/iputils net-misc/openssh net-wireless/iw sys-apps/net-tools
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f664737ac3bfd0f3f40543b806971c81
diff --git a/metadata/md5-cache/chromeos-base/crosh-0.24.52-r3003 b/metadata/md5-cache/chromeos-base/crosh-0.24.52-r3003
new file mode 100644
index 0000000..da7e2e0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crosh-0.24.52-r3003
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>chromeos-base/system_api-rust-0.24.52-r261:= =dev-rust/dbus-0.8*:= >=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0 dev-rust/remain:= >=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0 dev-rust/shell-words:= dev-rust/sys_util:= dev-rust/tempfile:= >dev-rust/tlsdate_dbus-0.24.52-r8:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Chrome OS developer command-line shell
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh/
+IUSE=+rust-crosh cros_host cros_workon_tree_0c2b1f89ba962ad28992e1a4ccdb364ec2b78aa6 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-admin/sudo chromeos-base/vboot_reference net-misc/iputils net-misc/openssh net-wireless/iw sys-apps/net-tools
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=229d26d80c1632629a85c2fae0103997
diff --git a/metadata/md5-cache/chromeos-base/crosh-9999 b/metadata/md5-cache/chromeos-base/crosh-9999
index 5ca0ff5..d45d999 100644
--- a/metadata/md5-cache/chromeos-base/crosh-9999
+++ b/metadata/md5-cache/chromeos-base/crosh-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api-rust:= >=dev-rust/dbus-0.6.1:= <dev-rust/dbus-0.7.0 >=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0 dev-rust/remain:= >=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0 dev-rust/shell-words:= dev-rust/sys_util:= dev-rust/tempfile:= dev-rust/tlsdate_dbus:= >=virtual/rust-1.39.0:=
+DEPEND=>chromeos-base/system_api-rust-0.24.52-r261:= =dev-rust/dbus-0.8*:= >=dev-rust/regex-1.0.6:= <dev-rust/regex-2.0.0 dev-rust/remain:= >=dev-rust/rustyline-5.0.4:= <dev-rust/rustyline-6.0.0 dev-rust/shell-words:= dev-rust/sys_util:= dev-rust/tempfile:= >dev-rust/tlsdate_dbus-0.24.52-r8:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Chrome OS developer command-line shell
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/crosh/
-IUSE=rust-crosh cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+IUSE=+rust-crosh cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 RDEPEND=app-admin/sudo chromeos-base/vboot_reference net-misc/iputils net-misc/openssh net-wireless/iw sys-apps/net-tools
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ea0b07d4ef56edd1c4cdbcdd2079e50d
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f05740bc9348dbebc4123345c16d8a96
diff --git a/metadata/md5-cache/chromeos-base/crosh-extension-0.33-r941 b/metadata/md5-cache/chromeos-base/crosh-extension-0.33-r941
deleted file mode 100644
index f4f0ffb..0000000
--- a/metadata/md5-cache/chromeos-base/crosh-extension-0.33-r941
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=The Chromium OS Shell extension (the HTML/JS rendering part)
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/chromeos-crosh.md
-IUSE=cros_host cros_workon_tree_74d11a0c34e167a7100b2f11883d2596a94638d4_090abcb44219aa354bb1e31ad85a1a4edebe75dc_c157bced9e4904e57214c7109424d4533e211b29_0d583ca6372b1327575c7ad8688a172d423aee27_1436298f3f3cf9b3a9c7fba1617a6531c06b1c09
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<chromeos-base/common-assets-0.0.2
-RESTRICT=nomirror
-SLOT=0/0
-SRC_URI=https://storage.googleapis.com/chromium-nodejs/12.14.1/4572d3801500bcbebafadf203056d6263c840cda https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-bc482f2b229bd0797c104263dc60cb884a1c90f6e65f07050d0b94b165b3a255.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-2cd2dd365999ae139b6b0fb62a5a09e2a7fb5ab1c0926cf1968a1dec9b74fea5.tar.xz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=03233c65a58bed4b3157ae5ce8a9d5b7
diff --git a/metadata/md5-cache/chromeos-base/crosh-extension-0.35-r992 b/metadata/md5-cache/chromeos-base/crosh-extension-0.35-r992
new file mode 100644
index 0000000..f16d670
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crosh-extension-0.35-r992
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=The Chromium OS Shell extension (the HTML/JS rendering part)
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/chromeos-crosh.md
+IUSE=cros_host cros_workon_tree_eae03c8b860ceefb855b592d13e234f7711c91b8_11c59c7f0689cf7603b747d550cc3ea94e69e90e_ba93f18bb3d1cab0f8d600947de1055f73e45f6d_0d583ca6372b1327575c7ad8688a172d423aee27_098fc8e751872ecb63c13b33ebaa6ec7f19757da
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/common-assets-0.0.2
+RESTRICT=nomirror
+SLOT=0/0
+SRC_URI=https://storage.googleapis.com/chromium-nodejs/12.14.1/4572d3801500bcbebafadf203056d6263c840cda https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-bc482f2b229bd0797c104263dc60cb884a1c90f6e65f07050d0b94b165b3a255.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-2cd2dd365999ae139b6b0fb62a5a09e2a7fb5ab1c0926cf1968a1dec9b74fea5.tar.xz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dd5734b0549f698cba400652ea518733
diff --git a/metadata/md5-cache/chromeos-base/crosh-extension-9999 b/metadata/md5-cache/chromeos-base/crosh-extension-9999
index e9e462c..3241105 100644
--- a/metadata/md5-cache/chromeos-base/crosh-extension-9999
+++ b/metadata/md5-cache/chromeos-base/crosh-extension-9999
@@ -11,5 +11,5 @@
 RESTRICT=nomirror
 SLOT=0/0
 SRC_URI=https://storage.googleapis.com/chromium-nodejs/12.14.1/4572d3801500bcbebafadf203056d6263c840cda https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/fonts-d6dc5eaf459abd058cd3aef1e25963fde893f9d87f5f55f340431697ce4b3506.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-bc482f2b229bd0797c104263dc60cb884a1c90f6e65f07050d0b94b165b3a255.tar.xz https://storage.googleapis.com/chromeos-localmirror/secureshell/distfiles/node_modules-2cd2dd365999ae139b6b0fb62a5a09e2a7fb5ab1c0926cf1968a1dec9b74fea5.tar.xz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0e066ebaafe8599c529c77a316e3f49c
diff --git a/metadata/md5-cache/chromeos-base/croslog-0.0.1-r12 b/metadata/md5-cache/chromeos-base/croslog-0.0.1-r12
deleted file mode 100644
index 39550cf..0000000
--- a/metadata/md5-cache/chromeos-base/croslog-0.0.1-r12
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Log viewer for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/croslog
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8a76ff74f1164144fb0aed87bc778009ac4fb5ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8a76ff74f1164144fb0aed87bc778009ac4fb5ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=debdedf1b0a3a736eb497c240b48e04a
diff --git a/metadata/md5-cache/chromeos-base/croslog-0.0.1-r46 b/metadata/md5-cache/chromeos-base/croslog-0.0.1-r46
new file mode 100644
index 0000000..b9d5f0d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/croslog-0.0.1-r46
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Log viewer for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/croslog
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_0451459b5e75fb9c480ac45a1bc18c47ad9f07c6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_0451459b5e75fb9c480ac45a1bc18c47ad9f07c6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/bootid-logger >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=09e392bd07f76596b99109c9783ae3bc
diff --git a/metadata/md5-cache/chromeos-base/croslog-9999 b/metadata/md5-cache/chromeos-base/croslog-9999
index 7ca26f8..ed51d20 100644
--- a/metadata/md5-cache/chromeos-base/croslog-9999
+++ b/metadata/md5-cache/chromeos-base/croslog-9999
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=chromeos-base/bootid-logger >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5298ebefd91be9f3b00d81e07ff9af27
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=00aeee942443940ae1aea51d42c2ee93
diff --git a/metadata/md5-cache/chromeos-base/crostini-pin-85.20200616.23.06-r1 b/metadata/md5-cache/chromeos-base/crostini-pin-87.20200820.01.16-r1
similarity index 100%
rename from metadata/md5-cache/chromeos-base/crostini-pin-85.20200616.23.06-r1
rename to metadata/md5-cache/chromeos-base/crostini-pin-87.20200820.01.16-r1
diff --git a/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r54 b/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r54
deleted file mode 100644
index 86065ce..0000000
--- a/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r54
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/lazy_static-1*:= >=dev-rust/libc-0.2.44:= !>=dev-rust/libc-0.3 >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 >=virtual/rust-1.39.0:=
-DESCRIPTION=Command-line client for controlling crostini
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/crostini_client/
-IUSE=cros_host cros_workon_tree_7b9b958444461dbad59569baa6017c9a78734413 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1288733737902bea44190c3937fbe7e7
diff --git a/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r64 b/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r64
new file mode 100644
index 0000000..7dfcbc1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crostini_client-0.1.0-r64
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=chromeos-base/system_api =dev-rust/dbus-0.8*:= =dev-rust/getopts-0.2*:= =dev-rust/lazy_static-1*:= >=dev-rust/libc-0.2.44:= !>=dev-rust/libc-0.3 >=dev-rust/protobuf-2.16:= <dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.16:= <dev-rust/protoc-rust-3 >=virtual/rust-1.39.0:=
+DESCRIPTION=Command-line client for controlling crostini
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/crostini_client/
+IUSE=cros_host cros_workon_tree_9e6efca60bdd05733a7242e3369ec3e4a7d1f597 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ff457f8fc9e6be4b2d1312bb6d9e3e3a
diff --git a/metadata/md5-cache/chromeos-base/crostini_client-9999 b/metadata/md5-cache/chromeos-base/crostini_client-9999
index 00baef3..c9dda4d 100644
--- a/metadata/md5-cache/chromeos-base/crostini_client-9999
+++ b/metadata/md5-cache/chromeos-base/crostini_client-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api =dev-rust/dbus-0.6*:= =dev-rust/getopts-0.2*:= =dev-rust/lazy_static-1*:= >=dev-rust/libc-0.2.44:= !>=dev-rust/libc-0.3 >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 >=virtual/rust-1.39.0:=
+DEPEND=chromeos-base/system_api =dev-rust/dbus-0.8*:= =dev-rust/getopts-0.2*:= =dev-rust/lazy_static-1*:= >=dev-rust/libc-0.2.44:= !>=dev-rust/libc-0.3 >=dev-rust/protobuf-2.16:= <dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.16:= <dev-rust/protoc-rust-3 >=virtual/rust-1.39.0:=
 DESCRIPTION=Command-line client for controlling crostini
 EAPI=6
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/crostini_client/
@@ -9,5 +9,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f06f03c0e3eba20425d763d10f033175
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=81633f72c19aaa8da174fc769caf1be9
diff --git a/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r1017 b/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r1017
new file mode 100644
index 0000000..4d95681
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r1017
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
+DEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= =dev-rust/android_log-sys-0.2*:= >=dev-rust/anyhow-1.0.32:= <dev-rust/anyhow-2.0 =dev-rust/async-trait-0.1*:= fuzzer? ( dev-rust/cros_fuzz:= =dev-rust/rand-0.6*:= ) =dev-rust/bitflags-1*:= ~dev-rust/cc-1.0.25:= =dev-rust/futures-0.3*:= ~dev-rust/getopts-0.2.18:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/libvda:= dev-rust/minijail:= ~dev-rust/num_cpus-1.9.0:= dev-rust/p9:= =dev-rust/paste-0.1*:= =dev-rust/pin-utils-0.1*:= ~dev-rust/pkg-config-0.3.11:= =dev-rust/proc-macro2-1*:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=dev-rust/thiserror-1.0.20:= <dev-rust/thiserror-2.0 dev-rust/trace_events:= dev-rust/remain:= tpm2? ( chromeos-base/tpm2:= chromeos-base/trunks:= =dev-rust/dbus-0.6*:= ) media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DESCRIPTION=Utility for running VMs on Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crosvm/
+IUSE=test cros-debug crosvm-gpu -crosvm-plugin +crosvm-video-decoder +crosvm-video-encoder +crosvm-wl-dmabuf fuzzer tpm2 arcvm_gce_l1 fuzzer cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_ed256fe36e132de4358fbc54496a6c4476e00f2f
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= !chromeos-base/crosvm-bin sys-apps/baselayout
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r1017
+SRC_URI=test? ( https://storage.googleapis.com/crosvm-testing/x86_64/2019_10_10_00_22/bzImage -> crosvm-bzImage-2019_10_10_00_22 )
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=c58e580405722d17d1786a1fc63cf213
diff --git a/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r893 b/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r893
deleted file mode 100644
index dc55d5f..0000000
--- a/metadata/md5-cache/chromeos-base/crosvm-0.1.0-r893
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
-DEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= fuzzer? ( dev-rust/cros_fuzz:= =dev-rust/rand-0.6*:= ) =dev-rust/bitflags-1*:= ~dev-rust/cc-1.0.25:= =dev-rust/futures-0.3*:= ~dev-rust/getopts-0.2.18:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/libvda:= dev-rust/minijail:= ~dev-rust/num_cpus-1.9.0:= =dev-rust/paste-0.1*:= =dev-rust/pin-utils-0.1*:= ~dev-rust/pkg-config-0.3.11:= =dev-rust/proc-macro2-1*:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 =dev-rust/quote-1*:= =dev-rust/syn-1*:= dev-rust/trace_events:= dev-rust/remain:= tpm2? ( chromeos-base/tpm2:= chromeos-base/trunks:= =dev-rust/dbus-0.6*:= ) media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
-DESCRIPTION=Utility for running VMs on Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crosvm/
-IUSE=test cros-debug crosvm-gpu -crosvm-plugin +crosvm-video-decoder +crosvm-video-encoder +crosvm-wl-dmabuf fuzzer tpm2 arcvm_gce_l1 fuzzer cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_f4a532bbbbf6aaeb48b896546f2e3ddad2ed0be4
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= !chromeos-base/crosvm-bin sys-apps/baselayout
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r893
-SRC_URI=test? ( https://storage.googleapis.com/crosvm-testing/x86_64/2019_10_10_00_22/bzImage -> crosvm-bzImage-2019_10_10_00_22 )
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=44e9ee0fecd67f483eca779cfffb6342
diff --git a/metadata/md5-cache/chromeos-base/crosvm-9999 b/metadata/md5-cache/chromeos-base/crosvm-9999
index 0671b8a..86ff26b 100644
--- a/metadata/md5-cache/chromeos-base/crosvm-9999
+++ b/metadata/md5-cache/chromeos-base/crosvm-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
-DEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= fuzzer? ( dev-rust/cros_fuzz:= =dev-rust/rand-0.6*:= ) =dev-rust/bitflags-1*:= ~dev-rust/cc-1.0.25:= =dev-rust/futures-0.3*:= ~dev-rust/getopts-0.2.18:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/libvda:= dev-rust/minijail:= ~dev-rust/num_cpus-1.9.0:= =dev-rust/paste-0.1*:= =dev-rust/pin-utils-0.1*:= ~dev-rust/pkg-config-0.3.11:= =dev-rust/proc-macro2-1*:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 =dev-rust/quote-1*:= =dev-rust/syn-1*:= dev-rust/trace_events:= dev-rust/remain:= tpm2? ( chromeos-base/tpm2:= chromeos-base/trunks:= =dev-rust/dbus-0.6*:= ) media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DEPEND=sys-apps/dtc:= sys-libs/libcap:= chromeos-base/libvda:= chromeos-base/minijail:= crosvm-gpu? ( dev-libs/wayland:= media-libs/virglrenderer:= ) crosvm-wl-dmabuf? ( media-libs/minigbm:= ) virtual/libusb:1= =dev-rust/android_log-sys-0.2*:= >=dev-rust/anyhow-1.0.32:= <dev-rust/anyhow-2.0 =dev-rust/async-trait-0.1*:= fuzzer? ( dev-rust/cros_fuzz:= =dev-rust/rand-0.6*:= ) =dev-rust/bitflags-1*:= ~dev-rust/cc-1.0.25:= =dev-rust/futures-0.3*:= ~dev-rust/getopts-0.2.18:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/libvda:= dev-rust/minijail:= ~dev-rust/num_cpus-1.9.0:= dev-rust/p9:= =dev-rust/paste-0.1*:= =dev-rust/pin-utils-0.1*:= ~dev-rust/pkg-config-0.3.11:= =dev-rust/proc-macro2-1*:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=dev-rust/thiserror-1.0.20:= <dev-rust/thiserror-2.0 dev-rust/trace_events:= dev-rust/remain:= tpm2? ( chromeos-base/tpm2:= chromeos-base/trunks:= =dev-rust/dbus-0.6*:= ) media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
 DESCRIPTION=Utility for running VMs on Chrome OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crosvm/
@@ -12,5 +12,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
 SRC_URI=test? ( https://storage.googleapis.com/crosvm-testing/x86_64/2019_10_10_00_22/bzImage -> crosvm-bzImage-2019_10_10_00_22 )
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=fb7ceca5316c4737f2d5b16f3aeda8d2
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=afb685af59328d834a9c15d6f41088de
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3235 b/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3235
deleted file mode 100644
index 23d2f6b..0000000
--- a/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3235
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation-client:= chromeos-base/bootlockbox-client:= chromeos-base/cryptohome-client:= chromeos-base/power_manager-client:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/tpm_manager-client:= chromeos-base/vboot_reference:= chromeos-base/libhwsec:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Encrypted home directories for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/
-IUSE=-cert_provision cryptohome_userdataauth_interface +device_mapper -direncryption distributed_cryptohome double_extend_pcr_issue fuzzer generated_cros_config pinweaver selinux systemd test tpm tpm2 unibuild user_session_isolation cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_1bf01f1a340a50edee0e82b52621117c8388644c_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_1bf01f1a340a50edee0e82b52621117c8388644c_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=device_mapper tpm2? ( !tpm )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=aa647cb5338106813ff37efff0400604
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3344 b/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3344
new file mode 100644
index 0000000..be116f9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cryptohome-0.0.1-r3344
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation-client:= chromeos-base/bootlockbox-client:= chromeos-base/cryptohome-client:= chromeos-base/power_manager-client:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/tpm_manager-client:= chromeos-base/vboot_reference:= chromeos-base/libhwsec:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Encrypted home directories for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/
+IUSE=-cert_provision cryptohome_userdataauth_interface +device_mapper -direncryption double_extend_pcr_issue fuzzer generated_cros_config mount_oop pinweaver selinux systemd test tpm tpm2 unibuild user_session_isolation cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_59ded4c8a6ec924cce82ba942070e51132ca1161_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_59ded4c8a6ec924cce82ba942070e51132ca1161_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=device_mapper tpm2? ( !tpm )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=2d12006f0cf0ce90f8b54beaad4e400c
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-9999 b/metadata/md5-cache/chromeos-base/cryptohome-9999
index 935f36d..0c34c86 100644
--- a/metadata/md5-cache/chromeos-base/cryptohome-9999
+++ b/metadata/md5-cache/chromeos-base/cryptohome-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation-client:= chromeos-base/bootlockbox-client:= chromeos-base/cryptohome-client:= chromeos-base/power_manager-client:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/tpm_manager-client:= chromeos-base/vboot_reference:= chromeos-base/libhwsec:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation-client:= chromeos-base/bootlockbox-client:= chromeos-base/cryptohome-client:= chromeos-base/power_manager-client:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/tpm_manager-client:= chromeos-base/vboot_reference:= chromeos-base/libhwsec:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Encrypted home directories for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome/
-IUSE=-cert_provision cryptohome_userdataauth_interface +device_mapper -direncryption distributed_cryptohome double_extend_pcr_issue fuzzer generated_cros_config pinweaver selinux systemd test tpm tpm2 unibuild user_session_isolation cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=-cert_provision cryptohome_userdataauth_interface +device_mapper -direncryption double_extend_pcr_issue fuzzer generated_cros_config mount_oop pinweaver selinux systemd test tpm tpm2 unibuild user_session_isolation cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=!chromeos-base/chromeos-cryptohome tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) selinux? ( sys-libs/libselinux:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/cbor:= chromeos-base/chaps:= chromeos-base/chromeos-config-tools:= chromeos-base/libhwsec:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/secure-erase-file:= chromeos-base/tpm_manager:= dev-libs/dbus-glib:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/flashmap:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= sys-fs/lvm2:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=device_mapper tpm2? ( !tpm )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=613cbc5627638230a779a18a7e9702b8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=fc9acc746e1b4913f2cf61a7daf3b73a
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r890 b/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r890
deleted file mode 100644
index ece3b68..0000000
--- a/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r890
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Cryptohome D-Bus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/cryptohome-0.0.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r890
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=091f77fb369950e0eae5a6eafcdf99b7
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r992 b/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r992
new file mode 100644
index 0000000..cd4d77f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cryptohome-client-0.0.1-r992
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Cryptohome D-Bus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/cryptohome-0.0.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r992
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6c6b0c985c2c2fb22e167de1efee96d1
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-client-9999 b/metadata/md5-cache/chromeos-base/cryptohome-client-9999
index da21036..d91f0bd 100644
--- a/metadata/md5-cache/chromeos-base/cryptohome-client-9999
+++ b/metadata/md5-cache/chromeos-base/cryptohome-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/cryptohome-0.0.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=20dc936dd92afe6c085c94c499348da2
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r721 b/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r721
deleted file mode 100644
index 5e68e82..0000000
--- a/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r721
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Cryptohome developer and testing utilities for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome
-IUSE=tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a116bda3b891d74f8d71060d56a161ed465ffc4a_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=113ffc69fa85567aea4bda1b7eb51b3d
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r825 b/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r825
new file mode 100644
index 0000000..95edc29
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-0.0.1-r825
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Cryptohome developer and testing utilities for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome
+IUSE=tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ac2e4e99b6584995504d17d6a75fe01c195428a2_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6351e23b8a4cf0b05a8929b4793cef73
diff --git a/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-9999 b/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-9999
index 8cbd9e6..3885791 100644
--- a/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-9999
+++ b/metadata/md5-cache/chromeos-base/cryptohome-dev-utils-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Cryptohome developer and testing utilities for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cryptohome
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= chromeos-base/metrics:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=tpm? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:= ) chromeos-base/attestation:= chromeos-base/biod_proxy:= chromeos-base/chaps:= chromeos-base/libscrypt:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/tpm_manager:= chromeos-base/secure-erase-file:= dev-libs/glib:= dev-libs/openssl:= dev-libs/protobuf:= sys-apps/keyutils:= sys-fs/e2fsprogs:= sys-fs/ecryptfs-utils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=64fc3208b2c2665da29a09d580db9710
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6ecde9b220d1fbdc20a9530b4f36b631
diff --git a/metadata/md5-cache/chromeos-base/cups-fuzz-2.2.8-r6 b/metadata/md5-cache/chromeos-base/cups-fuzz-2.2.8-r6
deleted file mode 100644
index a733766..0000000
--- a/metadata/md5-cache/chromeos-base/cups-fuzz-2.2.8-r6
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=net-print/cups:=[fuzzer] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-DESCRIPTION=Fuzzer for PPD and IPP functions in CUPS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/cups/+/cups-2-2-8/fuzzers/
-IUSE=asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_6c56a58a6808e59bd763896a3b4e5fc1228d1c94 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=net-print/cups:=[fuzzer] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-REQUIRED_USE=fuzzer
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8faa5089425e35088c97702a49c53474
diff --git a/metadata/md5-cache/chromeos-base/cups-fuzz-2.3.3-r10 b/metadata/md5-cache/chromeos-base/cups-fuzz-2.3.3-r10
new file mode 100644
index 0000000..ba79d5f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/cups-fuzz-2.3.3-r10
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=net-print/cups:=[fuzzer] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DESCRIPTION=Fuzzer for PPD and IPP functions in CUPS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/cups/+/cups-2-2-8/fuzzers/
+IUSE=asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_6c56a58a6808e59bd763896a3b4e5fc1228d1c94 cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=net-print/cups:=[fuzzer] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+REQUIRED_USE=fuzzer
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b4efe37537680033a26b5a9dced7cdbc
diff --git a/metadata/md5-cache/chromeos-base/cups-fuzz-9999 b/metadata/md5-cache/chromeos-base/cups-fuzz-9999
index 1ede476..f1f2dca 100644
--- a/metadata/md5-cache/chromeos-base/cups-fuzz-9999
+++ b/metadata/md5-cache/chromeos-base/cups-fuzz-9999
@@ -11,5 +11,5 @@
 RDEPEND=net-print/cups:=[fuzzer] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 REQUIRED_USE=fuzzer
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=12c93c184f21cbb86d8cb2db4f238a10
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5ce3a36231c0d88ca374632d6c04a0bc
diff --git a/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2885 b/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2885
deleted file mode 100644
index 9e41c51..0000000
--- a/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2885
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/chromeos-login:= chromeos-base/minijail:= chromeos-base/shill-client:= chromeos-base/vboot_reference:= dev-libs/protobuf:= net-libs/libpcap:= net-wireless/iw:= sys-apps/rootdev:= sata? ( sys-apps/smartmontools:= ) chromeos-base/debugd-client:= chromeos-base/system_api:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Chrome OS debugging service
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/
-IUSE=cellular iwlwifi_dump nvme sata tpm cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_2ebd132c9048fba8cef7b8bc96081be9377d72f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_2ebd132c9048fba8cef7b8bc96081be9377d72f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-login:= chromeos-base/minijail:= chromeos-base/shill-client:= chromeos-base/vboot_reference:= dev-libs/protobuf:= net-libs/libpcap:= net-wireless/iw:= sys-apps/rootdev:= sata? ( sys-apps/smartmontools:= ) iwlwifi_dump? ( chromeos-base/intel-wifi-fw-dump ) nvme? ( sys-apps/nvme-cli ) chromeos-base/chromeos-ssh-testkeys chromeos-base/chromeos-sshd-init !chromeos-base/workarounds sys-apps/iproute2 sys-apps/memtester >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2885
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=ef52a81ade52d787458f7026dd337a07
diff --git a/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2928 b/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2928
new file mode 100644
index 0000000..577f9cb
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/debugd-0.0.1-r2928
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/chromeos-login:= chromeos-base/minijail:= chromeos-base/shill-client:= chromeos-base/vboot_reference:= dev-libs/protobuf:= net-libs/libpcap:= net-wireless/iw:= sys-apps/rootdev:= sata? ( sys-apps/smartmontools:= ) chromeos-base/debugd-client:= chromeos-base/system_api:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chrome OS debugging service
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/
+IUSE=cellular iwlwifi_dump nvme sata tpm cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8a627edf629f2dda550722427ca0627c393dd207_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8a627edf629f2dda550722427ca0627c393dd207_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-login:= chromeos-base/minijail:= chromeos-base/shill-client:= chromeos-base/vboot_reference:= dev-libs/protobuf:= net-libs/libpcap:= net-wireless/iw:= sys-apps/rootdev:= sata? ( sys-apps/smartmontools:= ) iwlwifi_dump? ( chromeos-base/intel-wifi-fw-dump ) nvme? ( sys-apps/nvme-cli ) chromeos-base/chromeos-ssh-testkeys chromeos-base/chromeos-sshd-init !chromeos-base/workarounds sys-apps/iproute2 sys-apps/memtester >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r2928
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=15bff15f1ee0078e9364c9f90bd6e0aa
diff --git a/metadata/md5-cache/chromeos-base/debugd-9999 b/metadata/md5-cache/chromeos-base/debugd-9999
index 6e053d7..63fc560 100644
--- a/metadata/md5-cache/chromeos-base/debugd-9999
+++ b/metadata/md5-cache/chromeos-base/debugd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chromeos-login:= chromeos-base/minijail:= chromeos-base/shill-client:= chromeos-base/vboot_reference:= dev-libs/protobuf:= net-libs/libpcap:= net-wireless/iw:= sys-apps/rootdev:= sata? ( sys-apps/smartmontools:= ) iwlwifi_dump? ( chromeos-base/intel-wifi-fw-dump ) nvme? ( sys-apps/nvme-cli ) chromeos-base/chromeos-ssh-testkeys chromeos-base/chromeos-sshd-init !chromeos-base/workarounds sys-apps/iproute2 sys-apps/memtester >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=a11f1d5abc0ce2729078883809b580b0
diff --git a/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1871 b/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1871
deleted file mode 100644
index c0a3fa6..0000000
--- a/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1871
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS debugd client library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_2ebd132c9048fba8cef7b8bc96081be9377d72f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_2ebd132c9048fba8cef7b8bc96081be9377d72f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1871
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f3b6e20fe2643fb550a0f0dd3cf0f872
diff --git a/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1914 b/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1914
new file mode 100644
index 0000000..5a08dce
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/debugd-client-0.0.1-r1914
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS debugd client library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/debugd/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8a627edf629f2dda550722427ca0627c393dd207_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_8a627edf629f2dda550722427ca0627c393dd207_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1914
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=48347ec16ebaee2e490e90747cddd219
diff --git a/metadata/md5-cache/chromeos-base/debugd-client-9999 b/metadata/md5-cache/chromeos-base/debugd-client-9999
index 2f6fa98..a21205a 100644
--- a/metadata/md5-cache/chromeos-base/debugd-client-9999
+++ b/metadata/md5-cache/chromeos-base/debugd-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=308edde34df2bf06eae84cfc7264e6cd
diff --git a/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1154 b/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1154
deleted file mode 100644
index d4fa611..0000000
--- a/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1154
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chromium OS Developer Packages installer
-EAPI=7
-HOMEPAGE=http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/install-software-on-base-images
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bf82c5c4784fa1fb6445912f6704d23c150987c6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bf82c5c4784fa1fb6445912f6704d23c150987c6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/vboot_reference:= app-arch/bzip2 app-arch/tar net-misc/curl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b91be2a552e84573b5d4e207d3d6c5ee
diff --git a/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1177 b/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1177
new file mode 100644
index 0000000..1c45b53
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/dev-install-0.0.1-r1177
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chromium OS Developer Packages installer
+EAPI=7
+HOMEPAGE=http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/install-software-on-base-images
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fcdf07aa1b1652c2a2bb2a07f80ebd9e789589f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fcdf07aa1b1652c2a2bb2a07f80ebd9e789589f5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/vboot_reference:= app-arch/bzip2 app-arch/tar net-misc/curl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=357c3544424d234c5cacda6543ffdb97
diff --git a/metadata/md5-cache/chromeos-base/dev-install-9999 b/metadata/md5-cache/chromeos-base/dev-install-9999
index f4a5782..fc049eb 100644
--- a/metadata/md5-cache/chromeos-base/dev-install-9999
+++ b/metadata/md5-cache/chromeos-base/dev-install-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/vboot_reference:= app-arch/bzip2 app-arch/tar net-misc/curl >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a259f68359639bd6e6c4b9aed6559666
diff --git a/metadata/md5-cache/chromeos-base/devserver-0.0.3-r708 b/metadata/md5-cache/chromeos-base/devserver-0.0.3-r708
deleted file mode 100644
index 595de4c..0000000
--- a/metadata/md5-cache/chromeos-base/devserver-0.0.3-r708
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup test unpack
-DEPEND=dev-python/psutil
-DESCRIPTION=Server to cache Chromium OS build artifacts from Google Storage.
-EAPI=7
-HOMEPAGE=http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/using-the-dev-server
-IUSE=cros_host cros_workon_tree_c8ec94a7f4394d8fb1f1fcfa32c1067aabdc3be3
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-lang/python dev-python/protobuf-python dev-python/cherrypy net-misc/gsutil dev-python/rtslib-fb
-SLOT=0/0.0.3-r708
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0a2f47e8c56f56d347301ad8ff84c2c8
diff --git a/metadata/md5-cache/chromeos-base/devserver-0.0.3-r799 b/metadata/md5-cache/chromeos-base/devserver-0.0.3-r799
new file mode 100644
index 0000000..11e14e2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/devserver-0.0.3-r799
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup test unpack
+DEPEND=dev-python/psutil
+DESCRIPTION=Server to cache Chromium OS build artifacts from Google Storage.
+EAPI=7
+HOMEPAGE=http://dev.chromium.org/chromium-os/how-tos-and-troubleshooting/using-the-dev-server
+IUSE=cros_host cros_workon_tree_21f5a11c83593a8519785ee99eb1ecece3309c73
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-lang/python dev-python/protobuf-python dev-python/cherrypy net-misc/gsutil dev-python/rtslib-fb
+SLOT=0/0.0.3-r799
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e06ce6cd8612c53172faad5cb8cef07a
diff --git a/metadata/md5-cache/chromeos-base/devserver-9999 b/metadata/md5-cache/chromeos-base/devserver-9999
index 0d344d8..a90e711 100644
--- a/metadata/md5-cache/chromeos-base/devserver-9999
+++ b/metadata/md5-cache/chromeos-base/devserver-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=dev-lang/python dev-python/protobuf-python dev-python/cherrypy net-misc/gsutil dev-python/rtslib-fb
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=747820d56003971bead679c215d81162
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r672 b/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r672
deleted file mode 100644
index 79d91f2..0000000
--- a/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r672
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/debugd-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Device telemetry and diagnostics for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics
-IUSE=fuzzer wilco generated_cros_config unibuild cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_be9c464a369cb4d1756f807753ca5b12b3ad16a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_be9c464a369cb4d1756f807753ca5b12b3ad16a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/minijail dev-util/stressapptest sys-block/fio wilco? ( chromeos-base/chromeos-dtc-vm chromeos-base/vpd ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r672
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=f07555b4ef7fae68ddf1c6c6b5df583c
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r795 b/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r795
new file mode 100644
index 0000000..462a1a2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/diagnostics-0.0.1-r795
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/debugd-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Device telemetry and diagnostics for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics
+IUSE=fuzzer wilco generated_cros_config unibuild cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_2e9672eb4b4502a670a37cc31ede76da6afd8b44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_2e9672eb4b4502a670a37cc31ede76da6afd8b44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/minijail dev-util/stressapptest wilco? ( sys-block/fio chromeos-base/chromeos-dtc-vm chromeos-base/vpd ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r795
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=a198df88fede09a9d4f1ad23bb64b309
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-9999 b/metadata/md5-cache/chromeos-base/diagnostics-9999
index 2e87bb3..f1c3e31 100644
--- a/metadata/md5-cache/chromeos-base/diagnostics-9999
+++ b/metadata/md5-cache/chromeos-base/diagnostics-9999
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/minijail dev-util/stressapptest sys-block/fio wilco? ( chromeos-base/chromeos-dtc-vm chromeos-base/vpd ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= dev-libs/re2:= net-libs/grpc:= virtual/libudev:= chromeos-base/minijail dev-util/stressapptest wilco? ( sys-block/fio chromeos-base/chromeos-dtc-vm chromeos-base/vpd ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=40684604c7b2c4a9fb5cc4c0888ea81a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=3a47c0619bc3f93beacebb9c85826056
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r399 b/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r399
deleted file mode 100644
index e034a9a..0000000
--- a/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r399
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Diagnostics DPSL test designed to be run inside VM
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/dpsl/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_be9c464a369cb4d1756f807753ca5b12b3ad16a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_be9c464a369cb4d1756f807753ca5b12b3ad16a6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=net-libs/grpc:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3cb563ca7a49413a17f013c31ccf87e8
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r491 b/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r491
new file mode 100644
index 0000000..ac6df9f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-0.0.1-r491
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Diagnostics DPSL test designed to be run inside VM
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/dpsl/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2e9672eb4b4502a670a37cc31ede76da6afd8b44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2e9672eb4b4502a670a37cc31ede76da6afd8b44_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=net-libs/grpc:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cbdbd15b3d15fa80a880c66acb17b6ca
diff --git a/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-9999 b/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-9999
index 1c303f2..1f93937 100644
--- a/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-9999
+++ b/metadata/md5-cache/chromeos-base/diagnostics-dpsl-test-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=net-libs/grpc:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=beda9c0689041584b822037f4d582c24
diff --git a/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3013 b/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3013
deleted file mode 100644
index 1d7f84e..0000000
--- a/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3013
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Root disk firmware updater
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/disk_updater/
-IUSE=+sata mmc nvme cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a84edaa470edc69e27335f718e4784a8fcc883f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a84edaa470edc69e27335f718e4784a8fcc883f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-common-script sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r3013
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=15589838fd570934f37fd61b817bfb42
diff --git a/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3033 b/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3033
new file mode 100644
index 0000000..5167f69
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/disk_updater-0.0.1-r3033
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Root disk firmware updater
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/disk_updater/
+IUSE=+sata mmc nvme cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a84edaa470edc69e27335f718e4784a8fcc883f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a84edaa470edc69e27335f718e4784a8fcc883f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-common-script sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r3033
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b505f304d3a64e26ca9719b3cbd9d7c7
diff --git a/metadata/md5-cache/chromeos-base/disk_updater-9999 b/metadata/md5-cache/chromeos-base/disk_updater-9999
index f74d927..b63f8fc 100644
--- a/metadata/md5-cache/chromeos-base/disk_updater-9999
+++ b/metadata/md5-cache/chromeos-base/disk_updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chromeos-common-script sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c60e15ad49cbfcad68196ee17354ebc9
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r397 b/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r397
deleted file mode 100644
index f0217a7..0000000
--- a/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r397
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/imageloader:= chromeos-base/metrics:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/imageloader-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/session_manager-client:= chromeos-base/update_engine-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=A D-Bus service for Downloadable Content (DLC)
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6bb740c6e33228d12a0e39ba631088ef255e17dd_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6bb740c6e33228d12a0e39ba631088ef255e17dd_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/imageloader:= chromeos-base/metrics:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r397
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=4045d39df78b85355f4265a1e4b50295
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r445 b/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r445
new file mode 100644
index 0000000..19d3b9d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/dlcservice-0.0.1-r445
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/imageloader:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/imageloader-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/session_manager-client:= chromeos-base/update_engine-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=A D-Bus service for Downloadable Content (DLC)
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_21194b64d3af73c31e49f08d67a5eb920eb0c8d1_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_21194b64d3af73c31e49f08d67a5eb920eb0c8d1_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/imageloader:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r445
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=ff4fb11d6aa1d806baace24ac473748c
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-9999 b/metadata/md5-cache/chromeos-base/dlcservice-9999
index 58b53ff..b891c82 100644
--- a/metadata/md5-cache/chromeos-base/dlcservice-9999
+++ b/metadata/md5-cache/chromeos-base/dlcservice-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/imageloader:= chromeos-base/metrics:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/imageloader-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/session_manager-client:= chromeos-base/update_engine-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/imageloader:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/imageloader-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/session_manager-client:= chromeos-base/update_engine-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=A D-Bus service for Downloadable Content (DLC)
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/imageloader:= chromeos-base/metrics:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/imageloader:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=195c0172549b5199b00f451f13d59392
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=a428b93279d6b8c076745117ac86bdb6
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r332 b/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r332
deleted file mode 100644
index 1a464d3..0000000
--- a/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r332
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chromeos-dbus-bindings >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=DlcService D-Bus client library for Chromium OS
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/client
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6bb740c6e33228d12a0e39ba631088ef255e17dd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6bb740c6e33228d12a0e39ba631088ef255e17dd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=feedd3fde995313614d569d88095e28e
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r369 b/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r369
new file mode 100644
index 0000000..1fc0fb7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/dlcservice-client-0.0.1-r369
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chromeos-dbus-bindings >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=DlcService D-Bus client library for Chromium OS
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/dlcservice/client
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_21194b64d3af73c31e49f08d67a5eb920eb0c8d1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_21194b64d3af73c31e49f08d67a5eb920eb0c8d1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d9e2716b9478105af83da23770f4dc26
diff --git a/metadata/md5-cache/chromeos-base/dlcservice-client-9999 b/metadata/md5-cache/chromeos-base/dlcservice-client-9999
index 9283299..a40cde0 100644
--- a/metadata/md5-cache/chromeos-base/dlcservice-client-9999
+++ b/metadata/md5-cache/chromeos-base/dlcservice-client-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f8a3b22301bb21b0a176af5b510129aa
diff --git a/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r171 b/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r171
deleted file mode 100644
index 246b86a..0000000
--- a/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r171
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=virtual/opengles || ( media-libs/mesa[gbm] media-libs/minigbm ) media-libs/libsync vulkan? ( media-libs/vulkan-loader virtual/vulkan-icd ) x11-drivers/opengles-headers
-DESCRIPTION=Chrome OS DRM Tests
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/drm-tests/
-IUSE=vulkan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_8338b99f85635cba6219924371ddd545fb4352bc
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=virtual/opengles || ( media-libs/mesa[gbm] media-libs/minigbm ) media-libs/libsync vulkan? ( media-libs/vulkan-loader virtual/vulkan-icd )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=35f016aa33e651ab172b5452420ba0b3
diff --git a/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r174 b/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r174
new file mode 100644
index 0000000..3ae76dd
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/drm-tests-0.0.1-r174
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=virtual/opengles || ( media-libs/mesa[gbm] media-libs/minigbm ) media-libs/libsync vulkan? ( media-libs/vulkan-loader virtual/vulkan-icd ) x11-drivers/opengles-headers
+DESCRIPTION=Chrome OS DRM Tests
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/drm-tests/
+IUSE=vulkan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ea862bf5db70dfe87a0f31ea07cd8bfb4e375326
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/opengles || ( media-libs/mesa[gbm] media-libs/minigbm ) media-libs/libsync vulkan? ( media-libs/vulkan-loader virtual/vulkan-icd )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9affb747aaf0d295b8c359be8b8e64eb
diff --git a/metadata/md5-cache/chromeos-base/drm-tests-9999 b/metadata/md5-cache/chromeos-base/drm-tests-9999
index f3c73cf..2b77b19 100644
--- a/metadata/md5-cache/chromeos-base/drm-tests-9999
+++ b/metadata/md5-cache/chromeos-base/drm-tests-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=virtual/opengles || ( media-libs/mesa[gbm] media-libs/minigbm ) media-libs/libsync vulkan? ( media-libs/vulkan-loader virtual/vulkan-icd )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f8466c39fd413f365eae73b7baa60079
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=86fe54ea4e87ade40f8645f472917407
diff --git a/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2909 b/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2909
deleted file mode 100644
index 7917e9c..0000000
--- a/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2909
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/easy-unlock-crypto:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Service for supporting Easy Unlock in Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/easy-unlock/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_ae1501a02c3893627432d1114e83009270cc821d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_ae1501a02c3893627432d1114e83009270cc821d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/easy-unlock-crypto:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=e6ffec133a1818dce55115289fc7d41b
diff --git a/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2931 b/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2931
new file mode 100644
index 0000000..9707b8c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/easy-unlock-0.0.1-r2931
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/easy-unlock-crypto:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Service for supporting Easy Unlock in Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/easy-unlock/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3bc2155e1d48bbae4a00bdca72079a844346fb59_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3bc2155e1d48bbae4a00bdca72079a844346fb59_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/easy-unlock-crypto:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=3d8650d96a86860488e3657d966ff4b2
diff --git a/metadata/md5-cache/chromeos-base/easy-unlock-9999 b/metadata/md5-cache/chromeos-base/easy-unlock-9999
index 825ce21..dbab2f1 100644
--- a/metadata/md5-cache/chromeos-base/easy-unlock-9999
+++ b/metadata/md5-cache/chromeos-base/easy-unlock-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/easy-unlock-crypto:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=2b57d35d78844b211b335ca97a08ec72
diff --git a/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r5704 b/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r5704
deleted file mode 100644
index 0b1d439..0000000
--- a/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r5704
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] virtual/pkgconfig dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=virtual/libusb:1= sys-apps/flashmap:=
-DESCRIPTION=Host development utilities for Chromium OS EC
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
-IUSE=hammerd cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65 python_targets_python2_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=virtual/libusb:1= sys-apps/flashmap:= app-mobilephone/dfu-util sys-firmware/servo-firmware sys-apps/flashrom !<chromeos-base/ec-utils-0.0.1-r6153 chromeos-base/ec-utils >=dev-python/pyusb-1.0.2 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4c429350f53637d5b9f2d63a87d99275
diff --git a/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r6331 b/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r6331
new file mode 100644
index 0000000..0e18b1f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ec-devutils-0.0.2-r6331
@@ -0,0 +1,15 @@
+BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] virtual/pkgconfig dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=virtual/libusb:1= sys-apps/flashmap:=
+DESCRIPTION=Host development utilities for Chromium OS EC
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
+IUSE=hammerd cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff python_targets_python2_7 python_targets_python3_6
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/libusb:1= sys-apps/flashmap:= app-mobilephone/dfu-util sys-firmware/servo-firmware sys-apps/flashrom !<chromeos-base/ec-utils-0.0.1-r6153 chromeos-base/ec-utils >=dev-python/pyusb-1.0.2 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bf173bf9b4e703c560c38f9ca53d4440
diff --git a/metadata/md5-cache/chromeos-base/ec-devutils-9999 b/metadata/md5-cache/chromeos-base/ec-devutils-9999
index 08e2d8c..875f712 100644
--- a/metadata/md5-cache/chromeos-base/ec-devutils-9999
+++ b/metadata/md5-cache/chromeos-base/ec-devutils-9999
@@ -1,15 +1,15 @@
-BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] virtual/pkgconfig dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
+BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] virtual/pkgconfig dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
 DEFINED_PHASES=compile configure info install prepare setup test unpack
 DEPEND=virtual/libusb:1= sys-apps/flashmap:=
 DESCRIPTION=Host development utilities for Chromium OS EC
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
-IUSE=hammerd cros_host cros_workon_tree_ python_targets_python2_7
+IUSE=hammerd cros_host cros_workon_tree_ python_targets_python2_7 python_targets_python3_6
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=virtual/libusb:1= sys-apps/flashmap:= app-mobilephone/dfu-util sys-firmware/servo-firmware sys-apps/flashrom !<chromeos-base/ec-utils-0.0.1-r6153 chromeos-base/ec-utils >=dev-python/pyusb-1.0.2 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 )
+RDEPEND=virtual/libusb:1= sys-apps/flashmap:= app-mobilephone/dfu-util sys-firmware/servo-firmware sys-apps/flashrom !<chromeos-base/ec-utils-0.0.1-r6153 chromeos-base/ec-utils >=dev-python/pyusb-1.0.2 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e7f67a2798333e473a30f0f39f5be8fc
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bf577af1b509769728aa636c1b813310
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r7636 b/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r7636
deleted file mode 100644
index 2cdcfdc..0000000
--- a/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r7636
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst preinst setup unpack
-DEPEND=dev-embedded/libftdi:= dev-libs/openssl:0= virtual/libusb:1= sys-apps/baselayout
-DESCRIPTION=Chrome OS EC Utility
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/
-IUSE=static -updater_utils cros_host +cros_ec_utils cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-embedded/libftdi:= dev-libs/openssl:0= virtual/libusb:1= sys-apps/baselayout
-SLOT=0/0.0.2-r7636
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c4dd2eb2a24f9537d716a5f817dfe933
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r8263 b/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r8263
new file mode 100644
index 0000000..87d0c93
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ec-utils-0.0.2-r8263
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst preinst setup unpack
+DEPEND=dev-embedded/libftdi:= dev-libs/openssl:0= virtual/libusb:1= sys-apps/baselayout
+DESCRIPTION=Chrome OS EC Utility
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/
+IUSE=static -updater_utils cros_host +cros_ec_utils cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-embedded/libftdi:= dev-libs/openssl:0= virtual/libusb:1= sys-apps/baselayout
+SLOT=0/0.0.2-r8263
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=8bdfc1e62cb232c592037237dfe4310c
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-9999 b/metadata/md5-cache/chromeos-base/ec-utils-9999
index 39221b1..df2d14e 100644
--- a/metadata/md5-cache/chromeos-base/ec-utils-9999
+++ b/metadata/md5-cache/chromeos-base/ec-utils-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=dev-embedded/libftdi:= dev-libs/openssl:0= virtual/libusb:1= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=8b461d10930ff636126b53d795594db3
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r4808 b/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r4808
deleted file mode 100644
index 81acd43..0000000
--- a/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r4808
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=Chrome OS EC Utility Helper
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/
-IUSE=biod -cr50_onboard cros_host cros_workon_tree_deab483754cdb9e9af2f15f2631eca657f0e7d65
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/ec-utils biod? ( dev-util/shflags )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=917c89757f118aba9bd50614cb2b6c30
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r5435 b/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r5435
new file mode 100644
index 0000000..d3d27b0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ec-utils-test-0.0.1-r5435
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=Chrome OS EC Utility Helper
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/
+IUSE=biod -cr50_onboard cros_host cros_workon_tree_4f0a5c9b9aaad052b5de0a1247e82253bbdb8dff
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/ec-utils biod? ( dev-util/shflags )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d974d4a96931edf22f09f720f49a1782
diff --git a/metadata/md5-cache/chromeos-base/ec-utils-test-9999 b/metadata/md5-cache/chromeos-base/ec-utils-test-9999
index 8621286..92ad098 100644
--- a/metadata/md5-cache/chromeos-base/ec-utils-test-9999
+++ b/metadata/md5-cache/chromeos-base/ec-utils-test-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/ec-utils biod? ( dev-util/shflags )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=39ef6a72a07b57f8c8a85c0c2b05ed2e
diff --git a/metadata/md5-cache/chromeos-base/elan_i2chid_tools-1.12-r2 b/metadata/md5-cache/chromeos-base/elan_i2chid_tools-1.12-r3
similarity index 100%
rename from metadata/md5-cache/chromeos-base/elan_i2chid_tools-1.12-r2
rename to metadata/md5-cache/chromeos-base/elan_i2chid_tools-1.12-r3
diff --git a/metadata/md5-cache/chromeos-base/epstps2iap-1.2 b/metadata/md5-cache/chromeos-base/epstps2iap-1.2
new file mode 100644
index 0000000..f292cb7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/epstps2iap-1.2
@@ -0,0 +1,10 @@
+DEFINED_PHASES=configure install
+DESCRIPTION=ELAN Standalone Trackpoint Firmware Update
+EAPI=7
+HOMEPAGE=https://github.com/jinglewu/epstps2iap/
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://github.com/jinglewu/epstps2iap/archive/v1.2.tar.gz -> epstps2iap-1.2.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=00a73deaa460e02da84a1e313fe36082
diff --git a/metadata/md5-cache/chromeos-base/factory-0.2.0-r1737 b/metadata/md5-cache/chromeos-base/factory-0.2.0-r1737
deleted file mode 100644
index 5dbd35e..0000000
--- a/metadata/md5-cache/chromeos-base/factory-0.2.0-r1737
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=configure info install prepare setup unpack
-DEPEND=virtual/chromeos-bsp-factory:= virtual/chromeos-regions:= dev-python/enum34:= dev-python/jsonrpclib:= dev-python/pyyaml:= dev-python/protobuf-python:=
-DESCRIPTION=Chrome OS Factory Software Platform
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/factory/
-IUSE=cros_host cros_workon_tree_c3987abc053ccaf989c5b84d5d5767669eb55890 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.2.0-r1737
-SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=55d67278abf5afbe45d2ba2f4bfd9f1f
diff --git a/metadata/md5-cache/chromeos-base/factory-0.2.0-r1853 b/metadata/md5-cache/chromeos-base/factory-0.2.0-r1853
new file mode 100644
index 0000000..cd51aa3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/factory-0.2.0-r1853
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=configure info install prepare setup unpack
+DEPEND=virtual/chromeos-bsp-factory:= virtual/chromeos-regions:= dev-python/enum34:= dev-python/jsonrpclib:= dev-python/pyyaml:= dev-python/protobuf-python:=
+DESCRIPTION=Chrome OS Factory Software Platform
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/factory/
+IUSE=cros_host cros_workon_tree_b9a61b7f075247e06bb38ca273751021cc02f0b0 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.2.0-r1853
+SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=39c9799b6a57e659837bb7d1e05909c6
diff --git a/metadata/md5-cache/chromeos-base/factory-9999 b/metadata/md5-cache/chromeos-base/factory-9999
index 9a71be6..34388a8 100644
--- a/metadata/md5-cache/chromeos-base/factory-9999
+++ b/metadata/md5-cache/chromeos-base/factory-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 SLOT=0/9999
 SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fe271937d504c60c85db7ed6ccf7d6d6
diff --git a/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1809 b/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1809
deleted file mode 100644
index a34b95b..0000000
--- a/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1809
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/jsonrpclib:= dev-python/pyyaml:= dev-python/protobuf-python:= virtual/chromeos-bsp-factory:= virtual/chromeos-regions:=
-DESCRIPTION=Subset of factory software to be installed in test images
-EAPI=7
-IUSE=cros_host cros_workon_tree_c3987abc053ccaf989c5b84d5d5767669eb55890 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.0.1-r1809
-SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2fc8cbcec1942e3ccd1bcf3215e4ac75
diff --git a/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1925 b/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1925
new file mode 100644
index 0000000..42d8e5c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/factory-mini-0.0.1-r1925
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/jsonrpclib:= dev-python/pyyaml:= dev-python/protobuf-python:= virtual/chromeos-bsp-factory:= virtual/chromeos-regions:=
+DESCRIPTION=Subset of factory software to be installed in test images
+EAPI=7
+IUSE=cros_host cros_workon_tree_b9a61b7f075247e06bb38ca273751021cc02f0b0 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r1925
+SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e9ffd31fd03f2136944ac930a1d8ad47
diff --git a/metadata/md5-cache/chromeos-base/factory-mini-9999 b/metadata/md5-cache/chromeos-base/factory-mini-9999
index 74898ef..0ca690b 100644
--- a/metadata/md5-cache/chromeos-base/factory-mini-9999
+++ b/metadata/md5-cache/chromeos-base/factory-mini-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 SLOT=0/9999
 SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror//distfiles/webgl-aquarium-20130524.tar.bz2
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5a32c811a6a07504e363251feb4fc5c5
diff --git a/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r138 b/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r138
deleted file mode 100644
index af49310..0000000
--- a/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r138
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=chromeos-base/chromeos-init:= !chromeos-base/chromeos-factoryinstall !chromeos-base/chromeos-factory chromeos-base/factory:= test? ( chromeos-base/secure-wipe:= ) x86? ( sys-boot/syslinux:= )
-DESCRIPTION=Chrome OS Factory Installer
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/factory_installer/
-IUSE=tty_console_ttyAMA0 tty_console_ttyAMA1 tty_console_ttyAMA2 tty_console_ttyAMA3 tty_console_ttyAMA4 tty_console_ttyAMA5 tty_console_ttyHSL0 tty_console_ttyHSL1 tty_console_ttyHSL2 tty_console_ttyHSL3 tty_console_ttyHSL4 tty_console_ttyHSL5 tty_console_ttyMSM0 tty_console_ttyMSM1 tty_console_ttyMSM2 tty_console_ttyMSM3 tty_console_ttyMSM4 tty_console_ttyMSM5 tty_console_ttymxc0 tty_console_ttymxc1 tty_console_ttymxc2 tty_console_ttymxc3 tty_console_ttymxc4 tty_console_ttymxc5 tty_console_ttyO0 tty_console_ttyO1 tty_console_ttyO2 tty_console_ttyO3 tty_console_ttyO4 tty_console_ttyO5 tty_console_ttyS0 tty_console_ttyS1 tty_console_ttyS2 tty_console_ttyS3 tty_console_ttyS4 tty_console_ttyS5 tty_console_ttySAC0 tty_console_ttySAC1 tty_console_ttySAC2 tty_console_ttySAC3 tty_console_ttySAC4 tty_console_ttySAC5 tty_console_ttyUSB0 tty_console_ttyUSB1 tty_console_ttyUSB2 tty_console_ttyUSB3 tty_console_ttyUSB4 tty_console_ttyUSB5 tty_console_tty0 tty_console_tty1 tty_console_tty2 tty_console_tty3 tty_console_tty4 tty_console_tty5 -asan test asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_75357d26a67cb809e4496d8a9c95b03028e13dbe
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/chromeos-init:= !chromeos-base/chromeos-factoryinstall !chromeos-base/chromeos-factory app-arch/gzip app-arch/sharutils app-arch/tar app-misc/figlet chromeos-base/vboot_reference sys-apps/mosys sys-apps/util-linux app-arch/lbzip2 app-arch/pigz app-misc/jq chromeos-base/chromeos-installer chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/secure-wipe chromeos-base/vpd dev-util/stressapptest net-misc/htpdate net-wireless/iw sys-apps/flashrom sys-apps/net-tools sys-apps/upstart sys-apps/util-linux sys-block/parted sys-fs/e2fsprogs
-SLOT=0/0.0.1-r138
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=30f06453fc4f2920e1c0d85479b0a63e
diff --git a/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r140 b/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r140
new file mode 100644
index 0000000..2849017
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/factory_installer-0.0.1-r140
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=chromeos-base/chromeos-init:= !chromeos-base/chromeos-factoryinstall !chromeos-base/chromeos-factory chromeos-base/factory:= test? ( chromeos-base/secure-wipe:= ) x86? ( sys-boot/syslinux:= )
+DESCRIPTION=Chrome OS Factory Installer
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/factory_installer/
+IUSE=tty_console_ttyAMA0 tty_console_ttyAMA1 tty_console_ttyAMA2 tty_console_ttyAMA3 tty_console_ttyAMA4 tty_console_ttyAMA5 tty_console_ttyHSL0 tty_console_ttyHSL1 tty_console_ttyHSL2 tty_console_ttyHSL3 tty_console_ttyHSL4 tty_console_ttyHSL5 tty_console_ttyMSM0 tty_console_ttyMSM1 tty_console_ttyMSM2 tty_console_ttyMSM3 tty_console_ttyMSM4 tty_console_ttyMSM5 tty_console_ttymxc0 tty_console_ttymxc1 tty_console_ttymxc2 tty_console_ttymxc3 tty_console_ttymxc4 tty_console_ttymxc5 tty_console_ttyO0 tty_console_ttyO1 tty_console_ttyO2 tty_console_ttyO3 tty_console_ttyO4 tty_console_ttyO5 tty_console_ttyS0 tty_console_ttyS1 tty_console_ttyS2 tty_console_ttyS3 tty_console_ttyS4 tty_console_ttyS5 tty_console_ttySAC0 tty_console_ttySAC1 tty_console_ttySAC2 tty_console_ttySAC3 tty_console_ttySAC4 tty_console_ttySAC5 tty_console_ttyUSB0 tty_console_ttyUSB1 tty_console_ttyUSB2 tty_console_ttyUSB3 tty_console_ttyUSB4 tty_console_ttyUSB5 tty_console_tty0 tty_console_tty1 tty_console_tty2 tty_console_tty3 tty_console_tty4 tty_console_tty5 -asan test asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_59131c3942457a51b48fa6920e31300f71b76e90
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/chromeos-init:= !chromeos-base/chromeos-factoryinstall !chromeos-base/chromeos-factory app-arch/gzip app-arch/sharutils app-arch/tar app-misc/figlet chromeos-base/vboot_reference sys-apps/mosys sys-apps/util-linux app-arch/lbzip2 app-arch/pigz app-misc/jq chromeos-base/chromeos-installer chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/secure-wipe chromeos-base/vpd dev-util/stressapptest net-misc/htpdate net-wireless/iw sys-apps/flashrom sys-apps/net-tools sys-apps/upstart sys-apps/util-linux sys-block/parted sys-fs/e2fsprogs
+SLOT=0/0.0.1-r140
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cc865fa1d70d9bfbfc2bff2d6882f247
diff --git a/metadata/md5-cache/chromeos-base/factory_installer-9999 b/metadata/md5-cache/chromeos-base/factory_installer-9999
index eee30e9..2c53f8f 100644
--- a/metadata/md5-cache/chromeos-base/factory_installer-9999
+++ b/metadata/md5-cache/chromeos-base/factory_installer-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-init:= !chromeos-base/chromeos-factoryinstall !chromeos-base/chromeos-factory app-arch/gzip app-arch/sharutils app-arch/tar app-misc/figlet chromeos-base/vboot_reference sys-apps/mosys sys-apps/util-linux app-arch/lbzip2 app-arch/pigz app-misc/jq chromeos-base/chromeos-installer chromeos-base/chromeos-storage-info chromeos-base/ec-utils chromeos-base/secure-wipe chromeos-base/vpd dev-util/stressapptest net-misc/htpdate net-wireless/iw sys-apps/flashrom sys-apps/net-tools sys-apps/upstart sys-apps/util-linux sys-block/parted sys-fs/e2fsprogs
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-factory	1aa91d9fefb0356dd5f1f2a183efce0c	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bf90e0085f088313a273ac64e394e9c8
diff --git a/metadata/md5-cache/chromeos-base/feedback-0.0.1-r741 b/metadata/md5-cache/chromeos-base/feedback-0.0.1-r741
deleted file mode 100644
index 5d4befb..0000000
--- a/metadata/md5-cache/chromeos-base/feedback-0.0.1-r741
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Feedback service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/feedback/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_97e8707008e2f9258cbdf887b73465f5d2332c0e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_97e8707008e2f9258cbdf887b73465f5d2332c0e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r741
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a59c1f26975b105ca35031477d37212a
diff --git a/metadata/md5-cache/chromeos-base/feedback-0.0.1-r764 b/metadata/md5-cache/chromeos-base/feedback-0.0.1-r764
new file mode 100644
index 0000000..fd7f2e1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/feedback-0.0.1-r764
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Feedback service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/feedback/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e1008c242e6e91192372de3ba2960c2102355c42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e1008c242e6e91192372de3ba2960c2102355c42_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r764
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e11718061738c8cee9878f8ed873d0c1
diff --git a/metadata/md5-cache/chromeos-base/feedback-9999 b/metadata/md5-cache/chromeos-base/feedback-9999
index 0acf0aa..623b6f7 100644
--- a/metadata/md5-cache/chromeos-base/feedback-9999
+++ b/metadata/md5-cache/chromeos-base/feedback-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9d7ac849a7d350fd2133789eebdaddc5
diff --git a/metadata/md5-cache/chromeos-base/fingerprint_study-0.0.1-r8 b/metadata/md5-cache/chromeos-base/fingerprint_study-0.0.1-r8
index 2920220..8af7472 100644
--- a/metadata/md5-cache/chromeos-base/fingerprint_study-0.0.1-r8
+++ b/metadata/md5-cache/chromeos-base/fingerprint_study-0.0.1-r8
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] chromeos-base/ec-utils dev-python/cherrypy[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/ws4py[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 SLOT=0/0.0.1-r8
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3116dec17b836a9d41095ed87218aa45
diff --git a/metadata/md5-cache/chromeos-base/fingerprint_study-9999 b/metadata/md5-cache/chromeos-base/fingerprint_study-9999
index 53536255..70b6618 100644
--- a/metadata/md5-cache/chromeos-base/fingerprint_study-9999
+++ b/metadata/md5-cache/chromeos-base/fingerprint_study-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] chromeos-base/ec-utils dev-python/cherrypy[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/ws4py[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=29ff78113a386248a62089f92f7085bc
diff --git a/metadata/md5-cache/chromeos-base/foomatic_shell-0.0.1-r6 b/metadata/md5-cache/chromeos-base/foomatic_shell-0.0.1-r6
new file mode 100644
index 0000000..4af2a5b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/foomatic_shell-0.0.1-r6
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Mini shell used by foomatic-rip to execute scripts in PPD files.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/foomatic_shell/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3f76f020569718d57c680d94f2164775b57da9cd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3f76f020569718d57c680d94f2164775b57da9cd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r6
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d07e19058c56eb296ce596dd3a8d8a63
diff --git a/metadata/md5-cache/chromeos-base/foomatic_shell-9999 b/metadata/md5-cache/chromeos-base/foomatic_shell-9999
new file mode 100644
index 0000000..a00f2b6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/foomatic_shell-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Mini shell used by foomatic-rip to execute scripts in PPD files.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/foomatic_shell/
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=01eba69fee9df858e15e963d3ff2ae9b
diff --git a/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r309 b/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r309
deleted file mode 100644
index baaf74c..0000000
--- a/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r309
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libhwsec:= dev-libs/hidapi:= chromeos-base/chromeos-ec-headers:= chromeos-base/u2fd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=G2F gnubby (U2F+GCSE) development and testing tools
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fd
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_9fd99bf51279bfd5841cde5997f0379182410b03_614157b36aa6196f7a410a5164c92b44cdd4e1ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_9fd99bf51279bfd5841cde5997f0379182410b03_614157b36aa6196f7a410a5164c92b44cdd4e1ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libhwsec:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=809e8a197723b295b53eb50b6624d702
diff --git a/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r367 b/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r367
new file mode 100644
index 0000000..ce55f83
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/g2f_tools-0.0.1-r367
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libhwsec:= dev-libs/hidapi:= chromeos-base/chromeos-ec-headers:= chromeos-base/u2fd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=G2F gnubby (U2F+GCSE) development and testing tools
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fd
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e8a973464784e588992988988eb26cfa0cf5f67b_455c68aebdef50de586de3bdbacfe923077cd697_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e8a973464784e588992988988eb26cfa0cf5f67b_455c68aebdef50de586de3bdbacfe923077cd697_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libhwsec:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3c6aae15bc4e6e1fd36f76de312e12a1
diff --git a/metadata/md5-cache/chromeos-base/g2f_tools-9999 b/metadata/md5-cache/chromeos-base/g2f_tools-9999
index 8aee738..a527c94 100644
--- a/metadata/md5-cache/chromeos-base/g2f_tools-9999
+++ b/metadata/md5-cache/chromeos-base/g2f_tools-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libhwsec:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=46d88d23fd0228c0a666520e434b233b
diff --git a/metadata/md5-cache/chromeos-base/gestures-0.0.1-r593 b/metadata/md5-cache/chromeos-base/gestures-0.0.1-r593
deleted file mode 100644
index acd77c2..0000000
--- a/metadata/md5-cache/chromeos-base/gestures-0.0.1-r593
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-cpp/gtest:= X? ( x11-libs/libXi:= ) chromeos-base/gestures-conf:= chromeos-base/libevdev:= dev-libs/jsoncpp:= virtual/udev
-DESCRIPTION=Gesture recognizer library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/gestures/
-IUSE=-asan +X cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_2592515cac08f4661dc5bf1a0908d27e69c59b90
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/gestures-conf:= chromeos-base/libevdev:= dev-libs/jsoncpp:= virtual/udev
-SLOT=0/0.0.1-r593
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ec25a92674764a1eb2a5d06c0c45ccaa
diff --git a/metadata/md5-cache/chromeos-base/gestures-0.0.1-r599 b/metadata/md5-cache/chromeos-base/gestures-0.0.1-r599
new file mode 100644
index 0000000..572ad8a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/gestures-0.0.1-r599
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-cpp/gtest:= X? ( x11-libs/libXi:= ) chromeos-base/gestures-conf:= chromeos-base/libevdev:= dev-libs/jsoncpp:= virtual/udev
+DESCRIPTION=Gesture recognizer library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/gestures/
+IUSE=-asan +X cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_2ce7b4a63b39ac2076197506ea56603b4897af33
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/gestures-conf:= chromeos-base/libevdev:= dev-libs/jsoncpp:= virtual/udev
+SLOT=0/0.0.1-r599
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=47ed801418ba2417e4aac2258fcc21fc
diff --git a/metadata/md5-cache/chromeos-base/gestures-9999 b/metadata/md5-cache/chromeos-base/gestures-9999
index a4b418d..1737449 100644
--- a/metadata/md5-cache/chromeos-base/gestures-9999
+++ b/metadata/md5-cache/chromeos-base/gestures-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/gestures-conf:= chromeos-base/libevdev:= dev-libs/jsoncpp:= virtual/udev
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=999ae599c6fb3f5a15586aab0be5f0d1
diff --git a/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r116 b/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r116
deleted file mode 100644
index 58cbfb6..0000000
--- a/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r116
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DEPEND=sys-apps/baselayout
-DESCRIPTION=Board specific gestures library configuration file.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/xorg-conf/
-IUSE=elan board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_981b96685ce1a814a6dfdfcf2033809bf4a168dc
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!chromeos-base/touchpad-linearity sys-apps/baselayout
-SLOT=0/0.0.1-r116
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=4f1204fdc24bd8e00bcdb0d89a60cf13
diff --git a/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r120 b/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r120
new file mode 100644
index 0000000..512db35
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/gestures-conf-0.0.1-r120
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DEPEND=sys-apps/baselayout
+DESCRIPTION=Board specific gestures library configuration file.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/xorg-conf/
+IUSE=elan board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_50f8e8dc03a93e5a4d0d65f37366345327617ff2
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!chromeos-base/touchpad-linearity sys-apps/baselayout
+SLOT=0/0.0.1-r120
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=c3a5af5192c7379481942747466c77f0
diff --git a/metadata/md5-cache/chromeos-base/gestures-conf-9999 b/metadata/md5-cache/chromeos-base/gestures-conf-9999
index 4c00b42..e97c90f 100644
--- a/metadata/md5-cache/chromeos-base/gestures-conf-9999
+++ b/metadata/md5-cache/chromeos-base/gestures-conf-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=Board specific gestures library configuration file.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/xorg-conf/
-IUSE=elan board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_
+IUSE=elan board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 RDEPEND=!chromeos-base/touchpad-linearity sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=04fe6792d4cc75446327890ead31ee24
diff --git a/metadata/md5-cache/chromeos-base/glbench-0.0.1-r12 b/metadata/md5-cache/chromeos-base/glbench-0.0.1-r12
deleted file mode 100644
index b627b15..0000000
--- a/metadata/md5-cache/chromeos-base/glbench-0.0.1-r12
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=>=dev-cpp/gflags-2.0:= media-libs/libpng:= virtual/opengles:= media-libs/waffle:= x11-drivers/opengles-headers:=
-DESCRIPTION=Microbenchmark for opengl/gles
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/glbench/
-IUSE=opengl opengles cros_host cros_workon_tree_7cdaa03d308c5a215d7e2006727a1910e63f93c2
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=>=dev-cpp/gflags-2.0:= media-libs/libpng:= virtual/opengles:= media-libs/waffle:=
-SLOT=0/0.0.1-r12
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=39819aaa4021cc1f7ff5b39791d3e585
diff --git a/metadata/md5-cache/chromeos-base/glbench-0.0.1-r13 b/metadata/md5-cache/chromeos-base/glbench-0.0.1-r13
new file mode 100644
index 0000000..c6a44b0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/glbench-0.0.1-r13
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=>=dev-cpp/gflags-2.0:= media-libs/libpng:= virtual/opengles:= media-libs/waffle:= x11-drivers/opengles-headers:=
+DESCRIPTION=Microbenchmark for opengl/gles
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/glbench/
+IUSE=opengl opengles cros_host cros_workon_tree_8b416bec3755bfd7cd686208ed5ce0f032d9b14a
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=dev-cpp/gflags-2.0:= media-libs/libpng:= virtual/opengles:= media-libs/waffle:=
+SLOT=0/0.0.1-r13
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a439f849167450f80cdac5095be98114
diff --git a/metadata/md5-cache/chromeos-base/glbench-9999 b/metadata/md5-cache/chromeos-base/glbench-9999
index 785653d..cf14b11 100644
--- a/metadata/md5-cache/chromeos-base/glbench-9999
+++ b/metadata/md5-cache/chromeos-base/glbench-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-cpp/gflags-2.0:= media-libs/libpng:= virtual/opengles:= media-libs/waffle:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4e570216b2125e081c9024eedcc49fb1
diff --git a/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r127 b/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r127
deleted file mode 100644
index 2875673..0000000
--- a/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r127
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/glib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=libchrome-glib message loop bridge
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/glib-bridge
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7bd82a4c12dc3c1ec98642d14b50d3aba38d745e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7bd82a4c12dc3c1ec98642d14b50d3aba38d745e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/glib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=98a80bac42dd67502b1378f68a40a885
diff --git a/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r150 b/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r150
new file mode 100644
index 0000000..48b5fa1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/glib-bridge-0.0.1-r150
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/glib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=libchrome-glib message loop bridge
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/glib-bridge
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6f06912340fa4cedbee74d5e9114ceb124be5071_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6f06912340fa4cedbee74d5e9114ceb124be5071_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/glib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0ba5ebd2c7eae547921d24686193d3fe
diff --git a/metadata/md5-cache/chromeos-base/glib-bridge-9999 b/metadata/md5-cache/chromeos-base/glib-bridge-9999
index 5cf4dc7..f7801e4 100644
--- a/metadata/md5-cache/chromeos-base/glib-bridge-9999
+++ b/metadata/md5-cache/chromeos-base/glib-bridge-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/glib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5e902ab8ffe5cf88ccdbbafc0c107545
diff --git a/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r437 b/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r437
deleted file mode 100644
index 2f1dfdc..0000000
--- a/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r437
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Android Emulator Daemon for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/goldfishd/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b96275b377d51264ddbf1c56d9dc8d9be35259f8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b96275b377d51264ddbf1c56d9dc8d9be35259f8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/autotest-client >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=68872222f96ce39f13bac3c043816ded
diff --git a/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r458 b/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r458
new file mode 100644
index 0000000..add43473
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/goldfishd-0.0.1-r458
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Android Emulator Daemon for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/goldfishd/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f72b5a85f1d9d8b53d2fc498018abb1eb59188b7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f72b5a85f1d9d8b53d2fc498018abb1eb59188b7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/autotest-client >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f6f6cf94b4c3dac4f47e907cbda4e6e2
diff --git a/metadata/md5-cache/chromeos-base/goldfishd-9999 b/metadata/md5-cache/chromeos-base/goldfishd-9999
index 78a4d50..7482a82 100644
--- a/metadata/md5-cache/chromeos-base/goldfishd-9999
+++ b/metadata/md5-cache/chromeos-base/goldfishd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/autotest-client >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=222b61c95175c552cbf5e8e067e5f668
diff --git a/metadata/md5-cache/chromeos-base/google-breakpad-2020.06.05.013145-r187 b/metadata/md5-cache/chromeos-base/google-breakpad-2020.06.05.013145-r187
deleted file mode 100644
index 872b939..0000000
--- a/metadata/md5-cache/chromeos-base/google-breakpad-2020.06.05.013145-r187
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=net-misc/curl:= test? ( dev-cpp/gtest:= )
-DESCRIPTION=Google crash reporting
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/breakpad/breakpad
-IUSE=-alltests cros_host test cros_host cros_workon_tree_db3eb4400e3481586bfabec9075d3aebbfee8d1b_84dd0fabdc4d0729885dc7ce3ac35903504ba5e6 cros_i686 cros_host cros_workon_tree_db3eb4400e3481586bfabec9075d3aebbfee8d1b_84dd0fabdc4d0729885dc7ce3ac35903504ba5e6
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=net-misc/curl:=
-SLOT=0/2020.06.05.013145-r187
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=243d1d7423db3412762c947678e6300b
diff --git a/metadata/md5-cache/chromeos-base/google-breakpad-2020.08.05.194238-r190 b/metadata/md5-cache/chromeos-base/google-breakpad-2020.08.05.194238-r190
new file mode 100644
index 0000000..a5a87a9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/google-breakpad-2020.08.05.194238-r190
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=net-misc/curl:= test? ( dev-cpp/gtest:= )
+DESCRIPTION=Google crash reporting
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/breakpad/breakpad
+IUSE=-alltests cros_host test cros_host cros_workon_tree_527c1cc9cec5920ce709102e4be226381df00c1c_5df994fdcdfab0b9b21d11fa25545442eae001e5 cros_arm64 cros_host cros_workon_tree_527c1cc9cec5920ce709102e4be226381df00c1c_5df994fdcdfab0b9b21d11fa25545442eae001e5 cros_i686 cros_host cros_workon_tree_527c1cc9cec5920ce709102e4be226381df00c1c_5df994fdcdfab0b9b21d11fa25545442eae001e5
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=net-misc/curl:=
+SLOT=0/2020.08.05.194238-r190
+_eclasses_=cros-arm64	f1a25262a61026d22719ab66e21b64c7	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cbe8651614ea781ebba631d7a38ff647
diff --git a/metadata/md5-cache/chromeos-base/google-breakpad-9999 b/metadata/md5-cache/chromeos-base/google-breakpad-9999
index 9948fa0..4cde0e1 100644
--- a/metadata/md5-cache/chromeos-base/google-breakpad-9999
+++ b/metadata/md5-cache/chromeos-base/google-breakpad-9999
@@ -1,14 +1,14 @@
-BDEPEND=dev-vcs/git dev-vcs/git
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install prepare setup test unpack
 DEPEND=net-misc/curl:= test? ( dev-cpp/gtest:= )
 DESCRIPTION=Google crash reporting
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/breakpad/breakpad
-IUSE=-alltests cros_host test cros_host cros_workon_tree_ cros_i686 cros_host cros_workon_tree_
+IUSE=-alltests cros_host test cros_host cros_workon_tree_ cros_arm64 cros_host cros_workon_tree_ cros_i686 cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
-PROPERTIES=live live
+PROPERTIES=live live live
 RDEPEND=net-misc/curl:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=87c19b91e3766630de5a50e083b95544
+_eclasses_=cros-arm64	f1a25262a61026d22719ab66e21b64c7	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-i686	f43f8a091d6660ef9bb87afde6c2cb67	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=619654d69e55c330dd8122e882b106a2
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r43 b/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r43
deleted file mode 100644
index 728a937a..0000000
--- a/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r43
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup test unpack
-DEPEND=chromeos-base/cros-config-api dev-go/crypto dev-go/fogleman-gg dev-go/go-image dev-go/gofpdf dev-go/golang-freetype dev-go/gonum-plot dev-go/protobuf dev-go/readline dev-go/svgo dev-lang/go
-DESCRIPTION=Portable graphics utils written in go
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/graphics/
-IUSE=cros_host cros_workon_tree_da2aed4d3df665d7ede3627b2a19ff7c0bd34e48
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/cros-config-api dev-go/crypto dev-go/fogleman-gg dev-go/go-image dev-go/gofpdf dev-go/golang-freetype dev-go/gonum-plot dev-go/protobuf dev-go/readline dev-go/svgo
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=121dfcb83dfcad76f073d9b1c2408fd3
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r74 b/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r74
new file mode 100644
index 0000000..6ee9430
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/graphics-utils-go-0.0.1-r74
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup test unpack
+DEPEND=chromeos-base/cros-config-api dev-go/crypto dev-go/fogleman-gg dev-go/go-image dev-go/gofpdf dev-go/golang-freetype dev-go/gonum-plot dev-go/protobuf dev-go/readline dev-go/svgo dev-lang/go
+DESCRIPTION=Portable graphics utils written in go
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/graphics/
+IUSE=cros_host cros_workon_tree_dcf1575472604deef1400a83c673465422cf5cfe
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/cros-config-api dev-go/crypto dev-go/fogleman-gg dev-go/go-image dev-go/gofpdf dev-go/golang-freetype dev-go/gonum-plot dev-go/protobuf dev-go/readline dev-go/svgo
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3ad9c37430eca147ca48abae2ad8dfc6
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-go-9999 b/metadata/md5-cache/chromeos-base/graphics-utils-go-9999
index 96a5d5f..134b305 100644
--- a/metadata/md5-cache/chromeos-base/graphics-utils-go-9999
+++ b/metadata/md5-cache/chromeos-base/graphics-utils-go-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/cros-config-api dev-go/crypto dev-go/fogleman-gg dev-go/go-image dev-go/gofpdf dev-go/golang-freetype dev-go/gonum-plot dev-go/protobuf dev-go/readline dev-go/svgo
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ea0efe6310dab83d953fce314cc4d1a7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=18ec05243293b2e7db9273538c5d0a6d
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r2 b/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r2
deleted file mode 100644
index 6d166d3..0000000
--- a/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r2
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=chromeos-base/cros-config-api
-DESCRIPTION=Graphics utilities written in python
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/graphics/
-IUSE=cros_host cros_workon_tree_a13ff18c48f84bb65b504c1dad2d61ab2d379f97 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/cros-config-api python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6db00b3efcacaebac22a23986ef45928
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r3 b/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r3
new file mode 100644
index 0000000..c9837e4
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/graphics-utils-python-0.0.1-r3
@@ -0,0 +1,15 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=chromeos-base/cros-config-api
+DESCRIPTION=Graphics utilities written in python
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/graphics/
+IUSE=cros_host cros_workon_tree_d8aebe361996f4749ab69c066f501760993babef python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/cros-config-api python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3d8a003b2a40dd707921b38893b6c716
diff --git a/metadata/md5-cache/chromeos-base/graphics-utils-python-9999 b/metadata/md5-cache/chromeos-base/graphics-utils-python-9999
index 1196f35..787d8d9 100644
--- a/metadata/md5-cache/chromeos-base/graphics-utils-python-9999
+++ b/metadata/md5-cache/chromeos-base/graphics-utils-python-9999
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/cros-config-api python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=947b715d84c540614e15bf79c6b09923
diff --git a/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r37 b/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r37
deleted file mode 100644
index 307123e..0000000
--- a/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r37
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DESCRIPTION=Graphyte RF testing framework
-EAPI=7
-HOMEPAGE=https://sites.google.com/a/google.com/graphyte/home
-IUSE=cros_host cros_workon_tree_068a93a9d64357042300153808eb9309ee5fee5c python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
-SLOT=0/0.0.1-r37
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=29ee33fe37953a30697b47caf608c4ee
diff --git a/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r39 b/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r39
new file mode 100644
index 0000000..4863613
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/graphyte-0.0.1-r39
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Graphyte RF testing framework
+EAPI=7
+HOMEPAGE=https://sites.google.com/a/google.com/graphyte/home
+IUSE=cros_host cros_workon_tree_f05776e43faaedc4b58f8b38e20bdf050a59b264 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 )
+SLOT=0/0.0.1-r39
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=786a12b751cd39368137a4e6db9735be
diff --git a/metadata/md5-cache/chromeos-base/graphyte-9999 b/metadata/md5-cache/chromeos-base/graphyte-9999
index 7d74c55..1266240 100644
--- a/metadata/md5-cache/chromeos-base/graphyte-9999
+++ b/metadata/md5-cache/chromeos-base/graphyte-9999
@@ -1,14 +1,14 @@
-BDEPEND=dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 DEFINED_PHASES=compile configure info install prepare setup test unpack
 DESCRIPTION=Graphyte RF testing framework
 EAPI=7
 HOMEPAGE=https://sites.google.com/a/google.com/graphyte/home
-IUSE=cros_host cros_workon_tree_ python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
+IUSE=cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
+RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=56962512756da637fb1fd027309073df
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=53d99aad1ff2bf1dc8b3946b93fb8755
diff --git a/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r944 b/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r944
deleted file mode 100644
index 7065946..0000000
--- a/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r944
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/ec-utils:= chromeos-base/metrics:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=A daemon to update EC firmware of hammer, the base of the detachable.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/
-IUSE=-hammerd_api fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f2bf6ae043b20c7e134a520985328b7bd10e6481_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f2bf6ae043b20c7e134a520985328b7bd10e6481_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/ec-utils:= chromeos-base/metrics:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r944
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=85db5fb75bb6bb6bd113e3edfbbecf68
diff --git a/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r969 b/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r969
new file mode 100644
index 0000000..743fcea
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/hammerd-0.0.1-r969
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/ec-utils:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=A daemon to update EC firmware of hammer, the base of the detachable.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/
+IUSE=-hammerd_api fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e53f86b0b2b55f741fd7d3d24b703fd84b17330e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e53f86b0b2b55f741fd7d3d24b703fd84b17330e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/ec-utils:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r969
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=20c0d6b7e2c3f790652b6dc58d5835fc
diff --git a/metadata/md5-cache/chromeos-base/hammerd-9999 b/metadata/md5-cache/chromeos-base/hammerd-9999
index 8f8f1f6..a3bee7f 100644
--- a/metadata/md5-cache/chromeos-base/hammerd-9999
+++ b/metadata/md5-cache/chromeos-base/hammerd-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/ec-utils:= chromeos-base/metrics:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/ec-utils:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=A daemon to update EC firmware of hammer, the base of the detachable.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/ec-utils:= chromeos-base/metrics:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/ec-utils:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= dev-libs/openssl:0= sys-apps/flashmap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=efc5278b402891c5935e75d128881478
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=189bffff796998c9b10258b3d5cffc07
diff --git a/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r483 b/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r483
deleted file mode 100644
index 6762c59..0000000
--- a/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r483
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=chromeos-base/hammerd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Python wrapper of hammerd API and some python utility scripts.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/
-IUSE=+hammerd_api cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f2bf6ae043b20c7e134a520985328b7bd10e6481_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f2bf6ae043b20c7e134a520985328b7bd10e6481_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/hammerd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
-SLOT=0/0.0.1-r483
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b3c21cf605448e29ef0841a3d3ea01bd
diff --git a/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r507 b/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r507
new file mode 100644
index 0000000..2dac57a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/hammerd-test-utils-0.0.1-r507
@@ -0,0 +1,15 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=chromeos-base/hammerd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Python wrapper of hammerd API and some python utility scripts.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hammerd/
+IUSE=+hammerd_api cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e53f86b0b2b55f741fd7d3d24b703fd84b17330e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e53f86b0b2b55f741fd7d3d24b703fd84b17330e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/hammerd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0.0.1-r507
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ed343638ad385504f3746fc65f41a6ad
diff --git a/metadata/md5-cache/chromeos-base/hammerd-test-utils-9999 b/metadata/md5-cache/chromeos-base/hammerd-test-utils-9999
index 7a25830..bb50744 100644
--- a/metadata/md5-cache/chromeos-base/hammerd-test-utils-9999
+++ b/metadata/md5-cache/chromeos-base/hammerd-test-utils-9999
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/hammerd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8b1cac82fbdb4e1f7489e8294aa1f8c8
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r135 b/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r135
deleted file mode 100644
index 324ceff..0000000
--- a/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r135
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/system_api:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Hardware Verifier Tool/Lib for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_145583dcf0814760ca300ce984891691f4f4bc11_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_145583dcf0814760ca300ce984891691f4f4bc11_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r135
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=a1bc7646b04c9f03f376ea25fd95fb1f
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r169 b/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r169
new file mode 100644
index 0000000..0782fcb
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/hardware_verifier-0.0.1-r169
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/system_api:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Hardware Verifier Tool/Lib for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_676147ce581555ea71e4cd46c6e43c1d663f658a_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_676147ce581555ea71e4cd46c6e43c1d663f658a_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r169
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=44fa42a38bbcd14a2306c87303e58f70
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier-9999 b/metadata/md5-cache/chromeos-base/hardware_verifier-9999
index 15de2fd..b9e3bfd 100644
--- a/metadata/md5-cache/chromeos-base/hardware_verifier-9999
+++ b/metadata/md5-cache/chromeos-base/hardware_verifier-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/system_api:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/system_api:= chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Hardware Verifier Tool/Lib for Chrome OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=ae1816e854e9d8038178b20d22227e77
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=8cfe42ae0da1341ee166be3a8e5824f5
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r36 b/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r36
deleted file mode 100644
index 4620462..0000000
--- a/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r36
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/system_api:= chromeos-base/vboot_reference:= dev-go/protobuf dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Hardware Verifier go proto for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/proto
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_145583dcf0814760ca300ce984891691f4f4bc11_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_145583dcf0814760ca300ce984891691f4f4bc11_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r36
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=18139dd6c714f6616add281bf4d6f1d8
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r70 b/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r70
new file mode 100644
index 0000000..2f7c6a5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/hardware_verifier_proto-0.0.1-r70
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/system_api:= chromeos-base/vboot_reference:= dev-go/protobuf dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Hardware Verifier go proto for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/proto
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_676147ce581555ea71e4cd46c6e43c1d663f658a_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_676147ce581555ea71e4cd46c6e43c1d663f658a_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r70
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=78921f6a9371e670da7db7017202f156
diff --git a/metadata/md5-cache/chromeos-base/hardware_verifier_proto-9999 b/metadata/md5-cache/chromeos-base/hardware_verifier_proto-9999
index 2060b5b..3829186 100644
--- a/metadata/md5-cache/chromeos-base/hardware_verifier_proto-9999
+++ b/metadata/md5-cache/chromeos-base/hardware_verifier_proto-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=chromeos-base/metrics:= chromeos-base/system_api:= chromeos-base/vboot_reference:= dev-go/protobuf dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/system_api:= chromeos-base/vboot_reference:= dev-go/protobuf dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Hardware Verifier go proto for Chrome OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hardware_verifier/proto
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=71aeac9d13ba484536628aa685c101bd
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=58b23fea9b583dd4814e9b7eef7c9508
diff --git a/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r46 b/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r46
deleted file mode 100644
index e831451..0000000
--- a/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r46
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation:= chromeos-base/system_api:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Hwsec-related test-only features. This package resides in test images only.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hwsec-test-utils/
-IUSE=test tpm tpm2 cros_host cros_workon_tree_677b75140e4ae1b1d889f929c630579a8b13357e_eec5ce9cfadd268344b02efdbec7465fbc391a9e_076d90695122ec2235bc1b00ccc2da310da88372_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_677b75140e4ae1b1d889f929c630579a8b13357e_eec5ce9cfadd268344b02efdbec7465fbc391a9e_076d90695122ec2235bc1b00ccc2da310da88372_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0.0.1-r46
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cc1b3eb903922f062da5c472633f9277
diff --git a/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r87 b/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r87
new file mode 100644
index 0000000..904352c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/hwsec-test-utils-0.0.1-r87
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/trunks:=[test?] ) chromeos-base/attestation:= chromeos-base/system_api:= dev-libs/openssl:= dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Hwsec-related test-only features. This package resides in test images only.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/hwsec-test-utils/
+IUSE=test tpm tpm2 cros_host cros_workon_tree_264bb1bf0f00bb187ac184fd6dedeffeba8be970_aa81756947ecfdd38b22f42eed8eeafa40431079_8bfca2f1ed038e0e416fc64153834ad974b30e7b_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_264bb1bf0f00bb187ac184fd6dedeffeba8be970_aa81756947ecfdd38b22f42eed8eeafa40431079_8bfca2f1ed038e0e416fc64153834ad974b30e7b_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0.0.1-r87
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6956a17587fc480c3e946da81ba8428c
diff --git a/metadata/md5-cache/chromeos-base/hwsec-test-utils-9999 b/metadata/md5-cache/chromeos-base/hwsec-test-utils-9999
index be03ccc..426ea30 100644
--- a/metadata/md5-cache/chromeos-base/hwsec-test-utils-9999
+++ b/metadata/md5-cache/chromeos-base/hwsec-test-utils-9999
@@ -11,5 +11,5 @@
 RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c4882e4253d987e5756a7b455691d37d
diff --git a/metadata/md5-cache/chromeos-base/iioservice-0.0.1-r33 b/metadata/md5-cache/chromeos-base/iioservice-0.0.1-r33
new file mode 100644
index 0000000..3f03d9a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/iioservice-0.0.1-r33
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libiioservice_ipc:= chromeos-base/libmems:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chrome OS sensor HAL IPC util.
+EAPI=7
+IUSE=+seccomp cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7065eafeda4efefbd047454930df0bd2a581bba7_5868de62b85f7f824439fd5ba0fbee2418a2783c_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7065eafeda4efefbd047454930df0bd2a581bba7_5868de62b85f7f824439fd5ba0fbee2418a2783c_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libiioservice_ipc:= chromeos-base/libmems:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r33
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=01df3bd310f309207537e07cb4c6edb9
diff --git a/metadata/md5-cache/chromeos-base/iioservice-9999 b/metadata/md5-cache/chromeos-base/iioservice-9999
new file mode 100644
index 0000000..2e69dd5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/iioservice-9999
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libiioservice_ipc:= chromeos-base/libmems:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chrome OS sensor HAL IPC util.
+EAPI=7
+IUSE=+seccomp cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libiioservice_ipc:= chromeos-base/libmems:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=9cbf2ca8c932db1b17f3767a77bdba9d
diff --git a/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1501 b/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1501
deleted file mode 100644
index e2d3a87..0000000
--- a/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1501
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/openssl:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-fs/lvm2:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Allow mounting verified utility images
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fd6b785806e5c30689307805b3f4210cbaf74efd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fd6b785806e5c30689307805b3f4210cbaf74efd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/openssl:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-fs/lvm2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r1501
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=29e1312d195299435e2eac4119b9a6a5
diff --git a/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1522 b/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1522
new file mode 100644
index 0000000..37634a1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/imageloader-0.0.1-r1522
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=dev-libs/openssl:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-fs/lvm2:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Allow mounting verified utility images
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a0a95501cf76d3e8517c9fea5e2b5ed9ab809401_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a0a95501cf76d3e8517c9fea5e2b5ed9ab809401_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/openssl:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-fs/lvm2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r1522
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=fe4e8fb8c9edd807a8167c65d9b77959
diff --git a/metadata/md5-cache/chromeos-base/imageloader-9999 b/metadata/md5-cache/chromeos-base/imageloader-9999
index 3b4ebb4..6e99855 100644
--- a/metadata/md5-cache/chromeos-base/imageloader-9999
+++ b/metadata/md5-cache/chromeos-base/imageloader-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/openssl:= dev-libs/protobuf:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) sys-fs/lvm2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=73dd477e0c96f4e7ff741377a3051963
diff --git a/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r545 b/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r545
deleted file mode 100644
index ffd9b7c..0000000
--- a/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r545
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=ImageLoader DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fd6b785806e5c30689307805b3f4210cbaf74efd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_fd6b785806e5c30689307805b3f4210cbaf74efd_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/imageloader >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r545
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ea7ffbe374374848b7c423ce758e724d
diff --git a/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r566 b/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r566
new file mode 100644
index 0000000..8ba66acb
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/imageloader-client-0.0.1-r566
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=ImageLoader DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/imageloader/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a0a95501cf76d3e8517c9fea5e2b5ed9ab809401_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a0a95501cf76d3e8517c9fea5e2b5ed9ab809401_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/imageloader >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r566
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a9791d116b20d0baf334ea1187593e04
diff --git a/metadata/md5-cache/chromeos-base/imageloader-client-9999 b/metadata/md5-cache/chromeos-base/imageloader-client-9999
index b0fe15e..92bf79a 100644
--- a/metadata/md5-cache/chromeos-base/imageloader-client-9999
+++ b/metadata/md5-cache/chromeos-base/imageloader-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/imageloader >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5079728e20c3b68891c8366a8d884816
diff --git a/metadata/md5-cache/chromeos-base/infineon-firmware-updater-1.1.2459.0-r30 b/metadata/md5-cache/chromeos-base/infineon-firmware-updater-1.1.2459.0-r31
similarity index 100%
rename from metadata/md5-cache/chromeos-base/infineon-firmware-updater-1.1.2459.0-r30
rename to metadata/md5-cache/chromeos-base/infineon-firmware-updater-1.1.2459.0-r31
diff --git a/metadata/md5-cache/chromeos-base/inputcontrol-0.0.1-r114 b/metadata/md5-cache/chromeos-base/inputcontrol-0.0.1-r114
index 4b30a52..0a48a2c 100644
--- a/metadata/md5-cache/chromeos-base/inputcontrol-0.0.1-r114
+++ b/metadata/md5-cache/chromeos-base/inputcontrol-0.0.1-r114
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-arch/gzip
 SLOT=0/0.0.1-r114
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1bf317abf8d20f38212b800a8f6950aa
diff --git a/metadata/md5-cache/chromeos-base/inputcontrol-9999 b/metadata/md5-cache/chromeos-base/inputcontrol-9999
index a544d72..f02e3b9 100644
--- a/metadata/md5-cache/chromeos-base/inputcontrol-9999
+++ b/metadata/md5-cache/chromeos-base/inputcontrol-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-arch/gzip
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f865bc34cdc2565e1ab0b85741cebf9e
diff --git a/metadata/md5-cache/chromeos-base/ippusb_bridge-0.0.1-r9 b/metadata/md5-cache/chromeos-base/ippusb_bridge-0.0.1-r9
new file mode 100644
index 0000000..20efc94
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ippusb_bridge-0.0.1-r9
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=virtual/libusb:1= >=dev-rust/chunked_transfer-1:= <dev-rust/chunked_transfer-2 >=dev-rust/getopts-0.2.18:= <dev-rust/getopts-0.3 >=dev-rust/httparse-1.3.4:= <dev-rust/httparse-1.4 >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3 >=dev-rust/rusb-0.6.2:= <dev-rust/rusb-0.7 dev-rust/sync:= dev-rust/sys_util:= >=dev-rust/tiny_http-0.7:= <dev-rust/tiny_http-0.8 >=virtual/rust-1.39.0:=
+DESCRIPTION=A proxy for HTTP traffic over an IPP-USB printer connection
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge/
+IUSE=cros_host cros_workon_tree_d96a2e3ec092d6680d7cba7d16116b1e3f8ae31c cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/libusb:1=
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=38b721521305d0ba29e7cf5302930ef6
diff --git a/metadata/md5-cache/chromeos-base/ippusb_bridge-9999 b/metadata/md5-cache/chromeos-base/ippusb_bridge-9999
new file mode 100644
index 0000000..aece0aa
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ippusb_bridge-9999
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=virtual/libusb:1= >=dev-rust/chunked_transfer-1:= <dev-rust/chunked_transfer-2 >=dev-rust/getopts-0.2.18:= <dev-rust/getopts-0.3 >=dev-rust/httparse-1.3.4:= <dev-rust/httparse-1.4 >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3 >=dev-rust/rusb-0.6.2:= <dev-rust/rusb-0.7 dev-rust/sync:= dev-rust/sys_util:= >=dev-rust/tiny_http-0.7:= <dev-rust/tiny_http-0.8 >=virtual/rust-1.39.0:=
+DESCRIPTION=A proxy for HTTP traffic over an IPP-USB printer connection
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge/
+IUSE=cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/libusb:1=
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8d9afbdab7e478a52d3211631fa3c528
diff --git a/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r288 b/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r288
deleted file mode 100644
index 3ea4bca..0000000
--- a/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r288
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/minijail:= net-print/ippusbxd:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Service which manages communication between ippusbxd and cups.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_36ef0b76b04c29311ee4364701c3d934e0d60aa0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_36ef0b76b04c29311ee4364701c3d934e0d60aa0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= net-print/ippusbxd:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r288
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=d5c996c4cd7db94d153f8ac531fb7a26
diff --git a/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r316 b/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r316
new file mode 100644
index 0000000..b07576f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ippusb_manager-0.0.1-r316
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/minijail:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Service which manages communication between ippusb printers and cups.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1d1ac851617adbce1de3aba9c9446f9ca5e4de48_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1d1ac851617adbce1de3aba9c9446f9ca5e4de48_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= virtual/libusb:1= chromeos-base/ippusb_bridge >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r316
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=fb828024805293c578314c717f4ab4a1
diff --git a/metadata/md5-cache/chromeos-base/ippusb_manager-9999 b/metadata/md5-cache/chromeos-base/ippusb_manager-9999
index 79b0b64..7cf0751 100644
--- a/metadata/md5-cache/chromeos-base/ippusb_manager-9999
+++ b/metadata/md5-cache/chromeos-base/ippusb_manager-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/minijail:= net-print/ippusbxd:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Service which manages communication between ippusbxd and cups.
+DEPEND=chromeos-base/minijail:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Service which manages communication between ippusb printers and cups.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ippusb_manager/
 IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= net-print/ippusbxd:= virtual/libusb:1= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/minijail:= virtual/libusb:1= chromeos-base/ippusb_bridge >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=c8364505790c16ab6748040e7209ed5e
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=19365ad87128853b4ee017bf2b46dbaa
diff --git a/metadata/md5-cache/chromeos-base/jabra-vold-0.0.1-r16 b/metadata/md5-cache/chromeos-base/jabra-vold-0.0.1-r16
index 94cbeea..528842a 100644
--- a/metadata/md5-cache/chromeos-base/jabra-vold-0.0.1-r16
+++ b/metadata/md5-cache/chromeos-base/jabra-vold-0.0.1-r16
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=media-libs/alsa-lib-1.0:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=854b4c30aa5818cf3f08751c239229da
diff --git a/metadata/md5-cache/chromeos-base/jabra-vold-9999 b/metadata/md5-cache/chromeos-base/jabra-vold-9999
index d2aa60e..3949d73 100644
--- a/metadata/md5-cache/chromeos-base/jabra-vold-9999
+++ b/metadata/md5-cache/chromeos-base/jabra-vold-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=media-libs/alsa-lib-1.0:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=f76df8f69888df756f57f1be3f92acb5
diff --git a/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r205 b/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r205
deleted file mode 100644
index dab30ec..0000000
--- a/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r205
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Requests and manages Kerberos tickets to enable Kerberos SSO
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/kerberos/
-IUSE=asan fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3396e8649c92adf1b4b269e09b1208b6339e9574_98c0db7e92836fcb71403a83973a9b5018fe6177_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3396e8649c92adf1b4b269e09b1208b6339e9574_98c0db7e92836fcb71403a83973a9b5018fe6177_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r205
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=1a764e06be09df4622c1211954ce9a3f
diff --git a/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r239 b/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r239
new file mode 100644
index 0000000..db98b45
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/kerberos-0.0.1-r239
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/protobuf:= sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Requests and manages Kerberos tickets to enable Kerberos SSO
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/kerberos/
+IUSE=asan fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1ed938290dd08fbf20b6ad852236dd7c79fd09e1_377caa22e8416ce2388b9c099e85be393001947f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1ed938290dd08fbf20b6ad852236dd7c79fd09e1_377caa22e8416ce2388b9c099e85be393001947f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/protobuf:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r239
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=745c7712414bbbc54d0099e1714ad2f1
diff --git a/metadata/md5-cache/chromeos-base/kerberos-9999 b/metadata/md5-cache/chromeos-base/kerberos-9999
index 9ff6aaa..ec5cb23 100644
--- a/metadata/md5-cache/chromeos-base/kerberos-9999
+++ b/metadata/md5-cache/chromeos-base/kerberos-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/protobuf:= sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Requests and manages Kerberos tickets to enable Kerberos SSO
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/kerberos/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=app-crypt/mit-krb5:= chromeos-base/libbrillo:=[asan?,fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/protobuf:= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=f4aa53087b5187962156c636879565ed
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=e77522838316fbe63be996b37ef31ba6
diff --git a/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-0.0.1-r20 b/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-0.0.1-r20
new file mode 100644
index 0000000..c63889c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-0.0.1-r20
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=net-print/cups >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=ChromeOS implementation of the Lexmark fax-pnh-filter
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/lexmark-fax-pnh/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_c21e4f27dbf3f77743ca90efe4b116f6a95add73 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_c21e4f27dbf3f77743ca90efe4b116f6a95add73 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=MPL-2.0
+PROPERTIES=live live
+RDEPEND=net-print/cups >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r20
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=195bb5f21214901888c8803ebb39ccb4
diff --git a/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-9999 b/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-9999
new file mode 100644
index 0000000..c9ff7b9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/lexmark-fax-pnh-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=net-print/cups >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=ChromeOS implementation of the Lexmark fax-pnh-filter
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/lexmark-fax-pnh/
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=MPL-2.0
+PROPERTIES=live live
+RDEPEND=net-print/cups >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=21367ff9c23f457a70a62c54eaacb2f2
diff --git a/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1668 b/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1668
deleted file mode 100644
index 52ea157..0000000
--- a/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1668
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) >=chromeos-base/protofiles-0.0.39:= dbus? ( chromeos-base/system_api:=[fuzzer?] ) dev-libs/modp_b64:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Base library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libbrillo/
-IUSE=cros_host +dbus +device_mapper fuzzer +udev cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9da9751f965ac8cdb8411a0766dad4f0676e1083_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9da9751f965ac8cdb8411a0766dad4f0676e1083_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) !cros_host? ( chromeos-base/libchromeos-use-flags ) chromeos-base/chromeos-ca-certificates !chromeos-base/libchromeos >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-SLOT=0/0.0.1-r1668
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2d06e4b207f5a9d1227870b9e3427459
diff --git a/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1712 b/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1712
new file mode 100644
index 0000000..2cfee6d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libbrillo-0.0.1-r1712
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) >=chromeos-base/protofiles-0.0.41:= dbus? ( chromeos-base/system_api:=[fuzzer?] ) dev-libs/modp_b64:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Base library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libbrillo/
+IUSE=cros_host +dbus +device_mapper fuzzer +udev cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_55186d9bbf49265cd0ecd2b2eabb8a062ac2eb7d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_55186d9bbf49265cd0ecd2b2eabb8a062ac2eb7d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) !cros_host? ( chromeos-base/libchromeos-use-flags ) chromeos-base/chromeos-ca-certificates !chromeos-base/libchromeos >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+SLOT=0/0.0.1-r1712
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1c43b76b60a3d6970bb97f117c290515
diff --git a/metadata/md5-cache/chromeos-base/libbrillo-9999 b/metadata/md5-cache/chromeos-base/libbrillo-9999
index 4b25c0d..d86f969 100644
--- a/metadata/md5-cache/chromeos-base/libbrillo-9999
+++ b/metadata/md5-cache/chromeos-base/libbrillo-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) >=chromeos-base/protofiles-0.0.39:= dbus? ( chromeos-base/system_api:=[fuzzer?] ) dev-libs/modp_b64:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) >=chromeos-base/protofiles-0.0.41:= dbus? ( chromeos-base/system_api:=[fuzzer?] ) dev-libs/modp_b64:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Base library for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libbrillo/
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/minijail:= dbus? ( dev-libs/dbus-glib:= ) dev-libs/openssl:= dev-libs/protobuf:= net-libs/grpc:= net-misc/curl:= sys-apps/rootdev:= device_mapper? ( sys-fs/lvm2:= ) udev? ( virtual/libudev ) !cros_host? ( chromeos-base/libchromeos-use-flags ) chromeos-base/chromeos-ca-certificates !chromeos-base/libchromeos >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b328e0c133de88d1e5cdfb48eb39e76a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b2f6515f5c908b317eedfbc21fd41e40
diff --git a/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r37 b/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r37
deleted file mode 100644
index 7fb535c..0000000
--- a/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r37
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=dev-libs/glib:2= dev-libs/libevent:= dev-libs/modp_b64:= crypto? ( dev-libs/nss:= dev-libs/openssl:= ) dbus? ( sys-apps/dbus:= dev-libs/protobuf:= ) dev-libs/re2:= !~chromeos-base/libchrome-576279 !chromeos-base/libchrome:576279 !chromeos-base/libchrome:462023 !chromeos-base/libchrome:456626 !chromeos-base/libchrome:395517 dev-cpp/gtest:= cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome base/ and dbus/ libraries extracted for use on Chrome OS
-EAPI=5
-HOMEPAGE=http://dev.chromium.org/chromium-os/packages/libchrome
-IUSE=cros_host +crypto +dbus fuzzer +mojo +timers cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_debc0344fe932d71dd37515f6fd39ce72638529a cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_debc0344fe932d71dd37515f6fd39ce72638529a compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/glib:2= dev-libs/libevent:= dev-libs/modp_b64:= crypto? ( dev-libs/nss:= dev-libs/openssl:= ) dbus? ( sys-apps/dbus:= dev-libs/protobuf:= ) dev-libs/re2:= !~chromeos-base/libchrome-576279 !chromeos-base/libchrome:576279 !chromeos-base/libchrome:462023 !chromeos-base/libchrome:456626 !chromeos-base/libchrome:395517 !chromeos-base/libmojo
-REQUIRED_USE=mojo? ( crypto )
-SLOT=0/0.0.1-r37
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=af3d410f2d5ad1748be9184d669a9dc2
diff --git a/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r66 b/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r66
new file mode 100644
index 0000000..2531cb2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libchrome-0.0.1-r66
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=dev-libs/glib:2= dev-libs/libevent:= dev-libs/modp_b64:= crypto? ( dev-libs/nss:= dev-libs/openssl:= ) dbus? ( sys-apps/dbus:= dev-libs/protobuf:= ) dev-libs/re2:= !~chromeos-base/libchrome-576279 !chromeos-base/libchrome:576279 !chromeos-base/libchrome:462023 !chromeos-base/libchrome:456626 !chromeos-base/libchrome:395517 dev-cpp/gtest:= cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome base/ and dbus/ libraries extracted for use on Chrome OS
+EAPI=5
+HOMEPAGE=http://dev.chromium.org/chromium-os/packages/libchrome
+IUSE=cros_host +crypto +dbus fuzzer +mojo +timers cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f09bc1fc190d2b90b11a205b0250b030e4739bab cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f09bc1fc190d2b90b11a205b0250b030e4739bab compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/glib:2= dev-libs/libevent:= dev-libs/modp_b64:= crypto? ( dev-libs/nss:= dev-libs/openssl:= ) dbus? ( sys-apps/dbus:= dev-libs/protobuf:= ) dev-libs/re2:= !~chromeos-base/libchrome-576279 !chromeos-base/libchrome:576279 !chromeos-base/libchrome:462023 !chromeos-base/libchrome:456626 !chromeos-base/libchrome:395517 !chromeos-base/libmojo
+REQUIRED_USE=mojo? ( crypto )
+SLOT=0/0.0.1-r66
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bb0be277f4b3e5c3fc44b5aabee3403f
diff --git a/metadata/md5-cache/chromeos-base/libchrome-9999 b/metadata/md5-cache/chromeos-base/libchrome-9999
index 4a5f788..3f26d2e 100644
--- a/metadata/md5-cache/chromeos-base/libchrome-9999
+++ b/metadata/md5-cache/chromeos-base/libchrome-9999
@@ -10,5 +10,5 @@
 RDEPEND=dev-libs/glib:2= dev-libs/libevent:= dev-libs/modp_b64:= crypto? ( dev-libs/nss:= dev-libs/openssl:= ) dbus? ( sys-apps/dbus:= dev-libs/protobuf:= ) dev-libs/re2:= !~chromeos-base/libchrome-576279 !chromeos-base/libchrome:576279 !chromeos-base/libchrome:462023 !chromeos-base/libchrome:456626 !chromeos-base/libchrome:395517 !chromeos-base/libmojo
 REQUIRED_USE=mojo? ( crypto )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=04ad1e429e9eb6aa254266ddcdfe776a
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1726 b/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1726
deleted file mode 100644
index 6999dd8..0000000
--- a/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1726
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library used to start Chromium-based UIs
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-ui/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_63b44e3686f0442c1912e91acfe36a7f40295f6b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_63b44e3686f0442c1912e91acfe36a7f40295f6b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/bootstat >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1726
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d63a41b3f0db90f09a9f649f94bf28b2
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1748 b/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1748
new file mode 100644
index 0000000..07d854a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libchromeos-ui-0.0.1-r1748
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library used to start Chromium-based UIs
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-ui/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa3969c8eba9dd2b27338d57f7a640843916bca6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fa3969c8eba9dd2b27338d57f7a640843916bca6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/bootstat >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1748
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4541d37683c50a7df380d7db15b3503b
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-ui-9999 b/metadata/md5-cache/chromeos-base/libchromeos-ui-9999
index e3e706a..c9ac799 100644
--- a/metadata/md5-cache/chromeos-base/libchromeos-ui-9999
+++ b/metadata/md5-cache/chromeos-base/libchromeos-ui-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/bootstat >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6c41d5caeb4dff925d618e26072125e4
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r15 b/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r15
new file mode 100644
index 0000000..13cd2aa
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r15
@@ -0,0 +1,11 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Text file listing USE flags for chromeos-base/libchromeos
+EAPI=7
+IUSE=allow_consumer_kiosk arc arc_adb_sideloading arc_force_2x_scaling arc_native_bridge_64bit_support_experiment arc_transition_m_to_n arcpp arcvm asan background_blur big_little biod borealis_host cfm_enabled_device cheets clear_fast_ink_buffer compupdates diagnostics disable_background_blur disable_cros_video_decoder disable_explicit_dma_fences disable_flash_hw_video_decode disable_instant_tethering disable_yuv420_biplanar dlc drm_atomic edge_touch_filtering enable_heuristic_palm_detection_filter enable_neural_palm_detection_filter force_breakpad gpu_sandbox_allow_sysv_shm gpu_sandbox_failures_not_fatal gpu_sandbox_start_early houdini houdini64 kvm_guest kvm_host kvm_transition lacros legacy_keyboard legacy_power_button moblab native_gpu_memory_buffers natural_scroll_default ndk_translation ndk_translation64 neon ondevice_handwriting ondevice_handwriting_dlc oobe_skip_postlogin oobe_skip_to_login opengles passive_event_listeners pita pita-camera pita-microphone rialto scheduler_configuration_performance screenshare_sw_codec shelf-hotseat smartdim tablet_form_factor touch_centric_device touchscreen_wakeup touchview tpm_fallback video_capture_use_gpu_memory_buffer virtio_gpu webui-tab-strip wilco +X cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=68fc44eb80a0a4ca45f6dcc1244490dd
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r8 b/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r8
deleted file mode 100644
index d7cb3ae..0000000
--- a/metadata/md5-cache/chromeos-base/libchromeos-use-flags-1-r8
+++ /dev/null
@@ -1,11 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Text file listing USE flags for chromeos-base/libchromeos
-EAPI=7
-IUSE=allow_consumer_kiosk arc arc_adb_sideloading arc_force_2x_scaling arc_native_bridge_64bit_support_experiment arc_transition_m_to_n arcpp arcvm asan background_blur big_little biod cfm_enabled_device cheets compupdates disable_background_blur disable_cros_video_decoder disable_explicit_dma_fences disable_flash_hw_video_decode disable_instant_tethering disable_yuv420_biplanar drm_atomic edge_touch_filtering enable_heuristic_palm_detection_filter enable_neural_palm_detection_filter force_breakpad force_crashpad gpu_sandbox_allow_sysv_shm gpu_sandbox_failures_not_fatal gpu_sandbox_start_early houdini houdini64 kvm_guest kvm_host kvm_transition lacros legacy_keyboard legacy_power_button moblab native_gpu_memory_buffers natural_scroll_default ndk_translation ndk_translation64 neon oobe_skip_postlogin oobe_skip_to_login opengles passive_event_listeners pita pita-camera pita-microphone rialto scheduler_configuration_performance screenshare_sw_codec shelf-hotseat smartdim tablet_form_factor touch_centric_device touchscreen_wakeup touchview tpm_fallback video_capture_use_gpu_memory_buffer virtio_gpu webui-tab-strip wilco +X cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1ce583eca336e4520da905bbc0301221
diff --git a/metadata/md5-cache/chromeos-base/libchromeos-use-flags-9999 b/metadata/md5-cache/chromeos-base/libchromeos-use-flags-9999
index 6668d3d..256d817 100644
--- a/metadata/md5-cache/chromeos-base/libchromeos-use-flags-9999
+++ b/metadata/md5-cache/chromeos-base/libchromeos-use-flags-9999
@@ -2,10 +2,10 @@
 DEFINED_PHASES=info install setup unpack
 DESCRIPTION=Text file listing USE flags for chromeos-base/libchromeos
 EAPI=7
-IUSE=allow_consumer_kiosk arc arc_adb_sideloading arc_force_2x_scaling arc_native_bridge_64bit_support_experiment arc_transition_m_to_n arcpp arcvm asan background_blur big_little biod cfm_enabled_device cheets compupdates disable_background_blur disable_cros_video_decoder disable_explicit_dma_fences disable_flash_hw_video_decode disable_instant_tethering disable_yuv420_biplanar drm_atomic edge_touch_filtering enable_heuristic_palm_detection_filter enable_neural_palm_detection_filter force_breakpad force_crashpad gpu_sandbox_allow_sysv_shm gpu_sandbox_failures_not_fatal gpu_sandbox_start_early houdini houdini64 kvm_guest kvm_host kvm_transition lacros legacy_keyboard legacy_power_button moblab native_gpu_memory_buffers natural_scroll_default ndk_translation ndk_translation64 neon oobe_skip_postlogin oobe_skip_to_login opengles passive_event_listeners pita pita-camera pita-microphone rialto scheduler_configuration_performance screenshare_sw_codec shelf-hotseat smartdim tablet_form_factor touch_centric_device touchscreen_wakeup touchview tpm_fallback video_capture_use_gpu_memory_buffer virtio_gpu webui-tab-strip wilco +X cros_host cros_workon_tree_
+IUSE=allow_consumer_kiosk arc arc_adb_sideloading arc_force_2x_scaling arc_native_bridge_64bit_support_experiment arc_transition_m_to_n arcpp arcvm asan background_blur big_little biod borealis_host cfm_enabled_device cheets clear_fast_ink_buffer compupdates diagnostics disable_background_blur disable_cros_video_decoder disable_explicit_dma_fences disable_flash_hw_video_decode disable_instant_tethering disable_yuv420_biplanar dlc drm_atomic edge_touch_filtering enable_heuristic_palm_detection_filter enable_neural_palm_detection_filter force_breakpad gpu_sandbox_allow_sysv_shm gpu_sandbox_failures_not_fatal gpu_sandbox_start_early houdini houdini64 kvm_guest kvm_host kvm_transition lacros legacy_keyboard legacy_power_button moblab native_gpu_memory_buffers natural_scroll_default ndk_translation ndk_translation64 neon ondevice_handwriting ondevice_handwriting_dlc oobe_skip_postlogin oobe_skip_to_login opengles passive_event_listeners pita pita-camera pita-microphone rialto scheduler_configuration_performance screenshare_sw_codec shelf-hotseat smartdim tablet_form_factor touch_centric_device touchscreen_wakeup touchview tpm_fallback video_capture_use_gpu_memory_buffer virtio_gpu webui-tab-strip wilco +X cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=36ce01e3111550a4ee414fbe1f2c3c17
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5dad2e4a08276e2b934551bd749b4250
diff --git a/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1496 b/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1496
deleted file mode 100644
index 133c979..0000000
--- a/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1496
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/minijail:= device-mapper? ( sys-fs/lvm2:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Library to run jailed containers on Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libcontainer/
-IUSE=+device-mapper cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= device-mapper? ( sys-fs/lvm2:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r1496
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=1db6c5e21e29fc0534f4226658413bdf
diff --git a/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1518 b/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1518
new file mode 100644
index 0000000..9b601e4
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libcontainer-0.0.1-r1518
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/minijail:= device-mapper? ( sys-fs/lvm2:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Library to run jailed containers on Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libcontainer/
+IUSE=+device-mapper cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_04a8a0274b23f4bbf01eb2645630f252331db474_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_04a8a0274b23f4bbf01eb2645630f252331db474_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= device-mapper? ( sys-fs/lvm2:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r1518
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=247ec40246eaec7cec1eb98347bed912
diff --git a/metadata/md5-cache/chromeos-base/libcontainer-9999 b/metadata/md5-cache/chromeos-base/libcontainer-9999
index 25b3845..e3c8020 100644
--- a/metadata/md5-cache/chromeos-base/libcontainer-9999
+++ b/metadata/md5-cache/chromeos-base/libcontainer-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/minijail:= device-mapper? ( sys-fs/lvm2:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=9cb1ac9242c8a0449c98b0b5becb711d
diff --git a/metadata/md5-cache/chromeos-base/libevdev-0.0.1-r78 b/metadata/md5-cache/chromeos-base/libevdev-0.0.1-r78
index 8f48fde..ce49dab 100644
--- a/metadata/md5-cache/chromeos-base/libevdev-0.0.1-r78
+++ b/metadata/md5-cache/chromeos-base/libevdev-0.0.1-r78
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0.0.1-r78
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d54797d6934f226e288a584bbcf87286
diff --git a/metadata/md5-cache/chromeos-base/libevdev-9999 b/metadata/md5-cache/chromeos-base/libevdev-9999
index 431104d..47b5e33 100644
--- a/metadata/md5-cache/chromeos-base/libevdev-9999
+++ b/metadata/md5-cache/chromeos-base/libevdev-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6873c568b03a3c32fc7e0bd06d025627
diff --git a/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r102 b/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r102
deleted file mode 100644
index 6a886af..0000000
--- a/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r102
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/openssl:0= !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Crypto and utility functions used in TPM related daemons.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libhwsec/
-IUSE=test tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/openssl:0= !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r102
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7bf00bb89fec58d4ed2f9444e8e2bfc6
diff --git a/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r125 b/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r125
new file mode 100644
index 0000000..ba9d424
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libhwsec-0.0.1-r125
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/openssl:0= !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Crypto and utility functions used in TPM related daemons.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libhwsec/
+IUSE=test tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/openssl:0= !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r125
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b20f67cd0ff0619756c7c9b40dcdf606
diff --git a/metadata/md5-cache/chromeos-base/libhwsec-9999 b/metadata/md5-cache/chromeos-base/libhwsec-9999
index 85daa55..7fc1f94 100644
--- a/metadata/md5-cache/chromeos-base/libhwsec-9999
+++ b/metadata/md5-cache/chromeos-base/libhwsec-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/openssl:0= !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1b55f550c799842ff7f97795266d18c9
diff --git a/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r1 b/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r1
deleted file mode 100644
index 470fee1..0000000
--- a/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS sensor HAL IPC util.
-EAPI=7
-IUSE=cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64455de380955ba3a69acb54454954dc3c000a97_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_64455de380955ba3a69acb54454954dc3c000a97_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9e2831aca56de205ce940c29ea9a908f
diff --git a/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r37 b/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r37
new file mode 100644
index 0000000..099f886
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libiioservice_ipc-0.0.1-r37
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS sensor HAL IPC util.
+EAPI=7
+IUSE=cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7065eafeda4efefbd047454930df0bd2a581bba7_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7065eafeda4efefbd047454930df0bd2a581bba7_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r37
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8657f49b0bbeb588569e18e23a41b8eb
diff --git a/metadata/md5-cache/chromeos-base/libiioservice_ipc-9999 b/metadata/md5-cache/chromeos-base/libiioservice_ipc-9999
index d3a92bb..15cac42 100644
--- a/metadata/md5-cache/chromeos-base/libiioservice_ipc-9999
+++ b/metadata/md5-cache/chromeos-base/libiioservice_ipc-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=07d8a59e15159a40f26b20ee43c42f1c
diff --git a/metadata/md5-cache/chromeos-base/libipp-0.0.1-r104 b/metadata/md5-cache/chromeos-base/libipp-0.0.1-r104
new file mode 100644
index 0000000..de5d0d22
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libipp-0.0.1-r104
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=The library for building and parsing IPP (Internet Printing Protocol) frames.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libipp/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7578de769de579ec7f934e22698468366fdc76ea_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7578de769de579ec7f934e22698468366fdc76ea_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r104
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b9719e6723e598f3b54b3f4aa6c91a6c
diff --git a/metadata/md5-cache/chromeos-base/libipp-0.0.1-r84 b/metadata/md5-cache/chromeos-base/libipp-0.0.1-r84
deleted file mode 100644
index 12db9e4..0000000
--- a/metadata/md5-cache/chromeos-base/libipp-0.0.1-r84
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=The library for building and parsing IPP (Internet Printing Protocol) frames.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libipp/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b654a149fdaa0d4247aa8a7dd6432cfd4845a089_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b654a149fdaa0d4247aa8a7dd6432cfd4845a089_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r84
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=902eb88dd3cfb64eb79a3de72b7316ce
diff --git a/metadata/md5-cache/chromeos-base/libipp-9999 b/metadata/md5-cache/chromeos-base/libipp-9999
index 5567d90..7bd6d5e 100644
--- a/metadata/md5-cache/chromeos-base/libipp-9999
+++ b/metadata/md5-cache/chromeos-base/libipp-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ed10ee522e9d803f424361a92ca2fd49
diff --git a/metadata/md5-cache/chromeos-base/libmems-0.0.1-r104 b/metadata/md5-cache/chromeos-base/libmems-0.0.1-r104
deleted file mode 100644
index e7e9a75..0000000
--- a/metadata/md5-cache/chromeos-base/libmems-0.0.1-r104
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=net-libs/libiio:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=MEMS support library for Chromium OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libmems
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_35209d034fbd2e33442b08fbe02ec0d600922a35_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_35209d034fbd2e33442b08fbe02ec0d600922a35_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r104
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=529a1fa1c991a4dde88262f78dd7ce06
diff --git a/metadata/md5-cache/chromeos-base/libmems-0.0.1-r127 b/metadata/md5-cache/chromeos-base/libmems-0.0.1-r127
new file mode 100644
index 0000000..2fb9076
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libmems-0.0.1-r127
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=net-libs/libiio:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=MEMS support library for Chromium OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libmems
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_5868de62b85f7f824439fd5ba0fbee2418a2783c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_5868de62b85f7f824439fd5ba0fbee2418a2783c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r127
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=35739de80956cfd848e30c45108c2579
diff --git a/metadata/md5-cache/chromeos-base/libmems-9999 b/metadata/md5-cache/chromeos-base/libmems-9999
index be87058..d83f888 100644
--- a/metadata/md5-cache/chromeos-base/libmems-9999
+++ b/metadata/md5-cache/chromeos-base/libmems-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ca04e59bee91b9859d9a0ff5208802e5
diff --git a/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r373 b/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r373
deleted file mode 100644
index adc4248..0000000
--- a/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r373
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=sys-apps/keyutils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library for storing and retrieving user password
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libpasswordprovider
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-apps/keyutils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r373
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=06b6bd02b9ad988a67302ced9a444d9b
diff --git a/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r393 b/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r393
new file mode 100644
index 0000000..0ee2b73
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libpasswordprovider-0.0.1-r393
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=sys-apps/keyutils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library for storing and retrieving user password
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libpasswordprovider
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-apps/keyutils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r393
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=614229ef460343baec6a1335d973bfc8
diff --git a/metadata/md5-cache/chromeos-base/libpasswordprovider-9999 b/metadata/md5-cache/chromeos-base/libpasswordprovider-9999
index b843f9d..ecd7dca 100644
--- a/metadata/md5-cache/chromeos-base/libpasswordprovider-9999
+++ b/metadata/md5-cache/chromeos-base/libpasswordprovider-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=sys-apps/keyutils:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f82fb4c8f5dcc6b6270c3d41483b0478
diff --git a/metadata/md5-cache/chromeos-base/libscrypt-1.1.6-r18 b/metadata/md5-cache/chromeos-base/libscrypt-1.1.6-r18
index 786cff9..6738c2a 100644
--- a/metadata/md5-cache/chromeos-base/libscrypt-1.1.6-r18
+++ b/metadata/md5-cache/chromeos-base/libscrypt-1.1.6-r18
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/openssl:0=
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=58e5555b213fb4ce616b63dfe360967b
diff --git a/metadata/md5-cache/chromeos-base/libscrypt-9999 b/metadata/md5-cache/chromeos-base/libscrypt-9999
index 5798cf6..cb15e8f 100644
--- a/metadata/md5-cache/chromeos-base/libscrypt-9999
+++ b/metadata/md5-cache/chromeos-base/libscrypt-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/openssl:0=
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=21a6216e0d1e56282e795988a3ebc5b8
diff --git a/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r203 b/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r203
deleted file mode 100644
index b1cad30..0000000
--- a/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r203
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Encrypts/Decrypts data to a serialized proto with TPM sealed key.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libtpmcrypto/
-IUSE=tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0.0.1-r203
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2dff474c11645f96d908e87e1305252e
diff --git a/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r233 b/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r233
new file mode 100644
index 0000000..3c4bbe0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libtpmcrypto-0.0.1-r233
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Encrypts/Decrypts data to a serialized proto with TPM sealed key.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libtpmcrypto/
+IUSE=tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0.0.1-r233
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=336e4a43c52645f75d56746b858209a8
diff --git a/metadata/md5-cache/chromeos-base/libtpmcrypto-9999 b/metadata/md5-cache/chromeos-base/libtpmcrypto-9999
index a45ebcf..04f8cfc 100644
--- a/metadata/md5-cache/chromeos-base/libtpmcrypto-9999
+++ b/metadata/md5-cache/chromeos-base/libtpmcrypto-9999
@@ -11,5 +11,5 @@
 RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3340d7be0a182b0b70559a228501b705
diff --git a/metadata/md5-cache/chromeos-base/libva-fake-driver-0.0.1-r1 b/metadata/md5-cache/chromeos-base/libva-fake-driver-0.0.1-r1
index f7763f1..382f7d9 100644
--- a/metadata/md5-cache/chromeos-base/libva-fake-driver-0.0.1-r1
+++ b/metadata/md5-cache/chromeos-base/libva-fake-driver-0.0.1-r1
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=>=x11-libs/libva-2.6.0:=
 SLOT=0/0.0.1-r1
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1e4aaee393e3bdf9546f67c2ebe156a4
diff --git a/metadata/md5-cache/chromeos-base/libva-fake-driver-9999 b/metadata/md5-cache/chromeos-base/libva-fake-driver-9999
index c066f8a..834b38b 100644
--- a/metadata/md5-cache/chromeos-base/libva-fake-driver-9999
+++ b/metadata/md5-cache/chromeos-base/libva-fake-driver-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=>=x11-libs/libva-2.6.0:=
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6f0f1c9f9a6e6717f317fb135242788f
diff --git a/metadata/md5-cache/chromeos-base/libvda-0.0.1-r133 b/metadata/md5-cache/chromeos-base/libvda-0.0.1-r133
deleted file mode 100644
index 11d6bdd..0000000
--- a/metadata/md5-cache/chromeos-base/libvda-0.0.1-r133
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/minigbm:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=libvda CrOS video decoding library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda
-IUSE=libvda_test cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r133
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7bce557e6a4caf665d93c4e40ac29c58
diff --git a/metadata/md5-cache/chromeos-base/libvda-0.0.1-r165 b/metadata/md5-cache/chromeos-base/libvda-0.0.1-r165
new file mode 100644
index 0000000..c0b91c4
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libvda-0.0.1-r165
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/minigbm:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=libvda CrOS video decoding library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda
+IUSE=libvda_test cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_433eef54293bcbe2988b454dec66c28c1f4e0729_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_433eef54293bcbe2988b454dec66c28c1f4e0729_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r165
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=731c5e5f52e5c5612369be5edaeb1080
diff --git a/metadata/md5-cache/chromeos-base/libvda-9999 b/metadata/md5-cache/chromeos-base/libvda-9999
index 3fae0fe..3f0433d 100644
--- a/metadata/md5-cache/chromeos-base/libvda-9999
+++ b/metadata/md5-cache/chromeos-base/libvda-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=695cc5b942434723f506fa14351e2e31
diff --git a/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r127 b/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r127
deleted file mode 100644
index 9c68e39..0000000
--- a/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r127
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:= media-libs/minigbm:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=libvda Chrome GPU tests
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b49c022caa151c2db73b29cb67c3d0dcc2ff9fc6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:= media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d535dd17660f77a12dd9b84f5106bd52
diff --git a/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r159 b/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r159
new file mode 100644
index 0000000..5a37c57
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libvda-gpu-tests-0.0.1-r159
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:= media-libs/minigbm:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=libvda Chrome GPU tests
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_433eef54293bcbe2988b454dec66c28c1f4e0729_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_433eef54293bcbe2988b454dec66c28c1f4e0729_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:= media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=24d1d1128bafc4948952798e4e35a1c0
diff --git a/metadata/md5-cache/chromeos-base/libvda-gpu-tests-9999 b/metadata/md5-cache/chromeos-base/libvda-gpu-tests-9999
index 5e59ef29..6f18a42 100644
--- a/metadata/md5-cache/chromeos-base/libvda-gpu-tests-9999
+++ b/metadata/md5-cache/chromeos-base/libvda-gpu-tests-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libbrillo:= media-libs/minigbm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7966c4b2769263fbe54c35ae8e95a351
diff --git a/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1221 b/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1221
deleted file mode 100644
index d22e0c7..0000000
--- a/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1221
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Weave device library
-EAPI=7
-HOMEPAGE=http://dev.chromium.org/chromium-os/platform
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_207a66b6ccdc5ba610c7117e3e6d9e4e405c9b6c cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_207a66b6ccdc5ba610c7117e3e6d9e4e405c9b6c cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1221
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=160fc4b4bf4507b441c3dc40a35cc0a4
diff --git a/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1242 b/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1242
new file mode 100644
index 0000000..e7980ae
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/libweave-0.0.1-r1242
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Weave device library
+EAPI=7
+HOMEPAGE=http://dev.chromium.org/chromium-os/platform
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_8576934c3924df022fce02458202425281e907e5 cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_8576934c3924df022fce02458202425281e907e5 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1242
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3633bd168f2fdf33cf43e384de113755
diff --git a/metadata/md5-cache/chromeos-base/libweave-9999 b/metadata/md5-cache/chromeos-base/libweave-9999
index 9df7cac..dced434 100644
--- a/metadata/md5-cache/chromeos-base/libweave-9999
+++ b/metadata/md5-cache/chromeos-base/libweave-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=22ab9899bcc8dfc9b3e020d2a20c46e5
diff --git a/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2859 b/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2859
deleted file mode 100644
index e395ca2..0000000
--- a/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2859
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= media-libs/libpng:= media-gfx/sane-backends:= chromeos-base/permission_broker-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Document Scanning service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/lorgnette/
-IUSE=test cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_ab80a5a8747b83e4edf76534117751700f049a33_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_ab80a5a8747b83e4edf76534117751700f049a33_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= media-libs/libpng:= media-gfx/sane-backends:= chromeos-base/minijail media-gfx/sane-airscan test? ( media-gfx/perceptualdiff:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2859
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=bec5cbfff51ab83fda6699746abce9e0
diff --git a/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2922 b/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2922
new file mode 100644
index 0000000..b79ce03
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/lorgnette-0.0.1-r2922
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= media-libs/libpng:= media-gfx/sane-backends:= virtual/libusb:1 chromeos-base/permission_broker-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Document Scanning service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/lorgnette/
+IUSE=test cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_73984411d59b75ad6e62de0bc867406844e7bd67_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_73984411d59b75ad6e62de0bc867406844e7bd67_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= media-libs/libpng:= media-gfx/sane-backends:= virtual/libusb:1 chromeos-base/minijail media-gfx/sane-airscan test? ( media-gfx/perceptualdiff:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r2922
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=2f992efa5acf57d73368ba14585cc4f8
diff --git a/metadata/md5-cache/chromeos-base/lorgnette-9999 b/metadata/md5-cache/chromeos-base/lorgnette-9999
index 0cadc53..85d363a 100644
--- a/metadata/md5-cache/chromeos-base/lorgnette-9999
+++ b/metadata/md5-cache/chromeos-base/lorgnette-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= media-libs/libpng:= media-gfx/sane-backends:= chromeos-base/permission_broker-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= media-libs/libpng:= media-gfx/sane-backends:= virtual/libusb:1 chromeos-base/permission_broker-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Document Scanning service for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/lorgnette/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= media-libs/libpng:= media-gfx/sane-backends:= chromeos-base/minijail media-gfx/sane-airscan test? ( media-gfx/perceptualdiff:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= media-libs/libpng:= media-gfx/sane-backends:= virtual/libusb:1 chromeos-base/minijail media-gfx/sane-airscan test? ( media-gfx/perceptualdiff:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=7e55d540b389e81167ed0b3ba66b2dec
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=3866a3374382a4d6f8449bd0c6f353ae
diff --git a/metadata/md5-cache/chromeos-base/lorgnette_cli-0.0.1-r51 b/metadata/md5-cache/chromeos-base/lorgnette_cli-0.0.1-r51
new file mode 100644
index 0000000..9f2fb86
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/lorgnette_cli-0.0.1-r51
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Command line interface to scanning service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/lorgnette
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_73984411d59b75ad6e62de0bc867406844e7bd67_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_73984411d59b75ad6e62de0bc867406844e7bd67_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/lorgnette >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7477305eacc5ce62887096a651732fd2
diff --git a/metadata/md5-cache/chromeos-base/lorgnette_cli-9999 b/metadata/md5-cache/chromeos-base/lorgnette_cli-9999
new file mode 100644
index 0000000..83ad103
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/lorgnette_cli-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Command line interface to scanning service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/lorgnette
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/lorgnette >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5c86acfc6c3e7b65c94cd7aac9a56fee
diff --git a/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r47 b/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r47
deleted file mode 100644
index dd80c65..0000000
--- a/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r47
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Multicast forwarder daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-mcastd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r47
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=155631fc0443d70a68098ee0c43eea3d
diff --git a/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r98 b/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r98
new file mode 100644
index 0000000..e341f46
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mcastd-0.0.1-r98
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Multicast forwarder daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-mcastd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r98
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=784c4d9a7097fc0cb0f27b1b5f4522f4
diff --git a/metadata/md5-cache/chromeos-base/mcastd-9999 b/metadata/md5-cache/chromeos-base/mcastd-9999
index 2d17e1a..bf076cd 100644
--- a/metadata/md5-cache/chromeos-base/mcastd-9999
+++ b/metadata/md5-cache/chromeos-base/mcastd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-mcastd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6fc64c064f96516dc11103e981b53f46
diff --git a/metadata/md5-cache/chromeos-base/memd-0.1.0-r55 b/metadata/md5-cache/chromeos-base/memd-0.1.0-r55
deleted file mode 100644
index aba91a8..0000000
--- a/metadata/md5-cache/chromeos-base/memd-0.1.0-r55
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= sys-apps/dbus:= ~dev-rust/chrono-0.4.2:= ~dev-rust/dbus-0.6.1:= =dev-rust/env_logger-0.6*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 ~dev-rust/log-0.4.5:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 ~dev-rust/syslog-4.0.0:= ~dev-rust/time-0.1.40:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Fine-grain memory metrics collector
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/
-IUSE=+seccomp cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_9ecbfbf065afc0fe58e76896e9016295f97e36cb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r55
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=86592f0e72321a757475b8505320dbba
diff --git a/metadata/md5-cache/chromeos-base/memd-0.1.0-r57 b/metadata/md5-cache/chromeos-base/memd-0.1.0-r57
new file mode 100644
index 0000000..57175d9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/memd-0.1.0-r57
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=chromeos-base/system_api:= sys-apps/dbus:= ~dev-rust/chrono-0.4.2:= ~dev-rust/dbus-0.6.1:= =dev-rust/env_logger-0.6*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 ~dev-rust/log-0.4.5:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 ~dev-rust/syslog-4.0.1:= ~dev-rust/time-0.1.40:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Fine-grain memory metrics collector
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/
+IUSE=+seccomp cros_host cros_workon_tree_9ecbfbf065afc0fe58e76896e9016295f97e36cb cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r57
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7d02b208a6af71712b68d15e39efa966
diff --git a/metadata/md5-cache/chromeos-base/memd-9999 b/metadata/md5-cache/chromeos-base/memd-9999
index 1e57ac1..650c834 100644
--- a/metadata/md5-cache/chromeos-base/memd-9999
+++ b/metadata/md5-cache/chromeos-base/memd-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= sys-apps/dbus:= ~dev-rust/chrono-0.4.2:= ~dev-rust/dbus-0.6.1:= =dev-rust/env_logger-0.6*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 ~dev-rust/log-0.4.5:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 ~dev-rust/syslog-4.0.0:= ~dev-rust/time-0.1.40:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
+DEPEND=chromeos-base/system_api:= sys-apps/dbus:= ~dev-rust/chrono-0.4.2:= ~dev-rust/dbus-0.6.1:= =dev-rust/env_logger-0.6*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 ~dev-rust/log-0.4.5:= >=dev-rust/protobuf-2.8:= !>=dev-rust/protobuf-3 >=dev-rust/protoc-rust-2.8:= !>=dev-rust/protoc-rust-3 ~dev-rust/syslog-4.0.1:= ~dev-rust/time-0.1.40:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Fine-grain memory metrics collector
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/metrics/memd/
-IUSE=+seccomp cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan cros_host cros_workon_tree_
+IUSE=+seccomp cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f148270ce2896c167333f91295fea8f2
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=80d1f0e96c36fa470c4bf6b18812988b
diff --git a/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r123 b/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r123
deleted file mode 100644
index 3df5fb3..0000000
--- a/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r123
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libmems:= net-libs/libiio:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=MEMS Setup for Chromium OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mems_setup
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_db49e6090983c78aaaea558e0aede1a93db976be_35209d034fbd2e33442b08fbe02ec0d600922a35_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_db49e6090983c78aaaea558e0aede1a93db976be_35209d034fbd2e33442b08fbe02ec0d600922a35_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libmems:= net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r123
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=489c3b50a9c8bfbb30d1dd2ab6f0f6eb
diff --git a/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r152 b/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r152
new file mode 100644
index 0000000..632b95f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mems_setup-0.0.1-r152
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libmems:= net-libs/libiio:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=MEMS Setup for Chromium OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mems_setup
+IUSE=iioservice cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7a3b0f33cf5f55b2fcc209bd97b1fc4ebee3bbb0_5868de62b85f7f824439fd5ba0fbee2418a2783c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7a3b0f33cf5f55b2fcc209bd97b1fc4ebee3bbb0_5868de62b85f7f824439fd5ba0fbee2418a2783c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libmems:= net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r152
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b4df59e72262a25566e1cc2060dfba45
diff --git a/metadata/md5-cache/chromeos-base/mems_setup-9999 b/metadata/md5-cache/chromeos-base/mems_setup-9999
index fd0a674..1e38248 100644
--- a/metadata/md5-cache/chromeos-base/mems_setup-9999
+++ b/metadata/md5-cache/chromeos-base/mems_setup-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=MEMS Setup for Chromium OS.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mems_setup
-IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=iioservice cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=chromeos-base/libmems:= net-libs/libiio:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c9afcf3b24af0ad7feb5cd234de94d6
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ff2de2b88fbb81f9b71c0e0e1760d19e
diff --git a/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3136 b/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3136
deleted file mode 100644
index 859cf02..0000000
--- a/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3136
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/dbus-glib:= dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Metrics aggregation service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/metrics/
-IUSE=fuzzer metrics_uploader +passive_metrics systemd cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/dbus-glib:= dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r3136
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=09d45c28fbd7b4aa50e366689fa93242
diff --git a/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3170 b/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3170
new file mode 100644
index 0000000..ae07a79
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/metrics-0.0.1-r3170
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Metrics aggregation service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/metrics/
+IUSE=fuzzer metrics_uploader +passive_metrics systemd cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r3170
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=e5519e0a014bd4d3a73ba42265d4df5d
diff --git a/metadata/md5-cache/chromeos-base/metrics-9999 b/metadata/md5-cache/chromeos-base/metrics-9999
index ebce1ca..8ee8f10 100644
--- a/metadata/md5-cache/chromeos-base/metrics-9999
+++ b/metadata/md5-cache/chromeos-base/metrics-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/dbus-glib:= dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Metrics aggregation service for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/metrics/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=dev-libs/dbus-glib:= dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=dev-libs/libpcre:= dev-libs/protobuf:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=d7c45a19773dc4e83a1fcfe88c4c0eae
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=0440134c1fa8440484db1dfe47707c42
diff --git a/metadata/md5-cache/chromeos-base/midis-0.0.1-r1078 b/metadata/md5-cache/chromeos-base/midis-0.0.1-r1078
deleted file mode 100644
index 1e39d31..0000000
--- a/metadata/md5-cache/chromeos-base/midis-0.0.1-r1078
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=media-libs/alsa-lib:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=MIDI Server for Chromium OS
-EAPI=7
-IUSE=+seccomp asan fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_64d1d51038bce9e10952cbfcac9be688ead19e29_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_64d1d51038bce9e10952cbfcac9be688ead19e29_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/alsa-lib:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r1078
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=744ec5fd0313035e4209fad7b4aba12e
diff --git a/metadata/md5-cache/chromeos-base/midis-0.0.1-r1101 b/metadata/md5-cache/chromeos-base/midis-0.0.1-r1101
new file mode 100644
index 0000000..7345f3f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/midis-0.0.1-r1101
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=media-libs/alsa-lib:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=MIDI Server for Chromium OS
+EAPI=7
+IUSE=+seccomp asan fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3a6f1fe5ddd1f4fef3328752754d6b3d0f3bde10_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3a6f1fe5ddd1f4fef3328752754d6b3d0f3bde10_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/alsa-lib:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r1101
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=e0cd472367ca1d2ca2980369e82d39e1
diff --git a/metadata/md5-cache/chromeos-base/midis-9999 b/metadata/md5-cache/chromeos-base/midis-9999
index d97c0f8..e338064 100644
--- a/metadata/md5-cache/chromeos-base/midis-9999
+++ b/metadata/md5-cache/chromeos-base/midis-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/alsa-lib:= chromeos-base/libbrillo:=[asan?,fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=16cd3dd60eb7c01cd811e61aace24404
diff --git a/metadata/md5-cache/chromeos-base/minijail-14-r8 b/metadata/md5-cache/chromeos-base/minijail-14-r8
deleted file mode 100644
index c42d7ca..0000000
--- a/metadata/md5-cache/chromeos-base/minijail-14-r8
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1 cros_host? ( python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] ) test? ( dev-cpp/gtest:= )
-DESCRIPTION=helper binary and library for sandboxing & restricting privs of services
-EAPI=7
-HOMEPAGE=https://android.googlesource.com/platform/external/minijail
-IUSE=asan cros-debug +seccomp test cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_52499e0eb2a6d3eaac83231e956caf2c68f564aa python_targets_python3_6 python_targets_python3_7 python_single_target_python3_6 python_single_target_python3_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1
-SLOT=0/14-r8
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=abf52bdc6496bb0db9e2eb5e24aca381
diff --git a/metadata/md5-cache/chromeos-base/minijail-14-r9 b/metadata/md5-cache/chromeos-base/minijail-14-r9
new file mode 100644
index 0000000..90d655e
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/minijail-14-r9
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1 cros_host? ( python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_6? ( dev-python/setuptools[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/setuptools[python_targets_python3_7(-)] ) ) test? ( dev-cpp/gtest:= )
+DESCRIPTION=helper binary and library for sandboxing & restricting privs of services
+EAPI=7
+HOMEPAGE=https://android.googlesource.com/platform/external/minijail
+IUSE=asan cros-debug +seccomp test cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_52499e0eb2a6d3eaac83231e956caf2c68f564aa python_single_target_python3_6 python_single_target_python3_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1
+SLOT=0/14-r9
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=69d3c6be6616d6927860bfdd400b51fa
diff --git a/metadata/md5-cache/chromeos-base/minijail-9999 b/metadata/md5-cache/chromeos-base/minijail-9999
index d38d0d3..1c41952 100644
--- a/metadata/md5-cache/chromeos-base/minijail-9999
+++ b/metadata/md5-cache/chromeos-base/minijail-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1 cros_host? ( python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] ) test? ( dev-cpp/gtest:= )
+DEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1 cros_host? ( python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_6? ( dev-python/setuptools[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/setuptools[python_targets_python3_7(-)] ) ) test? ( dev-cpp/gtest:= )
 DESCRIPTION=helper binary and library for sandboxing & restricting privs of services
 EAPI=7
 HOMEPAGE=https://android.googlesource.com/platform/external/minijail
-IUSE=asan cros-debug +seccomp test cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=asan cros-debug +seccomp test cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 RDEPEND=sys-libs/libcap:= !<chromeos-base/chromeos-minijail-1
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=65dc4405daa9e02daad1a9b638fdc590
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f9d0c968bb6b7021d9126fead04c981c
diff --git a/metadata/md5-cache/chromeos-base/mist-0.0.1-r2972 b/metadata/md5-cache/chromeos-base/mist-0.0.1-r2972
deleted file mode 100644
index bac9287..0000000
--- a/metadata/md5-cache/chromeos-base/mist-0.0.1-r2972
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:=[udev] chromeos-base/metrics dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
-DESCRIPTION=Chromium OS Modem Interface Switching Tool
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mist/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_9ef32eb58f117f5abf6270c6a7427e260d555040_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_9ef32eb58f117f5abf6270c6a7427e260d555040_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:=[udev] chromeos-base/metrics dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=85bf11c9577d0e8b30066592e90591c3
diff --git a/metadata/md5-cache/chromeos-base/mist-0.0.1-r3007 b/metadata/md5-cache/chromeos-base/mist-0.0.1-r3007
new file mode 100644
index 0000000..39d121c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mist-0.0.1-r3007
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:=[udev] >=chromeos-base/metrics-0.0.1-r3152 dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
+DESCRIPTION=Chromium OS Modem Interface Switching Tool
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mist/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_ccdaebbb41bf6e93cb1bba09429832ab22486732_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_ccdaebbb41bf6e93cb1bba09429832ab22486732_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:=[udev] >=chromeos-base/metrics-0.0.1-r3152 dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=6b8bcdd0145ffe854c985acf40f000bd
diff --git a/metadata/md5-cache/chromeos-base/mist-9999 b/metadata/md5-cache/chromeos-base/mist-9999
index 35257c4..c7a2c9c 100644
--- a/metadata/md5-cache/chromeos-base/mist-9999
+++ b/metadata/md5-cache/chromeos-base/mist-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:=[udev] chromeos-base/metrics dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
+DEPEND=chromeos-base/libbrillo:=[udev] >=chromeos-base/metrics-0.0.1-r3152 dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
 DESCRIPTION=Chromium OS Modem Interface Switching Tool
 EAPI=6
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mist/
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:=[udev] chromeos-base/metrics dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=chromeos-base/libbrillo:=[udev] >=chromeos-base/metrics-0.0.1-r3152 dev-libs/protobuf:= net-dialup/ppp virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=e0044c9bae501b715d0bfdaeb4eb66af
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=a65d88a76373a62dbeb08ddbed469ca0
diff --git a/metadata/md5-cache/chromeos-base/ml-0.0.1-r324 b/metadata/md5-cache/chromeos-base/ml-0.0.1-r324
deleted file mode 100644
index 08196eb..0000000
--- a/metadata/md5-cache/chromeos-base/ml-0.0.1-r324
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/chrome-icu:= chromeos-base/libbrillo:= chromeos-base/metrics:= nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= chromeos-base/system_api:=[fuzzer?] dev-cpp/absl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Machine learning service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
-IUSE=fuzzer nnapi ondevice_handwriting cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_49804038485c0749f93e123372c4c10bc57db006_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_49804038485c0749f93e123372c4c10bc57db006_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chrome-icu:= chromeos-base/libbrillo:= chromeos-base/metrics:= nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r324
-SRC_URI=gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v706.fb
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=81e3aeca43fbc936258c3f89d126757b
diff --git a/metadata/md5-cache/chromeos-base/ml-0.0.1-r364 b/metadata/md5-cache/chromeos-base/ml-0.0.1-r364
new file mode 100644
index 0000000..6097f1a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ml-0.0.1-r364
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= ondevice_speech? ( chromeos-base/libsoda:= ) nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= chromeos-base/system_api:=[fuzzer?] dev-cpp/absl:= dev-libs/libutf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Machine learning service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
+IUSE=fuzzer nnapi ondevice_handwriting ondevice_handwriting_dlc ondevice_speech cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe2824c52ff947a4e8ddbb5f43955fec773daa3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe2824c52ff947a4e8ddbb5f43955fec773daa3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= ondevice_speech? ( chromeos-base/libsoda:= ) nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r364
+SRC_URI=gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite gs://chromeos-localmirror/distfiles/mlservice-model-language_identification-20190924.smfb gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v711.fb
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=5ef3c357483711c85f061cea56258bf8
diff --git a/metadata/md5-cache/chromeos-base/ml-9999 b/metadata/md5-cache/chromeos-base/ml-9999
index 05fc530..ab7ac1d 100644
--- a/metadata/md5-cache/chromeos-base/ml-9999
+++ b/metadata/md5-cache/chromeos-base/ml-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/chrome-icu:= chromeos-base/libbrillo:= chromeos-base/metrics:= nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= chromeos-base/system_api:=[fuzzer?] dev-cpp/absl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= ondevice_speech? ( chromeos-base/libsoda:= ) nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= chromeos-base/system_api:=[fuzzer?] dev-cpp/absl:= dev-libs/libutf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Machine learning service for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
-IUSE=fuzzer nnapi ondevice_handwriting cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=fuzzer nnapi ondevice_handwriting ondevice_handwriting_dlc ondevice_speech cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/chrome-icu:= chromeos-base/libbrillo:= chromeos-base/metrics:= nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= ondevice_speech? ( chromeos-base/libsoda:= ) nnapi? ( chromeos-base/aosp-frameworks-ml-nn ) dev-libs/libhandwriting:=[ondevice_handwriting=,ondevice_handwriting_dlc=] dev-libs/libtextclassifier:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-SRC_URI=gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v706.fb
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=dab373b02961512f5b5dae5d56300634
+SRC_URI=gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20200206-downloadable.tflite gs://chromeos-localmirror/distfiles/mlservice-model-language_identification-20190924.smfb gs://chromeos-localmirror/distfiles/mlservice-model-test_add-20180914.tflite gs://chromeos-localmirror/distfiles/mlservice-model-search_ranker-20190923.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20181115.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190221.tflite gs://chromeos-localmirror/distfiles/mlservice-model-smart_dim-20190521-v3.tflite gs://chromeos-localmirror/distfiles/mlservice-model-top_cat-20190722.tflite gs://chromeos-localmirror/distfiles/mlservice-model-text_classifier_en-v711.fb
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=7d5434bfd1685f0684da33dfb593b32d
diff --git a/metadata/md5-cache/chromeos-base/ml-benchmark-0.0.1-r30 b/metadata/md5-cache/chromeos-base/ml-benchmark-0.0.1-r30
new file mode 100644
index 0000000..8e5c943
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ml-benchmark-0.0.1-r30
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS ML Benchmarking Suite
+EAPI=7
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1ffd1e25331328c023394a4a459ba08c7752af68_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1ffd1e25331328c023394a4a459ba08c7752af68_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r30
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2a8904d7d6a7f5718c7e8fab4efde52e
diff --git a/metadata/md5-cache/chromeos-base/ml-benchmark-9999 b/metadata/md5-cache/chromeos-base/ml-benchmark-9999
new file mode 100644
index 0000000..4751a01
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ml-benchmark-9999
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS ML Benchmarking Suite
+EAPI=7
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2c8400359acc6af58a05a4222052c0de
diff --git a/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r26 b/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r26
deleted file mode 100644
index 8d6ec70..0000000
--- a/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r26
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chrome-icu:= chromeos-base/metrics:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Command line interface to machine learning service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_49804038485c0749f93e123372c4c10bc57db006_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_49804038485c0749f93e123372c4c10bc57db006_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/chrome-icu:= chromeos-base/metrics:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0e634da83460825cae38635328ec5e42
diff --git a/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r64 b/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r64
new file mode 100644
index 0000000..0e1707a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ml-cmdline-0.0.1-r64
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Command line interface to machine learning service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe2824c52ff947a4e8ddbb5f43955fec773daa3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_fbe2824c52ff947a4e8ddbb5f43955fec773daa3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=886302b3a609ec81121e855847e61ec6
diff --git a/metadata/md5-cache/chromeos-base/ml-cmdline-9999 b/metadata/md5-cache/chromeos-base/ml-cmdline-9999
index 5165d2d..dd23404 100644
--- a/metadata/md5-cache/chromeos-base/ml-cmdline-9999
+++ b/metadata/md5-cache/chromeos-base/ml-cmdline-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chrome-icu:= chromeos-base/metrics:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Command line interface to machine learning service for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ml
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/chrome-icu:= chromeos-base/metrics:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=chromeos-base/chrome-icu:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/ml:= sci-libs/tensorflow:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5aba76dc517b71e27d5121d586d9c08d
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f2c73cb160f6914582ffb217626eca73
diff --git a/metadata/md5-cache/chromeos-base/ml-test-assets-0.0.1 b/metadata/md5-cache/chromeos-base/ml-test-assets-0.0.1
new file mode 100644
index 0000000..8c40a2c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ml-test-assets-0.0.1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=install
+DESCRIPTION=TFLite models and supporting assets used for testing ML & NNAPI.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/aosp/platform/test/mlts/models/
+IUSE=label_image benchmark_model
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=label_image? ( gs://chromeos-localmirror/distfiles/ml-test-assets-label-image-assets_20200721.tar.xz ) benchmark_model? ( gs://chromeos-localmirror/distfiles/aosp-mlts-models-7331369.tar.xz )
+_md5_=b5d1e2f4c7cae2db26f501d05826aaf6
diff --git a/metadata/md5-cache/chromeos-base/ml_benchmark-0.0.1-r3 b/metadata/md5-cache/chromeos-base/ml_benchmark-0.0.1-r3
deleted file mode 100644
index f63dcfc..0000000
--- a/metadata/md5-cache/chromeos-base/ml_benchmark-0.0.1-r3
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS ML Benchmarking Suite
-EAPI=7
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a6b68647eba93cad8f83eaddc189a4958d4922c8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a6b68647eba93cad8f83eaddc189a4958d4922c8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r3
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3b8725e166b15b1ec97666ac0db5084d
diff --git a/metadata/md5-cache/chromeos-base/ml_benchmark-9999 b/metadata/md5-cache/chromeos-base/ml_benchmark-9999
deleted file mode 100644
index b8aa123..0000000
--- a/metadata/md5-cache/chromeos-base/ml_benchmark-9999
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS ML Benchmarking Suite
-EAPI=7
-IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
-KEYWORDS=~*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2c8400359acc6af58a05a4222052c0de
diff --git a/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2799 b/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2799
deleted file mode 100644
index adb4c4f..0000000
--- a/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2799
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DEPEND=sys-apps/dbus:=
-DESCRIPTION=Chromium OS modem utilities
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/modem-utilities/
-IUSE=cros_host cros_workon_tree_8b44809749b042602e4d50ebef022ce9d02360d7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-apps/dbus:=
-SLOT=0/0.0.1-r2799
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6da7c3ca3ef2d738f66c733f4b75c746
diff --git a/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2804 b/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2804
new file mode 100644
index 0000000..337853ac
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/modem-utilities-0.0.1-r2804
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DEPEND=sys-apps/dbus:=
+DESCRIPTION=Chromium OS modem utilities
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/modem-utilities/
+IUSE=cros_host cros_workon_tree_ab52f957fb301718e36c0891fe21e2b6d3c0fc60
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/dbus:=
+SLOT=0/0.0.1-r2804
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=131c366cfa8882af299db1880e19185e
diff --git a/metadata/md5-cache/chromeos-base/modem-utilities-9999 b/metadata/md5-cache/chromeos-base/modem-utilities-9999
index cca15d0..0620488 100644
--- a/metadata/md5-cache/chromeos-base/modem-utilities-9999
+++ b/metadata/md5-cache/chromeos-base/modem-utilities-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/dbus:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4997d249ef1153cbaf4ead6563e5c531
diff --git a/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r672 b/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r672
deleted file mode 100644
index c55eae0..0000000
--- a/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r672
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-arch/xz-utils:= chromeos-base/chromeos-config:= chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= net-misc/modemmanager-next:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Modem firmware updater daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/modemfwd
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_a76919559e19831ca5286cc1fd0f9366be6fa3cb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_a76919559e19831ca5286cc1fd0f9366be6fa3cb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=app-arch/xz-utils:= chromeos-base/chromeos-config:= chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= net-misc/modemmanager-next:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=4b0f49b7d3e84e16627873c3a747f441
diff --git a/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r729 b/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r729
new file mode 100644
index 0000000..6a4ca99
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/modemfwd-0.0.1-r729
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=app-arch/xz-utils:= chromeos-base/chromeos-config:= chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= net-misc/modemmanager-next:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Modem firmware updater daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/modemfwd
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_c261b7898d3629af497138c6357ba0bab49115b7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_c261b7898d3629af497138c6357ba0bab49115b7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-arch/xz-utils:= chromeos-base/chromeos-config:= chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= net-misc/modemmanager-next:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=30c8998c62b196bfdfb81e0315767035
diff --git a/metadata/md5-cache/chromeos-base/modemfwd-9999 b/metadata/md5-cache/chromeos-base/modemfwd-9999
index 607b72b..7e7a107 100644
--- a/metadata/md5-cache/chromeos-base/modemfwd-9999
+++ b/metadata/md5-cache/chromeos-base/modemfwd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=app-arch/xz-utils:= chromeos-base/chromeos-config:= chromeos-base/chromeos-config-tools:= dev-libs/protobuf:= net-misc/modemmanager-next:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=8c95180662d4998bccf0777d7be77153
diff --git a/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r395 b/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r395
deleted file mode 100644
index 0877ccd..0000000
--- a/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r395
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Mounts the specified directory with different owner UID and GID
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/mount-passthrough
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_dc359f62190859acb79503bcc7661653dabb088f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_dc359f62190859acb79503bcc7661653dabb088f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.2-r395
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a258bf42660bd2fed173094e5450a6a2
diff --git a/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r417 b/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r417
new file mode 100644
index 0000000..31bc7bf
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mount-passthrough-0.0.2-r417
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Mounts the specified directory with different owner UID and GID
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/mount-passthrough
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a55068ee019dfa1a7caf52bfe47345ab5c15bb61_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_a55068ee019dfa1a7caf52bfe47345ab5c15bb61_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.2-r417
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fc6797183886349e724e518f1e11e1cb
diff --git a/metadata/md5-cache/chromeos-base/mount-passthrough-9999 b/metadata/md5-cache/chromeos-base/mount-passthrough-9999
index b581156..60bad54 100644
--- a/metadata/md5-cache/chromeos-base/mount-passthrough-9999
+++ b/metadata/md5-cache/chromeos-base/mount-passthrough-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ede689604538a77a2043e2e36fe18e53
diff --git a/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r205 b/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r205
deleted file mode 100644
index affb26e..0000000
--- a/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r205
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=media-sound/adhd:= >=sys-apps/dbus-1.0:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Media perception service
-EAPI=7
-IUSE=internal cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7c1fd86161f63c2f26e67281335e3fcce788f75b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7c1fd86161f63c2f26e67281335e3fcce788f75b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=media-sound/adhd:= >=sys-apps/dbus-1.0:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-RESTRICT=mirror
-SLOT=0/0.0.1-r205
-SRC_URI=internal? ( gs://chromeos-localmirror-private/distfiles/mri_package-72.0.0.tar.gz )
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=601b18ba053b6afd686f610daea79922
diff --git a/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r229 b/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r229
new file mode 100644
index 0000000..a0542f1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mri_package-0.0.1-r229
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=media-sound/adhd:= >=sys-apps/dbus-1.0:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Media perception service
+EAPI=7
+IUSE=internal cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3c23a870bdaa35b4af1c4760cd7d1129726712f4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_3c23a870bdaa35b4af1c4760cd7d1129726712f4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=media-sound/adhd:= >=sys-apps/dbus-1.0:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RESTRICT=mirror
+SLOT=0/0.0.1-r229
+SRC_URI=internal? ( gs://chromeos-localmirror-private/distfiles/mri_package-72.0.0.tar.gz )
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=34e61adb158202928290b65b4145cffa
diff --git a/metadata/md5-cache/chromeos-base/mri_package-9999 b/metadata/md5-cache/chromeos-base/mri_package-9999
index 86d7fbe..9fcf907 100644
--- a/metadata/md5-cache/chromeos-base/mri_package-9999
+++ b/metadata/md5-cache/chromeos-base/mri_package-9999
@@ -11,5 +11,5 @@
 RESTRICT=mirror
 SLOT=0/9999
 SRC_URI=internal? ( gs://chromeos-localmirror-private/distfiles/mri_package-72.0.0.tar.gz )
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=f1a28582b98f084b87e2e475b0200b1b
diff --git a/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r849 b/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r849
deleted file mode 100644
index a014dc8..0000000
--- a/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r849
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/protobuf:= media-libs/libmtp:= virtual/udev chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=MTP daemon for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mtpd
-IUSE=-asan +seccomp systemd test cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3689bf93ea5672dc8b5cf79396478051ecd7b4ff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3689bf93ea5672dc8b5cf79396478051ecd7b4ff_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= media-libs/libmtp:= virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r849
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=2f746a82a4dbd6db86423a70f9c1f4ef
diff --git a/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r871 b/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r871
new file mode 100644
index 0000000..49718b6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mtpd-0.0.1-r871
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=dev-libs/protobuf:= media-libs/libmtp:= virtual/udev chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=MTP daemon for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/mtpd
+IUSE=-asan +seccomp systemd test cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aae1a9eda9e453186a2a1ec50a5fa0c175c45a57_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aae1a9eda9e453186a2a1ec50a5fa0c175c45a57_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= media-libs/libmtp:= virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r871
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=2228a1ea85382ae9ceddad992e66830a
diff --git a/metadata/md5-cache/chromeos-base/mtpd-9999 b/metadata/md5-cache/chromeos-base/mtpd-9999
index d7d1a8c..08a586a 100644
--- a/metadata/md5-cache/chromeos-base/mtpd-9999
+++ b/metadata/md5-cache/chromeos-base/mtpd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= media-libs/libmtp:= virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=2d753eb52cf53db09d6cbd9c1a11d960
diff --git a/metadata/md5-cache/chromeos-base/mttools-0.0.1-r159 b/metadata/md5-cache/chromeos-base/mttools-0.0.1-r159
deleted file mode 100644
index 8398cef..0000000
--- a/metadata/md5-cache/chromeos-base/mttools-0.0.1-r159
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=chromeos-base/gestures app-misc/utouch-evemu chromeos-base/libevdev chromeos-base/touch_firmware_test
-DESCRIPTION=Chromium OS multitouch utilities
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/mttools
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ab45970c875e95a415973835ccdd969dac820de5 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/gestures app-misc/utouch-evemu chromeos-base/libevdev chromeos-base/touch_firmware_test
-RESTRICT=test
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=495aa84fbffb0407d29c4d3723f3068b
diff --git a/metadata/md5-cache/chromeos-base/mttools-0.0.1-r160 b/metadata/md5-cache/chromeos-base/mttools-0.0.1-r160
new file mode 100644
index 0000000..e5100c0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/mttools-0.0.1-r160
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=chromeos-base/gestures app-misc/utouch-evemu chromeos-base/libevdev chromeos-base/touch_firmware_test
+DESCRIPTION=Chromium OS multitouch utilities
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/mttools
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_2a249f0f3fca6ab3c82d86616802086874f5c901 cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/gestures app-misc/utouch-evemu chromeos-base/libevdev chromeos-base/touch_firmware_test
+RESTRICT=test
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4de9fa22ccd3c14d69b62f8a9a261c49
diff --git a/metadata/md5-cache/chromeos-base/mttools-9999 b/metadata/md5-cache/chromeos-base/mttools-9999
index 773fd89..63abd84 100644
--- a/metadata/md5-cache/chromeos-base/mttools-9999
+++ b/metadata/md5-cache/chromeos-base/mttools-9999
@@ -10,5 +10,5 @@
 RDEPEND=chromeos-base/gestures app-misc/utouch-evemu chromeos-base/libevdev chromeos-base/touch_firmware_test
 RESTRICT=test
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0092e00d21f212b314fc6245f195c740
diff --git a/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r47 b/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r47
deleted file mode 100644
index 2f262d4..0000000
--- a/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r47
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=NDProxy daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-ndproxyd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r47
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1511829fbcf1c38fd5b80b19e60a2ca6
diff --git a/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r98 b/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r98
new file mode 100644
index 0000000..35e9c3f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ndproxyd-0.0.1-r98
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=NDProxy daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/network/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-ndproxyd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r98
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=afc5d5e8b5467b49bb4b7dddd617493f
diff --git a/metadata/md5-cache/chromeos-base/ndproxyd-9999 b/metadata/md5-cache/chromeos-base/ndproxyd-9999
index ed0c3e8..d270d78 100644
--- a/metadata/md5-cache/chromeos-base/ndproxyd-9999
+++ b/metadata/md5-cache/chromeos-base/ndproxyd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= chromeos-base/libbrillo:= !chromeos-base/arc-networkd-ndproxyd >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5f5e7c3966855911a14fbe5ca08f5ca9
diff --git a/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r46 b/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r46
deleted file mode 100644
index db72ca7..0000000
--- a/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r46
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS support utils for Android Neural Network API
-EAPI=7
-HOMEPAGE=https://developer.android.com/ndk/guides/neuralnetworks
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6ce5174303d011bac1b15ddf51c35f31899aee57_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d59698b9aacd42201a585bee90f33719caa6338b_4256bcdd9e9435828bf8159d85af015450112aff_b4147760c8f1da9f6749f61748d2cacf89237717_dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7_078088f837cd0a9b1c3123b5d93904f4ec2f2af6_934fe42dbc7182e5775cb5717e7cb29644a6eae8_3e10262144e64652e5c70fe978e1d6bae433ab27 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6ce5174303d011bac1b15ddf51c35f31899aee57_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d59698b9aacd42201a585bee90f33719caa6338b_4256bcdd9e9435828bf8159d85af015450112aff_b4147760c8f1da9f6749f61748d2cacf89237717_dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7_078088f837cd0a9b1c3123b5d93904f4ec2f2af6_934fe42dbc7182e5775cb5717e7cb29644a6eae8_3e10262144e64652e5c70fe978e1d6bae433ab27 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google Apache-2.0
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r46
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c3cd7ed38670f699bb2d59ed902f2834
diff --git a/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r78 b/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r78
new file mode 100644
index 0000000..89b6b4b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/nnapi-0.0.1-r78
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS support utils for Android Neural Network API
+EAPI=7
+HOMEPAGE=https://developer.android.com/ndk/guides/neuralnetworks
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_799a18b3e192269829efc902ed9b430aa32cadb4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_53a4656104a89df4072d3101327f51fcf6c9cbb2_b4147760c8f1da9f6749f61748d2cacf89237717_dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7_078088f837cd0a9b1c3123b5d93904f4ec2f2af6_cbb1596cd3157db5ffe44d03d24c30cc9ed53e38_dcbde0bbddc02dde72a15bbf5b890da2cc032cc9_3e10262144e64652e5c70fe978e1d6bae433ab27 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_799a18b3e192269829efc902ed9b430aa32cadb4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_53a4656104a89df4072d3101327f51fcf6c9cbb2_b4147760c8f1da9f6749f61748d2cacf89237717_dc37c5c3ce7989055b7a2d5a2dcc5d605ee189d7_078088f837cd0a9b1c3123b5d93904f4ec2f2af6_cbb1596cd3157db5ffe44d03d24c30cc9ed53e38_dcbde0bbddc02dde72a15bbf5b890da2cc032cc9_3e10262144e64652e5c70fe978e1d6bae433ab27 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google Apache-2.0
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r78
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a4b1c9292795b429e41866a53de8c777
diff --git a/metadata/md5-cache/chromeos-base/nnapi-9999 b/metadata/md5-cache/chromeos-base/nnapi-9999
index 57ff7c7..fb88a15 100644
--- a/metadata/md5-cache/chromeos-base/nnapi-9999
+++ b/metadata/md5-cache/chromeos-base/nnapi-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5b07e9881e913e931a199dc269b40d61
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f29f336067775f5aea76c6f67048ffe8
diff --git a/metadata/md5-cache/chromeos-base/ocr-0.0.1-r12 b/metadata/md5-cache/chromeos-base/ocr-0.0.1-r12
new file mode 100644
index 0000000..565eeb3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ocr-0.0.1-r12
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=app-text/tesseract:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Optical Character Recognition service for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ocr/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_db360477504fad20e43d8a63e249e8470881562c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_db360477504fad20e43d8a63e249e8470881562c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-text/tesseract:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=2cd7dd38f1a6b09ee0dbc1c308833614
diff --git a/metadata/md5-cache/chromeos-base/ocr-9999 b/metadata/md5-cache/chromeos-base/ocr-9999
new file mode 100644
index 0000000..b99ba85
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ocr-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=app-text/tesseract:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Optical Character Recognition service for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ocr/
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-text/tesseract:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=ff0977bafd016d8c9d5b52dfbec77af7
diff --git a/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r301 b/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r301
deleted file mode 100644
index 5262959..0000000
--- a/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r301
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/libtpmcrypto:= chromeos-base/metrics:= dev-libs/openssl:0= sys-apps/dbus:= chromeos-base/power_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Provides utilities to save and restore OOBE config.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/oobe_config/
-IUSE=tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1e54d20a57c3ddfa63a5a03e65500a8cf4569e0a_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1e54d20a57c3ddfa63a5a03e65500a8cf4569e0a_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_7e189936f29d145c4191ea147e48256c92fac75d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libtpmcrypto:= chromeos-base/metrics:= dev-libs/openssl:0= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=?? ( tpm tpm2 )
-SLOT=0/0.0.1-r301
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=8edf0b64998968edb65ab6be3e96210f
diff --git a/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r336 b/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r336
new file mode 100644
index 0000000..3c549a2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/oobe_config-0.0.1-r336
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libtpmcrypto:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/openssl:0= sys-apps/dbus:= chromeos-base/power_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Provides utilities to save and restore OOBE config.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/oobe_config/
+IUSE=tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_98b41b17eb228d92bc0c440e65608130f295b979_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_98b41b17eb228d92bc0c440e65608130f295b979_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libtpmcrypto:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/openssl:0= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=?? ( tpm tpm2 )
+SLOT=0/0.0.1-r336
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=409ca505327fed8cd1111f15e32bf18e
diff --git a/metadata/md5-cache/chromeos-base/oobe_config-9999 b/metadata/md5-cache/chromeos-base/oobe_config-9999
index 1a5c51b..0611644 100644
--- a/metadata/md5-cache/chromeos-base/oobe_config-9999
+++ b/metadata/md5-cache/chromeos-base/oobe_config-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/libtpmcrypto:= chromeos-base/metrics:= dev-libs/openssl:0= sys-apps/dbus:= chromeos-base/power_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/libtpmcrypto:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/openssl:0= sys-apps/dbus:= chromeos-base/power_manager-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Provides utilities to save and restore OOBE config.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/oobe_config/
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/libtpmcrypto:= chromeos-base/metrics:= dev-libs/openssl:0= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/libtpmcrypto:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/openssl:0= sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=?? ( tpm tpm2 )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=b9a384af59d25e9b9ee557d9220337e8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=950b2d4b12e9f498572be778009c1542
diff --git a/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3184 b/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3184
deleted file mode 100644
index c0347b7..0000000
--- a/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3184
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Chromium OS P2P
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/p2p/
-IUSE=cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_60696efa07bf1a4db8013abb83fcf73bb27af918_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_60696efa07bf1a4db8013abb83fcf73bb27af918_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=62a78c3a23bbcac147985782fe28797f
diff --git a/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3221 b/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3221
new file mode 100644
index 0000000..d6223fb
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/p2p-0.0.1-r3221
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chromium OS P2P
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/p2p/
+IUSE=cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e66e3361d73a6edd09ce21083f14932af5f098c4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_e66e3361d73a6edd09ce21083f14932af5f098c4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=ff1f2d4a1f817e26b82c4910598175fa
diff --git a/metadata/md5-cache/chromeos-base/p2p-9999 b/metadata/md5-cache/chromeos-base/p2p-9999
index a1c4135..b04c455 100644
--- a/metadata/md5-cache/chromeos-base/p2p-9999
+++ b/metadata/md5-cache/chromeos-base/p2p-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Chromium OS P2P
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/p2p/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/glib:= net-dns/avahi-daemon:= net-firewall/iptables:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=a8574295bb6bc8b0be08a05e773702ae
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=6ca1aa2faac464e989ad11c15375f012
diff --git a/metadata/md5-cache/chromeos-base/patchpanel-0.0.1-r58 b/metadata/md5-cache/chromeos-base/patchpanel-0.0.1-r58
deleted file mode 100644
index 7e58d8c..0000000
--- a/metadata/md5-cache/chromeos-base/patchpanel-0.0.1-r58
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/permission_broker-client:= chromeos-base/session_manager-client:= chromeos-base/shill:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Patchpanel network connectivity management daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/
-IUSE=fuzzer arcvm cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_1dc8b59c15baa1c29106e0efdc754feaae0a351e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_769e73d163dc671e97eeb278eefcf36cfdd1c94c_1dc8b59c15baa1c29106e0efdc754feaae0a351e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd net-firewall/iptables net-misc/bridge-utils sys-apps/iproute2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r58
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=7957eb5983f687330535c7f5758b9c02
diff --git a/metadata/md5-cache/chromeos-base/patchpanel-0.0.2-r120 b/metadata/md5-cache/chromeos-base/patchpanel-0.0.2-r120
new file mode 100644
index 0000000..29b2f4e
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/patchpanel-0.0.2-r120
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/shill-net:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Patchpanel network connectivity management daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/
+IUSE=fuzzer arcvm jetstream_routing cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_5d5e405eab09b29c43db777f61650b9187b8bce3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_5d5e405eab09b29c43db777f61650b9187b8bce3_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/shill-net:= chromeos-base/shill net-firewall/iptables net-misc/bridge-utils sys-apps/iproute2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.2-r120
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=8a695a901350f1b73f049c71c65c0e73
diff --git a/metadata/md5-cache/chromeos-base/patchpanel-9999 b/metadata/md5-cache/chromeos-base/patchpanel-9999
index 6ac4ce2..eb1b136 100644
--- a/metadata/md5-cache/chromeos-base/patchpanel-9999
+++ b/metadata/md5-cache/chromeos-base/patchpanel-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/permission_broker-client:= chromeos-base/session_manager-client:= chromeos-base/shill:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/shill-net:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Patchpanel network connectivity management daemon
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/
-IUSE=fuzzer arcvm cros_host cros_workon_tree_ cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=fuzzer arcvm jetstream_routing cros_host cros_workon_tree_ cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd net-firewall/iptables net-misc/bridge-utils sys-apps/iproute2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=dev-libs/protobuf:= !chromeos-base/arc-networkd chromeos-base/shill-net:= chromeos-base/shill net-firewall/iptables net-misc/bridge-utils sys-apps/iproute2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=7327ac91b6bb9de5ca7b37c3c275b152
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=2a09c1fd4dfb27e416ee4351e413c8d0
diff --git a/metadata/md5-cache/chromeos-base/patchpanel-client-0.0.1-r14 b/metadata/md5-cache/chromeos-base/patchpanel-client-0.0.1-r14
new file mode 100644
index 0000000..1d0b412
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/patchpanel-client-0.0.1-r14
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Patchpanel network connectivity management D-Bus client
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/patchpanel/dbus/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_2c0fbdc6a39fdedb92ac536175e351099402b6ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/patchpanel-0.0.2 dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r14
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d278be68134e6a87ede225590ed01bc1
diff --git a/metadata/md5-cache/chromeos-base/patchpanel-client-9999 b/metadata/md5-cache/chromeos-base/patchpanel-client-9999
new file mode 100644
index 0000000..84eb5f5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/patchpanel-client-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Patchpanel network connectivity management D-Bus client
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/patchpanel/dbus/
+IUSE=fuzzer cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/patchpanel-0.0.2 dev-libs/protobuf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9c98c2983a03cb66683b0522ea3a7818
diff --git a/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926 b/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926
new file mode 100644
index 0000000..e07e5fd
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926
@@ -0,0 +1,12 @@
+BDEPEND=dev-util/gn dev-util/ninja dev-libs/protobuf
+DEFINED_PHASES=compile configure install
+DESCRIPTION=An open-source project for performance instrumentation and tracing.
+EAPI=7
+HOMEPAGE=https://perfetto.dev/
+IUSE=cros-debug
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://github.com/google/perfetto/archive/df3ae5e6f975204d2f35aeed61cbbd0746151d8e.tar.gz -> perfetto-8.0_pre20200926.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9a1ca7944de98bc1448a0c921a9b206b
diff --git a/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926-r1 b/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926-r1
new file mode 100644
index 0000000..e07e5fd
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/perfetto-8.0_pre20200926-r1
@@ -0,0 +1,12 @@
+BDEPEND=dev-util/gn dev-util/ninja dev-libs/protobuf
+DEFINED_PHASES=compile configure install
+DESCRIPTION=An open-source project for performance instrumentation and tracing.
+EAPI=7
+HOMEPAGE=https://perfetto.dev/
+IUSE=cros-debug
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://github.com/google/perfetto/archive/df3ae5e6f975204d2f35aeed61cbbd0746151d8e.tar.gz -> perfetto-8.0_pre20200926.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9a1ca7944de98bc1448a0c921a9b206b
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3044 b/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3044
deleted file mode 100644
index 617eff8..0000000
--- a/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3044
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=sys-apps/dbus:= virtual/libusb:1 virtual/udev chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] sys-kernel/linux-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Permission Broker for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/
-IUSE=cfm_enabled_device fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-apps/dbus:= virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r3044
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=06fb18c4dd1649f809fa4b20d8623ec7
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3071 b/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3071
new file mode 100644
index 0000000..4cdbb7d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/permission_broker-0.0.1-r3071
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/patchpanel-client:= sys-apps/dbus:= virtual/libusb:1 virtual/udev chromeos-base/system_api:=[fuzzer?] sys-kernel/linux-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Permission Broker for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/
+IUSE=cfm_enabled_device fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/patchpanel-client:= sys-apps/dbus:= virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r3071
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=6a854ef37fe282ffc8efbb86512d56dd
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-9999 b/metadata/md5-cache/chromeos-base/permission_broker-9999
index bbdaaa0..28ee690 100644
--- a/metadata/md5-cache/chromeos-base/permission_broker-9999
+++ b/metadata/md5-cache/chromeos-base/permission_broker-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=sys-apps/dbus:= virtual/libusb:1 virtual/udev chromeos-base/session_manager-client:= chromeos-base/system_api:=[fuzzer?] sys-kernel/linux-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/patchpanel-client:= sys-apps/dbus:= virtual/libusb:1 virtual/udev chromeos-base/system_api:=[fuzzer?] sys-kernel/linux-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Permission Broker for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=sys-apps/dbus:= virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/patchpanel-client:= sys-apps/dbus:= virtual/libusb:1 virtual/udev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=b2bc66af3ab56f197220079b3c4c6a0b
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=9a619de5bdf337ee4118e4afe9e5c080
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1793 b/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1793
deleted file mode 100644
index 09c0afc..0000000
--- a/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1793
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Permission Broker DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1793
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cc21598e147bd46c4d8f07b51ecf52f9
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1819 b/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1819
new file mode 100644
index 0000000..d03d6b9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/permission_broker-client-0.0.1-r1819
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Permission Broker DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/permission_broker/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1819
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0bf770f1182f636199997118a3407821
diff --git a/metadata/md5-cache/chromeos-base/permission_broker-client-9999 b/metadata/md5-cache/chromeos-base/permission_broker-client-9999
index ac15a11..fb974dffe 100644
--- a/metadata/md5-cache/chromeos-base/permission_broker-client-9999
+++ b/metadata/md5-cache/chromeos-base/permission_broker-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=47c7b468d0dab08c7d9214e59215ed9b
diff --git a/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r140 b/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r140
deleted file mode 100644
index 7740e46..0000000
--- a/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r140
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=>=chromeos-base/protofiles-0.0.39:= dev-go/protobuf:= dev-libs/protobuf:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS policy protocol buffer binding for go
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_proto
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f6e985347a838bbbdd2997e97c4b4940571f2dd2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f6e985347a838bbbdd2997e97c4b4940571f2dd2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r140
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4bc77da51b89acd86ec84bd0deceae3f
diff --git a/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r161 b/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r161
new file mode 100644
index 0000000..66fdba2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/policy-go-proto-0.0.1-r161
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=>=chromeos-base/protofiles-0.0.39:= dev-go/protobuf:= dev-libs/protobuf:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS policy protocol buffer binding for go
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_proto
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f6e985347a838bbbdd2997e97c4b4940571f2dd2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f6e985347a838bbbdd2997e97c4b4940571f2dd2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r161
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9e6e0a77428c8e7d0f4d8bed8f8d446d
diff --git a/metadata/md5-cache/chromeos-base/policy-go-proto-9999 b/metadata/md5-cache/chromeos-base/policy-go-proto-9999
index b31e8256..121117b 100644
--- a/metadata/md5-cache/chromeos-base/policy-go-proto-9999
+++ b/metadata/md5-cache/chromeos-base/policy-go-proto-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=31e82300b25b4086e88926d121e32abc
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a1a1b82232a30b678fad63caa1d508b9
diff --git a/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1 b/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1
index 55f97bf..afc9ada 100644
--- a/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1
+++ b/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1
@@ -7,5 +7,5 @@
 PROPERTIES=live
 RDEPEND=dev-python/protobuf-python
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=35b4f1c242f03ce13379971a90bd372a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=26e97858060cb60a929aa22555a36f69
diff --git a/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r5 b/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r5
deleted file mode 100644
index 55f97bf..0000000
--- a/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r5
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install setup unpack
-DEPEND=dev-libs/protobuf
-DESCRIPTION=Dependencies needed by the policy_testserver
-EAPI=6
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-python/protobuf-python
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=35b4f1c242f03ce13379971a90bd372a
diff --git a/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r6 b/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r6
new file mode 100644
index 0000000..afc9ada
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/policy-testserver-0.0.1-r6
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install setup unpack
+DEPEND=dev-libs/protobuf
+DESCRIPTION=Dependencies needed by the policy_testserver
+EAPI=6
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-python/protobuf-python
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=26e97858060cb60a929aa22555a36f69
diff --git a/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r139 b/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r139
deleted file mode 100644
index c6ff7d0..0000000
--- a/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r139
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Device-policy-management library and tool for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_utils/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bd13c84f484f05be0426fa99c88392099b9b64ee_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bd13c84f484f05be0426fa99c88392099b9b64ee_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a0a0c6e0ff194a2739c3a46d4fc5aff5
diff --git a/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r160 b/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r160
new file mode 100644
index 0000000..9bc8a44
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/policy_utils-0.0.1-r160
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/system_api >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Device-policy-management library and tool for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/policy_utils/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_28c2fe0289bb5ac5443a262b5cbbd38ab30763d5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_28c2fe0289bb5ac5443a262b5cbbd38ab30763d5_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6fa82384192c7776f4a43ff3f43637d8
diff --git a/metadata/md5-cache/chromeos-base/policy_utils-9999 b/metadata/md5-cache/chromeos-base/policy_utils-9999
index 26bbd73..9eb55ae 100644
--- a/metadata/md5-cache/chromeos-base/policy_utils-9999
+++ b/metadata/md5-cache/chromeos-base/policy_utils-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=66de907fb8c0c3ab0fc366d16a6de9b5
diff --git a/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3462 b/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3462
deleted file mode 100644
index ab39f35..0000000
--- a/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3462
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= dev-libs/libnl:= dev-libs/protobuf:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/chromeos-ec-headers:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Power Manager for Chromium OS
-EAPI=7
-HOMEPAGE=http://dev.chromium.org/chromium-os/packages/power_manager
-IUSE=-als buffet +cras cros_embedded +display_backlight fuzzer generated_cros_config -has_keyboard_backlight -keyboard_includes_side_buttons keyboard_convertible_no_side_buttons -legacy_power_button -mosys_eventlog +powerknobs systemd +touchpad_wakeup -touchscreen_wakeup unibuild wilco cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_03aecfc1ac4d322587fe2a5efc6c3e3abf118627_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_03aecfc1ac4d322587fe2a5efc6c3e3abf118627_6287b0913be5aaea79569d55d989b9b729396f10_7e189936f29d145c4191ea147e48256c92fac75d_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= dev-libs/libnl:= dev-libs/protobuf:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/ec-utils mosys_eventlog? ( sys-apps/mosys ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=?? ( keyboard_includes_side_buttons keyboard_convertible_no_side_buttons )
-SLOT=0/0.0.2-r3462
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=884c22201ff118a3e643288927c00c58
diff --git a/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3548 b/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3548
new file mode 100644
index 0000000..9b6e226
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/power_manager-0.0.2-r3548
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libnl:= dev-libs/protobuf:= dev-libs/re2:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/chromeos-ec-headers:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Power Manager for Chromium OS
+EAPI=7
+HOMEPAGE=http://dev.chromium.org/chromium-os/packages/power_manager
+IUSE=-als buffet +cras cros_embedded +display_backlight fuzzer generated_cros_config -has_keyboard_backlight -keyboard_includes_side_buttons keyboard_convertible_no_side_buttons -legacy_power_button -mosys_eventlog +powerknobs systemd +touchpad_wakeup -touchscreen_wakeup unibuild wilco cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_33ae40ab689f1eb6e4700c7bae6ba213d4da50d7_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_47494d35dcb27c2b0340dd8a7508845488139951_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_33ae40ab689f1eb6e4700c7bae6ba213d4da50d7_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_47494d35dcb27c2b0340dd8a7508845488139951_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libnl:= dev-libs/protobuf:= dev-libs/re2:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/ec-utils mosys_eventlog? ( sys-apps/mosys ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=?? ( keyboard_includes_side_buttons keyboard_convertible_no_side_buttons )
+SLOT=0/0.0.2-r3548
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=d6a5280cae2986c927350a9a0078d132
diff --git a/metadata/md5-cache/chromeos-base/power_manager-9999 b/metadata/md5-cache/chromeos-base/power_manager-9999
index f0e1c7b..f3b2783 100644
--- a/metadata/md5-cache/chromeos-base/power_manager-9999
+++ b/metadata/md5-cache/chromeos-base/power_manager-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= dev-libs/libnl:= dev-libs/protobuf:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/chromeos-ec-headers:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libnl:= dev-libs/protobuf:= dev-libs/re2:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/chromeos-ec-headers:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Power Manager for Chromium OS
 EAPI=7
 HOMEPAGE=http://dev.chromium.org/chromium-os/packages/power_manager
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/metrics:= dev-libs/libnl:= dev-libs/protobuf:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/ec-utils mosys_eventlog? ( sys-apps/mosys ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/metrics-0.0.1-r3152:= dev-libs/libnl:= dev-libs/protobuf:= dev-libs/re2:= cras? ( media-sound/adhd:= ) virtual/udev chromeos-base/ec-utils mosys_eventlog? ( sys-apps/mosys ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=?? ( keyboard_includes_side_buttons keyboard_convertible_no_side_buttons )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=2b478cb348229db0a23b69613eed35bc
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=67e5ef0324e4238ca2e6cfe58797093d
diff --git a/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1951 b/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1951
deleted file mode 100644
index 625588a..0000000
--- a/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1951
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Power manager DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_b8689b1d4a3af3d61b101a1b5550ef23f2f5a4e6_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1951
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=07e2aedb8b344ccf738a86ff5b688c28
diff --git a/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1991 b/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1991
new file mode 100644
index 0000000..f75220d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/power_manager-client-0.0.1-r1991
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Power manager DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/power_manager/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_47494d35dcb27c2b0340dd8a7508845488139951_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_47494d35dcb27c2b0340dd8a7508845488139951_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1991
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fbc0060fb216ba2352af9a1720e6a1c2
diff --git a/metadata/md5-cache/chromeos-base/power_manager-client-9999 b/metadata/md5-cache/chromeos-base/power_manager-client-9999
index f1762c7..88e2d69 100644
--- a/metadata/md5-cache/chromeos-base/power_manager-client-9999
+++ b/metadata/md5-cache/chromeos-base/power_manager-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d328bdefe390a7490c448043ed07b52f
diff --git a/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r68 b/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r68
deleted file mode 100644
index e0abdc9..0000000
--- a/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r68
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libipp:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Various tools for the native printing system.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/print_tools/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e32b875ee8bdcd1ae46bae8619e4d00d4d03636c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e32b875ee8bdcd1ae46bae8619e4d00d4d03636c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libipp:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r68
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=64eb919df2fcd73e9c3bc70df2b03038
diff --git a/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r88 b/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r88
new file mode 100644
index 0000000..110219e
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/print_tools-0.0.1-r88
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libipp:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Various tools for the native printing system.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/print_tools/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d82c217496d3cd9f51b48f13a0d308dfaeaf5981_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d82c217496d3cd9f51b48f13a0d308dfaeaf5981_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libipp:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r88
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1b8fa19d40bb582059e3939812a96b80
diff --git a/metadata/md5-cache/chromeos-base/print_tools-9999 b/metadata/md5-cache/chromeos-base/print_tools-9999
index a7c0bbe..9e004d8 100644
--- a/metadata/md5-cache/chromeos-base/print_tools-9999
+++ b/metadata/md5-cache/chromeos-base/print_tools-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libipp:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=af270c8a1070ed8ac42eabf89e6d74a3
diff --git a/metadata/md5-cache/chromeos-base/protofiles-0.0.39 b/metadata/md5-cache/chromeos-base/protofiles-0.0.39
deleted file mode 100644
index f6a3ffd..0000000
--- a/metadata/md5-cache/chromeos-base/protofiles-0.0.39
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install setup unpack
-DESCRIPTION=Protobuf installer for the device policy proto definitions.
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromium/src/components/policy
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<chromeos-base/chromeos-chrome-82.0.4056.0_rc-r1
-SLOT=0/0.0.39
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=576283086fb9c32f2072926a94ab1ac5
diff --git a/metadata/md5-cache/chromeos-base/protofiles-0.0.41 b/metadata/md5-cache/chromeos-base/protofiles-0.0.41
new file mode 100644
index 0000000..f4056b5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/protofiles-0.0.41
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install setup unpack
+DESCRIPTION=Protobuf installer for the device policy proto definitions.
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromium/src/components/policy
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/chromeos-chrome-82.0.4056.0_rc-r1
+SLOT=0/0.0.41
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=906fc240f4e7003297a0c65d62d8ee02
diff --git a/metadata/md5-cache/chromeos-base/pywalt-0.1.8 b/metadata/md5-cache/chromeos-base/pywalt-0.1.8
index f0453f8..cc0c0e8 100644
--- a/metadata/md5-cache/chromeos-base/pywalt-0.1.8
+++ b/metadata/md5-cache/chromeos-base/pywalt-0.1.8
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=https://github.com/google/walt/archive/v0.1.8.tar.gz -> pywalt-0.1.8.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=1fcbdc49defe5af57f676815247812a7
diff --git a/metadata/md5-cache/chromeos-base/pywalt-0.1.8-r1 b/metadata/md5-cache/chromeos-base/pywalt-0.1.8-r1
index f0453f8..cc0c0e8 100644
--- a/metadata/md5-cache/chromeos-base/pywalt-0.1.8-r1
+++ b/metadata/md5-cache/chromeos-base/pywalt-0.1.8-r1
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=https://github.com/google/walt/archive/v0.1.8.tar.gz -> pywalt-0.1.8.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=1fcbdc49defe5af57f676815247812a7
diff --git a/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2595 b/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2595
deleted file mode 100644
index 09a971f..0000000
--- a/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2595
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=dev-cpp/gflags-2.0:= >=dev-libs/glib-2.30:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/re2:= dev-util/perf:= chromeos-base/protofiles:= test? ( app-shells/dash ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=quipper: chromiumos wide profiling
-EAPI=7
-HOMEPAGE=http://www.chromium.org/chromium-os/profiling-in-chromeos
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=dev-cpp/gflags-2.0:= >=dev-libs/glib-2.30:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/re2:= dev-util/perf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r2595
-SRC_URI=gs://chromeos-localmirror/distfiles/quipper-75564b225722d164aba99e0d628b4a9af6e0e063.tar.gz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3f0b67829435399d95d30baf388dddf5
diff --git a/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2617 b/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2617
new file mode 100644
index 0000000..02ad8c0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/quipper-0.0.1-r2617
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=dev-cpp/gflags-2.0:= >=dev-libs/glib-2.30:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/re2:= dev-util/perf:= chromeos-base/protofiles:= test? ( app-shells/dash ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=quipper: chromiumos wide profiling
+EAPI=7
+HOMEPAGE=http://www.chromium.org/chromium-os/profiling-in-chromeos
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=dev-cpp/gflags-2.0:= >=dev-libs/glib-2.30:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/re2:= dev-util/perf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r2617
+SRC_URI=gs://chromeos-localmirror/distfiles/quipper-f2342a4ef58a99e70a82fa63bdfea539477a4a8a.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2d505472f90ea1d98d06756b46b9e8bd
diff --git a/metadata/md5-cache/chromeos-base/quipper-9999 b/metadata/md5-cache/chromeos-base/quipper-9999
index cb4b38f..6189851 100644
--- a/metadata/md5-cache/chromeos-base/quipper-9999
+++ b/metadata/md5-cache/chromeos-base/quipper-9999
@@ -10,6 +10,6 @@
 PROPERTIES=live live
 RDEPEND=>=dev-cpp/gflags-2.0:= >=dev-libs/glib-2.30:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/re2:= dev-util/perf:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-SRC_URI=gs://chromeos-localmirror/distfiles/quipper-75564b225722d164aba99e0d628b4a9af6e0e063.tar.gz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=03d052e4581afd2f042213db7e7000e5
+SRC_URI=gs://chromeos-localmirror/distfiles/quipper-f2342a4ef58a99e70a82fa63bdfea539477a4a8a.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=078d78b60da093e7b861bfdad328ef28
diff --git a/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r419 b/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r419
deleted file mode 100644
index 4ca2cc5..0000000
--- a/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r419
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Test tool that recovers bricked Chromium OS test devices
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/master/recover_duts/
-IUSE=cros_host cros_workon_tree_f36691b14ba37c189dc2391226bd8bc9c3592706
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/chromeos-init
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=720fad3253ce20225e572530fbf44b56
diff --git a/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r421 b/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r421
new file mode 100644
index 0000000..2094075
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/recover-duts-0.0.1-r421
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Test tool that recovers bricked Chromium OS test devices
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/master/recover_duts/
+IUSE=cros_host cros_workon_tree_f4b9ec28863b19d383a13538b72050113cea51cc
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/chromeos-init
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=33faf08547b3ae7fb91af181b2908633
diff --git a/metadata/md5-cache/chromeos-base/recover-duts-9999 b/metadata/md5-cache/chromeos-base/recover-duts-9999
index f681188..3002b77 100644
--- a/metadata/md5-cache/chromeos-base/recover-duts-9999
+++ b/metadata/md5-cache/chromeos-base/recover-duts-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-init
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=46038a9cd8cbde2a0446bd53714fe066
diff --git a/metadata/md5-cache/chromeos-base/regions-0.0.1-r2013 b/metadata/md5-cache/chromeos-base/regions-0.0.1-r2013
deleted file mode 100644
index 73ebf32..0000000
--- a/metadata/md5-cache/chromeos-base/regions-0.0.1-r2013
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup test unpack
-DESCRIPTION=Chromium OS Region Data
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/regions/
-IUSE=cros_host cros_workon_tree_dc342a511c5df3e803778f6cba03181b6bacf1b0
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-misc/jq
-SLOT=0/0.0.1-r2013
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4d3704f4760b5880ffe75c0743a6a304
diff --git a/metadata/md5-cache/chromeos-base/regions-0.0.1-r2014 b/metadata/md5-cache/chromeos-base/regions-0.0.1-r2014
new file mode 100644
index 0000000..0b31af3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/regions-0.0.1-r2014
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup test unpack
+DESCRIPTION=Chromium OS Region Data
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/regions/
+IUSE=cros_host cros_workon_tree_12ecadcfcba75c471f435107bd2b19280be56af2
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-misc/jq
+SLOT=0/0.0.1-r2014
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a35ea2bdd0b474189cbb433ff7c1ca85
diff --git a/metadata/md5-cache/chromeos-base/regions-9999 b/metadata/md5-cache/chromeos-base/regions-9999
index cda1792..a485bde 100644
--- a/metadata/md5-cache/chromeos-base/regions-9999
+++ b/metadata/md5-cache/chromeos-base/regions-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-misc/jq
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7ac9cfcb215d7dc955992c5f33690906
diff --git a/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r118 b/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r118
deleted file mode 100644
index 6688e60..0000000
--- a/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r118
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=x11-libs/libdrm:= cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=host service for render node forwarding
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/rendernodehost/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-SLOT=0/0.0.1-r118
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=58d2b2365361f056956d2cbd94960f97
diff --git a/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r138 b/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r138
new file mode 100644
index 0000000..5dd7bde
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/rendernodehost-0.0.1-r138
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=x11-libs/libdrm:= cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=host service for render node forwarding
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/rendernodehost/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+SLOT=0/0.0.1-r138
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a9848b53fab82a3e7f5b98781474f2aa
diff --git a/metadata/md5-cache/chromeos-base/rendernodehost-9999 b/metadata/md5-cache/chromeos-base/rendernodehost-9999
index 6be6d4c..e6f8541 100644
--- a/metadata/md5-cache/chromeos-base/rendernodehost-9999
+++ b/metadata/md5-cache/chromeos-base/rendernodehost-9999
@@ -9,5 +9,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=00ba41671c260b9c3c2f7b373e056891
diff --git a/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1027 b/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1027
deleted file mode 100644
index 59ee86e..0000000
--- a/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1027
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libcontainer:= sys-apps/util-linux:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utility for running OCI-compatible containers
-EAPI=7
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_fa7550200d48cd2a3d4d0d5b0b4d950d1b90e3e4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c0b816f19570ba7f0f522c1ff7a29bae14b8be22_fa7550200d48cd2a3d4d0d5b0b4d950d1b90e3e4_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libcontainer:= sys-apps/util-linux:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=36cd49464774182d91bb8522eb54f00f
diff --git a/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1050 b/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1050
new file mode 100644
index 0000000..983e4381
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/run_oci-0.0.1-r1050
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libcontainer:= sys-apps/util-linux:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utility for running OCI-compatible containers
+EAPI=7
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_04a8a0274b23f4bbf01eb2645630f252331db474_90e579a5b3d7431645c6fa2b843c6cbd6225c3fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_04a8a0274b23f4bbf01eb2645630f252331db474_90e579a5b3d7431645c6fa2b843c6cbd6225c3fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libcontainer:= sys-apps/util-linux:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3b89eef5f18a447164f984d6372f5cb0
diff --git a/metadata/md5-cache/chromeos-base/run_oci-9999 b/metadata/md5-cache/chromeos-base/run_oci-9999
index 946df34..2898521 100644
--- a/metadata/md5-cache/chromeos-base/run_oci-9999
+++ b/metadata/md5-cache/chromeos-base/run_oci-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libcontainer:= sys-apps/util-linux:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8bec23d4278001d7155199046121047d
diff --git a/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r388 b/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r388
deleted file mode 100644
index 7190dee..0000000
--- a/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r388
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Runtime probing on device componenets.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/runtime_probe/
-IUSE=generated_cros_config unibuild asan fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_26765d77125b3857917f67977eb945600ff7670e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_6287b0913be5aaea79569d55d989b9b729396f10_26765d77125b3857917f67977eb945600ff7670e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r388
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=70bf4b70d053a7aa758e2d6dd493db5b
diff --git a/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r450 b/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r450
new file mode 100644
index 0000000..cd241bf
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/runtime_probe-0.0.1-r450
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vboot_reference:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Runtime probing on device componenets.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/runtime_probe/
+IUSE=generated_cros_config unibuild asan fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_7d09b1c137270e71951105724c912d0ff35b6fb1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_9b4a2274d7e288e816c42f93f44fb938f82038ff_7d09b1c137270e71951105724c912d0ff35b6fb1_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r450
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=cf47787449fe396fa632db7f2108f8f4
diff --git a/metadata/md5-cache/chromeos-base/runtime_probe-9999 b/metadata/md5-cache/chromeos-base/runtime_probe-9999
index 04e7a7c..8011a75 100644
--- a/metadata/md5-cache/chromeos-base/runtime_probe-9999
+++ b/metadata/md5-cache/chromeos-base/runtime_probe-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config:= ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=d727cf9742f0c55798ea53ca64d63e0f
diff --git a/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1 b/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1
new file mode 100644
index 0000000..032eb19
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Package responsible for setting up the sane test backend
+EAPI=7
+HOMEPAGE=http://www.sane-project.org/
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=>=media-gfx/sane-backends-1.0.31-r2 <media-gfx/sane-backends-2
+SLOT=0/0
+_md5_=c359006648547222ce065c8f73640c05
diff --git a/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1-r1 b/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1-r1
new file mode 100644
index 0000000..032eb19
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sane-backends-test-0.0.1-r1
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Package responsible for setting up the sane test backend
+EAPI=7
+HOMEPAGE=http://www.sane-project.org/
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=>=media-gfx/sane-backends-1.0.31-r2 <media-gfx/sane-backends-2
+SLOT=0/0
+_md5_=c359006648547222ce065c8f73640c05
diff --git a/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r200 b/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r200
deleted file mode 100644
index 50550d5..0000000
--- a/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r200
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/libpng:0= media-libs/minigbm:= x11-libs/libdrm:= virtual/opengles x11-drivers/opengles-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utility to take a screenshot
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/screenshot/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d55943002ae06877156d158a78ac307a26dc25c2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_d55943002ae06877156d158a78ac307a26dc25c2_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=media-libs/libpng:0= media-libs/minigbm:= x11-libs/libdrm:= virtual/opengles >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r200
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=abd2dd40c52dd8a65103ab24a7df06fd
diff --git a/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r221 b/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r221
new file mode 100644
index 0000000..0392660
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/screenshot-0.0.1-r221
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/libpng:0= media-libs/minigbm:= x11-libs/libdrm:= virtual/opengles x11-drivers/opengles-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utility to take a screenshot
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/screenshot/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ee81aa021a8e2f8e763e000672a9b75559ec582e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ee81aa021a8e2f8e763e000672a9b75559ec582e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=media-libs/libpng:0= media-libs/minigbm:= x11-libs/libdrm:= virtual/opengles >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r221
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=710c80d333e05bdd2fa3f97b4a3a70fb
diff --git a/metadata/md5-cache/chromeos-base/screenshot-9999 b/metadata/md5-cache/chromeos-base/screenshot-9999
index 4d815f3b..ec94702 100644
--- a/metadata/md5-cache/chromeos-base/screenshot-9999
+++ b/metadata/md5-cache/chromeos-base/screenshot-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=media-libs/libpng:0= media-libs/minigbm:= x11-libs/libdrm:= virtual/opengles >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9d02dde31416409ea342145228aac100
diff --git a/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r178 b/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r178
deleted file mode 100644
index 90e63d2..0000000
--- a/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r178
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/tpm_manager:=[test?] chromeos-base/trunks:=[test?] chromeos-base/protofiles:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library for sealing data to device identity and state
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/sealed_storage
-IUSE=test tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5ab7e2abb24bd89510d6cf906a61a581fb5f4475_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5ab7e2abb24bd89510d6cf906a61a581fb5f4475_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/tpm_manager:=[test?] chromeos-base/trunks:=[test?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=tpm2
-SLOT=0/0.0.1-r178
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=40df05b7168d54604b60d21ef338f9e0
diff --git a/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r217 b/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r217
new file mode 100644
index 0000000..5e29938
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sealed_storage-0.0.1-r217
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/tpm_manager:=[test?] chromeos-base/trunks:=[test?] chromeos-base/protofiles:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library for sealing data to device identity and state
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/sealed_storage
+IUSE=test tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6051938d56ea147e185701f53ddd1bc956e7e631_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6051938d56ea147e185701f53ddd1bc956e7e631_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/tpm_manager:=[test?] chromeos-base/trunks:=[test?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=tpm2
+SLOT=0/0.0.1-r217
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1d13beef6df0f5c630edc6b30276ab0a
diff --git a/metadata/md5-cache/chromeos-base/sealed_storage-9999 b/metadata/md5-cache/chromeos-base/sealed_storage-9999
index 63be0bc..84b3abf 100644
--- a/metadata/md5-cache/chromeos-base/sealed_storage-9999
+++ b/metadata/md5-cache/chromeos-base/sealed_storage-9999
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/tpm_manager:=[test?] chromeos-base/trunks:=[test?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=tpm2
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=babd9b538942850f16e63ca22fcd930a
diff --git a/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r860 b/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r860
deleted file mode 100644
index c743560..0000000
--- a/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r860
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Secure file erasure for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/secure_erase_file/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e5d3b93967ab0491498bc90862f9bee73883fea8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r860
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a7484d2b24816aeb1ec82486dba1a1f6
diff --git a/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r881 b/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r881
new file mode 100644
index 0000000..4af2783
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/secure-erase-file-0.0.1-r881
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Secure file erasure for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/secure_erase_file/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_6b6ef5508fa314869c1fa0c0847a11651143f224_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r881
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=316be52abc22fe9e4200dd0466d89edd
diff --git a/metadata/md5-cache/chromeos-base/secure-erase-file-9999 b/metadata/md5-cache/chromeos-base/secure-erase-file-9999
index fb50468..534ed4b 100644
--- a/metadata/md5-cache/chromeos-base/secure-erase-file-9999
+++ b/metadata/md5-cache/chromeos-base/secure-erase-file-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e28f882626d38ec416ead8ef7efde298
diff --git a/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r102 b/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r102
new file mode 100644
index 0000000..8e48d31
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r102
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Secure wipe
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/secure-wipe/
+IUSE=mmc nvme sata test cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_898687cfd878621b0aa42a27138c8a6c72210b16_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_898687cfd878621b0aa42a27138c8a6c72210b16_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-misc/jq sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) sys-apps/util-linux sys-block/fio >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r102
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=24a936df8584a4aa5f28be28af1e9646
diff --git a/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r82 b/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r82
deleted file mode 100644
index 1c1f1b5..0000000
--- a/metadata/md5-cache/chromeos-base/secure-wipe-0.0.1-r82
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Secure wipe
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/secure-wipe/
-IUSE=mmc nvme sata test cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_898687cfd878621b0aa42a27138c8a6c72210b16_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_898687cfd878621b0aa42a27138c8a6c72210b16_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=app-misc/jq sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) sys-apps/util-linux sys-block/fio >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r82
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d4c227689d3d51158ad8bb4b3af4b58d
diff --git a/metadata/md5-cache/chromeos-base/secure-wipe-9999 b/metadata/md5-cache/chromeos-base/secure-wipe-9999
index bd0ee1c..ef46242 100644
--- a/metadata/md5-cache/chromeos-base/secure-wipe-9999
+++ b/metadata/md5-cache/chromeos-base/secure-wipe-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=app-misc/jq sata? ( sys-apps/hdparm ) mmc? ( sys-apps/mmc-utils ) nvme? ( sys-apps/nvme-cli ) sys-apps/util-linux sys-block/fio >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d1d2224392377c7015315d0a18f38f78
diff --git a/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r203 b/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r203
deleted file mode 100644
index ffe4419..0000000
--- a/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r203
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile info install setup test unpack
-DEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
-DESCRIPTION=Chrome OS SELinux Policy Package
-EAPI=7
-IUSE=android-container-pi android-vm-rvc selinux_audit_all selinux_develop selinux_experimental arc_first_release_n nocheck cheets_user cheets_user_64 cros_host cros_workon_tree_212e2495ec6d79d76cf9c82469f8acf05b19028b
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= ) sys-apps/restorecon sys-process/audit
-SLOT=0/0.0.1-r203
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=5757dfee66ca421841c9c40b71faddf7
diff --git a/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r222 b/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r222
new file mode 100644
index 0000000..6a78bf6
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/selinux-policy-0.0.1-r222
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile info install setup test unpack
+DEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-master? ( chromeos-base/android-vm-master:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
+DESCRIPTION=Chrome OS SELinux Policy Package
+EAPI=7
+IUSE=android-container-pi android-vm-master android-vm-rvc selinux_audit_all selinux_develop selinux_experimental arc_first_release_n nocheck cheets_user cheets_user_64 cros_host cros_workon_tree_fd92718ac473fbdad43197219db030aec5e4f946
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-master? ( chromeos-base/android-vm-master:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= ) sys-apps/restorecon sys-process/audit
+SLOT=0/0.0.1-r222
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=8b5c316843bfbabe794cd9fcfb6425b9
diff --git a/metadata/md5-cache/chromeos-base/selinux-policy-9999 b/metadata/md5-cache/chromeos-base/selinux-policy-9999
index 72f2fa6..741f1f2 100644
--- a/metadata/md5-cache/chromeos-base/selinux-policy-9999
+++ b/metadata/md5-cache/chromeos-base/selinux-policy-9999
@@ -1,13 +1,13 @@
 BDEPEND=dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile info install setup test unpack
-DEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
+DEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-master? ( chromeos-base/android-vm-master:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= )
 DESCRIPTION=Chrome OS SELinux Policy Package
 EAPI=7
-IUSE=android-container-pi android-vm-rvc selinux_audit_all selinux_develop selinux_experimental arc_first_release_n nocheck cheets_user cheets_user_64 cros_host cros_workon_tree_
+IUSE=android-container-pi android-vm-master android-vm-rvc selinux_audit_all selinux_develop selinux_experimental arc_first_release_n nocheck cheets_user cheets_user_64 cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= ) sys-apps/restorecon sys-process/audit
+RDEPEND=android-container-pi? ( chromeos-base/android-container-pi:0= ) android-vm-master? ( chromeos-base/android-vm-master:0= ) android-vm-rvc? ( chromeos-base/android-vm-rvc:0= ) sys-apps/restorecon sys-process/audit
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=c7efde17c1225d7c87e386096d292ef8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=f1e75534107235529e20638a93d0ee82
diff --git a/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r1970 b/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r1970
deleted file mode 100644
index 3790f03..0000000
--- a/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r1970
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Session manager (chromeos-login) DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/login_manager/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a90cb5e41531689eaaed6fa5fa99fefc4671dd7f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a90cb5e41531689eaaed6fa5fa99fefc4671dd7f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/chromeos-login-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1970
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=94a56de1e3f01c264961e8fe18505294
diff --git a/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r2022 b/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r2022
new file mode 100644
index 0000000..9058018
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/session_manager-client-0.0.1-r2022
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( chromeos-base/chromeos-dbus-bindings:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Session manager (chromeos-login) DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/login_manager/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e806dcb7edc3d4f31afb9edf7056156cbbc63273_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e806dcb7edc3d4f31afb9edf7056156cbbc63273_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/chromeos-login-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r2022
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=38ae36a28f02f88a8256dd22de9034c5
diff --git a/metadata/md5-cache/chromeos-base/session_manager-client-9999 b/metadata/md5-cache/chromeos-base/session_manager-client-9999
index 7cda8ab..9d664b5 100644
--- a/metadata/md5-cache/chromeos-base/session_manager-client-9999
+++ b/metadata/md5-cache/chromeos-base/session_manager-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/chromeos-login-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=06ed55cdb097c7bd3842e43d48640167
diff --git a/metadata/md5-cache/chromeos-base/shill-0.0.4-r2132 b/metadata/md5-cache/chromeos-base/shill-0.0.4-r2132
deleted file mode 100644
index e0f8816..0000000
--- a/metadata/md5-cache/chromeos-base/shill-0.0.4-r2132
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/nsswitch:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/shill-client:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] vpn? ( chromeos-base/vpn-manager:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Shill Connection Manager for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
-IUSE=cellular dhcpv6 fast_transition fuzzer kernel-3_8 kernel-3_10 pppoe +seccomp systemd +tpm +vpn wake_on_wifi +wifi +wired_8021x cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_7e189936f29d145c4191ea147e48256c92fac75d_c49fac65c00e90a9040891dc07e2b2e809cd5a30_3beedc5f4dfdaee00a216accee58e807058e10fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_7e189936f29d145c4191ea147e48256c92fac75d_c49fac65c00e90a9040891dc07e2b2e809cd5a30_3beedc5f4dfdaee00a216accee58e807058e10fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/nsswitch:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) net-misc/dhcpcd dhcpv6? ( net-misc/dhcpcd[ipv6] ) vpn? ( net-vpn/openvpn ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.4-r2132
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=6b63a7af0949767f9a431d0a1bf4d7e3
diff --git a/metadata/md5-cache/chromeos-base/shill-0.0.5-r2230 b/metadata/md5-cache/chromeos-base/shill-0.0.5-r2230
new file mode 100644
index 0000000..30e6c07
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-0.0.5-r2230
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/nsswitch:= chromeos-base/patchpanel-client:= chromeos-base/shill-net:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/shill-client:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] vpn? ( chromeos-base/vpn-manager:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Shill Connection Manager for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
+IUSE=cellular dhcpv6 fast_transition fuzzer kernel-3_8 kernel-3_10 pppoe +seccomp systemd +tpm +vpn wake_on_wifi +wifi +wired_8021x cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_7c400445b4ae74c9a1f673f1aaebed6f9df24894_963e076a0b7311a4a5e1c14646f9a5d50c209ef7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_7c400445b4ae74c9a1f673f1aaebed6f9df24894_963e076a0b7311a4a5e1c14646f9a5d50c209ef7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/nsswitch:= chromeos-base/patchpanel-client:= chromeos-base/shill-net:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/patchpanel net-misc/dhcpcd dhcpv6? ( net-misc/dhcpcd[ipv6] ) vpn? ( net-vpn/openvpn ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.5-r2230
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=d14c93958623ed3415bd24108dd91d92
diff --git a/metadata/md5-cache/chromeos-base/shill-9999 b/metadata/md5-cache/chromeos-base/shill-9999
index a3cef3f..2792bc9 100644
--- a/metadata/md5-cache/chromeos-base/shill-9999
+++ b/metadata/md5-cache/chromeos-base/shill-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/nsswitch:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/shill-client:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] vpn? ( chromeos-base/vpn-manager:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/nsswitch:= chromeos-base/patchpanel-client:= chromeos-base/shill-net:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/shill-client:= chromeos-base/power_manager-client:= chromeos-base/system_api:=[fuzzer?] vpn? ( chromeos-base/vpn-manager:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Shill Connection Manager for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= chromeos-base/metrics:= chromeos-base/nsswitch:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) net-misc/dhcpcd dhcpv6? ( net-misc/dhcpcd[ipv6] ) vpn? ( net-vpn/openvpn ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/bootstat:= tpm? ( chromeos-base/chaps:= ) chromeos-base/minijail:= chromeos-base/libpasswordprovider:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/nsswitch:= chromeos-base/patchpanel-client:= chromeos-base/shill-net:= dev-libs/re2:= cellular? ( net-dialup/ppp:= ) pppoe? ( net-dialup/ppp:= ) vpn? ( net-dialup/ppp:= ) net-dns/c-ares:= net-libs/libtirpc:= net-firewall/iptables:= net-libs/libnetfilter_queue:= net-libs/libnfnetlink:= wifi? ( virtual/wpa_supplicant ) wired_8021x? ( virtual/wpa_supplicant ) sys-apps/rootdev:= cellular? ( net-misc/modemmanager-next:= ) !kernel-3_10? ( !kernel-3_8? ( net-firewall/conntrack-tools:= ) ) chromeos-base/patchpanel net-misc/dhcpcd dhcpv6? ( net-misc/dhcpcd[ipv6] ) vpn? ( net-vpn/openvpn ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=a48f04e9053aecb7ed99ca71870af13a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=0eb97b41c4028ead86dd9c6be7ba78bb
diff --git a/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r25 b/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r25
deleted file mode 100644
index 0387695..0000000
--- a/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r25
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/shill-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Shill Command Line Interface
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/cli
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7b271150a571aef662c99ebc6d241d9cad66d766_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7b271150a571aef662c99ebc6d241d9cad66d766_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/shill >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=110d925409060181f672358c33a623c7
diff --git a/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r47 b/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r47
new file mode 100644
index 0000000..9af1925
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-cli-0.0.1-r47
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/shill-client:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Shill Command Line Interface
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/cli
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_cda0d8aecf41b95f6c4af7b6878468fddb3c26fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_cda0d8aecf41b95f6c4af7b6878468fddb3c26fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/shill-0.0.1-r2205 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d9a1bded31a67e5f76aa9beb590869c8
diff --git a/metadata/md5-cache/chromeos-base/shill-cli-9999 b/metadata/md5-cache/chromeos-base/shill-cli-9999
index 9014c29..995c4cb 100644
--- a/metadata/md5-cache/chromeos-base/shill-cli-9999
+++ b/metadata/md5-cache/chromeos-base/shill-cli-9999
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/shill >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=>=chromeos-base/shill-0.0.1-r2205 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9982c28a8c79a6beb246e60ea8a2cc8c
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=daf4cf606417fb5af117078548ac4255
diff --git a/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2085 b/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2085
deleted file mode 100644
index 9fe14e4..0000000
--- a/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2085
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Shill DBus client library for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c49fac65c00e90a9040891dc07e2b2e809cd5a30_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_c49fac65c00e90a9040891dc07e2b2e809cd5a30_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/shill-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=59bef5285680fc6d56c46d2df0faa018
diff --git a/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2170 b/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2170
new file mode 100644
index 0000000..c983de3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-client-0.0.1-r2170
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Shill DBus client library for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7c400445b4ae74c9a1f673f1aaebed6f9df24894_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7c400445b4ae74c9a1f673f1aaebed6f9df24894_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/shill-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cb40d4c76180886660b9c69c90300e2b
diff --git a/metadata/md5-cache/chromeos-base/shill-client-9999 b/metadata/md5-cache/chromeos-base/shill-client-9999
index b9d4504..901156c 100644
--- a/metadata/md5-cache/chromeos-base/shill-client-9999
+++ b/metadata/md5-cache/chromeos-base/shill-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/shill-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=dc51cbd89b54f272886b514d9f64e0f8
diff --git a/metadata/md5-cache/chromeos-base/shill-net-0.0.1-r16 b/metadata/md5-cache/chromeos-base/shill-net-0.0.1-r16
new file mode 100644
index 0000000..26e0c27
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-net-0.0.1-r16
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Shill networking component interface library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/shill/net
+IUSE=fuzzer +wifi cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7c400445b4ae74c9a1f673f1aaebed6f9df24894_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_7c400445b4ae74c9a1f673f1aaebed6f9df24894_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/shill-0.0.5 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b3ca0074169b0b3328d269b3ed3de042
diff --git a/metadata/md5-cache/chromeos-base/shill-net-9999 b/metadata/md5-cache/chromeos-base/shill-net-9999
new file mode 100644
index 0000000..17f101b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-net-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Shill networking component interface library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/shill/net
+IUSE=fuzzer +wifi cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/shill-0.0.5 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2d9574e57d2e30a7c37ff05b91d14900
diff --git a/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3153 b/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3153
deleted file mode 100644
index dd83a4e..0000000
--- a/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3153
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject
-DESCRIPTION=shill's test scripts
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
-IUSE=cros_host cros_workon_tree_2aeac53ba60c299115bae900809c074566d9228a
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject chromeos-base/shill net-dns/dnsmasq sys-apps/iproute2
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e594b365896035d3bbdd7efb4775f306
diff --git a/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3154 b/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3154
new file mode 100644
index 0000000..f90127a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/shill-test-scripts-0.0.1-r3154
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject
+DESCRIPTION=shill's test scripts
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/shill/
+IUSE=cros_host cros_workon_tree_2aeac53ba60c299115bae900809c074566d9228a
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject >=chromeos-base/shill-0.0.1-r2205 net-dns/dnsmasq sys-apps/iproute2
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=de6e98956e1c43caff972a4eecede28a
diff --git a/metadata/md5-cache/chromeos-base/shill-test-scripts-9999 b/metadata/md5-cache/chromeos-base/shill-test-scripts-9999
index a488d1f..d70461b 100644
--- a/metadata/md5-cache/chromeos-base/shill-test-scripts-9999
+++ b/metadata/md5-cache/chromeos-base/shill-test-scripts-9999
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject chromeos-base/shill net-dns/dnsmasq sys-apps/iproute2
+RDEPEND=dev-lang/python dev-python/dbus-python dev-python/pygobject >=chromeos-base/shill-0.0.1-r2205 net-dns/dnsmasq sys-apps/iproute2
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=94cb7d12ba899ef0ef9fbd1b9c2fbbcb
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9b37dde0a83b4f30a7bc3ba8cf879298
diff --git a/metadata/md5-cache/chromeos-base/sirenia-0.24.52-r15 b/metadata/md5-cache/chromeos-base/sirenia-0.24.52-r15
new file mode 100644
index 0000000..a29519d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sirenia-0.24.52-r15
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= =dev-rust/getopts-0.2*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3 >=dev-rust/flexbuffers-0.1.1:= <dev-rust/flexbuffers-0.2 dev-rust/libchromeos:= dev-rust/minijail:= >=dev-rust/openssl-0.10.22:= <dev-rust/openssl-0.11 >=dev-rust/serde-1.0.114:= <dev-rust/serde-2 =dev-rust/serde_derive-1*:= dev-rust/sys_util:= >=virtual/rust-1.39.0:=
+DESCRIPTION=The runtime environment and middleware for ManaTEE.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/sirenia/
+IUSE=cros_host cros_host cros_workon_tree_9a063ea0ed0ea73f51180b3f4f69e481c034ca54 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.24.52-r15
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c183d51561e1ec5ad2f54296406ceee3
diff --git a/metadata/md5-cache/chromeos-base/sirenia-9999 b/metadata/md5-cache/chromeos-base/sirenia-9999
new file mode 100644
index 0000000..d80bea1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sirenia-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= =dev-rust/getopts-0.2*:= >=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3 >=dev-rust/flexbuffers-0.1.1:= <dev-rust/flexbuffers-0.2 dev-rust/libchromeos:= dev-rust/minijail:= >=dev-rust/openssl-0.10.22:= <dev-rust/openssl-0.11 >=dev-rust/serde-1.0.114:= <dev-rust/serde-2 =dev-rust/serde_derive-1*:= dev-rust/sys_util:= >=virtual/rust-1.39.0:=
+DESCRIPTION=The runtime environment and middleware for ManaTEE.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/sirenia/
+IUSE=cros_host cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=19216ba3514a4f849dbe39784ebb6670
diff --git a/metadata/md5-cache/chromeos-base/skylab-inventory-0.0.1-r69 b/metadata/md5-cache/chromeos-base/skylab-inventory-0.0.1-r69
index 698116f..98c2c56 100644
--- a/metadata/md5-cache/chromeos-base/skylab-inventory-0.0.1-r69
+++ b/metadata/md5-cache/chromeos-base/skylab-inventory-0.0.1-r69
@@ -11,5 +11,5 @@
 RDEPEND=dev-go/errors:= dev-go/go-sys:= dev-go/luci-tsmon:= dev-go/protobuf:=
 RESTRICT=binchecks strip
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3315aae17b5f41cf49d1976e74ec9f1d
diff --git a/metadata/md5-cache/chromeos-base/skylab-inventory-9999 b/metadata/md5-cache/chromeos-base/skylab-inventory-9999
index 99bbcef..77a167d 100644
--- a/metadata/md5-cache/chromeos-base/skylab-inventory-9999
+++ b/metadata/md5-cache/chromeos-base/skylab-inventory-9999
@@ -11,5 +11,5 @@
 RDEPEND=dev-go/errors:= dev-go/go-sys:= dev-go/luci-tsmon:= dev-go/protobuf:=
 RESTRICT=binchecks strip
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9f2ef8dfd95b7738080911f335ea5cd3
diff --git a/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r123 b/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r123
deleted file mode 100644
index 95552d5..0000000
--- a/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r123
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND==sys-fs/fuse-2.9*:= net-fs/samba:= chromeos-base/system_api:= chromeos-base/libpasswordprovider:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=FUSE filesystem to mount SMB shares.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smbfs/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_f392eb20fe0eef352d0b9c1229956bc37210eadf_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_f392eb20fe0eef352d0b9c1229956bc37210eadf_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND==sys-fs/fuse-2.9*:= net-fs/samba:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=5e691b3ffe8786623512c7e7d3070946
diff --git a/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r144 b/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r144
new file mode 100644
index 0000000..1f4c633
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/smbfs-0.0.1-r144
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND==sys-fs/fuse-2.9*:= net-fs/samba:= chromeos-base/system_api:= chromeos-base/libpasswordprovider:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=FUSE filesystem to mount SMB shares.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smbfs/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_0b4dd85d546449bcfe173091fc0577c0e4819734_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_0b4dd85d546449bcfe173091fc0577c0e4819734_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND==sys-fs/fuse-2.9*:= net-fs/samba:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=7aca0ad9c7ad1aa21fdd146b53956040
diff --git a/metadata/md5-cache/chromeos-base/smbfs-9999 b/metadata/md5-cache/chromeos-base/smbfs-9999
index 7ea07d0..13306fd 100644
--- a/metadata/md5-cache/chromeos-base/smbfs-9999
+++ b/metadata/md5-cache/chromeos-base/smbfs-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND==sys-fs/fuse-2.9*:= net-fs/samba:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=06b262d751d679e700db605e9424fc2e
diff --git a/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r634 b/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r634
deleted file mode 100644
index 0acc1b5..0000000
--- a/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r634
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/protobuf:= >=net-fs/samba-4.5.3-r6 sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Provides access to Samba file share
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smbprovider/
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_84b254669dd770139cab5980338344b10736427d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_98c0db7e92836fcb71403a83973a9b5018fe6177_84b254669dd770139cab5980338344b10736427d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= >=net-fs/samba-4.5.3-r6 sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=965e5492ff13356a3d4502982dac87a4
diff --git a/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r655 b/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r655
new file mode 100644
index 0000000..4967351
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/smbprovider-0.0.1-r655
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/protobuf:= >=net-fs/samba-4.5.3-r6 sys-apps/dbus:= chromeos-base/protofiles:= chromeos-base/system_api:=[fuzzer?] chromeos-base/libpasswordprovider:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Provides access to Samba file share
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smbprovider/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_4abec8ca0569f1dd350ba055bebc9111e18a2da7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_377caa22e8416ce2388b9c099e85be393001947f_4abec8ca0569f1dd350ba055bebc9111e18a2da7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= >=net-fs/samba-4.5.3-r6 sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d6cf758a243c29e031cbae1c9d002ca4
diff --git a/metadata/md5-cache/chromeos-base/smbprovider-9999 b/metadata/md5-cache/chromeos-base/smbprovider-9999
index 2ea7fc0..8b0001a 100644
--- a/metadata/md5-cache/chromeos-base/smbprovider-9999
+++ b/metadata/md5-cache/chromeos-base/smbprovider-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= >=net-fs/samba-4.5.3-r6 sys-apps/dbus:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=f0ce4b150ad6a496aaaddbf7e1064602
diff --git a/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r2998 b/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r2998
deleted file mode 100644
index 11210c9..0000000
--- a/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r2998
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DESCRIPTION=TPM SmogCheck library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smogcheck/
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f1a3a02a7d814963817ddfc289d86c25c19a4c87_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.0.1-r2998
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ce7bc2960a751e5192635f64fa363d39
diff --git a/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r3019 b/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r3019
new file mode 100644
index 0000000..b8f61e9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/smogcheck-0.0.1-r3019
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=TPM SmogCheck library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/smogcheck/
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_25b90cd13b01122d778a1d55d814c5b001b88d22_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r3019
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4a19dfd79d02edfe34d75969f3dd28c3
diff --git a/metadata/md5-cache/chromeos-base/smogcheck-9999 b/metadata/md5-cache/chromeos-base/smogcheck-9999
index e4b30db..6f840ad 100644
--- a/metadata/md5-cache/chromeos-base/smogcheck-9999
+++ b/metadata/md5-cache/chromeos-base/smogcheck-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71b4bf3cda2160382ebb334b8c34be08
diff --git a/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r27 b/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r27
deleted file mode 100644
index 5cc637b..0000000
--- a/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r27
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/mesa:=[gbm] x11-base/xwayland:= x11-libs/libxkbcommon:= x11-libs/pixman:= dev-util/meson dev-util/ninja >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=A Wayland compositor for use in CrOS VMs
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier
-IUSE=kvm_guest cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f18d9bae5a13fbc845fc67f82b5ed0573877a130_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f18d9bae5a13fbc845fc67f82b5ed0573877a130_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/vm_guest_tools-0.0.2-r722 media-libs/mesa:=[gbm] x11-base/xwayland:= x11-libs/libxkbcommon:= x11-libs/pixman:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=kvm_guest
-SLOT=0/0.0.1-r27
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0e9490e3f4af1b74f72ea2f61fc436f9
diff --git a/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r54 b/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r54
new file mode 100644
index 0000000..d70c838
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/sommelier-0.0.1-r54
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/mesa:=[gbm] x11-base/xwayland:= x11-libs/libxkbcommon:= x11-libs/pixman:= dev-util/meson dev-util/ninja >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=A Wayland compositor for use in CrOS VMs
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier
+IUSE=kvm_guest cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f55d72bbb7edc43376b1b00fea2ca1b0edda404a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_f55d72bbb7edc43376b1b00fea2ca1b0edda404a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/vm_guest_tools-0.0.2-r722 media-libs/mesa:=[gbm] x11-base/xwayland:= x11-libs/libxkbcommon:= x11-libs/pixman:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=kvm_guest
+SLOT=0/0.0.1-r54
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a8ee9cb58ac4155a289eda99136f0b1d
diff --git a/metadata/md5-cache/chromeos-base/sommelier-9999 b/metadata/md5-cache/chromeos-base/sommelier-9999
index 3df7d7c..fd7d99e 100644
--- a/metadata/md5-cache/chromeos-base/sommelier-9999
+++ b/metadata/md5-cache/chromeos-base/sommelier-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<chromeos-base/vm_guest_tools-0.0.2-r722 media-libs/mesa:=[gbm] x11-base/xwayland:= x11-libs/libxkbcommon:= x11-libs/pixman:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=kvm_guest
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e1a6e55af2357b526f76431339f5104a
diff --git a/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1185 b/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1185
deleted file mode 100644
index 0c8cbab..0000000
--- a/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1185
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=STM32 IAP firmware updater for Chrome OS touchpads
-EAPI=5
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_08e4ed1fd14e116ece76a1d493ace5b137f4c360_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_08e4ed1fd14e116ece76a1d493ace5b137f4c360_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a2bba0f44daa116dd6d1ea1deebae898
diff --git a/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1206 b/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1206
new file mode 100644
index 0000000..1ac886d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/st_flash-0.0.1-r1206
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=STM32 IAP firmware updater for Chrome OS touchpads
+EAPI=5
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ffebcde7bf67275f78bf7dcb24753a1cfacc3e30_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_ffebcde7bf67275f78bf7dcb24753a1cfacc3e30_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ac1b9a5193da0c00d7182062ac5327c7
diff --git a/metadata/md5-cache/chromeos-base/st_flash-9999 b/metadata/md5-cache/chromeos-base/st_flash-9999
index 9e0d314..57ab6bb 100644
--- a/metadata/md5-cache/chromeos-base/st_flash-9999
+++ b/metadata/md5-cache/chromeos-base/st_flash-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=21c3d50f3d60451e233dfab1981dddfd
diff --git a/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r102 b/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r102
deleted file mode 100644
index 64370e9..0000000
--- a/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r102
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= chromeos-base/permission_broker-client:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=A daemon that provides authentication support for system services and ARC apps behind an authenticated web proxy.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system-proxy/
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7c61269c3fa27e04f2f4ac25a97357e28266ab2c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7c61269c3fa27e04f2f4ac25a97357e28266ab2c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=14c62fcb5d0401e9af63c289dacf83ea
diff --git a/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r136 b/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r136
new file mode 100644
index 0000000..5ef49d3
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/system-proxy-0.0.1-r136
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= chromeos-base/permission_broker-client:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=A daemon that provides authentication support for system services and ARC apps behind an authenticated web proxy.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system-proxy/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b4416487148784babe3d901925f987a146fe0278_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_b4416487148784babe3d901925f987a146fe0278_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=af124c65789fbd1fc50923bfe533879c
diff --git a/metadata/md5-cache/chromeos-base/system-proxy-9999 b/metadata/md5-cache/chromeos-base/system-proxy-9999
index 6303000..7eef395 100644
--- a/metadata/md5-cache/chromeos-base/system-proxy-9999
+++ b/metadata/md5-cache/chromeos-base/system-proxy-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= chromeos-base/permission_broker-client:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= chromeos-base/permission_broker-client:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=A daemon that provides authentication support for system services and ARC apps behind an authenticated web proxy.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system-proxy/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= dev-libs/protobuf:= dev-libs/dbus-glib:= sys-apps/dbus:= net-misc/curl:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c10f37c3ca223d5a8e11d13bd69c84fd
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=a0f9f4b76df0f633a8140a3e5693c5e1
diff --git a/metadata/md5-cache/chromeos-base/system_api-0.0.1-r3990 b/metadata/md5-cache/chromeos-base/system_api-0.0.1-r3990
deleted file mode 100644
index 93a1e01..0000000
--- a/metadata/md5-cache/chromeos-base/system_api-0.0.1-r3990
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=dev-go/protobuf:= dev-libs/protobuf:= cros_host? ( net-libs/grpc:= ) dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS system API (D-Bus service names, etc.)
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/
-IUSE=cros_host fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1020d8c2f3ebc74e886811116084257c56c5e646_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1020d8c2f3ebc74e886811116084257c56c5e646_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-SLOT=0/1
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c42a29fd72986c4e25ae029ed14b3c8
diff --git a/metadata/md5-cache/chromeos-base/system_api-0.0.1-r4077 b/metadata/md5-cache/chromeos-base/system_api-0.0.1-r4077
new file mode 100644
index 0000000..1110784
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/system_api-0.0.1-r4077
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=dev-go/protobuf:= dev-libs/protobuf:= cros_host? ( net-libs/grpc:= ) dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS system API (D-Bus service names, etc.)
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/
+IUSE=cros_host fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_5d69cddbb685554738be4c271a07e645e7281630_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_5d69cddbb685554738be4c271a07e645e7281630_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+SLOT=0/1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=988c34ff2921cb605b45e16ddbefed1a
diff --git a/metadata/md5-cache/chromeos-base/system_api-9999 b/metadata/md5-cache/chromeos-base/system_api-9999
index 702d662..fba27b0 100644
--- a/metadata/md5-cache/chromeos-base/system_api-9999
+++ b/metadata/md5-cache/chromeos-base/system_api-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 SLOT=0/1
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c106c88fe711573b32f4ce1a9ea4b472
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d780c78d3794945b5700f70efeb25de2
diff --git a/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r193 b/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r193
deleted file mode 100644
index 282e1a9..0000000
--- a/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r193
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/chromeos-dbus-bindings-rust:= =dev-rust/dbus-0.6*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Chrome OS system API D-Bus bindings for Rust.
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/
-IUSE=cros_host cros_workon_tree_a0d8550678a1ed2a4ab62782049032a024bf40df_0c25b69c1776f42439f6c28509e51d30da6f3f7a_d289fda3c8ee1448b8cdf3425062327cde39dd8c_1020d8c2f3ebc74e886811116084257c56c5e646 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.24.52-r193
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3d83e47ebe61f4b84cac88d5fc6d6059
diff --git a/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r264 b/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r264
new file mode 100644
index 0000000..cf4d910
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/system_api-rust-0.24.52-r264
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Chrome OS system API D-Bus bindings for Rust.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/
+IUSE=cros_host cros_workon_tree_a0d8550678a1ed2a4ab62782049032a024bf40df_135144614b37b7eff5e012dd90d7cbdefbba5d6a_d289fda3c8ee1448b8cdf3425062327cde39dd8c_5d69cddbb685554738be4c271a07e645e7281630 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.24.52-r264
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e4d795a0a81a3c7e2236601c7edb91d9
diff --git a/metadata/md5-cache/chromeos-base/system_api-rust-9999 b/metadata/md5-cache/chromeos-base/system_api-rust-9999
index be7414e..66fdca9 100644
--- a/metadata/md5-cache/chromeos-base/system_api-rust-9999
+++ b/metadata/md5-cache/chromeos-base/system_api-rust-9999
@@ -1,7 +1,8 @@
+BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/chromeos-dbus-bindings-rust:= =dev-rust/dbus-0.6*:= >=virtual/rust-1.39.0:=
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Chrome OS system API D-Bus bindings for Rust.
-EAPI=6
+EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/system_api/
 IUSE=cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
@@ -9,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f9249f8b8b5b6fc94a0106f575d9d214
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b620ae94d21a06cb86ce625ce852d32b
diff --git a/metadata/md5-cache/chromeos-base/tast-build-deps-1 b/metadata/md5-cache/chromeos-base/tast-build-deps-1
deleted file mode 100644
index 616b539..0000000
--- a/metadata/md5-cache/chromeos-base/tast-build-deps-1
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
-DESCRIPTION=Build-time dependencies of Tast binaries
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
-SLOT=0
-_md5_=c09125652b197b7a0206553408da0236
diff --git a/metadata/md5-cache/chromeos-base/tast-build-deps-1-r16 b/metadata/md5-cache/chromeos-base/tast-build-deps-1-r16
deleted file mode 100644
index 616b539..0000000
--- a/metadata/md5-cache/chromeos-base/tast-build-deps-1-r16
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
-DESCRIPTION=Build-time dependencies of Tast binaries
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
-SLOT=0
-_md5_=c09125652b197b7a0206553408da0236
diff --git a/metadata/md5-cache/chromeos-base/tast-build-deps-2-r3 b/metadata/md5-cache/chromeos-base/tast-build-deps-2-r3
new file mode 100644
index 0000000..a715fa2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-build-deps-2-r3
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/dst dev-go/fscrypt dev-go/gapi-drive dev-go/genproto dev-go/godebug dev-go/golang-evdev dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/go-sys dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
+DESCRIPTION=Build-time dependencies of Tast binaries
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
+IUSE=cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/dst dev-go/fscrypt dev-go/gapi-drive dev-go/genproto dev-go/godebug dev-go/golang-evdev dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/go-sys dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
+SLOT=0/2-r3
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=441fa9e9a52d4cc5a5e36fac3acf6707
diff --git a/metadata/md5-cache/chromeos-base/tast-build-deps-9999 b/metadata/md5-cache/chromeos-base/tast-build-deps-9999
new file mode 100644
index 0000000..98d5ee1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-build-deps-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/dst dev-go/fscrypt dev-go/gapi-drive dev-go/genproto dev-go/godebug dev-go/golang-evdev dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/go-sys dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
+DESCRIPTION=Build-time dependencies of Tast binaries
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
+IUSE=cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/aosp-frameworks-base-proto chromeos-base/cros-config-api chromeos-base/hardware_verifier_proto chromeos-base/policy-go-proto chromeos-base/system_api chromeos-base/vm_protos chromeos-base/wilco-dtc-grpc-protos dev-go/boringssl-acvptool dev-go/cdp dev-go/cmp dev-go/crypto dev-go/dbus dev-go/dst dev-go/fscrypt dev-go/gapi-drive dev-go/genproto dev-go/godebug dev-go/golang-evdev dev-go/golint dev-go/gopacket dev-go/gopsutil dev-go/go-matroska dev-go/go-sys dev-go/grpc dev-go/mdns dev-go/mp4 dev-go/oauth2 dev-go/perfetto-protos dev-go/protobuf dev-go/selinux dev-go/subcommands dev-go/sync dev-go/uuid dev-go/vsock dev-go/yaml
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=30639089b3ed175ea4615a64cb82f031
diff --git a/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r722 b/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r722
deleted file mode 100644
index b8078b0..0000000
--- a/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r722
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup test unpack
-DEPEND=chromeos-base/tast-build-deps:= dev-lang/go
-DESCRIPTION=Host executables for running integration tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
-IUSE=cros_host cros_workon_tree_4a8db68dcd87e8909453f8880c06431869d2dbeb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-arch/tar app-arch/xz-utils chromeos-base/google-breakpad chromeos-base/tast-build-deps chromeos-base/tast-vars net-misc/gsutil !chromeos-base/tast-common
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1862e456af8bd35cebf4e9f6240981a9
diff --git a/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r805 b/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r805
new file mode 100644
index 0000000..4778e78
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-cmd-0.0.1-r805
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup test unpack
+DEPEND=chromeos-base/tast-build-deps:= dev-lang/go
+DESCRIPTION=Host executables for running integration tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
+IUSE=cros_host cros_workon_tree_00cb282746732284a2779c7d4e7dc75c5948f2ec
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-arch/tar app-arch/xz-utils chromeos-base/google-breakpad chromeos-base/tast-build-deps chromeos-base/tast-vars net-misc/gsutil !chromeos-base/tast-common
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f86a1f02ed5b4c122765b24ef78dd7ea
diff --git a/metadata/md5-cache/chromeos-base/tast-cmd-9999 b/metadata/md5-cache/chromeos-base/tast-cmd-9999
index 6e79c82..468aac5 100644
--- a/metadata/md5-cache/chromeos-base/tast-cmd-9999
+++ b/metadata/md5-cache/chromeos-base/tast-cmd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-arch/tar app-arch/xz-utils chromeos-base/google-breakpad chromeos-base/tast-build-deps chromeos-base/tast-vars net-misc/gsutil !chromeos-base/tast-common
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1281a8684471d75c0e869ddf378f692e
diff --git a/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r47 b/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r47
deleted file mode 100644
index 6910de6..0000000
--- a/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r47
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=chromeos-base/android-sdk dev-util/gn dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=Compiled apks used by local Tast tests in the cros bundle
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/android
-IUSE=cros_host cros_workon_tree_4c30ab9ef08ff4062a521aab9801d146a40cd9e4
-KEYWORDS=*
-LICENSE=BSD-Google GPL-3
-PROPERTIES=live
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f17448887183d896bbf24578bfb56169
diff --git a/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r76 b/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r76
new file mode 100644
index 0000000..e947fe9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-local-apks-cros-0.0.1-r76
@@ -0,0 +1,12 @@
+BDEPEND=chromeos-base/android-sdk dev-util/gn dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=Compiled apks used by local Tast tests in the cros bundle
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/android
+IUSE=cros_host cros_workon_tree_9c3c5ca2c534d6512f66fb3637b40429e09a85aa
+KEYWORDS=*
+LICENSE=BSD-Google GPL-3
+PROPERTIES=live
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0819a5138a190944045dca8b28a78f59
diff --git a/metadata/md5-cache/chromeos-base/tast-local-apks-cros-9999 b/metadata/md5-cache/chromeos-base/tast-local-apks-cros-9999
index d500e6f..20363a3 100644
--- a/metadata/md5-cache/chromeos-base/tast-local-apks-cros-9999
+++ b/metadata/md5-cache/chromeos-base/tast-local-apks-cros-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google GPL-3
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f45715c471fb3e052e7e96e145901b9d
diff --git a/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r128 b/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r128
deleted file mode 100644
index e59a08f..0000000
--- a/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r128
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-cpp/gtest:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Compiled executables used by local Tast tests in the cros bundle
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/helpers
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_4dbd9e89c7ca47951c04bf59942d59cb083d1d0e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_4dbd9e89c7ca47951c04bf59942d59cb083d1d0e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google GPL-3
-PROPERTIES=live live
-RDEPEND=dev-cpp/gtest:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e8918cbb28b824e281b260ec61cf705c
diff --git a/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r151 b/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r151
new file mode 100644
index 0000000..cd772a7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-0.0.1-r151
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-cpp/gtest:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Compiled executables used by local Tast tests in the cros bundle
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/+/master/helpers
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f800a445e3b88b9fc7948151885eb5d61c4e23da cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f800a445e3b88b9fc7948151885eb5d61c4e23da cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google GPL-3
+PROPERTIES=live live
+RDEPEND=dev-cpp/gtest:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0717222b83c8b1e990a3a97758ca1122
diff --git a/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-9999 b/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-9999
index a9f5d6ea..6f05b8c 100644
--- a/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-9999
+++ b/metadata/md5-cache/chromeos-base/tast-local-helpers-cros-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-cpp/gtest:= media-libs/minigbm:= x11-libs/libdrm:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0cb9cffe9bda2958d9d9fb2e5fb58957
diff --git a/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r673 b/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r673
deleted file mode 100644
index 617574f..0000000
--- a/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r673
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup test unpack
-DEPEND=chromeos-base/tast-build-deps:= dev-lang/go
-DESCRIPTION=Runner for local integration tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
-IUSE=cros_host cros_workon_tree_4a8db68dcd87e8909453f8880c06431869d2dbeb
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-arch/tar !chromeos-base/tast-common
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2875bf898ec8751d10a39d8dd3d7515d
diff --git a/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r756 b/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r756
new file mode 100644
index 0000000..c59751b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-local-test-runner-0.0.1-r756
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup test unpack
+DEPEND=chromeos-base/tast-build-deps:= dev-lang/go
+DESCRIPTION=Runner for local integration tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast/
+IUSE=cros_host cros_workon_tree_00cb282746732284a2779c7d4e7dc75c5948f2ec
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-arch/tar !chromeos-base/tast-common
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e69b5c956e72d3218d795dae9ffbaacc
diff --git a/metadata/md5-cache/chromeos-base/tast-local-test-runner-9999 b/metadata/md5-cache/chromeos-base/tast-local-test-runner-9999
index 0934748..ca5c1bf 100644
--- a/metadata/md5-cache/chromeos-base/tast-local-test-runner-9999
+++ b/metadata/md5-cache/chromeos-base/tast-local-test-runner-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-arch/tar !chromeos-base/tast-common
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=912d6f3eb89e31da8608476aa69b8c89
diff --git a/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3186 b/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3186
deleted file mode 100644
index f055507..0000000
--- a/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3186
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup test unpack
-DEPEND=chromeos-base/tast-build-deps:= dev-lang/go dev-go/crypto
-DESCRIPTION=Bundle of local integration tests for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/
-IUSE=arc chromeless_tty chromeless_tests kernel-3_8 kernel-3_10 kernel-3_14 cros_host cros_workon_tree_adc13b667a1aad8f2f678e0efad6e7684391056f_4a8db68dcd87e8909453f8880c06431869d2dbeb
-KEYWORDS=*
-LICENSE=Apache-2.0 BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/policy-testserver chromeos-base/tast-local-helpers-cros chromeos-base/wprgo !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) dev-libs/openssl:0= arc? ( chromeos-base/tast-local-apks-cros dev-util/android-tools dev-util/android-uiautomator-server ) net-misc/curl sys-apps/memtester sys-apps/rootdev virtual/udev !kernel-3_14? ( !kernel-3_10? ( !kernel-3_8? ( chromeos-base/virtual-usb-printer ) ) ) app-arch/tar
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e28b478501e44139bfb272252317b525
diff --git a/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3921 b/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3921
new file mode 100644
index 0000000..7c36809
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-local-tests-cros-0.0.1-r3921
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup test unpack
+DEPEND=chromeos-base/tast-build-deps:= dev-lang/go dev-go/crypto
+DESCRIPTION=Bundle of local integration tests for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/
+IUSE=arc chromeless_tty chromeless_tests kernel-3_8 kernel-3_10 kernel-3_14 cros_host cros_workon_tree_a6f6f93d4791c9bc7603965a671ca11492a6d5e5_00cb282746732284a2779c7d4e7dc75c5948f2ec
+KEYWORDS=*
+LICENSE=Apache-2.0 BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/policy-testserver chromeos-base/tast-local-helpers-cros chromeos-base/wprgo !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) dev-libs/openssl:0= arc? ( chromeos-base/tast-local-apks-cros dev-util/android-tools dev-util/android-uiautomator-server ) net-misc/curl sys-apps/memtester sys-apps/rootdev virtual/udev !kernel-3_14? ( !kernel-3_10? ( !kernel-3_8? ( chromeos-base/virtual-usb-printer ) ) ) app-arch/tar
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7af9d563eecebb4b452e9d24170cc8f6
diff --git a/metadata/md5-cache/chromeos-base/tast-local-tests-cros-9999 b/metadata/md5-cache/chromeos-base/tast-local-tests-cros-9999
index ecb2b8c..382ddb0 100644
--- a/metadata/md5-cache/chromeos-base/tast-local-tests-cros-9999
+++ b/metadata/md5-cache/chromeos-base/tast-local-tests-cros-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/policy-testserver chromeos-base/tast-local-helpers-cros chromeos-base/wprgo !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) dev-libs/openssl:0= arc? ( chromeos-base/tast-local-apks-cros dev-util/android-tools dev-util/android-uiautomator-server ) net-misc/curl sys-apps/memtester sys-apps/rootdev virtual/udev !kernel-3_14? ( !kernel-3_10? ( !kernel-3_8? ( chromeos-base/virtual-usb-printer ) ) ) app-arch/tar
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=594010b841a3a79f1dbf6a6ab3241074
diff --git a/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3193 b/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3193
deleted file mode 100644
index c3f2484..0000000
--- a/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3193
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup test unpack
-DEPEND=chromeos-base/tast-build-deps:= dev-lang/go dev-go/crypto
-DESCRIPTION=Bundle of remote integration tests for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/
-IUSE=cros_host cros_workon_tree_adc13b667a1aad8f2f678e0efad6e7684391056f_4a8db68dcd87e8909453f8880c06431869d2dbeb_dd84017ea39c62ab8790679abd24e7d37367ac48
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-arch/tar
-SLOT=0/0.0.1-r3193
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=52f5f1f3d1f01f202affa6c65a645aaa
diff --git a/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3941 b/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3941
new file mode 100644
index 0000000..6892cfc
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-0.0.1-r3941
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup test unpack
+DEPEND=chromeos-base/tast-build-deps:= dev-lang/go dev-go/crypto
+DESCRIPTION=Bundle of remote integration tests for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tast-tests/
+IUSE=cros_host cros_workon_tree_a6f6f93d4791c9bc7603965a671ca11492a6d5e5_00cb282746732284a2779c7d4e7dc75c5948f2ec_0ae43237ada86ff051625b38e4bfb48ff0e7da45
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-arch/tar
+SLOT=0/0.0.1-r3941
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=abb7f767145d8290b1e22558b3dc17d9
diff --git a/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-9999 b/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-9999
index 6d3debd..a9fc8ae 100644
--- a/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-9999
+++ b/metadata/md5-cache/chromeos-base/tast-remote-tests-cros-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-arch/tar
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	tast-bundle	bc410bcb993795eb7269ad5ba875aa55	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8a67b612ff7126a68953481fd236dffb
diff --git a/metadata/md5-cache/chromeos-base/tast-use-flags-1-r20 b/metadata/md5-cache/chromeos-base/tast-use-flags-1-r20
new file mode 100644
index 0000000..86be582
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-use-flags-1-r20
@@ -0,0 +1,11 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Text file listing USE flags for Tast test dependencies
+EAPI=7
+IUSE=amd64 android-container-pi android-vm-pi android-vm-rvc arc arc-camera1 arc-camera3 arcpp arcvm arm arm64 asan betty biod borealis_host chrome_internal chrome_media chromeless_tty containers cr50_onboard crosvm-gpu cups diagnostics disable_cros_video_decoder dptf elm-kernelnext +display_backlight dlc dlc_test +drivefs drm_atomic elm fizz force_breakpad grunt hana hana-kernelnext houdini houdini64 internal +internal_mic +internal_speaker iwlwifi_rescan kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14 kernel-4_19 kernel-5_4 kukui kvm_host kvm_transition lxc memd ml_benchmark_drivers ml_service moblab mocktpm msan ndk_translation ndk_translation64 nnapi nyan_kitty ocr octopus pita rialto rk3399 selinux selinux_experimental skate smartdim snow spring +storage_wearout_detect touchview tpm2 transparent_hugepage ubsan unibuild usbguard vaapi veyron_mickey veyron_rialto video_cards_amdgpu video_cards_intel virtio_gpu vulkan watchdog wifi_hostap_test wilco +wired_8021x zork cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=51c0a9c62fd6e16bc06b78bc806faecb
diff --git a/metadata/md5-cache/chromeos-base/tast-use-flags-1-r8 b/metadata/md5-cache/chromeos-base/tast-use-flags-1-r8
deleted file mode 100644
index e781b33..0000000
--- a/metadata/md5-cache/chromeos-base/tast-use-flags-1-r8
+++ /dev/null
@@ -1,11 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Text file listing USE flags for Tast test dependencies
-EAPI=7
-IUSE=amd64 android-container-pi android-vm-pi android-vm-rvc arc arc-camera1 arc-camera3 arcpp arcvm arm arm64 asan betty biod chrome_internal chromeless_tty containers cr50_onboard crosvm-gpu cups diagnostics disable_cros_video_decoder dptf elm-kernelnext +display_backlight dlc dlc_test +drivefs drm_atomic fizz force_breakpad force_crashpad grunt hana-kernelnext houdini houdini64 internal +internal_mic +internal_speaker iwlwifi_rescan kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14 kernel-4_19 kernel-5_4 kernel-5_7 kukui kvm_host kvm_transition lxc memd ml_service moblab mocktpm msan ndk_translation ndk_translation64 nyan_kitty octopus pita rialto rk3399 selinux selinux_experimental skate smartdim snow spring +storage_wearout_detect touchview tpm2 transparent_hugepage ubsan unibuild usbguard vaapi veyron_mickey veyron_rialto vulkan watchdog wifi_hostap_test wilco +wired_8021x cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ffddddf6b88e3932103f276a031512bd
diff --git a/metadata/md5-cache/chromeos-base/tast-use-flags-9999 b/metadata/md5-cache/chromeos-base/tast-use-flags-9999
index c21ffaa..f876402 100644
--- a/metadata/md5-cache/chromeos-base/tast-use-flags-9999
+++ b/metadata/md5-cache/chromeos-base/tast-use-flags-9999
@@ -2,10 +2,10 @@
 DEFINED_PHASES=info install setup unpack
 DESCRIPTION=Text file listing USE flags for Tast test dependencies
 EAPI=7
-IUSE=amd64 android-container-pi android-vm-pi android-vm-rvc arc arc-camera1 arc-camera3 arcpp arcvm arm arm64 asan betty biod chrome_internal chromeless_tty containers cr50_onboard crosvm-gpu cups diagnostics disable_cros_video_decoder dptf elm-kernelnext +display_backlight dlc dlc_test +drivefs drm_atomic fizz force_breakpad force_crashpad grunt hana-kernelnext houdini houdini64 internal +internal_mic +internal_speaker iwlwifi_rescan kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14 kernel-4_19 kernel-5_4 kernel-5_7 kukui kvm_host kvm_transition lxc memd ml_service moblab mocktpm msan ndk_translation ndk_translation64 nyan_kitty octopus pita rialto rk3399 selinux selinux_experimental skate smartdim snow spring +storage_wearout_detect touchview tpm2 transparent_hugepage ubsan unibuild usbguard vaapi veyron_mickey veyron_rialto vulkan watchdog wifi_hostap_test wilco +wired_8021x cros_host cros_workon_tree_
+IUSE=amd64 android-container-pi android-vm-pi android-vm-rvc arc arc-camera1 arc-camera3 arcpp arcvm arm arm64 asan betty biod borealis_host chrome_internal chrome_media chromeless_tty containers cr50_onboard crosvm-gpu cups diagnostics disable_cros_video_decoder dptf elm-kernelnext +display_backlight dlc dlc_test +drivefs drm_atomic elm fizz force_breakpad grunt hana hana-kernelnext houdini houdini64 internal +internal_mic +internal_speaker iwlwifi_rescan kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14 kernel-4_19 kernel-5_4 kukui kvm_host kvm_transition lxc memd ml_benchmark_drivers ml_service moblab mocktpm msan ndk_translation ndk_translation64 nnapi nyan_kitty ocr octopus pita rialto rk3399 selinux selinux_experimental skate smartdim snow spring +storage_wearout_detect touchview tpm2 transparent_hugepage ubsan unibuild usbguard vaapi veyron_mickey veyron_rialto video_cards_amdgpu video_cards_intel virtio_gpu vulkan watchdog wifi_hostap_test wilco +wired_8021x zork cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ae6f7bfb3ce88df51a1a040c5b145e64
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c872b2079d47c8016697e175b991df8d
diff --git a/metadata/md5-cache/chromeos-base/tast-vars-0.0.1-r1 b/metadata/md5-cache/chromeos-base/tast-vars-0.0.1-r1
new file mode 100644
index 0000000..c65ae0d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-vars-0.0.1-r1
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DEPEND=virtual/tast-vars
+DESCRIPTION=All Tast static variables
+EAPI=7
+IUSE=cros_host cros_workon_tree_4d6d8f07299def567532377e3caa17192b4bddfb
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/tast-vars
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d5b97aca55555b1f63821bf4701e6371
diff --git a/metadata/md5-cache/chromeos-base/tast-vars-1 b/metadata/md5-cache/chromeos-base/tast-vars-1
deleted file mode 100644
index 5dc4d4c..0000000
--- a/metadata/md5-cache/chromeos-base/tast-vars-1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=virtual/tast-vars
-DESCRIPTION=All Tast static variables
-EAPI=6
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=virtual/tast-vars
-SLOT=0
-_md5_=6bab5b03fa1806c96584b284f8592511
diff --git a/metadata/md5-cache/chromeos-base/tast-vars-1-r1 b/metadata/md5-cache/chromeos-base/tast-vars-1-r1
deleted file mode 100644
index 5dc4d4c..0000000
--- a/metadata/md5-cache/chromeos-base/tast-vars-1-r1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=virtual/tast-vars
-DESCRIPTION=All Tast static variables
-EAPI=6
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=virtual/tast-vars
-SLOT=0
-_md5_=6bab5b03fa1806c96584b284f8592511
diff --git a/metadata/md5-cache/chromeos-base/tast-vars-9999 b/metadata/md5-cache/chromeos-base/tast-vars-9999
new file mode 100644
index 0000000..9f75179
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tast-vars-9999
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DEPEND=virtual/tast-vars
+DESCRIPTION=All Tast static variables
+EAPI=7
+IUSE=cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/tast-vars
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1ba04dc57cf392b99a5b4668bbe04b68
diff --git a/metadata/md5-cache/chromeos-base/telemetry-0.0.1 b/metadata/md5-cache/chromeos-base/telemetry-0.0.1
index 8a28e50..02cc781 100644
--- a/metadata/md5-cache/chromeos-base/telemetry-0.0.1
+++ b/metadata/md5-cache/chromeos-base/telemetry-0.0.1
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 RDEPEND=dev-python/psutil[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=504dc26c1ae48f5d750bfe3ddd1d7975
diff --git a/metadata/md5-cache/chromeos-base/telemetry-0.0.1-r7 b/metadata/md5-cache/chromeos-base/telemetry-0.0.1-r7
index 8a28e50..02cc781 100644
--- a/metadata/md5-cache/chromeos-base/telemetry-0.0.1-r7
+++ b/metadata/md5-cache/chromeos-base/telemetry-0.0.1-r7
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 RDEPEND=dev-python/psutil[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=504dc26c1ae48f5d750bfe3ddd1d7975
diff --git a/metadata/md5-cache/chromeos-base/termina-dlc-85.13301.0.0.34156 b/metadata/md5-cache/chromeos-base/termina-dlc-85.13301.0.0.34156
deleted file mode 100644
index 3b37310..0000000
--- a/metadata/md5-cache/chromeos-base/termina-dlc-85.13301.0.0.34156
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=install
-DEPEND=chromeos-base/update_engine
-DESCRIPTION=DLC package for termina.
-EAPI=7
-IUSE=dlc amd64 arm
-KEYWORDS=*
-LICENSE=BSD-Google
-REQUIRED_USE=dlc kvm_host ^^ ( amd64 arm )
-RESTRICT=nomirror
-SLOT=0
-SRC_URI=amd64? ( gs://termina-component-testing/uprev-test/amd64/85.13301.0.0.34156/guest-vm-base.tbz -> termina_amd64.tbz ) arm? ( gs://termina-component-testing/uprev-test/arm/85.13301.0.0.34156/guest-vm-base.tbz -> termina_arm.tbz )
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	dlc	c539aa2d32aaba22acfb2eb623710a96
-_md5_=64ebc8829816bd93a4ba4c1addf41a51
diff --git a/metadata/md5-cache/chromeos-base/termina-dlc-87.13503.0.0.38787-r1 b/metadata/md5-cache/chromeos-base/termina-dlc-87.13503.0.0.38787-r1
new file mode 100644
index 0000000..1dd1de5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/termina-dlc-87.13503.0.0.38787-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=chromeos-base/update_engine
+DESCRIPTION=DLC package for termina.
+EAPI=7
+IUSE=kvm_host dlc amd64 arm cros_host cros_workon_tree_
+KEYWORDS=*
+LICENSE=BSD-Google
+REQUIRED_USE=dlc kvm_host ^^ ( amd64 arm arm64 )
+RESTRICT=nomirror
+SLOT=0
+SRC_URI=amd64? ( gs://termina-component-testing/uprev-test/amd64/87.13503.0.0.38787/guest-vm-base.tbz -> termina_amd64.tbz ) arm? ( gs://termina-component-testing/uprev-test/arm/87.13503.0.0.38787/guest-vm-base.tbz -> termina_arm.tbz ) arm64? ( gs://termina-component-testing/uprev-test/arm/87.13503.0.0.38787/guest-vm-base.tbz -> termina_arm.tbz )
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	dlc	c539aa2d32aaba22acfb2eb623710a96	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=936ac1f66cdcf1624648da1276cd02ad
diff --git a/metadata/md5-cache/chromeos-base/termina-dlc-9999 b/metadata/md5-cache/chromeos-base/termina-dlc-9999
new file mode 100644
index 0000000..23093c1
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/termina-dlc-9999
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=chromeos-base/update_engine
+DESCRIPTION=DLC package for termina.
+EAPI=7
+IUSE=kvm_host dlc amd64 arm cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+REQUIRED_USE=dlc kvm_host ^^ ( amd64 arm arm64 )
+RESTRICT=nomirror
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	dlc	c539aa2d32aaba22acfb2eb623710a96	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=04fb41a7b324831e5a5cc69f24d04d8e
diff --git a/metadata/md5-cache/chromeos-base/termina-image-amd64-86.13331.0.0.34882-r1 b/metadata/md5-cache/chromeos-base/termina-image-amd64-86.13331.0.0.34882-r1
deleted file mode 100644
index 13bbe26..0000000
--- a/metadata/md5-cache/chromeos-base/termina-image-amd64-86.13331.0.0.34882-r1
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Add amd64 termina VM to system for testing
-EAPI=7
-KEYWORDS=-* amd64 x86
-LICENSE=BSD-Google
-RDEPEND=!!chromeos-base/termina-image-arm
-RESTRICT=nomirror
-SLOT=0
-SRC_URI=gs://termina-component-testing/uprev-test/amd64/86.13331.0.0.34882/guest-vm-base.tbz -> termina-vm-amd64-86.13331.0.0.34882.tbz
-_md5_=46aa43e85453bbca1dc04ca8bbbcc269
diff --git a/metadata/md5-cache/chromeos-base/termina-image-arm-86.13331.0.0.34882-r1 b/metadata/md5-cache/chromeos-base/termina-image-arm-86.13331.0.0.34882-r1
deleted file mode 100644
index 277a70d..0000000
--- a/metadata/md5-cache/chromeos-base/termina-image-arm-86.13331.0.0.34882-r1
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Add arm termina VM to system for testing
-EAPI=7
-KEYWORDS=-* arm arm64
-LICENSE=BSD-Google
-RDEPEND=!!chromeos-base/termina-image-amd64
-RESTRICT=nomirror
-SLOT=0
-SRC_URI=gs://termina-component-testing/uprev-test/arm/86.13331.0.0.34882/guest-vm-base.tbz -> termina-vm-arm-86.13331.0.0.34882.tbz
-_md5_=c2c6d6041779da9bde187e85882af328
diff --git a/metadata/md5-cache/chromeos-base/termina-pin-85.13308.0.0-r1 b/metadata/md5-cache/chromeos-base/termina-pin-87.13495.0.0-r1
similarity index 100%
rename from metadata/md5-cache/chromeos-base/termina-pin-85.13308.0.0-r1
rename to metadata/md5-cache/chromeos-base/termina-pin-87.13495.0.0-r1
diff --git a/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1 b/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1
index 0f61e6f..17ba16b 100644
--- a/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1
+++ b/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 RDEPEND=x11-themes/cros-adapta >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-debug	d2750757005d6a444f8eb12bb9eb9944	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ca5990ff0471acc38037246e099bbb43
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-debug	d2750757005d6a444f8eb12bb9eb9944	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=404e589c5239c355a4ab9fc1ea6539d1
diff --git a/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r22 b/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r22
deleted file mode 100644
index 0f61e6f..0000000
--- a/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r22
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install
-DEPEND=chromeos-base/chunnel chromeos-base/vm_guest_tools net-libs/grpc:= dev-libs/protobuf:= media-libs/mesa x11-apps/xkbcomp x11-base/xwayland >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-DESCRIPTION=Packages tools for termina VM containers
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
-IUSE=vm_borealis cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=x11-themes/cros-adapta >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-debug	d2750757005d6a444f8eb12bb9eb9944	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ca5990ff0471acc38037246e099bbb43
diff --git a/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r23 b/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r23
new file mode 100644
index 0000000..17ba16b
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/termina_container_tools-0.0.1-r23
@@ -0,0 +1,12 @@
+DEFINED_PHASES=install
+DEPEND=chromeos-base/chunnel chromeos-base/vm_guest_tools net-libs/grpc:= dev-libs/protobuf:= media-libs/mesa x11-apps/xkbcomp x11-base/xwayland >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DESCRIPTION=Packages tools for termina VM containers
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
+IUSE=vm_borealis cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=x11-themes/cros-adapta >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-debug	d2750757005d6a444f8eb12bb9eb9944	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=404e589c5239c355a4ab9fc1ea6539d1
diff --git a/metadata/md5-cache/chromeos-base/thd-0.0.1-r271 b/metadata/md5-cache/chromeos-base/thd-0.0.1-r271
deleted file mode 100644
index cea52f7..0000000
--- a/metadata/md5-cache/chromeos-base/thd-0.0.1-r271
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Thermal Daemon for Chromium OS
-EAPI=5
-HOMEPAGE=http://dev.chromium.org/chromium-os/packages/thd
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f8732f0b77bd53831c8f1f975b4cb5add2dd32aa_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f8732f0b77bd53831c8f1f975b4cb5add2dd32aa_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=12a60e50e2329e34f0765c600b56b481
diff --git a/metadata/md5-cache/chromeos-base/thd-0.0.1-r292 b/metadata/md5-cache/chromeos-base/thd-0.0.1-r292
new file mode 100644
index 0000000..b0c7456
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/thd-0.0.1-r292
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Thermal Daemon for Chromium OS
+EAPI=5
+HOMEPAGE=http://dev.chromium.org/chromium-os/packages/thd
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_42b288435f1e006a7605542a5ff661605993898c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_42b288435f1e006a7605542a5ff661605993898c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=cdfa2bd9eeec498cf386868960ed4704
diff --git a/metadata/md5-cache/chromeos-base/thd-9999 b/metadata/md5-cache/chromeos-base/thd-9999
index ca6c3b4..982444d 100644
--- a/metadata/md5-cache/chromeos-base/thd-9999
+++ b/metadata/md5-cache/chromeos-base/thd-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=75c46430d9519c5ded02a48f6bc33466
diff --git a/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1421 b/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1421
deleted file mode 100644
index bc0c3e8..0000000
--- a/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1421
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=EC log concatenator for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/timberslide/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_641e48c8b5eebd8fca4c9c1a0c1f148f8af2d169_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_641e48c8b5eebd8fca4c9c1a0c1f148f8af2d169_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r1421
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ff8e958f88a7cab231e0fc7825099891
diff --git a/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1454 b/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1454
new file mode 100644
index 0000000..7fa1a4a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/timberslide-0.0.1-r1454
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=EC log concatenator for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/timberslide/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_30ab7670ea92af504dd44c373dd9162c40d2e97b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_30ab7670ea92af504dd44c373dd9162c40d2e97b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r1454
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=98a20d857f71669ea6553537c4559a42
diff --git a/metadata/md5-cache/chromeos-base/timberslide-9999 b/metadata/md5-cache/chromeos-base/timberslide-9999
index cddc8fc..2b7d352 100644
--- a/metadata/md5-cache/chromeos-base/timberslide-9999
+++ b/metadata/md5-cache/chromeos-base/timberslide-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=EC log concatenator for Chromium OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/timberslide/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/metrics:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/re2:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a28184074bbe0d27fd5cf11d21c80924
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2c8ac5d5e1c911ea2f5bba37f8c3b4a1
diff --git a/metadata/md5-cache/chromeos-base/tnull-0.0.1-r11 b/metadata/md5-cache/chromeos-base/tnull-0.0.1-r11
deleted file mode 100644
index 1ad1968..0000000
--- a/metadata/md5-cache/chromeos-base/tnull-0.0.1-r11
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst setup test unpack
-DEPEND=chromeos-base/cros-config-api:= dev-go/luci-common:= dev-lang/go
-DESCRIPTION=Remote Test Driver minimal/fake implementation
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/infra/tnull
-IUSE=cros_host cros_workon_tree_30a6c30a563ee2b37f6a535f21d0b14f1f6bb587
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=51f2ec1b15e8d0289aa4c5ee643f4012
diff --git a/metadata/md5-cache/chromeos-base/tnull-0.0.1-r18 b/metadata/md5-cache/chromeos-base/tnull-0.0.1-r18
new file mode 100644
index 0000000..3e182f0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tnull-0.0.1-r18
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=chromeos-base/cros-config-api:= dev-go/luci-chromeinfra:= dev-go/luci-auth:= dev-go/luci-common:= dev-lang/go
+DESCRIPTION=Remote Test Driver minimal/fake implementation
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/infra/tnull
+IUSE=cros_host cros_workon_tree_5f371b7f3ba13ce37d9eecc725aa94bd0a719de8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8f7e6e7208474d060e23bf6545df89c5
diff --git a/metadata/md5-cache/chromeos-base/tnull-9999 b/metadata/md5-cache/chromeos-base/tnull-9999
index fef7806..757472f 100644
--- a/metadata/md5-cache/chromeos-base/tnull-9999
+++ b/metadata/md5-cache/chromeos-base/tnull-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst setup test unpack
-DEPEND=chromeos-base/cros-config-api:= dev-go/luci-common:= dev-lang/go
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=chromeos-base/cros-config-api:= dev-go/luci-chromeinfra:= dev-go/luci-auth:= dev-go/luci-common:= dev-lang/go
 DESCRIPTION=Remote Test Driver minimal/fake implementation
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/infra/tnull
@@ -9,5 +9,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7c7b3e3f9fd76dfbf463a9f12541358b
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cf23b1943f191e3cbbc918588ec57af4
diff --git a/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3214 b/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3214
deleted file mode 100644
index 8b21e4d..0000000
--- a/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3214
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=Compilation and runtime tests for toolchain
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
-IUSE=cros_host cros_workon_tree_4d74f3ae6800e167ea03dfa972be526663d7ad62
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.0.1-r3214
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=169b0ee51c345f42f46a3f32e4aa3de6
diff --git a/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3777 b/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3777
new file mode 100644
index 0000000..bc01d8c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/toolchain-tests-0.0.1-r3777
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=Compilation and runtime tests for toolchain
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/autotest/
+IUSE=cros_host cros_workon_tree_a9ae1561404f51f9e7b74772a037dcc262bbc625
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r3777
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c2eb4dbe4d81ebb94c071007a3a7a6d4
diff --git a/metadata/md5-cache/chromeos-base/toolchain-tests-9999 b/metadata/md5-cache/chromeos-base/toolchain-tests-9999
index 73d285e..1a30c6f 100644
--- a/metadata/md5-cache/chromeos-base/toolchain-tests-9999
+++ b/metadata/md5-cache/chromeos-base/toolchain-tests-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ae2e5d50ffd97772f75b8f2264154265
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r822 b/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r822
deleted file mode 100644
index 543ea7f..0000000
--- a/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r822
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout virtual/pkgconfig
-DESCRIPTION=Touch Firmware Calibration
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_firmware_calibration/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_16773b61504bd9152bf1f2275505e48b8ed249ad_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_16773b61504bd9152bf1f2275505e48b8ed249ad_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=46a40b178ee2fc1f41eaba0d4d80138d
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r843 b/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r843
new file mode 100644
index 0000000..32f7d21
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/touch_firmware_calibration-0.0.1-r843
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout virtual/pkgconfig
+DESCRIPTION=Touch Firmware Calibration
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_firmware_calibration/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_35feb3e318967769cca1866dd8a39a2a134575f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_35feb3e318967769cca1866dd8a39a2a134575f9_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=4bb019310dfefb4ce442919c224cb54f
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_calibration-9999 b/metadata/md5-cache/chromeos-base/touch_firmware_calibration-9999
index 4883075c..ba40936 100644
--- a/metadata/md5-cache/chromeos-base/touch_firmware_calibration-9999
+++ b/metadata/md5-cache/chromeos-base/touch_firmware_calibration-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=3f2d0d30f67da119cfdb592d8f5d1df9
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r115 b/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r115
deleted file mode 100644
index 2e24d69f..0000000
--- a/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r115
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DESCRIPTION=Chromium OS multitouch utilities
-EAPI=7
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_704507af350e04a2f10980fd26c2876d3b713759 cros-debug python_targets_python2_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3d6936d6e2957d4e1c7c2534419b7d37
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r116 b/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r116
new file mode 100644
index 0000000..6ba7d3c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/touch_firmware_test-0.0.1-r116
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Chromium OS multitouch utilities
+EAPI=7
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_a1c442eb8d5fef00ef538745ac78a9787472995d cros-debug python_targets_python2_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=961b3e3512175a2e4525fb799e820aac
diff --git a/metadata/md5-cache/chromeos-base/touch_firmware_test-9999 b/metadata/md5-cache/chromeos-base/touch_firmware_test-9999
index d61e533..81bd16e 100644
--- a/metadata/md5-cache/chromeos-base/touch_firmware_test-9999
+++ b/metadata/md5-cache/chromeos-base/touch_firmware_test-9999
@@ -9,5 +9,5 @@
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=74bc108cee16e117e5dab9e38a66355c
diff --git a/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1103 b/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1103
deleted file mode 100644
index de75451..0000000
--- a/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1103
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Touch Keyboard
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_keyboard/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_cee80cd0060ac7dec37ae39f39dc0206ebf06aaf_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_cee80cd0060ac7dec37ae39f39dc0206ebf06aaf_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=9ddb88df103813cf0f5fffc6f2695538
diff --git a/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1125 b/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1125
new file mode 100644
index 0000000..20e51c0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/touch_keyboard-0.0.1-r1125
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Touch Keyboard
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/touch_keyboard/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=946e295703d68977b510d9d17d4d04ce
diff --git a/metadata/md5-cache/chromeos-base/touch_keyboard-9999 b/metadata/md5-cache/chromeos-base/touch_keyboard-9999
index 5e478b5..de033b2 100644
--- a/metadata/md5-cache/chromeos-base/touch_keyboard-9999
+++ b/metadata/md5-cache/chromeos-base/touch_keyboard-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=684dd5cf4aaffc4207bf0df6531e7b6c
diff --git a/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r185 b/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r185
deleted file mode 100644
index f217f68..0000000
--- a/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r185
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install preinst setup unpack
-DEPEND=sys-apps/baselayout
-DESCRIPTION=Touch firmware and config updater
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os
-IUSE=input_devices_synaptics input_devices_wacom input_devices_etphidiap input_devices_st input_devices_st_touchscreen input_devices_weida input_devices_goodix input_devices_sis input_devices_pixart input_devices_g2touch input_devices_cirque input_devices_elan_i2chid input_devices_melfas input_devices_emright cros_host cros_workon_tree_9412f6490b0cc7b58bf14d34989090508b0c4252_734aeea3130db597bd01c5b72f06a46d82c09771
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/chromeos-touch-common input_devices_synaptics? ( chromeos-base/rmi4utils ) input_devices_wacom? ( chromeos-base/wacom_fw_flash ) input_devices_etphidiap? ( chromeos-base/chromeos-touch-etphidiap ) input_devices_st? ( chromeos-base/st_flash ) input_devices_st_touchscreen? ( chromeos-base/chromeos-touch-stupdate ) input_devices_weida? ( chromeos-base/weida_wdt_util ) input_devices_goodix? ( chromeos-base/gdix_hid_firmware_update ) input_devices_sis? ( chromeos-base/sisConsoletool ) input_devices_pixart? ( chromeos-base/pixart_tpfwup ) input_devices_g2touch? ( chromeos-base/g2update_tool ) input_devices_cirque? ( chromeos-base/cirque_fw_update ) input_devices_elan_i2chid? ( chromeos-base/elan_i2chid_tools ) input_devices_melfas? ( chromeos-base/mfs-console-tool ) input_devices_emright? ( chromeos-base/emright_fw_updater ) sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=1780009541d5902d53a8c33c3d85a793
diff --git a/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r189 b/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r189
new file mode 100644
index 0000000..226cc84
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/touch_updater-0.0.1-r189
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install preinst setup unpack
+DEPEND=sys-apps/baselayout
+DESCRIPTION=Touch firmware and config updater
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os
+IUSE=input_devices_synaptics input_devices_wacom input_devices_etphidiap input_devices_st input_devices_st_touchscreen input_devices_weida input_devices_goodix input_devices_sis input_devices_pixart input_devices_g2touch input_devices_cirque input_devices_elan_i2chid input_devices_melfas input_devices_emright cros_host cros_workon_tree_9412f6490b0cc7b58bf14d34989090508b0c4252_8ee6c587eca8fad957dcf50ac6b70c50d9037c61
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/chromeos-touch-common input_devices_synaptics? ( chromeos-base/rmi4utils ) input_devices_wacom? ( chromeos-base/wacom_fw_flash ) input_devices_etphidiap? ( chromeos-base/chromeos-touch-etphidiap ) input_devices_st? ( chromeos-base/st_flash ) input_devices_st_touchscreen? ( chromeos-base/chromeos-touch-stupdate ) input_devices_weida? ( chromeos-base/weida_wdt_util ) input_devices_goodix? ( chromeos-base/gdix_hid_firmware_update ) input_devices_sis? ( chromeos-base/sisConsoletool ) input_devices_pixart? ( chromeos-base/pixart_tpfwup ) input_devices_g2touch? ( chromeos-base/g2update_tool ) input_devices_cirque? ( chromeos-base/cirque_fw_update ) input_devices_elan_i2chid? ( chromeos-base/elan_i2chid_tools ) input_devices_melfas? ( chromeos-base/mfs-console-tool ) input_devices_emright? ( chromeos-base/emright_fw_updater ) sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d4ad212aa4eb34fcf46609d7b818984c
diff --git a/metadata/md5-cache/chromeos-base/touch_updater-9999 b/metadata/md5-cache/chromeos-base/touch_updater-9999
index 79604dc..7c035c2 100644
--- a/metadata/md5-cache/chromeos-base/touch_updater-9999
+++ b/metadata/md5-cache/chromeos-base/touch_updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-touch-common input_devices_synaptics? ( chromeos-base/rmi4utils ) input_devices_wacom? ( chromeos-base/wacom_fw_flash ) input_devices_etphidiap? ( chromeos-base/chromeos-touch-etphidiap ) input_devices_st? ( chromeos-base/st_flash ) input_devices_st_touchscreen? ( chromeos-base/chromeos-touch-stupdate ) input_devices_weida? ( chromeos-base/weida_wdt_util ) input_devices_goodix? ( chromeos-base/gdix_hid_firmware_update ) input_devices_sis? ( chromeos-base/sisConsoletool ) input_devices_pixart? ( chromeos-base/pixart_tpfwup ) input_devices_g2touch? ( chromeos-base/g2update_tool ) input_devices_cirque? ( chromeos-base/cirque_fw_update ) input_devices_elan_i2chid? ( chromeos-base/elan_i2chid_tools ) input_devices_melfas? ( chromeos-base/mfs-console-tool ) input_devices_emright? ( chromeos-base/emright_fw_updater ) sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=0f403ff1b1c8fd8bc31c3ad820ac85d5
diff --git a/metadata/md5-cache/chromeos-base/tpm-0.0.1-r17 b/metadata/md5-cache/chromeos-base/tpm-0.0.1-r17
index f6ec5a6..b69287d 100644
--- a/metadata/md5-cache/chromeos-base/tpm-0.0.1-r17
+++ b/metadata/md5-cache/chromeos-base/tpm-0.0.1-r17
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-crypt/trousers:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d34f3a150e311f2eb2394f497013928a
diff --git a/metadata/md5-cache/chromeos-base/tpm-9999 b/metadata/md5-cache/chromeos-base/tpm-9999
index d6e0493..1136c1e 100644
--- a/metadata/md5-cache/chromeos-base/tpm-9999
+++ b/metadata/md5-cache/chromeos-base/tpm-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-crypt/trousers:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f4d306e226a82704f5c61b62a26f4d70
diff --git a/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1823 b/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1823
deleted file mode 100644
index 5447ae2..0000000
--- a/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1823
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=tpm check test
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
-IUSE=+autotest +tests_hardware_TPMCheck cros_host cros_workon_tree_82e77f6c98187361303fffeeba118a1a365e16d5 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0/0.0.1-r1823
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=031b33cd11b2024f53b90876df6446d5
diff --git a/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1872 b/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1872
new file mode 100644
index 0000000..534d549
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm-check-0.0.1-r1872
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=tpm check test
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
+IUSE=+autotest +tests_hardware_TPMCheck cros_host cros_workon_tree_d011d454951af2d6dbcf7d4dc7af53a31cc883db +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0/0.0.1-r1872
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=511b8e348104a2afa9fd35a1e9306da0
diff --git a/metadata/md5-cache/chromeos-base/tpm-check-9999 b/metadata/md5-cache/chromeos-base/tpm-check-9999
index 803a569..3df466a 100644
--- a/metadata/md5-cache/chromeos-base/tpm-check-9999
+++ b/metadata/md5-cache/chromeos-base/tpm-check-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0/9999
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6f9612d32297b8c376d94aa08b0b40b1
diff --git a/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1843 b/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1843
deleted file mode 100644
index cd49e55..0000000
--- a/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1843
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DEPEND=app-crypt/trousers:= chromeos-base/tpm:=
-DESCRIPTION=TPM firmware tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
-IUSE=+autotest +tests_hardware_TPMFirmware +tests_hardware_TPMFirmwareServer cros_host cros_workon_tree_82e77f6c98187361303fffeeba118a1a365e16d5 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0/0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8b751a67dcb92be105c19cf4962a686e
diff --git a/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1892 b/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1892
new file mode 100644
index 0000000..5a4a708
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm-firmware-tests-0.0.1-r1892
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DEPEND=app-crypt/trousers:= chromeos-base/tpm:=
+DESCRIPTION=TPM firmware tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
+IUSE=+autotest +tests_hardware_TPMFirmware +tests_hardware_TPMFirmwareServer cros_host cros_workon_tree_d011d454951af2d6dbcf7d4dc7af53a31cc883db +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0/0
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=14e9b36d158025d4b890712a1089c85a
diff --git a/metadata/md5-cache/chromeos-base/tpm-firmware-tests-9999 b/metadata/md5-cache/chromeos-base/tpm-firmware-tests-9999
index 223e797..274eab6 100644
--- a/metadata/md5-cache/chromeos-base/tpm-firmware-tests-9999
+++ b/metadata/md5-cache/chromeos-base/tpm-firmware-tests-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0/0
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=69e670cc784c4b3a24afc05332fa1bc2
diff --git a/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r125 b/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r125
deleted file mode 100644
index 066122e..0000000
--- a/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r125
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=dev-libs/openssl:0=
-DESCRIPTION=TPM2.0 library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tpm2/
-IUSE=cros_host cros_workon_tree_f70af34770002df8ef3951dfdf5a6c18d42a5dda
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0.0.1-r125
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bc801cd5fb31f0a757c067648a9a7577
diff --git a/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r129 b/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r129
new file mode 100644
index 0000000..4b0a152
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm2-0.0.1-r129
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=dev-libs/openssl:0=
+DESCRIPTION=TPM2.0 library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tpm2/
+IUSE=tpm2_simulator tpm2_simulator_manufacturer cros_host cros_workon_tree_8e2ebe98fade4195aac74d52d0647b116b0165c5
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r129
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=846f1169a9a3eeb6d57650ed3108f305
diff --git a/metadata/md5-cache/chromeos-base/tpm2-9999 b/metadata/md5-cache/chromeos-base/tpm2-9999
index ed3156f..a27c730 100644
--- a/metadata/md5-cache/chromeos-base/tpm2-9999
+++ b/metadata/md5-cache/chromeos-base/tpm2-9999
@@ -4,10 +4,10 @@
 DESCRIPTION=TPM2.0 library
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tpm2/
-IUSE=cros_host cros_workon_tree_
+IUSE=tpm2_simulator tpm2_simulator_manufacturer cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f44dc9555e4b67cef259903a54b9a9c1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b607dc1a55944e9b238baafe54fd50ae
diff --git a/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1737 b/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1737
deleted file mode 100644
index 7148dc5..0000000
--- a/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1737
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/tpm2:= dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=TPM 2.0 Simulator
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm2-simulator/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f65df9ea12cf8d07e49d6bc7a84c89ff50a077b8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f65df9ea12cf8d07e49d6bc7a84c89ff50a077b8_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=dd771c5c5946886b31dadf9bbca91184
diff --git a/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1758 b/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1758
new file mode 100644
index 0000000..f115a38
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm2-simulator-0.0.1-r1758
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/tpm2:= dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=TPM 2.0 Simulator
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm2-simulator/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_122dcf94739d2143609ba6ddc05a199e3fc3a713_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_122dcf94739d2143609ba6ddc05a199e3fc3a713_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=638f0ff9313e32c806e07dfd36a89178
diff --git a/metadata/md5-cache/chromeos-base/tpm2-simulator-9999 b/metadata/md5-cache/chromeos-base/tpm2-simulator-9999
index 576511b..bb12934e 100644
--- a/metadata/md5-cache/chromeos-base/tpm2-simulator-9999
+++ b/metadata/md5-cache/chromeos-base/tpm2-simulator-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/openssl:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=765545df909a8b9e993df0018920b418
diff --git a/metadata/md5-cache/chromeos-base/tpm_lite-0.0.1-r16 b/metadata/md5-cache/chromeos-base/tpm_lite-0.0.1-r16
index 5706761..d2871aa 100644
--- a/metadata/md5-cache/chromeos-base/tpm_lite-0.0.1-r16
+++ b/metadata/md5-cache/chromeos-base/tpm_lite-0.0.1-r16
@@ -9,5 +9,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=dd72d8a77505999e183e54ac232a0bef
diff --git a/metadata/md5-cache/chromeos-base/tpm_lite-9999 b/metadata/md5-cache/chromeos-base/tpm_lite-9999
index 7a64f61..addabb7 100644
--- a/metadata/md5-cache/chromeos-base/tpm_lite-9999
+++ b/metadata/md5-cache/chromeos-base/tpm_lite-9999
@@ -9,5 +9,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=99b461cb781faa53987b05ac0a189d2c
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2023 b/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2023
deleted file mode 100644
index 08f77c2..0000000
--- a/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2023
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) chromeos-base/metrics chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto tpm2? ( chromeos-base/trunks[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Daemon to manage TPM ownership.
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/
-IUSE=distributed_cryptohome test tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_7e189936f29d145c4191ea147e48256c92fac75d_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_c95b7c2c34a5b6e497150c6d30abbd5a1928f3d4_7e189936f29d145c4191ea147e48256c92fac75d_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live
-RDEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) chromeos-base/metrics chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=726b7a5f873a6c26851a3c3080720c92
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2076 b/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2076
new file mode 100644
index 0000000..c95991f
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm_manager-0.0.1-r2076
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) >=chromeos-base/metrics-0.0.1-r3152 chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto tpm2? ( chromeos-base/trunks[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Daemon to manage TPM ownership.
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/
+IUSE=test tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_d8479ac4f3bc0cc18815ff1d440dc3abd761db42_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live
+RDEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) >=chromeos-base/metrics-0.0.1-r3152 chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=1ff5c04dc61dfb82982e593137879014
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-9999 b/metadata/md5-cache/chromeos-base/tpm_manager-9999
index a63e88c..8610376 100644
--- a/metadata/md5-cache/chromeos-base/tpm_manager-9999
+++ b/metadata/md5-cache/chromeos-base/tpm_manager-9999
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) chromeos-base/metrics chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto tpm2? ( chromeos-base/trunks[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) >=chromeos-base/metrics-0.0.1-r3152 chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto tpm2? ( chromeos-base/trunks[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Daemon to manage TPM ownership.
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/
-IUSE=distributed_cryptohome test tpm tpm2 cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=test tpm tpm2 cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=Apache-2.0
 PROPERTIES=live live
-RDEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) chromeos-base/metrics chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=!tpm2? ( app-crypt/trousers ) tpm2? ( chromeos-base/trunks ) >=chromeos-base/metrics-0.0.1-r3152 chromeos-base/minijail chromeos-base/libhwsec chromeos-base/libtpmcrypto >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=5f08fafd67273b6c26d147f63373ba5d
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=820d46846a25b59b712579ca96c59f3f
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r140 b/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r140
deleted file mode 100644
index 4ec171d..0000000
--- a/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r140
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 ) chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=TPM Manager D-Bus client library for Chromium OS
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/client/
-IUSE=cros_host cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_dae00c69637e0e94b3ccfca22c7ecb62d4f63675_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/tpm_manager-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1a37e09b0a6219505154faec2d7df93c
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r168 b/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r168
new file mode 100644
index 0000000..4603b34
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm_manager-client-0.0.1-r168
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( >=chromeos-base/chromeos-dbus-bindings-0.0.1-r1058 ) chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=TPM Manager D-Bus client library for Chromium OS
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_manager/client/
+IUSE=cros_host cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_edc7cb44d79ffd2cc72fbe7b6b0ef1bc1505d01e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/tpm_manager-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6f9950c134d8212f19a762c61b01e1dc
diff --git a/metadata/md5-cache/chromeos-base/tpm_manager-client-9999 b/metadata/md5-cache/chromeos-base/tpm_manager-client-9999
index 78eb04c..e099674 100644
--- a/metadata/md5-cache/chromeos-base/tpm_manager-client-9999
+++ b/metadata/md5-cache/chromeos-base/tpm_manager-client-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/tpm_manager-0.0.1 chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71cda314d41d4b44b1f501f4b413a976
diff --git a/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r125 b/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r125
deleted file mode 100644
index 2521fad..0000000
--- a/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r125
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/system_api:= chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utilities for soft-clearing TPM. This package resides in test images only.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_softclear_utils/
-IUSE=test tpm tpm2 cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_00290142c5b4f52d8b56f0ad856b3870dcf17fef_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_00290142c5b4f52d8b56f0ad856b3870dcf17fef_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-REQUIRED_USE=tpm2? ( !tpm )
-SLOT=0/0.0.1-r125
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=99207ed46fc32a903b22d2a530e06848
diff --git a/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r155 b/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r155
new file mode 100644
index 0000000..76b0c4d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tpm_softclear_utils-0.0.1-r155
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) tpm2? ( chromeos-base/system_api:= chromeos-base/trunks:=[test?] ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utilities for soft-clearing TPM. This package resides in test images only.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/tpm_softclear_utils/
+IUSE=test tpm tpm2 cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_19d0eae21d9d6d9902ab4b843257f1a54986088c_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_19d0eae21d9d6d9902ab4b843257f1a54986088c_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+REQUIRED_USE=tpm2? ( !tpm )
+SLOT=0/0.0.1-r155
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=56e638b3d6026d76e24c242659706aa7
diff --git a/metadata/md5-cache/chromeos-base/tpm_softclear_utils-9999 b/metadata/md5-cache/chromeos-base/tpm_softclear_utils-9999
index 7d181fc..8a15513 100644
--- a/metadata/md5-cache/chromeos-base/tpm_softclear_utils-9999
+++ b/metadata/md5-cache/chromeos-base/tpm_softclear_utils-9999
@@ -11,5 +11,5 @@
 RDEPEND=tpm2? ( chromeos-base/trunks:= ) !tpm2? ( app-crypt/trousers:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 REQUIRED_USE=tpm2? ( !tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b31be778702e835ae57e6ae194941051
diff --git a/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r109 b/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r109
deleted file mode 100644
index b2aefab..0000000
--- a/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r109
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst setup test unpack
-DEPEND=app-emulation/lxd:= chromeos-base/vm_guest_tools:= chromeos-base/vm_protos:= dev-go/go-libaudit:= dev-go/go-sys:= dev-go/grpc:= dev-go/kobject:= dev-go/netlink:= dev-go/vsock:= dev-go/yaml:= dev-lang/go
-DESCRIPTION=Tremplin LXD client with gRPC support
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tremplin/
-IUSE=cros_host cros_workon_tree_33b4ba2e11b02d9ac7dde37a416528aa957af46b
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-emulation/lxd:=
-SLOT=0/0.0.1-r109
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ae4d13ab0962fccb32193a900d0a3902
diff --git a/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r120 b/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r120
new file mode 100644
index 0000000..d0b80c5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/tremplin-0.0.1-r120
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst setup test unpack
+DEPEND=app-emulation/lxd:= chromeos-base/vm_guest_tools:= chromeos-base/vm_protos:= dev-go/go-libaudit:= dev-go/go-sys:= dev-go/grpc:= dev-go/kobject:= dev-go/netlink:= dev-go/vsock:= dev-go/yaml:= dev-lang/go
+DESCRIPTION=Tremplin LXD client with gRPC support
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/tremplin/
+IUSE=cros_host cros_workon_tree_4a645c42ca3cfa90ceaa768402ec0fbf6cf43658
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-emulation/lxd:=
+SLOT=0/0.0.1-r120
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b0ac59d150ad031f93891bcb86b0327b
diff --git a/metadata/md5-cache/chromeos-base/tremplin-9999 b/metadata/md5-cache/chromeos-base/tremplin-9999
index c1b9b2b..0995b48 100644
--- a/metadata/md5-cache/chromeos-base/tremplin-9999
+++ b/metadata/md5-cache/chromeos-base/tremplin-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=app-emulation/lxd:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2ba8e4936c284542fb571d1fd1b60ecb
diff --git a/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2811 b/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2811
deleted file mode 100644
index 2863f88..0000000
--- a/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2811
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/minijail:= chromeos-base/power_manager-client:= ftdi_tpm? ( dev-embedded/libftdi:= ) tpm2_simulator? ( chromeos-base/tpm2:= ) dev-libs/protobuf:= fuzzer? ( dev-cpp/gtest:= ) chromeos-base/chromeos-ec-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Trunks service for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trunks/
-IUSE=cr50_onboard fuzzer ftdi_tpm test tpm2_simulator cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1bf01f1a340a50edee0e82b52621117c8388644c_9fd99bf51279bfd5841cde5997f0379182410b03_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live
-RDEPEND=chromeos-base/minijail:= chromeos-base/power_manager-client:= ftdi_tpm? ( dev-embedded/libftdi:= ) tpm2_simulator? ( chromeos-base/tpm2:= ) dev-libs/protobuf:= fuzzer? ( dev-cpp/gtest:= ) cr50_onboard? ( chromeos-base/chromeos-cr50 ) !app-crypt/tpm-tools chromeos-base/libhwsec >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2811
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=7c63e1222cd0daa0dbb5c88ca4569c5e
diff --git a/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2843 b/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2843
new file mode 100644
index 0000000..c06904c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/trunks-0.0.1-r2843
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/minijail:= chromeos-base/power_manager-client:= ftdi_tpm? ( dev-embedded/libftdi:= ) tpm2_simulator? ( chromeos-base/tpm2:= ) dev-libs/protobuf:= fuzzer? ( dev-cpp/gtest:= ) chromeos-base/chromeos-ec-headers:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Trunks service for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trunks/
+IUSE=cr50_onboard fuzzer ftdi_tpm test tpm2_simulator cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_59ded4c8a6ec924cce82ba942070e51132ca1161_e8a973464784e588992988988eb26cfa0cf5f67b_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live
+RDEPEND=chromeos-base/minijail:= chromeos-base/power_manager-client:= ftdi_tpm? ( dev-embedded/libftdi:= ) tpm2_simulator? ( chromeos-base/tpm2:= ) dev-libs/protobuf:= fuzzer? ( dev-cpp/gtest:= ) cr50_onboard? ( chromeos-base/chromeos-cr50 ) !app-crypt/tpm-tools chromeos-base/libhwsec >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r2843
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=c899eabdccdca0fb61a726e9c35977fd
diff --git a/metadata/md5-cache/chromeos-base/trunks-9999 b/metadata/md5-cache/chromeos-base/trunks-9999
index 0d0850a..5b3f931 100644
--- a/metadata/md5-cache/chromeos-base/trunks-9999
+++ b/metadata/md5-cache/chromeos-base/trunks-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/minijail:= chromeos-base/power_manager-client:= ftdi_tpm? ( dev-embedded/libftdi:= ) tpm2_simulator? ( chromeos-base/tpm2:= ) dev-libs/protobuf:= fuzzer? ( dev-cpp/gtest:= ) cr50_onboard? ( chromeos-base/chromeos-cr50 ) !app-crypt/tpm-tools chromeos-base/libhwsec >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=e6f3a63219bae481d2de4665ead02eea
diff --git a/metadata/md5-cache/chromeos-base/typecd-0.0.1-r24 b/metadata/md5-cache/chromeos-base/typecd-0.0.1-r24
deleted file mode 100644
index de21868..0000000
--- a/metadata/md5-cache/chromeos-base/typecd-0.0.1-r24
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Chrome OS USB Type C daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/typecd/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f3c3e81430aaee7361f2701b718ba3af9f201a7e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_f3c3e81430aaee7361f2701b718ba3af9f201a7e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=908366bafb0f8225a591acd536e3cbd5
diff --git a/metadata/md5-cache/chromeos-base/typecd-0.0.1-r57 b/metadata/md5-cache/chromeos-base/typecd-0.0.1-r57
new file mode 100644
index 0000000..c381e30
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/typecd-0.0.1-r57
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Chrome OS USB Type C daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/typecd/
+IUSE=+seccomp cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_555469a5e41621f091ace429fc9819cc99bb1a37_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_555469a5e41621f091ace429fc9819cc99bb1a37_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=9d3540f0000efc508a89e35edfc522ac
diff --git a/metadata/md5-cache/chromeos-base/typecd-9999 b/metadata/md5-cache/chromeos-base/typecd-9999
index 59c53af..3bf87f8 100644
--- a/metadata/md5-cache/chromeos-base/typecd-9999
+++ b/metadata/md5-cache/chromeos-base/typecd-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=Chrome OS USB Type C daemon
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/typecd/
-IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=+seccomp cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=b3b8809c6e1b539126c94b69e4ee9923
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=abf2747a2f118f5e53d3e517b05a3b7f
diff --git a/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r923 b/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r923
deleted file mode 100644
index 97b6e1d..0000000
--- a/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r923
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= chromeos-base/metrics:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= chromeos-base/attestation-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=U2FHID Emulation Daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fhid
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9fd99bf51279bfd5841cde5997f0379182410b03_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_614157b36aa6196f7a410a5164c92b44cdd4e1ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_9fd99bf51279bfd5841cde5997f0379182410b03_1bf01f1a340a50edee0e82b52621117c8388644c_7e189936f29d145c4191ea147e48256c92fac75d_614157b36aa6196f7a410a5164c92b44cdd4e1ae_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= chromeos-base/metrics:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r923
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=64ec7d3418cc4d159ac26c0ff8332bf6
diff --git a/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r982 b/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r982
new file mode 100644
index 0000000..a2fa175
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/u2fd-0.0.1-r982
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= chromeos-base/attestation-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=U2FHID Emulation Daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fhid
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e8a973464784e588992988988eb26cfa0cf5f67b_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_455c68aebdef50de586de3bdbacfe923077cd697_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e8a973464784e588992988988eb26cfa0cf5f67b_59ded4c8a6ec924cce82ba942070e51132ca1161_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_455c68aebdef50de586de3bdbacfe923077cd697_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r982
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=2799558687cc3ff99b7c4a072dad5a0a
diff --git a/metadata/md5-cache/chromeos-base/u2fd-9999 b/metadata/md5-cache/chromeos-base/u2fd-9999
index 6a1c5ad..7a33a19 100644
--- a/metadata/md5-cache/chromeos-base/u2fd-9999
+++ b/metadata/md5-cache/chromeos-base/u2fd-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= chromeos-base/metrics:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= chromeos-base/attestation-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= chromeos-base/attestation-client:= chromeos-base/system_api:=[fuzzer?] >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=U2FHID Emulation Daemon
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/u2fhid
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= chromeos-base/metrics:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=chromeos-base/attestation:= chromeos-base/attestation-client:= chromeos-base/cbor:= chromeos-base/libhwsec:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/power_manager-client:= chromeos-base/trunks:= dev-libs/hidapi:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=74e0bc4b29bb670c0bd6d2bbb8a38e9b
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=811d92e90253b027438c70d31dd90fbc
diff --git a/metadata/md5-cache/chromeos-base/uboot-env-0.0.1-r7 b/metadata/md5-cache/chromeos-base/uboot-env-0.0.1-r7
index f370163..adec9e7 100644
--- a/metadata/md5-cache/chromeos-base/uboot-env-0.0.1-r7
+++ b/metadata/md5-cache/chromeos-base/uboot-env-0.0.1-r7
@@ -7,5 +7,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-lang/python-2.5
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2248d46d1988f3820cfd494c80b9ae65
diff --git a/metadata/md5-cache/chromeos-base/uboot-env-9999 b/metadata/md5-cache/chromeos-base/uboot-env-9999
index 201b9ab..1c060c3 100644
--- a/metadata/md5-cache/chromeos-base/uboot-env-9999
+++ b/metadata/md5-cache/chromeos-base/uboot-env-9999
@@ -7,5 +7,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-lang/python-2.5
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4a77a3812c799788523a6b02685e4272
diff --git a/metadata/md5-cache/chromeos-base/update-utils-0.0.1-r39 b/metadata/md5-cache/chromeos-base/update-utils-0.0.1-r39
index 354b367..2076b2e 100644
--- a/metadata/md5-cache/chromeos-base/update-utils-0.0.1-r39
+++ b/metadata/md5-cache/chromeos-base/update-utils-0.0.1-r39
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!chromeos-base/gmerge
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e002d4add63eab26c150c2648b4ea570
diff --git a/metadata/md5-cache/chromeos-base/update-utils-9999 b/metadata/md5-cache/chromeos-base/update-utils-9999
index a42ad27..baa6653 100644
--- a/metadata/md5-cache/chromeos-base/update-utils-9999
+++ b/metadata/md5-cache/chromeos-base/update-utils-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!chromeos-base/gmerge
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=48773ed60e96b88f0c4169bfecce31de
diff --git a/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3572 b/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3572
deleted file mode 100644
index dd4f173..0000000
--- a/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3572
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-arch/xz-utils:= chromeos-base/debugd-client:= dlc? ( chromeos-base/dlcservice-client:= ) chromeos-base/power_manager-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/update_engine-client:= sys-fs/e2fsprogs:= test? ( sys-fs/squashfs-tools:= ) app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= chromeos-base/metrics:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS Update Engine
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine/
-IUSE=cfm cros_p2p +dbus dlc fuzzer -hwid_override +power_management systemd cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_a9cad6253f307e9e129fa4dd846f45ebf5c1258e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_a9cad6253f307e9e129fa4dd846f45ebf5c1258e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-installer app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= chromeos-base/metrics:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= cros_host? ( app-arch/unzip app-arch/xz-utils app-shells/bash dev-util/shflags sys-fs/e2fsprogs sys-fs/squashfs-tools ) power_management? ( chromeos-base/power_manager ) virtual/update-policy >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.3-r3572
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ef95c721385e44fe8571f29bdcf79fbd
diff --git a/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3621 b/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3621
new file mode 100644
index 0000000..620718d
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/update_engine-0.0.3-r3621
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=app-arch/xz-utils:= chromeos-base/debugd-client:= dlc? ( chromeos-base/dlcservice-client:= ) chromeos-base/power_manager-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/update_engine-client:= test? ( sys-fs/squashfs-tools ) app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS Update Engine
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine/
+IUSE=cfm cros_p2p +dbus dlc fuzzer -hwid_override +power_management systemd cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f9324fe348633417d3004c17be2faf5e350d309a cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f9324fe348633417d3004c17be2faf5e350d309a cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live
+RDEPEND=chromeos-base/chromeos-installer app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= cros_host? ( app-arch/unzip:= app-arch/xz-utils:= sys-libs/e2fsprogs-libs:= sys-fs/squashfs-tools ) power_management? ( chromeos-base/power_manager:= ) virtual/update-policy:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.3-r3621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e4e238d76938ae3410953eedef4d65d7
diff --git a/metadata/md5-cache/chromeos-base/update_engine-9999 b/metadata/md5-cache/chromeos-base/update_engine-9999
index cae8272..a8f99ea 100644
--- a/metadata/md5-cache/chromeos-base/update_engine-9999
+++ b/metadata/md5-cache/chromeos-base/update_engine-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=app-arch/xz-utils:= chromeos-base/debugd-client:= dlc? ( chromeos-base/dlcservice-client:= ) chromeos-base/power_manager-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/update_engine-client:= sys-fs/e2fsprogs:= test? ( sys-fs/squashfs-tools:= ) app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= chromeos-base/metrics:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=app-arch/xz-utils:= chromeos-base/debugd-client:= dlc? ( chromeos-base/dlcservice-client:= ) chromeos-base/power_manager-client:= chromeos-base/session_manager-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/update_engine-client:= test? ( sys-fs/squashfs-tools ) app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Chrome OS Update Engine
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=Apache-2.0
 PROPERTIES=live live
-RDEPEND=chromeos-base/chromeos-installer app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= chromeos-base/metrics:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= cros_host? ( app-arch/unzip app-arch/xz-utils app-shells/bash dev-util/shflags sys-fs/e2fsprogs sys-fs/squashfs-tools ) power_management? ( chromeos-base/power_manager ) virtual/update-policy >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=chromeos-base/chromeos-installer app-arch/bzip2:= chromeos-base/chromeos-ca-certificates:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/vboot_reference:= cros_p2p? ( chromeos-base/p2p:= ) dev-libs/expat:= dev-libs/openssl:= dev-libs/protobuf:= dev-libs/xz-embedded:= dev-util/bsdiff:= dev-util/puffin:= net-misc/curl:= sys-apps/rootdev:= cros_host? ( app-arch/unzip:= app-arch/xz-utils:= sys-libs/e2fsprogs-libs:= sys-fs/squashfs-tools ) power_management? ( chromeos-base/power_manager:= ) virtual/update-policy:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7acdca5a99877bd8167264418e2fc717
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=eafcaf5332d2d0a6ada370c2420cc304
diff --git a/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1725 b/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1725
deleted file mode 100644
index 27c0e0a..0000000
--- a/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1725
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS Update Engine client library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine/
-IUSE=cros_host cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_a9cad6253f307e9e129fa4dd846f45ebf5c1258e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_a9cad6253f307e9e129fa4dd846f45ebf5c1258e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!<chromeos-base/update_engine-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6cb5ad0c81cbb37d8dffe3c1476fcf01
diff --git a/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1769 b/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1769
new file mode 100644
index 0000000..a9e21eb
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/update_engine-client-0.0.1-r1769
@@ -0,0 +1,14 @@
+BDEPEND=chromeos-base/chromeos-dbus-bindings:= dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS Update Engine client library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine/
+IUSE=cros_host cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f9324fe348633417d3004c17be2faf5e350d309a cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_f9324fe348633417d3004c17be2faf5e350d309a cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!<chromeos-base/update_engine-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ac76f667bb355f113f6888add01aa8ee
diff --git a/metadata/md5-cache/chromeos-base/update_engine-client-9999 b/metadata/md5-cache/chromeos-base/update_engine-client-9999
index 6e8754e..716f9d6 100644
--- a/metadata/md5-cache/chromeos-base/update_engine-client-9999
+++ b/metadata/md5-cache/chromeos-base/update_engine-client-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=!<chromeos-base/update_engine-0.0.3 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=495a07469752b00d229bff56527b7a53
diff --git a/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r273 b/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r273
deleted file mode 100644
index d7e5605..0000000
--- a/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r273
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup test unpack
-DESCRIPTION=Chrome OS Update Engine Update Payload Scripts
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine
-IUSE=cros_host cros_workon_tree_a9cad6253f307e9e129fa4dd846f45ebf5c1258e python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live
-RDEPEND=dev-python/protobuf-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/devserver-0.0.3
-SLOT=0/0.0.1-r273
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1c1220e7edefc3027e6f521f0085f4c3
diff --git a/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r297 b/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r297
new file mode 100644
index 0000000..3d9de53c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/update_payload-0.0.1-r297
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup test unpack
+DESCRIPTION=Chrome OS Update Engine Update Payload Scripts
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/aosp/platform/system/update_engine
+IUSE=cros_host cros_workon_tree_f9324fe348633417d3004c17be2faf5e350d309a python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live
+RDEPEND=dev-python/protobuf-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/devserver-0.0.3
+SLOT=0/0.0.1-r297
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a0bf3af5d2a1a93728c2c75531c1a49e
diff --git a/metadata/md5-cache/chromeos-base/update_payload-9999 b/metadata/md5-cache/chromeos-base/update_payload-9999
index fe4f1df..866f47d 100644
--- a/metadata/md5-cache/chromeos-base/update_payload-9999
+++ b/metadata/md5-cache/chromeos-base/update_payload-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-python/protobuf-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] !<chromeos-base/devserver-0.0.3
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d08e5584b193fc1b92f7cf0e142b59d7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fa018b48923094b7d53e7becd08a7286
diff --git a/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r29 b/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r29
deleted file mode 100644
index 6c21c38..0000000
--- a/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r29
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Calculate common part and difference of two ureadahead packs
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ureadahead-diff
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8ef967d6ac3f68de68c966e7444fadf17031900d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_8ef967d6ac3f68de68c966e7444fadf17031900d_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=881c39ce1613991e323c9b6e556b7238
diff --git a/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r50 b/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r50
new file mode 100644
index 0000000..374c695
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/ureadahead-diff-0.0.1-r50
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Calculate common part and difference of two ureadahead packs
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/ureadahead-diff
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d8726112ed4bb883ce30b46d2c19edf480bd7acb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_d8726112ed4bb883ce30b46d2c19edf480bd7acb_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=95b35ac3aa418133e48c9fdd143e9486
diff --git a/metadata/md5-cache/chromeos-base/ureadahead-diff-9999 b/metadata/md5-cache/chromeos-base/ureadahead-diff-9999
index 5b62894..b59697d 100644
--- a/metadata/md5-cache/chromeos-base/ureadahead-diff-9999
+++ b/metadata/md5-cache/chromeos-base/ureadahead-diff-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5dae247b1575c379190acac83cc6c378
diff --git a/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r214 b/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r214
deleted file mode 100644
index 9fa3803..0000000
--- a/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r214
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= chromeos-base/session_manager-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=Manage the usbguard whitelist
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/usb_bouncer/
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_17a8f969c731702042176cf629f5dd324c906ff0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_17a8f969c731702042176cf629f5dd324c906ff0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=bd101c999db39b2bb422eb63a4a8ab07
diff --git a/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r247 b/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r247
new file mode 100644
index 0000000..3ea9ce5
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/usb_bouncer-0.0.1-r247
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= chromeos-base/session_manager-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=Manage the usbguard whitelist
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/usb_bouncer/
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_da917b0bbacaf6c0a525a8f2b4dcd720cf338c7f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_da917b0bbacaf6c0a525a8f2b4dcd720cf338c7f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=30b61b7c305525e2c64729c4509ed5f9
diff --git a/metadata/md5-cache/chromeos-base/usb_bouncer-9999 b/metadata/md5-cache/chromeos-base/usb_bouncer-9999
index 9405d44..8ebd853 100644
--- a/metadata/md5-cache/chromeos-base/usb_bouncer-9999
+++ b/metadata/md5-cache/chromeos-base/usb_bouncer-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= chromeos-base/session_manager-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= chromeos-base/session_manager-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=Manage the usbguard whitelist
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/usb_bouncer/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) chromeos-base/metrics:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= dev-libs/openssl:0= sys-apps/usbguard:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=63179a256e81376ed7cc1fffd7931949
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=578397d7a2a90708a632bb8b546ee541
diff --git a/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2897 b/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2897
deleted file mode 100644
index 34dd52b..0000000
--- a/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2897
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Log scripts used by userfeedback to report cros system information
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/userfeedback/
-IUSE=systemd X cros_host cros_workon_tree_c10c251002e6164cc1ae7cbe4b1934cc0902a6ec
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/chromeos-init chromeos-base/crash-reporter chromeos-base/modem-utilities chromeos-base/vboot_reference media-libs/fontconfig media-sound/alsa-utils sys-apps/coreboot-utils sys-apps/mosys sys-apps/net-tools sys-apps/pciutils sys-apps/usbutils X? ( x11-apps/setxkbmap )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2715c750fb1e16df87664e21beb073bb
diff --git a/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2898 b/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2898
new file mode 100644
index 0000000..4b0412a
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/userfeedback-0.0.1-r2898
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Log scripts used by userfeedback to report cros system information
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/userfeedback/
+IUSE=systemd X cros_host cros_workon_tree_cf316d8f26c5d0d66cfb049d64c4283722a06059
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/chromeos-init chromeos-base/crash-reporter chromeos-base/modem-utilities chromeos-base/vboot_reference media-libs/fontconfig media-sound/alsa-utils sys-apps/coreboot-utils sys-apps/mosys sys-apps/net-tools sys-apps/pciutils sys-apps/usbutils X? ( x11-apps/setxkbmap )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c9f41c7187523c916d5cd8079ba4a6fe
diff --git a/metadata/md5-cache/chromeos-base/userfeedback-9999 b/metadata/md5-cache/chromeos-base/userfeedback-9999
index a98083f..a6acc06 100644
--- a/metadata/md5-cache/chromeos-base/userfeedback-9999
+++ b/metadata/md5-cache/chromeos-base/userfeedback-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/chromeos-init chromeos-base/crash-reporter chromeos-base/modem-utilities chromeos-base/vboot_reference media-libs/fontconfig media-sound/alsa-utils sys-apps/coreboot-utils sys-apps/mosys sys-apps/net-tools sys-apps/pciutils sys-apps/usbutils X? ( x11-apps/setxkbmap )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=880c641a0d6896ecbdedc9bdd3142457
diff --git a/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1171 b/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1171
deleted file mode 100644
index 26447c9..0000000
--- a/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1171
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Userspace Touchpad
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/userspace_touchpad/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1d3dc401e83a63048534f57a715e677fbea29d49_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1d3dc401e83a63048534f57a715e677fbea29d49_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f03a4a8301dabeac8ab84856363669ff
diff --git a/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1193 b/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1193
new file mode 100644
index 0000000..7551551
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/userspace_touchpad-0.0.1-r1193
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Userspace Touchpad
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/userspace_touchpad/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f666e508f104d5efd1c61fae47c1b5b1
diff --git a/metadata/md5-cache/chromeos-base/userspace_touchpad-9999 b/metadata/md5-cache/chromeos-base/userspace_touchpad-9999
index 844db90..f9fa0e4 100644
--- a/metadata/md5-cache/chromeos-base/userspace_touchpad-9999
+++ b/metadata/md5-cache/chromeos-base/userspace_touchpad-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ff364745af7fbf88bf3f3bb411f6d6c9
diff --git a/metadata/md5-cache/chromeos-base/usi-test-0.0.1-r1 b/metadata/md5-cache/chromeos-base/usi-test-0.0.1-r1
new file mode 100644
index 0000000..92ffcf7
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/usi-test-0.0.1-r1
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=~dev-python/hid-tools-0.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DESCRIPTION=Universal Stylus Initiative (USI) Certification Tool
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/usi-test/
+IUSE=- cros_host cros_workon_tree_fe1c473b2a9fa0ac5caaee9ab1d472686620b7bc python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=~dev-python/hid-tools-0.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0.0.1-r1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a47d24f7afa8da6aa768a0c92610bada
diff --git a/metadata/md5-cache/chromeos-base/usi-test-9999 b/metadata/md5-cache/chromeos-base/usi-test-9999
new file mode 100644
index 0000000..0bea715
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/usi-test-9999
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=~dev-python/hid-tools-0.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DESCRIPTION=Universal Stylus Initiative (USI) Certification Tool
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/usi-test/
+IUSE=- cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=~dev-python/hid-tools-0.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=163f418aae2aac6cf1bfa8180fb7b464
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r1980 b/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r1980
deleted file mode 100644
index 955667f..0000000
--- a/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r1980
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/libzip:= dev-libs/openssl:= sys-apps/util-linux:=
-DESCRIPTION=Chrome OS verified boot tools
-EAPI=7
-IUSE=cros_host dev_debug_force fuzzer pd_sync test tpmtests tpm tpm2 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_82e77f6c98187361303fffeeba118a1a365e16d5
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=dev-libs/libzip:= dev-libs/openssl:= sys-apps/util-linux:=
-REQUIRED_USE=?? ( tpm2 tpm )
-SLOT=0/1.0-r1980
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e81536669f0788ebb281f8021fa40e17
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r2030 b/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r2030
new file mode 100644
index 0000000..2cf9be2
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vboot_reference-1.0-r2030
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/libzip:= dev-libs/openssl:= sys-apps/util-linux:=
+DESCRIPTION=Chrome OS verified boot tools
+EAPI=7
+IUSE=cros_host dev_debug_force fuzzer pd_sync test tpmtests tpm tpm2 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_d011d454951af2d6dbcf7d4dc7af53a31cc883db
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=dev-libs/libzip:= dev-libs/openssl:= sys-apps/util-linux:=
+REQUIRED_USE=?? ( tpm2 tpm )
+SLOT=0/1.0-r2030
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=965ed9c2129054e03b7453b009425c47
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-9999 b/metadata/md5-cache/chromeos-base/vboot_reference-9999
index 800abaa..d01c808 100644
--- a/metadata/md5-cache/chromeos-base/vboot_reference-9999
+++ b/metadata/md5-cache/chromeos-base/vboot_reference-9999
@@ -10,5 +10,5 @@
 RDEPEND=dev-libs/libzip:= dev-libs/openssl:= sys-apps/util-linux:=
 REQUIRED_USE=?? ( tpm2 tpm )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d3ede21ad75b6761ffeacfb4d8ed5762
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b10c15700bb1fc9de7be22371dc3acb
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1843 b/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1843
deleted file mode 100644
index 11de6e2..0000000
--- a/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1843
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst prepare setup unpack
-DESCRIPTION=vboot tests
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
-IUSE=+autotest +tests_firmware_VbootCrypto cros_host cros_workon_tree_82e77f6c98187361303fffeeba118a1a365e16d5 +buildcheck autotest opengles
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=autotest? ( chromeos-base/autotest )
-SLOT=0/0.0.1-r1843
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=eec9afd3f4d85d5ef8b3aff83decedc8
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1892 b/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1892
new file mode 100644
index 0000000..6f71399
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vboot_reference-tests-0.0.1-r1892
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst prepare setup unpack
+DESCRIPTION=vboot tests
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vboot_reference/
+IUSE=+autotest +tests_firmware_VbootCrypto cros_host cros_workon_tree_d011d454951af2d6dbcf7d4dc7af53a31cc883db +buildcheck autotest opengles
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=autotest? ( chromeos-base/autotest )
+SLOT=0/0.0.1-r1892
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=84c193ef35917d7d23290b264041aaa8
diff --git a/metadata/md5-cache/chromeos-base/vboot_reference-tests-9999 b/metadata/md5-cache/chromeos-base/vboot_reference-tests-9999
index 3d2873d..bd8b884 100644
--- a/metadata/md5-cache/chromeos-base/vboot_reference-tests-9999
+++ b/metadata/md5-cache/chromeos-base/vboot_reference-tests-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=autotest? ( chromeos-base/autotest )
 SLOT=0/9999
-_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotest	605b7cb5c6f24c3d362106dee3d4b20e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=da3f3894077f5a535851d73d99beff3a
diff --git a/metadata/md5-cache/chromeos-base/verity-0.0.1-r117 b/metadata/md5-cache/chromeos-base/verity-0.0.1-r117
deleted file mode 100644
index 576b71b..0000000
--- a/metadata/md5-cache/chromeos-base/verity-0.0.1-r117
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=test? ( dev-cpp/gtest:= )
-DESCRIPTION=File system integrity image generator for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/dm-verity
-IUSE=test cros_host cros_workon_tree_1f77ce9d4bf7400f3d5f5a5f42698fee57abbd6d
-KEYWORDS=*
-LICENSE=BSD-Google GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r117
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3e85da1bb037091e0a756c21d17211d5
diff --git a/metadata/md5-cache/chromeos-base/verity-0.0.1-r132 b/metadata/md5-cache/chromeos-base/verity-0.0.1-r132
new file mode 100644
index 0000000..a87fbbe
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/verity-0.0.1-r132
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=File system integrity image generator for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/verity/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_78f05413fa5932fd3644b2dc70442ba3f39fcbf0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_78f05413fa5932fd3644b2dc70442ba3f39fcbf0_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google GPL-2
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r132
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=11020df8df88200556b428528e64e05e
diff --git a/metadata/md5-cache/chromeos-base/verity-9999 b/metadata/md5-cache/chromeos-base/verity-9999
index 3c45fa4..f31d436 100644
--- a/metadata/md5-cache/chromeos-base/verity-9999
+++ b/metadata/md5-cache/chromeos-base/verity-9999
@@ -1,13 +1,14 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=test? ( dev-cpp/gtest:= )
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=File system integrity image generator for Chromium OS
 EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/dm-verity
-IUSE=test cros_host cros_workon_tree_
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/verity/
+IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google GPL-2
-PROPERTIES=live
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f1c524ea9d6ff9e5c9a907b805334bbe
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=687fddf18beef560e3b246d7fd7eec9c
diff --git a/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r736 b/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r736
deleted file mode 100644
index 75ab52c..0000000
--- a/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r736
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=sys-fs/fuse:= sys-libs/libcap:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=D-Bus service to provide virtual file
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/virtual_file_provider
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5f87c6733a889c474220215717386858620b647a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5f87c6733a889c474220215717386858620b647a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r736
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=3efbe210c8a9600bf7e2b3bf5a8c9b1a
diff --git a/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r761 b/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r761
new file mode 100644
index 0000000..a9f60e0
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/virtual-file-provider-0.0.1-r761
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=sys-fs/fuse:= sys-libs/libcap:= chromeos-base/system_api:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=D-Bus service to provide virtual file
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/virtual_file_provider
+IUSE=arcvm cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1676adb843a617f979c3a8f01cae8370d550b0ab_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_1676adb843a617f979c3a8f01cae8370d550b0ab_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r761
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=563c4f4b8385fe9245168ccbef5ab052
diff --git a/metadata/md5-cache/chromeos-base/virtual-file-provider-9999 b/metadata/md5-cache/chromeos-base/virtual-file-provider-9999
index 0bb07f2..33ffbe3 100644
--- a/metadata/md5-cache/chromeos-base/virtual-file-provider-9999
+++ b/metadata/md5-cache/chromeos-base/virtual-file-provider-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=D-Bus service to provide virtual file
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/virtual_file_provider
-IUSE=cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+IUSE=arcvm cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=sys-fs/fuse:= sys-libs/libcap:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=1f282aed87b5174b2d56c16f8af621e0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=18af8d8313157468776b970070d7527f
diff --git a/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r167 b/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r167
deleted file mode 100644
index cfa4314..0000000
--- a/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r167
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=net-misc/usbip:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Used with USBIP to provide a virtual USB printer for testing.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/virtual-usb-printer/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_47f0a6ede9490bb70f81b195dd50bc5a642618d4 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_47f0a6ede9490bb70f81b195dd50bc5a642618d4 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live live
-RDEPEND=net-misc/usbip:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r167
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b59bf4aa694ef562d71a413e79a175cc
diff --git a/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r189 b/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r189
new file mode 100644
index 0000000..d10d190
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/virtual-usb-printer-0.0.1-r189
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=net-misc/usbip:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Used with USBIP to provide a virtual USB printer for testing.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/virtual-usb-printer/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_16fd1fded20cb204d240fac1532bd6650a3b6299 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_16fd1fded20cb204d240fac1532bd6650a3b6299 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live live
+RDEPEND=net-misc/usbip:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r189
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d60f67af1d424dd0ddce371f0c9e46ba
diff --git a/metadata/md5-cache/chromeos-base/virtual-usb-printer-9999 b/metadata/md5-cache/chromeos-base/virtual-usb-printer-9999
index d76cccc..a4aa623 100644
--- a/metadata/md5-cache/chromeos-base/virtual-usb-printer-9999
+++ b/metadata/md5-cache/chromeos-base/virtual-usb-printer-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=net-misc/usbip:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0b75a7ad271959c7dbae75780ea2f25a
diff --git a/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r791 b/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r791
deleted file mode 100644
index 27b1bd7..0000000
--- a/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r791
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst preinst setup test unpack
-DEPEND=!!chromeos-base/vm_tools chromeos-base/minijail:= net-libs/grpc:= dev-libs/protobuf:= dev-go/grpc:= dev-go/protobuf:= sys-kernel/linux-headers:= chromeos-base/vm_protos:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=VM guest tools for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
-IUSE=kvm_guest vm-containers fuzzer vm_borealis cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7bcfbe3c740c314c3d98ca87536abea087627c60_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7bcfbe3c740c314c3d98ca87536abea087627c60_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!!chromeos-base/vm_tools chromeos-base/minijail:= net-libs/grpc:= dev-libs/protobuf:= vm-containers? ( chromeos-base/crash-reporter ) !fuzzer? ( chromeos-base/sommelier ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=kvm_guest
-SLOT=0/0.0.2-r791
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=49febf74142f9ddc07d518975ab87442
diff --git a/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r903 b/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r903
new file mode 100644
index 0000000..2deb22c
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vm_guest_tools-0.0.2-r903
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst preinst setup test unpack
+DEPEND=!!chromeos-base/vm_tools chromeos-base/minijail:= net-libs/grpc:= dev-libs/protobuf:= dev-go/grpc:= dev-go/protobuf:= sys-kernel/linux-headers:= chromeos-base/vm_protos:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=VM guest tools for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
+IUSE=kvm_guest vm-containers fuzzer vm_borealis cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_64d051e5acc3bdbe129c749a68121c4c4887b97a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_64d051e5acc3bdbe129c749a68121c4c4887b97a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!!chromeos-base/vm_tools chromeos-base/minijail:= net-libs/grpc:= dev-libs/protobuf:= vm-containers? ( chromeos-base/crash-reporter ) !fuzzer? ( chromeos-base/sommelier ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=kvm_guest
+SLOT=0/0.0.2-r903
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=b9c599672ad15f7a0c9549d5c18f7ce9
diff --git a/metadata/md5-cache/chromeos-base/vm_guest_tools-9999 b/metadata/md5-cache/chromeos-base/vm_guest_tools-9999
index 1301463..a24d129 100644
--- a/metadata/md5-cache/chromeos-base/vm_guest_tools-9999
+++ b/metadata/md5-cache/chromeos-base/vm_guest_tools-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!chromeos-base/vm_tools chromeos-base/minijail:= net-libs/grpc:= dev-libs/protobuf:= vm-containers? ( chromeos-base/crash-reporter ) !fuzzer? ( chromeos-base/sommelier ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=kvm_guest
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=6d22df855f43c2dc638f0292d984f9ca
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=9b0526bb5d1493ca5e927d8c055b2bd1
diff --git a/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r1062 b/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r1062
new file mode 100644
index 0000000..ff66587
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r1062
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= net-libs/grpc:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vm_protos:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=VM host tools for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
+IUSE=+kvm_host +seccomp +crosvm-wl-dmabuf fuzzer wilco cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_64d051e5acc3bdbe129c749a68121c4c4887b97a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515_64d051e5acc3bdbe129c749a68121c4c4887b97a_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= net-libs/grpc:= dev-libs/protobuf:= dev-rust/9s >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+REQUIRED_USE=kvm_host cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0/0.0.2-r1062
+_eclasses_=arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=c99eb4a53f3a22d0c7825a8f25b0e67e
diff --git a/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r940 b/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r940
deleted file mode 100644
index 3da9757..0000000
--- a/metadata/md5-cache/chromeos-base/vm_host_tools-0.0.2-r940
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/patchpanel:= net-libs/grpc:= dev-libs/protobuf:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vm_protos:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=VM host tools for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
-IUSE=+kvm_host +seccomp +crosvm-wl-dmabuf fuzzer wilco cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_7bcfbe3c740c314c3d98ca87536abea087627c60_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d_7bcfbe3c740c314c3d98ca87536abea087627c60_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/patchpanel:= net-libs/grpc:= dev-libs/protobuf:= dev-rust/9s >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-REQUIRED_USE=kvm_host cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0/0.0.2-r940
-_eclasses_=arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=810646645560312f9afdb37b5bf2d348
diff --git a/metadata/md5-cache/chromeos-base/vm_host_tools-9999 b/metadata/md5-cache/chromeos-base/vm_host_tools-9999
index 1c7a82c..0e0b5a3 100644
--- a/metadata/md5-cache/chromeos-base/vm_host_tools-9999
+++ b/metadata/md5-cache/chromeos-base/vm_host_tools-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/patchpanel:= net-libs/grpc:= dev-libs/protobuf:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vm_protos:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= net-libs/grpc:= dev-libs/protobuf:= chromeos-base/dlcservice-client:= chromeos-base/shill-client:= chromeos-base/system_api:=[fuzzer?] chromeos-base/vm_protos:= fuzzer? ( dev-libs/libprotobuf-mutator:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
 DESCRIPTION=VM host tools for Chrome OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
-RDEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= chromeos-base/metrics:= chromeos-base/minijail:= chromeos-base/patchpanel:= net-libs/grpc:= dev-libs/protobuf:= dev-rust/9s >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+RDEPEND=app-arch/libarchive:= !!chromeos-base/vm_tools chromeos-base/chunnel:= chromeos-base/crosvm:= >=chromeos-base/metrics-0.0.1-r3152:= chromeos-base/minijail:= chromeos-base/patchpanel:= chromeos-base/patchpanel-client:= net-libs/grpc:= dev-libs/protobuf:= dev-rust/9s >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 REQUIRED_USE=kvm_host cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0/9999
-_eclasses_=arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=2c69cc418069de0bcb87d94f6cc63c06
+_eclasses_=arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=7b8ef34bb317026356ea41696493c51a
diff --git a/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r116 b/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r116
deleted file mode 100644
index 0ed8835..0000000
--- a/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r116
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=dev-libs/protobuf:= net-libs/grpc:= !<chromeos-base/vm_guest_tools-0.0.2 !<chromeos-base/vm_host_tools-0.0.2 dev-go/protobuf:= dev-go/grpc:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS VM protobuf API
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/proto
-IUSE=fuzzer cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1469d221842993bd1831bcd0c6e978819766a043_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_1469d221842993bd1831bcd0c6e978819766a043_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= net-libs/grpc:= !<chromeos-base/vm_guest_tools-0.0.2 !<chromeos-base/vm_host_tools-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r116
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a935c6a767fca33b8ddd2fb6e973dba6
diff --git a/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r147 b/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r147
new file mode 100644
index 0000000..d65fffc
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vm_protos-0.0.1-r147
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=dev-libs/protobuf:= net-libs/grpc:= !<chromeos-base/vm_guest_tools-0.0.2 !<chromeos-base/vm_host_tools-0.0.2 dev-go/protobuf:= dev-go/grpc:= dev-lang/go >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS VM protobuf API
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/proto
+IUSE=fuzzer cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_da350fc60de0552464dd2de9e1fd534b0901626c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_da350fc60de0552464dd2de9e1fd534b0901626c_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= net-libs/grpc:= !<chromeos-base/vm_guest_tools-0.0.2 !<chromeos-base/vm_host_tools-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r147
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f8dcb45ee88a4b9147a67afba38d0c80
diff --git a/metadata/md5-cache/chromeos-base/vm_protos-9999 b/metadata/md5-cache/chromeos-base/vm_protos-9999
index 7f61784..7c860e7 100644
--- a/metadata/md5-cache/chromeos-base/vm_protos-9999
+++ b/metadata/md5-cache/chromeos-base/vm_protos-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= net-libs/grpc:= !<chromeos-base/vm_guest_tools-0.0.2 !<chromeos-base/vm_host_tools-0.0.2 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0c23c096220fc279375d3956316d039b
diff --git a/metadata/md5-cache/chromeos-base/vpd-0.0.1-r141 b/metadata/md5-cache/chromeos-base/vpd-0.0.1-r141
deleted file mode 100644
index 74bc2fb..0000000
--- a/metadata/md5-cache/chromeos-base/vpd-0.0.1-r141
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile info install setup test unpack
-DEPEND=sys-apps/util-linux:=
-DESCRIPTION=ChromeOS vital product data utilities
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vpd/
-IUSE=static systemd cros_host cros_workon_tree_a6e5da158ddf7a1cf320330188ce4c112c23bbdc
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-apps/flashrom dev-util/shflags virtual/chromeos-activate-date
-SLOT=0/0.0.1-r141
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=918283b935b19b2f0587862e0b6ac310
diff --git a/metadata/md5-cache/chromeos-base/vpd-0.0.1-r142 b/metadata/md5-cache/chromeos-base/vpd-0.0.1-r142
new file mode 100644
index 0000000..3fa0ef17
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vpd-0.0.1-r142
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile info install setup test unpack
+DEPEND=sys-apps/util-linux:=
+DESCRIPTION=ChromeOS vital product data utilities
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/vpd/
+IUSE=static systemd cros_host cros_workon_tree_d29b8b1ff2b87fdb3142e8d6eedff5059831728e
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/flashrom dev-util/shflags virtual/chromeos-activate-date
+SLOT=0/0.0.1-r142
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=848d852b2d67a605906f6c29ce3db6c8
diff --git a/metadata/md5-cache/chromeos-base/vpd-9999 b/metadata/md5-cache/chromeos-base/vpd-9999
index 6746517..d971e22 100644
--- a/metadata/md5-cache/chromeos-base/vpd-9999
+++ b/metadata/md5-cache/chromeos-base/vpd-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/flashrom dev-util/shflags virtual/chromeos-activate-date
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=31b7f0ef1de4123fbff454cc15e39fa8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a7ff440de1831dafdf1bf8fe0a36aa84
diff --git a/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2723 b/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2723
deleted file mode 100644
index 42e289f..0000000
--- a/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2723
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=net-dialup/ppp:= net-dialup/xl2tpd:= net-vpn/strongswan:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=L2TP/IPsec VPN manager for Chromium OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vpn-manager/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3beedc5f4dfdaee00a216accee58e807058e10fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_3beedc5f4dfdaee00a216accee58e807058e10fe_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=net-dialup/ppp:= net-dialup/xl2tpd:= net-vpn/strongswan:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r2723
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1e11adb200c9803a7fad1f1f51968cc9
diff --git a/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2744 b/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2744
new file mode 100644
index 0000000..508b907
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/vpn-manager-0.0.1-r2744
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=net-dialup/ppp:= net-dialup/xl2tpd:= net-vpn/strongswan:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=L2TP/IPsec VPN manager for Chromium OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vpn-manager/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_963e076a0b7311a4a5e1c14646f9a5d50c209ef7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_963e076a0b7311a4a5e1c14646f9a5d50c209ef7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=net-dialup/ppp:= net-dialup/xl2tpd:= net-vpn/strongswan:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r2744
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ee5ef9b82d67ee6828916e6e84c17113
diff --git a/metadata/md5-cache/chromeos-base/vpn-manager-9999 b/metadata/md5-cache/chromeos-base/vpn-manager-9999
index ea8a1b1..a2f4929 100644
--- a/metadata/md5-cache/chromeos-base/vpn-manager-9999
+++ b/metadata/md5-cache/chromeos-base/vpn-manager-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=net-dialup/ppp:= net-dialup/xl2tpd:= net-vpn/strongswan:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=413c8a88c67978306fbaa78133cb8c4b
diff --git a/metadata/md5-cache/chromeos-base/webplot-1.0-r7 b/metadata/md5-cache/chromeos-base/webplot-1.0-r7
index e39d618..ccd843c 100644
--- a/metadata/md5-cache/chromeos-base/webplot-1.0-r7
+++ b/metadata/md5-cache/chromeos-base/webplot-1.0-r7
@@ -10,5 +10,5 @@
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=e3c4cc5cd80eae751b05f15af4d61fcf
diff --git a/metadata/md5-cache/chromeos-base/webplot-9999 b/metadata/md5-cache/chromeos-base/webplot-9999
index 9b6d2cb..182e626 100644
--- a/metadata/md5-cache/chromeos-base/webplot-9999
+++ b/metadata/md5-cache/chromeos-base/webplot-9999
@@ -10,5 +10,5 @@
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=62e44a89b242ec3d3bf23857e3084ff8
diff --git a/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2226 b/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2226
deleted file mode 100644
index 8282b9d..0000000
--- a/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2226
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/permission_broker:= net-libs/libmicrohttpd:= !chromeos-base/libwebserv:= chromeos-base/permission_broker-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=HTTP sever interface library
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/webserver/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_d497496b2f212c664da45d40ac141034d6d973e7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_420573281f25e737e0f006ae23a329b3b1402457_d497496b2f212c664da45d40ac141034d6d973e7_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/permission_broker:= net-libs/libmicrohttpd:= !chromeos-base/libwebserv:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0/0.0.1-r2226
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=942553b8cd88ca8b110525b27f37f5c4
diff --git a/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2253 b/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2253
new file mode 100644
index 0000000..bc345b9
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/webserver-0.0.1-r2253
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/permission_broker:= net-libs/libmicrohttpd:= !chromeos-base/libwebserv:= chromeos-base/permission_broker-client:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=HTTP sever interface library
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/webserver/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_50e9dc623218d8d83e7026964cd935e650879c96_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e6b5c0f9c39bb88fbf99a09e142217dbcdef5d94_50e9dc623218d8d83e7026964cd935e650879c96_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/permission_broker:= net-libs/libmicrohttpd:= !chromeos-base/libwebserv:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0/0.0.1-r2253
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d2eb4a8df237cdb9e0356cf677eb678a
diff --git a/metadata/md5-cache/chromeos-base/webserver-9999 b/metadata/md5-cache/chromeos-base/webserver-9999
index e1dfffc..f3a0989 100644
--- a/metadata/md5-cache/chromeos-base/webserver-9999
+++ b/metadata/md5-cache/chromeos-base/webserver-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/permission_broker:= net-libs/libmicrohttpd:= !chromeos-base/libwebserv:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=4b787ef2753de6e1a5bfc7552d3e2b3e
diff --git a/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r104 b/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r104
new file mode 100644
index 0000000..2092236
--- /dev/null
+++ b/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r104
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst setup test unpack
+DEPEND=dev-libs/protobuf:= net-libs/grpc:= dev-go/protobuf dev-go/grpc dev-lang/go cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS Wilco DTC proto/gRPC API
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/grpc
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_bf3184eecb9926a81042768d016ede2399b2a52f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_bf3184eecb9926a81042768d016ede2399b2a52f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=dev-libs/protobuf:= net-libs/grpc:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1a5327e60d6b2d39957ca85f508e10f3
diff --git a/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r84 b/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r84
deleted file mode 100644
index a0d6dc2..0000000
--- a/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-0.0.1-r84
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst setup test unpack
-DEPEND=dev-libs/protobuf:= net-libs/grpc:= dev-go/protobuf dev-go/grpc dev-lang/go cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS Wilco DTC proto/gRPC API
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/diagnostics/grpc
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bf3184eecb9926a81042768d016ede2399b2a52f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_bf3184eecb9926a81042768d016ede2399b2a52f_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=dev-libs/protobuf:= net-libs/grpc:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d2a8a9b3aa9d394f8fb513705ee01d3b
diff --git a/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-9999 b/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-9999
index 0e224a8..ea09050 100644
--- a/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-9999
+++ b/metadata/md5-cache/chromeos-base/wilco-dtc-grpc-protos-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=dev-libs/protobuf:= net-libs/grpc:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=35820e3f06eb1f3c8231511a0198b9dd
diff --git a/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0 b/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0
index 8f99f07..a3f3ec0 100644
--- a/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0
+++ b/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0
@@ -9,5 +9,5 @@
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
 SRC_URI=https://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/googletest-release-1.8.0.tar.gz
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6d81ad187e20c5a69e8318b7e09fbed5
diff --git a/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0-r3 b/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0-r3
index 8f99f07..a3f3ec0 100644
--- a/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0-r3
+++ b/metadata/md5-cache/dev-cpp/arc-gtest-1.8.0-r3
@@ -9,5 +9,5 @@
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
 SRC_URI=https://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/googletest-release-1.8.0.tar.gz
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6d81ad187e20c5a69e8318b7e09fbed5
diff --git a/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre b/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre
index 756e045..8f62c12 100644
--- a/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre
+++ b/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre
@@ -9,5 +9,5 @@
 RDEPEND=!dev-cpp/gmock
 SLOT=0
 SRC_URI=https://github.com/google/googletest/archive/5ec7f0c4a113e2f18ac2c6cc7df51ad6afc24081.tar.gz -> gtest-1.8.2_pre.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=2b7c3846d0b15521e7282f63a14be0d0
diff --git a/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre-r2 b/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre-r2
index 756e045..8f62c12 100644
--- a/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre-r2
+++ b/metadata/md5-cache/dev-cpp/gtest-1.8.2_pre-r2
@@ -9,5 +9,5 @@
 RDEPEND=!dev-cpp/gmock
 SLOT=0
 SRC_URI=https://github.com/google/googletest/archive/5ec7f0c4a113e2f18ac2c6cc7df51ad6afc24081.tar.gz -> gtest-1.8.2_pre.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=2b7c3846d0b15521e7282f63a14be0d0
diff --git a/metadata/md5-cache/dev-embedded/binman-0.0.1-r1 b/metadata/md5-cache/dev-embedded/binman-0.0.1-r1
new file mode 100644
index 0000000..6f789cb
--- /dev/null
+++ b/metadata/md5-cache/dev-embedded/binman-0.0.1-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Binman tool (from U-Boot) for creating / adjusting firmware images
+EAPI=7
+HOMEPAGE=https://www.denx.de/wiki/U-Boot
+IUSE=cros_host cros_workon_tree_34c69bae738990ef8d7fc18553b02f41305d9e79 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=dev-embedded/dtoc dev-vcs/patman python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0fb2903c1fc5488455abd5124e8e91ea
diff --git a/metadata/md5-cache/dev-embedded/binman-9999 b/metadata/md5-cache/dev-embedded/binman-9999
new file mode 100644
index 0000000..249825b
--- /dev/null
+++ b/metadata/md5-cache/dev-embedded/binman-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Binman tool (from U-Boot) for creating / adjusting firmware images
+EAPI=7
+HOMEPAGE=https://www.denx.de/wiki/U-Boot
+IUSE=cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=~*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=dev-embedded/dtoc dev-vcs/patman python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=37b9b238a6f2a014a7483186b965281f
diff --git a/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r95 b/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r95
deleted file mode 100644
index 5bf991d..0000000
--- a/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r95
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup unpack
-DESCRIPTION=upstream coreboot's compiler suite
-EAPI=7
-HOMEPAGE=https://www.coreboot.org
-IUSE=cros_host cros_workon_tree_f494ad8e0135802146a66086bb018cd89ad4c005
-KEYWORDS=*
-LICENSE=GPL-3 LGPL-3
-PROPERTIES=live
-SLOT=0/0.0.1-r95
-SRC_URI=https://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.xz https://ftpmirror.gnu.org/mpfr/mpfr-4.0.2.tar.xz https://ftpmirror.gnu.org/mpc/mpc-1.1.0.tar.gz https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz https://ftpmirror.gnu.org/binutils/binutils-2.33.1.tar.xz https://acpica.org/sites/acpica/files/acpica-unix2-20200110.tar.gz https://ftpmirror.gnu.org/make/make-4.2.1.tar.bz2 http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=34c76749aa3c36d267df42c1f0aeb2fc
diff --git a/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r99 b/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r99
new file mode 100644
index 0000000..e991c64
--- /dev/null
+++ b/metadata/md5-cache/dev-embedded/coreboot-sdk-0.0.1-r99
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup unpack
+DESCRIPTION=upstream coreboot's compiler suite
+EAPI=7
+HOMEPAGE=https://www.coreboot.org
+IUSE=cros_host cros_workon_tree_816bf19a219e8a69b1fe846625eae7a91377863d
+KEYWORDS=*
+LICENSE=GPL-3 LGPL-3
+PROPERTIES=live
+SLOT=0/0.0.1-r99
+SRC_URI=https://ftpmirror.gnu.org/gmp/gmp-6.2.0.tar.xz https://ftpmirror.gnu.org/mpfr/mpfr-4.1.0.tar.xz https://ftpmirror.gnu.org/mpc/mpc-1.2.0.tar.gz https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz https://ftpmirror.gnu.org/binutils/binutils-2.35.tar.xz https://acpica.org/sites/acpica/files/acpica-unix2-20200717.tar.gz http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d3ca66f4315257a7dd1268534e7c50d1
diff --git a/metadata/md5-cache/dev-embedded/coreboot-sdk-9999 b/metadata/md5-cache/dev-embedded/coreboot-sdk-9999
index 5d34e52..bb52f15 100644
--- a/metadata/md5-cache/dev-embedded/coreboot-sdk-9999
+++ b/metadata/md5-cache/dev-embedded/coreboot-sdk-9999
@@ -8,6 +8,6 @@
 LICENSE=GPL-3 LGPL-3
 PROPERTIES=live
 SLOT=0/9999
-SRC_URI=https://ftpmirror.gnu.org/gmp/gmp-6.1.2.tar.xz https://ftpmirror.gnu.org/mpfr/mpfr-4.0.2.tar.xz https://ftpmirror.gnu.org/mpc/mpc-1.1.0.tar.gz https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz https://ftpmirror.gnu.org/binutils/binutils-2.33.1.tar.xz https://acpica.org/sites/acpica/files/acpica-unix2-20200110.tar.gz https://ftpmirror.gnu.org/make/make-4.2.1.tar.bz2 http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bf023c3803fd494802cf405ef3a572a0
+SRC_URI=https://ftpmirror.gnu.org/gmp/gmp-6.2.0.tar.xz https://ftpmirror.gnu.org/mpfr/mpfr-4.1.0.tar.xz https://ftpmirror.gnu.org/mpc/mpc-1.2.0.tar.gz https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz https://ftpmirror.gnu.org/binutils/binutils-2.35.tar.xz https://acpica.org/sites/acpica/files/acpica-unix2-20200717.tar.gz http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7 -> gnat-gpl-2017-x86_64-linux-bin.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2e00b2465cd9baaeb79a49936840fad5
diff --git a/metadata/md5-cache/dev-embedded/dtoc-0.0.1-r1 b/metadata/md5-cache/dev-embedded/dtoc-0.0.1-r1
new file mode 100644
index 0000000..102171f
--- /dev/null
+++ b/metadata/md5-cache/dev-embedded/dtoc-0.0.1-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Dtoc tool (from U-Boot) for converting devicetree files to C
+EAPI=7
+HOMEPAGE=https://www.denx.de/wiki/U-Boot
+IUSE=cros_host cros_workon_tree_056aa2ec54c99a4f1e14b29aa279ce4694bdddd0 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=dev-vcs/patman python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ca207c14cfbfb508e9f58d78ee52d38a
diff --git a/metadata/md5-cache/dev-embedded/dtoc-9999 b/metadata/md5-cache/dev-embedded/dtoc-9999
new file mode 100644
index 0000000..72f9699
--- /dev/null
+++ b/metadata/md5-cache/dev-embedded/dtoc-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Dtoc tool (from U-Boot) for converting devicetree files to C
+EAPI=7
+HOMEPAGE=https://www.denx.de/wiki/U-Boot
+IUSE=cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=~*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=dev-vcs/patman python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=65921555a0915bebf83807f26e9d13c2
diff --git a/metadata/md5-cache/dev-embedded/libftdi-1.2 b/metadata/md5-cache/dev-embedded/libftdi-1.2
index 7addc83..a58a1b6 100644
--- a/metadata/md5-cache/dev-embedded/libftdi-1.2
+++ b/metadata/md5-cache/dev-embedded/libftdi-1.2
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse ) python? ( dev-lang/swig ) doc? ( app-doc/doxygen ) sys-devel/make >=dev-util/cmake-3.9.6
+DEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse ) python? ( dev-lang/swig ) doc? ( app-doc/doxygen ) sys-devel/make >=dev-util/cmake-3.9.6
 DESCRIPTION=Userspace access to FTDI USB interface chips
 EAPI=6
 HOMEPAGE=http://www.intra2net.com/en/developer/libftdi/
-IUSE=cxx doc examples python static-libs test tools python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=cxx doc examples python static-libs test tools python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=LGPL-2
-RDEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
+RDEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) )
 SLOT=1
 SRC_URI=http://www.intra2net.com/en/developer/libftdi/download/libftdi1-1.2.tar.bz2
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=dc0d5898a2f4637895ebb5fa795ccefc
diff --git a/metadata/md5-cache/dev-embedded/libftdi-1.2-r3 b/metadata/md5-cache/dev-embedded/libftdi-1.2-r3
index 7addc83..a58a1b6 100644
--- a/metadata/md5-cache/dev-embedded/libftdi-1.2-r3
+++ b/metadata/md5-cache/dev-embedded/libftdi-1.2-r3
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse ) python? ( dev-lang/swig ) doc? ( app-doc/doxygen ) sys-devel/make >=dev-util/cmake-3.9.6
+DEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse ) python? ( dev-lang/swig ) doc? ( app-doc/doxygen ) sys-devel/make >=dev-util/cmake-3.9.6
 DESCRIPTION=Userspace access to FTDI USB interface chips
 EAPI=6
 HOMEPAGE=http://www.intra2net.com/en/developer/libftdi/
-IUSE=cxx doc examples python static-libs test tools python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=cxx doc examples python static-libs test tools python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=LGPL-2
-RDEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
+RDEPEND=virtual/libusb:1 cxx? ( dev-libs/boost ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) tools? ( !<dev-embedded/ftdi_eeprom-1.0 dev-libs/confuse )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) )
 SLOT=1
 SRC_URI=http://www.intra2net.com/en/developer/libftdi/download/libftdi1-1.2.tar.bz2
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=dc0d5898a2f4637895ebb5fa795ccefc
diff --git a/metadata/md5-cache/dev-go/crypto-0.0.1 b/metadata/md5-cache/dev-go/crypto-0.0.1
index a46e862..c1b0dde 100644
--- a/metadata/md5-cache/dev-go/crypto-0.0.1
+++ b/metadata/md5-cache/dev-go/crypto-0.0.1
@@ -9,4 +9,4 @@
 SLOT=0
 SRC_URI=https://go.googlesource.com/crypto/+archive/505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz -> go.googlesource.com-crypto-505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz
 _eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1861f12d92f37e06d226ec40e8f77adf
+_md5_=7b0522611de0a1899960b05dbd5f1386
diff --git a/metadata/md5-cache/dev-go/crypto-0.0.1-r4 b/metadata/md5-cache/dev-go/crypto-0.0.1-r4
deleted file mode 100644
index a46e862..0000000
--- a/metadata/md5-cache/dev-go/crypto-0.0.1-r4
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/go-sys dev-lang/go
-DESCRIPTION=Go supplementary cryptography libraries
-EAPI=5
-HOMEPAGE=https://golang.org/x/crypto
-KEYWORDS=*
-LICENSE=BSD-Google
-RESTRICT=binchecks strip
-SLOT=0
-SRC_URI=https://go.googlesource.com/crypto/+archive/505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz -> go.googlesource.com-crypto-505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1861f12d92f37e06d226ec40e8f77adf
diff --git a/metadata/md5-cache/dev-go/crypto-0.0.1-r5 b/metadata/md5-cache/dev-go/crypto-0.0.1-r5
new file mode 100644
index 0000000..c1b0dde
--- /dev/null
+++ b/metadata/md5-cache/dev-go/crypto-0.0.1-r5
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/go-sys dev-lang/go
+DESCRIPTION=Go supplementary cryptography libraries
+EAPI=5
+HOMEPAGE=https://golang.org/x/crypto
+KEYWORDS=*
+LICENSE=BSD-Google
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://go.googlesource.com/crypto/+archive/505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz -> go.googlesource.com-crypto-505ab145d0a99da450461ae2c1a9f6cd10d1f447.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7b0522611de0a1899960b05dbd5f1386
diff --git a/metadata/md5-cache/dev-go/dst-0.23.1 b/metadata/md5-cache/dev-go/dst-0.23.1
new file mode 100644
index 0000000..e4728b8
--- /dev/null
+++ b/metadata/md5-cache/dev-go/dst-0.23.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/jennifer >=dev-go/go-tools-0.0.1-r13 dev-lang/go
+DESCRIPTION=Decorated Syntax Tree
+EAPI=7
+HOMEPAGE=https://github.com/dave/dst
+KEYWORDS=*
+LICENSE=MIT BSD-Google
+RDEPEND=dev-go/jennifer >=dev-go/go-tools-0.0.1-r13
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/dave/dst/archive/v0.23.1.tar.gz -> github.com-dave-dst-v0.23.1.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a58b6e447c5e1f3c6e6fd1d32ede201d
diff --git a/metadata/md5-cache/dev-go/fscrypt-0.2.9 b/metadata/md5-cache/dev-go/fscrypt-0.2.9
new file mode 100644
index 0000000..496b885
--- /dev/null
+++ b/metadata/md5-cache/dev-go/fscrypt-0.2.9
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/crypto dev-go/go-sys sys-libs/pam:= dev-lang/go
+DESCRIPTION=Go package for fscrypt utils
+EAPI=7
+HOMEPAGE=https://github.com/google/fscrypt
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-go/crypto dev-go/go-sys sys-libs/pam:=
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/google/fscrypt/archive/v0.2.9.tar.gz -> github.com-google-fscrypt-v0.2.9.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e398cf4cbd444f59958bb1b5c097f8b4
diff --git a/metadata/md5-cache/dev-go/fscrypt-0.2.9-r1 b/metadata/md5-cache/dev-go/fscrypt-0.2.9-r1
new file mode 100644
index 0000000..496b885
--- /dev/null
+++ b/metadata/md5-cache/dev-go/fscrypt-0.2.9-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/crypto dev-go/go-sys sys-libs/pam:= dev-lang/go
+DESCRIPTION=Go package for fscrypt utils
+EAPI=7
+HOMEPAGE=https://github.com/google/fscrypt
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-go/crypto dev-go/go-sys sys-libs/pam:=
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/google/fscrypt/archive/v0.2.9.tar.gz -> github.com-google-fscrypt-v0.2.9.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e398cf4cbd444f59958bb1b5c097f8b4
diff --git a/metadata/md5-cache/dev-go/gapi-drive-0.0.1 b/metadata/md5-cache/dev-go/gapi-drive-0.0.1
new file mode 100644
index 0000000..655a79a
--- /dev/null
+++ b/metadata/md5-cache/dev-go/gapi-drive-0.0.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/gapi-gensupport dev-go/gapi-googleapi dev-go/net dev-lang/go
+DESCRIPTION=Auto-generated Google APIs for Go
+EAPI=5
+HOMEPAGE=https://github.com/google/google-api-go-client
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=dev-go/gapi-gensupport dev-go/gapi-googleapi dev-go/net
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/google/google-api-go-client/archive/068431dcab1a5817548dd244d9795788a98329f4.tar.gz -> github.com-google-google-api-go-client-068431dcab1a5817548dd244d9795788a98329f4.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c098885890f73988c560cac5f3561f26
diff --git a/metadata/md5-cache/dev-go/gapi-drive-0.0.1-r1 b/metadata/md5-cache/dev-go/gapi-drive-0.0.1-r1
new file mode 100644
index 0000000..655a79a
--- /dev/null
+++ b/metadata/md5-cache/dev-go/gapi-drive-0.0.1-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/gapi-gensupport dev-go/gapi-googleapi dev-go/net dev-lang/go
+DESCRIPTION=Auto-generated Google APIs for Go
+EAPI=5
+HOMEPAGE=https://github.com/google/google-api-go-client
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=dev-go/gapi-gensupport dev-go/gapi-googleapi dev-go/net
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/google/google-api-go-client/archive/068431dcab1a5817548dd244d9795788a98329f4.tar.gz -> github.com-google-google-api-go-client-068431dcab1a5817548dd244d9795788a98329f4.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c098885890f73988c560cac5f3561f26
diff --git a/metadata/md5-cache/dev-go/go-sys-0.0.1 b/metadata/md5-cache/dev-go/go-sys-0.0.1
index 25e83ab..eb7d18f 100644
--- a/metadata/md5-cache/dev-go/go-sys-0.0.1
+++ b/metadata/md5-cache/dev-go/go-sys-0.0.1
@@ -7,6 +7,6 @@
 LICENSE=BSD-Google
 RESTRICT=binchecks strip
 SLOT=0
-SRC_URI=https://go.googlesource.com/sys/+archive/3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145.tar.gz -> go.googlesource.com-sys-3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145.tar.gz
+SRC_URI=https://go.googlesource.com/sys/+archive/cb9d2d5c56667600bda8ad719c756f125ad55083.tar.gz -> go.googlesource.com-sys-cb9d2d5c56667600bda8ad719c756f125ad55083.tar.gz
 _eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=981f3af49e8ef46270cf7e5d1d95d4cf
+_md5_=58397c45c95bed657fa49b6aeda7aa42
diff --git a/metadata/md5-cache/dev-go/go-sys-0.0.1-r4 b/metadata/md5-cache/dev-go/go-sys-0.0.1-r4
deleted file mode 100644
index 25e83ab..0000000
--- a/metadata/md5-cache/dev-go/go-sys-0.0.1-r4
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-lang/go
-DESCRIPTION=Go packages for low-level interaction with the operating system
-EAPI=5
-HOMEPAGE=https://golang.org/x/sys
-KEYWORDS=*
-LICENSE=BSD-Google
-RESTRICT=binchecks strip
-SLOT=0
-SRC_URI=https://go.googlesource.com/sys/+archive/3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145.tar.gz -> go.googlesource.com-sys-3a4b5fb9f71f5874b2374ae059bc0e0bcb52e145.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=981f3af49e8ef46270cf7e5d1d95d4cf
diff --git a/metadata/md5-cache/dev-go/go-sys-0.0.1-r5 b/metadata/md5-cache/dev-go/go-sys-0.0.1-r5
new file mode 100644
index 0000000..eb7d18f
--- /dev/null
+++ b/metadata/md5-cache/dev-go/go-sys-0.0.1-r5
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Go packages for low-level interaction with the operating system
+EAPI=5
+HOMEPAGE=https://golang.org/x/sys
+KEYWORDS=*
+LICENSE=BSD-Google
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://go.googlesource.com/sys/+archive/cb9d2d5c56667600bda8ad719c756f125ad55083.tar.gz -> go.googlesource.com-sys-cb9d2d5c56667600bda8ad719c756f125ad55083.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=58397c45c95bed657fa49b6aeda7aa42
diff --git a/metadata/md5-cache/dev-go/go-tools-0.0.1 b/metadata/md5-cache/dev-go/go-tools-0.0.1
index 16277a4..c1233ad 100644
--- a/metadata/md5-cache/dev-go/go-tools-0.0.1
+++ b/metadata/md5-cache/dev-go/go-tools-0.0.1
@@ -1,12 +1,13 @@
 DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/net dev-lang/go
+DEPEND=dev-go/net dev-go/xerrors dev-lang/go
 DESCRIPTION=Packages and tools that support the Go programming language
 EAPI=5
 HOMEPAGE=https://golang.org/x/tools
 KEYWORDS=*
 LICENSE=BSD-Google
+RDEPEND=dev-go/net dev-go/xerrors
 RESTRICT=binchecks strip
 SLOT=0
 SRC_URI=https://go.googlesource.com/tools/+archive/65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz -> go.googlesource.com-tools-65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz
 _eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d6ced11040829dd8005547f989e3218a
+_md5_=29800732bc88f93bfec325e044e520a8
diff --git a/metadata/md5-cache/dev-go/go-tools-0.0.1-r12 b/metadata/md5-cache/dev-go/go-tools-0.0.1-r12
deleted file mode 100644
index 16277a4..0000000
--- a/metadata/md5-cache/dev-go/go-tools-0.0.1-r12
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/net dev-lang/go
-DESCRIPTION=Packages and tools that support the Go programming language
-EAPI=5
-HOMEPAGE=https://golang.org/x/tools
-KEYWORDS=*
-LICENSE=BSD-Google
-RESTRICT=binchecks strip
-SLOT=0
-SRC_URI=https://go.googlesource.com/tools/+archive/65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz -> go.googlesource.com-tools-65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d6ced11040829dd8005547f989e3218a
diff --git a/metadata/md5-cache/dev-go/go-tools-0.0.1-r13 b/metadata/md5-cache/dev-go/go-tools-0.0.1-r13
new file mode 100644
index 0000000..c1233ad
--- /dev/null
+++ b/metadata/md5-cache/dev-go/go-tools-0.0.1-r13
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/net dev-go/xerrors dev-lang/go
+DESCRIPTION=Packages and tools that support the Go programming language
+EAPI=5
+HOMEPAGE=https://golang.org/x/tools
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=dev-go/net dev-go/xerrors
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://go.googlesource.com/tools/+archive/65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz -> go.googlesource.com-tools-65e3620a7ae7ac25e8494a60f0e5ef4e4fba03b3.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=29800732bc88f93bfec325e044e520a8
diff --git a/metadata/md5-cache/dev-go/godebug-1.1.0 b/metadata/md5-cache/dev-go/godebug-1.1.0
new file mode 100644
index 0000000..3985f48
--- /dev/null
+++ b/metadata/md5-cache/dev-go/godebug-1.1.0
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Debugging helper utilities for Go
+EAPI=7
+HOMEPAGE=https://github.com/kylelemons/godebug
+KEYWORDS=*
+LICENSE=Apache-2.0
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/kylelemons/godebug/archive/v1.1.0.tar.gz -> github.com-kylelemons-godebug-v1.1.0.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=155b42012eb93326058948f726f220a1
diff --git a/metadata/md5-cache/dev-go/godebug-1.1.0-r1 b/metadata/md5-cache/dev-go/godebug-1.1.0-r1
new file mode 100644
index 0000000..3985f48
--- /dev/null
+++ b/metadata/md5-cache/dev-go/godebug-1.1.0-r1
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Debugging helper utilities for Go
+EAPI=7
+HOMEPAGE=https://github.com/kylelemons/godebug
+KEYWORDS=*
+LICENSE=Apache-2.0
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/kylelemons/godebug/archive/v1.1.0.tar.gz -> github.com-kylelemons-godebug-v1.1.0.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=155b42012eb93326058948f726f220a1
diff --git a/metadata/md5-cache/dev-go/golang-evdev-0.0.1 b/metadata/md5-cache/dev-go/golang-evdev-0.0.1
new file mode 100644
index 0000000..977a732
--- /dev/null
+++ b/metadata/md5-cache/dev-go/golang-evdev-0.0.1
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=sys-kernel/linux-headers:= dev-lang/go
+DESCRIPTION=Provides Go language bindings to the generic input event interface in Linux.
+EAPI=7
+HOMEPAGE=https://github.com/gvalkov/golang-evdev
+KEYWORDS=*
+LICENSE=BSD
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/gvalkov/golang-evdev/archive/287e62b94bcb850ab42e711bd74b2875da83af2c.tar.gz -> github.com-gvalkov-golang-evdev-287e62b94bcb850ab42e711bd74b2875da83af2c.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=90a7347fd5de7bc309a90806eeeb4217
diff --git a/metadata/md5-cache/dev-go/jennifer-1.2.0 b/metadata/md5-cache/dev-go/jennifer-1.2.0
new file mode 100644
index 0000000..bd90bd2
--- /dev/null
+++ b/metadata/md5-cache/dev-go/jennifer-1.2.0
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Jennifer is a code generator for Go
+EAPI=7
+HOMEPAGE=https://github.com/dave/jennifer
+KEYWORDS=*
+LICENSE=MIT
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/dave/jennifer/archive/v1.2.0.tar.gz -> github.com-dave-jennifer-v1.2.0.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b343097d4fcbf115be9dc2c50291544
diff --git a/metadata/md5-cache/dev-go/levenshtein-0.0.1 b/metadata/md5-cache/dev-go/levenshtein-0.0.1
new file mode 100644
index 0000000..1d60c5f
--- /dev/null
+++ b/metadata/md5-cache/dev-go/levenshtein-0.0.1
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Go subcommand library
+EAPI=7
+HOMEPAGE=https://github.com/texttheater/golang-levenshtein/levenshtein
+KEYWORDS=*
+LICENSE=MIT
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/texttheater/golang-levenshtein/archive/eb6844b05fc6f7e10932b0621c7f5f7e8890541d.tar.gz -> github.com-texttheater-golang-levenshtein-eb6844b05fc6f7e10932b0621c7f5f7e8890541d.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=06dbcd51db605ee2cb1c874f61f2341c
diff --git a/metadata/md5-cache/dev-go/luci-auth-0.0.1 b/metadata/md5-cache/dev-go/luci-auth-0.0.1
index b09017f..fb6799f 100644
--- a/metadata/md5-cache/dev-go/luci-auth-0.0.1
+++ b/metadata/md5-cache/dev-go/luci-auth-0.0.1
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/net dev-go/oauth2 dev-lang/go
+DEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-lang/go
 DESCRIPTION=LUCI Go auth library
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
 KEYWORDS=*
 LICENSE=Apache-2.0
-RDEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/net dev-go/oauth2
+RDEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/maruel-subcommands dev-go/net dev-go/oauth2
 RESTRICT=binchecks test strip
 SLOT=0
 SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
 _eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0675a022919a67801fcce0d554f37bc7
+_md5_=2df32f1583bacb4be48dff88e55a6caa
diff --git a/metadata/md5-cache/dev-go/luci-auth-0.0.1-r3 b/metadata/md5-cache/dev-go/luci-auth-0.0.1-r3
deleted file mode 100644
index b09017f..0000000
--- a/metadata/md5-cache/dev-go/luci-auth-0.0.1-r3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/net dev-go/oauth2 dev-lang/go
-DESCRIPTION=LUCI Go auth library
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/net dev-go/oauth2
-RESTRICT=binchecks test strip
-SLOT=0
-SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0675a022919a67801fcce0d554f37bc7
diff --git a/metadata/md5-cache/dev-go/luci-auth-0.0.1-r4 b/metadata/md5-cache/dev-go/luci-auth-0.0.1-r4
new file mode 100644
index 0000000..fb6799f
--- /dev/null
+++ b/metadata/md5-cache/dev-go/luci-auth-0.0.1-r4
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-lang/go
+DESCRIPTION=LUCI Go auth library
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-go/gcp-compute dev-go/grpc dev-go/luci-common dev-go/maruel-subcommands dev-go/net dev-go/oauth2
+RESTRICT=binchecks test strip
+SLOT=0
+SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2df32f1583bacb4be48dff88e55a6caa
diff --git a/metadata/md5-cache/dev-go/luci-common-0.0.1 b/metadata/md5-cache/dev-go/luci-common-0.0.1
index a068bda..08f1374 100644
--- a/metadata/md5-cache/dev-go/luci-common-0.0.1
+++ b/metadata/md5-cache/dev-go/luci-common-0.0.1
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf dev-lang/go
+DEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf dev-lang/go
 DESCRIPTION=LUCI Go common library
 EAPI=5
 HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
 KEYWORDS=*
 LICENSE=Apache-2.0
-RDEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf
+RDEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf
 RESTRICT=binchecks test strip
 SLOT=0
 SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
 _eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d24145e4f99d2afec649de13931445f0
+_md5_=1080fa890a1eeeda068746234e3f1b03
diff --git a/metadata/md5-cache/dev-go/luci-common-0.0.1-r5 b/metadata/md5-cache/dev-go/luci-common-0.0.1-r5
deleted file mode 100644
index a068bda..0000000
--- a/metadata/md5-cache/dev-go/luci-common-0.0.1-r5
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst test unpack
-DEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf dev-lang/go
-DESCRIPTION=LUCI Go common library
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf
-RESTRICT=binchecks test strip
-SLOT=0
-SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d24145e4f99d2afec649de13931445f0
diff --git a/metadata/md5-cache/dev-go/luci-common-0.0.1-r6 b/metadata/md5-cache/dev-go/luci-common-0.0.1-r6
new file mode 100644
index 0000000..08f1374
--- /dev/null
+++ b/metadata/md5-cache/dev-go/luci-common-0.0.1-r6
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf dev-lang/go
+DESCRIPTION=LUCI Go common library
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/infra/luci/luci-go/
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-go/crypto dev-go/gapi-googleapi dev-go/gcp-pubsub dev-go/maruel-subcommands dev-go/net dev-go/oauth2 dev-go/op-logging dev-go/protobuf
+RESTRICT=binchecks test strip
+SLOT=0
+SRC_URI=https://chromium.googlesource.com/infra/luci/luci-go/+archive/77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz -> chromium.googlesource.com-infra-luci-luci-go-77b23ce4c9189484e14035690f439c97f7629c2e.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1080fa890a1eeeda068746234e3f1b03
diff --git a/metadata/md5-cache/dev-go/maruel-subcommands-0.0.1 b/metadata/md5-cache/dev-go/maruel-subcommands-0.0.1
new file mode 100644
index 0000000..1311bba
--- /dev/null
+++ b/metadata/md5-cache/dev-go/maruel-subcommands-0.0.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install nofetch postinst test unpack
+DEPEND=dev-go/levenshtein dev-lang/go
+DESCRIPTION=Go subcommand library
+EAPI=7
+HOMEPAGE=https://github.com/maruel/subcommands
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-go/levenshtein
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=https://github.com/texttheater/golang-levenshtein/archive/eb6844b05fc6f7e10932b0621c7f5f7e8890541d.tar.gz -> github.com-texttheater-golang-levenshtein-eb6844b05fc6f7e10932b0621c7f5f7e8890541d.tar.gz https://github.com/maruel/subcommands/archive/de1d40e70d4b89b9c560a4d308e0bc9f5c9e18d7.tar.gz -> github.com-maruel-subcommands-de1d40e70d4b89b9c560a4d308e0bc9f5c9e18d7.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c6b2e59c3e99bc6535bb2d590f7165cf
diff --git a/metadata/md5-cache/dev-go/seccomp-0.0.1-r6 b/metadata/md5-cache/dev-go/seccomp-0.0.1-r6
index aee8cda..6173e51 100644
--- a/metadata/md5-cache/dev-go/seccomp-0.0.1-r6
+++ b/metadata/md5-cache/dev-go/seccomp-0.0.1-r6
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RESTRICT=binchecks strip
 SLOT=0/0.0.1-r6
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=eaadd06002a4fa4a9cf86847d9f6ca96
diff --git a/metadata/md5-cache/dev-go/seccomp-9999 b/metadata/md5-cache/dev-go/seccomp-9999
index de9c187..3bc2bb3 100644
--- a/metadata/md5-cache/dev-go/seccomp-9999
+++ b/metadata/md5-cache/dev-go/seccomp-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RESTRICT=binchecks strip
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8ce6257e185b9c034b08a5200fef0467
diff --git a/metadata/md5-cache/dev-go/syzkaller-0.0.1 b/metadata/md5-cache/dev-go/syzkaller-0.0.1
deleted file mode 100644
index 281aaff..0000000
--- a/metadata/md5-cache/dev-go/syzkaller-0.0.1
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install nofetch postinst prepare test unpack
-DEPEND=dev-lang/go
-DESCRIPTION=Syzkaller kernel fuzzer
-EAPI=7
-HOMEPAGE=https://github.com/google/syzkaller
-KEYWORDS=*
-LICENSE=Apache-2.0
-SLOT=0
-SRC_URI=https://github.com/google/syzkaller/archive/7604bb0341ac55d2ee620fa09fd18f06a6c3c727.tar.gz -> github.com-google-syzkaller-7604bb0341ac55d2ee620fa09fd18f06a6c3c727.tar.gz
-_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1359672f817b73946f378b77c57470b8
diff --git a/metadata/md5-cache/dev-go/syzkaller-0.0.2 b/metadata/md5-cache/dev-go/syzkaller-0.0.2
new file mode 100644
index 0000000..3734d4e
--- /dev/null
+++ b/metadata/md5-cache/dev-go/syzkaller-0.0.2
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install nofetch postinst prepare test unpack
+DEPEND=dev-lang/go
+DESCRIPTION=Syzkaller kernel fuzzer
+EAPI=7
+HOMEPAGE=https://github.com/google/syzkaller
+KEYWORDS=*
+LICENSE=Apache-2.0
+SLOT=0
+SRC_URI=https://github.com/google/syzkaller/archive/9c8124727c791c492f98fceaebf7b74d9ab78878.tar.gz -> github.com-google-syzkaller-9c8124727c791c492f98fceaebf7b74d9ab78878.tar.gz
+_eclasses_=cros-go	157c7bac0e032e424ec1c3316c127db8	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=be9da7fb589aee422d6fa7ea793d8094
diff --git a/metadata/md5-cache/dev-lang/python-2.7.15 b/metadata/md5-cache/dev-lang/python-2.7.15
index 9141202..cafdf8b 100644
--- a/metadata/md5-cache/dev-lang/python-2.7.15
+++ b/metadata/md5-cache/dev-lang/python-2.7.15
@@ -11,5 +11,5 @@
 REQUIRED_USE=pgo_generate? ( !pgo_use )
 SLOT=2.7
 SRC_URI=https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz https://dev.gentoo.org/~floppym/python/python-gentoo-patches-2.7.15.tar.xz pgo_use? ( gs://chromeos-localmirror/distfiles/python-2.7.15-pgo-prof.profdata.tar.xz )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d5843c3d0c2a47d14a36b18428359ce7
diff --git a/metadata/md5-cache/dev-lang/python-2.7.15-r3 b/metadata/md5-cache/dev-lang/python-2.7.15-r3
index 9141202..cafdf8b 100644
--- a/metadata/md5-cache/dev-lang/python-2.7.15-r3
+++ b/metadata/md5-cache/dev-lang/python-2.7.15-r3
@@ -11,5 +11,5 @@
 REQUIRED_USE=pgo_generate? ( !pgo_use )
 SLOT=2.7
 SRC_URI=https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz https://dev.gentoo.org/~floppym/python/python-gentoo-patches-2.7.15.tar.xz pgo_use? ( gs://chromeos-localmirror/distfiles/python-2.7.15-pgo-prof.profdata.tar.xz )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d5843c3d0c2a47d14a36b18428359ce7
diff --git a/metadata/md5-cache/dev-lang/python-3.6.5 b/metadata/md5-cache/dev-lang/python-3.6.5
index 59141aa..d87823b 100644
--- a/metadata/md5-cache/dev-lang/python-3.6.5
+++ b/metadata/md5-cache/dev-lang/python-3.6.5
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=3.6/3.6m
 SRC_URI=https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz https://dev.gentoo.org/~floppym/python/python-gentoo-patches-3.6.4.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b673ce534dbdab312647ea561d351f0b
diff --git a/metadata/md5-cache/dev-lang/python-3.6.5-r4 b/metadata/md5-cache/dev-lang/python-3.6.5-r4
index 59141aa..d87823b 100644
--- a/metadata/md5-cache/dev-lang/python-3.6.5-r4
+++ b/metadata/md5-cache/dev-lang/python-3.6.5-r4
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=3.6/3.6m
 SRC_URI=https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz https://dev.gentoo.org/~floppym/python/python-gentoo-patches-3.6.4.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	pax-utils	3551398d6ede2b572568832730cc2a45	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b673ce534dbdab312647ea561d351f0b
diff --git a/metadata/md5-cache/dev-lang/rust-1.43.0 b/metadata/md5-cache/dev-lang/rust-1.43.0
deleted file mode 100644
index 45ea4e3..0000000
--- a/metadata/md5-cache/dev-lang/rust-1.43.0
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup
-DEPEND=|| ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-libs/libxml2-2.9.6 >=dev-lang/perl-5.0
-DESCRIPTION=Systems programming language from Mozilla
-EAPI=5
-HOMEPAGE=http://www.rust-lang.org/
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA
-RDEPEND=!dev-util/cargo
-REQUIRED_USE=amd64
-RESTRICT=binchecks strip
-SLOT=stable/1.43
-SRC_URI=https://static.rust-lang.org/dist/rustc-1.43.0-src.tar.gz -> rustc-1.43.0-src.tar.gz https://static.rust-lang.org/dist/2020-03-12/rust-std-1.42.0-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/rustc-1.42.0-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/cargo-0.43.0-x86_64-unknown-linux-gnu.tar.gz
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=525c9d91dda901eb2d1dd39e3ceec248
diff --git a/metadata/md5-cache/dev-lang/rust-1.44.0 b/metadata/md5-cache/dev-lang/rust-1.44.0
deleted file mode 100644
index 19e1ecc..0000000
--- a/metadata/md5-cache/dev-lang/rust-1.44.0
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup
-DEPEND=|| ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-libs/libxml2-2.9.6 >=dev-lang/perl-5.0
-DESCRIPTION=Systems programming language from Mozilla
-EAPI=5
-HOMEPAGE=http://www.rust-lang.org/
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA
-RDEPEND=!dev-util/cargo
-REQUIRED_USE=amd64
-RESTRICT=binchecks strip
-SLOT=stable/1.44
-SRC_URI=https://static.rust-lang.org/dist/rustc-1.44.0-src.tar.gz -> rustc-1.44.0-src.tar.gz https://static.rust-lang.org/dist/2020-05-07/rust-std-1.43.1-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/rustc-1.43.1-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/cargo-0.44.0-x86_64-unknown-linux-gnu.tar.gz
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=7c0c6e30c31a10e2ff0b045dd48c7242
diff --git a/metadata/md5-cache/dev-lang/rust-1.45.2-r1 b/metadata/md5-cache/dev-lang/rust-1.45.2-r1
new file mode 100644
index 0000000..40eb815
--- /dev/null
+++ b/metadata/md5-cache/dev-lang/rust-1.45.2-r1
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare setup
+DEPEND=|| ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-libs/libxml2-2.9.6 >=dev-lang/perl-5.0
+DESCRIPTION=Systems programming language from Mozilla
+EAPI=5
+HOMEPAGE=http://www.rust-lang.org/
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA
+RDEPEND=!dev-util/cargo
+REQUIRED_USE=amd64
+RESTRICT=binchecks strip
+SLOT=stable/1.45
+SRC_URI=https://static.rust-lang.org/dist/rustc-1.45.2-src.tar.gz -> rustc-1.45.2-src.tar.gz https://static.rust-lang.org/dist/2020-06-04/rust-std-1.44.0-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/rustc-1.44.0-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/cargo-0.45.0-x86_64-unknown-linux-gnu.tar.gz
+_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_md5_=23c5e23cdd47bbcbfc33803212b4d342
diff --git a/metadata/md5-cache/dev-lang/rust-1.46.0 b/metadata/md5-cache/dev-lang/rust-1.46.0
new file mode 100644
index 0000000..e6b5d9f
--- /dev/null
+++ b/metadata/md5-cache/dev-lang/rust-1.46.0
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare setup
+DEPEND=|| ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-libs/libxml2-2.9.6 >=dev-lang/perl-5.0
+DESCRIPTION=Systems programming language from Mozilla
+EAPI=5
+HOMEPAGE=http://www.rust-lang.org/
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA
+RDEPEND=!dev-util/cargo
+REQUIRED_USE=amd64
+RESTRICT=binchecks strip
+SLOT=stable/1.46
+SRC_URI=https://static.rust-lang.org/dist/rustc-1.46.0-src.tar.gz -> rustc-1.46.0-src.tar.gz https://static.rust-lang.org/dist/2020-08-03/rust-std-1.45.2-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/rustc-1.45.2-x86_64-unknown-linux-gnu.tar.gz https://static.rust-lang.org/dist/cargo-0.46.1-x86_64-unknown-linux-gnu.tar.gz
+_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_md5_=97d2f12ea689923c9ab432a817b3ea5e
diff --git a/metadata/md5-cache/dev-lang/rust-bootstrap-1.45.2 b/metadata/md5-cache/dev-lang/rust-bootstrap-1.45.2
new file mode 100644
index 0000000..b94cbec8
--- /dev/null
+++ b/metadata/md5-cache/dev-lang/rust-bootstrap-1.45.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install prepare unpack
+DEPEND=dev-libs/openssl net-libs/libssh2
+DESCRIPTION=Bootstraps the rustc Rust compiler using mrustc
+EAPI=7
+HOMEPAGE=https://github.com/thepowersgang/mrustc
+KEYWORDS=*
+LICENSE=MIT Apache-2.0 BSD-1 BSD-2 BSD-4 UoI-NCSA
+RDEPEND=dev-libs/openssl net-libs/libssh2
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/mrustc-0.9.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.29.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.30.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.31.1-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.32.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.33.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.34.2-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.35.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.36.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.37.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.38.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.39.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.40.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.41.1-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.42.0-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.43.1-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.44.1-src.tar.gz gs://chromeos-localmirror/distfiles/rustc-1.45.2-src.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ba2aa978ab8a884a752acf3a8d87b095
diff --git a/metadata/md5-cache/dev-libs/arc-libelf-0.8.13-r2 b/metadata/md5-cache/dev-libs/arc-libelf-0.8.13-r2
index 39075de..9fbf193 100644
--- a/metadata/md5-cache/dev-libs/arc-libelf-0.8.13-r2
+++ b/metadata/md5-cache/dev-libs/arc-libelf-0.8.13-r2
@@ -10,5 +10,5 @@
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
 SRC_URI=http://www.mr511.de/software/libelf-0.8.13.tar.gz
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3616d6e4d1c2e432b2361deb7e55e369
diff --git a/metadata/md5-cache/dev-libs/closure_linter-2.3.13 b/metadata/md5-cache/dev-libs/closure_linter-2.3.13
index 8c9454c..4b65d1fe 100644
--- a/metadata/md5-cache/dev-libs/closure_linter-2.3.13
+++ b/metadata/md5-cache/dev-libs/closure_linter-2.3.13
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=http://closure-linter.googlecode.com/files/closure_linter-2.3.13.tar.gz -> closure_linter-2.3.13.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=69d94aeb0e4bcbfcd63298379734bd45
diff --git a/metadata/md5-cache/dev-libs/closure_linter-2.3.13-r2 b/metadata/md5-cache/dev-libs/closure_linter-2.3.13-r2
index 8c9454c..4b65d1fe 100644
--- a/metadata/md5-cache/dev-libs/closure_linter-2.3.13-r2
+++ b/metadata/md5-cache/dev-libs/closure_linter-2.3.13-r2
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=http://closure-linter.googlecode.com/files/closure_linter-2.3.13.tar.gz -> closure_linter-2.3.13.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=69d94aeb0e4bcbfcd63298379734bd45
diff --git a/metadata/md5-cache/dev-libs/glib-2.58.3-r5 b/metadata/md5-cache/dev-libs/glib-2.58.3-r5
deleted file mode 100644
index 98c6f24..0000000
--- a/metadata/md5-cache/dev-libs/glib-2.58.3-r5
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install postinst postrm preinst prepare setup test unpack
-DEPEND=!<dev-util/gdbus-codegen-2.58.3 >=dev-libs/libpcre-8.31:3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,static-libs?] >=virtual/libiconv-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libffi-3.0.13-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libintl-0-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/zlib-1.2.8-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] kernel_linux? ( >=sys-apps/util-linux-2.23[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) selinux? ( >=sys-libs/libselinux-2.2.2-r5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xattr? ( >=sys-apps/attr-2.4.47-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) fam? ( >=virtual/fam-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) utils? ( >=dev-util/gdbus-codegen-2.58.3 virtual/libelf:0= ) app-text/docbook-xml-dtd:4.1.2 app-text/docbook-xsl-stylesheets >=dev-libs/libxslt-1.0 >=sys-devel/gettext-0.11 gtk-doc? ( >=dev-util/gtk-doc-1.20 ) systemtap? ( >=dev-util/systemtap-1.3 ) || ( dev-lang/python:3.7 dev-lang/python:3.6 >=dev-lang/python-2.7.5-r2:2.7 ) test? ( sys-devel/gdb >=dev-util/gdbus-codegen-2.58.3 >=sys-apps/dbus-1.2.14 ) >=dev-util/glib-utils-2.58.3 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=app-portage/elt-patches-20170317 app-arch/xz-utils >=sys-apps/sed-4 test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
-DESCRIPTION=The GLib library of C routines
-EAPI=5
-HOMEPAGE=https://www.gtk.org/
-IUSE=dbus debug doc fam gtk-doc kernel_linux +mime selinux static-libs systemtap test utils xattr debug kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 test
-KEYWORDS=*
-LICENSE=LGPL-2.1+
-PDEPEND=dbus? ( gnome-base/dconf ) mime? ( x11-misc/shared-mime-info )
-RDEPEND=!<dev-util/gdbus-codegen-2.58.3 >=dev-libs/libpcre-8.31:3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,static-libs?] >=virtual/libiconv-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libffi-3.0.13-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libintl-0-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/zlib-1.2.8-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] kernel_linux? ( >=sys-apps/util-linux-2.23[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) selinux? ( >=sys-libs/libselinux-2.2.2-r5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xattr? ( >=sys-apps/attr-2.4.47-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) fam? ( >=virtual/fam-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) utils? ( >=dev-util/gdbus-codegen-2.58.3 virtual/libelf:0= )
-SLOT=2
-SRC_URI=mirror://gnome/sources/glib/2.58/glib-2.58.3.tar.xz https://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	epunt-cxx	e99babeaa7d98c1caaa6a61a79902210	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=a5d9c28fe4e509df1a96c2b21b29dc8d
diff --git a/metadata/md5-cache/dev-libs/glib-2.62.6-r1 b/metadata/md5-cache/dev-libs/glib-2.62.6-r1
new file mode 100644
index 0000000..9da9952
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/glib-2.62.6-r1
@@ -0,0 +1,16 @@
+BDEPEND=doc? ( app-text/docbook-xsl-stylesheets dev-libs/libxslt ) >=sys-devel/gettext-0.19.8 gtk-doc? ( >=dev-util/gtk-doc-1.20 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 ) systemtap? ( >=dev-util/systemtap-1.3 ) || ( dev-lang/python:3.7 dev-lang/python:3.6 ) test? ( >=sys-apps/dbus-1.2.14 ) virtual/pkgconfig app-arch/xz-utils >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DEFINED_PHASES=compile configure install postinst postrm preinst prepare setup test
+DEPEND=!<dev-util/gdbus-codegen-2.62.6 >=virtual/libiconv-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-libs/libpcre-8.31:3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,static-libs?] >=virtual/libffi-3.0.13-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/zlib-1.2.8-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libintl-0-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] kernel_linux? ( >=sys-apps/util-linux-2.23[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) selinux? ( >=sys-libs/libselinux-2.2.2-r5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xattr? ( !elibc_glibc? ( >=sys-apps/attr-2.4.47-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) cros_host? ( virtual/libelf:0= ) fam? ( >=virtual/fam-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
+DESCRIPTION=The GLib library of C routines
+EAPI=7
+HOMEPAGE=https://www.gtk.org/
+IUSE=cros_host dbus debug doc elibc_glibc fam gtk-doc kernel_linux +mime selinux static-libs systemtap test utils xattr kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=LGPL-2.1+
+PDEPEND=dbus? ( gnome-base/dconf ) mime? ( x11-misc/shared-mime-info )
+RDEPEND=!<dev-util/gdbus-codegen-2.62.6 >=virtual/libiconv-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-libs/libpcre-8.31:3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,static-libs?] >=virtual/libffi-3.0.13-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/zlib-1.2.8-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/libintl-0-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] kernel_linux? ( >=sys-apps/util-linux-2.23[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) selinux? ( >=sys-libs/libselinux-2.2.2-r5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xattr? ( !elibc_glibc? ( >=sys-apps/attr-2.4.47-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) cros_host? ( virtual/libelf:0= ) fam? ( >=virtual/fam-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
+RESTRICT=!test? ( test )
+SLOT=2
+SRC_URI=mirror://gnome/sources/glib/2.62/glib-2.62.6.tar.xz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	linux-info	327865b9921771330775d971263dc234	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=0bab67cafc3983cb0bce13069b907ac4
diff --git a/metadata/md5-cache/dev-libs/libgit2-1.0.2_pre20200908-r1 b/metadata/md5-cache/dev-libs/libgit2-1.0.2_pre20200908-r1
new file mode 100644
index 0000000..2afd6fb
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libgit2-1.0.2_pre20200908-r1
@@ -0,0 +1,15 @@
+BDEPEND=dev-util/ninja dev-util/cmake
+DEFINED_PHASES=compile configure install prepare setup test
+DEPEND=!libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) sys-libs/zlib net-libs/http-parser:= gssapi? ( virtual/krb5 ) ssh? ( net-libs/libssh2 ) || ( dev-lang/python:3.8 dev-lang/python:3.7 dev-lang/python:3.6 ) virtual/pkgconfig
+DESCRIPTION=A linkable library for Git
+EAPI=7
+HOMEPAGE=https://libgit2.org
+IUSE=examples gssapi libressl +ssh test +threads trace
+KEYWORDS=*
+LICENSE=GPL-2-with-linking-exception
+RDEPEND=!libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) sys-libs/zlib net-libs/http-parser:= gssapi? ( virtual/krb5 ) ssh? ( net-libs/libssh2 )
+RESTRICT=!test? ( test )
+SLOT=0/1.0.2_pre20200908-r1
+SRC_URI=https://github.com/libgit2/libgit2/archive/1e987525b3bd86fc29e7ff67d973861efd22faf7.tar.gz -> libgit2-1.0.2_pre20200908.tar.gz
+_eclasses_=cmake	b22e256fd899c7e0c747e8834eff121a	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=2dcf6650ce28083276746bcf7df84231
diff --git a/metadata/md5-cache/dev-libs/libhandwriting-0.0.14 b/metadata/md5-cache/dev-libs/libhandwriting-0.0.14
new file mode 100644
index 0000000..67e386f
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libhandwriting-0.0.14
@@ -0,0 +1,13 @@
+DEFINED_PHASES=install
+DEPEND=chromeos-base/update_engine
+DESCRIPTION=Google handwriting recognition library for Chrome OS
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os
+IUSE=ondevice_handwriting ondevice_handwriting_dlc dlc
+KEYWORDS=*
+LICENSE=BSD-Google Apache-2.0 MPL-2.0 icu-58
+REQUIRED_USE=ondevice_handwriting_dlc? ( dlc ) ?? ( ondevice_handwriting ondevice_handwriting_dlc )
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/libhandwriting-0.0.14.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	dlc	c539aa2d32aaba22acfb2eb623710a96
+_md5_=d93ccd4bd60844fbc79c93f4dba1360b
diff --git a/metadata/md5-cache/dev-libs/libhandwriting-0.0.14-r1 b/metadata/md5-cache/dev-libs/libhandwriting-0.0.14-r1
new file mode 100644
index 0000000..67e386f
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libhandwriting-0.0.14-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=install
+DEPEND=chromeos-base/update_engine
+DESCRIPTION=Google handwriting recognition library for Chrome OS
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os
+IUSE=ondevice_handwriting ondevice_handwriting_dlc dlc
+KEYWORDS=*
+LICENSE=BSD-Google Apache-2.0 MPL-2.0 icu-58
+REQUIRED_USE=ondevice_handwriting_dlc? ( dlc ) ?? ( ondevice_handwriting ondevice_handwriting_dlc )
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/libhandwriting-0.0.14.tar.gz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	dlc	c539aa2d32aaba22acfb2eb623710a96
+_md5_=d93ccd4bd60844fbc79c93f4dba1360b
diff --git a/metadata/md5-cache/dev-libs/libhandwriting-0.0.9-r0 b/metadata/md5-cache/dev-libs/libhandwriting-0.0.9-r0
deleted file mode 100644
index 6b7c57a..0000000
--- a/metadata/md5-cache/dev-libs/libhandwriting-0.0.9-r0
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Google handwriting recognition library for Chrome OS
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os
-IUSE=ondevice_handwriting
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/libhandwriting-0.0.9.tar.gz
-_md5_=d4a9fcad463ac4ef1efa4c1f572542a8
diff --git a/metadata/md5-cache/dev-libs/libjcat-0.1.0 b/metadata/md5-cache/dev-libs/libjcat-0.1.0
index b67ecd7..6260b39 100644
--- a/metadata/md5-cache/dev-libs/libjcat-0.1.0
+++ b/metadata/md5-cache/dev-libs/libjcat-0.1.0
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=0
 SRC_URI=https://github.com/hughsie/libjcat/archive/0.1.0.tar.gz -> libjcat-0.1.0.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	vala	2f3804278870542119da624a5eded505	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	vala	2f3804278870542119da624a5eded505	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=b9a3eb1cb33476aa4d42b8c8dede6ce8
diff --git a/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r40 b/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r40
deleted file mode 100644
index 3ebeafc..0000000
--- a/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r40
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chrome-icu:= dev-libs/flatbuffers:= dev-libs/libutf:= sci-libs/tensorflow:= sys-libs/zlib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library for classifying text
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/libtextclassifier/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_1c6667714fda46bb46d673a59092849eecd8434c cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_1c6667714fda46bb46d673a59092849eecd8434c cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live
-RDEPEND=chromeos-base/chrome-icu:= dev-libs/flatbuffers:= dev-libs/libutf:= sci-libs/tensorflow:= sys-libs/zlib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r40
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f7e0ff1c01ddc56d2e75fb57c07d1c79
diff --git a/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r62 b/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r62
new file mode 100644
index 0000000..5a9410d
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libtextclassifier-0.0.1-r62
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chrome-icu:= dev-libs/flatbuffers:= dev-libs/libutf:= sci-libs/tensorflow:= sys-libs/zlib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library for classifying text
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/libtextclassifier/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_cf3b02ca5d761ceb01a6247d04a44c867aba06f2 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_cf3b02ca5d761ceb01a6247d04a44c867aba06f2 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live
+RDEPEND=chromeos-base/chrome-icu:= dev-libs/flatbuffers:= dev-libs/libutf:= sci-libs/tensorflow:= sys-libs/zlib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r62
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=71e0c9df576b4147e3934bbadbedc30f
diff --git a/metadata/md5-cache/dev-libs/libtextclassifier-9999 b/metadata/md5-cache/dev-libs/libtextclassifier-9999
index 4d67e93..a25b068 100644
--- a/metadata/md5-cache/dev-libs/libtextclassifier-9999
+++ b/metadata/md5-cache/dev-libs/libtextclassifier-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/chrome-icu:= dev-libs/flatbuffers:= dev-libs/libutf:= sci-libs/tensorflow:= sys-libs/zlib:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b083e9bae035972bd9ab4c05b95da0d8
diff --git a/metadata/md5-cache/dev-libs/libutf-0.0.1-r1 b/metadata/md5-cache/dev-libs/libutf-0.0.1-r1
deleted file mode 100644
index 5270301..0000000
--- a/metadata/md5-cache/dev-libs/libutf-0.0.1-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=A UTF-8 library based on the AOSP version of libutf.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/aosp/platform/external/libutf/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_fc022abae9d52285526cb0dda697e2bea18696ca cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_fc022abae9d52285526cb0dda697e2bea18696ca cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=MIT
-PROPERTIES=live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=21d9a6464f5cfc23f871e0006bfa7d3f
diff --git a/metadata/md5-cache/dev-libs/libutf-0.0.1-r21 b/metadata/md5-cache/dev-libs/libutf-0.0.1-r21
new file mode 100644
index 0000000..5435614
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libutf-0.0.1-r21
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=A UTF-8 library based on the AOSP version of libutf.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/aosp/platform/external/libutf/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_fc022abae9d52285526cb0dda697e2bea18696ca cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_fc022abae9d52285526cb0dda697e2bea18696ca cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=MIT
+PROPERTIES=live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=22bea1417fc771947c5a8f94a3c46fcd
diff --git a/metadata/md5-cache/dev-libs/libutf-9999 b/metadata/md5-cache/dev-libs/libutf-9999
index e74644e..7522505 100644
--- a/metadata/md5-cache/dev-libs/libutf-9999
+++ b/metadata/md5-cache/dev-libs/libutf-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=94c69194dc4b803ef28da92da8581564
diff --git a/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r1 b/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r1
deleted file mode 100644
index 1b84683..0000000
--- a/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=dev-util/meson-0.47.0 virtual/pkgconfig introspection? ( || ( ( dev-lang/python:3.8 dev-python/setuptools[python_targets_python3_8(-),python_single_target_python3_8(+)] ) ( dev-lang/python:3.7 dev-python/setuptools[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ( dev-lang/python:3.6 dev-python/setuptools[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ( >=dev-lang/python-2.7.5-r2:2.7 dev-python/setuptools[python_targets_python2_7(-),python_single_target_python2_7(+)] ) ) || ( dev-lang/python:3.8 dev-lang/python:3.7 dev-lang/python:3.6 >=dev-lang/python-2.7.5-r2:2.7 ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DEFINED_PHASES=compile configure install setup test
-DEPEND=dev-libs/glib:2 sys-apps/util-linux stemmer? ( dev-libs/snowball-stemmer ) doc? ( dev-util/gtk-doc ) introspection? ( dev-libs/gobject-introspection )
-DESCRIPTION=Library to help create and query binary XML blobs
-EAPI=7
-HOMEPAGE=https://github.com/hughsie/libxmlb
-IUSE=doc introspection stemmer test
-KEYWORDS=*
-LICENSE=LGPL-2.1+
-RDEPEND=dev-libs/glib:2 sys-apps/util-linux stemmer? ( dev-libs/snowball-stemmer )
-RESTRICT=!test? ( test )
-SLOT=0
-SRC_URI=https://github.com/hughsie/libxmlb/archive/0.1.15.tar.gz -> libxmlb-0.1.15.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8da0ebfccddd1f74a91d157e30dde2e4
diff --git a/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r2 b/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r2
new file mode 100644
index 0000000..e26d2e9
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/libxmlb-0.1.15-r2
@@ -0,0 +1,15 @@
+BDEPEND=>=dev-util/meson-0.47.0 virtual/pkgconfig introspection? ( || ( ( dev-lang/python:3.8 dev-python/setuptools[python_targets_python3_8(-),python_single_target_python3_8(+)] ) ( dev-lang/python:3.7 dev-python/setuptools[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ( dev-lang/python:3.6 dev-python/setuptools[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ( >=dev-lang/python-2.7.5-r2:2.7 dev-python/setuptools[python_targets_python2_7(-),python_single_target_python2_7(+)] ) ) || ( dev-lang/python:3.8 dev-lang/python:3.7 dev-lang/python:3.6 >=dev-lang/python-2.7.5-r2:2.7 ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DEFINED_PHASES=compile configure install setup test
+DEPEND=dev-libs/glib:2 sys-apps/util-linux stemmer? ( dev-libs/snowball-stemmer ) doc? ( dev-util/gtk-doc ) introspection? ( dev-libs/gobject-introspection )
+DESCRIPTION=Library to help create and query binary XML blobs
+EAPI=7
+HOMEPAGE=https://github.com/hughsie/libxmlb
+IUSE=doc introspection stemmer test
+KEYWORDS=*
+LICENSE=LGPL-2.1+
+RDEPEND=dev-libs/glib:2 sys-apps/util-linux stemmer? ( dev-libs/snowball-stemmer )
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=https://github.com/hughsie/libxmlb/archive/0.1.15.tar.gz -> libxmlb-0.1.15.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=be4eee33b8dcb29a0e1dc753aa605304
diff --git a/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r61 b/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r61
deleted file mode 100644
index 36f8693..0000000
--- a/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r61
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Base64 encoder/decoder library.
-EAPI=6
-HOMEPAGE=https://github.com/client9/stringencoders
-IUSE=fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a cros-debug cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live live
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8b8333307bf66ebd5e8b1f9b5b48d87e
diff --git a/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r81 b/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r81
new file mode 100644
index 0000000..71b039b
--- /dev/null
+++ b/metadata/md5-cache/dev-libs/modp_b64-0.0.1-r81
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Base64 encoder/decoder library.
+EAPI=6
+HOMEPAGE=https://github.com/client9/stringencoders
+IUSE=fuzzer fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a cros-debug cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_0d9f5ec1543458ecbe0d97bbabbdd59b79d56c5a compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live live
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cbf7aa09b0bc9236048dde04b78e4fe4
diff --git a/metadata/md5-cache/dev-libs/modp_b64-9999 b/metadata/md5-cache/dev-libs/modp_b64-9999
index ebbb96c..54707cb 100644
--- a/metadata/md5-cache/dev-libs/modp_b64-9999
+++ b/metadata/md5-cache/dev-libs/modp_b64-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD
 PROPERTIES=live live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=dd207217309d6bcdb7bd8800381ceb63
diff --git a/metadata/md5-cache/dev-python/btsocket-1.0-r20 b/metadata/md5-cache/dev-python/btsocket-1.0-r20
index b9d19b3..60407e2 100644
--- a/metadata/md5-cache/dev-python/btsocket-1.0-r20
+++ b/metadata/md5-cache/dev-python/btsocket-1.0-r20
@@ -10,5 +10,5 @@
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=ff0e36bab37f5787fe9415a9fa0f81e6
diff --git a/metadata/md5-cache/dev-python/btsocket-9999 b/metadata/md5-cache/dev-python/btsocket-9999
index 3392e60..818ae72 100644
--- a/metadata/md5-cache/dev-python/btsocket-9999
+++ b/metadata/md5-cache/dev-python/btsocket-9999
@@ -10,5 +10,5 @@
 RDEPEND=python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=af53dab45f03e29e2a08fc545530ee7c
diff --git a/metadata/md5-cache/dev-python/cherrypy-17.4.1-r3 b/metadata/md5-cache/dev-python/cherrypy-17.4.1-r3
index 1aa4a2b..803fe0b 100644
--- a/metadata/md5-cache/dev-python/cherrypy-17.4.1-r3
+++ b/metadata/md5-cache/dev-python/cherrypy-17.4.1-r3
@@ -12,5 +12,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=mirror://pypi/C/CherryPy/CherryPy-17.4.1.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d5d66f159bbc7ee8c5f203d7e33d7062
diff --git a/metadata/md5-cache/dev-python/clang-python-7.0.0-r2 b/metadata/md5-cache/dev-python/clang-python-7.0.0-r2
index 0cc9231..2824afe 100644
--- a/metadata/md5-cache/dev-python/clang-python-7.0.0-r2
+++ b/metadata/md5-cache/dev-python/clang-python-7.0.0-r2
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=0
 SRC_URI=https://releases.llvm.org/7.0.0/cfe-7.0.0.src.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=90310da8b6b003dadff4fcc86181c5e2
diff --git a/metadata/md5-cache/dev-python/google-api-core-1.14.2 b/metadata/md5-cache/dev-python/google-api-core-1.14.2
deleted file mode 100644
index e296b2f..0000000
--- a/metadata/md5-cache/dev-python/google-api-core-1.14.2
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf dev-python/setuptools python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-DESCRIPTION=Google API client core library
-EAPI=6
-HOMEPAGE=https://pypi.python.org/pypi/google-api-core
-IUSE=python_targets_python2_7 python_targets_python3_6
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
-SLOT=0
-SRC_URI=mirror://pypi/g/google-api-core/google-api-core-1.14.2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=26fa2f6c14e35909c305ccd2b8e5431d
diff --git a/metadata/md5-cache/dev-python/google-api-core-1.14.2-r1 b/metadata/md5-cache/dev-python/google-api-core-1.14.2-r1
deleted file mode 100644
index e296b2f..0000000
--- a/metadata/md5-cache/dev-python/google-api-core-1.14.2-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf dev-python/setuptools python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-DESCRIPTION=Google API client core library
-EAPI=6
-HOMEPAGE=https://pypi.python.org/pypi/google-api-core
-IUSE=python_targets_python2_7 python_targets_python3_6
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
-SLOT=0
-SRC_URI=mirror://pypi/g/google-api-core/google-api-core-1.14.2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=26fa2f6c14e35909c305ccd2b8e5431d
diff --git a/metadata/md5-cache/dev-python/google-api-core-1.19.0 b/metadata/md5-cache/dev-python/google-api-core-1.19.0
new file mode 100644
index 0000000..d308728
--- /dev/null
+++ b/metadata/md5-cache/dev-python/google-api-core-1.19.0
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf dev-python/setuptools python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+DESCRIPTION=Google API client core library
+EAPI=6
+HOMEPAGE=https://pypi.python.org/pypi/google-api-core
+IUSE=python_targets_python2_7 python_targets_python3_6
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=virtual/python-futures[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pytz[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/requests[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/google-auth[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/googleapis-common-protos[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-libs/protobuf python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
+SLOT=0
+SRC_URI=mirror://pypi/g/google-api-core/google-api-core-1.19.0.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=26fa2f6c14e35909c305ccd2b8e5431d
diff --git a/metadata/md5-cache/dev-python/google-cloud-core-1.0.3 b/metadata/md5-cache/dev-python/google-cloud-core-1.0.3
deleted file mode 100644
index 4073eb5..0000000
--- a/metadata/md5-cache/dev-python/google-cloud-core-1.0.3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=dev-python/google-api-core-1.14.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-DESCRIPTION=Google Cloud API client core library
-EAPI=6
-IUSE=python_targets_python2_7 python_targets_python3_6
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=>=dev-python/google-api-core-1.14.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
-SLOT=0
-SRC_URI=mirror://pypi/g/google-cloud-core/google-cloud-core-1.0.3.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=4c6b7b2e2a3ef4ab1e21d766f97f4b67
diff --git a/metadata/md5-cache/dev-python/google-cloud-core-1.0.3-r1 b/metadata/md5-cache/dev-python/google-cloud-core-1.0.3-r1
deleted file mode 100644
index 4073eb5..0000000
--- a/metadata/md5-cache/dev-python/google-cloud-core-1.0.3-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=dev-python/google-api-core-1.14.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-DESCRIPTION=Google Cloud API client core library
-EAPI=6
-IUSE=python_targets_python2_7 python_targets_python3_6
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=>=dev-python/google-api-core-1.14.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
-SLOT=0
-SRC_URI=mirror://pypi/g/google-cloud-core/google-cloud-core-1.0.3.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=4c6b7b2e2a3ef4ab1e21d766f97f4b67
diff --git a/metadata/md5-cache/dev-python/google-cloud-core-1.4.1 b/metadata/md5-cache/dev-python/google-cloud-core-1.4.1
new file mode 100644
index 0000000..7e3410a
--- /dev/null
+++ b/metadata/md5-cache/dev-python/google-cloud-core-1.4.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=>=dev-python/google-api-core-1.19.0[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] >=dev-python/grpcio-1.8.2[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DESCRIPTION=Google Cloud API client core library
+EAPI=6
+IUSE=python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=>=dev-python/google-api-core-1.19.0[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] >=dev-python/grpcio-1.8.2[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+SLOT=0
+SRC_URI=mirror://pypi/g/google-cloud-core/google-cloud-core-1.4.1.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=39c4e9cbac84e35b9f6bdb8d3c4ca0a8
diff --git a/metadata/md5-cache/dev-python/google-cloud-logging-1.15.1 b/metadata/md5-cache/dev-python/google-cloud-logging-1.15.1
new file mode 100644
index 0000000..397ae6e
--- /dev/null
+++ b/metadata/md5-cache/dev-python/google-cloud-logging-1.15.1
@@ -0,0 +1,15 @@
+BDEPEND=python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-python/google-api-core[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/google-cloud-core[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DESCRIPTION=Stackdriver Logging API client library
+EAPI=7
+HOMEPAGE=https://pypi.org/project/google-cloud-logging/
+IUSE=python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=dev-python/google-api-core[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/google-cloud-core[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0
+SRC_URI=mirror://pypi/g/google-cloud-logging/google-cloud-logging-1.15.1.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ff4ee1eb10190e0d0721fedabc109c7c
diff --git a/metadata/md5-cache/dev-python/google-cloud-pubsub-1.0.2 b/metadata/md5-cache/dev-python/google-cloud-pubsub-1.0.2
index 4f3cd1f..1ecf05b 100644
--- a/metadata/md5-cache/dev-python/google-cloud-pubsub-1.0.2
+++ b/metadata/md5-cache/dev-python/google-cloud-pubsub-1.0.2
@@ -11,5 +11,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/g/google-cloud-pubsub/google-cloud-pubsub-1.0.2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4c448de6787bc8c04c41c52758b0caca
diff --git a/metadata/md5-cache/dev-python/google-cloud-storage-1.19.0 b/metadata/md5-cache/dev-python/google-cloud-storage-1.19.0
index 5d07889..b445650 100644
--- a/metadata/md5-cache/dev-python/google-cloud-storage-1.19.0
+++ b/metadata/md5-cache/dev-python/google-cloud-storage-1.19.0
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/g/google-cloud-storage/google-cloud-storage-1.19.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=f3b72fb8052a863d380e91380a9561b2
diff --git a/metadata/md5-cache/dev-python/google-resumable-media-0.3.3 b/metadata/md5-cache/dev-python/google-resumable-media-0.3.3
index e7ae69c..7c607f6 100644
--- a/metadata/md5-cache/dev-python/google-resumable-media-0.3.3
+++ b/metadata/md5-cache/dev-python/google-resumable-media-0.3.3
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/g/google-resumable-media/google-resumable-media-0.3.3.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=88bc75806a0c6c91ac07ea5e381da01d
diff --git a/metadata/md5-cache/dev-python/googleapis-common-protos-1.6.0 b/metadata/md5-cache/dev-python/googleapis-common-protos-1.6.0
index c551915..576bc82 100644
--- a/metadata/md5-cache/dev-python/googleapis-common-protos-1.6.0
+++ b/metadata/md5-cache/dev-python/googleapis-common-protos-1.6.0
@@ -11,5 +11,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/g/googleapis-common-protos/googleapis-common-protos-1.6.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b2316ff1cc1d3d3720c2f363c526a636
diff --git a/metadata/md5-cache/dev-python/grpc-google-iam-v1-0.12.3 b/metadata/md5-cache/dev-python/grpc-google-iam-v1-0.12.3
index 3faca45..c1b7dee 100644
--- a/metadata/md5-cache/dev-python/grpc-google-iam-v1-0.12.3
+++ b/metadata/md5-cache/dev-python/grpc-google-iam-v1-0.12.3
@@ -11,5 +11,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/g/grpc-google-iam-v1/grpc-google-iam-v1-0.12.3.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0e823b92a2ac6f12324a57e0a553bad5
diff --git a/metadata/md5-cache/dev-python/grpcio-1.23.0 b/metadata/md5-cache/dev-python/grpcio-1.23.0
index 6ae193c..bfe6b04 100644
--- a/metadata/md5-cache/dev-python/grpcio-1.23.0
+++ b/metadata/md5-cache/dev-python/grpcio-1.23.0
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=mirror://pypi/g/grpcio/grpcio-1.23.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=299948b313f62735142b7c097dd9ba27
diff --git a/metadata/md5-cache/dev-python/hid-tools-0.2-r1 b/metadata/md5-cache/dev-python/hid-tools-0.2-r1
new file mode 100644
index 0000000..f2e0ea9
--- /dev/null
+++ b/metadata/md5-cache/dev-python/hid-tools-0.2-r1
@@ -0,0 +1,15 @@
+BDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-python/click[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/pyyaml[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/parse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DESCRIPTION=Tools to interact with the kernel's HID subsystem
+EAPI=7
+HOMEPAGE=https://gitlab.freedesktop.org/libevdev/hid-tools
+IUSE=python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=dev-python/click[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/pyyaml[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/parse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0
+SRC_URI=https://gitlab.freedesktop.org/libevdev/hid-tools/-/archive/0.2/hid-tools-0.2.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ec8eede038689e100bd2777c942d383d
diff --git a/metadata/md5-cache/dev-python/mkvparse-1.1.0 b/metadata/md5-cache/dev-python/mkvparse-1.1.0
index b785f92..41a914a 100644
--- a/metadata/md5-cache/dev-python/mkvparse-1.1.0
+++ b/metadata/md5-cache/dev-python/mkvparse-1.1.0
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=https://github.com/vi/mkvparse/archive/v1.1.0.tar.gz -> mkvparse-1.1.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=7a8d6083793e412a953bec8c63e3618c
diff --git a/metadata/md5-cache/dev-python/mkvparse-1.1.0-r3 b/metadata/md5-cache/dev-python/mkvparse-1.1.0-r3
index b785f92..41a914a 100644
--- a/metadata/md5-cache/dev-python/mkvparse-1.1.0-r3
+++ b/metadata/md5-cache/dev-python/mkvparse-1.1.0-r3
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=https://github.com/vi/mkvparse/archive/v1.1.0.tar.gz -> mkvparse-1.1.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=7a8d6083793e412a953bec8c63e3618c
diff --git a/metadata/md5-cache/dev-python/mysqlclient-1.4.2-r2 b/metadata/md5-cache/dev-python/mysqlclient-1.4.2-r2
index 89ba9e6..b615af3 100644
--- a/metadata/md5-cache/dev-python/mysqlclient-1.4.2-r2
+++ b/metadata/md5-cache/dev-python/mysqlclient-1.4.2-r2
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=mirror://pypi/m/mysqlclient/mysqlclient-1.4.2.post1.tar.gz -> mysqlclient-1.4.2-r2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=d3daaaf48c43c690df8d9eaac1b5ebcd
diff --git a/metadata/md5-cache/dev-python/parallel-ssh-1.9.1 b/metadata/md5-cache/dev-python/parallel-ssh-1.9.1
index a7c53bc..1ef42fa 100644
--- a/metadata/md5-cache/dev-python/parallel-ssh-1.9.1
+++ b/metadata/md5-cache/dev-python/parallel-ssh-1.9.1
@@ -9,5 +9,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/p/parallel-ssh/parallel-ssh-1.9.1.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=117bec043e6d0a212bd27cca846daf90
diff --git a/metadata/md5-cache/dev-python/parse-1.16.0-r1 b/metadata/md5-cache/dev-python/parse-1.16.0-r1
new file mode 100644
index 0000000..10929cf
--- /dev/null
+++ b/metadata/md5-cache/dev-python/parse-1.16.0-r1
@@ -0,0 +1,14 @@
+BDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Parse strings based on Python's format() syntax
+EAPI=7
+HOMEPAGE=https://github.com/r1chardj0n3s/parse
+IUSE=python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=MIT
+RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 )
+SLOT=0
+SRC_URI=https://github.com/r1chardj0n3s/parse/archive/27db6b3498aeee80aa87c083dda76f2df2d87fa4.zip -> parse-1.16.0.zip
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3603acd08669affb3ae0209a44e1cd58
diff --git a/metadata/md5-cache/dev-python/protobuf-python-3.7.0 b/metadata/md5-cache/dev-python/protobuf-python-3.7.0
index b9bf3e3..cfb056a 100644
--- a/metadata/md5-cache/dev-python/protobuf-python-3.7.0
+++ b/metadata/md5-cache/dev-python/protobuf-python-3.7.0
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0/18
 SRC_URI=https://github.com/protocolbuffers/protobuf/archive/v3.7.0.tar.gz -> protobuf-3.7.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=d5a2500bc4f49c825e3a6b51f2959dbf
diff --git a/metadata/md5-cache/dev-python/protobuf-python-3.7.0-r1 b/metadata/md5-cache/dev-python/protobuf-python-3.7.0-r1
index b9bf3e3..cfb056a 100644
--- a/metadata/md5-cache/dev-python/protobuf-python-3.7.0-r1
+++ b/metadata/md5-cache/dev-python/protobuf-python-3.7.0-r1
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0/18
 SRC_URI=https://github.com/protocolbuffers/protobuf/archive/v3.7.0.tar.gz -> protobuf-3.7.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=d5a2500bc4f49c825e3a6b51f2959dbf
diff --git a/metadata/md5-cache/dev-python/pyahocorasick-1.4.0-r1 b/metadata/md5-cache/dev-python/pyahocorasick-1.4.0-r1
index 20159c1..0e727e7 100644
--- a/metadata/md5-cache/dev-python/pyahocorasick-1.4.0-r1
+++ b/metadata/md5-cache/dev-python/pyahocorasick-1.4.0-r1
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=mirror://pypi/p/pyahocorasick/pyahocorasick-1.4.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=d438d8752ffe5d16568fe84c63135ce5
diff --git a/metadata/md5-cache/dev-python/pygobject-2.18.0-r1 b/metadata/md5-cache/dev-python/pygobject-2.18.0-r1
index 1073d1f..699b425 100644
--- a/metadata/md5-cache/dev-python/pygobject-2.18.0-r1
+++ b/metadata/md5-cache/dev-python/pygobject-2.18.0-r1
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare unpack
-DEPEND=>=dev-libs/glib-2.24.0:2 libffi? ( virtual/libffi ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] doc? ( dev-libs/libxslt >=app-text/docbook-xsl-stylesheets-1.70.1 ) test? ( media-fonts/font-cursor-misc media-fonts/font-misc-misc ) >=dev-util/pkgconfig-0.12 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
+DEPEND=>=dev-libs/glib-2.24.0:2 libffi? ( virtual/libffi ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] doc? ( dev-libs/libxslt >=app-text/docbook-xsl-stylesheets-1.70.1 ) test? ( media-fonts/font-cursor-misc media-fonts/font-misc-misc ) >=dev-util/pkgconfig-0.12 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
 DESCRIPTION=GLib's GObject library bindings for Python
 EAPI=5
 HOMEPAGE=http://www.pygtk.org/
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=2
 SRC_URI=mirror://gnome/sources/pygobject/2.18/pygobject-2.18.0.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=56f62a7fd9f759c1b7b1016b89fdc041
diff --git a/metadata/md5-cache/dev-python/pygobject-2.18.0-r10 b/metadata/md5-cache/dev-python/pygobject-2.18.0-r10
index 1073d1f..699b425 100644
--- a/metadata/md5-cache/dev-python/pygobject-2.18.0-r10
+++ b/metadata/md5-cache/dev-python/pygobject-2.18.0-r10
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare unpack
-DEPEND=>=dev-libs/glib-2.24.0:2 libffi? ( virtual/libffi ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] doc? ( dev-libs/libxslt >=app-text/docbook-xsl-stylesheets-1.70.1 ) test? ( media-fonts/font-cursor-misc media-fonts/font-misc-misc ) >=dev-util/pkgconfig-0.12 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
+DEPEND=>=dev-libs/glib-2.24.0:2 libffi? ( virtual/libffi ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] doc? ( dev-libs/libxslt >=app-text/docbook-xsl-stylesheets-1.70.1 ) test? ( media-fonts/font-cursor-misc media-fonts/font-misc-misc ) >=dev-util/pkgconfig-0.12 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
 DESCRIPTION=GLib's GObject library bindings for Python
 EAPI=5
 HOMEPAGE=http://www.pygtk.org/
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=2
 SRC_URI=mirror://gnome/sources/pygobject/2.18/pygobject-2.18.0.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=56f62a7fd9f759c1b7b1016b89fdc041
diff --git a/metadata/md5-cache/dev-python/pyrad-2.1 b/metadata/md5-cache/dev-python/pyrad-2.1
index 4cde662..03d3d8c 100644
--- a/metadata/md5-cache/dev-python/pyrad-2.1
+++ b/metadata/md5-cache/dev-python/pyrad-2.1
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=mirror://pypi/p/pyrad/pyrad-2.1.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=5406e1ab0bbcf8ef96538e539cbcfd22
diff --git a/metadata/md5-cache/dev-python/python-uinput-0.11.2 b/metadata/md5-cache/dev-python/python-uinput-0.11.2
index 53781d0..6f54597 100644
--- a/metadata/md5-cache/dev-python/python-uinput-0.11.2
+++ b/metadata/md5-cache/dev-python/python-uinput-0.11.2
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/p/python-uinput/python-uinput-0.11.2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=dede1210bd2bb78c267833e3d792863d
diff --git a/metadata/md5-cache/dev-python/python-uinput-0.11.2-r4 b/metadata/md5-cache/dev-python/python-uinput-0.11.2-r4
index 53781d0..6f54597 100644
--- a/metadata/md5-cache/dev-python/python-uinput-0.11.2-r4
+++ b/metadata/md5-cache/dev-python/python-uinput-0.11.2-r4
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/p/python-uinput/python-uinput-0.11.2.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=dede1210bd2bb78c267833e3d792863d
diff --git a/metadata/md5-cache/dev-python/ssh2-python-0.17.0 b/metadata/md5-cache/dev-python/ssh2-python-0.17.0
index 7cd8ae0..0f018f2 100644
--- a/metadata/md5-cache/dev-python/ssh2-python-0.17.0
+++ b/metadata/md5-cache/dev-python/ssh2-python-0.17.0
@@ -9,5 +9,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
 SLOT=0
 SRC_URI=mirror://pypi/s/ssh2-python/ssh2-python-0.17.0.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=8728ff5f7aa6d82ba9aaa0a9889d66fd
diff --git a/metadata/md5-cache/dev-python/ws4py-0.5.1 b/metadata/md5-cache/dev-python/ws4py-0.5.1
index f5a119d..79e3baa 100644
--- a/metadata/md5-cache/dev-python/ws4py-0.5.1
+++ b/metadata/md5-cache/dev-python/ws4py-0.5.1
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=0
 SRC_URI=https://github.com/Lawouach/WebSocket-for-Python/archive/0.5.1.tar.gz -> ws4py-0.5.1.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	vcs-snapshot	3be1ab44131e8c0bbdaa75823008444b	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	vcs-snapshot	3be1ab44131e8c0bbdaa75823008444b	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=eec26d787b5ca77900387b83133c2d28
diff --git a/metadata/md5-cache/dev-rust/9s-0.1.0-r20 b/metadata/md5-cache/dev-rust/9s-0.1.0-r20
deleted file mode 100644
index 16472a6..0000000
--- a/metadata/md5-cache/dev-rust/9s-0.1.0-r20
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/getopts:= dev-rust/libc:= dev-rust/libchromeos:= dev-rust/log:= dev-rust/p9:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Server binary for the 9P file system protocol
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/9s/
-IUSE=test cros_host cros_workon_tree_a77d3b508a990de2e8719aa84be0734535a1cbfb cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<chromeos-base/crosvm-0.0.1-r260 !dev-rust/9s:0.1.0
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6fd5b5039ae22b0e7c59cbec6c0bb461
diff --git a/metadata/md5-cache/dev-rust/9s-0.1.0-r23 b/metadata/md5-cache/dev-rust/9s-0.1.0-r23
new file mode 100644
index 0000000..178a651
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/9s-0.1.0-r23
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/getopts:= dev-rust/libc:= dev-rust/libchromeos:= dev-rust/log:= dev-rust/p9:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Server binary for the 9P file system protocol
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/9s/
+IUSE=test cros_host cros_workon_tree_5011a6570d961e61bad9165a158fc411e3bc64a8 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<chromeos-base/crosvm-0.0.1-r260 !dev-rust/9s:0.1.0
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=272f63e9f2a25904db04325f553b6e53
diff --git a/metadata/md5-cache/dev-rust/9s-9999 b/metadata/md5-cache/dev-rust/9s-9999
index c0a2a19..591c730 100644
--- a/metadata/md5-cache/dev-rust/9s-9999
+++ b/metadata/md5-cache/dev-rust/9s-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<chromeos-base/crosvm-0.0.1-r260 !dev-rust/9s:0.1.0
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=951e39fd7b69f0984b30c8f6485948c8
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=29d324f0f71ed645897e3afad5a62f37
diff --git a/metadata/md5-cache/dev-rust/addr2line-0.6.0 b/metadata/md5-cache/dev-rust/addr2line-0.6.0
index 5b95e75..3b529b1 100644
--- a/metadata/md5-cache/dev-rust/addr2line-0.6.0
+++ b/metadata/md5-cache/dev-rust/addr2line-0.6.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty addr2line crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/aho-corasick-0.6.10 b/metadata/md5-cache/dev-rust/aho-corasick-0.6.10
index bc5bcc5..bb0623e 100644
--- a/metadata/md5-cache/dev-rust/aho-corasick-0.6.10
+++ b/metadata/md5-cache/dev-rust/aho-corasick-0.6.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/memchr-2.0.0:= <dev-rust/memchr-3.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Fast multiple substring searching with finite state machines.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.10/r0
 SRC_URI=https://crates.io/api/v1/crates/aho-corasick/0.6.10/download -> aho-corasick-0.6.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5c0a0dd5a3f52108e3c1cef9d1ed40f3
diff --git a/metadata/md5-cache/dev-rust/alsa-sys-0.2.0 b/metadata/md5-cache/dev-rust/alsa-sys-0.2.0
new file mode 100644
index 0000000..adf09db
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/alsa-sys-0.2.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/libc-0.2.65:= <dev-rust/libc-0.3 >=dev-rust/pkg-config-0.3.0:= <dev-rust/pkg-config-0.4.0 >=media-libs/alsa-lib-1.1.8-r3:= <media-libs/alsa-lib-2.0.0 >=virtual/rust-1.39.0:=
+DESCRIPTION=FFI bindings for the ALSA project (Advanced Linux Sound Architecture)
+EAPI=6
+HOMEPAGE=https://docs.rs/alsa-sys
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.2.0/r0
+SRC_URI=https://crates.io/api/v1/crates/alsa-sys/0.2.0/download -> alsa-sys-0.2.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6ee2ffc215c61611cea439a928807a20
diff --git a/metadata/md5-cache/dev-rust/android_log-sys-0.2.0 b/metadata/md5-cache/dev-rust/android_log-sys-0.2.0
new file mode 100644
index 0000000..c0e7481
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/android_log-sys-0.2.0
@@ -0,0 +1,11 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=Empty android_log-sys crate
+EAPI=6
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.2.0/r0
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/ansi_term-0.11.0 b/metadata/md5-cache/dev-rust/ansi_term-0.11.0
index 0ff448b..2ed9fee 100644
--- a/metadata/md5-cache/dev-rust/ansi_term-0.11.0
+++ b/metadata/md5-cache/dev-rust/ansi_term-0.11.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/winapi-0.3.4:= <dev-rust/winapi-0.4.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Library for ANSI terminal colours and styles (bold, underline).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.11.0/r0
 SRC_URI=https://crates.io/api/v1/crates/ansi_term/0.11.0/download -> ansi_term-0.11.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4ffb9be5a3ecd0fac6d7c4ec948577f2
diff --git a/metadata/md5-cache/dev-rust/ansi_term-0.11.0-r1 b/metadata/md5-cache/dev-rust/ansi_term-0.11.0-r1
index 9e05c2f..256521d 100644
--- a/metadata/md5-cache/dev-rust/ansi_term-0.11.0-r1
+++ b/metadata/md5-cache/dev-rust/ansi_term-0.11.0-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/winapi-0.3.4:= <dev-rust/winapi-0.4.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Library for ANSI terminal colours and styles (bold, underline).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.11.0/r1
 SRC_URI=https://crates.io/api/v1/crates/ansi_term/0.11.0/download -> ansi_term-0.11.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4ffb9be5a3ecd0fac6d7c4ec948577f2
diff --git a/metadata/md5-cache/dev-rust/anyhow-1.0.32 b/metadata/md5-cache/dev-rust/anyhow-1.0.32
new file mode 100644
index 0000000..c38ea3a
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/anyhow-1.0.32
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=A trait object based error type for easy idiomatic error handling.
+EAPI=7
+HOMEPAGE=https://github.com/thiserror/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.32/r0
+SRC_URI=https://crates.io/api/v1/crates/anyhow/1.0.32/download -> anyhow-1.0.32.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3da61c848bf45dba7ac32cba2480afe3
diff --git a/metadata/md5-cache/dev-rust/arrayvec-0.4.10 b/metadata/md5-cache/dev-rust/arrayvec-0.4.10
index 7bdcc6e..3619ea5 100644
--- a/metadata/md5-cache/dev-rust/arrayvec-0.4.10
+++ b/metadata/md5-cache/dev-rust/arrayvec-0.4.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/nodrop-0.1*:= =dev-rust/serde-1*:= =dev-rust/bencher-0.1*:= =dev-rust/matches-0.1*:= =dev-rust/serde_test-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A vector with fixed capacity, backed by an array (it can be stored on the stack too)
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.10/r0
 SRC_URI=https://crates.io/api/v1/crates/arrayvec/0.4.10/download -> arrayvec-0.4.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f68f6d45109c58bdcff0e3f139087c6b
diff --git a/metadata/md5-cache/dev-rust/ascii-1.0.0 b/metadata/md5-cache/dev-rust/ascii-1.0.0
new file mode 100644
index 0000000..73a61bf
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/ascii-1.0.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/serde-1.0.25:= <dev-rust/serde-2 >=dev-rust/serde_test-1:= <dev-rust/serde_test-2 >=virtual/rust-1.39.0:=
+DESCRIPTION=ASCII-only equivalents to 'char', 'str' and 'String'.
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/ascii/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.0/r0
+SRC_URI=https://crates.io/api/v1/crates/ascii/1.0.0/download -> ascii-1.0.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e08e7df2ca251a739a0e4bef2c4e8747
diff --git a/metadata/md5-cache/dev-rust/assertions-0.1.0-r6 b/metadata/md5-cache/dev-rust/assertions-0.1.0-r6
index 860d218..dc77774 100644
--- a/metadata/md5-cache/dev-rust/assertions-0.1.0-r6
+++ b/metadata/md5-cache/dev-rust/assertions-0.1.0-r6
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/assertions-0.1.0-r3
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0.1.0-r6
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d7786742f1e76503dd60c1971b61ed8d
diff --git a/metadata/md5-cache/dev-rust/assertions-9999 b/metadata/md5-cache/dev-rust/assertions-9999
index 7d1ec99..29e7b0f 100644
--- a/metadata/md5-cache/dev-rust/assertions-9999
+++ b/metadata/md5-cache/dev-rust/assertions-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/assertions-0.1.0-r3
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=116ee0b4636633e7202b1a964ebcf400
diff --git a/metadata/md5-cache/dev-rust/async-trait-0.1.36 b/metadata/md5-cache/dev-rust/async-trait-0.1.36
index 06f7642..edf400e 100644
--- a/metadata/md5-cache/dev-rust/async-trait-0.1.36
+++ b/metadata/md5-cache/dev-rust/async-trait-0.1.36
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Async trait methods
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.36/r0
 SRC_URI=https://crates.io/api/v1/crates/async-trait/0.1.36/download -> async-trait-0.1.36.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d0fef127d24456c9594aa350577c8211
diff --git a/metadata/md5-cache/dev-rust/atty-0.2.11 b/metadata/md5-cache/dev-rust/atty-0.2.11
index 9f6008c..f6c52c4 100644
--- a/metadata/md5-cache/dev-rust/atty-0.2.11
+++ b/metadata/md5-cache/dev-rust/atty-0.2.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/termion-1.5.1:= >=dev-rust/libc-0.2.0:= >=dev-rust/winapi-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=are you or are you not a tty?
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.11/r0
 SRC_URI=https://crates.io/api/v1/crates/atty/0.2.11/download -> atty-0.2.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=592853346ae42d025acbaa00aa52594d
diff --git a/metadata/md5-cache/dev-rust/autocfg-0.1.2 b/metadata/md5-cache/dev-rust/autocfg-0.1.2
index 13b7af1..9c00b04 100644
--- a/metadata/md5-cache/dev-rust/autocfg-0.1.2
+++ b/metadata/md5-cache/dev-rust/autocfg-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library for build scripts to automatically configure code based on compiler support
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/autocfg/0.1.2/download -> autocfg-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fda9579d780a9d1e29c9ea95abe4cbef
diff --git a/metadata/md5-cache/dev-rust/autocfg-1.0.0 b/metadata/md5-cache/dev-rust/autocfg-1.0.0
new file mode 100644
index 0000000..13d99da
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/autocfg-1.0.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=A Rust library for build scripts to automatically configure code based on compiler support
+EAPI=7
+HOMEPAGE=https://github.com/cuviper/autocfg
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.0/r0
+SRC_URI=https://crates.io/api/v1/crates/autocfg/1.0.0/download -> autocfg-1.0.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6de1f03da89ff62be88bedaa5800e08e
diff --git a/metadata/md5-cache/dev-rust/automod-0.1.1 b/metadata/md5-cache/dev-rust/automod-0.1.1
index e53e878..0696305 100644
--- a/metadata/md5-cache/dev-rust/automod-0.1.1
+++ b/metadata/md5-cache/dev-rust/automod-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty automod crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/average-0.9.3 b/metadata/md5-cache/dev-rust/average-0.9.3
index 4c49e43..4abf31e 100644
--- a/metadata/md5-cache/dev-rust/average-0.9.3
+++ b/metadata/md5-cache/dev-rust/average-0.9.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty average crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.9.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/backtrace-0.3.7 b/metadata/md5-cache/dev-rust/backtrace-0.3.7
index 1d7beea..33720fd9 100644
--- a/metadata/md5-cache/dev-rust/backtrace-0.3.7
+++ b/metadata/md5-cache/dev-rust/backtrace-0.3.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cfg-if-0.1.0:= >=dev-rust/libc-0.2.0:= >=dev-rust/addr2line-0.6.0:= >=dev-rust/backtrace-sys-0.1.3:= >=dev-rust/rustc-demangle-0.1.4:= >=dev-rust/cpp_demangle-0.2.3:= >=dev-rust/findshlibs-0.3.3:= >=dev-rust/gimli-0.15.0:= >=dev-rust/memmap-0.6.2:= >=dev-rust/object-0.7.0:= >=dev-rust/rustc-serialize-0.3.0:= >=dev-rust/serde-1.0.0:= >=dev-rust/serde_derive-1.0.0:= >=dev-rust/winapi-0.3.3:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library for acquiring backtraces at runtime for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.7/r0
 SRC_URI=https://crates.io/api/v1/crates/backtrace/0.3.7/download -> backtrace-0.3.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e4cd0864d529941f7ec234bc26f4511a
diff --git a/metadata/md5-cache/dev-rust/backtrace-sys-0.1.16 b/metadata/md5-cache/dev-rust/backtrace-sys-0.1.16
index b6db703..f793b4f 100644
--- a/metadata/md5-cache/dev-rust/backtrace-sys-0.1.16
+++ b/metadata/md5-cache/dev-rust/backtrace-sys-0.1.16
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cc-1.0.0:= >=dev-rust/libc-0.2.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Bindings to the libbacktrace gcc library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.16/r0
 SRC_URI=https://crates.io/api/v1/crates/backtrace-sys/0.1.16/download -> backtrace-sys-0.1.16.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3ff642e41e05fc661b866cba653b8728
diff --git a/metadata/md5-cache/dev-rust/backtrace-sys-0.1.3 b/metadata/md5-cache/dev-rust/backtrace-sys-0.1.3
index 0f34ca7..16c1ac0 100644
--- a/metadata/md5-cache/dev-rust/backtrace-sys-0.1.3
+++ b/metadata/md5-cache/dev-rust/backtrace-sys-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty backtrace-sys crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/bencher-0.1.5 b/metadata/md5-cache/dev-rust/bencher-0.1.5
index b32d0df..01c12b3 100644
--- a/metadata/md5-cache/dev-rust/bencher-0.1.5
+++ b/metadata/md5-cache/dev-rust/bencher-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty bencher crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/bincode-0.8.0 b/metadata/md5-cache/dev-rust/bincode-0.8.0
index baf28ec..61b564f 100644
--- a/metadata/md5-cache/dev-rust/bincode-0.8.0
+++ b/metadata/md5-cache/dev-rust/bincode-0.8.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty bincode crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=MIT
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8e4a6d1ef01671ebbfa11bd51c59761b
diff --git a/metadata/md5-cache/dev-rust/bincode-1.0.1 b/metadata/md5-cache/dev-rust/bincode-1.0.1
index 29d6d80..10f7675 100644
--- a/metadata/md5-cache/dev-rust/bincode-1.0.1
+++ b/metadata/md5-cache/dev-rust/bincode-1.0.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/byteorder-1.2.0:= <dev-rust/byteorder-2.0.0 >=dev-rust/serde-1.0.63:= <dev-rust/serde-2.0.0 >=dev-rust/serde_derive-1.0.27:= <dev-rust/serde_derive-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=A compact encoder / decoder pair that uses a binary zero-fluff encoding scheme
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.1/r0
 SRC_URI=https://crates.io/api/v1/crates/bincode/1.0.1/download -> bincode-1.0.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2eb47e8f951ce499a687790650e1510e
diff --git a/metadata/md5-cache/dev-rust/bincode-1.0.1-r1 b/metadata/md5-cache/dev-rust/bincode-1.0.1-r1
index 499db58..be5cd0f 100644
--- a/metadata/md5-cache/dev-rust/bincode-1.0.1-r1
+++ b/metadata/md5-cache/dev-rust/bincode-1.0.1-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/byteorder-1.2.0:= <dev-rust/byteorder-2.0.0 >=dev-rust/serde-1.0.63:= <dev-rust/serde-2.0.0 >=dev-rust/serde_derive-1.0.27:= <dev-rust/serde_derive-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=A compact encoder / decoder pair that uses a binary zero-fluff encoding scheme
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.1/r1
 SRC_URI=https://crates.io/api/v1/crates/bincode/1.0.1/download -> bincode-1.0.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2eb47e8f951ce499a687790650e1510e
diff --git a/metadata/md5-cache/dev-rust/bincode-1.1.2 b/metadata/md5-cache/dev-rust/bincode-1.1.2
index 9f11b04..7f51dff 100644
--- a/metadata/md5-cache/dev-rust/bincode-1.1.2
+++ b/metadata/md5-cache/dev-rust/bincode-1.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/autocfg-0.1*:= =dev-rust/byteorder-1.3*:= >=dev-rust/serde-1.0.63:= >=dev-rust/serde_bytes-0.10.3:= >=dev-rust/serde_derive-1.0.27:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A compact encoder / decoder pair that uses a binary zero-fluff encoding scheme
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/bincode/1.1.2/download -> bincode-1.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=48c863915e3111592539e0c3a8a4fcbb
diff --git a/metadata/md5-cache/dev-rust/bindgen-0.49.0 b/metadata/md5-cache/dev-rust/bindgen-0.49.0
index e09c526..bee857f 100644
--- a/metadata/md5-cache/dev-rust/bindgen-0.49.0
+++ b/metadata/md5-cache/dev-rust/bindgen-0.49.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty bindgen crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.49.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/bindgen-0.51.0 b/metadata/md5-cache/dev-rust/bindgen-0.51.0
index 2242b97..2f09bf2 100644
--- a/metadata/md5-cache/dev-rust/bindgen-0.51.0
+++ b/metadata/md5-cache/dev-rust/bindgen-0.51.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty bindgen crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.51.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/bitflags-0.7.0 b/metadata/md5-cache/dev-rust/bitflags-0.7.0
index b45737e..12cee3e 100644
--- a/metadata/md5-cache/dev-rust/bitflags-0.7.0
+++ b/metadata/md5-cache/dev-rust/bitflags-0.7.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust macro to generate structures which behave like a set of bitflags
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.0/r0
 SRC_URI=https://crates.io/api/v1/crates/bitflags/0.7.0/download -> bitflags-0.7.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=463c7f17778d40fbf01d217c7f851547
diff --git a/metadata/md5-cache/dev-rust/bitflags-1.1.0 b/metadata/md5-cache/dev-rust/bitflags-1.1.0
deleted file mode 100644
index 9b418c4..0000000
--- a/metadata/md5-cache/dev-rust/bitflags-1.1.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=>=virtual/rust-1.39.0:=
-DESCRIPTION=A Rust macro to generate structures which behave like a set of bitflags
-EAPI=6
-HOMEPAGE=https://github.com/bitflags/bitflags
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.1.0/r0
-SRC_URI=https://crates.io/api/v1/crates/bitflags/1.1.0/download -> bitflags-1.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=463c7f17778d40fbf01d217c7f851547
diff --git a/metadata/md5-cache/dev-rust/bitflags-1.2.1 b/metadata/md5-cache/dev-rust/bitflags-1.2.1
new file mode 100644
index 0000000..1bac06e
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/bitflags-1.2.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=A Rust macro to generate structures which behave like a set of bitflags
+EAPI=7
+HOMEPAGE=https://github.com/bitflags/bitflags
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.2.1/r0
+SRC_URI=https://crates.io/api/v1/crates/bitflags/1.2.1/download -> bitflags-1.2.1.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6fa7d524654d655573c4393309d0f425
diff --git a/metadata/md5-cache/dev-rust/built-0.3.1 b/metadata/md5-cache/dev-rust/built-0.3.1
index e3ce850..9d1b344 100644
--- a/metadata/md5-cache/dev-rust/built-0.3.1
+++ b/metadata/md5-cache/dev-rust/built-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/toml-0.5:= =dev-rust/chrono-0.4*:= =dev-rust/git2-0.9*:= >=dev-rust/semver-0.9:= =dev-rust/tempdir-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=built provides a crate with information from the time it was built.
 EAPI=6
@@ -8,5 +8,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/built/0.3.1/download -> built-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1cae24a47068ad758db699913d13eb56
diff --git a/metadata/md5-cache/dev-rust/byteorder-1.1.0 b/metadata/md5-cache/dev-rust/byteorder-1.1.0
index 37185e1..f130724 100644
--- a/metadata/md5-cache/dev-rust/byteorder-1.1.0
+++ b/metadata/md5-cache/dev-rust/byteorder-1.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/quickcheck-0.4.2:= ~dev-rust/rand-0.3.20:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Library for reading/writing numbers in big-endian and little-endian
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/byteorder/1.1.0/download -> byteorder-1.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e2eeaf49e7b2349ef3942cb4225bb7c2
diff --git a/metadata/md5-cache/dev-rust/byteorder-1.2.7 b/metadata/md5-cache/dev-rust/byteorder-1.2.7
index 4ea1d86c..7f08419 100644
--- a/metadata/md5-cache/dev-rust/byteorder-1.2.7
+++ b/metadata/md5-cache/dev-rust/byteorder-1.2.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty byteorder crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Unlicense )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.2.7/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7b9619320573e8d34437d07ff1296f9a
diff --git a/metadata/md5-cache/dev-rust/byteorder-1.3.1 b/metadata/md5-cache/dev-rust/byteorder-1.3.1
deleted file mode 100644
index b68216c..0000000
--- a/metadata/md5-cache/dev-rust/byteorder-1.3.1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/quickcheck-0.8*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Library for reading/writing numbers in big-endian and little-endian
-EAPI=6
-HOMEPAGE=https://github.com/BurntSushi/byteorder
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Unlicense )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.3.1/r0
-SRC_URI=https://crates.io/api/v1/crates/byteorder/1.3.1/download -> byteorder-1.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b6aedbbb85a745a802c5f59942a1bc03
diff --git a/metadata/md5-cache/dev-rust/byteorder-1.3.2 b/metadata/md5-cache/dev-rust/byteorder-1.3.2
new file mode 100644
index 0000000..6ff73a4
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/byteorder-1.3.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=Library for reading/writing numbers in big-endian and little-endian
+EAPI=7
+HOMEPAGE=https://github.com/BurntSushi/byteorder
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Unlicense )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.3.2/r0
+SRC_URI=https://crates.io/api/v1/crates/byteorder/1.3.2/download -> byteorder-1.3.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=10702a44fba7d162a1988a6183ee0edb
diff --git a/metadata/md5-cache/dev-rust/bytes-0.3.0 b/metadata/md5-cache/dev-rust/bytes-0.3.0
index 9402f85..99ca40a 100644
--- a/metadata/md5-cache/dev-rust/bytes-0.3.0
+++ b/metadata/md5-cache/dev-rust/bytes-0.3.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty bytes crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=MIT
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8e4a6d1ef01671ebbfa11bd51c59761b
diff --git a/metadata/md5-cache/dev-rust/bytes-0.4.11 b/metadata/md5-cache/dev-rust/bytes-0.4.11
index 6831b1e..dc336f0 100644
--- a/metadata/md5-cache/dev-rust/bytes-0.4.11
+++ b/metadata/md5-cache/dev-rust/bytes-0.4.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/byteorder-1.1*:= >=dev-rust/either-1.5.0:= >=dev-rust/iovec-0.1.0:= >=dev-rust/serde-1.0.0:= >=dev-rust/serde_test-1.0.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A utility library for working with bytes.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.11/r0
 SRC_URI=https://crates.io/api/v1/crates/bytes/0.4.11/download -> bytes-0.4.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=187d7707753daec1867650d64e13b5c8
diff --git a/metadata/md5-cache/dev-rust/bytes-0.5.6 b/metadata/md5-cache/dev-rust/bytes-0.5.6
new file mode 100644
index 0000000..b176d5a
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/bytes-0.5.6
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/serde-1.0.60:= <dev-rust/serde-2 >=virtual/rust-1.39.0:=
+DESCRIPTION=A utility library for working with bytes.
+EAPI=7
+HOMEPAGE=https://github.com/tokio-rs/bytes
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.5.6/r0
+SRC_URI=https://crates.io/api/v1/crates/bytes/0.5.6/download -> bytes-0.5.6.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3494793e7f8e2bec90a6f0845fcbfc62
diff --git a/metadata/md5-cache/dev-rust/cc-1.0.25 b/metadata/md5-cache/dev-rust/cc-1.0.25
index 88bdc80..357d9e1 100644
--- a/metadata/md5-cache/dev-rust/cc-1.0.25
+++ b/metadata/md5-cache/dev-rust/cc-1.0.25
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/rayon-1.0.2:= >=dev-rust/tempdir-0.3.7:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library to compile C/C++/assembly into a Rust library/application
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.25/r0
 SRC_URI=https://crates.io/api/v1/crates/cc/1.0.25/download -> cc-1.0.25.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8b68286805c939680030a09ef7e1aca4
diff --git a/metadata/md5-cache/dev-rust/cfg-if-0.1.5 b/metadata/md5-cache/dev-rust/cfg-if-0.1.5
index e9824c6..bf6e973 100644
--- a/metadata/md5-cache/dev-rust/cfg-if-0.1.5
+++ b/metadata/md5-cache/dev-rust/cfg-if-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A macro to ergonomically define an item depending on a large number of #[cfg] parameters
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/cfg-if/0.1.5/download -> cfg-if-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ae630d8f9d1e358dc52265c39da3d351
diff --git a/metadata/md5-cache/dev-rust/chashmap-2.2.2 b/metadata/md5-cache/dev-rust/chashmap-2.2.2
index 496ea62..b1f38af 100644
--- a/metadata/md5-cache/dev-rust/chashmap-2.2.2
+++ b/metadata/md5-cache/dev-rust/chashmap-2.2.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/owning_ref-0.3*:= =dev-rust/parking_lot-0.4*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Fast, concurrent hash maps with extensive API
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.2.2/r0
 SRC_URI=https://crates.io/api/v1/crates/chashmap/2.2.2/download -> chashmap-2.2.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9db65a3685eca924e57271a21dfbc539
diff --git a/metadata/md5-cache/dev-rust/chrono-0.4.2 b/metadata/md5-cache/dev-rust/chrono-0.4.2
index 017b2a9..3e63345 100644
--- a/metadata/md5-cache/dev-rust/chrono-0.4.2
+++ b/metadata/md5-cache/dev-rust/chrono-0.4.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/num-integer-0.1.36:= =dev-rust/num-traits-0.2*:= >=dev-rust/num-iter-0.1.35:= >=dev-rust/rustc-serialize-0.3.20:= =dev-rust/ryu-0.2*:= =dev-rust/serde-1*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_json-1*:= >=dev-rust/time-0.1.39:= =dev-rust/bincode-0.8*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Aims to be a feature-complete superset of the time library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r0
 SRC_URI=https://crates.io/api/v1/crates/chrono/0.4.2/download -> chrono-0.4.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b3dc7dfc89fa37ef8af81db684d0b36f
diff --git a/metadata/md5-cache/dev-rust/chrono-0.4.2-r1 b/metadata/md5-cache/dev-rust/chrono-0.4.2-r1
index 6482cc3..04d3965 100644
--- a/metadata/md5-cache/dev-rust/chrono-0.4.2-r1
+++ b/metadata/md5-cache/dev-rust/chrono-0.4.2-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/num-integer-0.1.36:= =dev-rust/num-traits-0.2*:= >=dev-rust/num-iter-0.1.35:= >=dev-rust/rustc-serialize-0.3.20:= =dev-rust/ryu-0.2*:= =dev-rust/serde-1*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_json-1*:= >=dev-rust/time-0.1.39:= =dev-rust/bincode-0.8*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Aims to be a feature-complete superset of the time library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r1
 SRC_URI=https://crates.io/api/v1/crates/chrono/0.4.2/download -> chrono-0.4.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b3dc7dfc89fa37ef8af81db684d0b36f
diff --git a/metadata/md5-cache/dev-rust/chunked_transfer-1.2.0 b/metadata/md5-cache/dev-rust/chunked_transfer-1.2.0
new file mode 100644
index 0000000..61afd81
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/chunked_transfer-1.2.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=Encoder and decoder for HTTP chunked transfer coding (RFC 7230 § 4.1)
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/chunked_transfer/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=Apache-2.0
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.2.0/r0
+SRC_URI=https://crates.io/api/v1/crates/chunked_transfer/1.2.0/download -> chunked_transfer-1.2.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6f2f14ac2ade340f8e10e051cd69c789
diff --git a/metadata/md5-cache/dev-rust/clap-2.33.0 b/metadata/md5-cache/dev-rust/clap-2.33.0
index 42e0e77..1c19394 100644
--- a/metadata/md5-cache/dev-rust/clap-2.33.0
+++ b/metadata/md5-cache/dev-rust/clap-2.33.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bitflags-1*:= =dev-rust/textwrap-0.11*:= =dev-rust/unicode-width-0.1*:= =dev-rust/ansi_term-0.11*:= =dev-rust/atty-0.2*:= =dev-rust/clippy-0.0.166:= =dev-rust/strsim-0.8*:= =dev-rust/term_size-0.3*:= =dev-rust/vec_map-0.8*:= =dev-rust/yaml-rust-0.3.5:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Command Line Argument Parser
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.33.0/r0
 SRC_URI=https://crates.io/api/v1/crates/clap/2.33.0/download -> clap-2.33.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f0eb66533f2e781738b0e1d06213d9f0
diff --git a/metadata/md5-cache/dev-rust/clippy-0.0.166 b/metadata/md5-cache/dev-rust/clippy-0.0.166
index 424fbe8..3b67c26 100644
--- a/metadata/md5-cache/dev-rust/clippy-0.0.166
+++ b/metadata/md5-cache/dev-rust/clippy-0.0.166
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty clippy crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.0.166/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fe642eb1e1c685d100e0b97134e98668
diff --git a/metadata/md5-cache/dev-rust/cloudabi-0.0.3 b/metadata/md5-cache/dev-rust/cloudabi-0.0.3
index 866155b..dbb7833 100644
--- a/metadata/md5-cache/dev-rust/cloudabi-0.0.3
+++ b/metadata/md5-cache/dev-rust/cloudabi-0.0.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty cloudabi crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.0.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/compiletest_rs-0.3.19 b/metadata/md5-cache/dev-rust/compiletest_rs-0.3.19
index a5d1908..c6fa85a 100644
--- a/metadata/md5-cache/dev-rust/compiletest_rs-0.3.19
+++ b/metadata/md5-cache/dev-rust/compiletest_rs-0.3.19
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty compiletest_rs crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.19/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=575a52568022b63766fb1d6754a308ae
diff --git a/metadata/md5-cache/dev-rust/cpp_demangle-0.2.3 b/metadata/md5-cache/dev-rust/cpp_demangle-0.2.3
index 58d8e9c..a5d27a3 100644
--- a/metadata/md5-cache/dev-rust/cpp_demangle-0.2.3
+++ b/metadata/md5-cache/dev-rust/cpp_demangle-0.2.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty cpp_demangle crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/crates-index-0.5.1 b/metadata/md5-cache/dev-rust/crates-index-0.5.1
index 8b4fcfc..38ce81f 100644
--- a/metadata/md5-cache/dev-rust/crates-index-0.5.1
+++ b/metadata/md5-cache/dev-rust/crates-index-0.5.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty crates-index crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/criterion-0.2.0 b/metadata/md5-cache/dev-rust/criterion-0.2.0
index e9c6bd8..99db26f 100644
--- a/metadata/md5-cache/dev-rust/criterion-0.2.0
+++ b/metadata/md5-cache/dev-rust/criterion-0.2.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty criterion crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r4 b/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r4
deleted file mode 100644
index 1b6e753..0000000
--- a/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r4
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND==dev-rust/rand_core-0.4*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Support crate for running rust fuzzers on Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-fuzz
-IUSE=fuzzer test cros_host cros_workon_tree_ccf15d2c45fbf16c6e2d9db5bd0f750f71006f4d cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r4
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b4f11983bcf99476c81e1cec3af57a9a
diff --git a/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r5 b/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r5
new file mode 100644
index 0000000..c11ebf1
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/cros_fuzz-0.1.0-r5
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND==dev-rust/rand_core-0.4*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Support crate for running rust fuzzers on Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cros-fuzz
+IUSE=fuzzer test cros_host cros_workon_tree_90bf2838f56bffe127636b5ea4988485595819a8 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r5
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6436dc5944791309f8bc505ea253d34d
diff --git a/metadata/md5-cache/dev-rust/cros_fuzz-9999 b/metadata/md5-cache/dev-rust/cros_fuzz-9999
index 130606e..6017ba5 100644
--- a/metadata/md5-cache/dev-rust/cros_fuzz-9999
+++ b/metadata/md5-cache/dev-rust/cros_fuzz-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fc70a2c671061177ca9abe6251f9e78a
diff --git a/metadata/md5-cache/dev-rust/crossbeam-channel-0.3.8 b/metadata/md5-cache/dev-rust/crossbeam-channel-0.3.8
index f8d3bfd..76c9ca4 100644
--- a/metadata/md5-cache/dev-rust/crossbeam-channel-0.3.8
+++ b/metadata/md5-cache/dev-rust/crossbeam-channel-0.3.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/crossbeam-utils-0.6.5:= >=dev-rust/smallvec-0.6.2:= =dev-rust/rand-0.6*:= >=dev-rust/signal-hook-0.1.5:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides multi-producer multi-consumer channels for message passing.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.8/r0
 SRC_URI=https://crates.io/api/v1/crates/crossbeam-channel/0.3.8/download -> crossbeam-channel-0.3.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=86fd77e33939190b8739b5fcbaf0c84b
diff --git a/metadata/md5-cache/dev-rust/crossbeam-deque-0.7.1 b/metadata/md5-cache/dev-rust/crossbeam-deque-0.7.1
index 1cfa74a..15f3af7 100644
--- a/metadata/md5-cache/dev-rust/crossbeam-deque-0.7.1
+++ b/metadata/md5-cache/dev-rust/crossbeam-deque-0.7.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-epoch-0.7*:= =dev-rust/crossbeam-utils-0.6*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides work-stealing deques, which are primarily intended for building task schedulers
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.1/r0
 SRC_URI=https://crates.io/api/v1/crates/crossbeam-deque/0.7.1/download -> crossbeam-deque-0.7.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=61fdeae26b4675f8578adc4e5642c67a
diff --git a/metadata/md5-cache/dev-rust/crossbeam-epoch-0.7.1 b/metadata/md5-cache/dev-rust/crossbeam-epoch-0.7.1
index 9af5ca2..d70c160 100644
--- a/metadata/md5-cache/dev-rust/crossbeam-epoch-0.7.1
+++ b/metadata/md5-cache/dev-rust/crossbeam-epoch-0.7.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/arrayvec-0.4*:= =dev-rust/cfg-if-0.1*:= =dev-rust/crossbeam-utils-0.6*:= =dev-rust/memoffset-0.2*:= =dev-rust/scopeguard-0.3*:= =dev-rust/lazy_static-1*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides epoch-based garbage collection for building concurrent data structures
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.1/r0
 SRC_URI=https://crates.io/api/v1/crates/crossbeam-epoch/0.7.1/download -> crossbeam-epoch-0.7.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=94ff770b2fbcbb19ada8f0e9267aa678
diff --git a/metadata/md5-cache/dev-rust/crossbeam-queue-0.1.2 b/metadata/md5-cache/dev-rust/crossbeam-queue-0.1.2
index 79f2f7b..a86f256 100644
--- a/metadata/md5-cache/dev-rust/crossbeam-queue-0.1.2
+++ b/metadata/md5-cache/dev-rust/crossbeam-queue-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-utils-0.6*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides concurrent queues that can be shared among threads
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/crossbeam-queue/0.1.2/download -> crossbeam-queue-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0309153aeb1089d0b2e6deca53bd00cf
diff --git a/metadata/md5-cache/dev-rust/crossbeam-utils-0.6.5 b/metadata/md5-cache/dev-rust/crossbeam-utils-0.6.5
index 64912c5..00be2d8 100644
--- a/metadata/md5-cache/dev-rust/crossbeam-utils-0.6.5
+++ b/metadata/md5-cache/dev-rust/crossbeam-utils-0.6.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/cfg-if-0.1*:= =dev-rust/lazy_static-1*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides miscellaneous tools for concurrent programming
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.5/r0
 SRC_URI=https://crates.io/api/v1/crates/crossbeam-utils/0.6.5/download -> crossbeam-utils-0.6.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a28c8c8dd284fc12bdd9a559de087049
diff --git a/metadata/md5-cache/dev-rust/csv-1.1.1 b/metadata/md5-cache/dev-rust/csv-1.1.1
index c1344e7..5273f85 100644
--- a/metadata/md5-cache/dev-rust/csv-1.1.1
+++ b/metadata/md5-cache/dev-rust/csv-1.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty csv crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/curl-0.4.22 b/metadata/md5-cache/dev-rust/curl-0.4.22
index 182f7e1..167bff2 100644
--- a/metadata/md5-cache/dev-rust/curl-0.4.22
+++ b/metadata/md5-cache/dev-rust/curl-0.4.22
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/curl-sys-0.4.18:= >=dev-rust/kernel32-sys-0.2.2:= >=dev-rust/libc-0.2.42:= >=dev-rust/schannel-0.1.13:= >=dev-rust/socket2-0.3.7:= >=dev-rust/winapi-0.2.7:= >=dev-rust/openssl-probe-0.1.2:= >=dev-rust/openssl-sys-0.9.43:= =dev-rust/mio-0.6*:= >=dev-rust/mio-extras-2.0.3:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust bindings to libcurl for making HTTP requests
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.22/r0
 SRC_URI=https://crates.io/api/v1/crates/curl/0.4.22/download -> curl-0.4.22.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71d5863aeaa87e58f0d278aa7cd06f15
diff --git a/metadata/md5-cache/dev-rust/curl-sys-0.4.18 b/metadata/md5-cache/dev-rust/curl-sys-0.4.18
index 0ae656e..1128299 100644
--- a/metadata/md5-cache/dev-rust/curl-sys-0.4.18
+++ b/metadata/md5-cache/dev-rust/curl-sys-0.4.18
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/cc-1*:= >=dev-rust/libc-0.2.2:= >=dev-rust/libz-sys-1.0.18:= >=dev-rust/pkg-config-0.3.3:= =dev-rust/vcpkg-0.2*:= =dev-rust/winapi-0.3*:= =dev-rust/libnghttp2-sys-0.1*:= =dev-rust/openssl-sys-0.9*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Native bindings to the libcurl library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.18/r0
 SRC_URI=https://crates.io/api/v1/crates/curl-sys/0.4.18/download -> curl-sys-0.4.18.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=933623c9b33614bad069ec44d0f55b6f
diff --git a/metadata/md5-cache/dev-rust/data-encoding-2.1.2 b/metadata/md5-cache/dev-rust/data-encoding-2.1.2
index 5736e81..e3c8231 100644
--- a/metadata/md5-cache/dev-rust/data-encoding-2.1.2
+++ b/metadata/md5-cache/dev-rust/data-encoding-2.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty data-encoding crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.1.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/data_model-0.1.0-r20 b/metadata/md5-cache/dev-rust/data_model-0.1.0-r20
deleted file mode 100644
index 5351546..0000000
--- a/metadata/md5-cache/dev-rust/data_model-0.1.0-r20
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/assertions:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Crates includes traits and types for safe interaction with raw memory.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/data_model
-IUSE=test cros_host cros_workon_tree_6f435cc1c7d64531e0f424df5719a6c4e4932776 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/data_model-0.1.0-r13
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r20
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=dbb5c90f5453b97f8860619cafd26a2e
diff --git a/metadata/md5-cache/dev-rust/data_model-0.1.0-r24 b/metadata/md5-cache/dev-rust/data_model-0.1.0-r24
new file mode 100644
index 0000000..f5ae975
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/data_model-0.1.0-r24
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/assertions:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Crates includes traits and types for safe interaction with raw memory.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/data_model
+IUSE=test cros_host cros_workon_tree_380b89d0a92abee58f780fe1e707430317fed32b cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/data_model-0.1.0-r13
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r24
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fb7f5a37588617351b811f3b30e33a74
diff --git a/metadata/md5-cache/dev-rust/data_model-9999 b/metadata/md5-cache/dev-rust/data_model-9999
index 43fda4a..b0e566c 100644
--- a/metadata/md5-cache/dev-rust/data_model-9999
+++ b/metadata/md5-cache/dev-rust/data_model-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/data_model-0.1.0-r13
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=23da8e10bb5ba97f071f079be0e9cb15
diff --git a/metadata/md5-cache/dev-rust/dbus-0.6.1 b/metadata/md5-cache/dev-rust/dbus-0.6.1
index 036d4a0..fc5ffca 100644
--- a/metadata/md5-cache/dev-rust/dbus-0.6.1
+++ b/metadata/md5-cache/dev-rust/dbus-0.6.1
@@ -1,5 +1,5 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=>=dev-rust/libc-0.2.7:= >=dev-rust/libdbus-sys-0.1.2:= >=dev-rust/tempdir-0.3.0:= >=virtual/rust-1.39.0:=
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/libc-0.2.7:= >=dev-rust/libdbus-sys-0.1.2:= <dev-rust/libdbus-sys-0.2 >=dev-rust/tempdir-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust bindings to D-Bus.
 EAPI=6
 HOMEPAGE=https://github.com/diwic/dbus-rs
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.1/r0
 SRC_URI=https://crates.io/api/v1/crates/dbus/0.6.1/download -> dbus-0.6.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=fb803b7688c190c5166ebe98a92a7ee0
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ff0f1ed099d583c939183cf3cc7cf6ab
diff --git a/metadata/md5-cache/dev-rust/dbus-0.8.4 b/metadata/md5-cache/dev-rust/dbus-0.8.4
new file mode 100644
index 0000000..0a7a8f9
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/dbus-0.8.4
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/libc-0.2.66:= <dev-rust/libc-0.3 =dev-rust/libdbus-sys-0.2*:= =dev-rust/futures-0.3.1:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust bindings to D-Bus.
+EAPI=7
+HOMEPAGE=https://github.com/diwic/dbus-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.8.4/r0
+SRC_URI=https://crates.io/api/v1/crates/dbus/0.8.4/download -> dbus-0.8.4.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8114330dfe87d017623f444f6cd31e8b
diff --git a/metadata/md5-cache/dev-rust/dbus-0.8.4-r1 b/metadata/md5-cache/dev-rust/dbus-0.8.4-r1
new file mode 100644
index 0000000..ed20256
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/dbus-0.8.4-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/libc-0.2.66:= <dev-rust/libc-0.3 =dev-rust/libdbus-sys-0.2*:= =dev-rust/futures-0.3.1:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust bindings to D-Bus.
+EAPI=7
+HOMEPAGE=https://github.com/diwic/dbus-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.8.4/r1
+SRC_URI=https://crates.io/api/v1/crates/dbus/0.8.4/download -> dbus-0.8.4.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8114330dfe87d017623f444f6cd31e8b
diff --git a/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0 b/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0
index 40bd108..26b2030 100644
--- a/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0
+++ b/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0
@@ -1,13 +1,14 @@
-DEFINED_PHASES=compile configure install postinst prepare prerm unpack
+DEFINED_PHASES=compile configure install postinst prepare prerm setup unpack
 DEPEND=!=dev-rust/ansi_term-0.11.0-r0 !=dev-rust/vec_map-0.8.1-r0 !=dev-rust/strsim-0.8.0-r0 >=dev-rust/clap-2.20.0:= <dev-rust/clap-3.0.0 >=dev-rust/dbus-0.6.0:= <dev-rust/dbus-0.7.0 >=dev-rust/xml-rs-0.3.0:= <dev-rust/xml-rs-0.4.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Binary crate to generate Rust code from XML introspection data.
-EAPI=6
+EAPI=7
 HOMEPAGE=https://github.com/diwic/dbus-rs
 IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=*
 LICENSE=|| ( MIT Apache-2.0 )
+RDEPEND=!<dev-rust/dbus-codegen-0.3.0-r1
 REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0.3.0/r0
+SLOT=0/0.3.0
 SRC_URI=https://crates.io/api/v1/crates/dbus-codegen/0.3.0/download -> dbus-codegen-0.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f67345e72b090d5686a64f055ae42814
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bf84ad5cdf20c813fc0daac8757b5a16
diff --git a/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0-r1 b/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0-r1
new file mode 100644
index 0000000..b9f0b0c
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/dbus-codegen-0.3.0-r1
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install postinst prepare prerm setup unpack
+DEPEND=!=dev-rust/ansi_term-0.11.0-r0 !=dev-rust/vec_map-0.8.1-r0 !=dev-rust/strsim-0.8.0-r0 >=dev-rust/clap-2.20.0:= <dev-rust/clap-3.0.0 >=dev-rust/dbus-0.6.0:= <dev-rust/dbus-0.7.0 >=dev-rust/xml-rs-0.3.0:= <dev-rust/xml-rs-0.4.0 >=virtual/rust-1.39.0:=
+DESCRIPTION=Binary crate to generate Rust code from XML introspection data.
+EAPI=7
+HOMEPAGE=https://github.com/diwic/dbus-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+RDEPEND=!<dev-rust/dbus-codegen-0.3.0-r1
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.3.0-r1
+SRC_URI=https://crates.io/api/v1/crates/dbus-codegen/0.3.0/download -> dbus-codegen-0.3.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bf84ad5cdf20c813fc0daac8757b5a16
diff --git a/metadata/md5-cache/dev-rust/dbus-codegen-0.5.0 b/metadata/md5-cache/dev-rust/dbus-codegen-0.5.0
new file mode 100644
index 0000000..a7c993d
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/dbus-codegen-0.5.0
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/clap-2.20.0:= <dev-rust/clap-3.0.0 >=dev-rust/dbus-0.8.0:= <dev-rust/dbus-0.9.0 >=dev-rust/xml-rs-0.3.0:= <dev-rust/xml-rs-0.4.0 >=virtual/rust-1.39.0:=
+DESCRIPTION=Binary crate to generate Rust code from XML introspection data.
+EAPI=7
+HOMEPAGE=https://github.com/diwic/dbus-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+RDEPEND=!<dev-rust/dbus-codegen-0.5.0
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.5.0
+SRC_URI=https://crates.io/api/v1/crates/dbus-codegen/0.5.0/download -> dbus-codegen-0.5.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f3bdf28bf5d10e5af47fe9d663d0cb43
diff --git a/metadata/md5-cache/dev-rust/derivative-2.1.1 b/metadata/md5-cache/dev-rust/derivative-2.1.1
new file mode 100644
index 0000000..a145df9
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/derivative-2.1.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= >=dev-rust/syn-1.0.3:= <dev-rust/syn-2 >=virtual/rust-1.39.0:=
+DESCRIPTION=A set of alternative 'derive' attributes for Rust.
+EAPI=7
+HOMEPAGE=https://github.com/mcarton/rust-derivative
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=2.1.1/r0
+SRC_URI=https://crates.io/api/v1/crates/derivative/2.1.1/download -> derivative-2.1.1.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5efbca3b34662d752dc85ab37c0d5d90
diff --git a/metadata/md5-cache/dev-rust/dirs-2.0.2 b/metadata/md5-cache/dev-rust/dirs-2.0.2
index 45bc734..1fe5d28 100644
--- a/metadata/md5-cache/dev-rust/dirs-2.0.2
+++ b/metadata/md5-cache/dev-rust/dirs-2.0.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty dirs crate
 EAPI=7
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.0.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7da3c1f8f115da7f13d2eae2e624386e
diff --git a/metadata/md5-cache/dev-rust/dtoa-0.4.5 b/metadata/md5-cache/dev-rust/dtoa-0.4.5
new file mode 100644
index 0000000..06ba797
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/dtoa-0.4.5
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=Fast functions for printing floating-point primitives to an io::Write
+EAPI=6
+HOMEPAGE=https://github.com/dtolnay/dtoa
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.4.5/r0
+SRC_URI=https://crates.io/api/v1/crates/dtoa/0.4.5/download -> dtoa-0.4.5.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e7589bc98fd8837338211b77d8859dca
diff --git a/metadata/md5-cache/dev-rust/either-1.5.2 b/metadata/md5-cache/dev-rust/either-1.5.2
index 46fb2b2..f44337e 100644
--- a/metadata/md5-cache/dev-rust/either-1.5.2
+++ b/metadata/md5-cache/dev-rust/either-1.5.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/serde-1.0.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Either has methods that are similar to Option and Result, and it also implements traits like Iterator.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.5.2/r0
 SRC_URI=https://crates.io/api/v1/crates/either/1.5.2/download -> either-1.5.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=04c7d847f8bdd471ef0eee747e756bb9
diff --git a/metadata/md5-cache/dev-rust/encoding-0.2.33 b/metadata/md5-cache/dev-rust/encoding-0.2.33
index 8a758222..1ea4f96 100644
--- a/metadata/md5-cache/dev-rust/encoding-0.2.33
+++ b/metadata/md5-cache/dev-rust/encoding-0.2.33
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty encoding crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.33/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/enum-as-inner-0.2.1 b/metadata/md5-cache/dev-rust/enum-as-inner-0.2.1
index 9062d1a..e9c413d 100644
--- a/metadata/md5-cache/dev-rust/enum-as-inner-0.2.1
+++ b/metadata/md5-cache/dev-rust/enum-as-inner-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-0.4*:= =dev-rust/quote-0.6*:= =dev-rust/syn-0.15*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A deriving proc-macro for generating functions to automatically give access to the inner members of enum
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/enum-as-inner/0.2.1/download -> enum-as-inner-0.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=69dc9f415fa303b721163ec7a490cbbc
diff --git a/metadata/md5-cache/dev-rust/enumn-0.1.0-r8 b/metadata/md5-cache/dev-rust/enumn-0.1.0-r8
deleted file mode 100644
index 59daf20..0000000
--- a/metadata/md5-cache/dev-rust/enumn-0.1.0-r8
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Convert number to enum
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/enumn
-IUSE=test cros_host cros_workon_tree_25ba5cffdbb3a78a7956b5109fcef6206ca298e9 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/enumn-0.0.1-r4
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r8
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=01fbec588b58d38d9bc67106d69b1d0f
diff --git a/metadata/md5-cache/dev-rust/enumn-0.1.0-r9 b/metadata/md5-cache/dev-rust/enumn-0.1.0-r9
new file mode 100644
index 0000000..aa58963
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/enumn-0.1.0-r9
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Convert number to enum
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/enumn
+IUSE=test cros_host cros_workon_tree_c5170d4e4312bcef4a4e4e49403be6bc421c18aa cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/enumn-0.0.1-r4
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r9
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b8bc14bd7f33eaecd2fd7b98b0fbccd5
diff --git a/metadata/md5-cache/dev-rust/enumn-9999 b/metadata/md5-cache/dev-rust/enumn-9999
index c9e1cab..1689888 100644
--- a/metadata/md5-cache/dev-rust/enumn-9999
+++ b/metadata/md5-cache/dev-rust/enumn-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/enumn-0.0.1-r4
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d67489445edceb3b25d5d87fcb0943bd
diff --git a/metadata/md5-cache/dev-rust/env_logger-0.4.3 b/metadata/md5-cache/dev-rust/env_logger-0.4.3
index 2c588dc..e45bd5f 100644
--- a/metadata/md5-cache/dev-rust/env_logger-0.4.3
+++ b/metadata/md5-cache/dev-rust/env_logger-0.4.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty env_logger crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/env_logger-0.5.13 b/metadata/md5-cache/dev-rust/env_logger-0.5.13
index 468781a..1a809ad 100644
--- a/metadata/md5-cache/dev-rust/env_logger-0.5.13
+++ b/metadata/md5-cache/dev-rust/env_logger-0.5.13
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty env_logger crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.13/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/env_logger-0.6.0 b/metadata/md5-cache/dev-rust/env_logger-0.6.0
index 86de79b..4d9602b 100644
--- a/metadata/md5-cache/dev-rust/env_logger-0.6.0
+++ b/metadata/md5-cache/dev-rust/env_logger-0.6.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/log-0.4*:= >=dev-rust/atty-0.2.5:= =dev-rust/humantime-1.1*:= >=dev-rust/regex-1.0.3:= >=dev-rust/termcolor-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implements a logger that can be configured via environment variables.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.0/r0
 SRC_URI=https://crates.io/api/v1/crates/env_logger/0.6.0/download -> env_logger-0.6.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1cb8adc1d635eb4b335576c2a1b22f9b
diff --git a/metadata/md5-cache/dev-rust/env_logger-0.6.1 b/metadata/md5-cache/dev-rust/env_logger-0.6.1
index e5275ff..fa5ca85 100644
--- a/metadata/md5-cache/dev-rust/env_logger-0.6.1
+++ b/metadata/md5-cache/dev-rust/env_logger-0.6.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/log-0.4*:= >=dev-rust/atty-0.2.5:= =dev-rust/humantime-1.1*:= >=dev-rust/regex-1.0.3:= >=dev-rust/termcolor-1.0.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implements a logger that can be configured via environment variables.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.1/r0
 SRC_URI=https://crates.io/api/v1/crates/env_logger/0.6.1/download -> env_logger-0.6.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a50e52fc8345fd791c6912a256d5bd10
diff --git a/metadata/md5-cache/dev-rust/error-chain-0.11.0 b/metadata/md5-cache/dev-rust/error-chain-0.11.0
index 96d2d63..02f8141 100644
--- a/metadata/md5-cache/dev-rust/error-chain-0.11.0
+++ b/metadata/md5-cache/dev-rust/error-chain-0.11.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/backtrace-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Helps avoid boilerplate when using chained-errors.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.11.0/r0
 SRC_URI=https://crates.io/api/v1/crates/error-chain/0.11.0/download -> error-chain-0.11.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=786e73e4a4c51a0434fb6d23c541bf04
diff --git a/metadata/md5-cache/dev-rust/eui48-0.4.6 b/metadata/md5-cache/dev-rust/eui48-0.4.6
index 3a1aaa4..2f52177 100644
--- a/metadata/md5-cache/dev-rust/eui48-0.4.6
+++ b/metadata/md5-cache/dev-rust/eui48-0.4.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/rustc-serialize-0.3.24:= >=dev-rust/serde-1.0.80:= >=dev-rust/serde_json-1.0.37:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library to represent and parse IEEE EUI-48 also known as MAC-48 media access control addresses.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.6/r0
 SRC_URI=https://crates.io/api/v1/crates/eui48/0.4.6/download -> eui48-0.4.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d81bc0199a7772ea53d9d183fe3dc1c0
diff --git a/metadata/md5-cache/dev-rust/failure-0.1.5 b/metadata/md5-cache/dev-rust/failure-0.1.5
index cc0ab3d..12fae5b 100644
--- a/metadata/md5-cache/dev-rust/failure-0.1.5
+++ b/metadata/md5-cache/dev-rust/failure-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/backtrace-0.3*:= =dev-rust/failure_derive-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Experimental error handling abstraction
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/failure/0.1.5/download -> failure-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ce8f2f37e9aee73387c56079e803573b
diff --git a/metadata/md5-cache/dev-rust/failure_derive-0.1.5 b/metadata/md5-cache/dev-rust/failure_derive-0.1.5
index ebdde0e..3e2f2a9 100644
--- a/metadata/md5-cache/dev-rust/failure_derive-0.1.5
+++ b/metadata/md5-cache/dev-rust/failure_derive-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-0.4*:= =dev-rust/quote-0.6*:= =dev-rust/syn-0.15*:= =dev-rust/synstructure-0.10*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Derives for the failure crate
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/failure_derive/0.1.5/download -> failure_derive-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b4ac01ce59fafb4137df7bb45e0f7d13
diff --git a/metadata/md5-cache/dev-rust/failure_derive-0.1.5-r1 b/metadata/md5-cache/dev-rust/failure_derive-0.1.5-r1
index 1bee284..05be626 100644
--- a/metadata/md5-cache/dev-rust/failure_derive-0.1.5-r1
+++ b/metadata/md5-cache/dev-rust/failure_derive-0.1.5-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-0.4*:= =dev-rust/quote-0.6*:= =dev-rust/syn-0.15*:= =dev-rust/synstructure-0.10*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Derives for the failure crate
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r1
 SRC_URI=https://crates.io/api/v1/crates/failure_derive/0.1.5/download -> failure_derive-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b4ac01ce59fafb4137df7bb45e0f7d13
diff --git a/metadata/md5-cache/dev-rust/fallible-iterator-0.2.0 b/metadata/md5-cache/dev-rust/fallible-iterator-0.2.0
index d451f37..3f17462 100644
--- a/metadata/md5-cache/dev-rust/fallible-iterator-0.2.0
+++ b/metadata/md5-cache/dev-rust/fallible-iterator-0.2.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Fallible iterators for Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.0/r0
 SRC_URI=https://crates.io/api/v1/crates/fallible-iterator/0.2.0/download -> fallible-iterator-0.2.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cd5f578118dad0e51ff358105713eb04
diff --git a/metadata/md5-cache/dev-rust/fallible-streaming-iterator-0.1.9 b/metadata/md5-cache/dev-rust/fallible-streaming-iterator-0.1.9
index c6d0817..11d36e7 100644
--- a/metadata/md5-cache/dev-rust/fallible-streaming-iterator-0.1.9
+++ b/metadata/md5-cache/dev-rust/fallible-streaming-iterator-0.1.9
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Fallible, streaming iteration
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.9/r0
 SRC_URI=https://crates.io/api/v1/crates/fallible-streaming-iterator/0.1.9/download -> fallible-streaming-iterator-0.1.9.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=841e9e99d7e9bd293de07175ea072342
diff --git a/metadata/md5-cache/dev-rust/findshlibs-0.3.3 b/metadata/md5-cache/dev-rust/findshlibs-0.3.3
index 3492bc3f..6e7a207 100644
--- a/metadata/md5-cache/dev-rust/findshlibs-0.3.3
+++ b/metadata/md5-cache/dev-rust/findshlibs-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty findshlibs crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/flame-0.1.12 b/metadata/md5-cache/dev-rust/flame-0.1.12
index 6a817a1..2c2a379 100644
--- a/metadata/md5-cache/dev-rust/flame-0.1.12
+++ b/metadata/md5-cache/dev-rust/flame-0.1.12
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty flame crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.12/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/flamer-0.1.4 b/metadata/md5-cache/dev-rust/flamer-0.1.4
index 118a34d..19e2c0b 100644
--- a/metadata/md5-cache/dev-rust/flamer-0.1.4
+++ b/metadata/md5-cache/dev-rust/flamer-0.1.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty flamer crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.4/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/flate2-1.0.9 b/metadata/md5-cache/dev-rust/flate2-1.0.9
index 19dbe94..aaa317b 100644
--- a/metadata/md5-cache/dev-rust/flate2-1.0.9
+++ b/metadata/md5-cache/dev-rust/flate2-1.0.9
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty flate2 crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.9/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/flexbuffers-0.1.1 b/metadata/md5-cache/dev-rust/flexbuffers-0.1.1
new file mode 100644
index 0000000..5be3d93
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/flexbuffers-0.1.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/bitflags-1.2.1:= <dev-rust/bitflags-2 >=dev-rust/byteorder-1.3.2:= <dev-rust/byteorder-2 =dev-rust/num_enum-0.5*:= >=dev-rust/serde-1.0.114:= <dev-rust/serde-2 =dev-rust/serde_derive-1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Official FlexBuffers Rust runtime library.
+EAPI=7
+HOMEPAGE=https://google.github.io/flatbuffers/flexbuffers
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=Apache-2.0
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.1.1/r0
+SRC_URI=https://crates.io/api/v1/crates/flexbuffers/0.1.1/download -> flexbuffers-0.1.1.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e2b21fbdf9426ef9e6a12af685334ffa
diff --git a/metadata/md5-cache/dev-rust/fnv-1.0.6 b/metadata/md5-cache/dev-rust/fnv-1.0.6
index d909d60..8b4218a 100644
--- a/metadata/md5-cache/dev-rust/fnv-1.0.6
+++ b/metadata/md5-cache/dev-rust/fnv-1.0.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of the Fowler–Noll–Vo hash function
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.6/r0
 SRC_URI=https://crates.io/api/v1/crates/fnv/1.0.6/download -> fnv-1.0.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e77f5bdbc9916c53e59afc8112ddd693
diff --git a/metadata/md5-cache/dev-rust/foreign-types-0.3.2 b/metadata/md5-cache/dev-rust/foreign-types-0.3.2
index 7a8f429..50bdd73 100644
--- a/metadata/md5-cache/dev-rust/foreign-types-0.3.2
+++ b/metadata/md5-cache/dev-rust/foreign-types-0.3.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/foreign-types-shared-0.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A framework for Rust wrappers over C APIs.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.2/r0
 SRC_URI=https://crates.io/api/v1/crates/foreign-types/0.3.2/download -> foreign-types-0.3.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=92293f1a043a498ff4328f18b81b6830
diff --git a/metadata/md5-cache/dev-rust/foreign-types-shared-0.1.1 b/metadata/md5-cache/dev-rust/foreign-types-shared-0.1.1
index da1f019..1b66fde 100644
--- a/metadata/md5-cache/dev-rust/foreign-types-shared-0.1.1
+++ b/metadata/md5-cache/dev-rust/foreign-types-shared-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=An internal crate used by foreign-types
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/foreign-types-shared/0.1.1/download -> foreign-types-shared-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b68d1b1ffe30543fa18074881501303e
diff --git a/metadata/md5-cache/dev-rust/fuchsia-cprng-0.1.1 b/metadata/md5-cache/dev-rust/fuchsia-cprng-0.1.1
index 6328fe2..3df06d2 100644
--- a/metadata/md5-cache/dev-rust/fuchsia-cprng-0.1.1
+++ b/metadata/md5-cache/dev-rust/fuchsia-cprng-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty fuchsia-cprng crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/fuchsia-zircon-0.3.2 b/metadata/md5-cache/dev-rust/fuchsia-zircon-0.3.2
index c498317..ff60e0e 100644
--- a/metadata/md5-cache/dev-rust/fuchsia-zircon-0.3.2
+++ b/metadata/md5-cache/dev-rust/fuchsia-zircon-0.3.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty fuchsia-zircon crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/fuchsia-zircon-sys-0.3.3 b/metadata/md5-cache/dev-rust/fuchsia-zircon-sys-0.3.3
index a740d94..b7a0555 100644
--- a/metadata/md5-cache/dev-rust/fuchsia-zircon-sys-0.3.3
+++ b/metadata/md5-cache/dev-rust/fuchsia-zircon-sys-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty fuchsia-zircon-sys crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/futures-0.1.26 b/metadata/md5-cache/dev-rust/futures-0.1.26
index 625361a..f0ff147 100644
--- a/metadata/md5-cache/dev-rust/futures-0.1.26
+++ b/metadata/md5-cache/dev-rust/futures-0.1.26
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=This library is an implementation of zero-cost futures in Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.26/r0
 SRC_URI=https://crates.io/api/v1/crates/futures/0.1.26/download -> futures-0.1.26.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a74af592cb192bcd6987e6d3c1d6e294
diff --git a/metadata/md5-cache/dev-rust/futures-0.3.1 b/metadata/md5-cache/dev-rust/futures-0.3.1
index a14e28f..941038a 100644
--- a/metadata/md5-cache/dev-rust/futures-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-channel-0.3.1:= <dev-rust/futures-channel-0.4 >=dev-rust/futures-core-0.3.1:= <dev-rust/futures-core-0.4 >=dev-rust/futures-executor-0.3.1:= <dev-rust/futures-executor-0.4 >=dev-rust/futures-util-0.3.1:= <dev-rust/futures-util-0.4 >=dev-rust/futures-sink-0.3.1:= <dev-rust/futures-sink-0.4 >=dev-rust/futures-macro-0.3.1:= <dev-rust/futures-macro-0.4 >=dev-rust/futures-io-0.3.1:= <dev-rust/futures-io-0.4 >=virtual/rust-1.39.0:=
 DESCRIPTION=This library is an implementation of zero-cost futures in Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures/0.3.1/download -> futures-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=69e2ad8aa8bb59a0cde0a9a2ea436403
diff --git a/metadata/md5-cache/dev-rust/futures-channel-0.3.1 b/metadata/md5-cache/dev-rust/futures-channel-0.3.1
index 057fb54..fc0245b 100644
--- a/metadata/md5-cache/dev-rust/futures-channel-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-channel-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-core-0.3.1:= <dev-rust/futures-core-0.4 >=dev-rust/futures-sink-0.3.1:= <dev-rust/futures-sink-0.4 >=virtual/rust-1.39.0:=
 DESCRIPTION=Channels for asynchronous communication using futures-rs.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-channel/0.3.1/download -> futures-channel-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=47de54f455f1ff2aa658b176355b5383
diff --git a/metadata/md5-cache/dev-rust/futures-core-0.3.1 b/metadata/md5-cache/dev-rust/futures-core-0.3.1
index 823a5fd..565c4cf 100644
--- a/metadata/md5-cache/dev-rust/futures-core-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-core-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=The core traits and types in for the 'futures' library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-core/0.3.1/download -> futures-core-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=84bf83264f57774a9fae13b562f4ed93
diff --git a/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8 b/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8
index 8f8428f..eb4333b 100644
--- a/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8
+++ b/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-0.1:= >=dev-rust/num_cpus-1.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of thread pools which hand out futures to the results of the computation on the threads themselves.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.8/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-cpupool/0.1.8/download -> futures-cpupool-0.1.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f72779a79e1f38d5cc68176d2cb82539
diff --git a/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8-r1 b/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8-r1
index b46f25a..fa9f807 100644
--- a/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8-r1
+++ b/metadata/md5-cache/dev-rust/futures-cpupool-0.1.8-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-0.1:= >=dev-rust/num_cpus-1.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of thread pools which hand out futures to the results of the computation on the threads themselves.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.8/r1
 SRC_URI=https://crates.io/api/v1/crates/futures-cpupool/0.1.8/download -> futures-cpupool-0.1.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f72779a79e1f38d5cc68176d2cb82539
diff --git a/metadata/md5-cache/dev-rust/futures-executor-0.3.1 b/metadata/md5-cache/dev-rust/futures-executor-0.3.1
index 4ab2933..160087b 100644
--- a/metadata/md5-cache/dev-rust/futures-executor-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-executor-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-core-0.3.1:= <dev-rust/futures-core-0.4 >=dev-rust/futures-task-0.3.1:= <dev-rust/futures-task-0.4 >=dev-rust/futures-util-0.3.1:= <dev-rust/futures-util-0.4 >=dev-rust/num_cpus-1.8.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Executors for asynchronous tasks based on the futures-rs library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-executor/0.3.1/download -> futures-executor-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=db4f7dd51faa3bdb103984c9fc4a3e74
diff --git a/metadata/md5-cache/dev-rust/futures-io-0.3.1 b/metadata/md5-cache/dev-rust/futures-io-0.3.1
index fcdca41..41d8e61 100644
--- a/metadata/md5-cache/dev-rust/futures-io-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-io-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=The 'AsyncRead' and 'AsyncWrite' traits for the futures-rs library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-io/0.3.1/download -> futures-io-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6465fab22fcd09ee0e544820acc0e9ae
diff --git a/metadata/md5-cache/dev-rust/futures-macro-0.3.1 b/metadata/md5-cache/dev-rust/futures-macro-0.3.1
index fb36d84..25a9e39 100644
--- a/metadata/md5-cache/dev-rust/futures-macro-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-macro-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= >=dev-rust/proc-macro-hack-0.5.9:= <dev-rust/proc-macro-hack-0.6 =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=The futures-rs procedural macro implementations.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-macro/0.3.1/download -> futures-macro-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=21203032691bf187c491bfee17bfba46
diff --git a/metadata/md5-cache/dev-rust/futures-sink-0.3.1 b/metadata/md5-cache/dev-rust/futures-sink-0.3.1
index 6f5f94c..1fabd2a 100644
--- a/metadata/md5-cache/dev-rust/futures-sink-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-sink-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=The asynchronous 'Sink' trait for the futures-rs library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-sink/0.3.1/download -> futures-sink-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=16a47a8af4c7864ee01c159d58d27ded
diff --git a/metadata/md5-cache/dev-rust/futures-task-0.3.1 b/metadata/md5-cache/dev-rust/futures-task-0.3.1
index 5b8c16b..354f03b 100644
--- a/metadata/md5-cache/dev-rust/futures-task-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-task-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Tools for working with tasks.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-task/0.3.1/download -> futures-task-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6502bc1cf4c415848026d4ea98238016
diff --git a/metadata/md5-cache/dev-rust/futures-util-0.3.1 b/metadata/md5-cache/dev-rust/futures-util-0.3.1
index a11284c..96c41ab 100644
--- a/metadata/md5-cache/dev-rust/futures-util-0.3.1
+++ b/metadata/md5-cache/dev-rust/futures-util-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-core-0.3.1:= <dev-rust/futures-core-0.4 >=dev-rust/futures-task-0.3.1:= <dev-rust/futures-task-0.4 >=dev-rust/pin-utils-0.1.0_alpha4:= <dev-rust/pin-utils-0.2 >=dev-rust/proc-macro-nested-0.1.2:= <dev-rust/proc-macro-nested-0.2 >=dev-rust/futures-0.1.25:= <dev-rust/futures-0.2 >=dev-rust/futures-channel-0.3.1:= <dev-rust/futures-channel-0.4 >=dev-rust/futures-io-0.3.1:= <dev-rust/futures-io-0.4 >=dev-rust/futures-macro-0.3.1:= <dev-rust/futures-macro-0.4 >=dev-rust/futures-sink-0.3.1:= <dev-rust/futures-sink-0.4 >=dev-rust/memchr-2.2:= <dev-rust/memchr-3.0 >=dev-rust/proc-macro-hack-0.5.9:= <dev-rust/proc-macro-hack-0.6 >=dev-rust/slab-0.4:= <dev-rust/slab-1.0 >=dev-rust/tokio-io-0.1.9:= <dev-rust/tokio-io-0.2 >=virtual/rust-1.39.0:=
 DESCRIPTION=Common utilities and extension traits for the futures-rs library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/futures-util/0.3.1/download -> futures-util-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e7a357eef23d233f402233fd07e97870
diff --git a/metadata/md5-cache/dev-rust/futures-util-0.3.1-r1 b/metadata/md5-cache/dev-rust/futures-util-0.3.1-r1
index dac8cd0..f52f00e9 100644
--- a/metadata/md5-cache/dev-rust/futures-util-0.3.1-r1
+++ b/metadata/md5-cache/dev-rust/futures-util-0.3.1-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-core-0.3.1:= <dev-rust/futures-core-0.4 >=dev-rust/futures-task-0.3.1:= <dev-rust/futures-task-0.4 >=dev-rust/pin-utils-0.1.0_alpha4:= <dev-rust/pin-utils-0.2 >=dev-rust/proc-macro-nested-0.1.2:= <dev-rust/proc-macro-nested-0.2 >=dev-rust/futures-0.1.25:= <dev-rust/futures-0.2 >=dev-rust/futures-channel-0.3.1:= <dev-rust/futures-channel-0.4 >=dev-rust/futures-io-0.3.1:= <dev-rust/futures-io-0.4 >=dev-rust/futures-macro-0.3.1:= <dev-rust/futures-macro-0.4 >=dev-rust/futures-sink-0.3.1:= <dev-rust/futures-sink-0.4 >=dev-rust/memchr-2.2:= <dev-rust/memchr-3.0 >=dev-rust/proc-macro-hack-0.5.9:= <dev-rust/proc-macro-hack-0.6 >=dev-rust/slab-0.4:= <dev-rust/slab-1.0 >=dev-rust/tokio-io-0.1.9:= <dev-rust/tokio-io-0.2 >=virtual/rust-1.39.0:=
 DESCRIPTION=Common utilities and extension traits for the futures-rs library.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r1
 SRC_URI=https://crates.io/api/v1/crates/futures-util/0.3.1/download -> futures-util-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e7a357eef23d233f402233fd07e97870
diff --git a/metadata/md5-cache/dev-rust/getopts-0.2.18 b/metadata/md5-cache/dev-rust/getopts-0.2.18
index befe7fb..6063de5 100644
--- a/metadata/md5-cache/dev-rust/getopts-0.2.18
+++ b/metadata/md5-cache/dev-rust/getopts-0.2.18
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=dev-rust/log:= dev-rust/unicode-width:= >=virtual/rust-1.39.0:=
 DESCRIPTION=getopts-like option parsing
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.18/r0
 SRC_URI=https://crates.io/api/v1/crates/getopts/0.2.18/download -> getopts-0.2.18.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6ef2288f6f732bb35a22a8e8447e333d
diff --git a/metadata/md5-cache/dev-rust/gimli-0.15.0 b/metadata/md5-cache/dev-rust/gimli-0.15.0
index 19869fe..8e970be 100644
--- a/metadata/md5-cache/dev-rust/gimli-0.15.0
+++ b/metadata/md5-cache/dev-rust/gimli-0.15.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty gimli crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.15.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/git2-0.9.1 b/metadata/md5-cache/dev-rust/git2-0.9.1
index d0b388d..86ed5b8 100644
--- a/metadata/md5-cache/dev-rust/git2-0.9.1
+++ b/metadata/md5-cache/dev-rust/git2-0.9.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bitflags-1.0:= >=dev-rust/libc-0.2:= >=dev-rust/libgit2-sys-0.8.0:= =dev-rust/log-0.4*:= =dev-rust/url-1*:= >=dev-rust/openssl-probe-0.1.2:= >=dev-rust/openssl-sys-0.9.47:= >=virtual/rust-1.39.0:=
 DESCRIPTION=libgit2 bindings for Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.9.1/r0
 SRC_URI=https://crates.io/api/v1/crates/git2/0.9.1/download -> git2-0.9.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f834ba7671188ee4f7d2d07d59381fd4
diff --git a/metadata/md5-cache/dev-rust/h2-0.1.26 b/metadata/md5-cache/dev-rust/h2-0.1.26
index 2984c87..6bf0e04 100644
--- a/metadata/md5-cache/dev-rust/h2-0.1.26
+++ b/metadata/md5-cache/dev-rust/h2-0.1.26
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/byteorder-1.0:= >=dev-rust/bytes-0.4.7:= >=dev-rust/fnv-1.0.5:= >=dev-rust/futures-0.1:= >=dev-rust/http-0.1.8:= >=dev-rust/indexmap-1.0:= >=dev-rust/log-0.4.1:= >=dev-rust/slab-0.4.0:= >=dev-rust/string-0.2:= >=dev-rust/tokio-io-0.1.4:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Tokio aware, HTTP/2.0 client & server implementation for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.26/r0
 SRC_URI=https://crates.io/api/v1/crates/h2/0.1.26/download -> h2-0.1.26.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=57b3cdb703c724859126c4b1c5f235b6
diff --git a/metadata/md5-cache/dev-rust/hashbrown-0.1.7 b/metadata/md5-cache/dev-rust/hashbrown-0.1.7
index 158a528..200cb7c 100644
--- a/metadata/md5-cache/dev-rust/hashbrown-0.1.7
+++ b/metadata/md5-cache/dev-rust/hashbrown-0.1.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/byteorder-1.0.0:= >=dev-rust/scopeguard-0.3.0:= >=dev-rust/serde-1.0.0:= >=dev-rust/rand-0.5.1:= >=dev-rust/rustc-hash-1.0.0:= >=dev-rust/serde_test-1.0.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate is a Rust port of Google's high-performance SwissTable hash map, adapted to make it a drop-in replacement for Rust's standard HashMap and HashSet types.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.7/r0
 SRC_URI=https://crates.io/api/v1/crates/hashbrown/0.1.7/download -> hashbrown-0.1.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=62e55cacb795c3c2e51b273671a0fba6
diff --git a/metadata/md5-cache/dev-rust/heapsize-0.4.2 b/metadata/md5-cache/dev-rust/heapsize-0.4.2
index 32b216b..1cf592a 100644
--- a/metadata/md5-cache/dev-rust/heapsize-0.4.2
+++ b/metadata/md5-cache/dev-rust/heapsize-0.4.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty heapsize crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/hound-3.4.0 b/metadata/md5-cache/dev-rust/hound-3.4.0
index ae1329c..24dde9c 100644
--- a/metadata/md5-cache/dev-rust/hound-3.4.0
+++ b/metadata/md5-cache/dev-rust/hound-3.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A wav encoding and decoding library
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=3.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/hound/3.4.0/download -> hound-3.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=02fbba0960462a9db11c94533a04cdea
diff --git a/metadata/md5-cache/dev-rust/http-0.1.17 b/metadata/md5-cache/dev-rust/http-0.1.17
index 9026309..494fede 100644
--- a/metadata/md5-cache/dev-rust/http-0.1.17
+++ b/metadata/md5-cache/dev-rust/http-0.1.17
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty http crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.17/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/http-0.1.19 b/metadata/md5-cache/dev-rust/http-0.1.19
index 2561e18..0ebc5d1 100644
--- a/metadata/md5-cache/dev-rust/http-0.1.19
+++ b/metadata/md5-cache/dev-rust/http-0.1.19
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4:= >=dev-rust/fnv-1.0.5:= >=dev-rust/itoa-0.4.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A general purpose library of common HTTP types
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.19/r0
 SRC_URI=https://crates.io/api/v1/crates/http/0.1.19/download -> http-0.1.19.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cb9c0fb68363dcf13ca2a00f9e7b6e73
diff --git a/metadata/md5-cache/dev-rust/http-body-0.1.0 b/metadata/md5-cache/dev-rust/http-body-0.1.0
index 1aea804..92b5e13 100644
--- a/metadata/md5-cache/dev-rust/http-body-0.1.0
+++ b/metadata/md5-cache/dev-rust/http-body-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4.11:= >=dev-rust/futures-0.1.25:= >=dev-rust/http-0.1.16:= >=dev-rust/tokio-buf-0.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A trait representing asynchronous operations on an HTTP body.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/http-body/0.1.0/download -> http-body-0.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a48304008ea886bff770dd3afba31a6b
diff --git a/metadata/md5-cache/dev-rust/httparse-1.0.0 b/metadata/md5-cache/dev-rust/httparse-1.0.0
index 340434b..06a1e28 100644
--- a/metadata/md5-cache/dev-rust/httparse-1.0.0
+++ b/metadata/md5-cache/dev-rust/httparse-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty httparse crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/httparse-1.3.4 b/metadata/md5-cache/dev-rust/httparse-1.3.4
index fcf8ce7..9acce69 100644
--- a/metadata/md5-cache/dev-rust/httparse-1.3.4
+++ b/metadata/md5-cache/dev-rust/httparse-1.3.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A push parser for the HTTP 1.x protocol. Avoids allocations. No copy. Fast.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.3.4/r0
 SRC_URI=https://crates.io/api/v1/crates/httparse/1.3.4/download -> httparse-1.3.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f548d6a2948034facc146df469ae9169
diff --git a/metadata/md5-cache/dev-rust/httparse-1.3.4-r1 b/metadata/md5-cache/dev-rust/httparse-1.3.4-r1
index 66a5bbf..bf2a99a 100644
--- a/metadata/md5-cache/dev-rust/httparse-1.3.4-r1
+++ b/metadata/md5-cache/dev-rust/httparse-1.3.4-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A push parser for the HTTP 1.x protocol. Avoids allocations. No copy. Fast.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.3.4/r1
 SRC_URI=https://crates.io/api/v1/crates/httparse/1.3.4/download -> httparse-1.3.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f548d6a2948034facc146df469ae9169
diff --git a/metadata/md5-cache/dev-rust/humantime-1.1.1 b/metadata/md5-cache/dev-rust/humantime-1.1.1
index c306670..df5f4ec 100644
--- a/metadata/md5-cache/dev-rust/humantime-1.1.1
+++ b/metadata/md5-cache/dev-rust/humantime-1.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/quick-error-1*:= =dev-rust/chrono-0.4*:= =dev-rust/rand-0.4*:= >=dev-rust/time-0.1.39:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Human-friendly time parser and formatter.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/humantime/1.1.1/download -> humantime-1.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cd559a426e257850011b37382a56fa11
diff --git a/metadata/md5-cache/dev-rust/hyper-0.12.27 b/metadata/md5-cache/dev-rust/hyper-0.12.27
index b74c7bf..ac850ff 100644
--- a/metadata/md5-cache/dev-rust/hyper-0.12.27
+++ b/metadata/md5-cache/dev-rust/hyper-0.12.27
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty hyper crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.12.27/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/hyper-0.12.35 b/metadata/md5-cache/dev-rust/hyper-0.12.35
index 3ebd9b1..aea5d18 100644
--- a/metadata/md5-cache/dev-rust/hyper-0.12.35
+++ b/metadata/md5-cache/dev-rust/hyper-0.12.35
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4.4:= >=dev-rust/futures-0.1.21:= >=dev-rust/h2-0.1.10:= >=dev-rust/http-0.1.15:= >=dev-rust/httparse-1.0:= >=dev-rust/http-body-0.1:= >=dev-rust/iovec-0.1:= >=dev-rust/itoa-0.4.1:= >=dev-rust/log-0.4:= >=dev-rust/rustc_version-0.2:= >=dev-rust/time-0.1:= >=dev-rust/tokio-buf-0.1:= >=dev-rust/tokio-io-0.1:= >=dev-rust/want-0.2:= >=dev-rust/futures-cpupool-0.1.6:= >=dev-rust/net2-0.2.32:= >=dev-rust/tokio-0.1.14:= >=dev-rust/tokio-executor-0.1:= >=dev-rust/tokio-reactor-0.1:= >=dev-rust/tokio-tcp-0.1:= >=dev-rust/tokio-threadpool-0.1.3:= >=dev-rust/tokio-timer-0.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A fast and correct HTTP implementation for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.12.35/r0
 SRC_URI=https://crates.io/api/v1/crates/hyper/0.12.35/download -> hyper-0.12.35.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3a1787fc609cf31c59eba298a3f6d12a
diff --git a/metadata/md5-cache/dev-rust/hyper-tls-0.3.2 b/metadata/md5-cache/dev-rust/hyper-tls-0.3.2
index 9cf72f0..0fd7181 100644
--- a/metadata/md5-cache/dev-rust/hyper-tls-0.3.2
+++ b/metadata/md5-cache/dev-rust/hyper-tls-0.3.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4:= >=dev-rust/futures-0.1.21:= >=dev-rust/hyper-0.12:= >=dev-rust/native-tls-0.2:= >=dev-rust/tokio-io-0.1:= >=dev-rust/tokio-0.1.5:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Default TLS implementation for use with hyper
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.2/r0
 SRC_URI=https://crates.io/api/v1/crates/hyper-tls/0.3.2/download -> hyper-tls-0.3.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7f83789c232af36e48a72f14440e6d1a
diff --git a/metadata/md5-cache/dev-rust/hyphenation-0.7.1 b/metadata/md5-cache/dev-rust/hyphenation-0.7.1
index b51d83d..74ebf80 100644
--- a/metadata/md5-cache/dev-rust/hyphenation-0.7.1
+++ b/metadata/md5-cache/dev-rust/hyphenation-0.7.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty hyphenation crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bc6aca5c8ee7fc43c9e14fd5a3e5e494
diff --git a/metadata/md5-cache/dev-rust/idna-0.1.5 b/metadata/md5-cache/dev-rust/idna-0.1.5
index 24593ef..ca3b789 100644
--- a/metadata/md5-cache/dev-rust/idna-0.1.5
+++ b/metadata/md5-cache/dev-rust/idna-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/matches-0.1*:= =dev-rust/unicode-bidi-0.3*:= =dev-rust/unicode-normalization-0.1*:= =dev-rust/rustc-serialize-0.3*:= =dev-rust/rustc-test-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=IDNA (Internationalizing Domain Names in Applications) and Punycode
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/idna/0.1.5/download -> idna-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a68a9a86792c2045719543e28fd41634
diff --git a/metadata/md5-cache/dev-rust/indexmap-1.0.0 b/metadata/md5-cache/dev-rust/indexmap-1.0.0
index b7ce4b6..afc0f5a1 100644
--- a/metadata/md5-cache/dev-rust/indexmap-1.0.0
+++ b/metadata/md5-cache/dev-rust/indexmap-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty indexmap crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/indexmap-1.0.2 b/metadata/md5-cache/dev-rust/indexmap-1.0.2
index 9b5bd40..42485ed 100644
--- a/metadata/md5-cache/dev-rust/indexmap-1.0.2
+++ b/metadata/md5-cache/dev-rust/indexmap-1.0.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/serde-1*:= =dev-rust/fnv-1*:= =dev-rust/itertools-0.7*:= =dev-rust/lazy_static-1*:= =dev-rust/quickcheck-0.6*:= =dev-rust/rand-0.4*:= >=dev-rust/serde_test-1.0.5:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A hash table with consistent order and fast iteration.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.2/r0
 SRC_URI=https://crates.io/api/v1/crates/indexmap/1.0.2/download -> indexmap-1.0.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0463ec6876aabb37d3e113ac06370dab
diff --git a/metadata/md5-cache/dev-rust/intrusive-collections-0.9.0 b/metadata/md5-cache/dev-rust/intrusive-collections-0.9.0
new file mode 100644
index 0000000..68a885c
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/intrusive-collections-0.9.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/memoffset-0.5.4:= <dev-rust/memoffset-0.6 >=virtual/rust-1.39.0:=
+DESCRIPTION=A Rust library for creating intrusive collections
+EAPI=7
+HOMEPAGE=https://github.com/Amanieu/intrusive-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.9.0/r0
+SRC_URI=https://crates.io/api/v1/crates/intrusive-collections/0.9.0/download -> intrusive-collections-0.9.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=33fb72f89c0a04f6ed2a52c49ceae853
diff --git a/metadata/md5-cache/dev-rust/iota-0.1.4 b/metadata/md5-cache/dev-rust/iota-0.1.4
index 4d4800c..f364159 100644
--- a/metadata/md5-cache/dev-rust/iota-0.1.4
+++ b/metadata/md5-cache/dev-rust/iota-0.1.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Related constants: 1 << iota
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.4/r0
 SRC_URI=https://crates.io/api/v1/crates/iota/0.1.4/download -> iota-0.1.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fcae20bcc43f3bee9e8662892cd379dd
diff --git a/metadata/md5-cache/dev-rust/iovec-0.1.2 b/metadata/md5-cache/dev-rust/iovec-0.1.2
index 7b4a587..66a0e9d 100644
--- a/metadata/md5-cache/dev-rust/iovec-0.1.2
+++ b/metadata/md5-cache/dev-rust/iovec-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/libc-0.2*:= =dev-rust/winapi-0.2*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A specialized byte slice type for performing vectored I/O operations
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/iovec/0.1.2/download -> iovec-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9492a5f36f6937c51a97cd4607f7237c
diff --git a/metadata/md5-cache/dev-rust/itertools-0.7.11 b/metadata/md5-cache/dev-rust/itertools-0.7.11
index 43ab524..544dbc2 100644
--- a/metadata/md5-cache/dev-rust/itertools-0.7.11
+++ b/metadata/md5-cache/dev-rust/itertools-0.7.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty itertools crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.11/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/itoa-0.4.4 b/metadata/md5-cache/dev-rust/itoa-0.4.4
index 60011b8..50be87f 100644
--- a/metadata/md5-cache/dev-rust/itoa-0.4.4
+++ b/metadata/md5-cache/dev-rust/itoa-0.4.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides fast functions for printing integer primitives to an io::Write or a fmt::Write.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.4/r0
 SRC_URI=https://crates.io/api/v1/crates/itoa/0.4.4/download -> itoa-0.4.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bdddc791c7e0e859796f00fb0bceb606
diff --git a/metadata/md5-cache/dev-rust/kernel32-sys-0.2.2 b/metadata/md5-cache/dev-rust/kernel32-sys-0.2.2
index 9f73036..3c594b3 100644
--- a/metadata/md5-cache/dev-rust/kernel32-sys-0.2.2
+++ b/metadata/md5-cache/dev-rust/kernel32-sys-0.2.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty kernel32-sys crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/lazy_static-1.4.0 b/metadata/md5-cache/dev-rust/lazy_static-1.4.0
index 9f26d42..452c2ff 100644
--- a/metadata/md5-cache/dev-rust/lazy_static-1.4.0
+++ b/metadata/md5-cache/dev-rust/lazy_static-1.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/spin-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A macro for declaring lazily evaluated statics in Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/lazy_static/1.4.0/download -> lazy_static-1.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ab0bec05458f0197fd74665f2bbc753a
diff --git a/metadata/md5-cache/dev-rust/libc-0.2.65 b/metadata/md5-cache/dev-rust/libc-0.2.65
index 4ec88b83..5299b11 100644
--- a/metadata/md5-cache/dev-rust/libc-0.2.65
+++ b/metadata/md5-cache/dev-rust/libc-0.2.65
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/rustc-std-workspace-core-1.0.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library with native bindings to the types and functions commonly found on various systems, including libc
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.65/r0
 SRC_URI=https://crates.io/api/v1/crates/libc/0.2.65/download -> libc-0.2.65.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6c08d3324cd1eeeb95db215f5baab5ac
diff --git a/metadata/md5-cache/dev-rust/libc-0.2.74 b/metadata/md5-cache/dev-rust/libc-0.2.74
new file mode 100644
index 0000000..1065d17
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libc-0.2.74
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/rustc-std-workspace-core-1.0.0:= >=virtual/rust-1.39.0:=
+DESCRIPTION=A Rust library with native bindings to the types and functions commonly found on various systems, including libc
+EAPI=6
+HOMEPAGE=https://github.com/rust-lang/libc
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.2.74/r0
+SRC_URI=https://crates.io/api/v1/crates/libc/0.2.74/download -> libc-0.2.74.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6c08d3324cd1eeeb95db215f5baab5ac
diff --git a/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r17 b/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r17
new file mode 100644
index 0000000..814aa09
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r17
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=chromeos-base/system_api:= sys-apps/dbus:= =dev-rust/futures-0.3*:= =dev-rust/getopts-0.2*:= =dev-rust/intrusive-collections-0.9*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.1:= !>=dev-rust/protobuf-3.0:= >=virtual/rust-1.39.0:=
+DESCRIPTION=A Rust utility library for Chrome OS
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-rs/
+IUSE=test cros_host cros_workon_tree_6461ccb9a2a7e3a63e9995628c577ad539e266e4 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/libchromeos-0.1.0-r2
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r17
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=54fb908f3e678cd660781fe086aa9818
diff --git a/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r5 b/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r5
deleted file mode 100644
index 8ef506a..0000000
--- a/metadata/md5-cache/dev-rust/libchromeos-0.1.0-r5
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= sys-apps/dbus:= =dev-rust/dbus-0.6*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.1:= !>=dev-rust/protobuf-3.0:= >=virtual/rust-1.39.0:=
-DESCRIPTION=A Rust utility library for Chrome OS
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-rs/
-IUSE=test cros_host cros_workon_tree_0eda50c11ced2c3a523eb3371116b892d469fa9a cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/libchromeos-0.1.0-r2
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r5
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=fb33510f68b0b26cad1b09255c6acb39
diff --git a/metadata/md5-cache/dev-rust/libchromeos-9999 b/metadata/md5-cache/dev-rust/libchromeos-9999
index 83f45c3..71ef734 100644
--- a/metadata/md5-cache/dev-rust/libchromeos-9999
+++ b/metadata/md5-cache/dev-rust/libchromeos-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/system_api:= sys-apps/dbus:= =dev-rust/dbus-0.6*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.1:= !>=dev-rust/protobuf-3.0:= >=virtual/rust-1.39.0:=
+DEPEND=chromeos-base/system_api:= sys-apps/dbus:= =dev-rust/futures-0.3*:= =dev-rust/getopts-0.2*:= =dev-rust/intrusive-collections-0.9*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= >=dev-rust/protobuf-2.1:= !>=dev-rust/protobuf-3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust utility library for Chrome OS
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/libchromeos-rs/
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/libchromeos-0.1.0-r2
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=963d52cdd50ee148716dbf5318340631
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ffc9cda5767cf5a706efca492c7ba9b2
diff --git a/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3 b/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3
index 1ac18ea..0aa6364 100644
--- a/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3
+++ b/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/pkg-config-0.3:= sys-apps/dbus >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust FFI bindings to libdbus.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/libdbus-sys/0.1.3/download -> libdbus-sys-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3a67ed6093dbb742f62fb71dfb8e8ed3
diff --git a/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3-r1 b/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3-r1
index ae2c830..1155cb0 100644
--- a/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3-r1
+++ b/metadata/md5-cache/dev-rust/libdbus-sys-0.1.3-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/pkg-config-0.3:= sys-apps/dbus >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust FFI bindings to libdbus.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r1
 SRC_URI=https://crates.io/api/v1/crates/libdbus-sys/0.1.3/download -> libdbus-sys-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3a67ed6093dbb742f62fb71dfb8e8ed3
diff --git a/metadata/md5-cache/dev-rust/libdbus-sys-0.2.1 b/metadata/md5-cache/dev-rust/libdbus-sys-0.2.1
new file mode 100644
index 0000000..5c2a96c
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libdbus-sys-0.2.1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/pkg-config-0.3*:= sys-apps/dbus:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust FFI bindings to libdbus.
+EAPI=7
+HOMEPAGE=https://github.com/diwic/dbus-rs
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.2.1/r0
+SRC_URI=https://crates.io/api/v1/crates/libdbus-sys/0.2.1/download -> libdbus-sys-0.2.1.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=bdbcc1ac9a4bb51ea4fabd989c3e0ede
diff --git a/metadata/md5-cache/dev-rust/libgit2-sys-0.8.0 b/metadata/md5-cache/dev-rust/libgit2-sys-0.8.0
index d67da44..0b3c5d2 100644
--- a/metadata/md5-cache/dev-rust/libgit2-sys-0.8.0
+++ b/metadata/md5-cache/dev-rust/libgit2-sys-0.8.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cc-1.0.25:= >=dev-rust/libc-0.2:= >=dev-rust/libssh2-sys-0.2.11:= >=dev-rust/libz-sys-1.0.22:= >=dev-rust/pkg-config-0.3.7:= >=dev-rust/openssl-sys-0.9.47:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Native bindings to the libgit2 library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.0/r0
 SRC_URI=https://crates.io/api/v1/crates/libgit2-sys/0.8.0/download -> libgit2-sys-0.8.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e554571ba4c274b62089eadcb7e79636
diff --git a/metadata/md5-cache/dev-rust/libnghttp2-sys-0.1.1 b/metadata/md5-cache/dev-rust/libnghttp2-sys-0.1.1
index 055dc15..8297b23 100644
--- a/metadata/md5-cache/dev-rust/libnghttp2-sys-0.1.1
+++ b/metadata/md5-cache/dev-rust/libnghttp2-sys-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cc-1.0.24:= =dev-rust/libc-0.2*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A common library for linking nghttp2 to rust programs (also known as libnghttp2).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/libnghttp2-sys/0.1.1/download -> libnghttp2-sys-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5d207b657a14d4ace1a66cba852d7529
diff --git a/metadata/md5-cache/dev-rust/libsqlite3-sys-0.15.0 b/metadata/md5-cache/dev-rust/libsqlite3-sys-0.15.0
index 274cf63..1bab28a 100644
--- a/metadata/md5-cache/dev-rust/libsqlite3-sys-0.15.0
+++ b/metadata/md5-cache/dev-rust/libsqlite3-sys-0.15.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bindgen-0.49*:= =dev-rust/cc-1*:= =dev-rust/pkg-config-0.3*:= =dev-rust/vcpkg-0.2*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Native bindings to the libsqlite3 library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.15.0/r0
 SRC_URI=https://crates.io/api/v1/crates/libsqlite3-sys/0.15.0/download -> libsqlite3-sys-0.15.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e308356015f92177baacdf7901e4cb9b
diff --git a/metadata/md5-cache/dev-rust/libsqlite3-sys-0.16.0 b/metadata/md5-cache/dev-rust/libsqlite3-sys-0.16.0
index ab8fe00..8c6bd42 100644
--- a/metadata/md5-cache/dev-rust/libsqlite3-sys-0.16.0
+++ b/metadata/md5-cache/dev-rust/libsqlite3-sys-0.16.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bindgen-0.51*:= =dev-rust/cc-1*:= =dev-rust/pkg-config-0.3*:= =dev-rust/vcpkg-0.2*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Native bindings to the libsqlite3 library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.16.0/r0
 SRC_URI=https://crates.io/api/v1/crates/libsqlite3-sys/0.16.0/download -> libsqlite3-sys-0.16.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3baec2ce68c6bb154667fbc053b00673
diff --git a/metadata/md5-cache/dev-rust/libssh2-sys-0.2.11 b/metadata/md5-cache/dev-rust/libssh2-sys-0.2.11
index 2ac3f3e..9bc38604 100644
--- a/metadata/md5-cache/dev-rust/libssh2-sys-0.2.11
+++ b/metadata/md5-cache/dev-rust/libssh2-sys-0.2.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cc-1.0.25:= >=dev-rust/libc-0.2:= >=dev-rust/libz-sys-1.0.21:= >=dev-rust/openssl-sys-0.9.35:= >=dev-rust/pkg-config-0.3.11:= >=dev-rust/vcpkg-0.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Native bindings to the libssh2 library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.11/r0
 SRC_URI=https://crates.io/api/v1/crates/libssh2-sys/0.2.11/download -> libssh2-sys-0.2.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e6510c3b34f2088db6bd4c5ca18996bb
diff --git a/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7 b/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7
new file mode 100644
index 0000000..620f4f3
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/pkg-config-0.3*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=FFI bindings for libusb
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/libusb1-sys/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.3.7/r0
+SRC_URI=https://crates.io/api/v1/crates/libusb1-sys/0.3.7/download -> libusb1-sys-0.3.7.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cccf0f3a7b6092f354c76984b119651c
diff --git a/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7-r1 b/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7-r1
new file mode 100644
index 0000000..b18c20b
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libusb1-sys-0.3.7-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/pkg-config-0.3*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=FFI bindings for libusb
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/libusb1-sys/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.3.7/r1
+SRC_URI=https://crates.io/api/v1/crates/libusb1-sys/0.3.7/download -> libusb1-sys-0.3.7.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cccf0f3a7b6092f354c76984b119651c
diff --git a/metadata/md5-cache/dev-rust/libvda-0.1.0-r16 b/metadata/md5-cache/dev-rust/libvda-0.1.0-r16
deleted file mode 100644
index 9343cbb..0000000
--- a/metadata/md5-cache/dev-rust/libvda-0.1.0-r16
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/libvda:= !!<=dev-rust/libvda-0.0.1-r5 dev-rust/pkg-config:= dev-rust/enumn:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust wrapper for chromeos-base/libvda
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda/rust
-IUSE=test cros_host cros_workon_tree_551aaa53c982c20b42858549cdf3c5fab2cdd40b cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/libvda:= !!<=dev-rust/libvda-0.0.1-r5
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r16
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=618903dbb853a09bc015330963d24acb
diff --git a/metadata/md5-cache/dev-rust/libvda-0.1.0-r20 b/metadata/md5-cache/dev-rust/libvda-0.1.0-r20
new file mode 100644
index 0000000..0afba40
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/libvda-0.1.0-r20
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=chromeos-base/libvda:= !!<=dev-rust/libvda-0.0.1-r5 dev-rust/pkg-config:= dev-rust/enumn:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust wrapper for chromeos-base/libvda
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/arc/vm/libvda/rust
+IUSE=test cros_host cros_workon_tree_cb4a35c0e59b01ac8b0aca5afb3a04e833d57fd3 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/libvda:= !!<=dev-rust/libvda-0.0.1-r5
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r20
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=113ed45d9a8d5224132cbbb8aa61d946
diff --git a/metadata/md5-cache/dev-rust/libvda-9999 b/metadata/md5-cache/dev-rust/libvda-9999
index fb085b5..5c022a1 100644
--- a/metadata/md5-cache/dev-rust/libvda-9999
+++ b/metadata/md5-cache/dev-rust/libvda-9999
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/libvda:= !!<=dev-rust/libvda-0.0.1-r5
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c31a1a79ff657befe99f23a20701e04d
diff --git a/metadata/md5-cache/dev-rust/libz-sys-1.0.18 b/metadata/md5-cache/dev-rust/libz-sys-1.0.18
index 7075a85..77dbe36 100644
--- a/metadata/md5-cache/dev-rust/libz-sys-1.0.18
+++ b/metadata/md5-cache/dev-rust/libz-sys-1.0.18
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/cc-1*:= =dev-rust/libc-0.2*:= =dev-rust/pkg-config-0.3*:= =dev-rust/vcpkg-0.2*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides multi-producer multi-consumer channels for message passing.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.18/r0
 SRC_URI=https://crates.io/api/v1/crates/libz-sys/1.0.18/download -> libz-sys-1.0.18.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a831a3b9a615f9aec66dd98ef97183a5
diff --git a/metadata/md5-cache/dev-rust/libz-sys-1.0.25 b/metadata/md5-cache/dev-rust/libz-sys-1.0.25
index cad8082..a350f53 100644
--- a/metadata/md5-cache/dev-rust/libz-sys-1.0.25
+++ b/metadata/md5-cache/dev-rust/libz-sys-1.0.25
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cc-1.0.18:= >=dev-rust/libc-0.2.43:= >=dev-rust/pkg-config-0.3.9:= >=dev-rust/vcpkg-0.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Bindings to the system libz library (also known as zlib).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.25/r0
 SRC_URI=https://crates.io/api/v1/crates/libz-sys/1.0.25/download -> libz-sys-1.0.25.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8252b37814e1ee7583b6e5cdefdee819
diff --git a/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2 b/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2
index e0338b2..3a4d84a 100644
--- a/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2
+++ b/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/clippy-0.0*:= =dev-rust/heapsize-0.4*:= =dev-rust/serde-1*:= =dev-rust/serde_test-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A HashMap wrapper that holds key-value pairs in insertion order
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.2/r0
 SRC_URI=https://crates.io/api/v1/crates/linked-hash-map/0.5.2/download -> linked-hash-map-0.5.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=81356d66fac52dd2225e0d17512d2121
diff --git a/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2-r1 b/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2-r1
index 5317b41..09077c5 100644
--- a/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2-r1
+++ b/metadata/md5-cache/dev-rust/linked-hash-map-0.5.2-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/clippy-0.0*:= =dev-rust/heapsize-0.4*:= =dev-rust/serde-1*:= =dev-rust/serde_test-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A HashMap wrapper that holds key-value pairs in insertion order
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.2/r1
 SRC_URI=https://crates.io/api/v1/crates/linked-hash-map/0.5.2/download -> linked-hash-map-0.5.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=81356d66fac52dd2225e0d17512d2121
diff --git a/metadata/md5-cache/dev-rust/lock_api-0.1.5 b/metadata/md5-cache/dev-rust/lock_api-0.1.5
index ad17351..4fefc86 100644
--- a/metadata/md5-cache/dev-rust/lock_api-0.1.5
+++ b/metadata/md5-cache/dev-rust/lock_api-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/scopeguard-0.3*:= =dev-rust/owning_ref-0.4*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/lock_api/0.1.5/download -> lock_api-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=26f5ecce9302bddfd744211c4709b48d
diff --git a/metadata/md5-cache/dev-rust/log-0.4.5 b/metadata/md5-cache/dev-rust/log-0.4.5
index a6778fc..ec5b1cb 100644
--- a/metadata/md5-cache/dev-rust/log-0.4.5
+++ b/metadata/md5-cache/dev-rust/log-0.4.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=dev-rust/cfg-if:= dev-rust/serde:= dev-rust/serde_test:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A lightweight logging facade for rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.5/r0
 SRC_URI=https://crates.io/api/v1/crates/log/0.4.5/download -> log-0.4.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a9f0592ec1e6c695598572e79249b38b
diff --git a/metadata/md5-cache/dev-rust/loom-0.1.1 b/metadata/md5-cache/dev-rust/loom-0.1.1
index e251d35..2a0b283 100644
--- a/metadata/md5-cache/dev-rust/loom-0.1.1
+++ b/metadata/md5-cache/dev-rust/loom-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty loom crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/lru-0.1.16 b/metadata/md5-cache/dev-rust/lru-0.1.16
index 814abd2..e822c46 100644
--- a/metadata/md5-cache/dev-rust/lru-0.1.16
+++ b/metadata/md5-cache/dev-rust/lru-0.1.16
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/hashbrown-0.1*:= =dev-rust/scoped_threadpool-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of a LRU cache. The cache supports put, get, get_mut and pop operations, all of which are O(1). This crate was heavily influenced by the LRU Cache implementation in an earlier version of Rust's std::collections crate.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.16/r0
 SRC_URI=https://crates.io/api/v1/crates/lru/0.1.16/download -> lru-0.1.16.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=65ae5b329578092647986e5c328d9b9b
diff --git a/metadata/md5-cache/dev-rust/lru-cache-0.1.2 b/metadata/md5-cache/dev-rust/lru-cache-0.1.2
index 80c747c..fa93fa4 100644
--- a/metadata/md5-cache/dev-rust/lru-cache-0.1.2
+++ b/metadata/md5-cache/dev-rust/lru-cache-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/linked-hash-map-0.5*:= =dev-rust/heapsize-0.4*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A cache that holds a limited number of key-value pairs
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/lru-cache/0.1.2/download -> lru-cache-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ca44c14b6ca8abfa3bcce15535f7c4a2
diff --git a/metadata/md5-cache/dev-rust/matches-0.1.8 b/metadata/md5-cache/dev-rust/matches-0.1.8
index 267de8d..02fa6cf 100644
--- a/metadata/md5-cache/dev-rust/matches-0.1.8
+++ b/metadata/md5-cache/dev-rust/matches-0.1.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A macro to evaluate, as a boolean, whether an expression matches a pattern
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.8/r0
 SRC_URI=https://crates.io/api/v1/crates/matches/0.1.8/download -> matches-0.1.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4a292c75abb4d90b66d1c3feae66831e
diff --git a/metadata/md5-cache/dev-rust/memchr-2.2.1 b/metadata/md5-cache/dev-rust/memchr-2.2.1
index 561f9c4..75506e89 100644
--- a/metadata/md5-cache/dev-rust/memchr-2.2.1
+++ b/metadata/md5-cache/dev-rust/memchr-2.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/libc-0.2.18:= <dev-rust/libc-0.3.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Safe interface to memchr.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/memchr/2.2.1/download -> memchr-2.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=db4aca02ad3f6c4ae112d431d15bd6af
diff --git a/metadata/md5-cache/dev-rust/memmap-0.6.2 b/metadata/md5-cache/dev-rust/memmap-0.6.2
index eb1905a..51bd850 100644
--- a/metadata/md5-cache/dev-rust/memmap-0.6.2
+++ b/metadata/md5-cache/dev-rust/memmap-0.6.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty memmap crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/memoffset-0.2.1 b/metadata/md5-cache/dev-rust/memoffset-0.2.1
index 6b207c9..15161ae 100644
--- a/metadata/md5-cache/dev-rust/memoffset-0.2.1
+++ b/metadata/md5-cache/dev-rust/memoffset-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=C-Like offset_of functionality for Rust structs
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/memoffset/0.2.1/download -> memoffset-0.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=827e49c10ca04132710ce228e3e2dd56
diff --git a/metadata/md5-cache/dev-rust/memoffset-0.5.5 b/metadata/md5-cache/dev-rust/memoffset-0.5.5
new file mode 100644
index 0000000..dcfb0ba
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/memoffset-0.5.5
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/autocfg-1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=C-Like offset_of functionality for Rust structs
+EAPI=7
+HOMEPAGE=https://github.com/Gilnaa/memoffset
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.5.5/r0
+SRC_URI=https://crates.io/api/v1/crates/memoffset/0.5.5/download -> memoffset-0.5.5.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=17653cae1d63c7ce920e49a84348a4bb
diff --git a/metadata/md5-cache/dev-rust/minijail-0.1.0-r3 b/metadata/md5-cache/dev-rust/minijail-0.1.0-r3
deleted file mode 100644
index 1372137..0000000
--- a/metadata/md5-cache/dev-rust/minijail-0.1.0-r3
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/minijail-sys:= >=virtual/rust-1.39.0:=
-DESCRIPTION=rust bindings for minijail
-EAPI=7
-HOMEPAGE=https://android.googlesource.com/platform/external/minijail
-IUSE=asan test cros_host cros_workon_tree_610c6ce909f9e1d024fafeee42d7d008fc6f22d2 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r3
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=356d38c73f3c42434f1f362a442d4962
diff --git a/metadata/md5-cache/dev-rust/minijail-0.2.1-r1 b/metadata/md5-cache/dev-rust/minijail-0.2.1-r1
new file mode 100644
index 0000000..426ff91
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/minijail-0.2.1-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=dev-rust/libc-0.2.44:= <dev-rust/libc-0.3.0 dev-rust/minijail-sys:= >=virtual/rust-1.39.0:=
+DESCRIPTION=rust bindings for minijail
+EAPI=7
+HOMEPAGE=https://android.googlesource.com/platform/external/minijail
+IUSE=asan test cros_host cros_workon_tree_2ac2853d10ad0e5f4b451d75ea3590649b9ee241 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.2.1-r1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a73d22fa7ee40c53006e38b06d0532e6
diff --git a/metadata/md5-cache/dev-rust/minijail-9999 b/metadata/md5-cache/dev-rust/minijail-9999
index 8703075..cda764c 100644
--- a/metadata/md5-cache/dev-rust/minijail-9999
+++ b/metadata/md5-cache/dev-rust/minijail-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5196c90c1c746a7e19e4e26a566fea51
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3589dabee6f68d078e2ea47f00bef0cf
diff --git a/metadata/md5-cache/dev-rust/minijail-sys-0.0.11-r1 b/metadata/md5-cache/dev-rust/minijail-sys-0.0.11-r1
index f6bc3da..e3520ad 100644
--- a/metadata/md5-cache/dev-rust/minijail-sys-0.0.11-r1
+++ b/metadata/md5-cache/dev-rust/minijail-sys-0.0.11-r1
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/minijail:= sys-libs/libcap:=
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0.0.11-r1
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e624ddcc95e4a3f2fc571afba474c2b2
diff --git a/metadata/md5-cache/dev-rust/minijail-sys-9999 b/metadata/md5-cache/dev-rust/minijail-sys-9999
index 460bc30..722bd54 100644
--- a/metadata/md5-cache/dev-rust/minijail-sys-9999
+++ b/metadata/md5-cache/dev-rust/minijail-sys-9999
@@ -11,5 +11,5 @@
 RDEPEND=chromeos-base/minijail:= sys-libs/libcap:=
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d2abc4b54bb3fff90a58c20266cd71ad
diff --git a/metadata/md5-cache/dev-rust/mio-0.6.17 b/metadata/md5-cache/dev-rust/mio-0.6.17
index 29297d3..5de0993 100644
--- a/metadata/md5-cache/dev-rust/mio-0.6.17
+++ b/metadata/md5-cache/dev-rust/mio-0.6.17
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/fuchsia-zircon-0.3*:= =dev-rust/fuchsia-zircon-sys-0.3*:= =dev-rust/iovec-0.1*:= =dev-rust/kernel32-sys-0.2*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/miow-0.2*:= =dev-rust/net2-0.2*:= =dev-rust/slab-0.4*:= =dev-rust/winapi-0.2*:= =dev-rust/bytes-0.3*:= =dev-rust/env_logger-0.4*:= =dev-rust/tempdir-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Mio is a lightweight I/O library for Rust with a focus on adding as little overhead as possible over the OS abstractions
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.17/r0
 SRC_URI=https://crates.io/api/v1/crates/mio/0.6.17/download -> mio-0.6.17.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d8daa378c765417dbdbd9cf0be44b5ac
diff --git a/metadata/md5-cache/dev-rust/mio-extras-2.0.5 b/metadata/md5-cache/dev-rust/mio-extras-2.0.5
index 3669b62..af4fcaf 100644
--- a/metadata/md5-cache/dev-rust/mio-extras-2.0.5
+++ b/metadata/md5-cache/dev-rust/mio-extras-2.0.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty mio-extras crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.0.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/mio-uds-0.6.7 b/metadata/md5-cache/dev-rust/mio-uds-0.6.7
index 6f1c867..6634fbe 100644
--- a/metadata/md5-cache/dev-rust/mio-uds-0.6.7
+++ b/metadata/md5-cache/dev-rust/mio-uds-0.6.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/iovec-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/mio-0.6*:= =dev-rust/tempdir-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library for integrating Unix Domain Sockets with mio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.7/r0
 SRC_URI=https://crates.io/api/v1/crates/mio-uds/0.6.7/download -> mio-uds-0.6.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e18dc2fc4c55e84d4baa97998a35777f
diff --git a/metadata/md5-cache/dev-rust/miow-0.2.1 b/metadata/md5-cache/dev-rust/miow-0.2.1
index 5c728c2..336de2e 100644
--- a/metadata/md5-cache/dev-rust/miow-0.2.1
+++ b/metadata/md5-cache/dev-rust/miow-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/kernel32-sys-0.2*:= =dev-rust/net2-0.2*:= =dev-rust/winapi-0.2*:= =dev-rust/ws2_32-sys-0.2*:= =dev-rust/rand-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A zero overhead Windows I/O library focusing on IOCP and other async I/O features
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/miow/0.2.1/download -> miow-0.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=78961d5cb26fb286cd9440e6e968e52e
diff --git a/metadata/md5-cache/dev-rust/native-tls-0.2.3 b/metadata/md5-cache/dev-rust/native-tls-0.2.3
index 1099ad0..2acc482 100644
--- a/metadata/md5-cache/dev-rust/native-tls-0.2.3
+++ b/metadata/md5-cache/dev-rust/native-tls-0.2.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/lazy_static-1.0:= >=dev-rust/libc-0.2:= >=dev-rust/log-0.4.5:= >=dev-rust/openssl-0.10.15:= >=dev-rust/openssl-probe-0.1:= >=dev-rust/openssl-sys-0.9.30:= >=dev-rust/schannel-0.1.13:= >=dev-rust/security-framework-0.3.1:= >=dev-rust/security-framework-sys-0.3.1:= >=dev-rust/tempfile-3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An abstraction over platform-specific TLS implementations.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.3/r0
 SRC_URI=https://crates.io/api/v1/crates/native-tls/0.2.3/download -> native-tls-0.2.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=19c8e2915d3fcfd49a849331990d2a5a
diff --git a/metadata/md5-cache/dev-rust/net2-0.2.33 b/metadata/md5-cache/dev-rust/net2-0.2.33
index f93e795..6fa2e28 100644
--- a/metadata/md5-cache/dev-rust/net2-0.2.33
+++ b/metadata/md5-cache/dev-rust/net2-0.2.33
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/cfg-if-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Extensions to the standard library's networking types, proposed in RFC 1158
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.33/r0
 SRC_URI=https://crates.io/api/v1/crates/net2/0.2.33/download -> net2-0.2.33.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=eb5f024986bfa02b842da812edd2905c
diff --git a/metadata/md5-cache/dev-rust/nix-0.14.1 b/metadata/md5-cache/dev-rust/nix-0.14.1
index 70d9c33..ca2b1186c 100644
--- a/metadata/md5-cache/dev-rust/nix-0.14.1
+++ b/metadata/md5-cache/dev-rust/nix-0.14.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bitflags-1.0.0:= <dev-rust/bitflags-2.0.0 >=dev-rust/cfg-if-0.1.2:= <dev-rust/cfg-if-0.2.0 >=dev-rust/libc-0.2.60:= <dev-rust/libc-3.0.0 >=dev-rust/void-1.0.2:= <dev-rust/void-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust friendly bindings to *nix APIs.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.14.1/r0
 SRC_URI=https://crates.io/api/v1/crates/nix/0.14.1/download -> nix-0.14.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=041cd24ab3719c99d1fe8bb82aeedff5
diff --git a/metadata/md5-cache/dev-rust/no-panic-0.1.0 b/metadata/md5-cache/dev-rust/no-panic-0.1.0
index 0edee2f..0ddceb6 100644
--- a/metadata/md5-cache/dev-rust/no-panic-0.1.0
+++ b/metadata/md5-cache/dev-rust/no-panic-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty no-panic crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/no-panic-0.1.10 b/metadata/md5-cache/dev-rust/no-panic-0.1.10
index e295ade..89f3d95 100644
--- a/metadata/md5-cache/dev-rust/no-panic-0.1.10
+++ b/metadata/md5-cache/dev-rust/no-panic-0.1.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-0.4*:= =dev-rust/quote-0.6*:= =dev-rust/syn-0.15*:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust attribute macro to require that the compiler prove a function can't ever panic.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.10/r0
 SRC_URI=https://crates.io/api/v1/crates/no-panic/0.1.10/download -> no-panic-0.1.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1d34483184bb9f4a5d5ea9a00acbc7e3
diff --git a/metadata/md5-cache/dev-rust/nodrop-0.1.13 b/metadata/md5-cache/dev-rust/nodrop-0.1.13
index db4a40b..065e8c7 100644
--- a/metadata/md5-cache/dev-rust/nodrop-0.1.13
+++ b/metadata/md5-cache/dev-rust/nodrop-0.1.13
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/nodrop-union-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A wrapper type to inhibit drop (destructor)
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.13/r0
 SRC_URI=https://crates.io/api/v1/crates/nodrop/0.1.13/download -> nodrop-0.1.13.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f5c7565a04faf35ccae24885d0a1c357
diff --git a/metadata/md5-cache/dev-rust/nodrop-union-0.1.10 b/metadata/md5-cache/dev-rust/nodrop-union-0.1.10
index 71ca48c..ecdeb88 100644
--- a/metadata/md5-cache/dev-rust/nodrop-union-0.1.10
+++ b/metadata/md5-cache/dev-rust/nodrop-union-0.1.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A wrapper type to inhibit drop (destructor)
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.10/r0
 SRC_URI=https://crates.io/api/v1/crates/nodrop-union/0.1.10/download -> nodrop-union-0.1.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d10a1446898e31b59890b54476b178ad
diff --git a/metadata/md5-cache/dev-rust/num-integer-0.1.38 b/metadata/md5-cache/dev-rust/num-integer-0.1.38
index 25aa5ca..27eb928 100644
--- a/metadata/md5-cache/dev-rust/num-integer-0.1.38
+++ b/metadata/md5-cache/dev-rust/num-integer-0.1.38
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/num-traits-0.2.4:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Integer trait and functions for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.38/r0
 SRC_URI=https://crates.io/api/v1/crates/num-integer/0.1.38/download -> num-integer-0.1.38.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6627d63ba545f841f78d6c38f49048c6
diff --git a/metadata/md5-cache/dev-rust/num-iter-0.1.37 b/metadata/md5-cache/dev-rust/num-iter-0.1.37
index abc5689..7e9ccd1 100644
--- a/metadata/md5-cache/dev-rust/num-iter-0.1.37
+++ b/metadata/md5-cache/dev-rust/num-iter-0.1.37
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty num-iter crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.37/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/num-traits-0.2.4 b/metadata/md5-cache/dev-rust/num-traits-0.2.4
index fefc967..ffde881 100644
--- a/metadata/md5-cache/dev-rust/num-traits-0.2.4
+++ b/metadata/md5-cache/dev-rust/num-traits-0.2.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Numeric traits for generic mathematics in Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.4/r0
 SRC_URI=https://crates.io/api/v1/crates/num-traits/0.2.4/download -> num-traits-0.2.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a0faad407b9562ee8e18cfbab21dff7e
diff --git a/metadata/md5-cache/dev-rust/num_cpus-1.9.0 b/metadata/md5-cache/dev-rust/num_cpus-1.9.0
index 8b7ff68..7dd1802 100644
--- a/metadata/md5-cache/dev-rust/num_cpus-1.9.0
+++ b/metadata/md5-cache/dev-rust/num_cpus-1.9.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/libc-0.2.26:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Get the number of CPUs on a machine
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.9.0/r0
 SRC_URI=https://crates.io/api/v1/crates/num_cpus/1.9.0/download -> num_cpus-1.9.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=224962b00facb57ee87a8dc81e32d7d4
diff --git a/metadata/md5-cache/dev-rust/num_enum-0.5.0 b/metadata/md5-cache/dev-rust/num_enum-0.5.0
new file mode 100644
index 0000000..80d3271
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/num_enum-0.5.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/derivative-2*:= =dev-rust/num_enum_derive-0.5*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Procedural macros to make inter-operation between primitives and enums easier.
+EAPI=7
+HOMEPAGE=https://github.com/illicitonion/num_enum
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.5.0/r0
+SRC_URI=https://crates.io/api/v1/crates/num_enum/0.5.0/download -> num_enum-0.5.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9eab14a0c68bbee3d56ce6351ac458a3
diff --git a/metadata/md5-cache/dev-rust/num_enum_derive-0.5.0 b/metadata/md5-cache/dev-rust/num_enum_derive-0.5.0
new file mode 100644
index 0000000..03c0e26
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/num_enum_derive-0.5.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/proc-macro-crate-0.1.4:= <dev-rust/proc-macro-crate-0.2 =dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)
+EAPI=7
+HOMEPAGE=https://github.com/illicitonion/num_enum
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.5.0/r0
+SRC_URI=https://crates.io/api/v1/crates/num_enum_derive/0.5.0/download -> num_enum_derive-0.5.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=81df469908e9d23b1c17757f2fbafd78
diff --git a/metadata/md5-cache/dev-rust/object-0.7.0 b/metadata/md5-cache/dev-rust/object-0.7.0
index 74515c4..a17ceed 100644
--- a/metadata/md5-cache/dev-rust/object-0.7.0
+++ b/metadata/md5-cache/dev-rust/object-0.7.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty object crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/openssl-0.10.22 b/metadata/md5-cache/dev-rust/openssl-0.10.22
index 4075333..d04707f 100644
--- a/metadata/md5-cache/dev-rust/openssl-0.10.22
+++ b/metadata/md5-cache/dev-rust/openssl-0.10.22
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty openssl crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.10.22/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/openssl-0.10.25 b/metadata/md5-cache/dev-rust/openssl-0.10.25
index 0652457..c3e602f 100644
--- a/metadata/md5-cache/dev-rust/openssl-0.10.25
+++ b/metadata/md5-cache/dev-rust/openssl-0.10.25
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bitflags-1.0:= >=dev-rust/cfg-if-0.1:= >=dev-rust/foreign-types-0.3.1:= >=dev-rust/lazy_static-1.0:= >=dev-rust/libc-0.2:= >=dev-rust/openssl-sys-0.9.50:= >=virtual/rust-1.39.0:=
 DESCRIPTION=OpenSSL bindings for the Rust programming language.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.10.25/r0
 SRC_URI=https://crates.io/api/v1/crates/openssl/0.10.25/download -> openssl-0.10.25.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=21c3269f764c5746aa10eee90f0d014e
diff --git a/metadata/md5-cache/dev-rust/openssl-probe-0.1.2 b/metadata/md5-cache/dev-rust/openssl-probe-0.1.2
index 58612ab..0f632aa 100644
--- a/metadata/md5-cache/dev-rust/openssl-probe-0.1.2
+++ b/metadata/md5-cache/dev-rust/openssl-probe-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Tool for helping to find SSL certificate locations on the system for OpenSSL
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/openssl-probe/0.1.2/download -> openssl-probe-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5dc9ec963925ec082a28a282f951e96f
diff --git a/metadata/md5-cache/dev-rust/openssl-src-111.0.1 b/metadata/md5-cache/dev-rust/openssl-src-111.0.1
index d10e73b..35363cb 100644
--- a/metadata/md5-cache/dev-rust/openssl-src-111.0.1
+++ b/metadata/md5-cache/dev-rust/openssl-src-111.0.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty openssl-src crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=111.0.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/openssl-sys-0.9.47 b/metadata/md5-cache/dev-rust/openssl-sys-0.9.47
index e9b7147..e7add70 100644
--- a/metadata/md5-cache/dev-rust/openssl-sys-0.9.47
+++ b/metadata/md5-cache/dev-rust/openssl-sys-0.9.47
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/autocfg-0.1.2:= >=dev-rust/cc-1.0:= >=dev-rust/libc-0.2:= >=dev-rust/pkg-config-0.3.9:= >=dev-rust/vcpkg-0.2:= >=dev-rust/openssl-src-111.0.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=OpenSSL bindings for the Rust programming language.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.9.47/r0
 SRC_URI=https://crates.io/api/v1/crates/openssl-sys/0.9.47/download -> openssl-sys-0.9.47.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8cdcb904a67f89112cb861c6c0006e58
diff --git a/metadata/md5-cache/dev-rust/openssl-sys-0.9.52 b/metadata/md5-cache/dev-rust/openssl-sys-0.9.52
index 1f74a23..b46798c 100644
--- a/metadata/md5-cache/dev-rust/openssl-sys-0.9.52
+++ b/metadata/md5-cache/dev-rust/openssl-sys-0.9.52
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/autocfg-0.1.2:= >=dev-rust/cc-1.0:= >=dev-rust/libc-0.2:= >=dev-rust/pkg-config-0.3.9:= >=dev-rust/vcpkg-0.2:= >=dev-rust/openssl-src-111.0.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=OpenSSL bindings for the Rust programming language.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.9.52/r0
 SRC_URI=https://crates.io/api/v1/crates/openssl-sys/0.9.52/download -> openssl-sys-0.9.52.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8cdcb904a67f89112cb861c6c0006e58
diff --git a/metadata/md5-cache/dev-rust/owning_ref-0.3.3 b/metadata/md5-cache/dev-rust/owning_ref-0.3.3
index 2d4995f..66cfb53 100644
--- a/metadata/md5-cache/dev-rust/owning_ref-0.3.3
+++ b/metadata/md5-cache/dev-rust/owning_ref-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/stable_deref_trait-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library for creating references that carry their owner with them.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
 SRC_URI=https://crates.io/api/v1/crates/owning_ref/0.3.3/download -> owning_ref-0.3.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f5a7d0de4978f44d7d84a95bc0b72ccd
diff --git a/metadata/md5-cache/dev-rust/owning_ref-0.4.0 b/metadata/md5-cache/dev-rust/owning_ref-0.4.0
index 28acc2a..df70fa5 100644
--- a/metadata/md5-cache/dev-rust/owning_ref-0.4.0
+++ b/metadata/md5-cache/dev-rust/owning_ref-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/stable_deref_trait-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library for creating references that carry their owner with them.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/owning_ref/0.4.0/download -> owning_ref-0.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f5a7d0de4978f44d7d84a95bc0b72ccd
diff --git a/metadata/md5-cache/dev-rust/p9-0.1.0-r19 b/metadata/md5-cache/dev-rust/p9-0.1.0-r19
deleted file mode 100644
index 43e1afb..0000000
--- a/metadata/md5-cache/dev-rust/p9-0.1.0-r19
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/libc:= =dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= fuzzer? ( dev-rust/cros_fuzz:= ) >=virtual/rust-1.39.0:=
-DESCRIPTION=Server implementation of the 9P file system protocol
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/p9/
-IUSE=fuzzer test fuzzer cros_host cros_workon_tree_e8f9fadf8cbdbb56a1ba7a761cdfbcee69ddf3b0 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/p9-0.1.0-r14
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r19
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3d730f7de5c7a437519baf1fd2c170e4
diff --git a/metadata/md5-cache/dev-rust/p9-0.1.0-r24 b/metadata/md5-cache/dev-rust/p9-0.1.0-r24
new file mode 100644
index 0000000..e6a2a3f
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/p9-0.1.0-r24
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/libc:= =dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= fuzzer? ( dev-rust/cros_fuzz:= ) >=virtual/rust-1.39.0:=
+DESCRIPTION=Server implementation of the 9P file system protocol
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/p9/
+IUSE=fuzzer test fuzzer cros_host cros_workon_tree_bd9f3415406a689221fa329b5e367075c6579fae cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/p9-0.1.0-r14
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r24
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=589fc9c532a6611792ee029261cb5045
diff --git a/metadata/md5-cache/dev-rust/p9-9999 b/metadata/md5-cache/dev-rust/p9-9999
index 1152fa0..4056e4f 100644
--- a/metadata/md5-cache/dev-rust/p9-9999
+++ b/metadata/md5-cache/dev-rust/p9-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/p9-0.1.0-r14
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e4f6d1091d5d91173fae129153e2459f
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9c356d2aad2bba5dd605d7a397915742
diff --git a/metadata/md5-cache/dev-rust/parking_lot-0.4.8 b/metadata/md5-cache/dev-rust/parking_lot-0.4.8
index 8599c05..4457112 100644
--- a/metadata/md5-cache/dev-rust/parking_lot-0.4.8
+++ b/metadata/md5-cache/dev-rust/parking_lot-0.4.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/parking_lot_core-0.2*:= =dev-rust/owning_ref-0.3*:= =dev-rust/rand-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This library provides implementations of Mutex, RwLock, Condvar and Once that are smaller, faster and more flexible than those in the Rust standard library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.8/r0
 SRC_URI=https://crates.io/api/v1/crates/parking_lot/0.4.8/download -> parking_lot-0.4.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9e2b57db1ed32e88122130d0eee73cd0
diff --git a/metadata/md5-cache/dev-rust/parking_lot-0.7.1 b/metadata/md5-cache/dev-rust/parking_lot-0.7.1
index 7df8bea..d243adc 100644
--- a/metadata/md5-cache/dev-rust/parking_lot-0.7.1
+++ b/metadata/md5-cache/dev-rust/parking_lot-0.7.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/lock_api-0.1*:= =dev-rust/parking_lot_core-0.4*:= =dev-rust/rand-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This library provides implementations of Mutex, RwLock, Condvar and Once that are smaller, faster and more flexible than those in the Rust standard library
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.1/r0
 SRC_URI=https://crates.io/api/v1/crates/parking_lot/0.7.1/download -> parking_lot-0.7.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=47218be234a3aee45b91d8af08284b52
diff --git a/metadata/md5-cache/dev-rust/parking_lot_core-0.2.14 b/metadata/md5-cache/dev-rust/parking_lot_core-0.2.14
index a378a44..fc0b4dd 100644
--- a/metadata/md5-cache/dev-rust/parking_lot_core-0.2.14
+++ b/metadata/md5-cache/dev-rust/parking_lot_core-0.2.14
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/libc-0.2*:= =dev-rust/rand-0.4*:= =dev-rust/smallvec-0.6*:= =dev-rust/winapi-0.3*:= =dev-rust/backtrace-0.3*:= =dev-rust/petgraph-0.4*:= =dev-rust/thread-id-3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An advanced API for creating custom synchronization primitives
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.14/r0
 SRC_URI=https://crates.io/api/v1/crates/parking_lot_core/0.2.14/download -> parking_lot_core-0.2.14.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9cf15821da22079f260243f9df8ecea9
diff --git a/metadata/md5-cache/dev-rust/parking_lot_core-0.4.0 b/metadata/md5-cache/dev-rust/parking_lot_core-0.4.0
index 91c4158..f6abd16 100644
--- a/metadata/md5-cache/dev-rust/parking_lot_core-0.4.0
+++ b/metadata/md5-cache/dev-rust/parking_lot_core-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/libc-0.2*:= =dev-rust/rand-0.6*:= =dev-rust/rustc_version-0.2*:= =dev-rust/smallvec-0.6*:= =dev-rust/winapi-0.3*:= =dev-rust/backtrace-0.3*:= =dev-rust/petgraph-0.4*:= =dev-rust/thread-id-3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An advanced API for creating custom synchronization primitives
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/parking_lot_core/0.4.0/download -> parking_lot_core-0.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5a631ab0601fac654a40586c64adaa29
diff --git a/metadata/md5-cache/dev-rust/paste-0.1.6 b/metadata/md5-cache/dev-rust/paste-0.1.6
index 26198fb..41ee119 100644
--- a/metadata/md5-cache/dev-rust/paste-0.1.6
+++ b/metadata/md5-cache/dev-rust/paste-0.1.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro-hack-0.5*:= ~dev-rust/paste-impl-0.1.6:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Macros for all your token pasting needs
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.6/r0
 SRC_URI=https://crates.io/api/v1/crates/paste/0.1.6/download -> paste-0.1.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=551c00cb500a1e377b9b6388dc3ef550
diff --git a/metadata/md5-cache/dev-rust/paste-impl-0.1.6 b/metadata/md5-cache/dev-rust/paste-impl-0.1.6
index e815849..c24265e 100644
--- a/metadata/md5-cache/dev-rust/paste-impl-0.1.6
+++ b/metadata/md5-cache/dev-rust/paste-impl-0.1.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/proc-macro-hack-0.5*:= =dev-rust/syn-1*:= =dev-rust/quote-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Macros for all your token pasting needs
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.6/r0
 SRC_URI=https://crates.io/api/v1/crates/paste-impl/0.1.6/download -> paste-impl-0.1.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2dfd00874f78b86885c0d75f6505a2a9
diff --git a/metadata/md5-cache/dev-rust/percent-encoding-1.0.1 b/metadata/md5-cache/dev-rust/percent-encoding-1.0.1
index 2fc4651..a59c23f 100644
--- a/metadata/md5-cache/dev-rust/percent-encoding-1.0.1
+++ b/metadata/md5-cache/dev-rust/percent-encoding-1.0.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Percent encoding and decoding
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.1/r0
 SRC_URI=https://crates.io/api/v1/crates/percent-encoding/1.0.1/download -> percent-encoding-1.0.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=214b88bd705c706a0f78ce4e2cf12b8a
diff --git a/metadata/md5-cache/dev-rust/petgraph-0.4.13 b/metadata/md5-cache/dev-rust/petgraph-0.4.13
index 5d31f83..f5daa08 100644
--- a/metadata/md5-cache/dev-rust/petgraph-0.4.13
+++ b/metadata/md5-cache/dev-rust/petgraph-0.4.13
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty petgraph crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.13/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/pin-utils-0.1.0_alpha4 b/metadata/md5-cache/dev-rust/pin-utils-0.1.0_alpha4
index ae0921f..3c40aa8 100644
--- a/metadata/md5-cache/dev-rust/pin-utils-0.1.0_alpha4
+++ b/metadata/md5-cache/dev-rust/pin-utils-0.1.0_alpha4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Utilities for pinning
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0_alpha4/r0
 SRC_URI=https://crates.io/api/v1/crates/pin-utils/pin-utils-0.1.0-alpha.4/download -> pin-utils-0.1.0-alpha.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4cc59a4086074b1fbd38522ca21881f7
diff --git a/metadata/md5-cache/dev-rust/pkg-config-0.3.11-r2 b/metadata/md5-cache/dev-rust/pkg-config-0.3.11-r2
index 947b991..177384e 100644
--- a/metadata/md5-cache/dev-rust/pkg-config-0.3.11-r2
+++ b/metadata/md5-cache/dev-rust/pkg-config-0.3.11-r2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/lazy_static-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library to run the pkg-config system tool at build time in order to be used in Cargo build scripts
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.11/r2
 SRC_URI=https://crates.io/api/v1/crates/pkg-config/0.3.11/download -> pkg-config-0.3.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2c4f48112c1961eb2089f372e114eae7
diff --git a/metadata/md5-cache/dev-rust/proc-macro-crate-0.1.5 b/metadata/md5-cache/dev-rust/proc-macro-crate-0.1.5
new file mode 100644
index 0000000..32ac1a7
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/proc-macro-crate-0.1.5
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/toml-0.5*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Replacement for crate (macro_rules keyword) in proc-macros.
+EAPI=7
+HOMEPAGE=https://github.com/bkchr/proc-macro-crate
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.1.5/r0
+SRC_URI=https://crates.io/api/v1/crates/proc-macro-crate/0.1.5/download -> proc-macro-crate-0.1.5.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7f24e5c241b5192874591a943def6571
diff --git a/metadata/md5-cache/dev-rust/proc-macro-hack-0.5.11 b/metadata/md5-cache/dev-rust/proc-macro-hack-0.5.11
index 9e3d2a3..a192de3 100644
--- a/metadata/md5-cache/dev-rust/proc-macro-hack-0.5.11
+++ b/metadata/md5-cache/dev-rust/proc-macro-hack-0.5.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= >=dev-rust/syn-1.0.5:= <dev-rust/syn-2 >=virtual/rust-1.39.0:=
 DESCRIPTION=Procedural macros in expression position
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.11/r0
 SRC_URI=https://crates.io/api/v1/crates/proc-macro-hack/0.5.11/download -> proc-macro-hack-0.5.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c8272d83e9ad0d704e531a888525d2e6
diff --git a/metadata/md5-cache/dev-rust/proc-macro-nested-0.1.3 b/metadata/md5-cache/dev-rust/proc-macro-nested-0.1.3
index d7910be..3606e5c 100644
--- a/metadata/md5-cache/dev-rust/proc-macro-nested-0.1.3
+++ b/metadata/md5-cache/dev-rust/proc-macro-nested-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Support for nested proc-macro-hack invocations
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/proc-macro-nested/0.1.3/download -> proc-macro-nested-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=38bd84c1b11f7b578f41008d5407c0da
diff --git a/metadata/md5-cache/dev-rust/proc-macro2-0.4.21 b/metadata/md5-cache/dev-rust/proc-macro2-0.4.21
index 38efbb8..cb31674 100644
--- a/metadata/md5-cache/dev-rust/proc-macro2-0.4.21
+++ b/metadata/md5-cache/dev-rust/proc-macro2-0.4.21
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/unicode-xid-0.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Stable implemntation of the upcoming 'proc_macro' API
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.21/r0
 SRC_URI=https://crates.io/api/v1/crates/proc-macro2/0.4.21/download -> proc-macro2-0.4.21.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e1e3eef5f89119558c2d40f4d98832f0
diff --git a/metadata/md5-cache/dev-rust/proc-macro2-1.0.19 b/metadata/md5-cache/dev-rust/proc-macro2-1.0.19
new file mode 100644
index 0000000..861167e
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/proc-macro2-1.0.19
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/unicode-xid-0.2*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Stable implemntation of the upcoming 'proc_macro' API
+EAPI=7
+HOMEPAGE=https://github.com/alexcrichton/proc-macro2
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.19/r0
+SRC_URI=https://crates.io/api/v1/crates/proc-macro2/1.0.19/download -> proc-macro2-1.0.19.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c928dbce7c62ffe4c2b70b394ef6d4cd
diff --git a/metadata/md5-cache/dev-rust/proc-macro2-1.0.8 b/metadata/md5-cache/dev-rust/proc-macro2-1.0.8
deleted file mode 100644
index 1adfed3..0000000
--- a/metadata/md5-cache/dev-rust/proc-macro2-1.0.8
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/unicode-xid-0.2*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Stable implemntation of the upcoming 'proc_macro' API
-EAPI=6
-HOMEPAGE=https://github.com/alexcrichton/proc-macro2
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.0.8/r0
-SRC_URI=https://crates.io/api/v1/crates/proc-macro2/1.0.8/download -> proc-macro2-1.0.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cc97c8e35a3df92f125b51f05487f66a
diff --git a/metadata/md5-cache/dev-rust/protobuf-1.4.3 b/metadata/md5-cache/dev-rust/protobuf-1.4.3
deleted file mode 100644
index c59a623..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-1.4.3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/bytes-0.4.11:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust implementation of Google protocol buffers
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.4.3/r0
-SRC_URI=https://crates.io/api/v1/crates/protobuf/1.4.3/download -> protobuf-1.4.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f72e9f9356958befa83faea37b829f75
diff --git a/metadata/md5-cache/dev-rust/protobuf-2.16.2 b/metadata/md5-cache/dev-rust/protobuf-2.16.2
new file mode 100644
index 0000000..546a38d
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/protobuf-2.16.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/bytes-0.5*:= =dev-rust/serde-1*:= =dev-rust/serde_derive-1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust implementation of Google protocol buffers
+EAPI=7
+HOMEPAGE=https://github.com/stepancheg/rust-protobuf/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=2.16.2/r0
+SRC_URI=https://crates.io/api/v1/crates/protobuf/2.16.2/download -> protobuf-2.16.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ce36163e820e9be114e6687050cb8a32
diff --git a/metadata/md5-cache/dev-rust/protobuf-2.3.0 b/metadata/md5-cache/dev-rust/protobuf-2.3.0
deleted file mode 100644
index 4e2678b..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-2.3.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/bytes-0.4*:= =dev-rust/serde-1.0*:= =dev-rust/serde_derive-1.0*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust implementation of Google protocol buffers
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r0
-SRC_URI=https://crates.io/api/v1/crates/protobuf/2.3.0/download -> protobuf-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f20cb98da6ee946ef3e553e8e78c9c50
diff --git a/metadata/md5-cache/dev-rust/protobuf-2.8.1 b/metadata/md5-cache/dev-rust/protobuf-2.8.1
deleted file mode 100644
index 2830d89..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-2.8.1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/bytes-0.4*:= =dev-rust/serde-1.0*:= =dev-rust/serde_derive-1.0*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust implementation of Google protocol buffers
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=!dev-rust/protobuf:2.3.0
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/2.8.1
-SRC_URI=https://crates.io/api/v1/crates/protobuf/2.8.1/download -> protobuf-2.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b36dbfd4794a660bc1efc909d22d811e
diff --git a/metadata/md5-cache/dev-rust/protobuf-codegen-2.16.2 b/metadata/md5-cache/dev-rust/protobuf-codegen-2.16.2
new file mode 100644
index 0000000..fb7af02
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/protobuf-codegen-2.16.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install postinst prepare prerm setup unpack
+DEPEND=~dev-rust/protobuf-2.16.2:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Protobuf code generator and a protoc-gen-rust protoc plugin
+EAPI=7
+HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protobuf-codegen
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/2.16.2
+SRC_URI=https://crates.io/api/v1/crates/protobuf-codegen/2.16.2/download -> protobuf-codegen-2.16.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5fc6eb40ddc258c40ba9e9332f6547c7
diff --git a/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0 b/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0
deleted file mode 100644
index 1e704d9..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.3.0:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf code generator and a protoc-gen-rust protoc plugin
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protobuf-codegen
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r0
-SRC_URI=https://crates.io/api/v1/crates/protobuf-codegen/2.3.0/download -> protobuf-codegen-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9de7490b6c97ecc7c8314c2ec3a9ae3e
diff --git a/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0-r1 b/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0-r1
deleted file mode 100644
index 784db47..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-codegen-2.3.0-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.3.0:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf code generator and a protoc-gen-rust protoc plugin
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protobuf-codegen
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r1
-SRC_URI=https://crates.io/api/v1/crates/protobuf-codegen/2.3.0/download -> protobuf-codegen-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9de7490b6c97ecc7c8314c2ec3a9ae3e
diff --git a/metadata/md5-cache/dev-rust/protobuf-codegen-2.8.1 b/metadata/md5-cache/dev-rust/protobuf-codegen-2.8.1
deleted file mode 100644
index 6975b2c..0000000
--- a/metadata/md5-cache/dev-rust/protobuf-codegen-2.8.1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.8.1:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf code generator and a protoc-gen-rust protoc plugin
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protobuf-codegen
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=!dev-rust/protobuf-codegen:2.3.0
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/2.8.1
-SRC_URI=https://crates.io/api/v1/crates/protobuf-codegen/2.8.1/download -> protobuf-codegen-2.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=dc7fbcd3acbd61adc0d9397155d08ad0
diff --git a/metadata/md5-cache/dev-rust/protoc-1.4.3 b/metadata/md5-cache/dev-rust/protoc-1.4.3
deleted file mode 100644
index a6b9b91..0000000
--- a/metadata/md5-cache/dev-rust/protoc-1.4.3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/log-0.4.5:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf protoc command as API
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.4.3/r0
-SRC_URI=https://crates.io/api/v1/crates/protoc/1.4.3/download -> protoc-1.4.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c8c9ed8e4508dd4c68ecb4718d3b36e
diff --git a/metadata/md5-cache/dev-rust/protoc-2.16.2 b/metadata/md5-cache/dev-rust/protoc-2.16.2
new file mode 100644
index 0000000..f8d173b
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/protoc-2.16.2
@@ -0,0 +1,14 @@
+BDEPEND=dev-libs/protobuf
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/log-0*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Protobuf protoc command as API
+EAPI=7
+HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=2.16.2/r0
+SRC_URI=https://crates.io/api/v1/crates/protoc/2.16.2/download -> protoc-2.16.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b27e5b44f309365eb4e7e0dfb005eb3c
diff --git a/metadata/md5-cache/dev-rust/protoc-2.3.0 b/metadata/md5-cache/dev-rust/protoc-2.3.0
deleted file mode 100644
index 919175a6..0000000
--- a/metadata/md5-cache/dev-rust/protoc-2.3.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/log-0*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf protoc command as API
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r0
-SRC_URI=https://crates.io/api/v1/crates/protoc/2.3.0/download -> protoc-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0cc4f61e6df3281f694cc1673838045c
diff --git a/metadata/md5-cache/dev-rust/protoc-2.8.1 b/metadata/md5-cache/dev-rust/protoc-2.8.1
deleted file mode 100644
index 389fffa..0000000
--- a/metadata/md5-cache/dev-rust/protoc-2.8.1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/log-0*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Protobuf protoc command as API
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=!dev-rust/protoc:2.3.0
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/2.8.1
-SRC_URI=https://crates.io/api/v1/crates/protoc/2.8.1/download -> protoc-2.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=660ebc7cc42b60d605edef1ea50643fd
diff --git a/metadata/md5-cache/dev-rust/protoc-rust-1.4.3 b/metadata/md5-cache/dev-rust/protoc-rust-1.4.3
deleted file mode 100644
index 0b9b050..0000000
--- a/metadata/md5-cache/dev-rust/protoc-rust-1.4.3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-1.4.3:= ~dev-rust/protoc-1.4.3:= ~dev-rust/tempdir-0.3.7:= >=virtual/rust-1.39.0:=
-DESCRIPTION=protoc --rust_out=... available as API. protoc needs to be in /dev/null, protoc-gen-run does not
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc-rust/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.4.3/r0
-SRC_URI=https://crates.io/api/v1/crates/protoc-rust/1.4.3/download -> protoc-rust-1.4.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7bb75f7fb65be7f7e5298f23c75ea06d
diff --git a/metadata/md5-cache/dev-rust/protoc-rust-2.16.2 b/metadata/md5-cache/dev-rust/protoc-rust-2.16.2
new file mode 100644
index 0000000..2a842f1
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/protoc-rust-2.16.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=~dev-rust/protobuf-2.16.2:= ~dev-rust/protobuf-codegen-2.16.2:= ~dev-rust/protoc-2.16.2:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=protoc --rust_out=... available as API.
+EAPI=7
+HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc-rust/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/2.16.2
+SRC_URI=https://crates.io/api/v1/crates/protoc-rust/2.16.2/download -> protoc-rust-2.16.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4c473cf8ed09e65216463aa22bad059d
diff --git a/metadata/md5-cache/dev-rust/protoc-rust-2.3.0 b/metadata/md5-cache/dev-rust/protoc-rust-2.3.0
deleted file mode 100644
index 314960e..0000000
--- a/metadata/md5-cache/dev-rust/protoc-rust-2.3.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.3.0:= ~dev-rust/protobuf-codegen-2.3.0:= ~dev-rust/protoc-2.3.0:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
-DESCRIPTION=protoc --rust_out=... available as API. protoc needs to be in /dev/null, protoc-gen-run does not
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc-rust/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r0
-SRC_URI=https://crates.io/api/v1/crates/protoc-rust/2.3.0/download -> protoc-rust-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a2f479d39c9fbe02211c650aab8da6ff
diff --git a/metadata/md5-cache/dev-rust/protoc-rust-2.3.0-r1 b/metadata/md5-cache/dev-rust/protoc-rust-2.3.0-r1
deleted file mode 100644
index 90e2d10..0000000
--- a/metadata/md5-cache/dev-rust/protoc-rust-2.3.0-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.3.0:= ~dev-rust/protobuf-codegen-2.3.0:= ~dev-rust/protoc-2.3.0:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
-DESCRIPTION=protoc --rust_out=... available as API. protoc needs to be in /dev/null, protoc-gen-run does not
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc-rust/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=2.3.0/r1
-SRC_URI=https://crates.io/api/v1/crates/protoc-rust/2.3.0/download -> protoc-rust-2.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a2f479d39c9fbe02211c650aab8da6ff
diff --git a/metadata/md5-cache/dev-rust/protoc-rust-2.8.1 b/metadata/md5-cache/dev-rust/protoc-rust-2.8.1
deleted file mode 100644
index f4a628b..0000000
--- a/metadata/md5-cache/dev-rust/protoc-rust-2.8.1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=~dev-rust/protobuf-2.8.1:= ~dev-rust/protobuf-codegen-2.8.1:= ~dev-rust/protoc-2.8.1:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
-DESCRIPTION=protoc --rust_out=... available as API.
-EAPI=6
-HOMEPAGE=https://github.com/stepancheg/rust-protobuf/protoc-rust/
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=!dev-rust/protoc-rust:2.3.0
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/2.8.1
-SRC_URI=https://crates.io/api/v1/crates/protoc-rust/2.8.1/download -> protoc-rust-2.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ea1b263174ebb2faff81688e9e9ae156
diff --git a/metadata/md5-cache/dev-rust/quick-error-1.2.1 b/metadata/md5-cache/dev-rust/quick-error-1.2.1
index 27e62cf..b80a9b6 100644
--- a/metadata/md5-cache/dev-rust/quick-error-1.2.1
+++ b/metadata/md5-cache/dev-rust/quick-error-1.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A macro which makes error types pleasant to write.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/quick-error/1.2.1/download -> quick-error-1.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=54fca8389b6f482052cf4e7ff4951365
diff --git a/metadata/md5-cache/dev-rust/quickcheck-0.4.2 b/metadata/md5-cache/dev-rust/quickcheck-0.4.2
index ac4580a..13dd811 100644
--- a/metadata/md5-cache/dev-rust/quickcheck-0.4.2
+++ b/metadata/md5-cache/dev-rust/quickcheck-0.4.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty quickcheck crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Unlicense )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9321147df1848c51f3451667c55cf85d
diff --git a/metadata/md5-cache/dev-rust/quickcheck-0.6.2 b/metadata/md5-cache/dev-rust/quickcheck-0.6.2
index fdc8f54..c61ff8a 100644
--- a/metadata/md5-cache/dev-rust/quickcheck-0.6.2
+++ b/metadata/md5-cache/dev-rust/quickcheck-0.6.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty quickcheck crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Unlicense )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7b9619320573e8d34437d07ff1296f9a
diff --git a/metadata/md5-cache/dev-rust/quickcheck-0.8.2 b/metadata/md5-cache/dev-rust/quickcheck-0.8.2
index 1be10a3..fc60f76 100644
--- a/metadata/md5-cache/dev-rust/quickcheck-0.8.2
+++ b/metadata/md5-cache/dev-rust/quickcheck-0.8.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/rand-0.6.5:= =dev-rust/rand_core-0.4*:= =dev-rust/env_logger-0.6*:= =dev-rust/log-0.4*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=QuickCheck is a way to do property based testing using randomly generated input
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.2/r0
 SRC_URI=https://crates.io/api/v1/crates/quickcheck/0.8.2/download -> quickcheck-0.8.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fcb8c4008a193740ee8e6f7311bf60cc
diff --git a/metadata/md5-cache/dev-rust/quote-0.6.10 b/metadata/md5-cache/dev-rust/quote-0.6.10
index 4627086..4a497c85 100644
--- a/metadata/md5-cache/dev-rust/quote-0.6.10
+++ b/metadata/md5-cache/dev-rust/quote-0.6.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/proc-macro2-0.4.21:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Quasi-quoting macro quote!(...)
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.10/r0
 SRC_URI=https://crates.io/api/v1/crates/quote/0.6.10/download -> quote-0.6.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3dee3a77039946501509f7f7a124b0c7
diff --git a/metadata/md5-cache/dev-rust/quote-1.0.2 b/metadata/md5-cache/dev-rust/quote-1.0.2
index cd78cf8..0159813 100644
--- a/metadata/md5-cache/dev-rust/quote-1.0.2
+++ b/metadata/md5-cache/dev-rust/quote-1.0.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Quasi-quoting macro quote!(...)
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.2/r0
 SRC_URI=https://crates.io/api/v1/crates/quote/1.0.2/download -> quote-1.0.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=aa67189dd307244bb8cf0bb496432772
diff --git a/metadata/md5-cache/dev-rust/rand-0.3.20 b/metadata/md5-cache/dev-rust/rand-0.3.20
index d5a6b15..16b270d 100644
--- a/metadata/md5-cache/dev-rust/rand-0.3.20
+++ b/metadata/md5-cache/dev-rust/rand-0.3.20
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rand crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.20/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6a6f95690def37edad390c266623a6bc
diff --git a/metadata/md5-cache/dev-rust/rand-0.4.2 b/metadata/md5-cache/dev-rust/rand-0.4.2
index 9bfa136..b26459e 100644
--- a/metadata/md5-cache/dev-rust/rand-0.4.2
+++ b/metadata/md5-cache/dev-rust/rand-0.4.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/fuchsia-zircon-0.3.2:= >=dev-rust/winapi-0.3.0:= >=dev-rust/libc-0.2.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library for random number generation.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r0
 SRC_URI=https://crates.io/api/v1/crates/rand/0.4.2/download -> rand-0.4.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=dfadb403bbd9a94139f79895e97bc5df
diff --git a/metadata/md5-cache/dev-rust/rand-0.5.6 b/metadata/md5-cache/dev-rust/rand-0.5.6
index ad37074..95cf4c9 100644
--- a/metadata/md5-cache/dev-rust/rand-0.5.6
+++ b/metadata/md5-cache/dev-rust/rand-0.5.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rand crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.6/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/rand-0.6.5 b/metadata/md5-cache/dev-rust/rand-0.6.5
index ffbc8e8..cea7526 100644
--- a/metadata/md5-cache/dev-rust/rand-0.6.5
+++ b/metadata/md5-cache/dev-rust/rand-0.6.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/autocfg-0.1*:= >=dev-rust/average-0.9.2:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= ~dev-rust/rand_chacha-0.1.1:= ~dev-rust/rand_core-0.4.0:= ~dev-rust/rand_hc-0.1.0:= ~dev-rust/rand_isaac-0.1.1:= ~dev-rust/rand_jitter-0.1.3:= ~dev-rust/rand_pcg-0.1.2:= ~dev-rust/rand_xorshift-0.1.1:= ~dev-rust/rand_xoshiro-0.1.0:= =dev-rust/rand_os-0.1*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library for random number generation.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.5/r0
 SRC_URI=https://crates.io/api/v1/crates/rand/0.6.5/download -> rand-0.6.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7a87c55062f5803722bce7d51228ae6c
diff --git a/metadata/md5-cache/dev-rust/rand_chacha-0.1.1 b/metadata/md5-cache/dev-rust/rand_chacha-0.1.1
index 8410d73..65e84c4 100644
--- a/metadata/md5-cache/dev-rust/rand_chacha-0.1.1
+++ b/metadata/md5-cache/dev-rust/rand_chacha-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/autocfg-0.1*:= <dev-rust/rand_core_transitional-0.4.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A cryptographically secure random number generator that uses the ChaCha algorithm
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_chacha/0.1.1/download -> rand_chacha-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bedc1ae8bf2a571b687cb8ce7da4275a
diff --git a/metadata/md5-cache/dev-rust/rand_core-0.4.0 b/metadata/md5-cache/dev-rust/rand_core-0.4.0
index 1115b05..4f42a4b 100644
--- a/metadata/md5-cache/dev-rust/rand_core-0.4.0
+++ b/metadata/md5-cache/dev-rust/rand_core-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/serde-1*:= >=dev-rust/serde_derive-1.0.38:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Core traits and error types of the rand library, plus tools for implementing RNGs
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_core/0.4.0/download -> rand_core-0.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0d1dc3cc5fd407c81ad13bad51f9c592
diff --git a/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1 b/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1
index cb697a0..2b9ee7b 100644
--- a/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1
+++ b/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core-0.4.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Transitional package for rand_core
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_core/0.3.1/download -> rand_core-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=608df72417a3485ccfe32e7f0b97ecb0
diff --git a/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1-r1 b/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1-r1
index 77a43fd..ae31298 100644
--- a/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1-r1
+++ b/metadata/md5-cache/dev-rust/rand_core_transitional-0.3.1-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core-0.4.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Transitional package for rand_core
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.1/r1
 SRC_URI=https://crates.io/api/v1/crates/rand_core/0.3.1/download -> rand_core-0.3.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=608df72417a3485ccfe32e7f0b97ecb0
diff --git a/metadata/md5-cache/dev-rust/rand_hc-0.1.0 b/metadata/md5-cache/dev-rust/rand_hc-0.1.0
index 62d62a0..fc23576 100644
--- a/metadata/md5-cache/dev-rust/rand_hc-0.1.0
+++ b/metadata/md5-cache/dev-rust/rand_hc-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core_transitional-0.3.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A cryptographically secure random number generator that uses the ChaCha algorithm
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_hc/0.1.0/download -> rand_hc-0.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=445343c963d07c7c2f34c07c00d9b188
diff --git a/metadata/md5-cache/dev-rust/rand_isaac-0.1.1 b/metadata/md5-cache/dev-rust/rand_isaac-0.1.1
index 0a4a3c5..707387b 100644
--- a/metadata/md5-cache/dev-rust/rand_isaac-0.1.1
+++ b/metadata/md5-cache/dev-rust/rand_isaac-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core_transitional-0.3.1:= =dev-rust/serde-1*:= >=dev-rust/serde_derive-1.0.38:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implements the ISAAC and ISAAC-64 random number generators
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_isaac/0.1.1/download -> rand_isaac-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=093a09612bf284bf5b8bb8f6be3c3696
diff --git a/metadata/md5-cache/dev-rust/rand_jitter-0.1.3 b/metadata/md5-cache/dev-rust/rand_jitter-0.1.3
index bea9175..b38de3a 100644
--- a/metadata/md5-cache/dev-rust/rand_jitter-0.1.3
+++ b/metadata/md5-cache/dev-rust/rand_jitter-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/rand_core-0.4*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Non-physical true random number generator based on timing jitter
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_jitter/0.1.3/download -> rand_jitter-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ce68820b363498bca458bd9400f437bb
diff --git a/metadata/md5-cache/dev-rust/rand_os-0.1.2 b/metadata/md5-cache/dev-rust/rand_os-0.1.2
index 0f0a354..ce2c3ef 100644
--- a/metadata/md5-cache/dev-rust/rand_os-0.1.2
+++ b/metadata/md5-cache/dev-rust/rand_os-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cloudabi-0.0.3:= =dev-rust/fuchsia-cprng-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= ~dev-rust/rand_core-0.4.0:= ~dev-rust/rdrand-0.4.0:= =dev-rust/stdweb-0.4*:= >=dev-rust/wasm-bindgen-0.2.12:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A random number generator that retrieves randomness straight from the operating system
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_os/0.1.2/download -> rand_os-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3d18ab6b17443877d0430f2a8b05cab2
diff --git a/metadata/md5-cache/dev-rust/rand_pcg-0.1.2 b/metadata/md5-cache/dev-rust/rand_pcg-0.1.2
index d38fd89..df8d121c 100644
--- a/metadata/md5-cache/dev-rust/rand_pcg-0.1.2
+++ b/metadata/md5-cache/dev-rust/rand_pcg-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/autocfg-0.1*:= ~dev-rust/rand_core-0.4.0:= =dev-rust/serde-1*:= >=dev-rust/serde_derive-1.0.38:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implements a selection of PCG random number generators.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_pcg/0.1.2/download -> rand_pcg-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=741ae9e40e3e67ac6ae54a52faa1e567
diff --git a/metadata/md5-cache/dev-rust/rand_xorshift-0.1.1 b/metadata/md5-cache/dev-rust/rand_xorshift-0.1.1
index 39c3c3f..061e7d2 100644
--- a/metadata/md5-cache/dev-rust/rand_xorshift-0.1.1
+++ b/metadata/md5-cache/dev-rust/rand_xorshift-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core_transitional-0.3.1:= =dev-rust/serde-1*:= >=dev-rust/serde_derive-1.0.38:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implements the Xorshift random number generator
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/rand_xorshift/0.1.1/download -> rand_xorshift-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6aa5b793b5ed8f029899caf1679d6774
diff --git a/metadata/md5-cache/dev-rust/rand_xoshiro-0.1.0 b/metadata/md5-cache/dev-rust/rand_xoshiro-0.1.0
index 99d7a8b..9e1c267 100644
--- a/metadata/md5-cache/dev-rust/rand_xoshiro-0.1.0
+++ b/metadata/md5-cache/dev-rust/rand_xoshiro-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rand_xoshiro crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/rayon-1.0.2 b/metadata/md5-cache/dev-rust/rayon-1.0.2
index 2239d1c..9ccf8d1 100644
--- a/metadata/md5-cache/dev-rust/rayon-1.0.2
+++ b/metadata/md5-cache/dev-rust/rayon-1.0.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rayon crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/rdrand-0.4.0 b/metadata/md5-cache/dev-rust/rdrand-0.4.0
index fefa6db..b03cf1b 100644
--- a/metadata/md5-cache/dev-rust/rdrand-0.4.0
+++ b/metadata/md5-cache/dev-rust/rdrand-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/rand_core_transitional-0.3.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of random number generator based on rdrand and rdseed instructions
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
 SRC_URI=https://crates.io/api/v1/crates/rdrand/0.4.0/download -> rdrand-0.4.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=596a14765589310a4b813e4fd934a7aa
diff --git a/metadata/md5-cache/dev-rust/redox_syscall-0.1.51 b/metadata/md5-cache/dev-rust/redox_syscall-0.1.51
index 3c8a99f..ef240ac 100644
--- a/metadata/md5-cache/dev-rust/redox_syscall-0.1.51
+++ b/metadata/md5-cache/dev-rust/redox_syscall-0.1.51
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty redox_syscall crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.51/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/redox_termios-0.1.1 b/metadata/md5-cache/dev-rust/redox_termios-0.1.1
index fc45519..4a4c7d1 100644
--- a/metadata/md5-cache/dev-rust/redox_termios-0.1.1
+++ b/metadata/md5-cache/dev-rust/redox_termios-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty redox_termios crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/regex-1.0.6 b/metadata/md5-cache/dev-rust/regex-1.0.6
index b203fbd..68289e3 100644
--- a/metadata/md5-cache/dev-rust/regex-1.0.6
+++ b/metadata/md5-cache/dev-rust/regex-1.0.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/aho-corasick-0.6.7:= <dev-rust/aho-corasick-0.7.0 >=dev-rust/memchr-2.0.2:= <dev-rust/memchr-3.0.0 >=dev-rust/thread_local-0.3.6:= <dev-rust/thread_local-0.4.0 >=dev-rust/regex-syntax-0.6.2:= <dev-rust/regex-syntax-0.7.0 >=dev-rust/utf8-ranges-1.0.1:= <dev-rust/utf8-ranges-1.2.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of regular expressions for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.6/r0
 SRC_URI=https://crates.io/api/v1/crates/regex/1.0.6/download -> regex-1.0.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=79eb34fef05b53b09b5b0e74428d2db5
diff --git a/metadata/md5-cache/dev-rust/regex-syntax-0.6.5 b/metadata/md5-cache/dev-rust/regex-syntax-0.6.5
index 68d910c..39f450c 100644
--- a/metadata/md5-cache/dev-rust/regex-syntax-0.6.5
+++ b/metadata/md5-cache/dev-rust/regex-syntax-0.6.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/ucd-util-0.1.0:= <dev-rust/ucd-util-0.2.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=A regular expression parser.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.5/r0
 SRC_URI=https://crates.io/api/v1/crates/regex-syntax/0.6.5/download -> regex-syntax-0.6.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4d6d22d65aeba5ea2663402d6d26f76f
diff --git a/metadata/md5-cache/dev-rust/remain-0.2.1 b/metadata/md5-cache/dev-rust/remain-0.2.1
index 0942d66..f0c5220 100644
--- a/metadata/md5-cache/dev-rust/remain-0.2.1
+++ b/metadata/md5-cache/dev-rust/remain-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Compile-time checks that an enum or match is written in sorted order
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/remain/0.2.1/download -> remain-0.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=822acba8f91b6e73aebe2601d7660332
diff --git a/metadata/md5-cache/dev-rust/remove_dir_all-0.5.1 b/metadata/md5-cache/dev-rust/remove_dir_all-0.5.1
index 463ec19..8b6e666 100644
--- a/metadata/md5-cache/dev-rust/remove_dir_all-0.5.1
+++ b/metadata/md5-cache/dev-rust/remove_dir_all-0.5.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/winapi-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A reliable implementation of remove_dir_all for Windows. For Unix systems re-exports std::fs::remove_dir_all.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.1/r0
 SRC_URI=https://crates.io/api/v1/crates/remove_dir_all/0.5.1/download -> remove_dir_all-0.5.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5a7ee2e402e412a3dbaac0f31dfe3dfa
diff --git a/metadata/md5-cache/dev-rust/ring-0.14.6 b/metadata/md5-cache/dev-rust/ring-0.14.6
index ac3f9d9..538e1a9 100644
--- a/metadata/md5-cache/dev-rust/ring-0.14.6
+++ b/metadata/md5-cache/dev-rust/ring-0.14.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty ring crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.14.6/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/rusb-0.6.2 b/metadata/md5-cache/dev-rust/rusb-0.6.2
new file mode 100644
index 0000000..1f8de8f
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/rusb-0.6.2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/libusb1-sys-0.3.5:= <dev-rust/libusb1-sys-0.4 =dev-rust/libc-0.2*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust library for accessing USB devices
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/rusb/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.6.2/r0
+SRC_URI=https://crates.io/api/v1/crates/rusb/0.6.2/download -> rusb-0.6.2.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=84443b7ee9063f8e6c3eb7017e016197
diff --git a/metadata/md5-cache/dev-rust/rusqlite-0.19.0 b/metadata/md5-cache/dev-rust/rusqlite-0.19.0
index 427cc21..e2389ee 100644
--- a/metadata/md5-cache/dev-rust/rusqlite-0.19.0
+++ b/metadata/md5-cache/dev-rust/rusqlite-0.19.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bitflags-1*:= =dev-rust/fallible-iterator-0.2*:= =dev-rust/fallible-streaming-iterator-0.1*:= =dev-rust/libsqlite3-sys-0.15*:= =dev-rust/lru-cache-0.1*:= =dev-rust/memchr-2.2*:= =dev-rust/time-0.1*:= =dev-rust/byteorder-1.2*:= =dev-rust/chrono-0.4*:= =dev-rust/csv-1*:= =dev-rust/lazy_static-1*:= =dev-rust/serde_json-1*:= =dev-rust/url-1.7*:= =dev-rust/uuid-0.7*:= =dev-rust/regex-1*:= =dev-rust/tempdir-0.3*:= =dev-rust/unicase-2.4*:= =dev-rust/uuid-0.7*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rusqlite is an ergonomic wrapper for using SQLite from Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.19.0/r0
 SRC_URI=https://crates.io/api/v1/crates/rusqlite/0.19.0/download -> rusqlite-0.19.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=54939ba9e49e1a7a49b1667f388d2730
diff --git a/metadata/md5-cache/dev-rust/rusqlite-0.20.0 b/metadata/md5-cache/dev-rust/rusqlite-0.20.0
index c02a2ce..7fe8945 100644
--- a/metadata/md5-cache/dev-rust/rusqlite-0.20.0
+++ b/metadata/md5-cache/dev-rust/rusqlite-0.20.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bitflags-1*:= =dev-rust/fallible-iterator-0.2*:= =dev-rust/fallible-streaming-iterator-0.1*:= =dev-rust/libsqlite3-sys-0.16*:= =dev-rust/lru-cache-0.1*:= =dev-rust/memchr-2.2*:= =dev-rust/time-0.1*:= =dev-rust/byteorder-1.2*:= =dev-rust/chrono-0.4*:= =dev-rust/csv-1*:= =dev-rust/lazy_static-1*:= =dev-rust/serde_json-1*:= =dev-rust/url-2*:= =dev-rust/uuid-0.7*:= =dev-rust/regex-1*:= =dev-rust/tempdir-0.3*:= =dev-rust/unicase-2.4*:= =dev-rust/uuid-0.7*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rusqlite is an ergonomic wrapper for using SQLite from Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.20.0/r0
 SRC_URI=https://crates.io/api/v1/crates/rusqlite/0.20.0/download -> rusqlite-0.20.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ca37fac73077f423628842465a0c9b9a
diff --git a/metadata/md5-cache/dev-rust/rustc-demangle-0.1.4 b/metadata/md5-cache/dev-rust/rustc-demangle-0.1.4
index 1fe675c..66516d4 100644
--- a/metadata/md5-cache/dev-rust/rustc-demangle-0.1.4
+++ b/metadata/md5-cache/dev-rust/rustc-demangle-0.1.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Symbol demangling for Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.4/r0
 SRC_URI=https://crates.io/api/v1/crates/rustc-demangle/0.1.4/download -> rustc-demangle-0.1.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=06722ff391b8bdaa74db19718f4cf8fd
diff --git a/metadata/md5-cache/dev-rust/rustc-hash-1.0.0 b/metadata/md5-cache/dev-rust/rustc-hash-1.0.0
index 0c7ee02..86f608f 100644
--- a/metadata/md5-cache/dev-rust/rustc-hash-1.0.0
+++ b/metadata/md5-cache/dev-rust/rustc-hash-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rustc-hash crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24 b/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24
index ac6cad0..ea8b827 100644
--- a/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24
+++ b/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/rand-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Serialization and deserialization support provided by the compiler in the form of derive(RustcEncodable, RustcDecodable).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.24/r0
 SRC_URI=https://crates.io/api/v1/crates/rustc-serialize/0.3.24/download -> rustc-serialize-0.3.24.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=91a5761fe00ecbc93b689478caf18973
diff --git a/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24-r1 b/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24-r1
index d454267..5ce31fd 100644
--- a/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24-r1
+++ b/metadata/md5-cache/dev-rust/rustc-serialize-0.3.24-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/rand-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Serialization and deserialization support provided by the compiler in the form of derive(RustcEncodable, RustcDecodable).
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.24/r1
 SRC_URI=https://crates.io/api/v1/crates/rustc-serialize/0.3.24/download -> rustc-serialize-0.3.24.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=91a5761fe00ecbc93b689478caf18973
diff --git a/metadata/md5-cache/dev-rust/rustc-std-workspace-core-1.0.0 b/metadata/md5-cache/dev-rust/rustc-std-workspace-core-1.0.0
index 47f59cc..c0acf10 100644
--- a/metadata/md5-cache/dev-rust/rustc-std-workspace-core-1.0.0
+++ b/metadata/md5-cache/dev-rust/rustc-std-workspace-core-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 EAPI=6
 IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
@@ -6,5 +6,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bd17a758f31d5462ebd445618878377b
diff --git a/metadata/md5-cache/dev-rust/rustc-test-0.3.0 b/metadata/md5-cache/dev-rust/rustc-test-0.3.0
index e79e9ec..f9a0eda 100644
--- a/metadata/md5-cache/dev-rust/rustc-test-0.3.0
+++ b/metadata/md5-cache/dev-rust/rustc-test-0.3.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty rustc-test crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/rustc_version-0.2.3 b/metadata/md5-cache/dev-rust/rustc_version-0.2.3
index 6a9f034..8e69b28 100644
--- a/metadata/md5-cache/dev-rust/rustc_version-0.2.3
+++ b/metadata/md5-cache/dev-rust/rustc_version-0.2.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/semver-0.9*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A library for querying the version of a rustc compiler
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.3/r0
 SRC_URI=https://crates.io/api/v1/crates/rustc_version/0.2.3/download -> rustc_version-0.2.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8d57b53039d2a11eb8239d0a2d6f2f07
diff --git a/metadata/md5-cache/dev-rust/rustyline-5.0.4 b/metadata/md5-cache/dev-rust/rustyline-5.0.4
index bed31e1..439b145 100644
--- a/metadata/md5-cache/dev-rust/rustyline-5.0.4
+++ b/metadata/md5-cache/dev-rust/rustyline-5.0.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/dirs-2.0.0:= <dev-rust/dirs-3.0.0 >=dev-rust/libc-0.2.0:= <dev-rust/libc-0.3.0 >=dev-rust/log-0.4.0:= <dev-rust/log-0.5.0 >=dev-rust/memchr-2.0.0:= <dev-rust/memchr-3.0.0 >=dev-rust/nix-0.14.0:= <dev-rust/nix-0.15.0 >=dev-rust/unicode-segmentation-1.0.0:= <dev-rust/unicode-segmentation-2.0.0 >=dev-rust/unicode-width-0.1.0:= <dev-rust/unicode-width-0.2.0 >=dev-rust/utf8parse-0.1.0:= <dev-rust/utf8parse-0.2.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Rustyline, a readline implementation based on Antirez's Linenoise.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=5.0.4/r0
 SRC_URI=https://crates.io/api/v1/crates/rustyline/5.0.4/download -> rustyline-5.0.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0556439e128a04f4e78b45e23dc8d814
diff --git a/metadata/md5-cache/dev-rust/ryu-0.2.8 b/metadata/md5-cache/dev-rust/ryu-0.2.8
index 37e32618..8c8e388 100644
--- a/metadata/md5-cache/dev-rust/ryu-0.2.8
+++ b/metadata/md5-cache/dev-rust/ryu-0.2.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/no-panic-0.1*:= >=dev-rust/num_cpus-1.8.0:= =dev-rust/rand-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Pure Rust implementation of Ryū, an algorithm to quickly convert floating point numbers to decimal strings.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.8/r0
 SRC_URI=https://crates.io/api/v1/crates/ryu/0.2.8/download -> ryu-0.2.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=da07188f19ca468301de7d83f9fe84a0
diff --git a/metadata/md5-cache/dev-rust/schannel-0.1.15 b/metadata/md5-cache/dev-rust/schannel-0.1.15
index d6ff32f..e85456f 100644
--- a/metadata/md5-cache/dev-rust/schannel-0.1.15
+++ b/metadata/md5-cache/dev-rust/schannel-0.1.15
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/lazy_static-1*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust bindings to the Windows SChannel APIs providing TLS client and server functionality.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.15/r0
 SRC_URI=https://crates.io/api/v1/crates/schannel/0.1.15/download -> schannel-0.1.15.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ab40bf3a2b6abbeb2594bd73d4a90148
diff --git a/metadata/md5-cache/dev-rust/scoped-tls-0.1.0 b/metadata/md5-cache/dev-rust/scoped-tls-0.1.0
index 9f67913..3ae53f3 100644
--- a/metadata/md5-cache/dev-rust/scoped-tls-0.1.0
+++ b/metadata/md5-cache/dev-rust/scoped-tls-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library providing the old standard library's scoped_thread_local! macro as a library implementation on crates.io.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/scoped-tls/0.1.0/download -> scoped-tls-0.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a02ded527606af26467e29a6285ce5b1
diff --git a/metadata/md5-cache/dev-rust/scoped_threadpool-0.1.9 b/metadata/md5-cache/dev-rust/scoped_threadpool-0.1.9
index e0271f4..9cfe606 100644
--- a/metadata/md5-cache/dev-rust/scoped_threadpool-0.1.9
+++ b/metadata/md5-cache/dev-rust/scoped_threadpool-0.1.9
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty scoped_threadpool crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.9/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/scopeguard-0.3.3 b/metadata/md5-cache/dev-rust/scopeguard-0.3.3
index 3c66c8a..453699c 100644
--- a/metadata/md5-cache/dev-rust/scopeguard-0.3.3
+++ b/metadata/md5-cache/dev-rust/scopeguard-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A RAII scope guard that will run a given closure when it goes out of scope
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
 SRC_URI=https://crates.io/api/v1/crates/scopeguard/0.3.3/download -> scopeguard-0.3.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=94dc2dc560c236e86accab95312d1d43
diff --git a/metadata/md5-cache/dev-rust/security-framework-0.3.3 b/metadata/md5-cache/dev-rust/security-framework-0.3.3
index 2faf0a8..570ac5e 100644
--- a/metadata/md5-cache/dev-rust/security-framework-0.3.3
+++ b/metadata/md5-cache/dev-rust/security-framework-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty security-framework crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=41923915aa8b03ebf1d6af087d106c83
diff --git a/metadata/md5-cache/dev-rust/security-framework-sys-0.3.3 b/metadata/md5-cache/dev-rust/security-framework-sys-0.3.3
index 3179301..2b239a4 100644
--- a/metadata/md5-cache/dev-rust/security-framework-sys-0.3.3
+++ b/metadata/md5-cache/dev-rust/security-framework-sys-0.3.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty security-framework-sys crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.3/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=41923915aa8b03ebf1d6af087d106c83
diff --git a/metadata/md5-cache/dev-rust/semver-0.9.0 b/metadata/md5-cache/dev-rust/semver-0.9.0
index 1364852..721b791 100644
--- a/metadata/md5-cache/dev-rust/semver-0.9.0
+++ b/metadata/md5-cache/dev-rust/semver-0.9.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/semver-parser-0.7*:= =dev-rust/serde-1*:= =dev-rust/crates-index-0.5*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_json-1*:= =dev-rust/tempdir-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Semantic version parsing and comparison
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.9.0/r0
 SRC_URI=https://crates.io/api/v1/crates/semver/0.9.0/download -> semver-0.9.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8d525f630d7b1503585cfb816b623f18
diff --git a/metadata/md5-cache/dev-rust/semver-parser-0.7.0 b/metadata/md5-cache/dev-rust/semver-parser-0.7.0
index 906e11e..2255d16 100644
--- a/metadata/md5-cache/dev-rust/semver-parser-0.7.0
+++ b/metadata/md5-cache/dev-rust/semver-parser-0.7.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Parsing for the semver spec
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.0/r0
 SRC_URI=https://crates.io/api/v1/crates/semver-parser/0.7.0/download -> semver-parser-0.7.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=65b1cf25f42ccb6ac2af5af503541bce
diff --git a/metadata/md5-cache/dev-rust/serde-0.8.23 b/metadata/md5-cache/dev-rust/serde-0.8.23
index f31825c..9c0212a 100644
--- a/metadata/md5-cache/dev-rust/serde-0.8.23
+++ b/metadata/md5-cache/dev-rust/serde-0.8.23
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.23/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/serde-1.0.114 b/metadata/md5-cache/dev-rust/serde-1.0.114
new file mode 100644
index 0000000..e42cb51
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/serde-1.0.114
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=~dev-rust/serde_derive-1.0.114:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically
+EAPI=7
+HOMEPAGE=https://github.com/serde-rs/serde
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.114/r0
+SRC_URI=https://crates.io/api/v1/crates/serde/1.0.114/download -> serde-1.0.114.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=63da2ba6427bf8b4f1c342a1565507bf
diff --git a/metadata/md5-cache/dev-rust/serde-1.0.89 b/metadata/md5-cache/dev-rust/serde-1.0.89
deleted file mode 100644
index df307e8..0000000
--- a/metadata/md5-cache/dev-rust/serde-1.0.89
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/serde_derive-1.0*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically
-EAPI=6
-HOMEPAGE=https://github.com/serde-rs/serde
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.0.89/r0
-SRC_URI=https://crates.io/api/v1/crates/serde/1.0.89/download -> serde-1.0.89.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d7b3b800d191c5f02efa9b5de1f4707b
diff --git a/metadata/md5-cache/dev-rust/serde_bytes-0.10.5 b/metadata/md5-cache/dev-rust/serde_bytes-0.10.5
index f079586..9edf545 100644
--- a/metadata/md5-cache/dev-rust/serde_bytes-0.10.5
+++ b/metadata/md5-cache/dev-rust/serde_bytes-0.10.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bincode-1.0*:= =dev-rust/serde-1.0*:= =dev-rust/serde_derive-1.0*:= =dev-rust/serde_test-1.0*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Wrapper types to enable optimized handling of &[u8] and Vec<u8>
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.10.5/r0
 SRC_URI=https://crates.io/api/v1/crates/serde_bytes/0.10.5/download -> serde_bytes-0.10.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6672a45492a97789b9e802e387d81554
diff --git a/metadata/md5-cache/dev-rust/serde_derive-1.0.114 b/metadata/md5-cache/dev-rust/serde_derive-1.0.114
new file mode 100644
index 0000000..96cb4c0
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/serde_derive-1.0.114
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= >=dev-rust/syn-1.0.33:= <dev-rust/syn-2 >=virtual/rust-1.39.0:=
+DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically
+EAPI=7
+HOMEPAGE=https://github.com/serde-rs/serde
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.114/r0
+SRC_URI=https://crates.io/api/v1/crates/serde_derive/1.0.114/download -> serde_derive-1.0.114.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=32cb0117cf05773546ea0d13c7fe9245
diff --git a/metadata/md5-cache/dev-rust/serde_derive-1.0.89 b/metadata/md5-cache/dev-rust/serde_derive-1.0.89
deleted file mode 100644
index 030f41f..0000000
--- a/metadata/md5-cache/dev-rust/serde_derive-1.0.89
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/proc-macro2-0.4*:= >=dev-rust/quote-0.6.3:= <dev-rust/quote-0.7 >=dev-rust/syn-0.15.22:= <dev-rust/syn-0.16 >=virtual/rust-1.39.0:=
-DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically
-EAPI=6
-HOMEPAGE=https://github.com/serde-rs/serde
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.0.89/r0
-SRC_URI=https://crates.io/api/v1/crates/serde_derive/1.0.89/download -> serde_derive-1.0.89.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f64652d4a2ec055d3582c92c9e52fbcf
diff --git a/metadata/md5-cache/dev-rust/serde_derive-1.0.89-r1 b/metadata/md5-cache/dev-rust/serde_derive-1.0.89-r1
deleted file mode 100644
index 005b3c0..0000000
--- a/metadata/md5-cache/dev-rust/serde_derive-1.0.89-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/proc-macro2-0.4*:= >=dev-rust/quote-0.6.3:= <dev-rust/quote-0.7 >=dev-rust/syn-0.15.22:= <dev-rust/syn-0.16 >=virtual/rust-1.39.0:=
-DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically
-EAPI=6
-HOMEPAGE=https://github.com/serde-rs/serde
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.0.89/r1
-SRC_URI=https://crates.io/api/v1/crates/serde_derive/1.0.89/download -> serde_derive-1.0.89.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f64652d4a2ec055d3582c92c9e52fbcf
diff --git a/metadata/md5-cache/dev-rust/serde_json-0.8.6 b/metadata/md5-cache/dev-rust/serde_json-0.8.6
index 435c60a..398d4c3 100644
--- a/metadata/md5-cache/dev-rust/serde_json-0.8.6
+++ b/metadata/md5-cache/dev-rust/serde_json-0.8.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde_json crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.6/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/serde_json-1.0.0 b/metadata/md5-cache/dev-rust/serde_json-1.0.0
index fd8db21..eeb53cc 100644
--- a/metadata/md5-cache/dev-rust/serde_json-1.0.0
+++ b/metadata/md5-cache/dev-rust/serde_json-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde_json crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=41923915aa8b03ebf1d6af087d106c83
diff --git a/metadata/md5-cache/dev-rust/serde_json-1.0.39 b/metadata/md5-cache/dev-rust/serde_json-1.0.39
index 0596e63..787e48f 100644
--- a/metadata/md5-cache/dev-rust/serde_json-1.0.39
+++ b/metadata/md5-cache/dev-rust/serde_json-1.0.39
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/itoa-0.4.3:= =dev-rust/ryu-0.2*:= >=dev-rust/serde-1.0.60:= =dev-rust/indexmap-1*:= =dev-rust/automod-0.1*:= =dev-rust/compiletest_rs-0.3*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_stacker-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.39/r0
 SRC_URI=https://crates.io/api/v1/crates/serde_json/1.0.39/download -> serde_json-1.0.39.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3be7dfce4e170ed80f6b599d479bc0c4
diff --git a/metadata/md5-cache/dev-rust/serde_json-1.0.39-r1 b/metadata/md5-cache/dev-rust/serde_json-1.0.39-r1
index 0a1df82..78ac2b3 100644
--- a/metadata/md5-cache/dev-rust/serde_json-1.0.39-r1
+++ b/metadata/md5-cache/dev-rust/serde_json-1.0.39-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/itoa-0.4.3:= =dev-rust/ryu-0.2*:= >=dev-rust/serde-1.0.60:= =dev-rust/indexmap-1*:= =dev-rust/automod-0.1*:= =dev-rust/compiletest_rs-0.3*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_stacker-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Serde is a framework for serializing and deserializing Rust data structures efficiently and generically.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.39/r1
 SRC_URI=https://crates.io/api/v1/crates/serde_json/1.0.39/download -> serde_json-1.0.39.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3be7dfce4e170ed80f6b599d479bc0c4
diff --git a/metadata/md5-cache/dev-rust/serde_stacker-0.1.0 b/metadata/md5-cache/dev-rust/serde_stacker-0.1.0
index f8ae8c2..2265f3f 100644
--- a/metadata/md5-cache/dev-rust/serde_stacker-0.1.0
+++ b/metadata/md5-cache/dev-rust/serde_stacker-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde_stacker crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/serde_test-1.0.0 b/metadata/md5-cache/dev-rust/serde_test-1.0.0
index 9006488..b834c79 100644
--- a/metadata/md5-cache/dev-rust/serde_test-1.0.0
+++ b/metadata/md5-cache/dev-rust/serde_test-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde_test crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/serde_test-1.0.92 b/metadata/md5-cache/dev-rust/serde_test-1.0.92
index a17bbef..696260a 100644
--- a/metadata/md5-cache/dev-rust/serde_test-1.0.92
+++ b/metadata/md5-cache/dev-rust/serde_test-1.0.92
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty serde_test crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.92/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/serde_yaml-0.8.11 b/metadata/md5-cache/dev-rust/serde_yaml-0.8.11
new file mode 100644
index 0000000..ad97dbd
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/serde_yaml-0.8.11
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/dtoa-0.4*:= =dev-rust/linked-hash-map-0.5*:= >=dev-rust/serde-1.0.60:= <dev-rust/serde-2.0 =dev-rust/yaml-rust-0.4*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=YAML support for Serde
+EAPI=6
+HOMEPAGE=https://docs.rs/crate/serde_yaml
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.8.11/r0
+SRC_URI=https://crates.io/api/v1/crates/serde_yaml/0.8.11/download -> serde_yaml-0.8.11.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2d7dcff948c9f716cc50f024a0f369e2
diff --git a/metadata/md5-cache/dev-rust/shell-words-1.0.0 b/metadata/md5-cache/dev-rust/shell-words-1.0.0
index de8a6d6..c1450bb 100644
--- a/metadata/md5-cache/dev-rust/shell-words-1.0.0
+++ b/metadata/md5-cache/dev-rust/shell-words-1.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Process command line according to parsing rules of Unix shell.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.0/r0
 SRC_URI=https://crates.io/api/v1/crates/shell-words/1.0.0/download -> shell-words-1.0.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=621988a0b5019a7024c137960e47bf2f
diff --git a/metadata/md5-cache/dev-rust/signal-hook-0.1.5 b/metadata/md5-cache/dev-rust/signal-hook-0.1.5
index 9e72053..2acb250 100644
--- a/metadata/md5-cache/dev-rust/signal-hook-0.1.5
+++ b/metadata/md5-cache/dev-rust/signal-hook-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty signal-hook crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/slab-0.4.2 b/metadata/md5-cache/dev-rust/slab-0.4.2
index e950908..db74550 100644
--- a/metadata/md5-cache/dev-rust/slab-0.4.2
+++ b/metadata/md5-cache/dev-rust/slab-0.4.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Pre-allocated storage for a uniform data type
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.2/r0
 SRC_URI=https://crates.io/api/v1/crates/slab/0.4.2/download -> slab-0.4.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8431703a86a8ef35bf9628a8ecbde178
diff --git a/metadata/md5-cache/dev-rust/smallvec-0.6.12 b/metadata/md5-cache/dev-rust/smallvec-0.6.12
index bea27b6..a1693c9 100644
--- a/metadata/md5-cache/dev-rust/smallvec-0.6.12
+++ b/metadata/md5-cache/dev-rust/smallvec-0.6.12
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/serde-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Small vector optimization for Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.12/r0
 SRC_URI=https://crates.io/api/v1/crates/smallvec/0.6.12/download -> smallvec-0.6.12.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0a90dc4d8d25349f1848cb2cee51cf80
diff --git a/metadata/md5-cache/dev-rust/smallvec-0.6.12-r1 b/metadata/md5-cache/dev-rust/smallvec-0.6.12-r1
index 09b0ce7..73991a6 100644
--- a/metadata/md5-cache/dev-rust/smallvec-0.6.12-r1
+++ b/metadata/md5-cache/dev-rust/smallvec-0.6.12-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/serde-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Small vector optimization for Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.12/r1
 SRC_URI=https://crates.io/api/v1/crates/smallvec/0.6.12/download -> smallvec-0.6.12.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0a90dc4d8d25349f1848cb2cee51cf80
diff --git a/metadata/md5-cache/dev-rust/socket2-0.3.9 b/metadata/md5-cache/dev-rust/socket2-0.3.9
index 3aff2323..3ce346d 100644
--- a/metadata/md5-cache/dev-rust/socket2-0.3.9
+++ b/metadata/md5-cache/dev-rust/socket2-0.3.9
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/cfg-if-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/redox_syscall-0.1*:= =dev-rust/winapi-0.3*:= =dev-rust/tempdir-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Provide as direct as possible access to the system's functionality for sockets as possible
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.9/r0
 SRC_URI=https://crates.io/api/v1/crates/socket2/0.3.9/download -> socket2-0.3.9.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3f0a2dcec7d3a0e513f41e0fc23254b0
diff --git a/metadata/md5-cache/dev-rust/spin-0.4.10 b/metadata/md5-cache/dev-rust/spin-0.4.10
index 5806b1f..9c49f3e 100644
--- a/metadata/md5-cache/dev-rust/spin-0.4.10
+++ b/metadata/md5-cache/dev-rust/spin-0.4.10
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Synchronization primitives based on spinning.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.10/r0
 SRC_URI=https://crates.io/api/v1/crates/spin/0.4.10/download -> spin-0.4.10.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fa6501919b9ea0b410fd6b597d0ede4f
diff --git a/metadata/md5-cache/dev-rust/spin-0.5.2 b/metadata/md5-cache/dev-rust/spin-0.5.2
index 3636c86..18ea5a2 100644
--- a/metadata/md5-cache/dev-rust/spin-0.5.2
+++ b/metadata/md5-cache/dev-rust/spin-0.5.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Synchronization primitives based on spinning.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.2/r0
 SRC_URI=https://crates.io/api/v1/crates/spin/0.5.2/download -> spin-0.5.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fa6501919b9ea0b410fd6b597d0ede4f
diff --git a/metadata/md5-cache/dev-rust/stable_deref_trait-1.1.1 b/metadata/md5-cache/dev-rust/stable_deref_trait-1.1.1
index 210d439..ec089115 100644
--- a/metadata/md5-cache/dev-rust/stable_deref_trait-1.1.1
+++ b/metadata/md5-cache/dev-rust/stable_deref_trait-1.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=This crate defines an unsafe marker trait, StableDeref, for container types which deref to a fixed address which is valid even when the containing type is moved.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/stable_deref_trait/1.1.1/download -> stable_deref_trait-1.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=45ec6aa0ba5cd97b2d83e46f77b22130
diff --git a/metadata/md5-cache/dev-rust/stdweb-0.4.14 b/metadata/md5-cache/dev-rust/stdweb-0.4.14
index a6661cc..660263a 100644
--- a/metadata/md5-cache/dev-rust/stdweb-0.4.14
+++ b/metadata/md5-cache/dev-rust/stdweb-0.4.14
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty stdweb crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.14/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/string-0.2.1 b/metadata/md5-cache/dev-rust/string-0.2.1
index 12b3fd4..b28f883 100644
--- a/metadata/md5-cache/dev-rust/string-0.2.1
+++ b/metadata/md5-cache/dev-rust/string-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A UTF-8 encoded string with configurable byte storage.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
 SRC_URI=https://crates.io/api/v1/crates/string/0.2.1/download -> string-0.2.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3c17b654150aaf83969149884f191bdf
diff --git a/metadata/md5-cache/dev-rust/strsim-0.8.0 b/metadata/md5-cache/dev-rust/strsim-0.8.0
index 19c4227..01f5f31 100644
--- a/metadata/md5-cache/dev-rust/strsim-0.8.0
+++ b/metadata/md5-cache/dev-rust/strsim-0.8.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Implementations of string similarity metrics.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.0/r0
 SRC_URI=https://crates.io/api/v1/crates/strsim/0.8.0/download -> strsim-0.8.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f2a5717f1ffb813878d0dc6bed348dd2
diff --git a/metadata/md5-cache/dev-rust/strsim-0.8.0-r1 b/metadata/md5-cache/dev-rust/strsim-0.8.0-r1
index 6383d00..1b1e3f3 100644
--- a/metadata/md5-cache/dev-rust/strsim-0.8.0-r1
+++ b/metadata/md5-cache/dev-rust/strsim-0.8.0-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Implementations of string similarity metrics.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.0/r1
 SRC_URI=https://crates.io/api/v1/crates/strsim/0.8.0/download -> strsim-0.8.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f2a5717f1ffb813878d0dc6bed348dd2
diff --git a/metadata/md5-cache/dev-rust/syn-0.15.21 b/metadata/md5-cache/dev-rust/syn-0.15.21
index 8191f89..c44b960 100644
--- a/metadata/md5-cache/dev-rust/syn-0.15.21
+++ b/metadata/md5-cache/dev-rust/syn-0.15.21
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/proc-macro2-0.4.4:= >=dev-rust/quote-0.6:= >=dev-rust/rayon-1.0:= =dev-rust/unicode-xid-0.1*:= >=dev-rust/walkdir-2.1:= >=dev-rust/regex-1.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Parser for rust source code
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.15.21/r0
 SRC_URI=https://crates.io/api/v1/crates/syn/0.15.21/download -> syn-0.15.21.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=78e51cd9df2e485462b966c3fb41f250
diff --git a/metadata/md5-cache/dev-rust/syn-0.15.26 b/metadata/md5-cache/dev-rust/syn-0.15.26
index 75a6e02..d8813ca 100644
--- a/metadata/md5-cache/dev-rust/syn-0.15.26
+++ b/metadata/md5-cache/dev-rust/syn-0.15.26
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/proc-macro2-0.4.4:= =dev-rust/quote-0.6*:= =dev-rust/rayon-1.0*:= =dev-rust/unicode-xid-0.1*:= >=dev-rust/walkdir-2.1.0:= =dev-rust/regex-1.0*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Parser for rust source code
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.15.26/r0
 SRC_URI=https://crates.io/api/v1/crates/syn/0.15.26/download -> syn-0.15.26.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=99ddca19c41402005ca371b43fe1f7f9
diff --git a/metadata/md5-cache/dev-rust/syn-1.0.14 b/metadata/md5-cache/dev-rust/syn-1.0.14
deleted file mode 100644
index 74042d6..0000000
--- a/metadata/md5-cache/dev-rust/syn-1.0.14
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/rayon-1*:= =dev-rust/unicode-xid-0.2*:= >=dev-rust/walkdir-2.1.0:= <dev-rust/walkdir-3 =dev-rust/regex-1*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Parser for rust source code
-EAPI=6
-HOMEPAGE=https://github.com/dtolnay/syn
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=1.0.14/r0
-SRC_URI=https://crates.io/api/v1/crates/syn/1.0.14/download -> syn-1.0.14.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ba1f2f0ba96b85c043ca0a665213778c
diff --git a/metadata/md5-cache/dev-rust/syn-1.0.38 b/metadata/md5-cache/dev-rust/syn-1.0.38
new file mode 100644
index 0000000..7804ec8
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/syn-1.0.38
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/proc-macro2-1.0.13:= <dev-rust/proc-macro2-2 =dev-rust/quote-1*:= =dev-rust/unicode-xid-0.2*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Parser for rust source code
+EAPI=7
+HOMEPAGE=https://github.com/dtolnay/syn
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.38/r0
+SRC_URI=https://crates.io/api/v1/crates/syn/1.0.38/download -> syn-1.0.38.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=57d7fcf07b316da230bb6ac8d1d15cfa
diff --git a/metadata/md5-cache/dev-rust/syn-1.0.5 b/metadata/md5-cache/dev-rust/syn-1.0.5
index 0b21b12..a8b59f0 100644
--- a/metadata/md5-cache/dev-rust/syn-1.0.5
+++ b/metadata/md5-cache/dev-rust/syn-1.0.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/rayon-1*:= =dev-rust/unicode-xid-0.2*:= >=dev-rust/walkdir-2.1.0:= <dev-rust/walkdir-3 =dev-rust/regex-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Parser for rust source code
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.5/r0
 SRC_URI=https://crates.io/api/v1/crates/syn/1.0.5/download -> syn-1.0.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ba1f2f0ba96b85c043ca0a665213778c
diff --git a/metadata/md5-cache/dev-rust/sync-0.1.0-r9 b/metadata/md5-cache/dev-rust/sync-0.1.0-r9
index 1cd703a..135e388 100644
--- a/metadata/md5-cache/dev-rust/sync-0.1.0-r9
+++ b/metadata/md5-cache/dev-rust/sync-0.1.0-r9
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/sync-0.1.0-r6
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0.1.0-r9
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d9516073313555796c106ce4f31ad4be
diff --git a/metadata/md5-cache/dev-rust/sync-9999 b/metadata/md5-cache/dev-rust/sync-9999
index ad09943..d46c4ba 100644
--- a/metadata/md5-cache/dev-rust/sync-9999
+++ b/metadata/md5-cache/dev-rust/sync-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/sync-0.1.0-r6
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c6aede280d309ec7b42e2c181f42df90
diff --git a/metadata/md5-cache/dev-rust/synstructure-0.10.1 b/metadata/md5-cache/dev-rust/synstructure-0.10.1
index b269b8a..666884a 100644
--- a/metadata/md5-cache/dev-rust/synstructure-0.10.1
+++ b/metadata/md5-cache/dev-rust/synstructure-0.10.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/proc-macro2-0.4*:= =dev-rust/quote-0.6*:= =dev-rust/syn-0.15*:= =dev-rust/unicode-xid-0.1*:= =dev-rust/synstructure_test_traits-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides helper types for matching against enum variants, and extracting bindings to each of the fields in the deriving Struct or Enum in a generic way
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.10.1/r0
 SRC_URI=https://crates.io/api/v1/crates/synstructure/0.10.1/download -> synstructure-0.10.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ff5ee63226ad0d5fdacd731e064c8606
diff --git a/metadata/md5-cache/dev-rust/synstructure_test_traits-0.1.0 b/metadata/md5-cache/dev-rust/synstructure_test_traits-0.1.0
index 78f84f2..af02ee1 100644
--- a/metadata/md5-cache/dev-rust/synstructure_test_traits-0.1.0
+++ b/metadata/md5-cache/dev-rust/synstructure_test_traits-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty synstructure_test_traits crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/sys-info-0.5.7 b/metadata/md5-cache/dev-rust/sys-info-0.5.7
index f415a4d..bd31e8b 100644
--- a/metadata/md5-cache/dev-rust/sys-info-0.5.7
+++ b/metadata/md5-cache/dev-rust/sys-info-0.5.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/libc-0.2:= =dev-rust/cc-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Get system information in Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.7/r0
 SRC_URI=https://crates.io/api/v1/crates/sys-info/0.5.7/download -> sys-info-0.5.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3637c53dac713437c2e85a33b9e82e16
diff --git a/metadata/md5-cache/dev-rust/sys_util-0.1.0-r101 b/metadata/md5-cache/dev-rust/sys_util-0.1.0-r101
deleted file mode 100644
index 8cd9306..0000000
--- a/metadata/md5-cache/dev-rust/sys_util-0.1.0-r101
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60 >=dev-rust/libc-0.2.44:= =dev-rust/quote-1*:= =dev-rust/proc-macro2-1*:= =dev-rust/syn-1*:= dev-rust/data_model:= dev-rust/sync:= dev-rust/syscall_defines:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Small system utility modules for usage by other modules.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/sys_util
-IUSE=test cros_host cros_workon_tree_5b0406abafbaf80bef8ae572ff80725492f14989 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r101
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=866c78975facfd03a37a4352d08f1781
diff --git a/metadata/md5-cache/dev-rust/sys_util-0.1.0-r117 b/metadata/md5-cache/dev-rust/sys_util-0.1.0-r117
new file mode 100644
index 0000000..6cb299a
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/sys_util-0.1.0-r117
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60 =dev-rust/android_log-sys-0.2*:= >=dev-rust/libc-0.2.44:= =dev-rust/quote-1*:= =dev-rust/proc-macro2-1*:= =dev-rust/syn-1*:= dev-rust/data_model:= dev-rust/sync:= dev-rust/syscall_defines:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Small system utility modules for usage by other modules.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/sys_util
+IUSE=test cros_host cros_workon_tree_391c412d21a72fefaa88abac05d8ba5fb46b0e4f cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r117
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6a045537780eec74dabcc558a09776dc
diff --git a/metadata/md5-cache/dev-rust/sys_util-9999 b/metadata/md5-cache/dev-rust/sys_util-9999
index 9b36270..1a11eb08 100644
--- a/metadata/md5-cache/dev-rust/sys_util-9999
+++ b/metadata/md5-cache/dev-rust/sys_util-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60 >=dev-rust/libc-0.2.44:= =dev-rust/quote-1*:= =dev-rust/proc-macro2-1*:= =dev-rust/syn-1*:= dev-rust/data_model:= dev-rust/sync:= dev-rust/syscall_defines:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
+DEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60 =dev-rust/android_log-sys-0.2*:= >=dev-rust/libc-0.2.44:= =dev-rust/quote-1*:= =dev-rust/proc-macro2-1*:= =dev-rust/syn-1*:= dev-rust/data_model:= dev-rust/sync:= dev-rust/syscall_defines:= dev-rust/tempfile:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Small system utility modules for usage by other modules.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/sys_util
@@ -11,5 +11,5 @@
 RDEPEND=sys-libs/libcap:= !!<=dev-rust/sys_util-0.1.0-r60
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8f27ae9fae0ecb8cb55265d6f92b4083
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=01da2c72995a5ed9bdb75ec7c7ff8517
diff --git a/metadata/md5-cache/dev-rust/syscall_defines-0.1.0-r8 b/metadata/md5-cache/dev-rust/syscall_defines-0.1.0-r8
index c635bac..0e5af99 100644
--- a/metadata/md5-cache/dev-rust/syscall_defines-0.1.0-r8
+++ b/metadata/md5-cache/dev-rust/syscall_defines-0.1.0-r8
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/syscall_defines-0.1.0-r2
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/0.1.0-r8
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f325158225454989ece06aa8589006ed
diff --git a/metadata/md5-cache/dev-rust/syscall_defines-9999 b/metadata/md5-cache/dev-rust/syscall_defines-9999
index 3ff8771..cc7ec74 100644
--- a/metadata/md5-cache/dev-rust/syscall_defines-9999
+++ b/metadata/md5-cache/dev-rust/syscall_defines-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/syscall_defines-0.1.0-r2
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8378f74efac2c00f1949086ad2ff514d
diff --git a/metadata/md5-cache/dev-rust/syslog-4.0.0 b/metadata/md5-cache/dev-rust/syslog-4.0.0
deleted file mode 100644
index b1e920e..0000000
--- a/metadata/md5-cache/dev-rust/syslog-4.0.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
-DEPEND=>=dev-rust/error-chain-0.11.0:= >=dev-rust/libc-0.2.0:= >=dev-rust/log-0.4.1:= >=dev-rust/time-0.1.0:= >=dev-rust/unix_socket-0.5.0:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Send log messages to syslog.
-EAPI=6
-HOMEPAGE=https://github.com/Geal/rust-syslog
-IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=|| ( MIT Apache-2.0 )
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=4.0.0/r0
-SRC_URI=https://crates.io/api/v1/crates/syslog/4.0.0/download -> syslog-4.0.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ce7be84a746337382501d711f95c8713
diff --git a/metadata/md5-cache/dev-rust/syslog-4.0.1-r1 b/metadata/md5-cache/dev-rust/syslog-4.0.1-r1
new file mode 100644
index 0000000..6232fcf
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/syslog-4.0.1-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/error-chain-0.11.0:= >=dev-rust/libc-0.2.0:= >=dev-rust/log-0.4.1:= >=dev-rust/time-0.1.0:= >=dev-rust/unix_socket-0.5.0:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Send log messages to syslog.
+EAPI=7
+HOMEPAGE=https://github.com/Geal/rust-syslog
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=4.0.1/r1
+SRC_URI=https://crates.io/api/v1/crates/syslog/4.0.1/download -> syslog-4.0.1.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d687fec7f98917aff922afd0ac9fda2c
diff --git a/metadata/md5-cache/dev-rust/tempdir-0.3.7 b/metadata/md5-cache/dev-rust/tempdir-0.3.7
index d7d5ea9..a5bbc35 100644
--- a/metadata/md5-cache/dev-rust/tempdir-0.3.7
+++ b/metadata/md5-cache/dev-rust/tempdir-0.3.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/rand-0.4*:= =dev-rust/remove_dir_all-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library for creating a temporary directory and deleting its entire contents when the directory is dropped.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.7/r0
 SRC_URI=https://crates.io/api/v1/crates/tempdir/0.3.7/download -> tempdir-0.3.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5645057a0eb0b3511cac4aef9657f5b0
diff --git a/metadata/md5-cache/dev-rust/tempdir-0.3.7-r2 b/metadata/md5-cache/dev-rust/tempdir-0.3.7-r2
index 6789351..a15bd397 100644
--- a/metadata/md5-cache/dev-rust/tempdir-0.3.7-r2
+++ b/metadata/md5-cache/dev-rust/tempdir-0.3.7-r2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/rand-0.4*:= =dev-rust/remove_dir_all-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A Rust library for creating a temporary directory and deleting its entire contents when the directory is dropped.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.7/r2
 SRC_URI=https://crates.io/api/v1/crates/tempdir/0.3.7/download -> tempdir-0.3.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=5645057a0eb0b3511cac4aef9657f5b0
diff --git a/metadata/md5-cache/dev-rust/tempfile-3.0.7-r5 b/metadata/md5-cache/dev-rust/tempfile-3.0.7-r5
deleted file mode 100644
index 43e4bc0..0000000
--- a/metadata/md5-cache/dev-rust/tempfile-3.0.7-r5
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND==dev-rust/cfg-if-0.1*:= >=dev-rust/libc-0.2.27:= =dev-rust/rand-0.6*:= =dev-rust/redox_syscall-0.1*:= =dev-rust/remove_dir_all-0.5*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=A library for managing temporary files and directories
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/tempfile
-IUSE=test cros_host cros_workon_tree_5b534e005508aab07c044f866ed002dcddb413ef cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/tempfile-3.0.7-r2
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/3.0.7-r5
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4b729233f5b193b7a484c592bdb636d1
diff --git a/metadata/md5-cache/dev-rust/tempfile-3.0.7-r7 b/metadata/md5-cache/dev-rust/tempfile-3.0.7-r7
new file mode 100644
index 0000000..f5e2c6b
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/tempfile-3.0.7-r7
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND==dev-rust/cfg-if-0.1*:= >=dev-rust/libc-0.2.27:= =dev-rust/rand-0.6*:= =dev-rust/redox_syscall-0.1*:= =dev-rust/remove_dir_all-0.5*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=A library for managing temporary files and directories
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/+/master/crosvm/tempfile
+IUSE=test cros_host cros_workon_tree_4d1019d4ba75c8d6c18310a8bce67bcda0eceab5 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/tempfile-3.0.7-r2
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/3.0.7-r7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=890b100a1931587508edcbb8052ca93b
diff --git a/metadata/md5-cache/dev-rust/tempfile-9999 b/metadata/md5-cache/dev-rust/tempfile-9999
index c919bb7..05c0f78 100644
--- a/metadata/md5-cache/dev-rust/tempfile-9999
+++ b/metadata/md5-cache/dev-rust/tempfile-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/tempfile-3.0.7-r2
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a56ccfd3e051f24649a902bbcba9a955
diff --git a/metadata/md5-cache/dev-rust/term_size-0.3.0 b/metadata/md5-cache/dev-rust/term_size-0.3.0
index 85a547a..50727fc 100644
--- a/metadata/md5-cache/dev-rust/term_size-0.3.0
+++ b/metadata/md5-cache/dev-rust/term_size-0.3.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty term_size crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=611c760b759231009c177190d157e6d3
diff --git a/metadata/md5-cache/dev-rust/termcolor-0.3.6 b/metadata/md5-cache/dev-rust/termcolor-0.3.6
index 3a074d7..09aeb84 100644
--- a/metadata/md5-cache/dev-rust/termcolor-0.3.6
+++ b/metadata/md5-cache/dev-rust/termcolor-0.3.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=~dev-rust/wincolor-0.1.6:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple cross platform library for writing colored text to a terminal.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.6/r0
 SRC_URI=https://crates.io/api/v1/crates/termcolor/0.3.6/download -> termcolor-0.3.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71a7755655a9ec37cc855c112e23c81b
diff --git a/metadata/md5-cache/dev-rust/termcolor-1.0.4 b/metadata/md5-cache/dev-rust/termcolor-1.0.4
index b0f83b8..73b956f 100644
--- a/metadata/md5-cache/dev-rust/termcolor-1.0.4
+++ b/metadata/md5-cache/dev-rust/termcolor-1.0.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/wincolor-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple cross platform library for writing colored text to a terminal.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.4/r0
 SRC_URI=https://crates.io/api/v1/crates/termcolor/1.0.4/download -> termcolor-1.0.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a33c0cb402f99ca1bea751267cf049c2
diff --git a/metadata/md5-cache/dev-rust/termion-1.5.1 b/metadata/md5-cache/dev-rust/termion-1.5.1
index 983b7d0..caf5541 100644
--- a/metadata/md5-cache/dev-rust/termion-1.5.1
+++ b/metadata/md5-cache/dev-rust/termion-1.5.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/libc-0.2.8:= >=dev-rust/redox_syscall-0.1.0:= >=dev-rust/redox_termios-0.1.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A bindless library for manipulating terminals.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.5.1/r0
 SRC_URI=https://crates.io/api/v1/crates/termion/1.5.1/download -> termion-1.5.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f9354af9829acd07cb8cbc4cedf1941b
diff --git a/metadata/md5-cache/dev-rust/textwrap-0.11.0 b/metadata/md5-cache/dev-rust/textwrap-0.11.0
index d808c97..27b91b9 100644
--- a/metadata/md5-cache/dev-rust/textwrap-0.11.0
+++ b/metadata/md5-cache/dev-rust/textwrap-0.11.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/unicode-width-0.1*:= dev-rust/hyphenation:= dev-rust/term_size:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Word wrapping text
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.11.0/r0
 SRC_URI=https://crates.io/api/v1/crates/textwrap/0.11.0/download -> textwrap-0.11.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cebf716bd89565e88e958c15b2bce15a
diff --git a/metadata/md5-cache/dev-rust/thiserror-1.0.20 b/metadata/md5-cache/dev-rust/thiserror-1.0.20
new file mode 100644
index 0000000..6860adf
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/thiserror-1.0.20
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=~dev-rust/thiserror-impl-1.0.20:= >=virtual/rust-1.39.0:=
+DESCRIPTION=A convenient derive macro for the standard library's std::error::Error trait.
+EAPI=7
+HOMEPAGE=https://github.com/dtolnay/thiserror
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.20/r0
+SRC_URI=https://crates.io/api/v1/crates/thiserror/1.0.20/download -> thiserror-1.0.20.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0680505ed96d3b01a4724e61bda744d7
diff --git a/metadata/md5-cache/dev-rust/thiserror-impl-1.0.20 b/metadata/md5-cache/dev-rust/thiserror-impl-1.0.20
new file mode 100644
index 0000000..86f6eb9
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/thiserror-impl-1.0.20
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= >=dev-rust/syn-1.0.11:= <dev-rust/syn-2.0 >=virtual/rust-1.39.0:=
+DESCRIPTION=Implementation detail of the thiserror crate
+EAPI=7
+HOMEPAGE=https://github.com/thiserror/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=1.0.20/r0
+SRC_URI=https://crates.io/api/v1/crates/thiserror-impl/1.0.20/download -> thiserror-impl-1.0.20.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1bd5fb985067c60eb2b257d3d107f071
diff --git a/metadata/md5-cache/dev-rust/thread-id-3.3.0 b/metadata/md5-cache/dev-rust/thread-id-3.3.0
index 553354f..6663a9b 100644
--- a/metadata/md5-cache/dev-rust/thread-id-3.3.0
+++ b/metadata/md5-cache/dev-rust/thread-id-3.3.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/libc-0.2*:= =dev-rust/redox_syscall-0.1*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Get a unique ID for the current thread in Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=3.3.0/r0
 SRC_URI=https://crates.io/api/v1/crates/thread-id/3.3.0/download -> thread-id-3.3.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2e841f56eefde6a97112215e5ca5f3c7
diff --git a/metadata/md5-cache/dev-rust/thread_local-0.3.6 b/metadata/md5-cache/dev-rust/thread_local-0.3.6
index d42c45b..a077e5d 100644
--- a/metadata/md5-cache/dev-rust/thread_local-0.3.6
+++ b/metadata/md5-cache/dev-rust/thread_local-0.3.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/lazy_static-1.0.0:= <dev-rust/lazy_static-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=Per-object thread-local storage.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.6/r0
 SRC_URI=https://crates.io/api/v1/crates/thread_local/0.3.6/download -> thread_local-0.3.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=46aee761516e1d31a536c048573633aa
diff --git a/metadata/md5-cache/dev-rust/threadpool-1.7.1 b/metadata/md5-cache/dev-rust/threadpool-1.7.1
index 10a5046..9e41e05 100644
--- a/metadata/md5-cache/dev-rust/threadpool-1.7.1
+++ b/metadata/md5-cache/dev-rust/threadpool-1.7.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty threadpool crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.7.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/time-0.1.40 b/metadata/md5-cache/dev-rust/time-0.1.40
index f2090c0..a234698 100644
--- a/metadata/md5-cache/dev-rust/time-0.1.40
+++ b/metadata/md5-cache/dev-rust/time-0.1.40
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/libc-0.2.1:= >=dev-rust/log-0.4.0:= >=dev-rust/redox_syscall-0.1.0:= >=dev-rust/winapi-0.3.0:= >=dev-rust/rustc-serialize-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Utilities for working with time-related functions in Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.40/r0
 SRC_URI=https://crates.io/api/v1/crates/time/0.1.40/download -> time-0.1.40.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=826a8f80353f772fc90d513b9411b735
diff --git a/metadata/md5-cache/dev-rust/tiny_http-0.7.0 b/metadata/md5-cache/dev-rust/tiny_http-0.7.0
new file mode 100644
index 0000000..b862e69
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/tiny_http-0.7.0
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/ascii-1*:= =dev-rust/chunked_transfer-1*:= =dev-rust/url-2*:= =dev-rust/chrono-0.4*:= =dev-rust/log-0.4*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Low level HTTP server library
+EAPI=7
+HOMEPAGE=https://docs.rs/crate/tiny_http/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.7.0/r0
+SRC_URI=https://crates.io/api/v1/crates/tiny_http/0.7.0/download -> tiny_http-0.7.0.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=843f415e208c06dd3928af3633200721
diff --git a/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r7 b/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r7
deleted file mode 100644
index b156cb0..0000000
--- a/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r7
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/chromeos-dbus-bindings-rust:= =dev-rust/dbus-0.6*:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust D-Bus bindings for tlsdate.
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tlsdate/+/master/
-IUSE=cros_host cros_workon_tree_d5bedf0d1e651c4e80acc3eec06dedbd31b3d05e cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.24.52-r7
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1a212cfb2f9ea5c035befbbc42321c34
diff --git a/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r9 b/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r9
new file mode 100644
index 0000000..818846f
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/tlsdate_dbus-0.24.52-r9
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust D-Bus bindings for tlsdate.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tlsdate/+/master/
+IUSE=cros_host cros_workon_tree_cc72be195ede90b09a9ae394923ac01be3ce4081 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.24.52-r9
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4ff43529ff74f5e73874e515f59c710a
diff --git a/metadata/md5-cache/dev-rust/tlsdate_dbus-9999 b/metadata/md5-cache/dev-rust/tlsdate_dbus-9999
index 33b4b11..28eb5e7 100644
--- a/metadata/md5-cache/dev-rust/tlsdate_dbus-9999
+++ b/metadata/md5-cache/dev-rust/tlsdate_dbus-9999
@@ -1,7 +1,8 @@
+BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=chromeos-base/chromeos-dbus-bindings-rust:= =dev-rust/dbus-0.6*:= >=virtual/rust-1.39.0:=
+DEPEND=>chromeos-base/chromeos-dbus-bindings-rust-0.24.52-r16:= =dev-rust/dbus-0.8*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Rust D-Bus bindings for tlsdate.
-EAPI=6
+EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/tlsdate/+/master/
 IUSE=cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
 KEYWORDS=~*
@@ -9,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=eea443125885f5a449c15a1f0617871f
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2ab444593ecfa4b61fd534e2c724730a
diff --git a/metadata/md5-cache/dev-rust/tokio-0.1.19 b/metadata/md5-cache/dev-rust/tokio-0.1.19
index 9d2d623..257db39 100644
--- a/metadata/md5-cache/dev-rust/tokio-0.1.19
+++ b/metadata/md5-cache/dev-rust/tokio-0.1.19
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/mio-0.6*:= =dev-rust/num_cpus-1*:= =dev-rust/tokio-async-await-0.1*:= =dev-rust/tokio-codec-0.1*:= =dev-rust/tokio-current-thread-0.1*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/tokio-fs-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/tokio-sync-0.1*:= =dev-rust/tokio-tcp-0.1*:= =dev-rust/tokio-threadpool-0.1*:= =dev-rust/tokio-timer-0.2*:= =dev-rust/tokio-trace-core-0.1*:= =dev-rust/tokio-udp-0.1*:= =dev-rust/tokio-uds-0.2*:= =dev-rust/env_logger-0.5*:= =dev-rust/flate2-1*:= =dev-rust/futures-cpupool-0.1*:= =dev-rust/http-0.1*:= =dev-rust/httparse-1*:= =dev-rust/libc-0.2*:= =dev-rust/serde-1*:= =dev-rust/serde_derive-1*:= =dev-rust/serde_json-1*:= =dev-rust/time-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A runtime for writing reliable, asynchronous, and slim applications with the Rust programming language
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.19/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio/0.1.19/download -> tokio-0.1.19.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a778bc093f4a6a11d73c4919a143a93f
diff --git a/metadata/md5-cache/dev-rust/tokio-async-await-0.1.7 b/metadata/md5-cache/dev-rust/tokio-async-await-0.1.7
index 54e249d..c6a25d5 100644
--- a/metadata/md5-cache/dev-rust/tokio-async-await-0.1.7
+++ b/metadata/md5-cache/dev-rust/tokio-async-await-0.1.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/futures-0.1*:= =dev-rust/tokio-io-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Experimental async/await support for Tokio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.7/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-async-await/0.1.7/download -> tokio-async-await-0.1.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a6e8f6f933895c64f164c30191fc9878
diff --git a/metadata/md5-cache/dev-rust/tokio-buf-0.1.1 b/metadata/md5-cache/dev-rust/tokio-buf-0.1.1
index 29e0616..61528ce 100644
--- a/metadata/md5-cache/dev-rust/tokio-buf-0.1.1
+++ b/metadata/md5-cache/dev-rust/tokio-buf-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bytes-0.4.10:= >=dev-rust/futures-0.1.23:= >=dev-rust/either-1.5:= >=dev-rust/tokio-mock-task-0.1.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Asynchronous stream of byte buffers
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-buf/0.1.1/download -> tokio-buf-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=571cb583ae79566f3a224e0f65138989
diff --git a/metadata/md5-cache/dev-rust/tokio-codec-0.1.1 b/metadata/md5-cache/dev-rust/tokio-codec-0.1.1
index 5cc16ec..9e50ac6 100644
--- a/metadata/md5-cache/dev-rust/tokio-codec-0.1.1
+++ b/metadata/md5-cache/dev-rust/tokio-codec-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/tokio-io-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Utilities for encoding and decoding frames
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-codec/0.1.1/download -> tokio-codec-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fa40aef4f76716b1237b89266c460963
diff --git a/metadata/md5-cache/dev-rust/tokio-core-0.1.17 b/metadata/md5-cache/dev-rust/tokio-core-0.1.17
index 0eebf18..dd5ecbd 100644
--- a/metadata/md5-cache/dev-rust/tokio-core-0.1.17
+++ b/metadata/md5-cache/dev-rust/tokio-core-0.1.17
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.3*:= =dev-rust/futures-0.1*:= =dev-rust/futures-cpupool-0.1*:= =dev-rust/iovec-0.1*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/scoped-tls-0.1*:= =dev-rust/tokio-0.1*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/tokio-timer-0.2*:= =dev-rust/http-0.1*:= =dev-rust/httparse-1.0*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Core I/O and event loop abstraction for asynchronous I/O in Rust built on futures and mio.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.17/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-core/0.1.17/download -> tokio-core-0.1.17.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0ae6c6a59e32dc70165d89f24facb4d0
diff --git a/metadata/md5-cache/dev-rust/tokio-curl-0.1.11 b/metadata/md5-cache/dev-rust/tokio-curl-0.1.11
index e654552..1bc2638 100644
--- a/metadata/md5-cache/dev-rust/tokio-curl-0.1.11
+++ b/metadata/md5-cache/dev-rust/tokio-curl-0.1.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/curl-0.4*:= =dev-rust/env_logger-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/scoped-tls-0.1*:= =dev-rust/slab-0.4*:= =dev-rust/tokio-core-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of an asynchronous HTTP client using futures backed by libcurl.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.11/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-curl/0.1.11/download -> tokio-curl-0.1.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=115e87441fbc415c1a215c73235fd72d
diff --git a/metadata/md5-cache/dev-rust/tokio-curl-0.1.11-r1 b/metadata/md5-cache/dev-rust/tokio-curl-0.1.11-r1
index 1198384..61b7873 100644
--- a/metadata/md5-cache/dev-rust/tokio-curl-0.1.11-r1
+++ b/metadata/md5-cache/dev-rust/tokio-curl-0.1.11-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/curl-0.4*:= =dev-rust/env_logger-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/scoped-tls-0.1*:= =dev-rust/slab-0.4*:= =dev-rust/tokio-core-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=An implementation of an asynchronous HTTP client using futures backed by libcurl.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.11/r1
 SRC_URI=https://crates.io/api/v1/crates/tokio-curl/0.1.11/download -> tokio-curl-0.1.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=115e87441fbc415c1a215c73235fd72d
diff --git a/metadata/md5-cache/dev-rust/tokio-current-thread-0.1.6 b/metadata/md5-cache/dev-rust/tokio-current-thread-0.1.6
index ce7cb4f..28027dc 100644
--- a/metadata/md5-cache/dev-rust/tokio-current-thread-0.1.6
+++ b/metadata/md5-cache/dev-rust/tokio-current-thread-0.1.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/futures-0.1*:= =dev-rust/tokio-executor-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Single threaded executor which manage many tasks concurrently on the current thread
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.6/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-current-thread/0.1.6/download -> tokio-current-thread-0.1.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8a9942685cb1bda00c650b335cc1632b
diff --git a/metadata/md5-cache/dev-rust/tokio-executor-0.1.7 b/metadata/md5-cache/dev-rust/tokio-executor-0.1.7
index d383a0c..a6c930b 100644
--- a/metadata/md5-cache/dev-rust/tokio-executor-0.1.7
+++ b/metadata/md5-cache/dev-rust/tokio-executor-0.1.7
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-utils-0.6*:= =dev-rust/futures-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Future execution primitives
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.7/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-executor/0.1.7/download -> tokio-executor-0.1.7.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4092f7f5fa4315cdbfd12ccfa576a5d9
diff --git a/metadata/md5-cache/dev-rust/tokio-fs-0.1.6 b/metadata/md5-cache/dev-rust/tokio-fs-0.1.6
index d1dfefc..7a2411b 100644
--- a/metadata/md5-cache/dev-rust/tokio-fs-0.1.6
+++ b/metadata/md5-cache/dev-rust/tokio-fs-0.1.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/futures-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-threadpool-0.1*:= =dev-rust/rand-0.6*:= =dev-rust/tempdir-0.3*:= =dev-rust/tempfile-3*:= =dev-rust/tokio-codec-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Asynchronous filesystem manipulation operations
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.6/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-fs/0.1.6/download -> tokio-fs-0.1.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=69fd5f0259d039d60cf55f69f8235b45
diff --git a/metadata/md5-cache/dev-rust/tokio-io-0.1.12 b/metadata/md5-cache/dev-rust/tokio-io-0.1.12
index bc9a3cd..cc98819 100644
--- a/metadata/md5-cache/dev-rust/tokio-io-0.1.12
+++ b/metadata/md5-cache/dev-rust/tokio-io-0.1.12
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/log-0.4*:= =dev-rust/tokio-current-thread-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Core I/O primitives for asynchronous I/O in Rust
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.12/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-io/0.1.12/download -> tokio-io-0.1.12.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0890d9a71ad50becf4513b81cb2679a0
diff --git a/metadata/md5-cache/dev-rust/tokio-io-pool-0.1.5 b/metadata/md5-cache/dev-rust/tokio-io-pool-0.1.5
index 81066ef..eed32d3 100644
--- a/metadata/md5-cache/dev-rust/tokio-io-pool-0.1.5
+++ b/metadata/md5-cache/dev-rust/tokio-io-pool-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty tokio-io-pool crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/tokio-mock-task-0.1.1 b/metadata/md5-cache/dev-rust/tokio-mock-task-0.1.1
index ad82f34..b8539b9 100644
--- a/metadata/md5-cache/dev-rust/tokio-mock-task-0.1.1
+++ b/metadata/md5-cache/dev-rust/tokio-mock-task-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty tokio-mock-task crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/tokio-reactor-0.1.9 b/metadata/md5-cache/dev-rust/tokio-reactor-0.1.9
index 423e5d9..83ce56a 100644
--- a/metadata/md5-cache/dev-rust/tokio-reactor-0.1.9
+++ b/metadata/md5-cache/dev-rust/tokio-reactor-0.1.9
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-utils-0.6*:= =dev-rust/futures-0.1*:= =dev-rust/lazy_static-1*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/num_cpus-1*:= =dev-rust/parking_lot-0.7*:= =dev-rust/slab-0.4*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-sync-0.1*:= =dev-rust/tokio-io-pool-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Event loop that drives Tokio I/O resources
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.9/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-reactor/0.1.9/download -> tokio-reactor-0.1.9.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e24b40e1d0e626bc3f61bbe99d25c2b1
diff --git a/metadata/md5-cache/dev-rust/tokio-sync-0.1.5 b/metadata/md5-cache/dev-rust/tokio-sync-0.1.5
index 68bf8e3..f9c1f6c 100644
--- a/metadata/md5-cache/dev-rust/tokio-sync-0.1.5
+++ b/metadata/md5-cache/dev-rust/tokio-sync-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/fnv-1*:= =dev-rust/futures-0.1*:= =dev-rust/env_logger-0.5*:= =dev-rust/loom-0.1*:= =dev-rust/tokio-mock-task-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Synchronization utilities
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-sync/0.1.5/download -> tokio-sync-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=33caf2567283c8e8dd31461eaeec4603
diff --git a/metadata/md5-cache/dev-rust/tokio-tcp-0.1.3 b/metadata/md5-cache/dev-rust/tokio-tcp-0.1.3
index 28965ec..0053e79 100644
--- a/metadata/md5-cache/dev-rust/tokio-tcp-0.1.3
+++ b/metadata/md5-cache/dev-rust/tokio-tcp-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/iovec-0.1*:= =dev-rust/mio-0.6*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/env_logger-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=TCP bindings for tokio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-tcp/0.1.3/download -> tokio-tcp-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f5a518ea454dc40102202ed661c36701
diff --git a/metadata/md5-cache/dev-rust/tokio-threadpool-0.1.14 b/metadata/md5-cache/dev-rust/tokio-threadpool-0.1.14
index 771570b..195bde3 100644
--- a/metadata/md5-cache/dev-rust/tokio-threadpool-0.1.14
+++ b/metadata/md5-cache/dev-rust/tokio-threadpool-0.1.14
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-deque-0.7*:= =dev-rust/crossbeam-queue-0.1*:= =dev-rust/crossbeam-utils-0.6*:= =dev-rust/futures-0.1*:= =dev-rust/log-0.4*:= =dev-rust/num_cpus-1*:= =dev-rust/rand-0.6*:= =dev-rust/slab-0.4*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/env_logger-0.5*:= =dev-rust/futures-cpupool-0.1*:= =dev-rust/threadpool-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A task scheduler backed by a work-stealing thread pool
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.14/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-threadpool/0.1.14/download -> tokio-threadpool-0.1.14.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fb3182ad41c06dac9a75d7a6ce224713
diff --git a/metadata/md5-cache/dev-rust/tokio-timer-0.2.11 b/metadata/md5-cache/dev-rust/tokio-timer-0.2.11
index 71ea7a0..763b15c 100644
--- a/metadata/md5-cache/dev-rust/tokio-timer-0.2.11
+++ b/metadata/md5-cache/dev-rust/tokio-timer-0.2.11
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/crossbeam-utils-0.6*:= =dev-rust/futures-0.1*:= =dev-rust/slab-0.4*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/rand-0.6*:= =dev-rust/tokio-mock-task-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Timer facilities for Tokio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.11/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-timer/0.2.11/download -> tokio-timer-0.2.11.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6eb4aaad48c007876ff43d35643f2b68
diff --git a/metadata/md5-cache/dev-rust/tokio-trace-core-0.1.0 b/metadata/md5-cache/dev-rust/tokio-trace-core-0.1.0
index bd3cf07..0e3f866 100644
--- a/metadata/md5-cache/dev-rust/tokio-trace-core-0.1.0
+++ b/metadata/md5-cache/dev-rust/tokio-trace-core-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/lazy_static-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Core primitives for tokio-trace
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-trace-core/0.1.0/download -> tokio-trace-core-0.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=964800fd29f9f944b985d7e81ecb5d40
diff --git a/metadata/md5-cache/dev-rust/tokio-udp-0.1.3 b/metadata/md5-cache/dev-rust/tokio-udp-0.1.3
index cc2fae2..1beec0b 100644
--- a/metadata/md5-cache/dev-rust/tokio-udp-0.1.3
+++ b/metadata/md5-cache/dev-rust/tokio-udp-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/tokio-codec-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/env_logger-0.5*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=UDP bindings for tokio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-udp/0.1.3/download -> tokio-udp-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6cefec8acdcca9a6fdd8bfe9801ba070
diff --git a/metadata/md5-cache/dev-rust/tokio-uds-0.2.5 b/metadata/md5-cache/dev-rust/tokio-uds-0.2.5
index a62df36..e1ad938 100644
--- a/metadata/md5-cache/dev-rust/tokio-uds-0.2.5
+++ b/metadata/md5-cache/dev-rust/tokio-uds-0.2.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/bytes-0.4*:= =dev-rust/futures-0.1*:= =dev-rust/iovec-0.1*:= =dev-rust/libc-0.2*:= =dev-rust/log-0.4*:= =dev-rust/mio-0.6*:= =dev-rust/mio-uds-0.6*:= =dev-rust/tokio-codec-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/tempfile-3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Unix Domain sockets for Tokio
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.5/r0
 SRC_URI=https://crates.io/api/v1/crates/tokio-uds/0.2.5/download -> tokio-uds-0.2.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=32b9cfe9fafd648820af9b47dcd39449
diff --git a/metadata/md5-cache/dev-rust/toml-0.5.1 b/metadata/md5-cache/dev-rust/toml-0.5.1
index a5c9c16..8d3d642 100644
--- a/metadata/md5-cache/dev-rust/toml-0.5.1
+++ b/metadata/md5-cache/dev-rust/toml-0.5.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/serde-1.0:= >=dev-rust/linked-hash-map-0.5.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A TOML decoder and encoder for Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.1/r0
 SRC_URI=https://crates.io/api/v1/crates/toml/0.5.1/download -> toml-0.5.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cf38af70435e678ddaf04e7f23826002
diff --git a/metadata/md5-cache/dev-rust/trace_events-0.1.0-r5 b/metadata/md5-cache/dev-rust/trace_events-0.1.0-r5
deleted file mode 100644
index 46207eb..0000000
--- a/metadata/md5-cache/dev-rust/trace_events-0.1.0-r5
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND==dev-rust/libc-0.2*:= =dev-rust/criterion-0.2*:= >=dev-rust/serde_json-1:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Infrastructure for clients to emit trace events.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trace_events/
-IUSE=test cros_host cros_workon_tree_e509681943a4a652c4575e6da2260621c04c8500 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!!<=dev-rust/trace_events-0.1.0-r2
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r5
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c145fb7e03cf7100f774c1875edd434c
diff --git a/metadata/md5-cache/dev-rust/trace_events-0.1.0-r6 b/metadata/md5-cache/dev-rust/trace_events-0.1.0-r6
new file mode 100644
index 0000000..714a132
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/trace_events-0.1.0-r6
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND==dev-rust/libc-0.2*:= =dev-rust/criterion-0.2*:= >=dev-rust/serde_json-1:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Infrastructure for clients to emit trace events.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/trace_events/
+IUSE=test cros_host cros_workon_tree_e509681943a4a652c4575e6da2260621c04c8500 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!!<=dev-rust/trace_events-0.1.0-r2
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r6
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2696c1c8d30941ee2dddbb6df13284a1
diff --git a/metadata/md5-cache/dev-rust/trace_events-9999 b/metadata/md5-cache/dev-rust/trace_events-9999
index 69a1c09..63941f4 100644
--- a/metadata/md5-cache/dev-rust/trace_events-9999
+++ b/metadata/md5-cache/dev-rust/trace_events-9999
@@ -11,5 +11,5 @@
 RDEPEND=!!<=dev-rust/trace_events-0.1.0-r2
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6cde1aa4856f48e08ffd664916fe4f86
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=172277d45a95740079fec3f954fff9ce
diff --git a/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3 b/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3
index 5f4c9d2..78f08a9 100644
--- a/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3
+++ b/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/byteorder-1*:= =dev-rust/enum-as-inner-0.2*:= =dev-rust/failure-0.1*:= =dev-rust/futures-0.1*:= =dev-rust/idna-0.1*:= =dev-rust/lazy_static-1*:= =dev-rust/log-0.4*:= =dev-rust/rand-0.6*:= =dev-rust/smallvec-0.6*:= =dev-rust/socket2-0.3*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/tokio-tcp-0.1*:= =dev-rust/tokio-timer-0.2*:= =dev-rust/tokio-udp-0.1*:= =dev-rust/url-1*:= =dev-rust/data-encoding-2*:= =dev-rust/openssl-0.10*:= =dev-rust/ring-0.14*:= =dev-rust/serde-1*:= =dev-rust/untrusted-0.6*:= =dev-rust/env_logger-0.6*:= =dev-rust/tokio-0.1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=DNS protocol library and implementation for Trust-DNS
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.3/r0
 SRC_URI=https://crates.io/api/v1/crates/trust-dns-proto/0.7.3/download -> trust-dns-proto-0.7.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bebd639cdeb3e397ba98a8bff890284a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b3c5a54e108814fc8c9875ecd402e94e
diff --git a/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3-r3 b/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3-r3
new file mode 100644
index 0000000..7df2ff0
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/trust-dns-proto-0.7.3-r3
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND==dev-rust/byteorder-1*:= =dev-rust/enum-as-inner-0.2*:= =dev-rust/failure-0.1*:= =dev-rust/futures-0.1*:= =dev-rust/idna-0.1*:= =dev-rust/lazy_static-1*:= =dev-rust/log-0.4*:= =dev-rust/rand-0.6*:= =dev-rust/smallvec-0.6*:= =dev-rust/socket2-0.3*:= =dev-rust/tokio-executor-0.1*:= =dev-rust/tokio-io-0.1*:= =dev-rust/tokio-reactor-0.1*:= =dev-rust/tokio-tcp-0.1*:= =dev-rust/tokio-timer-0.2*:= =dev-rust/tokio-udp-0.1*:= =dev-rust/url-1*:= =dev-rust/data-encoding-2*:= =dev-rust/openssl-0.10*:= =dev-rust/ring-0.14*:= =dev-rust/serde-1*:= =dev-rust/untrusted-0.6*:= =dev-rust/env_logger-0.6*:= =dev-rust/tokio-0.1*:= >=virtual/rust-1.39.0:=
+DESCRIPTION=DNS protocol library and implementation for Trust-DNS
+EAPI=6
+HOMEPAGE=http://www.trust-dns.org/index.html
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.7.3/r3
+SRC_URI=https://crates.io/api/v1/crates/trust-dns-proto/0.7.3/download -> trust-dns-proto-0.7.3.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b3c5a54e108814fc8c9875ecd402e94e
diff --git a/metadata/md5-cache/dev-rust/try-lock-0.2.2 b/metadata/md5-cache/dev-rust/try-lock-0.2.2
index 7fbc593..9bbb580 100644
--- a/metadata/md5-cache/dev-rust/try-lock-0.2.2
+++ b/metadata/md5-cache/dev-rust/try-lock-0.2.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A light-weight lock guarded by an atomic boolean.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.2/r0
 SRC_URI=https://crates.io/api/v1/crates/try-lock/0.2.2/download -> try-lock-0.2.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a74949c691cb6e85a9d7422c5b12a5b2
diff --git a/metadata/md5-cache/dev-rust/ucd-util-0.1.3 b/metadata/md5-cache/dev-rust/ucd-util-0.1.3
index 5fd703c..b4af5de 100644
--- a/metadata/md5-cache/dev-rust/ucd-util-0.1.3
+++ b/metadata/md5-cache/dev-rust/ucd-util-0.1.3
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=A small utility library for working with the Unicode character database.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.3/r0
 SRC_URI=https://crates.io/api/v1/crates/ucd-util/0.1.3/download -> ucd-util-0.1.3.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=960bc995639964fcf318d0c60f78732f
diff --git a/metadata/md5-cache/dev-rust/unicase-2.4.0 b/metadata/md5-cache/dev-rust/unicase-2.4.0
index 69e14a1..c9b616f 100644
--- a/metadata/md5-cache/dev-rust/unicase-2.4.0
+++ b/metadata/md5-cache/dev-rust/unicase-2.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty unicase crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.4.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/unicode-bidi-0.3.4 b/metadata/md5-cache/dev-rust/unicode-bidi-0.3.4
index fd329a0..50b931a 100644
--- a/metadata/md5-cache/dev-rust/unicode-bidi-0.3.4
+++ b/metadata/md5-cache/dev-rust/unicode-bidi-0.3.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/matches-0.1*:= =dev-rust/flame-0.1*:= =dev-rust/flamer-0.1*:= =dev-rust/serde-1*:= =dev-rust/serde_test-1*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Implementation of the Unicode Bidirectional Algorithm
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.4/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-bidi/0.3.4/download -> unicode-bidi-0.3.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4bb4d7ea16db1e0822146a7a1d8f8cc3
diff --git a/metadata/md5-cache/dev-rust/unicode-normalization-0.1.8 b/metadata/md5-cache/dev-rust/unicode-normalization-0.1.8
index 6c21097..7112e8c 100644
--- a/metadata/md5-cache/dev-rust/unicode-normalization-0.1.8
+++ b/metadata/md5-cache/dev-rust/unicode-normalization-0.1.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/smallvec-0.6*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Unicode character composition and decomposition utilities
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.8/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-normalization/0.1.8/download -> unicode-normalization-0.1.8.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d2f03972966fda993b7579a9208909c1
diff --git a/metadata/md5-cache/dev-rust/unicode-segmentation-1.5.0 b/metadata/md5-cache/dev-rust/unicode-segmentation-1.5.0
index f3578d5..9bb978e 100644
--- a/metadata/md5-cache/dev-rust/unicode-segmentation-1.5.0
+++ b/metadata/md5-cache/dev-rust/unicode-segmentation-1.5.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.5.0/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-segmentation/1.5.0/download -> unicode-segmentation-1.5.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4be712a5d5897506e3a7f5c13cadf51d
diff --git a/metadata/md5-cache/dev-rust/unicode-width-0.1.5 b/metadata/md5-cache/dev-rust/unicode-width-0.1.5
index 4e40ce8..aab9ec6 100644
--- a/metadata/md5-cache/dev-rust/unicode-width-0.1.5
+++ b/metadata/md5-cache/dev-rust/unicode-width-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Determine displayed width of 'char' and 'str' types according to Unicode Standard Annex #11 rules
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-width/0.1.5/download -> unicode-width-0.1.5.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=454859fade96406028388b86fdfa3b0a
diff --git a/metadata/md5-cache/dev-rust/unicode-xid-0.1.0 b/metadata/md5-cache/dev-rust/unicode-xid-0.1.0
index 2c580e5..b4bc72d 100644
--- a/metadata/md5-cache/dev-rust/unicode-xid-0.1.0
+++ b/metadata/md5-cache/dev-rust/unicode-xid-0.1.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Determines whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.0/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-xid/0.1.0/download -> unicode-xid-0.1.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=587c9313949826bc56180f397b1b754d
diff --git a/metadata/md5-cache/dev-rust/unicode-xid-0.2.0 b/metadata/md5-cache/dev-rust/unicode-xid-0.2.0
index e0032cf..8576d87 100644
--- a/metadata/md5-cache/dev-rust/unicode-xid-0.2.0
+++ b/metadata/md5-cache/dev-rust/unicode-xid-0.2.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Determine if a char is a valid identifier for a parser and/or lexer according to Unicode Standard Annex #31 rules.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.0/r0
 SRC_URI=https://crates.io/api/v1/crates/unicode-xid/0.2.0/download -> unicode-xid-0.2.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8ee881ad43a2f02afa08b035d13f98b3
diff --git a/metadata/md5-cache/dev-rust/unix_socket-0.5.0 b/metadata/md5-cache/dev-rust/unix_socket-0.5.0
index 677f2b7..ba67c982 100644
--- a/metadata/md5-cache/dev-rust/unix_socket-0.5.0
+++ b/metadata/md5-cache/dev-rust/unix_socket-0.5.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/cfg-if-0.1.0:= >=dev-rust/libc-0.2.1:= >=dev-rust/tempdir-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Support for Unix domain socket clients and servers.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.5.0/r0
 SRC_URI=https://crates.io/api/v1/crates/unix_socket/0.5.0/download -> unix_socket-0.5.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e02db72fd402939ed4ea6411b039a16f
diff --git a/metadata/md5-cache/dev-rust/untrusted-0.6.2 b/metadata/md5-cache/dev-rust/untrusted-0.6.2
index 7f3cead..24b0e49 100644
--- a/metadata/md5-cache/dev-rust/untrusted-0.6.2
+++ b/metadata/md5-cache/dev-rust/untrusted-0.6.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty untrusted crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.6.2/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/url-1.7.2 b/metadata/md5-cache/dev-rust/url-1.7.2
index 11befb4..57c1a32 100644
--- a/metadata/md5-cache/dev-rust/url-1.7.2
+++ b/metadata/md5-cache/dev-rust/url-1.7.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/idna-0.1*:= =dev-rust/matches-0.1*:= =dev-rust/percent-encoding-1*:= =dev-rust/encoding-0.2*:= =dev-rust/heapsize-0.4*:= =dev-rust/rustc-serialize-0.3*:= =dev-rust/serde-0.8*:= =dev-rust/bencher-0.1*:= =dev-rust/rustc-test-0.3*:= =dev-rust/serde_json-0.8*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=URL library for Rust, based on the URL Standard
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.7.2/r0
 SRC_URI=https://crates.io/api/v1/crates/url/1.7.2/download -> url-1.7.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=542ef9d0180d5f1d919074b7a180ba4f
diff --git a/metadata/md5-cache/dev-rust/url-2.0.0 b/metadata/md5-cache/dev-rust/url-2.0.0
index 4f06029..b93c1ef 100644
--- a/metadata/md5-cache/dev-rust/url-2.0.0
+++ b/metadata/md5-cache/dev-rust/url-2.0.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty url crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.0.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/utf8-ranges-1.0.4 b/metadata/md5-cache/dev-rust/utf8-ranges-1.0.4
index 7722ec0..0d328fb 100644
--- a/metadata/md5-cache/dev-rust/utf8-ranges-1.0.4
+++ b/metadata/md5-cache/dev-rust/utf8-ranges-1.0.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=DEPRECATED. Use regex-syntax::utf8 submodule instead.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.4/r0
 SRC_URI=https://crates.io/api/v1/crates/utf8-ranges/1.0.4/download -> utf8-ranges-1.0.4.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d5912f223591d9280a0337da4bd0d63d
diff --git a/metadata/md5-cache/dev-rust/utf8parse-0.1.1 b/metadata/md5-cache/dev-rust/utf8parse-0.1.1
index 4584701..4b24bb6 100644
--- a/metadata/md5-cache/dev-rust/utf8parse-0.1.1
+++ b/metadata/md5-cache/dev-rust/utf8parse-0.1.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Table-driven UTF-8 parser.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.1/r0
 SRC_URI=https://crates.io/api/v1/crates/utf8parse/0.1.1/download -> utf8parse-0.1.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fc36fe8cb4e15123522181cc7a578678
diff --git a/metadata/md5-cache/dev-rust/uuid-0.7.4 b/metadata/md5-cache/dev-rust/uuid-0.7.4
index d34f1e7..24c4732 100644
--- a/metadata/md5-cache/dev-rust/uuid-0.7.4
+++ b/metadata/md5-cache/dev-rust/uuid-0.7.4
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty uuid crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.7.4/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/vcpkg-0.2.6 b/metadata/md5-cache/dev-rust/vcpkg-0.2.6
index e28a794..313ff9c 100644
--- a/metadata/md5-cache/dev-rust/vcpkg-0.2.6
+++ b/metadata/md5-cache/dev-rust/vcpkg-0.2.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/lazy_static-1*:= >=dev-rust/tempdir-0.3.7:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This is a helper for finding native MSVC ABI libraries in a Vcpkg installation from cargo build scripts.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.6/r0
 SRC_URI=https://crates.io/api/v1/crates/vcpkg/0.2.6/download -> vcpkg-0.2.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fea64c76ce8c0ab49f1c0d778a9177e5
diff --git a/metadata/md5-cache/dev-rust/vec_map-0.8.1 b/metadata/md5-cache/dev-rust/vec_map-0.8.1
index b021277..2a98d18 100644
--- a/metadata/md5-cache/dev-rust/vec_map-0.8.1
+++ b/metadata/md5-cache/dev-rust/vec_map-0.8.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/serde-1.0.0:= <dev-rust/serde-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple map based on a vector for small integer keys.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.1/r0
 SRC_URI=https://crates.io/api/v1/crates/vec_map/0.8.1/download -> vec_map-0.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9366846ad1ff005954a008fefa0322c1
diff --git a/metadata/md5-cache/dev-rust/vec_map-0.8.1-r1 b/metadata/md5-cache/dev-rust/vec_map-0.8.1-r1
index 38b5eef..109fd60 100644
--- a/metadata/md5-cache/dev-rust/vec_map-0.8.1-r1
+++ b/metadata/md5-cache/dev-rust/vec_map-0.8.1-r1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/serde-1.0.0:= <dev-rust/serde-2.0.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple map based on a vector for small integer keys.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.8.1/r1
 SRC_URI=https://crates.io/api/v1/crates/vec_map/0.8.1/download -> vec_map-0.8.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9366846ad1ff005954a008fefa0322c1
diff --git a/metadata/md5-cache/dev-rust/version_check-0.1.5 b/metadata/md5-cache/dev-rust/version_check-0.1.5
index 7960551..b6807bd 100644
--- a/metadata/md5-cache/dev-rust/version_check-0.1.5
+++ b/metadata/md5-cache/dev-rust/version_check-0.1.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty version_check crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cc5eff08d638c8fe9b1142a1087f20b7
diff --git a/metadata/md5-cache/dev-rust/void-1.0.2 b/metadata/md5-cache/dev-rust/void-1.0.2
index 26c11a5..288f40a 100644
--- a/metadata/md5-cache/dev-rust/void-1.0.2
+++ b/metadata/md5-cache/dev-rust/void-1.0.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=The uninhabited void type for use in statically impossible cases.
 EAPI=7
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.2/r0
 SRC_URI=https://crates.io/api/v1/crates/void/1.0.2/download -> void-1.0.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ac82e3a5c83fc235af862be3d14ac113
diff --git a/metadata/md5-cache/dev-rust/walkdir-2.2.5 b/metadata/md5-cache/dev-rust/walkdir-2.2.5
index 37e3546..c8e1895 100644
--- a/metadata/md5-cache/dev-rust/walkdir-2.2.5
+++ b/metadata/md5-cache/dev-rust/walkdir-2.2.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty walkdir crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=2.2.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3216b88f05a479ae38768636000c5f30
diff --git a/metadata/md5-cache/dev-rust/want-0.2.0 b/metadata/md5-cache/dev-rust/want-0.2.0
index 3c25357..e426774 100644
--- a/metadata/md5-cache/dev-rust/want-0.2.0
+++ b/metadata/md5-cache/dev-rust/want-0.2.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/futures-0.1:= >=dev-rust/log-0.4:= >=dev-rust/try-lock-0.2:= >=virtual/rust-1.39.0:=
 DESCRIPTION=Detect when another Future wants a result.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.0/r0
 SRC_URI=https://crates.io/api/v1/crates/want/0.2.0/download -> want-0.2.0.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=45904c3b43e35e7446bffc2f68bbc86b
diff --git a/metadata/md5-cache/dev-rust/wasm-bindgen-0.2.37 b/metadata/md5-cache/dev-rust/wasm-bindgen-0.2.37
index 91c5977..14afb1e 100644
--- a/metadata/md5-cache/dev-rust/wasm-bindgen-0.2.37
+++ b/metadata/md5-cache/dev-rust/wasm-bindgen-0.2.37
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty wasm-bindgen crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.37/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/winapi-0.2.8 b/metadata/md5-cache/dev-rust/winapi-0.2.8
index 4033b45..796af7b 100644
--- a/metadata/md5-cache/dev-rust/winapi-0.2.8
+++ b/metadata/md5-cache/dev-rust/winapi-0.2.8
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty winapi crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=|| ( MIT Apache-2.0 )
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.8/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a24171f2ba7b7f5d00b155293ff5debe
diff --git a/metadata/md5-cache/dev-rust/winapi-0.3.6 b/metadata/md5-cache/dev-rust/winapi-0.3.6
index 663a016..ec62d85 100644
--- a/metadata/md5-cache/dev-rust/winapi-0.3.6
+++ b/metadata/md5-cache/dev-rust/winapi-0.3.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/winapi-i686-pc-windows-gnu-0.4.0:= >=dev-rust/winapi-x86_64-pc-windows-gnu-0.4.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides raw FFI bindings to all of Windows API.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.6/r0
 SRC_URI=https://crates.io/api/v1/crates/winapi/0.3.6/download -> winapi-0.3.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a4a252e1d68938347b8c797fd0b4e630
diff --git a/metadata/md5-cache/dev-rust/winapi-i686-pc-windows-gnu-0.4.0 b/metadata/md5-cache/dev-rust/winapi-i686-pc-windows-gnu-0.4.0
index 0524797..af99731 100644
--- a/metadata/md5-cache/dev-rust/winapi-i686-pc-windows-gnu-0.4.0
+++ b/metadata/md5-cache/dev-rust/winapi-i686-pc-windows-gnu-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty winapi-i686-pc-windows-gnu crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/winapi-util-0.1.2 b/metadata/md5-cache/dev-rust/winapi-util-0.1.2
index ec98d1d..b787c57 100644
--- a/metadata/md5-cache/dev-rust/winapi-util-0.1.2
+++ b/metadata/md5-cache/dev-rust/winapi-util-0.1.2
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/winapi-0.3*:= >=virtual/rust-1.39.0:=
 DESCRIPTION=This crate provides a smattering of safe wrappers around various parts of the winapi crate.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.2/r0
 SRC_URI=https://crates.io/api/v1/crates/winapi-util/0.1.2/download -> winapi-util-0.1.2.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c648456c44e89798fa2fcdec17015bfc
diff --git a/metadata/md5-cache/dev-rust/winapi-x86_64-pc-windows-gnu-0.4.0 b/metadata/md5-cache/dev-rust/winapi-x86_64-pc-windows-gnu-0.4.0
index 1dca8c5..91c1dc4 100644
--- a/metadata/md5-cache/dev-rust/winapi-x86_64-pc-windows-gnu-0.4.0
+++ b/metadata/md5-cache/dev-rust/winapi-x86_64-pc-windows-gnu-0.4.0
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty winapi-x86_64-pc-windows-gnu crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.4.0/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b459f025504105b3b301bb8096b60267
diff --git a/metadata/md5-cache/dev-rust/wincolor-0.1.6 b/metadata/md5-cache/dev-rust/wincolor-0.1.6
index 28e1c54..7259130 100644
--- a/metadata/md5-cache/dev-rust/wincolor-0.1.6
+++ b/metadata/md5-cache/dev-rust/wincolor-0.1.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/winapi-0.3.0:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple Windows specific API for controlling text color in a Windows console.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.1.6/r0
 SRC_URI=https://crates.io/api/v1/crates/wincolor/0.1.6/download -> wincolor-0.1.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4987a56aa9c6a796d607ea96d3f843a1
diff --git a/metadata/md5-cache/dev-rust/wincolor-1.0.1 b/metadata/md5-cache/dev-rust/wincolor-1.0.1
index e7b5e35..456cd43 100644
--- a/metadata/md5-cache/dev-rust/wincolor-1.0.1
+++ b/metadata/md5-cache/dev-rust/wincolor-1.0.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND==dev-rust/winapi-0.3*:= >=dev-rust/winapi-util-0.1.1:= >=virtual/rust-1.39.0:=
 DESCRIPTION=A simple Windows specific API for controlling text color in a Windows console.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=1.0.1/r0
 SRC_URI=https://crates.io/api/v1/crates/wincolor/1.0.1/download -> wincolor-1.0.1.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b467357f182178a61f841f815523a326
diff --git a/metadata/md5-cache/dev-rust/ws2_32-sys-0.2.1 b/metadata/md5-cache/dev-rust/ws2_32-sys-0.2.1
index c58ab5b..2e31843 100644
--- a/metadata/md5-cache/dev-rust/ws2_32-sys-0.2.1
+++ b/metadata/md5-cache/dev-rust/ws2_32-sys-0.2.1
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty ws2_32-sys crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.2.1/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=900161294f5dae3873a5d1e154c9a699
diff --git a/metadata/md5-cache/dev-rust/xml-rs-0.3.6 b/metadata/md5-cache/dev-rust/xml-rs-0.3.6
index 7789777..584445d 100644
--- a/metadata/md5-cache/dev-rust/xml-rs-0.3.6
+++ b/metadata/md5-cache/dev-rust/xml-rs-0.3.6
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=dev-rust/bitflags-0.5.0:= <dev-rust/bitflags-0.8.0 >=virtual/rust-1.39.0:=
 DESCRIPTION=An XML library in pure Rust.
 EAPI=6
@@ -9,5 +9,5 @@
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.6/r0
 SRC_URI=https://crates.io/api/v1/crates/xml-rs/0.3.6/download -> xml-rs-0.3.6.crate
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2b1342a4d03bbefd2f04062b46daa75f
diff --git a/metadata/md5-cache/dev-rust/xml-rs-0.8.3 b/metadata/md5-cache/dev-rust/xml-rs-0.8.3
new file mode 100644
index 0000000..d942dcf
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/xml-rs-0.8.3
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=virtual/rust-1.39.0:=
+DESCRIPTION=An XML library in pure Rust.
+EAPI=7
+HOMEPAGE=http://netvl.github.io/xml-rs/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=MIT
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.8.3/r0
+SRC_URI=https://crates.io/api/v1/crates/xml-rs/0.8.3/download -> xml-rs-0.8.3.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=495f1c10110dd60c901767bbb652f860
diff --git a/metadata/md5-cache/dev-rust/yaml-rust-0.3.5 b/metadata/md5-cache/dev-rust/yaml-rust-0.3.5
index c52a1a8..76aec50 100644
--- a/metadata/md5-cache/dev-rust/yaml-rust-0.3.5
+++ b/metadata/md5-cache/dev-rust/yaml-rust-0.3.5
@@ -1,4 +1,4 @@
-DEFINED_PHASES=configure install postinst prepare prerm unpack
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
 DEPEND=>=virtual/rust-1.39.0:=
 DESCRIPTION=Empty yaml-rust crate
 EAPI=6
@@ -7,5 +7,5 @@
 LICENSE=BSD-Google
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0.3.5/r0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a10c45c80def616e132a5a38403f8943
diff --git a/metadata/md5-cache/dev-rust/yaml-rust-0.4.3 b/metadata/md5-cache/dev-rust/yaml-rust-0.4.3
new file mode 100644
index 0000000..532c2ec
--- /dev/null
+++ b/metadata/md5-cache/dev-rust/yaml-rust-0.4.3
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst prepare prerm setup unpack
+DEPEND=>=dev-rust/linked-hash-map-0.0.9:= <dev-rust/linked-hash-map-0.6 >=virtual/rust-1.39.0:=
+DESCRIPTION=The missing YAML 1.2 parser for rust
+EAPI=6
+HOMEPAGE=https://docs.rs/yaml-rust/
+IUSE=cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=|| ( MIT Apache-2.0 )
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0.4.3/r0
+SRC_URI=https://crates.io/api/v1/crates/yaml-rust/0.4.3/download -> yaml-rust-0.4.3.crate
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6694779e8e125cd907400d6d378c9a5e
diff --git a/metadata/md5-cache/dev-util/android-tools-9.0.0_p3-r4 b/metadata/md5-cache/dev-util/android-tools-9.0.0_p3-r4
index 2d743a1..dfee0d4 100644
--- a/metadata/md5-cache/dev-util/android-tools-9.0.0_p3-r4
+++ b/metadata/md5-cache/dev-util/android-tools-9.0.0_p3-r4
@@ -9,5 +9,5 @@
 RDEPEND=sys-libs/zlib:= dev-libs/libpcre2:= dev-libs/openssl:= virtual/libusb:1= python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
 SLOT=0
 SRC_URI=https://git.archlinux.org/svntogit/community.git/snapshot/community-0ffb7b41d599741d100a6a00a4bb20e162cd3f90.tar.xz -> android-tools-9.0.0_r3-arch.tar.xz https://github.com/android/platform_system_core/archive/android-9.0.0_r3.tar.gz -> android-tools-9.0.0_r3-core.tar.gz https://github.com/google/boringssl/archive/45210dd4e21ace9d28cb76b3f83303fcdd2efcce.tar.gz -> boringssl-45210dd4e21ace9d28cb76b3f83303fcdd2efcce.tar.gz mirror://gentoo/android-tools-9.0.0_r3-e2fsprogs.tar.xz https://dev.gentoo.org/~zmedico/dist/android-tools-9.0.0_r3-e2fsprogs.tar.xz mirror://gentoo/android-tools-9.0.0_r3-extras.tar.xz https://dev.gentoo.org/~zmedico/dist/android-tools-9.0.0_r3-extras.tar.xz mirror://gentoo/android-tools-9.0.0_r3-selinux.tar.xz https://dev.gentoo.org/~zmedico/dist/android-tools-9.0.0_r3-selinux.tar.xz mirror://gentoo/android-tools-9.0.0_r3-f2fs-tools.tar.xz https://dev.gentoo.org/~zmedico/dist/android-tools-9.0.0_r3-f2fs-tools.tar.xz mirror://gentoo/android-tools-9.0.0_r3.ninja.xz https://dev.gentoo.org/~zmedico/dist/android-tools-9.0.0_r3.ninja.xz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=cb69f2e628ba18cef801b528ac7fcef6
diff --git a/metadata/md5-cache/dev-util/apitrace-8.0 b/metadata/md5-cache/dev-util/apitrace-8.0
index 454d762..364bc4e 100644
--- a/metadata/md5-cache/dev-util/apitrace-8.0
+++ b/metadata/md5-cache/dev-util/apitrace-8.0
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-devel/make >=dev-util/cmake-3.9.6
+DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-devel/make >=dev-util/cmake-3.9.6
 DESCRIPTION=Tool for tracing, analyzing, and debugging graphics APIs
 EAPI=6
 HOMEPAGE=https://github.com/apitrace/apitrace
-IUSE=+cli egl opengl opengles qt5 system-snappy X abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python2_7 +python_single_target_python2_7
+IUSE=+cli egl opengl opengles qt5 system-snappy X abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_single_target_python2_7
 KEYWORDS=*
 LICENSE=MIT BSD CC-BY-3.0 CC-BY-4.0 public-domain
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
-REQUIRED_USE=^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 )
+RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
+REQUIRED_USE=^^ ( python_single_target_python2_7 )
 SLOT=0
 SRC_URI=https://github.com/apitrace/apitrace/archive/8.0.tar.gz -> apitrace-8.0.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=abf73260a77d6852f22f6cb743a83d3f
diff --git a/metadata/md5-cache/dev-util/apitrace-8.0-r1 b/metadata/md5-cache/dev-util/apitrace-8.0-r1
index 454d762..364bc4e 100644
--- a/metadata/md5-cache/dev-util/apitrace-8.0-r1
+++ b/metadata/md5-cache/dev-util/apitrace-8.0-r1
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-devel/make >=dev-util/cmake-3.9.6
+DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-devel/make >=dev-util/cmake-3.9.6
 DESCRIPTION=Tool for tracing, analyzing, and debugging graphics APIs
 EAPI=6
 HOMEPAGE=https://github.com/apitrace/apitrace
-IUSE=+cli egl opengl opengles qt5 system-snappy X abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python2_7 +python_single_target_python2_7
+IUSE=+cli egl opengl opengles qt5 system-snappy X abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_single_target_python2_7
 KEYWORDS=*
 LICENSE=MIT BSD CC-BY-3.0 CC-BY-4.0 public-domain
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
-REQUIRED_USE=^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 )
+RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) media-libs/libpng:0= media-libs/mesa[egl?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] media-libs/waffle sys-libs/zlib:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-process/procps X? ( x11-libs/libX11 ) opengl? ( virtual/opengl ) opengles? ( virtual/opengles ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5[-gles2] dev-qt/qtnetwork:5 dev-qt/qtwebkit:5 dev-qt/qtwidgets:5[-gles2] ) system-snappy? ( >=app-arch/snappy-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
+REQUIRED_USE=^^ ( python_single_target_python2_7 )
 SLOT=0
 SRC_URI=https://github.com/apitrace/apitrace/archive/8.0.tar.gz -> apitrace-8.0.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=abf73260a77d6852f22f6cb743a83d3f
diff --git a/metadata/md5-cache/dev-util/bsdiff-4.3.1-r29 b/metadata/md5-cache/dev-util/bsdiff-4.3.1-r29
index 4953879..a9569b3 100644
--- a/metadata/md5-cache/dev-util/bsdiff-4.3.1-r29
+++ b/metadata/md5-cache/dev-util/bsdiff-4.3.1-r29
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=app-arch/brotli-1.0.6:= app-arch/bzip2:= dev-libs/libdivsufsort:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/4.3.1-r29
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=86d38e08759703c93b0f6065092687ce
diff --git a/metadata/md5-cache/dev-util/bsdiff-9999 b/metadata/md5-cache/dev-util/bsdiff-9999
index 989a68e..ba0a776 100644
--- a/metadata/md5-cache/dev-util/bsdiff-9999
+++ b/metadata/md5-cache/dev-util/bsdiff-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=>=app-arch/brotli-1.0.6:= app-arch/bzip2:= dev-libs/libdivsufsort:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6b24258d9a84daae0ee4970a272aefe0
diff --git a/metadata/md5-cache/dev-util/cargo-0.35.0-r1 b/metadata/md5-cache/dev-util/cargo-0.35.0-r1
deleted file mode 100644
index 5418c04..0000000
--- a/metadata/md5-cache/dev-util/cargo-0.35.0-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install unpack
-DEPEND=sys-libs/zlib dev-libs/openssl net-libs/libssh2 >=dev-lang/rust-1.27.0 dev-util/cmake sys-apps/coreutils sys-apps/diffutils sys-apps/findutils sys-apps/sed sys-libs/llvm-libunwind
-DESCRIPTION=The Rust's package manager
-EAPI=6
-HOMEPAGE=http://crates.io
-IUSE=doc libressl debug
-KEYWORDS=-* amd64
-LICENSE=|| ( MIT Apache-2.0 )
-RDEPEND=sys-libs/zlib dev-libs/openssl net-libs/libssh2 !dev-util/cargo-bin net-misc/curl[ssl] sys-libs/llvm-libunwind
-RESTRICT=mirror
-SLOT=0
-SRC_URI=https://github.com/rust-lang/cargo/archive/0.35.0.tar.gz -> cargo-0.35.0.tar.gz https://crates.io/api/v1/crates/adler32/1.0.3/download -> adler32-1.0.3.crate https://crates.io/api/v1/crates/aho-corasick/0.6.10/download -> aho-corasick-0.6.10.crate https://crates.io/api/v1/crates/ansi_term/0.11.0/download -> ansi_term-0.11.0.crate https://crates.io/api/v1/crates/atty/0.2.11/download -> atty-0.2.11.crate https://crates.io/api/v1/crates/autocfg/0.1.2/download -> autocfg-0.1.2.crate https://crates.io/api/v1/crates/backtrace/0.3.14/download -> backtrace-0.3.14.crate https://crates.io/api/v1/crates/backtrace-sys/0.1.28/download -> backtrace-sys-0.1.28.crate https://crates.io/api/v1/crates/bit-set/0.5.1/download -> bit-set-0.5.1.crate https://crates.io/api/v1/crates/bit-vec/0.5.1/download -> bit-vec-0.5.1.crate https://crates.io/api/v1/crates/bitflags/1.0.4/download -> bitflags-1.0.4.crate https://crates.io/api/v1/crates/bufstream/0.1.4/download -> bufstream-0.1.4.crate https://crates.io/api/v1/crates/build_const/0.2.1/download -> build_const-0.2.1.crate https://crates.io/api/v1/crates/byteorder/1.3.1/download -> byteorder-1.3.1.crate https://crates.io/api/v1/crates/bytes/0.4.12/download -> bytes-0.4.12.crate https://crates.io/api/v1/crates/bytesize/1.0.0/download -> bytesize-1.0.0.crate https://crates.io/api/v1/crates/cc/1.0.31/download -> cc-1.0.31.crate https://crates.io/api/v1/crates/cfg-if/0.1.7/download -> cfg-if-0.1.7.crate https://crates.io/api/v1/crates/chrono/0.4.6/download -> chrono-0.4.6.crate https://crates.io/api/v1/crates/clap/2.32.0/download -> clap-2.32.0.crate https://crates.io/api/v1/crates/cloudabi/0.0.3/download -> cloudabi-0.0.3.crate https://crates.io/api/v1/crates/commoncrypto/0.2.0/download -> commoncrypto-0.2.0.crate https://crates.io/api/v1/crates/commoncrypto-sys/0.2.0/download -> commoncrypto-sys-0.2.0.crate https://crates.io/api/v1/crates/core-foundation/0.6.3/download -> core-foundation-0.6.3.crate https://crates.io/api/v1/crates/core-foundation-sys/0.6.2/download -> core-foundation-sys-0.6.2.crate https://crates.io/api/v1/crates/crc/1.8.1/download -> crc-1.8.1.crate https://crates.io/api/v1/crates/crc32fast/1.2.0/download -> crc32fast-1.2.0.crate https://crates.io/api/v1/crates/crossbeam-channel/0.3.8/download -> crossbeam-channel-0.3.8.crate https://crates.io/api/v1/crates/crossbeam-utils/0.6.5/download -> crossbeam-utils-0.6.5.crate https://crates.io/api/v1/crates/crypto-hash/0.3.3/download -> crypto-hash-0.3.3.crate https://crates.io/api/v1/crates/curl/0.4.20/download -> curl-0.4.20.crate https://crates.io/api/v1/crates/curl-sys/0.4.17/download -> curl-sys-0.4.17.crate https://crates.io/api/v1/crates/env_logger/0.6.1/download -> env_logger-0.6.1.crate https://crates.io/api/v1/crates/failure/0.1.5/download -> failure-0.1.5.crate https://crates.io/api/v1/crates/failure_derive/0.1.5/download -> failure_derive-0.1.5.crate https://crates.io/api/v1/crates/filetime/0.2.4/download -> filetime-0.2.4.crate https://crates.io/api/v1/crates/flate2/1.0.7/download -> flate2-1.0.7.crate https://crates.io/api/v1/crates/fnv/1.0.6/download -> fnv-1.0.6.crate https://crates.io/api/v1/crates/foreign-types/0.3.2/download -> foreign-types-0.3.2.crate https://crates.io/api/v1/crates/foreign-types-shared/0.1.1/download -> foreign-types-shared-0.1.1.crate https://crates.io/api/v1/crates/fs2/0.4.3/download -> fs2-0.4.3.crate https://crates.io/api/v1/crates/fuchsia-cprng/0.1.1/download -> fuchsia-cprng-0.1.1.crate https://crates.io/api/v1/crates/fwdansi/1.0.1/download -> fwdansi-1.0.1.crate https://crates.io/api/v1/crates/git2/0.8.0/download -> git2-0.8.0.crate https://crates.io/api/v1/crates/git2-curl/0.9.0/download -> git2-curl-0.9.0.crate https://crates.io/api/v1/crates/glob/0.2.11/download -> glob-0.2.11.crate https://crates.io/api/v1/crates/globset/0.4.2/download -> globset-0.4.2.crate https://crates.io/api/v1/crates/hex/0.3.2/download -> hex-0.3.2.crate https://crates.io/api/v1/crates/home/0.3.4/download -> home-0.3.4.crate https://crates.io/api/v1/crates/http/0.1.17/download -> http-0.1.17.crate https://crates.io/api/v1/crates/humantime/1.2.0/download -> humantime-1.2.0.crate https://crates.io/api/v1/crates/idna/0.1.5/download -> idna-0.1.5.crate https://crates.io/api/v1/crates/ignore/0.4.6/download -> ignore-0.4.6.crate https://crates.io/api/v1/crates/im-rc/12.3.3/download -> im-rc-12.3.3.crate https://crates.io/api/v1/crates/iovec/0.1.2/download -> iovec-0.1.2.crate https://crates.io/api/v1/crates/itoa/0.4.3/download -> itoa-0.4.3.crate https://crates.io/api/v1/crates/jobserver/0.1.13/download -> jobserver-0.1.13.crate https://crates.io/api/v1/crates/kernel32-sys/0.2.2/download -> kernel32-sys-0.2.2.crate https://crates.io/api/v1/crates/lazy_static/1.3.0/download -> lazy_static-1.3.0.crate https://crates.io/api/v1/crates/lazycell/1.2.1/download -> lazycell-1.2.1.crate https://crates.io/api/v1/crates/libc/0.2.50/download -> libc-0.2.50.crate https://crates.io/api/v1/crates/libgit2-sys/0.7.11/download -> libgit2-sys-0.7.11.crate https://crates.io/api/v1/crates/libnghttp2-sys/0.1.1/download -> libnghttp2-sys-0.1.1.crate https://crates.io/api/v1/crates/libssh2-sys/0.2.11/download -> libssh2-sys-0.2.11.crate https://crates.io/api/v1/crates/libz-sys/1.0.25/download -> libz-sys-1.0.25.crate https://crates.io/api/v1/crates/log/0.4.6/download -> log-0.4.6.crate https://crates.io/api/v1/crates/matches/0.1.8/download -> matches-0.1.8.crate https://crates.io/api/v1/crates/memchr/2.2.0/download -> memchr-2.2.0.crate https://crates.io/api/v1/crates/miniz-sys/0.1.11/download -> miniz-sys-0.1.11.crate https://crates.io/api/v1/crates/miniz_oxide/0.2.1/download -> miniz_oxide-0.2.1.crate https://crates.io/api/v1/crates/miniz_oxide_c_api/0.2.1/download -> miniz_oxide_c_api-0.2.1.crate https://crates.io/api/v1/crates/miow/0.3.3/download -> miow-0.3.3.crate https://crates.io/api/v1/crates/num-integer/0.1.39/download -> num-integer-0.1.39.crate https://crates.io/api/v1/crates/num-traits/0.2.6/download -> num-traits-0.2.6.crate https://crates.io/api/v1/crates/num_cpus/1.10.0/download -> num_cpus-1.10.0.crate https://crates.io/api/v1/crates/opener/0.3.2/download -> opener-0.3.2.crate https://crates.io/api/v1/crates/openssl/0.10.20/download -> openssl-0.10.20.crate https://crates.io/api/v1/crates/openssl-probe/0.1.2/download -> openssl-probe-0.1.2.crate https://crates.io/api/v1/crates/openssl-src/111.2.1+1.1.1b/download -> openssl-src-111.2.1+1.1.1b.crate https://crates.io/api/v1/crates/openssl-sys/0.9.43/download -> openssl-sys-0.9.43.crate https://crates.io/api/v1/crates/percent-encoding/1.0.1/download -> percent-encoding-1.0.1.crate https://crates.io/api/v1/crates/pkg-config/0.3.14/download -> pkg-config-0.3.14.crate https://crates.io/api/v1/crates/pretty_env_logger/0.3.0/download -> pretty_env_logger-0.3.0.crate https://crates.io/api/v1/crates/proc-macro2/0.4.27/download -> proc-macro2-0.4.27.crate https://crates.io/api/v1/crates/proptest/0.8.7/download -> proptest-0.8.7.crate https://crates.io/api/v1/crates/quick-error/1.2.2/download -> quick-error-1.2.2.crate https://crates.io/api/v1/crates/quote/0.6.11/download -> quote-0.6.11.crate https://crates.io/api/v1/crates/rand/0.5.6/download -> rand-0.5.6.crate https://crates.io/api/v1/crates/rand/0.6.5/download -> rand-0.6.5.crate https://crates.io/api/v1/crates/rand_chacha/0.1.1/download -> rand_chacha-0.1.1.crate https://crates.io/api/v1/crates/rand_core/0.3.1/download -> rand_core-0.3.1.crate https://crates.io/api/v1/crates/rand_core/0.4.0/download -> rand_core-0.4.0.crate https://crates.io/api/v1/crates/rand_hc/0.1.0/download -> rand_hc-0.1.0.crate https://crates.io/api/v1/crates/rand_isaac/0.1.1/download -> rand_isaac-0.1.1.crate https://crates.io/api/v1/crates/rand_jitter/0.1.3/download -> rand_jitter-0.1.3.crate https://crates.io/api/v1/crates/rand_os/0.1.3/download -> rand_os-0.1.3.crate https://crates.io/api/v1/crates/rand_pcg/0.1.2/download -> rand_pcg-0.1.2.crate https://crates.io/api/v1/crates/rand_xorshift/0.1.1/download -> rand_xorshift-0.1.1.crate https://crates.io/api/v1/crates/rdrand/0.4.0/download -> rdrand-0.4.0.crate https://crates.io/api/v1/crates/redox_syscall/0.1.51/download -> redox_syscall-0.1.51.crate https://crates.io/api/v1/crates/redox_termios/0.1.1/download -> redox_termios-0.1.1.crate https://crates.io/api/v1/crates/regex/1.1.2/download -> regex-1.1.2.crate https://crates.io/api/v1/crates/regex-syntax/0.6.5/download -> regex-syntax-0.6.5.crate https://crates.io/api/v1/crates/remove_dir_all/0.5.1/download -> remove_dir_all-0.5.1.crate https://crates.io/api/v1/crates/rustc-demangle/0.1.13/download -> rustc-demangle-0.1.13.crate https://crates.io/api/v1/crates/rustc-workspace-hack/1.0.0/download -> rustc-workspace-hack-1.0.0.crate https://crates.io/api/v1/crates/rustc_version/0.2.3/download -> rustc_version-0.2.3.crate https://crates.io/api/v1/crates/rustfix/0.4.4/download -> rustfix-0.4.4.crate https://crates.io/api/v1/crates/rusty-fork/0.2.1/download -> rusty-fork-0.2.1.crate https://crates.io/api/v1/crates/ryu/0.2.7/download -> ryu-0.2.7.crate https://crates.io/api/v1/crates/same-file/1.0.4/download -> same-file-1.0.4.crate https://crates.io/api/v1/crates/schannel/0.1.15/download -> schannel-0.1.15.crate https://crates.io/api/v1/crates/scopeguard/0.3.3/download -> scopeguard-0.3.3.crate https://crates.io/api/v1/crates/semver/0.9.0/download -> semver-0.9.0.crate https://crates.io/api/v1/crates/semver-parser/0.7.0/download -> semver-parser-0.7.0.crate https://crates.io/api/v1/crates/serde/1.0.89/download -> serde-1.0.89.crate https://crates.io/api/v1/crates/serde_derive/1.0.89/download -> serde_derive-1.0.89.crate https://crates.io/api/v1/crates/serde_ignored/0.0.4/download -> serde_ignored-0.0.4.crate https://crates.io/api/v1/crates/serde_json/1.0.39/download -> serde_json-1.0.39.crate https://crates.io/api/v1/crates/shell-escape/0.1.4/download -> shell-escape-0.1.4.crate https://crates.io/api/v1/crates/sized-chunks/0.1.2/download -> sized-chunks-0.1.2.crate https://crates.io/api/v1/crates/smallvec/0.6.9/download -> smallvec-0.6.9.crate https://crates.io/api/v1/crates/socket2/0.3.8/download -> socket2-0.3.8.crate https://crates.io/api/v1/crates/strsim/0.7.0/download -> strsim-0.7.0.crate https://crates.io/api/v1/crates/syn/0.15.29/download -> syn-0.15.29.crate https://crates.io/api/v1/crates/synstructure/0.10.1/download -> synstructure-0.10.1.crate https://crates.io/api/v1/crates/tar/0.4.22/download -> tar-0.4.22.crate https://crates.io/api/v1/crates/tempfile/3.0.7/download -> tempfile-3.0.7.crate https://crates.io/api/v1/crates/termcolor/1.0.4/download -> termcolor-1.0.4.crate https://crates.io/api/v1/crates/termion/1.5.1/download -> termion-1.5.1.crate https://crates.io/api/v1/crates/textwrap/0.10.0/download -> textwrap-0.10.0.crate https://crates.io/api/v1/crates/thread_local/0.3.6/download -> thread_local-0.3.6.crate https://crates.io/api/v1/crates/time/0.1.42/download -> time-0.1.42.crate https://crates.io/api/v1/crates/toml/0.4.10/download -> toml-0.4.10.crate https://crates.io/api/v1/crates/typenum/1.10.0/download -> typenum-1.10.0.crate https://crates.io/api/v1/crates/ucd-util/0.1.3/download -> ucd-util-0.1.3.crate https://crates.io/api/v1/crates/unicode-bidi/0.3.4/download -> unicode-bidi-0.3.4.crate https://crates.io/api/v1/crates/unicode-normalization/0.1.8/download -> unicode-normalization-0.1.8.crate https://crates.io/api/v1/crates/unicode-width/0.1.5/download -> unicode-width-0.1.5.crate https://crates.io/api/v1/crates/unicode-xid/0.1.0/download -> unicode-xid-0.1.0.crate https://crates.io/api/v1/crates/url/1.7.2/download -> url-1.7.2.crate https://crates.io/api/v1/crates/url_serde/0.2.0/download -> url_serde-0.2.0.crate https://crates.io/api/v1/crates/utf8-ranges/1.0.2/download -> utf8-ranges-1.0.2.crate https://crates.io/api/v1/crates/vcpkg/0.2.6/download -> vcpkg-0.2.6.crate https://crates.io/api/v1/crates/vec_map/0.8.1/download -> vec_map-0.8.1.crate https://crates.io/api/v1/crates/wait-timeout/0.1.5/download -> wait-timeout-0.1.5.crate https://crates.io/api/v1/crates/walkdir/2.2.7/download -> walkdir-2.2.7.crate https://crates.io/api/v1/crates/winapi/0.2.8/download -> winapi-0.2.8.crate https://crates.io/api/v1/crates/winapi/0.3.6/download -> winapi-0.3.6.crate https://crates.io/api/v1/crates/winapi-build/0.1.1/download -> winapi-build-0.1.1.crate https://crates.io/api/v1/crates/winapi-i686-pc-windows-gnu/0.4.0/download -> winapi-i686-pc-windows-gnu-0.4.0.crate https://crates.io/api/v1/crates/winapi-util/0.1.2/download -> winapi-util-0.1.2.crate https://crates.io/api/v1/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download -> winapi-x86_64-pc-windows-gnu-0.4.0.crate https://crates.io/api/v1/crates/wincolor/1.0.1/download -> wincolor-1.0.1.crate x86? ( https://static.rust-lang.org/dist/cargo-0.34.0-i686-unknown-linux-gnu.tar.xz ) amd64? ( https://static.rust-lang.org/dist/cargo-0.34.0-x86_64-unknown-linux-gnu.tar.xz ) arm? ( https://static.rust-lang.org/dist/cargo-0.34.0-arm-unknown-linux-gnueabi.tar.xz https://static.rust-lang.org/dist/cargo-0.34.0-arm-unknown-linux-gnueabihf.tar.xz https://static.rust-lang.org/dist/cargo-0.34.0-armv7-unknown-linux-gnueabihf.tar.xz ) arm64? ( https://static.rust-lang.org/dist/cargo-0.34.0-aarch64-unknown-linux-gnu.tar.xz )
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cargo	3db1bfe09747bbcacf0b9319d7ec0248	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=22e10e57ae6a5927f50ca1712693eca8
diff --git a/metadata/md5-cache/dev-util/gdbus-codegen-2.58.3 b/metadata/md5-cache/dev-util/gdbus-codegen-2.58.3
deleted file mode 100644
index ca49428..0000000
--- a/metadata/md5-cache/dev-util/gdbus-codegen-2.58.3
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[xml] ) python_single_target_python3_7? ( dev-lang/python:3.7[xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] dev-libs/libxslt app-text/docbook-xsl-stylesheets app-arch/xz-utils python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[xml] ) python_single_target_python3_7? ( dev-lang/python:3.7[xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
-DESCRIPTION=GDBus code and documentation generator
-EAPI=5
-HOMEPAGE=https://www.gtk.org/
-IUSE=python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
-KEYWORDS=*
-LICENSE=LGPL-2+
-PDEPEND=>=dev-libs/glib-2.58.3:2
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[xml] ) python_single_target_python3_7? ( dev-lang/python:3.7[xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[xml] ) python_single_target_python3_7? ( dev-lang/python:3.7[xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
-REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 )
-SLOT=0
-SRC_URI=mirror://gnome/sources/glib/2.58/glib-2.58.3.tar.xz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=f23ae40a27d0eb7b8762ff142fd44684
diff --git a/metadata/md5-cache/dev-util/glib-utils-2.58.3 b/metadata/md5-cache/dev-util/glib-utils-2.58.3
index 9f22922..6c41083 100644
--- a/metadata/md5-cache/dev-util/glib-utils-2.58.3
+++ b/metadata/md5-cache/dev-util/glib-utils-2.58.3
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install setup
-DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] !<dev-libs/glib-2.56.2:2 dev-libs/libxslt app-text/docbook-xsl-stylesheets app-arch/xz-utils
+DEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) !<dev-libs/glib-2.56.2:2 dev-libs/libxslt app-text/docbook-xsl-stylesheets app-arch/xz-utils
 DESCRIPTION=Build utilities for GLib using projects
 EAPI=5
 HOMEPAGE=https://www.gtk.org/
-IUSE=python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=*
 LICENSE=LGPL-2.1+
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] !<dev-libs/glib-2.56.2:2
-REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 )
+RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) !<dev-libs/glib-2.56.2:2
+REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 )
 SLOT=0
 SRC_URI=mirror://gnome/sources/glib/2.58/glib-2.58.3.tar.xz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=93212063f58c001213663ca624e50658
diff --git a/metadata/md5-cache/dev-util/gyp-2019.06.04.155326 b/metadata/md5-cache/dev-util/gyp-2019.06.04.155326
index 6ca6178..4c1ca0c 100644
--- a/metadata/md5-cache/dev-util/gyp-2019.06.04.155326
+++ b/metadata/md5-cache/dev-util/gyp-2019.06.04.155326
@@ -10,5 +10,5 @@
 REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
 SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/gyp-2019.06.04.155326.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=95261ff7d425035dd73fc686dbda365b
diff --git a/metadata/md5-cache/dev-util/hdctools-0.0.1-r1230 b/metadata/md5-cache/dev-util/hdctools-0.0.1-r1230
deleted file mode 100644
index 89b3b6d..0000000
--- a/metadata/md5-cache/dev-util/hdctools-0.0.1-r1230
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] virtual/pkgconfig
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= app-text/htmltidy:= test? ( dev-python/pytest:= )
-DESCRIPTION=Software to communicate with servo/miniservo debug boards
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/servo
-IUSE=cros_host test cros_host cros_workon_tree_e9a3fac8a584e5b3983f3240310a9e8fe606d02f python_targets_python2_7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
-REQUIRED_USE=|| ( python_targets_python2_7 )
-SLOT=0/0.0.1-r1230
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=18f4b61219a2fe28a9ed5dacf31e001c
diff --git a/metadata/md5-cache/dev-util/hdctools-0.0.1-r1264 b/metadata/md5-cache/dev-util/hdctools-0.0.1-r1264
new file mode 100644
index 0000000..91f6e1d
--- /dev/null
+++ b/metadata/md5-cache/dev-util/hdctools-0.0.1-r1264
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] virtual/pkgconfig
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= dev-python/retry-decorator:= app-text/htmltidy:= test? ( dev-python/pytest:= )
+DESCRIPTION=Software to communicate with servo/miniservo debug boards
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/servo
+IUSE=cros_host test cros_host cros_workon_tree_99b84aace013a0b55a9a4b4c5b2f9b9286cda469 python_targets_python2_7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= dev-python/retry-decorator:= virtual/servo-config-dut-usb3:* python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 )
+SLOT=0/0.0.1-r1264
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=d3ffb5030d68435ac091e9304a6a7472
diff --git a/metadata/md5-cache/dev-util/hdctools-9999 b/metadata/md5-cache/dev-util/hdctools-9999
index 734cabc..1b4d4f9 100644
--- a/metadata/md5-cache/dev-util/hdctools-9999
+++ b/metadata/md5-cache/dev-util/hdctools-9999
@@ -1,6 +1,6 @@
 BDEPEND=dev-vcs/git python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] virtual/pkgconfig
 DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= app-text/htmltidy:= test? ( dev-python/pytest:= )
+DEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= dev-python/retry-decorator:= app-text/htmltidy:= test? ( dev-python/pytest:= )
 DESCRIPTION=Software to communicate with servo/miniservo debug boards
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/servo
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
+RDEPEND=>=dev-embedded/libftdi-0.18:= dev-python/numpy:= >=dev-python/pexpect-3.0:= dev-python/pyserial:= >=dev-python/pyusb-1.0.2:= sys-power/uhubctl virtual/libusb:1 chromeos-base/ec-devutils:= dev-python/retry-decorator:= virtual/servo-config-dut-usb3:* python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)]
 REQUIRED_USE=|| ( python_targets_python2_7 )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=eb11712b65370627ee51403506064f4e
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=5113a34bad735ae7ce9dc252e415cfa3
diff --git a/metadata/md5-cache/dev-util/mem-0.0.1 b/metadata/md5-cache/dev-util/mem-0.0.1
index 95d9683..6e5b5a6 100644
--- a/metadata/md5-cache/dev-util/mem-0.0.1
+++ b/metadata/md5-cache/dev-util/mem-0.0.1
@@ -9,5 +9,5 @@
 RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f30b281b641f2f100165c6b69b41ce63
diff --git a/metadata/md5-cache/dev-util/mem-0.0.1-r5 b/metadata/md5-cache/dev-util/mem-0.0.1-r5
index 95d9683..6e5b5a6 100644
--- a/metadata/md5-cache/dev-util/mem-0.0.1-r5
+++ b/metadata/md5-cache/dev-util/mem-0.0.1-r5
@@ -9,5 +9,5 @@
 RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f30b281b641f2f100165c6b69b41ce63
diff --git a/metadata/md5-cache/dev-util/memory-eater-locked-0.0.1-r5 b/metadata/md5-cache/dev-util/memory-eater-locked-0.0.1-r5
index 3434521..8a6d4c1 100644
--- a/metadata/md5-cache/dev-util/memory-eater-locked-0.0.1-r5
+++ b/metadata/md5-cache/dev-util/memory-eater-locked-0.0.1-r5
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=368f8ca7e8ced0aadd79b332fe402659
diff --git a/metadata/md5-cache/dev-util/memory-eater-locked-9999 b/metadata/md5-cache/dev-util/memory-eater-locked-9999
index e5bf748..a086cdc 100644
--- a/metadata/md5-cache/dev-util/memory-eater-locked-9999
+++ b/metadata/md5-cache/dev-util/memory-eater-locked-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0d252a5feeee6c708fe7aaa9607e64ff
diff --git a/metadata/md5-cache/dev-util/meson-0.49.1-r1 b/metadata/md5-cache/dev-util/meson-0.49.1-r1
index 0e8b951..5d6aa89 100644
--- a/metadata/md5-cache/dev-util/meson-0.49.1-r1
+++ b/metadata/md5-cache/dev-util/meson-0.49.1-r1
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=0
 SRC_URI=mirror://pypi/m/meson/meson-0.49.1.tar.gz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=d909c95f46d834ba799f4ae2c3b531f8
diff --git a/metadata/md5-cache/dev-util/perf-5.3.7 b/metadata/md5-cache/dev-util/perf-5.3.7
index d997720..7e1be0f 100644
--- a/metadata/md5-cache/dev-util/perf-5.3.7
+++ b/metadata/md5-cache/dev-util/perf-5.3.7
@@ -1,15 +1,15 @@
 BDEPEND=dev-util/patchutils sys-devel/bison sys-devel/flex java? ( virtual/jdk ) doc? ( app-text/asciidoc app-text/sgml-common app-text/xmlto sys-process/time )
 DEFINED_PHASES=compile install postinst prepare setup test unpack
-DEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils >=sys-kernel/linux-headers-4.4
+DEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils >=sys-kernel/linux-headers-4.4
 DESCRIPTION=Userland tools for Linux Performance Counters
 EAPI=7
 HOMEPAGE=https://perf.wiki.kernel.org/
-IUSE=audit clang crypt debug +demangle +doc gtk java lzma numa perl python slang systemtap unwind zlib +python_targets_python2_7 +python_single_target_python2_7 kernel_linux
+IUSE=audit clang crypt debug +demangle +doc gtk java lzma numa perl python slang systemtap unwind zlib +python_single_target_python2_7 kernel_linux
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
+RDEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) )
 SLOT=0
 SRC_URI=https://www.kernel.org/pub/linux/kernel/v5.x/patch-5.3.7.xz https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.3.tar.xz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6d86b2261a345cf2189d3053bcb9261e
diff --git a/metadata/md5-cache/dev-util/perf-5.3.7-r10 b/metadata/md5-cache/dev-util/perf-5.3.7-r10
index d997720..7e1be0f 100644
--- a/metadata/md5-cache/dev-util/perf-5.3.7-r10
+++ b/metadata/md5-cache/dev-util/perf-5.3.7-r10
@@ -1,15 +1,15 @@
 BDEPEND=dev-util/patchutils sys-devel/bison sys-devel/flex java? ( virtual/jdk ) doc? ( app-text/asciidoc app-text/sgml-common app-text/xmlto sys-process/time )
 DEFINED_PHASES=compile install postinst prepare setup test unpack
-DEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils >=sys-kernel/linux-headers-4.4
+DEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils >=sys-kernel/linux-headers-4.4
 DESCRIPTION=Userland tools for Linux Performance Counters
 EAPI=7
 HOMEPAGE=https://perf.wiki.kernel.org/
-IUSE=audit clang crypt debug +demangle +doc gtk java lzma numa perl python slang systemtap unwind zlib +python_targets_python2_7 +python_single_target_python2_7 kernel_linux
+IUSE=audit clang crypt debug +demangle +doc gtk java lzma numa perl python slang systemtap unwind zlib +python_single_target_python2_7 kernel_linux
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
+RDEPEND=audit? ( sys-process/audit ) crypt? ( dev-libs/openssl:0= ) clang? ( sys-devel/clang:* sys-devel/llvm:* ) demangle? ( sys-libs/binutils-libs:= ) gtk? ( x11-libs/gtk+:2 ) java? ( virtual/jre:* ) lzma? ( app-arch/xz-utils ) numa? ( sys-process/numactl ) perl? ( dev-lang/perl:= ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) slang? ( sys-libs/slang ) systemtap? ( dev-util/systemtap ) unwind? ( sys-libs/llvm-libunwind ) zlib? ( sys-libs/zlib ) dev-libs/elfutils
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) )
 SLOT=0
 SRC_URI=https://www.kernel.org/pub/linux/kernel/v5.x/patch-5.3.7.xz https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.3.tar.xz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6d86b2261a345cf2189d3053bcb9261e
diff --git a/metadata/md5-cache/dev-util/puffin-1.0.0-r434 b/metadata/md5-cache/dev-util/puffin-1.0.0-r434
deleted file mode 100644
index 97766c3..0000000
--- a/metadata/md5-cache/dev-util/puffin-1.0.0-r434
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] dev-libs/protobuf:= dev-util/bsdiff:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Puffin: Deterministic patching tool for deflate streams
-EAPI=7
-HOMEPAGE=https://android.googlesource.com/platform/external/puffin/
-IUSE=asan fuzzer cros_host cros_workon_tree_e2a3a6742f6acdc76df13145ab31b6471243d736_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7af8a5581078de78894a5f59bbd5e179fc71a804 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e2a3a6742f6acdc76df13145ab31b6471243d736_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7af8a5581078de78894a5f59bbd5e179fc71a804 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] dev-libs/protobuf:= dev-util/bsdiff:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/1.0.0-r434
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=47b5b173de05e21275c2498cf543173d
diff --git a/metadata/md5-cache/dev-util/puffin-1.0.0-r435 b/metadata/md5-cache/dev-util/puffin-1.0.0-r435
new file mode 100644
index 0000000..e2d7210
--- /dev/null
+++ b/metadata/md5-cache/dev-util/puffin-1.0.0-r435
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] dev-libs/protobuf:= dev-util/bsdiff:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Puffin: Deterministic patching tool for deflate streams
+EAPI=7
+HOMEPAGE=https://android.googlesource.com/platform/external/puffin/
+IUSE=asan fuzzer cros_host cros_workon_tree_e2a3a6742f6acdc76df13145ab31b6471243d736_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7af8a5581078de78894a5f59bbd5e179fc71a804 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e2a3a6742f6acdc76df13145ab31b6471243d736_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_7af8a5581078de78894a5f59bbd5e179fc71a804 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] dev-libs/protobuf:= dev-util/bsdiff:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/1.0.0-r435
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=35ef9c315c81827b70f5da78d9a9d942
diff --git a/metadata/md5-cache/dev-util/puffin-9999 b/metadata/md5-cache/dev-util/puffin-9999
index a0311c7..5ba41ad 100644
--- a/metadata/md5-cache/dev-util/puffin-9999
+++ b/metadata/md5-cache/dev-util/puffin-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libbrillo:=[asan?,fuzzer?] dev-libs/protobuf:= dev-util/bsdiff:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=cb06d95952d2107eacee04daaaab7b72
diff --git a/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-0.0.1-r1 b/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-0.0.1-r1
new file mode 100644
index 0000000..2211e45
--- /dev/null
+++ b/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-0.0.1-r1
@@ -0,0 +1,11 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=List DUT USB 3 capability of Servo devices (public).
+EAPI=7
+IUSE=cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0.0.1-r1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=eec52536e2d7064e4a2a0317da7e1678
diff --git a/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-9999 b/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-9999
new file mode 100644
index 0000000..51bdcf1
--- /dev/null
+++ b/metadata/md5-cache/dev-util/servo-config-dut-usb3-public-9999
@@ -0,0 +1,11 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=List DUT USB 3 capability of Servo devices (public).
+EAPI=7
+IUSE=cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5abe71be9ad5e6a301efbb42f2c83a69
diff --git a/metadata/md5-cache/dev-util/shellcheck-0.7.1-r20 b/metadata/md5-cache/dev-util/shellcheck-0.7.1-r20
deleted file mode 100644
index 8819898..0000000
--- a/metadata/md5-cache/dev-util/shellcheck-0.7.1-r20
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst postrm setup test unpack
-DEPEND=dev-haskell/aeson:=[profile?] >=dev-haskell/diff-0.2.0:=[profile?] >=dev-haskell/mtl-2.2.1:=[profile?] >=dev-haskell/parsec-3.0:=[profile?] >=dev-haskell/quickcheck-2.7.4:2=[template_haskell,profile?] dev-haskell/regex-tdfa:=[profile?] dev-haskell/semigroups:=[profile?] >=dev-lang/ghc-7.8.2:= >=dev-haskell/cabal-1.18.1.3 <dev-haskell/cabal-2.5 dev-libs/gmp[static-libs] dev-libs/libffi[static-libs] doc? ( || ( dev-haskell/haddock >=dev-lang/ghc-7.10.2 ) ) hscolour? ( dev-haskell/hscolour )
-DESCRIPTION=Shell script analysis tool
-EAPI=6
-HOMEPAGE=https://www.shellcheck.net/
-IUSE=cros_host cros_workon_tree_4c1ba53aad07d48d3fdb5b7b8f1893634b259431 doc hscolour profile test
-KEYWORDS=*
-LICENSE=GPL-3
-PROPERTIES=live
-RESTRICT=!test? ( test )
-SLOT=0/0.7.1
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	ghc-package	cfc8267c6151d804d0c34bf9e180533f	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	haskell-cabal	433b5153bec6b0ffe21c7be2210e8396	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d1200c3599ba1d4acdbf10c4311879c1
diff --git a/metadata/md5-cache/dev-util/shellcheck-0.7.1-r27 b/metadata/md5-cache/dev-util/shellcheck-0.7.1-r27
new file mode 100644
index 0000000..9376eb5
--- /dev/null
+++ b/metadata/md5-cache/dev-util/shellcheck-0.7.1-r27
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst postrm setup test unpack
+DEPEND=dev-haskell/aeson:=[profile?] >=dev-haskell/diff-0.2.0:=[profile?] >=dev-haskell/mtl-2.2.1:=[profile?] >=dev-haskell/parsec-3.0:=[profile?] >=dev-haskell/quickcheck-2.7.4:2=[template_haskell,profile?] dev-haskell/regex-tdfa:=[profile?] dev-haskell/semigroups:=[profile?] >=dev-lang/ghc-7.8.2:= >=dev-haskell/cabal-1.18.1.3 <dev-haskell/cabal-2.5 dev-libs/gmp[static-libs] dev-libs/libffi[static-libs] doc? ( || ( dev-haskell/haddock >=dev-lang/ghc-7.10.2 ) ) hscolour? ( dev-haskell/hscolour )
+DESCRIPTION=Shell script analysis tool
+EAPI=6
+HOMEPAGE=https://www.shellcheck.net/
+IUSE=cros_host cros_workon_tree_32478e4b289a55986860bb9bad70a32e999fb140 doc hscolour profile test
+KEYWORDS=*
+LICENSE=GPL-3
+PROPERTIES=live
+RESTRICT=!test? ( test )
+SLOT=0/0.7.1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	ghc-package	cfc8267c6151d804d0c34bf9e180533f	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	haskell-cabal	433b5153bec6b0ffe21c7be2210e8396	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=399711d9f014b93c61b9de4aae1d1fb2
diff --git a/metadata/md5-cache/dev-util/shellcheck-9999 b/metadata/md5-cache/dev-util/shellcheck-9999
index df39d1c..f97c1ca 100644
--- a/metadata/md5-cache/dev-util/shellcheck-9999
+++ b/metadata/md5-cache/dev-util/shellcheck-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RESTRICT=!test? ( test )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	ghc-package	cfc8267c6151d804d0c34bf9e180533f	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	haskell-cabal	433b5153bec6b0ffe21c7be2210e8396	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	ghc-package	cfc8267c6151d804d0c34bf9e180533f	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	haskell-cabal	433b5153bec6b0ffe21c7be2210e8396	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6b3be2cd504ce526a33c180b6eb5b232
diff --git a/metadata/md5-cache/dev-util/systemtap-1.5 b/metadata/md5-cache/dev-util/systemtap-1.5
index aaeb14f..3265371 100644
--- a/metadata/md5-cache/dev-util/systemtap-1.5
+++ b/metadata/md5-cache/dev-util/systemtap-1.5
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/elfutils-0.131 sys-libs/libcap sqlite? ( =dev-db/sqlite-3* )
 SLOT=0
 SRC_URI=http://sources.redhat.com/systemtap/ftp/releases/systemtap-1.5.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a01494ea641045d1db8e3b937e8f0106
diff --git a/metadata/md5-cache/dev-util/tclint-2-r1 b/metadata/md5-cache/dev-util/tclint-2-r1
new file mode 100644
index 0000000..6209c2f
--- /dev/null
+++ b/metadata/md5-cache/dev-util/tclint-2-r1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=install
+DESCRIPTION=Linter for Chrome OS test configuration data
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/infra/infra/+/HEAD/go/src/infra/cros/cmd/tclint
+KEYWORDS=-* amd64
+LICENSE=BSD-Google
+RESTRICT=mirror
+SLOT=0
+SRC_URI=cipd://chromiumos/infra/tclint/linux-amd64:JWbE1OOypcIR7PTWuJsDP_WMIoKE2jujjfCGBu_h9zsC -> tclint-2.zip
+_md5_=645d8b7a2bc26c802235be8077a2f13a
diff --git a/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r578 b/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r578
deleted file mode 100644
index e69340a..0000000
--- a/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r578
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info install setup unpack
-DESCRIPTION=Compilation and runtime tests for toolchain
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/toolchain-utils/
-IUSE=cros_host cros_workon_tree_fbf628de87ea86d3fba4071ef23d6e467d04e503
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=app-misc/pax-utils dev-lang/python sys-devel/binutils
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=649ef9d4ec91174aa90d2f22d094a34b
diff --git a/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r623 b/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r623
new file mode 100644
index 0000000..870ea5a
--- /dev/null
+++ b/metadata/md5-cache/dev-util/toolchain-utils-0.0.1-r623
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info install setup unpack
+DESCRIPTION=Compilation and runtime tests for toolchain
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/toolchain-utils/
+IUSE=cros_host cros_workon_tree_b27c6b2de101470684d4c17acc91d746ebc542ed
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=app-misc/pax-utils dev-lang/python sys-devel/binutils
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b90cddbf54cfa2d3043f09fdd5e97052
diff --git a/metadata/md5-cache/dev-util/toolchain-utils-9999 b/metadata/md5-cache/dev-util/toolchain-utils-9999
index 668a57f..ea1cac5 100644
--- a/metadata/md5-cache/dev-util/toolchain-utils-9999
+++ b/metadata/md5-cache/dev-util/toolchain-utils-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=app-misc/pax-utils dev-lang/python sys-devel/binutils
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9be17ccb113646afb8a84044c260ca25
diff --git a/metadata/md5-cache/dev-util/turbostat-5.4.50-r2179 b/metadata/md5-cache/dev-util/turbostat-5.4.50-r2179
deleted file mode 100644
index ff652ba..0000000
--- a/metadata/md5-cache/dev-util/turbostat-5.4.50-r2179
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=sys-libs/libcap:=
-DESCRIPTION=Intel processor C-state and P-state reporting tool
-EAPI=7
-HOMEPAGE=https://www.kernel.org/
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_19c459c4803e83d8ee5a56601def950ee6fb6cec_3c6f0a290b022c6c50aa16ec5ea8478413dbc97b_271149b9f1e2617df41a5968210b918f9c716bd3
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=sys-libs/libcap:=
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f171f36fce9a850c17c15c3b5d37c847
diff --git a/metadata/md5-cache/dev-util/turbostat-5.4.68-r2199 b/metadata/md5-cache/dev-util/turbostat-5.4.68-r2199
new file mode 100644
index 0000000..640c8bc
--- /dev/null
+++ b/metadata/md5-cache/dev-util/turbostat-5.4.68-r2199
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=sys-libs/libcap:=
+DESCRIPTION=Intel processor C-state and P-state reporting tool
+EAPI=7
+HOMEPAGE=https://www.kernel.org/
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_355369d0b7cffd2ed82f98c4d5ad82dfff0dddca_e35c93e0a822d1de9d68c0cf6e2665fff75edf8f_271149b9f1e2617df41a5968210b918f9c716bd3
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=sys-libs/libcap:=
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9c1182369dfec6173a533cf29b85a78a
diff --git a/metadata/md5-cache/dev-util/turbostat-9999 b/metadata/md5-cache/dev-util/turbostat-9999
index 8b5f569..712c220 100644
--- a/metadata/md5-cache/dev-util/turbostat-9999
+++ b/metadata/md5-cache/dev-util/turbostat-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-libs/libcap:=
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4f3d473f54fb1f8c409703193df734f8
diff --git a/metadata/md5-cache/dev-util/vulkan-tools-1.1.92.0 b/metadata/md5-cache/dev-util/vulkan-tools-1.1.92.0
index 88dd079..7b39f7f 100644
--- a/metadata/md5-cache/dev-util/vulkan-tools-1.1.92.0
+++ b/metadata/md5-cache/dev-util/vulkan-tools-1.1.92.0
@@ -8,5 +8,5 @@
 LICENSE=Apache-2.0
 SLOT=0
 SRC_URI=https://github.com/KhronosGroup/Vulkan-Tools/archive/9bbdd552f0fd62741aa1f1e02ab3eafc45cf3c1e.tar.gz -> vulkan-tools-1.1.92.0.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=79d6b958431bf7c2242af692f1182343
diff --git a/metadata/md5-cache/dev-vcs/git-deps-1.0.2-r1 b/metadata/md5-cache/dev-vcs/git-deps-1.0.2-r1
new file mode 100644
index 0000000..f23c265
--- /dev/null
+++ b/metadata/md5-cache/dev-vcs/git-deps-1.0.2-r1
@@ -0,0 +1,14 @@
+DEFINED_PHASES=install postinst setup
+DEPEND=python_single_target_python3_6? ( dev-python/flask[python_targets_python3_6(-)] dev-python/pygit2[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/flask[python_targets_python3_7(-)] dev-python/pygit2[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/flask[python_targets_python3_8(-)] dev-python/pygit2[python_targets_python3_8(-)] ) net-libs/nodejs python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8 >=dev-lang/python-exec-2:=[python_targets_python3_8] )
+DESCRIPTION=git commit dependency analysis tool
+EAPI=7
+HOMEPAGE=https://github.com/aspiers/git-deps
+IUSE=python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=python_single_target_python3_6? ( dev-python/flask[python_targets_python3_6(-)] dev-python/pygit2[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/flask[python_targets_python3_7(-)] dev-python/pygit2[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/flask[python_targets_python3_8(-)] dev-python/pygit2[python_targets_python3_8(-)] ) net-libs/nodejs python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8 >=dev-lang/python-exec-2:=[python_targets_python3_8] )
+REQUIRED_USE=^^ ( python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 )
+SLOT=0/1.0.2-r1
+SRC_URI=https://github.com/aspiers/git-deps/archive/1.0.2.tar.gz -> git-deps-1.0.2.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2a3787087df1859e24985d4becf8f549
diff --git a/metadata/md5-cache/dev-vcs/patman-0.0.1-r338 b/metadata/md5-cache/dev-vcs/patman-0.0.1-r338
deleted file mode 100644
index fb93375..0000000
--- a/metadata/md5-cache/dev-vcs/patman-0.0.1-r338
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,-python_single_target_python3_6(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python3_6(-)?,-python_single_target_python3_6(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DESCRIPTION=Patman tool (from U-Boot) for sending patches upstream
-EAPI=7
-HOMEPAGE=https://www.denx.de/wiki/U-Boot
-IUSE=cros_host cros_workon_tree_0386b4da5d0b36ad084027b771b1045dfc38793b python_targets_python3_6
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_python3_6(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e33937a583d51e7b550991bbe7b2d047
diff --git a/metadata/md5-cache/dev-vcs/patman-0.0.1-r341 b/metadata/md5-cache/dev-vcs/patman-0.0.1-r341
new file mode 100644
index 0000000..3d61a3a
--- /dev/null
+++ b/metadata/md5-cache/dev-vcs/patman-0.0.1-r341
@@ -0,0 +1,14 @@
+BDEPEND=dev-python/setuptools[python_targets_python3_6(-)?,-python_single_target_python3_6(-)] dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python3_6(-)?,-python_single_target_python3_6(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DESCRIPTION=Patman tool (from U-Boot) for sending patches upstream
+EAPI=7
+HOMEPAGE=https://www.denx.de/wiki/U-Boot
+IUSE=cros_host cros_workon_tree_8da6ef5b49d3307fea8b69f202dc39fc01c256bb python_targets_python3_6
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_python3_6(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=15a65eb91a2b600709eb3220ad8a8e9f
diff --git a/metadata/md5-cache/dev-vcs/patman-9999 b/metadata/md5-cache/dev-vcs/patman-9999
index 8dd35bf..aabf8bc 100644
--- a/metadata/md5-cache/dev-vcs/patman-9999
+++ b/metadata/md5-cache/dev-vcs/patman-9999
@@ -10,5 +10,5 @@
 RDEPEND=python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_python3_6(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9a3427f4b7f4c67264d1256525e92922
diff --git a/metadata/md5-cache/media-fonts/notofonts-20200102 b/metadata/md5-cache/media-fonts/notofonts-20200102
deleted file mode 100644
index b214e56..0000000
--- a/metadata/md5-cache/media-fonts/notofonts-20200102
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install postinst postrm setup
-DEPEND=X? ( x11-apps/mkfontdir media-fonts/encodings ) >=media-libs/fontconfig-2.4.0
-DESCRIPTION=Noto Pan Unicode fonts developed by Monotype
-EAPI=7
-IUSE=X
-KEYWORDS=*
-LICENSE=OFL-1.1
-RESTRICT=strip binchecks
-SLOT=0
-SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/notofonts-20200102.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	font	bc3df4ed373e09f86a90e8fad39034d6	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=977846bf56587ee434ad535c9539f9f9
diff --git a/metadata/md5-cache/media-fonts/notofonts-20200102-r1 b/metadata/md5-cache/media-fonts/notofonts-20200102-r1
deleted file mode 100644
index b214e56..0000000
--- a/metadata/md5-cache/media-fonts/notofonts-20200102-r1
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install postinst postrm setup
-DEPEND=X? ( x11-apps/mkfontdir media-fonts/encodings ) >=media-libs/fontconfig-2.4.0
-DESCRIPTION=Noto Pan Unicode fonts developed by Monotype
-EAPI=7
-IUSE=X
-KEYWORDS=*
-LICENSE=OFL-1.1
-RESTRICT=strip binchecks
-SLOT=0
-SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/notofonts-20200102.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	font	bc3df4ed373e09f86a90e8fad39034d6	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=977846bf56587ee434ad535c9539f9f9
diff --git a/metadata/md5-cache/media-fonts/notofonts-20200917 b/metadata/md5-cache/media-fonts/notofonts-20200917
new file mode 100644
index 0000000..0fb249d
--- /dev/null
+++ b/metadata/md5-cache/media-fonts/notofonts-20200917
@@ -0,0 +1,12 @@
+DEFINED_PHASES=install postinst postrm setup
+DEPEND=X? ( x11-apps/mkfontdir media-fonts/encodings ) >=media-libs/fontconfig-2.4.0
+DESCRIPTION=Noto Pan Unicode fonts developed by Monotype
+EAPI=7
+IUSE=X
+KEYWORDS=*
+LICENSE=OFL-1.1
+RESTRICT=strip binchecks
+SLOT=0
+SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/notofonts-20200917.tar.xz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	font	bc3df4ed373e09f86a90e8fad39034d6	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=977846bf56587ee434ad535c9539f9f9
diff --git a/metadata/md5-cache/media-fonts/notofonts-20200917-r1 b/metadata/md5-cache/media-fonts/notofonts-20200917-r1
new file mode 100644
index 0000000..0fb249d
--- /dev/null
+++ b/metadata/md5-cache/media-fonts/notofonts-20200917-r1
@@ -0,0 +1,12 @@
+DEFINED_PHASES=install postinst postrm setup
+DEPEND=X? ( x11-apps/mkfontdir media-fonts/encodings ) >=media-libs/fontconfig-2.4.0
+DESCRIPTION=Noto Pan Unicode fonts developed by Monotype
+EAPI=7
+IUSE=X
+KEYWORDS=*
+LICENSE=OFL-1.1
+RESTRICT=strip binchecks
+SLOT=0
+SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/notofonts-20200917.tar.xz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	font	bc3df4ed373e09f86a90e8fad39034d6	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=977846bf56587ee434ad535c9539f9f9
diff --git a/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901 b/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901
new file mode 100644
index 0000000..02ff1d8
--- /dev/null
+++ b/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901
@@ -0,0 +1,14 @@
+BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
+DESCRIPTION=eSCL and WSD SANE backend
+EAPI=7
+HOMEPAGE=https://github.com/alexpevzner/sane-airscan
+IUSE=asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
+SLOT=0/0.99.17_pre20200901
+SRC_URI=https://github.com/alexpevzner/sane-airscan-unstable/archive/447b930c908eae36df42d9aeb2e6c2d75cf37144.tar.gz -> sane-airscan-447b930c908eae36df42d9aeb2e6c2d75cf37144.tar.gz
+_eclasses_=cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4ebbf7aef7966fb8bd3bb79aa091dfed
diff --git a/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901-r3 b/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901-r3
new file mode 100644
index 0000000..e85e2e5
--- /dev/null
+++ b/metadata/md5-cache/media-gfx/sane-airscan-0.99.17_pre20200901-r3
@@ -0,0 +1,14 @@
+BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
+DESCRIPTION=eSCL and WSD SANE backend
+EAPI=7
+HOMEPAGE=https://github.com/alexpevzner/sane-airscan
+IUSE=asan fuzzer fuzzer asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
+SLOT=0/0.99.17_pre20200901-r3
+SRC_URI=https://github.com/alexpevzner/sane-airscan-unstable/archive/447b930c908eae36df42d9aeb2e6c2d75cf37144.tar.gz -> sane-airscan-447b930c908eae36df42d9aeb2e6c2d75cf37144.tar.gz
+_eclasses_=cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4ebbf7aef7966fb8bd3bb79aa091dfed
diff --git a/metadata/md5-cache/media-gfx/sane-airscan-0.99.5 b/metadata/md5-cache/media-gfx/sane-airscan-0.99.5
deleted file mode 100644
index cb3f47a..0000000
--- a/metadata/md5-cache/media-gfx/sane-airscan-0.99.5
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DEFINED_PHASES=compile configure install test
-DEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
-DESCRIPTION=eSCL and WSD SANE backend
-EAPI=7
-HOMEPAGE=https://github.com/alexpevzner/sane-airscan
-IUSE=asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
-SLOT=0/0.99.5
-SRC_URI=https://github.com/alexpevzner/sane-airscan/archive/0.99.5.tar.gz -> sane-airscan-0.99.5.tar.gz
-_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=954265ce1c2edbd56b0040930c65400b
diff --git a/metadata/md5-cache/media-gfx/sane-airscan-0.99.5-r1 b/metadata/md5-cache/media-gfx/sane-airscan-0.99.5-r1
deleted file mode 100644
index 71f61bb..0000000
--- a/metadata/md5-cache/media-gfx/sane-airscan-0.99.5-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DEFINED_PHASES=compile configure install test
-DEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
-DESCRIPTION=eSCL and WSD SANE backend
-EAPI=7
-HOMEPAGE=https://github.com/alexpevzner/sane-airscan
-IUSE=asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=dev-libs/libxml2:= media-gfx/sane-backends:= media-libs/libjpeg-turbo:= media-libs/libpng:= net-dns/avahi:= net-libs/libsoup:=
-SLOT=0/0.99.5-r1
-SRC_URI=https://github.com/alexpevzner/sane-airscan/archive/0.99.5.tar.gz -> sane-airscan-0.99.5.tar.gz
-_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=954265ce1c2edbd56b0040930c65400b
diff --git a/metadata/md5-cache/media-gfx/sane-backends-1.0.30 b/metadata/md5-cache/media-gfx/sane-backends-1.0.30
deleted file mode 100644
index dd28295..0000000
--- a/metadata/md5-cache/media-gfx/sane-backends-1.0.30
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( sys-kernel/linux-headers ) >=sys-devel/gettext-0.18.1 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
-DESCRIPTION=Scanner Access Now Easy - Backends
-EAPI=7
-HOMEPAGE=http://www.sane-project.org/
-IUSE=gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf +sane_backends_abaton +sane_backends_agfafocus +sane_backends_apple +sane_backends_artec +sane_backends_artec_eplus48u +sane_backends_as6e +sane_backends_avision +sane_backends_bh +sane_backends_canon +sane_backends_canon630u +sane_backends_canon_dr -sane_backends_canon_pp +sane_backends_cardscan +sane_backends_coolscan +sane_backends_coolscan2 +sane_backends_coolscan3 +sane_backends_dc210 +sane_backends_dc240 +sane_backends_dc25 +sane_backends_dell1600n_net +sane_backends_dmc +sane_backends_epjitsu +sane_backends_epson +sane_backends_epson2 -sane_backends_escl +sane_backends_fujitsu +sane_backends_genesys +sane_backends_gt68xx +sane_backends_hp +sane_backends_hp3500 +sane_backends_hp3900 +sane_backends_hp4200 +sane_backends_hp5400 +sane_backends_hp5590 +sane_backends_hpljm1005 -sane_backends_hpsj5s +sane_backends_hs2p +sane_backends_ibm +sane_backends_kodak +sane_backends_kodakaio +sane_backends_kvs1025 +sane_backends_kvs20xx sane_backends_kvs40xx +sane_backends_leo +sane_backends_lexmark +sane_backends_ma1509 +sane_backends_magicolor +sane_backends_matsushita +sane_backends_microtek +sane_backends_microtek2 +sane_backends_mustek -sane_backends_mustek_pp +sane_backends_mustek_usb sane_backends_mustek_usb2 +sane_backends_nec +sane_backends_net +sane_backends_niash +sane_backends_p5 +sane_backends_pie +sane_backends_pixma +sane_backends_plustek +sane_backends_plustek_pp -sane_backends_pnm +sane_backends_qcam +sane_backends_ricoh +sane_backends_ricoh2 +sane_backends_rts8891 +sane_backends_s9036 +sane_backends_sceptre +sane_backends_sharp +sane_backends_sm3600 +sane_backends_sm3840 +sane_backends_snapscan +sane_backends_sp15c +sane_backends_st400 +sane_backends_stv680 +sane_backends_tamarack +sane_backends_teco1 +sane_backends_teco2 +sane_backends_teco3 +sane_backends_test +sane_backends_u12 +sane_backends_umax +sane_backends_umax1220u +sane_backends_umax_pp +sane_backends_xerox_mfp abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=GPL-2 public-domain
-RDEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-apps/baselayout
-REQUIRED_USE=sane_backends_mustek_usb2? ( threads ) sane_backends_kvs40xx? ( threads )
-SLOT=0
-SRC_URI=https://gitlab.com/sane-project/backends/-/archive/1.0.30/backends-1.0.30.tar.gz -> sane-backends-1.0.30.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=4f384dbf4b28b5516ada07ea0de026fc
diff --git a/metadata/md5-cache/media-gfx/sane-backends-1.0.30-r1 b/metadata/md5-cache/media-gfx/sane-backends-1.0.30-r1
deleted file mode 100644
index dd28295..0000000
--- a/metadata/md5-cache/media-gfx/sane-backends-1.0.30-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( sys-kernel/linux-headers ) >=sys-devel/gettext-0.18.1 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
-DESCRIPTION=Scanner Access Now Easy - Backends
-EAPI=7
-HOMEPAGE=http://www.sane-project.org/
-IUSE=gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf +sane_backends_abaton +sane_backends_agfafocus +sane_backends_apple +sane_backends_artec +sane_backends_artec_eplus48u +sane_backends_as6e +sane_backends_avision +sane_backends_bh +sane_backends_canon +sane_backends_canon630u +sane_backends_canon_dr -sane_backends_canon_pp +sane_backends_cardscan +sane_backends_coolscan +sane_backends_coolscan2 +sane_backends_coolscan3 +sane_backends_dc210 +sane_backends_dc240 +sane_backends_dc25 +sane_backends_dell1600n_net +sane_backends_dmc +sane_backends_epjitsu +sane_backends_epson +sane_backends_epson2 -sane_backends_escl +sane_backends_fujitsu +sane_backends_genesys +sane_backends_gt68xx +sane_backends_hp +sane_backends_hp3500 +sane_backends_hp3900 +sane_backends_hp4200 +sane_backends_hp5400 +sane_backends_hp5590 +sane_backends_hpljm1005 -sane_backends_hpsj5s +sane_backends_hs2p +sane_backends_ibm +sane_backends_kodak +sane_backends_kodakaio +sane_backends_kvs1025 +sane_backends_kvs20xx sane_backends_kvs40xx +sane_backends_leo +sane_backends_lexmark +sane_backends_ma1509 +sane_backends_magicolor +sane_backends_matsushita +sane_backends_microtek +sane_backends_microtek2 +sane_backends_mustek -sane_backends_mustek_pp +sane_backends_mustek_usb sane_backends_mustek_usb2 +sane_backends_nec +sane_backends_net +sane_backends_niash +sane_backends_p5 +sane_backends_pie +sane_backends_pixma +sane_backends_plustek +sane_backends_plustek_pp -sane_backends_pnm +sane_backends_qcam +sane_backends_ricoh +sane_backends_ricoh2 +sane_backends_rts8891 +sane_backends_s9036 +sane_backends_sceptre +sane_backends_sharp +sane_backends_sm3600 +sane_backends_sm3840 +sane_backends_snapscan +sane_backends_sp15c +sane_backends_st400 +sane_backends_stv680 +sane_backends_tamarack +sane_backends_teco1 +sane_backends_teco2 +sane_backends_teco3 +sane_backends_test +sane_backends_u12 +sane_backends_umax +sane_backends_umax1220u +sane_backends_umax_pp +sane_backends_xerox_mfp abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=GPL-2 public-domain
-RDEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-apps/baselayout
-REQUIRED_USE=sane_backends_mustek_usb2? ( threads ) sane_backends_kvs40xx? ( threads )
-SLOT=0
-SRC_URI=https://gitlab.com/sane-project/backends/-/archive/1.0.30/backends-1.0.30.tar.gz -> sane-backends-1.0.30.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=4f384dbf4b28b5516ada07ea0de026fc
diff --git a/metadata/md5-cache/media-gfx/sane-backends-1.0.31 b/metadata/md5-cache/media-gfx/sane-backends-1.0.31
new file mode 100644
index 0000000..e686fd0
--- /dev/null
+++ b/metadata/md5-cache/media-gfx/sane-backends-1.0.31
@@ -0,0 +1,15 @@
+BDEPEND=>=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure install postinst prepare setup test
+DEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( sys-kernel/linux-headers ) >=sys-devel/gettext-0.18.1 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
+DESCRIPTION=Scanner Access Now Easy - Backends
+EAPI=7
+HOMEPAGE=http://www.sane-project.org/
+IUSE=gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf +sane_backends_abaton +sane_backends_agfafocus +sane_backends_apple +sane_backends_artec +sane_backends_artec_eplus48u +sane_backends_as6e +sane_backends_avision +sane_backends_bh +sane_backends_canon +sane_backends_canon630u +sane_backends_canon_dr +sane_backends_canon_lide70 -sane_backends_canon_pp +sane_backends_cardscan +sane_backends_coolscan +sane_backends_coolscan2 +sane_backends_coolscan3 +sane_backends_dc210 +sane_backends_dc240 +sane_backends_dc25 +sane_backends_dell1600n_net +sane_backends_dmc +sane_backends_epjitsu +sane_backends_epson +sane_backends_epson2 -sane_backends_escl +sane_backends_fujitsu +sane_backends_genesys +sane_backends_gt68xx +sane_backends_hp +sane_backends_hp3500 +sane_backends_hp3900 +sane_backends_hp4200 +sane_backends_hp5400 +sane_backends_hp5590 +sane_backends_hpljm1005 -sane_backends_hpsj5s +sane_backends_hs2p +sane_backends_ibm +sane_backends_kodak +sane_backends_kodakaio +sane_backends_kvs1025 +sane_backends_kvs20xx sane_backends_kvs40xx +sane_backends_leo +sane_backends_lexmark +sane_backends_ma1509 +sane_backends_magicolor +sane_backends_matsushita +sane_backends_microtek +sane_backends_microtek2 +sane_backends_mustek -sane_backends_mustek_pp +sane_backends_mustek_usb sane_backends_mustek_usb2 +sane_backends_nec +sane_backends_net +sane_backends_niash +sane_backends_p5 +sane_backends_pie +sane_backends_pixma +sane_backends_plustek +sane_backends_plustek_pp -sane_backends_pnm +sane_backends_qcam +sane_backends_ricoh +sane_backends_ricoh2 +sane_backends_rts8891 +sane_backends_s9036 +sane_backends_sceptre +sane_backends_sharp +sane_backends_sm3600 +sane_backends_sm3840 +sane_backends_snapscan +sane_backends_sp15c +sane_backends_st400 +sane_backends_stv680 +sane_backends_tamarack +sane_backends_teco1 +sane_backends_teco2 +sane_backends_teco3 +sane_backends_test +sane_backends_u12 +sane_backends_umax +sane_backends_umax1220u +sane_backends_umax_pp +sane_backends_xerox_mfp abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2 public-domain
+RDEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-apps/baselayout
+REQUIRED_USE=sane_backends_mustek_usb2? ( threads ) sane_backends_kvs40xx? ( threads )
+SLOT=0
+SRC_URI=https://gitlab.com/sane-project/backends/-/archive/1.0.31/backends-1.0.31.tar.gz -> sane-backends-1.0.31.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=5771aee5e08db3f331669f57d3d11568
diff --git a/metadata/md5-cache/media-gfx/sane-backends-1.0.31-r2 b/metadata/md5-cache/media-gfx/sane-backends-1.0.31-r2
new file mode 100644
index 0000000..e686fd0
--- /dev/null
+++ b/metadata/md5-cache/media-gfx/sane-backends-1.0.31-r2
@@ -0,0 +1,15 @@
+BDEPEND=>=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=compile configure install postinst prepare setup test
+DEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( sys-kernel/linux-headers ) >=sys-devel/gettext-0.18.1 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
+DESCRIPTION=Scanner Access Now Easy - Backends
+EAPI=7
+HOMEPAGE=http://www.sane-project.org/
+IUSE=gphoto2 ipv6 snmp systemd threads usb v4l xinetd zeroconf +sane_backends_abaton +sane_backends_agfafocus +sane_backends_apple +sane_backends_artec +sane_backends_artec_eplus48u +sane_backends_as6e +sane_backends_avision +sane_backends_bh +sane_backends_canon +sane_backends_canon630u +sane_backends_canon_dr +sane_backends_canon_lide70 -sane_backends_canon_pp +sane_backends_cardscan +sane_backends_coolscan +sane_backends_coolscan2 +sane_backends_coolscan3 +sane_backends_dc210 +sane_backends_dc240 +sane_backends_dc25 +sane_backends_dell1600n_net +sane_backends_dmc +sane_backends_epjitsu +sane_backends_epson +sane_backends_epson2 -sane_backends_escl +sane_backends_fujitsu +sane_backends_genesys +sane_backends_gt68xx +sane_backends_hp +sane_backends_hp3500 +sane_backends_hp3900 +sane_backends_hp4200 +sane_backends_hp5400 +sane_backends_hp5590 +sane_backends_hpljm1005 -sane_backends_hpsj5s +sane_backends_hs2p +sane_backends_ibm +sane_backends_kodak +sane_backends_kodakaio +sane_backends_kvs1025 +sane_backends_kvs20xx sane_backends_kvs40xx +sane_backends_leo +sane_backends_lexmark +sane_backends_ma1509 +sane_backends_magicolor +sane_backends_matsushita +sane_backends_microtek +sane_backends_microtek2 +sane_backends_mustek -sane_backends_mustek_pp +sane_backends_mustek_usb sane_backends_mustek_usb2 +sane_backends_nec +sane_backends_net +sane_backends_niash +sane_backends_p5 +sane_backends_pie +sane_backends_pixma +sane_backends_plustek +sane_backends_plustek_pp -sane_backends_pnm +sane_backends_qcam +sane_backends_ricoh +sane_backends_ricoh2 +sane_backends_rts8891 +sane_backends_s9036 +sane_backends_sceptre +sane_backends_sharp +sane_backends_sm3600 +sane_backends_sm3840 +sane_backends_snapscan +sane_backends_sp15c +sane_backends_st400 +sane_backends_stv680 +sane_backends_tamarack +sane_backends_teco1 +sane_backends_teco2 +sane_backends_teco3 +sane_backends_test +sane_backends_u12 +sane_backends_umax +sane_backends_umax1220u +sane_backends_umax_pp +sane_backends_xerox_mfp abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2 public-domain
+RDEPEND=sane_backends_dc210? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dc240? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_dell1600n_net? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/tiff-3.9.7-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_canon_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_hpsj5s? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sane_backends_mustek_pp? ( >=sys-libs/libieee1284-0.2.11-r3[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) usb? ( >=virtual/libusb-1-r1:1=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) gphoto2? ( >=media-libs/libgphoto2-2.5.3.1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) v4l? ( >=media-libs/libv4l-0.9.5[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) xinetd? ( sys-apps/xinetd ) snmp? ( net-analyzer/net-snmp:0= ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) sys-apps/baselayout
+REQUIRED_USE=sane_backends_mustek_usb2? ( threads ) sane_backends_kvs40xx? ( threads )
+SLOT=0
+SRC_URI=https://gitlab.com/sane-project/backends/-/archive/1.0.31/backends-1.0.31.tar.gz -> sane-backends-1.0.31.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=5771aee5e08db3f331669f57d3d11568
diff --git a/metadata/md5-cache/media-gfx/vadumpcaps-20190304 b/metadata/md5-cache/media-gfx/vadumpcaps-20190304
index 25c7b30..eaeab3b 100644
--- a/metadata/md5-cache/media-gfx/vadumpcaps-20190304
+++ b/metadata/md5-cache/media-gfx/vadumpcaps-20190304
@@ -1,14 +1,12 @@
 DEFINED_PHASES=compile install prepare
-DEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4 virtual/pkgconfig
 DESCRIPTION=Dump capabilities of VA-API device/driver
 EAPI=6
 HOMEPAGE=https://github.com/fhvwy/vadumpcaps
-IUSE=+drm test wayland X
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 )
-REQUIRED_USE=|| ( drm wayland X )
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4
 SLOT=0
 SRC_URI=https://github.com/fhvwy/vadumpcaps/archive/fb4dfef76c0fa08f853af377d5d4945d5fb3001c.tar.gz -> vadumpcaps-20190304.tar.gz
 _eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0a295f6beac895744c80173add18286b
+_md5_=fac91cdeb2867ded6f499bf7ed041d28
diff --git a/metadata/md5-cache/media-gfx/vadumpcaps-20190304-r1 b/metadata/md5-cache/media-gfx/vadumpcaps-20190304-r1
new file mode 100644
index 0000000..eaeab3b
--- /dev/null
+++ b/metadata/md5-cache/media-gfx/vadumpcaps-20190304-r1
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile install prepare
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4 virtual/pkgconfig
+DESCRIPTION=Dump capabilities of VA-API device/driver
+EAPI=6
+HOMEPAGE=https://github.com/fhvwy/vadumpcaps
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4
+SLOT=0
+SRC_URI=https://github.com/fhvwy/vadumpcaps/archive/fb4dfef76c0fa08f853af377d5d4945d5fb3001c.tar.gz -> vadumpcaps-20190304.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fac91cdeb2867ded6f499bf7ed041d28
diff --git a/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2 b/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2
index 4fe11bf..a8b9f0d 100644
--- a/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2
+++ b/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2
@@ -1,15 +1,15 @@
 BDEPEND=>=app-portage/elt-patches-20170815
 DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] ) doc? ( >=app-doc/doxygen-1.2.6 ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) ) doc? ( >=app-doc/doxygen-1.2.6 ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Advanced Linux Sound Architecture Library
 EAPI=7
 HOMEPAGE=https://alsa-project.org/
-IUSE=alisp debug doc elibc_uclibc python +thread-safety abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=alisp debug doc elibc_uclibc python +thread-safety abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=*
 LICENSE=LGPL-2.1
-RDEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) )
+RDEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) )
 SLOT=0
 SRC_URI=https://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.1.2.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0bb738dbce615d99fb6d3c6118005f72
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b299008ced47e01149ea404e09151f5
diff --git a/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r1 b/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r1
deleted file mode 100644
index 4fe11bf..0000000
--- a/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=app-portage/elt-patches-20170815
-DEFINED_PHASES=compile configure install prepare setup test
-DEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] ) doc? ( >=app-doc/doxygen-1.2.6 ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Advanced Linux Sound Architecture Library
-EAPI=7
-HOMEPAGE=https://alsa-project.org/
-IUSE=alisp debug doc elibc_uclibc python +thread-safety abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
-KEYWORDS=*
-LICENSE=LGPL-2.1
-RDEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) )
-SLOT=0
-SRC_URI=https://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.1.2.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0bb738dbce615d99fb6d3c6118005f72
diff --git a/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r2 b/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r2
new file mode 100644
index 0000000..a8b9f0d
--- /dev/null
+++ b/metadata/md5-cache/media-libs/alsa-lib-1.2.1.2-r2
@@ -0,0 +1,15 @@
+BDEPEND=>=app-portage/elt-patches-20170815
+DEFINED_PHASES=compile configure install prepare setup test
+DEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) ) doc? ( >=app-doc/doxygen-1.2.6 ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Advanced Linux Sound Architecture Library
+EAPI=7
+HOMEPAGE=https://alsa-project.org/
+IUSE=alisp debug doc elibc_uclibc python +thread-safety abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
+KEYWORDS=*
+LICENSE=LGPL-2.1
+RDEPEND=python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) )
+SLOT=0
+SRC_URI=https://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.1.2.tar.bz2
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b299008ced47e01149ea404e09151f5
diff --git a/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r470 b/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r470
deleted file mode 100644
index 199d861..0000000
--- a/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r470
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Runtime detect the number of cameras on device to generate corresponding media_profiles.xml.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_1ced2e0a68de537e63a5f90fc704bde11c4b2375_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e05dc61da4f4c79fa310de0f20ff6d1d
diff --git a/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r533 b/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r533
new file mode 100644
index 0000000..ca651c3
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-camera-profile-0.0.1-r533
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Runtime detect the number of cameras on device to generate corresponding media_profiles.xml.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_871bb7e6654a823f1468a5857b4c74f12aaedbb5_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ecae48538e6503ea0971b01c929122cd
diff --git a/metadata/md5-cache/media-libs/arc-camera-profile-9999 b/metadata/md5-cache/media-libs/arc-camera-profile-9999
index 5573ac8..9c150d6 100644
--- a/metadata/md5-cache/media-libs/arc-camera-profile-9999
+++ b/metadata/md5-cache/media-libs/arc-camera-profile-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c726dc36297cdc38e4229214c056804d
diff --git a/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r431 b/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r431
deleted file mode 100644
index a1bac6e..0000000
--- a/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r431
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=!chromeos-base/arc-camera-service media-libs/cros-camera-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=ARC camera service. The service is in charge of accessing camera device. It uses linux domain socket (/run/camera/camera.sock) to build a synchronous channel.
-EAPI=5
-IUSE=-asan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_65e27114752b7ab8f4cede066f4a586059bd7e61_c8cf946e212b8355bc1f53f077004c814532e904_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_65e27114752b7ab8f4cede066f4a586059bd7e61_c8cf946e212b8355bc1f53f077004c814532e904_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=!chromeos-base/arc-camera-service media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=a69bb3f106a2059c7697cdca2539b264
diff --git a/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r479 b/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r479
new file mode 100644
index 0000000..604dce23
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-camera-service-0.0.1-r479
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=!chromeos-base/arc-camera-service media-libs/cros-camera-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=ARC camera service. The service is in charge of accessing camera device. It uses linux domain socket (/run/camera/camera.sock) to build a synchronous channel.
+EAPI=5
+IUSE=-asan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_3f2ee10a205c3f5536485cb276c251689e36c033_818ca8722bdd9b9d8291a6a4caa5e5475d4191fc_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_3f2ee10a205c3f5536485cb276c251689e36c033_818ca8722bdd9b9d8291a6a4caa5e5475d4191fc_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=!chromeos-base/arc-camera-service media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=7e5be9629e9a272f22f88a85edb21413
diff --git a/metadata/md5-cache/media-libs/arc-camera-service-9999 b/metadata/md5-cache/media-libs/arc-camera-service-9999
index 528fefe..de5b8df 100644
--- a/metadata/md5-cache/media-libs/arc-camera-service-9999
+++ b/metadata/md5-cache/media-libs/arc-camera-service-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live
 RDEPEND=!chromeos-base/arc-camera-service media-libs/cros-camera-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=9b792fb58861a2c78b9f9aab86dc3c3d
diff --git a/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r327 b/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r327
deleted file mode 100644
index f3ab72c..0000000
--- a/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r327
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=x11-libs/arc-libdrm[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] video_cards_amdgpu? ( virtual/arc-opengles ) sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=ChromeOS gralloc implementation
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/minigbm
-IUSE=kernel-3_8 kernel-3_14 kernel-3_18 video_cards_amdgpu video_cards_exynos video_cards_intel video_cards_marvell video_cards_mediatek video_cards_msm video_cards_rockchip video_cards_tegra video_cards_virgl abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master cros_host cros_workon_tree_ace310f1a73abd463d2bffeb930f6a8ae3036fc0
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=x11-libs/arc-libdrm[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d494168dabfcd05f7af0f688ce58fa8e
diff --git a/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r350 b/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r350
new file mode 100644
index 0000000..abd352a
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-cros-gralloc-0.0.1-r350
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=x11-libs/arc-libdrm[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] video_cards_amdgpu? ( virtual/arc-opengles ) sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=ChromeOS gralloc implementation
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/minigbm
+IUSE=kernel-3_8 kernel-3_14 kernel-3_18 video_cards_amdgpu video_cards_exynos video_cards_intel video_cards_marvell video_cards_mediatek video_cards_msm video_cards_rockchip video_cards_tegra video_cards_virgl abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master cros_host cros_workon_tree_fc83b8e971487f9d9e09f6c05bbf637346542ce8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=x11-libs/arc-libdrm[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0ddb01887ce89f0731de1722519d04e2
diff --git a/metadata/md5-cache/media-libs/arc-cros-gralloc-9999 b/metadata/md5-cache/media-libs/arc-cros-gralloc-9999
index a578197..0175d59 100644
--- a/metadata/md5-cache/media-libs/arc-cros-gralloc-9999
+++ b/metadata/md5-cache/media-libs/arc-cros-gralloc-9999
@@ -11,5 +11,5 @@
 RDEPEND=x11-libs/arc-libdrm[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c4672b15846477bfcbef95c655b8edf0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3d89bf58717bb22cc9c799a53a187f9f
diff --git a/metadata/md5-cache/media-libs/arc-mesa-19.0 b/metadata/md5-cache/media-libs/arc-mesa-19.0
index d3eb7072..7c591eb 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-19.0
+++ b/metadata/md5-cache/media-libs/arc-mesa-19.0
@@ -10,5 +10,5 @@
 RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( >=sys-devel/arc-llvm-9:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=53519eb525e3e53cb801f781a8dd06c9
diff --git a/metadata/md5-cache/media-libs/arc-mesa-19.0-r36 b/metadata/md5-cache/media-libs/arc-mesa-19.0-r36
index d3eb7072..7c591eb 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-19.0-r36
+++ b/metadata/md5-cache/media-libs/arc-mesa-19.0-r36
@@ -10,5 +10,5 @@
 RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( >=sys-devel/arc-llvm-9:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=53519eb525e3e53cb801f781a8dd06c9
diff --git a/metadata/md5-cache/media-libs/arc-mesa-9999 b/metadata/md5-cache/media-libs/arc-mesa-9999
index 5a0254f..11849a8 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-9999
@@ -10,5 +10,5 @@
 RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( >=sys-devel/arc-llvm-9:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e8a5d35c84d6426336ae68c2315d1e78
diff --git a/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r14 b/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r14
deleted file mode 100644
index 307c85e..0000000
--- a/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r14
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
-DEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-pi -android_gles2 -android_gles30 -android_gles31 +android_gles32 -android_vulkan_compute_0 cheets +classic debug dri +egl +gallium -gbm +gles1 +gles2 +llvm +nptl pic selinux +shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_67dba866ca9ec7c9910a901f0cfb80de3e4646a1 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !media-libs/arc-mesa
-REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( || ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e7dbd07b2e7f8cd93c96f32acb034272
diff --git a/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r22 b/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r22
new file mode 100644
index 0000000..3917f53
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-mesa-amd-19.3.5-r22
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=The Mesa 3D Graphics Library
+EAPI=6
+HOMEPAGE=http://mesa3d.org/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe android-container-pi -android_vulkan_compute_0 cheets debug vulkan cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_cadd4bad01f90199f6d3f096b73343801c9d5680 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=MIT
+PROPERTIES=live
+RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !media-libs/arc-mesa
+REQUIRED_USE=android_vulkan_compute_0? ( vulkan ) vulkan? ( || ( video_cards_amdgpu video_cards_intel ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=91a68a052de665c4893140b34b2660a3
diff --git a/metadata/md5-cache/media-libs/arc-mesa-amd-9999 b/metadata/md5-cache/media-libs/arc-mesa-amd-9999
index eb4507e..d736fd5 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-amd-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-amd-9999
@@ -1,14 +1,14 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
-DEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=OpenGL-like graphic library for Linux
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=The Mesa 3D Graphics Library
 EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-pi -android_gles2 -android_gles30 -android_gles31 +android_gles32 -android_vulkan_compute_0 cheets +classic debug dri +egl +gallium -gbm +gles1 +gles2 +llvm +nptl pic selinux +shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+HOMEPAGE=http://mesa3d.org/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe android-container-pi -android_vulkan_compute_0 cheets debug vulkan cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
 KEYWORDS=~*
-LICENSE=MIT LGPL-3 SGI-B-2.0
+LICENSE=MIT
 PROPERTIES=live
-RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !media-libs/arc-mesa
-REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( || ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !media-libs/arc-mesa
+REQUIRED_USE=android_vulkan_compute_0? ( vulkan ) vulkan? ( || ( video_cards_amdgpu video_cards_intel ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=202e18a522589cac5acff1760030bcb5
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b2d7e7375bf2c90dc7318f050bd125cc
diff --git a/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.2.0_pre-r35 b/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.2.0_pre-r35
deleted file mode 100644
index 41be600..0000000
--- a/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.2.0_pre-r35
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install pretend setup test unpack
-DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=cheets cheets_user cheets_user_64 debug -vulkan abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_8bb43c3865c00e0b9d17c8d2bebf941a4b570d26 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=MIT SGI-B-2.0
-PROPERTIES=live
-RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-REQUIRED_USE=cheets cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8b091b25faaa7560c8dfa5b2d185b812
diff --git a/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.3.0_pre-r42 b/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.3.0_pre-r42
new file mode 100644
index 0000000..c141486
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-mesa-freedreno-20.3.0_pre-r42
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install pretend setup test unpack
+DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=6
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=cheets cheets_user cheets_user_64 debug -vulkan abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_709132dcdf35676fc5ef0aa29e20d043aa4a5dd6 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=MIT SGI-B-2.0
+PROPERTIES=live
+RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+REQUIRED_USE=cheets cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8b9fba69d17d25b2ae8eb08d40aca456
diff --git a/metadata/md5-cache/media-libs/arc-mesa-freedreno-9999 b/metadata/md5-cache/media-libs/arc-mesa-freedreno-9999
index 430816d..0535b174 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-freedreno-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-freedreno-9999
@@ -10,5 +10,5 @@
 RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
 REQUIRED_USE=cheets cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=80336da25da3fab8734acde30f481dd4
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=70d5de271424ecf265ff940efce8e0a4
diff --git a/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1 b/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1
index 64a4576..6036660 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1
+++ b/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1
@@ -3,12 +3,12 @@
 DESCRIPTION=OpenGL-like graphic library for Linux
 EAPI=5
 HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_040a39591a38d3dc778725575c72dcdc1b07e032 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_040a39591a38d3dc778725575c72dcdc1b07e032 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
 KEYWORDS=*
 LICENSE=MIT LGPL-3 SGI-B-2.0
 PROPERTIES=live
 RDEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel video_cards_powervr ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b60fc264fe0517242378537bd344f1b3
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=da1f629f666df69e4c10f04667f2b0d4
diff --git a/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r5 b/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r5
deleted file mode 100644
index 64a4576..0000000
--- a/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r5
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
-DEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=5
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_040a39591a38d3dc778725575c72dcdc1b07e032 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
-REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel video_cards_powervr ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b60fc264fe0517242378537bd344f1b3
diff --git a/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r6 b/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r6
new file mode 100644
index 0000000..6036660
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-mesa-img-19.0_pre1-r6
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
+DEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=5
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_040a39591a38d3dc778725575c72dcdc1b07e032 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=MIT LGPL-3 SGI-B-2.0
+PROPERTIES=live
+RDEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
+REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel video_cards_powervr ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=da1f629f666df69e4c10f04667f2b0d4
diff --git a/metadata/md5-cache/media-libs/arc-mesa-img-9999 b/metadata/md5-cache/media-libs/arc-mesa-img-9999
index 59ff5fb..1fa2079 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-img-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-img-9999
@@ -3,12 +3,12 @@
 DESCRIPTION=OpenGL-like graphic library for Linux
 EAPI=5
 HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl -gallium -gbm gles1 gles2 -llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
 KEYWORDS=~*
 LICENSE=MIT LGPL-3 SGI-B-2.0
 PROPERTIES=live
 RDEPEND=video_cards_powervr? ( media-libs/arc-img-ddk !<media-libs/arc-img-ddk-1.9 ) cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel video_cards_powervr ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2265ed5a0b6c794593d67cc5317d952c
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dfd72b59d5a3e343481dec9d8cf33b60
diff --git a/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_pre-r14 b/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_pre-r14
deleted file mode 100644
index 0000af8..0000000
--- a/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_pre-r14
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=The Mesa 3D Graphics Library
-EAPI=6
-HOMEPAGE=http://mesa3d.org/
-IUSE=cheets cheets_user cheets_user_64 debug vulkan android_vulkan_compute_0 android_aep abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_c74c7b6b64e5e219a9a2245a1ef2a8dfb98d8663 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=MIT SGI-B-2.0
-PROPERTIES=live
-RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-REQUIRED_USE=cheets android_vulkan_compute_0? ( vulkan ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3c8125359b4d3f5a1b3dd7fcab865292
diff --git a/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_rc1-r15 b/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_rc1-r15
new file mode 100644
index 0000000..3c70638
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-mesa-iris-20.2.0_rc1-r15
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=The Mesa 3D Graphics Library
+EAPI=6
+HOMEPAGE=http://mesa3d.org/
+IUSE=cheets cheets_user cheets_user_64 debug vulkan android_vulkan_compute_0 android_aep abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_bfd09ab3e5c477cdb942fd0291460e01d1d37182 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=MIT SGI-B-2.0
+PROPERTIES=live
+RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+REQUIRED_USE=cheets android_vulkan_compute_0? ( vulkan ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9aef9a03455b1ed4a2d47427f64101dd
diff --git a/metadata/md5-cache/media-libs/arc-mesa-iris-9999 b/metadata/md5-cache/media-libs/arc-mesa-iris-9999
index 41121b2..af21efd 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-iris-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-iris-9999
@@ -10,5 +10,5 @@
 RDEPEND=>=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
 REQUIRED_USE=cheets android_vulkan_compute_0? ( vulkan ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b23abd7cfe30f361b6f8196e22003916
diff --git a/metadata/md5-cache/media-libs/arc-mesa-virgl-20 b/metadata/md5-cache/media-libs/arc-mesa-virgl-20
index 66723c3..0d3c0e41 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-virgl-20
+++ b/metadata/md5-cache/media-libs/arc-mesa-virgl-20
@@ -3,12 +3,12 @@
 DESCRIPTION=OpenGL-like graphic library for Linux
 EAPI=6
 HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl +gallium -gbm gles1 gles2 +llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_cde5431fb6fb5b6843049a5df677de47050df448 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 +cheets classic debug dri +egl +gallium -gbm +gles1 +gles2 -llvm +nptl pic selinux +shared-glapi -vulkan -X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_cde5431fb6fb5b6843049a5df677de47050df448 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
 KEYWORDS=*
 LICENSE=MIT LGPL-3 SGI-B-2.0
 PROPERTIES=live
 RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=655b7d22a94aae0ef73b793a41480b0a
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fb89c9450ef32dabc727a5fac25ff1b7
diff --git a/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r11 b/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r11
new file mode 100644
index 0000000..0d3c0e41
--- /dev/null
+++ b/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r11
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
+DEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=6
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 +cheets classic debug dri +egl +gallium -gbm +gles1 +gles2 -llvm +nptl pic selinux +shared-glapi -vulkan -X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_cde5431fb6fb5b6843049a5df677de47050df448 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+KEYWORDS=*
+LICENSE=MIT LGPL-3 SGI-B-2.0
+PROPERTIES=live
+RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
+REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
+SLOT=0
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fb89c9450ef32dabc727a5fac25ff1b7
diff --git a/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r4 b/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r4
deleted file mode 100644
index 66723c3..0000000
--- a/metadata/md5-cache/media-libs/arc-mesa-virgl-20.0.7-r4
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst prepare setup test unpack
-DEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-devel/arc-build[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl +gallium -gbm gles1 gles2 +llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_cde5431fb6fb5b6843049a5df677de47050df448 arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
-REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
-SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=655b7d22a94aae0ef73b793a41480b0a
diff --git a/metadata/md5-cache/media-libs/arc-mesa-virgl-9999 b/metadata/md5-cache/media-libs/arc-mesa-virgl-9999
index 7c2acf9..19cb093 100644
--- a/metadata/md5-cache/media-libs/arc-mesa-virgl-9999
+++ b/metadata/md5-cache/media-libs/arc-mesa-virgl-9999
@@ -3,12 +3,12 @@
 DESCRIPTION=OpenGL-like graphic library for Linux
 EAPI=6
 HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep android-container-nyc -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 cheets +classic debug dri egl +gallium -gbm gles1 gles2 +llvm +nptl pic selinux shared-glapi vulkan X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_powervr video_cards_r128 video_cards_savage video_cards_sis video_cards_vmware video_cards_tdfx video_cards_via video_cards_freedreno video_cards_virgl android_aep -android_gles2 -android_gles30 +android_gles31 -android_gles32 -android_vulkan_compute_0 +cheets classic debug dri +egl +gallium -gbm +gles1 +gles2 -llvm +nptl pic selinux +shared-glapi -vulkan -X xlib-glx cheets_user cheets_user_64 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 cros_host cros_workon_tree_ arcpp arcvm cheets android-container-pi android-vm-pi android-vm-rvc android-vm-master
 KEYWORDS=~*
 LICENSE=MIT LGPL-3 SGI-B-2.0
 PROPERTIES=live
 RDEPEND=cheets? ( >=x11-libs/arc-libdrm-2.4.82[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] llvm? ( sys-devel/arc-llvm:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( dev-libs/arc-libelf[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) )
 REQUIRED_USE=^^ ( android_gles2 android_gles30 android_gles31 android_gles32 ) android_aep? ( !android_gles2 !android_gles30 ) android_vulkan_compute_0? ( vulkan ) cheets? ( vulkan? ( ^^ ( video_cards_amdgpu video_cards_intel ) ) video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( !cheets_user !cheets_user_64 ) ) cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=68dbfd253eb044ea1a10db47434c920d
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9f816ac0ed17ee00c870c7b7bb6ca795
diff --git a/metadata/md5-cache/media-libs/cros-camera-android-headers-0.0.1-r178 b/metadata/md5-cache/media-libs/cros-camera-android-headers-0.0.1-r178
index 0424eb2..ce88413 100644
--- a/metadata/md5-cache/media-libs/cros-camera-android-headers-0.0.1-r178
+++ b/metadata/md5-cache/media-libs/cros-camera-android-headers-0.0.1-r178
@@ -7,5 +7,5 @@
 PROPERTIES=live
 RDEPEND=!media-libs/arc-camera3-android-headers
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b088c5f7b3aa9c2f8e4ac1914a852e84
diff --git a/metadata/md5-cache/media-libs/cros-camera-android-headers-9999 b/metadata/md5-cache/media-libs/cros-camera-android-headers-9999
index ec7ff03..0f4366f 100644
--- a/metadata/md5-cache/media-libs/cros-camera-android-headers-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-android-headers-9999
@@ -7,5 +7,5 @@
 PROPERTIES=live
 RDEPEND=!media-libs/arc-camera3-android-headers
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=eed0286acafb1b7997882a3667a26c2e
diff --git a/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r114 b/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r114
new file mode 100644
index 0000000..0224dd9
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r114
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_connector x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=A simple package that exercises cros-camera-libcamera_connector
+EAPI=7
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_82d90b383f9fe16cd8f88ecf297d788777842b22_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_82d90b383f9fe16cd8f88ecf297d788777842b22_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_82d90b383f9fe16cd8f88ecf297d788777842b22_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_connector >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r114
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8bdb89750df44f09c2fa33c38b6c9299
diff --git a/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r70 b/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r70
deleted file mode 100644
index 0f3c444..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-connector-client-0.0.1-r70
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_connector x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=A simple package that exercises cros-camera-libcamera_connector
-EAPI=7
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_0a9e82e85ec545e7f4bbd7afc4e353a6185f25e8_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_0a9e82e85ec545e7f4bbd7afc4e353a6185f25e8_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_0a9e82e85ec545e7f4bbd7afc4e353a6185f25e8_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_connector >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r70
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=634d9661005090b1bf417c217cb73eb9
diff --git a/metadata/md5-cache/media-libs/cros-camera-connector-client-9999 b/metadata/md5-cache/media-libs/cros-camera-connector-client-9999
index 6ec2607..eb90cdc 100644
--- a/metadata/md5-cache/media-libs/cros-camera-connector-client-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-connector-client-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcamera_connector >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=725124844015c464501dc506b120dc88
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dcffd8edce53e6f793de30868df3e2ae
diff --git a/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06 b/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06
new file mode 100644
index 0000000..d8b22f0
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=Chrome OS camera portrait processor library
+EAPI=7
+KEYWORDS=*
+LICENSE=BSD-Google
+SLOT=0
+SRC_URI=amd64? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-x86_64-2020.04.06.tbz2 ) arm? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-armv7-2020.04.06.tbz2 )
+_md5_=935a61a071b9840f4ab4aeca07eaa553
diff --git a/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06-r1 b/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06-r1
new file mode 100644
index 0000000..d8b22f0
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-effect-portrait-mode-2020.04.06-r1
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=Chrome OS camera portrait processor library
+EAPI=7
+KEYWORDS=*
+LICENSE=BSD-Google
+SLOT=0
+SRC_URI=amd64? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-x86_64-2020.04.06.tbz2 ) arm? ( gs://chromeos-localmirror/distfiles/portrait-processor-lib-armv7-2020.04.06.tbz2 )
+_md5_=935a61a071b9840f4ab4aeca07eaa553
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r1164 b/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r1164
deleted file mode 100644
index af1ce06..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r1164
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device media-libs/libyuv media-libs/libsync media-libs/cros-camera-libcab sys-kernel/linux-headers media-libs/cros-camera-android-headers virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Intel IPU6 (Image Processing Unit) Chrome OS camera HAL
-EAPI=7
-IUSE=ipu6 ipu6se cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_b875b5ee226a014144eab97968374eb6139316e6 cros-debug compilation_database cros_host test cros_host cros_workon_tree_b875b5ee226a014144eab97968374eb6139316e6 cros-debug cros_host cros_workon_tree_b875b5ee226a014144eab97968374eb6139316e6 cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=Apache-2.0
-PROPERTIES=live live live
-RDEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device media-libs/libyuv media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=e8e5d347026f7ee4a148f8364284c703
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r2053 b/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r2053
new file mode 100644
index 0000000..52c3aa0
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-0.0.1-r2053
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device ipu6se? ( x11-libs/libva-intel-media-driver ) media-libs/libyuv media-libs/libsync media-libs/cros-camera-libcab sys-kernel/linux-headers media-libs/cros-camera-android-headers virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Intel IPU6 (Image Processing Unit) Chrome OS camera HAL
+EAPI=7
+IUSE=ipu6 ipu6se cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_5b997a8b17adebb574824aa4697b80a9e1de81e6 cros-debug compilation_database cros_host test cros_host cros_workon_tree_5b997a8b17adebb574824aa4697b80a9e1de81e6 cros-debug cros_host cros_workon_tree_5b997a8b17adebb574824aa4697b80a9e1de81e6 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=Apache-2.0
+PROPERTIES=live live live
+RDEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device ipu6se? ( x11-libs/libva-intel-media-driver ) media-libs/libyuv media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=7d9ff027154defee68820dc8e82fce28
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-9999 b/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-9999
index 48fbd00..9774137 100644
--- a/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-intel-ipu6-squash-9999
@@ -1,13 +1,13 @@
 BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device media-libs/libyuv media-libs/libsync media-libs/cros-camera-libcab sys-kernel/linux-headers media-libs/cros-camera-android-headers virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device ipu6se? ( x11-libs/libva-intel-media-driver ) media-libs/libyuv media-libs/libsync media-libs/cros-camera-libcab sys-kernel/linux-headers media-libs/cros-camera-android-headers virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Intel IPU6 (Image Processing Unit) Chrome OS camera HAL
 EAPI=7
 IUSE=ipu6 ipu6se cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=Apache-2.0
 PROPERTIES=live live live
-RDEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device media-libs/libyuv media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=dev-libs/expat media-libs/cros-camera-libcbm media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_v4l2_device ipu6se? ( x11-libs/libva-intel-media-driver ) media-libs/libyuv media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=ce5452a6bfb62a56a24db53c03a7d598
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=4f852dc6803d973d9603fae4d79bf8b3
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r225 b/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r225
deleted file mode 100644
index 512988e..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r225
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync media-libs/cros-camera-android-headers media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_metadata virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS IP camera HAL v3.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_a8e0a9b94268e015df6ea8c92ca4151df30735a3_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_a8e0a9b94268e015df6ea8c92ca4151df30735a3_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_a8e0a9b94268e015df6ea8c92ca4151df30735a3_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9beebc71aa56d0a4132c91fd3d418d37
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r300 b/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r300
new file mode 100644
index 0000000..619eb14
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-ip-0.0.1-r300
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync media-libs/cros-camera-android-headers media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_metadata virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS IP camera HAL v3.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_02066159cedbf2a7009bbb8c8259b7574a0d2df6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_02066159cedbf2a7009bbb8c8259b7574a0d2df6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_02066159cedbf2a7009bbb8c8259b7574a0d2df6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=933ce35030aafe0fd7da2e63139d76c8
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-ip-9999 b/metadata/md5-cache/media-libs/cros-camera-hal-ip-9999
index 37d8486..26f87fc 100644
--- a/metadata/md5-cache/media-libs/cros-camera-hal-ip-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-ip-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=801b43d42ba9aa0010e98a68c52554bf
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r582 b/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r582
deleted file mode 100644
index b334b2d..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r582
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools chromeos-base/metrics media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
-DESCRIPTION=Chrome OS USB camera HAL v3.
-EAPI=5
-IUSE=usb_camera_monocle generated_cros_config unibuild cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_65e27114752b7ab8f4cede066f4a586059bd7e61_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=14124870769a3c162d20d96f9ea5c735
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r688 b/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r688
new file mode 100644
index 0000000..4a467cf
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-usb-0.0.1-r688
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools >=chromeos-base/metrics-0.0.1-r3152 media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
+DESCRIPTION=Chrome OS USB camera HAL v3.
+EAPI=5
+IUSE=usb_camera_monocle generated_cros_config unibuild cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_3f2ee10a205c3f5536485cb276c251689e36c033_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=7f5695ee9add022beb3a8412b6462599
diff --git a/metadata/md5-cache/media-libs/cros-camera-hal-usb-9999 b/metadata/md5-cache/media-libs/cros-camera-hal-usb-9999
index e15e011..2e973fa 100644
--- a/metadata/md5-cache/media-libs/cros-camera-hal-usb-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-hal-usb-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools chromeos-base/metrics media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
+DEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools >=chromeos-base/metrics-0.0.1-r3152 media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= virtual/pkgconfig
 DESCRIPTION=Chrome OS USB camera HAL v3.
 EAPI=5
 IUSE=usb_camera_monocle generated_cros_config unibuild cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=dev-libs/re2 !media-libs/arc-camera3-hal-usb media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_metadata usb_camera_monocle? ( media-libs/librealtek-sdk ) media-libs/cros-camera-libcamera_timezone media-libs/cros-camera-libcbm media-libs/cros-camera-libjda media-libs/libsync unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=ee47ac666029e1e484b95f86e5ceb6fc
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=1dbd92042369bb5d135d03ad5f48fcdc
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r385 b/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r385
deleted file mode 100644
index 121df2e..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r385
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcab media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Camera algorithm bridge library for proprietary camera algorithm isolation
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcab media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=635244704f82c590d0c5e16845add741
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r431 b/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r431
new file mode 100644
index 0000000..9957a9f
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcab-0.0.1-r431
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcab camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo ) media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Camera algorithm bridge library for proprietary camera algorithm isolation
+EAPI=7
+IUSE=camera_feature_portrait_mode ipu6se cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcab camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo ) media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r431
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dd068c00e420dfbdae4d017526af1b47
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-9999 b/metadata/md5-cache/media-libs/cros-camera-libcab-9999
index fd941eb..981b697 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcab-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcab-9999
@@ -1,12 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcab media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=!media-libs/arc-camera3-libcab camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo ) media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Camera algorithm bridge library for proprietary camera algorithm isolation
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
+EAPI=7
+IUSE=camera_feature_portrait_mode ipu6se cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcab media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a9f9e47e1c316f5b11093e415f2b54a2
+RDEPEND=!media-libs/arc-camera3-libcab camera_feature_portrait_mode? ( media-libs/cros-camera-libcam_gpu_algo ) media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3037a8595759bdbd76931d52cc0bbb79
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r371 b/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r371
deleted file mode 100644
index 80dad58..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r371
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-cpp/gtest:= !media-libs/arc-camera3-libcab-test media-libs/cros-camera-libcab >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Test for camera algorithm bridge library
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=dev-cpp/gtest:= !media-libs/arc-camera3-libcab-test media-libs/cros-camera-libcab >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=24cee8b292b9c586bcb435da3422aa75
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r415 b/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r415
new file mode 100644
index 0000000..6f28f41
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcab-test-0.0.1-r415
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-cpp/gtest:= !media-libs/arc-camera3-libcab-test media-libs/cros-camera-libcab >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Test for camera algorithm bridge library
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=dev-cpp/gtest:= !media-libs/arc-camera3-libcab-test media-libs/cros-camera-libcab >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cf9382ff57c66c79d053abcebf4df24b
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcab-test-9999 b/metadata/md5-cache/media-libs/cros-camera-libcab-test-9999
index 5f2aae7..0a2f6b4 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcab-test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcab-test-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=dev-cpp/gtest:= !media-libs/arc-camera3-libcab-test media-libs/cros-camera-libcab >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e42202f355a852dd32763a7aa9ac65a9
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=37587b66db1be8c0585e51f71049f619
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r112 b/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r112
deleted file mode 100644
index 55f9299..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r112
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera GPU algorithm library.
-EAPI=6
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=358d096d9bf0dfc2338d18461d5c02c6
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r156 b/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r156
new file mode 100644
index 0000000..019d2fc
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-0.0.1-r156
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-effect-portrait-mode >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera GPU algorithm library.
+EAPI=7
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-effect-portrait-mode >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r156
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7327347f65d3c9ebfc0a44bcb0d07a4a
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-9999 b/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-9999
index 24c4c89..4b6e902 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcam_gpu_algo-9999
@@ -1,12 +1,13 @@
+BDEPEND=dev-vcs/git dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=media-libs/cros-camera-effect-portrait-mode >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Chrome OS camera GPU algorithm library.
-EAPI=6
+EAPI=7
 IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8d58cd8083bc47005cd24881a9f1b029
+RDEPEND=media-libs/cros-camera-effect-portrait-mode >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/9999
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=39950afdb0b21aca2c4a572582402bb3
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r224 b/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r224
deleted file mode 100644
index e89b919..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r224
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcamera_client media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Android libcamera_client
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcamera_client media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=71e95edc678437f88d2ee5df9375dcb6
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r245 b/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r245
new file mode 100644
index 0000000..cfebedd
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_client-0.0.1-r245
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcamera_client media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Android libcamera_client
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcamera_client media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0d512c76942cd17490852d20f537f67c
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_client-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_client-9999
index 4bc6dad..a46d0b7 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_client-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_client-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcamera_client media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bd04328f03ba972ebb5c0a728521cf48
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d569f3bdf9966b030a26ce9ac32b8197
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r372 b/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r372
deleted file mode 100644
index 03b73d7..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r372
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcamera_common virtual/libudev virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS HAL common util.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcamera_common virtual/libudev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4563c5bab8aca1f2a2b83399145669f3
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r417 b/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r417
new file mode 100644
index 0000000..d81e82b
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_common-0.0.1-r417
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcamera_common virtual/libudev virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS HAL common util.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcamera_common virtual/libudev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b3cc9ba9406cb322376c535ad157d3c2
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_common-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_common-9999
index 2e10df8..b1b65a5 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_common-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_common-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcamera_common virtual/libudev >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=61146e5d197d68974e42aeef5a117fc7
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=49f8034839b4dc299f9d2815d624d3fa
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r119 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r119
new file mode 100644
index 0000000..3558fa1
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r119
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/libsync media-libs/cros-camera-android-headers media-libs/cros-camera-libcamera_connector_headers x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera connector for simpler uses.
+EAPI=7
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r119
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=96a1d6fab3fbdec0e11ed3aa18e3f525
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r75 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r75
deleted file mode 100644
index f9444ba..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-0.0.1-r75
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/libsync media-libs/cros-camera-android-headers media-libs/cros-camera-libcamera_connector_headers x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera connector for simpler uses.
-EAPI=7
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r75
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cf71fcfeb6621106261a9408338fdba6
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-9999
index ee702b5..3e1cd65 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/libsync >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ea48a83b298f3212e1c703b558c6fdf9
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=597bb3cd249c4fa97c6f28e99b790842
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1
deleted file mode 100644
index c125033..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Installs header files for cros-camera-libcamera_connector.
-EAPI=7
-KEYWORDS=*
-LICENSE=LICENSE.corel
-RDEPEND=!<media-libs/cros-camera-libcamera_connector-0.0.1-r62
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/cros-camera-libcamera_connector_headers-0.0.1.tar.gz
-_md5_=d01b6bb66b762a14e22a83d5e932dfab
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1-r2 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1-r2
deleted file mode 100644
index c125033..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.1-r2
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Installs header files for cros-camera-libcamera_connector.
-EAPI=7
-KEYWORDS=*
-LICENSE=LICENSE.corel
-RDEPEND=!<media-libs/cros-camera-libcamera_connector-0.0.1-r62
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/cros-camera-libcamera_connector_headers-0.0.1.tar.gz
-_md5_=d01b6bb66b762a14e22a83d5e932dfab
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4
new file mode 100644
index 0000000..fd72e41
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Installs header files for cros-camera-libcamera_connector.
+EAPI=7
+KEYWORDS=*
+LICENSE=LICENSE.parallels
+RDEPEND=!<media-libs/cros-camera-libcamera_connector-0.0.1-r62
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/cros-camera-libcamera_connector_headers-0.0.4.tar.gz
+_md5_=2387042d57cd9de7a2e5f1da64fd3dea
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4-r1 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4-r1
new file mode 100644
index 0000000..fd72e41
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_headers-0.0.4-r1
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Installs header files for cros-camera-libcamera_connector.
+EAPI=7
+KEYWORDS=*
+LICENSE=LICENSE.parallels
+RDEPEND=!<media-libs/cros-camera-libcamera_connector-0.0.1-r62
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/cros-camera-libcamera_connector_headers-0.0.4.tar.gz
+_md5_=2387042d57cd9de7a2e5f1da64fd3dea
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r54 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r54
deleted file mode 100644
index c67c21b..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r54
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera connector test.
-EAPI=7
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0/0.0.1-r54
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6d8366e71e06c566693fc6f1ed764535
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r98 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r98
new file mode 100644
index 0000000..cf9fcd8
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-0.0.1-r98
@@ -0,0 +1,13 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera connector test.
+EAPI=7
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0/0.0.1-r98
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4cbde3eba08e09382a281300b30da214
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-9999
index 6266612..47d7412 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_connector_test-9999
@@ -1,13 +1,13 @@
 BDEPEND=virtual/pkgconfig dev-vcs/git dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Chrome OS camera connector test.
 EAPI=7
 IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_connector dev-cpp/gtest:= media-libs/libyuv virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0/9999
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=beb9d4cc2f460dce823260d7b69c93ea
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2d7d99d4c971883c62470886e3f6c63a
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r370 b/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r370
deleted file mode 100644
index c852c68..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r370
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcamera_exif media-libs/libexif virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera HAL exif util.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcamera_exif media-libs/libexif >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=613a8a82435374073b7374383a92429c
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r414 b/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r414
new file mode 100644
index 0000000..ad3e821
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-0.0.1-r414
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcamera_exif media-libs/libexif virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera HAL exif util.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcamera_exif media-libs/libexif >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=58742494fa9aa6ca964fb65ffe6623bc
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-9999
index 70bfa0f..1b763ce 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_exif-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcamera_exif media-libs/libexif >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f1ffd8e47cdfe9b8499a266b8584d79a
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=30a4356bed3980e288de39524836949f
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r377 b/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r377
deleted file mode 100644
index 0de9d44..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r377
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_common virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS HAL IPC util.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f59c3a577d54b42a504be6a7af4ccc85
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r421 b/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r421
new file mode 100644
index 0000000..66e2330
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-0.0.1-r421
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcamera_common virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS HAL IPC util.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9339e43f891dc385cffd7aadaf558b69
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-9999
index 9e752823..49290f2 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_ipc-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0283a3d0984b24dbcb083048edd4b2d4
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c13c92a65164197d7fecd3092b0e281d
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r224 b/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r224
deleted file mode 100644
index c2104e4..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r224
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcamera_metadata media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Android libcamera_metadata
-EAPI=5
-IUSE=-asan cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d9bb1f508e6464b1872c79db2adcf217
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r245 b/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r245
new file mode 100644
index 0000000..daabdb7
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-0.0.1-r245
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcamera_metadata media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Android libcamera_metadata
+EAPI=5
+IUSE=-asan cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_e35f965a2c3451a2fe74ceb04da2875e20d17f95_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=dd3f318def775548fc67c083f03bc39b
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-9999
index 9693d96..e4e48a4 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_metadata-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcamera_metadata >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=70e76a6f69c1a573aa8595a0b67ae299
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c0cd6161dae069b524af5286f99cafe0
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r370 b/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r370
deleted file mode 100644
index 09786ab..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r370
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera HAL Time zone util.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=aa60a0b7cb1c414c9836129bde8b6238
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r414 b/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r414
new file mode 100644
index 0000000..6f2a6e5f
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-0.0.1-r414
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcamera_timezone virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera HAL Time zone util.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c5bd0d9f357b0c4268a8b54cf83d833b
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-9999
index be436dd..8016247 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_timezone-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcamera_timezone >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=28dcb084b1b72c68e090e58a0c2fe67e
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8388da902ef5a6836599e19f5f678efd
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r274 b/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r274
deleted file mode 100644
index f6e46e4..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r274
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera HAL v3 V4L2 device utility.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_216b7541a029e8b42b69dcb77b4a43309868a9b1_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_216b7541a029e8b42b69dcb77b4a43309868a9b1_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_216b7541a029e8b42b69dcb77b4a43309868a9b1_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=658073ed244da72f81e06e8df2704d00
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r301 b/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r301
new file mode 100644
index 0000000..ae032a7
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-0.0.1-r301
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera HAL v3 V4L2 device utility.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_fc362cef3265b6ee77ccda3fa97a63a4431aec9c_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_fc362cef3265b6ee77ccda3fa97a63a4431aec9c_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_fc362cef3265b6ee77ccda3fa97a63a4431aec9c_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9cf038ac65314b4072665a30bd86e9d2
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-9999 b/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-9999
index 3072821..e93400d 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcamera_v4l2_device-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=106bb9e2a7dd880dc27f8d8e2b4c0496
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r371 b/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r371
deleted file mode 100644
index 009b246..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r371
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-libcbm media-libs/minigbm x11-libs/libdrm media-libs/cros-camera-android-headers virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera HAL buffer manager.
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-libcbm media-libs/minigbm x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=94a6f273bb40e2214152173bbf95873a
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r415 b/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r415
new file mode 100644
index 0000000..d6e436b
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libcbm-0.0.1-r415
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-libcbm media-libs/minigbm x11-libs/libdrm media-libs/cros-camera-android-headers virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera HAL buffer manager.
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-libcbm media-libs/minigbm x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=43209957af1b21248a5beb4fff7b4cd0
diff --git a/metadata/md5-cache/media-libs/cros-camera-libcbm-9999 b/metadata/md5-cache/media-libs/cros-camera-libcbm-9999
index 71fd5e0..9e6eea86 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libcbm-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libcbm-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-libcbm media-libs/minigbm x11-libs/libdrm >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=77fdcc110bafe53e0fbf2a7e75c732de
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9d85df4cb8440d737874b777b2752352
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r423 b/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r423
deleted file mode 100644
index 604ad99..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r423
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc chromeos-base/metrics media-libs/cros-camera-libcbm media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Library for using JPEG Decode Accelerator in Chrome
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2ab99c53114ec006be2ff1fd3ee860e4
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r478 b/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r478
new file mode 100644
index 0000000..6330e5f
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libjda-0.0.1-r478
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/metrics-0.0.1-r3152 media-libs/cros-camera-libcbm media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Library for using JPEG Decode Accelerator in Chrome
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=22a111e5e9f0d88a757ff8560d1b0db8
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda-9999 b/metadata/md5-cache/media-libs/cros-camera-libjda-9999
index b429345..d31530e 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libjda-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libjda-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc chromeos-base/metrics media-libs/cros-camera-libcbm media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/metrics-0.0.1-r3152 media-libs/cros-camera-libcbm media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Library for using JPEG Decode Accelerator in Chrome
 EAPI=5
 IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_ipc >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8277bf286871f8f4a2c3a6080ad8edd0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=60d72e78e0105616b8c03d21eee29418
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r374 b/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r374
deleted file mode 100644
index 47e537f..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r374
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-cpp/gtest media-libs/cros-camera-libjda >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=End to end test for JPEG decode accelerator
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=dev-cpp/gtest >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0167a9b81602ee699fe13107293e0838
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r418 b/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r418
new file mode 100644
index 0000000..5273344
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libjda_test-0.0.1-r418
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-cpp/gtest media-libs/cros-camera-libjda >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=End to end test for JPEG decode accelerator
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=dev-cpp/gtest >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a693bf10ace482e55652d7f22a56bf27
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjda_test-9999 b/metadata/md5-cache/media-libs/cros-camera-libjda_test-9999
index 6b598f7..eb55d3e 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libjda_test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libjda_test-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=dev-cpp/gtest >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b75c1fbc5bcd88a3aead29925d43fc9b
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=08f4b779e64ca895f167a695e55b7047
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r400 b/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r400
deleted file mode 100644
index 53ee52d..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r400
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/metrics dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv chromeos-base/metrics media-libs/libyuv media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=End to end test for JPEG encode accelerator
-EAPI=5
-IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e_7e189936f29d145c4191ea147e48256c92fac75d cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=chromeos-base/metrics dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6b405392ac394243c033fa3a9aef54b6
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r455 b/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r455
new file mode 100644
index 0000000..326bc3c
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-libjea_test-0.0.1-r455
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152 dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/metrics-0.0.1-r3152 media-libs/libyuv media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=End to end test for JPEG encode accelerator
+EAPI=5
+IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079_aa7d3a7ee39fb0cab54fef530db4dfcbe0cd4515 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152 dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8fac56c817e193f5021702193f57beca
diff --git a/metadata/md5-cache/media-libs/cros-camera-libjea_test-9999 b/metadata/md5-cache/media-libs/cros-camera-libjea_test-9999
index aa17eed..082fe21 100644
--- a/metadata/md5-cache/media-libs/cros-camera-libjea_test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-libjea_test-9999
@@ -1,12 +1,12 @@
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/metrics dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv chromeos-base/metrics media-libs/libyuv media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152 dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/metrics-0.0.1-r3152 media-libs/libyuv media-libs/cros-camera-android-headers >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=End to end test for JPEG encode accelerator
 EAPI=5
 IUSE=cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ cros-debug compilation_database cros_host test cros_host cros_workon_tree_ cros-debug cros_host cros_workon_tree_ cros-debug compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live live
-RDEPEND=chromeos-base/metrics dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152 dev-cpp/gtest:= media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_exif media-libs/cros-camera-libcamera_ipc media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libyuv >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d9ea57648ddde2f0f96c58cac000728d
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9b59e7490a1d73dd5ab09fc129149c0c
diff --git a/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r405 b/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r405
deleted file mode 100644
index e414d76..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r405
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=!media-libs/arc-camera3-test media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libexif media-libs/libsync media-libs/minigbm virtual/jpeg:0 dev-cpp/gtest:= media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera HAL native test.
-EAPI=5
-IUSE=-asan cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_863c7922f75134832ae31820e98b87604a29c8fe_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_863c7922f75134832ae31820e98b87604a29c8fe_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_863c7922f75134832ae31820e98b87604a29c8fe_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_84441b28a7584715021e2faf292e0cf5864ea8bf_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=!media-libs/arc-camera3-test media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libexif media-libs/libsync media-libs/minigbm virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c4db52e7f5853801190865aa26953295
diff --git a/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r452 b/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r452
new file mode 100644
index 0000000..e634125
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-test-0.0.1-r452
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=!media-libs/arc-camera3-test media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libexif media-libs/libsync media-libs/minigbm virtual/jpeg:0 dev-cpp/gtest:= media-libs/cros-camera-android-headers media-libs/libyuv virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera HAL native test.
+EAPI=5
+IUSE=-asan cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_be0f67e39e0d02b8352dcaa90e1b26a8bdf11de8_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_be0f67e39e0d02b8352dcaa90e1b26a8bdf11de8_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_be0f67e39e0d02b8352dcaa90e1b26a8bdf11de8_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_ab72b93074396d3428b557e2e00d64f487fab1e1_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=!media-libs/arc-camera3-test media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libexif media-libs/libsync media-libs/minigbm virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=90a765ae270a5471dfc2418ca8e3b305
diff --git a/metadata/md5-cache/media-libs/cros-camera-test-9999 b/metadata/md5-cache/media-libs/cros-camera-test-9999
index 4d14d62..b793351 100644
--- a/metadata/md5-cache/media-libs/cros-camera-test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-test-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=!media-libs/arc-camera3-test media-libs/cros-camera-libcamera_client media-libs/cros-camera-libcamera_common media-libs/cros-camera-libcamera_metadata media-libs/cros-camera-libcbm media-libs/libexif media-libs/libsync media-libs/minigbm virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=980373f12b11d581a8c5ddc16e274dd7
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7dcbae7f3d3e2e5d27e97b5346f8d753
diff --git a/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r194 b/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r194
deleted file mode 100644
index 64cf307..0000000
--- a/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r194
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=chromeos-base/chromeos-config-tools chromeos-base/libbrillo:= dev-cpp/gtest:= dev-libs/re2:= media-libs/libyuv unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Chrome OS camera V4L2 test.
-EAPI=6
-IUSE=generated_cros_config unibuild cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_7d3546008b48acb50830aad744e1a6a19acb21c5_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_7d3546008b48acb50830aad744e1a6a19acb21c5_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_b99d8a0b7d7f0e2f844af457f29d449cdd953d43_584f7cc8998d8fa6c9b041054ce4a352016f477a_7d3546008b48acb50830aad744e1a6a19acb21c5_6287b0913be5aaea79569d55d989b9b729396f10_eec5ce9cfadd268344b02efdbec7465fbc391a9e cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live live
-RDEPEND=chromeos-base/chromeos-config-tools chromeos-base/libbrillo:= dev-cpp/gtest:= dev-libs/re2:= media-libs/libyuv unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=342f42b27167e39bac0336d170c51c11
diff --git a/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r275 b/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r275
new file mode 100644
index 0000000..571068d
--- /dev/null
+++ b/metadata/md5-cache/media-libs/cros-camera-v4l2_test-0.0.1-r275
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=chromeos-base/chromeos-config-tools chromeos-base/libbrillo:= dev-cpp/gtest:= dev-libs/re2:= media-libs/libyuv unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) virtual/jpeg:0 virtual/pkgconfig >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Chrome OS camera V4L2 test.
+EAPI=6
+IUSE=generated_cros_config unibuild cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_3f2ee10a205c3f5536485cb276c251689e36c033_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_3f2ee10a205c3f5536485cb276c251689e36c033_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug cros_host cros_workon_tree_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb_d58be6324ba2a1d0452d23bafb39c869c5ed2cd6_208baf1260a799a3ae3ef54d4cecb2403669a4f6_4cc600d625ecfdac13d984d9190d63a8970b0a4b_3f2ee10a205c3f5536485cb276c251689e36c033_9b4a2274d7e288e816c42f93f44fb938f82038ff_aa81756947ecfdd38b22f42eed8eeafa40431079 cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live live
+RDEPEND=chromeos-base/chromeos-config-tools chromeos-base/libbrillo:= dev-cpp/gtest:= dev-libs/re2:= media-libs/libyuv unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=765cbe89b67f9617c4d22150f055bb28
diff --git a/metadata/md5-cache/media-libs/cros-camera-v4l2_test-9999 b/metadata/md5-cache/media-libs/cros-camera-v4l2_test-9999
index 271b288..1987bdb 100644
--- a/metadata/md5-cache/media-libs/cros-camera-v4l2_test-9999
+++ b/metadata/md5-cache/media-libs/cros-camera-v4l2_test-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live live live
 RDEPEND=chromeos-base/chromeos-config-tools chromeos-base/libbrillo:= dev-cpp/gtest:= dev-libs/re2:= media-libs/libyuv unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) virtual/jpeg:0 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a9270536ad25129e1679d030b898b709
+_eclasses_=cros-camera	a12ab5d8adf739e116011ddee63e87f8	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=58a3cb4e711249ddaefe66445c6234f6
diff --git a/metadata/md5-cache/media-libs/evdi-1.6.4 b/metadata/md5-cache/media-libs/evdi-1.6.4
deleted file mode 100644
index b67ece9..0000000
--- a/metadata/md5-cache/media-libs/evdi-1.6.4
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile install unpack
-DEPEND=x11-libs/libdrm
-DESCRIPTION=Extensible Virtual Display Interface Library
-EAPI=5
-HOMEPAGE=https://github.com/DisplayLink/evdi
-KEYWORDS=*
-LICENSE=LGPL-2.1
-SLOT=0
-SRC_URI=https://github.com/DisplayLink/evdi/archive/v1.6.4.tar.gz -> evdi-1.6.4.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d1a1fde6bce4ba8f81390bb08708f20e
diff --git a/metadata/md5-cache/media-libs/evdi-1.8.0 b/metadata/md5-cache/media-libs/evdi-1.8.0
new file mode 100644
index 0000000..b68938b
--- /dev/null
+++ b/metadata/md5-cache/media-libs/evdi-1.8.0
@@ -0,0 +1,11 @@
+DEFINED_PHASES=compile install unpack
+DEPEND=x11-libs/libdrm
+DESCRIPTION=Extensible Virtual Display Interface Library
+EAPI=5
+HOMEPAGE=https://github.com/DisplayLink/evdi
+KEYWORDS=*
+LICENSE=LGPL-2.1
+SLOT=0
+SRC_URI=https://github.com/DisplayLink/evdi/archive/v1.8.0.tar.gz -> evdi-1.8.0.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d1a1fde6bce4ba8f81390bb08708f20e
diff --git a/metadata/md5-cache/media-libs/freetype-2.9 b/metadata/md5-cache/media-libs/freetype-2.9
index 6028393..836f89e 100644
--- a/metadata/md5-cache/media-libs/freetype-2.9
+++ b/metadata/md5-cache/media-libs/freetype-2.9
@@ -11,5 +11,5 @@
 RESTRICT=!bindist? ( bindist )
 SLOT=2
 SRC_URI=mirror://sourceforge/freetype/freetype-2.9.tar.bz2 mirror://nongnu/freetype/freetype-2.9.tar.bz2 utils? ( mirror://sourceforge/freetype/ft2demos-2.9.tar.bz2 mirror://nongnu/freetype/ft2demos-2.9.tar.bz2 ) doc? ( mirror://sourceforge/freetype/freetype-doc-2.9.tar.bz2 mirror://nongnu/freetype/freetype-doc-2.9.tar.bz2 ) infinality? ( https://dev.gentoo.org/~polynomial-c/03-infinality-2.6.2-2015.11.28.patch.xz )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=109f066d87c285a00af039b66843b466
diff --git a/metadata/md5-cache/media-libs/freetype-2.9-r2 b/metadata/md5-cache/media-libs/freetype-2.9-r2
index 6028393..836f89e 100644
--- a/metadata/md5-cache/media-libs/freetype-2.9-r2
+++ b/metadata/md5-cache/media-libs/freetype-2.9-r2
@@ -11,5 +11,5 @@
 RESTRICT=!bindist? ( bindist )
 SLOT=2
 SRC_URI=mirror://sourceforge/freetype/freetype-2.9.tar.bz2 mirror://nongnu/freetype/freetype-2.9.tar.bz2 utils? ( mirror://sourceforge/freetype/ft2demos-2.9.tar.bz2 mirror://nongnu/freetype/ft2demos-2.9.tar.bz2 ) doc? ( mirror://sourceforge/freetype/freetype-doc-2.9.tar.bz2 mirror://nongnu/freetype/freetype-doc-2.9.tar.bz2 ) infinality? ( https://dev.gentoo.org/~polynomial-c/03-infinality-2.6.2-2015.11.28.patch.xz )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=109f066d87c285a00af039b66843b466
diff --git a/metadata/md5-cache/media-libs/glu-9.0.0 b/metadata/md5-cache/media-libs/glu-9.0.0
index b631a25..dab5e97 100644
--- a/metadata/md5-cache/media-libs/glu-9.0.0
+++ b/metadata/md5-cache/media-libs/glu-9.0.0
@@ -9,5 +9,5 @@
 RDEPEND=virtual/opengl multilib? ( !app-emulation/emul-linux-x86-opengl )
 SLOT=0
 SRC_URI=ftp://ftp.freedesktop.org/pub/mesa/glu/glu-9.0.0.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7f0b2cb0e893505f4c0b00fadbe16f8d
diff --git a/metadata/md5-cache/media-libs/gmmlib-19.4.1 b/metadata/md5-cache/media-libs/gmmlib-19.4.1
deleted file mode 100644
index 403b1bd..0000000
--- a/metadata/md5-cache/media-libs/gmmlib-19.4.1
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel Graphics Memory Management Library
-EAPI=6
-HOMEPAGE=https://github.com/intel/gmmlib
-KEYWORDS=*
-LICENSE=MIT
-SLOT=0
-SRC_URI=https://github.com/intel/gmmlib/archive/intel-gmmlib-19.4.1.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=394f32e3ee0853a3f9f2893f2d128dc3
diff --git a/metadata/md5-cache/media-libs/gmmlib-19.4.1-r1 b/metadata/md5-cache/media-libs/gmmlib-19.4.1-r1
deleted file mode 100644
index 403b1bd..0000000
--- a/metadata/md5-cache/media-libs/gmmlib-19.4.1-r1
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel Graphics Memory Management Library
-EAPI=6
-HOMEPAGE=https://github.com/intel/gmmlib
-KEYWORDS=*
-LICENSE=MIT
-SLOT=0
-SRC_URI=https://github.com/intel/gmmlib/archive/intel-gmmlib-19.4.1.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=394f32e3ee0853a3f9f2893f2d128dc3
diff --git a/metadata/md5-cache/media-libs/gmmlib-20.2.2 b/metadata/md5-cache/media-libs/gmmlib-20.2.2
new file mode 100644
index 0000000..a0b5c47
--- /dev/null
+++ b/metadata/md5-cache/media-libs/gmmlib-20.2.2
@@ -0,0 +1,12 @@
+BDEPEND=dev-util/ninja dev-util/cmake
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Intel Graphics Memory Management Library
+EAPI=7
+HOMEPAGE=https://github.com/intel/gmmlib
+IUSE=abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=MIT
+SLOT=0
+SRC_URI=https://github.com/intel/gmmlib/archive/intel-gmmlib-20.2.2.tar.gz
+_eclasses_=cmake	b22e256fd899c7e0c747e8834eff121a	cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=7d354752b92b6908f2ef924adefb7ec1
diff --git a/metadata/md5-cache/media-libs/gmmlib-20.2.2-r2 b/metadata/md5-cache/media-libs/gmmlib-20.2.2-r2
new file mode 100644
index 0000000..a0b5c47
--- /dev/null
+++ b/metadata/md5-cache/media-libs/gmmlib-20.2.2-r2
@@ -0,0 +1,12 @@
+BDEPEND=dev-util/ninja dev-util/cmake
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Intel Graphics Memory Management Library
+EAPI=7
+HOMEPAGE=https://github.com/intel/gmmlib
+IUSE=abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=MIT
+SLOT=0
+SRC_URI=https://github.com/intel/gmmlib/archive/intel-gmmlib-20.2.2.tar.gz
+_eclasses_=cmake	b22e256fd899c7e0c747e8834eff121a	cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=7d354752b92b6908f2ef924adefb7ec1
diff --git a/metadata/md5-cache/media-libs/harfbuzz-1.7.6 b/metadata/md5-cache/media-libs/harfbuzz-1.7.6
index 2065d32..fad6f38 100644
--- a/metadata/md5-cache/media-libs/harfbuzz-1.7.6
+++ b/metadata/md5-cache/media-libs/harfbuzz-1.7.6
@@ -10,5 +10,5 @@
 REQUIRED_USE=introspection? ( glib )
 SLOT=0/0.9.18
 SRC_URI=https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-1.7.6.tar.bz2
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=5da83b4553da56321c341475151d3c51
diff --git a/metadata/md5-cache/media-libs/harfbuzz-1.7.6-r2 b/metadata/md5-cache/media-libs/harfbuzz-1.7.6-r2
index 2065d32..fad6f38 100644
--- a/metadata/md5-cache/media-libs/harfbuzz-1.7.6-r2
+++ b/metadata/md5-cache/media-libs/harfbuzz-1.7.6-r2
@@ -10,5 +10,5 @@
 REQUIRED_USE=introspection? ( glib )
 SLOT=0/0.9.18
 SRC_URI=https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-1.7.6.tar.bz2
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=5da83b4553da56321c341475151d3c51
diff --git a/metadata/md5-cache/media-libs/libcamera-0.0.1-r185 b/metadata/md5-cache/media-libs/libcamera-0.0.1-r185
deleted file mode 100644
index 2cbdb31..0000000
--- a/metadata/md5-cache/media-libs/libcamera-0.0.1-r185
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=udev? ( virtual/libudev ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=Camera support library for Linux
-EAPI=6
-HOMEPAGE=https://www.libcamera.org
-IUSE=arc-camera3 doc ipu3 rkisp1 test udev cros_host cros_workon_tree_b983d50cebc935c91f2b7d57f9f567d462b67daa
-KEYWORDS=*
-LICENSE=LGPL-2.1+
-PROPERTIES=live
-RDEPEND=udev? ( virtual/libudev )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f5c0806d5841f3f84f9d9375d48ae42f
diff --git a/metadata/md5-cache/media-libs/libcamera-0.0.1-r268 b/metadata/md5-cache/media-libs/libcamera-0.0.1-r268
new file mode 100644
index 0000000..893e5b4
--- /dev/null
+++ b/metadata/md5-cache/media-libs/libcamera-0.0.1-r268
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=udev? ( virtual/libudev ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=Camera support library for Linux
+EAPI=6
+HOMEPAGE=https://www.libcamera.org
+IUSE=doc ipu3 rkisp1 test udev cros_host cros_workon_tree_04e4e4fb23a96779b2e28b2418c9e7e3e822c10f
+KEYWORDS=*
+LICENSE=LGPL-2.1+
+PROPERTIES=live
+RDEPEND=udev? ( virtual/libudev )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ea0fcc15a7475637538b377a763d7847
diff --git a/metadata/md5-cache/media-libs/libcamera-9999 b/metadata/md5-cache/media-libs/libcamera-9999
index 6bba81b..c26b432 100644
--- a/metadata/md5-cache/media-libs/libcamera-9999
+++ b/metadata/md5-cache/media-libs/libcamera-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=Camera support library for Linux
 EAPI=6
 HOMEPAGE=https://www.libcamera.org
-IUSE=arc-camera3 doc ipu3 rkisp1 test udev cros_host cros_workon_tree_
+IUSE=doc ipu3 rkisp1 test udev cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=LGPL-2.1+
 PROPERTIES=live
 RDEPEND=udev? ( virtual/libudev )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9aebff6b0e09e4bc20dfe2e617d6a35c
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0ec2f999e77581bed455d3ab8de628af
diff --git a/metadata/md5-cache/media-libs/libepoxy-1.5.4 b/metadata/md5-cache/media-libs/libepoxy-1.5.4
index 70e878e..865c75b 100644
--- a/metadata/md5-cache/media-libs/libepoxy-1.5.4
+++ b/metadata/md5-cache/media-libs/libepoxy-1.5.4
@@ -9,5 +9,5 @@
 RDEPEND=virtual/opengles
 SLOT=0
 SRC_URI=https://github.com/anholt/libepoxy/archive/1.5.4.tar.gz -> libepoxy-1.5.4.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=35c73d0687c53a2f41b660ab505a30a3
diff --git a/metadata/md5-cache/media-libs/libepoxy-1.5.4-r1 b/metadata/md5-cache/media-libs/libepoxy-1.5.4-r1
index 70e878e..865c75b 100644
--- a/metadata/md5-cache/media-libs/libepoxy-1.5.4-r1
+++ b/metadata/md5-cache/media-libs/libepoxy-1.5.4-r1
@@ -9,5 +9,5 @@
 RDEPEND=virtual/opengles
 SLOT=0
 SRC_URI=https://github.com/anholt/libepoxy/archive/1.5.4.tar.gz -> libepoxy-1.5.4.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=35c73d0687c53a2f41b660ab505a30a3
diff --git a/metadata/md5-cache/media-libs/libsync-0.0.1-r4 b/metadata/md5-cache/media-libs/libsync-0.0.1-r4
index ca9ed286..08c6dd1 100644
--- a/metadata/md5-cache/media-libs/libsync-0.0.1-r4
+++ b/metadata/md5-cache/media-libs/libsync-0.0.1-r4
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!media-libs/arc-camera3-libsync
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4c11d6481e192f8d1d0b2d529896eaae
diff --git a/metadata/md5-cache/media-libs/libsync-9999 b/metadata/md5-cache/media-libs/libsync-9999
index 947bd46..9c9dd40 100644
--- a/metadata/md5-cache/media-libs/libsync-9999
+++ b/metadata/md5-cache/media-libs/libsync-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=!media-libs/arc-camera3-libsync
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=83f73344c9a94b885854cff3cafbd17e
diff --git a/metadata/md5-cache/media-libs/libv4l-1.20.0 b/metadata/md5-cache/media-libs/libv4l-1.20.0
index 318742a..8f8ec99 100644
--- a/metadata/md5-cache/media-libs/libv4l-1.20.0
+++ b/metadata/md5-cache/media-libs/libv4l-1.20.0
@@ -9,5 +9,5 @@
 RDEPEND=jpeg? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !media-tv/v4l2-ctl !<media-tv/ivtv-utils-1.4.0-r2 abi_x86_32? ( !<=app-emulation/emul-linux-x86-medialibs-20130224-r5 !app-emulation/emul-linux-x86-medialibs[-abi_x86_32(-)] )
 SLOT=0
 SRC_URI=http://linuxtv.org/downloads/v4l-utils/v4l-utils-1.20.0.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=65368d98d1968e564d7ade860a8fb805
diff --git a/metadata/md5-cache/media-libs/libv4l-1.20.0-r0 b/metadata/md5-cache/media-libs/libv4l-1.20.0-r0
index 318742a..8f8ec99 100644
--- a/metadata/md5-cache/media-libs/libv4l-1.20.0-r0
+++ b/metadata/md5-cache/media-libs/libv4l-1.20.0-r0
@@ -9,5 +9,5 @@
 RDEPEND=jpeg? ( >=virtual/jpeg-0-r2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !media-tv/v4l2-ctl !<media-tv/ivtv-utils-1.4.0-r2 abi_x86_32? ( !<=app-emulation/emul-linux-x86-medialibs-20130224-r5 !app-emulation/emul-linux-x86-medialibs[-abi_x86_32(-)] )
 SLOT=0
 SRC_URI=http://linuxtv.org/downloads/v4l-utils/v4l-utils-1.20.0.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=65368d98d1968e564d7ade860a8fb805
diff --git a/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r38 b/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r38
deleted file mode 100644
index 1687d6e..0000000
--- a/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r38
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup unpack
-DEPEND=media-libs/libv4l >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Separate plugin library from upstream v4l-utils package
-EAPI=5
-HOMEPAGE=http://git.linuxtv.org/v4l-utils.git
-IUSE=rockchip rockchip_v2 cros_host cros_workon_tree_a17b1841ff0f13b956704fe28506711345c64894
-KEYWORDS=*
-LICENSE=LGPL-2.1
-PROPERTIES=live
-RDEPEND=media-libs/libv4l
-REQUIRED_USE=^^ ( rockchip rockchip_v2 )
-SLOT=0
-SRC_URI=http://linuxtv.org/downloads/v4l-utils/v4l-utils-1.18.1.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=65c5a7f95a2eb7db1d1e74f9cba30083
diff --git a/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r40 b/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r40
new file mode 100644
index 0000000..7bf73c7
--- /dev/null
+++ b/metadata/md5-cache/media-libs/libv4lplugins-0.0.1-r40
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=media-libs/libv4l >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Separate plugin library from upstream v4l-utils package
+EAPI=5
+HOMEPAGE=http://git.linuxtv.org/v4l-utils.git
+IUSE=rockchip rockchip_v2 cros_host cros_workon_tree_694d607ee703be3eca76e8c7d5359e21813c7daf
+KEYWORDS=*
+LICENSE=LGPL-2.1
+PROPERTIES=live
+RDEPEND=media-libs/libv4l
+REQUIRED_USE=^^ ( rockchip rockchip_v2 )
+SLOT=0
+SRC_URI=http://linuxtv.org/downloads/v4l-utils/v4l-utils-1.18.1.tar.bz2
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=23eb5b8359e3a4d212ba1e098206d462
diff --git a/metadata/md5-cache/media-libs/libv4lplugins-9999 b/metadata/md5-cache/media-libs/libv4lplugins-9999
index a1917bb..317b1cf 100644
--- a/metadata/md5-cache/media-libs/libv4lplugins-9999
+++ b/metadata/md5-cache/media-libs/libv4lplugins-9999
@@ -11,5 +11,5 @@
 REQUIRED_USE=^^ ( rockchip rockchip_v2 )
 SLOT=0
 SRC_URI=http://linuxtv.org/downloads/v4l-utils/v4l-utils-1.18.1.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e75c7ea92b58cb866cde529d3db4681d
diff --git a/metadata/md5-cache/media-libs/mesa-20.1 b/metadata/md5-cache/media-libs/mesa-20.1
index a497c86..e8c29c1 100644
--- a/metadata/md5-cache/media-libs/mesa-20.1
+++ b/metadata/md5-cache/media-libs/mesa-20.1
@@ -10,5 +10,5 @@
 RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libxshmfence x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1ac24c5bb856dec25c7b1e47dae9e89d
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f82276ce133b435434b99309e9fcd45c
diff --git a/metadata/md5-cache/media-libs/mesa-20.1.0-r0 b/metadata/md5-cache/media-libs/mesa-20.1.0-r0
deleted file mode 100644
index a497c86..0000000
--- a/metadata/md5-cache/media-libs/mesa-20.1.0-r0
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libxshmfence x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto wayland? ( >=dev-libs/wayland-protocols-1.8 ) llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b8d78e509c717d068a0199e10811bffd817f2dd4
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libxshmfence x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
-REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
-SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1ac24c5bb856dec25c7b1e47dae9e89d
diff --git a/metadata/md5-cache/media-libs/mesa-20.1.4-r0 b/metadata/md5-cache/media-libs/mesa-20.1.4-r0
new file mode 100644
index 0000000..e8c29c1
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-20.1.4-r0
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libxshmfence x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto wayland? ( >=dev-libs/wayland-protocols-1.8 ) llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=6
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b8d78e509c717d068a0199e10811bffd817f2dd4
+KEYWORDS=*
+LICENSE=MIT LGPL-3 SGI-B-2.0
+PROPERTIES=live
+RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libxshmfence x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
+REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
+SLOT=0
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f82276ce133b435434b99309e9fcd45c
diff --git a/metadata/md5-cache/media-libs/mesa-9999 b/metadata/md5-cache/media-libs/mesa-9999
index fe846ce..3077970 100644
--- a/metadata/md5-cache/media-libs/mesa-9999
+++ b/metadata/md5-cache/media-libs/mesa-9999
@@ -11,5 +11,5 @@
 RDEPEND=dev-libs/expat:= dev-libs/libgcrypt:= llvm? ( sys-devel/llvm:= ) llvm? ( virtual/libelf:= ) virtual/udev:= X? ( !<x11-base/xorg-server-1.7:= >=x11-libs/libX11-1.3.99.901:= x11-libs/libXdamage:= x11-libs/libXext:= x11-libs/libXrandr:= x11-libs/libxshmfence:= x11-libs/libXxf86vm:= ) >=x11-libs/libdrm-2.4.60:=
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0/9999
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e46c8ebc1fb41accc9375165b6b334d0
diff --git a/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r15 b/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r15
deleted file mode 100644
index 1cf9755..0000000
--- a/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r15
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=virtual/libelf dev-libs/expat x11-libs/libdrm !media-libs/mesa sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto x11-libs/libva sys-devel/llvm >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=The Mesa 3D Graphics Library
-EAPI=6
-HOMEPAGE=http://mesa3d.org/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe debug vulkan cros_host cros_workon_tree_67dba866ca9ec7c9910a901f0cfb80de3e4646a1
-KEYWORDS=*
-LICENSE=MIT
-PROPERTIES=live
-RDEPEND=virtual/libelf dev-libs/expat x11-libs/libdrm !media-libs/mesa
-SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=312584774ead2cce6bbf2b9e26cf791f
diff --git a/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r21 b/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r21
new file mode 100644
index 0000000..440d879
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-amd-19.3.5-r21
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=virtual/libelf dev-libs/expat x11-libs/libdrm !media-libs/mesa sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto x11-libs/libva sys-devel/llvm >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=The Mesa 3D Graphics Library
+EAPI=6
+HOMEPAGE=http://mesa3d.org/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe debug vulkan cros_host cros_workon_tree_cadd4bad01f90199f6d3f096b73343801c9d5680
+KEYWORDS=*
+LICENSE=MIT
+PROPERTIES=live
+RDEPEND=virtual/libelf dev-libs/expat x11-libs/libdrm !media-libs/mesa
+SLOT=0
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=02e52c5a0df4619a96bb4d1351edc1ce
diff --git a/metadata/md5-cache/media-libs/mesa-amd-9999 b/metadata/md5-cache/media-libs/mesa-amd-9999
index ffa49f8..9234b84 100644
--- a/metadata/md5-cache/media-libs/mesa-amd-9999
+++ b/metadata/md5-cache/media-libs/mesa-amd-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=virtual/libelf dev-libs/expat x11-libs/libdrm !media-libs/mesa
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=62f02a0cbc5b0bffcb92895ba88c411c
diff --git a/metadata/md5-cache/media-libs/mesa-freedreno-20.2.0_pre-r30 b/metadata/md5-cache/media-libs/mesa-freedreno-20.2.0_pre-r30
deleted file mode 100644
index b55dc51..0000000
--- a/metadata/md5-cache/media-libs/mesa-freedreno-20.2.0_pre-r30
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=sys-devel/bison sys-devel/flex virtual/pkgconfig >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
-DESCRIPTION=The Mesa 3D Graphics Library
-EAPI=7
-HOMEPAGE=http://mesa3d.org/
-IUSE=debug vulkan cros_host cros_workon_tree_8bb43c3865c00e0b9d17c8d2bebf941a4b570d26
-KEYWORDS=*
-LICENSE=MIT SGI-B-2.0
-PROPERTIES=live
-RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
-SLOT=0/20.2.0_pre-r30
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4e1b60205c810b1e954ae9da26413a76
diff --git a/metadata/md5-cache/media-libs/mesa-freedreno-20.3.0_pre-r36 b/metadata/md5-cache/media-libs/mesa-freedreno-20.3.0_pre-r36
new file mode 100644
index 0000000..71caee8
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-freedreno-20.3.0_pre-r36
@@ -0,0 +1,14 @@
+BDEPEND=sys-devel/bison sys-devel/flex virtual/pkgconfig >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
+DESCRIPTION=The Mesa 3D Graphics Library
+EAPI=7
+HOMEPAGE=http://mesa3d.org/
+IUSE=debug vulkan cros_host cros_workon_tree_709132dcdf35676fc5ef0aa29e20d043aa4a5dd6
+KEYWORDS=*
+LICENSE=MIT SGI-B-2.0
+PROPERTIES=live
+RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
+SLOT=0/20.3.0_pre-r36
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1309a54342f3918fb6bb3e779681af80
diff --git a/metadata/md5-cache/media-libs/mesa-freedreno-9999 b/metadata/md5-cache/media-libs/mesa-freedreno-9999
index 114f8a0..8ddfcdf 100644
--- a/metadata/md5-cache/media-libs/mesa-freedreno-9999
+++ b/metadata/md5-cache/media-libs/mesa-freedreno-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
 SLOT=0/9999
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6503125e27c99c8fed7ea8ad6df09404
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cfe0eb948c9c6dd8dc193110254c1978
diff --git a/metadata/md5-cache/media-libs/mesa-img-19.0_pre1 b/metadata/md5-cache/media-libs/mesa-img-19.0_pre1
index 72aafd1..21192c3 100644
--- a/metadata/md5-cache/media-libs/mesa-img-19.0_pre1
+++ b/metadata/md5-cache/media-libs/mesa-img-19.0_pre1
@@ -10,5 +10,5 @@
 RDEPEND=!media-libs/mesa X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=35780d1529c6e5020e7943cf8e3f32df
diff --git a/metadata/md5-cache/media-libs/mesa-img-19.0_pre1-r6 b/metadata/md5-cache/media-libs/mesa-img-19.0_pre1-r6
index 72aafd1..21192c3 100644
--- a/metadata/md5-cache/media-libs/mesa-img-19.0_pre1-r6
+++ b/metadata/md5-cache/media-libs/mesa-img-19.0_pre1-r6
@@ -10,5 +10,5 @@
 RDEPEND=!media-libs/mesa X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=35780d1529c6e5020e7943cf8e3f32df
diff --git a/metadata/md5-cache/media-libs/mesa-img-9999 b/metadata/md5-cache/media-libs/mesa-img-9999
index 4f36570..baa4e7b 100644
--- a/metadata/md5-cache/media-libs/mesa-img-9999
+++ b/metadata/md5-cache/media-libs/mesa-img-9999
@@ -10,5 +10,5 @@
 RDEPEND=!media-libs/mesa X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ac0a8f99820f18827dc06e118a1e4752
diff --git a/metadata/md5-cache/media-libs/mesa-iris-20.2.0_pre-r11 b/metadata/md5-cache/media-libs/mesa-iris-20.2.0_pre-r11
deleted file mode 100644
index a71fa6b..0000000
--- a/metadata/md5-cache/media-libs/mesa-iris-20.2.0_pre-r11
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=sys-devel/bison sys-devel/flex virtual/pkgconfig >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
-DESCRIPTION=The Mesa 3D Graphics Library
-EAPI=7
-HOMEPAGE=http://mesa3d.org/
-IUSE=debug vulkan tools cros_host cros_workon_tree_c74c7b6b64e5e219a9a2245a1ef2a8dfb98d8663
-KEYWORDS=*
-LICENSE=MIT SGI-B-2.0
-PROPERTIES=live
-RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
-SLOT=0/20.2.0_pre-r11
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=ed5a84ba9856126e660a83fea74bf106
diff --git a/metadata/md5-cache/media-libs/mesa-iris-20.2.0_rc1-r12 b/metadata/md5-cache/media-libs/mesa-iris-20.2.0_rc1-r12
new file mode 100644
index 0000000..bd47ee8
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-iris-20.2.0_rc1-r12
@@ -0,0 +1,14 @@
+BDEPEND=sys-devel/bison sys-devel/flex virtual/pkgconfig >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
+DESCRIPTION=The Mesa 3D Graphics Library
+EAPI=7
+HOMEPAGE=http://mesa3d.org/
+IUSE=debug vulkan tools cros_host cros_workon_tree_bfd09ab3e5c477cdb942fd0291460e01d1d37182
+KEYWORDS=*
+LICENSE=MIT SGI-B-2.0
+PROPERTIES=live
+RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
+SLOT=0/20.2.0_rc1-r12
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c6f8489f32272794f4184700a0ea43ae
diff --git a/metadata/md5-cache/media-libs/mesa-iris-9999 b/metadata/md5-cache/media-libs/mesa-iris-9999
index 39f329d..fcf0c4f 100644
--- a/metadata/md5-cache/media-libs/mesa-iris-9999
+++ b/metadata/md5-cache/media-libs/mesa-iris-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/expat:= >=x11-libs/libdrm-2.4.94:=
 SLOT=0/9999
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=40146f9dbcb100b00832d10566626d8d
diff --git a/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0 b/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0
deleted file mode 100644
index d145a6f..0000000
--- a/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto wayland? ( >=dev-libs/wayland-protocols-1.8 ) llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b09304eab38348e2a157c4adc75542a460746ce9
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
-REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
-SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d24ebf4f17a448e22fb5e4ce125e90d2
diff --git a/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0-r3 b/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0-r3
deleted file mode 100644
index d145a6f..0000000
--- a/metadata/md5-cache/media-libs/mesa-llvmpipe-19.0-r3
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto wayland? ( >=dev-libs/wayland-protocols-1.8 ) llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=OpenGL-like graphic library for Linux
-EAPI=6
-HOMEPAGE=http://mesa3d.sourceforge.net/
-IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b09304eab38348e2a157c4adc75542a460746ce9
-KEYWORDS=*
-LICENSE=MIT LGPL-3 SGI-B-2.0
-PROPERTIES=live
-RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
-REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
-SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d24ebf4f17a448e22fb5e4ce125e90d2
diff --git a/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1 b/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1
new file mode 100644
index 0000000..6a4397f
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=6
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b8d78e509c717d068a0199e10811bffd817f2dd4
+KEYWORDS=*
+LICENSE=MIT LGPL-3 SGI-B-2.0
+PROPERTIES=live
+RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
+REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
+SLOT=0
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a935c143c0d38bff96cf8bc02abf305f
diff --git a/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1.3-r2 b/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1.3-r2
new file mode 100644
index 0000000..6a4397f
--- /dev/null
+++ b/metadata/md5-cache/media-libs/mesa-llvmpipe-20.1.3-r2
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=OpenGL-like graphic library for Linux
+EAPI=6
+HOMEPAGE=http://mesa3d.sourceforge.net/
+IUSE=video_cards_intel video_cards_amdgpu video_cards_radeon video_cards_freedreno video_cards_llvmpipe video_cards_mach64 video_cards_mga video_cards_nouveau video_cards_r128 video_cards_radeonsi video_cards_savage video_cards_sis video_cards_softpipe video_cards_tdfx video_cards_via video_cards_virgl video_cards_vmware +classic debug dri drm egl +gallium -gbm gles1 gles2 kernel_FreeBSD kvm_guest llvm +nptl pic selinux shared-glapi vulkan wayland xlib-glx X cros_host cros_workon_tree_b8d78e509c717d068a0199e10811bffd817f2dd4
+KEYWORDS=*
+LICENSE=MIT LGPL-3 SGI-B-2.0
+PROPERTIES=live
+RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) !media-libs/mesa llvm? ( virtual/libelf ) dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
+REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
+SLOT=0
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a935c143c0d38bff96cf8bc02abf305f
diff --git a/metadata/md5-cache/media-libs/mesa-llvmpipe-9999 b/metadata/md5-cache/media-libs/mesa-llvmpipe-9999
index 9cc2ca6..271888f 100644
--- a/metadata/md5-cache/media-libs/mesa-llvmpipe-9999
+++ b/metadata/md5-cache/media-libs/mesa-llvmpipe-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) !media-libs/mesa dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto wayland? ( >=dev-libs/wayland-protocols-1.8 ) llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) llvm? ( virtual/libelf ) !media-libs/mesa dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60 dev-libs/libxml2 sys-devel/bison sys-devel/flex virtual/pkgconfig x11-base/xorg-proto llvm? ( sys-devel/llvm ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
 DESCRIPTION=OpenGL-like graphic library for Linux
 EAPI=6
 HOMEPAGE=http://mesa3d.sourceforge.net/
@@ -7,8 +7,8 @@
 KEYWORDS=~*
 LICENSE=MIT LGPL-3 SGI-B-2.0
 PROPERTIES=live live
-RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) llvm? ( virtual/libelf ) !media-libs/mesa dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
+RDEPEND=X? ( !<x11-base/xorg-server-1.7 >=x11-libs/libX11-1.3.99.901 x11-libs/libXdamage x11-libs/libXext x11-libs/libXrandr x11-libs/libXxf86vm ) wayland? ( dev-libs/wayland >=dev-libs/wayland-protocols-1.8 ) llvm? ( virtual/libelf ) !media-libs/mesa dev-libs/expat dev-libs/libgcrypt virtual/udev >=x11-libs/libdrm-2.4.60
 REQUIRED_USE=video_cards_amdgpu? ( llvm ) video_cards_llvmpipe? ( llvm )
 SLOT=0
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=68745e5a36f3bdb9bee227db80fb323b
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a0487419823525d841be5677e6ed8121
diff --git a/metadata/md5-cache/media-libs/minigbm-0.0.1-r380 b/metadata/md5-cache/media-libs/minigbm-0.0.1-r380
deleted file mode 100644
index 2b1dd17..0000000
--- a/metadata/md5-cache/media-libs/minigbm-0.0.1-r380
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=x11-libs/libdrm !media-libs/mesa[gbm] virtual/pkgconfig video_cards_amdgpu? ( virtual/opengles x11-drivers/opengles-headers )
-DESCRIPTION=Mini GBM implementation
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/minigbm
-IUSE=-asan kernel-3_8 kernel-3_14 kernel-3_18 video_cards_amdgpu video_cards_exynos video_cards_intel video_cards_marvell video_cards_mediatek video_cards_msm video_cards_radeon video_cards_radeonsi video_cards_rockchip video_cards_tegra video_cards_vc4 video_cards_virgl asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ace310f1a73abd463d2bffeb930f6a8ae3036fc0
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=x11-libs/libdrm !media-libs/mesa[gbm]
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f45a7855d0bd9390ce1ea548dd71d8b5
diff --git a/metadata/md5-cache/media-libs/minigbm-0.0.1-r403 b/metadata/md5-cache/media-libs/minigbm-0.0.1-r403
new file mode 100644
index 0000000..8f2f9e9
--- /dev/null
+++ b/metadata/md5-cache/media-libs/minigbm-0.0.1-r403
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=x11-libs/libdrm !media-libs/mesa[gbm] virtual/pkgconfig video_cards_amdgpu? ( virtual/opengles x11-drivers/opengles-headers )
+DESCRIPTION=Mini GBM implementation
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/minigbm
+IUSE=-asan kernel-3_8 kernel-3_14 kernel-3_18 video_cards_amdgpu video_cards_exynos video_cards_intel video_cards_marvell video_cards_mediatek video_cards_msm video_cards_radeon video_cards_radeonsi video_cards_rockchip video_cards_tegra video_cards_vc4 video_cards_virgl asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_fc83b8e971487f9d9e09f6c05bbf637346542ce8
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=x11-libs/libdrm !media-libs/mesa[gbm]
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=edd37a316e5afc29b3b739c986827a09
diff --git a/metadata/md5-cache/media-libs/minigbm-9999 b/metadata/md5-cache/media-libs/minigbm-9999
index c6a92f9..4a500c9 100644
--- a/metadata/md5-cache/media-libs/minigbm-9999
+++ b/metadata/md5-cache/media-libs/minigbm-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=x11-libs/libdrm !media-libs/mesa[gbm]
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c4937b2ceb8491e45907604bcc079023
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=718e5638d37f03125213a43182cedcf2
diff --git a/metadata/md5-cache/media-libs/opencv-4.1.2-r3 b/metadata/md5-cache/media-libs/opencv-4.1.2-r3
index f46f8b5..280c874 100644
--- a/metadata/md5-cache/media-libs/opencv-4.1.2-r3
+++ b/metadata/md5-cache/media-libs/opencv-4.1.2-r3
@@ -11,5 +11,5 @@
 REQUIRED_USE=cuda? ( tesseract? ( opencl ) ) dnnsamples? ( examples ) gflags? ( contrib ) glog? ( contrib ) contribcvv? ( contrib qt5 ) contribdnn? ( contrib ) contribhdf? ( contrib ) contribsfm? ( contrib eigen gflags glog ) contribxfeatures2d? ( contrib download ) java? ( python ) opengl? ( || ( gtk qt5 ) ) python? ( || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 ) ) tesseract? ( contrib )
 SLOT=0/4.1.2
 SRC_URI=https://github.com/opencv/opencv/archive/4.1.2.tar.gz -> opencv-4.1.2.tar.gz dnnsamples? ( https://dev.gentoo.org/~amynka/snap/opencv-3.4.0-res10_300x300-caffeemodel.tar.gz ) contrib? ( https://github.com/opencv/opencv_contrib/archive/4.1.2.tar.gz -> opencv-4.1.2_contrib.tar.gz contribdnn? ( https://dev.gentoo.org/~amynka/snap/opencv-3.4.0-face_landmark_model.tar.gz ) contribxfeatures2d? ( https://dev.gentoo.org/~amynka/snap/vgg_boostdesc-3.2.0.tar.gz ) )
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	java-ant-2	4e2b30d918dda38a51839a4d45282b62	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	java-ant-2	4e2b30d918dda38a51839a4d45282b62	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=6ba3f62c1eefc57ef927bd7e80562e20
diff --git a/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r15 b/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r15
new file mode 100644
index 0000000..eba94cd
--- /dev/null
+++ b/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r15
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=>=x11-libs/libdrm-2.4.50 media-libs/libepoxy media-libs/minigbm fuzzer? ( virtual/opengles ) sys-devel/autoconf-archive fuzzer? ( >=dev-libs/check-0.9.4 ) test? ( >=dev-libs/check-0.9.4 ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
+DESCRIPTION=library used implement a virtual 3D GPU used by qemu
+EAPI=6
+HOMEPAGE=https://virgil3d.github.io/
+IUSE=debug fuzzer profiling test fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_3f31fcc29b09462fd8a6eb6bfef036abcf781b58
+KEYWORDS=*
+LICENSE=MIT
+PROPERTIES=live
+RDEPEND=>=x11-libs/libdrm-2.4.50 media-libs/libepoxy media-libs/minigbm fuzzer? ( virtual/opengles )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=25663fea6d45bb0bf96a4062af9f1b14
diff --git a/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r9 b/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r9
deleted file mode 100644
index 1c3f8ef..0000000
--- a/metadata/md5-cache/media-libs/virglrenderer-0.8.2-r9
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=>=x11-libs/libdrm-2.4.50 media-libs/libepoxy media-libs/minigbm fuzzer? ( virtual/opengles ) sys-devel/autoconf-archive fuzzer? ( >=dev-libs/check-0.9.4 ) test? ( >=dev-libs/check-0.9.4 ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DESCRIPTION=library used implement a virtual 3D GPU used by qemu
-EAPI=6
-HOMEPAGE=https://virgil3d.github.io/
-IUSE=debug fuzzer profiling test fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_87ec43126822578e9777c6097a214ce925553356
-KEYWORDS=*
-LICENSE=MIT
-PROPERTIES=live
-RDEPEND=>=x11-libs/libdrm-2.4.50 media-libs/libepoxy media-libs/minigbm fuzzer? ( virtual/opengles )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=86a21cc6145ee95f241d0221e263ebb9
diff --git a/metadata/md5-cache/media-libs/virglrenderer-9999 b/metadata/md5-cache/media-libs/virglrenderer-9999
index f90dd5b..a3be82f 100644
--- a/metadata/md5-cache/media-libs/virglrenderer-9999
+++ b/metadata/md5-cache/media-libs/virglrenderer-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=x11-libs/libdrm-2.4.50 media-libs/libepoxy media-libs/minigbm fuzzer? ( virtual/opengles )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9469f2221027a3ae6b43d7db0410dc17
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=52ef98501f1436f1cf062d59d0d8b0fe
diff --git a/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1 b/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1
index cfcb863..3776dd5 100644
--- a/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1
+++ b/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1
@@ -9,5 +9,5 @@
 PDEPEND=layers? ( media-libs/vulkan-layers:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
 SLOT=0
 SRC_URI=https://github.com/KhronosGroup/Vulkan-Loader/archive/4cd7e44fc1ca6c4d8361720b43a3588ddf9fc4b6.tar.gz -> vulkan-loader-1.1.92.1.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=2135d5c956333d43d5f4bc87b8faca40
diff --git a/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1-r1 b/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1-r1
index cfcb863..3776dd5 100644
--- a/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1-r1
+++ b/metadata/md5-cache/media-libs/vulkan-loader-1.1.92.1-r1
@@ -9,5 +9,5 @@
 PDEPEND=layers? ( media-libs/vulkan-layers:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
 SLOT=0
 SRC_URI=https://github.com/KhronosGroup/Vulkan-Loader/archive/4cd7e44fc1ca6c4d8361720b43a3588ddf9fc4b6.tar.gz -> vulkan-loader-1.1.92.1.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=2135d5c956333d43d5f4bc87b8faca40
diff --git a/metadata/md5-cache/media-libs/webrtc-apm-0.0.1-r19 b/metadata/md5-cache/media-libs/webrtc-apm-0.0.1-r19
index 1b768c2..592b934 100644
--- a/metadata/md5-cache/media-libs/webrtc-apm-0.0.1-r19
+++ b/metadata/md5-cache/media-libs/webrtc-apm-0.0.1-r19
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/iniparser:= dev-libs/libevent:= dev-libs/protobuf:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=355fd7df05623af7c81ba8b7af527189
diff --git a/metadata/md5-cache/media-libs/webrtc-apm-9999 b/metadata/md5-cache/media-libs/webrtc-apm-9999
index 7fea186f..10de827 100644
--- a/metadata/md5-cache/media-libs/webrtc-apm-9999
+++ b/metadata/md5-cache/media-libs/webrtc-apm-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/iniparser:= dev-libs/libevent:= dev-libs/protobuf:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7d600ea1106b021b0b37aaaa8f37ef11
diff --git a/metadata/md5-cache/media-sound/adhd-0.0.6-r2060 b/metadata/md5-cache/media-sound/adhd-0.0.6-r2060
deleted file mode 100644
index 40f5a46..0000000
--- a/metadata/md5-cache/media-sound/adhd-0.0.6-r2060
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=>=app-portage/elt-patches-20170815 dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= dev-libs/libpthread-stubs:= media-sound/cras_rust:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
-DESCRIPTION=Google A/V Daemon
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/
-IUSE=asan +cras-apm fuzzer generated_cros_config selinux systemd unibuild fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_6573e6a91196049b3a8d481ab54475e150ace971
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/metrics:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= media-sound/alsa-utils media-plugins/alsa-plugins unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools sys-apps/baselayout
-SLOT=0/0.0.6-r2060
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=05f28a1da26913a45608df1947d6467b
diff --git a/metadata/md5-cache/media-sound/adhd-0.0.6-r2112 b/metadata/md5-cache/media-sound/adhd-0.0.6-r2112
new file mode 100644
index 0000000..2353425
--- /dev/null
+++ b/metadata/md5-cache/media-sound/adhd-0.0.6-r2112
@@ -0,0 +1,14 @@
+BDEPEND=>=app-portage/elt-patches-20170815 dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= dev-libs/libpthread-stubs:= media-sound/cras_rust:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
+DESCRIPTION=Google A/V Daemon
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/
+IUSE=asan +cras-apm fuzzer generated_cros_config selinux systemd unibuild fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_658abdba827b48e15f7b25ea5702fc1e5591f86c
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= media-sound/alsa-utils media-plugins/alsa-plugins unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools sys-apps/baselayout
+SLOT=0/0.0.6-r2112
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=a2a3c079f2f8492762e59ed818b48207
diff --git a/metadata/md5-cache/media-sound/adhd-9999 b/metadata/md5-cache/media-sound/adhd-9999
index 8cb3772..69b7ddf 100644
--- a/metadata/md5-cache/media-sound/adhd-9999
+++ b/metadata/md5-cache/media-sound/adhd-9999
@@ -1,6 +1,6 @@
 BDEPEND=>=app-portage/elt-patches-20170815 dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=chromeos-base/metrics:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= dev-libs/libpthread-stubs:= media-sound/cras_rust:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
+DEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= dev-libs/libpthread-stubs:= media-sound/cras_rust:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
 DESCRIPTION=Google A/V Daemon
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/
@@ -8,7 +8,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=chromeos-base/metrics:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= media-sound/alsa-utils media-plugins/alsa-plugins unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools sys-apps/baselayout
+RDEPEND=>=chromeos-base/metrics-0.0.1-r3152:= dev-libs/iniparser:= cras-apm? ( media-libs/webrtc-apm:= ) >=media-libs/alsa-lib-1.1.6-r3:= media-libs/ladspa-sdk:= media-libs/sbc:= media-libs/speex:= >=sys-apps/dbus-1.4.12:= selinux? ( sys-libs/libselinux:= ) virtual/udev:= media-sound/alsa-utils media-plugins/alsa-plugins unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp ) ) chromeos-base/chromeos-config-tools sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=5a71ab044305b2eed230c344ec57ffc0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=0dce1b661d126c082a4d99936ae59cb4
diff --git a/metadata/md5-cache/media-sound/alsa-utils-1.2.1 b/metadata/md5-cache/media-sound/alsa-utils-1.2.1
index 72e9b0b..5748569 100644
--- a/metadata/md5-cache/media-sound/alsa-utils-1.2.1
+++ b/metadata/md5-cache/media-sound/alsa-utils-1.2.1
@@ -11,4 +11,4 @@
 SLOT=0.9
 SRC_URI=https://www.alsa-project.org/files/pub/utils/alsa-utils-1.2.1.tar.bz2
 _eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=d56a91f0950db3247f9f992d7f5c97da
+_md5_=ff13a0b0d0e0db1ff2b2f466de7d7854
diff --git a/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r1 b/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r1
deleted file mode 100644
index 72e9b0b..0000000
--- a/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=virtual/pkgconfig virtual/pkgconfig virtual/pkgconfig
-DEFINED_PHASES=configure install postinst
-DEPEND=>=media-libs/alsa-lib-1.2.1 libsamplerate? ( media-libs/libsamplerate ) ncurses? ( >=sys-libs/ncurses-5.7-r7:0= ) bat? ( sci-libs/fftw:= ) doc? ( app-text/xmlto )
-DESCRIPTION=Advanced Linux Sound Architecture Utils (alsactl, alsamixer, etc.)
-EAPI=7
-HOMEPAGE=https://alsa-project.org/
-IUSE=bat doc +libsamplerate +ncurses nls selinux
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=>=media-libs/alsa-lib-1.2.1 libsamplerate? ( media-libs/libsamplerate ) ncurses? ( >=sys-libs/ncurses-5.7-r7:0= ) bat? ( sci-libs/fftw:= ) selinux? ( sec-policy/selinux-alsa )
-SLOT=0.9
-SRC_URI=https://www.alsa-project.org/files/pub/utils/alsa-utils-1.2.1.tar.bz2
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=d56a91f0950db3247f9f992d7f5c97da
diff --git a/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r2 b/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r2
new file mode 100644
index 0000000..5748569
--- /dev/null
+++ b/metadata/md5-cache/media-sound/alsa-utils-1.2.1-r2
@@ -0,0 +1,14 @@
+BDEPEND=virtual/pkgconfig virtual/pkgconfig virtual/pkgconfig
+DEFINED_PHASES=configure install postinst
+DEPEND=>=media-libs/alsa-lib-1.2.1 libsamplerate? ( media-libs/libsamplerate ) ncurses? ( >=sys-libs/ncurses-5.7-r7:0= ) bat? ( sci-libs/fftw:= ) doc? ( app-text/xmlto )
+DESCRIPTION=Advanced Linux Sound Architecture Utils (alsactl, alsamixer, etc.)
+EAPI=7
+HOMEPAGE=https://alsa-project.org/
+IUSE=bat doc +libsamplerate +ncurses nls selinux
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=>=media-libs/alsa-lib-1.2.1 libsamplerate? ( media-libs/libsamplerate ) ncurses? ( >=sys-libs/ncurses-5.7-r7:0= ) bat? ( sci-libs/fftw:= ) selinux? ( sec-policy/selinux-alsa )
+SLOT=0.9
+SRC_URI=https://www.alsa-project.org/files/pub/utils/alsa-utils-1.2.1.tar.bz2
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=ff13a0b0d0e0db1ff2b2f466de7d7854
diff --git a/metadata/md5-cache/media-sound/audio_streams-0.1.0-r18 b/metadata/md5-cache/media-sound/audio_streams-0.1.0-r18
deleted file mode 100644
index c24b236..0000000
--- a/metadata/md5-cache/media-sound/audio_streams-0.1.0-r18
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/sync:= dev-rust/sys_util:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Crate provides a basic interface for playing audio.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/audio_streams
-IUSE=test cros_host cros_workon_tree_6a803c3c8c923f3e5ddbf3b4b7b50ec935525ad8 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<=media-sound/audio_streams-0.1.0-r7
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r18
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=40cd76f623e387fab7c9c0ba433e5842
diff --git a/metadata/md5-cache/media-sound/audio_streams-0.1.0-r20 b/metadata/md5-cache/media-sound/audio_streams-0.1.0-r20
new file mode 100644
index 0000000..a0ac03b
--- /dev/null
+++ b/metadata/md5-cache/media-sound/audio_streams-0.1.0-r20
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/sync:= dev-rust/sys_util:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Crate provides a basic interface for playing audio.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/audio_streams
+IUSE=test cros_host cros_workon_tree_d3de0c7d6ef905e1a802f5f40b6848be14b6df0d cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<=media-sound/audio_streams-0.1.0-r7
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r20
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f1979c0687e919a094deb7fbbac84453
diff --git a/metadata/md5-cache/media-sound/audio_streams-9999 b/metadata/md5-cache/media-sound/audio_streams-9999
index 08acd02..8fd44aa 100644
--- a/metadata/md5-cache/media-sound/audio_streams-9999
+++ b/metadata/md5-cache/media-sound/audio_streams-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<=media-sound/audio_streams-0.1.0-r7
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c51f793c0491bb6c1768cac2e62ad073
diff --git a/metadata/md5-cache/media-sound/cras-sys-0.1.0-r22 b/metadata/md5-cache/media-sound/cras-sys-0.1.0-r22
deleted file mode 100644
index 97f03e9..0000000
--- a/metadata/md5-cache/media-sound/cras-sys-0.1.0-r22
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/data_model:= media-sound/audio_streams:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Crate for CRAS C-structures generated by bindgen
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras-sys
-IUSE=test cros_host cros_workon_tree_84e47edbd06517532e4b5127f53f0d2b4f6677a0 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<=media-sound/cras-sys-0.1.0-r10
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r22
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=58b14e2f2399302247b9d7c37881a6d0
diff --git a/metadata/md5-cache/media-sound/cras-sys-0.1.0-r26 b/metadata/md5-cache/media-sound/cras-sys-0.1.0-r26
new file mode 100644
index 0000000..28dd744
--- /dev/null
+++ b/metadata/md5-cache/media-sound/cras-sys-0.1.0-r26
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/data_model:= media-sound/audio_streams:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Crate for CRAS C-structures generated by bindgen
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras-sys
+IUSE=test cros_host cros_workon_tree_52718d5427f88cf2bccfe01260649ed8f3397a2d cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<=media-sound/cras-sys-0.1.0-r10
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r26
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4eb0c538ace130902f7ebeba88447956
diff --git a/metadata/md5-cache/media-sound/cras-sys-9999 b/metadata/md5-cache/media-sound/cras-sys-9999
index f62fd48..81317bc 100644
--- a/metadata/md5-cache/media-sound/cras-sys-9999
+++ b/metadata/md5-cache/media-sound/cras-sys-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<=media-sound/cras-sys-0.1.0-r10
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=37169fdd29480fdc558c9df7b9662726
diff --git a/metadata/md5-cache/media-sound/cras_rust-0.1.0-r3 b/metadata/md5-cache/media-sound/cras_rust-0.1.0-r3
deleted file mode 100644
index 2074a80..0000000
--- a/metadata/md5-cache/media-sound/cras_rust-0.1.0-r3
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=dev-rust/libc:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust code which is used within cras
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/src/server/rust
-IUSE=test cros_host cros_workon_tree_76209c09de86847598f3b5a4ac649bb9ab7a4e25 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r3
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6361a71233c977b64a174590f51c69dc
diff --git a/metadata/md5-cache/media-sound/cras_rust-0.1.0-r4 b/metadata/md5-cache/media-sound/cras_rust-0.1.0-r4
new file mode 100644
index 0000000..2d1d000
--- /dev/null
+++ b/metadata/md5-cache/media-sound/cras_rust-0.1.0-r4
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=dev-rust/libc:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust code which is used within cras
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/src/server/rust
+IUSE=test cros_host cros_workon_tree_56f51edbec0ccbbca4e4cdd4694e849e4ae48f42 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r4
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9a5fe5bd2b5f497cc23b96a097db9ba5
diff --git a/metadata/md5-cache/media-sound/cras_rust-9999 b/metadata/md5-cache/media-sound/cras_rust-9999
index cdc0010..f8d5488 100644
--- a/metadata/md5-cache/media-sound/cras_rust-9999
+++ b/metadata/md5-cache/media-sound/cras_rust-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=99af4b7bc57bc7cf09d8c6b5927a20ae
diff --git a/metadata/md5-cache/media-sound/cras_tests-0.1.0-r21 b/metadata/md5-cache/media-sound/cras_tests-0.1.0-r21
deleted file mode 100644
index acbeac5..0000000
--- a/metadata/md5-cache/media-sound/cras_tests-0.1.0-r21
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=>=dev-rust/getopts-0.2.18:= !>=dev-rust/getopts-0.3 dev-rust/hound:= media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust version cras test client
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras_tests
-IUSE=test cros_host cros_workon_tree_2c8f6e1f8d249ffc9359b2ce4e8e8b345ceeeeab cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<=media-sound/cras_tests-0.1.0-r12
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r21
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8b477a65168b2007ae93822d6fed8488
diff --git a/metadata/md5-cache/media-sound/cras_tests-0.1.0-r22 b/metadata/md5-cache/media-sound/cras_tests-0.1.0-r22
new file mode 100644
index 0000000..c89834a
--- /dev/null
+++ b/metadata/md5-cache/media-sound/cras_tests-0.1.0-r22
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=dev-rust/getopts-0.2.18:= !>=dev-rust/getopts-0.3 dev-rust/hound:= media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust version cras test client
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/cras_tests
+IUSE=test cros_host cros_workon_tree_8765fd6dccd3ad79d8874f02a7ba3401c2444862 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<=media-sound/cras_tests-0.1.0-r12
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r22
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b5be355a0aa6796fb68ab8e080a8ec4
diff --git a/metadata/md5-cache/media-sound/cras_tests-9999 b/metadata/md5-cache/media-sound/cras_tests-9999
index c07ccf61..f3fca44 100644
--- a/metadata/md5-cache/media-sound/cras_tests-9999
+++ b/metadata/md5-cache/media-sound/cras_tests-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<=media-sound/cras_tests-0.1.0-r12
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e07792e77c6379b3c533755caab36752
diff --git a/metadata/md5-cache/media-sound/cros_alsa-0.1.0-r1 b/metadata/md5-cache/media-sound/cros_alsa-0.1.0-r1
new file mode 100644
index 0000000..b126d2f
--- /dev/null
+++ b/metadata/md5-cache/media-sound/cros_alsa-0.1.0-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=dev-rust/alsa-sys-0.2.0:= <dev-rust/alsa-sys-0.3.0 >=dev-rust/libc-0.2.65:= <dev-rust/libc-0.3 =dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= dev-rust/remain:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust version alsa-lib
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cros_alsa
+IUSE=test cros_host cros_workon_tree_8df34d11e8b707d596006d273308a7bc953387a6 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r1
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=39e5d4cda0ea22841710e583541f72dc
diff --git a/metadata/md5-cache/media-sound/cros_alsa-9999 b/metadata/md5-cache/media-sound/cros_alsa-9999
new file mode 100644
index 0000000..fd16a57
--- /dev/null
+++ b/metadata/md5-cache/media-sound/cros_alsa-9999
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=dev-rust/alsa-sys-0.2.0:= <dev-rust/alsa-sys-0.3.0 >=dev-rust/libc-0.2.65:= <dev-rust/libc-0.3 =dev-rust/proc-macro2-1*:= =dev-rust/quote-1*:= =dev-rust/syn-1*:= dev-rust/remain:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust version alsa-lib
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cros_alsa
+IUSE=test cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=~*
+LICENSE=BSD-Google
+PROPERTIES=live
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d0ad85cb7b9842cf11b04944e04023c5
diff --git a/metadata/md5-cache/media-sound/libcras-0.1.0-r45 b/metadata/md5-cache/media-sound/libcras-0.1.0-r45
deleted file mode 100644
index bdabb76..0000000
--- a/metadata/md5-cache/media-sound/libcras-0.1.0-r45
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
-DEPEND=>=dev-rust/libc-0.2.44:= dev-rust/data_model:= dev-rust/sys_util:= media-sound/audio_streams:= media-sound/cras-sys:= >=virtual/rust-1.39.0:=
-DESCRIPTION=Rust version libcras
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/libcras
-IUSE=test cros_host cros_workon_tree_f11682d3cf8411e58cd17fa4c6ad8d52c87973d4 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!<=media-sound/libcras-0.1.0-r21
-REQUIRED_USE=?? ( asan lsan msan tsan )
-SLOT=0/0.1.0-r45
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cc7e0fda6d0ab4da10ffff61d8e9ab2d
diff --git a/metadata/md5-cache/media-sound/libcras-0.1.0-r47 b/metadata/md5-cache/media-sound/libcras-0.1.0-r47
new file mode 100644
index 0000000..2d66cda
--- /dev/null
+++ b/metadata/md5-cache/media-sound/libcras-0.1.0-r47
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst prepare prerm setup test unpack
+DEPEND=>=dev-rust/libc-0.2.44:= dev-rust/data_model:= dev-rust/sys_util:= media-sound/audio_streams:= media-sound/cras-sys:= >=virtual/rust-1.39.0:=
+DESCRIPTION=Rust version libcras
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/cras/client/libcras
+IUSE=test cros_host cros_workon_tree_11b3200d6a54b9af5a5f2b322e1500081d5fd708 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!<=media-sound/libcras-0.1.0-r21
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r47
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0cc32346b38dfe169228b454569b7a75
diff --git a/metadata/md5-cache/media-sound/libcras-9999 b/metadata/md5-cache/media-sound/libcras-9999
index f6d9aab..4128f0d 100644
--- a/metadata/md5-cache/media-sound/libcras-9999
+++ b/metadata/md5-cache/media-sound/libcras-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<=media-sound/libcras-0.1.0-r21
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1c1af62b553e7f6a84d01dfea43e8af1
diff --git a/metadata/md5-cache/media-sound/sound_card_init-0.1.0-r4 b/metadata/md5-cache/media-sound/sound_card_init-0.1.0-r4
new file mode 100644
index 0000000..42e842f
--- /dev/null
+++ b/metadata/md5-cache/media-sound/sound_card_init-0.1.0-r4
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
+DEPEND=dev-rust/cc:= dev-rust/getopts:= dev-rust/sys_util:= dev-rust/serde_yaml:= dev-rust/remain:= media-sound/cros_alsa:= media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DESCRIPTION=Sound Card Initializer
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/sound_card_init
+IUSE=cros_host cros_workon_tree_2f8d78da83ee766e65795ca52ceaf055f222e272 cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=-* amd64
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/baselayout
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/0.1.0-r4
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=b3fd3e49e30def8b26008f9c03271348
diff --git a/metadata/md5-cache/media-sound/sound_card_init-9999 b/metadata/md5-cache/media-sound/sound_card_init-9999
new file mode 100644
index 0000000..2d87291
--- /dev/null
+++ b/metadata/md5-cache/media-sound/sound_card_init-9999
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install postinst preinst prepare prerm setup test unpack
+DEPEND=dev-rust/cc:= dev-rust/getopts:= dev-rust/sys_util:= dev-rust/serde_yaml:= dev-rust/remain:= media-sound/cros_alsa:= media-sound/audio_streams:= media-sound/libcras:= >=virtual/rust-1.39.0:= sys-apps/baselayout
+DESCRIPTION=Sound Card Initializer
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/adhd/+/master/sound_card_init
+IUSE=cros_host cros_workon_tree_ cros-debug asan coverage fuzzer msan tsan ubsan asan fuzzer lsan +lto msan test tsan ubsan
+KEYWORDS=-* ~amd64
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=sys-apps/baselayout
+REQUIRED_USE=?? ( asan lsan msan tsan )
+SLOT=0/9999
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=75459cd039296b07ee2b6d25aec0f92a
diff --git a/metadata/md5-cache/media-video/libva-utils-2.6.0 b/metadata/md5-cache/media-video/libva-utils-2.6.0
index a8f5e03..f5a79cc 100644
--- a/metadata/md5-cache/media-video/libva-utils-2.6.0
+++ b/metadata/md5-cache/media-video/libva-utils-2.6.0
@@ -1,14 +1,13 @@
 DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4 virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Collection of utilities and tests for VA-API
 EAPI=5
 HOMEPAGE=https://01.org/linuxmedia/vaapi
-IUSE=+drm test wayland X
+IUSE=test
 KEYWORDS=-* amd64 x86 ~amd64-linux ~x86-linux
 LICENSE=MIT
-RDEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 )
-REQUIRED_USE=|| ( drm wayland X )
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4
 SLOT=0
 SRC_URI=https://github.com/intel/libva-utils/archive/2.6.0.tar.gz -> libva-utils-2.6.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1db523f4b259df1670209d407746c20a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fcdcc00ea6bbcad9196eba3d2bc6656b
diff --git a/metadata/md5-cache/media-video/libva-utils-2.6.0-r1 b/metadata/md5-cache/media-video/libva-utils-2.6.0-r1
deleted file mode 100644
index a8f5e03..0000000
--- a/metadata/md5-cache/media-video/libva-utils-2.6.0-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Collection of utilities and tests for VA-API
-EAPI=5
-HOMEPAGE=https://01.org/linuxmedia/vaapi
-IUSE=+drm test wayland X
-KEYWORDS=-* amd64 x86 ~amd64-linux ~x86-linux
-LICENSE=MIT
-RDEPEND=>=x11-libs/libva-2.1.0[drm?,wayland?,X?] drm? ( >=x11-libs/libdrm-2.4 ) X? ( >=x11-libs/libX11-1.6.2 >=x11-libs/libXext-1.3.2 >=x11-libs/libXfixes-5.0.1 ) wayland? ( >=dev-libs/wayland-1.0.6 )
-REQUIRED_USE=|| ( drm wayland X )
-SLOT=0
-SRC_URI=https://github.com/intel/libva-utils/archive/2.6.0.tar.gz -> libva-utils-2.6.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1db523f4b259df1670209d407746c20a
diff --git a/metadata/md5-cache/media-video/libva-utils-2.6.0-r2 b/metadata/md5-cache/media-video/libva-utils-2.6.0-r2
new file mode 100644
index 0000000..f5a79cc
--- /dev/null
+++ b/metadata/md5-cache/media-video/libva-utils-2.6.0-r2
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4 virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Collection of utilities and tests for VA-API
+EAPI=5
+HOMEPAGE=https://01.org/linuxmedia/vaapi
+IUSE=test
+KEYWORDS=-* amd64 x86 ~amd64-linux ~x86-linux
+LICENSE=MIT
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4
+SLOT=0
+SRC_URI=https://github.com/intel/libva-utils/archive/2.6.0.tar.gz -> libva-utils-2.6.0.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fcdcc00ea6bbcad9196eba3d2bc6656b
diff --git a/metadata/md5-cache/net-analyzer/nmap-7.70 b/metadata/md5-cache/net-analyzer/nmap-7.70
index 6f4e6c1..71e6a56 100644
--- a/metadata/md5-cache/net-analyzer/nmap-7.70
+++ b/metadata/md5-cache/net-analyzer/nmap-7.70
@@ -1,14 +1,14 @@
 DEFINED_PHASES=compile configure install prepare setup unpack
-DEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( dev-python/pygtk:2[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( sys-devel/gettext ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( python_single_target_python2_7? ( dev-python/pygtk:2[python_targets_python2_7(-)] ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( sys-devel/gettext ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=A utility for network discovery and security auditing
 EAPI=6
 HOMEPAGE=https://nmap.org/
-IUSE=ipv6 libressl libssh2 ncat ndiff nls nmap-update nping +nse ssl system-lua zenmap +python_targets_python2_7 +python_single_target_python2_7
+IUSE=ipv6 libressl libssh2 ncat ndiff nls nmap-update nping +nse ssl system-lua zenmap +python_single_target_python2_7
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( dev-python/pygtk:2[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] )
-REQUIRED_USE=system-lua? ( nse ) ndiff? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) ) zenmap? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
+RDEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( python_single_target_python2_7? ( dev-python/pygtk:2[python_targets_python2_7(-)] ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) )
+REQUIRED_USE=system-lua? ( nse ) ndiff? ( ^^ ( python_single_target_python2_7 ) ) zenmap? ( ^^ ( python_single_target_python2_7 ) )
 SLOT=0
 SRC_URI=https://nmap.org/dist/nmap-7.70.tar.bz2 https://dev.gentoo.org/~jer/nmap-logo-64.png
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=48af0dd7025339258d5e559ba97571e3
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=48405f487e1ef337e53774b5fdf9c530
diff --git a/metadata/md5-cache/net-analyzer/nmap-7.70-r2 b/metadata/md5-cache/net-analyzer/nmap-7.70-r2
deleted file mode 100644
index 6f4e6c1..0000000
--- a/metadata/md5-cache/net-analyzer/nmap-7.70-r2
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup unpack
-DEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( dev-python/pygtk:2[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( sys-devel/gettext ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=A utility for network discovery and security auditing
-EAPI=6
-HOMEPAGE=https://nmap.org/
-IUSE=ipv6 libressl libssh2 ncat ndiff nls nmap-update nping +nse ssl system-lua zenmap +python_targets_python2_7 +python_single_target_python2_7
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( dev-python/pygtk:2[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] )
-REQUIRED_USE=system-lua? ( nse ) ndiff? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) ) zenmap? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
-SLOT=0
-SRC_URI=https://nmap.org/dist/nmap-7.70.tar.bz2 https://dev.gentoo.org/~jer/nmap-logo-64.png
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=48af0dd7025339258d5e559ba97571e3
diff --git a/metadata/md5-cache/net-analyzer/nmap-7.70-r3 b/metadata/md5-cache/net-analyzer/nmap-7.70-r3
new file mode 100644
index 0000000..71e6a56
--- /dev/null
+++ b/metadata/md5-cache/net-analyzer/nmap-7.70-r3
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare setup unpack
+DEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( python_single_target_python2_7? ( dev-python/pygtk:2[python_targets_python2_7(-)] ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( sys-devel/gettext ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=A utility for network discovery and security auditing
+EAPI=6
+HOMEPAGE=https://nmap.org/
+IUSE=ipv6 libressl libssh2 ncat ndiff nls nmap-update nping +nse ssl system-lua zenmap +python_single_target_python2_7
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=dev-libs/liblinear:= dev-libs/libpcre net-libs/libpcap libssh2? ( net-libs/libssh2[zlib] ) ndiff? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) nls? ( virtual/libintl ) nmap-update? ( dev-libs/apr dev-vcs/subversion ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) system-lua? ( >=dev-lang/lua-5.2:*[deprecated] ) zenmap? ( python_single_target_python2_7? ( dev-python/pygtk:2[python_targets_python2_7(-)] ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[sqlite,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) )
+REQUIRED_USE=system-lua? ( nse ) ndiff? ( ^^ ( python_single_target_python2_7 ) ) zenmap? ( ^^ ( python_single_target_python2_7 ) )
+SLOT=0
+SRC_URI=https://nmap.org/dist/nmap-7.70.tar.bz2 https://dev.gentoo.org/~jer/nmap-logo-64.png
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=48405f487e1ef337e53774b5fdf9c530
diff --git a/metadata/md5-cache/net-dialup/ppp-2.4.7-r9 b/metadata/md5-cache/net-dialup/ppp-2.4.7-r9
index fc3997a..0f1faf7 100644
--- a/metadata/md5-cache/net-dialup/ppp-2.4.7-r9
+++ b/metadata/md5-cache/net-dialup/ppp-2.4.7-r9
@@ -10,5 +10,5 @@
 RDEPEND=activefilter? ( net-libs/libpcap ) atm? ( net-dialup/linux-atm ) pam? ( virtual/pam ) gtk? ( x11-libs/gtk+:2 ) eap-tls? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) ) sys-apps/baselayout
 SLOT=0/2.4.7
 SRC_URI=https://download.samba.org/pub/ppp/ppp-2.4.7.tar.gz https://dev.gentoo.org/~polynomial-c/ppp-2.4.7-patches-6.tar.xz http://www.netservers.net.uk/gpl/ppp-dhcpc.tgz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	pam	3f746974e1cc47cabe3bd488c08cdc8e	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=f3129482e0624d535d70366488fab45a
diff --git a/metadata/md5-cache/net-dns/avahi-0.7-r5 b/metadata/md5-cache/net-dns/avahi-0.7-r5
index e74f080..03c0ee9 100644
--- a/metadata/md5-cache/net-dns/avahi-0.7-r5
+++ b/metadata/md5-cache/net-dns/avahi-0.7-r5
@@ -10,5 +10,5 @@
 REQUIRED_USE=python? ( dbus gdbm || ( python_targets_python2_7 ) ) mono? ( dbus ) howl-compat? ( dbus ) mdnsresponder-compat? ( dbus )
 SLOT=0
 SRC_URI=https://github.com/lathiat/avahi/archive/v0.7.tar.gz -> avahi-0.7.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	mono-env	59ca1177366cc9e14521d3501e9bb281	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	mono-env	59ca1177366cc9e14521d3501e9bb281	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=192707c15b05b62862e5b056b651d5b7
diff --git a/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4 b/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4
index 5a50074..fe39f6a1 100644
--- a/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4
+++ b/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4
@@ -9,5 +9,5 @@
 RDEPEND=>=net-libs/libmnl-1.0.3 >=net-libs/libnetfilter_conntrack-1.0.6 >=net-libs/libnetfilter_cthelper-1.0.0 >=net-libs/libnetfilter_cttimeout-1.0.0 >=net-libs/libnetfilter_queue-1.0.2 >=net-libs/libnfnetlink-1.0.1 !libtirpc? ( sys-libs/glibc[rpc(-)] ) libtirpc? ( net-libs/libtirpc )
 SLOT=0
 SRC_URI=http://www.netfilter.org/projects/conntrack-tools/files/conntrack-tools-1.4.4.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=df69b828106964d49a37c24bd4b5e18b
diff --git a/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4-r12 b/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4-r12
index 5a50074..fe39f6a1 100644
--- a/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4-r12
+++ b/metadata/md5-cache/net-firewall/conntrack-tools-1.4.4-r12
@@ -9,5 +9,5 @@
 RDEPEND=>=net-libs/libmnl-1.0.3 >=net-libs/libnetfilter_conntrack-1.0.6 >=net-libs/libnetfilter_cthelper-1.0.0 >=net-libs/libnetfilter_cttimeout-1.0.0 >=net-libs/libnetfilter_queue-1.0.2 >=net-libs/libnfnetlink-1.0.1 !libtirpc? ( sys-libs/glibc[rpc(-)] ) libtirpc? ( net-libs/libtirpc )
 SLOT=0
 SRC_URI=http://www.netfilter.org/projects/conntrack-tools/files/conntrack-tools-1.4.4.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=df69b828106964d49a37c24bd4b5e18b
diff --git a/metadata/md5-cache/net-firewall/nftables-0.8 b/metadata/md5-cache/net-firewall/nftables-0.8
index 4a6956c..c1e3d42 100644
--- a/metadata/md5-cache/net-firewall/nftables-0.8
+++ b/metadata/md5-cache/net-firewall/nftables-0.8
@@ -9,5 +9,5 @@
 RDEPEND=>=net-libs/libmnl-1.0.3:0= gmp? ( dev-libs/gmp:0= ) readline? ( sys-libs/readline:0= ) >=net-libs/libnftnl-1.0.9:0=
 SLOT=0
 SRC_URI=https://git.netfilter.org/nftables/snapshot/v0.8.tar.gz -> nftables-0.8.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ab866536631a456e2b8396adcebb5b85
diff --git a/metadata/md5-cache/net-firewall/nftables-0.8-r4 b/metadata/md5-cache/net-firewall/nftables-0.8-r4
index 4a6956c..c1e3d42 100644
--- a/metadata/md5-cache/net-firewall/nftables-0.8-r4
+++ b/metadata/md5-cache/net-firewall/nftables-0.8-r4
@@ -9,5 +9,5 @@
 RDEPEND=>=net-libs/libmnl-1.0.3:0= gmp? ( dev-libs/gmp:0= ) readline? ( sys-libs/readline:0= ) >=net-libs/libnftnl-1.0.9:0=
 SLOT=0
 SRC_URI=https://git.netfilter.org/nftables/snapshot/v0.8.tar.gz -> nftables-0.8.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ab866536631a456e2b8396adcebb5b85
diff --git a/metadata/md5-cache/net-fs/samba-4.11.13 b/metadata/md5-cache/net-fs/samba-4.11.13
new file mode 100644
index 0000000..df95d85
--- /dev/null
+++ b/metadata/md5-cache/net-fs/samba-4.11.13
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure install postinst prepare setup test
+DEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( python_single_target_python3_6? ( dev-python/subunit[python_targets_python3_6(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_7? ( dev-python/subunit[python_targets_python3_7(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_8? ( dev-python/subunit[python_targets_python3_8(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.12[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0= sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] python_single_target_python3_6? ( dev-python/dnspython:=[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/dnspython:=[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/dnspython:=[python_targets_python3_8(-)] ) ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_8] ) app-text/docbook-xsl-stylesheets dev-libs/libxslt net-libs/libtirpc[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/pkgconfig || ( net-libs/rpcsvc-proto <sys-libs/glibc-2.26[rpc(+)] ) test? ( !system-mitkrb5? ( >=sys-libs/nss_wrapper-1.1.3 >=net-dns/resolv_wrapper-1.1.4 >=net-libs/socket_wrapper-1.1.9 >=sys-libs/uid_wrapper-1.2.1 ) ) virtual/pkgconfig
+DESCRIPTION=Samba Suite Version 4
+EAPI=6
+HOMEPAGE=https://www.samba.org/
+IUSE=acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint json ldap pam perl profiling-data python quota selinux snapper syslog system-heimdal +system-mitkrb5 systemd test winbind zeroconf python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 kernel_linux
+KEYWORDS=*
+LICENSE=GPL-3
+RDEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( python_single_target_python3_6? ( dev-python/subunit[python_targets_python3_6(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_7? ( dev-python/subunit[python_targets_python3_7(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_8? ( dev-python/subunit[python_targets_python3_8(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.12[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0= sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] python_single_target_python3_6? ( dev-python/dnspython:=[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/dnspython:=[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/dnspython:=[python_targets_python3_8(-)] ) ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python? ( python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_8] ) ) client? ( net-fs/cifs-utils[ads?] ) selinux? ( sec-policy/selinux-samba ) !dev-perl/Parse-Yapp
+REQUIRED_USE=addc? ( python json winbind ) addns? ( python ) ads? ( acl ldap winbind ) cluster? ( ads ) gpg? ( addc ) python? ( ldap ) test? ( python ) ?? ( system-heimdal system-mitkrb5 ) ^^ ( python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 )
+RESTRICT=test
+SLOT=0
+SRC_URI=mirror://samba/stable/samba-4.11.13.tar.gz
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
+_md5_=402b547aac68bb3a74880a52054ec47c
diff --git a/metadata/md5-cache/net-fs/samba-4.11.13-r1 b/metadata/md5-cache/net-fs/samba-4.11.13-r1
new file mode 100644
index 0000000..df95d85
--- /dev/null
+++ b/metadata/md5-cache/net-fs/samba-4.11.13-r1
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure install postinst prepare setup test
+DEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( python_single_target_python3_6? ( dev-python/subunit[python_targets_python3_6(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_7? ( dev-python/subunit[python_targets_python3_7(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_8? ( dev-python/subunit[python_targets_python3_8(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.12[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0= sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] python_single_target_python3_6? ( dev-python/dnspython:=[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/dnspython:=[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/dnspython:=[python_targets_python3_8(-)] ) ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_8] ) app-text/docbook-xsl-stylesheets dev-libs/libxslt net-libs/libtirpc[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/pkgconfig || ( net-libs/rpcsvc-proto <sys-libs/glibc-2.26[rpc(+)] ) test? ( !system-mitkrb5? ( >=sys-libs/nss_wrapper-1.1.3 >=net-dns/resolv_wrapper-1.1.4 >=net-libs/socket_wrapper-1.1.9 >=sys-libs/uid_wrapper-1.2.1 ) ) virtual/pkgconfig
+DESCRIPTION=Samba Suite Version 4
+EAPI=6
+HOMEPAGE=https://www.samba.org/
+IUSE=acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint json ldap pam perl profiling-data python quota selinux snapper syslog system-heimdal +system-mitkrb5 systemd test winbind zeroconf python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 kernel_linux
+KEYWORDS=*
+LICENSE=GPL-3
+RDEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( python_single_target_python3_6? ( dev-python/subunit[python_targets_python3_6(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_7? ( dev-python/subunit[python_targets_python3_7(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) python_single_target_python3_8? ( dev-python/subunit[python_targets_python3_8(-),abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.12[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0= sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,python_single_target_python3_6(-)?,python_single_target_python3_7(-)?,python_single_target_python3_8(-)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] python_single_target_python3_6? ( dev-python/dnspython:=[python_targets_python3_6(-)] ) python_single_target_python3_7? ( dev-python/dnspython:=[python_targets_python3_7(-)] ) python_single_target_python3_8? ( dev-python/dnspython:=[python_targets_python3_8(-)] ) ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python? ( python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] >=dev-lang/python-exec-2:=[python_targets_python3_8] ) ) client? ( net-fs/cifs-utils[ads?] ) selinux? ( sec-policy/selinux-samba ) !dev-perl/Parse-Yapp
+REQUIRED_USE=addc? ( python json winbind ) addns? ( python ) ads? ( acl ldap winbind ) cluster? ( ads ) gpg? ( addc ) python? ( ldap ) test? ( python ) ?? ( system-heimdal system-mitkrb5 ) ^^ ( python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 )
+RESTRICT=test
+SLOT=0
+SRC_URI=mirror://samba/stable/samba-4.11.13.tar.gz
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
+_md5_=402b547aac68bb3a74880a52054ec47c
diff --git a/metadata/md5-cache/net-fs/samba-4.11.9-r1 b/metadata/md5-cache/net-fs/samba-4.11.9-r1
deleted file mode 100644
index eba66d6..0000000
--- a/metadata/md5-cache/net-fs/samba-4.11.9-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( dev-python/subunit[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0 net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.10[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( >=sys-libs/talloc-2.2.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tdb-1.4.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tevent-0.10.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] dev-python/dnspython:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] app-text/docbook-xsl-stylesheets dev-libs/libxslt net-libs/libtirpc[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/pkgconfig || ( net-libs/rpcsvc-proto <sys-libs/glibc-2.26[rpc(+)] ) test? ( !system-mitkrb5? ( >=sys-libs/nss_wrapper-1.1.3 >=net-dns/resolv_wrapper-1.1.4 >=net-libs/socket_wrapper-1.1.9 >=sys-libs/uid_wrapper-1.2.1 ) ) virtual/pkgconfig
-DESCRIPTION=Samba Suite Version 4
-EAPI=6
-HOMEPAGE=https://www.samba.org/
-IUSE=acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint json ldap pam perl profiling-data python quota selinux snapper syslog system-heimdal +system-mitkrb5 systemd test winbind zeroconf python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 kernel_linux
-KEYWORDS=*
-LICENSE=GPL-3
-RDEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( dev-python/subunit[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0 net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.10[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( >=sys-libs/talloc-2.2.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tdb-1.4.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tevent-0.10.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] dev-python/dnspython:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python? ( python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) client? ( net-fs/cifs-utils[ads?] ) selinux? ( sec-policy/selinux-samba ) !dev-perl/Parse-Yapp
-REQUIRED_USE=addc? ( python json winbind ) addns? ( python ) ads? ( acl ldap winbind ) cluster? ( ads ) gpg? ( addc ) python? ( ldap ) test? ( python ) ?? ( system-heimdal system-mitkrb5 ) ^^ ( python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) python_single_target_python3_8? ( python_targets_python3_8 )
-RESTRICT=test
-SLOT=0
-SRC_URI=mirror://samba/stable/samba-4.11.9.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
-_md5_=0b787bb1bf655a4b34f860b8b7e105d8
diff --git a/metadata/md5-cache/net-fs/samba-4.11.9-r2 b/metadata/md5-cache/net-fs/samba-4.11.9-r2
deleted file mode 100644
index eba66d6..0000000
--- a/metadata/md5-cache/net-fs/samba-4.11.9-r2
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( dev-python/subunit[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0 net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.10[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( >=sys-libs/talloc-2.2.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tdb-1.4.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tevent-0.10.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] dev-python/dnspython:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] app-text/docbook-xsl-stylesheets dev-libs/libxslt net-libs/libtirpc[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/pkgconfig || ( net-libs/rpcsvc-proto <sys-libs/glibc-2.26[rpc(+)] ) test? ( !system-mitkrb5? ( >=sys-libs/nss_wrapper-1.1.3 >=net-dns/resolv_wrapper-1.1.4 >=net-libs/socket_wrapper-1.1.9 >=sys-libs/uid_wrapper-1.2.1 ) ) virtual/pkgconfig
-DESCRIPTION=Samba Suite Version 4
-EAPI=6
-HOMEPAGE=https://www.samba.org/
-IUSE=acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint json ldap pam perl profiling-data python quota selinux snapper syslog system-heimdal +system-mitkrb5 systemd test winbind zeroconf python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 kernel_linux
-KEYWORDS=*
-LICENSE=GPL-3
-RDEPEND=>=app-arch/libarchive-3.1.2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] perl? ( dev-lang/perl:= ) dev-libs/libaio[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libbsd[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/libgcrypt:0 dev-libs/iniparser:0 dev-libs/libtasn1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] dev-libs/popt[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( dev-python/subunit[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=dev-util/cmocka-1.1.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3.2.0 net-libs/libnsl:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-apps/attr[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/e2fsprogs-libs[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/ldb-2.0.10[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] <sys-libs/ldb-2.1.0[ldap(+)?,python?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap sys-libs/ncurses:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/readline:0= >=sys-libs/talloc-2.2.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tdb-1.4.2[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/tevent-0.10.0[python?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] python? ( >=sys-libs/talloc-2.2.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tdb-1.4.2[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] >=sys-libs/tevent-0.10.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) sys-libs/zlib[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] virtual/libiconv pam? ( sys-libs/pam ) acl? ( virtual/acl ) addns? ( net-dns/bind-tools[gssapi] dev-python/dnspython:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) ceph? ( sys-cluster/ceph ) cluster? ( net-libs/rpcsvc-proto !dev-db/ctdb ) cups? ( net-print/cups ) debug? ( dev-util/lttng-ust ) dmapi? ( sys-apps/dmapi ) fam? ( virtual/fam ) gpg? ( app-crypt/gpgme ) json? ( dev-libs/jansson ) ldap? ( net-nds/openldap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) snapper? ( sys-apps/dbus ) system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd:0= ) zeroconf? ( net-dns/avahi ) python? ( python_single_target_python3_6? ( dev-lang/python:3.6[threads(+),xml(+)] ) python_single_target_python3_7? ( dev-lang/python:3.7[threads(+),xml(+)] ) python_single_target_python3_8? ( dev-lang/python:3.8[threads(+),xml(+)] ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?,python_single_target_python3_8(+)?] ) client? ( net-fs/cifs-utils[ads?] ) selinux? ( sec-policy/selinux-samba ) !dev-perl/Parse-Yapp
-REQUIRED_USE=addc? ( python json winbind ) addns? ( python ) ads? ( acl ldap winbind ) cluster? ( ads ) gpg? ( addc ) python? ( ldap ) test? ( python ) ?? ( system-heimdal system-mitkrb5 ) ^^ ( python_single_target_python3_6 python_single_target_python3_7 python_single_target_python3_8 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) python_single_target_python3_8? ( python_targets_python3_8 )
-RESTRICT=test
-SLOT=0
-SRC_URI=mirror://samba/stable/samba-4.11.9.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	waf-utils	0af0bf9207f47292d40e888b9687763c
-_md5_=0b787bb1bf655a4b34f860b8b7e105d8
diff --git a/metadata/md5-cache/net-libs/glib-networking-2.54.1 b/metadata/md5-cache/net-libs/glib-networking-2.54.1
index e4dbed3..71ed508 100644
--- a/metadata/md5-cache/net-libs/glib-networking-2.54.1
+++ b/metadata/md5-cache/net-libs/glib-networking-2.54.1
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare test
-DEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=sys-devel/gettext-0.19.4 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( sys-apps/dbus[X] ) >=app-portage/elt-patches-20170815 app-arch/xz-utils >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
+DEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=sys-devel/gettext-0.19.4 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( sys-apps/dbus[X] ) >=app-portage/elt-patches-20170815 app-arch/xz-utils dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
 DESCRIPTION=Network-related giomodules for glib
 EAPI=6
 HOMEPAGE=https://git.gnome.org/browse/glib-networking/
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
 SLOT=0
 SRC_URI=mirror://gnome/sources/glib-networking/2.54/glib-networking-2.54.1.tar.xz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=95596d95f8274bb6c4ed6851949a63e6
diff --git a/metadata/md5-cache/net-libs/glib-networking-2.54.1-r1 b/metadata/md5-cache/net-libs/glib-networking-2.54.1-r1
index e4dbed3..71ed508 100644
--- a/metadata/md5-cache/net-libs/glib-networking-2.54.1-r1
+++ b/metadata/md5-cache/net-libs/glib-networking-2.54.1-r1
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare test
-DEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=sys-devel/gettext-0.19.4 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( sys-apps/dbus[X] ) >=app-portage/elt-patches-20170815 app-arch/xz-utils >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
+DEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) >=sys-devel/gettext-0.19.4 >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( sys-apps/dbus[X] ) >=app-portage/elt-patches-20170815 app-arch/xz-utils dev-util/desktop-file-utils x11-misc/shared-mime-info test? ( !prefix? ( x11-base/xorg-server ) x11-apps/xhost )
 DESCRIPTION=Network-related giomodules for glib
 EAPI=6
 HOMEPAGE=https://git.gnome.org/browse/glib-networking/
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/glib-2.46.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] gnome? ( gnome-base/gsettings-desktop-schemas ) libproxy? ( >=net-libs/libproxy-0.4.11-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) smartcard? ( >=app-crypt/p11-kit-0.18.4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-3:=[pkcs11,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ssl? ( app-misc/ca-certificates >=net-libs/gnutls-3:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] )
 SLOT=0
 SRC_URI=mirror://gnome/sources/glib-networking/2.54/glib-networking-2.54.1.tar.xz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	virtualx	e9162f65645513120b4e12863a5fa972	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=95596d95f8274bb6c4ed6851949a63e6
diff --git a/metadata/md5-cache/net-libs/grpc-1.16.1 b/metadata/md5-cache/net-libs/grpc-1.16.1
index b2c7622..d0081f2 100644
--- a/metadata/md5-cache/net-libs/grpc-1.16.1
+++ b/metadata/md5-cache/net-libs/grpc-1.16.1
@@ -10,4 +10,4 @@
 SLOT=0
 SRC_URI=https://github.com/grpc/grpc/archive/v1.16.1.tar.gz -> grpc-1.16.1.tar.gz
 _eclasses_=cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=288dad70169fe0cec8b1375e8d59b4c9
+_md5_=884b1560ffc869a9ded3a218b26b3bc9
diff --git a/metadata/md5-cache/net-libs/grpc-1.16.1-r3 b/metadata/md5-cache/net-libs/grpc-1.16.1-r3
deleted file mode 100644
index b2c7622..0000000
--- a/metadata/md5-cache/net-libs/grpc-1.16.1-r3
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare
-DEPEND=>=dev-libs/openssl-1.0.2:0=[-bindist] !dev-libs/grpc dev-libs/protobuf:= net-dns/c-ares:= sys-libs/zlib:= systemtap? ( dev-util/systemtap ) virtual/pkgconfig
-DESCRIPTION=Modern open source high performance RPC framework
-EAPI=6
-HOMEPAGE=https://www.grpc.io
-IUSE=examples doc systemtap static-libs fuzzer asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=Apache-2.0
-RDEPEND=>=dev-libs/openssl-1.0.2:0=[-bindist] !dev-libs/grpc dev-libs/protobuf:= net-dns/c-ares:= sys-libs/zlib:= systemtap? ( dev-util/systemtap )
-SLOT=0
-SRC_URI=https://github.com/grpc/grpc/archive/v1.16.1.tar.gz -> grpc-1.16.1.tar.gz
-_eclasses_=cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=288dad70169fe0cec8b1375e8d59b4c9
diff --git a/metadata/md5-cache/net-libs/grpc-1.16.1-r5 b/metadata/md5-cache/net-libs/grpc-1.16.1-r5
new file mode 100644
index 0000000..d0081f2
--- /dev/null
+++ b/metadata/md5-cache/net-libs/grpc-1.16.1-r5
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install postinst prepare
+DEPEND=>=dev-libs/openssl-1.0.2:0=[-bindist] !dev-libs/grpc dev-libs/protobuf:= net-dns/c-ares:= sys-libs/zlib:= systemtap? ( dev-util/systemtap ) virtual/pkgconfig
+DESCRIPTION=Modern open source high performance RPC framework
+EAPI=6
+HOMEPAGE=https://www.grpc.io
+IUSE=examples doc systemtap static-libs fuzzer asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=Apache-2.0
+RDEPEND=>=dev-libs/openssl-1.0.2:0=[-bindist] !dev-libs/grpc dev-libs/protobuf:= net-dns/c-ares:= sys-libs/zlib:= systemtap? ( dev-util/systemtap )
+SLOT=0
+SRC_URI=https://github.com/grpc/grpc/archive/v1.16.1.tar.gz -> grpc-1.16.1.tar.gz
+_eclasses_=cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=884b1560ffc869a9ded3a218b26b3bc9
diff --git a/metadata/md5-cache/net-libs/libiio-0.0.1-r10 b/metadata/md5-cache/net-libs/libiio-0.0.1-r10
deleted file mode 100644
index a3ea9e0..0000000
--- a/metadata/md5-cache/net-libs/libiio-0.0.1-r10
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio:= ) libiio_all? ( avahi? ( net-dns/avahi ) ) !dev-libs/libiio sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Library for interfacing with IIO devices
-EAPI=6
-HOMEPAGE=https://github.com/analogdevicesinc/libiio
-IUSE=aio avahi libiio_all cros_host cros_workon_tree_902ceaea85c01fdd131e491b4615dafb28601761
-KEYWORDS=*
-LICENSE=LGPL-2.1
-PROPERTIES=live
-RDEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio:= ) libiio_all? ( avahi? ( net-dns/avahi ) ) !dev-libs/libiio
-SLOT=0/0.0.1
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=c919c98740c3d415f5af34c0ba786f34
diff --git a/metadata/md5-cache/net-libs/libiio-0.21 b/metadata/md5-cache/net-libs/libiio-0.21
new file mode 100644
index 0000000..73b6736
--- /dev/null
+++ b/metadata/md5-cache/net-libs/libiio-0.21
@@ -0,0 +1,14 @@
+BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio ) libiio_all? ( zeroconf? ( net-dns/avahi ) ) !dev-libs/libiio
+DESCRIPTION=Library for interfacing with IIO devices
+EAPI=7
+HOMEPAGE=https://github.com/analogdevicesinc/libiio
+IUSE=aio iioservice libiio_all zeroconf
+KEYWORDS=*
+LICENSE=LGPL-2.1
+RDEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio ) libiio_all? ( zeroconf? ( net-dns/avahi ) ) !dev-libs/libiio
+SLOT=0/0.21
+SRC_URI=https://github.com/analogdevicesinc/libiio/archive/v0.21.tar.gz -> libiio-0.21.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=d910d50a229915ab1e978fa57acc0f20
diff --git a/metadata/md5-cache/net-libs/libiio-0.21-r1 b/metadata/md5-cache/net-libs/libiio-0.21-r1
new file mode 100644
index 0000000..73b6736
--- /dev/null
+++ b/metadata/md5-cache/net-libs/libiio-0.21-r1
@@ -0,0 +1,14 @@
+BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio ) libiio_all? ( zeroconf? ( net-dns/avahi ) ) !dev-libs/libiio
+DESCRIPTION=Library for interfacing with IIO devices
+EAPI=7
+HOMEPAGE=https://github.com/analogdevicesinc/libiio
+IUSE=aio iioservice libiio_all zeroconf
+KEYWORDS=*
+LICENSE=LGPL-2.1
+RDEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio ) libiio_all? ( zeroconf? ( net-dns/avahi ) ) !dev-libs/libiio
+SLOT=0/0.21
+SRC_URI=https://github.com/analogdevicesinc/libiio/archive/v0.21.tar.gz -> libiio-0.21.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=d910d50a229915ab1e978fa57acc0f20
diff --git a/metadata/md5-cache/net-libs/libiio-9999 b/metadata/md5-cache/net-libs/libiio-9999
deleted file mode 100644
index 63e25a2..0000000
--- a/metadata/md5-cache/net-libs/libiio-9999
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio:= ) libiio_all? ( avahi? ( net-dns/avahi ) ) !dev-libs/libiio sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Library for interfacing with IIO devices
-EAPI=6
-HOMEPAGE=https://github.com/analogdevicesinc/libiio
-IUSE=aio avahi libiio_all cros_host cros_workon_tree_
-KEYWORDS=~*
-LICENSE=LGPL-2.1
-PROPERTIES=live
-RDEPEND=dev-libs/libxml2:= aio? ( dev-libs/libaio:= ) libiio_all? ( avahi? ( net-dns/avahi ) ) !dev-libs/libiio
-SLOT=0/9999
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=bfdfec10e8e0ea8ac7c9903be59cd661
diff --git a/metadata/md5-cache/net-libs/libmbim-1.25.0-r68 b/metadata/md5-cache/net-libs/libmbim-1.25.0-r68
deleted file mode 100644
index 5eef96a..0000000
--- a/metadata/md5-cache/net-libs/libmbim-1.25.0-r68
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure info install prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.36 virtual/libgudev doc? ( dev-util/gtk-doc ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=MBIM modem protocol helper library
-EAPI=6
-HOMEPAGE=http://cgit.freedesktop.org/libmbim/
-IUSE=-asan doc static-libs asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_6ad52e53a9e89c5d0888aafa5c8274a4c327bf74
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.36 virtual/libgudev
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c51524f76603888e15a878c28c1c12f
diff --git a/metadata/md5-cache/net-libs/libmbim-1.25.0-r69 b/metadata/md5-cache/net-libs/libmbim-1.25.0-r69
new file mode 100644
index 0000000..45e318d
--- /dev/null
+++ b/metadata/md5-cache/net-libs/libmbim-1.25.0-r69
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure info install prepare setup test unpack
+DEPEND=>=dev-libs/glib-2.36 virtual/libgudev doc? ( dev-util/gtk-doc ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=MBIM modem protocol helper library
+EAPI=6
+HOMEPAGE=http://cgit.freedesktop.org/libmbim/
+IUSE=-asan doc static-libs asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ee31c60aa22029c2558d4ea04a3dda33a18e721a
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=>=dev-libs/glib-2.36 virtual/libgudev
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=63231b3bb5b5e37b2324b7d8216ef986
diff --git a/metadata/md5-cache/net-libs/libmbim-9999 b/metadata/md5-cache/net-libs/libmbim-9999
index ea1e0a4..a8b6351 100644
--- a/metadata/md5-cache/net-libs/libmbim-9999
+++ b/metadata/md5-cache/net-libs/libmbim-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-libs/glib-2.36 virtual/libgudev
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6ffc81d2d408444460b01f7f7c758cf3
diff --git a/metadata/md5-cache/net-libs/libproxy-0.4.13-r2 b/metadata/md5-cache/net-libs/libproxy-0.4.13-r2
index e8bd881..b5b8ae0 100644
--- a/metadata/md5-cache/net-libs/libproxy-0.4.13-r2
+++ b/metadata/md5-cache/net-libs/libproxy-0.4.13-r2
@@ -11,5 +11,5 @@
 REQUIRED_USE=python? ( || ( python_targets_python2_7 ) )
 SLOT=0
 SRC_URI=https://github.com/libproxy/libproxy/archive/0.4.13.tar.gz -> libproxy-0.4.13.tar.gz
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	mono-env	59ca1177366cc9e14521d3501e9bb281	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	mono-env	59ca1177366cc9e14521d3501e9bb281	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=c12d2e85416ae33f76c76989c9e149ad
diff --git a/metadata/md5-cache/net-libs/libqmi-1.27.0-r90 b/metadata/md5-cache/net-libs/libqmi-1.27.0-r90
deleted file mode 100644
index 90a26b6..0000000
--- a/metadata/md5-cache/net-libs/libqmi-1.27.0-r90
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure info install prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.36 mbim? ( >=net-libs/libmbim-1.18.0 ) doc? ( dev-util/gtk-doc ) sys-devel/autoconf-archive virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=QMI modem protocol helper library
-EAPI=6
-HOMEPAGE=http://cgit.freedesktop.org/libqmi/
-IUSE=-asan doc mbim qrtr static-libs asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_0b50a8cbfeaab415f980f5aa16afaa14be71c8b3
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.36 mbim? ( >=net-libs/libmbim-1.18.0 )
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=419c5974427c5cb53a664727988c9be4
diff --git a/metadata/md5-cache/net-libs/libqmi-1.27.1-r93 b/metadata/md5-cache/net-libs/libqmi-1.27.1-r93
new file mode 100644
index 0000000..a8ae6a5
--- /dev/null
+++ b/metadata/md5-cache/net-libs/libqmi-1.27.1-r93
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure info install prepare setup test unpack
+DEPEND=>=dev-libs/glib-2.36 mbim? ( >=net-libs/libmbim-1.18.0 ) doc? ( dev-util/gtk-doc ) sys-devel/autoconf-archive virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=QMI modem protocol helper library
+EAPI=6
+HOMEPAGE=http://cgit.freedesktop.org/libqmi/
+IUSE=-asan doc mbim qrtr static-libs asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_9fe74e0b6144252fdc4f461a125795749ec9236d
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=>=dev-libs/glib-2.36 mbim? ( >=net-libs/libmbim-1.18.0 )
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1c9270faab50d892e266baf38031f0d7
diff --git a/metadata/md5-cache/net-libs/libqmi-9999 b/metadata/md5-cache/net-libs/libqmi-9999
index bee688d..2d1de2b 100644
--- a/metadata/md5-cache/net-libs/libqmi-9999
+++ b/metadata/md5-cache/net-libs/libqmi-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-libs/glib-2.36 mbim? ( >=net-libs/libmbim-1.18.0 )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e39908808f8bcb0f55133df73b1b19f0
diff --git a/metadata/md5-cache/net-libs/libqrtr-0.0.1-r18 b/metadata/md5-cache/net-libs/libqrtr-0.0.1-r18
deleted file mode 100644
index 2150307..0000000
--- a/metadata/md5-cache/net-libs/libqrtr-0.0.1-r18
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure info install preinst prepare setup test unpack
-DEPEND=sys-kernel/linux-headers virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
-DESCRIPTION=QRTR userspace helper library
-EAPI=5
-HOMEPAGE=https://github.com/andersson/qrtr
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_a0248c7d961d290072590870fb3f291fef6130ee
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live
-RDEPEND=sys-apps/baselayout
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=7fde1b6ca786efaea208d1d7bf1f3aa8
diff --git a/metadata/md5-cache/net-libs/libqrtr-0.0.1-r21 b/metadata/md5-cache/net-libs/libqrtr-0.0.1-r21
new file mode 100644
index 0000000..c775469
--- /dev/null
+++ b/metadata/md5-cache/net-libs/libqrtr-0.0.1-r21
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure info install preinst prepare setup test unpack
+DEPEND=sys-kernel/linux-headers virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout
+DESCRIPTION=QRTR userspace helper library
+EAPI=5
+HOMEPAGE=https://github.com/andersson/qrtr
+IUSE=-asan -qrtr_ns asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_9fc5b98c54615474f4c167d5034b6eb15475e046
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live
+RDEPEND=sys-apps/baselayout
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=ff8fd5f0f4cc84865bf1b2c5ecc87007
diff --git a/metadata/md5-cache/net-libs/libqrtr-9999 b/metadata/md5-cache/net-libs/libqrtr-9999
index f6660bc..df07436 100644
--- a/metadata/md5-cache/net-libs/libqrtr-9999
+++ b/metadata/md5-cache/net-libs/libqrtr-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=QRTR userspace helper library
 EAPI=5
 HOMEPAGE=https://github.com/andersson/qrtr
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_
+IUSE=-asan -qrtr_ns asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD
 PROPERTIES=live
 RDEPEND=sys-apps/baselayout
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=e3fe460621c540a2398fd587ee917939
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=3624a123e7f8fbb9468470dcb40086cf
diff --git a/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801 b/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801
index 4ef6e30..9383278 100644
--- a/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801
+++ b/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801
@@ -8,4 +8,4 @@
 SLOT=0
 SRC_URI=gs://chromeos-localmirror/distfiles/librmnetctl-1.0_p20180801.tar.gz
 _eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=fe1763fd5f70a37ca19092a46b9edec4
+_md5_=6e8ce602a93a250834d28d45529a8109
diff --git a/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r2 b/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r2
deleted file mode 100644
index 4ef6e30..0000000
--- a/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r2
+++ /dev/null
@@ -1,11 +0,0 @@
-DEFINED_PHASES=configure install prepare
-DESCRIPTION=Userspace interface to RmNet driver
-EAPI=6
-HOMEPAGE=https://source.codeaurora.org/quic/lc/chromiumos/third_party/librmnetctl
-IUSE=asan asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=BSD
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/librmnetctl-1.0_p20180801.tar.gz
-_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=fe1763fd5f70a37ca19092a46b9edec4
diff --git a/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r3 b/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r3
new file mode 100644
index 0000000..9383278
--- /dev/null
+++ b/metadata/md5-cache/net-libs/librmnetctl-1.0_p20180801-r3
@@ -0,0 +1,11 @@
+DEFINED_PHASES=configure install prepare
+DESCRIPTION=Userspace interface to RmNet driver
+EAPI=6
+HOMEPAGE=https://source.codeaurora.org/quic/lc/chromiumos/third_party/librmnetctl
+IUSE=asan asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=BSD
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/librmnetctl-1.0_p20180801.tar.gz
+_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6e8ce602a93a250834d28d45529a8109
diff --git a/metadata/md5-cache/net-misc/dhcpcd-6.8.2 b/metadata/md5-cache/net-misc/dhcpcd-6.8.2
index e629f40..121f485 100644
--- a/metadata/md5-cache/net-misc/dhcpcd-6.8.2
+++ b/metadata/md5-cache/net-misc/dhcpcd-6.8.2
@@ -10,4 +10,4 @@
 SLOT=0
 SRC_URI=http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.8.2.tar.bz2
 _eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c0511ca6f4e957c79a7827be77275e82
+_md5_=659974d24d1138fc99e9ddc324402e8d
diff --git a/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r20 b/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r20
deleted file mode 100644
index e629f40..0000000
--- a/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r20
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure install postinst preinst prepare
-DEPEND=udev? ( virtual/udev ) dbus? ( sys-apps/dbus ) virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=A fully featured, yet light weight RFC2131 compliant DHCP client
-EAPI=5
-HOMEPAGE=http://roy.marples.name/projects/dhcpcd/
-IUSE=elibc_glibc +embedded ipv6 kernel_linux +udev +dbus
-KEYWORDS=*
-LICENSE=BSD-2
-RDEPEND=udev? ( virtual/udev ) dbus? ( sys-apps/dbus ) sys-apps/baselayout
-SLOT=0
-SRC_URI=http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.8.2.tar.bz2
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=c0511ca6f4e957c79a7827be77275e82
diff --git a/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r21 b/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r21
new file mode 100644
index 0000000..121f485
--- /dev/null
+++ b/metadata/md5-cache/net-misc/dhcpcd-6.8.2-r21
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install postinst preinst prepare
+DEPEND=udev? ( virtual/udev ) dbus? ( sys-apps/dbus ) virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=A fully featured, yet light weight RFC2131 compliant DHCP client
+EAPI=5
+HOMEPAGE=http://roy.marples.name/projects/dhcpcd/
+IUSE=elibc_glibc +embedded ipv6 kernel_linux +udev +dbus
+KEYWORDS=*
+LICENSE=BSD-2
+RDEPEND=udev? ( virtual/udev ) dbus? ( sys-apps/dbus ) sys-apps/baselayout
+SLOT=0
+SRC_URI=http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.8.2.tar.bz2
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=659974d24d1138fc99e9ddc324402e8d
diff --git a/metadata/md5-cache/net-misc/igmpproxy-0.2 b/metadata/md5-cache/net-misc/igmpproxy-0.2
index ba4ab97..7086eff 100644
--- a/metadata/md5-cache/net-misc/igmpproxy-0.2
+++ b/metadata/md5-cache/net-misc/igmpproxy-0.2
@@ -8,5 +8,5 @@
 LICENSE=GPL-2 Stanford
 SLOT=0
 SRC_URI=https://github.com/pali/igmpproxy/releases/download/0.2/igmpproxy-0.2.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d7ba5990d3cdcfb1673e34e104ed5a24
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=73f3fea65a838700af2f019f9dfa883c
diff --git a/metadata/md5-cache/net-misc/igmpproxy-0.2-r3 b/metadata/md5-cache/net-misc/igmpproxy-0.2-r3
deleted file mode 100644
index ba4ab97..0000000
--- a/metadata/md5-cache/net-misc/igmpproxy-0.2-r3
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install prepare setup
-DEPEND=virtual/pkgconfig
-DESCRIPTION=Multicast Routing Daemon using only IGMP signalling
-EAPI=5
-HOMEPAGE=https://github.com/pali/igmpproxy
-IUSE=kernel_linux
-KEYWORDS=*
-LICENSE=GPL-2 Stanford
-SLOT=0
-SRC_URI=https://github.com/pali/igmpproxy/releases/download/0.2/igmpproxy-0.2.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d7ba5990d3cdcfb1673e34e104ed5a24
diff --git a/metadata/md5-cache/net-misc/igmpproxy-0.2-r4 b/metadata/md5-cache/net-misc/igmpproxy-0.2-r4
new file mode 100644
index 0000000..7086eff
--- /dev/null
+++ b/metadata/md5-cache/net-misc/igmpproxy-0.2-r4
@@ -0,0 +1,12 @@
+DEFINED_PHASES=install prepare setup
+DEPEND=virtual/pkgconfig
+DESCRIPTION=Multicast Routing Daemon using only IGMP signalling
+EAPI=5
+HOMEPAGE=https://github.com/pali/igmpproxy
+IUSE=kernel_linux
+KEYWORDS=*
+LICENSE=GPL-2 Stanford
+SLOT=0
+SRC_URI=https://github.com/pali/igmpproxy/releases/download/0.2/igmpproxy-0.2.tar.gz
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=73f3fea65a838700af2f019f9dfa883c
diff --git a/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r360 b/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r360
deleted file mode 100644
index ad259e2..0000000
--- a/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r360
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=configure info install preinst prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.36 >=sys-apps/dbus-1.2 dev-libs/dbus-glib net-dialup/ppp mbim? ( net-libs/libmbim ) qmi? ( net-libs/libqmi ) !net-misc/modemmanager virtual/libgudev dev-util/pkgconfig dev-util/intltool >=dev-util/gtk-doc-1.13 !net-misc/modemmanager-next-interfaces !net-misc/modemmanager >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=Modem and mobile broadband management libraries
-EAPI=6
-HOMEPAGE=http://mail.gnome.org/archives/networkmanager-list/2008-July/msg00274.html
-IUSE=doc mbim systemd qmi asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_28465104e2f460d966eb71fdd5bd72c8ae21c27f
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.36 >=sys-apps/dbus-1.2 dev-libs/dbus-glib net-dialup/ppp mbim? ( net-libs/libmbim ) qmi? ( net-libs/libqmi ) !net-misc/modemmanager sys-apps/baselayout
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=58369664d68ab201c343b983b75dc072
diff --git a/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r367 b/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r367
new file mode 100644
index 0000000..a621dfc
--- /dev/null
+++ b/metadata/md5-cache/net-misc/modemmanager-next-1.15.0-r367
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure info install preinst prepare setup test unpack
+DEPEND=>=dev-libs/glib-2.36 >=sys-apps/dbus-1.2 dev-libs/dbus-glib net-dialup/ppp mbim? ( net-libs/libmbim ) qmi? ( net-libs/libqmi ) !net-misc/modemmanager virtual/libgudev dev-util/pkgconfig dev-util/intltool >=dev-util/gtk-doc-1.13 !net-misc/modemmanager-next-interfaces !net-misc/modemmanager >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=Modem and mobile broadband management libraries
+EAPI=6
+HOMEPAGE=http://mail.gnome.org/archives/networkmanager-list/2008-July/msg00274.html
+IUSE=doc mbim systemd qmi asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_66eaab83b3f5effbdb69099aa3fc5285ac7d948e
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=>=dev-libs/glib-2.36 >=sys-apps/dbus-1.2 dev-libs/dbus-glib net-dialup/ppp mbim? ( net-libs/libmbim ) qmi? ( net-libs/libqmi ) !net-misc/modemmanager sys-apps/baselayout
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=18626d8340ae3b8535c247bed99ee1ad
diff --git a/metadata/md5-cache/net-misc/modemmanager-next-9999 b/metadata/md5-cache/net-misc/modemmanager-next-9999
index c2eb315..4be2753 100644
--- a/metadata/md5-cache/net-misc/modemmanager-next-9999
+++ b/metadata/md5-cache/net-misc/modemmanager-next-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-libs/glib-2.36 >=sys-apps/dbus-1.2 dev-libs/dbus-glib net-dialup/ppp mbim? ( net-libs/libmbim ) qmi? ( net-libs/libqmi ) !net-misc/modemmanager sys-apps/baselayout
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=be9a53b5d33a321161c64f0b0d386c11
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=c062744bc614debaee84c95486c9062b
diff --git a/metadata/md5-cache/net-misc/qc-netmgr-0.1_p20200720 b/metadata/md5-cache/net-misc/qc-netmgr-0.1_p20200720
new file mode 100644
index 0000000..15dc07b
--- /dev/null
+++ b/metadata/md5-cache/net-misc/qc-netmgr-0.1_p20200720
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install
+DEPEND=net-libs/librmnetctl net-libs/libqrtr sys-apps/baselayout
+DESCRIPTION=Qualcomm modem data service
+EAPI=6
+HOMEPAGE=https://source.codeaurora.org/quic/dataservices/modem-data-manager/log/?h=LC.UM.1.0
+IUSE=asan +seccomp asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=net-libs/librmnetctl net-libs/libqrtr sys-apps/baselayout
+SLOT=0
+SRC_URI=https://source.codeaurora.org/quic/dataservices/modem-data-manager/log/?h=LC.UM.1.0 -> qc-netmgr-0.1_p20200720.tar.gz
+_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=1f04c4a6ef1c310b009ca8957415d80c
diff --git a/metadata/md5-cache/net-misc/rmtfs-0.3_p20200203-r2 b/metadata/md5-cache/net-misc/rmtfs-0.3_p20200203-r3
similarity index 100%
rename from metadata/md5-cache/net-misc/rmtfs-0.3_p20200203-r2
rename to metadata/md5-cache/net-misc/rmtfs-0.3_p20200203-r3
diff --git a/metadata/md5-cache/net-misc/tlsdate-0.0.5-r82 b/metadata/md5-cache/net-misc/tlsdate-0.0.5-r82
deleted file mode 100644
index fefaa30..0000000
--- a/metadata/md5-cache/net-misc/tlsdate-0.0.5-r82
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst prepare setup unpack
-DEPEND=dev-libs/openssl:0= dev-libs/libevent dbus? ( sys-apps/dbus ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=Update local time over HTTPS
-EAPI=6
-HOMEPAGE=https://github.com/ioerror/tlsdate
-IUSE=-asan +dbus +seccomp systemd asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_d5bedf0d1e651c4e80acc3eec06dedbd31b3d05e cros-debug
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live
-RDEPEND=dev-libs/openssl:0= dev-libs/libevent dbus? ( sys-apps/dbus ) chromeos-base/chromeos-ca-certificates sys-apps/baselayout
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=99f7e607c418964c6a817d79b4f8235f
diff --git a/metadata/md5-cache/net-misc/tlsdate-0.0.5-r83 b/metadata/md5-cache/net-misc/tlsdate-0.0.5-r83
new file mode 100644
index 0000000..916bb85
--- /dev/null
+++ b/metadata/md5-cache/net-misc/tlsdate-0.0.5-r83
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install preinst prepare setup unpack
+DEPEND=dev-libs/openssl:0= dev-libs/libevent dbus? ( sys-apps/dbus ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=Update local time over HTTPS
+EAPI=6
+HOMEPAGE=https://github.com/ioerror/tlsdate
+IUSE=-asan +dbus +seccomp systemd asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_cc72be195ede90b09a9ae394923ac01be3ce4081 cros-debug
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live
+RDEPEND=dev-libs/openssl:0= dev-libs/libevent dbus? ( sys-apps/dbus ) chromeos-base/chromeos-ca-certificates sys-apps/baselayout
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=bd3dcd438d0f08542224ce592f0185fa
diff --git a/metadata/md5-cache/net-misc/tlsdate-9999 b/metadata/md5-cache/net-misc/tlsdate-9999
index b56c0b4..3711db8 100644
--- a/metadata/md5-cache/net-misc/tlsdate-9999
+++ b/metadata/md5-cache/net-misc/tlsdate-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=dev-libs/openssl:0= dev-libs/libevent dbus? ( sys-apps/dbus ) chromeos-base/chromeos-ca-certificates sys-apps/baselayout
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=bf89cabbedd0888b18f23a1f77bcef00
diff --git a/metadata/md5-cache/net-misc/usbip-4.19-r6 b/metadata/md5-cache/net-misc/usbip-4.19-r6
index 5ea9971..d4bf723 100644
--- a/metadata/md5-cache/net-misc/usbip-4.19-r6
+++ b/metadata/md5-cache/net-misc/usbip-4.19-r6
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-libs/glib-2.6 sys-apps/hwids >=sys-kernel/linux-headers-3.17 virtual/libudev tcpd? ( sys-apps/tcp-wrappers )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=84ccaa3945b075df51ea0f64f11f14bd
diff --git a/metadata/md5-cache/net-misc/usbip-9999 b/metadata/md5-cache/net-misc/usbip-9999
index 2612d40..afdc7a7 100644
--- a/metadata/md5-cache/net-misc/usbip-9999
+++ b/metadata/md5-cache/net-misc/usbip-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=>=dev-libs/glib-2.6 sys-apps/hwids >=sys-kernel/linux-headers-3.17 virtual/libudev tcpd? ( sys-apps/tcp-wrappers )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=89b492a0773470a756de8a0e166da868
diff --git a/metadata/md5-cache/net-print/cups-2.2.8-r75 b/metadata/md5-cache/net-print/cups-2.2.8-r75
deleted file mode 100644
index 9b3a726..0000000
--- a/metadata/md5-cache/net-print/cups-2.2.8-r75
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
-DEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=sys-apps/sed-4 sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 ) virtual/pkgconfig
-DESCRIPTION=The Common Unix Printing System
-EAPI=5
-HOMEPAGE=http://www.cups.org/
-IUSE=acl dbus debug java kerberos pam python +seccomp selinux +ssl static-libs systemd +threads upstart usb X xinetd zeroconf asan fuzzer +linguas_ca +linguas_cs +linguas_de +linguas_es +linguas_fr +linguas_it +linguas_ja +linguas_ru cros_host cros_workon_tree_343027b61547cea350ce108c1b1cd2083e9c11aa kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python2_7 +python_single_target_python2_7 elibc_FreeBSD java fuzzer asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-cups ) sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) ) usb? ( threads ) ?? ( systemd upstart )
-RESTRICT=test
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	fdo-mime	9c46e30acd923ff12e325dbe96bb98b9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=63d62875fc961062ab356396e39063ba
diff --git a/metadata/md5-cache/net-print/cups-2.3.3-r109 b/metadata/md5-cache/net-print/cups-2.3.3-r109
new file mode 100644
index 0000000..f04ccf7
--- /dev/null
+++ b/metadata/md5-cache/net-print/cups-2.3.3-r109
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
+DEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( dev-cpp/gtest >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 ) virtual/pkgconfig
+DESCRIPTION=The Common Unix Printing System
+EAPI=5
+HOMEPAGE=http://www.cups.org/
+IUSE=acl dbus debug java kerberos pam python +seccomp selinux +ssl static-libs systemd test +threads upstart usb X xinetd zeroconf asan fuzzer +linguas_ca +linguas_cs +linguas_de +linguas_es +linguas_fr +linguas_it +linguas_ja +linguas_ru cros-debug cros_host cros_workon_tree_2225a793857cbe9a90aacac97fccef0671905c83 kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_single_target_python2_7 elibc_FreeBSD java fuzzer asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-cups ) sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) ) usb? ( threads ) ?? ( systemd upstart )
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	fdo-mime	9c46e30acd923ff12e325dbe96bb98b9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=28af5834ea9ac2fa2bd565c89da7ba35
diff --git a/metadata/md5-cache/net-print/cups-9999 b/metadata/md5-cache/net-print/cups-9999
index 0cc08e2..4d954ad 100644
--- a/metadata/md5-cache/net-print/cups-9999
+++ b/metadata/md5-cache/net-print/cups-9999
@@ -1,15 +1,14 @@
 DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
-DEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 >=sys-apps/sed-4 sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 ) virtual/pkgconfig
+DEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) >=virtual/pkgconfig-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] test? ( dev-cpp/gtest >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 ) virtual/pkgconfig
 DESCRIPTION=The Common Unix Printing System
 EAPI=5
 HOMEPAGE=http://www.cups.org/
-IUSE=acl dbus debug java kerberos pam python +seccomp selinux +ssl static-libs systemd +threads upstart usb X xinetd zeroconf asan fuzzer +linguas_ca +linguas_cs +linguas_de +linguas_es +linguas_fr +linguas_it +linguas_ja +linguas_ru cros_host cros_workon_tree_ kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python2_7 +python_single_target_python2_7 elibc_FreeBSD java fuzzer asan coverage fuzzer msan tsan ubsan
+IUSE=acl dbus debug java kerberos pam python +seccomp selinux +ssl static-libs systemd test +threads upstart usb X xinetd zeroconf asan fuzzer +linguas_ca +linguas_cs +linguas_de +linguas_es +linguas_fr +linguas_it +linguas_ja +linguas_ru cros-debug cros_host cros_workon_tree_ kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_single_target_python2_7 elibc_FreeBSD java fuzzer asan coverage fuzzer msan tsan ubsan
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
-RDEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-cups ) sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) ) usb? ( threads ) ?? ( systemd upstart )
-RESTRICT=test
+RDEPEND=app-text/libpaper acl? ( kernel_linux? ( sys-apps/acl sys-apps/attr ) ) dbus? ( >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.6:* ) kerberos? ( >=virtual/krb5-0-r1[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !net-print/lprng pam? ( virtual/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) ) ssl? ( >=dev-libs/libgcrypt-1.5.3:0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=net-libs/gnutls-2.12.23-r6[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) systemd? ( sys-apps/systemd ) usb? ( virtual/libusb:1 ) X? ( x11-misc/xdg-utils ) xinetd? ( sys-apps/xinetd ) zeroconf? ( >=net-dns/avahi-0.6.31-r2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20140508 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-cups ) sys-apps/baselayout java? ( >=dev-java/java-config-2.2.0-r3 )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) ) usb? ( threads ) ?? ( systemd upstart )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	fdo-mime	9c46e30acd923ff12e325dbe96bb98b9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=68e72b4b7a3407c62d0b9733f694b285
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	fdo-mime	9c46e30acd923ff12e325dbe96bb98b9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=67d14e0915cbed7d22738e16abab793d
diff --git a/metadata/md5-cache/net-print/cups-filters-1.21.6 b/metadata/md5-cache/net-print/cups-filters-1.21.6
index fc7776f..e21087a 100644
--- a/metadata/md5-cache/net-print/cups-filters-1.21.6
+++ b/metadata/md5-cache/net-print/cups-filters-1.21.6
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile configure install postinst prepare test
-DEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] ) dev-util/gdbus-codegen test? ( media-fonts/dejavu ) virtual/pkgconfig
+DEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= chromeos-base/foomatic_shell dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] ) dev-util/gdbus-codegen test? ( media-fonts/dejavu ) virtual/pkgconfig
 DESCRIPTION=Cups filters
 EAPI=6
 HOMEPAGE=https://wiki.linuxfoundation.org/openprinting/cups-filters
 IUSE=dbus +foomatic ipp_autosetup jpeg ldap pclm pdf perl png +postscript static-libs test tiff zeroconf asan coverage fuzzer msan tsan ubsan
 KEYWORDS=*
 LICENSE=MIT GPL-2
-RDEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] )
+RDEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= chromeos-base/foomatic_shell dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] )
 SLOT=0
 SRC_URI=http://www.openprinting.org/download/cups-filters/cups-filters-1.21.6.tar.xz
 _eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	perl-functions	6ec4c4d8fc8324200f1c14e8d158c59b	perl-module	97206c028d9bdc9f248e022ac5c9fc83	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6bcf1bca359db0b6c55d1a6c9fed691d
+_md5_=c82243ea78755cf770dac4f9cb6a0ad2
diff --git a/metadata/md5-cache/net-print/cups-filters-1.21.6-r10 b/metadata/md5-cache/net-print/cups-filters-1.21.6-r10
new file mode 100644
index 0000000..e21087a
--- /dev/null
+++ b/metadata/md5-cache/net-print/cups-filters-1.21.6-r10
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install postinst prepare test
+DEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= chromeos-base/foomatic_shell dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] ) dev-util/gdbus-codegen test? ( media-fonts/dejavu ) virtual/pkgconfig
+DESCRIPTION=Cups filters
+EAPI=6
+HOMEPAGE=https://wiki.linuxfoundation.org/openprinting/cups-filters
+IUSE=dbus +foomatic ipp_autosetup jpeg ldap pclm pdf perl png +postscript static-libs test tiff zeroconf asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=MIT GPL-2
+RDEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= chromeos-base/foomatic_shell dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] )
+SLOT=0
+SRC_URI=http://www.openprinting.org/download/cups-filters/cups-filters-1.21.6.tar.xz
+_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	perl-functions	6ec4c4d8fc8324200f1c14e8d158c59b	perl-module	97206c028d9bdc9f248e022ac5c9fc83	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c82243ea78755cf770dac4f9cb6a0ad2
diff --git a/metadata/md5-cache/net-print/cups-filters-1.21.6-r9 b/metadata/md5-cache/net-print/cups-filters-1.21.6-r9
deleted file mode 100644
index fc7776f..0000000
--- a/metadata/md5-cache/net-print/cups-filters-1.21.6-r9
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare test
-DEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] ) dev-util/gdbus-codegen test? ( media-fonts/dejavu ) virtual/pkgconfig
-DESCRIPTION=Cups filters
-EAPI=6
-HOMEPAGE=https://wiki.linuxfoundation.org/openprinting/cups-filters
-IUSE=dbus +foomatic ipp_autosetup jpeg ldap pclm pdf perl png +postscript static-libs test tiff zeroconf asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=MIT GPL-2
-RDEPEND=>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils] >=app-text/qpdf-8.1.0:= dev-libs/glib:2 media-libs/fontconfig media-libs/freetype:2 media-libs/lcms:2 >=net-print/cups-1.7.3 !<=net-print/cups-1.5.9999 sys-devel/bc sys-libs/zlib dbus? ( sys-apps/dbus ) foomatic? ( !net-print/foomatic-filters ) jpeg? ( virtual/jpeg:0 ) ldap? ( net-nds/openldap ) pclm? ( >=app-text/qpdf-8.1.0:= ) pdf? ( app-text/mupdf ) perl? ( dev-lang/perl:= ) png? ( media-libs/libpng:0= ) postscript? ( >=app-text/ghostscript-gpl-9.09[cups] ) tiff? ( media-libs/tiff:0 ) zeroconf? ( net-dns/avahi[dbus] )
-SLOT=0
-SRC_URI=http://www.openprinting.org/download/cups-filters/cups-filters-1.21.6.tar.xz
-_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	perl-functions	6ec4c4d8fc8324200f1c14e8d158c59b	perl-module	97206c028d9bdc9f248e022ac5c9fc83	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6bcf1bca359db0b6c55d1a6c9fed691d
diff --git a/metadata/md5-cache/net-print/cups_proxy-0.0.1-r103 b/metadata/md5-cache/net-print/cups_proxy-0.0.1-r103
deleted file mode 100644
index 3ec8ba0..0000000
--- a/metadata/md5-cache/net-print/cups_proxy-0.0.1-r103
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst setup test unpack
-DEPEND=chromeos-base/libbrillo:= net-libs/libmicrohttpd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
-DESCRIPTION=CUPS Proxy Daemon for Chromium OS
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cups_proxy/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5eb4ce85c92a80d21ba7b43c6d0fd3cd14b20299_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_5eb4ce85c92a80d21ba7b43c6d0fd3cd14b20299_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=chromeos-base/libbrillo:= net-libs/libmicrohttpd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=50003494bdf48df71d1f52e71d413980
diff --git a/metadata/md5-cache/net-print/cups_proxy-0.0.1-r124 b/metadata/md5-cache/net-print/cups_proxy-0.0.1-r124
new file mode 100644
index 0000000..a043ae2
--- /dev/null
+++ b/metadata/md5-cache/net-print/cups_proxy-0.0.1-r124
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install preinst setup test unpack
+DEPEND=chromeos-base/libbrillo:= net-libs/libmicrohttpd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:= sys-apps/baselayout
+DESCRIPTION=CUPS Proxy Daemon for Chromium OS
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/cups_proxy/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_77483f5d470a5c2fe78edfd02b160d0dba31eb99_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_77483f5d470a5c2fe78edfd02b160d0dba31eb99_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=chromeos-base/libbrillo:= net-libs/libmicrohttpd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=d6f263622bf8945fd5661fd45e93cca4
diff --git a/metadata/md5-cache/net-print/cups_proxy-9999 b/metadata/md5-cache/net-print/cups_proxy-9999
index 45ac393..88dbaf6 100644
--- a/metadata/md5-cache/net-print/cups_proxy-9999
+++ b/metadata/md5-cache/net-print/cups_proxy-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=chromeos-base/libbrillo:= net-libs/libmicrohttpd:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:= sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=70ca177218eec27019a89e7b5435bdef
diff --git a/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0 b/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0
new file mode 100644
index 0000000..d62e963
--- /dev/null
+++ b/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0
@@ -0,0 +1,15 @@
+BDEPEND=>=app-portage/elt-patches-20170815
+DEFINED_PHASES=configure install prepare test
+DEPEND=net-print/cups:= test? ( dev-util/cppunit ) usb_modeswitch? ( sys-apps/usb_modeswitch ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Dymo SDK for LabelWriter/LabelManager printers
+EAPI=7
+HOMEPAGE=https://newellrubbermaid.secure.force.com/dymopkb
+IUSE=test usb_modeswitch asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=net-print/cups:=
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=http://download.dymo.com/Download%20Drivers/Linux/Download/dymo-cups-drivers-1.4.0.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=27972ebf130a49b870fec6e485a5f837
diff --git a/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r1 b/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r1
deleted file mode 100644
index 5c31275..0000000
--- a/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=app-portage/elt-patches-20170815
-DEFINED_PHASES=install prepare test
-DEPEND=net-print/cups test? ( dev-util/cppunit ) usb_modeswitch? ( sys-apps/usb_modeswitch ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Dymo SDK for LabelWriter/LabelManager printers
-EAPI=7
-HOMEPAGE=https://newellrubbermaid.secure.force.com/dymopkb
-IUSE=test usb_modeswitch
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=net-print/cups
-RESTRICT=!test? ( test )
-SLOT=0
-SRC_URI=http://download.dymo.com/Download%20Drivers/Linux/Download/dymo-cups-drivers-1.4.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=95f0217a5d98b1f783e19f83479722bb
diff --git a/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r2 b/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r2
new file mode 100644
index 0000000..d62e963
--- /dev/null
+++ b/metadata/md5-cache/net-print/dymo-cups-drivers-1.4.0-r2
@@ -0,0 +1,15 @@
+BDEPEND=>=app-portage/elt-patches-20170815
+DEFINED_PHASES=configure install prepare test
+DEPEND=net-print/cups:= test? ( dev-util/cppunit ) usb_modeswitch? ( sys-apps/usb_modeswitch ) !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Dymo SDK for LabelWriter/LabelManager printers
+EAPI=7
+HOMEPAGE=https://newellrubbermaid.secure.force.com/dymopkb
+IUSE=test usb_modeswitch asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=net-print/cups:=
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=http://download.dymo.com/Download%20Drivers/Linux/Download/dymo-cups-drivers-1.4.0.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=27972ebf130a49b870fec6e485a5f837
diff --git a/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1 b/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1
new file mode 100644
index 0000000..aef59a61
--- /dev/null
+++ b/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=-
+DESCRIPTION=Licenses for Fuji Xerox PPD files
+EAPI=6
+HOMEPAGE=http://dev.chromium.org
+IUSE=internal
+KEYWORDS=*
+LICENSE=LICENSE.fuji-xerox-ppds
+REQUIRED_USE=internal
+SLOT=0
+_md5_=5f93dc4f1a71c7b1ccc4db89cfcb948e
diff --git a/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1-r1 b/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1-r1
new file mode 100644
index 0000000..aef59a61
--- /dev/null
+++ b/metadata/md5-cache/net-print/fuji-xerox-printing-license-0.1-r1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=-
+DESCRIPTION=Licenses for Fuji Xerox PPD files
+EAPI=6
+HOMEPAGE=http://dev.chromium.org
+IUSE=internal
+KEYWORDS=*
+LICENSE=LICENSE.fuji-xerox-ppds
+REQUIRED_USE=internal
+SLOT=0
+_md5_=5f93dc4f1a71c7b1ccc4db89cfcb948e
diff --git a/metadata/md5-cache/net-print/hplip-3.19.6 b/metadata/md5-cache/net-print/hplip-3.19.6
index 6381dd6..afc330c 100644
--- a/metadata/md5-cache/net-print/hplip-3.19.6
+++ b/metadata/md5-cache/net-print/hplip-3.19.6
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure install postinst prepare setup
-DEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 =sys-devel/automake-1.13* >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig
+DEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 =sys-devel/automake-1.13* >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig
 DESCRIPTION=HP Linux Imaging and Printing - Print, scan, fax drivers and service tools
 EAPI=6
 HOMEPAGE=https://developers.hp.com/hp-linux-imaging-and-printing
-IUSE=doc fax +hpcups hpijs kde libnotify libressl -libusb0 minimal parport policykit qt5 scanner +snmp static-ppds X kernel_linux python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=doc fax +hpcups hpijs kde libnotify libressl -libusb0 minimal parport policykit qt5 scanner +snmp static-ppds X kernel_linux python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) app-text/ghostscript-gpl !minimal? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] python_single_target_python2_7? ( dev-python/pygobject:2[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] ) python_single_target_python3_6? ( dev-python/pygobject:3[python_targets_python3_6(-)?,python_single_target_python3_6(+)?] ) fax? ( dev-python/reportlab[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) kernel_linux? ( virtual/udev ) qt5? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] libnotify? ( dev-python/notify2[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) ) scanner? ( >=dev-python/reportlab-3.2[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] >=dev-python/pillow-3.1.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] X? ( || ( kde? ( kde-misc/skanlite ) media-gfx/xsane media-gfx/sane-frontends ) ) ) ) policykit? ( sys-auth/polkit )
-REQUIRED_USE=!minimal? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
+RDEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) app-text/ghostscript-gpl !minimal? ( python_single_target_python2_7? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python3_6(-)] ) python_single_target_python2_7? ( dev-python/pygobject:2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/pygobject:3[python_targets_python3_6(-)] ) fax? ( python_single_target_python2_7? ( dev-python/reportlab[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/reportlab[python_targets_python3_6(-)] ) ) kernel_linux? ( virtual/udev ) qt5? ( python_single_target_python2_7? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python3_6(-)] ) libnotify? ( python_single_target_python2_7? ( dev-python/notify2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/notify2[python_targets_python3_6(-)] ) ) ) scanner? ( python_single_target_python2_7? ( >=dev-python/reportlab-3.2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/reportlab-3.2[python_targets_python3_6(-)] ) python_single_target_python2_7? ( >=dev-python/pillow-3.1.1[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/pillow-3.1.1[python_targets_python3_6(-)] ) X? ( || ( kde? ( kde-misc/skanlite ) media-gfx/xsane media-gfx/sane-frontends ) ) ) ) policykit? ( sys-auth/polkit )
+REQUIRED_USE=!minimal? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) )
 SLOT=0
 SRC_URI=mirror://sourceforge/hplip/hplip-3.19.6.tar.gz https://dev.gentoo.org/~billie/distfiles/hplip-3.18.12-patches-1.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=7b79023d50d780699556546a6b1ff104
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=57933c66786ca005e3cb11dbe5bb8f03
diff --git a/metadata/md5-cache/net-print/hplip-3.19.6-r1 b/metadata/md5-cache/net-print/hplip-3.19.6-r1
deleted file mode 100644
index 6381dd6..0000000
--- a/metadata/md5-cache/net-print/hplip-3.19.6-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare setup
-DEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 =sys-devel/automake-1.13* >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig
-DESCRIPTION=HP Linux Imaging and Printing - Print, scan, fax drivers and service tools
-EAPI=6
-HOMEPAGE=https://developers.hp.com/hp-linux-imaging-and-printing
-IUSE=doc fax +hpcups hpijs kde libnotify libressl -libusb0 minimal parport policykit qt5 scanner +snmp static-ppds X kernel_linux python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) app-text/ghostscript-gpl !minimal? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] python_single_target_python2_7? ( dev-python/pygobject:2[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] ) python_single_target_python3_6? ( dev-python/pygobject:3[python_targets_python3_6(-)?,python_single_target_python3_6(+)?] ) fax? ( dev-python/reportlab[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) kernel_linux? ( virtual/udev ) qt5? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] libnotify? ( dev-python/notify2[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) ) scanner? ( >=dev-python/reportlab-3.2[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] >=dev-python/pillow-3.1.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] X? ( || ( kde? ( kde-misc/skanlite ) media-gfx/xsane media-gfx/sane-frontends ) ) ) ) policykit? ( sys-auth/polkit )
-REQUIRED_USE=!minimal? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
-SLOT=0
-SRC_URI=mirror://sourceforge/hplip/hplip-3.19.6.tar.gz https://dev.gentoo.org/~billie/distfiles/hplip-3.18.12-patches-1.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=7b79023d50d780699556546a6b1ff104
diff --git a/metadata/md5-cache/net-print/hplip-3.19.6-r4 b/metadata/md5-cache/net-print/hplip-3.19.6-r4
new file mode 100644
index 0000000..afc330c
--- /dev/null
+++ b/metadata/md5-cache/net-print/hplip-3.19.6-r4
@@ -0,0 +1,14 @@
+DEFINED_PHASES=configure install postinst prepare setup
+DEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 =sys-devel/automake-1.13* >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig
+DESCRIPTION=HP Linux Imaging and Printing - Print, scan, fax drivers and service tools
+EAPI=6
+HOMEPAGE=https://developers.hp.com/hp-linux-imaging-and-printing
+IUSE=doc fax +hpcups hpijs kde libnotify libressl -libusb0 minimal parport policykit qt5 scanner +snmp static-ppds X kernel_linux python_single_target_python2_7 python_single_target_python3_6
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=net-print/cups virtual/jpeg:0 hpijs? ( net-print/cups-filters[foomatic] ) !minimal? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads,xml] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) sys-apps/dbus !libusb0? ( virtual/libusb:1 ) libusb0? ( virtual/libusb:0 ) scanner? ( media-gfx/sane-backends ) snmp? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:= ) net-analyzer/net-snmp ) ) app-text/ghostscript-gpl !minimal? ( python_single_target_python2_7? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/dbus-python-1.2.0-r1[python_targets_python3_6(-)] ) python_single_target_python2_7? ( dev-python/pygobject:2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/pygobject:3[python_targets_python3_6(-)] ) fax? ( python_single_target_python2_7? ( dev-python/reportlab[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/reportlab[python_targets_python3_6(-)] ) ) kernel_linux? ( virtual/udev ) qt5? ( python_single_target_python2_7? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/PyQt5-5.5.1[dbus,gui,widgets,python_targets_python3_6(-)] ) libnotify? ( python_single_target_python2_7? ( dev-python/notify2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( dev-python/notify2[python_targets_python3_6(-)] ) ) ) scanner? ( python_single_target_python2_7? ( >=dev-python/reportlab-3.2[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/reportlab-3.2[python_targets_python3_6(-)] ) python_single_target_python2_7? ( >=dev-python/pillow-3.1.1[python_targets_python2_7(-)] ) python_single_target_python3_6? ( >=dev-python/pillow-3.1.1[python_targets_python3_6(-)] ) X? ( || ( kde? ( kde-misc/skanlite ) media-gfx/xsane media-gfx/sane-frontends ) ) ) ) policykit? ( sys-auth/polkit )
+REQUIRED_USE=!minimal? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) )
+SLOT=0
+SRC_URI=mirror://sourceforge/hplip/hplip-3.19.6.tar.gz https://dev.gentoo.org/~billie/distfiles/hplip-3.18.12-patches-1.tar.xz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=57933c66786ca005e3cb11dbe5bb8f03
diff --git a/metadata/md5-cache/net-print/ippusbxd-1.33 b/metadata/md5-cache/net-print/ippusbxd-1.33
deleted file mode 100644
index 7ece309..0000000
--- a/metadata/md5-cache/net-print/ippusbxd-1.33
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=virtual/libusb:1= >=net-dns/avahi-0.6.32 sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=a userland driver for IPP-over-USB class USB devices.
-EAPI=6
-HOMEPAGE=https://github.com/OpenPrinting/ippusbxd
-IUSE=asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=Apache-2.0
-SLOT=0
-SRC_URI=https://github.com/OpenPrinting/ippusbxd/archive/e8176ff30f4b7ac203bd752d457d5e81437556f1.tar.gz -> ippusbxd-1.33-e8176ff30f4b7ac203bd752d457d5e81437556f1.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=496e8eb89da29903a1d459f1d40545ab
diff --git a/metadata/md5-cache/net-print/ippusbxd-1.33-r9 b/metadata/md5-cache/net-print/ippusbxd-1.33-r9
deleted file mode 100644
index 7ece309..0000000
--- a/metadata/md5-cache/net-print/ippusbxd-1.33-r9
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=virtual/libusb:1= >=net-dns/avahi-0.6.32 sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=a userland driver for IPP-over-USB class USB devices.
-EAPI=6
-HOMEPAGE=https://github.com/OpenPrinting/ippusbxd
-IUSE=asan coverage fuzzer msan tsan ubsan
-KEYWORDS=*
-LICENSE=Apache-2.0
-SLOT=0
-SRC_URI=https://github.com/OpenPrinting/ippusbxd/archive/e8176ff30f4b7ac203bd752d457d5e81437556f1.tar.gz -> ippusbxd-1.33-e8176ff30f4b7ac203bd752d457d5e81437556f1.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=496e8eb89da29903a1d459f1d40545ab
diff --git a/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914 b/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914
index 73ed09d..3d8e605 100644
--- a/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914
+++ b/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914
@@ -1,12 +1,13 @@
-DEFINED_PHASES=install prepare unpack
-DEPEND=net-print/cups
+DEFINED_PHASES=configure install prepare unpack
+DEPEND=net-print/cups:=
 DESCRIPTION=CUPS filter and PPD files for Star Micronics printers
 EAPI=5
 HOMEPAGE=http://www.starmicronics.com
+IUSE=asan coverage fuzzer msan tsan ubsan
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=net-print/cups
+RDEPEND=net-print/cups:=
 SLOT=0
 SRC_URI=http://www.starmicronics.com/support/DriverFolder/drvr/starcupsdrv-3.6.0a_linux_20170914.tar.gz -> starcupsdrv-3.6.0a_linux_20170914.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=66c04b36b1859c1b688ad7953a699db6
+_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fa918a8673338b6dab6f8a6d8bab5196
diff --git a/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r2 b/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r2
deleted file mode 100644
index 73ed09d..0000000
--- a/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r2
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=install prepare unpack
-DEPEND=net-print/cups
-DESCRIPTION=CUPS filter and PPD files for Star Micronics printers
-EAPI=5
-HOMEPAGE=http://www.starmicronics.com
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=net-print/cups
-SLOT=0
-SRC_URI=http://www.starmicronics.com/support/DriverFolder/drvr/starcupsdrv-3.6.0a_linux_20170914.tar.gz -> starcupsdrv-3.6.0a_linux_20170914.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=66c04b36b1859c1b688ad7953a699db6
diff --git a/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r3 b/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r3
new file mode 100644
index 0000000..3d8e605
--- /dev/null
+++ b/metadata/md5-cache/net-print/starcupsdrv-3.6.0a_pre20170914-r3
@@ -0,0 +1,13 @@
+DEFINED_PHASES=configure install prepare unpack
+DEPEND=net-print/cups:=
+DESCRIPTION=CUPS filter and PPD files for Star Micronics printers
+EAPI=5
+HOMEPAGE=http://www.starmicronics.com
+IUSE=asan coverage fuzzer msan tsan ubsan
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=net-print/cups:=
+SLOT=0
+SRC_URI=http://www.starmicronics.com/support/DriverFolder/drvr/starcupsdrv-3.6.0a_linux_20170914.tar.gz -> starcupsdrv-3.6.0a_linux_20170914.tar.gz
+_eclasses_=cros-sanitizers	1790470c95f416653a627475b8864394	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fa918a8673338b6dab6f8a6d8bab5196
diff --git a/metadata/md5-cache/net-vpn/openvpn-2.4.4 b/metadata/md5-cache/net-vpn/openvpn-2.4.4
index b020d86..7cd8741 100644
--- a/metadata/md5-cache/net-vpn/openvpn-2.4.4
+++ b/metadata/md5-cache/net-vpn/openvpn-2.4.4
@@ -10,5 +10,5 @@
 REQUIRED_USE=static? ( !plugins !pkcs11 ) mbedtls? ( ssl !libressl ) pkcs11? ( ssl ) !plugins? ( !pam !down-root ) inotify? ( plugins )
 SLOT=0
 SRC_URI=http://swupdate.openvpn.net/community/releases/openvpn-2.4.4.tar.gz test? ( https://raw.githubusercontent.com/OpenVPN/openvpn/v2.4.4/tests/unit_tests/openvpn/mock_msg.h )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=eba042b36fbac205018aa96f3f7a993e
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=90244ea1bbd8741330d9f972da2a9a65
diff --git a/metadata/md5-cache/net-vpn/openvpn-2.4.4-r6 b/metadata/md5-cache/net-vpn/openvpn-2.4.4-r6
deleted file mode 100644
index b020d86..0000000
--- a/metadata/md5-cache/net-vpn/openvpn-2.4.4-r6
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=configure install postinst prepare setup test
-DEPEND=!net-misc/openvpn kernel_linux? ( iproute2? ( sys-apps/iproute2[-minimal] ) !iproute2? ( >=sys-apps/net-tools-1.60_p20160215155418 ) ) pam? ( virtual/pam ) ssl? ( !mbedtls? ( !libressl? ( >=dev-libs/openssl-0.9.8:0= ) libressl? ( dev-libs/libressl ) ) mbedtls? ( net-libs/mbedtls ) ) lz4? ( app-arch/lz4 ) lzo? ( >=dev-libs/lzo-1.07 ) pkcs11? ( >=dev-libs/pkcs11-helper-1.11 ) systemd? ( sys-apps/systemd ) test? ( dev-util/cmocka ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout virtual/pkgconfig
-DESCRIPTION=Robust and highly flexible tunneling application compatible with many OSes
-EAPI=5
-HOMEPAGE=http://openvpn.net/
-IUSE=down-root examples inotify iproute2 libressl lz4 +lzo mbedtls pam pkcs11 +plugins selinux +ssl static systemd test userland_BSD kernel_linux
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=!net-misc/openvpn kernel_linux? ( iproute2? ( sys-apps/iproute2[-minimal] ) !iproute2? ( >=sys-apps/net-tools-1.60_p20160215155418 ) ) pam? ( virtual/pam ) ssl? ( !mbedtls? ( !libressl? ( >=dev-libs/openssl-0.9.8:0= ) libressl? ( dev-libs/libressl ) ) mbedtls? ( net-libs/mbedtls ) ) lz4? ( app-arch/lz4 ) lzo? ( >=dev-libs/lzo-1.07 ) pkcs11? ( >=dev-libs/pkcs11-helper-1.11 ) systemd? ( sys-apps/systemd ) selinux? ( sec-policy/selinux-openvpn ) sys-apps/baselayout
-REQUIRED_USE=static? ( !plugins !pkcs11 ) mbedtls? ( ssl !libressl ) pkcs11? ( ssl ) !plugins? ( !pam !down-root ) inotify? ( plugins )
-SLOT=0
-SRC_URI=http://swupdate.openvpn.net/community/releases/openvpn-2.4.4.tar.gz test? ( https://raw.githubusercontent.com/OpenVPN/openvpn/v2.4.4/tests/unit_tests/openvpn/mock_msg.h )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=eba042b36fbac205018aa96f3f7a993e
diff --git a/metadata/md5-cache/net-vpn/openvpn-2.4.4-r7 b/metadata/md5-cache/net-vpn/openvpn-2.4.4-r7
new file mode 100644
index 0000000..7cd8741
--- /dev/null
+++ b/metadata/md5-cache/net-vpn/openvpn-2.4.4-r7
@@ -0,0 +1,14 @@
+DEFINED_PHASES=configure install postinst prepare setup test
+DEPEND=!net-misc/openvpn kernel_linux? ( iproute2? ( sys-apps/iproute2[-minimal] ) !iproute2? ( >=sys-apps/net-tools-1.60_p20160215155418 ) ) pam? ( virtual/pam ) ssl? ( !mbedtls? ( !libressl? ( >=dev-libs/openssl-0.9.8:0= ) libressl? ( dev-libs/libressl ) ) mbedtls? ( net-libs/mbedtls ) ) lz4? ( app-arch/lz4 ) lzo? ( >=dev-libs/lzo-1.07 ) pkcs11? ( >=dev-libs/pkcs11-helper-1.11 ) systemd? ( sys-apps/systemd ) test? ( dev-util/cmocka ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout virtual/pkgconfig
+DESCRIPTION=Robust and highly flexible tunneling application compatible with many OSes
+EAPI=5
+HOMEPAGE=http://openvpn.net/
+IUSE=down-root examples inotify iproute2 libressl lz4 +lzo mbedtls pam pkcs11 +plugins selinux +ssl static systemd test userland_BSD kernel_linux
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=!net-misc/openvpn kernel_linux? ( iproute2? ( sys-apps/iproute2[-minimal] ) !iproute2? ( >=sys-apps/net-tools-1.60_p20160215155418 ) ) pam? ( virtual/pam ) ssl? ( !mbedtls? ( !libressl? ( >=dev-libs/openssl-0.9.8:0= ) libressl? ( dev-libs/libressl ) ) mbedtls? ( net-libs/mbedtls ) ) lz4? ( app-arch/lz4 ) lzo? ( >=dev-libs/lzo-1.07 ) pkcs11? ( >=dev-libs/pkcs11-helper-1.11 ) systemd? ( sys-apps/systemd ) selinux? ( sec-policy/selinux-openvpn ) sys-apps/baselayout
+REQUIRED_USE=static? ( !plugins !pkcs11 ) mbedtls? ( ssl !libressl ) pkcs11? ( ssl ) !plugins? ( !pam !down-root ) inotify? ( plugins )
+SLOT=0
+SRC_URI=http://swupdate.openvpn.net/community/releases/openvpn-2.4.4.tar.gz test? ( https://raw.githubusercontent.com/OpenVPN/openvpn/v2.4.4/tests/unit_tests/openvpn/mock_msg.h )
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=90244ea1bbd8741330d9f972da2a9a65
diff --git a/metadata/md5-cache/net-vpn/strongswan-5.7.2 b/metadata/md5-cache/net-vpn/strongswan-5.7.2
index f3fe319..bf8c103 100644
--- a/metadata/md5-cache/net-vpn/strongswan-5.7.2
+++ b/metadata/md5-cache/net-vpn/strongswan-5.7.2
@@ -9,5 +9,5 @@
 RDEPEND=!net-misc/openswan gmp? ( >=dev-libs/gmp-4.1.5:= ) gcrypt? ( dev-libs/libgcrypt:0 ) caps? ( sys-libs/libcap ) curl? ( net-misc/curl ) ldap? ( net-nds/openldap ) openssl? ( >=dev-libs/openssl-0.9.8:=[-bindist] ) mysql? ( dev-db/mysql-connector-c:= ) sqlite? ( >=dev-db/sqlite-3.3.1 ) systemd? ( sys-apps/systemd ) networkmanager? ( net-misc/networkmanager ) pam? ( sys-libs/pam ) strongswan_plugins_unbound? ( net-dns/unbound:= net-libs/ldns ) virtual/logger sys-apps/iproute2 !net-vpn/libreswan selinux? ( sec-policy/selinux-ipsec ) sys-apps/baselayout
 SLOT=0
 SRC_URI=https://download.strongswan.org/strongswan-5.7.2.tar.bz2
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=473a78452508156cdc4aeb8fbfd5d9d0
diff --git a/metadata/md5-cache/net-vpn/strongswan-5.7.2-r2 b/metadata/md5-cache/net-vpn/strongswan-5.7.2-r2
index f3fe319..bf8c103 100644
--- a/metadata/md5-cache/net-vpn/strongswan-5.7.2-r2
+++ b/metadata/md5-cache/net-vpn/strongswan-5.7.2-r2
@@ -9,5 +9,5 @@
 RDEPEND=!net-misc/openswan gmp? ( >=dev-libs/gmp-4.1.5:= ) gcrypt? ( dev-libs/libgcrypt:0 ) caps? ( sys-libs/libcap ) curl? ( net-misc/curl ) ldap? ( net-nds/openldap ) openssl? ( >=dev-libs/openssl-0.9.8:=[-bindist] ) mysql? ( dev-db/mysql-connector-c:= ) sqlite? ( >=dev-db/sqlite-3.3.1 ) systemd? ( sys-apps/systemd ) networkmanager? ( net-misc/networkmanager ) pam? ( sys-libs/pam ) strongswan_plugins_unbound? ( net-dns/unbound:= net-libs/ldns ) virtual/logger sys-apps/iproute2 !net-vpn/libreswan selinux? ( sec-policy/selinux-ipsec ) sys-apps/baselayout
 SLOT=0
 SRC_URI=https://download.strongswan.org/strongswan-5.7.2.tar.bz2
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=473a78452508156cdc4aeb8fbfd5d9d0
diff --git a/metadata/md5-cache/net-wireless/ath3k-1-r4 b/metadata/md5-cache/net-wireless/ath3k-1-r4
index 6449bcd..7e3e58b 100644
--- a/metadata/md5-cache/net-wireless/ath3k-1-r4
+++ b/metadata/md5-cache/net-wireless/ath3k-1-r4
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RESTRICT=binchecks
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=34c5eed7ac5a851219f92cbf6b778717
diff --git a/metadata/md5-cache/net-wireless/ath3k-9999 b/metadata/md5-cache/net-wireless/ath3k-9999
index 60c9bac..46495be 100644
--- a/metadata/md5-cache/net-wireless/ath3k-9999
+++ b/metadata/md5-cache/net-wireless/ath3k-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RESTRICT=binchecks
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=fada673115f9b2fcaade264ef94e549c
diff --git a/metadata/md5-cache/net-wireless/bluez-5.44-r373 b/metadata/md5-cache/net-wireless/bluez-5.44-r373
deleted file mode 100644
index 7967bf5..0000000
--- a/metadata/md5-cache/net-wireless/bluez-5.44-r373
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= dev-util/pkgconfig:= sys-devel/flex:= >=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig dev-vcs/git
-DEFINED_PHASES=configure info install postinst prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-DESCRIPTION=Bluetooth Tools and System Daemons for Linux
-EAPI=7
-HOMEPAGE=http://www.bluez.org/
-IUSE=asan bluez-next bluez-upstream cups debug systemd readline bt_deprecated_tools cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_13a0f3387c3d689f759f6690b5a4bdeca8a693e1_ce74fa1a7779417157aa9d3ee06c44a4f20c2f83_63f6426dc875392b5ace7e1b472ac49b5a0ab79f
-KEYWORDS=*
-LICENSE=GPL-2 LGPL-2.1
-PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= !net-wireless/bluez-hcidump !net-wireless/bluez-libs !net-wireless/bluez-test !net-wireless/bluez-utils sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
-REQUIRED_USE=?? ( bluez-next bluez-upstream )
-SLOT=0/5.44-r373
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=e886fe3e483a6a82dc9fd236b7d229f7
diff --git a/metadata/md5-cache/net-wireless/bluez-5.54-r460 b/metadata/md5-cache/net-wireless/bluez-5.54-r460
new file mode 100644
index 0000000..3e75f70
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/bluez-5.54-r460
@@ -0,0 +1,15 @@
+BDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= dev-util/pkgconfig:= sys-devel/flex:= >=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig dev-vcs/git
+DEFINED_PHASES=configure info install postinst prepare setup test unpack
+DEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DESCRIPTION=Bluetooth Tools and System Daemons for Linux
+EAPI=7
+HOMEPAGE=http://www.bluez.org/
+IUSE=asan bluez-next bluez-upstream cups debug systemd readline bt_deprecated_tools cros-debug asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_f22293c6280a2f905d86600a017dc3412716eb5e_f22293c6280a2f905d86600a017dc3412716eb5e_96d62afdc4e973ada760a2311fa39afd0e13010f
+KEYWORDS=*
+LICENSE=GPL-2 LGPL-2.1
+PROPERTIES=live
+RDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= !net-wireless/bluez-hcidump !net-wireless/bluez-libs !net-wireless/bluez-test !net-wireless/bluez-utils sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+REQUIRED_USE=?? ( bluez-next bluez-upstream )
+SLOT=0/5.54-r460
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=f8d1e6c2850198b016cbbb1f56f5afd2
diff --git a/metadata/md5-cache/net-wireless/bluez-9999 b/metadata/md5-cache/net-wireless/bluez-9999
index 8055584..19e4c35 100644
--- a/metadata/md5-cache/net-wireless/bluez-9999
+++ b/metadata/md5-cache/net-wireless/bluez-9999
@@ -1,6 +1,6 @@
-BDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= dev-util/pkgconfig:= sys-devel/flex:= >=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig dev-vcs/git
+BDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= dev-util/pkgconfig:= sys-devel/flex:= >=app-portage/elt-patches-20170815 virtual/pkgconfig virtual/pkgconfig dev-vcs/git
 DEFINED_PHASES=configure info install postinst prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+DEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 DESCRIPTION=Bluetooth Tools and System Daemons for Linux
 EAPI=7
 HOMEPAGE=http://www.bluez.org/
@@ -8,8 +8,8 @@
 KEYWORDS=~*
 LICENSE=GPL-2 LGPL-2.1
 PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) chromeos-base/metrics:= !net-wireless/bluez-hcidump !net-wireless/bluez-libs !net-wireless/bluez-test !net-wireless/bluez-utils sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+RDEPEND=>=dev-libs/glib-2.14:2= app-arch/bzip2:= sys-apps/dbus:= virtual/libudev:= cups? ( net-print/cups:= ) readline? ( sys-libs/readline:= ) >=chromeos-base/metrics-0.0.1-r3152:= !net-wireless/bluez-hcidump !net-wireless/bluez-libs !net-wireless/bluez-test !net-wireless/bluez-utils sys-apps/baselayout >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
 REQUIRED_USE=?? ( bluez-next bluez-upstream )
 SLOT=0/9999
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=ebcbd3db12809fef8ebdfc65efc7a138
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=79a354332e6c3763bf8771e9f9df64a0
diff --git a/metadata/md5-cache/net-wireless/crda-3.18-r3 b/metadata/md5-cache/net-wireless/crda-3.18-r3
index 8746abd..7e4ce85 100644
--- a/metadata/md5-cache/net-wireless/crda-3.18-r3
+++ b/metadata/md5-cache/net-wireless/crda-3.18-r3
@@ -9,5 +9,5 @@
 RDEPEND=!gcrypt? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) ) gcrypt? ( dev-libs/libgcrypt:0= ) dev-libs/libnl:3 net-wireless/wireless-regdb
 SLOT=0
 SRC_URI=http://linuxwireless.org/download/crda/crda-3.18.tar.xz https://www.kernel.org/pub/software/network/crda/crda-3.18.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
 _md5_=dc4d79ce18af9e4588bc83c843bf7baf
diff --git a/metadata/md5-cache/net-wireless/crda-3.18-r4 b/metadata/md5-cache/net-wireless/crda-3.18-r4
deleted file mode 100644
index 8746abd..0000000
--- a/metadata/md5-cache/net-wireless/crda-3.18-r4
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile install prepare setup test
-DEPEND=!gcrypt? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) ) gcrypt? ( dev-libs/libgcrypt:0= ) dev-libs/libnl:3 net-wireless/wireless-regdb || ( dev-lang/python:3.7 dev-lang/python:3.6 ) || ( ( dev-lang/python:3.7 dev-python/m2crypto[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ( dev-lang/python:3.6 dev-python/m2crypto[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ) virtual/pkgconfig virtual/pkgconfig
-DESCRIPTION=Central Regulatory Domain Agent for wireless networks
-EAPI=6
-HOMEPAGE=https://wireless.wiki.kernel.org/en/developers/regulatory/crda
-IUSE=gcrypt libressl
-KEYWORDS=*
-LICENSE=ISC
-RDEPEND=!gcrypt? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) ) gcrypt? ( dev-libs/libgcrypt:0= ) dev-libs/libnl:3 net-wireless/wireless-regdb
-SLOT=0
-SRC_URI=http://linuxwireless.org/download/crda/crda-3.18.tar.xz https://www.kernel.org/pub/software/network/crda/crda-3.18.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
-_md5_=dc4d79ce18af9e4588bc83c843bf7baf
diff --git a/metadata/md5-cache/net-wireless/crda-3.18-r5 b/metadata/md5-cache/net-wireless/crda-3.18-r5
new file mode 100644
index 0000000..7e4ce85
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/crda-3.18-r5
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install prepare setup test
+DEPEND=!gcrypt? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) ) gcrypt? ( dev-libs/libgcrypt:0= ) dev-libs/libnl:3 net-wireless/wireless-regdb || ( dev-lang/python:3.7 dev-lang/python:3.6 ) || ( ( dev-lang/python:3.7 dev-python/m2crypto[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ( dev-lang/python:3.6 dev-python/m2crypto[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ) virtual/pkgconfig virtual/pkgconfig
+DESCRIPTION=Central Regulatory Domain Agent for wireless networks
+EAPI=6
+HOMEPAGE=https://wireless.wiki.kernel.org/en/developers/regulatory/crda
+IUSE=gcrypt libressl
+KEYWORDS=*
+LICENSE=ISC
+RDEPEND=!gcrypt? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl:0= ) ) gcrypt? ( dev-libs/libgcrypt:0= ) dev-libs/libnl:3 net-wireless/wireless-regdb
+SLOT=0
+SRC_URI=http://linuxwireless.org/download/crda/crda-3.18.tar.xz https://www.kernel.org/pub/software/network/crda/crda-3.18.tar.xz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_md5_=dc4d79ce18af9e4588bc83c843bf7baf
diff --git a/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r16 b/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r16
deleted file mode 100644
index fdc3052..0000000
--- a/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r16
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=dev-libs/libnl:3= dev-libs/openssl:0= net-libs/libpcap:=
-DESCRIPTION=Test package for the hostap project, intended for a VM
-EAPI=7
-HOMEPAGE=https://w1.fi
-IUSE=dbus cros_host cros_workon_tree_be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live
-RDEPEND=dev-libs/libnl:3= dev-libs/openssl:0= net-libs/libpcap:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dbus? ( dev-python/dbus-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pygobject[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] sys-apps/dbus ) dev-python/pycryptodome[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pyrad[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] net-analyzer/wireshark net-wireless/crda python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1248875cc4a156e47e3d89eb8f2849c2
diff --git a/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r23 b/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r23
new file mode 100644
index 0000000..8e32030
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/hostap-test-0.0.1-r23
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=dev-libs/libnl:3= dev-libs/openssl:0= net-libs/libpcap:=
+DESCRIPTION=Test package for the hostap project, intended for a VM
+EAPI=7
+HOMEPAGE=https://w1.fi
+IUSE=dbus asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_74699a9c73ae20b236f9031164def0631151f776 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live
+RDEPEND=dev-libs/libnl:3= dev-libs/openssl:0= net-libs/libpcap:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dbus? ( dev-python/dbus-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pygobject[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] sys-apps/dbus ) dev-python/pycryptodome[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pyrad[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] net-analyzer/wireshark net-wireless/crda python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2b15ac7eb5d7e9b66eae08e271cec484
diff --git a/metadata/md5-cache/net-wireless/hostap-test-9999 b/metadata/md5-cache/net-wireless/hostap-test-9999
index 10b9a70..c6a2132 100644
--- a/metadata/md5-cache/net-wireless/hostap-test-9999
+++ b/metadata/md5-cache/net-wireless/hostap-test-9999
@@ -4,12 +4,12 @@
 DESCRIPTION=Test package for the hostap project, intended for a VM
 EAPI=7
 HOMEPAGE=https://w1.fi
-IUSE=dbus cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7
+IUSE=dbus asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ python_targets_python3_6 python_targets_python3_7
 KEYWORDS=~*
 LICENSE=BSD
 PROPERTIES=live
 RDEPEND=dev-libs/libnl:3= dev-libs/openssl:0= net-libs/libpcap:= python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dbus? ( dev-python/dbus-python[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pygobject[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] sys-apps/dbus ) dev-python/pycryptodome[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/pyrad[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] net-analyzer/wireshark net-wireless/crda python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 ) || ( python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=726e8fb91e02cd1f5cf8648c3baee7f7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=78089c2269b73289dfea55cb4c537c8c
diff --git a/metadata/md5-cache/net-wireless/hostapd-2.9-r138 b/metadata/md5-cache/net-wireless/hostapd-2.9-r138
deleted file mode 100644
index a0788e8..0000000
--- a/metadata/md5-cache/net-wireless/hostapd-2.9-r138
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst setup unpack
-DEPEND=libressl? ( dev-libs/libressl:0= ) !libressl? ( internal-tls? ( dev-libs/libtommath ) !internal-tls? ( dev-libs/openssl:0=[-bindist] ) ) kernel_linux? ( dev-libs/libnl:3 crda? ( net-wireless/crda ) ) netlink? ( net-libs/libnfnetlink ) sqlite? ( >=dev-db/sqlite-3 )
-DESCRIPTION=IEEE 802.11 wireless LAN Host AP daemon
-EAPI=6
-HOMEPAGE=http://w1.fi
-IUSE=internal-tls ipv6 libressl logwatch netlink sqlite +suiteb +wps +crda cros_host cros_workon_tree_be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe savedconfig
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live
-RDEPEND=libressl? ( dev-libs/libressl:0= ) !libressl? ( internal-tls? ( dev-libs/libtommath ) !internal-tls? ( dev-libs/openssl:0=[-bindist] ) ) kernel_linux? ( dev-libs/libnl:3 crda? ( net-wireless/crda ) ) netlink? ( net-libs/libnfnetlink ) sqlite? ( >=dev-db/sqlite-3 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	portability	536c5e70c5fb252ed3b769e04aa3f05b	savedconfig	973a6df1a0949eba28a185eac79de815	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=40a4e98a0c91b0a21e704dddffcddfe1
diff --git a/metadata/md5-cache/net-wireless/hostapd-2.9-r145 b/metadata/md5-cache/net-wireless/hostapd-2.9-r145
new file mode 100644
index 0000000..9e77f4a
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/hostapd-2.9-r145
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install postinst setup unpack
+DEPEND=libressl? ( dev-libs/libressl:0= ) !libressl? ( internal-tls? ( dev-libs/libtommath ) !internal-tls? ( dev-libs/openssl:0=[-bindist] ) ) kernel_linux? ( dev-libs/libnl:3 crda? ( net-wireless/crda ) ) netlink? ( net-libs/libnfnetlink ) sqlite? ( >=dev-db/sqlite-3 )
+DESCRIPTION=IEEE 802.11 wireless LAN Host AP daemon
+EAPI=6
+HOMEPAGE=http://w1.fi
+IUSE=internal-tls ipv6 libressl logwatch netlink sqlite +suiteb +wps +crda cros_host cros_workon_tree_74699a9c73ae20b236f9031164def0631151f776 savedconfig
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live
+RDEPEND=libressl? ( dev-libs/libressl:0= ) !libressl? ( internal-tls? ( dev-libs/libtommath ) !internal-tls? ( dev-libs/openssl:0=[-bindist] ) ) kernel_linux? ( dev-libs/libnl:3 crda? ( net-wireless/crda ) ) netlink? ( net-libs/libnfnetlink ) sqlite? ( >=dev-db/sqlite-3 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	portability	536c5e70c5fb252ed3b769e04aa3f05b	savedconfig	973a6df1a0949eba28a185eac79de815	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=90664d78583c71b2ac579f74a24bdf56
diff --git a/metadata/md5-cache/net-wireless/hostapd-9999 b/metadata/md5-cache/net-wireless/hostapd-9999
index 7a38cbd..4f45583 100644
--- a/metadata/md5-cache/net-wireless/hostapd-9999
+++ b/metadata/md5-cache/net-wireless/hostapd-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=libressl? ( dev-libs/libressl:0= ) !libressl? ( internal-tls? ( dev-libs/libtommath ) !internal-tls? ( dev-libs/openssl:0=[-bindist] ) ) kernel_linux? ( dev-libs/libnl:3 crda? ( net-wireless/crda ) ) netlink? ( net-libs/libnfnetlink ) sqlite? ( >=dev-db/sqlite-3 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	portability	536c5e70c5fb252ed3b769e04aa3f05b	savedconfig	973a6df1a0949eba28a185eac79de815	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9ab43879966a4df3c4efe4ea266b5af3
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	portability	536c5e70c5fb252ed3b769e04aa3f05b	savedconfig	973a6df1a0949eba28a185eac79de815	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c76fe822ad03145b8c054a2e25a5a99b
diff --git a/metadata/md5-cache/net-wireless/marvell_sd8787-14.64.2.47-r60 b/metadata/md5-cache/net-wireless/marvell_sd8787-14.64.2.47-r60
index f7c9e42..25dba3c8 100644
--- a/metadata/md5-cache/net-wireless/marvell_sd8787-14.64.2.47-r60
+++ b/metadata/md5-cache/net-wireless/marvell_sd8787-14.64.2.47-r60
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RESTRICT=binchecks strip test
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4c07553b942b2219cad62ac6c2c61606
diff --git a/metadata/md5-cache/net-wireless/marvell_sd8787-9999 b/metadata/md5-cache/net-wireless/marvell_sd8787-9999
index c6cc17b..967e6db 100644
--- a/metadata/md5-cache/net-wireless/marvell_sd8787-9999
+++ b/metadata/md5-cache/net-wireless/marvell_sd8787-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RESTRICT=binchecks strip test
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=51f0967d3fbe6feb73b362e6a80c2c5b
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r30 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r30
deleted file mode 100644
index aacf334..0000000
--- a/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r30
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst preinst prepare setup unpack
-DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtwidgets:5 dev-qt/qtsvg:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) virtual/pkgconfig virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/hostap
-IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax cros_host cros_workon_tree_e7bbf2103885cc82892cbe36273a8e59e065ae0e
-KEYWORDS=*
-LICENSE=|| ( GPL-2 BSD )
-PROPERTIES=live
-RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtwidgets:5 dev-qt/qtsvg:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) !net-wireless/wpa_supplicant selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
-REQUIRED_USE=fasteap? ( !gnutls !ssl ) smartcard? ( ssl )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	6f4ff01a55830f6d86647dc56dfaf3a7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=e83a6ac646aff1e5b2b500e2518ff9b3
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r35 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r35
new file mode 100644
index 0000000..57c58c5
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-2.8-r35
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure info install postinst preinst prepare setup unpack
+DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtwidgets:5 dev-qt/qtsvg:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) virtual/pkgconfig virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/hostap
+IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_0406e55a76c2afc3942a37c110ad9077087d18bd
+KEYWORDS=*
+LICENSE=|| ( GPL-2 BSD )
+PROPERTIES=live
+RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtwidgets:5 dev-qt/qtsvg:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) !net-wireless/wpa_supplicant selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
+REQUIRED_USE=fasteap? ( !gnutls !ssl ) smartcard? ( ssl )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	bdf97e69a34b864d6d545f4ec3143ff7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=dc04a33b5970164cbcb42cc3abbfcc17
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-9999 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-9999
index 3d631d2..c84b989 100644
--- a/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-9999
+++ b/metadata/md5-cache/net-wireless/wpa_supplicant-2_8-9999
@@ -3,12 +3,12 @@
 DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
 EAPI=6
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/hostap
-IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax cros_host cros_workon_tree_
+IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=|| ( GPL-2 BSD )
 PROPERTIES=live
 RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtwidgets:5 dev-qt/qtsvg:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) !net-wireless/wpa_supplicant selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
 REQUIRED_USE=fasteap? ( !gnutls !ssl ) smartcard? ( ssl )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	6f4ff01a55830f6d86647dc56dfaf3a7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=ac48bb3ab1ea8606377a33861fa5908d
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	bdf97e69a34b864d6d545f4ec3143ff7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=95fdc0abd0f6a323f18d727613cee882
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r1 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r1
deleted file mode 100644
index 359763f..0000000
--- a/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r1
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install postinst preinst prepare setup unpack
-DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
-EAPI=7
-HOMEPAGE=https://w1.fi/wpa_supplicant/
-IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax cros_host cros_workon_tree_be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe
-KEYWORDS=*
-LICENSE=|| ( GPL-2 BSD )
-PROPERTIES=live
-RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) !net-wireless/wpa_supplicant !net-wireless/wpa_supplicant-2_8 selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
-REQUIRED_USE=fasteap? ( !gnutls !ssl ) smartcard? ( ssl )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	6f4ff01a55830f6d86647dc56dfaf3a7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=798f1bd389d406f8ee208138fe85f982
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r10 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r10
new file mode 100644
index 0000000..12f9628
--- /dev/null
+++ b/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-2.9-r10
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install postinst preinst prepare setup unpack
+DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) !libressl? ( dev-libs/openssl:0=[bindist=] ) libressl? ( dev-libs/libressl:0= ) smartcard? ( dev-libs/engine_pkcs11 ) virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
+EAPI=7
+HOMEPAGE=https://w1.fi/wpa_supplicant/
+IUSE=ap bindist dbus debug eap-sim +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_74699a9c73ae20b236f9031164def0631151f776
+KEYWORDS=*
+LICENSE=|| ( GPL-2 BSD )
+PROPERTIES=live
+RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) !libressl? ( dev-libs/openssl:0=[bindist=] ) libressl? ( dev-libs/libressl:0= ) smartcard? ( dev-libs/engine_pkcs11 ) !net-wireless/wpa_supplicant !net-wireless/wpa_supplicant-2_8 selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	bdf97e69a34b864d6d545f4ec3143ff7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=decc0b1bcc3a2f0470d3ff7b915a566f
diff --git a/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-9999 b/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-9999
index 02cd530..cf2b9cc 100644
--- a/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-9999
+++ b/metadata/md5-cache/net-wireless/wpa_supplicant-2_9-9999
@@ -1,15 +1,14 @@
 BDEPEND=dev-vcs/git virtual/pkgconfig
 DEFINED_PHASES=compile configure info install postinst preinst prepare setup unpack
-DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) virtual/pkgconfig sys-apps/baselayout
+DEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) !libressl? ( dev-libs/openssl:0=[bindist=] ) libressl? ( dev-libs/libressl:0= ) smartcard? ( dev-libs/engine_pkcs11 ) virtual/pkgconfig sys-apps/baselayout
 DESCRIPTION=IEEE 802.1X/WPA supplicant for secure wireless transfers
 EAPI=7
 HOMEPAGE=https://w1.fi/wpa_supplicant/
-IUSE=ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax cros_host cros_workon_tree_
+IUSE=ap bindist dbus debug eap-sim +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=|| ( GPL-2 BSD )
 PROPERTIES=live
-RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) ssl? ( !libressl? ( dev-libs/openssl:0= ) libressl? ( dev-libs/libressl ) ) smartcard? ( dev-libs/engine_pkcs11 ) !ssl? ( gnutls? ( net-libs/gnutls dev-libs/libgcrypt ) !gnutls? ( dev-libs/libtommath ) ) !net-wireless/wpa_supplicant !net-wireless/wpa_supplicant-2_8 selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
-REQUIRED_USE=fasteap? ( !gnutls !ssl ) smartcard? ( ssl )
+RDEPEND=chromeos-base/minijail dbus? ( sys-apps/dbus ) kernel_linux? ( dev-libs/libnl:3 net-wireless/crda ) !kernel_linux? ( net-libs/libpcap ) qt5? ( dev-qt/qtcore:5 dev-qt/qtgui:5 dev-qt/qtsvg:5 dev-qt/qtwidgets:5 ) readline? ( sys-libs/ncurses:0 sys-libs/readline:0 ) !libressl? ( dev-libs/openssl:0=[bindist=] ) libressl? ( dev-libs/libressl:0= ) smartcard? ( dev-libs/engine_pkcs11 ) !net-wireless/wpa_supplicant !net-wireless/wpa_supplicant-2_8 selinux? ( sec-policy/selinux-networkmanager ) sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	6f4ff01a55830f6d86647dc56dfaf3a7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
-_md5_=0abea4126757391e0f1c659f5f3bb745
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	qmake-utils	bdf97e69a34b864d6d545f4ec3143ff7	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_md5_=bca6c226bfffc5b6355efae3b1b5390e
diff --git a/metadata/md5-cache/sci-electronics/sigrok-cli-0.5.0-r17 b/metadata/md5-cache/sci-electronics/sigrok-cli-0.5.0-r17
index 126a9d4..0801d6cc 100644
--- a/metadata/md5-cache/sci-electronics/sigrok-cli-0.5.0-r17
+++ b/metadata/md5-cache/sci-electronics/sigrok-cli-0.5.0-r17
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure info prepare setup unpack
-DEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Command-line client for the sigrok logic analyzer software
 EAPI=5
 HOMEPAGE=http://sigrok.org/wiki/Sigrok-cli
-IUSE=+decode cros_host cros_workon_tree_742697db0bb207c6716d7484278ff91633c5f8ce +python_targets_python3_6 +python_single_target_python3_6
+IUSE=+decode cros_host cros_workon_tree_742697db0bb207c6716d7484278ff91633c5f8ce +python_single_target_python3_6
 KEYWORDS=*
 LICENSE=GPL-3
 PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] )
-REQUIRED_USE=decode? ( ^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
+RDEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) )
+REQUIRED_USE=decode? ( ^^ ( python_single_target_python3_6 ) )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0ace0df1510b176b35ebbbeacba2bc78
diff --git a/metadata/md5-cache/sci-electronics/sigrok-cli-9999 b/metadata/md5-cache/sci-electronics/sigrok-cli-9999
index a84a48c..cf8d121 100644
--- a/metadata/md5-cache/sci-electronics/sigrok-cli-9999
+++ b/metadata/md5-cache/sci-electronics/sigrok-cli-9999
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure info prepare setup unpack
-DEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Command-line client for the sigrok logic analyzer software
 EAPI=5
 HOMEPAGE=http://sigrok.org/wiki/Sigrok-cli
-IUSE=+decode cros_host cros_workon_tree_ +python_targets_python3_6 +python_single_target_python3_6
+IUSE=+decode cros_host cros_workon_tree_ +python_single_target_python3_6
 KEYWORDS=~*
 LICENSE=GPL-3
 PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] )
-REQUIRED_USE=decode? ( ^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
+RDEPEND=>=dev-libs/glib-2.28.0 >=sci-libs/libsigrok-0.3.0 decode? ( >=sci-libs/libsigrokdecode-0.3.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) )
+REQUIRED_USE=decode? ( ^^ ( python_single_target_python3_6 ) )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3dd3de327fd977ff6651953a5db4be75
diff --git a/metadata/md5-cache/sci-libs/libsigrok-0.3.0-r68 b/metadata/md5-cache/sci-libs/libsigrok-0.3.0-r68
index 0b00320..d166d31 100644
--- a/metadata/md5-cache/sci-libs/libsigrok-0.3.0-r68
+++ b/metadata/md5-cache/sci-libs/libsigrok-0.3.0-r68
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!static-libs? ( >=dev-libs/glib-2.32.0 >=dev-libs/libzip-0.8 ftdi? ( >=dev-embedded/libftdi-0.16 ) serial? ( dev-libs/libserialport ) usb? ( virtual/libusb:1 ) ) static-libs? ( >=dev-libs/glib-2.32.0[static-libs(+)] >=dev-libs/libzip-0.8[static-libs(+)] ftdi? ( >=dev-embedded/libftdi-0.16[static-libs(+)] ) serial? ( dev-libs/libserialport[static-libs(+)] ) usb? ( virtual/libusb:1[static-libs(+)] ) )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e79b160e9b5913dde82774cc14c8a0e2
diff --git a/metadata/md5-cache/sci-libs/libsigrok-9999 b/metadata/md5-cache/sci-libs/libsigrok-9999
index 7c0f7ae..4c640f7 100644
--- a/metadata/md5-cache/sci-libs/libsigrok-9999
+++ b/metadata/md5-cache/sci-libs/libsigrok-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=!static-libs? ( >=dev-libs/glib-2.32.0 >=dev-libs/libzip-0.8 ftdi? ( >=dev-embedded/libftdi-0.16 ) serial? ( dev-libs/libserialport ) usb? ( virtual/libusb:1 ) ) static-libs? ( >=dev-libs/glib-2.32.0[static-libs(+)] >=dev-libs/libzip-0.8[static-libs(+)] ftdi? ( >=dev-embedded/libftdi-0.16[static-libs(+)] ) serial? ( dev-libs/libserialport[static-libs(+)] ) usb? ( virtual/libusb:1[static-libs(+)] ) )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f83fa6896a895d8c697f016b0827a02f
diff --git a/metadata/md5-cache/sci-libs/libsigrokdecode-0.3.0-r21 b/metadata/md5-cache/sci-libs/libsigrokdecode-0.3.0-r21
index bd9013c..455459b 100644
--- a/metadata/md5-cache/sci-libs/libsigrokdecode-0.3.0-r21
+++ b/metadata/md5-cache/sci-libs/libsigrokdecode-0.3.0-r21
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure info install prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=provide (streaming) protocol decoding functionality
 EAPI=5
 HOMEPAGE=http://sigrok.org/wiki/Libsigrokdecode
-IUSE=static-libs cros_host cros_workon_tree_be143fb31be0ac7b9be8d1ae80513ea85a160384 +python_targets_python3_6 +python_single_target_python3_6
+IUSE=static-libs cros_host cros_workon_tree_be143fb31be0ac7b9be8d1ae80513ea85a160384 +python_single_target_python3_6
 KEYWORDS=*
 LICENSE=GPL-3
 PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?]
-REQUIRED_USE=^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 )
+RDEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] )
+REQUIRED_USE=^^ ( python_single_target_python3_6 )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8cf327046e9dbc351406ec08c547155a
diff --git a/metadata/md5-cache/sci-libs/libsigrokdecode-9999 b/metadata/md5-cache/sci-libs/libsigrokdecode-9999
index 783bff1..b677b03 100644
--- a/metadata/md5-cache/sci-libs/libsigrokdecode-9999
+++ b/metadata/md5-cache/sci-libs/libsigrokdecode-9999
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure info install prepare setup test unpack
-DEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=provide (streaming) protocol decoding functionality
 EAPI=5
 HOMEPAGE=http://sigrok.org/wiki/Libsigrokdecode
-IUSE=static-libs cros_host cros_workon_tree_ +python_targets_python3_6 +python_single_target_python3_6
+IUSE=static-libs cros_host cros_workon_tree_ +python_single_target_python3_6
 KEYWORDS=~*
 LICENSE=GPL-3
 PROPERTIES=live
-RDEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?]
-REQUIRED_USE=^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 )
+RDEPEND=>=dev-libs/glib-2.24.0 python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] )
+REQUIRED_USE=^^ ( python_single_target_python3_6 )
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=73d40369ee5e89fd4a7327d6d13ab4b4
diff --git a/metadata/md5-cache/sci-libs/tensorflow-1.14.0 b/metadata/md5-cache/sci-libs/tensorflow-1.14.0
index faf40df..37f9067 100644
--- a/metadata/md5-cache/sci-libs/tensorflow-1.14.0
+++ b/metadata/md5-cache/sci-libs/tensorflow-1.14.0
@@ -1,7 +1,8 @@
+BDEPEND=app-arch/unzip >=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0 || ( =dev-util/bazel-0.24* =dev-util/bazel-0.26* =dev-util/bazel-0.27* ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] ) !python? ( dev-lang/python ) python? ( dev-lang/swig dev-python/grpcio-tools dev-python/mock dev-python/cython ) >=dev-util/bazel-0.20
 DEFINED_PHASES=compile configure install prepare setup unpack
 DEPEND=>=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0:= !minimal? ( app-arch/snappy dev-db/lmdb dev-db/sqlite dev-libs/icu >=dev-libs/jsoncpp-1.8.4 dev-libs/libpcre dev-libs/nsync dev-libs/openssl:0= >=dev-libs/re2-0.2018.04.01 media-libs/giflib media-libs/libjpeg-turbo media-libs/libpng:0 >=net-libs/grpc-1.16.0 net-misc/curl sys-libs/zlib >=sys-apps/hwloc-2 ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/gast[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/numpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/google-pasta[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.6.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/grpcio[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.9.0 >=sci-libs/keras-applications-1.0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.0.5[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/python-enum34[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) python? ( dev-python/mock )
 DESCRIPTION=Computation framework using data flow graphs for scalable machine learning
-EAPI=6
+EAPI=7
 HOMEPAGE=https://www.tensorflow.org/
 IUSE=cuda mpi minimal +python label_image benchmark_model cpu_flags_x86_sse cpu_flags_x86_sse2 cpu_flags_x86_sse3 cpu_flags_x86_sse4_1 cpu_flags_x86_sse4_2 cpu_flags_x86_avx cpu_flags_x86_avx2 cpu_flags_x86_fma3 cpu_flags_x86_fma4 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
 KEYWORDS=*
@@ -11,5 +12,5 @@
 REQUIRED_USE=python? ( || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 ) !minimal )
 SLOT=0
 SRC_URI=https://github.com/tensorflow/tensorflow/archive/v1.14.0.tar.gz -> tensorflow-1.14.0.tar.gz http://www.kurims.kyoto-u.ac.jp/~ooura/fft.tgz -> oourafft-20061228.tgz https://bitbucket.org/eigen/eigen/get/a0d250e79c79.tar.gz -> eigen-a0d250e79c79.tar.gz https://github.com/abseil/abseil-cpp/archive/daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz -> abseil-cpp-daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz https://github.com/bazelbuild/bazel-skylib/archive/0.6.0.tar.gz -> bazel-skylib-0.6.0.tar.gz https://github.com/bazelbuild/rules_closure/archive/cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz -> bazelbuild-rules_closure-cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz https://github.com/bazelbuild/rules_docker/archive/b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz -> rules_docker-b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz https://github.com/bazelbuild/rules_swift/releases/download/0.9.0/rules_swift.0.9.0.tar.gz -> bazelbuild-rules_swift.0.9.0.tar.gz https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz https://github.com/google/gemmlowp/archive/12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip -> gemmlowp-12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz https://github.com/nlopezgi/bazel-toolchains/archive/94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz -> bazel-toolchains-94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz cuda? ( https://github.com/nvidia/nccl/archive/f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz -> nvidia-nccl-f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip ) python? ( http://mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.14.0-python-license.rst.txt https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz )
-_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	a30c9c79632d1d8ccd9e048eb3af6396	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=c1aef866d5f8d425629261b258578308
+_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	25596f146e3e31b4732609dc5dcbb8c6	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7799a5c27dbdbdc583ccfc1326916e8d
diff --git a/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r11 b/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r11
deleted file mode 100644
index faf40df..0000000
--- a/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r11
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup unpack
-DEPEND=>=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0:= !minimal? ( app-arch/snappy dev-db/lmdb dev-db/sqlite dev-libs/icu >=dev-libs/jsoncpp-1.8.4 dev-libs/libpcre dev-libs/nsync dev-libs/openssl:0= >=dev-libs/re2-0.2018.04.01 media-libs/giflib media-libs/libjpeg-turbo media-libs/libpng:0 >=net-libs/grpc-1.16.0 net-misc/curl sys-libs/zlib >=sys-apps/hwloc-2 ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/gast[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/numpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/google-pasta[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.6.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/grpcio[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.9.0 >=sci-libs/keras-applications-1.0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.0.5[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/python-enum34[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) python? ( dev-python/mock )
-DESCRIPTION=Computation framework using data flow graphs for scalable machine learning
-EAPI=6
-HOMEPAGE=https://www.tensorflow.org/
-IUSE=cuda mpi minimal +python label_image benchmark_model cpu_flags_x86_sse cpu_flags_x86_sse2 cpu_flags_x86_sse3 cpu_flags_x86_sse4_1 cpu_flags_x86_sse4_2 cpu_flags_x86_avx cpu_flags_x86_avx2 cpu_flags_x86_fma3 cpu_flags_x86_fma4 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
-KEYWORDS=*
-LICENSE=Apache-2.0
-PDEPEND=python? ( >=sci-libs/tensorflow-estimator-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
-RDEPEND=>=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0:= !minimal? ( app-arch/snappy dev-db/lmdb dev-db/sqlite dev-libs/icu >=dev-libs/jsoncpp-1.8.4 dev-libs/libpcre dev-libs/nsync dev-libs/openssl:0= >=dev-libs/re2-0.2018.04.01 media-libs/giflib media-libs/libjpeg-turbo media-libs/libpng:0 >=net-libs/grpc-1.16.0 net-misc/curl sys-libs/zlib >=sys-apps/hwloc-2 ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/gast[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/numpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/google-pasta[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.6.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/grpcio[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.9.0 >=sci-libs/keras-applications-1.0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.0.5[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/python-enum34[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
-REQUIRED_USE=python? ( || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 ) !minimal )
-SLOT=0
-SRC_URI=https://github.com/tensorflow/tensorflow/archive/v1.14.0.tar.gz -> tensorflow-1.14.0.tar.gz http://www.kurims.kyoto-u.ac.jp/~ooura/fft.tgz -> oourafft-20061228.tgz https://bitbucket.org/eigen/eigen/get/a0d250e79c79.tar.gz -> eigen-a0d250e79c79.tar.gz https://github.com/abseil/abseil-cpp/archive/daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz -> abseil-cpp-daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz https://github.com/bazelbuild/bazel-skylib/archive/0.6.0.tar.gz -> bazel-skylib-0.6.0.tar.gz https://github.com/bazelbuild/rules_closure/archive/cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz -> bazelbuild-rules_closure-cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz https://github.com/bazelbuild/rules_docker/archive/b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz -> rules_docker-b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz https://github.com/bazelbuild/rules_swift/releases/download/0.9.0/rules_swift.0.9.0.tar.gz -> bazelbuild-rules_swift.0.9.0.tar.gz https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz https://github.com/google/gemmlowp/archive/12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip -> gemmlowp-12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz https://github.com/nlopezgi/bazel-toolchains/archive/94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz -> bazel-toolchains-94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz cuda? ( https://github.com/nvidia/nccl/archive/f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz -> nvidia-nccl-f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip ) python? ( http://mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.14.0-python-license.rst.txt https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz )
-_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	a30c9c79632d1d8ccd9e048eb3af6396	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=c1aef866d5f8d425629261b258578308
diff --git a/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r13 b/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r13
new file mode 100644
index 0000000..37f9067
--- /dev/null
+++ b/metadata/md5-cache/sci-libs/tensorflow-1.14.0-r13
@@ -0,0 +1,16 @@
+BDEPEND=app-arch/unzip >=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0 || ( =dev-util/bazel-0.24* =dev-util/bazel-0.26* =dev-util/bazel-0.27* ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] ) !python? ( dev-lang/python ) python? ( dev-lang/swig dev-python/grpcio-tools dev-python/mock dev-python/cython ) >=dev-util/bazel-0.20
+DEFINED_PHASES=compile configure install prepare setup unpack
+DEPEND=>=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0:= !minimal? ( app-arch/snappy dev-db/lmdb dev-db/sqlite dev-libs/icu >=dev-libs/jsoncpp-1.8.4 dev-libs/libpcre dev-libs/nsync dev-libs/openssl:0= >=dev-libs/re2-0.2018.04.01 media-libs/giflib media-libs/libjpeg-turbo media-libs/libpng:0 >=net-libs/grpc-1.16.0 net-misc/curl sys-libs/zlib >=sys-apps/hwloc-2 ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/gast[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/numpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/google-pasta[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.6.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/grpcio[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.9.0 >=sci-libs/keras-applications-1.0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.0.5[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/python-enum34[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) python? ( dev-python/mock )
+DESCRIPTION=Computation framework using data flow graphs for scalable machine learning
+EAPI=7
+HOMEPAGE=https://www.tensorflow.org/
+IUSE=cuda mpi minimal +python label_image benchmark_model cpu_flags_x86_sse cpu_flags_x86_sse2 cpu_flags_x86_sse3 cpu_flags_x86_sse4_1 cpu_flags_x86_sse4_2 cpu_flags_x86_avx cpu_flags_x86_avx2 cpu_flags_x86_fma3 cpu_flags_x86_fma4 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=Apache-2.0
+PDEPEND=python? ( >=sci-libs/tensorflow-estimator-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+RDEPEND=>=dev-libs/flatbuffers-1.8.0 >=dev-libs/protobuf-3.6.0:= !minimal? ( app-arch/snappy dev-db/lmdb dev-db/sqlite dev-libs/icu >=dev-libs/jsoncpp-1.8.4 dev-libs/libpcre dev-libs/nsync dev-libs/openssl:0= >=dev-libs/re2-0.2018.04.01 media-libs/giflib media-libs/libjpeg-turbo media-libs/libpng:0 >=net-libs/grpc-1.16.0 net-misc/curl sys-libs/zlib >=sys-apps/hwloc-2 ) cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/gast[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/numpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/google-pasta[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.6.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/grpcio[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.9.0 >=sci-libs/keras-applications-1.0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.0.5[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-1.13.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/python-enum34[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+REQUIRED_USE=python? ( || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 ) !minimal )
+SLOT=0
+SRC_URI=https://github.com/tensorflow/tensorflow/archive/v1.14.0.tar.gz -> tensorflow-1.14.0.tar.gz http://www.kurims.kyoto-u.ac.jp/~ooura/fft.tgz -> oourafft-20061228.tgz https://bitbucket.org/eigen/eigen/get/a0d250e79c79.tar.gz -> eigen-a0d250e79c79.tar.gz https://github.com/abseil/abseil-cpp/archive/daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz -> abseil-cpp-daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz https://github.com/bazelbuild/bazel-skylib/archive/0.6.0.tar.gz -> bazel-skylib-0.6.0.tar.gz https://github.com/bazelbuild/rules_closure/archive/cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz -> bazelbuild-rules_closure-cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz https://github.com/bazelbuild/rules_docker/archive/b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz -> rules_docker-b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz https://github.com/bazelbuild/rules_swift/releases/download/0.9.0/rules_swift.0.9.0.tar.gz -> bazelbuild-rules_swift.0.9.0.tar.gz https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz https://github.com/google/gemmlowp/archive/12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip -> gemmlowp-12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz https://github.com/nlopezgi/bazel-toolchains/archive/94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz -> bazel-toolchains-94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz cuda? ( https://github.com/nvidia/nccl/archive/f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz -> nvidia-nccl-f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip ) python? ( http://mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.14.0-python-license.rst.txt https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz )
+_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	25596f146e3e31b4732609dc5dcbb8c6	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7799a5c27dbdbdc583ccfc1326916e8d
diff --git a/metadata/md5-cache/sci-libs/tensorflow-2.3.0 b/metadata/md5-cache/sci-libs/tensorflow-2.3.0
new file mode 100644
index 0000000..b2a0e12
--- /dev/null
+++ b/metadata/md5-cache/sci-libs/tensorflow-2.3.0
@@ -0,0 +1,16 @@
+BDEPEND=!minimal? ( =dev-util/bazel-2.0* ) app-arch/unzip dev-cpp/absl >=dev-libs/protobuf-3.8.0 dev-java/java-config dev-lang/swig cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] ) !python? ( dev-lang/python ) python? ( dev-python/cython dev-python/mock >=dev-python/grpcio-tools-1.28 ) >=dev-util/bazel-0.20
+DEFINED_PHASES=compile configure install prepare setup unpack
+DEPEND=>=dev-libs/flatbuffers-1.12.0 >=dev-libs/protobuf-3.8.0:= !minimal? ( app-arch/snappy dev-db/sqlite dev-libs/icu dev-libs/double-conversion >=dev-libs/jsoncpp-1.9.2 dev-db/lmdb dev-libs/nsync >=net-libs/grpc-1.28 media-libs/giflib >=sys-apps/hwloc-2 ) dev-libs/libpcre dev-libs/openssl:0= >=dev-libs/re2-0.2019.06.01 media-libs/libjpeg-turbo media-libs/libpng:0 net-misc/curl sys-libs/zlib cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/astunparse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/gast-0.3.3[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/numpy-1.16[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/google-pasta-0.1.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/opt-einsum[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.8.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/grpcio-1.28[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.10.0 >=sci-libs/keras-applications-1.0.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.1.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) python? ( dev-python/mock dev-python/setuptools )
+DESCRIPTION=Computation framework using data flow graphs for scalable machine learning
+EAPI=7
+HOMEPAGE=https://www.tensorflow.org/
+IUSE=cuda mpi minimal +python xla label_image benchmark_model python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=Apache-2.0
+PDEPEND=python? ( >=sci-libs/tensorflow-estimator-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+RDEPEND=>=dev-libs/flatbuffers-1.12.0 >=dev-libs/protobuf-3.8.0:= !minimal? ( app-arch/snappy dev-db/sqlite dev-libs/icu dev-libs/double-conversion >=dev-libs/jsoncpp-1.9.2 dev-db/lmdb dev-libs/nsync >=net-libs/grpc-1.28 media-libs/giflib >=sys-apps/hwloc-2 ) dev-libs/libpcre dev-libs/openssl:0= >=dev-libs/re2-0.2019.06.01 media-libs/libjpeg-turbo media-libs/libpng:0 net-misc/curl sys-libs/zlib cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/astunparse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/gast-0.3.3[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/numpy-1.16[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/google-pasta-0.1.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/opt-einsum[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.8.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/grpcio-1.28[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.10.0 >=sci-libs/keras-applications-1.0.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.1.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+REQUIRED_USE=python? ( || ( python_targets_python3_6 python_targets_python3_7 ) )
+SLOT=0
+SRC_URI=https://github.com/tensorflow/tensorflow/archive/v2.3.0.tar.gz -> tensorflow-2.3.0.tar.gz https://github.com/petewarden/OouraFFT/archive/v1.0.tar.gz -> OouraFFT-1.0.tar.gz https://gitlab.com/libeigen/eigen/-/archive/386d809bde475c65b7940f290efe80e6a05878c4/eigen-386d809bde475c65b7940f290efe80e6a05878c4.tar.gz https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz -> abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz https://github.com/bazelbuild/bazel/releases/download/2.2.0/bazel-2.0.0-dist.zip https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip -> bazelbuild-rules_android-0.1.1.zip https://github.com/bazelbuild/rules_apple/archive/5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz -> bazelbuild-rules_apple-5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz https://github.com/bazelbuild/apple_support/archive/501b4afb27745c4813a88ffa28acd901408014e4.tar.gz -> bazelbuild-apple_support-501b4afb27745c4813a88ffa28acd901408014e4.tar.gz https://github.com/bazelbuild/bazel-toolchains/archive/92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz -> bazel-toolchains-92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz https://github.com/bazelbuild/rules_cc/archive/01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip -> bazelbuild-rules_cc-01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz -> bazelbuild-rules_closure-308b05b2419edb5c8ee0471b67a40403df940149.tar.gz https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip -> bazelbuild-rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip https://github.com/bazelbuild/rules_python/releases/download/0.0.1/rules_python-0.0.1.tar.gz -> bazelbuild-rules_python-0.0.1.tar.gz https://github.com/bazelbuild/rules_swift/archive/3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz -> bazelbuild-rules_swift-3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz https://github.com/dmlc/dlpack/archive/3efc489b55385936531a06ff83425b719387ec63.tar.gz -> dlpack-3efc489b55385936531a06ff83425b719387ec63.tar.gz https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz https://github.com/google/gemmlowp/archive/fda83bdc38b118cc6b56753bd540caa49e570745.zip -> gemmlowp-fda83bdc38b118cc6b56753bd540caa49e570745.zip https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz https://github.com/google/re2/archive/506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz -> re2-506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz https://github.com/google/ruy/archive/34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip -> ruy-34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip https://github.com/google/XNNPACK/archive/8b283aa30a3186c6e640aed520543e9c067132d2.zip -> XNNPACK-8b283aa30a3186c6e640aed520543e9c067132d2.zip https://github.com/googleapis/googleapis/archive/541b1ded4abadcc38e8178680b0677f65594ea6f.zip -> googleapis-541b1ded4abadcc38e8178680b0677f65594ea6f.zip https://github.com/joe-kuo/sobol_data/archive/835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz -> sobol_data-835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz https://github.com/llvm/llvm-project/archive/387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz -> llvm-387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz https://github.com/mborgerding/kissfft/archive/36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz -> kissfft-36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz https://github.com/pytorch/cpuinfo/archive/6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip -> cpuinfo-6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip https://github.com/pytorch/cpuinfo/archive/d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz -> cpuinfo-d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz https://github.com/Maratyszcza/FP16/archive/4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip -> FP16-4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip https://github.com/Maratyszcza/FXdiv/archive/b408327ac2a15ec3e43352421954f5b1967701d1.zip -> FXdiv-b408327ac2a15ec3e43352421954f5b1967701d1.zip https://github.com/Maratyszcza/pthreadpool/archive/029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip -> pthreadpool-029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip https://github.com/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.zip -> psimd-072586a71b55b7f8c584153d223e95687148a900.zip cuda? ( https://github.com/nvidia/nccl/archive/3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz -> nvidia-nccl-3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip ) python? ( https://storage.googleapis.com/mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.15.0-python-license.rst.txt https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz )
+_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	25596f146e3e31b4732609dc5dcbb8c6	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1710d27fee70f2025ba9892e97b1d682
diff --git a/metadata/md5-cache/sci-libs/tensorflow-2.3.0-r1 b/metadata/md5-cache/sci-libs/tensorflow-2.3.0-r1
new file mode 100644
index 0000000..b2a0e12
--- /dev/null
+++ b/metadata/md5-cache/sci-libs/tensorflow-2.3.0-r1
@@ -0,0 +1,16 @@
+BDEPEND=!minimal? ( =dev-util/bazel-2.0* ) app-arch/unzip dev-cpp/absl >=dev-libs/protobuf-3.8.0 dev-java/java-config dev-lang/swig cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] ) !python? ( dev-lang/python ) python? ( dev-python/cython dev-python/mock >=dev-python/grpcio-tools-1.28 ) >=dev-util/bazel-0.20
+DEFINED_PHASES=compile configure install prepare setup unpack
+DEPEND=>=dev-libs/flatbuffers-1.12.0 >=dev-libs/protobuf-3.8.0:= !minimal? ( app-arch/snappy dev-db/sqlite dev-libs/icu dev-libs/double-conversion >=dev-libs/jsoncpp-1.9.2 dev-db/lmdb dev-libs/nsync >=net-libs/grpc-1.28 media-libs/giflib >=sys-apps/hwloc-2 ) dev-libs/libpcre dev-libs/openssl:0= >=dev-libs/re2-0.2019.06.01 media-libs/libjpeg-turbo media-libs/libpng:0 net-misc/curl sys-libs/zlib cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/astunparse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/gast-0.3.3[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/numpy-1.16[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/google-pasta-0.1.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/opt-einsum[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.8.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/grpcio-1.28[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.10.0 >=sci-libs/keras-applications-1.0.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.1.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) python? ( dev-python/mock dev-python/setuptools )
+DESCRIPTION=Computation framework using data flow graphs for scalable machine learning
+EAPI=7
+HOMEPAGE=https://www.tensorflow.org/
+IUSE=cuda mpi minimal +python xla label_image benchmark_model python_targets_python3_6 python_targets_python3_7
+KEYWORDS=*
+LICENSE=Apache-2.0
+PDEPEND=python? ( >=sci-libs/tensorflow-estimator-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+RDEPEND=>=dev-libs/flatbuffers-1.12.0 >=dev-libs/protobuf-3.8.0:= !minimal? ( app-arch/snappy dev-db/sqlite dev-libs/icu dev-libs/double-conversion >=dev-libs/jsoncpp-1.9.2 dev-db/lmdb dev-libs/nsync >=net-libs/grpc-1.28 media-libs/giflib >=sys-apps/hwloc-2 ) dev-libs/libpcre dev-libs/openssl:0= >=dev-libs/re2-0.2019.06.01 media-libs/libjpeg-turbo media-libs/libpng:0 net-misc/curl sys-libs/zlib cuda? ( >=dev-util/nvidia-cuda-toolkit-9.1[profiler] dev-libs/cudnn ) mpi? ( virtual/mpi ) python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/absl-py[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/astor-0.7.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/astunparse[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/gast-0.3.3[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/numpy-1.16[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/google-pasta-0.1.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/opt-einsum[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/protobuf-python-3.8.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/six[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/termcolor[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/grpcio-1.28[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=dev-python/wrapt-1.11.1[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=net-libs/google-cloud-cpp-0.10.0 >=sci-libs/keras-applications-1.0.8[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-libs/keras-preprocessing-1.1.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=sci-visualization/tensorboard-2.0.0[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
+REQUIRED_USE=python? ( || ( python_targets_python3_6 python_targets_python3_7 ) )
+SLOT=0
+SRC_URI=https://github.com/tensorflow/tensorflow/archive/v2.3.0.tar.gz -> tensorflow-2.3.0.tar.gz https://github.com/petewarden/OouraFFT/archive/v1.0.tar.gz -> OouraFFT-1.0.tar.gz https://gitlab.com/libeigen/eigen/-/archive/386d809bde475c65b7940f290efe80e6a05878c4/eigen-386d809bde475c65b7940f290efe80e6a05878c4.tar.gz https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz -> abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz https://github.com/bazelbuild/bazel/releases/download/2.2.0/bazel-2.0.0-dist.zip https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip -> bazelbuild-rules_android-0.1.1.zip https://github.com/bazelbuild/rules_apple/archive/5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz -> bazelbuild-rules_apple-5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz https://github.com/bazelbuild/apple_support/archive/501b4afb27745c4813a88ffa28acd901408014e4.tar.gz -> bazelbuild-apple_support-501b4afb27745c4813a88ffa28acd901408014e4.tar.gz https://github.com/bazelbuild/bazel-toolchains/archive/92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz -> bazel-toolchains-92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz https://github.com/bazelbuild/rules_cc/archive/01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip -> bazelbuild-rules_cc-01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz -> bazelbuild-rules_closure-308b05b2419edb5c8ee0471b67a40403df940149.tar.gz https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip -> bazelbuild-rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip https://github.com/bazelbuild/rules_python/releases/download/0.0.1/rules_python-0.0.1.tar.gz -> bazelbuild-rules_python-0.0.1.tar.gz https://github.com/bazelbuild/rules_swift/archive/3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz -> bazelbuild-rules_swift-3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz https://github.com/dmlc/dlpack/archive/3efc489b55385936531a06ff83425b719387ec63.tar.gz -> dlpack-3efc489b55385936531a06ff83425b719387ec63.tar.gz https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz https://github.com/google/gemmlowp/archive/fda83bdc38b118cc6b56753bd540caa49e570745.zip -> gemmlowp-fda83bdc38b118cc6b56753bd540caa49e570745.zip https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz https://github.com/google/re2/archive/506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz -> re2-506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz https://github.com/google/ruy/archive/34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip -> ruy-34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip https://github.com/google/XNNPACK/archive/8b283aa30a3186c6e640aed520543e9c067132d2.zip -> XNNPACK-8b283aa30a3186c6e640aed520543e9c067132d2.zip https://github.com/googleapis/googleapis/archive/541b1ded4abadcc38e8178680b0677f65594ea6f.zip -> googleapis-541b1ded4abadcc38e8178680b0677f65594ea6f.zip https://github.com/joe-kuo/sobol_data/archive/835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz -> sobol_data-835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz https://github.com/llvm/llvm-project/archive/387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz -> llvm-387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz https://github.com/mborgerding/kissfft/archive/36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz -> kissfft-36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz https://github.com/pytorch/cpuinfo/archive/6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip -> cpuinfo-6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip https://github.com/pytorch/cpuinfo/archive/d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz -> cpuinfo-d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz https://github.com/Maratyszcza/FP16/archive/4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip -> FP16-4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip https://github.com/Maratyszcza/FXdiv/archive/b408327ac2a15ec3e43352421954f5b1967701d1.zip -> FXdiv-b408327ac2a15ec3e43352421954f5b1967701d1.zip https://github.com/Maratyszcza/pthreadpool/archive/029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip -> pthreadpool-029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip https://github.com/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.zip -> psimd-072586a71b55b7f8c584153d223e95687148a900.zip cuda? ( https://github.com/nvidia/nccl/archive/3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz -> nvidia-nccl-3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip ) python? ( https://storage.googleapis.com/mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.15.0-python-license.rst.txt https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz )
+_eclasses_=bazel	592c42af547e54af23ac236ca7b2af14	check-reqs	74c98e9a7b34b32be3548357852e9ec3	cros-bazel	25596f146e3e31b4732609dc5dcbb8c6	cuda	bb861e5221b7272ac90c2f12791c1e66	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1710d27fee70f2025ba9892e97b1d682
diff --git a/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r16 b/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r16
deleted file mode 100644
index 4a52395..0000000
--- a/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r16
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-DESCRIPTION=AVer firmware updater
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/aver-updater
-IUSE=cros_host cros_workon_tree_4907dba5c10817de4276887b0b8f289844dfcd14 cros-debug
-KEYWORDS=*
-LICENSE=BSD
-PROPERTIES=live
-RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=e1a5e8de8e9217339388ff0e879c1820
diff --git a/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r19 b/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r19
new file mode 100644
index 0000000..6c3a19c
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/aver-updater-0.0.1-r19
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
+DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+DESCRIPTION=AVer firmware updater
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/aver-updater
+IUSE=cros_host cros_workon_tree_1c1c7cf999109aad1a9ba91c45e88e4c88af530d cros-debug
+KEYWORDS=*
+LICENSE=BSD
+PROPERTIES=live
+RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=bf4b254842b9d7a4eeb601dc68959469
diff --git a/metadata/md5-cache/sys-apps/aver-updater-9999 b/metadata/md5-cache/sys-apps/aver-updater-9999
index 6c5163a..ba685ce 100644
--- a/metadata/md5-cache/sys-apps/aver-updater-9999
+++ b/metadata/md5-cache/sys-apps/aver-updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=45ac725800db3f5628d77433e9aa64d5
diff --git a/metadata/md5-cache/sys-apps/bootcache-0.0.1-r26 b/metadata/md5-cache/sys-apps/bootcache-0.0.1-r26
index 4e03268..c877bc6 100644
--- a/metadata/md5-cache/sys-apps/bootcache-0.0.1-r26
+++ b/metadata/md5-cache/sys-apps/bootcache-0.0.1-r26
@@ -7,5 +7,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=27849ad6619000a862f8e1774938e730
diff --git a/metadata/md5-cache/sys-apps/bootcache-9999 b/metadata/md5-cache/sys-apps/bootcache-9999
index 946e618..83e0ccb 100644
--- a/metadata/md5-cache/sys-apps/bootcache-9999
+++ b/metadata/md5-cache/sys-apps/bootcache-9999
@@ -7,5 +7,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f415a46001b33f089f943f3e765f3c95
diff --git a/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4392 b/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4392
deleted file mode 100644
index c71b8dd..0000000
--- a/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4392
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=!static? ( sys-apps/pciutils ) static? ( sys-apps/pciutils[static-libs(+)] )
-DESCRIPTION=Utilities for modifying coreboot firmware images
-EAPI=7
-HOMEPAGE=http://coreboot.org
-IUSE=cros_host mma +pci static cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20_82e77f6c98187361303fffeeba118a1a365e16d5
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!static? ( sys-apps/pciutils )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e457332b5c41152a0189db1ab1405721
diff --git a/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4526 b/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4526
new file mode 100644
index 0000000..8a1dfd0
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/coreboot-utils-0.0.1-r4526
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=!static? ( sys-apps/pciutils ) static? ( sys-apps/pciutils[static-libs(+)] )
+DESCRIPTION=Utilities for modifying coreboot firmware images
+EAPI=7
+HOMEPAGE=http://coreboot.org
+IUSE=cros_host mma +pci static cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce_d011d454951af2d6dbcf7d4dc7af53a31cc883db
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!static? ( sys-apps/pciutils )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=349294f09ef9a666be1b1fab1c88138c
diff --git a/metadata/md5-cache/sys-apps/coreboot-utils-9999 b/metadata/md5-cache/sys-apps/coreboot-utils-9999
index 621d523..959c7c1 100644
--- a/metadata/md5-cache/sys-apps/coreboot-utils-9999
+++ b/metadata/md5-cache/sys-apps/coreboot-utils-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=!static? ( sys-apps/pciutils )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=2f5fb9409d410f0f75effb929b5ed70f
diff --git a/metadata/md5-cache/sys-apps/daisydog-0.0.1-r29 b/metadata/md5-cache/sys-apps/daisydog-0.0.1-r29
index 237a3e5..3e8c68f 100644
--- a/metadata/md5-cache/sys-apps/daisydog-0.0.1-r29
+++ b/metadata/md5-cache/sys-apps/daisydog-0.0.1-r29
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=a11c0878e87b2496090585de92297a01
diff --git a/metadata/md5-cache/sys-apps/daisydog-9999 b/metadata/md5-cache/sys-apps/daisydog-9999
index 746f828..7cc3c23 100644
--- a/metadata/md5-cache/sys-apps/daisydog-9999
+++ b/metadata/md5-cache/sys-apps/daisydog-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/baselayout
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621
 _md5_=5cecd400268f491510045574e9cd49e3
diff --git a/metadata/md5-cache/sys-apps/dbus-1.10.12 b/metadata/md5-cache/sys-apps/dbus-1.10.12
index 134eb2b..d279cea 100644
--- a/metadata/md5-cache/sys-apps/dbus-1.10.12
+++ b/metadata/md5-cache/sys-apps/dbus-1.10.12
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/expat-2 selinux? ( sys-libs/libselinux ) systemd? ( sys-apps/systemd:0= ) X? ( x11-libs/libX11 x11-libs/libXt ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20131008-r4 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-dbus ) sys-apps/baselayout
 SLOT=0
 SRC_URI=https://dbus.freedesktop.org/releases/dbus/dbus-1.10.12.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	virtualx	e9162f65645513120b4e12863a5fa972
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	virtualx	e9162f65645513120b4e12863a5fa972
 _md5_=79770113846a71caceec7d136ccc77b9
diff --git a/metadata/md5-cache/sys-apps/dbus-1.10.12-r11 b/metadata/md5-cache/sys-apps/dbus-1.10.12-r11
index 134eb2b..d279cea 100644
--- a/metadata/md5-cache/sys-apps/dbus-1.10.12-r11
+++ b/metadata/md5-cache/sys-apps/dbus-1.10.12-r11
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/expat-2 selinux? ( sys-libs/libselinux ) systemd? ( sys-apps/systemd:0= ) X? ( x11-libs/libX11 x11-libs/libXt ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20131008-r4 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) selinux? ( sec-policy/selinux-dbus ) sys-apps/baselayout
 SLOT=0
 SRC_URI=https://dbus.freedesktop.org/releases/dbus/dbus-1.10.12.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	virtualx	e9162f65645513120b4e12863a5fa972
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	readme.gentoo-r1	22ae82e140bdd95d17a34fd5fd733190	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	virtualx	e9162f65645513120b4e12863a5fa972
 _md5_=79770113846a71caceec7d136ccc77b9
diff --git a/metadata/md5-cache/sys-apps/dtc-1.4.7 b/metadata/md5-cache/sys-apps/dtc-1.4.7
deleted file mode 100644
index d4e024e..0000000
--- a/metadata/md5-cache/sys-apps/dtc-1.4.7
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare
-DEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) python? ( dev-lang/swig ) sys-devel/bison sys-devel/flex
-DESCRIPTION=Open Firmware device tree compiler
-EAPI=5
-HOMEPAGE=https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/
-IUSE=python static-libs python_targets_python2_7
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] )
-REQUIRED_USE=python? ( || ( python_targets_python2_7 ) )
-SLOT=0
-SRC_URI=mirror://kernel/software/utils/dtc/dtc-1.4.7.tar.xz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=3e1d219703e8d017db6c4f0d72b66a3c
diff --git a/metadata/md5-cache/sys-apps/dtc-1.4.7-r1 b/metadata/md5-cache/sys-apps/dtc-1.4.7-r1
deleted file mode 100644
index d4e024e..0000000
--- a/metadata/md5-cache/sys-apps/dtc-1.4.7-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare
-DEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) python? ( dev-lang/swig ) sys-devel/bison sys-devel/flex
-DESCRIPTION=Open Firmware device tree compiler
-EAPI=5
-HOMEPAGE=https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/
-IUSE=python static-libs python_targets_python2_7
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] )
-REQUIRED_USE=python? ( || ( python_targets_python2_7 ) )
-SLOT=0
-SRC_URI=mirror://kernel/software/utils/dtc/dtc-1.4.7.tar.xz
-_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=3e1d219703e8d017db6c4f0d72b66a3c
diff --git a/metadata/md5-cache/sys-apps/dtc-1.6.0 b/metadata/md5-cache/sys-apps/dtc-1.6.0
new file mode 100644
index 0000000..f87d42f
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/dtc-1.6.0
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare
+DEPEND=python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) python? ( dev-lang/swig ) sys-devel/bison sys-devel/flex
+DESCRIPTION=Open Firmware device tree compiler
+EAPI=5
+HOMEPAGE=https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/
+IUSE=python static-libs python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] )
+REQUIRED_USE=python? ( || ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 ) )
+SLOT=0
+SRC_URI=mirror://kernel/software/utils/dtc/dtc-1.6.0.tar.xz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=25323cbdca1d04b89ecd96266d6611d4
diff --git a/metadata/md5-cache/sys-apps/dtc-1.6.0-r2 b/metadata/md5-cache/sys-apps/dtc-1.6.0-r2
new file mode 100644
index 0000000..f87d42f
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/dtc-1.6.0-r2
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare
+DEPEND=python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] ) python? ( dev-lang/swig ) sys-devel/bison sys-devel/flex
+DESCRIPTION=Open Firmware device tree compiler
+EAPI=5
+HOMEPAGE=https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/
+IUSE=python static-libs python_targets_python3_6 python_targets_python3_7 python_targets_python3_8
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=python? ( python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-)] )
+REQUIRED_USE=python? ( || ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 ) )
+SLOT=0
+SRC_URI=mirror://kernel/software/utils/dtc/dtc-1.6.0.tar.xz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=25323cbdca1d04b89ecd96266d6611d4
diff --git a/metadata/md5-cache/sys-apps/em100-0.0.1-r37 b/metadata/md5-cache/sys-apps/em100-0.0.1-r37
deleted file mode 100644
index 15d5fc6..0000000
--- a/metadata/md5-cache/sys-apps/em100-0.0.1-r37
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=virtual/libusb:1
-DESCRIPTION=A simple utility to control a Dediprog EM100pro from Linux
-EAPI=4
-IUSE=cros_host cros_workon_tree_de88b2327932c2c5e947d469ea569ff9db216e15
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=virtual/libusb:1
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9eea1eea1dbbcdaac01e2c46a8606c3b
diff --git a/metadata/md5-cache/sys-apps/em100-0.0.1-r38 b/metadata/md5-cache/sys-apps/em100-0.0.1-r38
new file mode 100644
index 0000000..1fa27bb
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/em100-0.0.1-r38
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=virtual/libusb:1
+DESCRIPTION=A simple utility to control a Dediprog EM100pro from Linux
+EAPI=4
+IUSE=cros_host cros_workon_tree_a6e3ad285c95c4b4fd5bf9752fd23fa02bb6ac92
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=virtual/libusb:1
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=29d4a5c6fe5e069ca2054391446707d8
diff --git a/metadata/md5-cache/sys-apps/em100-9999 b/metadata/md5-cache/sys-apps/em100-9999
index 5dd9bc6..6448ed9 100644
--- a/metadata/md5-cache/sys-apps/em100-9999
+++ b/metadata/md5-cache/sys-apps/em100-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 RDEPEND=virtual/libusb:1
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ca55c30cd7471d3aab006fcfee6d887b
diff --git a/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2040 b/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2040
deleted file mode 100644
index a8124aa..0000000
--- a/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2040
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=>=sys-apps/dtc-1.4.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utility for picking a kernel/device tree from a FIT image.
-EAPI=5
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/fitpicker/
-IUSE=cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_83ea9ea5401ca0bfd35f2bddee9b551873d412ca_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_83ea9ea5401ca0bfd35f2bddee9b551873d412ca_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=>=sys-apps/dtc-1.4.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3e0ef50d957c28ba9b0c2ecb027d85d3
diff --git a/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2061 b/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2061
new file mode 100644
index 0000000..f51ba56
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/fitpicker-0.0.1-r2061
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=>=sys-apps/dtc-1.4.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utility for picking a kernel/device tree from a FIT image.
+EAPI=5
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform2/+/master/fitpicker/
+IUSE=cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_4ece3f8f3d85b6237e276452a02c7c6044463211_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_4ece3f8f3d85b6237e276452a02c7c6044463211_e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb cros-debug compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=>=sys-apps/dtc-1.4.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=296e568bf3327120cff2d357e1b2361d
diff --git a/metadata/md5-cache/sys-apps/fitpicker-9999 b/metadata/md5-cache/sys-apps/fitpicker-9999
index 9840e81..4cb8243 100644
--- a/metadata/md5-cache/sys-apps/fitpicker-9999
+++ b/metadata/md5-cache/sys-apps/fitpicker-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live live
 RDEPEND=>=sys-apps/dtc-1.4.1 >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] >=chromeos-base/libbrillo-0.0.1-r1651:=
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	e32be3e77add97a882c5c99bad53fb11	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	platform	cd60a3aa853d28001988f2b07bf2e56c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=c2374b2f77f9f0d7c6b45c04b9cc61dd
diff --git a/metadata/md5-cache/sys-apps/flashmap-0.3-r35 b/metadata/md5-cache/sys-apps/flashmap-0.3-r35
index 5301b42..882ef67 100644
--- a/metadata/md5-cache/sys-apps/flashmap-0.3-r35
+++ b/metadata/md5-cache/sys-apps/flashmap-0.3-r35
@@ -11,5 +11,5 @@
 RDEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
 RESTRICT=test
 SLOT=0/0.3-r35
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=153c776fcfa72b1f24e0e5be0e34679d
diff --git a/metadata/md5-cache/sys-apps/flashmap-9999 b/metadata/md5-cache/sys-apps/flashmap-9999
index db68a3a..b659c78 100644
--- a/metadata/md5-cache/sys-apps/flashmap-9999
+++ b/metadata/md5-cache/sys-apps/flashmap-9999
@@ -11,5 +11,5 @@
 RDEPEND=python? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] )
 RESTRICT=test
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3cdabe62adfa5755f180eaf0ee212d0d
diff --git a/metadata/md5-cache/sys-apps/flashrom-0.9.9-r897 b/metadata/md5-cache/sys-apps/flashrom-0.9.9-r897
deleted file mode 100644
index 8279706..0000000
--- a/metadata/md5-cache/sys-apps/flashrom-0.9.9-r897
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=sys-apps/diffutils dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=!static? ( atahpt? ( sys-apps/pciutils ) dediprog? ( virtual/libusb:0 ) drkaiser? ( sys-apps/pciutils ) fdtmap? ( sys-apps/dtc ) ft2232_spi? ( dev-embedded/libftdi ) gfxnvidia? ( sys-apps/pciutils ) internal? ( sys-apps/pciutils ) nic3com? ( sys-apps/pciutils ) nicintel? ( sys-apps/pciutils ) nicintel_spi? ( sys-apps/pciutils ) nicnatsemi? ( sys-apps/pciutils ) nicrealtek? ( sys-apps/pciutils ) raiden_debug_spi? ( virtual/libusb:1 ) rayer_spi? ( sys-apps/pciutils ) satasii? ( sys-apps/pciutils ) satamv? ( sys-apps/pciutils ) ogp_spi? ( sys-apps/pciutils ) ) static? ( atahpt? ( sys-apps/pciutils[static-libs(+)] ) dediprog? ( virtual/libusb:0[static-libs(+)] ) drkaiser? ( sys-apps/pciutils[static-libs(+)] ) fdtmap? ( sys-apps/dtc[static-libs(+)] ) ft2232_spi? ( dev-embedded/libftdi[static-libs(+)] ) gfxnvidia? ( sys-apps/pciutils[static-libs(+)] ) internal? ( sys-apps/pciutils[static-libs(+)] ) nic3com? ( sys-apps/pciutils[static-libs(+)] ) nicintel? ( sys-apps/pciutils[static-libs(+)] ) nicintel_spi? ( sys-apps/pciutils[static-libs(+)] ) nicnatsemi? ( sys-apps/pciutils[static-libs(+)] ) nicrealtek? ( sys-apps/pciutils[static-libs(+)] ) raiden_debug_spi? ( virtual/libusb:1[static-libs(+)] ) rayer_spi? ( sys-apps/pciutils[static-libs(+)] ) satasii? ( sys-apps/pciutils[static-libs(+)] ) satamv? ( sys-apps/pciutils[static-libs(+)] ) ogp_spi? ( sys-apps/pciutils[static-libs(+)] ) )
-DESCRIPTION=Utility for reading, writing, erasing and verifying flash ROM chips
-EAPI=7
-HOMEPAGE=http://flashrom.org/
-IUSE=+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser +dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi +lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi +nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi +satasii +satamv +serprog static use_os_timer +wiki cros_host cros_workon_tree_9f7aa59d8cbc29bbab4a795024c531243ef4212b
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!static? ( atahpt? ( sys-apps/pciutils ) dediprog? ( virtual/libusb:0 ) drkaiser? ( sys-apps/pciutils ) fdtmap? ( sys-apps/dtc ) ft2232_spi? ( dev-embedded/libftdi ) gfxnvidia? ( sys-apps/pciutils ) internal? ( sys-apps/pciutils ) nic3com? ( sys-apps/pciutils ) nicintel? ( sys-apps/pciutils ) nicintel_spi? ( sys-apps/pciutils ) nicnatsemi? ( sys-apps/pciutils ) nicrealtek? ( sys-apps/pciutils ) raiden_debug_spi? ( virtual/libusb:1 ) rayer_spi? ( sys-apps/pciutils ) satasii? ( sys-apps/pciutils ) satamv? ( sys-apps/pciutils ) ogp_spi? ( sys-apps/pciutils ) ) internal? ( sys-apps/dmidecode )
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4b3ba4e2b02c6998c0c480d7dc035697
diff --git a/metadata/md5-cache/sys-apps/flashrom-0.9.9-r996 b/metadata/md5-cache/sys-apps/flashrom-0.9.9-r996
new file mode 100644
index 0000000..044957a
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/flashrom-0.9.9-r996
@@ -0,0 +1,14 @@
+BDEPEND=sys-apps/diffutils dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=!static? ( atahpt? ( sys-apps/pciutils ) dediprog? ( virtual/libusb:0 ) drkaiser? ( sys-apps/pciutils ) fdtmap? ( sys-apps/dtc ) ft2232_spi? ( dev-embedded/libftdi ) gfxnvidia? ( sys-apps/pciutils ) internal? ( sys-apps/pciutils ) nic3com? ( sys-apps/pciutils ) nicintel? ( sys-apps/pciutils ) nicintel_spi? ( sys-apps/pciutils ) nicnatsemi? ( sys-apps/pciutils ) nicrealtek? ( sys-apps/pciutils ) raiden_debug_spi? ( virtual/libusb:1 ) rayer_spi? ( sys-apps/pciutils ) satasii? ( sys-apps/pciutils ) satamv? ( sys-apps/pciutils ) ogp_spi? ( sys-apps/pciutils ) ) static? ( atahpt? ( sys-apps/pciutils[static-libs(+)] ) dediprog? ( virtual/libusb:0[static-libs(+)] ) drkaiser? ( sys-apps/pciutils[static-libs(+)] ) fdtmap? ( sys-apps/dtc[static-libs(+)] ) ft2232_spi? ( dev-embedded/libftdi[static-libs(+)] ) gfxnvidia? ( sys-apps/pciutils[static-libs(+)] ) internal? ( sys-apps/pciutils[static-libs(+)] ) nic3com? ( sys-apps/pciutils[static-libs(+)] ) nicintel? ( sys-apps/pciutils[static-libs(+)] ) nicintel_spi? ( sys-apps/pciutils[static-libs(+)] ) nicnatsemi? ( sys-apps/pciutils[static-libs(+)] ) nicrealtek? ( sys-apps/pciutils[static-libs(+)] ) raiden_debug_spi? ( virtual/libusb:1[static-libs(+)] ) rayer_spi? ( sys-apps/pciutils[static-libs(+)] ) satasii? ( sys-apps/pciutils[static-libs(+)] ) satamv? ( sys-apps/pciutils[static-libs(+)] ) ogp_spi? ( sys-apps/pciutils[static-libs(+)] ) )
+DESCRIPTION=Utility for reading, writing, erasing and verifying flash ROM chips
+EAPI=7
+HOMEPAGE=http://flashrom.org/
+IUSE=+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser +dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi +lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi +nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi +satasii +satamv +serprog static +wiki cros_host cros_workon_tree_de3b2b41a5d238c8b351506b1c3982f09b68be5b
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!static? ( atahpt? ( sys-apps/pciutils ) dediprog? ( virtual/libusb:0 ) drkaiser? ( sys-apps/pciutils ) fdtmap? ( sys-apps/dtc ) ft2232_spi? ( dev-embedded/libftdi ) gfxnvidia? ( sys-apps/pciutils ) internal? ( sys-apps/pciutils ) nic3com? ( sys-apps/pciutils ) nicintel? ( sys-apps/pciutils ) nicintel_spi? ( sys-apps/pciutils ) nicnatsemi? ( sys-apps/pciutils ) nicrealtek? ( sys-apps/pciutils ) raiden_debug_spi? ( virtual/libusb:1 ) rayer_spi? ( sys-apps/pciutils ) satasii? ( sys-apps/pciutils ) satamv? ( sys-apps/pciutils ) ogp_spi? ( sys-apps/pciutils ) ) internal? ( sys-apps/dmidecode )
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=8e40a3a325df3781dde60fac7cd96fcc
diff --git a/metadata/md5-cache/sys-apps/flashrom-9999 b/metadata/md5-cache/sys-apps/flashrom-9999
index 000c123..acd8a73 100644
--- a/metadata/md5-cache/sys-apps/flashrom-9999
+++ b/metadata/md5-cache/sys-apps/flashrom-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=Utility for reading, writing, erasing and verifying flash ROM chips
 EAPI=7
 HOMEPAGE=http://flashrom.org/
-IUSE=+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser +dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi +lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi +nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi +satasii +satamv +serprog static use_os_timer +wiki cros_host cros_workon_tree_
+IUSE=+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser +dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi +lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi +nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi +satasii +satamv +serprog static +wiki cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RDEPEND=!static? ( atahpt? ( sys-apps/pciutils ) dediprog? ( virtual/libusb:0 ) drkaiser? ( sys-apps/pciutils ) fdtmap? ( sys-apps/dtc ) ft2232_spi? ( dev-embedded/libftdi ) gfxnvidia? ( sys-apps/pciutils ) internal? ( sys-apps/pciutils ) nic3com? ( sys-apps/pciutils ) nicintel? ( sys-apps/pciutils ) nicintel_spi? ( sys-apps/pciutils ) nicnatsemi? ( sys-apps/pciutils ) nicrealtek? ( sys-apps/pciutils ) raiden_debug_spi? ( virtual/libusb:1 ) rayer_spi? ( sys-apps/pciutils ) satasii? ( sys-apps/pciutils ) satamv? ( sys-apps/pciutils ) ogp_spi? ( sys-apps/pciutils ) ) internal? ( sys-apps/dmidecode )
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6597afd314fce0f4ca1fbafd1a00416f
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=f929f97ee79287108496504e79e16ee6
diff --git a/metadata/md5-cache/sys-apps/flashrom-tester-1.6.0-r53 b/metadata/md5-cache/sys-apps/flashrom-tester-1.6.0-r53
index 6eaec4b..5a4516f 100644
--- a/metadata/md5-cache/sys-apps/flashrom-tester-1.6.0-r53
+++ b/metadata/md5-cache/sys-apps/flashrom-tester-1.6.0-r53
@@ -11,5 +11,5 @@
 RDEPEND=!<=sys-apps/flashrom-tester-1.60-r41
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/1.6.0-r53
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a6e4eee93df9aecd1692bb604607ee59
diff --git a/metadata/md5-cache/sys-apps/flashrom-tester-9999 b/metadata/md5-cache/sys-apps/flashrom-tester-9999
index fec94b9..f11e92c 100644
--- a/metadata/md5-cache/sys-apps/flashrom-tester-9999
+++ b/metadata/md5-cache/sys-apps/flashrom-tester-9999
@@ -11,5 +11,5 @@
 RDEPEND=!<=sys-apps/flashrom-tester-1.60-r41
 REQUIRED_USE=?? ( asan lsan msan tsan )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	1d7961c198acead22d12e34c98478903	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-rust	fe84a85c511ad2ec055cbe0cc74bb011	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=75c258e9a9239e31b57869e6fee4f805
diff --git a/metadata/md5-cache/sys-apps/frecon-0.0.1-r172 b/metadata/md5-cache/sys-apps/frecon-0.0.1-r172
deleted file mode 100644
index d941d7b..0000000
--- a/metadata/md5-cache/sys-apps/frecon-0.0.1-r172
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=virtual/udev sys-apps/dbus:= media-libs/libpng:0= sys-apps/libtsm:= x11-libs/libdrm:= media-sound/adhd:=
-DESCRIPTION=Chrome OS KMS console
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/frecon
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_3d33111677bfa34cd2094b48c070ab5e0ddab1e7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=virtual/udev sys-apps/dbus:= media-libs/libpng:0= sys-apps/libtsm:= x11-libs/libdrm:=
-SLOT=0/0.0.1-r172
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=fbad2b8478f7119cd581d2a6aea874b8
diff --git a/metadata/md5-cache/sys-apps/frecon-0.0.1-r174 b/metadata/md5-cache/sys-apps/frecon-0.0.1-r174
new file mode 100644
index 0000000..879dd94
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/frecon-0.0.1-r174
@@ -0,0 +1,14 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=virtual/udev sys-apps/dbus:= media-libs/libpng:0= sys-apps/libtsm:= x11-libs/libdrm:= media-sound/adhd:=
+DESCRIPTION=Chrome OS KMS console
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/frecon
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_3d33111677bfa34cd2094b48c070ab5e0ddab1e7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=virtual/udev sys-apps/dbus:= media-libs/libpng:0= sys-apps/libtsm:= x11-libs/libdrm:=
+SLOT=0/0.0.1-r174
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cf73566ca939b99952cee2884aa3a1ef
diff --git a/metadata/md5-cache/sys-apps/frecon-9999 b/metadata/md5-cache/sys-apps/frecon-9999
index 2c6b42d..11bb2e7 100644
--- a/metadata/md5-cache/sys-apps/frecon-9999
+++ b/metadata/md5-cache/sys-apps/frecon-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=virtual/udev sys-apps/dbus:= media-libs/libpng:0= sys-apps/libtsm:= x11-libs/libdrm:=
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d3f3279b6d87cc75990bdfa3df1303be
diff --git a/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r67 b/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r67
deleted file mode 100644
index b46d80f..0000000
--- a/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r67
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=virtual/pkgconfig dev-vcs/git
-DEFINED_PHASES=compile configure info prepare setup test unpack
-DEPEND=media-libs/libpng:0= sys-apps/libtsm:= media-sound/adhd:= x11-libs/libdrm:=
-DESCRIPTION=Chrome OS KMS console (without DBUS/UDEV support)
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/frecon
-IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_3d33111677bfa34cd2094b48c070ab5e0ddab1e7
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=media-libs/libpng:0= sys-apps/libtsm:=
-SLOT=0/0.0.1-r67
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1ba0c85bafdb43df274d3310fc1ed4c9
diff --git a/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r69 b/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r69
new file mode 100644
index 0000000..400ad73
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/frecon-lite-0.0.1-r69
@@ -0,0 +1,14 @@
+BDEPEND=virtual/pkgconfig dev-vcs/git
+DEFINED_PHASES=compile configure info prepare setup test unpack
+DEPEND=media-libs/libpng:0= sys-apps/libtsm:= media-sound/adhd:= x11-libs/libdrm:=
+DESCRIPTION=Chrome OS KMS console (without DBUS/UDEV support)
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/frecon
+IUSE=-asan asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_3d33111677bfa34cd2094b48c070ab5e0ddab1e7
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=media-libs/libpng:0= sys-apps/libtsm:=
+SLOT=0/0.0.1-r69
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e4aca564b576c6c04465d13591f63777
diff --git a/metadata/md5-cache/sys-apps/frecon-lite-9999 b/metadata/md5-cache/sys-apps/frecon-lite-9999
index 7da9fb8..b0d1b6a 100644
--- a/metadata/md5-cache/sys-apps/frecon-lite-9999
+++ b/metadata/md5-cache/sys-apps/frecon-lite-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=media-libs/libpng:0= sys-apps/libtsm:=
 SLOT=0/9999
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=ea51614689249cc2d3459e8c732ff28c
diff --git a/metadata/md5-cache/sys-apps/fwupd-1.4.1-r45 b/metadata/md5-cache/sys-apps/fwupd-1.4.1-r45
deleted file mode 100644
index 2fad56e..0000000
--- a/metadata/md5-cache/sys-apps/fwupd-1.4.1-r45
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
-DEPEND=|| ( dev-lang/vala:0.36 dev-lang/vala:0.34 dev-lang/vala:0.32 ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] python_single_target_python2_7? ( dev-python/pillow[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] dev-python/pycairo[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] dev-python/pygobject:3[cairo,python_targets_python2_7(-)?,python_single_target_python2_7(+)?] ) >=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.3[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-apps/baselayout dev-util/desktop-file-utils x11-misc/shared-mime-info
-DESCRIPTION=Aims to make updating firmware on Linux automatic, safe and reliable
-EAPI=6
-HOMEPAGE=https://fwupd.org
-IUSE=agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi cros_host cros_workon_tree_917a3abae3b764941271cc8a5e9f76d6c8e322d5 kernel_linux python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
-KEYWORDS=*
-LICENSE=LGPL-2.1+
-PROPERTIES=live
-RDEPEND=>=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.3[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) !<sci-chemistry/chemical-mime-data-0.1.94-r4 sys-apps/dbus sys-apps/baselayout
-REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) ^^ ( consolekit elogind minimal systemd ) dell? ( uefi ) minimal? ( !introspection )
-RESTRICT=!test? ( test )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	linux-info	6accc0e19163336db48a3c346993eb16	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	vala	2f3804278870542119da624a5eded505	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=58dce32e64b70cebd014236d3c60170f
diff --git a/metadata/md5-cache/sys-apps/fwupd-1.4.5-r63 b/metadata/md5-cache/sys-apps/fwupd-1.4.5-r63
new file mode 100644
index 0000000..25cbf3c
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/fwupd-1.4.5-r63
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
+DEPEND=|| ( dev-lang/vala:0.36 dev-lang/vala:0.34 dev-lang/vala:0.32 ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python2_7? ( dev-python/pillow[python_targets_python2_7(-)] dev-python/pycairo[python_targets_python2_7(-)] dev-python/pygobject:3[cairo,python_targets_python2_7(-)] ) >=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.5:=[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-apps/baselayout dev-util/desktop-file-utils x11-misc/shared-mime-info
+DESCRIPTION=Aims to make updating firmware on Linux automatic, safe and reliable
+EAPI=6
+HOMEPAGE=https://fwupd.org
+IUSE=agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi cros_host cros_workon_tree_29b973effac6fc526454ec4fdc063c3a4562db32 kernel_linux python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
+KEYWORDS=*
+LICENSE=LGPL-2.1+
+PROPERTIES=live
+RDEPEND=>=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.5:=[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) !<sci-chemistry/chemical-mime-data-0.1.94-r4 sys-apps/dbus sys-apps/baselayout
+REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) ^^ ( consolekit elogind minimal systemd ) dell? ( uefi ) minimal? ( !introspection )
+RESTRICT=!test? ( test )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	linux-info	327865b9921771330775d971263dc234	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	vala	2f3804278870542119da624a5eded505	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=61ccb114939a82dbb7ab98c9669835aa
diff --git a/metadata/md5-cache/sys-apps/fwupd-9999 b/metadata/md5-cache/sys-apps/fwupd-9999
index 5f09c74..97798bd 100644
--- a/metadata/md5-cache/sys-apps/fwupd-9999
+++ b/metadata/md5-cache/sys-apps/fwupd-9999
@@ -1,15 +1,15 @@
 DEFINED_PHASES=compile configure info install postinst postrm preinst prepare setup test unpack
-DEPEND=|| ( dev-lang/vala:0.36 dev-lang/vala:0.34 dev-lang/vala:0.32 ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?,python_single_target_python3_7(+)?] python_single_target_python2_7? ( dev-python/pillow[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] dev-python/pycairo[python_targets_python2_7(-)?,python_single_target_python2_7(+)?] dev-python/pygobject:3[cairo,python_targets_python2_7(-)?,python_single_target_python2_7(+)?] ) >=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.3[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-apps/baselayout dev-util/desktop-file-utils x11-misc/shared-mime-info
+DEPEND=|| ( dev-lang/vala:0.36 dev-lang/vala:0.34 dev-lang/vala:0.32 ) python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] ) python_single_target_python2_7? ( dev-python/pillow[python_targets_python2_7(-)] dev-python/pycairo[python_targets_python2_7(-)] dev-python/pygobject:3[cairo,python_targets_python2_7(-)] ) >=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.5:=[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 sys-apps/baselayout dev-util/desktop-file-utils x11-misc/shared-mime-info
 DESCRIPTION=Aims to make updating firmware on Linux automatic, safe and reliable
 EAPI=6
 HOMEPAGE=https://fwupd.org
-IUSE=agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi cros_host cros_workon_tree_ kernel_linux python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi cros_host cros_workon_tree_ kernel_linux python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=~*
 LICENSE=LGPL-2.1+
 PROPERTIES=live
-RDEPEND=>=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.3[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) !<sci-chemistry/chemical-mime-data-0.1.94-r4 sys-apps/dbus sys-apps/baselayout
-REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 ) ^^ ( consolekit elogind minimal systemd ) dell? ( uefi ) minimal? ( !introspection )
+RDEPEND=>=app-arch/gcab-1.0 app-arch/libarchive:= dev-db/sqlite >=dev-libs/glib-2.45.8:2 dev-libs/json-glib dev-libs/libgpg-error >=dev-libs/libgudev-232:= >=dev-libs/libgusb-0.3.5:=[introspection?] >=dev-libs/libjcat-0.1.0[gpg?,pkcs7?] >=dev-libs/libxmlb-0.1.13 >=net-libs/libsoup-2.51.92:2.4[introspection?] virtual/libelf:0= virtual/udev consolekit? ( >=sys-auth/consolekit-1.0.0 ) dell? ( sys-libs/efivar >=sys-libs/libsmbios-2.4.0 ) elogind? ( sys-auth/elogind ) !minimal? ( >=sys-auth/polkit-0.103 ) nvme? ( sys-libs/efivar ) redfish? ( sys-libs/efivar ) systemd? ( >=sys-apps/systemd-211 ) uefi? ( app-crypt/tpm2-tss media-libs/fontconfig media-libs/freetype sys-boot/gnu-efi sys-boot/efibootmgr >=sys-libs/efivar-33 x11-libs/cairo ) !<sci-chemistry/chemical-mime-data-0.1.94-r4 sys-apps/dbus sys-apps/baselayout
+REQUIRED_USE=^^ ( python_single_target_python2_7 python_single_target_python3_6 python_single_target_python3_7 ) ^^ ( consolekit elogind minimal systemd ) dell? ( uefi ) minimal? ( !introspection )
 RESTRICT=!test? ( test )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	linux-info	6accc0e19163336db48a3c346993eb16	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	vala	2f3804278870542119da624a5eded505	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=271651bf58f36ef282ea2ae52b7bc88e
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	linux-info	327865b9921771330775d971263dc234	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	vala	2f3804278870542119da624a5eded505	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=5d0e3a7ad2de0ef2980206bdb763c55e
diff --git a/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r78 b/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r78
deleted file mode 100644
index 6f53b55..0000000
--- a/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r78
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=configure info install preinst setup test unpack
-DEPEND=chromeos-base/libbrillo:= chromeos-base/cfm-dfu-notification:= dev-libs/msgpack:= virtual/libusb:1 virtual/libudev:0= test? ( dev-cpp/gtest:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-DESCRIPTION=A utility to update Huddly camera firmware
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/huddly-updater
-IUSE=test cros-debug cros_host cros_workon_tree_8c98f8361691a96b14c3adaef9f2f56caa8a1dc2 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/libbrillo:= chromeos-base/cfm-dfu-notification:= dev-libs/msgpack:= virtual/libusb:1 virtual/libudev:0= app-arch/unzip >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0/0.0.1-r78
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=1cc6aa210dc76f624adf8ae4859c473f
diff --git a/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r82 b/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r82
new file mode 100644
index 0000000..36300e6
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/huddly-updater-0.0.1-r82
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=configure info install preinst setup test unpack
+DEPEND=chromeos-base/libbrillo:= chromeos-base/cfm-dfu-notification:= dev-libs/msgpack:= virtual/libusb:1 virtual/libudev:0= test? ( dev-cpp/gtest:= ) >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+DESCRIPTION=A utility to update Huddly camera firmware
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/huddly-updater
+IUSE=test cros-debug cros_host cros_workon_tree_62c9857ae36ffeac691f38cbdc58bf1106b35826 cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/libbrillo:= chromeos-base/cfm-dfu-notification:= dev-libs/msgpack:= virtual/libusb:1 virtual/libudev:0= app-arch/unzip >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0/0.0.1-r82
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=f682ff2e9ab4c1c91d8abbb5bb272019
diff --git a/metadata/md5-cache/sys-apps/huddly-updater-9999 b/metadata/md5-cache/sys-apps/huddly-updater-9999
index d062938..39d8c12 100644
--- a/metadata/md5-cache/sys-apps/huddly-updater-9999
+++ b/metadata/md5-cache/sys-apps/huddly-updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/libbrillo:= chromeos-base/cfm-dfu-notification:= dev-libs/msgpack:= virtual/libusb:1 virtual/libudev:0= app-arch/unzip >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=a3fbd54ea7ccd17f77dc616d65129ceb
diff --git a/metadata/md5-cache/sys-apps/journald-242 b/metadata/md5-cache/sys-apps/journald-242
index ccde28a..acef84f 100644
--- a/metadata/md5-cache/sys-apps/journald-242
+++ b/metadata/md5-cache/sys-apps/journald-242
@@ -9,5 +9,5 @@
 RDEPEND=>=sys-apps/util-linux-2.30:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-libs/glibc-2.16 acl? ( sys-apps/acl:0= ) gcrypt? ( >=dev-libs/libgcrypt-1.4.5:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) http? ( >=net-libs/libmicrohttpd-0.9.33:0= ) lzma? ( >=app-arch/xz-utils-5.0.5-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pcre? ( dev-libs/libpcre2 ) qrcode? ( media-gfx/qrencode:0= ) selinux? ( sys-libs/libselinux:0= ) >=sys-apps/baselayout-2.2 !sys-apps/systemd sys-apps/baselayout
 SLOT=0/2
 SRC_URI=https://github.com/systemd/systemd/archive/v242/journald-242.tar.gz -> systemd-242.tar.gz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=44ab2dca7e6fc0ccac12824aa9b8195b
diff --git a/metadata/md5-cache/sys-apps/journald-242-r6 b/metadata/md5-cache/sys-apps/journald-242-r6
index ccde28a..acef84f 100644
--- a/metadata/md5-cache/sys-apps/journald-242-r6
+++ b/metadata/md5-cache/sys-apps/journald-242-r6
@@ -9,5 +9,5 @@
 RDEPEND=>=sys-apps/util-linux-2.30:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] sys-libs/libcap:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] !<sys-libs/glibc-2.16 acl? ( sys-apps/acl:0= ) gcrypt? ( >=dev-libs/libgcrypt-1.4.5:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) http? ( >=net-libs/libmicrohttpd-0.9.33:0= ) lzma? ( >=app-arch/xz-utils-5.0.5-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pcre? ( dev-libs/libpcre2 ) qrcode? ( media-gfx/qrencode:0= ) selinux? ( sys-libs/libselinux:0= ) >=sys-apps/baselayout-2.2 !sys-apps/systemd sys-apps/baselayout
 SLOT=0/2
 SRC_URI=https://github.com/systemd/systemd/archive/v242/journald-242.tar.gz -> systemd-242.tar.gz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=44ab2dca7e6fc0ccac12824aa9b8195b
diff --git a/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r28 b/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r28
deleted file mode 100644
index 901eacb..0000000
--- a/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r28
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=configure info install preinst setup unpack
-DEPEND=chromeos-base/libbrillo:= virtual/libusb:1= chromeos-base/cfm-dfu-notification:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-DESCRIPTION=Logitech firmware updater
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/logitech-updater
-IUSE=cros-debug cros_host cros_workon_tree_42da8f169e09aeee9fc8d81e00f145bdf5a54a75 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1= chromeos-base/cfm-dfu-notification:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0/0.0.1-r28
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=7b7bae3d3cc3e398fbb85560a6402117
diff --git a/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r33 b/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r33
new file mode 100644
index 0000000..f1a974c
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/logitech-updater-0.0.1-r33
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=configure info install preinst setup unpack
+DEPEND=chromeos-base/libbrillo:= virtual/libusb:1= chromeos-base/cfm-dfu-notification:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+DESCRIPTION=Logitech firmware updater
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/logitech-updater
+IUSE=cros-debug cros_host cros_workon_tree_3a2d424e597cb3403416dd1031f58d1006fa79a1 cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1= chromeos-base/cfm-dfu-notification:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0/0.0.1-r33
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=9361219dea7110415e3df47557a7557e
diff --git a/metadata/md5-cache/sys-apps/logitech-updater-9999 b/metadata/md5-cache/sys-apps/logitech-updater-9999
index fb57248..f37d6ed 100644
--- a/metadata/md5-cache/sys-apps/logitech-updater-9999
+++ b/metadata/md5-cache/sys-apps/logitech-updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1= chromeos-base/cfm-dfu-notification:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=974889840fc65ee3d6f06bf6fbb18e0a
diff --git a/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r20 b/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r20
deleted file mode 100644
index ca81ff4..0000000
--- a/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r20
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=configure info install preinst setup unpack
-DEPEND=chromeos-base/libbrillo:= virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-DESCRIPTION=A tool to interact with a Mimo device from Chromium OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/mimo-updater
-IUSE=cros-debug cros_host cros_workon_tree_60c768301740879a62897326ce63172e91540788 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0/0.0.1-r20
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=510be61492c79e7d1f74e4471a14c5eb
diff --git a/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r23 b/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r23
new file mode 100644
index 0000000..842620f
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/mimo-updater-0.0.1-r23
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=configure info install preinst setup unpack
+DEPEND=chromeos-base/libbrillo:= virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+DESCRIPTION=A tool to interact with a Mimo device from Chromium OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/mimo-updater
+IUSE=cros-debug cros_host cros_workon_tree_3c149685d54c9ec9d673019e52eaf46237e13c1f cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0/0.0.1-r23
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=5f48b1ac43cfeee7b3f03e24f2f728ce
diff --git a/metadata/md5-cache/sys-apps/mimo-updater-9999 b/metadata/md5-cache/sys-apps/mimo-updater-9999
index 984f2a7..0720422 100644
--- a/metadata/md5-cache/sys-apps/mimo-updater-9999
+++ b/metadata/md5-cache/sys-apps/mimo-updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/libbrillo:= virtual/libusb:1 virtual/libudev:0= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=718682785f9c3f6a0b4362798c191264
diff --git a/metadata/md5-cache/sys-apps/mmc-utils-0.0.1-r22 b/metadata/md5-cache/sys-apps/mmc-utils-0.0.1-r22
index 92d52e3..fa828cc 100644
--- a/metadata/md5-cache/sys-apps/mmc-utils-0.0.1-r22
+++ b/metadata/md5-cache/sys-apps/mmc-utils-0.0.1-r22
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a1f1adfa0a622e5f2f95d759c3080db0
diff --git a/metadata/md5-cache/sys-apps/mmc-utils-9999 b/metadata/md5-cache/sys-apps/mmc-utils-9999
index 6b0e08e..6a65482 100644
--- a/metadata/md5-cache/sys-apps/mmc-utils-9999
+++ b/metadata/md5-cache/sys-apps/mmc-utils-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8fab2247ac0cd5d06565648b17884d15
diff --git a/metadata/md5-cache/sys-apps/mosys-1.2.3-r1137 b/metadata/md5-cache/sys-apps/mosys-1.2.3-r1137
deleted file mode 100644
index 7f97b56..0000000
--- a/metadata/md5-cache/sys-apps/mosys-1.2.3-r1137
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 cros_host? ( dev-util/gn ) dev-cpp/gtest:=
-DESCRIPTION=Utility for obtaining various bits of low-level system info
-EAPI=6
-HOMEPAGE=http://mosys.googlecode.com/
-IUSE=generated_cros_config unibuild cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a33168fa557115c13e015436ab410a6f2038cb5e cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_eec5ce9cfadd268344b02efdbec7465fbc391a9e_a33168fa557115c13e015436ab410a6f2038cb5e compilation_database cros_host test
-KEYWORDS=*
-LICENSE=BSD-Google BSD Apache-2.0 MIT ISC Unlicense
-PROPERTIES=live live
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	e32be3e77add97a882c5c99bad53fb11	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=57ba15ff74c4df79d174d972962199f8
diff --git a/metadata/md5-cache/sys-apps/mosys-1.2.3-r1191 b/metadata/md5-cache/sys-apps/mosys-1.2.3-r1191
new file mode 100644
index 0000000..17b733c
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/mosys-1.2.3-r1191
@@ -0,0 +1,14 @@
+BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git dev-vcs/git
+DEFINED_PHASES=compile configure info install setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DESCRIPTION=Utility for obtaining various bits of low-level system info
+EAPI=7
+HOMEPAGE=http://mosys.googlecode.com/
+IUSE=generated_cros_config unibuild cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_be908cdbeaf55ea1123b9d4b6ab3a8187edb52d7 cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_aa81756947ecfdd38b22f42eed8eeafa40431079_be908cdbeaf55ea1123b9d4b6ab3a8187edb52d7 compilation_database cros_host test
+KEYWORDS=*
+LICENSE=BSD-Google BSD Apache-2.0 MIT ISC Unlicense
+PROPERTIES=live live
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	cd60a3aa853d28001988f2b07bf2e56c	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6d78af797bfe3c6a1f5fc148d38d6fa0
diff --git a/metadata/md5-cache/sys-apps/mosys-9999 b/metadata/md5-cache/sys-apps/mosys-9999
index f2789a0..10ec3be 100644
--- a/metadata/md5-cache/sys-apps/mosys-9999
+++ b/metadata/md5-cache/sys-apps/mosys-9999
@@ -1,13 +1,14 @@
+BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git dev-vcs/git
 DEFINED_PHASES=compile configure info install setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 cros_host? ( dev-util/gn ) dev-cpp/gtest:=
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail cros_host? ( dev-util/gn ) dev-cpp/gtest:=
 DESCRIPTION=Utility for obtaining various bits of low-level system info
-EAPI=6
+EAPI=7
 HOMEPAGE=http://mosys.googlecode.com/
 IUSE=generated_cros_config unibuild cros_host cros_workon_tree_ cros-debug fuzzer asan coverage fuzzer msan tsan ubsan cros_host cros_workon_tree_ compilation_database cros_host test
 KEYWORDS=~*
 LICENSE=BSD-Google BSD Apache-2.0 MIT ISC Unlicense
 PROPERTIES=live live
 RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) dev-util/cmocka >=sys-apps/flashmap-0.3-r4 chromeos-base/minijail
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	e32be3e77add97a882c5c99bad53fb11	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=719768bcb9e97793c295edb912bb1b15
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-fuzzer	b480bfcdd51a928c9a2254c6641649a2	cros-sanitizers	1790470c95f416653a627475b8864394	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	platform	cd60a3aa853d28001988f2b07bf2e56c	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6b69c9847af72ad31168c0efca1b98aa
diff --git a/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-0.0.1-r4 b/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-0.0.1-r4
index 109ec9e..f330db1 100644
--- a/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-0.0.1-r4
+++ b/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-0.0.1-r4
@@ -7,5 +7,5 @@
 LICENSE=BSD
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=acdbafba030e35c05b23e33cf4e355ad
diff --git a/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-9999 b/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-9999
index 31f3ebc..ab0277d 100644
--- a/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-9999
+++ b/metadata/md5-cache/sys-apps/novatek-tcon-fw-update-tool-9999
@@ -7,5 +7,5 @@
 LICENSE=BSD
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4d4316d8817806476dc36b05dec1a1c5
diff --git a/metadata/md5-cache/sys-apps/portage-2.3.75-r50 b/metadata/md5-cache/sys-apps/portage-2.3.75-r50
deleted file mode 100644
index 27b5816..0000000
--- a/metadata/md5-cache/sys-apps/portage-2.3.75-r50
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=!build? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[ssl(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[ssl(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[ssl(+)] ) ) >=app-arch/tar-1.27 dev-lang/python-exec:2 >=sys-apps/sed-4.0.5 sys-devel/patch doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 ) epydoc? ( >=dev-python/epydoc-2.0[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/pkgconfig
-DESCRIPTION=Portage is the package management and distribution system for Gentoo
-EAPI=5
-HOMEPAGE=https://wiki.gentoo.org/wiki/Project:Portage
-IUSE=build doc epydoc gentoo-dev +ipc +native-extensions -rsync-verify selinux xattr python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 cros_host cros_workon_tree_9e1e829a872a71f5eb7281b750207baefd157118
-KEYWORDS=*
-LICENSE=GPL-2
-PDEPEND=!build? ( >=net-misc/rsync-2.6.4 userland_GNU? ( >=sys-apps/coreutils-6.4 ) )
-PROPERTIES=live
-RDEPEND=>=app-arch/tar-1.27 dev-lang/python-exec:2 !build? ( >=sys-apps/sed-4.0.5 app-shells/bash:0[readline] >=app-admin/eselect-1.2 python_targets_python2_7? ( dev-python/pyblake2[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) rsync-verify? ( >=app-portage/gemato-14[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=app-crypt/openpgp-keys-gentoo-release-20180706 >=app-crypt/gnupg-2.2.4-r2[ssl(-)] ) ) elibc_FreeBSD? ( sys-freebsd/freebsd-bin ) elibc_glibc? ( >=sys-apps/sandbox-2.2 ) elibc_musl? ( >=sys-apps/sandbox-2.2 ) elibc_uclibc? ( >=sys-apps/sandbox-2.2 ) >=app-misc/pax-utils-0.1.17 selinux? ( >=sys-libs/libselinux-2.0.94[python,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) xattr? ( kernel_linux? ( >=sys-apps/install-xattr-0.3 python_targets_python2_7? ( dev-python/pyxattr[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) ) !<app-portage/gentoolkit-0.3.0.8-r4 !<app-admin/logrotate-3.8.0 !<app-portage/repoman-2.3.10 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
-REQUIRED_USE=epydoc? ( python_targets_python2_7 ) || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=6669d9caaee3f7e64a887702d8332356
diff --git a/metadata/md5-cache/sys-apps/portage-2.3.75-r56 b/metadata/md5-cache/sys-apps/portage-2.3.75-r56
new file mode 100644
index 0000000..0a3368f
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/portage-2.3.75-r56
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
+DEPEND=!build? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[ssl(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[ssl(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[ssl(+)] ) ) >=app-arch/tar-1.27 dev-lang/python-exec:2 >=sys-apps/sed-4.0.5 sys-devel/patch doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 ) epydoc? ( python_targets_python2_7? ( >=dev-python/epydoc-2.0[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/pkgconfig
+DESCRIPTION=Portage is the package management and distribution system for Gentoo
+EAPI=5
+HOMEPAGE=https://wiki.gentoo.org/wiki/Project:Portage
+IUSE=build doc epydoc gentoo-dev +ipc +native-extensions -rsync-verify selinux xattr python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 cros_host cros_workon_tree_d9b674fa27b8166f180fc6f40238a588593b97cb
+KEYWORDS=*
+LICENSE=GPL-2
+PDEPEND=!build? ( >=net-misc/rsync-2.6.4 userland_GNU? ( >=sys-apps/coreutils-6.4 ) )
+PROPERTIES=live
+RDEPEND=>=app-arch/tar-1.27 dev-lang/python-exec:2 !build? ( >=sys-apps/sed-4.0.5 app-shells/bash:0[readline] >=app-admin/eselect-1.2 python_targets_python2_7? ( dev-python/pyblake2[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) rsync-verify? ( >=app-portage/gemato-14[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=app-crypt/openpgp-keys-gentoo-release-20180706 >=app-crypt/gnupg-2.2.4-r2[ssl(-)] ) ) elibc_FreeBSD? ( sys-freebsd/freebsd-bin ) elibc_glibc? ( >=sys-apps/sandbox-2.2 ) elibc_musl? ( >=sys-apps/sandbox-2.2 ) elibc_uclibc? ( >=sys-apps/sandbox-2.2 ) >=app-misc/pax-utils-0.1.17 selinux? ( >=sys-libs/libselinux-2.0.94[python,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) xattr? ( kernel_linux? ( >=sys-apps/install-xattr-0.3 python_targets_python2_7? ( dev-python/pyxattr[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) ) !<app-portage/gentoolkit-0.3.0.8-r4 !<app-admin/logrotate-3.8.0 !<app-portage/repoman-2.3.10 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
+REQUIRED_USE=epydoc? ( python_targets_python2_7 ) || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=b13608779e9e39e0e02cf00297a62337
diff --git a/metadata/md5-cache/sys-apps/portage-9999 b/metadata/md5-cache/sys-apps/portage-9999
index 98cdc46..e6b9aa9 100644
--- a/metadata/md5-cache/sys-apps/portage-9999
+++ b/metadata/md5-cache/sys-apps/portage-9999
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=!build? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[ssl(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[ssl(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[ssl(+)] ) ) >=app-arch/tar-1.27 dev-lang/python-exec:2 >=sys-apps/sed-4.0.5 sys-devel/patch doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 ) epydoc? ( >=dev-python/epydoc-2.0[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/pkgconfig
+DEPEND=!build? ( python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[ssl(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[ssl(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[ssl(+)] ) ) >=app-arch/tar-1.27 dev-lang/python-exec:2 >=sys-apps/sed-4.0.5 sys-devel/patch doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 ) epydoc? ( python_targets_python2_7? ( >=dev-python/epydoc-2.0[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] virtual/pkgconfig
 DESCRIPTION=Portage is the package management and distribution system for Gentoo
 EAPI=5
 HOMEPAGE=https://wiki.gentoo.org/wiki/Project:Portage
@@ -11,5 +11,5 @@
 RDEPEND=>=app-arch/tar-1.27 dev-lang/python-exec:2 !build? ( >=sys-apps/sed-4.0.5 app-shells/bash:0[readline] >=app-admin/eselect-1.2 python_targets_python2_7? ( dev-python/pyblake2[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) rsync-verify? ( >=app-portage/gemato-14[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] >=app-crypt/openpgp-keys-gentoo-release-20180706 >=app-crypt/gnupg-2.2.4-r2[ssl(-)] ) ) elibc_FreeBSD? ( sys-freebsd/freebsd-bin ) elibc_glibc? ( >=sys-apps/sandbox-2.2 ) elibc_musl? ( >=sys-apps/sandbox-2.2 ) elibc_uclibc? ( >=sys-apps/sandbox-2.2 ) >=app-misc/pax-utils-0.1.17 selinux? ( >=sys-libs/libselinux-2.0.94[python,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)] ) xattr? ( kernel_linux? ( >=sys-apps/install-xattr-0.3 python_targets_python2_7? ( dev-python/pyxattr[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) ) !<app-portage/gentoolkit-0.3.0.8-r4 !<app-admin/logrotate-3.8.0 !<app-portage/repoman-2.3.10 python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[bzip2(+),threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[bzip2(+),threads(+)] ) python_targets_python3_7? ( dev-lang/python:3.7[bzip2(+),threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-)]
 REQUIRED_USE=epydoc? ( python_targets_python2_7 ) || ( python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=848779d9e78db4e7c9b66665e4bc91b7
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=45edffa88ba1177326d8b67291720fe6
diff --git a/metadata/md5-cache/sys-apps/ripgrep-12.1.1 b/metadata/md5-cache/sys-apps/ripgrep-12.1.1
new file mode 100644
index 0000000..bdb655c
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/ripgrep-12.1.1
@@ -0,0 +1,13 @@
+BDEPEND=pcre? ( dev-libs/libpcre2 ) virtual/pkgconfig >=virtual/rust-1.37.0
+DEFINED_PHASES=compile install test unpack
+DESCRIPTION=a search tool that combines the usability of ag with the raw speed of grep
+EAPI=7
+HOMEPAGE=https://github.com/BurntSushi/ripgrep
+IUSE=pcre debug
+KEYWORDS=*
+LICENSE=Apache-2.0 BSD-2 Boost-1.0 MIT
+RDEPEND=pcre? ( dev-libs/libpcre2 )
+SLOT=0
+SRC_URI=https://github.com/BurntSushi/ripgrep/archive/12.1.1.tar.gz -> ripgrep-12.1.1.tar.gz https://github.com/BurntSushi/ripgrep/releases/download/12.1.1/ripgrep-12.1.1-x86_64-unknown-linux-musl.tar.gz https://crates.io/api/v1/crates/aho-corasick/0.7.10/download -> aho-corasick-0.7.10.crate https://crates.io/api/v1/crates/atty/0.2.14/download -> atty-0.2.14.crate https://crates.io/api/v1/crates/autocfg/1.0.0/download -> autocfg-1.0.0.crate https://crates.io/api/v1/crates/base64/0.12.1/download -> base64-0.12.1.crate https://crates.io/api/v1/crates/bitflags/1.2.1/download -> bitflags-1.2.1.crate https://crates.io/api/v1/crates/bstr/0.2.13/download -> bstr-0.2.13.crate https://crates.io/api/v1/crates/bytecount/0.6.0/download -> bytecount-0.6.0.crate https://crates.io/api/v1/crates/byteorder/1.3.4/download -> byteorder-1.3.4.crate https://crates.io/api/v1/crates/cc/1.0.54/download -> cc-1.0.54.crate https://crates.io/api/v1/crates/cfg-if/0.1.10/download -> cfg-if-0.1.10.crate https://crates.io/api/v1/crates/clap/2.33.1/download -> clap-2.33.1.crate https://crates.io/api/v1/crates/crossbeam-channel/0.4.2/download -> crossbeam-channel-0.4.2.crate https://crates.io/api/v1/crates/crossbeam-utils/0.7.2/download -> crossbeam-utils-0.7.2.crate https://crates.io/api/v1/crates/encoding_rs/0.8.23/download -> encoding_rs-0.8.23.crate https://crates.io/api/v1/crates/encoding_rs_io/0.1.7/download -> encoding_rs_io-0.1.7.crate https://crates.io/api/v1/crates/fnv/1.0.7/download -> fnv-1.0.7.crate https://crates.io/api/v1/crates/fs_extra/1.1.0/download -> fs_extra-1.1.0.crate https://crates.io/api/v1/crates/glob/0.3.0/download -> glob-0.3.0.crate https://crates.io/api/v1/crates/hermit-abi/0.1.13/download -> hermit-abi-0.1.13.crate https://crates.io/api/v1/crates/itoa/0.4.5/download -> itoa-0.4.5.crate https://crates.io/api/v1/crates/jemallocator/0.3.2/download -> jemallocator-0.3.2.crate https://crates.io/api/v1/crates/jemalloc-sys/0.3.2/download -> jemalloc-sys-0.3.2.crate https://crates.io/api/v1/crates/lazy_static/1.4.0/download -> lazy_static-1.4.0.crate https://crates.io/api/v1/crates/libc/0.2.71/download -> libc-0.2.71.crate https://crates.io/api/v1/crates/log/0.4.8/download -> log-0.4.8.crate https://crates.io/api/v1/crates/maybe-uninit/2.0.0/download -> maybe-uninit-2.0.0.crate https://crates.io/api/v1/crates/memchr/2.3.3/download -> memchr-2.3.3.crate https://crates.io/api/v1/crates/memmap/0.7.0/download -> memmap-0.7.0.crate https://crates.io/api/v1/crates/num_cpus/1.13.0/download -> num_cpus-1.13.0.crate https://crates.io/api/v1/crates/packed_simd/0.3.3/download -> packed_simd-0.3.3.crate https://crates.io/api/v1/crates/pcre2/0.2.3/download -> pcre2-0.2.3.crate https://crates.io/api/v1/crates/pcre2-sys/0.2.2/download -> pcre2-sys-0.2.2.crate https://crates.io/api/v1/crates/pkg-config/0.3.17/download -> pkg-config-0.3.17.crate https://crates.io/api/v1/crates/proc-macro2/1.0.17/download -> proc-macro2-1.0.17.crate https://crates.io/api/v1/crates/quote/1.0.6/download -> quote-1.0.6.crate https://crates.io/api/v1/crates/regex/1.3.9/download -> regex-1.3.9.crate https://crates.io/api/v1/crates/regex-automata/0.1.9/download -> regex-automata-0.1.9.crate https://crates.io/api/v1/crates/regex-syntax/0.6.18/download -> regex-syntax-0.6.18.crate https://crates.io/api/v1/crates/ryu/1.0.4/download -> ryu-1.0.4.crate https://crates.io/api/v1/crates/same-file/1.0.6/download -> same-file-1.0.6.crate https://crates.io/api/v1/crates/serde/1.0.110/download -> serde-1.0.110.crate https://crates.io/api/v1/crates/serde_derive/1.0.110/download -> serde_derive-1.0.110.crate https://crates.io/api/v1/crates/serde_json/1.0.53/download -> serde_json-1.0.53.crate https://crates.io/api/v1/crates/strsim/0.8.0/download -> strsim-0.8.0.crate https://crates.io/api/v1/crates/syn/1.0.27/download -> syn-1.0.27.crate https://crates.io/api/v1/crates/termcolor/1.1.0/download -> termcolor-1.1.0.crate https://crates.io/api/v1/crates/textwrap/0.11.0/download -> textwrap-0.11.0.crate https://crates.io/api/v1/crates/thread_local/1.0.1/download -> thread_local-1.0.1.crate https://crates.io/api/v1/crates/unicode-width/0.1.7/download -> unicode-width-0.1.7.crate https://crates.io/api/v1/crates/unicode-xid/0.2.0/download -> unicode-xid-0.2.0.crate https://crates.io/api/v1/crates/walkdir/2.3.1/download -> walkdir-2.3.1.crate https://crates.io/api/v1/crates/winapi/0.3.8/download -> winapi-0.3.8.crate https://crates.io/api/v1/crates/winapi-i686-pc-windows-gnu/0.4.0/download -> winapi-i686-pc-windows-gnu-0.4.0.crate https://crates.io/api/v1/crates/winapi-util/0.1.5/download -> winapi-util-0.1.5.crate https://crates.io/api/v1/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download -> winapi-x86_64-pc-windows-gnu-0.4.0.crate
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	cargo	d8e0b70112b94f60618f3def70bfb16e	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a781eb5557eff0ef7034ba9cbe6cda7b
diff --git a/metadata/md5-cache/sys-apps/rootdev-0.0.1-r38 b/metadata/md5-cache/sys-apps/rootdev-0.0.1-r38
index f1f81ac..66ca13c 100644
--- a/metadata/md5-cache/sys-apps/rootdev-0.0.1-r38
+++ b/metadata/md5-cache/sys-apps/rootdev-0.0.1-r38
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0.0.1-r38
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1827beb65bf63b3d07043e147548aef1
diff --git a/metadata/md5-cache/sys-apps/rootdev-9999 b/metadata/md5-cache/sys-apps/rootdev-9999
index 4c4f49e..c40fa28 100644
--- a/metadata/md5-cache/sys-apps/rootdev-9999
+++ b/metadata/md5-cache/sys-apps/rootdev-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-sanitizers	1790470c95f416653a627475b8864394	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=78b665735a7c322c64bc6492fa0499bb
diff --git a/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r21 b/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r21
deleted file mode 100644
index 5f7b158..0000000
--- a/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r21
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git virtual/pkgconfig
-DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
-DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-DESCRIPTION=A tool to update SiS firmware on Mimo from Chromium OS.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/sis-updater
-IUSE=cros_host cros_workon_tree_bdfd4bba192eb59900d15306e19dc29768df7b24 cros-debug
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
-SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
-_md5_=0addf606b11d1820eb40da4640e4feb7
diff --git a/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r24 b/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r24
new file mode 100644
index 0000000..ac45b48
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/sis-updater-0.0.1-r24
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git virtual/pkgconfig
+DEFINED_PHASES=compile configure info install preinst prepare setup test unpack
+DEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+DESCRIPTION=A tool to update SiS firmware on Mimo from Chromium OS.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/third_party/sis-updater
+IUSE=cros_host cros_workon_tree_bc2348a4d6692d35c2a9b5cc3e7d8d5cfc5faad9 cros-debug
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
+SLOT=0
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_md5_=6fa6583bb94f16861994ec68230a04e6
diff --git a/metadata/md5-cache/sys-apps/sis-updater-9999 b/metadata/md5-cache/sys-apps/sis-updater-9999
index 7f5150c..bd0a2f6 100644
--- a/metadata/md5-cache/sys-apps/sis-updater-9999
+++ b/metadata/md5-cache/sys-apps/sis-updater-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/libbrillo:= >=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=] sys-apps/baselayout
 SLOT=0
-_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	e6da2797824cba5cbf8df7636c22624c	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
+_eclasses_=cros-common.mk	0d2a9d7d20c4d4ab08fc94b6ca128a88	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libchrome	7db5b03b7ca5337406c3d24a0e096e9c	libchrome-version	f89118941e7f3c3825d2fe216c977c57	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621
 _md5_=1dcdf7e997f2d1a4ff8413a75696c5ea
diff --git a/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2747 b/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2747
deleted file mode 100644
index 7801be8..0000000
--- a/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2747
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=sys-apps/pciutils
-DESCRIPTION=Superiotool allows you to detect which Super I/O you have on your mainboard, and it can provide detailed information about the register contents of the Super I/O.
-EAPI=4
-HOMEPAGE=http://www.coreboot.org/Superiotool
-IUSE=cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20
-KEYWORDS=amd64 x86
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=sys-apps/pciutils
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4eddde0737aa0d37011d4f764e852f35
diff --git a/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2836 b/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2836
new file mode 100644
index 0000000..3546a20
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/superiotool-0.0.1-r2836
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=sys-apps/pciutils
+DESCRIPTION=Superiotool allows you to detect which Super I/O you have on your mainboard, and it can provide detailed information about the register contents of the Super I/O.
+EAPI=4
+HOMEPAGE=http://www.coreboot.org/Superiotool
+IUSE=cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce
+KEYWORDS=amd64 x86
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=sys-apps/pciutils
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=48c60747f4a66ce087c5e0c64b977130
diff --git a/metadata/md5-cache/sys-apps/superiotool-9999 b/metadata/md5-cache/sys-apps/superiotool-9999
index 33ca9a0..345357b 100644
--- a/metadata/md5-cache/sys-apps/superiotool-9999
+++ b/metadata/md5-cache/sys-apps/superiotool-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=sys-apps/pciutils
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=32163a6f60ebe9b2ef0bd3e03cba9be3
diff --git a/metadata/md5-cache/sys-apps/upstart-1.2 b/metadata/md5-cache/sys-apps/upstart-1.2
index 9d89ea0..beb2c4a 100644
--- a/metadata/md5-cache/sys-apps/upstart-1.2
+++ b/metadata/md5-cache/sys-apps/upstart-1.2
@@ -10,4 +10,4 @@
 SLOT=0
 SRC_URI=http://upstart.ubuntu.com/download/1.2/upstart-1.2.tar.gz
 _eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c34499b94c23ec00727e47e84788927
+_md5_=527b097098fab85a8945673995e906d7
diff --git a/metadata/md5-cache/sys-apps/upstart-1.2-r33 b/metadata/md5-cache/sys-apps/upstart-1.2-r33
deleted file mode 100644
index 9d89ea0..0000000
--- a/metadata/md5-cache/sys-apps/upstart-1.2-r33
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare
-DEPEND=>=dev-libs/expat-2.0.0 nls? ( sys-devel/gettext ) direncryption? ( sys-fs/e2fsprogs ) >=sys-apps/dbus-1.2.16 >=sys-libs/libnih-1.0.2 selinux? ( sys-libs/libselinux sys-libs/libsepol ) udev_bridge? ( >=virtual/libudev-146 ) direncryption? ( sys-apps/keyutils ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Upstart is an event-based replacement for the init daemon
-EAPI=5
-HOMEPAGE=http://upstart.ubuntu.com/
-IUSE=debug direncryption examples nls selinux udev_bridge
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=>=sys-apps/dbus-1.2.16 >=sys-libs/libnih-1.0.2 selinux? ( sys-libs/libselinux sys-libs/libsepol ) udev_bridge? ( >=virtual/libudev-146 ) direncryption? ( sys-apps/keyutils ) selinux? ( chromeos-base/selinux-policy )
-SLOT=0
-SRC_URI=http://upstart.ubuntu.com/download/1.2/upstart-1.2.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8c34499b94c23ec00727e47e84788927
diff --git a/metadata/md5-cache/sys-apps/upstart-1.2-r34 b/metadata/md5-cache/sys-apps/upstart-1.2-r34
new file mode 100644
index 0000000..beb2c4a
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/upstart-1.2-r34
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare
+DEPEND=>=dev-libs/expat-2.0.0 nls? ( sys-devel/gettext ) direncryption? ( sys-fs/e2fsprogs ) >=sys-apps/dbus-1.2.16 >=sys-libs/libnih-1.0.2 selinux? ( sys-libs/libselinux sys-libs/libsepol ) udev_bridge? ( >=virtual/libudev-146 ) direncryption? ( sys-apps/keyutils ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=Upstart is an event-based replacement for the init daemon
+EAPI=5
+HOMEPAGE=http://upstart.ubuntu.com/
+IUSE=debug direncryption examples nls selinux udev_bridge
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=>=sys-apps/dbus-1.2.16 >=sys-libs/libnih-1.0.2 selinux? ( sys-libs/libselinux sys-libs/libsepol ) udev_bridge? ( >=virtual/libudev-146 ) direncryption? ( sys-apps/keyutils ) selinux? ( chromeos-base/selinux-policy )
+SLOT=0
+SRC_URI=http://upstart.ubuntu.com/download/1.2/upstart-1.2.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=527b097098fab85a8945673995e906d7
diff --git a/metadata/md5-cache/sys-apps/usbutils-007 b/metadata/md5-cache/sys-apps/usbutils-007
index b8bd4b7..2ceed0c 100644
--- a/metadata/md5-cache/sys-apps/usbutils-007
+++ b/metadata/md5-cache/sys-apps/usbutils-007
@@ -3,12 +3,12 @@
 DESCRIPTION=USB enumeration utilities
 EAPI=5
 HOMEPAGE=http://linux-usb.sourceforge.net/
-IUSE=python zlib +python_targets_python2_7 +python_single_target_python2_7
+IUSE=python zlib +python_single_target_python2_7
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=virtual/libusb:1= zlib? ( sys-libs/zlib:= ) sys-apps/hwids python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
+RDEPEND=virtual/libusb:1= zlib? ( sys-libs/zlib:= ) sys-apps/hwids python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) )
 SLOT=0
 SRC_URI=mirror://kernel/linux/utils/usb/usbutils/usbutils-007.tar.xz
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0ec76028a95273a94ddf7dfaa7dbfd9b
diff --git a/metadata/md5-cache/sys-apps/usbutils-007-r4 b/metadata/md5-cache/sys-apps/usbutils-007-r4
index b8bd4b7..2ceed0c 100644
--- a/metadata/md5-cache/sys-apps/usbutils-007-r4
+++ b/metadata/md5-cache/sys-apps/usbutils-007-r4
@@ -3,12 +3,12 @@
 DESCRIPTION=USB enumeration utilities
 EAPI=5
 HOMEPAGE=http://linux-usb.sourceforge.net/
-IUSE=python zlib +python_targets_python2_7 +python_single_target_python2_7
+IUSE=python zlib +python_single_target_python2_7
 KEYWORDS=*
 LICENSE=GPL-2
-RDEPEND=virtual/libusb:1= zlib? ( sys-libs/zlib:= ) sys-apps/hwids python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?] )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) python_single_target_python2_7? ( python_targets_python2_7 ) )
+RDEPEND=virtual/libusb:1= zlib? ( sys-libs/zlib:= ) sys-apps/hwids python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 ) )
 SLOT=0
 SRC_URI=mirror://kernel/linux/utils/usb/usbutils/usbutils-007.tar.xz
-_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=base	ec46b36a6f6fd1d0b505a33e0b74e413	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0ec76028a95273a94ddf7dfaa7dbfd9b
diff --git a/metadata/md5-cache/sys-apps/util-linux-2.32-r4 b/metadata/md5-cache/sys-apps/util-linux-2.32-r4
deleted file mode 100644
index ba06321..0000000
--- a/metadata/md5-cache/sys-apps/util-linux-2.32-r4
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=caps? ( sys-libs/libcap-ng ) cramfs? ( sys-libs/zlib:= ) ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] ) nls? ( virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pam? ( sys-libs/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) readline? ( sys-libs/readline:0= ) selinux? ( >=sys-libs/libselinux-2.2.2-r4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) slang? ( sys-libs/slang ) !build? ( systemd? ( sys-apps/systemd ) ) udev? ( virtual/libudev:= ) virtual/pkgconfig nls? ( sys-devel/gettext ) test? ( sys-devel/bc ) virtual/os-headers >=app-portage/elt-patches-20170815 virtual/pkgconfig
-DESCRIPTION=Various useful Linux utilities
-EAPI=6
-HOMEPAGE=https://www.kernel.org/pub/linux/utils/util-linux/ https://github.com/karelzak/util-linux
-IUSE=build caps +cramfs fdformat kill ncurses nls pam python +readline selinux slang static-libs +suid systemd test tty-helpers udev unicode userland_GNU kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14 kernel-4_19 cros_host python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=GPL-2 LGPL-2.1 BSD-4 MIT public-domain
-RDEPEND=caps? ( sys-libs/libcap-ng ) cramfs? ( sys-libs/zlib:= ) ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] ) nls? ( virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pam? ( sys-libs/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) readline? ( sys-libs/readline:0= ) selinux? ( >=sys-libs/libselinux-2.2.2-r4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) slang? ( sys-libs/slang ) !build? ( systemd? ( sys-apps/systemd ) ) udev? ( virtual/libudev:= ) kill? ( !sys-apps/coreutils[kill] !sys-process/procps[kill] ) !net-wireless/rfkill !sys-process/schedutils !sys-apps/setarch !<sys-apps/sysvinit-2.88-r7 !<sys-libs/e2fsprogs-libs-1.41.8 !<sys-fs/e2fsprogs-1.41.8 !<app-shells/bash-completion-2.7-r1
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) )
-SLOT=0
-SRC_URI=mirror://kernel/linux/utils/util-linux/v2.32/util-linux-2.32.tar.xz
-_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=0596f0c0c1a5708cdbbea45f319cf2e3
diff --git a/metadata/md5-cache/sys-apps/util-linux-2.32-r6 b/metadata/md5-cache/sys-apps/util-linux-2.32-r6
new file mode 100644
index 0000000..9ce1aab
--- /dev/null
+++ b/metadata/md5-cache/sys-apps/util-linux-2.32-r6
@@ -0,0 +1,15 @@
+BDEPEND=virtual/pkgconfig nls? ( sys-devel/gettext ) test? ( sys-devel/bc ) >=app-portage/elt-patches-20170815 virtual/pkgconfig
+DEFINED_PHASES=compile configure install postinst prepare setup test
+DEPEND=caps? ( sys-libs/libcap-ng ) cramfs? ( sys-libs/zlib:= ) ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] ) nls? ( virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pam? ( sys-libs/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) readline? ( sys-libs/readline:0= ) selinux? ( >=sys-libs/libselinux-2.2.2-r4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) slang? ( sys-libs/slang ) !build? ( systemd? ( sys-apps/systemd ) ) udev? ( virtual/libudev:= ) virtual/os-headers
+DESCRIPTION=Various useful Linux utilities
+EAPI=7
+HOMEPAGE=https://www.kernel.org/pub/linux/utils/util-linux/ https://github.com/karelzak/util-linux
+IUSE=build caps +cramfs fdformat kill ncurses nls pam python +readline selinux slang static-libs +suid systemd test tty-helpers udev unicode userland_GNU kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 cros_host python_single_target_python2_7 python_single_target_python3_6 abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=GPL-2 LGPL-2.1 BSD-4 MIT public-domain
+RDEPEND=caps? ( sys-libs/libcap-ng ) cramfs? ( sys-libs/zlib:= ) ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] ) nls? ( virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) pam? ( sys-libs/pam ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) readline? ( sys-libs/readline:0= ) selinux? ( >=sys-libs/libselinux-2.2.2-r4[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) slang? ( sys-libs/slang ) !build? ( systemd? ( sys-apps/systemd ) ) udev? ( virtual/libudev:= ) kill? ( !sys-apps/coreutils[kill] !sys-process/procps[kill] ) !net-wireless/rfkill !sys-process/schedutils !sys-apps/setarch !<sys-apps/sysvinit-2.88-r7 !<sys-libs/e2fsprogs-libs-1.41.8 !<sys-fs/e2fsprogs-1.41.8 !<app-shells/bash-completion-2.7-r1
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) )
+SLOT=0
+SRC_URI=mirror://kernel/linux/utils/util-linux/v2.32/util-linux-2.32.tar.xz
+_eclasses_=bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	pam	3f746974e1cc47cabe3bd488c08cdc8e	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=24066b346135e7b070df2daea84acfc4
diff --git a/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r1 b/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r1
index 764a6b0..5e690b6 100644
--- a/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r1
+++ b/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r1
@@ -9,5 +9,5 @@
 RDEPEND=slp? ( net-libs/openslp ) virtual/udev sys-apps/util-linux chromeos-base/chromeos-init
 SLOT=0
 SRC_URI=http://www.open-iscsi.org/bits/open-iscsi-2.0-873.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=074b6c3f989e244c3a8984f5926c1140
diff --git a/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r2 b/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r2
index 764a6b0..5e690b6 100644
--- a/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r2
+++ b/metadata/md5-cache/sys-block/open-iscsi-2.0.873-r2
@@ -9,5 +9,5 @@
 RDEPEND=slp? ( net-libs/openslp ) virtual/udev sys-apps/util-linux chromeos-base/chromeos-init
 SLOT=0
 SRC_URI=http://www.open-iscsi.org/bits/open-iscsi-2.0-873.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=074b6c3f989e244c3a8984f5926c1140
diff --git a/metadata/md5-cache/sys-boot/bootstub-1.0-r13 b/metadata/md5-cache/sys-boot/bootstub-1.0-r13
index 555fb06..f4d0e7e 100644
--- a/metadata/md5-cache/sys-boot/bootstub-1.0-r13
+++ b/metadata/md5-cache/sys-boot/bootstub-1.0-r13
@@ -8,5 +8,5 @@
 LICENSE=GPL-3
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=87c578c2396f713f02babae53fc7db77
diff --git a/metadata/md5-cache/sys-boot/bootstub-9999 b/metadata/md5-cache/sys-boot/bootstub-9999
index b85c772..241951a 100644
--- a/metadata/md5-cache/sys-boot/bootstub-9999
+++ b/metadata/md5-cache/sys-boot/bootstub-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-3
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bfdfae21fb2d015041e67e494ade03e8
diff --git a/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r169 b/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r169
deleted file mode 100644
index 51f1c83..0000000
--- a/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r169
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=|| ( dev-lang/python:3.8 dev-lang/python:3.7 dev-lang/python:3.6 ) dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup unpack
-DEPEND=virtual/chromeos-vendor-strings
-DESCRIPTION=Chrome OS Firmware Bitmap Block
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/bmpblk/
-IUSE=detachable menu_ui legacy_menu_ui diag_payload physical_presence_power physical_presence_recovery cros_host cros_workon_tree_e79a894c8f8c4216a3c302c721e5aab66662f8d4 board_use_atlas board_use_auron_paine board_use_auron_yuna board_use_banjo board_use_buddy board_use_butterfly board_use_candy board_use_chell board_use_cid board_use_clapper board_use_cranky board_use_daisy board_use_daisy_snow board_use_daisy_spring board_use_daisy_skate board_use_dedede board_use_deltaur board_use_dragonegg board_use_drallion board_use_endeavour board_use_enguarde board_use_expresso board_use_eve board_use_falco board_use_fizz board_use_flapjack board_use_glados board_use_glimmer board_use_gnawty board_use_grunt board_use_guado board_use_hatch board_use_jacuzzi board_use_kalista board_use_kevin board_use_kip board_use_kukui board_use_lars board_use_leon board_use_link board_use_lulu board_use_lumpy board_use_mccloud board_use_meowth board_use_monroe board_use_mushu board_use_nami board_use_nautilus board_use_ninja board_use_nocturne board_use_nyan board_use_nyan_big board_use_octopus board_use_orco board_use_palkia board_use_panther board_use_parrot board_use_peach_pi board_use_peach_pit board_use_peppy board_use_poppy board_use_puff board_use_quawks board_use_rammus board_use_reks board_use_rikku board_use_sarien board_use_scarlet board_use_soraka board_use_squawks board_use_stout board_use_stumpy board_use_sumo board_use_swanky board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_veyron_brain board_use_veyron_danger board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_minnie board_use_veyron_pinky board_use_veyron_romy board_use_volteer board_use_winky board_use_wolf board_use_zako board_use_zoombini board_use_zork cros_host unibuild
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/1.0.1-r169
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9bff841810a4c91f4329c7d78bd20197
diff --git a/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r229 b/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r229
new file mode 100644
index 0000000..2cef5c3
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/chromeos-bmpblk-1.0.1-r229
@@ -0,0 +1,13 @@
+BDEPEND=|| ( dev-lang/python:3.8 dev-lang/python:3.7 dev-lang/python:3.6 ) dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup unpack
+DEPEND=virtual/chromeos-vendor-strings
+DESCRIPTION=Chrome OS Firmware Bitmap Block
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/bmpblk/
+IUSE=detachable diag_payload +minidiag physical_presence_power physical_presence_recovery cros_host cros_workon_tree_2b1a4fe56d1866a885f2dc874205c305a708e0cc board_use_atlas board_use_auron_paine board_use_auron_yuna board_use_banjo board_use_buddy board_use_butterfly board_use_candy board_use_chell board_use_cid board_use_clapper board_use_cranky board_use_daisy board_use_daisy_snow board_use_daisy_spring board_use_daisy_skate board_use_dedede board_use_deltaur board_use_dragonegg board_use_drallion board_use_endeavour board_use_enguarde board_use_expresso board_use_eve board_use_falco board_use_fizz board_use_flapjack board_use_glados board_use_glimmer board_use_gnawty board_use_grunt board_use_guado board_use_hatch board_use_jacuzzi board_use_kalista board_use_kevin board_use_kip board_use_kukui board_use_lars board_use_leon board_use_link board_use_lulu board_use_lumpy board_use_mccloud board_use_meowth board_use_monroe board_use_mushu board_use_nami board_use_nautilus board_use_ninja board_use_nocturne board_use_nyan board_use_nyan_big board_use_octopus board_use_orco board_use_palkia board_use_panther board_use_parrot board_use_peach_pi board_use_peach_pit board_use_peppy board_use_poppy board_use_puff board_use_quawks board_use_rammus board_use_reks board_use_rikku board_use_sarien board_use_scarlet board_use_soraka board_use_squawks board_use_stout board_use_stumpy board_use_sumo board_use_swanky board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_veyron_brain board_use_veyron_danger board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_minnie board_use_veyron_pinky board_use_veyron_romy board_use_volteer board_use_winky board_use_wolf board_use_zako board_use_zoombini board_use_zork cros_host unibuild
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/1.0.1-r229
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=59bdb3393bacf8ef5d096e7d6522b631
diff --git a/metadata/md5-cache/sys-boot/chromeos-bmpblk-9999 b/metadata/md5-cache/sys-boot/chromeos-bmpblk-9999
index 0c320cc..b59c51c 100644
--- a/metadata/md5-cache/sys-boot/chromeos-bmpblk-9999
+++ b/metadata/md5-cache/sys-boot/chromeos-bmpblk-9999
@@ -4,10 +4,10 @@
 DESCRIPTION=Chrome OS Firmware Bitmap Block
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/bmpblk/
-IUSE=detachable menu_ui legacy_menu_ui diag_payload physical_presence_power physical_presence_recovery cros_host cros_workon_tree_ board_use_atlas board_use_auron_paine board_use_auron_yuna board_use_banjo board_use_buddy board_use_butterfly board_use_candy board_use_chell board_use_cid board_use_clapper board_use_cranky board_use_daisy board_use_daisy_snow board_use_daisy_spring board_use_daisy_skate board_use_dedede board_use_deltaur board_use_dragonegg board_use_drallion board_use_endeavour board_use_enguarde board_use_expresso board_use_eve board_use_falco board_use_fizz board_use_flapjack board_use_glados board_use_glimmer board_use_gnawty board_use_grunt board_use_guado board_use_hatch board_use_jacuzzi board_use_kalista board_use_kevin board_use_kip board_use_kukui board_use_lars board_use_leon board_use_link board_use_lulu board_use_lumpy board_use_mccloud board_use_meowth board_use_monroe board_use_mushu board_use_nami board_use_nautilus board_use_ninja board_use_nocturne board_use_nyan board_use_nyan_big board_use_octopus board_use_orco board_use_palkia board_use_panther board_use_parrot board_use_peach_pi board_use_peach_pit board_use_peppy board_use_poppy board_use_puff board_use_quawks board_use_rammus board_use_reks board_use_rikku board_use_sarien board_use_scarlet board_use_soraka board_use_squawks board_use_stout board_use_stumpy board_use_sumo board_use_swanky board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_veyron_brain board_use_veyron_danger board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_minnie board_use_veyron_pinky board_use_veyron_romy board_use_volteer board_use_winky board_use_wolf board_use_zako board_use_zoombini board_use_zork cros_host unibuild
+IUSE=detachable diag_payload +minidiag physical_presence_power physical_presence_recovery cros_host cros_workon_tree_ board_use_atlas board_use_auron_paine board_use_auron_yuna board_use_banjo board_use_buddy board_use_butterfly board_use_candy board_use_chell board_use_cid board_use_clapper board_use_cranky board_use_daisy board_use_daisy_snow board_use_daisy_spring board_use_daisy_skate board_use_dedede board_use_deltaur board_use_dragonegg board_use_drallion board_use_endeavour board_use_enguarde board_use_expresso board_use_eve board_use_falco board_use_fizz board_use_flapjack board_use_glados board_use_glimmer board_use_gnawty board_use_grunt board_use_guado board_use_hatch board_use_jacuzzi board_use_kalista board_use_kevin board_use_kip board_use_kukui board_use_lars board_use_leon board_use_link board_use_lulu board_use_lumpy board_use_mccloud board_use_meowth board_use_monroe board_use_mushu board_use_nami board_use_nautilus board_use_ninja board_use_nocturne board_use_nyan board_use_nyan_big board_use_octopus board_use_orco board_use_palkia board_use_panther board_use_parrot board_use_peach_pi board_use_peach_pit board_use_peppy board_use_poppy board_use_puff board_use_quawks board_use_rammus board_use_reks board_use_rikku board_use_sarien board_use_scarlet board_use_soraka board_use_squawks board_use_stout board_use_stumpy board_use_sumo board_use_swanky board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_veyron_brain board_use_veyron_danger board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_minnie board_use_veyron_pinky board_use_veyron_romy board_use_volteer board_use_winky board_use_wolf board_use_zako board_use_zoombini board_use_zork cros_host unibuild
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=84c4fbea93948d6b83b46b3d2394d083
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=4c0cd4b6d0f2e20fcb41bab2a99ece7c
diff --git a/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3 b/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3
index 6bf55bf..5ef911e 100644
--- a/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3
+++ b/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3
@@ -1,6 +1,6 @@
 BDEPEND=chromeos-base/vboot_reference
 DEFINED_PHASES=compile install
-DEPEND=zork? ( || ( sys-boot/coreboot:= sys-boot/coreboot-zork:= ) ) !zork? ( sys-boot/coreboot:= ) depthcharge? ( sys-boot/depthcharge:= ) bmpblk? ( sys-boot/chromeos-bmpblk:= ) tianocore? ( sys-boot/edk2:= ) seabios? ( sys-boot/chromeos-seabios:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) u-boot? ( sys-boot/u-boot:= ) cros_ec? ( chromeos-base/chromeos-ec:= ) pd_sync? ( chromeos-base/chromeos-ec:= )
+DEPEND=sys-boot/coreboot depthcharge? ( sys-boot/depthcharge:= ) bmpblk? ( sys-boot/chromeos-bmpblk:= ) tianocore? ( sys-boot/edk2:= ) seabios? ( sys-boot/chromeos-seabios:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) u-boot? ( sys-boot/u-boot:= ) cros_ec? ( chromeos-base/chromeos-ec:= ) pd_sync? ( chromeos-base/chromeos-ec:= )
 DESCRIPTION=ChromeOS firmware image builder
 EAPI=7
 HOMEPAGE=http://www.chromium.org
@@ -8,5 +8,5 @@
 KEYWORDS=*
 LICENSE=GPL-2
 SLOT=0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-unibuild	1705aff271243014135de65988f2348f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5e3f34c8b7251f495a6c4adc015aed27
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=79a512931b12081daea44f1bb31b8c79
diff --git a/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r78 b/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r78
deleted file mode 100644
index 6bf55bf..0000000
--- a/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r78
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=chromeos-base/vboot_reference
-DEFINED_PHASES=compile install
-DEPEND=zork? ( || ( sys-boot/coreboot:= sys-boot/coreboot-zork:= ) ) !zork? ( sys-boot/coreboot:= ) depthcharge? ( sys-boot/depthcharge:= ) bmpblk? ( sys-boot/chromeos-bmpblk:= ) tianocore? ( sys-boot/edk2:= ) seabios? ( sys-boot/chromeos-seabios:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) u-boot? ( sys-boot/u-boot:= ) cros_ec? ( chromeos-base/chromeos-ec:= ) pd_sync? ( chromeos-base/chromeos-ec:= )
-DESCRIPTION=ChromeOS firmware image builder
-EAPI=7
-HOMEPAGE=http://www.chromium.org
-IUSE=alex aplrvp atlas auron bayleybay beltino bolt butterfly chell cnlrvp coral cyan dedede deltaur dragonegg drallion emeraldlake2 eve endeavour falco fizz fox glados glkrvp grunt hatch jecht kalista kblrvp kunimitsu link lumpy lumpy64 mario meowth mushu nasher nami nautilus nocturne octopus palkia panther parrot peppy poppy puff pyro rambi rammus reef samus sand sarien sklrvp slippy snappy soraka squawks stout strago stumpy sumo volteer zoombini zork tglrvp diag_payload seabios wilco_ec fsp unibuild u-boot tianocore cros_ec pd_sync +bmpblk generated_cros_config ec_ro_sync +depthcharge cros-debug
-KEYWORDS=*
-LICENSE=GPL-2
-SLOT=0
-_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-unibuild	1705aff271243014135de65988f2348f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=5e3f34c8b7251f495a6c4adc015aed27
diff --git a/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r82 b/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r82
new file mode 100644
index 0000000..5ef911e
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/chromeos-bootimage-0.0.3-r82
@@ -0,0 +1,12 @@
+BDEPEND=chromeos-base/vboot_reference
+DEFINED_PHASES=compile install
+DEPEND=sys-boot/coreboot depthcharge? ( sys-boot/depthcharge:= ) bmpblk? ( sys-boot/chromeos-bmpblk:= ) tianocore? ( sys-boot/edk2:= ) seabios? ( sys-boot/chromeos-seabios:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) u-boot? ( sys-boot/u-boot:= ) cros_ec? ( chromeos-base/chromeos-ec:= ) pd_sync? ( chromeos-base/chromeos-ec:= )
+DESCRIPTION=ChromeOS firmware image builder
+EAPI=7
+HOMEPAGE=http://www.chromium.org
+IUSE=alex aplrvp atlas auron bayleybay beltino bolt butterfly chell cnlrvp coral cyan dedede deltaur dragonegg drallion emeraldlake2 eve endeavour falco fizz fox glados glkrvp grunt hatch jecht kalista kblrvp kunimitsu link lumpy lumpy64 mario meowth mushu nasher nami nautilus nocturne octopus palkia panther parrot peppy poppy puff pyro rambi rammus reef samus sand sarien sklrvp slippy snappy soraka squawks stout strago stumpy sumo volteer zoombini zork tglrvp diag_payload seabios wilco_ec fsp unibuild u-boot tianocore cros_ec pd_sync +bmpblk generated_cros_config ec_ro_sync +depthcharge cros-debug
+KEYWORDS=*
+LICENSE=GPL-2
+SLOT=0
+_eclasses_=cros-debug	d2750757005d6a444f8eb12bb9eb9944	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=79a512931b12081daea44f1bb31b8c79
diff --git a/metadata/md5-cache/sys-boot/chromeos-seabios-0.0.1-r88 b/metadata/md5-cache/sys-boot/chromeos-seabios-0.0.1-r88
index 3100521..1bcba65 100644
--- a/metadata/md5-cache/sys-boot/chromeos-seabios-0.0.1-r88
+++ b/metadata/md5-cache/sys-boot/chromeos-seabios-0.0.1-r88
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/0.0.1-r88
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f411830117b5bcf389767a6a5e26a71a
diff --git a/metadata/md5-cache/sys-boot/chromeos-seabios-9999 b/metadata/md5-cache/sys-boot/chromeos-seabios-9999
index 463a44b..d9b4ae4 100644
--- a/metadata/md5-cache/sys-boot/chromeos-seabios-9999
+++ b/metadata/md5-cache/sys-boot/chromeos-seabios-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b79e86b4dc6274be0a7928c36559cfd0
diff --git a/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3775 b/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3775
deleted file mode 100644
index d64604e..0000000
--- a/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3775
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup unpack
-DEPEND=!!sys-boot/coreboot-zork mtc? ( sys-boot/mtc:= ) virtual/coreboot-private-files bmpblk? ( sys-boot/chromeos-bmpblk:= ) intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= ) amd64? ( sys-boot/chromeos-mrc:= ) ) chipset_stoneyridge? ( sys-boot/amd-firmware:= ) chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= ) qca-framework? ( sys-boot/qca-framework:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
-DESCRIPTION=coreboot firmware
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma +bmpblk +intel_mrc qca-framework quiet unibuild verbose amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso generated_cros_config board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20_edc38485ad4fae9fb3fd2a1cdb1662f66cdec66d_82e77f6c98187361303fffeeba118a1a365e16d5_7db9c7a1387bc3ec0bc6b868709002e01536f5aa_a70c71fd96de5aadf2da61ffcfa2f9cde502052b_45d22a8711f85c4310c0c2121d3dc8a72793d375_c0433b88f972fa26dded401be022c1c026cd644e
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RESTRICT=strip
-SLOT=0/0.0.1-r3775
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=73d61f631fba706d8771c69c5a24a041
diff --git a/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3956 b/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3956
new file mode 100644
index 0000000..38b2ab1
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/coreboot-0.0.1-r3956
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install prepare setup unpack
+DEPEND=mtc? ( sys-boot/mtc:= ) virtual/coreboot-private-files bmpblk? ( sys-boot/chromeos-bmpblk:= ) intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= ) amd64? ( sys-boot/chromeos-mrc:= ) ) chipset_stoneyridge? ( sys-boot/amd-firmware:= ) chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= ) qca-framework? ( sys-boot/qca-framework:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
+DESCRIPTION=coreboot firmware
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma +bmpblk +intel_mrc qca-framework quiet unibuild verbose amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso generated_cros_config board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce_49214f6120941983c5ce7ffcf8745a80bdf52409_d011d454951af2d6dbcf7d4dc7af53a31cc883db_91e1fb678750ee8eb87ae5b06f6f94266e1e172d_8d8bb99f1cdba36cb07d90dd89bcfb25bae62437_45d22a8711f85c4310c0c2121d3dc8a72793d375_c0433b88f972fa26dded401be022c1c026cd644e
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RESTRICT=strip
+SLOT=0/0.0.1-r3956
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=10d775f07754bfba7f5488e749200f40
diff --git a/metadata/md5-cache/sys-boot/coreboot-9999 b/metadata/md5-cache/sys-boot/coreboot-9999
index fe0fb4b..b69f8ab 100644
--- a/metadata/md5-cache/sys-boot/coreboot-9999
+++ b/metadata/md5-cache/sys-boot/coreboot-9999
@@ -1,14 +1,14 @@
 BDEPEND=dev-vcs/git
 DEFINED_PHASES=compile info install prepare setup unpack
-DEPEND=!!sys-boot/coreboot-zork mtc? ( sys-boot/mtc:= ) virtual/coreboot-private-files bmpblk? ( sys-boot/chromeos-bmpblk:= ) intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= ) amd64? ( sys-boot/chromeos-mrc:= ) ) chipset_stoneyridge? ( sys-boot/amd-firmware:= ) chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= ) qca-framework? ( sys-boot/qca-framework:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
+DEPEND=mtc? ( sys-boot/mtc:= ) virtual/coreboot-private-files bmpblk? ( sys-boot/chromeos-bmpblk:= ) intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= ) amd64? ( sys-boot/chromeos-mrc:= ) ) chipset_stoneyridge? ( sys-boot/amd-firmware:= ) chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= ) qca-framework? ( sys-boot/qca-framework:= ) unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
 DESCRIPTION=coreboot firmware
 EAPI=7
 HOMEPAGE=http://www.coreboot.org
-IUSE=em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma +bmpblk +intel_mrc qca-framework quiet unibuild verbose amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso generated_cros_config board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_
+IUSE=em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma +bmpblk +intel_mrc qca-framework quiet unibuild verbose amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso generated_cros_config board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 RESTRICT=strip
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=9ee4e0853d4b1af365d773e933732012
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=166b94f560a3337c8393fd3edf758fc9
diff --git a/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3729 b/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3729
deleted file mode 100644
index dcb9621..0000000
--- a/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3729
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-embedded/coreboot-sdk:= dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=sys-boot/libpayload:=
-DESCRIPTION=coreboot's coreinfo payload
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20
-KEYWORDS=-* amd64 x86
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r3729
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=303ec75186927df640d7984f218ea971
diff --git a/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3818 b/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3818
new file mode 100644
index 0000000..fe69de6
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/coreinfo-0.0.1-r3818
@@ -0,0 +1,13 @@
+BDEPEND=dev-embedded/coreboot-sdk:= dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=sys-boot/libpayload:=
+DESCRIPTION=coreboot's coreinfo payload
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce
+KEYWORDS=-* amd64 x86
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r3818
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fe538dbbae2c3c46379bdaf419db3194
diff --git a/metadata/md5-cache/sys-boot/coreinfo-9999 b/metadata/md5-cache/sys-boot/coreinfo-9999
index 6a9d3ee..f671c4d 100644
--- a/metadata/md5-cache/sys-boot/coreinfo-9999
+++ b/metadata/md5-cache/sys-boot/coreinfo-9999
@@ -9,5 +9,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=a9abeaa14c4f5a4eaf26ac719a4b2a1d
diff --git a/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r2903 b/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r2903
deleted file mode 100644
index 9042a124..0000000
--- a/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r2903
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DEPEND=chromeos-base/chromeos-ec-headers:= sys-boot/libpayload:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
-DESCRIPTION=coreboot's depthcharge payload
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync unibuild verbose debug generated_cros_config physical_presence_power physical_presence_recovery cros_host cros_workon_tree_613d96494258891691706f77d9204703641699a8_82e77f6c98187361303fffeeba118a1a365e16d5 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r2903
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=bd429db51d5fc88954ba31fdc95ed652
diff --git a/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r3050 b/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r3050
new file mode 100644
index 0000000..3f4defd
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/depthcharge-0.0.1-r3050
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DEPEND=chromeos-base/chromeos-ec-headers:= sys-boot/libpayload:= unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
+DESCRIPTION=coreboot's depthcharge payload
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync unibuild verbose debug generated_cros_config +minidiag physical_presence_power physical_presence_recovery cros_host cros_workon_tree_7d1ca6d913626289803d75b68c87813ae284534b_d011d454951af2d6dbcf7d4dc7af53a31cc883db board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r3050
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cc193a46fcd36114d418d7ea82459840
diff --git a/metadata/md5-cache/sys-boot/depthcharge-9999 b/metadata/md5-cache/sys-boot/depthcharge-9999
index 6b054d8..5457a6a 100644
--- a/metadata/md5-cache/sys-boot/depthcharge-9999
+++ b/metadata/md5-cache/sys-boot/depthcharge-9999
@@ -4,10 +4,10 @@
 DESCRIPTION=coreboot's depthcharge payload
 EAPI=7
 HOMEPAGE=http://www.coreboot.org
-IUSE=detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync unibuild verbose debug generated_cros_config physical_presence_power physical_presence_recovery cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
+IUSE=detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync unibuild verbose debug generated_cros_config +minidiag physical_presence_power physical_presence_recovery cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=65440ebb7eed855c13fdea59eae6625f
+_eclasses_=cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=44ffa24942785c22942159f3da004752
diff --git a/metadata/md5-cache/sys-boot/edk2-0.0.1-r35 b/metadata/md5-cache/sys-boot/edk2-0.0.1-r35
index a1ccbe0..b3d6111 100644
--- a/metadata/md5-cache/sys-boot/edk2-0.0.1-r35
+++ b/metadata/md5-cache/sys-boot/edk2-0.0.1-r35
@@ -9,5 +9,5 @@
 PROPERTIES=live
 SLOT=0/0.0.1-r35
 SRC_URI=https://www.openssl.org/source/openssl-1.1.0e.tar.gz
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=89595e89e2f9d16cf592b4d5dd6196bd
diff --git a/metadata/md5-cache/sys-boot/edk2-9999 b/metadata/md5-cache/sys-boot/edk2-9999
index 97a511b..286984a 100644
--- a/metadata/md5-cache/sys-boot/edk2-9999
+++ b/metadata/md5-cache/sys-boot/edk2-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 SLOT=0/9999
 SRC_URI=https://www.openssl.org/source/openssl-1.1.0e.tar.gz
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b4df054c018d5a9bfc86bbf7d15e669d
diff --git a/metadata/md5-cache/sys-boot/grub-2.02-r2 b/metadata/md5-cache/sys-boot/grub-2.02-r3
similarity index 100%
rename from metadata/md5-cache/sys-boot/grub-2.02-r2
rename to metadata/md5-cache/sys-boot/grub-2.02-r3
diff --git a/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3793 b/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3793
deleted file mode 100644
index f80f6ec..0000000
--- a/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3793
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=coreboot's libpayload library
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=coreboot-sdk verbose cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r3793
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d7688faf638ad9b025499539cad0907d
diff --git a/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3884 b/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3884
new file mode 100644
index 0000000..5a3f840
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/libpayload-0.0.1-r3884
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=coreboot's libpayload library
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=coreboot-sdk verbose cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r3884
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=28ce4b701a368c29e10b9e5733a1aa52
diff --git a/metadata/md5-cache/sys-boot/libpayload-9999 b/metadata/md5-cache/sys-boot/libpayload-9999
index ff99d8f..5a69454 100644
--- a/metadata/md5-cache/sys-boot/libpayload-9999
+++ b/metadata/md5-cache/sys-boot/libpayload-9999
@@ -3,10 +3,10 @@
 DESCRIPTION=coreboot's libpayload library
 EAPI=7
 HOMEPAGE=http://www.coreboot.org
-IUSE=coreboot-sdk verbose cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild
+IUSE=coreboot-sdk verbose cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e24c856e0607a5b98b9977fab24056a5
diff --git a/metadata/md5-cache/sys-boot/u-boot-2020.01-r2738 b/metadata/md5-cache/sys-boot/u-boot-2020.01-r2738
deleted file mode 100644
index bdabb2b..0000000
--- a/metadata/md5-cache/sys-boot/u-boot-2020.01-r2738
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile configure info install setup unpack
-DEPEND=sandbox? ( media-libs/libsdl:= )
-DESCRIPTION=Das U-Boot boot loader
-EAPI=7
-HOMEPAGE=http://www.denx.de/wiki/U-Boot
-IUSE=dev generated_cros_config sandbox unibuild vboot werror cros_host cros_workon_tree_856ab4444636080a5ff52fff0fd34c7be0288048_82e77f6c98187361303fffeeba118a1a365e16d5
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=sandbox? ( media-libs/libsdl:= ) chromeos-base/u-boot-scripts !!sys-boot/chromeos-u-boot unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
-SLOT=0/2020.01-r2738
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cebd75e2f3fd707f2fdc6f4f03a4c7d1
diff --git a/metadata/md5-cache/sys-boot/u-boot-2020.10-r2791 b/metadata/md5-cache/sys-boot/u-boot-2020.10-r2791
new file mode 100644
index 0000000..6c44558
--- /dev/null
+++ b/metadata/md5-cache/sys-boot/u-boot-2020.10-r2791
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile configure info install setup unpack
+DEPEND=sandbox? ( media-libs/libsdl:= )
+DESCRIPTION=Das U-Boot boot loader
+EAPI=7
+HOMEPAGE=http://www.denx.de/wiki/U-Boot
+IUSE=dev generated_cros_config sandbox unibuild vboot werror cros_host cros_workon_tree_35ebd6a3b5d8c89eb1cdc4d68b8ad69c0c8dd8be_d011d454951af2d6dbcf7d4dc7af53a31cc883db
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=sandbox? ( media-libs/libsdl:= ) chromeos-base/u-boot-scripts !!sys-boot/chromeos-u-boot unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
+SLOT=0/2020.10-r2791
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=30d651053616ba0e9f1b821a79c88bed
diff --git a/metadata/md5-cache/sys-boot/u-boot-9999 b/metadata/md5-cache/sys-boot/u-boot-9999
index 38a456b..38d27c9 100644
--- a/metadata/md5-cache/sys-boot/u-boot-9999
+++ b/metadata/md5-cache/sys-boot/u-boot-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=sandbox? ( media-libs/libsdl:= ) chromeos-base/u-boot-scripts !!sys-boot/chromeos-u-boot unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) )
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=0f5634d7606d2cd93e630c41d6727436
diff --git a/metadata/md5-cache/sys-devel/arc-build-0.0.3-r14 b/metadata/md5-cache/sys-devel/arc-build-0.0.3-r16
similarity index 100%
rename from metadata/md5-cache/sys-devel/arc-build-0.0.3-r14
rename to metadata/md5-cache/sys-devel/arc-build-0.0.3-r16
diff --git a/metadata/md5-cache/sys-devel/arc-cache-builder-0.6.3-r1 b/metadata/md5-cache/sys-devel/arc-cache-builder-0.6.3-r1
deleted file mode 100644
index 19ef3c1..0000000
--- a/metadata/md5-cache/sys-devel/arc-cache-builder-0.6.3-r1
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Ebuild which pulls in java library arc-cache-builder.jar
-EAPI=5
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/arc-cache-builder-0.6.3.tbz2
-_md5_=f4a9f92f2a28e40c13bf869fe23c45e1
diff --git a/metadata/md5-cache/sys-devel/arc-llvm-8.0.1 b/metadata/md5-cache/sys-devel/arc-llvm-8.0.1
index 4087ad8..366dda0 100644
--- a/metadata/md5-cache/sys-devel/arc-llvm-8.0.1
+++ b/metadata/md5-cache/sys-devel/arc-llvm-8.0.1
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=8
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/llvm-8.0.1.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-8.0.1-manpages.tar.bz2 )
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=6e960f142bb228b26692862a2d36636b
diff --git a/metadata/md5-cache/sys-devel/arc-llvm-8.0.1-r3 b/metadata/md5-cache/sys-devel/arc-llvm-8.0.1-r3
index 4087ad8..366dda0 100644
--- a/metadata/md5-cache/sys-devel/arc-llvm-8.0.1-r3
+++ b/metadata/md5-cache/sys-devel/arc-llvm-8.0.1-r3
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=8
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/llvm-8.0.1.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-8.0.1-manpages.tar.bz2 )
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=6e960f142bb228b26692862a2d36636b
diff --git a/metadata/md5-cache/sys-devel/arc-llvm-9.0.0 b/metadata/md5-cache/sys-devel/arc-llvm-9.0.0
index a4eb2a1..028d274 100644
--- a/metadata/md5-cache/sys-devel/arc-llvm-9.0.0
+++ b/metadata/md5-cache/sys-devel/arc-llvm-9.0.0
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=9
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.0/llvm-9.0.0.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-9.0.0-manpages.tar.bz2 )
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=e9b0a287da74b930e742827ee2723257
diff --git a/metadata/md5-cache/sys-devel/arc-llvm-9.0.0-r1 b/metadata/md5-cache/sys-devel/arc-llvm-9.0.0-r1
index a4eb2a1..028d274 100644
--- a/metadata/md5-cache/sys-devel/arc-llvm-9.0.0-r1
+++ b/metadata/md5-cache/sys-devel/arc-llvm-9.0.0-r1
@@ -11,5 +11,5 @@
 RESTRICT=!test? ( test )
 SLOT=9
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.0/llvm-9.0.0.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-9.0.0-manpages.tar.bz2 )
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=e9b0a287da74b930e742827ee2723257
diff --git a/metadata/md5-cache/sys-devel/arc-toolchain-r-2020.07.10 b/metadata/md5-cache/sys-devel/arc-toolchain-r-2020.07.10
new file mode 100644
index 0000000..d152521
--- /dev/null
+++ b/metadata/md5-cache/sys-devel/arc-toolchain-r-2020.07.10
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=Ebuild for Android toolchain (compilers, linker, libraries, headers).
+EAPI=5
+KEYWORDS=-* amd64
+LICENSE=GPL-3 LGPL-3 GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 FDL-1.2 UoI-NCSA
+RESTRICT=strip
+SLOT=0
+SRC_URI=http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/arc-toolchain-r-2020.07.10.tar.gz
+_md5_=70f751e0f0be6b7fbdea5496670d4c23
diff --git a/metadata/md5-cache/sys-devel/binutils-2.27.0-r23 b/metadata/md5-cache/sys-devel/binutils-2.27.0-r23
index 00fce18..45fa02f 100644
--- a/metadata/md5-cache/sys-devel/binutils-2.27.0-r23
+++ b/metadata/md5-cache/sys-devel/binutils-2.27.0-r23
@@ -12,5 +12,5 @@
 REQUIRED_USE=next_binutils? ( !prev_binutils )
 RESTRICT=fetch test
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnuconfig	9200bfc8e0184357abfb86a08edd4fc3	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnuconfig	9200bfc8e0184357abfb86a08edd4fc3	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=53def46e4b5e4b9f44e4c2e01a628265
diff --git a/metadata/md5-cache/sys-devel/binutils-9999 b/metadata/md5-cache/sys-devel/binutils-9999
index 33ce53a..1efaff5 100644
--- a/metadata/md5-cache/sys-devel/binutils-9999
+++ b/metadata/md5-cache/sys-devel/binutils-9999
@@ -12,5 +12,5 @@
 REQUIRED_USE=next_binutils? ( !prev_binutils )
 RESTRICT=fetch test
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnuconfig	9200bfc8e0184357abfb86a08edd4fc3	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	gnuconfig	9200bfc8e0184357abfb86a08edd4fc3	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=9d765d86ccb55e99a89d897db6db3d99
diff --git a/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r2 b/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r2
deleted file mode 100644
index e5a3674..0000000
--- a/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r2
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Ebuild which pulls in binaries of dex2oatds
-EAPI=5
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/dex2oatds-0.0.1.tbz2 gs://chromeos-localmirror/distfiles/dex2oatds-0.0.1-pi.tbz2
-_md5_=faa9f56cb7e3560e16dd6d87275fcb94
diff --git a/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r3 b/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r3
new file mode 100644
index 0000000..bfc56e3
--- /dev/null
+++ b/metadata/md5-cache/sys-devel/dex2oatds-0.0.1-r3
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=Ebuild which pulls in binaries of dex2oatds
+EAPI=5
+KEYWORDS=*
+LICENSE=BSD-Google
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/dex2oatds-0.0.1.tbz2 gs://chromeos-localmirror/distfiles/dex2oatds-0.0.1-pi.tbz2 gs://chromeos-localmirror/distfiles/dex2oatds-0.0.1-rvc.tbz2
+_md5_=f86b8de514ab4bfffeeccb9907c42400
diff --git a/metadata/md5-cache/sys-devel/gcc-4.9.2-r253 b/metadata/md5-cache/sys-devel/gcc-4.9.2-r253
deleted file mode 100644
index 687d912..0000000
--- a/metadata/md5-cache/sys-devel/gcc-4.9.2-r253
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=sys-devel/binutils dev-vcs/git
-DEFINED_PHASES=compile configure info install postinst postrm setup unpack
-DEPEND=>=sys-libs/zlib-1.1.4 >=sys-devel/gcc-config-1.6 virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpc-0.8.1 >=dev-libs/mpfr-2.4.2 graphite? ( >=dev-libs/cloog-0.18.0 >=dev-libs/isl-0.11.1 ) test? ( >=dev-util/dejagnu-1.4.4 >=sys-devel/autogen-5.5.4 ) >=sys-apps/texinfo-4.8 >=sys-devel/bison-1.875
-DESCRIPTION=The GNU Compiler Collection. Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking. This Compiler is based off of Crosstoolv14.
-EAPI=7
-IUSE=gcc_repo gcj git_gcc go graphite gtk hardened hardfp llvm-next llvm-tot mounted_gcc multilib nls cxx openmp test tests +thumb upstream_gcc vanilla vtable_verify +wrapper_ccache next_gcc prev_gcc cros_host cros_workon_tree_aff2e49c815be09f20e4346cc98144b604388cb7
-KEYWORDS=*
-LICENSE=GPL-3 LGPL-3 || ( GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2
-PDEPEND=>=sys-devel/gcc-config-1.7
-PROPERTIES=live
-RDEPEND=>=sys-libs/zlib-1.1.4 >=sys-devel/gcc-config-1.6 virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpc-0.8.1 >=dev-libs/mpfr-2.4.2 graphite? ( >=dev-libs/cloog-0.18.0 >=dev-libs/isl-0.11.1 )
-REQUIRED_USE=next_gcc? ( !prev_gcc )
-RESTRICT=mirror strip
-SLOT=x86_64-pc-linux-gnu
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c41eaa95ce4ba2c67fb028bf45504d6f
diff --git a/metadata/md5-cache/sys-devel/gcc-4.9.2-r268 b/metadata/md5-cache/sys-devel/gcc-4.9.2-r268
new file mode 100644
index 0000000..daab168
--- /dev/null
+++ b/metadata/md5-cache/sys-devel/gcc-4.9.2-r268
@@ -0,0 +1,16 @@
+BDEPEND=sys-devel/binutils dev-vcs/git
+DEFINED_PHASES=compile configure info install postinst postrm setup unpack
+DEPEND=>=sys-libs/zlib-1.1.4 >=sys-devel/gcc-config-1.6 virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpc-0.8.1 >=dev-libs/mpfr-2.4.2 graphite? ( >=dev-libs/cloog-0.18.0 >=dev-libs/isl-0.11.1 ) test? ( >=dev-util/dejagnu-1.4.4 >=sys-devel/autogen-5.5.4 ) >=sys-apps/texinfo-4.8 >=sys-devel/bison-1.875
+DESCRIPTION=The GNU Compiler Collection. Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking. This Compiler is based off of Crosstoolv14.
+EAPI=7
+IUSE=gcc_repo gcj git_gcc go graphite gtk hardened hardfp llvm-next llvm-tot mounted_gcc multilib nls cxx openmp test tests +thumb upstream_gcc vanilla vtable_verify +wrapper_ccache next_gcc prev_gcc cros_host cros_workon_tree_aff2e49c815be09f20e4346cc98144b604388cb7
+KEYWORDS=*
+LICENSE=GPL-3 LGPL-3 libgcc FDL-1.2
+PDEPEND=>=sys-devel/gcc-config-1.7
+PROPERTIES=live
+RDEPEND=>=sys-libs/zlib-1.1.4 >=sys-devel/gcc-config-1.6 virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpc-0.8.1 >=dev-libs/mpfr-2.4.2 graphite? ( >=dev-libs/cloog-0.18.0 >=dev-libs/isl-0.11.1 )
+REQUIRED_USE=next_gcc? ( !prev_gcc )
+RESTRICT=mirror strip
+SLOT=x86_64-pc-linux-gnu
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cd4d161b2450a448b7f076181b7b711d
diff --git a/metadata/md5-cache/sys-devel/gcc-9999 b/metadata/md5-cache/sys-devel/gcc-9999
index 1abae5f..c48fe16 100644
--- a/metadata/md5-cache/sys-devel/gcc-9999
+++ b/metadata/md5-cache/sys-devel/gcc-9999
@@ -5,12 +5,12 @@
 EAPI=7
 IUSE=gcc_repo gcj git_gcc go graphite gtk hardened hardfp llvm-next llvm-tot mounted_gcc multilib nls cxx openmp test tests +thumb upstream_gcc vanilla vtable_verify +wrapper_ccache next_gcc prev_gcc cros_host cros_workon_tree_
 KEYWORDS=~*
-LICENSE=GPL-3 LGPL-3 || ( GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2
+LICENSE=GPL-3 LGPL-3 libgcc FDL-1.2
 PDEPEND=>=sys-devel/gcc-config-1.7
 PROPERTIES=live
 RDEPEND=>=sys-libs/zlib-1.1.4 >=sys-devel/gcc-config-1.6 virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpc-0.8.1 >=dev-libs/mpfr-2.4.2 graphite? ( >=dev-libs/cloog-0.18.0 >=dev-libs/isl-0.11.1 )
 REQUIRED_USE=next_gcc? ( !prev_gcc )
 RESTRICT=mirror strip
 SLOT=x86_64-pc-linux-gnu
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=603f0aedf9f3c214d0cc91697151c4f8
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=b7b8a9a8df0ceb6f384c7a46ff053729
diff --git a/metadata/md5-cache/sys-devel/gdb-8.3.20191215 b/metadata/md5-cache/sys-devel/gdb-8.3.20191215
index 8d98cf7..7943297 100644
--- a/metadata/md5-cache/sys-devel/gdb-8.3.20191215
+++ b/metadata/md5-cache/sys-devel/gdb-8.3.20191215
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure install postinst prepare setup test unpack
-DEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) xml? ( dev-libs/expat ) sys-libs/zlib ) app-arch/xz-utils sys-apps/texinfo client? ( >=sys-libs/ncurses-5.2-r2:0= virtual/yacc test? ( dev-util/dejagnu ) nls? ( sys-devel/gettext ) )
+DEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) xml? ( dev-libs/expat ) sys-libs/zlib ) app-arch/xz-utils sys-apps/texinfo client? ( >=sys-libs/ncurses-5.2-r2:0= virtual/yacc test? ( dev-util/dejagnu ) nls? ( sys-devel/gettext ) )
 DESCRIPTION=GNU debugger
 EAPI=5
 HOMEPAGE=https://sourceware.org/gdb/
-IUSE=+client lzma mounted_sources multitarget nls +python +server test vanilla xml python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=+client lzma mounted_sources multitarget nls +python +server test vanilla xml python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=GPL-2 LGPL-2
-RDEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) xml? ( dev-libs/expat ) sys-libs/zlib )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) ) || ( client server )
+RDEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) xml? ( dev-libs/expat ) sys-libs/zlib )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) ) || ( client server )
 SLOT=0
 SRC_URI=https://android.googlesource.com/toolchain/gdb/+archive/4d64623fc5a88a041fbb0ad5f4ad9d65cb0d4b47.tar.gz -> gdb-8.3.20191215.tar.gz
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=e451a3d00eaeabad096d02ce65545b6b
diff --git a/metadata/md5-cache/sys-devel/gdb-8.3.20191215-r2 b/metadata/md5-cache/sys-devel/gdb-8.3.20191215-r2
index 8d98cf7..7943297 100644
--- a/metadata/md5-cache/sys-devel/gdb-8.3.20191215-r2
+++ b/metadata/md5-cache/sys-devel/gdb-8.3.20191215-r2
@@ -1,14 +1,14 @@
 DEFINED_PHASES=configure install postinst prepare setup test unpack
-DEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) xml? ( dev-libs/expat ) sys-libs/zlib ) app-arch/xz-utils sys-apps/texinfo client? ( >=sys-libs/ncurses-5.2-r2:0= virtual/yacc test? ( dev-util/dejagnu ) nls? ( sys-devel/gettext ) )
+DEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) xml? ( dev-libs/expat ) sys-libs/zlib ) app-arch/xz-utils sys-apps/texinfo client? ( >=sys-libs/ncurses-5.2-r2:0= virtual/yacc test? ( dev-util/dejagnu ) nls? ( sys-devel/gettext ) )
 DESCRIPTION=GNU debugger
 EAPI=5
 HOMEPAGE=https://sourceware.org/gdb/
-IUSE=+client lzma mounted_sources multitarget nls +python +server test vanilla xml python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=+client lzma mounted_sources multitarget nls +python +server test vanilla xml python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=GPL-2 LGPL-2
-RDEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] ) xml? ( dev-libs/expat ) sys-libs/zlib )
-REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) python_single_target_python2_7? ( python_targets_python2_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) ) || ( client server )
+RDEPEND=server? ( !dev-util/gdbserver ) client? ( sys-libs/readline:0= lzma? ( app-arch/xz-utils ) python? ( python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) ) xml? ( dev-libs/expat ) sys-libs/zlib )
+REQUIRED_USE=python? ( ^^ ( python_single_target_python2_7 python_single_target_python3_6 ) ) || ( client server )
 SLOT=0
 SRC_URI=https://android.googlesource.com/toolchain/gdb/+archive/4d64623fc5a88a041fbb0ad5f4ad9d65cb0d4b47.tar.gz -> gdb-8.3.20191215.tar.gz
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=e451a3d00eaeabad096d02ce65545b6b
diff --git a/metadata/md5-cache/sys-devel/grit-i18n-20200210 b/metadata/md5-cache/sys-devel/grit-i18n-20200210
index 1c10e89..764b065 100644
--- a/metadata/md5-cache/sys-devel/grit-i18n-20200210
+++ b/metadata/md5-cache/sys-devel/grit-i18n-20200210
@@ -1,14 +1,14 @@
 DEFINED_PHASES=install setup
-DEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
+DEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] )
 DESCRIPTION=GRIT - Google Resource and Internationalization Tool
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromium/src/tools/grit/
-IUSE=python_targets_python3_6 python_targets_python3_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=*
 LICENSE=BSD-2
-RDEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
-REQUIRED_USE=^^ ( python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 )
+RDEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] )
+REQUIRED_USE=^^ ( python_single_target_python3_6 python_single_target_python3_7 )
 SLOT=0
 SRC_URI=gs://chromeos-localmirror/distfiles/grit-i18n-73253b76da834152a7cfa76f6b4208694febf4d5.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=53ee8dbc526c1154267d1868019ca597
diff --git a/metadata/md5-cache/sys-devel/grit-i18n-20200210-r1 b/metadata/md5-cache/sys-devel/grit-i18n-20200210-r1
index 1c10e89..764b065 100644
--- a/metadata/md5-cache/sys-devel/grit-i18n-20200210-r1
+++ b/metadata/md5-cache/sys-devel/grit-i18n-20200210-r1
@@ -1,14 +1,14 @@
 DEFINED_PHASES=install setup
-DEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
+DEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] )
 DESCRIPTION=GRIT - Google Resource and Internationalization Tool
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromium/src/tools/grit/
-IUSE=python_targets_python3_6 python_targets_python3_7 python_single_target_python3_6 python_single_target_python3_7
+IUSE=python_single_target_python3_6 python_single_target_python3_7
 KEYWORDS=*
 LICENSE=BSD-2
-RDEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 ) python_single_target_python3_7? ( dev-lang/python:3.7 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?,python_single_target_python3_7(+)?]
-REQUIRED_USE=^^ ( python_single_target_python3_6 python_single_target_python3_7 ) python_single_target_python3_6? ( python_targets_python3_6 ) python_single_target_python3_7? ( python_targets_python3_7 )
+RDEPEND=python_single_target_python3_6? ( dev-lang/python:3.6 >=dev-lang/python-exec-2:=[python_targets_python3_6] ) python_single_target_python3_7? ( dev-lang/python:3.7 >=dev-lang/python-exec-2:=[python_targets_python3_7] )
+REQUIRED_USE=^^ ( python_single_target_python3_6 python_single_target_python3_7 )
 SLOT=0
 SRC_URI=gs://chromeos-localmirror/distfiles/grit-i18n-73253b76da834152a7cfa76f6b4208694febf4d5.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=53ee8dbc526c1154267d1868019ca597
diff --git a/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618 b/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618
deleted file mode 100644
index 8312155..0000000
--- a/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install postinst postrm prepare setup test unpack
-DEPEND=sys-libs/zlib:0= libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) dev-lang/perl >=sys-devel/make-3.81 >=sys-devel/flex-2.5.4 >=sys-devel/bison-1.875d || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5 ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx ) ) || ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-5.1 ) doc? ( dev-python/sphinx ) libffi? ( virtual/pkgconfig ) !!<dev-python/configparser-3.3.0.2 ocaml? ( test? ( dev-ml/ounit ) ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=Low Level Virtual Machine
-EAPI=6
-HOMEPAGE=http://llvm.org/
-IUSE=debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt llvm-next llvm_pgo_generate llvm_pgo_use llvm-next_pgo_use llvm-tot multitarget ncurses ocaml python test +thinlto xml video_cards_radeon abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python3_6 +python_single_target_python3_6
-KEYWORDS=-* amd64
-LICENSE=UoI-NCSA
-PROPERTIES=live live
-RDEPEND=sys-libs/zlib:0= libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<=sys-devel/llvm-8.0_pre !sys-devel/lld !sys-devel/clang
-REQUIRED_USE=^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 ) llvm_pgo_generate? ( !llvm_pgo_use )
-SLOT=8
-SRC_URI=!llvm-tot? ( !llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-b726d071b4aa46004228fc38ee5bfd167f999bfe.tar.xz ) ) llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-b726d071b4aa46004228fc38ee5bfd167f999bfe.tar.xz ) ) )
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=9ed311775a86dbcb7e9805b64f2d9c00
diff --git a/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618-r2 b/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618-r2
deleted file mode 100644
index 8312155..0000000
--- a/metadata/md5-cache/sys-devel/llvm-11.0_pre394483_p20200618-r2
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install postinst postrm prepare setup test unpack
-DEPEND=sys-libs/zlib:0= libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) dev-lang/perl >=sys-devel/make-3.81 >=sys-devel/flex-2.5.4 >=sys-devel/bison-1.875d || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5 ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx ) ) || ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-5.1 ) doc? ( dev-python/sphinx ) libffi? ( virtual/pkgconfig ) !!<dev-python/configparser-3.3.0.2 ocaml? ( test? ( dev-ml/ounit ) ) python_single_target_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python3_6(+)?] dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=Low Level Virtual Machine
-EAPI=6
-HOMEPAGE=http://llvm.org/
-IUSE=debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt llvm-next llvm_pgo_generate llvm_pgo_use llvm-next_pgo_use llvm-tot multitarget ncurses ocaml python test +thinlto xml video_cards_radeon abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64 +python_targets_python3_6 +python_single_target_python3_6
-KEYWORDS=-* amd64
-LICENSE=UoI-NCSA
-PROPERTIES=live live
-RDEPEND=sys-libs/zlib:0= libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<=sys-devel/llvm-8.0_pre !sys-devel/lld !sys-devel/clang
-REQUIRED_USE=^^ ( python_single_target_python3_6 ) python_single_target_python3_6? ( python_targets_python3_6 ) llvm_pgo_generate? ( !llvm_pgo_use )
-SLOT=8
-SRC_URI=!llvm-tot? ( !llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-b726d071b4aa46004228fc38ee5bfd167f999bfe.tar.xz ) ) llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-b726d071b4aa46004228fc38ee5bfd167f999bfe.tar.xz ) ) )
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=9ed311775a86dbcb7e9805b64f2d9c00
diff --git a/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824 b/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824
new file mode 100644
index 0000000..fd6b1f5
--- /dev/null
+++ b/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824
@@ -0,0 +1,16 @@
+BDEPEND=dev-lang/perl libffi? ( virtual/pkgconfig ) sys-devel/gnuconfig || ( ( dev-lang/python:3.9 dev-python/sphinx[python_targets_python3_9(-),python_single_target_python3_9(+)] doc? ( dev-python/recommonmark[python_targets_python3_9(-),python_single_target_python3_9(+)] ) ) ( dev-lang/python:3.8 dev-python/sphinx[python_targets_python3_8(-),python_single_target_python3_8(+)] doc? ( dev-python/recommonmark[python_targets_python3_8(-),python_single_target_python3_8(+)] ) ) ( dev-lang/python:3.7 dev-python/sphinx[python_targets_python3_7(-),python_single_target_python3_7(+)] doc? ( dev-python/recommonmark[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ) ( dev-lang/python:3.6 dev-python/sphinx[python_targets_python3_6(-),python_single_target_python3_6(+)] doc? ( dev-python/recommonmark[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ) ) dev-util/ninja dev-util/cmake >=dev-vcs/git-1.8.2.1[curl]
+DEFINED_PHASES=compile configure install postinst postrm prepare setup test unpack
+DEPEND=sys-libs/zlib:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) sys-devel/binutils ocaml? ( test? ( dev-ml/ounit ) )
+DESCRIPTION=Low Level Virtual Machine
+EAPI=7
+HOMEPAGE=http://llvm.org/
+IUSE=debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt llvm-next llvm_pgo_generate +llvm_pgo_use llvm-next_pgo_use llvm-tot multitarget ncurses ocaml test +thinlto xml video_cards_radeon abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=-* amd64
+LICENSE=UoI-NCSA
+PROPERTIES=live
+RDEPEND=sys-libs/zlib:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<=sys-devel/llvm-8.0_pre !sys-devel/lld !sys-devel/clang
+REQUIRED_USE=llvm_pgo_generate? ( !llvm_pgo_use )
+SLOT=8
+SRC_URI=!llvm-tot? ( !llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-83080a294ad7d145d758821bcf4354ad0cb7d299.tar.xz ) ) llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-83080a294ad7d145d758821bcf4354ad0cb7d299.tar.xz ) ) )
+_eclasses_=cmake	b22e256fd899c7e0c747e8834eff121a	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=0c6f9e56fa01699fc85c6e75c1b1932d
diff --git a/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824-r6 b/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824-r6
new file mode 100644
index 0000000..fd6b1f5
--- /dev/null
+++ b/metadata/md5-cache/sys-devel/llvm-11.0_pre399094_p20200824-r6
@@ -0,0 +1,16 @@
+BDEPEND=dev-lang/perl libffi? ( virtual/pkgconfig ) sys-devel/gnuconfig || ( ( dev-lang/python:3.9 dev-python/sphinx[python_targets_python3_9(-),python_single_target_python3_9(+)] doc? ( dev-python/recommonmark[python_targets_python3_9(-),python_single_target_python3_9(+)] ) ) ( dev-lang/python:3.8 dev-python/sphinx[python_targets_python3_8(-),python_single_target_python3_8(+)] doc? ( dev-python/recommonmark[python_targets_python3_8(-),python_single_target_python3_8(+)] ) ) ( dev-lang/python:3.7 dev-python/sphinx[python_targets_python3_7(-),python_single_target_python3_7(+)] doc? ( dev-python/recommonmark[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ) ( dev-lang/python:3.6 dev-python/sphinx[python_targets_python3_6(-),python_single_target_python3_6(+)] doc? ( dev-python/recommonmark[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ) ) dev-util/ninja dev-util/cmake >=dev-vcs/git-1.8.2.1[curl]
+DEFINED_PHASES=compile configure install postinst postrm prepare setup test unpack
+DEPEND=sys-libs/zlib:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) sys-devel/binutils ocaml? ( test? ( dev-ml/ounit ) )
+DESCRIPTION=Low Level Virtual Machine
+EAPI=7
+HOMEPAGE=http://llvm.org/
+IUSE=debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt llvm-next llvm_pgo_generate +llvm_pgo_use llvm-next_pgo_use llvm-tot multitarget ncurses ocaml test +thinlto xml video_cards_radeon abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=-* amd64
+LICENSE=UoI-NCSA
+PROPERTIES=live
+RDEPEND=sys-libs/zlib:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] libedit? ( dev-libs/libedit:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libffi? ( >=virtual/libffi-3.0.13-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ocaml? ( >=dev-lang/ocaml-4.00.0:0= dev-ml/findlib dev-ml/ocaml-ctypes ) abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<=sys-devel/llvm-8.0_pre !sys-devel/lld !sys-devel/clang
+REQUIRED_USE=llvm_pgo_generate? ( !llvm_pgo_use )
+SLOT=8
+SRC_URI=!llvm-tot? ( !llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-83080a294ad7d145d758821bcf4354ad0cb7d299.tar.xz ) ) llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-83080a294ad7d145d758821bcf4354ad0cb7d299.tar.xz ) ) )
+_eclasses_=cmake	b22e256fd899c7e0c747e8834eff121a	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=0c6f9e56fa01699fc85c6e75c1b1932d
diff --git a/metadata/md5-cache/sys-devel/llvm-9.0.0 b/metadata/md5-cache/sys-devel/llvm-9.0.0
index 7fe5c91..d3e5bc5 100644
--- a/metadata/md5-cache/sys-devel/llvm-9.0.0
+++ b/metadata/md5-cache/sys-devel/llvm-9.0.0
@@ -12,5 +12,5 @@
 RESTRICT=!test? ( test )
 SLOT=9
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.0/llvm-9.0.0.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-9.0.0-manpages.tar.bz2 )
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=10120fe39799fdba27a78c0a28102e10
diff --git a/metadata/md5-cache/sys-devel/llvm-9.0.0-r2 b/metadata/md5-cache/sys-devel/llvm-9.0.0-r2
index 7fe5c91..d3e5bc5 100644
--- a/metadata/md5-cache/sys-devel/llvm-9.0.0-r2
+++ b/metadata/md5-cache/sys-devel/llvm-9.0.0-r2
@@ -12,5 +12,5 @@
 RESTRICT=!test? ( test )
 SLOT=9
 SRC_URI=https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.0/llvm-9.0.0.src.tar.xz !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/llvm-9.0.0-manpages.tar.bz2 )
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	pax-utils	3551398d6ede2b572568832730cc2a45	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=10120fe39799fdba27a78c0a28102e10
diff --git a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3 b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3
deleted file mode 100644
index 45ff345..0000000
--- a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=AVer firmware
-EAPI=5
-KEYWORDS=*
-LICENSE=BSD
-RDEPEND=sys-apps/aver-updater
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/aver-cam520-0.0.0018.36.tar.xz gs://chromeos-localmirror/distfiles/aver-cam540-0.0.6002.84.tar.xz gs://chromeos-localmirror/distfiles/aver-cam340plus-0.0.1000.22.tar.xz
-_md5_=0a334b5137b5c0afa5e1d3bbb376f4c5
diff --git a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3-r1 b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3-r1
deleted file mode 100644
index 45ff345..0000000
--- a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.3-r1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=AVer firmware
-EAPI=5
-KEYWORDS=*
-LICENSE=BSD
-RDEPEND=sys-apps/aver-updater
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles/aver-cam520-0.0.0018.36.tar.xz gs://chromeos-localmirror/distfiles/aver-cam540-0.0.6002.84.tar.xz gs://chromeos-localmirror/distfiles/aver-cam340plus-0.0.1000.22.tar.xz
-_md5_=0a334b5137b5c0afa5e1d3bbb376f4c5
diff --git a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4 b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4
new file mode 100644
index 0000000..c70104d
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=AVer firmware
+EAPI=5
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=sys-apps/aver-updater
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/aver-cam520-0.0.0018.36.tar.xz gs://chromeos-localmirror/distfiles/aver-cam540-0.0.6002.96.tar.xz gs://chromeos-localmirror/distfiles/aver-cam340plus-0.0.1000.34.tar.xz
+_md5_=0d09d2f2587ecdc561706ab01604ea74
diff --git a/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4-r1 b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4-r1
new file mode 100644
index 0000000..c70104d
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/aver-firmware-1.0.4-r1
@@ -0,0 +1,9 @@
+DEFINED_PHASES=install
+DESCRIPTION=AVer firmware
+EAPI=5
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=sys-apps/aver-updater
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/aver-cam520-0.0.0018.36.tar.xz gs://chromeos-localmirror/distfiles/aver-cam540-0.0.6002.96.tar.xz gs://chromeos-localmirror/distfiles/aver-cam340plus-0.0.1000.34.tar.xz
+_md5_=0d09d2f2587ecdc561706ab01604ea74
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r22 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r22
deleted file mode 100644
index 593d60b9..0000000
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r22
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
-DESCRIPTION=Chrome OS EC release firmware for bloonchipper.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_2acece20af8307f916adbe1850384fe42f618e4f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_2acece20af8307f916adbe1850384fe42f618e4f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
-RESTRICT=binchecksbinchecks strip
-SLOT=0/0.0.1-r22
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=66460939c8765277daf4dd32fe6d2445
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r29 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r29
new file mode 100644
index 0000000..3871108
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-0.0.1-r29
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
+DESCRIPTION=Chrome OS EC release firmware for bloonchipper.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecksbinchecks strip
+SLOT=0/0.0.1-r29
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=71a0f1778434245a34239f7c9183de3b
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-9999 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-9999
index 4142abf..0d9ec5f 100644
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-9999
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-bloonchipper-9999
@@ -1,15 +1,15 @@
-BDEPEND=dev-vcs/git dev-vcs/git
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
 DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
 DESCRIPTION=Chrome OS EC release firmware for bloonchipper.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_ ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+IUSE=cros_host cros_workon_tree_ ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
 RESTRICT=binchecksbinchecks strip
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b2487bad70daba9f25dfd058758762fb
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cea836d5193bd67772b93ca7276ca90b
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r16 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r16
deleted file mode 100644
index c0f21ea..0000000
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r16
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
-DESCRIPTION=Chrome OS EC release firmware for dartmonkey.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
-RESTRICT=binchecksbinchecks strip
-SLOT=0/0.0.1-r16
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=05e4c18875455cb291116b0840720f03
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r23 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r23
new file mode 100644
index 0000000..598e077
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-0.0.1-r23
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
+DESCRIPTION=Chrome OS EC release firmware for dartmonkey.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecksbinchecks strip
+SLOT=0/0.0.1-r23
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=46b5fc813904f5470353d83a9129af29
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-9999 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-9999
index 357697d..95c9868 100644
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-9999
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-dartmonkey-9999
@@ -1,15 +1,15 @@
-BDEPEND=dev-vcs/git dev-vcs/git
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
 DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
 DESCRIPTION=Chrome OS EC release firmware for dartmonkey.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_ ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+IUSE=cros_host cros_workon_tree_ ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
 RESTRICT=binchecksbinchecks strip
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=87d752fe188a440023f283c733a202d9
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=67657e7d5f0de46bfcd5cec06ebe2c84
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r15 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r15
deleted file mode 100644
index 2c17ec9..0000000
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r15
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
-DESCRIPTION=Chrome OS EC release firmware for nami_fp.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
-RESTRICT=binchecksbinchecks strip
-SLOT=0/0.0.1-r15
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=1251eac416170fcb5f648e1b2145ce53
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r22 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r22
new file mode 100644
index 0000000..31370cb
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-0.0.1-r22
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
+DESCRIPTION=Chrome OS EC release firmware for nami_fp.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecksbinchecks strip
+SLOT=0/0.0.1-r22
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c9961da8bda41ad2b8022ff533c40231
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-9999 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-9999
index a2b7e58..f832a5d 100644
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-9999
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nami-9999
@@ -1,15 +1,15 @@
-BDEPEND=dev-vcs/git dev-vcs/git
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
 DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
 DESCRIPTION=Chrome OS EC release firmware for nami_fp.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_ ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+IUSE=cros_host cros_workon_tree_ ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
 RESTRICT=binchecksbinchecks strip
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=b1bfab3d23cc3e3086934f6d202dd2a8
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9ac73720881a7cbc618a5a260e117909
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r15 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r15
deleted file mode 100644
index d225f11..0000000
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r15
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git dev-vcs/git
-DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
-DESCRIPTION=Chrome OS EC release firmware for nocturne_fp.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_e1bf1102d6a4ea7e7491995ce8344da837ae265f_f70af34770002df8ef3951dfdf5a6c18d42a5dda_fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live live
-RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
-RESTRICT=binchecksbinchecks strip
-SLOT=0/0.0.1-r15
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2427307d43bc2893a15ddcdbf613e6ed
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r22 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r22
new file mode 100644
index 0000000..3b09365
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-0.0.1-r22
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
+DEFINED_PHASES=compile info install prepare setup test unpack
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
+DESCRIPTION=Chrome OS EC release firmware for nocturne_fp.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
+IUSE=cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_8153273126093f8370ddcbdc06a2a63e7832469b_8e2ebe98fade4195aac74d52d0647b116b0165c5_86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5 quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live live
+RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
+RESTRICT=binchecksbinchecks strip
+SLOT=0/0.0.1-r22
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ba851b43da19b850ceedee79d21a61dc
diff --git a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-9999 b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-9999
index 74f7980..258024e 100644
--- a/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-9999
+++ b/metadata/md5-cache/sys-firmware/chromeos-fpmcu-release-nocturne-9999
@@ -1,15 +1,15 @@
-BDEPEND=dev-vcs/git dev-vcs/git
+BDEPEND=dev-vcs/git dev-vcs/git chromeos-base/chromeos-config-host
 DEFINED_PHASES=compile info install prepare setup test unpack
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= ) dev-embedded/libftdi:1= fuzzer? ( dev-libs/libprotobuf-mutator:= ) test? ( dev-libs/libprotobuf-mutator:= ) virtual/chromeos-ec-private-files virtual/chromeos-ec-touch-firmware unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) bootblock_in_ec? ( sys-boot/coreboot ) virtual/chromeos-ec-private-files virtual/chromeos-config-bsp
 DESCRIPTION=Chrome OS EC release firmware for nocturne_fp.
 EAPI=7
 HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md
-IUSE=cros_host cros_workon_tree_ ec_firmware_asurada ec_firmware_atlas ec_firmware_atlas_ish ec_firmware_bds ec_firmware_cheza ec_firmware_coral ec_firmware_cr50 ec_firmware_cyan ec_firmware_dedede ec_firmware_dingdong ec_firmware_dragonegg ec_firmware_elm ec_firmware_endeavour ec_firmware_eve ec_firmware_eve_fp ec_firmware_fizz ec_firmware_flapjack ec_firmware_glkrvp ec_firmware_grunt ec_firmware_hadoken ec_firmware_hammer ec_firmware_hatch ec_firmware_hatch_fp ec_firmware_hoho ec_firmware_jacuzzi ec_firmware_jerry ec_firmware_kalista ec_firmware_kukui ec_firmware_llama ec_firmware_lux ec_firmware_meowth ec_firmware_meowth_fp ec_firmware_minimuffin ec_firmware_mushu ec_firmware_nami ec_firmware_nami_fp ec_firmware_nautilus ec_firmware_nefario ec_firmware_nocturne ec_firmware_nocturne_fp ec_firmware_oak ec_firmware_oak_pd ec_firmware_octopus ec_firmware_orchestra ec_firmware_palkia ec_firmware_plankton ec_firmware_poppy ec_firmware_rammus ec_firmware_reef ec_firmware_ryu ec_firmware_ryu_p4p5 ec_firmware_ryu_sh ec_firmware_ryu_sh_loader ec_firmware_samus ec_firmware_samus_pd ec_firmware_scarlet ec_firmware_soraka ec_firmware_staff ec_firmware_strago ec_firmware_trogdor ec_firmware_twinkie ec_firmware_wand ec_firmware_whiskers ec_firmware_zinger ec_firmware_zoombini ec_firmware_zork ec_firmware_extra_asurada ec_firmware_extra_atlas ec_firmware_extra_atlas_ish ec_firmware_extra_bds ec_firmware_extra_cheza ec_firmware_extra_coral ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dedede ec_firmware_extra_dingdong ec_firmware_extra_dragonegg ec_firmware_extra_elm ec_firmware_extra_endeavour ec_firmware_extra_eve ec_firmware_extra_eve_fp ec_firmware_extra_fizz ec_firmware_extra_flapjack ec_firmware_extra_glkrvp ec_firmware_extra_grunt ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hatch ec_firmware_extra_hatch_fp ec_firmware_extra_hoho ec_firmware_extra_jacuzzi ec_firmware_extra_jerry ec_firmware_extra_kalista ec_firmware_extra_kukui ec_firmware_extra_llama ec_firmware_extra_lux ec_firmware_extra_meowth ec_firmware_extra_meowth_fp ec_firmware_extra_minimuffin ec_firmware_extra_mushu ec_firmware_extra_nami ec_firmware_extra_nami_fp ec_firmware_extra_nautilus ec_firmware_extra_nefario ec_firmware_extra_nocturne ec_firmware_extra_nocturne_fp ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_octopus ec_firmware_extra_orchestra ec_firmware_extra_palkia ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_rammus ec_firmware_extra_reef ec_firmware_extra_ryu ec_firmware_extra_ryu_p4p5 ec_firmware_extra_ryu_sh ec_firmware_extra_ryu_sh_loader ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_scarlet ec_firmware_extra_soraka ec_firmware_extra_staff ec_firmware_extra_strago ec_firmware_extra_trogdor ec_firmware_extra_twinkie ec_firmware_extra_wand ec_firmware_extra_whiskers ec_firmware_extra_zinger ec_firmware_extra_zoombini ec_firmware_extra_zork cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
+IUSE=cros_host cros_workon_tree_ ec_firmware_bds ec_firmware_cr50 ec_firmware_cyan ec_firmware_dingdong ec_firmware_elm ec_firmware_glkrvp ec_firmware_hadoken ec_firmware_hammer ec_firmware_hoho ec_firmware_jerry ec_firmware_oak ec_firmware_oak_pd ec_firmware_plankton ec_firmware_poppy ec_firmware_samus ec_firmware_samus_pd ec_firmware_strago ec_firmware_wand ec_firmware_zinger ec_firmware_extra_bds ec_firmware_extra_cr50 ec_firmware_extra_cyan ec_firmware_extra_dingdong ec_firmware_extra_elm ec_firmware_extra_glkrvp ec_firmware_extra_hadoken ec_firmware_extra_hammer ec_firmware_extra_hoho ec_firmware_extra_jerry ec_firmware_extra_oak ec_firmware_extra_oak_pd ec_firmware_extra_plankton ec_firmware_extra_poppy ec_firmware_extra_samus ec_firmware_extra_samus_pd ec_firmware_extra_strago ec_firmware_extra_wand ec_firmware_extra_zinger cros_host unibuild generated_cros_config cros_host cros_workon_tree_ quiet verbose coreboot-sdk unibuild generated_cros_config fuzzer bootblock_in_ec asan msan ubsan test
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live live
 RDEPEND=fuzzer? ( dev-libs/openssl:= dev-libs/protobuf:= ) test? ( dev-libs/openssl:= dev-libs/protobuf:= )
 RESTRICT=binchecksbinchecks strip
 SLOT=0/9999
-_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	6826ac03cdc0108accc2f5fcaae03e33	cros-ec-board	60f862a1c8ea2789e2181e5539a084fe	cros-ec-merge-ro	c6572d86ce5cb2c06bb2f6ee56c75db4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	1705aff271243014135de65988f2348f	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=861ce848564b436e4999d22fbf05e819
+_eclasses_=coreboot-sdk	b3fb569501ebe9ba5b808b9766a0392f	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-ec	a24eddafb550679987b7e6aa4d3edfb5	cros-ec-board	a4af6505ff4c30e36bb75a310eae3535	cros-ec-merge-ro	a4d1c4dc442bcc9b1d3b46603cdafbd4	cros-ec-release	9a95b7bb0fefbcec0803c657f36fa8df	cros-ec-utils	5498f49404d3d05041dad891c1fd163c	cros-unibuild	7452b95c0fc7fd99f0aa9972390e8633	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=47e7f6d092fdf631a7073f8c037db43b
diff --git a/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r23 b/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r23
deleted file mode 100644
index f72e51f..0000000
--- a/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r23
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install postinst setup test unpack
-DEPEND=dev-go/crypto:= dev-go/gapi-discovery:= dev-go/gapi-option:= dev-lang/go
-DESCRIPTION=Tooling related to firmware release testing.
-EAPI=7
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/refs/heads/master/go/src/firmware/
-IUSE=cros_host cros_workon_tree_86c8cdb230be6edd6ac4510cc2b4c2193486647e
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=832b5089ce04f2d433d5fa40336950f3
diff --git a/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r29 b/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r29
new file mode 100644
index 0000000..c47cda8
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/fw-engprod-tools-0.0.1-r29
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install postinst setup test unpack
+DEPEND=dev-go/crypto:= dev-go/gapi-discovery:= dev-go/gapi-option:= dev-lang/go
+DESCRIPTION=Tooling related to firmware release testing.
+EAPI=7
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/refs/heads/master/go/src/firmware/
+IUSE=cros_host cros_workon_tree_8146f648468b544a50e01b7ee01b268db5e744ea
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+SLOT=0/0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e80b97dfd87cc7c6edda7d561214809f
diff --git a/metadata/md5-cache/sys-firmware/fw-engprod-tools-9999 b/metadata/md5-cache/sys-firmware/fw-engprod-tools-9999
index 59c7db3..75500f6 100644
--- a/metadata/md5-cache/sys-firmware/fw-engprod-tools-9999
+++ b/metadata/md5-cache/sys-firmware/fw-engprod-tools-9999
@@ -9,5 +9,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0/0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-go	157c7bac0e032e424ec1c3316c127db8	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=3c6f259c6eff4e9eef1ad5f375e04a05
diff --git a/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2 b/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2
new file mode 100644
index 0000000..a4f14d8
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=PS8705-A2 Firmware Binary
+EAPI=7
+KEYWORDS=*
+LICENSE=Google-Partners-Website
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/parade-ps8705a2-firmware-2.tar.xz
+_md5_=199dc39b9740a05aa120fdaa018c48b9
diff --git a/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2-r1 b/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2-r1
new file mode 100644
index 0000000..a4f14d8
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/parade-ps8705a2-firmware-2-r1
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=PS8705-A2 Firmware Binary
+EAPI=7
+KEYWORDS=*
+LICENSE=Google-Partners-Website
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/parade-ps8705a2-firmware-2.tar.xz
+_md5_=199dc39b9740a05aa120fdaa018c48b9
diff --git a/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2 b/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2
new file mode 100644
index 0000000..687ae66
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=PS8755-A2 Firmware Binary
+EAPI=7
+KEYWORDS=*
+LICENSE=Google-Partners-Website
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/parade-ps8755a2-firmware-2.tar.xz
+_md5_=2cb1c7a8bca058557adf8b4f4a9ac13e
diff --git a/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2-r1 b/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2-r1
new file mode 100644
index 0000000..687ae66
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/parade-ps8755a2-firmware-2-r1
@@ -0,0 +1,8 @@
+DEFINED_PHASES=install
+DESCRIPTION=PS8755-A2 Firmware Binary
+EAPI=7
+KEYWORDS=*
+LICENSE=Google-Partners-Website
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/parade-ps8755a2-firmware-2.tar.xz
+_md5_=2cb1c7a8bca058557adf8b4f4a9ac13e
diff --git a/metadata/md5-cache/sys-firmware/parade-ps8815a1-firmware-10-r1 b/metadata/md5-cache/sys-firmware/parade-ps8815a1-firmware-10-r1
new file mode 100644
index 0000000..22f4db8
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/parade-ps8815a1-firmware-10-r1
@@ -0,0 +1,10 @@
+DEFINED_PHASES=install
+DEPEND=!sys-boot/chromeos-firmware-ps8815
+DESCRIPTION=PS8815-A1 Firmware Binary
+EAPI=7
+KEYWORDS=*
+LICENSE=Google-Partners-Website
+RDEPEND=!sys-boot/chromeos-firmware-ps8815
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles/parade-ps8815a1-firmware-10.tar.xz
+_md5_=8debdfff48d382b98e4d88855afe96ef
diff --git a/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1 b/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1
index 44c366f..bd96dab 100644
--- a/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1
+++ b/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1
@@ -6,5 +6,5 @@
 LICENSE=BSD-Google
 RDEPEND=!<chromeos-base/ec-devutils-0.0.2
 SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles//c2d2_v2.4.24-c281b1c5d.tar.xz gs://chromeos-localmirror/distfiles//servo_micro_v2.4.17-df61092c3.tar.gz gs://chromeos-localmirror/distfiles//servo_v4_v2.4.17-df61092c3.tar.gz gs://chromeos-localmirror/distfiles//servo_v4p1_v2.0.4232-514cb4e92.tar.gz gs://chromeos-localmirror/distfiles//sweetberry_v2.3.7-096c7ee84.tar.gz
-_md5_=471ddcb290b5fb31c7bd03b402858a93
+SRC_URI=gs://chromeos-localmirror/distfiles//c2d2_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_micro_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_v4_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_v4p1_v2.0.5159-529612865.tar.xz gs://chromeos-localmirror/distfiles//sweetberry_v2.3.7-096c7ee84.tar.gz
+_md5_=e1f49680248639e381face0cd2007100
diff --git a/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r21 b/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r21
deleted file mode 100644
index 44c366f..0000000
--- a/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r21
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=install
-DESCRIPTION=Firmware for tools based on Chromium OS EC
-EAPI=5
-HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=!<chromeos-base/ec-devutils-0.0.2
-SLOT=0
-SRC_URI=gs://chromeos-localmirror/distfiles//c2d2_v2.4.24-c281b1c5d.tar.xz gs://chromeos-localmirror/distfiles//servo_micro_v2.4.17-df61092c3.tar.gz gs://chromeos-localmirror/distfiles//servo_v4_v2.4.17-df61092c3.tar.gz gs://chromeos-localmirror/distfiles//servo_v4p1_v2.0.4232-514cb4e92.tar.gz gs://chromeos-localmirror/distfiles//sweetberry_v2.3.7-096c7ee84.tar.gz
-_md5_=471ddcb290b5fb31c7bd03b402858a93
diff --git a/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r26 b/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r26
new file mode 100644
index 0000000..bd96dab
--- /dev/null
+++ b/metadata/md5-cache/sys-firmware/servo-firmware-0.0.1-r26
@@ -0,0 +1,10 @@
+DEFINED_PHASES=install
+DESCRIPTION=Firmware for tools based on Chromium OS EC
+EAPI=5
+HOMEPAGE=https://www.chromium.org/chromium-os/ec-development
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=!<chromeos-base/ec-devutils-0.0.2
+SLOT=0
+SRC_URI=gs://chromeos-localmirror/distfiles//c2d2_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_micro_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_v4_v2.4.35-f1113c92b.tar.gz gs://chromeos-localmirror/distfiles//servo_v4p1_v2.0.5159-529612865.tar.xz gs://chromeos-localmirror/distfiles//sweetberry_v2.3.7-096c7ee84.tar.gz
+_md5_=e1f49680248639e381face0cd2007100
diff --git a/metadata/md5-cache/sys-fs/fsverity-utils-1.1 b/metadata/md5-cache/sys-fs/fsverity-utils-1.1
index 321c158..ec9a31d 100644
--- a/metadata/md5-cache/sys-fs/fsverity-utils-1.1
+++ b/metadata/md5-cache/sys-fs/fsverity-utils-1.1
@@ -9,5 +9,5 @@
 RDEPEND=dev-libs/openssl:=
 SLOT=0
 SRC_URI=https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git/snapshot/fsverity-utils-1.1.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=830c354489ec4f7ae1dfe8ad0c657de2
diff --git a/metadata/md5-cache/sys-fs/fsverity-utils-1.1-r1 b/metadata/md5-cache/sys-fs/fsverity-utils-1.1-r1
index 321c158..ec9a31d 100644
--- a/metadata/md5-cache/sys-fs/fsverity-utils-1.1-r1
+++ b/metadata/md5-cache/sys-fs/fsverity-utils-1.1-r1
@@ -9,5 +9,5 @@
 RDEPEND=dev-libs/openssl:=
 SLOT=0
 SRC_URI=https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git/snapshot/fsverity-utils-1.1.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=830c354489ec4f7ae1dfe8ad0c657de2
diff --git a/metadata/md5-cache/sys-fs/fuse-2.9.8-r3 b/metadata/md5-cache/sys-fs/fuse-2.9.8-r3
index e753502..dd6ddfa 100644
--- a/metadata/md5-cache/sys-fs/fuse-2.9.8-r3
+++ b/metadata/md5-cache/sys-fs/fuse-2.9.8-r3
@@ -10,5 +10,5 @@
 RDEPEND=sys-fs/fuse-common
 SLOT=0
 SRC_URI=https://github.com/libfuse/libfuse/releases/download/fuse-2.9.8/fuse-2.9.8.tar.gz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	fcaps	eeefea88d5fef2853d4c1e3770340302	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	fcaps	eeefea88d5fef2853d4c1e3770340302	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
 _md5_=f5c82c3fbcdd182805819f6aa940fad1
diff --git a/metadata/md5-cache/sys-fs/fuse-common-3.2.6-r2 b/metadata/md5-cache/sys-fs/fuse-common-3.2.6-r2
index 20085aa..23c1c49 100644
--- a/metadata/md5-cache/sys-fs/fuse-common-3.2.6-r2
+++ b/metadata/md5-cache/sys-fs/fuse-common-3.2.6-r2
@@ -9,5 +9,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=https://github.com/libfuse/libfuse/releases/download/fuse-3.2.6/fuse-3.2.6.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
 _md5_=cb9d7e5d1d87b00e0fcc960b3c2d60a0
diff --git a/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r2 b/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r2
deleted file mode 100644
index ba3b634..0000000
--- a/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r2
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile install
-DEPEND=dev-libs/libzip:= sys-fs/fuse:0
-DESCRIPTION=FUSE file system to navigate, extract, create and modify ZIP archives
-EAPI=7
-HOMEPAGE=https://bitbucket.org/agalanin/fuse-zip
-KEYWORDS=*
-LICENSE=GPL-3
-RDEPEND=dev-libs/libzip:= sys-fs/fuse:0
-RESTRICT=test
-SLOT=0
-SRC_URI=https://bitbucket.org/agalanin/fuse-zip/downloads/fuse-zip-0.7.0.tar.gz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4c0144fa10b2a81b503468680c134d7f
diff --git a/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r9 b/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r9
new file mode 100644
index 0000000..6d9bcbb
--- /dev/null
+++ b/metadata/md5-cache/sys-fs/fuse-zip-0.7.0-r9
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile install
+DEPEND=dev-libs/libzip:= sys-fs/fuse:0
+DESCRIPTION=FUSE file system to navigate, extract, create and modify ZIP archives
+EAPI=7
+HOMEPAGE=https://bitbucket.org/agalanin/fuse-zip
+KEYWORDS=*
+LICENSE=GPL-3
+RDEPEND=dev-libs/libzip:= sys-fs/fuse:0
+RESTRICT=test
+SLOT=0
+SRC_URI=https://bitbucket.org/agalanin/fuse-zip/downloads/fuse-zip-0.7.0.tar.gz
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ea47a220d7812f307dcfc5724596ad52
diff --git a/metadata/md5-cache/sys-fs/ntfs3g-2017.3.23-r7 b/metadata/md5-cache/sys-fs/ntfs3g-2017.3.23-r7
index 07e56a7..173c5f1 100644
--- a/metadata/md5-cache/sys-fs/ntfs3g-2017.3.23-r7
+++ b/metadata/md5-cache/sys-fs/ntfs3g-2017.3.23-r7
@@ -9,5 +9,5 @@
 RDEPEND=!<sys-apps/util-linux-2.20.1-r2 !sys-fs/ntfsprogs ntfsdecrypt? ( >=dev-libs/libgcrypt-1.2.2:0 >=net-libs/gnutls-1.4.4 ) external-fuse? ( >=sys-fs/fuse-2.8.0 <sys-fs/fuse-3.0.0_pre )
 SLOT=0/87
 SRC_URI=http://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6
 _md5_=68af8d88238f6152de50f1c33837148d
diff --git a/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r1 b/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r1
deleted file mode 100644
index 9f652a7..0000000
--- a/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r1
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=configure
-DEPEND=>=app-arch/unrar-5:= sys-fs/fuse:0
-DESCRIPTION=A FUSE based filesystem that can mount one or multiple RAR archive(s)
-EAPI=7
-HOMEPAGE=https://hasse69.github.io/rar2fs/ https://github.com/hasse69/rar2fs
-IUSE=debug
-KEYWORDS=*
-LICENSE=GPL-3
-RDEPEND=>=app-arch/unrar-5:= sys-fs/fuse:0
-SLOT=0
-SRC_URI=https://github.com/hasse69/rar2fs/releases/download/v1.29.0/rar2fs-1.29.0.tar.gz
-_md5_=d9d1a82369f091f5ece9ef0f1d9e3c35
diff --git a/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r4 b/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r4
new file mode 100644
index 0000000..80ba183
--- /dev/null
+++ b/metadata/md5-cache/sys-fs/rar2fs-1.29.0-r4
@@ -0,0 +1,12 @@
+DEFINED_PHASES=configure
+DEPEND=>=app-arch/unrar-5:= sys-fs/fuse:0
+DESCRIPTION=A FUSE based filesystem that can mount one or multiple RAR archive(s)
+EAPI=7
+HOMEPAGE=https://hasse69.github.io/rar2fs/ https://github.com/hasse69/rar2fs
+IUSE=debug
+KEYWORDS=*
+LICENSE=GPL-3
+RDEPEND=>=app-arch/unrar-5:= sys-fs/fuse:0
+SLOT=0
+SRC_URI=https://github.com/hasse69/rar2fs/releases/download/v1.29.0/rar2fs-1.29.0.tar.gz
+_md5_=6b7930e6464746afd15f951690c70fa6
diff --git a/metadata/md5-cache/sys-fs/udev-225-r26 b/metadata/md5-cache/sys-fs/udev-225-r26
deleted file mode 100644
index 7e6dbcc..0000000
--- a/metadata/md5-cache/sys-fs/udev-225-r26
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install postinst prepare setup test
-DEPEND=>=sys-apps/util-linux-2.24 sys-libs/libcap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] acl? ( sys-apps/acl ) kmod? ( >=sys-apps/kmod-16 ) selinux? ( >=sys-libs/libselinux-2.1.9 ) !<sys-libs/glibc-2.11 !sys-apps/gentoo-systemd-integration !sys-apps/systemd abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r7 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) dev-util/gperf >=dev-util/intltool-0.50 >=sys-apps/coreutils-8.16 virtual/os-headers virtual/pkgconfig >=sys-devel/make-3.82-r4 >=sys-kernel/linux-headers-3.9 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets dev-libs/libxslt >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig sys-apps/baselayout
-DESCRIPTION=Linux dynamic and persistent device naming support (aka userspace devfs)
-EAPI=5
-HOMEPAGE=https://www.freedesktop.org/wiki/Software/systemd
-IUSE=acl +kmod openrc selinux static-libs kernel_linux abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=LGPL-2.1 MIT GPL-2
-PDEPEND=>=sys-apps/hwids-20140304[udev] openrc? ( >=sys-fs/udev-init-scripts-26 )
-RDEPEND=>=sys-apps/util-linux-2.24 sys-libs/libcap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] acl? ( sys-apps/acl ) kmod? ( >=sys-apps/kmod-16 ) selinux? ( >=sys-libs/libselinux-2.1.9 ) !<sys-libs/glibc-2.11 !sys-apps/gentoo-systemd-integration !sys-apps/systemd abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r7 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<sec-policy/selinux-base-2.20120725-r10 sys-apps/baselayout
-RESTRICT=test
-SLOT=0
-SRC_URI=https://github.com/systemd/systemd/archive/v225.tar.gz -> systemd-225.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=e3aefeb0f9d25b56b7931630175aa5b6
diff --git a/metadata/md5-cache/sys-fs/udev-225-r27 b/metadata/md5-cache/sys-fs/udev-225-r27
new file mode 100644
index 0000000..7c5cab0
--- /dev/null
+++ b/metadata/md5-cache/sys-fs/udev-225-r27
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure install postinst prepare test
+DEPEND=>=sys-apps/util-linux-2.24 sys-libs/libcap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] acl? ( sys-apps/acl ) kmod? ( >=sys-apps/kmod-16 ) selinux? ( >=sys-libs/libselinux-2.1.9 ) !<sys-libs/glibc-2.11 !sys-apps/gentoo-systemd-integration !sys-apps/systemd abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r7 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) dev-util/gperf >=dev-util/intltool-0.50 >=sys-apps/coreutils-8.16 virtual/os-headers virtual/pkgconfig >=sys-devel/make-3.82-r4 >=sys-kernel/linux-headers-3.9 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets dev-libs/libxslt >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 virtual/pkgconfig sys-apps/baselayout
+DESCRIPTION=Linux dynamic and persistent device naming support (aka userspace devfs)
+EAPI=5
+HOMEPAGE=https://www.freedesktop.org/wiki/Software/systemd
+IUSE=acl +kmod openrc selinux static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=LGPL-2.1 MIT GPL-2
+PDEPEND=>=sys-apps/hwids-20140304[udev] openrc? ( >=sys-fs/udev-init-scripts-26 )
+RDEPEND=>=sys-apps/util-linux-2.24 sys-libs/libcap[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] acl? ( sys-apps/acl ) kmod? ( >=sys-apps/kmod-16 ) selinux? ( >=sys-libs/libselinux-2.1.9 ) !<sys-libs/glibc-2.11 !sys-apps/gentoo-systemd-integration !sys-apps/systemd abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r7 !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] ) !<sec-policy/selinux-base-2.20120725-r10 sys-apps/baselayout
+RESTRICT=test
+SLOT=0
+SRC_URI=https://github.com/systemd/systemd/archive/v225.tar.gz -> systemd-225.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	bash-completion-r1	47a7402d95930413ce25ba8d857339bb	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	udev	452708c3f55cf6e918b045adb949a9e6	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_md5_=025acba5023cecf5085236d02ab600eb
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1234 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1234
deleted file mode 100644
index 1e3e23b..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1234
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 3.10
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_f856d1f901691920fd8e6d7c8995c9597994df60 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!sys-kernel/kernel-freon
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3b9a2b80e95fafd9f3588f6aacdb89f9
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1236 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1236
new file mode 100644
index 0000000..bcd5a41
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-3.10.18-r1236
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 3.10
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_9f900dc633ef489f05a33976c927674a5a99988b board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!sys-kernel/kernel-freon
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5615e977d98e756812b4832c05e39436
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-9999
index a365bff..d16393f 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_10-9999
@@ -1,10 +1,10 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 3.10
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
@@ -12,5 +12,5 @@
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=37b604d55c98b63bb23a9786a60abb10
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=845e503735311eeff143c9427a19bb34
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2253 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2253
deleted file mode 100644
index 7ee35cd..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2253
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 3.14
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_7f22665ec9ae82914f88efb5ba2f0494d7cec5e3 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.14/R81-12607.58-1578524353.gcov.xz -> chromeos-kernel-3_14-R81-12607.58-1578524353.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=dcd12a6cf7991590cc5feae6cc68e30f
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2257 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2257
new file mode 100644
index 0000000..c53729c
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-3.14-r2257
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 3.14
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_c13b7413dc08913d8ee75e528ebc8346b7ff890b board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.14/R81-12607.58-1578524353.gcov.xz -> chromeos-kernel-3_14-R81-12607.58-1578524353.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=40c5ac0483fd456c1ab270d56e64a3a9
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-9999
index e7ef89f..ac3f437 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_14-9999
@@ -1,10 +1,10 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 3.14
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
@@ -12,5 +12,5 @@
 RESTRICT=binchecks mirror
 SLOT=0
 SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.14/R81-12607.58-1578524353.gcov.xz -> chromeos-kernel-3_14-R81-12607.58-1578524353.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f8abce4f9cd1bd0f08caefa34c725e5e
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6e7bd964e8f28d98c2c40b3ef97bf29a
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2546 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2546
deleted file mode 100644
index 346e063..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2546
+++ /dev/null
@@ -1,17 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 3.18
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_f0f9f30e8733a2062ec7c521fbc98383041874f0 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-RDEPEND=!!sys-kernel/gale-kernel-3_18
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.18/R86-13308.0-1593423468.gcov.xz -> chromeos-kernel-3_18-R86-13308.0-1593423468.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d9578b569bf6e002f5ae85c1e6402f7b
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2585 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2585
new file mode 100644
index 0000000..742a5a0
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-3.18-r2585
@@ -0,0 +1,17 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 3.18
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_d4b4ecd28d7aa67b7df0b310f4fa10bb16ef8219 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+RDEPEND=!!sys-kernel/gale-kernel-3_18
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.18/R87-13421.11-1599471395.gcov.xz -> chromeos-kernel-3_18-R87-13421.11-1599471395.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=89c61642380a9098053d96d9f450061e
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-9999
index 9f68055..7b475b8 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_18-9999
@@ -1,10 +1,10 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 3.18
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
@@ -12,6 +12,6 @@
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.18/R86-13308.0-1593423468.gcov.xz -> chromeos-kernel-3_18-R86-13308.0-1593423468.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=28eb5890b52e07127d36bc0413ec69c7
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.18/R87-13421.11-1599471395.gcov.xz -> chromeos-kernel-3_18-R87-13421.11-1599471395.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ab26ed4393cbdedf87824c6a23f51979
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r855 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r855
deleted file mode 100644
index 619160f..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r855
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 3.8
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_2e99301f289461ae4a6ff8a82b667dce179bb8ae board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.8/R77-12240.0-1563788154.gcov.xz -> chromeos-kernel-3_8-R77-12240.0-1563788154.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a5f201637d49190c76fef04ad8a69ff0
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r857 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r857
new file mode 100644
index 0000000..f169391
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-3.8.11-r857
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 3.8
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_8ad688be73740fc0d5a14b3ce713c54571be4c15 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.8/R77-12240.0-1563788154.gcov.xz -> chromeos-kernel-3_8-R77-12240.0-1563788154.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=43f6641b8ad7c9dbe84557616cd1e72a
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-9999
index e976871..cf3f5d4c 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-3_8-9999
@@ -1,10 +1,10 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 3.8
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
@@ -12,5 +12,5 @@
 RESTRICT=binchecks mirror
 SLOT=0
 SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/3.8/R77-12240.0-1563788154.gcov.xz -> chromeos-kernel-3_8-R77-12240.0-1563788154.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=251a93a943fb499316593745887aa74c
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=af98eb8115b487935a895dfcc12f9b55
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.187-r1257 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.187-r1257
deleted file mode 100644
index 7b336a0..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.187-r1257
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 4.14
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_4baf31bd16d36a47f5fe634b6bd732b25394cc1a board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.14/R86-13308.0-1593423143.gcov.xz -> chromeos-kernel-4_14-R86-13308.0-1593423143.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=cf511485f0e23669e75ca9f42357bedd
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.199-r1384 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.199-r1384
new file mode 100644
index 0000000..ba01150
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-4.14.199-r1384
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 4.14
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_459d4dbc4802cd75e496b494adade8f21801af1f board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.14/R87-13421.11-1599471640.gcov.xz -> chromeos-kernel-4_14-R87-13421.11-1599471640.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=fca846a96451f141f542f825baba993c
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-9999
index f06389b..384b8ad 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_14-9999
@@ -1,16 +1,16 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 4.14
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.14/R86-13308.0-1593423143.gcov.xz -> chromeos-kernel-4_14-R86-13308.0-1593423143.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4f907ad0ccb40ece85929a03f64abe9e
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.14/R87-13421.11-1599471640.gcov.xz -> chromeos-kernel-4_14-R87-13421.11-1599471640.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7471cf069c2742ed4f1bd5a7e96fae4e
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.131-r1463 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.131-r1463
deleted file mode 100644
index c4b31a4..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.131-r1463
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 4.19
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_61b00fd245d6d4c8f520cabed4fa5b8ae2d74cb8 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.19/R86-13308.0-1593423563.gcov.xz -> chromeos-kernel-4_19-R86-13308.0-1593423563.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f7e59a008529a42d75bd6f204059ede6
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.148-r1626 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.148-r1626
new file mode 100644
index 0000000..6c8044f
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-4.19.148-r1626
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 4.19
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_cb8b4fa32386a9cd89669825e5678732fa1c560b board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.19/R87-13421.11-1599472679.gcov.xz -> chromeos-kernel-4_19-R87-13421.11-1599472679.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=0cb7054b3bb1c7698fc756aa0406149b
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-9999
index 129346b..80ebb08 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-9999
@@ -1,16 +1,16 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 4.19
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.19/R86-13308.0-1593423563.gcov.xz -> chromeos-kernel-4_19-R86-13308.0-1593423563.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=539a84e00e0f0021a5408104f6599d58
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.19/R87-13421.11-1599472679.gcov.xz -> chromeos-kernel-4_19-R87-13421.11-1599472679.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5ecaf18bcae696b1fcd204394effcb84
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r5 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r5
deleted file mode 100644
index ec584df..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r5
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 4.19-ht
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_c8a743644582b6ad1d265f204f00bad3e1b5ada8 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a3e6c1017d2fd64c27acb72b006684fb
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r6 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r6
new file mode 100644
index 0000000..66d22f3
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-4.19.115-r6
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 4.19-ht
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_c8a743644582b6ad1d265f204f00bad3e1b5ada8 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c795e4a708605058946f809bcf5ba566
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-9999
index a1204d1..797e94a 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_19-ht-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 4.19-ht
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8fb779f6ca68b8b1044c0b1dc812a738
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=7761182e04f82f6a9db3a6ab463d124a
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.229-r2300 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.229-r2300
deleted file mode 100644
index 7f051f4..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.229-r2300
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 4.4
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_1e66ea7e284e9772bdb1c0a42876603491f2e9b9 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.4/R86-13308.0-1593423371.gcov.xz -> chromeos-kernel-4_4-R86-13308.0-1593423371.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=609ba8407f29cb9232fcf8b9ad30f89c
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.237-r2464 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.237-r2464
new file mode 100644
index 0000000..680f3bc
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-4.4.237-r2464
@@ -0,0 +1,16 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 4.4
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_3f6524eb8b1e766029f5eee753eccb60ce718fe3 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.4/R87-13421.11-1599472924.gcov.xz -> chromeos-kernel-4_4-R87-13421.11-1599472924.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=e104fb65b0b753c6cf4aa6d300f45170
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-9999
index f2d6183..12b08e3 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-4_4-9999
@@ -1,16 +1,16 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 4.4
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.4/R86-13308.0-1593423371.gcov.xz -> chromeos-kernel-4_4-R86-13308.0-1593423371.gcov.xz )
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c0bffa38bae7f7597d6d18a9acbbc845
+SRC_URI=kernel_afdo? ( gs://chromeos-prebuilt/afdo-job/cwp/kernel/4.4/R87-13421.11-1599472924.gcov.xz -> chromeos-kernel-4_4-R87-13421.11-1599472924.gcov.xz )
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=787383fcb631f5133cc981b86b8cfec4
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.50-r822 b/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.50-r822
deleted file mode 100644
index d2f328c..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.50-r822
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel 5.4
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_9add2832f93f55aaf29bc2320c4acd8b0a40b32d board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=e7535d15b45cd9c83209d251801d7c0e
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.68-r1263 b/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.68-r1263
new file mode 100644
index 0000000..7d8cc76
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-5.4.68-r1263
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel 5.4
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_5d5d67150b0b8ee05e457e7f8cb452ac77586b6e board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ef6535da1f18b0f3dca8e4b2b0f05340
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-9999
index 71045dc..0e69e1a 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-5_4-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel 5.4
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2b359d0433c2b1644ccc5fea4206eb25
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=1ae8cb67de969c90902f5a2411f1adcc
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r21 b/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r21
deleted file mode 100644
index f108a24..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r21
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel (experimental)
-EAPI=5
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_1e11905e9a7cd3f8925678d2dcc192026a35f442 board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=73e0b16ee3de4f679435ed5d8073b662
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r22 b/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r22
new file mode 100644
index 0000000..8bc84ee
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-4.18_rc2-r22
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel (experimental)
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_1e11905e9a7cd3f8925678d2dcc192026a35f442 board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=80a472746dedb580748bd37f18a623d1
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-9999
index 3b1398e..056c3ee 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-experimental-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel (experimental)
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=13dbef85c5259ee2dadb3ddf5b22c98c
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3b1239505117f0d09b9f8ebf1597cfdd
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-next-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-next-9999
index 5006685..eba7381 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-next-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-next-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel (next)
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=769bb21662cd01b46310f4c536a9bf3d
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=a53559aba12032b8355ba74d97215f49
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.7_rc7-r3 b/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.7_rc7-r3
deleted file mode 100644
index dc91619..0000000
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.7_rc7-r3
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
-DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
-DESCRIPTION=Chrome OS Linux Kernel latest upstream rc
-EAPI=7
-HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_d67918209e72ea1920ce6fbede092fe1a032420d board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
-KEYWORDS=*
-LICENSE=GPL-2
-PROPERTIES=live
-REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
-RESTRICT=binchecks mirror
-SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d9d50e10a4949e7df874cc67783bd557
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.9_rc7-r10 b/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.9_rc7-r10
new file mode 100644
index 0000000..12e8b75
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-5.9_rc7-r10
@@ -0,0 +1,15 @@
+BDEPEND=dev-vcs/git sys-apps/debianutils
+DEFINED_PHASES=compile configure info install prepare setup unpack
+DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
+DESCRIPTION=Chrome OS Linux Kernel latest upstream rc
+EAPI=7
+HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
+IUSE=cros_host cros_workon_tree_2118221108c0fb8498951ada967683396a0660be board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+KEYWORDS=*
+LICENSE=GPL-2
+PROPERTIES=live
+REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
+RESTRICT=binchecks mirror
+SLOT=0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5ce6de8de6369cd3a812a73fa3365db7
diff --git a/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-9999 b/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-9999
index a5405a0..02b8287 100644
--- a/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-9999
+++ b/metadata/md5-cache/sys-kernel/chromeos-kernel-upstream-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Chrome OS Linux Kernel latest upstream rc
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=~*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=be9eed8be3b56eec1e27b98ecb026de0
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c85d12d74ad0a1aaae4f7bf7a658e86c
diff --git a/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r362 b/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r362
deleted file mode 100644
index 349cd02..0000000
--- a/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r362
+++ /dev/null
@@ -1,15 +0,0 @@
-BDEPEND=dev-lang/python dev-vcs/git dev-vcs/git
-DEFINED_PHASES=info install setup test unpack
-DESCRIPTION=Firmware images from the upstream linux-fimware package
-EAPI=7
-HOMEPAGE=https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/
-IUSE=kernel-4_19 kernel-5_4 linux_firmware_adreno-630 linux_firmware_adsp_apl linux_firmware_adsp_cnl linux_firmware_adsp_glk linux_firmware_adsp_kbl linux_firmware_adsp_skl linux_firmware_ath9k_htc linux_firmware_ath10k_qca6174a-5 linux_firmware_ath10k_qca6174a-3 linux_firmware_ath10k_wcn3990 linux_firmware_bcm4354-bt linux_firmware_cros-pd linux_firmware_fw_sst linux_firmware_fw_sst2 linux_firmware_i915_bxt linux_firmware_i915_cnl linux_firmware_i915_glk linux_firmware_i915_jsl linux_firmware_i915_kbl linux_firmware_i915_skl linux_firmware_i915_tgl linux_firmware_ibt_9260 linux_firmware_ibt_9560 linux_firmware_ibt_ax200 linux_firmware_ibt_ax201 linux_firmware_ibt-hw linux_firmware_ipu3_fw linux_firmware_keyspan_usb linux_firmware_marvell-mwlwifi linux_firmware_marvell-pcie8897 linux_firmware_marvell-pcie8997 linux_firmware_mt8173-vpu linux_firmware_nvidia-xusb linux_firmware_qca6174a-3-bt linux_firmware_qca6174a-5-bt linux_firmware_qca-wcn3990-bt linux_firmware_qca-wcn3991-bt linux_firmware_rockchip-dptx linux_firmware_rt2870 linux_firmware_rtl8107e-1 linux_firmware_rtl8107e-2 linux_firmware_rtl8125a-3 linux_firmware_rtl8153 linux_firmware_rtl8168fp-3 linux_firmware_rtl8168g-1 linux_firmware_rtl8168g-2 linux_firmware_rtl8168h-1 linux_firmware_rtl8168h-2 linux_firmware_rtl_bt-8822ce-uart linux_firmware_rtl_bt-8822ce-usb linux_firmware_rtw8822c linux_firmware_venus-52 linux_firmware_venus-54 linux_firmware_ath3k-all linux_firmware_ath3k-ar3011 linux_firmware_ath3k-ar3012 linux_firmware_iwlwifi-all linux_firmware_iwlwifi-100 linux_firmware_iwlwifi-105 linux_firmware_iwlwifi-135 linux_firmware_iwlwifi-1000 linux_firmware_iwlwifi-1000 linux_firmware_iwlwifi-2000 linux_firmware_iwlwifi-2030 linux_firmware_iwlwifi-3160 linux_firmware_iwlwifi-3945 linux_firmware_iwlwifi-4965 linux_firmware_iwlwifi-5000 linux_firmware_iwlwifi-5150 linux_firmware_iwlwifi-6000 linux_firmware_iwlwifi-6005 linux_firmware_iwlwifi-6030 linux_firmware_iwlwifi-6050 linux_firmware_iwlwifi-7260 linux_firmware_iwlwifi-7265 linux_firmware_iwlwifi-7265D linux_firmware_iwlwifi-9000 linux_firmware_iwlwifi-9260 linux_firmware_iwlwifi-cc linux_firmware_iwlwifi-Qu-c0 linux_firmware_iwlwifi-QuZ linux_firmware_brcmfmac-all linux_firmware_brcmfmac4354-sdio linux_firmware_brcmfmac4356-pcie linux_firmware_brcmfmac4371-pcie video_cards_radeon video_cards_amdgpu cros_host cros_workon_tree_b32f947c7aac638ea635e5c3dd2b605d21d850f7
-KEYWORDS=*
-LICENSE=linux_firmware_adreno-630? ( LICENSE.qcom ) linux_firmware_adsp_apl? ( LICENCE.adsp_sst ) linux_firmware_adsp_cnl? ( LICENCE.adsp_sst ) linux_firmware_adsp_glk? ( LICENCE.adsp_sst ) linux_firmware_adsp_kbl? ( LICENCE.adsp_sst ) linux_firmware_adsp_skl? ( LICENCE.adsp_sst ) linux_firmware_ath3k-all? ( LICENCE.atheros_firmware ) linux_firmware_ath3k-ar3011? ( LICENCE.atheros_firmware ) linux_firmware_ath3k-ar3012? ( LICENCE.atheros_firmware ) linux_firmware_ath9k_htc? ( LICENCE.atheros_firmware ) linux_firmware_ath10k_qca6174a-5? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_ath10k_qca6174a-3? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_ath10k_wcn3990? ( LICENCE.atheros_firmware ) linux_firmware_bcm4354-bt? ( LICENCE.broadcom_bcm43xx ) linux_firmware_cros-pd? ( BSD-Google ) linux_firmware_fw_sst? ( LICENCE.fw_sst ) linux_firmware_fw_sst2? ( LICENCE.IntcSST2 ) linux_firmware_i915_bxt? ( LICENSE.i915 ) linux_firmware_i915_cnl? ( LICENSE.i915 ) linux_firmware_i915_glk? ( LICENSE.i915 ) linux_firmware_i915_jsl? ( LICENSE.i915 ) linux_firmware_i915_kbl? ( LICENSE.i915 ) linux_firmware_i915_skl? ( LICENSE.i915 ) linux_firmware_i915_tgl? ( LICENSE.i915 ) linux_firmware_ipu3_fw? ( LICENSE.ipu3_firmware ) linux_firmware_ibt_9260? ( LICENCE.ibt_firmware ) linux_firmware_ibt_9560? ( LICENCE.ibt_firmware ) linux_firmware_ibt_ax200? ( LICENCE.ibt_firmware ) linux_firmware_ibt_ax201? ( LICENCE.ibt_firmware ) linux_firmware_ibt-hw? ( LICENCE.ibt_firmware ) linux_firmware_keyspan_usb? ( LICENSE.keyspan_usb ) linux_firmware_marvell-mwlwifi? ( LICENCE.Marvell ) linux_firmware_marvell-pcie8897? ( LICENCE.Marvell ) linux_firmware_marvell-pcie8997? ( LICENCE.Marvell ) linux_firmware_mt8173-vpu? ( LICENCE.mediatek-vpu ) linux_firmware_nvidia-xusb? ( LICENCE.nvidia ) linux_firmware_qca6174a-3-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca6174a-5-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca-wcn3990-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca-wcn3991-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_rockchip-dptx? ( LICENCE.rockchip ) linux_firmware_rt2870? ( LICENCE.ralink-firmware.txt LICENCE.ralink_a_mediatek_company_firmware ) linux_firmware_rtl8107e-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8107e-2? ( LICENCE.rtl_nic ) linux_firmware_rtl8125a-3? ( LICENCE.rtl_nic ) linux_firmware_rtl8153? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtl8168fp-3? ( LICENCE.rtl_nic ) linux_firmware_rtl8168g-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8168g-2? ( LICENCE.rtl_nic ) linux_firmware_rtl8168h-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8168h-2? ( LICENCE.rtl_nic ) linux_firmware_rtl_bt-8822ce-uart? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtl_bt-8822ce-usb? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtw8822c? ( LICENCE.rtlwifi_firmware ) linux_firmware_venus-52? ( LICENSE.qcom ) linux_firmware_venus-54? ( LICENSE.qcom ) linux_firmware_iwlwifi-all? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-100? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-105? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-135? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-1000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-1000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-2000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-2030? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-3160? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-3945? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-4965? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-5000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-5150? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6005? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6030? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6050? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7260? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7265? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7265D? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-9000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-9260? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-cc? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-Qu-c0? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-QuZ? ( LICENCE.iwlwifi_firmware ) linux_firmware_brcmfmac-all? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4354-sdio? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4356-pcie? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4371-pcie? ( LICENCE.broadcom_bcm43xx ) video_cards_radeon? ( LICENSE.radeon ) video_cards_amdgpu? ( LICENSE.amdgpu )
-PROPERTIES=live
-RDEPEND=linux_firmware_adreno-630? ( !media-libs/a630-fw ) linux_firmware_ath3k-all? ( !net-wireless/ath3k ) linux_firmware_ath3k-ar3011? ( !net-wireless/ath3k ) linux_firmware_ath3k-ar3012? ( !net-wireless/ath3k ) linux_firmware_keyspan_usb? ( !sys-kernel/chromeos-kernel-3_8[firmware_install] !sys-kernel/chromeos-kernel-3_10[firmware_install] !sys-kernel/chromeos-kernel-3_14[firmware_install] !sys-kernel/chromeos-kernel-3_18[firmware_install] !sys-kernel/chromeos-kernel-4_4[firmware_install] ) linux_firmware_marvell-pcie8897? ( !net-wireless/marvell_sd8787[pcie] ) linux_firmware_marvell-pcie8997? ( !net-wireless/marvell_sd8787[pcie] ) linux_firmware_mt8173-vpu? ( !media-libs/vpu-fw ) linux_firmware_nvidia-xusb? ( !sys-kernel/xhci-firmware ) linux_firmware_rt2870? ( !net-wireless/realtek-rt2800-firmware ) !net-wireless/ath6k !net-wireless/ath10k !net-wireless/iwl1000-ucode !net-wireless/iwl2000-ucode !net-wireless/iwl2030-ucode !net-wireless/iwl3945-ucode !net-wireless/iwl4965-ucode !net-wireless/iwl5000-ucode !net-wireless/iwl6000-ucode !net-wireless/iwl6005-ucode !net-wireless/iwl6030-ucode !net-wireless/iwl6050-ucode
-REQUIRED_USE=?? ( kernel-4_19 kernel-5_4 )
-RESTRICT=binchecks strip
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=a5a55c607afe377c886a79928253e75c
diff --git a/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r388 b/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r388
new file mode 100644
index 0000000..a401dd1
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/linux-firmware-0.0.1-r388
@@ -0,0 +1,15 @@
+BDEPEND=dev-lang/python dev-vcs/git dev-vcs/git
+DEFINED_PHASES=info install setup test unpack
+DESCRIPTION=Firmware images from the upstream linux-fimware package
+EAPI=7
+HOMEPAGE=https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/
+IUSE=kernel-4_19 kernel-5_4 linux_firmware_adreno-630 linux_firmware_adsp_apl linux_firmware_adsp_cnl linux_firmware_adsp_glk linux_firmware_adsp_kbl linux_firmware_adsp_skl linux_firmware_ath9k_htc linux_firmware_ath10k_qca6174a-5 linux_firmware_ath10k_qca6174a-3 linux_firmware_ath10k_wcn3990 linux_firmware_bcm4354-bt linux_firmware_cros-pd linux_firmware_fw_sst linux_firmware_fw_sst2 linux_firmware_i915_bxt linux_firmware_i915_cnl linux_firmware_i915_glk linux_firmware_i915_jsl linux_firmware_i915_kbl linux_firmware_i915_skl linux_firmware_i915_tgl linux_firmware_ibt_9260 linux_firmware_ibt_9560 linux_firmware_ibt_ax200 linux_firmware_ibt_ax201 linux_firmware_ibt-hw linux_firmware_ipu3_fw linux_firmware_keyspan_usb linux_firmware_marvell-mwlwifi linux_firmware_marvell-pcie8897 linux_firmware_marvell-pcie8997 linux_firmware_mt8173-vpu linux_firmware_nvidia-xusb linux_firmware_qca6174a-3-bt linux_firmware_qca6174a-5-bt linux_firmware_qca-wcn3990-bt linux_firmware_qca-wcn3991-bt linux_firmware_rockchip-dptx linux_firmware_rt2870 linux_firmware_rtl8107e-1 linux_firmware_rtl8107e-2 linux_firmware_rtl8125a-3 linux_firmware_rtl8153 linux_firmware_rtl8168fp-3 linux_firmware_rtl8168g-1 linux_firmware_rtl8168g-2 linux_firmware_rtl8168h-1 linux_firmware_rtl8168h-2 linux_firmware_rtl_bt-8822ce-uart linux_firmware_rtl_bt-8822ce-usb linux_firmware_rtw8822c linux_firmware_venus-52 linux_firmware_venus-54 linux_firmware_ath3k-all linux_firmware_ath3k-ar3011 linux_firmware_ath3k-ar3012 linux_firmware_iwlwifi-all linux_firmware_iwlwifi-100 linux_firmware_iwlwifi-105 linux_firmware_iwlwifi-135 linux_firmware_iwlwifi-1000 linux_firmware_iwlwifi-1000 linux_firmware_iwlwifi-2000 linux_firmware_iwlwifi-2030 linux_firmware_iwlwifi-3160 linux_firmware_iwlwifi-3945 linux_firmware_iwlwifi-4965 linux_firmware_iwlwifi-5000 linux_firmware_iwlwifi-5150 linux_firmware_iwlwifi-6000 linux_firmware_iwlwifi-6005 linux_firmware_iwlwifi-6030 linux_firmware_iwlwifi-6050 linux_firmware_iwlwifi-7260 linux_firmware_iwlwifi-7265 linux_firmware_iwlwifi-7265D linux_firmware_iwlwifi-9000 linux_firmware_iwlwifi-9260 linux_firmware_iwlwifi-cc linux_firmware_iwlwifi-Qu-c0 linux_firmware_iwlwifi-QuZ linux_firmware_brcmfmac-all linux_firmware_brcmfmac4354-sdio linux_firmware_brcmfmac4356-pcie linux_firmware_brcmfmac4371-pcie video_cards_radeon video_cards_amdgpu cros_host cros_workon_tree_f2357ce3756f61d4be6794a2e784b6165e2455df
+KEYWORDS=*
+LICENSE=linux_firmware_adreno-630? ( LICENSE.qcom ) linux_firmware_adsp_apl? ( LICENCE.adsp_sst ) linux_firmware_adsp_cnl? ( LICENCE.adsp_sst ) linux_firmware_adsp_glk? ( LICENCE.adsp_sst ) linux_firmware_adsp_kbl? ( LICENCE.adsp_sst ) linux_firmware_adsp_skl? ( LICENCE.adsp_sst ) linux_firmware_ath3k-all? ( LICENCE.atheros_firmware ) linux_firmware_ath3k-ar3011? ( LICENCE.atheros_firmware ) linux_firmware_ath3k-ar3012? ( LICENCE.atheros_firmware ) linux_firmware_ath9k_htc? ( LICENCE.atheros_firmware ) linux_firmware_ath10k_qca6174a-5? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_ath10k_qca6174a-3? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_ath10k_wcn3990? ( LICENCE.atheros_firmware ) linux_firmware_bcm4354-bt? ( LICENCE.broadcom_bcm43xx ) linux_firmware_cros-pd? ( BSD-Google ) linux_firmware_fw_sst? ( LICENCE.fw_sst ) linux_firmware_fw_sst2? ( LICENCE.IntcSST2 ) linux_firmware_i915_bxt? ( LICENSE.i915 ) linux_firmware_i915_cnl? ( LICENSE.i915 ) linux_firmware_i915_glk? ( LICENSE.i915 ) linux_firmware_i915_jsl? ( LICENSE.i915 ) linux_firmware_i915_kbl? ( LICENSE.i915 ) linux_firmware_i915_skl? ( LICENSE.i915 ) linux_firmware_i915_tgl? ( LICENSE.i915 ) linux_firmware_ipu3_fw? ( LICENSE.ipu3_firmware ) linux_firmware_ibt_9260? ( LICENCE.ibt_firmware ) linux_firmware_ibt_9560? ( LICENCE.ibt_firmware ) linux_firmware_ibt_ax200? ( LICENCE.ibt_firmware ) linux_firmware_ibt_ax201? ( LICENCE.ibt_firmware ) linux_firmware_ibt-hw? ( LICENCE.ibt_firmware ) linux_firmware_keyspan_usb? ( LICENSE.keyspan_usb ) linux_firmware_marvell-mwlwifi? ( LICENCE.Marvell ) linux_firmware_marvell-pcie8897? ( LICENCE.Marvell ) linux_firmware_marvell-pcie8997? ( LICENCE.Marvell ) linux_firmware_mt8173-vpu? ( LICENCE.mediatek-vpu ) linux_firmware_nvidia-xusb? ( LICENCE.nvidia ) linux_firmware_qca6174a-3-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca6174a-5-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca-wcn3990-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_qca-wcn3991-bt? ( LICENSE.QualcommAtheros_ath10k ) linux_firmware_rockchip-dptx? ( LICENCE.rockchip ) linux_firmware_rt2870? ( LICENCE.ralink-firmware.txt LICENCE.ralink_a_mediatek_company_firmware ) linux_firmware_rtl8107e-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8107e-2? ( LICENCE.rtl_nic ) linux_firmware_rtl8125a-3? ( LICENCE.rtl_nic ) linux_firmware_rtl8153? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtl8168fp-3? ( LICENCE.rtl_nic ) linux_firmware_rtl8168g-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8168g-2? ( LICENCE.rtl_nic ) linux_firmware_rtl8168h-1? ( LICENCE.rtl_nic ) linux_firmware_rtl8168h-2? ( LICENCE.rtl_nic ) linux_firmware_rtl_bt-8822ce-uart? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtl_bt-8822ce-usb? ( LICENCE.rtlwifi_firmware ) linux_firmware_rtw8822c? ( LICENCE.rtlwifi_firmware ) linux_firmware_venus-52? ( LICENSE.qcom ) linux_firmware_venus-54? ( LICENSE.qcom ) linux_firmware_iwlwifi-all? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-100? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-105? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-135? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-1000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-1000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-2000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-2030? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-3160? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-3945? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-4965? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-5000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-5150? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6005? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6030? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-6050? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7260? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7265? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-7265D? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-9000? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-9260? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-cc? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-Qu-c0? ( LICENCE.iwlwifi_firmware ) linux_firmware_iwlwifi-QuZ? ( LICENCE.iwlwifi_firmware ) linux_firmware_brcmfmac-all? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4354-sdio? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4356-pcie? ( LICENCE.broadcom_bcm43xx ) linux_firmware_brcmfmac4371-pcie? ( LICENCE.broadcom_bcm43xx ) video_cards_radeon? ( LICENSE.radeon ) video_cards_amdgpu? ( LICENSE.amdgpu )
+PROPERTIES=live
+RDEPEND=linux_firmware_adreno-630? ( !media-libs/a630-fw ) linux_firmware_ath3k-all? ( !net-wireless/ath3k ) linux_firmware_ath3k-ar3011? ( !net-wireless/ath3k ) linux_firmware_ath3k-ar3012? ( !net-wireless/ath3k ) linux_firmware_keyspan_usb? ( !sys-kernel/chromeos-kernel-3_8[firmware_install] !sys-kernel/chromeos-kernel-3_10[firmware_install] !sys-kernel/chromeos-kernel-3_14[firmware_install] !sys-kernel/chromeos-kernel-3_18[firmware_install] !sys-kernel/chromeos-kernel-4_4[firmware_install] ) linux_firmware_marvell-pcie8897? ( !net-wireless/marvell_sd8787[pcie] ) linux_firmware_marvell-pcie8997? ( !net-wireless/marvell_sd8787[pcie] ) linux_firmware_mt8173-vpu? ( !media-libs/vpu-fw ) linux_firmware_nvidia-xusb? ( !sys-kernel/xhci-firmware ) linux_firmware_rt2870? ( !net-wireless/realtek-rt2800-firmware ) !net-wireless/ath6k !net-wireless/ath10k !net-wireless/iwl1000-ucode !net-wireless/iwl2000-ucode !net-wireless/iwl2030-ucode !net-wireless/iwl3945-ucode !net-wireless/iwl4965-ucode !net-wireless/iwl5000-ucode !net-wireless/iwl6000-ucode !net-wireless/iwl6005-ucode !net-wireless/iwl6030-ucode !net-wireless/iwl6050-ucode
+REQUIRED_USE=?? ( kernel-4_19 kernel-5_4 )
+RESTRICT=binchecks strip
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=5944a3496448f394b468ceb5a1711bde
diff --git a/metadata/md5-cache/sys-kernel/linux-firmware-9999 b/metadata/md5-cache/sys-kernel/linux-firmware-9999
index 69379e5..4728ffd 100644
--- a/metadata/md5-cache/sys-kernel/linux-firmware-9999
+++ b/metadata/md5-cache/sys-kernel/linux-firmware-9999
@@ -11,5 +11,5 @@
 REQUIRED_USE=?? ( kernel-4_19 kernel-5_4 )
 RESTRICT=binchecks strip
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2f749299a89406ee3b4e250b7485dd6b
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=37b1ac40595d599ae9c3276370fce9e9
diff --git a/metadata/md5-cache/sys-kernel/linux-headers-4.14 b/metadata/md5-cache/sys-kernel/linux-headers-4.14
index 5ddd50f..017163d 100644
--- a/metadata/md5-cache/sys-kernel/linux-headers-4.14
+++ b/metadata/md5-cache/sys-kernel/linux-headers-4.14
@@ -11,4 +11,4 @@
 SLOT=0
 SRC_URI=mirror://gentoo/gentoo-headers-base-4.14.tar.xz mirror://gentoo/gentoo-headers-4.14-1.tar.xz
 _eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	kernel-2	50e2a9c5725758a927075467bd13698f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=b44b62b79f43298c7d475b905ca2389d
+_md5_=23d4188bc1abe15b3b7cf373e341b7f6
diff --git a/metadata/md5-cache/sys-kernel/linux-headers-4.14-r25 b/metadata/md5-cache/sys-kernel/linux-headers-4.14-r25
deleted file mode 100644
index 5ddd50f..0000000
--- a/metadata/md5-cache/sys-kernel/linux-headers-4.14-r25
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile install postinst postrm preinst prepare setup test unpack
-DEPEND=app-arch/xz-utils dev-lang/perl
-DESCRIPTION=Linux system headers
-EAPI=6
-HOMEPAGE=http://www.kernel.org/ http://www.gentoo.org/
-IUSE=crosscompile_opts_headers-only
-KEYWORDS=*
-LICENSE=GPL-2
-RDEPEND=!!media-sound/alsa-headers
-RESTRICT=binchecks strip
-SLOT=0
-SRC_URI=mirror://gentoo/gentoo-headers-base-4.14.tar.xz mirror://gentoo/gentoo-headers-4.14-1.tar.xz
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	kernel-2	50e2a9c5725758a927075467bd13698f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=b44b62b79f43298c7d475b905ca2389d
diff --git a/metadata/md5-cache/sys-kernel/linux-headers-4.14-r29 b/metadata/md5-cache/sys-kernel/linux-headers-4.14-r29
new file mode 100644
index 0000000..017163d
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/linux-headers-4.14-r29
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile install postinst postrm preinst prepare setup test unpack
+DEPEND=app-arch/xz-utils dev-lang/perl
+DESCRIPTION=Linux system headers
+EAPI=6
+HOMEPAGE=http://www.kernel.org/ http://www.gentoo.org/
+IUSE=crosscompile_opts_headers-only
+KEYWORDS=*
+LICENSE=GPL-2
+RDEPEND=!!media-sound/alsa-headers
+RESTRICT=binchecks strip
+SLOT=0
+SRC_URI=mirror://gentoo/gentoo-headers-base-4.14.tar.xz mirror://gentoo/gentoo-headers-4.14-1.tar.xz
+_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	kernel-2	50e2a9c5725758a927075467bd13698f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_md5_=23d4188bc1abe15b3b7cf373e341b7f6
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2746 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2746
deleted file mode 100644
index 032fbd6..0000000
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2746
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=lp0 resume blob for Tegra
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20
-KEYWORDS=-* arm arm64
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r2746
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=f44ecac0796d3501a0a3a20ab480daad
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2835 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2835
new file mode 100644
index 0000000..6b73256
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-0.0.1-r2835
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=lp0 resume blob for Tegra
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce
+KEYWORDS=-* arm arm64
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r2835
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=754a860ca66b9f231fe2b8149ceddc2e
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-9999 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-9999
index aa397a0..544b243 100644
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-9999
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=e33747f246c93440d0e46e2b5b769558
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2314 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2314
deleted file mode 100644
index 81c0eb6..0000000
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2314
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=lp0 resume blob for Tegra
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20
-KEYWORDS=-* arm arm64
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r2314
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=2b60ae40a1e96c759fc18bff4b54b4a4
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2403 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2403
new file mode 100644
index 0000000..022b34e
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-0.0.1-r2403
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=lp0 resume blob for Tegra
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce
+KEYWORDS=-* arm arm64
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r2403
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ce21daa0925e68c1a89b69204f95716b
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-9999 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-9999
index 2811bc0..10d7296 100644
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-9999
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t132-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=7067c17da1c0f548d811af94ae6e107a
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1813 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1813
deleted file mode 100644
index 2c0ce64..0000000
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1813
+++ /dev/null
@@ -1,12 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=compile info install setup unpack
-DESCRIPTION=lp0 resume blob for Tegra
-EAPI=7
-HOMEPAGE=http://www.coreboot.org
-IUSE=cros_host cros_workon_tree_c65d26079244f4817d23ede7296eb0e913a5dd20
-KEYWORDS=-* arm arm64
-LICENSE=GPL-2
-PROPERTIES=live
-SLOT=0/0.0.1-r1813
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=d85c5346496f30ecb322fedf46942119
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1902 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1902
new file mode 100644
index 0000000..eaff0fc
--- /dev/null
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-0.0.1-r1902
@@ -0,0 +1,12 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=compile info install setup unpack
+DESCRIPTION=lp0 resume blob for Tegra
+EAPI=7
+HOMEPAGE=http://www.coreboot.org
+IUSE=cros_host cros_workon_tree_819d1e4534d9036bca2118f64bff6ec92f5ca5ce
+KEYWORDS=-* arm arm64
+LICENSE=GPL-2
+PROPERTIES=live
+SLOT=0/0.0.1-r1902
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=ad8253a73190c420957beb68a3bbf346
diff --git a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-9999 b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-9999
index 1a60aa1..7465901 100644
--- a/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-9999
+++ b/metadata/md5-cache/sys-kernel/tegra_lp0_resume-t210-9999
@@ -8,5 +8,5 @@
 LICENSE=GPL-2
 PROPERTIES=live
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=94bf294c605b995f644ac27e6bea707d
diff --git a/metadata/md5-cache/sys-kernel/upstream-kernel-mainline-9999 b/metadata/md5-cache/sys-kernel/upstream-kernel-mainline-9999
index 2042d57..7afb645 100644
--- a/metadata/md5-cache/sys-kernel/upstream-kernel-mainline-9999
+++ b/metadata/md5-cache/sys-kernel/upstream-kernel-mainline-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Linux Kernel Upstream (mainline)
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=772607503c0a756690fbcd46f57907f5
diff --git a/metadata/md5-cache/sys-kernel/upstream-kernel-next-9999 b/metadata/md5-cache/sys-kernel/upstream-kernel-next-9999
index 67e8d1c..0ddb5b3 100644
--- a/metadata/md5-cache/sys-kernel/upstream-kernel-next-9999
+++ b/metadata/md5-cache/sys-kernel/upstream-kernel-next-9999
@@ -1,15 +1,15 @@
 BDEPEND=dev-vcs/git sys-apps/debianutils
-DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEFINED_PHASES=compile configure info install prepare setup unpack
 DEPEND=sys-kernel/linux-firmware factory_netboot_ramfs? ( chromeos-base/chromeos-initramfs[factory_netboot_ramfs] ) factory_shim_ramfs? ( chromeos-base/chromeos-initramfs[factory_shim_ramfs] ) recovery_ramfs? ( chromeos-base/chromeos-initramfs[recovery_ramfs] ) builtin_fw_t210_nouveau? ( sys-kernel/nouveau-firmware ) builtin_fw_t210_bpmp? ( sys-kernel/tegra_bpmp-t210 ) builtin_fw_x86_aml_ucode? ( chromeos-base/aml-ucode-firmware-private ) builtin_fw_x86_apl_ucode? ( chromeos-base/apl-ucode-firmware-private ) builtin_fw_x86_bdw_ucode? ( chromeos-base/bdw-ucode-firmware-private ) builtin_fw_x86_bsw_ucode? ( chromeos-base/bsw-ucode-firmware-private ) builtin_fw_x86_byt_ucode? ( chromeos-base/byt-ucode-firmware-private ) builtin_fw_x86_cml_ucode? ( chromeos-base/cml-ucode-firmware-private ) builtin_fw_x86_glk_ucode? ( chromeos-base/glk-ucode-firmware-private ) builtin_fw_x86_jsl_ucode? ( chromeos-base/jsl-ucode-firmware-private ) builtin_fw_x86_kbl_ucode? ( chromeos-base/kbl-ucode-firmware-private ) builtin_fw_x86_skl_ucode? ( chromeos-base/skl-ucode-firmware-private ) builtin_fw_x86_whl_ucode? ( chromeos-base/whl-ucode-firmware-private )
 DESCRIPTION=Linux Kernel Upstream (next)
 EAPI=7
 HOMEPAGE=https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel
-IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-arcvm-pi board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcdual board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify test +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp pvrdebug qmi realtekpstor recovery_ramfs samsung_serial selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
+IUSE=cros_host cros_workon_tree_ board_use_acorn board_use_ambassador board_use_amd64-corei7 board_use_amd64-generic board_use_amd64-generic-cheets board_use_amd64-generic-goofy board_use_amd64-generic_embedded board_use_amd64-host board_use_aplrvp board_use_aries board_use_arkham board_use_arm-generic board_use_arm64-generic board_use_arm64-llvmpipe board_use_asuka board_use_asurada board_use_atlas board_use_atlas-arm64 board_use_atlas-blueznext board_use_atlas-kvm board_use_auron board_use_auron_paine board_use_auron_pearlvalley board_use_auron_yuna board_use_banjo board_use_banon board_use_bayleybay board_use_beaglebone board_use_beaglebone_servo board_use_beaglebone_vv1 board_use_beltino board_use_betty board_use_betty-arc64 board_use_betty-arcmaster board_use_betty-arcnext board_use_betty-arcvm-master board_use_betty-pi-arc board_use_blackwall board_use_bob board_use_bobcat board_use_bolt board_use_borealis board_use_bruteus board_use_brya board_use_bubs board_use_buddy board_use_buddy-cfm board_use_butterfly board_use_bwtm2 board_use_candy board_use_capri board_use_capri-zfpga board_use_caroline board_use_caroline-arc64 board_use_caroline-kernelnext board_use_caroline-ndktranslation board_use_caroline-userdebug board_use_cardhu board_use_cave board_use_celes board_use_celes-cheets board_use_chell board_use_chell-cheets board_use_cheza board_use_cheza-freedreno board_use_cheza64 board_use_cheza64-freedreno board_use_cid board_use_clapper board_use_cmlrvp board_use_cobblepot board_use_coral board_use_cosmos board_use_cranky board_use_cyan board_use_cyan-cheets board_use_cyan-kernelnext board_use_cyclone board_use_daisy board_use_daisy_embedded board_use_daisy_skate board_use_daisy_snow board_use_daisy_spring board_use_daisy_winter board_use_dalmore board_use_danger board_use_danger_embedded board_use_dedede board_use_deltaur board_use_drallion board_use_duck board_use_edgar board_use_elm board_use_elm-cheets board_use_elm-kernelnext board_use_endeavour board_use_enguarde board_use_eve board_use_eve-arcnext board_use_eve-arc-r board_use_eve-arcvm board_use_eve-arcvm-mesa-virgl-next board_use_eve-arm64 board_use_eve-campfire board_use_eve-kernelnext board_use_eve-kvm board_use_eve-lacros board_use_eve-manatee board_use_eve-swap board_use_eve-userdebug board_use_excelsior board_use_expresso board_use_falco board_use_falco_gles board_use_falco_li board_use_fb1 board_use_fizz board_use_fizz-accelerator board_use_fizz-cfm board_use_fizz-labstation board_use_fizz-moblab board_use_flapjack board_use_foster board_use_gale board_use_gandof board_use_genesis board_use_glados board_use_glados-cheets board_use_glimmer board_use_glimmer-cheets board_use_glkrvp board_use_gnawty board_use_gonzo board_use_gru board_use_grunt board_use_grunt-arc-r board_use_grunt-kernelnext board_use_guado board_use_guado-accelerator board_use_guado-cfm board_use_guado-macrophage board_use_guado_moblab board_use_guado_labstation board_use_hana board_use_hana-kernelnext board_use_hatch board_use_hatch-arc-r board_use_hatch-arc-r-userdebug board_use_hatch-blueznext board_use_hatch-borealis board_use_hatch-diskswap board_use_hatch-kernelnext board_use_heli board_use_hsb board_use_ironhide board_use_jacuzzi board_use_jecht board_use_kalista board_use_kalista-cfm board_use_kayle board_use_kblrvp board_use_kefka board_use_kefka-kernelnext board_use_kevin board_use_kevin64 board_use_kevin-arc64 board_use_kevin-tpm2 board_use_kidd board_use_kip board_use_klang board_use_kukui board_use_kukui-arc-r board_use_kukui-arc64 board_use_kumo board_use_kunimitsu board_use_lakitu board_use_lakitu-gpu board_use_lakitu-nc board_use_lakitu_next board_use_lakitu-slice board_use_lakitu-st board_use_lars board_use_laser board_use_lasilla-ground board_use_lassen board_use_leon board_use_link board_use_littlejoe board_use_loonix board_use_lulu board_use_lulu-cheets board_use_lumpy board_use_mappy board_use_mappy_flashstation board_use_marble board_use_mccloud board_use_metis board_use_minnowboard board_use_mipseb-n32-generic board_use_mipseb-n64-generic board_use_mipseb-o32-generic board_use_mipsel-n32-generic board_use_mipsel-n64-generic board_use_mipsel-o32-generic board_use_mistral board_use_moblab-generic-vm board_use_monroe board_use_moose board_use_mushu board_use_nami board_use_nami-kvm board_use_nautilus board_use_ninja board_use_nocturne board_use_nocturne-arm64 board_use_novato board_use_novato-arc64 board_use_novato-arcnext board_use_nyan board_use_nyan_big board_use_nyan_blaze board_use_nyan_kitty board_use_oak board_use_oak-cheets board_use_octavius board_use_octopus board_use_orchestra board_use_orco board_use_palkia board_use_panda board_use_panther board_use_panther_embedded board_use_panther_goofy board_use_panther_moblab board_use_parrot board_use_parrot32 board_use_parrot64 board_use_parrot_ivb board_use_peach board_use_peach_kirby board_use_peach_pi board_use_peach_pit board_use_peppy board_use_plaso board_use_poppy board_use_ppcbe-32-generic board_use_ppcbe-64-generic board_use_ppcle-32-generic board_use_ppcle-64-generic board_use_puff board_use_puff-macrophage board_use_puppy board_use_purin board_use_pyro board_use_quawks board_use_rainier board_use_rambi board_use_rammus board_use_rammus-arc-r board_use_rammus-arc-r-userdebug board_use_raspberrypi board_use_reef board_use_relm board_use_reks board_use_reven board_use_rikku board_use_rikku-cfm board_use_rizer board_use_romer board_use_rotor board_use_rowan board_use_rush board_use_rush_ryu board_use_sama5d3 board_use_samus board_use_samus-cheets board_use_sand board_use_sarien board_use_sarien-kvm board_use_scarlet board_use_sentry board_use_setzer board_use_shadowkeep board_use_shogun board_use_sklrvp board_use_smaug board_use_smaug-cheets board_use_smaug-kasan board_use_snappy board_use_sonic board_use_soraka board_use_squawks board_use_stelvio board_use_storm board_use_storm_nand board_use_stout board_use_strago board_use_strongbad board_use_stumpy board_use_stumpy_moblab board_use_stumpy_pico board_use_sumo board_use_swanky board_use_tails board_use_tatl board_use_tael board_use_tegra3-generic board_use_terra board_use_tglrvp board_use_tidus board_use_tricky board_use_trogdor board_use_trogdor-kernelnext board_use_trogdor64 board_use_ultima board_use_umaro board_use_veyron board_use_veyron_fievel board_use_veyron_gus board_use_veyron_jaq board_use_veyron_jerry board_use_veyron_mickey board_use_veyron_mighty board_use_veyron_minnie board_use_veyron_minnie-cheets board_use_veyron_nicky board_use_veyron_pinky board_use_veyron_remy board_use_veyron_rialto board_use_veyron_shark board_use_veyron_speedy board_use_veyron_speedy-cheets board_use_veyron_thea board_use_veyron_tiger board_use_viking board_use_viking-poc2 board_use_volteer board_use_volteer-kernelnext board_use_whirlwind board_use_whlrvp board_use_winky board_use_wizpig board_use_wolf board_use_wooten board_use_wristpin board_use_wsb board_use_x30evb board_use_x32-generic board_use_x86-agz board_use_x86-alex board_use_x86-alex32 board_use_x86-alex32_he board_use_x86-alex_he board_use_x86-alex_hubble board_use_x86-dogfood board_use_x86-generic board_use_x86-generic_embedded board_use_x86-mario board_use_x86-mario64 board_use_x86-zgb board_use_x86-zgb32 board_use_x86-zgb32_he board_use_x86-zgb_he board_use_zako board_use_zoombini board_use_zork board_use_zork-borealis board_use_zork-kernelnext cros_host unibuild apply_patches -asan buildtest +clang -compilation_database -device_tree +dt_compression +fit_compression_kernel_lz4 fit_compression_kernel_lzma firmware_install -kernel_sources kernel_warning_level_1 kernel_warning_level_2 kernel_warning_level_3 +lld nfc -wireless34 -wireless38 -wireless318 -wireless42 -wifi_testbed_ap -boot_dts_device_tree -nowerror -ppp -binder -selinux_develop -transparent_hugepage tpm2 -kernel_afdo -kernel_afdo_verify +vdso32 -criu -docker acpi_ac allocator_slab apex binder blkdevram builtin_driver_amdgpu ca0132 cec criu cros_ec_mec debug debugobjects devdebug diskswap dmadebug dm_snapshot docker dp_cec drm_dp_aux_chardev dwc2_dual_role dyndebug ec2_guest_net eve_bt_hacks eve_wifi_etsi factory_netboot_ramfs factory_shim_ramfs failslab fbconsole goldfish highmem hypervisor_guest i2cdev irqsoff_tracer iscsi lockdown kasan kcov kernel_compress_xz kexec_file kgdb kmemleak kvm kvm_host kvm_nested lockdebug mbim memory_debug module_sign nested_l3_kvm nfc nfs nowerror pca954x pcserial plan9 ppp preempt_tracer pvrdebug qmi realtekpstor recovery_ramfs samsung_serial sched_tracer selinux_develop socketmon systemtap tpm transparent_hugepage ubsan usb_gadget usb_gadget_acm usb_gadget_audio usb_gadget_ncm usbip vfat virtio_balloon vivid vlan vmware_guest vtconsole wifi_testbed_ap wifi_diag wireless34 x32 xen_guest builtin_fw_amdgpu builtin_fw_t124_xusb builtin_fw_t210_xusb builtin_fw_t210_nouveau builtin_fw_t210_bpmp builtin_fw_guc_jsl builtin_fw_huc_jsl builtin_fw_guc_g9 builtin_fw_huc_g9 builtin_fw_x86_aml_ucode builtin_fw_x86_apl_ucode builtin_fw_x86_bdw_ucode builtin_fw_x86_bsw_ucode builtin_fw_x86_byt_ucode builtin_fw_x86_cml_ucode builtin_fw_x86_glk_ucode builtin_fw_x86_jsl_ucode builtin_fw_x86_kbl_ucode builtin_fw_x86_skl_ucode builtin_fw_x86_whl_ucode builtin_fw_vega12 builtin_fw_guc_tgl builtin_fw_huc_tgl
 KEYWORDS=*
 LICENSE=GPL-2
 PROPERTIES=live
 REQUIRED_USE=compilation_database? ( clang ) fit_compression_kernel_lz4? ( !fit_compression_kernel_lzma ) fit_compression_kernel_lzma? ( !fit_compression_kernel_lz4 ) lld? ( clang ) kgdb? ( vtconsole ) factory_netboot_ramfs? ( !recovery_ramfs !factory_shim_ramfs ) factory_shim_ramfs? ( !recovery_ramfs !factory_netboot_ramfs ) recovery_ramfs? ( !factory_netboot_ramfs !factory_shim_ramfs ) factory_netboot_ramfs? ( i2cdev ) factory_shim_ramfs? ( i2cdev ) recovery_ramfs? ( i2cdev ) factory_netboot_ramfs? ( || ( tpm tpm2 ) ) factory_shim_ramfs? ( || ( tpm tpm2 ) ) recovery_ramfs? ( || ( tpm tpm2 ) )
 RESTRICT=binchecks mirror
 SLOT=0
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	7482179b2dc7dce614e48e87b1904ce1	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	d5d8888847b2a9ca33313b19150eb6b1	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-board	6fda9fe3fc68a53e27c9babb5ff43d83	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-kernel2	f09d47edeb5cdc4803f0e191cf10b151	cros-workon	212b86ee95c1edffe51e7a643c301998	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=72710117d2e9d8bb8511cf08f2fe2483
diff --git a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483 b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483
deleted file mode 100644
index 527ebeb..0000000
--- a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=sys-devel/llvm sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Compiler runtime library for clang
-EAPI=6
-HOMEPAGE=http://compiler-rt.llvm.org/
-IUSE=+llvm-crt llvm-next llvm-tot
-KEYWORDS=*
-LICENSE=UoI-NCSA
-PROPERTIES=live
-SLOT=0
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=c2a621e4a83a1771d5c4575b5652d924
diff --git a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483-r1 b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483-r1
deleted file mode 100644
index 527ebeb..0000000
--- a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre394483-r1
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=sys-devel/llvm sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Compiler runtime library for clang
-EAPI=6
-HOMEPAGE=http://compiler-rt.llvm.org/
-IUSE=+llvm-crt llvm-next llvm-tot
-KEYWORDS=*
-LICENSE=UoI-NCSA
-PROPERTIES=live
-SLOT=0
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=c2a621e4a83a1771d5c4575b5652d924
diff --git a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094 b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094
new file mode 100644
index 0000000..b435fa4
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=sys-devel/llvm sys-devel/make >=dev-util/cmake-3.9.6
+DESCRIPTION=Compiler runtime library for clang
+EAPI=6
+HOMEPAGE=http://compiler-rt.llvm.org/
+IUSE=+llvm-crt llvm-next llvm-tot
+KEYWORDS=*
+LICENSE=UoI-NCSA
+PROPERTIES=live
+SLOT=0
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=71f8962414c1e86a2d09b2c9a5f9f3c4
diff --git a/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094-r2 b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094-r2
new file mode 100644
index 0000000..b435fa4
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/compiler-rt-11.0_pre399094-r2
@@ -0,0 +1,12 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=sys-devel/llvm sys-devel/make >=dev-util/cmake-3.9.6
+DESCRIPTION=Compiler runtime library for clang
+EAPI=6
+HOMEPAGE=http://compiler-rt.llvm.org/
+IUSE=+llvm-crt llvm-next llvm-tot
+KEYWORDS=*
+LICENSE=UoI-NCSA
+PROPERTIES=live
+SLOT=0
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=71f8962414c1e86a2d09b2c9a5f9f3c4
diff --git a/metadata/md5-cache/sys-libs/db-18.1.32 b/metadata/md5-cache/sys-libs/db-18.1.32
deleted file mode 100644
index 937fa49..0000000
--- a/metadata/md5-cache/sys-libs/db-18.1.32
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install postinst postrm preinst prepare setup test
-DEPEND=tcl? ( >=dev-lang/tcl-8.5.15-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) test? ( >=dev-lang/tcl-8.5.15-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jdk-1.5 ) >=sys-devel/binutils-2.16.1 test? ( >=dev-lang/tcl-8.4 ) java? ( >=dev-java/java-config-2.2.0-r3 ) >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Oracle Berkeley DB
-EAPI=6
-HOMEPAGE=http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html
-IUSE=doc java cxx tcl test doc test elibc_FreeBSD java abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=AGPL-3
-RDEPEND=tcl? ( >=dev-lang/tcl-8.5.15-r1:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) java? ( >=virtual/jre-1.5 ) java? ( >=dev-java/java-config-2.2.0-r3 )
-REQUIRED_USE=test? ( tcl )
-SLOT=18.1
-SRC_URI=https://download.oracle.com/otn/berkeley-db/db-18.1.32.tar.gz mirror://gentoo/db-18.1.32.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	db	1135d23301373966b04d357a4397bc9a	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	java-pkg-opt-2	be255db325e3af8fbf3506cf63998341	java-utils-2	82402a1c36ab4bf38f3313a543f9e827	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=294820db883511c597e1b4cb8973d0a5
diff --git a/metadata/md5-cache/sys-libs/gcc-libs-4.9.2-r50 b/metadata/md5-cache/sys-libs/gcc-libs-4.9.2-r50
index 94adbc4..fe6c403 100644
--- a/metadata/md5-cache/sys-libs/gcc-libs-4.9.2-r50
+++ b/metadata/md5-cache/sys-libs/gcc-libs-4.9.2-r50
@@ -8,5 +8,5 @@
 PROPERTIES=live
 REQUIRED_USE=go? ( libatomic )
 SLOT=0/4.9.2-r50
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=f7722e8a06ed254a941cb6d8b369f892
diff --git a/metadata/md5-cache/sys-libs/gcc-libs-9999 b/metadata/md5-cache/sys-libs/gcc-libs-9999
index 39a934a..3ed6cf7 100644
--- a/metadata/md5-cache/sys-libs/gcc-libs-9999
+++ b/metadata/md5-cache/sys-libs/gcc-libs-9999
@@ -8,5 +8,5 @@
 PROPERTIES=live
 REQUIRED_USE=go? ( libatomic )
 SLOT=0/9999
-_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=binutils-funcs	6207477a739f6f25d13da27b9cc00160	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=8e5d1aab1d882ee139f788d54653891b
diff --git a/metadata/md5-cache/sys-libs/glibc-2.27-r18 b/metadata/md5-cache/sys-libs/glibc-2.27-r18
index 3fa627e..d48b504 100644
--- a/metadata/md5-cache/sys-libs/glibc-2.27-r18
+++ b/metadata/md5-cache/sys-libs/glibc-2.27-r18
@@ -12,4 +12,4 @@
 SLOT=2.2
 SRC_URI=mirror://gnu/glibc/glibc-2.27.tar.xz https://dev.gentoo.org/~dilfridge/distfiles/glibc-2.27-patches-3.tar.bz2 multilib? ( https://dev.gentoo.org/~dilfridge/distfiles/gcc-multilib-bootstrap-20180511.tar.xz )
 _eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnuconfig	9200bfc8e0184357abfb86a08edd4fc3	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	prefix	e51c7882b7b721e54e684f7eb143cbfe	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=b272b68b096b199c53d6140fc33656a2
+_md5_=2b8fb74478a08ebeb8c9cf5a2530b8c5
diff --git a/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483 b/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483
deleted file mode 100644
index d961601..0000000
--- a/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) app-arch/xz-utils dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=New implementation of the C++ standard library, targeting C++11
-EAPI=6
-HOMEPAGE=http://libcxx.llvm.org/
-IUSE=+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs )
-REQUIRED_USE=libunwind? ( || ( libcxxabi libcxxrt ) ) ?? ( libcxxabi libcxxrt )
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=0994a3380c10e3d6555b9baac3171f29
diff --git a/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483-r1 b/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483-r1
deleted file mode 100644
index d961601..0000000
--- a/metadata/md5-cache/sys-libs/libcxx-11.0_pre394483-r1
+++ /dev/null
@@ -1,14 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) app-arch/xz-utils dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=New implementation of the C++ standard library, targeting C++11
-EAPI=6
-HOMEPAGE=http://libcxx.llvm.org/
-IUSE=+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs )
-REQUIRED_USE=libunwind? ( || ( libcxxabi libcxxrt ) ) ?? ( libcxxabi libcxxrt )
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=0994a3380c10e3d6555b9baac3171f29
diff --git a/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094 b/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094
new file mode 100644
index 0000000..d9e371d
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) app-arch/xz-utils dev-util/ninja >=dev-util/cmake-3.9.6
+DESCRIPTION=New implementation of the C++ standard library, targeting C++11
+EAPI=6
+HOMEPAGE=http://libcxx.llvm.org/
+IUSE=+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs )
+REQUIRED_USE=libunwind? ( || ( libcxxabi libcxxrt ) ) ?? ( libcxxabi libcxxrt )
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=118d3061103de4f876c2f740c104e8b4
diff --git a/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094-r1 b/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094-r1
new file mode 100644
index 0000000..d9e371d
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/libcxx-11.0_pre399094-r1
@@ -0,0 +1,14 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) app-arch/xz-utils dev-util/ninja >=dev-util/cmake-3.9.6
+DESCRIPTION=New implementation of the C++ standard library, targeting C++11
+EAPI=6
+HOMEPAGE=http://libcxx.llvm.org/
+IUSE=+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=libcxxabi? ( sys-libs/libcxxabi[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) libcxxrt? ( sys-libs/libcxxrt[libunwind=,static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) ) !cros_host? ( sys-libs/gcc-libs )
+REQUIRED_USE=libunwind? ( || ( libcxxabi libcxxrt ) ) ?? ( libcxxabi libcxxrt )
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=118d3061103de4f876c2f740c104e8b4
diff --git a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483 b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483
deleted file mode 100644
index 1eefdc1..0000000
--- a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=Low level support for a standard C++ library
-EAPI=6
-HOMEPAGE=http://libcxxabi.llvm.org/
-IUSE=+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs )
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=fc9fcdf10631952d84f17e02bb8dabb9
diff --git a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483-r1 b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483-r1
deleted file mode 100644
index 1eefdc1..0000000
--- a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre394483-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) dev-util/ninja >=dev-util/cmake-3.9.6
-DESCRIPTION=Low level support for a standard C++ library
-EAPI=6
-HOMEPAGE=http://libcxxabi.llvm.org/
-IUSE=+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs )
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	4900ae970f827a22d33d41bd8b8f9ace	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=fc9fcdf10631952d84f17e02bb8dabb9
diff --git a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094 b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094
new file mode 100644
index 0000000..dc9c554
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) dev-util/ninja >=dev-util/cmake-3.9.6
+DESCRIPTION=Low level support for a standard C++ library
+EAPI=6
+HOMEPAGE=http://libcxxabi.llvm.org/
+IUSE=+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs )
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=b65180fada1a103a190b57de859dc690
diff --git a/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094-r1 b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094-r1
new file mode 100644
index 0000000..dc9c554
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/libcxxabi-11.0_pre399094-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs ) cros_host? ( sys-devel/llvm ) dev-util/ninja >=dev-util/cmake-3.9.6
+DESCRIPTION=Low level support for a standard C++ library
+EAPI=6
+HOMEPAGE=http://libcxxabi.llvm.org/
+IUSE=+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=libunwind? ( || ( >=sys-libs/libunwind-1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=sys-libs/llvm-libunwind-3.9.0-r1[static-libs?,abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) !cros_host? ( sys-libs/gcc-libs )
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	llvm	aa54e879d157ef21f6ecf31f255eaa2e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-any-r1	54a3178500786b0a7ede4a23b7f2a6ad	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=b65180fada1a103a190b57de859dc690
diff --git a/metadata/md5-cache/sys-libs/lithium-0.0.1-r3 b/metadata/md5-cache/sys-libs/lithium-0.0.1-r3
index 2b40173..6e8624f 100644
--- a/metadata/md5-cache/sys-libs/lithium-0.0.1-r3
+++ b/metadata/md5-cache/sys-libs/lithium-0.0.1-r3
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=71ef491deae7a8296145e16929f587eb
diff --git a/metadata/md5-cache/sys-libs/lithium-9999 b/metadata/md5-cache/sys-libs/lithium-9999
index 305ee8f..c2e828d 100644
--- a/metadata/md5-cache/sys-libs/lithium-9999
+++ b/metadata/md5-cache/sys-libs/lithium-9999
@@ -8,5 +8,5 @@
 LICENSE=BSD-Google
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=33359022de93aabda819c52552eae6f2
diff --git a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483 b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483
deleted file mode 100644
index 2077fd5a..0000000
--- a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=!sys-libs/libunwind cros_host? ( sys-devel/llvm ) sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=C++ runtime stack unwinder from LLVM
-EAPI=6
-HOMEPAGE=https://github.com/llvm-mirror/libunwind
-IUSE=cros_host debug llvm-next llvm-tot +static-libs +shared-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=!sys-libs/libunwind
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=24f2b3e53f6756ca778ce9fc89eb906a
diff --git a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483-r1 b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483-r1
deleted file mode 100644
index 2077fd5a..0000000
--- a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre394483-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare setup test unpack
-DEPEND=!sys-libs/libunwind cros_host? ( sys-devel/llvm ) sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=C++ runtime stack unwinder from LLVM
-EAPI=6
-HOMEPAGE=https://github.com/llvm-mirror/libunwind
-IUSE=cros_host debug llvm-next llvm-tot +static-libs +shared-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=|| ( UoI-NCSA MIT )
-PROPERTIES=live
-RDEPEND=!sys-libs/libunwind
-SLOT=0
-_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=24f2b3e53f6756ca778ce9fc89eb906a
diff --git a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094 b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094
new file mode 100644
index 0000000..3fdbba9
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=!sys-libs/libunwind cros_host? ( sys-devel/llvm ) sys-devel/make >=dev-util/cmake-3.9.6
+DESCRIPTION=C++ runtime stack unwinder from LLVM
+EAPI=6
+HOMEPAGE=https://github.com/llvm-mirror/libunwind
+IUSE=cros_host debug llvm-next llvm-tot +static-libs +shared-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=!sys-libs/libunwind
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=01df892c9b1ccd6d7b447f2eb956bafb
diff --git a/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094-r1 b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094-r1
new file mode 100644
index 0000000..3fdbba9
--- /dev/null
+++ b/metadata/md5-cache/sys-libs/llvm-libunwind-11.0_pre399094-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare setup test unpack
+DEPEND=!sys-libs/libunwind cros_host? ( sys-devel/llvm ) sys-devel/make >=dev-util/cmake-3.9.6
+DESCRIPTION=C++ runtime stack unwinder from LLVM
+EAPI=6
+HOMEPAGE=https://github.com/llvm-mirror/libunwind
+IUSE=cros_host debug llvm-next llvm-tot +static-libs +shared-libs abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=|| ( UoI-NCSA MIT )
+PROPERTIES=live
+RDEPEND=!sys-libs/libunwind
+SLOT=0
+_eclasses_=cmake-multilib	b396704c8c04bb210b7b45dff5c67fea	cmake-utils	91d6ef31dc426240577497cacbf2508c	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-llvm	bb582d113e05e1d252d1c86ac2983b68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=01df892c9b1ccd6d7b447f2eb956bafb
diff --git a/metadata/md5-cache/sys-power/dptf-8.7.10102-r1 b/metadata/md5-cache/sys-power/dptf-8.7.10102-r1
deleted file mode 100644
index 40bc976..0000000
--- a/metadata/md5-cache/sys-power/dptf-8.7.10102-r1
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools sys-apps/dbus sys-libs/ncurses sys-libs/readline sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel(R) Dynamic Platform & Thermal Framework
-EAPI=6
-HOMEPAGE=https://01.org/dptf/
-IUSE=debug generated_cros_config unibuild
-KEYWORDS=-* amd64 x86
-LICENSE=Apache-2.0 GPL-2 BSD
-RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools sys-apps/dbus sys-libs/ncurses sys-libs/readline
-SLOT=0
-SRC_URI=https://github.com/intel/dptf/archive/8.7.10102.tar.gz -> dptf-8.7.10102.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=abc16729e0e26653dff250f4f757eb64
diff --git a/metadata/md5-cache/sys-power/dptf-8.7.10500-r1 b/metadata/md5-cache/sys-power/dptf-8.7.10500-r1
new file mode 100644
index 0000000..21772fd
--- /dev/null
+++ b/metadata/md5-cache/sys-power/dptf-8.7.10500-r1
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools sys-apps/dbus sys-libs/ncurses sys-libs/readline sys-devel/make >=dev-util/cmake-3.9.6
+DESCRIPTION=Intel(R) Dynamic Platform & Thermal Framework
+EAPI=6
+HOMEPAGE=https://01.org/dptf/
+IUSE=debug generated_cros_config unibuild
+KEYWORDS=-* amd64 x86
+LICENSE=Apache-2.0 GPL-2 BSD
+RDEPEND=unibuild? ( !generated_cros_config? ( chromeos-base/chromeos-config ) generated_cros_config? ( chromeos-base/chromeos-config-bsp:= ) ) chromeos-base/chromeos-config-tools sys-apps/dbus sys-libs/ncurses sys-libs/readline
+SLOT=0
+SRC_URI=https://github.com/intel/dptf/archive/8.7.10500.tar.gz -> dptf-8.7.10500.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=abc16729e0e26653dff250f4f757eb64
diff --git a/metadata/md5-cache/sys-process/audit-2.8.4 b/metadata/md5-cache/sys-process/audit-2.8.4
index 0123659..7ee5260 100644
--- a/metadata/md5-cache/sys-process/audit-2.8.4
+++ b/metadata/md5-cache/sys-process/audit-2.8.4
@@ -11,5 +11,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=https://people.redhat.com/sgrubb/audit/audit-2.8.4.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	preserve-libs	ef207dc62baddfddfd39a164d9797648	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	preserve-libs	ef207dc62baddfddfd39a164d9797648	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b7cf372fa936e8bf3df8cd218cc25210
diff --git a/metadata/md5-cache/sys-process/audit-2.8.4-r3 b/metadata/md5-cache/sys-process/audit-2.8.4-r3
index 0123659..7ee5260 100644
--- a/metadata/md5-cache/sys-process/audit-2.8.4-r3
+++ b/metadata/md5-cache/sys-process/audit-2.8.4-r3
@@ -11,5 +11,5 @@
 RESTRICT=test
 SLOT=0
 SRC_URI=https://people.redhat.com/sgrubb/audit/audit-2.8.4.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	preserve-libs	ef207dc62baddfddfd39a164d9797648	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	preserve-libs	ef207dc62baddfddfd39a164d9797648	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	systemd	71fd8d2065d102753fb9e4d20eaf3e9f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b7cf372fa936e8bf3df8cd218cc25210
diff --git a/metadata/md5-cache/sys-process/criu-3.7 b/metadata/md5-cache/sys-process/criu-3.7
index d6daede..96b7e7b 100644
--- a/metadata/md5-cache/sys-process/criu-3.7
+++ b/metadata/md5-cache/sys-process/criu-3.7
@@ -10,5 +10,5 @@
 REQUIRED_USE=python? ( || ( python_targets_python2_7 ) )
 SLOT=0
 SRC_URI=http://download.openvz.org/criu/criu-3.7.tar.bz2
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bbbfec0ebb1022ff24dbc32e2f8ae76c
diff --git a/metadata/md5-cache/sys-process/criu-3.7-r2 b/metadata/md5-cache/sys-process/criu-3.7-r2
index d6daede..96b7e7b 100644
--- a/metadata/md5-cache/sys-process/criu-3.7-r2
+++ b/metadata/md5-cache/sys-process/criu-3.7-r2
@@ -10,5 +10,5 @@
 REQUIRED_USE=python? ( || ( python_targets_python2_7 ) )
 SLOT=0
 SRC_URI=http://download.openvz.org/criu/criu-3.7.tar.bz2
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=bbbfec0ebb1022ff24dbc32e2f8ae76c
diff --git a/metadata/md5-cache/virtual/chromeos-config-bsp-1 b/metadata/md5-cache/virtual/chromeos-config-bsp-1
index 2f1d2a5..383a78e 100644
--- a/metadata/md5-cache/virtual/chromeos-config-bsp-1
+++ b/metadata/md5-cache/virtual/chromeos-config-bsp-1
@@ -5,5 +5,6 @@
 HOMEPAGE=http://src.chromium.org
 KEYWORDS=*
 LICENSE=BSD
+RDEPEND=chromeos-base/chromeos-config-bsp
 SLOT=0
-_md5_=5d0f513a0b0036e416ce8e590e3ae790
+_md5_=cdd0a4f8c7981b4429b583aff8245ee2
diff --git a/metadata/md5-cache/virtual/chromeos-config-bsp-1-r1 b/metadata/md5-cache/virtual/chromeos-config-bsp-1-r1
deleted file mode 100644
index 2f1d2a5..0000000
--- a/metadata/md5-cache/virtual/chromeos-config-bsp-1-r1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=chromeos-base/chromeos-config-bsp
-DESCRIPTION=Chrome OS BSP config virtual package
-EAPI=5
-HOMEPAGE=http://src.chromium.org
-KEYWORDS=*
-LICENSE=BSD
-SLOT=0
-_md5_=5d0f513a0b0036e416ce8e590e3ae790
diff --git a/metadata/md5-cache/virtual/chromeos-config-bsp-1-r2 b/metadata/md5-cache/virtual/chromeos-config-bsp-1-r2
new file mode 100644
index 0000000..383a78e
--- /dev/null
+++ b/metadata/md5-cache/virtual/chromeos-config-bsp-1-r2
@@ -0,0 +1,10 @@
+DEFINED_PHASES=-
+DEPEND=chromeos-base/chromeos-config-bsp
+DESCRIPTION=Chrome OS BSP config virtual package
+EAPI=5
+HOMEPAGE=http://src.chromium.org
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=chromeos-base/chromeos-config-bsp
+SLOT=0
+_md5_=cdd0a4f8c7981b4429b583aff8245ee2
diff --git a/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r51 b/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r51
deleted file mode 100644
index c61f2ef..0000000
--- a/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r51
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=List of packages that should be fuzzed
-EAPI=7
-HOMEPAGE=https://dev.chromium.org/
-IUSE=asan msan cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/arc-adbd[fuzzer] asan? ( chromeos-base/arc-keymaster[fuzzer] ) chromeos-base/arc-obb-mounter[fuzzer] chromeos-base/arc-setup[fuzzer] chromeos-base/authpolicy[fuzzer] chromeos-base/biod[fuzzer] chromeos-base/bluetooth[fuzzer] chromeos-base/chaps[fuzzer] chromeos-base/chromeos-ec[fuzzer] chromeos-base/chromeos-login[fuzzer] chromeos-base/crash-reporter[fuzzer] chromeos-base/cros-disks[fuzzer] chromeos-base/crosdns[fuzzer] chromeos-base/cryptohome[fuzzer] chromeos-base/cups-fuzz[fuzzer] chromeos-base/diagnostics[fuzzer] chromeos-base/dlcservice[fuzzer] chromeos-base/ghostscript-fuzz[fuzzer] chromeos-base/hammerd[fuzzer] chromeos-base/imageloader[fuzzer] chromeos-base/ippusb_manager[fuzzer] chromeos-base/kerberos[fuzzer] chromeos-base/libbrillo[fuzzer] chromeos-base/libipp[fuzzer] asan? ( chromeos-base/libvda[fuzzer] ) chromeos-base/metrics[fuzzer] chromeos-base/ml[fuzzer] chromeos-base/modemfwd[fuzzer] chromeos-base/p2p[fuzzer] chromeos-base/patchpanel[fuzzer] chromeos-base/permission_broker[fuzzer] chromeos-base/power_manager[fuzzer] chromeos-base/runtime_probe[fuzzer] chromeos-base/shill[fuzzer] chromeos-base/smbprovider[fuzzer] chromeos-base/system-proxy[fuzzer] chromeos-base/trunks[fuzzer] chromeos-base/u2fd[fuzzer] chromeos-base/update_engine[fuzzer] chromeos-base/usb_bouncer[fuzzer] chromeos-base/vboot_reference[fuzzer] chromeos-base/vm_guest_tools[fuzzer] chromeos-base/vpn-manager[fuzzer] asan? ( chromeos-base/vm_host_tools[fuzzer] ) dev-libs/modp_b64[fuzzer] asan? ( dev-rust/p9[fuzzer] ) dev-util/bsdiff[fuzzer] dev-util/puffin[fuzzer] media-libs/virglrenderer[fuzzer] media-sound/adhd[fuzzer] net-dns/avahi[fuzzer]
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=164733c2fafa42a669ed7dcb14886871
diff --git a/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r55 b/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r55
new file mode 100644
index 0000000..82eec11
--- /dev/null
+++ b/metadata/md5-cache/virtual/chromium-os-fuzzers-1-r55
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=List of packages that should be fuzzed
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=asan msan cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/arc-adbd[fuzzer] asan? ( chromeos-base/arc-keymaster[fuzzer] ) chromeos-base/arc-obb-mounter[fuzzer] chromeos-base/arc-setup[fuzzer] chromeos-base/authpolicy[fuzzer] chromeos-base/biod[fuzzer] chromeos-base/bluetooth[fuzzer] chromeos-base/chaps[fuzzer] chromeos-base/chromeos-ec[fuzzer] chromeos-base/chromeos-login[fuzzer] chromeos-base/crash-reporter[fuzzer] chromeos-base/cros-disks[fuzzer] chromeos-base/crosdns[fuzzer] chromeos-base/cryptohome[fuzzer] chromeos-base/cups-fuzz[fuzzer] chromeos-base/diagnostics[fuzzer] chromeos-base/dlcservice[fuzzer] chromeos-base/foomatic_shell[fuzzer] chromeos-base/ghostscript-fuzz[fuzzer] chromeos-base/hammerd[fuzzer] chromeos-base/imageloader[fuzzer] chromeos-base/ippusb_manager[fuzzer] chromeos-base/kerberos[fuzzer] chromeos-base/libbrillo[fuzzer] chromeos-base/libipp[fuzzer] asan? ( chromeos-base/libvda[fuzzer] ) chromeos-base/metrics[fuzzer] chromeos-base/ml[fuzzer] chromeos-base/modemfwd[fuzzer] chromeos-base/p2p[fuzzer] chromeos-base/patchpanel[fuzzer] chromeos-base/patchpanel-client[fuzzer] chromeos-base/permission_broker[fuzzer] chromeos-base/power_manager[fuzzer] chromeos-base/runtime_probe[fuzzer] >=chromeos-base/shill-0.0.1-r2205[fuzzer] chromeos-base/smbprovider[fuzzer] chromeos-base/system-proxy[fuzzer] chromeos-base/trunks[fuzzer] chromeos-base/u2fd[fuzzer] chromeos-base/update_engine[fuzzer] chromeos-base/usb_bouncer[fuzzer] chromeos-base/vboot_reference[fuzzer] chromeos-base/vm_guest_tools[fuzzer] chromeos-base/vpn-manager[fuzzer] asan? ( chromeos-base/vm_host_tools[fuzzer] ) dev-libs/modp_b64[fuzzer] asan? ( dev-rust/p9[fuzzer] ) dev-util/bsdiff[fuzzer] dev-util/puffin[fuzzer] media-gfx/sane-airscan[fuzzer] media-libs/virglrenderer[fuzzer] media-sound/adhd[fuzzer] net-dns/avahi[fuzzer]
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=52bf576055c4113e9037b2b0e7739384
diff --git a/metadata/md5-cache/virtual/chromium-os-fuzzers-9999 b/metadata/md5-cache/virtual/chromium-os-fuzzers-9999
index 7037b63..e420437 100644
--- a/metadata/md5-cache/virtual/chromium-os-fuzzers-9999
+++ b/metadata/md5-cache/virtual/chromium-os-fuzzers-9999
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=chromeos-base/arc-adbd[fuzzer] asan? ( chromeos-base/arc-keymaster[fuzzer] ) chromeos-base/arc-obb-mounter[fuzzer] chromeos-base/arc-setup[fuzzer] chromeos-base/authpolicy[fuzzer] chromeos-base/biod[fuzzer] chromeos-base/bluetooth[fuzzer] chromeos-base/chaps[fuzzer] chromeos-base/chromeos-ec[fuzzer] chromeos-base/chromeos-login[fuzzer] chromeos-base/crash-reporter[fuzzer] chromeos-base/cros-disks[fuzzer] chromeos-base/crosdns[fuzzer] chromeos-base/cryptohome[fuzzer] chromeos-base/cups-fuzz[fuzzer] chromeos-base/diagnostics[fuzzer] chromeos-base/dlcservice[fuzzer] chromeos-base/ghostscript-fuzz[fuzzer] chromeos-base/hammerd[fuzzer] chromeos-base/imageloader[fuzzer] chromeos-base/ippusb_manager[fuzzer] chromeos-base/kerberos[fuzzer] chromeos-base/libbrillo[fuzzer] chromeos-base/libipp[fuzzer] asan? ( chromeos-base/libvda[fuzzer] ) chromeos-base/metrics[fuzzer] chromeos-base/ml[fuzzer] chromeos-base/modemfwd[fuzzer] chromeos-base/p2p[fuzzer] chromeos-base/patchpanel[fuzzer] chromeos-base/permission_broker[fuzzer] chromeos-base/power_manager[fuzzer] chromeos-base/runtime_probe[fuzzer] chromeos-base/shill[fuzzer] chromeos-base/smbprovider[fuzzer] chromeos-base/system-proxy[fuzzer] chromeos-base/trunks[fuzzer] chromeos-base/u2fd[fuzzer] chromeos-base/update_engine[fuzzer] chromeos-base/usb_bouncer[fuzzer] chromeos-base/vboot_reference[fuzzer] chromeos-base/vm_guest_tools[fuzzer] chromeos-base/vpn-manager[fuzzer] asan? ( chromeos-base/vm_host_tools[fuzzer] ) dev-libs/modp_b64[fuzzer] asan? ( dev-rust/p9[fuzzer] ) dev-util/bsdiff[fuzzer] dev-util/puffin[fuzzer] media-libs/virglrenderer[fuzzer] media-sound/adhd[fuzzer] net-dns/avahi[fuzzer]
+RDEPEND=chromeos-base/arc-adbd[fuzzer] asan? ( chromeos-base/arc-keymaster[fuzzer] ) chromeos-base/arc-obb-mounter[fuzzer] chromeos-base/arc-setup[fuzzer] chromeos-base/authpolicy[fuzzer] chromeos-base/biod[fuzzer] chromeos-base/bluetooth[fuzzer] chromeos-base/chaps[fuzzer] chromeos-base/chromeos-ec[fuzzer] chromeos-base/chromeos-login[fuzzer] chromeos-base/crash-reporter[fuzzer] chromeos-base/cros-disks[fuzzer] chromeos-base/crosdns[fuzzer] chromeos-base/cryptohome[fuzzer] chromeos-base/cups-fuzz[fuzzer] chromeos-base/diagnostics[fuzzer] chromeos-base/dlcservice[fuzzer] chromeos-base/foomatic_shell[fuzzer] chromeos-base/ghostscript-fuzz[fuzzer] chromeos-base/hammerd[fuzzer] chromeos-base/imageloader[fuzzer] chromeos-base/ippusb_manager[fuzzer] chromeos-base/kerberos[fuzzer] chromeos-base/libbrillo[fuzzer] chromeos-base/libipp[fuzzer] asan? ( chromeos-base/libvda[fuzzer] ) chromeos-base/metrics[fuzzer] chromeos-base/ml[fuzzer] chromeos-base/modemfwd[fuzzer] chromeos-base/p2p[fuzzer] chromeos-base/patchpanel[fuzzer] chromeos-base/patchpanel-client[fuzzer] chromeos-base/permission_broker[fuzzer] chromeos-base/power_manager[fuzzer] chromeos-base/runtime_probe[fuzzer] >=chromeos-base/shill-0.0.1-r2205[fuzzer] chromeos-base/smbprovider[fuzzer] chromeos-base/system-proxy[fuzzer] chromeos-base/trunks[fuzzer] chromeos-base/u2fd[fuzzer] chromeos-base/update_engine[fuzzer] chromeos-base/usb_bouncer[fuzzer] chromeos-base/vboot_reference[fuzzer] chromeos-base/vm_guest_tools[fuzzer] chromeos-base/vpn-manager[fuzzer] asan? ( chromeos-base/vm_host_tools[fuzzer] ) dev-libs/modp_b64[fuzzer] asan? ( dev-rust/p9[fuzzer] ) dev-util/bsdiff[fuzzer] dev-util/puffin[fuzzer] media-gfx/sane-airscan[fuzzer] media-libs/virglrenderer[fuzzer] media-sound/adhd[fuzzer] net-dns/avahi[fuzzer]
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=58372f621fe9d9467644797704ae5b27
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=cb64bb2bf3978e81d0e41c378a561fba
diff --git a/metadata/md5-cache/virtual/chromium-os-printing-1 b/metadata/md5-cache/virtual/chromium-os-printing-1
index f1761f1..361773e 100644
--- a/metadata/md5-cache/virtual/chromium-os-printing-1
+++ b/metadata/md5-cache/virtual/chromium-os-printing-1
@@ -5,6 +5,6 @@
 IUSE=internal postscript
 KEYWORDS=*
 LICENSE=BSD-Google
-RDEPEND=chromeos-base/ippusb_manager net-print/cups net-print/cups-filters net-print/dymo-cups-drivers net-print/epson-inkjet-printer-escpr net-print/starcupsdrv internal? ( net-print/konica-minolta-printing-license ) internal? ( net-print/xerox-printing-license ) postscript? ( net-print/hplip )
+RDEPEND=chromeos-base/ippusb_manager chromeos-base/lexmark-fax-pnh net-print/cups net-print/cups-filters net-print/dymo-cups-drivers net-print/epson-inkjet-printer-escpr net-print/starcupsdrv internal? ( net-print/konica-minolta-printing-license ) internal? ( net-print/xerox-printing-license ) internal? ( net-print/fuji-xerox-printing-license ) postscript? ( net-print/hplip )
 SLOT=0
-_md5_=0d57bc4f87df65738e2ebf65b5dc0d08
+_md5_=6e5fd208f075de0b1142341063b7d82b
diff --git a/metadata/md5-cache/virtual/chromium-os-printing-1-r10 b/metadata/md5-cache/virtual/chromium-os-printing-1-r10
new file mode 100644
index 0000000..361773e
--- /dev/null
+++ b/metadata/md5-cache/virtual/chromium-os-printing-1-r10
@@ -0,0 +1,10 @@
+DEFINED_PHASES=-
+DESCRIPTION=List of packages required for the Chromium OS Printing subsystem
+EAPI=5
+HOMEPAGE=http://dev.chromium.org/
+IUSE=internal postscript
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=chromeos-base/ippusb_manager chromeos-base/lexmark-fax-pnh net-print/cups net-print/cups-filters net-print/dymo-cups-drivers net-print/epson-inkjet-printer-escpr net-print/starcupsdrv internal? ( net-print/konica-minolta-printing-license ) internal? ( net-print/xerox-printing-license ) internal? ( net-print/fuji-xerox-printing-license ) postscript? ( net-print/hplip )
+SLOT=0
+_md5_=6e5fd208f075de0b1142341063b7d82b
diff --git a/metadata/md5-cache/virtual/chromium-os-printing-1-r8 b/metadata/md5-cache/virtual/chromium-os-printing-1-r8
deleted file mode 100644
index f1761f1..0000000
--- a/metadata/md5-cache/virtual/chromium-os-printing-1-r8
+++ /dev/null
@@ -1,10 +0,0 @@
-DEFINED_PHASES=-
-DESCRIPTION=List of packages required for the Chromium OS Printing subsystem
-EAPI=5
-HOMEPAGE=http://dev.chromium.org/
-IUSE=internal postscript
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=chromeos-base/ippusb_manager net-print/cups net-print/cups-filters net-print/dymo-cups-drivers net-print/epson-inkjet-printer-escpr net-print/starcupsdrv internal? ( net-print/konica-minolta-printing-license ) internal? ( net-print/xerox-printing-license ) postscript? ( net-print/hplip )
-SLOT=0
-_md5_=0d57bc4f87df65738e2ebf65b5dc0d08
diff --git a/metadata/md5-cache/virtual/cros-camera-effects-1 b/metadata/md5-cache/virtual/cros-camera-effects-1
deleted file mode 100644
index 1a66d22..0000000
--- a/metadata/md5-cache/virtual/cros-camera-effects-1
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=-
-DESCRIPTION=Chrome OS camera effects
-EAPI=5
-HOMEPAGE=http://src.chromium.org
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-_md5_=888bfbace7d5d03a03994d15565d0a59
diff --git a/metadata/md5-cache/virtual/rust-1.43.0 b/metadata/md5-cache/virtual/rust-1.43.0
deleted file mode 100644
index 23a5903..0000000
--- a/metadata/md5-cache/virtual/rust-1.43.0
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=~dev-lang/rust-1.43.0:=
-DESCRIPTION=Virtual for the Rust language compiler
-EAPI=6
-KEYWORDS=*
-SLOT=0/1.43
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=681a5e908f98728926070dab395f2622
diff --git a/metadata/md5-cache/virtual/rust-1.44.0 b/metadata/md5-cache/virtual/rust-1.44.0
deleted file mode 100644
index 8c0f911..0000000
--- a/metadata/md5-cache/virtual/rust-1.44.0
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=~dev-lang/rust-1.44.0:=
-DESCRIPTION=Virtual for the Rust language compiler
-EAPI=6
-KEYWORDS=*
-SLOT=0/1.44
-_eclasses_=estack	43ddf5aaffa7a8d0482df54d25a66a1f	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
-_md5_=681a5e908f98728926070dab395f2622
diff --git a/metadata/md5-cache/virtual/rust-1.45.2 b/metadata/md5-cache/virtual/rust-1.45.2
new file mode 100644
index 0000000..067bf7a
--- /dev/null
+++ b/metadata/md5-cache/virtual/rust-1.45.2
@@ -0,0 +1,7 @@
+DEFINED_PHASES=-
+DEPEND=~dev-lang/rust-1.45.2:=
+DESCRIPTION=Virtual for the Rust language compiler
+EAPI=6
+KEYWORDS=*
+SLOT=0/1.45.2
+_md5_=164fc08ee3fe56e28c586365c467101b
diff --git a/metadata/md5-cache/virtual/rust-1.46.0 b/metadata/md5-cache/virtual/rust-1.46.0
new file mode 100644
index 0000000..a62c390
--- /dev/null
+++ b/metadata/md5-cache/virtual/rust-1.46.0
@@ -0,0 +1,7 @@
+DEFINED_PHASES=-
+DEPEND=~dev-lang/rust-1.46.0:=
+DESCRIPTION=Virtual for the Rust language compiler
+EAPI=6
+KEYWORDS=*
+SLOT=0/1.46.0
+_md5_=164fc08ee3fe56e28c586365c467101b
diff --git a/metadata/md5-cache/virtual/servo-config-dut-usb3-1-r1 b/metadata/md5-cache/virtual/servo-config-dut-usb3-1-r1
new file mode 100644
index 0000000..7b7dd21
--- /dev/null
+++ b/metadata/md5-cache/virtual/servo-config-dut-usb3-1-r1
@@ -0,0 +1,9 @@
+DEFINED_PHASES=-
+DESCRIPTION=List DUT USB 3 capability of Servo devices (virtual).
+EAPI=7
+IUSE=internal
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=dev-util/servo-config-dut-usb3-public:= internal? ( dev-util/servo-config-dut-usb3-private:= )
+SLOT=0/1-r1
+_md5_=a28b589ad50512d0b8e06144fa5b780b
diff --git a/metadata/md5-cache/virtual/target-chromium-os-1-r140 b/metadata/md5-cache/virtual/target-chromium-os-1-r140
deleted file mode 100644
index 3d133cb..0000000
--- a/metadata/md5-cache/virtual/target-chromium-os-1-r140
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=List of packages that are needed inside the Chromium OS base (release)
-EAPI=7
-HOMEPAGE=https://dev.chromium.org/
-IUSE=arc-camera1 arc-camera3 biod bluetooth bootchart buffet cellular compupdates containers cr50_onboard +cras +crash_reporting +cros_disks cros_embedded cups +debugd diagnostics dlc dlc_test dptf eclog +fonts fuzzer fwupd hammerd ime input_devices_evdev intel_lpe iwlwifi_rescan kerberos_daemon kernel-3_8 kvm_host media_perception memd mist modemfwd ml_service mtd +network_time nfc pam postscript +power_management +profile +readahead scanner selinux +shill smbprovider +syslog +system_locales system_proxy systemd touchview +tpm -tpm2 +trim_supported usb_bouncer usbguard +vpn watchdog cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=input_devices_evdev? ( app-misc/evtest ) syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald ) biod? ( chromeos-base/biod ) compupdates? ( chromeos-base/imageloader ) dlc? ( chromeos-base/dlcservice ) dlc_test? ( chromeos-base/dummy-dlc chromeos-base/test-dlc ) bluetooth? ( chromeos-base/bluetooth ) bootchart? ( app-benchmarks/bootchart ) tpm? ( !tpm2? ( app-crypt/trousers ) chromeos-base/chaps ) tpm2? ( chromeos-base/trunks ) pam? ( virtual/chromeos-auth-config ) fonts? ( chromeos-base/chromeos-fonts ) chromeos-base/chromeos-installer chromeos-base/dev-install crash_reporting? ( chromeos-base/crash-reporter ) mist? ( chromeos-base/mist ) modemfwd? ( chromeos-base/modemfwd ) buffet? ( chromeos-base/buffet ) containers? ( chromeos-base/run_oci ) cros_disks? ( chromeos-base/cros-disks ) debugd? ( chromeos-base/debugd ) diagnostics? ( chromeos-base/diagnostics ) kerberos_daemon? ( chromeos-base/kerberos ) scanner? ( chromeos-base/lorgnette ) ml_service? ( chromeos-base/ml ) hammerd? ( chromeos-base/hammerd ) media_perception? ( chromeos-base/mri_package ) memd? ( chromeos-base/memd ) power_management? ( chromeos-base/power_manager ) !chromeos-base/platform2 profile? ( chromeos-base/quipper ) selinux? ( chromeos-base/selinux-policy ) shill? ( chromeos-base/shill ) usb_bouncer? ( chromeos-base/usb_bouncer ) chromeos-base/update_engine vpn? ( chromeos-base/vpn-manager ) cras? ( media-sound/adhd media-sound/cras_tests ) trim_supported? ( chromeos-base/chromeos-trim ) network_time? ( net-misc/tlsdate ) iwlwifi_rescan? ( net-wireless/iwlwifi_rescan ) nfc? ( net-wireless/neard chromeos-base/neard-configs ) readahead? ( sys-apps/ureadahead ) pam? ( sys-auth/pam_pwdfile ) watchdog? ( sys-apps/daisydog ) mtd? ( sys-fs/mtd-utils ) cups? ( virtual/chromium-os-printing ) touchview? ( chromeos-base/chromeos-accelerometer-init ) system_locales? ( chromeos-base/system-locales ) system_proxy? ( chromeos-base/system-proxy ) eclog? ( chromeos-base/timberslide ) chromeos-base/chromeos-machine-id-regen systemd? ( sys-apps/systemd ) usbguard? ( sys-apps/usbguard ) kvm_host? ( chromeos-base/crosdns chromeos-base/crostini_client chromeos-base/vm_host_tools ) sys-kernel/linux-firmware virtual/chromeos-bsp virtual/chromeos-firewall virtual/chromeos-firmware virtual/chromeos-interface virtual/chromeos-regions virtual/implicit-system virtual/linux-sources virtual/modutils virtual/service-manager cr50_onboard? ( chromeos-base/chromeos-cr50 chromeos-base/u2fd ) ime? ( app-i18n/chinese-input app-i18n/keyboard-input app-i18n/japanese-input app-i18n/hangul-input ) fuzzer? ( virtual/target-fuzzers ) !dev-python/socksipy arc-camera1? ( chromeos-base/cros-camera ) arc-camera3? ( chromeos-base/cros-camera ) fwupd? ( sys-apps/fwupd ) smbprovider? ( chromeos-base/smbfs chromeos-base/smbprovider ) !cros_embedded? ( x86? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) amd64? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) app-arch/tar app-editors/vim app-shells/bash chromeos-base/common-assets chromeos-base/chromeos-imageburner chromeos-base/crosh chromeos-base/crosh-extension chromeos-base/inputcontrol chromeos-base/mtpd chromeos-base/permission_broker chromeos-base/userfeedback chromeos-base/vboot_reference chromeos-base/vpd bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) ) net-wireless/crda sys-apps/dbus sys-apps/flashrom sys-apps/iproute2 sys-apps/pv sys-apps/rootdev !systemd? ( sys-apps/upstart ) sys-fs/e2fsprogs virtual/assets virtual/cheets virtual/udev )
-REQUIRED_USE=cellular? ( shill ) modemfwd? ( cellular )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=6bf0d84e49282f44ce71347576c62e98
diff --git a/metadata/md5-cache/virtual/target-chromium-os-1-r147 b/metadata/md5-cache/virtual/target-chromium-os-1-r147
new file mode 100644
index 0000000..073b812
--- /dev/null
+++ b/metadata/md5-cache/virtual/target-chromium-os-1-r147
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=List of packages that are needed inside the Chromium OS base (release)
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=arc-camera1 arc-camera3 biod bluetooth bootchart buffet cellular compupdates containers cr50_onboard +cras +crash_reporting +cros_disks cros_embedded cups +debugd diagnostics dlc dlc_test dptf eclog +fonts fuzzer fwupd hammerd iioservice ime input_devices_evdev intel_lpe iwlwifi_rescan kerberos_daemon kernel-3_8 kvm_host manatee media_perception memd mist modemfwd ml_service mtd +network_time nfc pam perfetto postscript +power_management +profile racc +readahead scanner selinux +shill smbprovider +syslog +system_locales system_proxy systemd touchview +tpm -tpm2 +trim_supported typecd usb_bouncer usbguard +vpn watchdog cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=input_devices_evdev? ( app-misc/evtest ) syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald ) biod? ( chromeos-base/biod ) compupdates? ( chromeos-base/imageloader ) dlc? ( chromeos-base/dlcservice ) dlc_test? ( chromeos-base/dummy-dlc chromeos-base/test-dlc ) bluetooth? ( chromeos-base/bluetooth ) bootchart? ( app-benchmarks/bootchart ) tpm? ( !tpm2? ( app-crypt/trousers ) chromeos-base/chaps ) tpm2? ( chromeos-base/trunks ) pam? ( virtual/chromeos-auth-config ) fonts? ( chromeos-base/chromeos-fonts ) chromeos-base/chromeos-installer chromeos-base/dev-install perfetto? ( chromeos-base/perfetto ) crash_reporting? ( chromeos-base/crash-reporter ) mist? ( chromeos-base/mist ) modemfwd? ( chromeos-base/modemfwd ) buffet? ( chromeos-base/buffet ) containers? ( chromeos-base/run_oci ) cros_disks? ( chromeos-base/cros-disks ) debugd? ( chromeos-base/debugd ) diagnostics? ( chromeos-base/diagnostics ) kerberos_daemon? ( chromeos-base/kerberos ) scanner? ( chromeos-base/lorgnette ) ml_service? ( chromeos-base/ml ) hammerd? ( chromeos-base/hammerd ) racc? ( chromeos-base/hardware_verifier chromeos-base/runtime_probe ) iioservice? ( chromeos-base/iioservice ) media_perception? ( chromeos-base/mri_package ) memd? ( chromeos-base/memd ) power_management? ( chromeos-base/power_manager ) !chromeos-base/platform2 profile? ( chromeos-base/quipper ) selinux? ( chromeos-base/selinux-policy ) shill? ( >=chromeos-base/shill-0.0.1-r2205 ) manatee? ( chromeos-base/sirenia ) usb_bouncer? ( chromeos-base/usb_bouncer ) chromeos-base/update_engine vpn? ( chromeos-base/vpn-manager ) cras? ( media-sound/adhd media-sound/cras_tests ) trim_supported? ( chromeos-base/chromeos-trim ) network_time? ( net-misc/tlsdate ) iwlwifi_rescan? ( net-wireless/iwlwifi_rescan ) nfc? ( net-wireless/neard chromeos-base/neard-configs ) readahead? ( sys-apps/ureadahead ) pam? ( sys-auth/pam_pwdfile ) watchdog? ( sys-apps/daisydog ) mtd? ( sys-fs/mtd-utils ) cups? ( virtual/chromium-os-printing ) touchview? ( chromeos-base/chromeos-accelerometer-init ) system_locales? ( chromeos-base/system-locales ) system_proxy? ( chromeos-base/system-proxy ) eclog? ( chromeos-base/timberslide ) chromeos-base/chromeos-machine-id-regen systemd? ( sys-apps/systemd ) usbguard? ( sys-apps/usbguard ) kvm_host? ( chromeos-base/crosdns chromeos-base/crostini_client chromeos-base/vm_host_tools dlc? ( chromeos-base/termina-dlc ) ) sys-kernel/linux-firmware virtual/chromeos-bsp virtual/chromeos-firewall virtual/chromeos-firmware virtual/chromeos-interface virtual/chromeos-regions virtual/implicit-system virtual/linux-sources virtual/modutils virtual/service-manager cr50_onboard? ( chromeos-base/chromeos-cr50 chromeos-base/u2fd ) ime? ( app-i18n/chinese-input app-i18n/keyboard-input app-i18n/japanese-input app-i18n/hangul-input ) fuzzer? ( virtual/target-fuzzers ) !dev-python/socksipy arc-camera1? ( chromeos-base/cros-camera ) arc-camera3? ( chromeos-base/cros-camera ) fwupd? ( sys-apps/fwupd ) smbprovider? ( chromeos-base/smbfs chromeos-base/smbprovider ) typecd? ( chromeos-base/typecd ) !cros_embedded? ( x86? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) amd64? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) app-arch/tar app-editors/vim app-shells/bash chromeos-base/common-assets chromeos-base/chromeos-imageburner chromeos-base/crosh chromeos-base/crosh-extension chromeos-base/inputcontrol chromeos-base/mtpd chromeos-base/permission_broker chromeos-base/userfeedback chromeos-base/vboot_reference chromeos-base/vpd bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) ) net-wireless/crda sys-apps/dbus sys-apps/flashrom sys-apps/iproute2 sys-apps/pv sys-apps/rootdev !systemd? ( sys-apps/upstart ) sys-fs/e2fsprogs virtual/assets virtual/cheets virtual/udev )
+REQUIRED_USE=cellular? ( shill ) modemfwd? ( cellular )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=aef7f22343b4ddb0ffb2f26d020c41f7
diff --git a/metadata/md5-cache/virtual/target-chromium-os-9999 b/metadata/md5-cache/virtual/target-chromium-os-9999
index 60b6609..9601ff4 100644
--- a/metadata/md5-cache/virtual/target-chromium-os-9999
+++ b/metadata/md5-cache/virtual/target-chromium-os-9999
@@ -3,12 +3,12 @@
 DESCRIPTION=List of packages that are needed inside the Chromium OS base (release)
 EAPI=7
 HOMEPAGE=https://dev.chromium.org/
-IUSE=arc-camera1 arc-camera3 biod bluetooth bootchart buffet cellular compupdates containers cr50_onboard +cras +crash_reporting +cros_disks cros_embedded cups +debugd diagnostics dlc dlc_test dptf eclog +fonts fuzzer fwupd hammerd ime input_devices_evdev intel_lpe iwlwifi_rescan kerberos_daemon kernel-3_8 kvm_host media_perception memd mist modemfwd ml_service mtd +network_time nfc pam postscript +power_management +profile +readahead scanner selinux +shill smbprovider +syslog +system_locales system_proxy systemd touchview +tpm -tpm2 +trim_supported usb_bouncer usbguard +vpn watchdog cros_host cros_workon_tree_
+IUSE=arc-camera1 arc-camera3 biod bluetooth bootchart buffet cellular compupdates containers cr50_onboard +cras +crash_reporting +cros_disks cros_embedded cups +debugd diagnostics dlc dlc_test dptf eclog +fonts fuzzer fwupd hammerd iioservice ime input_devices_evdev intel_lpe iwlwifi_rescan kerberos_daemon kernel-3_8 kvm_host manatee media_perception memd mist modemfwd ml_service mtd +network_time nfc pam perfetto postscript +power_management +profile racc +readahead scanner selinux +shill smbprovider +syslog +system_locales system_proxy systemd touchview +tpm -tpm2 +trim_supported typecd usb_bouncer usbguard +vpn watchdog cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=input_devices_evdev? ( app-misc/evtest ) syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald ) biod? ( chromeos-base/biod ) compupdates? ( chromeos-base/imageloader ) dlc? ( chromeos-base/dlcservice ) dlc_test? ( chromeos-base/dummy-dlc chromeos-base/test-dlc ) bluetooth? ( chromeos-base/bluetooth ) bootchart? ( app-benchmarks/bootchart ) tpm? ( !tpm2? ( app-crypt/trousers ) chromeos-base/chaps ) tpm2? ( chromeos-base/trunks ) pam? ( virtual/chromeos-auth-config ) fonts? ( chromeos-base/chromeos-fonts ) chromeos-base/chromeos-installer chromeos-base/dev-install crash_reporting? ( chromeos-base/crash-reporter ) mist? ( chromeos-base/mist ) modemfwd? ( chromeos-base/modemfwd ) buffet? ( chromeos-base/buffet ) containers? ( chromeos-base/run_oci ) cros_disks? ( chromeos-base/cros-disks ) debugd? ( chromeos-base/debugd ) diagnostics? ( chromeos-base/diagnostics ) kerberos_daemon? ( chromeos-base/kerberos ) scanner? ( chromeos-base/lorgnette ) ml_service? ( chromeos-base/ml ) hammerd? ( chromeos-base/hammerd ) media_perception? ( chromeos-base/mri_package ) memd? ( chromeos-base/memd ) power_management? ( chromeos-base/power_manager ) !chromeos-base/platform2 profile? ( chromeos-base/quipper ) selinux? ( chromeos-base/selinux-policy ) shill? ( chromeos-base/shill ) usb_bouncer? ( chromeos-base/usb_bouncer ) chromeos-base/update_engine vpn? ( chromeos-base/vpn-manager ) cras? ( media-sound/adhd media-sound/cras_tests ) trim_supported? ( chromeos-base/chromeos-trim ) network_time? ( net-misc/tlsdate ) iwlwifi_rescan? ( net-wireless/iwlwifi_rescan ) nfc? ( net-wireless/neard chromeos-base/neard-configs ) readahead? ( sys-apps/ureadahead ) pam? ( sys-auth/pam_pwdfile ) watchdog? ( sys-apps/daisydog ) mtd? ( sys-fs/mtd-utils ) cups? ( virtual/chromium-os-printing ) touchview? ( chromeos-base/chromeos-accelerometer-init ) system_locales? ( chromeos-base/system-locales ) system_proxy? ( chromeos-base/system-proxy ) eclog? ( chromeos-base/timberslide ) chromeos-base/chromeos-machine-id-regen systemd? ( sys-apps/systemd ) usbguard? ( sys-apps/usbguard ) kvm_host? ( chromeos-base/crosdns chromeos-base/crostini_client chromeos-base/vm_host_tools ) sys-kernel/linux-firmware virtual/chromeos-bsp virtual/chromeos-firewall virtual/chromeos-firmware virtual/chromeos-interface virtual/chromeos-regions virtual/implicit-system virtual/linux-sources virtual/modutils virtual/service-manager cr50_onboard? ( chromeos-base/chromeos-cr50 chromeos-base/u2fd ) ime? ( app-i18n/chinese-input app-i18n/keyboard-input app-i18n/japanese-input app-i18n/hangul-input ) fuzzer? ( virtual/target-fuzzers ) !dev-python/socksipy arc-camera1? ( chromeos-base/cros-camera ) arc-camera3? ( chromeos-base/cros-camera ) fwupd? ( sys-apps/fwupd ) smbprovider? ( chromeos-base/smbfs chromeos-base/smbprovider ) !cros_embedded? ( x86? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) amd64? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) app-arch/tar app-editors/vim app-shells/bash chromeos-base/common-assets chromeos-base/chromeos-imageburner chromeos-base/crosh chromeos-base/crosh-extension chromeos-base/inputcontrol chromeos-base/mtpd chromeos-base/permission_broker chromeos-base/userfeedback chromeos-base/vboot_reference chromeos-base/vpd bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) ) net-wireless/crda sys-apps/dbus sys-apps/flashrom sys-apps/iproute2 sys-apps/pv sys-apps/rootdev !systemd? ( sys-apps/upstart ) sys-fs/e2fsprogs virtual/assets virtual/cheets virtual/udev )
+RDEPEND=input_devices_evdev? ( app-misc/evtest ) syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald ) biod? ( chromeos-base/biod ) compupdates? ( chromeos-base/imageloader ) dlc? ( chromeos-base/dlcservice ) dlc_test? ( chromeos-base/dummy-dlc chromeos-base/test-dlc ) bluetooth? ( chromeos-base/bluetooth ) bootchart? ( app-benchmarks/bootchart ) tpm? ( !tpm2? ( app-crypt/trousers ) chromeos-base/chaps ) tpm2? ( chromeos-base/trunks ) pam? ( virtual/chromeos-auth-config ) fonts? ( chromeos-base/chromeos-fonts ) chromeos-base/chromeos-installer chromeos-base/dev-install perfetto? ( chromeos-base/perfetto ) crash_reporting? ( chromeos-base/crash-reporter ) mist? ( chromeos-base/mist ) modemfwd? ( chromeos-base/modemfwd ) buffet? ( chromeos-base/buffet ) containers? ( chromeos-base/run_oci ) cros_disks? ( chromeos-base/cros-disks ) debugd? ( chromeos-base/debugd ) diagnostics? ( chromeos-base/diagnostics ) kerberos_daemon? ( chromeos-base/kerberos ) scanner? ( chromeos-base/lorgnette ) ml_service? ( chromeos-base/ml ) hammerd? ( chromeos-base/hammerd ) racc? ( chromeos-base/hardware_verifier chromeos-base/runtime_probe ) iioservice? ( chromeos-base/iioservice ) media_perception? ( chromeos-base/mri_package ) memd? ( chromeos-base/memd ) power_management? ( chromeos-base/power_manager ) !chromeos-base/platform2 profile? ( chromeos-base/quipper ) selinux? ( chromeos-base/selinux-policy ) shill? ( >=chromeos-base/shill-0.0.1-r2205 ) manatee? ( chromeos-base/sirenia ) usb_bouncer? ( chromeos-base/usb_bouncer ) chromeos-base/update_engine vpn? ( chromeos-base/vpn-manager ) cras? ( media-sound/adhd media-sound/cras_tests ) trim_supported? ( chromeos-base/chromeos-trim ) network_time? ( net-misc/tlsdate ) iwlwifi_rescan? ( net-wireless/iwlwifi_rescan ) nfc? ( net-wireless/neard chromeos-base/neard-configs ) readahead? ( sys-apps/ureadahead ) pam? ( sys-auth/pam_pwdfile ) watchdog? ( sys-apps/daisydog ) mtd? ( sys-fs/mtd-utils ) cups? ( virtual/chromium-os-printing ) touchview? ( chromeos-base/chromeos-accelerometer-init ) system_locales? ( chromeos-base/system-locales ) system_proxy? ( chromeos-base/system-proxy ) eclog? ( chromeos-base/timberslide ) chromeos-base/chromeos-machine-id-regen systemd? ( sys-apps/systemd ) usbguard? ( sys-apps/usbguard ) kvm_host? ( chromeos-base/crosdns chromeos-base/crostini_client chromeos-base/vm_host_tools dlc? ( chromeos-base/termina-dlc ) ) sys-kernel/linux-firmware virtual/chromeos-bsp virtual/chromeos-firewall virtual/chromeos-firmware virtual/chromeos-interface virtual/chromeos-regions virtual/implicit-system virtual/linux-sources virtual/modutils virtual/service-manager cr50_onboard? ( chromeos-base/chromeos-cr50 chromeos-base/u2fd ) ime? ( app-i18n/chinese-input app-i18n/keyboard-input app-i18n/japanese-input app-i18n/hangul-input ) fuzzer? ( virtual/target-fuzzers ) !dev-python/socksipy arc-camera1? ( chromeos-base/cros-camera ) arc-camera3? ( chromeos-base/cros-camera ) fwupd? ( sys-apps/fwupd ) smbprovider? ( chromeos-base/smbfs chromeos-base/smbprovider ) typecd? ( chromeos-base/typecd ) !cros_embedded? ( x86? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) amd64? ( dptf? ( virtual/dptf ) intel_lpe? ( virtual/lpe-support ) ) app-arch/tar app-editors/vim app-shells/bash chromeos-base/common-assets chromeos-base/chromeos-imageburner chromeos-base/crosh chromeos-base/crosh-extension chromeos-base/inputcontrol chromeos-base/mtpd chromeos-base/permission_broker chromeos-base/userfeedback chromeos-base/vboot_reference chromeos-base/vpd bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) ) net-wireless/crda sys-apps/dbus sys-apps/flashrom sys-apps/iproute2 sys-apps/pv sys-apps/rootdev !systemd? ( sys-apps/upstart ) sys-fs/e2fsprogs virtual/assets virtual/cheets virtual/udev )
 REQUIRED_USE=cellular? ( shill ) modemfwd? ( cellular )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=4224a08eb1d77e04d2cd9b6d77f5c893
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=64805b6aa8aa5b1abfec22a34ded2702
diff --git a/metadata/md5-cache/virtual/target-chromium-os-dev-1-r56 b/metadata/md5-cache/virtual/target-chromium-os-dev-1-r56
deleted file mode 100644
index 106986f..0000000
--- a/metadata/md5-cache/virtual/target-chromium-os-dev-1-r56
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=List of packages that are needed inside the Chromium OS dev image
-EAPI=7
-HOMEPAGE=https://dev.chromium.org/
-IUSE=cras nvme pam opengl +power_management +profile +shill tpm tpm2 usb vaapi video_cards_intel chromeless_tty cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=x86? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) amd64? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) pam? ( app-admin/sudo ) app-admin/sysstat app-arch/bzip2 app-arch/gzip app-arch/tar app-arch/unzip app-arch/xz-utils app-arch/zip profile? ( chromeos-base/quipper app-benchmarks/libc-bench net-analyzer/netperf dev-util/perf ) app-crypt/nss tpm? ( app-crypt/tpm-tools ) app-editors/nano app-editors/qemacs app-editors/vim app-misc/edid-decode app-misc/evtest app-misc/pax-utils app-misc/screen app-portage/portage-utils app-shells/bash app-text/tree cras? ( chromeos-base/audiotest media-sound/sox ) chromeos-base/avtest_label_detect chromeos-base/chromeos-dev-root chromeos-base/cros-config-test chromeos-base/cryptohome-dev-utils tpm2? ( chromeos-base/g2f_tools ) !chromeless_tty? ( chromeos-base/graphics-utils-go ) chromeos-base/update-utils chromeos-base/policy_utils chromeos-base/protofiles !chromeless_tty? ( chromeos-base/screenshot ) shill? ( chromeos-base/shill-test-scripts ) chromeos-base/touch_firmware_test dev-vcs/git net-analyzer/tcpdump net-analyzer/traceroute net-dialup/minicom net-dns/bind-tools net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/rsync net-wireless/iw net-wireless/wireless-tools dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/libgpiod dev-python/protobuf-python dev-python/cherrypy dev-python/dbus-python dev-util/hdctools dev-util/mem dev-util/strace media-tv/v4l-utils media-video/yavta net-dialup/lrzsz net-fs/sshfs net-misc/curl net-misc/wget sys-apps/coreboot-utils sys-apps/coreutils sys-apps/diffutils sys-apps/file sys-apps/findutils sys-apps/flashrom-tester sys-apps/gawk sys-apps/i2c-tools sys-apps/iotools sys-apps/kbd sys-apps/less sys-apps/mmc-utils nvme? ( sys-apps/nvme-cli ) sys-apps/portage sys-apps/smartmontools usb? ( sys-apps/usbutils ) sys-apps/which sys-block/fio sys-devel/gdb sys-fs/fuse sys-fs/lvm2 sys-fs/mtd-utils power_management? ( sys-power/powertop ) sys-process/procps sys-process/psmisc sys-process/time virtual/autotest-capability virtual/chromeos-bsp-dev
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=7e1e2d73ae99ff6c85fde9339495c7c6
diff --git a/metadata/md5-cache/virtual/target-chromium-os-dev-1-r60 b/metadata/md5-cache/virtual/target-chromium-os-dev-1-r60
new file mode 100644
index 0000000..5e539b8
--- /dev/null
+++ b/metadata/md5-cache/virtual/target-chromium-os-dev-1-r60
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=List of packages that are needed inside the Chromium OS dev image
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=cras nvme pam opengl +power_management +profile +shill tpm tpm2 usb vaapi video_cards_amdgpu video_cards_intel chromeless_tty cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=x86? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_amdgpu? ( x11-apps/igt-gpu-tools ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) amd64? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_amdgpu? ( x11-apps/igt-gpu-tools ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) pam? ( app-admin/sudo ) app-admin/sysstat app-arch/bzip2 app-arch/gzip app-arch/tar app-arch/unzip app-arch/xz-utils app-arch/zip profile? ( chromeos-base/quipper app-benchmarks/libc-bench net-analyzer/netperf dev-util/perf ) app-benchmarks/stress-ng app-crypt/nss tpm? ( app-crypt/tpm-tools ) app-editors/nano app-editors/qemacs app-editors/vim app-misc/edid-decode app-misc/evtest app-misc/pax-utils app-misc/screen app-portage/portage-utils app-shells/bash app-text/tree cras? ( chromeos-base/audiotest media-sound/sox ) chromeos-base/avtest_label_detect chromeos-base/chromeos-dev-root chromeos-base/cros-config-test chromeos-base/cryptohome-dev-utils tpm2? ( chromeos-base/g2f_tools ) !chromeless_tty? ( chromeos-base/graphics-utils-go ) chromeos-base/update-utils chromeos-base/policy_utils chromeos-base/protofiles !chromeless_tty? ( chromeos-base/screenshot ) shill? ( chromeos-base/shill-test-scripts ) chromeos-base/touch_firmware_test chromeos-base/usi-test dev-vcs/git net-analyzer/tcpdump net-analyzer/traceroute net-dialup/minicom net-dns/bind-tools net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/rsync net-wireless/iw net-wireless/wireless-tools dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/libgpiod dev-python/protobuf-python dev-python/cherrypy dev-python/dbus-python dev-python/hid-tools dev-util/hdctools dev-util/mem dev-util/strace media-tv/v4l-utils media-video/yavta net-dialup/lrzsz net-fs/sshfs net-misc/curl net-misc/wget sys-apps/coreboot-utils sys-apps/coreutils sys-apps/diffutils sys-apps/file sys-apps/findutils sys-apps/flashrom-tester sys-apps/gawk sys-apps/i2c-tools sys-apps/iotools sys-apps/kbd sys-apps/less sys-apps/mmc-utils nvme? ( sys-apps/nvme-cli ) sys-apps/portage sys-apps/smartmontools usb? ( sys-apps/usbutils ) sys-apps/which sys-block/fio sys-devel/gdb sys-fs/fuse sys-fs/lvm2 sys-fs/mtd-utils power_management? ( sys-power/powertop ) sys-process/procps sys-process/psmisc sys-process/time virtual/autotest-capability virtual/chromeos-bsp-dev
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=37e3e29183265e5047699181da8601a4
diff --git a/metadata/md5-cache/virtual/target-chromium-os-dev-9999 b/metadata/md5-cache/virtual/target-chromium-os-dev-9999
index c0561e6..2a0b1d5 100644
--- a/metadata/md5-cache/virtual/target-chromium-os-dev-9999
+++ b/metadata/md5-cache/virtual/target-chromium-os-dev-9999
@@ -3,11 +3,11 @@
 DESCRIPTION=List of packages that are needed inside the Chromium OS dev image
 EAPI=7
 HOMEPAGE=https://dev.chromium.org/
-IUSE=cras nvme pam opengl +power_management +profile +shill tpm tpm2 usb vaapi video_cards_intel chromeless_tty cros_host cros_workon_tree_
+IUSE=cras nvme pam opengl +power_management +profile +shill tpm tpm2 usb vaapi video_cards_amdgpu video_cards_intel chromeless_tty cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=x86? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) amd64? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) pam? ( app-admin/sudo ) app-admin/sysstat app-arch/bzip2 app-arch/gzip app-arch/tar app-arch/unzip app-arch/xz-utils app-arch/zip profile? ( chromeos-base/quipper app-benchmarks/libc-bench net-analyzer/netperf dev-util/perf ) app-crypt/nss tpm? ( app-crypt/tpm-tools ) app-editors/nano app-editors/qemacs app-editors/vim app-misc/edid-decode app-misc/evtest app-misc/pax-utils app-misc/screen app-portage/portage-utils app-shells/bash app-text/tree cras? ( chromeos-base/audiotest media-sound/sox ) chromeos-base/avtest_label_detect chromeos-base/chromeos-dev-root chromeos-base/cros-config-test chromeos-base/cryptohome-dev-utils tpm2? ( chromeos-base/g2f_tools ) !chromeless_tty? ( chromeos-base/graphics-utils-go ) chromeos-base/update-utils chromeos-base/policy_utils chromeos-base/protofiles !chromeless_tty? ( chromeos-base/screenshot ) shill? ( chromeos-base/shill-test-scripts ) chromeos-base/touch_firmware_test dev-vcs/git net-analyzer/tcpdump net-analyzer/traceroute net-dialup/minicom net-dns/bind-tools net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/rsync net-wireless/iw net-wireless/wireless-tools dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/libgpiod dev-python/protobuf-python dev-python/cherrypy dev-python/dbus-python dev-util/hdctools dev-util/mem dev-util/strace media-tv/v4l-utils media-video/yavta net-dialup/lrzsz net-fs/sshfs net-misc/curl net-misc/wget sys-apps/coreboot-utils sys-apps/coreutils sys-apps/diffutils sys-apps/file sys-apps/findutils sys-apps/flashrom-tester sys-apps/gawk sys-apps/i2c-tools sys-apps/iotools sys-apps/kbd sys-apps/less sys-apps/mmc-utils nvme? ( sys-apps/nvme-cli ) sys-apps/portage sys-apps/smartmontools usb? ( sys-apps/usbutils ) sys-apps/which sys-block/fio sys-devel/gdb sys-fs/fuse sys-fs/lvm2 sys-fs/mtd-utils power_management? ( sys-power/powertop ) sys-process/procps sys-process/psmisc sys-process/time virtual/autotest-capability virtual/chromeos-bsp-dev
+RDEPEND=x86? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_amdgpu? ( x11-apps/igt-gpu-tools ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) amd64? ( app-benchmarks/i7z power_management? ( dev-util/turbostat ) sys-apps/dmidecode sys-apps/pciutils sys-boot/syslinux vaapi? ( chromeos-base/libva-fake-driver media-gfx/vadumpcaps media-video/libva-utils ) video_cards_amdgpu? ( x11-apps/igt-gpu-tools ) video_cards_intel? ( x11-apps/igt-gpu-tools ) ) pam? ( app-admin/sudo ) app-admin/sysstat app-arch/bzip2 app-arch/gzip app-arch/tar app-arch/unzip app-arch/xz-utils app-arch/zip profile? ( chromeos-base/quipper app-benchmarks/libc-bench net-analyzer/netperf dev-util/perf ) app-benchmarks/stress-ng app-crypt/nss tpm? ( app-crypt/tpm-tools ) app-editors/nano app-editors/qemacs app-editors/vim app-misc/edid-decode app-misc/evtest app-misc/pax-utils app-misc/screen app-portage/portage-utils app-shells/bash app-text/tree cras? ( chromeos-base/audiotest media-sound/sox ) chromeos-base/avtest_label_detect chromeos-base/chromeos-dev-root chromeos-base/cros-config-test chromeos-base/cryptohome-dev-utils tpm2? ( chromeos-base/g2f_tools ) !chromeless_tty? ( chromeos-base/graphics-utils-go ) chromeos-base/update-utils chromeos-base/policy_utils chromeos-base/protofiles !chromeless_tty? ( chromeos-base/screenshot ) shill? ( chromeos-base/shill-test-scripts ) chromeos-base/touch_firmware_test chromeos-base/usi-test dev-vcs/git net-analyzer/tcpdump net-analyzer/traceroute net-dialup/minicom net-dns/bind-tools net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/rsync net-wireless/iw net-wireless/wireless-tools dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/libgpiod dev-python/protobuf-python dev-python/cherrypy dev-python/dbus-python dev-python/hid-tools dev-util/hdctools dev-util/mem dev-util/strace media-tv/v4l-utils media-video/yavta net-dialup/lrzsz net-fs/sshfs net-misc/curl net-misc/wget sys-apps/coreboot-utils sys-apps/coreutils sys-apps/diffutils sys-apps/file sys-apps/findutils sys-apps/flashrom-tester sys-apps/gawk sys-apps/i2c-tools sys-apps/iotools sys-apps/kbd sys-apps/less sys-apps/mmc-utils nvme? ( sys-apps/nvme-cli ) sys-apps/portage sys-apps/smartmontools usb? ( sys-apps/usbutils ) sys-apps/which sys-block/fio sys-devel/gdb sys-fs/fuse sys-fs/lvm2 sys-fs/mtd-utils power_management? ( sys-power/powertop ) sys-process/procps sys-process/psmisc sys-process/time virtual/autotest-capability virtual/chromeos-bsp-dev
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=8014fab8205a1b22e5c097d288a88d6f
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6c79d16bdbc1031aefe56314bc2b6160
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r176 b/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r176
deleted file mode 100644
index a5a35e9..0000000
--- a/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r176
+++ /dev/null
@@ -1,13 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DESCRIPTION=List of packages that are needed inside the Chromium OS SDK
-EAPI=7
-HOMEPAGE=https://dev.chromium.org/
-IUSE=cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=!chromeos-base/hard-host-depends !virtual/hard-host-depends-bsp app-arch/bzip2 app-arch/cpio app-arch/gzip app-arch/p7zip app-arch/tar app-shells/bash net-misc/iputils net-misc/rsync sys-apps/baselayout sys-apps/coreutils sys-apps/diffutils sys-apps/dtc sys-apps/file sys-apps/findutils sys-apps/gawk sys-apps/grep sys-apps/sed sys-apps/shadow sys-apps/texinfo sys-apps/util-linux sys-apps/which sys-devel/autoconf sys-devel/automake:1.10 sys-devel/automake:1.11 sys-devel/automake:1.15 sys-devel/binutils sys-devel/bison sys-devel/flex sys-devel/gcc sys-devel/gnuconfig sys-devel/grit-i18n sys-devel/libtool sys-devel/m4 sys-devel/make sys-devel/patch sys-fs/e2fsprogs sys-fs/f2fs-tools sys-libs/ncurses sys-libs/readline sys-libs/zlib sys-process/procps sys-process/psmisc virtual/editor virtual/libc virtual/man virtual/os-headers virtual/package-manager virtual/pager app-arch/lbzip2 app-arch/lz4 app-arch/lzop app-arch/pigz app-arch/pixz app-admin/sudo app-crypt/efitools app-crypt/sbsigntools dev-embedded/cbootimage dev-embedded/tegrarcm dev-embedded/u-boot-tools dev-util/ccache media-gfx/pngcrush >=sys-apps/dtc-1.3.0-r5 sys-boot/bootstub sys-boot/grub sys-boot/syslinux sys-devel/crossdev sys-fs/dosfstools sys-fs/squashfs-tools sys-fs/mtd-utils app-misc/jq sys-devel/aapt sys-devel/arc-cache-builder sys-devel/arc-toolchain-master sys-devel/arc-toolchain-p sys-devel/arc-toolchain-r sys-devel/dex2oatds app-crypt/gnupg app-admin/eselect-opengl app-admin/eselect-mesa app-arch/cabextract app-arch/makeself >=app-arch/pbzip2-1.1.1-r1 app-arch/rpm2targz app-arch/sharutils app-arch/unzip app-crypt/nss app-doc/xmltoman app-emulation/qemu app-emulation/qemu-binfmt-wrapper !app-emulation/qemu-kvm !app-emulation/qemu-user app-text/asciidoc app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets app-text/texi2html app-text/xmlto chromeos-base/google-breakpad chromeos-base/chromeos-base >=chromeos-base/chromeos-config-host-0.0.2-r491 chromeos-base/chromeos-installer chromeos-base/chromite-sdk chromeos-base/cros-devutils[cros_host] chromeos-base/cros-testutils chromeos-base/ec-devutils chromeos-base/minijail dev-db/m17n-contrib dev-db/m17n-db dev-go/protobuf dev-lang/closure-compiler-bin dev-lang/nasm dev-lang/python:2.7 dev-lang/python:3.6 dev-lang/swig dev-lang/tcl dev-lang/yasm dev-libs/dbus-glib dev-libs/flatbuffers >=dev-libs/glib-2.26.1 net-libs/grpc dev-libs/libgcrypt dev-libs/libxslt dev-libs/libyaml dev-libs/m17n-lib dev-libs/protobuf dev-libs/protobuf-c dev-libs/wayland dev-python/cffi dev-python/cherrypy dev-python/ctypesgen dev-python/dbus-python dev-python/dpkt dev-python/ecdsa dev-python/future dev-python/imaging dev-python/intelhex dev-python/m2crypto dev-python/mako dev-python/netifaces dev-python/pexpect dev-python/pillow dev-python/psutil dev-python/py dev-python/pycairo dev-python/pycparser dev-python/pygobject dev-python/pyopenssl dev-python/pytest dev-python/python-evdev dev-python/pyudev dev-python/pyusb dev-python/setproctitle !dev-python/socksipy dev-python/tempita dev-python/ws4py dev-util/bazel dev-util/cmake dev-util/dwarves dev-util/gob dev-util/gdbus-codegen dev-util/gperf dev-util/gtk-doc dev-util/hdctools >=dev-util/gtk-doc-am-1.13 >=dev-util/intltool-0.30 dev-util/scons dev-util/vulkan-headers >=dev-vcs/git-1.7.2 >=media-libs/freetype-2.2.1 >=media-libs/lcms-2.6:2 net-fs/sshfs net-libs/rpcsvc-proto net-misc/gsutil sys-apps/usbutils !sys-apps/nih-dbus-tool sys-devel/autofdo sys-devel/bc >=sys-libs/glibc-2.27 sys-libs/libcxxabi sys-libs/libcxx sys-libs/llvm-libunwind virtual/udev sys-libs/libnih sys-power/iasl virtual/modutils x11-apps/mkfontdir x11-apps/xcursorgen x11-apps/xkbcomp >=x11-misc/util-macros-1.2 chromeos-base/chromeos-fonts gnome-base/librsvg dev-libs/atk dev-libs/glib media-libs/fontconfig media-libs/freetype x11-libs/cairo x11-libs/libX11 x11-libs/libXi x11-libs/libXrandr x11-libs/libXtst x11-libs/pango sys-apps/dbus sys-process/lsof app-arch/zip app-editors/nano app-editors/qemacs app-editors/vim app-portage/eclass-manpages app-portage/gentoolkit app-portage/portage-utils app-shells/bash-completion dev-go/go-tools dev-go/golint dev-lang/go dev-python/ipython dev-util/codespell dev-util/patchutils dev-util/perf dev-util/shfmt net-analyzer/netperf sys-apps/less sys-apps/man-pages sys-apps/pv sys-devel/smatch dev-python/mysqlclient dev-python/sqlalchemy dev-python/pyparsing dev-python/virtualenv x11-misc/xkeyboard-config dev-util/google-web-toolkit dev-python/btsocket dev-python/selenium sys-apps/iproute2 sys-apps/net-tools media-video/ffmpeg >=chromeos-base/vboot_reference-1.0-r174 chromeos-base/verity !dev-python/ahocorasick dev-python/pyahocorasick sys-fs/libfat chromeos-base/update_engine sys-fs/e2tools dev-cpp/gflags dev-go/mock dev-python/mock dev-python/mox dev-python/unittest2 dev-python/httplib2 dev-python/pyshark dev-python/python-dateutil dev-python/six dev-python/pylint net-misc/openssh net-misc/socat net-misc/wget dev-python/pyyaml dev-util/lcov chromeos-base/chromeos-dbus-bindings dev-util/meson dev-util/ninja brillo-base/libsparse dev-python/ply dev-util/gn !net-misc/dhcpcd chromeos-base/regions dev-libs/closure-library dev-libs/closure_linter dev-python/autopep8 dev-python/django dev-python/enum34 dev-python/jsonrpclib dev-python/jsonschema dev-python/python-gnupg dev-python/requests dev-python/sphinx dev-python/twisted !dev-python/twisted-core !dev-python/twisted-web www-servers/nginx chromeos-base/tast-cmd chromeos-base/tast-remote-tests-cros dev-util/ragel sys-apps/coreboot-utils chromeos-base/ec-utils dev-libs/libprotobuf-mutator dev-libs/openssl dev-util/unifdef sys-firmware/fw-engprod-tools media-sound/alsa-utils dev-util/boost-build chromeos-base/sepolicy-analyze sys-apps/checkpolicy sys-apps/restorecon sys-apps/secilc chromeos-base/android-relocation-packer app-admin/puppet dev-lang/ruby chromeos-base/update_payload net-libs/nodejs dev-python/clang-python dev-python/grpcio-tools net-libs/grpc-web dev-python/grpcio dev-util/strace app-misc/fdupes sys-power/cpupower
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=91b6f6d0fa0e999a5f9f3d927e81dc47
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r188 b/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r188
new file mode 100644
index 0000000..39e3bf5
--- /dev/null
+++ b/metadata/md5-cache/virtual/target-chromium-os-sdk-1-r188
@@ -0,0 +1,13 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DESCRIPTION=List of packages that are needed inside the Chromium OS SDK
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=!chromeos-base/hard-host-depends !virtual/hard-host-depends-bsp app-arch/bzip2 app-arch/cpio app-arch/gcab app-arch/gzip app-arch/p7zip app-arch/tar app-shells/bash net-misc/iputils net-misc/rsync sys-apps/baselayout sys-apps/coreutils sys-apps/diffutils sys-apps/dtc sys-apps/file sys-apps/findutils sys-apps/gawk sys-apps/grep sys-apps/sed sys-apps/shadow sys-apps/texinfo sys-apps/util-linux sys-apps/which sys-devel/autoconf sys-devel/automake:1.10 sys-devel/automake:1.11 sys-devel/automake:1.15 sys-devel/binutils sys-devel/bison sys-devel/flex sys-devel/gcc sys-devel/gnuconfig sys-devel/grit-i18n sys-devel/libtool sys-devel/m4 sys-devel/make sys-devel/patch sys-fs/e2fsprogs sys-fs/f2fs-tools sys-libs/ncurses sys-libs/readline sys-libs/zlib sys-process/procps sys-process/psmisc virtual/editor virtual/libc virtual/man virtual/os-headers virtual/package-manager virtual/pager app-arch/lbzip2 app-arch/lz4 app-arch/lzop app-arch/pigz app-arch/pixz app-admin/sudo app-crypt/efitools app-crypt/sbsigntools dev-embedded/binman dev-embedded/cbootimage dev-embedded/tegrarcm dev-embedded/u-boot-tools dev-util/ccache media-gfx/pngcrush >=sys-apps/dtc-1.3.0-r5 sys-boot/bootstub sys-boot/grub sys-boot/syslinux sys-devel/crossdev sys-fs/dosfstools sys-fs/squashfs-tools sys-fs/mtd-utils app-misc/jq sys-devel/aapt sys-devel/arc-toolchain-master sys-devel/arc-toolchain-p sys-devel/arc-toolchain-r sys-devel/dex2oatds app-crypt/gnupg app-admin/eselect-opengl app-admin/eselect-mesa app-arch/cabextract app-arch/makeself >=app-arch/pbzip2-1.1.1-r1 app-arch/rpm2targz app-arch/sharutils app-arch/unzip app-crypt/nss app-doc/xmltoman app-emulation/qemu app-emulation/qemu-binfmt-wrapper !app-emulation/qemu-kvm !app-emulation/qemu-user app-text/asciidoc app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets app-text/texi2html app-text/xmlto chromeos-base/google-breakpad chromeos-base/chromeos-base >=chromeos-base/chromeos-config-host-0.0.2-r491 chromeos-base/chromeos-installer chromeos-base/chromite-sdk chromeos-base/cros-devutils[cros_host] chromeos-base/cros-testutils chromeos-base/ec-devutils chromeos-base/minijail dev-db/m17n-contrib dev-db/m17n-db dev-go/protobuf dev-lang/closure-compiler-bin dev-lang/nasm dev-lang/python:2.7 dev-lang/python:3.6 dev-lang/swig dev-lang/tcl dev-lang/yasm dev-libs/dbus-glib dev-libs/flatbuffers >=dev-libs/glib-2.26.1 net-libs/grpc dev-libs/libgcrypt dev-libs/libxslt dev-libs/libyaml dev-libs/m17n-lib dev-libs/protobuf dev-libs/protobuf-c dev-libs/wayland dev-python/cffi dev-python/cherrypy dev-python/ctypesgen dev-python/dbus-python dev-python/dpkt dev-python/ecdsa dev-python/future dev-python/imaging dev-python/intelhex dev-python/m2crypto dev-python/mako dev-python/netifaces dev-python/pexpect dev-python/pillow dev-python/psutil dev-python/py dev-python/pycairo dev-python/pycparser dev-python/pygobject dev-python/pyopenssl dev-python/pytest dev-python/python-evdev dev-python/pyudev dev-python/pyusb dev-python/setproctitle !dev-python/socksipy dev-python/tempita dev-python/ws4py dev-util/bazel dev-util/cmake dev-util/dwarves dev-util/gob dev-util/gdbus-codegen dev-util/gperf dev-util/gtk-doc dev-util/hdctools >=dev-util/gtk-doc-am-1.13 >=dev-util/intltool-0.30 dev-util/scons dev-util/vulkan-headers >=dev-vcs/git-1.7.2 >=media-libs/freetype-2.2.1 >=media-libs/lcms-2.6:2 net-fs/sshfs net-libs/rpcsvc-proto net-misc/gsutil sys-apps/usbutils !sys-apps/nih-dbus-tool sys-devel/autofdo sys-devel/bc >=sys-libs/glibc-2.27 sys-libs/libcxxabi sys-libs/libcxx sys-libs/llvm-libunwind virtual/udev sys-libs/libnih sys-power/iasl virtual/modutils x11-apps/mkfontscale x11-apps/xcursorgen x11-apps/xkbcomp >=x11-misc/util-macros-1.2 chromeos-base/chromeos-fonts gnome-base/librsvg dev-libs/atk dev-libs/glib media-libs/fontconfig media-libs/freetype x11-libs/cairo x11-libs/libX11 x11-libs/libXi x11-libs/libXrandr x11-libs/libXtst x11-libs/pango sys-apps/dbus sys-process/lsof app-arch/zip app-editors/nano app-editors/qemacs app-editors/vim app-portage/eclass-manpages app-portage/gentoolkit app-portage/portage-utils app-shells/bash-completion dev-go/go-tools dev-go/golint dev-lang/go dev-python/ipython dev-util/codespell dev-util/patchutils dev-util/perf dev-util/shfmt net-analyzer/netperf sys-apps/less sys-apps/man-pages sys-apps/pv sys-devel/smatch dev-python/mysqlclient dev-python/sqlalchemy dev-python/pyparsing dev-python/virtualenv x11-misc/xkeyboard-config dev-util/google-web-toolkit dev-python/btsocket dev-python/selenium sys-apps/iproute2 sys-apps/net-tools media-video/ffmpeg >=chromeos-base/vboot_reference-1.0-r174 chromeos-base/verity !dev-python/ahocorasick dev-python/pyahocorasick sys-fs/libfat chromeos-base/update_engine sys-fs/e2tools dev-cpp/gflags dev-go/mock dev-python/mock dev-python/mox dev-python/unittest2 dev-python/httplib2 dev-python/pyshark dev-python/python-dateutil dev-python/six dev-python/pylint net-misc/openssh net-misc/socat net-misc/wget dev-python/pyyaml dev-util/lcov chromeos-base/chromeos-dbus-bindings dev-util/meson dev-util/ninja brillo-base/libsparse dev-python/ply dev-util/gn dev-util/tclint !net-misc/dhcpcd dev-libs/closure-library dev-libs/closure_linter dev-python/autopep8 dev-python/django dev-python/enum34 dev-python/jsonrpclib dev-python/jsonschema dev-python/python-gnupg dev-python/requests dev-python/sphinx dev-python/twisted !dev-python/twisted-core !dev-python/twisted-web www-servers/nginx chromeos-base/tast-cmd chromeos-base/tast-remote-tests-cros dev-util/ragel sys-apps/coreboot-utils chromeos-base/ec-utils dev-libs/libprotobuf-mutator dev-libs/openssl dev-util/unifdef sys-firmware/fw-engprod-tools media-sound/alsa-utils dev-util/boost-build chromeos-base/sepolicy-analyze sys-apps/checkpolicy sys-apps/restorecon sys-apps/secilc sys-apps/selinux-python chromeos-base/android-relocation-packer chromeos-base/update_payload net-libs/nodejs dev-python/clang-python dev-python/grpcio-tools net-libs/grpc-web dev-python/grpcio dev-util/strace app-misc/fdupes sys-power/cpupower chromeos-base/android-sdk sys-devel/zipalign
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9268e8b6af566e3b04bfbbb9f58da358
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-9999 b/metadata/md5-cache/virtual/target-chromium-os-sdk-9999
index 0962ecf..3b91cf8 100644
--- a/metadata/md5-cache/virtual/target-chromium-os-sdk-9999
+++ b/metadata/md5-cache/virtual/target-chromium-os-sdk-9999
@@ -7,7 +7,7 @@
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=!chromeos-base/hard-host-depends !virtual/hard-host-depends-bsp app-arch/bzip2 app-arch/cpio app-arch/gzip app-arch/p7zip app-arch/tar app-shells/bash net-misc/iputils net-misc/rsync sys-apps/baselayout sys-apps/coreutils sys-apps/diffutils sys-apps/dtc sys-apps/file sys-apps/findutils sys-apps/gawk sys-apps/grep sys-apps/sed sys-apps/shadow sys-apps/texinfo sys-apps/util-linux sys-apps/which sys-devel/autoconf sys-devel/automake:1.10 sys-devel/automake:1.11 sys-devel/automake:1.15 sys-devel/binutils sys-devel/bison sys-devel/flex sys-devel/gcc sys-devel/gnuconfig sys-devel/grit-i18n sys-devel/libtool sys-devel/m4 sys-devel/make sys-devel/patch sys-fs/e2fsprogs sys-fs/f2fs-tools sys-libs/ncurses sys-libs/readline sys-libs/zlib sys-process/procps sys-process/psmisc virtual/editor virtual/libc virtual/man virtual/os-headers virtual/package-manager virtual/pager app-arch/lbzip2 app-arch/lz4 app-arch/lzop app-arch/pigz app-arch/pixz app-admin/sudo app-crypt/efitools app-crypt/sbsigntools dev-embedded/cbootimage dev-embedded/tegrarcm dev-embedded/u-boot-tools dev-util/ccache media-gfx/pngcrush >=sys-apps/dtc-1.3.0-r5 sys-boot/bootstub sys-boot/grub sys-boot/syslinux sys-devel/crossdev sys-fs/dosfstools sys-fs/squashfs-tools sys-fs/mtd-utils app-misc/jq sys-devel/aapt sys-devel/arc-cache-builder sys-devel/arc-toolchain-master sys-devel/arc-toolchain-p sys-devel/arc-toolchain-r sys-devel/dex2oatds app-crypt/gnupg app-admin/eselect-opengl app-admin/eselect-mesa app-arch/cabextract app-arch/makeself >=app-arch/pbzip2-1.1.1-r1 app-arch/rpm2targz app-arch/sharutils app-arch/unzip app-crypt/nss app-doc/xmltoman app-emulation/qemu app-emulation/qemu-binfmt-wrapper !app-emulation/qemu-kvm !app-emulation/qemu-user app-text/asciidoc app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets app-text/texi2html app-text/xmlto chromeos-base/google-breakpad chromeos-base/chromeos-base >=chromeos-base/chromeos-config-host-0.0.2-r491 chromeos-base/chromeos-installer chromeos-base/chromite-sdk chromeos-base/cros-devutils[cros_host] chromeos-base/cros-testutils chromeos-base/ec-devutils chromeos-base/minijail dev-db/m17n-contrib dev-db/m17n-db dev-go/protobuf dev-lang/closure-compiler-bin dev-lang/nasm dev-lang/python:2.7 dev-lang/python:3.6 dev-lang/swig dev-lang/tcl dev-lang/yasm dev-libs/dbus-glib dev-libs/flatbuffers >=dev-libs/glib-2.26.1 net-libs/grpc dev-libs/libgcrypt dev-libs/libxslt dev-libs/libyaml dev-libs/m17n-lib dev-libs/protobuf dev-libs/protobuf-c dev-libs/wayland dev-python/cffi dev-python/cherrypy dev-python/ctypesgen dev-python/dbus-python dev-python/dpkt dev-python/ecdsa dev-python/future dev-python/imaging dev-python/intelhex dev-python/m2crypto dev-python/mako dev-python/netifaces dev-python/pexpect dev-python/pillow dev-python/psutil dev-python/py dev-python/pycairo dev-python/pycparser dev-python/pygobject dev-python/pyopenssl dev-python/pytest dev-python/python-evdev dev-python/pyudev dev-python/pyusb dev-python/setproctitle !dev-python/socksipy dev-python/tempita dev-python/ws4py dev-util/bazel dev-util/cmake dev-util/dwarves dev-util/gob dev-util/gdbus-codegen dev-util/gperf dev-util/gtk-doc dev-util/hdctools >=dev-util/gtk-doc-am-1.13 >=dev-util/intltool-0.30 dev-util/scons dev-util/vulkan-headers >=dev-vcs/git-1.7.2 >=media-libs/freetype-2.2.1 >=media-libs/lcms-2.6:2 net-fs/sshfs net-libs/rpcsvc-proto net-misc/gsutil sys-apps/usbutils !sys-apps/nih-dbus-tool sys-devel/autofdo sys-devel/bc >=sys-libs/glibc-2.27 sys-libs/libcxxabi sys-libs/libcxx sys-libs/llvm-libunwind virtual/udev sys-libs/libnih sys-power/iasl virtual/modutils x11-apps/mkfontdir x11-apps/xcursorgen x11-apps/xkbcomp >=x11-misc/util-macros-1.2 chromeos-base/chromeos-fonts gnome-base/librsvg dev-libs/atk dev-libs/glib media-libs/fontconfig media-libs/freetype x11-libs/cairo x11-libs/libX11 x11-libs/libXi x11-libs/libXrandr x11-libs/libXtst x11-libs/pango sys-apps/dbus sys-process/lsof app-arch/zip app-editors/nano app-editors/qemacs app-editors/vim app-portage/eclass-manpages app-portage/gentoolkit app-portage/portage-utils app-shells/bash-completion dev-go/go-tools dev-go/golint dev-lang/go dev-python/ipython dev-util/codespell dev-util/patchutils dev-util/perf dev-util/shfmt net-analyzer/netperf sys-apps/less sys-apps/man-pages sys-apps/pv sys-devel/smatch dev-python/mysqlclient dev-python/sqlalchemy dev-python/pyparsing dev-python/virtualenv x11-misc/xkeyboard-config dev-util/google-web-toolkit dev-python/btsocket dev-python/selenium sys-apps/iproute2 sys-apps/net-tools media-video/ffmpeg >=chromeos-base/vboot_reference-1.0-r174 chromeos-base/verity !dev-python/ahocorasick dev-python/pyahocorasick sys-fs/libfat chromeos-base/update_engine sys-fs/e2tools dev-cpp/gflags dev-go/mock dev-python/mock dev-python/mox dev-python/unittest2 dev-python/httplib2 dev-python/pyshark dev-python/python-dateutil dev-python/six dev-python/pylint net-misc/openssh net-misc/socat net-misc/wget dev-python/pyyaml dev-util/lcov chromeos-base/chromeos-dbus-bindings dev-util/meson dev-util/ninja brillo-base/libsparse dev-python/ply dev-util/gn !net-misc/dhcpcd chromeos-base/regions dev-libs/closure-library dev-libs/closure_linter dev-python/autopep8 dev-python/django dev-python/enum34 dev-python/jsonrpclib dev-python/jsonschema dev-python/python-gnupg dev-python/requests dev-python/sphinx dev-python/twisted !dev-python/twisted-core !dev-python/twisted-web www-servers/nginx chromeos-base/tast-cmd chromeos-base/tast-remote-tests-cros dev-util/ragel sys-apps/coreboot-utils chromeos-base/ec-utils dev-libs/libprotobuf-mutator dev-libs/openssl dev-util/unifdef sys-firmware/fw-engprod-tools media-sound/alsa-utils dev-util/boost-build chromeos-base/sepolicy-analyze sys-apps/checkpolicy sys-apps/restorecon sys-apps/secilc chromeos-base/android-relocation-packer app-admin/puppet dev-lang/ruby chromeos-base/update_payload net-libs/nodejs dev-python/clang-python dev-python/grpcio-tools net-libs/grpc-web dev-python/grpcio dev-util/strace app-misc/fdupes sys-power/cpupower
+RDEPEND=!chromeos-base/hard-host-depends !virtual/hard-host-depends-bsp app-arch/bzip2 app-arch/cpio app-arch/gcab app-arch/gzip app-arch/p7zip app-arch/tar app-shells/bash net-misc/iputils net-misc/rsync sys-apps/baselayout sys-apps/coreutils sys-apps/diffutils sys-apps/dtc sys-apps/file sys-apps/findutils sys-apps/gawk sys-apps/grep sys-apps/sed sys-apps/shadow sys-apps/texinfo sys-apps/util-linux sys-apps/which sys-devel/autoconf sys-devel/automake:1.10 sys-devel/automake:1.11 sys-devel/automake:1.15 sys-devel/binutils sys-devel/bison sys-devel/flex sys-devel/gcc sys-devel/gnuconfig sys-devel/grit-i18n sys-devel/libtool sys-devel/m4 sys-devel/make sys-devel/patch sys-fs/e2fsprogs sys-fs/f2fs-tools sys-libs/ncurses sys-libs/readline sys-libs/zlib sys-process/procps sys-process/psmisc virtual/editor virtual/libc virtual/man virtual/os-headers virtual/package-manager virtual/pager app-arch/lbzip2 app-arch/lz4 app-arch/lzop app-arch/pigz app-arch/pixz app-admin/sudo app-crypt/efitools app-crypt/sbsigntools dev-embedded/binman dev-embedded/cbootimage dev-embedded/tegrarcm dev-embedded/u-boot-tools dev-util/ccache media-gfx/pngcrush >=sys-apps/dtc-1.3.0-r5 sys-boot/bootstub sys-boot/grub sys-boot/syslinux sys-devel/crossdev sys-fs/dosfstools sys-fs/squashfs-tools sys-fs/mtd-utils app-misc/jq sys-devel/aapt sys-devel/arc-toolchain-master sys-devel/arc-toolchain-p sys-devel/arc-toolchain-r sys-devel/dex2oatds app-crypt/gnupg app-admin/eselect-opengl app-admin/eselect-mesa app-arch/cabextract app-arch/makeself >=app-arch/pbzip2-1.1.1-r1 app-arch/rpm2targz app-arch/sharutils app-arch/unzip app-crypt/nss app-doc/xmltoman app-emulation/qemu app-emulation/qemu-binfmt-wrapper !app-emulation/qemu-kvm !app-emulation/qemu-user app-text/asciidoc app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.5 app-text/docbook-xsl-stylesheets app-text/texi2html app-text/xmlto chromeos-base/google-breakpad chromeos-base/chromeos-base >=chromeos-base/chromeos-config-host-0.0.2-r491 chromeos-base/chromeos-installer chromeos-base/chromite-sdk chromeos-base/cros-devutils[cros_host] chromeos-base/cros-testutils chromeos-base/ec-devutils chromeos-base/minijail dev-db/m17n-contrib dev-db/m17n-db dev-go/protobuf dev-lang/closure-compiler-bin dev-lang/nasm dev-lang/python:2.7 dev-lang/python:3.6 dev-lang/swig dev-lang/tcl dev-lang/yasm dev-libs/dbus-glib dev-libs/flatbuffers >=dev-libs/glib-2.26.1 net-libs/grpc dev-libs/libgcrypt dev-libs/libxslt dev-libs/libyaml dev-libs/m17n-lib dev-libs/protobuf dev-libs/protobuf-c dev-libs/wayland dev-python/cffi dev-python/cherrypy dev-python/ctypesgen dev-python/dbus-python dev-python/dpkt dev-python/ecdsa dev-python/future dev-python/imaging dev-python/intelhex dev-python/m2crypto dev-python/mako dev-python/netifaces dev-python/pexpect dev-python/pillow dev-python/psutil dev-python/py dev-python/pycairo dev-python/pycparser dev-python/pygobject dev-python/pyopenssl dev-python/pytest dev-python/python-evdev dev-python/pyudev dev-python/pyusb dev-python/setproctitle !dev-python/socksipy dev-python/tempita dev-python/ws4py dev-util/bazel dev-util/cmake dev-util/dwarves dev-util/gob dev-util/gdbus-codegen dev-util/gperf dev-util/gtk-doc dev-util/hdctools >=dev-util/gtk-doc-am-1.13 >=dev-util/intltool-0.30 dev-util/scons dev-util/vulkan-headers >=dev-vcs/git-1.7.2 >=media-libs/freetype-2.2.1 >=media-libs/lcms-2.6:2 net-fs/sshfs net-libs/rpcsvc-proto net-misc/gsutil sys-apps/usbutils !sys-apps/nih-dbus-tool sys-devel/autofdo sys-devel/bc >=sys-libs/glibc-2.27 sys-libs/libcxxabi sys-libs/libcxx sys-libs/llvm-libunwind virtual/udev sys-libs/libnih sys-power/iasl virtual/modutils x11-apps/mkfontscale x11-apps/xcursorgen x11-apps/xkbcomp >=x11-misc/util-macros-1.2 chromeos-base/chromeos-fonts gnome-base/librsvg dev-libs/atk dev-libs/glib media-libs/fontconfig media-libs/freetype x11-libs/cairo x11-libs/libX11 x11-libs/libXi x11-libs/libXrandr x11-libs/libXtst x11-libs/pango sys-apps/dbus sys-process/lsof app-arch/zip app-editors/nano app-editors/qemacs app-editors/vim app-portage/eclass-manpages app-portage/gentoolkit app-portage/portage-utils app-shells/bash-completion dev-go/go-tools dev-go/golint dev-lang/go dev-python/ipython dev-util/codespell dev-util/patchutils dev-util/perf dev-util/shfmt net-analyzer/netperf sys-apps/less sys-apps/man-pages sys-apps/pv sys-devel/smatch dev-python/mysqlclient dev-python/sqlalchemy dev-python/pyparsing dev-python/virtualenv x11-misc/xkeyboard-config dev-util/google-web-toolkit dev-python/btsocket dev-python/selenium sys-apps/iproute2 sys-apps/net-tools media-video/ffmpeg >=chromeos-base/vboot_reference-1.0-r174 chromeos-base/verity !dev-python/ahocorasick dev-python/pyahocorasick sys-fs/libfat chromeos-base/update_engine sys-fs/e2tools dev-cpp/gflags dev-go/mock dev-python/mock dev-python/mox dev-python/unittest2 dev-python/httplib2 dev-python/pyshark dev-python/python-dateutil dev-python/six dev-python/pylint net-misc/openssh net-misc/socat net-misc/wget dev-python/pyyaml dev-util/lcov chromeos-base/chromeos-dbus-bindings dev-util/meson dev-util/ninja brillo-base/libsparse dev-python/ply dev-util/gn dev-util/tclint !net-misc/dhcpcd dev-libs/closure-library dev-libs/closure_linter dev-python/autopep8 dev-python/django dev-python/enum34 dev-python/jsonrpclib dev-python/jsonschema dev-python/python-gnupg dev-python/requests dev-python/sphinx dev-python/twisted !dev-python/twisted-core !dev-python/twisted-web www-servers/nginx chromeos-base/tast-cmd chromeos-base/tast-remote-tests-cros dev-util/ragel sys-apps/coreboot-utils chromeos-base/ec-utils dev-libs/libprotobuf-mutator dev-libs/openssl dev-util/unifdef sys-firmware/fw-engprod-tools media-sound/alsa-utils dev-util/boost-build chromeos-base/sepolicy-analyze sys-apps/checkpolicy sys-apps/restorecon sys-apps/secilc sys-apps/selinux-python chromeos-base/android-relocation-packer chromeos-base/update_payload net-libs/nodejs dev-python/clang-python dev-python/grpcio-tools net-libs/grpc-web dev-python/grpcio dev-util/strace app-misc/fdupes sys-power/cpupower chromeos-base/android-sdk sys-devel/zipalign
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=76e4a937ff13134345d0ee032954cfb9
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=2035808f9467d3ddb382656ab98038b7
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-nobdeps-1-r1 b/metadata/md5-cache/virtual/target-chromium-os-sdk-nobdeps-1-r3
similarity index 100%
rename from metadata/md5-cache/virtual/target-chromium-os-sdk-nobdeps-1-r1
rename to metadata/md5-cache/virtual/target-chromium-os-sdk-nobdeps-1-r3
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1 b/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1
index 557f38d..0755f9f 100644
--- a/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1
+++ b/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1
@@ -4,6 +4,6 @@
 HOMEPAGE=http://dev.chromium.org/
 KEYWORDS=*
 LICENSE=BSD-Google
-RDEPEND=dev-lang/rust dev-rust/dbus-codegen dev-rust/protobuf-codegen sys-apps/mosys dev-embedded/coreboot-sdk
+RDEPEND=dev-lang/rust dev-rust/dbus-codegen dev-rust/protobuf-codegen sys-apps/mosys sys-apps/ripgrep dev-embedded/coreboot-sdk
 SLOT=0
-_md5_=70e54119f4fe13a00c8a0f998b04f9a3
+_md5_=e706349c18546033d32106705407a909
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r6 b/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r6
deleted file mode 100644
index 557f38d..0000000
--- a/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r6
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=-
-DESCRIPTION=List of packages that are needed inside the SDK, but after we've built all the toolchain packages that we install separately via binpkgs. This avoids circular dependencies when bootstrapping.
-EAPI=5
-HOMEPAGE=http://dev.chromium.org/
-KEYWORDS=*
-LICENSE=BSD-Google
-RDEPEND=dev-lang/rust dev-rust/dbus-codegen dev-rust/protobuf-codegen sys-apps/mosys dev-embedded/coreboot-sdk
-SLOT=0
-_md5_=70e54119f4fe13a00c8a0f998b04f9a3
diff --git a/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r7 b/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r7
new file mode 100644
index 0000000..0755f9f
--- /dev/null
+++ b/metadata/md5-cache/virtual/target-chromium-os-sdk-post-cross-1-r7
@@ -0,0 +1,9 @@
+DEFINED_PHASES=-
+DESCRIPTION=List of packages that are needed inside the SDK, but after we've built all the toolchain packages that we install separately via binpkgs. This avoids circular dependencies when bootstrapping.
+EAPI=5
+HOMEPAGE=http://dev.chromium.org/
+KEYWORDS=*
+LICENSE=BSD-Google
+RDEPEND=dev-lang/rust dev-rust/dbus-codegen dev-rust/protobuf-codegen sys-apps/mosys sys-apps/ripgrep dev-embedded/coreboot-sdk
+SLOT=0
+_md5_=e706349c18546033d32106705407a909
diff --git a/metadata/md5-cache/virtual/target-chromium-os-test-1-r118 b/metadata/md5-cache/virtual/target-chromium-os-test-1-r118
deleted file mode 100644
index 4804c01..0000000
--- a/metadata/md5-cache/virtual/target-chromium-os-test-1-r118
+++ /dev/null
@@ -1,14 +0,0 @@
-BDEPEND=dev-vcs/git
-DEFINED_PHASES=info setup unpack
-DEPEND=chromeos-base/chromite
-DESCRIPTION=List of packages that are needed inside the Chromium OS test image; Note: test images are a superset of dev images.
-EAPI=7
-HOMEPAGE=https://dev.chromium.org/
-IUSE=arc-camera3 biod -chromeless_tests cheets chromeless_tty cr50_onboard +cras cros_ec cros_embedded dlc kvm_host hammerd ml_service opengl opengles p2p +shill +tpm tpm2 unibuild vaapi wifi_hostap_test wifi_testbed_ap +wired_8021x cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=tpm? ( app-crypt/tpm-tools chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) tpm2? ( chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) chromeos-base/chromeos-test-root chromeos-base/ec-utils chromeos-base/ec-utils-test chromeos-base/factory-deps biod? ( virtual/chromeos-fpmcu-test ) hammerd? ( chromeos-base/hammerd-test-utils ) ml_service? ( chromeos-base/ml-cmdline ) chromeos-base/recover-duts chromeos-base/tast-local-test-runner chromeos-base/tast-local-tests chromeos-base/tast-use-flags chromeos-base/verity chromeos-base/vpd cros_ec? ( chromeos-base/ec-devutils ) !chromeless_tty? ( !chromeless_tests? ( >=dev-cpp/gflags-2.0 ) ) wifi_testbed_ap? ( dev-python/btsocket ) dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/opensc p2p? ( dev-python/dpkt ) cr50_onboard? ( dev-util/u2f-ref-code ) net-misc/rsync sys-apps/memtester virtual/autotest-capability virtual/chromeos-bsp-test kvm_host? ( chromeos-base/crostini-pin chromeos-base/termina-pin ) sys-apps/hdparm sys-apps/mmc-utils !cros_embedded? ( x86? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) amd64? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) app-admin/sudo app-arch/gzip app-arch/tar app-benchmarks/blktests app-benchmarks/blogbench app-benchmarks/lmbench app-benchmarks/microbenchmarks app-benchmarks/pjdfstest app-benchmarks/xfstests app-misc/ckermit opengles? ( app-misc/eglinfo ) app-misc/tmux app-misc/utouch-evemu app-mobilephone/dfu-util chromeos-base/autotest-client cras? ( chromeos-base/audiotest ) chromeos-base/avtest_label_detect chromeos-base/chrome-binary-tests chromeos-base/cros-camera-tool chromeos-base/cros-config-test !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) chromeos-base/factory-mini chromeos-base/glbench chromeos-base/graphics-utils-python chromeos-base/libvda-gpu-tests chromeos-base/modem-diagnostics chromeos-base/policy_utils chromeos-base/protofiles chromeos-base/pywalt !chromeless_tty? ( chromeos-base/screenshot ) chromeos-base/secure-wipe shill? ( chromeos-base/shill-test-scripts wired_8021x? ( net-wireless/hostapd ) ) !chromeless_tests? ( chromeos-base/telemetry ) chromeos-base/toolchain-tests dev-embedded/dfu-programmer dev-go/syzkaller dev-libs/re2 dev-python/protobuf-python dev-python/btsocket dev-python/contextlib2 dev-python/dbus-python dev-python/dpkt dev-python/httplib2 dev-python/imaging dev-python/jsonrpclib dev-python/mkvparse dev-python/netifaces dev-python/pygobject dev-python/pyserial dev-python/pytest dev-python/python-evdev dev-python/python-uinput dev-python/pyudev dev-python/pyxattr dev-python/pyyaml dev-python/selenium dev-python/setproctitle dev-python/setuptools dev-python/ws4py dev-util/stressapptest dev-util/trace-cmd dlc? ( sys-fs/squashfs-tools ) games-util/joystick media-gfx/imagemagick[jpeg,png,svg,tiff] media-gfx/perceptualdiff media-gfx/zbar arc-camera3? ( media-libs/cros-camera-libcamera_connector_test ) arc-camera3? ( media-libs/cros-camera-libjea_test ) arc-camera3? ( media-libs/cros-camera-test ) media-libs/cros-camera-v4l2_test media-libs/libexif media-libs/libvpx media-libs/opencv !chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) ) media-libs/tiff opengles? ( media-libs/waffle ) opengl? ( media-libs/waffle ) media-sound/sox net-analyzer/netperf net-dialup/minicom net-dns/dnsmasq net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/radvd wifi_hostap_test? ( net-wireless/hostap-test ) sci-geosciences/gpsd sys-apps/coreutils sys-apps/dtc sys-apps/ethtool sys-apps/file sys-apps/findutils sys-apps/kbd sys-apps/shadow sys-devel/binutils sys-process/iotop sys-process/procps sys-process/psmisc sys-process/time x11-libs/libdrm )
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=155a48d5a477d14088844546665ebf4f
diff --git a/metadata/md5-cache/virtual/target-chromium-os-test-1-r128 b/metadata/md5-cache/virtual/target-chromium-os-test-1-r128
new file mode 100644
index 0000000..835636b
--- /dev/null
+++ b/metadata/md5-cache/virtual/target-chromium-os-test-1-r128
@@ -0,0 +1,14 @@
+BDEPEND=dev-vcs/git
+DEFINED_PHASES=info setup unpack
+DEPEND=chromeos-base/chromite
+DESCRIPTION=List of packages that are needed inside the Chromium OS test image; Note: test images are a superset of dev images.
+EAPI=7
+HOMEPAGE=https://dev.chromium.org/
+IUSE=arc-camera3 biod cdm_factory_daemon -chromeless_tests cheets chromeless_tty cr50_onboard +cras cros_ec cros_embedded dlc kvm_host hammerd ml_benchmark_drivers ml_service nnapi opengl opengles p2p +perfetto scanner +shill +tpm tpm2 unibuild vaapi wifi_hostap_test wifi_testbed_ap +wired_8021x cros_host cros_workon_tree_8ce164efd78fcb4a68e898d8c92c7579657a49b1
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=tpm? ( app-crypt/tpm-tools chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) tpm2? ( chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) chromeos-base/chromeos-test-root chromeos-base/ec-utils chromeos-base/ec-utils-test chromeos-base/factory-deps biod? ( virtual/chromeos-fpmcu-test chromeos-base/chromeos-fpmcu-unittests ) hammerd? ( chromeos-base/hammerd-test-utils ) scanner? ( chromeos-base/lorgnette_cli chromeos-base/sane-backends-test ) ml_benchmark_drivers? ( chromeos-base/ml-benchmark-drivers ) ml_service? ( chromeos-base/ml-cmdline ) nnapi? ( chromeos-base/ml-test-assets ) chromeos-base/recover-duts chromeos-base/tast-local-test-runner chromeos-base/tast-local-tests chromeos-base/tast-use-flags chromeos-base/verity chromeos-base/vpd cros_ec? ( chromeos-base/ec-devutils ) !chromeless_tty? ( !chromeless_tests? ( >=dev-cpp/gflags-2.0 ) ) wifi_testbed_ap? ( dev-python/btsocket ) dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/opensc p2p? ( dev-python/dpkt ) perfetto? ( chromeos-base/perfetto ) cr50_onboard? ( dev-util/u2f-ref-code ) net-misc/rsync sys-apps/memtester virtual/autotest-capability virtual/chromeos-bsp-test kvm_host? ( chromeos-base/crostini-pin chromeos-base/termina-pin ) sys-apps/hdparm sys-apps/mmc-utils !cros_embedded? ( x86? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) amd64? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) app-admin/sudo app-arch/gzip app-arch/tar app-benchmarks/blktests app-benchmarks/blogbench app-benchmarks/lmbench app-benchmarks/microbenchmarks app-benchmarks/pjdfstest app-benchmarks/xfstests app-misc/ckermit opengles? ( app-misc/eglinfo ) app-misc/tmux app-misc/utouch-evemu app-mobilephone/dfu-util chromeos-base/autotest-client cras? ( chromeos-base/audiotest ) chromeos-base/avtest_label_detect cdm_factory_daemon? ( chromeos-base/cdm-oemcrypto-hw-test ) chromeos-base/chrome-binary-tests chromeos-base/cros-camera-tool chromeos-base/cros-config-test !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) chromeos-base/factory-mini chromeos-base/glbench chromeos-base/graphics-utils-python chromeos-base/libvda-gpu-tests chromeos-base/modem-diagnostics chromeos-base/policy_utils chromeos-base/protofiles chromeos-base/pywalt !chromeless_tty? ( chromeos-base/screenshot ) chromeos-base/secure-wipe shill? ( chromeos-base/shill-test-scripts wired_8021x? ( net-wireless/hostapd ) ) !chromeless_tests? ( chromeos-base/telemetry ) chromeos-base/toolchain-tests dev-embedded/dfu-programmer dev-go/syzkaller dev-libs/re2 dev-python/protobuf-python dev-python/btsocket dev-python/contextlib2 dev-python/dbus-python dev-python/dpkt dev-python/httplib2 dev-python/imaging dev-python/jsonrpclib dev-python/mkvparse dev-python/netifaces dev-python/pygobject dev-python/pyserial dev-python/pytest dev-python/python-evdev dev-python/python-uinput dev-python/pyudev dev-python/pyxattr dev-python/pyyaml dev-python/selenium dev-python/setproctitle dev-python/setuptools dev-python/ws4py dev-util/stressapptest dev-util/trace-cmd dlc? ( sys-fs/squashfs-tools ) games-util/joystick media-gfx/imagemagick[jpeg,png,svg,tiff] media-gfx/perceptualdiff media-gfx/zbar arc-camera3? ( media-libs/cros-camera-libcamera_connector_test ) arc-camera3? ( media-libs/cros-camera-libjea_test ) arc-camera3? ( media-libs/cros-camera-test ) media-libs/cros-camera-v4l2_test media-libs/libexif media-libs/libvpx media-libs/opencv !chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) ) media-libs/tiff opengles? ( media-libs/waffle ) opengl? ( media-libs/waffle ) media-sound/sox net-analyzer/netperf net-dialup/minicom net-dns/dnsmasq net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/radvd wifi_hostap_test? ( net-wireless/hostap-test ) sci-geosciences/gpsd sys-apps/coreutils sys-apps/dtc sys-apps/ethtool sys-apps/file sys-apps/findutils sys-apps/kbd sys-apps/shadow sys-devel/binutils sys-process/iotop sys-process/procps sys-process/psmisc sys-process/time x11-libs/libdrm )
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=84967f5d2fbbee86f1edcf249e9a7e4e
diff --git a/metadata/md5-cache/virtual/target-chromium-os-test-9999 b/metadata/md5-cache/virtual/target-chromium-os-test-9999
index 2ca3375..565d4cd 100644
--- a/metadata/md5-cache/virtual/target-chromium-os-test-9999
+++ b/metadata/md5-cache/virtual/target-chromium-os-test-9999
@@ -4,11 +4,11 @@
 DESCRIPTION=List of packages that are needed inside the Chromium OS test image; Note: test images are a superset of dev images.
 EAPI=7
 HOMEPAGE=https://dev.chromium.org/
-IUSE=arc-camera3 biod -chromeless_tests cheets chromeless_tty cr50_onboard +cras cros_ec cros_embedded dlc kvm_host hammerd ml_service opengl opengles p2p +shill +tpm tpm2 unibuild vaapi wifi_hostap_test wifi_testbed_ap +wired_8021x cros_host cros_workon_tree_
+IUSE=arc-camera3 biod cdm_factory_daemon -chromeless_tests cheets chromeless_tty cr50_onboard +cras cros_ec cros_embedded dlc kvm_host hammerd ml_benchmark_drivers ml_service nnapi opengl opengles p2p +perfetto scanner +shill +tpm tpm2 unibuild vaapi wifi_hostap_test wifi_testbed_ap +wired_8021x cros_host cros_workon_tree_
 KEYWORDS=~*
 LICENSE=BSD-Google
 PROPERTIES=live
-RDEPEND=tpm? ( app-crypt/tpm-tools chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) tpm2? ( chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) chromeos-base/chromeos-test-root chromeos-base/ec-utils chromeos-base/ec-utils-test chromeos-base/factory-deps biod? ( virtual/chromeos-fpmcu-test ) hammerd? ( chromeos-base/hammerd-test-utils ) ml_service? ( chromeos-base/ml-cmdline ) chromeos-base/recover-duts chromeos-base/tast-local-test-runner chromeos-base/tast-local-tests chromeos-base/tast-use-flags chromeos-base/verity chromeos-base/vpd cros_ec? ( chromeos-base/ec-devutils ) !chromeless_tty? ( !chromeless_tests? ( >=dev-cpp/gflags-2.0 ) ) wifi_testbed_ap? ( dev-python/btsocket ) dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/opensc p2p? ( dev-python/dpkt ) cr50_onboard? ( dev-util/u2f-ref-code ) net-misc/rsync sys-apps/memtester virtual/autotest-capability virtual/chromeos-bsp-test kvm_host? ( chromeos-base/crostini-pin chromeos-base/termina-pin ) sys-apps/hdparm sys-apps/mmc-utils !cros_embedded? ( x86? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) amd64? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) app-admin/sudo app-arch/gzip app-arch/tar app-benchmarks/blktests app-benchmarks/blogbench app-benchmarks/lmbench app-benchmarks/microbenchmarks app-benchmarks/pjdfstest app-benchmarks/xfstests app-misc/ckermit opengles? ( app-misc/eglinfo ) app-misc/tmux app-misc/utouch-evemu app-mobilephone/dfu-util chromeos-base/autotest-client cras? ( chromeos-base/audiotest ) chromeos-base/avtest_label_detect chromeos-base/chrome-binary-tests chromeos-base/cros-camera-tool chromeos-base/cros-config-test !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) chromeos-base/factory-mini chromeos-base/glbench chromeos-base/graphics-utils-python chromeos-base/libvda-gpu-tests chromeos-base/modem-diagnostics chromeos-base/policy_utils chromeos-base/protofiles chromeos-base/pywalt !chromeless_tty? ( chromeos-base/screenshot ) chromeos-base/secure-wipe shill? ( chromeos-base/shill-test-scripts wired_8021x? ( net-wireless/hostapd ) ) !chromeless_tests? ( chromeos-base/telemetry ) chromeos-base/toolchain-tests dev-embedded/dfu-programmer dev-go/syzkaller dev-libs/re2 dev-python/protobuf-python dev-python/btsocket dev-python/contextlib2 dev-python/dbus-python dev-python/dpkt dev-python/httplib2 dev-python/imaging dev-python/jsonrpclib dev-python/mkvparse dev-python/netifaces dev-python/pygobject dev-python/pyserial dev-python/pytest dev-python/python-evdev dev-python/python-uinput dev-python/pyudev dev-python/pyxattr dev-python/pyyaml dev-python/selenium dev-python/setproctitle dev-python/setuptools dev-python/ws4py dev-util/stressapptest dev-util/trace-cmd dlc? ( sys-fs/squashfs-tools ) games-util/joystick media-gfx/imagemagick[jpeg,png,svg,tiff] media-gfx/perceptualdiff media-gfx/zbar arc-camera3? ( media-libs/cros-camera-libcamera_connector_test ) arc-camera3? ( media-libs/cros-camera-libjea_test ) arc-camera3? ( media-libs/cros-camera-test ) media-libs/cros-camera-v4l2_test media-libs/libexif media-libs/libvpx media-libs/opencv !chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) ) media-libs/tiff opengles? ( media-libs/waffle ) opengl? ( media-libs/waffle ) media-sound/sox net-analyzer/netperf net-dialup/minicom net-dns/dnsmasq net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/radvd wifi_hostap_test? ( net-wireless/hostap-test ) sci-geosciences/gpsd sys-apps/coreutils sys-apps/dtc sys-apps/ethtool sys-apps/file sys-apps/findutils sys-apps/kbd sys-apps/shadow sys-devel/binutils sys-process/iotop sys-process/procps sys-process/psmisc sys-process/time x11-libs/libdrm )
+RDEPEND=tpm? ( app-crypt/tpm-tools chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) tpm2? ( chromeos-base/hwsec-test-utils chromeos-base/tpm_softclear_utils ) chromeos-base/chromeos-test-root chromeos-base/ec-utils chromeos-base/ec-utils-test chromeos-base/factory-deps biod? ( virtual/chromeos-fpmcu-test chromeos-base/chromeos-fpmcu-unittests ) hammerd? ( chromeos-base/hammerd-test-utils ) scanner? ( chromeos-base/lorgnette_cli chromeos-base/sane-backends-test ) ml_benchmark_drivers? ( chromeos-base/ml-benchmark-drivers ) ml_service? ( chromeos-base/ml-cmdline ) nnapi? ( chromeos-base/ml-test-assets ) chromeos-base/recover-duts chromeos-base/tast-local-test-runner chromeos-base/tast-local-tests chromeos-base/tast-use-flags chromeos-base/verity chromeos-base/vpd cros_ec? ( chromeos-base/ec-devutils ) !chromeless_tty? ( !chromeless_tests? ( >=dev-cpp/gflags-2.0 ) ) wifi_testbed_ap? ( dev-python/btsocket ) dev-lang/python:2.7 dev-lang/python:3.6 dev-libs/opensc p2p? ( dev-python/dpkt ) perfetto? ( chromeos-base/perfetto ) cr50_onboard? ( dev-util/u2f-ref-code ) net-misc/rsync sys-apps/memtester virtual/autotest-capability virtual/chromeos-bsp-test kvm_host? ( chromeos-base/crostini-pin chromeos-base/termina-pin ) sys-apps/hdparm sys-apps/mmc-utils !cros_embedded? ( x86? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) amd64? ( app-benchmarks/sysbench sys-apps/pciutils sys-power/iasl vaapi? ( media-gfx/vadumpcaps media-video/libva-utils ) x11-misc/read-edid ) app-admin/sudo app-arch/gzip app-arch/tar app-benchmarks/blktests app-benchmarks/blogbench app-benchmarks/lmbench app-benchmarks/microbenchmarks app-benchmarks/pjdfstest app-benchmarks/xfstests app-misc/ckermit opengles? ( app-misc/eglinfo ) app-misc/tmux app-misc/utouch-evemu app-mobilephone/dfu-util chromeos-base/autotest-client cras? ( chromeos-base/audiotest ) chromeos-base/avtest_label_detect cdm_factory_daemon? ( chromeos-base/cdm-oemcrypto-hw-test ) chromeos-base/chrome-binary-tests chromeos-base/cros-camera-tool chromeos-base/cros-config-test !chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) ) chromeos-base/factory-mini chromeos-base/glbench chromeos-base/graphics-utils-python chromeos-base/libvda-gpu-tests chromeos-base/modem-diagnostics chromeos-base/policy_utils chromeos-base/protofiles chromeos-base/pywalt !chromeless_tty? ( chromeos-base/screenshot ) chromeos-base/secure-wipe shill? ( chromeos-base/shill-test-scripts wired_8021x? ( net-wireless/hostapd ) ) !chromeless_tests? ( chromeos-base/telemetry ) chromeos-base/toolchain-tests dev-embedded/dfu-programmer dev-go/syzkaller dev-libs/re2 dev-python/protobuf-python dev-python/btsocket dev-python/contextlib2 dev-python/dbus-python dev-python/dpkt dev-python/httplib2 dev-python/imaging dev-python/jsonrpclib dev-python/mkvparse dev-python/netifaces dev-python/pygobject dev-python/pyserial dev-python/pytest dev-python/python-evdev dev-python/python-uinput dev-python/pyudev dev-python/pyxattr dev-python/pyyaml dev-python/selenium dev-python/setproctitle dev-python/setuptools dev-python/ws4py dev-util/stressapptest dev-util/trace-cmd dlc? ( sys-fs/squashfs-tools ) games-util/joystick media-gfx/imagemagick[jpeg,png,svg,tiff] media-gfx/perceptualdiff media-gfx/zbar arc-camera3? ( media-libs/cros-camera-libcamera_connector_test ) arc-camera3? ( media-libs/cros-camera-libjea_test ) arc-camera3? ( media-libs/cros-camera-test ) media-libs/cros-camera-v4l2_test media-libs/libexif media-libs/libvpx media-libs/opencv !chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) ) media-libs/tiff opengles? ( media-libs/waffle ) opengl? ( media-libs/waffle ) media-sound/sox net-analyzer/netperf net-dialup/minicom net-dns/dnsmasq net-misc/dhcp net-misc/iperf:2 net-misc/iputils net-misc/openssh net-misc/radvd wifi_hostap_test? ( net-wireless/hostap-test ) sci-geosciences/gpsd sys-apps/coreutils sys-apps/dtc sys-apps/ethtool sys-apps/file sys-apps/findutils sys-apps/kbd sys-apps/shadow sys-devel/binutils sys-process/iotop sys-process/procps sys-process/psmisc sys-process/time x11-libs/libdrm )
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=74679c318e95a393fa8dd1b0dcee0a51
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=6eebce09d3936618841f7523046756a4
diff --git a/metadata/md5-cache/virtual/toolchain-packages-1-r1 b/metadata/md5-cache/virtual/toolchain-packages-1-r1
deleted file mode 100644
index a7b5094..0000000
--- a/metadata/md5-cache/virtual/toolchain-packages-1-r1
+++ /dev/null
@@ -1,9 +0,0 @@
-DEFINED_PHASES=compile
-DEPEND=dev-lang/go dev-libs/elfutils sys-devel/binutils sys-devel/gcc sys-devel/llvm sys-kernel/linux-headers sys-libs/compiler-rt sys-libs/glibc sys-libs/libcxx sys-libs/libcxxabi sys-libs/llvm-libunwind
-DESCRIPTION=Virtual package for listing toolchain packages. All packages which should be considered part of the toolchain must be directly listed as dependencies of this package. The common features of packages that should be in this virtual are packages that consumed by many other packages (to the point of needing to rebuild a significant chunk of the world to properly test changes) and that don't fit nicely in to Portage's dependency model (for bootstrap problems/circular dependencies/other reasons).
-EAPI=7
-HOMEPAGE=http://dev.chromium.org/chromium-os
-KEYWORDS=*
-LICENSE=BSD-Google
-SLOT=0
-_md5_=59b8b21f0ef0839339dcb61133bfd811
diff --git a/metadata/md5-cache/virtual/toolchain-packages-1-r2 b/metadata/md5-cache/virtual/toolchain-packages-1-r2
new file mode 100644
index 0000000..c9584cb
--- /dev/null
+++ b/metadata/md5-cache/virtual/toolchain-packages-1-r2
@@ -0,0 +1,9 @@
+DEFINED_PHASES=compile
+DEPEND=dev-lang/go dev-lang/rust dev-libs/elfutils sys-devel/binutils sys-devel/gcc sys-devel/llvm sys-kernel/linux-headers sys-libs/compiler-rt sys-libs/glibc sys-libs/libcxx sys-libs/libcxxabi sys-libs/llvm-libunwind
+DESCRIPTION=Virtual package for listing toolchain packages. All packages which should be considered part of the toolchain must be directly listed as dependencies of this package. The common features of packages that should be in this virtual are packages that consumed by many other packages (to the point of needing to rebuild a significant chunk of the world to properly test changes) and that don't fit nicely in to Portage's dependency model (for bootstrap problems/circular dependencies/other reasons).
+EAPI=7
+HOMEPAGE=http://dev.chromium.org/chromium-os
+KEYWORDS=*
+LICENSE=BSD-Google
+SLOT=0
+_md5_=1d2a3e9a57787ef67ca986dc447ee305
diff --git a/metadata/md5-cache/virtual/wpa_supplicant-1 b/metadata/md5-cache/virtual/wpa_supplicant-1
index 5590f80..533dfef 100644
--- a/metadata/md5-cache/virtual/wpa_supplicant-1
+++ b/metadata/md5-cache/virtual/wpa_supplicant-1
@@ -1,8 +1,8 @@
 DEFINED_PHASES=-
-DEPEND=net-wireless/wpa_supplicant-2_8:=[dbus] !net-wireless/wpa_supplicant
+DEPEND=net-wireless/wpa_supplicant-2_9:=[dbus] !net-wireless/wpa_supplicant-2_8 !net-wireless/wpa_supplicant
 DESCRIPTION=Virtual to select between different wpa_supplicant revisions
 EAPI=7
 KEYWORDS=*
-RDEPEND=net-wireless/wpa_supplicant-2_8:=[dbus] !net-wireless/wpa_supplicant
+RDEPEND=net-wireless/wpa_supplicant-2_9:=[dbus] !net-wireless/wpa_supplicant-2_8 !net-wireless/wpa_supplicant
 SLOT=0
-_md5_=b2ae3d0027d5d0f8cd686597dce3736c
+_md5_=03948e6dc8bddb324cd9cd23b0eac43e
diff --git a/metadata/md5-cache/virtual/wpa_supplicant-1-r1 b/metadata/md5-cache/virtual/wpa_supplicant-1-r1
deleted file mode 100644
index 5590f80..0000000
--- a/metadata/md5-cache/virtual/wpa_supplicant-1-r1
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFINED_PHASES=-
-DEPEND=net-wireless/wpa_supplicant-2_8:=[dbus] !net-wireless/wpa_supplicant
-DESCRIPTION=Virtual to select between different wpa_supplicant revisions
-EAPI=7
-KEYWORDS=*
-RDEPEND=net-wireless/wpa_supplicant-2_8:=[dbus] !net-wireless/wpa_supplicant
-SLOT=0
-_md5_=b2ae3d0027d5d0f8cd686597dce3736c
diff --git a/metadata/md5-cache/virtual/wpa_supplicant-1-r2 b/metadata/md5-cache/virtual/wpa_supplicant-1-r2
new file mode 100644
index 0000000..533dfef
--- /dev/null
+++ b/metadata/md5-cache/virtual/wpa_supplicant-1-r2
@@ -0,0 +1,8 @@
+DEFINED_PHASES=-
+DEPEND=net-wireless/wpa_supplicant-2_9:=[dbus] !net-wireless/wpa_supplicant-2_8 !net-wireless/wpa_supplicant
+DESCRIPTION=Virtual to select between different wpa_supplicant revisions
+EAPI=7
+KEYWORDS=*
+RDEPEND=net-wireless/wpa_supplicant-2_9:=[dbus] !net-wireless/wpa_supplicant-2_8 !net-wireless/wpa_supplicant
+SLOT=0
+_md5_=03948e6dc8bddb324cd9cd23b0eac43e
diff --git a/metadata/md5-cache/www-apache/mod_wsgi-3.4 b/metadata/md5-cache/www-apache/mod_wsgi-3.4
index 06023344..653d56b 100644
--- a/metadata/md5-cache/www-apache/mod_wsgi-3.4
+++ b/metadata/md5-cache/www-apache/mod_wsgi-3.4
@@ -3,11 +3,11 @@
 DESCRIPTION=An Apache2 module for running Python WSGI applications.
 EAPI=5
 HOMEPAGE=http://code.google.com/p/modwsgi/
-IUSE=python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=Apache-2.0
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] =www-servers/apache-2*
+RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) =www-servers/apache-2*
 SLOT=0
 SRC_URI=http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
-_eclasses_=apache-module	5c4c90da2d68c2dc8391666824f1293c	autotools	d0e5375d47f4c809f406eb892e531513	depend.apache	a471783c63e68987a2b20eb46f9edf68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=apache-module	5c4c90da2d68c2dc8391666824f1293c	autotools	d0e5375d47f4c809f406eb892e531513	depend.apache	a471783c63e68987a2b20eb46f9edf68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6120ee64f83821663a294827ba6f290d
diff --git a/metadata/md5-cache/www-apache/mod_wsgi-3.4-r5 b/metadata/md5-cache/www-apache/mod_wsgi-3.4-r5
index 06023344..653d56b 100644
--- a/metadata/md5-cache/www-apache/mod_wsgi-3.4-r5
+++ b/metadata/md5-cache/www-apache/mod_wsgi-3.4-r5
@@ -3,11 +3,11 @@
 DESCRIPTION=An Apache2 module for running Python WSGI applications.
 EAPI=5
 HOMEPAGE=http://code.google.com/p/modwsgi/
-IUSE=python_targets_python2_7 python_targets_python3_6 python_single_target_python2_7 python_single_target_python3_6
+IUSE=python_single_target_python2_7 python_single_target_python3_6
 KEYWORDS=*
 LICENSE=Apache-2.0
-RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_pypy3(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),python_single_target_python2_7(+)?,python_single_target_python3_6(+)?] =www-servers/apache-2*
+RDEPEND=python_single_target_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads] >=dev-lang/python-exec-2:=[python_targets_python2_7] ) python_single_target_python3_6? ( dev-lang/python:3.6[threads] >=dev-lang/python-exec-2:=[python_targets_python3_6] ) =www-servers/apache-2*
 SLOT=0
 SRC_URI=http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
-_eclasses_=apache-module	5c4c90da2d68c2dc8391666824f1293c	autotools	d0e5375d47f4c809f406eb892e531513	depend.apache	a471783c63e68987a2b20eb46f9edf68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	75ce0f715133825e020f9777032d1376	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=apache-module	5c4c90da2d68c2dc8391666824f1293c	autotools	d0e5375d47f4c809f406eb892e531513	depend.apache	a471783c63e68987a2b20eb46f9edf68	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	python-single-r1	674c48c926cbb44e91b656e0399d8f54	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=6120ee64f83821663a294827ba6f290d
diff --git a/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25 b/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25
deleted file mode 100644
index 4ed1e68..0000000
--- a/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25
+++ /dev/null
@@ -1,16 +0,0 @@
-BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind ) doc? ( >=dev-util/gtk-doc-1.25-r1 ) man? ( dev-python/docutils ) overlay? ( >=dev-util/peg-0.1.18 x11-base/xorg-proto ) video_cards_intel? ( sys-devel/bison sys-devel/flex )
-DESCRIPTION=Intel GPU userland tools
-EAPI=7
-HOMEPAGE=https://01.org/linuxgraphics https://gitlab.freedesktop.org/drm/igt-gpu-tools
-IUSE=chamelium doc man overlay runner tests unwind valgrind video_cards_amdgpu video_cards_intel video_cards_nouveau X xv
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind )
-REQUIRED_USE=|| ( video_cards_amdgpu video_cards_intel video_cards_nouveau ) overlay? ( video_cards_intel || ( X xv ) ) doc? ( tests )
-RESTRICT=test
-SLOT=0
-SRC_URI=https://www.x.org/releases/individual/app/igt-gpu-tools-1.25.tar.xz
-_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c5b66a8afeebd25764549ac7b7861dd2
diff --git a/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25-r1 b/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25-r1
new file mode 100644
index 0000000..0b93cd5
--- /dev/null
+++ b/metadata/md5-cache/x11-apps/igt-gpu-tools-1.25-r1
@@ -0,0 +1,17 @@
+BDEPEND=>=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind ) doc? ( >=dev-util/gtk-doc-1.25-r1 ) man? ( dev-python/docutils ) overlay? ( >=dev-util/peg-0.1.18 x11-base/xorg-proto ) video_cards_intel? ( sys-devel/bison sys-devel/flex )
+DESCRIPTION=Intel GPU userland tools
+EAPI=7
+HOMEPAGE=https://01.org/linuxgraphics https://gitlab.freedesktop.org/drm/igt-gpu-tools
+IUSE=chamelium doc man overlay runner tests unwind valgrind video_cards_amdgpu video_cards_intel video_cards_nouveau X xv cros_host cros_workon_tree_3aff21700e194b385c800f63c88e8a381763ecce
+KEYWORDS=*
+LICENSE=MIT
+PROPERTIES=live
+RDEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind )
+REQUIRED_USE=|| ( video_cards_amdgpu video_cards_intel video_cards_nouveau ) overlay? ( video_cards_intel || ( X xv ) ) doc? ( tests )
+RESTRICT=test
+SLOT=0
+SRC_URI=https://www.x.org/releases/individual/app/igt-gpu-tools-1.25.tar.xz
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3d2bfe31f48f3627273593485a37586d
diff --git a/metadata/md5-cache/x11-apps/igt-gpu-tools-9999 b/metadata/md5-cache/x11-apps/igt-gpu-tools-9999
new file mode 100644
index 0000000..9710563
--- /dev/null
+++ b/metadata/md5-cache/x11-apps/igt-gpu-tools-9999
@@ -0,0 +1,16 @@
+BDEPEND=>=dev-vcs/git-1.8.2.1[curl] >=dev-util/meson-0.48.2 >=dev-util/ninja-1.7.2 dev-vcs/git
+DEFINED_PHASES=compile configure info install prepare setup test unpack
+DEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind ) doc? ( >=dev-util/gtk-doc-1.25-r1 ) man? ( dev-python/docutils ) overlay? ( >=dev-util/peg-0.1.18 x11-base/xorg-proto ) video_cards_intel? ( sys-devel/bison sys-devel/flex )
+DESCRIPTION=Intel GPU userland tools
+EAPI=7
+HOMEPAGE=https://01.org/linuxgraphics https://gitlab.freedesktop.org/drm/igt-gpu-tools
+IUSE=chamelium doc man overlay runner tests unwind valgrind video_cards_amdgpu video_cards_intel video_cards_nouveau X xv cros_host cros_workon_tree_
+KEYWORDS=~*
+LICENSE=MIT
+PROPERTIES=live live
+RDEPEND=dev-libs/elfutils dev-libs/glib:2 sys-apps/kmod:= sys-libs/llvm-libunwind:= sys-libs/zlib:= sys-process/procps:= virtual/libudev:= >=x11-libs/cairo-1.12.0[X?] >=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?] >=x11-libs/libpciaccess-0.10 x11-libs/pixman chamelium? ( dev-libs/xmlrpc-c[curl] sci-libs/gsl media-libs/alsa-lib:= ) overlay? ( >=x11-libs/libXrandr-1.3 xv? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXv ) ) runner? ( dev-libs/json-c:= ) unwind? ( sys-libs/libunwind ) valgrind? ( dev-util/valgrind )
+REQUIRED_USE=|| ( video_cards_amdgpu video_cards_intel video_cards_nouveau ) overlay? ( video_cards_intel || ( X xv ) ) doc? ( tests )
+RESTRICT=test
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	meson	b5ee7a05833ab91225acf30ffdeed006	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=3d2bfe31f48f3627273593485a37586d
diff --git a/metadata/md5-cache/x11-apps/xrandr-1.3.5-r1 b/metadata/md5-cache/x11-apps/xrandr-1.3.5-r1
index f8a45f6..18ef947 100644
--- a/metadata/md5-cache/x11-apps/xrandr-1.3.5-r1
+++ b/metadata/md5-cache/x11-apps/xrandr-1.3.5-r1
@@ -8,5 +8,5 @@
 RDEPEND=>=x11-libs/libXrandr-1.3 x11-libs/libXrender x11-libs/libX11
 SLOT=0
 SRC_URI=http://xorg.freedesktop.org/releases/individual/app/xrandr-1.3.5.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=01b2f750a482dbe5195cdd6bbf84a7ad
diff --git a/metadata/md5-cache/x11-base/xwayland-1.20.8 b/metadata/md5-cache/x11-base/xwayland-1.20.8
index 59d4d84..5004ca9 100644
--- a/metadata/md5-cache/x11-base/xwayland-1.20.8
+++ b/metadata/md5-cache/x11-base/xwayland-1.20.8
@@ -1,13 +1,14 @@
-DEFINED_PHASES=compile configure install postinst postrm prepare test unpack
-DEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3 >=dev-libs/wayland-protocols-1.1 >=sys-kernel/linux-headers-4.4-r16 media-libs/libepoxy >=x11-libs/libdrm-2.4.46 >=x11-libs/libxkbfile-1.0.4 >=x11-libs/xtrans-1.3.5 >=x11-misc/xbitmaps-1.0.1 >=x11-base/xorg-proto-2018.3 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 x86-interix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) virtual/pkgconfig doc? ( doc? ( app-text/asciidoc app-text/xmlto app-doc/doxygen app-text/docbook-xml-dtd:4.1.2 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.3 ) )
+BDEPEND=>=app-portage/elt-patches-20170815 ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 virtual/pkgconfig doc? ( doc? ( || ( app-text/asciidoc dev-ruby/asciidoctor ) app-text/xmlto app-doc/doxygen app-text/docbook-xml-dtd:4.1.2 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.3 ) )
+DEFINED_PHASES=compile configure install postinst postrm prepare unpack
+DEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3 >=dev-libs/wayland-protocols-1.1 >=sys-kernel/linux-headers-4.4-r16 media-libs/libepoxy >=x11-libs/libdrm-2.4.46 >=x11-libs/libxkbfile-1.0.4 >=x11-libs/xtrans-1.3.5 >=x11-misc/xbitmaps-1.0.1 >=x11-base/xorg-proto-2018.3 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=XWayland
-EAPI=5
-HOMEPAGE=http://xorg.freedesktop.org/
+EAPI=7
+HOMEPAGE=https://www.x.org/wiki/ https://gitlab.freedesktop.org/xorg/xserver/xwayland
 IUSE=kvm_guest minimal static-libs doc
 KEYWORDS=*
 LICENSE=MIT
 RDEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3
 SLOT=0/1.20.8
 SRC_URI=https://www.x.org/releases/individual/xserver/xorg-server-1.20.8.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
-_md5_=c8f4cf30a3922322af37e21d87ad24e8
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-3	8cad61092536d3b5fcfc558b8c5d44cc
+_md5_=ccad9e8a3dc8211cdedb1301006e63c6
diff --git a/metadata/md5-cache/x11-base/xwayland-1.20.8-r2 b/metadata/md5-cache/x11-base/xwayland-1.20.8-r2
deleted file mode 100644
index 59d4d84..0000000
--- a/metadata/md5-cache/x11-base/xwayland-1.20.8-r2
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install postinst postrm prepare test unpack
-DEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3 >=dev-libs/wayland-protocols-1.1 >=sys-kernel/linux-headers-4.4-r16 media-libs/libepoxy >=x11-libs/libdrm-2.4.46 >=x11-libs/libxkbfile-1.0.4 >=x11-libs/xtrans-1.3.5 >=x11-misc/xbitmaps-1.0.1 >=x11-base/xorg-proto-2018.3 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 x86-interix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) virtual/pkgconfig doc? ( doc? ( app-text/asciidoc app-text/xmlto app-doc/doxygen app-text/docbook-xml-dtd:4.1.2 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.3 ) )
-DESCRIPTION=XWayland
-EAPI=5
-HOMEPAGE=http://xorg.freedesktop.org/
-IUSE=kvm_guest minimal static-libs doc
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3
-SLOT=0/1.20.8
-SRC_URI=https://www.x.org/releases/individual/xserver/xorg-server-1.20.8.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
-_md5_=c8f4cf30a3922322af37e21d87ad24e8
diff --git a/metadata/md5-cache/x11-base/xwayland-1.20.8-r3 b/metadata/md5-cache/x11-base/xwayland-1.20.8-r3
new file mode 100644
index 0000000..5004ca9
--- /dev/null
+++ b/metadata/md5-cache/x11-base/xwayland-1.20.8-r3
@@ -0,0 +1,14 @@
+BDEPEND=>=app-portage/elt-patches-20170815 ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 virtual/pkgconfig doc? ( doc? ( || ( app-text/asciidoc dev-ruby/asciidoctor ) app-text/xmlto app-doc/doxygen app-text/docbook-xml-dtd:4.1.2 app-text/docbook-xml-dtd:4.2 app-text/docbook-xml-dtd:4.3 ) )
+DEFINED_PHASES=compile configure install postinst postrm prepare unpack
+DEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3 >=dev-libs/wayland-protocols-1.1 >=sys-kernel/linux-headers-4.4-r16 media-libs/libepoxy >=x11-libs/libdrm-2.4.46 >=x11-libs/libxkbfile-1.0.4 >=x11-libs/xtrans-1.3.5 >=x11-misc/xbitmaps-1.0.1 >=x11-base/xorg-proto-2018.3 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=XWayland
+EAPI=7
+HOMEPAGE=https://www.x.org/wiki/ https://gitlab.freedesktop.org/xorg/xserver/xwayland
+IUSE=kvm_guest minimal static-libs doc
+KEYWORDS=*
+LICENSE=MIT
+RDEPEND=!x11-base/xorg-server dev-libs/openssl:0= >=dev-libs/wayland-1.3.0 >=media-libs/mesa-10.3.4-r1 >=x11-libs/libXfont2-2.0.1 >=x11-libs/libxshmfence-1.1 >=x11-libs/pixman-0.27.2 >=x11-misc/xkeyboard-config-2.4.1-r3 >=x11-apps/xkbcomp-1.2.3
+SLOT=0/1.20.8
+SRC_URI=https://www.x.org/releases/individual/xserver/xorg-server-1.20.8.tar.bz2
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-3	8cad61092536d3b5fcfc558b8c5d44cc
+_md5_=ccad9e8a3dc8211cdedb1301006e63c6
diff --git a/metadata/md5-cache/x11-drivers/nvidia-drivers-260.19.36 b/metadata/md5-cache/x11-drivers/nvidia-drivers-260.19.36
index f6f265c..f47bfd6 100644
--- a/metadata/md5-cache/x11-drivers/nvidia-drivers-260.19.36
+++ b/metadata/md5-cache/x11-drivers/nvidia-drivers-260.19.36
@@ -11,5 +11,5 @@
 RESTRICT=strip
 SLOT=0
 SRC_URI=x86? ( http://us.download.nvidia.com/XFree86/Linux-x86/260.19.36/NVIDIA-Linux-x86-260.19.36.run ) amd64? ( http://us.download.nvidia.com/XFree86/Linux-x86_64/260.19.36/NVIDIA-Linux-x86_64-260.19.36.run ) x86-fbsd? ( http://us.download.nvidia.com/XFree86/FreeBSD-x86/260.19.36/NVIDIA-FreeBSD-x86-260.19.36.tar.gz )
-_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	6accc0e19163336db48a3c346993eb16	linux-mod	101302d4b7b694ea9622bbffb187d0de	multilib	2477ebe553d3e4d2c606191fe6c33602	nvidia-driver	f195f64263551aa3c4a9aff69ed97059	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
+_eclasses_=eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	linux-info	327865b9921771330775d971263dc234	linux-mod	101302d4b7b694ea9622bbffb187d0de	multilib	2477ebe553d3e4d2c606191fe6c33602	nvidia-driver	f195f64263551aa3c4a9aff69ed97059	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	user	7c566af8c48023219fd63246e88d6621	versionator	26ca8a8bd95d6a74122c08ba98a4ee72
 _md5_=047e02c1c66b7604bbb952dcae45fb2c
diff --git a/metadata/md5-cache/x11-drivers/opengles-0.0.1-r32 b/metadata/md5-cache/x11-drivers/opengles-0.0.1-r32
index 1aca718..ebd0a25 100644
--- a/metadata/md5-cache/x11-drivers/opengles-0.0.1-r32
+++ b/metadata/md5-cache/x11-drivers/opengles-0.0.1-r32
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=x11-libs/libX11 x11-drivers/opengles-headers
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	scons-utils	988e24b9e2e4642189b4e97c03e5ae71	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	scons-utils	988e24b9e2e4642189b4e97c03e5ae71	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=4762a495c2826ee9e45a925a266ec3fd
diff --git a/metadata/md5-cache/x11-drivers/opengles-9999 b/metadata/md5-cache/x11-drivers/opengles-9999
index d173f2e..f400355 100644
--- a/metadata/md5-cache/x11-drivers/opengles-9999
+++ b/metadata/md5-cache/x11-drivers/opengles-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=x11-libs/libX11 x11-drivers/opengles-headers
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	scons-utils	988e24b9e2e4642189b4e97c03e5ae71	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	scons-utils	988e24b9e2e4642189b4e97c03e5ae71	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=43eddc4dfecfaacb3c76de810213b1fb
diff --git a/metadata/md5-cache/x11-drivers/opengles-headers-0.0.1-r34 b/metadata/md5-cache/x11-drivers/opengles-headers-0.0.1-r34
index d6a1780..8a2475a 100644
--- a/metadata/md5-cache/x11-drivers/opengles-headers-0.0.1-r34
+++ b/metadata/md5-cache/x11-drivers/opengles-headers-0.0.1-r34
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=x11-libs/libX11:=
 SLOT=0/0.0.1-r34
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=b6b4b4324809d332769b8c9569978aac
diff --git a/metadata/md5-cache/x11-drivers/opengles-headers-9999 b/metadata/md5-cache/x11-drivers/opengles-headers-9999
index 1992725..3ac6d85 100644
--- a/metadata/md5-cache/x11-drivers/opengles-headers-9999
+++ b/metadata/md5-cache/x11-drivers/opengles-headers-9999
@@ -10,5 +10,5 @@
 PROPERTIES=live
 RDEPEND=x11-libs/libX11:=
 SLOT=0/9999
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=d9e9668ba4e52985c564555c32dbde54
diff --git a/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r187 b/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r187
deleted file mode 100644
index ebdcc20..0000000
--- a/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r187
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=info install setup unpack
-DEPEND=chromeos-base/gestures chromeos-base/libevdev app-misc/utouch-evemu x11-base/xorg-proto
-DESCRIPTION=Chromium OS multitouch driver regression tests
-EAPI=6
-HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/touchpad-tests
-IUSE=cros_host cros_workon_tree_7a0ac90ce1d88bf661f0dfc6ad457e10e87c6b96
-KEYWORDS=*
-LICENSE=BSD-Google
-PROPERTIES=live
-RDEPEND=chromeos-base/gestures chromeos-base/libevdev app-misc/utouch-evemu x11-base/xorg-proto
-SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=3850f2bc6709ee1cb5ea1e5f1dd77e2a
diff --git a/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r189 b/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r189
new file mode 100644
index 0000000..66e57f1
--- /dev/null
+++ b/metadata/md5-cache/x11-drivers/touchpad-tests-0.0.1-r189
@@ -0,0 +1,13 @@
+DEFINED_PHASES=info install setup unpack
+DEPEND=chromeos-base/gestures chromeos-base/libevdev app-misc/utouch-evemu x11-base/xorg-proto
+DESCRIPTION=Chromium OS multitouch driver regression tests
+EAPI=6
+HOMEPAGE=https://chromium.googlesource.com/chromiumos/platform/touchpad-tests
+IUSE=cros_host cros_workon_tree_8464b117e40af3e33f2bcbe2b9835ebd1fac6365
+KEYWORDS=*
+LICENSE=BSD-Google
+PROPERTIES=live
+RDEPEND=chromeos-base/gestures chromeos-base/libevdev app-misc/utouch-evemu x11-base/xorg-proto
+SLOT=0
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=d9a22e2cf2b1e2a8f955fc264170c2ea
diff --git a/metadata/md5-cache/x11-drivers/touchpad-tests-9999 b/metadata/md5-cache/x11-drivers/touchpad-tests-9999
index c146e7a..df2582e 100644
--- a/metadata/md5-cache/x11-drivers/touchpad-tests-9999
+++ b/metadata/md5-cache/x11-drivers/touchpad-tests-9999
@@ -9,5 +9,5 @@
 PROPERTIES=live
 RDEPEND=chromeos-base/gestures chromeos-base/libevdev app-misc/utouch-evemu x11-base/xorg-proto
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=1c5df92d8a0344a85a0b5517aa903934
diff --git a/metadata/md5-cache/x11-libs/arc-libdrm-2.4.100-r1 b/metadata/md5-cache/x11-libs/arc-libdrm-2.4.100-r1
index c5dbd87..aa56ae1 100644
--- a/metadata/md5-cache/x11-libs/arc-libdrm-2.4.100-r1
+++ b/metadata/md5-cache/x11-libs/arc-libdrm-2.4.100-r1
@@ -11,5 +11,5 @@
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 RESTRICT=test
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=15cc0827d998e46f0fa0d37894634bd0
diff --git a/metadata/md5-cache/x11-libs/arc-libdrm-9999 b/metadata/md5-cache/x11-libs/arc-libdrm-9999
index 45944f2..685ee11 100644
--- a/metadata/md5-cache/x11-libs/arc-libdrm-9999
+++ b/metadata/md5-cache/x11-libs/arc-libdrm-9999
@@ -11,5 +11,5 @@
 REQUIRED_USE=cheets? ( || ( arcpp arcvm ) arcpp? ( ^^ ( android-container-pi ) ) arcvm? ( ^^ ( android-vm-pi android-vm-rvc android-vm-master ) ) ) !cheets? ( !arcpp !arcvm ) !arcpp? ( !android-container-pi ) !arcvm? ( !android-vm-pi !android-vm-rvc !android-vm-master )
 RESTRICT=test
 SLOT=0
-_eclasses_=arc-build	5c7b5f26656c2fcbc0fe4fcaa32d7258	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=arc-build	33b7353a3e50d1167f04d8c92f58ab0a	arc-build-constants	768ca8c606ae1dc2cc9f0fe985959d96	autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=7618f45c8bffaa521386adc3acf159a2
diff --git a/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12 b/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12
index 9e5a1d3..7ccde69 100644
--- a/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12
+++ b/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare test
-DEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) dev-util/glib-utils >=dev-util/gtk-doc-am-1.20 >=sys-devel/gettext-0.19 virtual/pkgconfig >=app-portage/elt-patches-20170815 app-arch/xz-utils >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) dev-util/glib-utils >=dev-util/gtk-doc-am-1.20 >=sys-devel/gettext-0.19 virtual/pkgconfig >=app-portage/elt-patches-20170815 app-arch/xz-utils dev-util/desktop-file-utils x11-misc/shared-mime-info !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Image loading library for GTK+
 EAPI=6
 HOMEPAGE=https://git.gnome.org/browse/gdk-pixbuf
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !<gnome-base/gail-1000 !<gnome-base/librsvg-2.31.0 !<x11-libs/gtk+-2.21.3:2 !<x11-libs/gtk+-2.90.4:3
 SLOT=2
 SRC_URI=mirror://gnome/sources/gdk-pixbuf/2.36/gdk-pixbuf-2.36.12.tar.xz test? ( https://git.gnome.org/browse/gdk-pixbuf/plain/tests/bug753605-atsize.jpg?h=2.36.12 -> gdk-pixbuf-2.36.12-bug753605-atsize.jpg )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=ebd72d42ede3182ae457e123158a048c
diff --git a/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12-r2 b/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12-r2
index 9e5a1d3..7ccde69 100644
--- a/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12-r2
+++ b/metadata/md5-cache/x11-libs/gdk-pixbuf-2.36.12-r2
@@ -1,5 +1,5 @@
 DEFINED_PHASES=compile configure install postinst postrm preinst prepare test
-DEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) dev-util/glib-utils >=dev-util/gtk-doc-am-1.20 >=sys-devel/gettext-0.19 virtual/pkgconfig >=app-portage/elt-patches-20170815 app-arch/xz-utils >=sys-apps/sed-4 dev-util/desktop-file-utils x11-misc/shared-mime-info !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) dev-util/glib-utils >=dev-util/gtk-doc-am-1.20 >=sys-devel/gettext-0.19 virtual/pkgconfig >=app-portage/elt-patches-20170815 app-arch/xz-utils dev-util/desktop-file-utils x11-misc/shared-mime-info !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=Image loading library for GTK+
 EAPI=6
 HOMEPAGE=https://git.gnome.org/browse/gdk-pixbuf
@@ -9,5 +9,5 @@
 RDEPEND=>=dev-libs/glib-2.48.0:2[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] >=media-libs/libpng-1.4:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] introspection? ( >=dev-libs/gobject-introspection-0.9.3:= ) jpeg? ( virtual/jpeg:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) jpeg2k? ( media-libs/jasper:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) tiff? ( >=media-libs/tiff-3.9.2:0=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) X? ( x11-libs/libX11[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) !<gnome-base/gail-1000 !<gnome-base/librsvg-2.31.0 !<x11-libs/gtk+-2.21.3:2 !<x11-libs/gtk+-2.90.4:3
 SLOT=2
 SRC_URI=mirror://gnome/sources/gdk-pixbuf/2.36/gdk-pixbuf-2.36.12.tar.xz test? ( https://git.gnome.org/browse/gdk-pixbuf/plain/tests/bug753605-atsize.jpg?h=2.36.12 -> gdk-pixbuf-2.36.12-bug753605-atsize.jpg )
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	c6060f4ab634aca444c4b2176b0f3877	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	cros-sanitizers	1790470c95f416653a627475b8864394	eapi7-ver	756b3f27d8e46131d5cf3c51bd876446	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	gnome.org	532d56d07b9eace4831aaa817d2b756a	gnome2	acac536f2c3bbcd312ac3faaa3e55e40	gnome2-utils	893e828f0f25f070f0b38d20c83c7670	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg	c7ba313ea1eaf266f95cc6235f7d6a07	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
 _md5_=ebd72d42ede3182ae457e123158a048c
diff --git a/metadata/md5-cache/x11-libs/libXfont-1.4.4-r1 b/metadata/md5-cache/x11-libs/libXfont-1.4.4-r1
index 911aaf4..d8de059 100644
--- a/metadata/md5-cache/x11-libs/libXfont-1.4.4-r1
+++ b/metadata/md5-cache/x11-libs/libXfont-1.4.4-r1
@@ -9,5 +9,5 @@
 RDEPEND=x11-libs/xtrans x11-libs/libfontenc >=media-libs/freetype-2 app-arch/bzip2 x11-proto/xproto x11-proto/fontsproto
 SLOT=0
 SRC_URI=http://xorg.freedesktop.org/releases/individual/lib/libXfont-1.4.4.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=5f7052254fc316c4b360f288a8acd2d5
diff --git a/metadata/md5-cache/x11-libs/libXft-2.3.1 b/metadata/md5-cache/x11-libs/libXft-2.3.1
index ab2d8da..21d8e57 100644
--- a/metadata/md5-cache/x11-libs/libXft-2.3.1
+++ b/metadata/md5-cache/x11-libs/libXft-2.3.1
@@ -9,5 +9,5 @@
 RDEPEND=>=x11-libs/libXrender-0.8.2 x11-libs/libX11 x11-libs/libXext media-libs/freetype media-libs/fontconfig x11-proto/xproto
 SLOT=0
 SRC_URI=http://xorg.freedesktop.org/releases/individual/lib/libXft-2.3.1.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=c8a8da550a30e66d68f9173662d9521d
diff --git a/metadata/md5-cache/x11-libs/libXft-2.3.1-r1 b/metadata/md5-cache/x11-libs/libXft-2.3.1-r1
index ab2d8da..21d8e57 100644
--- a/metadata/md5-cache/x11-libs/libXft-2.3.1-r1
+++ b/metadata/md5-cache/x11-libs/libXft-2.3.1-r1
@@ -9,5 +9,5 @@
 RDEPEND=>=x11-libs/libXrender-0.8.2 x11-libs/libX11 x11-libs/libXext media-libs/freetype media-libs/fontconfig x11-proto/xproto
 SLOT=0
 SRC_URI=http://xorg.freedesktop.org/releases/individual/lib/libXft-2.3.1.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=c8a8da550a30e66d68f9173662d9521d
diff --git a/metadata/md5-cache/x11-libs/libdrm-2.4.100-r3 b/metadata/md5-cache/x11-libs/libdrm-2.4.100-r3
deleted file mode 100644
index da2aa7d..0000000
--- a/metadata/md5-cache/x11-libs/libdrm-2.4.100-r3
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure info install postinst postrm prepare setup test unpack
-DEPEND=dev-libs/libpthread-stubs udev? ( virtual/udev ) video_cards_amdgpu? ( dev-util/cunit ) video_cards_intel? ( >=x11-libs/libpciaccess-0.10 ) !<x11-libs/libdrm-tests-2.4.58-r3 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 x86-interix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) virtual/pkgconfig
-DESCRIPTION=X.Org libdrm library
-EAPI=5
-HOMEPAGE=http://dri.freedesktop.org/
-IUSE=video_cards_amdgpu video_cards_exynos video_cards_freedreno video_cards_intel video_cards_nouveau video_cards_omap video_cards_radeon video_cards_vc4 video_cards_vmware libkms manpages +udev static-libs cros_host cros_workon_tree_f691fb10ddd5ffefb25682ff89f6f978fe91ec02
-KEYWORDS=*
-LICENSE=|| ( MIT X )
-PROPERTIES=live
-RDEPEND=dev-libs/libpthread-stubs udev? ( virtual/udev ) video_cards_amdgpu? ( dev-util/cunit ) video_cards_intel? ( >=x11-libs/libpciaccess-0.10 ) !<x11-libs/libdrm-tests-2.4.58-r3
-REQUIRED_USE=video_cards_exynos? ( libkms )
-RESTRICT=test
-SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
-_md5_=751e797bda3d839a54e319c329b5b9be
diff --git a/metadata/md5-cache/x11-libs/libdrm-2.4.100-r4 b/metadata/md5-cache/x11-libs/libdrm-2.4.100-r4
new file mode 100644
index 0000000..ca5340f
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libdrm-2.4.100-r4
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure info install postinst postrm prepare setup test unpack
+DEPEND=dev-libs/libpthread-stubs udev? ( virtual/udev ) video_cards_amdgpu? ( dev-util/cunit ) video_cards_intel? ( >=x11-libs/libpciaccess-0.10 ) !<x11-libs/libdrm-tests-2.4.58-r3 >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4 x86-interix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) ppc-aix? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) x86-winnt? ( >=sys-devel/libtool-2.2.6a sys-devel/m4 >=x11-misc/util-macros-1.18 >=media-fonts/font-util-1.2.0 ) virtual/pkgconfig
+DESCRIPTION=X.Org libdrm library
+EAPI=5
+HOMEPAGE=http://dri.freedesktop.org/
+IUSE=video_cards_amdgpu video_cards_exynos video_cards_freedreno video_cards_intel video_cards_nouveau video_cards_omap video_cards_radeon video_cards_vc4 video_cards_vmware libkms manpages +udev static-libs cros_host cros_workon_tree_f691fb10ddd5ffefb25682ff89f6f978fe91ec02
+KEYWORDS=*
+LICENSE=|| ( MIT X )
+PROPERTIES=live
+RDEPEND=dev-libs/libpthread-stubs udev? ( virtual/udev ) video_cards_amdgpu? ( dev-util/cunit ) video_cards_intel? ( >=x11-libs/libpciaccess-0.10 ) !<x11-libs/libdrm-tests-2.4.58-r3
+REQUIRED_USE=video_cards_exynos? ( libkms )
+RESTRICT=test
+SLOT=0
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_md5_=0356273cebb5fc6e57b6ebf47de6ad6d
diff --git a/metadata/md5-cache/x11-libs/libdrm-9999 b/metadata/md5-cache/x11-libs/libdrm-9999
index 7642ad5..ce1631f 100644
--- a/metadata/md5-cache/x11-libs/libdrm-9999
+++ b/metadata/md5-cache/x11-libs/libdrm-9999
@@ -11,5 +11,5 @@
 REQUIRED_USE=video_cards_exynos? ( libkms )
 RESTRICT=test
 SLOT=0
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
-_md5_=70402c52a3128ffed79ec956763ef83b
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	git-r3	c8f4649ab5a3c07ee2b75b12bc446f6a	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_md5_=436e024e0a0eb01eacbae0c7a232f145
diff --git a/metadata/md5-cache/x11-libs/libpciaccess-0.12.902-r2 b/metadata/md5-cache/x11-libs/libpciaccess-0.12.902-r2
index eea9797..a1a5ebb 100644
--- a/metadata/md5-cache/x11-libs/libpciaccess-0.12.902-r2
+++ b/metadata/md5-cache/x11-libs/libpciaccess-0.12.902-r2
@@ -9,5 +9,5 @@
 RDEPEND=!<x11-base/xorg-server-1.5 zlib? ( sys-libs/zlib )
 SLOT=0
 SRC_URI=http://xorg.freedesktop.org/releases/individual/lib/libpciaccess-0.12.902.tar.bz2
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=918700521a873a5baf731d974e0b6c69
diff --git a/metadata/md5-cache/x11-libs/libva-2.6.0 b/metadata/md5-cache/x11-libs/libva-2.6.0
deleted file mode 100644
index 4de2633..0000000
--- a/metadata/md5-cache/x11-libs/libva-2.6.0
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libdrm-2.4.46 X? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXfixes ) opengl? ( >=virtual/opengl-7.0-r1 ) wayland? ( >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Video Acceleration (VA) API for Linux
-EAPI=5
-HOMEPAGE=https://01.org/linuxmedia/vaapi
-IUSE=+drm egl opengl vdpau wayland X utils video_cards_amdgpu video_cards_fglrx video_cards_intel video_cards_i965 video_cards_iHD video_cards_nouveau video_cards_nvidia abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=MIT
-PDEPEND=video_cards_nvidia? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 ) vdpau? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 ) video_cards_amdgpu? ( virtual/opengles ) video_cards_fglrx? ( || ( >=x11-drivers/ati-drivers-14.12-r3 >=x11-libs/xvba-video-0.8.0-r1 ) ) video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-19.4.0 ) video_cards_intel? ( !video_cards_iHD? ( ~x11-libs/libva-intel-driver-2.3.0 ) ) video_cards_i965? ( ~x11-libs/libva-intel-driver-2.3.0 ) utils? ( media-video/libva-utils )
-RDEPEND=>=x11-libs/libdrm-2.4.46 X? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXfixes ) opengl? ( >=virtual/opengl-7.0-r1 ) wayland? ( >=dev-libs/wayland-1.0.6 )
-REQUIRED_USE=|| ( drm wayland X ) opengl? ( X )
-SLOT=0
-SRC_URI=https://github.com/intel/libva/archive/2.6.0.tar.gz -> libva-2.6.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c1410eb781e39ca5abeb0f45d03b55f1
diff --git a/metadata/md5-cache/x11-libs/libva-2.6.0-r4 b/metadata/md5-cache/x11-libs/libva-2.6.0-r4
deleted file mode 100644
index 4de2633..0000000
--- a/metadata/md5-cache/x11-libs/libva-2.6.0-r4
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libdrm-2.4.46 X? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXfixes ) opengl? ( >=virtual/opengl-7.0-r1 ) wayland? ( >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=Video Acceleration (VA) API for Linux
-EAPI=5
-HOMEPAGE=https://01.org/linuxmedia/vaapi
-IUSE=+drm egl opengl vdpau wayland X utils video_cards_amdgpu video_cards_fglrx video_cards_intel video_cards_i965 video_cards_iHD video_cards_nouveau video_cards_nvidia abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=MIT
-PDEPEND=video_cards_nvidia? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 ) vdpau? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 ) video_cards_amdgpu? ( virtual/opengles ) video_cards_fglrx? ( || ( >=x11-drivers/ati-drivers-14.12-r3 >=x11-libs/xvba-video-0.8.0-r1 ) ) video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-19.4.0 ) video_cards_intel? ( !video_cards_iHD? ( ~x11-libs/libva-intel-driver-2.3.0 ) ) video_cards_i965? ( ~x11-libs/libva-intel-driver-2.3.0 ) utils? ( media-video/libva-utils )
-RDEPEND=>=x11-libs/libdrm-2.4.46 X? ( x11-libs/libX11 x11-libs/libXext x11-libs/libXfixes ) opengl? ( >=virtual/opengl-7.0-r1 ) wayland? ( >=dev-libs/wayland-1.0.6 )
-REQUIRED_USE=|| ( drm wayland X ) opengl? ( X )
-SLOT=0
-SRC_URI=https://github.com/intel/libva/archive/2.6.0.tar.gz -> libva-2.6.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=c1410eb781e39ca5abeb0f45d03b55f1
diff --git a/metadata/md5-cache/x11-libs/libva-2.8.0 b/metadata/md5-cache/x11-libs/libva-2.8.0
new file mode 100644
index 0000000..32e072b
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libva-2.8.0
@@ -0,0 +1,15 @@
+BDEPEND=virtual/pkgconfig
+DEFINED_PHASES=compile configure install test
+DEPEND=>=x11-libs/libdrm-2.4.46[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=Video Acceleration (VA) API for Linux
+EAPI=7
+HOMEPAGE=https://01.org/linuxmedia/vaapi
+IUSE=utils video_cards_intel video_cards_amdgpu video_cards_iHD abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=MIT
+PDEPEND=video_cards_intel? ( !video_cards_iHD? ( >=x11-libs/libva-intel-driver-2.0.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-20.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( virtual/opengles[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) utils? ( media-video/libva-utils )
+RDEPEND=>=x11-libs/libdrm-2.4.46[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+SLOT=0/2
+SRC_URI=https://github.com/intel/libva/releases/download/2.8.0/libva-2.8.0.tar.bz2
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c8dc216aad5fe57f34ed39f7e6b4f43b
diff --git a/metadata/md5-cache/x11-libs/libva-2.8.0-r2 b/metadata/md5-cache/x11-libs/libva-2.8.0-r2
new file mode 100644
index 0000000..32e072b
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libva-2.8.0-r2
@@ -0,0 +1,15 @@
+BDEPEND=virtual/pkgconfig
+DEFINED_PHASES=compile configure install test
+DEPEND=>=x11-libs/libdrm-2.4.46[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+DESCRIPTION=Video Acceleration (VA) API for Linux
+EAPI=7
+HOMEPAGE=https://01.org/linuxmedia/vaapi
+IUSE=utils video_cards_intel video_cards_amdgpu video_cards_iHD abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=MIT
+PDEPEND=video_cards_intel? ( !video_cards_iHD? ( >=x11-libs/libva-intel-driver-2.0.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) ) video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-20.2.0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) video_cards_amdgpu? ( virtual/opengles[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?] ) utils? ( media-video/libva-utils )
+RDEPEND=>=x11-libs/libdrm-2.4.46[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?]
+SLOT=0/2
+SRC_URI=https://github.com/intel/libva/releases/download/2.8.0/libva-2.8.0.tar.bz2
+_eclasses_=eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=c8dc216aad5fe57f34ed39f7e6b4f43b
diff --git a/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0 b/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0
index 24d2d9c..8ec0490 100644
--- a/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0
+++ b/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0
@@ -1,13 +1,13 @@
 DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libva-2.1.0[X?,wayland?,drm?] >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) wayland? ( >=media-libs/mesa-9.1.6[egl] >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
 DESCRIPTION=HW video decode support for Intel integrated graphics
 EAPI=5
 HOMEPAGE=https://github.com/intel/intel-vaapi-driver
-IUSE=+drm wayland X hybrid_codec abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+IUSE=hybrid_codec abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
 KEYWORDS=*
 LICENSE=MIT
-RDEPEND=>=x11-libs/libva-2.1.0[X?,wayland?,drm?] >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) wayland? ( >=media-libs/mesa-9.1.6[egl] >=dev-libs/wayland-1.0.6 )
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver )
 SLOT=0
 SRC_URI=https://github.com/intel/intel-vaapi-driver/archive/2.3.0.tar.gz -> libva-intel-driver-2.3.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=daa47660f58fb33b6a42da721aa43c18
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9c94ace20c5a95ebfdca4f8f74475b80
diff --git a/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r7 b/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r7
deleted file mode 100644
index 24d2d9c..0000000
--- a/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r7
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=x11-libs/libva-2.1.0[X?,wayland?,drm?] >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) wayland? ( >=media-libs/mesa-9.1.6[egl] >=dev-libs/wayland-1.0.6 ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
-DESCRIPTION=HW video decode support for Intel integrated graphics
-EAPI=5
-HOMEPAGE=https://github.com/intel/intel-vaapi-driver
-IUSE=+drm wayland X hybrid_codec abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=>=x11-libs/libva-2.1.0[X?,wayland?,drm?] >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) wayland? ( >=media-libs/mesa-9.1.6[egl] >=dev-libs/wayland-1.0.6 )
-SLOT=0
-SRC_URI=https://github.com/intel/intel-vaapi-driver/archive/2.3.0.tar.gz -> libva-intel-driver-2.3.0.tar.gz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
-_md5_=daa47660f58fb33b6a42da721aa43c18
diff --git a/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r9 b/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r9
new file mode 100644
index 0000000..8ec0490
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libva-intel-driver-2.3.0-r9
@@ -0,0 +1,13 @@
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver ) virtual/pkgconfig >=app-portage/elt-patches-20170815 !<sys-devel/gettext-0.18.1.1-r3 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) >=sys-devel/autoconf-2.69 >=sys-devel/libtool-2.4
+DESCRIPTION=HW video decode support for Intel integrated graphics
+EAPI=5
+HOMEPAGE=https://github.com/intel/intel-vaapi-driver
+IUSE=hybrid_codec abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_ppc_32 abi_ppc_64 abi_s390_32 abi_s390_64 abi_arm_32 abi_arm_64
+KEYWORDS=*
+LICENSE=MIT
+RDEPEND=>=x11-libs/libva-2.1.0 >=x11-libs/libdrm-2.4.46[video_cards_intel] hybrid_codec? ( media-libs/intel-hybrid-driver )
+SLOT=0
+SRC_URI=https://github.com/intel/intel-vaapi-driver/archive/2.3.0.tar.gz -> libva-intel-driver-2.3.0.tar.gz
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_md5_=9c94ace20c5a95ebfdca4f8f74475b80
diff --git a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0 b/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0
deleted file mode 100644
index 5b2b44a..0000000
--- a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10 sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel Media Driver for VAAPI (iHD)
-EAPI=6
-HOMEPAGE=https://github.com/intel/media-driver
-IUSE=ihd_cmrtlib
-KEYWORDS=*
-LICENSE=MIT BSD
-RDEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10
-SLOT=0
-SRC_URI=https://github.com/intel/media-driver/archive/intel-media-19.4.0r.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=02891fc36a5b19b0347ce43fd90196a7
diff --git a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r15 b/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r15
deleted file mode 100644
index 5b2b44a..0000000
--- a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r15
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10 sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel Media Driver for VAAPI (iHD)
-EAPI=6
-HOMEPAGE=https://github.com/intel/media-driver
-IUSE=ihd_cmrtlib
-KEYWORDS=*
-LICENSE=MIT BSD
-RDEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10
-SLOT=0
-SRC_URI=https://github.com/intel/media-driver/archive/intel-media-19.4.0r.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=02891fc36a5b19b0347ce43fd90196a7
diff --git a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r16 b/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r16
deleted file mode 100644
index 5b2b44a..0000000
--- a/metadata/md5-cache/x11-libs/libva-intel-media-driver-19.4.0-r16
+++ /dev/null
@@ -1,13 +0,0 @@
-DEFINED_PHASES=compile configure install prepare test
-DEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10 sys-devel/make >=dev-util/cmake-3.9.6
-DESCRIPTION=Intel Media Driver for VAAPI (iHD)
-EAPI=6
-HOMEPAGE=https://github.com/intel/media-driver
-IUSE=ihd_cmrtlib
-KEYWORDS=*
-LICENSE=MIT BSD
-RDEPEND=>=media-libs/gmmlib-19.4.1 >=x11-libs/libva-2.6.0 >=x11-libs/libpciaccess-0.10
-SLOT=0
-SRC_URI=https://github.com/intel/media-driver/archive/intel-media-19.4.0r.tar.gz
-_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
-_md5_=02891fc36a5b19b0347ce43fd90196a7
diff --git a/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0 b/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0
new file mode 100644
index 0000000..0106b41
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0
@@ -0,0 +1,14 @@
+BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=>=media-libs/gmmlib-20.2.0 >=x11-libs/libva-2.8.0 >=x11-libs/libpciaccess-0.10:=
+DESCRIPTION=Intel Media Driver for VAAPI (iHD)
+EAPI=7
+HOMEPAGE=https://github.com/intel/media-driver
+IUSE=ihd_cmrtlib
+KEYWORDS=*
+LICENSE=MIT BSD
+RDEPEND=>=media-libs/gmmlib-20.2.0 >=x11-libs/libva-2.8.0 >=x11-libs/libpciaccess-0.10:=
+SLOT=0
+SRC_URI=https://github.com/intel/media-driver/archive/intel-media-20.2.0.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=f7ef3e05fcce8cfd8739225eb61eb75b
diff --git a/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0-r9 b/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0-r9
new file mode 100644
index 0000000..0106b41
--- /dev/null
+++ b/metadata/md5-cache/x11-libs/libva-intel-media-driver-20.2.0-r9
@@ -0,0 +1,14 @@
+BDEPEND=dev-util/ninja >=dev-util/cmake-3.9.6
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=>=media-libs/gmmlib-20.2.0 >=x11-libs/libva-2.8.0 >=x11-libs/libpciaccess-0.10:=
+DESCRIPTION=Intel Media Driver for VAAPI (iHD)
+EAPI=7
+HOMEPAGE=https://github.com/intel/media-driver
+IUSE=ihd_cmrtlib
+KEYWORDS=*
+LICENSE=MIT BSD
+RDEPEND=>=media-libs/gmmlib-20.2.0 >=x11-libs/libva-2.8.0 >=x11-libs/libpciaccess-0.10:=
+SLOT=0
+SRC_URI=https://github.com/intel/media-driver/archive/intel-media-20.2.0.tar.gz
+_eclasses_=cmake-utils	91d6ef31dc426240577497cacbf2508c	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	ninja-utils	132cbb376048d079b5a012f5467c4e7f	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=f7ef3e05fcce8cfd8739225eb61eb75b
diff --git a/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2 b/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2
index 69e6f33..f64f72be 100644
--- a/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2
+++ b/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2
@@ -9,5 +9,5 @@
 RDEPEND=X? ( >=x11-libs/libxcb-1.10[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,xkb] ) abi_x86_32? ( !app-emulation/emul-linux-x86-xlibs[-abi_x86_32(-)] )
 SLOT=0
 SRC_URI=https://xkbcommon.org/download/libxkbcommon-0.8.2.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=4c6af42c36f032a566ef2d35f8188559
diff --git a/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2-r1 b/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2-r1
index 69e6f33..f64f72be 100644
--- a/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2-r1
+++ b/metadata/md5-cache/x11-libs/libxkbcommon-0.8.2-r1
@@ -9,5 +9,5 @@
 RDEPEND=X? ( >=x11-libs/libxcb-1.10[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s390_64(-)?,abi_arm_32(-)?,abi_arm_64(-)?,xkb] ) abi_x86_32? ( !app-emulation/emul-linux-x86-xlibs[-abi_x86_32(-)] )
 SLOT=0
 SRC_URI=https://xkbcommon.org/download/libxkbcommon-0.8.2.tar.xz
-_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	3727db64c7b960903d5033280f108080	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
+_eclasses_=autotools	d0e5375d47f4c809f406eb892e531513	autotools-multilib	037c4046d25f29e78dd44dccabd5d66b	autotools-utils	95db0904ad0f62535e18e5ccb67cce5e	epatch	8233751dc5105a6ae8fcd86ce2bb0247	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	libtool	f143db5a74ccd9ca28c1234deffede96	ltprune	2770eed66a9b8ef944714cd0e968182e	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multilib-build	1979aa0ff4d356d32507ca4650d9f37d	multilib-minimal	8bddda43703ba94d8341f4e247f97566	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a	xorg-2	50dd640df6d0554c259daa81531ed3ee
 _md5_=4c6af42c36f032a566ef2d35f8188559
diff --git a/metadata/md5-cache/x11-misc/xkeyboard-config-2.27 b/metadata/md5-cache/x11-misc/xkeyboard-config-2.27
index bf12094..8a957c1 100644
--- a/metadata/md5-cache/x11-misc/xkeyboard-config-2.27
+++ b/metadata/md5-cache/x11-misc/xkeyboard-config-2.27
@@ -9,4 +9,4 @@
 RDEPEND=cros_host? ( !<x11-apps/xkbcomp-1.2.3 ) !<x11-libs/libX11-1.4.3
 SLOT=0
 SRC_URI=/data/xkeyboard-config/xkeyboard-config-2.27.tar.bz2
-_md5_=5d8892c1e8b23362de42aa6d25a96853
+_md5_=742c457218281f57668d021fa4f2a3f4
diff --git a/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r10 b/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r10
new file mode 100644
index 0000000..8a957c1
--- /dev/null
+++ b/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r10
@@ -0,0 +1,12 @@
+DEFINED_PHASES=configure prepare
+DEPEND=dev-util/intltool sys-devel/gettext virtual/pkgconfig
+DESCRIPTION=X keyboard configuration database
+EAPI=6
+HOMEPAGE=https://www.freedesktop.org/wiki/Software/XKeyboardConfig https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
+IUSE=cros_host
+KEYWORDS=*
+LICENSE=MIT
+RDEPEND=cros_host? ( !<x11-apps/xkbcomp-1.2.3 ) !<x11-libs/libX11-1.4.3
+SLOT=0
+SRC_URI=/data/xkeyboard-config/xkeyboard-config-2.27.tar.bz2
+_md5_=742c457218281f57668d021fa4f2a3f4
diff --git a/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r9 b/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r9
deleted file mode 100644
index bf12094..0000000
--- a/metadata/md5-cache/x11-misc/xkeyboard-config-2.27-r9
+++ /dev/null
@@ -1,12 +0,0 @@
-DEFINED_PHASES=configure prepare
-DEPEND=dev-util/intltool sys-devel/gettext virtual/pkgconfig
-DESCRIPTION=X keyboard configuration database
-EAPI=6
-HOMEPAGE=https://www.freedesktop.org/wiki/Software/XKeyboardConfig https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
-IUSE=cros_host
-KEYWORDS=*
-LICENSE=MIT
-RDEPEND=cros_host? ( !<x11-apps/xkbcomp-1.2.3 ) !<x11-libs/libX11-1.4.3
-SLOT=0
-SRC_URI=/data/xkeyboard-config/xkeyboard-config-2.27.tar.bz2
-_md5_=5d8892c1e8b23362de42aa6d25a96853
diff --git a/metadata/md5-cache/x11-themes/cros-adapta-0.0.1-r32 b/metadata/md5-cache/x11-themes/cros-adapta-0.0.1-r32
index 95dcf92..1f20622 100644
--- a/metadata/md5-cache/x11-themes/cros-adapta-0.0.1-r32
+++ b/metadata/md5-cache/x11-themes/cros-adapta-0.0.1-r32
@@ -7,5 +7,5 @@
 LICENSE=GPL-2 CC-BY-4.0
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=69d1c1fbe765c4c62493884d50b8fabe
diff --git a/metadata/md5-cache/x11-themes/cros-adapta-9999 b/metadata/md5-cache/x11-themes/cros-adapta-9999
index a75a62a..8d7c732 100644
--- a/metadata/md5-cache/x11-themes/cros-adapta-9999
+++ b/metadata/md5-cache/x11-themes/cros-adapta-9999
@@ -7,5 +7,5 @@
 LICENSE=GPL-2 CC-BY-4.0
 PROPERTIES=live
 SLOT=0
-_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	ff9970684d10d2d8723e60d6060d5068	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
+_eclasses_=cros-constants	bf71cd1168b6441b64a8cdbc06c36eda	cros-credentials	4fd98ebbff6a1534ca9a89547e13dc92	cros-workon	212b86ee95c1edffe51e7a643c301998	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	git-2	d6a1d7d3b4c4fff2fba86e3f53beeb0f	multilib	2477ebe553d3e4d2c606191fe6c33602	toolchain-funcs	2237e0dad80252483b9faa240a43ce2a
 _md5_=08ccdaf7863bba37ec96d0d3d54c119a
diff --git a/net-analyzer/nmap/nmap-7.70-r2.ebuild b/net-analyzer/nmap/nmap-7.70-r3.ebuild
similarity index 100%
rename from net-analyzer/nmap/nmap-7.70-r2.ebuild
rename to net-analyzer/nmap/nmap-7.70-r3.ebuild
diff --git a/net-analyzer/nmap/nmap-7.70.ebuild b/net-analyzer/nmap/nmap-7.70.ebuild
index fab7a31..0fe49ec 100644
--- a/net-analyzer/nmap/nmap-7.70.ebuild
+++ b/net-analyzer/nmap/nmap-7.70.ebuild
@@ -49,7 +49,7 @@
 	)
 	system-lua? ( >=dev-lang/lua-5.2:*[deprecated] )
 	zenmap? (
-		dev-python/pygtk:2[${PYTHON_USEDEP}]
+		$(python_gen_cond_dep 'dev-python/pygtk:2[${PYTHON_USEDEP}]')
 		${PYTHON_DEPS}
 	)
 "
diff --git a/net-dns/avahi/OWNERS b/net-dns/avahi/OWNERS
new file mode 100644
index 0000000..83094d8
--- /dev/null
+++ b/net-dns/avahi/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/p2p/OWNERS
diff --git a/net-fs/samba/Manifest b/net-fs/samba/Manifest
index 8c9ebbf..a467083 100644
--- a/net-fs/samba/Manifest
+++ b/net-fs/samba/Manifest
@@ -1 +1 @@
-DIST samba-4.11.9.tar.gz 18576961 BLAKE2B 584e62df96bd7de6c0ff93f8fb45b85583b048c300cae020e1e1b467e773b4198c215cbef3b9c34ddf2e138118cca1dd7002ab9c671d111606e735ba8595f720 SHA512 77c1e928d23115eed0cc20f5836b02e73a26b0c23b2061c6148177fbf5b140e3d3a7a9fabfee3a2306158bc157708636c58c6655a57a64f0ff9a20c1a91e4f23
+DIST samba-4.11.13.tar.gz 18598813 BLAKE2B 5671498058e61c1afbdb0976b6931dc4e13087792612d4fdc3073e8e40a60be82f578836e3baa48f111a600da5c6e0e08aa7ba638fbc1285bbb57644ae7e8b1d SHA512 396ab636db6f9583b772935d58a3cf1860109bb9e1ef841a38c08d7be9f3839d6e198d5cdc80ef0803fcbfa6c06f1173585f3b582937e8834857fc47d90f7181
diff --git a/net-fs/samba/OWNERS b/net-fs/samba/OWNERS
new file mode 100644
index 0000000..1261db2
--- /dev/null
+++ b/net-fs/samba/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/smbfs/OWNERS
diff --git a/net-fs/samba/files/samba-4.11-async-dns-lookup.patch b/net-fs/samba/files/samba-4.11-async-dns-lookup.patch
new file mode 100644
index 0000000..2fee0db
--- /dev/null
+++ b/net-fs/samba/files/samba-4.11-async-dns-lookup.patch
@@ -0,0 +1,5682 @@
+From ce0ba3f64766805992c7c93f28fb399301c9f23c Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 11:43:03 -0700
+Subject: [PATCH 01/62] s3: lib: Cleanup - all the ipstr_XXX() functions are
+ only used in namecache.c.
+
+Move them there. Will remove from the global namespace next.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/lib/util_str.c     | 166 -------------------------------------
+ source3/libsmb/namecache.c | 164 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 164 insertions(+), 166 deletions(-)
+
+diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
+index e660e295c33..e43f178af29 100644
+--- a/source3/lib/util_str.c
++++ b/source3/lib/util_str.c
+@@ -643,172 +643,6 @@ bool str_list_substitute(char **list, const char *pattern, const char *insert)
+ 	return true;
+ }
+ 
+-
+-#define IPSTR_LIST_SEP	","
+-#define IPSTR_LIST_CHAR	','
+-
+-/**
+- * Add ip string representation to ipstr list. Used also
+- * as part of @function ipstr_list_make
+- *
+- * @param ipstr_list pointer to string containing ip list;
+- *        MUST BE already allocated and IS reallocated if necessary
+- * @param ipstr_size pointer to current size of ipstr_list (might be changed
+- *        as a result of reallocation)
+- * @param ip IP address which is to be added to list
+- * @return pointer to string appended with new ip and possibly
+- *         reallocated to new length
+- **/
+-
+-static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
+-{
+-	char *new_ipstr = NULL;
+-	char addr_buf[INET6_ADDRSTRLEN];
+-	int ret;
+-
+-	/* arguments checking */
+-	if (!ipstr_list || !service) {
+-		return NULL;
+-	}
+-
+-	print_sockaddr(addr_buf,
+-			sizeof(addr_buf),
+-			&service->ss);
+-
+-	/* attempt to convert ip to a string and append colon separator to it */
+-	if (*ipstr_list) {
+-		if (service->ss.ss_family == AF_INET) {
+-			/* IPv4 */
+-			ret = asprintf(&new_ipstr, "%s%s%s:%d",	*ipstr_list,
+-				       IPSTR_LIST_SEP, addr_buf,
+-				       service->port);
+-		} else {
+-			/* IPv6 */
+-			ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
+-				       IPSTR_LIST_SEP, addr_buf,
+-				       service->port);
+-		}
+-		SAFE_FREE(*ipstr_list);
+-	} else {
+-		if (service->ss.ss_family == AF_INET) {
+-			/* IPv4 */
+-			ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
+-				       service->port);
+-		} else {
+-			/* IPv6 */
+-			ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
+-				       service->port);
+-		}
+-	}
+-	if (ret == -1) {
+-		return NULL;
+-	}
+-	*ipstr_list = new_ipstr;
+-	return *ipstr_list;
+-}
+-
+-/**
+- * Allocate and initialise an ipstr list using ip adresses
+- * passed as arguments.
+- *
+- * @param ipstr_list pointer to string meant to be allocated and set
+- * @param ip_list array of ip addresses to place in the list
+- * @param ip_count number of addresses stored in ip_list
+- * @return pointer to allocated ip string
+- **/
+-
+-char *ipstr_list_make(char **ipstr_list,
+-			const struct ip_service *ip_list,
+-			int ip_count)
+-{
+-	int i;
+-
+-	/* arguments checking */
+-	if (!ip_list || !ipstr_list) {
+-		return 0;
+-	}
+-
+-	*ipstr_list = NULL;
+-
+-	/* process ip addresses given as arguments */
+-	for (i = 0; i < ip_count; i++) {
+-		*ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
+-	}
+-
+-	return (*ipstr_list);
+-}
+-
+-
+-/**
+- * Parse given ip string list into array of ip addresses
+- * (as ip_service structures)
+- *    e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
+- *
+- * @param ipstr ip string list to be parsed
+- * @param ip_list pointer to array of ip addresses which is
+- *        allocated by this function and must be freed by caller
+- * @return number of successfully parsed addresses
+- **/
+-
+-int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+-{
+-	TALLOC_CTX *frame;
+-	char *token_str = NULL;
+-	size_t count;
+-	int i;
+-
+-	if (!ipstr_list || !ip_list)
+-		return 0;
+-
+-	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
+-	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
+-		DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
+-					(unsigned long)count));
+-		return 0;
+-	}
+-
+-	frame = talloc_stackframe();
+-	for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
+-				IPSTR_LIST_SEP) && i<count; i++ ) {
+-		char *s = token_str;
+-		char *p = strrchr(token_str, ':');
+-
+-		if (p) {
+-			*p = 0;
+-			(*ip_list)[i].port = atoi(p+1);
+-		}
+-
+-		/* convert single token to ip address */
+-		if (token_str[0] == '[') {
+-			/* IPv6 address. */
+-			s++;
+-			p = strchr(token_str, ']');
+-			if (!p) {
+-				continue;
+-			}
+-			*p = '\0';
+-		}
+-		if (!interpret_string_addr(&(*ip_list)[i].ss,
+-					s,
+-					AI_NUMERICHOST)) {
+-			continue;
+-		}
+-	}
+-	TALLOC_FREE(frame);
+-	return count;
+-}
+-
+-/**
+- * Safely free ip string list
+- *
+- * @param ipstr_list ip string list to be freed
+- **/
+-
+-void ipstr_list_free(char* ipstr_list)
+-{
+-	SAFE_FREE(ipstr_list);
+-}
+-
+ /* read a SMB_BIG_UINT from a string */
+ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
+ {
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 082f256bc02..8fc65675db9 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -24,6 +24,170 @@
+ #include "includes.h"
+ #include "lib/gencache.h"
+ 
++#define IPSTR_LIST_SEP	","
++#define IPSTR_LIST_CHAR	','
++
++/**
++ * Add ip string representation to ipstr list. Used also
++ * as part of @function ipstr_list_make
++ *
++ * @param ipstr_list pointer to string containing ip list;
++ *        MUST BE already allocated and IS reallocated if necessary
++ * @param ipstr_size pointer to current size of ipstr_list (might be changed
++ *        as a result of reallocation)
++ * @param ip IP address which is to be added to list
++ * @return pointer to string appended with new ip and possibly
++ *         reallocated to new length
++ **/
++
++static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
++{
++	char *new_ipstr = NULL;
++	char addr_buf[INET6_ADDRSTRLEN];
++	int ret;
++
++	/* arguments checking */
++	if (!ipstr_list || !service) {
++		return NULL;
++	}
++
++	print_sockaddr(addr_buf,
++			sizeof(addr_buf),
++			&service->ss);
++
++	/* attempt to convert ip to a string and append colon separator to it */
++	if (*ipstr_list) {
++		if (service->ss.ss_family == AF_INET) {
++			/* IPv4 */
++			ret = asprintf(&new_ipstr, "%s%s%s:%d",	*ipstr_list,
++				       IPSTR_LIST_SEP, addr_buf,
++				       service->port);
++		} else {
++			/* IPv6 */
++			ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
++				       IPSTR_LIST_SEP, addr_buf,
++				       service->port);
++		}
++		SAFE_FREE(*ipstr_list);
++	} else {
++		if (service->ss.ss_family == AF_INET) {
++			/* IPv4 */
++			ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
++				       service->port);
++		} else {
++			/* IPv6 */
++			ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
++				       service->port);
++		}
++	}
++	if (ret == -1) {
++		return NULL;
++	}
++	*ipstr_list = new_ipstr;
++	return *ipstr_list;
++}
++
++/**
++ * Allocate and initialise an ipstr list using ip adresses
++ * passed as arguments.
++ *
++ * @param ipstr_list pointer to string meant to be allocated and set
++ * @param ip_list array of ip addresses to place in the list
++ * @param ip_count number of addresses stored in ip_list
++ * @return pointer to allocated ip string
++ **/
++
++char *ipstr_list_make(char **ipstr_list,
++			const struct ip_service *ip_list,
++			int ip_count)
++{
++	int i;
++
++	/* arguments checking */
++	if (!ip_list || !ipstr_list) {
++		return 0;
++	}
++
++	*ipstr_list = NULL;
++
++	/* process ip addresses given as arguments */
++	for (i = 0; i < ip_count; i++) {
++		*ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
++	}
++
++	return (*ipstr_list);
++}
++
++
++/**
++ * Parse given ip string list into array of ip addresses
++ * (as ip_service structures)
++ *    e.g. [IPv6]:port,192.168.1.100:389,192.168.1.78, ...
++ *
++ * @param ipstr ip string list to be parsed
++ * @param ip_list pointer to array of ip addresses which is
++ *        allocated by this function and must be freed by caller
++ * @return number of successfully parsed addresses
++ **/
++
++int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
++{
++	TALLOC_CTX *frame;
++	char *token_str = NULL;
++	size_t i, count;
++
++	if (!ipstr_list || !ip_list)
++		return 0;
++
++	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
++	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
++		DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
++					(unsigned long)count));
++		return 0;
++	}
++
++	frame = talloc_stackframe();
++	for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
++				IPSTR_LIST_SEP) && i<count; i++ ) {
++		char *s = token_str;
++		char *p = strrchr(token_str, ':');
++
++		if (p) {
++			*p = 0;
++			(*ip_list)[i].port = atoi(p+1);
++		}
++
++		/* convert single token to ip address */
++		if (token_str[0] == '[') {
++			/* IPv6 address. */
++			s++;
++			p = strchr(token_str, ']');
++			if (!p) {
++				continue;
++			}
++			*p = '\0';
++		}
++		if (!interpret_string_addr(&(*ip_list)[i].ss,
++					s,
++					AI_NUMERICHOST)) {
++			continue;
++		}
++	}
++	TALLOC_FREE(frame);
++	return count;
++}
++
++/**
++ * Safely free ip string list
++ *
++ * @param ipstr_list ip string list to be freed
++ **/
++
++void ipstr_list_free(char* ipstr_list)
++{
++	SAFE_FREE(ipstr_list);
++}
++
+ #define NBTKEY_FMT  "NBT/%s#%02X"
+ 
+ /**
+-- 
+2.20.1
+
+
+From ccb983f3689d841939e835512cf896978f6859f3 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 11:48:30 -0700
+Subject: [PATCH 02/62] s3: lib: Cleanup - nothing uses ipstr_list_free().
+ Remove it.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/include/proto.h    |  1 -
+ source3/libsmb/namecache.c | 11 -----------
+ 2 files changed, 12 deletions(-)
+
+diff --git a/source3/include/proto.h b/source3/include/proto.h
+index 0c0ffc4f3ff..75d6f30249e 100644
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -627,7 +627,6 @@ char *ipstr_list_make(char **ipstr_list,
+ 			const struct ip_service *ip_list,
+ 			int ip_count);
+ int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list);
+-void ipstr_list_free(char* ipstr_list);
+ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr);
+ uint64_t conv_str_size(const char * str);
+ int asprintf_strupper_m(char **strp, const char *fmt, ...)
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 8fc65675db9..6a4bbc7216f 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -177,17 +177,6 @@ int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+ 	return count;
+ }
+ 
+-/**
+- * Safely free ip string list
+- *
+- * @param ipstr_list ip string list to be freed
+- **/
+-
+-void ipstr_list_free(char* ipstr_list)
+-{
+-	SAFE_FREE(ipstr_list);
+-}
+-
+ #define NBTKEY_FMT  "NBT/%s#%02X"
+ 
+ /**
+-- 
+2.20.1
+
+
+From 859f2b701626728b6984bcee043daa6dbfaeba8d Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 11:58:45 -0700
+Subject: [PATCH 03/62] s3: lib: Cleanup - make ipstr_list_make() and
+ ipstr_list_parse() private to the only user.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/include/proto.h    | 4 ----
+ source3/libsmb/namecache.c | 4 ++--
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/source3/include/proto.h b/source3/include/proto.h
+index 75d6f30249e..8562317553c 100644
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -623,10 +623,6 @@ bool str_list_sub_basic( char **list, const char *smb_name,
+ 			 const char *domain_name );
+ bool str_list_substitute(char **list, const char *pattern, const char *insert);
+ 
+-char *ipstr_list_make(char **ipstr_list,
+-			const struct ip_service *ip_list,
+-			int ip_count);
+-int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list);
+ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr);
+ uint64_t conv_str_size(const char * str);
+ int asprintf_strupper_m(char **strp, const char *fmt, ...)
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 6a4bbc7216f..3b77c748527 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -97,7 +97,7 @@ static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
+  * @return pointer to allocated ip string
+  **/
+ 
+-char *ipstr_list_make(char **ipstr_list,
++static char *ipstr_list_make(char **ipstr_list,
+ 			const struct ip_service *ip_list,
+ 			int ip_count)
+ {
+@@ -130,7 +130,7 @@ char *ipstr_list_make(char **ipstr_list,
+  * @return number of successfully parsed addresses
+  **/
+ 
+-int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
++static int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+ {
+ 	TALLOC_CTX *frame;
+ 	char *token_str = NULL;
+-- 
+2.20.1
+
+
+From 86f6249b7d7d26f097b1bf78a2b4517a7f09a39e Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 12:12:23 -0700
+Subject: [PATCH 04/62] s3: libsmb: Cleanup modern coding standards.
+ 'True/False' -> 'true/false'.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 3b77c748527..832daea1e01 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -221,7 +221,7 @@ bool namecache_store(const char *name,
+ 	bool ret;
+ 
+ 	if (name_type > 255) {
+-		return False; /* Don't store non-real name types. */
++		return false; /* Don't store non-real name types. */
+ 	}
+ 
+ 	if ( DEBUGLEVEL >= 5 ) {
+@@ -247,7 +247,7 @@ bool namecache_store(const char *name,
+ 
+ 	key = namecache_key(name, name_type);
+ 	if (!key) {
+-		return False;
++		return false;
+ 	}
+ 
+ 	expiry = time(NULL) + lp_name_cache_timeout();
+@@ -293,11 +293,11 @@ bool namecache_fetch(const char *name,
+ 
+ 	/* exit now if null pointers were passed as they're required further */
+ 	if (!ip_list || !num_names) {
+-		return False;
++		return false;
+ 	}
+ 
+ 	if (name_type > 255) {
+-		return False; /* Don't fetch non-real name types. */
++		return false; /* Don't fetch non-real name types. */
+ 	}
+ 
+ 	*num_names = 0;
+@@ -307,13 +307,13 @@ bool namecache_fetch(const char *name,
+ 	 */
+ 	key = namecache_key(name, name_type);
+ 	if (!key) {
+-		return False;
++		return false;
+ 	}
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+ 		DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type));
+ 		SAFE_FREE(key);
+-		return False;
++		return false;
+ 	}
+ 
+ 	DEBUG(5, ("name %s#%02X found.\n", name, name_type));
+@@ -340,12 +340,12 @@ bool namecache_delete(const char *name, int name_type)
+ 	char *key;
+ 
+ 	if (name_type > 255) {
+-		return False; /* Don't fetch non-real name types. */
++		return false; /* Don't fetch non-real name types. */
+ 	}
+ 
+ 	key = namecache_key(name, name_type);
+ 	if (!key) {
+-		return False;
++		return false;
+ 	}
+ 	ret = gencache_del(key);
+ 	SAFE_FREE(key);
+@@ -414,7 +414,7 @@ bool namecache_status_store(const char *keyname, int keyname_type,
+ 	key = namecache_status_record_key(keyname, keyname_type,
+ 			name_type, keyip);
+ 	if (!key)
+-		return False;
++		return false;
+ 
+ 	expiry = time(NULL) + lp_name_cache_timeout();
+ 	ret = gencache_set(key, srvname, expiry);
+@@ -446,13 +446,13 @@ bool namecache_status_fetch(const char *keyname,
+ 	key = namecache_status_record_key(keyname, keyname_type,
+ 			name_type, keyip);
+ 	if (!key)
+-		return False;
++		return false;
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+ 		DEBUG(5, ("namecache_status_fetch: no entry for %s found.\n",
+ 					key));
+ 		SAFE_FREE(key);
+-		return False;
++		return false;
+ 	} else {
+ 		DEBUG(5, ("namecache_status_fetch: key %s -> %s\n",
+ 					key, value ));
+@@ -461,5 +461,5 @@ bool namecache_status_fetch(const char *keyname,
+ 	strlcpy(srvname_out, value, 16);
+ 	SAFE_FREE(key);
+ 	TALLOC_FREE(value);
+-	return True;
++	return true;
+ }
+-- 
+2.20.1
+
+
+From 52405b7dbd76fa3daf5e5e415928ecd4220ae824 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 13:28:33 -0700
+Subject: [PATCH 05/62] s3: libsmb: Cleanup - move talloc frame out of inner
+ scope.
+
+Make it available thoughout the function. Prepare to use
+talloc for namecache_key().
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 832daea1e01..76d411e87d1 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -219,20 +219,21 @@ bool namecache_store(const char *name,
+ 	char *key, *value_string;
+ 	int i;
+ 	bool ret;
++	TALLOC_CTX *frame = talloc_stackframe();
+ 
+ 	if (name_type > 255) {
++		TALLOC_FREE(frame);
+ 		return false; /* Don't store non-real name types. */
+ 	}
+ 
+ 	if ( DEBUGLEVEL >= 5 ) {
+-		TALLOC_CTX *ctx = talloc_stackframe();
+ 		char *addr = NULL;
+ 
+ 		DEBUG(5, ("namecache_store: storing %d address%s for %s#%02x: ",
+ 			num_names, num_names == 1 ? "": "es", name, name_type));
+ 
+ 		for (i = 0; i < num_names; i++) {
+-			addr = print_canonical_sockaddr(ctx,
++			addr = print_canonical_sockaddr(frame,
+ 							&ip_list[i].ss);
+ 			if (!addr) {
+ 				continue;
+@@ -242,11 +243,11 @@ bool namecache_store(const char *name,
+ 
+ 		}
+ 		DEBUGADD(5, ("\n"));
+-		TALLOC_FREE(ctx);
+ 	}
+ 
+ 	key = namecache_key(name, name_type);
+ 	if (!key) {
++		TALLOC_FREE(frame);
+ 		return false;
+ 	}
+ 
+@@ -260,6 +261,7 @@ bool namecache_store(const char *name,
+ 	if (!ipstr_list_make(&value_string, ip_list, num_names)) {
+ 		SAFE_FREE(key);
+ 		SAFE_FREE(value_string);
++		TALLOC_FREE(frame);
+ 		return false;
+ 	}
+ 
+@@ -267,6 +269,7 @@ bool namecache_store(const char *name,
+ 	ret = gencache_set(key, value_string, expiry);
+ 	SAFE_FREE(key);
+ 	SAFE_FREE(value_string);
++	TALLOC_FREE(frame);
+ 	return ret;
+ }
+ 
+-- 
+2.20.1
+
+
+From cf885843fca6c60fb855b9c56f560bc70536ea1d Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 13:31:38 -0700
+Subject: [PATCH 06/62] s3: libsmb: Cleanup - namecache_store() initialize
+ stack variables.
+
+Preparing for common out: exit.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 76d411e87d1..1127874c375 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -216,9 +216,10 @@ bool namecache_store(const char *name,
+ 			struct ip_service *ip_list)
+ {
+ 	time_t expiry;
+-	char *key, *value_string;
++	char *key = NULL;
++	char *value_string = NULL;
+ 	int i;
+-	bool ret;
++	bool ret = false;
+ 	TALLOC_CTX *frame = talloc_stackframe();
+ 
+ 	if (name_type > 255) {
+-- 
+2.20.1
+
+
+From a464af6d2363714c631e62e390b5bbef81fa03c0 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 13:33:27 -0700
+Subject: [PATCH 07/62] s3: libsmb: Cleanup - namecache_store() - use common
+ out.
+
+Prepare for moving malloc values to talloc.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 1127874c375..a4de493b08e 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -223,8 +223,8 @@ bool namecache_store(const char *name,
+ 	TALLOC_CTX *frame = talloc_stackframe();
+ 
+ 	if (name_type > 255) {
+-		TALLOC_FREE(frame);
+-		return false; /* Don't store non-real name types. */
++		/* Don't store non-real name types. */
++		goto out;
+ 	}
+ 
+ 	if ( DEBUGLEVEL >= 5 ) {
+@@ -248,8 +248,7 @@ bool namecache_store(const char *name,
+ 
+ 	key = namecache_key(name, name_type);
+ 	if (!key) {
+-		TALLOC_FREE(frame);
+-		return false;
++		goto out;
+ 	}
+ 
+ 	expiry = time(NULL) + lp_name_cache_timeout();
+@@ -260,14 +259,14 @@ bool namecache_store(const char *name,
+ 	 * place each single ip
+ 	 */
+ 	if (!ipstr_list_make(&value_string, ip_list, num_names)) {
+-		SAFE_FREE(key);
+-		SAFE_FREE(value_string);
+-		TALLOC_FREE(frame);
+-		return false;
++		goto out;
+ 	}
+ 
+ 	/* set the entry */
+ 	ret = gencache_set(key, value_string, expiry);
++
++  out:
++
+ 	SAFE_FREE(key);
+ 	SAFE_FREE(value_string);
+ 	TALLOC_FREE(frame);
+-- 
+2.20.1
+
+
+From cb2876a6fc29880c4f8cb50e96fc36cc0eaa1aba Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 13:37:59 -0700
+Subject: [PATCH 08/62] s3: libsmb: Cleanup - make namecache_key() use talloc.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index a4de493b08e..5457a9d47cc 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -191,13 +191,14 @@ static int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+  *         type number
+  */
+ 
+-static char *namecache_key(const char *name,
+-				int name_type)
++static char *namecache_key(TALLOC_CTX *ctx,
++			   const char *name,
++			   int name_type)
+ {
+-	char *keystr = NULL;
+-	asprintf_strupper_m(&keystr, NBTKEY_FMT, name, name_type);
+-
+-	return keystr;
++	return talloc_asprintf_strupper_m(ctx,
++					  NBTKEY_FMT,
++					  name,
++					  name_type);
+ }
+ 
+ /**
+@@ -246,7 +247,7 @@ bool namecache_store(const char *name,
+ 		DEBUGADD(5, ("\n"));
+ 	}
+ 
+-	key = namecache_key(name, name_type);
++	key = namecache_key(frame, name, name_type);
+ 	if (!key) {
+ 		goto out;
+ 	}
+@@ -267,7 +268,7 @@ bool namecache_store(const char *name,
+ 
+   out:
+ 
+-	SAFE_FREE(key);
++	TALLOC_FREE(key);
+ 	SAFE_FREE(value_string);
+ 	TALLOC_FREE(frame);
+ 	return ret;
+@@ -308,14 +309,14 @@ bool namecache_fetch(const char *name,
+ 	/*
+ 	 * Use gencache interface - lookup the key
+ 	 */
+-	key = namecache_key(name, name_type);
++	key = namecache_key(talloc_tos(), name, name_type);
+ 	if (!key) {
+ 		return false;
+ 	}
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+ 		DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type));
+-		SAFE_FREE(key);
++		TALLOC_FREE(key);
+ 		return false;
+ 	}
+ 
+@@ -326,7 +327,7 @@ bool namecache_fetch(const char *name,
+ 	 */
+ 	*num_names = ipstr_list_parse(value, ip_list);
+ 
+-	SAFE_FREE(key);
++	TALLOC_FREE(key);
+ 	TALLOC_FREE(value);
+ 
+ 	return *num_names > 0; /* true only if some ip has been fetched */
+@@ -346,12 +347,12 @@ bool namecache_delete(const char *name, int name_type)
+ 		return false; /* Don't fetch non-real name types. */
+ 	}
+ 
+-	key = namecache_key(name, name_type);
++	key = namecache_key(talloc_tos(), name, name_type);
+ 	if (!key) {
+ 		return false;
+ 	}
+ 	ret = gencache_del(key);
+-	SAFE_FREE(key);
++	TALLOC_FREE(key);
+ 	return ret;
+ }
+ 
+-- 
+2.20.1
+
+
+From 36bf9a7373d058e5f7b07c3d9f0f7b8661615a62 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 14:38:23 -0700
+Subject: [PATCH 09/62] s3: libsmb: Cleanup - make
+ namecache_status_record_key() use talloc.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 33 +++++++++++++++++++++------------
+ 1 file changed, 21 insertions(+), 12 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 5457a9d47cc..ed0d116e3bb 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -391,18 +391,21 @@ void namecache_flush(void)
+ 
+ /* Construct a name status record key. */
+ 
+-static char *namecache_status_record_key(const char *name,
++static char *namecache_status_record_key(TALLOC_CTX *ctx,
++				const char *name,
+ 				int name_type1,
+ 				int name_type2,
+ 				const struct sockaddr_storage *keyip)
+ {
+ 	char addr[INET6_ADDRSTRLEN];
+-	char *keystr = NULL;
+ 
+ 	print_sockaddr(addr, sizeof(addr), keyip);
+-	asprintf_strupper_m(&keystr, "NBT/%s#%02X.%02X.%s", name,
+-			    name_type1, name_type2, addr);
+-	return keystr;
++	return talloc_asprintf_strupper_m(ctx,
++					  "NBT/%s#%02X.%02X.%s",
++					  name,
++					  name_type1,
++					  name_type2,
++					  addr);
+ }
+ 
+ /* Store a name status record. */
+@@ -415,8 +418,11 @@ bool namecache_status_store(const char *keyname, int keyname_type,
+ 	time_t expiry;
+ 	bool ret;
+ 
+-	key = namecache_status_record_key(keyname, keyname_type,
+-			name_type, keyip);
++	key = namecache_status_record_key(talloc_tos(),
++					  keyname,
++					  keyname_type,
++					  name_type,
++					  keyip);
+ 	if (!key)
+ 		return false;
+ 
+@@ -431,7 +437,7 @@ bool namecache_status_store(const char *keyname, int keyname_type,
+ 					key ));
+ 	}
+ 
+-	SAFE_FREE(key);
++	TALLOC_FREE(key);
+ 	return ret;
+ }
+ 
+@@ -447,15 +453,18 @@ bool namecache_status_fetch(const char *keyname,
+ 	char *value = NULL;
+ 	time_t timeout;
+ 
+-	key = namecache_status_record_key(keyname, keyname_type,
+-			name_type, keyip);
++	key = namecache_status_record_key(talloc_tos(),
++					  keyname,
++					  keyname_type,
++					  name_type,
++					  keyip);
+ 	if (!key)
+ 		return false;
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+ 		DEBUG(5, ("namecache_status_fetch: no entry for %s found.\n",
+ 					key));
+-		SAFE_FREE(key);
++		TALLOC_FREE(key);
+ 		return false;
+ 	} else {
+ 		DEBUG(5, ("namecache_status_fetch: key %s -> %s\n",
+@@ -463,7 +472,7 @@ bool namecache_status_fetch(const char *keyname,
+ 	}
+ 
+ 	strlcpy(srvname_out, value, 16);
+-	SAFE_FREE(key);
++	TALLOC_FREE(key);
+ 	TALLOC_FREE(value);
+ 	return true;
+ }
+-- 
+2.20.1
+
+
+From c796efc01c89c6da7ab0e1565195aeeee54e04cc Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 14:41:45 -0700
+Subject: [PATCH 10/62] s3: libsmb: Cleanup - Move DEBUG -> DBG_XXX() macros.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+---
+ source3/libsmb/namecache.c | 28 ++++++++++++----------------
+ 1 file changed, 12 insertions(+), 16 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index ed0d116e3bb..3c1a376b35b 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -141,8 +141,8 @@ static int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
+ 
+ 	count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
+ 	if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
+-		DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n",
+-					(unsigned long)count));
++		DBG_ERR("malloc failed for %lu entries\n",
++					(unsigned long)count);
+ 		return 0;
+ 	}
+ 
+@@ -231,8 +231,8 @@ bool namecache_store(const char *name,
+ 	if ( DEBUGLEVEL >= 5 ) {
+ 		char *addr = NULL;
+ 
+-		DEBUG(5, ("namecache_store: storing %d address%s for %s#%02x: ",
+-			num_names, num_names == 1 ? "": "es", name, name_type));
++		DBG_INFO("storing %d address%s for %s#%02x: ",
++			num_names, num_names == 1 ? "": "es", name, name_type);
+ 
+ 		for (i = 0; i < num_names; i++) {
+ 			addr = print_canonical_sockaddr(frame,
+@@ -315,12 +315,12 @@ bool namecache_fetch(const char *name,
+ 	}
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+-		DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type));
++		DBG_INFO("no entry for %s#%02X found.\n", name, name_type);
+ 		TALLOC_FREE(key);
+ 		return false;
+ 	}
+ 
+-	DEBUG(5, ("name %s#%02X found.\n", name, name_type));
++	DBG_INFO("name %s#%02X found.\n", name, name_type);
+ 
+ 	/*
+ 	 * Split up the stored value into the list of IP adresses
+@@ -368,7 +368,7 @@ static void flush_netbios_name(const char *key,
+ 			void *dptr)
+ {
+ 	gencache_del(key);
+-	DEBUG(5, ("Deleting entry %s\n", key));
++	DBG_INFO("Deleting entry %s\n", key);
+ }
+ 
+ /**
+@@ -386,7 +386,7 @@ void namecache_flush(void)
+ 	 * by flush_netbios_name function
+ 	 */
+ 	gencache_iterate(flush_netbios_name, NULL, "NBT/*");
+-	DEBUG(5, ("Namecache flushed\n"));
++	DBG_INFO("Namecache flushed\n");
+ }
+ 
+ /* Construct a name status record key. */
+@@ -430,11 +430,9 @@ bool namecache_status_store(const char *keyname, int keyname_type,
+ 	ret = gencache_set(key, srvname, expiry);
+ 
+ 	if (ret) {
+-		DEBUG(5, ("namecache_status_store: entry %s -> %s\n",
+-					key, srvname ));
++		DBG_INFO("entry %s -> %s\n", key, srvname);
+ 	} else {
+-		DEBUG(5, ("namecache_status_store: entry %s store failed.\n",
+-					key ));
++		DBG_INFO("entry %s store failed.\n", key);
+ 	}
+ 
+ 	TALLOC_FREE(key);
+@@ -462,13 +460,11 @@ bool namecache_status_fetch(const char *keyname,
+ 		return false;
+ 
+ 	if (!gencache_get(key, talloc_tos(), &value, &timeout)) {
+-		DEBUG(5, ("namecache_status_fetch: no entry for %s found.\n",
+-					key));
++		DBG_INFO("no entry for %s found.\n", key);
+ 		TALLOC_FREE(key);
+ 		return false;
+ 	} else {
+-		DEBUG(5, ("namecache_status_fetch: key %s -> %s\n",
+-					key, value ));
++		DBG_INFO("key %s -> %s\n", key, value);
+ 	}
+ 
+ 	strlcpy(srvname_out, value, 16);
+-- 
+2.20.1
+
+
+From 9a9ed170a5e3ed30cab22daf3a4440ea1350982b Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 15 Jul 2020 15:02:02 -0700
+Subject: [PATCH 11/62] s3: libsmb: Cleanup - Make ipstr_list_make() talloc
+ rather than malloc.
+
+Remove the excessive and unneeded ipstr_list_add() function,
+fold it into ipstr_list_make() to make it much clearer what
+we're doing.
+
+The only use of MALLOC now is in ipstr_list_parse() returned
+by namecache_fetch(). We need to fix the caller before
+we can move that to talloc. As that is used inside internal_resolve_name()
+which is designed to return a MALLOC'ed ip list from all
+name resolution mechanisms leave that fix for another day.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+
+Autobuild-User(master): Volker Lendecke <vl@samba.org>
+Autobuild-Date(master): Thu Jul 16 08:16:31 UTC 2020 on sn-devel-184
+---
+ source3/libsmb/namecache.c | 133 +++++++++++++++++--------------------
+ 1 file changed, 60 insertions(+), 73 deletions(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 3c1a376b35b..7f534587263 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -27,98 +27,86 @@
+ #define IPSTR_LIST_SEP	","
+ #define IPSTR_LIST_CHAR	','
+ 
+-/**
+- * Add ip string representation to ipstr list. Used also
+- * as part of @function ipstr_list_make
+- *
+- * @param ipstr_list pointer to string containing ip list;
+- *        MUST BE already allocated and IS reallocated if necessary
+- * @param ipstr_size pointer to current size of ipstr_list (might be changed
+- *        as a result of reallocation)
+- * @param ip IP address which is to be added to list
+- * @return pointer to string appended with new ip and possibly
+- *         reallocated to new length
+- **/
+-
+-static char *ipstr_list_add(char **ipstr_list, const struct ip_service *service)
+-{
+-	char *new_ipstr = NULL;
+-	char addr_buf[INET6_ADDRSTRLEN];
+-	int ret;
+-
+-	/* arguments checking */
+-	if (!ipstr_list || !service) {
+-		return NULL;
+-	}
+-
+-	print_sockaddr(addr_buf,
+-			sizeof(addr_buf),
+-			&service->ss);
+-
+-	/* attempt to convert ip to a string and append colon separator to it */
+-	if (*ipstr_list) {
+-		if (service->ss.ss_family == AF_INET) {
+-			/* IPv4 */
+-			ret = asprintf(&new_ipstr, "%s%s%s:%d",	*ipstr_list,
+-				       IPSTR_LIST_SEP, addr_buf,
+-				       service->port);
+-		} else {
+-			/* IPv6 */
+-			ret = asprintf(&new_ipstr, "%s%s[%s]:%d", *ipstr_list,
+-				       IPSTR_LIST_SEP, addr_buf,
+-				       service->port);
+-		}
+-		SAFE_FREE(*ipstr_list);
+-	} else {
+-		if (service->ss.ss_family == AF_INET) {
+-			/* IPv4 */
+-			ret = asprintf(&new_ipstr, "%s:%d", addr_buf,
+-				       service->port);
+-		} else {
+-			/* IPv6 */
+-			ret = asprintf(&new_ipstr, "[%s]:%d", addr_buf,
+-				       service->port);
+-		}
+-	}
+-	if (ret == -1) {
+-		return NULL;
+-	}
+-	*ipstr_list = new_ipstr;
+-	return *ipstr_list;
+-}
+-
+ /**
+  * Allocate and initialise an ipstr list using ip adresses
+  * passed as arguments.
+  *
+- * @param ipstr_list pointer to string meant to be allocated and set
++ * @param ctx TALLOC_CTX to use
+  * @param ip_list array of ip addresses to place in the list
+  * @param ip_count number of addresses stored in ip_list
+  * @return pointer to allocated ip string
+  **/
+ 
+-static char *ipstr_list_make(char **ipstr_list,
++static char *ipstr_list_make(TALLOC_CTX *ctx,
+ 			const struct ip_service *ip_list,
+ 			int ip_count)
+ {
++	char *ipstr_list = NULL;
+ 	int i;
+ 
+ 	/* arguments checking */
+-	if (!ip_list || !ipstr_list) {
+-		return 0;
++	if (ip_list == NULL) {
++		return NULL;
+ 	}
+ 
+-	*ipstr_list = NULL;
+-
+ 	/* process ip addresses given as arguments */
+ 	for (i = 0; i < ip_count; i++) {
+-		*ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
++		char addr_buf[INET6_ADDRSTRLEN];
++		char *new_str = NULL;
++
++		print_sockaddr(addr_buf,
++			       sizeof(addr_buf),
++			       &ip_list[i].ss);
++
++		if (ip_list->ss.ss_family == AF_INET) {
++			/* IPv4 */
++			new_str = talloc_asprintf(ctx,
++						  "%s:%d",
++						  addr_buf,
++						  ip_list[i].port);
++		} else {
++			/* IPv6 */
++			new_str = talloc_asprintf(ctx,
++						  "[%s]:%d",
++						  addr_buf,
++						  ip_list[i].port);
++		}
++		if (new_str == NULL) {
++			TALLOC_FREE(ipstr_list);
++			return NULL;
++		}
++
++		if (ipstr_list == NULL) {
++			/* First ip address. */
++			ipstr_list = new_str;
++		} else {
++			/*
++			 * Append the separator "," and then the new
++			 * ip address to the existing list.
++			 *
++			 * The efficiency here is horrible, but
++			 * ip_count should be small enough we can
++			 * live with it.
++			 */
++			char *tmp = talloc_asprintf(ctx,
++						    "%s%s%s",
++						    ipstr_list,
++						    IPSTR_LIST_SEP,
++						    new_str);
++			if (tmp == NULL) {
++				TALLOC_FREE(new_str);
++				TALLOC_FREE(ipstr_list);
++				return NULL;
++			}
++			TALLOC_FREE(new_str);
++			TALLOC_FREE(ipstr_list);
++			ipstr_list = tmp;
++		}
+ 	}
+ 
+-	return (*ipstr_list);
++	return ipstr_list;
+ }
+ 
+-
+ /**
+  * Parse given ip string list into array of ip addresses
+  * (as ip_service structures)
+@@ -256,10 +244,9 @@ bool namecache_store(const char *name,
+ 
+ 	/*
+ 	 * Generate string representation of ip addresses list
+-	 * First, store the number of ip addresses and then
+-	 * place each single ip
+ 	 */
+-	if (!ipstr_list_make(&value_string, ip_list, num_names)) {
++	value_string = ipstr_list_make(frame, ip_list, num_names);
++	if (value_string == NULL) {
+ 		goto out;
+ 	}
+ 
+@@ -269,7 +256,7 @@ bool namecache_store(const char *name,
+   out:
+ 
+ 	TALLOC_FREE(key);
+-	SAFE_FREE(value_string);
++	TALLOC_FREE(value_string);
+ 	TALLOC_FREE(frame);
+ 	return ret;
+ }
+-- 
+2.20.1
+
+
+From 7ba2c859ce3f6863da9b31454377d23d6b64fdf8 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Thu, 16 Jul 2020 15:47:04 -0700
+Subject: [PATCH 12/62] s3: libsmb: Namecache. Fix bug missed by me in previous
+ cleanup.
+
+In ipstr_list_make() we need to look at the correct array entry
+to determine the ss_family for the sockaddr_storage.
+
+Otherwise we are always storing the type of the first entry.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Volker Lendecke <vl@samba.org>
+
+Autobuild-User(master): Volker Lendecke <vl@samba.org>
+Autobuild-Date(master): Fri Jul 17 05:54:31 UTC 2020 on sn-devel-184
+---
+ source3/libsmb/namecache.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c
+index 7f534587263..fb4a4aac8c8 100644
+--- a/source3/libsmb/namecache.c
++++ b/source3/libsmb/namecache.c
+@@ -58,7 +58,7 @@ static char *ipstr_list_make(TALLOC_CTX *ctx,
+ 			       sizeof(addr_buf),
+ 			       &ip_list[i].ss);
+ 
+-		if (ip_list->ss.ss_family == AF_INET) {
++		if (ip_list[i].ss.ss_family == AF_INET) {
+ 			/* IPv4 */
+ 			new_str = talloc_asprintf(ctx,
+ 						  "%s:%d",
+-- 
+2.20.1
+
+
+From cd671fcfc167061b2af279e3f138d32600c51ec5 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 20:57:44 -0700
+Subject: [PATCH 13/62] s3: libsmb: Cleanup - ensure we don't try and continue
+ resolving names on failure of convert_ss2service().
+
+Logic change, but correct error cleanup - jump to new 'fail:' label.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index f61e2507cce..eba696b621d 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2672,6 +2672,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 							ss_list,
+ 							return_count)) {
+ 					status = NT_STATUS_NO_MEMORY;
++					goto fail;
+ 				}
+ 				goto done;
+ 			}
+@@ -2704,6 +2705,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 							ss_list,
+ 							return_count)) {
+ 					status = NT_STATUS_NO_MEMORY;
++					goto fail;
+ 				}
+ 				goto done;
+ 			}
+@@ -2720,6 +2722,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 								ss_list,
+ 								return_count)) {
+ 						status = NT_STATUS_NO_MEMORY;
++						goto fail;
+ 					}
+ 					goto done;
+ 				}
+@@ -2734,6 +2737,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 							ss_list,
+ 							return_count)) {
+ 					status = NT_STATUS_NO_MEMORY;
++					goto fail;
+ 				}
+ 				goto done;
+ 			}
+@@ -2745,6 +2749,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 
+ 	/* All of the resolve_* functions above have returned false. */
+ 
++  fail:
++
+ 	TALLOC_FREE(frame);
+ 	SAFE_FREE(*return_iplist);
+ 	*return_count = 0;
+-- 
+2.20.1
+
+
+From 2909432a288344e5717c1f803bd9f191869eb004 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 16:54:45 -0700
+Subject: [PATCH 14/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for resolve_hosts().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index eba696b621d..1af78218bb2 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2667,15 +2667,16 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			status = resolve_hosts(name, name_type,
+ 					       talloc_tos(), &ss_list,
+ 					       return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				if (!convert_ss2service(return_iplist,
+-							ss_list,
+-							return_count)) {
+-					status = NT_STATUS_NO_MEMORY;
+-					goto fail;
+-				}
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
++			}
++			if (!convert_ss2service(return_iplist,
++						ss_list,
++						return_count)) {
++				status = NT_STATUS_NO_MEMORY;
++				goto fail;
+ 			}
++			goto done;
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+ 			 * This will result in a SRV record lookup */
+-- 
+2.20.1
+
+
+From 350998d49c97c8a8eb7ff942333f324464980d19 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 16:56:14 -0700
+Subject: [PATCH 15/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for KDC resolve_ads().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 1af78218bb2..c4ab345e30a 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2682,12 +2682,13 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			 * This will result in a SRV record lookup */
+ 			status = resolve_ads(name, KDC_NAME_TYPE, sitename,
+ 					     return_iplist, return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				/* Ensure we don't namecache
+-				 * this with the KDC port. */
+-				name_type = KDC_NAME_TYPE;
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
+ 			}
++			/* Ensure we don't namecache
++			 * this with the KDC port. */
++			name_type = KDC_NAME_TYPE;
++			goto done;
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+ 			 * This will result in a SRV record lookup */
+-- 
+2.20.1
+
+
+From bba87d43b5bea1242d3dd995920c7e14feaf4d34 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 16:57:43 -0700
+Subject: [PATCH 16/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for resolve_ads().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index c4ab345e30a..7f105abd402 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2694,9 +2694,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			 * This will result in a SRV record lookup */
+ 			status = resolve_ads(name, name_type, sitename,
+ 					     return_iplist, return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
+ 			}
++			goto done;
+ 		} else if (strequal(tok, "lmhosts")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = resolve_lmhosts_file_as_sockaddr(
+-- 
+2.20.1
+
+
+From 6e11470e88462a657f5a9de27fe3d1f750fce366 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 16:58:46 -0700
+Subject: [PATCH 17/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for resolve_lmhosts_file_as_sockaddr().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 7f105abd402..319ae952d7f 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2703,15 +2703,16 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			status = resolve_lmhosts_file_as_sockaddr(
+ 				get_dyn_LMHOSTSFILE(), name, name_type,
+ 				talloc_tos(), &ss_list, return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				if (!convert_ss2service(return_iplist,
+-							ss_list,
+-							return_count)) {
+-					status = NT_STATUS_NO_MEMORY;
+-					goto fail;
+-				}
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
++			}
++			if (!convert_ss2service(return_iplist,
++						ss_list,
++						return_count)) {
++				status = NT_STATUS_NO_MEMORY;
++				goto fail;
+ 			}
++			goto done;
+ 		} else if (strequal(tok, "wins")) {
+ 			/* don't resolve 1D via WINS */
+ 			struct sockaddr_storage *ss_list;
+-- 
+2.20.1
+
+
+From bab5e02b1623b5c24a88a588cce22dcf9a5babde Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 16:59:38 -0700
+Subject: [PATCH 18/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for 0x1D name in resolve_wins().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 319ae952d7f..95d17b6ebea 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2716,20 +2716,21 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if (strequal(tok, "wins")) {
+ 			/* don't resolve 1D via WINS */
+ 			struct sockaddr_storage *ss_list;
+-			if (name_type != 0x1D) {
+-				status = resolve_wins(name, name_type,
+-						      talloc_tos(),
+-						      &ss_list,
+-						      return_count);
+-				if (NT_STATUS_IS_OK(status)) {
+-					if (!convert_ss2service(return_iplist,
+-								ss_list,
+-								return_count)) {
+-						status = NT_STATUS_NO_MEMORY;
+-						goto fail;
+-					}
+-					goto done;
++			if (name_type == 0x1D) {
++				continue;
++			}
++			status = resolve_wins(name, name_type,
++					      talloc_tos(),
++					      &ss_list,
++					      return_count);
++			if (NT_STATUS_IS_OK(status)) {
++				if (!convert_ss2service(return_iplist,
++							ss_list,
++							return_count)) {
++					status = NT_STATUS_NO_MEMORY;
++					goto fail;
+ 				}
++				goto done;
+ 			}
+ 		} else if (strequal(tok, "bcast")) {
+ 			struct sockaddr_storage *ss_list;
+-- 
+2.20.1
+
+
+From 8562a23690aff9098f100584bc0762c3b3941cb7 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:00:35 -0700
+Subject: [PATCH 19/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for resolve_wins().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 95d17b6ebea..ffc36b0acf5 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2723,15 +2723,16 @@ NTSTATUS internal_resolve_name(const char *name,
+ 					      talloc_tos(),
+ 					      &ss_list,
+ 					      return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				if (!convert_ss2service(return_iplist,
+-							ss_list,
+-							return_count)) {
+-					status = NT_STATUS_NO_MEMORY;
+-					goto fail;
+-				}
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
++			}
++			if (!convert_ss2service(return_iplist,
++						ss_list,
++						return_count)) {
++				status = NT_STATUS_NO_MEMORY;
++				goto fail;
+ 			}
++			goto done;
+ 		} else if (strequal(tok, "bcast")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = name_resolve_bcast(
+-- 
+2.20.1
+
+
+From 748afd2d3770e0946034c1fe52734556b31ebf86 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:01:04 -0700
+Subject: [PATCH 20/62] s3: libsmb: Cleanup - change to early continue in
+ internal_resolve_name() for name_resolve_bcast().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index ffc36b0acf5..9b459c58b18 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2738,15 +2738,16 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			status = name_resolve_bcast(
+ 				name, name_type, talloc_tos(),
+ 				&ss_list, return_count);
+-			if (NT_STATUS_IS_OK(status)) {
+-				if (!convert_ss2service(return_iplist,
+-							ss_list,
+-							return_count)) {
+-					status = NT_STATUS_NO_MEMORY;
+-					goto fail;
+-				}
+-				goto done;
++			if (!NT_STATUS_IS_OK(status)) {
++				continue;
+ 			}
++			if (!convert_ss2service(return_iplist,
++						ss_list,
++						return_count)) {
++				status = NT_STATUS_NO_MEMORY;
++				goto fail;
++			}
++			goto done;
+ 		} else {
+ 			DEBUG(0,("resolve_name: unknown name switch type %s\n",
+ 				tok));
+-- 
+2.20.1
+
+
+From 00a60fbfecc02e4694b979d995387ab384cb9cbe Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:02:15 -0700
+Subject: [PATCH 21/62] s3: libsmb: Cleanup - use helper 'ok' bool for
+ resolve_hosts().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 9b459c58b18..a0607269eb4 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2583,6 +2583,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 	const char *tok;
+ 	NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+ 	int i;
++	bool ok;
+ 	TALLOC_CTX *frame = NULL;
+ 
+ 	*return_iplist = NULL;
+@@ -2670,9 +2671,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			if (!convert_ss2service(return_iplist,
++			ok = convert_ss2service(return_iplist,
+ 						ss_list,
+-						return_count)) {
++						return_count);
++			if (!ok) {
+ 				status = NT_STATUS_NO_MEMORY;
+ 				goto fail;
+ 			}
+-- 
+2.20.1
+
+
+From 189bfcf7ac15883eeb3a6533096d73182f294654 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:03:21 -0700
+Subject: [PATCH 22/62] s3: libsmb: Cleanup - use helper 'ok' bool for
+ resolve_lmhosts_file_as_sockaddr().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index a0607269eb4..ce8f8f30ded 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2728,9 +2728,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			if (!convert_ss2service(return_iplist,
++			ok = convert_ss2service(return_iplist,
+ 						ss_list,
+-						return_count)) {
++						return_count);
++			if (!ok) {
+ 				status = NT_STATUS_NO_MEMORY;
+ 				goto fail;
+ 			}
+-- 
+2.20.1
+
+
+From 319ce53000106a8c352b2fadd2dcc4c4c1f4a9c9 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:04:57 -0700
+Subject: [PATCH 23/62] s3: libsmb: Cleanup - use helper 'ok' bool for
+ resolve_wins().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index ce8f8f30ded..3cc8e3e3f1b 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2744,9 +2744,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			if (!convert_ss2service(return_iplist,
++			ok = convert_ss2service(return_iplist,
+ 						ss_list,
+-						return_count)) {
++						return_count);
++			if (!ok) {
+ 				status = NT_STATUS_NO_MEMORY;
+ 				goto fail;
+ 			}
+-- 
+2.20.1
+
+
+From a8d3324b02622f8b8c9126968c14297b2da716f5 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:05:27 -0700
+Subject: [PATCH 24/62] s3: libsmb: Cleanup - use helper 'ok' bool for
+ name_resolve_bcast().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 3cc8e3e3f1b..b58d79e2e9d 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2708,9 +2708,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			if (!convert_ss2service(return_iplist,
++			ok = convert_ss2service(return_iplist,
+ 						ss_list,
+-						return_count)) {
++						return_count);
++			if (!ok) {
+ 				status = NT_STATUS_NO_MEMORY;
+ 				goto fail;
+ 			}
+-- 
+2.20.1
+
+
+From a8bd335d8de41f86ece4cdc9a9fc94d469ad415d Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:27:13 -0700
+Subject: [PATCH 25/62] s3: libsmb: Cleanup - use helper 'ok' bool for
+ internal_resolve_name().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index b58d79e2e9d..59643fa52d8 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2603,8 +2603,9 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		(*return_iplist)->port = PORT_NONE;
+ 
+ 		/* if it's in the form of an IP address then get the lib to interpret it */
+-		if (!interpret_string_addr(&(*return_iplist)->ss,
+-					name, AI_NUMERICHOST)) {
++		ok = interpret_string_addr(&(*return_iplist)->ss,
++					name, AI_NUMERICHOST);
++		if (!ok) {
+ 			DEBUG(1,("internal_resolve_name: interpret_string_addr "
+ 				"failed on %s\n",
+ 				name));
+-- 
+2.20.1
+
+
+From 3418e1c6e76b82ad9d02a9b67f12c6dac4736e56 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:28:41 -0700
+Subject: [PATCH 26/62] s3: libsmb: Cleanup - split allocation and NULL check
+ in internal_resolve_name().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 59643fa52d8..6886d0b3b2a 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2593,8 +2593,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			name, name_type, sitename ? sitename : "(null)"));
+ 
+ 	if (is_ipaddress(name)) {
+-		if ((*return_iplist = SMB_MALLOC_P(struct ip_service)) ==
+-				NULL) {
++		*return_iplist = SMB_MALLOC_P(struct ip_service);
++		if (*return_iplist == NULL) {
+ 			DEBUG(0,("internal_resolve_name: malloc fail !\n"));
+ 			return NT_STATUS_NO_MEMORY;
+ 		}
+-- 
+2.20.1
+
+
+From 9d4ed68695a37ba04a908f99718b8bd9d11f864b Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:32:47 -0700
+Subject: [PATCH 27/62] s3: libsmb: Cleanup - modernize DEBUG -> DBG_ in
+ internal_resolve_name()
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 6886d0b3b2a..f69ad676bb8 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2589,13 +2589,13 @@ NTSTATUS internal_resolve_name(const char *name,
+ 	*return_iplist = NULL;
+ 	*return_count = 0;
+ 
+-	DEBUG(10, ("internal_resolve_name: looking up %s#%x (sitename %s)\n",
+-			name, name_type, sitename ? sitename : "(null)"));
++	DBG_DEBUG("looking up %s#%x (sitename %s)\n",
++		name, name_type, sitename ? sitename : "(null)");
+ 
+ 	if (is_ipaddress(name)) {
+ 		*return_iplist = SMB_MALLOC_P(struct ip_service);
+ 		if (*return_iplist == NULL) {
+-			DEBUG(0,("internal_resolve_name: malloc fail !\n"));
++			DBG_ERR("malloc fail !\n");
+ 			return NT_STATUS_NO_MEMORY;
+ 		}
+ 
+@@ -2606,9 +2606,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		ok = interpret_string_addr(&(*return_iplist)->ss,
+ 					name, AI_NUMERICHOST);
+ 		if (!ok) {
+-			DEBUG(1,("internal_resolve_name: interpret_string_addr "
+-				"failed on %s\n",
+-				name));
++			DBG_WARNING("interpret_string_addr failed on %s\n",
++				name);
+ 			SAFE_FREE(*return_iplist);
+ 			return NT_STATUS_INVALID_PARAMETER;
+ 		}
+@@ -2636,7 +2635,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 	/* set the name resolution order */
+ 
+ 	if (resolve_order && strcmp(resolve_order[0], "NULL") == 0) {
+-		DEBUG(8,("internal_resolve_name: all lookups disabled\n"));
++		DBG_DEBUG("all lookups disabled\n");
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+@@ -2755,8 +2754,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			}
+ 			goto done;
+ 		} else {
+-			DEBUG(0,("resolve_name: unknown name switch type %s\n",
+-				tok));
++			DBG_ERR("unknown name switch type %s\n",
++				tok);
+ 		}
+ 	}
+ 
+@@ -2800,8 +2799,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 	/* Display some debugging info */
+ 
+ 	if ( DEBUGLEVEL >= 10 ) {
+-		DEBUG(10, ("internal_resolve_name: returning %d addresses: ",
+-					*return_count));
++		DBG_DEBUG("returning %d addresses: ",
++				*return_count);
+ 
+ 		for (i = 0; i < *return_count; i++) {
+ 			char addr[INET6_ADDRSTRLEN];
+-- 
+2.20.1
+
+
+From b0e6744808122e2bdaab4ed57ab1a44699411ab3 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:35:22 -0700
+Subject: [PATCH 28/62] s3: libsmb: Cleanup - Remove incorrect comment in
+ resolve_ads(). The DNS code copes fine with IPv6 addresses.
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index f69ad676bb8..a71cab8e1bf 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2387,7 +2387,6 @@ static NTSTATUS resolve_ads(const char *name,
+ 		return NT_STATUS_NO_MEMORY;
+ 	}
+ 
+-	/* The DNS code needs fixing to find IPv6 addresses... JRA. */
+ 	switch (name_type) {
+ 		case 0x1b:
+ 			DEBUG(5,("resolve_ads: Attempting to resolve "
+-- 
+2.20.1
+
+
+From 576f5a541c858936354560b6f120b7e5f42ee848 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:38:20 -0700
+Subject: [PATCH 29/62] s3: libsmb: Cleanup - reformatting resolve_hosts()
+ parameters inside internal_resolve_name().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index a71cab8e1bf..8c570cebe70 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2664,8 +2664,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 
+ 		if((strequal(tok, "host") || strequal(tok, "hosts"))) {
+ 			struct sockaddr_storage *ss_list;
+-			status = resolve_hosts(name, name_type,
+-					       talloc_tos(), &ss_list,
++			status = resolve_hosts(name,
++					       name_type,
++					       talloc_tos(),
++					       &ss_list,
+ 					       return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+-- 
+2.20.1
+
+
+From 539e00d0673877e61715ae2aea7e4161091efb0d Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:39:33 -0700
+Subject: [PATCH 30/62] s3: libsmb: Cleanup - reformatting resolve_ads()
+ parameters inside internal_resolve_name().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 8c570cebe70..16fa764ec65 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2683,8 +2683,11 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+ 			 * This will result in a SRV record lookup */
+-			status = resolve_ads(name, KDC_NAME_TYPE, sitename,
+-					     return_iplist, return_count);
++			status = resolve_ads(name,
++					     KDC_NAME_TYPE,
++					     sitename,
++					     return_iplist,
++					     return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-- 
+2.20.1
+
+
+From e835d41edf98f294817e90b4d5aea3694d321fc8 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:40:06 -0700
+Subject: [PATCH 31/62] s3: libsmb: Cleanup - reformatting 2nd use of
+ resolve_ads() parameters inside internal_resolve_name().
+
+No logic change.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 16fa764ec65..2a92e530794 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2698,8 +2698,11 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+ 			 * This will result in a SRV record lookup */
+-			status = resolve_ads(name, name_type, sitename,
+-					     return_iplist, return_count);
++			status = resolve_ads(name,
++					     name_type,
++					     sitename,
++					     return_iplist,
++					     return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-- 
+2.20.1
+
+
+From 614e3adeb440f8d45c84bc514412669af3a8760e Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:42:44 -0700
+Subject: [PATCH 32/62] s3: libsmb: Cleanup - reformatting
+ resolve_lmhosts_file_as_sockaddr() parameters inside internal_resolve_name().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 2a92e530794..30c16f349a5 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2710,8 +2710,12 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if (strequal(tok, "lmhosts")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = resolve_lmhosts_file_as_sockaddr(
+-				get_dyn_LMHOSTSFILE(), name, name_type,
+-				talloc_tos(), &ss_list, return_count);
++				get_dyn_LMHOSTSFILE(),
++				name,
++				name_type,
++				talloc_tos(),
++				&ss_list,
++				return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-- 
+2.20.1
+
+
+From d4757917dc5db5aa0cd24e229cb4165cc3fe0916 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:43:26 -0700
+Subject: [PATCH 33/62] s3: libsmb: Cleanup - reformatting resolve_wins()
+ parameters inside internal_resolve_name().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 30c16f349a5..bd20864a2a9 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2733,7 +2733,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (name_type == 0x1D) {
+ 				continue;
+ 			}
+-			status = resolve_wins(name, name_type,
++			status = resolve_wins(name,
++					      name_type,
+ 					      talloc_tos(),
+ 					      &ss_list,
+ 					      return_count);
+-- 
+2.20.1
+
+
+From acc88b09ae06d2aa8dc58d742fbd07fb4ea4de85 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:44:03 -0700
+Subject: [PATCH 34/62] s3: libsmb: Cleanup - reformatting name_resolve_bcast()
+ parameters inside internal_resolve_name().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index bd20864a2a9..1f3eba9f294 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2752,8 +2752,11 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if (strequal(tok, "bcast")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = name_resolve_bcast(
+-				name, name_type, talloc_tos(),
+-				&ss_list, return_count);
++						name,
++						name_type,
++						talloc_tos(),
++						&ss_list,
++						return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-- 
+2.20.1
+
+
+From 69e508f79e0782ff5547007773978a861096388c Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:45:44 -0700
+Subject: [PATCH 35/62] s3: libsmb: Cleanup - put talloc parameter first in
+ resolve_hosts().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 1f3eba9f294..2e5ecc0fb62 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2274,8 +2274,9 @@ fail:
+  Resolve via "hosts" method.
+ *********************************************************/
+ 
+-static NTSTATUS resolve_hosts(const char *name, int name_type,
+-			      TALLOC_CTX *mem_ctx,
++static NTSTATUS resolve_hosts(TALLOC_CTX *mem_ctx,
++			      const char *name,
++			      int name_type,
+ 			      struct sockaddr_storage **return_iplist,
+ 			      int *return_count)
+ {
+@@ -2664,9 +2665,9 @@ NTSTATUS internal_resolve_name(const char *name,
+ 
+ 		if((strequal(tok, "host") || strequal(tok, "hosts"))) {
+ 			struct sockaddr_storage *ss_list;
+-			status = resolve_hosts(name,
++			status = resolve_hosts(talloc_tos(),
++					       name,
+ 					       name_type,
+-					       talloc_tos(),
+ 					       &ss_list,
+ 					       return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+-- 
+2.20.1
+
+
+From d018b490a6a6c8b011a899d4fe4d2655d91d70ae Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:50:21 -0700
+Subject: [PATCH 36/62] s3/s4: Cleanup. Move TALLOC_CTX * parameter to be first
+ in resolve_lmhosts_file_as_sockaddr() to match modern conventions.
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ libcli/nbt/libnbt.h              | 7 ++++---
+ libcli/nbt/lmhosts.c             | 7 ++++---
+ source3/libsmb/namequery.c       | 2 +-
+ source4/libcli/resolve/lmhosts.c | 8 ++++++--
+ 4 files changed, 15 insertions(+), 9 deletions(-)
+
+diff --git a/libcli/nbt/libnbt.h b/libcli/nbt/libnbt.h
+index f7212789897..496b2b91783 100644
+--- a/libcli/nbt/libnbt.h
++++ b/libcli/nbt/libnbt.h
+@@ -367,9 +367,10 @@ bool getlmhostsent(TALLOC_CTX *ctx, FILE *fp, char **pp_name, int *name_type,
+ 		   struct sockaddr_storage *pss);
+ void endlmhosts(FILE *fp);
+ 
+-NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file, 
+-					  const char *name, int name_type,
+-					  TALLOC_CTX *mem_ctx, 
++NTSTATUS resolve_lmhosts_file_as_sockaddr(TALLOC_CTX *mem_ctx,
++					  const char *lmhosts_file,
++					  const char *name,
++					  int name_type,
+ 					  struct sockaddr_storage **return_iplist,
+ 					  int *return_count);
+ 
+diff --git a/libcli/nbt/lmhosts.c b/libcli/nbt/lmhosts.c
+index f47d8b9804f..0890c0407d3 100644
+--- a/libcli/nbt/lmhosts.c
++++ b/libcli/nbt/lmhosts.c
+@@ -159,9 +159,10 @@ void endlmhosts(FILE *fp)
+  Resolve via "lmhosts" method.
+ *********************************************************/
+ 
+-NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file,
+-					  const char *name, int name_type,
+-					  TALLOC_CTX *mem_ctx,
++NTSTATUS resolve_lmhosts_file_as_sockaddr(TALLOC_CTX *mem_ctx,
++					  const char *lmhosts_file,
++					  const char *name,
++					  int name_type,
+ 					  struct sockaddr_storage **return_iplist,
+ 					  int *return_count)
+ {
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 2e5ecc0fb62..0edab06fff9 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2711,10 +2711,10 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if (strequal(tok, "lmhosts")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = resolve_lmhosts_file_as_sockaddr(
++				talloc_tos(),
+ 				get_dyn_LMHOSTSFILE(),
+ 				name,
+ 				name_type,
+-				talloc_tos(),
+ 				&ss_list,
+ 				return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+diff --git a/source4/libcli/resolve/lmhosts.c b/source4/libcli/resolve/lmhosts.c
+index 400cf79f68b..42bdaf962f9 100644
+--- a/source4/libcli/resolve/lmhosts.c
++++ b/source4/libcli/resolve/lmhosts.c
+@@ -68,8 +68,12 @@ static struct composite_context *resolve_name_lmhosts_send(
+ 	if (composite_nomem(state, c)) return c;
+ 	c->private_data = state;
+ 
+-	c->status = resolve_lmhosts_file_as_sockaddr(dyn_LMHOSTSFILE, name->name, name->type,
+-						     state, &resolved_iplist, &resolved_count);
++	c->status = resolve_lmhosts_file_as_sockaddr(state,
++						     dyn_LMHOSTSFILE,
++						     name->name,
++						     name->type,
++						     &resolved_iplist,
++						     &resolved_count);
+ 	if (!composite_is_ok(c)) return c;
+ 
+ 	for (i=0; i < resolved_count; i++) {
+-- 
+2.20.1
+
+
+From a2725badf688ca9907bdf730a66090e695b10115 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:53:28 -0700
+Subject: [PATCH 37/62] s3: libsmb: Cleanup - put talloc parameter first in
+ resolve_wins().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 8 ++++----
+ source3/libsmb/namequery.h | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 0edab06fff9..824f80e6b29 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2242,9 +2242,9 @@ NTSTATUS resolve_wins_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+  Resolve via "wins" method.
+ *********************************************************/
+ 
+-NTSTATUS resolve_wins(const char *name,
++NTSTATUS resolve_wins(TALLOC_CTX *mem_ctx,
++		const char *name,
+ 		int name_type,
+-		TALLOC_CTX *mem_ctx,
+ 		struct sockaddr_storage **return_iplist,
+ 		int *return_count)
+ {
+@@ -2734,9 +2734,9 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (name_type == 0x1D) {
+ 				continue;
+ 			}
+-			status = resolve_wins(name,
++			status = resolve_wins(talloc_tos(),
++					      name,
+ 					      name_type,
+-					      talloc_tos(),
+ 					      &ss_list,
+ 					      return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+diff --git a/source3/libsmb/namequery.h b/source3/libsmb/namequery.h
+index d7bd4d338b4..7e31dc1b632 100644
+--- a/source3/libsmb/namequery.h
++++ b/source3/libsmb/namequery.h
+@@ -80,9 +80,9 @@ struct tevent_req *resolve_wins_send(TALLOC_CTX *mem_ctx,
+ NTSTATUS resolve_wins_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ 			   struct sockaddr_storage **addrs,
+ 			   int *num_addrs, uint8_t *flags);
+-NTSTATUS resolve_wins(const char *name,
++NTSTATUS resolve_wins(TALLOC_CTX *mem_ctx,
++		const char *name,
+ 		int name_type,
+-		TALLOC_CTX *mem_ctx,
+ 		struct sockaddr_storage **return_iplist,
+ 		int *return_count);
+ NTSTATUS internal_resolve_name(const char *name,
+-- 
+2.20.1
+
+
+From 2bb6bac68899c19d1fe0034cf66b8540eefe2022 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:56:48 -0700
+Subject: [PATCH 38/62] s3: libsmb: Cleanup - put talloc parameter first in
+ name_resolve_bcast().
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/cliconnect.c | 7 +++++--
+ source3/libsmb/libsmb_dir.c | 7 +++++--
+ source3/libsmb/namequery.c  | 6 +++---
+ source3/libsmb/namequery.h  | 4 ++--
+ source3/utils/nmblookup.c   | 8 +++++---
+ 5 files changed, 20 insertions(+), 12 deletions(-)
+
+diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
+index 3df35931bb6..51ca424e206 100644
+--- a/source3/libsmb/cliconnect.c
++++ b/source3/libsmb/cliconnect.c
+@@ -3896,8 +3896,11 @@ struct cli_state *get_ipc_connect_master_ip_bcast(TALLOC_CTX *ctx,
+ 
+         /* Go looking for workgroups by broadcasting on the local network */
+ 
+-	status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
+-				    &ip_list, &count);
++	status = name_resolve_bcast(talloc_tos(),
++				MSBROWSE,
++				1,
++				&ip_list,
++				&count);
+         if (!NT_STATUS_IS_OK(status)) {
+                 DEBUG(99, ("No master browsers responded: %s\n",
+ 			   nt_errstr(status)));
+diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c
+index fd42c71b2b8..506bfc56865 100644
+--- a/source3/libsmb/libsmb_dir.c
++++ b/source3/libsmb/libsmb_dir.c
+@@ -599,8 +599,11 @@ SMBC_opendir_ctx(SMBCCTX *context,
+                  */
+ 
+                 ip_list = NULL;
+-		status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
+-					    &ip_list, &count);
++		status = name_resolve_bcast(talloc_tos(),
++					    MSBROWSE,
++					    1,
++					    &ip_list,
++					    &count);
+                 if (!NT_STATUS_IS_OK(status))
+ 		{
+ 
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 824f80e6b29..dde49c84d2d 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -1899,9 +1899,9 @@ NTSTATUS name_resolve_bcast_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ 	return NT_STATUS_OK;
+ }
+ 
+-NTSTATUS name_resolve_bcast(const char *name,
++NTSTATUS name_resolve_bcast(TALLOC_CTX *mem_ctx,
++			const char *name,
+ 			int name_type,
+-			TALLOC_CTX *mem_ctx,
+ 			struct sockaddr_storage **return_iplist,
+ 			int *return_count)
+ {
+@@ -2753,9 +2753,9 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if (strequal(tok, "bcast")) {
+ 			struct sockaddr_storage *ss_list;
+ 			status = name_resolve_bcast(
++						talloc_tos(),
+ 						name,
+ 						name_type,
+-						talloc_tos(),
+ 						&ss_list,
+ 						return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+diff --git a/source3/libsmb/namequery.h b/source3/libsmb/namequery.h
+index 7e31dc1b632..aedb043ac81 100644
+--- a/source3/libsmb/namequery.h
++++ b/source3/libsmb/namequery.h
+@@ -68,9 +68,9 @@ struct tevent_req *name_resolve_bcast_send(TALLOC_CTX *mem_ctx,
+ NTSTATUS name_resolve_bcast_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ 				 struct sockaddr_storage **addrs,
+ 				 int *num_addrs);
+-NTSTATUS name_resolve_bcast(const char *name,
++NTSTATUS name_resolve_bcast(TALLOC_CTX *mem_ctx,
++			const char *name,
+ 			int name_type,
+-			TALLOC_CTX *mem_ctx,
+ 			struct sockaddr_storage **return_iplist,
+ 			int *return_count);
+ struct tevent_req *resolve_wins_send(TALLOC_CTX *mem_ctx,
+diff --git a/source3/utils/nmblookup.c b/source3/utils/nmblookup.c
+index c74b6497a35..2f50c5c8f5a 100644
+--- a/source3/utils/nmblookup.c
++++ b/source3/utils/nmblookup.c
+@@ -171,9 +171,11 @@ static bool query_one(const char *lookup, unsigned int lookup_type)
+ 				    &bcast_addr, talloc_tos(),
+ 				    &ip_list, &count, &flags);
+ 	} else {
+-		status = name_resolve_bcast(
+-			lookup, lookup_type,
+-			talloc_tos(), &ip_list, &count);
++		status = name_resolve_bcast(talloc_tos(),
++					    lookup,
++					    lookup_type,
++					    &ip_list,
++					    &count);
+ 	}
+ 
+ 	if (!NT_STATUS_IS_OK(status)) {
+-- 
+2.20.1
+
+
+From 2389720023132ba663fc09d911e3e2b120974238 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 20:27:38 -0700
+Subject: [PATCH 39/62] s3: libsmb: Cleanup - ensure ss_list variables are
+ initialized with NULL.
+
+No logic changes.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index dde49c84d2d..01a2bacb9eb 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2664,7 +2664,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		tok = resolve_order[i];
+ 
+ 		if((strequal(tok, "host") || strequal(tok, "hosts"))) {
+-			struct sockaddr_storage *ss_list;
++			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_hosts(talloc_tos(),
+ 					       name,
+ 					       name_type,
+@@ -2709,7 +2709,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			}
+ 			goto done;
+ 		} else if (strequal(tok, "lmhosts")) {
+-			struct sockaddr_storage *ss_list;
++			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_lmhosts_file_as_sockaddr(
+ 				talloc_tos(),
+ 				get_dyn_LMHOSTSFILE(),
+@@ -2730,7 +2730,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			goto done;
+ 		} else if (strequal(tok, "wins")) {
+ 			/* don't resolve 1D via WINS */
+-			struct sockaddr_storage *ss_list;
++			struct sockaddr_storage *ss_list = NULL;
+ 			if (name_type == 0x1D) {
+ 				continue;
+ 			}
+@@ -2751,7 +2751,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			}
+ 			goto done;
+ 		} else if (strequal(tok, "bcast")) {
+-			struct sockaddr_storage *ss_list;
++			struct sockaddr_storage *ss_list = NULL;
+ 			status = name_resolve_bcast(
+ 						talloc_tos(),
+ 						name,
+-- 
+2.20.1
+
+
+From 7d7d9e9769c4bf466bcf69bd5ffe2993d7d3d2c9 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 17:59:20 -0700
+Subject: [PATCH 40/62] s3: libsmb: Pass in TALLOC_CTX * parameter to
+ resolve_ads() instead of creating one internally.
+
+Pass in talloc_tos() to make it match the other resolve_XXX() functions.
+
+No memory leaks as this is used for transient data and is cleaned up
+when the calling frame in internal_resolve_name() is destroyed.
+
+Preparing to have it return a talloc'ed struct sockaddr_storage array
+rather than a malloc'ed struct ip_service array.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 20 ++++++--------------
+ 1 file changed, 6 insertions(+), 14 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 01a2bacb9eb..519bd1bf181 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2365,7 +2365,8 @@ static NTSTATUS resolve_hosts(TALLOC_CTX *mem_ctx,
+ /* Special name type used to cause a _kerberos DNS lookup. */
+ #define KDC_NAME_TYPE 0xDCDC
+ 
+-static NTSTATUS resolve_ads(const char *name,
++static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
++			    const char *name,
+ 			    int name_type,
+ 			    const char *sitename,
+ 			    struct ip_service **return_iplist,
+@@ -2373,7 +2374,6 @@ static NTSTATUS resolve_ads(const char *name,
+ {
+ 	int 			i;
+ 	NTSTATUS  		status;
+-	TALLOC_CTX		*ctx;
+ 	struct dns_rr_srv	*dcs = NULL;
+ 	int			numdcs = 0;
+ 	int			numaddrs = 0;
+@@ -2383,11 +2383,6 @@ static NTSTATUS resolve_ads(const char *name,
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+-	if ( (ctx = talloc_init("resolve_ads")) == NULL ) {
+-		DEBUG(0,("resolve_ads: talloc_init() failed!\n"));
+-		return NT_STATUS_NO_MEMORY;
+-	}
+-
+ 	switch (name_type) {
+ 		case 0x1b:
+ 			DEBUG(5,("resolve_ads: Attempting to resolve "
+@@ -2422,14 +2417,12 @@ static NTSTATUS resolve_ads(const char *name,
+ 	}
+ 
+ 	if ( !NT_STATUS_IS_OK( status ) ) {
+-		talloc_destroy(ctx);
+ 		return status;
+ 	}
+ 
+ 	if (numdcs == 0) {
+ 		*return_iplist = NULL;
+ 		*return_count = 0;
+-		talloc_destroy(ctx);
+ 		return NT_STATUS_OK;
+ 	}
+ 
+@@ -2445,7 +2438,6 @@ static NTSTATUS resolve_ads(const char *name,
+ 			NULL ) {
+ 		DEBUG(0,("resolve_ads: malloc failed for %d entries\n",
+ 					numaddrs ));
+-		talloc_destroy(ctx);
+ 		return NT_STATUS_NO_MEMORY;
+ 	}
+ 
+@@ -2487,7 +2479,6 @@ static NTSTATUS resolve_ads(const char *name,
+ 					if (res) {
+ 						freeaddrinfo(res);
+ 					}
+-					talloc_destroy(ctx);
+ 					return NT_STATUS_NO_MEMORY;
+ 				}
+ 			}
+@@ -2526,7 +2517,6 @@ static NTSTATUS resolve_ads(const char *name,
+ 		}
+ 	}
+ 
+-	talloc_destroy(ctx);
+ 	return NT_STATUS_OK;
+ }
+ 
+@@ -2684,7 +2674,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+ 			 * This will result in a SRV record lookup */
+-			status = resolve_ads(name,
++			status = resolve_ads(talloc_tos(),
++					     name,
+ 					     KDC_NAME_TYPE,
+ 					     sitename,
+ 					     return_iplist,
+@@ -2699,7 +2690,8 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+ 			 * This will result in a SRV record lookup */
+-			status = resolve_ads(name,
++			status = resolve_ads(talloc_tos(),
++					     name,
+ 					     name_type,
+ 					     sitename,
+ 					     return_iplist,
+-- 
+2.20.1
+
+
+From e3cd273a2e55adbf65cd251353646b45cf34a0be Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 18:31:16 -0700
+Subject: [PATCH 41/62] s3: libsmb: Add in (currently unused) function
+ dns_lookup_list().
+
+This function takes a list of names returned from a DNS SRV
+query which didn't have returned IP addresses and returns an
+array of struct sockaddr_storage.
+
+Currently synchronous, but this is the function that will
+be changed to be asynchronous later.
+
+Compiles but commented out for now so we don't get "unused
+function" warnings.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 83 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 83 insertions(+)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 519bd1bf181..8a274bc5fbc 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2270,6 +2270,89 @@ fail:
+ 	return status;
+ }
+ 
++#if 0
++/********************************************************
++ Resolve a list of DNS names to a list of IP addresses.
++ As this is a DC / LDAP / KDC lookup any IP address will
++ do, the requested names don't have to match the returned
++ IP address list.
++*********************************************************/
++
++static NTSTATUS dns_lookup_list(TALLOC_CTX *ctx,
++				size_t num_dns_names,
++				const char **dns_lookup_names,
++				size_t *p_num_addrs,
++				struct sockaddr_storage **pp_addrs)
++{
++	size_t total_num_addrs = 0;
++	size_t i;
++	struct sockaddr_storage *ret_addrs = NULL;
++
++	/* FIXME - make this asnyc using our async DNS code. */
++
++	for (i = 0; i < num_dns_names; i++ ) {
++		struct addrinfo *res = NULL;
++		struct addrinfo *p = NULL;
++		size_t num_addrs = 0;
++		bool ok = interpret_string_addr_internal(&res,
++					dns_lookup_names[i],
++					0);
++		if (!ok) {
++			continue;
++		}
++		/* Count the IP's returned from the lookup. */
++		for (p = res; p; p = p->ai_next) {
++			num_addrs++;
++		}
++
++		/* Wrap check. */
++		if (total_num_addrs + num_addrs < total_num_addrs) {
++			if (res) {
++				freeaddrinfo(res);
++			}
++			return NT_STATUS_INVALID_PARAMETER;
++		}
++		ret_addrs = talloc_realloc(ctx,
++					   ret_addrs,
++					   struct sockaddr_storage,
++					   total_num_addrs + num_addrs);
++		if (ret_addrs == NULL) {
++			if (res) {
++				freeaddrinfo(res);
++			}
++			return NT_STATUS_NO_MEMORY;
++		}
++
++		for (p = res; p; p = p->ai_next) {
++			char addr[INET6_ADDRSTRLEN];
++
++			memcpy(&ret_addrs[total_num_addrs],
++				p->ai_addr,
++				p->ai_addrlen);
++
++			if (is_zero_addr(&ret_addrs[total_num_addrs])) {
++				continue;
++			}
++
++			DBG_DEBUG("getaddrinfo name %s returned IP %s\n",
++				dns_lookup_names[i],
++				print_sockaddr(addr,
++					sizeof(addr),
++					&ret_addrs[total_num_addrs]));
++
++			total_num_addrs++;
++		}
++		if (res) {
++			freeaddrinfo(res);
++		}
++	}
++
++	*p_num_addrs = total_num_addrs;
++	*pp_addrs = ret_addrs;
++	return NT_STATUS_OK;
++}
++#endif
++
+ /********************************************************
+  Resolve via "hosts" method.
+ *********************************************************/
+-- 
+2.20.1
+
+
+From 6877f2cb238c68e5b2167196824124d0f0c16c6b Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 19:50:04 -0700
+Subject: [PATCH 42/62] s3: libsmb: Rewrite resolve_ads() to use the previously
+ added dns_lookup_list() function.
+
+Clean up internals - a LOT.
+
+This one needs careful review. Ditch the (unused) port returns from
+the SRV replies.
+
+Internally uses talloc'ed arrays of struct sockaddr_storage
+which it then convert to MALLOC'ed struct ip_service.
+
+Still returns struct ip_service but this will be
+fixed in the next commit.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 242 ++++++++++++++++++++++++-------------
+ 1 file changed, 160 insertions(+), 82 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 8a274bc5fbc..842f82264ba 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2270,7 +2270,6 @@ fail:
+ 	return status;
+ }
+ 
+-#if 0
+ /********************************************************
+  Resolve a list of DNS names to a list of IP addresses.
+  As this is a DC / LDAP / KDC lookup any IP address will
+@@ -2351,7 +2350,6 @@ static NTSTATUS dns_lookup_list(TALLOC_CTX *ctx,
+ 	*pp_addrs = ret_addrs;
+ 	return NT_STATUS_OK;
+ }
+-#endif
+ 
+ /********************************************************
+  Resolve via "hosts" method.
+@@ -2460,6 +2458,13 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	struct dns_rr_srv	*dcs = NULL;
+ 	int			numdcs = 0;
+ 	int			numaddrs = 0;
++	size_t num_srv_addrs = 0;
++	struct sockaddr_storage *srv_addrs = NULL;
++	size_t num_dns_addrs = 0;
++	struct sockaddr_storage *dns_addrs = NULL;
++	size_t num_dns_names = 0;
++	const char **dns_lookup_names = NULL;
++	struct ip_service *iplist = NULL;
+ 
+ 	if ((name_type != 0x1c) && (name_type != KDC_NAME_TYPE) &&
+ 	    (name_type != 0x1b)) {
+@@ -2499,107 +2504,180 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 			break;
+ 	}
+ 
+-	if ( !NT_STATUS_IS_OK( status ) ) {
++	if (!NT_STATUS_IS_OK(status)) {
++		TALLOC_FREE(dcs);
+ 		return status;
+ 	}
+ 
+ 	if (numdcs == 0) {
++		TALLOC_FREE(dcs);
+ 		*return_iplist = NULL;
+ 		*return_count = 0;
+ 		return NT_STATUS_OK;
+ 	}
+ 
+-	for (i=0;i<numdcs;i++) {
+-		if (!dcs[i].ss_s) {
+-			numaddrs += 1;
++	/*
++	 * Split the returned values into 2 arrays. First one
++	 * is a struct sockaddr_storage array that contains results
++	 * from the SRV record lookup that contain both hostnames
++	 * and IP addresses. We only need to copy out the IP
++	 * addresses. This is srv_addrs.
++	 *
++	 * Second array contains the results from the SRV record
++	 * lookup that only contain hostnames - no IP addresses.
++	 * We must then call dns_lookup_list() to lookup
++	 * hostnames -> IP address. This is dns_addrs.
++	 *
++	 * Finally we will merge these two arrays to create the
++	 * return ip_service array.
++	 */
++
++	/* First count the sizes of each array. */
++	for(i = 0; i < numdcs; i++) {
++		if (dcs[i].ss_s != NULL) {
++			/* IP address returned in SRV record. */
++			if (num_srv_addrs + dcs[i].num_ips < num_srv_addrs) {
++				/* Wrap check. */
++				TALLOC_FREE(dcs);
++				return NT_STATUS_INVALID_PARAMETER;
++			}
++			/* Add in the number of addresses we got. */
++			num_srv_addrs += dcs[i].num_ips;
++			/*
++			 * If we got any IP addresses zero out
++			 * the hostname so we know we've already
++			 * processed this entry and won't add it
++			 * to the dns_lookup_names array we use
++			 * to do DNS queries below.
++			 */
++			dcs[i].hostname = NULL;
+ 		} else {
+-			numaddrs += dcs[i].num_ips;
++			/* Ensure we have a hostname to lookup. */
++			if (dcs[i].hostname == NULL) {
++				continue;
++			}
++			/* No IP address returned in SRV record. */
++			if (num_dns_names + 1 < num_dns_names) {
++				/* Wrap check. */
++				TALLOC_FREE(dcs);
++				return NT_STATUS_INVALID_PARAMETER;
++			}
++			/* One more name to lookup. */
++			num_dns_names += 1;
+ 		}
+-        }
++	}
+ 
+-	if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, numaddrs)) ==
+-			NULL ) {
+-		DEBUG(0,("resolve_ads: malloc failed for %d entries\n",
+-					numaddrs ));
++	/* Allocate the list of IP addresses we already have. */
++	srv_addrs = talloc_zero_array(ctx,
++				struct sockaddr_storage,
++				num_srv_addrs);
++	if (srv_addrs == NULL) {
++		TALLOC_FREE(dcs);
+ 		return NT_STATUS_NO_MEMORY;
+ 	}
+ 
+-	/* now unroll the list of IP addresses */
+-
+-	*return_count = 0;
++	/* Copy the addresses we already have. */
++	num_srv_addrs = 0;
++	for(i = 0; i < numdcs; i++) {
++		/* Copy all the IP addresses from the SRV response */
++		size_t j;
++		for (j = 0; j < dcs[i].num_ips; j++) {
++			char addr[INET6_ADDRSTRLEN];
+ 
+-	for (i = 0; i < numdcs && (*return_count<numaddrs); i++ ) {
+-		/* If we don't have an IP list for a name, lookup it up */
+-		if (!dcs[i].ss_s) {
+-			/* We need to get all IP addresses here. */
+-			struct addrinfo *res = NULL;
+-			struct addrinfo *p;
+-			int extra_addrs = 0;
+-
+-			if (!interpret_string_addr_internal(&res,
+-						dcs[i].hostname,
+-						0)) {
++			srv_addrs[num_srv_addrs] = dcs[i].ss_s[j];
++			if (is_zero_addr(&srv_addrs[num_srv_addrs])) {
+ 				continue;
+ 			}
+-			/* Add in every IP from the lookup. How
+-			   many is that ? */
+-			for (p = res; p; p = p->ai_next) {
+-				struct sockaddr_storage ss;
+-				memcpy(&ss, p->ai_addr, p->ai_addrlen);
+-				if (is_zero_addr(&ss)) {
+-					continue;
+-				}
+-				extra_addrs++;
+-			}
+-			if (extra_addrs > 1) {
+-				/* We need to expand the return_iplist array
+-				   as we only budgeted for one address. */
+-				numaddrs += (extra_addrs-1);
+-				*return_iplist = SMB_REALLOC_ARRAY(*return_iplist,
+-						struct ip_service,
+-						numaddrs);
+-				if (*return_iplist == NULL) {
+-					if (res) {
+-						freeaddrinfo(res);
+-					}
+-					return NT_STATUS_NO_MEMORY;
+-				}
+-			}
+-			for (p = res; p; p = p->ai_next) {
+-				(*return_iplist)[*return_count].port = dcs[i].port;
+-				memcpy(&(*return_iplist)[*return_count].ss,
+-						p->ai_addr,
+-						p->ai_addrlen);
+-				if (is_zero_addr(&(*return_iplist)[*return_count].ss)) {
+-					continue;
+-				}
+-				(*return_count)++;
+-				/* Should never happen, but still... */
+-				if (*return_count>=numaddrs) {
+-					break;
+-				}
+-			}
+-			if (res) {
+-				freeaddrinfo(res);
+-			}
+-		} else {
+-			/* use all the IP addresses from the SRV response */
+-			size_t j;
+-			for (j = 0; j < dcs[i].num_ips; j++) {
+-				(*return_iplist)[*return_count].port = dcs[i].port;
+-				(*return_iplist)[*return_count].ss = dcs[i].ss_s[j];
+-				if (is_zero_addr(&(*return_iplist)[*return_count].ss)) {
+-					continue;
+-				}
+-                                (*return_count)++;
+-				/* Should never happen, but still... */
+-				if (*return_count>=numaddrs) {
+-					break;
+-				}
+-			}
++
++			DBG_DEBUG("SRV lookup %s got IP[%zu] %s\n",
++				name,
++				j,
++				print_sockaddr(addr,
++					sizeof(addr),
++					&srv_addrs[num_srv_addrs]));
++
++			num_srv_addrs++;
+ 		}
+ 	}
+ 
++	/* Allocate the array of hostnames we must look up. */
++	dns_lookup_names = talloc_zero_array(ctx,
++					const char *,
++					num_dns_names);
++	if (dns_lookup_names == NULL) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(srv_addrs);
++		return NT_STATUS_NO_MEMORY;
++	}
++
++	num_dns_names = 0;
++	for(i = 0; i < numdcs; i++) {
++		if (dcs[i].hostname == NULL) {
++			/*
++			 * Must have been a SRV return with an IP address.
++			 * We don't need to look up this hostname.
++			 */
++			continue;
++                }
++		dns_lookup_names[num_dns_names] = dcs[i].hostname;
++		num_dns_names++;
++	}
++
++	/* Lookup the addresses on the dns_lookup_list. */
++	status = dns_lookup_list(ctx,
++				num_dns_names,
++				dns_lookup_names,
++				&num_dns_addrs,
++				&dns_addrs);
++
++	if (!NT_STATUS_IS_OK(status)) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(srv_addrs);
++		TALLOC_FREE(dns_lookup_names);
++		return status;
++	}
++
++	/*
++	 * Combine the two sockaddr_storage arrays into a MALLOC'ed
++	 * ipservice array return.
++	 */
++
++	numaddrs = num_srv_addrs + num_dns_addrs;
++	/* Wrap check + bloody int conversion check :-(. */
++	if (numaddrs < num_srv_addrs ||
++				numaddrs < 0) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(srv_addrs);
++		TALLOC_FREE(dns_addrs);
++		TALLOC_FREE(dns_lookup_names);
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++
++	iplist = SMB_MALLOC_ARRAY(struct ip_service, numaddrs);
++	if (iplist == NULL) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(srv_addrs);
++		TALLOC_FREE(dns_addrs);
++		TALLOC_FREE(dns_lookup_names);
++		return NT_STATUS_NO_MEMORY;
++	}
++
++	for (i = 0; i < num_srv_addrs; i++) {
++		iplist[i].ss = srv_addrs[i];
++		iplist[i].port = 0;
++	}
++	for (i = 0; i < num_dns_addrs; i++) {
++		iplist[num_srv_addrs+i].ss = dns_addrs[i];
++		iplist[i].port = 0;
++	}
++
++	TALLOC_FREE(dcs);
++	TALLOC_FREE(srv_addrs);
++	TALLOC_FREE(dns_addrs);
++	TALLOC_FREE(dns_lookup_names);
++
++	*return_iplist = iplist;
++	*return_count = numaddrs;
+ 	return NT_STATUS_OK;
+ }
+ 
+-- 
+2.20.1
+
+
+From 1030c9708f6f89de0b6725414c847a68fb40d21a Mon Sep 17 00:00:00 2001
+From: Volker Lendecke <vl@samba.org>
+Date: Wed, 5 Aug 2020 16:22:10 +0200
+Subject: [PATCH 43/62] libsmb: Fix CID 1465656 Resource leak
+
+This is very likely a false positive, because Coverity does not see
+that we only assign "dns_addrs" when NT_STATUS_IS_OK(status), so we
+might not want this. But it is a fresh finding and looks cleaner this
+way.
+
+Signed-off-by: Volker Lendecke <vl@samba.org>
+Reviewed-by: Jeremy Allison <jra@samba.org>
+
+Autobuild-User(master): Jeremy Allison <jra@samba.org>
+Autobuild-Date(master): Thu Aug  6 20:23:53 UTC 2020 on sn-devel-184
+---
+ source3/libsmb/namequery.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 842f82264ba..20c4c115c61 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2634,6 +2634,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 		TALLOC_FREE(dcs);
+ 		TALLOC_FREE(srv_addrs);
+ 		TALLOC_FREE(dns_lookup_names);
++		TALLOC_FREE(dns_addrs);
+ 		return status;
+ 	}
+ 
+-- 
+2.20.1
+
+
+From 2069c53f72654dafa37faf097122dc446af83bda Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 20:17:54 -0700
+Subject: [PATCH 44/62] s3: libsmb: Change resolve_ads() to return a talloc'ed
+ ss_list, matching the other name resolution methods.
+
+Now we can move all the convert_ss2service() calls to one place.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 46 +++++++++++++++++++++++++-------------
+ 1 file changed, 30 insertions(+), 16 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 20c4c115c61..7d6546347a6 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2450,7 +2450,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 			    const char *name,
+ 			    int name_type,
+ 			    const char *sitename,
+-			    struct ip_service **return_iplist,
++			    struct sockaddr_storage **return_addrs,
+ 			    int *return_count)
+ {
+ 	int 			i;
+@@ -2464,7 +2464,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	struct sockaddr_storage *dns_addrs = NULL;
+ 	size_t num_dns_names = 0;
+ 	const char **dns_lookup_names = NULL;
+-	struct ip_service *iplist = NULL;
++	struct sockaddr_storage *ret_addrs = NULL;
+ 
+ 	if ((name_type != 0x1c) && (name_type != KDC_NAME_TYPE) &&
+ 	    (name_type != 0x1b)) {
+@@ -2511,7 +2511,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 
+ 	if (numdcs == 0) {
+ 		TALLOC_FREE(dcs);
+-		*return_iplist = NULL;
++		*return_addrs = NULL;
+ 		*return_count = 0;
+ 		return NT_STATUS_OK;
+ 	}
+@@ -2529,7 +2529,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	 * hostnames -> IP address. This is dns_addrs.
+ 	 *
+ 	 * Finally we will merge these two arrays to create the
+-	 * return ip_service array.
++	 * return sockaddr_storage array.
+ 	 */
+ 
+ 	/* First count the sizes of each array. */
+@@ -2639,9 +2639,9 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	}
+ 
+ 	/*
+-	 * Combine the two sockaddr_storage arrays into a MALLOC'ed
+-	 * ipservice array return.
+-	 */
++	 * Combine the two sockaddr_storage arrays into a talloc'ed
++	 * struct sockaddr_storage array return.
++         */
+ 
+ 	numaddrs = num_srv_addrs + num_dns_addrs;
+ 	/* Wrap check + bloody int conversion check :-(. */
+@@ -2654,8 +2654,10 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+-	iplist = SMB_MALLOC_ARRAY(struct ip_service, numaddrs);
+-	if (iplist == NULL) {
++	ret_addrs = talloc_zero_array(ctx,
++				struct sockaddr_storage,
++				numaddrs);
++	if (ret_addrs == NULL) {
+ 		TALLOC_FREE(dcs);
+ 		TALLOC_FREE(srv_addrs);
+ 		TALLOC_FREE(dns_addrs);
+@@ -2664,12 +2666,10 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	}
+ 
+ 	for (i = 0; i < num_srv_addrs; i++) {
+-		iplist[i].ss = srv_addrs[i];
+-		iplist[i].port = 0;
++		ret_addrs[i] = srv_addrs[i];
+ 	}
+ 	for (i = 0; i < num_dns_addrs; i++) {
+-		iplist[num_srv_addrs+i].ss = dns_addrs[i];
+-		iplist[i].port = 0;
++		ret_addrs[num_srv_addrs+i] = dns_addrs[i];
+ 	}
+ 
+ 	TALLOC_FREE(dcs);
+@@ -2677,7 +2677,7 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	TALLOC_FREE(dns_addrs);
+ 	TALLOC_FREE(dns_lookup_names);
+ 
+-	*return_iplist = iplist;
++	*return_addrs = ret_addrs;
+ 	*return_count = numaddrs;
+ 	return NT_STATUS_OK;
+ }
+@@ -2836,11 +2836,12 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+ 			 * This will result in a SRV record lookup */
++			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_ads(talloc_tos(),
+ 					     name,
+ 					     KDC_NAME_TYPE,
+ 					     sitename,
+-					     return_iplist,
++					     &ss_list,
+ 					     return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+@@ -2848,19 +2849,32 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			/* Ensure we don't namecache
+ 			 * this with the KDC port. */
+ 			name_type = KDC_NAME_TYPE;
++			ok = convert_ss2service(return_iplist,
++						ss_list,
++						return_count);
++			if (!ok) {
++				status = NT_STATUS_NO_MEMORY;
++			}
+ 			goto done;
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+ 			 * This will result in a SRV record lookup */
++			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_ads(talloc_tos(),
+ 					     name,
+ 					     name_type,
+ 					     sitename,
+-					     return_iplist,
++					     &ss_list,
+ 					     return_count);
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
++			ok = convert_ss2service(return_iplist,
++						ss_list,
++						return_count);
++			if (!ok) {
++				status = NT_STATUS_NO_MEMORY;
++			}
+ 			goto done;
+ 		} else if (strequal(tok, "lmhosts")) {
+ 			struct sockaddr_storage *ss_list = NULL;
+-- 
+2.20.1
+
+
+From f095cad5543cde98d700b4e1c84e4544565f6ddb Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 20:40:02 -0700
+Subject: [PATCH 45/62] s3: libsmb: Now all resolution functions return a
+ ss_list on success, we only need one local variable for this.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 7d6546347a6..5a25df56e18 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2736,6 +2736,7 @@ NTSTATUS internal_resolve_name(const char *name,
+ 	NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+ 	int i;
+ 	bool ok;
++	struct sockaddr_storage *ss_list = NULL;
+ 	TALLOC_CTX *frame = NULL;
+ 
+ 	*return_iplist = NULL;
+@@ -2816,7 +2817,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		tok = resolve_order[i];
+ 
+ 		if((strequal(tok, "host") || strequal(tok, "hosts"))) {
+-			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_hosts(talloc_tos(),
+ 					       name,
+ 					       name_type,
+@@ -2836,7 +2836,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+ 			 * This will result in a SRV record lookup */
+-			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_ads(talloc_tos(),
+ 					     name,
+ 					     KDC_NAME_TYPE,
+@@ -2859,7 +2858,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+ 			 * This will result in a SRV record lookup */
+-			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_ads(talloc_tos(),
+ 					     name,
+ 					     name_type,
+@@ -2877,7 +2875,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			}
+ 			goto done;
+ 		} else if (strequal(tok, "lmhosts")) {
+-			struct sockaddr_storage *ss_list = NULL;
+ 			status = resolve_lmhosts_file_as_sockaddr(
+ 				talloc_tos(),
+ 				get_dyn_LMHOSTSFILE(),
+@@ -2898,7 +2895,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			goto done;
+ 		} else if (strequal(tok, "wins")) {
+ 			/* don't resolve 1D via WINS */
+-			struct sockaddr_storage *ss_list = NULL;
+ 			if (name_type == 0x1D) {
+ 				continue;
+ 			}
+@@ -2919,7 +2915,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			}
+ 			goto done;
+ 		} else if (strequal(tok, "bcast")) {
+-			struct sockaddr_storage *ss_list = NULL;
+ 			status = name_resolve_bcast(
+ 						talloc_tos(),
+ 						name,
+-- 
+2.20.1
+
+
+From 60de921ecd5f09cc81b6353d8f84aaa3896b5ffd Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 20 Jul 2020 20:52:58 -0700
+Subject: [PATCH 46/62] s3: libsmb: Move all calls to convert_ss2service() to
+ one place now all methods return a sockaddr_storage.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 50 ++++++--------------------------------
+ 1 file changed, 8 insertions(+), 42 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 5a25df56e18..6fab3d318e4 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2825,13 +2825,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-				goto fail;
+-			}
+ 			goto done;
+ 		} else if(strequal( tok, "kdc")) {
+ 			/* deal with KDC_NAME_TYPE names here.
+@@ -2848,12 +2841,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			/* Ensure we don't namecache
+ 			 * this with the KDC port. */
+ 			name_type = KDC_NAME_TYPE;
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-			}
+ 			goto done;
+ 		} else if(strequal( tok, "ads")) {
+ 			/* deal with 0x1c and 0x1b names here.
+@@ -2867,12 +2854,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-			}
+ 			goto done;
+ 		} else if (strequal(tok, "lmhosts")) {
+ 			status = resolve_lmhosts_file_as_sockaddr(
+@@ -2885,13 +2866,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-				goto fail;
+-			}
+ 			goto done;
+ 		} else if (strequal(tok, "wins")) {
+ 			/* don't resolve 1D via WINS */
+@@ -2906,13 +2880,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-				goto fail;
+-			}
+ 			goto done;
+ 		} else if (strequal(tok, "bcast")) {
+ 			status = name_resolve_bcast(
+@@ -2924,13 +2891,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 			if (!NT_STATUS_IS_OK(status)) {
+ 				continue;
+ 			}
+-			ok = convert_ss2service(return_iplist,
+-						ss_list,
+-						return_count);
+-			if (!ok) {
+-				status = NT_STATUS_NO_MEMORY;
+-				goto fail;
+-			}
+ 			goto done;
+ 		} else {
+ 			DBG_ERR("unknown name switch type %s\n",
+@@ -2940,8 +2900,6 @@ NTSTATUS internal_resolve_name(const char *name,
+ 
+ 	/* All of the resolve_* functions above have returned false. */
+ 
+-  fail:
+-
+ 	TALLOC_FREE(frame);
+ 	SAFE_FREE(*return_iplist);
+ 	*return_count = 0;
+@@ -2950,6 +2908,14 @@ NTSTATUS internal_resolve_name(const char *name,
+ 
+   done:
+ 
++	ok = convert_ss2service(return_iplist, ss_list, return_count);
++	if (!ok) {
++		TALLOC_FREE(frame);
++		SAFE_FREE(*return_iplist);
++		*return_count = 0;
++		return NT_STATUS_NO_MEMORY;
++	}
++
+ 	/* Remove duplicate entries.  Some queries, notably #1c (domain
+ 	controllers) return the PDC in iplist[0] and then all domain
+ 	controllers including the PDC in iplist[1..n].  Iterating over
+-- 
+2.20.1
+
+
+From 41b0856b16c8cd16904f97fcd6a602622a0f60ee Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 17 Jul 2020 14:21:09 -0700
+Subject: [PATCH 47/62] lib: addns: Add code for asynchronously looking up A
+ records.
+
+Returns an array of struct sockaddr_storage.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ lib/addns/dnsquery.c | 200 +++++++++++++++++++++++++++++++++++++++++++
+ lib/addns/dnsquery.h |  15 ++++
+ 2 files changed, 215 insertions(+)
+
+diff --git a/lib/addns/dnsquery.c b/lib/addns/dnsquery.c
+index 87ae97e3d0b..1b07f6ee347 100644
+--- a/lib/addns/dnsquery.c
++++ b/lib/addns/dnsquery.c
+@@ -369,6 +369,206 @@ fail:
+ 	return status;
+ }
+ 
++/*********************************************************************
++ Async A record lookup.
++*********************************************************************/
++
++struct ads_dns_lookup_a_state {
++	uint8_t rcode;
++	size_t num_names;
++	char **hostnames;
++	struct sockaddr_storage *addrs;
++};
++
++static void ads_dns_lookup_a_done(struct tevent_req *subreq);
++
++struct tevent_req *ads_dns_lookup_a_send(TALLOC_CTX *mem_ctx,
++					 struct tevent_context *ev,
++					 const char *name)
++{
++	struct tevent_req *req = NULL, *subreq = NULL;
++	struct ads_dns_lookup_a_state *state = NULL;
++
++	req = tevent_req_create(mem_ctx, &state,
++				struct ads_dns_lookup_a_state);
++	if (req == NULL) {
++		return NULL;
++	}
++
++	subreq = dns_lookup_send(
++		state,
++		ev,
++		NULL,
++		name,
++		DNS_QCLASS_IN,
++		DNS_QTYPE_A);
++
++	if (tevent_req_nomem(subreq, req)) {
++		return tevent_req_post(req, ev);
++	}
++	tevent_req_set_callback(subreq, ads_dns_lookup_a_done, req);
++	return req;
++}
++
++static void ads_dns_lookup_a_done(struct tevent_req *subreq)
++{
++	struct tevent_req *req = tevent_req_callback_data(
++		subreq, struct tevent_req);
++	struct ads_dns_lookup_a_state *state = tevent_req_data(
++		req, struct ads_dns_lookup_a_state);
++	int ret;
++	struct dns_name_packet *reply = NULL;
++	uint16_t i;
++
++	ret = dns_lookup_recv(subreq, state, &reply);
++	TALLOC_FREE(subreq);
++	if (ret != 0) {
++		tevent_req_nterror(req, map_nt_error_from_unix_common(ret));
++		return;
++	}
++
++	state->rcode = (reply->operation & DNS_RCODE);
++	if (state->rcode != DNS_RCODE_OK) {
++		/* Don't bother looking for answers. */
++		tevent_req_done(req);
++		return;
++	}
++
++	/*
++	 * We don't care about CNAME answers here. We're
++	 * just wanting an async name -> IPv4 lookup.
++	 */
++	for (i = 0; i < reply->ancount; i++) {
++		if (reply->answers[i].rr_type == DNS_QTYPE_A) {
++			state->num_names += 1;
++		}
++	}
++
++	state->hostnames = talloc_zero_array(state,
++					     char *,
++					     state->num_names);
++	if (tevent_req_nomem(state->hostnames, req)) {
++		return;
++	}
++	state->addrs = talloc_zero_array(state,
++					 struct sockaddr_storage,
++					 state->num_names);
++	if (tevent_req_nomem(state->addrs, req)) {
++		return;
++	}
++
++	state->num_names = 0;
++
++	for (i = 0; i < reply->ancount; i++) {
++		bool ok;
++		struct sockaddr_storage ss = {0};
++		struct dns_res_rec *an = &reply->answers[i];
++
++		if (an->rr_type != DNS_QTYPE_A) {
++			continue;
++		}
++		if (an->name == NULL) {
++			/* Can this happen? */
++			continue;
++		}
++		if (an->rdata.ipv4_record == NULL) {
++			/* Can this happen? */
++			continue;
++		}
++		ok = dns_res_rec_get_sockaddr(an,
++					      &ss);
++		if (!ok) {
++			continue;
++		}
++		if (is_zero_addr(&ss)) {
++			continue;
++		}
++		state->addrs[state->num_names]= ss;
++		state->hostnames[state->num_names] = talloc_strdup(
++							state->hostnames,
++							an->name);
++		if (tevent_req_nomem(state->hostnames[state->num_names], req)) {
++			return;
++		}
++		state->num_names += 1;
++	}
++
++	tevent_req_done(req);
++}
++
++NTSTATUS ads_dns_lookup_a_recv(struct tevent_req *req,
++			       TALLOC_CTX *mem_ctx,
++			       uint8_t *rcode_out,
++			       size_t *num_names_out,
++			       char ***hostnames_out,
++			       struct sockaddr_storage **addrs_out)
++{
++	struct ads_dns_lookup_a_state *state = tevent_req_data(
++		req, struct ads_dns_lookup_a_state);
++	NTSTATUS status;
++
++	if (tevent_req_is_nterror(req, &status)) {
++		return status;
++	}
++	if (rcode_out != NULL) {
++		/*
++		 * If we got no names, an upper layer may
++		 * want to print a debug message.
++		 */
++		*rcode_out = state->rcode;
++	}
++	if (hostnames_out != NULL) {
++		*hostnames_out = talloc_move(mem_ctx,
++					     &state->hostnames);
++	}
++	if (addrs_out != NULL) {
++		*addrs_out = talloc_move(mem_ctx,
++					 &state->addrs);
++	}
++	*num_names_out = state->num_names;
++	tevent_req_received(req);
++	return NT_STATUS_OK;
++}
++
++/*********************************************************************
++ Simple wrapper for a DNS A query
++*********************************************************************/
++
++NTSTATUS ads_dns_lookup_a(TALLOC_CTX *ctx,
++			  const char *name_in,
++			  size_t *num_names_out,
++			  char ***hostnames_out,
++			  struct sockaddr_storage **addrs_out)
++{
++	struct tevent_context *ev;
++	struct tevent_req *req;
++	NTSTATUS status = NT_STATUS_NO_MEMORY;
++
++	ev = samba_tevent_context_init(ctx);
++	if (ev == NULL) {
++		goto fail;
++	}
++	req = ads_dns_lookup_a_send(ev, ev, name_in);
++	if (req == NULL) {
++		goto fail;
++	}
++	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
++		goto fail;
++	}
++	/*
++	 * Sychronous doesn't need to care about the rcode or
++	 * a copy of the name_in.
++	 */
++	status = ads_dns_lookup_a_recv(req,
++				       ctx,
++				       NULL,
++				       num_names_out,
++				       hostnames_out,
++				       addrs_out);
++fail:
++	TALLOC_FREE(ev);
++	return status;
++}
+ 
+ /********************************************************************
+  Query with optional sitename.
+diff --git a/lib/addns/dnsquery.h b/lib/addns/dnsquery.h
+index bb691f5d55a..229b2134ff7 100644
+--- a/lib/addns/dnsquery.h
++++ b/lib/addns/dnsquery.h
+@@ -48,6 +48,21 @@ NTSTATUS ads_dns_lookup_ns(TALLOC_CTX *ctx,
+ 				const char *dnsdomain,
+ 				struct dns_rr_ns **nslist,
+ 				int *numns);
++struct tevent_req *ads_dns_lookup_a_send(TALLOC_CTX *mem_ctx,
++				struct tevent_context *ev,
++				const char *name);
++NTSTATUS ads_dns_lookup_a_recv(struct tevent_req *req,
++				TALLOC_CTX *mem_ctx,
++				uint8_t *rcode_out,
++				size_t *num_names_out,
++				char ***hostnames_out,
++				struct sockaddr_storage **addrs_out);
++NTSTATUS ads_dns_lookup_a(TALLOC_CTX *ctx,
++			const char *name_in,
++			size_t *num_names_out,
++			char ***hostnames_out,
++			struct sockaddr_storage **addrs_out);
++
+ NTSTATUS ads_dns_query_dcs(TALLOC_CTX *ctx,
+ 			   const char *realm,
+ 			   const char *sitename,
+-- 
+2.20.1
+
+
+From e2a1f350b99f97205a51057455fd6d3825d4f6d4 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 17 Jul 2020 14:30:02 -0700
+Subject: [PATCH 48/62] lib: addns: Add code for asynchronously looking up AAAA
+ records.
+
+Returns an array of struct sockaddr_storage.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ lib/addns/dnsquery.c | 203 +++++++++++++++++++++++++++++++++++++++++++
+ lib/addns/dnsquery.h |  16 ++++
+ 2 files changed, 219 insertions(+)
+
+diff --git a/lib/addns/dnsquery.c b/lib/addns/dnsquery.c
+index 1b07f6ee347..7795eea53f1 100644
+--- a/lib/addns/dnsquery.c
++++ b/lib/addns/dnsquery.c
+@@ -570,6 +570,209 @@ fail:
+ 	return status;
+ }
+ 
++#if defined(HAVE_IPV6)
++/*********************************************************************
++ Async AAAA record lookup.
++*********************************************************************/
++
++struct ads_dns_lookup_aaaa_state {
++	uint8_t rcode;
++	size_t num_names;
++	char **hostnames;
++	struct sockaddr_storage *addrs;
++};
++
++static void ads_dns_lookup_aaaa_done(struct tevent_req *subreq);
++
++struct tevent_req *ads_dns_lookup_aaaa_send(TALLOC_CTX *mem_ctx,
++					    struct tevent_context *ev,
++					    const char *name)
++{
++	struct tevent_req *req, *subreq = NULL;
++	struct ads_dns_lookup_aaaa_state *state = NULL;
++
++	req = tevent_req_create(mem_ctx, &state,
++				struct ads_dns_lookup_aaaa_state);
++	if (req == NULL) {
++		return NULL;
++	}
++
++	subreq = dns_lookup_send(
++		state,
++		ev,
++		NULL,
++		name,
++		DNS_QCLASS_IN,
++		DNS_QTYPE_AAAA);
++
++	if (tevent_req_nomem(subreq, req)) {
++		return tevent_req_post(req, ev);
++	}
++	tevent_req_set_callback(subreq, ads_dns_lookup_aaaa_done, req);
++	return req;
++}
++
++static void ads_dns_lookup_aaaa_done(struct tevent_req *subreq)
++{
++	struct tevent_req *req = tevent_req_callback_data(
++		subreq, struct tevent_req);
++	struct ads_dns_lookup_aaaa_state *state = tevent_req_data(
++		req, struct ads_dns_lookup_aaaa_state);
++	int ret;
++	struct dns_name_packet *reply = NULL;
++	uint16_t i;
++
++	ret = dns_lookup_recv(subreq, state, &reply);
++	TALLOC_FREE(subreq);
++	if (ret != 0) {
++		tevent_req_nterror(req, map_nt_error_from_unix_common(ret));
++		return;
++	}
++
++	state->rcode = (reply->operation & DNS_RCODE);
++	if (state->rcode != DNS_RCODE_OK) {
++		/* Don't bother looking for answers. */
++		tevent_req_done(req);
++		return;
++	}
++
++	/*
++	 * We don't care about CNAME answers here. We're
++	 * just wanting an async name -> IPv6 lookup.
++	 */
++	for (i = 0; i < reply->ancount; i++) {
++		if (reply->answers[i].rr_type == DNS_QTYPE_AAAA) {
++			state->num_names += 1;
++		}
++	}
++
++	state->hostnames = talloc_zero_array(state,
++					     char *,
++					     state->num_names);
++	if (tevent_req_nomem(state->hostnames, req)) {
++		return;
++	}
++	state->addrs = talloc_zero_array(state,
++					 struct sockaddr_storage,
++					 state->num_names);
++	if (tevent_req_nomem(state->addrs, req)) {
++		return;
++	}
++
++	state->num_names = 0;
++
++	for (i = 0; i < reply->ancount; i++) {
++		bool ok;
++		struct sockaddr_storage ss = {0};
++		struct dns_res_rec *an = &reply->answers[i];
++
++		if (an->rr_type != DNS_QTYPE_AAAA) {
++			continue;
++		}
++		if (an->name == NULL) {
++			/* Can this happen? */
++			continue;
++		}
++		if (an->rdata.ipv6_record == NULL) {
++			/* Can this happen? */
++			continue;
++		}
++		ok = dns_res_rec_get_sockaddr(an,
++					      &ss);
++		if (!ok) {
++			continue;
++		}
++		if (is_zero_addr(&ss)) {
++			continue;
++		}
++		state->addrs[state->num_names] = ss;
++		state->hostnames[state->num_names] = talloc_strdup(
++							state->hostnames,
++							an->name);
++		if (tevent_req_nomem(state->hostnames[state->num_names], req)) {
++			return;
++		}
++		state->num_names += 1;
++	}
++
++	tevent_req_done(req);
++}
++
++NTSTATUS ads_dns_lookup_aaaa_recv(struct tevent_req *req,
++				  TALLOC_CTX *mem_ctx,
++				  uint8_t *rcode_out,
++				  size_t *num_names_out,
++				  char ***hostnames_out,
++				  struct sockaddr_storage **addrs_out)
++{
++	struct ads_dns_lookup_aaaa_state *state = tevent_req_data(
++		req, struct ads_dns_lookup_aaaa_state);
++	NTSTATUS status;
++
++	if (tevent_req_is_nterror(req, &status)) {
++		return status;
++	}
++	if (rcode_out != NULL) {
++		/*
++		 * If we got no names, an upper layer may
++		 * want to print a debug message.
++		 */
++		*rcode_out = state->rcode;
++	}
++	if (hostnames_out != NULL) {
++		*hostnames_out = talloc_move(mem_ctx,
++					     &state->hostnames);
++	}
++	if (addrs_out != NULL) {
++		*addrs_out = talloc_move(mem_ctx,
++					 &state->addrs);
++	}
++	*num_names_out = state->num_names;
++	tevent_req_received(req);
++	return NT_STATUS_OK;
++}
++
++/*********************************************************************
++ Simple wrapper for a DNS AAAA query
++*********************************************************************/
++
++NTSTATUS ads_dns_lookup_aaaa(TALLOC_CTX *ctx,
++			     const char *name_in,
++			     size_t *num_names_out,
++			     char ***hostnames_out,
++			     struct sockaddr_storage **addrs_out)
++{
++	struct tevent_context *ev = NULL;
++	struct tevent_req *req = NULL;
++	NTSTATUS status = NT_STATUS_NO_MEMORY;
++
++	ev = samba_tevent_context_init(ctx);
++	if (ev == NULL) {
++		goto fail;
++	}
++	req = ads_dns_lookup_aaaa_send(ev, ev, name_in);
++	if (req == NULL) {
++		goto fail;
++	}
++	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
++		goto fail;
++	}
++	/*
++	 * Sychronous doesn't need to care about the rcode or
++	 * a copy of the name_in.
++	 */
++	status = ads_dns_lookup_aaaa_recv(req,
++					  ctx,
++					  NULL,
++					  num_names_out,
++					  hostnames_out,
++					  addrs_out);
++fail:
++	TALLOC_FREE(ev);
++	return status;
++}
++#endif
++
+ /********************************************************************
+  Query with optional sitename.
+ ********************************************************************/
+diff --git a/lib/addns/dnsquery.h b/lib/addns/dnsquery.h
+index 229b2134ff7..c7d397172f0 100644
+--- a/lib/addns/dnsquery.h
++++ b/lib/addns/dnsquery.h
+@@ -62,6 +62,22 @@ NTSTATUS ads_dns_lookup_a(TALLOC_CTX *ctx,
+ 			size_t *num_names_out,
+ 			char ***hostnames_out,
+ 			struct sockaddr_storage **addrs_out);
++#if defined(HAVE_IPV6)
++struct tevent_req *ads_dns_lookup_aaaa_send(TALLOC_CTX *mem_ctx,
++				struct tevent_context *ev,
++				const char *name);
++NTSTATUS ads_dns_lookup_aaaa_recv(struct tevent_req *req,
++				TALLOC_CTX *mem_ctx,
++				uint8_t *rcode_out,
++				size_t *num_names_out,
++				char ***hostnames_out,
++				struct sockaddr_storage **addrs_out);
++NTSTATUS ads_dns_lookup_aaaa(TALLOC_CTX *ctx,
++			const char *name_in,
++			size_t *num_names_out,
++			char ***hostnames_out,
++			struct sockaddr_storage **addrs_out);
++#endif
+ 
+ NTSTATUS ads_dns_query_dcs(TALLOC_CTX *ctx,
+ 			   const char *realm,
+-- 
+2.20.1
+
+
+From b0826162895e795e17e762c2e0216e9eadb44ae7 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 17 Jul 2020 14:45:45 -0700
+Subject: [PATCH 49/62] s3: net: Add new 'net ads dns async <name>' command.
+
+Will test the async DNS lookups in the next commit.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/utils/net_ads.c | 82 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 82 insertions(+)
+
+diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c
+index 19ac9e4533f..8cbfb59f676 100644
+--- a/source3/utils/net_ads.c
++++ b/source3/utils/net_ads.c
+@@ -2211,6 +2211,80 @@ static int net_ads_dns_gethostbyname(struct net_context *c, int argc, const char
+ 	return 0;
+ }
+ 
++static int net_ads_dns_async(struct net_context *c, int argc, const char **argv)
++{
++	size_t num_names = 0;
++	char **hostnames = NULL;
++	size_t i = 0;
++	struct sockaddr_storage *addrs = NULL;
++	NTSTATUS status;
++
++	if (argc != 1 || c->display_usage) {
++		d_printf(  "%s\n"
++			   "    %s\n"
++			   "    %s\n",
++			 _("Usage:"),
++			 _("net ads dns async <name>\n"),
++			 _("  Async look up hostname from the DNS server\n"
++			   "    hostname\tName to look up\n"));
++		return -1;
++	}
++
++	status = ads_dns_lookup_a(talloc_tos(),
++				  argv[0],
++				  &num_names,
++				  &hostnames,
++				  &addrs);
++	if (!NT_STATUS_IS_OK(status)) {
++		d_printf("Looking up A record for %s got error %s\n",
++			 argv[0],
++			 nt_errstr(status));
++		return -1;
++	}
++	d_printf("Async A record lookup - got %u names for %s\n",
++		 (unsigned int)num_names,
++		 argv[0]);
++	for (i = 0; i < num_names; i++) {
++		char addr_buf[INET6_ADDRSTRLEN];
++		print_sockaddr(addr_buf,
++			       sizeof(addr_buf),
++			       &addrs[i]);
++		d_printf("hostname[%u] = %s, IPv4addr = %s\n",
++			(unsigned int)i,
++			hostnames[i],
++			addr_buf);
++	}
++
++#if defined(HAVE_IPV6)
++	status = ads_dns_lookup_aaaa(talloc_tos(),
++				     argv[0],
++				     &num_names,
++				     &hostnames,
++				     &addrs);
++	if (!NT_STATUS_IS_OK(status)) {
++		d_printf("Looking up AAAA record for %s got error %s\n",
++			 argv[0],
++			 nt_errstr(status));
++		return -1;
++	}
++	d_printf("Async AAAA record lookup - got %u names for %s\n",
++		 (unsigned int)num_names,
++		 argv[0]);
++	for (i = 0; i < num_names; i++) {
++		char addr_buf[INET6_ADDRSTRLEN];
++		print_sockaddr(addr_buf,
++			       sizeof(addr_buf),
++			       &addrs[i]);
++		d_printf("hostname[%u] = %s, IPv6addr = %s\n",
++			(unsigned int)i,
++			hostnames[i],
++			addr_buf);
++	}
++#endif
++	return 0;
++}
++
++
+ static int net_ads_dns(struct net_context *c, int argc, const char *argv[])
+ {
+ 	struct functable func[] = {
+@@ -2238,6 +2312,14 @@ static int net_ads_dns(struct net_context *c, int argc, const char *argv[])
+ 			N_("net ads dns gethostbyname\n"
+ 			   "    Look up host")
+ 		},
++		{
++			"async",
++			net_ads_dns_async,
++			NET_TRANSPORT_ADS,
++			N_("Look up host"),
++			N_("net ads dns async\n"
++			   "    Look up host using async DNS")
++		},
+ 		{NULL, NULL, 0, NULL, NULL}
+ 	};
+ 
+-- 
+2.20.1
+
+
+From 700f146bdcb6729ca52e12d63499a5a516776bfd Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 5 Aug 2020 15:46:04 -0700
+Subject: [PATCH 50/62] s4: tests: Add new async DNS unit test -
+ samba4.blackbox.net_ads_dns_async(ad_member:local).
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source4/selftest/tests.py                    |  6 ++
+ testprogs/blackbox/test_net_ads_dns_async.sh | 67 ++++++++++++++++++++
+ 2 files changed, 73 insertions(+)
+ create mode 100755 testprogs/blackbox/test_net_ads_dns_async.sh
+
+diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
+index 73f273d0045..9a86291fb1a 100755
+--- a/source4/selftest/tests.py
++++ b/source4/selftest/tests.py
+@@ -500,6 +500,12 @@ plantestsuite("samba4.blackbox.client_etypes_all(ad_dc:client)", "ad_dc:client",
+ plantestsuite("samba4.blackbox.client_etypes_legacy(ad_dc:client)", "ad_dc:client", [os.path.join(bbdir, "test_client_etypes.sh"), '$DC_SERVER', '$DC_USERNAME', '$DC_PASSWORD', '$PREFIX_ABS', 'legacy', '23'])
+ plantestsuite("samba4.blackbox.client_etypes_strong(ad_dc:client)", "ad_dc:client", [os.path.join(bbdir, "test_client_etypes.sh"), '$DC_SERVER', '$DC_USERNAME', '$DC_PASSWORD', '$PREFIX_ABS', 'strong', '17_18'])
+ plantestsuite("samba4.blackbox.net_ads_dns(ad_member:local)", "ad_member:local", [os.path.join(bbdir, "test_net_ads_dns.sh"), '$DC_SERVER', '$DC_USERNAME', '$DC_PASSWORD', '$REALM', '$USERNAME', '$PASSWORD'])
++plantestsuite("samba4.blackbox.net_ads_dns_async(ad_member:local)",
++        "ad_member:local",
++        [os.path.join(bbdir,
++            "test_net_ads_dns_async.sh"),
++            '$DC_SERVER',
++            '$REALM'])
+ plantestsuite("samba4.blackbox.samba-tool_ntacl(ad_member:local)", "ad_member:local", [os.path.join(bbdir, "test_samba-tool_ntacl.sh"), '$PREFIX', '$DOMSID'])
+ plantestsuite_loadlist("samba4.rpc.echo against NetBIOS alias", "ad_dc_ntvfs", [valgrindify(smbtorture4), "$LISTOPT", "$LOADLIST", 'ncacn_np:$NETBIOSALIAS', '-U$DOMAIN/$USERNAME%$PASSWORD', 'rpc.echo'])
+ # json tests hook into ``chgdcpass'' to make them run in contributor CI on
+diff --git a/testprogs/blackbox/test_net_ads_dns_async.sh b/testprogs/blackbox/test_net_ads_dns_async.sh
+new file mode 100755
+index 00000000000..f0bd0835b4d
+--- /dev/null
++++ b/testprogs/blackbox/test_net_ads_dns_async.sh
+@@ -0,0 +1,67 @@
++#!/bin/sh
++# Blackbox tests for net ads dns async
++# Copyright (C) 2020 Jeremy Allison <jra@samba.org>
++
++if [ $# -lt 2 ]; then
++cat <<EOF
++Usage: test_net_ads_dns_async.sh SERVER REALM
++EOF
++exit 1;
++fi
++
++SERVER=$1
++REALM=$2
++shift 2
++failed=0
++
++samba4bindir="$BINDIR"
++net_tool="$samba4bindir/net"
++
++. `dirname $0`/subunit.sh
++
++# Test looking up SERVER.REALM on server give the
++# same IP via async and non-async DNS.
++echo "Starting ..."
++
++test_async_dns() {
++	#
++	# Do the gethostbyname request. This just prints the IPv4 addr.
++	#
++	cmd_sync='$net_tool ads dns gethostbyname $SERVER $SERVER.$REALM'
++	eval echo "$cmd_sync"
++	ipv4_sync=$(eval $cmd_sync)
++	if [ -z "$ipv4_sync" ]; then
++		return 1
++	fi
++
++	#
++	# Do the async request. This prints out info like:
++	#
++	# Async A record lookup - got 1 names for addc.ADDOM.SAMBA.EXAMPLE.COM
++	# hostname[0] = addc.ADDOM.SAMBA.EXAMPLE.COM, IPv4addr = 10.53.57.30
++	# Async AAAA record lookup - got 1 names for addc.ADDOM.SAMBA.EXAMPLE.COM
++	# hostname[0] = addc.ADDOM.SAMBA.EXAMPLE.COM, IPv6addr = fd00::5357:5f1e
++	#
++	# So we must grep and sed to extract the matching IPv4 address
++	#
++	cmd_async='$net_tool ads dns async $SERVER.$REALM'
++	eval echo "$cmd_async"
++	out_async=$(eval $cmd_async)
++
++	# Drop everything but the IPv4 address.
++	ipv4_async=`echo "$out_async" | grep IPv4addr | sed -e 's/^.*IPv4addr = //'`
++
++	if [ -z "$ipv4_async" ]; then
++		return 1
++	fi
++	if [ "$ipv4_sync" != "$ipv4_async" ]; then
++		echo "DNS lookup mismatch. Sync $ipv4_sync, async $ipv4_async"
++		echo "DNS commands output. out1=$ipv4_sync, out2=$out_async"
++		return 1
++	fi
++	return 0
++}
++
++testit "Check async and non async DNS lookups match " test_async_dns || failed=`expr $failed + 1`
++
++exit $failed
+-- 
+2.20.1
+
+
+From 349bda8c210281a5ee826a0a7c9aa0972cadd089 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Thu, 23 Jul 2020 13:10:12 -0700
+Subject: [PATCH 51/62] s3: Parameters. Add 'async dns timeout' parameter.
+ Default to 10. Minimum value 1.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Andreas Schneider <asn@samba.org>
+---
+ .../smbdotconf/tuning/asyncdnstimeout.xml     | 21 +++++++++++++++++++
+ lib/param/loadparm.c                          |  3 +++
+ source3/include/proto.h                       |  1 +
+ source3/param/loadparm.c                      | 16 ++++++++++++++
+ 4 files changed, 41 insertions(+)
+ create mode 100644 docs-xml/smbdotconf/tuning/asyncdnstimeout.xml
+
+diff --git a/docs-xml/smbdotconf/tuning/asyncdnstimeout.xml b/docs-xml/smbdotconf/tuning/asyncdnstimeout.xml
+new file mode 100644
+index 00000000000..6c7ead2b2fd
+--- /dev/null
++++ b/docs-xml/smbdotconf/tuning/asyncdnstimeout.xml
+@@ -0,0 +1,21 @@
++<samba:parameter name="async dns timeout"
++                 context="G"
++                 type="integer"
++                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
++<description>
++    <para>The number of seconds the asynchronous DNS
++    resolver code in Samba will wait for responses.
++    Some of the Samba client library code uses internal
++    asynchronous DNS resolution for A and AAAA records
++    when trying to find Active Directory Domain controllers.
++    This value prevents this name resolution code from
++    waiting for DNS server timeouts.
++    </para>
++    <para>The minimum value of this parameter is clamped
++    at 1 second.
++    zero.</para>
++</description>
++
++<value type="default">10</value>
++<value type="example">20</value>
++</samba:parameter>
+diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
+index e0c6adec9c8..99bd209fc47 100644
+--- a/lib/param/loadparm.c
++++ b/lib/param/loadparm.c
+@@ -3032,6 +3032,9 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
+ 	lpcfg_do_global_parameter(
+ 		lp_ctx, "ldap max search request size", "256000");
+ 
++	/* Async DNS query timeout in seconds. */
++	lpcfg_do_global_parameter(lp_ctx, "async dns timeout", "10");
++
+ 	for (i = 0; parm_table[i].label; i++) {
+ 		if (!(lp_ctx->flags[i] & FLAG_CMDLINE)) {
+ 			lp_ctx->flags[i] |= FLAG_DEFAULT;
+diff --git a/source3/include/proto.h b/source3/include/proto.h
+index 8562317553c..e9d43326914 100644
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -869,6 +869,7 @@ char* lp_perfcount_module(TALLOC_CTX *ctx);
+ void widelinks_warning(int snum);
+ const char *lp_ncalrpc_dir(void);
+ void _lp_set_server_role(int server_role);
++uint32_t lp_get_async_dns_timeout(void);
+ 
+ /* The following definitions come from param/loadparm_ctx.c  */
+ 
+diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
+index 5ee6d33c7fc..67ac5774999 100644
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -960,6 +960,9 @@ static void init_globals(struct loadparm_context *lp_ctx, bool reinit_globals)
+ 	Globals.ldap_max_authenticated_request_size = 16777216;
+ 	Globals.ldap_max_search_request_size = 256000;
+ 
++	/* Async DNS query timeout (in seconds). */
++	Globals.async_dns_timeout = 10;
++
+ 	/* Now put back the settings that were set with lp_set_cmdline() */
+ 	apply_lp_set_cmdline();
+ }
+@@ -4681,3 +4684,16 @@ unsigned int * get_flags(void)
+ 
+ 	return flags_list;
+ }
++
++uint32_t lp_get_async_dns_timeout(void)
++{
++	uint32_t val = Globals.async_dns_timeout;
++	/*
++	 * Clamp minimum async dns timeout to 1 second
++	 * as per the man page.
++	 */
++	if (val < 1) {
++		val = 1;
++	}
++	return val;
++}
+-- 
+2.20.1
+
+
+From e4b9841a3a78cb3ceb6b0dee8621ba2b841c1712 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Tue, 21 Jul 2020 12:34:02 -0700
+Subject: [PATCH 52/62] s3: libsmb: Add dns_lookup_list_async() - not yet used.
+
+Take a list of hostnames and does async A and AAAA (if
+supported) lookups on them. Interface compatible with
+dns_lookup_list() (with the addition of one extra
+parameter returning the query name list, for use inside
+dsgetdcname() internals later) and we'll replace it in the next
+commit. Waits for lp_get_async_dns_timeout() seconds to complete.
+
+Commented out as not yet used.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Andreas Schneider <asn@samba.org>
+---
+ source3/libsmb/namequery.c | 390 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 390 insertions(+)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 6fab3d318e4..487a8015d77 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -31,6 +31,7 @@
+ #include "../libcli/nbt/libnbt.h"
+ #include "libads/kerberos_proto.h"
+ #include "lib/gencache.h"
++#include "librpc/gen_ndr/dns.h"
+ 
+ /* nmbd.c sets this to True. */
+ bool global_in_nmbd = False;
+@@ -2270,6 +2271,395 @@ fail:
+ 	return status;
+ }
+ 
++#if 0
++/********************************************************
++ Use ads_dns_lookup_[a|aaaa]_send() calls to look up a
++ list of names asynchronously.
++*********************************************************/
++
++struct dns_query_state {
++	/* Used to tell our parent we've completed. */
++	struct dns_lookup_list_async_state *p_async_state;
++	const char *query_name; /* For debugging only. */
++	size_t num_addrs;
++	struct sockaddr_storage *addrs;
++};
++
++struct dns_lookup_list_async_state {
++	bool timed_out;
++	size_t num_query_returns;
++	struct dns_query_state *queries;
++};
++
++/* Called on query timeout. */
++static void dns_lookup_send_timeout_handler(struct tevent_context *ev,
++					    struct tevent_timer *te,
++					    struct timeval t,
++					    void *private_data)
++{
++	bool *timed_out = (bool *)private_data;
++	*timed_out = true;
++}
++
++static void dns_lookup_list_a_done(struct tevent_req *req);
++#if defined(HAVE_IPV6)
++static void dns_lookup_list_aaaa_done(struct tevent_req *req);
++#endif
++
++static NTSTATUS dns_lookup_list_async(TALLOC_CTX *ctx,
++				      size_t num_dns_names,
++				      const char **dns_lookup_names,
++				      size_t *p_num_addrs,
++				      struct sockaddr_storage **pp_addrs,
++				      char ***pp_dns_names)
++{
++	struct dns_lookup_list_async_state *state = NULL;
++	struct tevent_context *ev = NULL;
++	struct tevent_req *req = NULL;
++	struct tevent_timer *timer = NULL;
++	size_t num_queries_sent = 0;
++	size_t queries_size = num_dns_names;
++	size_t i;
++	size_t num_addrs = 0;
++	struct sockaddr_storage *addr_out = NULL;
++	char **dns_names_ret = NULL;
++	NTSTATUS status = NT_STATUS_NO_MEMORY;
++
++	/* Nothing to do. */
++	if (num_dns_names == 0) {
++		*p_num_addrs = 0;
++		*pp_addrs = NULL;
++		if (pp_dns_names != NULL) {
++			*pp_dns_names = NULL;
++		}
++		return NT_STATUS_OK;
++	}
++
++	state = talloc_zero(ctx, struct dns_lookup_list_async_state);
++	if (state == NULL) {
++		goto fail;
++	}
++	ev = samba_tevent_context_init(ctx);
++	if (ev == NULL) {
++		goto fail;
++	}
++
++#if defined(HAVE_IPV6)
++	queries_size = 2 * num_dns_names;
++	/* Wrap protection. */
++	if (queries_size < num_dns_names) {
++		goto fail;
++	}
++#else
++	queries_size = num_dns_names;
++#endif
++
++	state->queries = talloc_zero_array(state,
++					   struct dns_query_state,
++					   queries_size);
++	if (state == NULL) {
++		goto fail;
++	}
++
++	/* Hit all the DNS servers with asnyc lookups for all the names. */
++	for (i = 0; i < num_dns_names; i++) {
++		DBG_INFO("async DNS lookup A record for %s\n",
++			dns_lookup_names[i]);
++
++		/* Setup the query state. */
++		state->queries[num_queries_sent].query_name =
++					dns_lookup_names[i];
++		state->queries[num_queries_sent].p_async_state = state;
++
++		req = ads_dns_lookup_a_send(ev, ev, dns_lookup_names[i]);
++		if (req == NULL) {
++			goto fail;
++		}
++		tevent_req_set_callback(req,
++				dns_lookup_list_a_done,
++				&state->queries[num_queries_sent]);
++		num_queries_sent++;
++
++#if defined(HAVE_IPV6)
++		/* If we're IPv6 capable ask for that too. */
++		state->queries[num_queries_sent].query_name =
++					dns_lookup_names[i];
++		state->queries[num_queries_sent].p_async_state = state;
++
++		DBG_INFO("async DNS lookup AAAA record for %s\n",
++			dns_lookup_names[i]);
++
++		req = ads_dns_lookup_aaaa_send(ev, ev, dns_lookup_names[i]);
++		if (req == NULL) {
++			goto fail;
++		}
++		tevent_req_set_callback(req,
++					dns_lookup_list_aaaa_done,
++					&state->queries[num_queries_sent]);
++		num_queries_sent++;
++#endif
++	}
++
++	/* We must always have a timeout. */
++	timer = tevent_add_timer(ev,
++				 ev,
++				 timeval_current_ofs(lp_get_async_dns_timeout(),
++						     0),
++				 dns_lookup_send_timeout_handler,
++				 &state->timed_out);
++	if (timer == NULL) {
++		goto fail;
++	}
++
++	/* Loop until timed out or got all replies. */
++	for(;;) {
++		int ret;
++
++		if (state->timed_out) {
++			break;
++		}
++		if (state->num_query_returns == num_queries_sent) {
++			break;
++		}
++		ret = tevent_loop_once(ev);
++		if (ret != 0) {
++			goto fail;
++		}
++	}
++
++	/* Count what we got back. */
++	for (i = 0; i < num_queries_sent; i++) {
++		struct dns_query_state *query = &state->queries[i];
++
++		/* Wrap check. */
++		if (num_addrs + query->num_addrs < num_addrs) {
++			goto fail;
++		}
++		num_addrs += query->num_addrs;
++	}
++
++	if (state->timed_out) {
++		DBG_INFO("async DNS lookup timed out after %zu entries "
++			"(not an error)\n",
++			num_addrs);
++	}
++
++	addr_out = talloc_zero_array(ctx,
++				     struct sockaddr_storage,
++				     num_addrs);
++	if (addr_out == NULL) {
++		goto fail;
++	}
++
++	/*
++	 * Did the caller want an array of names back
++	 * that match the IP addresses ? If we provide
++	 * this, dsgetdcname() internals can now use this
++	 * async lookup code also.
++	 */
++	if (pp_dns_names != NULL) {
++		dns_names_ret = talloc_zero_array(ctx,
++						  char *,
++						  num_addrs);
++		if (dns_names_ret == NULL) {
++			goto fail;
++		}
++	}
++
++	/* Copy what we got back. */
++	num_addrs = 0;
++	for (i = 0; i < num_queries_sent; i++) {
++		size_t j;
++		struct dns_query_state *query = &state->queries[i];
++
++		if (query->num_addrs == 0) {
++			continue;
++		}
++
++		if (dns_names_ret != NULL) {
++			/*
++			 * If caller wants a name array matched with
++			 * the addrs array, copy the same queried name for
++			 * each IP address returned.
++			 */
++			for (j = 0; j < query->num_addrs; j++) {
++				dns_names_ret[num_addrs + j] = talloc_strdup(
++						ctx,
++						query->query_name);
++				if (dns_names_ret[num_addrs + j] == NULL) {
++					goto fail;
++				}
++			}
++		}
++
++		for (j = 0; j < query->num_addrs; j++) {
++			addr_out[num_addrs] = query->addrs[j];
++		}
++		num_addrs += query->num_addrs;
++	}
++
++	*p_num_addrs = num_addrs;
++	*pp_addrs = addr_out;
++	if (pp_dns_names != NULL) {
++		*pp_dns_names = dns_names_ret;
++	}
++
++	status = NT_STATUS_OK;
++
++  fail:
++
++	TALLOC_FREE(state);
++	TALLOC_FREE(ev);
++	return status;
++}
++
++/*
++ Called when an A record lookup completes.
++*/
++
++static void dns_lookup_list_a_done(struct tevent_req *req)
++{
++	/*
++	 * Callback data is an element of a talloc'ed array,
++	 * not a talloc object in its own right. So use the
++	 * tevent_req_callback_data_void() void * cast function.
++	 */
++	struct dns_query_state *state = (struct dns_query_state *)
++				tevent_req_callback_data_void(req);
++	uint8_t rcode = 0;
++	size_t i;
++	char **hostnames_out = NULL;
++	struct sockaddr_storage *addrs = NULL;
++	size_t num_addrs = 0;
++	NTSTATUS status;
++
++	/* For good or ill, tell the parent we're finished. */
++	state->p_async_state->num_query_returns++;
++
++	status = ads_dns_lookup_a_recv(req,
++				       state->p_async_state,
++				       &rcode,
++				       &num_addrs,
++				       &hostnames_out,
++				       &addrs);
++	if (!NT_STATUS_IS_OK(status)) {
++		DBG_INFO("async DNS A lookup for %s returned %s\n",
++			state->query_name,
++			nt_errstr(status));
++		return;
++	}
++
++	if (rcode != DNS_RCODE_OK) {
++		DBG_INFO("async DNS A lookup for %s returned DNS code %u\n",
++			state->query_name,
++			(unsigned int)rcode);
++		return;
++	}
++
++	if (num_addrs == 0) {
++		DBG_INFO("async DNS A lookup for %s returned 0 addresses.\n",
++			state->query_name);
++		return;
++	}
++
++	/* Copy data out. */
++	state->addrs = talloc_zero_array(state->p_async_state,
++					 struct sockaddr_storage,
++					 num_addrs);
++	if (state->addrs == NULL) {
++		return;
++	}
++
++	for (i = 0; i < num_addrs; i++) {
++		char addr[INET6_ADDRSTRLEN];
++		DBG_INFO("async DNS A lookup for %s [%zu] got %s -> %s\n",
++			state->query_name,
++			i,
++			hostnames_out[i],
++			print_sockaddr(addr,
++				sizeof(addr),
++				&addrs[i]));
++
++		state->addrs[i] = addrs[i];
++	}
++	state->num_addrs = num_addrs;
++}
++
++#if defined(HAVE_IPV6)
++/*
++ Called when an AAAA record lookup completes.
++*/
++
++static void dns_lookup_list_aaaa_done(struct tevent_req *req)
++{
++	/*
++	 * Callback data is an element of a talloc'ed array,
++	 * not a talloc object in its own right. So use the
++	 * tevent_req_callback_data_void() void * cast function.
++	 */
++	struct dns_query_state *state = (struct dns_query_state *)
++				tevent_req_callback_data_void(req);
++	uint8_t rcode = 0;
++	size_t i;
++	char **hostnames_out = NULL;
++	struct sockaddr_storage *addrs = NULL;
++	size_t num_addrs = 0;
++	NTSTATUS status;
++
++	/* For good or ill, tell the parent we're finished. */
++	state->p_async_state->num_query_returns++;
++
++	status = ads_dns_lookup_aaaa_recv(req,
++					  state->p_async_state,
++					  &rcode,
++					  &num_addrs,
++					  &hostnames_out,
++					  &addrs);
++	if (!NT_STATUS_IS_OK(status)) {
++		DBG_INFO("async DNS AAAA lookup for %s returned %s\n",
++			state->query_name,
++			nt_errstr(status));
++		return;
++	}
++
++	if (rcode != DNS_RCODE_OK) {
++		DBG_INFO("async DNS AAAA lookup for %s returned DNS code %u\n",
++			state->query_name,
++			(unsigned int)rcode);
++		return;
++	}
++
++	if (num_addrs == 0) {
++		DBG_INFO("async DNS AAAA lookup for %s returned 0 addresses.\n",
++			state->query_name);
++		return;
++	}
++
++	/* Copy data out. */
++	state->addrs = talloc_zero_array(state->p_async_state,
++					 struct sockaddr_storage,
++					 num_addrs);
++	if (state->addrs == NULL) {
++		return;
++	}
++
++	for (i = 0; i < num_addrs; i++) {
++		char addr[INET6_ADDRSTRLEN];
++		DBG_INFO("async DNS AAAA lookup for %s [%zu] got %s -> %s\n",
++			state->query_name,
++			i,
++			hostnames_out[i],
++			print_sockaddr(addr,
++				sizeof(addr),
++				&addrs[i]));
++
++		state->addrs[i] = addrs[i];
++	}
++	state->num_addrs = num_addrs;
++}
++#endif
++#endif
++
+ /********************************************************
+  Resolve a list of DNS names to a list of IP addresses.
+  As this is a DC / LDAP / KDC lookup any IP address will
+-- 
+2.20.1
+
+
+From a53a1e343c0a09b97f19df6a5530b32b3393c3cd Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Tue, 21 Jul 2020 12:38:42 -0700
+Subject: [PATCH 53/62] s3: libsmb: Use dns_lookup_list_async() instead of
+ dns_lookup_list().
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index 487a8015d77..c25f2de88d5 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2271,7 +2271,6 @@ fail:
+ 	return status;
+ }
+ 
+-#if 0
+ /********************************************************
+  Use ads_dns_lookup_[a|aaaa]_send() calls to look up a
+  list of names asynchronously.
+@@ -2658,8 +2657,8 @@ static void dns_lookup_list_aaaa_done(struct tevent_req *req)
+ 	state->num_addrs = num_addrs;
+ }
+ #endif
+-#endif
+ 
++#if 0
+ /********************************************************
+  Resolve a list of DNS names to a list of IP addresses.
+  As this is a DC / LDAP / KDC lookup any IP address will
+@@ -2740,6 +2739,7 @@ static NTSTATUS dns_lookup_list(TALLOC_CTX *ctx,
+ 	*pp_addrs = ret_addrs;
+ 	return NT_STATUS_OK;
+ }
++#endif
+ 
+ /********************************************************
+  Resolve via "hosts" method.
+@@ -3014,11 +3014,12 @@ static NTSTATUS resolve_ads(TALLOC_CTX *ctx,
+ 	}
+ 
+ 	/* Lookup the addresses on the dns_lookup_list. */
+-	status = dns_lookup_list(ctx,
++	status = dns_lookup_list_async(ctx,
+ 				num_dns_names,
+ 				dns_lookup_names,
+ 				&num_dns_addrs,
+-				&dns_addrs);
++				&dns_addrs,
++				NULL);
+ 
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		TALLOC_FREE(dcs);
+-- 
+2.20.1
+
+
+From 9474172f7a287073242c0ba2c0a55e7030918be3 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Mon, 17 Aug 2020 21:50:13 -0700
+Subject: [PATCH 54/62] s3: libsmb: Remove dns_lookup_list(). No longer used.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 83 --------------------------------------
+ 1 file changed, 83 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index c25f2de88d5..bb664ca8d0a 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2658,89 +2658,6 @@ static void dns_lookup_list_aaaa_done(struct tevent_req *req)
+ }
+ #endif
+ 
+-#if 0
+-/********************************************************
+- Resolve a list of DNS names to a list of IP addresses.
+- As this is a DC / LDAP / KDC lookup any IP address will
+- do, the requested names don't have to match the returned
+- IP address list.
+-*********************************************************/
+-
+-static NTSTATUS dns_lookup_list(TALLOC_CTX *ctx,
+-				size_t num_dns_names,
+-				const char **dns_lookup_names,
+-				size_t *p_num_addrs,
+-				struct sockaddr_storage **pp_addrs)
+-{
+-	size_t total_num_addrs = 0;
+-	size_t i;
+-	struct sockaddr_storage *ret_addrs = NULL;
+-
+-	/* FIXME - make this asnyc using our async DNS code. */
+-
+-	for (i = 0; i < num_dns_names; i++ ) {
+-		struct addrinfo *res = NULL;
+-		struct addrinfo *p = NULL;
+-		size_t num_addrs = 0;
+-		bool ok = interpret_string_addr_internal(&res,
+-					dns_lookup_names[i],
+-					0);
+-		if (!ok) {
+-			continue;
+-		}
+-		/* Count the IP's returned from the lookup. */
+-		for (p = res; p; p = p->ai_next) {
+-			num_addrs++;
+-		}
+-
+-		/* Wrap check. */
+-		if (total_num_addrs + num_addrs < total_num_addrs) {
+-			if (res) {
+-				freeaddrinfo(res);
+-			}
+-			return NT_STATUS_INVALID_PARAMETER;
+-		}
+-		ret_addrs = talloc_realloc(ctx,
+-					   ret_addrs,
+-					   struct sockaddr_storage,
+-					   total_num_addrs + num_addrs);
+-		if (ret_addrs == NULL) {
+-			if (res) {
+-				freeaddrinfo(res);
+-			}
+-			return NT_STATUS_NO_MEMORY;
+-		}
+-
+-		for (p = res; p; p = p->ai_next) {
+-			char addr[INET6_ADDRSTRLEN];
+-
+-			memcpy(&ret_addrs[total_num_addrs],
+-				p->ai_addr,
+-				p->ai_addrlen);
+-
+-			if (is_zero_addr(&ret_addrs[total_num_addrs])) {
+-				continue;
+-			}
+-
+-			DBG_DEBUG("getaddrinfo name %s returned IP %s\n",
+-				dns_lookup_names[i],
+-				print_sockaddr(addr,
+-					sizeof(addr),
+-					&ret_addrs[total_num_addrs]));
+-
+-			total_num_addrs++;
+-		}
+-		if (res) {
+-			freeaddrinfo(res);
+-		}
+-	}
+-
+-	*p_num_addrs = total_num_addrs;
+-	*pp_addrs = ret_addrs;
+-	return NT_STATUS_OK;
+-}
+-#endif
+-
+ /********************************************************
+  Resolve via "hosts" method.
+ *********************************************************/
+-- 
+2.20.1
+
+
+From ee0cf4562bb6e062f5a2887a73fd5ea9912db55f Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Tue, 21 Jul 2020 14:56:47 -0700
+Subject: [PATCH 55/62] s3: libsmb: Make dns_lookup_list_async() available to
+ other Samba callers.
+
+This allows the async DNS lookups to be re-used inside the dsgetdcname() internals
+code as previously described.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/namequery.c | 12 ++++++------
+ source3/libsmb/namequery.h |  6 ++++++
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
+index bb664ca8d0a..d6ef7dd5146 100644
+--- a/source3/libsmb/namequery.c
++++ b/source3/libsmb/namequery.c
+@@ -2305,12 +2305,12 @@ static void dns_lookup_list_a_done(struct tevent_req *req);
+ static void dns_lookup_list_aaaa_done(struct tevent_req *req);
+ #endif
+ 
+-static NTSTATUS dns_lookup_list_async(TALLOC_CTX *ctx,
+-				      size_t num_dns_names,
+-				      const char **dns_lookup_names,
+-				      size_t *p_num_addrs,
+-				      struct sockaddr_storage **pp_addrs,
+-				      char ***pp_dns_names)
++NTSTATUS dns_lookup_list_async(TALLOC_CTX *ctx,
++			      size_t num_dns_names,
++			      const char **dns_lookup_names,
++			      size_t *p_num_addrs,
++			      struct sockaddr_storage **pp_addrs,
++			      char ***pp_dns_names)
+ {
+ 	struct dns_lookup_list_async_state *state = NULL;
+ 	struct tevent_context *ev = NULL;
+diff --git a/source3/libsmb/namequery.h b/source3/libsmb/namequery.h
+index aedb043ac81..d6f5d216733 100644
+--- a/source3/libsmb/namequery.h
++++ b/source3/libsmb/namequery.h
+@@ -85,6 +85,12 @@ NTSTATUS resolve_wins(TALLOC_CTX *mem_ctx,
+ 		int name_type,
+ 		struct sockaddr_storage **return_iplist,
+ 		int *return_count);
++NTSTATUS dns_lookup_list_async(TALLOC_CTX *ctx,
++			       size_t num_dns_names,
++			       const char **dns_lookup_names,
++			       size_t *p_num_addrs,
++			       struct sockaddr_storage **pp_addrs,
++			       char ***pp_dns_names);
+ NTSTATUS internal_resolve_name(const char *name,
+ 			        int name_type,
+ 				const char *sitename,
+-- 
+2.20.1
+
+
+From ecb66d3dbd15ea1e5ab7acf0850ee67abf4458c8 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Tue, 21 Jul 2020 22:09:27 -0700
+Subject: [PATCH 56/62] s3: libsmb: Make discover_dc_dns() use async DNS.
+
+Change to call dns_lookup_list_async(). This is
+doing the samba SRV lookup followed by A and AAAA
+record host lookup as resolve_ads() does and so
+benefits from the same changes to make it async.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libsmb/dsgetdcname.c | 223 ++++++++++++++++++++++++++++-------
+ 1 file changed, 178 insertions(+), 45 deletions(-)
+
+diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c
+index 08477065f34..cdcefbece3f 100644
+--- a/source3/libsmb/dsgetdcname.c
++++ b/source3/libsmb/dsgetdcname.c
+@@ -504,14 +504,17 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx,
+ 				struct ip_service_name **returned_dclist,
+ 				int *return_count)
+ {
+-	int i;
+-	size_t j;
++	size_t i;
+ 	NTSTATUS status;
+ 	struct dns_rr_srv *dcs = NULL;
+ 	int numdcs = 0;
+-	int numaddrs = 0;
+ 	struct ip_service_name *dclist = NULL;
+-	int count = 0;
++	size_t ret_count = 0;
++	size_t num_dns_lookups = 0;
++	const char **dns_lookups = NULL;
++	size_t num_lookups_ret = 0;
++	struct sockaddr_storage *dns_addrs_ret = NULL;
++	char **dns_lookups_ret = NULL;
+ 
+ 	if (flags & DS_PDC_REQUIRED) {
+ 		status = ads_dns_query_pdc(mem_ctx,
+@@ -554,74 +557,204 @@ static NTSTATUS discover_dc_dns(TALLOC_CTX *mem_ctx,
+ 	}
+ 
+ 	if (!NT_STATUS_IS_OK(status)) {
++		TALLOC_FREE(dcs);
+ 		return status;
+ 	}
+ 
+-	if (numdcs == 0) {
++	/* Wrap protect. */
++	if (numdcs < 0) {
++		TALLOC_FREE(dcs);
+ 		return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+ 	}
+ 
+-	for (i=0;i<numdcs;i++) {
+-		numaddrs += MAX(dcs[i].num_ips,1);
++	if (numdcs == 0) {
++		TALLOC_FREE(dcs);
++		return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+ 	}
+ 
++	/*
++	 * We're only returning one address per
++	 * DC name, so just allocate size numdcs.
++	 */
++
+ 	dclist = talloc_zero_array(mem_ctx,
+ 				   struct ip_service_name,
+-				   numaddrs);
++				   numdcs);
+ 	if (!dclist) {
++		TALLOC_FREE(dcs);
+ 		return NT_STATUS_NO_MEMORY;
+ 	}
+ 
+-	/* now unroll the list of IP addresses */
+-
+-	*return_count = 0;
+-	i = 0;
+-	j = 0;
+-
+-	while ((i < numdcs) && (count < numaddrs)) {
+-
+-		struct ip_service_name *r = &dclist[count];
++	/*
++	 * First, copy the SRV record replies that
++	 * have IP addresses returned with them.
++	 */
++	ret_count = 0;
++	for (i = 0; i < numdcs; i++) {
++		size_t j;
++
++		if (dcs[i].num_ips == 0) {
++			/*
++			 * No addresses returned in the SRV
++			 * reply, we must look this up via
++			 * DNS.
++			 */
++			num_dns_lookups++;
++			continue;
++		}
+ 
+-		r->hostname = dcs[i].hostname;
++		dclist[ret_count].hostname =
++			talloc_move(mem_ctx, &dcs[i].hostname);
++
++		/*
++		 * Pick the first IPv4 address,
++		 * if none pick the first address.
++		 *
++		 * This is different from the previous
++		 * code which picked a 'next ip' address
++		 * each time, incrementing an index.
++		 * Too complex to maintain :-(.
++		 */
++		for (j = 0; j < dcs[i].num_ips; j++) {
++			if (dcs[i].ss_s[j].ss_family == AF_INET) {
++				dclist[ret_count].ss = dcs[i].ss_s[j];
++				break;
++			}
++		}
++		if (j == dcs[i].num_ips) {
++			/* No IPv4- use the first IPv6 addr. */
++			dclist[ret_count].ss = dcs[i].ss_s[0];
++		}
++		ret_count++;
++	}
++
++	/*
++	 * Now, create an array of hostnames we
++	 * will asynchronously look up in DNS.
++	 */
++	dns_lookups = talloc_zero_array(mem_ctx,
++					const char *,
++					num_dns_lookups);
++	if (dns_lookups == NULL) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(dclist);
++		return NT_STATUS_NO_MEMORY;
++	}
+ 
+-		/* If we don't have an IP list for a name, lookup it up */
++	num_dns_lookups = 0;
++	for (i = 0; i < numdcs; i++) {
++		if (dcs[i].num_ips != 0) {
++			/*
++			 * We already got an address
++			 * for this via SRV return.
++			 */
++			continue;
++		}
++		dns_lookups[num_dns_lookups] =
++			talloc_strdup(mem_ctx, dcs[i].hostname);
++		if (dns_lookups[num_dns_lookups] == NULL) {
++			TALLOC_FREE(dcs);
++			TALLOC_FREE(dclist);
++			TALLOC_FREE(dns_lookups);
++		}
++		num_dns_lookups++;
++	}
+ 
+-		if (!dcs[i].ss_s) {
+-			interpret_string_addr_prefer_ipv4(&r->ss,
+-						dcs[i].hostname, 0);
+-			i++;
+-			j = 0;
+-		} else {
+-			/* use the IP addresses from the SRV response */
++	status = dns_lookup_list_async(mem_ctx,
++				       num_dns_lookups,
++				       dns_lookups,
++				       &num_lookups_ret,
++				       &dns_addrs_ret,
++				       &dns_lookups_ret);
++	if (!NT_STATUS_IS_OK(status)) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(dclist);
++		TALLOC_FREE(dns_lookups);
++		return status;
++	}
+ 
+-			if (j >= dcs[i].num_ips) {
+-				i++;
+-				j = 0;
++	/*
++	 * Remember, if we timed out or some
++	 * addresses didn't look up then
++	 * num_dns_lookups > num_lookups_ret,
++	 * so there isn't a one to one correspondence.
++	 *
++	 * The order of the requests is preserved
++	 * in the replies, but there may be requests
++	 * for which there are no replies if we
++	 * timed out.
++	 *
++	 * For example this means for looking up
++	 * names:
++	 *     NAME1
++	 *     NAME2
++	 *     NAME3
++	 *
++	 * The replies might look like:
++	 *     NAME1 -> IPv4
++	 *     NAME1 -> IPv4
++	 *     NAME1 -> IPv6
++	 *     NAME1 -> IPv6
++	 *     NAME3 -> IPv6
++	 *
++	 * But they will never be in the order:
++	 *
++	 *     NAME2
++	 *     NAME3
++	 *     NAME1
++	 *
++	 * Also in dns_lookup_list_async()
++	 * we arrange the requests/replies in
++	 * the order IPv4 followed by IPv6, so in
++	 * the replies, we can always pick the first
++	 * reply - we know it will be IPv4 if there
++	 * is an IPv4 for that name.
++	 *
++	 * Here ret_count is the index into the
++	 * next entry in dclist we must fill (may
++	 * be zero).
++	 */
++
++	for (i = 0; i < num_lookups_ret; i++) {
++		dclist[ret_count].hostname =
++			talloc_move(mem_ctx, &dns_lookups_ret[i]);
++		dclist[ret_count].ss = dns_addrs_ret[i];
++		/*
++		 * Is this a duplicate name return.
++		 * Remember we can look up both A and
++		 * AAAA records which can return multiple
++		 * addresses and the order of names
++		 * is preserved.
++		 */
++		if (ret_count > 0) {
++			if (strcmp(dclist[ret_count-1].hostname,
++				   dclist[ret_count].hostname) == 0) {
++				/*
++				 * Same name. Keep the first address
++				 * which is IPv4 by preference.
++				 */
+ 				continue;
+ 			}
+-
+-			r->ss = dcs[i].ss_s[j];
+-			j++;
+ 		}
++		ret_count++;
+ 
+-		/* make sure it is a valid IP.  I considered checking the
+-		 * negative connection cache, but this is the wrong place for
+-		 * it.  Maybe only as a hack. After think about it, if all of
+-		 * the IP addresses returned from DNS are dead, what hope does a
+-		 * netbios name lookup have?  The standard reason for falling
+-		 * back to netbios lookups is that our DNS server doesn't know
+-		 * anything about the DC's   -- jerry */
+-
+-		if (!is_zero_addr(&r->ss)) {
+-			count++;
+-			continue;
++		if (ret_count == numdcs) {
++			/* We've filled the return array. */
++			break;
+ 		}
+ 	}
+ 
+ 	*returned_dclist = dclist;
+-	*return_count = count;
++	*return_count = (int)ret_count;
++
++	if (*return_count < 0) {
++		TALLOC_FREE(dcs);
++		TALLOC_FREE(dclist);
++		TALLOC_FREE(dns_lookups);
++		return NT_STATUS_INTERNAL_ERROR;
++	}
+ 
+-	if (count > 0) {
++	if (ret_count > 0) {
+ 		return NT_STATUS_OK;
+ 	}
+ 
+-- 
+2.20.1
+
+
+From ff5ede32982ec4385874f6a7c7e9dd58ac8852e4 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 7 Aug 2020 20:18:50 -0700
+Subject: [PATCH 57/62] s3: libads: Add utility function ads_zero_ldap().
+
+When initializing or re-initializing the ldap part of the ADS_STRUCT,
+we should call this to ensure that ads->ldap.ss is correctly recognized
+as a zero IPaddr by is_zero_addr(). It zeros out the ads->ldap but
+then adds zero_sockaddr() to initialize as AF_INET. Otherwise it's
+left by accident as AF_UNSPEC (0).
+
+Not yet used.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ads_proto.h |  1 +
+ source3/libads/ldap.c      | 19 +++++++++++++++++++
+ 2 files changed, 20 insertions(+)
+
+diff --git a/source3/libads/ads_proto.h b/source3/libads/ads_proto.h
+index 495ef5d3325..9c21f5470c5 100644
+--- a/source3/libads/ads_proto.h
++++ b/source3/libads/ads_proto.h
+@@ -81,6 +81,7 @@ bool ads_sitename_match(ADS_STRUCT *ads);
+ bool ads_closest_dc(ADS_STRUCT *ads);
+ ADS_STATUS ads_connect(ADS_STRUCT *ads);
+ ADS_STATUS ads_connect_user_creds(ADS_STRUCT *ads);
++void ads_zero_ldap(ADS_STRUCT *ads);
+ void ads_disconnect(ADS_STRUCT *ads);
+ ADS_STATUS ads_do_search_all_fn(ADS_STRUCT *ads, const char *bind_path,
+ 				int scope, const char *expr, const char **attrs,
+diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
+index 8ad76ed0ae9..7e4265bb01f 100644
+--- a/source3/libads/ldap.c
++++ b/source3/libads/ldap.c
+@@ -738,6 +738,25 @@ ADS_STATUS ads_connect_user_creds(ADS_STRUCT *ads)
+ 	return ads_connect(ads);
+ }
+ 
++/**
++ * Zero out the internal ads->ldap struct and initialize the address to zero IP.
++ * @param ads Pointer to an existing ADS_STRUCT
++ *
++ * Sets the ads->ldap.ss to a valid
++ * zero ip address that can be detected by
++ * our is_zero_addr() function. Otherwise
++ * it is left as AF_UNSPEC (0).
++ **/
++void ads_zero_ldap(ADS_STRUCT *ads)
++{
++	ZERO_STRUCT(ads->ldap);
++	/*
++	 * Initialize the sockaddr_storage so we can use
++	 * sockaddr test functions against it.
++	 */
++	zero_sockaddr(&ads->ldap.ss);
++}
++
+ /**
+  * Disconnect the LDAP server
+  * @param ads Pointer to an existing ADS_STRUCT
+-- 
+2.20.1
+
+
+From e9d633fe85594c14d0be2f22cd674aae019d79d6 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 7 Aug 2020 20:22:50 -0700
+Subject: [PATCH 58/62] s3: libads: Where we implicitly zero out ads->ldap in
+ ads_init() or ads_destroy() ensure we call ads_zero_ldap() after.
+
+For ads_destroy(), this has a mode where the memory is not destroyed
+but is being re-initialized. Horrid, but that's the way it works right
+now.
+
+This clears out the memory, but also leaves ads->ldap as a valid (zero) IPaddr.
+Otherwise it's left by accident as AF_UNSPEC (0).
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ads_struct.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c
+index 043a1b21247..accd8900c83 100644
+--- a/source3/libads/ads_struct.c
++++ b/source3/libads/ads_struct.c
+@@ -140,6 +140,9 @@ ADS_STRUCT *ads_init(const char *realm,
+ 
+ 	ads = SMB_XMALLOC_P(ADS_STRUCT);
+ 	ZERO_STRUCTP(ads);
++#ifdef HAVE_LDAP
++	ads_zero_ldap(ads);
++#endif
+ 
+ 	ads->server.realm = realm? SMB_STRDUP(realm) : NULL;
+ 	ads->server.workgroup = workgroup ? SMB_STRDUP(workgroup) : NULL;
+@@ -218,6 +221,9 @@ void ads_destroy(ADS_STRUCT **ads)
+ 		SAFE_FREE((*ads)->config.config_path);
+ 
+ 		ZERO_STRUCTP(*ads);
++#ifdef HAVE_LDAP
++		ads_zero_ldap(*ads);
++#endif
+ 
+ 		if ( is_mine )
+ 			SAFE_FREE(*ads);
+-- 
+2.20.1
+
+
+From 8cd3a0b5aa99f38299e7860445141a26e5931aab Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Fri, 7 Aug 2020 20:24:07 -0700
+Subject: [PATCH 59/62] s3: libads: In ads_connect(), and ads_disconnect(),
+ replace ZERO_STRUCT(ads->ldap) with calls to ads_zero_ldap(ads)
+
+This clears out the memory, but also leaves ads->ldap as a valid (zero) IPaddr.
+Otherwise it's left by accident as AF_UNSPEC (0).
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ldap.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
+index 7e4265bb01f..09cfdf7a45e 100644
+--- a/source3/libads/ldap.c
++++ b/source3/libads/ldap.c
+@@ -577,7 +577,7 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads)
+ 	NTSTATUS ntstatus;
+ 	char addr[INET6_ADDRSTRLEN];
+ 
+-	ZERO_STRUCT(ads->ldap);
++	ads_zero_ldap(ads);
+ 	ZERO_STRUCT(ads->ldap_wrap_data);
+ 	ads->ldap.last_attempt	= time_mono(NULL);
+ 	ads->ldap_wrap_data.wrap_type	= ADS_SASLWRAP_TYPE_PLAIN;
+@@ -774,7 +774,7 @@ void ads_disconnect(ADS_STRUCT *ads)
+ 	if (ads->ldap_wrap_data.mem_ctx) {
+ 		talloc_free(ads->ldap_wrap_data.mem_ctx);
+ 	}
+-	ZERO_STRUCT(ads->ldap);
++	ads_zero_ldap(ads);
+ 	ZERO_STRUCT(ads->ldap_wrap_data);
+ }
+ 
+-- 
+2.20.1
+
+
+From f6148b142d355006c95227a79ff0d1063a326bef Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 22 Jul 2020 15:35:43 -0700
+Subject: [PATCH 60/62] s3: libads: ads_connect can be passed in an ADS_STRUCT
+ with an existing IP address.
+
+ads_connect can be passed in a reused ADS_STRUCT
+with an existing ads->ldap.ss IP address that
+is stored by going through ads_find_dc()
+if ads->server.ldap_server was NULL.
+
+If ads->server.ldap_server is still NULL but
+the target address isn't a zero ip address,
+then store it off before zeroing out ads->ldap
+so we don't keep doing multiple calls to
+ads_find_dc() in the reuse case.
+
+If a caller wants a clean ADS_STRUCT they
+will re-initialize by calling ads_init(), or
+call ads_destroy() both of which ensures
+ads->ldap.ss is a correctly zero'ed out IP address
+by using ads_zero_ldap().
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ldap.c | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
+index 09cfdf7a45e..dd5c36d124b 100644
+--- a/source3/libads/ldap.c
++++ b/source3/libads/ldap.c
+@@ -576,6 +576,30 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads)
+ 	ADS_STATUS status;
+ 	NTSTATUS ntstatus;
+ 	char addr[INET6_ADDRSTRLEN];
++	struct sockaddr_storage existing_ss = {0};
++
++	/*
++	 * ads_connect can be passed in a reused ADS_STRUCT
++	 * with an existing non-zero ads->ldap.ss IP address
++	 * that was stored by going through ads_find_dc()
++	 * if ads->server.ldap_server was NULL.
++	 *
++	 * If ads->server.ldap_server is still NULL but
++	 * the target address isn't the zero address, then
++	 * store that address off off before zeroing out
++	 * ads->ldap so we don't keep doing multiple calls
++	 * to ads_find_dc() in the reuse case.
++	 *
++	 * If a caller wants a clean ADS_STRUCT they
++	 * will re-initialize by calling ads_init(), or
++	 * call ads_destroy() both of which ensures
++	 * ads->ldap.ss is a properly zero'ed out valid IP
++	 * address.
++	 */
++	if (ads->server.ldap_server == NULL && !is_zero_addr(&ads->ldap.ss)) {
++		/* Save off the address we previously found by ads_find_dc(). */
++		existing_ss = ads->ldap.ss;
++	}
+ 
+ 	ads_zero_ldap(ads);
+ 	ZERO_STRUCT(ads->ldap_wrap_data);
+@@ -622,6 +646,20 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads)
+ 		}
+ 	}
+ 
++	if (!is_zero_addr(&existing_ss)) {
++		/* We saved off who we should talk to. */
++		bool ok = ads_try_connect(ads,
++					  ads->server.gc,
++					  &existing_ss);
++		if (ok) {
++			goto got_connection;
++		}
++		/*
++		 * Keep trying to find a server and fall through
++		 * into ads_find_dc() again.
++		 */
++	}
++
+ 	ntstatus = ads_find_dc(ads);
+ 	if (NT_STATUS_IS_OK(ntstatus)) {
+ 		goto got_connection;
+-- 
+2.20.1
+
+
+From b34d5e5b0d41a3954f56e74cd97eac90ab387a43 Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 22 Jul 2020 19:00:52 -0700
+Subject: [PATCH 61/62] s3: libads: Don't re-do DNS lookups in
+ ads_current_time() if not needed.
+
+ADS_STRUCT may be being reused after a
+DC lookup from ads_find_dc(), so ads->ldap.ss may already have a
+good address (even if ads->server.ldap_server == NULL).
+Only re-initialize the ADS_STRUCT and redo the ads_find_fc()
+DNS lookups if we have to.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ldap.c | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
+index dd5c36d124b..0e6c639b37d 100644
+--- a/source3/libads/ldap.c
++++ b/source3/libads/ldap.c
+@@ -3255,11 +3255,27 @@ ADS_STATUS ads_current_time(ADS_STRUCT *ads)
+         /* establish a new ldap tcp session if necessary */
+ 
+ 	if ( !ads->ldap.ld ) {
+-		if ( (ads_s = ads_init( ads->server.realm, ads->server.workgroup, 
+-			ads->server.ldap_server, ADS_SASL_PLAIN )) == NULL )
+-		{
+-			status = ADS_ERROR(LDAP_NO_MEMORY);
+-			goto done;
++		/*
++		 * ADS_STRUCT may be being reused after a
++		 * DC lookup, so ads->ldap.ss may already have a
++		 * good address. If not, re-initialize the passed-in
++		 * ADS_STRUCT with the given server.XXXX parameters.
++		 *
++		 * Note that this doesn't depend on
++		 * ads->server.ldap_server != NULL,
++		 * as the case where ads->server.ldap_server==NULL and
++		 * ads->ldap.ss != zero_address is precisely the DC
++		 * lookup case where ads->ldap.ss was found by going
++		 * through ads_find_dc() again we want to avoid repeating.
++		 */
++		if (is_zero_addr(&ads->ldap.ss)) {
++			if ((ads_s = ads_init(ads->server.realm,
++					ads->server.workgroup,
++					ads->server.ldap_server,
++					ADS_SASL_PLAIN )) == NULL ) {
++				status = ADS_ERROR(LDAP_NO_MEMORY);
++				goto done;
++			}
+ 		}
+ 		ads_s->auth.flags = ADS_AUTH_ANON_BIND;
+ 		status = ads_connect( ads_s );
+-- 
+2.20.1
+
+
+From 084ca0619a9ef14aafa87c377367cbc33a046dfe Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Wed, 22 Jul 2020 19:03:23 -0700
+Subject: [PATCH 62/62] s3: libads: Don't re-do DNS lookups in
+ ads_domain_func_level() if not needed.
+
+ADS_STRUCT may be being reused after a
+DC lookup from ads_find_dc(), so ads->ldap.ss may already have a
+good address (even if ads->server.ldap_server == NULL).
+Only re-initialize the ADS_STRUCT and redo the ads_find_fc()
+DNS lookups if we have to.
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+---
+ source3/libads/ldap.c | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c
+index 0e6c639b37d..d224ffc9eb0 100644
+--- a/source3/libads/ldap.c
++++ b/source3/libads/ldap.c
+@@ -3333,11 +3333,27 @@ ADS_STATUS ads_domain_func_level(ADS_STRUCT *ads, uint32_t *val)
+         /* establish a new ldap tcp session if necessary */
+ 
+ 	if ( !ads->ldap.ld ) {
+-		if ( (ads_s = ads_init( ads->server.realm, ads->server.workgroup, 
+-			ads->server.ldap_server, ADS_SASL_PLAIN )) == NULL )
+-		{
+-			status = ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
+-			goto done;
++		/*
++		 * ADS_STRUCT may be being reused after a
++		 * DC lookup, so ads->ldap.ss may already have a
++		 * good address. If not, re-initialize the passed-in
++		 * ADS_STRUCT with the given server.XXXX parameters.
++		 *
++		 * Note that this doesn't depend on
++		 * ads->server.ldap_server != NULL,
++		 * as the case where ads->server.ldap_server==NULL and
++		 * ads->ldap.ss != zero_address is precisely the DC
++		 * lookup case where ads->ldap.ss was found by going
++		 * through ads_find_dc() again we want to avoid repeating.
++		 */
++		if (is_zero_addr(&ads->ldap.ss)) {
++			if ((ads_s = ads_init(ads->server.realm,
++						ads->server.workgroup,
++						ads->server.ldap_server,
++						ADS_SASL_PLAIN )) == NULL ) {
++				status = ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
++				goto done;
++			}
+ 		}
+ 		ads_s->auth.flags = ADS_AUTH_ANON_BIND;
+ 		status = ads_connect( ads_s );
+-- 
+2.20.1
+
diff --git a/net-fs/samba/files/samba-4.11.9-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch b/net-fs/samba/files/samba-4.11.13-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch
similarity index 100%
rename from net-fs/samba/files/samba-4.11.9-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch
rename to net-fs/samba/files/samba-4.11.13-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch
diff --git a/net-fs/samba/files/samba-4.11.9-machinepass_expire.patch b/net-fs/samba/files/samba-4.11.13-machinepass_expire.patch
similarity index 100%
rename from net-fs/samba/files/samba-4.11.9-machinepass_expire.patch
rename to net-fs/samba/files/samba-4.11.13-machinepass_expire.patch
diff --git a/net-fs/samba/files/samba-4.11.9-machinepass_stdin.patch b/net-fs/samba/files/samba-4.11.13-machinepass_stdin.patch
similarity index 100%
rename from net-fs/samba/files/samba-4.11.9-machinepass_stdin.patch
rename to net-fs/samba/files/samba-4.11.13-machinepass_stdin.patch
diff --git a/net-fs/samba/files/samba-4.11.9-reuse_existing_computer_account.patch b/net-fs/samba/files/samba-4.11.13-reuse_existing_computer_account.patch
similarity index 100%
rename from net-fs/samba/files/samba-4.11.9-reuse_existing_computer_account.patch
rename to net-fs/samba/files/samba-4.11.13-reuse_existing_computer_account.patch
diff --git a/net-fs/samba/samba-4.11.13-r1.ebuild b/net-fs/samba/samba-4.11.13-r1.ebuild
new file mode 120000
index 0000000..c6b042f
--- /dev/null
+++ b/net-fs/samba/samba-4.11.13-r1.ebuild
@@ -0,0 +1 @@
+samba-4.11.13.ebuild
\ No newline at end of file
diff --git a/net-fs/samba/samba-4.11.13.ebuild b/net-fs/samba/samba-4.11.13.ebuild
new file mode 100644
index 0000000..2713e58
--- /dev/null
+++ b/net-fs/samba/samba-4.11.13.ebuild
@@ -0,0 +1,333 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+PYTHON_COMPAT=( python3_{6,7,8} )
+PYTHON_REQ_USE='threads(+),xml(+)'
+
+inherit python-single-r1 waf-utils multilib-minimal linux-info systemd pam
+
+MY_PV="${PV/_rc/rc}"
+MY_P="${PN}-${MY_PV}"
+
+SRC_PATH="stable"
+[[ ${PV} = *_rc* ]] && SRC_PATH="rc"
+
+SRC_URI="mirror://samba/${SRC_PATH}/${MY_P}.tar.gz"
+[[ ${PV} = *_rc* ]] || \
+KEYWORDS="*"
+
+DESCRIPTION="Samba Suite Version 4"
+HOMEPAGE="https://www.samba.org/"
+LICENSE="GPL-3"
+
+SLOT="0"
+
+IUSE="acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint
+json ldap pam perl profiling-data python quota selinux snapper syslog
+system-heimdal +system-mitkrb5 systemd test winbind zeroconf"
+
+MULTILIB_WRAPPED_HEADERS=(
+	/usr/include/samba-4.0/policy.h
+	/usr/include/samba-4.0/dcerpc_server.h
+	/usr/include/samba-4.0/ctdb.h
+	/usr/include/samba-4.0/ctdb_client.h
+	/usr/include/samba-4.0/ctdb_protocol.h
+	/usr/include/samba-4.0/ctdb_private.h
+	/usr/include/samba-4.0/ctdb_typesafe_cb.h
+	/usr/include/samba-4.0/ctdb_version.h
+)
+
+# sys-apps/attr is an automagic dependency (see bug #489748)
+CDEPEND="
+	>=app-arch/libarchive-3.1.2[${MULTILIB_USEDEP}]
+	perl? ( dev-lang/perl:= )
+	dev-libs/libaio[${MULTILIB_USEDEP}]
+	dev-libs/libbsd[${MULTILIB_USEDEP}]
+	dev-libs/libgcrypt:0
+	dev-libs/iniparser:0
+	dev-libs/libtasn1[${MULTILIB_USEDEP}]
+	dev-libs/popt[${MULTILIB_USEDEP}]
+	python? ( $(python_gen_cond_dep 'dev-python/subunit[${PYTHON_USEDEP},'"${MULTILIB_USEDEP}"']') )
+	>=dev-util/cmocka-1.1.1[${MULTILIB_USEDEP}]
+	>=net-libs/gnutls-3.2.0[${MULTILIB_USEDEP}]
+	net-libs/libnsl:=[${MULTILIB_USEDEP}]
+	sys-apps/attr[${MULTILIB_USEDEP}]
+	sys-libs/e2fsprogs-libs[${MULTILIB_USEDEP}]
+	>=sys-libs/ldb-2.0.12[ldap(+)?,python?,${PYTHON_SINGLE_USEDEP},${MULTILIB_USEDEP}]
+	<sys-libs/ldb-2.1.0[ldap(+)?,python?,${PYTHON_SINGLE_USEDEP},${MULTILIB_USEDEP}]
+	sys-libs/libcap
+	sys-libs/ncurses:0=
+	sys-libs/readline:0=
+	>=sys-libs/talloc-2.2.0[python?,${PYTHON_SINGLE_USEDEP},${MULTILIB_USEDEP}]
+	>=sys-libs/tdb-1.4.2[python?,${PYTHON_SINGLE_USEDEP},${MULTILIB_USEDEP}]
+	>=sys-libs/tevent-0.10.0[python?,${PYTHON_SINGLE_USEDEP},${MULTILIB_USEDEP}]
+	sys-libs/zlib[${MULTILIB_USEDEP}]
+	virtual/libiconv
+	pam? ( sys-libs/pam )
+	acl? ( virtual/acl )
+	addns? (
+		net-dns/bind-tools[gssapi]
+		$(python_gen_cond_dep 'dev-python/dnspython:=[${PYTHON_USEDEP}]')
+	)
+	ceph? ( sys-cluster/ceph )
+	cluster? (
+		net-libs/rpcsvc-proto
+		!dev-db/ctdb
+	)
+	cups? ( net-print/cups )
+	debug? ( dev-util/lttng-ust )
+	dmapi? ( sys-apps/dmapi )
+	fam? ( virtual/fam )
+	gpg? ( app-crypt/gpgme )
+	json? ( dev-libs/jansson )
+	ldap? ( net-nds/openldap[${MULTILIB_USEDEP}] )
+	snapper? ( sys-apps/dbus )
+	system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,${MULTILIB_USEDEP}] )
+	system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[${MULTILIB_USEDEP}] )
+	systemd? ( sys-apps/systemd:0= )
+	zeroconf? ( net-dns/avahi )
+"
+DEPEND="${CDEPEND}
+	${PYTHON_DEPS}
+	app-text/docbook-xsl-stylesheets
+	dev-libs/libxslt
+	net-libs/libtirpc[${MULTILIB_USEDEP}]
+	virtual/pkgconfig
+	|| (
+		net-libs/rpcsvc-proto
+		<sys-libs/glibc-2.26[rpc(+)]
+	)
+	test? (
+		!system-mitkrb5? (
+			>=sys-libs/nss_wrapper-1.1.3
+			>=net-dns/resolv_wrapper-1.1.4
+			>=net-libs/socket_wrapper-1.1.9
+			>=sys-libs/uid_wrapper-1.2.1
+		)
+	)"
+RDEPEND="${CDEPEND}
+	python? ( ${PYTHON_DEPS} )
+	client? ( net-fs/cifs-utils[ads?] )
+	selinux? ( sec-policy/selinux-samba )
+	!dev-perl/Parse-Yapp
+"
+
+REQUIRED_USE="
+	addc? ( python json winbind )
+	addns? ( python )
+	ads? ( acl ldap winbind )
+	cluster? ( ads )
+	gpg? ( addc )
+	python? ( ldap )
+	test? ( python )
+	?? ( system-heimdal system-mitkrb5 )
+	${PYTHON_REQUIRED_USE}
+"
+
+# the test suite is messed, it uses system-installed samba
+# bits instead of what was built, tests things disabled via use
+# flags, and generally just fails to work in a way ebuilds could
+# rely on in its current state
+RESTRICT="test"
+
+S="${WORKDIR}/${MY_P}"
+
+PATCHES=(
+	"${FILESDIR}/${PN}-4.4.0-pam.patch"
+	"${FILESDIR}/${PN}-4.9.2-timespec.patch"
+	"${FILESDIR}/${PN}-4.13-winexe_option.patch"
+	"${FILESDIR}/${PN}-4.13-vfs_snapper_configure_option.patch"
+
+	"${FILESDIR}/${PN}-4.11-async-dns-lookup.patch"
+
+	"${FILESDIR}/${PN}-4.11.13-machinepass_stdin.patch"
+	"${FILESDIR}/${PN}-4.11.13-machinepass_expire.patch"
+	"${FILESDIR}/${PN}-4.11.13-reuse_existing_computer_account.patch"
+
+	# Temporary workaround until we fix Samba/OpenLDAP issues (see
+	# https://crbug.com/953613).
+	"${FILESDIR}/${PN}-4.11.13-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch"
+)
+
+#CONFDIR="${FILESDIR}/$(get_version_component_range 1-2)"
+CONFDIR="${FILESDIR}/4.4"
+
+WAF_BINARY="${S}/buildtools/bin/waf"
+
+SHAREDMODS=""
+
+pkg_setup() {
+	# Package fails to build with distcc
+	export DISTCC_DISABLE=1
+
+	python-single-r1_pkg_setup
+	if use cluster ; then
+		SHAREDMODS="idmap_rid,idmap_tdb2,idmap_ad"
+	elif use ads ; then
+		SHAREDMODS="idmap_ad"
+	fi
+}
+
+src_prepare() {
+	default
+
+	# un-bundle dnspython
+	sed -i -e '/"dns.resolver":/d' "${S}"/third_party/wscript || die
+
+	# unbundle iso8601 unless tests are enabled
+	if ! use test ; then
+		sed -i -e '/"iso8601":/d' "${S}"/third_party/wscript || die
+	fi
+
+	# ugly hackaround for bug #592502
+	cp "${SYSROOT}"/usr/include/tevent_internal.h "${S}"/lib/tevent/ || die
+
+	sed -e 's:<gpgme\.h>:<gpgme/gpgme.h>:' \
+		-i source4/dsdb/samdb/ldb_modules/password_hash.c \
+		|| die
+
+	# Friggin' WAF shit
+	multilib_copy_sources
+}
+
+multilib_src_configure() {
+	# when specifying libs for samba build you must append NONE to the end to
+	# stop it automatically including things
+	local bundled_libs="NONE"
+	if ! use system-heimdal && ! use system-mitkrb5 ; then
+		bundled_libs="heimbase,heimntlm,hdb,kdc,krb5,wind,gssapi,hcrypto,hx509,roken,asn1,com_err,NONE"
+	fi
+
+	local myconf=(
+		--enable-fhs
+		--sysconfdir="${EPREFIX}/etc"
+		--localstatedir="${EPREFIX}/var"
+		--with-modulesdir="${EPREFIX}/usr/$(get_libdir)/samba"
+		--with-piddir="${EPREFIX}/run/${PN}"
+		--bundled-libraries="${bundled_libs}"
+		--builtin-libraries=NONE
+		--disable-rpath
+		--disable-rpath-install
+		--nopyc
+		--nopyo
+		--without-winexe
+		--without-regedit
+		--with-libiconv="${SYSROOT}/usr"
+		$(multilib_native_use_with acl acl-support)
+		$(multilib_native_usex addc '' '--without-ad-dc')
+		$(multilib_native_use_with addns dnsupdate)
+		$(multilib_native_use_with ads)
+		$(multilib_native_use_enable ceph cephfs)
+		$(multilib_native_use_with cluster cluster-support)
+		$(multilib_native_use_enable cups)
+		$(multilib_native_use_with dmapi)
+		$(multilib_native_use_with fam)
+		$(multilib_native_use_with gpg gpgme)
+		$(multilib_native_use_with json)
+		$(multilib_native_use_enable iprint)
+		$(multilib_native_use_with pam)
+		$(multilib_native_usex pam "--with-pammodulesdir=${EPREFIX}/$(get_libdir)/security" '')
+		$(multilib_native_use_with quota quotas)
+		$(multilib_native_use_enable snapper)
+		$(multilib_native_use_with syslog)
+		$(multilib_native_use_with systemd)
+		$(multilib_native_use_with winbind)
+		$(multilib_native_usex python '' '--disable-python')
+		$(multilib_native_use_enable zeroconf avahi)
+		$(multilib_native_usex test '--enable-selftest' '')
+		$(usex system-mitkrb5 "--with-system-mitkrb5 $(multilib_native_usex addc --with-experimental-mit-ad-dc '')" '')
+		$(use_with debug lttng)
+		$(use_with ldap)
+		$(use_with profiling-data)
+		# Gentoo bug #683148
+		--jobs 1
+	)
+
+	multilib_is_native_abi && myconf+=( --with-shared-modules=${SHAREDMODS} )
+
+	KRB5_CONFIG="${CHOST}-krb5-config" \
+	CPPFLAGS="-I${SYSROOT}${EPREFIX}/usr/include/et ${CPPFLAGS}" \
+		waf-utils_src_configure ${myconf[@]}
+}
+
+multilib_src_compile() {
+	waf-utils_src_compile
+}
+
+multilib_src_install() {
+	waf-utils_src_install
+
+	# Make all .so files executable
+	find "${ED}" -type f -name "*.so" -exec chmod +x {} + || die
+
+	if multilib_is_native_abi ; then
+		# install ldap schema for server (bug #491002)
+		if use ldap ; then
+			insinto /etc/openldap/schema
+			doins examples/LDAP/samba.schema
+		fi
+
+		# create symlink for cups (bug #552310)
+		if use cups ; then
+			dosym ../../../bin/smbspool /usr/libexec/cups/backend/smb
+		fi
+
+		# install example config file
+		insinto /etc/samba
+		doins examples/smb.conf.default
+
+		# Fix paths in example file (#603964)
+		sed \
+			-e '/log file =/s@/usr/local/samba/var/@/var/log/samba/@' \
+			-e '/include =/s@/usr/local/samba/lib/@/etc/samba/@' \
+			-e '/path =/s@/usr/local/samba/lib/@/var/lib/samba/@' \
+			-e '/path =/s@/usr/local/samba/@/var/lib/samba/@' \
+			-e '/path =/s@/usr/spool/samba@/var/spool/samba@' \
+			-i "${ED%/}"/etc/samba/smb.conf.default || die
+
+		# Install init script and conf.d file
+		newinitd "${CONFDIR}/samba4.initd-r1" samba
+		newconfd "${CONFDIR}/samba4.confd" samba
+
+		systemd_dotmpfilesd "${FILESDIR}"/samba.conf
+		systemd_dounit "${FILESDIR}"/nmbd.service
+		systemd_dounit "${FILESDIR}"/smbd.{service,socket}
+		systemd_newunit "${FILESDIR}"/smbd_at.service 'smbd@.service'
+		systemd_dounit "${FILESDIR}"/winbindd.service
+		systemd_dounit "${FILESDIR}"/samba.service
+	fi
+
+	if use pam && use winbind ; then
+		newpamd "${CONFDIR}/system-auth-winbind.pam" system-auth-winbind
+		# bugs #376853 and #590374
+		insinto /etc/security
+		doins examples/pam_winbind/pam_winbind.conf
+	fi
+
+	# Prune empty dirs to avoid tripping multilib checks.
+	rmdir "${D}"/usr/lib* 2>/dev/null
+}
+
+multilib_src_install_all() {
+	# Attempt to fix bug #673168
+	find "${ED}" -type d -name "Yapp" -print0 \
+		| xargs -0 --no-run-if-empty rm -r || die
+}
+
+multilib_src_test() {
+	if multilib_is_native_abi ; then
+		"${WAF_BINARY}" test || die "test failed"
+	fi
+}
+
+pkg_postinst() {
+	ewarn "Be aware that this release contains the best of all of Samba's"
+	ewarn "technology parts, both a file server (that you can reasonably expect"
+	ewarn "to upgrade existing Samba 3.x releases to) and the AD domain"
+	ewarn "controller work previously known as 'samba4'."
+
+	elog "For further information and migration steps make sure to read "
+	elog "https://samba.org/samba/history/${P}.html "
+	elog "https://wiki.samba.org/index.php/Samba4/HOWTO "
+}
diff --git a/net-fs/samba/samba-4.11.9-r1.ebuild b/net-fs/samba/samba-4.11.9-r1.ebuild
deleted file mode 100644
index 4e1c642..0000000
--- a/net-fs/samba/samba-4.11.9-r1.ebuild
+++ /dev/null
@@ -1,333 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-PYTHON_COMPAT=( python3_{6,7,8} )
-PYTHON_REQ_USE='threads(+),xml(+)'
-
-inherit python-single-r1 waf-utils multilib-minimal linux-info systemd pam
-
-MY_PV="${PV/_rc/rc}"
-MY_P="${PN}-${MY_PV}"
-
-SRC_PATH="stable"
-[[ ${PV} = *_rc* ]] && SRC_PATH="rc"
-
-SRC_URI="mirror://samba/${SRC_PATH}/${MY_P}.tar.gz"
-[[ ${PV} = *_rc* ]] || \
-KEYWORDS="*"
-
-DESCRIPTION="Samba Suite Version 4"
-HOMEPAGE="https://www.samba.org/"
-LICENSE="GPL-3"
-
-SLOT="0"
-
-IUSE="acl addc addns ads ceph client cluster cups debug dmapi fam gpg iprint 
-json ldap pam perl profiling-data python quota selinux snapper syslog
-system-heimdal +system-mitkrb5 systemd test winbind zeroconf"
-
-MULTILIB_WRAPPED_HEADERS=(
-	/usr/include/samba-4.0/policy.h
-	/usr/include/samba-4.0/dcerpc_server.h
-	/usr/include/samba-4.0/ctdb.h
-	/usr/include/samba-4.0/ctdb_client.h
-	/usr/include/samba-4.0/ctdb_protocol.h
-	/usr/include/samba-4.0/ctdb_private.h
-	/usr/include/samba-4.0/ctdb_typesafe_cb.h
-	/usr/include/samba-4.0/ctdb_version.h
-)
-
-# sys-apps/attr is an automagic dependency (see bug #489748)
-CDEPEND="
-	>=app-arch/libarchive-3.1.2[${MULTILIB_USEDEP}]
-	perl? ( dev-lang/perl:= )
-	dev-libs/libaio[${MULTILIB_USEDEP}]
-	dev-libs/libbsd[${MULTILIB_USEDEP}]
-	dev-libs/libgcrypt:0
-	dev-libs/iniparser:0
-	dev-libs/libtasn1[${MULTILIB_USEDEP}]
-	dev-libs/popt[${MULTILIB_USEDEP}]
-	python? ( dev-python/subunit[${PYTHON_USEDEP},${MULTILIB_USEDEP}] )
-	>=dev-util/cmocka-1.1.1[${MULTILIB_USEDEP}]
-	>=net-libs/gnutls-3.2.0
-	net-libs/libnsl:=[${MULTILIB_USEDEP}]
-	sys-apps/attr[${MULTILIB_USEDEP}]
-	sys-libs/e2fsprogs-libs[${MULTILIB_USEDEP}]
-	>=sys-libs/ldb-2.0.10[ldap(+)?,python?,${PYTHON_USEDEP},${MULTILIB_USEDEP}]
-	<sys-libs/ldb-2.1.0[ldap(+)?,python?,${PYTHON_USEDEP},${MULTILIB_USEDEP}]
-	sys-libs/libcap
-	sys-libs/ncurses:0=[${MULTILIB_USEDEP}]
-	sys-libs/readline:0=
-	>=sys-libs/talloc-2.2.0[python?,${MULTILIB_USEDEP}]
-	>=sys-libs/tdb-1.4.2[python?,${MULTILIB_USEDEP}]
-	>=sys-libs/tevent-0.10.0[python?,${MULTILIB_USEDEP}]
-	python? (
-		>=sys-libs/talloc-2.2.0[${PYTHON_USEDEP}]
-		>=sys-libs/tdb-1.4.2[${PYTHON_USEDEP}]
-		>=sys-libs/tevent-0.10.0[${PYTHON_USEDEP}]
-	)
-	sys-libs/zlib[${MULTILIB_USEDEP}]
-	virtual/libiconv
-	pam? ( sys-libs/pam )
-	acl? ( virtual/acl )
-	addns? (
-		net-dns/bind-tools[gssapi]
-		dev-python/dnspython:=[${PYTHON_USEDEP}]
-	)
-	ceph? ( sys-cluster/ceph )
-	cluster? (
-		net-libs/rpcsvc-proto
-		!dev-db/ctdb
-	)
-	cups? ( net-print/cups )
-	debug? ( dev-util/lttng-ust )
-	dmapi? ( sys-apps/dmapi )
-	fam? ( virtual/fam )
-	gpg? ( app-crypt/gpgme )
-	json? ( dev-libs/jansson )
-	ldap? ( net-nds/openldap[${MULTILIB_USEDEP}] )
-	snapper? ( sys-apps/dbus )
-	system-heimdal? ( >=app-crypt/heimdal-1.5[-ssl,${MULTILIB_USEDEP}] )
-	system-mitkrb5? ( >=app-crypt/mit-krb5-1.15.1[${MULTILIB_USEDEP}] )
-	systemd? ( sys-apps/systemd:0= )
-	zeroconf? ( net-dns/avahi )
-"
-DEPEND="${CDEPEND}
-	${PYTHON_DEPS}
-	app-text/docbook-xsl-stylesheets
-	dev-libs/libxslt
-	net-libs/libtirpc[${MULTILIB_USEDEP}]
-	virtual/pkgconfig
-	|| (
-		net-libs/rpcsvc-proto
-		<sys-libs/glibc-2.26[rpc(+)]
-	)
-	test? (
-		!system-mitkrb5? (
-			>=sys-libs/nss_wrapper-1.1.3
-			>=net-dns/resolv_wrapper-1.1.4
-			>=net-libs/socket_wrapper-1.1.9
-			>=sys-libs/uid_wrapper-1.2.1
-		)
-	)"
-RDEPEND="${CDEPEND}
-	python? ( ${PYTHON_DEPS} )
-	client? ( net-fs/cifs-utils[ads?] )
-	selinux? ( sec-policy/selinux-samba )
-	!dev-perl/Parse-Yapp
-"
-
-REQUIRED_USE="
-	addc? ( python json winbind )
-	addns? ( python )
-	ads? ( acl ldap winbind )
-	cluster? ( ads )
-	gpg? ( addc )
-	python? ( ldap )
-	test? ( python )
-	?? ( system-heimdal system-mitkrb5 )
-	${PYTHON_REQUIRED_USE}
-"
-
-# the test suite is messed, it uses system-installed samba
-# bits instead of what was built, tests things disabled via use
-# flags, and generally just fails to work in a way ebuilds could
-# rely on in its current state
-RESTRICT="test"
-
-S="${WORKDIR}/${MY_P}"
-
-PATCHES=(
-	"${FILESDIR}/${PN}-4.4.0-pam.patch"
-	"${FILESDIR}/${PN}-4.9.2-timespec.patch"
-	"${FILESDIR}/${PN}-4.13-winexe_option.patch"
-	"${FILESDIR}/${PN}-4.13-vfs_snapper_configure_option.patch"
-
-	"${FILESDIR}/${PN}-4.11.9-machinepass_stdin.patch"
-	"${FILESDIR}/${PN}-4.11.9-machinepass_expire.patch"
-	"${FILESDIR}/${PN}-4.11.9-reuse_existing_computer_account.patch"
-
-	# Temporary workaround until we fix Samba/OpenLDAP issues (see
-	# https://crbug.com/953613).
-	"${FILESDIR}/${PN}-4.11.9-lib-gpo-Cope-with-Site-GPO-s-list-failure.patch"
-)
-
-#CONFDIR="${FILESDIR}/$(get_version_component_range 1-2)"
-CONFDIR="${FILESDIR}/4.4"
-
-WAF_BINARY="${S}/buildtools/bin/waf"
-
-SHAREDMODS=""
-
-pkg_setup() {
-	python-single-r1_pkg_setup
-	if use cluster ; then
-		SHAREDMODS="idmap_rid,idmap_tdb2,idmap_ad"
-	elif use ads ; then
-		SHAREDMODS="idmap_ad"
-	fi
-}
-
-src_prepare() {
-	default
-
-	# un-bundle dnspython
-	sed -i -e '/"dns.resolver":/d' "${S}"/third_party/wscript || die
-
-	# unbundle iso8601 unless tests are enabled
-	if ! use test ; then
-		sed -i -e '/"iso8601":/d' "${S}"/third_party/wscript || die
-	fi
-
-	# ugly hackaround for bug #592502
-	cp "${SYSROOT}"/usr/include/tevent_internal.h "${S}"/lib/tevent/ || die
-
-	sed -e 's:<gpgme\.h>:<gpgme/gpgme.h>:' \
-		-i source4/dsdb/samdb/ldb_modules/password_hash.c \
-		|| die
-
-	# Friggin' WAF shit
-	multilib_copy_sources
-}
-
-multilib_src_configure() {
-	# when specifying libs for samba build you must append NONE to the end to
-	# stop it automatically including things
-	local bundled_libs="NONE"
-	if ! use system-heimdal && ! use system-mitkrb5 ; then
-		bundled_libs="heimbase,heimntlm,hdb,kdc,krb5,wind,gssapi,hcrypto,hx509,roken,asn1,com_err,NONE"
-	fi
-
-	local myconf=(
-		--enable-fhs
-		--sysconfdir="${EPREFIX}/etc"
-		--localstatedir="${EPREFIX}/var"
-		--with-modulesdir="${EPREFIX}/usr/$(get_libdir)/samba"
-		--with-piddir="${EPREFIX}/run/${PN}"
-		--bundled-libraries="${bundled_libs}"
-		--builtin-libraries=NONE
-		--disable-rpath
-		--disable-rpath-install
-		--nopyc
-		--nopyo
-		--without-winexe
-		--without-regedit
-		--with-libiconv="${SYSROOT}/usr"
-		$(multilib_native_use_with acl acl-support)
-		$(multilib_native_usex addc '' '--without-ad-dc')
-		$(multilib_native_use_with addns dnsupdate)
-		$(multilib_native_use_with ads)
-		$(multilib_native_use_enable ceph cephfs)
-		$(multilib_native_use_with cluster cluster-support)
-		$(multilib_native_use_enable cups)
-		$(multilib_native_use_with dmapi)
-		$(multilib_native_use_with fam)
-		$(multilib_native_use_with gpg gpgme)
-		$(multilib_native_use_with json)
-		$(multilib_native_use_enable iprint)
-		$(multilib_native_use_with pam)
-		$(multilib_native_usex pam "--with-pammodulesdir=${EPREFIX}/$(get_libdir)/security" '')
-		$(multilib_native_use_with quota quotas)
-		$(multilib_native_use_enable snapper)
-		$(multilib_native_use_with syslog)
-		$(multilib_native_use_with systemd)
-		$(multilib_native_use_with winbind)
-		$(multilib_native_usex python '' '--disable-python')
-		$(multilib_native_use_enable zeroconf avahi)
-		$(multilib_native_usex test '--enable-selftest' '')
-		$(usex system-mitkrb5 "--with-system-mitkrb5 $(multilib_native_usex addc --with-experimental-mit-ad-dc '')" '')
-		$(use_with debug lttng)
-		$(use_with ldap)
-		$(use_with profiling-data)
-		# Gentoo bug #683148
-		--jobs 1
-	)
-
-	multilib_is_native_abi && myconf+=( --with-shared-modules=${SHAREDMODS} )
-
-	KRB5_CONFIG="${CHOST}-krb5-config" \
-	CPPFLAGS="-I${SYSROOT}${EPREFIX}/usr/include/et ${CPPFLAGS}" \
-		waf-utils_src_configure ${myconf[@]}
-}
-
-multilib_src_compile() {
-	waf-utils_src_compile
-}
-
-multilib_src_install() {
-	waf-utils_src_install
-
-	# Make all .so files executable
-	find "${ED}" -type f -name "*.so" -exec chmod +x {} + || die
-
-	if multilib_is_native_abi ; then
-		# install ldap schema for server (bug #491002)
-		if use ldap ; then
-			insinto /etc/openldap/schema
-			doins examples/LDAP/samba.schema
-		fi
-
-		# create symlink for cups (bug #552310)
-		if use cups ; then
-			dosym ../../../bin/smbspool /usr/libexec/cups/backend/smb
-		fi
-
-		# install example config file
-		insinto /etc/samba
-		doins examples/smb.conf.default
-
-		# Fix paths in example file (#603964)
-		sed \
-			-e '/log file =/s@/usr/local/samba/var/@/var/log/samba/@' \
-			-e '/include =/s@/usr/local/samba/lib/@/etc/samba/@' \
-			-e '/path =/s@/usr/local/samba/lib/@/var/lib/samba/@' \
-			-e '/path =/s@/usr/local/samba/@/var/lib/samba/@' \
-			-e '/path =/s@/usr/spool/samba@/var/spool/samba@' \
-			-i "${ED%/}"/etc/samba/smb.conf.default || die
-
-		# Install init script and conf.d file
-		newinitd "${CONFDIR}/samba4.initd-r1" samba
-		newconfd "${CONFDIR}/samba4.confd" samba
-
-		systemd_dotmpfilesd "${FILESDIR}"/samba.conf
-		systemd_dounit "${FILESDIR}"/nmbd.service
-		systemd_dounit "${FILESDIR}"/smbd.{service,socket}
-		systemd_newunit "${FILESDIR}"/smbd_at.service 'smbd@.service'
-		systemd_dounit "${FILESDIR}"/winbindd.service
-		systemd_dounit "${FILESDIR}"/samba.service
-	fi
-
-	if use pam && use winbind ; then
-		newpamd "${CONFDIR}/system-auth-winbind.pam" system-auth-winbind
-		# bugs #376853 and #590374
-		insinto /etc/security
-		doins examples/pam_winbind/pam_winbind.conf
-	fi
-
-	# Prune empty dirs to avoid tripping multilib checks.
-	rmdir "${D}"/usr/lib* 2>/dev/null
-}
-
-multilib_src_install_all() {
-	# Attempt to fix bug #673168
-	find "${ED}" -type d -name "Yapp" -print0 \
-		| xargs -0 --no-run-if-empty rm -r || die
-}
-
-multilib_src_test() {
-	if multilib_is_native_abi ; then
-		"${WAF_BINARY}" test || die "test failed"
-	fi
-}
-
-pkg_postinst() {
-	ewarn "Be aware that this release contains the best of all of Samba's"
-	ewarn "technology parts, both a file server (that you can reasonably expect"
-	ewarn "to upgrade existing Samba 3.x releases to) and the AD domain"
-	ewarn "controller work previously known as 'samba4'."
-
-	elog "For further information and migration steps make sure to read "
-	elog "https://samba.org/samba/history/${P}.html "
-	elog "https://wiki.samba.org/index.php/Samba4/HOWTO "
-}
diff --git a/net-fs/samba/samba-4.11.9-r2.ebuild b/net-fs/samba/samba-4.11.9-r2.ebuild
deleted file mode 120000
index 018d4d6..0000000
--- a/net-fs/samba/samba-4.11.9-r2.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-samba-4.11.9-r1.ebuild
\ No newline at end of file
diff --git a/net-libs/grpc/files/grpc-1.16.1-string-contatenation.patch b/net-libs/grpc/files/grpc-1.16.1-string-contatenation.patch
new file mode 100644
index 0000000..70fe3a8
--- /dev/null
+++ b/net-libs/grpc/files/grpc-1.16.1-string-contatenation.patch
@@ -0,0 +1,21 @@
+Author: cmtice@google.com
+Date: 15-Sep-2020
+
+Clang has a new warning, -Wstring-contatenation, which fails without this
+patch (crosbug/1128147).
+
+diff --git a/src/core/lib/debug/stats_data.cc b/src/core/lib/debug/stats_data.cc
+index f8c27db..567b341 100644
+--- a/src/core/lib/debug/stats_data.cc
++++ b/src/core/lib/debug/stats_data.cc
+@@ -280,8 +280,8 @@ const char* grpc_stats_histogram_doc[GRPC_STATS_HISTOGRAM_COUNT] = {
+     "Number of streams whose payload was written per TCP write",
+     "Number of streams terminated per TCP write",
+     "Number of flow control updates written per TCP write",
+-    "How many completion queues were checked looking for a CQ that had "
+-    "requested the incoming call",
++    ("How many completion queues were checked looking for a CQ that had "
++    "requested the incoming call"),
+ };
+ const int grpc_stats_table_0[65] = {
+     0,      1,      2,      3,      4,     5,     7,     9,     11,    14,
diff --git a/net-libs/grpc/grpc-1.16.1-r3.ebuild b/net-libs/grpc/grpc-1.16.1-r5.ebuild
similarity index 100%
rename from net-libs/grpc/grpc-1.16.1-r3.ebuild
rename to net-libs/grpc/grpc-1.16.1-r5.ebuild
diff --git a/net-libs/grpc/grpc-1.16.1.ebuild b/net-libs/grpc/grpc-1.16.1.ebuild
index bf38d5f..9dc6d8e 100644
--- a/net-libs/grpc/grpc-1.16.1.ebuild
+++ b/net-libs/grpc/grpc-1.16.1.ebuild
@@ -39,12 +39,15 @@
 	"${FILESDIR}/grpc-1.16.0-Prevent-shell-calls-longer-than-ARG_MAX.patch"
 	"${FILESDIR}/grpc-1.16.1-fix-cross-compilation.patch"
 	"${FILESDIR}/grpc-1.16.1-Support-vsock.patch"
+	"${FILESDIR}/grpc-1.16.1-string-contatenation.patch"
 )
 
 S="${WORKDIR}/${PN}-${MY_PV}"
 
 src_prepare() {
 	sed -i 's@$(prefix)/lib@$(prefix)/$(INSTALL_LIBDIR)@g' Makefile || die "fix libdir"
+	sed -i 's/^install-headers_cxx:$/install-headers_cxx: install-headers_c/g' Makefile \
+		|| die "failed to patch install-headers_cxx"
 	default
 }
 
diff --git a/net-libs/libiio/Manifest b/net-libs/libiio/Manifest
new file mode 100644
index 0000000..a47f637
--- /dev/null
+++ b/net-libs/libiio/Manifest
@@ -0,0 +1 @@
+DIST libiio-0.21.tar.gz 446893 BLAKE2B 02b6af8e78ab95fa68b146808c58dd012846837646bb0e7e60af890c0e867ed9bb798596e6ff773d6da9efa2750859d23a0f83d874510273ef1d1db8f9424bcb SHA512 5bbacd6a1141654f4825f00c1c2b27223e6cc324c80d7bcbb49e29997a83d585e45c0c52331ca10ee881c2f340b535984c3d667b61d8377a77e5c0f5cb1d2dc0
diff --git a/net-libs/libiio/files/libiio-cros-ec-ring-workaround.patch b/net-libs/libiio/files/libiio-cros-ec-ring-workaround.patch
new file mode 100644
index 0000000..a41a573
--- /dev/null
+++ b/net-libs/libiio/files/libiio-cros-ec-ring-workaround.patch
@@ -0,0 +1,53 @@
+From 8539d5dcf2d04cfc1985e3272fb20b3109ebb492 Mon Sep 17 00:00:00 2001
+From: Enrico Granata <egranata@chromium.org>
+Date: Mon, 6 May 2019 11:05:23 -0700
+Subject: [PATCH] CHROMIUM: HACK: ignore error in set up of cros_ec_sensor_ring
+ iio_device
+
+cros-ec-ring exposes attributes that are tricky for libiio to parse due to
+its use of extended_name on a few of its channels. Since this driver is
+slated for removal, and the correct fix for this general issue is tricky
+and likely to require design work, the path of least friction is a
+temporary hack in our internal repo to allow the iio_context to proceed
+to being created even if cros-ec-ring causes a parse error
+
+BUG=chromium:958236
+TEST=run mems_setup with the sensor ring driver loaded,
+     observe it ignore the device instead of failing
+
+Conflicts: Use IIO_DEBUG instead of DEBUG.
+
+Change-Id: I51f825c6797a23f469703aaba4a5551bf5a60b61
+Signed-off-by: Enrico Granata <egranata@chromium.org>
+Reviewed-on: https://chromium-review.googlesource.com/1597153
+Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
+Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
+---
+ local.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/local.c b/local.c
+index d05afb6f..40b89957 100644
+--- a/local.c
++++ b/local.c
+@@ -1765,8 +1765,18 @@ static int create_device(void *d, const char *path)
+ 		set_channel_name(chn);
+ 		ret = handle_scan_elements(chn);
+ 		free_protected_attrs(chn);
+-		if (ret < 0)
+-			goto err_free_scan_elements;
++		if (ret < 0) {
++			if (dev->name &&
++			    !strcmp("cros-ec-ring", dev->name)) {
++				IIO_DEBUG("ignoring cros-ec-ring\n");
++
++				/* pretend the operation completed successfully
++				 * even though we can't process the attributes
++				 * of the sensor ring */
++				ret = 0;
++				goto err_free_scan_elements;
++			}
++		}
+ 	}
+ 
+ 	ret = detect_and_move_global_attrs(dev);
diff --git a/net-libs/libiio/libiio-0.0.1-r10.ebuild b/net-libs/libiio/libiio-0.0.1-r10.ebuild
deleted file mode 100644
index 7c48070..0000000
--- a/net-libs/libiio/libiio-0.0.1-r10.ebuild
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 1999-2019 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="213eca340c157b96232242da15539e12efb2d5c9"
-CROS_WORKON_TREE="902ceaea85c01fdd131e491b4615dafb28601761"
-CROS_WORKON_PROJECT="chromiumos/third_party/libiio"
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cmake-utils cros-workon
-
-DESCRIPTION="Library for interfacing with IIO devices"
-HOMEPAGE="https://github.com/analogdevicesinc/libiio"
-
-LICENSE="LGPL-2.1"
-SLOT="0/${PV}"
-KEYWORDS="*"
-
-# By default, only libiio is installed.
-# For testing, use USE=libiio_all to compile tests and iiod daemon.
-IUSE="aio avahi libiio_all"
-
-RDEPEND="dev-libs/libxml2:=
-	aio? ( dev-libs/libaio:= )
-	libiio_all? (
-		avahi? ( net-dns/avahi )
-	)
-	!dev-libs/libiio"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	# For test purposes, compile iiod and test tools, and allow connection over network.
-	use libiio_all || mycmakeargs+=( -DWITH_IIOD=OFF -DWITH_TESTS=OFF -DWITH_NETWORK_BACKEND=OFF)
-
-	# Remove udev rules to detect sensors on USB devices, USB and serial backends.
-	mycmakeargs+=( -DINSTALL_UDEV_RULE=OFF -DWITH_USB_BACKEND=OFF -DWITH_SERIAL_BACKEND=OFF)
-
-	cmake-utils_src_configure
-	default
-}
diff --git a/net-libs/libiio/libiio-0.21-r1.ebuild b/net-libs/libiio/libiio-0.21-r1.ebuild
new file mode 120000
index 0000000..e66ebf8
--- /dev/null
+++ b/net-libs/libiio/libiio-0.21-r1.ebuild
@@ -0,0 +1 @@
+libiio-0.21.ebuild
\ No newline at end of file
diff --git a/net-libs/libiio/libiio-0.21.ebuild b/net-libs/libiio/libiio-0.21.ebuild
new file mode 100644
index 0000000..d1ad19e
--- /dev/null
+++ b/net-libs/libiio/libiio-0.21.ebuild
@@ -0,0 +1,50 @@
+# Copyright 1999-2019 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit cmake-utils
+
+DESCRIPTION="Library for interfacing with IIO devices"
+HOMEPAGE="https://github.com/analogdevicesinc/libiio"
+if [[ "${PV}" == "99999999" ]]; then
+	EGIT_REPO_URI="https://github.com/analogdevicesinc/libiio"
+	inherit git-r3
+else
+	SRC_URI="https://github.com/analogdevicesinc/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
+fi
+
+KEYWORDS="*"
+LICENSE="LGPL-2.1"
+SLOT="0/${PV}"
+
+# By default, only libiio is installed.
+# For testing, use USE=libiio_all to compile tests and iiod daemon.
+IUSE="aio iioservice libiio_all zeroconf"
+
+RDEPEND="dev-libs/libxml2:=
+	aio? ( dev-libs/libaio )
+	libiio_all? (
+		zeroconf? ( net-dns/avahi )
+	)
+	!dev-libs/libiio"
+
+DEPEND="${RDEPEND}"
+
+src_prepare() {
+	use iioservice || eapply "${FILESDIR}"/${PN}-cros-ec-ring-workaround.patch
+
+	cmake-utils_src_prepare
+	default
+}
+
+src_configure() {
+	# For test purposes, compile iiod and test tools, and allow connection over network.
+	use libiio_all || mycmakeargs+=( -DWITH_IIOD=OFF -DWITH_TESTS=OFF -DWITH_NETWORK_BACKEND=OFF)
+
+	# Remove udev rules to detect sensors on USB devices, USB and serial backends.
+	mycmakeargs+=( -DINSTALL_UDEV_RULE=OFF -DWITH_USB_BACKEND=OFF -DWITH_SERIAL_BACKEND=OFF)
+
+	cmake-utils_src_configure
+	default
+}
diff --git a/net-libs/libiio/libiio-9999.ebuild b/net-libs/libiio/libiio-9999.ebuild
deleted file mode 100644
index 2ba554c..0000000
--- a/net-libs/libiio/libiio-9999.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 1999-2019 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_PROJECT="chromiumos/third_party/libiio"
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cmake-utils cros-workon
-
-DESCRIPTION="Library for interfacing with IIO devices"
-HOMEPAGE="https://github.com/analogdevicesinc/libiio"
-
-LICENSE="LGPL-2.1"
-SLOT="0/${PV}"
-KEYWORDS="~*"
-
-# By default, only libiio is installed.
-# For testing, use USE=libiio_all to compile tests and iiod daemon.
-IUSE="aio avahi libiio_all"
-
-RDEPEND="dev-libs/libxml2:=
-	aio? ( dev-libs/libaio:= )
-	libiio_all? (
-		avahi? ( net-dns/avahi )
-	)
-	!dev-libs/libiio"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	# For test purposes, compile iiod and test tools, and allow connection over network.
-	use libiio_all || mycmakeargs+=( -DWITH_IIOD=OFF -DWITH_TESTS=OFF -DWITH_NETWORK_BACKEND=OFF)
-
-	# Remove udev rules to detect sensors on USB devices, USB and serial backends.
-	mycmakeargs+=( -DINSTALL_UDEV_RULE=OFF -DWITH_USB_BACKEND=OFF -DWITH_SERIAL_BACKEND=OFF)
-
-	cmake-utils_src_configure
-	default
-}
diff --git a/net-libs/libmbim/libmbim-1.25.0-r68.ebuild b/net-libs/libmbim/libmbim-1.25.0-r68.ebuild
deleted file mode 100644
index bb5dae9..0000000
--- a/net-libs/libmbim/libmbim-1.25.0-r68.ebuild
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 1999-2013 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="a3ce8d76c8953528a0b345870df0ea2853de6f25"
-CROS_WORKON_TREE="6ad52e53a9e89c5d0888aafa5c8274a4c327bf74"
-CROS_WORKON_PROJECT="chromiumos/third_party/libmbim"
-
-inherit autotools cros-sanitizers cros-workon
-
-DESCRIPTION="MBIM modem protocol helper library"
-HOMEPAGE="http://cgit.freedesktop.org/libmbim/"
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan doc static-libs"
-
-RDEPEND=">=dev-libs/glib-2.36
-	virtual/libgudev"
-
-DEPEND="${RDEPEND}
-	doc? ( dev-util/gtk-doc )
-	virtual/pkgconfig"
-
-src_prepare() {
-	default
-	gtkdocize
-	eautoreconf
-}
-
-src_configure() {
-	sanitizers-setup-env
-
-	econf \
-		--enable-mbim-username='modem' \
-		--enable-compile-warnings=yes \
-		$(use_enable static{-libs,}) \
-		$(use_enable {,gtk-}doc)
-}
-
-src_test() {
-	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
-	[[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] && emake check
-}
-
-src_install() {
-	default
-	use static-libs || rm -f "${ED}"/usr/$(get_libdir)/libmbim-glib.la
-}
diff --git a/net-libs/libmbim/libmbim-1.25.0-r69.ebuild b/net-libs/libmbim/libmbim-1.25.0-r69.ebuild
new file mode 100644
index 0000000..fb05aeb
--- /dev/null
+++ b/net-libs/libmbim/libmbim-1.25.0-r69.ebuild
@@ -0,0 +1,50 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+CROS_WORKON_COMMIT="1c201789735a3fee1c53d9d0c52e480e5ecf7f52"
+CROS_WORKON_TREE="ee31c60aa22029c2558d4ea04a3dda33a18e721a"
+CROS_WORKON_PROJECT="chromiumos/third_party/libmbim"
+
+inherit autotools cros-sanitizers cros-workon
+
+DESCRIPTION="MBIM modem protocol helper library"
+HOMEPAGE="http://cgit.freedesktop.org/libmbim/"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan doc static-libs"
+
+RDEPEND=">=dev-libs/glib-2.36
+	virtual/libgudev"
+
+DEPEND="${RDEPEND}
+	doc? ( dev-util/gtk-doc )
+	virtual/pkgconfig"
+
+src_prepare() {
+	default
+	gtkdocize
+	eautoreconf
+}
+
+src_configure() {
+	sanitizers-setup-env
+
+	econf \
+		--enable-mbim-username='modem' \
+		--enable-compile-warnings=yes \
+		$(use_enable static{-libs,}) \
+		$(use_enable {,gtk-}doc)
+}
+
+src_test() {
+	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
+	[[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] && emake check
+}
+
+src_install() {
+	default
+	use static-libs || rm -f "${ED}"/usr/$(get_libdir)/libmbim-glib.la
+}
diff --git a/net-libs/libqmi/libqmi-1.27.0-r90.ebuild b/net-libs/libqmi/libqmi-1.27.0-r90.ebuild
deleted file mode 100644
index 64be6dc..0000000
--- a/net-libs/libqmi/libqmi-1.27.0-r90.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 1999-2012 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="484d781da1764541b69048b870415b5f0b3f37f0"
-CROS_WORKON_TREE="0b50a8cbfeaab415f980f5aa16afaa14be71c8b3"
-CROS_WORKON_PROJECT="chromiumos/third_party/libqmi"
-
-inherit autotools cros-sanitizers cros-workon
-
-DESCRIPTION="QMI modem protocol helper library"
-HOMEPAGE="http://cgit.freedesktop.org/libqmi/"
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan doc mbim qrtr static-libs"
-
-RDEPEND=">=dev-libs/glib-2.36
-	mbim? ( >=net-libs/libmbim-1.18.0 )"
-DEPEND="${RDEPEND}
-	doc? ( dev-util/gtk-doc )
-	sys-devel/autoconf-archive
-	virtual/pkgconfig"
-
-src_prepare() {
-	default
-	gtkdocize
-	eautoreconf
-}
-
-src_configure() {
-	sanitizers-setup-env
-
-	econf \
-		--enable-qmi-username='modem' \
-		--enable-compile-warnings=yes \
-		$(use_enable qrtr) \
-		$(use_enable mbim mbim-qmux) \
-		$(use_enable static{-libs,}) \
-		$(use_enable {,gtk-}doc)
-}
-
-src_test() {
-	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
-	if [[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] ; then
-		# This is an ugly hack that happens to work, but should not be copied.
-		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
-		emake check
-	fi
-}
-
-src_install() {
-	default
-	use static-libs || rm -f "${ED}"/usr/$(get_libdir)/libqmi-glib.la
-}
diff --git a/net-libs/libqmi/libqmi-1.27.1-r93.ebuild b/net-libs/libqmi/libqmi-1.27.1-r93.ebuild
new file mode 100644
index 0000000..dd9b9ae
--- /dev/null
+++ b/net-libs/libqmi/libqmi-1.27.1-r93.ebuild
@@ -0,0 +1,56 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+CROS_WORKON_COMMIT="3bbab66eda83de1936075d0b112fb91a33c3d6e8"
+CROS_WORKON_TREE="9fe74e0b6144252fdc4f461a125795749ec9236d"
+CROS_WORKON_PROJECT="chromiumos/third_party/libqmi"
+
+inherit autotools cros-sanitizers cros-workon
+
+DESCRIPTION="QMI modem protocol helper library"
+HOMEPAGE="http://cgit.freedesktop.org/libqmi/"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan doc mbim qrtr static-libs"
+
+RDEPEND=">=dev-libs/glib-2.36
+	mbim? ( >=net-libs/libmbim-1.18.0 )"
+DEPEND="${RDEPEND}
+	doc? ( dev-util/gtk-doc )
+	sys-devel/autoconf-archive
+	virtual/pkgconfig"
+
+src_prepare() {
+	default
+	gtkdocize
+	eautoreconf
+}
+
+src_configure() {
+	sanitizers-setup-env
+
+	econf \
+		--enable-qmi-username='modem' \
+		--enable-compile-warnings=yes \
+		$(use_enable qrtr) \
+		$(use_enable mbim mbim-qmux) \
+		$(use_enable static{-libs,}) \
+		$(use_enable {,gtk-}doc)
+}
+
+src_test() {
+	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
+	if [[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] ; then
+		# This is an ugly hack that happens to work, but should not be copied.
+		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir)" \
+		emake check
+	fi
+}
+
+src_install() {
+	default
+	use static-libs || rm -f "${ED}"/usr/$(get_libdir)/libqmi-glib.la
+}
diff --git a/net-libs/libqrtr/libqrtr-0.0.1-r18.ebuild b/net-libs/libqrtr/libqrtr-0.0.1-r18.ebuild
deleted file mode 100644
index 4c9f2ab..0000000
--- a/net-libs/libqrtr/libqrtr-0.0.1-r18.ebuild
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 1999-2012 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-CROS_WORKON_COMMIT="c21498e56ffd9e71d44fb308e8af36fecaffd762"
-CROS_WORKON_TREE="a0248c7d961d290072590870fb3f291fef6130ee"
-CROS_WORKON_PROJECT="chromiumos/third_party/libqrtr"
-
-inherit autotools cros-sanitizers cros-workon user
-
-DESCRIPTION="QRTR userspace helper library"
-HOMEPAGE="https://github.com/andersson/qrtr"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan"
-
-DEPEND="
-	sys-kernel/linux-headers
-	virtual/pkgconfig
-"
-
-src_prepare() {
-	default
-	sed -i "/^libdir/s:/lib:/$(get_libdir):" Makefile || die
-}
-
-src_configure() {
-	sanitizers-setup-env
-}
-
-src_install() {
-	emake DESTDIR="${D}" prefix="${EPREFIX}/usr" install
-
-	insinto /etc/init
-	doins "${FILESDIR}/qrtr-ns.conf"
-
-	insinto /usr/share/policy
-	newins "${FILESDIR}/qrtr-ns-seccomp-${ARCH}.policy" qrtr-ns-seccomp.policy
-}
-
-src_test() {
-	# TODO(ejcaruso): upstream some tests for this thing
-	:
-}
-
-pkg_preinst() {
-	enewuser "qrtr"
-	enewgroup "qrtr"
-}
diff --git a/net-libs/libqrtr/libqrtr-0.0.1-r21.ebuild b/net-libs/libqrtr/libqrtr-0.0.1-r21.ebuild
new file mode 100644
index 0000000..a17c5f3
--- /dev/null
+++ b/net-libs/libqrtr/libqrtr-0.0.1-r21.ebuild
@@ -0,0 +1,56 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+CROS_WORKON_COMMIT="ba87335b33afcc0c1e0860ed41d0a98abc804184"
+CROS_WORKON_TREE="9fc5b98c54615474f4c167d5034b6eb15475e046"
+CROS_WORKON_PROJECT="chromiumos/third_party/libqrtr"
+
+inherit autotools cros-sanitizers cros-workon user
+
+DESCRIPTION="QRTR userspace helper library"
+HOMEPAGE="https://github.com/andersson/qrtr"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan -qrtr_ns"
+
+DEPEND="
+	sys-kernel/linux-headers
+	virtual/pkgconfig
+"
+
+src_prepare() {
+	default
+	sed -i "/^libdir/s:/lib:/$(get_libdir):" Makefile || die
+}
+
+src_configure() {
+	sanitizers-setup-env
+}
+
+src_install() {
+	emake DESTDIR="${D}" prefix="${EPREFIX}/usr" install
+
+	if use qrtr_ns; then
+		insinto /etc/init
+		doins "${FILESDIR}/qrtr-ns.conf"
+
+		insinto /usr/share/policy
+		newins "${FILESDIR}/qrtr-ns-seccomp-${ARCH}.policy" \
+			qrtr-ns-seccomp.policy
+	fi
+}
+
+src_test() {
+	# TODO(ejcaruso): upstream some tests for this thing
+	:
+}
+
+pkg_preinst() {
+	if use qrtr_ns; then
+		enewuser "qrtr"
+		enewgroup "qrtr"
+	fi
+}
diff --git a/net-libs/libqrtr/libqrtr-9999.ebuild b/net-libs/libqrtr/libqrtr-9999.ebuild
index 81b942a..89005fb 100644
--- a/net-libs/libqrtr/libqrtr-9999.ebuild
+++ b/net-libs/libqrtr/libqrtr-9999.ebuild
@@ -12,7 +12,7 @@
 LICENSE="BSD"
 SLOT="0"
 KEYWORDS="~*"
-IUSE="-asan"
+IUSE="-asan -qrtr_ns"
 
 DEPEND="
 	sys-kernel/linux-headers
@@ -31,11 +31,14 @@
 src_install() {
 	emake DESTDIR="${D}" prefix="${EPREFIX}/usr" install
 
-	insinto /etc/init
-	doins "${FILESDIR}/qrtr-ns.conf"
+	if use qrtr_ns; then
+		insinto /etc/init
+		doins "${FILESDIR}/qrtr-ns.conf"
 
-	insinto /usr/share/policy
-	newins "${FILESDIR}/qrtr-ns-seccomp-${ARCH}.policy" qrtr-ns-seccomp.policy
+		insinto /usr/share/policy
+		newins "${FILESDIR}/qrtr-ns-seccomp-${ARCH}.policy" \
+			qrtr-ns-seccomp.policy
+	fi
 }
 
 src_test() {
@@ -44,6 +47,8 @@
 }
 
 pkg_preinst() {
-	enewuser "qrtr"
-	enewgroup "qrtr"
+	if use qrtr_ns; then
+		enewuser "qrtr"
+		enewgroup "qrtr"
+	fi
 }
diff --git a/net-libs/librmnetctl/librmnetctl-1.0_p20180801-r2.ebuild b/net-libs/librmnetctl/librmnetctl-1.0_p20180801-r3.ebuild
similarity index 100%
rename from net-libs/librmnetctl/librmnetctl-1.0_p20180801-r2.ebuild
rename to net-libs/librmnetctl/librmnetctl-1.0_p20180801-r3.ebuild
diff --git a/net-libs/librmnetctl/librmnetctl-1.0_p20180801.ebuild b/net-libs/librmnetctl/librmnetctl-1.0_p20180801.ebuild
index 8c2f333..95a2a44 100644
--- a/net-libs/librmnetctl/librmnetctl-1.0_p20180801.ebuild
+++ b/net-libs/librmnetctl/librmnetctl-1.0_p20180801.ebuild
@@ -36,5 +36,5 @@
 }
 
 src_install() {
-	emake prefix="${ED}/usr" install
+	emake prefix="${ED}/usr" libdir="\$(prefix)/$(get_libdir)" install
 }
diff --git a/net-misc/dhcpcd/OWNERS b/net-misc/dhcpcd/OWNERS
new file mode 100644
index 0000000..a69358b
--- /dev/null
+++ b/net-misc/dhcpcd/OWNERS
@@ -0,0 +1 @@
+garrick@chromium.org
diff --git a/net-misc/dhcpcd/dhcpcd-6.8.2-r20.ebuild b/net-misc/dhcpcd/dhcpcd-6.8.2-r21.ebuild
similarity index 100%
rename from net-misc/dhcpcd/dhcpcd-6.8.2-r20.ebuild
rename to net-misc/dhcpcd/dhcpcd-6.8.2-r21.ebuild
diff --git a/net-misc/dhcpcd/dhcpcd-6.8.2.ebuild b/net-misc/dhcpcd/dhcpcd-6.8.2.ebuild
index 0cf75b8..1998cef 100644
--- a/net-misc/dhcpcd/dhcpcd-6.8.2.ebuild
+++ b/net-misc/dhcpcd/dhcpcd-6.8.2.ebuild
@@ -51,6 +51,7 @@
 	epatch "${FILESDIR}"/patches/${P}-Change-vendor_encapsulated_options-to-binhex.patch
 	epatch "${FILESDIR}"/patches/${P}-Handle-DHCP-iSNS-option.patch
 	epatch "${FILESDIR}"/patches/${P}-Send-more-DHCPv6-options-over-DBus-RPC.patch
+	epatch "${FILESDIR}"/patches/${P}-Fix-dbus-flags.patch
 }
 
 src_configure()
diff --git a/net-misc/dhcpcd/files/patches/dhcpcd-6.8.2-Fix-dbus-flags.patch b/net-misc/dhcpcd/files/patches/dhcpcd-6.8.2-Fix-dbus-flags.patch
new file mode 100644
index 0000000..085d515
--- /dev/null
+++ b/net-misc/dhcpcd/files/patches/dhcpcd-6.8.2-Fix-dbus-flags.patch
@@ -0,0 +1,24 @@
+Add a missing space to fix compilation.
+
+This unblocks a dev-utils/pkgconfig upgrade.
+
+Author: Allen Webb <allenwebb@google.com>
+
+diff --git a/Makefile b/Makefile
+index d016c4b..665e409 100644
+--- a/Makefile
++++ b/Makefile
+@@ -39,11 +39,11 @@ FILES+=     dbus/dhcpcd-dbus.conf
+ 
+ _DBUSCFLAGS_SH= $(PKG_CONFIG) --cflags dbus-1
+ _DBUSCFLAGS!= ${_DBUSCFLAGS_SH}
+-DBUSCFLAGS= ${_DBUSCFLAGS}$(shell ${_DBUSCFLAGS_SH})
++DBUSCFLAGS= ${_DBUSCFLAGS} $(shell ${_DBUSCFLAGS_SH})
+ 
+ _DBUSLIBS_SH= $(PKG_CONFIG) --libs dbus-1
+ _DBUSLIBS!= ${_DBUSLIBS_SH}
+-DBUSLIBS= ${_DBUSLIBS}$(shell ${_DBUSLIBS_SH})
++DBUSLIBS= ${_DBUSLIBS} $(shell ${_DBUSLIBS_SH})
+ DBUSDIR= ${SYSCONFDIR}/dbus-1/system.d
+ 
+ CFLAGS+= ${DBUSCFLAGS}
diff --git a/net-misc/igmpproxy/files/patches/igmpproxy-0.2-configure-router-robustness-value.patch b/net-misc/igmpproxy/files/patches/igmpproxy-0.2-configure-router-robustness-value.patch
new file mode 100644
index 0000000..e736788
--- /dev/null
+++ b/net-misc/igmpproxy/files/patches/igmpproxy-0.2-configure-router-robustness-value.patch
@@ -0,0 +1,20 @@
+diff -Naur --show-c-function a/src/config.c b/src/config.c
+--- a/src/config.c	2020-09-21 16:48:54.802774568 -0700
++++ b/src/config.c	2020-09-21 16:48:39.326821669 -0700
+@@ -194,6 +194,16 @@ int loadConfig(char *configFile) {
+             // Read next token...
+             token = nextConfigToken();
+             continue;
++        }
++        else if(strcmp("robustness", token)==0) {
++            // Got a robustness token...
++            token = nextConfigToken();
++            my_log(LOG_DEBUG, 0, "Config: Got robustness token : %s", token);
++            commonConfig.robustnessValue = atoi( token );
++
++            // Read next token...
++            token = nextConfigToken();
++            continue;
+         } else {
+             // Unparsable token... Exit...
+             closeConfigFile();
diff --git a/net-misc/igmpproxy/igmpproxy-0.2-r3.ebuild b/net-misc/igmpproxy/igmpproxy-0.2-r4.ebuild
similarity index 100%
rename from net-misc/igmpproxy/igmpproxy-0.2-r3.ebuild
rename to net-misc/igmpproxy/igmpproxy-0.2-r4.ebuild
diff --git a/net-misc/igmpproxy/igmpproxy-0.2.ebuild b/net-misc/igmpproxy/igmpproxy-0.2.ebuild
index 098f8a8..f827d65 100644
--- a/net-misc/igmpproxy/igmpproxy-0.2.ebuild
+++ b/net-misc/igmpproxy/igmpproxy-0.2.ebuild
@@ -20,6 +20,7 @@
 	epatch "${FILESDIR}/patches/${PN}-0.2-send-updated-report.patch"
 	epatch "${FILESDIR}/patches/${PN}-0.2-configure-queryinterval-and-reportforwarding.patch"
 	epatch "${FILESDIR}/patches/${PN}-0.2-fix-timer-issues.patch"
+	epatch "${FILESDIR}/patches/${PN}-0.2-configure-router-robustness-value.patch"
 }
 
 src_install() {
diff --git a/net-misc/modemmanager-next/OWNERS b/net-misc/modemmanager-next/OWNERS
new file mode 100644
index 0000000..6da8592
--- /dev/null
+++ b/net-misc/modemmanager-next/OWNERS
@@ -0,0 +1 @@
+ejcaruso@chromium.org
diff --git a/net-misc/modemmanager-next/modemmanager-next-1.15.0-r360.ebuild b/net-misc/modemmanager-next/modemmanager-next-1.15.0-r360.ebuild
deleted file mode 100644
index 716b4bd..0000000
--- a/net-misc/modemmanager-next/modemmanager-next-1.15.0-r360.ebuild
+++ /dev/null
@@ -1,161 +0,0 @@
-# Copyright 1999-2012 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# Based on gentoo's modemmanager ebuild
-
-EAPI=6
-CROS_WORKON_COMMIT="03cf748d786bd2dc4584dcabe4a87137471bf4ad"
-CROS_WORKON_TREE="28465104e2f460d966eb71fdd5bd72c8ae21c27f"
-CROS_WORKON_PROJECT="chromiumos/third_party/modemmanager-next"
-
-inherit eutils autotools cros-sanitizers cros-workon flag-o-matic systemd udev user
-
-# ModemManager likes itself with capital letters
-MY_P=${P/modemmanager/ModemManager}
-
-DESCRIPTION="Modem and mobile broadband management libraries"
-HOMEPAGE="http://mail.gnome.org/archives/networkmanager-list/2008-July/msg00274.html"
-#SRC_URI not defined because we get our source locally
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="doc mbim systemd qmi"
-
-RDEPEND=">=dev-libs/glib-2.36
-	>=sys-apps/dbus-1.2
-	dev-libs/dbus-glib
-	net-dialup/ppp
-	mbim? ( net-libs/libmbim )
-	qmi? ( net-libs/libqmi )
-	!net-misc/modemmanager"
-
-DEPEND="${RDEPEND}
-	virtual/libgudev
-	dev-util/pkgconfig
-	dev-util/intltool
-	>=dev-util/gtk-doc-1.13
-	!net-misc/modemmanager-next-interfaces
-	!net-misc/modemmanager"
-
-DOCS="AUTHORS NEWS README"
-
-src_prepare() {
-	default
-
-	# According to "Introspection Data Format" of the DBus specification,
-	# revision 0.30 [1], "Only the root <node> element can omit the node
-	# name, as it's known to be the object that was introspected. If the
-	# root <node> does have a name attribute, it must be an absolute object
-	# path. If child <node> have object paths, they must be relative."
-	#
-	# The introspection XMLs of ModemManager object interfaces specify
-	# name="/" at their root <node>, which should be omitted instead as the
-	# object paths aren't fixed.
-	#
-	# CL:294115 [2] removed the name="/" attribute from those root <node>s
-	# in several ModemManager introspection XMLs in order to allow
-	# chromeos-dbus-bindings to properly generate the DBus proxies for
-	# ModemManager interfaces. Instead of modifying those introspection
-	# XMLs directly in the modemmanager-next git repository, we patch them
-	# (all org.freedesktop.ModemManager1.*.xml, but not
-	# org.freedesktop.ModemManager1.xml) here instead, which helps minimize
-	# the difference between the local modemmanager-next repository and the
-	# upstream repository.
-	#
-	# TODO(benchan): Discuss with upstream ModemManager maintainers to see
-	# if it makes sense to apply the changes to the upstream code instead.
-	#
-	# References:
-	# [1] https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
-	# [2] http://crosreview.com/294115
-	find introspection -type f -name 'org.freedesktop.ModemManager1.*.xml' \
-		-exec sed -i 's/^<node name="\/"/<node/' {} +
-
-	gtkdocize
-	eautopoint
-	eautoreconf
-	intltoolize --force
-}
-
-src_configure() {
-	sanitizers-setup-env
-	append-flags -Xclang-only=-Wno-unneeded-internal-declaration
-	econf \
-		--with-html-dir="\${datadir}/doc/${PF}/html" \
-		--enable-compile-warnings=yes \
-		$(use_enable {,gtk-}doc) \
-		$(use_with mbim) \
-		$(use_with qmi)
-}
-
-src_test() {
-	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
-	if [[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] ; then
-		# This is an ugly hack that happens to work, but should not be copied.
-		PATH="${SYSROOT}/usr/bin:${PATH}" \
-		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir):${SYSROOT}/$(get_libdir)" \
-		emake check
-	fi
-}
-
-src_install() {
-	default
-	# Remove useless .la files
-	find "${D}" -name '*.la' -delete
-
-	# Remove the DBus service file generated by Makefile. This file directs DBus
-	# to launch the ModemManager process when a DBus call for the ModemManager
-	# service is received. We do not want this behaviour.
-	find "${D}" -name 'org.freedesktop.ModemManager1.service' -delete
-
-	# Only install the following plugins for supported modems to conserve
-	# space on the root filesystem.
-	local plugins=(
-		altair-lte
-		generic
-		huawei
-		longcheer
-		novatel-lte
-		samsung
-		telit
-		zte
-	)
-	local plugins_regex=".*/libmm-plugin-($(IFS='|'; echo "${plugins[*]}")).so"
-
-	find "${D}" -regextype posix-extended \
-		-name 'libmm-plugin-*.so' \
-		! -regex "${plugins_regex}" \
-		-delete
-
-	local found_plugins="$(find "${D}" -regextype posix-extended \
-		-regex "${plugins_regex}" | wc -l)"
-	[[ "${found_plugins}" == "${#plugins[@]}" ]] || \
-		die "Expects ${#plugins[@]} plugins, but ${found_plugins} found."
-
-	# Install init scripts.
-	if use systemd; then
-		systemd_dounit "${FILESDIR}/modemmanager.service"
-		systemd_enable_service system-services.target modemmanager.service
-	else
-		insinto /etc/init
-		doins "${FILESDIR}/modemmanager.conf"
-	fi
-
-	# Override the ModemManager DBus configuration file to constrain how
-	# ModemManager exposes its DBus service on Chrome OS.
-	insinto /etc/dbus-1/system.d
-	doins "${FILESDIR}/org.freedesktop.ModemManager1.conf"
-
-	# Install Chrome OS specific udev rules.
-	udev_dorules "${FILESDIR}/52-mm-modem-permissions.rules"
-	udev_dorules "${FILESDIR}/77-mm-fibocom-port-types.rules"
-	udev_dorules "${FILESDIR}/77-mm-huawei-configuration.rules"
-	exeinto "$(get_udevdir)"
-	doexe "${FILESDIR}/mm-huawei-configuration-switch.sh"
-}
-
-pkg_preinst() {
-	# ModemManager is run under the 'modem' user and group on Chrome OS.
-	enewuser "modem"
-	enewgroup "modem"
-}
diff --git a/net-misc/modemmanager-next/modemmanager-next-1.15.0-r367.ebuild b/net-misc/modemmanager-next/modemmanager-next-1.15.0-r367.ebuild
new file mode 100644
index 0000000..95fcde8
--- /dev/null
+++ b/net-misc/modemmanager-next/modemmanager-next-1.15.0-r367.ebuild
@@ -0,0 +1,162 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# Based on gentoo's modemmanager ebuild
+
+EAPI=6
+CROS_WORKON_COMMIT="c97232c5c46a93f20c94e1a3a97ccee41359b5ad"
+CROS_WORKON_TREE="66eaab83b3f5effbdb69099aa3fc5285ac7d948e"
+CROS_WORKON_PROJECT="chromiumos/third_party/modemmanager-next"
+
+inherit eutils autotools cros-sanitizers cros-workon flag-o-matic systemd udev user
+
+# ModemManager likes itself with capital letters
+MY_P=${P/modemmanager/ModemManager}
+
+DESCRIPTION="Modem and mobile broadband management libraries"
+HOMEPAGE="http://mail.gnome.org/archives/networkmanager-list/2008-July/msg00274.html"
+#SRC_URI not defined because we get our source locally
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="doc mbim systemd qmi"
+
+RDEPEND=">=dev-libs/glib-2.36
+	>=sys-apps/dbus-1.2
+	dev-libs/dbus-glib
+	net-dialup/ppp
+	mbim? ( net-libs/libmbim )
+	qmi? ( net-libs/libqmi )
+	!net-misc/modemmanager"
+
+DEPEND="${RDEPEND}
+	virtual/libgudev
+	dev-util/pkgconfig
+	dev-util/intltool
+	>=dev-util/gtk-doc-1.13
+	!net-misc/modemmanager-next-interfaces
+	!net-misc/modemmanager"
+
+DOCS="AUTHORS NEWS README"
+
+src_prepare() {
+	default
+
+	# According to "Introspection Data Format" of the DBus specification,
+	# revision 0.30 [1], "Only the root <node> element can omit the node
+	# name, as it's known to be the object that was introspected. If the
+	# root <node> does have a name attribute, it must be an absolute object
+	# path. If child <node> have object paths, they must be relative."
+	#
+	# The introspection XMLs of ModemManager object interfaces specify
+	# name="/" at their root <node>, which should be omitted instead as the
+	# object paths aren't fixed.
+	#
+	# CL:294115 [2] removed the name="/" attribute from those root <node>s
+	# in several ModemManager introspection XMLs in order to allow
+	# chromeos-dbus-bindings to properly generate the DBus proxies for
+	# ModemManager interfaces. Instead of modifying those introspection
+	# XMLs directly in the modemmanager-next git repository, we patch them
+	# (all org.freedesktop.ModemManager1.*.xml, but not
+	# org.freedesktop.ModemManager1.xml) here instead, which helps minimize
+	# the difference between the local modemmanager-next repository and the
+	# upstream repository.
+	#
+	# TODO(benchan): Discuss with upstream ModemManager maintainers to see
+	# if it makes sense to apply the changes to the upstream code instead.
+	#
+	# References:
+	# [1] https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
+	# [2] http://crosreview.com/294115
+	find introspection -type f -name 'org.freedesktop.ModemManager1.*.xml' \
+		-exec sed -i 's/^<node name="\/"/<node/' {} +
+
+	gtkdocize
+	eautopoint
+	eautoreconf
+	intltoolize --force
+}
+
+src_configure() {
+	sanitizers-setup-env
+	append-flags -Xclang-only=-Wno-unneeded-internal-declaration
+	append-flags -DWITH_NEWEST_QMI_COMMANDS
+	econf \
+		--with-html-dir="\${datadir}/doc/${PF}/html" \
+		--enable-compile-warnings=yes \
+		$(use_enable {,gtk-}doc) \
+		$(use_with mbim) \
+		$(use_with qmi)
+}
+
+src_test() {
+	# TODO(benchan): Run unit tests for non-x86 platforms via qemu.
+	if [[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] ; then
+		# This is an ugly hack that happens to work, but should not be copied.
+		PATH="${SYSROOT}/usr/bin:${PATH}" \
+		LD_LIBRARY_PATH="${SYSROOT}/usr/$(get_libdir):${SYSROOT}/$(get_libdir)" \
+		emake check
+	fi
+}
+
+src_install() {
+	default
+	# Remove useless .la files
+	find "${D}" -name '*.la' -delete
+
+	# Remove the DBus service file generated by Makefile. This file directs DBus
+	# to launch the ModemManager process when a DBus call for the ModemManager
+	# service is received. We do not want this behaviour.
+	find "${D}" -name 'org.freedesktop.ModemManager1.service' -delete
+
+	# Only install the following plugins for supported modems to conserve
+	# space on the root filesystem.
+	local plugins=(
+		altair-lte
+		generic
+		huawei
+		longcheer
+		novatel-lte
+		samsung
+		telit
+		zte
+	)
+	local plugins_regex=".*/libmm-plugin-($(IFS='|'; echo "${plugins[*]}")).so"
+
+	find "${D}" -regextype posix-extended \
+		-name 'libmm-plugin-*.so' \
+		! -regex "${plugins_regex}" \
+		-delete
+
+	local found_plugins="$(find "${D}" -regextype posix-extended \
+		-regex "${plugins_regex}" | wc -l)"
+	[[ "${found_plugins}" == "${#plugins[@]}" ]] || \
+		die "Expects ${#plugins[@]} plugins, but ${found_plugins} found."
+
+	# Install init scripts.
+	if use systemd; then
+		systemd_dounit "${FILESDIR}/modemmanager.service"
+		systemd_enable_service system-services.target modemmanager.service
+	else
+		insinto /etc/init
+		doins "${FILESDIR}/modemmanager.conf"
+	fi
+
+	# Override the ModemManager DBus configuration file to constrain how
+	# ModemManager exposes its DBus service on Chrome OS.
+	insinto /etc/dbus-1/system.d
+	doins "${FILESDIR}/org.freedesktop.ModemManager1.conf"
+
+	# Install Chrome OS specific udev rules.
+	udev_dorules "${FILESDIR}/52-mm-modem-permissions.rules"
+	udev_dorules "${FILESDIR}/77-mm-fibocom-port-types.rules"
+	udev_dorules "${FILESDIR}/77-mm-huawei-configuration.rules"
+	exeinto "$(get_udevdir)"
+	doexe "${FILESDIR}/mm-huawei-configuration-switch.sh"
+}
+
+pkg_preinst() {
+	# ModemManager is run under the 'modem' user and group on Chrome OS.
+	enewuser "modem"
+	enewgroup "modem"
+}
diff --git a/net-misc/modemmanager-next/modemmanager-next-9999.ebuild b/net-misc/modemmanager-next/modemmanager-next-9999.ebuild
index a4169ce..28053d3 100644
--- a/net-misc/modemmanager-next/modemmanager-next-9999.ebuild
+++ b/net-misc/modemmanager-next/modemmanager-next-9999.ebuild
@@ -78,6 +78,7 @@
 src_configure() {
 	sanitizers-setup-env
 	append-flags -Xclang-only=-Wno-unneeded-internal-declaration
+	append-flags -DWITH_NEWEST_QMI_COMMANDS
 	econf \
 		--with-html-dir="\${datadir}/doc/${PF}/html" \
 		--enable-compile-warnings=yes \
diff --git a/net-misc/qc-netmgr/Manifest b/net-misc/qc-netmgr/Manifest
new file mode 100644
index 0000000..a17a6e7
--- /dev/null
+++ b/net-misc/qc-netmgr/Manifest
@@ -0,0 +1 @@
+DIST qc-netmgr-0.1_p20200720.tar.gz 7357 BLAKE2B 0b9c432be70818c481e4b682332e829cff65d0282bcbfffc00fbc5ea6e886ed97b9541559f069e0402ee2ea3a66e5bf2c4c1e2a6b06fe029161469184e0bc571 SHA512 5b96575e37ad5de34355691112aac27423aa51cd57b900994aa5b10080f817214b9b58ee553c47ec8a3c03923cf164feaa1bb911f04ab9fe53493e2fadca1fa9
diff --git a/net-misc/qc-netmgr/files/0001-Fix-modem-configuration.patch b/net-misc/qc-netmgr/files/0001-Fix-modem-configuration.patch
new file mode 100644
index 0000000..aa8a0d9
--- /dev/null
+++ b/net-misc/qc-netmgr/files/0001-Fix-modem-configuration.patch
@@ -0,0 +1,34 @@
+From 4e56b314424ed6d039f20194fc36eb89409f4977 Mon Sep 17 00:00:00 2001
+From: Evan Green <evgreen@chromium.org>
+Date: Mon, 27 Jul 2020 14:54:39 -0700
+Subject: [PATCH] Fix modem configuration
+
+This change, suggested by bjorn.andersson@linaro.org, makes data flow
+work properly on the modem. From what I understand, the configuration
+that the IPA kernel driver sets up with the modem needs to match the
+configuration netmgr asks for. This change makes that configuration
+match.
+
+Signed-off-by: Evan Green <evgreen@chromium.org>
+---
+ src/mmdata_qrtr.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/mmdata_qrtr.c b/src/mmdata_qrtr.c
+index 79587dd..5c39eae 100644
+--- a/src/mmdata_qrtr.c
++++ b/src/mmdata_qrtr.c
+@@ -359,8 +359,8 @@ int mmdata_fmt_cfg(void)
+   int ret = MMDATA_FAILURE;
+   unsigned char fmt_cfg_req[]= { 0x00, 0x03, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x11,
+                             0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x04,
+-                            0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x04, 0x00,
+-                            0x05, 0x00, 0x00, 0x00, 0x15, 0x04, 0x00, 0x01,
++                            0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x04, 0x00,
++                            0x08, 0x00, 0x00, 0x00, 0x15, 0x04, 0x00, 0x01,
+                             0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0xE0, 0x05,
+                             0x00, 0x00, 0x17, 0x08, 0x00, 0x04, 0x00, 0x00,
+                             0x00, 0x01, 0x00, 0x00, 0x00 };
+-- 
+2.26.2
+
diff --git a/net-misc/qc-netmgr/files/0002-Rename-NOTICE-to-LICENSE.patch b/net-misc/qc-netmgr/files/0002-Rename-NOTICE-to-LICENSE.patch
new file mode 100644
index 0000000..91b7931
--- /dev/null
+++ b/net-misc/qc-netmgr/files/0002-Rename-NOTICE-to-LICENSE.patch
@@ -0,0 +1,20 @@
+From 352d7eee3a1d292e0c21b38c3029d045fa7b5523 Mon Sep 17 00:00:00 2001
+From: Evan Green <evgreen@chromium.org>
+Date: Mon, 27 Jul 2020 16:43:33 -0700
+Subject: [PATCH] Rename NOTICE to LICENSE
+
+The appropriate name is LICENSE, rather than NOTICE.
+
+Signed-off-by: Evan Green <evgreen@chromium.org>
+---
+ NOTICE => LICENSE | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ rename NOTICE => LICENSE (100%)
+
+diff --git a/NOTICE b/LICENSE
+similarity index 100%
+rename from NOTICE
+rename to LICENSE
+-- 
+2.26.2
+
diff --git a/net-misc/qc-netmgr/files/qc-netmgr.conf b/net-misc/qc-netmgr/files/qc-netmgr.conf
new file mode 100644
index 0000000..7b99889
--- /dev/null
+++ b/net-misc/qc-netmgr/files/qc-netmgr.conf
@@ -0,0 +1,46 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+description   "Start qc-netmgr server"
+author        "chromium-os-dev@chromium.org"
+
+start on started rmtfs
+stop on stopping rmtfs
+
+# This service keeps the modem data connection alive. It can be killed,
+# at the cost of an interruption in LTE connectivity.
+oom score -100
+respawn
+
+expect fork
+
+# TODO(evgreen): Patch qc-netmgr to retry its connection, then delete this.
+pre-start script
+  check_service() {
+    local timeout=60
+    while [ "${timeout}" -gt 0 ]; do
+      if qrtr-lookup | grep -q "$1"; then
+        break
+      fi
+
+      sleep 1
+      : $(( timeout -= 1 ))
+    done
+
+    if [ "${timeout}" = 0 ]; then
+      logger -t "${UPSTART_JOB}" "$1 didn't start."
+      exit 1
+    fi
+  }
+
+  check_service "Wireless Data Service"
+end script
+
+# mmdata_mgr needs CAP_NET_ADMIN to open AF_QIPCRTR socket.
+# TODO(evgreen): Put back proper sandboxing:
+#   -S /usr/share/policy/qc-netmgr-seccomp.policy \
+
+exec minijail0 --profile=minimalistic-mountns -inNlpvr --uts \
+  -c cap_net_admin=e -u nobody -g nobody \
+  -- /usr/bin/mmdata_mgr
diff --git a/net-misc/qc-netmgr/qc-netmgr-0.1_p20200720.ebuild b/net-misc/qc-netmgr/qc-netmgr-0.1_p20200720.ebuild
new file mode 100644
index 0000000..a7b12e0
--- /dev/null
+++ b/net-misc/qc-netmgr/qc-netmgr-0.1_p20200720.ebuild
@@ -0,0 +1,40 @@
+# Copyright 1999-2020 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+inherit cros-sanitizers user
+
+DESCRIPTION="Qualcomm modem data service"
+HOMEPAGE="https://source.codeaurora.org/quic/dataservices/modem-data-manager/log/?h=LC.UM.1.0"
+#GIT_SHA1="b19614f4505db42c074bc32089fbdd48980f5f39"
+SRC_URI="https://source.codeaurora.org/quic/dataservices/modem-data-manager/log/?h=LC.UM.1.0 -> ${P}.tar.gz"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="asan +seccomp"
+
+DEPEND="net-libs/librmnetctl
+	net-libs/libqrtr
+"
+
+RDEPEND="${DEPEND}"
+
+S="${WORKDIR}/modem-data-manager"
+
+PATCHES=(
+	"${FILESDIR}"/0001-Fix-modem-configuration.patch # b/161835487
+	"${FILESDIR}"/0002-Rename-NOTICE-to-LICENSE.patch
+)
+
+src_configure() {
+	sanitizers-setup-env
+}
+
+src_install() {
+	emake DESTDIR="${D}" prefix="${EPREFIX}/usr" install
+
+	insinto /etc/init
+	doins "${FILESDIR}/qc-netmgr.conf"
+}
diff --git a/net-misc/rmtfs/files/rmtfs-seccomp-arm64.policy b/net-misc/rmtfs/files/rmtfs-seccomp-arm64.policy
index 3904ac8..6f90f0d 100644
--- a/net-misc/rmtfs/files/rmtfs-seccomp-arm64.policy
+++ b/net-misc/rmtfs/files/rmtfs-seccomp-arm64.policy
@@ -9,6 +9,7 @@
 close: 1
 exit: 1
 exit_group: 1
+fcntl: 1
 fstat: 1
 newfstatat: 1
 getdents64: 1
@@ -24,6 +25,7 @@
 # Prevent PROT_EXEC
 mprotect: arg2 in 0xfffffffb
 munmap: 1
+pselect6: 1
 openat: 1
 pipe2: 1
 ppoll: 1
diff --git a/net-misc/rmtfs/files/rmtfs.conf b/net-misc/rmtfs/files/rmtfs.conf
index b0bf06fc..5fd881c 100644
--- a/net-misc/rmtfs/files/rmtfs.conf
+++ b/net-misc/rmtfs/files/rmtfs.conf
@@ -9,8 +9,8 @@
 env RMTFS_DIR=/var/lib/rmtfs/boot
 env SOC_DIR=/sys/devices/platform/soc@0
 
-start on started qrtr-ns and qcom-rmtfs-added and qcom-modem-added
-stop on stopping qrtr-ns
+start on qcom-rmtfs-added and qcom-modem-added
+stop on starting pre-shutdown
 
 # This service handles modem file system storage requests. Other than
 # the connection to the modem itself, it keeps no state. So it should
diff --git a/net-misc/rmtfs/rmtfs-0.3_p20200203-r2.ebuild b/net-misc/rmtfs/rmtfs-0.3_p20200203-r3.ebuild
similarity index 100%
rename from net-misc/rmtfs/rmtfs-0.3_p20200203-r2.ebuild
rename to net-misc/rmtfs/rmtfs-0.3_p20200203-r3.ebuild
diff --git a/net-misc/tlsdate/OWNERS b/net-misc/tlsdate/OWNERS
new file mode 100644
index 0000000..5a77185b8
--- /dev/null
+++ b/net-misc/tlsdate/OWNERS
@@ -0,0 +1 @@
+include /OWNERS.security
diff --git a/net-misc/tlsdate/tlsdate-0.0.5-r82.ebuild b/net-misc/tlsdate/tlsdate-0.0.5-r82.ebuild
deleted file mode 100644
index 58c5f61..0000000
--- a/net-misc/tlsdate/tlsdate-0.0.5-r82.ebuild
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2012 The Chromium OS Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-CROS_WORKON_COMMIT="1aba54c4e2b63e38e55eefb30316dc725326ea65"
-CROS_WORKON_TREE="d5bedf0d1e651c4e80acc3eec06dedbd31b3d05e"
-CROS_WORKON_PROJECT="chromiumos/third_party/tlsdate"
-
-inherit autotools flag-o-matic toolchain-funcs cros-sanitizers cros-workon cros-debug systemd user
-
-DESCRIPTION="Update local time over HTTPS"
-HOMEPAGE="https://github.com/ioerror/tlsdate"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-IUSE="-asan +dbus +seccomp systemd"
-
-DEPEND="dev-libs/openssl:0=
-	dev-libs/libevent
-	dbus? ( sys-apps/dbus )"
-RDEPEND="${DEPEND}
-	chromeos-base/chromeos-ca-certificates
-"
-
-src_prepare() {
-	# Use the system cert store rather than a custom one specific
-	# to the tlsdate package. #534394
-	sed -i \
-		-e 's:/tlsdate/ca-roots/tlsdate-ca-roots.conf:/ssl/certs/ca-certificates.crt:' \
-		Makefile.am || die
-
-	default
-
-	eautoreconf
-}
-
-src_configure() {
-	sanitizers-setup-env
-	cros-debug-add-NDEBUG
-	econf \
-		$(use_enable dbus) \
-		$(use_enable seccomp seccomp-filter) \
-		$(use_enable cros-debug seccomp-debugging) \
-		--enable-cros \
-		--with-dbus-client-group=chronos \
-		--with-unpriv-user=tlsdate \
-		--with-unpriv-group=tlsdate
-}
-
-src_compile() {
-	tc-export CC
-	emake CFLAGS="-Wall -Werror ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}"
-}
-
-src_install() {
-	default
-
-	# Use the system cert store; see src_prepare. #446426 #534394
-	rm "${ED}"/etc/tlsdate/ca-roots/tlsdate-ca-roots.conf || die
-	rmdir "${ED}"/etc/tlsdate/ca-roots || die
-
-	insinto /etc/tlsdate
-	doins "${FILESDIR}/tlsdated.conf"
-	insinto /etc/dbus-1/system.d
-	doins "${S}/dbus/org.torproject.tlsdate.conf"
-	insinto /usr/share/dbus-1/interfaces
-	doins "${S}/dbus/org.torproject.tlsdate.xml"
-	insinto /usr/share/dbus-1/services
-	doins "${S}/dbus/org.torproject.tlsdate.service"
-
-	if use systemd; then
-		systemd_dounit init/tlsdated.service
-		systemd_enable_service system-services.target tlsdated.service
-		systemd_dotmpfilesd init/tlsdated-directories.conf
-	else
-		insinto /etc/init
-		doins init/tlsdated.conf
-	fi
-}
-
-pkg_preinst() {
-	enewuser "tlsdate"
-	enewgroup "tlsdate"
-	enewuser "tlsdate-dbus"   # For tlsdate-dbus-announce.
-	enewgroup "tlsdate-dbus"  # For tlsdate-dbus-announce.
-}
diff --git a/net-misc/tlsdate/tlsdate-0.0.5-r83.ebuild b/net-misc/tlsdate/tlsdate-0.0.5-r83.ebuild
new file mode 100644
index 0000000..6d3e3b2
--- /dev/null
+++ b/net-misc/tlsdate/tlsdate-0.0.5-r83.ebuild
@@ -0,0 +1,87 @@
+# Copyright 2012 The Chromium OS Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+CROS_WORKON_COMMIT="bb662be7e5f24f0d2d61b8e655c4cd358356f06e"
+CROS_WORKON_TREE="cc72be195ede90b09a9ae394923ac01be3ce4081"
+CROS_WORKON_PROJECT="chromiumos/third_party/tlsdate"
+
+inherit autotools flag-o-matic toolchain-funcs cros-sanitizers cros-workon cros-debug systemd user
+
+DESCRIPTION="Update local time over HTTPS"
+HOMEPAGE="https://github.com/ioerror/tlsdate"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="-asan +dbus +seccomp systemd"
+
+DEPEND="dev-libs/openssl:0=
+	dev-libs/libevent
+	dbus? ( sys-apps/dbus )"
+RDEPEND="${DEPEND}
+	chromeos-base/chromeos-ca-certificates
+"
+
+src_prepare() {
+	# Use the system cert store rather than a custom one specific
+	# to the tlsdate package. #534394
+	sed -i \
+		-e 's:/tlsdate/ca-roots/tlsdate-ca-roots.conf:/ssl/certs/ca-certificates.crt:' \
+		Makefile.am || die
+
+	default
+
+	eautoreconf
+}
+
+src_configure() {
+	sanitizers-setup-env
+	cros-debug-add-NDEBUG
+	econf \
+		$(use_enable dbus) \
+		$(use_enable seccomp seccomp-filter) \
+		$(use_enable cros-debug seccomp-debugging) \
+		--enable-cros \
+		--with-dbus-client-group=chronos \
+		--with-unpriv-user=tlsdate \
+		--with-unpriv-group=tlsdate
+}
+
+src_compile() {
+	tc-export CC
+	emake CFLAGS="-Wall -Werror ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}"
+}
+
+src_install() {
+	default
+
+	# Use the system cert store; see src_prepare. #446426 #534394
+	rm "${ED}"/etc/tlsdate/ca-roots/tlsdate-ca-roots.conf || die
+	rmdir "${ED}"/etc/tlsdate/ca-roots || die
+
+	insinto /etc/tlsdate
+	doins "${FILESDIR}/tlsdated.conf"
+	insinto /etc/dbus-1/system.d
+	doins "${S}/dbus/org.torproject.tlsdate.conf"
+	insinto /usr/share/dbus-1/interfaces
+	doins "${S}/dbus/org.torproject.tlsdate.xml"
+	insinto /usr/share/dbus-1/services
+	doins "${S}/dbus/org.torproject.tlsdate.service"
+
+	if use systemd; then
+		systemd_dounit init/tlsdated.service
+		systemd_enable_service system-services.target tlsdated.service
+		systemd_dotmpfilesd init/tlsdated-directories.conf
+	else
+		insinto /etc/init
+		doins init/tlsdated.conf
+	fi
+}
+
+pkg_preinst() {
+	enewuser "tlsdate"
+	enewgroup "tlsdate"
+	enewuser "tlsdate-dbus"   # For tlsdate-dbus-announce.
+	enewgroup "tlsdate-dbus"  # For tlsdate-dbus-announce.
+}
diff --git a/net-print/cups-filters/OWNERS b/net-print/cups-filters/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/cups-filters/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/cups-filters/cups-filters-1.21.6-r9.ebuild b/net-print/cups-filters/cups-filters-1.21.6-r10.ebuild
similarity index 100%
rename from net-print/cups-filters/cups-filters-1.21.6-r9.ebuild
rename to net-print/cups-filters/cups-filters-1.21.6-r10.ebuild
diff --git a/net-print/cups-filters/cups-filters-1.21.6.ebuild b/net-print/cups-filters/cups-filters-1.21.6.ebuild
index 0e43cf2..2bc7bcb 100644
--- a/net-print/cups-filters/cups-filters-1.21.6.ebuild
+++ b/net-print/cups-filters/cups-filters-1.21.6.ebuild
@@ -24,6 +24,7 @@
 RDEPEND="
 	>=app-text/poppler-0.32:=[cxx,jpeg?,lcms,tiff?,utils]
 	>=app-text/qpdf-8.1.0:=
+	chromeos-base/foomatic_shell
 	dev-libs/glib:2
 	media-libs/fontconfig
 	media-libs/freetype:2
@@ -53,6 +54,7 @@
 	"${FILESDIR}/${PN}-1.17.8-gstoraster-tmpfile.patch"
 	"${FILESDIR}/${PN}-1.21.6-trim-convs-file.patch"
 	"${FILESDIR}/${PN}-1.21.6-asan-pacifier.patch"
+	"${FILESDIR}/${PN}-1.21.6-foomatic-shell.patch"
 	"${FILESDIR}/${PN}-1.23.0-pdftops-monochrome.patch"
 	"${FILESDIR}/${PN}-1.25.5-use-public-ghostscript-method.patch"
 	"${FILESDIR}/${PN}-1.25.5-fix-segfault-when-running-by-hand.patch"
diff --git a/net-print/cups-filters/files/cups-filters-1.21.6-foomatic-shell.patch b/net-print/cups-filters/files/cups-filters-1.21.6-foomatic-shell.patch
new file mode 100644
index 0000000..dd80072
--- /dev/null
+++ b/net-print/cups-filters/files/cups-filters-1.21.6-foomatic-shell.patch
@@ -0,0 +1,23 @@
+This patch replaces a shell used by cups-filters with a dedicated
+mini-shell called foomatic-shell. One of the cups-filters tools,
+foomatic-rip, uses this shell to execute scripts included in some PPD
+files. We want to use foomatic-shell instead of standard shell to limit
+set of commands that can be executed from provided PPD file. The goal is
+to prevent execution of unauthorized tools. foomatic-shell was
+implemented in CL:2271389. Chromium bug: 1073063.
+
+Author: Piotr Pawliczek
+
+diff --git a/filter/foomatic-rip/foomaticrip.c b/filter/foomatic-rip/foomaticrip.c
+index f53d0eb..3f60b49 100644
+--- a/filter/foomatic-rip/foomaticrip.c
++++ b/filter/foomatic-rip/foomaticrip.c
+@@ -175,7 +175,7 @@ char cupsfilterpath[PATH_MAX] = "/usr/local/lib/cups/filter:"
+                                 "/opt/cups/filter:"
+                                 "/usr/lib/cups/filter";
+ 
+-char modern_shell[] = SHELL;
++char modern_shell[] = "/usr/bin/foomatic_shell";
+ 
+ void config_set_option(const char *key, const char *value)
+ {
diff --git a/net-print/cups/Manifest b/net-print/cups/Manifest
deleted file mode 100644
index 21f4815..0000000
--- a/net-print/cups/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST cups-2.1.4.tar.gz 9572653 SHA256 1f182f145489e2454969b221056b6b9bac2beb4e38cd75fa12a9ec15d24d5301 SHA512 5f36d21e1e094323f1811229b452f096f3f0b264757b3c3b1742bbd7ea0059e34d3cd2fbf3b6856d25a04ae1779babafa6d598a8ba249448fce3bf7cafa59aae WHIRLPOOL 217b9024c34369c8839b0a1b2b3924eb00e9b8d87cfd8d50a59ad0c33c1044f53d479246d67dff4598049efd15259def90e4bcddc6c3c20dff38811e159d2c4b
diff --git a/net-print/cups/OWNERS b/net-print/cups/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/cups/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/cups/cups-2.2.8-r75.ebuild b/net-print/cups/cups-2.2.8-r75.ebuild
deleted file mode 100644
index dde02e8..0000000
--- a/net-print/cups/cups-2.2.8-r75.ebuild
+++ /dev/null
@@ -1,400 +0,0 @@
-# Copyright 1999-2016 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id$
-
-EAPI=5
-
-CROS_WORKON_COMMIT="259f022bc0aea8c1258f8f28909de6e84d1775c2"
-CROS_WORKON_TREE="343027b61547cea350ce108c1b1cd2083e9c11aa"
-CROS_WORKON_PROJECT="chromiumos/third_party/cups"
-CROS_WORKON_EGIT_BRANCH="cups-2-2-8"
-
-PYTHON_COMPAT=( python2_7 )
-
-inherit cros-workon autotools fdo-mime gnome2-utils flag-o-matic linux-info \
-	multilib multilib-minimal pam python-single-r1 user versionator \
-	java-pkg-opt-2 systemd toolchain-funcs cros-fuzzer cros-sanitizers
-
-MY_P=${P/_rc/rc}
-MY_P=${MY_P/_beta/b}
-MY_PV=${PV/_rc/rc}
-MY_PV=${MY_PV/_beta/b}
-
-KEYWORDS="*"
-
-DESCRIPTION="The Common Unix Printing System"
-HOMEPAGE="http://www.cups.org/"
-
-LICENSE="GPL-2"
-SLOT="0"
-IUSE="acl dbus debug java kerberos pam
-	python +seccomp selinux +ssl static-libs systemd +threads upstart usb X xinetd zeroconf
-	asan fuzzer"
-
-LANGS="ca cs de es fr it ja ru"
-for X in ${LANGS} ; do
-	IUSE="${IUSE} +linguas_${X}"
-done
-
-CDEPEND="
-	app-text/libpaper
-	acl? (
-		kernel_linux? (
-			sys-apps/acl
-			sys-apps/attr
-		)
-	)
-	dbus? ( >=sys-apps/dbus-1.6.18-r1[${MULTILIB_USEDEP}] )
-	java? ( >=virtual/jre-1.6:* )
-	kerberos? ( >=virtual/krb5-0-r1[${MULTILIB_USEDEP}] )
-	!net-print/lprng
-	pam? ( virtual/pam )
-	python? ( ${PYTHON_DEPS} )
-	ssl? (
-		>=dev-libs/libgcrypt-1.5.3:0[${MULTILIB_USEDEP}]
-		>=net-libs/gnutls-2.12.23-r6[${MULTILIB_USEDEP}]
-	)
-	systemd? ( sys-apps/systemd )
-	usb? ( virtual/libusb:1 )
-	X? ( x11-misc/xdg-utils )
-	xinetd? ( sys-apps/xinetd )
-	zeroconf? ( >=net-dns/avahi-0.6.31-r2[${MULTILIB_USEDEP}] )
-	abi_x86_32? (
-		!<=app-emulation/emul-linux-x86-baselibs-20140508
-		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
-	)
-"
-
-DEPEND="${CDEPEND}
-	>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
-"
-
-RDEPEND="${CDEPEND}
-	selinux? ( sec-policy/selinux-cups )
-"
-
-REQUIRED_USE="
-	python? ( ${PYTHON_REQUIRED_USE} )
-	usb? ( threads )
-	?? ( systemd upstart )
-"
-
-# upstream includes an interactive test which is a nono for gentoo
-RESTRICT="test"
-
-S="${WORKDIR}/${PN}-release-${MY_PV}"
-
-MULTILIB_CHOST_TOOLS=(
-	/usr/bin/cups-config
-)
-
-pkg_setup() {
-	enewgroup lp
-	enewuser lp -1 -1 -1 "lp,ippusb"
-	enewgroup lpadmin
-	enewuser lpadmin -1 -1 -1 "lpadmin,ippusb"
-	enewgroup cups
-	enewuser cups -1 -1 -1 cups
-
-	use python && python-single-r1_pkg_setup
-
-	if use kernel_linux; then
-		linux-info_pkg_setup
-		if  ! linux_config_exists; then
-			ewarn "Can't check the linux kernel configuration."
-			ewarn "You might have some incompatible options enabled."
-		else
-			# recheck that we don't have usblp to collide with libusb
-			if use usb; then
-				if linux_chkconfig_present USB_PRINTER; then
-					eerror "Your usb printers will be managed via libusb. In this case, "
-					eerror "${P} requires the USB_PRINTER support disabled."
-					eerror "Please disable it:"
-					eerror "    CONFIG_USB_PRINTER=n"
-					eerror "in /usr/src/linux/.config or"
-					eerror "    Device Drivers --->"
-					eerror "        USB support  --->"
-					eerror "            [ ] USB Printer support"
-					eerror "Alternatively, just disable the usb useflag for cups (your printer will still work)."
-				fi
-			else
-				#here we should warn user that he should enable it so he can print
-				if ! linux_chkconfig_present USB_PRINTER; then
-					ewarn "If you plan to use USB printers you should enable the USB_PRINTER"
-					ewarn "support in your kernel."
-					ewarn "Please enable it:"
-					ewarn "    CONFIG_USB_PRINTER=y"
-					ewarn "in /usr/src/linux/.config or"
-					ewarn "    Device Drivers --->"
-					ewarn "        USB support  --->"
-					ewarn "            [*] USB Printer support"
-					ewarn "Alternatively, enable the usb useflag for cups and use the libusb code."
-				fi
-			fi
-		fi
-	fi
-}
-
-src_prepare() {
-	epatch_user
-
-	# Remove ".SILENT" rule for verbose output (bug 524338).
-	sed 's#^.SILENT:##g' -i "${S}"/Makedefs.in || die "sed failed"
-
-	# Fix install-sh, posix sh does not have 'function'.
-	sed 's#function gzipcp#gzipcp()#g' -i "${S}/install-sh"
-
-	AT_M4DIR=config-scripts eaclocal
-	eautoconf
-
-	# custom Makefiles
-	multilib_copy_sources
-}
-
-multilib_src_configure() {
-	sanitizers-setup-env
-
-	export DSOFLAGS="${LDFLAGS}"
-
-	einfo LANGS=\"${LANGS}\"
-	einfo LINGUAS=\"${LINGUAS}\"
-
-	local myconf=()
-
-	if tc-is-static-only; then
-		myconf+=(
-			--disable-shared
-		)
-	fi
-
-	# engages the Chrome-OS-specific "minimal" build.
-	# We perform further cleanup in multilib_src_install_all().
-	myconf+=( "--with-components=cros-minimal" )
-
-	# explicitly specify compiler wrt bug 524340
-	#
-	# need to override KRB5CONFIG for proper flags
-	# https://www.cups.org/str.php?L4423
-	econf \
-		CC="$(tc-getCC)" \
-		CXX="$(tc-getCXX)" \
-		KRB5CONFIG="${EPREFIX}"/usr/bin/${CHOST}-krb5-config \
-		--libdir="${EPREFIX}"/usr/$(get_libdir) \
-		--localstatedir="${EPREFIX}"/var \
-		--with-rundir="${EPREFIX}"/run/cups \
-		--with-printerroot="${EPREFIX}"/var/cache/cups/printers \
-		--with-cups-user=nobody \
-		--with-cups-group=cups \
-		--with-docdir="${EPREFIX}"/usr/share/cups/html \
-		--with-languages="${LINGUAS}" \
-		--with-system-groups=lpadmin \
-		--with-xinetd=/etc/xinetd.d \
-		$(multilib_native_use_enable acl) \
-		$(use_enable dbus) \
-		$(use_enable debug) \
-		$(use_enable debug debug-guards) \
-		$(use_enable debug debug-printfs) \
-		$(multilib_native_use_with java) \
-		$(use_enable kerberos gssapi) \
-		$(multilib_native_use_enable pam) \
-		$(multilib_native_use_with python python "${PYTHON}") \
-		$(use_enable static-libs static) \
-		$(use_enable threads) \
-		$(use_enable ssl gnutls) \
-		$(use_enable systemd) \
-		$(use_enable upstart) \
-		$(multilib_native_use_enable usb libusb) \
-		$(use_enable zeroconf avahi) \
-		--disable-dnssd \
-		--without-perl \
-		--without-php \
-		$(multilib_is_native_abi && echo --enable-libpaper || echo --disable-libpaper) \
-		"${myconf[@]}"
-
-	# install in /usr/libexec always, instead of using /usr/lib/cups, as that
-	# makes more sense when facing multilib support.
-	sed -i -e "s:SERVERBIN.*:SERVERBIN = \"\$\(BUILDROOT\)${EPREFIX}/usr/libexec/cups\":" Makedefs || die
-	sed -i -e "s:#define CUPS_SERVERBIN.*:#define CUPS_SERVERBIN \"${EPREFIX}/usr/libexec/cups\":" config.h || die
-	sed -i -e "s:cups_serverbin=.*:cups_serverbin=\"${EPREFIX}/usr/libexec/cups\":" cups-config || die
-}
-
-multilib_src_compile() {
-	if multilib_is_native_abi; then
-		default
-	else
-		emake libs
-	fi
-}
-
-multilib_src_test() {
-	multilib_is_native_abi && default
-}
-
-multilib_src_install() {
-	if multilib_is_native_abi; then
-		emake BUILDROOT="${D}" install
-	else
-		emake BUILDROOT="${D}" install-libs install-headers
-		dobin cups-config
-	fi
-}
-
-multilib_src_install_all() {
-	# move the default config file to docs
-	dodoc "${ED}"/etc/cups/cupsd.conf.default
-	rm -f "${ED}"/etc/cups/cupsd.conf.default
-
-	# clean out cups init scripts
-	rm -rf "${ED}"/etc/{init.d/cups,rc*,pam.d/cups}
-
-	# install our init script
-	local neededservices
-	use zeroconf && neededservices+=" avahi-daemon"
-	use dbus && neededservices+=" dbus"
-	[[ -n ${neededservices} ]] && neededservices="need${neededservices}"
-	cp "${FILESDIR}"/cupsd.init.d-r1 "${T}"/cupsd || die
-	sed -i \
-		-e "s/@neededservices@/$neededservices/" \
-		"${T}"/cupsd || die
-	doinitd "${T}"/cupsd
-
-	# install our pam script
-	pamd_mimic_system cups auth account
-
-	if use xinetd ; then
-		# correct path
-		sed -i \
-			-e "s:server = .*:server = /usr/libexec/cups/daemon/cups-lpd:" \
-			"${ED}"/etc/xinetd.d/cups-lpd || die
-		# it is safer to disable this by default, bug #137130
-		grep -w 'disable' "${ED}"/etc/xinetd.d/cups-lpd || \
-			{ sed -i -e "s:}:\tdisable = yes\n}:" "${ED}"/etc/xinetd.d/cups-lpd || die ; }
-		# write permission for file owner (root), bug #296221
-		fperms u+w /etc/xinetd.d/cups-lpd || die "fperms failed"
-	else
-		# always configure with --with-xinetd= and clean up later,
-		# bug #525604
-		rm -rf "${ED}"/etc/xinetd.d
-	fi
-
-	keepdir /usr/libexec/cups/driver /usr/share/cups/{model,profiles} \
-		/var/spool/cups/tmp
-
-	keepdir /etc/cups/{interfaces,ppd,ssl}
-
-	use X || rm -r "${ED}"/usr/share/applications
-
-	# create /etc/cups/client.conf, bug #196967 and #266678
-	echo "ServerName ${EPREFIX}/run/cups/cups.sock" >> "${ED}"/etc/cups/client.conf
-	# Cap TLS per https://crbug.com/1088032
-	echo "MaxTLS1.2" >> "${ED}/etc/cups/client.conf"
-
-	# the following file is now provided by cups-filters:
-	rm -r "${ED}"/usr/share/cups/banners || die
-
-	# the following are created by the init script
-	rm -r "${ED}"/var/cache/cups || die
-	rm -r "${ED}"/run || die
-
-	# we're sending logs to syslog, not /var/log/cups/*
-	rmdir "${ED}"/var/log/cups || die
-
-	# CUPS tries to install these as root-only executables, for
-	# IPP/Kerberos support, and for "privileged port" listening. We don't
-	# need the former, and the latter is handled by Linux capabilities.
-	# Discussion here:
-	# http://www.cups.org/pipermail/cups/2016-February/027499.html
-	chmod 0755 "${ED}"/usr/libexec/cups/backend/{dnssd,ipp,lpd}
-
-	# Create a symbolic link from "ippusb' to the ipp backend.
-	dosym ipp /usr/libexec/cups/backend/ippusb
-
-	# Install our own conf files
-	insinto /etc/cups
-	doins "${FILESDIR}"/{cupsd,cups-files}.conf
-	if use upstart; then
-		insinto /etc/init
-		doins "${FILESDIR}"/init/cups-pre-upstart-socket-bridge.conf
-		doins "${FILESDIR}"/init/cups-post-upstart-socket-bridge.conf
-		doins "${FILESDIR}"/init/cupsd.conf
-		doins "${FILESDIR}"/init/cups-clear-state.conf
-		exeinto /usr/share/cros/init
-		doexe "${FILESDIR}"/init/cups-clear-state.sh
-	fi
-
-	# CUPS wants the daemon user to own these
-	chown cups:cups "${ED}"/etc/cups/{cupsd.conf,cups-files.conf,ssl}
-	# CUPS also wants some specific permissions
-	chmod 640 "${ED}"/etc/cups/{cupsd,cups-files}.conf
-	chmod 700 "${ED}"/etc/cups/ssl
-
-	if use seccomp; then
-		# Install seccomp policy files.
-		insinto /usr/share/policy
-		newins "${FILESDIR}/cupsd-seccomp-${ARCH}.policy" cupsd-seccomp.policy
-		newins "${FILESDIR}/cupstestppd-seccomp-${ARCH}.policy" cupstestppd-seccomp.policy
-		newins "${FILESDIR}/lpadmin-seccomp-${ARCH}.policy" lpadmin-seccomp.policy
-	else
-		sed -i '/^env seccomp_flags=/s:=.*:="":' "${ED}"/etc/init/cupsd.conf
-	fi
-
-	# Removes files and directories not used by Chrome OS.
-	rm -rv \
-		"${ED}"usr/share/cups/ppdc/ \
-			|| die "failed to remove some directories"
-	rm -v \
-		"${ED}"etc/cups/*.default \
-		"${ED}"etc/cups/snmp.conf \
-		"${ED}"usr/bin/cancel \
-		"${ED}"usr/bin/cupstestdsc \
-		"${ED}"usr/libexec/cups/backend/snmp \
-		"${ED}"usr/libexec/cups/filter/rastertodymo \
-		"${ED}"usr/sbin/accept \
-		"${ED}"usr/sbin/cupsaddsmb \
-		"${ED}"usr/sbin/cupsctl \
-		"${ED}"usr/sbin/cupsreject \
-		"${ED}"usr/sbin/lpmove \
-		"${ED}"usr/sbin/reject \
-			|| die "failed to remove some files"
-}
-
-pkg_preinst() {
-	gnome2_icon_savelist
-}
-
-pkg_postinst() {
-	# Update desktop file database and gtk icon cache (bug 370059)
-	gnome2_icon_cache_update
-	fdo-mime_desktop_database_update
-
-	# not slotted - at most one value
-	if ! [[ "${REPLACING_VERSIONS}" ]]; then
-		echo
-		elog "For information about installing a printer and general cups setup"
-		elog "take a look at: https://wiki.gentoo.org/wiki/Printing"
-		echo
-	fi
-
-	if [[ "${REPLACING_VERSIONS}" ]] && [[ "${REPLACING_VERSIONS}" < "1.6" ]]; then
-		echo
-		elog "CUPS-1.6 no longer supports automatic remote printers or implicit classes"
-		elog "via the CUPS, LDAP, or SLP protocols, i.e. \"network browsing\"."
-		elog "You will have to find printers using zeroconf/avahi instead, enter"
-		elog "the location manually, or run cups-browsed from net-print/cups-filters"
-		elog "which re-adds that functionality as a separate daemon."
-		echo
-	fi
-
-	if [[ "${REPLACING_VERSIONS}" == "1.6.2-r4" ]]; then
-		ewarn
-		ewarn "You are upgrading from the broken version net-print/cups-1.6.2-r4."
-		ewarn "Please rebuild net-print/cups-filters now to make sure everything is OK."
-		ewarn
-	fi
-}
-
-pkg_postrm() {
-	# Update desktop file database and gtk icon cache (bug 370059)
-	gnome2_icon_cache_update
-	fdo-mime_desktop_database_update
-}
diff --git a/net-print/cups/cups-2.3.3-r109.ebuild b/net-print/cups/cups-2.3.3-r109.ebuild
new file mode 100644
index 0000000..88060d6
--- /dev/null
+++ b/net-print/cups/cups-2.3.3-r109.ebuild
@@ -0,0 +1,406 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+
+CROS_WORKON_COMMIT="e2c67915aacf5ccf161b30dae06bf4ecbfa3235d"
+CROS_WORKON_TREE="2225a793857cbe9a90aacac97fccef0671905c83"
+CROS_WORKON_PROJECT="chromiumos/third_party/cups"
+CROS_WORKON_EGIT_BRANCH="v2.3"
+
+PYTHON_COMPAT=( python2_7 )
+
+inherit cros-debug cros-workon libchrome-version autotools fdo-mime gnome2-utils flag-o-matic linux-info multilib multilib-minimal pam python-single-r1 user versionator java-pkg-opt-2 systemd toolchain-funcs cros-fuzzer cros-sanitizers
+
+MY_P=${P/_rc/rc}
+MY_P=${MY_P/_beta/b}
+MY_PV=${PV/_rc/rc}
+MY_PV=${MY_PV/_beta/b}
+
+KEYWORDS="*"
+
+DESCRIPTION="The Common Unix Printing System"
+HOMEPAGE="http://www.cups.org/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="acl dbus debug java kerberos pam
+	python +seccomp selinux +ssl static-libs systemd test +threads upstart usb X xinetd zeroconf
+	asan fuzzer"
+
+LANGS="ca cs de es fr it ja ru"
+for X in ${LANGS} ; do
+	IUSE="${IUSE} +linguas_${X}"
+done
+
+CDEPEND="
+	app-text/libpaper
+	acl? (
+		kernel_linux? (
+			sys-apps/acl
+			sys-apps/attr
+		)
+	)
+	dbus? ( >=sys-apps/dbus-1.6.18-r1[${MULTILIB_USEDEP}] )
+	java? ( >=virtual/jre-1.6:* )
+	kerberos? ( >=virtual/krb5-0-r1[${MULTILIB_USEDEP}] )
+	!net-print/lprng
+	pam? ( virtual/pam )
+	python? ( ${PYTHON_DEPS} )
+	ssl? (
+		>=dev-libs/libgcrypt-1.5.3:0[${MULTILIB_USEDEP}]
+		>=net-libs/gnutls-2.12.23-r6[${MULTILIB_USEDEP}]
+	)
+	systemd? ( sys-apps/systemd )
+	usb? ( virtual/libusb:1 )
+	X? ( x11-misc/xdg-utils )
+	xinetd? ( sys-apps/xinetd )
+	zeroconf? ( >=net-dns/avahi-0.6.31-r2[${MULTILIB_USEDEP}] )
+	abi_x86_32? (
+		!<=app-emulation/emul-linux-x86-baselibs-20140508
+		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
+	)
+"
+
+DEPEND="${CDEPEND}
+	>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
+	test? (
+		dev-cpp/gtest
+		>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+		>=chromeos-base/libbrillo-0.0.1-r1651:=
+	)
+"
+
+RDEPEND="${CDEPEND}
+	selinux? ( sec-policy/selinux-cups )
+"
+
+REQUIRED_USE="
+	python? ( ${PYTHON_REQUIRED_USE} )
+	usb? ( threads )
+	?? ( systemd upstart )
+"
+
+S="${WORKDIR}/${PN}-release-${MY_PV}"
+
+MULTILIB_CHOST_TOOLS=(
+	/usr/bin/cups-config
+)
+
+pkg_setup() {
+	enewgroup lp
+	enewuser lp -1 -1 -1 "lp,ippusb"
+	enewgroup lpadmin
+	enewuser lpadmin -1 -1 -1 "lpadmin,ippusb"
+	enewgroup cups
+	enewuser cups -1 -1 -1 cups
+
+	use python && python-single-r1_pkg_setup
+
+	if use kernel_linux; then
+		linux-info_pkg_setup
+		if  ! linux_config_exists; then
+			ewarn "Can't check the linux kernel configuration."
+			ewarn "You might have some incompatible options enabled."
+		else
+			# recheck that we don't have usblp to collide with libusb
+			if use usb; then
+				if linux_chkconfig_present USB_PRINTER; then
+					eerror "Your usb printers will be managed via libusb. In this case, "
+					eerror "${P} requires the USB_PRINTER support disabled."
+					eerror "Please disable it:"
+					eerror "    CONFIG_USB_PRINTER=n"
+					eerror "in /usr/src/linux/.config or"
+					eerror "    Device Drivers --->"
+					eerror "        USB support  --->"
+					eerror "            [ ] USB Printer support"
+					eerror "Alternatively, just disable the usb useflag for cups (your printer will still work)."
+				fi
+			else
+				#here we should warn user that he should enable it so he can print
+				if ! linux_chkconfig_present USB_PRINTER; then
+					ewarn "If you plan to use USB printers you should enable the USB_PRINTER"
+					ewarn "support in your kernel."
+					ewarn "Please enable it:"
+					ewarn "    CONFIG_USB_PRINTER=y"
+					ewarn "in /usr/src/linux/.config or"
+					ewarn "    Device Drivers --->"
+					ewarn "        USB support  --->"
+					ewarn "            [*] USB Printer support"
+					ewarn "Alternatively, enable the usb useflag for cups and use the libusb code."
+				fi
+			fi
+		fi
+	fi
+}
+
+src_prepare() {
+	epatch_user
+
+	# Remove ".SILENT" rule for verbose output (bug 524338).
+	sed 's#^.SILENT:##g' -i "${S}"/Makedefs.in || die "sed failed"
+
+	# Fix install-sh, posix sh does not have 'function'.
+	sed 's#function gzipcp#gzipcp()#g' -i "${S}/install-sh"
+
+	AT_M4DIR=config-scripts eaclocal
+	eautoconf
+
+	# custom Makefiles
+	multilib_copy_sources
+}
+
+multilib_src_configure() {
+	sanitizers-setup-env
+
+	export DSOFLAGS="${LDFLAGS}"
+
+	einfo LANGS=\"${LANGS}\"
+	einfo LINGUAS=\"${LINGUAS}\"
+
+	local myconf=()
+
+	if tc-is-static-only; then
+		myconf+=(
+			--disable-shared
+		)
+	fi
+
+	# engages the Chrome-OS-specific "minimal" build.
+	# We perform further cleanup in multilib_src_install_all().
+	myconf+=( "--with-components=cros-minimal" )
+
+	# explicitly specify compiler wrt bug 524340
+	#
+	# need to override KRB5CONFIG for proper flags
+	# https://www.cups.org/str.php?L4423
+	econf \
+		CC="$(tc-getCC)" \
+		CXX="$(tc-getCXX)" \
+		KRB5CONFIG="${EPREFIX}"/usr/bin/${CHOST}-krb5-config \
+		--libdir="${EPREFIX}"/usr/$(get_libdir) \
+		--localstatedir="${EPREFIX}"/var \
+		--with-rundir="${EPREFIX}"/run/cups \
+		--with-printerroot="${EPREFIX}"/var/cache/cups/printers \
+		--with-cups-user=nobody \
+		--with-cups-group=cups \
+		--with-docdir="${EPREFIX}"/usr/share/cups/html \
+		--with-languages="${LINGUAS}" \
+		--with-system-groups=lpadmin \
+		--with-xinetd=/etc/xinetd.d \
+		$(multilib_native_use_enable acl) \
+		$(use_enable dbus) \
+		$(use_enable debug) \
+		$(use_enable debug debug-guards) \
+		$(use_enable debug debug-printfs) \
+		$(multilib_native_use_with java) \
+		$(use_enable kerberos gssapi) \
+		$(multilib_native_use_enable pam) \
+		$(multilib_native_use_with python python "${PYTHON}") \
+		$(use_enable static-libs static) \
+		$(use_enable threads) \
+		$(use_enable ssl gnutls) \
+		$(use_enable systemd) \
+		$(use_enable upstart) \
+		$(multilib_native_use_enable usb libusb) \
+		$(use_enable zeroconf avahi) \
+		--disable-dnssd \
+		--without-perl \
+		--without-php \
+		$(multilib_is_native_abi && echo --enable-libpaper || echo --disable-libpaper) \
+		"${myconf[@]}"
+
+	# install in /usr/libexec always, instead of using /usr/lib/cups, as that
+	# makes more sense when facing multilib support.
+	sed -i -e "s:SERVERBIN.*:SERVERBIN = \"\$\(BUILDROOT\)${EPREFIX}/usr/libexec/cups\":" Makedefs || die
+	sed -i -e "s:#define CUPS_SERVERBIN.*:#define CUPS_SERVERBIN \"${EPREFIX}/usr/libexec/cups\":" config.h || die
+	sed -i -e "s:cups_serverbin=.*:cups_serverbin=\"${EPREFIX}/usr/libexec/cups\":" cups-config || die
+}
+
+multilib_src_compile() {
+	if multilib_is_native_abi; then
+		default
+		if use test; then
+			tc-export PKG_CONFIG
+			cros-debug-add-NDEBUG
+			export BASE_VER="$(libchrome_ver)"
+			emake compile-test
+		fi
+	else
+		emake libs
+	fi
+}
+
+multilib_src_test() {
+	multilib_is_native_abi || return 0
+	# ASAN thinks there's a leak in cupsd_main().
+	# This is probably a false positive, so disable leak detection for now.
+	ASAN_OPTIONS=detect_leaks=false:log_path=stderr \
+	UBSAN_OPTIONS=print_stacktrace=1:log_path=stderr \
+	/mnt/host/source/src/platform2/common-mk/platform2_test.py \
+		--sysroot="${SYSROOT}" -- ./scheduler/googletests || \
+		die "tests failed"
+}
+
+multilib_src_install() {
+	if multilib_is_native_abi; then
+		emake BUILDROOT="${D}" install
+	else
+		emake BUILDROOT="${D}" install-libs install-headers
+		dobin cups-config
+	fi
+}
+
+multilib_src_install_all() {
+	# move the default config file to docs
+	dodoc "${ED}"/etc/cups/cupsd.conf.default
+	rm -f "${ED}"/etc/cups/cupsd.conf.default
+
+	# clean out cups init scripts
+	rm -rf "${ED}"/etc/{init.d/cups,rc*,pam.d/cups}
+
+	# install our init script
+	local neededservices
+	use zeroconf && neededservices+=" avahi-daemon"
+	use dbus && neededservices+=" dbus"
+	[[ -n ${neededservices} ]] && neededservices="need${neededservices}"
+	cp "${FILESDIR}"/cupsd.init.d-r1 "${T}"/cupsd || die
+	sed -i \
+		-e "s/@neededservices@/$neededservices/" \
+		"${T}"/cupsd || die
+	doinitd "${T}"/cupsd
+
+	# install our pam script
+	pamd_mimic_system cups auth account
+
+	if use xinetd ; then
+		# correct path
+		sed -i \
+			-e "s:server = .*:server = /usr/libexec/cups/daemon/cups-lpd:" \
+			"${ED}"/etc/xinetd.d/cups-lpd || die
+		# it is safer to disable this by default, bug #137130
+		grep -w 'disable' "${ED}"/etc/xinetd.d/cups-lpd || \
+			{ sed -i -e "s:}:\tdisable = yes\n}:" "${ED}"/etc/xinetd.d/cups-lpd || die ; }
+		# write permission for file owner (root), bug #296221
+		fperms u+w /etc/xinetd.d/cups-lpd || die "fperms failed"
+	else
+		# always configure with --with-xinetd= and clean up later,
+		# bug #525604
+		rm -rf "${ED}"/etc/xinetd.d
+	fi
+
+	keepdir /usr/libexec/cups/driver /usr/share/cups/{model,profiles} \
+		/var/spool/cups/tmp
+
+	keepdir /etc/cups/{interfaces,ppd,ssl}
+
+	# create /etc/cups/client.conf, bug #196967 and #266678
+	echo "ServerName ${EPREFIX}/run/cups/cups.sock" >> "${ED}"/etc/cups/client.conf
+	# Cap TLS per https://crbug.com/1088032
+	echo "MaxTLS1.2" >> "${ED}/etc/cups/client.conf"
+
+	# the following file is now provided by cups-filters:
+	rm -r "${ED}"/usr/share/cups/banners || die
+
+	# the following are created by the init script
+	rm -r "${ED}"/var/cache/cups || die
+	rm -r "${ED}"/run || die
+
+	# we're sending logs to syslog, not /var/log/cups/*
+	rmdir "${ED}"/var/log/cups || die
+
+	# CUPS tries to install these as root-only executables, for
+	# IPP/Kerberos support, and for "privileged port" listening. We don't
+	# need the former, and the latter is handled by Linux capabilities.
+	# Discussion here:
+	# http://www.cups.org/pipermail/cups/2016-February/027499.html
+	chmod 0755 "${ED}"/usr/libexec/cups/backend/{dnssd,ipp,lpd}
+
+	# Create a symbolic link from "ippusb' to the ipp backend.
+	dosym ipp /usr/libexec/cups/backend/ippusb
+
+	# Install our own conf files
+	insinto /etc/cups
+	doins "${FILESDIR}"/{cupsd,cups-files}.conf
+	if use upstart; then
+		insinto /etc/init
+		doins "${FILESDIR}"/init/cups-pre-upstart-socket-bridge.conf
+		doins "${FILESDIR}"/init/cups-post-upstart-socket-bridge.conf
+		doins "${FILESDIR}"/init/cupsd.conf
+		doins "${FILESDIR}"/init/cups-clear-state.conf
+		exeinto /usr/share/cros/init
+		doexe "${FILESDIR}"/init/cups-clear-state.sh
+	fi
+
+	# CUPS wants the daemon user to own these
+	chown cups:cups "${ED}"/etc/cups/{cupsd.conf,cups-files.conf,ssl}
+	# CUPS also wants some specific permissions
+	chmod 640 "${ED}"/etc/cups/{cupsd,cups-files}.conf
+	chmod 700 "${ED}"/etc/cups/ssl
+
+	if use seccomp; then
+		# Install seccomp policy files.
+		insinto /usr/share/policy
+		newins "${FILESDIR}/cupsd-seccomp-${ARCH}.policy" cupsd-seccomp.policy
+		newins "${FILESDIR}/cupstestppd-seccomp-${ARCH}.policy" cupstestppd-seccomp.policy
+		newins "${FILESDIR}/lpadmin-seccomp-${ARCH}.policy" lpadmin-seccomp.policy
+	else
+		sed -i '/^env seccomp_flags=/s:=.*:="":' "${ED}"/etc/init/cupsd.conf
+	fi
+
+	# Removes files and directories not used by Chrome OS.
+	rm -rv \
+		"${ED}"usr/share/cups/ppdc/ \
+			|| die "failed to remove some directories"
+	rm -v \
+		"${ED}"etc/cups/*.default \
+		"${ED}"etc/cups/snmp.conf \
+		"${ED}"usr/bin/cancel \
+		"${ED}"usr/libexec/cups/backend/snmp \
+		"${ED}"usr/sbin/cupsctl \
+		"${ED}"usr/sbin/cupsreject \
+		"${ED}"usr/sbin/lpmove \
+			|| die "failed to remove some files"
+}
+
+pkg_preinst() {
+	gnome2_icon_savelist
+}
+
+pkg_postinst() {
+	# Update desktop file database and gtk icon cache (bug 370059)
+	gnome2_icon_cache_update
+	fdo-mime_desktop_database_update
+
+	# not slotted - at most one value
+	if ! [[ "${REPLACING_VERSIONS}" ]]; then
+		echo
+		elog "For information about installing a printer and general cups setup"
+		elog "take a look at: https://wiki.gentoo.org/wiki/Printing"
+		echo
+	fi
+
+	if [[ "${REPLACING_VERSIONS}" ]] && [[ "${REPLACING_VERSIONS}" < "1.6" ]]; then
+		echo
+		elog "CUPS-1.6 no longer supports automatic remote printers or implicit classes"
+		elog "via the CUPS, LDAP, or SLP protocols, i.e. \"network browsing\"."
+		elog "You will have to find printers using zeroconf/avahi instead, enter"
+		elog "the location manually, or run cups-browsed from net-print/cups-filters"
+		elog "which re-adds that functionality as a separate daemon."
+		echo
+	fi
+
+	if [[ "${REPLACING_VERSIONS}" == "1.6.2-r4" ]]; then
+		ewarn
+		ewarn "You are upgrading from the broken version net-print/cups-1.6.2-r4."
+		ewarn "Please rebuild net-print/cups-filters now to make sure everything is OK."
+		ewarn
+	fi
+}
+
+pkg_postrm() {
+	# Update desktop file database and gtk icon cache (bug 370059)
+	gnome2_icon_cache_update
+	fdo-mime_desktop_database_update
+}
diff --git a/net-print/cups/cups-9999.ebuild b/net-print/cups/cups-9999.ebuild
index 2a3a450..667c32f 100644
--- a/net-print/cups/cups-9999.ebuild
+++ b/net-print/cups/cups-9999.ebuild
@@ -5,13 +5,11 @@
 EAPI=5
 
 CROS_WORKON_PROJECT="chromiumos/third_party/cups"
-CROS_WORKON_EGIT_BRANCH="cups-2-2-8"
+CROS_WORKON_EGIT_BRANCH="v2.3"
 
 PYTHON_COMPAT=( python2_7 )
 
-inherit cros-workon autotools fdo-mime gnome2-utils flag-o-matic linux-info \
-	multilib multilib-minimal pam python-single-r1 user versionator \
-	java-pkg-opt-2 systemd toolchain-funcs cros-fuzzer cros-sanitizers
+inherit cros-debug cros-workon libchrome-version autotools fdo-mime gnome2-utils flag-o-matic linux-info multilib multilib-minimal pam python-single-r1 user versionator java-pkg-opt-2 systemd toolchain-funcs cros-fuzzer cros-sanitizers
 
 MY_P=${P/_rc/rc}
 MY_P=${MY_P/_beta/b}
@@ -26,7 +24,7 @@
 LICENSE="GPL-2"
 SLOT="0"
 IUSE="acl dbus debug java kerberos pam
-	python +seccomp selinux +ssl static-libs systemd +threads upstart usb X xinetd zeroconf
+	python +seccomp selinux +ssl static-libs systemd test +threads upstart usb X xinetd zeroconf
 	asan fuzzer"
 
 LANGS="ca cs de es fr it ja ru"
@@ -65,6 +63,11 @@
 
 DEPEND="${CDEPEND}
 	>=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
+	test? (
+		dev-cpp/gtest
+		>=chromeos-base/libchrome-0.0.1-r31:0=[cros-debug=]
+		>=chromeos-base/libbrillo-0.0.1-r1651:=
+	)
 "
 
 RDEPEND="${CDEPEND}
@@ -77,9 +80,6 @@
 	?? ( systemd upstart )
 "
 
-# upstream includes an interactive test which is a nono for gentoo
-RESTRICT="test"
-
 S="${WORKDIR}/${PN}-release-${MY_PV}"
 
 MULTILIB_CHOST_TOOLS=(
@@ -219,13 +219,26 @@
 multilib_src_compile() {
 	if multilib_is_native_abi; then
 		default
+		if use test; then
+			tc-export PKG_CONFIG
+			cros-debug-add-NDEBUG
+			export BASE_VER="$(libchrome_ver)"
+			emake compile-test
+		fi
 	else
 		emake libs
 	fi
 }
 
 multilib_src_test() {
-	multilib_is_native_abi && default
+	multilib_is_native_abi || return 0
+	# ASAN thinks there's a leak in cupsd_main().
+	# This is probably a false positive, so disable leak detection for now.
+	ASAN_OPTIONS=detect_leaks=false:log_path=stderr \
+	UBSAN_OPTIONS=print_stacktrace=1:log_path=stderr \
+	/mnt/host/source/src/platform2/common-mk/platform2_test.py \
+		--sysroot="${SYSROOT}" -- ./scheduler/googletests || \
+		die "tests failed"
 }
 
 multilib_src_install() {
@@ -280,8 +293,6 @@
 
 	keepdir /etc/cups/{interfaces,ppd,ssl}
 
-	use X || rm -r "${ED}"/usr/share/applications
-
 	# create /etc/cups/client.conf, bug #196967 and #266678
 	echo "ServerName ${EPREFIX}/run/cups/cups.sock" >> "${ED}"/etc/cups/client.conf
 	# Cap TLS per https://crbug.com/1088032
@@ -344,15 +355,10 @@
 		"${ED}"etc/cups/*.default \
 		"${ED}"etc/cups/snmp.conf \
 		"${ED}"usr/bin/cancel \
-		"${ED}"usr/bin/cupstestdsc \
 		"${ED}"usr/libexec/cups/backend/snmp \
-		"${ED}"usr/libexec/cups/filter/rastertodymo \
-		"${ED}"usr/sbin/accept \
-		"${ED}"usr/sbin/cupsaddsmb \
 		"${ED}"usr/sbin/cupsctl \
 		"${ED}"usr/sbin/cupsreject \
 		"${ED}"usr/sbin/lpmove \
-		"${ED}"usr/sbin/reject \
 			|| die "failed to remove some files"
 }
 
diff --git a/net-print/cups/files/cupsd-seccomp-amd64.policy b/net-print/cups/files/cupsd-seccomp-amd64.policy
index af83039..fcdf77a 100644
--- a/net-print/cups/files/cupsd-seccomp-amd64.policy
+++ b/net-print/cups/files/cupsd-seccomp-amd64.policy
@@ -8,6 +8,7 @@
 brk: 1
 chmod: 1
 chown: 1
+clock_gettime: 1
 clone: 1
 close: 1
 connect: 1
@@ -53,6 +54,7 @@
 lseek: 1
 lstat: 1
 madvise: 1
+memfd_create: 1
 mkdir: 1
 mmap: 1
 mprotect: 1
diff --git a/net-print/cups/files/cupsd-seccomp-arm.policy b/net-print/cups/files/cupsd-seccomp-arm.policy
index acc0bc7..f04977a 100644
--- a/net-print/cups/files/cupsd-seccomp-arm.policy
+++ b/net-print/cups/files/cupsd-seccomp-arm.policy
@@ -56,6 +56,7 @@
 _llseek: 1
 lstat64: 1
 madvise: 1
+memfd_create: 1
 mkdir: 1
 mmap2: 1
 mprotect: 1
diff --git a/net-print/cups/files/cupsd-seccomp-arm64.policy b/net-print/cups/files/cupsd-seccomp-arm64.policy
index b117496..98f85f5 100644
--- a/net-print/cups/files/cupsd-seccomp-arm64.policy
+++ b/net-print/cups/files/cupsd-seccomp-arm64.policy
@@ -53,6 +53,7 @@
 listen: 1
 lseek: 1
 madvise: 1
+memfd_create: 1
 mkdirat: 1
 # Don't allow mmap or mprotect with both PROT_WRITE and PROT_EXEC
 mmap: arg2 in 0xfffffffb || arg2 in 0xfffffffd
diff --git a/net-print/cups/files/cupsd-seccomp-x86.policy b/net-print/cups/files/cupsd-seccomp-x86.policy
index 88999b7..584c2dd 100644
--- a/net-print/cups/files/cupsd-seccomp-x86.policy
+++ b/net-print/cups/files/cupsd-seccomp-x86.policy
@@ -9,6 +9,7 @@
 chmod: 1
 chown: 1
 chown32: 1
+clock_gettime: 1
 clone: 1
 close: 1
 connect: 1
@@ -67,6 +68,7 @@
 lstat: 1
 lstat64: 1
 madvise: 1
+memfd_create: 1
 mkdir: 1
 mmap: 1
 mmap2: 1
diff --git a/net-print/cups/files/init/cupsd.conf b/net-print/cups/files/init/cupsd.conf
index 52c9d07..80c7323 100644
--- a/net-print/cups/files/init/cupsd.conf
+++ b/net-print/cups/files/init/cupsd.conf
@@ -20,6 +20,14 @@
 	# also cups-clear-state.conf for details.
 	/usr/share/cros/init/cups-clear-state.sh
 
+	fail_if_symlink() {
+		local abs="$(readlink -f .)"
+		if [ "$1" != "${abs}" ]; then
+			logger -t "${UPSTART_JOB}" "'$1' resolves to '${abs}'"
+			exit 1
+		fi
+	}
+
 	# dir: directory to create (if necessary)
 	# perm: permissions to set for the directory
 	# group (optional): group to own the directory; defaults to ${lp_group}
@@ -30,8 +38,14 @@
 		# If it's not a directory currently, clean it up.
 		rm -f "${dir}" 2>/dev/null || :
 		mkdir -p "${dir}"
-		chown ${user}:${group} "${dir}"
-		chmod "${perm}" "${dir}"
+		# Use working directory instead of path to avoid chown and chmod being
+		# applied to a linked path.
+		local original_wd="${PWD}"
+		cd "${dir}"
+		fail_if_symlink "${dir}"
+		chown -h ${user}:${group} .
+		chmod "${perm}" .
+		cd "${original_wd}"
 	}
 
 	check_create /var/spool/cups 0710
@@ -47,7 +61,11 @@
 	check_create "${printer_root}"/ppd 0755
 
 	# Clear old job files and history
-	rm -f /var/spool/cups/{c,d}* /var/cache/cups/job.cache*
+	original_wd="${PWD}"
+	cd "/var/spool/cups"
+	fail_if_symlink "/var/spool/cups"
+	rm -f ./{c,d}* ./job.cache*
+	cd "${original_wd}"
 end script
 
 # TODO(xiaochu): use -b instead of -K. crbug.com/811473
diff --git a/net-print/cups/files/lpadmin-seccomp-amd64.policy b/net-print/cups/files/lpadmin-seccomp-amd64.policy
index 23c0c8d..cff183a 100644
--- a/net-print/cups/files/lpadmin-seccomp-amd64.policy
+++ b/net-print/cups/files/lpadmin-seccomp-amd64.policy
@@ -6,6 +6,7 @@
 arch_prctl: 1
 bind: 1
 brk: 1
+clock_gettime: 1
 close: 1
 connect: 1
 exit: 1
@@ -47,3 +48,4 @@
 uname: 1
 unlink: 1
 write: 1
+writev: 1
diff --git a/net-print/cups/files/lpadmin-seccomp-arm.policy b/net-print/cups/files/lpadmin-seccomp-arm.policy
index f481b63..8541b98 100644
--- a/net-print/cups/files/lpadmin-seccomp-arm.policy
+++ b/net-print/cups/files/lpadmin-seccomp-arm.policy
@@ -48,3 +48,4 @@
 uname: 1
 unlink: 1
 write: 1
+writev: 1
diff --git a/net-print/cups/files/lpadmin-seccomp-arm64.policy b/net-print/cups/files/lpadmin-seccomp-arm64.policy
index 80ac51c..99e22ee 100644
--- a/net-print/cups/files/lpadmin-seccomp-arm64.policy
+++ b/net-print/cups/files/lpadmin-seccomp-arm64.policy
@@ -4,6 +4,7 @@
 
 brk: 1
 bind: 1
+clock_gettime: 1
 close: 1
 connect: 1
 execve: 1
@@ -49,3 +50,4 @@
 uname: 1
 unlinkat: 1
 write: 1
+writev: 1
diff --git a/net-print/cups/files/lpadmin-seccomp-x86.policy b/net-print/cups/files/lpadmin-seccomp-x86.policy
index c1de0d6..af8de54 100644
--- a/net-print/cups/files/lpadmin-seccomp-x86.policy
+++ b/net-print/cups/files/lpadmin-seccomp-x86.policy
@@ -6,6 +6,7 @@
 access: 1
 bind: 1
 brk: 1
+clock_gettime: 1
 close: 1
 connect: 1
 exit: 1
@@ -49,3 +50,4 @@
 uname: 1
 unlink: 1
 write: 1
+writev: 1
diff --git a/net-print/cups_proxy/OWNERS b/net-print/cups_proxy/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/cups_proxy/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/cups_proxy/cups_proxy-0.0.1-r103.ebuild b/net-print/cups_proxy/cups_proxy-0.0.1-r103.ebuild
deleted file mode 100644
index 454d04b..0000000
--- a/net-print/cups_proxy/cups_proxy-0.0.1-r103.ebuild
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="494e5a461d651a9fe93873835f48a9fcb9812b6e"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "5eb4ce85c92a80d21ba7b43c6d0fd3cd14b20299" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk cups_proxy .gn"
-
-PLATFORM_SUBDIR="cups_proxy"
-
-inherit cros-workon platform user
-
-DESCRIPTION="CUPS Proxy Daemon for Chromium OS"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cups_proxy/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="
-	chromeos-base/libbrillo:=
-	net-libs/libmicrohttpd:=
-	"
-
-DEPEND="${RDEPEND}
-	"
-
-pkg_preinst() {
-	enewuser cups-proxy
-	enewgroup cups-proxy
-}
-
-src_install() {
-	dobin "${OUT}"/cups_proxy
-
-	# Install upstart configuration.
-	insinto /etc/init
-	doins init/*.conf
-
-	# Install seccomp policy file.
-	insinto /usr/share/policy
-	newins "seccomp/cups_proxy-seccomp-${ARCH}.policy" cups_proxy-seccomp.policy
-
-	# Install D-Bus configuration file.
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.CupsProxyDaemon.conf
-
-	# Install D-Bus service activation configuration.
-	insinto /usr/share/dbus-1/system-services
-	doins dbus/org.chromium.CupsProxyDaemon.service
-}
diff --git a/net-print/cups_proxy/cups_proxy-0.0.1-r124.ebuild b/net-print/cups_proxy/cups_proxy-0.0.1-r124.ebuild
new file mode 100644
index 0000000..c248c9f
--- /dev/null
+++ b/net-print/cups_proxy/cups_proxy-0.0.1-r124.ebuild
@@ -0,0 +1,57 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "77483f5d470a5c2fe78edfd02b160d0dba31eb99" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk cups_proxy .gn"
+
+PLATFORM_SUBDIR="cups_proxy"
+
+inherit cros-workon platform user
+
+DESCRIPTION="CUPS Proxy Daemon for Chromium OS"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/cups_proxy/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="
+	chromeos-base/libbrillo:=
+	net-libs/libmicrohttpd:=
+	"
+
+DEPEND="${RDEPEND}
+	"
+
+pkg_preinst() {
+	enewuser cups-proxy
+	enewgroup cups-proxy
+}
+
+src_install() {
+	dobin "${OUT}"/cups_proxy
+
+	# Install upstart configuration.
+	insinto /etc/init
+	doins init/*.conf
+
+	# Install seccomp policy file.
+	insinto /usr/share/policy
+	newins "seccomp/cups_proxy-seccomp-${ARCH}.policy" cups_proxy-seccomp.policy
+
+	# Install D-Bus configuration file.
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.CupsProxyDaemon.conf
+
+	# Install D-Bus service activation configuration.
+	insinto /usr/share/dbus-1/system-services
+	doins dbus/org.chromium.CupsProxyDaemon.service
+}
diff --git a/net-print/dymo-cups-drivers/OWNERS b/net-print/dymo-cups-drivers/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/dymo-cups-drivers/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r1.ebuild b/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r1.ebuild
deleted file mode 100644
index f1637da..0000000
--- a/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r1.ebuild
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-inherit eutils autotools
-
-DESCRIPTION="Dymo SDK for LabelWriter/LabelManager printers"
-HOMEPAGE="https://newellrubbermaid.secure.force.com/dymopkb"
-SRC_URI="http://download.dymo.com/Download%20Drivers/Linux/Download/${P}.tar.gz"
-
-S="${WORKDIR}/${P}.5"
-
-LICENSE="GPL-2"
-SLOT="0"
-IUSE="test usb_modeswitch"
-RESTRICT="!test? ( test )"
-
-KEYWORDS="*"
-
-RDEPEND="net-print/cups"
-DEPEND="${RDEPEND}
-	test? ( dev-util/cppunit )
-	usb_modeswitch? ( sys-apps/usb_modeswitch )"
-
-PATCHES=(
-	"${FILESDIR}"/${PN}-1.2.0-cxxflags.patch
-	"${FILESDIR}"/port_to_newer_cups_headers.patch
-	"${FILESDIR}"/dymo-cups-drivers-1.4.0.5-flexible-tests.patch
-)
-
-DOCS=( AUTHORS README ChangeLog docs/SAMPLES )
-
-src_prepare() {
-	default
-	eapply_user
-	eautoreconf
-}
-
-src_install() {
-	default
-
-	insinto /usr/share/doc/${PF}
-	doins docs/*.{txt,rtf,ps,png}
-}
-
-src_test() {
-	# upstream tests are designed to be run AFTER make install, because they depend on final paths.
-	testroot="${T}/testroot"
-	mkdir -p "${testroot}"
-	emake install DESTDIR="${testroot}"
-	# -W filters is because CUPS tries really hard for secure filters: they must be root/root for the filter tests to pass
-	#chown root:root "${testroot}"/usr/libexec/cups/filter/{raster2dymolm,raster2dymolw} || die "failed to set ownership for tests"
-	# This will trigger the following warning repeatedly
-	#Bad permissions on cupsFilter file "..${testroot}/usr/libexec/cups/filter/raster2dymolm"
-	emake check CUPSTESTPPD_OPTS="-R ${testroot} -W filters"
-}
diff --git a/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r2.ebuild b/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r2.ebuild
new file mode 120000
index 0000000..a022bc4
--- /dev/null
+++ b/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0-r2.ebuild
@@ -0,0 +1 @@
+dymo-cups-drivers-1.4.0.ebuild
\ No newline at end of file
diff --git a/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0.ebuild b/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0.ebuild
new file mode 100644
index 0000000..767a1cf
--- /dev/null
+++ b/net-print/dymo-cups-drivers/dymo-cups-drivers-1.4.0.ebuild
@@ -0,0 +1,61 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+inherit eutils autotools cros-sanitizers
+
+DESCRIPTION="Dymo SDK for LabelWriter/LabelManager printers"
+HOMEPAGE="https://newellrubbermaid.secure.force.com/dymopkb"
+SRC_URI="http://download.dymo.com/Download%20Drivers/Linux/Download/${P}.tar.gz"
+
+S="${WORKDIR}/${P}.5"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="test usb_modeswitch"
+RESTRICT="!test? ( test )"
+
+KEYWORDS="*"
+
+RDEPEND="net-print/cups:="
+DEPEND="${RDEPEND}
+	test? ( dev-util/cppunit )
+	usb_modeswitch? ( sys-apps/usb_modeswitch )"
+
+PATCHES=(
+	"${FILESDIR}"/${PN}-1.2.0-cxxflags.patch
+	"${FILESDIR}"/port_to_newer_cups_headers.patch
+	"${FILESDIR}"/dymo-cups-drivers-1.4.0.5-flexible-tests.patch
+)
+
+DOCS=( AUTHORS README ChangeLog docs/SAMPLES )
+
+src_prepare() {
+	default
+	eapply_user
+	eautoreconf
+}
+
+src_configure() {
+	sanitizers-setup-env
+	default
+}
+
+src_install() {
+	default
+
+	insinto /usr/share/doc/${PF}
+	doins docs/*.{txt,rtf,ps,png}
+}
+
+src_test() {
+	# upstream tests are designed to be run AFTER make install, because they depend on final paths.
+	testroot="${T}/testroot"
+	mkdir -p "${testroot}"
+	emake install DESTDIR="${testroot}"
+	# -W filters is because CUPS tries really hard for secure filters: they must be root/root for the filter tests to pass
+	#chown root:root "${testroot}"/usr/libexec/cups/filter/{raster2dymolm,raster2dymolw} || die "failed to set ownership for tests"
+	# This will trigger the following warning repeatedly
+	#Bad permissions on cupsFilter file "..${testroot}/usr/libexec/cups/filter/raster2dymolm"
+	emake check CUPSTESTPPD_OPTS="-R ${testroot} -W filters"
+}
diff --git a/net-print/dymo-cups-drivers/files/port_to_newer_cups_headers.patch b/net-print/dymo-cups-drivers/files/port_to_newer_cups_headers.patch
index 8677664..4abcb94 100644
--- a/net-print/dymo-cups-drivers/files/port_to_newer_cups_headers.patch
+++ b/net-print/dymo-cups-drivers/files/port_to_newer_cups_headers.patch
@@ -12,7 +12,7 @@
  AC_CHECK_LIB(cups, cupsMarkOptions, , AC_ERROR([Can't find cups library]))
  AC_CHECK_LIB(cupsimage, cupsRasterReadHeader, , AC_ERROR([Can't find cupsimage library]))
 -AC_CHECK_HEADERS([cups/cups.h cups/raster.h],, AC_ERROR([Can't find cups headers]))
-+AC_CHECK_HEADERS([cups/cups.h cups/raster.h cups/ppd.h],, AC_ERROR([Can't find cups headers]))
++AC_CHECK_HEADERS([cups/cups.h cups/raster.h cups/ppd.h cups/sidechannel.h],, AC_ERROR([Can't find cups headers]))
  
  #CUPS_LIBS=`cups-config --image --libs`
  #CUPS_LIBS="-lcups -lcupsimage"
@@ -26,6 +26,16 @@
  #include <memory>
  #include <string>
  #include "CupsPrintEnvironment.h"
+--- a/src/common/CupsPrintEnvironment.cpp
++++ b/src/common/CupsPrintEnvironment.cpp
+@@ -23,6 +23,7 @@
+ #include "CupsPrintEnvironment.h"
+ #include <errno.h>
+ #include <cups/cups.h>
++#include <cups/sidechannel.h>
+ #include <cassert>
+ 
+ namespace DymoPrinterDriver
 --- a/src/lm/CupsFilterLabelManager.h
 +++ b/src/lm/CupsFilterLabelManager.h
 @@ -23,6 +23,7 @@
diff --git a/net-print/epson-inkjet-printer-escpr/OWNERS b/net-print/epson-inkjet-printer-escpr/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/epson-inkjet-printer-escpr/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1-r1.ebuild b/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1-r1.ebuild
new file mode 120000
index 0000000..c63bb48
--- /dev/null
+++ b/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1-r1.ebuild
@@ -0,0 +1 @@
+fuji-xerox-printing-license-0.1.ebuild
\ No newline at end of file
diff --git a/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1.ebuild b/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1.ebuild
new file mode 100644
index 0000000..064e22c
--- /dev/null
+++ b/net-print/fuji-xerox-printing-license/fuji-xerox-printing-license-0.1.ebuild
@@ -0,0 +1,19 @@
+# Copyright 1999-2019 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# This ebuild is used to install the Fuji Xerox PPD license into Chrome OS. PPDs are
+# served separately from the operating system through a static content server,
+# but in order for their associated licenses to appear in the os-credits page a
+# license must be generated from an ebuild.
+
+EAPI=6
+
+DESCRIPTION="Licenses for Fuji Xerox PPD files"
+HOMEPAGE="http://dev.chromium.org"
+
+
+LICENSE="LICENSE.fuji-xerox-ppds"
+SLOT="0"
+KEYWORDS="*"
+IUSE="internal"
+REQUIRED_USE="internal"
diff --git a/net-print/hplip/OWNERS b/net-print/hplip/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/hplip/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/hplip/hplip-3.19.6-r1.ebuild b/net-print/hplip/hplip-3.19.6-r4.ebuild
similarity index 100%
rename from net-print/hplip/hplip-3.19.6-r1.ebuild
rename to net-print/hplip/hplip-3.19.6-r4.ebuild
diff --git a/net-print/hplip/hplip-3.19.6.ebuild b/net-print/hplip/hplip-3.19.6.ebuild
index d9342bb..cad7a13 100644
--- a/net-print/hplip/hplip-3.19.6.ebuild
+++ b/net-print/hplip/hplip-3.19.6.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2019 Gentoo Authors
+# Copyright 1999-2020 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=6
@@ -49,18 +49,19 @@
 	${COMMON_DEPEND}
 	app-text/ghostscript-gpl
 	!minimal? (
-		>=dev-python/dbus-python-1.2.0-r1[${PYTHON_USEDEP}]
+		$(python_gen_cond_dep '>=dev-python/dbus-python-1.2.0-r1[${PYTHON_USEDEP}]')
 		$(python_gen_cond_dep 'dev-python/pygobject:2[${PYTHON_USEDEP}]' 'python2*')
 		$(python_gen_cond_dep 'dev-python/pygobject:3[${PYTHON_USEDEP}]' 'python3*')
-		fax? ( dev-python/reportlab[${PYTHON_USEDEP}] )
+		fax? ( $(python_gen_cond_dep 'dev-python/reportlab[${PYTHON_USEDEP}]') )
 		kernel_linux? ( virtual/udev )
 		qt5? (
-			>=dev-python/PyQt5-5.5.1[dbus,gui,widgets,${PYTHON_USEDEP}]
-			libnotify? ( dev-python/notify2[${PYTHON_USEDEP}] )
+			$(python_gen_cond_dep \
+				'>=dev-python/PyQt5-5.5.1[dbus,gui,widgets,${PYTHON_USEDEP}]')
+			libnotify? ( $(python_gen_cond_dep 'dev-python/notify2[${PYTHON_USEDEP}]') )
 		)
 		scanner? (
-			>=dev-python/reportlab-3.2[${PYTHON_USEDEP}]
-			>=dev-python/pillow-3.1.1[${PYTHON_USEDEP}]
+			$(python_gen_cond_dep '>=dev-python/reportlab-3.2[${PYTHON_USEDEP}]')
+			$(python_gen_cond_dep '>=dev-python/pillow-3.1.1[${PYTHON_USEDEP}]')
 			X? (
 				|| (
 					kde? ( kde-misc/skanlite )
@@ -202,6 +203,7 @@
 		fi
 	fi
 
+	local cups_config="${SYSROOT}/usr/bin/cups-config"
 	# disable class driver for now
 	econf \
 		--disable-cups11-build \
@@ -212,8 +214,8 @@
 		--disable-qt3 \
 		--disable-qt4 \
 		--disable-udev_sysfs_rules \
-		--with-cupsbackenddir=$(cups-config --serverbin)/backend \
-		--with-cupsfilterdir=$(cups-config --serverbin)/filter \
+		--with-cupsbackenddir=$("${cups_config}" --serverbin)/backend \
+		--with-cupsfilterdir=$("${cups_config}" --serverbin)/filter \
 		--with-docdir=/usr/share/doc/${PF} \
 		--with-htmldir=/usr/share/doc/${PF}/html \
 		--disable-network-build \
diff --git a/net-print/ippusbxd/Manifest b/net-print/ippusbxd/Manifest
deleted file mode 100644
index d9f9fed..0000000
--- a/net-print/ippusbxd/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST ippusbxd-1.33-e8176ff30f4b7ac203bd752d457d5e81437556f1.tar.gz 86372 BLAKE2B a742c52b28ae88a019158b607b173d0da74b0f38effcf16c8582a55a66d0dc65f68d4bc47898477e6c03e0770fbb0902c579b1c75019061ce375bdfe5b0426e3 SHA512 e65c4030bebb00dd46dcc5d66617e3cdf0f87786f6a8bea5d24dfcacbfc7839ba41fb0ea310c11e9238734cfcf0ad0b6688798d7e2ea270f76918e4d30632157
diff --git a/net-print/ippusbxd/files/ippusbxd-seccomp-amd64.policy b/net-print/ippusbxd/files/ippusbxd-seccomp-amd64.policy
deleted file mode 100644
index a29dca5..0000000
--- a/net-print/ippusbxd/files/ippusbxd-seccomp-amd64.policy
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-accept: 1
-access: 1
-arch_prctl: 1
-bind: 1
-brk: 1
-clock_getres: 1
-clone: arg0 & 0x00010000
-close: 1
-connect: 1
-exit: 1
-exit_group: 1
-fcntl: 1
-fstat: 1
-futex: 1
-getdents: 1
-geteuid: 1
-getresgid: 1
-getresuid: 1
-getrlimit: 1
-getsockname: 1
-# ioctl: arg1 == SIOCGIFFLAGS || arg1 == SIOCSIFFLAGS || arg1 == SIOCGIFINDEX
-# || arg1 == TCGETS || arg1 == USBDEVFS_REAPURBNDELAY
-# || arg1 == USBDEVFS_GETDRIVER || arg1 == USBDEVFS_SUBMITURB
-# || arg1 == USBDEVFS_GET_CAPABILITIES || arg1 == USBDEVFS_CLAIMINTERFACE
-# || arg1 == USBDEVFS_SETINTERFACE
-ioctl: arg1 == 0x8913 || arg1 == 0x8914 ||  arg1 == 0x8933 ||  arg1 == 0x5401 || arg1 == 0x4008550d || arg1 == 0x41045508 || arg1 == 0x8038550a || arg1 == 0x8004551a || arg1 == 0x8004550f || arg1 == 0x80085504
-listen: 1
-madvise: 1
-mmap: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-mprotect: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-munmap: 1
-nanosleep: 1
-open: 1
-openat: 1
-pipe: 1
-poll: 1
-read: 1
-recvfrom: 1
-recvmsg: 1
-restart_syscall: 1
-rt_sigaction: 1
-rt_sigprocmask: 1
-rt_sigreturn: 1
-sendmsg: 1
-sendto: 1
-setgroups: 1
-setresgid: 1
-setresuid: 1
-set_robust_list: 1
-setsockopt: 1
-set_tid_address: 1
-shutdown: 1
-socket: arg0 == AF_UNIX || arg0 == AF_NETLINK
-stat: 1
-timerfd_create: 1
-timerfd_settime: 1
-uname: 1
-unlink: 1
-write: 1
-getpid: 1
-prlimit64: arg2 == 0 && arg3 != 0
diff --git a/net-print/ippusbxd/files/ippusbxd-seccomp-arm.policy b/net-print/ippusbxd/files/ippusbxd-seccomp-arm.policy
deleted file mode 100644
index 9733b1b..0000000
--- a/net-print/ippusbxd/files/ippusbxd-seccomp-arm.policy
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-_llseek: 1
-accept: 1
-access: 1
-bind: 1
-brk: 1
-clock_getres: 1
-clone: arg0 & 0x00010000
-close: 1
-connect: 1
-exit: 1
-exit_group: 1
-fcntl64: 1
-fstat64: 1
-futex: 1
-getdents: 1
-geteuid32: 1
-getresgid32: 1
-getresuid32: 1
-ugetrlimit: 1
-getsockname: 1
-# ioctl: arg1 == SIOCGIFFLAGS || arg1 == SIOCSIFFLAGS || arg1 == SIOCGIFINDEX
-# || arg1 == TCGETS || arg1 == USBDEVFS_REAPURBNDELAY
-# || arg1 == USBDEVFS_GETDRIVER || arg1 == USBDEVFS_SUBMITURB
-# || arg1 == USBDEVFS_GET_CAPABILITIES || arg1 == USBDEVFS_CLAIMINTERFACE
-# || arg1 == USBDEVFS_SETINTERFACE
-ioctl: arg1 == 0x8913 || arg1 == 0x8914 ||  arg1 == 0x8933 ||  arg1 == 0x5401 || arg1 == 0x4008550d || arg1 == 0x41045508 || arg1 == 0x8038550a || arg1 == 0x8004551a || arg1 == 0x8004550f || arg1 == 0x80085504
-listen: 1
-madvise: 1
-mmap2: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-mprotect: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-munmap: 1
-nanosleep: 1
-open: 1
-openat: 1
-pipe: 1
-poll: 1
-read: 1
-recvfrom: 1
-recvmsg: 1
-restart_syscall: 1
-rt_sigaction: 1
-rt_sigprocmask: 1
-rt_sigreturn: 1
-sendmsg: 1
-sendto: 1
-setgroups: 1
-setresgid: 1
-setresuid: 1
-set_robust_list: 1
-setsockopt: 1
-set_tid_address: 1
-shutdown: 1
-socket: arg0 == AF_UNIX || arg0 == AF_NETLINK
-stat64: 1
-timerfd_create: 1
-timerfd_settime: 1
-uname: 1
-unlink: 1
-write: 1
-getpid: 1
-prlimit64: arg2 == 0 && arg3 != 0
diff --git a/net-print/ippusbxd/files/ippusbxd-seccomp-arm64.policy b/net-print/ippusbxd/files/ippusbxd-seccomp-arm64.policy
deleted file mode 100644
index 121c402..0000000
--- a/net-print/ippusbxd/files/ippusbxd-seccomp-arm64.policy
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-lseek: 1
-accept: 1
-bind: 1
-brk: 1
-clock_getres: 1
-clone: arg0 & 0x00010000
-close: 1
-connect: 1
-exit: 1
-exit_group: 1
-fcntl: 1
-fstat: 1
-futex: 1
-getdents64: 1
-geteuid: 1
-getresgid: 1
-getresuid: 1
-getrlimit: 1
-getsockname: 1
-# ioctl: arg1 == SIOCGIFFLAGS || arg1 == SIOCSIFFLAGS || arg1 == SIOCGIFINDEX
-# || arg1 == TCGETS || arg1 == USBDEVFS_REAPURBNDELAY
-# || arg1 == USBDEVFS_GETDRIVER || arg1 == USBDEVFS_SUBMITURB
-# || arg1 == USBDEVFS_GET_CAPABILITIES || arg1 == USBDEVFS_CLAIMINTERFACE
-# || arg1 == USBDEVFS_SETINTERFACE
-ioctl: arg1 == 0x8913 || arg1 == 0x8914 ||  arg1 == 0x8933 ||  arg1 == 0x5401 || arg1 == 0x4008550d || arg1 == 0x41045508 || arg1 == 0x8038550a || arg1 == 0x8004551a || arg1 == 0x8004550f || arg1 == 0x80085504
-listen: 1
-madvise: 1
-# Don't allow mmap with both PROT_WRITE and PROT_EXEC
-mmap: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-# Don't allow mprotect with both PROT_WRITE and PROT_EXEC
-mprotect: arg2 in 0xfffffffb || arg2 in 0xfffffffd
-munmap: 1
-nanosleep: 1
-openat: 1
-pipe2: 1
-ppoll: 1
-read: 1
-recvfrom: 1
-recvmsg: 1
-restart_syscall: 1
-rt_sigaction: 1
-rt_sigprocmask: 1
-rt_sigreturn: 1
-sendmsg: 1
-sendto: 1
-setgroups: 1
-setresgid: 1
-setresuid: 1
-set_robust_list: 1
-setsockopt: 1
-set_tid_address: 1
-shutdown: 1
-socket: arg0 == AF_UNIX || arg0 == AF_NETLINK
-timerfd_create: 1
-timerfd_settime: 1
-uname: 1
-unlinkat: 1
-write: 1
-getpid: 1
-prlimit64: arg2 == 0 && arg3 != 0
diff --git a/net-print/ippusbxd/files/keep-alive.patch b/net-print/ippusbxd/files/keep-alive.patch
deleted file mode 100644
index a36714a..0000000
--- a/net-print/ippusbxd/files/keep-alive.patch
+++ /dev/null
@@ -1,986 +0,0 @@
-From b7b50775a4a76e005aa497bdd749581818d9b89d Mon Sep 17 00:00:00 2001
-From: DavieV <davidvalleau@gmail.com>
-Date: Thu, 23 Jan 2020 13:52:42 -0800
-Subject: [PATCH] Adding support for 'keep-alive' protocol
-
-This change updates ippusbxd to support the use of 'keep-alive' messages
-on a dedicated socket.
----
- src/dnssd.c    |   6 +-
- src/ippusbxd.c | 238 ++++++++++++++++++++++++++++++++++++++-----------
- src/ippusbxd.h |  10 +++
- src/logging.h  |  13 +--
- src/options.c  |  32 ++++++-
- src/options.h  |  21 +++++
- src/tcp.c      |   4 +-
- src/uds.c      | 125 ++++++++++++++++++++++++--
- src/uds.h      |  14 ++-
- src/usb.c      |  54 +++++------
- src/usb.h      |   4 +
- 11 files changed, 419 insertions(+), 102 deletions(-)
-
-diff --git a/src/dnssd.c b/src/dnssd.c
-index 33e2149..a3fac02 100644
---- a/src/dnssd.c
-+++ b/src/dnssd.c
-@@ -41,7 +41,7 @@ dnssd_callback(AvahiEntryGroup      *g,		/* I - Service */
-   case AVAHI_ENTRY_GROUP_FAILURE :
-     ERR("Entry group failure: %s\n",
- 	avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))));
--    g_options.terminate = 1;
-+    set_terminate(1, &g_options);
-     break;
-   case AVAHI_ENTRY_GROUP_UNCOMMITED:
-   case AVAHI_ENTRY_GROUP_REGISTERING:
-@@ -137,12 +137,12 @@ dnssd_client_cb(AvahiClient      *c,		/* I - Client */
- 			    AVAHI_CLIENT_NO_FAIL,
- 			    dnssd_client_cb, NULL, &error)) == NULL) {
- 	ERR("Error: Unable to initialize DNS-SD client.");
--	g_options.terminate = 1;
-+	set_terminate(1, &g_options);
-       }
-     } else {
-       ERR("Avahi server connection failure: %s",
- 	  avahi_strerror(avahi_client_errno(c)));
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-     }
-     break;
- 
-diff --git a/src/ippusbxd.c b/src/ippusbxd.c
-index a270ee5..724c731 100644
---- a/src/ippusbxd.c
-+++ b/src/ippusbxd.c
-@@ -46,10 +46,12 @@ static struct timeval start_time;
- static void sigterm_handler(int sig)
- {
-   /* Flag that we should stop and return... */
--  g_options.terminate = 1;
-+  set_terminate(1, &g_options);
-   NOTE("Caught signal %d, shutting down ...", sig);
- }
- 
-+// NOTE: It is assumed that |thread_register_mutex| is locked before this
-+//       function is called.
- static void list_service_threads(
-     uint32_t num_service_threads,
-     struct service_thread_param **service_threads)
-@@ -82,6 +84,8 @@ static void list_service_threads(
-   NOTE("%s", buf);
- }
- 
-+// NOTE: It is assumed that |thread_register_mutex| is locked before this
-+//       function is called.
- static int register_service_thread(
-     uint32_t *num_service_threads,
-     struct service_thread_param ***service_threads,
-@@ -101,6 +105,8 @@ static int register_service_thread(
-   return 0;
- }
- 
-+// NOTE: It is assumed that |thread_register_mutex| is locked before this
-+//       function is called.
- static int unregister_service_thread(
-     uint32_t *num_service_threads,
-     struct service_thread_param ***service_threads, uint32_t thread_num)
-@@ -154,22 +160,28 @@ cleanup_handler(void *arg_void)
- 
- static void check_timeout(void)
- {
--  if (num_service_threads == 0 && !g_options.measuring_timeout) {
-+  uint32_t num_threads =
-+      get_num_service_threads(&num_service_threads, &thread_register_mutex);
-+  if (num_threads == 0 && !get_measuring_timeout(&g_options)) {
-     if (gettimeofday(&start_time, NULL) < 0) {
-       ERR("Failed to get time");
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-       return;
-     }
--    g_options.measuring_timeout = 1;
--  } else if (num_service_threads > 0) {
--    g_options.measuring_timeout = 0;
-+    set_measuring_timeout(1, &g_options);
-+  } else if (num_threads > 0) {
-+    set_measuring_timeout(0, &g_options);
-   }
- 
--  if (g_options.measuring_timeout) {
-+  // Lock |keep_alive_mutex| in order to prevent an 'ack' message from being
-+  // sent before determining whether or not to shutdown.
-+  pthread_mutex_lock(&g_options.keep_alive_mutex);
-+  if (get_measuring_timeout(&g_options)) {
-     struct timeval current_time;
-     if (gettimeofday(&current_time, NULL)) {
-       ERR("Failed to get time");
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-+      pthread_mutex_unlock(&g_options.keep_alive_mutex);
-       return;
-     }
- 
-@@ -178,9 +190,10 @@ static void check_timeout(void)
-     NOTE("Elapsed time: %lld seconds", (long long)seconds);
-     if (seconds > 10) {
-       NOTE("Timeout has been reached - shutting down");
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-     }
-   }
-+  pthread_mutex_unlock(&g_options.keep_alive_mutex);
- }
- 
- static void read_transfer_callback(struct libusb_transfer *transfer)
-@@ -215,7 +228,7 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-       break;
-     case LIBUSB_TRANSFER_ERROR:
-       ERR("Thread #%u: There was an error completing the transfer", thread_num);
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-       break;
-     case LIBUSB_TRANSFER_TIMED_OUT:
-       ERR("Thread #%u: The transfer timed out before it could be completed: "
-@@ -227,21 +240,21 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-       break;
-     case LIBUSB_TRANSFER_STALL:
-       ERR("Thread #%u: The transfer has stalled", thread_num);
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-       break;
-     case LIBUSB_TRANSFER_NO_DEVICE:
-       ERR("Thread #%u: The printer was disconnected during the transfer",
-           thread_num);
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-       break;
-     case LIBUSB_TRANSFER_OVERFLOW:
-       ERR("Thread #%u: The printer sent more data than was requested",
-           thread_num);
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-       break;
-     default:
-       ERR("Thread #%u: Something unexpected happened", thread_num);
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-   }
- 
-   /* Free the packet used for the transfer. */
-@@ -258,6 +271,15 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-   libusb_free_transfer(transfer);
- }
- 
-+uint32_t get_num_service_threads(const uint32_t *num_threads,
-+                                 pthread_mutex_t *thread_mutex) {
-+  uint32_t ret;
-+  pthread_mutex_lock(thread_mutex);
-+  ret = *num_threads;
-+  pthread_mutex_unlock(thread_mutex);
-+  return ret;
-+}
-+
- void *service_connection(void *params_void)
- {
-   struct service_thread_param *params =
-@@ -326,8 +348,8 @@ cleanup:
-   }
- 
-   NOTE("Thread #%u: closing, %s", thread_num,
--       g_options.terminate ? "shutdown requested"
--                           : "communication thread terminated");
-+       get_terminate(&g_options) ? "shutdown requested"
-+                                 : "communication thread terminated");
-   if (g_options.unix_socket_mode)
-     uds_conn_close(params->uds);
-   else
-@@ -346,9 +368,9 @@ void service_socket_connection(struct service_thread_param *params)
- 
-   struct http_packet_t *pkt = NULL;
- 
--  while (is_socket_open(params) && !g_options.terminate) {
-+  while (is_socket_open(params) && !get_terminate(&g_options)) {
-     if (g_options.unix_socket_mode) {
--      int poll_result = uds_poll_connection(params->uds->fd);
-+      int poll_result = uds_poll_connection(params->uds->fd, 1000);
-       if (poll_result < 0) {
-         ERR("Thread #%u: Failed to poll the uds socket");
-         params->uds->is_closed = 1;
-@@ -406,18 +428,20 @@ void *service_printer_connection(void *params_void)
- 
-   struct libusb_transfer *read_transfer = NULL;
- 
--  while (is_socket_open(params) && !g_options.terminate) {
-+  while (is_socket_open(params) && !get_terminate(&g_options)) {
-     /* If there is already a read from the printer underway, block until it has
-        completed. */
--    pthread_mutex_lock(&read_inflight_mutex);
--    while (is_socket_open(params) && read_inflight)
-+    while (is_socket_open(params) &&
-+           get_read_inflight(&read_inflight, &read_inflight_mutex)) {
-+      pthread_mutex_lock(&read_inflight_mutex);
-       pthread_cond_wait(params->cond, &read_inflight_mutex);
--    pthread_mutex_unlock(&read_inflight_mutex);
-+      pthread_mutex_unlock(&read_inflight_mutex);
-+    }
- 
-     /* After waking up due to a completed transfer, verify that the socket is
-        still open and that the termination flag has not been set before
-        attempting to start another transfer. */
--    if (!is_socket_open(params) || g_options.terminate)
-+    if (!is_socket_open(params) || get_terminate(&g_options))
-       break;
- 
-     /* If we received an empty response from the printer then wait for |backoff|
-@@ -484,15 +508,16 @@ void *service_printer_connection(void *params_void)
-       /* Wait until the cancellation has completed. */
-       NOTE("Thread #%u: Waiting until the transfer has been cancelled",
-            thread_num);
--      pthread_mutex_lock(&read_inflight_mutex);
--      while (read_inflight)
-+      while (get_read_inflight(&read_inflight, &read_inflight_mutex)) {
-+        pthread_mutex_lock(&read_inflight_mutex);
-         pthread_cond_wait(params->cond, &read_inflight_mutex);
--      pthread_mutex_unlock(&read_inflight_mutex);
-+        pthread_mutex_unlock(&read_inflight_mutex);
-+      }
-     } else if (cancel_status == LIBUSB_ERROR_NOT_FOUND) {
-       NOTE("Thread #%u: The transfer has already completed", thread_num);
-     } else {
-       NOTE("Thread #%u: Failed to cancel transfer");
--      g_options.terminate = 1;
-+      set_terminate(1, &g_options);
-     }
-   }
- 
-@@ -549,15 +574,15 @@ int setup_socket_connection(struct service_thread_param *param)
- {
-   if (g_options.unix_socket_mode) {
-     int poll_status = 0;
--    while (!g_options.terminate && poll_status == 0) {
-+    while (!get_terminate(&g_options) && poll_status == 0) {
-       check_timeout();
-       poll_status = uds_connect(g_options.uds_socket, param->uds);
-     }
--    if (g_options.terminate || poll_status < 0)
-+    if (get_terminate(&g_options) || poll_status < 0)
-       return -1;
-   } else {
-     param->tcp = tcp_conn_select(g_options.tcp_socket, g_options.tcp6_socket);
--    if (g_options.terminate || param->tcp == NULL)
-+    if (get_terminate(&g_options) || param->tcp == NULL)
-       return -1;
-   }
- 
-@@ -601,6 +626,73 @@ int setup_communication_thread(void *(*routine)(void *),
-   return 0;
- }
- 
-+int setup_keep_alive_thread(void *(*routine)(void *),
-+                            pthread_t *keep_alive_handle) {
-+  NOTE("Setting up keep-alive thread");
-+  int status = pthread_create(keep_alive_handle, NULL, routine, NULL);
-+  if (status) {
-+    ERR("Failed to create keep-alive thread, error %d", status);
-+    return -1;
-+  }
-+  return 0;
-+}
-+
-+void *run_keep_alive(void* param) {
-+  if (param != NULL) {
-+    ERR("run_keep_alive: Received unexpected parameter in run_keep_alive()");
-+    set_terminate(1, &g_options);
-+    pthread_exit(NULL);
-+  }
-+
-+  // Detach this thread so that the main thread does not need to join this
-+  // thread after termination for clean-up.
-+  pthread_detach(pthread_self());
-+
-+  // Allow immediate cancelling of this thread.
-+  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
-+
-+  while (!get_terminate(&g_options)) {
-+    int poll_status = poll_keep_alive(g_options.keep_alive_socket);
-+    if (poll_status < 0) {
-+      break;
-+    } else if (poll_status > 0) {
-+      // accept connection.
-+      int conn_fd = accept_keep_alive(g_options.keep_alive_socket);
-+      if (conn_fd < 0) {
-+        break;
-+      }
-+      // read "keep-alive" message.
-+      if (recv_keep_alive(conn_fd) < 0) {
-+        close(conn_fd);
-+        break;
-+      }
-+
-+      // Lock |keep_alive_mutex| in order to ensure that a timeout doesn't occur
-+      // while we are in the process of sending an 'ack' response.
-+      pthread_mutex_lock(&g_options.keep_alive_mutex);
-+      if (!get_terminate(&g_options)) {
-+        NOTE("Successfully received 'keep-alive'. Resetting countdown");
-+        set_measuring_timeout(0, &g_options);
-+        // send "ack" message.
-+        if (send_ack(conn_fd) < 0) {
-+          close(conn_fd);
-+          pthread_mutex_unlock(&g_options.keep_alive_mutex);
-+          break;
-+        }
-+      }
-+      pthread_mutex_unlock(&g_options.keep_alive_mutex);
-+
-+      NOTE("Shutting down connection on keep-alive socket");
-+      shutdown(conn_fd, SHUT_RDWR);
-+      close(conn_fd);
-+    }
-+  }
-+
-+  set_terminate(1, &g_options);
-+  pthread_exit(NULL);
-+}
-+
- struct libusb_callback_data *setup_libusb_callback_data(
-     struct http_packet_t *pkt, int *read_inflight, int *empty_response,
-     struct service_thread_param *thread_param,
-@@ -662,7 +754,8 @@ static void start_daemon()
-   struct usb_sock_t *usb_sock;
- 
-   /* Termination flag */
--  g_options.terminate = 0;
-+  pthread_mutex_init(&g_options.terminate_mutex, NULL);
-+  set_terminate(0, &g_options);
- 
-   usb_sock = usb_open();
-   if (usb_sock == NULL) goto cleanup_usb;
-@@ -697,6 +790,13 @@ static void start_daemon()
-          g_options.tcp6_socket ? "" : "not ");
-   }
- 
-+  if (g_options.use_keep_alive && g_options.keep_alive_path) {
-+    g_options.keep_alive_socket = uds_open(g_options.keep_alive_path);
-+    if (g_options.keep_alive_socket == NULL) {
-+      goto cleanup_connections;
-+    }
-+  }
-+
-   /* Lose connection to caller */
-   uint16_t pid;
-   if (!g_options.nofork_mode && (pid = fork()) > 0) {
-@@ -739,10 +839,26 @@ static void start_daemon()
-       goto cleanup_connections;
-   }
- 
-+  // Setup dedicated thread for keep-alive socket.
-+  pthread_mutex_init(&g_options.measuring_timeout_mutex, NULL);
-+  pthread_mutex_init(&g_options.keep_alive_mutex, NULL);
-+  pthread_t keep_alive_handle = 0;
-+  int keep_alive_status;
-+  if (g_options.use_keep_alive) {
-+    keep_alive_status =
-+        setup_keep_alive_thread(&run_keep_alive, &keep_alive_handle);
-+    if (keep_alive_status < 0) {
-+      ERR("Failed to launch keep-alive thread");
-+      goto cleanup_connections;
-+    }
-+    NOTE("Launched keep-alive socket at %d", keep_alive_handle);
-+  }
-+
-+  pthread_mutex_init(&thread_register_mutex, NULL);
-+
-   /* Main loop */
-   uint32_t i = 1;
--  pthread_mutex_init(&thread_register_mutex, NULL);
--  while (!g_options.terminate) {
-+  while (!get_terminate(&g_options)) {
-     struct service_thread_param *args = calloc(1, sizeof(*args));
-     if (args == NULL) {
-       ERR("Preparing thread #%u: Failed to alloc space for thread args", i);
-@@ -782,6 +898,16 @@ static void start_daemon()
-   }
- 
-  cleanup_connections:
-+  if (g_options.use_keep_alive && keep_alive_status == 0) {
-+    NOTE("Shutting down keep-alive observer thread");
-+    pthread_cancel(keep_alive_handle);
-+    pthread_join(keep_alive_handle, NULL);
-+  }
-+
-+  // Close keep-alive socket.
-+  if (g_options.keep_alive_socket != NULL)
-+    uds_close(g_options.keep_alive_socket);
-+
-   /* Stop DNS-SD advertising of the printer */
-   if (g_options.dnssd_data != NULL)
-     dnssd_shutdown();
-@@ -789,18 +915,23 @@ static void start_daemon()
-   /* Cancel communication threads which did not terminate by themselves when
-      stopping ippusbxd, so that no USB communication with the printer can
-      happen after the final reset */
--  while (num_service_threads) {
-+  uint32_t cur;
-+  while ((cur = get_num_service_threads(&num_service_threads,
-+                                        &thread_register_mutex))) {
-     NOTE("Thread #%u did not terminate, canceling it now ...",
- 	 service_threads[0]->thread_num);
--    i = num_service_threads;
-     pthread_cancel(service_threads[0]->thread_handle);
--    while (i == num_service_threads)
-+    while (cur == get_num_service_threads(&num_service_threads,
-+                                          &thread_register_mutex)) {
-       usleep(1000000);
-+    }
-   }
- 
-   /* Wait for USB unplug event observer thread to terminate */
--  NOTE("Shutting down usb observer thread");
--  pthread_join(g_options.usb_event_thread_handle, NULL);
-+  if (usb_sock != NULL && usb_sock->registered_callback) {
-+    NOTE("Shutting down usb observer thread");
-+    pthread_join(g_options.usb_event_thread_handle, NULL);
-+  }
- 
-   /* TCP clean-up */
-   if (g_options.tcp_socket!= NULL)
-@@ -808,14 +939,19 @@ static void start_daemon()
-   if (g_options.tcp6_socket!= NULL)
-     tcp_close(g_options.tcp6_socket);
- 
--  /* UDS clean-up */
--  if (g_options.uds_socket != NULL)
--    uds_close(g_options.uds_socket);
--
-  cleanup_usb:
-   /* USB clean-up and final reset of the printer */
-   if (usb_sock != NULL)
-     usb_close(usb_sock);
-+
-+  // NOTE: This must be performed last as ippusb_manager waits until the closure
-+  //       of this socket before attempting to launch another instance of
-+  //       ippusbxd.
-+  //
-+  // Close UDS socket.
-+  if (g_options.uds_socket != NULL)
-+    uds_close(g_options.uds_socket);
-+
-   return;
- }
- 
-@@ -850,6 +986,7 @@ int main(int argc, char *argv[])
-     {"only-port",    required_argument, 0,  'p' },
-     {"interface",    required_argument, 0,  'i' },
-     {"uds-path",     required_argument, 0,  'U' },
-+    {"keep-alive",   required_argument, 0,  'K' },
-     {"logging",      no_argument,       0,  'l' },
-     {"debug",        no_argument,       0,  'd' },
-     {"verbose",      no_argument,       0,  'q' },
-@@ -858,18 +995,13 @@ int main(int argc, char *argv[])
-     {"help",         no_argument,       0,  'h' },
-     {NULL,           0,                 0,  0   }
-   };
-+
-+  memset(&g_options, 0, sizeof(g_options));
-   g_options.log_destination = LOGGING_STDERR;
--  g_options.only_desired_port = 0;
-   g_options.desired_port = 60000;
-   g_options.interface = "lo";
--  g_options.serial_num = NULL;
--  g_options.vendor_id = 0;
--  g_options.product_id = 0;
--  g_options.bus = 0;
--  g_options.device = 0;
--  g_options.measuring_timeout = 0;
--
--  while ((c = getopt_long(argc, argv, "qnhdp:P:i:s:lv:m:B",
-+
-+  while ((c = getopt_long(argc, argv, "qnhdp:P:i:s:lv:m:BU:K:",
- 			  long_options, &option_index)) != -1) {
-     switch (c) {
-     case '?':
-@@ -949,6 +1081,10 @@ int main(int argc, char *argv[])
-       g_options.unix_socket_mode = 1;
-       g_options.unix_socket_path = strdup(optarg);
-       break;
-+    case 'K':
-+      g_options.keep_alive_path = strdup(optarg);
-+      g_options.use_keep_alive = 1;
-+      NOTE("Received keep alive socket at %s", g_options.keep_alive_path);
-     }
-   }
- 
-diff --git a/src/ippusbxd.h b/src/ippusbxd.h
-index 69461fe..f7854dd 100644
---- a/src/ippusbxd.h
-+++ b/src/ippusbxd.h
-@@ -48,6 +48,11 @@ const int maximum_backoff = 1000;
- 
- /* Function prototypes */
- 
-+/* Gets the value of |num_service_threads|. Uses |thread_mutex| in order to
-+   prevent concurrent access to |num_service_threads|. */
-+uint32_t get_num_service_threads(const uint32_t *num_threads,
-+                                 pthread_mutex_t *thread_mutex);
-+
- /* Handles connection requests and
-    is run in a separate thread. It detaches itself from the main thread and sets
-    up a USB connection with the printer. This function spawns a partner thread
-@@ -90,6 +95,11 @@ int setup_usb_connection(struct usb_sock_t *usb_sock,
- int setup_communication_thread(void *(*routine)(void *),
-                                struct service_thread_param *param);
- 
-+/* Attempts to register the keep-alive thread to run the given |routine|.
-+   Returns 0 if successful, and a non-zero value otherwise. */
-+int setup_keep_alive_thread(void *(*routine)(void *),
-+                            pthread_t *keep_alive_handle);
-+
- /* Creates a new libusb_callback_data struct with the given paramaters. */
- struct libusb_callback_data *setup_libusb_callback_data(
-     struct http_packet_t *pkt, int *read_inflight, int *empty_response,
-diff --git a/src/logging.h b/src/logging.h
-index d6a2db5..dff89a9 100644
---- a/src/logging.h
-+++ b/src/logging.h
-@@ -50,12 +50,13 @@ enum log_level {
- #define CONF_1(msg) BASE_LOG(LOGGING_CONFORMANCE, "<%d>Standard Conformance Failure: " msg "\n", TID())
- #define CONF_2(msg, ...) BASE_LOG(LOGGING_CONFORMANCE, "<%d>Standard Conformance Failure: " msg "\n", TID(), __VA_ARGS__)
- 
--#define ERR_AND_EXIT(...)                                                   \
--  do {                                                                      \
--    ERR(__VA_ARGS__);                                                       \
--    if (g_options.dnssd_data != NULL) dnssd_shutdown(g_options.dnssd_data); \
--    if (g_options.uds_socket != NULL) uds_close(g_options.uds_socket);      \
--    exit(-1);                                                               \
-+#define ERR_AND_EXIT(...)                                                     \
-+  do {                                                                        \
-+    ERR(__VA_ARGS__);                                                         \
-+    if (g_options.dnssd_data != NULL) dnssd_shutdown(g_options.dnssd_data);   \
-+    if (g_options.keep_alive != NULL) uds_close(g_options.keep_alive_socket); \
-+    if (g_options.uds_socket != NULL) uds_close(g_options.uds_socket);        \
-+    exit(-1);                                                                 \
-   } while (0)
- 
- void BASE_LOG(enum log_level, const char *, ...);
-diff --git a/src/options.c b/src/options.c
-index 464645d..cc3424d 100644
---- a/src/options.c
-+++ b/src/options.c
-@@ -14,5 +14,35 @@
- 
- #include "options.h"
- 
--struct options g_options;
-+#include <pthread.h>
-+#include <string.h>
-+
-+void set_measuring_timeout(int val, struct options* option) {
-+  pthread_mutex_lock(&option->measuring_timeout_mutex);
-+  option->measuring_timeout = val;
-+  pthread_mutex_unlock(&option->measuring_timeout_mutex);
-+}
-+
-+int get_measuring_timeout(struct options* option) {
-+  int ret;
-+  pthread_mutex_lock(&option->measuring_timeout_mutex);
-+  ret = option->measuring_timeout;
-+  pthread_mutex_unlock(&option->measuring_timeout_mutex);
-+  return ret;
-+}
- 
-+void set_terminate(int val, struct options* option) {
-+  pthread_mutex_lock(&option->terminate_mutex);
-+  option->terminate = val;
-+  pthread_mutex_unlock(&option->terminate_mutex);
-+}
-+
-+int get_terminate(struct options* option) {
-+  int ret;
-+  pthread_mutex_lock(&option->terminate_mutex);
-+  ret = option->terminate;
-+  pthread_mutex_unlock(&option->terminate_mutex);
-+  return ret;
-+}
-+
-+struct options g_options;
-diff --git a/src/options.h b/src/options.h
-index dc93bcf..552e10c 100644
---- a/src/options.h
-+++ b/src/options.h
-@@ -30,6 +30,7 @@ struct options {
-   uint16_t real_port;
-   char *interface;
-   char *unix_socket_path;
-+  char *keep_alive_path;
-   enum log_target log_destination;
- 
-   /* Behavior */
-@@ -38,6 +39,7 @@ struct options {
-   int nofork_mode;
-   int nobroadcast;
-   int unix_socket_mode;
-+  int use_keep_alive;
- 
-   /* Printer identity */
-   unsigned char *serial_num;
-@@ -59,6 +61,25 @@ struct options {
-   int scanner_present;
- 
-   struct uds_sock_t *uds_socket;
-+  struct uds_sock_t *keep_alive_socket;
-+
-+  pthread_mutex_t terminate_mutex;
-+
-+  // Locks access to the |measuring_timeout| flag.
-+  pthread_mutex_t measuring_timeout_mutex;
-+
-+  // Used to lock critical sections of the 'keep-alive' process.
-+  pthread_mutex_t keep_alive_mutex;
- };
- 
-+// Accessor functions for the |measuring_timeout| flag which use a mutex to
-+// prevent concurrent access.
-+void set_measuring_timeout(int val, struct options *option);
-+int get_measuring_timeout(struct options *option);
-+
-+// Accessor functions for the |terminate| flag which use a mutex to prevent
-+// concurrent access.
-+void set_terminate(int val, struct options *option);
-+int get_terminate(struct options *option);
-+
- extern struct options g_options;
-diff --git a/src/tcp.c b/src/tcp.c
-index 92a128c..5ed7931 100644
---- a/src/tcp.c
-+++ b/src/tcp.c
-@@ -266,7 +266,7 @@ int tcp_packet_send(struct tcp_conn_t *conn, struct http_packet_t *pkt)
-   size_t remaining = pkt->filled_size;
-   size_t total = 0;
- 
--  while (remaining > 0 && !g_options.terminate) {
-+  while (remaining > 0 && !get_terminate(&g_options)) {
-     ssize_t sent = send(conn->sd, pkt->buffer + total, remaining, MSG_NOSIGNAL);
- 
-     if (sent < 0) {
-@@ -319,7 +319,7 @@ struct tcp_conn_t *tcp_conn_select(struct tcp_sock_t *sock,
-   }
-   nfds += 1;
-   retval = select(nfds, &rfds, NULL, NULL, NULL);
--  if (g_options.terminate)
-+  if (get_terminate(&g_options))
-     goto error;
-   if (retval < 1) {
-     ERR("Failed to open tcp connection");
-diff --git a/src/uds.c b/src/uds.c
-index de349db..6b4498e 100644
---- a/src/uds.c
-+++ b/src/uds.c
-@@ -18,6 +18,11 @@
- 
- struct uds_sock_t *uds_open(const char *path)
- {
-+  if (path == NULL) {
-+    ERR("UDS: Given socket path is null");
-+    goto error;
-+  }
-+
-   struct uds_sock_t *sock = calloc(1, sizeof(*sock));
-   if (sock == NULL) {
-     ERR("UDS: Allocating memory for socket failed");
-@@ -91,9 +96,9 @@ int uds_connect(struct uds_sock_t *sock, struct uds_conn_t *conn)
-     return -1;
-   }
- 
--  int poll_result = uds_poll_connection(sock->fd);
-+  int poll_result = uds_poll_connection(sock->fd, 1000);
- 
--  if (g_options.terminate)
-+  if (get_terminate(&g_options))
-     return -1;
- 
-   if (poll_result < 0) {
-@@ -165,7 +170,7 @@ int uds_packet_send(struct uds_conn_t *conn, struct http_packet_t *pkt)
-   size_t remaining = pkt->filled_size;
-   size_t total = 0;
- 
--  while (remaining > 0 && !g_options.terminate) {
-+  while (remaining > 0 && !get_terminate(&g_options)) {
-     ssize_t sent = send(conn->fd, pkt->buffer + total, remaining, MSG_NOSIGNAL);
- 
-     if (sent < 0) {
-@@ -190,11 +195,119 @@ int uds_packet_send(struct uds_conn_t *conn, struct http_packet_t *pkt)
-   return 0;
- }
- 
--// Polls the UDS connection in |conn| to see if there is any data to be read.
--int uds_poll_connection(int fd) {
-+// Polls the UDS connection at |fd| for a maximum of |timeout| milliseconds to
-+// see if there is any data to be read.
-+int uds_poll_connection(int fd, int timeout) {
-   struct pollfd poll_fd;
-   poll_fd.fd = fd;
-   poll_fd.events = POLLIN;
--  static int timeout = 1000;
-   return poll(&poll_fd, 1, timeout);
- }
-+
-+int poll_keep_alive(struct uds_sock_t *sock) {
-+  if (sock == NULL) {
-+    ERR("UDS: No valid keep-alive socket provided");
-+    return -1;
-+  }
-+
-+  int poll_result = uds_poll_connection(sock->fd, 100);
-+
-+  if (get_terminate(&g_options))
-+    return -1;
-+
-+  if (poll_result < 0) {
-+    ERR("Something went wrong when polling the keep-alive socket");
-+    return -1;
-+  }
-+
-+  // There is no data to be read on the socket.
-+  if (poll_result == 0) {
-+    return 0;
-+  }
-+
-+  NOTE("Found a pending message on the keep-alive socket");
-+  return poll_result;
-+}
-+
-+int accept_keep_alive(struct uds_sock_t *sock) {
-+  if (get_terminate(&g_options)) {
-+    ERR("Termination has been requested");
-+    return -1;
-+  }
-+
-+  int conn_fd = accept(sock->fd, NULL, NULL);
-+  if (conn_fd < 0) {
-+    ERR("Failed to accept connection on keep-alive socket");
-+  } else {
-+    NOTE("Accepted the connection on the keep-alive socket");
-+  }
-+  return conn_fd;
-+}
-+
-+int recv_keep_alive(int conn_fd) {
-+  if (get_terminate(&g_options)) {
-+    ERR("Termination has been requested");
-+    return -1;
-+  }
-+
-+  uint8_t length = 0;
-+  if (recv(conn_fd, &length, 1, 0) == -1) {
-+    ERR("Failed to read length of message");
-+    return -1;
-+  }
-+  // We only ever expect to receive the 'keep-alive' message on the
-+  // socket (which includes the trailing '\0' character).
-+  if (length != 11) {
-+    ERR("Received unexpected message length %d", length);
-+    return -1;
-+  }
-+
-+  char buf[11] = {0};
-+  size_t bytes_received = 0;
-+  while (bytes_received < length) {
-+    ssize_t bytes_read =
-+        recv(conn_fd, buf + bytes_received, length - bytes_received, 0);
-+    if (bytes_read < 0) {
-+      ERR("Failed to read from keep-alive socket");
-+      return -1;
-+    }
-+    bytes_received += (size_t)bytes_read;
-+  }
-+
-+  if (strncmp(buf, "keep-alive", 11) != 0) {
-+    ERR("Received unexpected message '%s' on keep-alive socket", buf);
-+    return -1;
-+  }
-+
-+  NOTE("Received 'keep-alive' message on keep-alive socket");
-+  return 0;
-+}
-+
-+int send_ack(int conn_fd) {
-+  if (get_terminate(&g_options)) {
-+    ERR("Termination has been requested");
-+    return -1;
-+  }
-+
-+  uint8_t length = 4;
-+  if (send(conn_fd, &length, 1, 0) == -1) {
-+    ERR("Failed to send length prefix byte");
-+    return -1;
-+  }
-+
-+  const char *ack = "ack";
-+  size_t bytes_sent = 0;
-+  size_t bytes_remaining = 4;
-+  while (bytes_remaining > 0) {
-+    ssize_t sent = send(conn_fd, ack + bytes_sent, bytes_remaining, 0);
-+    if (sent < 0) {
-+      ERR("Failed to send 'ack' on keep-alive socket");
-+      return -1;
-+    }
-+    bytes_sent += (size_t)sent;
-+    bytes_remaining -= (size_t)sent;
-+  }
-+
-+  NOTE("Sent 'ack' response on keep-alive socket");
-+  return 0;
-+}
-diff --git a/src/uds.h b/src/uds.h
-index 67c13f9..1a39b08 100644
---- a/src/uds.h
-+++ b/src/uds.h
-@@ -43,9 +43,17 @@ struct http_packet_t *uds_packet_get(struct uds_conn_t *conn);
- 
- int uds_packet_send(struct uds_conn_t *conn, struct http_packet_t *pkt);
- 
--// Polls the given file descriptor |fd| to see if there is any data to be read.
--// Return values:
-+// Polls the given file descriptor |fd| up to |timeout| milliseconds to see if
-+// there is any data to be read. Return values:
- //   1 - there is data to be read.
- //   0 - there is not any data to be read.
- //  -1 - there was an error.
--int uds_poll_connection(int fd);
-+int uds_poll_connection(int fd, int timeout);
-+
-+int poll_keep_alive(struct uds_sock_t *sock);
-+
-+int accept_keep_alive(struct uds_sock_t *sock);
-+
-+int recv_keep_alive(int conn_fd);
-+
-+int send_ack(int conn_fd);
-diff --git a/src/usb.c b/src/usb.c
-index 21c84d4..aa05960 100644
---- a/src/usb.c
-+++ b/src/usb.c
-@@ -244,7 +244,7 @@ static int try_claim_usb_interface(struct usb_sock_t *usb,
-       default:
-         break;
-     }
--  } while (status != 0 && !g_options.terminate);
-+  } while (status != 0 && !get_terminate(&g_options));
- 
-   return 0;
- }
-@@ -530,9 +530,6 @@ void usb_close(struct usb_sock_t *usb)
-     sem_destroy(&usb->interfaces[i].lock);
-   }
- 
--  NOTE("Resetting printer ...");
--  libusb_reset_device(usb->printer);
--  NOTE("Reset completed.");
-   NOTE("Closing device handle...");
-   libusb_close(usb->printer);
-   NOTE("Closed device handle.");
-@@ -600,6 +597,8 @@ static int LIBUSB_CALL usb_exit_on_unplug(libusb_context *context,
-       tcp_close(g_options.tcp6_socket);
- 
-     /* UDS clean-up */
-+    if (g_options.keep_alive_socket != NULL)
-+      uds_close(g_options.keep_alive_socket);
-     if (g_options.uds_socket != NULL)
-       uds_close(g_options.uds_socket);
- 
-@@ -615,7 +614,7 @@ static void *usb_pump_events(void *user_data)
- 
-   NOTE("USB unplug event observer thread starting");
- 
--  while (!g_options.terminate) {
-+  while (!get_terminate(&g_options)) {
-     /* NOTE: This is a blocking call so
-        no need for sleep() */
-     struct timeval tv;
-@@ -629,32 +628,27 @@ static void *usb_pump_events(void *user_data)
-   return NULL;
- }
- 
--void usb_register_callback(struct usb_sock_t *usb)
--{
--  IGNORE(usb);
--
--  int status =
--    libusb_hotplug_register_callback(NULL,
--				     LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
--				     /* Note: libusb's enum has no default value
--					a bug has been filled with libusb.
--					Please switch the below line to 0
--					once the issue has been fixed in
--					deployed versions of libusb
--					https://github.com/libusb/libusb/issues/35 */
--				     /* 0, */
--				     LIBUSB_HOTPLUG_ENUMERATE,
--				     g_options.vendor_id,
--				     g_options.product_id,
--				     LIBUSB_HOTPLUG_MATCH_ANY,
--				     &usb_exit_on_unplug,
--				     NULL,
--				     NULL);
-+void usb_register_callback(struct usb_sock_t *usb) {
-+  int status = libusb_hotplug_register_callback(
-+      NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
-+      /* Note: libusb's enum has no default value
-+         a bug has been filled with libusb.
-+         Please switch the below line to 0
-+         once the issue has been fixed in
-+         deployed versions of libusb
-+         https://github.com/libusb/libusb/issues/35 */
-+      /* 0, */
-+      LIBUSB_HOTPLUG_ENUMERATE, g_options.vendor_id, g_options.product_id,
-+      LIBUSB_HOTPLUG_MATCH_ANY, &usb_exit_on_unplug, NULL, NULL);
-   if (status == LIBUSB_SUCCESS) {
--    pthread_create(&(g_options.usb_event_thread_handle), NULL, &usb_pump_events, NULL);
-+    pthread_create(&(g_options.usb_event_thread_handle), NULL, &usb_pump_events,
-+                   NULL);
-+    usb->registered_callback = 1;
-     NOTE("Registered unplug callback");
--  } else
-+  } else {
-     ERR("Failed to register unplug callback");
-+    usb->registered_callback = 0;
-+  }
- }
- 
- struct usb_conn_t *usb_conn_acquire(struct usb_sock_t *usb)
-@@ -664,7 +658,7 @@ struct usb_conn_t *usb_conn_acquire(struct usb_sock_t *usb)
-   if (usb->num_avail <= 0) {
-     NOTE("All USB interfaces busy, waiting ...");
-     for (i = 0; i < 30 && usb->num_avail <= 0; i ++) {
--      if (g_options.terminate)
-+      if (get_terminate(&g_options))
- 	return NULL;
-       usleep(100000);
-     }
-@@ -737,7 +731,7 @@ int usb_conn_packet_send(struct usb_conn_t *conn, struct http_packet_t *pkt)
-   int num_timeouts = 0;
-   size_t sent = 0;
-   size_t pending = pkt->filled_size;
--  while (pending > 0 && !g_options.terminate) {
-+  while (pending > 0 && !get_terminate(&g_options)) {
-     int to_send = (int)pending;
- 
-     NOTE("P %p: USB: want to send %d bytes", pkt, to_send);
-diff --git a/src/usb.h b/src/usb.h
-index 3aa939c..5b9ae68 100644
---- a/src/usb.h
-+++ b/src/usb.h
-@@ -37,6 +37,10 @@ struct usb_sock_t {
-   char *device_id;
-   int max_packet_size;
- 
-+  // Represents whether the unplug callback was successfully registered for this
-+  // USB device.
-+  int registered_callback;
-+
-   uint32_t num_interfaces;
-   struct usb_interface *interfaces;
- 
--- 
-2.25.0.265.gbab2e86ba0-goog
-
diff --git a/net-print/ippusbxd/files/larger-buffer.patch b/net-print/ippusbxd/files/larger-buffer.patch
deleted file mode 100644
index 8c7c7c4..0000000
--- a/net-print/ippusbxd/files/larger-buffer.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/http.c b/src/http.c
-index bdfe46b..27e6e54 100644
---- a/src/http.c
-+++ b/src/http.c
-@@ -25,7 +25,7 @@
- #include "http.h"
- #include "logging.h"
- 
--#define BUFFER_STEP (1 << 12)
-+#define BUFFER_STEP (1 << 15)
- 
- struct http_packet_t *packet_new()
- {
diff --git a/net-print/ippusbxd/files/log-usb-acquire-error.patch b/net-print/ippusbxd/files/log-usb-acquire-error.patch
deleted file mode 100644
index 1163b5c..0000000
--- a/net-print/ippusbxd/files/log-usb-acquire-error.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-commit fd034a7aaa0f76cbaf65c8933f05e53f0e6e4f2c
-Author: Fletcher Woodruff <fletcherw@chromium.org>
-Date:   Tue Jun 16 13:59:10 2020 -0600
-
-    Log errno when acquiring usb connection fails
-
-diff --git a/src/usb.c b/src/usb.c
-index aa05960..905b90b 100644
---- a/src/usb.c
-+++ b/src/usb.c
-@@ -19,6 +19,7 @@
- #include <time.h>
- #include <string.h>
- #include <unistd.h>
-+#include <errno.h>
- 
- #include <libusb.h>
- 
-@@ -686,9 +687,17 @@ struct usb_conn_t *usb_conn_acquire(struct usb_sock_t *usb)
- 
-     /* Sanity check: Is the interface still free */
-     if (sem_trywait(&uf->lock)) {
--      ERR("Interface #%d (%d) already in use!",
--	  conn->interface_index,
--	  uf->libusb_interface_index);
-+      int error = errno;
-+      if (error == EAGAIN) {
-+	ERR("Interface #%d (%d) already in use!",
-+	    conn->interface_index,
-+	    uf->libusb_interface_index);
-+      } else {
-+	ERR("sem_trywait on interface #%d (%d) failed with error %d",
-+	    conn->interface_index,
-+	    uf->libusb_interface_index,
-+	    error);
-+      }
-       goto acquire_error;
-     }
- 
diff --git a/net-print/ippusbxd/files/read-transfer-backoff.patch b/net-print/ippusbxd/files/read-transfer-backoff.patch
deleted file mode 100644
index b534b9e..0000000
--- a/net-print/ippusbxd/files/read-transfer-backoff.patch
+++ /dev/null
@@ -1,148 +0,0 @@
-From 231bda3642ea8c3128eba1da899eb93e22256d1f Mon Sep 17 00:00:00 2001
-From: DavieV <davidvalleau@gmail.com>
-Date: Tue, 6 Aug 2019 11:09:38 -0700
-Subject: [PATCH] Adding exponential backoff for empty read responses
-
----
- src/ippusbxd.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++---
- 1 file changed, 53 insertions(+), 3 deletions(-)
-
-diff --git a/src/ippusbxd.c b/src/ippusbxd.c
-index 3ef91ad..5fd7c11 100644
---- a/src/ippusbxd.c
-+++ b/src/ippusbxd.c
-@@ -47,6 +47,12 @@ struct service_thread_param {
- 
- struct libusb_callback_data {
-   int *read_inflight;
-+  /*
-+   * Indicates that the previous read response was empty. This is used to
-+   * perform exponential backoff in service_printer_connection() to avoid
-+   * overloading the printer with read requests when there is nothing to read.
-+   */
-+  int *empty_response;
-   uint32_t thread_num;
-   struct tcp_conn_t *tcp;
-   struct uds_conn_t *uds;
-@@ -76,12 +82,14 @@ static int get_read_inflight(const int *read_inflight,
-                              pthread_mutex_t *read_inflight_mutex);
- 
- static struct libusb_callback_data *setup_libusb_callback_data(
--    struct http_packet_t *pkt, int *read_inflight,
-+    struct http_packet_t *pkt, int *read_inflight, int *empty_response,
-     struct service_thread_param *thread_param,
-     pthread_mutex_t *read_inflight_mutex);
- 
- static int is_socket_open(const struct service_thread_param *param);
- 
-+static int update_backoff(int backoff);
-+
- /* Global variables */
- static pthread_mutex_t thread_register_mutex;
- static struct service_thread_param **service_threads = NULL;
-@@ -89,6 +97,13 @@ static uint32_t num_service_threads = 0;
- 
- static struct timeval start_time;
- 
-+/* Constants */
-+
-+/* Times to wait in milliseconds before sending another read request to the
-+   printer. */
-+const int initial_backoff = 100;
-+const int maximum_backoff = 1000;
-+
- static void sigterm_handler(int sig)
- {
-   /* Flag that we should stop and return... */
-@@ -247,6 +262,9 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-           /* Mark the tcp socket as active. */
-           set_is_active(user_data->tcp, 1);
-         }
-+      } else {
-+        /* Set that we received an empty response from the printer. */
-+        *user_data->empty_response = 1;
-       }
- 
-       break;
-@@ -453,7 +471,13 @@ static void *service_printer_connection(void *params_void)
-   /* Register clean-up handler. */
-   pthread_cleanup_push(cleanup_handler, &thread_num);
- 
-+  /* Amount of time to wait in milliseconds before sending another read request
-+     if we received a 0-byte response from the printer. */
-+  int backoff = initial_backoff;
-+
-   int read_inflight = 0;
-+  int empty_response = 0;
-+
-   pthread_mutex_t read_inflight_mutex;
-   if (pthread_mutex_init(&read_inflight_mutex, NULL))
-     goto cleanup;
-@@ -474,6 +498,22 @@ static void *service_printer_connection(void *params_void)
-     if (!is_socket_open(params) || g_options.terminate)
-       break;
- 
-+    /* If we received an empty response from the printer then wait for |backoff|
-+       milliseconds and update the backoff period. */
-+    if (empty_response) {
-+      /* usleep accepts microseconds. */
-+      usleep(backoff * 1000);
-+      backoff = update_backoff(backoff);
-+      /* Reset the empty response indicator before sending the next read
-+         request. A mutex should not be needed here since the transfer callback
-+         won't be fired until after calling libusb_submit_transfer(). */
-+      empty_response = 0;
-+    } else {
-+      /* If we received a non-empty response from the printer then reset the
-+         backoff to 100ms. */
-+      backoff = initial_backoff;
-+    }
-+
-     NOTE("Thread #%u: No read in flight, starting a new one", thread_num);
-     struct http_packet_t *pkt = packet_new();
-     if (pkt == NULL) {
-@@ -482,7 +522,7 @@ static void *service_printer_connection(void *params_void)
-     }
- 
-     struct libusb_callback_data *user_data = setup_libusb_callback_data(
--        pkt, &read_inflight, params, &read_inflight_mutex);
-+        pkt, &read_inflight, &empty_response, params, &read_inflight_mutex);
- 
-     if (user_data == NULL) {
-       ERR("Thread #%u: Failed to allocate memory for libusb_callback_data",
-@@ -654,7 +694,7 @@ static int setup_communication_thread(void *(*routine)(void *),
- }
- 
- static struct libusb_callback_data *setup_libusb_callback_data(
--    struct http_packet_t *pkt, int *read_inflight,
-+    struct http_packet_t *pkt, int *read_inflight, int *empty_response,
-     struct service_thread_param *thread_param,
-     pthread_mutex_t *read_inflight_mutex) {
-   struct libusb_callback_data *data = calloc(1, sizeof(*data));
-@@ -663,6 +703,7 @@ static struct libusb_callback_data *setup_libusb_callback_data(
- 
-   data->pkt = pkt;
-   data->read_inflight = read_inflight;
-+  data->empty_response = empty_response;
-   data->thread_num = thread_param->thread_num;
-   data->read_inflight_mutex = read_inflight_mutex;
-   data->read_inflight_cond = thread_param->cond;
-@@ -675,6 +716,15 @@ static struct libusb_callback_data *setup_libusb_callback_data(
-   return data;
- }
- 
-+static int update_backoff(int backoff) {
-+  int updated = backoff * 2;
-+  /* Cap the maximum backoff time at 1 second. */
-+  if (updated > maximum_backoff) {
-+    updated = maximum_backoff;
-+  }
-+  return updated;
-+}
-+
- static int is_socket_open(const struct service_thread_param *param) {
-   if (g_options.unix_socket_mode)
-     return !param->uds->is_closed;
--- 
-2.22.0.770.g0f2c4a37fd-goog
-
diff --git a/net-print/ippusbxd/files/unix-socket.patch b/net-print/ippusbxd/files/unix-socket.patch
deleted file mode 100644
index 0617d2c..0000000
--- a/net-print/ippusbxd/files/unix-socket.patch
+++ /dev/null
@@ -1,777 +0,0 @@
-From: DavieV <davidvalleau@gmail.com>
-Date: Fri, 20 Oct 2017 11:33:18 -0700
-Subject: [PATCH] Adding support for unix domain sockets to the ippusbxd daemon
-
-Adds support for unix sockets to the ippusbxd program. Ippusbxd is used for
-ipp-over-usb printing, but the upstream version only supports network sockets.
-Support for unix domain sockets has been added so that ipp-over-usb printing
-on Chrome OS will be more secure by settings the correct file permissions on
-the sockets used for communication during printing.
-
-Since this change required some Chrome OS specific changes in order for it to
-work properly, the author has decided that they would rather not upstream any
-of these changes.
----
-
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index e6809b5..b59f3da 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -37,6 +37,7 @@ usb.c
- logging.c
- options.c
- dnssd.c
-+uds.c
- )
- target_link_libraries(ippusbxd ${CMAKE_THREAD_LIBS_INIT})
- target_link_libraries(ippusbxd ${LIBUSB_LIBRARIES})
-diff --git a/src/ippusbxd.c b/src/ippusbxd.c
-index 413be5c..6aac59e 100644
---- a/src/ippusbxd.c
-+++ b/src/ippusbxd.c
-@@ -25,6 +25,7 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#include <sys/time.h>
- #include <unistd.h>
- 
- #include "dnssd.h"
-@@ -32,6 +33,7 @@
- #include "logging.h"
- #include "options.h"
- #include "tcp.h"
-+#include "uds.h"
- #include "usb.h"
- 
- /* Global variables */
-@@ -39,6 +41,8 @@ static pthread_mutex_t thread_register_mutex;
- static struct service_thread_param **service_threads = NULL;
- static uint32_t num_service_threads = 0;
- 
-+static struct timeval start_time;
-+
- static void sigterm_handler(int sig)
- {
-   /* Flag that we should stop and return... */
-@@ -148,6 +152,37 @@ cleanup_handler(void *arg_void)
-   pthread_mutex_unlock(&thread_register_mutex);
- }
- 
-+static void check_timeout(void)
-+{
-+  if (num_service_threads == 0 && !g_options.measuring_timeout) {
-+    if (gettimeofday(&start_time, NULL) < 0) {
-+      ERR("Failed to get time");
-+      g_options.terminate = 1;
-+      return;
-+    }
-+    g_options.measuring_timeout = 1;
-+  } else if (num_service_threads > 0) {
-+    g_options.measuring_timeout = 0;
-+  }
-+
-+  if (g_options.measuring_timeout) {
-+    struct timeval current_time;
-+    if (gettimeofday(&current_time, NULL)) {
-+      ERR("Failed to get time");
-+      g_options.terminate = 1;
-+      return;
-+    }
-+
-+    time_t seconds = current_time.tv_sec - start_time.tv_sec;
-+
-+    NOTE("Elapsed time: %lld seconds", (long long)seconds);
-+    if (seconds > 10) {
-+      NOTE("Timeout has been reached - shutting down");
-+      g_options.terminate = 1;
-+    }
-+  }
-+}
-+
- static void read_transfer_callback(struct libusb_transfer *transfer)
- {
-   struct libusb_callback_data *user_data =
-@@ -165,9 +200,13 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-         NOTE("Thread #%u: Pkt from %s (buffer size: %zu)\n===\n%s===",
-              thread_num, "usb", user_data->pkt->filled_size,
-              hexdump(user_data->pkt->buffer, (int)user_data->pkt->filled_size));
--        tcp_packet_send(user_data->tcp, user_data->pkt);
--        /* Mark the tcp socket as active. */
--        set_is_active(user_data->tcp, 1);
-+        if (g_options.unix_socket_mode) {
-+          uds_packet_send(user_data->uds, user_data->pkt);
-+        } else {
-+          tcp_packet_send(user_data->tcp, user_data->pkt);
-+          /* Mark the tcp socket as active. */
-+          set_is_active(user_data->tcp, 1);
-+        }
-       } else {
-         /* Set that we received an empty response from the printer. */
-         *user_data->empty_response = 1;
-@@ -179,8 +218,7 @@ static void read_transfer_callback(struct libusb_transfer *transfer)
-       g_options.terminate = 1;
-       break;
-     case LIBUSB_TRANSFER_TIMED_OUT:
--      NOTE(
--          "Thread #%u: The transfer timed out before it could be completed: "
-+      ERR("Thread #%u: The transfer timed out before it could be completed: "
-           "Received %u bytes",
-           thread_num, transfer->actual_length);
-       break;
-@@ -226,6 +264,8 @@ void *service_connection(void *params_void)
-       (struct service_thread_param *)params_void;
-   uint32_t thread_num = params->thread_num;
- 
-+  NOTE("Thread #%u: Setting up both ends for communication", thread_num);
-+
-   /* Detach this thread so that the main thread does not need to join this
-      thread after termination for clean-up. */
-   pthread_detach(pthread_self());
-@@ -255,6 +295,8 @@ void *service_connection(void *params_void)
-   printer_params->thread_num += 1;
- 
-   /* Attempt to start the printer's end of the communication. */
-+  NOTE("Thread #%u: Attempting to register thread %u", thread_num,
-+       thread_num + 1);
-   if (setup_communication_thread(&service_printer_connection, printer_params))
-     goto cleanup;
- 
-@@ -286,7 +328,10 @@ cleanup:
-   NOTE("Thread #%u: closing, %s", thread_num,
-        g_options.terminate ? "shutdown requested"
-                            : "communication thread terminated");
--  tcp_conn_close(params->tcp);
-+  if (g_options.unix_socket_mode)
-+    uds_conn_close(params->uds);
-+  else
-+    tcp_conn_close(params->tcp);
- 
-   /* Execute clean-up handler. */
-   pthread_cleanup_pop(1);
-@@ -297,29 +342,46 @@ void service_socket_connection(struct service_thread_param *params)
- {
-   uint32_t thread_num = params->thread_num;
- 
-+  NOTE("Thread #%u: Starting on socket end", thread_num);
-+
-+  struct http_packet_t *pkt = NULL;
-+
-   while (is_socket_open(params) && !g_options.terminate) {
--    int result = poll_tcp_socket(params->tcp);
--    if (result < 0 || !is_socket_open(params)) {
--      NOTE("Thread #%u: Client closed connection", thread_num);
--      return;
--    } else if (result == 0) {
--      continue;
--    }
-+    if (g_options.unix_socket_mode) {
-+      int poll_result = uds_poll_connection(params->uds->fd);
-+      if (poll_result < 0) {
-+        ERR("Thread #%u: Failed to poll the uds socket");
-+        params->uds->is_closed = 1;
-+      } else if (poll_result == 0) {
-+        continue;
-+      }
-+      // Only attempt to read a packet if the poll result indicates that there
-+      // is data to be read.
-+      pkt = uds_packet_get(params->uds);
-+    } else {
-+      int poll_result = poll_tcp_socket(params->tcp);
-+      if (poll_result < 0 || !is_socket_open(params)) {
-+        NOTE("Thread #%u: Client closed connection", thread_num);
-+        return;
-+      } else if (poll_result == 0) {
-+        continue;
-+      }
- 
--    struct http_packet_t *pkt = tcp_packet_get(params->tcp);
--    if (pkt == NULL) {
--      NOTE("Thread #%u: There was an error reading from the socket",
--           thread_num);
--      return;
-+      pkt = tcp_packet_get(params->tcp);
-     }
- 
--    if (!is_socket_open(params)) {
--      NOTE("Thread #%u: Client closed connection", thread_num);
-+    if (pkt == NULL) {
-+      if (!is_socket_open(params))
-+        NOTE("Thread: #%u: Client closed connection", thread_num);
-+      else
-+        NOTE("Thread: #%u: There was an error reading from the socket",
-+             thread_num);
-       return;
-     }
- 
--    NOTE("Thread #%u: Pkt from tcp (buffer size: %zu)\n===\n%s===", thread_num,
--         pkt->filled_size, hexdump(pkt->buffer, (int)pkt->filled_size));
-+    NOTE("Thread #%u: Pkt from %s (buffer size: %zu)\n===\n%s===", thread_num,
-+         g_options.unix_socket_mode ? "uds" : "tcp", pkt->filled_size,
-+         hexdump(pkt->buffer, (int)pkt->filled_size));
- 
-     /* Send pkt to printer. */
-     usb_conn_packet_send(params->usb_conn, pkt);
-@@ -334,6 +396,8 @@ void *service_printer_connection(void *params_void)
-       (struct service_thread_param *)params_void;
-   uint32_t thread_num = params->thread_num;
- 
-+  NOTE("Thread #%u: Starting on printer end", thread_num);
-+
-   /* Register clean-up handler. */
-   pthread_cleanup_push(cleanup_handler, &thread_num);
- 
-@@ -475,9 +539,12 @@ static uint16_t open_tcp_socket(void)
- 
- int allocate_socket_connection(struct service_thread_param *param)
- {
--  param->tcp = calloc(1, sizeof(*param->tcp));
-+  if (g_options.unix_socket_mode)
-+    param->uds = calloc(1, sizeof(*param->uds));
-+  else
-+    param->tcp = calloc(1, sizeof(*param->tcp));
- 
--  if (param->tcp == NULL) {
-+  if (param->uds == NULL && param->tcp == NULL) {
-     ERR("Preparing thread #%u: Failed to allocate space for cups connection",
-         param->thread_num);
-     return -1;
-@@ -488,9 +555,20 @@ int allocate_socket_connection(struct service_thread_param *param)
- 
- int setup_socket_connection(struct service_thread_param *param)
- {
--  param->tcp = tcp_conn_select(g_options.tcp_socket, g_options.tcp6_socket);
--  if (g_options.terminate || param->tcp == NULL)
--    return -1;
-+  if (g_options.unix_socket_mode) {
-+    int poll_status = 0;
-+    while (!g_options.terminate && poll_status == 0) {
-+      check_timeout();
-+      poll_status = uds_connect(g_options.uds_socket, param->uds);
-+    }
-+    if (g_options.terminate || poll_status < 0)
-+      return -1;
-+  } else {
-+    param->tcp = tcp_conn_select(g_options.tcp_socket, g_options.tcp6_socket);
-+    if (g_options.terminate || param->tcp == NULL)
-+      return -1;
-+  }
-+
-   return 0;
- }
- 
-@@ -546,7 +624,11 @@ struct libusb_callback_data *setup_libusb_callback_data(
-   data->thread_num = thread_param->thread_num;
-   data->read_inflight_mutex = read_inflight_mutex;
-   data->read_inflight_cond = thread_param->cond;
--  data->tcp = thread_param->tcp;
-+
-+  if (g_options.unix_socket_mode)
-+    data->uds = thread_param->uds;
-+  else
-+    data->tcp = thread_param->tcp;
- 
-   return data;
- }
-@@ -568,6 +650,8 @@ void set_read_inflight(int val, pthread_mutex_t *mtx, int *read_inflight)
- }
- 
- int is_socket_open(const struct service_thread_param *param) {
-+  if (g_options.unix_socket_mode)
-+    return !param->uds->is_closed;
-   return !param->tcp->is_closed;
- }
- 
-@@ -591,26 +675,35 @@ static void start_daemon()
-   usb_sock = usb_open();
-   if (usb_sock == NULL) goto cleanup_usb;
- 
--  /* Capture a socket */
--  uint16_t desired_port = open_tcp_socket();
--  if (g_options.tcp_socket == NULL && g_options.tcp6_socket == NULL)
--    goto cleanup_tcp;
-+  if (g_options.unix_socket_mode) {
-+    g_options.uds_socket = uds_open(g_options.unix_socket_path);
-+    if (g_options.uds_socket == NULL)
-+      goto cleanup_connections;
-+    NOTE("Opened unix socket %s", g_options.unix_socket_path);
-+  } else {
-+    /* Capture a socket */
-+    uint16_t desired_port = open_tcp_socket();
-+    if (g_options.tcp_socket == NULL && g_options.tcp6_socket == NULL)
-+      goto cleanup_connections;
-+
-+    if (g_options.tcp_socket)
-+      g_options.real_port = tcp_port_number_get(g_options.tcp_socket);
-+    else
-+      g_options.real_port = tcp_port_number_get(g_options.tcp6_socket);
-+
-+    if (desired_port != 0 && g_options.only_desired_port == 1 &&
-+        desired_port != g_options.real_port) {
-+      ERR("Received port number did not match requested port number."
-+          " The requested port number may be too high.");
-+      goto cleanup_connections;
-+    }
-+    printf("%u|", g_options.real_port);
-+    fflush(stdout);
- 
--  if (g_options.tcp_socket)
--    g_options.real_port = tcp_port_number_get(g_options.tcp_socket);
--  else
--    g_options.real_port = tcp_port_number_get(g_options.tcp6_socket);
--  if (desired_port != 0 && g_options.only_desired_port == 1 &&
--      desired_port != g_options.real_port) {
--    ERR("Received port number did not match requested port number."
--	" The requested port number may be too high.");
--    goto cleanup_tcp;
-+    NOTE("Port: %d, IPv4 %savailable, IPv6 %savailable", g_options.real_port,
-+         g_options.tcp_socket ? "" : "not ",
-+         g_options.tcp6_socket ? "" : "not ");
-   }
--  printf("%u|", g_options.real_port);
--  fflush(stdout);
--
--  NOTE("Port: %d, IPv4 %savailable, IPv6 %savailable", g_options.real_port,
--       g_options.tcp_socket ? "" : "not ", g_options.tcp6_socket ? "" : "not ");
- 
-   /* Lose connection to caller */
-   uint16_t pid;
-@@ -651,7 +744,7 @@ static void start_daemon()
-      that cups-browsed and ippfind will discover it */
-   if (g_options.nobroadcast == 0) {
-     if (dnssd_init() == -1)
--      goto cleanup_tcp;
-+      goto cleanup_connections;
-   }
- 
-   /* Main loop */
-@@ -667,7 +760,8 @@ static void start_daemon()
-     args->thread_num = i;
-     args->usb_sock = usb_sock;
- 
--    /* Allocate space for a tcp socket to be used for communication. */
-+    /* Allocate space for either a uds or tcp socket to be used for
-+       communication. */
-     if (allocate_socket_connection(args))
-       goto cleanup_thread;
- 
-@@ -688,12 +782,14 @@ static void start_daemon()
-     if (args != NULL) {
-       if (args->tcp != NULL)
- 	tcp_conn_close(args->tcp);
-+      if (args->uds != NULL)
-+        uds_conn_close(args->uds);
-       free(args);
-     }
-     break;
-   }
- 
-- cleanup_tcp:
-+ cleanup_connections:
-   /* Stop DNS-SD advertising of the printer */
-   if (g_options.dnssd_data != NULL)
-     dnssd_shutdown();
-@@ -720,6 +816,10 @@ static void start_daemon()
-   if (g_options.tcp6_socket!= NULL)
-     tcp_close(g_options.tcp6_socket);
- 
-+  /* UDS clean-up */
-+  if (g_options.uds_socket != NULL)
-+    uds_close(g_options.uds_socket);
-+
-  cleanup_usb:
-   /* USB clean-up and final reset of the printer */
-   if (usb_sock != NULL)
-@@ -757,6 +857,7 @@ int main(int argc, char *argv[])
-     {"from-port",    required_argument, 0,  'P' },
-     {"only-port",    required_argument, 0,  'p' },
-     {"interface",    required_argument, 0,  'i' },
-+    {"uds-path",     required_argument, 0,  'U' },
-     {"logging",      no_argument,       0,  'l' },
-     {"debug",        no_argument,       0,  'd' },
-     {"verbose",      no_argument,       0,  'q' },
-@@ -774,6 +875,7 @@ int main(int argc, char *argv[])
-   g_options.product_id = 0;
-   g_options.bus = 0;
-   g_options.device = 0;
-+  g_options.measuring_timeout = 0;
- 
-   while ((c = getopt_long(argc, argv, "qnhdp:P:i:s:lv:m:B",
- 			  long_options, &option_index)) != -1) {
-@@ -851,6 +953,10 @@ int main(int argc, char *argv[])
-     case 'B':
-       g_options.nobroadcast = 1;
-       break;
-+    case 'U':
-+      g_options.unix_socket_mode = 1;
-+      g_options.unix_socket_path = strdup(optarg);
-+      break;
-     }
-   }
- 
-diff --git a/src/ippusbxd.h b/src/ippusbxd.h
-index 098a45a..69461fe 100644
---- a/src/ippusbxd.h
-+++ b/src/ippusbxd.h
-@@ -10,6 +10,7 @@
- struct service_thread_param {
-   /* Connection to the device issuing requests to the printer. */
-   struct tcp_conn_t *tcp;
-+  struct uds_conn_t *uds;
-   /* Socket which holds the context for the bound USB printer. */
-   struct usb_sock_t *usb_sock;
-   /* Represents a connection to a specific USB interface. */
-@@ -31,6 +32,7 @@ struct libusb_callback_data {
-   int *empty_response;
-   uint32_t thread_num;
-   struct tcp_conn_t *tcp;
-+  struct uds_conn_t *uds;
-   /* The contents of the response from the printer. */
-   struct http_packet_t *pkt;
-   pthread_mutex_t *read_inflight_mutex;
-diff --git a/src/logging.h b/src/logging.h
-index 1f584ca..d6a2db5 100644
---- a/src/logging.h
-+++ b/src/logging.h
-@@ -16,6 +16,7 @@
- #include <pthread.h> /* For pthread_self() */
- #include "options.h"
- #include "dnssd.h"
-+#include "uds.h"
- #define TID() (pthread_self())
- 
- enum log_level {
-@@ -49,7 +50,13 @@ enum log_level {
- #define CONF_1(msg) BASE_LOG(LOGGING_CONFORMANCE, "<%d>Standard Conformance Failure: " msg "\n", TID())
- #define CONF_2(msg, ...) BASE_LOG(LOGGING_CONFORMANCE, "<%d>Standard Conformance Failure: " msg "\n", TID(), __VA_ARGS__)
- 
--#define ERR_AND_EXIT(...) do { ERR(__VA_ARGS__); if (g_options.dnssd_data != NULL) dnssd_shutdown(g_options.dnssd_data); exit(-1);} while (0)
-+#define ERR_AND_EXIT(...)                                                   \
-+  do {                                                                      \
-+    ERR(__VA_ARGS__);                                                       \
-+    if (g_options.dnssd_data != NULL) dnssd_shutdown(g_options.dnssd_data); \
-+    if (g_options.uds_socket != NULL) uds_close(g_options.uds_socket);      \
-+    exit(-1);                                                               \
-+  } while (0)
- 
- void BASE_LOG(enum log_level, const char *, ...);
- char* hexdump (void *addr, int len);
-diff --git a/src/options.h b/src/options.h
-index 7cb25d3..dc93bcf 100644
---- a/src/options.h
-+++ b/src/options.h
-@@ -29,6 +29,7 @@ struct options {
-   int only_desired_port;
-   uint16_t real_port;
-   char *interface;
-+  char *unix_socket_path;
-   enum log_target log_destination;
- 
-   /* Behavior */
-@@ -36,6 +37,7 @@ struct options {
-   int verbose_mode;
-   int nofork_mode;
-   int nobroadcast;
-+  int unix_socket_mode;
- 
-   /* Printer identity */
-   unsigned char *serial_num;
-@@ -47,6 +49,7 @@ struct options {
- 
-   /* Global variables */
-   int terminate;
-+  int measuring_timeout;
-   dnssd_t *dnssd_data;
-   pthread_t usb_event_thread_handle;
-   struct tcp_sock_t *tcp_socket;
-@@ -54,6 +57,8 @@ struct options {
- 
-   /* Scanner presence */
-   int scanner_present;
-+
-+  struct uds_sock_t *uds_socket;
- };
- 
- extern struct options g_options;
-diff --git a/src/uds.c b/src/uds.c
-new file mode 100644
-index 0000000..de349db
---- /dev/null
-+++ b/src/uds.c
-@@ -0,0 +1,200 @@
-+// Copyright 2017 The Chromium OS Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#include <errno.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <sys/socket.h>
-+#include <sys/time.h>
-+#include <sys/types.h>
-+#include <sys/un.h>
-+#include <unistd.h>
-+
-+#include "http.h"
-+#include "logging.h"
-+#include "options.h"
-+#include "uds.h"
-+
-+struct uds_sock_t *uds_open(const char *path)
-+{
-+  struct uds_sock_t *sock = calloc(1, sizeof(*sock));
-+  if (sock == NULL) {
-+    ERR("UDS: Allocating memory for socket failed");
-+    goto error;
-+  }
-+
-+  if ((sock->fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0)) < 0) {
-+    ERR("UDS: Opening socket failed");
-+    goto error;
-+  }
-+
-+  int val = 1;
-+  if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) {
-+    ERR("UDS: Setting socket options failed");
-+    goto error;
-+  }
-+
-+  // Configure socket parameters.
-+  struct sockaddr_un addr;
-+  memset(&addr, 0, sizeof(addr));
-+
-+  addr.sun_family = AF_UNIX;
-+
-+  // Check that the length of the socket path is not too long. The maximum size
-+  // of a path in a sockaddr_un is 108 characters.
-+  if (strlen(path) >= sizeof(addr.sun_path)) {
-+    ERR("UDS: Provided socket path %s is too long", path);
-+    goto error;
-+  }
-+
-+  strcpy(addr.sun_path, path);
-+
-+  NOTE("UDS: Binding to %s", path);
-+
-+  if (bind(sock->fd, (struct sockaddr *)&addr, sizeof(addr))) {
-+    ERR("UDS: Binding to socket failed - %s", strerror(errno));
-+    goto error;
-+  }
-+
-+  if (listen(sock->fd, UDS_MAX_PENDING_CONNS)) {
-+    ERR("UDS: Listen on socket failed");
-+    goto error;
-+  }
-+
-+  sock->addr = addr;
-+
-+  return sock;
-+
-+error:
-+  if (sock != NULL) {
-+    if (sock->fd != -1) {
-+      close(sock->fd);
-+      unlink(sock->addr.sun_path);
-+    }
-+    free(sock);
-+  }
-+  return NULL;
-+}
-+
-+void uds_close(struct uds_sock_t *sock)
-+{
-+  close(sock->fd);
-+  unlink(sock->addr.sun_path);
-+  free(sock);
-+}
-+
-+int uds_connect(struct uds_sock_t *sock, struct uds_conn_t *conn)
-+{
-+  if (sock == NULL) {
-+    ERR("UDS: No valid unix socket provided");
-+    return -1;
-+  }
-+
-+  int poll_result = uds_poll_connection(sock->fd);
-+
-+  if (g_options.terminate)
-+    return -1;
-+
-+  if (poll_result < 0) {
-+    ERR("Something went wrong when polling the uds socket");
-+    return -1;
-+  }
-+
-+  // There is no data to be read on the socket.
-+  if (poll_result == 0) {
-+    return 0;
-+  }
-+
-+  if ((conn->fd = accept(sock->fd, NULL, NULL)) < 0) {
-+    ERR("Failed to connect to uds socket");
-+    return -1;
-+  }
-+
-+  NOTE("Successfully connected to socket");
-+
-+  return 1;
-+}
-+
-+void uds_conn_close(struct uds_conn_t *conn)
-+{
-+  shutdown(conn->fd, SHUT_RDWR);
-+  close(conn->fd);
-+  free(conn);
-+}
-+
-+struct http_packet_t *uds_packet_get(struct uds_conn_t *conn) {
-+  struct http_packet_t *pkt = packet_new();
-+  if (pkt == NULL) {
-+    ERR("UDS: Allocating memory for incoming uds message failed");
-+    goto error;
-+  }
-+
-+  struct timeval tv;
-+  tv.tv_sec = 3;
-+  tv.tv_usec = 0;
-+  if (setsockopt(conn->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) {
-+    ERR("UDS: Setting options for uds socket failed");
-+    goto error;
-+  }
-+
-+  ssize_t gotten_size = recv(conn->fd, pkt->buffer, pkt->buffer_capacity, 0);
-+
-+  if (gotten_size < 0) {
-+    int errno_saved = errno;
-+    ERR("UDS: recv failed with err %d:%s", errno_saved, strerror(errno_saved));
-+    conn->is_closed = 1;
-+    goto error;
-+  }
-+
-+  if (gotten_size == 0) {
-+    conn->is_closed = 1;
-+    goto error;
-+  }
-+
-+  pkt->filled_size = gotten_size;
-+  return pkt;
-+
-+error:
-+  if (pkt != NULL) packet_free(pkt);
-+  return NULL;
-+}
-+
-+int uds_packet_send(struct uds_conn_t *conn, struct http_packet_t *pkt)
-+{
-+  size_t remaining = pkt->filled_size;
-+  size_t total = 0;
-+
-+  while (remaining > 0 && !g_options.terminate) {
-+    ssize_t sent = send(conn->fd, pkt->buffer + total, remaining, MSG_NOSIGNAL);
-+
-+    if (sent < 0) {
-+      if (errno == EPIPE) {
-+        conn->is_closed = 1;
-+        return 0;
-+      }
-+      int errno_saved = errno;
-+      ERR("UDS: send failed with error %d:%s", errno_saved,
-+          strerror(errno_saved));
-+      return -1;
-+    }
-+
-+    total += sent;
-+    if (sent >= remaining)
-+      remaining = 0;
-+    else
-+      remaining -= sent;
-+  }
-+
-+  NOTE("UDS: sent %zu bytes", total);
-+  return 0;
-+}
-+
-+// Polls the UDS connection in |conn| to see if there is any data to be read.
-+int uds_poll_connection(int fd) {
-+  struct pollfd poll_fd;
-+  poll_fd.fd = fd;
-+  poll_fd.events = POLLIN;
-+  static int timeout = 1000;
-+  return poll(&poll_fd, 1, timeout);
-+}
-diff --git a/src/uds.h b/src/uds.h
-new file mode 100644
-index 0000000..67c13f9
---- /dev/null
-+++ b/src/uds.h
-@@ -0,0 +1,51 @@
-+// Copyright 2017 The Chromium OS Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#pragma once
-+#include <stdint.h>
-+
-+#include <sys/types.h>
-+#include <sys/socket.h>
-+#include <sys/un.h>
-+
-+#include "http.h"
-+
-+// In order for CUPS to determine whether or not the socket is ready it first
-+// attempts to open a dummy connection. By the time CUPS attempts to establish
-+// the real connection the dummy connection has still not been fully removed by
-+// the system, so we must allow for some pending connections.
-+#define UDS_MAX_PENDING_CONNS 4
-+
-+struct uds_sock_t {
-+  int fd;
-+  struct sockaddr_un addr;
-+  socklen_t info_size;
-+};
-+
-+struct uds_conn_t {
-+  int fd;
-+  int is_closed;
-+};
-+
-+struct uds_sock_t *uds_open(const char *path);
-+void uds_close(struct uds_sock_t *sock);
-+
-+// Polls the unix socket described by |sock| to see if there is data to be read.
-+// If there is then it opens a new connection and stores it in |conn|. This
-+// function returns 1 if the connection opens sucessfuly, 0 if the socket is not
-+// currently ready, and -1 if there was an error.
-+int uds_connect(struct uds_sock_t *sock, struct uds_conn_t *conn);
-+
-+void uds_conn_close(struct uds_conn_t *conn);
-+
-+struct http_packet_t *uds_packet_get(struct uds_conn_t *conn);
-+
-+int uds_packet_send(struct uds_conn_t *conn, struct http_packet_t *pkt);
-+
-+// Polls the given file descriptor |fd| to see if there is any data to be read.
-+// Return values:
-+//   1 - there is data to be read.
-+//   0 - there is not any data to be read.
-+//  -1 - there was an error.
-+int uds_poll_connection(int fd);
-diff --git a/src/usb.c b/src/usb.c
-index a47aa98..21c84d4 100644
---- a/src/usb.c
-+++ b/src/usb.c
-@@ -599,6 +599,10 @@ static int LIBUSB_CALL usb_exit_on_unplug(libusb_context *context,
-     if (g_options.tcp6_socket!= NULL)
-       tcp_close(g_options.tcp6_socket);
- 
-+    /* UDS clean-up */
-+    if (g_options.uds_socket != NULL)
-+      uds_close(g_options.uds_socket);
-+
-     exit(0);
-   }
- 
- 
--- 
-2.25.0.341.g760bfbb309-goog
-
diff --git a/net-print/ippusbxd/files/usb-race.patch b/net-print/ippusbxd/files/usb-race.patch
deleted file mode 100644
index f62e05c..0000000
--- a/net-print/ippusbxd/files/usb-race.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-commit d5240ff3e8485745e10b498236834177cd99edb9
-Author: Fletcher Woodruff <fletcherw@chromium.org>
-Date:   Mon Jun 29 13:23:23 2020 -0600
-
-    usb: fix race condition in usb_conn_acquire
-    
-    If we do not have an available usb connection at the start of
-    usb_conn_acquire, we sleep and poll for several seconds until a
-    connection becomes available.
-    
-    However, this check is done without holding the pool_manage_lock. This
-    allows for a race condition where we read num_avail and get a non-zero
-    value, but then some other thread acquires the pool_manage_lock first
-    and claims that free interface, causing us to error out when we then try
-    to claim the interface.
-    
-    To fix this, acquire the pool_manage_lock before checking num_avail. This way,
-    when we exit our poll loop that waits for an available interface, we will be
-    certain that interface will continue to be available until we claim it.
-
-diff --git a/src/usb.c b/src/usb.c
-index 905b90b..9412bb0 100644
---- a/src/usb.c
-+++ b/src/usb.c
-@@ -656,19 +656,6 @@ struct usb_conn_t *usb_conn_acquire(struct usb_sock_t *usb)
- {
-   int i;
- 
--  if (usb->num_avail <= 0) {
--    NOTE("All USB interfaces busy, waiting ...");
--    for (i = 0; i < 30 && usb->num_avail <= 0; i ++) {
--      if (get_terminate(&g_options))
--	return NULL;
--      usleep(100000);
--    }
--    if (usb->num_avail <= 0) {
--      ERR("Timed out waiting for a free USB interface");
--      return NULL;
--    }
--  }
--
-   struct usb_conn_t *conn = calloc(1, sizeof(*conn));
-   if (conn == NULL) {
-     ERR("Failed to alloc space for usb connection");
-@@ -677,6 +664,23 @@ struct usb_conn_t *usb_conn_acquire(struct usb_sock_t *usb)
- 
-   sem_wait(&usb->pool_manage_lock);
-   {
-+    if (usb->num_avail <= 0) {
-+      NOTE("All USB interfaces busy, waiting ...");
-+      for (i = 0; i < 30 && usb->num_avail <= 0; i ++) {
-+	if (get_terminate(&g_options))
-+	  goto acquire_error;
-+
-+	// Release the lock while we sleep.
-+	sem_post(&usb->pool_manage_lock);
-+	usleep(100000);
-+	sem_wait(&usb->pool_manage_lock);
-+      }
-+      if (usb->num_avail <= 0) {
-+	ERR("Timed out waiting for a free USB interface");
-+	goto acquire_error;
-+      }
-+    }
-+
-     conn->parent = usb;
- 
-     uint32_t slot = usb->num_taken;
diff --git a/net-print/ippusbxd/ippusbxd-1.33-r9.ebuild b/net-print/ippusbxd/ippusbxd-1.33-r9.ebuild
deleted file mode 120000
index e7d1581..0000000
--- a/net-print/ippusbxd/ippusbxd-1.33-r9.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-ippusbxd-1.33.ebuild
\ No newline at end of file
diff --git a/net-print/ippusbxd/ippusbxd-1.33.ebuild b/net-print/ippusbxd/ippusbxd-1.33.ebuild
deleted file mode 100644
index ea4e5d5..0000000
--- a/net-print/ippusbxd/ippusbxd-1.33.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU Gener Public License v2
-
-EAPI=6
-
-inherit cmake-utils cros-sanitizers
-
-GIT_HASH="e8176ff30f4b7ac203bd752d457d5e81437556f1"
-DESCRIPTION="a userland driver for IPP-over-USB class USB devices."
-HOMEPAGE="https://github.com/OpenPrinting/ippusbxd"
-SRC_URI="https://github.com/OpenPrinting/ippusbxd/archive/${GIT_HASH}.tar.gz -> ${P}-${GIT_HASH}.tar.gz"
-
-KEYWORDS="*"
-LICENSE="Apache-2.0"
-SLOT="0"
-
-DEPEND="
-	virtual/libusb:1=
-	>=net-dns/avahi-0.6.32
-"
-
-S="${WORKDIR}/${P}/src"
-
-PATCHES=(
-	"${FILESDIR}/unix-socket.patch"
-	"${FILESDIR}/keep-alive.patch"
-	"${FILESDIR}/larger-buffer.patch"
-	"${FILESDIR}/log-usb-acquire-error.patch"
-	"${FILESDIR}/usb-race.patch"
-)
-
-src_prepare() {
-	eapply -p2 "${PATCHES[@]}"
-	eapply_user
-}
-
-src_configure() {
-	sanitizers-setup-env
-	cmake-utils_src_configure
-}
-
-src_install() {
-	dobin "${BUILD_DIR}/ippusbxd"
-
-	# Install seccomp policy files.
-	insinto /usr/share/policy
-	newins "${FILESDIR}/ippusbxd-seccomp-${ARCH}.policy" ippusbxd-seccomp.policy
-}
diff --git a/net-print/ippusbxd/metadata.xml b/net-print/ippusbxd/metadata.xml
deleted file mode 100644
index d07b926..0000000
--- a/net-print/ippusbxd/metadata.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
-<pkgmetadata>
-	<upstream>
-		<remote-id type="cpe">cpe:/a:ippusbxd_project:ippusbxd</remote-id>
-	</upstream>
-</pkgmetadata>
diff --git a/net-print/konica-minolta-printing-license/OWNERS b/net-print/konica-minolta-printing-license/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/konica-minolta-printing-license/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/starcupsdrv/OWNERS b/net-print/starcupsdrv/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/starcupsdrv/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914-r2.ebuild b/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914-r3.ebuild
similarity index 100%
rename from net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914-r2.ebuild
rename to net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914-r3.ebuild
diff --git a/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914.ebuild b/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914.ebuild
index e0dfba6..895f470 100644
--- a/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914.ebuild
+++ b/net-print/starcupsdrv/starcupsdrv-3.6.0a_pre20170914.ebuild
@@ -3,7 +3,7 @@
 
 EAPI=5
 
-inherit eutils
+inherit eutils cros-sanitizers
 
 DESCRIPTION="CUPS filter and PPD files for Star Micronics printers"
 HOMEPAGE="http://www.starmicronics.com"
@@ -14,7 +14,7 @@
 KEYWORDS="*"
 IUSE=""
 
-DEPEND="net-print/cups"
+DEPEND="net-print/cups:="
 RDEPEND="${DEPEND}"
 
 PATCHES=(
@@ -32,6 +32,11 @@
 	epatch_user
 }
 
+src_configure() {
+	sanitizers-setup-env
+	default
+}
+
 src_install() {
 	exeinto "$(${SYSROOT}/usr/bin/cups-config --serverbin)/filter"
 	doexe install/rastertostar
diff --git a/net-print/xerox-printing-license/OWNERS b/net-print/xerox-printing-license/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/net-print/xerox-printing-license/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/net-vpn/openvpn/OWNERS b/net-vpn/openvpn/OWNERS
new file mode 100644
index 0000000..1c6cf5c
--- /dev/null
+++ b/net-vpn/openvpn/OWNERS
@@ -0,0 +1 @@
+taoyl@chromium.org
diff --git a/net-vpn/openvpn/openvpn-2.4.4-r6.ebuild b/net-vpn/openvpn/openvpn-2.4.4-r7.ebuild
similarity index 100%
rename from net-vpn/openvpn/openvpn-2.4.4-r6.ebuild
rename to net-vpn/openvpn/openvpn-2.4.4-r7.ebuild
diff --git a/net-vpn/openvpn/openvpn-2.4.4.ebuild b/net-vpn/openvpn/openvpn-2.4.4.ebuild
index 3eeb5a1..a2ee725 100644
--- a/net-vpn/openvpn/openvpn-2.4.4.ebuild
+++ b/net-vpn/openvpn/openvpn-2.4.4.ebuild
@@ -126,11 +126,6 @@
 	enewgroup openvpn
 	enewuser openvpn "" "" "" openvpn
 
-	if path_exists -o "${EROOT%/}"/etc/openvpn/*/local.conf ; then
-		ewarn "WARNING: The openvpn init script has changed"
-		ewarn ""
-	fi
-
 	if grep -Eq "^[ \t]*(up|down)[ \t].*" "${ROOT}/etc/openvpn"/*.conf 2>/dev/null ; then
 		ewarn ""
 		ewarn "WARNING: If you use the remote keyword then you are deemed to be"
diff --git a/net-vpn/strongswan/OWNERS b/net-vpn/strongswan/OWNERS
new file mode 100644
index 0000000..1c6cf5c
--- /dev/null
+++ b/net-vpn/strongswan/OWNERS
@@ -0,0 +1 @@
+taoyl@chromium.org
diff --git a/net-wireless/bluez/bluez-5.44-r373.ebuild b/net-wireless/bluez/bluez-5.44-r373.ebuild
deleted file mode 100644
index fa9a725..0000000
--- a/net-wireless/bluez/bluez-5.44-r373.ebuild
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright 1999-2012 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/net-wireless/bluez/bluez-4.99.ebuild,v 1.7 2012/04/15 16:53:41 maekke Exp $
-
-EAPI="7"
-# To support choosing between current and next versions, two cros-workon
-# projects are declared. During emerge, both project sources are copied to
-# their respective destination directories, and one is chosen as the
-# "working directory" in src_unpack() below based on bluez-next USE flag.
-CROS_WORKON_COMMIT=("40f049708fab2bb05929b2cc94c201264206d711" "271a14feb4af3126a9be58aa38ab3d0bf0527f3f" "615d82331d0c2ec61951542db40f9ab7e4d79d60")
-CROS_WORKON_TREE=("13a0f3387c3d689f759f6690b5a4bdeca8a693e1" "ce74fa1a7779417157aa9d3ee06c44a4f20c2f83" "63f6426dc875392b5ace7e1b472ac49b5a0ab79f")
-CROS_WORKON_LOCALNAME=("bluez/current" "bluez/next" "bluez/upstream")
-CROS_WORKON_PROJECT=("chromiumos/third_party/bluez" "chromiumos/third_party/bluez" "chromiumos/third_party/bluez")
-CROS_WORKON_OPTIONAL_CHECKOUT=(
-	"use !bluez-next && use !bluez-upstream"
-	"use bluez-next"
-	"use bluez-upstream"
-)
-CROS_WORKON_DESTDIR=("${S}/bluez/current" "${S}/bluez/next" "${S}/bluez/upstream")
-CROS_WORKON_EGIT_BRANCH=("chromeos-5.44" "chromeos-5.54" "upstream/master")
-
-inherit autotools multilib eutils systemd udev user libchrome cros-sanitizers cros-workon flag-o-matic
-
-DESCRIPTION="Bluetooth Tools and System Daemons for Linux"
-HOMEPAGE="http://www.bluez.org/"
-#SRC_URI not defined because we get our source locally
-
-LICENSE="GPL-2 LGPL-2.1"
-KEYWORDS="*"
-IUSE="asan bluez-next bluez-upstream cups debug systemd readline bt_deprecated_tools"
-REQUIRED_USE="?? ( bluez-next bluez-upstream )"
-
-CDEPEND="
-	>=dev-libs/glib-2.14:2=
-	app-arch/bzip2:=
-	sys-apps/dbus:=
-	virtual/libudev:=
-	cups? ( net-print/cups:= )
-	readline? ( sys-libs/readline:= )
-	chromeos-base/metrics:=
-"
-DEPEND="${CDEPEND}"
-
-RDEPEND="${CDEPEND}
-	!net-wireless/bluez-hcidump
-	!net-wireless/bluez-libs
-	!net-wireless/bluez-test
-	!net-wireless/bluez-utils
-"
-BDEPEND="${CDEPEND}
-	dev-util/pkgconfig:=
-	sys-devel/flex:=
-"
-
-DOCS=( AUTHORS ChangeLog README )
-
-src_unpack() {
-	cros-workon_src_unpack
-
-	# Setting S has the effect of changing the temporary build directory
-	# here onwards. Choose "bluez/next" or "bluez/current" subdir depending on
-	# the USE flag.
-	local checkout="bluez/$(usex bluez-next next $(usex bluez-upstream upstream current))"
-	S+="/${checkout}"
-	local version="$("${FILESDIR}"/chromeos-version.sh "${S}")"
-	einfo "Using checkout ${checkout} (version ${version})"
-}
-
-src_prepare() {
-	default
-
-	eautoreconf
-
-	if use cups; then
-		sed -i \
-			-e "s:cupsdir = \$(libdir)/cups:cupsdir = $(cups-config --serverbin):" \
-			Makefile.tools Makefile.in || die
-	fi
-}
-
-src_configure() {
-	sanitizers-setup-env
-	# Workaround a global-buffer-overflow warning in asan build.
-	# See crbug.com/748216 for details.
-	if use asan; then
-		append-flags '-mllvm -asan-globals=0'
-	fi
-
-	use readline || export ac_cv_header_readline_readline_h=no
-
-	econf \
-		--enable-tools \
-		--localstatedir=/var \
-		$(use_enable cups) \
-		--enable-datafiles \
-		$(use_enable debug) \
-		--disable-test \
-		--enable-library \
-		--disable-systemd \
-		--disable-obex \
-		--enable-sixaxis \
-		--disable-network \
-		--disable-datafiles \
-		$(use_enable bt_deprecated_tools deprecated)
-}
-
-src_test() {
-	# TODO(armansito): Run unit tests for non-x86 platforms.
-	[[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] && \
-		emake check VERBOSE=1
-}
-
-src_install() {
-	default
-
-	dobin tools/btmgmt tools/btgatt-client tools/btgatt-server
-
-	# Install scripts
-	dobin "${FILESDIR}/dbus_send_blutooth_class.awk"
-	dobin "${FILESDIR}/get_bluetooth_device_class.sh"
-	dobin "${FILESDIR}/start_bluetoothd.sh"
-	dobin "${FILESDIR}/start_bluetoothlog.sh"
-
-	# Install init scripts.
-	if use systemd; then
-		systemd_dounit "${FILESDIR}/bluetoothd.service"
-		systemd_enable_service system-services.target bluetoothd.service
-		systemd_dotmpfilesd "${FILESDIR}/bluetoothd-directories.conf"
-	else
-		insinto /etc/init
-		newins "${FILESDIR}/${PN}-upstart.conf" bluetoothd.conf
-		newins "${FILESDIR}/bluetoothlog-upstart.conf" bluetoothlog.conf
-	fi
-
-	# Install D-Bus config
-	insinto /etc/dbus-1/system.d
-	doins "${FILESDIR}/org.bluez.conf"
-
-	# Install udev files
-	udev_dorules "${FILESDIR}/99-uhid.rules"
-	udev_dorules "${FILESDIR}/99-ps3-gamepad.rules"
-	udev_dorules "${FILESDIR}/99-bluetooth-quirks.rules"
-
-	# Install the config files.
-	insinto "/etc/bluetooth"
-	doins "${FILESDIR}/main.conf"
-	doins "${FILESDIR}/input.conf"
-
-	# We don't preserve /var/lib in images, so nuke anything we preseed.
-	rm -rf "${D}"/var/lib/bluetooth
-
-	rm "${D}/lib/udev/rules.d/97-bluetooth.rules"
-
-	find "${D}" -name "*.la" -delete
-}
-
-pkg_postinst() {
-	enewuser "bluetooth" "218"
-	enewgroup "bluetooth" "218"
-
-	udev_reload
-
-	if ! has_version "net-dialup/ppp"; then
-		elog "To use dial up networking you must install net-dialup/ppp."
-	fi
-
-	if [ "$(rc-config list default | grep bluetooth)" = "" ] ; then
-		elog "You will need to add bluetooth service to default runlevel"
-		elog "for getting your devices detected from startup without needing"
-		elog "to reconnect them. For that please run:"
-		elog "'rc-update add bluetooth default'"
-	fi
-}
diff --git a/net-wireless/bluez/bluez-5.54-r461.ebuild b/net-wireless/bluez/bluez-5.54-r461.ebuild
new file mode 100644
index 0000000..1ad9e92
--- /dev/null
+++ b/net-wireless/bluez/bluez-5.54-r461.ebuild
@@ -0,0 +1,174 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-wireless/bluez/bluez-4.99.ebuild,v 1.7 2012/04/15 16:53:41 maekke Exp $
+
+EAPI="7"
+# To support choosing between current and next versions, two cros-workon
+# projects are declared. During emerge, both project sources are copied to
+# their respective destination directories, and one is chosen as the
+# "working directory" in src_unpack() below based on bluez-next USE flag.
+CROS_WORKON_COMMIT=("8d636cebd1c71df98992b6143233b62d753b8a1e" "8d636cebd1c71df98992b6143233b62d753b8a1e" "fb9700edf285672e40d411ad60546d4d6dc74847")
+CROS_WORKON_TREE=("f22293c6280a2f905d86600a017dc3412716eb5e" "f22293c6280a2f905d86600a017dc3412716eb5e" "96d62afdc4e973ada760a2311fa39afd0e13010f")
+CROS_WORKON_LOCALNAME=("bluez/current" "bluez/next" "bluez/upstream")
+CROS_WORKON_PROJECT=("chromiumos/third_party/bluez" "chromiumos/third_party/bluez" "chromiumos/third_party/bluez")
+CROS_WORKON_OPTIONAL_CHECKOUT=(
+	"use !bluez-next && use !bluez-upstream"
+	"use bluez-next"
+	"use bluez-upstream"
+)
+CROS_WORKON_DESTDIR=("${S}/bluez/current" "${S}/bluez/next" "${S}/bluez/upstream")
+CROS_WORKON_EGIT_BRANCH=("chromeos-5.54" "chromeos-5.54" "upstream/master")
+
+inherit autotools multilib eutils systemd udev user libchrome cros-sanitizers cros-workon flag-o-matic
+
+DESCRIPTION="Bluetooth Tools and System Daemons for Linux"
+HOMEPAGE="http://www.bluez.org/"
+#SRC_URI not defined because we get our source locally
+
+LICENSE="GPL-2 LGPL-2.1"
+KEYWORDS="*"
+IUSE="asan bluez-next bluez-upstream cups debug systemd readline bt_deprecated_tools"
+REQUIRED_USE="?? ( bluez-next bluez-upstream )"
+
+CDEPEND="
+	>=dev-libs/glib-2.14:2=
+	app-arch/bzip2:=
+	sys-apps/dbus:=
+	virtual/libudev:=
+	cups? ( net-print/cups:= )
+	readline? ( sys-libs/readline:= )
+	>=chromeos-base/metrics-0.0.1-r3152:=
+"
+DEPEND="${CDEPEND}"
+
+RDEPEND="${CDEPEND}
+	!net-wireless/bluez-hcidump
+	!net-wireless/bluez-libs
+	!net-wireless/bluez-test
+	!net-wireless/bluez-utils
+"
+BDEPEND="${CDEPEND}
+	dev-util/pkgconfig:=
+	sys-devel/flex:=
+"
+
+DOCS=( AUTHORS ChangeLog README )
+
+src_unpack() {
+	cros-workon_src_unpack
+
+	# Setting S has the effect of changing the temporary build directory
+	# here onwards. Choose "bluez/next" or "bluez/current" subdir depending on
+	# the USE flag.
+	local checkout="bluez/$(usex bluez-next next $(usex bluez-upstream upstream current))"
+	S+="/${checkout}"
+	local version="$("${FILESDIR}"/chromeos-version.sh "${S}")"
+	einfo "Using checkout ${checkout} (version ${version})"
+}
+
+src_prepare() {
+	default
+
+	eautoreconf
+
+	if use cups; then
+		sed -i \
+			-e "s:cupsdir = \$(libdir)/cups:cupsdir = $(cups-config --serverbin):" \
+			Makefile.tools Makefile.in || die
+	fi
+}
+
+src_configure() {
+	sanitizers-setup-env
+	# Workaround a global-buffer-overflow warning in asan build.
+	# See crbug.com/748216 for details.
+	if use asan; then
+		append-flags '-mllvm -asan-globals=0'
+	fi
+
+	use readline || export ac_cv_header_readline_readline_h=no
+
+	export BASE_VER="$(libchrome_ver)"
+	econf \
+		--enable-tools \
+		--localstatedir=/var \
+		$(use_enable cups) \
+		--enable-datafiles \
+		$(use_enable debug) \
+		--disable-test \
+		--enable-library \
+		--disable-systemd \
+		--disable-obex \
+		--enable-sixaxis \
+		--disable-network \
+		--disable-datafiles \
+		$(use_enable bt_deprecated_tools deprecated)
+}
+
+src_test() {
+	# TODO(armansito): Run unit tests for non-x86 platforms.
+	[[ "${ARCH}" == "x86" || "${ARCH}" == "amd64" ]] && \
+		emake check VERBOSE=1
+}
+
+src_install() {
+	default
+
+	dobin tools/btmgmt tools/btgatt-client tools/btgatt-server
+
+	# Install scripts
+	dobin "${FILESDIR}/dbus_send_blutooth_class.awk"
+	dobin "${FILESDIR}/get_bluetooth_device_class.sh"
+	dobin "${FILESDIR}/start_bluetoothd.sh"
+	dobin "${FILESDIR}/start_bluetoothlog.sh"
+
+	# Install init scripts.
+	if use systemd; then
+		systemd_dounit "${FILESDIR}/bluetoothd.service"
+		systemd_enable_service system-services.target bluetoothd.service
+		systemd_dotmpfilesd "${FILESDIR}/bluetoothd-directories.conf"
+	else
+		insinto /etc/init
+		newins "${FILESDIR}/${PN}-upstart.conf" bluetoothd.conf
+		newins "${FILESDIR}/bluetoothlog-upstart.conf" bluetoothlog.conf
+	fi
+
+	# Install D-Bus config
+	insinto /etc/dbus-1/system.d
+	doins "${FILESDIR}/org.bluez.conf"
+
+	# Install udev files
+	udev_dorules "${FILESDIR}/99-uhid.rules"
+	udev_dorules "${FILESDIR}/99-ps3-gamepad.rules"
+	udev_dorules "${FILESDIR}/99-bluetooth-quirks.rules"
+
+	# Install the config files.
+	insinto "/etc/bluetooth"
+	doins "${FILESDIR}/main.conf"
+	doins "${FILESDIR}/input.conf"
+
+	# We don't preserve /var/lib in images, so nuke anything we preseed.
+	rm -rf "${D}"/var/lib/bluetooth
+
+	rm "${D}/lib/udev/rules.d/97-bluetooth.rules"
+
+	find "${D}" -name "*.la" -delete
+}
+
+pkg_postinst() {
+	enewuser "bluetooth" "218"
+	enewgroup "bluetooth" "218"
+
+	udev_reload
+
+	if ! has_version "net-dialup/ppp"; then
+		elog "To use dial up networking you must install net-dialup/ppp."
+	fi
+
+	if [ "$(rc-config list default | grep bluetooth)" = "" ] ; then
+		elog "You will need to add bluetooth service to default runlevel"
+		elog "for getting your devices detected from startup without needing"
+		elog "to reconnect them. For that please run:"
+		elog "'rc-update add bluetooth default'"
+	fi
+}
diff --git a/net-wireless/bluez/bluez-9999.ebuild b/net-wireless/bluez/bluez-9999.ebuild
index 5de8e84..e909558 100644
--- a/net-wireless/bluez/bluez-9999.ebuild
+++ b/net-wireless/bluez/bluez-9999.ebuild
@@ -15,7 +15,7 @@
 	"use bluez-upstream"
 )
 CROS_WORKON_DESTDIR=("${S}/bluez/current" "${S}/bluez/next" "${S}/bluez/upstream")
-CROS_WORKON_EGIT_BRANCH=("chromeos-5.44" "chromeos-5.54" "upstream/master")
+CROS_WORKON_EGIT_BRANCH=("chromeos-5.54" "chromeos-5.54" "upstream/master")
 
 inherit autotools multilib eutils systemd udev user libchrome cros-sanitizers cros-workon flag-o-matic
 
@@ -35,7 +35,7 @@
 	virtual/libudev:=
 	cups? ( net-print/cups:= )
 	readline? ( sys-libs/readline:= )
-	chromeos-base/metrics:=
+	>=chromeos-base/metrics-0.0.1-r3152:=
 "
 DEPEND="${CDEPEND}"
 
@@ -86,6 +86,7 @@
 
 	use readline || export ac_cv_header_readline_readline_h=no
 
+	export BASE_VER="$(libchrome_ver)"
 	econf \
 		--enable-tools \
 		--localstatedir=/var \
diff --git a/net-wireless/bluez/files/main.conf b/net-wireless/bluez/files/main.conf
index 9eb346f..de73e8e 100644
--- a/net-wireless/bluez/files/main.conf
+++ b/net-wireless/bluez/files/main.conf
@@ -1,6 +1,10 @@
 # Copyright 2020 The Chromium OS Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
+#
+# This file is installed in /etc and copied to /var before being used by
+# bluetoothd to allow run-time edit of DeviceID. Refer start_bluetoothd.sh for
+# details.
 
 [General]
 
@@ -33,9 +37,8 @@
 # Possible vendor id source values: bluetooth, usb (defaults to usb)
 #
 # For Chrome OS, the Device ID is <Google>/<chromeOS>/<versionNumber>
-# TODO(b:152526402): Automatically replace the "branch number" part of this ID
-# in the install script in bluez ebuild.
-DeviceID = bluetooth:00e0:c405:0055
+# BlueZ startup script replaces 0000 part with the Chrome OS version number.
+DeviceID = bluetooth:00e0:c405:0000
 
 # Do reverse service discovery for previously unknown devices that connect to
 # us. For BR/EDR this option is really only needed for qualification since the
@@ -85,6 +88,15 @@
 # Defaults to "never"
 #JustWorksRepairing = never
 
+# How long to keep temporary devices around
+# The value is in seconds. Default is 30.
+# 0 = disable timer, i.e. never keep temporary devices
+#TemporaryTimeout = 30
+
+# Enables the device to issue an SDP request to update known services when
+# profile is connected. Defaults to true.
+#RefreshDiscovery = true
+
 [Controller]
 # The following values are used to load default adapter parameters.  BlueZ loads
 # the values into the kernel before the adapter is powered if the kernel
@@ -95,7 +107,7 @@
 # domain of each of these values.
 
 # BR/EDR Page scan activity configuration
-#BRPageScanType=
+BRPageScanType=1
 #BRPageScanInterval=
 #BRPageScanWindow=
 
@@ -137,8 +149,8 @@
 
 # LE scanning parameters used for passive scanning supporting the advertisement
 # monitor Apis
-#LEScanIntervalAdvMonitor=
-#LEScanWindowAdvMonitor=
+LEScanIntervalAdvMonitor=40
+LEScanWindowAdvMonitor=20
 
 # LE scanning parameters used for connection establishment.
 #LEScanIntervalConnect=
@@ -152,6 +164,24 @@
 LEConnectionSupervisionTimeout=200
 LEAutoconnecttimeout=5000
 
+# EIR Max Name. This is the maximum length for the COMPLETE_NAME EIR section.
+# If the name length exceeds this size, a SHORT_NAME section is used.
+# Default: 48
+EirMaxNameLength = 180
+
+# Scan duration during interleaving scan. Only used when scanning for ADV
+# monitors. The units are msec.
+# Default: 300
+#AdvMonAllowlistScanDuration=
+# Default: 500
+#AdvMonNoFilterScanDuration=
+
+# Enable/Disable Advertisement Monitor interleave scan for power saving.
+# 0: disable
+# 1: enable
+# Defaults to 1
+#EnableAdvMonInterleaveScan=
+
 [GATT]
 # GATT attribute cache.
 # Possible values:
diff --git a/net-wireless/bluez/files/org.bluez.conf b/net-wireless/bluez/files/org.bluez.conf
index 67a58c7..5001039 100644
--- a/net-wireless/bluez/files/org.bluez.conf
+++ b/net-wireless/bluez/files/org.bluez.conf
@@ -15,6 +15,7 @@
     <allow own="org.bluez"/>
     <allow send_destination="org.bluez"/>
     <allow send_interface="org.bluez.Agent1"/>
+    <allow send_interface="org.bluez.AdvertisementMonitor1"/>
     <allow send_interface="org.bluez.MediaEndpoint1"/>
     <allow send_interface="org.bluez.MediaPlayer1"/>
     <allow send_interface="org.bluez.ThermometerWatcher1"/>
diff --git a/net-wireless/bluez/files/start_bluetoothd.sh b/net-wireless/bluez/files/start_bluetoothd.sh
index 935f761..9ff24aa 100644
--- a/net-wireless/bluez/files/start_bluetoothd.sh
+++ b/net-wireless/bluez/files/start_bluetoothd.sh
@@ -10,9 +10,21 @@
 
 bluetooth_dir="/etc/bluetooth"
 conf_file="${bluetooth_dir}/main.conf"
-config_file_param="--configfile=${conf_file}"
+
+# Make a copy of main.conf to /var to make it editable
+var_conf_file="/var/lib/bluetooth/main.conf"
+cp "${conf_file}" "${var_conf_file}"
+# For security, limit the file permissions to only user "bluetooth".
+chown bluetooth: "${var_conf_file}"
+chmod 0600 "${var_conf_file}"
+# Set the DeviceID based on Chrome OS version.
+os_version="$(awk -F= '$1=="VERSION" { print $2 ;}' /etc/os-release)"
+hex_os_version="$(printf '%04x' "${os_version}")"
+sed -i -E "s/(bluetooth:00e0:c405:)0000/\1${hex_os_version}/" "${var_conf_file}"
+
+config_file_param="--configfile=${var_conf_file}"
 
 exec /sbin/minijail0 -u bluetooth -g bluetooth -G \
   -c 3500 -n -- \
-  /usr/libexec/bluetooth/bluetoothd ${BLUETOOTH_DAEMON_OPTION} --nodetach \
-  ${config_file_param}
+  /usr/libexec/bluetooth/bluetoothd "${BLUETOOTH_DAEMON_OPTION}" --nodetach \
+  "${config_file_param}" --experimental
diff --git a/net-wireless/crda/crda-3.18-r4.ebuild b/net-wireless/crda/crda-3.18-r5.ebuild
similarity index 100%
rename from net-wireless/crda/crda-3.18-r4.ebuild
rename to net-wireless/crda/crda-3.18-r5.ebuild
diff --git a/net-wireless/hostap-test/hostap-test-0.0.1-r16.ebuild b/net-wireless/hostap-test/hostap-test-0.0.1-r16.ebuild
deleted file mode 100644
index 3b50bae..0000000
--- a/net-wireless/hostap-test/hostap-test-0.0.1-r16.ebuild
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EAPI="7"
-CROS_WORKON_COMMIT="7b5cdbe2205ef23907e0cf30867013a5c8d0dffb"
-CROS_WORKON_TREE="be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe"
-CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
-CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
-
-PYTHON_COMPAT=( python3_{6,7} )
-
-inherit cros-workon distutils-r1 toolchain-funcs
-
-DESCRIPTION="Test package for the hostap project, intended for a VM"
-HOMEPAGE="https://w1.fi"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-IUSE="dbus"
-
-REQUIRED_USE="${PYTHON_REQUIRED_USE}"
-
-DEPEND="
-	dev-libs/libnl:3=
-	dev-libs/openssl:0=
-	net-libs/libpcap:=
-"
-
-# pygobject with python3 support requires recent versions (e.g., 3.28.3 --
-# http://crrev.com/c/1869550), but recent versions are more difficult to
-# cross-compile (gobject-introspection, in particular). Leave this behind an
-# optional 'dbus' USE flag for now. Hwsim tests will skip D-Bus tests if
-# libraries aren't available.
-RDEPEND="${DEPEND}
-	${PYTHON_DEPS}
-	dbus? (
-		dev-python/dbus-python[${PYTHON_USEDEP}]
-		dev-python/pygobject[${PYTHON_USEDEP}]
-		sys-apps/dbus
-	)
-	dev-python/pycryptodome[${PYTHON_USEDEP}]
-	dev-python/pyrad[${PYTHON_USEDEP}]
-	net-analyzer/wireshark
-
-	net-wireless/crda
-"
-
-src_unpack() {
-	cros-workon_src_unpack
-}
-
-src_configure() {
-	# Toolchain setup
-	tc-export CC
-
-	cp tests/hwsim/example-wpa_supplicant.config wpa_supplicant/.config || die
-	cp tests/hwsim/example-hostapd.config hostapd/.config || die
-
-	# Disable WPA_TRACE_BFD, and kill any hard-coded /usr/include paths.
-	# TODO(https://crbug.com/1013471): re-enable BFD to run additional
-	# trace-based tests.
-	sed -i \
-		-e '/^CONFIG_WPA_TRACE_BFD=/d' \
-		-e '/^CFLAGS .*\/usr\/include/d' \
-		wpa_supplicant/.config \
-		hostapd/.config || die
-}
-
-# Clean in-between builds, because common code may be built with different
-# configs. See also tests/hwsim/build.sh.
-src_compile() {
-	einfo "Building wlantest"
-	emake -C wlantest V=1
-
-	einfo "Building hostapd"
-	emake -C hostapd clean
-	emake -C hostapd hostapd hostapd_cli hlr_auc_gw V=1
-
-	einfo "Building wpa_supplicant"
-	emake -C wpa_supplicant clean
-	emake -C wpa_supplicant V=1
-}
-
-src_install() {
-	local install_dir="/usr/libexec/hostap"
-	exeinto "${install_dir}"/wlantest
-	doexe wlantest/wlantest wlantest/wlantest_cli wlantest/test_vectors
-
-	dodir "${install_dir}"/tests
-	cp -pPR "${S}"/tests/hwsim "${D}/${install_dir}"/tests || die
-	cp -pPR "${S}"/wpaspy "${D}/${install_dir}" || die
-
-	exeinto "${install_dir}"/hostapd
-	local exe
-	for exe in hostapd hostapd_cli hlr_auc_gw; do
-		doexe "hostapd/${exe}"
-	done
-	exeinto "${install_dir}"/wpa_supplicant
-	for exe in wpa_supplicant wpa_cli; do
-		doexe "wpa_supplicant/${exe}"
-	done
-}
diff --git a/net-wireless/hostap-test/hostap-test-0.0.1-r23.ebuild b/net-wireless/hostap-test/hostap-test-0.0.1-r23.ebuild
new file mode 100644
index 0000000..7f4f468
--- /dev/null
+++ b/net-wireless/hostap-test/hostap-test-0.0.1-r23.ebuild
@@ -0,0 +1,105 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+EAPI="7"
+CROS_WORKON_COMMIT="9b763c4c97260c976214bd386b1dd4511897caef"
+CROS_WORKON_TREE="74699a9c73ae20b236f9031164def0631151f776"
+CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
+CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
+
+PYTHON_COMPAT=( python3_{6,7} )
+
+inherit cros-sanitizers cros-workon distutils-r1 toolchain-funcs
+
+DESCRIPTION="Test package for the hostap project, intended for a VM"
+HOMEPAGE="https://w1.fi"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="dbus"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+DEPEND="
+	dev-libs/libnl:3=
+	dev-libs/openssl:0=
+	net-libs/libpcap:=
+"
+
+# pygobject with python3 support requires recent versions (e.g., 3.28.3 --
+# http://crrev.com/c/1869550), but recent versions are more difficult to
+# cross-compile (gobject-introspection, in particular). Leave this behind an
+# optional 'dbus' USE flag for now. Hwsim tests will skip D-Bus tests if
+# libraries aren't available.
+RDEPEND="${DEPEND}
+	${PYTHON_DEPS}
+	dbus? (
+		dev-python/dbus-python[${PYTHON_USEDEP}]
+		dev-python/pygobject[${PYTHON_USEDEP}]
+		sys-apps/dbus
+	)
+	dev-python/pycryptodome[${PYTHON_USEDEP}]
+	dev-python/pyrad[${PYTHON_USEDEP}]
+	net-analyzer/wireshark
+
+	net-wireless/crda
+"
+
+src_unpack() {
+	cros-workon_src_unpack
+}
+
+src_configure() {
+	sanitizers-setup-env
+	# Toolchain setup
+	tc-export CC
+
+	cp tests/hwsim/example-wpa_supplicant.config wpa_supplicant/.config || die
+	cp tests/hwsim/example-hostapd.config hostapd/.config || die
+
+	# Disable WPA_TRACE_BFD, and kill any hard-coded /usr/include paths.
+	# TODO(https://crbug.com/1013471): re-enable BFD to run additional
+	# trace-based tests.
+	sed -i \
+		-e '/^CONFIG_WPA_TRACE_BFD=/d' \
+		-e '/^CFLAGS .*\/usr\/include/d' \
+		wpa_supplicant/.config \
+		hostapd/.config || die
+}
+
+# Clean in-between builds, because common code may be built with different
+# configs. See also tests/hwsim/build.sh.
+src_compile() {
+	einfo "Building wlantest"
+	emake -C wlantest V=1
+
+	einfo "Building hostapd"
+	emake -C hostapd clean
+	emake -C hostapd hostapd hostapd_cli hlr_auc_gw V=1
+
+	einfo "Building wpa_supplicant"
+	emake -C wpa_supplicant clean
+	emake -C wpa_supplicant V=1
+}
+
+src_install() {
+	local install_dir="/usr/libexec/hostap"
+	exeinto "${install_dir}"/wlantest
+	doexe wlantest/wlantest wlantest/wlantest_cli wlantest/test_vectors
+
+	dodir "${install_dir}"/tests
+	cp -pPR "${S}"/tests/hwsim "${D}/${install_dir}"/tests || die
+	cp -pPR "${S}"/wpaspy "${D}/${install_dir}" || die
+
+	exeinto "${install_dir}"/hostapd
+	local exe
+	for exe in hostapd hostapd_cli hlr_auc_gw; do
+		doexe "hostapd/${exe}"
+	done
+	exeinto "${install_dir}"/wpa_supplicant
+	for exe in wpa_supplicant wpa_cli; do
+		doexe "wpa_supplicant/${exe}"
+	done
+}
diff --git a/net-wireless/hostap-test/hostap-test-9999.ebuild b/net-wireless/hostap-test/hostap-test-9999.ebuild
index cd8ad3b..fb56bfb 100644
--- a/net-wireless/hostap-test/hostap-test-9999.ebuild
+++ b/net-wireless/hostap-test/hostap-test-9999.ebuild
@@ -8,7 +8,7 @@
 
 PYTHON_COMPAT=( python3_{6,7} )
 
-inherit cros-workon distutils-r1 toolchain-funcs
+inherit cros-sanitizers cros-workon distutils-r1 toolchain-funcs
 
 DESCRIPTION="Test package for the hostap project, intended for a VM"
 HOMEPAGE="https://w1.fi"
@@ -50,6 +50,7 @@
 }
 
 src_configure() {
+	sanitizers-setup-env
 	# Toolchain setup
 	tc-export CC
 
diff --git a/net-wireless/hostapd/hostapd-2.9-r138.ebuild b/net-wireless/hostapd/hostapd-2.9-r138.ebuild
deleted file mode 100644
index ab1b442..0000000
--- a/net-wireless/hostapd/hostapd-2.9-r138.ebuild
+++ /dev/null
@@ -1,236 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-CROS_WORKON_COMMIT="7b5cdbe2205ef23907e0cf30867013a5c8d0dffb"
-CROS_WORKON_TREE="be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe"
-CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
-CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
-
-inherit cros-workon toolchain-funcs savedconfig
-
-DESCRIPTION="IEEE 802.11 wireless LAN Host AP daemon"
-HOMEPAGE="http://w1.fi"
-SRC_URI=""
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-IUSE="internal-tls ipv6 libressl logwatch netlink sqlite +suiteb +wps +crda"
-
-DEPEND="
-	libressl? ( dev-libs/libressl:0= )
-	!libressl? (
-		internal-tls? ( dev-libs/libtommath )
-		!internal-tls? ( dev-libs/openssl:0=[-bindist] )
-	)
-	kernel_linux? (
-		dev-libs/libnl:3
-		crda? ( net-wireless/crda )
-	)
-	netlink? ( net-libs/libnfnetlink )
-	sqlite? ( >=dev-db/sqlite-3 )"
-
-RDEPEND="${DEPEND}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/hostapd"
-}
-
-src_configure() {
-	if use internal-tls; then
-		if use libressl; then
-			elog "libressl flag takes precedence over internal-tls"
-		else
-			ewarn "internal-tls implementation is experimental and provides fewer features"
-		fi
-	fi
-
-	local CONFIG="${S}/.config"
-
-	restore_config "${CONFIG}"
-	if [[ -f "${CONFIG}" ]]; then
-		default_src_configure
-		return 0
-	fi
-
-	# toolchain setup
-	echo "CC = $(tc-getCC)" > ${CONFIG}
-
-	# EAP authentication methods
-	echo "CONFIG_EAP=y" >> ${CONFIG}
-	echo "CONFIG_ERP=y" >> ${CONFIG}
-	echo "CONFIG_EAP_MD5=y" >> ${CONFIG}
-	echo "CONFIG_SAE=y" >> ${CONFIG}
-	echo "CONFIG_OWE=y" >> ${CONFIG}
-	echo "CONFIG_DPP=y" >> ${CONFIG}
-
-	if use suiteb; then
-		echo "CONFIG_SUITEB=y" >> ${CONFIG}
-		echo "CONFIG_SUITEB192=y" >> ${CONFIG}
-	fi
-
-	if use internal-tls && ! use libressl; then
-		echo "CONFIG_TLS=internal" >> ${CONFIG}
-	else
-		# SSL authentication methods
-		echo "CONFIG_EAP_FAST=y" >> ${CONFIG}
-		echo "CONFIG_EAP_TLS=y" >> ${CONFIG}
-		echo "CONFIG_EAP_TTLS=y" >> ${CONFIG}
-		echo "CONFIG_EAP_MSCHAPV2=y" >> ${CONFIG}
-		echo "CONFIG_EAP_PEAP=y" >> ${CONFIG}
-		echo "CONFIG_TLSV11=y" >> ${CONFIG}
-		echo "CONFIG_TLSV12=y" >> ${CONFIG}
-		echo "CONFIG_EAP_PWD=y" >> ${CONFIG}
-	fi
-
-	if use wps; then
-		# Enable Wi-Fi Protected Setup
-		echo "CONFIG_WPS=y" >> ${CONFIG}
-		echo "CONFIG_WPS2=y" >> ${CONFIG}
-		echo "CONFIG_WPS_UPNP=y" >> ${CONFIG}
-		echo "CONFIG_WPS_NFC=y" >> ${CONFIG}
-		einfo "Enabling Wi-Fi Protected Setup support"
-	fi
-
-	echo "CONFIG_EAP_IKEV2=y" >> ${CONFIG}
-	echo "CONFIG_EAP_TNC=y" >> ${CONFIG}
-	echo "CONFIG_EAP_GTC=y" >> ${CONFIG}
-	echo "CONFIG_EAP_SIM=y" >> ${CONFIG}
-	echo "CONFIG_EAP_AKA=y" >> ${CONFIG}
-	echo "CONFIG_EAP_AKA_PRIME=y" >> ${CONFIG}
-	echo "CONFIG_EAP_EKE=y" >> ${CONFIG}
-	echo "CONFIG_EAP_FAST=y" >> ${CONFIG}
-	echo "CONFIG_EAP_PAX=y" >> ${CONFIG}
-	echo "CONFIG_EAP_PSK=y" >> ${CONFIG}
-	echo "CONFIG_EAP_SAKE=y" >> ${CONFIG}
-	echo "CONFIG_EAP_GPSK=y" >> ${CONFIG}
-	echo "CONFIG_EAP_GPSK_SHA256=y" >> ${CONFIG}
-	echo "CONFIG_EAP_UNAUTH_TLS=y" >> ${CONFIG}
-	echo "CONFIG_EAP_VENDOR_TEST=y" >> ${CONFIG}
-
-	einfo "Enabling drivers: "
-
-	# drivers
-	echo "CONFIG_DRIVER_HOSTAP=y" >> ${CONFIG}
-	einfo "  HostAP driver enabled"
-	echo "CONFIG_DRIVER_WIRED=y" >> ${CONFIG}
-	einfo "  Wired driver enabled"
-	echo "CONFIG_DRIVER_NONE=y" >> ${CONFIG}
-	einfo "  None driver enabled"
-
-	einfo "  nl80211 driver enabled"
-	echo "CONFIG_DRIVER_NL80211=y" >> ${CONFIG}
-
-	# epoll
-	echo "CONFIG_ELOOP_EPOLL=y" >> ${CONFIG}
-
-	# misc
-	echo "CONFIG_DEBUG_FILE=y" >> ${CONFIG}
-	echo "CONFIG_PKCS12=y" >> ${CONFIG}
-	echo "CONFIG_RADIUS_SERVER=y" >> ${CONFIG}
-	echo "CONFIG_IAPP=y" >> ${CONFIG}
-	echo "CONFIG_IEEE80211R=y" >> ${CONFIG}
-	echo "CONFIG_IEEE80211W=y" >> ${CONFIG}
-	echo "CONFIG_IEEE80211N=y" >> ${CONFIG}
-	echo "CONFIG_IEEE80211AC=y" >> ${CONFIG}
-	echo "CONFIG_PEERKEY=y" >> ${CONFIG}
-	echo "CONFIG_RSN_PREAUTH=y" >> ${CONFIG}
-	echo "CONFIG_INTERWORKING=y" >> ${CONFIG}
-	echo "CONFIG_FULL_DYNAMIC_VLAN=y" >> ${CONFIG}
-	echo "CONFIG_HS20=y" >> ${CONFIG}
-	echo "CONFIG_WNM=y" >> ${CONFIG}
-	echo "CONFIG_FST=y" >> ${CONFIG}
-	echo "CONFIG_FST_TEST=y" >> ${CONFIG}
-	echo "CONFIG_ACS=y" >> ${CONFIG}
-
-	if use netlink; then
-		# Netlink support
-		echo "CONFIG_VLAN_NETLINK=y" >> ${CONFIG}
-	fi
-
-	if use ipv6; then
-		# IPv6 support
-		echo "CONFIG_IPV6=y" >> ${CONFIG}
-	fi
-
-	if use sqlite; then
-		# Sqlite support
-		echo "CONFIG_SQLITE=y" >> ${CONFIG}
-	fi
-
-	# If we are using libnl 2.0 and above, enable support for it
-	# Removed for now, since the 3.2 version is broken, and we don't
-	# support it.
-	if has_version ">=dev-libs/libnl-3.2"; then
-		echo "CONFIG_LIBNL32=y" >> .config
-	fi
-
-	# TODO: Add support for BSD drivers
-
-	default
-}
-
-src_compile() {
-	emake V=1
-
-	if use libressl || ! use internal-tls; then
-		emake V=1 nt_password_hash
-		emake V=1 hlr_auc_gw
-	fi
-}
-
-src_install() {
-	dosbin ${PN}
-	dobin ${PN}_cli
-
-	if use libressl || ! use internal-tls; then
-		dobin nt_password_hash hlr_auc_gw
-	fi
-
-	doman ${PN}{.8,_cli.1}
-
-	dodoc ChangeLog README
-	use wps && dodoc README-WPS
-
-	docinto examples
-	dodoc wired.conf
-
-	if use logwatch; then
-		insinto /etc/log.d/conf/services/
-		doins logwatch/${PN}.conf
-
-		exeinto /etc/log.d/scripts/services/
-		doexe logwatch/${PN}
-	fi
-
-	save_config .config
-}
-
-pkg_postinst() {
-	einfo
-	einfo "If you are running openRC you need to follow this instructions:"
-	einfo "In order to use ${PN} you need to set up your wireless card"
-	einfo "for master mode in /etc/conf.d/net and then start"
-	einfo "/etc/init.d/${PN}."
-	einfo
-	einfo "Example configuration:"
-	einfo
-	einfo "config_wlan0=( \"192.168.1.1/24\" )"
-	einfo "channel_wlan0=\"6\""
-	einfo "essid_wlan0=\"test\""
-	einfo "mode_wlan0=\"master\""
-	einfo
-	#if [ -e "${KV_DIR}"/net/mac80211 ]; then
-	#	einfo "This package now compiles against the headers installed by"
-	#	einfo "the kernel source for the mac80211 driver. You should "
-	#	einfo "re-emerge ${PN} after upgrading your kernel source."
-	#fi
-
-	if use wps; then
-		einfo "You have enabled Wi-Fi Protected Setup support, please"
-		einfo "read the README-WPS file in /usr/share/doc/${P}"
-		einfo "for info on how to use WPS"
-	fi
-}
diff --git a/net-wireless/hostapd/hostapd-2.9-r145.ebuild b/net-wireless/hostapd/hostapd-2.9-r145.ebuild
new file mode 100644
index 0000000..0477889
--- /dev/null
+++ b/net-wireless/hostapd/hostapd-2.9-r145.ebuild
@@ -0,0 +1,250 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+CROS_WORKON_COMMIT="9b763c4c97260c976214bd386b1dd4511897caef"
+CROS_WORKON_TREE="74699a9c73ae20b236f9031164def0631151f776"
+CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
+CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
+
+inherit cros-workon toolchain-funcs savedconfig
+
+DESCRIPTION="IEEE 802.11 wireless LAN Host AP daemon"
+HOMEPAGE="http://w1.fi"
+SRC_URI=""
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="internal-tls ipv6 libressl logwatch netlink sqlite +suiteb +wps +crda"
+
+DEPEND="
+	libressl? ( dev-libs/libressl:0= )
+	!libressl? (
+		internal-tls? ( dev-libs/libtommath )
+		!internal-tls? ( dev-libs/openssl:0=[-bindist] )
+	)
+	kernel_linux? (
+		dev-libs/libnl:3
+		crda? ( net-wireless/crda )
+	)
+	netlink? ( net-libs/libnfnetlink )
+	sqlite? ( >=dev-db/sqlite-3 )"
+
+RDEPEND="${DEPEND}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/hostapd"
+}
+
+src_configure() {
+	if use internal-tls; then
+		if use libressl; then
+			elog "libressl flag takes precedence over internal-tls"
+		else
+			ewarn "internal-tls implementation is experimental and provides fewer features"
+		fi
+	fi
+
+	local CONFIG="${S}/.config"
+
+	restore_config "${CONFIG}"
+	if [[ -f "${CONFIG}" ]]; then
+		default_src_configure
+		return 0
+	fi
+
+	# toolchain setup
+	echo "CC = $(tc-getCC)" > ${CONFIG}
+
+	# EAP authentication methods
+	echo "CONFIG_EAP=y" >> ${CONFIG}
+	echo "CONFIG_ERP=y" >> ${CONFIG}
+	echo "CONFIG_EAP_MD5=y" >> ${CONFIG}
+	echo "CONFIG_SAE=y" >> ${CONFIG}
+	echo "CONFIG_OWE=y" >> ${CONFIG}
+	echo "CONFIG_DPP=y" >> ${CONFIG}
+
+	if use suiteb; then
+		echo "CONFIG_SUITEB=y" >> ${CONFIG}
+		echo "CONFIG_SUITEB192=y" >> ${CONFIG}
+	fi
+
+	if use internal-tls && ! use libressl; then
+		echo "CONFIG_TLS=internal" >> ${CONFIG}
+	else
+		# SSL authentication methods
+		echo "CONFIG_EAP_FAST=y" >> ${CONFIG}
+		echo "CONFIG_EAP_TLS=y" >> ${CONFIG}
+		echo "CONFIG_EAP_TTLS=y" >> ${CONFIG}
+		echo "CONFIG_EAP_MSCHAPV2=y" >> ${CONFIG}
+		echo "CONFIG_EAP_PEAP=y" >> ${CONFIG}
+		echo "CONFIG_TLSV11=y" >> ${CONFIG}
+		echo "CONFIG_TLSV12=y" >> ${CONFIG}
+		echo "CONFIG_EAP_PWD=y" >> ${CONFIG}
+	fi
+
+	if use wps; then
+		# Enable Wi-Fi Protected Setup
+		echo "CONFIG_WPS=y" >> ${CONFIG}
+		echo "CONFIG_WPS2=y" >> ${CONFIG}
+		echo "CONFIG_WPS_UPNP=y" >> ${CONFIG}
+		echo "CONFIG_WPS_NFC=y" >> ${CONFIG}
+		einfo "Enabling Wi-Fi Protected Setup support"
+	fi
+
+	echo "CONFIG_EAP_IKEV2=y" >> ${CONFIG}
+	echo "CONFIG_EAP_TNC=y" >> ${CONFIG}
+	echo "CONFIG_EAP_GTC=y" >> ${CONFIG}
+	echo "CONFIG_EAP_SIM=y" >> ${CONFIG}
+	echo "CONFIG_EAP_AKA=y" >> ${CONFIG}
+	echo "CONFIG_EAP_AKA_PRIME=y" >> ${CONFIG}
+	echo "CONFIG_EAP_EKE=y" >> ${CONFIG}
+	echo "CONFIG_EAP_FAST=y" >> ${CONFIG}
+	echo "CONFIG_EAP_PAX=y" >> ${CONFIG}
+	echo "CONFIG_EAP_PSK=y" >> ${CONFIG}
+	echo "CONFIG_EAP_SAKE=y" >> ${CONFIG}
+	echo "CONFIG_EAP_GPSK=y" >> ${CONFIG}
+	echo "CONFIG_EAP_GPSK_SHA256=y" >> ${CONFIG}
+	echo "CONFIG_EAP_UNAUTH_TLS=y" >> ${CONFIG}
+	echo "CONFIG_EAP_VENDOR_TEST=y" >> ${CONFIG}
+
+	einfo "Enabling drivers: "
+
+	# drivers
+	echo "CONFIG_DRIVER_HOSTAP=y" >> ${CONFIG}
+	einfo "  HostAP driver enabled"
+	echo "CONFIG_DRIVER_WIRED=y" >> ${CONFIG}
+	einfo "  Wired driver enabled"
+	echo "CONFIG_DRIVER_NONE=y" >> ${CONFIG}
+	einfo "  None driver enabled"
+
+	einfo "  nl80211 driver enabled"
+	echo "CONFIG_DRIVER_NL80211=y" >> ${CONFIG}
+
+	# epoll
+	echo "CONFIG_ELOOP_EPOLL=y" >> ${CONFIG}
+
+	# misc
+	echo "CONFIG_DEBUG_FILE=y" >> ${CONFIG}
+	echo "CONFIG_PKCS12=y" >> ${CONFIG}
+	echo "CONFIG_RADIUS_SERVER=y" >> ${CONFIG}
+	echo "CONFIG_IAPP=y" >> ${CONFIG}
+	echo "CONFIG_IEEE80211R=y" >> ${CONFIG}
+	echo "CONFIG_IEEE80211W=y" >> ${CONFIG}
+	echo "CONFIG_IEEE80211N=y" >> ${CONFIG}
+	echo "CONFIG_IEEE80211AC=y" >> ${CONFIG}
+	echo "CONFIG_PEERKEY=y" >> ${CONFIG}
+	echo "CONFIG_RSN_PREAUTH=y" >> ${CONFIG}
+	echo "CONFIG_INTERWORKING=y" >> ${CONFIG}
+	echo "CONFIG_FULL_DYNAMIC_VLAN=y" >> ${CONFIG}
+	echo "CONFIG_HS20=y" >> ${CONFIG}
+	echo "CONFIG_WNM=y" >> ${CONFIG}
+	echo "CONFIG_FST=y" >> ${CONFIG}
+	echo "CONFIG_FST_TEST=y" >> ${CONFIG}
+	echo "CONFIG_ACS=y" >> ${CONFIG}
+
+	# Disable random pool to work-around the slow random entropy
+	# generation on whirlwind. (See: crbug.com/1114912#c9)
+	# This is safe now because:
+	# 1. We now only use hostapd for tests. (on test APs or in
+	#    network.Ethernet8021X.* tests.)
+	# 2. The random pool (and entropy estimations) seem to mostly be
+	#    designed to guard against lack of initial entropy on a fresh
+	#    boot, but they run at every startup. In the presence of many
+	#    hostapd restarts, when "available entropy" gets drained by
+	#    hostapd, /dev/urandom should still be seeded with enough entropy.
+	# However, if we want to launch AP support in CrOS, it would be better
+	# to re-evaluate this with security experts.
+	echo "CONFIG_NO_RANDOM_POOL=y" >> ${CONFIG}
+
+	if use netlink; then
+		# Netlink support
+		echo "CONFIG_VLAN_NETLINK=y" >> ${CONFIG}
+	fi
+
+	if use ipv6; then
+		# IPv6 support
+		echo "CONFIG_IPV6=y" >> ${CONFIG}
+	fi
+
+	if use sqlite; then
+		# Sqlite support
+		echo "CONFIG_SQLITE=y" >> ${CONFIG}
+	fi
+
+	# If we are using libnl 2.0 and above, enable support for it
+	# Removed for now, since the 3.2 version is broken, and we don't
+	# support it.
+	if has_version ">=dev-libs/libnl-3.2"; then
+		echo "CONFIG_LIBNL32=y" >> .config
+	fi
+
+	# TODO: Add support for BSD drivers
+
+	default
+}
+
+src_compile() {
+	emake V=1
+
+	if use libressl || ! use internal-tls; then
+		emake V=1 nt_password_hash
+		emake V=1 hlr_auc_gw
+	fi
+}
+
+src_install() {
+	dosbin ${PN}
+	dobin ${PN}_cli
+
+	if use libressl || ! use internal-tls; then
+		dobin nt_password_hash hlr_auc_gw
+	fi
+
+	doman ${PN}{.8,_cli.1}
+
+	dodoc ChangeLog README
+	use wps && dodoc README-WPS
+
+	docinto examples
+	dodoc wired.conf
+
+	if use logwatch; then
+		insinto /etc/log.d/conf/services/
+		doins logwatch/${PN}.conf
+
+		exeinto /etc/log.d/scripts/services/
+		doexe logwatch/${PN}
+	fi
+
+	save_config .config
+}
+
+pkg_postinst() {
+	einfo
+	einfo "If you are running openRC you need to follow this instructions:"
+	einfo "In order to use ${PN} you need to set up your wireless card"
+	einfo "for master mode in /etc/conf.d/net and then start"
+	einfo "/etc/init.d/${PN}."
+	einfo
+	einfo "Example configuration:"
+	einfo
+	einfo "config_wlan0=( \"192.168.1.1/24\" )"
+	einfo "channel_wlan0=\"6\""
+	einfo "essid_wlan0=\"test\""
+	einfo "mode_wlan0=\"master\""
+	einfo
+	#if [ -e "${KV_DIR}"/net/mac80211 ]; then
+	#	einfo "This package now compiles against the headers installed by"
+	#	einfo "the kernel source for the mac80211 driver. You should "
+	#	einfo "re-emerge ${PN} after upgrading your kernel source."
+	#fi
+
+	if use wps; then
+		einfo "You have enabled Wi-Fi Protected Setup support, please"
+		einfo "read the README-WPS file in /usr/share/doc/${P}"
+		einfo "for info on how to use WPS"
+	fi
+}
diff --git a/net-wireless/hostapd/hostapd-9999.ebuild b/net-wireless/hostapd/hostapd-9999.ebuild
index 6c387d4..3e3a4f8 100644
--- a/net-wireless/hostapd/hostapd-9999.ebuild
+++ b/net-wireless/hostapd/hostapd-9999.ebuild
@@ -143,6 +143,20 @@
 	echo "CONFIG_FST_TEST=y" >> ${CONFIG}
 	echo "CONFIG_ACS=y" >> ${CONFIG}
 
+	# Disable random pool to work-around the slow random entropy
+	# generation on whirlwind. (See: crbug.com/1114912#c9)
+	# This is safe now because:
+	# 1. We now only use hostapd for tests. (on test APs or in
+	#    network.Ethernet8021X.* tests.)
+	# 2. The random pool (and entropy estimations) seem to mostly be
+	#    designed to guard against lack of initial entropy on a fresh
+	#    boot, but they run at every startup. In the presence of many
+	#    hostapd restarts, when "available entropy" gets drained by
+	#    hostapd, /dev/urandom should still be seeded with enough entropy.
+	# However, if we want to launch AP support in CrOS, it would be better
+	# to re-evaluate this with security experts.
+	echo "CONFIG_NO_RANDOM_POOL=y" >> ${CONFIG}
+
 	if use netlink; then
 		# Netlink support
 		echo "CONFIG_VLAN_NETLINK=y" >> ${CONFIG}
diff --git a/net-wireless/wpa_supplicant-2_8/files/init/wpasupplicant.conf b/net-wireless/wpa_supplicant-2_8/files/init/wpasupplicant.conf
index 62137c5..f9f4d1a 100644
--- a/net-wireless/wpa_supplicant-2_8/files/init/wpasupplicant.conf
+++ b/net-wireless/wpa_supplicant-2_8/files/init/wpasupplicant.conf
@@ -15,6 +15,10 @@
 env OPENSSL_CHROMIUM_SKIP_TRUSTED_PURPOSE_CHECK=1
 env OPENSSL_CHROMIUM_GENERATE_METRICS=1
 
+# https://crbug.com/783125: "started boot-services" is relatively early in the
+# boot process. This is necessary for getting online quickly, a metric which we
+# optimize for alongside "time to login screen," because networking is a
+# critical service.
 start on started boot-services
 stop on stopping boot-services
 respawn
diff --git a/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r30.ebuild b/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r30.ebuild
deleted file mode 100644
index b88f988..0000000
--- a/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r30.ebuild
+++ /dev/null
@@ -1,436 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-CROS_WORKON_COMMIT="bd2b932596ddf6e00ac261cf09a311e7ef015ad5"
-CROS_WORKON_TREE="e7bbf2103885cc82892cbe36273a8e59e065ae0e"
-CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
-CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.8"
-CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.8"
-
-inherit cros-workon eutils toolchain-funcs qmake-utils systemd user
-
-DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
-# HOMEPAGE="https://w1.fi/wpa_supplicant/"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/hostap"
-LICENSE="|| ( GPL-2 BSD )"
-
-SLOT="0"
-KEYWORDS="*"
-IUSE="ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
-REQUIRED_USE="fasteap? ( !gnutls !ssl ) smartcard? ( ssl )"
-
-CDEPEND="
-	chromeos-base/minijail
-	dbus? ( sys-apps/dbus )
-	kernel_linux? (
-		dev-libs/libnl:3
-		net-wireless/crda
-	)
-	!kernel_linux? ( net-libs/libpcap )
-	qt5? (
-		dev-qt/qtcore:5
-		dev-qt/qtgui:5
-		dev-qt/qtwidgets:5
-		dev-qt/qtsvg:5
-	)
-	readline? (
-		sys-libs/ncurses:0
-		sys-libs/readline:0
-	)
-	ssl? (
-		!libressl? ( dev-libs/openssl:0= )
-		libressl? ( dev-libs/libressl )
-	)
-	smartcard? ( dev-libs/engine_pkcs11 )
-	!ssl? (
-		gnutls? (
-			net-libs/gnutls
-			dev-libs/libgcrypt
-		)
-		!gnutls? ( dev-libs/libtommath )
-	)
-"
-DEPEND="${CDEPEND}
-	virtual/pkgconfig
-"
-RDEPEND="${CDEPEND}
-	!net-wireless/wpa_supplicant
-	selinux? ( sec-policy/selinux-networkmanager )
-"
-
-# S="${WORKDIR}/${P}/${PN}"
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/wpa_supplicant"
-}
-
-Kconfig_style_config() {
-		#param 1 is CONFIG_* item
-		#param 2 is what to set it = to, defaulting in y
-		CONFIG_PARAM="${CONFIG_HEADER:-CONFIG_}$1"
-		setting="${2:-y}"
-
-		if [ ! $setting = n ]; then
-			#first remove any leading "# " if $2 is not n
-			sed -i "/^# *$CONFIG_PARAM=/s/^# *//" .config || echo "Kconfig_style_config error uncommenting $CONFIG_PARAM"
-			#set item = $setting (defaulting to y)
-			sed -i "/^$CONFIG_PARAM/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
-			if [ -z "$( grep ^$CONFIG_PARAM= .config )" ] ; then
-				echo "$CONFIG_PARAM=$setting" >>.config
-			fi
-		else
-			#ensure item commented out
-			sed -i "/^$CONFIG_PARAM/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
-		fi
-}
-
-pkg_setup() {
-	if use gnutls && use ssl ; then
-		elog "You have both 'gnutls' and 'ssl' USE flags enabled: defaulting to USE=\"ssl\""
-	fi
-}
-
-src_prepare() {
-	# net/bpf.h needed for net-libs/libpcap on Gentoo/FreeBSD
-	sed -i \
-		-e "s:\(#include <pcap\.h>\):#include <net/bpf.h>\n\1:" \
-		../src/l2_packet/l2_packet_freebsd.c || die
-
-	# People seem to take the example configuration file too literally (bug #102361)
-	sed -i \
-		-e "s:^\(opensc_engine_path\):#\1:" \
-		-e "s:^\(pkcs11_engine_path\):#\1:" \
-		-e "s:^\(pkcs11_module_path\):#\1:" \
-		wpa_supplicant.conf || die
-
-	# Change configuration to match Gentoo locations (bug #143750)
-	sed -i \
-		-e "s:/usr/lib/opensc:/usr/$(get_libdir):" \
-		-e "s:/usr/lib/pkcs11:/usr/$(get_libdir):" \
-		wpa_supplicant.conf || die
-
-	# systemd entries to D-Bus service files (bug #372877)
-	# echo 'SystemdService=wpa_supplicant.service' \
-	# 	| tee -a dbus/*.service >/dev/null || die
-
-	cd "${WORKDIR}/${P}" || die
-
-	if use wimax; then
-		# generate-libeap-peer.patch comes before
-		# fix-undefined-reference-to-random_get_bytes.patch
-		# epatch "${FILESDIR}/${P}-generate-libeap-peer.patch"
-
-		# multilib-strict fix (bug #373685)
-		sed -e "s/\/usr\/lib/\/usr\/$(get_libdir)/" -i src/eap_peer/Makefile || die
-	fi
-
-	# bug (320097)
-	# epatch "${FILESDIR}/${P}-do-not-call-dbus-functions-with-NULL-path.patch"
-
-	# TODO - NEED TESTING TO SEE IF STILL NEEDED, NOT COMPATIBLE WITH 1.0 OUT OF THE BOX,
-	# SO WOULD BE NICE TO JUST DROP IT, IF IT IS NOT NEEDED.
-	# bug (374089)
-	#epatch "${FILESDIR}/${P}-dbus-WPAIE-fix.patch"
-
-	# bug (565270)
-	# epatch "${FILESDIR}/${P}-libressl.patch"
-	default
-}
-
-src_configure() {
-	# Toolchain setup
-	tc-export CC
-
-	cp defconfig .config || die
-
-	# Basic setup
-	Kconfig_style_config CTRL_IFACE
-	Kconfig_style_config BACKEND file
-	Kconfig_style_config IBSS_RSN
-	Kconfig_style_config IEEE80211W
-	Kconfig_style_config IEEE80211R
-	Kconfig_style_config IEEE80211N
-	Kconfig_style_config IEEE80211AC
-	Kconfig_style_config WNM
-
-	# Basic authentication methods
-	# NOTE: we don't set GPSK or SAKE as they conflict
-	# with the below options
-	Kconfig_style_config EAP_GTC
-	Kconfig_style_config EAP_MD5
-	Kconfig_style_config EAP_OTP
-	Kconfig_style_config EAP_PAX
-	Kconfig_style_config EAP_PSK
-	Kconfig_style_config EAP_TLV
-	Kconfig_style_config EAP_EXE
-	Kconfig_style_config IEEE8021X_EAPOL
-	Kconfig_style_config PKCS12
-	Kconfig_style_config PEERKEY
-	Kconfig_style_config EAP_LEAP
-	Kconfig_style_config EAP_MSCHAPV2
-	Kconfig_style_config EAP_PEAP
-	Kconfig_style_config EAP_TLS
-	Kconfig_style_config EAP_TTLS
-
-	# Enabling background scanning.
-	Kconfig_style_config BGSCAN_SIMPLE
-	Kconfig_style_config BGSCAN_LEARN
-
-	# Allow VHT/HT parameters to be overriden; required by ChromiumOS
-	Kconfig_style_config VHT_OVERRIDES
-	Kconfig_style_config HT_OVERRIDES
-
-	if use dbus ; then
-		Kconfig_style_config CTRL_IFACE_DBUS
-		Kconfig_style_config CTRL_IFACE_DBUS_NEW
-		Kconfig_style_config CTRL_IFACE_DBUS_INTRO
-	fi
-
-	# Enable support for writing debug info to a log file and syslog.
-	Kconfig_style_config DEBUG_FILE
-	Kconfig_style_config DEBUG_SYSLOG
-	Kconfig_style_config DEBUG_SYSLOG_FACILITY LOG_LOCAL6
-
-	if use hs2-0 ; then
-		Kconfig_style_config INTERWORKING
-		Kconfig_style_config HS20
-	fi
-
-	if use uncommon-eap-types; then
-		Kconfig_style_config EAP_GPSK
-		Kconfig_style_config EAP_SAKE
-		Kconfig_style_config EAP_GPSK_SHA256
-		Kconfig_style_config EAP_IKEV2
-		Kconfig_style_config EAP_EKE
-	fi
-
-	if use eap-sim ; then
-		# Smart card authentication
-		Kconfig_style_config EAP_SIM
-		Kconfig_style_config EAP_AKA
-		Kconfig_style_config EAP_AKA_PRIME
-		# CHROMIUM: We don't have smartcard support. Instead include the
-		# client library for external processing via the control interface.
-		# Kconfig_style_config PCSC
-		Kconfig_style_config BUILD_WPA_CLIENT_SO
-	fi
-
-	if use fasteap ; then
-		Kconfig_style_config EAP_FAST
-	fi
-
-	if use readline ; then
-		# readline/history support for wpa_cli
-		Kconfig_style_config READLINE
-	else
-		#internal line edit mode for wpa_cli
-		Kconfig_style_config WPA_CLI_EDIT
-	fi
-
-	# SSL authentication methods
-	if use ssl ; then
-		Kconfig_style_config TLS openssl
-	elif use gnutls ; then
-		Kconfig_style_config TLS gnutls
-		Kconfig_style_config GNUTLS_EXTRA
-	else
-		Kconfig_style_config TLS internal
-	fi
-
-	if use smartcard ; then
-		Kconfig_style_config SMARTCARD
-	fi
-
-	if use tdls ; then
-		Kconfig_style_config TDLS
-	fi
-
-	if use kernel_linux ; then
-		# Linux specific drivers
-		# Kconfig_style_config DRIVER_ATMEL
-		# Kconfig_style_config DRIVER_HOSTAP
-		# Kconfig_style_config DRIVER_IPW
-		Kconfig_style_config DRIVER_NL80211
-		# Kconfig_style_config DRIVER_RALINK
-		Kconfig_style_config DRIVER_WEXT
-		Kconfig_style_config DRIVER_WIRED
-
-		if use ps3 ; then
-			Kconfig_style_config DRIVER_PS3
-		fi
-
-	elif use kernel_FreeBSD ; then
-		# FreeBSD specific driver
-		Kconfig_style_config DRIVER_BSD
-	fi
-
-	# Wi-Fi Protected Setup (WPS)
-	if use wps ; then
-		Kconfig_style_config WPS
-		Kconfig_style_config WPS2
-		# USB Flash Drive
-		Kconfig_style_config WPS_UFD
-		# External Registrar
-		Kconfig_style_config WPS_ER
-		# Universal Plug'n'Play
-		Kconfig_style_config WPS_UPNP
-		# Near Field Communication
-		Kconfig_style_config WPS_NFC
-	else
-		# (ChromeOS) Explicitly disable to override enabling from defconfig.
-		Kconfig_style_config WPS      n
-		Kconfig_style_config WPS2     n
-		Kconfig_style_config WPS_UFD  n
-		Kconfig_style_config WPS_ER   n
-		Kconfig_style_config WPS_UPNP n
-		Kconfig_style_config WPS_NFC  n
-	fi
-
-	# Wi-Fi Direct (WiDi)
-	if use p2p ; then
-		Kconfig_style_config P2P
-		Kconfig_style_config WIFI_DISPLAY
-	else
-		Kconfig_style_config P2P n
-		Kconfig_style_config WIFI_DISPLAY n
-	fi
-
-	# Access Point Mode
-	if use ap ; then
-		Kconfig_style_config AP
-		# only AP currently support mesh networks.
-		Kconfig_style_config MESH
-	else
-		# (ChromeOS) Explicitly disable to override enabling from defconfig.
-		Kconfig_style_config AP        n
-		Kconfig_style_config MESH      n
-	fi
-
-	# Enable mitigation against certain attacks against TKIP
-	Kconfig_style_config DELAYED_MIC_ERROR_REPORT
-
-	if use qt5 ; then
-		pushd "${S}"/wpa_gui-qt4 > /dev/null || die
-		eqmake5 wpa_gui.pro
-		popd > /dev/null || die
-	fi
-}
-
-src_compile() {
-	einfo "Building wpa_supplicant"
-	emake V=1 BINDIR=/usr/sbin
-
-	if use wimax; then
-		emake -C ../src/eap_peer clean
-		emake -C ../src/eap_peer
-	fi
-
-	if use qt5; then
-		einfo "Building wpa_gui"
-		emake -C "${S}"/wpa_gui-qt4
-	fi
-}
-
-src_install() {
-	dosbin wpa_supplicant
-	dobin wpa_cli wpa_passphrase
-
-	# baselayout-1 compat
-	if has_version "<sys-apps/baselayout-2.0.0"; then
-		dodir /sbin
-		dosym /usr/sbin/wpa_supplicant /sbin/wpa_supplicant
-		dodir /bin
-		dosym /usr/bin/wpa_cli /bin/wpa_cli
-	fi
-
-	if has_version ">=sys-apps/openrc-0.5.0"; then
-		newinitd "${FILESDIR}/${PN}-init.d" wpa_supplicant
-		newconfd "${FILESDIR}/${PN}-conf.d" wpa_supplicant
-	fi
-
-	dodoc ChangeLog {eap_testing,todo}.txt README{,-WPS} \
-		wpa_supplicant.conf
-
-	newdoc .config build-config
-
-	# CHROMIUM: sorry, don't want docs installed
-	# doman doc/docbook/*.{5,8}
-
-	if use qt5 ; then
-		into /usr
-		dobin wpa_gui-qt4/wpa_gui
-		doicon wpa_gui-qt4/icons/wpa_gui.svg
-		make_desktop_entry wpa_gui "WPA Supplicant Administration GUI" "wpa_gui" "Qt;Network;"
-	fi
-
-	use wimax && emake DESTDIR="${D}" -C ../src/eap_peer install
-
-	if use eap-sim ; then
-		# Install this library and header for the external processor.
-		dolib.so libwpa_client.so
-
-		insinto /usr/include/wpa_supplicant
-		doins ../src/common/wpa_ctrl.h
-	fi
-
-	if use dbus ; then
-		# DBus introspection XML file.
-		insinto /usr/share/dbus-1/interfaces
-		doins ${FILESDIR}/dbus_bindings/fi.w1.wpa_supplicant1.xml || die
-		insinto /etc/dbus-1/system.d
-		# Allow (but don't require) wpa_supplicant to run as root only
-		# when building hwsim targets.
-		if use wifi_hostap_test; then
-			newins "${FILESDIR}"/dbus_permissions/root_fi.w1.wpa_supplicant1.conf \
-				fi.w1.wpa_supplicant1.conf
-		else
-			doins "${FILESDIR}"/dbus_permissions/fi.w1.wpa_supplicant1.conf
-		fi
-
-		popd > /dev/null
-	fi
-	# Install the init scripts
-	if use systemd; then
-		insinto /usr/share
-		systemd_dounit ${FILESDIR}/init/wpasupplicant.service
-		systemd_enable_service boot-services.target wpasupplicant.service
-		systemd_dotmpfilesd ${FILESDIR}/init/wpasupplicant-directories.conf
-	else
-		insinto /etc/init
-		doins ${FILESDIR}/init/wpasupplicant.conf
-	fi
-}
-
-pkg_preinst() {
-	enewuser "wpa"
-	enewgroup "wpa"
-}
-
-pkg_postinst() {
-	elog "If this is a clean installation of wpa_supplicant, you"
-	elog "have to create a configuration file named"
-	elog "/etc/wpa_supplicant/wpa_supplicant.conf"
-	elog
-	elog "An example configuration file is available for reference in"
-	elog "/usr/share/doc/${PF}/"
-
-	if [[ -e ${ROOT}etc/wpa_supplicant.conf ]] ; then
-		echo
-		ewarn "WARNING: your old configuration file ${ROOT}etc/wpa_supplicant.conf"
-		ewarn "needs to be moved to ${ROOT}etc/wpa_supplicant/wpa_supplicant.conf"
-	fi
-
-	# Mea culpa, feel free to remove that after some time --mgorny.
-	# local fn
-	# for fn in wpa_supplicant{,@wlan0}.service; do
-	# 	if [[ -e "${ROOT}"/etc/systemd/system/network.target.wants/${fn} ]]
-	# 	then
-	# 		ebegin "Moving ${fn} to multi-user.target"
-	# 		mv "${ROOT}"/etc/systemd/system/network.target.wants/${fn} \
-	# 			"${ROOT}"/etc/systemd/system/multi-user.target.wants/
-	# 		eend ${?} \
-	# 			"Please try to re-enable ${fn}"
-	# 	fi
-	# done
-}
diff --git a/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r35.ebuild b/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r35.ebuild
new file mode 100644
index 0000000..fffd600
--- /dev/null
+++ b/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-2.8-r35.ebuild
@@ -0,0 +1,437 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+CROS_WORKON_COMMIT="240cb8214397fc9e08b27af29c98cf2685f6e7a4"
+CROS_WORKON_TREE="0406e55a76c2afc3942a37c110ad9077087d18bd"
+CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
+CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.8"
+CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.8"
+
+inherit cros-sanitizers cros-workon eutils toolchain-funcs qmake-utils systemd user
+
+DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
+# HOMEPAGE="https://w1.fi/wpa_supplicant/"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/hostap"
+LICENSE="|| ( GPL-2 BSD )"
+
+SLOT="0"
+KEYWORDS="*"
+IUSE="ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
+REQUIRED_USE="fasteap? ( !gnutls !ssl ) smartcard? ( ssl )"
+
+CDEPEND="
+	chromeos-base/minijail
+	dbus? ( sys-apps/dbus )
+	kernel_linux? (
+		dev-libs/libnl:3
+		net-wireless/crda
+	)
+	!kernel_linux? ( net-libs/libpcap )
+	qt5? (
+		dev-qt/qtcore:5
+		dev-qt/qtgui:5
+		dev-qt/qtwidgets:5
+		dev-qt/qtsvg:5
+	)
+	readline? (
+		sys-libs/ncurses:0
+		sys-libs/readline:0
+	)
+	ssl? (
+		!libressl? ( dev-libs/openssl:0= )
+		libressl? ( dev-libs/libressl )
+	)
+	smartcard? ( dev-libs/engine_pkcs11 )
+	!ssl? (
+		gnutls? (
+			net-libs/gnutls
+			dev-libs/libgcrypt
+		)
+		!gnutls? ( dev-libs/libtommath )
+	)
+"
+DEPEND="${CDEPEND}
+	virtual/pkgconfig
+"
+RDEPEND="${CDEPEND}
+	!net-wireless/wpa_supplicant
+	selinux? ( sec-policy/selinux-networkmanager )
+"
+
+# S="${WORKDIR}/${P}/${PN}"
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/wpa_supplicant"
+}
+
+Kconfig_style_config() {
+		#param 1 is CONFIG_* item
+		#param 2 is what to set it = to, defaulting in y
+		CONFIG_PARAM="${CONFIG_HEADER:-CONFIG_}$1"
+		setting="${2:-y}"
+
+		if [ ! $setting = n ]; then
+			#first remove any leading "# " if $2 is not n
+			sed -i "/^# *$CONFIG_PARAM=/s/^# *//" .config || echo "Kconfig_style_config error uncommenting $CONFIG_PARAM"
+			#set item = $setting (defaulting to y)
+			sed -i "/^$CONFIG_PARAM/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
+			if [ -z "$( grep ^$CONFIG_PARAM= .config )" ] ; then
+				echo "$CONFIG_PARAM=$setting" >>.config
+			fi
+		else
+			#ensure item commented out
+			sed -i "/^$CONFIG_PARAM/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
+		fi
+}
+
+pkg_setup() {
+	if use gnutls && use ssl ; then
+		elog "You have both 'gnutls' and 'ssl' USE flags enabled: defaulting to USE=\"ssl\""
+	fi
+}
+
+src_prepare() {
+	# net/bpf.h needed for net-libs/libpcap on Gentoo/FreeBSD
+	sed -i \
+		-e "s:\(#include <pcap\.h>\):#include <net/bpf.h>\n\1:" \
+		../src/l2_packet/l2_packet_freebsd.c || die
+
+	# People seem to take the example configuration file too literally (bug #102361)
+	sed -i \
+		-e "s:^\(opensc_engine_path\):#\1:" \
+		-e "s:^\(pkcs11_engine_path\):#\1:" \
+		-e "s:^\(pkcs11_module_path\):#\1:" \
+		wpa_supplicant.conf || die
+
+	# Change configuration to match Gentoo locations (bug #143750)
+	sed -i \
+		-e "s:/usr/lib/opensc:/usr/$(get_libdir):" \
+		-e "s:/usr/lib/pkcs11:/usr/$(get_libdir):" \
+		wpa_supplicant.conf || die
+
+	# systemd entries to D-Bus service files (bug #372877)
+	# echo 'SystemdService=wpa_supplicant.service' \
+	# 	| tee -a dbus/*.service >/dev/null || die
+
+	cd "${WORKDIR}/${P}" || die
+
+	if use wimax; then
+		# generate-libeap-peer.patch comes before
+		# fix-undefined-reference-to-random_get_bytes.patch
+		# epatch "${FILESDIR}/${P}-generate-libeap-peer.patch"
+
+		# multilib-strict fix (bug #373685)
+		sed -e "s/\/usr\/lib/\/usr\/$(get_libdir)/" -i src/eap_peer/Makefile || die
+	fi
+
+	# bug (320097)
+	# epatch "${FILESDIR}/${P}-do-not-call-dbus-functions-with-NULL-path.patch"
+
+	# TODO - NEED TESTING TO SEE IF STILL NEEDED, NOT COMPATIBLE WITH 1.0 OUT OF THE BOX,
+	# SO WOULD BE NICE TO JUST DROP IT, IF IT IS NOT NEEDED.
+	# bug (374089)
+	#epatch "${FILESDIR}/${P}-dbus-WPAIE-fix.patch"
+
+	# bug (565270)
+	# epatch "${FILESDIR}/${P}-libressl.patch"
+	default
+}
+
+src_configure() {
+	sanitizers-setup-env
+	# Toolchain setup
+	tc-export CC
+
+	cp defconfig .config || die
+
+	# Basic setup
+	Kconfig_style_config CTRL_IFACE
+	Kconfig_style_config BACKEND file
+	Kconfig_style_config IBSS_RSN
+	Kconfig_style_config IEEE80211W
+	Kconfig_style_config IEEE80211R
+	Kconfig_style_config IEEE80211N
+	Kconfig_style_config IEEE80211AC
+	Kconfig_style_config WNM
+
+	# Basic authentication methods
+	# NOTE: we don't set GPSK or SAKE as they conflict
+	# with the below options
+	Kconfig_style_config EAP_GTC
+	Kconfig_style_config EAP_MD5
+	Kconfig_style_config EAP_OTP
+	Kconfig_style_config EAP_PAX
+	Kconfig_style_config EAP_PSK
+	Kconfig_style_config EAP_TLV
+	Kconfig_style_config EAP_EXE
+	Kconfig_style_config IEEE8021X_EAPOL
+	Kconfig_style_config PKCS12
+	Kconfig_style_config PEERKEY
+	Kconfig_style_config EAP_LEAP
+	Kconfig_style_config EAP_MSCHAPV2
+	Kconfig_style_config EAP_PEAP
+	Kconfig_style_config EAP_TLS
+	Kconfig_style_config EAP_TTLS
+
+	# Enabling background scanning.
+	Kconfig_style_config BGSCAN_SIMPLE
+	Kconfig_style_config BGSCAN_LEARN
+
+	# Allow VHT/HT parameters to be overriden; required by ChromiumOS
+	Kconfig_style_config VHT_OVERRIDES
+	Kconfig_style_config HT_OVERRIDES
+
+	if use dbus ; then
+		Kconfig_style_config CTRL_IFACE_DBUS
+		Kconfig_style_config CTRL_IFACE_DBUS_NEW
+		Kconfig_style_config CTRL_IFACE_DBUS_INTRO
+	fi
+
+	# Enable support for writing debug info to a log file and syslog.
+	Kconfig_style_config DEBUG_FILE
+	Kconfig_style_config DEBUG_SYSLOG
+	Kconfig_style_config DEBUG_SYSLOG_FACILITY LOG_LOCAL6
+
+	if use hs2-0 ; then
+		Kconfig_style_config INTERWORKING
+		Kconfig_style_config HS20
+	fi
+
+	if use uncommon-eap-types; then
+		Kconfig_style_config EAP_GPSK
+		Kconfig_style_config EAP_SAKE
+		Kconfig_style_config EAP_GPSK_SHA256
+		Kconfig_style_config EAP_IKEV2
+		Kconfig_style_config EAP_EKE
+	fi
+
+	if use eap-sim ; then
+		# Smart card authentication
+		Kconfig_style_config EAP_SIM
+		Kconfig_style_config EAP_AKA
+		Kconfig_style_config EAP_AKA_PRIME
+		# CHROMIUM: We don't have smartcard support. Instead include the
+		# client library for external processing via the control interface.
+		# Kconfig_style_config PCSC
+		Kconfig_style_config BUILD_WPA_CLIENT_SO
+	fi
+
+	if use fasteap ; then
+		Kconfig_style_config EAP_FAST
+	fi
+
+	if use readline ; then
+		# readline/history support for wpa_cli
+		Kconfig_style_config READLINE
+	else
+		#internal line edit mode for wpa_cli
+		Kconfig_style_config WPA_CLI_EDIT
+	fi
+
+	# SSL authentication methods
+	if use ssl ; then
+		Kconfig_style_config TLS openssl
+	elif use gnutls ; then
+		Kconfig_style_config TLS gnutls
+		Kconfig_style_config GNUTLS_EXTRA
+	else
+		Kconfig_style_config TLS internal
+	fi
+
+	if use smartcard ; then
+		Kconfig_style_config SMARTCARD
+	fi
+
+	if use tdls ; then
+		Kconfig_style_config TDLS
+	fi
+
+	if use kernel_linux ; then
+		# Linux specific drivers
+		# Kconfig_style_config DRIVER_ATMEL
+		# Kconfig_style_config DRIVER_HOSTAP
+		# Kconfig_style_config DRIVER_IPW
+		Kconfig_style_config DRIVER_NL80211
+		# Kconfig_style_config DRIVER_RALINK
+		Kconfig_style_config DRIVER_WEXT
+		Kconfig_style_config DRIVER_WIRED
+
+		if use ps3 ; then
+			Kconfig_style_config DRIVER_PS3
+		fi
+
+	elif use kernel_FreeBSD ; then
+		# FreeBSD specific driver
+		Kconfig_style_config DRIVER_BSD
+	fi
+
+	# Wi-Fi Protected Setup (WPS)
+	if use wps ; then
+		Kconfig_style_config WPS
+		Kconfig_style_config WPS2
+		# USB Flash Drive
+		Kconfig_style_config WPS_UFD
+		# External Registrar
+		Kconfig_style_config WPS_ER
+		# Universal Plug'n'Play
+		Kconfig_style_config WPS_UPNP
+		# Near Field Communication
+		Kconfig_style_config WPS_NFC
+	else
+		# (ChromeOS) Explicitly disable to override enabling from defconfig.
+		Kconfig_style_config WPS      n
+		Kconfig_style_config WPS2     n
+		Kconfig_style_config WPS_UFD  n
+		Kconfig_style_config WPS_ER   n
+		Kconfig_style_config WPS_UPNP n
+		Kconfig_style_config WPS_NFC  n
+	fi
+
+	# Wi-Fi Direct (WiDi)
+	if use p2p ; then
+		Kconfig_style_config P2P
+		Kconfig_style_config WIFI_DISPLAY
+	else
+		Kconfig_style_config P2P n
+		Kconfig_style_config WIFI_DISPLAY n
+	fi
+
+	# Access Point Mode
+	if use ap ; then
+		Kconfig_style_config AP
+		# only AP currently support mesh networks.
+		Kconfig_style_config MESH
+	else
+		# (ChromeOS) Explicitly disable to override enabling from defconfig.
+		Kconfig_style_config AP        n
+		Kconfig_style_config MESH      n
+	fi
+
+	# Enable mitigation against certain attacks against TKIP
+	Kconfig_style_config DELAYED_MIC_ERROR_REPORT
+
+	if use qt5 ; then
+		pushd "${S}"/wpa_gui-qt4 > /dev/null || die
+		eqmake5 wpa_gui.pro
+		popd > /dev/null || die
+	fi
+}
+
+src_compile() {
+	einfo "Building wpa_supplicant"
+	emake V=1 BINDIR=/usr/sbin
+
+	if use wimax; then
+		emake -C ../src/eap_peer clean
+		emake -C ../src/eap_peer
+	fi
+
+	if use qt5; then
+		einfo "Building wpa_gui"
+		emake -C "${S}"/wpa_gui-qt4
+	fi
+}
+
+src_install() {
+	dosbin wpa_supplicant
+	dobin wpa_cli wpa_passphrase
+
+	# baselayout-1 compat
+	if has_version "<sys-apps/baselayout-2.0.0"; then
+		dodir /sbin
+		dosym /usr/sbin/wpa_supplicant /sbin/wpa_supplicant
+		dodir /bin
+		dosym /usr/bin/wpa_cli /bin/wpa_cli
+	fi
+
+	if has_version ">=sys-apps/openrc-0.5.0"; then
+		newinitd "${FILESDIR}/${PN}-init.d" wpa_supplicant
+		newconfd "${FILESDIR}/${PN}-conf.d" wpa_supplicant
+	fi
+
+	dodoc ChangeLog {eap_testing,todo}.txt README{,-WPS} \
+		wpa_supplicant.conf
+
+	newdoc .config build-config
+
+	# CHROMIUM: sorry, don't want docs installed
+	# doman doc/docbook/*.{5,8}
+
+	if use qt5 ; then
+		into /usr
+		dobin wpa_gui-qt4/wpa_gui
+		doicon wpa_gui-qt4/icons/wpa_gui.svg
+		make_desktop_entry wpa_gui "WPA Supplicant Administration GUI" "wpa_gui" "Qt;Network;"
+	fi
+
+	use wimax && emake DESTDIR="${D}" -C ../src/eap_peer install
+
+	if use eap-sim ; then
+		# Install this library and header for the external processor.
+		dolib.so libwpa_client.so
+
+		insinto /usr/include/wpa_supplicant
+		doins ../src/common/wpa_ctrl.h
+	fi
+
+	if use dbus ; then
+		# DBus introspection XML file.
+		insinto /usr/share/dbus-1/interfaces
+		doins ${FILESDIR}/dbus_bindings/fi.w1.wpa_supplicant1.xml || die
+		insinto /etc/dbus-1/system.d
+		# Allow (but don't require) wpa_supplicant to run as root only
+		# when building hwsim targets.
+		if use wifi_hostap_test; then
+			newins "${FILESDIR}"/dbus_permissions/root_fi.w1.wpa_supplicant1.conf \
+				fi.w1.wpa_supplicant1.conf
+		else
+			doins "${FILESDIR}"/dbus_permissions/fi.w1.wpa_supplicant1.conf
+		fi
+
+		popd > /dev/null
+	fi
+	# Install the init scripts
+	if use systemd; then
+		insinto /usr/share
+		systemd_dounit ${FILESDIR}/init/wpasupplicant.service
+		systemd_enable_service boot-services.target wpasupplicant.service
+		systemd_dotmpfilesd ${FILESDIR}/init/wpasupplicant-directories.conf
+	else
+		insinto /etc/init
+		doins ${FILESDIR}/init/wpasupplicant.conf
+	fi
+}
+
+pkg_preinst() {
+	enewuser "wpa"
+	enewgroup "wpa"
+}
+
+pkg_postinst() {
+	elog "If this is a clean installation of wpa_supplicant, you"
+	elog "have to create a configuration file named"
+	elog "/etc/wpa_supplicant/wpa_supplicant.conf"
+	elog
+	elog "An example configuration file is available for reference in"
+	elog "/usr/share/doc/${PF}/"
+
+	if [[ -e ${ROOT}etc/wpa_supplicant.conf ]] ; then
+		echo
+		ewarn "WARNING: your old configuration file ${ROOT}etc/wpa_supplicant.conf"
+		ewarn "needs to be moved to ${ROOT}etc/wpa_supplicant/wpa_supplicant.conf"
+	fi
+
+	# Mea culpa, feel free to remove that after some time --mgorny.
+	# local fn
+	# for fn in wpa_supplicant{,@wlan0}.service; do
+	# 	if [[ -e "${ROOT}"/etc/systemd/system/network.target.wants/${fn} ]]
+	# 	then
+	# 		ebegin "Moving ${fn} to multi-user.target"
+	# 		mv "${ROOT}"/etc/systemd/system/network.target.wants/${fn} \
+	# 			"${ROOT}"/etc/systemd/system/multi-user.target.wants/
+	# 		eend ${?} \
+	# 			"Please try to re-enable ${fn}"
+	# 	fi
+	# done
+}
diff --git a/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-9999.ebuild b/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-9999.ebuild
index 43b1f1d..388eed0 100644
--- a/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-9999.ebuild
+++ b/net-wireless/wpa_supplicant-2_8/wpa_supplicant-2_8-9999.ebuild
@@ -6,7 +6,7 @@
 CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.8"
 CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.8"
 
-inherit cros-workon eutils toolchain-funcs qmake-utils systemd user
+inherit cros-sanitizers cros-workon eutils toolchain-funcs qmake-utils systemd user
 
 DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
 # HOMEPAGE="https://w1.fi/wpa_supplicant/"
@@ -137,6 +137,7 @@
 }
 
 src_configure() {
+	sanitizers-setup-env
 	# Toolchain setup
 	tc-export CC
 
diff --git a/net-wireless/wpa_supplicant-2_9/files/init/wpasupplicant.conf b/net-wireless/wpa_supplicant-2_9/files/init/wpasupplicant.conf
index 482f0b8..b2ef63d 100644
--- a/net-wireless/wpa_supplicant-2_9/files/init/wpasupplicant.conf
+++ b/net-wireless/wpa_supplicant-2_9/files/init/wpasupplicant.conf
@@ -15,6 +15,10 @@
 env OPENSSL_CHROMIUM_SKIP_TRUSTED_PURPOSE_CHECK=1
 env OPENSSL_CHROMIUM_GENERATE_METRICS=1
 
+# https://crbug.com/783125: "started boot-services" is relatively early in the
+# boot process. This is necessary for getting online quickly, a metric which we
+# optimize for alongside "time to login screen," because networking is a
+# critical service.
 start on started boot-services
 stop on stopping boot-services
 respawn
diff --git a/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r1.ebuild b/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r1.ebuild
deleted file mode 100644
index 73decb5..0000000
--- a/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r1.ebuild
+++ /dev/null
@@ -1,428 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="7b5cdbe2205ef23907e0cf30867013a5c8d0dffb"
-CROS_WORKON_TREE="be67916bc5a7eb2be0cc55683e3d5c4c06f32cfe"
-CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
-CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
-CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.9"
-
-inherit cros-workon eutils qmake-utils systemd toolchain-funcs user
-
-DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
-HOMEPAGE="https://w1.fi/wpa_supplicant/"
-LICENSE="|| ( GPL-2 BSD )"
-
-SLOT="0"
-KEYWORDS="*"
-IUSE="ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
-REQUIRED_USE="fasteap? ( !gnutls !ssl ) smartcard? ( ssl )"
-
-CDEPEND="
-	chromeos-base/minijail
-	dbus? ( sys-apps/dbus )
-	kernel_linux? (
-		dev-libs/libnl:3
-		net-wireless/crda
-	)
-	!kernel_linux? ( net-libs/libpcap )
-	qt5? (
-		dev-qt/qtcore:5
-		dev-qt/qtgui:5
-		dev-qt/qtsvg:5
-		dev-qt/qtwidgets:5
-	)
-	readline? (
-		sys-libs/ncurses:0
-		sys-libs/readline:0
-	)
-	ssl? (
-		!libressl? ( dev-libs/openssl:0= )
-		libressl? ( dev-libs/libressl )
-	)
-	smartcard? ( dev-libs/engine_pkcs11 )
-	!ssl? (
-		gnutls? (
-			net-libs/gnutls
-			dev-libs/libgcrypt
-		)
-		!gnutls? ( dev-libs/libtommath )
-	)
-"
-DEPEND="${CDEPEND}
-	virtual/pkgconfig
-"
-RDEPEND="${CDEPEND}
-	!net-wireless/wpa_supplicant
-	!net-wireless/wpa_supplicant-2_8
-	selinux? ( sec-policy/selinux-networkmanager )
-"
-
-# S="${WORKDIR}/${P}/${PN}"
-src_unpack() {
-	cros-workon_src_unpack
-	S+="/wpa_supplicant"
-}
-
-Kconfig_style_config() {
-		#param 1 is CONFIG_* item
-		#param 2 is what to set it = to, defaulting in y
-		CONFIG_PARAM="${CONFIG_HEADER:-CONFIG_}$1"
-		setting="${2:-y}"
-
-		if [ ! $setting = n ]; then
-			#first remove any leading "# " if $2 is not n
-			sed -i "/^# *$CONFIG_PARAM=/s/^# *//" .config || echo "Kconfig_style_config error uncommenting $CONFIG_PARAM"
-			#set item = $setting (defaulting to y)
-			sed -i "/^$CONFIG_PARAM/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
-			if [ -z "$( grep ^$CONFIG_PARAM= .config )" ] ; then
-				echo "$CONFIG_PARAM=$setting" >>.config
-			fi
-		else
-			#ensure item commented out
-			sed -i "/^$CONFIG_PARAM/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
-		fi
-}
-
-src_prepare() {
-	# net/bpf.h needed for net-libs/libpcap on Gentoo/FreeBSD
-	sed -i \
-		-e "s:\(#include <pcap\.h>\):#include <net/bpf.h>\n\1:" \
-		../src/l2_packet/l2_packet_freebsd.c || die
-
-	# People seem to take the example configuration file too literally (bug #102361)
-	sed -i \
-		-e "s:^\(opensc_engine_path\):#\1:" \
-		-e "s:^\(pkcs11_engine_path\):#\1:" \
-		-e "s:^\(pkcs11_module_path\):#\1:" \
-		wpa_supplicant.conf || die
-
-	# Change configuration to match Gentoo locations (bug #143750)
-	sed -i \
-		-e "s:/usr/lib/opensc:/usr/$(get_libdir):" \
-		-e "s:/usr/lib/pkcs11:/usr/$(get_libdir):" \
-		wpa_supplicant.conf || die
-
-	# systemd entries to D-Bus service files (bug #372877)
-	# echo 'SystemdService=wpa_supplicant.service' \
-	# 	| tee -a dbus/*.service >/dev/null || die
-
-	cd "${WORKDIR}/${P}" || die
-
-	if use wimax; then
-		# generate-libeap-peer.patch comes before
-		# fix-undefined-reference-to-random_get_bytes.patch
-		# epatch "${FILESDIR}/${P}-generate-libeap-peer.patch"
-
-		# multilib-strict fix (bug #373685)
-		sed -e "s/\/usr\/lib/\/usr\/$(get_libdir)/" -i src/eap_peer/Makefile || die
-	fi
-
-	# bug (320097)
-	# epatch "${FILESDIR}/${P}-do-not-call-dbus-functions-with-NULL-path.patch"
-
-	# TODO - NEED TESTING TO SEE IF STILL NEEDED, NOT COMPATIBLE WITH 1.0 OUT OF THE BOX,
-	# SO WOULD BE NICE TO JUST DROP IT, IF IT IS NOT NEEDED.
-	# bug (374089)
-	#epatch "${FILESDIR}/${P}-dbus-WPAIE-fix.patch"
-
-	# bug (565270)
-	# epatch "${FILESDIR}/${P}-libressl.patch"
-	default
-}
-
-src_configure() {
-	# Toolchain setup
-	tc-export CC
-
-	cp defconfig .config || die
-
-	# Basic setup
-	Kconfig_style_config CTRL_IFACE
-	Kconfig_style_config BACKEND file
-	Kconfig_style_config IBSS_RSN
-	Kconfig_style_config IEEE80211W
-	Kconfig_style_config IEEE80211R
-	Kconfig_style_config IEEE80211N
-	Kconfig_style_config IEEE80211AC
-	Kconfig_style_config WNM
-
-	# Basic authentication methods
-	# NOTE: we don't set GPSK or SAKE as they conflict
-	# with the below options
-	Kconfig_style_config EAP_GTC
-	Kconfig_style_config EAP_MD5
-	Kconfig_style_config EAP_OTP
-	Kconfig_style_config EAP_PAX
-	Kconfig_style_config EAP_PSK
-	Kconfig_style_config EAP_TLV
-	Kconfig_style_config EAP_EXE
-	Kconfig_style_config IEEE8021X_EAPOL
-	Kconfig_style_config PKCS12
-	Kconfig_style_config PEERKEY
-	Kconfig_style_config EAP_LEAP
-	Kconfig_style_config EAP_MSCHAPV2
-	Kconfig_style_config EAP_PEAP
-	Kconfig_style_config EAP_TLS
-	Kconfig_style_config EAP_TTLS
-
-	# Enabling background scanning.
-	Kconfig_style_config BGSCAN_SIMPLE
-	Kconfig_style_config BGSCAN_LEARN
-
-	# Allow VHT/HT parameters to be overriden; required by ChromiumOS
-	Kconfig_style_config VHT_OVERRIDES
-	Kconfig_style_config HT_OVERRIDES
-
-	if use dbus ; then
-		Kconfig_style_config CTRL_IFACE_DBUS
-		Kconfig_style_config CTRL_IFACE_DBUS_NEW
-		Kconfig_style_config CTRL_IFACE_DBUS_INTRO
-	else
-		Kconfig_style_config CTRL_IFACE_DBUS n
-		Kconfig_style_config CTRL_IFACE_DBUS_NEW n
-		Kconfig_style_config CTRL_IFACE_DBUS_INTRO n
-	fi
-
-	# Enable support for writing debug info to a log file and syslog.
-	Kconfig_style_config DEBUG_FILE
-	Kconfig_style_config DEBUG_SYSLOG
-	Kconfig_style_config DEBUG_SYSLOG_FACILITY LOG_LOCAL6
-
-	if use hs2-0 ; then
-		Kconfig_style_config INTERWORKING
-		Kconfig_style_config HS20
-	fi
-
-	if use uncommon-eap-types; then
-		Kconfig_style_config EAP_GPSK
-		Kconfig_style_config EAP_SAKE
-		Kconfig_style_config EAP_GPSK_SHA256
-		Kconfig_style_config EAP_IKEV2
-		Kconfig_style_config EAP_EKE
-	fi
-
-	if use eap-sim ; then
-		# Smart card authentication
-		Kconfig_style_config EAP_SIM
-		Kconfig_style_config EAP_AKA
-		Kconfig_style_config EAP_AKA_PRIME
-		# CHROMIUM: We don't have smartcard support. Instead include the
-		# client library for external processing via the control interface.
-		# Kconfig_style_config PCSC
-		Kconfig_style_config BUILD_WPA_CLIENT_SO
-	fi
-
-	if use fasteap ; then
-		Kconfig_style_config EAP_FAST
-	fi
-
-	if use readline ; then
-		# readline/history support for wpa_cli
-		Kconfig_style_config READLINE
-	else
-		#internal line edit mode for wpa_cli
-		Kconfig_style_config WPA_CLI_EDIT
-	fi
-
-	# SSL authentication methods
-	if use ssl ; then
-		Kconfig_style_config TLS openssl
-	elif use gnutls ; then
-		Kconfig_style_config TLS gnutls
-		Kconfig_style_config GNUTLS_EXTRA
-	else
-		Kconfig_style_config TLS internal
-	fi
-
-	if use smartcard ; then
-		Kconfig_style_config SMARTCARD
-	else
-		Kconfig_style_config SMARTCARD n
-	fi
-
-	if use tdls ; then
-		Kconfig_style_config TDLS
-	fi
-
-	if use kernel_linux ; then
-		# Linux specific drivers
-		# Kconfig_style_config DRIVER_ATMEL
-		# Kconfig_style_config DRIVER_HOSTAP
-		# Kconfig_style_config DRIVER_IPW
-		Kconfig_style_config DRIVER_NL80211
-		# Kconfig_style_config DRIVER_RALINK
-		Kconfig_style_config DRIVER_WEXT
-		Kconfig_style_config DRIVER_WIRED
-
-		if use ps3 ; then
-			Kconfig_style_config DRIVER_PS3
-		fi
-
-	elif use kernel_FreeBSD ; then
-		# FreeBSD specific driver
-		Kconfig_style_config DRIVER_BSD
-	fi
-
-	# Wi-Fi Protected Setup (WPS)
-	if use wps ; then
-		Kconfig_style_config WPS
-		Kconfig_style_config WPS2
-		# USB Flash Drive
-		Kconfig_style_config WPS_UFD
-		# External Registrar
-		Kconfig_style_config WPS_ER
-		# Universal Plug'n'Play
-		Kconfig_style_config WPS_UPNP
-		# Near Field Communication
-		Kconfig_style_config WPS_NFC
-	else
-		Kconfig_style_config WPS n
-		Kconfig_style_config WPS2 n
-		Kconfig_style_config WPS_UFD n
-		Kconfig_style_config WPS_ER n
-		Kconfig_style_config WPS_UPNP n
-		Kconfig_style_config WPS_NFC n
-	fi
-
-	# Wi-Fi Direct (WiDi)
-	if use p2p ; then
-		Kconfig_style_config P2P
-		Kconfig_style_config WIFI_DISPLAY
-	else
-		Kconfig_style_config P2P n
-		Kconfig_style_config WIFI_DISPLAY n
-	fi
-
-	# Access Point Mode
-	if use ap ; then
-		Kconfig_style_config AP
-		# only AP currently support mesh networks.
-		Kconfig_style_config MESH
-	else
-		# (ChromeOS) Explicitly disable to override enabling from defconfig.
-		Kconfig_style_config AP        n
-		Kconfig_style_config MESH      n
-	fi
-
-	# Enable mitigation against certain attacks against TKIP
-	Kconfig_style_config DELAYED_MIC_ERROR_REPORT
-
-	if use qt5 ; then
-		pushd "${S}"/wpa_gui-qt4 > /dev/null || die
-		eqmake5 wpa_gui.pro
-		popd > /dev/null || die
-	fi
-}
-
-src_compile() {
-	einfo "Building wpa_supplicant"
-	emake V=1 BINDIR=/usr/sbin
-
-	if use wimax; then
-		emake -C ../src/eap_peer clean
-		emake -C ../src/eap_peer
-	fi
-
-	if use qt5; then
-		einfo "Building wpa_gui"
-		emake -C "${S}"/wpa_gui-qt4
-	fi
-}
-
-src_install() {
-	dosbin wpa_supplicant
-	dobin wpa_cli wpa_passphrase
-
-	# baselayout-1 compat
-	if has_version "<sys-apps/baselayout-2.0.0"; then
-		dodir /sbin
-		dosym /usr/sbin/wpa_supplicant /sbin/wpa_supplicant
-		dodir /bin
-		dosym /usr/bin/wpa_cli /bin/wpa_cli
-	fi
-
-	if has_version ">=sys-apps/openrc-0.5.0"; then
-		newinitd "${FILESDIR}/${PN}-init.d" wpa_supplicant
-		newconfd "${FILESDIR}/${PN}-conf.d" wpa_supplicant
-	fi
-
-	dodoc ChangeLog {eap_testing,todo}.txt README{,-WPS} \
-		wpa_supplicant.conf
-
-	newdoc .config build-config
-
-	# CHROMIUM: sorry, don't want docs installed
-	# doman doc/docbook/*.{5,8}
-
-	if use qt5 ; then
-		into /usr
-		dobin wpa_gui-qt4/wpa_gui
-		doicon wpa_gui-qt4/icons/wpa_gui.svg
-		make_desktop_entry wpa_gui "WPA Supplicant Administration GUI" "wpa_gui" "Qt;Network;"
-	fi
-
-	use wimax && emake DESTDIR="${D}" -C ../src/eap_peer install
-
-	if use eap-sim ; then
-		# Install this library and header for the external processor.
-		dolib.so libwpa_client.so
-
-		insinto /usr/include/wpa_supplicant
-		doins ../src/common/wpa_ctrl.h
-	fi
-
-	if use dbus ; then
-		# DBus introspection XML file.
-		insinto /usr/share/dbus-1/interfaces
-		doins ${FILESDIR}/dbus_bindings/fi.w1.wpa_supplicant1.xml || die
-		insinto /etc/dbus-1/system.d
-		# Allow (but don't require) wpa_supplicant to run as root only
-		# when building hwsim targets.
-		if use wifi_hostap_test; then
-			newins "${FILESDIR}"/dbus_permissions/root_fi.w1.wpa_supplicant1.conf \
-				fi.w1.wpa_supplicant1.conf
-		else
-			doins "${FILESDIR}"/dbus_permissions/fi.w1.wpa_supplicant1.conf
-		fi
-
-		popd > /dev/null
-	fi
-	# Install the init scripts
-	if use systemd; then
-		insinto /usr/share
-		systemd_dounit ${FILESDIR}/init/wpasupplicant.service
-		systemd_enable_service boot-services.target wpasupplicant.service
-		systemd_dotmpfilesd ${FILESDIR}/init/wpasupplicant-directories.conf
-	else
-		insinto /etc/init
-		doins ${FILESDIR}/init/wpasupplicant.conf
-	fi
-}
-
-pkg_preinst() {
-	enewuser "wpa"
-	enewgroup "wpa"
-}
-
-pkg_postinst() {
-	if [[ -e ${ROOT}etc/wpa_supplicant.conf ]] ; then
-		echo
-		ewarn "WARNING: your old configuration file ${ROOT}etc/wpa_supplicant.conf"
-		ewarn "needs to be moved to ${ROOT}etc/wpa_supplicant/wpa_supplicant.conf"
-	fi
-
-	# Mea culpa, feel free to remove that after some time --mgorny.
-	# local fn
-	# for fn in wpa_supplicant{,@wlan0}.service; do
-	# 	if [[ -e "${ROOT}"/etc/systemd/system/network.target.wants/${fn} ]]
-	# 	then
-	# 		ebegin "Moving ${fn} to multi-user.target"
-	# 		mv "${ROOT}"/etc/systemd/system/network.target.wants/${fn} \
-	# 			"${ROOT}"/etc/systemd/system/multi-user.target.wants/
-	# 		eend ${?} \
-	# 			"Please try to re-enable ${fn}"
-	# 	fi
-	# done
-}
diff --git a/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r10.ebuild b/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r10.ebuild
new file mode 100644
index 0000000..04e3b37
--- /dev/null
+++ b/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-2.9-r10.ebuild
@@ -0,0 +1,419 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="9b763c4c97260c976214bd386b1dd4511897caef"
+CROS_WORKON_TREE="74699a9c73ae20b236f9031164def0631151f776"
+CROS_WORKON_PROJECT="chromiumos/third_party/hostap"
+CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
+CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.9"
+
+inherit cros-sanitizers cros-workon eutils qmake-utils systemd toolchain-funcs user
+
+DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
+HOMEPAGE="https://w1.fi/wpa_supplicant/"
+LICENSE="|| ( GPL-2 BSD )"
+
+SLOT="0"
+KEYWORDS="*"
+IUSE="ap bindist dbus debug eap-sim +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
+
+CDEPEND="
+	chromeos-base/minijail
+	dbus? ( sys-apps/dbus )
+	kernel_linux? (
+		dev-libs/libnl:3
+		net-wireless/crda
+	)
+	!kernel_linux? ( net-libs/libpcap )
+	qt5? (
+		dev-qt/qtcore:5
+		dev-qt/qtgui:5
+		dev-qt/qtsvg:5
+		dev-qt/qtwidgets:5
+	)
+	readline? (
+		sys-libs/ncurses:0
+		sys-libs/readline:0
+	)
+	!libressl? ( dev-libs/openssl:0=[bindist=] )
+	libressl? ( dev-libs/libressl:0= )
+	smartcard? ( dev-libs/engine_pkcs11 )
+"
+DEPEND="${CDEPEND}
+	virtual/pkgconfig
+"
+RDEPEND="${CDEPEND}
+	!net-wireless/wpa_supplicant
+	!net-wireless/wpa_supplicant-2_8
+	selinux? ( sec-policy/selinux-networkmanager )
+"
+
+# S="${WORKDIR}/${P}/${PN}"
+src_unpack() {
+	cros-workon_src_unpack
+	S+="/wpa_supplicant"
+}
+
+Kconfig_style_config() {
+		#param 1 is CONFIG_* item
+		#param 2 is what to set it = to, defaulting in y
+		CONFIG_PARAM="${CONFIG_HEADER:-CONFIG_}$1"
+		setting="${2:-y}"
+
+		if [ ! $setting = n ]; then
+			#first remove any leading "# " if $2 is not n
+			sed -i "/^# *$CONFIG_PARAM=/s/^# *//" .config || echo "Kconfig_style_config error uncommenting $CONFIG_PARAM"
+			#set item = $setting (defaulting to y)
+			sed -i "/^$CONFIG_PARAM\>/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
+			if [ -z "$( grep ^$CONFIG_PARAM= .config )" ] ; then
+				echo "$CONFIG_PARAM=$setting" >>.config
+			fi
+		else
+			#ensure item commented out
+			sed -i "/^$CONFIG_PARAM\>/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
+		fi
+}
+
+src_prepare() {
+	# net/bpf.h needed for net-libs/libpcap on Gentoo/FreeBSD
+	sed -i \
+		-e "s:\(#include <pcap\.h>\):#include <net/bpf.h>\n\1:" \
+		../src/l2_packet/l2_packet_freebsd.c || die
+
+	# People seem to take the example configuration file too literally (bug #102361)
+	sed -i \
+		-e "s:^\(opensc_engine_path\):#\1:" \
+		-e "s:^\(pkcs11_engine_path\):#\1:" \
+		-e "s:^\(pkcs11_module_path\):#\1:" \
+		wpa_supplicant.conf || die
+
+	# Change configuration to match Gentoo locations (bug #143750)
+	sed -i \
+		-e "s:/usr/lib/opensc:/usr/$(get_libdir):" \
+		-e "s:/usr/lib/pkcs11:/usr/$(get_libdir):" \
+		wpa_supplicant.conf || die
+
+	# systemd entries to D-Bus service files (bug #372877)
+	# echo 'SystemdService=wpa_supplicant.service' \
+	# 	| tee -a dbus/*.service >/dev/null || die
+
+	cd "${WORKDIR}/${P}" || die
+
+	if use wimax; then
+		# generate-libeap-peer.patch comes before
+		# fix-undefined-reference-to-random_get_bytes.patch
+		# epatch "${FILESDIR}/${P}-generate-libeap-peer.patch"
+
+		# multilib-strict fix (bug #373685)
+		sed -e "s/\/usr\/lib/\/usr\/$(get_libdir)/" -i src/eap_peer/Makefile || die
+	fi
+
+	# bug (320097)
+	# epatch "${FILESDIR}/${P}-do-not-call-dbus-functions-with-NULL-path.patch"
+
+	# TODO - NEED TESTING TO SEE IF STILL NEEDED, NOT COMPATIBLE WITH 1.0 OUT OF THE BOX,
+	# SO WOULD BE NICE TO JUST DROP IT, IF IT IS NOT NEEDED.
+	# bug (374089)
+	#epatch "${FILESDIR}/${P}-dbus-WPAIE-fix.patch"
+
+	# bug (565270)
+	# epatch "${FILESDIR}/${P}-libressl.patch"
+	default
+}
+
+src_configure() {
+	sanitizers-setup-env
+	# Toolchain setup
+	tc-export CC
+
+	cp defconfig .config || die
+
+	# Basic setup
+	Kconfig_style_config CTRL_IFACE
+	Kconfig_style_config MATCH_IFACE
+	Kconfig_style_config BACKEND file
+	Kconfig_style_config IBSS_RSN
+	Kconfig_style_config IEEE80211W
+	Kconfig_style_config IEEE80211R
+	Kconfig_style_config IEEE80211N
+	Kconfig_style_config IEEE80211AC
+	Kconfig_style_config WNM
+	Kconfig_style_config HT_OVERRIDES
+	Kconfig_style_config VHT_OVERRIDES
+	Kconfig_style_config OCV
+	Kconfig_style_config TLSV11
+	Kconfig_style_config TLSV12
+	Kconfig_style_config GETRANDOM
+
+	# Basic authentication methods
+	# NOTE: we don't set GPSK or SAKE as they conflict
+	# with the below options
+	Kconfig_style_config EAP_GTC
+	Kconfig_style_config EAP_MD5
+	Kconfig_style_config EAP_OTP
+	Kconfig_style_config EAP_PAX
+	Kconfig_style_config EAP_PSK
+	Kconfig_style_config EAP_TLV
+	Kconfig_style_config EAP_EXE
+	Kconfig_style_config IEEE8021X_EAPOL
+	Kconfig_style_config PKCS12
+	Kconfig_style_config PEERKEY
+	Kconfig_style_config EAP_LEAP
+	Kconfig_style_config EAP_MSCHAPV2
+	Kconfig_style_config EAP_PEAP
+	Kconfig_style_config EAP_TEAP
+	Kconfig_style_config EAP_TLS
+	Kconfig_style_config EAP_TTLS
+
+	# Enabling background scanning.
+	Kconfig_style_config BGSCAN_SIMPLE
+	Kconfig_style_config BGSCAN_LEARN
+
+	if use dbus ; then
+		Kconfig_style_config CTRL_IFACE_DBUS
+		Kconfig_style_config CTRL_IFACE_DBUS_NEW
+		Kconfig_style_config CTRL_IFACE_DBUS_INTRO
+	else
+		Kconfig_style_config CTRL_IFACE_DBUS n
+		Kconfig_style_config CTRL_IFACE_DBUS_NEW n
+		Kconfig_style_config CTRL_IFACE_DBUS_INTRO n
+	fi
+
+	# Enable support for writing debug info to a log file and syslog.
+	Kconfig_style_config DEBUG_FILE
+	Kconfig_style_config DEBUG_SYSLOG
+	Kconfig_style_config DEBUG_SYSLOG_FACILITY LOG_LOCAL6
+
+	if use hs2-0 ; then
+		Kconfig_style_config INTERWORKING
+		Kconfig_style_config HS20
+	fi
+
+	if use uncommon-eap-types; then
+		Kconfig_style_config EAP_GPSK
+		Kconfig_style_config EAP_SAKE
+		Kconfig_style_config EAP_GPSK_SHA256
+		Kconfig_style_config EAP_IKEV2
+		Kconfig_style_config EAP_EKE
+	fi
+
+	if use eap-sim ; then
+		# Smart card authentication
+		Kconfig_style_config EAP_SIM
+		Kconfig_style_config EAP_AKA
+		Kconfig_style_config EAP_AKA_PRIME
+		# CHROMIUM: We don't have smartcard support. Instead include the
+		# client library for external processing via the control interface.
+		# Kconfig_style_config PCSC
+		Kconfig_style_config BUILD_WPA_CLIENT_SO
+	fi
+
+	if use readline ; then
+		# readline/history support for wpa_cli
+		Kconfig_style_config READLINE
+	else
+		#internal line edit mode for wpa_cli
+		Kconfig_style_config WPA_CLI_EDIT
+	fi
+
+	Kconfig_style_config TLS openssl
+	Kconfig_style_config FST
+	if ! use bindist || use libressl; then
+		Kconfig_style_config EAP_PWD
+		#WPA3
+		Kconfig_style_config OWE
+		Kconfig_style_config SAE
+		Kconfig_style_config DPP
+		Kconfig_style_config SUITEB192
+	fi
+	if ! use bindist && ! use libressl; then
+		Kconfig_style_config SUITEB
+	fi
+
+	if use smartcard ; then
+		Kconfig_style_config SMARTCARD
+	else
+		Kconfig_style_config SMARTCARD n
+	fi
+
+	if use tdls ; then
+		Kconfig_style_config TDLS
+	fi
+
+	if use kernel_linux ; then
+		# Linux specific drivers
+		# Kconfig_style_config DRIVER_ATMEL
+		# Kconfig_style_config DRIVER_HOSTAP
+		# Kconfig_style_config DRIVER_IPW
+		Kconfig_style_config DRIVER_NL80211
+		# Kconfig_style_config DRIVER_RALINK
+		Kconfig_style_config DRIVER_WEXT
+		Kconfig_style_config DRIVER_WIRED
+
+		if use ps3 ; then
+			Kconfig_style_config DRIVER_PS3
+		fi
+
+	elif use kernel_FreeBSD ; then
+		# FreeBSD specific driver
+		Kconfig_style_config DRIVER_BSD
+	fi
+
+	# Wi-Fi Protected Setup (WPS)
+	if use wps ; then
+		Kconfig_style_config WPS
+		Kconfig_style_config WPS2
+		# USB Flash Drive
+		Kconfig_style_config WPS_UFD
+		# External Registrar
+		Kconfig_style_config WPS_ER
+		# Universal Plug'n'Play
+		Kconfig_style_config WPS_UPNP
+		# Near Field Communication
+		Kconfig_style_config WPS_NFC
+	else
+		Kconfig_style_config WPS n
+		Kconfig_style_config WPS2 n
+		Kconfig_style_config WPS_UFD n
+		Kconfig_style_config WPS_ER n
+		Kconfig_style_config WPS_UPNP n
+		Kconfig_style_config WPS_NFC n
+	fi
+
+	# Wi-Fi Direct (WiDi)
+	if use p2p ; then
+		Kconfig_style_config P2P
+		Kconfig_style_config WIFI_DISPLAY
+	else
+		Kconfig_style_config P2P n
+		Kconfig_style_config WIFI_DISPLAY n
+	fi
+
+	# Access Point Mode
+	if use ap ; then
+		Kconfig_style_config AP
+		# only AP currently support mesh networks.
+		Kconfig_style_config MESH
+	else
+		# (ChromeOS) Explicitly disable to override enabling from defconfig.
+		Kconfig_style_config AP        n
+		Kconfig_style_config MESH      n
+	fi
+
+	# Enable mitigation against certain attacks against TKIP
+	Kconfig_style_config DELAYED_MIC_ERROR_REPORT
+
+	if use qt5 ; then
+		pushd "${S}"/wpa_gui-qt4 > /dev/null || die
+		eqmake5 wpa_gui.pro
+		popd > /dev/null || die
+	fi
+}
+
+src_compile() {
+	einfo "Building wpa_supplicant"
+	emake V=1 BINDIR=/usr/sbin
+
+	if use wimax; then
+		emake -C ../src/eap_peer clean
+		emake -C ../src/eap_peer
+	fi
+
+	if use qt5; then
+		einfo "Building wpa_gui"
+		emake -C "${S}"/wpa_gui-qt4
+	fi
+}
+
+src_install() {
+	dosbin wpa_supplicant
+	dobin wpa_cli wpa_passphrase
+
+	# baselayout-1 compat
+	if has_version "<sys-apps/baselayout-2.0.0"; then
+		dodir /sbin
+		dosym /usr/sbin/wpa_supplicant /sbin/wpa_supplicant
+		dodir /bin
+		dosym /usr/bin/wpa_cli /bin/wpa_cli
+	fi
+
+	if has_version ">=sys-apps/openrc-0.5.0"; then
+		newinitd "${FILESDIR}/${PN}-init.d" wpa_supplicant
+		newconfd "${FILESDIR}/${PN}-conf.d" wpa_supplicant
+	fi
+
+	dodoc ChangeLog {eap_testing,todo}.txt README{,-WPS} \
+		wpa_supplicant.conf
+
+	newdoc .config build-config
+
+	if use qt5 ; then
+		into /usr
+		dobin wpa_gui-qt4/wpa_gui
+		doicon wpa_gui-qt4/icons/wpa_gui.svg
+		make_desktop_entry wpa_gui "WPA Supplicant Administration GUI" "wpa_gui" "Qt;Network;"
+	fi
+
+	use wimax && emake DESTDIR="${D}" -C ../src/eap_peer install
+
+	if use eap-sim ; then
+		# Install this library and header for the external processor.
+		dolib.so libwpa_client.so
+
+		insinto /usr/include/wpa_supplicant
+		doins ../src/common/wpa_ctrl.h
+	fi
+
+	if use dbus ; then
+		# DBus introspection XML file.
+		insinto /usr/share/dbus-1/interfaces
+		doins ${FILESDIR}/dbus_bindings/fi.w1.wpa_supplicant1.xml || die
+		insinto /etc/dbus-1/system.d
+		# Allow (but don't require) wpa_supplicant to run as root only
+		# when building hwsim targets.
+		if use wifi_hostap_test; then
+			newins "${FILESDIR}"/dbus_permissions/root_fi.w1.wpa_supplicant1.conf \
+				fi.w1.wpa_supplicant1.conf
+		else
+			doins "${FILESDIR}"/dbus_permissions/fi.w1.wpa_supplicant1.conf
+		fi
+
+		popd > /dev/null
+	fi
+	# Install the init scripts
+	if use systemd; then
+		insinto /usr/share
+		systemd_dounit ${FILESDIR}/init/wpasupplicant.service
+		systemd_enable_service boot-services.target wpasupplicant.service
+		systemd_dotmpfilesd ${FILESDIR}/init/wpasupplicant-directories.conf
+	else
+		insinto /etc/init
+		doins ${FILESDIR}/init/wpasupplicant.conf
+	fi
+}
+
+pkg_preinst() {
+	enewuser "wpa"
+	enewgroup "wpa"
+}
+
+pkg_postinst() {
+	if [[ -e ${ROOT}etc/wpa_supplicant.conf ]] ; then
+		echo
+		ewarn "WARNING: your old configuration file ${ROOT}etc/wpa_supplicant.conf"
+		ewarn "needs to be moved to ${ROOT}etc/wpa_supplicant/wpa_supplicant.conf"
+	fi
+
+	if use bindist; then
+		if ! use libressl; then
+			ewarn "Using bindist use flag presently breaks WPA3 (specifically SAE, OWE, DPP, and FILS)."
+			ewarn "This is incredibly undesirable"
+		fi
+	fi
+	if use libressl; then
+		ewarn "Libressl doesn't support SUITEB (part of WPA3)"
+		ewarn "but it does support SUITEB192 (the upgraded strength version of the same)"
+		ewarn "You probably don't care.  Patches welcome"
+	fi
+}
diff --git a/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-9999.ebuild b/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-9999.ebuild
index 80cc31a..f3814d0 100644
--- a/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-9999.ebuild
+++ b/net-wireless/wpa_supplicant-2_9/wpa_supplicant-2_9-9999.ebuild
@@ -6,7 +6,7 @@
 CROS_WORKON_LOCALNAME="../third_party/wpa_supplicant-2.9"
 CROS_WORKON_EGIT_BRANCH="wpa_supplicant-2.9"
 
-inherit cros-workon eutils qmake-utils systemd toolchain-funcs user
+inherit cros-sanitizers cros-workon eutils qmake-utils systemd toolchain-funcs user
 
 DESCRIPTION="IEEE 802.1X/WPA supplicant for secure wireless transfers"
 HOMEPAGE="https://w1.fi/wpa_supplicant/"
@@ -14,8 +14,7 @@
 
 SLOT="0"
 KEYWORDS="~*"
-IUSE="ap dbus debug gnutls eap-sim fasteap +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard ssl systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
-REQUIRED_USE="fasteap? ( !gnutls !ssl ) smartcard? ( ssl )"
+IUSE="ap bindist dbus debug eap-sim +hs2-0 libressl p2p ps3 qt5 readline selinux smartcard systemd +tdls uncommon-eap-types wifi_hostap_test wps kernel_linux kernel_FreeBSD wimax"
 
 CDEPEND="
 	chromeos-base/minijail
@@ -35,18 +34,9 @@
 		sys-libs/ncurses:0
 		sys-libs/readline:0
 	)
-	ssl? (
-		!libressl? ( dev-libs/openssl:0= )
-		libressl? ( dev-libs/libressl )
-	)
+	!libressl? ( dev-libs/openssl:0=[bindist=] )
+	libressl? ( dev-libs/libressl:0= )
 	smartcard? ( dev-libs/engine_pkcs11 )
-	!ssl? (
-		gnutls? (
-			net-libs/gnutls
-			dev-libs/libgcrypt
-		)
-		!gnutls? ( dev-libs/libtommath )
-	)
 "
 DEPEND="${CDEPEND}
 	virtual/pkgconfig
@@ -73,13 +63,13 @@
 			#first remove any leading "# " if $2 is not n
 			sed -i "/^# *$CONFIG_PARAM=/s/^# *//" .config || echo "Kconfig_style_config error uncommenting $CONFIG_PARAM"
 			#set item = $setting (defaulting to y)
-			sed -i "/^$CONFIG_PARAM/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
+			sed -i "/^$CONFIG_PARAM\>/s/=.*/=$setting/" .config || echo "Kconfig_style_config error setting $CONFIG_PARAM=$setting"
 			if [ -z "$( grep ^$CONFIG_PARAM= .config )" ] ; then
 				echo "$CONFIG_PARAM=$setting" >>.config
 			fi
 		else
 			#ensure item commented out
-			sed -i "/^$CONFIG_PARAM/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
+			sed -i "/^$CONFIG_PARAM\>/s/$CONFIG_PARAM/# $CONFIG_PARAM/" .config || echo "Kconfig_style_config error commenting $CONFIG_PARAM"
 		fi
 }
 
@@ -131,6 +121,7 @@
 }
 
 src_configure() {
+	sanitizers-setup-env
 	# Toolchain setup
 	tc-export CC
 
@@ -138,6 +129,7 @@
 
 	# Basic setup
 	Kconfig_style_config CTRL_IFACE
+	Kconfig_style_config MATCH_IFACE
 	Kconfig_style_config BACKEND file
 	Kconfig_style_config IBSS_RSN
 	Kconfig_style_config IEEE80211W
@@ -145,6 +137,12 @@
 	Kconfig_style_config IEEE80211N
 	Kconfig_style_config IEEE80211AC
 	Kconfig_style_config WNM
+	Kconfig_style_config HT_OVERRIDES
+	Kconfig_style_config VHT_OVERRIDES
+	Kconfig_style_config OCV
+	Kconfig_style_config TLSV11
+	Kconfig_style_config TLSV12
+	Kconfig_style_config GETRANDOM
 
 	# Basic authentication methods
 	# NOTE: we don't set GPSK or SAKE as they conflict
@@ -162,6 +160,7 @@
 	Kconfig_style_config EAP_LEAP
 	Kconfig_style_config EAP_MSCHAPV2
 	Kconfig_style_config EAP_PEAP
+	Kconfig_style_config EAP_TEAP
 	Kconfig_style_config EAP_TLS
 	Kconfig_style_config EAP_TTLS
 
@@ -169,10 +168,6 @@
 	Kconfig_style_config BGSCAN_SIMPLE
 	Kconfig_style_config BGSCAN_LEARN
 
-	# Allow VHT/HT parameters to be overriden; required by ChromiumOS
-	Kconfig_style_config VHT_OVERRIDES
-	Kconfig_style_config HT_OVERRIDES
-
 	if use dbus ; then
 		Kconfig_style_config CTRL_IFACE_DBUS
 		Kconfig_style_config CTRL_IFACE_DBUS_NEW
@@ -212,10 +207,6 @@
 		Kconfig_style_config BUILD_WPA_CLIENT_SO
 	fi
 
-	if use fasteap ; then
-		Kconfig_style_config EAP_FAST
-	fi
-
 	if use readline ; then
 		# readline/history support for wpa_cli
 		Kconfig_style_config READLINE
@@ -224,14 +215,18 @@
 		Kconfig_style_config WPA_CLI_EDIT
 	fi
 
-	# SSL authentication methods
-	if use ssl ; then
-		Kconfig_style_config TLS openssl
-	elif use gnutls ; then
-		Kconfig_style_config TLS gnutls
-		Kconfig_style_config GNUTLS_EXTRA
-	else
-		Kconfig_style_config TLS internal
+	Kconfig_style_config TLS openssl
+	Kconfig_style_config FST
+	if ! use bindist || use libressl; then
+		Kconfig_style_config EAP_PWD
+		#WPA3
+		Kconfig_style_config OWE
+		Kconfig_style_config SAE
+		Kconfig_style_config DPP
+		Kconfig_style_config SUITEB192
+	fi
+	if ! use bindist && ! use libressl; then
+		Kconfig_style_config SUITEB
 	fi
 
 	if use smartcard ; then
@@ -351,9 +346,6 @@
 
 	newdoc .config build-config
 
-	# CHROMIUM: sorry, don't want docs installed
-	# doman doc/docbook/*.{5,8}
-
 	if use qt5 ; then
 		into /usr
 		dobin wpa_gui-qt4/wpa_gui
@@ -411,16 +403,15 @@
 		ewarn "needs to be moved to ${ROOT}etc/wpa_supplicant/wpa_supplicant.conf"
 	fi
 
-	# Mea culpa, feel free to remove that after some time --mgorny.
-	# local fn
-	# for fn in wpa_supplicant{,@wlan0}.service; do
-	# 	if [[ -e "${ROOT}"/etc/systemd/system/network.target.wants/${fn} ]]
-	# 	then
-	# 		ebegin "Moving ${fn} to multi-user.target"
-	# 		mv "${ROOT}"/etc/systemd/system/network.target.wants/${fn} \
-	# 			"${ROOT}"/etc/systemd/system/multi-user.target.wants/
-	# 		eend ${?} \
-	# 			"Please try to re-enable ${fn}"
-	# 	fi
-	# done
+	if use bindist; then
+		if ! use libressl; then
+			ewarn "Using bindist use flag presently breaks WPA3 (specifically SAE, OWE, DPP, and FILS)."
+			ewarn "This is incredibly undesirable"
+		fi
+	fi
+	if use libressl; then
+		ewarn "Libressl doesn't support SUITEB (part of WPA3)"
+		ewarn "but it does support SUITEB192 (the upgraded strength version of the same)"
+		ewarn "You probably don't care.  Patches welcome"
+	fi
 }
diff --git a/profiles/arch/arm/package.use.mask b/profiles/arch/arm/package.use.mask
index 41b87eb..7956666 100644
--- a/profiles/arch/arm/package.use.mask
+++ b/profiles/arch/arm/package.use.mask
@@ -33,3 +33,7 @@
 # David Hendricks <dhendrix@chromium.org> (10 Oct 2011)
 # libpci will cause program to exit(1) during init if PCI not present in system
 sys-apps/flashrom drkaiser gfxnvidia nicintel nicintel_spi nicrealtek ogp_spi satasii
+
+# These are only used on 32-bit ARM targets.
+sys-devel/gcc -hardfp -thumb
+sys-libs/gcc-libs -hardfp -thumb
diff --git a/profiles/arch/arm/use.mask b/profiles/arch/arm/use.mask
index 1c19643..e49da0a 100644
--- a/profiles/arch/arm/use.mask
+++ b/profiles/arch/arm/use.mask
@@ -163,3 +163,23 @@
 # Bug #184563, 18 Sep 2007 
 # Robin H. Johnson <robbat2@gentoo.org>
 audit
+
+# Some SANE backends that we want to disable to conserve disk space
+# TODO(b/161252439): synchronize with x86.
+sane_backends_hp3900
+sane_backends_plustek
+sane_backends_snapscan
+sane_backends_umax
+sane_backends_mustek_usb
+sane_backends_avision
+sane_backends_gt68xx
+sane_backends_rts8891
+sane_backends_u12
+sane_backends_kvs1025
+sane_backends_artec_eplus48u
+sane_backends_hp5590
+sane_backends_hp5400
+sane_backends_hp4200
+sane_backends_hp4200
+sane_backends_hpljm1005
+sane_backends_ma1509
diff --git a/profiles/arch/arm64/use.mask b/profiles/arch/arm64/use.mask
index e9701a9..c40a24e 100644
--- a/profiles/arch/arm64/use.mask
+++ b/profiles/arch/arm64/use.mask
@@ -83,7 +83,6 @@
 nvtv
 mzscheme
 xemacs
-scanner
 madwifi
 libupnp
 zvbi
@@ -167,3 +166,23 @@
 # aarch64 is somewhat deffective as of end of 2019, disable drivefs for arm64.
 drivefs
 
+# Some SANE backends that we want to disable to conserve disk space
+# TODO(b/161252439): synchronize with x86.
+sane_backends_hp3900
+sane_backends_plustek
+sane_backends_snapscan
+sane_backends_umax
+sane_backends_mustek_usb
+sane_backends_avision
+sane_backends_gt68xx
+sane_backends_rts8891
+sane_backends_u12
+sane_backends_kvs1025
+sane_backends_artec_eplus48u
+sane_backends_hp5590
+sane_backends_hp5400
+sane_backends_hp4200
+sane_backends_hp4200
+sane_backends_hpljm1005
+sane_backends_ma1509
+
diff --git a/profiles/base/make.defaults b/profiles/base/make.defaults
index afe0314..b8d3794 100644
--- a/profiles/base/make.defaults
+++ b/profiles/base/make.defaults
@@ -20,7 +20,7 @@
 
 # USE_EXPAND variables whose contents are not shown in package manager
 # output. Changes need discussion on gentoo-dev.
-USE_EXPAND_HIDDEN="USERLAND KERNEL ELIBC CROSSCOMPILE_OPTS ABI_ARM ABI_MIPS ABI_PPC ABI_S390 ABI_X86 CPU_FLAGS_X86"
+USE_EXPAND_HIDDEN="USERLAND KERNEL ELIBC ABI_ARM ABI_MIPS ABI_PPC ABI_S390 ABI_X86 CPU_FLAGS_X86"
 
 # Basic CONFIG_PROTECT is defined by portage make.globals in /usr/share. That is really bad, kill it here.
 CONFIG_PROTECT="-/etc"
diff --git a/profiles/base/package.use.mask b/profiles/base/package.use.mask
index 968e104..b266051 100644
--- a/profiles/base/package.use.mask
+++ b/profiles/base/package.use.mask
@@ -168,3 +168,7 @@
 # Security issues wrt #190835
 games-fps/doom-data doomsday
 games-fps/freedoom doomsday
+
+# These are only used on 32-bit ARM targets.
+sys-devel/gcc hardfp thumb
+sys-libs/gcc-libs hardfp thumb
diff --git a/profiles/base/profile.bashrc b/profiles/base/profile.bashrc
index 0686141..dcf5f0c 100644
--- a/profiles/base/profile.bashrc
+++ b/profiles/base/profile.bashrc
@@ -174,16 +174,17 @@
 # x86_64 boards (since the SDK is x86_64), but it's still unreliable.
 # https://crbug.com/985180
 cros_pre_src_prepare_build_toolchain_catch() {
-	# TODO(vapier): Only enabled for the SDK currently.  Boards have too many
-	# failing packages currently.
-	if [[ $(cros_target) != "cros_host" ]]; then
-		return
+	local targetenv
+	if [[ $(cros_target) == "cros_host" ]]; then
+		targetenv="sdk"
+	else
+		targetenv="board"
 	fi
 
 	# Note: Do not add any more packages to these lists.  Fix the bugs instead.
 
 	# TODO(vapier): Finish fixing these packages.
-	_build_filter_pkg_config() {
+	_sdk_build_filter_pkg_config() {
 		case ${CATEGORY}/${PN} in
 		*/gdb) return 1;;
 		# Haskell has some internal logic that invokes `pkg-config --version`.
@@ -192,7 +193,6 @@
 		dev-util/shellcheck) return 1;;
 		dev-haskell/*) return 1;;
 		dev-lang/ghc) return 1;;
-		dev-lang/ruby) return 1;;
 		dev-lang/rust) return 1;;
 		dev-python/pycairo) return 1;;
 		media-video/ffmpeg) return 1;;
@@ -201,12 +201,13 @@
 		x11-libs/cairo) return 1;;
 		esac
 	}
-	_build_filter_cc() {
+	_sdk_build_filter_cc() {
 		case ${CATEGORY}/${PN} in
 		*/binutils|\
 		*/gcc|\
 		*/gdb|\
 		app-text/xmlto|\
+		cross-*/gdb|\
 		dev-embedded/u-boot-tools|\
 		dev-lang/rust|\
 		dev-libs/libffi|\
@@ -222,7 +223,7 @@
 		x11-libs/gdk-pixbuf) return 1;;
 		esac
 	}
-	_build_filter_gcc() {
+	_sdk_build_filter_gcc() {
 		case ${CATEGORY}/${PN} in
 		cross-*/glibc|\
 		*/linux-headers|\
@@ -237,27 +238,233 @@
 		sys-libs/libselinux) return 1;;
 		esac
 	}
-	_build_filter_g++() {
+	_sdk_build_filter_g++() {
 		return 0
 	}
-	_build_filter_clang() {
+	_sdk_build_filter_clang() {
 		case ${CATEGORY}/${PN} in
 		chromeos-base/ec-devutils) return 1;;
 		esac
 	}
-	_build_filter_clang++() {
+	_sdk_build_filter_clang++() {
 		return 0
 	}
+	_sdk_build_filter_ld() {
+		case ${CATEGORY}/${PN} in
+		app-crypt/nss|\
+		cross-*/gcc|\
+		cross-*/go|\
+		dev-embedded/coreboot-sdk|\
+		dev-lang/go|\
+		dev-libs/nss|\
+		dev-util/perf) return 1;;
+		esac
+	}
+	_sdk_build_filter_as() {
+		case ${CATEGORY}/${PN} in
+		dev-embedded/coreboot-sdk|\
+		dev-libs/nspr) return 1;;
+		esac
+	}
+
+	_board_build_filter_pkg_config() {
+		case ${CATEGORY}/${PN} in
+		app-benchmarks/lmbench|\
+		app-emulation/docker|\
+		app-text/ghostscript-gpl|\
+		chromeos-base/autotest-tests-lakitu|\
+		media-libs/arc-cros-gralloc|\
+		media-libs/arc-img-ddk|\
+		media-libs/arc-mali-drivers|\
+		media-libs/arc-mali-drivers-bifrost|\
+		media-libs/arc-mesa|\
+		media-libs/arc-mesa-amd|\
+		media-libs/arc-mesa-freedreno|\
+		media-libs/arc-mesa-img|\
+		media-libs/arc-mesa-iris|\
+		media-libs/arc-mesa-virgl|\
+		media-libs/mali-drivers-bifrost|\
+		media-libs/mali-drivers-valhall|\
+		media-libs/mesa|\
+		media-libs/mesa-amd|\
+		media-libs/mesa-llvmpipe|\
+		net-analyzer/wireshark|\
+		net-dns/dnsmasq|\
+		net-misc/dhcpcd|\
+		net-misc/improxy|\
+		net-print/cups|\
+		sys-apps/cavium-n3fips-driver|\
+		sys-apps/fwupd|\
+		sys-apps/loadpin-trigger|\
+		sys-apps/snaggletooth-drivers|\
+		sys-boot/coreboot|\
+		sys-boot/depthcharge|\
+		sys-boot/libpayload|\
+		sys-boot/loonix-u-boot|\
+		sys-boot/u-boot|\
+		sys-devel/arc-llvm|\
+		sys-devel/gdb|\
+		sys-fs/avfs|\
+		sys-kernel/arcvm-kernel-*|\
+		sys-kernel/chromeos-kernel-*|\
+		sys-kernel/dump-capture-kernel|\
+		sys-kernel/gw-kernel-*|\
+		sys-kernel/kernel-beaglebone-*|\
+		sys-kernel/lakitu-kernel-*|\
+		sys-kernel/loonix-kernel-*|\
+		sys-kernel/raspberrypi-kernel|\
+		sys-kernel/ti-nokia-kernel|\
+		sys-kernel/upstream-kernel-*|\
+		sys-libs/efivar|\
+		x11-base/xwayland|\
+		x11-libs/arc-libdrm|\
+		x11-libs/cairo) return 1;;
+		esac
+	}
+	_board_build_filter_cc() {
+		case ${CATEGORY}/${PN} in
+		app-benchmarks/sysbench|\
+		dev-libs/libdaemon|\
+		dev-libs/libffi|\
+		dev-libs/libusb-compat|\
+		dev-python/grpcio|\
+		dev-python/psutil|\
+		media-libs/libogg|\
+		net-dns/avahi|\
+		net-libs/libmnl|\
+		net-libs/libnetfilter_cthelper|\
+		net-libs/libnetfilter_cttimeout|\
+		net-libs/libnetfilter_queue|\
+		net-libs/libnfnetlink|\
+		net-misc/nldaemon|\
+		net-wireless/openthread|\
+		net-wireless/ot-br-posix|\
+		sys-apps/groff|\
+		sys-apps/kbd|\
+		sys-apps/ureadahead|\
+		sys-block/parted|\
+		sys-boot/arria10-u-boot|\
+		sys-boot/loonix-u-boot|\
+		sys-devel/binutils|\
+		sys-devel/gdb|\
+		sys-devel/m4|\
+		sys-fs/rar2fs|\
+		sys-libs/gcc-libs|\
+		x11-libs/gdk-pixbuf) return 1;;
+		esac
+	}
+	_board_build_filter_gcc() {
+		case ${CATEGORY}/${PN} in
+		app-benchmarks/lmbench|\
+		app-emulation/docker|\
+		chromeos-base/autotest-tests|\
+		chromeos-base/chromeos-ec|\
+		chromeos-base/chromeos-ish|\
+		chromeos-base/ec-utils|\
+		dev-go/syzkaller|\
+		dev-python/numpy|\
+		media-libs/arc-img-ddk|\
+		media-libs/img-ddk|\
+		media-sound/gsm|\
+		net-fs/autofs|\
+		net-misc/socat|\
+		sys-apps/cavium-n3fips-tools|\
+		sys-block/blktrace|\
+		sys-boot/chromeos-mrc|\
+		sys-boot/coreboot|\
+		sys-boot/depthcharge|\
+		sys-boot/grub-lakitu|\
+		sys-boot/libpayload|\
+		sys-boot/qca-framework|\
+		sys-boot/syslinux|\
+		sys-firmware/chromeos-fpmcu-release-bloonchipper|\
+		sys-firmware/chromeos-fpmcu-release-dartmonkey|\
+		sys-firmware/chromeos-fpmcu-release-nami|\
+		sys-firmware/chromeos-fpmcu-release-nocturne|\
+		sys-fs/mdadm|\
+		sys-kernel/linux-headers|\
+		sys-libs/efivar) return 1;;
+		esac
+	}
+	_board_build_filter_g++() {
+		case ${CATEGORY}/${PN} in
+		media-libs/img-ddk|\
+		net-print/hplip|\
+		sys-boot/qca-framework) return 1;;
+		esac
+	}
+	_board_build_filter_clang() {
+		case ${CATEGORY}/${PN} in
+		chromeos-base/autotest-tests-lakitu|\
+		chromeos-base/chromeos-ec|\
+		chromeos-base/ec-devutils|\
+		media-libs/arc-mali-drivers-bifrost|\
+		media-libs/mali-drivers-bifrost|\
+		media-libs/mali-drivers-valhall|\
+		net-libs/nodejs|\
+		sys-boot/coreboot|\
+		sys-boot/libpayload|\
+		sys-devel/arc-llvm|\
+		sys-devel/llvm) return 1;;
+		esac
+	}
+	_board_build_filter_clang++() {
+		case ${CATEGORY}/${PN} in
+		media-libs/arc-mali-drivers-bifrost|\
+		media-libs/mali-drivers-bifrost|\
+		media-libs/mali-drivers-valhall|\
+		net-libs/nodejs|\
+		sys-devel/arc-llvm|\
+		sys-devel/llvm) return 1;;
+		esac
+	}
+	_board_build_filter_ld() {
+		case ${CATEGORY}/${PN} in
+		app-crypt/nss|\
+		dev-libs/nss|\
+		dev-util/perf|\
+		media-libs/arc-mali-drivers-bifrost|\
+		media-libs/mali-drivers-bifrost|\
+		sys-kernel/arcvm-kernel-*|\
+		sys-kernel/chromeos-kernel-*|\
+		sys-kernel/dump-capture-kernel|\
+		sys-kernel/lakitu-kernel-*|\
+		sys-kernel/raspberrypi-kernel|\
+		sys-kernel/upstream-kernel-*|\
+		sys-libs/gcc-libs) return 1;;
+		esac
+	}
+	_board_build_filter_as() {
+		case ${CATEGORY}/${PN} in
+		dev-embedded/coreboot-sdk|\
+		dev-libs/nspr|\
+		net-misc/nldaemon|\
+		sys-boot/coreboot|\
+		sys-boot/libpayload) return 1;;
+		esac
+	}
 
 	local dir="${T}/build-toolchain-wrappers"
 	mkdir -p "${dir}"
 	local tool tcvar
-	for tool in clang clang++ c++ g++ cc gcc pkg-config; do
-		tcvar=${tool^^}
-		tcvar=${tcvar//-/_}
+	for tool in as ld clang clang++ c++ g++ cc gcc pkg-config; do
+		case ${tool} in
+		clang|gcc)
+			tcvar="CC"
+			;;
+		clang++|[cg]++)
+			tcvar="CXX"
+			;;
+		*)
+			tcvar=${tool^^}
+			tcvar=${tcvar//-/_}
+			;;
+		esac
 
 		case ${tool} in
-		cc|clang|clang++|g++|gcc|pkg-config) _build_filter_${tool//-/_} || continue;;
+		as|cc|clang|clang++|g++|gcc|ld|pkg-config)
+			_${targetenv}_build_filter_${tool//-/_} || continue
+			;;
 		esac
 
 		cat <<EOF > "${dir}/${tool}"
@@ -381,6 +588,13 @@
 		# Return if there are no elf files with coverage data.
 		[[ "${#cov_args[@]}" -eq 0 ]] && return
 
+		# Generate json format coverage report.
+		llvm-cov export "${cov_args[@]}" \
+			-instr-profile="${cov_dir}/${PN}.profdata" \
+			-skip-expansions \
+			-skip-functions \
+			> ${cov_dir}/coverage.json || die
+
 		# Generate html format coverage report.
 		llvm-cov show "${cov_args[@]}" -format=html \
 			-instr-profile="${cov_dir}/${PN}.profdata" \
diff --git a/profiles/default/linux/amd64/10.0/chromeos/package.use b/profiles/default/linux/amd64/10.0/chromeos/package.use
index 09fa065..9f8e958 100644
--- a/profiles/default/linux/amd64/10.0/chromeos/package.use
+++ b/profiles/default/linux/amd64/10.0/chromeos/package.use
@@ -1,2 +1,2 @@
 # USE flags only for target boards.
-sys-boot/chromeos-bootimage u-boot tianocore
+sys-boot/chromeos-bootimage u-boot
diff --git a/profiles/default/linux/package.use b/profiles/default/linux/package.use
index ab0f81f..e035c81 100644
--- a/profiles/default/linux/package.use
+++ b/profiles/default/linux/package.use
@@ -72,6 +72,7 @@
 
 # Build selected kernels with AutoFDO
 sys-kernel/chromeos-kernel-4_19 kernel_afdo
+sys-kernel/chromeos-kernel-4_14 kernel_afdo
 sys-kernel/chromeos-kernel-4_4 kernel_afdo
 sys-kernel/chromeos-kernel-3_18 kernel_afdo
 sys-kernel/chromeos-kernel-3_14 kernel_afdo
diff --git a/profiles/default/linux/package.use.mask b/profiles/default/linux/package.use.mask
index 8f66a21..7f1fbd5 100644
--- a/profiles/default/linux/package.use.mask
+++ b/profiles/default/linux/package.use.mask
@@ -60,6 +60,9 @@
 dev-libs/openssl bindist
 # openssh tracks USE=bindist only because openssl does.
 net-misc/openssh bindist
+# We want WPA3 features, which currently aren't available with openssl's
+# USE=bindist.
+net-wireless/wpa_supplicant-2_9 bindist
 
 # Resolve circular dependency between libcap and pam.
 # http://crbug.com/508630 (see #8)
diff --git a/profiles/features/embedded/make.defaults b/profiles/features/embedded/make.defaults
index 608ca69..91b6d3e 100644
--- a/profiles/features/embedded/make.defaults
+++ b/profiles/features/embedded/make.defaults
@@ -37,5 +37,9 @@
 # Disable filesystem extensions.
 USE="${USE} -drivefs -samba -smbprovider"
 
+# Disable the diagnostics and telemetry daemon. Features not evaluated on
+# embedded devices.
+USE="${USE} -diagnostics"
+
 # Make each board select the firmware it needs.
 LINUX_FIRMWARE="-*"
diff --git a/profiles/features/kernel/buildtest/package.use b/profiles/features/kernel/buildtest/package.use
index 7a869c7..cf1ca46 100644
--- a/profiles/features/kernel/buildtest/package.use
+++ b/profiles/features/kernel/buildtest/package.use
@@ -5,7 +5,8 @@
 sys-kernel/chromeos-kernel-3_14 buildtest -clang -lld
 sys-kernel/chromeos-kernel-3_18 buildtest -clang -lld
 sys-kernel/chromeos-kernel-4_4 buildtest -clang -lld
-sys-kernel/chromeos-kernel-4_14 buildtest -clang -lld
+# We can build chromeos-4.14 with clang, but not with lld
+sys-kernel/chromeos-kernel-4_14 buildtest -lld -kernel_afdo
 # For chromeos-4.19 and later we can build with clang and lld.
 sys-kernel/chromeos-kernel-4_19 buildtest
 sys-kernel/chromeos-kernel-5_4 buildtest
diff --git a/profiles/features/llvm/make.defaults b/profiles/features/llvm/make.defaults
index 7a6f934..5fdb778 100644
--- a/profiles/features/llvm/make.defaults
+++ b/profiles/features/llvm/make.defaults
@@ -1,3 +1,5 @@
+AR=llvm-ar
+AR_FOR_BUILD=llvm-ar
 BUILD_CC=x86_64-pc-linux-gnu-clang
 BUILD_CXX=x86_64-pc-linux-gnu-clang++
 BUILD_LD=x86_64-pc-linux-gnu-ld.lld
@@ -5,5 +7,13 @@
 CXX_FOR_BUILD=x86_64-pc-linux-gnu-clang++
 CCLD_FOR_BUILD=x86_64-pc-linux-gnu-clang
 CXXLD_FOR_BUILD=x86_64-pc-linux-gnu-clang++
+NM=llvm-nm
+NM_FOR_BUILD=llvm-nm
+OBJDUMP=llvm-objdump
+OBJDUMP_FOR_BUILD=llvm-objdump
+RANLIB=llvm-ranlib
+RANLIB_FOR_BUILD=llvm-ranlib
 READELF=llvm-readelf
 READELF_FOR_BUILD=llvm-readelf
+STRINGS=llvm-strings
+STRINGS_FOR_BUILD=llvm-strings
diff --git a/profiles/features/minimal/make.defaults b/profiles/features/minimal/make.defaults
index 05621af..71e08cc 100644
--- a/profiles/features/minimal/make.defaults
+++ b/profiles/features/minimal/make.defaults
@@ -31,8 +31,8 @@
 
 # Make stuff small.
 USE="${USE} -attestation -buffet -cellular chromeless_tty -crash_reporting"
-USE="${USE} -cros_disks cros_embedded -debugd -encrypted_stateful -gdmwimax"
-USE="${USE} -lorgnette -memd -mist -ml_service -pam -passive_metrics"
+USE="${USE} -cros_disks cros_embedded -diagnostics -debugd -encrypted_stateful"
+USE="${USE} -gdmwimax -lorgnette -memd -mist -ml_service -pam -passive_metrics"
 USE="${USE} -power_management -scanner -tpm -usb_bouncer -usbguard -vpn -wimax"
 
 # Disable auth frameworks.
diff --git a/profiles/targets/chromeos/make.defaults b/profiles/targets/chromeos/make.defaults
index 0c76732..35e8d2f 100644
--- a/profiles/targets/chromeos/make.defaults
+++ b/profiles/targets/chromeos/make.defaults
@@ -65,15 +65,20 @@
 # Enable fwupd support
 USE="${USE} fwupd"
 
-# Enable bluez-next
-# TODO(b/154866558): Remove when bluez-next becomes "current".
-USE="${USE} bluez-next bt_deprecated_tools"
+# Chrome OS needs deprecated tools: hcitool and hciconfig.
+USE="${USE} bt_deprecated_tools"
+
+# We don't provide this package anymore due to AGPL usage.
+USE="${USE} -berkdb"
+
+# Enable the diagnostics and telemetry daemon.
+USE="${USE} diagnostics"
 
 # Disable tty2 console.
 TTY_CONSOLE="-tty2"
 
 # Ozone platforms to build into Chrome.
-OZONE_PLATFORM="gbm"
+OZONE_PLATFORM="gbm headless"
 
 # Of the above, platform to use by default at runtime.
 OZONE_PLATFORM_DEFAULT="gbm"
@@ -95,10 +100,6 @@
           parallel-install -preserve-libs sandbox splitdebug -strict userfetch
           userpriv usersandbox -unknown-features-warn network-sandbox"
 
-# Enable license processing during our emerge hook:
-#   src/scripts/hooks/install/gen-package-licenses.sh.
-ENABLE_LICENSING="Y"
-
 # We reset compiler settings as the base ones are generic (just -O2) and our
 # common make.conf already adds those and more.
 CFLAGS=""
diff --git a/profiles/targets/chromeos/package.provided b/profiles/targets/chromeos/package.provided
index f4ff989..f410186 100644
--- a/profiles/targets/chromeos/package.provided
+++ b/profiles/targets/chromeos/package.provided
@@ -13,7 +13,7 @@
 
 app-admin/eselect-1.2.9
 app-admin/eselect-esd-20060719
-app-admin/eselect-opengl-1.0.8-r1
+app-admin/eselect-opengl-1.3.1-r4
 app-admin/eselect-mesa-0.0.8
 app-admin/eselect-vi-1.1.5
 
@@ -99,7 +99,7 @@
 dev-util/gtk-doc-1.13-r3
 dev-util/gtk-doc-am-1.13-r2
 dev-util/ninja-1.8.2
-dev-util/pkgconfig-0.23
+dev-util/pkgconfig-0.29.2
 
 perl-core/digest-base-1.16
 perl-core/File-Temp-0.230.400-r1
@@ -121,8 +121,8 @@
 
 sys-kernel/gentoo-sources-2.6.30-r6
 
-x11-apps/mkfontscale-1.0.6
-x11-misc/makedepend-1.0.1
+x11-apps/mkfontscale-1.2.1
+x11-misc/makedepend-1.0.6
 
 # Legacy font map encodings which we don't care about.  http://crosbug.com/25001
 media-fonts/encodings-1.0.3
@@ -134,8 +134,8 @@
 dev-util/boost-build-1.65.0
 
 # We don't need the toolchain itself in the target board.
-dev-lang/rust-1.43.0
-dev-lang/rust-1.44.0
+dev-lang/rust-1.45.2
+dev-lang/rust-1.46.0
 
 # We sometimes need ruby for building, but don't yet care about targets.
 dev-lang/ruby-1.9.4
diff --git a/profiles/targets/chromeos/package.use b/profiles/targets/chromeos/package.use
index 54f39c2..96d45b1d 100644
--- a/profiles/targets/chromeos/package.use
+++ b/profiles/targets/chromeos/package.use
@@ -23,8 +23,8 @@
 # don't use J-Link. It requires upgrading libjaylink, which is not yet
 # supported by official Gentoo portage repository.
 dev-embedded/openocd	-jlink
-dev-lang/perl		-berkdb gdbm
-dev-lang/python		-berkdb gdbm -sqlite
+dev-lang/perl		gdbm
+dev-lang/python		gdbm -sqlite
 dev-libs/dbus-glib	tools
 dev-libs/elfutils	-utils
 dev-libs/expat		-unicode
@@ -47,7 +47,7 @@
 chromeos-base/nsswitch	zeroconf
 media-gfx/imagemagick	jpeg png svg tiff
 # Disable all SANE backends that don't support USB.
-media-gfx/sane-backends -sane_backends_abaton -sane_backends_agfafocus -sane_backends_apple -sane_backends_artec -sane_backends_bh -sane_backends_canon -sane_backends_coolscan -sane_backends_dc210 -sane_backends_dc240 -sane_backends_dc25 -sane_backends_dmc -sane_backends_hs2p -sane_backends_ibm -sane_backends_kodak -sane_backends_leo -sane_backends_matsushita -sane_backends_microtek -sane_backends_mustek -sane_backends_nec -sane_backends_net -sane_backends_p5 -sane_backends_pie -sane_backends_plustek_pp -sane_backends_qcam -sane_backends_ricoh -sane_backends_s9036 -sane_backends_sceptre -sane_backends_sharp -sane_backends_sp15c -sane_backends_st400 -sane_backends_tamarack -sane_backends_teco1 -sane_backends_teco2 -sane_backends_teco3 -sane_backends_test -sane_backends_umax_pp
+media-gfx/sane-backends -sane_backends_abaton -sane_backends_agfafocus -sane_backends_apple -sane_backends_artec -sane_backends_bh -sane_backends_canon -sane_backends_coolscan -sane_backends_dc210 -sane_backends_dc240 -sane_backends_dc25 -sane_backends_dmc -sane_backends_hs2p -sane_backends_ibm -sane_backends_kodak -sane_backends_leo -sane_backends_matsushita -sane_backends_microtek -sane_backends_mustek -sane_backends_nec -sane_backends_net -sane_backends_p5 -sane_backends_pie -sane_backends_plustek_pp -sane_backends_qcam -sane_backends_ricoh -sane_backends_s9036 -sane_backends_sceptre -sane_backends_sharp -sane_backends_sp15c -sane_backends_st400 -sane_backends_tamarack -sane_backends_teco1 -sane_backends_teco2 -sane_backends_teco3 -sane_backends_umax_pp
 media-gfx/zbar		-gtk -imagemagick jpeg python -qt4 threads -v4l -X -xv
 media-libs/freeimage	png
 # TODO(derat): Unset glib for harfbuzz if/when pango is no longer needed:
@@ -97,7 +97,7 @@
 # No support for bluetooth printing.
 net-wireless/bluez	-cups
 net-wireless/wpa_supplicant-2_8	dbus debug -readline smartcard ssl
-net-wireless/wpa_supplicant-2_9	dbus debug -readline smartcard ssl
+net-wireless/wpa_supplicant-2_9	dbus debug -readline smartcard
 sci-geosciences/gpsd	-python -ntp -X dbus garmin minimal ocean tntc usb -sockets
 # Build only TF lite to save disk space.
 sci-libs/tensorflow	-python minimal
@@ -128,9 +128,12 @@
 sys-kernel/chromeos-kernel-3_14 -clang -lld
 sys-kernel/chromeos-kernel-3_18 -clang -lld
 sys-kernel/linux-firmware	linux_firmware_keyspan_usb
+# We disable berkdb in general, but we need gdbm to provide the API.
+sys-libs/gdbm		berkdb
 sys-libs/ldb		-python -lmdb
 sys-libs/ncurses	-cxx -unicode minimal tinfo
-sys-libs/pam		-berkdb
+# Readline requires the unicode flag to match sys-libs/ncurses.
+sys-libs/readline	-unicode
 sys-libs/talloc		-python
 sys-libs/tdb		-python
 sys-libs/tevent		-python
@@ -138,7 +141,7 @@
 sys-power/powertop	-unicode
 sys-process/htop	-unicode
 sys-process/procps	-unicode
-x11-apps/intel-gpu-tools	-python
+x11-apps/igt-gpu-tools	tests
 x11-apps/xinit		minimal
 x11-base/xorg-server	-suid
 x11-libs/libdrm		libkms
diff --git a/profiles/targets/sdk/package.use b/profiles/targets/sdk/package.use
index 365e11b..753e952 100644
--- a/profiles/targets/sdk/package.use
+++ b/profiles/targets/sdk/package.use
@@ -109,13 +109,11 @@
 
 # We don't need Python in these packages, so save some space.
 dev-libs/boost -python
-sys-apps/dtc -python
 
 # Freeze Python 2.7 versions for all existing packages.  We'll slowly trim this
 # list down as packages don't need them.  New packages should *not* be added
 # here as new code should be using Python 3.
 # TODO(crbug.com/1007152): Trim this entirely!
-app-portage/gentoolkit python_targets_python2_7
 chromeos-base/chromite-sdk python_targets_python2_7
 chromeos-base/ec-devutils python_targets_python2_7
 dev-libs/libnl python_targets_python2_7
@@ -150,7 +148,7 @@
 dev-python/grpcio-tools python_targets_python2_7
 dev-python/httplib2 python_targets_python2_7
 dev-python/idna python_targets_python2_7
-dev-python/imaging python_targets_python2_7
+dev-python/imaging python_targets_python2_7 jpeg
 dev-python/intelhex python_targets_python2_7
 dev-python/isort python_targets_python2_7
 dev-python/jaraco-functools python_targets_python2_7
@@ -249,7 +247,6 @@
 net-libs/nodejs python_targets_python2_7
 sys-apps/file python_targets_python2_7
 sys-apps/flashmap python_targets_python2_7
-sys-apps/portage python_targets_python2_7
 virtual/python-cffi python_targets_python2_7
 
 # These packages only support Python 2.7.  They aren't needed in Python 3.6+.
@@ -275,3 +272,9 @@
 virtual/python-pathlib python_targets_python2_7
 virtual/python-singledispatch python_targets_python2_7
 virtual/python-typing python_targets_python2_7
+
+# Required packages for Android ITS. See 2.2.1. Software installation from
+# http://androidxref.com/9.0.0_r3/raw/cts/apps/CameraITS/CameraITS.pdf for
+# details.
+media-libs/opencv python_targets_python2_7 -openmp
+dev-python/matplotlib python_targets_python2_7
diff --git a/sci-libs/tensorflow/Manifest b/sci-libs/tensorflow/Manifest
index 9b380fa..9a50679 100644
--- a/sci-libs/tensorflow/Manifest
+++ b/sci-libs/tensorflow/Manifest
@@ -1,17 +1,49 @@
 DIST ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz 100612 BLAKE2B 84f81072d3298dde613b4c1ebabf852c67e04b5882a4ca0ed6f218b42e8fa3ea9598140b0c0009e8d6b62d08902622a6d57ee005ec3ad8a808c9fb21aa53430c SHA512 03a289d8099a5c4a5298cba8f516d2edb41220935d8db750970113ca7513372c78241c2c948d0ffcd60e84686e50ba1d7fd0b46efea6881dd320435eca92a7b9
+DIST FP16-4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip 91462 BLAKE2B dc40d6129c009fc28b40d58b81b89e96a2deeeda3ea19c680b66073f02f955cc5dfc379d7843ec8aeed9fedeae6a70594b45752014526deee5c6226ec4b952e9 SHA512 15ae434977209a938739691eb91150556bac75a4a5449a9b4f135424f42beabd67ede4cf12c3a5594dea5028cc4aadaf989d0b42c2bb6f741db55ebd34717e24
+DIST FXdiv-b408327ac2a15ec3e43352421954f5b1967701d1.zip 16626 BLAKE2B 4259a745b96a92045d53b5bfdb7df21d69a23454617d11de40d18606039d56fb761fd96dc8d2f03c518421809e55a843adebb7a8defe876b4c4425315e395bf8 SHA512 8a2ef9b5c3353bbb53be3584bccf5bf0ebda99ff903b55d34a966768e3acfead08d1d981e7428697166e028067c90f31cbcf793a39d07d76c31b2fb51787f74e
+DIST OouraFFT-1.0.tar.gz 110531 BLAKE2B de0e280407e21118e2bc6ca93a7caf3c4a49d0a13eda018b1497f98851af73dda4cef56460dba310336c7ed958e34feef4784ca2575a13287dec2c1ac9a5af6d SHA512 89c6e8fd57abf26351b3efb792008a1bbe62d404a4225dcae8aa666b3782a421be071bdc9760ebb0c95b5336ee5ea517d2fa43ab915045f7cf6fd76e73578079
+DIST XNNPACK-8b283aa30a3186c6e640aed520543e9c067132d2.zip 4899219 BLAKE2B e56849bbb3f2875b5ea05d1c4c5fb44f728a9c7e41b28ff9d981854f2d795b7c3a340e0c2409f102799f1236b08a826ce436f87a8c1d03859e27bc84e071fea8 SHA512 9936faa1db617a701cbea62ddb5ce409ac4bbd480c791237e7ae2c093717e2a45f6cc74e6a6fbd6211e756a8cae134adc44366f8008c3bfeb943ecabc7a06463
 DIST abseil-cpp-daf381e8535a1f1f1b8a75966a74e7cca63dee89.tar.gz 1275955 BLAKE2B eb6e0f9d55458a4ae6e8b86be89add9b0cc44d1ff5a11f6fa1ec93e2f46885c8ff87b8c1e674e1ba5ac13556ed303963864057f0e258fce41fa753d891846996 SHA512 56a827296e2948b90922766369f2040e04abd03320375240ad32fcc2925cdd1ffea312edcef1009a0c8abd79f521a61e433b7651dd4c2721d2b1ad13f48256de
+DIST abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz 1679879 BLAKE2B ce92197c564ff774db46027c32f97cfd55ff1d77b7cec5424e127d10a3b0a54d9e84537bd643c4eb330ca81959bcc0316b13c013b229df06b7f415864c451e46 SHA512 b429758c37749d3d5c5c220fe0dc00fa0e193b406545484095339b25674c4a3bb7850b76dd1a370ed2006729bcbbbb1b438995b614e149c2290bdb10038c49d1
 DIST backports.weakref-1.0rc1.tar.gz 7761 BLAKE2B 4cb2554a4b71bb1f8c41a790268511e4b382effc7e0328f74346d086de539a177111de9e2dabac19a44b2a1cdbf59a7425e30eee4caa4bfe66b0ca97f1f460a9 SHA512 f37e9eb0d9060d2e1588a941f623460bd4477d7e180b38b5cd46d9c1db1ee094ae63e4f5eeeb422823bf3d067f46c4124cb124a9e4ddb795bc0bfbc4802ab826
+DIST bazel-2.0.0-dist.zip 259625808 BLAKE2B 31b62fb3da1f6fc7efc4c3f44521e12f879a1e5b532fe814d8f49c01c511b34cd65df252d6d143fdcd96f72dc94d76249f79be50fc66a459132c030ef0182ca8 SHA512 db609e9d0ee0cdbfb999de850db17907af02dc26e605f4617dfeb2fbac5c30c4c0a9f48c6ba3673ffe8babb5b9e157cc51c32832015b85ed279b6b160506cdae
 DIST bazel-skylib-0.6.0.tar.gz 29330 BLAKE2B 53d23a81203c08cb5ab4adbd308bb6c9875df0f2d27c6f8832a27397578e9214ebcd95f63bd6c539d534ecb5f2316116063e3e5d1a36986cf94d167d7823234d SHA512 14ce6782509be7d3cb0fe438aaad579ad23bf328d566cab06a2008990041ee098b4602542cb67961d757573a8c272e5dddb143efd756cd6ec40486159329fa91
+DIST bazel-toolchains-92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz 660374 BLAKE2B 549292aa3ad8a6e01c29391a123f3cbc84d1f714ff9c68bfc6c8df07fa0ba3b19c22e61627f227a8a484f6d7d6c59935fd7560c447559ff5e774ddf1437eefe1 SHA512 83531a2646a9f63557eff6fefaf551ee7e9f0ccdb31374d7a17c35b9f9d844b9b405597972fcd31b2b68e9da312511bbfd9c8fbb75222f5924e1d2500cd1c2a6
 DIST bazel-toolchains-94d31935a2c94fe7e7c7379a0f3393e181928ff7.tar.gz 505681 BLAKE2B f16225eb11859f487335bddca115c9c2a05731f4bfe4240609a47e17b706d9a25b6b363b61404b4d5df0471e4dd9b4b9befbf78dbcb1c7c11e3f590039ff92b2 SHA512 7723baf2c710adb063375a33fd64e3941fae7e98c824764c266d5554cc0b0cbb1c91a5c2a9058bb4c8766ec404ca556199ce22965a6de4baee09cb740b7671c9
+DIST bazel_skylib-0.9.0.tar.gz 84644 BLAKE2B 40b69a524e632ea00d34b9cf805b882ac4c549dd465ef37f28e54729ff1b614a7610a4895cede4e0c938edba5b19f781f3c0bfdb62bde628ee0af21d6b679546 SHA512 af4bcb641fed05d15f2d0ffe0e3abdfe9c7a5deb9c53064992d6605d224ded1648b1bdfa293e161028913f9f2c178c68cc38bc16028892ca5b0f52b4e645209d
+DIST bazelbuild-apple_support-501b4afb27745c4813a88ffa28acd901408014e4.tar.gz 19956 BLAKE2B 73f04a13f8ac3552e6f0770d1ac4edcc1b5ef46e4a3c4f3b83f11eeffa632f764d37aa7a98b35b5be6bd0caef19f84d0dc1b88bc55ff5397012863af4ee6d902 SHA512 732f482338996a62db24bfa6acd2fde6b629ac0a49317ed4e4778a55bbbbb22225f42a6cfa18cdcc51c200e29abe82a1f2a5548df09b7244074ae52e1f62ef66
+DIST bazelbuild-rules_android-0.1.1.zip 14654 BLAKE2B 1cfd5af08c6eab9602883f62d85ef1b9eb02383f73dcc31ae84af880c9ba228ae349ac6b017c550286e248347193e2c56eba30c86174432429809447dd940ed2 SHA512 80628a5e2ca9806ab031cd0c2f2999bd67f5621a83e8300a51fe6233373bdaf7c90ff8fa9551c81e60fc904c4d7b24554327ac8ed2ee101e92c4ab9319c53f4a
+DIST bazelbuild-rules_apple-5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz 1951045 BLAKE2B d8c17f301de729bbf5254acacf89490ab1034b1180d5ea788251ae6ba3e2b704c82d7f66d33a086f52ce3909cd33df7739d7d536c6be070a2d3454e2f280517f SHA512 a23826d8e53d49de6347eca052e980878d50b431bf02c9b8333234c0659d5e290447121bf9519729639891e67d732474a3c3b7a7502752b32f830680bb334bad
+DIST bazelbuild-rules_cc-01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip 171775 BLAKE2B ec0ece4555d779bc8380937baac517a8adf3b0176c4bfb1324943a91366ad9688f528a4bd69e4587bcc4ad427c71a53016a3e2d32a050d9d4ec99caac4967a8e SHA512 5c5e82f276c1c962fbd9c7ddf21df9aa4291f3285f3fa07cd2c2790475ccba670b0627fc3d6faedd1508eca4d80bdae64a31383f001f04f3031112be81c3e697
+DIST bazelbuild-rules_closure-308b05b2419edb5c8ee0471b67a40403df940149.tar.gz 464906 BLAKE2B 033d76b8081f4f987e64875ad5c8e7b8f894ec6be58c52ee02c4d31d4480fee02f3f432ea9c4630ad3f5d1163f820aff37f6493da797ec51b148b361ab3c8b25 SHA512 2cd841f4530503ed31fa6425cb749ef29f8a1071b5d55594644303233e58455783cb02402bc23d7104ef036745733087d43075a1fcdab2ac96cd1a9872a6ea4a
 DIST bazelbuild-rules_closure-cf1e44edb908e9616030cc83d085989b8e6cd6df.tar.gz 462798 BLAKE2B f461635702cd881828cf401c78fe0e64398c015d7f7824b369b0808d54224c633b6d8b699000e9e481ba094a93e01c33cc4360a541b2d520db10d3e9ef81007e SHA512 e85b13a50cbec60e4e574de9a3d3b646ca4bf045c55afcb41f2fd671202aac9e6d3e91c618f8923986ae142e615624718f3df0d1edb33a90e334f29667888d39
+DIST bazelbuild-rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip 9422 BLAKE2B bbc45c97551ee8126335b611ffca6574dac843d4db9b3221b10d26487f8eecfe38ba0cd67a4039a3ad921c25fea6294c43e4f4e7a57a060a30791acd6c4f9d39 SHA512 ba06242feb711e7fb6e821fd9ac029248b4f3e466fb1acf971d0db8196f3efe4d114ef137acbe4913073f8cbe8ccab4d47d8bafa21b867b2d6a6d57f5a647f0c
+DIST bazelbuild-rules_python-0.0.1.tar.gz 2302092 BLAKE2B 1db52eebf2461d779f764f2afdd070d1d0dd65eb2b83ccd98c2831da1784614ca281b114064729a9f257c64eceb62975aac8362d231c84f32abdf19aee7a1852 SHA512 40fa069a4482e2f83e29dc8e109652d14d187b2ec8efdcd36e98d117de93d66a938ed74999b42a2293fcb6eccc0a111cbbcf65c5c155579214bb1b96644280a5
+DIST bazelbuild-rules_swift-3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz 140484 BLAKE2B 2526d808a4763fffa16bb035de78993eefe6371a29139b152370081f548d8147868cc95194c06a54f1c5c0cd8b63ffbc59b00686bfaedede2463a448e38c2810 SHA512 e22a85a5dba52cc3474481798264571f6671aace19eecb058b24ac7d586ea7822ed3ae042b4a812671f81d4f9f8915aa2381fa6ac278da7969b976eaf28db636
 DIST bazelbuild-rules_swift.0.9.0.tar.gz 105918 BLAKE2B 8f1bd8f5a468e3b37c614cf498a6cd8ceca55b255d6f096ebf88cd77e95148eab3fb5a128ed93b40f6d1ee8988b8dfd300fdf7061fc4ed4f1fb4ab25446ebe58 SHA512 68e985fa30b865317ccf59473cb52873d65159b866a54e35b3fbf83c135f3c750752663e962decbc8ebcd17b5784867d4d4767dd0b706f1182d4715291d8268b
+DIST cpuinfo-6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip 3787039 BLAKE2B 3a529648d548b7570fd38783e5a3915bf3ad82ab028ee11f70fddaf09b8d64dc58f4d32ed54557b9f3087a8bb13ff4fd78b3597df6b1b5d3c3ef65c03193251a SHA512 8b34e580f19494f92796176db3f14680fd1b7b64458c0ef8e71ff1b3f1cbe12204e901167a585c1e04e95fbeaad5de104abc5edf3ea81a0da1c480a99f6bb94b
+DIST cpuinfo-d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz 3489028 BLAKE2B aa6b7719eb9871b6cc71318cb4a9c2e2397e665662b7978daecd9e8380304691a78b95118eba5cbbb738c4b490352a847f6ce6b5c4ae29de0543b95ecc557cbb SHA512 ecd2115340fa82a67db7889ce286c3070d5ab9c30b02372b08aac893e90ccebc65c6b3e66aa02a9ae9c57892d2d8c3b77cb836e5fc3b88df2c75d33e574d90d2
 DIST cub-1.8.0.zip 602396 BLAKE2B a5e302a52e04f85ae8e1836c59e799532a8b961a8d10c08fe1241c9045f88e31f1ebda6d26124b85c6df40968e1c7b3985a39961bf7614535aafcab2da1a576a SHA512 6167c5be94989f88e05a07508cf69cf2c6b22a5ac733804043daa46bd86a44a15a758b1ffb811bab28b82039d027516ed85b3d9f7677a740a7e00ec9c2f81aed
+DIST dlpack-3efc489b55385936531a06ff83425b719387ec63.tar.gz 39637 BLAKE2B 532a3ce3d0e354a73c19433f0210a64ecbf00d9134d06a0ee7462baaff3f2b981524aa630cf250595671d6673105724482c7d69e803179aac247f2020c883bd0 SHA512 3728db5213e887fd946f64ba5dc0c336be9a72a0966ee83f146148749ffc93ddb342e0735df6117d7943874c18f87de5791a28e4a57ea420bb8a4e2a5b7338bc
+DIST eigen-386d809bde475c65b7940f290efe80e6a05878c4.tar.gz 2628283 BLAKE2B feac186ce8d18026b10be4955267ed65b65b4432f02bcf817da08960c9164bcb22b352c413f59890aac2de87c5e3e9e05ea48dff28635bc8901628af518dc4d2 SHA512 f183bfe235a98dc308c69a1d9e168b538cc92cfbbe35d4e35596b0b2588ecad66212efb3d3ffbba7c8adbd67be24cc4dda5dba8dcdd67245eca2b1a0fb94d380
 DIST eigen-a0d250e79c79.tar.gz 2468318 BLAKE2B 8799adc1a13612820251cd22a7ddc347ee4711d583561a5df9735bd22ab727c0d8e7fdc894cd7e83b3b972d5adcb86f033bc089e1a4de5fe4e6257f78df88957 SHA512 864646a0b3fd8287fbf6943f4cc7f692a883e6164add21c97e98372641b32e5ceffadc825178b9d11e9504377b837d0e54a264b7a53b28e4f9fc2a23c616d2b3
 DIST farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz 467122 BLAKE2B 8b9dd426f4b9f732df6c8c09d868d1b1cc006c395b1525c46ea91c75318b723358c8e64bb0d86a73aace2032eded93f0d80cc7c2c77fddd6a39e3402ab4f2cb7 SHA512 7f5110514a8cdc7ce48d33fd94ad67d96a24e42e11b203e4d0986f4190545f051b2a63f8e09f2ac38c3aa4a5c62d9a0e02cd8ce02045037381fb62a99f0dcd00
 DIST gemmlowp-12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip 935628 BLAKE2B 09bd1dd1e367b1e5c4fe9a9525449c09460f19168bc03c57ad563aa27ec74a18f08b620a3dab6da4fa1a1448cdc7ce8bc8a089becc033b53fff4cc07593315ce SHA512 bd42a364f718f3b077cd9c840d626bfc1fd92ace98ce43329d8fa54700c9d28cb47568b6567e9b081b340af7be621c44be1ce06d4b8dccc4fb5d82c35b12f951
+DIST gemmlowp-fda83bdc38b118cc6b56753bd540caa49e570745.zip 936866 BLAKE2B 0977df121a80de979a9996b58a0a8cad157db8d0862b96f95b3be1157cddbc6b40dff4fc7da4ee78f5986cbfff2a67c173155e849e772ae476398c51f3028311 SHA512 4bf036de43f5e0890f66e0b16cd9a0f52911b160f79c9c50cf403454fa9d6040df225d34e02f424da8bb8c5f7f5c002f88f4d232c61503aa825c907ad8742823
+DIST googleapis-541b1ded4abadcc38e8178680b0677f65594ea6f.zip 5498751 BLAKE2B deedce8127d8241116afcd831898bd23235e07dd6de1b693a0edaaf6805bd3c9ba92c25e08d452406fb617fd173c7ad55b44811065078e99734557c3ea3ed6dd SHA512 949de688244bd4e05dc3ac68d7a1d00e3def55a0465ef6c1aa3d4c83e55397db87313c96abad97a9e5dc68836640d261b91da22b4fe521c24cd97453a2c7f80a
 DIST highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz 138574 BLAKE2B cecd95039fc31545ced38a1949e7cb31d6f34deef7c8923b573aa7a632576d0a9b60fd24fbc8a40b8a840a7d2442ea28382fe842178a77467772ed4ba8a2cfb6 SHA512 d25162ed266a8c9c00e6978fcf642cf924f03c0d196f971d0d6f6a3454ca7dfc82f758eabd038ac08e0a5dacc51eccb9b674f588f64692f37cb7a17150aefe4f
+DIST kissfft-36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz 44744 BLAKE2B aeea5d23c122417ddb70a44354890242c4fb61c456fba9af79054293a1355939af51a681760ac27be55423f888649fd2826e634422c7e9cb3749a9d7f50ef990 SHA512 30f4fcd351bbcb950a27e2a77ca100ccdfd37deb17a05e7e31c3e8f1c56d7c626ab81bbd7497484e6b512e41f7b1bed714722a194b2218c669b297911101df7b
+DIST llvm-387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz 115936989 BLAKE2B 624b4a898321e62002cbf3955f844755b3ba6b1c8acf9a310ddac19cf21f9627902eb0b3684e42bac1fe835be972322a5cc667f78a6e2b0e699f956e0cab81e8 SHA512 09ec39ec7a25703bbb47befb406be3de6d15232c971fa186e33dff80192876a827e35523a9782365e26a90abd42b32b9a2ee1443af71cc23cd825b3ff05df629
+DIST nvidia-nccl-3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz 123898 BLAKE2B 9a268e089877fde9ac900b43bbf829f7dedfa701b017568647e3564670d5457dc18c96846a2cc8674b243c0c7d97d322e7466167c322588af3ad4f2d189b175b SHA512 9b090a963213eb088edf247e72b51a6cc79669f507831b88205c75a006a43f3d2257c4e75a34c33987c7d95c421e2273642db4c716b02907e8de1b1ef5d080f0
 DIST nvidia-nccl-f93fe9bfd94884cec2ba711897222e0df5569a53.tar.gz 95617 BLAKE2B 023788db444b1a50f01ab16f126c920f530a6ff5bf2a9327626db45f985b4093c1024d16d43cdee9f0b3ee5c8b7d104f2a6b1dab0460c6b1998b42a0354f6f27 SHA512 d6b4dd4d6c7c9ca2dcf0699055c9193d4b46c0c5155e0108db38094577c92f954f604b2e83ca320873288e0010eaa3c5812f05f7fafe5112bebbca78e56cb279
 DIST oourafft-20061228.tgz 72213 BLAKE2B 4a3ac2b4c0bc3275b5743df59241e1cdbd0200371c153ddf54ef6c7c4ec523ee6560547e2d5ef9f3200037c0635bf41c18991ac35f271b1e600d0dbd65d1a9a7 SHA512 f1ceac00cb7b9eb8f625eee7f1f5eea8af363343589a344226628d68baf668c176e6c23b7f904c4e682330352eaa0cd5d00731340d208e94c9657b8f85ae2240
+DIST psimd-072586a71b55b7f8c584153d223e95687148a900.zip 8327 BLAKE2B 56af2276033b512551862d405e2511b14a6838327f8950b979b3df3833cf80f034d0fc91a8798fe0f1dd3b35c7e55051c4ec19dc22c3f4c1364d67efcb95d7d6 SHA512 98c9e13f1e79db84289f48f1e1699852a54d3a7f1b07144008c67cf73c8b4487e9647755f6fe2a2d519419d669248b37a85d8aa3f6ad2f8fdf8e97d2de7ed7c4
+DIST pthreadpool-029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip 58870 BLAKE2B 9b8a49affebc8f894d86617344c97c25cc0277fb48b4de3a8601e0fc6e1fcefef6732355d6e05c35aef2326ca57b9b604934081e43f24643e85f37b7977028d9 SHA512 51b171b9cdd26b440a38ef204cfd0ba91cb85c908dfa67d7b0171878b2f146805f0bcbe147f9e8c4a4c8f3aa0d6bc7cb9833bad60c3a1adbe3f66a29fa22e0c5
+DIST re2-506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz 316237 BLAKE2B 8a975bc3e78b690f70944651c7022c6d946f40b2eb5fe01b2e203141f94b890cf1ad5c72af8e7c6ff3c5242d42af5a8657ed69e3c74d9ac081beb15de6334c0c SHA512 e3e00e92700d08bc55ba0e96148ddf1e00de2d329c1fdac08691ff15976937829f66dbc84af886a4b749ad66ba4ab208d66811e97e33bb9c2d7359735406c450
 DIST rules_docker-b8ff6a85ec359db3fd5657accd3e524daf12016d.tar.gz 460121 BLAKE2B bca31bbdd9069647fa9560002e63a404e2bd4d4ebd19d90e28d08f797f8f63157cc127dab26b996bb976e50f099928a91c1d6343427cb85048c6ca2b47c0c7e2 SHA512 461a663189e5995e31ee8175ee260e1ad06b00ee8a7548b9d3a946a2de693311031ec6eba89e3bad527f5d8f76ed25626ef4ea05a8d6e7579932dc1be3b0a6ba
+DIST ruy-34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip 312628 BLAKE2B e42c484092f5e93dee11bc7c6a92ade3b63533d3507fa5a805b16e3508b8a20b7cff734197ab9d8e9b0e67e9648987ccedc19a23deea93bb00269d2fc65424a4 SHA512 d1b5a73feb4cced7ee49e9bacb80f437b0bcde204c3bc082a2729efb1989517ac97d764d6fe00bd66f0d5349d19d9e0593868c8d22369dc38732cd2204419b1d
+DIST sobol_data-835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz 2569603 BLAKE2B cd66dc8a0b4ad3ea586a79ef588c8d68e4f05b6ea89e6d8119b5ee338b9046c11a747ca57c2f80a3c90fab119c05e85f5965571c9e522ccb8a312b95804d1a36 SHA512 b819d050bb38246b503f1eb3d6e7d878d0f166f3602ae3c327749b1f6ddc2b1d6ac7f768b1f1d055b98b7b98812e4643a75bcebc9728c7f615d67ca739761b3e
 DIST tensorflow-1.14.0-python-license.rst.txt 45132 BLAKE2B 8a8ace4b64fd9eda1932272704dd4fea002d2562cd9c2c94470d3ff5de58bb171ff849d3f998ea90cd779d1084d39af1267aca8400b74b701205d2e76e6a2628 SHA512 c79c42f4ceecf33c8f8778ca17b53595b75d5d0bdf30b11058cf01dd70a6351f530ca9dd846460aba14edc1d5876f7bf6fa0f9f49f7915590b0f54d267ce3856
 DIST tensorflow-1.14.0.tar.gz 41335204 BLAKE2B d91d84c5d86c838cc659c45e28cf3c8a9ec9a02f5854a1826680806dae41cdd00ea49a6d2c04f2019b3400c6e267c6ca6f3b28e43b244569dca174ff7f2c59d6 SHA512 ac9ea5a2d1c761aaafbdc335259e29c128127b8d069ec5b206067935180490aa95e93c7e13de57f7f54ce4ba4f34a822face22b4a028f60185edb380e5cd4787
+DIST tensorflow-1.15.0-python-license.rst.txt 45132 BLAKE2B 8a8ace4b64fd9eda1932272704dd4fea002d2562cd9c2c94470d3ff5de58bb171ff849d3f998ea90cd779d1084d39af1267aca8400b74b701205d2e76e6a2628 SHA512 c79c42f4ceecf33c8f8778ca17b53595b75d5d0bdf30b11058cf01dd70a6351f530ca9dd846460aba14edc1d5876f7bf6fa0f9f49f7915590b0f54d267ce3856
+DIST tensorflow-2.3.0.tar.gz 46532261 BLAKE2B 48fddef6e7a13fb3e10f17db9475d8db3336301ecf21e2f4980bf08beb58c0aac136fa536a5a6ab38284348f137e6fcbf4c0efcf78a4d91a9812e40d09c5149f SHA512 86aa087ea84dac1ecc1023b23a378100d41cc6778ccd20404a4b955fc67cef11b3dc08abcc5b88020124d221e6fb172b33bd5206e9c9db6bc8fbeed399917eac
diff --git a/sci-libs/tensorflow/files/tensorflow-1.14.0-0007-flatbuffers-deps.patch b/sci-libs/tensorflow/files/tensorflow-1.14.0-0007-flatbuffers-deps.patch
new file mode 100644
index 0000000..41535e6
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-1.14.0-0007-flatbuffers-deps.patch
@@ -0,0 +1,15 @@
+Flatbuffers 1.12.0 introduces a dependency on absl/string_view.h and needs
+to be explicitly defined in the build file.
+
+diff --git a/tensorflow/lite/kernels/BUILD b/tensorflow/lite/kernels/BUILD
+index 95f554ad..d0369e3b 100644
+--- a/tensorflow/lite/kernels/BUILD
++++ b/tensorflow/lite/kernels/BUILD
+@@ -395,6 +395,7 @@ cc_library(
+         "//tensorflow/lite/kernels/internal:reference_base",
+         "//tensorflow/lite/kernels/internal:tensor",
+         "//tensorflow/lite/kernels/internal:tensor_utils",
++        "@com_google_absl//absl/strings:strings",
+         "@farmhash_archive//:farmhash",
+         "@flatbuffers",
+     ],
diff --git a/sci-libs/tensorflow/files/tensorflow-2.3.0-0001-workspace.patch b/sci-libs/tensorflow/files/tensorflow-2.3.0-0001-workspace.patch
new file mode 100644
index 0000000..68d2ad5
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-2.3.0-0001-workspace.patch
@@ -0,0 +1,128 @@
+Remove unneeded repositories that fail to get downloaded correctly. Some of
+this has been done upstream, but not yet released:
+https://github.com/tensorflow/tensorflow/commit/6a6071412a2fd19ec9b23f2cc3e2c9d5e20a9c45
+
+diff --git a/WORKSPACE b/WORKSPACE
+index ea741c31..454e201a 100644
+--- a/WORKSPACE
++++ b/WORKSPACE
+@@ -29,25 +29,6 @@ load("//third_party/toolchains/preconfig/generate:archives.bzl",
+
+ bazel_toolchains_archive()
+
+-load(
+-    "@bazel_toolchains//repositories:repositories.bzl",
+-    bazel_toolchains_repositories = "repositories",
+-)
+-
+-bazel_toolchains_repositories()
+-
+-load(
+-    "@io_bazel_rules_docker//repositories:repositories.bzl",
+-    container_repositories = "repositories",
+-)
+-
+-container_repositories()
+-
+-load("//third_party/toolchains/preconfig/generate:workspace.bzl",
+-     "remote_config_workspace")
+-
+-remote_config_workspace()
+-
+ # Use `swift_rules_dependencies` to fetch the toolchains. With the
+ # `git_repository` rules above, the following call will skip redefining them.
+ load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies")
+@@ -142,10 +123,6 @@ load(
+
+ apple_support_dependencies()
+
+-load("@upb//bazel:repository_defs.bzl", "bazel_version_repository")
+-
+-bazel_version_repository(name = "bazel_version")
+-
+ load("//third_party/googleapis:repository_rules.bzl", "config_googleapis")
+
+ config_googleapis()
+diff --git a/third_party/toolchains/preconfig/generate/workspace.bzl b/third_party/toolchains/preconfig/generate/workspace.bzl
+deleted file mode 100644
+index 81b57dfa..00000000
+--- a/third_party/toolchains/preconfig/generate/workspace.bzl
++++ /dev/null
+@@ -1,77 +0,0 @@
+-load(
+-    "@io_bazel_rules_docker//repositories:repositories.bzl",
+-    container_repositories = "repositories",
+-)
+-load(
+-    "@io_bazel_rules_docker//container:container.bzl",
+-    "container_pull",
+-)
+-load(":containers.bzl", "container_digests")
+-
+-def _remote_config_workspace():
+-    container_repositories()
+-
+-    container_pull(
+-        name = "centos6",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-centos6",
+-        digest = container_digests["centos6"],
+-    )
+-
+-    container_pull(
+-        name = "ubuntu16.04",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-ubuntu16.04",
+-        digest = container_digests["ubuntu16.04"],
+-    )
+-
+-    container_pull(
+-        name = "cuda10.0-cudnn7-ubuntu14.04",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-cuda10.0-cudnn7-ubuntu14.04",
+-        digest = container_digests["cuda10.0-cudnn7-ubuntu14.04"],
+-    )
+-
+-    container_pull(
+-        name = "cuda10.0-cudnn7-centos6",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-cuda10.0-cudnn7-centos6",
+-        digest = container_digests["cuda10.0-cudnn7-centos6"],
+-    )
+-
+-    container_pull(
+-        name = "cuda10.1-cudnn7-centos6",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-cuda10.1-cudnn7-centos6",
+-        digest = container_digests["cuda10.1-cudnn7-centos6"],
+-    )
+-
+-    container_pull(
+-        name = "ubuntu16.04-manylinux2010",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-ubuntu16.04-manylinux2010",
+-        digest = container_digests["ubuntu16.04-manylinux2010"],
+-    )
+-
+-    container_pull(
+-        name = "cuda10.0-cudnn7-ubuntu16.04-manylinux2010",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-cuda10.0-cudnn7-ubuntu16.04-manylinux2010",
+-        digest = container_digests["cuda10.0-cudnn7-ubuntu16.04-manylinux2010"],
+-    )
+-
+-    container_pull(
+-        name = "cuda10.1-cudnn7-ubuntu16.04-manylinux2010",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-cuda10.1-cudnn7-ubuntu16.04-manylinux2010",
+-        digest = container_digests["cuda10.1-cudnn7-ubuntu16.04-manylinux2010"],
+-    )
+-
+-    container_pull(
+-        name = "rocm-ubuntu16.04",
+-        registry = "gcr.io",
+-        repository = "tensorflow-testing/nosla-rocm-ubuntu16.04",
+-        digest = container_digests["rocm-ubuntu16.04"],
+-    )
+-
+-remote_config_workspace = _remote_config_workspace
diff --git a/sci-libs/tensorflow/files/tensorflow-2.3.0-0002-nnapi-android-sdk-version.patch b/sci-libs/tensorflow/files/tensorflow-2.3.0-0002-nnapi-android-sdk-version.patch
new file mode 100644
index 0000000..1f8e171
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-2.3.0-0002-nnapi-android-sdk-version.patch
@@ -0,0 +1,20 @@
+A patch that fakes the android version so that NNAPI can be loaded and used
+by tensorflow on chrome OS.
+
+This patch can be removed when
+https://github.com/tensorflow/tensorflow/commit/2fd3f75f05b99cd2d3c36ac57384633e7707d307
+is released.
+
+diff --git a/tensorflow/lite/nnapi/nnapi_implementation.cc b/tensorflow/lite/nnapi/nnapi_implementation.cc
+index 862c4ba2..e275f266 100644
+--- a/tensorflow/lite/nnapi/nnapi_implementation.cc
++++ b/tensorflow/lite/nnapi/nnapi_implementation.cc
+@@ -92,7 +92,7 @@ int ASharedMemory_create(const char* name, size_t size) {
+
+ const NnApi LoadNnApi() {
+   NnApi nnapi = {};
+-  nnapi.android_sdk_version = 0;
++  nnapi.android_sdk_version = 30;
+
+ #ifdef __ANDROID__
+   nnapi.android_sdk_version = GetAndroidSdkVersion();
diff --git a/sci-libs/tensorflow/files/tensorflow-2.3.0-0003-ashmem-create.patch b/sci-libs/tensorflow/files/tensorflow-2.3.0-0003-ashmem-create.patch
new file mode 100644
index 0000000..8971bbd
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-2.3.0-0003-ashmem-create.patch
@@ -0,0 +1,23 @@
+Tensorflow uses its on implementation of ashmem_create if it is
+not being built for Android.
+
+That implementation has a bug, where if the same 'name' is passed in
+for multiple invocations, it will resize the underlying shared memory
+file, effectively ignoring the 'anonymous' aspect expected of ashmem.
+
+Our implementation handles this better, and this ensures all of the ashmem
+functionlity is consistenly served from our implementation.
+
+diff --git a/tensorflow/lite/nnapi/nnapi_implementation.cc b/tensorflow/lite/nnapi/nnapi_implementation.cc
+index 862c4ba2..e275f266 100644
+--- a/tensorflow/lite/nnapi/nnapi_implementation.cc
++++ b/tensorflow/lite/nnapi/nnapi_implementation.cc
+@@ -170,7 +170,8 @@ const NnApi LoadNnApi() {
+   // implementation, but don't have libneuralnetworks.so library, and
+   // platforms which use nnapi_implementation_disabled.cc stub.
+   if (libneuralnetworks != nullptr) {
+-    nnapi.ASharedMemory_create = ASharedMemory_create;
++    LOAD_FUNCTION_RENAME(libneuralnetworks, ASharedMemory_create,
++                         "ashmem_create_region");
+   }
+ #endif  // __ANDROID__
diff --git a/sci-libs/tensorflow/files/tensorflow-2.3.0-0004-nnapi-delegates.patch b/sci-libs/tensorflow/files/tensorflow-2.3.0-0004-nnapi-delegates.patch
new file mode 100644
index 0000000..fae4ffa
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-2.3.0-0004-nnapi-delegates.patch
@@ -0,0 +1,147 @@
+Patch the code in the tools directory so that it loads the NNAPI delegate
+correctly without needing to define __ANDROID__
+
+diff --git a/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc b/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
+index bde9c0e0..ddbbfe60 100644
+--- a/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
++++ b/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
+@@ -16,9 +16,7 @@ limitations under the License.
+
+ #include "tensorflow/lite/tools/delegates/delegate_provider.h"
+ #include "tensorflow/lite/tools/evaluation/utils.h"
+-#if defined(__ANDROID__)
+ #include "tensorflow/lite/nnapi/nnapi_util.h"
+-#endif
+
+ namespace tflite {
+ namespace tools {
+@@ -26,7 +24,6 @@ namespace tools {
+ class NnapiDelegateProvider : public DelegateProvider {
+  public:
+   NnapiDelegateProvider() {
+-#if defined(__ANDROID__)
+     default_params_.AddParam("use_nnapi", ToolParam::Create<bool>(false));
+     default_params_.AddParam("nnapi_execution_preference",
+                              ToolParam::Create<std::string>(""));
+@@ -36,7 +33,6 @@ class NnapiDelegateProvider : public DelegateProvider {
+                              ToolParam::Create<bool>(false));
+     default_params_.AddParam("nnapi_allow_fp16",
+                              ToolParam::Create<bool>(false));
+-#endif
+   }
+
+   std::vector<Flag> CreateFlags(ToolParams* params) const final;
+@@ -51,7 +47,6 @@ REGISTER_DELEGATE_PROVIDER(NnapiDelegateProvider);
+
+ std::vector<Flag> NnapiDelegateProvider::CreateFlags(ToolParams* params) const {
+   std::vector<Flag> flags = {
+-#if defined(__ANDROID__)
+     CreateFlag<bool>("use_nnapi", params, "use nnapi delegate api"),
+     CreateFlag<std::string>("nnapi_execution_preference", params,
+                             "execution preference for nnapi delegate. Should "
+@@ -64,14 +59,12 @@ std::vector<Flag> NnapiDelegateProvider::CreateFlags(ToolParams* params) const {
+                      "Disable the NNAPI CPU device"),
+     CreateFlag<bool>("nnapi_allow_fp16", params,
+                      "Allow fp32 computation to be run in fp16")
+-#endif
+   };
+
+   return flags;
+ }
+
+ void NnapiDelegateProvider::LogParams(const ToolParams& params) const {
+-#if defined(__ANDROID__)
+   TFLITE_LOG(INFO) << "Use nnapi : [" << params.Get<bool>("use_nnapi") << "]";
+   if (params.Get<bool>("use_nnapi")) {
+     if (!params.Get<std::string>("nnapi_execution_preference").empty()) {
+@@ -97,13 +90,11 @@ void NnapiDelegateProvider::LogParams(const ToolParams& params) const {
+                        << params.Get<bool>("nnapi_allow_fp16") << "]";
+     }
+   }
+-#endif
+ }
+
+ TfLiteDelegatePtr NnapiDelegateProvider::CreateTfLiteDelegate(
+     const ToolParams& params) const {
+   TfLiteDelegatePtr delegate(nullptr, [](TfLiteDelegate*) {});
+-#if defined(__ANDROID__)
+   if (params.Get<bool>("use_nnapi")) {
+     StatefulNnApiDelegate::Options options;
+     std::string accelerator_name =
+@@ -163,7 +154,6 @@ TfLiteDelegatePtr NnapiDelegateProvider::CreateTfLiteDelegate(
+                      << params.Get<std::string>("nnapi_execution_preference")
+                      << ") to be used.";
+   }
+-#endif
+   return delegate;
+ }
+
+diff --git a/tensorflow/lite/tools/evaluation/BUILD b/tensorflow/lite/tools/evaluation/BUILD
+index 85dfb183..92478a3d 100644
+--- a/tensorflow/lite/tools/evaluation/BUILD
++++ b/tensorflow/lite/tools/evaluation/BUILD
+@@ -46,7 +46,9 @@ cc_library(
+             "//tensorflow/lite/delegates/gpu:delegate",
+             "//tensorflow/lite/delegates/nnapi:nnapi_delegate",
+         ],
+-        "//conditions:default": [],
++        "//conditions:default": [
++            "//tensorflow/lite/delegates/nnapi:nnapi_delegate",
++        ],
+     }) + select({
+         "//tensorflow:android_arm": [
+             "//tensorflow/lite/delegates/hexagon:hexagon_delegate",
+diff --git a/tensorflow/lite/tools/evaluation/utils.cc b/tensorflow/lite/tools/evaluation/utils.cc
+index c766a932..d3880647 100644
+--- a/tensorflow/lite/tools/evaluation/utils.cc
++++ b/tensorflow/lite/tools/evaluation/utils.cc
+@@ -95,24 +95,18 @@ TfLiteStatus GetSortedFileNames(
+
+ // TODO(b/138448769): Migrate delegate helper APIs to lite/testing.
+ TfLiteDelegatePtr CreateNNAPIDelegate() {
+-#if defined(__ANDROID__)
+   return TfLiteDelegatePtr(
+       NnApiDelegate(),
+       // NnApiDelegate() returns a singleton, so provide a no-op deleter.
+       [](TfLiteDelegate*) {});
+-#else
+-  return CreateNullDelegate();
+-#endif  // defined(__ANDROID__)
+ }
+
+-#if defined(__ANDROID__)
+ TfLiteDelegatePtr CreateNNAPIDelegate(StatefulNnApiDelegate::Options options) {
+   return TfLiteDelegatePtr(
+       new StatefulNnApiDelegate(options), [](TfLiteDelegate* delegate) {
+         delete reinterpret_cast<StatefulNnApiDelegate*>(delegate);
+       });
+ }
+-#endif  // defined(__ANDROID__)
+
+ #if defined(__ANDROID__)
+ TfLiteDelegatePtr CreateGPUDelegate(TfLiteGpuDelegateOptionsV2* options) {
+diff --git a/tensorflow/lite/tools/evaluation/utils.h b/tensorflow/lite/tools/evaluation/utils.h
+index 5d9920cf..5dbc035c 100644
+--- a/tensorflow/lite/tools/evaluation/utils.h
++++ b/tensorflow/lite/tools/evaluation/utils.h
+@@ -21,9 +21,9 @@ limitations under the License.
+ #include <unordered_set>
+ #include <vector>
+
++#include "tensorflow/lite/delegates/nnapi/nnapi_delegate.h"
+ #if defined(__ANDROID__)
+ #include "tensorflow/lite/delegates/gpu/delegate.h"
+-#include "tensorflow/lite/delegates/nnapi/nnapi_delegate.h"
+ #if (defined(__arm__) || defined(__aarch64__))
+ #include "tensorflow/lite/delegates/hexagon/hexagon_delegate.h"
+ #endif
+@@ -62,9 +62,7 @@ inline TfLiteStatus GetSortedFileNames(const std::string& directory,
+ }
+
+ TfLiteDelegatePtr CreateNNAPIDelegate();
+-#if defined(__ANDROID__)
+ TfLiteDelegatePtr CreateNNAPIDelegate(StatefulNnApiDelegate::Options options);
+-#endif
+
+ TfLiteDelegatePtr CreateGPUDelegate();
+ #if defined(__ANDROID__)
diff --git a/sci-libs/tensorflow/files/tensorflow-2.3.0-0005-cpuinfo-arm-fix.patch b/sci-libs/tensorflow/files/tensorflow-2.3.0-0005-cpuinfo-arm-fix.patch
new file mode 100644
index 0000000..63590f9
--- /dev/null
+++ b/sci-libs/tensorflow/files/tensorflow-2.3.0-0005-cpuinfo-arm-fix.patch
@@ -0,0 +1,22 @@
+diff --git a//third_party/cpuinfo/cpuinfo.patch b//third_party/cpuinfo/cpuinfo.patch
+index d9a16c5..be77fb5 100644
+--- a/third_party/cpuinfo/cpuinfo.patch
++++ b/third_party/cpuinfo/cpuinfo.patch
+@@ -128,3 +128,17 @@ index 98ef919..8365846 100644
+  		printf("\tIDIV: %s\n", cpuinfo_has_arm_idiv() ? "yes" : "no");
+
+  	printf("Floating-Point support:\n");
++diff --git a/src/arm/linux/cp.h b/src/arm/linux/cp.h
++index 63940ec..9403a65 100755
++--- a/src/arm/linux/cp.h
+++++ b/src/arm/linux/cp.h
++@@ -37,8 +37,6 @@
++ 	#endif
++
++ 	static inline uint32_t read_wcid(void) {
++-		uint32_t wcid;
++-		__asm__ __volatile__("MRC p1, 0, %[wcid], c0, c0" : [wcid] "=r" (wcid));
++-		return wcid;
+++		return 0;
++ 	}
++ #endif
diff --git a/sci-libs/tensorflow/tensorflow-1.14.0-r11.ebuild b/sci-libs/tensorflow/tensorflow-1.14.0-r13.ebuild
similarity index 100%
rename from sci-libs/tensorflow/tensorflow-1.14.0-r11.ebuild
rename to sci-libs/tensorflow/tensorflow-1.14.0-r13.ebuild
diff --git a/sci-libs/tensorflow/tensorflow-1.14.0.ebuild b/sci-libs/tensorflow/tensorflow-1.14.0.ebuild
index fde679d..b4df961 100644
--- a/sci-libs/tensorflow/tensorflow-1.14.0.ebuild
+++ b/sci-libs/tensorflow/tensorflow-1.14.0.ebuild
@@ -1,7 +1,7 @@
 # Copyright 1999-2019 Jason Zaman
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 DISTUTILS_OPTIONAL=1
 PYTHON_COMPAT=( python2_7 python{3_5,3_6,3_7} )
@@ -129,6 +129,7 @@
 	"${FILESDIR}/tensorflow-1.14.0-0004-neon-2-sse-header.patch"
 	"${FILESDIR}/tensorflow-1.14.0-0005-nnapi-android-sdk-version.patch"
 	"${FILESDIR}/tensorflow-1.14.0-0006-label-image-nnapi.patch"
+	"${FILESDIR}/tensorflow-1.14.0-0007-flatbuffers-deps.patch"
 )
 DOCS=( AUTHORS CONTRIBUTING.md ISSUE_TEMPLATE.md README.md RELEASE.md )
 CHECKREQS_MEMORY="5G"
diff --git a/sci-libs/tensorflow/tensorflow-2.3.0-r1.ebuild b/sci-libs/tensorflow/tensorflow-2.3.0-r1.ebuild
new file mode 120000
index 0000000..3ce7e3c
--- /dev/null
+++ b/sci-libs/tensorflow/tensorflow-2.3.0-r1.ebuild
@@ -0,0 +1 @@
+tensorflow-2.3.0.ebuild
\ No newline at end of file
diff --git a/sci-libs/tensorflow/tensorflow-2.3.0.ebuild b/sci-libs/tensorflow/tensorflow-2.3.0.ebuild
new file mode 100644
index 0000000..9907cb3
--- /dev/null
+++ b/sci-libs/tensorflow/tensorflow-2.3.0.ebuild
@@ -0,0 +1,457 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DISTUTILS_OPTIONAL=1
+PYTHON_COMPAT=( python{3_6,3_7} )
+MY_PV=${PV/_rc/-rc}
+MY_P=${PN}-${MY_PV}
+
+inherit check-reqs cros-bazel cuda distutils-r1 flag-o-matic toolchain-funcs
+
+DESCRIPTION="Computation framework using data flow graphs for scalable machine learning"
+HOMEPAGE="https://www.tensorflow.org/"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cuda mpi minimal +python xla label_image benchmark_model"
+
+# distfiles that bazel uses for the workspace, will be copied to basel-distdir
+bazel_external_uris="
+	https://github.com/petewarden/OouraFFT/archive/v1.0.tar.gz -> OouraFFT-1.0.tar.gz
+	https://gitlab.com/libeigen/eigen/-/archive/386d809bde475c65b7940f290efe80e6a05878c4/eigen-386d809bde475c65b7940f290efe80e6a05878c4.tar.gz
+	https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz -> abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz
+	https://github.com/bazelbuild/bazel/releases/download/2.2.0/bazel-2.0.0-dist.zip
+	https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz
+	https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip -> bazelbuild-rules_android-0.1.1.zip
+	https://github.com/bazelbuild/rules_apple/archive/5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz -> bazelbuild-rules_apple-5131f3d46794bf227d296c82f30c2499c9de3c5b.tar.gz
+	https://github.com/bazelbuild/apple_support/archive/501b4afb27745c4813a88ffa28acd901408014e4.tar.gz -> bazelbuild-apple_support-501b4afb27745c4813a88ffa28acd901408014e4.tar.gz
+	https://github.com/bazelbuild/bazel-toolchains/archive/92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz -> bazel-toolchains-92dd8a7a518a2fb7ba992d47c8b38299fe0be825.tar.gz
+	https://github.com/bazelbuild/rules_cc/archive/01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip -> bazelbuild-rules_cc-01d4a48911d5e7591ecb1c06d3b8af47fe872371.zip
+	https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz -> bazelbuild-rules_closure-308b05b2419edb5c8ee0471b67a40403df940149.tar.gz
+	https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip -> bazelbuild-rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip
+	https://github.com/bazelbuild/rules_python/releases/download/0.0.1/rules_python-0.0.1.tar.gz -> bazelbuild-rules_python-0.0.1.tar.gz
+	https://github.com/bazelbuild/rules_swift/archive/3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz -> bazelbuild-rules_swift-3eeeb53cebda55b349d64c9fc144e18c5f7c0eb8.tar.gz
+	https://github.com/dmlc/dlpack/archive/3efc489b55385936531a06ff83425b719387ec63.tar.gz -> dlpack-3efc489b55385936531a06ff83425b719387ec63.tar.gz
+	https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz -> farmhash-816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz
+	https://github.com/google/gemmlowp/archive/fda83bdc38b118cc6b56753bd540caa49e570745.zip -> gemmlowp-fda83bdc38b118cc6b56753bd540caa49e570745.zip
+	https://github.com/google/highwayhash/archive/fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz -> highwayhash-fd3d9af80465e4383162e4a7c5e2f406e82dd968.tar.gz
+	https://github.com/google/re2/archive/506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz -> re2-506cfa4bffd060c06ec338ce50ea3468daa6c814.tar.gz
+	https://github.com/google/ruy/archive/34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip -> ruy-34ea9f4993955fa1ff4eb58e504421806b7f2e8f.zip
+	https://github.com/google/XNNPACK/archive/8b283aa30a3186c6e640aed520543e9c067132d2.zip -> XNNPACK-8b283aa30a3186c6e640aed520543e9c067132d2.zip
+	https://github.com/googleapis/googleapis/archive/541b1ded4abadcc38e8178680b0677f65594ea6f.zip -> googleapis-541b1ded4abadcc38e8178680b0677f65594ea6f.zip
+	https://github.com/joe-kuo/sobol_data/archive/835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz -> sobol_data-835a7d7b1ee3bc83e575e302a985c66ec4b65249.tar.gz
+	https://github.com/llvm/llvm-project/archive/387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz -> llvm-387c3f74fd8efdc0be464b0e1a8033cc1eeb739c.tar.gz
+	https://github.com/mborgerding/kissfft/archive/36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz -> kissfft-36dbc057604f00aacfc0288ddad57e3b21cfc1b8.tar.gz
+	https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz -> ARM_NEON_2_x86_SSE-1200fe90bb174a6224a525ee60148671a786a71f.tar.gz
+	https://github.com/pytorch/cpuinfo/archive/6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip -> cpuinfo-6cecd15784fcb6c5c0aa7311c6248879ce2cb8b2.zip
+	https://github.com/pytorch/cpuinfo/archive/d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz -> cpuinfo-d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz
+	https://github.com/Maratyszcza/FP16/archive/4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip -> FP16-4dfe081cf6bcd15db339cf2680b9281b8451eeb3.zip
+	https://github.com/Maratyszcza/FXdiv/archive/b408327ac2a15ec3e43352421954f5b1967701d1.zip -> FXdiv-b408327ac2a15ec3e43352421954f5b1967701d1.zip
+	https://github.com/Maratyszcza/pthreadpool/archive/029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip -> pthreadpool-029c88620802e1361ccf41d1970bd5b07fd6b7bb.zip
+	https://github.com/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.zip -> psimd-072586a71b55b7f8c584153d223e95687148a900.zip
+	cuda? (
+		https://github.com/nvidia/nccl/archive/3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz -> nvidia-nccl-3701130b3c1bcdb01c14b3cb70fe52498c1e82b7.tar.gz
+		https://github.com/NVlabs/cub/archive/1.8.0.zip -> cub-1.8.0.zip
+	)
+	python? (
+		https://storage.googleapis.com/mirror.tensorflow.org/docs.python.org/2.7/_sources/license.rst.txt -> tensorflow-1.15.0-python-license.rst.txt
+		https://pypi.python.org/packages/bc/cc/3cdb0a02e7e96f6c70bd971bc8a90b8463fda83e264fa9c5c1c98ceabd81/backports.weakref-1.0rc1.tar.gz
+	)"
+
+SRC_URI="https://github.com/${PN}/${PN}/archive/v${MY_PV}.tar.gz -> ${P}.tar.gz
+		${bazel_external_uris}"
+
+RDEPEND="
+	>=dev-libs/flatbuffers-1.12.0
+	>=dev-libs/protobuf-3.8.0:=
+	!minimal? (
+		app-arch/snappy
+		dev-db/sqlite
+		dev-libs/icu
+		dev-libs/double-conversion
+		>=dev-libs/jsoncpp-1.9.2
+		dev-db/lmdb
+		dev-libs/nsync
+		>=net-libs/grpc-1.28
+		media-libs/giflib
+		>=sys-apps/hwloc-2
+	)
+	dev-libs/libpcre
+	dev-libs/openssl:0=
+	>=dev-libs/re2-0.2019.06.01
+	media-libs/libjpeg-turbo
+	media-libs/libpng:0
+	net-misc/curl
+	sys-libs/zlib
+	cuda? (
+		>=dev-util/nvidia-cuda-toolkit-9.1[profiler]
+		dev-libs/cudnn
+	)
+	mpi? ( virtual/mpi )
+	python? (
+		${PYTHON_DEPS}
+		dev-python/absl-py[${PYTHON_USEDEP}]
+		>=dev-python/astor-0.7.1[${PYTHON_USEDEP}]
+		dev-python/astunparse[${PYTHON_USEDEP}]
+		>=dev-python/gast-0.3.3[${PYTHON_USEDEP}]
+		>=dev-python/numpy-1.16[${PYTHON_USEDEP}]
+		>=dev-python/google-pasta-0.1.8[${PYTHON_USEDEP}]
+		dev-python/opt-einsum[${PYTHON_USEDEP}]
+		>=dev-python/protobuf-python-3.8.0[${PYTHON_USEDEP}]
+		dev-python/six[${PYTHON_USEDEP}]
+		dev-python/termcolor[${PYTHON_USEDEP}]
+		>=dev-python/grpcio-1.28[${PYTHON_USEDEP}]
+		>=dev-python/wrapt-1.11.1[${PYTHON_USEDEP}]
+		>=net-libs/google-cloud-cpp-0.10.0
+		>=sci-libs/keras-applications-1.0.8[${PYTHON_USEDEP}]
+		>=sci-libs/keras-preprocessing-1.1.0[${PYTHON_USEDEP}]
+		>=sci-visualization/tensorboard-2.0.0[${PYTHON_USEDEP}]
+	)"
+DEPEND="${RDEPEND}
+	python? (
+		dev-python/mock
+		dev-python/setuptools
+	)"
+PDEPEND="python? (
+		>=sci-libs/tensorflow-estimator-2.0.0[${PYTHON_USEDEP}]
+	)"
+BDEPEND="
+	!minimal? (
+		=dev-util/bazel-2.0*
+	)
+	app-arch/unzip
+	dev-cpp/absl
+	>=dev-libs/protobuf-3.8.0
+	dev-java/java-config
+	dev-lang/swig
+	cuda? (
+		>=dev-util/nvidia-cuda-toolkit-9.1[profiler]
+	)
+	!python? ( dev-lang/python )
+	python? (
+		dev-python/cython
+		dev-python/mock
+		>=dev-python/grpcio-tools-1.28
+	)"
+REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
+
+PATCHES=(
+	"${FILESDIR}/tensorflow-2.3.0-0001-workspace.patch"
+	"${FILESDIR}/tensorflow-2.3.0-0002-nnapi-android-sdk-version.patch"
+	"${FILESDIR}/tensorflow-2.3.0-0003-ashmem-create.patch"
+	"${FILESDIR}/tensorflow-2.3.0-0004-nnapi-delegates.patch"
+	"${FILESDIR}/tensorflow-2.3.0-0005-cpuinfo-arm-fix.patch"
+)
+
+S="${WORKDIR}/${MY_P}"
+
+DOCS=( AUTHORS CONTRIBUTING.md ISSUE_TEMPLATE.md README.md RELEASE.md )
+CHECKREQS_MEMORY="5G"
+CHECKREQS_DISK_BUILD="10G"
+
+# Echos the CPU string that TensorFlow uses to refer to the given architecture.
+get-cpu-str() {
+	local arch
+	arch="$(tc-arch "${1}")"
+
+	case "${arch}" in
+	amd64) echo "k8";;
+	arm) echo "arm";;
+	arm64) echo "aarch64";;
+	*) die "Unsupported architecture '${arch}'."
+	esac
+}
+
+pkg_setup() {
+	ewarn "TensorFlow 2.0 is a major release that contains some incompatibilities"
+	ewarn "with TensorFlow 1.x. For more information about migrating to TF2.0 see:"
+	ewarn "https://www.tensorflow.org/guide/migrate"
+
+	local num_pythons_enabled
+	num_pythons_enabled=0
+	count_impls(){
+		num_pythons_enabled=$((num_pythons_enabled + 1))
+	}
+	use python && python_foreach_impl count_impls
+
+	# 10G to build C/C++ libs, 5G per python impl
+	CHECKREQS_DISK_BUILD="$((10 + 6 * num_pythons_enabled))G"
+	check-reqs_pkg_setup
+}
+
+src_unpack() {
+	# Only unpack the main distfile
+	unpack "${P}.tar.gz"
+	bazel_load_distfiles "${bazel_external_uris}"
+}
+
+src_prepare() {
+	export JAVA_HOME=$(ROOT="${BROOT}" java-config --jdk-home)
+
+	bazel_setup_bazelrc
+
+	# Relax version checks in setup.py
+	sed -i "/^    \'/s/==/>=/g" tensorflow/tools/pip_package/setup.py
+
+	bazel_setup_bazelrc
+	bazel_setup_crosstool "$(get-cpu-str "${CBUILD}")" "$(get-cpu-str "${CHOST}")"
+
+	default
+	use python && python_copy_sources
+
+	use cuda && cuda_add_sandbox
+}
+
+src_configure() {
+	export JAVA_HOME=$(ROOT="${BROOT}" java-config --jdk-home)
+
+	do_configure() {
+		export CC_OPT_FLAGS=" "
+		export TF_ENABLE_XLA=0 # $(usex xla 1 0)
+		export TF_NEED_OPENCL_SYCL=0
+		export TF_NEED_OPENCL=0
+		export TF_NEED_COMPUTECPP=0
+		export TF_NEED_ROCM=0
+		export TF_NEED_MPI=$(usex mpi 1 0)
+		export TF_SET_ANDROID_WORKSPACE=0
+
+		if use python; then
+			export PYTHON_BIN_PATH="${PYTHON}"
+			export PYTHON_LIB_PATH="$(python_get_sitedir)"
+		else
+			export PYTHON_BIN_PATH="$(which python)"
+			export PYTHON_LIB_PATH="$(python -c 'from distutils.sysconfig import *; print(get_python_lib())')"
+		fi
+
+		export TF_NEED_CUDA=$(usex cuda 1 0)
+		export TF_DOWNLOAD_CLANG=0
+		export TF_CUDA_CLANG=0
+		export TF_NEED_TENSORRT=0
+		if use cuda; then
+			export TF_CUDA_PATHS="${EPREFIX}/opt/cuda"
+			export GCC_HOST_COMPILER_PATH="$(cuda_gccdir)/$(tc-getCC)"
+			export TF_CUDA_VERSION="$(cuda_toolkit_version)"
+			export TF_CUDNN_VERSION="$(cuda_cudnn_version)"
+			einfo "Setting CUDA version: ${TF_CUDA_VERSION}"
+			einfo "Setting CUDNN version: ${TF_CUDNN_VERSION}"
+
+			if [[ *$(gcc-version)* != $(cuda-config -s) ]]; then
+				ewarn "TensorFlow is being built with Nvidia CUDA support. Your default compiler"
+				ewarn "version is not supported by the currently installed CUDA. TensorFlow will"
+				ewarn "instead be compiled using: ${GCC_HOST_COMPILER_PATH}."
+				ewarn "If the build fails with linker errors try rebuilding the relevant"
+				ewarn "dependencies using the same compiler version."
+			fi
+
+			if [[ -z "${TF_CUDA_COMPUTE_CAPABILITIES}" ]]; then
+				ewarn "WARNING: Tensorflow is being built with its default CUDA compute capabilities: 3.5 and 7.0."
+				ewarn "These may not be optimal for your GPU."
+				ewarn ""
+				ewarn "To configure Tensorflow with the CUDA compute capability that is optimal for your GPU,"
+				ewarn "set TF_CUDA_COMPUTE_CAPABILITIES in your make.conf, and re-emerge tensorflow."
+				ewarn "For example, to use CUDA capability 7.5 & 3.5, add: TF_CUDA_COMPUTE_CAPABILITIES=7.5,3.5"
+				ewarn ""
+				ewarn "You can look up your GPU's CUDA compute capability at https://developer.nvidia.com/cuda-gpus"
+				ewarn "or by running /opt/cuda/extras/demo_suite/deviceQuery | grep 'CUDA Capability'"
+			fi
+		fi
+
+		# com_googlesource_code_re2 weird branch using absl, doesnt work with released re2
+		local SYSLIBS=(
+			absl_py
+			astor_archive
+			astunparse_archive
+			boringssl
+			com_github_googleapis_googleapis
+			com_github_googlecloudplatform_google_cloud_cpp
+			com_github_grpc_grpc
+			com_google_protobuf
+			curl
+			cython
+			double_conversion
+			enum34_archive
+			flatbuffers
+			functools32_archive
+			gast_archive
+			gif
+			hwloc
+			icu
+			jsoncpp_git
+			libjpeg_turbo
+			lmdb
+			nasm
+			nsync
+			opt_einsum_archive
+			org_sqlite
+			pasta
+			pcre
+			png
+			pybind11
+			six_archive
+			snappy
+			swig
+			termcolor_archive
+			wrapt
+			zlib
+		)
+
+		export TF_SYSTEM_LIBS="${SYSLIBS[@]}"
+		export TF_IGNORE_MAX_BAZEL_VERSION=1
+
+		# This is not autoconf
+		./configure || die
+
+		echo 'build --config=noaws --config=nohdfs' >> .bazelrc || die
+		echo 'build --define tensorflow_mkldnn_contraction_kernel=0' >> .bazelrc || die
+	}
+	if use python; then
+		python_foreach_impl run_in_build_dir do_configure
+	else
+		do_configure
+	fi
+}
+
+src_compile() {
+	export JAVA_HOME=$(ROOT="${BROOT}" java-config --jdk-home)
+
+	if use python; then
+		python_setup
+		BUILD_DIR="${S}-${EPYTHON/./_}"
+		cd "${BUILD_DIR}"
+	fi
+
+	# fail early if any deps are missing
+	ebazel build -k --nobuild \
+		"$(usex minimal '' '
+			//tensorflow:libtensorflow_framework.so
+			//tensorflow:libtensorflow.so
+			//tensorflow:libtensorflow_cc.so')" \
+		tensorflow/lite:libtensorflowlite.so \
+		//tensorflow/lite/kernels/internal:install_nnapi_extra_headers \
+		"$(usex label_image '
+			//tensorflow/lite/examples/label_image:label_image' '')" \
+		"$(usex benchmark_model '
+			//tensorflow/lite/tools/benchmark:benchmark_model' '')" \
+		"$(usex python '//tensorflow/tools/pip_package:build_pip_package' '')"
+
+	ebazel build \
+		"$(usex minimal '' '
+			//tensorflow:libtensorflow_framework.so
+			//tensorflow:libtensorflow.so
+			//tensorflow:libtensorflow_cc.so')" \
+		//tensorflow/lite:libtensorflowlite.so \
+		//tensorflow/lite/kernels/internal:install_nnapi_extra_headers \
+		"$(usex label_image '
+			//tensorflow/lite/examples/label_image:label_image' '')" \
+		"$(usex benchmark_model '
+			//tensorflow/lite/tools/benchmark:benchmark_model' '')"
+
+	do_compile() {
+		ebazel build //tensorflow/tools/pip_package:build_pip_package
+	}
+	BUILD_DIR="${S}"
+	cd "${BUILD_DIR}"
+	use python && python_foreach_impl run_in_build_dir do_compile
+	ebazel shutdown
+}
+
+src_install() {
+	local i j
+	export JAVA_HOME=$(ROOT="${BROOT}" java-config --jdk-home)
+
+	if ! use minimal; then
+		do_install() {
+			einfo "Installing ${EPYTHON} files"
+			local srcdir="${T}/src-${MULTIBUILD_VARIANT}"
+			mkdir -p "${srcdir}" || die
+			bazel-bin/tensorflow/tools/pip_package/build_pip_package --src "${srcdir}" || die
+			cd "${srcdir}" || die
+			esetup.py install
+
+			# libtensorflow_framework.so is in /usr/lib already
+			rm -f "${D}/$(python_get_sitedir)"/${PN}/lib${PN}_framework.so* || die
+			rm -f "${D}/$(python_get_sitedir)"/${PN}_core/lib${PN}_framework.so* || die
+			python_optimize
+		}
+
+		if use python; then
+			python_foreach_impl run_in_build_dir do_install
+
+			# Symlink to python-exec scripts
+			for i in "${ED}"/usr/lib/python-exec/*/*; do
+				n="${i##*/}"
+				[[ -e "${ED}/usr/bin/${n}" ]] || dosym ../lib/python-exec/python-exec2 "/usr/bin/${n}"
+			done
+
+			python_setup
+			local BUILD_DIR="${S}-${EPYTHON/./_}"
+			cd "${BUILD_DIR}" || die
+		fi
+
+		einfo "Installing headers"
+		ebazel build //tensorflow:install_headers
+		ebazel shutdown
+		insinto /usr/include/${PN}/
+		doins -r bazel-bin/tensorflow/include/*
+
+		einfo "Installing libs"
+		# Generate pkg-config file
+		${PN}/c/generate-pc.sh --prefix="${EPREFIX}"/usr --libdir="$(get_libdir)" --version=${MY_PV} || die
+		insinto "/usr/$(get_libdir)/pkgconfig"
+		doins ${PN}.pc ${PN}_cc.pc
+
+		for l in libtensorflow{,_framework,_cc}.so; do
+			dolib.so bazel-bin/tensorflow/${l}
+			dolib.so "bazel-bin/tensorflow/${l}.$(ver_cut 1)"
+			dolib.so "bazel-bin/tensorflow/${l}.$(ver_cut 1-3)"
+		done
+	fi
+
+	einfo "Installing TF lite headers"
+	# From tensorflow/lite/lib_package/create_ios_frameworks.sh
+	find ${PN}/lite -name "*.h" \
+		-not -path "${PN}/lite/tools/*" \
+		-not -path "${PN}/lite/examples/*" \
+		-not -path "${PN}/lite/gen/*" \
+		-not -path "${PN}/lite/toco/*" \
+		-not -path "${PN}/lite/java/*" |
+	while read -r i; do
+		insinto "/usr/include/${PN}/${i%/*}"
+		doins "${i}"
+	done
+	if use minimal; then
+		einfo "Installing selected TF core headers"
+		local selected=( lib/bfloat16/bfloat16.h platform/byte_order.h platform/macros.h )
+		for i in "${selected[@]}"; do
+			insinto "/usr/include/${PN}/${PN}/core/${i%/*}"
+			doins "${PN}/core/${i}"
+		done
+	fi
+
+	einfo "Installing NNAPI headers"
+	insinto /usr/include/${PN}/nnapi/
+	doins -r bazel-bin/tensorflow/lite/kernels/internal/include
+	doins -r bazel-bin/tensorflow/lite/kernels/internal/include
+
+	einfo "Installing ruy headers"
+	insinto /usr/include/${PN}/ruy/
+	doins -r ../tensorflow-2.3.0-bazel-base/external/ruy/ruy/*
+
+	einfo "Installing TF lite libraries"
+	dolib.so bazel-bin/tensorflow/lite/lib${PN}lite.so
+
+	if use label_image; then
+		einfo "Install label_image example"
+		dobin bazel-bin/tensorflow/lite/examples/label_image/label_image
+	fi
+
+	if use benchmark_model; then
+		einfo "Install benchmark_model tool"
+		dobin bazel-bin/tensorflow/lite/tools/benchmark/benchmark_model
+	fi
+
+	einstalldocs
+}
diff --git a/sys-apps/aver-updater/aver-updater-0.0.1-r16.ebuild b/sys-apps/aver-updater/aver-updater-0.0.1-r16.ebuild
deleted file mode 100644
index 38941af..0000000
--- a/sys-apps/aver-updater/aver-updater-0.0.1-r16.ebuild
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="39a1705d94fa1a148d11835e05e5cdf576715930"
-CROS_WORKON_TREE="4907dba5c10817de4276887b0b8f289844dfcd14"
-CROS_WORKON_PROJECT="chromiumos/third_party/aver-updater"
-
-inherit cros-workon cros-common.mk libchrome udev user
-
-DESCRIPTION="AVer firmware updater"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/aver-updater"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="
-	chromeos-base/libbrillo:=
-"
-
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	# Disable tautological-compare warnings, crbug.com/1042142
-	append-cppflags "-Wno-tautological-compare"
-	cros-common.mk_src_configure
-	default
-}
-
-src_install() {
-	dosbin "${OUT}/aver-updater"
-	udev_dorules conf/99-run-aver-updater.rules
-}
-
-pkg_preinst() {
-	enewuser cfm-firmware-updaters
-	enewgroup cfm-firmware-updaters
-}
diff --git a/sys-apps/aver-updater/aver-updater-0.0.1-r19.ebuild b/sys-apps/aver-updater/aver-updater-0.0.1-r19.ebuild
new file mode 100644
index 0000000..d179338
--- /dev/null
+++ b/sys-apps/aver-updater/aver-updater-0.0.1-r19.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5b1d92cce1da7beaa1d88af91c2188a0eb951565"
+CROS_WORKON_TREE="1c1c7cf999109aad1a9ba91c45e88e4c88af530d"
+CROS_WORKON_PROJECT="chromiumos/third_party/aver-updater"
+
+inherit cros-workon cros-common.mk libchrome udev user
+
+DESCRIPTION="AVer firmware updater"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/aver-updater"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="
+	chromeos-base/libbrillo:=
+"
+
+DEPEND="${RDEPEND}"
+
+src_configure() {
+	# Disable tautological-compare warnings, crbug.com/1042142
+	append-cppflags "-Wno-tautological-compare"
+	cros-common.mk_src_configure
+	default
+}
+
+src_install() {
+	dosbin "${OUT}/aver-updater"
+	udev_dorules conf/99-run-aver-updater.rules
+}
+
+pkg_preinst() {
+	enewuser cfm-firmware-updaters
+	enewgroup cfm-firmware-updaters
+}
diff --git a/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4392.ebuild b/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4392.ebuild
deleted file mode 100644
index f405857..0000000
--- a/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4392.ebuild
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2012 The Chromium OS Authors
-# Distributed under the terms of the GNU General Public License v2
-# $Header:
-
-EAPI=7
-CROS_WORKON_COMMIT=("e55ea5ef9a56dbfd851030c0e4c25e96db141ece" "1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54")
-CROS_WORKON_TREE=("c65d26079244f4817d23ede7296eb0e913a5dd20" "82e77f6c98187361303fffeeba118a1a365e16d5")
-CROS_WORKON_PROJECT=(
-	"chromiumos/third_party/coreboot"
-	"chromiumos/platform/vboot_reference"
-)
-CROS_WORKON_LOCALNAME=(
-	"coreboot"
-	"../platform/vboot_reference"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/3rdparty/vboot"
-)
-CROS_WORKON_EGIT_BRANCH=(
-	"chromeos-2016.05"
-	"master"
-)
-
-inherit cros-workon toolchain-funcs
-
-DESCRIPTION="Utilities for modifying coreboot firmware images"
-HOMEPAGE="http://coreboot.org"
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host mma +pci static"
-
-LIB_DEPEND="sys-apps/pciutils[static-libs(+)]"
-RDEPEND="!static? ( ${LIB_DEPEND//\[static-libs(+)]} )"
-DEPEND="${RDEPEND}
-	static? ( ${LIB_DEPEND} )
-"
-
-_emake() {
-	emake \
-		TOOLLDFLAGS="${LDFLAGS}" \
-		CC="${CC}" \
-		STRIP="true" \
-		"$@"
-}
-
-src_configure() {
-	use static && append-ldflags -static
-	tc-export CC PKG_CONFIG
-}
-
-is_x86() {
-	use x86 || use amd64
-}
-
-src_compile() {
-	_emake -C util/cbfstool obj="${PWD}/util/cbfstool"
-	if use cros_host; then
-		_emake -C util/archive HOSTCC="${CC}"
-	else
-		_emake -C util/cbmem
-	fi
-	if is_x86; then
-		if use cros_host; then
-			_emake -C util/ifdtool
-		else
-			_emake -C util/superiotool \
-				CONFIG_PCI=$(usex pci)
-			_emake -C util/inteltool
-			_emake -C util/nvramtool
-		fi
-	fi
-}
-
-src_install() {
-	dobin util/cbfstool/cbfstool
-	if use cros_host; then
-		dobin util/cbfstool/fmaptool
-		dobin util/cbfstool/cbfs-compression-tool
-		dobin util/archive/archive
-	else
-		dobin util/cbmem/cbmem
-	fi
-	if is_x86; then
-		if use cros_host; then
-			dobin util/ifdtool/ifdtool
-		else
-			dobin util/superiotool/superiotool
-			dobin util/inteltool/inteltool
-			dobin util/nvramtool/nvramtool
-		fi
-		if use mma; then
-			dobin util/mma/mma_setup_test.sh
-			dobin util/mma/mma_get_result.sh
-			dobin util/mma/mma_automated_test.sh
-			insinto /etc/init
-			doins util/mma/mma.conf
-		fi
-	fi
-}
diff --git a/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4526.ebuild b/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4526.ebuild
new file mode 100644
index 0000000..5328e98
--- /dev/null
+++ b/sys-apps/coreboot-utils/coreboot-utils-0.0.1-r4526.ebuild
@@ -0,0 +1,101 @@
+# Copyright 2012 The Chromium OS Authors
+# Distributed under the terms of the GNU General Public License v2
+# $Header:
+
+EAPI=7
+CROS_WORKON_COMMIT=("5148aeb85e2a785227ff74b7d15cd533e3b4a455" "524012c64c07f8673998428cca7f80e01a387f48")
+CROS_WORKON_TREE=("819d1e4534d9036bca2118f64bff6ec92f5ca5ce" "d011d454951af2d6dbcf7d4dc7af53a31cc883db")
+CROS_WORKON_PROJECT=(
+	"chromiumos/third_party/coreboot"
+	"chromiumos/platform/vboot_reference"
+)
+CROS_WORKON_LOCALNAME=(
+	"coreboot"
+	"../platform/vboot_reference"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/3rdparty/vboot"
+)
+CROS_WORKON_EGIT_BRANCH=(
+	"chromeos-2016.05"
+	"master"
+)
+
+inherit cros-workon toolchain-funcs
+
+DESCRIPTION="Utilities for modifying coreboot firmware images"
+HOMEPAGE="http://coreboot.org"
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host mma +pci static"
+
+LIB_DEPEND="sys-apps/pciutils[static-libs(+)]"
+RDEPEND="!static? ( ${LIB_DEPEND//\[static-libs(+)]} )"
+DEPEND="${RDEPEND}
+	static? ( ${LIB_DEPEND} )
+"
+
+_emake() {
+	emake \
+		TOOLLDFLAGS="${LDFLAGS}" \
+		CC="${CC}" \
+		STRIP="true" \
+		"$@"
+}
+
+src_configure() {
+	use static && append-ldflags -static
+	tc-export CC PKG_CONFIG
+}
+
+is_x86() {
+	use x86 || use amd64
+}
+
+src_compile() {
+	_emake -C util/cbfstool obj="${PWD}/util/cbfstool"
+	if use cros_host; then
+		_emake -C util/archive HOSTCC="${CC}"
+	else
+		_emake -C util/cbmem
+	fi
+	if is_x86; then
+		if use cros_host; then
+			_emake -C util/ifdtool
+		else
+			_emake -C util/superiotool \
+				CONFIG_PCI=$(usex pci)
+			_emake -C util/inteltool
+			_emake -C util/nvramtool
+		fi
+	fi
+}
+
+src_install() {
+	dobin util/cbfstool/cbfstool
+	if use cros_host; then
+		dobin util/cbfstool/fmaptool
+		dobin util/cbfstool/cbfs-compression-tool
+		dobin util/archive/archive
+	else
+		dobin util/cbmem/cbmem
+	fi
+	if is_x86; then
+		if use cros_host; then
+			dobin util/ifdtool/ifdtool
+		else
+			dobin util/superiotool/superiotool
+			dobin util/inteltool/inteltool
+			dobin util/nvramtool/nvramtool
+		fi
+		if use mma; then
+			dobin util/mma/mma_setup_test.sh
+			dobin util/mma/mma_get_result.sh
+			dobin util/mma/mma_automated_test.sh
+			insinto /etc/init
+			doins util/mma/mma.conf
+		fi
+	fi
+}
diff --git a/sys-apps/dbus/OWNERS b/sys-apps/dbus/OWNERS
new file mode 100644
index 0000000..6da8592
--- /dev/null
+++ b/sys-apps/dbus/OWNERS
@@ -0,0 +1 @@
+ejcaruso@chromium.org
diff --git a/sys-apps/dtc/Manifest b/sys-apps/dtc/Manifest
index 35cfa7f..993154b 100644
--- a/sys-apps/dtc/Manifest
+++ b/sys-apps/dtc/Manifest
@@ -1 +1 @@
-DIST dtc-1.4.7.tar.xz 148940 SHA256 6643e8f00ff86350f465bb54b2185058b5b1b7bac01a0842c81a52b86589cde7 SHA512 01e0c88aee154d8ce8a5b84a299c98d12df9698e5eff572409e5e912236028532309fd21ca6a146dffef859c665d476bbbe13c371c621c1dee4abe546e5e6ebf WHIRLPOOL c4de2d3b40019bf95d43e582af184bb90d1899518125cdcf3d24c530a980bfdf1598cac5aa9d4b0bec7436615df38c98c576287078bf7cf210a082ecd1ddd093
+DIST dtc-1.6.0.tar.xz 158584 BLAKE2B 47b15b5df7f5d87369d6daaad87f2989a80865f2fab19f89d050d390a9f8319bcd86a36e12f7cc8d62947bb4d1335769071d0e3ea0a6e16861aea163e78f4696 SHA512 15433b24f1d6b7ed1f8066d050bd1bcbf988731aa38147564e3dd04b5f69af8d69e03befdc621a768526c620425a9bdd24aad4f9ff135930d6a1eeb0625f7de3
diff --git a/sys-apps/dtc/dtc-1.4.7-r1.ebuild b/sys-apps/dtc/dtc-1.4.7-r1.ebuild
deleted file mode 120000
index 8ad9d56..0000000
--- a/sys-apps/dtc/dtc-1.4.7-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-dtc-1.4.7.ebuild
\ No newline at end of file
diff --git a/sys-apps/dtc/dtc-1.4.7.ebuild b/sys-apps/dtc/dtc-1.4.7.ebuild
deleted file mode 100644
index db35ca3..0000000
--- a/sys-apps/dtc/dtc-1.4.7.ebuild
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-PYTHON_COMPAT=( python2_7 )
-DISTUTILS_OPTIONAL="1"
-inherit multilib toolchain-funcs eutils distutils-r1
-
-if [[ ${PV} == "9999" ]] ; then
-	EGIT_REPO_URI="git://git.kernel.org/pub/scm/utils/dtc/dtc.git"
-	inherit git-r3
-else
-	SRC_URI="mirror://kernel/software/utils/${PN}/${P}.tar.xz"
-	KEYWORDS="*"
-fi
-
-DESCRIPTION="Open Firmware device tree compiler"
-HOMEPAGE="https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/"
-
-LICENSE="GPL-2"
-SLOT="0"
-IUSE="python static-libs"
-
-RDEPEND="python? ( ${PYTHON_DEPS} )"
-DEPEND="${RDEPEND}
-	python? (
-		dev-lang/swig
-	)
-	sys-devel/bison
-	sys-devel/flex
-"
-REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
-DOCS="
-	${S}/Documentation/dt-object-internal.txt
-	${S}/Documentation/dts-format.txt
-	${S}/Documentation/manual.txt
-"
-
-src_prepare() {
-	# patch -p0 does not work when creating files, so force -p1.
-	EPATCH_OPTS="-p1" epatch "${FILESDIR}"/*.patch
-
-	default
-
-	sed -i \
-		-e '/^CFLAGS =/s:=:+=:' \
-		-e '/^CPPFLAGS =/s:=:+=:' \
-		-e 's:-Werror::' \
-		-e 's:-g -Os::' \
-		-e "/^PREFIX =/s:=.*:= ${EPREFIX}/usr:" \
-		-e "/^LIBDIR =/s:=.*:= \$(PREFIX)/$(get_libdir):" \
-		Makefile || die
-
-	tc-export AR CC
-	export V=1
-
-	if use python ; then
-		cd pylibfdt
-		distutils-r1_src_prepare
-	fi
-}
-
-src_configure() {
-	if use python ; then
-		cd pylibfdt
-		distutils-r1_src_configure
-	fi
-}
-
-src_compile() {
-	emake NO_PYTHON=1
-
-	if use python ; then
-		cd pylibfdt
-		distutils-r1_src_compile
-	fi
-}
-
-src_install() {
-	NO_PYTHON=1 default
-
-	use static-libs || find "${ED}" -name '*.a' -delete
-
-	if use python ; then
-		cd pylibfdt
-		distutils-r1_src_install
-	fi
-}
diff --git a/sys-apps/dtc/dtc-1.6.0-r2.ebuild b/sys-apps/dtc/dtc-1.6.0-r2.ebuild
new file mode 120000
index 0000000..94aff2e
--- /dev/null
+++ b/sys-apps/dtc/dtc-1.6.0-r2.ebuild
@@ -0,0 +1 @@
+dtc-1.6.0.ebuild
\ No newline at end of file
diff --git a/sys-apps/dtc/dtc-1.6.0.ebuild b/sys-apps/dtc/dtc-1.6.0.ebuild
new file mode 100644
index 0000000..6861b19
--- /dev/null
+++ b/sys-apps/dtc/dtc-1.6.0.ebuild
@@ -0,0 +1,89 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+PYTHON_COMPAT=( python3_6 python3_7 python3_8 )
+DISTUTILS_OPTIONAL="1"
+inherit multilib toolchain-funcs eutils distutils-r1
+
+if [[ ${PV} == "9999" ]] ; then
+	EGIT_REPO_URI="git://git.kernel.org/pub/scm/utils/dtc/dtc.git"
+	inherit git-r3
+else
+	SRC_URI="mirror://kernel/software/utils/${PN}/${P}.tar.xz"
+	KEYWORDS="*"
+fi
+
+DESCRIPTION="Open Firmware device tree compiler"
+HOMEPAGE="https://devicetree.org/ https://git.kernel.org/cgit/utils/dtc/dtc.git/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="python static-libs"
+
+RDEPEND="python? ( ${PYTHON_DEPS} )"
+DEPEND="${RDEPEND}
+	python? (
+		dev-lang/swig
+	)
+	sys-devel/bison
+	sys-devel/flex
+"
+REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
+DOCS="
+	${S}/Documentation/dt-object-internal.txt
+	${S}/Documentation/dts-format.txt
+	${S}/Documentation/manual.txt
+"
+
+src_prepare() {
+	# patch -p0 does not work when creating files, so force -p1.
+	EPATCH_OPTS="-p1" epatch "${FILESDIR}"/*.patch
+
+	default
+
+	sed -i \
+		-e '/^CFLAGS =/s:=:+=:' \
+		-e '/^CPPFLAGS =/s:=:+=:' \
+		-e 's:-Werror::' \
+		-e 's:-g -Os::' \
+		-e "/^PREFIX =/s:=.*:= ${EPREFIX}/usr:" \
+		-e "/^LIBDIR =/s:=.*:= \$(PREFIX)/$(get_libdir):" \
+		Makefile || die
+
+	if use python ; then
+		cd pylibfdt
+		distutils-r1_src_prepare
+	fi
+}
+
+src_configure() {
+	tc-export AR CC PKG_CONFIG
+	export V=1
+
+	if use python ; then
+		cd pylibfdt
+		distutils-r1_src_configure
+	fi
+}
+
+src_compile() {
+	emake NO_PYTHON=1
+
+	if use python ; then
+		cd pylibfdt
+		distutils-r1_src_compile
+	fi
+}
+
+src_install() {
+	NO_PYTHON=1 default
+
+	use static-libs || find "${ED}" -name '*.a' -delete
+
+	if use python ; then
+		cd pylibfdt
+		distutils-r1_src_install
+	fi
+}
diff --git a/sys-apps/dtc/files/0001-pylibfdt-We-don-t-need-include-files-from-the-base-d.patch b/sys-apps/dtc/files/0001-pylibfdt-We-don-t-need-include-files-from-the-base-d.patch
deleted file mode 100644
index 123fcc8..0000000
--- a/sys-apps/dtc/files/0001-pylibfdt-We-don-t-need-include-files-from-the-base-d.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From e43eda4ed65172497ab0c99d88fba8b25c172a9c Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Wed, 8 Aug 2018 17:52:49 +1000
-Subject: [PATCH 1/9] pylibfdt: We don't need include files from the base
- directory
-
-pylibfdt/setup.py currently adds include flags to the extension module
-build to allow include files in the base dtc directory.  But pylibfdt
-doesn't rely on any headers there, only on headers in libfdt/ - it also
-shouldn't rely on dtc headers at any future time.
-
-So, remove that from the include list, allowing some simplifications to
-setup.py.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/setup.py | 10 +++-------
- 1 file changed, 3 insertions(+), 7 deletions(-)
-
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index 1a1e832..8d97ab8 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -70,14 +70,12 @@ def GetEnvFromMakefiles():
- 
-     Returns:
-         Tuple with:
--            List of swig options
-             Version string
-             List of files to build
-             List of extra C preprocessor flags needed
-             Object directory to use (always '')
-     """
-     basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
--    swig_opts = ['-I%s' % basedir]
-     makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
-     version = '%s.%s.%s' % (makevars['VERSION'], makevars['PATCHLEVEL'],
-                             makevars['SUBLEVEL'])
-@@ -85,9 +83,9 @@ def GetEnvFromMakefiles():
-     files = makevars['LIBFDT_SRCS'].split()
-     files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
-     files.append('pylibfdt/libfdt.i')
--    cflags = ['-I%s' % basedir, '-I%s/libfdt' % basedir]
-+    cflags = ['-I%s/libfdt' % basedir]
-     objdir = ''
--    return swig_opts, version, files, cflags, objdir
-+    return  version, files, cflags, objdir
- 
- 
- progname = sys.argv[0]
-@@ -95,19 +93,17 @@ files = os.environ.get('SOURCES', '').split()
- cflags = os.environ.get('CPPFLAGS', '').split()
- objdir = os.environ.get('OBJDIR')
- version = os.environ.get('VERSION')
--swig_opts = []
- 
- # If we were called directly rather than through our Makefile (which is often
- # the case with Python module installation), read the settings from the
- # Makefile.
- if not all((version, files, cflags, objdir)):
--    swig_opts, version, files, cflags, objdir = GetEnvFromMakefiles()
-+    version, files, cflags, objdir = GetEnvFromMakefiles()
- 
- libfdt_module = Extension(
-     '_libfdt',
-     sources = files,
-     extra_compile_args = cflags,
--    swig_opts = swig_opts,
- )
- 
- setup(
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0002-pylibfdt-Correctly-set-build-output-directory.patch b/sys-apps/dtc/files/0002-pylibfdt-Correctly-set-build-output-directory.patch
deleted file mode 100644
index dccf44b..0000000
--- a/sys-apps/dtc/files/0002-pylibfdt-Correctly-set-build-output-directory.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 826a8d9c50fe21fffa7b84f75584c272a500cf95 Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 12:39:18 +1000
-Subject: [PATCH 2/9] pylibfdt: Correctly set build output directory
-
-Our Makefile currently passes PYLIBFDT_objdir into setup.py in an attempt
-to set the correct place to put the Python extension module output.  But
-that gets passed in the 'package_dir' map in distutils.
-
-But that's basically not what package_dir controls.  What actually makes us
-find the module in the right place is the --inplace passed to setup.py
-(causing the module to go into the current directory), and the following
-'mv' in the Makefile to move it into the right final location.
-
-We can simplify setup.py by dropping the useless objdir stuff, and get the
-module put in the right place straight way by instead using the --build-lib
-setup.py option.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt |  6 ++----
- pylibfdt/setup.py          | 11 +++--------
- 2 files changed, 5 insertions(+), 12 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 9507d3d..0b5364e 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -6,15 +6,13 @@ PYLIBFDT_srcs = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_SRCS)) \
- PYMODULE = $(PYLIBFDT_objdir)/_libfdt.so
- 
- define run_setup
--	SOURCES="$(1)" CPPFLAGS="$(CPPFLAGS)" OBJDIR="$(PYLIBFDT_objdir)"
--	VERSION="$(dtc_version)"
-+	SOURCES="$(1)" CPPFLAGS="$(CPPFLAGS)" VERSION="$(dtc_version)"
- 	$(PYLIBFDT_objdir)/setup.py --quiet $(2)
- endef
- 
- $(PYMODULE): $(PYLIBFDT_srcs)
- 	@$(VECHO) PYMOD $@
--	$(call run_setup, $^, build_ext --inplace)
--	mv _libfdt.so $@
-+	$(call run_setup, $^, build_ext --build-lib=$(PYLIBFDT_objdir))
- 
- install_pylibfdt: $(PYMODULE)
- 	$(VECHO) INSTALL-PYLIB; \
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index 8d97ab8..a9e8051 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -7,7 +7,6 @@ Written by Simon Glass <sjg@chromium.org>
- 
- Files to be built into the extension are provided in SOURCES
- C flags to use are provided in CPPFLAGS
--Object file directory is provided in OBJDIR
- Version is provided in VERSION
- 
- If these variables are not given they are parsed from the Makefiles. This
-@@ -73,7 +72,6 @@ def GetEnvFromMakefiles():
-             Version string
-             List of files to build
-             List of extra C preprocessor flags needed
--            Object directory to use (always '')
-     """
-     basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
-     makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
-@@ -84,21 +82,19 @@ def GetEnvFromMakefiles():
-     files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
-     files.append('pylibfdt/libfdt.i')
-     cflags = ['-I%s/libfdt' % basedir]
--    objdir = ''
--    return  version, files, cflags, objdir
-+    return  version, files, cflags
- 
- 
- progname = sys.argv[0]
- files = os.environ.get('SOURCES', '').split()
- cflags = os.environ.get('CPPFLAGS', '').split()
--objdir = os.environ.get('OBJDIR')
- version = os.environ.get('VERSION')
- 
- # If we were called directly rather than through our Makefile (which is often
- # the case with Python module installation), read the settings from the
- # Makefile.
--if not all((version, files, cflags, objdir)):
--    version, files, cflags, objdir = GetEnvFromMakefiles()
-+if not all((version, files, cflags)):
-+    version, files, cflags= GetEnvFromMakefiles()
- 
- libfdt_module = Extension(
-     '_libfdt',
-@@ -112,6 +108,5 @@ setup(
-     author='Simon Glass <sjg@chromium.org>',
-     description='Python binding for libfdt',
-     ext_modules=[libfdt_module],
--    package_dir={'': objdir},
-     py_modules=['pylibfdt/libfdt'],
- )
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0003-pylibfdt-Link-extension-module-with-libfdt-rather-th.patch b/sys-apps/dtc/files/0003-pylibfdt-Link-extension-module-with-libfdt-rather-th.patch
deleted file mode 100644
index ad1458e..0000000
--- a/sys-apps/dtc/files/0003-pylibfdt-Link-extension-module-with-libfdt-rather-th.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From a828954ba820707d9d776c426d4728a5916b3fd6 Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Wed, 8 Aug 2018 23:34:11 +1000
-Subject: [PATCH 3/9] pylibfdt: Link extension module with libfdt rather than
- rebuilding
-
-Currently we build the Python extension module from all the libfdt source
-files as well as the swig wrapper file.  This is a bit silly, since we've
-already compiled libfdt itself.
-
-This changes the build to instead build the extension module from just the
-swig wrapper, linking it against the libfdt.a we've already build.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt | 14 ++++++--------
- pylibfdt/setup.py          | 17 ++++++-----------
- 2 files changed, 12 insertions(+), 19 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 0b5364e..6b34b01 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -1,22 +1,20 @@
- # Makefile.pylibfdt
- #
- 
--PYLIBFDT_srcs = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_SRCS)) \
--		$(PYLIBFDT_srcdir)/libfdt.i
-+PYLIBFDT_srcs = $(PYLIBFDT_srcdir)/libfdt.i
- PYMODULE = $(PYLIBFDT_objdir)/_libfdt.so
- 
- define run_setup
--	SOURCES="$(1)" CPPFLAGS="$(CPPFLAGS)" VERSION="$(dtc_version)"
--	$(PYLIBFDT_objdir)/setup.py --quiet $(2)
-+	CPPFLAGS="$(CPPFLAGS)" VERSION="$(dtc_version)"
-+	$(PYLIBFDT_objdir)/setup.py --quiet $(1)
- endef
- 
--$(PYMODULE): $(PYLIBFDT_srcs)
-+$(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive)
- 	@$(VECHO) PYMOD $@
--	$(call run_setup, $^, build_ext --build-lib=$(PYLIBFDT_objdir))
-+	$(call run_setup, build_ext --build-lib=$(PYLIBFDT_objdir))
- 
- install_pylibfdt: $(PYMODULE)
- 	$(VECHO) INSTALL-PYLIB; \
--	$(call run_setup, $(PYLIBFDT_srcs), \
--		install $(if $(SETUP_PREFIX),--prefix=$(SETUP_PREFIX)))
-+	$(call run_setup, install $(if $(SETUP_PREFIX),--prefix=$(SETUP_PREFIX)))
- 
- PYLIBFDT_cleanfiles = libfdt_wrap.c libfdt.py libfdt.pyc _libfdt.so
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index a9e8051..aafe70d 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -5,7 +5,6 @@ setup.py file for SWIG libfdt
- Copyright (C) 2017 Google, Inc.
- Written by Simon Glass <sjg@chromium.org>
- 
--Files to be built into the extension are provided in SOURCES
- C flags to use are provided in CPPFLAGS
- Version is provided in VERSION
- 
-@@ -70,35 +69,31 @@ def GetEnvFromMakefiles():
-     Returns:
-         Tuple with:
-             Version string
--            List of files to build
-             List of extra C preprocessor flags needed
-     """
-     basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
-     makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
-     version = '%s.%s.%s' % (makevars['VERSION'], makevars['PATCHLEVEL'],
-                             makevars['SUBLEVEL'])
--    makevars = ParseMakefile(os.path.join(basedir, 'libfdt', 'Makefile.libfdt'))
--    files = makevars['LIBFDT_SRCS'].split()
--    files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
--    files.append('pylibfdt/libfdt.i')
-     cflags = ['-I%s/libfdt' % basedir]
--    return  version, files, cflags
-+    return  version, cflags
- 
- 
- progname = sys.argv[0]
--files = os.environ.get('SOURCES', '').split()
- cflags = os.environ.get('CPPFLAGS', '').split()
- version = os.environ.get('VERSION')
- 
- # If we were called directly rather than through our Makefile (which is often
- # the case with Python module installation), read the settings from the
- # Makefile.
--if not all((version, files, cflags)):
--    version, files, cflags= GetEnvFromMakefiles()
-+if not all((version, cflags)):
-+    version, cflags= GetEnvFromMakefiles()
- 
- libfdt_module = Extension(
-     '_libfdt',
--    sources = files,
-+    sources = ['pylibfdt/libfdt.i'],
-+    libraries = ['fdt'],
-+    library_dirs = ['libfdt'],
-     extra_compile_args = cflags,
- )
- 
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0004-pylibfdt-Simpler-CFLAGS-handling.patch b/sys-apps/dtc/files/0004-pylibfdt-Simpler-CFLAGS-handling.patch
deleted file mode 100644
index 6f9a584..0000000
--- a/sys-apps/dtc/files/0004-pylibfdt-Simpler-CFLAGS-handling.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From a0c8998efac693c1141e395aa1880bb9cbbe694b Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 13:43:50 +1000
-Subject: [PATCH 4/9] pylibfdt: Simpler CFLAGS handling
-
-At the moment we have some fiddly code to either pass in make's CPPFLAGS to
-setup.py, or have setup.py extract them from the Makefile.  But really the
-only thing we need from here is the include paths.  We already know what
-include paths we need (libfdt/) so we can just set that directly in
-setup.py.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt |  2 +-
- pylibfdt/setup.py          | 11 ++++-------
- 2 files changed, 5 insertions(+), 8 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 6b34b01..3c6ae44 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -5,7 +5,7 @@ PYLIBFDT_srcs = $(PYLIBFDT_srcdir)/libfdt.i
- PYMODULE = $(PYLIBFDT_objdir)/_libfdt.so
- 
- define run_setup
--	CPPFLAGS="$(CPPFLAGS)" VERSION="$(dtc_version)"
-+	VERSION="$(dtc_version)"
- 	$(PYLIBFDT_objdir)/setup.py --quiet $(1)
- endef
- 
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index aafe70d..95f1601 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -5,7 +5,6 @@ setup.py file for SWIG libfdt
- Copyright (C) 2017 Google, Inc.
- Written by Simon Glass <sjg@chromium.org>
- 
--C flags to use are provided in CPPFLAGS
- Version is provided in VERSION
- 
- If these variables are not given they are parsed from the Makefiles. This
-@@ -75,26 +74,24 @@ def GetEnvFromMakefiles():
-     makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
-     version = '%s.%s.%s' % (makevars['VERSION'], makevars['PATCHLEVEL'],
-                             makevars['SUBLEVEL'])
--    cflags = ['-I%s/libfdt' % basedir]
--    return  version, cflags
-+    return version
- 
- 
- progname = sys.argv[0]
--cflags = os.environ.get('CPPFLAGS', '').split()
- version = os.environ.get('VERSION')
- 
- # If we were called directly rather than through our Makefile (which is often
- # the case with Python module installation), read the settings from the
- # Makefile.
--if not all((version, cflags)):
--    version, cflags= GetEnvFromMakefiles()
-+if not version:
-+    version = GetEnvFromMakefiles()
- 
- libfdt_module = Extension(
-     '_libfdt',
-     sources = ['pylibfdt/libfdt.i'],
-+    include_dirs = ['libfdt'],
-     libraries = ['fdt'],
-     library_dirs = ['libfdt'],
--    extra_compile_args = cflags,
- )
- 
- setup(
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0005-pylibfdt-Make-SETUP-make-variable.patch b/sys-apps/dtc/files/0005-pylibfdt-Make-SETUP-make-variable.patch
deleted file mode 100644
index 67c304f..0000000
--- a/sys-apps/dtc/files/0005-pylibfdt-Make-SETUP-make-variable.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 8c2675b2c741161155305d228d8536d2634519d4 Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 13:52:33 +1000
-Subject: [PATCH 5/9] pylibfdt: Make SETUP make variable
-
-This points to the Python setup script, since we reference it in a couple
-of places.  While we're there correct two small problems:
-
-1) setup.py is part of the checked in sources and so lives in
-   $(PYLIBFDT_srcdir) not $(PYLIBFDT_objdir) [this only worked because
-   those are the same by default]
-
-2) The module itself should depend on the setup script so it is rebuilt
-   if the script is changed
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 3c6ae44..bbd6518 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -4,12 +4,14 @@
- PYLIBFDT_srcs = $(PYLIBFDT_srcdir)/libfdt.i
- PYMODULE = $(PYLIBFDT_objdir)/_libfdt.so
- 
-+SETUP = $(PYLIBFDT_srcdir)/setup.py
-+
- define run_setup
- 	VERSION="$(dtc_version)"
--	$(PYLIBFDT_objdir)/setup.py --quiet $(1)
-+	$(SETUP) --quiet $(1)
- endef
- 
--$(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive)
-+$(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP)
- 	@$(VECHO) PYMOD $@
- 	$(call run_setup, build_ext --build-lib=$(PYLIBFDT_objdir))
- 
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0006-pylibfdt-Don-t-silence-setup.py-when-V-1.patch b/sys-apps/dtc/files/0006-pylibfdt-Don-t-silence-setup.py-when-V-1.patch
deleted file mode 100644
index 2b0c287..0000000
--- a/sys-apps/dtc/files/0006-pylibfdt-Don-t-silence-setup.py-when-V-1.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 39ba76e57e4d67a22ee4a9500cc4a135c4da1bad Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 13:55:38 +1000
-Subject: [PATCH 6/9] pylibfdt: Don't silence setup.py when V=1
-
-At the moment we unconditionally pass --quiet to setup.py.  Change that to
-get more debugging output from it when V=1 is passed to make.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index bbd6518..005cb25 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -5,10 +5,15 @@ PYLIBFDT_srcs = $(PYLIBFDT_srcdir)/libfdt.i
- PYMODULE = $(PYLIBFDT_objdir)/_libfdt.so
- 
- SETUP = $(PYLIBFDT_srcdir)/setup.py
-+SETUPFLAGS =
-+
-+ifndef V
-+SETUPFLAGS += --quiet
-+endif
- 
- define run_setup
- 	VERSION="$(dtc_version)"
--	$(SETUP) --quiet $(1)
-+	$(SETUP) $(SETUPFLAGS) $(1)
- endef
- 
- $(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP)
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0007-pylibfdt-Improved-version-extraction.patch b/sys-apps/dtc/files/0007-pylibfdt-Improved-version-extraction.patch
deleted file mode 100644
index 3d89d8f..0000000
--- a/sys-apps/dtc/files/0007-pylibfdt-Improved-version-extraction.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From 6164fa1d7eb648cefb60ec64ada9c9744c76f1fb Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 14:25:42 +1000
-Subject: [PATCH 7/9] pylibfdt: Improved version extraction
-
-Currently setup.py expects the library version in a VERSION environment
-variable, or it exctracts the version from the Makefile.  The latter is
-for the case where the script is run standalone, rather than from make.
-But parsing the Makefile is ugly and fragile, and won't always get the
-same version we put into the C code.
-
-This changes to instead extracting the version from the trivial .h file we
-already generate to put the version into C code.  It's still slightly ugly,
-but it's simpler and since we can control the precise format of that .h,
-not as fragile.
-
-This lets us remove the remains of the makefile parsing code from setup.py.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt |  3 +-
- pylibfdt/setup.py          | 78 ++++----------------------------------
- 2 files changed, 8 insertions(+), 73 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 005cb25..5fe5c82 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -12,11 +12,10 @@ SETUPFLAGS += --quiet
- endif
- 
- define run_setup
--	VERSION="$(dtc_version)"
- 	$(SETUP) $(SETUPFLAGS) $(1)
- endef
- 
--$(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP)
-+$(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP) $(VERSION_FILE)
- 	@$(VECHO) PYMOD $@
- 	$(call run_setup, build_ext --build-lib=$(PYLIBFDT_objdir))
- 
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index 95f1601..f0f0e10 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -4,13 +4,6 @@
- setup.py file for SWIG libfdt
- Copyright (C) 2017 Google, Inc.
- Written by Simon Glass <sjg@chromium.org>
--
--Version is provided in VERSION
--
--If these variables are not given they are parsed from the Makefiles. This
--allows this script to be run stand-alone, e.g.:
--
--    ./pylibfdt/setup.py install [--prefix=...]
- """
- 
- from distutils.core import setup, Extension
-@@ -18,73 +11,16 @@ import os
- import re
- import sys
- 
--# Decodes a Makefile assignment line into key and value (and plus for +=)
--RE_KEY_VALUE = re.compile('(?P<key>\w+) *(?P<plus>[+])?= *(?P<value>.*)$')
--
--
--def ParseMakefile(fname):
--    """Parse a Makefile to obtain its variables.
--
--    This collects variable assigments of the form:
--
--        VAR = value
--        VAR += more
--
--    It does not pick out := assignments, as these are not needed here. It does
--    handle line continuation.
--
--    Returns a dict:
--        key: Variable name (e.g. 'VAR')
--        value: Variable value (e.g. 'value more')
--    """
--    makevars = {}
--    with open(fname) as fd:
--        prev_text = ''  # Continuation text from previous line(s)
--        for line in fd.read().splitlines():
--          if line and line[-1] == '\\':  # Deal with line continuation
--            prev_text += line[:-1]
--            continue
--          elif prev_text:
--            line = prev_text + line
--            prev_text = ''  # Continuation is now used up
--          m = RE_KEY_VALUE.match(line)
--          if m:
--            value = m.group('value') or ''
--            key = m.group('key')
--
--            # Appending to a variable inserts a space beforehand
--            if 'plus' in m.groupdict() and key in makevars:
--              makevars[key] += ' ' + value
--            else:
--              makevars[key] = value
--    return makevars
--
--def GetEnvFromMakefiles():
--    """Scan the Makefiles to obtain the settings we need.
--
--    This assumes that this script is being run from the top-level directory,
--    not the pylibfdt directory.
- 
--    Returns:
--        Tuple with:
--            Version string
--            List of extra C preprocessor flags needed
--    """
--    basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
--    makevars = ParseMakefile(os.path.join(basedir, 'Makefile'))
--    version = '%s.%s.%s' % (makevars['VERSION'], makevars['PATCHLEVEL'],
--                            makevars['SUBLEVEL'])
--    return version
-+VERSION_PATTERN = '^#define DTC_VERSION "DTC ([^"]*)"$'
- 
- 
--progname = sys.argv[0]
--version = os.environ.get('VERSION')
-+def get_version():
-+    version_file = "version_gen.h"
-+    f = open(version_file, 'rt')
-+    m = re.match(VERSION_PATTERN, f.readline())
-+    return m.group(1)
- 
--# If we were called directly rather than through our Makefile (which is often
--# the case with Python module installation), read the settings from the
--# Makefile.
--if not version:
--    version = GetEnvFromMakefiles()
- 
- libfdt_module = Extension(
-     '_libfdt',
-@@ -96,7 +32,7 @@ libfdt_module = Extension(
- 
- setup(
-     name='libfdt',
--    version= version,
-+    version= get_version(),
-     author='Simon Glass <sjg@chromium.org>',
-     description='Python binding for libfdt',
-     ext_modules=[libfdt_module],
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0008-pylibfdt-Eliminate-run_setup-make-function.patch b/sys-apps/dtc/files/0008-pylibfdt-Eliminate-run_setup-make-function.patch
deleted file mode 100644
index 0d94b94..0000000
--- a/sys-apps/dtc/files/0008-pylibfdt-Eliminate-run_setup-make-function.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 40004ba53e2a6b5bbcb1e5e09065d5ccfef3ebc6 Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 14:37:52 +1000
-Subject: [PATCH 8/9] pylibfdt: Eliminate run_setup make function
-
-This function no longer does anything useful, so get rid of it.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt | 10 +++-------
- 1 file changed, 3 insertions(+), 7 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 5fe5c82..0dc5e96 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -11,16 +11,12 @@ ifndef V
- SETUPFLAGS += --quiet
- endif
- 
--define run_setup
--	$(SETUP) $(SETUPFLAGS) $(1)
--endef
--
- $(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP) $(VERSION_FILE)
- 	@$(VECHO) PYMOD $@
--	$(call run_setup, build_ext --build-lib=$(PYLIBFDT_objdir))
-+	$(SETUP) $(SETUPFLAGS) build_ext --build-lib=$(PYLIBFDT_objdir)
- 
- install_pylibfdt: $(PYMODULE)
--	$(VECHO) INSTALL-PYLIB; \
--	$(call run_setup, install $(if $(SETUP_PREFIX),--prefix=$(SETUP_PREFIX)))
-+	@$(VECHO) INSTALL-PYLIB
-+	$(SETUP) $(SETUPFLAGS) install $(if $(SETUP_PREFIX),--prefix=$(SETUP_PREFIX))
- 
- PYLIBFDT_cleanfiles = libfdt_wrap.c libfdt.py libfdt.pyc _libfdt.so
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/0009-pylibfdt-Don-t-have-setup.py-depend-on-where-it-s-in.patch b/sys-apps/dtc/files/0009-pylibfdt-Don-t-have-setup.py-depend-on-where-it-s-in.patch
deleted file mode 100644
index 47cf9d9..0000000
--- a/sys-apps/dtc/files/0009-pylibfdt-Don-t-have-setup.py-depend-on-where-it-s-in.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From bdd01de323807f49f2d27aa9ad81dcec04738222 Mon Sep 17 00:00:00 2001
-From: David Gibson <david@gibson.dropbear.id.au>
-Date: Fri, 10 Aug 2018 17:33:24 +1000
-Subject: [PATCH 9/9] pylibfdt: Don't have setup.py depend on where it's
- invoked from
-
-Currently setup.py depends on being invoked from the right directory
-(specifically it needs to be run from the root of the project).  That's a
-bit confusing.
-
-This updates setup.py to no longer depend on the invoking directory by
-instead having it change directory to the location of the script itself,
-then using internal paths relative to that.
-
-Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-Signed-off-by: Simon Glass <sjg@chromium.org>
----
-
- pylibfdt/Makefile.pylibfdt |  2 +-
- pylibfdt/libfdt.i          |  4 ++--
- pylibfdt/setup.py          | 13 ++++++++-----
- 3 files changed, 11 insertions(+), 8 deletions(-)
-
-diff --git a/pylibfdt/Makefile.pylibfdt b/pylibfdt/Makefile.pylibfdt
-index 0dc5e96..8f00b3d 100644
---- a/pylibfdt/Makefile.pylibfdt
-+++ b/pylibfdt/Makefile.pylibfdt
-@@ -13,7 +13,7 @@ endif
- 
- $(PYMODULE): $(PYLIBFDT_srcs) $(LIBFDT_archive) $(SETUP) $(VERSION_FILE)
- 	@$(VECHO) PYMOD $@
--	$(SETUP) $(SETUPFLAGS) build_ext --build-lib=$(PYLIBFDT_objdir)
-+	$(SETUP) $(SETUPFLAGS) build_ext --build-lib=../$(PYLIBFDT_objdir)
- 
- install_pylibfdt: $(PYMODULE)
- 	@$(VECHO) INSTALL-PYLIB
-diff --git a/pylibfdt/libfdt.i b/pylibfdt/libfdt.i
-index 842e7b6..462b5b0 100644
---- a/pylibfdt/libfdt.i
-+++ b/pylibfdt/libfdt.i
-@@ -1028,7 +1028,7 @@ class NodeAdder():
-  */
- typedef uint32_t fdt32_t;
- 
--%include "libfdt/fdt.h"
-+%include "fdt.h"
- 
- %include "typemaps.i"
- 
-@@ -1134,4 +1134,4 @@ int fdt_property_cell(void *fdt, const char *name, uint32_t val);
-  */
- int fdt_property_stub(void *fdt, const char *name, const char *val, int len);
- 
--%include <../libfdt/libfdt.h>
-+%include <libfdt.h>
-diff --git a/pylibfdt/setup.py b/pylibfdt/setup.py
-index f0f0e10..bd8ccf8 100755
---- a/pylibfdt/setup.py
-+++ b/pylibfdt/setup.py
-@@ -16,18 +16,21 @@ VERSION_PATTERN = '^#define DTC_VERSION "DTC ([^"]*)"$'
- 
- 
- def get_version():
--    version_file = "version_gen.h"
-+    version_file = "../version_gen.h"
-     f = open(version_file, 'rt')
-     m = re.match(VERSION_PATTERN, f.readline())
-     return m.group(1)
- 
-+setupdir = os.path.dirname(os.path.abspath(sys.argv[0]))
-+os.chdir(setupdir)
- 
- libfdt_module = Extension(
-     '_libfdt',
--    sources = ['pylibfdt/libfdt.i'],
--    include_dirs = ['libfdt'],
-+    sources = ['libfdt.i'],
-+    include_dirs = ['../libfdt'],
-     libraries = ['fdt'],
--    library_dirs = ['libfdt'],
-+    library_dirs = ['../libfdt'],
-+    swig_opts = ['-I../libfdt'],
- )
- 
- setup(
-@@ -36,5 +39,5 @@ setup(
-     author='Simon Glass <sjg@chromium.org>',
-     description='Python binding for libfdt',
-     ext_modules=[libfdt_module],
--    py_modules=['pylibfdt/libfdt'],
-+    py_modules=['libfdt'],
- )
--- 
-2.19.0.444.g18242da7ef-goog
-
diff --git a/sys-apps/dtc/files/dtc-1.4.4-posix-shell.patch b/sys-apps/dtc/files/dtc-1.4.4-posix-shell.patch
deleted file mode 100644
index b9b0175..0000000
--- a/sys-apps/dtc/files/dtc-1.4.4-posix-shell.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 4d9522764985462741c7bb4af1ab231b9251476b Mon Sep 17 00:00:00 2001
-From: Mike Frysinger <vapier@chromium.org>
-Date: Wed, 10 Jan 2018 00:41:43 -0500
-Subject: [PATCH] dtdiff: change to POSIX shell
-
-This changes from the bash-specific process substitution feature to
-reading with pipes.  It relies on /dev/fd or /proc/self/fd existing.
-
-URL: https://crbug.com/756559
-Signed-off-by: Mike Frysinger <vapier@chromium.org>
----
- dtdiff | 19 +++++++++++++------
- 1 file changed, 13 insertions(+), 6 deletions(-)
-
-diff --git a/dtdiff b/dtdiff
-index 5fa772b0ab62..4d1b71756c2f 100644
---- a/dtdiff
-+++ b/dtdiff
-@@ -1,8 +1,4 @@
--#! /bin/bash
--
--# This script uses the bash <(...) extension.
--# If you want to change this to work with a generic /bin/sh, make sure
--# you fix that.
-+#! /bin/sh
- 
- 
- DTC=dtc
-@@ -35,4 +31,15 @@ if [ $# != 2 ]; then
-     exit 1
- fi
- 
--diff -u <(source_and_sort "$1") <(source_and_sort "$2")
-+for dir in /dev/fd /proc/self/fd; do
-+    if [ -d "${dir}" ]; then
-+        break
-+    fi
-+done
-+
-+source_and_sort "$1" | (
-+    # Duplicate current stdin from the first file to fd 3 so we can change fd 0
-+    # to the second file.
-+    exec 3<&0
-+    source_and_sort "$2" | diff -u "${dir}/3" "${dir}/0"
-+)
--- 
-2.15.1
-
diff --git a/sys-apps/dtc/files/dtc-1.6.0-posix-shell.patch b/sys-apps/dtc/files/dtc-1.6.0-posix-shell.patch
new file mode 100644
index 0000000..a627414
--- /dev/null
+++ b/sys-apps/dtc/files/dtc-1.6.0-posix-shell.patch
@@ -0,0 +1,53 @@
+From f7e8949bf0acaf5cab61d5e154e87748ad125626 Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@chromium.org>
+Date: Wed, 10 Jan 2018 00:41:43 -0500
+Subject: [PATCH] dtdiff: change to POSIX shell
+
+This changes from the bash-specific process substitution feature to
+reading with pipes.  It relies on /dev/fd or /proc/self/fd existing.
+
+URL: https://crbug.com/756559
+Signed-off-by: Mike Frysinger <vapier@chromium.org>
+Signed-off-by: Simon Glass <sjg@chromium.org>
+---
+
+ dtdiff | 20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+diff --git a/dtdiff b/dtdiff
+index cdbf079..7699e7a 100644
+--- a/dtdiff
++++ b/dtdiff
+@@ -1,11 +1,6 @@
+-#! /bin/bash
++#! /bin/sh
+ # SPDX-License-Identifier: GPL-2.0-or-later
+ 
+-# This script uses the bash <(...) extension.
+-# If you want to change this to work with a generic /bin/sh, make sure
+-# you fix that.
+-
+-
+ DTC=dtc
+ 
+ source_and_sort () {
+@@ -36,4 +31,15 @@ if [ $# != 2 ]; then
+     exit 1
+ fi
+ 
+-diff -u <(source_and_sort "$1") <(source_and_sort "$2")
++for dir in /dev/fd /proc/self/fd; do
++    if [ -d "${dir}" ]; then
++        break
++    fi
++done
++
++source_and_sort "$1" | (
++    # Duplicate current stdin from the first file to fd 3 so we can change fd 0
++    # to the second file.
++    exec 3<&0
++    source_and_sort "$2" | diff -u "${dir}/3" "${dir}/0"
++)
+-- 
+2.17.1
+
diff --git a/sys-apps/em100/em100-0.0.1-r37.ebuild b/sys-apps/em100/em100-0.0.1-r37.ebuild
deleted file mode 100644
index ccf09b6..0000000
--- a/sys-apps/em100/em100-0.0.1-r37.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2016 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-# $Header: $
-
-EAPI="4"
-CROS_WORKON_COMMIT="f09239ce28b587c03a0f94d2bb98abc04fadfbb4"
-CROS_WORKON_TREE="de88b2327932c2c5e947d469ea569ff9db216e15"
-CROS_WORKON_PROJECT="chromiumos/third_party/em100"
-
-inherit cros-workon toolchain-funcs
-
-DESCRIPTION="A simple utility to control a Dediprog EM100pro from Linux"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="*"
-
-DEPEND="virtual/libusb:1"
-RDEPEND="${DEPEND}"
-
-src_compile() {
-	tc-export CC PKG_CONFIG
-
-	emake
-}
-
-src_install() {
-	dosbin em100
-}
diff --git a/sys-apps/em100/em100-0.0.1-r38.ebuild b/sys-apps/em100/em100-0.0.1-r38.ebuild
new file mode 100644
index 0000000..d53dc6f
--- /dev/null
+++ b/sys-apps/em100/em100-0.0.1-r38.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI="4"
+CROS_WORKON_COMMIT="5c72c8db69c6559bea3700362d874dd1b95ebd7a"
+CROS_WORKON_TREE="a6e3ad285c95c4b4fd5bf9752fd23fa02bb6ac92"
+CROS_WORKON_PROJECT="chromiumos/third_party/em100"
+
+inherit cros-workon toolchain-funcs
+
+DESCRIPTION="A simple utility to control a Dediprog EM100pro from Linux"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="*"
+
+DEPEND="virtual/libusb:1"
+RDEPEND="${DEPEND}"
+
+src_compile() {
+	tc-export CC PKG_CONFIG
+
+	emake
+}
+
+src_install() {
+	dosbin em100
+}
diff --git a/sys-apps/fitpicker/fitpicker-0.0.1-r2040.ebuild b/sys-apps/fitpicker/fitpicker-0.0.1-r2040.ebuild
deleted file mode 100644
index c3d5658..0000000
--- a/sys-apps/fitpicker/fitpicker-0.0.1-r2040.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="c142078820d0707858873cedb290a78d36f531af"
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "83ea9ea5401ca0bfd35f2bddee9b551873d412ca" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
-CROS_WORKON_PROJECT="chromiumos/platform2"
-CROS_WORKON_LOCALNAME="../platform2"
-CROS_WORKON_DESTDIR="${S}"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_SUBTREE="common-mk fitpicker .gn"
-
-PLATFORM_SUBDIR="fitpicker"
-
-inherit cros-workon platform
-
-DESCRIPTION="Utility for picking a kernel/device tree from a FIT image."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/fitpicker/"
-SRC_URI=""
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND=">=sys-apps/dtc-1.4.1"
-DEPEND="${RDEPEND}"
-
-src_install() {
-	dobin "${OUT}"/fitpicker
-}
diff --git a/sys-apps/fitpicker/fitpicker-0.0.1-r2061.ebuild b/sys-apps/fitpicker/fitpicker-0.0.1-r2061.ebuild
new file mode 100644
index 0000000..66c1f74
--- /dev/null
+++ b/sys-apps/fitpicker/fitpicker-0.0.1-r2061.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="d290f731c4d623269bf6a259a351bf92eb5f4854"
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "4ece3f8f3d85b6237e276452a02c7c6044463211" "e7dba8c91c1f3257c34d4a7ffff0ea2537aeb6bb")
+CROS_WORKON_PROJECT="chromiumos/platform2"
+CROS_WORKON_LOCALNAME="../platform2"
+CROS_WORKON_DESTDIR="${S}"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_SUBTREE="common-mk fitpicker .gn"
+
+PLATFORM_SUBDIR="fitpicker"
+
+inherit cros-workon platform
+
+DESCRIPTION="Utility for picking a kernel/device tree from a FIT image."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform2/+/master/fitpicker/"
+SRC_URI=""
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND=">=sys-apps/dtc-1.4.1"
+DEPEND="${RDEPEND}"
+
+src_install() {
+	dobin "${OUT}"/fitpicker
+}
diff --git a/sys-apps/flashrom/flashrom-0.9.9-r897.ebuild b/sys-apps/flashrom/flashrom-0.9.9-r897.ebuild
deleted file mode 100644
index c630663..0000000
--- a/sys-apps/flashrom/flashrom-0.9.9-r897.ebuild
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 1999-2011 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-apps/flashrom/flashrom-0.9.4.ebuild,v 1.5 2011/09/20 16:03:21 nativemad Exp $
-
-EAPI=7
-CROS_WORKON_COMMIT="b104790f99c92b33f043286c3e65c587a35b20b4"
-CROS_WORKON_TREE="9f7aa59d8cbc29bbab4a795024c531243ef4212b"
-CROS_WORKON_PROJECT="chromiumos/third_party/flashrom"
-
-inherit cros-workon toolchain-funcs
-
-DESCRIPTION="Utility for reading, writing, erasing and verifying flash ROM chips"
-HOMEPAGE="http://flashrom.org/"
-#SRC_URI="http://download.flashrom.org/releases/${P}.tar.bz2"
-SRC_URI=""
-
-LICENSE="GPL-2"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE="+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser
-+dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi
-+lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi
-+nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi
-+satasii +satamv +serprog static use_os_timer +wiki"
-
-LIB_DEPEND="atahpt? ( sys-apps/pciutils[static-libs(+)] )
-	dediprog? ( virtual/libusb:0[static-libs(+)] )
-	drkaiser? ( sys-apps/pciutils[static-libs(+)] )
-	fdtmap? ( sys-apps/dtc[static-libs(+)] )
-	ft2232_spi? ( dev-embedded/libftdi[static-libs(+)] )
-	gfxnvidia? ( sys-apps/pciutils[static-libs(+)] )
-	internal? ( sys-apps/pciutils[static-libs(+)] )
-	nic3com? ( sys-apps/pciutils[static-libs(+)] )
-	nicintel? ( sys-apps/pciutils[static-libs(+)] )
-	nicintel_spi? ( sys-apps/pciutils[static-libs(+)] )
-	nicnatsemi? ( sys-apps/pciutils[static-libs(+)] )
-	nicrealtek? ( sys-apps/pciutils[static-libs(+)] )
-	raiden_debug_spi? ( virtual/libusb:1[static-libs(+)] )
-	rayer_spi? ( sys-apps/pciutils[static-libs(+)] )
-	satasii? ( sys-apps/pciutils[static-libs(+)] )
-	satamv? ( sys-apps/pciutils[static-libs(+)] )
-	ogp_spi? ( sys-apps/pciutils[static-libs(+)] )"
-RDEPEND="!static? ( ${LIB_DEPEND//\[static-libs(+)]} )"
-DEPEND="${RDEPEND}
-	static? ( ${LIB_DEPEND} )"
-RDEPEND+=" internal? ( sys-apps/dmidecode )"
-
-BDEPEND="sys-apps/diffutils"
-
-_flashrom_enable() {
-	local c="CONFIG_${2:-$(echo $1 | tr [:lower:] [:upper:])}"
-	args+=" $c=$(usex $1 yes no)"
-}
-flashrom_enable() {
-	local u
-	for u in "$@" ; do _flashrom_enable $u ; done
-}
-
-src_compile() {
-	local progs=0
-	local args=""
-
-	# Programmer
-	flashrom_enable \
-		atahpt bitbang_spi buspirate_spi dediprog drkaiser fdtmap \
-		ft2232_spi gfxnvidia linux_mtd linux_spi lspcon_i2c_spi \
-		nic3com nicintel nicintel_spi nicnatsemi nicrealtek ogp_spi \
-		raiden_debug_spi rayer_spi realtek_mst_i2c_spi satasii satamv \
-		serprog internal dummy
-	_flashrom_enable wiki PRINT_WIKI
-
-	# You have to specify at least one programmer, and if you specify more than
-	# one programmer you have to include either dummy or internal in the list.
-	for prog in ${IUSE//[+-]} ; do
-		case ${prog} in
-			internal|dummy|wiki|use_os_timer) continue ;;
-		esac
-
-		use ${prog} && : $(( progs++ ))
-	done
-	if [[ ${progs} -ne 1 ]] ; then
-		if ! use internal && ! use dummy ; then
-			ewarn "You have to specify at least one programmer, and if you specify"
-			ewarn "more than one programmer, you have to enable either dummy or"
-			ewarn "internal as well.  'internal' will be the default now."
-			args+=" CONFIG_INTERNAL=yes"
-		fi
-	fi
-
-	# Configure Flashrom to use OS timer instead of calibrated delay loop
-	# if USE flag is specified or if a certain board requires it.
-	if use use_os_timer ; then
-		einfo "Configuring Flashrom to use OS timer"
-		args+=" CONFIG_USE_OS_TIMER=yes"
-	else
-		einfo "Configuring Flashrom to use delay loop"
-		args+=" CONFIG_USE_OS_TIMER=no"
-	fi
-
-	# Suppress -Wunused-function since we will see a lot of PCI-related
-	# warnings on non-x86 platforms (PCI structs are pervasive in the code).
-	append-flags "-Wall -Wno-unused-function"
-
-	# WARNERROR=no, bug 347879
-	# FIXME(dhendrix): Actually, we want -Werror for CrOS.
-	tc-export AR CC PKG_CONFIG RANLIB
-	# emake WARNERROR=no ${args}	# upstream gentoo
-
-	_flashrom_enable static STATIC
-	emake ${args}
-}
-
-src_install() {
-	dosbin flashrom
-	doman flashrom.8
-	doheader libflashrom.h
-	dodoc README.chromiumos Documentation/*.txt
-}
diff --git a/sys-apps/flashrom/flashrom-0.9.9-r997.ebuild b/sys-apps/flashrom/flashrom-0.9.9-r997.ebuild
new file mode 100644
index 0000000..96c5636
--- /dev/null
+++ b/sys-apps/flashrom/flashrom-0.9.9-r997.ebuild
@@ -0,0 +1,110 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-apps/flashrom/flashrom-0.9.4.ebuild,v 1.5 2011/09/20 16:03:21 nativemad Exp $
+
+EAPI=7
+CROS_WORKON_COMMIT="2c67927c2e1cad838248587f0deb06996aba6093"
+CROS_WORKON_TREE="ce8726a984b2af0d640df5cb9bce6ee3fee5fd6f"
+CROS_WORKON_PROJECT="chromiumos/third_party/flashrom"
+
+inherit cros-workon toolchain-funcs
+
+DESCRIPTION="Utility for reading, writing, erasing and verifying flash ROM chips"
+HOMEPAGE="http://flashrom.org/"
+#SRC_URI="http://download.flashrom.org/releases/${P}.tar.bz2"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="+atahpt +bitbang_spi +buspirate_spi dediprog +drkaiser
++dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi
++lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi
++nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi
++satasii +satamv +serprog static +wiki"
+
+LIB_DEPEND="atahpt? ( sys-apps/pciutils[static-libs(+)] )
+	dediprog? ( virtual/libusb:0[static-libs(+)] )
+	drkaiser? ( sys-apps/pciutils[static-libs(+)] )
+	fdtmap? ( sys-apps/dtc[static-libs(+)] )
+	ft2232_spi? ( dev-embedded/libftdi[static-libs(+)] )
+	gfxnvidia? ( sys-apps/pciutils[static-libs(+)] )
+	internal? ( sys-apps/pciutils[static-libs(+)] )
+	nic3com? ( sys-apps/pciutils[static-libs(+)] )
+	nicintel? ( sys-apps/pciutils[static-libs(+)] )
+	nicintel_spi? ( sys-apps/pciutils[static-libs(+)] )
+	nicnatsemi? ( sys-apps/pciutils[static-libs(+)] )
+	nicrealtek? ( sys-apps/pciutils[static-libs(+)] )
+	raiden_debug_spi? ( virtual/libusb:1[static-libs(+)] )
+	rayer_spi? ( sys-apps/pciutils[static-libs(+)] )
+	satasii? ( sys-apps/pciutils[static-libs(+)] )
+	satamv? ( sys-apps/pciutils[static-libs(+)] )
+	ogp_spi? ( sys-apps/pciutils[static-libs(+)] )"
+RDEPEND="!static? ( ${LIB_DEPEND//\[static-libs(+)]} )"
+DEPEND="${RDEPEND}
+	static? ( ${LIB_DEPEND} )"
+RDEPEND+=" internal? ( sys-apps/dmidecode )"
+
+BDEPEND="sys-apps/diffutils"
+
+_flashrom_enable() {
+	local c="CONFIG_${2:-$(echo $1 | tr [:lower:] [:upper:])}"
+	args+=" $c=$(usex $1 yes no)"
+}
+flashrom_enable() {
+	local u
+	for u in "$@" ; do _flashrom_enable $u ; done
+}
+
+src_compile() {
+	local progs=0
+	local args=""
+
+	# Programmer
+	flashrom_enable \
+		atahpt bitbang_spi buspirate_spi dediprog drkaiser fdtmap \
+		ft2232_spi gfxnvidia linux_mtd linux_spi lspcon_i2c_spi \
+		nic3com nicintel nicintel_spi nicnatsemi nicrealtek ogp_spi \
+		raiden_debug_spi rayer_spi realtek_mst_i2c_spi satasii satamv \
+		serprog internal dummy
+	_flashrom_enable wiki PRINT_WIKI
+
+	# You have to specify at least one programmer, and if you specify more than
+	# one programmer you have to include either dummy or internal in the list.
+	for prog in ${IUSE//[+-]} ; do
+		case ${prog} in
+			internal|dummy|wiki) continue ;;
+		esac
+
+		use ${prog} && : $(( progs++ ))
+	done
+	if [[ ${progs} -ne 1 ]] ; then
+		if ! use internal && ! use dummy ; then
+			ewarn "You have to specify at least one programmer, and if you specify"
+			ewarn "more than one programmer, you have to enable either dummy or"
+			ewarn "internal as well.  'internal' will be the default now."
+			args+=" CONFIG_INTERNAL=yes"
+		fi
+	fi
+
+	args+=" CONFIG_DEFAULT_PROGRAMMER=PROGRAMMER_INTERNAL"
+
+	# Suppress -Wunused-function since we will see a lot of PCI-related
+	# warnings on non-x86 platforms (PCI structs are pervasive in the code).
+	append-flags "-Wall -Wno-unused-function"
+
+	# WARNERROR=no, bug 347879
+	# FIXME(dhendrix): Actually, we want -Werror for CrOS.
+	tc-export AR CC PKG_CONFIG RANLIB
+	# emake WARNERROR=no ${args}	# upstream gentoo
+
+	_flashrom_enable static STATIC
+	emake ${args}
+}
+
+src_install() {
+	dosbin flashrom
+	doman flashrom.8
+	doheader libflashrom.h
+	dodoc README.chromiumos Documentation/*.txt
+}
diff --git a/sys-apps/flashrom/flashrom-9999.ebuild b/sys-apps/flashrom/flashrom-9999.ebuild
index b19b029..c28500b 100644
--- a/sys-apps/flashrom/flashrom-9999.ebuild
+++ b/sys-apps/flashrom/flashrom-9999.ebuild
@@ -19,7 +19,7 @@
 +dummy +fdtmap +ft2232_spi +gfxnvidia +internal +linux_mtd +linux_spi
 +lspcon_i2c_spi +nic3com +nicintel +nicintel_spi +nicnatsemi
 +nicrealtek +ogp_spi +raiden_debug_spi +rayer_spi +realtek_mst_i2c_spi
-+satasii +satamv +serprog static use_os_timer +wiki"
++satasii +satamv +serprog static +wiki"
 
 LIB_DEPEND="atahpt? ( sys-apps/pciutils[static-libs(+)] )
 	dediprog? ( virtual/libusb:0[static-libs(+)] )
@@ -71,7 +71,7 @@
 	# one programmer you have to include either dummy or internal in the list.
 	for prog in ${IUSE//[+-]} ; do
 		case ${prog} in
-			internal|dummy|wiki|use_os_timer) continue ;;
+			internal|dummy|wiki) continue ;;
 		esac
 
 		use ${prog} && : $(( progs++ ))
@@ -85,15 +85,7 @@
 		fi
 	fi
 
-	# Configure Flashrom to use OS timer instead of calibrated delay loop
-	# if USE flag is specified or if a certain board requires it.
-	if use use_os_timer ; then
-		einfo "Configuring Flashrom to use OS timer"
-		args+=" CONFIG_USE_OS_TIMER=yes"
-	else
-		einfo "Configuring Flashrom to use delay loop"
-		args+=" CONFIG_USE_OS_TIMER=no"
-	fi
+	args+=" CONFIG_DEFAULT_PROGRAMMER=PROGRAMMER_INTERNAL"
 
 	# Suppress -Wunused-function since we will see a lot of PCI-related
 	# warnings on non-x86 platforms (PCI structs are pervasive in the code).
diff --git a/sys-apps/frecon-lite/frecon-lite-0.0.1-r67.ebuild b/sys-apps/frecon-lite/frecon-lite-0.0.1-r67.ebuild
deleted file mode 100644
index 91288f2..0000000
--- a/sys-apps/frecon-lite/frecon-lite-0.0.1-r67.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="42de73be04a4f7b07c9cedf11ac2b8275fa76bd9"
-CROS_WORKON_TREE="3d33111677bfa34cd2094b48c070ab5e0ddab1e7"
-CROS_WORKON_PROJECT="chromiumos/platform/frecon"
-CROS_WORKON_LOCALNAME="../platform/frecon"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cros-sanitizers cros-workon cros-common.mk
-
-DESCRIPTION="Chrome OS KMS console (without DBUS/UDEV support)"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/frecon"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-asan"
-
-BDEPEND="virtual/pkgconfig"
-
-COMMON_DEPEND="media-libs/libpng:0=
-	sys-apps/libtsm:="
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	media-sound/adhd:=
-	x11-libs/libdrm:="
-
-src_configure() {
-	export FRECON_LITE=1
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
diff --git a/sys-apps/frecon-lite/frecon-lite-0.0.1-r69.ebuild b/sys-apps/frecon-lite/frecon-lite-0.0.1-r69.ebuild
new file mode 100644
index 0000000..51997e4
--- /dev/null
+++ b/sys-apps/frecon-lite/frecon-lite-0.0.1-r69.ebuild
@@ -0,0 +1,37 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="93af352f622ac3302a128a36576636d97e1ec217"
+CROS_WORKON_TREE="3d33111677bfa34cd2094b48c070ab5e0ddab1e7"
+CROS_WORKON_PROJECT="chromiumos/platform/frecon"
+CROS_WORKON_LOCALNAME="../platform/frecon"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+inherit cros-sanitizers cros-workon cros-common.mk
+
+DESCRIPTION="Chrome OS KMS console (without DBUS/UDEV support)"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/frecon"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-asan"
+
+BDEPEND="virtual/pkgconfig"
+
+COMMON_DEPEND="media-libs/libpng:0=
+	sys-apps/libtsm:="
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	media-sound/adhd:=
+	x11-libs/libdrm:="
+
+src_configure() {
+	export FRECON_LITE=1
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
diff --git a/sys-apps/frecon/frecon-0.0.1-r172.ebuild b/sys-apps/frecon/frecon-0.0.1-r172.ebuild
deleted file mode 100644
index b39542c..0000000
--- a/sys-apps/frecon/frecon-0.0.1-r172.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="42de73be04a4f7b07c9cedf11ac2b8275fa76bd9"
-CROS_WORKON_TREE="3d33111677bfa34cd2094b48c070ab5e0ddab1e7"
-CROS_WORKON_PROJECT="chromiumos/platform/frecon"
-CROS_WORKON_LOCALNAME="../platform/frecon"
-CROS_WORKON_OUTOFTREE_BUILD=1
-CROS_WORKON_INCREMENTAL_BUILD=1
-
-inherit cros-sanitizers cros-workon cros-common.mk
-
-DESCRIPTION="Chrome OS KMS console"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/frecon"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="-asan"
-
-BDEPEND="virtual/pkgconfig"
-
-COMMON_DEPEND="virtual/udev
-	sys-apps/dbus:=
-	media-libs/libpng:0=
-	sys-apps/libtsm:=
-	x11-libs/libdrm:="
-
-RDEPEND="${COMMON_DEPEND}"
-
-DEPEND="${COMMON_DEPEND}
-	media-sound/adhd:=
-"
-
-src_configure() {
-	sanitizers-setup-env
-	cros-common.mk_src_configure
-}
-
-src_install() {
-	insinto /etc/dbus-1/system.d
-	doins dbus/org.chromium.frecon.conf
-	default
-}
diff --git a/sys-apps/frecon/frecon-0.0.1-r174.ebuild b/sys-apps/frecon/frecon-0.0.1-r174.ebuild
new file mode 100644
index 0000000..6537642
--- /dev/null
+++ b/sys-apps/frecon/frecon-0.0.1-r174.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="93af352f622ac3302a128a36576636d97e1ec217"
+CROS_WORKON_TREE="3d33111677bfa34cd2094b48c070ab5e0ddab1e7"
+CROS_WORKON_PROJECT="chromiumos/platform/frecon"
+CROS_WORKON_LOCALNAME="../platform/frecon"
+CROS_WORKON_OUTOFTREE_BUILD=1
+CROS_WORKON_INCREMENTAL_BUILD=1
+
+inherit cros-sanitizers cros-workon cros-common.mk
+
+DESCRIPTION="Chrome OS KMS console"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/frecon"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="-asan"
+
+BDEPEND="virtual/pkgconfig"
+
+COMMON_DEPEND="virtual/udev
+	sys-apps/dbus:=
+	media-libs/libpng:0=
+	sys-apps/libtsm:=
+	x11-libs/libdrm:="
+
+RDEPEND="${COMMON_DEPEND}"
+
+DEPEND="${COMMON_DEPEND}
+	media-sound/adhd:=
+"
+
+src_configure() {
+	sanitizers-setup-env
+	cros-common.mk_src_configure
+}
+
+src_install() {
+	insinto /etc/dbus-1/system.d
+	doins dbus/org.chromium.frecon.conf
+	default
+}
diff --git a/sys-apps/fwupd/files/fwupdtool-update.conf b/sys-apps/fwupd/files/fwupdtool-update.conf
index c553646..636e7e3 100644
--- a/sys-apps/fwupd/files/fwupdtool-update.conf
+++ b/sys-apps/fwupd/files/fwupdtool-update.conf
@@ -11,9 +11,12 @@
 start on fwupdtool-update
 task
 
+# Device GUID to be updated by fwupdtool update invocation.
+import GUID
 # FWUPD plugin to be used by fwupdtool update invokation.
 import PLUGIN
 
+env REGEX="^[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}$"
 env MINIJAIL_ARGS="--uts -e -l -p -N \
     -v -P /mnt/empty -b / -b /proc -t -r -b /dev,,1 -b /sys \
     -k run,/run,tmpfs -b /run/dbus -b /run/udev \
@@ -22,6 +25,10 @@
 env MINIJAIL_CAP="-c cap_dac_override+e"
 
 pre-start script
+  if [ $(expr "${GUID}" : "${REGEX}") -eq 0 ]; then
+    logger -p err -t "${UPSTART_JOB}" "Invalid GUID: ${GUID}"
+    exit 1
+  fi
   mkdir -p /var/cache/fwupd /var/lib/fwupd
   chown -R fwupd:fwupd /var/cache/fwupd /var/lib/fwupd
   if ! minijail0 ${MINIJAIL_ARGS} ${MINIJAIL_CAP} \
@@ -37,6 +44,6 @@
     MINIJAIL_CAP="-c cap_dac_override,cap_sys_admin+e"
   fi
   exec minijail0 ${MINIJAIL_ARGS} ${MINIJAIL_CAP} \
-    -- /usr/bin/fwupdtool update --plugin-whitelist="${PLUGIN}" \
+    -- /usr/bin/fwupdtool update "${GUID}" --plugin-whitelist="${PLUGIN}" \
     --enable-json-state 2>&1 | logger -t "${UPSTART_JOB}"
 end script
diff --git a/sys-apps/fwupd/fwupd-1.4.1-r45.ebuild b/sys-apps/fwupd/fwupd-1.4.1-r45.ebuild
deleted file mode 100644
index 415b5c2..0000000
--- a/sys-apps/fwupd/fwupd-1.4.1-r45.ebuild
+++ /dev/null
@@ -1,181 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT="5cd92b5148154b118cf22cc75da751304cd01614"
-CROS_WORKON_TREE="917a3abae3b764941271cc8a5e9f76d6c8e322d5"
-CROS_WORKON_PROJECT="chromiumos/third_party/fwupd"
-CROS_WORKON_EGIT_BRANCH="fwupd-1.4.1"
-
-PYTHON_COMPAT=( python2_7 python3_{4,5,6,7} )
-
-inherit cros-workon linux-info meson python-single-r1 user vala xdg
-
-DESCRIPTION="Aims to make updating firmware on Linux automatic, safe and reliable"
-HOMEPAGE="https://fwupd.org"
-#SRC_URI="https://github.com/hughsie/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
-
-LICENSE="LGPL-2.1+"
-SLOT="0"
-KEYWORDS="*"
-IUSE="agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi"
-REQUIRED_USE="${PYTHON_REQUIRED_USE}
-	^^ ( consolekit elogind minimal systemd )
-	dell? ( uefi )
-	minimal? ( !introspection )
-"
-RESTRICT="!test? ( test )"
-
-BDEPEND="virtual/pkgconfig
-	gtk-doc? ( dev-util/gtk-doc )
-	introspection? ( dev-libs/gobject-introspection )
-	man? (
-		app-text/docbook-sgml-utils
-		sys-apps/help2man
-	)
-	test? (
-		thunderbolt? ( dev-util/umockdev )
-		net-libs/gnutls[tools]
-	)
-"
-RDEPEND=">=app-arch/gcab-1.0
-	app-arch/libarchive:=
-	dev-db/sqlite
-	>=dev-libs/glib-2.45.8:2
-	dev-libs/json-glib
-	dev-libs/libgpg-error
-	>=dev-libs/libgudev-232:=
-	>=dev-libs/libgusb-0.3.3[introspection?]
-	>=dev-libs/libjcat-0.1.0[gpg?,pkcs7?]
-	>=dev-libs/libxmlb-0.1.13
-	>=net-libs/libsoup-2.51.92:2.4[introspection?]
-	virtual/libelf:0=
-	virtual/udev
-	consolekit? ( >=sys-auth/consolekit-1.0.0 )
-	dell? (
-		sys-libs/efivar
-		>=sys-libs/libsmbios-2.4.0
-	)
-	elogind? ( sys-auth/elogind )
-	!minimal? (
-		>=sys-auth/polkit-0.103
-	)
-	nvme? ( sys-libs/efivar )
-	redfish? ( sys-libs/efivar )
-	systemd? ( >=sys-apps/systemd-211 )
-	uefi? (
-		app-crypt/tpm2-tss
-		media-libs/fontconfig
-		media-libs/freetype
-		sys-boot/gnu-efi
-		sys-boot/efibootmgr
-		>=sys-libs/efivar-33
-		x11-libs/cairo
-	)
-"
-DEPEND="$(vala_depend)
-	${PYTHON_DEPS}
-	$(python_gen_cond_dep '
-		dev-python/pillow[${PYTHON_USEDEP}]
-		dev-python/pycairo[${PYTHON_USEDEP}]
-		dev-python/pygobject:3[cairo,${PYTHON_USEDEP}]
-	' ${PYTHON_COMPAT} )
-	${RDEPEND}
-"
-# Block sci-chemistry/chemical-mime-data for bug #701900
-RDEPEND+="
-	!<sci-chemistry/chemical-mime-data-0.1.94-r4
-	sys-apps/dbus
-"
-
-pkg_setup() {
-	python-single-r1_pkg_setup
-	if use nvme; then
-		kernel_is -ge 4 4 || die "NVMe support requires kernel >= 4.4"
-	fi
-}
-
-src_prepare() {
-	default
-	# c.f. https://github.com/fwupd/fwupd/issues/1414
-	sed -e "/test('thunderbolt-self-test', e, env: test_env, timeout : 120)/d" \
-		-i plugins/thunderbolt/meson.build || die
-	sed -e "/^gcab/s/^/#/" -i meson.build || die
-	if ! use nls ; then
-		echo > po/LINGUAS || die
-	fi
-	vala_src_prepare
-}
-
-src_configure() {
-	local emesonargs=(
-		--localstatedir "${EPREFIX}"/var
-		-Dbuild="$(usex minimal standalone all)"
-		$(meson_use agent)
-		$(meson_use amt plugin_amt)
-		$(meson_use consolekit)
-		$(meson_use dell plugin_dell)
-		$(meson_use elogind)
-		$(meson_use gtk-doc gtkdoc)
-		$(meson_use introspection)
-		$(meson_use man)
-		$(meson_use nvme plugin_nvme)
-		$(meson_use redfish plugin_redfish)
-		$(meson_use synaptics plugin_synaptics)
-		$(meson_use systemd)
-		$(meson_use test tests)
-		$(meson_use thunderbolt plugin_thunderbolt)
-		$(meson_use uefi plugin_uefi)
-		# Requires libflashrom which our sys-apps/flashrom
-		# package does not provide
-		-Dplugin_flashrom="false"
-		# Dependencies are not available (yet?)
-		-Dplugin_modem_manager="false"
-		# Dependencies are not available (yet?)
-		-Dplugin_tpm="false"
-	)
-	export CACHE_DIRECTORY="${T}"
-	meson_src_configure
-}
-
-src_install() {
-	meson_src_install
-
-	# Enable vendor-directory remote with local firmware
-	sed 's/Enabled=false/Enabled=true/' -i "${ED}"/etc/${PN}/remotes.d/vendor-directory.conf || die
-
-	insinto /etc/init
-	# Install upstart script for activating firmware update on logout/shutdown.
-	doins "${FILESDIR}"/fwupdtool-activate.conf
-	# Install upstart script for reloading firmware metadata shown on chrome://system.
-	doins "${FILESDIR}"/fwupdtool-getdevices.conf
-	# Install upstart script for automatic firmware update on device plug-in.
-	doins "${FILESDIR}"/fwupdtool-update.conf
-
-	if ! use minimal ; then
-		sed "s@%SEAT_MANAGER%@$(usex elogind elogind consolekit)@" \
-			"${FILESDIR}"/${PN}-r1 \
-			> "${T}"/${PN} || die
-		doinitd "${T}"/${PN}
-
-		if ! use systemd ; then
-			# Don't timeout when fwupd is running (#673140)
-			sed '/^IdleTimeout=/s@=[[:digit:]]\+@=0@' \
-				-i "${ED}"/etc/${PN}/daemon.conf || die
-		fi
-	fi
-}
-
-pkg_preinst() {
-	enewuser fwupd
-	enewgroup fwupd
-}
-
-pkg_postinst() {
-	xdg_pkg_postinst
-	elog "In case you are using openrc as init system"
-	elog "and you're upgrading from <fwupd-1.1.0, you"
-	elog "need to start the fwupd daemon via the openrc"
-	elog "init script that comes with this package."
-}
diff --git a/sys-apps/fwupd/fwupd-1.4.5-r63.ebuild b/sys-apps/fwupd/fwupd-1.4.5-r63.ebuild
new file mode 100644
index 0000000..5006f40
--- /dev/null
+++ b/sys-apps/fwupd/fwupd-1.4.5-r63.ebuild
@@ -0,0 +1,181 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+CROS_WORKON_COMMIT="84f7472bc278043a1286a9aee1ed561c097bb078"
+CROS_WORKON_TREE="29b973effac6fc526454ec4fdc063c3a4562db32"
+CROS_WORKON_PROJECT="chromiumos/third_party/fwupd"
+CROS_WORKON_EGIT_BRANCH="fwupd-1.4.5"
+
+PYTHON_COMPAT=( python2_7 python3_{4,5,6,7} )
+
+inherit cros-workon linux-info meson python-single-r1 user vala xdg
+
+DESCRIPTION="Aims to make updating firmware on Linux automatic, safe and reliable"
+HOMEPAGE="https://fwupd.org"
+#SRC_URI="https://github.com/hughsie/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="LGPL-2.1+"
+SLOT="0"
+KEYWORDS="*"
+IUSE="agent amt consolekit dell gtk-doc elogind +minimal +gpg introspection +man nls nvme pkcs7 redfish synaptics systemd test thunderbolt uefi"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}
+	^^ ( consolekit elogind minimal systemd )
+	dell? ( uefi )
+	minimal? ( !introspection )
+"
+RESTRICT="!test? ( test )"
+
+BDEPEND="virtual/pkgconfig
+	gtk-doc? ( dev-util/gtk-doc )
+	introspection? ( dev-libs/gobject-introspection )
+	man? (
+		app-text/docbook-sgml-utils
+		sys-apps/help2man
+	)
+	test? (
+		thunderbolt? ( dev-util/umockdev )
+		net-libs/gnutls[tools]
+	)
+"
+RDEPEND=">=app-arch/gcab-1.0
+	app-arch/libarchive:=
+	dev-db/sqlite
+	>=dev-libs/glib-2.45.8:2
+	dev-libs/json-glib
+	dev-libs/libgpg-error
+	>=dev-libs/libgudev-232:=
+	>=dev-libs/libgusb-0.3.5:=[introspection?]
+	>=dev-libs/libjcat-0.1.0[gpg?,pkcs7?]
+	>=dev-libs/libxmlb-0.1.13
+	>=net-libs/libsoup-2.51.92:2.4[introspection?]
+	virtual/libelf:0=
+	virtual/udev
+	consolekit? ( >=sys-auth/consolekit-1.0.0 )
+	dell? (
+		sys-libs/efivar
+		>=sys-libs/libsmbios-2.4.0
+	)
+	elogind? ( sys-auth/elogind )
+	!minimal? (
+		>=sys-auth/polkit-0.103
+	)
+	nvme? ( sys-libs/efivar )
+	redfish? ( sys-libs/efivar )
+	systemd? ( >=sys-apps/systemd-211 )
+	uefi? (
+		app-crypt/tpm2-tss
+		media-libs/fontconfig
+		media-libs/freetype
+		sys-boot/gnu-efi
+		sys-boot/efibootmgr
+		>=sys-libs/efivar-33
+		x11-libs/cairo
+	)
+"
+DEPEND="$(vala_depend)
+	${PYTHON_DEPS}
+	$(python_gen_cond_dep '
+		dev-python/pillow[${PYTHON_USEDEP}]
+		dev-python/pycairo[${PYTHON_USEDEP}]
+		dev-python/pygobject:3[cairo,${PYTHON_USEDEP}]
+	' ${PYTHON_COMPAT} )
+	${RDEPEND}
+"
+# Block sci-chemistry/chemical-mime-data for bug #701900
+RDEPEND+="
+	!<sci-chemistry/chemical-mime-data-0.1.94-r4
+	sys-apps/dbus
+"
+
+pkg_setup() {
+	python-single-r1_pkg_setup
+	if use nvme; then
+		kernel_is -ge 4 4 || die "NVMe support requires kernel >= 4.4"
+	fi
+}
+
+src_prepare() {
+	default
+	# c.f. https://github.com/fwupd/fwupd/issues/1414
+	sed -e "/test('thunderbolt-self-test', e, env: test_env, timeout : 120)/d" \
+		-i plugins/thunderbolt/meson.build || die
+	sed -e "/^gcab/s/^/#/" -i meson.build || die
+	if ! use nls ; then
+		echo > po/LINGUAS || die
+	fi
+	vala_src_prepare
+}
+
+src_configure() {
+	local emesonargs=(
+		--localstatedir "${EPREFIX}"/var
+		-Dbuild="$(usex minimal standalone all)"
+		$(meson_use agent)
+		$(meson_use amt plugin_amt)
+		$(meson_use consolekit)
+		$(meson_use dell plugin_dell)
+		$(meson_use elogind)
+		$(meson_use gtk-doc gtkdoc)
+		$(meson_use introspection)
+		$(meson_use man)
+		$(meson_use nvme plugin_nvme)
+		$(meson_use redfish plugin_redfish)
+		$(meson_use synaptics plugin_synaptics)
+		$(meson_use systemd)
+		$(meson_use test tests)
+		$(meson_use thunderbolt plugin_thunderbolt)
+		$(meson_use uefi plugin_uefi)
+		# Requires libflashrom which our sys-apps/flashrom
+		# package does not provide
+		-Dplugin_flashrom="false"
+		# Dependencies are not available (yet?)
+		-Dplugin_modem_manager="false"
+		# Dependencies are not available (yet?)
+		-Dplugin_tpm="false"
+	)
+	export CACHE_DIRECTORY="${T}"
+	meson_src_configure
+}
+
+src_install() {
+	meson_src_install
+
+	# Enable vendor-directory remote with local firmware
+	sed 's/Enabled=false/Enabled=true/' -i "${ED}"/etc/${PN}/remotes.d/vendor-directory.conf || die
+
+	insinto /etc/init
+	# Install upstart script for activating firmware update on logout/shutdown.
+	doins "${FILESDIR}"/fwupdtool-activate.conf
+	# Install upstart script for reloading firmware metadata shown on chrome://system.
+	doins "${FILESDIR}"/fwupdtool-getdevices.conf
+	# Install upstart script for automatic firmware update on device plug-in.
+	doins "${FILESDIR}"/fwupdtool-update.conf
+
+	if ! use minimal ; then
+		sed "s@%SEAT_MANAGER%@$(usex elogind elogind consolekit)@" \
+			"${FILESDIR}"/${PN}-r1 \
+			> "${T}"/${PN} || die
+		doinitd "${T}"/${PN}
+
+		if ! use systemd ; then
+			# Don't timeout when fwupd is running (#673140)
+			sed '/^IdleTimeout=/s@=[[:digit:]]\+@=0@' \
+				-i "${ED}"/etc/${PN}/daemon.conf || die
+		fi
+	fi
+}
+
+pkg_preinst() {
+	enewuser fwupd
+	enewgroup fwupd
+}
+
+pkg_postinst() {
+	xdg_pkg_postinst
+	elog "In case you are using openrc as init system"
+	elog "and you're upgrading from <fwupd-1.1.0, you"
+	elog "need to start the fwupd daemon via the openrc"
+	elog "init script that comes with this package."
+}
diff --git a/sys-apps/fwupd/fwupd-9999.ebuild b/sys-apps/fwupd/fwupd-9999.ebuild
index 6e67bad..59f2e81 100644
--- a/sys-apps/fwupd/fwupd-9999.ebuild
+++ b/sys-apps/fwupd/fwupd-9999.ebuild
@@ -4,7 +4,7 @@
 EAPI=6
 
 CROS_WORKON_PROJECT="chromiumos/third_party/fwupd"
-CROS_WORKON_EGIT_BRANCH="fwupd-1.4.1"
+CROS_WORKON_EGIT_BRANCH="fwupd-1.4.5"
 
 PYTHON_COMPAT=( python2_7 python3_{4,5,6,7} )
 
@@ -44,7 +44,7 @@
 	dev-libs/json-glib
 	dev-libs/libgpg-error
 	>=dev-libs/libgudev-232:=
-	>=dev-libs/libgusb-0.3.3[introspection?]
+	>=dev-libs/libgusb-0.3.5:=[introspection?]
 	>=dev-libs/libjcat-0.1.0[gpg?,pkcs7?]
 	>=dev-libs/libxmlb-0.1.13
 	>=net-libs/libsoup-2.51.92:2.4[introspection?]
diff --git a/sys-apps/huddly-updater/huddly-updater-0.0.1-r78.ebuild b/sys-apps/huddly-updater/huddly-updater-0.0.1-r78.ebuild
deleted file mode 100644
index e7249bd..0000000
--- a/sys-apps/huddly-updater/huddly-updater-0.0.1-r78.ebuild
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="0b1bcc66b3a0eea435774ee070bfa36eccdabed5"
-CROS_WORKON_TREE="8c98f8361691a96b14c3adaef9f2f56caa8a1dc2"
-CROS_WORKON_PROJECT="chromiumos/third_party/huddly-updater"
-
-inherit cros-debug cros-workon libchrome udev user
-
-DESCRIPTION="A utility to update Huddly camera firmware"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/huddly-updater"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="test"
-
-COMMON_DEPEND="chromeos-base/libbrillo:=
-	chromeos-base/cfm-dfu-notification:=
-	dev-libs/msgpack:=
-	virtual/libusb:1
-	virtual/libudev:0=
-"
-
-DEPEND="${COMMON_DEPEND}
-	test? ( dev-cpp/gtest:= )
-"
-
-RDEPEND="${COMMON_DEPEND}
-	app-arch/unzip
-"
-
-src_configure() {
-	# See crbug/1078297
-	cros-debug-add-NDEBUG
-	default
-}
-
-src_test() {
-	if use amd64; then
-		emake tests
-	fi
-}
-
-src_install() {
-	dosbin huddly-updater
-	dosbin huddly-hpk-updater
-	udev_dorules conf/99-huddly.rules
-}
-
-pkg_preinst() {
-	enewuser cfm-firmware-updaters
-	enewgroup cfm-firmware-updaters
-}
diff --git a/sys-apps/huddly-updater/huddly-updater-0.0.1-r82.ebuild b/sys-apps/huddly-updater/huddly-updater-0.0.1-r82.ebuild
new file mode 100644
index 0000000..77c048f
--- /dev/null
+++ b/sys-apps/huddly-updater/huddly-updater-0.0.1-r82.ebuild
@@ -0,0 +1,54 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="d0c5e1cb6111ceedf22d512e67f145c4f8ada414"
+CROS_WORKON_TREE="62c9857ae36ffeac691f38cbdc58bf1106b35826"
+CROS_WORKON_PROJECT="chromiumos/third_party/huddly-updater"
+
+inherit cros-debug cros-workon libchrome udev user
+
+DESCRIPTION="A utility to update Huddly camera firmware"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/huddly-updater"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="test"
+
+COMMON_DEPEND="chromeos-base/libbrillo:=
+	chromeos-base/cfm-dfu-notification:=
+	dev-libs/msgpack:=
+	virtual/libusb:1
+	virtual/libudev:0=
+"
+
+DEPEND="${COMMON_DEPEND}
+	test? ( dev-cpp/gtest:= )
+"
+
+RDEPEND="${COMMON_DEPEND}
+	app-arch/unzip
+"
+
+src_configure() {
+	# See crbug/1078297
+	cros-debug-add-NDEBUG
+	default
+}
+
+src_test() {
+	if use amd64; then
+		emake tests
+	fi
+}
+
+src_install() {
+	dosbin huddly-updater
+	dosbin huddly-hpk-updater
+	udev_dorules conf/99-huddly.rules
+}
+
+pkg_preinst() {
+	enewuser cfm-firmware-updaters
+	enewgroup cfm-firmware-updaters
+}
diff --git a/sys-apps/logitech-updater/logitech-updater-0.0.1-r28.ebuild b/sys-apps/logitech-updater/logitech-updater-0.0.1-r28.ebuild
deleted file mode 100644
index df1c0bb..0000000
--- a/sys-apps/logitech-updater/logitech-updater-0.0.1-r28.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="c1a22e7c03a99070df036b9c3381e704363ddbf9"
-CROS_WORKON_TREE="42da8f169e09aeee9fc8d81e00f145bdf5a54a75"
-CROS_WORKON_PROJECT="chromiumos/third_party/logitech-updater"
-
-inherit cros-debug cros-workon libchrome udev user
-
-DESCRIPTION="Logitech firmware updater"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/logitech-updater"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-COMMON_DEPEND="chromeos-base/libbrillo:=
-	virtual/libusb:1=
-	chromeos-base/cfm-dfu-notification:=
-"
-
-RDEPEND="${COMMON_DEPEND}"
-DEPEND="${COMMON_DEPEND}"
-
-src_configure() {
-	# See crbug/1078297
-	cros-debug-add-NDEBUG
-	default
-}
-
-src_install() {
-	dosbin logitech-updater
-	udev_dorules conf/99-logitech-updater.rules
-
-	# Install seccomp policy.
-	insinto "/usr/share/policy"
-	newins "seccomp/logitech-updater-seccomp-${ARCH}.policy" logitech-updater-seccomp.policy
-}
-
-pkg_preinst() {
-	enewuser cfm-firmware-updaters
-	enewgroup cfm-firmware-updaters
-}
diff --git a/sys-apps/logitech-updater/logitech-updater-0.0.1-r33.ebuild b/sys-apps/logitech-updater/logitech-updater-0.0.1-r33.ebuild
new file mode 100644
index 0000000..37ac684
--- /dev/null
+++ b/sys-apps/logitech-updater/logitech-updater-0.0.1-r33.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="391df9f6cd08152d8edb0186d260100d0725eeac"
+CROS_WORKON_TREE="3a2d424e597cb3403416dd1031f58d1006fa79a1"
+CROS_WORKON_PROJECT="chromiumos/third_party/logitech-updater"
+
+inherit cros-debug cros-workon libchrome udev user
+
+DESCRIPTION="Logitech firmware updater"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/logitech-updater"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+COMMON_DEPEND="chromeos-base/libbrillo:=
+	virtual/libusb:1=
+	chromeos-base/cfm-dfu-notification:=
+"
+
+RDEPEND="${COMMON_DEPEND}"
+DEPEND="${COMMON_DEPEND}"
+
+src_configure() {
+	# See crbug/1078297
+	cros-debug-add-NDEBUG
+	default
+}
+
+src_install() {
+	dosbin logitech-updater
+	udev_dorules conf/99-logitech-updater.rules
+
+	# Install seccomp policy.
+	insinto "/usr/share/policy"
+	newins "seccomp/logitech-updater-seccomp-${ARCH}.policy" logitech-updater-seccomp.policy
+}
+
+pkg_preinst() {
+	enewuser cfm-firmware-updaters
+	enewgroup cfm-firmware-updaters
+}
diff --git a/sys-apps/man-pages/files/extract-licenses.py b/sys-apps/man-pages/files/extract-licenses.py
new file mode 100755
index 0000000..7373b76
--- /dev/null
+++ b/sys-apps/man-pages/files/extract-licenses.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python3
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Extract all the licenses from the man page comments.
+
+Each man page may be licensed under a unique license, so we have to walk each
+one and extract the details.
+"""
+
+import argparse
+import os
+from pathlib import Path
+import re
+import sys
+
+
+# Extract the license name & text from a section like:
+# .\" %%%LICENSE_START(BSD_4_CLAUSE_UCB)
+# .\" ...text...
+# .\" %%%LICENSE_END
+EXTRACT_LICENSE = re.compile(
+    r'^[^\n]*%%%LICENSE_START\(([^)]+)\)\n(.*)%%%LICENSE_END$',
+    flags=re.MULTILINE | re.DOTALL)
+
+
+# Licenses that require copyright attribution.
+ATTRIBUTION_LICENSES = {
+    'BSD_3_CLAUSE_UCB',
+    'BSD_4_CLAUSE_UCB',
+    'BSD_ONELINE_CDROM',
+    'MISC',
+    'MIT',
+    'PERMISSIVE_MISC',
+    'VERBATIM',
+    'VERBATIM_ONE_PARA',
+    'VERBATIM_PROF',
+    'VERBATIM_TWO_PARA',
+}
+
+# All licenses we know about.  If a new one shows up, we'll throw an error so
+# we're forced to evaluate it.
+KNOWN_LICENSES = ATTRIBUTION_LICENSES | {
+    'FREELY_REDISTRIBUTABLE',
+    'GPL_NOVERSION_ONELINE',
+    'GPLv2+',
+    'GPLv2+_DOC_FULL',
+    'GPLv2+_DOC_MISC',
+    'GPLv2+_DOC_ONEPARA',
+    'GPLv2_MISC',
+    'GPLv2_ONELINE',
+    'GPLv2+_SW_3_PARA',
+    'GPLv2+_SW_ONEPARA',
+    'LDPv1',
+    'PUBLIC_DOMAIN',
+}
+
+
+def line_iscomment(line):
+    """Whether |line| is a roff comment."""
+    # A variety of possible formats here.  This should get cleaned up in newer
+    # versions, but we have to deal with it in current releases.
+    # \" ...
+    # .\" ...
+    # '\" ...
+    return re.match(r'''^[.']?\\"''', line)
+
+
+def extract_license(page):
+    """Extract the license from |page|."""
+    with open(page, encoding='utf-8') as fp:
+        data = fp.read()
+
+        # Ignore stub pointer files.
+        if data.startswith('.so '):
+            return
+
+        # Find the name of the license to do high level checks.
+        matches = list(EXTRACT_LICENSE.finditer(data))
+        assert matches, f'{page}: unable to find licenses'
+        for match in matches:
+            name = match.group(1)
+            assert name in KNOWN_LICENSES, (
+                f'{page}: {name}: unknown license; please update script')
+
+            # We'll yield the entire preceding header to the license.
+            if name in ATTRIBUTION_LICENSES:
+                # Walk backwards to collect copyrights until we:
+                # (1) Hit the start of the file.
+                # (2) Hit a non-comment line (as all copyrights are comments).
+                # (3) Hit the previous license.
+                header = data[0:match.start(0)]
+                lines = []
+                for line in reversed(header.splitlines()):
+                    if not line_iscomment(line) or '%%%LICENSE_' in line:
+                        break
+                    lines.insert(0, line[3:].strip())
+                assert len(lines) > 1, header
+                # Trim a weird leading line pending upstream cleanup.
+                if lines[0] == 't':
+                    lines.pop(0)
+                copyright_text = '\n'.join(lines).strip()
+
+                # Format the license text.
+                lines = [x[3:].strip()
+                         for x in match.group(2).strip().splitlines()]
+                license_text = '\n'.join(lines).strip()
+
+                yield f'{page.name}\n{copyright_text}\n\n{license_text}\n'
+                break
+
+
+def find_licenses(srcdir):
+    """Walk |srcdir| looking for man page licenses."""
+    for page in srcdir.glob('man[0-9]/*.[0-9]'):
+        yield from extract_license(page)
+
+
+def get_parser():
+    """Get CLI parser."""
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument('-o', '--output', type=Path,
+                        help='File to write combined license to.')
+    parser.add_argument('-d', '--srcdir', type=Path,
+                        default=os.environ.get('S'),
+                        help='Source dir to walk (e.g. $S)')
+    return parser
+
+
+def main(argv):
+    """The main entry point for scripts."""
+    parser = get_parser()
+    opts = parser.parse_args(argv)
+
+    if not opts.srcdir:
+        parser.error('--srcdir is required')
+    if not opts.srcdir.is_dir():
+        parser.error(f'{opts.srcdir}: --srcdir does not exist')
+
+    licenses = find_licenses(opts.srcdir)
+    data = '\n'.join(licenses)
+    if opts.output:
+        with open(opts.output, 'w', encoding='utf-8') as fp:
+            fp.write(data)
+    else:
+        print(data, end='')
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))
diff --git a/sys-apps/man-pages/man-pages.bashrc b/sys-apps/man-pages/man-pages.bashrc
new file mode 100644
index 0000000..d16fd37
--- /dev/null
+++ b/sys-apps/man-pages/man-pages.bashrc
@@ -0,0 +1,7 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+cros_post_src_install_license() {
+	"${BASHRC_FILESDIR}"/extract-licenses.py -d "${S}" -o "${S}/LICENSE" || die
+}
diff --git a/sys-apps/mimo-updater/mimo-updater-0.0.1-r20.ebuild b/sys-apps/mimo-updater/mimo-updater-0.0.1-r20.ebuild
deleted file mode 100644
index 5eee226..0000000
--- a/sys-apps/mimo-updater/mimo-updater-0.0.1-r20.ebuild
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="318347ee98598f39cf67ac8af053e967ecc909a2"
-CROS_WORKON_TREE="60c768301740879a62897326ce63172e91540788"
-CROS_WORKON_PROJECT="chromiumos/third_party/mimo-updater"
-
-inherit cros-debug cros-workon libchrome udev user
-
-DESCRIPTION="A tool to interact with a Mimo device from Chromium OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/mimo-updater"
-
-LICENSE="BSD-Google"
-KEYWORDS="*"
-
-DEPEND="
-	chromeos-base/libbrillo:=
-	virtual/libusb:1
-	virtual/libudev:0="
-
-RDEPEND="${DEPEND}"
-
-src_configure() {
-	# See crbug/1078297
-	cros-debug-add-NDEBUG
-	default
-}
-
-src_install() {
-	dosbin mimo-updater
-	udev_dorules conf/90-displaylink-usb.rules
-}
-
-pkg_preinst() {
-	enewuser cfm-firmware-updaters
-	enewgroup cfm-firmware-updaters
-}
diff --git a/sys-apps/mimo-updater/mimo-updater-0.0.1-r23.ebuild b/sys-apps/mimo-updater/mimo-updater-0.0.1-r23.ebuild
new file mode 100644
index 0000000..ca5a879
--- /dev/null
+++ b/sys-apps/mimo-updater/mimo-updater-0.0.1-r23.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="a74f1018eae01031c000fe6bc7fdb069cc1551f5"
+CROS_WORKON_TREE="3c149685d54c9ec9d673019e52eaf46237e13c1f"
+CROS_WORKON_PROJECT="chromiumos/third_party/mimo-updater"
+
+inherit cros-debug cros-workon libchrome udev user
+
+DESCRIPTION="A tool to interact with a Mimo device from Chromium OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/mimo-updater"
+
+LICENSE="BSD-Google"
+KEYWORDS="*"
+
+DEPEND="
+	chromeos-base/libbrillo:=
+	virtual/libusb:1
+	virtual/libudev:0="
+
+RDEPEND="${DEPEND}"
+
+src_configure() {
+	# See crbug/1078297
+	cros-debug-add-NDEBUG
+	default
+}
+
+src_install() {
+	dosbin mimo-updater
+	udev_dorules conf/90-displaylink-usb.rules
+}
+
+pkg_preinst() {
+	enewuser cfm-firmware-updaters
+	enewgroup cfm-firmware-updaters
+}
diff --git a/sys-apps/mosys/mosys-1.2.3-r1137.ebuild b/sys-apps/mosys/mosys-1.2.3-r1137.ebuild
deleted file mode 100644
index a5e070b..0000000
--- a/sys-apps/mosys/mosys-1.2.3-r1137.ebuild
+++ /dev/null
@@ -1,110 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CROS_WORKON_COMMIT=("e0111498f44234609ad36837d4395ddc7d112ddf" "eff5277a2445e2078a94aeeb73450b713c496c64")
-CROS_WORKON_TREE=("eec5ce9cfadd268344b02efdbec7465fbc391a9e" "a33168fa557115c13e015436ab410a6f2038cb5e")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform2"
-	"chromiumos/platform/mosys"
-)
-CROS_WORKON_LOCALNAME=(
-	"../platform2"
-	"../platform/mosys"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}/platform2"
-	"${S}/platform/mosys"
-)
-CROS_WORKON_INCREMENTAL_BUILD=1
-CROS_WORKON_SUBTREE=(
-	"common-mk"
-	""
-)
-
-MESON_AUTO_DEPEND=no
-
-WANT_LIBCHROME="no"
-WANT_LIBBRILLO="no"
-
-inherit meson flag-o-matic toolchain-funcs cros-unibuild cros-workon platform
-
-DESCRIPTION="Utility for obtaining various bits of low-level system info"
-HOMEPAGE="http://mosys.googlecode.com/"
-
-LICENSE="BSD-Google BSD Apache-2.0 MIT ISC Unlicense"
-SLOT="0"
-KEYWORDS="*"
-IUSE="generated_cros_config unibuild"
-
-RDEPEND="unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	dev-util/cmocka
-	>=sys-apps/flashmap-0.3-r4
-	chromeos-base/minijail"
-DEPEND="${RDEPEND}"
-
-src_unpack() {
-	cros-workon_src_unpack
-	PLATFORM_TOOLDIR="${S}/platform2/common-mk"
-	S+="/platform/mosys"
-}
-
-src_configure() {
-	local platform_intf=""
-	local emesonargs=(
-		$(meson_use unibuild use_cros_config)
-		-Darch=$(tc-arch)
-	)
-
-	if use unibuild; then
-		emesonargs+=(
-			"-Dcros_config_data_src=${SYSROOT}${UNIBOARD_C_CONFIG}"
-		)
-		platform_intf="$(cros_config_host get-mosys-platform)"
-	else
-		# TODO(jrosenth): hard code some board to platform_intf
-		# mappings here for legacy non-unibuild boards.  For now, this
-		# feature is unibuild only.
-		true
-	fi
-
-	if [[ -n "${platform_intf}" ]]; then
-		emesonargs+=(
-			"-Dplatform_intf=${platform_intf}"
-		)
-	fi
-
-	# Necessary to enable LTO.  See crbug.com/1082378.
-	append-ldflags "-O2"
-
-	meson_src_configure
-}
-
-src_compile() {
-	meson_src_compile
-}
-
-platform_pkg_test() {
-	local tests=(
-		file_unittest
-		math_unittest
-		platform_unittest
-	)
-	local test_bin
-	for test_bin in "${tests[@]}"; do
-		platform_test "run" \
-			"${BUILD_DIR}/unittests/${test_bin}"
-	done
-}
-
-src_install() {
-	dosbin "${BUILD_DIR}/mains/mosys"
-
-	insinto /usr/share/policy
-	newins "seccomp/mosys-seccomp-${ARCH}.policy" mosys-seccomp.policy
-	dodoc README
-}
diff --git a/sys-apps/mosys/mosys-1.2.3-r1191.ebuild b/sys-apps/mosys/mosys-1.2.3-r1191.ebuild
new file mode 100644
index 0000000..a2bce91
--- /dev/null
+++ b/sys-apps/mosys/mosys-1.2.3-r1191.ebuild
@@ -0,0 +1,108 @@
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("3fafe7ee134e9462d8c9d737ea15a9ae0be2e995" "86b1883d7b68ca065964457eb47aa5b711c3d2e7")
+CROS_WORKON_TREE=("aa81756947ecfdd38b22f42eed8eeafa40431079" "be908cdbeaf55ea1123b9d4b6ab3a8187edb52d7")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform2"
+	"chromiumos/platform/mosys"
+)
+CROS_WORKON_LOCALNAME=(
+	"../platform2"
+	"../platform/mosys"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}/platform2"
+	"${S}/platform/mosys"
+)
+CROS_WORKON_INCREMENTAL_BUILD=1
+CROS_WORKON_SUBTREE=(
+	"common-mk"
+	""
+)
+
+WANT_LIBCHROME="no"
+WANT_LIBBRILLO="no"
+
+inherit meson flag-o-matic toolchain-funcs cros-unibuild cros-workon platform
+
+DESCRIPTION="Utility for obtaining various bits of low-level system info"
+HOMEPAGE="http://mosys.googlecode.com/"
+
+LICENSE="BSD-Google BSD Apache-2.0 MIT ISC Unlicense"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE="generated_cros_config unibuild"
+
+RDEPEND="unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	dev-util/cmocka
+	>=sys-apps/flashmap-0.3-r4
+	chromeos-base/minijail"
+DEPEND="${RDEPEND}"
+
+src_unpack() {
+	cros-workon_src_unpack
+	PLATFORM_TOOLDIR="${S}/platform2/common-mk"
+	S+="/platform/mosys"
+}
+
+src_configure() {
+	local platform_intf=""
+	local emesonargs=(
+		$(meson_use unibuild use_cros_config)
+		-Darch=$(tc-arch)
+	)
+
+	if use unibuild; then
+		emesonargs+=(
+			"-Dcros_config_data_src=${SYSROOT}${UNIBOARD_C_CONFIG}"
+		)
+		platform_intf="$(cros_config_host get-mosys-platform)"
+	else
+		# TODO(jrosenth): hard code some board to platform_intf
+		# mappings here for legacy non-unibuild boards.  For now, this
+		# feature is unibuild only.
+		true
+	fi
+
+	if [[ -n "${platform_intf}" ]]; then
+		emesonargs+=(
+			"-Dplatform_intf=${platform_intf}"
+		)
+	fi
+
+	# Necessary to enable LTO.  See crbug.com/1082378.
+	append-ldflags "-O2"
+
+	meson_src_configure
+}
+
+src_compile() {
+	meson_src_compile
+}
+
+platform_pkg_test() {
+	local tests=(
+		file_unittest
+		math_unittest
+		platform_unittest
+	)
+	local test_bin
+	for test_bin in "${tests[@]}"; do
+		platform_test "run" \
+			"${BUILD_DIR}/unittests/${test_bin}"
+	done
+}
+
+src_install() {
+	dosbin "${BUILD_DIR}/mains/mosys"
+
+	insinto /usr/share/policy
+	newins "seccomp/mosys-seccomp-${ARCH}.policy" mosys-seccomp.policy
+	dodoc README
+}
diff --git a/sys-apps/mosys/mosys-9999.ebuild b/sys-apps/mosys/mosys-9999.ebuild
index 9a07a3d..2a10c1c 100644
--- a/sys-apps/mosys/mosys-9999.ebuild
+++ b/sys-apps/mosys/mosys-9999.ebuild
@@ -1,7 +1,7 @@
 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI=7
 
 CROS_WORKON_PROJECT=(
 	"chromiumos/platform2"
@@ -21,8 +21,6 @@
 	""
 )
 
-MESON_AUTO_DEPEND=no
-
 WANT_LIBCHROME="no"
 WANT_LIBBRILLO="no"
 
@@ -32,7 +30,7 @@
 HOMEPAGE="http://mosys.googlecode.com/"
 
 LICENSE="BSD-Google BSD Apache-2.0 MIT ISC Unlicense"
-SLOT="0"
+SLOT="0/0"
 KEYWORDS="~*"
 IUSE="generated_cros_config unibuild"
 
diff --git a/sys-apps/portage/portage-2.3.75-r50.ebuild b/sys-apps/portage/portage-2.3.75-r50.ebuild
deleted file mode 100644
index b905873..0000000
--- a/sys-apps/portage/portage-2.3.75-r50.ebuild
+++ /dev/null
@@ -1,274 +0,0 @@
-# Copyright 1999-2018 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-CROS_WORKON_COMMIT="0e1f3adafd56a94cbf3b0aa63b150eb5a64f2ca1"
-CROS_WORKON_TREE="9e1e829a872a71f5eb7281b750207baefd157118"
-PYTHON_COMPAT=(
-	pypy
-	python3_4 python3_5 python3_6 python3_7
-	python2_7
-)
-PYTHON_REQ_USE='bzip2(+),threads(+)'
-
-inherit distutils-r1 systemd
-
-CROS_WORKON_PROJECT="chromiumos/third_party/portage_tool"
-CROS_WORKON_LOCALNAME="portage_tool"
-inherit cros-workon
-
-DESCRIPTION="Portage is the package management and distribution system for Gentoo"
-HOMEPAGE="https://wiki.gentoo.org/wiki/Project:Portage"
-
-LICENSE="GPL-2"
-KEYWORDS="*"
-SLOT="0"
-IUSE="build doc epydoc gentoo-dev +ipc +native-extensions -rsync-verify selinux xattr"
-
-DEPEND="!build? ( $(python_gen_impl_dep 'ssl(+)') )
-	>=app-arch/tar-1.27
-	dev-lang/python-exec:2
-	>=sys-apps/sed-4.0.5 sys-devel/patch
-	doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 )
-	epydoc? ( >=dev-python/epydoc-2.0[$(python_gen_usedep 'python2*')] )"
-# Require sandbox-2.2 for bug #288863.
-# For xattr, we can spawn getfattr and setfattr from sys-apps/attr, but that's
-# quite slow, so it's not considered in the dependencies as an alternative to
-# to python-3.3 / pyxattr. Also, xattr support is only tested with Linux, so
-# for now, don't pull in xattr deps for other kernels.
-# For whirlpool hash, require python[ssl] (bug #425046).
-# For compgen, require bash[readline] (bug #445576).
-# app-portage/gemato goes without PYTHON_USEDEP since we're calling
-# the executable.
-RDEPEND="
-	>=app-arch/tar-1.27
-	dev-lang/python-exec:2
-	!build? (
-		>=sys-apps/sed-4.0.5
-		app-shells/bash:0[readline]
-		>=app-admin/eselect-1.2
-		$(python_gen_cond_dep 'dev-python/pyblake2[${PYTHON_USEDEP}]' \
-			python{2_7,3_4,3_5} pypy)
-		rsync-verify? (
-			>=app-portage/gemato-14[${PYTHON_USEDEP}]
-			>=app-crypt/openpgp-keys-gentoo-release-20180706
-			>=app-crypt/gnupg-2.2.4-r2[ssl(-)]
-		)
-	)
-	elibc_FreeBSD? ( sys-freebsd/freebsd-bin )
-	elibc_glibc? ( >=sys-apps/sandbox-2.2 )
-	elibc_musl? ( >=sys-apps/sandbox-2.2 )
-	elibc_uclibc? ( >=sys-apps/sandbox-2.2 )
-	>=app-misc/pax-utils-0.1.17
-	selinux? ( >=sys-libs/libselinux-2.0.94[python,${PYTHON_USEDEP}] )
-	xattr? ( kernel_linux? (
-		>=sys-apps/install-xattr-0.3
-		$(python_gen_cond_dep 'dev-python/pyxattr[${PYTHON_USEDEP}]' \
-			python2_7 pypy)
-	) )
-	!<app-portage/gentoolkit-0.3.0.8-r4
-	!<app-admin/logrotate-3.8.0
-	!<app-portage/repoman-2.3.10"
-PDEPEND="
-	!build? (
-		>=net-misc/rsync-2.6.4
-		userland_GNU? ( >=sys-apps/coreutils-6.4 )
-	)"
-# coreutils-6.4 rdep is for date format in emerge-webrsync #164532
-# NOTE: FEATURES=installsources requires debugedit and rsync
-
-REQUIRED_USE="epydoc? ( $(python_gen_useflags 'python2*') )"
-
-SRC_ARCHIVES="https://dev.gentoo.org/~zmedico/portage/archives"
-
-prefix_src_archives() {
-	local x y
-	for x in ${@}; do
-		for y in ${SRC_ARCHIVES}; do
-			echo ${y}/${x}
-		done
-	done
-}
-
-TARBALL_PV=${PV}
-SRC_URI="mirror://gentoo/${PN}-${TARBALL_PV}.tar.bz2
-	$(prefix_src_archives ${PN}-${TARBALL_PV}.tar.bz2)"
-
-# Disable for CrOS.
-SRC_URI=""
-
-pkg_setup() {
-	use epydoc && DISTUTILS_ALL_SUBPHASE_IMPLS=( python2.7 )
-}
-
-python_prepare_all() {
-	distutils-r1_python_prepare_all
-
-	if use gentoo-dev; then
-		einfo "Disabling --dynamic-deps by default for gentoo-dev..."
-		sed -e 's:\("--dynamic-deps", \)\("y"\):\1"n":' \
-			-i lib/_emerge/create_depgraph_params.py || \
-			die "failed to patch create_depgraph_params.py"
-
-		einfo "Enabling additional FEATURES for gentoo-dev..."
-		echo 'FEATURES="${FEATURES} ipc-sandbox network-sandbox strict-keepdir"' \
-			>> cnf/make.globals || die
-	fi
-
-	if use native-extensions; then
-		printf "[build_ext]\nportage-ext-modules=true\n" >> \
-			setup.cfg || die
-	fi
-
-	if ! use ipc ; then
-		einfo "Disabling ipc..."
-		sed -e "s:_enable_ipc_daemon = True:_enable_ipc_daemon = False:" \
-			-i lib/_emerge/AbstractEbuildProcess.py || \
-			die "failed to patch AbstractEbuildProcess.py"
-	fi
-
-	if use xattr && use kernel_linux ; then
-		einfo "Adding FEATURES=xattr to make.globals ..."
-		echo -e '\nFEATURES="${FEATURES} xattr"' >> cnf/make.globals \
-			|| die "failed to append to make.globals"
-	fi
-
-	if use build || ! use rsync-verify; then
-		sed -e '/^sync-rsync-verify-metamanifest/s|yes|no|' \
-			-i cnf/repos.conf || die "sed failed"
-	fi
-
-	if [[ -n ${EPREFIX} ]] ; then
-		einfo "Setting portage.const.EPREFIX ..."
-		sed -e "s|^\(SANDBOX_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/sandbox\"\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(FAKEROOT_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/fakeroot\"\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(BASH_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/bash\"\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(MOVE_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/mv\"\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(PRELINK_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/sbin/prelink\"\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(EPREFIX[[:space:]]*=[[:space:]]*\"\).*|\\1${EPREFIX}\"|" \
-			-i lib/portage/const.py || \
-			die "Failed to patch portage.const.EPREFIX"
-
-		einfo "Prefixing shebangs ..."
-		while read -r -d $'\0' ; do
-			local shebang=$(head -n1 "$REPLY")
-			if [[ ${shebang} == "#!"* && ! ${shebang} == "#!${EPREFIX}/"* ]] ; then
-				sed -i -e "1s:.*:#!${EPREFIX}${shebang:2}:" "$REPLY" || \
-					die "sed failed"
-			fi
-		done < <(find . -type f -print0)
-
-		einfo "Adjusting make.globals ..."
-		sed -e "s|\(/usr/portage\)|${EPREFIX}\\1|" \
-			-e "s|^\(PORTAGE_TMPDIR=\"\)\(/var/tmp\"\)|\\1${EPREFIX}\\2|" \
-			-i cnf/make.globals || die "sed failed"
-
-		einfo "Adjusting repos.conf ..."
-		sed -e "s|^\(location = \)\(/usr/portage\)|\\1${EPREFIX}\\2|" \
-			-e "s|^\(sync-openpgp-key-path = \)\(.*\)|\\1${EPREFIX}\\2|" \
-			-i cnf/repos.conf || die "sed failed"
-		if use prefix-guest ; then
-			sed -e "s|^\(main-repo = \).*|\\1gentoo_prefix|" \
-				-e "s|^\\[gentoo\\]|[gentoo_prefix]|" \
-				-e "s|^\(sync-uri = \).*|\\1rsync://rsync.prefix.bitzolder.nl/gentoo-portage-prefix|" \
-				-i cnf/repos.conf || die "sed failed"
-		fi
-
-		einfo "Adding FEATURES=force-prefix to make.globals ..."
-		echo -e '\nFEATURES="${FEATURES} force-prefix"' >> cnf/make.globals \
-			|| die "failed to append to make.globals"
-	fi
-
-	cd "${S}/cnf" || die
-	if [ -f "make.conf.example.${ARCH}".diff ]; then
-		patch make.conf.example "make.conf.example.${ARCH}".diff || \
-			die "Failed to patch make.conf.example"
-	else
-		eerror ""
-		eerror "Portage does not have an arch-specific configuration for this arch."
-		eerror "Please notify the arch maintainer about this issue. Using generic."
-		eerror ""
-	fi
-}
-
-python_compile_all() {
-	local targets=()
-	use doc && targets+=( docbook )
-	use epydoc && targets+=( epydoc )
-
-	if [[ ${targets[@]} ]]; then
-		esetup.py "${targets[@]}"
-	fi
-}
-
-python_test() {
-	esetup.py test
-}
-
-python_install() {
-	# Install sbin scripts to bindir for python-exec linking
-	# they will be relocated in pkg_preinst()
-	distutils-r1_python_install \
-		--system-prefix="${EPREFIX}/usr" \
-		--bindir="$(python_get_scriptdir)" \
-		--docdir="${EPREFIX}/usr/share/doc/${PF}" \
-		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html" \
-		--portage-bindir="${EPREFIX}/usr/lib/portage/${EPYTHON}" \
-		--sbindir="$(python_get_scriptdir)" \
-		--sysconfdir="${EPREFIX}/etc" \
-		"${@}"
-}
-
-python_install_all() {
-	distutils-r1_python_install_all
-
-	local targets=()
-	use doc && targets+=(
-		install_docbook
-		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html"
-	)
-	use epydoc && targets+=(
-		install_epydoc
-		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html"
-	)
-
-	# install docs
-	if [[ ${targets[@]} ]]; then
-		esetup.py "${targets[@]}"
-	fi
-
-	systemd_dotmpfilesd "${FILESDIR}"/portage-ccache.conf
-
-	# Due to distutils/python-exec limitations
-	# these must be installed to /usr/bin.
-	local sbin_relocations='archive-conf dispatch-conf emaint env-update etc-update fixpackages regenworld'
-	einfo "Moving admin scripts to the correct directory"
-	dodir /usr/sbin
-	for target in ${sbin_relocations}; do
-		einfo "Moving /usr/bin/${target} to /usr/sbin/${target}"
-		mv "${ED}usr/bin/${target}" "${ED}usr/sbin/${target}" || die "sbin scripts move failed!"
-	done
-}
-
-pkg_preinst() {
-	# comment out sanity test until it is fixed to work
-	# with the new PORTAGE_PYM_PATH
-	#if [[ $ROOT == / ]] ; then
-		## Run some minimal tests as a sanity check.
-		#local test_runner=$(find "${ED}" -name runTests)
-		#if [[ -n $test_runner && -x $test_runner ]] ; then
-			#einfo "Running preinst sanity tests..."
-			#"$test_runner" || die "preinst sanity tests failed"
-		#fi
-	#fi
-
-	# elog dir must exist to avoid logrotate error for bug #415911.
-	# This code runs in preinst in order to bypass the mapping of
-	# portage:portage to root:root which happens after src_install.
-	keepdir /var/log/portage/elog
-	# This is allowed to fail if the user/group are invalid for prefix users.
-	if chown portage:portage "${ED}"var/log/portage{,/elog} 2>/dev/null ; then
-		chmod g+s,ug+rwx "${ED}"var/log/portage{,/elog}
-	fi
-}
diff --git a/sys-apps/portage/portage-2.3.75-r56.ebuild b/sys-apps/portage/portage-2.3.75-r56.ebuild
new file mode 100644
index 0000000..ac593ff
--- /dev/null
+++ b/sys-apps/portage/portage-2.3.75-r56.ebuild
@@ -0,0 +1,276 @@
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+CROS_WORKON_COMMIT="608edc2b3da1b31929109f9f6f64cf0b6a112c0a"
+CROS_WORKON_TREE="d9b674fa27b8166f180fc6f40238a588593b97cb"
+PYTHON_COMPAT=(
+	pypy
+	python3_4 python3_5 python3_6 python3_7
+	python2_7
+)
+PYTHON_REQ_USE='bzip2(+),threads(+)'
+
+inherit distutils-r1 systemd
+
+CROS_WORKON_PROJECT="chromiumos/third_party/portage_tool"
+CROS_WORKON_LOCALNAME="portage_tool"
+CROS_WORKON_EGIT_BRANCH="chromeos-2.3.75"
+inherit cros-workon
+
+DESCRIPTION="Portage is the package management and distribution system for Gentoo"
+HOMEPAGE="https://wiki.gentoo.org/wiki/Project:Portage"
+
+LICENSE="GPL-2"
+KEYWORDS="*"
+SLOT="0"
+IUSE="build doc epydoc gentoo-dev +ipc +native-extensions -rsync-verify selinux xattr"
+
+DEPEND="!build? ( $(python_gen_impl_dep 'ssl(+)') )
+	>=app-arch/tar-1.27
+	dev-lang/python-exec:2
+	>=sys-apps/sed-4.0.5 sys-devel/patch
+	doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 )
+	epydoc? ( $(python_gen_cond_dep '>=dev-python/epydoc-2.0[${PYTHON_USEDEP}]' \
+		'python2*') )"
+# Require sandbox-2.2 for bug #288863.
+# For xattr, we can spawn getfattr and setfattr from sys-apps/attr, but that's
+# quite slow, so it's not considered in the dependencies as an alternative to
+# to python-3.3 / pyxattr. Also, xattr support is only tested with Linux, so
+# for now, don't pull in xattr deps for other kernels.
+# For whirlpool hash, require python[ssl] (bug #425046).
+# For compgen, require bash[readline] (bug #445576).
+# app-portage/gemato goes without PYTHON_USEDEP since we're calling
+# the executable.
+RDEPEND="
+	>=app-arch/tar-1.27
+	dev-lang/python-exec:2
+	!build? (
+		>=sys-apps/sed-4.0.5
+		app-shells/bash:0[readline]
+		>=app-admin/eselect-1.2
+		$(python_gen_cond_dep 'dev-python/pyblake2[${PYTHON_USEDEP}]' \
+			python{2_7,3_4,3_5} pypy)
+		rsync-verify? (
+			>=app-portage/gemato-14[${PYTHON_USEDEP}]
+			>=app-crypt/openpgp-keys-gentoo-release-20180706
+			>=app-crypt/gnupg-2.2.4-r2[ssl(-)]
+		)
+	)
+	elibc_FreeBSD? ( sys-freebsd/freebsd-bin )
+	elibc_glibc? ( >=sys-apps/sandbox-2.2 )
+	elibc_musl? ( >=sys-apps/sandbox-2.2 )
+	elibc_uclibc? ( >=sys-apps/sandbox-2.2 )
+	>=app-misc/pax-utils-0.1.17
+	selinux? ( >=sys-libs/libselinux-2.0.94[python,${PYTHON_USEDEP}] )
+	xattr? ( kernel_linux? (
+		>=sys-apps/install-xattr-0.3
+		$(python_gen_cond_dep 'dev-python/pyxattr[${PYTHON_USEDEP}]' \
+			python2_7 pypy)
+	) )
+	!<app-portage/gentoolkit-0.3.0.8-r4
+	!<app-admin/logrotate-3.8.0
+	!<app-portage/repoman-2.3.10"
+PDEPEND="
+	!build? (
+		>=net-misc/rsync-2.6.4
+		userland_GNU? ( >=sys-apps/coreutils-6.4 )
+	)"
+# coreutils-6.4 rdep is for date format in emerge-webrsync #164532
+# NOTE: FEATURES=installsources requires debugedit and rsync
+
+REQUIRED_USE="epydoc? ( $(python_gen_useflags 'python2*') )"
+
+SRC_ARCHIVES="https://dev.gentoo.org/~zmedico/portage/archives"
+
+prefix_src_archives() {
+	local x y
+	for x in ${@}; do
+		for y in ${SRC_ARCHIVES}; do
+			echo ${y}/${x}
+		done
+	done
+}
+
+TARBALL_PV=${PV}
+SRC_URI="mirror://gentoo/${PN}-${TARBALL_PV}.tar.bz2
+	$(prefix_src_archives ${PN}-${TARBALL_PV}.tar.bz2)"
+
+# Disable for CrOS.
+SRC_URI=""
+
+pkg_setup() {
+	use epydoc && DISTUTILS_ALL_SUBPHASE_IMPLS=( python2.7 )
+}
+
+python_prepare_all() {
+	distutils-r1_python_prepare_all
+
+	if use gentoo-dev; then
+		einfo "Disabling --dynamic-deps by default for gentoo-dev..."
+		sed -e 's:\("--dynamic-deps", \)\("y"\):\1"n":' \
+			-i lib/_emerge/create_depgraph_params.py || \
+			die "failed to patch create_depgraph_params.py"
+
+		einfo "Enabling additional FEATURES for gentoo-dev..."
+		echo 'FEATURES="${FEATURES} ipc-sandbox network-sandbox strict-keepdir"' \
+			>> cnf/make.globals || die
+	fi
+
+	if use native-extensions; then
+		printf "[build_ext]\nportage-ext-modules=true\n" >> \
+			setup.cfg || die
+	fi
+
+	if ! use ipc ; then
+		einfo "Disabling ipc..."
+		sed -e "s:_enable_ipc_daemon = True:_enable_ipc_daemon = False:" \
+			-i lib/_emerge/AbstractEbuildProcess.py || \
+			die "failed to patch AbstractEbuildProcess.py"
+	fi
+
+	if use xattr && use kernel_linux ; then
+		einfo "Adding FEATURES=xattr to make.globals ..."
+		echo -e '\nFEATURES="${FEATURES} xattr"' >> cnf/make.globals \
+			|| die "failed to append to make.globals"
+	fi
+
+	if use build || ! use rsync-verify; then
+		sed -e '/^sync-rsync-verify-metamanifest/s|yes|no|' \
+			-i cnf/repos.conf || die "sed failed"
+	fi
+
+	if [[ -n ${EPREFIX} ]] ; then
+		einfo "Setting portage.const.EPREFIX ..."
+		sed -e "s|^\(SANDBOX_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/sandbox\"\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(FAKEROOT_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/bin/fakeroot\"\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(BASH_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/bash\"\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(MOVE_BINARY[[:space:]]*=[[:space:]]*\"\)\(/bin/mv\"\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(PRELINK_BINARY[[:space:]]*=[[:space:]]*\"\)\(/usr/sbin/prelink\"\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(EPREFIX[[:space:]]*=[[:space:]]*\"\).*|\\1${EPREFIX}\"|" \
+			-i lib/portage/const.py || \
+			die "Failed to patch portage.const.EPREFIX"
+
+		einfo "Prefixing shebangs ..."
+		while read -r -d $'\0' ; do
+			local shebang=$(head -n1 "$REPLY")
+			if [[ ${shebang} == "#!"* && ! ${shebang} == "#!${EPREFIX}/"* ]] ; then
+				sed -i -e "1s:.*:#!${EPREFIX}${shebang:2}:" "$REPLY" || \
+					die "sed failed"
+			fi
+		done < <(find . -type f -print0)
+
+		einfo "Adjusting make.globals ..."
+		sed -e "s|\(/usr/portage\)|${EPREFIX}\\1|" \
+			-e "s|^\(PORTAGE_TMPDIR=\"\)\(/var/tmp\"\)|\\1${EPREFIX}\\2|" \
+			-i cnf/make.globals || die "sed failed"
+
+		einfo "Adjusting repos.conf ..."
+		sed -e "s|^\(location = \)\(/usr/portage\)|\\1${EPREFIX}\\2|" \
+			-e "s|^\(sync-openpgp-key-path = \)\(.*\)|\\1${EPREFIX}\\2|" \
+			-i cnf/repos.conf || die "sed failed"
+		if use prefix-guest ; then
+			sed -e "s|^\(main-repo = \).*|\\1gentoo_prefix|" \
+				-e "s|^\\[gentoo\\]|[gentoo_prefix]|" \
+				-e "s|^\(sync-uri = \).*|\\1rsync://rsync.prefix.bitzolder.nl/gentoo-portage-prefix|" \
+				-i cnf/repos.conf || die "sed failed"
+		fi
+
+		einfo "Adding FEATURES=force-prefix to make.globals ..."
+		echo -e '\nFEATURES="${FEATURES} force-prefix"' >> cnf/make.globals \
+			|| die "failed to append to make.globals"
+	fi
+
+	cd "${S}/cnf" || die
+	if [ -f "make.conf.example.${ARCH}".diff ]; then
+		patch make.conf.example "make.conf.example.${ARCH}".diff || \
+			die "Failed to patch make.conf.example"
+	else
+		eerror ""
+		eerror "Portage does not have an arch-specific configuration for this arch."
+		eerror "Please notify the arch maintainer about this issue. Using generic."
+		eerror ""
+	fi
+}
+
+python_compile_all() {
+	local targets=()
+	use doc && targets+=( docbook )
+	use epydoc && targets+=( epydoc )
+
+	if [[ ${targets[@]} ]]; then
+		esetup.py "${targets[@]}"
+	fi
+}
+
+python_test() {
+	esetup.py test
+}
+
+python_install() {
+	# Install sbin scripts to bindir for python-exec linking
+	# they will be relocated in pkg_preinst()
+	distutils-r1_python_install \
+		--system-prefix="${EPREFIX}/usr" \
+		--bindir="$(python_get_scriptdir)" \
+		--docdir="${EPREFIX}/usr/share/doc/${PF}" \
+		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html" \
+		--portage-bindir="${EPREFIX}/usr/lib/portage/${EPYTHON}" \
+		--sbindir="$(python_get_scriptdir)" \
+		--sysconfdir="${EPREFIX}/etc" \
+		"${@}"
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	local targets=()
+	use doc && targets+=(
+		install_docbook
+		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html"
+	)
+	use epydoc && targets+=(
+		install_epydoc
+		--htmldir="${EPREFIX}/usr/share/doc/${PF}/html"
+	)
+
+	# install docs
+	if [[ ${targets[@]} ]]; then
+		esetup.py "${targets[@]}"
+	fi
+
+	systemd_dotmpfilesd "${FILESDIR}"/portage-ccache.conf
+
+	# Due to distutils/python-exec limitations
+	# these must be installed to /usr/bin.
+	local sbin_relocations='archive-conf dispatch-conf emaint env-update etc-update fixpackages regenworld'
+	einfo "Moving admin scripts to the correct directory"
+	dodir /usr/sbin
+	for target in ${sbin_relocations}; do
+		einfo "Moving /usr/bin/${target} to /usr/sbin/${target}"
+		mv "${ED}usr/bin/${target}" "${ED}usr/sbin/${target}" || die "sbin scripts move failed!"
+	done
+}
+
+pkg_preinst() {
+	# comment out sanity test until it is fixed to work
+	# with the new PORTAGE_PYM_PATH
+	#if [[ $ROOT == / ]] ; then
+		## Run some minimal tests as a sanity check.
+		#local test_runner=$(find "${ED}" -name runTests)
+		#if [[ -n $test_runner && -x $test_runner ]] ; then
+			#einfo "Running preinst sanity tests..."
+			#"$test_runner" || die "preinst sanity tests failed"
+		#fi
+	#fi
+
+	# elog dir must exist to avoid logrotate error for bug #415911.
+	# This code runs in preinst in order to bypass the mapping of
+	# portage:portage to root:root which happens after src_install.
+	keepdir /var/log/portage/elog
+	# This is allowed to fail if the user/group are invalid for prefix users.
+	if chown portage:portage "${ED}"var/log/portage{,/elog} 2>/dev/null ; then
+		chmod g+s,ug+rwx "${ED}"var/log/portage{,/elog}
+	fi
+}
diff --git a/sys-apps/portage/portage-9999.ebuild b/sys-apps/portage/portage-9999.ebuild
index a7de95f..6505e0f 100644
--- a/sys-apps/portage/portage-9999.ebuild
+++ b/sys-apps/portage/portage-9999.ebuild
@@ -14,6 +14,7 @@
 
 CROS_WORKON_PROJECT="chromiumos/third_party/portage_tool"
 CROS_WORKON_LOCALNAME="portage_tool"
+CROS_WORKON_EGIT_BRANCH="chromeos-2.3.75"
 inherit cros-workon
 
 DESCRIPTION="Portage is the package management and distribution system for Gentoo"
@@ -29,7 +30,8 @@
 	dev-lang/python-exec:2
 	>=sys-apps/sed-4.0.5 sys-devel/patch
 	doc? ( app-text/xmlto ~app-text/docbook-xml-dtd-4.4 )
-	epydoc? ( >=dev-python/epydoc-2.0[$(python_gen_usedep 'python2*')] )"
+	epydoc? ( $(python_gen_cond_dep '>=dev-python/epydoc-2.0[${PYTHON_USEDEP}]' \
+		'python2*') )"
 # Require sandbox-2.2 for bug #288863.
 # For xattr, we can spawn getfattr and setfattr from sys-apps/attr, but that's
 # quite slow, so it's not considered in the dependencies as an alternative to
diff --git a/sys-apps/restorecon/OWNERS b/sys-apps/restorecon/OWNERS
new file mode 100644
index 0000000..5a77185b8
--- /dev/null
+++ b/sys-apps/restorecon/OWNERS
@@ -0,0 +1 @@
+include /OWNERS.security
diff --git a/sys-apps/ripgrep/Manifest b/sys-apps/ripgrep/Manifest
new file mode 100644
index 0000000..b312b0e
--- /dev/null
+++ b/sys-apps/ripgrep/Manifest
@@ -0,0 +1,57 @@
+DIST aho-corasick-0.7.10.crate 111039 BLAKE2B 69f984dbe528ece5ce4345bc0f39c122507a88e781d7c2d5c9175d1788aeef8d21e0487c7c449e28fbbdaae8203fe68627d23ac0a58d30dc70befd26ac9af32f SHA512 e8a1cb252015435009883662ca23408f1491d8f01461f3a81082feabeeff72ec61beb4f1f3271fc8a87f1379899ecfc38036ac208dca17889f70ddaca2406a9b
+DIST atty-0.2.14.crate 5470 BLAKE2B 2db856a9e898a430258f059aeaf7c844a153293e8856d90ac81f7d91a888c89198768ad5cb09303c23241fe85c560a55148fa56a303651a82b0edb895616bfab SHA512 d7b6c4b9a0f898d91ddbc41a5ee45bbf45d1d269508c8cc87ee3e3990500e41e0ec387afb1f3bc7db55bedac396dd86c6509f4bf9e5148d809c3802edcc5e1d9
+DIST autocfg-1.0.0.crate 12870 BLAKE2B 79e495d53298574afd3b292da7c9c363dcb3ea434fd44258efaf3628e95ebfc731f03083f8a1060272a2a3478a6452cdc41539e2dac08465cc6e6283844bf260 SHA512 451fc63148792ba1952b884170e3481359b01bacca5ec0456f43ca58f8e092b8f81c9764f8b00d4104059ff608089be5858220ee868127c064cc890c767ec3a3
+DIST base64-0.12.1.crate 56378 BLAKE2B 90a948eebbae820ced325055b2d49feebdc3b178a271fa7508356d7e44d9f81f586822b6512169f3c1e9901da491b1728783182796c14e6b2c8c647e57202ed1 SHA512 06c73723c4364ac8bcf4204a943893080d1752dd925a13da800889f486b1ebf97bccae79b7b04cbe758afc95bb1d61464276365d4721689896fa641a8e55b660
+DIST bitflags-1.2.1.crate 16745 BLAKE2B 0fa6d3ce44aad7616d5cd02aad8c1d0b0fed4022650eb43067c4a72e6fc88da05442674fa51826e4858a47c9de233e1ba2229820af094197cd11bb416ceffb2b SHA512 ad89b3798845e23737a620bba581c2ff1ff3e15bac12555c765e201d2c0b90ecea0cdbc5b5b1a3fa9858c385e8e041f8226f5acfae5bbbe9925643fff2bf3f0b
+DIST bstr-0.2.13.crate 345445 BLAKE2B 9a17fa04d55e5d053b115aef2a075b58cab0fb84c574df61eec7c3ab6f06e17d156991b1c070ad357599de5455af78982eecb8632336d53792958800ecafe839 SHA512 f1f778262269dfea6ba1cf953a5177107c2e1e838248a67588283ee11efa81adfa30498c7cfb20422e0955544a07d2a8f86c4eefc78e9f407a92be9591e26fe5
+DIST bytecount-0.6.0.crate 11905 BLAKE2B 7d935f86f0ab82c6c3d4974cd25ec3e193cdbea68b9534b1a461007d1486adc27274b43febd645db045cdd9b8101f93fb4b985ceb076c99a8f6efdc5e69ae855 SHA512 8e675f20b204d5828e79ba50012744b2f1b83f9d5d6355e6acb7d24cc4f7b1080ac120b94e65b6ea1d7604464ea0c6ad4f29880ff14895610889e4396f87062b
+DIST byteorder-1.3.4.crate 21943 BLAKE2B 278b24e036e920f84683f883991a967d997883bc80edefc5b69f52551794a37e5051786a1ac1b7a30bf2f5cad7318d781f189a7b2e496e2743df01262d5c33d6 SHA512 0618ce2cd6f3f6c586201d9aee8c8aaa08f99c9f9f215cf448b3cb6af1ac741845f5279953544caaec7fcf0beec1474bb991bee1ad0c0dac0c3f1d3ddd99e2d9
+DIST cc-1.0.54.crate 51972 BLAKE2B f3760987ea93e71254939a42bc795cfd68b994494c2d5820fbd6bda29e31b3a28d55ed9aaddb35f720b26b1bfc01f3369af81990b68da06a7c46c17eb014636c SHA512 4562c89b52786cd16a66c1970a4005485299ff0c21c61fd22a08fada933e5ecf3fcc1686f6e4f5a8ec4827ac00ed24c1c4ab4931ec5e9a12d2e5c283f6096b77
+DIST cfg-if-0.1.10.crate 7933 BLAKE2B 063a96ed176f34f788666b40adc483d147fc011dee941ab60569ddd0e57502b5dd06ed71090f4e14ce005d06e240500a286f74652615e9d068fba649610d8cf8 SHA512 9d22616bfb4a75770a828a0a3cddac6787297a5fdc53eb17e25811cc94de717f2de8bd66d53c5d65ba1c83d8892aefee5ae758cf56a1ef0a0c3120f70b244339
+DIST clap-2.33.1.crate 201567 BLAKE2B 7bb63b6a243eb33050e5354622fb544ba6db3b859005d857b198af4c3f34dbda22d605326e80a274a12f73fb2c13aea99ec6652584a02d0a3092841f4e119d91 SHA512 31209da6a0ac987f7e1b2504a2fb7738c3aba4ddee4cc2bc22cc37d4d2b0feeff41ece557d4960d51564fd31cb23e413bf180eb60102a872caf623bf55c6f089
+DIST crossbeam-channel-0.4.2.crate 87419 BLAKE2B 721013134069abc8f01ae5e98e1e6f10981d4892881339d3bf87f1bcb58b362348dad92e702a6b2367075dd41d860d62cca0ac8b3691954c454ca70bb5158000 SHA512 19b0ed2b5ed0fb1fe7c809e08483152fc36cf46f465c8571ca0fb9ebb1cb4b2b8f5860a303c932f336f434dafa9776ce6026ea2e64457147fb540766dc6da2ce
+DIST crossbeam-utils-0.7.2.crate 34338 BLAKE2B 3cb287c7741c4d5b0551331634a75b066f07fb4b55fa2b347370506467a05923254b1c4dca667de59ed91ff91f5496b37f40f13d3e9885a1b4f639f5b6748433 SHA512 e375f24c007bcf660d9e297527ed938f678a55696ca7b555b96fee7e0b94c31db2d3f4355675aa0baeadba68b9755ec92dc3a09a37b5db48e3723b926fd4a8f3
+DIST encoding_rs-0.8.23.crate 1403543 BLAKE2B 1ab7da7a4313dc3e0613a077bd9d036e91eec75913cb9b742879eab17e0af7dd76b69d7a17133f0c0c35a1f8c0628058415751105c95b63e2f578e9a57cbb71e SHA512 7036f64c0f26b3d993c1ffb64ccdf95a122ae93a9ef691f9903f90925b222b3aabaf379e951b5e9fc40726a1ed52ba54f3eededbc1e6b68385c99cf2c34d5ba5
+DIST encoding_rs_io-0.1.7.crate 16969 BLAKE2B 8d51835dc0882d0e0512f0a177f10da3a1c384f38cb4eb163f957cc134ef5b7aee65d951cf65c99cc80b087e0e92ca4dae431e3a8987fe6b86bbf0dd1bfa8ef8 SHA512 0c7d33616e96fcdf225599dbf469232d150fa4bef5809346c4003ff7fa0362a1cded8f3392fb5945f4950e2b2cd71b60c93025d73ecfdd2ba4fda5e03a16902c
+DIST fnv-1.0.7.crate 11266 BLAKE2B 81da85889c91b6567e0f555e37dd915f1bd919719d1ca10c31a6861d7aec29a49ae9c1e8bc500791bf9d6b8dbb318c096d04872c5872a4b1f7d45fbd8e12842d SHA512 2195a4b34a78e2dd9838caf0ee556bf87cbb4a8ef5505aac663b614eb59dcfc0c40f432463ede41ecca57bfe7711f72673d39a85fe03d426f1324097d5628334
+DIST fs_extra-1.1.0.crate 29292 BLAKE2B ea1b787484218733a2c107ff059f3e89357afc51c510da0f5f30e4c9289c722a7c810a0a08138673aa454445dfcb08caa986ac64165ac27476d9b709d819308f SHA512 c001a37a23a614f1752a45fbf392694911c8d06bb5af8b8a40f2dcba9c80c67ab634de0dd4fa951007072204b162430fed2c89bbb11ac2fca62dfa5cd4cbd46a
+DIST glob-0.3.0.crate 18724 BLAKE2B 1f1dd380e7d668a0c2cff9134279ebda958b4bccdd4a65ff01f9665b45ec4cce8ffbd47eb46e52cf516c5fd5803561e6bcb60cdee21ddfbb8601a95d45500620 SHA512 87098ffdbc518442995c422120cef71f83069c8f88a1970ecec5105b0f284ddd92bcee929f5c230d5b90ae1ead7e1214c3eea26f4a8b26715a00c1ab8b09bc46
+DIST hermit-abi-0.1.13.crate 9230 BLAKE2B 9591171d6f303a4a462d23edc2f8d493bdc23b6c2da4b464444718bfc89078e5a627e1543b7ab5be9d4e05f16c3508e55642360bb8d2cbd5edc2ce39b28d022e SHA512 ac424683ee3cfff9c63c735ac91008df722a2709d12744f009466574098433677266799e8ca817d3d3cad8f10f3c02e8081c67ff479701eabdc4543c0a79bd25
+DIST itoa-0.4.5.crate 11194 BLAKE2B d8f0e2aaf62152c187e0987ab4b0cf842ac13255262a9ccbf8484d730ea5397572791c023d2363d0562c18c8efd2418680583e99a1f5d14450b3f0184dce69ca SHA512 79ff8774524130a4729d5e708a4a4a837b3e5052384a12c22db4ae3e208dc4391ee185365f685137a8ba55ea7dc3499f8cddddb2fd98b84177ab292c264034d3
+DIST jemalloc-sys-0.3.2.crate 1344660 BLAKE2B c530eed197673dd515b41d504127c6c7abf75bb2dd0063b0a693be9502e3b5ae9db6d97dbf7fdd4bbab626ba1f788bf6b8e6804a476e109f22737bd2a79dcdff SHA512 b718dd98474d16fa5448bba62ac5e18a9e9798f31fce19dbeb4a12526c63e78f306454e0d9e2c6c5a3fd95660bfe82bb5fb09e4091cd8b43706eca2c4872b647
+DIST jemallocator-0.3.2.crate 16393 BLAKE2B 03c190b2f4c6cf01957a4e11d13a230dd55593e1845ae4179b60c62fa28eaed4dd27efb3113039ddab1e66a28c102d4d9c64169d0c10a1945bac162d2f613a79 SHA512 e3fd9d377d6465519e73a91d5639d47bfd6cdf5898d551c49e3efd3269d14a75bb9163980e13ff429e7dc637b8430cdfdb1f5d6ec52993fcf7b6247a69850ac6
+DIST lazy_static-1.4.0.crate 10443 BLAKE2B 25b2e61bbac48f0dcbc79c81d7bf01f2403d8269ecb6be3ea6147bd00f7a588df15a91f44dfc18ada19b21faa71de4637c7d493a8628cbecd0e547d74e616a23 SHA512 e124c0521ec7c950f3c4a066821918da7a9c6e711115d98009ae7c351928fdddead852e7596fea5937a9c30e4e4ce8eee7099b20248b5d6e3b2494b6a6d88cb8
+DIST libc-0.2.71.crate 474209 BLAKE2B e380a6936248992b1b1f63ef0cc3d3de410d414bb19350a2327da3947ae0e8e700e82f0f4a802cc485e37571b3a6a68bd773f964496f572a721294623d135c1c SHA512 b6f6eebc42817107aa2f94d426154c2449a2558646414464a31ee9d9dcf714e641fe6613b95ecf9e751d77102c0cedb74b35ca1f76c6df2231a5bad168de5e16
+DIST log-0.4.8.crate 31297 BLAKE2B 31037fdc2fc94f4ab8a6e89a251b0bc29975027dc7efb7cc86a8e848dfc8e2ae50acdb177b7ba9f7c1f20ec01e50798f89abb772d67a33f1b060ac617cf9a8ab SHA512 0b71f97d5964134b5eea1332347e177806b2f171d0be5c410c0ff1539470b242ba9f0933fafd853e4171a43b5e373a150af18918924be431c7216022553a8a3b
+DIST maybe-uninit-2.0.0.crate 11809 BLAKE2B 5e517b8c59f9ae4f1a4f86b48679ea64d62450ec2519c8caaa914479ce9e5b3aff24707e2e37272ba74bb60499afdc602fff17756337b0c50a9184edbd8b8805 SHA512 3006fc009c7c743d9147a4122e677cdeb2546f7bb46963b2f266839614eb906f9d763c161044fd0bf3f7b54124ac0734ac9ae7f7151b1a7a5f45cbc739976434
+DIST memchr-2.3.3.crate 22566 BLAKE2B f952070b98ef30f0d2780a6efbeb36d295710734f678517d913a8002cafebbd3cfc38975fc4546d306efc11bc815764d14320af3b7a2360bd46fc2ab3db9efa5 SHA512 922e05da920d0d94226857788878ee5e31518cd80d95ae57e1d7ecd233942c37d01565525db2f1dfdfd5b3b1f81b2c73eee058cbfd745cb4e1519518318df248
+DIST memmap-0.7.0.crate 15214 BLAKE2B 44a5bde9b85b2c378fd4c6ebfaa322ef8d0076472d6c7322f7aa95b8aba3514fd5212b4429eb369d30d0327377e36c626de474ea5e1f764bd4fae595680a04f8 SHA512 3a7c7f963111c2afeaa0381aaa6a57f0f57600392693ee1807d54771bc058ea0f86ac6e8afbe858e45f9f17b685430bf256dba1126b8074ace3aafc07bc14bfa
+DIST num_cpus-1.13.0.crate 14704 BLAKE2B e7a26e597ad5e45309393a9500b031ba64a77831320cbb96d7861139a2f7a453b7ba06a3255439b43ac1e2e36269b0a350d514020d3cd82c2513b57934b3ebbc SHA512 e75ec298fa682be84bf4efb6cf40126da9233ef25f07e887c2fa7421ee78790204564e6406c8219466651f47421e27f69eca690bb9cdfc982b644d78cc10de3f
+DIST packed_simd-0.3.3.crate 97485 BLAKE2B 50d9c18099a75d8529ec8687d47b4b04dea280ae75967ad40fb778b39a2303ebc2b835de257072ba3fb6b339524a128f26df8d2106ef82e89d2655177065e7fd SHA512 f0198f5c589be082053ae156372ea826c66e31aad993f64af097faf36045f1d1b6cc4b4b46d9cc8a1c7a28e11f707026df6c419a42e2011b1c4a34f579018826
+DIST pcre2-0.2.3.crate 19605 BLAKE2B 6fcf5f37b5f37d77b5c3568392ac056c0dfc58e16c1d9cdf2f6cb6c2c712619d1ac75d89e1ae49086e9c0c7d9128140ae57cbe065ef0ae21b91e2aec1c2a7249 SHA512 6771b27b800e3eebc34ae5dda48ca8bf60d5c3fd46fb424a669341909491ef476427b23f0aec3ec606aa03ed9606e46daf76010a7b9e3ffe1a76faab3314e74f
+DIST pcre2-sys-0.2.2.crate 2184376 BLAKE2B 7247cfd843a74de8f2486d9e029afdf3eddfae6307983f14ab0d9c48ec487c3eeb710ae0485eab10b5ef200f8e3d8743ac9f151a5f8e07cdf3c67651e73fb1d9 SHA512 cae12d44a43c05b2303f230112f8cce349141a697a0ed7ab8b9acc1a812f8ae8db156dfdcf40eae3b51c143b31cbf842dddcb133eb7e0430ef78cf36906ff652
+DIST pkg-config-0.3.17.crate 14533 BLAKE2B 729b15209bbbee8a6d3854e30a89b3e6041ca3cf7b1460ff6008e37866e326d9ec8b4ac582c125676e31eefa048b143beda33432b95f00a8f51cc7fa33ee4986 SHA512 42be78556adc07dffa8933ab1436d5d6a776018898377d58dfdc9f961981f9f21397301b41536c55d8a3772bf74a38069899d1a5cddce5c24a032017137044bc
+DIST proc-macro2-1.0.17.crate 35654 BLAKE2B 8728993d92facb86d5884a5716f697447d636ba28a3ac84e1ac7971fbe53b7fd960a5516989882eecccde20abfc9f1915c523277333ae98323b7dbc198c0fee6 SHA512 de34066c8f07ad5edaf2a7fb9b0e0e2b4d31e110a2280dce9960b20871cd69c4510ad7669634e734b3d4f06447277b62de028aad826f5a94697261a8bec2a0a9
+DIST quote-1.0.6.crate 24225 BLAKE2B e8706bf2e19b89855d5636704253d674fc9804e0d9713d1c1dccd5fe06af273f8604f80b6727f788de6416e62dde67a13abc2f3aa81cd5ea45eb0c73069ee300 SHA512 1febd6748602d4d96fbacb1f37bbc93c71d9fbeb9be7e9c6be2e871614048a1b2921c1ae702bd8db5d449308e7946ebff095689ef0bafe52af37c04936a8115e
+DIST regex-1.3.9.crate 236683 BLAKE2B 29bd39b138a8168015bb7a6b36bb5f7f9918b7c00bca28a720f3dffd5b805d3374a6648a04792585e85922e099faf547e5d02aeb23008b7802424351633ea23a SHA512 425713d3eeb4132d4056e6c1a08bc2fa5032b9971987c531b5707a9b5670ae15f037bd68921f1545580801957d1ea283eff87e533477364c7f76823800202f74
+DIST regex-automata-0.1.9.crate 114560 BLAKE2B 2bbaeaaa896479c817b7bac2f51108f8f74fda72178068c3b5e599b466899692fba8ff3ce8cd30f1f978a944a0df98f466f3d4bd340bf595d6f7048ba6f648a8 SHA512 53323733dc2f8c47ec33b5b3aefacac3a0042cff80c59c3a05ee02b581671dd9a6ebf6b0b5eeddf9cd249662731cabf5a684553daeff440bf8d1d4d296afbeb0
+DIST regex-syntax-0.6.18.crate 294440 BLAKE2B 355d6a2704e1267064719927269facce1f1c8897566d41e54741183969cde5e56c38d0c0b610b99dea3635de20fa00ebfb8748ceea331af6984198d927a93b73 SHA512 9cd999837890a87d0cc6bc351029a422bd52e5c621763e5c11ae9dcf1ba5edebabcd9e6d70db0b1656072a6109d439101412b3aab0d6ad357ae02ee7039a010e
+DIST ripgrep-12.1.1-x86_64-unknown-linux-musl.tar.gz 2211756 BLAKE2B 1c97a37e109f818bce8e974eb3a29eb8d1ca488e048caff658696211e8cad23728a767a2d6b97fed365d24f9545f1bc49a3e2687ab437eb4189993ad5fe30663 SHA512 814a6aa826f1183f40c5b74e66665b26e1377fe95d8b2cafceffa0b7ebf26ec89a515c74f5dbc2b9af441b2daacd239c7393047d8a75e944e42792ba451a77f9
+DIST ripgrep-12.1.1.tar.gz 480607 BLAKE2B f324a7966641843a95e7d4930507167844db2629e4b12e738df56d43edc68a707fdcc38eaa6f2445e3ddbafd13ec8888543866534b7a04724451e1457f589bba SHA512 9e2a16043be6c7727d49a44f6db7fdb41413efc869139186729985ff86dee5c6531c663352f4019b730eb3a6c46f26d46df3738d4a0cbbc39ab773f320eb9e59
+DIST ryu-1.0.4.crate 42039 BLAKE2B a1cd38c85ff105a0aea5e0cf09aa2be15d07e5344fb4a52b00bcbee6c6f966276aed1163b480b2acf669276368f04217eb7c0a6c279140f34bb54b1802e1ca06 SHA512 a1b28c07b32374757019f93eae30f82ae00682d5e9838f50864dd4ca898b8220b9bdb0f5df55d23d6bfc7386a3ac93697a18c82215f2e946e06c079962123703
+DIST same-file-1.0.6.crate 10183 BLAKE2B a320c8343e0b38078ba81c4f0159d886bf47764c74efe0d7cd2b3218426e8341b51e523c00a9e5fbc2ee1057618296bd70b576c68751bd55d6ddb352defaca15 SHA512 3ba35309742c8db63210d9ea78bff4ecd80471d69e6238eb96c7bf0673814f221e2d838fe6311bfc5a0e71b4a7ccba33e07859c0b9cff2171969ff08a4214a7c
+DIST serde-1.0.110.crate 73947 BLAKE2B ceb9896bd205026825767951c6dd4c11aa5ce485ecded75eeae2f88627f4851c378c311d7ad8d06395f2ed976e342d31e11787ddf926dfeb0643ca0575b32ccf SHA512 508fc3195ba0deb75980a758a4392462068fdde9a87fe2f379ab9b28c573c5af45617b82e5fdd1e34cefa075888da7f533675b05d57757f0c0200b4fa5698863
+DIST serde_derive-1.0.110.crate 49751 BLAKE2B 14f3ffe6d6ce5aed13a800c2802459bca54546d3a77dd05c4c095f10ffabec8e66195cd69994b46162a96bd95fc5fb0d78a08864b7709a8f6c32643183cb90be SHA512 b02a831fced998388a39ad5e8ec12de5c7d09e18b69f15b112870d1e5976f74e0cfcd28a68dbcaef87c4be30001bd2cae076de234a59e8f39ea0be3014a395a5
+DIST serde_json-1.0.53.crate 73130 BLAKE2B 28f118648c77c8ada5a434416ec6b28615d8a9b677da7f34c8ba1104730087ac6d93e010a767199a98208ebe5dbde1203a47f28a2394a3ecb75b3d115a3b27b4 SHA512 8932a9f9f783b7124c7a41c9c3c0c1934c0e5b8b628fc9bab5ae0f78370231649f17de8015f9d6facf4ccd0305c68d8c648799e239bf32558c6be9bbe3819e22
+DIST strsim-0.8.0.crate 9309 BLAKE2B 40a8be506c43ee1ffe006ddc7dee98c3d418bdd205d57b78f5d1e4c9312feb57e1eaf952e02d92d4e0932db240c6fba45beb06ea8c4fc6de1cf1faa8b6a3a939 SHA512 1d55a8d946cd55f5f37d06aea536549ded95739fa58c0f2da285a0041154c181f663682bdcac643aa198b3e762d694a04f058db985c62ebe22b5c16327ba6d34
+DIST syn-1.0.27.crate 202231 BLAKE2B 8fe663765f40cfb611e6eae5d51744adfb22adeb43da799c000b9ba856117631428341ad352608334bd57ac18aad6076e4574591ce7aa7908af90637ee363dc9 SHA512 3a3f2f6e55edf003ce13dfa35c5d1a03d875335ddb3d0093fd20c86231a246a61655e6f74f751a9265a6be18af20e794522b7b83d303ee363b891ac9a89c72ae
+DIST termcolor-1.1.0.crate 17193 BLAKE2B c3a1a80269195f6bc92d141fce0885413c031980a4ad2f0f6e5a9051acfac10bad8a484362bfcaf3a60851a97d930e9602df4c00aec39431ea5a8a20d40a55c2 SHA512 41b05b047cbfdd5e3990eb36f635dc8ccf26a42bd5403d6d14a9f3c341e92b61c3b8d4d5f4fcd29071a97b3d96280ed59b4557b63a769390e2729fc82ab39702
+DIST textwrap-0.11.0.crate 17322 BLAKE2B 257428908342774593bbd3528fcdae710712ff54e8a711393a24356d8ba0e16e466a4b20c05f942c48ca76b3b5b5aaa90ec202f782cad892caa8b71ccf124da6 SHA512 f5c0fe4f28ff1a3a0931e8e235b5157a45f67967985bcc752418c5ec3481fca44a8ae4800088889b37e8cd0533f53d3c456d5ffd19b767b3f83a87b49a2e209a
+DIST thread_local-1.0.1.crate 12609 BLAKE2B 34206b5232262cda9cc0fb970e20f154d43ff1c4477a5ad5ff9200e6d874a6c7b2bcd99a2dae75a984b54574281e049ad35307ace0dd188f44c9a95fa93139cf SHA512 f2bfca4eee32a8fc88a01ff5bf24518c12142228d95916d13aae35ed6addd0b7da2235359f15220049ef197555344ac31a8833775e7a5bd49144db9c54b3165b
+DIST unicode-width-0.1.7.crate 16644 BLAKE2B 8cc5ee2dfeeda8ffe3405a0d4f1576d2b3b8ede1a42cbefb0ba3bd0d71b53a92ceade86c4a06e9d5b31382955dc6e1152ae5cd279dc26dbc51f478dad1d0f64d SHA512 39b8a539c9009d0421f54ae68b139f21456c9cb03d743b58535a977f98bc9655cf42eaacfadbcff796c187a6f315ae16259ee22be9c2da5aa042172c6b464d84
+DIST unicode-xid-0.2.0.crate 14994 BLAKE2B e66b4255798f0ef1c81fb852613fee396a042d780d2158a171dbb5e7dedad0b3d2522f5401ae5d215f89ab8be4f5c371b046e4845693a65554c2a6eedc5d1e28 SHA512 590f727d8d8354023062ae5fe7ac5bed1bcf79d86b883effd7f33b3ea3b1c8922998a63d621ca6962a969e890fa6edd009871f21cd57b1969264f41ba3f78359
+DIST walkdir-2.3.1.crate 23413 BLAKE2B fc9601f4a28cec383297dbd87d422e56db1e989e4273900750f05d1f4a92e114a5b1a5a54368e290c5f4b47159ed51f52d85ce66f003cd2f52ffc737ead20f8b SHA512 ba807ff0d098aabdcd37e23204632beea1dbb7a6adfd16cb1009cae9e7b6957cfeab705cc454bf8f2b62a08743214ab995e43bf46fc510012c938f9e2a434951
+DIST winapi-0.3.8.crate 1128308 BLAKE2B e0e8ef6121f222b0500525192ebb69b26b71cc16f9ba92186f8ad6acc9de4cb8cc7c738f9c31f5bd223d2e34c93c496e8448c973d69797776004670c70abf69c SHA512 5a899ee5f09f30d742b8b8eba78da05cd9f4c664408fdeb9370373f8756a962a23e3f1c07619e745b3270138606c9a369076c02c3f5353f657df09d203d9a736
+DIST winapi-i686-pc-windows-gnu-0.4.0.crate 2918815 BLAKE2B 4d357e4d30f9552972170d65b9a5358b69c46a3e772fe05efc22f3d4ffc1caeeaad7aacdc7abd503a7ad0545f8bd7d22bf351dcb6df76f812fa4d45c34d65df0 SHA512 a672ccefd0730a8166fef1d4e39f9034d9ae426a3f5e28d1f4169fa5c5790767693f281d890e7804773b34acdb0ae1febac33cde8c50c0044a5a6152c7209ec2
+DIST winapi-util-0.1.5.crate 10164 BLAKE2B fc800aceae5249a858c806c3e969ef2545766099872d856ebee51c883d9acf1122278db9607d50ca53eac351502b700fd2463900932d342240f97f683d517963 SHA512 7baeb661f397c4693dfa001fdc774b323c51a7c55caad40f2de5112a1cefd1d6151e3df41fa4ee193460a5905917c83d2b1de5fa10b4bd014ad96690af95c0fd
+DIST winapi-x86_64-pc-windows-gnu-0.4.0.crate 2947998 BLAKE2B 2ad1ea8b5fa07d544e910ccba043ae925269b76b26c9da356305b34b86741dd8b9aff0b9ffe3d562db4fcd7d7c46a11ce9e3168b782b1d89ae6881742b7ede82 SHA512 4a654af6a5d649dc87e00497245096b35a2894ae66f155cb62389902c3b93ddcc5cf7d0d8b9dd97b291d2d80bc686af2298e80abef6ac69883f4a54e79712513
diff --git a/sys-apps/ripgrep/metadata.xml b/sys-apps/ripgrep/metadata.xml
new file mode 100644
index 0000000..73f11257
--- /dev/null
+++ b/sys-apps/ripgrep/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="person">
+		<email>gyakovlev@gentoo.org</email>
+		<name>Georgy Yakovlev</name>
+	</maintainer>
+	<longdescription lang="en">
+		Line-oriented search tool that recursively searches your current directory for a regex pattern while respecting your gitignore rules.
+		ripgrep is similar to other popular search tools like The Silver Searcher, ack and grep.
+	</longdescription>
+	<upstream>
+		<remote-id type="github">BurntSushi/ripgrep</remote-id>
+	</upstream>
+</pkgmetadata>
diff --git a/sys-apps/ripgrep/ripgrep-12.1.1.ebuild b/sys-apps/ripgrep/ripgrep-12.1.1.ebuild
new file mode 100644
index 0000000..88eed1f
--- /dev/null
+++ b/sys-apps/ripgrep/ripgrep-12.1.1.ebuild
@@ -0,0 +1,114 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CRATES="
+aho-corasick-0.7.10
+atty-0.2.14
+autocfg-1.0.0
+base64-0.12.1
+bitflags-1.2.1
+bstr-0.2.13
+bytecount-0.6.0
+byteorder-1.3.4
+cc-1.0.54
+cfg-if-0.1.10
+clap-2.33.1
+crossbeam-channel-0.4.2
+crossbeam-utils-0.7.2
+encoding_rs-0.8.23
+encoding_rs_io-0.1.7
+fnv-1.0.7
+fs_extra-1.1.0
+glob-0.3.0
+hermit-abi-0.1.13
+itoa-0.4.5
+jemallocator-0.3.2
+jemalloc-sys-0.3.2
+lazy_static-1.4.0
+libc-0.2.71
+log-0.4.8
+maybe-uninit-2.0.0
+memchr-2.3.3
+memmap-0.7.0
+num_cpus-1.13.0
+packed_simd-0.3.3
+pcre2-0.2.3
+pcre2-sys-0.2.2
+pkg-config-0.3.17
+proc-macro2-1.0.17
+quote-1.0.6
+regex-1.3.9
+regex-automata-0.1.9
+regex-syntax-0.6.18
+ryu-1.0.4
+same-file-1.0.6
+serde-1.0.110
+serde_derive-1.0.110
+serde_json-1.0.53
+strsim-0.8.0
+syn-1.0.27
+termcolor-1.1.0
+textwrap-0.11.0
+thread_local-1.0.1
+unicode-width-0.1.7
+unicode-xid-0.2.0
+walkdir-2.3.1
+winapi-0.3.8
+winapi-i686-pc-windows-gnu-0.4.0
+winapi-util-0.1.5
+winapi-x86_64-pc-windows-gnu-0.4.0
+"
+
+inherit cargo bash-completion-r1
+
+DESCRIPTION="a search tool that combines the usability of ag with the raw speed of grep"
+HOMEPAGE="https://github.com/BurntSushi/ripgrep"
+SRC_URI="https://github.com/BurntSushi/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz
+	https://github.com/BurntSushi/${PN}/releases/download/${PV}/${P}-x86_64-unknown-linux-musl.tar.gz
+	$(cargo_crate_uris ${CRATES})"
+
+LICENSE="Apache-2.0 BSD-2 Boost-1.0 MIT"
+SLOT="0"
+KEYWORDS="*"
+IUSE="pcre"
+
+DEPEND=""
+
+RDEPEND="pcre? ( dev-libs/libpcre2 )"
+
+BDEPEND="${RDEPEND}
+	virtual/pkgconfig
+"
+
+QA_FLAGS_IGNORED="usr/bin/rg"
+
+src_compile() {
+	# allow building on musl with dynamic linking support
+	# https://github.com/BurntSushi/rust-pcre2/issues/7
+	use elibc_musl && export PCRE2_SYS_STATIC=0
+	cargo_src_compile $(usex pcre "--features pcre2" "")
+}
+
+src_install() {
+	cargo_src_install $(usex pcre "--features pcre2" "")
+
+	# hack to find/install generated files
+	# stamp file can be present in multiple dirs if we build additional features
+	# so grab fist match only
+	local BUILD_DIR="$(dirname $(find target/release -name ripgrep-stamp -print -quit))"
+
+	newbashcomp "${BUILD_DIR}"/rg.bash rg
+
+	insinto /usr/share/fish/vendor_completions.d
+	doins "${BUILD_DIR}"/rg.fish
+
+	insinto /usr/share/zsh/site-functions
+	doins complete/_rg
+
+	dodoc CHANGELOG.md FAQ.md GUIDE.md README.md
+
+	# we use a manpage from pre-compiled tarball, so we can skip dependency on asciidoctor
+	doman "${WORKDIR}/${P}-x86_64-unknown-linux-musl/doc/rg.1"
+}
diff --git a/sys-apps/sis-updater/sis-updater-0.0.1-r21.ebuild b/sys-apps/sis-updater/sis-updater-0.0.1-r21.ebuild
deleted file mode 100644
index f14f957..0000000
--- a/sys-apps/sis-updater/sis-updater-0.0.1-r21.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="f80a71800fbc14d17ac242d64b209620e482a57f"
-CROS_WORKON_TREE="bdfd4bba192eb59900d15306e19dc29768df7b24"
-CROS_WORKON_PROJECT="chromiumos/third_party/sis-updater"
-
-inherit cros-workon cros-common.mk libchrome udev user
-
-DESCRIPTION="A tool to update SiS firmware on Mimo from Chromium OS."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/sis-updater"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-
-DEPEND="chromeos-base/libbrillo:="
-
-RDEPEND="${DEPEND}"
-
-src_install() {
-	dosbin "${OUT}/sis-updater"
-	udev_dorules conf/99-sis-usb.rules
-}
-
-pkg_preinst() {
-	enewuser cfm-firmware-updaters
-	enewgroup cfm-firmware-updaters
-}
diff --git a/sys-apps/sis-updater/sis-updater-0.0.1-r24.ebuild b/sys-apps/sis-updater/sis-updater-0.0.1-r24.ebuild
new file mode 100644
index 0000000..ad24fb2
--- /dev/null
+++ b/sys-apps/sis-updater/sis-updater-0.0.1-r24.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="c0f14404e8270b5987726ea090950ee50db02348"
+CROS_WORKON_TREE="bc2348a4d6692d35c2a9b5cc3e7d8d5cfc5faad9"
+CROS_WORKON_PROJECT="chromiumos/third_party/sis-updater"
+
+inherit cros-workon cros-common.mk libchrome udev user
+
+DESCRIPTION="A tool to update SiS firmware on Mimo from Chromium OS."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/third_party/sis-updater"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+
+DEPEND="chromeos-base/libbrillo:="
+
+RDEPEND="${DEPEND}"
+
+src_install() {
+	dosbin "${OUT}/sis-updater"
+	udev_dorules conf/99-sis-usb.rules
+}
+
+pkg_preinst() {
+	enewuser cfm-firmware-updaters
+	enewgroup cfm-firmware-updaters
+}
diff --git a/sys-apps/superiotool/superiotool-0.0.1-r2747.ebuild b/sys-apps/superiotool/superiotool-0.0.1-r2747.ebuild
deleted file mode 100644
index b77ec65..0000000
--- a/sys-apps/superiotool/superiotool-0.0.1-r2747.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2010 Chromium OS Authors
-# Distributed under the terms of the GNU General Public License v2
-# $Header: $
-
-EAPI=4
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-CROS_WORKON_LOCALNAME="coreboot"
-
-inherit cros-workon toolchain-funcs
-
-DESCRIPTION="Superiotool allows you to detect which Super I/O you have on your mainboard, and it can provide detailed information about the register contents of the Super I/O."
-HOMEPAGE="http://www.coreboot.org/Superiotool"
-
-LICENSE="GPL-2"
-SLOT="0"
-KEYWORDS="amd64 x86"
-
-RDEPEND="sys-apps/pciutils"
-DEPEND="${RDEPEND}"
-
-src_compile() {
-	emake -C util/superiotool CC="$(tc-getCC)"
-}
-
-src_install() {
-	emake -C util/superiotool DESTDIR="${D}" install
-}
diff --git a/sys-apps/superiotool/superiotool-0.0.1-r2836.ebuild b/sys-apps/superiotool/superiotool-0.0.1-r2836.ebuild
new file mode 100644
index 0000000..5b2e299
--- /dev/null
+++ b/sys-apps/superiotool/superiotool-0.0.1-r2836.ebuild
@@ -0,0 +1,29 @@
+# Copyright 2010 Chromium OS Authors
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=4
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+CROS_WORKON_LOCALNAME="coreboot"
+
+inherit cros-workon toolchain-funcs
+
+DESCRIPTION="Superiotool allows you to detect which Super I/O you have on your mainboard, and it can provide detailed information about the register contents of the Super I/O."
+HOMEPAGE="http://www.coreboot.org/Superiotool"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="amd64 x86"
+
+RDEPEND="sys-apps/pciutils"
+DEPEND="${RDEPEND}"
+
+src_compile() {
+	emake -C util/superiotool CC="$(tc-getCC)"
+}
+
+src_install() {
+	emake -C util/superiotool DESTDIR="${D}" install
+}
diff --git a/sys-apps/upstart/upstart-1.2-r33.ebuild b/sys-apps/upstart/upstart-1.2-r34.ebuild
similarity index 100%
rename from sys-apps/upstart/upstart-1.2-r33.ebuild
rename to sys-apps/upstart/upstart-1.2-r34.ebuild
diff --git a/sys-apps/upstart/upstart-1.2.ebuild b/sys-apps/upstart/upstart-1.2.ebuild
index 9c4ac74..a307cfb 100644
--- a/sys-apps/upstart/upstart-1.2.ebuild
+++ b/sys-apps/upstart/upstart-1.2.ebuild
@@ -119,9 +119,9 @@
 	insinto /etc/init
 	# Always use our own upstart-socket-bridge.conf.
 	doins "${FILESDIR}"/init/upstart-socket-bridge.conf
+	# Restore udev bridge if requested.
+	use udev_bridge && doins extra/conf/upstart-udev-bridge.conf
 	# Install D-Bus XML files.
 	insinto /usr/share/dbus-1/interfaces/
 	doins "${S}"/dbus/*.xml
-	# Restore udev bridge if requested.
-	use udev_bridge && doins extra/conf/upstart-udev-bridge.conf
 }
diff --git a/sys-apps/usbguard/OWNERS b/sys-apps/usbguard/OWNERS
new file mode 100644
index 0000000..fe3921f
--- /dev/null
+++ b/sys-apps/usbguard/OWNERS
@@ -0,0 +1 @@
+allenwebb@chromium.org
diff --git a/sys-apps/util-linux/util-linux-2.32-r4.ebuild b/sys-apps/util-linux/util-linux-2.32-r4.ebuild
deleted file mode 100644
index ab3b14e..0000000
--- a/sys-apps/util-linux/util-linux-2.32-r4.ebuild
+++ /dev/null
@@ -1,238 +0,0 @@
-# Copyright 1999-2018 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-PYTHON_COMPAT=( python2_7 python3_{4,5,6} )
-
-inherit toolchain-funcs libtool flag-o-matic bash-completion-r1 \
-	pam python-single-r1 multilib-minimal multiprocessing systemd
-
-MY_PV="${PV/_/-}"
-MY_P="${PN}-${MY_PV}"
-
-if [[ ${PV} == 9999 ]] ; then
-	inherit git-r3 autotools
-	EGIT_REPO_URI="https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git"
-else
-	[[ "${PV}" = *_rc* ]] || \
-	KEYWORDS="*"
-	SRC_URI="mirror://kernel/linux/utils/util-linux/v${PV:0:4}/${MY_P}.tar.xz"
-fi
-
-DESCRIPTION="Various useful Linux utilities"
-HOMEPAGE="https://www.kernel.org/pub/linux/utils/util-linux/ https://github.com/karelzak/util-linux"
-
-LICENSE="GPL-2 LGPL-2.1 BSD-4 MIT public-domain"
-SLOT="0"
-IUSE="build caps +cramfs fdformat kill ncurses nls pam python +readline selinux slang static-libs +suid systemd test tty-helpers udev unicode userland_GNU
-	kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 kernel-4_4 kernel-4_14
-	kernel-4_19 cros_host
-"
-
-# Most lib deps here are related to programs rather than our libs,
-# so we rarely need to specify ${MULTILIB_USEDEP}.
-RDEPEND="caps? ( sys-libs/libcap-ng )
-	cramfs? ( sys-libs/zlib:= )
-	ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] )
-	nls? ( virtual/libintl[${MULTILIB_USEDEP}] )
-	pam? ( sys-libs/pam )
-	python? ( ${PYTHON_DEPS} )
-	readline? ( sys-libs/readline:0= )
-	selinux? ( >=sys-libs/libselinux-2.2.2-r4[${MULTILIB_USEDEP}] )
-	slang? ( sys-libs/slang )
-	!build? ( systemd? ( sys-apps/systemd ) )
-	udev? ( virtual/libudev:= )"
-DEPEND="${RDEPEND}
-	virtual/pkgconfig
-	nls? ( sys-devel/gettext )
-	test? ( sys-devel/bc )
-	virtual/os-headers"
-RDEPEND+="
-	kill? (
-		!sys-apps/coreutils[kill]
-		!sys-process/procps[kill]
-	)
-	!net-wireless/rfkill
-	!sys-process/schedutils
-	!sys-apps/setarch
-	!<sys-apps/sysvinit-2.88-r7
-	!<sys-libs/e2fsprogs-libs-1.41.8
-	!<sys-fs/e2fsprogs-1.41.8
-	!<app-shells/bash-completion-2.7-r1"
-
-REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
-
-S="${WORKDIR}/${MY_P}"
-
-pkg_setup() {
-	use python && python-single-r1_pkg_setup
-}
-
-src_prepare() {
-	default
-
-	eapply "${FILESDIR}"/${P}-add-missing-lintl.patch
-	if ! use kernel-3_8 && ! use kernel-3_10 && ! use kernel-3_14 && \
-		! use kernel-3_18 && ! use kernel-4_4 && ! use kernel-4_14 && \
-		! use kernel-4_19 && ! use cros_host; then
-		eapply "${FILESDIR}"/${P}-nosymfollow.patch
-	fi
-	touch -r "${S}"/configure "${S}"/libsmartcols/src/Makemodule.am || die
-	touch -r "${S}"/configure "${S}"/libuuid/src/Makemodule.am || die
-
-	# Prevent uuidd test failure due to socket path limit. #593304
-	sed -i \
-		-e "s|UUIDD_SOCKET=\"\$(mktemp -u \"\${TS_OUTDIR}/uuiddXXXXXXXXXXXXX\")\"|UUIDD_SOCKET=\"\$(mktemp -u \"${T}/uuiddXXXXXXXXXXXXX.sock\")\"|g" \
-		tests/ts/uuid/uuidd || die "Failed to fix uuidd test"
-
-	if ! use userland_GNU; then
-		# test runner is using GNU-specific xargs call
-		sed -i -e 's:xargs:gxargs:' tests/run.sh || die
-		# test requires util-linux uuidgen (which we don't build)
-		rm tests/ts/uuid/oids || die
-	fi
-
-	if [[ ${PV} == 9999 ]] ; then
-		po/update-potfiles
-		eautoreconf
-	fi
-
-	# Undo bad ncurses handling by upstream. #601530
-	sed -i -E \
-		-e '/NCURSES_/s:(ncursesw?)[56]-config:$PKG_CONFIG \1:' \
-		-e 's:(ncursesw?)[56]-config --version:$PKG_CONFIG --exists --print-errors \1:' \
-		configure || die
-
-	elibtoolize
-}
-
-lfs_fallocate_test() {
-	# Make sure we can use fallocate with LFS #300307
-	cat <<-EOF > "${T}"/fallocate.${ABI}.c
-		#define _GNU_SOURCE
-		#include <fcntl.h>
-		main() { return fallocate(0, 0, 0, 0); }
-	EOF
-	append-lfs-flags
-	$(tc-getCC) ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} "${T}"/fallocate.${ABI}.c -o /dev/null >/dev/null 2>&1 \
-		|| export ac_cv_func_fallocate=no
-	rm -f "${T}"/fallocate.${ABI}.c
-}
-
-multilib_src_configure() {
-	lfs_fallocate_test
-	# The scanf test in a run-time test which fails while cross-compiling.
-	# Blindly assume a POSIX setup since we require libmount, and libmount
-	# itself fails when the scanf test fails. #531856
-	tc-is-cross-compiler && export scanf_cv_alloc_modifier=ms
-	export ac_cv_header_security_pam_misc_h=$(multilib_native_usex pam) #485486
-	export ac_cv_header_security_pam_appl_h=$(multilib_native_usex pam) #545042
-
-	local myeconfargs=(
-		--enable-fs-paths-extra="${EPREFIX}/usr/sbin:${EPREFIX}/bin:${EPREFIX}/usr/bin"
-		--with-bashcompletiondir="$(get_bashcompdir)"
-		$(multilib_native_use_enable suid makeinstall-chown)
-		$(multilib_native_use_enable suid makeinstall-setuid)
-		$(multilib_native_use_with python)
-		$(multilib_native_use_with readline)
-		$(multilib_native_use_with slang)
-		$(multilib_native_use_with systemd)
-		$(multilib_native_use_with udev)
-		$(multilib_native_usex ncurses "$(use_with unicode ncursesw)" '--without-ncursesw')
-		$(multilib_native_usex ncurses "$(use_with !unicode ncurses)" '--without-ncurses')
-		$(tc-has-tls || echo --disable-tls)
-		$(use_enable nls)
-		$(use_enable unicode widechar)
-		$(use_enable static-libs static)
-		$(use_with selinux)
-		$(usex ncurses '' '--without-tinfo')
-	)
-	# build programs only on GNU, on *BSD we want libraries only
-	if multilib_is_native_abi && use userland_GNU; then
-		myeconfargs+=(
-			--disable-chfn-chsh
-			--disable-login
-			--disable-nologin
-			--disable-su
-			--enable-agetty
-			--enable-bash-completion
-			--enable-line
-			--enable-partx
-			--enable-raw
-			--enable-rename
-			--enable-rfkill
-			--enable-schedutils
-			--with-systemdsystemunitdir="$(systemd_get_systemunitdir)"
-			$(use_enable caps setpriv)
-			$(use_enable cramfs)
-			$(use_enable fdformat)
-			$(use_enable tty-helpers mesg)
-			$(use_enable tty-helpers wall)
-			$(use_enable tty-helpers write)
-			$(use_enable kill)
-		)
-	else
-		myeconfargs+=(
-			--disable-all-programs
-			--disable-bash-completion
-			--without-systemdsystemunitdir
-			# build libraries
-			--enable-libuuid
-			--enable-libblkid
-			--enable-libsmartcols
-			--enable-libfdisk
-		)
-		if use userland_GNU; then
-			# those libraries don't work on *BSD
-			myeconfargs+=(
-				--enable-libmount
-			)
-		fi
-	fi
-	ECONF_SOURCE="${S}" econf "${myeconfargs[@]}"
-}
-
-multilib_src_test() {
-	emake check TS_OPTS="--parallel=$(makeopts_jobs) --nonroot"
-}
-
-multilib_src_install() {
-	emake DESTDIR="${D}" install
-
-	if multilib_is_native_abi && use userland_GNU; then
-		# need the libs in /
-		gen_usr_ldscript -a blkid fdisk mount smartcols uuid
-
-		use python && python_optimize
-	fi
-}
-
-multilib_src_install_all() {
-	dodoc AUTHORS NEWS README* Documentation/{TODO,*.txt,releases/*}
-
-	# e2fsprogs-libs didnt install .la files, and .pc work fine
-	find "${ED}" -name "*.la" -delete || die
-
-	if ! use userland_GNU; then
-		# manpage collisions
-		# TODO: figure out a good way to keep them
-		rm "${ED%/}"/usr/share/man/man3/uuid* || die
-	fi
-
-	if use pam; then
-		newpamd "${FILESDIR}/runuser.pamd" runuser
-		newpamd "${FILESDIR}/runuser-l.pamd" runuser-l
-	fi
-}
-
-pkg_postinst() {
-	if ! use tty-helpers; then
-		elog "The mesg/wall/write tools have been disabled due to USE=-tty-helpers."
-	fi
-
-	if [[ -z ${REPLACING_VERSIONS} ]]; then
-		elog "The agetty util now clears the terminal by default. You"
-		elog "might want to add --noclear to your /etc/inittab lines."
-	fi
-}
diff --git a/sys-apps/util-linux/util-linux-2.32-r6.ebuild b/sys-apps/util-linux/util-linux-2.32-r6.ebuild
new file mode 100644
index 0000000..7d7d55f
--- /dev/null
+++ b/sys-apps/util-linux/util-linux-2.32-r6.ebuild
@@ -0,0 +1,238 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python2_7 python3_{4,5,6} )
+
+inherit toolchain-funcs libtool flag-o-matic bash-completion-r1 \
+	pam python-single-r1 multilib-minimal multiprocessing systemd
+
+MY_PV="${PV/_/-}"
+MY_P="${PN}-${MY_PV}"
+
+if [[ ${PV} == 9999 ]] ; then
+	inherit git-r3 autotools
+	EGIT_REPO_URI="https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git"
+else
+	[[ "${PV}" = *_rc* ]] || \
+	KEYWORDS="*"
+	SRC_URI="mirror://kernel/linux/utils/util-linux/v${PV:0:4}/${MY_P}.tar.xz"
+fi
+
+DESCRIPTION="Various useful Linux utilities"
+HOMEPAGE="https://www.kernel.org/pub/linux/utils/util-linux/ https://github.com/karelzak/util-linux"
+
+LICENSE="GPL-2 LGPL-2.1 BSD-4 MIT public-domain"
+SLOT="0"
+IUSE="build caps +cramfs fdformat kill ncurses nls pam python +readline selinux slang static-libs +suid systemd test tty-helpers udev unicode userland_GNU
+	kernel-3_8 kernel-3_10 kernel-3_14 kernel-3_18 cros_host
+"
+
+# Most lib deps here are related to programs rather than our libs,
+# so we rarely need to specify ${MULTILIB_USEDEP}.
+RDEPEND="caps? ( sys-libs/libcap-ng )
+	cramfs? ( sys-libs/zlib:= )
+	ncurses? ( >=sys-libs/ncurses-5.2-r2:0=[unicode?] )
+	nls? ( virtual/libintl[${MULTILIB_USEDEP}] )
+	pam? ( sys-libs/pam )
+	python? ( ${PYTHON_DEPS} )
+	readline? ( sys-libs/readline:0= )
+	selinux? ( >=sys-libs/libselinux-2.2.2-r4[${MULTILIB_USEDEP}] )
+	slang? ( sys-libs/slang )
+	!build? ( systemd? ( sys-apps/systemd ) )
+	udev? ( virtual/libudev:= )"
+BDEPEND="
+	virtual/pkgconfig
+	nls? ( sys-devel/gettext )
+	test? ( sys-devel/bc )
+"
+DEPEND="${RDEPEND}
+	virtual/os-headers"
+RDEPEND+="
+	kill? (
+		!sys-apps/coreutils[kill]
+		!sys-process/procps[kill]
+	)
+	!net-wireless/rfkill
+	!sys-process/schedutils
+	!sys-apps/setarch
+	!<sys-apps/sysvinit-2.88-r7
+	!<sys-libs/e2fsprogs-libs-1.41.8
+	!<sys-fs/e2fsprogs-1.41.8
+	!<app-shells/bash-completion-2.7-r1"
+
+REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
+
+S="${WORKDIR}/${MY_P}"
+
+pkg_setup() {
+	use python && python-single-r1_pkg_setup
+}
+
+src_prepare() {
+	default
+
+	eapply "${FILESDIR}"/${P}-add-missing-lintl.patch
+	if ! use kernel-3_8 && ! use kernel-3_10 && ! use kernel-3_14 && \
+		! use kernel-3_18 && ! use cros_host; then
+		eapply "${FILESDIR}"/${P}-nosymfollow.patch
+	fi
+	touch -r "${S}"/configure "${S}"/libsmartcols/src/Makemodule.am || die
+	touch -r "${S}"/configure "${S}"/libuuid/src/Makemodule.am || die
+
+	# Prevent uuidd test failure due to socket path limit. #593304
+	sed -i \
+		-e "s|UUIDD_SOCKET=\"\$(mktemp -u \"\${TS_OUTDIR}/uuiddXXXXXXXXXXXXX\")\"|UUIDD_SOCKET=\"\$(mktemp -u \"${T}/uuiddXXXXXXXXXXXXX.sock\")\"|g" \
+		tests/ts/uuid/uuidd || die "Failed to fix uuidd test"
+
+	if ! use userland_GNU; then
+		# test runner is using GNU-specific xargs call
+		sed -i -e 's:xargs:gxargs:' tests/run.sh || die
+		# test requires util-linux uuidgen (which we don't build)
+		rm tests/ts/uuid/oids || die
+	fi
+
+	if [[ ${PV} == 9999 ]] ; then
+		po/update-potfiles
+		eautoreconf
+	fi
+
+	# Undo bad ncurses handling by upstream. #601530
+	sed -i -E \
+		-e '/NCURSES_/s:(ncursesw?)[56]-config:$PKG_CONFIG \1:' \
+		-e 's:(ncursesw?)[56]-config --version:$PKG_CONFIG --exists --print-errors \1:' \
+		configure || die
+
+	elibtoolize
+}
+
+lfs_fallocate_test() {
+	# Make sure we can use fallocate with LFS #300307
+	cat <<-EOF > "${T}"/fallocate.${ABI}.c
+		#define _GNU_SOURCE
+		#include <fcntl.h>
+		main() { return fallocate(0, 0, 0, 0); }
+	EOF
+	append-lfs-flags
+	$(tc-getCC) ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} "${T}"/fallocate.${ABI}.c -o /dev/null >/dev/null 2>&1 \
+		|| export ac_cv_func_fallocate=no
+	rm -f "${T}"/fallocate.${ABI}.c
+}
+
+multilib_src_configure() {
+	lfs_fallocate_test
+	# The scanf test in a run-time test which fails while cross-compiling.
+	# Blindly assume a POSIX setup since we require libmount, and libmount
+	# itself fails when the scanf test fails. #531856
+	tc-is-cross-compiler && export scanf_cv_alloc_modifier=ms
+	export ac_cv_header_security_pam_misc_h=$(multilib_native_usex pam) #485486
+	export ac_cv_header_security_pam_appl_h=$(multilib_native_usex pam) #545042
+
+	local myeconfargs=(
+		--enable-fs-paths-extra="${EPREFIX}/usr/sbin:${EPREFIX}/bin:${EPREFIX}/usr/bin"
+		--with-bashcompletiondir="$(get_bashcompdir)"
+		$(multilib_native_use_enable suid makeinstall-chown)
+		$(multilib_native_use_enable suid makeinstall-setuid)
+		$(multilib_native_use_with python)
+		$(multilib_native_use_with readline)
+		$(multilib_native_use_with slang)
+		$(multilib_native_use_with systemd)
+		$(multilib_native_use_with udev)
+		$(multilib_native_usex ncurses "$(use_with unicode ncursesw)" '--without-ncursesw')
+		$(multilib_native_usex ncurses "$(use_with !unicode ncurses)" '--without-ncurses')
+		$(tc-has-tls || echo --disable-tls)
+		$(use_enable nls)
+		$(use_enable unicode widechar)
+		$(use_enable static-libs static)
+		$(use_with selinux)
+		$(usex ncurses '' '--without-tinfo')
+	)
+	# build programs only on GNU, on *BSD we want libraries only
+	if multilib_is_native_abi && use userland_GNU; then
+		myeconfargs+=(
+			--disable-chfn-chsh
+			--disable-login
+			--disable-nologin
+			--disable-su
+			--enable-agetty
+			--enable-bash-completion
+			--enable-line
+			--enable-partx
+			--enable-raw
+			--enable-rename
+			--enable-rfkill
+			--enable-schedutils
+			--with-systemdsystemunitdir="$(systemd_get_systemunitdir)"
+			$(use_enable caps setpriv)
+			$(use_enable cramfs)
+			$(use_enable fdformat)
+			$(use_enable tty-helpers mesg)
+			$(use_enable tty-helpers wall)
+			$(use_enable tty-helpers write)
+			$(use_enable kill)
+		)
+	else
+		myeconfargs+=(
+			--disable-all-programs
+			--disable-bash-completion
+			--without-systemdsystemunitdir
+			# build libraries
+			--enable-libuuid
+			--enable-libblkid
+			--enable-libsmartcols
+			--enable-libfdisk
+		)
+		if use userland_GNU; then
+			# those libraries don't work on *BSD
+			myeconfargs+=(
+				--enable-libmount
+			)
+		fi
+	fi
+	ECONF_SOURCE="${S}" econf "${myeconfargs[@]}"
+}
+
+multilib_src_test() {
+	emake check TS_OPTS="--parallel=$(makeopts_jobs) --nonroot"
+}
+
+multilib_src_install() {
+	emake DESTDIR="${D}" install
+
+	if multilib_is_native_abi && use userland_GNU; then
+		# need the libs in /
+		gen_usr_ldscript -a blkid fdisk mount smartcols uuid
+
+		use python && python_optimize
+	fi
+}
+
+multilib_src_install_all() {
+	dodoc AUTHORS NEWS README* Documentation/{TODO,*.txt,releases/*}
+
+	# e2fsprogs-libs didnt install .la files, and .pc work fine
+	find "${ED}" -name "*.la" -delete || die
+
+	if ! use userland_GNU; then
+		# manpage collisions
+		# TODO: figure out a good way to keep them
+		rm "${ED%/}"/usr/share/man/man3/uuid* || die
+	fi
+
+	if use pam; then
+		newpamd "${FILESDIR}/runuser.pamd" runuser
+		newpamd "${FILESDIR}/runuser-l.pamd" runuser-l
+	fi
+}
+
+pkg_postinst() {
+	if ! use tty-helpers; then
+		elog "The mesg/wall/write tools have been disabled due to USE=-tty-helpers."
+	fi
+
+	if [[ -z ${REPLACING_VERSIONS} ]]; then
+		elog "The agetty util now clears the terminal by default. You"
+		elog "might want to add --noclear to your /etc/inittab lines."
+	fi
+}
diff --git a/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r169.ebuild b/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r169.ebuild
deleted file mode 100644
index 6e0d9bb..0000000
--- a/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r169.ebuild
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="23fef48ef7da8fb5440d54ed4f46f5b43d01f874"
-CROS_WORKON_TREE="e79a894c8f8c4216a3c302c721e5aab66662f8d4"
-CROS_WORKON_PROJECT="chromiumos/platform/bmpblk"
-CROS_WORKON_LOCALNAME="../platform/bmpblk"
-CROS_WORKON_OUTOFTREE_BUILD="1"
-CROS_WORKON_USE_VCSID="1"
-
-# TODO(hungte) When "tweaking ebuilds by source repository" is implemented, we
-# can generate this list by some script inside source repo.
-CROS_BOARDS=(
-	atlas
-	auron_paine
-	auron_yuna
-	banjo
-	buddy
-	butterfly
-	candy
-	chell
-	cid
-	clapper
-	cranky
-	daisy
-	daisy_snow
-	daisy_spring
-	daisy_skate
-	dedede
-	deltaur
-	dragonegg
-	drallion
-	endeavour
-	enguarde
-	expresso
-	eve
-	falco
-	fizz
-	flapjack
-	glados
-	glimmer
-	gnawty
-	grunt
-	guado
-	hatch
-	jacuzzi
-	kalista
-	kevin
-	kip
-	kukui
-	lars
-	leon
-	link
-	lulu
-	lumpy
-	mccloud
-	meowth
-	monroe
-	mushu
-	nami
-	nautilus
-	ninja
-	nocturne
-	nyan
-	nyan_big
-	octopus
-	orco
-	palkia
-	panther
-	parrot
-	peach_pi
-	peach_pit
-	peppy
-	poppy
-	puff
-	quawks
-	rammus
-	reks
-	rikku
-	sarien
-	scarlet
-	soraka
-	squawks
-	stout
-	stumpy
-	sumo
-	swanky
-	tglrvp
-	tidus
-	tricky
-	trogdor
-	veyron_brain
-	veyron_danger
-	veyron_jerry
-	veyron_mickey
-	veyron_minnie
-	veyron_pinky
-	veyron_romy
-	volteer
-	winky
-	wolf
-	zako
-	zoombini
-	zork
-)
-
-PYTHON_COMPAT=( python3_{6..8} )
-inherit cros-workon cros-board python-any-r1
-
-DESCRIPTION="Chrome OS Firmware Bitmap Block"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/bmpblk/"
-SRC_URI=""
-LICENSE="BSD-Google"
-KEYWORDS="*"
-IUSE="detachable menu_ui legacy_menu_ui diag_payload
-	physical_presence_power physical_presence_recovery"
-
-BDEPEND="${PYTHON_DEPS}"
-DEPEND="virtual/chromeos-vendor-strings"
-
-src_prepare() {
-	export BOARD="$(get_current_board_with_variant "${ARCH}-generic")"
-	export VCSID
-
-	default
-
-	# if fontconfig's cache is empty, prepare single use cache.
-	# That's still faster than having each process (of which there
-	# are many) re-scan the fonts
-	if find /usr/share/cache/fontconfig -maxdepth 0 -type d -empty \
-		-exec false {} +; then
-
-		return
-	fi
-
-	TMPCACHE=$(mktemp -d)
-	cat > $TMPCACHE/local-conf.xml <<-EOF
-		<?xml version="1.0"?>
-		<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
-		<fontconfig>
-		<cachedir>$TMPCACHE</cachedir>
-		<include>/etc/fonts/fonts.conf</include>
-		</fontconfig>
-	EOF
-	export FONTCONFIG_FILE=$TMPCACHE/local-conf.xml
-	fc-cache -v
-}
-
-src_compile() {
-	local vendor_strings_dir="${SYSROOT}/firmware/vendor-strings"
-	if use detachable ; then
-		export DETACHABLE=1
-	fi
-	if use menu_ui ; then
-		export MENU_UI=1
-	elif use legacy_menu_ui ; then
-		export LEGACY_MENU_UI=1
-	fi
-	# Using diagnostic payload implies enabling UI to run it
-	if use diag_payload ; then
-		export DIAGNOSTIC_UI=1
-	fi
-	if [[ -f "${vendor_strings_dir}/vendor_format.yaml" ]] ; then
-		export VENDOR_STRINGS_DIR="${vendor_strings_dir}"
-	fi
-	if use physical_presence_power ; then
-		export PHYSICAL_PRESENCE="power"
-	elif use physical_presence_recovery ; then
-		export PHYSICAL_PRESENCE="recovery"
-	else
-		export PHYSICAL_PRESENCE="keyboard"
-	fi
-	emake OUTPUT="${WORKDIR}" "${BOARD}"
-	emake OUTPUT="${WORKDIR}/${BOARD}" ARCHIVER="/usr/bin/archive" archive
-	if [[ "${BOARD}" == "${ARCH}-generic" ]]; then
-		printf "1" > "${WORKDIR}/${BOARD}/vbgfx_not_scaled"
-	fi
-}
-
-doins_if_exist() {
-	local f
-	for f in "$@"; do
-		if [[ -r "${f}" ]]; then
-			doins "${f}"
-		fi
-	done
-}
-
-src_install() {
-	# Bitmaps need to reside in the RO CBFS only. Many boards do
-	# not have enough space in the RW CBFS regions to contain
-	# all image files.
-	insinto /firmware/cbfs-ro-compress
-	# These files aren't necessary for debug builds. When these files
-	# are missing, Depthcharge will render text-only screens. They look
-	# obviously not ready for release.
-	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx.bin
-	doins_if_exist "${WORKDIR}/${BOARD}"/locales
-	doins_if_exist "${WORKDIR}/${BOARD}"/locale_*.bin
-	doins_if_exist "${WORKDIR}/${BOARD}"/font.bin
-	# This flag tells the firmware_Bmpblk test to flag this build as
-	# not ready for release.
-	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx_not_scaled
-}
diff --git a/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r229.ebuild b/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r229.ebuild
new file mode 100644
index 0000000..4e5c518
--- /dev/null
+++ b/sys-boot/chromeos-bmpblk/chromeos-bmpblk-1.0.1-r229.ebuild
@@ -0,0 +1,202 @@
+# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="ad3cb86b968cf5a50bd5e2fb4efd51a00eea8009"
+CROS_WORKON_TREE="2b1a4fe56d1866a885f2dc874205c305a708e0cc"
+CROS_WORKON_PROJECT="chromiumos/platform/bmpblk"
+CROS_WORKON_LOCALNAME="../platform/bmpblk"
+CROS_WORKON_OUTOFTREE_BUILD="1"
+CROS_WORKON_USE_VCSID="1"
+
+# TODO(hungte) When "tweaking ebuilds by source repository" is implemented, we
+# can generate this list by some script inside source repo.
+CROS_BOARDS=(
+	atlas
+	auron_paine
+	auron_yuna
+	banjo
+	buddy
+	butterfly
+	candy
+	chell
+	cid
+	clapper
+	cranky
+	daisy
+	daisy_snow
+	daisy_spring
+	daisy_skate
+	dedede
+	deltaur
+	dragonegg
+	drallion
+	endeavour
+	enguarde
+	expresso
+	eve
+	falco
+	fizz
+	flapjack
+	glados
+	glimmer
+	gnawty
+	grunt
+	guado
+	hatch
+	jacuzzi
+	kalista
+	kevin
+	kip
+	kukui
+	lars
+	leon
+	link
+	lulu
+	lumpy
+	mccloud
+	meowth
+	monroe
+	mushu
+	nami
+	nautilus
+	ninja
+	nocturne
+	nyan
+	nyan_big
+	octopus
+	orco
+	palkia
+	panther
+	parrot
+	peach_pi
+	peach_pit
+	peppy
+	poppy
+	puff
+	quawks
+	rammus
+	reks
+	rikku
+	sarien
+	scarlet
+	soraka
+	squawks
+	stout
+	stumpy
+	sumo
+	swanky
+	tglrvp
+	tidus
+	tricky
+	trogdor
+	veyron_brain
+	veyron_danger
+	veyron_jerry
+	veyron_mickey
+	veyron_minnie
+	veyron_pinky
+	veyron_romy
+	volteer
+	winky
+	wolf
+	zako
+	zoombini
+	zork
+)
+
+PYTHON_COMPAT=( python3_{6..8} )
+inherit cros-workon cros-board python-any-r1
+
+DESCRIPTION="Chrome OS Firmware Bitmap Block"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/bmpblk/"
+SRC_URI=""
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="detachable diag_payload +minidiag physical_presence_power
+	physical_presence_recovery"
+
+BDEPEND="${PYTHON_DEPS}"
+DEPEND="virtual/chromeos-vendor-strings"
+
+src_prepare() {
+	export BOARD="$(get_current_board_with_variant "${ARCH}-generic")"
+	export VCSID
+
+	default
+
+	# if fontconfig's cache is empty, prepare single use cache.
+	# That's still faster than having each process (of which there
+	# are many) re-scan the fonts
+	if find /usr/share/cache/fontconfig -maxdepth 0 -type d -empty \
+		-exec false {} +; then
+
+		return
+	fi
+
+	TMPCACHE=$(mktemp -d)
+	cat > $TMPCACHE/local-conf.xml <<-EOF
+		<?xml version="1.0"?>
+		<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+		<fontconfig>
+		<cachedir>$TMPCACHE</cachedir>
+		<include>/etc/fonts/fonts.conf</include>
+		</fontconfig>
+	EOF
+	export FONTCONFIG_FILE=$TMPCACHE/local-conf.xml
+	fc-cache -v
+}
+
+src_compile() {
+	local vendor_strings_dir="${SYSROOT}/firmware/vendor-strings"
+	if use detachable ; then
+		export DETACHABLE=1
+	fi
+
+	# Both diag_payload and minidiag need additional UI images from
+	# chromeos-bmpblk.
+	if use diag_payload || use minidiag ; then
+		export DIAGNOSTIC_UI=1
+	fi
+	if [[ -f "${vendor_strings_dir}/vendor_format.yaml" ]] ; then
+		export VENDOR_STRINGS_DIR="${vendor_strings_dir}"
+	fi
+	if use physical_presence_power ; then
+		export PHYSICAL_PRESENCE="power"
+	elif use physical_presence_recovery ; then
+		export PHYSICAL_PRESENCE="recovery"
+	else
+		export PHYSICAL_PRESENCE="keyboard"
+	fi
+	emake OUTPUT="${WORKDIR}" BOARD="${BOARD}"
+	emake OUTPUT="${WORKDIR}/${BOARD}" ARCHIVER="/usr/bin/archive" archive
+	if [[ "${BOARD}" == "${ARCH}-generic" ]]; then
+		printf "1" > "${WORKDIR}/${BOARD}/vbgfx_not_scaled"
+	fi
+}
+
+doins_if_exist() {
+	local f
+	for f in "$@"; do
+		if [[ -r "${f}" ]]; then
+			doins "${f}"
+		fi
+	done
+}
+
+src_install() {
+	# Bitmaps need to reside in the RO CBFS only. Many boards do
+	# not have enough space in the RW CBFS regions to contain
+	# all image files.
+	insinto /firmware/cbfs-ro-compress
+	# These files aren't necessary for debug builds. When these files
+	# are missing, Depthcharge will render text-only screens. They look
+	# obviously not ready for release.
+	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx.bin
+	doins_if_exist "${WORKDIR}/${BOARD}"/locales
+	doins_if_exist "${WORKDIR}/${BOARD}"/locale_*.bin
+	doins_if_exist "${WORKDIR}/${BOARD}"/font.bin
+	# This flag tells the firmware_Bmpblk test to flag this build as
+	# not ready for release.
+	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx_not_scaled
+}
diff --git a/sys-boot/chromeos-bmpblk/chromeos-bmpblk-9999.ebuild b/sys-boot/chromeos-bmpblk/chromeos-bmpblk-9999.ebuild
index 6284eb6..9550a4e 100644
--- a/sys-boot/chromeos-bmpblk/chromeos-bmpblk-9999.ebuild
+++ b/sys-boot/chromeos-bmpblk/chromeos-bmpblk-9999.ebuild
@@ -111,8 +111,8 @@
 SRC_URI=""
 LICENSE="BSD-Google"
 KEYWORDS="~*"
-IUSE="detachable menu_ui legacy_menu_ui diag_payload
-	physical_presence_power physical_presence_recovery"
+IUSE="detachable diag_payload +minidiag physical_presence_power
+	physical_presence_recovery"
 
 BDEPEND="${PYTHON_DEPS}"
 DEPEND="virtual/chromeos-vendor-strings"
@@ -150,13 +150,10 @@
 	if use detachable ; then
 		export DETACHABLE=1
 	fi
-	if use menu_ui ; then
-		export MENU_UI=1
-	elif use legacy_menu_ui ; then
-		export LEGACY_MENU_UI=1
-	fi
-	# Using diagnostic payload implies enabling UI to run it
-	if use diag_payload ; then
+
+	# Both diag_payload and minidiag need additional UI images from
+	# chromeos-bmpblk.
+	if use diag_payload || use minidiag ; then
 		export DIAGNOSTIC_UI=1
 	fi
 	if [[ -f "${vendor_strings_dir}/vendor_format.yaml" ]] ; then
@@ -169,7 +166,7 @@
 	else
 		export PHYSICAL_PRESENCE="keyboard"
 	fi
-	emake OUTPUT="${WORKDIR}" "${BOARD}"
+	emake OUTPUT="${WORKDIR}" BOARD="${BOARD}"
 	emake OUTPUT="${WORKDIR}/${BOARD}" ARCHIVER="/usr/bin/archive" archive
 	if [[ "${BOARD}" == "${ARCH}-generic" ]]; then
 		printf "1" > "${WORKDIR}/${BOARD}/vbgfx_not_scaled"
diff --git a/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3-r78.ebuild b/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3-r82.ebuild
similarity index 100%
rename from sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3-r78.ebuild
rename to sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3-r82.ebuild
diff --git a/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3.ebuild b/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3.ebuild
index 47e1566..bb7215f 100644
--- a/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3.ebuild
+++ b/sys-boot/chromeos-bootimage/chromeos-bootimage-0.0.3.ebuild
@@ -33,8 +33,7 @@
 
 # TODO(sjg@chromium.org): Drop this zork stuff when the code is upstream
 DEPEND="
-	zork? ( || ( sys-boot/coreboot:= sys-boot/coreboot-zork:= ) )
-	!zork? ( sys-boot/coreboot:= )
+	sys-boot/coreboot
 	depthcharge? ( sys-boot/depthcharge:= )
 	bmpblk? ( sys-boot/chromeos-bmpblk:= )
 	tianocore? ( sys-boot/edk2:= )
@@ -260,6 +259,7 @@
 	local target="$1"
 	local rom="$2"
 	local bl_list="${T}/altfw"
+	local have_default
 
 	einfo "Adding alternative firmware"
 
@@ -286,15 +286,23 @@
 	if use tianocore; then
 		einfo "- Adding TianoCore"
 
-		do_cbfstool "${rom}" add-payload -r RW_LEGACY -n altfw/tianocore -c \
-			lzma -f "${CROS_FIRMWARE_ROOT}/tianocore/UEFIPAYLOAD.fd"
-		hash_altfw_payload "${rom}" tianocore
-		echo "2;altfw/tianocore;TianoCore;TianoCore bootloader" \
-			>> "${bl_list}"
+		# Some boards only have 1MB of RW_LEGACY space but UEFI is over
+		# 800KB. Allow this to fail, in which case we just don't add it.
+		if cbfstool "${rom}" add-payload -r RW_LEGACY \
+				-n altfw/tianocore -c lzma -f \
+				"${CROS_FIRMWARE_ROOT}/tianocore/UEFIPAYLOAD.fd"; then
+			hash_altfw_payload "${rom}" tianocore
+			echo "2;altfw/tianocore;TianoCore;TianoCore bootloader" \
+				>> "${bl_list}"
 
-		# For now, use TianoCore as the default
-		echo "0;altfw/tianocore;TianoCore;TianoCore bootloader" \
-			>> "${bl_list}"
+			# For now, use TianoCore as the default.
+			echo "0;altfw/tianocore;TianoCore;TianoCore bootloader" \
+				>> "${bl_list}"
+			have_default=y
+			einfo "  (sing TianoCore as default)"
+		else
+			ewarn "Not enough space for TianoCore: omitted"
+		fi
 	fi
 
 	# Add SeaBIOS if enabled
@@ -336,9 +344,11 @@
 			>> "${bl_list}"
 
 		# Use Diag as the default if tianocore is not enabled
-		if ! use tianocore; then
+		if [[ -z "${have_default}" ]]; then
 			echo "0;altfw/diag;Diagnostics;System Diagnostics" \
 				>> "${bl_list}"
+			have_default=y
+			einfo "  (using Diagnostics as default)"
 		fi
 	fi
 
@@ -352,6 +362,40 @@
 	# TODO(kitching): Get hash and sign.
 }
 
+# Check whether assets will fit in the image.
+#
+# Estimate the total size of compressed assets, uncompressed assets, and the
+# compressed payload.  Warn when the size exceeds free space available in
+# RO or RW CBFS regions.  Note that this is purely informational and doesn't
+# actually trigger failure.
+#
+# Args:
+#   $1: Filename of image to add to (use serial image for best coverage)
+#   $2: Payload to add to both RO and RW regions
+check_assets() {
+	local rom="$1"
+	local payload="$2"
+
+	local payload_size=$(xz -9 -c "${payload}" | wc -c)
+
+	local rw_assets_size=$(find compressed-assets-rw "raw-assets-rw/${build_name}" -type f -print0 | du --files0-from=- -bc | tail -n1 | cut -f1)
+	local rw_size=$((rw_assets_size + payload_size))
+	local rw_free=$(($(do_cbfstool "${rom}" print -r FW_MAIN_A | awk '$1 ~ /empty/ {s+=$4} END {print s}') - payload_size))
+
+	# RW assets are also added to RO region.
+	local ro_assets_size=$(find compressed-assets-ro -type f -print0 | du --files0-from=- -bc | tail -n1 | cut -f1)
+	local ro_size=$((ro_assets_size + rw_assets_size + payload_size))
+	local ro_free=$(($(do_cbfstool "${rom}" print -r COREBOOT | awk '$1 ~ /empty/ {s+=$4} END {print s}') - payload_size))
+
+	einfo "assets (RO): $((ro_size / 1024)) KiB ($((ro_free / 1024)) KiB free) ${build_name}"
+	[[ ${ro_size} -gt ${ro_free} ]] &&
+		ewarn "WARNING: RO estimated $(((ro_size - ro_free) / 1024)) KiB over limit ${build_name}"
+
+	einfo "assets (RW): $((rw_size / 1024)) KiB ($((rw_free / 1024)) KiB free) ${build_name}"
+	[[ ${rw_size} -gt ${rw_free} ]] &&
+		ewarn "WARNING: RW estimated $(((rw_size - rw_free) / 1024)) KiB over limit ${build_name}"
+}
+
 # Add Chrome OS assets to the base and serial images:
 #       compressed-assets-ro/*   - fonts, images and screens for recovery mode
 #                                  originally from cbfs-ro-compress/*,
@@ -364,7 +408,6 @@
 #                                  used for extra wifi_sar files
 # Args:
 #  $1: Filename of image to add to
-
 add_assets() {
 	local rom="$1"
 
@@ -457,9 +500,6 @@
 		depthcharge_config="${depthcharge_prefix}/depthcharge.config"
 	fi
 
-	add_assets "${coreboot_file}"
-	add_assets "${coreboot_file}.serial"
-
 	if [[ -d ${froot}/cbfs ]]; then
 		die "something is still using ${froot}/cbfs, which is deprecated."
 	fi
@@ -492,6 +532,10 @@
 	setup_altfw "${coreboot_build_target}" "${coreboot_file}"
 	setup_altfw "${coreboot_build_target}" "${coreboot_file}.serial"
 
+	check_assets "${coreboot_file}.serial" "${depthcharge_dev}"
+	add_assets "${coreboot_file}"
+	add_assets "${coreboot_file}.serial"
+
 	build_image "" "${coreboot_file}" "${depthcharge}" "${depthcharge}"
 
 	build_image serial "${coreboot_file}.serial" \
diff --git a/sys-boot/coreboot/coreboot-0.0.1-r3775.ebuild b/sys-boot/coreboot/coreboot-0.0.1-r3775.ebuild
deleted file mode 100644
index 5646742..0000000
--- a/sys-boot/coreboot/coreboot-0.0.1-r3775.ebuild
+++ /dev/null
@@ -1,447 +0,0 @@
-# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Change this version number when any change is made to configs/files under
-# coreboot and an auto-revbump is required.
-# VERSION=REVBUMP-0.0.63
-
-EAPI=7
-CROS_WORKON_COMMIT=("e55ea5ef9a56dbfd851030c0e4c25e96db141ece" "cc52800db495d0638d217984c8f28b4f1f487301" "1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54" "1ac6d42bf336af639ae849933cbb818e51b1ffd1" "b267c3608629cd0d9807e1ccbbe32ce318823569" "ee319ae7bc59e88b60142f40a9ec1b46656de4db" "b7d5b2d6a6dd05874d86ee900ff441d261f9034c")
-CROS_WORKON_TREE=("c65d26079244f4817d23ede7296eb0e913a5dd20" "edc38485ad4fae9fb3fd2a1cdb1662f66cdec66d" "82e77f6c98187361303fffeeba118a1a365e16d5" "7db9c7a1387bc3ec0bc6b868709002e01536f5aa" "a70c71fd96de5aadf2da61ffcfa2f9cde502052b" "45d22a8711f85c4310c0c2121d3dc8a72793d375" "c0433b88f972fa26dded401be022c1c026cd644e")
-CROS_WORKON_PROJECT=(
-	"chromiumos/third_party/coreboot"
-	"chromiumos/third_party/arm-trusted-firmware"
-	"chromiumos/platform/vboot_reference"
-	"chromiumos/third_party/coreboot/amd_blobs"
-	"chromiumos/third_party/coreboot/blobs"
-	"chromiumos/third_party/coreboot/intel-microcode"
-	"chromiumos/third_party/cbootimage"
-)
-CROS_WORKON_LOCALNAME=(
-	"coreboot"
-	"arm-trusted-firmware"
-	"../platform/vboot_reference"
-	"coreboot/3rdparty/amd_blobs"
-	"coreboot/3rdparty/blobs"
-	"coreboot/3rdparty/intel-microcode"
-	"cbootimage"
-)
-CROS_WORKON_DESTDIR=(
-	"${S}"
-	"${S}/3rdparty/arm-trusted-firmware"
-	"${S}/3rdparty/vboot"
-	"${S}/3rdparty/amd_blobs"
-	"${S}/3rdparty/blobs"
-	"${S}/3rdparty/intel-microcode"
-	"${S}/util/nvidia/cbootimage"
-)
-
-CROS_WORKON_EGIT_BRANCH=(
-	"chromeos-2016.05"
-	"master"
-	"master"
-	"upstream/master"
-	"master"
-	"master"
-	"master"
-)
-
-inherit cros-board cros-workon toolchain-funcs cros-unibuild coreboot-sdk
-
-DESCRIPTION="coreboot firmware"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="*"
-IUSE="em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma"
-IUSE="${IUSE} +bmpblk +intel_mrc qca-framework quiet unibuild verbose"
-IUSE="${IUSE} amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso"
-IUSE="${IUSE} generated_cros_config"
-# coreboot's build system handles stripping the binaries and producing a
-# separate .debug file with the symbols. This flag prevents portage from
-# stripping the .debug symbols
-RESTRICT="strip"
-
-RDEPEND=""
-DEPEND="
-	!!sys-boot/coreboot-zork
-	mtc? ( sys-boot/mtc:= )
-	virtual/coreboot-private-files
-	bmpblk? ( sys-boot/chromeos-bmpblk:= )
-	intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= )
-		amd64? ( sys-boot/chromeos-mrc:= ) )
-	chipset_stoneyridge? ( sys-boot/amd-firmware:= )
-	chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= )
-	qca-framework? ( sys-boot/qca-framework:= )
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	"
-
-# Get the coreboot board config to build for.
-# Checks the current board with/without variant, and also whether an FSP
-# is in use. Echoes the board config file that should be used to build
-# coreboot.
-get_board() {
-	local board=$(get_current_board_with_variant)
-
-	if [[ ! -s "${FILESDIR}/configs/config.${board}" ]]; then
-		board=$(get_current_board_no_variant)
-	fi
-	echo "${board}"
-}
-
-set_build_env() {
-	BOARD="$1"
-	BUILD_TARGET_NAME="$2"
-
-	if use unibuild; then
-		CONFIG=".config-${BOARD}"
-		CONFIG_SERIAL=".config_serial-${BOARD}"
-		BUILD_DIR="build-${BUILD_TARGET_NAME}"
-		BUILD_DIR_SERIAL="build_serial-${BUILD_TARGET_NAME}"
-	else
-		CONFIG=".config"
-		CONFIG_SERIAL=".config_serial"
-		BUILD_DIR="build"
-		BUILD_DIR_SERIAL="build_serial"
-	fi
-}
-
-# Create the coreboot configuration files for a particular board. This
-# creates a standard config and a serial config.
-# Args:
-#   $1: Base board name, if any (used for unified builds)
-create_config() {
-	# TODO(teravest): Remove this arg and replace with family lookup.
-	local base_board="$1"
-
-	if [[ -s "${FILESDIR}/configs/config.${BOARD}" ]]; then
-
-		cp -v "${FILESDIR}/configs/config.${BOARD}" "${CONFIG}"
-		# handle the case when "${CONFIG}" does not have a newline in the end.
-		echo >> "${CONFIG}"
-
-		# Override mainboard vendor if needed.
-		if [[ -n "${SYSTEM_OEM}" ]]; then
-			echo "CONFIG_MAINBOARD_VENDOR=\"${SYSTEM_OEM}\"" >> "${CONFIG}"
-		fi
-		if [[ -n "${SYSTEM_OEM_VENDOR_ID}" ]]; then
-			echo "CONFIG_SUBSYSTEM_VENDOR_ID=${SYSTEM_OEM_VENDOR_ID}" >> "${CONFIG}"
-		fi
-		if [[ -n "${SYSTEM_OEM_DEVICE_ID}" ]]; then
-			echo "CONFIG_SUBSYSTEM_DEVICE_ID=${SYSTEM_OEM_DEVICE_ID}" >> "${CONFIG}"
-		fi
-		if [[ -n "${SYSTEM_OEM_ACPI_ID}" ]]; then
-			echo "CONFIG_ACPI_SUBSYSTEM_ID=\"${SYSTEM_OEM_ACPI_ID}\"" >> "${CONFIG}"
-		fi
-
-		# In case config comes from a symlink we are likely building
-		# for an overlay not matching this config name. Enable adding
-		# a CBFS based board ID for coreboot.
-		if [[ -L "${FILESDIR}/configs/config.${BOARD}" ]]; then
-			echo "CONFIG_BOARD_ID_MANUAL=y" >> "${CONFIG}"
-			echo "CONFIG_BOARD_ID_STRING=\"${BOARD_USE}\"" >> "${CONFIG}"
-		fi
-	else
-		ewarn "Could not find existing config for ${BOARD}."
-	fi
-
-	if use rmt; then
-		echo "CONFIG_MRC_RMT=y" >> "${CONFIG}"
-	fi
-	if use vmx; then
-		elog "   - enabling VMX"
-		echo "CONFIG_ENABLE_VMX=y" >> "${CONFIG}"
-	fi
-	if use quiet-cb; then
-		# Suppress console spew if requested.
-		cat >> "${CONFIG}" <<EOF
-CONFIG_DEFAULT_CONSOLE_LOGLEVEL=3
-# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set
-CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3=y
-EOF
-	fi
-	if use mocktpm; then
-		echo "CONFIG_VBOOT_MOCK_SECDATA=y" >> "${CONFIG}"
-	fi
-	if use mma; then
-		echo "CONFIG_MMA=y" >> "${CONFIG}"
-	fi
-
-	# allow using non-coreboot toolchains unless we use it anyway
-	if ! use coreboot-sdk; then
-		echo "CONFIG_ANY_TOOLCHAIN=y" >> "${CONFIG}"
-	fi
-	# disable coreboot's own EC firmware building mechanism
-	echo "CONFIG_EC_GOOGLE_CHROMEEC_FIRMWARE_NONE=y" >> "${CONFIG}"
-	echo "CONFIG_EC_GOOGLE_CHROMEEC_PD_FIRMWARE_NONE=y" >> "${CONFIG}"
-	# enable common GBB flags for development
-	echo "CONFIG_GBB_FLAG_DEV_SCREEN_SHORT_DELAY=y" >> "${CONFIG}"
-	echo "CONFIG_GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK=y" >> "${CONFIG}"
-	echo "CONFIG_GBB_FLAG_FORCE_DEV_BOOT_USB=y" >> "${CONFIG}"
-	echo "CONFIG_GBB_FLAG_FORCE_DEV_SWITCH_ON=y" >> "${CONFIG}"
-	local version=$(${CHROOT_SOURCE_ROOT}/src/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh |grep "^[[:space:]]*CHROMEOS_VERSION_STRING=" |cut -d= -f2)
-	echo "CONFIG_VBOOT_FWID_VERSION=\".${version}\"" >> "${CONFIG}"
-	if use em100-mode; then
-		einfo "Enabling em100 mode via CONFIG_EM100 (slower SPI flash)"
-		echo "CONFIG_EM100=y" >> "${CONFIG}"
-	fi
-	# Use FSP's GOP in favor of coreboot's Ada based Intel graphics init
-	# which we don't include at this time. A no-op on non-FSP/GOP devices.
-	echo "CONFIG_RUN_FSP_GOP=y" >> "${CONFIG}"
-
-	cp "${CONFIG}" "${CONFIG_SERIAL}"
-	file="${FILESDIR}/configs/fwserial.${BOARD}"
-	if [ ! -f "${file}" ] && [ -n "${base_board}" ]; then
-		file="${FILESDIR}/configs/fwserial.${base_board}"
-	fi
-	if [ ! -f "${file}" ]; then
-		file="${FILESDIR}/configs/fwserial.default"
-	fi
-	cat "${file}" >> "${CONFIG_SERIAL}" || die
-	# handle the case when "${CONFIG_SERIAL}" does not have a newline in the end.
-	echo >> "${CONFIG_SERIAL}"
-
-	einfo "Configured ${CONFIG} for board ${BOARD} in ${BUILD_DIR}"
-}
-
-src_prepare() {
-	local froot="${SYSROOT}/firmware"
-	local privdir="${SYSROOT}/firmware/coreboot-private"
-	local file
-
-	default
-
-	if [[ -d "${privdir}" ]]; then
-		while read -d $'\0' -r file; do
-			rsync --recursive --links --executability \
-				"${file}" ./ || die
-		done < <(find "${privdir}" -maxdepth 1 -mindepth 1 -print0)
-	fi
-
-	for blob in mrc.bin mrc.elf efi.elf; do
-		if [[ -r "${SYSROOT}/firmware/${blob}" ]]; then
-			cp "${SYSROOT}/firmware/${blob}" 3rdparty/blobs/
-		fi
-	done
-
-	cp -a "${FILESDIR}/3rdparty/"* 3rdparty
-
-	if use unibuild; then
-		local build_target
-
-		local fields="coreboot,ec"
-		local cmd="get-firmware-build-combinations"
-		(cros_config_host "${cmd}" "${fields}" || die) |
-		while read -r name; do
-			read -r coreboot
-			read -r ec
-			set_build_env "${coreboot}" "${name}"
-			create_config "$(get_board)"
-		done
-	else
-		set_build_env "$(get_board)"
-		create_config
-	fi
-}
-
-add_fw_blob() {
-	local rom="$1"
-	local cbname="$2"
-	local blob="$3"
-	local cbhash="${cbname%.bin}.hash"
-	local hash="${blob%.bin}.hash"
-
-	cbfstool "${rom}" add -r FW_MAIN_A,FW_MAIN_B -t raw -c lzma \
-		-f "${blob}" -n "${cbname}" || die
-	cbfstool "${rom}" add -r FW_MAIN_A,FW_MAIN_B -t raw -c none \
-		-f "${hash}" -n "${cbhash}" || die
-}
-
-# Build coreboot with a supplied configuration and output directory.
-#   $1: Build directory to use (e.g. "build_serial")
-#   $2: Config file to use (e.g. ".config_serial")
-#   $3: Build target build (e.g. "pyro"), for USE=unibuild only.
-make_coreboot() {
-	local builddir="$1"
-	local config_fname="$2"
-	local build_target="$3"
-	local froot="${SYSROOT}/firmware"
-	local fblobroot="${SYSROOT}/firmware"
-
-	if use unibuild; then
-		froot+="/${build_target}"
-	fi
-	rm -rf "${builddir}" .xcompile
-
-	local CB_OPTS=( "DOTCONFIG=${config_fname}" )
-	use quiet && CB_OPTS+=( "V=0" )
-	use verbose && CB_OPTS+=( "V=1" )
-	use quiet && REDIR="/dev/null" || REDIR="/dev/stdout"
-
-	# Configure and build coreboot.
-	yes "" | emake oldconfig "${CB_OPTS[@]}" obj="${builddir}" >${REDIR}
-	if grep -q "CONFIG_VENDOR_EMULATION=y" "${config_fname}"; then
-		local config_file
-		config_file="${FILESDIR}/configs/config.$(get_board)"
-		die "Working with a default configuration. ${config_file} incorrect?"
-	fi
-	emake "${CB_OPTS[@]}" obj="${builddir}" HOSTCC="$(tc-getBUILD_CC)" \
-		HOSTPKGCONFIG="$(tc-getBUILD_PKG_CONFIG)"
-
-	# Expand FW_MAIN_* since we might add some files
-	cbfstool "${builddir}/coreboot.rom" expand -r FW_MAIN_A,FW_MAIN_B
-
-	# Record the config that we used.
-	cp "${config_fname}" "${builddir}/${config_fname}"
-
-	# Modify firmware descriptor if building for the EM100 emulator on
-	# Intel platforms.
-	# TODO(crbug.com/863396): Should we have an 'intel' USE flag? Do we
-	# still have any Intel platforms that don't use ifdtool?
-	if ! use amd_cpu && use em100-mode; then
-		einfo "Enabling em100 mode via ifdttool (slower SPI flash)"
-		ifdtool --em100 "${builddir}/coreboot.rom" || die
-		mv "${builddir}/coreboot.rom"{.new,} || die
-	fi
-
-	local blob
-	local cbname
-	for blob in ${FW_BLOBS}; do
-		local blobfile="${fblobroot}/${blob}"
-
-		# Use per-board blob if available
-		if use unibuild && [[ -e "${froot}/${blob}" ]]; then
-			blobfile="${froot}/${blob}"
-		fi
-
-		cbname=$(basename "${blob}")
-		add_fw_blob "${builddir}/coreboot.rom" "${cbname}" \
-			"${blobfile}" || die
-	done
-
-	if [ -d ${froot}/cbfs ]; then
-		die "something is still using ${froot}/cbfs, which is deprecated."
-	fi
-}
-
-src_compile() {
-	# Set KERNELREVISION (really coreboot revision) to the ebuild revision
-	# number followed by a dot and the first seven characters of the git
-	# hash. The name is confusing but consistent with the coreboot
-	# Makefile.
-	local sha1v="${VCSID/*-/}"
-	export KERNELREVISION=".${PV}.${sha1v:0:7}"
-
-	if ! use coreboot-sdk; then
-		tc-export CC
-		# Export the known cross compilers so there isn't a reliance
-		# on what the default profile is for exporting a compiler. The
-		# reasoning is that the firmware may need more than one to build
-		# and boot.
-		export CROSS_COMPILE_x86="i686-pc-linux-gnu-"
-		export CROSS_COMPILE_mipsel="mipsel-cros-linux-gnu-"
-		export CROSS_COMPILE_arm64="aarch64-cros-linux-gnu-"
-		export CROSS_COMPILE_arm="armv7a-cros-linux-gnu- armv7a-cros-linux-gnueabihf-"
-	else
-		export CROSS_COMPILE_x86=${COREBOOT_SDK_PREFIX_x86_32}
-		export CROSS_COMPILE_mipsel=${COREBOOT_SDK_PREFIX_mips}
-		export CROSS_COMPILE_arm64=${COREBOOT_SDK_PREFIX_arm64}
-		export CROSS_COMPILE_arm=${COREBOOT_SDK_PREFIX_arm}
-
-		export PATH=/opt/coreboot-sdk/bin:$PATH
-	fi
-
-	use verbose && elog "Toolchain:\n$(sh util/xcompile/xcompile)\n"
-
-	if use unibuild; then
-		local fields="coreboot"
-		local cmd="get-firmware-build-combinations"
-		(cros_config_host "${cmd}" "${fields}" || die) |
-		while read -r name; do
-			read -r coreboot
-
-			set_build_env "${coreboot}" "${name}"
-			make_coreboot "${BUILD_DIR}" "${CONFIG}" "${name}"
-
-			# Build a second ROM with serial support for developers.
-			make_coreboot "${BUILD_DIR_SERIAL}" "${CONFIG_SERIAL}" "${name}"
-		done
-	else
-		set_build_env "$(get_board)"
-		make_coreboot "${BUILD_DIR}" "${CONFIG}"
-
-		# Build a second ROM with serial support for developers.
-		make_coreboot "${BUILD_DIR_SERIAL}" "${CONFIG_SERIAL}"
-	fi
-}
-
-do_install() {
-	local build_target="$1"
-	local dest_dir="/firmware"
-	local mapfile
-
-	if [[ -n "${build_target}" ]]; then
-		dest_dir+="/${build_target}"
-		einfo "Installing coreboot ${build_target} into ${dest_dir}"
-	fi
-	insinto "${dest_dir}"
-
-	newins "${BUILD_DIR}/coreboot.rom" coreboot.rom
-	newins "${BUILD_DIR_SERIAL}/coreboot.rom" coreboot.rom.serial
-
-	local config_file="${FILESDIR}/configs/config.$(get_board)"
-	OPROM=$( awk 'BEGIN{FS="\""} /CONFIG_VGA_BIOS_FILE=/ { print $2 }' \
-		"${config_file}" )
-	CBFSOPROM=pci$( awk 'BEGIN{FS="\""} /CONFIG_VGA_BIOS_ID=/ { print $2 }' \
-		"${config_file}" ).rom
-	FSP=$( awk 'BEGIN{FS="\""} /CONFIG_FSP_FILE=/ { print $2 }' \
-		"${config_file}" )
-	if [[ -n "${FSP}" ]]; then
-		newins ${FSP} fsp.bin
-	fi
-	if [[ -n "${OPROM}" ]]; then
-		newins ${OPROM} ${CBFSOPROM}
-	fi
-	if use memmaps; then
-		for mapfile in "${BUILD_DIR}"/cbfs/fallback/*.map
-		do
-			doins $mapfile
-		done
-	fi
-	newins "${BUILD_DIR}/${CONFIG}" coreboot.config
-	newins "${BUILD_DIR_SERIAL}/${CONFIG_SERIAL}" coreboot_serial.config
-
-	# Keep binaries with debug symbols around for crash dump analysis
-	if [[ -s "${BUILD_DIR}/bl31.elf" ]]; then
-		newins "${BUILD_DIR}/bl31.elf" bl31.elf
-		newins "${BUILD_DIR_SERIAL}/bl31.elf" bl31.serial.elf
-	fi
-	insinto "${dest_dir}"/coreboot
-	doins "${BUILD_DIR}"/cbfs/fallback/*.debug
-	nonfatal doins "${BUILD_DIR}"/cbfs/fallback/bootblock.bin
-	insinto "${dest_dir}"/coreboot_serial
-	doins "${BUILD_DIR_SERIAL}"/cbfs/fallback/*.debug
-	nonfatal doins "${BUILD_DIR_SERIAL}"/cbfs/fallback/bootblock.bin
-}
-
-src_install() {
-	local build_target
-
-	if use unibuild; then
-		local fields="coreboot,ec"
-		local cmd="get-firmware-build-combinations"
-		(cros_config_host "${cmd}" "${fields}" || die) |
-		while read -r name; do
-			read -r coreboot
-			read -r ec
-
-			set_build_env "${coreboot}" "${name}"
-			do_install ${coreboot}
-		done
-	else
-		set_build_env
-		do_install
-	fi
-}
diff --git a/sys-boot/coreboot/coreboot-0.0.1-r3956.ebuild b/sys-boot/coreboot/coreboot-0.0.1-r3956.ebuild
new file mode 100644
index 0000000..f76ff14
--- /dev/null
+++ b/sys-boot/coreboot/coreboot-0.0.1-r3956.ebuild
@@ -0,0 +1,448 @@
+# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Change this version number when any change is made to configs/files under
+# coreboot and an auto-revbump is required.
+# VERSION=REVBUMP-0.0.65
+
+EAPI=7
+CROS_WORKON_COMMIT=("5148aeb85e2a785227ff74b7d15cd533e3b4a455" "1aabb74fae0e30901884b6cb230d7ea730a74344" "524012c64c07f8673998428cca7f80e01a387f48" "370e4c4cacd3d71ec54f782a83a287d6219a3d8e" "96ae35c462d903d6940d982e61bea697103b7af6" "ee319ae7bc59e88b60142f40a9ec1b46656de4db" "b7d5b2d6a6dd05874d86ee900ff441d261f9034c")
+CROS_WORKON_TREE=("819d1e4534d9036bca2118f64bff6ec92f5ca5ce" "49214f6120941983c5ce7ffcf8745a80bdf52409" "d011d454951af2d6dbcf7d4dc7af53a31cc883db" "91e1fb678750ee8eb87ae5b06f6f94266e1e172d" "8d8bb99f1cdba36cb07d90dd89bcfb25bae62437" "45d22a8711f85c4310c0c2121d3dc8a72793d375" "c0433b88f972fa26dded401be022c1c026cd644e")
+CROS_WORKON_PROJECT=(
+	"chromiumos/third_party/coreboot"
+	"chromiumos/third_party/arm-trusted-firmware"
+	"chromiumos/platform/vboot_reference"
+	"chromiumos/third_party/coreboot/amd_blobs"
+	"chromiumos/third_party/coreboot/blobs"
+	"chromiumos/third_party/coreboot/intel-microcode"
+	"chromiumos/third_party/cbootimage"
+)
+CROS_WORKON_LOCALNAME=(
+	"coreboot"
+	"arm-trusted-firmware"
+	"../platform/vboot_reference"
+	"coreboot/3rdparty/amd_blobs"
+	"coreboot/3rdparty/blobs"
+	"coreboot/3rdparty/intel-microcode"
+	"cbootimage"
+)
+CROS_WORKON_DESTDIR=(
+	"${S}"
+	"${S}/3rdparty/arm-trusted-firmware"
+	"${S}/3rdparty/vboot"
+	"${S}/3rdparty/amd_blobs"
+	"${S}/3rdparty/blobs"
+	"${S}/3rdparty/intel-microcode"
+	"${S}/util/nvidia/cbootimage"
+)
+
+CROS_WORKON_EGIT_BRANCH=(
+	"chromeos-2016.05"
+	"master"
+	"master"
+	"chromeos"
+	"master"
+	"master"
+	"master"
+)
+
+inherit cros-board cros-workon toolchain-funcs cros-unibuild coreboot-sdk
+
+DESCRIPTION="coreboot firmware"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="*"
+IUSE="em100-mode fsp memmaps mocktpm quiet-cb rmt vmx mtc mma"
+IUSE="${IUSE} +bmpblk +intel_mrc qca-framework quiet unibuild verbose"
+IUSE="${IUSE} amd_cpu coreboot-sdk chipset_stoneyridge chipset_picasso"
+IUSE="${IUSE} generated_cros_config"
+# coreboot's build system handles stripping the binaries and producing a
+# separate .debug file with the symbols. This flag prevents portage from
+# stripping the .debug symbols
+RESTRICT="strip"
+
+RDEPEND=""
+DEPEND="
+	mtc? ( sys-boot/mtc:= )
+	virtual/coreboot-private-files
+	bmpblk? ( sys-boot/chromeos-bmpblk:= )
+	intel_mrc? ( x86? ( sys-boot/chromeos-mrc:= )
+		amd64? ( sys-boot/chromeos-mrc:= ) )
+	chipset_stoneyridge? ( sys-boot/amd-firmware:= )
+	chipset_picasso? ( >=sys-boot/amd-picasso-fsp-0.0.2:= )
+	qca-framework? ( sys-boot/qca-framework:= )
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	"
+
+# Get the coreboot board config to build for.
+# Checks the current board with/without variant, and also whether an FSP
+# is in use. Echoes the board config file that should be used to build
+# coreboot.
+get_board() {
+	local board=$(get_current_board_with_variant)
+
+	if [[ ! -s "${FILESDIR}/configs/config.${board}" ]]; then
+		board=$(get_current_board_no_variant)
+	fi
+	echo "${board}"
+}
+
+set_build_env() {
+	BOARD="$1"
+	BUILD_TARGET_NAME="$2"
+
+	if use unibuild; then
+		CONFIG=".config-${BOARD}"
+		CONFIG_SERIAL=".config_serial-${BOARD}"
+		BUILD_DIR="build-${BUILD_TARGET_NAME}"
+		BUILD_DIR_SERIAL="build_serial-${BUILD_TARGET_NAME}"
+	else
+		CONFIG=".config"
+		CONFIG_SERIAL=".config_serial"
+		BUILD_DIR="build"
+		BUILD_DIR_SERIAL="build_serial"
+	fi
+}
+
+# Create the coreboot configuration files for a particular board. This
+# creates a standard config and a serial config.
+# Args:
+#   $1: Base board name, if any (used for unified builds)
+create_config() {
+	# TODO(teravest): Remove this arg and replace with family lookup.
+	local base_board="$1"
+
+	if [[ -s "${FILESDIR}/configs/config.${BOARD}" ]]; then
+
+		cp -v "${FILESDIR}/configs/config.${BOARD}" "${CONFIG}"
+		# handle the case when "${CONFIG}" does not have a newline in the end.
+		echo >> "${CONFIG}"
+
+		# Override mainboard vendor if needed.
+		if [[ -n "${SYSTEM_OEM}" ]]; then
+			echo "CONFIG_MAINBOARD_VENDOR=\"${SYSTEM_OEM}\"" >> "${CONFIG}"
+		fi
+		if [[ -n "${SYSTEM_OEM_VENDOR_ID}" ]]; then
+			echo "CONFIG_SUBSYSTEM_VENDOR_ID=${SYSTEM_OEM_VENDOR_ID}" >> "${CONFIG}"
+		fi
+		if [[ -n "${SYSTEM_OEM_DEVICE_ID}" ]]; then
+			echo "CONFIG_SUBSYSTEM_DEVICE_ID=${SYSTEM_OEM_DEVICE_ID}" >> "${CONFIG}"
+		fi
+		if [[ -n "${SYSTEM_OEM_ACPI_ID}" ]]; then
+			echo "CONFIG_ACPI_SUBSYSTEM_ID=\"${SYSTEM_OEM_ACPI_ID}\"" >> "${CONFIG}"
+		fi
+
+		# In case config comes from a symlink we are likely building
+		# for an overlay not matching this config name. Enable adding
+		# a CBFS based board ID for coreboot.
+		if [[ -L "${FILESDIR}/configs/config.${BOARD}" ]]; then
+			echo "CONFIG_BOARD_ID_MANUAL=y" >> "${CONFIG}"
+			echo "CONFIG_BOARD_ID_STRING=\"${BOARD_USE}\"" >> "${CONFIG}"
+		fi
+	else
+		ewarn "Could not find existing config for ${BOARD}."
+	fi
+
+	if use rmt; then
+		echo "CONFIG_MRC_RMT=y" >> "${CONFIG}"
+	fi
+	if use vmx; then
+		elog "   - enabling VMX"
+		echo "CONFIG_ENABLE_VMX=y" >> "${CONFIG}"
+	fi
+	if use quiet-cb; then
+		# Suppress console spew if requested.
+		cat >> "${CONFIG}" <<EOF
+CONFIG_DEFAULT_CONSOLE_LOGLEVEL=3
+# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set
+CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3=y
+EOF
+	fi
+	if use mocktpm; then
+		echo "CONFIG_VBOOT_MOCK_SECDATA=y" >> "${CONFIG}"
+	fi
+	if use mma; then
+		echo "CONFIG_MMA=y" >> "${CONFIG}"
+	fi
+
+	# allow using non-coreboot toolchains unless we use it anyway
+	if ! use coreboot-sdk; then
+		echo "CONFIG_ANY_TOOLCHAIN=y" >> "${CONFIG}"
+	fi
+	# disable coreboot's own EC firmware building mechanism
+	echo "CONFIG_EC_GOOGLE_CHROMEEC_FIRMWARE_NONE=y" >> "${CONFIG}"
+	echo "CONFIG_EC_GOOGLE_CHROMEEC_PD_FIRMWARE_NONE=y" >> "${CONFIG}"
+	# enable common GBB flags for development
+	echo "CONFIG_GBB_FLAG_DEV_SCREEN_SHORT_DELAY=y" >> "${CONFIG}"
+	echo "CONFIG_GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK=y" >> "${CONFIG}"
+	echo "CONFIG_GBB_FLAG_FORCE_DEV_BOOT_USB=y" >> "${CONFIG}"
+	echo "CONFIG_GBB_FLAG_FORCE_DEV_SWITCH_ON=y" >> "${CONFIG}"
+	local version=$(${CHROOT_SOURCE_ROOT}/src/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh |grep "^[[:space:]]*CHROMEOS_VERSION_STRING=" |cut -d= -f2)
+	echo "CONFIG_VBOOT_FWID_VERSION=\".${version}\"" >> "${CONFIG}"
+	if use em100-mode; then
+		einfo "Enabling em100 mode via CONFIG_EM100 (slower SPI flash)"
+		echo "CONFIG_EM100=y" >> "${CONFIG}"
+	fi
+	# Use FSP's GOP in favor of coreboot's Ada based Intel graphics init
+	# which we don't include at this time. A no-op on non-FSP/GOP devices.
+	echo "CONFIG_RUN_FSP_GOP=y" >> "${CONFIG}"
+
+	cp "${CONFIG}" "${CONFIG_SERIAL}"
+	file="${FILESDIR}/configs/fwserial.${BOARD}"
+	if [ ! -f "${file}" ] && [ -n "${base_board}" ]; then
+		file="${FILESDIR}/configs/fwserial.${base_board}"
+	fi
+	if [ ! -f "${file}" ]; then
+		file="${FILESDIR}/configs/fwserial.default"
+	fi
+	cat "${file}" >> "${CONFIG_SERIAL}" || die
+	# handle the case when "${CONFIG_SERIAL}" does not have a newline in the end.
+	echo >> "${CONFIG_SERIAL}"
+
+	einfo "Configured ${CONFIG} for board ${BOARD} in ${BUILD_DIR}"
+}
+
+src_prepare() {
+	local froot="${SYSROOT}/firmware"
+	local privdir="${SYSROOT}/firmware/coreboot-private"
+	local file
+
+	default
+
+	if [[ -d "${privdir}" ]]; then
+		while read -d $'\0' -r file; do
+			rsync --recursive --links --executability \
+				"${file}" ./ || die
+		done < <(find "${privdir}" -maxdepth 1 -mindepth 1 -print0)
+	fi
+
+	for blob in mrc.bin mrc.elf efi.elf; do
+		if [[ -r "${SYSROOT}/firmware/${blob}" ]]; then
+			cp "${SYSROOT}/firmware/${blob}" 3rdparty/blobs/
+		fi
+	done
+
+	cp -a "${FILESDIR}/3rdparty/"* 3rdparty
+
+	if use unibuild; then
+		local build_target
+
+		local fields="coreboot"
+		local cmd="get-firmware-build-combinations"
+		(cros_config_host "${cmd}" "${fields}" || die) |
+		while read -r name; do
+			read -r coreboot
+			set_build_env "${coreboot}" "${name}"
+			create_config "$(get_board)"
+		done
+	else
+		set_build_env "$(get_board)"
+		create_config
+	fi
+}
+
+add_fw_blob() {
+	local rom="$1"
+	local cbname="$2"
+	local blob="$3"
+	local cbhash="${cbname%.bin}.hash"
+	local hash="${blob%.bin}.hash"
+
+	cbfstool "${rom}" add -r FW_MAIN_A,FW_MAIN_B -t raw -c lzma \
+		-f "${blob}" -n "${cbname}" || die
+	cbfstool "${rom}" add -r FW_MAIN_A,FW_MAIN_B -t raw -c none \
+		-f "${hash}" -n "${cbhash}" || die
+}
+
+# Build coreboot with a supplied configuration and output directory.
+#   $1: Build directory to use (e.g. "build_serial")
+#   $2: Config file to use (e.g. ".config_serial")
+#   $3: Build target build (e.g. "pyro"), for USE=unibuild only.
+make_coreboot() {
+	local builddir="$1"
+	local config_fname="$2"
+	local build_target="$3"
+	local froot="${SYSROOT}/firmware"
+	local fblobroot="${SYSROOT}/firmware"
+
+	if use unibuild; then
+		froot+="/${build_target}"
+	fi
+	rm -rf "${builddir}" .xcompile
+
+	local CB_OPTS=( "DOTCONFIG=${config_fname}" )
+	use quiet && CB_OPTS+=( "V=0" )
+	use verbose && CB_OPTS+=( "V=1" )
+	use quiet && REDIR="/dev/null" || REDIR="/dev/stdout"
+
+	# Configure and build coreboot.
+	yes "" | emake oldconfig "${CB_OPTS[@]}" obj="${builddir}" >${REDIR}
+	if grep -q "CONFIG_VENDOR_EMULATION=y" "${config_fname}"; then
+		local config_file
+		config_file="${FILESDIR}/configs/config.$(get_board)"
+		die "Working with a default configuration. ${config_file} incorrect?"
+	fi
+	emake "${CB_OPTS[@]}" obj="${builddir}" HOSTCC="$(tc-getBUILD_CC)" \
+		HOSTPKGCONFIG="$(tc-getBUILD_PKG_CONFIG)"
+
+	# Expand FW_MAIN_* since we might add some files
+	cbfstool "${builddir}/coreboot.rom" expand -r FW_MAIN_A,FW_MAIN_B
+
+	# Record the config that we used.
+	cp "${config_fname}" "${builddir}/${config_fname}"
+
+	# Modify firmware descriptor if building for the EM100 emulator on
+	# Intel platforms.
+	# TODO(crbug.com/863396): Should we have an 'intel' USE flag? Do we
+	# still have any Intel platforms that don't use ifdtool?
+	if ! use amd_cpu && use em100-mode; then
+		einfo "Enabling em100 mode via ifdttool (slower SPI flash)"
+		ifdtool --em100 "${builddir}/coreboot.rom" || die
+		mv "${builddir}/coreboot.rom"{.new,} || die
+	fi
+
+	local blob
+	local cbname
+	for blob in ${FW_BLOBS}; do
+		local blobfile="${fblobroot}/${blob}"
+
+		# Use per-board blob if available
+		if use unibuild && [[ -e "${froot}/${blob}" ]]; then
+			blobfile="${froot}/${blob}"
+		fi
+
+		cbname=$(basename "${blob}")
+		add_fw_blob "${builddir}/coreboot.rom" "${cbname}" \
+			"${blobfile}" || die
+	done
+
+	if [ -d ${froot}/cbfs ]; then
+		die "something is still using ${froot}/cbfs, which is deprecated."
+	fi
+}
+
+src_compile() {
+	# Set KERNELREVISION (really coreboot revision) to the ebuild revision
+	# number followed by a dot and the first seven characters of the git
+	# hash. The name is confusing but consistent with the coreboot
+	# Makefile.
+	local sha1v="${VCSID/*-/}"
+	export KERNELREVISION=".${PV}.${sha1v:0:7}"
+
+	if ! use coreboot-sdk; then
+		tc-export CC
+		# Export the known cross compilers so there isn't a reliance
+		# on what the default profile is for exporting a compiler. The
+		# reasoning is that the firmware may need more than one to build
+		# and boot.
+		export CROSS_COMPILE_x86="i686-pc-linux-gnu-"
+		export CROSS_COMPILE_mipsel="mipsel-cros-linux-gnu-"
+		export CROSS_COMPILE_arm64="aarch64-cros-linux-gnu-"
+		export CROSS_COMPILE_arm="armv7a-cros-linux-gnu- armv7a-cros-linux-gnueabihf-"
+	else
+		export CROSS_COMPILE_x86=${COREBOOT_SDK_PREFIX_x86_32}
+		export CROSS_COMPILE_mipsel=${COREBOOT_SDK_PREFIX_mips}
+		export CROSS_COMPILE_arm64=${COREBOOT_SDK_PREFIX_arm64}
+		export CROSS_COMPILE_arm=${COREBOOT_SDK_PREFIX_arm}
+
+		export PATH=/opt/coreboot-sdk/bin:$PATH
+	fi
+
+	use verbose && elog "Toolchain:\n$(sh util/xcompile/xcompile)\n"
+
+	if use unibuild; then
+		local fields="coreboot"
+		local cmd="get-firmware-build-combinations"
+		(cros_config_host "${cmd}" "${fields}" || die) |
+		while read -r name; do
+			read -r coreboot
+
+			set_build_env "${coreboot}" "${name}"
+			make_coreboot "${BUILD_DIR}" "${CONFIG}" "${name}"
+
+			# Build a second ROM with serial support for developers.
+			make_coreboot "${BUILD_DIR_SERIAL}" "${CONFIG_SERIAL}" "${name}"
+		done
+	else
+		set_build_env "$(get_board)"
+		make_coreboot "${BUILD_DIR}" "${CONFIG}"
+
+		# Build a second ROM with serial support for developers.
+		make_coreboot "${BUILD_DIR_SERIAL}" "${CONFIG_SERIAL}"
+	fi
+}
+
+do_install() {
+	local build_target="$1"
+	local dest_dir="/firmware"
+	local mapfile
+
+	if [[ -n "${build_target}" ]]; then
+		dest_dir+="/${build_target}"
+		einfo "Installing coreboot ${build_target} into ${dest_dir}"
+	fi
+	insinto "${dest_dir}"
+
+	newins "${BUILD_DIR}/coreboot.rom" coreboot.rom
+	newins "${BUILD_DIR_SERIAL}/coreboot.rom" coreboot.rom.serial
+
+	local config_file="${FILESDIR}/configs/config.$(get_board)"
+	OPROM=$( awk 'BEGIN{FS="\""} /CONFIG_VGA_BIOS_FILE=/ { print $2 }' \
+		"${config_file}" )
+	CBFSOPROM=pci$( awk 'BEGIN{FS="\""} /CONFIG_VGA_BIOS_ID=/ { print $2 }' \
+		"${config_file}" ).rom
+	FSP=$( awk 'BEGIN{FS="\""} /CONFIG_FSP_FILE=/ { print $2 }' \
+		"${config_file}" )
+	if [[ -n "${FSP}" ]]; then
+		newins ${FSP} fsp.bin
+	fi
+	# Save the psp_verstage binary for signing on AMD Fam17h platforms
+	if [[ -e "${BUILD_DIR}/psp_verstage.bin" ]]; then
+		newins "${BUILD_DIR}/psp_verstage.bin" psp_verstage.bin
+	fi
+	if [[ -n "${OPROM}" ]]; then
+		newins ${OPROM} ${CBFSOPROM}
+	fi
+	if use memmaps; then
+		for mapfile in "${BUILD_DIR}"/cbfs/fallback/*.map
+		do
+			doins $mapfile
+		done
+	fi
+	newins "${BUILD_DIR}/${CONFIG}" coreboot.config
+	newins "${BUILD_DIR_SERIAL}/${CONFIG_SERIAL}" coreboot_serial.config
+
+	# Keep binaries with debug symbols around for crash dump analysis
+	if [[ -s "${BUILD_DIR}/bl31.elf" ]]; then
+		newins "${BUILD_DIR}/bl31.elf" bl31.elf
+		newins "${BUILD_DIR_SERIAL}/bl31.elf" bl31.serial.elf
+	fi
+	insinto "${dest_dir}"/coreboot
+	doins "${BUILD_DIR}"/cbfs/fallback/*.debug
+	nonfatal doins "${BUILD_DIR}"/cbfs/fallback/bootblock.bin
+	insinto "${dest_dir}"/coreboot_serial
+	doins "${BUILD_DIR_SERIAL}"/cbfs/fallback/*.debug
+	nonfatal doins "${BUILD_DIR_SERIAL}"/cbfs/fallback/bootblock.bin
+}
+
+src_install() {
+	local build_target
+
+	if use unibuild; then
+		local fields="coreboot"
+		local cmd="get-firmware-build-combinations"
+		(cros_config_host "${cmd}" "${fields}" || die) |
+		while read -r name; do
+			read -r coreboot
+
+			set_build_env "${coreboot}" "${name}"
+			do_install ${coreboot}
+		done
+	else
+		set_build_env
+		do_install
+	fi
+}
diff --git a/sys-boot/coreboot/coreboot-9999.ebuild b/sys-boot/coreboot/coreboot-9999.ebuild
index e0d4003ba..77e6f13 100644
--- a/sys-boot/coreboot/coreboot-9999.ebuild
+++ b/sys-boot/coreboot/coreboot-9999.ebuild
@@ -3,7 +3,7 @@
 
 # Change this version number when any change is made to configs/files under
 # coreboot and an auto-revbump is required.
-# VERSION=REVBUMP-0.0.63
+# VERSION=REVBUMP-0.0.65
 
 EAPI=7
 CROS_WORKON_PROJECT=(
@@ -38,7 +38,7 @@
 	"chromeos-2016.05"
 	"master"
 	"master"
-	"upstream/master"
+	"chromeos"
 	"master"
 	"master"
 	"master"
@@ -61,7 +61,6 @@
 
 RDEPEND=""
 DEPEND="
-	!!sys-boot/coreboot-zork
 	mtc? ( sys-boot/mtc:= )
 	virtual/coreboot-private-files
 	bmpblk? ( sys-boot/chromeos-bmpblk:= )
@@ -229,12 +228,11 @@
 	if use unibuild; then
 		local build_target
 
-		local fields="coreboot,ec"
+		local fields="coreboot"
 		local cmd="get-firmware-build-combinations"
 		(cros_config_host "${cmd}" "${fields}" || die) |
 		while read -r name; do
 			read -r coreboot
-			read -r ec
 			set_build_env "${coreboot}" "${name}"
 			create_config "$(get_board)"
 		done
@@ -399,6 +397,10 @@
 	if [[ -n "${FSP}" ]]; then
 		newins ${FSP} fsp.bin
 	fi
+	# Save the psp_verstage binary for signing on AMD Fam17h platforms
+	if [[ -e "${BUILD_DIR}/psp_verstage.bin" ]]; then
+		newins "${BUILD_DIR}/psp_verstage.bin" psp_verstage.bin
+	fi
 	if [[ -n "${OPROM}" ]]; then
 		newins ${OPROM} ${CBFSOPROM}
 	fi
@@ -428,12 +430,11 @@
 	local build_target
 
 	if use unibuild; then
-		local fields="coreboot,ec"
+		local fields="coreboot"
 		local cmd="get-firmware-build-combinations"
 		(cros_config_host "${cmd}" "${fields}" || die) |
 		while read -r name; do
 			read -r coreboot
-			read -r ec
 
 			set_build_env "${coreboot}" "${name}"
 			do_install ${coreboot}
diff --git a/sys-boot/coreboot/files/configs/config.berknip b/sys-boot/coreboot/files/configs/config.berknip
index c97790b..5156d99 100644
--- a/sys-boot/coreboot/files/configs/config.berknip
+++ b/sys-boot/coreboot/files/configs/config.berknip
@@ -2,19 +2,20 @@
 CONFIG_VENDOR_GOOGLE=y
 CONFIG_BOARD_GOOGLE_BERKNIP=y
 CONFIG_CHROMEOS=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
 # CONFIG_CONSOLE_SERIAL is not set
 # CONFIG_PSP_LOAD_MP2_FW is not set
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/berknip_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
diff --git a/sys-boot/coreboot/files/configs/config.boldar b/sys-boot/coreboot/files/configs/config.boldar
new file mode 100644
index 0000000..0d018ce
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.boldar
@@ -0,0 +1,45 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_BOLDAR=y
+
+CONFIG_PAYLOAD_NONE=y
+CONFIG_USE_BLOBS=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-volteer/descriptor-boldar.bin"
+
+# FSP Blobs
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/tgl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
+CONFIG_FSP_M_XIP=y
+CONFIG_RUN_FSP_GOP=y
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-volteer/csme-boldar.bin"
+
+# Microcode
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-volteer/ucode.bin"
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+
+# Video Blob
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-volteer/vbt.bin"
+
+# Serial console disabled by default (do not remove)
+# CONFIG_CONSOLE_SERIAL is not set
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+CONFIG_SPI_FLASH_SMM=y
diff --git a/sys-boot/coreboot/files/configs/config.boten_legacy b/sys-boot/coreboot/files/configs/config.boten_legacy
new file mode 100644
index 0000000..fa0c529
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.boten_legacy
@@ -0,0 +1,45 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_BOTEN_LEGACY=y
+CONFIG_USE_BLOBS=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SMM=y
+CONFIG_ANY_TOOLCHAIN=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# Firmware Support Package
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/jsl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/jsl/fsp/fsps.bin"
+
+# Enable VBT
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-dedede/vbt.bin"
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-dedede/ucode.bin"
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-dedede/descriptor-boten_legacy.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-dedede/me-boten_legacy.bin"
+# CONFIG_LOCK_MANAGEMENT_ENGINE is not set
+
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.burnet b/sys-boot/coreboot/files/configs/config.burnet
new file mode 100644
index 0000000..134b694
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.burnet
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_BURNET=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.cerise b/sys-boot/coreboot/files/configs/config.cerise
new file mode 100644
index 0000000..28707ec
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.cerise
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_CERISE=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.coachz b/sys-boot/coreboot/files/configs/config.coachz
new file mode 100644
index 0000000..fba662f
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.coachz
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_COACHZ=y
+CONFIG_CHROMEOS=y
+# CONFIG_CONSOLE_SERIAL is not set
+CONFIG_USE_BLOBS=y
diff --git a/sys-boot/coreboot/files/configs/config.dalboz b/sys-boot/coreboot/files/configs/config.dalboz
index 8c41a17..bef8867 100644
--- a/sys-boot/coreboot/files/configs/config.dalboz
+++ b/sys-boot/coreboot/files/configs/config.dalboz
@@ -1,25 +1,24 @@
-CONFIG_TIMESTAMPS_ON_CONSOLE=y
 CONFIG_USE_BLOBS=y
 CONFIG_VENDOR_GOOGLE=y
 # CONFIG_POST_DEVICE is not set
 CONFIG_BOARD_GOOGLE_DALBOZ=y
 CONFIG_CHROMEOS=y
 CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
-# CONFIG_DRIVERS_INTEL_WIFI is not set
 CONFIG_CONSOLE_POST=y
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
 # CONFIG_CONSOLE_SERIAL is not set
 # CONFIG_PSP_LOAD_MP2_FW is not set
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/dalboz_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
diff --git a/sys-boot/coreboot/files/configs/config.dirinboz b/sys-boot/coreboot/files/configs/config.dirinboz
new file mode 100644
index 0000000..a33973e
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.dirinboz
@@ -0,0 +1,34 @@
+CONFIG_USE_BLOBS=y
+CONFIG_VENDOR_GOOGLE=y
+# CONFIG_POST_DEVICE is not set
+CONFIG_BOARD_GOOGLE_DIRINBOZ=y
+CONFIG_CHROMEOS=y
+CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
+CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
+CONFIG_CONSOLE_POST=y
+# CONFIG_ACPI_BERT is not set
+CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
+CONFIG_DISPLAY_FSP_HEADER=y
+CONFIG_PAYLOAD_NONE=y
+# CONFIG_CONSOLE_SERIAL is not set
+# CONFIG_PSP_LOAD_MP2_FW is not set
+
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/dirinboz_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
+CONFIG_FRAMEBUFFER_VESA_MODE_USER=y
+CONFIG_FRAMEBUFFER_VESA_MODE=0x1D4
+CONFIG_VBE_LINEAR_FRAMEBUFFER=y
diff --git a/sys-boot/coreboot/files/configs/config.dooly b/sys-boot/coreboot/files/configs/config.dooly
new file mode 100644
index 0000000..a570025
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.dooly
@@ -0,0 +1,46 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_DOOLY=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_USE_BLOBS=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard/puff/descriptor-dooly.bin"
+
+# FSP blobs
+CONFIG_FSP_HEADER_PATH="3rdparty/blobs/intel/cml/fsp/Include/"
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_M.fd"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_S.fd"
+CONFIG_ADD_FSP_BINARIES=y
+
+# vbt
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard/puff/vbt.bin"
+CONFIG_SPI_FLASH_SMM=y
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard/puff/ucode.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard/puff/me-dooly.bin"
+
+# Disable
+# CONFIG_UART_DEBUG is not set
+# CONFIG_CONSOLE_SERIAL is not set
+# CONFIG_CONSOLE_SERIAL_115200 is not set
+# CONFIG_DRIVERS_UART_8250IO is not set
diff --git a/sys-boot/coreboot/files/configs/config.drawcia b/sys-boot/coreboot/files/configs/config.drawcia
index aa6349a..ae79f5c 100644
--- a/sys-boot/coreboot/files/configs/config.drawcia
+++ b/sys-boot/coreboot/files/configs/config.drawcia
@@ -43,4 +43,9 @@
 CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-dedede/me-drawcia.bin"
 # CONFIG_LOCK_MANAGEMENT_ENGINE is not set
 
+# WiFi SAR
+CONFIG_CHROMEOS_WIFI_SAR=y
+# FILEPATH is set to blank to prevent any default SAR file from getting added.
+CONFIG_WIFI_SAR_CBFS_FILEPATH=""
+
 # CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.drawcia_legacy b/sys-boot/coreboot/files/configs/config.drawcia_legacy
new file mode 100644
index 0000000..b12fcac
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.drawcia_legacy
@@ -0,0 +1,47 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_DRAWCIA_LEGACY=y
+CONFIG_USE_BLOBS=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SMM=y
+CONFIG_ANY_TOOLCHAIN=y
+CONFIG_BOARD_ROMSIZE_KB_32768=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# Firmware Support Package
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/jsl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/jsl/fsp/fsps.bin"
+
+# Enable VBT
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-dedede/vbt.bin"
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-dedede/ucode.bin"
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-dedede/descriptor-drawcia_legacy.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-dedede/me-drawcia_legacy.bin"
+# CONFIG_LOCK_MANAGEMENT_ENGINE is not set
+
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.eldrid b/sys-boot/coreboot/files/configs/config.eldrid
new file mode 100644
index 0000000..393dd6a
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.eldrid
@@ -0,0 +1,48 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_ELDRID=y
+
+CONFIG_PAYLOAD_NONE=y
+CONFIG_USE_BLOBS=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-volteer/descriptor-eldrid.bin"
+
+# FSP Blobs
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/tgl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
+CONFIG_FSP_M_XIP=y
+CONFIG_RUN_FSP_GOP=y
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-volteer/csme-eldrid.bin"
+
+# Microcode
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-volteer/ucode.bin"
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+
+# Video Blob
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-volteer/vbt.bin"
+
+# Serial console disabled by default (do not remove)
+# CONFIG_CONSOLE_SERIAL is not set
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+CONFIG_SPI_FLASH_SMM=y
+
+CONFIG_CHROMEOS_WIFI_SAR=y
+CONFIG_WIFI_SAR_CBFS_FILEPATH="3rdparty/blobs/baseboard-volteer/wifi_sar/wifi_sar-eldrid.hex"
diff --git a/sys-boot/coreboot/files/configs/config.esche b/sys-boot/coreboot/files/configs/config.esche
new file mode 100644
index 0000000..853f0c3
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.esche
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_ESCHE=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.ezkinil b/sys-boot/coreboot/files/configs/config.ezkinil
index d49ba7a..6b6131ca 100644
--- a/sys-boot/coreboot/files/configs/config.ezkinil
+++ b/sys-boot/coreboot/files/configs/config.ezkinil
@@ -1,25 +1,24 @@
-CONFIG_TIMESTAMPS_ON_CONSOLE=y
 CONFIG_USE_BLOBS=y
 CONFIG_VENDOR_GOOGLE=y
 # CONFIG_POST_DEVICE is not set
 CONFIG_BOARD_GOOGLE_EZKINIL=y
 CONFIG_CHROMEOS=y
 CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
-# CONFIG_DRIVERS_INTEL_WIFI is not set
 CONFIG_CONSOLE_POST=y
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
 # CONFIG_CONSOLE_SERIAL is not set
 # CONFIG_PSP_LOAD_MP2_FW is not set
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/ezkinil_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
@@ -33,3 +32,7 @@
 CONFIG_FRAMEBUFFER_VESA_MODE_USER=y
 CONFIG_FRAMEBUFFER_VESA_MODE=0x1D4
 CONFIG_VBE_LINEAR_FRAMEBUFFER=y
+
+# WiFi SAR
+CONFIG_WIFI_SAR_CBFS=y
+CONFIG_WIFI_SAR_CBFS_FILEPATH="3rdparty/blobs/zork/wifi_sar/wifi_sar-ezkinil.hex"
diff --git a/sys-boot/coreboot/files/configs/config.fennel b/sys-boot/coreboot/files/configs/config.fennel
new file mode 100644
index 0000000..04e6294
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.fennel
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_FENNEL=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.hayato b/sys-boot/coreboot/files/configs/config.hayato
new file mode 100644
index 0000000..7dd6f15
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.hayato
@@ -0,0 +1,4 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_HAYATO=y
+CONFIG_CHROMEOS=y
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.jslrvp b/sys-boot/coreboot/files/configs/config.jslrvp
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/config.jslrvp_ext_ec b/sys-boot/coreboot/files/configs/config.jslrvp_ext_ec
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/config.liara b/sys-boot/coreboot/files/configs/config.liara
index 8c8f9ca..a5bb122 100644
--- a/sys-boot/coreboot/files/configs/config.liara
+++ b/sys-boot/coreboot/files/configs/config.liara
@@ -24,5 +24,6 @@
 CONFIG_AGESA_SPLIT_MEMORY_FILES=y
 CONFIG_ELOG_GSMI=y
 CONFIG_SPI_FLASH_SMM=y
+CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_ELOG_BOOT_COUNT=y
 CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
diff --git a/sys-boot/coreboot/files/configs/config.madoo b/sys-boot/coreboot/files/configs/config.madoo
new file mode 100644
index 0000000..e0493f1
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.madoo
@@ -0,0 +1,51 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_MADOO=y
+CONFIG_USE_BLOBS=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SMM=y
+CONFIG_ANY_TOOLCHAIN=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# Firmware Support Package
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/jsl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/jsl/fsp/fsps.bin"
+# CONFIG_FSP_HEADER_PATH is not set
+
+# Enable VBT
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-dedede/vbt.bin"
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-dedede/ucode.bin"
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-dedede/descriptor-madoo.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-dedede/me-madoo.bin"
+# CONFIG_LOCK_MANAGEMENT_ENGINE is not set
+
+# WiFi SAR
+CONFIG_CHROMEOS_WIFI_SAR=y
+CONFIG_WIFI_SAR_CBFS_FILEPATH=""
+
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.magolor b/sys-boot/coreboot/files/configs/config.magolor
new file mode 100644
index 0000000..fa2a966
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.magolor
@@ -0,0 +1,46 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_MAGOLOR=y
+CONFIG_USE_BLOBS=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SMM=y
+CONFIG_ANY_TOOLCHAIN=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# Firmware Support Package
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/jsl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/jsl/fsp/fsps.bin"
+
+# Enable VBT
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-dedede/vbt.bin"
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-dedede/ucode.bin"
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-dedede/descriptor-magolor.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-dedede/me-magolor.bin"
+# CONFIG_LOCK_MANAGEMENT_ENGINE is not set
+
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.morphius b/sys-boot/coreboot/files/configs/config.morphius
index 80f4fe9..bac02c8 100644
--- a/sys-boot/coreboot/files/configs/config.morphius
+++ b/sys-boot/coreboot/files/configs/config.morphius
@@ -1,24 +1,24 @@
-CONFIG_TIMESTAMPS_ON_CONSOLE=y
 CONFIG_USE_BLOBS=y
 CONFIG_VENDOR_GOOGLE=y
 # CONFIG_POST_DEVICE is not set
 CONFIG_BOARD_GOOGLE_MORPHIUS=y
 CONFIG_CHROMEOS=y
 CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
 CONFIG_CONSOLE_POST=y
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
 # CONFIG_CONSOLE_SERIAL is not set
 # CONFIG_PSP_LOAD_MP2_FW is not set
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/morphius_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
@@ -32,3 +32,7 @@
 CONFIG_FRAMEBUFFER_VESA_MODE_USER=y
 CONFIG_FRAMEBUFFER_VESA_MODE=0x1D4
 CONFIG_VBE_LINEAR_FRAMEBUFFER=y
+
+# WiFi SAR
+CONFIG_WIFI_SAR_CBFS=y
+CONFIG_WIFI_SAR_CBFS_FILEPATH="3rdparty/blobs/zork/wifi_sar/wifi_sar-morphius.hex"
diff --git a/sys-boot/coreboot/files/configs/config.nightfury b/sys-boot/coreboot/files/configs/config.nightfury
index 02ee42b..d0245f2 100644
--- a/sys-boot/coreboot/files/configs/config.nightfury
+++ b/sys-boot/coreboot/files/configs/config.nightfury
@@ -45,3 +45,6 @@
 # CONFIG_CONSOLE_SERIAL_115200 is not set
 # CONFIG_DRIVERS_UART_8250IO is not set
 
+# WiFi SAR
+CONFIG_CHROMEOS_WIFI_SAR=y
+CONFIG_WIFI_SAR_CBFS_FILEPATH="3rdparty/blobs/baseboard/hatch/wifi_sar/wifi_sar-nightfury.hex"
diff --git a/sys-boot/coreboot/files/configs/config.pompom b/sys-boot/coreboot/files/configs/config.pompom
new file mode 100644
index 0000000..ef165c7
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.pompom
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_POMPOM=y
+CONFIG_CHROMEOS=y
+# CONFIG_CONSOLE_SERIAL is not set
+CONFIG_USE_BLOBS=y
diff --git a/sys-boot/coreboot/files/configs/config.stern b/sys-boot/coreboot/files/configs/config.stern
new file mode 100644
index 0000000..7d4c335
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.stern
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_STERN=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.sushi b/sys-boot/coreboot/files/configs/config.sushi
deleted file mode 100644
index 9050f7d..0000000
--- a/sys-boot/coreboot/files/configs/config.sushi
+++ /dev/null
@@ -1,46 +0,0 @@
-CONFIG_VENDOR_GOOGLE=y
-CONFIG_BOARD_GOOGLE_SUSHI=y
-CONFIG_PAYLOAD_NONE=y
-CONFIG_USE_BLOBS=y
-
-# Chrome OS
-CONFIG_CHROMEOS=y
-
-# Event Logging
-CONFIG_CMOS_POST=y
-CONFIG_CMOS_POST_OFFSET=0x70
-CONFIG_ELOG_GSMI=y
-CONFIG_ELOG_BOOT_COUNT=y
-CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
-
-# SPI Descriptor
-CONFIG_HAVE_IFD_BIN=y
-CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard/hatch/descriptor-sushi.bin"
-
-# FSP blobs
-CONFIG_FSP_HEADER_PATH="3rdparty/blobs/intel/cml/fsp/Include/"
-CONFIG_HAVE_INTEL_FSP_REPO=y
-# CONFIG_FSP_USE_REPO is not set
-CONFIG_FSP_M_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_M.fd"
-CONFIG_FSP_S_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_S.fd"
-CONFIG_ADD_FSP_BINARIES=y
-
-# vbt
-CONFIG_INTEL_GMA_ADD_VBT=y
-CONFIG_RUN_FSP_GOP=y
-CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard/hatch/vbt.bin"
-CONFIG_SPI_FLASH_SMM=y
-
-# Microcode
-CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
-CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard/hatch/ucode.bin"
-
-# Management Engine
-CONFIG_HAVE_ME_BIN=y
-CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard/hatch/me-sushi.bin"
-
-# Disable
-# CONFIG_UART_DEBUG is not set
-# CONFIG_CONSOLE_SERIAL is not set
-# CONFIG_CONSOLE_SERIAL_115200 is not set
-# CONFIG_DRIVERS_UART_8250IO is not set
diff --git a/sys-boot/coreboot/files/configs/config.tglrvp_up3 b/sys-boot/coreboot/files/configs/config.tglrvp_up3
index d3ac39b..7b02522 100644
--- a/sys-boot/coreboot/files/configs/config.tglrvp_up3
+++ b/sys-boot/coreboot/files/configs/config.tglrvp_up3
@@ -15,7 +15,6 @@
 CONFIG_FSP_M_FILE="3rdparty/blobs/intel/tgl/fsp/fspm.bin"
 CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
 CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_u/es2/descriptor.bin"
-CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="tglrvp"
 CONFIG_HAVE_IFD_BIN=y
 CONFIG_HAVE_ME_BIN=y
 CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_u/es2/me.bin"
diff --git a/sys-boot/coreboot/files/configs/config.tglrvp_up3_b0 b/sys-boot/coreboot/files/configs/config.tglrvp_up3_b0
index db7eb30..0dc562c 100644
--- a/sys-boot/coreboot/files/configs/config.tglrvp_up3_b0
+++ b/sys-boot/coreboot/files/configs/config.tglrvp_up3_b0
@@ -16,7 +16,6 @@
 CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
 
 CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_u/qs/descriptor.bin"
-CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="tglrvp"
 CONFIG_HAVE_IFD_BIN=y
 CONFIG_HAVE_ME_BIN=y
 CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_u/qs/me.bin"
diff --git a/sys-boot/coreboot/files/configs/config.tglrvp_up4 b/sys-boot/coreboot/files/configs/config.tglrvp_up4
index 9475ba5..dbe7518 100644
--- a/sys-boot/coreboot/files/configs/config.tglrvp_up4
+++ b/sys-boot/coreboot/files/configs/config.tglrvp_up4
@@ -16,7 +16,6 @@
 CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
 
 CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_y/es2/descriptor.bin"
-CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="tglrvp"
 CONFIG_HAVE_IFD_BIN=y
 CONFIG_HAVE_ME_BIN=y
 CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_y/es2/me.bin"
diff --git a/sys-boot/coreboot/files/configs/config.tglrvp_up4_b0 b/sys-boot/coreboot/files/configs/config.tglrvp_up4_b0
index 32e5228..3a9064b 100644
--- a/sys-boot/coreboot/files/configs/config.tglrvp_up4_b0
+++ b/sys-boot/coreboot/files/configs/config.tglrvp_up4_b0
@@ -16,7 +16,6 @@
 CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
 
 CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_y/qs/descriptor.bin"
-CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="tglrvp"
 CONFIG_HAVE_IFD_BIN=y
 CONFIG_HAVE_ME_BIN=y
 CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/intel/tglrvp/rvp_y/qs/me.bin"
diff --git a/sys-boot/coreboot/files/configs/config.todor b/sys-boot/coreboot/files/configs/config.todor
new file mode 100644
index 0000000..61434b9
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.todor
@@ -0,0 +1,45 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_TODOR=y
+
+CONFIG_PAYLOAD_NONE=y
+CONFIG_USE_BLOBS=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard-volteer/descriptor-todor.bin"
+
+# FSP Blobs
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/tgl/fsp/fspm.bin"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/tgl/fsp/fsps.bin"
+CONFIG_FSP_M_XIP=y
+CONFIG_RUN_FSP_GOP=y
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard-volteer/csme-todor.bin"
+
+# Microcode
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard-volteer/ucode.bin"
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+
+# Video Blob
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard-volteer/vbt.bin"
+
+# Serial console disabled by default (do not remove)
+# CONFIG_CONSOLE_SERIAL is not set
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+CONFIG_SPI_FLASH_SMM=y
diff --git a/sys-boot/coreboot/files/configs/config.trembyle b/sys-boot/coreboot/files/configs/config.trembyle
index 8db5c9a..35ee06c 100644
--- a/sys-boot/coreboot/files/configs/config.trembyle
+++ b/sys-boot/coreboot/files/configs/config.trembyle
@@ -1,19 +1,14 @@
-CONFIG_TIMESTAMPS_ON_CONSOLE=y
 CONFIG_USE_BLOBS=y
 CONFIG_VENDOR_GOOGLE=y
 # CONFIG_POST_DEVICE is not set
 CONFIG_BOARD_GOOGLE_TREMBYLE=y
 CONFIG_CHROMEOS=y
 CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
-# CONFIG_DRIVERS_INTEL_WIFI is not set
 CONFIG_CONSOLE_POST=y
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
@@ -21,6 +16,10 @@
 # CONFIG_PSP_LOAD_MP2_FW is not set
 # CONFIG_VBOOT_STARTS_BEFORE_BOOTBLOCK=y
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/trembyle_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
diff --git a/sys-boot/coreboot/files/configs/config.vilboz b/sys-boot/coreboot/files/configs/config.vilboz
index 3c564e3..47f562c 100644
--- a/sys-boot/coreboot/files/configs/config.vilboz
+++ b/sys-boot/coreboot/files/configs/config.vilboz
@@ -1,25 +1,24 @@
-CONFIG_TIMESTAMPS_ON_CONSOLE=y
 CONFIG_USE_BLOBS=y
 CONFIG_VENDOR_GOOGLE=y
 # CONFIG_POST_DEVICE is not set
 CONFIG_BOARD_GOOGLE_VILBOZ=y
 CONFIG_CHROMEOS=y
 CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
-CONFIG_HAVE_APCB_BLOB=y
 CONFIG_ADD_FSP_BINARIES=y
 CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
 CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
-# CONFIG_DRIVERS_INTEL_WIFI is not set
 CONFIG_CONSOLE_POST=y
 # CONFIG_ACPI_BERT is not set
-CONFIG_DISPLAY_HOBS=y
-CONFIG_DISPLAY_UPD_DATA=y
 CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
 CONFIG_DISPLAY_FSP_HEADER=y
 CONFIG_PAYLOAD_NONE=y
 # CONFIG_CONSOLE_SERIAL is not set
 # CONFIG_PSP_LOAD_MP2_FW is not set
 
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/vilboz_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
 # Event Logging
 CONFIG_CMOS_POST=y
 CONFIG_CMOS_POST_OFFSET=0x70
diff --git a/sys-boot/coreboot/files/configs/config.voxel b/sys-boot/coreboot/files/configs/config.voxel
index 97663a0..10f54a6 100644
--- a/sys-boot/coreboot/files/configs/config.voxel
+++ b/sys-boot/coreboot/files/configs/config.voxel
@@ -41,5 +41,3 @@
 CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
 
 CONFIG_SPI_FLASH_SMM=y
-
-CONFIG_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC=y
diff --git a/sys-boot/coreboot/files/configs/config.waddledoo b/sys-boot/coreboot/files/configs/config.waddledoo
index a256f5f..2de1009f4 100644
--- a/sys-boot/coreboot/files/configs/config.waddledoo
+++ b/sys-boot/coreboot/files/configs/config.waddledoo
@@ -24,7 +24,6 @@
 # CONFIG_FSP_USE_REPO is not set
 CONFIG_FSP_M_FILE="3rdparty/blobs/intel/jsl/fsp/fspm.bin"
 CONFIG_FSP_S_FILE="3rdparty/blobs/intel/jsl/fsp/fsps.bin"
-# TODO(b/148411686): Include the header after fix for c#2
 # CONFIG_FSP_HEADER_PATH is not set
 
 # Enable VBT
diff --git a/sys-boot/coreboot/files/configs/config.willow b/sys-boot/coreboot/files/configs/config.willow
new file mode 100644
index 0000000..e68b289
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.willow
@@ -0,0 +1,5 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_WILLOW=y
+CONFIG_CHROMEOS=y
+# CONFIG_BOOTBLOCK_CONSOLE is not set
+# CONFIG_CONSOLE_SERIAL is not set
diff --git a/sys-boot/coreboot/files/configs/config.woomax b/sys-boot/coreboot/files/configs/config.woomax
new file mode 100644
index 0000000..3f6000c
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.woomax
@@ -0,0 +1,34 @@
+CONFIG_USE_BLOBS=y
+CONFIG_VENDOR_GOOGLE=y
+# CONFIG_POST_DEVICE is not set
+CONFIG_BOARD_GOOGLE_WOOMAX=y
+CONFIG_CHROMEOS=y
+CONFIG_CHROMEOS_RAMOOPS_DYNAMIC=y
+CONFIG_ADD_FSP_BINARIES=y
+CONFIG_FSP_M_FILE="3rdparty/amd_blobs/picasso/PICASSO_M.fd"
+CONFIG_FSP_S_FILE="3rdparty/amd_blobs/picasso/PICASSO_S.fd"
+CONFIG_CONSOLE_POST=y
+# CONFIG_ACPI_BERT is not set
+CONFIG_DISPLAY_FSP_CALLS_AND_STATUS=y
+CONFIG_DISPLAY_FSP_HEADER=y
+CONFIG_PAYLOAD_NONE=y
+# CONFIG_CONSOLE_SERIAL is not set
+# CONFIG_PSP_LOAD_MP2_FW is not set
+
+# Signed PSP verstage
+CONFIG_PSP_VERSTAGE_FILE="3rdparty/blobs/mainboard/google/zork/woomax_psp_verstage.bin.signed"
+CONFIG_PSP_VERSTAGE_SIGNING_TOKEN="3rdparty/blobs/mainboard/google/zork/PCO_psp_verstagebl_fw_signing.stkn"
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_COLLECT_TIMESTAMPS=y
+CONFIG_ELOG=y
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
+CONFIG_FRAMEBUFFER_VESA_MODE_USER=y
+CONFIG_FRAMEBUFFER_VESA_MODE=0x1D4
+CONFIG_VBE_LINEAR_FRAMEBUFFER=y
diff --git a/sys-boot/coreboot/files/configs/config.wyvern_accelerator b/sys-boot/coreboot/files/configs/config.wyvern_accelerator
new file mode 100644
index 0000000..f537a27
--- /dev/null
+++ b/sys-boot/coreboot/files/configs/config.wyvern_accelerator
@@ -0,0 +1,46 @@
+CONFIG_VENDOR_GOOGLE=y
+CONFIG_BOARD_GOOGLE_WYVERN=y
+CONFIG_PAYLOAD_NONE=y
+CONFIG_USE_BLOBS=y
+
+# Chrome OS
+CONFIG_CHROMEOS=y
+
+# Event Logging
+CONFIG_CMOS_POST=y
+CONFIG_CMOS_POST_OFFSET=0x70
+CONFIG_ELOG_GSMI=y
+CONFIG_ELOG_BOOT_COUNT=y
+CONFIG_ELOG_BOOT_COUNT_CMOS_OFFSET=144
+
+# SPI Descriptor
+CONFIG_HAVE_IFD_BIN=y
+CONFIG_IFD_BIN_PATH="3rdparty/blobs/baseboard/puff/descriptor-wyvern_accelerator.bin"
+
+# FSP blobs
+CONFIG_FSP_HEADER_PATH="3rdparty/blobs/intel/cml/fsp/Include/"
+CONFIG_HAVE_INTEL_FSP_REPO=y
+# CONFIG_FSP_USE_REPO is not set
+CONFIG_FSP_M_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_M.fd"
+CONFIG_FSP_S_FILE="3rdparty/blobs/intel/cml/fsp/Fsp_S.fd"
+CONFIG_ADD_FSP_BINARIES=y
+
+# vbt
+CONFIG_INTEL_GMA_ADD_VBT=y
+CONFIG_RUN_FSP_GOP=y
+CONFIG_INTEL_GMA_VBT_FILE="3rdparty/blobs/baseboard/puff/vbt.bin"
+CONFIG_SPI_FLASH_SMM=y
+
+# Microcode
+CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS=y
+CONFIG_CPU_UCODE_BINARIES="3rdparty/blobs/baseboard/puff/ucode.bin"
+
+# Management Engine
+CONFIG_HAVE_ME_BIN=y
+CONFIG_ME_BIN_PATH="3rdparty/blobs/baseboard/puff/me-wyvern_accelerator.bin"
+
+# Disable
+# CONFIG_UART_DEBUG is not set
+# CONFIG_CONSOLE_SERIAL is not set
+# CONFIG_CONSOLE_SERIAL_115200 is not set
+# CONFIG_DRIVERS_UART_8250IO is not set
diff --git a/sys-boot/coreboot/files/configs/fwserial.dedede b/sys-boot/coreboot/files/configs/fwserial.dedede
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/fwserial.jslrvp b/sys-boot/coreboot/files/configs/fwserial.jslrvp
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/fwserial.jslrvp_ext_ec b/sys-boot/coreboot/files/configs/fwserial.jslrvp_ext_ec
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/fwserial.tglrvp b/sys-boot/coreboot/files/configs/fwserial.tglrvp
old mode 100755
new mode 100644
diff --git a/sys-boot/coreboot/files/configs/fwserial.zork b/sys-boot/coreboot/files/configs/fwserial.zork
index 155f29e..619acdc 100644
--- a/sys-boot/coreboot/files/configs/fwserial.zork
+++ b/sys-boot/coreboot/files/configs/fwserial.zork
@@ -4,3 +4,4 @@
 CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y
 CONFIG_CONSOLE_POST=y
 CONFIG_DEBUG_SMI=y
+CONFIG_PSP_UNLOCK_SECURE_DEBUG=y
diff --git a/sys-boot/coreinfo/coreinfo-0.0.1-r3729.ebuild b/sys-boot/coreinfo/coreinfo-0.0.1-r3729.ebuild
deleted file mode 100644
index 991a58f..0000000
--- a/sys-boot/coreinfo/coreinfo-0.0.1-r3729.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2012 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-
-DESCRIPTION="coreboot's coreinfo payload"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="-* amd64 x86"
-
-BDEPEND="dev-embedded/coreboot-sdk:="
-DEPEND="sys-boot/libpayload:="
-
-CROS_WORKON_LOCALNAME="coreboot"
-
-inherit cros-workon coreboot-sdk
-
-src_compile() {
-	export CROSS_COMPILE=${COREBOOT_SDK_PREFIX_x86_32}
-	export CC="${CROSS_COMPILE}gcc"
-	unset CFLAGS
-
-	local coreinfodir="payloads/coreinfo"
-	cp "${coreinfodir}"/config.default "${coreinfodir}"/.config
-	emake -C "${coreinfodir}" \
-		LIBPAYLOAD_DIR="${ROOT}/firmware/libpayload/" \
-		oldconfig \
-		|| die "libpayload make oldconfig failed"
-	emake -C "${coreinfodir}" \
-		LIBPAYLOAD_DIR="${ROOT}/firmware/libpayload/" \
-		|| die "libpayload build failed"
-}
-
-src_install() {
-	local src_root="payloads/coreinfo/"
-	local build_root="${src_root}/build"
-	local destdir="/firmware/coreinfo"
-
-	insinto "${destdir}"
-	doins "${build_root}"/coreinfo.elf
-}
diff --git a/sys-boot/coreinfo/coreinfo-0.0.1-r3818.ebuild b/sys-boot/coreinfo/coreinfo-0.0.1-r3818.ebuild
new file mode 100644
index 0000000..4550b35
--- /dev/null
+++ b/sys-boot/coreinfo/coreinfo-0.0.1-r3818.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2012 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+
+DESCRIPTION="coreboot's coreinfo payload"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="-* amd64 x86"
+
+BDEPEND="dev-embedded/coreboot-sdk:="
+DEPEND="sys-boot/libpayload:="
+
+CROS_WORKON_LOCALNAME="coreboot"
+
+inherit cros-workon coreboot-sdk
+
+src_compile() {
+	export CROSS_COMPILE=${COREBOOT_SDK_PREFIX_x86_32}
+	export CC="${CROSS_COMPILE}gcc"
+	unset CFLAGS
+
+	local coreinfodir="payloads/coreinfo"
+	cp "${coreinfodir}"/config.default "${coreinfodir}"/.config
+	emake -C "${coreinfodir}" \
+		LIBPAYLOAD_DIR="${ROOT}/firmware/libpayload/" \
+		oldconfig \
+		|| die "libpayload make oldconfig failed"
+	emake -C "${coreinfodir}" \
+		LIBPAYLOAD_DIR="${ROOT}/firmware/libpayload/" \
+		|| die "libpayload build failed"
+}
+
+src_install() {
+	local src_root="payloads/coreinfo/"
+	local build_root="${src_root}/build"
+	local destdir="/firmware/coreinfo"
+
+	insinto "${destdir}"
+	doins "${build_root}"/coreinfo.elf
+}
diff --git a/sys-boot/depthcharge/depthcharge-0.0.1-r2903.ebuild b/sys-boot/depthcharge/depthcharge-0.0.1-r2903.ebuild
deleted file mode 100644
index 6d6bb28..0000000
--- a/sys-boot/depthcharge/depthcharge-0.0.1-r2903.ebuild
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright 2012 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT=("64cf4eb90462858c8cd2eaa141e85a18508daaae" "1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54")
-CROS_WORKON_TREE=("613d96494258891691706f77d9204703641699a8" "82e77f6c98187361303fffeeba118a1a365e16d5")
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/depthcharge"
-	"chromiumos/platform/vboot_reference"
-)
-
-DESCRIPTION="coreboot's depthcharge payload"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="*"
-IUSE="detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync
-	unibuild verbose debug generated_cros_config
-	physical_presence_power physical_presence_recovery"
-
-DEPEND="
-	chromeos-base/chromeos-ec-headers:=
-	sys-boot/libpayload:=
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-"
-
-CROS_WORKON_LOCALNAME=("../platform/depthcharge" "../platform/vboot_reference")
-VBOOT_REFERENCE_DESTDIR="${S}/vboot_reference"
-CROS_WORKON_DESTDIR=("${S}" "${VBOOT_REFERENCE_DESTDIR}")
-
-# Don't strip to ease remote GDB use (cbfstool strips final binaries anyway)
-STRIP_MASK="*"
-
-inherit cros-workon cros-board cros-unibuild
-
-# Get the depthcharge board config to build for.
-# Checks the current board with/without variant. Echoes the board config file
-# that should be used to build depthcharge.
-get_board() {
-	local board=$(get_current_board_with_variant)
-	if [[ ! -d "board/${board}" ]]; then
-		board=$(get_current_board_no_variant)
-	fi
-
-	echo "${board}"
-}
-
-# Build depthcharge with common options.
-# Usage example: dc_make dev LIBPAYLOAD_DIR="libpayload"
-# Args:
-#   $1: Target to build
-#   $2: Build directory to use.
-#   $3: Firmware file to use for LIBPAYLOAD_DIR
-#   $4+: Any other Makefile arguments.
-dc_make() {
-	local target="$1"
-	local builddir="$2"
-	local libpayload
-
-	[[ -n "$3" ]] && libpayload="LIBPAYLOAD_DIR=${SYSROOT}/firmware/$3/"
-
-	shift 3
-
-	local OPTS=(
-		"EC_HEADERS=${SYSROOT}/usr/include/chromeos/ec"
-		"VB_SOURCE=${VBOOT_REFERENCE_DESTDIR}"
-		"PD_SYNC=$(usev pd_sync)"
-		"obj=${builddir}"
-	)
-
-	use verbose && OPTS+=( "V=1" )
-	use debug && OPTS+=( "SOURCE_DEBUG=1" )
-
-	emake "${OPTS[@]}" \
-		${libpayload} \
-		"${target}" \
-		"$@"
-}
-
-# Build depthcharge for the current board.
-# Builds the various output files for depthcharge:
-#   depthcharge.elf   - normal image
-#   dev.elf           - developer image
-#   netboot.elf       - network image
-# In addition, .map files are produced for each, and a .config file which
-# holds the configuration that was used.
-# Args
-#   $1: board to build for.
-make_depthcharge() {
-	local board="$1"
-	local builddir="$2"
-	local defconfig="board/${board}/defconfig"
-
-	if use mocktpm ; then
-		echo "CONFIG_MOCK_TPM=y" >> "${defconfig}"
-	fi
-	if use fwconsole ; then
-		echo "CONFIG_CLI=y" >> "${defconfig}"
-		echo "CONFIG_SYS_PROMPT=\"${board}: \"" >> "${defconfig}"
-	fi
-	if use detachable ; then
-		echo "CONFIG_DETACHABLE=y" >> "${defconfig}"
-	fi
-	if use menu_ui ; then
-		echo "CONFIG_MENU_UI=y" >> "${defconfig}"
-	elif use legacy_menu_ui ; then
-		echo "CONFIG_LEGACY_MENU_UI=y" >> "${defconfig}"
-	else
-		echo "CONFIG_LEGACY_CLAMSHELL_UI=y" >> "${defconfig}"
-	fi
-	# Using diagnostic payload implies enabling UI to run it
-	if use diag_payload ; then
-		echo "CONFIG_DIAGNOSTIC_UI=y" >> "${defconfig}"
-	fi
-
-	if use physical_presence_power || use physical_presence_recovery ; then
-		echo "CONFIG_PHYSICAL_PRESENCE_KEYBOARD=n" >> "${defconfig}"
-	fi
-
-	[[ ${PV} == "9999" ]] && dc_make distclean "${builddir}" libpayload
-	dc_make defconfig "${builddir}" libpayload BOARD="${board}"
-	cp .config "${builddir}/depthcharge.config"
-
-	dc_make depthcharge "${builddir}" libpayload
-	dc_make dev "${builddir}" libpayload_gdb
-	dc_make netboot "${builddir}" libpayload_gdb
-}
-
-src_compile() {
-	# Firmware related binaries are compiled with a 32-bit toolchain
-	# on 64-bit platforms
-	if use amd64 ; then
-		export CROSS_COMPILE="i686-pc-linux-gnu-"
-		export CC="${CROSS_COMPILE}gcc"
-	else
-		export CROSS_COMPILE=${CHOST}-
-	fi
-
-	if use unibuild; then
-		local build_target
-
-		for build_target in $(cros_config_host \
-			get-firmware-build-targets depthcharge); do
-			make_depthcharge "${build_target}" "${build_target}"
-		done
-	else
-		make_depthcharge "$(get_board)" build
-	fi
-}
-
-do_install() {
-	local board="$1"
-	local builddir="$2"
-	local dstdir="/firmware"
-
-	if [[ -n "${build_target}" ]]; then
-		dstdir+="/${build_target}"
-		einfo "Installing depthcharge ${build_target} into ${dest_dir}"
-	fi
-	insinto "${dstdir}"
-
-	pushd "${builddir}" >/dev/null || \
-		die "couldn't access ${builddir}/ directory"
-
-	local files_to_copy=(
-		depthcharge.config
-		{netboot,depthcharge,dev}.elf{,.map}
-	)
-
-	insinto "${dstdir}/depthcharge"
-	doins "${files_to_copy[@]}"
-
-	popd >/dev/null
-}
-
-src_install() {
-	local build_target
-
-	if use unibuild; then
-		for build_target in $(cros_config_host \
-			get-firmware-build-targets depthcharge); do
-			do_install "${build_target}" "${build_target}"
-		done
-	else
-		do_install "$(get_board)" build
-	fi
-}
diff --git a/sys-boot/depthcharge/depthcharge-0.0.1-r3050.ebuild b/sys-boot/depthcharge/depthcharge-0.0.1-r3050.ebuild
new file mode 100644
index 0000000..f9a34b0
--- /dev/null
+++ b/sys-boot/depthcharge/depthcharge-0.0.1-r3050.ebuild
@@ -0,0 +1,184 @@
+# Copyright 2012 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT=("4f5e18d00754171003a684decc339418d44f03b8" "524012c64c07f8673998428cca7f80e01a387f48")
+CROS_WORKON_TREE=("7d1ca6d913626289803d75b68c87813ae284534b" "d011d454951af2d6dbcf7d4dc7af53a31cc883db")
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/depthcharge"
+	"chromiumos/platform/vboot_reference"
+)
+
+DESCRIPTION="coreboot's depthcharge payload"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="*"
+IUSE="detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync
+	unibuild verbose debug generated_cros_config +minidiag
+	physical_presence_power physical_presence_recovery"
+
+DEPEND="
+	chromeos-base/chromeos-ec-headers:=
+	sys-boot/libpayload:=
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+"
+
+CROS_WORKON_LOCALNAME=("../platform/depthcharge" "../platform/vboot_reference")
+VBOOT_REFERENCE_DESTDIR="${S}/vboot_reference"
+CROS_WORKON_DESTDIR=("${S}" "${VBOOT_REFERENCE_DESTDIR}")
+
+# Don't strip to ease remote GDB use (cbfstool strips final binaries anyway)
+STRIP_MASK="*"
+
+inherit cros-workon cros-board cros-unibuild
+
+# Get the depthcharge board config to build for.
+# Checks the current board with/without variant. Echoes the board config file
+# that should be used to build depthcharge.
+get_board() {
+	local board=$(get_current_board_with_variant)
+	if [[ ! -d "board/${board}" ]]; then
+		board=$(get_current_board_no_variant)
+	fi
+
+	echo "${board}"
+}
+
+# Build depthcharge with common options.
+# Usage example: dc_make dev LIBPAYLOAD_DIR="libpayload"
+# Args:
+#   $1: Target to build
+#   $2: Build directory to use.
+#   $3: Firmware file to use for LIBPAYLOAD_DIR
+#   $4+: Any other Makefile arguments.
+dc_make() {
+	local target="$1"
+	local builddir="$2"
+	local libpayload
+
+	[[ -n "$3" ]] && libpayload="LIBPAYLOAD_DIR=${SYSROOT}/firmware/$3/"
+
+	shift 3
+
+	local OPTS=(
+		"EC_HEADERS=${SYSROOT}/usr/include/chromeos/ec"
+		"VB_SOURCE=${VBOOT_REFERENCE_DESTDIR}"
+		"PD_SYNC=$(usev pd_sync)"
+		"obj=${builddir}"
+	)
+
+	use verbose && OPTS+=( "V=1" )
+	use debug && OPTS+=( "SOURCE_DEBUG=1" )
+
+	emake "${OPTS[@]}" \
+		${libpayload} \
+		"${target}" \
+		"$@"
+}
+
+# Build depthcharge for the current board.
+# Builds the various output files for depthcharge:
+#   depthcharge.elf   - normal image
+#   dev.elf           - developer image
+#   netboot.elf       - network image
+# In addition, .map files are produced for each, and a .config file which
+# holds the configuration that was used.
+# Args
+#   $1: board to build for.
+make_depthcharge() {
+	local board="$1"
+	local builddir="$2"
+	local defconfig="board/${board}/defconfig"
+
+	if use mocktpm ; then
+		echo "CONFIG_MOCK_TPM=y" >> "${defconfig}"
+	fi
+	if use fwconsole ; then
+		echo "CONFIG_CLI=y" >> "${defconfig}"
+		echo "CONFIG_SYS_PROMPT=\"${board}: \"" >> "${defconfig}"
+	fi
+	if use detachable ; then
+		echo "CONFIG_DETACHABLE=y" >> "${defconfig}"
+	fi
+	echo "CONFIG_MENU_UI=y" >> "${defconfig}"
+
+	# Both diag_payload and minidiag need special UI.
+	if use diag_payload || use minidiag ; then
+		echo "CONFIG_DIAGNOSTIC_UI=y" >> "${defconfig}"
+	fi
+
+	if use physical_presence_power || use physical_presence_recovery ; then
+		echo "CONFIG_PHYSICAL_PRESENCE_KEYBOARD=n" >> "${defconfig}"
+	fi
+
+	[[ ${PV} == "9999" ]] && dc_make distclean "${builddir}" libpayload
+	dc_make defconfig "${builddir}" libpayload BOARD="${board}"
+	cp .config "${builddir}/depthcharge.config"
+
+	dc_make depthcharge "${builddir}" libpayload
+	dc_make dev "${builddir}" libpayload_gdb
+	dc_make netboot "${builddir}" libpayload_gdb
+}
+
+src_compile() {
+	# Firmware related binaries are compiled with a 32-bit toolchain
+	# on 64-bit platforms
+	if use amd64 ; then
+		export CROSS_COMPILE="i686-pc-linux-gnu-"
+		export CC="${CROSS_COMPILE}gcc"
+	else
+		export CROSS_COMPILE=${CHOST}-
+	fi
+
+	if use unibuild; then
+		local build_target
+
+		for build_target in $(cros_config_host \
+			get-firmware-build-targets depthcharge); do
+			make_depthcharge "${build_target}" "${build_target}"
+		done
+	else
+		make_depthcharge "$(get_board)" build
+	fi
+}
+
+do_install() {
+	local board="$1"
+	local builddir="$2"
+	local dstdir="/firmware"
+
+	if [[ -n "${build_target}" ]]; then
+		dstdir+="/${build_target}"
+		einfo "Installing depthcharge ${build_target} into ${dest_dir}"
+	fi
+	insinto "${dstdir}"
+
+	pushd "${builddir}" >/dev/null || \
+		die "couldn't access ${builddir}/ directory"
+
+	local files_to_copy=(
+		depthcharge.config
+		{netboot,depthcharge,dev}.elf{,.map}
+	)
+
+	insinto "${dstdir}/depthcharge"
+	doins "${files_to_copy[@]}"
+
+	popd >/dev/null
+}
+
+src_install() {
+	local build_target
+
+	if use unibuild; then
+		for build_target in $(cros_config_host \
+			get-firmware-build-targets depthcharge); do
+			do_install "${build_target}" "${build_target}"
+		done
+	else
+		do_install "$(get_board)" build
+	fi
+}
diff --git a/sys-boot/depthcharge/depthcharge-9999.ebuild b/sys-boot/depthcharge/depthcharge-9999.ebuild
index 64110de..5ba7225 100644
--- a/sys-boot/depthcharge/depthcharge-9999.ebuild
+++ b/sys-boot/depthcharge/depthcharge-9999.ebuild
@@ -12,7 +12,7 @@
 LICENSE="GPL-2"
 KEYWORDS="~*"
 IUSE="detachable menu_ui legacy_menu_ui diag_payload fwconsole mocktpm pd_sync
-	unibuild verbose debug generated_cros_config
+	unibuild verbose debug generated_cros_config +minidiag
 	physical_presence_power physical_presence_recovery"
 
 DEPEND="
@@ -101,15 +101,10 @@
 	if use detachable ; then
 		echo "CONFIG_DETACHABLE=y" >> "${defconfig}"
 	fi
-	if use menu_ui ; then
-		echo "CONFIG_MENU_UI=y" >> "${defconfig}"
-	elif use legacy_menu_ui ; then
-		echo "CONFIG_LEGACY_MENU_UI=y" >> "${defconfig}"
-	else
-		echo "CONFIG_LEGACY_CLAMSHELL_UI=y" >> "${defconfig}"
-	fi
-	# Using diagnostic payload implies enabling UI to run it
-	if use diag_payload ; then
+	echo "CONFIG_MENU_UI=y" >> "${defconfig}"
+
+	# Both diag_payload and minidiag need special UI.
+	if use diag_payload || use minidiag ; then
 		echo "CONFIG_DIAGNOSTIC_UI=y" >> "${defconfig}"
 	fi
 
diff --git a/sys-boot/grub/files/0002-Forward-port-gptpriority-command-to-GRUB-2.00.patch b/sys-boot/grub/files/0002-Forward-port-gptpriority-command-to-GRUB-2.00.patch
index c62f406..bff8893 100644
--- a/sys-boot/grub/files/0002-Forward-port-gptpriority-command-to-GRUB-2.00.patch
+++ b/sys-boot/grub/files/0002-Forward-port-gptpriority-command-to-GRUB-2.00.patch
@@ -124,7 +124,7 @@
 +    }
 +
 +  grub_snprintf (priority_str, sizeof(priority_str), "%" PRIuGRUB_UINT64_T,
-+                 (part->gpt_attrib >> 48) & 0xfULL);
++                 (part->gpt_attrib >> 48) & 0xf);
 +
 +  if (argc == 3)
 +    {
diff --git a/sys-boot/grub/grub-2.02-r2.ebuild b/sys-boot/grub/grub-2.02-r3.ebuild
similarity index 100%
rename from sys-boot/grub/grub-2.02-r2.ebuild
rename to sys-boot/grub/grub-2.02-r3.ebuild
diff --git a/sys-boot/libpayload/files/configs/config.dedede b/sys-boot/libpayload/files/configs/config.dedede
old mode 100755
new mode 100644
diff --git a/sys-boot/libpayload/files/configs/config.strongbad b/sys-boot/libpayload/files/configs/config.strongbad
new file mode 100644
index 0000000..e8e6888
--- /dev/null
+++ b/sys-boot/libpayload/files/configs/config.strongbad
@@ -0,0 +1,6 @@
+CONFIG_LP_CHROMEOS=y
+CONFIG_LP_ARCH_ARM64=y
+CONFIG_LP_QUALCOMM_QUPV3_SERIAL_CONSOLE=y
+CONFIG_LP_TIMER_ARM64_ARCH=y
+CONFIG_LP_USB_EHCI=y
+CONFIG_LP_USB_XHCI=y
diff --git a/sys-boot/libpayload/libpayload-0.0.1-r3793.ebuild b/sys-boot/libpayload/libpayload-0.0.1-r3793.ebuild
deleted file mode 100644
index 2503dfe..0000000
--- a/sys-boot/libpayload/libpayload-0.0.1-r3793.ebuild
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright 2012 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-# Change this version number when any change is made to configs/files under
-# libpayload and an auto-revbump is required.
-# VERSION=REVBUMP-0.0.17
-
-EAPI=7
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-CROS_WORKON_EGIT_BRANCH="chromeos-2016.05"
-
-DESCRIPTION="coreboot's libpayload library"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="*"
-IUSE="coreboot-sdk verbose"
-
-CROS_WORKON_LOCALNAME="coreboot"
-
-# Don't strip to ease remote GDB use (cbfstool strips final binaries anyway)
-STRIP_MASK="*"
-
-inherit cros-workon cros-board toolchain-funcs coreboot-sdk
-
-src_compile() {
-	local src_root="payloads/libpayload"
-	local board=$(get_current_board_with_variant)
-
-	if ! use coreboot-sdk; then
-		tc-getCC
-		# Export the known cross compilers so there isn't a reliance
-		# on what the default profile is for exporting a compiler. The
-		# reasoning is that the firmware may need more than one to build
-		# and boot.
-		export CROSS_COMPILE_i386="i686-pc-linux-gnu-"
-		# For coreboot.org upstream architecture naming.
-		export CROSS_COMPILE_x86="i686-pc-linux-gnu-"
-		export CROSS_COMPILE_mipsel="mipsel-cros-linux-gnu-"
-		export CROSS_COMPILE_arm64="aarch64-cros-linux-gnu-"
-		export CROSS_COMPILE_arm="armv7a-cros-linux-gnu- armv7a-cros-linux-gnueabihf-"
-	else
-		export CROSS_COMPILE_x86=${COREBOOT_SDK_PREFIX_x86_32}
-		export CROSS_COMPILE_mipsel=${COREBOOT_SDK_PREFIX_mips}
-		export CROSS_COMPILE_arm64=${COREBOOT_SDK_PREFIX_arm64}
-		export CROSS_COMPILE_arm=${COREBOOT_SDK_PREFIX_arm}
-	fi
-
-	# we have all kinds of userland-cruft in CFLAGS that has no place in firmware.
-	# coreboot ignores CFLAGS, libpayload doesn't, so prune it.
-	unset CFLAGS
-
-	if [[ ! -s "${FILESDIR}/configs/config.${board}" ]]; then
-		board=$(get_current_board_no_variant)
-	fi
-
-	local board_config="$(realpath "${FILESDIR}/configs/config.${board}")"
-
-	[ -f "${board_config}" ] || die "${board_config} does not exist"
-
-	# get into the source directory
-	pushd "${src_root}"
-
-	# nuke build artifacts potentially present in the source directory
-	rm -rf build build_gdb .xcompile
-
-	local OPTS=( objutil="objutil" )
-
-	use verbose && OPTS+=( "V=1" )
-
-	# Configure and build
-	cp "${board_config}" .config
-	yes "" | \
-	emake "${OPTS[@]}" obj="build" oldconfig
-	emake "${OPTS[@]}" obj="build"
-
-	# Build a second set of libraries with GDB support for developers
-	( cat .config; echo "CONFIG_LP_REMOTEGDB=y" ) > .config.gdb
-	yes "" | \
-	emake "${OPTS[@]}" obj="build_gdb" DOTCONFIG=.config.gdb oldconfig
-	emake "${OPTS[@]}" obj="build_gdb" DOTCONFIG=.config.gdb
-
-	popd
-}
-
-src_install() {
-	local src_root="payloads/libpayload"
-
-	pushd "${src_root}"
-
-	emake obj="build_gdb" DESTDIR="${D}/firmware" DOTCONFIG=.config.gdb install
-	mv "${D}/firmware/libpayload" "${D}/firmware/libpayload_gdb"
-	emake obj="build" DESTDIR="${D}/firmware" install
-}
diff --git a/sys-boot/libpayload/libpayload-0.0.1-r3884.ebuild b/sys-boot/libpayload/libpayload-0.0.1-r3884.ebuild
new file mode 100644
index 0000000..dd36d20
--- /dev/null
+++ b/sys-boot/libpayload/libpayload-0.0.1-r3884.ebuild
@@ -0,0 +1,95 @@
+# Copyright 2012 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+# Change this version number when any change is made to configs/files under
+# libpayload and an auto-revbump is required.
+# VERSION=REVBUMP-0.0.17
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+CROS_WORKON_EGIT_BRANCH="chromeos-2016.05"
+
+DESCRIPTION="coreboot's libpayload library"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="*"
+IUSE="coreboot-sdk verbose"
+
+CROS_WORKON_LOCALNAME="coreboot"
+
+# Don't strip to ease remote GDB use (cbfstool strips final binaries anyway)
+STRIP_MASK="*"
+
+inherit cros-workon cros-board toolchain-funcs coreboot-sdk
+
+src_compile() {
+	local src_root="payloads/libpayload"
+	local board=$(get_current_board_with_variant)
+
+	if ! use coreboot-sdk; then
+		tc-getCC
+		# Export the known cross compilers so there isn't a reliance
+		# on what the default profile is for exporting a compiler. The
+		# reasoning is that the firmware may need more than one to build
+		# and boot.
+		export CROSS_COMPILE_i386="i686-pc-linux-gnu-"
+		# For coreboot.org upstream architecture naming.
+		export CROSS_COMPILE_x86="i686-pc-linux-gnu-"
+		export CROSS_COMPILE_mipsel="mipsel-cros-linux-gnu-"
+		export CROSS_COMPILE_arm64="aarch64-cros-linux-gnu-"
+		export CROSS_COMPILE_arm="armv7a-cros-linux-gnu- armv7a-cros-linux-gnueabihf-"
+	else
+		export CROSS_COMPILE_x86=${COREBOOT_SDK_PREFIX_x86_32}
+		export CROSS_COMPILE_mipsel=${COREBOOT_SDK_PREFIX_mips}
+		export CROSS_COMPILE_arm64=${COREBOOT_SDK_PREFIX_arm64}
+		export CROSS_COMPILE_arm=${COREBOOT_SDK_PREFIX_arm}
+	fi
+
+	# we have all kinds of userland-cruft in CFLAGS that has no place in firmware.
+	# coreboot ignores CFLAGS, libpayload doesn't, so prune it.
+	unset CFLAGS
+
+	if [[ ! -s "${FILESDIR}/configs/config.${board}" ]]; then
+		board=$(get_current_board_no_variant)
+	fi
+
+	local board_config="$(realpath "${FILESDIR}/configs/config.${board}")"
+
+	[ -f "${board_config}" ] || die "${board_config} does not exist"
+
+	# get into the source directory
+	pushd "${src_root}"
+
+	# nuke build artifacts potentially present in the source directory
+	rm -rf build build_gdb .xcompile
+
+	local OPTS=( objutil="objutil" )
+
+	use verbose && OPTS+=( "V=1" )
+
+	# Configure and build
+	cp "${board_config}" .config
+	yes "" | \
+	emake "${OPTS[@]}" obj="build" oldconfig
+	emake "${OPTS[@]}" obj="build"
+
+	# Build a second set of libraries with GDB support for developers
+	( cat .config; echo "CONFIG_LP_REMOTEGDB=y" ) > .config.gdb
+	yes "" | \
+	emake "${OPTS[@]}" obj="build_gdb" DOTCONFIG=.config.gdb oldconfig
+	emake "${OPTS[@]}" obj="build_gdb" DOTCONFIG=.config.gdb
+
+	popd
+}
+
+src_install() {
+	local src_root="payloads/libpayload"
+
+	pushd "${src_root}"
+
+	emake obj="build_gdb" DESTDIR="${D}/firmware" DOTCONFIG=.config.gdb install
+	mv "${D}/firmware/libpayload" "${D}/firmware/libpayload_gdb"
+	emake obj="build" DESTDIR="${D}/firmware" install
+}
diff --git a/sys-boot/u-boot/u-boot-2020.01-r2738.ebuild b/sys-boot/u-boot/u-boot-2020.01-r2738.ebuild
deleted file mode 100644
index 3f30d89..0000000
--- a/sys-boot/u-boot/u-boot-2020.01-r2738.ebuild
+++ /dev/null
@@ -1,179 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("4fdd055df627ffe351cfdf03d230eaf63399e1c2" "1a2ddae3d9782cbf0f0a1ab27ae3820c90abec54")
-CROS_WORKON_TREE=("856ab4444636080a5ff52fff0fd34c7be0288048" "82e77f6c98187361303fffeeba118a1a365e16d5")
-CROS_WORKON_PROJECT=("chromiumos/third_party/u-boot" "chromiumos/platform/vboot_reference")
-CROS_WORKON_LOCALNAME=("u-boot/files" "../platform/vboot_reference")
-CROS_WORKON_EGIT_BRANCH=("chromeos-v2020.01" "master")
-VBOOT_REFERENCE_DESTDIR="${S}/vboot_reference"
-CROS_WORKON_DESTDIR=("${S}" "${VBOOT_REFERENCE_DESTDIR}")
-
-inherit toolchain-funcs flag-o-matic cros-workon
-
-DESCRIPTION="Das U-Boot boot loader"
-HOMEPAGE="http://www.denx.de/wiki/U-Boot"
-
-LICENSE="GPL-2"
-KEYWORDS="*"
-IUSE="dev generated_cros_config sandbox unibuild vboot werror"
-
-DEPEND="sandbox? ( media-libs/libsdl:= )"
-
-RDEPEND="${DEPEND}
-	chromeos-base/u-boot-scripts
-	!!sys-boot/chromeos-u-boot
-	unibuild? (
-		!generated_cros_config? ( chromeos-base/chromeos-config )
-		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
-	)
-	"
-
-UB_BUILD_DIR="build"
-
-# To build for sandbox, check out the source:
-#
-#	cd src/third_party/u-boot/files
-#	git remote add dm git://git.denx.de/u-boot-dm.git
-#	git checkout dm/cros-working
-#
-# Then:
-#	cros_workon --host start u-boot
-#	USE="sandbox vboot" sudo -D emerge u-boot
-#	sudo chmod a+rw /firmware/image-u-boot.bin
-#	ln -s /firmware/image-u-boot.bin spi.bin
-#	/firmware/u-boot-tpl -d /firmware/u-boot.dtb.out \
-#		-L6 -c "host bind 0 $HOME/trunk/src/build/images/cheza/latest/chromiumos_image.bin; vboot go auto" -l
-#
-# See that it launches vboot (although without a functioning display) and
-# Ctrl-D attempts to boot the kernel.
-#
-# From outside the chroot:
-#
-#	ln -s  ${CROS}/chroot/firmware/image-u-boot.bin spi.bin
-#	${CROS}/chroot/firmware/u-boot-tpl -d \
-#		${CROS}/chroot/firmware/u-boot.dtb.out -L6 \
-#		-c "host bind 0 ${CROS}/src/build/images/cheza/latest/chromiumos_image.bin; vboot go auto" -l
-#
-# Outside the chroot the display and sound function correctly.
-
-# @FUNCTION: get_current_u_boot_config
-# @DESCRIPTION:
-# Finds the config for the current board by checking the master configuration.
-# The default is to use 'coreboot'.
-get_current_u_boot_config() {
-	local config
-
-	if use sandbox; then
-		config=chromeos_sandbox
-	else
-		config="$(cros_config_host get-firmware-build-targets u-boot)"
-	fi
-	echo "${config:-coreboot}"
-}
-
-umake() {
-	# Add `ARCH=` to reset ARCH env and let U-Boot choose it.
-	ARCH= emake "${COMMON_MAKE_FLAGS[@]}" "$@"
-}
-
-src_configure() {
-	local config
-
-	export LDFLAGS=$(raw-ldflags)
-	tc-export BUILD_CC
-
-	config="$(get_current_u_boot_config)"
-	[[ -n "${config}" ]] || die "No U-Boot config selected"
-	elog "Using U-Boot config: ${config}"
-
-	# Firmware related binaries are compiled with 32-bit toolchain
-	# on 64-bit platforms
-	if ! use cros_host && [[ ${CHOST} == x86_64-* ]]; then
-		CROSS_PREFIX="i686-pc-linux-gnu-"
-	else
-		CROSS_PREFIX="${CHOST}-"
-	fi
-
-	COMMON_MAKE_FLAGS=(
-		"CROSS_COMPILE=${CROSS_PREFIX}"
-		DEV_TREE_SEPARATE=1
-		"HOSTCC=${BUILD_CC}"
-		HOSTSTRIP=true
-		QEMU_ARCH=
-	)
-	if use vboot; then
-		COMMON_MAKE_FLAGS+=(
-			"VBOOT_SOURCE=${VBOOT_REFERENCE_DESTDIR}"
-			VBOOT_DEBUG=1
-		)
-	fi
-	if use dev; then
-		# Avoid hiding the errors and warnings
-		COMMON_MAKE_FLAGS+=(
-			-s
-			QUIET=1
-		)
-	else
-		COMMON_MAKE_FLAGS+=(
-			-k
-		)
-	fi
-	use werror && COMMON_MAKE_FLAGS+=( WERROR=y )
-
-	BUILD_FLAGS=(
-		"O=${UB_BUILD_DIR}"
-	)
-
-	umake "${BUILD_FLAGS[@]}" distclean
-	umake "${BUILD_FLAGS[@]}" "${config}_defconfig"
-}
-
-src_compile() {
-	umake "${BUILD_FLAGS[@]}" all
-}
-
-src_install() {
-	local inst_dir="/firmware"
-	local files_to_copy=(
-		System.map
-		u-boot.bin
-		u-boot.dtb
-		u-boot.dtb.out
-		u-boot.img
-	)
-	local exec_to_copy=(
-		u-boot
-		spl/u-boot-spl
-		tpl/u-boot-tpl
-	)
-	local f
-
-	if ! use sandbox; then
-		files_to_copy+=( "${exec_to_copy[@]}" )
-		exec_to_copy=()
-	fi
-
-	insinto "${inst_dir}"
-	exeinto "${inst_dir}"
-
-	for f in "${files_to_copy[@]}"; do
-		[[ -f "${UB_BUILD_DIR}/${f}" ]] &&
-			doins "${f/#/${UB_BUILD_DIR}/}"
-	done
-
-	for f in "${exec_to_copy[@]}"; do
-		[[ -f "${UB_BUILD_DIR}/${f}" ]] &&
-			doexe "${f/#/${UB_BUILD_DIR}/}"
-	done
-
-	# Install the full image needed by sandbox.
-	if use vboot; then
-		newins "${UB_BUILD_DIR}/image.bin" image-u-boot.bin
-	fi
-
-	insinto "${inst_dir}/dtb"
-	doins "${UB_BUILD_DIR}/dts/"*.dtb
-}
diff --git a/sys-boot/u-boot/u-boot-2020.10-r2791.ebuild b/sys-boot/u-boot/u-boot-2020.10-r2791.ebuild
new file mode 100644
index 0000000..0f6c3f9
--- /dev/null
+++ b/sys-boot/u-boot/u-boot-2020.10-r2791.ebuild
@@ -0,0 +1,179 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("bc1199918e73f3f810b2eeb5dc38e71a5914772a" "524012c64c07f8673998428cca7f80e01a387f48")
+CROS_WORKON_TREE=("35ebd6a3b5d8c89eb1cdc4d68b8ad69c0c8dd8be" "d011d454951af2d6dbcf7d4dc7af53a31cc883db")
+CROS_WORKON_PROJECT=("chromiumos/third_party/u-boot" "chromiumos/platform/vboot_reference")
+CROS_WORKON_LOCALNAME=("u-boot/files" "../platform/vboot_reference")
+CROS_WORKON_EGIT_BRANCH=("chromeos-v2020.01" "master")
+VBOOT_REFERENCE_DESTDIR="${S}/vboot_reference"
+CROS_WORKON_DESTDIR=("${S}" "${VBOOT_REFERENCE_DESTDIR}")
+
+inherit toolchain-funcs flag-o-matic cros-workon
+
+DESCRIPTION="Das U-Boot boot loader"
+HOMEPAGE="http://www.denx.de/wiki/U-Boot"
+
+LICENSE="GPL-2"
+KEYWORDS="*"
+IUSE="dev generated_cros_config sandbox unibuild vboot werror"
+
+DEPEND="sandbox? ( media-libs/libsdl:= )"
+
+RDEPEND="${DEPEND}
+	chromeos-base/u-boot-scripts
+	!!sys-boot/chromeos-u-boot
+	unibuild? (
+		!generated_cros_config? ( chromeos-base/chromeos-config )
+		generated_cros_config? ( chromeos-base/chromeos-config-bsp:= )
+	)
+	"
+
+UB_BUILD_DIR="build"
+
+# To build for sandbox, check out the source:
+#
+#	cd src/third_party/u-boot/files
+#	git remote add dm git://git.denx.de/u-boot-dm.git
+#	git checkout dm/cros-working
+#
+# Then:
+#	cros_workon --host start u-boot
+#	USE="sandbox vboot" sudo -D emerge u-boot
+#	sudo chmod a+rw /firmware/image-u-boot.bin
+#	ln -s /firmware/image-u-boot.bin spi.bin
+#	/firmware/u-boot-tpl -d /firmware/u-boot.dtb.out \
+#		-L6 -c "host bind 0 $HOME/trunk/src/build/images/cheza/latest/chromiumos_image.bin; vboot go auto" -l
+#
+# See that it launches vboot (although without a functioning display) and
+# Ctrl-D attempts to boot the kernel.
+#
+# From outside the chroot:
+#
+#	ln -s  ${CROS}/chroot/firmware/image-u-boot.bin spi.bin
+#	${CROS}/chroot/firmware/u-boot-tpl -d \
+#		${CROS}/chroot/firmware/u-boot.dtb.out -L6 \
+#		-c "host bind 0 ${CROS}/src/build/images/cheza/latest/chromiumos_image.bin; vboot go auto" -l
+#
+# Outside the chroot the display and sound function correctly.
+
+# @FUNCTION: get_current_u_boot_config
+# @DESCRIPTION:
+# Finds the config for the current board by checking the master configuration.
+# The default is to use 'coreboot'.
+get_current_u_boot_config() {
+	local config
+
+	if use sandbox; then
+		config=chromeos_sandbox
+	else
+		config="$(cros_config_host get-firmware-build-targets u-boot)"
+	fi
+	echo "${config:-coreboot}"
+}
+
+umake() {
+	# Add `ARCH=` to reset ARCH env and let U-Boot choose it.
+	ARCH= emake "${COMMON_MAKE_FLAGS[@]}" "$@"
+}
+
+src_configure() {
+	local config
+
+	export LDFLAGS=$(raw-ldflags)
+	tc-export BUILD_CC
+
+	config="$(get_current_u_boot_config)"
+	[[ -n "${config}" ]] || die "No U-Boot config selected"
+	elog "Using U-Boot config: ${config}"
+
+	# Firmware related binaries are compiled with 32-bit toolchain
+	# on 64-bit platforms
+	if ! use cros_host && [[ ${CHOST} == x86_64-* ]]; then
+		CROSS_PREFIX="i686-pc-linux-gnu-"
+	else
+		CROSS_PREFIX="${CHOST}-"
+	fi
+
+	COMMON_MAKE_FLAGS=(
+		"CROSS_COMPILE=${CROSS_PREFIX}"
+		DEV_TREE_SEPARATE=1
+		"HOSTCC=${BUILD_CC}"
+		HOSTSTRIP=true
+		QEMU_ARCH=
+	)
+	if use vboot; then
+		COMMON_MAKE_FLAGS+=(
+			"VBOOT_SOURCE=${VBOOT_REFERENCE_DESTDIR}"
+			VBOOT_DEBUG=1
+		)
+	fi
+	if use dev; then
+		# Avoid hiding the errors and warnings
+		COMMON_MAKE_FLAGS+=(
+			-s
+			QUIET=1
+		)
+	else
+		COMMON_MAKE_FLAGS+=(
+			-k
+		)
+	fi
+	use werror && COMMON_MAKE_FLAGS+=( WERROR=y )
+
+	BUILD_FLAGS=(
+		"O=${UB_BUILD_DIR}"
+	)
+
+	umake "${BUILD_FLAGS[@]}" distclean
+	umake "${BUILD_FLAGS[@]}" "${config}_defconfig"
+}
+
+src_compile() {
+	umake "${BUILD_FLAGS[@]}" all
+}
+
+src_install() {
+	local inst_dir="/firmware"
+	local files_to_copy=(
+		System.map
+		u-boot.bin
+		u-boot.dtb
+		u-boot.dtb.out
+		u-boot.img
+	)
+	local exec_to_copy=(
+		u-boot
+		spl/u-boot-spl
+		tpl/u-boot-tpl
+	)
+	local f
+
+	if ! use sandbox; then
+		files_to_copy+=( "${exec_to_copy[@]}" )
+		exec_to_copy=()
+	fi
+
+	insinto "${inst_dir}"
+	exeinto "${inst_dir}"
+
+	for f in "${files_to_copy[@]}"; do
+		[[ -f "${UB_BUILD_DIR}/${f}" ]] &&
+			doins "${f/#/${UB_BUILD_DIR}/}"
+	done
+
+	for f in "${exec_to_copy[@]}"; do
+		[[ -f "${UB_BUILD_DIR}/${f}" ]] &&
+			doexe "${f/#/${UB_BUILD_DIR}/}"
+	done
+
+	# Install the full image needed by sandbox.
+	if use vboot; then
+		newins "${UB_BUILD_DIR}/image.bin" image-u-boot.bin
+	fi
+
+	insinto "${inst_dir}/dtb"
+	doins "${UB_BUILD_DIR}/dts/"*.dtb
+}
diff --git a/sys-devel/arc-build/arc-build-0.0.3-r14.ebuild b/sys-devel/arc-build/arc-build-0.0.3-r16.ebuild
similarity index 100%
rename from sys-devel/arc-build/arc-build-0.0.3-r14.ebuild
rename to sys-devel/arc-build/arc-build-0.0.3-r16.ebuild
diff --git a/sys-devel/arc-cache-builder/Manifest b/sys-devel/arc-cache-builder/Manifest
deleted file mode 100644
index 43f9fa9..0000000
--- a/sys-devel/arc-cache-builder/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST arc-cache-builder-0.6.3.tbz2 389259 BLAKE2B 791010ca194bfdd8f63ff23893c04372102db5a444992bf7b1efe415a7071b64119820dad48d0a8a36463a18f24f39f712bda40cd23400276a02f3c8ea93c5eb SHA512 8ddc27494642a4af0f6377a4a0095fccda139f85413af602d66fe51b0b1d1924b0188beb5ae1e725d452c3fb3b2870c415244c822522b6fe28e259217962cf2a
diff --git a/sys-devel/arc-cache-builder/arc-cache-builder-0.6.3-r1.ebuild b/sys-devel/arc-cache-builder/arc-cache-builder-0.6.3-r1.ebuild
deleted file mode 100644
index caee556..0000000
--- a/sys-devel/arc-cache-builder/arc-cache-builder-0.6.3-r1.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# The tarball contains the arc-cache-builder.jar. It is compiled in ARC Pi by
-# mmma vendor/google_arc/tools/ArcCacheBuilder/
-# Current version 0.5.0 is built from commit
-# b60f0b31804fd703c4ece419355d0f6655615476
-# see ab/6182165
-
-EAPI="5"
-
-DESCRIPTION="Ebuild which pulls in java library arc-cache-builder.jar"
-SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tbz2"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-S="${WORKDIR}"
-
-src_install() {
-	insinto /usr/share/arc-cache-builder
-	doins org.chromium.arc.cachebuilder.jar
-	dobin "${FILESDIR}/arc_generate_packages_cache"
-}
diff --git a/sys-devel/arc-cache-builder/files/arc_generate_packages_cache b/sys-devel/arc-cache-builder/files/arc_generate_packages_cache
deleted file mode 100755
index 3bc9da2..0000000
--- a/sys-devel/arc-cache-builder/files/arc_generate_packages_cache
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-set -e
-
-# Print usage string
-usage() {
-  cat <<EOF
-Usage: $PROG /path/to/mount/system/image/dir \
-/path/to/mount/vendor/image/dir \
-/path/to/output/file
-
-Generate packages cache for the provided system and vendor images.
-
-EOF
-  if [[ $# -gt 0 ]]; then
-    echo "$*" 1>&2
-    exit 1
-  fi
-  exit 0
-}
-
-main() {
-  local system_mnt=$1
-  local vendor_mnt=$2
-  local output_file=$3
-
-  if [[ $# -ne 3 ]]; then
-    usage "command takes exactly 3 args"
-  fi
-
-  java -cp \
-    /usr/share/arc-cache-builder/org.chromium.arc.cachebuilder.jar \
-    org.chromium.arc.cachebuilder.CacheGenerator \
-    --system-root "${system_mnt}" \
-    --vendor-root "${vendor_mnt}" \
-    --output "${output_file}"
-}
-
-main "$@"
diff --git a/sys-devel/arc-toolchain-r/Manifest b/sys-devel/arc-toolchain-r/Manifest
index 16b2afe..13046a0 100644
--- a/sys-devel/arc-toolchain-r/Manifest
+++ b/sys-devel/arc-toolchain-r/Manifest
@@ -1 +1,2 @@
 DIST arc-toolchain-r-2020.05.08.tar.gz 420262168 BLAKE2B 70117d52087f0e026cfa94ba606310402fb28ff8b69db10f726677269f50b7f01d4246a64b4b7dcb0092ee321eb7172ac2bb0af2e28e267276f3a6b2447b04bf SHA512 853a98d8fb79c06598919816b79adec5b6abdb53d6af6e9289aab056bc13e586274c564976dd3f9eaf5716d209703f6d99561bd30ac23e81431415459baa1c6b
+DIST arc-toolchain-r-2020.07.10.tar.gz 455721702 BLAKE2B 05e8c0dace3f48a949d9fb473ecabebcb87a8cedbc9fcee439bdbf824ba2300dd47e70a6487c2be8fceb74e0f1b8a12952d26735b0ed8e673d816323ab2f5e58 SHA512 79b2a52a585cd031af235b3fd6ad0743c41042e8673df1e3d47ed9e14a609cb68689fe3c49d89ddb20d20759c93962f076f29122c3d539447b2282ffbac163b4
diff --git a/sys-devel/arc-toolchain-r/arc-toolchain-r-2020.07.10.ebuild b/sys-devel/arc-toolchain-r/arc-toolchain-r-2020.07.10.ebuild
new file mode 100644
index 0000000..02807c2
--- /dev/null
+++ b/sys-devel/arc-toolchain-r/arc-toolchain-r-2020.07.10.ebuild
@@ -0,0 +1,33 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+DESCRIPTION="Ebuild for Android toolchain (compilers, linker, libraries, headers)."
+
+# The source tarball contains files collected from the sources below.
+#
+#   # from ab/6669064
+#   bertha_arm64-target_files-6669064.zip
+#   bertha_x86_64-target_files-6669064.zip
+#
+SRC_URI="http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/${P}.tar.gz"
+
+LICENSE="GPL-3 LGPL-3 GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 FDL-1.2 UoI-NCSA"
+SLOT="0"
+KEYWORDS="-* amd64"
+IUSE=""
+
+S="${WORKDIR}"
+INSTALL_DIR="/opt/android-r"
+
+
+# These prebuilts are already properly stripped.
+RESTRICT="strip"
+QA_PREBUILT="*"
+
+src_install() {
+	dodir "${INSTALL_DIR}"
+	cp -pPR ./* "${D}/${INSTALL_DIR}/" || die
+}
diff --git a/sys-devel/arc-toolchain-r/files/gather.sh b/sys-devel/arc-toolchain-r/files/gather.sh
index 92d6db98..1fc2b7a 100755
--- a/sys-devel/arc-toolchain-r/files/gather.sh
+++ b/sys-devel/arc-toolchain-r/files/gather.sh
@@ -60,7 +60,7 @@
 # 2. The dir to which the artifacts tarball (downloaded from go/ab) was
 # extracted. Pick a -userdebug build.
 # Now we support two platforms: 32/64-bit arm and 32/64-bit x86.
-: "${ARTIFACTS_DIR_X86_64:="${ANDROID_TREE}/arm64_target_files/"}"
+: "${ARTIFACTS_DIR_ARM64:="${ANDROID_TREE}/arm64_target_files/"}"
 : "${ARTIFACTS_DIR_X86_64:="${ANDROID_TREE}/x86_64_target_files/"}"
 
 ARTIFACTS_DIR_ARRAY=(
@@ -183,7 +183,9 @@
 
 	lib_crt="${ARC_ARCH_LIB_CRT_DIR[${a}]}"
 	for f in crtbegin_static.o crtbegin_dynamic.o crtend_android.o crtbegin_so.o crtend_so.o; do
-		absolute_f="${ANDROID_TREE}/prebuilts/ndk/current/platforms/android-24"
+                # android-30 does not exist yet(?) for rvc-arc-dev so we pick 29
+                # instead
+		absolute_f="${ANDROID_TREE}/prebuilts/ndk/current/platforms/android-29"
 		absolute_f+="/arch-${arch}/usr/${lib_crt}/${f}"
 		if [[ ! -e "${absolute_f}" ]]; then
 			echo "${absolute_f} not found, perhaps you forgot to check it out?"\
@@ -303,10 +305,11 @@
 ### 5. Copy compiler over.
 
 ### 5.1 clang.
-runcmd mkdir -p "${TO_DIR_BASE}/arc-llvm/9.0.3"
+ARC_LLVM_VERSION="11.0.2"
+runcmd mkdir -p "${TO_DIR_BASE}/arc-llvm/${ARC_LLVM_VERSION}"
 runcmd cp -pPr \
-	"${ANDROID_TREE}/prebuilts/clang/host/linux-x86/clang-r377782c"/* \
-	"${TO_DIR_BASE}/arc-llvm/9.0.3" || echo "Please update clang version manually"
+	"${ANDROID_TREE}/prebuilts/clang/host/linux-x86/clang-r383902b"/* \
+	"${TO_DIR_BASE}/arc-llvm/${ARC_LLVM_VERSION}" || echo "Please update clang version manually"
 
 ### 5.2 gcc.
 runcmd mkdir -p "${TO_DIR_BASE}/arc-gcc"
diff --git a/sys-devel/autofdo/OWNERS b/sys-devel/autofdo/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-devel/autofdo/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-devel/binutils/OWNERS b/sys-devel/binutils/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-devel/binutils/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-devel/dex2oatds/Manifest b/sys-devel/dex2oatds/Manifest
index 7d1f7dd..1255f6f 100644
--- a/sys-devel/dex2oatds/Manifest
+++ b/sys-devel/dex2oatds/Manifest
@@ -1,2 +1,3 @@
-DIST dex2oatds-0.0.1-pi.tbz2 92139531 SHA256 f91287167a8f6ab08af25f718249304edc473dbedcdfd8326be970d11fabff3a SHA512 b764bdd0b37ed29c78352211b4c294054976771de9012348f384cab3678b5124617e31ce7df2806f0aaf2b6189c8bb8aeb1513e8783c2a2c4db3a9c44c04c1c4 WHIRLPOOL 9eefb49c30c56dfb942898da59c9e1afed0130175a541343a1b67b4e8d9c80d59e1302f8dfc829dcd18b9c90ca31888793d5d48fb414731e0afe3b0002712914
-DIST dex2oatds-0.0.1.tbz2 72917141 SHA256 87a619b0705cdcee5aa081dc81ec58788bd4af6be599743312fa951ea1107c64 SHA512 0168069d31b0cb7e1c987777490a11ee5ced3364894c2313ff907b5306a51ab62e47fa3475ee0bc408504d913df1ff44cf93da1c0e318df90fa820a0fdf28147 WHIRLPOOL 5252b7b4d25388b8f3436b53966c37ffbe1dcbda85c9156f18659d61972703187351e00a8d1977a469f48ffa539b9bc1fdcaf53ce9a051f6450c68aee361e0e0
+DIST dex2oatds-0.0.1-pi.tbz2 92139531 BLAKE2B c9a51d2dd3b068efb26674bf7995c38c8ebb52df5743576ff06227e65a9036253394b9b0562699a38d1433641ed7308b4b4b0b0b01a65998444e3fba4f6aef34 SHA512 b764bdd0b37ed29c78352211b4c294054976771de9012348f384cab3678b5124617e31ce7df2806f0aaf2b6189c8bb8aeb1513e8783c2a2c4db3a9c44c04c1c4
+DIST dex2oatds-0.0.1-rvc.tbz2 105811110 BLAKE2B 5578ce57192260b8c0ca9c5f657bf71d3d788b9c509f6b8eb941d65f049fe950d68fb2427fb18c9f4f85d837e3799abae94bb9fe24ec997d3ad1d0f7e386abf0 SHA512 d9597b741a6c723b0f50dbaeefe06ef0534d7fac713249cee72a43d8ea6d218b8958114247103690229910990d35dba03e2a0cf24c32f9d80429cf37c5931e18
+DIST dex2oatds-0.0.1.tbz2 72917141 BLAKE2B 37d84d63d6714663b8123cc1caf9025442501688760fa7bfc3d439cfd5c3720cd26163b16dcaafe625424f8eb8ccb4b89d9a7d00ff9abc150f3aead744f9dcd2 SHA512 0168069d31b0cb7e1c987777490a11ee5ced3364894c2313ff907b5306a51ab62e47fa3475ee0bc408504d913df1ff44cf93da1c0e318df90fa820a0fdf28147
diff --git a/sys-devel/dex2oatds/dex2oatds-0.0.1-r2.ebuild b/sys-devel/dex2oatds/dex2oatds-0.0.1-r2.ebuild
deleted file mode 100644
index 3381c55..0000000
--- a/sys-devel/dex2oatds/dex2oatds-0.0.1-r2.ebuild
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# The tarball contains the static linked dex2oat binary executable. It is
-# produced by Android build server and copied from the url below.
-# gs://android-build-chromeos/builds/git_nyc-mr1-arc-linux-static_build_tools/4254306/9522bf7036721fd1cb8074f1a457e860a111924dc320d19975d81e6163fcd7f6/dex2oatds
-#
-# A functionally similar binary can be created from AOSP source tree with
-# command below:
-#     ART_BUILD_HOST_STATIC=true ART_BUILD_HOST_NDEBUG=true mmma art/dex2oat
-# We do not build it from source because of size and complexity of pulling
-# down a big portion of AOSP source tree.
-#
-# For P, the binary was copied from:
-# https://android-build.googleplex.com/builds/submitted/5016670/cheets_x86_64-user/latest
-
-EAPI="5"
-
-DESCRIPTION="Ebuild which pulls in binaries of dex2oatds"
-SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tbz2
-	gs://chromeos-localmirror/distfiles/${P}-pi.tbz2"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-S="${WORKDIR}"
-
-src_install() {
-	dobin dex2oatds
-	dobin dex2oatds-pi
-}
diff --git a/sys-devel/dex2oatds/dex2oatds-0.0.1-r3.ebuild b/sys-devel/dex2oatds/dex2oatds-0.0.1-r3.ebuild
new file mode 100644
index 0000000..c0734d1
--- /dev/null
+++ b/sys-devel/dex2oatds/dex2oatds-0.0.1-r3.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# The tarball contains the static linked dex2oat binary executable. It is
+# produced by Android build server and copied from the url below.
+# gs://android-build-chromeos/builds/git_nyc-mr1-arc-linux-static_build_tools/4254306/9522bf7036721fd1cb8074f1a457e860a111924dc320d19975d81e6163fcd7f6/dex2oatds
+#
+# A functionally similar binary can be created from AOSP source tree with
+# command below:
+#     ART_BUILD_HOST_STATIC=true ART_BUILD_HOST_NDEBUG=true mmma art/dex2oat
+# We do not build it from source because of size and complexity of pulling
+# down a big portion of AOSP source tree.
+#
+# For P, the binary was copied from:
+# https://android-build.googleplex.com/builds/submitted/5016670/cheets_x86_64-user/latest
+# For RVC, the binary is build from rvc-arc-dev art commit
+# 337cf0aa8a455479ca0bcb53a484fd9046c06a91 mmma art/
+
+EAPI="5"
+
+DESCRIPTION="Ebuild which pulls in binaries of dex2oatds"
+SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tbz2
+	gs://chromeos-localmirror/distfiles/${P}-pi.tbz2
+	gs://chromeos-localmirror/distfiles/${P}-rvc.tbz2"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+S="${WORKDIR}"
+
+src_install() {
+	dobin dex2oatds
+	dobin dex2oatds-pi
+	dobin dex2oats-rvc
+}
diff --git a/sys-devel/gcc/OWNERS b/sys-devel/gcc/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-devel/gcc/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-devel/gcc/gcc-4.9.2-r253.ebuild b/sys-devel/gcc/gcc-4.9.2-r253.ebuild
deleted file mode 100644
index cf4f666..0000000
--- a/sys-devel/gcc/gcc-4.9.2-r253.ebuild
+++ /dev/null
@@ -1,608 +0,0 @@
-# Copyright 1999-2014 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/gcc-4.4.3-r3.ebuild,v 1.1 2010/06/19 01:53:09 zorry Exp $
-
-EAPI="7"
-CROS_WORKON_COMMIT="ac6128e0a17a52f011797f33ac3e7d6273a9368d"
-CROS_WORKON_TREE="aff2e49c815be09f20e4346cc98144b604388cb7"
-CROS_WORKON_REPO="https://android.googlesource.com"
-CROS_WORKON_PROJECT="toolchain/gcc"
-CROS_WORKON_LOCALNAME=../aosp/toolchain/gcc
-NEXT_GCC="origin/svn-mirror/google/gcc-4_9"
-NEXT_GCC_REPO="https://chromium.googlesource.com/chromiumos/third_party/gcc.git"
-
-# By default, PREV_GCC points to the parent of current tip of origin/master.
-# If that is a bad commit, override this to point to the last known good commit.
-PREV_GCC="origin/master^"
-
-inherit eutils cros-workon binutils-funcs
-
-GCC_FILESDIR="${PORTDIR}/sys-devel/gcc/files"
-
-DESCRIPTION="The GNU Compiler Collection.  Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking. This Compiler is based off of Crosstoolv14."
-
-LICENSE="GPL-3 LGPL-3 || ( GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2"
-KEYWORDS="*"
-
-RDEPEND=">=sys-libs/zlib-1.1.4
-	>=sys-devel/gcc-config-1.6
-	virtual/libiconv
-	>=dev-libs/gmp-4.3.2
-	>=dev-libs/mpc-0.8.1
-	>=dev-libs/mpfr-2.4.2
-	graphite? (
-		>=dev-libs/cloog-0.18.0
-		>=dev-libs/isl-0.11.1
-	)"
-DEPEND="${RDEPEND}
-	test? (
-		>=dev-util/dejagnu-1.4.4
-		>=sys-devel/autogen-5.5.4
-	)
-	>=sys-apps/texinfo-4.8
-	>=sys-devel/bison-1.875"
-PDEPEND=">=sys-devel/gcc-config-1.7"
-BDEPEND="${CATEGORY}/binutils"
-
-RESTRICT="mirror strip"
-
-IUSE="gcc_repo gcj git_gcc go graphite gtk hardened hardfp llvm-next llvm-tot mounted_gcc multilib
-	nls cxx openmp test tests +thumb upstream_gcc vanilla vtable_verify +wrapper_ccache
-	next_gcc prev_gcc"
-REQUIRED_USE="next_gcc? ( !prev_gcc )"
-
-is_crosscompile() { [[ ${CHOST} != ${CTARGET} ]] ; }
-
-export CTARGET=${CTARGET:-${CHOST}}
-if [[ ${CTARGET} = ${CHOST} ]] ; then
-	if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then
-		export CTARGET=${CATEGORY/cross-}
-	fi
-fi
-
-SLOT="${CTARGET}"
-
-PREFIX=/usr
-
-update_location_for_aosp() {
-	# For aosp gcc repository, the actual gcc directory is 1 more
-	# level down, eg. gcc/gcc-4.9, pick up the newest one in this
-	# case.
-	local gccsub=$(find "${S}" -maxdepth 1 -type d -name "gcc-*" | sort -r | head -1)
-	if [[ -d "${gccsub}" ]] && [[ -d "${gccsub}/gcc/config/arm/" ]]; then
-		S="${gccsub}"
-	fi
-	cd "${S}"
-}
-
-cros_pre_src_prepare_use_gcc() {
-	cros_use_gcc
-}
-
-src_unpack() {
-	if use mounted_gcc ; then
-		if [[ ! -d "$(get_gcc_dir)" ]] ; then
-			die "gcc dir not mounted/present at: $(get_gcc_dir)"
-		fi
-		S=$(get_gcc_dir)
-	elif use upstream_gcc ; then
-		GCC_MIRROR=ftp://mirrors.kernel.org/gnu/gcc
-		GCC_TARBALL=${GCC_MIRROR}/${P}/${P}.tar.bz2
-		wget $GCC_TARBALL
-		tar xf ${GCC_TARBALL##*/}
-	elif use git_gcc || use next_gcc || use prev_gcc ; then
-		aosp_git="${CROS_WORKON_REPO}/${CROS_WORKON_PROJECT}.git"
-		if use gcc_repo ; then
-			gcc_repository="${GCC_REPO}"
-		elif use next_gcc ; then
-			gcc_repository="${NEXT_GCC_REPO}"
-		else
-			gcc_repository="${aosp_git}"
-		fi
-		git clone --depth 1 --no-single-branch "${gcc_repository}" "${S}"
-		if use next_gcc ; then
-			GCC_GITHASH="${NEXT_GCC}"
-		fi
-		if use prev_gcc ; then
-			GCC_GITHASH="${PREV_GCC}"
-		fi
-		if [[ -n ${GCC_GITHASH} ]] ; then
-			einfo "Checking out: ${GCC_GITHASH}"
-			pushd "$(get_gcc_dir)" >/dev/null
-			git checkout ${GCC_GITHASH} || \
-				die "Couldn't checkout ${GCC_GITHASH}"
-			popd >/dev/null
-		fi
-		if [[ ${gcc_repository} == "${aosp_git}" ]] ; then
-			update_location_for_aosp
-		fi
-	else
-		cros-workon_src_unpack
-		update_location_for_aosp
-		[[ ${ABI} == "x32" ]] && epatch "${FILESDIR}"/90_all_gcc-4.7-x32.patch
-	fi
-
-	COST_PKG_VERSION="$("${FILESDIR}"/chromeos-version.sh "${S}")_cos_gg"
-	if [[ -d ${S}/.git ]]; then
-		COST_PKG_VERSION+="_$(cd ${S}; git describe --always)"
-	elif [[ -n ${VCSID} ]]; then
-		COST_PKG_VERSION+="_${VCSID}"
-	fi
-	COST_PKG_VERSION+="_${PVR}"
-}
-
-src_configure() {
-	if use mounted_gcc && [[ -f $(get_gcc_build_dir)/Makefile ]]; then
-		ewarn "Skipping configure due to existing build output"
-		return
-	fi
-
-	# GCC builds do not like LD being set, it will find correct LD to use.
-	unset LD BUILD_LD
-
-	local gcc_langs="c"
-	use cxx && gcc_langs+=",c++"
-	use go && gcc_langs+=",go"
-
-	# Set configuration based on path variables
-	local DATAPATH=$(get_data_dir)
-	local confgcc=(
-		--prefix=${PREFIX}
-		--bindir=$(get_bin_dir)
-		--datadir=${DATAPATH}
-		--includedir=$(get_lib_dir)/include
-		--with-gxx-include-dir=$(get_stdcxx_incdir)
-		--mandir=${DATAPATH}/man
-		--infodir=${DATAPATH}/info
-		--with-python-dir=${DATAPATH#${PREFIX}}/python
-
-		--build=${CBUILD}
-		--host=${CHOST}
-		--target=${CTARGET}
-		--enable-languages=${gcc_langs}
-		--enable-__cxa_atexit
-		--disable-canonical-system-headers
-		--enable-checking=release
-		--enable-linker-build-id
-
-		--with-bugurl='http://code.google.com/p/chromium-os/issues/entry'
-		--with-pkgversion="${COST_PKG_VERSION}"
-
-		$(use_enable go libatomic)
-		$(use_enable multilib)
-		$(use_enable openmp libgomp)
-
-		# Disable libs we don't care about.
-		--disable-libcilkrts
-		--disable-libitm
-		--disable-libmudflap
-		--disable-libquadmath
-		--disable-libssp
-		--disable-libsanitizer
-
-		# Enable frame pointer by default for all the boards.
-		# originally only enabled for i686 for chromium-os:23321.
-		--enable-frame-pointer
-	)
-
-	if use vtable_verify; then
-		confgcc+=(
-			--enable-cxx-flags=-Wl,-L../libsupc++/.libs
-			--enable-vtable-verify
-		)
-	fi
-
-	# Handle target-specific options.
-	case ${CTARGET} in
-	arm*)	#264534
-		local arm_arch="${CTARGET%%-*}"
-		# Only do this if arm_arch is armv*
-		if [[ ${arm_arch} == armv* ]]; then
-			# Convert armv7{a,r,m} to armv7-{a,r,m}
-			[[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-}
-			# Remove endian ('l' / 'eb')
-			[[ ${arm_arch} == *l ]] && arm_arch=${arm_arch%l}
-			[[ ${arm_arch} == *eb ]] && arm_arch=${arm_arch%eb}
-			confgcc+=(
-				--with-arch=${arm_arch}
-				--disable-esp
-			)
-		fi
-		use hardfp && confgcc+=( --with-float=hard )
-		use thumb && confgcc+=( --with-mode=thumb )
-		;;
-	i?86*)
-		# Hardened is enabled for x86, but disabled for ARM.
-		confgcc+=(
-			--enable-esp
-			--with-arch=atom
-			--with-tune=atom
-		)
-		;;
-	x86_64*-gnux32)
-		confgcc+=( --with-abi=x32 --with-multilib-list=mx32 )
-		;;
-	esac
-
-	if is_crosscompile; then
-		confgcc+=( --enable-poison-system-directories )
-
-		local needed_libc="glibc"
-		if [[ -n ${needed_libc} ]]; then
-			if ! has_version ${CATEGORY}/${needed_libc}; then
-				confgcc+=( --disable-shared --disable-threads --without-headers )
-			elif built_with_use --hidden --missing false ${CATEGORY}/${needed_libc} crosscompile_opts_headers-only; then
-				confgcc+=( --disable-shared --with-sysroot=/usr/${CTARGET} )
-			else
-				confgcc+=( --with-sysroot=/usr/${CTARGET} )
-			fi
-		fi
-	else
-		confgcc+=( --enable-shared --enable-threads=posix )
-	fi
-
-	# Finally add the user options (if any).
-	confgcc+=( ${EXTRA_ECONF} )
-
-	# Build in a separate build tree
-	mkdir -p $(get_gcc_build_dir) || die
-	cd $(get_gcc_build_dir) || die
-
-	# and now to do the actual configuration
-	addwrite /dev/zero
-	echo "Running this:"
-	echo "$(get_gcc_dir)"/configure "${confgcc[@]}"
-	"$(get_gcc_dir)"/configure "${confgcc[@]}" || die
-}
-
-src_compile() {
-	cd "$(get_gcc_build_dir)"
-	GCC_CFLAGS="$(portageq envvar CFLAGS)"
-	TARGET_FLAGS=""
-	TARGET_GO_FLAGS=""
-
-	if use hardened ; then
-		TARGET_FLAGS="${TARGET_FLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2"
-	fi
-
-	EXTRA_CFLAGS_FOR_TARGET="${TARGET_FLAGS} ${CFLAGS_FOR_TARGET}"
-	EXTRA_CXXFLAGS_FOR_TARGET="${TARGET_FLAGS} ${CXXFLAGS_FOR_TARGET}"
-
-	if use vtable_verify ; then
-		EXTRA_CXXFLAGS_FOR_TARGET+=" -fvtable-verify=std"
-	fi
-
-	# libgo on arm must be compiled with -marm. Go's panic/recover functionality
-	# is broken in thumb mode.
-	if [[ ${CTARGET} == arm* ]]; then
-		TARGET_GO_FLAGS="${TARGET_GO_FLAGS} -marm"
-	fi
-	EXTRA_GOCFLAGS_FOR_TARGET="${TARGET_GO_FLAGS} ${GOCFLAGS_FOR_TARGET}"
-
-	# Do not link libgcc with gold. That is known to fail on internal linker
-	# errors. See crosbug.com/16719
-	local LD_NON_GOLD="$(get_binutils_path_ld ${CTARGET})/ld"
-
-	emake CFLAGS="${GCC_CFLAGS}" \
-		LDFLAGS="-Wl,-O1" \
-		STAGE1_CFLAGS="-O2 -pipe" \
-		BOOT_CFLAGS="-O2" \
-		CFLAGS_FOR_TARGET="$(get_make_var CFLAGS_FOR_TARGET) ${EXTRA_CFLAGS_FOR_TARGET}" \
-		CXXFLAGS_FOR_TARGET="$(get_make_var CXXFLAGS_FOR_TARGET) ${EXTRA_CXXFLAGS_FOR_TARGET}" \
-		GOCFLAGS_FOR_TARGET="$(get_make_var GOCFLAGS_FOR_TARGET) ${EXTRA_GOCFLAGS_FOR_TARGET}" \
-		LD_FOR_TARGET="${LD_NON_GOLD}" \
-		all
-}
-
-# Logic copied from Gentoo's toolchain.eclass.
-toolchain_src_install() {
-	BINPATH=$(get_bin_dir) # cros to Gentoo glue
-
-	# These should be symlinks
-	dodir /usr/bin
-	cd "${D}"${BINPATH}
-	for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo ; do
-		# For some reason, g77 gets made instead of ${CTARGET}-g77...
-		# this should take care of that
-		[[ -f ${x} ]] && mv ${x} ${CTARGET}-${x}
-
-		if [[ -f ${CTARGET}-${x} ]] ; then
-			if ! is_crosscompile ; then
-				ln -sf ${CTARGET}-${x} ${x}
-				dosym ${BINPATH}/${CTARGET}-${x} \
-					/usr/bin/${x}-${GCC_CONFIG_VER}
-			fi
-
-			# Create version-ed symlinks
-			dosym ${BINPATH}/${CTARGET}-${x} \
-				/usr/bin/${CTARGET}-${x}-${GCC_CONFIG_VER}
-		fi
-
-		if [[ -f ${CTARGET}-${x}-${GCC_CONFIG_VER} ]] ; then
-			rm -f ${CTARGET}-${x}-${GCC_CONFIG_VER}
-			ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER}
-		fi
-	done
-}
-
-src_install() {
-	cd "$(get_gcc_build_dir)"
-	emake DESTDIR="${D}" install
-
-	find "${D}" -name libiberty.a -exec rm -f "{}" \;
-
-	# Move the libraries to the proper location
-	gcc_movelibs
-
-	# Move pretty-printers to gdb datadir to shut ldconfig up
-	gcc_move_pretty_printers
-
-	GCC_CONFIG_VER=$(get_gcc_base_ver)
-	dodir /etc/env.d/gcc
-	insinto /etc/env.d/gcc
-
-	local LDPATH=$(get_lib_dir)
-	for SUBDIR in 32 64 ; do
-		if [[ -d ${D}/${LDPATH}/${SUBDIR} ]]
-		then
-			LDPATH="${LDPATH}:${LDPATH}/${SUBDIR}"
-		fi
-	done
-
-	cat <<-EOF > env.d
-LDPATH="${LDPATH}"
-MANPATH="$(get_data_dir)/man"
-INFOPATH="$(get_data_dir)/info"
-STDCXX_INCDIR="$(get_stdcxx_incdir)"
-CTARGET=${CTARGET}
-GCC_PATH="$(get_bin_dir)"
-GCC_VER="$(get_gcc_base_ver)"
-EOF
-	newins env.d $(get_gcc_config_file)
-	cd -
-
-	toolchain_src_install
-
-	cd "${D}$(get_bin_dir)"
-
-	local use_llvm_next=false
-	if use llvm-next || use llvm-tot
-	then
-		use_llvm_next=true
-	fi
-
-	if is_crosscompile ; then
-		local sysroot_wrapper_file_prefix
-		local sysroot_wrapper_config
-		if use hardened
-		then
-			sysroot_wrapper_file_prefix=sysroot_wrapper.hardened
-			sysroot_wrapper_config=cros.hardened
-		else
-			sysroot_wrapper_file_prefix=sysroot_wrapper
-			sysroot_wrapper_config=cros.nonhardened
-		fi
-
-		exeinto "$(get_bin_dir)"
-		cat "${FILESDIR}/bisect_driver.py" > \
-			"${D}$(get_bin_dir)/bisect_driver.py" || die
-
-		# Note: We are always producing both versions, with and without ccache,
-		# so we can replace the behavior of the wrapper without rebuilding it.
-		# Used e.g. in chromite/scripts/cros_setup_toolchains.py to disable the
-		# ccache for simplechrome toolchains.
-		local ccache_suffixes=(noccache ccache)
-		local ccache_option_values=(false true)
-		for ccache_index in {0,1}; do
-			local ccache_suffix="${ccache_suffixes[${ccache_index}]}"
-			local ccache_option="${ccache_option_values[${ccache_index}]}"
-			# Build new golang wrapper
-			"${FILESDIR}/compiler_wrapper/build.py" --config="${sysroot_wrapper_config}" \
-				--use_ccache="${ccache_option}" \
-				--use_llvm_next="${use_llvm_next}" \
-				--output_file="${D}$(get_bin_dir)/${sysroot_wrapper_file_prefix}.${ccache_suffix}" || die
-		done
-
-		local use_ccache_index
-		use_ccache_index="$(usex wrapper_ccache 1 0)"
-		local sysroot_wrapper_file="${sysroot_wrapper_file_prefix}.${ccache_suffixes[${use_ccache_index}]}"
-
-		for x in c++ g++ gcc; do
-			if [[ -f "${CTARGET}-${x}" ]]; then
-				mv "${CTARGET}-${x}" "${CTARGET}-${x}.real"
-				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
-			fi
-		done
-		for x in clang clang++; do
-			dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
-		done
-		if use go; then
-			local wrapper="sysroot_wrapper.gccgo"
-			doexe "${FILESDIR}/${wrapper}" || die
-			mv "${CTARGET}-gccgo" "${CTARGET}-gccgo.real" || die
-			dosym "${wrapper}" "$(get_bin_dir)/${CTARGET}-gccgo" || die
-		fi
-	else
-		local sysroot_wrapper_file=host_wrapper
-
-		exeinto "$(get_bin_dir)"
-
-		"${FILESDIR}/compiler_wrapper/build.py" --config=cros.host --use_ccache=false \
-			--use_llvm_next="${use_llvm_next}" \
-			--output_file="${D}$(get_bin_dir)/${sysroot_wrapper_file}" || die
-
-		for x in c++ g++ gcc; do
-			if [[ -f "${CTARGET}-${x}" ]]; then
-				mv "${CTARGET}-${x}" "${CTARGET}-${x}.real"
-				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
-			fi
-			if [[ -f "${x}" ]]; then
-				ln "${CTARGET}-${x}.real" "${x}.real" || die
-				rm "${x}" || die
-				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${x}" || die
-				# Add a cc.real symlink that points to gcc.real, https://crbug.com/1090449
-				if [[ "${x}" == "gcc" ]]; then
-					dosym "${x}.real" "$(get_bin_dir)/cc.real"
-				fi
-			fi
-		done
-	fi
-
-	if use tests
-	then
-		TEST_INSTALL_DIR="usr/local/dejagnu/gcc"
-		dodir ${TEST_INSTALL_DIR}
-		cd ${D}/${TEST_INSTALL_DIR}
-		tar -czf "tests.tar.gz" ${WORKDIR}
-	fi
-}
-
-pkg_postinst() {
-	gcc-config $(get_gcc_config_file)
-}
-
-pkg_postrm() {
-	if is_crosscompile ; then
-		if [[ -z $(ls "${ROOT}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then
-			rm -f "${ROOT}"/etc/env.d/gcc/config-${CTARGET}
-			rm -f "${ROOT}"/etc/env.d/??gcc-${CTARGET}
-			rm -f "${ROOT}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64}
-		fi
-	fi
-}
-
-get_gcc_dir() {
-	local GCCDIR
-	if use mounted_gcc ; then
-		GCCDIR=${GCC_SOURCE_PATH:=/usr/local/toolchain_root/gcc}
-	elif use upstream_gcc ; then
-		GCCDIR=${P}
-	else
-		GCCDIR=${S}
-	fi
-	echo "${GCCDIR}"
-}
-
-get_gcc_build_dir() {
-	echo "$(get_gcc_dir)-build-${CTARGET}"
-}
-
-get_gcc_base_ver() {
-	cat "$(get_gcc_dir)/gcc/BASE-VER"
-}
-
-get_stdcxx_incdir() {
-	echo "$(get_lib_dir)/include/g++-v4"
-}
-
-get_lib_dir() {
-	echo "${PREFIX}/lib/gcc/${CTARGET}/$(get_gcc_base_ver)"
-}
-
-get_bin_dir() {
-	if is_crosscompile ; then
-		echo ${PREFIX}/${CHOST}/${CTARGET}/gcc-bin/$(get_gcc_base_ver)
-	else
-		echo ${PREFIX}/${CTARGET}/gcc-bin/$(get_gcc_base_ver)
-	fi
-}
-
-get_data_dir() {
-	echo "${PREFIX}/share/gcc-data/${CTARGET}/$(get_gcc_base_ver)"
-}
-
-get_gcc_config_file() {
-	echo ${CTARGET}-${PV}
-}
-
-# Grab a variable from the build system (taken from linux-info.eclass)
-get_make_var() {
-	local var=$1 makefile=${2:-$(get_gcc_build_dir)/Makefile}
-	echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | \
-		r=${makefile%/*} emake --no-print-directory -s -f - 2>/dev/null
-}
-XGCC() { get_make_var GCC_FOR_TARGET ; }
-
-gcc_move_pretty_printers() {
-	LIBPATH=$(get_lib_dir)  # cros to Gentoo glue
-
-	local py gdbdir=/usr/share/gdb/auto-load${LIBPATH}
-	pushd "${D}"${LIBPATH} >/dev/null
-	for py in $(find . -name '*-gdb.py') ; do
-		local multidir=${py%/*}
-		insinto "${gdbdir}/${multidir}"
-		sed -i "/^libdir =/s:=.*:= '${LIBPATH}/${multidir}':" "${py}" || die #348128
-		doins "${py}" || die
-		rm "${py}" || die
-	done
-	popd >/dev/null
-}
-
-# make sure the libtool archives have libdir set to where they actually
-# -are-, and not where they -used- to be.  also, any dependencies we have
-# on our own .la files need to be updated.
-fix_libtool_libdir_paths() {
-	pushd "${D}" >/dev/null
-
-	pushd "./${1}" >/dev/null
-	local dir="${PWD#${D%/}}"
-	local allarchives=$(echo *.la)
-	allarchives="\(${allarchives// /\\|}\)"
-	popd >/dev/null
-
-	sed -i \
-		-e "/^libdir=/s:=.*:='${dir}':" \
-		./${dir}/*.la
-	sed -i \
-		-e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${LIBPATH}/\1:g" \
-		$(find ./${PREFIX}/lib* -maxdepth 3 -name '*.la') \
-		./${dir}/*.la
-
-	popd >/dev/null
-}
-
-gcc_movelibs() {
-	LIBPATH=$(get_lib_dir)	# cros to Gentoo glue
-
-	local multiarg removedirs=""
-	for multiarg in $($(XGCC) -print-multi-lib) ; do
-		multiarg=${multiarg#*;}
-		multiarg=${multiarg//@/ -}
-
-		local OS_MULTIDIR=$($(XGCC) ${multiarg} --print-multi-os-directory)
-		local MULTIDIR=$($(XGCC) ${multiarg} --print-multi-directory)
-		local TODIR=${D}${LIBPATH}/${MULTIDIR}
-		local FROMDIR=
-
-		[[ -d ${TODIR} ]] || mkdir -p ${TODIR}
-
-		for FROMDIR in \
-			${LIBPATH}/${OS_MULTIDIR} \
-			${LIBPATH}/../${MULTIDIR} \
-			${PREFIX}/lib/${OS_MULTIDIR} \
-			${PREFIX}/${CTARGET}/lib/${OS_MULTIDIR}
-		do
-			removedirs="${removedirs} ${FROMDIR}"
-			FROMDIR=${D}${FROMDIR}
-			if [[ ${FROMDIR} != "${TODIR}" && -d ${FROMDIR} ]] ; then
-				local files=$(find "${FROMDIR}" -maxdepth 1 ! -type d 2>/dev/null)
-				if [[ -n ${files} ]] ; then
-					mv ${files} "${TODIR}"
-				fi
-			fi
-		done
-		fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}"
-	done
-
-	# We remove directories separately to avoid this case:
-	#	mv SRC/lib/../lib/*.o DEST
-	#	rmdir SRC/lib/../lib/
-	#	mv SRC/lib/../lib32/*.o DEST  # Bork
-	for FROMDIR in ${removedirs} ; do
-		rmdir "${D}"${FROMDIR} >& /dev/null
-	done
-	find "${D}" -type d | xargs rmdir >& /dev/null
-}
-
-# If you need to force a cros_workon uprev, change this number (you can use next
-# uprev): 253
diff --git a/sys-devel/gcc/gcc-4.9.2-r268.ebuild b/sys-devel/gcc/gcc-4.9.2-r268.ebuild
new file mode 100644
index 0000000..2686be5
--- /dev/null
+++ b/sys-devel/gcc/gcc-4.9.2-r268.ebuild
@@ -0,0 +1,608 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/gcc-4.4.3-r3.ebuild,v 1.1 2010/06/19 01:53:09 zorry Exp $
+
+EAPI="7"
+CROS_WORKON_COMMIT="ac6128e0a17a52f011797f33ac3e7d6273a9368d"
+CROS_WORKON_TREE="aff2e49c815be09f20e4346cc98144b604388cb7"
+CROS_WORKON_REPO="https://android.googlesource.com"
+CROS_WORKON_PROJECT="toolchain/gcc"
+CROS_WORKON_LOCALNAME=../aosp/toolchain/gcc
+NEXT_GCC="origin/svn-mirror/google/gcc-4_9"
+NEXT_GCC_REPO="https://chromium.googlesource.com/chromiumos/third_party/gcc.git"
+
+# By default, PREV_GCC points to the parent of current tip of origin/master.
+# If that is a bad commit, override this to point to the last known good commit.
+PREV_GCC="origin/master^"
+
+inherit eutils cros-workon binutils-funcs
+
+GCC_FILESDIR="${PORTDIR}/sys-devel/gcc/files"
+
+DESCRIPTION="The GNU Compiler Collection.  Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking. This Compiler is based off of Crosstoolv14."
+
+LICENSE="GPL-3 LGPL-3 libgcc FDL-1.2"
+KEYWORDS="*"
+
+RDEPEND=">=sys-libs/zlib-1.1.4
+	>=sys-devel/gcc-config-1.6
+	virtual/libiconv
+	>=dev-libs/gmp-4.3.2
+	>=dev-libs/mpc-0.8.1
+	>=dev-libs/mpfr-2.4.2
+	graphite? (
+		>=dev-libs/cloog-0.18.0
+		>=dev-libs/isl-0.11.1
+	)"
+DEPEND="${RDEPEND}
+	test? (
+		>=dev-util/dejagnu-1.4.4
+		>=sys-devel/autogen-5.5.4
+	)
+	>=sys-apps/texinfo-4.8
+	>=sys-devel/bison-1.875"
+PDEPEND=">=sys-devel/gcc-config-1.7"
+BDEPEND="${CATEGORY}/binutils"
+
+RESTRICT="mirror strip"
+
+IUSE="gcc_repo gcj git_gcc go graphite gtk hardened hardfp llvm-next llvm-tot mounted_gcc multilib
+	nls cxx openmp test tests +thumb upstream_gcc vanilla vtable_verify +wrapper_ccache
+	next_gcc prev_gcc"
+REQUIRED_USE="next_gcc? ( !prev_gcc )"
+
+is_crosscompile() { [[ ${CHOST} != ${CTARGET} ]] ; }
+
+export CTARGET=${CTARGET:-${CHOST}}
+if [[ ${CTARGET} = ${CHOST} ]] ; then
+	if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then
+		export CTARGET=${CATEGORY/cross-}
+	fi
+fi
+
+SLOT="${CTARGET}"
+
+PREFIX=/usr
+
+update_location_for_aosp() {
+	# For aosp gcc repository, the actual gcc directory is 1 more
+	# level down, eg. gcc/gcc-4.9, pick up the newest one in this
+	# case.
+	local gccsub=$(find "${S}" -maxdepth 1 -type d -name "gcc-*" | sort -r | head -1)
+	if [[ -d "${gccsub}" ]] && [[ -d "${gccsub}/gcc/config/arm/" ]]; then
+		S="${gccsub}"
+	fi
+	cd "${S}"
+}
+
+cros_pre_src_prepare_use_gcc() {
+	cros_use_gcc
+}
+
+src_unpack() {
+	if use mounted_gcc ; then
+		if [[ ! -d "$(get_gcc_dir)" ]] ; then
+			die "gcc dir not mounted/present at: $(get_gcc_dir)"
+		fi
+		S=$(get_gcc_dir)
+	elif use upstream_gcc ; then
+		GCC_MIRROR=ftp://mirrors.kernel.org/gnu/gcc
+		GCC_TARBALL=${GCC_MIRROR}/${P}/${P}.tar.bz2
+		wget $GCC_TARBALL
+		tar xf ${GCC_TARBALL##*/}
+	elif use git_gcc || use next_gcc || use prev_gcc ; then
+		aosp_git="${CROS_WORKON_REPO}/${CROS_WORKON_PROJECT}.git"
+		if use gcc_repo ; then
+			gcc_repository="${GCC_REPO}"
+		elif use next_gcc ; then
+			gcc_repository="${NEXT_GCC_REPO}"
+		else
+			gcc_repository="${aosp_git}"
+		fi
+		git clone --depth 1 --no-single-branch "${gcc_repository}" "${S}"
+		if use next_gcc ; then
+			GCC_GITHASH="${NEXT_GCC}"
+		fi
+		if use prev_gcc ; then
+			GCC_GITHASH="${PREV_GCC}"
+		fi
+		if [[ -n ${GCC_GITHASH} ]] ; then
+			einfo "Checking out: ${GCC_GITHASH}"
+			pushd "$(get_gcc_dir)" >/dev/null
+			git checkout ${GCC_GITHASH} || \
+				die "Couldn't checkout ${GCC_GITHASH}"
+			popd >/dev/null
+		fi
+		if [[ ${gcc_repository} == "${aosp_git}" ]] ; then
+			update_location_for_aosp
+		fi
+	else
+		cros-workon_src_unpack
+		update_location_for_aosp
+		[[ ${ABI} == "x32" ]] && eapply "${FILESDIR}"/90_all_gcc-4.7-x32.patch
+	fi
+
+	COST_PKG_VERSION="$("${FILESDIR}"/chromeos-version.sh "${S}")_cos_gg"
+	if [[ -d ${S}/.git ]]; then
+		COST_PKG_VERSION+="_$(cd ${S}; git describe --always)"
+	elif [[ -n ${VCSID} ]]; then
+		COST_PKG_VERSION+="_${VCSID}"
+	fi
+	COST_PKG_VERSION+="_${PVR}"
+}
+
+src_configure() {
+	if use mounted_gcc && [[ -f $(get_gcc_build_dir)/Makefile ]]; then
+		ewarn "Skipping configure due to existing build output"
+		return
+	fi
+
+	# GCC builds do not like LD being set, it will find correct LD to use.
+	unset LD BUILD_LD
+
+	local gcc_langs="c"
+	use cxx && gcc_langs+=",c++"
+	use go && gcc_langs+=",go"
+
+	# Set configuration based on path variables
+	local DATAPATH=$(get_data_dir)
+	local confgcc=(
+		--prefix=${PREFIX}
+		--bindir=$(get_bin_dir)
+		--datadir=${DATAPATH}
+		--includedir=$(get_lib_dir)/include
+		--with-gxx-include-dir=$(get_stdcxx_incdir)
+		--mandir=${DATAPATH}/man
+		--infodir=${DATAPATH}/info
+		--with-python-dir=${DATAPATH#${PREFIX}}/python
+
+		--build=${CBUILD}
+		--host=${CHOST}
+		--target=${CTARGET}
+		--enable-languages=${gcc_langs}
+		--enable-__cxa_atexit
+		--disable-canonical-system-headers
+		--enable-checking=release
+		--enable-linker-build-id
+
+		--with-bugurl='http://code.google.com/p/chromium-os/issues/entry'
+		--with-pkgversion="${COST_PKG_VERSION}"
+
+		$(use_enable go libatomic)
+		$(use_enable multilib)
+		$(use_enable openmp libgomp)
+
+		# Disable libs we don't care about.
+		--disable-libcilkrts
+		--disable-libitm
+		--disable-libmudflap
+		--disable-libquadmath
+		--disable-libssp
+		--disable-libsanitizer
+
+		# Enable frame pointer by default for all the boards.
+		# originally only enabled for i686 for chromium-os:23321.
+		--enable-frame-pointer
+	)
+
+	if use vtable_verify; then
+		confgcc+=(
+			--enable-cxx-flags=-Wl,-L../libsupc++/.libs
+			--enable-vtable-verify
+		)
+	fi
+
+	# Handle target-specific options.
+	case ${CTARGET} in
+	arm*)	#264534
+		local arm_arch="${CTARGET%%-*}"
+		# Only do this if arm_arch is armv*
+		if [[ ${arm_arch} == armv* ]]; then
+			# Convert armv7{a,r,m} to armv7-{a,r,m}
+			[[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-}
+			# Remove endian ('l' / 'eb')
+			[[ ${arm_arch} == *l ]] && arm_arch=${arm_arch%l}
+			[[ ${arm_arch} == *eb ]] && arm_arch=${arm_arch%eb}
+			confgcc+=(
+				--with-arch=${arm_arch}
+				--disable-esp
+			)
+		fi
+		use hardfp && confgcc+=( --with-float=hard )
+		use thumb && confgcc+=( --with-mode=thumb )
+		;;
+	i?86*)
+		# Hardened is enabled for x86, but disabled for ARM.
+		confgcc+=(
+			--enable-esp
+			--with-arch=atom
+			--with-tune=atom
+		)
+		;;
+	x86_64*-gnux32)
+		confgcc+=( --with-abi=x32 --with-multilib-list=mx32 )
+		;;
+	esac
+
+	if is_crosscompile; then
+		confgcc+=( --enable-poison-system-directories )
+
+		local needed_libc="glibc"
+		if [[ -n ${needed_libc} ]]; then
+			if ! has_version ${CATEGORY}/${needed_libc}; then
+				confgcc+=( --disable-shared --disable-threads --without-headers )
+			elif has_version "${CATEGORY}/${needed_libc}[crosscompile_opts_headers-only]"; then
+				confgcc+=( --disable-shared --with-sysroot=/usr/${CTARGET} )
+			else
+				confgcc+=( --with-sysroot=/usr/${CTARGET} )
+			fi
+		fi
+	else
+		confgcc+=( --enable-shared --enable-threads=posix )
+	fi
+
+	# Finally add the user options (if any).
+	confgcc+=( ${EXTRA_ECONF} )
+
+	# Build in a separate build tree
+	mkdir -p $(get_gcc_build_dir) || die
+	cd $(get_gcc_build_dir) || die
+
+	# and now to do the actual configuration
+	addwrite /dev/zero
+	echo "Running this:"
+	echo "$(get_gcc_dir)"/configure "${confgcc[@]}"
+	"$(get_gcc_dir)"/configure "${confgcc[@]}" || die
+}
+
+src_compile() {
+	cd "$(get_gcc_build_dir)"
+	GCC_CFLAGS="$(portageq envvar CFLAGS)"
+	TARGET_FLAGS=""
+	TARGET_GO_FLAGS=""
+
+	if use hardened ; then
+		TARGET_FLAGS="${TARGET_FLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2"
+	fi
+
+	EXTRA_CFLAGS_FOR_TARGET="${TARGET_FLAGS} ${CFLAGS_FOR_TARGET}"
+	EXTRA_CXXFLAGS_FOR_TARGET="${TARGET_FLAGS} ${CXXFLAGS_FOR_TARGET}"
+
+	if use vtable_verify ; then
+		EXTRA_CXXFLAGS_FOR_TARGET+=" -fvtable-verify=std"
+	fi
+
+	# libgo on arm must be compiled with -marm. Go's panic/recover functionality
+	# is broken in thumb mode.
+	if [[ ${CTARGET} == arm* ]]; then
+		TARGET_GO_FLAGS="${TARGET_GO_FLAGS} -marm"
+	fi
+	EXTRA_GOCFLAGS_FOR_TARGET="${TARGET_GO_FLAGS} ${GOCFLAGS_FOR_TARGET}"
+
+	# Do not link libgcc with gold. That is known to fail on internal linker
+	# errors. See crosbug.com/16719
+	local LD_NON_GOLD="$(get_binutils_path_ld ${CTARGET})/ld"
+
+	emake CFLAGS="${GCC_CFLAGS}" \
+		LDFLAGS="-Wl,-O1" \
+		STAGE1_CFLAGS="-O2 -pipe" \
+		BOOT_CFLAGS="-O2" \
+		CFLAGS_FOR_TARGET="$(get_make_var CFLAGS_FOR_TARGET) ${EXTRA_CFLAGS_FOR_TARGET}" \
+		CXXFLAGS_FOR_TARGET="$(get_make_var CXXFLAGS_FOR_TARGET) ${EXTRA_CXXFLAGS_FOR_TARGET}" \
+		GOCFLAGS_FOR_TARGET="$(get_make_var GOCFLAGS_FOR_TARGET) ${EXTRA_GOCFLAGS_FOR_TARGET}" \
+		LD_FOR_TARGET="${LD_NON_GOLD}" \
+		all
+}
+
+# Logic copied from Gentoo's toolchain.eclass.
+toolchain_src_install() {
+	BINPATH=$(get_bin_dir) # cros to Gentoo glue
+
+	# These should be symlinks
+	dodir /usr/bin
+	cd "${D}"${BINPATH}
+	for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo ; do
+		# For some reason, g77 gets made instead of ${CTARGET}-g77...
+		# this should take care of that
+		[[ -f ${x} ]] && mv ${x} ${CTARGET}-${x}
+
+		if [[ -f ${CTARGET}-${x} ]] ; then
+			if ! is_crosscompile ; then
+				ln -sf ${CTARGET}-${x} ${x}
+				dosym ${BINPATH}/${CTARGET}-${x} \
+					/usr/bin/${x}-${GCC_CONFIG_VER}
+			fi
+
+			# Create version-ed symlinks
+			dosym ${BINPATH}/${CTARGET}-${x} \
+				/usr/bin/${CTARGET}-${x}-${GCC_CONFIG_VER}
+		fi
+
+		if [[ -f ${CTARGET}-${x}-${GCC_CONFIG_VER} ]] ; then
+			rm -f ${CTARGET}-${x}-${GCC_CONFIG_VER}
+			ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER}
+		fi
+	done
+}
+
+src_install() {
+	cd "$(get_gcc_build_dir)"
+	emake DESTDIR="${D}" install
+
+	find "${D}" -name libiberty.a -exec rm -f "{}" \;
+
+	# Move the libraries to the proper location
+	gcc_movelibs
+
+	# Move pretty-printers to gdb datadir to shut ldconfig up
+	gcc_move_pretty_printers
+
+	GCC_CONFIG_VER=$(get_gcc_base_ver)
+	dodir /etc/env.d/gcc
+	insinto /etc/env.d/gcc
+
+	local LDPATH=$(get_lib_dir)
+	for SUBDIR in 32 64 ; do
+		if [[ -d ${D}/${LDPATH}/${SUBDIR} ]]
+		then
+			LDPATH="${LDPATH}:${LDPATH}/${SUBDIR}"
+		fi
+	done
+
+	cat <<-EOF > env.d
+LDPATH="${LDPATH}"
+MANPATH="$(get_data_dir)/man"
+INFOPATH="$(get_data_dir)/info"
+STDCXX_INCDIR="$(get_stdcxx_incdir)"
+CTARGET=${CTARGET}
+GCC_PATH="$(get_bin_dir)"
+GCC_VER="$(get_gcc_base_ver)"
+EOF
+	newins env.d $(get_gcc_config_file)
+	cd -
+
+	toolchain_src_install
+
+	cd "${D}$(get_bin_dir)"
+
+	local use_llvm_next=false
+	if use llvm-next || use llvm-tot
+	then
+		use_llvm_next=true
+	fi
+
+	if is_crosscompile ; then
+		local sysroot_wrapper_file_prefix
+		local sysroot_wrapper_config
+		if use hardened
+		then
+			sysroot_wrapper_file_prefix=sysroot_wrapper.hardened
+			sysroot_wrapper_config=cros.hardened
+		else
+			sysroot_wrapper_file_prefix=sysroot_wrapper
+			sysroot_wrapper_config=cros.nonhardened
+		fi
+
+		exeinto "$(get_bin_dir)"
+		cat "${FILESDIR}/bisect_driver.py" > \
+			"${D}$(get_bin_dir)/bisect_driver.py" || die
+
+		# Note: We are always producing both versions, with and without ccache,
+		# so we can replace the behavior of the wrapper without rebuilding it.
+		# Used e.g. in chromite/scripts/cros_setup_toolchains.py to disable the
+		# ccache for simplechrome toolchains.
+		local ccache_suffixes=(noccache ccache)
+		local ccache_option_values=(false true)
+		for ccache_index in {0,1}; do
+			local ccache_suffix="${ccache_suffixes[${ccache_index}]}"
+			local ccache_option="${ccache_option_values[${ccache_index}]}"
+			# Build new golang wrapper
+			"${FILESDIR}/compiler_wrapper/build.py" --config="${sysroot_wrapper_config}" \
+				--use_ccache="${ccache_option}" \
+				--use_llvm_next="${use_llvm_next}" \
+				--output_file="${D}$(get_bin_dir)/${sysroot_wrapper_file_prefix}.${ccache_suffix}" || die
+		done
+
+		local use_ccache_index
+		use_ccache_index="$(usex wrapper_ccache 1 0)"
+		local sysroot_wrapper_file="${sysroot_wrapper_file_prefix}.${ccache_suffixes[${use_ccache_index}]}"
+
+		for x in c++ g++ gcc; do
+			if [[ -f "${CTARGET}-${x}" ]]; then
+				mv "${CTARGET}-${x}" "${CTARGET}-${x}.real"
+				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
+			fi
+		done
+		for x in clang clang++; do
+			dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
+		done
+		if use go; then
+			local wrapper="sysroot_wrapper.gccgo"
+			doexe "${FILESDIR}/${wrapper}" || die
+			mv "${CTARGET}-gccgo" "${CTARGET}-gccgo.real" || die
+			dosym "${wrapper}" "$(get_bin_dir)/${CTARGET}-gccgo" || die
+		fi
+	else
+		local sysroot_wrapper_file=host_wrapper
+
+		exeinto "$(get_bin_dir)"
+
+		"${FILESDIR}/compiler_wrapper/build.py" --config=cros.host --use_ccache=false \
+			--use_llvm_next="${use_llvm_next}" \
+			--output_file="${D}$(get_bin_dir)/${sysroot_wrapper_file}" || die
+
+		for x in c++ g++ gcc; do
+			if [[ -f "${CTARGET}-${x}" ]]; then
+				mv "${CTARGET}-${x}" "${CTARGET}-${x}.real"
+				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${CTARGET}-${x}" || die
+			fi
+			if [[ -f "${x}" ]]; then
+				ln "${CTARGET}-${x}.real" "${x}.real" || die
+				rm "${x}" || die
+				dosym "${sysroot_wrapper_file}" "$(get_bin_dir)/${x}" || die
+				# Add a cc.real symlink that points to gcc.real, https://crbug.com/1090449
+				if [[ "${x}" == "gcc" ]]; then
+					dosym "${x}.real" "$(get_bin_dir)/cc.real"
+				fi
+			fi
+		done
+	fi
+
+	if use tests
+	then
+		TEST_INSTALL_DIR="usr/local/dejagnu/gcc"
+		dodir ${TEST_INSTALL_DIR}
+		cd ${D}/${TEST_INSTALL_DIR}
+		tar -czf "tests.tar.gz" ${WORKDIR}
+	fi
+}
+
+pkg_postinst() {
+	gcc-config $(get_gcc_config_file)
+}
+
+pkg_postrm() {
+	if is_crosscompile ; then
+		if [[ -z $(ls "${ROOT}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then
+			rm -f "${ROOT}"/etc/env.d/gcc/config-${CTARGET}
+			rm -f "${ROOT}"/etc/env.d/??gcc-${CTARGET}
+			rm -f "${ROOT}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64}
+		fi
+	fi
+}
+
+get_gcc_dir() {
+	local GCCDIR
+	if use mounted_gcc ; then
+		GCCDIR=${GCC_SOURCE_PATH:=/usr/local/toolchain_root/gcc}
+	elif use upstream_gcc ; then
+		GCCDIR=${P}
+	else
+		GCCDIR=${S}
+	fi
+	echo "${GCCDIR}"
+}
+
+get_gcc_build_dir() {
+	echo "$(get_gcc_dir)-build-${CTARGET}"
+}
+
+get_gcc_base_ver() {
+	cat "$(get_gcc_dir)/gcc/BASE-VER"
+}
+
+get_stdcxx_incdir() {
+	echo "$(get_lib_dir)/include/g++-v4"
+}
+
+get_lib_dir() {
+	echo "${PREFIX}/lib/gcc/${CTARGET}/$(get_gcc_base_ver)"
+}
+
+get_bin_dir() {
+	if is_crosscompile ; then
+		echo ${PREFIX}/${CHOST}/${CTARGET}/gcc-bin/$(get_gcc_base_ver)
+	else
+		echo ${PREFIX}/${CTARGET}/gcc-bin/$(get_gcc_base_ver)
+	fi
+}
+
+get_data_dir() {
+	echo "${PREFIX}/share/gcc-data/${CTARGET}/$(get_gcc_base_ver)"
+}
+
+get_gcc_config_file() {
+	echo ${CTARGET}-${PV}
+}
+
+# Grab a variable from the build system (taken from linux-info.eclass)
+get_make_var() {
+	local var=$1 makefile=${2:-$(get_gcc_build_dir)/Makefile}
+	echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | \
+		r=${makefile%/*} emake --no-print-directory -s -f - 2>/dev/null
+}
+XGCC() { get_make_var GCC_FOR_TARGET ; }
+
+gcc_move_pretty_printers() {
+	LIBPATH=$(get_lib_dir)  # cros to Gentoo glue
+
+	local py gdbdir=/usr/share/gdb/auto-load${LIBPATH}
+	pushd "${D}"${LIBPATH} >/dev/null
+	for py in $(find . -name '*-gdb.py') ; do
+		local multidir=${py%/*}
+		insinto "${gdbdir}/${multidir}"
+		sed -i "/^libdir =/s:=.*:= '${LIBPATH}/${multidir}':" "${py}" || die #348128
+		doins "${py}" || die
+		rm "${py}" || die
+	done
+	popd >/dev/null
+}
+
+# make sure the libtool archives have libdir set to where they actually
+# -are-, and not where they -used- to be.  also, any dependencies we have
+# on our own .la files need to be updated.
+fix_libtool_libdir_paths() {
+	pushd "${D}" >/dev/null
+
+	pushd "./${1}" >/dev/null
+	local dir="${PWD#${D%/}}"
+	local allarchives=$(echo *.la)
+	allarchives="\(${allarchives// /\\|}\)"
+	popd >/dev/null
+
+	sed -i \
+		-e "/^libdir=/s:=.*:='${dir}':" \
+		./${dir}/*.la
+	sed -i \
+		-e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${LIBPATH}/\1:g" \
+		$(find ./${PREFIX}/lib* -maxdepth 3 -name '*.la') \
+		./${dir}/*.la
+
+	popd >/dev/null
+}
+
+gcc_movelibs() {
+	LIBPATH=$(get_lib_dir)	# cros to Gentoo glue
+
+	local multiarg removedirs=""
+	for multiarg in $($(XGCC) -print-multi-lib) ; do
+		multiarg=${multiarg#*;}
+		multiarg=${multiarg//@/ -}
+
+		local OS_MULTIDIR=$($(XGCC) ${multiarg} --print-multi-os-directory)
+		local MULTIDIR=$($(XGCC) ${multiarg} --print-multi-directory)
+		local TODIR=${D}${LIBPATH}/${MULTIDIR}
+		local FROMDIR=
+
+		[[ -d ${TODIR} ]] || mkdir -p ${TODIR}
+
+		for FROMDIR in \
+			${LIBPATH}/${OS_MULTIDIR} \
+			${LIBPATH}/../${MULTIDIR} \
+			${PREFIX}/lib/${OS_MULTIDIR} \
+			${PREFIX}/${CTARGET}/lib/${OS_MULTIDIR}
+		do
+			removedirs="${removedirs} ${FROMDIR}"
+			FROMDIR=${D}${FROMDIR}
+			if [[ ${FROMDIR} != "${TODIR}" && -d ${FROMDIR} ]] ; then
+				local files=$(find "${FROMDIR}" -maxdepth 1 ! -type d 2>/dev/null)
+				if [[ -n ${files} ]] ; then
+					mv ${files} "${TODIR}"
+				fi
+			fi
+		done
+		fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}"
+	done
+
+	# We remove directories separately to avoid this case:
+	#	mv SRC/lib/../lib/*.o DEST
+	#	rmdir SRC/lib/../lib/
+	#	mv SRC/lib/../lib32/*.o DEST  # Bork
+	for FROMDIR in ${removedirs} ; do
+		rmdir "${D}"${FROMDIR} >& /dev/null
+	done
+	find "${D}" -type d | xargs rmdir >& /dev/null
+}
+
+# If you need to force a cros_workon uprev, change this number (you can use next
+# uprev): 260
diff --git a/sys-devel/gcc/gcc-9999.ebuild b/sys-devel/gcc/gcc-9999.ebuild
index 3ed77c4..7fdf2b5 100644
--- a/sys-devel/gcc/gcc-9999.ebuild
+++ b/sys-devel/gcc/gcc-9999.ebuild
@@ -19,7 +19,7 @@
 
 DESCRIPTION="The GNU Compiler Collection.  Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking. This Compiler is based off of Crosstoolv14."
 
-LICENSE="GPL-3 LGPL-3 || ( GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2"
+LICENSE="GPL-3 LGPL-3 libgcc FDL-1.2"
 KEYWORDS="~*"
 
 RDEPEND=">=sys-libs/zlib-1.1.4
@@ -117,7 +117,7 @@
 	else
 		cros-workon_src_unpack
 		update_location_for_aosp
-		[[ ${ABI} == "x32" ]] && epatch "${FILESDIR}"/90_all_gcc-4.7-x32.patch
+		[[ ${ABI} == "x32" ]] && eapply "${FILESDIR}"/90_all_gcc-4.7-x32.patch
 	fi
 
 	COST_PKG_VERSION="$("${FILESDIR}"/chromeos-version.sh "${S}")_cos_gg"
@@ -229,7 +229,7 @@
 		if [[ -n ${needed_libc} ]]; then
 			if ! has_version ${CATEGORY}/${needed_libc}; then
 				confgcc+=( --disable-shared --disable-threads --without-headers )
-			elif built_with_use --hidden --missing false ${CATEGORY}/${needed_libc} crosscompile_opts_headers-only; then
+			elif has_version "${CATEGORY}/${needed_libc}[crosscompile_opts_headers-only]"; then
 				confgcc+=( --disable-shared --with-sysroot=/usr/${CTARGET} )
 			else
 				confgcc+=( --with-sysroot=/usr/${CTARGET} )
@@ -603,4 +603,4 @@
 }
 
 # If you need to force a cros_workon uprev, change this number (you can use next
-# uprev): 253
+# uprev): 260
diff --git a/sys-devel/gdb/OWNERS b/sys-devel/gdb/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-devel/gdb/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-devel/llvm/Manifest b/sys-devel/llvm/Manifest
index e508d1a..eddd82c 100644
--- a/sys-devel/llvm/Manifest
+++ b/sys-devel/llvm/Manifest
@@ -1,3 +1,3 @@
 DIST llvm-9.0.0-manpages.tar.bz2 158546 BLAKE2B eed6235698a0b5993affe305f7fd22cd4cf444adf931275a1685f2049a5f17cf2933907577d9ce142348a3c579769b0436aa2b5a9a953958504125a8c3e83b7d SHA512 64c8d18061eb2870b379a1df485be0b61eac07cb10b3f97347b54b2ee326faa63437ca04466776be282e120dd3f6147e14fffdd38ca370db85748fe5eb54d764
 DIST llvm-9.0.0.src.tar.xz 32994768 BLAKE2B 7f09bff9bcada95ab9c920c78aef92b57e665d9188bab39c734084ceb03a801c942fed48ea77fabeeb6110c648cb69363c659a6ce93ebf67dbba5c187219b13b SHA512 1bb3341e1d231559b948f1505b33c2e2e03989f9b8bbfef0e0cdaff5ac43f85574c9ec5ac53399b914f497d6899425d861411024e8d7e1d1a338c1c6951ac658
-DIST llvm-profdata-b726d071b4aa46004228fc38ee5bfd167f999bfe.tar.xz 5090916 BLAKE2B f53fbe0df74b3e38db95606a5de7fead51fb586e247a529616b905ac09330f082246539cdd76f26eb7f3563bbdd9fc4a1ea29bcf61426d5babda30701ba3c270 SHA512 fcc0ed611a228b58761ec1670e4cf26055efcef5e6aee75bba66e44ef309ade7b749f8b0cd21062a30859ff9f30e88be6d03ff237e11ea69c6d324437dcbb741
+DIST llvm-profdata-83080a294ad7d145d758821bcf4354ad0cb7d299.tar.xz 5299328 BLAKE2B 5cee4d97a883f7170a7e9b4a0000b552da0a83826af9ecaab79060d56f942aaf276fa56cc3cefd9804e55b655276e1db801311e0bce110902d8d128c0af3d7b9 SHA512 b7cdc999a3606b4b12a0aa9e76d23b9a2c1c810b82516ceb5685f86f7f3c0522142825a65314f240bce49c4820a4bf05f78eace8ea7535268553afdfe9bcdc43
diff --git a/sys-devel/llvm/OWNERS b/sys-devel/llvm/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-devel/llvm/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-devel/llvm/files/PATCHES.json b/sys-devel/llvm/files/PATCHES.json
index af7034a..125248a 100644
--- a/sys-devel/llvm/files/PATCHES.json
+++ b/sys-devel/llvm/files/PATCHES.json
@@ -1,7 +1,7 @@
 [
     {
-        "comment": "Adds a whitelist of packages that have known memory leaks",
-        "rel_patch_path": "llvm-next-leak-whitelist.v2.patch",
+        "comment": "Adds a allowlist of packages that have known memory leaks",
+        "rel_patch_path": "llvm-next-leak-allowlist.v2.patch",
         "start_version": 370808
     },
     {
@@ -216,11 +216,6 @@
         "end_version": 393974
     },
     {
-        "comment": "Revert \"[TargetLoweringObjectFileImpl] Produce .text.hot. instead of .text.hot for -fno-unique-section-names\"",
-        "rel_patch_path": "revert-66055230bf6673b76e7330fef76d752a1ea8638e.patch",
-        "start_version": 393087
-    },
-    {
         "comment": "[LV] Make sure the MaxVF is a power-of-2 by rounding down.",
         "rel_patch_path": "cherry/b446ec56a2987ba02dc2c80d42100be4a4689215.patch",
         "start_version": 394115,
@@ -231,5 +226,148 @@
         "rel_patch_path": "cherry/1ccde533425a4ba9d379510206ad680ff9702129.patch",
         "start_version": 391452,
         "end_version": 391929
+    },
+    {
+        "comment": "[JumpThreading] ProcessBranchOnXOR(): bailout if any pred ends in indirect branch (PR46857)",
+        "rel_patch_path": "cherry/1da9834557cd4302a5183b8228ce063e69f82602.patch",
+        "start_version": 398304,
+        "end_version": 400503
+    },
+    {
+        "comment": "Fix a crash when the sample profile uses md5 and -sample-profile-merge-inlinee is enabled.",
+        "rel_patch_path": "cherry/836991d3676fda06d0f07c816ba855c8a0c3e0aa.patch",
+        "start_version": 398649,
+        "end_version": 401013
+    },
+    {
+        "comment": "[AutoFDO] Avoid merging inlinee samples multiple times",
+        "rel_patch_path": "cherry/d23c1d6a8dddf0e1b9b9fa64726941e402ede8af.patch",
+        "start_version": 398649,
+        "end_version": 401056
+    },
+    {
+        "comment": "[ELF]: --icf: don't fold sections referencing sections with LCDA after D84610",
+        "rel_patch_path": "cherry/164a02d0fa461c623446bb5e3ee15516bcfad13c.patch",
+        "start_version": 401512,
+        "end_version": 401838
+    },
+    {
+        "comment": "[ELF] Support .cfi_signal_frame",
+        "rel_patch_path": "cherry/d30d46193876102a6bc99b527dfaf79be4b09515.patch",
+        "start_version": 401512,
+        "end_version": 401875
+    },
+    {
+        "comment": "[msan] Support %ms in scanf.",
+        "rel_patch_path": "cherry/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch",
+        "start_version": 394483,
+        "end_version": 401725
+    },
+    {
+        "comment": "[ELF] Change tombstone values to (.debug_ranges/.debug_loc) 1 and (other .debug_*) 0",
+        "rel_patch_path": "cherry/004be4037e1e9c6092323c5c9268acb3ecf9176c.patch",
+        "start_version": 397144,
+        "end_version": 401729
+    },
+    {
+        "comment": "Implement AVX ABI Warning/error",
+        "rel_patch_path": "cherry/2831a317b689c7f005a29f008a8e4c24485c0711.patch",
+        "start_version": 394483,
+        "end_version": 398009
+    },
+    {
+        "comment": "Make a test case more flexible on Windows wrt the number of backslashes.",
+        "rel_patch_path": "cherry/9f0225894254c4706519c85d6fc06c5382903fef.patch",
+        "start_version": 400963,
+        "end_version": 401010
+    },
+    {
+        "comment": "Revert \"[ELF] Add --dependency-file option\"",
+        "rel_patch_path": "cherry/0bd918c828feb599b278c1876a33caa9c295be6a.patch",
+        "start_version": 400963,
+        "end_version": 401024
+    },
+    {
+        "comment": "Revert \"Switch to using -debug-info-kind=constructor as default (from =limited)\"",
+        "rel_patch_path": "cherry/394db2259575ef3cac8d3d37836b11eb2373c435.patch",
+        "start_version": 398830,
+        "end_version": 400648
+    },
+    {
+        "comment": "[InstCombine] Add test for PR46680 (NFC)",
+        "rel_patch_path": "cherry/13ae440de4a408cf9d1a448def09769ecbecfdf7.patch",
+        "start_version": 398993,
+        "end_version": 399711
+    },
+    {
+        "comment": "[InstCombine] Fix store merge worklist management (PR46680)",
+        "rel_patch_path": "cherry/d12ec0f752e7f2c7f7252539da2d124264ec33f7.patch",
+        "start_version": 398993,
+        "end_version": 399722
+    },
+    {
+        "comment": "Reland \"[InstCombine] Lower infinite combine loop detection thresholds\"",
+        "rel_patch_path": "cherry/2f3862eb9f21e8a0d48505637fefe6e5e295c18c.patch",
+        "start_version": 398993,
+        "end_version": 399726
+    },
+    {
+        "comment": "Revert \"[AddressSanitizer] Don't use weak linkage for __{start,stop}_asan_globals\"",
+        "rel_patch_path": "cherry/cf5df40c4cf1a53a02ab1d56a488642e3dda8f6d.patch",
+        "start_version": 395282,
+        "end_version": 399661
+    },
+    {
+        "comment": "Revert \"[SCEV][IndVarSimplify] insert point should not be block front.\"",
+        "rel_patch_path": "cherry/1cd1c1d62edc6693a3854b22d53c9bbc1b149798.patch",
+        "start_version": 398848,
+        "end_version": 399218
+    },
+    {
+        "comment": "Revert \"[InstCombine] Drop debug loc in TryToSinkInstruction (reland)\"",
+        "rel_patch_path": "cherry/3d52b1e81b7b3891d9132d826d4889119fad7d00.patch",
+        "start_version": 397614,
+        "end_version": 399140
+    },
+    {
+        "comment": "[DWARF] Add cuttoff guarding quadratic validThroughout behaviour",
+        "rel_patch_path": "cherry/b9d977b0ca60c54f11615ca9d144c9f08b29fd85.patch",
+        "start_version": 398603,
+        "end_version": 398603
+    },
+    {
+        "comment": "PR44685: DebugInfo: Handle address-use-invalid type units referencing non-type units",
+        "rel_patch_path": "cherry/be3ef93bf58aa5546c7baadfb21d43b75fbb4e24.patch",
+        "start_version": 394483,
+        "end_version": 402778
+    },
+    {
+        "comment": "[GlobalISel][InlineAsm] Fix matching input constraint to physreg",
+        "rel_patch_path": "cherry/d893278bba01b0e1209e8b8accbdd5cfa75a0932.patch",
+        "start_version": 399163,
+        "end_version": 401652
+    },
+    {
+        "comment": "PR47138: Don't crash if the preferred alignment of an invalid record type is requested.",
+        "rel_patch_path": "cherry/269bc3f5df6c3b75de515a48063c6941ef8fbbe6.patch",
+        "start_version": 400541,
+        "end_version": 402304
+    },
+    {
+        "comment": "Revert \"Canonicalize declaration pointers when forming APValues.\"",
+        "rel_patch_path": "cherry/15d94a7d0f8f0d6b3b5308fff51b286957e45650.patch",
+        "start_version": 405408,
+        "end_version": 405976
+    },
+    {
+        "comment": "Revert \"Canonicalize declaration pointers when forming APValues.\"",
+        "rel_patch_path": "cherry/7b0332389afd705f46b02fcf87ec3414b8dece34.patch",
+        "start_version": 404252,
+        "end_version": 404294
+    },
+    {
+        "comment": "Revert \"Change the INLINEASM_BR MachineInstr to be a non-terminating instruction.\"",
+        "rel_patch_path": "cherry/revert_4b0aa5724feaa89a9538dcab97e018110b0e4bc3_locally.patch",
+        "start_version": 398032
     }
-]
\ No newline at end of file
+]
diff --git a/sys-devel/llvm/files/cherry/004be4037e1e9c6092323c5c9268acb3ecf9176c.patch b/sys-devel/llvm/files/cherry/004be4037e1e9c6092323c5c9268acb3ecf9176c.patch
new file mode 100644
index 0000000..df2e127
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/004be4037e1e9c6092323c5c9268acb3ecf9176c.patch
@@ -0,0 +1,194 @@
+commit 004be4037e1e9c6092323c5c9268acb3ecf9176c
+Author: Fangrui Song <maskray@google.com>
+Date:   Thu Aug 6 12:34:16 2020 -0700
+
+    [ELF] Change tombstone values to (.debug_ranges/.debug_loc) 1 and (other .debug_*) 0
+    
+    tl;dr See D81784 for the 'tombstone value' concept. This patch changes our behavior to be almost the same as GNU ld (except that we also use 1 for .debug_loc):
+    
+    * .debug_ranges & .debug_loc: 1 (LLD<11: 0+addend; GNU ld uses 1 for .debug_ranges)
+    * .debug_*: 0 (LLD<11: 0+addend; GNU ld uses 0; future LLD: -1)
+    
+    We make the tweaks because:
+    
+    1) The new tombstone is novel and needs more time to be adopted by consumers before it's the default.
+    2) The old (gold) strategy had problems with zero-length functions - so rather than going back that, we're going to the GNU ld strategy which doesn't have that problem.
+    3) One slight tweak to (2) is to apply the .debug_ranges workaround to .debug_loc for the same reasons it applies to debug_ranges - to avoid terminating lists early.
+    
+    -----
+    
+    http://lists.llvm.org/pipermail/llvm-dev/2020-July/143482.html
+    
+    The tombstone value -1 in .debug_line caused problems to lldb (fixed by D83957;
+    will be included in 11.0.0) and breakpad (fixed by
+    https://crrev.com/c/2321300). It may potentially affects other DWARF consumers.
+    
+    For .debug_ranges & .debug_loc: 1, an argument preferring 1 (GNU ld for .debug_ranges) over -2 is that:
+    ```
+    {-1, -2}    <<< base address selection entry
+    {0, length} <<< address range
+    ```
+    may create a situation where low_pc is greater than high_pc. So we use
+    1, the GNU ld behavior for .debug_ranges
+    
+    For other .debug_* sections, there haven't been many reports. One issue is that
+    bloaty (src/dwarf.cc) can incorrectly count address ranges in .debug_ranges . To
+    reduce similar disruption, this patch changes the tombstone values to be similar to GNU ld.
+    
+    This does mean another behavior change to the default trunk behavior. Sorry
+    about it. The default trunk behavior will be similar to release/11.x while we work on a transition plan for LLD users.
+    
+    Reviewed By: dblaikie, echristo
+    
+    Differential Revision: https://reviews.llvm.org/D84825
+
+diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
+index b5b3522bd3a..17c77f66d08 100644
+--- a/lld/ELF/InputSection.cpp
++++ b/lld/ELF/InputSection.cpp
+@@ -945,14 +945,17 @@ void InputSection::relocateNonAlloc(uint8_t *buf, ArrayRef<RelTy> rels) {
+       // the folded-in function, so exclude .debug_line.
+       //
+       // For pre-DWARF-v5 .debug_loc and .debug_ranges, -1 is a reserved value
+-      // (base address selection entry), so -2 is used.
++      // (base address selection entry), use 1 (which is used by GNU ld for
++      // .debug_ranges).
++      //
++      // TODO To reduce disruption, we use 0 instead of -1 as the tombstone
++      // value. Enable -1 in a future release.
+       auto *ds = dyn_cast<Defined>(&sym);
+       if (!sym.getOutputSection() ||
+           (ds && ds->section->repl != ds->section && !isDebugLine)) {
+         // If -z dead-reloc-in-nonalloc= is specified, respect it.
+-        const uint64_t value =
+-            tombstone ? SignExtend64<bits>(*tombstone)
+-                      : (isDebugLocOrRanges ? UINT64_MAX - 1 : UINT64_MAX);
++        const uint64_t value = tombstone ? SignExtend64<bits>(*tombstone)
++                                         : (isDebugLocOrRanges ? 1 : 0);
+         target->relocateNoSym(bufLoc, type, value);
+         continue;
+       }
+diff --git a/lld/test/ELF/dead-reloc-in-nonalloc.s b/lld/test/ELF/dead-reloc-in-nonalloc.s
+index 00d3d2cbc4a..9e93a0cf32a 100644
+--- a/lld/test/ELF/dead-reloc-in-nonalloc.s
++++ b/lld/test/ELF/dead-reloc-in-nonalloc.s
+@@ -11,7 +11,7 @@
+ # RUN:   -z dead-reloc-in-nonalloc=.not_debug=0xbbbbbbbb %t.o -o - | cmp %t -
+ 
+ # COMMON:      Contents of section .debug_addr:
+-# COMMON-NEXT:  0000 [[ADDR:[0-9a-f]+]] 00000000 ffffffff ffffffff
++# COMMON-NEXT:  0000 [[ADDR:[0-9a-f]+]] 00000000 00000000 00000000
+ 
+ # AA:          Contents of section .debug_info:
+ # AA-NEXT:      0000 [[ADDR]] 00000000 aaaaaaaa 00000000
+diff --git a/lld/test/ELF/debug-dead-reloc-32.s b/lld/test/ELF/debug-dead-reloc-32.s
+index a7496798c58..b2708a744f2 100644
+--- a/lld/test/ELF/debug-dead-reloc-32.s
++++ b/lld/test/ELF/debug-dead-reloc-32.s
+@@ -8,11 +8,11 @@
+ # RUN: llvm-objdump -s %t | FileCheck %s
+ 
+ # CHECK:      Contents of section .debug_loc:
+-# CHECK-NEXT:  0000 feffffff
++# CHECK-NEXT:  0000 01000000
+ # CHECK-NEXT: Contents of section .debug_ranges:
+-# CHECK-NEXT:  0000 feffffff
++# CHECK-NEXT:  0000 01000000
+ # CHECK-NEXT: Contents of section .debug_addr:
+-# CHECK-NEXT:  0000 ffffffff
++# CHECK-NEXT:  0000 00000000
+ 
+ .section .text.1,"axe"
+   .byte 0
+@@ -24,6 +24,6 @@
+ .section .debug_ranges
+   .long .text.1+16
+ 
+-## Resolved to UINT32_C(-1), with the addend ignored.
++## Resolved to UINT32_C(0), with the addend ignored.
+ .section .debug_addr
+   .long .text.1+8
+diff --git a/lld/test/ELF/debug-dead-reloc-icf.s b/lld/test/ELF/debug-dead-reloc-icf.s
+index 716e245c12c..282838e3f21 100644
+--- a/lld/test/ELF/debug-dead-reloc-icf.s
++++ b/lld/test/ELF/debug-dead-reloc-icf.s
+@@ -9,7 +9,7 @@
+ # RUN: llvm-objdump -s %t | FileCheck %s
+ 
+ # CHECK:      Contents of section .debug_info:
+-# CHECK-NEXT:  0000 {{[0-9a-f]+}}000 00000000 ffffffff ffffffff
++# CHECK-NEXT:  0000 {{[0-9a-f]+}}000 00000000 00000000 00000000
+ # CHECK:      Contents of section .debug_line:
+ # CHECK-NEXT:  0000 [[ADDR:[0-9a-f]+]] 00000000
+ # CHECK-SAME:                                   [[ADDR]] 00000000
+diff --git a/lld/test/ELF/debug-dead-reloc-tls-arm.s b/lld/test/ELF/debug-dead-reloc-tls-arm.s
+index 7fa5bcaae19..3fad5306fac 100644
+--- a/lld/test/ELF/debug-dead-reloc-tls-arm.s
++++ b/lld/test/ELF/debug-dead-reloc-tls-arm.s
+@@ -7,7 +7,7 @@
+ # RUN: llvm-objdump -s %t | FileCheck %s
+ 
+ # CHECK:      Contents of section .debug_info:
+-# CHECK-NEXT:  0000 ffffffff
++# CHECK-NEXT:  0000 00000000
+ 
+ .globl _start
+ _start:
+diff --git a/lld/test/ELF/debug-dead-reloc-tls.s b/lld/test/ELF/debug-dead-reloc-tls.s
+index 1b26a920d3d..06662773854 100644
+--- a/lld/test/ELF/debug-dead-reloc-tls.s
++++ b/lld/test/ELF/debug-dead-reloc-tls.s
+@@ -7,8 +7,8 @@
+ # RUN: llvm-objdump -s %t | FileCheck %s
+ 
+ # CHECK:      Contents of section .debug_info:
+-# CHECK-NEXT:  0000 ffffffff ffffffff ffffffff ffffffff
+-# CHECK-NEXT:  0010 ffffffff ffffffff
++# CHECK-NEXT:  0000 00000000 00000000 00000000 00000000
++# CHECK-NEXT:  0010 00000000 ffffffff
+ 
+ .globl _start
+ _start:
+diff --git a/lld/test/ELF/debug-dead-reloc.s b/lld/test/ELF/debug-dead-reloc.s
+index d784519e9af..e1adf4e2a25 100644
+--- a/lld/test/ELF/debug-dead-reloc.s
++++ b/lld/test/ELF/debug-dead-reloc.s
+@@ -9,15 +9,15 @@
+ # RUN: llvm-objdump -s %t | FileCheck %s
+ 
+ # CHECK:      Contents of section .debug_loc:
+-# CHECK-NEXT:  0000 feffffff ffffffff feffffff ffffffff
++# CHECK-NEXT:  0000 01000000 00000000 01000000 00000000
+ # CHECK-NEXT: Contents of section .debug_ranges:
+-# CHECK-NEXT:  0000 feffffff ffffffff feffffff ffffffff
++# CHECK-NEXT:  0000 01000000 00000000 01000000 00000000
+ # CHECK-NEXT: Contents of section .debug_addr:
+ # CHECK-NEXT:  0000 {{.*}}000 00000000 {{.*}}000 00000000
+-# CHECK-NEXT:  0010 ffffffff  ffffffff {{.*}}000 00000000
++# CHECK-NEXT:  0010 00000000  00000000 {{.*}}000 00000000
+ # CHECK-NEXT: Contents of section .debug_foo:
+-# CHECK-NEXT:  0000 ffffffff ffffffff 08000000 00000000
+-# CHECK-NEXT:  0010 ffffffff ffffffff 08000000 00000000
++# CHECK-NEXT:  0000 00000000 00000000 08000000 00000000
++# CHECK-NEXT:  0010 00000000 00000000 08000000 00000000
+ 
+ ## -z dead-reloc-in-nonalloc= can override the tombstone value.
+ # RUN: ld.lld --gc-sections -z dead-reloc-in-nonalloc=.debug_loc=42 %t.o %t1.o %t1.o -o %t42
+@@ -35,7 +35,7 @@
+ group:
+   .byte 0
+ 
+-## Resolved to UINT64_C(-2), with the addend ignored.
++## Resolved to UINT64_C(1), with the addend ignored.
+ ## UINT64_C(-1) is a reserved value (base address selection entry) which can't be used.
+ .section .debug_loc
+   .quad .text.1+8
+@@ -44,7 +44,7 @@ group:
+ 
+ .section .debug_addr
+ ## .text.3 is a local symbol. The symbol defined in a non-prevailing group is
+-## discarded. Resolved to UINT64_C(-1).
++## discarded. Resolved to UINT64_C(0).
+   .quad .text.3+24
+ ## group is a non-local symbol. The relocation from the second %t1.o gets
+ ## resolved to the prevailing copy.
diff --git a/sys-devel/llvm/files/cherry/0bd918c828feb599b278c1876a33caa9c295be6a.patch b/sys-devel/llvm/files/cherry/0bd918c828feb599b278c1876a33caa9c295be6a.patch
new file mode 100644
index 0000000..d61487e
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/0bd918c828feb599b278c1876a33caa9c295be6a.patch
@@ -0,0 +1,189 @@
+commit 0bd918c828feb599b278c1876a33caa9c295be6a
+Author: Petr Hosek <phosek@google.com>
+Date:   Fri Jul 31 01:12:38 2020 -0700
+
+    Revert "[ELF] Add --dependency-file option"
+    
+    This reverts commit b4c7657ba602acde1c2ea5391c973949b9c3ce09 which
+    seems to be breaking certain bots with assertion error.
+
+diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
+index 8eebecf3eb0..e74a4a0c5b2 100644
+--- a/lld/ELF/Config.h
++++ b/lld/ELF/Config.h
+@@ -11,7 +11,6 @@
+ 
+ #include "lld/Common/ErrorHandler.h"
+ #include "llvm/ADT/MapVector.h"
+-#include "llvm/ADT/SetVector.h"
+ #include "llvm/ADT/StringRef.h"
+ #include "llvm/ADT/StringSet.h"
+ #include "llvm/BinaryFormat/ELF.h"
+@@ -91,13 +90,11 @@ struct Configuration {
+   uint8_t osabi = 0;
+   uint32_t andFeatures = 0;
+   llvm::CachePruningPolicy thinLTOCachePolicy;
+-  llvm::SetVector<StringRef> dependencyFiles; // for --dependency-file
+   llvm::StringMap<uint64_t> sectionStartMap;
+   llvm::StringRef bfdname;
+   llvm::StringRef chroot;
+-  llvm::StringRef dependencyFile;
+-  llvm::StringRef dwoDir;
+   llvm::StringRef dynamicLinker;
++  llvm::StringRef dwoDir;
+   llvm::StringRef entry;
+   llvm::StringRef emulation;
+   llvm::StringRef fini;
+diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
+index 75aa89ff3c8..64a41ba77ba 100644
+--- a/lld/ELF/Driver.cpp
++++ b/lld/ELF/Driver.cpp
+@@ -918,7 +918,6 @@ static void readConfigs(opt::InputArgList &args) {
+   config->optimizeBBJumps =
+       args.hasFlag(OPT_optimize_bb_jumps, OPT_no_optimize_bb_jumps, false);
+   config->demangle = args.hasFlag(OPT_demangle, OPT_no_demangle, true);
+-  config->dependencyFile = args.getLastArgValue(OPT_dependency_file);
+   config->dependentLibraries = args.hasFlag(OPT_dependent_libraries, OPT_no_dependent_libraries, true);
+   config->disableVerify = args.hasArg(OPT_disable_verify);
+   config->discard = getDiscard(args);
+@@ -1565,75 +1564,6 @@ static void handleLibcall(StringRef name) {
+     sym->fetch();
+ }
+ 
+-// Handle --dependency-file=<path>. If that option is given, lld creates a
+-// file at a given path with the following contents:
+-//
+-//   <output-file>: <input-file> ...
+-//
+-//   <input-file>:
+-//
+-// where <output-file> is a pathname of an output file and <input-file>
+-// ... is a list of pathnames of all input files. `make` command can read a
+-// file in the above format and interpret it as a dependency info. We write
+-// phony targets for every <input-file> to avoid an error when that file is
+-// removed.
+-//
+-// This option is useful if you want to make your final executable to depend
+-// on all input files including system libraries. Here is why.
+-//
+-// When you write a Makefile, you usually write it so that the final
+-// executable depends on all user-generated object files. Normally, you
+-// don't make your executable to depend on system libraries (such as libc)
+-// because you don't know the exact paths of libraries, even though system
+-// libraries that are linked to your executable statically are technically a
+-// part of your program. By using --dependency-file option, you can make
+-// lld to dump dependency info so that you can maintain exact dependencies
+-// easily.
+-static void writeDependencyFile() {
+-  std::error_code ec;
+-  raw_fd_ostream os(config->dependencyFile, ec, sys::fs::F_None);
+-  if (ec) {
+-    error("cannot open " + config->dependencyFile + ": " + ec.message());
+-    return;
+-  }
+-
+-  // We use the same escape rules as Clang/GCC which are accepted by Make/Ninja:
+-  // * A space is escaped by a backslash which itself must be escaped.
+-  // * A hash sign is escaped by a single backslash.
+-  // * $ is escapes as $$.
+-  auto printFilename = [](raw_fd_ostream &os, StringRef filename) {
+-    llvm::SmallString<256> nativePath;
+-    llvm::sys::path::native(filename.str(), nativePath);
+-    llvm::sys::path::remove_dots(nativePath, /*remove_dot_dot=*/true);
+-    for (unsigned i = 0, e = nativePath.size(); i != e; ++i) {
+-      if (nativePath[i] == '#') {
+-        os << '\\';
+-      } else if (nativePath[i] == ' ') {
+-        os << '\\';
+-        unsigned j = i;
+-        while (j > 0 && nativePath[--j] == '\\')
+-          os << '\\';
+-      } else if (nativePath[i] == '$') {
+-        os << '$';
+-      }
+-      os << nativePath[i];
+-    }
+-  };
+-
+-  os << config->outputFile << ":";
+-  for (StringRef path : config->dependencyFiles) {
+-    os << " \\\n ";
+-    printFilename(os, path);
+-  }
+-  os << "\n";
+-
+-  for (StringRef path : config->dependencyFiles) {
+-    os << "\n";
+-    printFilename(os, path);
+-    os << ":\n";
+-  }
+-}
+-
+ // Replaces common symbols with defined symbols reside in .bss sections.
+ // This function is called after all symbol names are resolved. As a
+ // result, the passes after the symbol resolution won't see any
+@@ -2134,11 +2064,6 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
+     return false;
+   });
+ 
+-  // Since we now have a complete set of input files, we can create
+-  // a .d file to record build dependencies.
+-  if (!config->dependencyFile.empty())
+-    writeDependencyFile();
+-
+   // Now that the number of partitions is fixed, save a pointer to the main
+   // partition.
+   mainPart = &partitions[0];
+diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
+index 79cc3c00cb2..c142c00517c 100644
+--- a/lld/ELF/InputFiles.cpp
++++ b/lld/ELF/InputFiles.cpp
+@@ -110,7 +110,6 @@ Optional<MemoryBufferRef> elf::readFile(StringRef path) {
+     path = saver.save(config->chroot + path);
+ 
+   log(path);
+-  config->dependencyFiles.insert(path);
+ 
+   auto mbOrErr = MemoryBuffer::getFile(path, -1, false);
+   if (auto ec = mbOrErr.getError()) {
+diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td
+index 3a8c9e83b08..c3c1309aca1 100644
+--- a/lld/ELF/Options.td
++++ b/lld/ELF/Options.td
+@@ -132,9 +132,6 @@ defm demangle: B<"demangle",
+     "Demangle symbol names (default)",
+     "Do not demangle symbol names">;
+ 
+-defm dependency_file: EEq<"dependency-file", "Write a dependency file">,
+-  MetaVarName<"<path>">;
+-
+ def disable_new_dtags: F<"disable-new-dtags">,
+   HelpText<"Disable new dynamic tags">;
+ 
+diff --git a/lld/test/ELF/dependency-file.s b/lld/test/ELF/dependency-file.s
+deleted file mode 100644
+index e7dbf9c7695..00000000000
+--- a/lld/test/ELF/dependency-file.s
++++ /dev/null
+@@ -1,21 +0,0 @@
+-# REQUIRES: x86
+-# RUN: mkdir -p %t
+-# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t/foo.o
+-# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o "%t/bar baz.o"
+-# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o "%t/#quux$.o"
+-# RUN: ld.lld -o %t/foo.exe %t/foo.o %t/"bar baz.o" "%t/#quux$.o" --dependency-file=%t/foo.d
+-# RUN: FileCheck --match-full-lines -DFILE=%t %s < %t/foo.d
+-
+-# CHECK:      [[FILE]]{{/|(\\)+}}foo.exe: \
+-# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}foo.o \
+-# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}bar\ baz.o \
+-# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}\#quux$$.o
+-# CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|(\\)+}}foo.o:
+-# CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|(\\)+}}bar\ baz.o:
+-# CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|(\\)+}}\#quux$$.o:
+-
+-.global _start
+-_start:
diff --git a/sys-devel/llvm/files/cherry/13ae440de4a408cf9d1a448def09769ecbecfdf7.patch b/sys-devel/llvm/files/cherry/13ae440de4a408cf9d1a448def09769ecbecfdf7.patch
new file mode 100644
index 0000000..69154e4
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/13ae440de4a408cf9d1a448def09769ecbecfdf7.patch
@@ -0,0 +1,104 @@
+commit 13ae440de4a408cf9d1a448def09769ecbecfdf7
+Author: Nikita Popov <nikita.ppv@gmail.com>
+Date:   Sat Jul 18 23:36:42 2020 +0200
+
+    [InstCombine] Add test for PR46680 (NFC)
+
+diff --git a/llvm/test/Transforms/InstCombine/pr46680.ll b/llvm/test/Transforms/InstCombine/pr46680.ll
+new file mode 100644
+index 00000000000..90ea2e110af
+--- /dev/null
++++ b/llvm/test/Transforms/InstCombine/pr46680.ll
+@@ -0,0 +1,92 @@
++; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
++; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=3 < %s | FileCheck %s
++
++target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
++target triple = "x86_64-pc-linux-gnu"
++
++@a = dso_local local_unnamed_addr global i64 0, align 8
++@d = dso_local local_unnamed_addr global i64 0, align 8
++@c = external dso_local local_unnamed_addr global i8, align 1
++
++define void @test(i16* nocapture readonly %arg) local_unnamed_addr {
++; CHECK-LABEL: @test(
++; CHECK-NEXT:  bb:
++; CHECK-NEXT:    [[I:%.*]] = load i64, i64* @d, align 8
++; CHECK-NEXT:    [[I1:%.*]] = icmp eq i64 [[I]], 0
++; CHECK-NEXT:    [[I2:%.*]] = load i64, i64* @a, align 8
++; CHECK-NEXT:    [[I3:%.*]] = icmp ne i64 [[I2]], 0
++; CHECK-NEXT:    br i1 [[I1]], label [[BB13:%.*]], label [[BB4:%.*]]
++; CHECK:       bb4:
++; CHECK-NEXT:    [[I5:%.*]] = load i16, i16* [[ARG:%.*]], align 2
++; CHECK-NEXT:    [[I6:%.*]] = trunc i16 [[I5]] to i8
++; CHECK-NEXT:    store i8 [[I6]], i8* @c, align 1
++; CHECK-NEXT:    tail call void @llvm.assume(i1 [[I3]])
++; CHECK-NEXT:    br label [[BB22:%.*]]
++; CHECK:       bb13:
++; CHECK-NEXT:    [[I14:%.*]] = load i16, i16* [[ARG]], align 2
++; CHECK-NEXT:    [[I15:%.*]] = trunc i16 [[I14]] to i8
++; CHECK-NEXT:    store i8 [[I15]], i8* @c, align 1
++; CHECK-NEXT:    br label [[BB22]]
++; CHECK:       bb22:
++; CHECK-NEXT:    [[STOREMERGE2_IN:%.*]] = load i16, i16* [[ARG]], align 2
++; CHECK-NEXT:    [[STOREMERGE2:%.*]] = trunc i16 [[STOREMERGE2_IN]] to i8
++; CHECK-NEXT:    store i8 [[STOREMERGE2]], i8* @c, align 1
++; CHECK-NEXT:    [[STOREMERGE1_IN:%.*]] = load i16, i16* [[ARG]], align 2
++; CHECK-NEXT:    [[STOREMERGE1:%.*]] = trunc i16 [[STOREMERGE1_IN]] to i8
++; CHECK-NEXT:    store i8 [[STOREMERGE1]], i8* @c, align 1
++; CHECK-NEXT:    [[STOREMERGE_IN:%.*]] = load i16, i16* [[ARG]], align 2
++; CHECK-NEXT:    [[STOREMERGE:%.*]] = trunc i16 [[STOREMERGE_IN]] to i8
++; CHECK-NEXT:    store i8 [[STOREMERGE]], i8* @c, align 1
++; CHECK-NEXT:    br label [[BB23:%.*]]
++; CHECK:       bb23:
++; CHECK-NEXT:    br label [[BB23]]
++;
++bb:
++  %i = load i64, i64* @d, align 8
++  %i1 = icmp eq i64 %i, 0
++  %i2 = load i64, i64* @a, align 8
++  %i3 = icmp ne i64 %i2, 0
++  br i1 %i1, label %bb13, label %bb4
++
++bb4:                                              ; preds = %bb
++  %i5 = load i16, i16* %arg, align 2
++  %i6 = trunc i16 %i5 to i8
++  store i8 %i6, i8* @c, align 1
++  tail call void @llvm.assume(i1 %i3)
++  %i7 = load i16, i16* %arg, align 2
++  %i8 = trunc i16 %i7 to i8
++  store i8 %i8, i8* @c, align 1
++  %i9 = load i16, i16* %arg, align 2
++  %i10 = trunc i16 %i9 to i8
++  store i8 %i10, i8* @c, align 1
++  %i11 = load i16, i16* %arg, align 2
++  %i12 = trunc i16 %i11 to i8
++  store i8 %i12, i8* @c, align 1
++  br label %bb22
++
++bb13:                                             ; preds = %bb
++  %i14 = load i16, i16* %arg, align 2
++  %i15 = trunc i16 %i14 to i8
++  store i8 %i15, i8* @c, align 1
++  %i16 = load i16, i16* %arg, align 2
++  %i17 = trunc i16 %i16 to i8
++  store i8 %i17, i8* @c, align 1
++  %i18 = load i16, i16* %arg, align 2
++  %i19 = trunc i16 %i18 to i8
++  store i8 %i19, i8* @c, align 1
++  %i20 = load i16, i16* %arg, align 2
++  %i21 = trunc i16 %i20 to i8
++  store i8 %i21, i8* @c, align 1
++  br label %bb22
++
++bb22:                                             ; preds = %bb13, %bb4
++  br label %bb23
++
++bb23:                                             ; preds = %bb23, %bb22
++  br label %bb23
++}
++
++; Function Attrs: nounwind willreturn
++declare void @llvm.assume(i1) #0
++
++attributes #0 = { nounwind willreturn }
diff --git a/sys-devel/llvm/files/cherry/15d94a7d0f8f0d6b3b5308fff51b286957e45650.patch b/sys-devel/llvm/files/cherry/15d94a7d0f8f0d6b3b5308fff51b286957e45650.patch
new file mode 100644
index 0000000..51b2a27
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/15d94a7d0f8f0d6b3b5308fff51b286957e45650.patch
@@ -0,0 +1,207 @@
+commit 15d94a7d0f8f0d6b3b5308fff51b286957e45650
+Author: Leonard Chan <leonardchan@google.com>
+Date:   Tue Sep 22 17:40:53 2020 -0700
+
+    Revert "Canonicalize declaration pointers when forming APValues."
+    
+    This reverts commit 905b9ca26c94fa86339451a528cedde5004fc1bb.
+    
+    Reverting because this strips `weak` attributes off function
+    declarations, leading to the linker error we see at
+    https://ci.chromium.org/p/fuchsia/builders/ci/clang_toolchain.fuchsia-arm64-debug-subbuild/b8868932035091473008.
+    
+    See https://reviews.llvm.org/rG905b9ca26c94 for reproducer details.
+
+diff --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h
+index 6307f8a92e5..5103cfa8604 100644
+--- a/clang/include/clang/AST/APValue.h
++++ b/clang/include/clang/AST/APValue.h
+@@ -174,7 +174,6 @@ public:
+       return !(LHS == RHS);
+     }
+     friend llvm::hash_code hash_value(const LValueBase &Base);
+-    friend struct llvm::DenseMapInfo<LValueBase>;
+ 
+   private:
+     PtrTy Ptr;
+@@ -202,7 +201,8 @@ public:
+ 
+   public:
+     LValuePathEntry() : Value() {}
+-    LValuePathEntry(BaseOrMemberType BaseOrMember);
++    LValuePathEntry(BaseOrMemberType BaseOrMember)
++        : Value{reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue())} {}
+     static LValuePathEntry ArrayIndex(uint64_t Index) {
+       LValuePathEntry Result;
+       Result.Value = Index;
+diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
+index 32d3ff7ce1d..08ae0ff3c67 100644
+--- a/clang/lib/AST/APValue.cpp
++++ b/clang/lib/AST/APValue.cpp
+@@ -38,7 +38,7 @@ static_assert(
+     "Type is insufficiently aligned");
+ 
+ APValue::LValueBase::LValueBase(const ValueDecl *P, unsigned I, unsigned V)
+-    : Ptr(P ? cast<ValueDecl>(P->getCanonicalDecl()) : nullptr), Local{I, V} {}
++    : Ptr(P), Local{I, V} {}
+ APValue::LValueBase::LValueBase(const Expr *P, unsigned I, unsigned V)
+     : Ptr(P), Local{I, V} {}
+ 
+@@ -82,19 +82,13 @@ bool operator==(const APValue::LValueBase &LHS,
+                 const APValue::LValueBase &RHS) {
+   if (LHS.Ptr != RHS.Ptr)
+     return false;
+-  if (LHS.is<TypeInfoLValue>() || LHS.is<DynamicAllocLValue>())
++  if (LHS.is<TypeInfoLValue>())
+     return true;
+   return LHS.Local.CallIndex == RHS.Local.CallIndex &&
+          LHS.Local.Version == RHS.Local.Version;
+ }
+ }
+ 
+-APValue::LValuePathEntry::LValuePathEntry(BaseOrMemberType BaseOrMember) {
+-  if (const Decl *D = BaseOrMember.getPointer())
+-    BaseOrMember.setPointer(D->getCanonicalDecl());
+-  Value = reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());
+-}
+-
+ namespace {
+   struct LVBase {
+     APValue::LValueBase Base;
+@@ -119,16 +113,14 @@ APValue::LValueBase::operator bool () const {
+ 
+ clang::APValue::LValueBase
+ llvm::DenseMapInfo<clang::APValue::LValueBase>::getEmptyKey() {
+-  clang::APValue::LValueBase B;
+-  B.Ptr = DenseMapInfo<const ValueDecl*>::getEmptyKey();
+-  return B;
++  return clang::APValue::LValueBase(
++      DenseMapInfo<const ValueDecl*>::getEmptyKey());
+ }
+ 
+ clang::APValue::LValueBase
+ llvm::DenseMapInfo<clang::APValue::LValueBase>::getTombstoneKey() {
+-  clang::APValue::LValueBase B;
+-  B.Ptr = DenseMapInfo<const ValueDecl*>::getTombstoneKey();
+-  return B;
++  return clang::APValue::LValueBase(
++      DenseMapInfo<const ValueDecl*>::getTombstoneKey());
+ }
+ 
+ namespace clang {
+@@ -781,10 +773,8 @@ void APValue::MakeMemberPointer(const ValueDecl *Member, bool IsDerivedMember,
+   assert(isAbsent() && "Bad state change");
+   MemberPointerData *MPD = new ((void*)(char*)Data.buffer) MemberPointerData;
+   Kind = MemberPointer;
+-  MPD->MemberAndIsDerivedMember.setPointer(
+-      Member ? cast<ValueDecl>(Member->getCanonicalDecl()) : nullptr);
++  MPD->MemberAndIsDerivedMember.setPointer(Member);
+   MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);
+   MPD->resizePath(Path.size());
+-  for (unsigned I = 0; I != Path.size(); ++I)
+-    MPD->getPath()[I] = Path[I]->getCanonicalDecl();
++  memcpy(MPD->getPath(), Path.data(), Path.size()*sizeof(const CXXRecordDecl*));
+ }
+diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
+index ae38e3dd2a7..0ee1399d42d 100644
+--- a/clang/lib/AST/Decl.cpp
++++ b/clang/lib/AST/Decl.cpp
+@@ -4686,7 +4686,7 @@ char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
+ void ValueDecl::anchor() {}
+ 
+ bool ValueDecl::isWeak() const {
+-  for (const auto *I : getMostRecentDecl()->attrs())
++  for (const auto *I : attrs())
+     if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I))
+       return true;
+ 
+diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
+index ab2b55c0762..f4314d0bd96 100644
+--- a/clang/lib/AST/DeclBase.cpp
++++ b/clang/lib/AST/DeclBase.cpp
+@@ -720,7 +720,7 @@ bool Decl::isWeakImported() const {
+   if (!canBeWeakImported(IsDefinition))
+     return false;
+ 
+-  for (const auto *A : getMostRecentDecl()->attrs()) {
++  for (const auto *A : attrs()) {
+     if (isa<WeakImportAttr>(A))
+       return true;
+ 
+diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
+index 8e43b62662e..e8f132dd480 100644
+--- a/clang/lib/AST/ExprConstant.cpp
++++ b/clang/lib/AST/ExprConstant.cpp
+@@ -1978,11 +1978,18 @@ static bool HasSameBase(const LValue &A, const LValue &B) {
+     return false;
+ 
+   if (A.getLValueBase().getOpaqueValue() !=
+-      B.getLValueBase().getOpaqueValue())
+-    return false;
++      B.getLValueBase().getOpaqueValue()) {
++    const Decl *ADecl = GetLValueBaseDecl(A);
++    if (!ADecl)
++      return false;
++    const Decl *BDecl = GetLValueBaseDecl(B);
++    if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())
++      return false;
++  }
+ 
+-  return A.getLValueCallIndex() == B.getLValueCallIndex() &&
+-         A.getLValueVersion() == B.getLValueVersion();
++  return IsGlobalLValue(A.getLValueBase()) ||
++         (A.getLValueCallIndex() == B.getLValueCallIndex() &&
++          A.getLValueVersion() == B.getLValueVersion());
+ }
+ 
+ static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {
+@@ -3101,8 +3108,7 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
+ 
+   // If we're currently evaluating the initializer of this declaration, use that
+   // in-flight value.
+-  if (declaresSameEntity(Info.EvaluatingDecl.dyn_cast<const ValueDecl *>(),
+-                         VD)) {
++  if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) {
+     Result = Info.EvaluatingDeclValue;
+     return true;
+   }
+diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
+index 3720b277af7..8d51dbde717 100644
+--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
++++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
+@@ -24,10 +24,11 @@ constexpr double &ni3; // expected-error {{declaration of reference variable 'ni
+ 
+ constexpr int nc1 = i; // expected-error {{constexpr variable 'nc1' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
+ constexpr C nc2 = C(); // expected-error {{cannot have non-literal type 'const C'}}
+-int &f(); // expected-note 2{{declared here}}
++int &f(); // expected-note {{declared here}}
+ constexpr int &nc3 = f(); // expected-error {{constexpr variable 'nc3' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
+ constexpr int nc4(i); // expected-error {{constexpr variable 'nc4' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
+ constexpr C nc5((C())); // expected-error {{cannot have non-literal type 'const C'}}
++int &f(); // expected-note {{here}}
+ constexpr int &nc6(f()); // expected-error {{constexpr variable 'nc6' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f'}}
+ 
+ struct pixel {
+diff --git a/clang/test/OpenMP/ordered_messages.cpp b/clang/test/OpenMP/ordered_messages.cpp
+index 8a3a86443eb..f6b9dbd6d27 100644
+--- a/clang/test/OpenMP/ordered_messages.cpp
++++ b/clang/test/OpenMP/ordered_messages.cpp
+@@ -16,9 +16,6 @@ void xxx(int argc) {
+ }
+ 
+ int foo();
+-#if __cplusplus >= 201103L
+-// expected-note@-2 {{declared here}}
+-#endif
+ 
+ template <class T>
+ T foo() {
+@@ -179,7 +176,7 @@ T foo() {
+ 
+ int foo() {
+ #if __cplusplus >= 201103L
+-// expected-note@-2 {{declared here}}
++// expected-note@-2 2 {{declared here}}
+ #endif
+ int k;
+   #pragma omp for ordered
diff --git a/sys-devel/llvm/files/cherry/164a02d0fa461c623446bb5e3ee15516bcfad13c.patch b/sys-devel/llvm/files/cherry/164a02d0fa461c623446bb5e3ee15516bcfad13c.patch
new file mode 100644
index 0000000..746f451
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/164a02d0fa461c623446bb5e3ee15516bcfad13c.patch
@@ -0,0 +1,37 @@
+commit 164a02d0fa461c623446bb5e3ee15516bcfad13c
+Author: Fangrui Song <maskray@google.com>
+Date:   Fri Aug 7 13:42:09 2020 -0700
+
+    [ELF]: --icf: don't fold sections referencing sections with LCDA after D84610
+
+diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp
+index c9d922f558d..f3c477c1d2c 100644
+--- a/lld/ELF/ICF.cpp
++++ b/lld/ELF/ICF.cpp
+@@ -468,9 +468,10 @@ template <class ELFT> void ICF<ELFT>::run() {
+   //
+   // If two .gcc_except_table have identical semantics (usually identical
+   // content with PC-relative encoding), we will lose folding opportunity.
++  uint32_t uniqueId = 0;
+   for (Partition &part : partitions)
+     part.ehFrame->iterateFDEWithLSDA<ELFT>(
+-        [&](InputSection &s) { s.eqClass[0] = 1; });
++        [&](InputSection &s) { s.eqClass[0] = ++uniqueId; });
+ 
+   // Collect sections to merge.
+   for (InputSectionBase *sec : inputSections) {
+diff --git a/lld/test/ELF/icf-eh-frame.s b/lld/test/ELF/icf-eh-frame.s
+index e90df5f96d9..0b895ec8cc2 100644
+--- a/lld/test/ELF/icf-eh-frame.s
++++ b/lld/test/ELF/icf-eh-frame.s
+@@ -41,3 +41,10 @@ _Z1dv:
+ .section .gcc_except_table,"a",@progbits
+ ## The actual content does not matter.
+ .Lexception0:
++
++## .rodata.Z1[ab]v reference .text.Z1[ab]v. Dont fold them.
++.section .rodata.Z1av,"a",@progbits
++  .long .text.Z1av - .
++
++.section .rodata.Z1bv,"a",@progbits
++  .long .text.Z1bv - .
diff --git a/sys-devel/llvm/files/cherry/1cd1c1d62edc6693a3854b22d53c9bbc1b149798.patch b/sys-devel/llvm/files/cherry/1cd1c1d62edc6693a3854b22d53c9bbc1b149798.patch
new file mode 100644
index 0000000..e5f0aaf
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/1cd1c1d62edc6693a3854b22d53c9bbc1b149798.patch
@@ -0,0 +1,107 @@
+commit 1cd1c1d62edc6693a3854b22d53c9bbc1b149798
+Author: serge-sans-paille <sguelton@redhat.com>
+Date:   Tue Jul 14 14:23:14 2020 +0200
+
+    Revert "[SCEV][IndVarSimplify] insert point should not be block front."
+    
+    This reverts commit f1efb8bb4ba0584a9b994f3404a2c62920ce6652.
+    
+    Reverted because it doesn't correctly update the pass return status, see
+    
+    http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-debian/builds/9441/steps/test-check-all/logs/FAIL%3A%20LLVM%3A%3Awiden-i32-i8ptr.ll
+
+diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+index 0357d905fde..f6a0b6ea463 100644
+--- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
++++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+@@ -1435,12 +1435,8 @@ PHINode *WidenIV::createWideIV(SCEVExpander &Rewriter) {
+   // either find an existing phi or materialize a new one. Either way, we
+   // expect a well-formed cyclic phi-with-increments. i.e. any operand not part
+   // of the phi-SCC dominates the loop entry.
+-  Instruction *InsertPt = &*L->getHeader()->getFirstInsertionPt();
+-  WidePhi = dyn_cast<PHINode>(Rewriter.expandCodeFor(AddRec, WideType, InsertPt));
+-  // If the wide phi is not a phi node, for example a cast node, like bitcast,
+-  // inttoptr, ptrtoint, just skip for now.
+-  if (!WidePhi)
+-    return nullptr;
++  Instruction *InsertPt = &L->getHeader()->front();
++  WidePhi = cast<PHINode>(Rewriter.expandCodeFor(AddRec, WideType, InsertPt));
+ 
+   // Remembering the WideIV increment generated by SCEVExpander allows
+   // widenIVUse to reuse it when widening the narrow IV's increment. We don't
+diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
+index c54ae26b532..71b48482f26 100644
+--- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
++++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
+@@ -1292,8 +1292,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
+   if (useSubtract)
+     Step = SE.getNegativeSCEV(Step);
+   // Expand the step somewhere that dominates the loop header.
+-  Value *StepV = expandCodeFor(Step, IntTy,
+-                               &*L->getHeader()->getFirstInsertionPt());
++  Value *StepV = expandCodeFor(Step, IntTy, &L->getHeader()->front());
+ 
+   // The no-wrap behavior proved by IsIncrement(NUW|NSW) is only applicable if
+   // we actually do emit an addition.  It does not apply if we emit a
+@@ -1439,8 +1438,7 @@ Value *SCEVExpander::expandAddRecExprLiterally(const SCEVAddRecExpr *S) {
+       {
+         // Expand the step somewhere that dominates the loop header.
+         SCEVInsertPointGuard Guard(Builder, this);
+-        StepV = expandCodeFor(Step, IntTy,
+-                              &*L->getHeader()->getFirstInsertionPt());
++        StepV = expandCodeFor(Step, IntTy, &L->getHeader()->front());
+       }
+       Result = expandIVInc(PN, StepV, L, ExpandTy, IntTy, useSubtract);
+     }
+@@ -1872,6 +1870,11 @@ Value *SCEVExpander::expand(const SCEV *S) {
+     }
+   }
+ 
++  // IndVarSimplify sometimes sets the insertion point at the block start, even
++  // when there are PHIs at that point.  We must correct for this.
++  if (isa<PHINode>(*InsertPt))
++    InsertPt = &*InsertPt->getParent()->getFirstInsertionPt();
++
+   // Check to see if we already expanded this here.
+   auto I = InsertedExpressions.find(std::make_pair(S, InsertPt));
+   if (I != InsertedExpressions.end())
+@@ -1942,8 +1945,7 @@ SCEVExpander::getOrInsertCanonicalInductionVariable(const Loop *L,
+   // Emit code for it.
+   SCEVInsertPointGuard Guard(Builder, this);
+   PHINode *V =
+-      cast<PHINode>(expandCodeFor(H, nullptr,
+-                                  &*L->getHeader()->getFirstInsertionPt()));
++      cast<PHINode>(expandCodeFor(H, nullptr, &L->getHeader()->front()));
+ 
+   return V;
+ }
+diff --git a/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll b/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
+deleted file mode 100644
+index 80191d4e5b7..00000000000
+--- a/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
++++ /dev/null
+@@ -1,24 +0,0 @@
+-; RUN: opt < %s -indvars -S | FileCheck %s
+-
+-target datalayout = "e-m:e-i64:64-n32:64"
+-
+-define dso_local void @Widen_i32_i8ptr() local_unnamed_addr {
+-; CHECK-LABEL: @Widen_i32_i8ptr(
+-; CHECK: phi i8*
+-; CHECK: phi i32
+-entry:
+-  %ptrids = alloca [15 x i8*], align 8
+-  %arraydecay2032 = getelementptr inbounds [15 x i8*], [15 x i8*]* %ptrids, i64 0, i64 0
+-  store i8** %arraydecay2032, i8*** inttoptr (i64 8 to i8***), align 8
+-  br label %for.cond2106
+-
+-for.cond2106:                                     ; preds = %for.cond2106, %entry
+-  %gid.0 = phi i8* [ null, %entry ], [ %incdec.ptr, %for.cond2106 ]
+-  %i.0 = phi i32 [ 0, %entry ], [ %inc2117, %for.cond2106 ]
+-  %incdec.ptr = getelementptr inbounds i8, i8* %gid.0, i64 1
+-  %idxprom2114 = zext i32 %i.0 to i64
+-  %arrayidx2115 = getelementptr inbounds [15 x i8*], [15 x i8*]* %ptrids, i64 0, i64 %idxprom2114
+-  store i8* %gid.0, i8** %arrayidx2115, align 8
+-  %inc2117 = add nuw nsw i32 %i.0, 1
+-  br label %for.cond2106
+-}
diff --git a/sys-devel/llvm/files/cherry/1da9834557cd4302a5183b8228ce063e69f82602.patch b/sys-devel/llvm/files/cherry/1da9834557cd4302a5183b8228ce063e69f82602.patch
new file mode 100644
index 0000000..bb6f324
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/1da9834557cd4302a5183b8228ce063e69f82602.patch
@@ -0,0 +1,89 @@
+commit 1da9834557cd4302a5183b8228ce063e69f82602
+Author: Roman Lebedev <lebedev.ri@gmail.com>
+Date:   Mon Jul 27 15:07:51 2020 +0300
+
+    [JumpThreading] ProcessBranchOnXOR(): bailout if any pred ends in indirect branch (PR46857)
+    
+    SplitBlockPredecessors() can not split blocks that have such terminators,
+    and in two other places we already ensure that we don't end up calling
+    SplitBlockPredecessors() on such blocks. Do so in one more place.
+    
+    Fixes https://bugs.llvm.org/show_bug.cgi?id=46857
+
+diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+index 9d0500419a7..2f379b7f616 100644
+--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
++++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+@@ -1859,6 +1859,14 @@ bool JumpThreadingPass::ProcessBranchOnXOR(BinaryOperator *BO) {
+     return true;
+   }
+ 
++  // If any of predecessors end with an indirect goto, we can't change its
++  // destination. Same for CallBr.
++  if (any_of(BlocksToFoldInto, [](BasicBlock *Pred) {
++        return isa<IndirectBrInst>(Pred->getTerminator()) ||
++               isa<CallBrInst>(Pred->getTerminator());
++      }))
++    return false;
++
+   // Try to duplicate BB into PredBB.
+   return DuplicateCondBranchOnPHIIntoPred(BB, BlocksToFoldInto);
+ }
+diff --git a/llvm/test/Transforms/JumpThreading/pr46857-callbr.ll b/llvm/test/Transforms/JumpThreading/pr46857-callbr.ll
+new file mode 100644
+index 00000000000..3de7d626513
+--- /dev/null
++++ b/llvm/test/Transforms/JumpThreading/pr46857-callbr.ll
+@@ -0,0 +1,52 @@
++; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
++; RUN: opt < %s -jump-threading -S | FileCheck %s
++
++; CHECK-ALL-LABEL: @func(
++
++define i1 @func(i1 %arg, i32 %arg1, i1 %arg2) {
++; CHECK-LABEL: @func(
++; CHECK-NEXT:  bb:
++; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]
++; CHECK:       bb3:
++; CHECK-NEXT:    [[I:%.*]] = icmp eq i32 [[ARG1:%.*]], 0
++; CHECK-NEXT:    br label [[BB7:%.*]]
++; CHECK:       bb4:
++; CHECK-NEXT:    callbr void asm sideeffect "", "X"(i8* blockaddress(@func, [[BB7]]))
++; CHECK-NEXT:    to label [[BB5:%.*]] [label %bb7]
++; CHECK:       bb5:
++; CHECK-NEXT:    br label [[BB7]]
++; CHECK:       bb7:
++; CHECK-NEXT:    [[I8:%.*]] = phi i1 [ [[I]], [[BB3]] ], [ [[ARG2:%.*]], [[BB5]] ], [ [[ARG2]], [[BB4]] ]
++; CHECK-NEXT:    [[I9:%.*]] = xor i1 [[I8]], [[ARG]]
++; CHECK-NEXT:    br i1 [[I9]], label [[BB11:%.*]], label [[BB11]]
++; CHECK:       bb11:
++; CHECK-NEXT:    ret i1 [[I9]]
++;
++bb:
++  br i1 %arg, label %bb3, label %bb4
++
++bb3:
++  %i = icmp eq i32 %arg1, 0
++  br label %bb7
++
++bb4:
++  callbr void asm sideeffect "", "X"(i8* blockaddress(@func, %bb6))
++  to label %bb5 [label %bb6]
++
++bb5:
++  br label %bb6
++
++bb6:
++  br label %bb7
++
++bb7:
++  %i8 = phi i1 [ %i, %bb3 ], [ %arg2, %bb6 ]
++  %i9 = xor i1 %i8, %arg
++  br i1 %i9, label %bb11, label %bb10
++
++bb10:
++  br label %bb11
++
++bb11:
++  ret i1 %i9
++}
diff --git a/sys-devel/llvm/files/cherry/269bc3f5df6c3b75de515a48063c6941ef8fbbe6.patch b/sys-devel/llvm/files/cherry/269bc3f5df6c3b75de515a48063c6941ef8fbbe6.patch
new file mode 100644
index 0000000..1073a02
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/269bc3f5df6c3b75de515a48063c6941ef8fbbe6.patch
@@ -0,0 +1,33 @@
+commit 269bc3f5df6c3b75de515a48063c6941ef8fbbe6
+Author: Richard Smith <richard@metafoo.co.uk>
+Date:   Wed Aug 12 12:24:08 2020 -0700
+
+    PR47138: Don't crash if the preferred alignment of an invalid record
+    type is requested.
+
+diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
+index 4d708d57cab..544bbb5b074 100644
+--- a/clang/lib/AST/ASTContext.cpp
++++ b/clang/lib/AST/ASTContext.cpp
+@@ -2457,7 +2457,7 @@ unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
+     return ABIAlign;
+ 
+   if (const auto *RT = T->getAs<RecordType>()) {
+-    if (TI.AlignIsRequired)
++    if (TI.AlignIsRequired || RT->getDecl()->isInvalidDecl())
+       return ABIAlign;
+ 
+     unsigned PreferredAlign = static_cast<unsigned>(
+diff --git a/clang/test/SemaCXX/alignof.cpp b/clang/test/SemaCXX/alignof.cpp
+index f2854024da1..64986d3103e 100644
+--- a/clang/test/SemaCXX/alignof.cpp
++++ b/clang/test/SemaCXX/alignof.cpp
+@@ -102,3 +102,8 @@ typedef int __attribute__((aligned(16))) aligned_int;
+ template <typename>
+ using template_alias = aligned_int;
+ static_assert(alignof(template_alias<void>) == 16, "Expected alignment of 16" );
++
++struct PR47138 {
++  invalid_type a; // expected-error {{unknown type}}
++};
++static_assert(__alignof__(PR47138) == 1, ""); // Don't crash.
diff --git a/sys-devel/llvm/files/cherry/2831a317b689c7f005a29f008a8e4c24485c0711.patch b/sys-devel/llvm/files/cherry/2831a317b689c7f005a29f008a8e4c24485c0711.patch
new file mode 100644
index 0000000..0787683
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/2831a317b689c7f005a29f008a8e4c24485c0711.patch
@@ -0,0 +1,318 @@
+commit 2831a317b689c7f005a29f008a8e4c24485c0711
+Author: Erich Keane <erich.keane@intel.com>
+Date:   Tue Jun 23 12:14:09 2020 -0700
+
+    Implement AVX ABI Warning/error
+    
+    The x86-64 "avx" feature changes how >128 bit vector types are passed,
+    instead of being passed in separate 128 bit registers, they can be
+    passed in 256 bit registers.
+    
+    "avx512f" does the same thing, except it switches from 256 bit registers
+    to 512 bit registers.
+    
+    The result of both of these is an ABI incompatibility between functions
+    compiled with and without these features.
+    
+    This patch implements a warning/error pair upon an attempt to call a
+    function that would run afoul of this. First, if a function is called
+    that would have its ABI changed, we issue a warning.
+    
+    Second, if said call is made in a situation where the caller and callee
+    are known to have different calling conventions (such as the case of
+    'target'), we instead issue an error.
+    
+    Differential Revision: https://reviews.llvm.org/D82562
+
+diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+index 687c60c9c53..83c13e0dbbe 100644
+--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
++++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+@@ -240,6 +240,12 @@ def err_function_needs_feature : Error<
+   "always_inline function %1 requires target feature '%2', but would "
+   "be inlined into function %0 that is compiled without support for '%2'">;
+ 
++def warn_avx_calling_convention
++    : Warning<"AVX vector %select{return|argument}0 of type %1 without '%2' "
++              "enabled changes the ABI">,
++      InGroup<DiagGroup<"psabi">>;
++def err_avx_calling_convention : Error<warn_avx_calling_convention.Text>;
++
+ def err_alias_to_undefined : Error<
+   "%select{alias|ifunc}0 must point to a defined "
+   "%select{variable or |}1function">;
+diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
+index 87242442a57..7af986981e5 100644
+--- a/clang/lib/CodeGen/CGCall.cpp
++++ b/clang/lib/CodeGen/CGCall.cpp
+@@ -4245,7 +4245,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
+   llvm::FunctionType *IRFuncTy = getTypes().GetFunctionType(CallInfo);
+ 
+   const Decl *TargetDecl = Callee.getAbstractInfo().getCalleeDecl().getDecl();
+-  if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
++  if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
+     // We can only guarantee that a function is called from the correct
+     // context/function based on the appropriate target attributes,
+     // so only check in the case where we have both always_inline and target
+@@ -4256,6 +4256,12 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
+         TargetDecl->hasAttr<TargetAttr>())
+       checkTargetFeatures(Loc, FD);
+ 
++    // Some architectures (such as x86-64) have the ABI changed based on
++    // attribute-target/features. Give them a chance to diagnose.
++    CGM.getTargetCodeGenInfo().checkFunctionCallABI(
++        CGM, Loc, dyn_cast_or_null<FunctionDecl>(CurCodeDecl), FD, CallArgs);
++  }
++
+ #ifndef NDEBUG
+   if (!(CallInfo.isVariadic() && CallInfo.getArgStruct())) {
+     // For an inalloca varargs function, we don't expect CallInfo to match the
+diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
+index 24237c46068..7947aff6cc2 100644
+--- a/clang/lib/CodeGen/TargetInfo.cpp
++++ b/clang/lib/CodeGen/TargetInfo.cpp
+@@ -20,6 +20,7 @@
+ #include "clang/AST/Attr.h"
+ #include "clang/AST/RecordLayout.h"
+ #include "clang/Basic/CodeGenOptions.h"
++#include "clang/Basic/DiagnosticFrontend.h"
+ #include "clang/CodeGen/CGFunctionInfo.h"
+ #include "clang/CodeGen/SwiftCallingConv.h"
+ #include "llvm/ADT/SmallBitVector.h"
+@@ -2466,8 +2467,110 @@ public:
+       }
+     }
+   }
++
++  void checkFunctionCallABI(CodeGenModule &CGM, SourceLocation CallLoc,
++                            const FunctionDecl *Caller,
++                            const FunctionDecl *Callee,
++                            const CallArgList &Args) const override;
+ };
+ 
++static void initFeatureMaps(const ASTContext &Ctx,
++                            llvm::StringMap<bool> &CallerMap,
++                            const FunctionDecl *Caller,
++                            llvm::StringMap<bool> &CalleeMap,
++                            const FunctionDecl *Callee) {
++  if (CalleeMap.empty() && CallerMap.empty()) {
++    // The caller is potentially nullptr in the case where the call isn't in a
++    // function.  In this case, the getFunctionFeatureMap ensures we just get
++    // the TU level setting (since it cannot be modified by 'target'..
++    Ctx.getFunctionFeatureMap(CallerMap, Caller);
++    Ctx.getFunctionFeatureMap(CalleeMap, Callee);
++  }
++}
++
++static bool checkAVXParamFeature(DiagnosticsEngine &Diag,
++                                 SourceLocation CallLoc,
++                                 const llvm::StringMap<bool> &CallerMap,
++                                 const llvm::StringMap<bool> &CalleeMap,
++                                 QualType Ty, StringRef Feature,
++                                 bool IsArgument) {
++  bool CallerHasFeat = CallerMap.lookup(Feature);
++  bool CalleeHasFeat = CalleeMap.lookup(Feature);
++  if (!CallerHasFeat && !CalleeHasFeat)
++    return Diag.Report(CallLoc, diag::warn_avx_calling_convention)
++           << IsArgument << Ty << Feature;
++
++  // Mixing calling conventions here is very clearly an error.
++  if (!CallerHasFeat || !CalleeHasFeat)
++    return Diag.Report(CallLoc, diag::err_avx_calling_convention)
++           << IsArgument << Ty << Feature;
++
++  // Else, both caller and callee have the required feature, so there is no need
++  // to diagnose.
++  return false;
++}
++
++static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx,
++                          SourceLocation CallLoc,
++                          const llvm::StringMap<bool> &CallerMap,
++                          const llvm::StringMap<bool> &CalleeMap, QualType Ty,
++                          bool IsArgument) {
++  uint64_t Size = Ctx.getTypeSize(Ty);
++  if (Size > 256)
++    return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty,
++                                "avx512f", IsArgument);
++
++  if (Size > 128)
++    return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, "avx",
++                                IsArgument);
++
++  return false;
++}
++
++void X86_64TargetCodeGenInfo::checkFunctionCallABI(
++    CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller,
++    const FunctionDecl *Callee, const CallArgList &Args) const {
++  llvm::StringMap<bool> CallerMap;
++  llvm::StringMap<bool> CalleeMap;
++  unsigned ArgIndex = 0;
++
++  // We need to loop through the actual call arguments rather than the the
++  // function's parameters, in case this variadic.
++  for (const CallArg &Arg : Args) {
++    // The "avx" feature changes how vectors >128 in size are passed. "avx512f"
++    // additionally changes how vectors >256 in size are passed. Like GCC, we
++    // warn when a function is called with an argument where this will change.
++    // Unlike GCC, we also error when it is an obvious ABI mismatch, that is,
++    // the caller and callee features are mismatched.
++    // Unfortunately, we cannot do this diagnostic in SEMA, since the callee can
++    // change its ABI with attribute-target after this call.
++    if (Arg.getType()->isVectorType() &&
++        CGM.getContext().getTypeSize(Arg.getType()) > 128) {
++      initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
++      QualType Ty = Arg.getType();
++      // The CallArg seems to have desugared the type already, so for clearer
++      // diagnostics, replace it with the type in the FunctionDecl if possible.
++      if (ArgIndex < Callee->getNumParams())
++        Ty = Callee->getParamDecl(ArgIndex)->getType();
++
++      if (checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
++                        CalleeMap, Ty, /*IsArgument*/ true))
++        return;
++    }
++    ++ArgIndex;
++  }
++
++  // Check return always, as we don't have a good way of knowing in codegen
++  // whether this value is used, tail-called, etc.
++  if (Callee->getReturnType()->isVectorType() &&
++      CGM.getContext().getTypeSize(Callee->getReturnType()) > 128) {
++    initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
++    checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
++                  CalleeMap, Callee->getReturnType(),
++                  /*IsArgument*/ false);
++  }
++}
++
+ static std::string qualifyWindowsLibrary(llvm::StringRef Lib) {
+   // If the argument does not end in .lib, automatically add the suffix.
+   // If the argument contains a space, enclose it in quotes.
+diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h
+index 250e6b81c7c..1152cabce4a 100644
+--- a/clang/lib/CodeGen/TargetInfo.h
++++ b/clang/lib/CodeGen/TargetInfo.h
+@@ -63,6 +63,13 @@ public:
+       CodeGen::CodeGenModule &CGM,
+       const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames) const {}
+ 
++  /// Any further codegen related checks that need to be done on a function call
++  /// in a target specific manner.
++  virtual void checkFunctionCallABI(CodeGenModule &CGM, SourceLocation CallLoc,
++                                    const FunctionDecl *Caller,
++                                    const FunctionDecl *Callee,
++                                    const CallArgList &Args) const {}
++
+   /// Determines the size of struct _Unwind_Exception on this platform,
+   /// in 8-bit units.  The Itanium ABI defines this as:
+   ///   struct _Unwind_Exception {
+diff --git a/clang/test/CodeGen/target-avx-abi-diag.c b/clang/test/CodeGen/target-avx-abi-diag.c
+new file mode 100644
+index 00000000000..5b8074f3131
+--- /dev/null
++++ b/clang/test/CodeGen/target-avx-abi-diag.c
+@@ -0,0 +1,50 @@
++// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -verify=no256,no512 -o - -S
++// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -target-feature +avx -verify=no512 -o - -S
++// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -target-feature +avx512f -verify=both -o - -S
++
++// both-no-diagnostics
++
++typedef short avx512fType __attribute__((vector_size(64)));
++typedef short avx256Type __attribute__((vector_size(32)));
++
++__attribute__((target("avx"))) void takesAvx256(avx256Type t);
++__attribute__((target("avx512f"))) void takesAvx512(avx512fType t);
++void takesAvx256_no_target(avx256Type t);
++void takesAvx512_no_target(avx512fType t);
++
++void variadic(int i, ...);
++__attribute__((target("avx512f"))) void variadic_err(int i, ...);
++
++// If neither side has an attribute, warn.
++void call_warn(void) {
++  avx256Type t1;
++  takesAvx256_no_target(t1); // no256-warning {{AVX vector argument of type 'avx256Type' (vector of 16 'short' values) without 'avx' enabled changes the ABI}}
++
++  avx512fType t2;
++  takesAvx512_no_target(t2); // no512-warning {{AVX vector argument of type 'avx512fType' (vector of 32 'short' values) without 'avx512f' enabled changes the ABI}}
++
++  variadic(1, t1); // no256-warning {{AVX vector argument of type 'avx256Type' (vector of 16 'short' values) without 'avx' enabled changes the ABI}}
++  variadic(3, t2); // no512-warning {{AVX vector argument of type 'avx512fType' (vector of 32 'short' values) without 'avx512f' enabled changes the ABI}}
++}
++
++// If only 1 side has an attribute, error.
++void call_errors(void) {
++  avx256Type t1;
++  takesAvx256(t1); // no256-error {{AVX vector argument of type 'avx256Type' (vector of 16 'short' values) without 'avx' enabled changes the ABI}}
++  avx512fType t2;
++  takesAvx512(t2); // no512-error {{AVX vector argument of type 'avx512fType' (vector of 32 'short' values) without 'avx512f' enabled changes the ABI}}
++
++  variadic_err(1, t1); // no256-error {{AVX vector argument of type 'avx256Type' (vector of 16 'short' values) without 'avx' enabled changes the ABI}}
++  variadic_err(3, t2); // no512-error {{AVX vector argument of type 'avx512fType' (vector of 32 'short' values) without 'avx512f' enabled changes the ABI}}
++}
++
++// These two don't diagnose anything, since these are valid calls.
++__attribute__((target("avx"))) void call_avx256_ok(void) {
++  avx256Type t;
++  takesAvx256(t);
++}
++
++__attribute__((target("avx512f"))) void call_avx512_ok(void) {
++  avx512fType t;
++  takesAvx512(t);
++}
+diff --git a/clang/test/CodeGen/target-builtin-error-3.c b/clang/test/CodeGen/target-builtin-error-3.c
+index 5beb474befe..3de76e253d9 100644
+--- a/clang/test/CodeGen/target-builtin-error-3.c
++++ b/clang/test/CodeGen/target-builtin-error-3.c
+@@ -18,11 +18,12 @@ static inline half8 __attribute__((__overloadable__)) convert_half( float8 a ) {
+   return __extension__ ({ __m256 __a = (a); (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)__a, (0x00)); }); // expected-error {{'__builtin_ia32_vcvtps2ph256' needs target feature f16c}}
+ }
+ static inline half16 __attribute__((__overloadable__)) convert_half( float16 a ) {
+-  half16 r; 
+-  r.lo = convert_half( a.lo); 
++  half16 r;
++  r.lo = convert_half(a.lo);
+   return r;
+ }
+ void avx_test( uint16_t *destData, float16 argbF)
+ {
+-   ((half16U*)destData)[0] = convert_half(argbF);
++  // expected-warning@+1{{AVX vector argument of type 'float16' (vector of 16 'float' values) without 'avx512f' enabled changes the ABI}}
++  ((half16U *)destData)[0] = convert_half(argbF);
+ }
+diff --git a/clang/test/CodeGen/target-builtin-noerror.c b/clang/test/CodeGen/target-builtin-noerror.c
+index b2d18fa0b2c..339e5b15c88 100644
+--- a/clang/test/CodeGen/target-builtin-noerror.c
++++ b/clang/test/CodeGen/target-builtin-noerror.c
+@@ -6,15 +6,15 @@
+ 
+ // No warnings.
+ extern __m256i a;
+-int __attribute__((target("avx"))) bar(__m256i a) {
++int __attribute__((target("avx"))) bar() {
+   return _mm256_extract_epi32(a, 3);
+ }
+ 
+ int baz() {
+-  return bar(a);
++  return bar();
+ }
+ 
+-int __attribute__((target("avx"))) qq_avx(__m256i a) {
++int __attribute__((target("avx"))) qq_avx() {
+   return _mm256_extract_epi32(a, 3);
+ }
+ 
+@@ -25,7 +25,7 @@ int qq_noavx() {
+ extern __m256i a;
+ int qq() {
+   if (__builtin_cpu_supports("avx"))
+-    return qq_avx(a);
++    return qq_avx();
+   else
+     return qq_noavx();
+ }
diff --git a/sys-devel/llvm/files/cherry/2f3862eb9f21e8a0d48505637fefe6e5e295c18c.patch b/sys-devel/llvm/files/cherry/2f3862eb9f21e8a0d48505637fefe6e5e295c18c.patch
new file mode 100644
index 0000000..95fbcfa
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/2f3862eb9f21e8a0d48505637fefe6e5e295c18c.patch
@@ -0,0 +1,31 @@
+commit 2f3862eb9f21e8a0d48505637fefe6e5e295c18c
+Author: Roman Lebedev <lebedev.ri@gmail.com>
+Date:   Sun Jul 19 16:37:03 2020 +0300
+
+    Reland "[InstCombine] Lower infinite combine loop detection thresholds"
+    
+    This reverts commit 4500db8c59621a31c622862a2946457fdee481ce,
+    which was reverted because lower thresholds exposed a new issue (PR46680).
+    
+    Now that it was resolved by d12ec0f752e7f2c7f7252539da2d124264ec33f7,
+    we can reinstate lower limits and wait for a new bugreport before
+    reverting this again...
+
+diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+index b3254c10a0b..8eac8637cb9 100644
+--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
++++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+@@ -123,8 +123,13 @@ STATISTIC(NumReassoc  , "Number of reassociations");
+ DEBUG_COUNTER(VisitCounter, "instcombine-visit",
+               "Controls which instructions are visited");
+ 
++// FIXME: these limits eventually should be as low as 2.
+ static constexpr unsigned InstCombineDefaultMaxIterations = 1000;
++#ifndef NDEBUG
++static constexpr unsigned InstCombineDefaultInfiniteLoopThreshold = 100;
++#else
+ static constexpr unsigned InstCombineDefaultInfiniteLoopThreshold = 1000;
++#endif
+ 
+ static cl::opt<bool>
+ EnableCodeSinking("instcombine-code-sinking", cl::desc("Enable code sinking"),
diff --git a/sys-devel/llvm/files/cherry/394db2259575ef3cac8d3d37836b11eb2373c435.patch b/sys-devel/llvm/files/cherry/394db2259575ef3cac8d3d37836b11eb2373c435.patch
new file mode 100644
index 0000000..f1d8663
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/394db2259575ef3cac8d3d37836b11eb2373c435.patch
@@ -0,0 +1,291 @@
+commit 394db2259575ef3cac8d3d37836b11eb2373c435
+Author: Amy Huang <akhuang@google.com>
+Date:   Tue Jul 28 11:23:59 2020 -0700
+
+    Revert "Switch to using -debug-info-kind=constructor as default (from =limited)"
+    
+    This reverts commit 227db86a1b7dd6f96f7df14890fcd071bc4fe1f5.
+    
+    Causing debug info errors in google3 LTO builds; also causes a
+    debuginfo-test failure.
+
+diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
+index b0de225f8ab..68e4eb0eedd 100644
+--- a/clang/lib/Driver/ToolChains/Clang.cpp
++++ b/clang/lib/Driver/ToolChains/Clang.cpp
+@@ -498,7 +498,7 @@ static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
+     return codegenoptions::DebugLineTablesOnly;
+   if (A.getOption().matches(options::OPT_gline_directives_only))
+     return codegenoptions::DebugDirectivesOnly;
+-  return codegenoptions::DebugInfoConstructor;
++  return codegenoptions::LimitedDebugInfo;
+ }
+ 
+ static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple) {
+@@ -2383,7 +2383,7 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
+           CmdArgs.push_back(Value.data());
+         } else {
+           RenderDebugEnablingArgs(Args, CmdArgs,
+-                                  codegenoptions::DebugInfoConstructor,
++                                  codegenoptions::LimitedDebugInfo,
+                                   DwarfVersion, llvm::DebuggerKind::Default);
+         }
+       } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
+@@ -3656,7 +3656,7 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D,
+   if (const Arg *A =
+           Args.getLastArg(options::OPT_g_Group, options::OPT_gsplit_dwarf,
+                           options::OPT_gsplit_dwarf_EQ)) {
+-    DebugInfoKind = codegenoptions::DebugInfoConstructor;
++    DebugInfoKind = codegenoptions::LimitedDebugInfo;
+ 
+     // If the last option explicitly specified a debug-info level, use it.
+     if (checkDebugInfoOption(A, Args, D, TC) &&
+@@ -3761,7 +3761,7 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D,
+     if (checkDebugInfoOption(A, Args, D, TC)) {
+       if (DebugInfoKind != codegenoptions::DebugLineTablesOnly &&
+           DebugInfoKind != codegenoptions::DebugDirectivesOnly) {
+-        DebugInfoKind = codegenoptions::DebugInfoConstructor;
++        DebugInfoKind = codegenoptions::LimitedDebugInfo;
+         CmdArgs.push_back("-dwarf-ext-refs");
+         CmdArgs.push_back("-fmodule-format=obj");
+       }
+@@ -3781,9 +3781,7 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D,
+           TC.GetDefaultStandaloneDebug());
+   if (const Arg *A = Args.getLastArg(options::OPT_fstandalone_debug))
+     (void)checkDebugInfoOption(A, Args, D, TC);
+-  if ((DebugInfoKind == codegenoptions::LimitedDebugInfo ||
+-       DebugInfoKind == codegenoptions::DebugInfoConstructor) &&
+-      NeedFullDebug)
++  if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
+     DebugInfoKind = codegenoptions::FullDebugInfo;
+ 
+   if (Args.hasFlag(options::OPT_gembed_source, options::OPT_gno_embed_source,
+@@ -6569,7 +6567,7 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
+                           options::OPT_gline_tables_only)) {
+     *EmitCodeView = true;
+     if (DebugInfoArg->getOption().matches(options::OPT__SLASH_Z7))
+-      *DebugInfoKind = codegenoptions::DebugInfoConstructor;
++      *DebugInfoKind = codegenoptions::LimitedDebugInfo;
+     else
+       *DebugInfoKind = codegenoptions::DebugLineTablesOnly;
+   } else {
+@@ -6866,7 +6864,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
+     // the guard for source type, however there is a test which asserts
+     // that some assembler invocation receives no -debug-info-kind,
+     // and it's not clear whether that test is just overly restrictive.
+-    DebugInfoKind = (WantDebug ? codegenoptions::DebugInfoConstructor
++    DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
+                                : codegenoptions::NoDebugInfo);
+     // Add the -fdebug-compilation-dir flag if needed.
+     addDebugCompDirArg(Args, CmdArgs, C.getDriver().getVFS());
+diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c
+index 0dcaf610880..d0c48ae41d9 100644
+--- a/clang/test/Driver/cl-options.c
++++ b/clang/test/Driver/cl-options.c
+@@ -524,11 +524,11 @@
+ 
+ // RUN: %clang_cl /Zi /c -### -- %s 2>&1 | FileCheck -check-prefix=Zi %s
+ // Zi: "-gcodeview"
+-// Zi: "-debug-info-kind=constructor"
++// Zi: "-debug-info-kind=limited"
+ 
+ // RUN: %clang_cl /Z7 /c -### -- %s 2>&1 | FileCheck -check-prefix=Z7 %s
+ // Z7: "-gcodeview"
+-// Z7: "-debug-info-kind=constructor"
++// Z7: "-debug-info-kind=limited"
+ 
+ // RUN: %clang_cl /Zd /c -### -- %s 2>&1 | FileCheck -check-prefix=Z7GMLT %s
+ // Z7GMLT: "-gcodeview"
+@@ -557,7 +557,7 @@
+ // which made it "win". This test could not detect that bug.
+ // RUN: %clang_cl /Z7 -gdwarf /c -### -- %s 2>&1 | FileCheck -check-prefix=Z7_gdwarf %s
+ // Z7_gdwarf: "-gcodeview"
+-// Z7_gdwarf: "-debug-info-kind=constructor"
++// Z7_gdwarf: "-debug-info-kind=limited"
+ // Z7_gdwarf: "-dwarf-version=4"
+ 
+ // RUN: %clang_cl -fmsc-version=1800 -TP -### -- %s 2>&1 | FileCheck -check-prefix=CXX11 %s
+diff --git a/clang/test/Driver/clang-g-opts.c b/clang/test/Driver/clang-g-opts.c
+index 60c97790b7d..bc714b6c937 100644
+--- a/clang/test/Driver/clang-g-opts.c
++++ b/clang/test/Driver/clang-g-opts.c
+@@ -31,7 +31,7 @@
+ // RUN:             | FileCheck --check-prefix=CHECK-WITH-G-DWARF2 %s
+ 
+ // CHECK-WITHOUT-G-NOT: -debug-info-kind
+-// CHECK-WITH-G: "-debug-info-kind=constructor"
++// CHECK-WITH-G: "-debug-info-kind=limited"
+ // CHECK-WITH-G: "-dwarf-version=4"
+ // CHECK-WITH-G-DWARF2: "-dwarf-version=2"
+ 
+diff --git a/clang/test/Driver/cuda-dwarf-2.cu b/clang/test/Driver/cuda-dwarf-2.cu
+index 92b8919729f..bcfb2444bc5 100644
+--- a/clang/test/Driver/cuda-dwarf-2.cu
++++ b/clang/test/Driver/cuda-dwarf-2.cu
+@@ -49,7 +49,7 @@
+ 
+ // HAS_DEBUG-NOT: warning: debug
+ // HAS_DEBUG: "-fcuda-is-device"
+-// HAS_DEBUG-SAME: "-debug-info-kind={{constructor|line-tables-only}}"
++// HAS_DEBUG-SAME: "-debug-info-kind={{limited|line-tables-only}}"
+ // HAS_DEBUG-SAME: "-dwarf-version=2"
+ // HAS_DEBUG: ptxas
+ // HAS_DEBUG-SAME: "-g"
+diff --git a/clang/test/Driver/debug-options-as.c b/clang/test/Driver/debug-options-as.c
+index 4808219702e..51475680e9b 100644
+--- a/clang/test/Driver/debug-options-as.c
++++ b/clang/test/Driver/debug-options-as.c
+@@ -23,7 +23,7 @@
+ // RUN:   | FileCheck %s
+ //
+ // CHECK: "-cc1as"
+-// CHECK: "-debug-info-kind=constructor"
++// CHECK: "-debug-info-kind=limited"
+ 
+ // Check to make sure clang with -g on a .s file gets passed -dwarf-debug-producer.
+ // rdar://12955296
+diff --git a/clang/test/Driver/debug-options.c b/clang/test/Driver/debug-options.c
+index 2d1a0b2d5cd..189c1f9adde 100644
+--- a/clang/test/Driver/debug-options.c
++++ b/clang/test/Driver/debug-options.c
+@@ -274,18 +274,18 @@
+ // GLIO_ONLY_DWARF2: "-dwarf-version=2"
+ //
+ // G_ONLY: "-cc1"
+-// G_ONLY: "-debug-info-kind=constructor"
++// G_ONLY: "-debug-info-kind=limited"
+ //
+ // These tests assert that "-gline-tables-only" "-g" uses the latter,
+ // but otherwise not caring about the DebugInfoKind.
+ // G_ONLY_DWARF2: "-cc1"
+-// G_ONLY_DWARF2: "-debug-info-kind={{standalone|constructor}}"
++// G_ONLY_DWARF2: "-debug-info-kind={{standalone|limited}}"
+ // G_ONLY_DWARF2: "-dwarf-version=2"
+ //
+ // G_STANDALONE: "-cc1"
+ // G_STANDALONE: "-debug-info-kind=standalone"
+ // G_LIMITED: "-cc1"
+-// G_LIMITED: "-debug-info-kind=constructor"
++// G_LIMITED: "-debug-info-kind=limited"
+ // G_DWARF2: "-dwarf-version=2"
+ // G_DWARF4: "-dwarf-version=4"
+ //
+@@ -339,7 +339,7 @@
+ // NOCI: "-gno-column-info"
+ //
+ // GEXTREFS: "-dwarf-ext-refs" "-fmodule-format=obj"
+-// GEXTREFS: "-debug-info-kind={{standalone|constructor}}"
++// GEXTREFS: "-debug-info-kind={{standalone|limited}}"
+ 
+ // RUN: not %clang -cc1 -debug-info-kind=watkind 2>&1 | FileCheck -check-prefix=BADSTRING1 %s
+ // BADSTRING1: error: invalid value 'watkind' in '-debug-info-kind=watkind'
+diff --git a/clang/test/Driver/integrated-as.s b/clang/test/Driver/integrated-as.s
+index 05999cfe002..0194a3d5a43 100644
+--- a/clang/test/Driver/integrated-as.s
++++ b/clang/test/Driver/integrated-as.s
+@@ -27,19 +27,19 @@
+ // XA_INCLUDE2: "-Ifoo_dir"
+ 
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -gdwarf-4 -gdwarf-2 2>&1 | FileCheck --check-prefix=DWARF2 %s
+-// DWARF2: "-debug-info-kind=constructor" "-dwarf-version=2"
++// DWARF2: "-debug-info-kind=limited" "-dwarf-version=2"
+ 
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -gdwarf-3 2>&1 | FileCheck --check-prefix=DWARF3 %s
+-// DWARF3: "-debug-info-kind=constructor" "-dwarf-version=3"
++// DWARF3: "-debug-info-kind=limited" "-dwarf-version=3"
+ 
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -gdwarf-4 2>&1 | FileCheck --check-prefix=DWARF4 %s
+-// DWARF4: "-debug-info-kind=constructor" "-dwarf-version=4"
++// DWARF4: "-debug-info-kind=limited" "-dwarf-version=4"
+ 
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -Xassembler -gdwarf-2 2>&1 | FileCheck --check-prefix=DWARF2XASSEMBLER %s
+-// DWARF2XASSEMBLER: "-debug-info-kind=constructor" "-dwarf-version=2"
++// DWARF2XASSEMBLER: "-debug-info-kind=limited" "-dwarf-version=2"
+ 
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -Wa,-gdwarf-2 2>&1 | FileCheck --check-prefix=DWARF2WA %s
+-// DWARF2WA: "-debug-info-kind=constructor" "-dwarf-version=2"
++// DWARF2WA: "-debug-info-kind=limited" "-dwarf-version=2"
+ 
+ // A dwarf version number that driver can't parse is just stuffed in.
+ // RUN: %clang -### -target x86_64--- -c -integrated-as %s -Wa,-gdwarf-huh 2>&1 | FileCheck --check-prefix=BOGODWARF %s
+diff --git a/clang/test/Driver/myriad-toolchain.c b/clang/test/Driver/myriad-toolchain.c
+index a4bd260a149..215a02fd0de 100644
+--- a/clang/test/Driver/myriad-toolchain.c
++++ b/clang/test/Driver/myriad-toolchain.c
+@@ -83,7 +83,7 @@
+ // NOSTDLIB-NOT: "-lc"
+ 
+ // RUN: %clang -### -c -g %s -target sparc-myriad 2>&1 | FileCheck -check-prefix=G_SPARC %s
+-// G_SPARC: "-debug-info-kind=constructor" "-dwarf-version=2"
++// G_SPARC: "-debug-info-kind=limited" "-dwarf-version=2"
+ 
+ // RUN: %clang -### -c %s -target sparc-myriad-rtems -fuse-init-array 2>&1 \
+ // RUN: | FileCheck -check-prefix=USE-INIT-ARRAY %s
+diff --git a/clang/test/Driver/openmp-offload-gpu.c b/clang/test/Driver/openmp-offload-gpu.c
+index 3ddd6446d11..6415f1d61b7 100644
+--- a/clang/test/Driver/openmp-offload-gpu.c
++++ b/clang/test/Driver/openmp-offload-gpu.c
+@@ -241,7 +241,7 @@
+ 
+ // HAS_DEBUG-NOT: warning: debug
+ // HAS_DEBUG: "-triple" "nvptx64-nvidia-cuda"
+-// HAS_DEBUG-SAME: "-debug-info-kind={{constructor|line-tables-only}}"
++// HAS_DEBUG-SAME: "-debug-info-kind={{limited|line-tables-only}}"
+ // HAS_DEBUG-SAME: "-dwarf-version=2"
+ // HAS_DEBUG-SAME: "-fopenmp-is-device"
+ // HAS_DEBUG: ptxas
+diff --git a/clang/test/Driver/split-debug.c b/clang/test/Driver/split-debug.c
+index 70f8d91d48e..d40207d5ae3 100644
+--- a/clang/test/Driver/split-debug.c
++++ b/clang/test/Driver/split-debug.c
+@@ -68,18 +68,18 @@
+ // RUN: FileCheck -check-prefix=CHECK-NOINLINE-WITHOUT-SPLIT < %t %s
+ //
+ // CHECK-NOINLINE-WITHOUT-SPLIT: "-fno-split-dwarf-inlining"
+-// CHECK-NOINLINE-WITHOUT-SPLIT: "-debug-info-kind=constructor"
++// CHECK-NOINLINE-WITHOUT-SPLIT: "-debug-info-kind=limited"
+ 
+ // RUN: %clang -target x86_64-unknown-linux-gnu -gmlt -gsplit-dwarf -fno-split-dwarf-inlining -S -### %s 2> %t
+ // RUN: FileCheck -check-prefix=CHECK-SPLIT-WITH-GMLT < %t %s
+ //
+-// CHECK-SPLIT-WITH-GMLT: "-debug-info-kind=constructor"
++// CHECK-SPLIT-WITH-GMLT: "-debug-info-kind=limited"
+ // CHECK-SPLIT-WITH-GMLT: "-split-dwarf-output"
+ 
+ // RUN: %clang -target x86_64-unknown-linux-gnu -gsplit-dwarf -fno-split-dwarf-inlining -S -### %s 2> %t
+ // RUN: FileCheck -check-prefix=CHECK-SPLIT-WITH-NOINL < %t %s
+ //
+-// CHECK-SPLIT-WITH-NOINL: "-debug-info-kind=constructor"
++// CHECK-SPLIT-WITH-NOINL: "-debug-info-kind=limited"
+ // CHECK-SPLIT-WITH-NOINL: "-split-dwarf-output"
+ 
+ // RUN: %clang -target x86_64-unknown-linux-gnu -gsplit-dwarf -gmlt -fsplit-dwarf-inlining -S -### %s 2> %t
+@@ -92,7 +92,7 @@
+ // RUN: %clang -target x86_64-unknown-linux-gnu -gmlt -gsplit-dwarf -S -### %s 2> %t
+ // RUN: FileCheck -check-prefix=CHECK-SPLIT-OVER-GMLT < %t %s
+ //
+-// CHECK-SPLIT-OVER-GMLT: "-debug-info-kind=constructor"
++// CHECK-SPLIT-OVER-GMLT: "-debug-info-kind=limited"
+ // CHECK-SPLIT-OVER-GMLT: "-split-dwarf-file"
+ // CHECK-SPLIT-OVER-GMLT: "-split-dwarf-output"
+ 
+@@ -117,6 +117,6 @@
+ // RUN: %clang -target x86_64-unknown-linux-gnu -g0 -gsplit-dwarf=split -S -### %s 2> %t
+ // RUN: FileCheck -check-prefix=CHECK-SPLIT-OVER-G0 < %t %s
+ //
+-// CHECK-SPLIT-OVER-G0: "-debug-info-kind=constructor"
++// CHECK-SPLIT-OVER-G0: "-debug-info-kind=limited"
+ // CHECK-SPLIT-OVER-G0: "-split-dwarf-file"
+ // CHECK-SPLIT-OVER-G0: "-split-dwarf-output"
+diff --git a/lldb/test/Shell/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp b/lldb/test/Shell/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp
+index 503939680c5..3c4b005cdf1 100644
+--- a/lldb/test/Shell/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp
++++ b/lldb/test/Shell/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp
+@@ -106,7 +106,6 @@ protected:
+ int main() {
+   MemberTest::Base B1;
+   B1.Get();
+-  MemberTest::Class C1;
+   MemberTest::Class::StaticMemberFunc(1, 10, 2);
+   return 0;
+ }
diff --git a/sys-devel/llvm/files/cherry/3d52b1e81b7b3891d9132d826d4889119fad7d00.patch b/sys-devel/llvm/files/cherry/3d52b1e81b7b3891d9132d826d4889119fad7d00.patch
new file mode 100644
index 0000000..a459912
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/3d52b1e81b7b3891d9132d826d4889119fad7d00.patch
@@ -0,0 +1,80 @@
+commit 3d52b1e81b7b3891d9132d826d4889119fad7d00
+Author: Vedant Kumar <vsk@apple.com>
+Date:   Mon Jul 13 15:17:03 2020 -0700
+
+    Revert "[InstCombine] Drop debug loc in TryToSinkInstruction (reland)"
+    
+    This reverts commit 9649c2095f07a392bc2b2a93b5bd6c4c9bf5ba34. See
+    discussion on the llvm-commits thread: if it's OK to preserve the
+    location when sinking a call, it's probably OK to always preserve the
+    location.
+
+diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+index d1c1e541882..ec934906355 100644
+--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
++++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+@@ -3356,12 +3356,6 @@ static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) {
+   I->moveBefore(&*InsertPos);
+   ++NumSunkInst;
+ 
+-  // Drop the debug loc of non-inlinable instructions. This prevents
+-  // single-stepping from going backwards. See HowToUpdateDebugInfo.rst for
+-  // the full rationale.
+-  if (!isa<CallBase>(I))
+-    I->setDebugLoc(DebugLoc());
+-
+   // Also sink all related debug uses from the source basic block. Otherwise we
+   // get debug use before the def. Attempt to salvage debug uses first, to
+   // maximise the range variables have location for. If we cannot salvage, then
+diff --git a/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll b/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll
+deleted file mode 100644
+index e642276224b..00000000000
+--- a/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll
++++ /dev/null
+@@ -1,46 +0,0 @@
+-; RUN: opt -debugify -debugify-level=locations -instcombine -S < %s | FileCheck %s
+-
+-; CHECK-LABEL: @test1(
+-; CHECK: [[phi:%.*]] = phi i32
+-; CHECK-NEXT: [[add:%.*]] = add i32 {{.*}}, 1{{$}}
+-; CHECK-NEXT: add i32 [[phi]], [[add]], !dbg
+-define i32 @test1(i32 %0, i1 %1) {
+-  %3 = add i32 %0, 1
+-  br i1 %1, label %4, label %5
+-
+-4:                                                ; preds = %2
+-  br label %6
+-
+-5:                                                ; preds = %2
+-  br label %6
+-
+-6:                                                ; preds = %5, %4
+-  %7 = phi i32 [ 0, %4 ], [ 1, %5 ]
+-  %8 = add i32 %7, %3
+-  ret i32 %8
+-}
+-
+-; Function Attrs: nounwind readnone
+-declare i32 @external(i32) #0
+-
+-; CHECK-LABEL: @test2(
+-; CHECK: [[phi:%.*]] = phi i32
+-; CHECK-NEXT: [[add:%.*]] = call i32 @external(i32 {{.*}}), !dbg
+-; CHECK-NEXT: add i32 [[phi]], [[add]], !dbg
+-define i32 @test2(i32 %0, i1 %1) {
+-  %3 = call i32 @external(i32 %0)
+-  br i1 %1, label %4, label %5
+-
+-4:                                                ; preds = %2
+-  br label %6
+-
+-5:                                                ; preds = %2
+-  br label %6
+-
+-6:                                                ; preds = %5, %4
+-  %7 = phi i32 [ 0, %4 ], [ 1, %5 ]
+-  %8 = add i32 %7, %3
+-  ret i32 %8
+-}
+-
+-attributes #0 = { nounwind readnone }
diff --git a/sys-devel/llvm/files/cherry/7b0332389afd705f46b02fcf87ec3414b8dece34.patch b/sys-devel/llvm/files/cherry/7b0332389afd705f46b02fcf87ec3414b8dece34.patch
new file mode 100644
index 0000000..a052c21
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/7b0332389afd705f46b02fcf87ec3414b8dece34.patch
@@ -0,0 +1,177 @@
+commit 7b0332389afd705f46b02fcf87ec3414b8dece34
+Author: Nico Weber <thakis@chromium.org>
+Date:   Fri Sep 4 10:13:28 2020 -0400
+
+    Revert "Canonicalize declaration pointers when forming APValues."
+    
+    This reverts commit e6393ee813178e9d3306b8e3c6949a4f32f8a2cb.
+    It breaks Wunreachable for weak attributes, see
+    http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20200831/336645.html
+
+diff --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h
+index 485e6c2602c..87e4bd7f84c 100644
+--- a/clang/include/clang/AST/APValue.h
++++ b/clang/include/clang/AST/APValue.h
+@@ -174,7 +174,6 @@ public:
+       return !(LHS == RHS);
+     }
+     friend llvm::hash_code hash_value(const LValueBase &Base);
+-    friend struct llvm::DenseMapInfo<LValueBase>;
+ 
+   private:
+     PtrTy Ptr;
+@@ -202,7 +201,8 @@ public:
+ 
+   public:
+     LValuePathEntry() : Value() {}
+-    LValuePathEntry(BaseOrMemberType BaseOrMember);
++    LValuePathEntry(BaseOrMemberType BaseOrMember)
++        : Value{reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue())} {}
+     static LValuePathEntry ArrayIndex(uint64_t Index) {
+       LValuePathEntry Result;
+       Result.Value = Index;
+diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
+index 7531229654c..2a8834b4db0 100644
+--- a/clang/lib/AST/APValue.cpp
++++ b/clang/lib/AST/APValue.cpp
+@@ -38,7 +38,7 @@ static_assert(
+     "Type is insufficiently aligned");
+ 
+ APValue::LValueBase::LValueBase(const ValueDecl *P, unsigned I, unsigned V)
+-    : Ptr(P ? cast<ValueDecl>(P->getCanonicalDecl()) : nullptr), Local{I, V} {}
++    : Ptr(P), Local{I, V} {}
+ APValue::LValueBase::LValueBase(const Expr *P, unsigned I, unsigned V)
+     : Ptr(P), Local{I, V} {}
+ 
+@@ -82,19 +82,13 @@ bool operator==(const APValue::LValueBase &LHS,
+                 const APValue::LValueBase &RHS) {
+   if (LHS.Ptr != RHS.Ptr)
+     return false;
+-  if (LHS.is<TypeInfoLValue>() || LHS.is<DynamicAllocLValue>())
++  if (LHS.is<TypeInfoLValue>())
+     return true;
+   return LHS.Local.CallIndex == RHS.Local.CallIndex &&
+          LHS.Local.Version == RHS.Local.Version;
+ }
+ }
+ 
+-APValue::LValuePathEntry::LValuePathEntry(BaseOrMemberType BaseOrMember) {
+-  if (const Decl *D = BaseOrMember.getPointer())
+-    BaseOrMember.setPointer(D->getCanonicalDecl());
+-  Value = reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());
+-}
+-
+ namespace {
+   struct LVBase {
+     APValue::LValueBase Base;
+@@ -119,16 +113,14 @@ APValue::LValueBase::operator bool () const {
+ 
+ clang::APValue::LValueBase
+ llvm::DenseMapInfo<clang::APValue::LValueBase>::getEmptyKey() {
+-  clang::APValue::LValueBase B;
+-  B.Ptr = DenseMapInfo<const ValueDecl*>::getEmptyKey();
+-  return B;
++  return clang::APValue::LValueBase(
++      DenseMapInfo<const ValueDecl*>::getEmptyKey());
+ }
+ 
+ clang::APValue::LValueBase
+ llvm::DenseMapInfo<clang::APValue::LValueBase>::getTombstoneKey() {
+-  clang::APValue::LValueBase B;
+-  B.Ptr = DenseMapInfo<const ValueDecl*>::getTombstoneKey();
+-  return B;
++  return clang::APValue::LValueBase(
++      DenseMapInfo<const ValueDecl*>::getTombstoneKey());
+ }
+ 
+ namespace clang {
+@@ -765,10 +757,8 @@ void APValue::MakeMemberPointer(const ValueDecl *Member, bool IsDerivedMember,
+   assert(isAbsent() && "Bad state change");
+   MemberPointerData *MPD = new ((void*)(char*)Data.buffer) MemberPointerData;
+   Kind = MemberPointer;
+-  MPD->MemberAndIsDerivedMember.setPointer(
+-      Member ? cast<ValueDecl>(Member->getCanonicalDecl()) : nullptr);
++  MPD->MemberAndIsDerivedMember.setPointer(Member);
+   MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);
+   MPD->resizePath(Path.size());
+-  for (unsigned I = 0; I != Path.size(); ++I)
+-    MPD->getPath()[I] = Path[I]->getCanonicalDecl();
++  memcpy(MPD->getPath(), Path.data(), Path.size()*sizeof(const CXXRecordDecl*));
+ }
+diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
+index 8e43b62662e..e8f132dd480 100644
+--- a/clang/lib/AST/ExprConstant.cpp
++++ b/clang/lib/AST/ExprConstant.cpp
+@@ -1978,11 +1978,18 @@ static bool HasSameBase(const LValue &A, const LValue &B) {
+     return false;
+ 
+   if (A.getLValueBase().getOpaqueValue() !=
+-      B.getLValueBase().getOpaqueValue())
+-    return false;
++      B.getLValueBase().getOpaqueValue()) {
++    const Decl *ADecl = GetLValueBaseDecl(A);
++    if (!ADecl)
++      return false;
++    const Decl *BDecl = GetLValueBaseDecl(B);
++    if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())
++      return false;
++  }
+ 
+-  return A.getLValueCallIndex() == B.getLValueCallIndex() &&
+-         A.getLValueVersion() == B.getLValueVersion();
++  return IsGlobalLValue(A.getLValueBase()) ||
++         (A.getLValueCallIndex() == B.getLValueCallIndex() &&
++          A.getLValueVersion() == B.getLValueVersion());
+ }
+ 
+ static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {
+@@ -3101,8 +3108,7 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
+ 
+   // If we're currently evaluating the initializer of this declaration, use that
+   // in-flight value.
+-  if (declaresSameEntity(Info.EvaluatingDecl.dyn_cast<const ValueDecl *>(),
+-                         VD)) {
++  if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) {
+     Result = Info.EvaluatingDeclValue;
+     return true;
+   }
+diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
+index 3720b277af7..8d51dbde717 100644
+--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
++++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p9.cpp
+@@ -24,10 +24,11 @@ constexpr double &ni3; // expected-error {{declaration of reference variable 'ni
+ 
+ constexpr int nc1 = i; // expected-error {{constexpr variable 'nc1' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
+ constexpr C nc2 = C(); // expected-error {{cannot have non-literal type 'const C'}}
+-int &f(); // expected-note 2{{declared here}}
++int &f(); // expected-note {{declared here}}
+ constexpr int &nc3 = f(); // expected-error {{constexpr variable 'nc3' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
+ constexpr int nc4(i); // expected-error {{constexpr variable 'nc4' must be initialized by a constant expression}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
+ constexpr C nc5((C())); // expected-error {{cannot have non-literal type 'const C'}}
++int &f(); // expected-note {{here}}
+ constexpr int &nc6(f()); // expected-error {{constexpr variable 'nc6' must be initialized by a constant expression}} expected-note {{non-constexpr function 'f'}}
+ 
+ struct pixel {
+diff --git a/clang/test/OpenMP/ordered_messages.cpp b/clang/test/OpenMP/ordered_messages.cpp
+index 8a3a86443eb..f6b9dbd6d27 100644
+--- a/clang/test/OpenMP/ordered_messages.cpp
++++ b/clang/test/OpenMP/ordered_messages.cpp
+@@ -16,9 +16,6 @@ void xxx(int argc) {
+ }
+ 
+ int foo();
+-#if __cplusplus >= 201103L
+-// expected-note@-2 {{declared here}}
+-#endif
+ 
+ template <class T>
+ T foo() {
+@@ -179,7 +176,7 @@ T foo() {
+ 
+ int foo() {
+ #if __cplusplus >= 201103L
+-// expected-note@-2 {{declared here}}
++// expected-note@-2 2 {{declared here}}
+ #endif
+ int k;
+   #pragma omp for ordered
diff --git a/sys-devel/llvm/files/cherry/836991d3676fda06d0f07c816ba855c8a0c3e0aa.patch b/sys-devel/llvm/files/cherry/836991d3676fda06d0f07c816ba855c8a0c3e0aa.patch
new file mode 100644
index 0000000..b8b980d
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/836991d3676fda06d0f07c816ba855c8a0c3e0aa.patch
@@ -0,0 +1,62 @@
+commit 836991d3676fda06d0f07c816ba855c8a0c3e0aa
+Author: Wei Mi <wmi@google.com>
+Date:   Thu Jul 30 17:47:27 2020 -0700
+
+    Fix a crash when the sample profile uses md5 and -sample-profile-merge-inlinee
+    is enabled.
+    
+    When -sample-profile-merge-inlinee is enabled, new FunctionSamples may be
+    created during profile merge without GUIDToFuncNameMap being initialized.
+    That will occasionally cause compiler crash. The patch fixes it.
+    
+    Differential Revision: https://reviews.llvm.org/D84994
+
+diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h
+index 562468333ef..fa5326038ad 100644
+--- a/llvm/include/llvm/ProfileData/SampleProf.h
++++ b/llvm/include/llvm/ProfileData/SampleProf.h
+@@ -515,6 +515,8 @@ public:
+   sampleprof_error merge(const FunctionSamples &Other, uint64_t Weight = 1) {
+     sampleprof_error Result = sampleprof_error::success;
+     Name = Other.getName();
++    if (!GUIDToFuncNameMap)
++      GUIDToFuncNameMap = Other.GUIDToFuncNameMap;
+     MergeResult(Result, addTotalSamples(Other.getTotalSamples(), Weight));
+     MergeResult(Result, addHeadSamples(Other.getHeadSamples(), Weight));
+     for (const auto &I : Other.getBodySamples()) {
+diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
+index b6871e26053..ca60d35b8aa 100644
+--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
++++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
+@@ -995,6 +995,8 @@ bool SampleProfileLoader::inlineHotFunctions(
+         const FunctionSamples *FS = nullptr;
+         if (auto *CB = dyn_cast<CallBase>(&I)) {
+           if (!isa<IntrinsicInst>(I) && (FS = findCalleeFunctionSamples(*CB))) {
++            assert((!FunctionSamples::UseMD5 || FS->GUIDToFuncNameMap) &&
++                   "GUIDToFuncNameMap has to be populated");
+             AllCandidates.push_back(CB);
+             if (FS->getEntrySamples() > 0)
+               localNotInlinedCallSites.try_emplace(CB, FS);
+diff --git a/llvm/test/Transforms/SampleProfile/Inputs/inline-mergeprof.md5.prof b/llvm/test/Transforms/SampleProfile/Inputs/inline-mergeprof.md5.prof
+new file mode 100644
+index 00000000000..f8fa801beea
+Binary files /dev/null and b/llvm/test/Transforms/SampleProfile/Inputs/inline-mergeprof.md5.prof differ
+diff --git a/llvm/test/Transforms/SampleProfile/inline-mergeprof.ll b/llvm/test/Transforms/SampleProfile/inline-mergeprof.ll
+index d83fd23c33d..dfd1f1f2020 100644
+--- a/llvm/test/Transforms/SampleProfile/inline-mergeprof.ll
++++ b/llvm/test/Transforms/SampleProfile/inline-mergeprof.ll
+@@ -3,9 +3,13 @@
+ ; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/inline-mergeprof.prof -sample-profile-merge-inlinee=true -S | FileCheck -check-prefix=SCALE %s
+ ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/inline-mergeprof.prof -sample-profile-merge-inlinee=false -S | FileCheck -check-prefix=SCALE %s
+ 
+-; Test we properly merge not inlined profile properly with '-sample-profile-merge-inlinee'
++; Test we properly merge not inlined profile with '-sample-profile-merge-inlinee'
+ ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/inline-mergeprof.prof -sample-profile-merge-inlinee=true -S | FileCheck -check-prefix=MERGE  %s
+ 
++; Test we properly merge not inlined profile with '-sample-profile-merge-inlinee'
++; when the profile uses md5.
++; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/inline-mergeprof.md5.prof -sample-profile-merge-inlinee=true -S | FileCheck -check-prefix=MERGE  %s
++
+ @.str = private unnamed_addr constant [11 x i8] c"sum is %d\0A\00", align 1
+ 
+ define i32 @main() #0 !dbg !6 {
diff --git a/sys-devel/llvm/files/cherry/9f0225894254c4706519c85d6fc06c5382903fef.patch b/sys-devel/llvm/files/cherry/9f0225894254c4706519c85d6fc06c5382903fef.patch
new file mode 100644
index 0000000..ed40d1e
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/9f0225894254c4706519c85d6fc06c5382903fef.patch
@@ -0,0 +1,34 @@
+commit 9f0225894254c4706519c85d6fc06c5382903fef
+Author: Wolfgang Pieb <wolfgang_pieb@playstation.sony.com>
+Date:   Thu Jul 30 20:36:31 2020 -0700
+
+    Make a test case more flexible on Windows wrt the number of backslashes.
+
+diff --git a/lld/test/ELF/dependency-file.s b/lld/test/ELF/dependency-file.s
+index 14048ead494..e7dbf9c7695 100644
+--- a/lld/test/ELF/dependency-file.s
++++ b/lld/test/ELF/dependency-file.s
+@@ -6,16 +6,16 @@
+ # RUN: ld.lld -o %t/foo.exe %t/foo.o %t/"bar baz.o" "%t/#quux$.o" --dependency-file=%t/foo.d
+ # RUN: FileCheck --match-full-lines -DFILE=%t %s < %t/foo.d
+ 
+-# CHECK:      [[FILE]]{{/|\\\\}}foo.exe: \
+-# CHECK-NEXT:   [[FILE]]{{/|\\\\}}foo.o \
+-# CHECK-NEXT:   [[FILE]]{{/|\\\\}}bar\ baz.o \
+-# CHECK-NEXT:   [[FILE]]{{/|\\\\}}\#quux$$.o
++# CHECK:      [[FILE]]{{/|(\\)+}}foo.exe: \
++# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}foo.o \
++# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}bar\ baz.o \
++# CHECK-NEXT:   [[FILE]]{{/|(\\)+}}\#quux$$.o
+ # CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|\\\\}}foo.o:
++# CHECK-NEXT: [[FILE]]{{/|(\\)+}}foo.o:
+ # CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|\\\\}}bar\ baz.o:
++# CHECK-NEXT: [[FILE]]{{/|(\\)+}}bar\ baz.o:
+ # CHECK-EMPTY:
+-# CHECK-NEXT: [[FILE]]{{/|\\\\}}\#quux$$.o:
++# CHECK-NEXT: [[FILE]]{{/|(\\)+}}\#quux$$.o:
+ 
+ .global _start
+ _start:
diff --git a/sys-devel/llvm/files/cherry/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch b/sys-devel/llvm/files/cherry/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch
new file mode 100644
index 0000000..4189bd0
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch
@@ -0,0 +1,129 @@
+commit aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42
+Author: Evgenii Stepanov <eugenis@google.com>
+Date:   Wed Aug 5 12:32:17 2020 -0700
+
+    [msan] Support %ms in scanf.
+    
+    Differential Revision: https://reviews.llvm.org/D85350
+
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
+index bbbedda8fbe..082398ba960 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
+@@ -340,6 +340,12 @@ static void scanf_common(void *ctx, int n_inputs, bool allowGnuMalloc,
+       size = 0;
+     }
+     COMMON_INTERCEPTOR_WRITE_RANGE(ctx, argp, size);
++    // For %ms/%mc, write the allocated output buffer as well.
++    if (dir.allocate) {
++      char *buf = *(char **)argp;
++      if (buf)
++        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, internal_strlen(buf) + 1);
++    }
+   }
+ }
+ 
+diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
+index 4ed80721c4d..fa52ccc1994 100644
+--- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
++++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
+@@ -48,13 +48,13 @@ static const unsigned P = sizeof(char *);
+ 
+ static void verifyFormatResults(const char *format, unsigned n,
+                                 const std::vector<unsigned> &computed_sizes,
+-                                va_list expected_sizes) {
+-  // "+ 1" because of format string
++                                const std::vector<unsigned> &expected_sizes) {
++  // "+ 1" because of the format string
+   ASSERT_EQ(n + 1,
+             computed_sizes.size()) << "Unexpected number of format arguments: '"
+                                    << format << "'";
+   for (unsigned i = 0; i < n; ++i)
+-    EXPECT_EQ(va_arg(expected_sizes, unsigned), computed_sizes[i + 1])
++    EXPECT_EQ(expected_sizes[i], computed_sizes[i + 1])
+         << "Unexpect write size for argument " << i << ", format string '"
+         << format << "'";
+ }
+@@ -74,8 +74,11 @@ static void testScanf3(void *ctx, int result, bool allowGnuMalloc,
+ 
+ static void testScanf2(const char *format, int scanf_result,
+                        bool allowGnuMalloc, unsigned n,
+-                       va_list expected_sizes) {
+-  std::vector<unsigned> scanf_sizes;
++                       va_list expected_sizes_va) {
++  std::vector<unsigned> scanf_sizes, expected_sizes;
++  for (unsigned i = 0; i < n; ++i)
++    expected_sizes.push_back(va_arg(expected_sizes_va, unsigned));
++
+   // 16 args should be enough.
+   testScanf3((void *)&scanf_sizes, scanf_result, allowGnuMalloc, format,
+              test_buf, test_buf, test_buf, test_buf, test_buf, test_buf,
+@@ -151,7 +154,6 @@ TEST(SanitizerCommonInterceptors, Scanf) {
+   testScanf("%c%d", 2, C, I);
+   testScanf("%A%lf", 2, F, D);
+ 
+-  testScanf("%ms %Lf", 2, P, LD);
+   testScanf("s%Las", 1, LD);
+   testScanf("%ar", 1, F);
+ 
+@@ -202,6 +204,26 @@ TEST(SanitizerCommonInterceptors, Scanf) {
+                    test_buf_size);
+ }
+ 
++TEST(SanitizerCommonInterceptors, ScanfAllocate) {
++  const char *buf = "123456";
++
++  // Can not use testScanf() because this case needs a valid pointer to a string
++  // in the scanf argument.
++  {
++    std::vector<unsigned> scanf_sizes;
++    testScanf3((void *)&scanf_sizes, 2, /*allowGnuMalloc=*/false, "%ms", &buf);
++    verifyFormatResults("%ms", 2, scanf_sizes,
++                        {P, (unsigned)(strlen(buf) + 1)});
++  }
++
++  {
++    std::vector<unsigned> scanf_sizes;
++    testScanf3((void *)&scanf_sizes, 2, /*allowGnuMalloc=*/false, "%mc", &buf);
++    verifyFormatResults("%mc", 2, scanf_sizes,
++                        {P, (unsigned)(strlen(buf) + 1)});
++  }
++}
++
+ static void testPrintf3(void *ctx, const char *format, ...) {
+   va_list ap;
+   va_start(ap, format);
+@@ -210,8 +232,11 @@ static void testPrintf3(void *ctx, const char *format, ...) {
+ }
+ 
+ static void testPrintf2(const char *format, unsigned n,
+-                       va_list expected_sizes) {
+-  std::vector<unsigned> printf_sizes;
++                        va_list expected_sizes_va) {
++  std::vector<unsigned> printf_sizes, expected_sizes;
++  for (unsigned i = 0; i < n; ++i)
++    expected_sizes.push_back(va_arg(expected_sizes_va, unsigned));
++
+   // 16 args should be enough.
+   testPrintf3((void *)&printf_sizes, format,
+              test_buf, test_buf, test_buf, test_buf, test_buf, test_buf,
+diff --git a/compiler-rt/test/msan/scanf-allocate.cpp b/compiler-rt/test/msan/scanf-allocate.cpp
+new file mode 100644
+index 00000000000..a525b0c4ab9
+--- /dev/null
++++ b/compiler-rt/test/msan/scanf-allocate.cpp
+@@ -0,0 +1,14 @@
++// RUN: %clangxx_msan -O0 %s -o %t && %run %t >%t.out 2>&1
++// FileCheck %s <%t.out
++
++#include <sanitizer/msan_interface.h>
++#include <stdio.h>
++#include <string.h>
++
++int main(int argc, char **argv) {
++  char *str;
++  sscanf("#string#", "%ms", &str);
++  printf("str = %s\n", str);
++  __msan_check_mem_is_initialized(str, strlen(str) + 1);
++  // CHECK: #string#
++}
diff --git a/sys-devel/llvm/files/cherry/b9d977b0ca60c54f11615ca9d144c9f08b29fd85.patch b/sys-devel/llvm/files/cherry/b9d977b0ca60c54f11615ca9d144c9f08b29fd85.patch
new file mode 100644
index 0000000..9651960
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/b9d977b0ca60c54f11615ca9d144c9f08b29fd85.patch
@@ -0,0 +1,194 @@
+commit b9d977b0ca60c54f11615ca9d144c9f08b29fd85
+Author: Jeremy Morse <jeremy.morse@sony.com>
+Date:   Wed Jul 8 10:01:14 2020 +0100
+
+    [DWARF] Add cuttoff guarding quadratic validThroughout behaviour
+    
+    Occasionally we see absolutely massive basic blocks, typically in global
+    constructors that are vulnerable to heavy inlining. When these blocks are
+    dense with DBG_VALUE instructions, we can hit near quadratic complexity in
+    DwarfDebug's validThroughout function. The problem is caused by:
+    
+      * validThroughout having to step through all instructions in the block to
+        examine their lexical scope,
+      * and a high proportion of instructions in that block being DBG_VALUEs
+        for a unique variable fragment,
+    
+    Leading to us stepping through every instruction in the block, for (nearly)
+    each instruction in the block.
+    
+    By adding this guard, we force variables in large blocks to use a location
+    list rather than a single-location expression, as shown in the added test.
+    This shouldn't change the meaning of the output DWARF at all: instead we
+    use a less efficient DWARF encoding to avoid a poor-performance code path.
+    
+    Differential Revision: https://reviews.llvm.org/D83236
+
+diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+index 80935f8a454..45ed5256deb 100644
+--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
++++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+@@ -167,6 +167,11 @@ static cl::opt<LinkageNameOption>
+                                             "Abstract subprograms")),
+                       cl::init(DefaultLinkageNames));
+ 
++static cl::opt<unsigned> LocationAnalysisSizeLimit(
++    "singlevarlocation-input-bb-limit",
++    cl::desc("Maximum block size to analyze for single-location variables"),
++    cl::init(30000), cl::Hidden);
++
+ static const char *const DWARFGroupName = "dwarf";
+ static const char *const DWARFGroupDescription = "DWARF Emission";
+ static const char *const DbgTimerName = "writer";
+@@ -1637,8 +1642,10 @@ static bool validThroughout(LexicalScopes &LScopes,
+ // [1-3)    [(reg0, fragment 0, 32), (reg1, fragment 32, 32)]
+ // [3-4)    [(reg1, fragment 32, 32), (123, fragment 64, 32)]
+ // [4-)     [(@g, fragment 0, 96)]
+-bool DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
+-                                   const DbgValueHistoryMap::Entries &Entries) {
++bool DwarfDebug::buildLocationList(
++    SmallVectorImpl<DebugLocEntry> &DebugLoc,
++    const DbgValueHistoryMap::Entries &Entries,
++    DenseSet<const MachineBasicBlock *> &VeryLargeBlocks) {
+   using OpenRange =
+       std::pair<DbgValueHistoryMap::EntryIndex, DbgValueLoc>;
+   SmallVector<OpenRange, 4> OpenRanges;
+@@ -1734,8 +1741,14 @@ bool DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
+       DebugLoc.pop_back();
+   }
+ 
+-  return DebugLoc.size() == 1 && isSafeForSingleLocation &&
+-         validThroughout(LScopes, StartDebugMI, EndMI);
++  // If there's a single entry, safe for a single location, and not part of
++  // an over-sized basic block, then ask validThroughout whether this
++  // location can be represented as a single variable location.
++  if (DebugLoc.size() != 1 || !isSafeForSingleLocation)
++    return false;
++  if (VeryLargeBlocks.count(StartDebugMI->getParent()))
++    return false;
++  return validThroughout(LScopes, StartDebugMI, EndMI);
+ }
+ 
+ DbgEntity *DwarfDebug::createConcreteEntity(DwarfCompileUnit &TheCU,
+@@ -1767,6 +1780,13 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
+   // Grab the variable info that was squirreled away in the MMI side-table.
+   collectVariableInfoFromMFTable(TheCU, Processed);
+ 
++  // Identify blocks that are unreasonably sized, so that we can later
++  // skip lexical scope analysis over them.
++  DenseSet<const MachineBasicBlock *> VeryLargeBlocks;
++  for (const auto &MBB : *CurFn)
++    if (MBB.size() > LocationAnalysisSizeLimit)
++      VeryLargeBlocks.insert(&MBB);
++
+   for (const auto &I : DbgValues) {
+     InlinedEntity IV = I.first;
+     if (Processed.count(IV))
+@@ -1803,7 +1823,8 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
+     if (HistSize == 1 || SingleValueWithClobber) {
+       const auto *End =
+           SingleValueWithClobber ? HistoryMapEntries[1].getInstr() : nullptr;
+-      if (validThroughout(LScopes, MInsn, End)) {
++      if (VeryLargeBlocks.count(MInsn->getParent()) == 0 &&
++          validThroughout(LScopes, MInsn, End)) {
+         RegVar->initializeDbgValue(MInsn);
+         continue;
+       }
+@@ -1818,7 +1839,8 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
+ 
+     // Build the location list for this variable.
+     SmallVector<DebugLocEntry, 8> Entries;
+-    bool isValidSingleLocation = buildLocationList(Entries, HistoryMapEntries);
++    bool isValidSingleLocation =
++        buildLocationList(Entries, HistoryMapEntries, VeryLargeBlocks);
+ 
+     // Check whether buildLocationList managed to merge all locations to one
+     // that is valid throughout the variable's scope. If so, produce single
+diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+index bb0f550b965..d7a4b2abf52 100644
+--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
++++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+@@ -592,8 +592,10 @@ class DwarfDebug : public DebugHandlerBase {
+   /// function that describe the same variable. If the resulting 
+   /// list has only one entry that is valid for entire variable's
+   /// scope return true.
+-  bool buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
+-                         const DbgValueHistoryMap::Entries &Entries);
++  bool buildLocationList(
++      SmallVectorImpl<DebugLocEntry> &DebugLoc,
++      const DbgValueHistoryMap::Entries &Entries,
++      DenseSet<const MachineBasicBlock *> &VeryLargeBlocks);
+ 
+   /// Collect variable information from the side table maintained by MF.
+   void collectVariableInfoFromMFTable(DwarfCompileUnit &TheCU,
+diff --git a/llvm/test/DebugInfo/MIR/X86/singlelocation-cutoffs.mir b/llvm/test/DebugInfo/MIR/X86/singlelocation-cutoffs.mir
+new file mode 100644
+index 00000000000..6ad64d9d74b
+--- /dev/null
++++ b/llvm/test/DebugInfo/MIR/X86/singlelocation-cutoffs.mir
+@@ -0,0 +1,65 @@
++# Test cutoffs for single-location variable analysis.
++# Disable validThroughout if the input size exceeds the specified limit
++
++# RUN: llc %s -o - -start-after=livedebugvalues -mtriple=x86_64-unknown-unknown \
++# RUN:   --singlevarlocation-input-bb-limit=0 -filetype=obj\
++# RUN:   | llvm-dwarfdump -v -\
++# RUN:   | FileCheck %s -check-prefix=LIMITED
++
++# RUN: llc %s -o - -start-after=livedebugvalues -mtriple=x86_64-unknown-unknown \
++# RUN: --singlevarlocation-input-bb-limit=20 -filetype=obj | llvm-dwarfdump -v -\
++# RUN:   | FileCheck %s -check-prefix=UNLIMITED
++
++# LIMITED: DW_AT_location [DW_FORM_sec_offset]
++
++# UNLIMITED: DW_AT_location [DW_FORM_exprloc]
++
++--- |
++  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
++
++  declare i32 @use(i32)
++
++  define i32 @foo(i32 %x) !dbg !6 {
++  entry:
++    ret i32 1, !dbg !15
++  }
++
++  declare void @llvm.dbg.value(metadata, metadata, metadata)
++
++  !llvm.dbg.cu = !{!0}
++  !llvm.debugify = !{!3, !4}
++  !llvm.module.flags = !{!5}
++
++  !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
++  !1 = !DIFile(filename: "/tmp/t.ll", directory: "/")
++  !2 = !{}
++  !3 = !{i32 4}
++  !4 = !{i32 2}
++  !5 = !{i32 2, !"Debug Info Version", i32 3}
++  !6 = distinct !DISubprogram(name: "foo", linkageName: "foo", scope: null, file: !1, line: 1, type: !7, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
++  !7 = !DISubroutineType(types: !2)
++  !8 = !{!9, !11}
++  !9 = !DILocalVariable(name: "1", scope: !6, file: !1, line: 1, type: !10)
++  !10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
++  !11 = !DILocalVariable(name: "2", scope: !6, file: !1, line: 3, type: !10)
++  !12 = !DILocation(line: 1, column: 1, scope: !6)
++  !13 = !DILocation(line: 2, column: 1, scope: !6)
++  !14 = !DILocation(line: 3, column: 1, scope: !6)
++  !15 = !DILocation(line: 4, column: 1, scope: !6)
++
++...
++---
++name:            foo
++liveins:
++  - { reg: '$edi', virtual-reg: '' }
++stack:
++  - { id: 0, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
++      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
++      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
++body:             |
++  bb.0.entry:
++    liveins: $edi
++    DBG_VALUE renamable $edi, $noreg, !11, !DIExpression(), debug-location !14
++    RETQ debug-location !14
++
++...
diff --git a/sys-devel/llvm/files/cherry/be3ef93bf58aa5546c7baadfb21d43b75fbb4e24.patch b/sys-devel/llvm/files/cherry/be3ef93bf58aa5546c7baadfb21d43b75fbb4e24.patch
new file mode 100644
index 0000000..7bd7ff1
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/be3ef93bf58aa5546c7baadfb21d43b75fbb4e24.patch
@@ -0,0 +1,155 @@
+commit be3ef93bf58aa5546c7baadfb21d43b75fbb4e24
+Author: David Blaikie <dblaikie@gmail.com>
+Date:   Mon Aug 17 21:27:19 2020 -0700
+
+    PR44685: DebugInfo: Handle address-use-invalid type units referencing non-type units
+    
+    Theory was that we should never reach a non-type unit (eg: type in an
+    anonymous namespace) when we're already in the invalid "encountered an
+    address-use, so stop emitting types for now, until we throw out the
+    whole type tree to restart emitting in non-type unit" state. But that's
+    not the case (prior commit cleaned up one reason this wasn't exposed
+    sooner - but also makes it easier to test/demonstrate this issue)
+
+diff --git a/llvm/lib/CodeGen/AsmPrinter/AddressPool.h b/llvm/lib/CodeGen/AsmPrinter/AddressPool.h
+index f92cf72093c..f1edc6c330d 100644
+--- a/llvm/lib/CodeGen/AsmPrinter/AddressPool.h
++++ b/llvm/lib/CodeGen/AsmPrinter/AddressPool.h
+@@ -48,7 +48,7 @@ public:
+ 
+   bool hasBeenUsed() const { return HasBeenUsed; }
+ 
+-  void resetUsedFlag() { HasBeenUsed = false; }
++  void resetUsedFlag(bool HasBeenUsed = false) { this->HasBeenUsed = HasBeenUsed; }
+ 
+   MCSymbol *getLabel() { return AddressTableBaseSym; }
+   void setLabel(MCSymbol *Sym) { AddressTableBaseSym = Sym; }
+diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+index f70eed32f0b..cee72120acc 100644
+--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
++++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+@@ -3305,14 +3305,14 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
+ 
+ DwarfDebug::NonTypeUnitContext::NonTypeUnitContext(DwarfDebug *DD)
+     : DD(DD),
+-      TypeUnitsUnderConstruction(std::move(DD->TypeUnitsUnderConstruction)) {
++      TypeUnitsUnderConstruction(std::move(DD->TypeUnitsUnderConstruction)), AddrPoolUsed(DD->AddrPool.hasBeenUsed()) {
+   DD->TypeUnitsUnderConstruction.clear();
+-  assert(TypeUnitsUnderConstruction.empty() || !DD->AddrPool.hasBeenUsed());
++  DD->AddrPool.resetUsedFlag();
+ }
+ 
+ DwarfDebug::NonTypeUnitContext::~NonTypeUnitContext() {
+   DD->TypeUnitsUnderConstruction = std::move(TypeUnitsUnderConstruction);
+-  DD->AddrPool.resetUsedFlag();
++  DD->AddrPool.resetUsedFlag(AddrPoolUsed);
+ }
+ 
+ DwarfDebug::NonTypeUnitContext DwarfDebug::enterNonTypeUnitContext() {
+diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+index 0b943ebe46b..93e08d1151f 100644
+--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
++++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+@@ -648,6 +648,7 @@ public:
+   class NonTypeUnitContext {
+     DwarfDebug *DD;
+     decltype(DwarfDebug::TypeUnitsUnderConstruction) TypeUnitsUnderConstruction;
++    bool AddrPoolUsed;
+     friend class DwarfDebug;
+     NonTypeUnitContext(DwarfDebug *DD);
+   public:
+diff --git a/llvm/test/DebugInfo/X86/addr-tu-to-non-tu.ll b/llvm/test/DebugInfo/X86/addr-tu-to-non-tu.ll
+new file mode 100644
+index 00000000000..98943b73aef
+--- /dev/null
++++ b/llvm/test/DebugInfo/X86/addr-tu-to-non-tu.ll
+@@ -0,0 +1,89 @@
++; RUN: llc -filetype=obj -O0 -generate-type-units -split-dwarf-file=x.dwo < %s \
++; RUN:     | llvm-dwarfdump -debug-info -debug-types - \
++; RUN:     | FileCheck --implicit-check-not=Unit --implicit-check-not=contents --implicit-check-not=declaration %s
++
++; Test that an address-using-with-Split-DWARF type unit that references a
++; non-type unit is handled correctly. A NonTypeUnitContext is used to insulate
++; the type construction from being discarded when the prior/outer type has to be
++; discarded due to finding it used an address & so can't be type united under
++; Split DWARF. 
++
++; The intermediate types tu and t2 are here just to test a bit more
++; thoroughly/broadly. They also demonstrate one slight limitation/sub-optimality
++; since 't2' isn't put in a type unit.
++
++
++; extern int foo;
++; namespace {
++; struct t1 {
++; };
++; }
++; template <int *> struct t2 {
++;   t1 v1;
++; };
++; struct t3 {
++;   t2<&foo> v1;
++; };
++; t3 v1;
++
++; CHECK: .debug_info contents:
++; CHECK: Compile Unit:
++
++; CHECK: .debug_info.dwo contents:
++; CHECK: Compile Unit:
++
++; FIXME: In theory "t3" could be in a type unit - but at the moment, because it
++;        references t2, which needs an address, t3 gets non-type-united.
++;        But the same doesn't happen if t3 referenced an anonymous namespace type.
++
++; CHECK: DW_TAG_structure_type
++; CHECK:   DW_AT_name ("t3")
++; CHECK:   DW_TAG_member
++; CHECK:     DW_AT_type {{.*}} "t2<&foo>"
++; CHECK: DW_TAG_namespace
++; CHECK: [[T1:0x[0-9a-f]*]]:  DW_TAG_structure_type
++; CHECK:     DW_AT_name    ("t1")
++; CHECK: DW_TAG_structure_type
++; CHECK:   DW_AT_name ("t2<&foo>")
++; CHECK:   DW_TAG_member
++; CHECK:     DW_AT_name    ("v1")
++; CHECK:     DW_AT_type    ([[T1]] "t1")
++
++; CHECK: .debug_types contents:
++
++; CHECK-NOT: .debug_types.dwo contents:
++
++
++%struct.t3 = type { %struct.t2 }
++%struct.t2 = type { %"struct.(anonymous namespace)::t1" }
++%"struct.(anonymous namespace)::t1" = type { i8 }
++
++@v1 = dso_local global %struct.t3 zeroinitializer, align 1, !dbg !0
++@foo = external dso_local global i32, align 4
++
++!llvm.dbg.cu = !{!2}
++!llvm.module.flags = !{!18, !19, !20}
++!llvm.ident = !{!21}
++
++!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
++!1 = distinct !DIGlobalVariable(name: "v1", scope: !2, file: !3, line: 16, type: !6, isLocal: false, isDefinition: true)
++!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 12.0.0 (git@github.com:llvm/llvm-project.git be646ae2865371c7a4966797e88f355de5653e04)", isOptimized: false, runtimeVersion: 0, splitDebugFilename: "test.dwo", emissionKind: FullDebug, enums: !4, globals: !5, splitDebugInlining: false, nameTableKind: GNU)
++!3 = !DIFile(filename: "test.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch")
++!4 = !{}
++!5 = !{!0}
++!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t3", file: !3, line: 12, size: 8, flags: DIFlagTypePassByValue, elements: !7, identifier: "_ZTS2t3")
++!7 = !{!8}
++!8 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !6, file: !3, line: 13, baseType: !9, size: 8)
++!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t2<&foo>", file: !3, line: 8, size: 8, flags: DIFlagTypePassByValue, elements: !10, templateParams: !14, identifier: "_ZTS2t2IXadL_Z3fooEEE")
++!10 = !{!11}
++!11 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !9, file: !3, line: 9, baseType: !12, size: 8)
++!12 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t1", scope: !13, file: !3, line: 4, size: 8, flags: DIFlagTypePassByValue, elements: !4)
++!13 = !DINamespace(scope: null)
++!14 = !{!15}
++!15 = !DITemplateValueParameter(type: !16, value: i32* @foo)
++!16 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !17, size: 64)
++!17 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++!18 = !{i32 7, !"Dwarf Version", i32 4}
++!19 = !{i32 2, !"Debug Info Version", i32 3}
++!20 = !{i32 1, !"wchar_size", i32 4}
++!21 = !{!"clang version 12.0.0 (git@github.com:llvm/llvm-project.git be646ae2865371c7a4966797e88f355de5653e04)"}
diff --git a/sys-devel/llvm/files/cherry/cf5df40c4cf1a53a02ab1d56a488642e3dda8f6d.patch b/sys-devel/llvm/files/cherry/cf5df40c4cf1a53a02ab1d56a488642e3dda8f6d.patch
new file mode 100644
index 0000000..c5198dc
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/cf5df40c4cf1a53a02ab1d56a488642e3dda8f6d.patch
@@ -0,0 +1,91 @@
+commit cf5df40c4cf1a53a02ab1d56a488642e3dda8f6d
+Author: Leonard Chan <leonardchan@google.com>
+Date:   Fri Jul 17 15:29:50 2020 -0700
+
+    Revert "[AddressSanitizer] Don't use weak linkage for __{start,stop}_asan_globals"
+    
+    This reverts commit d76e62fdb7a93d9a33f642b6b528f2562cc3c3f4.
+    
+    Reverting since this can lead to linker errors:
+    
+    ```
+    ld.lld: error: undefined hidden symbol: __start_asan_globals
+    ```
+    
+    when using --gc-sections. The linker can discard __start_asan_globals
+    once there are no more `asan_globals` sections left, which can lead to
+    this error if we have external linkages to them.
+
+diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+index ee09a4d9db7..7516a64c6a3 100644
+--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
++++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+@@ -2103,23 +2103,10 @@ void ModuleAddressSanitizer::InstrumentGlobalsELF(
+     SetComdatForGlobalMetadata(G, Metadata, UniqueModuleId);
+   }
+ 
+-  // This should never be called when there are no globals, by the logic that
+-  // computes the UniqueModuleId string, which is "" when there are no globals.
+-  // It's important that this path is only used when there are actually some
+-  // globals, because that means that there will certainly be a live
+-  // `asan_globals` input section at link time and thus `__start_asan_globals`
+-  // and `__stop_asan_globals` symbols will definitely be defined at link time.
+-  // This means there's no need for the references to them to be weak, which
+-  // enables better code generation because ExternalWeakLinkage implies
+-  // isInterposable() and thus requires GOT indirection for PIC.  Since these
+-  // are known-defined hidden/dso_local symbols, direct PIC accesses without
+-  // dynamic relocation are always sufficient.
+-  assert(!MetadataGlobals.empty());
+-  assert(!UniqueModuleId.empty());
+-
+   // Update llvm.compiler.used, adding the new metadata globals. This is
+   // needed so that during LTO these variables stay alive.
+-  appendToCompilerUsed(M, MetadataGlobals);
++  if (!MetadataGlobals.empty())
++    appendToCompilerUsed(M, MetadataGlobals);
+ 
+   // RegisteredFlag serves two purposes. First, we can pass it to dladdr()
+   // to look up the loaded image that contains it. Second, we can store in it
+@@ -2132,18 +2119,15 @@ void ModuleAddressSanitizer::InstrumentGlobalsELF(
+       ConstantInt::get(IntptrTy, 0), kAsanGlobalsRegisteredFlagName);
+   RegisteredFlag->setVisibility(GlobalVariable::HiddenVisibility);
+ 
+-  // Create start and stop symbols.  These are known to be defined by
+-  // the linker, see comment above.
+-  auto MakeStartStopGV = [&](const char *Prefix) {
+-    GlobalVariable *StartStop =
+-        new GlobalVariable(M, IntptrTy, false, GlobalVariable::ExternalLinkage,
+-                           nullptr, Prefix + getGlobalMetadataSection());
+-    StartStop->setVisibility(GlobalVariable::HiddenVisibility);
+-    assert(StartStop->isImplicitDSOLocal());
+-    return StartStop;
+-  };
+-  GlobalVariable *StartELFMetadata = MakeStartStopGV("__start_");
+-  GlobalVariable *StopELFMetadata = MakeStartStopGV("__stop_");
++  // Create start and stop symbols.
++  GlobalVariable *StartELFMetadata = new GlobalVariable(
++      M, IntptrTy, false, GlobalVariable::ExternalWeakLinkage, nullptr,
++      "__start_" + getGlobalMetadataSection());
++  StartELFMetadata->setVisibility(GlobalVariable::HiddenVisibility);
++  GlobalVariable *StopELFMetadata = new GlobalVariable(
++      M, IntptrTy, false, GlobalVariable::ExternalWeakLinkage, nullptr,
++      "__stop_" + getGlobalMetadataSection());
++  StopELFMetadata->setVisibility(GlobalVariable::HiddenVisibility);
+ 
+   // Create a call to register the globals with the runtime.
+   IRB.CreateCall(AsanRegisterElfGlobals,
+diff --git a/llvm/test/Instrumentation/AddressSanitizer/global_metadata.ll b/llvm/test/Instrumentation/AddressSanitizer/global_metadata.ll
+index 4a6f4264437..ea9f2cf3f1a 100644
+--- a/llvm/test/Instrumentation/AddressSanitizer/global_metadata.ll
++++ b/llvm/test/Instrumentation/AddressSanitizer/global_metadata.ll
+@@ -28,10 +28,6 @@ target triple = "x86_64-unknown-linux-gnu"
+ ; during LTO.
+ ; CHECK: @llvm.compiler.used {{.*}} @__asan_global_global {{.*}} section "llvm.metadata"
+ 
+-; Check that start and stop symbols will be accessed as dso_local.
+-; CHECK: @__start_asan_globals = external hidden global i64
+-; CHECK: @__stop_asan_globals = external hidden global i64
+-
+ ; Check that location descriptors and global names were passed into __asan_register_globals:
+ ; CHECK: call void @__asan_register_elf_globals(i64 ptrtoint (i64* @___asan_globals_registered to i64), i64 ptrtoint (i64* @__start_asan_globals to i64), i64 ptrtoint (i64* @__stop_asan_globals to i64))
+ 
diff --git a/sys-devel/llvm/files/cherry/d12ec0f752e7f2c7f7252539da2d124264ec33f7.patch b/sys-devel/llvm/files/cherry/d12ec0f752e7f2c7f7252539da2d124264ec33f7.patch
new file mode 100644
index 0000000..44a1ea5
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/d12ec0f752e7f2c7f7252539da2d124264ec33f7.patch
@@ -0,0 +1,104 @@
+commit d12ec0f752e7f2c7f7252539da2d124264ec33f7
+Author: Nikita Popov <nikita.ppv@gmail.com>
+Date:   Sat Jul 18 22:22:41 2020 +0200
+
+    [InstCombine] Fix store merge worklist management (PR46680)
+    
+    Fixes https://bugs.llvm.org/show_bug.cgi?id=46680.
+    
+    Just like insertions through IRBuilder, InsertNewInstBefore()
+    should be using the deferred worklist mechanism, so that processing
+    of newly added instructions is prioritized.
+    
+    There's one side-effect of the worklist order change which could be
+    classified as a regression. An add op gets pushed through a select
+    that at the time is not a umax. We could add a reverse transform
+    that tries to push adds in the reverse direction to restore a min/max,
+    but that seems like a sure way of getting infinite loops... Seems
+    like something that should best wait on min/max intrinsics.
+    
+    Differential Revision: https://reviews.llvm.org/D84109
+
+diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+index f918dc7198c..ca51f37af4d 100644
+--- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
++++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+@@ -653,7 +653,7 @@ public:
+            "New instruction already inserted into a basic block!");
+     BasicBlock *BB = Old.getParent();
+     BB->getInstList().insert(Old.getIterator(), New); // Insert inst
+-    Worklist.push(New);
++    Worklist.add(New);
+     return New;
+   }
+ 
+diff --git a/llvm/test/Transforms/InstCombine/minmax-fold.ll b/llvm/test/Transforms/InstCombine/minmax-fold.ll
+index 5ee38978ed7..dcf060c0961 100644
+--- a/llvm/test/Transforms/InstCombine/minmax-fold.ll
++++ b/llvm/test/Transforms/InstCombine/minmax-fold.ll
+@@ -953,8 +953,8 @@ define i32 @add_umin(i32 %x) {
+ 
+ define i32 @add_umin_constant_limit(i32 %x) {
+ ; CHECK-LABEL: @add_umin_constant_limit(
+-; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 0
+-; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP1]], i32 41, i32 42
++; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp eq i32 [[X:%.*]], 0
++; CHECK-NEXT:    [[R:%.*]] = select i1 [[DOTNOT]], i32 41, i32 42
+ ; CHECK-NEXT:    ret i32 [[R]]
+ ;
+   %a = add nuw i32 %x, 41
+@@ -1165,8 +1165,8 @@ define <2 x i33> @add_umax_vec(<2 x i33> %x) {
+ 
+ define i8 @PR14613_umin(i8 %x) {
+ ; CHECK-LABEL: @PR14613_umin(
+-; CHECK-NEXT:    [[U7:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 15)
+-; CHECK-NEXT:    ret i8 [[U7]]
++; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 15)
++; CHECK-NEXT:    ret i8 [[TMP1]]
+ ;
+   %u4 = zext i8 %x to i32
+   %u5 = add nuw nsw i32 %u4, 15
+@@ -1179,8 +1179,8 @@ define i8 @PR14613_umin(i8 %x) {
+ define i8 @PR14613_umax(i8 %x) {
+ ; CHECK-LABEL: @PR14613_umax(
+ ; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i8 [[X:%.*]], -16
+-; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 -16
+-; CHECK-NEXT:    [[U7:%.*]] = add nsw i8 [[TMP2]], 15
++; CHECK-NEXT:    [[X_OP:%.*]] = add i8 [[X]], 15
++; CHECK-NEXT:    [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 -1
+ ; CHECK-NEXT:    ret i8 [[U7]]
+ ;
+   %u4 = zext i8 %x to i32
+@@ -1422,8 +1422,8 @@ define <2 x i33> @add_smax_vec(<2 x i33> %x) {
+ define i8 @PR14613_smin(i8 %x) {
+ ; CHECK-LABEL: @PR14613_smin(
+ ; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[X:%.*]], 40
+-; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 40
+-; CHECK-NEXT:    [[U7:%.*]] = add nsw i8 [[TMP2]], 15
++; CHECK-NEXT:    [[X_OP:%.*]] = add i8 [[X]], 15
++; CHECK-NEXT:    [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 55
+ ; CHECK-NEXT:    ret i8 [[U7]]
+ ;
+   %u4 = sext i8 %x to i32
+@@ -1437,8 +1437,8 @@ define i8 @PR14613_smin(i8 %x) {
+ define i8 @PR14613_smax(i8 %x) {
+ ; CHECK-LABEL: @PR14613_smax(
+ ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i8 [[X:%.*]], 40
+-; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 40
+-; CHECK-NEXT:    [[U7:%.*]] = add nuw i8 [[TMP2]], 15
++; CHECK-NEXT:    [[X_OP:%.*]] = add i8 [[X]], 15
++; CHECK-NEXT:    [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 55
+ ; CHECK-NEXT:    ret i8 [[U7]]
+ ;
+   %u4 = sext i8 %x to i32
+diff --git a/llvm/test/Transforms/InstCombine/pr46680.ll b/llvm/test/Transforms/InstCombine/pr46680.ll
+index 90ea2e110af..59d449d5dc2 100644
+--- a/llvm/test/Transforms/InstCombine/pr46680.ll
++++ b/llvm/test/Transforms/InstCombine/pr46680.ll
+@@ -1,5 +1,5 @@
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+-; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=3 < %s | FileCheck %s
++; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=2 < %s | FileCheck %s
+ 
+ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-pc-linux-gnu"
diff --git a/sys-devel/llvm/files/cherry/d23c1d6a8dddf0e1b9b9fa64726941e402ede8af.patch b/sys-devel/llvm/files/cherry/d23c1d6a8dddf0e1b9b9fa64726941e402ede8af.patch
new file mode 100644
index 0000000..c400868
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/d23c1d6a8dddf0e1b9b9fa64726941e402ede8af.patch
@@ -0,0 +1,141 @@
+commit d23c1d6a8dddf0e1b9b9fa64726941e402ede8af
+Author: Hongtao Yu <hoy@fb.com>
+Date:   Thu Jul 30 18:22:50 2020 -0700
+
+    [AutoFDO] Avoid merging inlinee samples multiple times
+    
+    A function call can be replicated by optimizations like loop unroll and jump threading and the replicates end up sharing the sample nested callee profile. Therefore when it comes to merging samples for uninlined callees in the sample profile inliner, a callee profile can be merged multiple times which will cause an assert to fire.
+    
+    This change avoids merging same callee profile for duplicate callsites by filtering out callee profiles with a non-zero head sample count.
+    
+    Reviewed By: wenlei, wmi
+    
+    Differential Revision: https://reviews.llvm.org/D84997
+
+diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
+index ca60d35b8aa..5978f2dc6d1 100644
+--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
++++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
+@@ -1106,16 +1106,26 @@ bool SampleProfileLoader::inlineHotFunctions(
+     }
+ 
+     if (ProfileMergeInlinee) {
+-      // Use entry samples as head samples during the merge, as inlinees
+-      // don't have head samples.
+-      assert(FS->getHeadSamples() == 0 && "Expect 0 head sample for inlinee");
+-      const_cast<FunctionSamples *>(FS)->addHeadSamples(FS->getEntrySamples());
+-
+-      // Note that we have to do the merge right after processing function.
+-      // This allows OutlineFS's profile to be used for annotation during
+-      // top-down processing of functions' annotation.
+-      FunctionSamples *OutlineFS = Reader->getOrCreateSamplesFor(*Callee);
+-      OutlineFS->merge(*FS);
++      // A function call can be replicated by optimizations like callsite
++      // splitting or jump threading and the replicates end up sharing the
++      // sample nested callee profile instead of slicing the original inlinee's
++      // profile. We want to do merge exactly once by filtering out callee
++      // profiles with a non-zero head sample count.
++      if (FS->getHeadSamples() == 0) {
++        // Use entry samples as head samples during the merge, as inlinees
++        // don't have head samples.
++        const_cast<FunctionSamples *>(FS)->addHeadSamples(
++            FS->getEntrySamples());
++
++        // Note that we have to do the merge right after processing function.
++        // This allows OutlineFS's profile to be used for annotation during
++        // top-down processing of functions' annotation.
++        FunctionSamples *OutlineFS = Reader->getOrCreateSamplesFor(*Callee);
++        OutlineFS->merge(*FS);
++      } else
++        assert(FS->getHeadSamples() == FS->getEntrySamples() &&
++               "Expect same head and entry sample counts for profiles already "
++               "merged.");
+     } else {
+       auto pair =
+           notInlinedCallInfo.try_emplace(Callee, NotInlinedProfileInfo{0});
+diff --git a/llvm/test/Transforms/SampleProfile/inline-mergeprof-dup.ll b/llvm/test/Transforms/SampleProfile/inline-mergeprof-dup.ll
+new file mode 100644
+index 00000000000..8d1379a5822
+--- /dev/null
++++ b/llvm/test/Transforms/SampleProfile/inline-mergeprof-dup.ll
+@@ -0,0 +1,80 @@
++;; Test we merge non-inlined profile only once with '-sample-profile-merge-inlinee'
++; RUN: opt < %s -passes='function(callsite-splitting),sample-profile' -sample-profile-file=%S/Inputs/inline-mergeprof.prof -sample-profile-merge-inlinee=true -S | FileCheck %s
++
++%struct.bitmap = type { i32, %struct.bitmap* }
++
++; CHECK-LABEL: @main
++define void @main(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt) #0 !dbg !6 {
++entry:
++  br label %Top
++
++Top:
++  %tobool1 = icmp eq %struct.bitmap* %a_elt, null
++  br i1 %tobool1, label %CallSiteBB, label %NextCond
++
++NextCond:
++  %cmp = icmp ne %struct.bitmap* %b_elt, null
++  br i1 %cmp, label %CallSiteBB, label %End
++
++CallSiteBB:
++  %p = phi i1 [0, %Top], [%c, %NextCond]
++;; The call site is replicated by callsite-splitting pass and they end up share the same sample profile
++; CHECK: call void @_Z3sumii(%struct.bitmap* null, %struct.bitmap* null, %struct.bitmap* %b_elt, i1 false)
++; CHECK: call void @_Z3sumii(%struct.bitmap* nonnull %a_elt, %struct.bitmap* nonnull %a_elt, %struct.bitmap* nonnull %b_elt, i1 %c)
++  call void @_Z3sumii(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %p), !dbg !8
++  br label %End
++
++End:
++  ret void
++}
++
++define void @_Z3sumii(%struct.bitmap* %dst_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %c)  #0 !dbg !12 {
++entry:
++  %tobool = icmp ne %struct.bitmap* %a_elt, null
++  %tobool1 = icmp ne %struct.bitmap* %b_elt, null
++  %or.cond = and i1 %tobool, %tobool1, !dbg !13
++  br i1 %or.cond, label %Cond, label %Big
++
++Cond:
++  %cmp = icmp eq %struct.bitmap*  %dst_elt, %a_elt, !dbg !14
++  br i1 %cmp, label %Small, label %Big, !dbg !15
++
++Small:
++  br label %End
++
++Big:
++  br label %End
++
++End:
++  ret void
++}
++
++attributes #0 = { "use-sample-profile" }
++
++!llvm.dbg.cu = !{!0}
++!llvm.module.flags = !{!3, !4}
++!llvm.ident = !{!5}
++
++!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.5 ", isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
++!1 = !DIFile(filename: "calls.cc", directory: ".")
++!2 = !{}
++!3 = !{i32 2, !"Dwarf Version", i32 4}
++!4 = !{i32 1, !"Debug Info Version", i32 3}
++!5 = !{!"clang version 3.5 "}
++!6 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 7, type: !7, scopeLine: 7, virtualIndex: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
++!7 = !DISubroutineType(types: !2)
++!8 = !DILocation(line: 10, scope: !9)
++!9 = !DILexicalBlockFile(scope: !10, file: !1, discriminator: 2)
++!10 = distinct !DILexicalBlock(scope: !6, file: !1, line: 10)
++!11 = !DILocation(line: 12, scope: !6)
++!12 = distinct !DISubprogram(name: "sum", scope: !1, file: !1, line: 3, type: !7, scopeLine: 3, virtualIndex: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
++!13 = !DILocation(line: 4, scope: !12)
++!14 = !DILocation(line: 5, scope: !12)
++!15 = !DILocation(line: 6, scope: !12)
++
++
++;; Check the profile of funciton sum is only merged once though the original callsite is replicted.
++; CHECK: name: "sum"
++; CHECK-NEXT: {!"function_entry_count", i64 46}
++; CHECK: !{!"branch_weights", i32 11, i32 37}
++; CHECK: !{!"branch_weights", i32 11, i32 1}
diff --git a/sys-devel/llvm/files/cherry/d30d46193876102a6bc99b527dfaf79be4b09515.patch b/sys-devel/llvm/files/cherry/d30d46193876102a6bc99b527dfaf79be4b09515.patch
new file mode 100644
index 0000000..f075d93
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/d30d46193876102a6bc99b527dfaf79be4b09515.patch
@@ -0,0 +1,111 @@
+commit d30d46193876102a6bc99b527dfaf79be4b09515
+Author: Fangrui Song <maskray@google.com>
+Date:   Fri Aug 7 22:08:00 2020 -0700
+
+    [ELF] Support .cfi_signal_frame
+    
+    glibc/sysdeps/unix/sysv/linux/x86_64/sigaction.c libc.a(sigaction.o) has a CIE
+    with the augmentation string "zRS". Support 'S' to allow --icf={safe,all}.
+
+diff --git a/lld/ELF/EhFrame.cpp b/lld/ELF/EhFrame.cpp
+index 4596a014838..13f0484ff9e 100644
+--- a/lld/ELF/EhFrame.cpp
++++ b/lld/ELF/EhFrame.cpp
+@@ -188,19 +188,14 @@ uint8_t EhReader::getFdeEncoding() {
+   for (char c : aug) {
+     if (c == 'R')
+       return readByte();
+-    if (c == 'z') {
++    if (c == 'z')
+       skipLeb128();
+-      continue;
+-    }
+-    if (c == 'P') {
+-      skipAugP();
+-      continue;
+-    }
+-    if (c == 'L') {
++    else if (c == 'L')
+       readByte();
+-      continue;
+-    }
+-    failOn(aug.data(), "unknown .eh_frame augmentation string: " + aug);
++    else if (c == 'P')
++      skipAugP();
++    else if (c != 'S')
++      failOn(aug.data(), "unknown .eh_frame augmentation string: " + aug);
+   }
+   return DW_EH_PE_absptr;
+ }
+@@ -216,7 +211,7 @@ bool EhReader::hasLSDA() {
+       skipAugP();
+     else if (c == 'R')
+       readByte();
+-    else
++    else if (c != 'S')
+       failOn(aug.data(), "unknown .eh_frame augmentation string: " + aug);
+   }
+   return false;
+diff --git a/lld/test/ELF/eh-frame-value-format7.s b/lld/test/ELF/eh-frame-value-format7.s
+index 5ebd5af44be..3f87b2915a7 100644
+--- a/lld/test/ELF/eh-frame-value-format7.s
++++ b/lld/test/ELF/eh-frame-value-format7.s
+@@ -22,7 +22,7 @@
+ # CHECK-NEXT:   EntrySize: 0
+ # CHECK-NEXT:   SectionData (
+ # CHECK-NEXT:     0000: 011B033B 10000000 01000000 30F2FFFF
+-# CHECK-NEXT:     0010: 24000000
++# CHECK-NEXT:     0010: 2C000000
+ # Header (always 4 bytes): 011B033B
+ #    10000000 = .eh_frame(0x2018) - .eh_frame_hdr(0x2004) - 4
+ #    01000000 = 1 = the number of FDE pointers in the table.
+@@ -43,10 +43,11 @@
+ # CHECK-NEXT:   AddressAlignment:
+ # CHECK-NEXT:   EntrySize:
+ # CHECK-NEXT:   SectionData (
+-# CHECK-NEXT:     0000: 0C000000 00000000 01520001 010102FF
+-# CHECK-NEXT:     0010: 0C000000 14000000 34120000 00000000
+-#                                           ^
+-#                                           ---> ADDR(foo) + 0x234 = 0x1234
++# CHECK-NEXT:     0000: 14000000 00000000 01525300 01010102
++# CHECK-NEXT:     0010: FF000000 00000000 0C000000 1C000000
++# CHECK-NEXT:     0020: 34120000 00000000 00000000
++#                       ^
++#                       ---> ADDR(foo) + 0x234 = 0x1234
+ 
+ .text
+ .global foo
+@@ -54,11 +55,12 @@ foo:
+  nop
+ 
+ .section .eh_frame,"a",@unwind
+-  .long 12   # Size
++  .long 13   # Size
+   .long 0x00 # ID
+   .byte 0x01 # Version.
+   
+-  .byte 0x52 # Augmentation string: 'R','\0'
++  .byte 0x52 # Augmentation string: 'R','S','\0'
++  .byte 0x53
+   .byte 0x00
+   
+   .byte 0x01
+@@ -71,5 +73,5 @@ foo:
+   .byte 0xFF
+  
+   .long 0x6  # Size
+-  .long 0x14 # ID
++  .long 0x15 # ID
+   .short foo + 0x234
+diff --git a/lld/test/ELF/icf-eh-frame.s b/lld/test/ELF/icf-eh-frame.s
+index 0b895ec8cc2..a09db020819 100644
+--- a/lld/test/ELF/icf-eh-frame.s
++++ b/lld/test/ELF/icf-eh-frame.s
+@@ -29,6 +29,7 @@ _Z1bv:
+ .section .text.Z1cv,"ax",@progbits
+ _Z1cv:
+   .cfi_startproc
++  .cfi_signal_frame
+   ret
+   .cfi_endproc
+ 
diff --git a/sys-devel/llvm/files/cherry/d893278bba01b0e1209e8b8accbdd5cfa75a0932.patch b/sys-devel/llvm/files/cherry/d893278bba01b0e1209e8b8accbdd5cfa75a0932.patch
new file mode 100644
index 0000000..a4efb07
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/d893278bba01b0e1209e8b8accbdd5cfa75a0932.patch
@@ -0,0 +1,67 @@
+commit d893278bba01b0e1209e8b8accbdd5cfa75a0932
+Author: Petar Avramovic <Petar.Avramovic@amd.com>
+Date:   Thu Aug 6 14:26:10 2020 +0200
+
+    [GlobalISel][InlineAsm] Fix matching input constraint to physreg
+    
+    Add given input and mark it as tied.
+    Doesn't create additional copy compared to
+    matching input constraint to virtual register.
+    
+    Differential Revision: https://reviews.llvm.org/D85122
+
+diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+index 7acf9c84323..bb4d41cfd69 100644
+--- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
++++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+@@ -455,19 +455,23 @@ bool InlineAsmLowering::lowerInlineAsm(
+         unsigned DefRegIdx = InstFlagIdx + 1;
+         Register Def = Inst->getOperand(DefRegIdx).getReg();
+ 
+-        // Copy input to new vreg with same reg class as Def
+-        const TargetRegisterClass *RC = MRI->getRegClass(Def);
+         ArrayRef<Register> SrcRegs = GetOrCreateVRegs(*OpInfo.CallOperandVal);
+         assert(SrcRegs.size() == 1 && "Single register is expected here");
+-        Register Tmp = MRI->createVirtualRegister(RC);
+-        if (!buildAnyextOrCopy(Tmp, SrcRegs[0], MIRBuilder))
+-          return false;
+ 
+-        // Add Flag and input register operand (Tmp) to Inst. Tie Tmp to Def.
++        // When Def is physreg: use given input.
++        Register In = SrcRegs[0];
++        // When Def is vreg: copy input to new vreg with same reg class as Def.
++        if (Def.isVirtual()) {
++          In = MRI->createVirtualRegister(MRI->getRegClass(Def));
++          if (!buildAnyextOrCopy(In, SrcRegs[0], MIRBuilder))
++            return false;
++        }
++
++        // Add Flag and input register operand (In) to Inst. Tie In to Def.
+         unsigned UseFlag = InlineAsm::getFlagWord(InlineAsm::Kind_RegUse, 1);
+         unsigned Flag = InlineAsm::getFlagWordForMatchingOp(UseFlag, DefIdx);
+         Inst.addImm(Flag);
+-        Inst.addReg(Tmp);
++        Inst.addReg(In);
+         Inst->tieOperands(DefRegIdx, Inst->getNumOperands() - 1);
+         break;
+       }
+diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
+index b7b2f0c9814..341ee743eda 100644
+--- a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
++++ b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
+@@ -243,3 +243,15 @@ define i16 @test_anyext_input_with_matching_constraint() {
+   %1 = call i16 asm sideeffect "", "=r,0"(i16 1)
+   ret i16 %1
+ }
++
++define i64 @test_input_with_matching_constraint_to_physical_register() {
++  ; CHECK-LABEL: name: test_input_with_matching_constraint_to_physical_register
++  ; CHECK: bb.1 (%ir-block.0):
++  ; CHECK:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
++  ; CHECK:   INLINEASM &"", 0 /* attdialect */, 10 /* regdef */, implicit-def $x2, 2147483657 /* reguse tiedto:$0 */, [[C]](tied-def 3)(s64)
++  ; CHECK:   [[COPY:%[0-9]+]]:_(s64) = COPY $x2
++  ; CHECK:   $x0 = COPY [[COPY]](s64)
++  ; CHECK:   RET_ReallyLR implicit $x0
++  %1 = tail call i64 asm "", "={x2},0"(i64 0)
++  ret i64 %1
++}
diff --git a/sys-devel/llvm/files/cherry/revert_4b0aa5724feaa89a9538dcab97e018110b0e4bc3_locally.patch b/sys-devel/llvm/files/cherry/revert_4b0aa5724feaa89a9538dcab97e018110b0e4bc3_locally.patch
new file mode 100644
index 0000000..4dd0819
--- /dev/null
+++ b/sys-devel/llvm/files/cherry/revert_4b0aa5724feaa89a9538dcab97e018110b0e4bc3_locally.patch
@@ -0,0 +1,1240 @@
+commit 72712b26f4e361b5c0d6ed8036e7fa4ef48ed7f0
+Author: Jian Cai <jiancai@google.com>
+Date:   Sat Sep 5 11:02:11 2020 -0700
+
+    Revert "Change the INLINEASM_BR MachineInstr to be a non-terminating instruction."
+    
+    This reverts commit 4b0aa5724feaa89a9538dcab97e018110b0e4bc3.
+
+diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h
+index 534f988c5e9..f8849f5743a 100644
+--- a/llvm/include/llvm/CodeGen/ISDOpcodes.h
++++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h
+@@ -870,7 +870,7 @@ enum NodeType {
+   /// SDOperands.
+   INLINEASM,
+ 
+-  /// INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
++  /// INLINEASM_BR - Terminator version of inline asm. Used by asm-goto.
+   INLINEASM_BR,
+ 
+   /// EH_LABEL - Represents a label in mid basic block used to track
+diff --git a/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
+index b69f6584fe6..849e720fa3b 100644
+--- a/llvm/include/llvm/CodeGen/MachineBasicBlock.h
++++ b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
+@@ -163,8 +163,11 @@ private:
+   // Indicate that this basic block ends a section.
+   bool IsEndSection = false;
+ 
+-  /// Indicate that this basic block is the indirect dest of an INLINEASM_BR.
+-  bool IsInlineAsmBrIndirectTarget = false;
++  /// Default target of the callbr of a basic block.
++  bool InlineAsmBrDefaultTarget = false;
++
++  /// List of indirect targets of the callbr of a basic block.
++  SmallPtrSet<const MachineBasicBlock*, 4> InlineAsmBrIndirectTargets;
+ 
+   /// since getSymbol is a relatively heavy-weight operation, the symbol
+   /// is only computed once and is cached.
+@@ -463,19 +466,31 @@ public:
+   /// Sets the section ID for this basic block.
+   void setSectionID(MBBSectionID V) { SectionID = V; }
+ 
+-  /// Returns true if this block may have an INLINEASM_BR (overestimate, by
+-  /// checking if any of the successors are indirect targets of any inlineasm_br
+-  /// in the function).
+-  bool mayHaveInlineAsmBr() const;
+-
+   /// Returns true if this is the indirect dest of an INLINEASM_BR.
+-  bool isInlineAsmBrIndirectTarget() const {
+-    return IsInlineAsmBrIndirectTarget;
++  bool isInlineAsmBrIndirectTarget(const MachineBasicBlock *Tgt) const {
++    return InlineAsmBrIndirectTargets.count(Tgt);
+   }
+ 
+   /// Indicates if this is the indirect dest of an INLINEASM_BR.
+-  void setIsInlineAsmBrIndirectTarget(bool V = true) {
+-    IsInlineAsmBrIndirectTarget = V;
++  void addInlineAsmBrIndirectTarget(const MachineBasicBlock *Tgt) {
++    InlineAsmBrIndirectTargets.insert(Tgt);
++  }
++
++  /// Transfers indirect targets to INLINEASM_BR's copy block.
++  void transferInlineAsmBrIndirectTargets(MachineBasicBlock *CopyBB) {
++    for (auto *Target : InlineAsmBrIndirectTargets)
++      CopyBB->addInlineAsmBrIndirectTarget(Target);
++    return InlineAsmBrIndirectTargets.clear();
++  }
++
++  /// Returns true if this is the default dest of an INLINEASM_BR.
++  bool isInlineAsmBrDefaultTarget() const {
++    return InlineAsmBrDefaultTarget;
++  }
++
++  /// Indicates if this is the default deft of an INLINEASM_BR.
++  void setInlineAsmBrDefaultTarget() {
++    InlineAsmBrDefaultTarget = true;
+   }
+ 
+   /// Returns true if it is legal to hoist instructions into this block.
+diff --git a/llvm/include/llvm/Target/Target.td b/llvm/include/llvm/Target/Target.td
+index aab5376db45..c628fa8b625 100644
+--- a/llvm/include/llvm/Target/Target.td
++++ b/llvm/include/llvm/Target/Target.td
+@@ -1017,10 +1017,10 @@ def INLINEASM_BR : StandardPseudoInstruction {
+   let OutOperandList = (outs);
+   let InOperandList = (ins variable_ops);
+   let AsmString = "";
+-  // Unlike INLINEASM, this is always treated as having side-effects.
+-  let hasSideEffects = 1;
+-  // Despite potentially branching, this instruction is intentionally _not_
+-  // marked as a terminator or a branch.
++  let hasSideEffects = 0;  // Note side effect is encoded in an operand.
++  let isTerminator = 1;
++  let isBranch = 1;
++  let isIndirectBranch = 1;
+ }
+ def CFI_INSTRUCTION : StandardPseudoInstruction {
+   let OutOperandList = (outs);
+diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp
+index c6d5aa37834..022689c94a3 100644
+--- a/llvm/lib/CodeGen/BranchFolding.cpp
++++ b/llvm/lib/CodeGen/BranchFolding.cpp
+@@ -1083,9 +1083,8 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
+       if (!UniquePreds.insert(PBB).second)
+         continue;
+ 
+-      // Skip blocks which may jump to a landing pad or jump from an asm blob.
+-      // Can't tail merge these.
+-      if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
++      // Skip blocks which may jump to a landing pad. Can't tail merge these.
++      if (PBB->hasEHPadSuccessor())
+         continue;
+ 
+       // After block placement, only consider predecessors that belong to the
+@@ -1666,15 +1665,13 @@ ReoptimizeBlock:
+ 
+     if (!MBB->isEHPad()) {
+       // Check all the predecessors of this block.  If one of them has no fall
+-      // throughs, and analyzeBranch thinks it _could_ fallthrough to this
+-      // block, move this block right after it.
++      // throughs, move this block right after it.
+       for (MachineBasicBlock *PredBB : MBB->predecessors()) {
+         // Analyze the branch at the end of the pred.
+         MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
+         SmallVector<MachineOperand, 4> PredCond;
+         if (PredBB != MBB && !PredBB->canFallThrough() &&
+             !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true) &&
+-            (PredTBB == MBB || PredFBB == MBB) &&
+             (!CurFallsThru || !CurTBB || !CurFBB) &&
+             (!CurFallsThru || MBB->getNumber() >= PredBB->getNumber())) {
+           // If the current block doesn't fall through, just move it.
+@@ -1700,24 +1697,21 @@ ReoptimizeBlock:
+     }
+ 
+     if (!CurFallsThru) {
+-      // Check analyzable branch-successors to see if we can move this block
+-      // before one.
+-      if (!CurUnAnalyzable) {
+-        for (MachineBasicBlock *SuccBB : {CurFBB, CurTBB}) {
+-          if (!SuccBB)
+-            continue;
+-          // Analyze the branch at the end of the block before the succ.
+-          MachineFunction::iterator SuccPrev = --SuccBB->getIterator();
+-
+-          // If this block doesn't already fall-through to that successor, and
+-          // if the succ doesn't already have a block that can fall through into
+-          // it, we can arrange for the fallthrough to happen.
+-          if (SuccBB != MBB && &*SuccPrev != MBB &&
+-              !SuccPrev->canFallThrough()) {
+-            MBB->moveBefore(SuccBB);
+-            MadeChange = true;
+-            goto ReoptimizeBlock;
+-          }
++      // Check all successors to see if we can move this block before it.
++      for (MachineBasicBlock *SuccBB : MBB->successors()) {
++        // Analyze the branch at the end of the block before the succ.
++        MachineFunction::iterator SuccPrev = --SuccBB->getIterator();
++
++        // If this block doesn't already fall-through to that successor, and if
++        // the succ doesn't already have a block that can fall through into it,
++        // and if the successor isn't an EH destination, we can arrange for the
++        // fallthrough to happen.
++        if (SuccBB != MBB && &*SuccPrev != MBB &&
++            !SuccPrev->canFallThrough() && !CurUnAnalyzable &&
++            !SuccBB->isEHPad()) {
++          MBB->moveBefore(SuccBB);
++          MadeChange = true;
++          goto ReoptimizeBlock;
+         }
+       }
+ 
+diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp
+index 2d4b60435d9..e8487412264 100644
+--- a/llvm/lib/CodeGen/MachineBasicBlock.cpp
++++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp
+@@ -277,16 +277,8 @@ LLVM_DUMP_METHOD void MachineBasicBlock::dump() const {
+ }
+ #endif
+ 
+-bool MachineBasicBlock::mayHaveInlineAsmBr() const {
+-  for (const MachineBasicBlock *Succ : successors()) {
+-    if (Succ->isInlineAsmBrIndirectTarget())
+-      return true;
+-  }
+-  return false;
+-}
+-
+ bool MachineBasicBlock::isLegalToHoistInto() const {
+-  if (isReturnBlock() || hasEHPadSuccessor() || mayHaveInlineAsmBr())
++  if (isReturnBlock() || hasEHPadSuccessor())
+     return false;
+   return true;
+ }
+@@ -1140,7 +1132,7 @@ bool MachineBasicBlock::canSplitCriticalEdge(
+ 
+   // Splitting the critical edge to a callbr's indirect block isn't advised.
+   // Don't do it in this generic function.
+-  if (Succ->isInlineAsmBrIndirectTarget())
++  if (isInlineAsmBrIndirectTarget(Succ))
+     return false;
+ 
+   const MachineFunction *MF = getParent();
+diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp
+index 5f958bbc31b..7373e40f856 100644
+--- a/llvm/lib/CodeGen/MachineSink.cpp
++++ b/llvm/lib/CodeGen/MachineSink.cpp
+@@ -733,13 +733,6 @@ MachineSinking::FindSuccToSinkTo(MachineInstr &MI, MachineBasicBlock *MBB,
+   if (SuccToSinkTo && SuccToSinkTo->isEHPad())
+     return nullptr;
+ 
+-  // It ought to be okay to sink instructions into an INLINEASM_BR target, but
+-  // only if we make sure that MI occurs _before_ an INLINEASM_BR instruction in
+-  // the source block (which this code does not yet do). So for now, forbid
+-  // doing so.
+-  if (SuccToSinkTo && SuccToSinkTo->isInlineAsmBrIndirectTarget())
+-    return nullptr;
+-
+   return SuccToSinkTo;
+ }
+ 
+diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
+index c1a2c4e0bc6..5e615174a63 100644
+--- a/llvm/lib/CodeGen/MachineVerifier.cpp
++++ b/llvm/lib/CodeGen/MachineVerifier.cpp
+@@ -584,6 +584,7 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
+     // it is an entry block or landing pad.
+     for (const auto &LI : MBB->liveins()) {
+       if (isAllocatable(LI.PhysReg) && !MBB->isEHPad() &&
++          !MBB->isInlineAsmBrDefaultTarget() &&
+           MBB->getIterator() != MBB->getParent()->begin()) {
+         report("MBB has allocatable live-in, but isn't entry or landing-pad.", MBB);
+         report_context(LI.PhysReg);
+@@ -729,7 +730,7 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
+         continue;
+       // Also accept successors which are for exception-handling or might be
+       // inlineasm_br targets.
+-      if (SuccMBB->isEHPad() || SuccMBB->isInlineAsmBrIndirectTarget())
++      if (SuccMBB->isEHPad() || MBB->isInlineAsmBrIndirectTarget(SuccMBB))
+         continue;
+       report("MBB has unexpected successors which are not branch targets, "
+              "fallthrough, EHPads, or inlineasm_br targets.",
+diff --git a/llvm/lib/CodeGen/PHIEliminationUtils.cpp b/llvm/lib/CodeGen/PHIEliminationUtils.cpp
+index bae96eb8452..3a2cdaf3bd3 100644
+--- a/llvm/lib/CodeGen/PHIEliminationUtils.cpp
++++ b/llvm/lib/CodeGen/PHIEliminationUtils.cpp
+@@ -26,9 +26,8 @@ llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB,
+ 
+   // Usually, we just want to insert the copy before the first terminator
+   // instruction. However, for the edge going to a landing pad, we must insert
+-  // the copy before the call/invoke instruction. Similarly for an INLINEASM_BR
+-  // going to an indirect target.
+-  if (!SuccMBB->isEHPad() && !SuccMBB->isInlineAsmBrIndirectTarget())
++  // the copy before the call/invoke instruction.
++  if (!SuccMBB->isEHPad())
+     return MBB->getFirstTerminator();
+ 
+   // Discover any defs/uses in this basic block.
+diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp
+index 17160a9f42c..27b6436787d 100644
+--- a/llvm/lib/CodeGen/RegisterCoalescer.cpp
++++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp
+@@ -1064,9 +1064,7 @@ bool RegisterCoalescer::removePartialRedundancy(const CoalescerPair &CP,
+     return false;
+ 
+   MachineBasicBlock &MBB = *CopyMI.getParent();
+-  // If this block is the target of an invoke/inlineasm_br, moving the copy into
+-  // the predecessor is tricker, and we don't handle it.
+-  if (MBB.isEHPad() || MBB.isInlineAsmBrIndirectTarget())
++  if (MBB.isEHPad())
+     return false;
+ 
+   if (MBB.pred_size() != 2)
+diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+index ce20d506586..731cd2396b6 100644
+--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
++++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
+@@ -1033,6 +1033,57 @@ EmitSchedule(MachineBasicBlock::iterator &InsertPos) {
+     }
+   }
+ 
++  // Split after an INLINEASM_BR block with outputs. This allows us to keep the
++  // copy to/from register instructions from being between two terminator
++  // instructions, which causes the machine instruction verifier agita.
++  auto TI = llvm::find_if(*BB, [](const MachineInstr &MI){
++    return MI.getOpcode() == TargetOpcode::INLINEASM_BR;
++  });
++  auto SplicePt = TI != BB->end() ? std::next(TI) : BB->end();
++  if (TI != BB->end() && SplicePt != BB->end() &&
++      TI->getOpcode() == TargetOpcode::INLINEASM_BR &&
++      SplicePt->getOpcode() == TargetOpcode::COPY) {
++    MachineBasicBlock *FallThrough = BB->getFallThrough();
++    if (!FallThrough)
++      for (const MachineOperand &MO : BB->back().operands())
++        if (MO.isMBB()) {
++          FallThrough = MO.getMBB();
++          break;
++        }
++    assert(FallThrough && "Cannot find default dest block for callbr!");
++
++    MachineBasicBlock *CopyBB = MF.CreateMachineBasicBlock(BB->getBasicBlock());
++    MachineFunction::iterator BBI(*BB);
++    MF.insert(++BBI, CopyBB);
++
++    CopyBB->splice(CopyBB->begin(), BB, SplicePt, BB->end());
++    CopyBB->setInlineAsmBrDefaultTarget();
++
++    CopyBB->addSuccessor(FallThrough, BranchProbability::getOne());
++    BB->removeSuccessor(FallThrough);
++    BB->addSuccessor(CopyBB, BranchProbability::getOne());
++
++    // Mark all physical registers defined in the original block as being live
++    // on entry to the copy block.
++    for (const auto &MI : *CopyBB)
++      for (const MachineOperand &MO : MI.operands())
++        if (MO.isReg()) {
++          Register reg = MO.getReg();
++          if (Register::isPhysicalRegister(reg)) {
++            CopyBB->addLiveIn(reg);
++            break;
++          }
++        }
++
++    CopyBB->normalizeSuccProbs();
++    BB->normalizeSuccProbs();
++
++    BB->transferInlineAsmBrIndirectTargets(CopyBB);
++
++    InsertPos = CopyBB->end();
++    return CopyBB;
++  }
++
+   InsertPos = Emitter.getInsertPos();
+   return Emitter.getBlock();
+ }
+diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+index c8b72abb9b7..aafe4a25c81 100644
+--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
++++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+@@ -2903,13 +2903,14 @@ void SelectionDAGBuilder::visitCallBr(const CallBrInst &I) {
+ 
+   // Retrieve successors.
+   MachineBasicBlock *Return = FuncInfo.MBBMap[I.getDefaultDest()];
++  Return->setInlineAsmBrDefaultTarget();
+ 
+   // Update successor info.
+   addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
+   for (unsigned i = 0, e = I.getNumIndirectDests(); i < e; ++i) {
+     MachineBasicBlock *Target = FuncInfo.MBBMap[I.getIndirectDest(i)];
+     addSuccessorWithProb(CallBrMBB, Target, BranchProbability::getZero());
+-    Target->setIsInlineAsmBrIndirectTarget();
++    CallBrMBB->addInlineAsmBrIndirectTarget(Target);
+   }
+   CallBrMBB->normalizeSuccProbs();
+ 
+@@ -2982,6 +2983,16 @@ void SelectionDAGBuilder::UpdateSplitBlock(MachineBasicBlock *First,
+   for (unsigned i = 0, e = SL->BitTestCases.size(); i != e; ++i)
+     if (SL->BitTestCases[i].Parent == First)
+       SL->BitTestCases[i].Parent = Last;
++
++  // SelectionDAGISel::FinishBasicBlock will add PHI operands for the
++  // successors of the fallthrough block. Here, we add PHI operands for the
++  // successors of the INLINEASM_BR block itself.
++  if (First->getFirstTerminator()->getOpcode() == TargetOpcode::INLINEASM_BR)
++    for (std::pair<MachineInstr *, unsigned> &pair : FuncInfo.PHINodesToUpdate)
++      if (First->isSuccessor(pair.first->getParent()))
++        MachineInstrBuilder(*First->getParent(), pair.first)
++            .addReg(pair.second)
++            .addMBB(First);
+ }
+ 
+ void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) {
+@@ -7850,6 +7861,7 @@ public:
+   }
+ };
+ 
++using SDISelAsmOperandInfoVector = SmallVector<SDISelAsmOperandInfo, 16>;
+ 
+ } // end anonymous namespace
+ 
+@@ -8095,7 +8107,7 @@ void SelectionDAGBuilder::visitInlineAsm(const CallBase &Call) {
+   const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
+ 
+   /// ConstraintOperands - Information about all of the constraints.
+-  SmallVector<SDISelAsmOperandInfo, 16> ConstraintOperands;
++  SDISelAsmOperandInfoVector ConstraintOperands;
+ 
+   const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+   TargetLowering::AsmOperandInfoVector TargetConstraints = TLI.ParseConstraints(
+diff --git a/llvm/lib/CodeGen/ShrinkWrap.cpp b/llvm/lib/CodeGen/ShrinkWrap.cpp
+index ce43fb1fbd4..85dd4f59fa1 100644
+--- a/llvm/lib/CodeGen/ShrinkWrap.cpp
++++ b/llvm/lib/CodeGen/ShrinkWrap.cpp
+@@ -494,15 +494,17 @@ bool ShrinkWrap::runOnMachineFunction(MachineFunction &MF) {
+                                "EH Funclets are not supported yet.",
+                                MBB.front().getDebugLoc(), &MBB);
+ 
+-    if (MBB.isEHPad() || MBB.isInlineAsmBrIndirectTarget()) {
+-      // Push the prologue and epilogue outside of the region that may throw (or
+-      // jump out via inlineasm_br), by making sure that all the landing pads
+-      // are at least at the boundary of the save and restore points.  The
+-      // problem is that a basic block can jump out from the middle in these
+-      // cases, which we do not handle.
++    if (MBB.isEHPad()) {
++      // Push the prologue and epilogue outside of
++      // the region that may throw by making sure
++      // that all the landing pads are at least at the
++      // boundary of the save and restore points.
++      // The problem with exceptions is that the throw
++      // is not properly modeled and in particular, a
++      // basic block can jump out from the middle.
+       updateSaveRestorePoints(MBB, RS.get());
+       if (!ArePointsInteresting()) {
+-        LLVM_DEBUG(dbgs() << "EHPad/inlineasm_br prevents shrink-wrapping\n");
++        LLVM_DEBUG(dbgs() << "EHPad prevents shrink-wrapping\n");
+         return false;
+       }
+       continue;
+diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp
+index 8dec620536a..5a8090881b6 100644
+--- a/llvm/lib/CodeGen/SplitKit.cpp
++++ b/llvm/lib/CodeGen/SplitKit.cpp
+@@ -80,15 +80,10 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI,
+   std::pair<SlotIndex, SlotIndex> &LIP = LastInsertPoint[Num];
+   SlotIndex MBBEnd = LIS.getMBBEndIdx(&MBB);
+ 
+-  SmallVector<const MachineBasicBlock *, 1> ExceptionalSuccessors;
+-  bool EHPadSuccessor = false;
+-  for (const MachineBasicBlock *SMBB : MBB.successors()) {
+-    if (SMBB->isEHPad()) {
+-      ExceptionalSuccessors.push_back(SMBB);
+-      EHPadSuccessor = true;
+-    } else if (SMBB->isInlineAsmBrIndirectTarget())
+-      ExceptionalSuccessors.push_back(SMBB);
+-  }
++  SmallVector<const MachineBasicBlock *, 1> EHPadSuccessors;
++  for (const MachineBasicBlock *SMBB : MBB.successors())
++    if (SMBB->isEHPad())
++      EHPadSuccessors.push_back(SMBB);
+ 
+   // Compute insert points on the first call. The pair is independent of the
+   // current live interval.
+@@ -99,17 +94,15 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI,
+     else
+       LIP.first = LIS.getInstructionIndex(*FirstTerm);
+ 
+-    // If there is a landing pad or inlineasm_br successor, also find the
+-    // instruction. If there is no such instruction, we don't need to do
+-    // anything special.  We assume there cannot be multiple instructions that
+-    // are Calls with EHPad successors or INLINEASM_BR in a block. Further, we
+-    // assume that if there are any, they will be after any other call
+-    // instructions in the block.
+-    if (ExceptionalSuccessors.empty())
++    // If there is a landing pad successor, also find the call instruction.
++    if (EHPadSuccessors.empty())
+       return LIP.first;
+-    for (auto I = MBB.rbegin(), E = MBB.rend(); I != E; ++I) {
+-      if ((EHPadSuccessor && I->isCall()) ||
+-          I->getOpcode() == TargetOpcode::INLINEASM_BR) {
++    // There may not be a call instruction (?) in which case we ignore LPad.
++    LIP.second = LIP.first;
++    for (MachineBasicBlock::const_iterator I = MBB.end(), E = MBB.begin();
++         I != E;) {
++      --I;
++      if (I->isCall()) {
+         LIP.second = LIS.getInstructionIndex(*I);
+         break;
+       }
+@@ -121,7 +114,7 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI,
+   if (!LIP.second)
+     return LIP.first;
+ 
+-  if (none_of(ExceptionalSuccessors, [&](const MachineBasicBlock *EHPad) {
++  if (none_of(EHPadSuccessors, [&](const MachineBasicBlock *EHPad) {
+         return LIS.isLiveInToMBB(CurLI, EHPad);
+       }))
+     return LIP.first;
+diff --git a/llvm/lib/CodeGen/SplitKit.h b/llvm/lib/CodeGen/SplitKit.h
+index 3ab5f2585f3..71ecf90f418 100644
+--- a/llvm/lib/CodeGen/SplitKit.h
++++ b/llvm/lib/CodeGen/SplitKit.h
+@@ -54,7 +54,7 @@ private:
+   /// Last legal insert point in each basic block in the current function.
+   /// The first entry is the first terminator, the second entry is the
+   /// last valid point to insert a split or spill for a variable that is
+-  /// live into a landing pad or inlineasm_br successor.
++  /// live into a landing pad successor.
+   SmallVector<std::pair<SlotIndex, SlotIndex>, 8> LastInsertPoint;
+ 
+   SlotIndex computeLastInsertPoint(const LiveInterval &CurLI,
+diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp
+index bd554189f12..36b1809cb33 100644
+--- a/llvm/lib/CodeGen/TailDuplicator.cpp
++++ b/llvm/lib/CodeGen/TailDuplicator.cpp
+@@ -716,7 +716,7 @@ bool TailDuplicator::duplicateSimpleBB(
+                                             TailBB->pred_end());
+   bool Changed = false;
+   for (MachineBasicBlock *PredBB : Preds) {
+-    if (PredBB->hasEHPadSuccessor() || PredBB->mayHaveInlineAsmBr())
++    if (PredBB->hasEHPadSuccessor())
+       continue;
+ 
+     if (bothUsedInPHI(*PredBB, Succs))
+diff --git a/llvm/lib/CodeGen/TargetInstrInfo.cpp b/llvm/lib/CodeGen/TargetInstrInfo.cpp
+index 24f3f96d0b1..9dbd612c7f5 100644
+--- a/llvm/lib/CodeGen/TargetInstrInfo.cpp
++++ b/llvm/lib/CodeGen/TargetInstrInfo.cpp
+@@ -999,10 +999,6 @@ bool TargetInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
+   if (MI.isTerminator() || MI.isPosition())
+     return true;
+ 
+-  // INLINEASM_BR can jump to another block
+-  if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
+-    return true;
+-
+   // Don't attempt to schedule around any instruction that defines
+   // a stack-oriented pointer, as it's unlikely to be profitable. This
+   // saves compile time, because it doesn't require every single
+diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+index 9af8ffedce0..d6e90bb72a7 100644
+--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
++++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+@@ -2996,10 +2996,6 @@ bool SIInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
+   if (MI.isTerminator() || MI.isPosition())
+     return true;
+ 
+-  // INLINEASM_BR can jump to another block
+-  if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
+-    return true;
+-
+   // Target-independent instructions do not have an implicit-use of EXEC, even
+   // when they operate on VGPRs. Treating EXEC modifications as scheduling
+   // boundaries prevents incorrect movements of such instructions.
+diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+index 4cc2b6bf7e7..504d0cc4c08 100644
+--- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
++++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+@@ -2015,10 +2015,6 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
+   if (MI.isTerminator() || MI.isPosition())
+     return true;
+ 
+-  // INLINEASM_BR can jump to another block
+-  if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
+-    return true;
+-
+   // Treat the start of the IT block as a scheduling boundary, but schedule
+   // t2IT along with all instructions following it.
+   // FIXME: This is a big hammer. But the alternative is to add all potential
+diff --git a/llvm/lib/Target/Hexagon/BitTracker.cpp b/llvm/lib/Target/Hexagon/BitTracker.cpp
+index 7ef23ef35a7..8a07b991ff5 100644
+--- a/llvm/lib/Target/Hexagon/BitTracker.cpp
++++ b/llvm/lib/Target/Hexagon/BitTracker.cpp
+@@ -954,9 +954,6 @@ void BT::visitBranchesFrom(const MachineInstr &BI) {
+     ++It;
+   } while (FallsThrough && It != End);
+ 
+-  if (B.mayHaveInlineAsmBr())
+-    DefaultToAll = true;
+-
+   if (!DefaultToAll) {
+     // Need to add all CFG successors that lead to EH landing pads.
+     // There won't be explicit branches to these blocks, but they must
+diff --git a/llvm/lib/Target/Hexagon/HexagonConstPropagation.cpp b/llvm/lib/Target/Hexagon/HexagonConstPropagation.cpp
+index 77578378b05..5821e72227b 100644
+--- a/llvm/lib/Target/Hexagon/HexagonConstPropagation.cpp
++++ b/llvm/lib/Target/Hexagon/HexagonConstPropagation.cpp
+@@ -754,9 +754,6 @@ void MachineConstPropagator::visitBranchesFrom(const MachineInstr &BrI) {
+     ++It;
+   }
+ 
+-  if (B.mayHaveInlineAsmBr())
+-    EvalOk = false;
+-
+   if (EvalOk) {
+     // Need to add all CFG successors that lead to EH landing pads.
+     // There won't be explicit branches to these blocks, but they must
+@@ -813,12 +810,8 @@ void MachineConstPropagator::visitUsesOf(unsigned Reg) {
+ 
+ bool MachineConstPropagator::computeBlockSuccessors(const MachineBasicBlock *MB,
+       SetVector<const MachineBasicBlock*> &Targets) {
+-  Targets.clear();
+-
+   MachineBasicBlock::const_iterator FirstBr = MB->end();
+   for (const MachineInstr &MI : *MB) {
+-    if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
+-      return false;
+     if (MI.isDebugInstr())
+       continue;
+     if (MI.isBranch()) {
+@@ -827,6 +820,7 @@ bool MachineConstPropagator::computeBlockSuccessors(const MachineBasicBlock *MB,
+     }
+   }
+ 
++  Targets.clear();
+   MachineBasicBlock::const_iterator End = MB->end();
+ 
+   bool DoNext = true;
+diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp
+index d1cd23c3be3..64922d30c41 100644
+--- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp
++++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp
+@@ -1730,10 +1730,6 @@ bool HexagonInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
+   if (MI.getDesc().isTerminator() || MI.isPosition())
+     return true;
+ 
+-  // INLINEASM_BR can jump to another block
+-  if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
+-    return true;
+-
+   if (MI.isInlineAsm() && !ScheduleInlineAsm)
+     return true;
+ 
+diff --git a/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp b/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp
+index 50ae4450a83..109b665e0d5 100644
+--- a/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp
++++ b/llvm/lib/Target/PowerPC/PPCBranchCoalescing.cpp
+@@ -272,11 +272,6 @@ bool PPCBranchCoalescing::canCoalesceBranch(CoalescingCandidateInfo &Cand) {
+     return false;
+   }
+ 
+-  if (Cand.BranchBlock->mayHaveInlineAsmBr()) {
+-    LLVM_DEBUG(dbgs() << "Inline Asm Br - skip\n");
+-    return false;
+-  }
+-
+   // For now only consider triangles (i.e, BranchTargetBlock is set,
+   // FalseMBB is null, and BranchTargetBlock is a successor to BranchBlock)
+   if (!Cand.BranchTargetBlock || FalseMBB ||
+diff --git a/llvm/test/CodeGen/AArch64/callbr-asm-label.ll b/llvm/test/CodeGen/AArch64/callbr-asm-label.ll
+index 5a0656e48bb..1ff1464da8d 100644
+--- a/llvm/test/CodeGen/AArch64/callbr-asm-label.ll
++++ b/llvm/test/CodeGen/AArch64/callbr-asm-label.ll
+@@ -6,9 +6,9 @@ define i32 @test1() {
+ ; CHECK-LABEL: test1:
+ ; CHECK:         .word b
+ ; CHECK-NEXT:    .word .Ltmp0
+-; CHECK: // %bb.1:
+-; CHECK: .Ltmp0:
+-; CHECK: .LBB0_2: // %indirect
++; CHECK-LABEL: .LBB0_1: // %cleanup
++; CHECK-LABEL: .Ltmp0:
++; CHECK-LABEL: .LBB0_2: // %indirect
+ entry:
+   callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test1, %indirect))
+           to label %cleanup [label %indirect]
+@@ -32,7 +32,7 @@ entry:
+ if.then:
+ ; CHECK:       .word b
+ ; CHECK-NEXT:  .word .Ltmp2
+-; CHECK:       .Ltmp2:
++; CHECK-LABEL: .Ltmp2:
+ ; CHECK-NEXT:  .LBB1_3: // %if.end6
+   callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test2, %if.end6))
+           to label %if.then4 [label %if.end6]
+@@ -48,7 +48,7 @@ if.end6:
+   br i1 %phitmp, label %if.end10, label %if.then9
+ 
+ if.then9:
+-; CHECK: .Ltmp4:
++; CHECK-LABEL: .Ltmp4:
+ ; CHECK-NEXT:  .LBB1_5: // %l_yes
+   callbr void asm sideeffect "", "X"(i8* blockaddress(@test2, %l_yes))
+           to label %if.end10 [label %l_yes]
+diff --git a/llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll b/llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll
+index 2891143ce58..91ea4edf489 100644
+--- a/llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll
++++ b/llvm/test/CodeGen/AArch64/callbr-asm-obj-file.ll
+@@ -9,8 +9,9 @@
+ ; CHECK-LABEL: <test1>:
+ ; CHECK-LABEL: <$d.1>:
+ ; CHECK-LABEL: <$x.2>:
+-; CHECK-NEXT:    b 0x2c <$x.4>
++; CHECK-NEXT:    b 0x30 <$x.4+0x4>
+ ; CHECK-LABEL: <$x.4>:
++; CHECK-NEXT:    b 0x30 <$x.4+0x4>
+ ; CHECK-NEXT:    mov w0, wzr
+ ; CHECK-NEXT:    ldr x30, [sp], #16
+ ; CHECK-NEXT:    ret
+@@ -74,6 +75,7 @@ define hidden i32 @test2() local_unnamed_addr {
+ ; CHECK-LABEL: <$x.10>:
+ ; CHECK-NEXT:    b {{.*}} <test3+0x18>
+ ; CHECK-LABEL: <$x.12>:
++; CHECK-NEXT:    b {{.*}} <$x.12+0x4>
+ ; CHECK-NEXT:    mov w0, wzr
+ ; CHECK-NEXT:    ldr x30, [sp], #16
+ ; CHECK-NEXT:    ret
+diff --git a/llvm/test/CodeGen/ARM/ifcvt-diamond-unanalyzable-common.mir b/llvm/test/CodeGen/ARM/ifcvt-diamond-unanalyzable-common.mir
+index a69e70e2a6a..227544961b2 100644
+--- a/llvm/test/CodeGen/ARM/ifcvt-diamond-unanalyzable-common.mir
++++ b/llvm/test/CodeGen/ARM/ifcvt-diamond-unanalyzable-common.mir
+@@ -1,7 +1,6 @@
+ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+ # RUN: llc %s -o - -run-pass=if-converter -verify-machineinstrs | FileCheck %s
+-# Make sure we correctly if-convert blocks containing an unanalyzable branch sequence.
+-# (In this case, multiple conditional branches)
++# Make sure we correctly if-convert blocks containing an INLINEASM_BR.
+ 
+ --- |
+   target triple = "thumbv7-unknown-linux-gnueabi"
+@@ -27,12 +26,10 @@ body:             |
+   ; CHECK:   $r0 = t2MOVi 2, 1 /* CC::ne */, $cpsr, $noreg
+   ; CHECK:   $r0 = t2MOVi 3, 0 /* CC::eq */, killed $cpsr, $noreg, implicit killed $r0
+   ; CHECK:   tBL 14 /* CC::al */, $noreg, @fn2, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit killed $r1, implicit-def $sp, implicit-def dead $r0
+-  ; CHECK:   t2CMPri $sp, 34, 14 /* CC::al */, $noreg, implicit-def $cpsr
+-  ; CHECK:   t2Bcc %bb.2, 1 /* CC::ne */, $cpsr
+-  ; CHECK:   t2Bcc %bb.2, 2 /* CC::hs */, killed $cpsr
++  ; CHECK:   INLINEASM_BR &"", 9 /* sideeffect mayload attdialect */, 13 /* imm */, 0, 13 /* imm */, blockaddress(@fn1, %ir-block.l_yes)
+   ; CHECK:   t2B %bb.1, 14 /* CC::al */, $noreg
+   ; CHECK: bb.1:
+-  ; CHECK:   INLINEASM &"", 1
++  ; CHECK:   INLINEASM &"", 1 /* sideeffect attdialect */
+   ; CHECK:   $sp = t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r4, def $pc
+   ; CHECK: bb.2.l_yes (address-taken):
+   ; CHECK:   $sp = t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r4, def $pc
+@@ -50,9 +47,7 @@ body:             |
+ 
+     $r0 = t2MOVi 3, 14, $noreg, $noreg
+     tBL 14, $noreg, @fn2, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit $r0, implicit $r1, implicit-def $sp, implicit-def dead $r0
+-    t2CMPri $sp, 34, 14, $noreg, implicit-def $cpsr
+-    t2Bcc %bb.4, 1, $cpsr
+-    t2Bcc %bb.4, 2, killed $cpsr
++    INLINEASM_BR &"", 9, 13, 0, 13, blockaddress(@fn1, %ir-block.l_yes)
+     t2B %bb.3, 14, $noreg
+ 
+   bb.2:
+@@ -61,9 +56,7 @@ body:             |
+ 
+     $r0 = t2MOVi 2, 14, $noreg, $noreg
+     tBL 14, $noreg, @fn2, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit $r0, implicit $r1, implicit-def $sp, implicit-def dead $r0
+-    t2CMPri $sp, 34, 14, $noreg, implicit-def $cpsr
+-    t2Bcc %bb.4, 1, $cpsr
+-    t2Bcc %bb.4, 2, killed $cpsr
++    INLINEASM_BR &"", 9, 13, 0, 13, blockaddress(@fn1, %ir-block.l_yes)
+     t2B %bb.3, 14, $noreg
+ 
+   bb.3:
+diff --git a/llvm/test/CodeGen/ARM/ifcvt-size.mir b/llvm/test/CodeGen/ARM/ifcvt-size.mir
+index 9730b654156..28391ba8079 100644
+--- a/llvm/test/CodeGen/ARM/ifcvt-size.mir
++++ b/llvm/test/CodeGen/ARM/ifcvt-size.mir
+@@ -525,34 +525,32 @@ tracksRegLiveness: true
+ # CHECK-NEXT: INLINEASM_BR
+ 
+ # DEBUG-LABEL: Ifcvt: function ({{[0-9]+}}) 'fn9'
+-# DEBUG: MeetIfcvtSizeLimit(BranchBytes=2, CommonBytes=8, NumPredicatedInstructions=4, ExtraPredicateBytes=2)
++# DEBUG: MeetIfcvtSizeLimit(BranchBytes=2, CommonBytes=6, NumPredicatedInstructions=4, ExtraPredicateBytes=2)
+ 
+ body:             |
+   bb.0.entry:
+     successors: %bb.1(0x30000000), %bb.3(0x50000000)
+     liveins: $r0, $r1, $r2
+ 
+-    tCMPi8 renamable $r2, 42, 14, $noreg, implicit-def $cpsr
++    tCMPi8 killed renamable $r2, 42, 14, $noreg, implicit-def $cpsr
+     t2Bcc %bb.3, 1, killed $cpsr
+ 
+   bb.1.if.then:
+     successors:  %bb.5(0x7fffffff)
+-    liveins: $r0, $r2
++    liveins: $r0
+ 
+     renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg
+     INLINEASM_BR &"b ${0:l}", 1, 13, blockaddress(@fn9, %ir-block.lab1)
+-    tBX_RET 14, $noreg, implicit $r2
+ 
+   bb.3.if.else:
+     successors: %bb.5(0x7fffffff)
+-    liveins: $r1, $r2
++    liveins: $r1
+ 
+     renamable $r0 = tLDRi killed renamable $r1, 0, 14, $noreg
+     renamable $r0 = tLDRi killed renamable $r0, 0, 14, $noreg
+     renamable $r0 = t2LDRSHi12 killed renamable $r0, 0, 14, $noreg
+     INLINEASM_BR &"b ${0:l}", 1, 13, blockaddress(@fn9, %ir-block.lab1)
+-    tBX_RET 14, $noreg, implicit $r2
+-    
++
+   bb.5.lab1 (address-taken):
+     liveins: $r0
+ 
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-blockplacement.ll b/llvm/test/CodeGen/X86/callbr-asm-blockplacement.ll
+index fb658e32d7d..d0af12fa20e 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm-blockplacement.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm-blockplacement.ll
+@@ -48,7 +48,7 @@ define i32 @foo(i32 %arg, i32 (i8*)* %arg3) nounwind {
+ ; CHECK-NEXT:    movabsq $-2305847407260205056, %rbx # imm = 0xDFFFFC0000000000
+ ; CHECK-NEXT:    #APP
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.4: # %bb17
++; CHECK-NEXT:  .LBB0_4: # %bb17
+ ; CHECK-NEXT:    callq widget
+ ; CHECK-NEXT:  .Ltmp0: # Block address taken
+ ; CHECK-NEXT:  .LBB0_5: # %bb18
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-branch-folding.ll b/llvm/test/CodeGen/X86/callbr-asm-branch-folding.ll
+index c978ac3ced2..4842e282e3a 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm-branch-folding.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm-branch-folding.ll
+@@ -58,7 +58,7 @@ define void @n(i32* %o, i32 %p, i32 %u) nounwind {
+ ; CHECK-NEXT:    #NO_APP
+ ; CHECK-NEXT:    jmp .LBB0_10
+ ; CHECK-NEXT:  .Ltmp0: # Block address taken
+-; CHECK-NEXT:  # %bb.8: # %if.then20.critedge
++; CHECK-NEXT:  .LBB0_8: # %if.then20.critedge
+ ; CHECK-NEXT:    movl {{.*}}(%rip), %edi
+ ; CHECK-NEXT:    movslq %eax, %rcx
+ ; CHECK-NEXT:    movl $1, %esi
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-instr-scheduling.ll b/llvm/test/CodeGen/X86/callbr-asm-instr-scheduling.ll
+deleted file mode 100644
+index 4074991bab8..00000000000
+--- a/llvm/test/CodeGen/X86/callbr-asm-instr-scheduling.ll
++++ /dev/null
+@@ -1,85 +0,0 @@
+-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs -mcpu=znver2 -O2 -frame-pointer=none < %s | FileCheck %s
+-
+-; Make sure that instructions aren't scheduled after the "callbr". In the
+-; example below, we don't want the "shrxq" through "leaq" instructions to be
+-; moved after the "callbr".
+-
+-%struct.cpuinfo_x86 = type { i8, i8, i8, i8, i32, [3 x i32], i8, i8, i8, i8, i32, i32, %union.anon.83, [16 x i8], [64 x i8], i32, i32, i32, i32, i32, i32, i64, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i32, i8, i8 }
+-%union.anon.83 = type { i64, [72 x i8] }
+-%struct.pgd_t = type { i64 }
+-%struct.p4d_t = type { i64 }
+-%struct.pud_t = type { i64 }
+-
+-@boot_cpu_data = external dso_local global %struct.cpuinfo_x86, align 8
+-@page_offset_base = external dso_local local_unnamed_addr global i64, align 8
+-@pgdir_shift = external dso_local local_unnamed_addr global i32, align 4
+-@__force_order = external dso_local global i64, align 8
+-@ptrs_per_p4d = external dso_local local_unnamed_addr global i32, align 4
+-
+-define i64 @early_ioremap_pmd(i64 %addr) {
+-; CHECK-LABEL: early_ioremap_pmd:
+-; CHECK:       # %bb.0: # %entry
+-; CHECK-NEXT:    #APP
+-; CHECK-NEXT:    movq %cr3, %rax
+-; CHECK-EMPTY:
+-; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:    movabsq $9223372036854771712, %rdx # imm = 0x7FFFFFFFFFFFF000
+-; CHECK-NEXT:    andq %rax, %rdx
+-; CHECK-NEXT:    movb {{.*}}(%rip), %al
+-; CHECK-NEXT:    movq {{.*}}(%rip), %rcx
+-; CHECK-NEXT:    shrxq %rax, %rdi, %rax
+-; CHECK-NEXT:    addq %rcx, %rdx
+-; CHECK-NEXT:    andl $511, %eax # imm = 0x1FF
+-; CHECK-NEXT:    leaq (%rdx,%rax,8), %rax
+-; CHECK-NEXT:    #APP
+-; CHECK-NEXT:  .Ltmp2:
+-; CHECK-NEXT:    jmp .Ltmp3
+-; CHECK-NEXT:  .Ltmp4:
+-; CHECK-NEXT:    .zero (-(((.Ltmp5-.Ltmp6)-(.Ltmp4-.Ltmp2))>0))*((.Ltmp5-.Ltmp6)-(.Ltmp4-.Ltmp2)),144
+-; CHECK-NEXT:  .Ltmp7:
+-entry:
+-  %0 = tail call i64 asm sideeffect "mov %cr3,$0\0A\09", "=r,=*m,~{dirflag},~{fpsr},~{flags}"(i64* nonnull @__force_order)
+-  %and.i = and i64 %0, 9223372036854771712
+-  %1 = load i64, i64* @page_offset_base, align 8
+-  %add = add i64 %and.i, %1
+-  %2 = inttoptr i64 %add to %struct.pgd_t*
+-  %3 = load i32, i32* @pgdir_shift, align 4
+-  %sh_prom = zext i32 %3 to i64
+-  %shr = lshr i64 %addr, %sh_prom
+-  %and = and i64 %shr, 511
+-  %arrayidx = getelementptr %struct.pgd_t, %struct.pgd_t* %2, i64 %and
+-  callbr void asm sideeffect "1: jmp 6f\0A2:\0A.skip -(((5f-4f) - (2b-1b)) > 0) * ((5f-4f) - (2b-1b)),0x90\0A3:\0A.section .altinstructions,\22a\22\0A .long 1b - .\0A .long 4f - .\0A .word ${1:P}\0A .byte 3b - 1b\0A .byte 5f - 4f\0A .byte 3b - 2b\0A.previous\0A.section .altinstr_replacement,\22ax\22\0A4: jmp ${5:l}\0A5:\0A.previous\0A.section .altinstructions,\22a\22\0A .long 1b - .\0A .long 0\0A .word ${0:P}\0A .byte 3b - 1b\0A .byte 0\0A .byte 0\0A.previous\0A.section .altinstr_aux,\22ax\22\0A6:\0A testb $2,$3\0A jnz ${4:l}\0A jmp ${5:l}\0A.previous\0A", "i,i,i,*m,X,X,~{dirflag},~{fpsr},~{flags}"(i16 528, i32 117, i32 1, i8* getelementptr inbounds (%struct.cpuinfo_x86, %struct.cpuinfo_x86* @boot_cpu_data, i64 0, i32 12, i32 1, i64 58), i8* blockaddress(@early_ioremap_pmd, %if.end.i), i8* blockaddress(@early_ioremap_pmd, %if.then.i))
+-          to label %_static_cpu_has.exit.thread.i [label %if.end.i, label %if.then.i]
+-
+-_static_cpu_has.exit.thread.i:                    ; preds = %entry
+-  br label %if.end.i
+-
+-if.then.i:                                        ; preds = %entry
+-  %4 = bitcast %struct.pgd_t* %arrayidx to %struct.p4d_t*
+-  br label %p4d_offset.exit
+-
+-if.end.i:                                         ; preds = %_static_cpu_has.exit.thread.i, %entry
+-  %coerce.dive.i = getelementptr inbounds %struct.pgd_t, %struct.pgd_t* %arrayidx, i64 0, i32 0
+-  %5 = load i64, i64* %coerce.dive.i, align 8
+-  %6 = inttoptr i64 %5 to %struct.p4d_t*
+-  %7 = load i32, i32* @ptrs_per_p4d, align 4
+-  %sub.i.i = add i32 %7, 33554431
+-  %8 = and i32 %sub.i.i, 33554431
+-  %and.i1.i = zext i32 %8 to i64
+-  %add.ptr.i = getelementptr %struct.p4d_t, %struct.p4d_t* %6, i64 %and.i1.i
+-  br label %p4d_offset.exit
+-
+-p4d_offset.exit:                                  ; preds = %if.end.i, %if.then.i
+-  %retval.0.i = phi %struct.p4d_t* [ %add.ptr.i, %if.end.i ], [ %4, %if.then.i ]
+-  %coerce.dive.i12 = getelementptr inbounds %struct.p4d_t, %struct.p4d_t* %retval.0.i, i64 0, i32 0
+-  %9 = load i64, i64* %coerce.dive.i12, align 8
+-  %and.i.i13 = and i64 %9, 4503599627366400
+-  %add.i.i14 = add i64 %and.i.i13, %1
+-  %10 = inttoptr i64 %add.i.i14 to %struct.pud_t*
+-  %coerce.dive.i16 = getelementptr %struct.pud_t, %struct.pud_t* %10, i64 511, i32 0
+-  %11 = load i64, i64* %coerce.dive.i16, align 8
+-  %tobool.i.i.i = icmp slt i64 %11, 0
+-  %..i.i.i = select i1 %tobool.i.i.i, i64 4503598553628672, i64 4503599627366400
+-  ret i64 %..i.i.i
+-}
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-label-addr.ll b/llvm/test/CodeGen/X86/callbr-asm-label-addr.ll
+index 70d32359a60..dc0e8363465 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm-label-addr.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm-label-addr.ll
+@@ -4,10 +4,10 @@ define i32 @test1(i32 %x) {
+ ; CHECK-LABEL: test1:
+ ; CHECK:         .quad .Ltmp0
+ ; CHECK-NEXT:    .quad .Ltmp1
+-; CHECK: .Ltmp1:
+-; CHECK-NEXT: # %bb.1: # %bar
++; CHECK-LABEL: .Ltmp1:
++; CHECK-LABEL: .LBB0_1: # %bar
+ ; CHECK-NEXT:    callq foo
+-; CHECK-NEXT: .Ltmp0:
++; CHECK-LABEL: .Ltmp0:
+ ; CHECK-NEXT:  # %bb.2: # %baz
+ entry:
+   callbr void asm sideeffect ".quad ${0:l}\0A\09.quad ${1:l}", "i,X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test1, %baz), i8* blockaddress(@test1, %bar))
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-outputs-pred-succ.ll b/llvm/test/CodeGen/X86/callbr-asm-outputs-pred-succ.ll
+index 56b376ac2f1..b35aa98e8d8 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm-outputs-pred-succ.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm-outputs-pred-succ.ll
+@@ -4,16 +4,28 @@
+ ; RUN: llc -stop-after=finalize-isel -print-after=finalize-isel -mtriple=i686-- < %s 2>&1 | FileCheck %s
+ 
+ ; The block containting the INLINEASM_BR should have a fallthrough and its
+-; indirect targets as its successors. Fallthrough should have 100% branch weight,
++; indirect targets as its successors. The fallthrough is a block we synthesized
++; in InstrEmitter::EmitMachineNode. Fallthrough should have 100% branch weight,
+ ; while the indirect targets have 0%.
+ ; CHECK: bb.0 (%ir-block.2):
+-; CHECK-NEXT: successors: %bb.1(0x80000000), %bb.4(0x00000000); %bb.1(100.00%), %bb.4(0.00%)
++; CHECK-NEXT: successors: %bb.4(0x00000000), %bb.6(0x80000000); %bb.4(0.00%), %bb.6(100.00%)
+ 
+-; The fallthrough is a block containing a second INLINEASM_BR. Check it has two successors,
+-; and the the probability for fallthrough is 100%.
+-; CHECK: bb.1 (%ir-block.4):
++; The fallthrough block is predaccessed by the block containing INLINEASM_BR,
++; and succeeded by the INLINEASM_BR's original fallthrough block pre-splitting.
++; CHECK: bb.6 (%ir-block.2):
+ ; CHECK-NEXT: predecessors: %bb.0
+-; CHECK-NEXT: successors: %bb.3(0x80000000), %bb.2(0x00000000); %bb.3(100.00%), %bb.2(0.00%)
++; CHECK-NEXT: successors: %bb.1(0x80000000); %bb.1(100.00%)
++
++; Another block containing a second INLINEASM_BR. Check it has two successors,
++; and the the probability for fallthrough is 100%. Predecessor check irrelevant.
++; CHECK: bb.1 (%ir-block.4):
++; CHECK: successors: %bb.2(0x00000000), %bb.7(0x80000000); %bb.2(0.00%), %bb.7(100.00%)
++
++; Check the synthesized fallthrough block for the second INLINEASM_BR is
++; preceded correctly, and has the original successor pre-splitting.
++; CHECK: bb.7 (%ir-block.4):
++; CHECK-NEXT: predecessors: %bb.1
++; CHECK-NEXT: successors: %bb.3(0x80000000); %bb.3(100.00%)
+ 
+ ; Check the second INLINEASM_BR target block is preceded by the block with the
+ ; second INLINEASM_BR.
+diff --git a/llvm/test/CodeGen/X86/callbr-asm-outputs.ll b/llvm/test/CodeGen/X86/callbr-asm-outputs.ll
+index a4447bc15f1..8718363f3fd 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm-outputs.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm-outputs.ll
+@@ -12,7 +12,7 @@ define i32 @test1(i32 %x) {
+ ; CHECK-NEXT:    xorl %eax, %eax
+ ; CHECK-NEXT:    jmp .Ltmp0
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.1: # %normal
++; CHECK-NEXT:  .LBB0_1: # %normal
+ ; CHECK-NEXT:    retl
+ ; CHECK-NEXT:  .Ltmp0: # Block address taken
+ ; CHECK-NEXT:  .LBB0_2: # %abnormal
+@@ -43,35 +43,36 @@ define i32 @test2(i32 %out1, i32 %out2) {
+ ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi
+ ; CHECK-NEXT:    movl $-1, %eax
+ ; CHECK-NEXT:    cmpl %edi, %esi
+-; CHECK-NEXT:    jge .LBB1_2
++; CHECK-NEXT:    jge .LBB1_3
+ ; CHECK-NEXT:  # %bb.1: # %if.then
+ ; CHECK-NEXT:    #APP
+ ; CHECK-NEXT:    testl %esi, %esi
+ ; CHECK-NEXT:    testl %edi, %esi
+ ; CHECK-NEXT:    jne .Ltmp1
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:    jmp .LBB1_3
+-; CHECK-NEXT:  .LBB1_2: # %if.else
+-; CHECK-NEXT:    #APP
+-; CHECK-NEXT:    testl %esi, %edi
+-; CHECK-NEXT:    testl %esi, %edi
+-; CHECK-NEXT:    jne .Ltmp2
+-; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  .LBB1_3:
+-; CHECK-NEXT:    movl %esi, %eax
+-; CHECK-NEXT:    addl %edi, %eax
++; CHECK-NEXT:  .LBB1_2: # %if.then
++; CHECK-NEXT:    movl %edi, %eax
++; CHECK-NEXT:    addl %esi, %eax
+ ; CHECK-NEXT:  .Ltmp2: # Block address taken
+-; CHECK-NEXT:  .LBB1_5: # %return
++; CHECK-NEXT:  .LBB1_6: # %return
+ ; CHECK-NEXT:    popl %esi
+ ; CHECK-NEXT:    .cfi_def_cfa_offset 8
+ ; CHECK-NEXT:    popl %edi
+ ; CHECK-NEXT:    .cfi_def_cfa_offset 4
+ ; CHECK-NEXT:    retl
+-; CHECK-NEXT:  .Ltmp1: # Block address taken
+-; CHECK-NEXT:  .LBB1_4: # %label_true
++; CHECK-NEXT:  .LBB1_3: # %if.else
+ ; CHECK-NEXT:    .cfi_def_cfa_offset 12
++; CHECK-NEXT:    #APP
++; CHECK-NEXT:    testl %esi, %edi
++; CHECK-NEXT:    testl %esi, %edi
++; CHECK-NEXT:    jne .Ltmp2
++; CHECK-NEXT:    #NO_APP
++; CHECK-NEXT:  .LBB1_4: # %if.else
++; CHECK-NEXT:    jmp .LBB1_2
++; CHECK-NEXT:  .Ltmp1: # Block address taken
++; CHECK-NEXT:  .LBB1_5: # %label_true
+ ; CHECK-NEXT:    movl $-2, %eax
+-; CHECK-NEXT:    jmp .LBB1_5
++; CHECK-NEXT:    jmp .LBB1_6
+ entry:
+   %cmp = icmp slt i32 %out1, %out2
+   br i1 %cmp, label %if.then, label %if.else
+@@ -115,7 +116,7 @@ define i32 @test3(i1 %cmp) {
+ ; CHECK-NEXT:    .short %esi
+ ; CHECK-NEXT:    .short %edi
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.2:
++; CHECK-NEXT:  .LBB2_2: # %true
+ ; CHECK-NEXT:    movl %edi, %eax
+ ; CHECK-NEXT:    jmp .LBB2_5
+ ; CHECK-NEXT:  .LBB2_3: # %false
+@@ -123,7 +124,7 @@ define i32 @test3(i1 %cmp) {
+ ; CHECK-NEXT:    .short %eax
+ ; CHECK-NEXT:    .short %edx
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.4:
++; CHECK-NEXT:  .LBB2_4: # %false
+ ; CHECK-NEXT:    movl %edx, %eax
+ ; CHECK-NEXT:  .LBB2_5: # %asm.fallthrough
+ ; CHECK-NEXT:    popl %esi
+@@ -165,13 +166,13 @@ define i32 @test4(i32 %out1, i32 %out2) {
+ ; CHECK-NEXT:    testl %edx, %ecx
+ ; CHECK-NEXT:    jne .Ltmp4
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.1: # %asm.fallthrough
++; CHECK-NEXT:  .LBB3_1: # %asm.fallthrough
+ ; CHECK-NEXT:    #APP
+ ; CHECK-NEXT:    testl %ecx, %edx
+ ; CHECK-NEXT:    testl %ecx, %edx
+ ; CHECK-NEXT:    jne .Ltmp5
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.2: # %asm.fallthrough2
++; CHECK-NEXT:  .LBB3_2: # %asm.fallthrough
+ ; CHECK-NEXT:    addl %edx, %ecx
+ ; CHECK-NEXT:    movl %ecx, %eax
+ ; CHECK-NEXT:    retl
+diff --git a/llvm/test/CodeGen/X86/callbr-asm.ll b/llvm/test/CodeGen/X86/callbr-asm.ll
+index 1df69b6d8db..df7bf3a02be 100644
+--- a/llvm/test/CodeGen/X86/callbr-asm.ll
++++ b/llvm/test/CodeGen/X86/callbr-asm.ll
+@@ -14,7 +14,7 @@ define i32 @test1(i32 %a) {
+ ; CHECK-NEXT:    xorl %eax, %eax
+ ; CHECK-NEXT:    jmp .Ltmp0
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.1: # %normal
++; CHECK-NEXT:  .LBB0_1: # %normal
+ ; CHECK-NEXT:    xorl %eax, %eax
+ ; CHECK-NEXT:    retl
+ ; CHECK-NEXT:  .Ltmp0: # Block address taken
+@@ -89,7 +89,7 @@ define i32 @test3(i32 %a) {
+ ; CHECK-NEXT:    jmp .Ltmp2
+ ; CHECK-NEXT:    jmp .Ltmp3
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.5: # %normal0
++; CHECK-NEXT:  .LBB2_5: # %normal0
+ ; CHECK-NEXT:    # in Loop: Header=BB2_4 Depth=4
+ ; CHECK-NEXT:    #APP
+ ; CHECK-NEXT:    jmp .Ltmp1
+@@ -97,7 +97,7 @@ define i32 @test3(i32 %a) {
+ ; CHECK-NEXT:    jmp .Ltmp3
+ ; CHECK-NEXT:    jmp .Ltmp4
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.6: # %normal1
++; CHECK-NEXT:  .LBB2_6: # %normal1
+ ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
+ ; CHECK-NEXT:    retl
+ entry:
+@@ -135,11 +135,11 @@ define void @test4() {
+ ; CHECK-LABEL: test4:
+ ; CHECK:       # %bb.0: # %entry
+ ; CHECK-NEXT:    #APP
+-; CHECK-NEXT:    ja .Ltmp5
++; CHECK-NEXT:    ja .Ltmp5{{$}}
+ ; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.1: # %asm.fallthrough
++; CHECK-NEXT:  .LBB3_1: # %asm.fallthrough
+ ; CHECK-NEXT:    #APP
+-; CHECK-NEXT:    ja .Ltmp5
++; CHECK-NEXT:    ja .Ltmp5{{$}}
+ ; CHECK-NEXT:    #NO_APP
+ ; CHECK-NEXT:  .Ltmp5: # Block address taken
+ ; CHECK-NEXT:  .LBB3_3: # %quux
+diff --git a/llvm/test/CodeGen/X86/shrinkwrap-callbr.ll b/llvm/test/CodeGen/X86/shrinkwrap-callbr.ll
+deleted file mode 100644
+index ced7fdbf262..00000000000
+--- a/llvm/test/CodeGen/X86/shrinkwrap-callbr.ll
++++ /dev/null
+@@ -1,61 +0,0 @@
+-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+-; RUN: llc < %s -enable-shrink-wrap=true | FileCheck %s
+-
+-;; Ensure that shrink-wrapping understands that INLINEASM_BR may exit
+-;; the block before the end, and you cannot simply place stack
+-;; adjustment at the end of that block.
+-target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+-target triple = "x86_64-unknown-linux-gnu"
+-
+-declare i32 @fn()
+-
+-; Function Attrs: uwtable
+-define i32 @test1(i32 %v) {
+-; CHECK-LABEL: test1:
+-; CHECK:       # %bb.0: # %entry
+-; CHECK-NEXT:    pushq %rax
+-; CHECK-NEXT:    .cfi_def_cfa_offset 16
+-; CHECK-NEXT:    testl %edi, %edi
+-; CHECK-NEXT:    je .LBB0_3
+-; CHECK-NEXT:  # %bb.1: # %if.end
+-; CHECK-NEXT:    callq fn
+-; CHECK-NEXT:    #APP
+-; CHECK-NEXT:    # jump to .Ltmp0
+-; CHECK-NEXT:    #NO_APP
+-; CHECK-NEXT:  # %bb.2: # %return
+-; CHECK-NEXT:    movl $4, %eax
+-; CHECK-NEXT:    popq %rcx
+-; CHECK-NEXT:    .cfi_def_cfa_offset 8
+-; CHECK-NEXT:    retq
+-; CHECK-NEXT:  .LBB0_3: # %ret0
+-; CHECK-NEXT:    .cfi_def_cfa_offset 16
+-; CHECK-NEXT:    xorl %eax, %eax
+-; CHECK-NEXT:    popq %rcx
+-; CHECK-NEXT:    .cfi_def_cfa_offset 8
+-; CHECK-NEXT:    retq
+-; CHECK-NEXT:  .Ltmp0: # Block address taken
+-; CHECK-NEXT:  .LBB0_4: # %two
+-; CHECK-NEXT:    .cfi_def_cfa_offset 16
+-; CHECK-NEXT:    popq %rax
+-; CHECK-NEXT:    .cfi_def_cfa_offset 8
+-; CHECK-NEXT:    jmp fn # TAILCALL
+-entry:
+-  %tobool = icmp eq i32 %v, 0
+-  br i1 %tobool, label %ret0, label %if.end
+-
+-ret0:
+-  ret i32 0
+-
+-if.end:
+-  %call = tail call i32 @fn()
+-  callbr void asm sideeffect "# jump to $0", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test1, %two))
+-          to label %return [label %two]
+-
+-two:
+-  %call1 = tail call i32 @fn()
+-  br label %return
+-
+-return:
+-  %retval.1 = phi i32 [ %call1, %two ], [ 4, %if.end ]
+-  ret i32 %retval.1
+-}
+diff --git a/llvm/test/Verifier/callbr.ll b/llvm/test/Verifier/callbr.ll
+index 6bd0b3ceb25..403cc573d0d 100644
+--- a/llvm/test/Verifier/callbr.ll
++++ b/llvm/test/Verifier/callbr.ll
+@@ -1,11 +1,10 @@
+ ; RUN: not opt -S %s -verify 2>&1 | FileCheck %s
+ 
+ ; CHECK: Indirect label missing from arglist.
+-; CHECK-NEXT: #test1
+-define void @test1() {
++define void @foo() {
+   ; The %4 in the indirect label list is not found in the blockaddresses in the
+   ; arg list (bad).
+-  callbr void asm sideeffect "#test1", "X,X"(i8* blockaddress(@test1, %3), i8* blockaddress(@test1, %2))
++  callbr void asm sideeffect "${0:l} {1:l}", "X,X"(i8* blockaddress(@foo, %3), i8* blockaddress(@foo, %2))
+   to label %1 [label %4, label %2]
+ 1:
+   ret void
+@@ -18,9 +17,9 @@ define void @test1() {
+ }
+ 
+ ; CHECK-NOT: Indirect label missing from arglist.
+-define void @test2() {
++define void @bar() {
+   ; %4 and %2 are both in the indirect label list and the arg list (good).
+-  callbr void asm sideeffect "${0:l} ${1:l}", "X,X"(i8* blockaddress(@test2, %4), i8* blockaddress(@test2, %2))
++  callbr void asm sideeffect "${0:l} ${1:l}", "X,X"(i8* blockaddress(@bar, %4), i8* blockaddress(@bar, %2))
+   to label %1 [label %4, label %2]
+ 1:
+   ret void
+@@ -33,12 +32,12 @@ define void @test2() {
+ }
+ 
+ ; CHECK-NOT: Indirect label missing from arglist.
+-define void @test3() {
++define void @baz() {
+   ; note %2 blockaddress. Such a case is possible when passing the address of
+   ; a label as an input to the inline asm (both address of label and asm goto
+   ; use blockaddress constants; we're testing that the indirect label list from
+   ; the asm goto is in the arg list to the asm).
+-  callbr void asm sideeffect "${0:l} ${1:l} ${2:l}", "X,X,X"(i8* blockaddress(@test3, %4), i8* blockaddress(@test3, %2), i8* blockaddress(@test3, %3))
++  callbr void asm sideeffect "${0:l} ${1:l} ${2:l}", "X,X,X"(i8* blockaddress(@baz, %4), i8* blockaddress(@baz, %2), i8* blockaddress(@baz, %3))
+   to label %1 [label %3, label %4]
+ 1:
+   ret void
+@@ -49,28 +48,3 @@ define void @test3() {
+ 4:
+   ret void
+ }
+-
+-;; Ensure you cannot use the return value of a callbr in indirect targets.
+-; CHECK: Instruction does not dominate all uses!
+-; CHECK-NEXT: #test4
+-define i32 @test4(i1 %var) {
+-entry:
+-  %ret = callbr i32 asm sideeffect "#test4", "=r,X"(i8* blockaddress(@test4, %abnormal)) to label %normal [label %abnormal]
+-
+-normal:
+-  ret i32 0
+-
+-abnormal:
+-  ret i32 %ret
+-}
+-
+-;; Ensure you cannot specify the same label as both normal and indirect targets.
+-; CHECK: Duplicate callbr destination!
+-; CHECK-NEXT: #test5
+-define i32 @test5() {
+-entry:
+-  %ret = callbr i32 asm sideeffect "#test5", "=r,X"(i8* blockaddress(@test5, %both)) to label %both [label %both]
+-
+-both:
+-  ret i32 0
+-}
diff --git a/sys-devel/llvm/files/compiler_wrapper/README b/sys-devel/llvm/files/compiler_wrapper/README
index 8bfacd2..b9e0a53 100644
--- a/sys-devel/llvm/files/compiler_wrapper/README
+++ b/sys-devel/llvm/files/compiler_wrapper/README
@@ -15,4 +15,4 @@
 - modify third_party/toolchain_utils/compiler_wrapper
 - run third_party/toolchain_utils/compiler_wrapper/bundle.py --output_dir=...
 
-Source: https://chromium-review.googlesource.com/q/I7b4ca0213a28bde81ad83e9aab1ae8bf1dc5925e
+Source: https://chromium-review.googlesource.com/q/If91df0d35ac3db926067d3e0c5e213f6c5e3f390
diff --git a/sys-devel/llvm/files/compiler_wrapper/VERSION b/sys-devel/llvm/files/compiler_wrapper/VERSION
index 739141e1..73f2a67 100644
--- a/sys-devel/llvm/files/compiler_wrapper/VERSION
+++ b/sys-devel/llvm/files/compiler_wrapper/VERSION
@@ -1 +1 @@
-I7b4ca0213a28bde81ad83e9aab1ae8bf1dc5925e
\ No newline at end of file
+If91df0d35ac3db926067d3e0c5e213f6c5e3f390
\ No newline at end of file
diff --git a/sys-devel/llvm/files/compiler_wrapper/clang_flags.go b/sys-devel/llvm/files/compiler_wrapper/clang_flags.go
index 1f0e223..9eb951d 100644
--- a/sys-devel/llvm/files/compiler_wrapper/clang_flags.go
+++ b/sys-devel/llvm/files/compiler_wrapper/clang_flags.go
@@ -47,15 +47,7 @@
 	// Use of -Qunused-arguments allows this set to be small, just those
 	// that clang still warns about.
 	unsupported := map[string]bool{
-		"-mno-movbe":                  true,
-		"-pass-exit-codes":            true,
-		"-Wclobbered":                 true,
-		"-Wno-psabi":                  true,
-		"-Wlogical-op":                true,
-		"-Wmissing-parameter-type":    true,
-		"-Wold-style-declaration":     true,
-		"-Woverride-init":             true,
-		"-Wunsafe-loop-optimizations": true,
+		"-pass-exit-codes": true,
 	}
 
 	unsupportedPrefixes := []string{"-Wstrict-aliasing=", "-finline-limit="}
diff --git a/sys-devel/llvm/files/compiler_wrapper/clang_tidy_flag.go b/sys-devel/llvm/files/compiler_wrapper/clang_tidy_flag.go
index edbbb41..01387fd 100644
--- a/sys-devel/llvm/files/compiler_wrapper/clang_tidy_flag.go
+++ b/sys-devel/llvm/files/compiler_wrapper/clang_tidy_flag.go
@@ -9,22 +9,35 @@
 	"fmt"
 	"io/ioutil"
 	"os"
+	"path"
 	"path/filepath"
 	"strings"
 )
 
 type useTidyMode int
 
+const clangTidyCrashSubstring = "PLEASE submit a bug report"
+
 const (
 	tidyModeNone useTidyMode = iota
 	tidyModeAll
 	tidyModeTricium
 )
 
-func processClangTidyFlags(builder *commandBuilder) (cSrcFile string, mode useTidyMode) {
+func processClangTidyFlags(builder *commandBuilder) (cSrcFile string, clangTidyFlags []string, mode useTidyMode) {
+	builder.transformArgs(func(arg builderArg) string {
+		const prefix = "-clang-tidy-flag="
+		if !strings.HasPrefix(arg.value, prefix) {
+			return arg.value
+		}
+
+		clangTidyFlags = append(clangTidyFlags, arg.value[len(prefix):])
+		return ""
+	})
+
 	withTidy, _ := builder.env.getenv("WITH_TIDY")
 	if withTidy == "" {
-		return "", tidyModeNone
+		return "", clangTidyFlags, tidyModeNone
 	}
 	srcFileSuffixes := []string{
 		".c",
@@ -51,7 +64,7 @@
 	}
 
 	if cSrcFile == "" {
-		return "", tidyModeNone
+		return "", clangTidyFlags, tidyModeNone
 	}
 
 	if withTidy == "tricium" {
@@ -65,7 +78,7 @@
 	} else {
 		mode = tidyModeAll
 	}
-	return cSrcFile, mode
+	return cSrcFile, clangTidyFlags, mode
 }
 
 func calcClangTidyInvocation(env env, clangCmd *command, cSrcFile string, tidyFlags ...string) (*command, error) {
@@ -85,7 +98,7 @@
 	}, nil
 }
 
-func runClangTidyForTricium(env env, clangCmd *command, cSrcFile, fixesDir string) error {
+func runClangTidyForTricium(env env, clangCmd *command, cSrcFile, fixesDir string, extraTidyFlags []string, crashArtifactsDir string) error {
 	if err := os.MkdirAll(fixesDir, 0777); err != nil {
 		return fmt.Errorf("creating fixes directory at %q: %v", fixesDir, err)
 	}
@@ -103,7 +116,8 @@
 
 	// FIXME(gbiv): Remove `-checks=*` when testing is complete; we should defer to .clang-tidy
 	// files, which are both more expressive and more approachable than `-checks=*`.
-	clangTidyCmd, err := calcClangTidyInvocation(env, clangCmd, cSrcFile, "-checks=*", "--export-fixes="+fixesFilePath)
+	extraTidyFlags = append(extraTidyFlags, "-checks=*", "--export-fixes="+fixesFilePath)
+	clangTidyCmd, err := calcClangTidyInvocation(env, clangCmd, cSrcFile, extraTidyFlags...)
 	if err != nil {
 		return fmt.Errorf("calculating tidy invocation: %v", err)
 	}
@@ -117,13 +131,58 @@
 		return err
 	}
 
+	type crashOutput struct {
+		CrashReproducerPath string `json:"crash_reproducer_path"`
+		Stdstreams          string `json:"stdstreams"`
+	}
+
 	type metadata struct {
-		Args       []string `json:"args"`
-		Executable string   `json:"executable"`
-		ExitCode   int      `json:"exit_code"`
-		LintTarget string   `json:"lint_target"`
-		Stdstreams string   `json:"stdstreams"`
-		Wd         string   `json:"wd"`
+		Args        []string     `json:"args"`
+		CrashOutput *crashOutput `json:"crash_output"`
+		Executable  string       `json:"executable"`
+		ExitCode    int          `json:"exit_code"`
+		LintTarget  string       `json:"lint_target"`
+		Stdstreams  string       `json:"stdstreams"`
+		Wd          string       `json:"wd"`
+	}
+
+	meta := &metadata{
+		Args:        clangTidyCmd.Args,
+		CrashOutput: nil,
+		Executable:  clangTidyCmd.Path,
+		ExitCode:    exitCode,
+		LintTarget:  cSrcFile,
+		Stdstreams:  stdstreams.String(),
+		Wd:          env.getwd(),
+	}
+
+	// Sometimes, clang-tidy crashes. Unfortunately, these don't get funnelled through the
+	// standard clang crash machinery. :(. Try to work with our own.
+	if crashArtifactsDir != "" && strings.Contains(meta.Stdstreams, clangTidyCrashSubstring) {
+		tidyCrashArtifacts := path.Join(crashArtifactsDir, "clang-tidy")
+		if err := os.MkdirAll(tidyCrashArtifacts, 0777); err != nil {
+			return fmt.Errorf("creating crash artifacts directory at %q: %v", tidyCrashArtifacts, err)
+		}
+
+		f, err := ioutil.TempFile(tidyCrashArtifacts, "crash-")
+		if err != nil {
+			return fmt.Errorf("making tempfile for crash output: %v", err)
+		}
+		f.Close()
+
+		reproCmd := &command{}
+		*reproCmd = *clangCmd
+		reproCmd.Args = append(reproCmd.Args, "-E", "-o", f.Name())
+
+		reproOut := &strings.Builder{}
+		_, err = wrapSubprocessErrorWithSourceLoc(reproCmd, env.run(reproCmd, nil, reproOut, reproOut))
+		if err != nil {
+			return fmt.Errorf("attempting to produce a clang-tidy crash reproducer: %v", err)
+		}
+		meta.CrashOutput = &crashOutput{
+			CrashReproducerPath: f.Name(),
+			Stdstreams:          reproOut.String(),
+		}
 	}
 
 	f, err = os.Create(fixesMetadataPath)
@@ -131,14 +190,6 @@
 		return fmt.Errorf("creating fixes metadata: %v", err)
 	}
 
-	meta := &metadata{
-		Args:       clangTidyCmd.Args,
-		Executable: clangTidyCmd.Path,
-		ExitCode:   exitCode,
-		LintTarget: cSrcFile,
-		Stdstreams: stdstreams.String(),
-		Wd:         env.getwd(),
-	}
 	if err := json.NewEncoder(f).Encode(meta); err != nil {
 		return fmt.Errorf("writing fixes metadata: %v", err)
 	}
@@ -149,9 +200,9 @@
 	return nil
 }
 
-func runClangTidy(env env, clangCmd *command, cSrcFile string) error {
-	clangTidyCmd, err := calcClangTidyInvocation(env, clangCmd, cSrcFile, "-checks="+
-		strings.Join([]string{
+func runClangTidy(env env, clangCmd *command, cSrcFile string, extraTidyFlags []string) error {
+	extraTidyFlags = append(extraTidyFlags,
+		"-checks="+strings.Join([]string{
 			"*",
 			"-bugprone-narrowing-conversions",
 			"-cppcoreguidelines-*",
@@ -165,6 +216,7 @@
 			"-modernize-*",
 			"-readability-*",
 		}, ","))
+	clangTidyCmd, err := calcClangTidyInvocation(env, clangCmd, cSrcFile, extraTidyFlags...)
 	if err != nil {
 		return fmt.Errorf("calculating clang-tidy invocation: %v", err)
 	}
diff --git a/sys-devel/llvm/files/compiler_wrapper/compiler_wrapper.go b/sys-devel/llvm/files/compiler_wrapper/compiler_wrapper.go
index 14de210..aa52dfd 100644
--- a/sys-devel/llvm/files/compiler_wrapper/compiler_wrapper.go
+++ b/sys-devel/llvm/files/compiler_wrapper/compiler_wrapper.go
@@ -89,53 +89,55 @@
 		default:
 			return 0, newErrorwithSourceLocf("unsupported compiler: %s", mainBuilder.target.compiler)
 		}
-	} else if mainBuilder.target.compilerType == clangType {
-		cSrcFile, tidyMode := processClangTidyFlags(mainBuilder)
-		err := prepareClangCommand(mainBuilder)
-		if err != nil {
-			return 0, err
-		}
-		allowCCache := true
-		if tidyMode != tidyModeNone {
-			allowCCache = false
-			clangCmdWithoutGomaAndCCache := mainBuilder.build()
-			var err error
-			switch tidyMode {
-			case tidyModeTricium:
-				if cfg.triciumNitsDir == "" {
-					return 0, newErrorwithSourceLocf("tricium linting was requested, but no nits directory is configured")
-				}
-				err = runClangTidyForTricium(env, clangCmdWithoutGomaAndCCache, cSrcFile, cfg.triciumNitsDir)
-			case tidyModeAll:
-				err = runClangTidy(env, clangCmdWithoutGomaAndCCache, cSrcFile)
-			default:
-				panic(fmt.Sprintf("Unknown tidy mode: %v", tidyMode))
-			}
-
-			if err != nil {
-				return 0, err
-			}
-		}
-		if err := processGomaCCacheFlags(allowCCache, mainBuilder); err != nil {
-			return 0, err
-		}
-		compilerCmd = mainBuilder.build()
 	} else {
-		if clangSyntax {
-			allowCCache := false
-			clangCmd, err := calcClangCommand(allowCCache, mainBuilder.clone())
+		cSrcFile, tidyFlags, tidyMode := processClangTidyFlags(mainBuilder)
+		if mainBuilder.target.compilerType == clangType {
+			err := prepareClangCommand(mainBuilder)
 			if err != nil {
 				return 0, err
 			}
-			gccCmd, err := calcGccCommand(mainBuilder)
+			allowCCache := true
+			if tidyMode != tidyModeNone {
+				allowCCache = false
+				clangCmdWithoutGomaAndCCache := mainBuilder.build()
+				var err error
+				switch tidyMode {
+				case tidyModeTricium:
+					if cfg.triciumNitsDir == "" {
+						return 0, newErrorwithSourceLocf("tricium linting was requested, but no nits directory is configured")
+					}
+					err = runClangTidyForTricium(env, clangCmdWithoutGomaAndCCache, cSrcFile, cfg.triciumNitsDir, tidyFlags, cfg.crashArtifactsDir)
+				case tidyModeAll:
+					err = runClangTidy(env, clangCmdWithoutGomaAndCCache, cSrcFile, tidyFlags)
+				default:
+					panic(fmt.Sprintf("Unknown tidy mode: %v", tidyMode))
+				}
+
+				if err != nil {
+					return 0, err
+				}
+			}
+			if err := processGomaCCacheFlags(allowCCache, mainBuilder); err != nil {
+				return 0, err
+			}
+			compilerCmd = mainBuilder.build()
+		} else {
+			if clangSyntax {
+				allowCCache := false
+				clangCmd, err := calcClangCommand(allowCCache, mainBuilder.clone())
+				if err != nil {
+					return 0, err
+				}
+				gccCmd, err := calcGccCommand(mainBuilder)
+				if err != nil {
+					return 0, err
+				}
+				return checkClangSyntax(env, clangCmd, gccCmd)
+			}
+			compilerCmd, err = calcGccCommand(mainBuilder)
 			if err != nil {
 				return 0, err
 			}
-			return checkClangSyntax(env, clangCmd, gccCmd)
-		}
-		compilerCmd, err = calcGccCommand(mainBuilder)
-		if err != nil {
-			return 0, err
 		}
 	}
 	rusageLogfileName := getRusageLogFilename(env)
@@ -180,6 +182,9 @@
 		processSysrootFlag(builder)
 	}
 	builder.addPreUserArgs(builder.cfg.clangFlags...)
+	if builder.cfg.crashArtifactsDir != "" {
+		builder.addPreUserArgs("-fcrash-diagnostics-dir=" + builder.cfg.crashArtifactsDir)
+	}
 	builder.addPostUserArgs(builder.cfg.clangPostFlags...)
 	calcCommonPreUserArgs(builder)
 	return processClangFlags(builder)
diff --git a/sys-devel/llvm/files/compiler_wrapper/config.go b/sys-devel/llvm/files/compiler_wrapper/config.go
index b11c680..194ab57 100644
--- a/sys-devel/llvm/files/compiler_wrapper/config.go
+++ b/sys-devel/llvm/files/compiler_wrapper/config.go
@@ -31,6 +31,8 @@
 	newWarningsDir string
 	// Directory to store nits in when using `WITH_TIDY=tricium`.
 	triciumNitsDir string
+	// Directory to store crash artifacts in.
+	crashArtifactsDir string
 	// Version. Only used for printing via -print-cmd.
 	version string
 }
@@ -94,6 +96,7 @@
 	cfg.useLlvmNext = useLlvmNext
 	if useLlvmNext {
 		cfg.clangFlags = append(cfg.clangFlags, llvmNextFlags...)
+		cfg.clangPostFlags = append(cfg.clangPostFlags, llvmNextPostFlags...)
 	}
 	cfg.version = version
 	return &cfg, nil
@@ -121,9 +124,10 @@
 	// Disable "-faddrsig" since it produces object files that strip doesn't understand, chromium:915742.
 	// Pass "-fcommon" till the packages are fixed to work with new clang default
 	// "-fno-common", crbug.com/1060413.
+	// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
+	//   removed that flag for now.
 	clangFlags: []string{
 		"-Qunused-arguments",
-		"-grecord-gcc-switches",
 		"-fno-addrsig",
 		"-fcommon",
 		"-Wno-tautological-constant-compare",
@@ -134,13 +138,14 @@
 		"-fuse-ld=lld",
 		"-Wno-final-dtor-non-final-class",
 		"-Werror=poison-system-directories",
-		"-fcrash-diagnostics-dir=/tmp/clang_crash_diagnostics",
+		"-fexperimental-new-pass-manager",
 	},
 	clangPostFlags: []string{
 		"-Wno-implicit-int-float-conversion",
 	},
-	newWarningsDir: "/tmp/fatal_clang_warnings",
-	triciumNitsDir: "/tmp/linting_output/clang-tidy",
+	newWarningsDir:    "/tmp/fatal_clang_warnings",
+	triciumNitsDir:    "/tmp/linting_output/clang-tidy",
+	crashArtifactsDir: "/tmp/clang_crash_diagnostics",
 }
 
 // Flags to be added to non-hardened toolchain.
@@ -165,13 +170,14 @@
 		"-static-libgcc",
 		"-Wno-final-dtor-non-final-class",
 		"-Werror=poison-system-directories",
-		"-fcrash-diagnostics-dir=/tmp/clang_crash_diagnostics",
+		"-fexperimental-new-pass-manager",
 	},
 	clangPostFlags: []string{
 		"-Wno-implicit-int-float-conversion",
 	},
-	newWarningsDir: "/tmp/fatal_clang_warnings",
-	triciumNitsDir: "/tmp/linting_output/clang-tidy",
+	newWarningsDir:    "/tmp/fatal_clang_warnings",
+	triciumNitsDir:    "/tmp/linting_output/clang-tidy",
+	crashArtifactsDir: "/tmp/clang_crash_diagnostics",
 }
 
 // Flags to be added to host toolchain.
@@ -188,9 +194,10 @@
 	// Temporarily add no-unknown-warning-option to deal with old clang versions.
 	// Pass "-fcommon" till the packages are fixed to work with new clang default
 	// "-fno-common", crbug.com/1060413.
+	// crbug.com/1103065: -grecord-gcc-switches pollutes the Goma cache;
+	//   removed that flag for now.
 	clangFlags: []string{
 		"-Qunused-arguments",
-		"-grecord-gcc-switches",
 		"-fno-addrsig",
 		"-fcommon",
 		"-fuse-ld=lld",
@@ -201,23 +208,25 @@
 		"-Wno-final-dtor-non-final-class",
 		"-Werror=poison-system-directories",
 		"-Wno-unknown-warning-option",
-		"-fcrash-diagnostics-dir=/tmp/clang_crash_diagnostics",
+		"-fexperimental-new-pass-manager",
 	},
 	clangPostFlags: []string{
 		"-Wno-implicit-int-float-conversion",
 	},
-	newWarningsDir: "/tmp/fatal_clang_warnings",
-	triciumNitsDir: "/tmp/linting_output/clang-tidy",
+	newWarningsDir:    "/tmp/fatal_clang_warnings",
+	triciumNitsDir:    "/tmp/linting_output/clang-tidy",
+	crashArtifactsDir: "/tmp/clang_crash_diagnostics",
 }
 
 var androidConfig = &config{
-	isHostWrapper:    false,
-	isAndroidWrapper: true,
-	rootRelPath:      "./",
-	commonFlags:      []string{},
-	gccFlags:         []string{},
-	clangFlags:       []string{},
-	clangPostFlags:   []string{},
-	newWarningsDir:   "",
-	triciumNitsDir:   "",
+	isHostWrapper:     false,
+	isAndroidWrapper:  true,
+	rootRelPath:       "./",
+	commonFlags:       []string{},
+	gccFlags:          []string{},
+	clangFlags:        []string{},
+	clangPostFlags:    []string{},
+	newWarningsDir:    "",
+	triciumNitsDir:    "",
+	crashArtifactsDir: "",
 }
diff --git a/sys-devel/llvm/files/compiler_wrapper/cros_llvm_next_flags.go b/sys-devel/llvm/files/compiler_wrapper/cros_llvm_next_flags.go
index 6cd7cd2..f5823fb 100644
--- a/sys-devel/llvm/files/compiler_wrapper/cros_llvm_next_flags.go
+++ b/sys-devel/llvm/files/compiler_wrapper/cros_llvm_next_flags.go
@@ -13,6 +13,11 @@
 // tag is set.
 
 // TODO: Enable test in config_test.go, once we have new llvm-next flags.
-var llvmNextFlags = []string{}
+var llvmNextFlags = []string{
+	"-Wno-compound-token-split-by-macro",
+}
 
-var llvmNextPostFlags = []string{}
+var llvmNextPostFlags = []string{
+	"-Wno-compound-token-split-by-space",
+	"-Wno-string-concatenation",
+}
diff --git a/sys-devel/llvm/files/llvm-next-leak-allowlist.v2.patch b/sys-devel/llvm/files/llvm-next-leak-allowlist.v2.patch
new file mode 100644
index 0000000..47b2580
--- /dev/null
+++ b/sys-devel/llvm/files/llvm-next-leak-allowlist.v2.patch
@@ -0,0 +1,76 @@
+This adds an allowlist of packages that have known memory leaks.
+So that the leak detector will not report memory leaks from these packages.
+diff --git a/lib/sanitizer_common/sanitizer_flags.inc b/lib/sanitizer_common/sanitizer_flags.inc
+index 58f7f37..bf97783 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
+@@ -152,7 +152,7 @@ COMMON_FLAG(const char *, coverage_dir, ".",
+ COMMON_FLAG(bool, full_address_space, false,
+             "Sanitize complete address space; "
+             "by default kernel area on 32-bit platforms will not be sanitized")
+-COMMON_FLAG(bool, print_suppressions, true,
++COMMON_FLAG(bool, print_suppressions, false,
+             "Print matched suppressions at exit.")
+ COMMON_FLAG(
+     bool, disable_coredump, (SANITIZER_WORDSIZE == 64),
+
+diff --git a/lib/lsan/lsan_common.cpp b/lib/lsan/lsan_common.cpp
+index a6119af..44d6f9a 100644
+--- a/compiler-rt/lib/lsan/lsan_common.cpp
++++ b/compiler-rt/lib/lsan/lsan_common.cpp
+@@ -13,6 +13,7 @@
+ //===----------------------------------------------------------------------===//
+ 
+ #include "lsan_common.h"
++#include "lsan_default_suppression.h"
+ 
+ #include "sanitizer_common/sanitizer_common.h"
+ #include "sanitizer_common/sanitizer_flags.h"
+@@ -89,6 +90,7 @@ void InitializeSuppressions() {
+   suppression_ctx->ParseFromFile(flags()->suppressions);
+   if (&__lsan_default_suppressions)
+     suppression_ctx->Parse(__lsan_default_suppressions());
++  suppression_ctx->Parse(kLSanDefaultSuppressions);
+   suppression_ctx->Parse(kStdSuppressions);
+ }
+ 
+diff --git a/lib/lsan/lsan_default_suppression.h b/lib/lsan/lsan_default_suppression.h
+new file mode 100644
+index 0000000..91aa484
+--- /dev/null
++++ b/compiler-rt/lib/lsan/lsan_default_suppression.h
+@@ -0,0 +1,34 @@
++namespace __lsan {
++
++char kLSanDefaultSuppressions[] =
++// ================ Leaks in third-party code ================
++
++// False positives in libfontconfig. http://crbug.com/39050
++"leak:libfontconfig\n"
++
++// Leaks in Nvidia's libGL.
++"leak:libGL.so\n"
++
++"leak:libnssutil3\n"
++"leak:libnspr4\n"
++"leak:libnss3\n"
++"leak:libplds4\n"
++"leak:libnssckbi\n"
++
++// XRandR has several one time leaks.
++"leak:libxrandr\n"
++
++// xrandr leak. http://crbug.com/119677
++"leak:XRRFindDisplay\n"
++
++// leak on session_manager. http://crbug.com/378805
++"leak:/sbin/session_manager\n"
++
++// leak on cryptohome. http://crbug.com/508281
++"leak:/usr/sbin/cryptohome\n"
++
++// leak on buffet. http://crbug.com/473700
++//"leak:/usr/bin/buffet\n"
++// End of suppressions.
++;  // Please keep this semicolon.
++}
diff --git a/sys-devel/llvm/files/llvm-next-leak-whitelist.v2.patch b/sys-devel/llvm/files/llvm-next-leak-whitelist.v2.patch
deleted file mode 100644
index f85ab13..0000000
--- a/sys-devel/llvm/files/llvm-next-leak-whitelist.v2.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-This adds a whiltelist of packages that have known memory leaks.
-So that the leak detector will not report memory leaks from these packages.
-diff --git a/lib/sanitizer_common/sanitizer_flags.inc b/lib/sanitizer_common/sanitizer_flags.inc
-index 58f7f37..bf97783 100644
---- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
-+++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
-@@ -152,7 +152,7 @@ COMMON_FLAG(const char *, coverage_dir, ".",
- COMMON_FLAG(bool, full_address_space, false,
-             "Sanitize complete address space; "
-             "by default kernel area on 32-bit platforms will not be sanitized")
--COMMON_FLAG(bool, print_suppressions, true,
-+COMMON_FLAG(bool, print_suppressions, false,
-             "Print matched suppressions at exit.")
- COMMON_FLAG(
-     bool, disable_coredump, (SANITIZER_WORDSIZE == 64),
-
-diff --git a/lib/lsan/lsan_common.cpp b/lib/lsan/lsan_common.cpp
-index a6119af..44d6f9a 100644
---- a/compiler-rt/lib/lsan/lsan_common.cpp
-+++ b/compiler-rt/lib/lsan/lsan_common.cpp
-@@ -13,6 +13,7 @@
- //===----------------------------------------------------------------------===//
- 
- #include "lsan_common.h"
-+#include "lsan_default_suppression.h"
- 
- #include "sanitizer_common/sanitizer_common.h"
- #include "sanitizer_common/sanitizer_flags.h"
-@@ -89,6 +90,7 @@ void InitializeSuppressions() {
-   suppression_ctx->ParseFromFile(flags()->suppressions);
-   if (&__lsan_default_suppressions)
-     suppression_ctx->Parse(__lsan_default_suppressions());
-+  suppression_ctx->Parse(kLSanDefaultSuppressions);
-   suppression_ctx->Parse(kStdSuppressions);
- }
- 
-diff --git a/lib/lsan/lsan_default_suppression.h b/lib/lsan/lsan_default_suppression.h
-new file mode 100644
-index 0000000..91aa484
---- /dev/null
-+++ b/compiler-rt/lib/lsan/lsan_default_suppression.h
-@@ -0,0 +1,34 @@
-+namespace __lsan {
-+
-+char kLSanDefaultSuppressions[] =
-+// ================ Leaks in third-party code ================
-+
-+// False positives in libfontconfig. http://crbug.com/39050
-+"leak:libfontconfig\n"
-+
-+// Leaks in Nvidia's libGL.
-+"leak:libGL.so\n"
-+
-+"leak:libnssutil3\n"
-+"leak:libnspr4\n"
-+"leak:libnss3\n"
-+"leak:libplds4\n"
-+"leak:libnssckbi\n"
-+
-+// XRandR has several one time leaks.
-+"leak:libxrandr\n"
-+
-+// xrandr leak. http://crbug.com/119677
-+"leak:XRRFindDisplay\n"
-+
-+// leak on session_manager. http://crbug.com/378805
-+"leak:/sbin/session_manager\n"
-+
-+// leak on cryptohome. http://crbug.com/508281
-+"leak:/usr/sbin/cryptohome\n"
-+
-+// leak on buffet. http://crbug.com/473700
-+//"leak:/usr/bin/buffet\n"
-+// End of suppressions.
-+;  // Please keep this semicolon.
-+}
diff --git a/sys-devel/llvm/llvm-11.0_pre394483_p20200618-r2.ebuild b/sys-devel/llvm/llvm-11.0_pre394483_p20200618-r2.ebuild
deleted file mode 120000
index 7f9d7d5..0000000
--- a/sys-devel/llvm/llvm-11.0_pre394483_p20200618-r2.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-llvm-11.0_pre394483_p20200618.ebuild
\ No newline at end of file
diff --git a/sys-devel/llvm/llvm-11.0_pre394483_p20200618.ebuild b/sys-devel/llvm/llvm-11.0_pre394483_p20200618.ebuild
deleted file mode 100644
index 2f2a0d6..0000000
--- a/sys-devel/llvm/llvm-11.0_pre394483_p20200618.ebuild
+++ /dev/null
@@ -1,368 +0,0 @@
-# Copyright 1999-2015 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id$
-
-EAPI=6
-
-: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
-PYTHON_COMPAT=( python3_6 )
-
-inherit  cros-constants cmake-utils eutils flag-o-matic git-2 git-r3 \
-	multilib multilib-minimal python-single-r1 toolchain-funcs pax-utils
-
-LLVM_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-LLVM_NEXT_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-
-DESCRIPTION="Low Level Virtual Machine"
-HOMEPAGE="http://llvm.org/"
-SRC_URI="
-	!llvm-tot? (
-		!llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-${LLVM_HASH}.tar.xz ) )
-		llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-${LLVM_NEXT_HASH}.tar.xz ) )
-	)
-"
-EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
-	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
-
-LICENSE="UoI-NCSA"
-SLOT="8"
-KEYWORDS="-* amd64"
-# FIXME: llvm-tot is somewhat misleading: at the moment, it's essentially
-# llvm-next with a few extra checks enabled
-IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt
-	llvm-next llvm_pgo_generate llvm_pgo_use llvm-next_pgo_use llvm-tot
-	multitarget ncurses ocaml python test +thinlto xml video_cards_radeon"
-
-COMMON_DEPEND="
-	sys-libs/zlib:0=
-	libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
-	libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
-	ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
-	ocaml? (
-		>=dev-lang/ocaml-4.00.0:0=
-		dev-ml/findlib
-		dev-ml/ocaml-ctypes )"
-# configparser-3.2 breaks the build (3.3 or none at all are fine)
-DEPEND="${COMMON_DEPEND}
-	dev-lang/perl
-	>=sys-devel/make-3.81
-	>=sys-devel/flex-2.5.4
-	>=sys-devel/bison-1.875d
-	|| ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
-		( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
-	)
-	|| ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-5.1 )
-	doc? ( dev-python/sphinx )
-	libffi? ( virtual/pkgconfig )
-	!!<dev-python/configparser-3.3.0.2
-	ocaml? ( test? ( dev-ml/ounit ) )
-	${PYTHON_DEPS}"
-RDEPEND="${COMMON_DEPEND}
-	abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2
-		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] )
-	!<=sys-devel/llvm-8.0_pre
-	!sys-devel/lld
-	!sys-devel/clang"
-
-# pypy gives me around 1700 unresolved tests due to open file limit
-# being exceeded. probably GC does not close them fast enough.
-REQUIRED_USE="
-	${PYTHON_REQUIRED_USE}
-	llvm_pgo_generate? ( !llvm_pgo_use )"
-
-check_lld_works() {
-	echo 'int main() {return 0;}' > "${T}"/lld.cxx || die
-	echo "Trying to link program with lld"
-	$(tc-getCXX) -fuse-ld=lld -std=c++11 -o /dev/null "${T}"/lld.cxx
-}
-
-apply_pgo_profile() {
-	! use llvm-tot && ( \
-		( use llvm-next && use llvm-next_pgo_use ) ||
-		( ! use llvm-next && use llvm_pgo_use ) )
-}
-
-src_unpack() {
-	export CMAKE_USE_DIR="${S}/llvm"
-
-	local llvm_hash
-
-	if use llvm-next || use llvm-tot; then
-		llvm_hash="${LLVM_NEXT_HASH}"
-	else
-		llvm_hash="${LLVM_HASH}"
-	fi
-
-	# Don't unpack profdata file when calling git-2_src_unpack.
-	EGIT_NOUNPACK=1
-
-	# Unpack llvm
-	ESVN_PROJECT="llvm"
-	EGIT_COMMIT="${llvm_hash}"
-
-	git-2_src_unpack
-
-	if apply_pgo_profile; then
-		cd "${WORKDIR}"
-		local profile_hash
-		if use llvm-next; then
-			profile_hash="${LLVM_NEXT_HASH}"
-		else
-			profile_hash="${LLVM_HASH}"
-		fi
-		unpack "llvm-profdata-${profile_hash}.tar.xz"
-	fi
-	EGIT_NOUNPACK=
-}
-
-get_most_recent_revision() {
-	local subdir="${S}/llvm"
-
-	# Tries to get the revision ID of the most recent commit
-	"${FILESDIR}"/patch_manager/git_llvm_rev.py --llvm_dir "${subdir}" --sha "$(git -C "${subdir}" rev-parse HEAD)" | cut -d 'r' -f 2
-}
-
-src_prepare() {
-	# Make ocaml warnings non-fatal, bug #537308
-	sed -e "/RUN/s/-warn-error A//" -i llvm/test/Bindings/OCaml/*ml  || die
-
-	python_setup
-
-	"${FILESDIR}"/patch_manager/patch_manager.py \
-		--svn_version "$(get_most_recent_revision)" \
-		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
-		--filesdir_path "${FILESDIR}" \
-		--src_path "${S}" || die
-
-	# User patches
-	eapply_user
-
-	# Native libdir is used to hold LLVMgold.so
-	NATIVE_LIBDIR=$(get_libdir)
-}
-
-enable_asserts() {
-	# keep asserts enabled for llvm-tot
-	if use llvm-tot; then
-		echo yes
-	else
-		usex debug
-	fi
-}
-
-multilib_src_configure() {
-	append-flags -Wno-poison-system-directories
-
-	local targets
-	if use multitarget; then
-		targets='host;X86;ARM;AArch64;NVPTX'
-	else
-		targets='host;CppBackend'
-		use video_cards_radeon && targets+=';AMDGPU'
-	fi
-
-	local ffi_cflags ffi_ldflags
-	if use libffi; then
-		ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
-		ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
-	fi
-
-	local libdir=$(get_libdir)
-	local mycmakeargs=(
-		"${mycmakeargs[@]}"
-		"-DLLVM_ENABLE_PROJECTS=llvm;clang;lld;compiler-rt;clang-tools-extra"
-		"-DLLVM_LIBDIR_SUFFIX=${libdir#lib}"
-
-		"-DLLVM_BUILD_LLVM_DYLIB=ON"
-		# Link LLVM statically
-		"-DLLVM_LINK_LLVM_DYLIB=OFF"
-
-		"-DLLVM_ENABLE_TIMESTAMPS=OFF"
-		"-DLLVM_TARGETS_TO_BUILD=${targets}"
-		"-DLLVM_BUILD_TESTS=$(usex test)"
-
-		"-DLLVM_ENABLE_FFI=$(usex libffi)"
-		"-DLLVM_ENABLE_TERMINFO=$(usex ncurses)"
-		"-DLLVM_ENABLE_ASSERTIONS=$(enable_asserts)"
-		"-DLLVM_ENABLE_EH=ON"
-		"-DLLVM_ENABLE_RTTI=ON"
-
-		"-DWITH_POLLY=OFF" # TODO
-
-		"-DLLVM_HOST_TRIPLE=${CHOST}"
-
-		"-DFFI_INCLUDE_DIR=${ffi_cflags#-I}"
-		"-DFFI_LIBRARY_DIR=${ffi_ldflags#-L}"
-		"-DLLVM_BINUTILS_INCDIR=${SYSROOT}/usr/include"
-
-		"-DHAVE_HISTEDIT_H=$(usex libedit)"
-		"-DENABLE_LINKER_BUILD_ID=ON"
-		"-DCLANG_VENDOR=Chromium OS ${PVR}"
-		# override default stdlib and rtlib
-		"-DCLANG_DEFAULT_CXX_STDLIB=$(usex default-libcxx libc++ "")"
-		"-DCLANG_DEFAULT_RTLIB=$(usex default-compiler-rt compiler-rt "")"
-
-		# Turn on new pass manager for LLVM
-		"-DENABLE_EXPERIMENTAL_NEW_PASS_MANAGER=ON"
-
-		# crbug/855759
-		"-DCOMPILER_RT_BUILD_CRT=$(usex llvm-crt)"
-
-		"-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
-		"-DCLANG_DEFAULT_UNWINDLIB=libgcc"
-
-		# By default do not enable PGO for compiler-rt
-		"-DCOMPILER_RT_ENABLE_PGO=OFF"
-
-		# compiler-rt needs libc++ sources to be specified to build
-		# an internal copy for libfuzzer, can be removed if libc++
-		# is built inside llvm ebuild.
-		"-DCOMPILER_RT_LIBCXXABI_PATH=${S}/libcxxabi"
-		"-DCOMPILER_RT_LIBCXX_PATH=${S}/libcxx"
-	)
-
-	# Update LLVM to 9.0 will cause LLVM to complain GCC
-	# version is < 5.1. Add this flag to suppress the error.
-	mycmakeargs+=(
-		"-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=1"
-	)
-
-	if check_lld_works; then
-		mycmakeargs+=(
-			# We use lld to link llvm, because:
-			# 1) Gold has issue with no index for archive,
-			# 2) Gold doesn't support instrumented compiler-rt well.
-			"-DLLVM_USE_LINKER=lld"
-		)
-		# The standalone toolchain may be run at places not supporting
-		# smallPIE, disabling it for lld.
-		# Pass -fuse-ld=lld to make cmake happy.
-		append-ldflags "-fuse-ld=lld -Wl,--pack-dyn-relocs=none"
-		# Disable warning about profile not matching.
-		append-flags "-Wno-backend-plugin"
-
-		if use thinlto; then
-			mycmakeargs+=(
-				"-DLLVM_ENABLE_LTO=thin"
-			)
-		fi
-
-		if apply_pgo_profile; then
-			mycmakeargs+=(
-				"-DLLVM_PROFDATA_FILE=${WORKDIR}/llvm.profdata"
-			)
-		fi
-
-		if use llvm_pgo_generate; then
-			mycmakeargs+=(
-				"-DLLVM_BUILD_INSTRUMENTED=IR"
-			)
-		fi
-	fi
-
-	if ! multilib_is_native_abi || ! use ocaml; then
-		mycmakeargs+=(
-			"-DOCAMLFIND=NO"
-		)
-	fi
-#	Note: go bindings have no CMake rules at the moment
-#	but let's kill the check in case they are introduced
-#	if ! multilib_is_native_abi || ! use go; then
-		mycmakeargs+=(
-			"-DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND"
-		)
-#	fi
-
-	if multilib_is_native_abi; then
-		mycmakeargs+=(
-			"-DLLVM_BUILD_DOCS=$(usex doc)"
-			"-DLLVM_ENABLE_SPHINX=$(usex doc)"
-			"-DLLVM_ENABLE_DOXYGEN=OFF"
-			"-DLLVM_INSTALL_HTML=${EPREFIX}/usr/share/doc/${PF}/html"
-			"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
-			"-DLLVM_INSTALL_UTILS=ON"
-		)
-	fi
-
-	cmake-utils_src_configure
-}
-
-multilib_src_compile() {
-	cmake-utils_src_compile
-	# TODO: not sure why this target is not correctly called
-	multilib_is_native_abi && use doc && use ocaml && cmake-utils_src_make docs/ocaml_doc
-
-	pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
-	pax-mark m "${BUILD_DIR}"/bin/lli
-	pax-mark m "${BUILD_DIR}"/bin/lli-child-target
-
-	if use test; then
-		pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
-		pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
-		pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
-	fi
-}
-
-multilib_src_test() {
-	# respect TMPDIR!
-	local -x LIT_PRESERVES_TMP=1
-	local test_targets=( check )
-	cmake-utils_src_make "${test_targets[@]}"
-}
-
-src_install() {
-	local MULTILIB_CHOST_TOOLS=(
-		/usr/bin/llvm-config
-	)
-
-	local MULTILIB_WRAPPED_HEADERS=(
-		/usr/include/llvm/Config/config.h
-		/usr/include/llvm/Config/llvm-config.h
-	)
-
-	multilib-minimal_src_install
-}
-
-multilib_src_install() {
-	cmake-utils_src_install
-
-	local use_llvm_next=false
-	if use llvm-next || use llvm-tot
-	then
-		use_llvm_next=true
-	fi
-	local wrapper_script=clang_host_wrapper
-
-	"${FILESDIR}/compiler_wrapper/build.py" --config=cros.host --use_ccache=false \
-		--use_llvm_next="${use_llvm_next}" \
-		--output_file="${D}/usr/bin/${wrapper_script}" || die
-
-	newbin "${D}/usr/bin/clang-tidy" "clang-tidy"
-	dobin "${FILESDIR}/bisect_driver.py"
-	exeinto "/usr/bin"
-	dosym "${wrapper_script}" "/usr/bin/${CHOST}-clang"
-	dosym "${wrapper_script}" "/usr/bin/${CHOST}-clang++"
-	newexe "${FILESDIR}/ldwrapper_lld.host" "${CHOST}-ld.lld"
-}
-
-multilib_src_install_all() {
-	insinto /usr/share/vim/vimfiles
-	doins -r llvm/utils/vim/*/.
-	# some users may find it useful
-	dodoc llvm/utils/vim/vimrc
-	dobin "${S}/compiler-rt/lib/asan/scripts/asan_symbolize.py"
-}
-
-pkg_postinst() {
-	if has_version ">=dev-util/ccache-3.1.9-r2" ; then
-		#add ccache links as clang might get installed after ccache
-		"${EROOT}"/usr/bin/ccache-config --install-links
-	fi
-}
-
-pkg_postrm() {
-	if has_version ">=dev-util/ccache-3.1.9-r2" && [[ -z ${REPLACED_BY_VERSION} ]]; then
-		# --remove-links would remove all links, --install-links updates them
-		"${EROOT}"/usr/bin/ccache-config --install-links
-	fi
-}
diff --git a/sys-devel/llvm/llvm-11.0_pre399094_p20200824-r6.ebuild b/sys-devel/llvm/llvm-11.0_pre399094_p20200824-r6.ebuild
new file mode 120000
index 0000000..f5295d8
--- /dev/null
+++ b/sys-devel/llvm/llvm-11.0_pre399094_p20200824-r6.ebuild
@@ -0,0 +1 @@
+llvm-11.0_pre399094_p20200824.ebuild
\ No newline at end of file
diff --git a/sys-devel/llvm/llvm-11.0_pre399094_p20200824.ebuild b/sys-devel/llvm/llvm-11.0_pre399094_p20200824.ebuild
new file mode 100644
index 0000000..847d70a7
--- /dev/null
+++ b/sys-devel/llvm/llvm-11.0_pre399094_p20200824.ebuild
@@ -0,0 +1,357 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..9} )
+
+inherit cros-constants cmake flag-o-matic git-r3 multilib-minimal  \
+	python-any-r1 pax-utils toolchain-funcs
+
+LLVM_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+LLVM_NEXT_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+
+DESCRIPTION="Low Level Virtual Machine"
+HOMEPAGE="http://llvm.org/"
+SRC_URI="
+	!llvm-tot? (
+		!llvm-next? ( llvm_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-${LLVM_HASH}.tar.xz ) )
+		llvm-next? ( llvm-next_pgo_use? ( gs://chromeos-localmirror/distfiles/llvm-profdata-${LLVM_NEXT_HASH}.tar.xz ) )
+	)
+"
+EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
+	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
+
+LICENSE="UoI-NCSA"
+SLOT="8"
+KEYWORDS="-* amd64"
+# FIXME: llvm-tot is somewhat misleading: at the moment, it's essentially
+# llvm-next with a few extra checks enabled
+IUSE="debug +default-compiler-rt +default-libcxx doc libedit +libffi +llvm-crt
+	llvm-next llvm_pgo_generate +llvm_pgo_use llvm-next_pgo_use llvm-tot
+	multitarget ncurses ocaml test +thinlto xml video_cards_radeon"
+
+COMMON_DEPEND="
+	sys-libs/zlib:0=[${MULTILIB_USEDEP}]
+	libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
+	libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
+	ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
+	ocaml? (
+		>=dev-lang/ocaml-4.00.0:0=
+		dev-ml/findlib
+		dev-ml/ocaml-ctypes )"
+# configparser-3.2 breaks the build (3.3 or none at all are fine)
+DEPEND="${COMMON_DEPEND}
+	sys-devel/binutils
+	ocaml? ( test? ( dev-ml/ounit ) )"
+RDEPEND="${COMMON_DEPEND}
+	abi_x86_32? ( !<=app-emulation/emul-linux-x86-baselibs-20130224-r2
+		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)] )
+	!<=sys-devel/llvm-8.0_pre
+	!sys-devel/lld
+	!sys-devel/clang"
+BDEPEND="
+	dev-lang/perl
+	libffi? ( virtual/pkgconfig )
+	sys-devel/gnuconfig
+	$(python_gen_any_dep '
+		dev-python/sphinx[${PYTHON_USEDEP}]
+		doc? ( dev-python/recommonmark[${PYTHON_USEDEP}] )
+	')
+"
+
+# pypy gives me around 1700 unresolved tests due to open file limit
+# being exceeded. probably GC does not close them fast enough.
+REQUIRED_USE="
+	llvm_pgo_generate? ( !llvm_pgo_use )"
+
+check_lld_works() {
+	echo 'int main() {return 0;}' > "${T}"/lld.cxx || die
+	echo "Trying to link program with lld"
+	$(tc-getCXX) -fuse-ld=lld -std=c++11 -o /dev/null "${T}"/lld.cxx
+}
+
+apply_pgo_profile() {
+	! use llvm-tot && ( \
+		( use llvm-next && use llvm-next_pgo_use ) ||
+		( ! use llvm-next && use llvm_pgo_use ) )
+}
+
+src_unpack() {
+	export CMAKE_USE_DIR="${S}/llvm"
+
+	if use llvm-next || use llvm-tot; then
+		EGIT_COMMIT="${LLVM_NEXT_HASH}"
+	else
+		EGIT_COMMIT="${LLVM_HASH}"
+	fi
+
+	git-r3_src_unpack
+
+	if apply_pgo_profile; then
+		cd "${WORKDIR}"
+		local profile_hash
+		if use llvm-next; then
+			profile_hash="${LLVM_NEXT_HASH}"
+		else
+			profile_hash="${LLVM_HASH}"
+		fi
+		unpack "llvm-profdata-${profile_hash}.tar.xz"
+	fi
+}
+
+get_most_recent_revision() {
+	local subdir="${S}/llvm"
+
+	# Tries to get the revision ID of the most recent commit
+	"${FILESDIR}"/patch_manager/git_llvm_rev.py --llvm_dir "${subdir}" --sha "$(git -C "${subdir}" rev-parse HEAD)" | cut -d 'r' -f 2
+}
+
+src_prepare() {
+	# Make ocaml warnings non-fatal, bug #537308
+	sed -e "/RUN/s/-warn-error A//" -i llvm/test/Bindings/OCaml/*ml  || die
+
+	python_setup
+
+	"${FILESDIR}"/patch_manager/patch_manager.py \
+		--svn_version "$(get_most_recent_revision)" \
+		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
+		--filesdir_path "${FILESDIR}" \
+		--src_path "${S}" || die
+
+	cmake_src_prepare
+
+	# Native libdir is used to hold LLVMgold.so
+	NATIVE_LIBDIR=$(get_libdir)
+}
+
+enable_asserts() {
+	# keep asserts enabled for llvm-tot
+	if use llvm-tot; then
+		echo yes
+	else
+		usex debug
+	fi
+}
+
+multilib_src_configure() {
+	export CMAKE_BUILD_TYPE="RelWithDebInfo"
+
+	append-flags -Wno-poison-system-directories
+
+	local targets
+	if use multitarget; then
+		targets='host;X86;ARM;AArch64;NVPTX'
+	else
+		targets='host;CppBackend'
+		use video_cards_radeon && targets+=';AMDGPU'
+	fi
+
+	local ffi_cflags ffi_ldflags
+	if use libffi; then
+		ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
+		ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
+	fi
+
+	local libdir=$(get_libdir)
+	local mycmakeargs=(
+		"${mycmakeargs[@]}"
+		"-DLLVM_ENABLE_PROJECTS=llvm;clang;lld;compiler-rt;clang-tools-extra"
+		"-DLLVM_LIBDIR_SUFFIX=${libdir#lib}"
+
+		"-DLLVM_BUILD_LLVM_DYLIB=ON"
+		# Link LLVM statically
+		"-DLLVM_LINK_LLVM_DYLIB=OFF"
+		"-DBUILD_SHARED_LIBS=OFF"
+
+		"-DLLVM_ENABLE_TIMESTAMPS=OFF"
+		"-DLLVM_TARGETS_TO_BUILD=${targets}"
+		"-DLLVM_BUILD_TESTS=$(usex test)"
+
+		"-DLLVM_ENABLE_FFI=$(usex libffi)"
+		"-DLLVM_ENABLE_TERMINFO=$(usex ncurses)"
+		"-DLLVM_ENABLE_ASSERTIONS=$(enable_asserts)"
+		"-DLLVM_ENABLE_EH=ON"
+		"-DLLVM_ENABLE_RTTI=ON"
+
+		"-DWITH_POLLY=OFF" # TODO
+
+		"-DLLVM_HOST_TRIPLE=${CHOST}"
+
+		"-DFFI_INCLUDE_DIR=${ffi_cflags#-I}"
+		"-DFFI_LIBRARY_DIR=${ffi_ldflags#-L}"
+		"-DLLVM_BINUTILS_INCDIR=${SYSROOT}/usr/include"
+
+		"-DHAVE_HISTEDIT_H=$(usex libedit)"
+		"-DENABLE_LINKER_BUILD_ID=ON"
+		"-DCLANG_VENDOR=Chromium OS ${PVR}"
+		# override default stdlib and rtlib
+		"-DCLANG_DEFAULT_CXX_STDLIB=$(usex default-libcxx libc++ "")"
+		"-DCLANG_DEFAULT_RTLIB=$(usex default-compiler-rt compiler-rt "")"
+
+		# Turn on new pass manager for LLVM
+		"-DENABLE_EXPERIMENTAL_NEW_PASS_MANAGER=ON"
+
+		# crbug/855759
+		"-DCOMPILER_RT_BUILD_CRT=$(usex llvm-crt)"
+
+		"-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
+		"-DCLANG_DEFAULT_UNWINDLIB=libgcc"
+
+		# By default do not enable PGO for compiler-rt
+		"-DCOMPILER_RT_ENABLE_PGO=OFF"
+
+		# compiler-rt needs libc++ sources to be specified to build
+		# an internal copy for libfuzzer, can be removed if libc++
+		# is built inside llvm ebuild.
+		"-DCOMPILER_RT_LIBCXXABI_PATH=${S}/libcxxabi"
+		"-DCOMPILER_RT_LIBCXX_PATH=${S}/libcxx"
+	)
+
+	# Update LLVM to 9.0 will cause LLVM to complain GCC
+	# version is < 5.1. Add this flag to suppress the error.
+	mycmakeargs+=(
+		"-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=1"
+	)
+
+	if check_lld_works; then
+		mycmakeargs+=(
+			# We use lld to link llvm, because:
+			# 1) Gold has issue with no index for archive,
+			# 2) Gold doesn't support instrumented compiler-rt well.
+			"-DLLVM_USE_LINKER=lld"
+		)
+		# The standalone toolchain may be run at places not supporting
+		# smallPIE, disabling it for lld.
+		# Pass -fuse-ld=lld to make cmake happy.
+		append-ldflags "-fuse-ld=lld -Wl,--pack-dyn-relocs=none"
+		# Disable warning about profile not matching.
+		append-flags "-Wno-backend-plugin"
+
+		if use thinlto; then
+			mycmakeargs+=(
+				"-DLLVM_ENABLE_LTO=thin"
+			)
+		fi
+
+		if apply_pgo_profile; then
+			mycmakeargs+=(
+				"-DLLVM_PROFDATA_FILE=${WORKDIR}/llvm.profdata"
+			)
+		fi
+
+		if use llvm_pgo_generate; then
+			mycmakeargs+=(
+				"-DLLVM_BUILD_INSTRUMENTED=IR"
+			)
+		fi
+	fi
+
+	if ! multilib_is_native_abi || ! use ocaml; then
+		mycmakeargs+=(
+			"-DOCAMLFIND=NO"
+		)
+	fi
+#	Note: go bindings have no CMake rules at the moment
+#	but let's kill the check in case they are introduced
+#	if ! multilib_is_native_abi || ! use go; then
+		mycmakeargs+=(
+			"-DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND"
+		)
+#	fi
+
+	if multilib_is_native_abi; then
+		mycmakeargs+=(
+			"-DLLVM_BUILD_DOCS=$(usex doc)"
+			"-DLLVM_ENABLE_SPHINX=$(usex doc)"
+			"-DLLVM_ENABLE_DOXYGEN=OFF"
+			"-DLLVM_INSTALL_HTML=${EPREFIX}/usr/share/doc/${PF}/html"
+			"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
+			"-DLLVM_INSTALL_UTILS=ON"
+		)
+	fi
+
+	if ! use debug; then
+		append-cppflags -DNDEBUG
+	fi
+
+	cmake_src_configure
+}
+
+multilib_src_compile() {
+	cmake_src_compile
+
+	pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
+	pax-mark m "${BUILD_DIR}"/bin/lli
+	pax-mark m "${BUILD_DIR}"/bin/lli-child-target
+
+	if use test; then
+		pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
+		pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
+		pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
+	fi
+}
+
+multilib_src_test() {
+	# respect TMPDIR!
+	local -x LIT_PRESERVES_TMP=1
+	cmake_src_test
+}
+
+src_install() {
+	local MULTILIB_CHOST_TOOLS=(
+		/usr/bin/llvm-config
+	)
+
+	local MULTILIB_WRAPPED_HEADERS=(
+		/usr/include/llvm/Config/config.h
+		/usr/include/llvm/Config/llvm-config.h
+	)
+
+	multilib-minimal_src_install
+}
+
+multilib_src_install() {
+	cmake_src_install
+
+	local use_llvm_next=false
+	if use llvm-next || use llvm-tot
+	then
+		use_llvm_next=true
+	fi
+	local wrapper_script=clang_host_wrapper
+
+	"${FILESDIR}/compiler_wrapper/build.py" --config=cros.host --use_ccache=false \
+		--use_llvm_next="${use_llvm_next}" \
+		--output_file="${D}/usr/bin/${wrapper_script}" || die
+
+	newbin "${D}/usr/bin/clang-tidy" "clang-tidy"
+	dobin "${FILESDIR}/bisect_driver.py"
+	exeinto "/usr/bin"
+	dosym "${wrapper_script}" "/usr/bin/${CHOST}-clang"
+	dosym "${wrapper_script}" "/usr/bin/${CHOST}-clang++"
+	newexe "${FILESDIR}/ldwrapper_lld.host" "${CHOST}-ld.lld"
+}
+
+multilib_src_install_all() {
+	insinto /usr/share/vim/vimfiles
+	doins -r llvm/utils/vim/*/.
+	# some users may find it useful
+	dodoc llvm/utils/vim/vimrc
+	dobin "${S}/compiler-rt/lib/asan/scripts/asan_symbolize.py"
+}
+
+pkg_postinst() {
+	if has_version ">=dev-util/ccache-3.1.9-r2" ; then
+		#add ccache links as clang might get installed after ccache
+		"${EROOT}"/usr/bin/ccache-config --install-links
+	fi
+}
+
+pkg_postrm() {
+	if has_version ">=dev-util/ccache-3.1.9-r2" && [[ -z ${REPLACED_BY_VERSION} ]]; then
+		# --remove-links would remove all links, --install-links updates them
+		"${EROOT}"/usr/bin/ccache-config --install-links
+	fi
+}
diff --git a/sys-firmware/aver-firmware/Manifest b/sys-firmware/aver-firmware/Manifest
index ee94b65..fed0ebf 100644
--- a/sys-firmware/aver-firmware/Manifest
+++ b/sys-firmware/aver-firmware/Manifest
@@ -1,3 +1,3 @@
-DIST aver-cam340plus-0.0.1000.22.tar.xz 663208 BLAKE2B 1536ad371afd8e2d847f4bf1b3d2288dec91885e7059cdb3a86e3ebf96ee5cb15e4706af8863cbc2543770100fb21d9bb9f527e68cbe93277850b392c79b9bfa SHA512 9d8a4a9bf7f1f49458bdd59e17e2d0fc4e646a1aefec419c07f707e078e9cf20caa68aae790070a01496720c3abbbd3cf8a21cbc3ea7295a3862703284ee2ea2
+DIST aver-cam340plus-0.0.1000.34.tar.xz 668652 BLAKE2B 961db5c7f46b72937955c1c94f82152aa13a865dd32921ca2d17aa395811199c5a681cade10ecd1427757abf2940cfdd34e86bb60e7d27242f8423b849c98937 SHA512 5a0357229fb8034c9f85493decac602b854f189b5e992eec6e249f400c52948f07d552c0b9e174c25d31542ba243da610583db1497724994f1268163446bacb7
 DIST aver-cam520-0.0.0018.36.tar.xz 15893408 BLAKE2B 735d9c228390dfa783e98cb4bd6bcfdf956549c27031e4e9f19d8b6f3a840472f3803c3ae2a38ed246ff67629b8018b238a79edd73c343dd850659a045a24222 SHA512 1c3065c581f2bd0aa1d088d8254121864913ced056cb9ec4ac4ef7dbf9cc3f41c8244e4634a9765d7aeed71008ce9405167e646121751dca5547cc1beeadb325
-DIST aver-cam540-0.0.6002.84.tar.xz 39814716 BLAKE2B 451a2310183c0b9ba93e7062d356760293e17070573d247b31bafc0df88687166640c928667e544af6390ca8d4bde85ce9e107b701d1ba6a0eb0a7672082d495 SHA512 84180e960e5754e58156f5bbdfae44ccc4c8da7f175ced2a49aad3d6e3a3e2ca275d58423efb1ca5cd268342fab019908e18088c05863ec827b8de94f16cf9e3
+DIST aver-cam540-0.0.6002.96.tar.xz 39827924 BLAKE2B f3bb14aafa12cf3575617b0c57d6b86c2bdf9c8d5e1d4bfe6ce1067111e7a06e8761879e2336c4bfa06797765e1d0322b3659a7109cbf4c4e9629b622a925aa5 SHA512 a411f9939bcc1366bdb0e6a76feaccb8ca12defe561f00aaef448214c826b7d776c00224932ac1275bf19c7ee13e578d10e46df85b614b2b3bc26bd8a32c0887
diff --git a/sys-firmware/aver-firmware/aver-firmware-1.0.3-r1.ebuild b/sys-firmware/aver-firmware/aver-firmware-1.0.3-r1.ebuild
deleted file mode 120000
index 57a4df1..0000000
--- a/sys-firmware/aver-firmware/aver-firmware-1.0.3-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-aver-firmware-1.0.3.ebuild
\ No newline at end of file
diff --git a/sys-firmware/aver-firmware/aver-firmware-1.0.3.ebuild b/sys-firmware/aver-firmware/aver-firmware-1.0.3.ebuild
deleted file mode 100644
index b0fc5c2..0000000
--- a/sys-firmware/aver-firmware/aver-firmware-1.0.3.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-DESCRIPTION="AVer firmware"
-
-CAM520_FW_VER="0.0.0018.36"
-CAM540_FW_VER="0.0.6002.84"
-CAM340PLUS_FW_VER="0.0.1000.22"
-
-CAM520_FW_NAME="aver-cam520"
-CAM540_FW_NAME="aver-cam540"
-CAM340PLUS_FW_NAME="aver-cam340plus"
-
-SRC_URI="gs://chromeos-localmirror/distfiles/${CAM520_FW_NAME}-${CAM520_FW_VER}.tar.xz
-	gs://chromeos-localmirror/distfiles/${CAM540_FW_NAME}-${CAM540_FW_VER}.tar.xz
-	gs://chromeos-localmirror/distfiles/${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.tar.xz"
-
-LICENSE="BSD"
-SLOT="0"
-KEYWORDS="*"
-
-RDEPEND="sys-apps/aver-updater"
-DEPEND=""
-
-S="${WORKDIR}"
-
-src_install() {
-	insinto /lib/firmware/aver
-
-	doins "${CAM520_FW_NAME}-${CAM520_FW_VER}.dat"
-	dosym "${CAM520_FW_NAME}-${CAM520_FW_VER}.dat" \
-		"/lib/firmware/aver/${CAM520_FW_NAME}-latest.dat"
-
-	doins "${CAM540_FW_NAME}-${CAM540_FW_VER}.dat"
-	dosym "${CAM540_FW_NAME}-${CAM540_FW_VER}.dat" \
-		"/lib/firmware/aver/${CAM540_FW_NAME}-latest.dat"
-
-	doins "${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.dat"
-	dosym "${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.dat" \
-		"/lib/firmware/aver/${CAM340PLUS_FW_NAME}-latest.dat"
-}
diff --git a/sys-firmware/aver-firmware/aver-firmware-1.0.4-r1.ebuild b/sys-firmware/aver-firmware/aver-firmware-1.0.4-r1.ebuild
new file mode 120000
index 0000000..d984e8d
--- /dev/null
+++ b/sys-firmware/aver-firmware/aver-firmware-1.0.4-r1.ebuild
@@ -0,0 +1 @@
+aver-firmware-1.0.4.ebuild
\ No newline at end of file
diff --git a/sys-firmware/aver-firmware/aver-firmware-1.0.4.ebuild b/sys-firmware/aver-firmware/aver-firmware-1.0.4.ebuild
new file mode 100644
index 0000000..610c0eb
--- /dev/null
+++ b/sys-firmware/aver-firmware/aver-firmware-1.0.4.ebuild
@@ -0,0 +1,43 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+DESCRIPTION="AVer firmware"
+
+CAM520_FW_VER="0.0.0018.36"
+CAM540_FW_VER="0.0.6002.96"
+CAM340PLUS_FW_VER="0.0.1000.34"
+
+CAM520_FW_NAME="aver-cam520"
+CAM540_FW_NAME="aver-cam540"
+CAM340PLUS_FW_NAME="aver-cam340plus"
+
+SRC_URI="gs://chromeos-localmirror/distfiles/${CAM520_FW_NAME}-${CAM520_FW_VER}.tar.xz
+	gs://chromeos-localmirror/distfiles/${CAM540_FW_NAME}-${CAM540_FW_VER}.tar.xz
+	gs://chromeos-localmirror/distfiles/${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.tar.xz"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="sys-apps/aver-updater"
+DEPEND=""
+
+S="${WORKDIR}"
+
+src_install() {
+	insinto /lib/firmware/aver
+
+	doins "${CAM520_FW_NAME}-${CAM520_FW_VER}.dat"
+	dosym "${CAM520_FW_NAME}-${CAM520_FW_VER}.dat" \
+		"/lib/firmware/aver/${CAM520_FW_NAME}-latest.dat"
+
+	doins "${CAM540_FW_NAME}-${CAM540_FW_VER}.dat"
+	dosym "${CAM540_FW_NAME}-${CAM540_FW_VER}.dat" \
+		"/lib/firmware/aver/${CAM540_FW_NAME}-latest.dat"
+
+	doins "${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.dat"
+	dosym "${CAM340PLUS_FW_NAME}-${CAM340PLUS_FW_VER}.dat" \
+		"/lib/firmware/aver/${CAM340PLUS_FW_NAME}-latest.dat"
+}
diff --git a/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r22.ebuild b/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r22.ebuild
deleted file mode 100644
index ba09ee0..0000000
--- a/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r22.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Increment the "eclass bug workaround count" below when you change
-# "cros-ec-release.eclass" to work around http://crbug.com/220902.
-#
-# eclass bug workaround count: 1
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("22ad3ce20ae199e9177a1cc63d2d170fa63f9eea" "872d8d0beabd9a81c08fc34ec83285c690228aa8" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("2acece20af8307f916adbe1850384fe42f618e4f" "f70af34770002df8ef3951dfdf5a6c18d42a5dda" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-FIRMWARE_EC_BOARD="bloonchipper"
-FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
-FIRMWARE_EC_RELEASE_RO_VERSION="${FPMCU_FIRMWARE_BLOONCHIPPER_RO_VERSION}"
-
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/tpm2"
-	"chromiumos/third_party/cryptoc"
-)
-
-CROS_WORKON_LOCALNAME=(
-	"../platform/release-firmware/fpmcu-bloonchipper"
-	"tpm2"
-	"cryptoc"
-)
-
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/tpm2"
-	"${S}/third_party/cryptoc"
-)
-
-CROS_WORKON_EGIT_BRANCH=(
-	"firmware-fpmcu-bloonchipper-release"
-	"master"
-	"master"
-)
-
-inherit cros-workon cros-ec-release
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
-LICENSE="BSD-Google"
-KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r29.ebuild b/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r29.ebuild
new file mode 100644
index 0000000..53671a4
--- /dev/null
+++ b/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-0.0.1-r29.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec-release.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 3
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("b47fb93f92cb6ac9e737f51ca229a8d12d533179" "0217366d293dc71f7873d0a879384c0336ebdd7b" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("8153273126093f8370ddcbdc06a2a63e7832469b" "8e2ebe98fade4195aac74d52d0647b116b0165c5" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+FIRMWARE_EC_BOARD="bloonchipper"
+FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/tpm2"
+	"chromiumos/third_party/cryptoc"
+)
+
+CROS_WORKON_LOCALNAME=(
+	"../platform/release-firmware/fpmcu-bloonchipper"
+	"tpm2"
+	"cryptoc"
+)
+
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/tpm2"
+	"${S}/third_party/cryptoc"
+)
+
+CROS_WORKON_EGIT_BRANCH=(
+	"firmware-fpmcu-bloonchipper-release"
+	"master"
+	"master"
+)
+
+inherit cros-workon cros-ec-release
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
+LICENSE="BSD-Google"
+KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-9999.ebuild b/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-9999.ebuild
index 59cf638..631a914 100644
--- a/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-9999.ebuild
+++ b/sys-firmware/chromeos-fpmcu-release-bloonchipper/chromeos-fpmcu-release-bloonchipper-9999.ebuild
@@ -4,13 +4,12 @@
 # Increment the "eclass bug workaround count" below when you change
 # "cros-ec-release.eclass" to work around http://crbug.com/220902.
 #
-# eclass bug workaround count: 1
+# eclass bug workaround count: 3
 
 EAPI=7
 
 FIRMWARE_EC_BOARD="bloonchipper"
 FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
-FIRMWARE_EC_RELEASE_RO_VERSION="${FPMCU_FIRMWARE_BLOONCHIPPER_RO_VERSION}"
 
 CROS_WORKON_PROJECT=(
 	"chromiumos/platform/ec"
diff --git a/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r16.ebuild b/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r16.ebuild
deleted file mode 100644
index 54505cb..0000000
--- a/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r16.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Increment the "eclass bug workaround count" below when you change
-# "cros-ec-release.eclass" to work around http://crbug.com/220902.
-#
-# eclass bug workaround count: 2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("9c45fb4b3d9beb53fcca077752725207d364b755" "872d8d0beabd9a81c08fc34ec83285c690228aa8" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("e1bf1102d6a4ea7e7491995ce8344da837ae265f" "f70af34770002df8ef3951dfdf5a6c18d42a5dda" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-FIRMWARE_EC_BOARD="dartmonkey"
-FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
-
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/tpm2"
-	"chromiumos/third_party/cryptoc"
-)
-
-CROS_WORKON_LOCALNAME=(
-	"../platform/release-firmware/fpmcu-dartmonkey"
-	"tpm2"
-	"cryptoc"
-)
-
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/tpm2"
-	"${S}/third_party/cryptoc"
-)
-
-CROS_WORKON_EGIT_BRANCH=(
-	"firmware-fpmcu-dartmonkey-release"
-	"master"
-	"master"
-)
-
-inherit cros-workon cros-ec-release
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
-LICENSE="BSD-Google"
-KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r23.ebuild b/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r23.ebuild
new file mode 100644
index 0000000..b65e4e9
--- /dev/null
+++ b/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-0.0.1-r23.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec-release.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 3
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("abdb493fdaf8e9a0fb9b3117bc6d085faec961b2" "0217366d293dc71f7873d0a879384c0336ebdd7b" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("8153273126093f8370ddcbdc06a2a63e7832469b" "8e2ebe98fade4195aac74d52d0647b116b0165c5" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+FIRMWARE_EC_BOARD="dartmonkey"
+FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/tpm2"
+	"chromiumos/third_party/cryptoc"
+)
+
+CROS_WORKON_LOCALNAME=(
+	"../platform/release-firmware/fpmcu-dartmonkey"
+	"tpm2"
+	"cryptoc"
+)
+
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/tpm2"
+	"${S}/third_party/cryptoc"
+)
+
+CROS_WORKON_EGIT_BRANCH=(
+	"firmware-fpmcu-dartmonkey-release"
+	"master"
+	"master"
+)
+
+inherit cros-workon cros-ec-release
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
+LICENSE="BSD-Google"
+KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-9999.ebuild b/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-9999.ebuild
index 41a7215..fb86ce8 100644
--- a/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-9999.ebuild
+++ b/sys-firmware/chromeos-fpmcu-release-dartmonkey/chromeos-fpmcu-release-dartmonkey-9999.ebuild
@@ -4,7 +4,7 @@
 # Increment the "eclass bug workaround count" below when you change
 # "cros-ec-release.eclass" to work around http://crbug.com/220902.
 #
-# eclass bug workaround count: 2
+# eclass bug workaround count: 3
 
 EAPI=7
 
diff --git a/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r15.ebuild b/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r15.ebuild
deleted file mode 100644
index fb25cd2..0000000
--- a/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r15.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Increment the "eclass bug workaround count" below when you change
-# "cros-ec-release.eclass" to work around http://crbug.com/220902.
-#
-# eclass bug workaround count: 2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("9c45fb4b3d9beb53fcca077752725207d364b755" "872d8d0beabd9a81c08fc34ec83285c690228aa8" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("e1bf1102d6a4ea7e7491995ce8344da837ae265f" "f70af34770002df8ef3951dfdf5a6c18d42a5dda" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-FIRMWARE_EC_BOARD="nami_fp"
-FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
-
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/tpm2"
-	"chromiumos/third_party/cryptoc"
-)
-
-CROS_WORKON_LOCALNAME=(
-	"../platform/release-firmware/fpmcu-nami"
-	"tpm2"
-	"cryptoc"
-)
-
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/tpm2"
-	"${S}/third_party/cryptoc"
-)
-
-CROS_WORKON_EGIT_BRANCH=(
-	"firmware-fpmcu-dartmonkey-release"
-	"master"
-	"master"
-)
-
-inherit cros-workon cros-ec-release
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
-LICENSE="BSD-Google"
-KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r22.ebuild b/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r22.ebuild
new file mode 100644
index 0000000..2be08ec6
--- /dev/null
+++ b/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-0.0.1-r22.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec-release.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 3
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("abdb493fdaf8e9a0fb9b3117bc6d085faec961b2" "0217366d293dc71f7873d0a879384c0336ebdd7b" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("8153273126093f8370ddcbdc06a2a63e7832469b" "8e2ebe98fade4195aac74d52d0647b116b0165c5" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+FIRMWARE_EC_BOARD="nami_fp"
+FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/tpm2"
+	"chromiumos/third_party/cryptoc"
+)
+
+CROS_WORKON_LOCALNAME=(
+	"../platform/release-firmware/fpmcu-nami"
+	"tpm2"
+	"cryptoc"
+)
+
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/tpm2"
+	"${S}/third_party/cryptoc"
+)
+
+CROS_WORKON_EGIT_BRANCH=(
+	"firmware-fpmcu-dartmonkey-release"
+	"master"
+	"master"
+)
+
+inherit cros-workon cros-ec-release
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
+LICENSE="BSD-Google"
+KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-9999.ebuild b/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-9999.ebuild
index e0f6670..0b2599e 100644
--- a/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-9999.ebuild
+++ b/sys-firmware/chromeos-fpmcu-release-nami/chromeos-fpmcu-release-nami-9999.ebuild
@@ -4,7 +4,7 @@
 # Increment the "eclass bug workaround count" below when you change
 # "cros-ec-release.eclass" to work around http://crbug.com/220902.
 #
-# eclass bug workaround count: 2
+# eclass bug workaround count: 3
 
 EAPI=7
 
diff --git a/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r15.ebuild b/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r15.ebuild
deleted file mode 100644
index 186395b..0000000
--- a/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r15.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-# Increment the "eclass bug workaround count" below when you change
-# "cros-ec-release.eclass" to work around http://crbug.com/220902.
-#
-# eclass bug workaround count: 2
-
-EAPI=7
-
-CROS_WORKON_COMMIT=("9c45fb4b3d9beb53fcca077752725207d364b755" "872d8d0beabd9a81c08fc34ec83285c690228aa8" "1e2e9d7183f545eefd1a86a07b0ab6f91d837a6c")
-CROS_WORKON_TREE=("e1bf1102d6a4ea7e7491995ce8344da837ae265f" "f70af34770002df8ef3951dfdf5a6c18d42a5dda" "fdbc51bbd5a7ee9d532ea1aa30cf21e57ca199db")
-FIRMWARE_EC_BOARD="nocturne_fp"
-FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
-
-CROS_WORKON_PROJECT=(
-	"chromiumos/platform/ec"
-	"chromiumos/third_party/tpm2"
-	"chromiumos/third_party/cryptoc"
-)
-
-CROS_WORKON_LOCALNAME=(
-	"../platform/release-firmware/fpmcu-nocturne"
-	"tpm2"
-	"cryptoc"
-)
-
-CROS_WORKON_DESTDIR=(
-	"${S}/platform/ec"
-	"${S}/third_party/tpm2"
-	"${S}/third_party/cryptoc"
-)
-
-CROS_WORKON_EGIT_BRANCH=(
-	"firmware-fpmcu-dartmonkey-release"
-	"master"
-	"master"
-)
-
-inherit cros-workon cros-ec-release
-
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
-LICENSE="BSD-Google"
-KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r22.ebuild b/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r22.ebuild
new file mode 100644
index 0000000..608ded9
--- /dev/null
+++ b/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-0.0.1-r22.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+# Increment the "eclass bug workaround count" below when you change
+# "cros-ec-release.eclass" to work around http://crbug.com/220902.
+#
+# eclass bug workaround count: 3
+
+EAPI=7
+
+CROS_WORKON_COMMIT=("abdb493fdaf8e9a0fb9b3117bc6d085faec961b2" "0217366d293dc71f7873d0a879384c0336ebdd7b" "3c5ce9a1c631043476c0f52bad47f241680cc053")
+CROS_WORKON_TREE=("8153273126093f8370ddcbdc06a2a63e7832469b" "8e2ebe98fade4195aac74d52d0647b116b0165c5" "86f00f9caaf3655e9dd1cc01c05ac4662fa3dae5")
+FIRMWARE_EC_BOARD="nocturne_fp"
+FIRMWARE_EC_RELEASE_REPLACE_RO="yes"
+
+CROS_WORKON_PROJECT=(
+	"chromiumos/platform/ec"
+	"chromiumos/third_party/tpm2"
+	"chromiumos/third_party/cryptoc"
+)
+
+CROS_WORKON_LOCALNAME=(
+	"../platform/release-firmware/fpmcu-nocturne"
+	"tpm2"
+	"cryptoc"
+)
+
+CROS_WORKON_DESTDIR=(
+	"${S}/platform/ec"
+	"${S}/third_party/tpm2"
+	"${S}/third_party/cryptoc"
+)
+
+CROS_WORKON_EGIT_BRANCH=(
+	"firmware-fpmcu-dartmonkey-release"
+	"master"
+	"master"
+)
+
+inherit cros-workon cros-ec-release
+
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/ec/+/master/README.md"
+LICENSE="BSD-Google"
+KEYWORDS="*"
diff --git a/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-9999.ebuild b/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-9999.ebuild
index c9f1a68..d037cfc 100644
--- a/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-9999.ebuild
+++ b/sys-firmware/chromeos-fpmcu-release-nocturne/chromeos-fpmcu-release-nocturne-9999.ebuild
@@ -4,7 +4,7 @@
 # Increment the "eclass bug workaround count" below when you change
 # "cros-ec-release.eclass" to work around http://crbug.com/220902.
 #
-# eclass bug workaround count: 2
+# eclass bug workaround count: 3
 
 EAPI=7
 
diff --git a/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r23.ebuild b/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r23.ebuild
deleted file mode 100644
index 728f643..0000000
--- a/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r23.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-CROS_WORKON_COMMIT="4a382fb97c9d25d3406547c2ef182d25bea85718"
-CROS_WORKON_TREE="86c8cdb230be6edd6ac4510cc2b4c2193486647e"
-CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
-CROS_WORKON_LOCALNAME="../platform/crostestutils"
-
-CROS_GO_WORKSPACE="${S}/go"
-CROS_GO_BINARIES=(
-	"firmware/cmd/dut_info:/usr/bin/fw_dut_info"
-	"firmware/cmd/e2e_coverage_summarizer:/usr/bin/fw_e2e_coverage_summarizer"
-	"firmware/cmd/lab_triage_helper:/usr/bin/fw_lab_triage_helper"
-)
-
-inherit cros-go cros-workon
-
-DESCRIPTION="Tooling related to firmware release testing."
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/refs/heads/master/go/src/firmware/"
-
-LICENSE="BSD-Google"
-SLOT="0/0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	dev-go/crypto:=
-	dev-go/gapi-discovery:=
-	dev-go/gapi-option:="
-RDEPEND=""
diff --git a/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r29.ebuild b/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r29.ebuild
new file mode 100644
index 0000000..6cc753c
--- /dev/null
+++ b/sys-firmware/fw-engprod-tools/fw-engprod-tools-0.0.1-r29.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_COMMIT="110e8dfe269f7adef222713eba02dac64ecac7d8"
+CROS_WORKON_TREE="8146f648468b544a50e01b7ee01b268db5e744ea"
+CROS_WORKON_PROJECT="chromiumos/platform/crostestutils"
+CROS_WORKON_LOCALNAME="../platform/crostestutils"
+
+CROS_GO_WORKSPACE="${S}/go"
+CROS_GO_BINARIES=(
+	"firmware/cmd/dut_info:/usr/bin/fw_dut_info"
+	"firmware/cmd/e2e_coverage_summarizer:/usr/bin/fw_e2e_coverage_summarizer"
+	"firmware/cmd/lab_triage_helper:/usr/bin/fw_lab_triage_helper"
+)
+
+inherit cros-go cros-workon
+
+DESCRIPTION="Tooling related to firmware release testing."
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/crostestutils/+/refs/heads/master/go/src/firmware/"
+
+LICENSE="BSD-Google"
+SLOT="0/0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	dev-go/crypto:=
+	dev-go/gapi-discovery:=
+	dev-go/gapi-option:="
+RDEPEND=""
diff --git a/sys-firmware/parade-ps8705a2-firmware/Manifest b/sys-firmware/parade-ps8705a2-firmware/Manifest
new file mode 100644
index 0000000..5ed4830
--- /dev/null
+++ b/sys-firmware/parade-ps8705a2-firmware/Manifest
@@ -0,0 +1 @@
+DIST parade-ps8705a2-firmware-2.tar.xz 3104 BLAKE2B 41541f277a9fc0d06dc0b721b92c0861e74700b028d6034a24b789e297228f219d4398bff9f7b8d98a473a6da4324365aaf33b3a01fad1ce596ebc09917f73c1 SHA512 b7603fd77c24621f305f57153968290e9cdf1ac0cb063eb923f970cb0710646a5da10ec36f7c159184b6baaa866560cce98b243b71b293fe1f03bc11e50ba4dd
diff --git a/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2-r1.ebuild b/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2-r1.ebuild
new file mode 120000
index 0000000..70ad252
--- /dev/null
+++ b/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2-r1.ebuild
@@ -0,0 +1 @@
+parade-ps8705a2-firmware-2.ebuild
\ No newline at end of file
diff --git a/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2.ebuild b/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2.ebuild
new file mode 100644
index 0000000..21e6ca9
--- /dev/null
+++ b/sys-firmware/parade-ps8705a2-firmware/parade-ps8705a2-firmware-2.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="PS8705-A2 Firmware Binary"
+SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.xz"
+
+LICENSE="Google-Partners-Website"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+S="${WORKDIR}"
+
+DEPEND=""
+RDEPEND="${DEPEND}"
+
+# Here are the steps to uprev the PS8705 firmware.
+#
+# 1) Unzip the .zip file emailed from the vendor.
+# 2) Convert from hex to bin.
+#    ex: objcopy -I ihex --output-target=binary PS8705_FW_0x03_20200116_2.hex \
+#          parade-ps8705a2-firmware-3/ps8705_a2_0x03.bin
+# 3) Tarball it up using XZ, including the right directory.
+#    ex: tar -cJf parade-ps8705a2-firmware-3.tar.xz \
+#          parade-ps8705a2-firmware-3/ps8705_a2_0x03.bin
+# 4) Then upload it at https://pantheon.corp.google.com/storage/browser/chromeos-localmirror/distfiles
+# 5) On the uploaded file, click the three-dot-menu, "Edit Permissions", and
+#    add a new entry for Public "allUsers" with Reader permission.
+# 6) Finally run `ebuild parade-ps8705a2-firmware-2.ebuild manifest`
+src_install() {
+	local fw_rev_hex=$(printf '%02x' "${PV}")
+	local bf=ps8705_a2.bin
+	local hf=ps8705_a2.hash
+
+	printf '0xa2 0x%02x' "${fw_rev_hex}" | xxd -r > "${hf}"
+	insinto /firmware/ps8705
+	newins "${hf}" "${hf}"
+	newins "${P}/ps8705_a2_0x${fw_rev_hex}.bin" "${bf}"
+}
diff --git a/sys-firmware/parade-ps8755a2-firmware/Manifest b/sys-firmware/parade-ps8755a2-firmware/Manifest
new file mode 100644
index 0000000..272f822
--- /dev/null
+++ b/sys-firmware/parade-ps8755a2-firmware/Manifest
@@ -0,0 +1 @@
+DIST parade-ps8755a2-firmware-2.tar.xz 3180 BLAKE2B efa21858b947e333c6c2e5a66afa977683da85fdd3538d21ccbf8b51ecbe0cd6855fb988179b7ababd02c5998b075c235171617001e394e372795284c267163c SHA512 b254991a35a7c15c1d16064a46dea07ec4fa36b66badf203761b307381fc2ae063233e15b8500e676c47fb239e102e836279ab00004ed00b851b316f29ef4ec8
diff --git a/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2-r1.ebuild b/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2-r1.ebuild
new file mode 120000
index 0000000..32f2a59
--- /dev/null
+++ b/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2-r1.ebuild
@@ -0,0 +1 @@
+parade-ps8755a2-firmware-2.ebuild
\ No newline at end of file
diff --git a/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2.ebuild b/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2.ebuild
new file mode 100644
index 0000000..3e4d963
--- /dev/null
+++ b/sys-firmware/parade-ps8755a2-firmware/parade-ps8755a2-firmware-2.ebuild
@@ -0,0 +1,41 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="PS8755-A2 Firmware Binary"
+SRC_URI="gs://chromeos-localmirror/distfiles/${P}.tar.xz"
+
+LICENSE="Google-Partners-Website"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+S="${WORKDIR}"
+
+DEPEND=""
+RDEPEND="${DEPEND}"
+
+# Here are the steps to uprev the PS8755 firmware.
+#
+# 1) Unzip the .zip file emailed from the vendor.
+# 2) Convert from hex to bin.
+#    ex: objcopy -I ihex --output-target=binary PS8755_FW_0x02_20200813.hex \
+#          parade-ps8755a2-firmware-2/ps8755_a2_0x02.bin
+# 3) Tarball it up using XZ, including the right directory.
+#    ex: tar -cJf parade-ps8755a2-firmware-2.tar.xz \
+#          parade-ps8755a2-firmware-2/ps8755_a2_0x02.bin
+# 4) Then upload it at https://pantheon.corp.google.com/storage/browser/chromeos-localmirror/distfiles
+# 5) On the uploaded file, click the three-dot-menu, "Edit Permissions", and
+#    add a new entry for Public "allUsers" with Reader permission.
+# 6) Finally run `ebuild parade-ps8755a2-firmware-2.ebuild manifest`
+src_install() {
+	local fw_rev_hex=$(printf '%02x' "${PV}")
+	local bf=ps8755_a2.bin
+	local hf=ps8755_a2.hash
+
+	printf '0xa2 0x%02x' "${fw_rev_hex}" | xxd -r > "${hf}"
+	insinto /firmware/ps8755
+	newins "${hf}" "${hf}"
+	newins "${P}/ps8755_a2_0x${fw_rev_hex}.bin" "${bf}"
+}
diff --git a/sys-firmware/parade-ps8815a1-firmware/Manifest b/sys-firmware/parade-ps8815a1-firmware/Manifest
index 794e05e..c98c39b 100644
--- a/sys-firmware/parade-ps8815a1-firmware/Manifest
+++ b/sys-firmware/parade-ps8815a1-firmware/Manifest
@@ -1,2 +1,3 @@
+DIST parade-ps8815a1-firmware-10.tar.xz 4004 BLAKE2B 16b9e0664b8f28a514849bd52e9cdc2c9f59122661033a124c383183a184a44baa92713447d9f7d46a74c9e2dd6a3571275180b4b998704e1339f4f34ba34786 SHA512 8117030b1aac46d4b2ac3771a78c34374dac5d7fee00842b562196ebcac6778eecf1c37677da04b94c9b588a5dc8fd86d84aa3e674bd5aed6c612a746e473081
 DIST parade-ps8815a1-firmware-6.tar.xz 3800 BLAKE2B 64462069fd3462570490ed63ed064e33dc4029f0de2f2a1b6b8895b6d2dc3ca66f7bd6faa532861c6472549729364951694ee98ca57952eb2c8def5e42cf27e6 SHA512 e95d608ccf1185d66dd8b4638de837e6b89c00120a5100e32b79187d8972a96a34a74e1e4ba44b104215a5b66d5e7d5e17ceab12a81657bcf2bda5f520bfc72b
 DIST parade-ps8815a1-firmware-7.tar.xz 3816 BLAKE2B c9f805da0d1d38d2507ec63c50661203c1a1184819beffb11aae476f8d320d171af0a190c85a5a0e714576fddf2a33c0d2e42520ef8705d79f12c2b2e7be7fc2 SHA512 504c210892f91c0ab62eae13cde432eb28deef0c871bb816f0872388e5a54d72f862b70151ed49dbfa957cb5a9dee984a05f29a7224dbbeebc1686b9a7cceea0
diff --git a/sys-firmware/parade-ps8815a1-firmware/parade-ps8815a1-firmware-10-r1.ebuild b/sys-firmware/parade-ps8815a1-firmware/parade-ps8815a1-firmware-10-r1.ebuild
new file mode 120000
index 0000000..8bac4d7
--- /dev/null
+++ b/sys-firmware/parade-ps8815a1-firmware/parade-ps8815a1-firmware-10-r1.ebuild
@@ -0,0 +1 @@
+parade-ps8815a1-firmware-6.ebuild
\ No newline at end of file
diff --git a/sys-firmware/servo-firmware/Manifest b/sys-firmware/servo-firmware/Manifest
index 34ac3d8..a73c35d 100644
--- a/sys-firmware/servo-firmware/Manifest
+++ b/sys-firmware/servo-firmware/Manifest
@@ -1,5 +1,5 @@
-DIST c2d2_v2.4.24-c281b1c5d.tar.xz 30452 BLAKE2B ac4e3c5c4a7acff22148415d450d0771282ca3847c1b8cdf5a3c523a166946b2d6b65b2d2e868caac06997ee7571c91667fbe2633a781044ee2618273b868787 SHA512 ac3e8fd6b7b61bbfd2245bbd222561e8db74592a4c7f76cad383af0a4fe5abd7fcb4e62ea064553c639cf1aa84755d940bd8e0f172961412c864b75a6590b3fb
-DIST servo_micro_v2.4.17-df61092c3.tar.gz 57384 BLAKE2B 5ce111d18302bd942224f6b860d6410d153f8364487fa40d8ad7643c8437cc0920250a45ad8af7f1af23542846e951d178aed709b442f9073a1367b5be493297 SHA512 573aeb453e74856276294d6cc5548fb43a22fa21b3712bc87677206d5bcc3ddf3bfd947d84e5a68dbdd8e6213a8ddd49a116b5f955cfbc551379bff062185e11
-DIST servo_v4_v2.4.17-df61092c3.tar.gz 83897 BLAKE2B cce5f15524477d8f90ca50c20beacc275c918807b47bd8e4dcf6043bd33cbd5712dacb118af8d49a422950ed1d1767360dc6329cd4914539a7cc58316cc6a62c SHA512 733399876181ad3277f015089d39d962f4c334a4653e22c100ac189f7244b83f43b82bd8d9710c3dd93e33bfa2940680e0eed239bf8a7f369ada12a7e3373d1d
-DIST servo_v4p1_v2.0.4232-514cb4e92.tar.gz 67678 BLAKE2B d6376f1dfa0924f1f4f0a50ffc1dd9887bdb681eda54b5a94cb0c3f435134c9b7e50091b512889e8a4d099252b029e5652c17a27b8e98db1427c1ad40ad0bb91 SHA512 b2f5a9fa8d16227787579c3019e2bf7b149183513a89d3513266234d6558a22c0a77c24825c1d03db508e53235ef767733c1f51fa374ed6e2050d5a51b812f4b
+DIST c2d2_v2.4.35-f1113c92b.tar.gz 66757 BLAKE2B bc382554ae413f62f6e2217f154adf3b7a8e881e5292d9d3d4f7e4de1f4e2744460cbaeadfb5d4b6a386b8935146560b51aea73f1a810728a81bfde2db26fe33 SHA512 4990d737299ad95d7232f320d5dc8e59f50d963a3f4c5fb3cbdfd8a4a6e62543d02ab9de00b65a0ab75c633e3bf2ad15711796269868f92407de3bb818b04829
+DIST servo_micro_v2.4.35-f1113c92b.tar.gz 58360 BLAKE2B 331bb81fd79cf5cf3be6b0b7aa417b23d977bc6e5c64a3b7fb72cf8b77d8e1f4ccb3909e9b980c615f26af5733cc9d82b47b57eb42de5a9de663b4a3ca89a895 SHA512 38cf32c70eff3d1ae34e1a8f3af8df64fc7501653985e58bb25f95a1cc265a3c652fb9accebaa763f62870e3852b29c864e10b0175405453e505124e20c58763
+DIST servo_v4_v2.4.35-f1113c92b.tar.gz 87098 BLAKE2B eb026de305cc894ae3555edbd3936bca1e27b4e52a3600047dde9f9733942a7f880c64e4fd94352a8987dde19c197dca6d35fa76e0b2b7d82c0577f992b8d058 SHA512 62a7bf03258b0cafde0d551410c4ebb73a9da520984f9f43683833eb4c99539824b78b5517dd860f95aa2b25839c19bed9661634a9666e1ebf062942c305202b
+DIST servo_v4p1_v2.0.5159-529612865.tar.xz 50568 BLAKE2B 025fd9ea1ae4742799745fae060937ecd5c059fdff5d9340e434c18f2e5b9ca95ee5a69e0384dcf6ada4445756e25a27906707658414be2f2178d82dd9b1a7fb SHA512 13950b4a10bde242107a933c36facd88be1dd7238692811e74634820ac574942a7c56c4b8bbc53505328cddd2b4bb8bec244b2ef76e35da43908e07823abb757
 DIST sweetberry_v2.3.7-096c7ee84.tar.gz 66715 BLAKE2B f2cc6a8d616c2d81920c18b44afc077e9f5bdce5fab9eae8564f34c14beeed56e71aaa745353b33161a13776291072d5426c8636ab9105863b60b574849aa9c2 SHA512 7c74e3f385536369f82eec37cc81941269e76c014e662b77d18fbc45107c348b4b6ebe15311517cfaf5824f88d4228448c832695e5692b49a64c87174284e8f0
diff --git a/sys-firmware/servo-firmware/servo-firmware-0.0.1-r21.ebuild b/sys-firmware/servo-firmware/servo-firmware-0.0.1-r26.ebuild
similarity index 100%
rename from sys-firmware/servo-firmware/servo-firmware-0.0.1-r21.ebuild
rename to sys-firmware/servo-firmware/servo-firmware-0.0.1-r26.ebuild
diff --git a/sys-firmware/servo-firmware/servo-firmware-0.0.1.ebuild b/sys-firmware/servo-firmware/servo-firmware-0.0.1.ebuild
index 97b2158..0f4424c 100644
--- a/sys-firmware/servo-firmware/servo-firmware-0.0.1.ebuild
+++ b/sys-firmware/servo-firmware/servo-firmware-0.0.1.ebuild
@@ -6,20 +6,20 @@
 DESCRIPTION="Firmware for tools based on Chromium OS EC"
 HOMEPAGE="https://www.chromium.org/chromium-os/ec-development"
 
-C2D2_NAME="c2d2_v2.4.24-c281b1c5d"
-SERVO_MICRO_NAME="servo_micro_v2.4.17-df61092c3"  # servo-firmware-R81-12768.20.0
-SERVO_V4_NAME="servo_v4_v2.4.17-df61092c3"        # servo-firmware-R81-12768.20.0
-SERVO_V4P1_NAME="servo_v4p1_v2.0.4232-514cb4e92"  # Local builds are temporary b/153464312
+C2D2_NAME="c2d2_v2.4.35-f1113c92b"                # servo-firmware-R81-12768.40.0
+SERVO_MICRO_NAME="servo_micro_v2.4.35-f1113c92b"  # servo-firmware-R81-12768.40.0
+SERVO_V4_NAME="servo_v4_v2.4.35-f1113c92b"        # servo-firmware-R81-12768.40.0
+SERVO_V4P1_NAME="servo_v4p1_v2.0.5159-529612865"  # Local builds are temporary b/153464312
 SWEETBERRY_NAME="sweetberry_v2.3.7-096c7ee84"     # servo-firmware-R70-11011.14.0
 UPDATER_PATH="/usr/share/servo_updater/firmware"
 
 MIRROR_PATH="gs://chromeos-localmirror/distfiles/"
 
 SRC_URI="
-	${MIRROR_PATH}/${C2D2_NAME}.tar.xz
+	${MIRROR_PATH}/${C2D2_NAME}.tar.gz
 	${MIRROR_PATH}/${SERVO_MICRO_NAME}.tar.gz
 	${MIRROR_PATH}/${SERVO_V4_NAME}.tar.gz
-	${MIRROR_PATH}/${SERVO_V4P1_NAME}.tar.gz
+	${MIRROR_PATH}/${SERVO_V4P1_NAME}.tar.xz
 	${MIRROR_PATH}/${SWEETBERRY_NAME}.tar.gz
 	"
 
diff --git a/sys-fs/avfs/OWNERS b/sys-fs/avfs/OWNERS
new file mode 100644
index 0000000..cd9ddc6
--- /dev/null
+++ b/sys-fs/avfs/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cros-disks/OWNERS
diff --git a/sys-fs/fuse-zip/files/fuse-zip-0.7.0-deduplicate-filenames.patch b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-deduplicate-filenames.patch
new file mode 100644
index 0000000..fe6e7fd
--- /dev/null
+++ b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-deduplicate-filenames.patch
@@ -0,0 +1,205 @@
+From 64d6690e2d18ab45d7411114f9103c920995fc28 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Thu, 17 Sep 2020 18:06:27 +1000
+Subject: [PATCH] Deduplicate file names
+
+---
+ lib/fileNode.cpp    | 27 ++++++--------------------
+ lib/fileNode.h      |  9 ++++-----
+ lib/fuse-zip.cpp    |  4 ++--
+ lib/fuseZipData.cpp | 47 ++++++++++++++++++++++++++++-----------------
+ lib/fuseZipData.h   |  6 +++++-
+ 5 files changed, 46 insertions(+), 47 deletions(-)
+
+diff --git a/lib/fileNode.cpp b/lib/fileNode.cpp
+index aeb66ec..acfd4c3 100644
+--- a/lib/fileNode.cpp
++++ b/lib/fileNode.cpp
+@@ -91,7 +91,6 @@ FileNode *FileNode::createDir(struct zip *zip, const char *fname,
+ FileNode *FileNode::createRootNode(struct zip *zip) {
+     auto data = DataNode::createNew(S_IFDIR | 0755, 0, 0, 0);
+     FileNode *n = new FileNode(zip, "", ROOT_NODE_INDEX, std::move(data));
+-    n->name = n->full_name.c_str();
+ 
+     int len = 0;
+     n->m_comment = zip_get_archive_comment(zip, &len, ZIP_FL_ENC_RAW);
+@@ -139,26 +138,12 @@ FileNode::~FileNode() {
+ void FileNode::parse_name() {
+     assert(!full_name.empty());
+ 
+-    const char *lsl = full_name.c_str();
+-    while (*lsl++) {}
+-    lsl--;
+-    while (lsl > full_name.c_str() && *lsl != '/') {
+-        lsl--;
+-    }
+     // If the last symbol in file name is '/' then it is a directory
+-    if (*lsl == '/' && *(lsl+1) == '\0') {
+-        // It will produce two \0s at the end of file name. I think that
+-        // it is not a problem
+-        full_name[full_name.size() - 1] = 0;
+-        while (lsl > full_name.c_str() && *lsl != '/') {
+-            lsl--;
+-        }
+-    }
+-    // Setting short name of node
+-    if (*lsl == '/') {
+-        lsl++;
+-    }
+-    this->name = lsl;
++    if (full_name.back() == '/')
++        full_name.pop_back();
++
++    name_start = full_name.find_last_of('/') + 1;
++    assert(name_start <= full_name.size());
+ }
+ 
+ void FileNode::readComment() {
+@@ -374,7 +359,7 @@ int FileNode::updateExternalAttributes() const {
+         // FILE_ATTRIBUTE_DIRECTORY
+         mode |= 0x10;
+     }
+-    if (name[0] == '.') {
++    if (full_name[name_start] == '.') {
+         // FILE_ATTRIBUTE_HIDDEN
+         mode |= 2;
+     }
+diff --git a/lib/fileNode.h b/lib/fileNode.h
+index ab07cd9..e20cd0d 100644
+--- a/lib/fileNode.h
++++ b/lib/fileNode.h
+@@ -191,10 +191,9 @@ public:
+     /**
+      * Get parent name
+      */
+-    //TODO: rewrite without memory allocation
+-    inline std::string getParentName () const {
+-        if (name > full_name.c_str()) {
+-            return std::string (full_name, 0, static_cast<size_t>(name - full_name.c_str() - 1));
++    std::string getParentName() const {
++        if (name_start > 0) {
++            return std::string(full_name, 0, name_start - 1);
+         } else {
+             return "";
+         }
+@@ -230,7 +229,7 @@ public:
+     const char *getComment() const { return m_comment; }
+     uint16_t getCommentLength() const { return m_commentLen; }
+ 
+-    const char *name;
++    std::string::size_type name_start = 0;
+     std::string full_name;
+     nodelist_t childs;
+     FileNode *parent;
+diff --git a/lib/fuse-zip.cpp b/lib/fuse-zip.cpp
+index 840cd7e..6027824 100644
+--- a/lib/fuse-zip.cpp
++++ b/lib/fuse-zip.cpp
+@@ -168,8 +168,8 @@ int fusezip_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t o
+     }
+     filler(buf, ".", NULL, 0);
+     filler(buf, "..", NULL, 0);
+-    for (nodelist_t::const_iterator i = node->childs.begin(); i != node->childs.end(); ++i) {
+-        filler(buf, (*i)->name, NULL, 0);
++    for (const FileNode *p : node->childs) {
++        filler(buf, p->full_name.c_str() + p->name_start, NULL, 0);
+     }
+ 
+     return 0;
+diff --git a/lib/fuseZipData.cpp b/lib/fuseZipData.cpp
+index 117d288..8f0f0a7 100644
+--- a/lib/fuseZipData.cpp
++++ b/lib/fuseZipData.cpp
+@@ -289,22 +289,40 @@ mode_t FuseZipData::getEntryAttributes(zip_uint64_t id, const char *name, bool &
+     return mode;
+ }
+ 
++void FuseZipData::renameAndAttachNode(FileNode *node) {
++    std::string &f = node->full_name;
++    if (files.insert({f.c_str(), node}).second)
++        return;
++
++    // Duplicate file name
++    const std::string s = std::move(f);
++
++    // Find extension start
++    std::string::size_type e = s.find_last_of('.');
++    if (e <= node->name_start || e >= s.size() - 1)
++        e = s.size();
++
++    // Add a number before the extension
++    int i = 0;
++    do {
++        f.clear();
++        f.append(s, 0, e);
++        f.append(" (");
++        f.append(std::to_string(++i));
++        f.append(")");
++        f.append(s, e);
++    } while (!files.insert({f.c_str(), node}).second);
++}
++
+ void FuseZipData::attachNode(zip_int64_t id, const char *name, mode_t mode, bool readonly,
+             bool needPrefix, filemap_t &origNames)
+ {
+     std::string converted;
+     convertFileName(name, readonly, needPrefix, converted);
+     const char *cname = converted.c_str();
+-    if (files.find(cname) != files.end()) {
+-        throw ZipError(std::string("Duplicated file name: ") + cname,
+-                       ZIP_ER_EXISTS);
+-    }
+     FileNode *node = FileNode::createNodeForZipEntry(m_zip, cname, id, mode);
+-    if (node == NULL) {
+-        throw std::bad_alloc();
+-    }
+-    files[node->full_name.c_str()] = node;
+-    origNames[name] = node;
++    renameAndAttachNode(node);
++    origNames.insert({name, node});
+ }
+ 
+ bool FuseZipData::attachHardlink(zip_int64_t sid, const char *name, mode_t mode, bool readonly,
+@@ -367,16 +385,9 @@ bool FuseZipData::attachHardlink(zip_int64_t sid, const char *name, mode_t mode,
+     std::string converted;
+     convertFileName(name, readonly, needPrefix, converted);
+     const char *cname = converted.c_str();
+-    if (files.find(cname) != files.end()) {
+-        throw ZipError(std::string("Duplicated file name: ") + cname,
+-                       ZIP_ER_EXISTS);
+-    }
+     FileNode *node = FileNode::createHardlink(m_zip, cname, sid, it->second);
+-    if (node == NULL) {
+-        throw std::bad_alloc();
+-    }
+-    files[node->full_name.c_str()] = node;
+-    origNames[name] = node;
++    renameAndAttachNode(node);
++    origNames.insert({name, node});
+ 
+     return true;
+ }
+diff --git a/lib/fuseZipData.h b/lib/fuseZipData.h
+index e25c060..92d4191 100644
+--- a/lib/fuseZipData.h
++++ b/lib/fuseZipData.h
+@@ -66,6 +66,11 @@ private:
+      */
+     mode_t getEntryAttributes(zip_uint64_t id, const char *name, bool &isHardlink);
+ 
++    /**
++     * Attach a node, renaming it if necessary to prevent name collisions.
++     */
++    void renameAndAttachNode(FileNode *node);
++
+     /**
+      * create and attach file node
+      */
+@@ -143,4 +148,3 @@ public:
+ };
+ 
+ #endif
+-
+-- 
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/sys-fs/fuse-zip/files/fuse-zip-0.7.0-error-reporting.patch b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-error-reporting.patch
new file mode 100644
index 0000000..0d8235a
--- /dev/null
+++ b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-error-reporting.patch
@@ -0,0 +1,757 @@
+From 7325908b2c832e75ebbb703ae4edc491706b1eaf Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Mon, 29 Jun 2020 00:29:00 +1000
+Subject: [PATCH] Better error reporting via exceptions
+
+Added exception class ZipError to carry libzip error code.
+
+Made DataNode exception-transparent.
+
+Removed some try-catch thanks to the use of unique_ptr.
+
+If the ZIP archive cannot be opened and mounted, fuse-zip now returns
+different error codes depending on the underlying error condition.
+
+Ensured that C++ exceptions cannot escape from the following C-style
+FUSE callbacks: fusezip_open, fusezip_create, fusezip_mknod,
+fusezip_read, fusezip_write, fusezip_release, fusezip_ftruncate,
+fusezip_truncate and fusezip_rename. This pattern could (should) be
+applied to the rest of these FUSE callbacks.
+---
+ lib/dataNode.cpp    |  30 ++----
+ lib/fileNode.cpp    |  31 ------
+ lib/fuse-zip.cpp    | 240 ++++++++++++++++++++++----------------------
+ lib/fuseZipData.cpp |  30 +++---
+ lib/util.h          |  50 +++++++++
+ main.cpp            |  17 ++--
+ 6 files changed, 204 insertions(+), 194 deletions(-)
+
+diff --git a/lib/dataNode.cpp b/lib/dataNode.cpp
+index 17c94c2..0efd7bc 100644
+--- a/lib/dataNode.cpp
++++ b/lib/dataNode.cpp
+@@ -27,9 +27,6 @@
+ #include <cstring>
+ #include <ctime>
+ #include <memory>
+-#include <stdexcept>
+-
+-#include <syslog.h>
+ 
+ #include "dataNode.h"
+ #include "extraField.h"
+@@ -118,21 +115,13 @@ int DataNode::open(struct zip *zip) {
+     }
+     if (_state == NodeState::CLOSED) {
+         _open_count = 1;
+-        try {
+-            assert(zip != NULL);
+-            if (_size > std::numeric_limits<size_t>::max()) {
+-                return -ENOMEM;
+-            }
+-            assert(_id != FAKE_ID);
+-            _buffer.reset(new BigBuffer(zip, _id, static_cast<size_t>(_size)));
+-            _state = NodeState::OPENED;
+-        }
+-        catch (std::bad_alloc&) {
++        assert(zip != NULL);
++        if (_size > std::numeric_limits<size_t>::max()) {
+             return -ENOMEM;
+         }
+-        catch (std::exception&) {
+-            return -EIO;
+-        }
++        assert(_id != FAKE_ID);
++        _buffer.reset(new BigBuffer(zip, _id, static_cast<size_t>(_size)));
++        _state = NodeState::OPENED;
+     }
+     return 0;
+ }
+@@ -184,15 +173,10 @@ int DataNode::truncate(size_t offset) {
+         if (_state != NodeState::NEW) {
+             _state = NodeState::CHANGED;
+         }
+-        try {
+-            _buffer->truncate(offset);
+-            return 0;
+-        }
+-        catch (const std::bad_alloc &) {
+-            return EIO;
+-        }
++        _buffer->truncate(offset);
+         _mtime = currentTime();
+         _metadataChanged = true;
++        return 0;
+     } else {
+         return EBADF;
+     }
+diff --git a/lib/fileNode.cpp b/lib/fileNode.cpp
+index bd1538c..30c2975 100644
+--- a/lib/fileNode.cpp
++++ b/lib/fileNode.cpp
+@@ -54,22 +54,14 @@ FileNode *FileNode::createFile (struct zip *zip, const char *fname,
+         uid_t owner, gid_t group, mode_t mode, dev_t dev) {
+     auto data = DataNode::createNew(mode, owner, group, dev);
+     FileNode *n = new FileNode(zip, fname, NEW_NODE_INDEX, std::move(data));
+-    if (n == NULL) {
+-        return NULL;
+-    }
+     n->parse_name();
+-
+     return n;
+ }
+ 
+ FileNode *FileNode::createSymlink(struct zip *zip, const char *fname) {
+     auto data = DataNode::createNew(S_IFLNK | 0777, 0, 0, 0);
+     FileNode *n = new FileNode(zip, fname, NEW_NODE_INDEX, std::move(data));
+-    if (n == NULL) {
+-        return NULL;
+-    }
+     n->parse_name();
+-
+     return n;
+ }
+ 
+@@ -80,12 +72,8 @@ FileNode *FileNode::createIntermediateDir(struct zip *zip,
+         const char *fname) {
+     auto data = DataNode::createTmpDir(S_IFDIR | 0755, 0, 0, 0);
+     FileNode *n = new FileNode(zip, fname, TMP_DIR_INDEX, std::move(data));
+-    if (n == NULL) {
+-        return NULL;
+-    }
+     n->m_commentChanged = false;
+     n->parse_name();
+-
+     return n;
+ }
+ 
+@@ -95,21 +83,14 @@ FileNode *FileNode::createDir(struct zip *zip, const char *fname,
+     // FUSE does not pass S_IFDIR bit here
+     auto data = DataNode::createNew(S_IFDIR | mode, owner, group, 0);
+     FileNode *n = new FileNode(zip, fname, id, std::move(data));
+-    if (n == NULL) {
+-        return NULL;
+-    }
+     n->m_commentChanged = false;
+     n->parse_name();
+-
+     return n;
+ }
+ 
+ FileNode *FileNode::createRootNode(struct zip *zip) {
+     auto data = DataNode::createNew(S_IFDIR | 0755, 0, 0, 0);
+     FileNode *n = new FileNode(zip, "", ROOT_NODE_INDEX, std::move(data));
+-    if (n == NULL) {
+-        return NULL;
+-    }
+     n->name = n->full_name.c_str();
+ 
+     int len = 0;
+@@ -133,13 +114,8 @@ FileNode *FileNode::createNodeForZipEntry(struct zip *zip,
+     assert(id >= 0);
+     auto data = DataNode::createExisting(zip, static_cast<zip_uint64_t>(id), mode);
+     FileNode *n = new FileNode(zip, fname, id, data);
+-    if (n == NULL) {
+-        return NULL;
+-    }
+-
+     n->parse_name();
+     n->readComment();
+-
+     return n;
+ }
+ 
+@@ -147,13 +123,8 @@ FileNode *FileNode::createHardlink(struct zip *zip,
+             const char *fname, zip_int64_t id, FileNode *target) {
+     assert(id >= 0);
+     FileNode *n = new FileNode(zip, fname, id, target->_data);
+-    if (n == NULL) {
+-        return NULL;
+-    }
+-
+     n->parse_name();
+     n->readComment();
+-
+     return n;
+ }
+ 
+@@ -427,8 +398,6 @@ bool FileNode::setComment(const char *value, uint16_t length) {
+     char *newComment = NULL;
+     if (value != NULL) {
+         newComment = new char[length];
+-        if (newComment == NULL)
+-            return false;
+         memcpy(newComment, value, length);
+     }
+ 
+diff --git a/lib/fuse-zip.cpp b/lib/fuse-zip.cpp
+index 0db402e..ec9c3f8 100644
+--- a/lib/fuse-zip.cpp
++++ b/lib/fuse-zip.cpp
+@@ -41,70 +41,61 @@
+ #include <cstring>
+ #include <cstdlib>
+ #include <limits>
++#include <memory>
+ #include <queue>
+ 
+ #include "fuse-zip.h"
+ #include "types.h"
+ #include "fileNode.h"
+ #include "fuseZipData.h"
++#include "util.h"
+ 
+ static const char FILE_COMMENT_XATTR_NAME[] = "user.comment";
+ static const size_t FILE_COMMENT_XATTR_NAME_LENZ = 13; // length including NULL-byte
+ 
+ using namespace std;
+ 
+-//TODO: Move printf-s out this function
++// Converts a C++ exception into a negative error code. Logs the error to stderr
++// and syslog. Must be called from within a catch block.
++static int exceptionToError(const char *const action, const char *const file) {
++    const auto log = [action, file](const char *const reason) {
++        fprintf(stderr, "Cannot %s '%s': %s\n", action, file, reason);
++        syslog(LOG_ERR, "Cannot %s '%s': %s", action, file, reason);
++    };
++
++    try {
++        throw;
++    } catch (const std::bad_alloc &) {
++        log("No memory");
++        return -ENOMEM;
++    } catch (const std::exception &e) {
++        log(e.what());
++        return -EIO;
++    } catch (...) {
++        log("Unknown error");
++        return -EIO;
++    }
++}
++
+ FuseZipData *initFuseZip(const char *program, const char *fileName,
+-        bool readonly, bool force_precise_time) {
+-    FuseZipData *data = NULL;
++                         bool readonly, bool force_precise_time) {
++    (void)program;
+     int err;
+-    struct zip *zip_file;
+-    
+-    int flags = (readonly) ? ZIP_RDONLY : ZIP_CREATE;
+-    if ((zip_file = zip_open(fileName, flags, &err)) == NULL) {
+-        zip_error_t error;
+-        zip_error_init_with_code(&error, err);
+-        fprintf(stderr, "%s: cannot open ZIP archive %s: %s\n", program, fileName, zip_error_strerror(&error));
+-        zip_error_fini(&error);
+-        return data;
+-    }
++    const int flags = readonly ? ZIP_RDONLY : ZIP_CREATE;
++    struct zip *const zip_file = zip_open(fileName, flags, &err);
+ 
+-    try {
+-        // current working directory
+-        char *cwd = (char*)malloc(PATH_MAX + 1);
+-        if (cwd == NULL) {
+-            throw std::bad_alloc();
+-        }
+-        if (getcwd(cwd, PATH_MAX) == NULL) {
+-            perror(NULL);
+-            free(cwd);
+-            return data;
+-        }
++    if (!zip_file)
++        throw ZipError("Cannot open ZIP archive", err);
+ 
+-        data = new FuseZipData(fileName, zip_file, cwd, force_precise_time);
+-        free(cwd);
+-        if (data == NULL) {
+-            throw std::bad_alloc();
+-        }
+-        try {
+-            data->build_tree(readonly);
+-        }
+-        catch (...) {
+-            delete data;
+-            throw;
+-        }
+-    }
+-    catch (std::bad_alloc&) {
+-        syslog(LOG_ERR, "no enough memory");
+-        fprintf(stderr, "%s: no enough memory\n", program);
+-        return NULL;
+-    }
+-    catch (const std::exception &e) {
+-        syslog(LOG_ERR, "error opening ZIP file: %s", e.what());
+-        fprintf(stderr, "%s: unable to open ZIP file: %s\n", program, e.what());
+-        return NULL;
+-    }
+-    return data;
++    // current working directory
++    char cwd[PATH_MAX + 1];
++    if (!getcwd(cwd, PATH_MAX))
++        throw std::runtime_error("Cannot get current directory");
++
++    std::unique_ptr<FuseZipData> data(
++        new FuseZipData(fileName, zip_file, cwd, force_precise_time));
++    data->build_tree(readonly);
++    return data.release();
+ }
+ 
+ void *fusezip_init(struct fuse_conn_info *conn) {
+@@ -208,7 +199,7 @@ int fusezip_statfs(const char *path, struct statvfs *buf) {
+     return 0;
+ }
+ 
+-int fusezip_open(const char *path, struct fuse_file_info *fi) {
++int fusezip_open(const char *path, struct fuse_file_info *fi) try {
+     if (*path == '\0') {
+         return -ENOENT;
+     }
+@@ -221,18 +212,13 @@ int fusezip_open(const char *path, struct fuse_file_info *fi) {
+     }
+     fi->fh = (uint64_t)node;
+ 
+-    try {
+-        return node->open();
+-    }
+-    catch (std::bad_alloc&) {
+-        return -ENOMEM;
+-    }
+-    catch (std::exception&) {
+-        return -EIO;
+-    }
++    return node->open();
++} catch (...) {
++    return exceptionToError("open file", path);
+ }
+ 
+-int fusezip_create(const char *path, mode_t mode, struct fuse_file_info *fi) {
++int fusezip_create(const char *path, mode_t mode,
++                   struct fuse_file_info *fi) try {
+     if (*path == '\0') {
+         return -EACCES;
+     }
+@@ -240,18 +226,20 @@ int fusezip_create(const char *path, mode_t mode, struct fuse_file_info *fi) {
+     if (node != NULL) {
+         return -EEXIST;
+     }
+-    node = FileNode::createFile (get_zip(), path + 1,
+-            fuse_get_context()->uid, fuse_get_context()->gid, mode);
++    node = FileNode::createFile(get_zip(), path + 1, fuse_get_context()->uid,
++                                fuse_get_context()->gid, mode);
+     if (node == NULL) {
+         return -ENOMEM;
+     }
+-    get_data()->insertNode (node);
++    get_data()->insertNode(node);
+     fi->fh = (uint64_t)node;
+ 
+     return node->open();
++} catch (...) {
++    return exceptionToError("create file", path);
+ }
+ 
+-int fusezip_mknod(const char *path, mode_t mode, dev_t dev) {
++int fusezip_mknod(const char *path, mode_t mode, dev_t dev) try {
+     if (*path == '\0') {
+         return -EACCES;
+     }
+@@ -259,47 +247,55 @@ int fusezip_mknod(const char *path, mode_t mode, dev_t dev) {
+     if (node != NULL) {
+         return -EEXIST;
+     }
+-    node = FileNode::createFile (get_zip(), path + 1,
+-            fuse_get_context()->uid, fuse_get_context()->gid, mode, dev);
++    node = FileNode::createFile(get_zip(), path + 1, fuse_get_context()->uid,
++                                fuse_get_context()->gid, mode, dev);
+     if (node == NULL) {
+         return -ENOMEM;
+     }
+-    get_data()->insertNode (node);
++    get_data()->insertNode(node);
+ 
+     return 0;
++} catch (...) {
++    return exceptionToError("mknod", path);
+ }
+ 
+-int fusezip_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) {
+-    (void) path;
+-
++int fusezip_read(const char *path, char *buf, size_t size, off_t offset,
++                 struct fuse_file_info *fi) try {
+     if (offset < 0)
+         return -EINVAL;
+-    return ((FileNode*)fi->fh)->read(buf, size, static_cast<size_t>(offset));
++    return reinterpret_cast<FileNode *>(fi->fh)->read(
++        buf, size, static_cast<size_t>(offset));
++} catch (...) {
++    return exceptionToError("read file", path);
+ }
+ 
+-int fusezip_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) {
+-    (void) path;
+-
++int fusezip_write(const char *path, const char *buf, size_t size, off_t offset,
++                  struct fuse_file_info *fi) try {
+     if (offset < 0)
+         return -EINVAL;
+-    return ((FileNode*)fi->fh)->write(buf, size, static_cast<size_t>(offset));
++    return reinterpret_cast<FileNode *>(fi->fh)->write(
++        buf, size, static_cast<size_t>(offset));
++} catch (...) {
++    return exceptionToError("write file", path);
+ }
+ 
+-int fusezip_release (const char *path, struct fuse_file_info *fi) {
+-    (void) path;
+-
+-    return ((FileNode*)fi->fh)->close();
++int fusezip_release(const char *path, struct fuse_file_info *fi) try {
++    return reinterpret_cast<FileNode *>(fi->fh)->close();
++} catch (...) {
++    return exceptionToError("close file", path);
+ }
+ 
+-int fusezip_ftruncate(const char *path, off_t offset, struct fuse_file_info *fi) {
+-    (void) path;
+-
++int fusezip_ftruncate(const char *path, off_t offset,
++                      struct fuse_file_info *fi) try {
+     if (offset < 0)
+         return -EINVAL;
+-    return -((FileNode*)fi->fh)->truncate(static_cast<size_t>(offset));
++    return -reinterpret_cast<FileNode *>(fi->fh)->truncate(
++        static_cast<size_t>(offset));
++} catch (...) {
++    return exceptionToError("truncate file", path);
+ }
+ 
+-int fusezip_truncate(const char *path, off_t offset) {
++int fusezip_truncate(const char *path, off_t offset) try {
+     if (*path == '\0') {
+         return -EACCES;
+     }
+@@ -321,6 +317,8 @@ int fusezip_truncate(const char *path, off_t offset) {
+         return -res;
+     }
+     return node->close();
++} catch (...) {
++    return exceptionToError("truncate file", path);
+ }
+ 
+ int fusezip_unlink(const char *path) {
+@@ -371,7 +369,7 @@ int fusezip_mkdir(const char *path, mode_t mode) {
+     return 0;
+ }
+ 
+-int fusezip_rename(const char *path, const char *new_path) {
++int fusezip_rename(const char *path, const char *new_path) try {
+     if (*path == '\0') {
+         return -ENOENT;
+     }
+@@ -385,7 +383,7 @@ int fusezip_rename(const char *path, const char *new_path) {
+     FileNode *new_node = get_file_node(new_path + 1);
+     if (new_node != NULL) {
+         int res = get_data()->removeNode(new_node);
+-        if (res !=0) {
++        if (res != 0) {
+             return -res;
+         }
+     }
+@@ -403,48 +401,46 @@ int fusezip_rename(const char *path, const char *new_path) {
+         new_name.push_back('/');
+     }
+ 
+-    try {
+-        struct zip *z = get_zip();
+-        // Renaming directory and its content recursively
+-        if (node->is_dir()) {
+-            queue<FileNode*> q;
+-            q.push(node);
+-            while (!q.empty()) {
+-                FileNode *n = q.front();
+-                q.pop();
+-                for (nodelist_t::const_iterator i = n->childs.begin(); i != n->childs.end(); ++i) {
+-                    FileNode *nn = *i;
+-                    q.push(nn);
+-                    char *name = (char*)malloc(len + nn->full_name.size() - oldLen + (nn->is_dir() ? 2 : 1));
+-                    if (name == NULL) {
+-                        //TODO: check that we are have enough memory before entering this loop
+-                        return -ENOMEM;
+-                    }
+-                    strcpy(name, new_name.c_str());
+-                    strcpy(name + len, nn->full_name.c_str() + oldLen);
+-                    if (nn->is_dir()) {
+-                        strcat(name, "/");
+-                    }
+-                    if (nn->present_in_zip()) {
+-                        zip_file_rename(z, nn->id(), name, ZIP_FL_ENC_GUESS);
+-                    }
+-                    // changing child list may cause loop iterator corruption
+-                    get_data()->renameNode (nn, name, false);
+-                    
+-                    free(name);
++    struct zip *z = get_zip();
++    // Renaming directory and its content recursively
++    if (node->is_dir()) {
++        queue<FileNode *> q;
++        q.push(node);
++        while (!q.empty()) {
++            FileNode *n = q.front();
++            q.pop();
++            for (FileNode *const nn : n->childs) {
++                q.push(nn);
++                char *name = (char *)malloc(len + nn->full_name.size() -
++                                            oldLen + (nn->is_dir() ? 2 : 1));
++                if (name == NULL) {
++                    // TODO: check that we are have enough memory before
++                    // entering this loop
++                    return -ENOMEM;
+                 }
++                strcpy(name, new_name.c_str());
++                strcpy(name + len, nn->full_name.c_str() + oldLen);
++                if (nn->is_dir()) {
++                    strcat(name, "/");
++                }
++                if (nn->present_in_zip()) {
++                    zip_file_rename(z, nn->id(), name, ZIP_FL_ENC_GUESS);
++                }
++                // changing child list may cause loop iterator corruption
++                get_data()->renameNode(nn, name, false);
++
++                free(name);
+             }
+         }
+-        if (node->present_in_zip()) {
+-            zip_file_rename(z, node->id(), new_name.c_str(), ZIP_FL_ENC_GUESS);
+-        }
+-        get_data()->renameNode (node, new_name.c_str(), true);
+-
+-        return 0;
+     }
+-    catch (...) {
+-        return -EIO;
++    if (node->present_in_zip()) {
++        zip_file_rename(z, node->id(), new_name.c_str(), ZIP_FL_ENC_GUESS);
+     }
++    get_data()->renameNode(node, new_name.c_str(), true);
++
++    return 0;
++} catch (...) {
++    return exceptionToError("rename", path);
+ }
+ 
+ int fusezip_utimens(const char *path, const struct timespec tv[2]) {
+diff --git a/lib/fuseZipData.cpp b/lib/fuseZipData.cpp
+index 6852678..52acdff 100644
+--- a/lib/fuseZipData.cpp
++++ b/lib/fuseZipData.cpp
+@@ -103,7 +103,8 @@ void FuseZipData::build_tree(bool readonly) {
+         if (notHLink)
+             attachNode(i, name, mode, readonly, needPrefix, origNames);
+         else if (!readonly)
+-            throw std::runtime_error("hard links are supported only in read-only mode");
++            throw ZipError("Hard links are supported only in read-only mode",
++                           ZIP_ER_OPNOTSUPP);
+     }
+     // Connect nodes to tree. Missing intermediate nodes created on demand.
+     for (filemap_t::const_iterator i = files.begin(); i != files.end(); ++i)
+@@ -126,7 +127,7 @@ void FuseZipData::connectNodeToTree (FileNode *node) {
+         files[parent->full_name.c_str()] = parent;
+         connectNodeToTree (parent);
+     } else if (!parent->is_dir()) {
+-        throw std::runtime_error ("bad archive structure");
++        throw ZipError("Bad archive structure", ZIP_ER_INCONS);
+     }
+     // connecting to parent
+     node->parent = parent;
+@@ -241,8 +242,8 @@ void FuseZipData::attachNode(zip_int64_t id, const char *name, mode_t mode, bool
+     convertFileName(name, readonly, needPrefix, converted);
+     const char *cname = converted.c_str();
+     if (files.find(cname) != files.end()) {
+-        syslog(LOG_ERR, "duplicated file name: %s", cname);
+-        throw std::runtime_error("duplicate file names");
++        throw ZipError(std::string("Duplicated file name: ") + cname,
++                       ZIP_ER_EXISTS);
+     }
+     FileNode *node = FileNode::createNodeForZipEntry(m_zip, cname, id, mode);
+     if (node == NULL) {
+@@ -313,8 +314,8 @@ bool FuseZipData::attachHardlink(zip_int64_t sid, const char *name, mode_t mode,
+     convertFileName(name, readonly, needPrefix, converted);
+     const char *cname = converted.c_str();
+     if (files.find(cname) != files.end()) {
+-        syslog(LOG_ERR, "duplicated file name: %s", cname);
+-        throw std::runtime_error("duplicate file names");
++        throw ZipError(std::string("Duplicated file name: ") + cname,
++                       ZIP_ER_EXISTS);
+     }
+     FileNode *node = FileNode::createHardlink(m_zip, cname, sid, it->second);
+     if (node == NULL) {
+@@ -345,10 +346,10 @@ int FuseZipData::removeNode(FileNode *node) {
+ 
+ void FuseZipData::validateFileName(const char *fname) {
+     if (fname[0] == 0) {
+-        throw std::runtime_error("empty file name");
++        throw ZipError("Empty file name", ZIP_ER_INCONS);
+     }
+     if (strstr(fname, "//") != NULL) {
+-        throw std::runtime_error(std::string("bad file name (two slashes): ") + fname);
++        throw ZipError(std::string("Bad file name: ") + fname, ZIP_ER_INCONS);
+     }
+ }
+ 
+@@ -367,7 +368,9 @@ void FuseZipData::convertFileName(const char *fname, bool readonly,
+     // add prefix
+     if (fname[0] == '/') {
+         if (!readonly) {
+-            throw std::runtime_error("absolute paths are not supported in read-write mode");
++            throw ZipError(
++                "Absolute paths are not supported in read-write mode",
++                ZIP_ER_OPNOTSUPP);
+         } else {
+             assert(needPrefix);
+             converted.append(ROOT_PREFIX);
+@@ -377,7 +380,9 @@ void FuseZipData::convertFileName(const char *fname, bool readonly,
+         bool parentRelative = false;
+         while (strncmp(fname, "../", 3) == 0) {
+             if (!readonly) {
+-                throw std::runtime_error("paths relative to parent directory are not supported in read-write mode");
++                throw ZipError("Paths relative to parent directory are not "
++                               "supported in read-write mode",
++                               ZIP_ER_OPNOTSUPP);
+             }
+             assert(needPrefix);
+             converted.append(UP_PREFIX);
+@@ -400,14 +405,15 @@ void FuseZipData::convertFileName(const char *fname, bool readonly,
+     while (start[0] != 0 && (cur = strchr(start + 1, '/')) != NULL) {
+         if ((cur - start == 1 && start[0] == '.') ||
+             (cur - start == 2 && start[0] == '.' && start[1] == '.')) {
+-            throw std::runtime_error(std::string("bad file name: ") + orig);
++            throw ZipError(std::string("Bad file name: ") + orig,
++                           ZIP_ER_INCONS);
+         }
+         converted.append(start, static_cast<size_t>(cur - start + 1));
+         start = cur + 1;
+     }
+     // end of string is reached
+     if (strcmp(start, ".") == 0 || strcmp(start, "..") == 0) {
+-        throw std::runtime_error(std::string("bad file name: ") + orig);
++        throw ZipError(std::string("Bad file name: ") + orig, ZIP_ER_INCONS);
+     }
+     converted.append(start);
+ }
+diff --git a/lib/util.h b/lib/util.h
+index 94ac191..1fe63be 100644
+--- a/lib/util.h
++++ b/lib/util.h
+@@ -20,8 +20,58 @@
+ #ifndef UTIL_H
+ #define UTIL_H
+ 
++#include <stdexcept>
++#include <string>
++#include <utility>
++
+ #include <time.h>
++#include <zip.h>
+ 
+ struct timespec currentTime();
+ 
++/** An exception carrying a libzip error code. */
++class ZipError : public std::runtime_error {
++  public:
++    ZipError(std::string message, zip_t *const archive)
++        : std::runtime_error(MakeMessage(std::move(message), archive)),
++          code_(zip_error_code_zip(zip_get_error(archive))) {}
++
++    ZipError(std::string message, zip_file_t *const file)
++        : std::runtime_error(MakeMessage(std::move(message), file)),
++          code_(zip_error_code_zip(zip_file_get_error(file))) {}
++
++    ZipError(std::string message, const int code)
++        : std::runtime_error(MakeMessage(std::move(message), code)),
++          code_(code) {}
++
++    /** Gets the libzip error code. */
++    int code() const { return code_; }
++
++    static std::string MakeMessage(std::string message, zip_t *const archive) {
++        message += ": ";
++        message += zip_strerror(archive);
++        return message;
++    }
++
++    static std::string MakeMessage(std::string message,
++                                   zip_file_t *const file) {
++        message += ": ";
++        message += zip_file_strerror(file);
++        return message;
++    }
++
++    static std::string MakeMessage(std::string message, const int code) {
++        message += ": ";
++        zip_error_t ze;
++        zip_error_init_with_code(&ze, code);
++        message += zip_error_strerror(&ze);
++        zip_error_fini(&ze);
++        return message;
++    }
++
++  private:
++    /** libzip error code. */
++    const int code_;
++};
++
+ #endif
+diff --git a/main.cpp b/main.cpp
+index cb19ac5..1503523 100644
+--- a/main.cpp
++++ b/main.cpp
+@@ -41,6 +41,7 @@
+ 
+ #include "fuse-zip.h"
+ #include "fuseZipData.h"
++#include "util.h"
+ 
+ #if (LIBZIP_VERSION_MAJOR < 1)
+     #error "libzip >= 1.0 is required!"
+@@ -191,7 +192,7 @@ static const struct fuse_opt fusezip_opts[] = {
+     {NULL, 0, 0}
+ };
+ 
+-int main(int argc, char *argv[]) {
++int main(int argc, char *argv[]) try {
+     if (sizeof(void*) > sizeof(uint64_t)) {
+         fprintf(stderr,"%s: This program cannot be run on your system because of FUSE design limitation\n", PROGRAM);
+         return EXIT_FAILURE;
+@@ -237,11 +238,7 @@ int main(int argc, char *argv[]) {
+         }
+ 
+         openlog(PROGRAM, LOG_PID, LOG_USER);
+-        if ((data = initFuseZip(PROGRAM, param.fileName, param.readonly, param.force_precise_time))
+-                == NULL) {
+-            fuse_opt_free_args(&args);
+-            return EXIT_FAILURE;
+-        }
++        data = initFuseZip(PROGRAM, param.fileName, param.readonly, param.force_precise_time);
+     }
+ 
+     static struct fuse_operations fusezip_oper;
+@@ -301,5 +298,13 @@ int main(int argc, char *argv[]) {
+     res = fuse_loop(fuse);
+     fuse_teardown(fuse, mountpoint);
+     return (res == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
++} catch (const ZipError& e) {
++  fprintf(stderr,"%s: %s\n", PROGRAM, e.what());
++  // Shift libzip error codes in order to avoid collision with FUSE errors.
++  const int ZIP_ER_BASE = 10;
++  return ZIP_ER_BASE + e.code();
++} catch (const std::exception& e) {
++  fprintf(stderr,"%s: %s\n", PROGRAM, e.what());
++  return EXIT_FAILURE;
+ }
+ 
+-- 
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/sys-fs/fuse-zip/files/fuse-zip-0.7.0-lazy-caching.patch b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-lazy-caching.patch
new file mode 100644
index 0000000..875bbeb
--- /dev/null
+++ b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-lazy-caching.patch
@@ -0,0 +1,763 @@
+From 0ea408e4a0159faf0c0da386cad145d0251a46d2 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Thu, 18 Jun 2020 23:35:55 +1000
+Subject: [PATCH] Lazy caching of files
+
+Only cache a file in memory if it needs to be cached and if it is less than 1GB.
+---
+ lib/Makefile      |   4 +-
+ lib/bigBuffer.cpp | 360 ++++++++++++++++++++++++----------------------
+ lib/bigBuffer.h   |  89 +++++++-----
+ lib/dataNode.cpp  |   7 +-
+ lib/dataNode.h    |   3 +-
+ lib/fileNode.cpp  |   2 +-
+ lib/fileNode.h    |   2 +-
+ lib/fuse-zip.cpp  |   4 +-
+ 8 files changed, 252 insertions(+), 219 deletions(-)
+
+diff --git a/lib/Makefile b/lib/Makefile
+index d092e0e..af2df55 100644
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -1,8 +1,8 @@
+ DEST=libfusezip.a
+ PKG_CONFIG?=pkg-config
+ LIBS=$(shell $(PKG_CONFIG) fuse --libs) $(shell $(PKG_CONFIG) libzip --libs)
+-CXXFLAGS=-g -O0 -Wall -Wextra -Wconversion -Wsign-conversion -Wlogical-op -Wshadow -pedantic -Werror -std=c++11
+-RELEASE_CXXFLAGS=-O2 -Wall -Wextra -Wconversion -Wsign-conversion -Wlogical-op -Wshadow -pedantic -Werror -std=c++11
++CXXFLAGS=-g -O0 -Wall -Wextra -Wconversion -Wno-sign-compare -Wlogical-op -Wshadow -pedantic -Werror -std=c++11
++RELEASE_CXXFLAGS=-O2 -Wall -Wextra -Wconversion -Wno-sign-compare -Wlogical-op -Wshadow -pedantic -Werror -std=c++11
+ FUSEFLAGS=$(shell $(PKG_CONFIG) fuse --cflags)
+ ZIPFLAGS=$(shell $(PKG_CONFIG) libzip --cflags)
+ SOURCES=$(sort $(wildcard *.cpp))
+diff --git a/lib/bigBuffer.cpp b/lib/bigBuffer.cpp
+index 109d2f0..6f05262 100644
+--- a/lib/bigBuffer.cpp
++++ b/lib/bigBuffer.cpp
+@@ -17,6 +17,8 @@
+ //  along with this program.  If not, see <https://www.gnu.org/licenses/>.//
+ ////////////////////////////////////////////////////////////////////////////
+ 
++#include "bigBuffer.h"
++
+ #include <cassert>
+ #include <cerrno>
+ #include <cstdlib>
+@@ -28,67 +30,54 @@
+ #include <limits.h>
+ #include <syslog.h>
+ 
+-#include "bigBuffer.h"
++#include "util.h"
+ 
+ /**
+- * Class that keep chunk of file data.
++ * Operate with chunks of 4 KiB.
+  */
+-class BigBuffer::ChunkWrapper {
+-private:
+-    /**
+-     * Pointer that keeps data for chunk. Can be NULL.
+-     */
+-    char *m_ptr;
++static const unsigned int chunkBits = 12;
++static const unsigned int chunkSize = 1u << chunkBits;
+ 
+-public:
+-    /**
+-     * By default internal buffer is NULL, so this can be used for creating
+-     * sparse files.
+-     */
+-    ChunkWrapper(): m_ptr(NULL) {
+-    }
++/**
++ * Return number of chunks needed to keep 'size' bytes.
++ */
++inline size_t chunksCount(size_t size) {
++    return (size + (chunkSize - 1)) >> chunkBits;
++}
+ 
+-    /**
+-     * Take ownership on internal pointer from 'other' object.
+-     */
+-    ChunkWrapper(const ChunkWrapper &other) {
+-        m_ptr = other.m_ptr;
+-        const_cast<ChunkWrapper*>(&other)->m_ptr = NULL;
+-    }
++/**
++ * Return number of chunk where 'offset'-th byte is located.
++ */
++inline size_t chunkNumber(size_t offset) { return offset >> chunkBits; }
+ 
+-    /**
+-     * Free pointer if allocated.
+-     */
+-    ~ChunkWrapper() {
+-        if (m_ptr != NULL) {
+-            free(m_ptr);
+-        }
+-    }
++/**
++ * Return offset inside chunk to 'offset'-th byte.
++ */
++inline unsigned int chunkOffset(size_t offset) {
++    return offset & (chunkSize - 1);
++}
+ 
++/**
++ * Class that keep chunk of file data.
++ */
++class BigBuffer::Chunk {
++  private:
+     /**
+-     * Take ownership on internal pointer from 'other' object.
++     * Pointer that keeps data for chunk. Can be NULL.
+      */
+-    ChunkWrapper &operator=(const ChunkWrapper &other) {
+-        if (&other != this) {
+-            m_ptr = other.m_ptr;
+-            const_cast<ChunkWrapper*>(&other)->m_ptr = NULL;
+-        }
+-        return *this;
+-    }
++    std::unique_ptr<char[]> m_ptr;
+ 
++  public:
+     /**
+      * Return pointer to internal storage and initialize it if needed.
+      * @throws
+      *      std::bad_alloc  If memory can not be allocated
+      */
+-    char *ptr(bool init = false) {
+-        if (init && m_ptr == NULL) {
+-            m_ptr = (char *)malloc(chunkSize);
+-            if (m_ptr == NULL) {
+-                throw std::bad_alloc();
+-            }
++    char *ptr() {
++        if (!m_ptr) {
++            m_ptr.reset(new char[chunkSize]{});
+         }
+-        return m_ptr;
++        return m_ptr.get();
+     }
+ 
+     /**
+@@ -106,8 +95,8 @@ public:
+         if (offset + count > chunkSize) {
+             count = chunkSize - offset;
+         }
+-        if (m_ptr != NULL) {
+-            memcpy(dest, m_ptr + offset, count);
++        if (m_ptr) {
++            memcpy(dest, m_ptr.get() + offset, count);
+         } else {
+             memset(dest, 0, count);
+         }
+@@ -132,16 +121,7 @@ public:
+         if (offset + count > chunkSize) {
+             count = chunkSize - offset;
+         }
+-        if (m_ptr == NULL) {
+-            m_ptr = (char *)malloc(chunkSize);
+-            if (m_ptr == NULL) {
+-                throw std::bad_alloc();
+-            }
+-            if (offset > 0) {
+-                memset(m_ptr, 0, offset);
+-            }
+-        }
+-        memcpy(m_ptr + offset, src, count);
++        memcpy(ptr() + offset, src, count);
+         return count;
+     }
+ 
+@@ -149,192 +129,228 @@ public:
+      * Clear tail of internal buffer with zeroes starting from 'offset'.
+      */
+     void clearTail(unsigned int offset) {
+-        if (m_ptr != NULL && offset < chunkSize) {
+-            memset(m_ptr + offset, 0, chunkSize - offset);
++        if (m_ptr && offset < chunkSize) {
++            memset(m_ptr.get() + offset, 0, chunkSize - offset);
+         }
+     }
+-
+ };
+ 
+-BigBuffer::BigBuffer(): len(0) {
++BigBuffer::~BigBuffer() {}
++
++BigBuffer::BigBuffer() {}
++
++BigBuffer::BigBuffer(zip *archive, zip_uint64_t nodeId, off_t length)
++    : archive_(archive), nodeId_(nodeId), file_(OpenFile()), len(length) {}
++
++ZipFile BigBuffer::OpenFile() const {
++    if (zip_file *file = zip_fopen_index(archive_, nodeId_, 0))
++        return ZipFile(file);
++
++    throw ZipError("Cannot open file at index " + std::to_string(nodeId_),
++                   archive_);
+ }
+ 
+-BigBuffer::BigBuffer(struct zip *z, zip_uint64_t nodeId, size_t length):
+-        len(length) {
+-    struct zip_file *zf = zip_fopen_index(z, nodeId, 0);
+-    if (zf == NULL) {
+-        syslog(LOG_WARNING, "%s", zip_strerror(z));
+-        throw std::runtime_error(zip_strerror(z));
+-    }
+-    size_t ccount = chunksCount(length);
+-    chunks.resize(ccount, ChunkWrapper());
+-    size_t chunk = 0;
+-    while (length > 0) {
+-        size_t readSize = chunkSize;
+-        if (readSize > length) {
+-            readSize = length;
+-        }
+-        zip_int64_t nr = zip_fread(zf, chunks[chunk].ptr(true), readSize);
+-        if (nr < 0) {
+-            std::string err = zip_file_strerror(zf);
+-            syslog(LOG_WARNING, "%s", err.c_str());
+-            zip_fclose(zf);
+-            throw std::runtime_error(err);
++void BigBuffer::CacheInMemory() {
++    if (!archive_)
++        return;
++
++    // Don't cache files bigger than 1 GiB.
++    if ((len >> 30) > 0)
++        throw std::bad_alloc();
++
++    file_.reset();
++    chunks_.clear();
++    chunks_.reserve(len / chunkSize + 1);
++    const ZipFile file = OpenFile();
++    archive_ = nullptr;
++    len = 0;
++    Chunk chunk;
++    zip_int64_t nr;
++    do {
++        nr = zip_fread(file.get(), chunk.ptr(), chunkSize);
++        if (nr < 0)
++            throw std::runtime_error(zip_file_strerror(file.get()));
++
++        len += nr;
++        chunks_.push_back(std::move(chunk));
++    } while (nr == chunkSize);
++
++    if (nr == 0)
++        chunks_.pop_back();
++}
++
++int BigBuffer::read(char *buf, size_t size, off_t offset) {
++    size = std::min<size_t>(size, std::numeric_limits<int>::max());
++
++    if (offset < 0)
++        throw std::runtime_error("Negative offset");
++
++    if (file_) {
++        if (pos_ != offset) {
++            // Try to adjust the actual position in the file.
++            if (zip_fseek(file_.get(), offset, SEEK_SET) < 0) {
++                // Cannot adjust position. The file is probably compressed.
++                // We'll have to cache it in memory.
++                file_.reset();
++            } else {
++                // Adjust recorded position.
++                pos_ = offset;
++            }
+         }
+-        ++chunk;
+-        length -= static_cast<size_t>(nr);
+-        if ((nr == 0 || chunk == ccount) && length != 0) {
+-            // Allocated memory are exhausted, but there are unread bytes (or
+-            // file is longer that given length). Possibly CRC error.
+-            zip_fclose(zf);
+-            syslog(LOG_WARNING, "length of file %s differ from data length",
+-                    zip_get_name(z, nodeId, ZIP_FL_ENC_GUESS));
+-            throw std::runtime_error("data length differ");
++
++        if (file_) {
++            // Read from file.
++            assert(pos_ == offset);
++            const zip_int64_t n = zip_fread(file_.get(), buf, size);
++            if (n < 0) {
++                throw std::runtime_error(zip_file_strerror(file_.get()));
++            }
++
++            // Adjust recorded position.
++            pos_ += n;
++            return static_cast<int>(n);
+         }
+     }
+-    if (zip_fclose(zf)) {
+-        syslog(LOG_WARNING, "%s", zip_strerror(z));
+-        throw std::runtime_error(zip_strerror(z));
+-    }
+-}
+ 
+-BigBuffer::~BigBuffer() {
+-}
++    assert(!file_);
++    CacheInMemory();
+ 
+-int BigBuffer::read(char *buf, size_t size, size_t offset) const {
+-    if (offset > len) {
++    if (offset >= len)
+         return 0;
+-    }
+-    size_t chunk = chunkNumber(offset);
+-    unsigned int pos = chunkOffset(offset);
+-    if (size > len - offset) {
+-        size = len - offset;
+-    }
+-    if (size > INT_MAX)
+-        size = INT_MAX;
+-    int nread = static_cast<int>(size);
+-    while (size > 0) {
+-        size_t r = chunks[chunk].read(buf, pos, size);
+ 
++    // Read from in-memory cache.
++    size = std::min<off_t>(size, len - offset);
++    Chunks::const_iterator chunk = chunks_.cbegin() + chunkNumber(offset);
++    unsigned int pos_in_chunk = chunkOffset(offset);
++    const int nread = static_cast<int>(size);
++
++    while (size > 0) {
++        const size_t r = chunk->read(buf, pos_in_chunk, size);
++        assert(r <= size);
+         size -= r;
+         buf += r;
+         ++chunk;
+-        pos = 0;
++        pos_in_chunk = 0;
+     }
++
+     return nread;
+ }
+ 
+ int BigBuffer::write(const char *buf, size_t size, size_t offset) {
++    CacheInMemory();
++    size = std::min<size_t>(size, std::numeric_limits<int>::max());
+     size_t chunk = chunkNumber(offset);
+     unsigned int pos = chunkOffset(offset);
+-    if (size > INT_MAX)
+-        size = INT_MAX;
+-    int nwritten = static_cast<int>(size);
++    const int nwritten = static_cast<int>(size);
+ 
+     if (offset > len) {
+         if (chunkNumber(len) < chunksCount(len)) {
+-            chunks[chunkNumber(len)].clearTail(chunkOffset(len));
++            chunks_[chunkNumber(len)].clearTail(chunkOffset(len));
+         }
+         len = size + offset;
+-    } else if (size > unsigned(len - offset)) {
++    } else if (size > len - offset) {
+         len = size + offset;
+     }
+-    chunks.resize(chunksCount(len));
++    chunks_.resize(chunksCount(len));
+     while (size > 0) {
+-        size_t w = chunks[chunk].write(buf, pos, size);
++        size_t w = chunks_[chunk].write(buf, pos, size);
+ 
+         size -= w;
+         buf += w;
+-        ++ chunk;
++        ++chunk;
+         pos = 0;
+     }
+     return nwritten;
+ }
+ 
+ void BigBuffer::truncate(size_t offset) {
+-    chunks.resize(chunksCount(offset));
++    CacheInMemory();
++    chunks_.resize(chunksCount(offset));
+ 
+     if (offset > len && chunkNumber(len) < chunksCount(len)) {
+         // Fill end of last non-empty chunk with zeroes
+-        chunks[chunkNumber(len)].clearTail(chunkOffset(len));
++        chunks_[chunkNumber(len)].clearTail(chunkOffset(len));
+     }
+ 
+     len = offset;
+ }
+ 
+ zip_int64_t BigBuffer::zipUserFunctionCallback(void *state, void *data,
+-        zip_uint64_t len, enum zip_source_cmd cmd) {
+-    CallBackStruct *b = (CallBackStruct*)state;
++                                               zip_uint64_t len,
++                                               enum zip_source_cmd cmd) {
++    CallBackStruct *b = static_cast<CallBackStruct *>(state);
+     switch (cmd) {
+-        case ZIP_SOURCE_OPEN: {
+-            b->pos = 0;
+-            return 0;
+-        }
+-        case ZIP_SOURCE_READ: {
+-            size_t rlen = std::numeric_limits<size_t>::max();
+-            if (len < rlen)
+-                rlen = static_cast<size_t>(len);
+-            int r = b->buf->read((char*)data, rlen, b->pos);
+-            b->pos += static_cast<unsigned int>(r);
+-            return r;
+-        }
+-        case ZIP_SOURCE_STAT: {
+-            struct zip_stat *st = (struct zip_stat*)data;
+-            zip_stat_init(st);
+-            st->valid = ZIP_STAT_SIZE | ZIP_STAT_MTIME;
+-            st->size = b->buf->len;
+-            st->mtime = b->mtime;
+-            return sizeof(struct zip_stat);
+-        }
+-        case ZIP_SOURCE_FREE: {
+-            delete b;
+-            return 0;
+-        }
+-        case ZIP_SOURCE_CLOSE:
+-            return 0;
+-        case ZIP_SOURCE_ERROR: {
+-            // This code should not be called in normal case because none of
+-            // implemented functions raises error flag.
+-            int *errs = static_cast<int *>(data);
+-            errs[0] = ZIP_ER_OPNOTSUPP;
+-            errs[1] = EINVAL;
+-            return 2 * sizeof(int);
+-        }
+-        case ZIP_SOURCE_SUPPORTS:
+-            return ZIP_SOURCE_SUPPORTS_READABLE;
+-        default:
+-            // indicate unsupported operation
+-            return -1;
++    case ZIP_SOURCE_OPEN: {
++        b->pos = 0;
++        return 0;
++    }
++    case ZIP_SOURCE_READ: {
++        size_t rlen = std::numeric_limits<size_t>::max();
++        if (len < rlen)
++            rlen = static_cast<size_t>(len);
++        const int r = b->buf->read(static_cast<char *>(data), rlen, b->pos);
++        b->pos += r;
++        return r;
++    }
++    case ZIP_SOURCE_STAT: {
++        struct zip_stat *st = static_cast<struct zip_stat *>(data);
++        zip_stat_init(st);
++        st->valid = ZIP_STAT_SIZE | ZIP_STAT_MTIME;
++        st->size = b->buf->len;
++        st->mtime = b->mtime;
++        return sizeof(struct zip_stat);
++    }
++    case ZIP_SOURCE_FREE: {
++        delete b;
++        return 0;
++    }
++    case ZIP_SOURCE_CLOSE:
++        return 0;
++    case ZIP_SOURCE_ERROR: {
++        // This code should not be called in normal case because none of
++        // implemented functions raises error flag.
++        int *errs = static_cast<int *>(data);
++        errs[0] = ZIP_ER_OPNOTSUPP;
++        errs[1] = EINVAL;
++        return 2 * sizeof(int);
++    }
++    case ZIP_SOURCE_SUPPORTS:
++        return ZIP_SOURCE_SUPPORTS_READABLE;
++    default:
++        // indicate unsupported operation
++        return -1;
+     }
+ }
+ 
+ int BigBuffer::saveToZip(time_t mtime, struct zip *z, const char *fname,
+-        bool newFile, zip_int64_t &index) {
+-    struct zip_source *s;
+-    struct CallBackStruct *cbs = new CallBackStruct();
++                         bool newFile, zip_int64_t &index) {
++    CallBackStruct *const cbs = new CallBackStruct();
+     cbs->buf = this;
+     cbs->mtime = mtime;
+-    if ((s=zip_source_function(z, zipUserFunctionCallback, cbs)) == NULL) {
++    zip_source *const s = zip_source_function(z, zipUserFunctionCallback, cbs);
++    if (!s) {
+         delete cbs;
+         return -ENOMEM;
+     }
++
+     if (newFile) {
+-        zip_int64_t nid = zip_file_add(z, fname, s, ZIP_FL_ENC_GUESS);
++        const zip_int64_t nid = zip_file_add(z, fname, s, ZIP_FL_ENC_GUESS);
+         if (nid < 0) {
+             delete cbs;
+             zip_source_free(s);
+             return -ENOMEM;
+-        } else {
+-            // indices are actually in range [0..2^63-1]
+-            index = nid;
+         }
++
++        // indices are actually in range [0..2^63-1]
++        index = nid;
+     } else {
+         assert(index >= 0);
+-        if (zip_file_replace(z, static_cast<zip_uint64_t>(index), s, ZIP_FL_ENC_GUESS) < 0) {
++        if (zip_file_replace(z, index, s, ZIP_FL_ENC_GUESS) < 0) {
+             delete cbs;
+             zip_source_free(s);
+             return -ENOMEM;
+         }
+     }
++
+     return 0;
+ }
+diff --git a/lib/bigBuffer.h b/lib/bigBuffer.h
+index 2ec92d6..b5ad3fc 100644
+--- a/lib/bigBuffer.h
++++ b/lib/bigBuffer.h
+@@ -20,60 +20,84 @@
+ #ifndef BIG_BUFFER_H
+ #define BIG_BUFFER_H
+ 
+-#include <zip.h>
+ #include <unistd.h>
++#include <zip.h>
+ 
++#include <memory>
+ #include <vector>
+ 
+ #include "types.h"
+ 
+-class BigBuffer {
+-private:
+-    //TODO: use >> and <<
+-    static const unsigned int chunkSize = 4*1024; //4 Kilobytes
+-
+-    class ChunkWrapper;
++struct ZipClose {
++    void operator()(zip_file_t *const file) const { zip_fclose(file); }
++};
+ 
+-    typedef std::vector<ChunkWrapper> chunks_t;
++using ZipFile = std::unique_ptr<zip_file_t, ZipClose>;
+ 
++class BigBuffer {
++  private:
+     struct CallBackStruct {
+-        size_t pos;
+-        const BigBuffer *buf;
++        off_t pos;
++        BigBuffer *buf;
+         time_t mtime;
+     };
+ 
+-    chunks_t chunks;
+-
+     /**
+      * Callback for zip_source_function.
+      * See zip_source_function(3) for details.
+      */
+     static zip_int64_t zipUserFunctionCallback(void *state, void *data,
+-            zip_uint64_t len, enum zip_source_cmd cmd);
++                                               zip_uint64_t len,
++                                               enum zip_source_cmd cmd);
+ 
+     /**
+-     * Return number of chunks needed to keep 'size' bytes.
++     * Opens the file at index nodeId_ in archive_.
++     * @throws std::runtime_error on error.
+      */
+-    inline static size_t chunksCount(size_t size) {
+-        return (size + chunkSize - 1) / chunkSize;
+-    }
++    ZipFile OpenFile() const;
+ 
+     /**
+-     * Return number of chunk where 'offset'-th byte is located.
++     * Cache file in memory if it isn't cached yet.
++     * @throws
++     *      std::bad_alloc if there is not enough memory.
++     *      std::runtime_error on file read error.
+      */
+-    inline static size_t chunkNumber(size_t offset) {
+-        return offset / chunkSize;
+-    }
++    void CacheInMemory();
++
++    class Chunk;
++    using Chunks = std::vector<Chunk>;
+ 
+     /**
+-     * Return offset inside chunk to 'offset'-th byte.
++     * Pointer to the ZIP archive.
++     * Becomes null when file is cached in memory.
+      */
+-    inline static unsigned int chunkOffset(size_t offset) {
+-        return offset % chunkSize;
+-    }
++    zip *archive_ = nullptr;
+ 
+-public:
+-    size_t len;
++    /**
++     * Index of the file in the ZIP archive.
++     */
++    const zip_uint64_t nodeId_ = 0;
++
++    /**
++     * File being streamed.
++     * Becomes null when file is cached in memory.
++     */
++    ZipFile file_ = nullptr;
++
++    /**
++     * Current position of the file being streamed.
++     * Not used when file is cached in memory.
++     */
++    off_t pos_ = 0;
++
++    /**
++     * Cached file in memory.
++     * Used only when archive_ is null.
++     */
++    Chunks chunks_;
++
++  public:
++    off_t len = 0;
+ 
+     /**
+      * Create new file buffer without mapping to file in a zip archive
+@@ -86,11 +110,11 @@ public:
+      * @param z         Zip file
+      * @param nodeId    Node index inside zip file
+      * @param length    File length
+-     * @throws 
++     * @throws
+      *      std::exception  On file read error
+      *      std::bad_alloc  On memory insufficiency
+      */
+-    BigBuffer(struct zip *z, zip_uint64_t nodeId, size_t length);
++    BigBuffer(struct zip *z, zip_uint64_t nodeId, off_t length);
+ 
+     ~BigBuffer();
+ 
+@@ -105,7 +129,7 @@ public:
+      * @param offset    offset to start reading from
+      * @return number of bytes read
+      */
+-    int read(char *buf, size_t size, size_t offset) const;
++    int read(char *buf, size_t size, off_t offset);
+ 
+     /**
+      * Dispatch write request to chunks of a file and grow 'chunks' vector if
+@@ -135,8 +159,8 @@ public:
+      *      0       If successfull
+      *      -ENOMEM If there are no memory
+      */
+-    int saveToZip(time_t mtime, struct zip *z, const char *fname,
+-            bool newFile, zip_int64_t &index);
++    int saveToZip(time_t mtime, struct zip *z, const char *fname, bool newFile,
++                  zip_int64_t &index);
+ 
+     /**
+      * Truncate buffer at position offset.
+@@ -151,4 +175,3 @@ public:
+ };
+ 
+ #endif
+-
+diff --git a/lib/dataNode.cpp b/lib/dataNode.cpp
+index 0efd7bc..07f0f84 100644
+--- a/lib/dataNode.cpp
++++ b/lib/dataNode.cpp
+@@ -116,17 +116,14 @@ int DataNode::open(struct zip *zip) {
+     if (_state == NodeState::CLOSED) {
+         _open_count = 1;
+         assert(zip != NULL);
+-        if (_size > std::numeric_limits<size_t>::max()) {
+-            return -ENOMEM;
+-        }
+         assert(_id != FAKE_ID);
+-        _buffer.reset(new BigBuffer(zip, _id, static_cast<size_t>(_size)));
++        _buffer.reset(new BigBuffer(zip, _id, _size));
+         _state = NodeState::OPENED;
+     }
+     return 0;
+ }
+ 
+-int DataNode::read(char *buf, size_t sz, size_t offset) {
++int DataNode::read(char *buf, size_t sz, off_t offset) {
+     _atime = currentTime();
+     return _buffer->read(buf, sz, offset);
+ }
+diff --git a/lib/dataNode.h b/lib/dataNode.h
+index 7489ec9..550593c 100644
+--- a/lib/dataNode.h
++++ b/lib/dataNode.h
+@@ -73,7 +73,7 @@ public:
+     static std::shared_ptr<DataNode> createExisting(struct zip *zip, zip_uint64_t id, mode_t mode);
+ 
+     int open(struct zip *zip);
+-    int read(char *buf, size_t size, size_t offset);
++    int read(char *buf, size_t size, off_t offset);
+     int write(const char *buf, size_t size, size_t offset);
+     int close();
+ 
+@@ -166,4 +166,3 @@ public:
+     zip_uint64_t size() const;
+ };
+ #endif
+-
+diff --git a/lib/fileNode.cpp b/lib/fileNode.cpp
+index 30c2975..aeb66ec 100644
+--- a/lib/fileNode.cpp
++++ b/lib/fileNode.cpp
+@@ -191,7 +191,7 @@ int FileNode::open() {
+     return _data->open(zip);
+ }
+ 
+-int FileNode::read(char *buf, size_t sz, size_t offset) {
++int FileNode::read(char *buf, size_t sz, off_t offset) {
+     return _data->read(buf, sz, offset);
+ }
+ 
+diff --git a/lib/fileNode.h b/lib/fileNode.h
+index 998bc9e..ab07cd9 100644
+--- a/lib/fileNode.h
++++ b/lib/fileNode.h
+@@ -111,7 +111,7 @@ public:
+     void rename (const char *new_name);
+ 
+     int open();
+-    int read(char *buf, size_t size, size_t offset);
++    int read(char *buf, size_t size, off_t offset);
+     int write(const char *buf, size_t size, size_t offset);
+     int close();
+ 
+diff --git a/lib/fuse-zip.cpp b/lib/fuse-zip.cpp
+index 73ea2fa..4c4c2a4 100644
+--- a/lib/fuse-zip.cpp
++++ b/lib/fuse-zip.cpp
+@@ -269,8 +269,7 @@ int fusezip_read(const char *path, char *buf, size_t size, off_t offset,
+                  struct fuse_file_info *fi) try {
+     if (offset < 0)
+         return -EINVAL;
+-    return reinterpret_cast<FileNode *>(fi->fh)->read(
+-        buf, size, static_cast<size_t>(offset));
++    return reinterpret_cast<FileNode *>(fi->fh)->read(buf, size, offset);
+ } catch (...) {
+     return exceptionToError("read file", path);
+ }
+@@ -662,4 +661,3 @@ int fusezip_symlink(const char *dest, const char *path) {
+     node->close();
+     return (res < 0) ? -ENOMEM : 0;
+ }
+-
+-- 
+2.27.0.383.g050319c2ae-goog
+
diff --git a/sys-fs/fuse-zip/files/fuse-zip-0.7.0-no-symlinks.patch b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-no-symlinks.patch
new file mode 100644
index 0000000..1fae412
--- /dev/null
+++ b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-no-symlinks.patch
@@ -0,0 +1,50 @@
+From be8e3c51ccc5076755674e2d054bcc7970d59dd0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Wed, 2 Sep 2020 19:52:36 +1000
+Subject: [PATCH] No symlinks
+
+Do not show symbolic links recorded in the ZIP.
+Pretend they don't exist.
+---
+ lib/fuse-zip.cpp    | 2 ++
+ lib/fuseZipData.cpp | 4 ++++
+ 2 files changed, 6 insertions(+)
+
+diff --git a/lib/fuse-zip.cpp b/lib/fuse-zip.cpp
+index 4c4c2a4..f8674ef 100644
+--- a/lib/fuse-zip.cpp
++++ b/lib/fuse-zip.cpp
+@@ -613,6 +613,8 @@ int fusezip_access(const char *, int) {
+ }
+ 
+ int fusezip_readlink(const char *path, char *buf, size_t size) {
++    return -ENOENT;
++
+     if (*path == '\0') {
+         return -ENOENT;
+     }
+diff --git a/lib/fuseZipData.cpp b/lib/fuseZipData.cpp
+index 27409d9..117d288 100644
+--- a/lib/fuseZipData.cpp
++++ b/lib/fuseZipData.cpp
+@@ -121,6 +121,8 @@ void FuseZipData::build_tree(bool readonly) {
+ 
+         const char *const name = sb.name;
+         mode_t mode = getEntryAttributes(id, name, isHardlink);
++        if (S_ISLNK(mode))
++            continue;
+         
+         if (isHardlink)
+             continue;
+@@ -145,6 +147,8 @@ void FuseZipData::build_tree(bool readonly) {
+         bool isHardlink;
+         const char *name = zip_get_name(m_zip, id, ZIP_FL_ENC_GUESS);
+         mode_t mode = getEntryAttributes(id, name, isHardlink);
++        if (S_ISLNK(mode))
++            continue;
+ 
+         if (!isHardlink)
+             continue;
+-- 
+2.28.0.526.ge36021eeef-goog
+
diff --git a/sys-fs/fuse-zip/files/fuse-zip-0.7.0-password.patch b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-password.patch
new file mode 100644
index 0000000..4e9a7c0
--- /dev/null
+++ b/sys-fs/fuse-zip/files/fuse-zip-0.7.0-password.patch
@@ -0,0 +1,120 @@
+From f6e0b0bc8ec066716c3be09a596c5c0b0da0dd9e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Sat, 11 Jul 2020 19:19:54 +1000
+Subject: [PATCH] Read password from stdin
+
+If no password or an empty password is provided via stdin and the ZIP
+contains encrypted files, then the ZIP is not mounted.
+
+If a non-empty password is provided, it is used to decrypt encrypted
+files. The password itself is checked for validity when the ZIP is
+mounted. If the password does not allow to decrypt the first encrypted
+file encountered in the ZIP, then the ZIP is not mounted. Multipassword
+ZIPs containing files encrypted with different passwords are thus not
+supported.
+---
+ lib/fuseZipData.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+diff --git a/lib/fuseZipData.cpp b/lib/fuseZipData.cpp
+index 52acdff..9050804 100644
+--- a/lib/fuseZipData.cpp
++++ b/lib/fuseZipData.cpp
+@@ -22,6 +22,7 @@
+ #include <cassert>
+ #include <cerrno>
+ #include <cstring>
++#include <iostream>
+ #include <stdexcept>
+ 
+ #include "fuseZipData.h"
+@@ -30,6 +31,28 @@
+ 
+ #define FZ_ATTR_HARDLINK (0x800)
+ 
++// Reads a password from the standard input and sets it as default password on
++// the given archive.
++static void SetPassword(zip_t *const archive) {
++    // Write prompt to standard output.
++    std::cout << "Password?" << std::endl;
++
++    // Read password from standard input.
++    std::string password;
++    if (!std::getline(std::cin, password) || password.empty())
++        return;
++
++    // Remove newline at the end of password.
++    if (password.back() == '\n')
++        password.pop_back();
++
++    if (password.empty())
++        return;
++
++    if (zip_set_default_password(archive, password.c_str()) < 0)
++        throw ZipError("Cannot set default password", archive);
++}
++
+ FuseZipData::FuseZipData(const char *archiveName, struct zip *z, const char *cwd,
+         bool force_precise_time):
+     m_zip(z), m_archiveName(archiveName), m_cwd(cwd), m_force_precise_time(force_precise_time) {
+@@ -71,22 +94,56 @@ void FuseZipData::build_tree(bool readonly) {
+     if (readonly) {
+         for (zip_int64_t i = 0; i < n; ++i) {
+             const char *name = zip_get_name(m_zip, static_cast<zip_uint64_t>(i), ZIP_FL_ENC_GUESS);
++            if (!name)
++                throw ZipError("Cannot get file name", m_zip);
++
+             if ((name[0] == '/') || (strncmp(name, "../", 3) == 0)) {
+                 needPrefix = true;
++                break;
+             }
+         }
+     }
++
++    zip_stat_t sb;
++
+     // add zip entries for all items except hardlinks
+     filemap_t origNames;
++    bool checked_password = false;
+     for (zip_int64_t i = 0; i < n; ++i) {
+         zip_uint64_t id = static_cast<zip_uint64_t>(i);
+         bool isHardlink;
+-        const char *name = zip_get_name(m_zip, id, ZIP_FL_ENC_GUESS);
++
++        if (zip_stat_index(m_zip, id, ZIP_FL_ENC_GUESS, &sb) < 0)
++            throw ZipError("Cannot read file entry", m_zip);
++
++        if ((sb.valid & ZIP_STAT_NAME) == 0)
++            continue;
++
++        const char *const name = sb.name;
+         mode_t mode = getEntryAttributes(id, name, isHardlink);
+         
+         if (isHardlink)
+             continue;
+ 
++        // Try to open the first encrypted file and read a few bytes in order to
++        // check the password.
++        if (!checked_password && (sb.valid & ZIP_STAT_ENCRYPTION_METHOD) != 0 &&
++            sb.encryption_method != ZIP_EM_NONE) {
++            SetPassword(m_zip);
++            const ZipFile file(zip_fopen_index(m_zip, id, 0));
++            if (!file)
++                throw ZipError("Cannot decrypt file", m_zip);
++
++            const size_t bufLen = 16;
++            char buf[bufLen];
++
++            if (zip_fread(file.get(), buf, bufLen) < 0)
++              throw ZipError("Cannot decrypt file", file.get());
++
++            // Password is Ok.
++            checked_password = true;
++        }
++
+         attachNode(i, name, mode, readonly, needPrefix, origNames);
+     }
+     // add hardlinks
+-- 
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/sys-fs/fuse-zip/fuse-zip-0.7.0-r2.ebuild b/sys-fs/fuse-zip/fuse-zip-0.7.0-r2.ebuild
deleted file mode 100644
index d4e743c..0000000
--- a/sys-fs/fuse-zip/fuse-zip-0.7.0-r2.ebuild
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-inherit toolchain-funcs
-
-DESCRIPTION="FUSE file system to navigate, extract, create and modify ZIP archives"
-HOMEPAGE="https://bitbucket.org/agalanin/fuse-zip"
-SRC_URI="https://bitbucket.org/agalanin/${PN}/downloads/${P}.tar.gz"
-
-LICENSE="GPL-3"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-DEPEND="
-	dev-libs/libzip:=
-	sys-fs/fuse:0
-"
-RDEPEND="${DEPEND}"
-
-RESTRICT="test"
-
-DOCS=( changelog README.md )
-
-PATCHES=(
-	"${FILESDIR}/${PN}-0.4.5-makefile.patch"
-	"${FILESDIR}/${PN}-0.7.0-makefile.patch"
-	"${FILESDIR}/${PN}-0.7.0-fix-unknown-file-types.patch"
-	"${FILESDIR}/${PN}-0.7.0-fix-utf8-filenames.patch"
-)
-
-src_compile() {
-	tc-export PKG_CONFIG
-	emake CXX="$(tc-getCXX)" CXXFLAGS="${CXXFLAGS} ${LDFLAGS}"
-}
-
-src_install() {
-	default
-	doman fuse-zip.1
-}
diff --git a/sys-fs/fuse-zip/fuse-zip-0.7.0-r9.ebuild b/sys-fs/fuse-zip/fuse-zip-0.7.0-r9.ebuild
new file mode 100644
index 0000000..6e71c05
--- /dev/null
+++ b/sys-fs/fuse-zip/fuse-zip-0.7.0-r9.ebuild
@@ -0,0 +1,47 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit toolchain-funcs
+
+DESCRIPTION="FUSE file system to navigate, extract, create and modify ZIP archives"
+HOMEPAGE="https://bitbucket.org/agalanin/fuse-zip"
+SRC_URI="https://bitbucket.org/agalanin/${PN}/downloads/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	dev-libs/libzip:=
+	sys-fs/fuse:0
+"
+RDEPEND="${DEPEND}"
+
+RESTRICT="test"
+
+DOCS=( changelog README.md )
+
+PATCHES=(
+	"${FILESDIR}/${PN}-0.4.5-makefile.patch"
+	"${FILESDIR}/${PN}-0.7.0-makefile.patch"
+	"${FILESDIR}/${PN}-0.7.0-fix-unknown-file-types.patch"
+	"${FILESDIR}/${PN}-0.7.0-fix-utf8-filenames.patch"
+	"${FILESDIR}/${PN}-0.7.0-error-reporting.patch"
+	"${FILESDIR}/${PN}-0.7.0-lazy-caching.patch"
+	"${FILESDIR}/${PN}-0.7.0-password.patch"
+	"${FILESDIR}/${PN}-0.7.0-no-symlinks.patch"
+	"${FILESDIR}/${PN}-0.7.0-deduplicate-filenames.patch"
+)
+
+src_compile() {
+	tc-export PKG_CONFIG
+	emake CXX="$(tc-getCXX)" CXXFLAGS="${CXXFLAGS} ${LDFLAGS}"
+}
+
+src_install() {
+	default
+	doman fuse-zip.1
+}
diff --git a/sys-fs/fuse/OWNERS b/sys-fs/fuse/OWNERS
new file mode 100644
index 0000000..cd9ddc6
--- /dev/null
+++ b/sys-fs/fuse/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cros-disks/OWNERS
diff --git a/sys-fs/rar2fs/files/rar2fs-1.29.0-password-from-stdin.patch b/sys-fs/rar2fs/files/rar2fs-1.29.0-password-from-stdin.patch
new file mode 100644
index 0000000..00aed1c
--- /dev/null
+++ b/sys-fs/rar2fs/files/rar2fs-1.29.0-password-from-stdin.patch
@@ -0,0 +1,50 @@
+From 0a78456a9e2633370f8b7b82ade5ce68f08b8481 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fran=C3=A7ois=20Degros?= <fdegros@chromium.org>
+Date: Thu, 23 Jul 2020 18:15:29 +1000
+Subject: [PATCH] Read password from stdin
+
+---
+ src/rar2fs.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/src/rar2fs.c b/src/rar2fs.c
+index 38c9f83..86bbcec 100644
+--- a/src/rar2fs.c
++++ b/src/rar2fs.c
+@@ -463,6 +463,33 @@ static wchar_t *get_password(const char *file, wchar_t *buf, size_t len)
+ static char *get_password(const char *file, char *buf, size_t len)
+ #endif
+ {
++#define GPASSWORD_SIZE 256
++  
++        static char gpassword[GPASSWORD_SIZE];
++
++        if (!gpassword[0]) {
++                /* Read password from stdin. */
++                printf("Password?\n");
++                if (!fgets(gpassword, GPASSWORD_SIZE, stdin))
++                        return NULL;
++
++                /* Remove newline at the end of password. */
++                const size_t n = strlen(gpassword);
++                if (n > 0) {
++                        char *const last = &gpassword[n - 1];
++                        if (*last == '\n')
++                                *last = '\0';
++                }
++        }
++
++        if (!gpassword[0])
++                return NULL;
++
++        if (mbstowcs(buf, gpassword, len) < len)
++                return buf;
++
++        return NULL;
++
+         char *f[2] = {NULL, NULL};
+         int l[2] = {0, 0};
+         int i;
+-- 
+2.28.0.526.ge36021eeef-goog
+
diff --git a/sys-fs/rar2fs/files/rar2fs-1.29.0-require-password.patch b/sys-fs/rar2fs/files/rar2fs-1.29.0-require-password.patch
new file mode 100644
index 0000000..9cf76d8
--- /dev/null
+++ b/sys-fs/rar2fs/files/rar2fs-1.29.0-require-password.patch
@@ -0,0 +1,174 @@
+From db48acf51044715837b27061907d723c74ac62ea Mon Sep 17 00:00:00 2001
+From: Hans Beckerus <hans.beckerus at gmail.com>
+Date: Fri, 14 Aug 2020 01:56:30 +0200
+Subject: [PATCH] Require password for encrypted RARs
+
+This is a port of the following commits from master:
+
+c3fd64f Make sure a bad password is detected for RAR4
+19285d1 Fix yet another issue with RAR4 encrypted archives
+7f1db90 Fix a problem in previous commit
+611c987 Require password for encrypted archive mounts
+
+When mounting an encrypted RAR, check if the provided password allows to
+decrypt the archive.
+
+If no password or an empty password is provided, the returned error is
+ERAR_MISSING_PASSWORD.
+
+If the password is invalid and non-empty, the returned error is either
+ERAR_MISSING_PASSWORD (for RAR V5) or ERAR_BAD_DATA (for RAR V4).
+---
+ src/rar2fs.c | 73 ++++++++++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 60 insertions(+), 13 deletions(-)
+
+diff --git a/src/rar2fs.c b/src/rar2fs.c
+index 08cd9cb..34b188a 100644
+--- a/src/rar2fs.c
++++ b/src/rar2fs.c
+@@ -186,6 +186,7 @@ struct eof_cb_arg {
+ struct extract_cb_arg {
+         char *arch;
+         void *arg;
++        int dry_run;
+ };
+ 
+ static int extract_index(const char *, const struct filecache_entry *, off_t);
+@@ -714,12 +715,20 @@ static FILE *popen_(const struct filecache_entry *entry_p, pid_t *cpid)
+ 
+         pid = fork();
+         if (pid == 0) {
+-                int ret;
++                int ret = 0;
+                 setpgid(getpid(), 0);
+                 close(pfd[0]);  /* Close unused read end */
+-                ret = extract_rar(entry_p->rar_p,
+-                                  entry_p->file_p,
+-                                  (void *)(uintptr_t) pfd[1]);
++                /* For folder mounts we need to perform an additional dummy
++                 * extraction attempt to avoid feeding the file descriptor
++                 * with garbage data in case of wrong password or CRC errors. */
++                if (mount_type == MOUNT_FOLDER)
++                        ret = extract_rar(entry_p->rar_p,
++                                          entry_p->file_p,
++                                          NULL);
++                if (!ret || ret == ERAR_UNKNOWN)
++                        ret = extract_rar(entry_p->rar_p,
++                                          entry_p->file_p,
++                                          (void *)(uintptr_t)pfd[1]);
+                 close(pfd[1]);
+                 _exit(ret);
+         } else if (pid < 0) {
+@@ -1496,11 +1505,11 @@ check_idx:
+                 if (sync_thread_read(op))
+                         return -EIO;
+                 /* If there is still no data assume something went wrong.
+-                 * Also assume that, if the file is encrypted, the reason
+-                 * for the error is a missing or invalid password!
++                 * Most likely CRC errors or an invalid password in the case 
++                 * of encrypted aechives.
+                  */
+                 if (!op->buf->offset)
+-                        return op->entry_p->flags.encrypted ? -EPERM : -EIO;
++                        return -EIO;
+         }
+         if ((off_t)(offset + size) > op->buf->offset) {
+                 if (offset >= op->buf->offset) {
+@@ -1720,6 +1729,7 @@ static void dump_stat(struct stat *stbuf)
+ static int collect_files(const char *arch, struct dir_entry_list *list)
+ {
+         RAROpenArchiveDataEx d;
++        int files;
+ 
+         memset(&d, 0, sizeof(RAROpenArchiveDataEx));
+         d.ArcName = (char *)arch;   /* Horrible cast! But hey... it is the API! */
+@@ -1730,15 +1740,40 @@ static int collect_files(const char *arch, struct dir_entry_list *list)
+         HANDLE h = RAROpenArchiveEx(&d);
+ 
+         /* Check for fault */
+-        const int err = d.OpenResult;
+-        if (err != ERAR_SUCCESS) {
++        if (d.OpenResult != ERAR_SUCCESS) {
+                 if (h)
+                         RARCloseArchive(h);
++                return -d.OpenResult;
++        }
+ 
+-                return -err;
++        RARArchiveDataEx *arc = NULL;
++        int dll_result = RARListArchiveEx(h, &arc);
++        if (dll_result && dll_result != ERAR_EOPEN) {
++                if (dll_result != ERAR_END_ARCHIVE) {
++                        RARFreeArchiveDataEx(&arc);
++                        RARCloseArchive(h);
++                        return -dll_result;
++                }
+         }
+ 
+-        int files = 0;
++        /* Pointless to test for encrypted files if header is already encrypted
++         * and could be read. */
++        if (d.Flags & ROADF_ENCHEADERS)
++                goto skip_file_check;
++
++        if (arc->hdr.Flags & RHDF_ENCRYPTED) {
++                dll_result = extract_rar((char *)arch, arc->hdr.FileName, NULL);
++                if (dll_result && dll_result != ERAR_UNKNOWN) {
++                        RARFreeArchiveDataEx(&arc);
++                        RARCloseArchive(h);
++                        return -dll_result;
++                }
++        }
++
++skip_file_check:
++        RARFreeArchiveDataEx(&arc);
++
++        files = 0;
+         if (d.Flags & ROADF_VOLUME) {
+                 char *arch_ = strdup(arch);
+                 int format = (d.Flags & ROADF_NEWNUMBERING) ? 0 : 1;
+@@ -1758,6 +1793,8 @@ static int collect_files(const char *arch, struct dir_entry_list *list)
+                 files = 1;
+         }
+ 
++        RARCloseArchive(h);
++
+         return files;
+ }
+ 
+@@ -1893,13 +1930,22 @@ static int CALLBACK extract_callback(UINT msg, LPARAM UserData,
+ {
+         struct extract_cb_arg *cb_arg = (struct extract_cb_arg *)(UserData);
+         if (msg == UCM_PROCESSDATA) {
++                /* Handle the special case when asking for a quick "dry run"
++                 * to test archive integrity. If all is well this will result
++                 * in an ERAR_UNKNOWN error. */
++                if (!cb_arg->arg) {
++                        if (!cb_arg->dry_run) {
++                                cb_arg->dry_run = 1;
++                                return 1;
++                        }
++                        return -1;
++                }
+                 /*
+                  * We do not need to handle the case that not all data is
+                  * written after return from write() since the pipe is not
+                  * opened using the O_NONBLOCK flag.
+                  */
+-                int fd = cb_arg->arg ? (LPARAM)cb_arg->arg : STDOUT_FILENO;
+-                if (write(fd, (void *)P1, P2) == -1) {
++                if (write((LPARAM)cb_arg->arg, (void *)P1, P2) == -1) {
+                         /*
+                          * Do not treat EPIPE as an error. It is the normal
+                          * case when the process is terminted, ie. the pipe is
+@@ -1942,6 +1988,7 @@ static int extract_rar(char *arch, const char *file, void *arg)
+         struct extract_cb_arg cb_arg;
+         cb_arg.arch = arch;
+         cb_arg.arg = arg;
++        cb_arg.dry_run = 0;
+ 
+         d.Callback = extract_callback;
+         d.UserData = (LPARAM)&cb_arg;
+-- 
+2.28.0.220.ged08abb693-goog
+
diff --git a/sys-fs/rar2fs/rar2fs-1.29.0-r1.ebuild b/sys-fs/rar2fs/rar2fs-1.29.0-r1.ebuild
deleted file mode 100644
index 0d6e075..0000000
--- a/sys-fs/rar2fs/rar2fs-1.29.0-r1.ebuild
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="A FUSE based filesystem that can mount one or multiple RAR archive(s)"
-HOMEPAGE="https://hasse69.github.io/rar2fs/ https://github.com/hasse69/rar2fs"
-SRC_URI="https://github.com/hasse69/${PN}/releases/download/v${PV}/${P}.tar.gz"
-
-LICENSE="GPL-3"
-SLOT="0"
-KEYWORDS="*"
-IUSE="debug"
-
-# Note that upstream unrar sometimes breaks ABI without updating the SONAME
-# version so try rebuilding rar2fs if it doesn't work following an unrar
-# upgrade.
-RDEPEND=">=app-arch/unrar-5:=
-	sys-fs/fuse:0"
-DEPEND="${RDEPEND}"
-
-src_configure() {
-	export USER_CFLAGS="${CFLAGS}"
-
-	econf \
-		--with-unrar="${ESYSROOT}"/usr/include/libunrar \
-		--disable-static-unrar \
-		$(use_enable debug)
-}
diff --git a/sys-fs/rar2fs/rar2fs-1.29.0-r4.ebuild b/sys-fs/rar2fs/rar2fs-1.29.0-r4.ebuild
new file mode 100644
index 0000000..effc1af
--- /dev/null
+++ b/sys-fs/rar2fs/rar2fs-1.29.0-r4.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="A FUSE based filesystem that can mount one or multiple RAR archive(s)"
+HOMEPAGE="https://hasse69.github.io/rar2fs/ https://github.com/hasse69/rar2fs"
+SRC_URI="https://github.com/hasse69/${PN}/releases/download/v${PV}/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="*"
+IUSE="debug"
+
+# Note that upstream unrar sometimes breaks ABI without updating the SONAME
+# version so try rebuilding rar2fs if it doesn't work following an unrar
+# upgrade.
+RDEPEND=">=app-arch/unrar-5:=
+	sys-fs/fuse:0"
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+	"${FILESDIR}/${PN}-1.29.0-require-password.patch"
+	"${FILESDIR}/${PN}-1.29.0-password-from-stdin.patch"
+)
+
+src_configure() {
+	export USER_CFLAGS="${CFLAGS}"
+
+	econf \
+		--with-unrar="${ESYSROOT}"/usr/include/libunrar \
+		--disable-static-unrar \
+		$(use_enable debug)
+}
diff --git a/sys-fs/udev/OWNERS b/sys-fs/udev/OWNERS
new file mode 100644
index 0000000..61bbd6f
--- /dev/null
+++ b/sys-fs/udev/OWNERS
@@ -0,0 +1 @@
+dtor@chromium.org
diff --git a/sys-fs/udev/udev-225-r26.ebuild b/sys-fs/udev/udev-225-r26.ebuild
deleted file mode 100644
index 64550b9..0000000
--- a/sys-fs/udev/udev-225-r26.ebuild
+++ /dev/null
@@ -1,457 +0,0 @@
-# Copyright 1999-2016 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id$
-
-EAPI=5
-
-inherit autotools bash-completion-r1 eutils linux-info multilib multilib-minimal toolchain-funcs udev user versionator
-
-if [[ ${PV} = 9999* ]]; then
-	EGIT_REPO_URI="git://anongit.freedesktop.org/systemd/systemd"
-	inherit git-r3
-else
-	patchset=
-	SRC_URI="https://github.com/systemd/systemd/archive/v${PV}.tar.gz -> systemd-${PV}.tar.gz"
-	if [[ -n "${patchset}" ]]; then
-		SRC_URI+="
-			https://dev.gentoo.org/~ssuominen/${P}-patches-${patchset}.tar.xz
-			https://dev.gentoo.org/~williamh/dist/${P}-patches-${patchset}.tar.xz"
-	fi
-	KEYWORDS="*"
-fi
-
-DESCRIPTION="Linux dynamic and persistent device naming support (aka userspace devfs)"
-HOMEPAGE="https://www.freedesktop.org/wiki/Software/systemd"
-
-LICENSE="LGPL-2.1 MIT GPL-2"
-SLOT="0"
-IUSE="acl +kmod openrc selinux static-libs"
-
-RESTRICT="test"
-
-COMMON_DEPEND=">=sys-apps/util-linux-2.24
-	sys-libs/libcap[${MULTILIB_USEDEP}]
-	acl? ( sys-apps/acl )
-	kmod? ( >=sys-apps/kmod-16 )
-	selinux? ( >=sys-libs/libselinux-2.1.9 )
-	!<sys-libs/glibc-2.11
-	!sys-apps/gentoo-systemd-integration
-	!sys-apps/systemd
-	abi_x86_32? (
-		!<=app-emulation/emul-linux-x86-baselibs-20130224-r7
-		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
-	)"
-# Force new make >= -r4 to skip some parallel build issues
-DEPEND="${COMMON_DEPEND}
-	dev-util/gperf
-	>=dev-util/intltool-0.50
-	>=sys-apps/coreutils-8.16
-	virtual/os-headers
-	virtual/pkgconfig
-	>=sys-devel/make-3.82-r4
-	>=sys-kernel/linux-headers-3.9
-	app-text/docbook-xml-dtd:4.2
-	app-text/docbook-xml-dtd:4.5
-	app-text/docbook-xsl-stylesheets
-	dev-libs/libxslt"
-RDEPEND="${COMMON_DEPEND}
-	!<sec-policy/selinux-base-2.20120725-r10"
-PDEPEND=">=sys-apps/hwids-20140304[udev]
-	openrc? ( >=sys-fs/udev-init-scripts-26 )"
-
-S=${WORKDIR}/systemd-${PV}
-
-PATCHES=(
-	"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-mediaX.patch
-	"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-symlinks.patch
-	"${FILESDIR}"/${PN}-225-libudev-util-change-util_replace_whitespace.patch
-	"${FILESDIR}"/${PN}-225-udev-event-add-replace_whitespace-param.patch
-	"${FILESDIR}"/${PN}-225-udev-rules-perform-whitespace-replacement.patch
-	"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-id-model.patch
-	"${FILESDIR}"/${PN}-225-udev-rules-all-values-can-contain-escaped-double-quotes-now.patch
-	"${FILESDIR}"/${PN}-225-udevadm-trigger-add-settle.patch
-	"${FILESDIR}"/${PN}-225-v4l_id-check-mplane-video-capture-and-output-capaili.patch
-	"${FILESDIR}"/${PN}-225-udevadm-hwdb-Return-non-zero-exit-code-on-error.patch
-	"${FILESDIR}"/${PN}-225-sysmacros.patch
-	"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-udmabuf.patch
-)
-
-check_default_rules() {
-	# Make sure there are no sudden changes to upstream rules file
-	# (more for my own needs than anything else ...)
-	local udev_rules_md5=b8ad860dccae0ca51656b33c405ea2ca
-	MD5=$(md5sum < "${S}"/rules/50-udev-default.rules)
-	MD5=${MD5/  -/}
-	if [[ ${MD5} != ${udev_rules_md5} ]]; then
-		eerror "50-udev-default.rules has been updated, please validate!"
-		eerror "md5sum: ${MD5}"
-		die "50-udev-default.rules has been updated, please validate!"
-	fi
-}
-
-pkg_setup() {
-	if [[ ${MERGE_TYPE} != buildonly ]]; then
-		CONFIG_CHECK="~BLK_DEV_BSG ~DEVTMPFS ~!IDE ~INOTIFY_USER ~!SYSFS_DEPRECATED ~!SYSFS_DEPRECATED_V2 ~SIGNALFD ~EPOLL ~FHANDLE ~NET ~!FW_LOADER_USER_HELPER ~UNIX"
-		linux-info_pkg_setup
-
-		# CONFIG_FHANDLE was introduced by 2.6.39
-		local MINKV=2.6.39
-
-		if kernel_is -lt ${MINKV//./ }; then
-			eerror "Your running kernel is too old to run this version of ${P}"
-			eerror "You need to upgrade kernel at least to ${MINKV}"
-		fi
-
-		if kernel_is -lt 3 7; then
-			ewarn "Your running kernel is too old to have firmware loader and"
-			ewarn "this version of ${P} doesn't have userspace firmware loader"
-			ewarn "If you need firmware support, you need to upgrade kernel at least to 3.7"
-		fi
-	fi
-}
-
-src_prepare() {
-	if ! [[ ${PV} = 9999* ]]; then
-		# secure_getenv() disable for non-glibc systems wrt bug #443030
-		if ! [[ $(grep -r secure_getenv * | wc -l) -eq 25 ]]; then
-			eerror "The line count for secure_getenv() failed, see bug #443030"
-			die
-		fi
-	fi
-
-	# backport some patches
-	if [[ -n "${patchset}" ]]; then
-		EPATCH_SUFFIX=patch EPATCH_FORCE=yes epatch
-	fi
-
-	cat <<-EOF > "${T}"/40-gentoo.rules
-	# Gentoo specific floppy and usb groups
-	SUBSYSTEM=="block", KERNEL=="fd[0-9]", GROUP="floppy"
-	SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="usb"
-	EOF
-
-	# change rules back to group uucp instead of dialout for now wrt #454556
-	sed -i -e 's/GROUP="dialout"/GROUP="uucp"/' rules/*.rules || die
-
-	# stub out the am_path_libcrypt function
-	echo 'AC_DEFUN([AM_PATH_LIBGCRYPT],[:])' > m4/gcrypt.m4
-
-	# apply user patches
-	epatch_user
-
-	eautoreconf
-
-	if ! [[ ${PV} = 9999* ]]; then
-		check_default_rules
-	fi
-
-	# Restore possibility of running --enable-static wrt #472608
-	sed -i \
-		-e '/--enable-static is not supported by systemd/s:as_fn_error:echo:' \
-		configure || die
-
-	if ! use elibc_glibc; then #443030
-		echo '#define secure_getenv(x) NULL' >> config.h.in
-		sed -i -e '/error.*secure_getenv/s:.*:#define secure_getenv(x) NULL:' src/shared/missing.h || die
-	fi
-
-	epatch "${PATCHES[@]}"
-}
-
-src_configure() {
-	cros_optimize_package_for_speed
-
-	# Prevent conflicts with i686 cross toolchain, bug 559726
-	tc-export AR CC NM OBJCOPY RANLIB
-	multilib-minimal_src_configure
-}
-
-multilib_src_configure() {
-	tc-export CC #463846
-	export cc_cv_CFLAGS__flto=no #502950
-	export cc_cv_CFLAGS__Werror_shadow=no #554454
-
-	# Keep sorted by ./configure --help and only pass --disable flags
-	# when *required* to avoid external deps or unnecessary compile
-	local econf_args
-	econf_args=(
-		--libdir=/usr/$(get_libdir)
-		--docdir=/usr/share/doc/${PF}
-		$(multilib_native_use_enable static-libs static)
-		--disable-nls
-		--disable-dbus
-		$(multilib_native_use_enable kmod)
-		--disable-xkbcommon
-		--disable-seccomp
-		$(multilib_native_use_enable selinux)
-		--disable-xz
-		--disable-lz4
-		--disable-pam
-		$(multilib_native_use_enable acl)
-		--disable-gcrypt
-		--disable-audit
-		--disable-libcryptsetup
-		--disable-qrencode
-		--disable-microhttpd
-		--disable-gnuefi
-		--disable-gnutls
-		--disable-libcurl
-		--disable-libidn
-		--disable-quotacheck
-		--disable-logind
-		--disable-polkit
-		--disable-myhostname
-		$(multilib_is_native_abi || echo "--disable-manpages")
-		--enable-split-usr
-		--without-python
-		--with-bashcompletiondir="$(get_bashcompdir)"
-		--with-rootprefix=
-		$(multilib_is_native_abi && echo "--with-rootlibdir=/$(get_libdir)")
-		--disable-elfutils
-	)
-
-	if ! multilib_is_native_abi; then
-		econf_args+=(
-			MOUNT_{CFLAGS,LIBS}=' '
-		)
-	fi
-
-	ECONF_SOURCE=${S} econf "${econf_args[@]}"
-}
-
-multilib_src_compile() {
-	echo 'BUILT_SOURCES: $(BUILT_SOURCES)' > "${T}"/Makefile.extra
-	emake -f Makefile -f "${T}"/Makefile.extra BUILT_SOURCES
-
-	# Most of the parallel build problems were solved by >=sys-devel/make-3.82-r4,
-	# but not everything -- separate building of the binaries as a workaround,
-	# which will force internal libraries required for the helpers to be built
-	# early enough, like eg. libsystemd-shared.la
-	if multilib_is_native_abi; then
-		local lib_targets=( libudev.la )
-		emake "${lib_targets[@]}"
-
-		local exec_targets=(
-			systemd-udevd
-			udevadm
-		)
-		emake "${exec_targets[@]}"
-
-		local helper_targets=(
-			ata_id
-			cdrom_id
-			collect
-			scsi_id
-			v4l_id
-			mtd_probe
-		)
-		emake "${helper_targets[@]}"
-
-		local man_targets=(
-			man/udev.conf.5
-			man/systemd.link.5
-			man/udev.7
-			man/systemd-udevd.service.8
-			man/udevadm.8
-		)
-		emake "${man_targets[@]}"
-	else
-		local lib_targets=( libudev.la )
-		emake "${lib_targets[@]}"
-	fi
-}
-
-multilib_src_install() {
-	if multilib_is_native_abi; then
-		local lib_LTLIBRARIES="libudev.la"
-		local pkgconfiglib_DATA="src/libudev/libudev.pc"
-
-		local targets=(
-			install-libLTLIBRARIES
-			install-includeHEADERS
-			install-rootbinPROGRAMS
-			install-rootlibexecPROGRAMS
-			install-udevlibexecPROGRAMS
-			install-dist_udevconfDATA
-			install-dist_udevrulesDATA
-			install-pkgconfiglibDATA
-			install-pkgconfigdataDATA
-			install-dist_docDATA
-			libudev-install-hook
-			install-directories-hook
-			install-dist_bashcompletionDATA
-			install-dist_networkDATA
-		)
-
-		# add final values of variables:
-		targets+=(
-			rootlibexec_PROGRAMS=systemd-udevd
-			rootbin_PROGRAMS=udevadm
-			lib_LTLIBRARIES="${lib_LTLIBRARIES}"
-			pkgconfiglib_DATA="${pkgconfiglib_DATA}"
-			pkgconfigdata_DATA="src/udev/udev.pc"
-			INSTALL_DIRS='$(sysconfdir)/udev/rules.d $(sysconfdir)/udev/hwdb.d $(sysconfdir)/systemd/network'
-			dist_bashcompletion_DATA="shell-completion/bash/udevadm"
-			dist_network_DATA="network/99-default.link"
-		)
-		emake -j1 DESTDIR="${D}" "${targets[@]}"
-		doman man/{udev.conf.5,systemd.link.5,udev.7,systemd-udevd.service.8,udevadm.8}
-	else
-		local lib_LTLIBRARIES="libudev.la"
-		local pkgconfiglib_DATA="src/libudev/libudev.pc"
-		local include_HEADERS="src/libudev/libudev.h"
-
-		local targets=(
-			install-libLTLIBRARIES
-			install-includeHEADERS
-			install-pkgconfiglibDATA
-		)
-
-		targets+=(
-			lib_LTLIBRARIES="${lib_LTLIBRARIES}"
-			pkgconfiglib_DATA="${pkgconfiglib_DATA}"
-			include_HEADERS="${include_HEADERS}"
-			)
-		emake -j1 DESTDIR="${D}" "${targets[@]}"
-	fi
-
-	# Move back to the old path since we filter out */systemd/* from images.
-	dodir /sbin
-	mv "${ED}"/lib/systemd/systemd-udevd "${ED}"/sbin/udevd || die
-}
-
-multilib_src_install_all() {
-	dodoc TODO
-
-	prune_libtool_files --all
-	rm -f "${D}"/lib/udev/rules.d/99-systemd.rules
-	rm -f "${D}"/usr/share/doc/${PF}/{LICENSE.*,GVARIANT-SERIALIZATION,DIFFERENCES,PORTING-DBUS1,sd-shutdown.h}
-
-	# see src_prepare() for content of 40-gentoo.rules
-	insinto /lib/udev/rules.d
-	doins "${T}"/40-gentoo.rules
-
-	# Install ChromeOS-specific rules
-	doins "${FILESDIR}"/91-chromeos-keyboard.rules
-	doins "${FILESDIR}"/91-kmsg-syslog-group.rules
-
-	# maintainer note: by not letting the upstream build-sys create the .so
-	# link, you also avoid a parallel make problem
-	mv "${D}"/usr/share/man/man8/systemd-udevd{.service,}.8
-}
-
-pkg_postinst() {
-	mkdir -p "${ROOT%/}"/run
-
-	# "losetup -f" is confused if there is an empty /dev/loop/, Bug #338766
-	# So try to remove it here (will only work if empty).
-	rmdir "${ROOT%/}"/dev/loop 2>/dev/null
-	if [[ -d ${ROOT%/}/dev/loop ]]; then
-		ewarn "Please make sure your remove /dev/loop,"
-		ewarn "else losetup may be confused when looking for unused devices."
-	fi
-
-	local fstab="${ROOT%/}"/etc/fstab dev path fstype rest
-	while read -r dev path fstype rest; do
-		if [[ ${path} == /dev && ${fstype} != devtmpfs ]]; then
-			ewarn "You need to edit your /dev line in ${fstab} to have devtmpfs"
-			ewarn "filesystem. Otherwise udev won't be able to boot."
-			ewarn "See, https://bugs.gentoo.org/453186"
-		fi
-	done < "${fstab}"
-
-	if [[ -d ${ROOT%/}/usr/lib/udev ]]; then
-		ewarn
-		ewarn "Please re-emerge all packages on your system which install"
-		ewarn "rules and helpers in /usr/lib/udev. They should now be in"
-		ewarn "/lib/udev."
-		ewarn
-		ewarn "One way to do this is to run the following command:"
-		ewarn "emerge -av1 \$(qfile -q -S -C /usr/lib/udev)"
-		ewarn "Note that qfile can be found in app-portage/portage-utils"
-	fi
-
-	local old_cd_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-cd.rules
-	local old_net_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-net.rules
-	for old_rules in "${old_cd_rules}" "${old_net_rules}"; do
-		if [[ -f ${old_rules} ]]; then
-			ewarn
-			ewarn "File ${old_rules} is from old udev installation but if you still use it,"
-			ewarn "rename it to something else starting with 70- to silence this deprecation"
-			ewarn "warning."
-		fi
-	done
-
-	elog
-	elog "Starting from version >= 197 the new predictable network interface names are"
-	elog "used by default, see:"
-	elog "https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames"
-	elog "https://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c"
-	elog
-	elog "Example command to get the information for the new interface name before booting"
-	elog "(replace <ifname> with, for example, eth0):"
-	elog "# udevadm test-builtin net_id /sys/class/net/<ifname> 2> /dev/null"
-	elog
-	elog "You can use either kernel parameter \"net.ifnames=0\", create empty"
-	elog "file /etc/systemd/network/99-default.link, or symlink it to /dev/null"
-	elog "to disable the feature."
-
-	if has_version 'sys-apps/biosdevname'; then
-		ewarn
-		ewarn "You can replace the functionality of sys-apps/biosdevname which has been"
-		ewarn "detected to be installed with the new predictable network interface names."
-	fi
-
-	ewarn
-	ewarn "You need to restart udev as soon as possible to make the upgrade go"
-	ewarn "into effect."
-	ewarn "The method you use to do this depends on your init system."
-	if has_version 'sys-apps/openrc'; then
-		ewarn "For sys-apps/openrc users it is:"
-		ewarn "# /etc/init.d/udev --nodeps restart"
-	fi
-
-	elog
-	elog "For more information on udev on Gentoo, upgrading, writing udev rules, and"
-	elog "fixing known issues visit:"
-	elog "https://wiki.gentoo.org/wiki/Udev"
-	elog "https://wiki.gentoo.org/wiki/Udev/upgrade"
-
-	# If user has disabled 80-net-name-slot.rules using a empty file or a symlink to /dev/null,
-	# do the same for 80-net-setup-link.rules to keep the old behavior
-	local net_move=no
-	local net_name_slot_sym=no
-	local net_rules_path="${ROOT%/}"/etc/udev/rules.d
-	local net_name_slot="${net_rules_path}"/80-net-name-slot.rules
-	local net_setup_link="${net_rules_path}"/80-net-setup-link.rules
-	if [[ ! -e ${net_setup_link} ]]; then
-		[[ -f ${net_name_slot} && $(sed -e "/^#/d" -e "/^\W*$/d" ${net_name_slot} | wc -l) == 0 ]] && net_move=yes
-		if [[ -L ${net_name_slot} && $(readlink ${net_name_slot}) == /dev/null ]]; then
-			net_move=yes
-			net_name_slot_sym=yes
-		fi
-	fi
-	if [[ ${net_move} == yes ]]; then
-		ebegin "Copying ${net_name_slot} to ${net_setup_link}"
-
-		if [[ ${net_name_slot_sym} == yes ]]; then
-			ln -nfs /dev/null "${net_setup_link}"
-		else
-			cp "${net_name_slot}" "${net_setup_link}"
-		fi
-		eend $?
-	fi
-
-	# https://cgit.freedesktop.org/systemd/systemd/commit/rules/50-udev-default.rules?id=3dff3e00e044e2d53c76fa842b9a4759d4a50e69
-	# https://bugs.gentoo.org/246847
-	# https://bugs.gentoo.org/514174
-	enewgroup input
-
-	# Update hwdb database in case the format is changed by udev version.
-	if has_version 'sys-apps/hwids[udev]'; then
-		udevadm hwdb --update --root="${ROOT%/}"
-		# Only reload when we are not upgrading to avoid potential race w/ incompatible hwdb.bin and the running udevd
-		# https://cgit.freedesktop.org/systemd/systemd/commit/?id=1fab57c209035f7e66198343074e9cee06718bda
-		[[ -z ${REPLACING_VERSIONS} ]] && udev_reload
-	fi
-}
diff --git a/sys-fs/udev/udev-225-r27.ebuild b/sys-fs/udev/udev-225-r27.ebuild
new file mode 100644
index 0000000..a112847
--- /dev/null
+++ b/sys-fs/udev/udev-225-r27.ebuild
@@ -0,0 +1,436 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+
+inherit autotools bash-completion-r1 eutils multilib multilib-minimal toolchain-funcs udev user versionator
+
+if [[ ${PV} = 9999* ]]; then
+	EGIT_REPO_URI="git://anongit.freedesktop.org/systemd/systemd"
+	inherit git-r3
+else
+	patchset=
+	SRC_URI="https://github.com/systemd/systemd/archive/v${PV}.tar.gz -> systemd-${PV}.tar.gz"
+	if [[ -n "${patchset}" ]]; then
+		SRC_URI+="
+			https://dev.gentoo.org/~ssuominen/${P}-patches-${patchset}.tar.xz
+			https://dev.gentoo.org/~williamh/dist/${P}-patches-${patchset}.tar.xz"
+	fi
+	KEYWORDS="*"
+fi
+
+DESCRIPTION="Linux dynamic and persistent device naming support (aka userspace devfs)"
+HOMEPAGE="https://www.freedesktop.org/wiki/Software/systemd"
+
+LICENSE="LGPL-2.1 MIT GPL-2"
+SLOT="0"
+IUSE="acl +kmod openrc selinux static-libs"
+
+RESTRICT="test"
+
+COMMON_DEPEND=">=sys-apps/util-linux-2.24
+	sys-libs/libcap[${MULTILIB_USEDEP}]
+	acl? ( sys-apps/acl )
+	kmod? ( >=sys-apps/kmod-16 )
+	selinux? ( >=sys-libs/libselinux-2.1.9 )
+	!<sys-libs/glibc-2.11
+	!sys-apps/gentoo-systemd-integration
+	!sys-apps/systemd
+	abi_x86_32? (
+		!<=app-emulation/emul-linux-x86-baselibs-20130224-r7
+		!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
+	)"
+# Force new make >= -r4 to skip some parallel build issues
+DEPEND="${COMMON_DEPEND}
+	dev-util/gperf
+	>=dev-util/intltool-0.50
+	>=sys-apps/coreutils-8.16
+	virtual/os-headers
+	virtual/pkgconfig
+	>=sys-devel/make-3.82-r4
+	>=sys-kernel/linux-headers-3.9
+	app-text/docbook-xml-dtd:4.2
+	app-text/docbook-xml-dtd:4.5
+	app-text/docbook-xsl-stylesheets
+	dev-libs/libxslt"
+RDEPEND="${COMMON_DEPEND}
+	!<sec-policy/selinux-base-2.20120725-r10"
+PDEPEND=">=sys-apps/hwids-20140304[udev]
+	openrc? ( >=sys-fs/udev-init-scripts-26 )"
+
+S=${WORKDIR}/systemd-${PV}
+
+PATCHES=(
+	"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-mediaX.patch
+	"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-symlinks.patch
+	"${FILESDIR}"/${PN}-225-libudev-util-change-util_replace_whitespace.patch
+	"${FILESDIR}"/${PN}-225-udev-event-add-replace_whitespace-param.patch
+	"${FILESDIR}"/${PN}-225-udev-rules-perform-whitespace-replacement.patch
+	"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-id-model.patch
+	"${FILESDIR}"/${PN}-225-udev-rules-all-values-can-contain-escaped-double-quotes-now.patch
+	"${FILESDIR}"/${PN}-225-udevadm-trigger-add-settle.patch
+	"${FILESDIR}"/${PN}-225-v4l_id-check-mplane-video-capture-and-output-capaili.patch
+	"${FILESDIR}"/${PN}-225-udevadm-hwdb-Return-non-zero-exit-code-on-error.patch
+	"${FILESDIR}"/${PN}-225-sysmacros.patch
+	"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-udmabuf.patch
+)
+
+check_default_rules() {
+	# Make sure there are no sudden changes to upstream rules file
+	# (more for my own needs than anything else ...)
+	local udev_rules_md5=b8ad860dccae0ca51656b33c405ea2ca
+	MD5=$(md5sum < "${S}"/rules/50-udev-default.rules)
+	MD5=${MD5/  -/}
+	if [[ ${MD5} != ${udev_rules_md5} ]]; then
+		eerror "50-udev-default.rules has been updated, please validate!"
+		eerror "md5sum: ${MD5}"
+		die "50-udev-default.rules has been updated, please validate!"
+	fi
+}
+
+src_prepare() {
+	if ! [[ ${PV} = 9999* ]]; then
+		# secure_getenv() disable for non-glibc systems wrt bug #443030
+		if ! [[ $(grep -r secure_getenv * | wc -l) -eq 25 ]]; then
+			eerror "The line count for secure_getenv() failed, see bug #443030"
+			die
+		fi
+	fi
+
+	# backport some patches
+	if [[ -n "${patchset}" ]]; then
+		EPATCH_SUFFIX=patch EPATCH_FORCE=yes epatch
+	fi
+
+	cat <<-EOF > "${T}"/40-gentoo.rules
+	# Gentoo specific floppy and usb groups
+	SUBSYSTEM=="block", KERNEL=="fd[0-9]", GROUP="floppy"
+	SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="usb"
+	EOF
+
+	# change rules back to group uucp instead of dialout for now wrt #454556
+	sed -i -e 's/GROUP="dialout"/GROUP="uucp"/' rules/*.rules || die
+
+	# stub out the am_path_libcrypt function
+	echo 'AC_DEFUN([AM_PATH_LIBGCRYPT],[:])' > m4/gcrypt.m4
+
+	# apply user patches
+	epatch_user
+
+	eautoreconf
+
+	if ! [[ ${PV} = 9999* ]]; then
+		check_default_rules
+	fi
+
+	# Restore possibility of running --enable-static wrt #472608
+	sed -i \
+		-e '/--enable-static is not supported by systemd/s:as_fn_error:echo:' \
+		configure || die
+
+	if ! use elibc_glibc; then #443030
+		echo '#define secure_getenv(x) NULL' >> config.h.in
+		sed -i -e '/error.*secure_getenv/s:.*:#define secure_getenv(x) NULL:' src/shared/missing.h || die
+	fi
+
+	epatch "${PATCHES[@]}"
+}
+
+src_configure() {
+	cros_optimize_package_for_speed
+
+	# Prevent conflicts with i686 cross toolchain, bug 559726
+	tc-export AR CC NM OBJCOPY RANLIB
+	multilib-minimal_src_configure
+}
+
+multilib_src_configure() {
+	tc-export CC #463846
+	export cc_cv_CFLAGS__flto=no #502950
+	export cc_cv_CFLAGS__Werror_shadow=no #554454
+
+	# Keep sorted by ./configure --help and only pass --disable flags
+	# when *required* to avoid external deps or unnecessary compile
+	local econf_args
+	econf_args=(
+		--libdir=/usr/$(get_libdir)
+		--docdir=/usr/share/doc/${PF}
+		$(multilib_native_use_enable static-libs static)
+		--disable-nls
+		--disable-dbus
+		$(multilib_native_use_enable kmod)
+		--disable-xkbcommon
+		--disable-seccomp
+		$(multilib_native_use_enable selinux)
+		--disable-xz
+		--disable-lz4
+		--disable-pam
+		$(multilib_native_use_enable acl)
+		--disable-gcrypt
+		--disable-audit
+		--disable-libcryptsetup
+		--disable-qrencode
+		--disable-microhttpd
+		--disable-gnuefi
+		--disable-gnutls
+		--disable-libcurl
+		--disable-libidn
+		--disable-quotacheck
+		--disable-logind
+		--disable-polkit
+		--disable-myhostname
+		$(multilib_is_native_abi || echo "--disable-manpages")
+		--enable-split-usr
+		--without-python
+		--with-bashcompletiondir="$(get_bashcompdir)"
+		--with-rootprefix=
+		$(multilib_is_native_abi && echo "--with-rootlibdir=/$(get_libdir)")
+		--disable-elfutils
+	)
+
+	if ! multilib_is_native_abi; then
+		econf_args+=(
+			MOUNT_{CFLAGS,LIBS}=' '
+		)
+	fi
+
+	ECONF_SOURCE=${S} econf "${econf_args[@]}"
+}
+
+multilib_src_compile() {
+	echo 'BUILT_SOURCES: $(BUILT_SOURCES)' > "${T}"/Makefile.extra
+	emake -f Makefile -f "${T}"/Makefile.extra BUILT_SOURCES
+
+	# Most of the parallel build problems were solved by >=sys-devel/make-3.82-r4,
+	# but not everything -- separate building of the binaries as a workaround,
+	# which will force internal libraries required for the helpers to be built
+	# early enough, like eg. libsystemd-shared.la
+	if multilib_is_native_abi; then
+		local lib_targets=( libudev.la )
+		emake "${lib_targets[@]}"
+
+		local exec_targets=(
+			systemd-udevd
+			udevadm
+		)
+		emake "${exec_targets[@]}"
+
+		local helper_targets=(
+			ata_id
+			cdrom_id
+			collect
+			scsi_id
+			v4l_id
+			mtd_probe
+		)
+		emake "${helper_targets[@]}"
+
+		local man_targets=(
+			man/udev.conf.5
+			man/systemd.link.5
+			man/udev.7
+			man/systemd-udevd.service.8
+			man/udevadm.8
+		)
+		emake "${man_targets[@]}"
+	else
+		local lib_targets=( libudev.la )
+		emake "${lib_targets[@]}"
+	fi
+}
+
+multilib_src_install() {
+	if multilib_is_native_abi; then
+		local lib_LTLIBRARIES="libudev.la"
+		local pkgconfiglib_DATA="src/libudev/libudev.pc"
+
+		local targets=(
+			install-libLTLIBRARIES
+			install-includeHEADERS
+			install-rootbinPROGRAMS
+			install-rootlibexecPROGRAMS
+			install-udevlibexecPROGRAMS
+			install-dist_udevconfDATA
+			install-dist_udevrulesDATA
+			install-pkgconfiglibDATA
+			install-pkgconfigdataDATA
+			install-dist_docDATA
+			libudev-install-hook
+			install-directories-hook
+			install-dist_bashcompletionDATA
+			install-dist_networkDATA
+		)
+
+		# add final values of variables:
+		targets+=(
+			rootlibexec_PROGRAMS=systemd-udevd
+			rootbin_PROGRAMS=udevadm
+			lib_LTLIBRARIES="${lib_LTLIBRARIES}"
+			pkgconfiglib_DATA="${pkgconfiglib_DATA}"
+			pkgconfigdata_DATA="src/udev/udev.pc"
+			INSTALL_DIRS='$(sysconfdir)/udev/rules.d $(sysconfdir)/udev/hwdb.d $(sysconfdir)/systemd/network'
+			dist_bashcompletion_DATA="shell-completion/bash/udevadm"
+			dist_network_DATA="network/99-default.link"
+		)
+		emake -j1 DESTDIR="${D}" "${targets[@]}"
+		doman man/{udev.conf.5,systemd.link.5,udev.7,systemd-udevd.service.8,udevadm.8}
+	else
+		local lib_LTLIBRARIES="libudev.la"
+		local pkgconfiglib_DATA="src/libudev/libudev.pc"
+		local include_HEADERS="src/libudev/libudev.h"
+
+		local targets=(
+			install-libLTLIBRARIES
+			install-includeHEADERS
+			install-pkgconfiglibDATA
+		)
+
+		targets+=(
+			lib_LTLIBRARIES="${lib_LTLIBRARIES}"
+			pkgconfiglib_DATA="${pkgconfiglib_DATA}"
+			include_HEADERS="${include_HEADERS}"
+			)
+		emake -j1 DESTDIR="${D}" "${targets[@]}"
+	fi
+
+	# Move back to the old path since we filter out */systemd/* from images.
+	dodir /sbin
+	mv "${ED}"/lib/systemd/systemd-udevd "${ED}"/sbin/udevd || die
+}
+
+multilib_src_install_all() {
+	dodoc TODO
+
+	prune_libtool_files --all
+	rm -f "${D}"/lib/udev/rules.d/99-systemd.rules
+	rm -f "${D}"/usr/share/doc/${PF}/{LICENSE.*,GVARIANT-SERIALIZATION,DIFFERENCES,PORTING-DBUS1,sd-shutdown.h}
+
+	# see src_prepare() for content of 40-gentoo.rules
+	insinto /lib/udev/rules.d
+	doins "${T}"/40-gentoo.rules
+
+	# Install ChromeOS-specific rules
+	doins "${FILESDIR}"/91-chromeos-keyboard.rules
+	doins "${FILESDIR}"/91-kmsg-syslog-group.rules
+
+	# maintainer note: by not letting the upstream build-sys create the .so
+	# link, you also avoid a parallel make problem
+	mv "${D}"/usr/share/man/man8/systemd-udevd{.service,}.8
+}
+
+pkg_postinst() {
+	mkdir -p "${ROOT%/}"/run
+
+	# "losetup -f" is confused if there is an empty /dev/loop/, Bug #338766
+	# So try to remove it here (will only work if empty).
+	rmdir "${ROOT%/}"/dev/loop 2>/dev/null
+	if [[ -d ${ROOT%/}/dev/loop ]]; then
+		ewarn "Please make sure your remove /dev/loop,"
+		ewarn "else losetup may be confused when looking for unused devices."
+	fi
+
+	local fstab="${ROOT%/}"/etc/fstab dev path fstype rest
+	while read -r dev path fstype rest; do
+		if [[ ${path} == /dev && ${fstype} != devtmpfs ]]; then
+			ewarn "You need to edit your /dev line in ${fstab} to have devtmpfs"
+			ewarn "filesystem. Otherwise udev won't be able to boot."
+			ewarn "See, https://bugs.gentoo.org/453186"
+		fi
+	done < "${fstab}"
+
+	if [[ -d ${ROOT%/}/usr/lib/udev ]]; then
+		ewarn
+		ewarn "Please re-emerge all packages on your system which install"
+		ewarn "rules and helpers in /usr/lib/udev. They should now be in"
+		ewarn "/lib/udev."
+		ewarn
+		ewarn "One way to do this is to run the following command:"
+		ewarn "emerge -av1 \$(qfile -q -S -C /usr/lib/udev)"
+		ewarn "Note that qfile can be found in app-portage/portage-utils"
+	fi
+
+	local old_cd_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-cd.rules
+	local old_net_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-net.rules
+	for old_rules in "${old_cd_rules}" "${old_net_rules}"; do
+		if [[ -f ${old_rules} ]]; then
+			ewarn
+			ewarn "File ${old_rules} is from old udev installation but if you still use it,"
+			ewarn "rename it to something else starting with 70- to silence this deprecation"
+			ewarn "warning."
+		fi
+	done
+
+	elog
+	elog "Starting from version >= 197 the new predictable network interface names are"
+	elog "used by default, see:"
+	elog "https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames"
+	elog "https://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c"
+	elog
+	elog "Example command to get the information for the new interface name before booting"
+	elog "(replace <ifname> with, for example, eth0):"
+	elog "# udevadm test-builtin net_id /sys/class/net/<ifname> 2> /dev/null"
+	elog
+	elog "You can use either kernel parameter \"net.ifnames=0\", create empty"
+	elog "file /etc/systemd/network/99-default.link, or symlink it to /dev/null"
+	elog "to disable the feature."
+
+	if has_version 'sys-apps/biosdevname'; then
+		ewarn
+		ewarn "You can replace the functionality of sys-apps/biosdevname which has been"
+		ewarn "detected to be installed with the new predictable network interface names."
+	fi
+
+	ewarn
+	ewarn "You need to restart udev as soon as possible to make the upgrade go"
+	ewarn "into effect."
+	ewarn "The method you use to do this depends on your init system."
+	if has_version 'sys-apps/openrc'; then
+		ewarn "For sys-apps/openrc users it is:"
+		ewarn "# /etc/init.d/udev --nodeps restart"
+	fi
+
+	elog
+	elog "For more information on udev on Gentoo, upgrading, writing udev rules, and"
+	elog "fixing known issues visit:"
+	elog "https://wiki.gentoo.org/wiki/Udev"
+	elog "https://wiki.gentoo.org/wiki/Udev/upgrade"
+
+	# If user has disabled 80-net-name-slot.rules using a empty file or a symlink to /dev/null,
+	# do the same for 80-net-setup-link.rules to keep the old behavior
+	local net_move=no
+	local net_name_slot_sym=no
+	local net_rules_path="${ROOT%/}"/etc/udev/rules.d
+	local net_name_slot="${net_rules_path}"/80-net-name-slot.rules
+	local net_setup_link="${net_rules_path}"/80-net-setup-link.rules
+	if [[ ! -e ${net_setup_link} ]]; then
+		[[ -f ${net_name_slot} && $(sed -e "/^#/d" -e "/^\W*$/d" ${net_name_slot} | wc -l) == 0 ]] && net_move=yes
+		if [[ -L ${net_name_slot} && $(readlink ${net_name_slot}) == /dev/null ]]; then
+			net_move=yes
+			net_name_slot_sym=yes
+		fi
+	fi
+	if [[ ${net_move} == yes ]]; then
+		ebegin "Copying ${net_name_slot} to ${net_setup_link}"
+
+		if [[ ${net_name_slot_sym} == yes ]]; then
+			ln -nfs /dev/null "${net_setup_link}"
+		else
+			cp "${net_name_slot}" "${net_setup_link}"
+		fi
+		eend $?
+	fi
+
+	# https://cgit.freedesktop.org/systemd/systemd/commit/rules/50-udev-default.rules?id=3dff3e00e044e2d53c76fa842b9a4759d4a50e69
+	# https://bugs.gentoo.org/246847
+	# https://bugs.gentoo.org/514174
+	enewgroup input
+
+	# Update hwdb database in case the format is changed by udev version.
+	if has_version 'sys-apps/hwids[udev]'; then
+		udevadm hwdb --update --root="${ROOT%/}"
+		# Only reload when we are not upgrading to avoid potential race w/ incompatible hwdb.bin and the running udevd
+		# https://cgit.freedesktop.org/systemd/systemd/commit/?id=1fab57c209035f7e66198343074e9cee06718bda
+		[[ -z ${REPLACING_VERSIONS} ]] && udev_reload
+	fi
+}
diff --git a/sys-kernel/OWNERS b/sys-kernel/OWNERS
new file mode 100644
index 0000000..497a58f
--- /dev/null
+++ b/sys-kernel/OWNERS
@@ -0,0 +1 @@
+include /OWNERS.kernel
diff --git a/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1234.ebuild b/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1234.ebuild
deleted file mode 100644
index d626c35..0000000
--- a/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1234.ebuild
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="e1661767aa6135655e401eaf9ddec6797b1bd479"
-CROS_WORKON_TREE="f856d1f901691920fd8e6d7c8995c9597994df60"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v3.10"
-CROS_WORKON_EGIT_BRANCH="chromeos-3.10"
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 3.10"
-KEYWORDS="*"
-RDEPEND="!sys-kernel/kernel-freon"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1236.ebuild b/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1236.ebuild
new file mode 100644
index 0000000..6e0987f
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-3.10.18-r1236.ebuild
@@ -0,0 +1,28 @@
+# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="e4cf194725f8331ddbd8429fad358e3667d81d3c"
+CROS_WORKON_TREE="9f900dc633ef489f05a33976c927674a5a99988b"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v3.10"
+CROS_WORKON_EGIT_BRANCH="chromeos-3.10"
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 3.10"
+KEYWORDS="*"
+RDEPEND="!sys-kernel/kernel-freon"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-9999.ebuild b/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-9999.ebuild
index 61fdf7b..fbe1a5d 100644
--- a/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-3_10/chromeos-kernel-3_10-9999.ebuild
@@ -23,4 +23,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2253.ebuild b/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2253.ebuild
deleted file mode 100644
index d50d1ed..0000000
--- a/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2253.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="6d3298b09e7a8a8013772fe2321af9a6b362f9c9"
-CROS_WORKON_TREE="7f22665ec9ae82914f88efb5ba2f0494d7cec5e3"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v3.14"
-CROS_WORKON_EGIT_BRANCH="chromeos-3.14"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R81-12607.58-1578524353"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 3.14"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2257.ebuild b/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2257.ebuild
new file mode 100644
index 0000000..df1f2f2
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-3.14-r2257.ebuild
@@ -0,0 +1,45 @@
+# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="0cb6392964cbd599082006142d0caf12ae336761"
+CROS_WORKON_TREE="c13b7413dc08913d8ee75e528ebc8346b7ff890b"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v3.14"
+CROS_WORKON_EGIT_BRANCH="chromeos-3.14"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R81-12607.58-1578524353"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 3.14"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-9999.ebuild b/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-9999.ebuild
index 01f751a..75dd2f5 100644
--- a/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-3_14/chromeos-kernel-3_14-9999.ebuild
@@ -40,4 +40,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_18/Manifest b/sys-kernel/chromeos-kernel-3_18/Manifest
index 89973f9..4cfe81d 100644
--- a/sys-kernel/chromeos-kernel-3_18/Manifest
+++ b/sys-kernel/chromeos-kernel-3_18/Manifest
@@ -1,2 +1,2 @@
-DIST chromeos-kernel-3_18-R85-13295.0-1592818714.gcov.xz 561220 BLAKE2B b9635c0262c39bb95cd6779a55b0c3e151b837af9f12fe89f638c95cad907b2167815b020bab62b8177849b579b2779f6d3c705d4bdc5953eab6350ad3db550e SHA512 c2c6e579f35c1056f542dfa6a39f7fa90449e0bb9998138b7e215eb282bf3e350aa1dbfddf40a307adf2038119769ea1c1faa245c909fb4ff9c179a1f37a51e1
-DIST chromeos-kernel-3_18-R86-13308.0-1593423468.gcov.xz 738204 BLAKE2B 7185124ad5ab3b7de2b790b0ae398408eddbdc18486f953c605efc0f548ee9468821b933169592df258c162ea566d09c214da5dbffeb3728066294918c4586d4 SHA512 d520a36fe22c7d0692861a30e7f6fd5d6cd009a28f62cc0c25ef4ac909376271923e8e138707d5fdae611e78a8019fc605f71dfbaa5a404c50a14d870015ec1f
+DIST chromeos-kernel-3_18-R86-13371.0-1598261536.gcov.xz 592200 BLAKE2B 23105cf05f3aa51f5d044b5c9a384edc4a9c3fe17ed5b9b4803a7a2e54e99d29ca95b1115a4a629b2324d493cf8033065f5812a7f828bcfd4f26aa45bede80eb SHA512 23eaa3371fab389e404a1581732a5ac7be644445e2f020f8c60fad413de688f2b87ff2789d1ea3a0a5b79ea5560fb8154ac9dcf48c632628f806c80ad65253b5
+DIST chromeos-kernel-3_18-R87-13421.11-1599471395.gcov.xz 599336 BLAKE2B 9341680dc4eb770c4337b0e7193cd614be970511e13edae126c11c63fcca4bb0717d319a6c82db6f5971ad239c789218718a6bc18ca2870c5c34f3295c0194a0 SHA512 5907e8b3c5950f77bc27d8b2d91bcfcc3f3b1fd46bdf5a74c1605f5cef3611745b60d39b9809bf11313821b0519c43ae6436d12ea9b336cff74e2ec91289a83d
diff --git a/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2546.ebuild b/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2546.ebuild
deleted file mode 100644
index 0ea0168..0000000
--- a/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2546.ebuild
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="355e85834c7caa89a960f6fe2fe3613f5729cbea"
-CROS_WORKON_TREE="f0f9f30e8733a2062ec7c521fbc98383041874f0"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v3.18"
-CROS_WORKON_EGIT_BRANCH="chromeos-3.18"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423468"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 3.18"
-KEYWORDS="*"
-
-RDEPEND="!!sys-kernel/gale-kernel-3_18"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2585.ebuild b/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2585.ebuild
new file mode 100644
index 0000000..85958c2
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-3.18-r2585.ebuild
@@ -0,0 +1,47 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="e0782a6dfa134be8a282d0ddc4002361f7b54ca2"
+CROS_WORKON_TREE="d4b4ecd28d7aa67b7df0b310f4fa10bb16ef8219"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v3.18"
+CROS_WORKON_EGIT_BRANCH="chromeos-3.18"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R87-13421.11-1599471395"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 3.18"
+KEYWORDS="*"
+
+RDEPEND="!!sys-kernel/gale-kernel-3_18"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-9999.ebuild b/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-9999.ebuild
index 101d69d..a3f4420 100644
--- a/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-3_18/chromeos-kernel-3_18-9999.ebuild
@@ -16,7 +16,7 @@
 AFDO_LOCATION=""
 
 # Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423468"
+AFDO_PROFILE_VERSION="R87-13421.11-1599471395"
 
 # Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
 # If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
@@ -42,4 +42,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r855.ebuild b/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r855.ebuild
deleted file mode 100644
index 4e02dc8f..0000000
--- a/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r855.ebuild
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="6a7f17201999c94cf9582e3ce1ff73316b77acfa"
-CROS_WORKON_TREE="2e99301f289461ae4a6ff8a82b667dce179bb8ae"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v3.8"
-CROS_WORKON_EGIT_BRANCH="chromeos-3.8"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R77-12240.0-1563788154"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 3.8"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r857.ebuild b/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r857.ebuild
new file mode 100644
index 0000000..70ea681
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-3.8.11-r857.ebuild
@@ -0,0 +1,43 @@
+# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="956b51ff44ede9ae9199a00b5e96324f4f14c740"
+CROS_WORKON_TREE="8ad688be73740fc0d5a14b3ce713c54571be4c15"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v3.8"
+CROS_WORKON_EGIT_BRANCH="chromeos-3.8"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R77-12240.0-1563788154"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 3.8"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-9999.ebuild b/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-9999.ebuild
index 20adb02..12b3df2 100644
--- a/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-3_8/chromeos-kernel-3_8-9999.ebuild
@@ -38,4 +38,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_14/Manifest b/sys-kernel/chromeos-kernel-4_14/Manifest
index ad2aae2..9e1b4bc 100644
--- a/sys-kernel/chromeos-kernel-4_14/Manifest
+++ b/sys-kernel/chromeos-kernel-4_14/Manifest
@@ -1,2 +1,2 @@
-DIST chromeos-kernel-4_14-R85-13295.0-1592818845.gcov.xz 564760 BLAKE2B a739661a2441dc042b0acc4bd1ebd878e000d75ad479c451d6ebf01190932f476bc73df6ae4e257b4cd48d6a0bb16ef0374352860d895021d803f2aefcae443f SHA512 7138cd533ba4afb3bb02fadfc43519c4a510aa620f6c53c5c947dc925553664b9d1e70a557e007a856517c87ba02efda85fe5ea21e72770f61d8770d923e82d3
-DIST chromeos-kernel-4_14-R86-13308.0-1593423143.gcov.xz 604352 BLAKE2B 1248438abd5288890721ee419f1754e527357c7d8d64b5dbddded8fa916741661f564dfb0d32dd33190d46651c4816f77d4a93ac0453cd119df04ee8dc031423 SHA512 40150c38c847cf3ff293c186e5a6e6b9d3acb3f59fd43971a2b0b6dec00e40042bcf538eb4474a13cc0aba64e3711675d795068a02bf386608b540c305f736df
+DIST chromeos-kernel-4_14-R86-13380.0-1598261903.gcov.xz 881592 BLAKE2B 04cb3a65a1dcf37329ce811a0d397bfda8e20e8cff006d6123f0026dd9f9837166210b4255c371b881ff419a6baeeaf2ba18803950eec44290c729d2b69f92a6 SHA512 7e35e316449f4a9ce1c5f7beab12aa2d24712b35f2c0c4e15533ef301f61e702a37812bc8831e8d6278e84ac143e32e96b45d6eed50829d62d619cfce3c3817b
+DIST chromeos-kernel-4_14-R87-13421.11-1599471640.gcov.xz 736032 BLAKE2B 211069bf9996deb120ca729d9057a7cdb252384b43d4315e7d7a62839359ffab4743c5f38c2d8b5b384ac14e74f8f1ce972ae74ada453a679da02e21941dabf8 SHA512 9638d7bd5e20d8569ce80fdc995396fc85b4e9f25d2bce928bf9632b8906d8a6078c16b4b13426ea958e4eeb44294bd6ff35d2129d9ad05a714bf96975e11b53
diff --git a/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.187-r1257.ebuild b/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.187-r1257.ebuild
deleted file mode 100644
index 2b7db27..0000000
--- a/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.187-r1257.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="d778c7455b57fa5223550e28f8465f04eefcdd5f"
-CROS_WORKON_TREE="4baf31bd16d36a47f5fe634b6bd732b25394cc1a"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v4.14"
-CROS_WORKON_EGIT_BRANCH="chromeos-4.14"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423143"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 4.14"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.199-r1384.ebuild b/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.199-r1384.ebuild
new file mode 100644
index 0000000..3d7b172
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-4.14.199-r1384.ebuild
@@ -0,0 +1,46 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="a113f70da467394bbb475374a93c7ccf9ec395fc"
+CROS_WORKON_TREE="459d4dbc4802cd75e496b494adade8f21801af1f"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v4.14"
+CROS_WORKON_EGIT_BRANCH="chromeos-4.14"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R87-13421.11-1599471640"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 4.14"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-9999.ebuild b/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-9999.ebuild
index 412e58fb..8bfcb8f 100644
--- a/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-4_14/chromeos-kernel-4_14-9999.ebuild
@@ -17,7 +17,7 @@
 AFDO_LOCATION=""
 
 # Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423143"
+AFDO_PROFILE_VERSION="R87-13421.11-1599471640"
 
 # Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
 # If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
@@ -41,4 +41,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r5.ebuild b/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r5.ebuild
deleted file mode 100644
index 099f757..0000000
--- a/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r5.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="878295c31c22a257f46a15920d0f3be094364c30"
-CROS_WORKON_TREE="c8a743644582b6ad1d265f204f00bad3e1b5ada8"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v4.19-ht"
-CROS_WORKON_EGIT_BRANCH="chromeos-4.19-ht"
-
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 4.19-ht"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r6.ebuild b/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r6.ebuild
new file mode 100644
index 0000000..a133a73
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-4.19.115-r6.ebuild
@@ -0,0 +1,44 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="878295c31c22a257f46a15920d0f3be094364c30"
+CROS_WORKON_TREE="c8a743644582b6ad1d265f204f00bad3e1b5ada8"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v4.19-ht"
+CROS_WORKON_EGIT_BRANCH="chromeos-4.19-ht"
+
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 4.19-ht"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-9999.ebuild b/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-9999.ebuild
index 5f31c76..4029aa3 100644
--- a/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-4_19-ht/chromeos-kernel-4_19-ht-9999.ebuild
@@ -39,4 +39,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_19/Manifest b/sys-kernel/chromeos-kernel-4_19/Manifest
index f8816c4..9951f00 100644
--- a/sys-kernel/chromeos-kernel-4_19/Manifest
+++ b/sys-kernel/chromeos-kernel-4_19/Manifest
@@ -1,2 +1,2 @@
-DIST chromeos-kernel-4_19-R85-13295.0-1592818980.gcov.xz 648924 BLAKE2B 9af24b4819d272e040ec7d599ac72929b237f1da049424f2078429b778eba7dfd8bd4e913ddcbb2b6c8ae38fbf80bc75b4db181488514348ab125a9b1fe3170b SHA512 c2eb61ba888893ffb4eb8a60aaac52319859500dc368b6f05010f5bce5aa81b00528c1060f780ce2c15ab7f17013dd96e3c7f1cd6d9c9c9e1db433eb45f5c67c
-DIST chromeos-kernel-4_19-R86-13308.0-1593423563.gcov.xz 655992 BLAKE2B 37915643caab7242375717cc62811fe9f33f343041ab68d5268ab313233865c556f92d48ffdb2998fb17a46a013333734a69abc181c31dd4bec1efe16419120a SHA512 2e5d62e8b3c74e5715fa37de30e5d609df91633a5e6c0858bcc795df840d0077ddfde5aa17748667c9f0fd884e82bc06dad838d1e4ee586ac35006ef6d5b3e30
+DIST chromeos-kernel-4_19-R86-13390.0-1598262023.gcov.xz 686300 BLAKE2B cc47447df1f2815abe415ba0f962081c17ad39dc92717bcd0ffce7bd49d8b5d7ec974eb950fe82f74ce1cf29bd46ea45dc9a1daade92f7498c86b40376332542 SHA512 e66049498e9ded734182f69f167bc051bae5a1af211750a8f0bd468b810cb402620ffe2110193cd01aeaa0a4329b09f80e0b67a444070574cbd669abef7cc41f
+DIST chromeos-kernel-4_19-R87-13421.11-1599472679.gcov.xz 736248 BLAKE2B 8e9dc7d7daca4c0c06692c5eaf4d8927c18464844d85bf4e8164800957bcb5aa0f06ab324bb7f9ec7ca58d252c1d955dfaa5c6423a213a7bb018161d499a6ace SHA512 8b32842aab5f3f4774ed093df8f045147d88849eb4a082dbc8446941559e35869758451831afca7d385762c4db57a2d6b8f7054904f2c5e3136943098586e952
diff --git a/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.131-r1463.ebuild b/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.131-r1463.ebuild
deleted file mode 100644
index 94e5fdd..0000000
--- a/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.131-r1463.ebuild
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="f41472ee5e9bae830ed663f9c28f6763d968f4a9"
-CROS_WORKON_TREE="61b00fd245d6d4c8f520cabed4fa5b8ae2d74cb8"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v4.19"
-CROS_WORKON_EGIT_BRANCH="chromeos-4.19"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423563"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 4.19"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.148-r1626.ebuild b/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.148-r1626.ebuild
new file mode 100644
index 0000000..4e76499
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-4.19.148-r1626.ebuild
@@ -0,0 +1,46 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="12b32b6905c35b755de0e19e9608b5eec1adb9ab"
+CROS_WORKON_TREE="cb8b4fa32386a9cd89669825e5678732fa1c560b"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v4.19"
+CROS_WORKON_EGIT_BRANCH="chromeos-4.19"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R87-13421.11-1599472679"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 4.19"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-9999.ebuild b/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-9999.ebuild
index 248007a..6d0e342 100644
--- a/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-4_19/chromeos-kernel-4_19-9999.ebuild
@@ -17,7 +17,7 @@
 AFDO_LOCATION=""
 
 # Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423563"
+AFDO_PROFILE_VERSION="R87-13421.11-1599472679"
 
 # Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
 # If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
@@ -41,4 +41,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_4/Manifest b/sys-kernel/chromeos-kernel-4_4/Manifest
index 36ad1b4..d8db973 100644
--- a/sys-kernel/chromeos-kernel-4_4/Manifest
+++ b/sys-kernel/chromeos-kernel-4_4/Manifest
@@ -1,2 +1,2 @@
-DIST chromeos-kernel-4_4-R85-13295.0-1592818619.gcov.xz 540644 BLAKE2B 717617a89b4d075dab6cba6e41e89d93c5fe6824770eef8eae2509569096b09c40e1ca09eb2d5364b17d4d688fd5269835a169370939b78818239990aea24575 SHA512 54bc646c045e54d1ccfee94538db25f1d3fc6f136f099f108339d8fbc53e8c911ed01a906b31b837bbd7cc8529b5db0853f6bc72e7bce94ca1cd1b3772de65ee
-DIST chromeos-kernel-4_4-R86-13308.0-1593423371.gcov.xz 628136 BLAKE2B cd3467b8006ca0d0b4c4e12ac8ac7d098f3e2f5e80acf36c2c35387ded76a162bdfb0e6be33616f4d1091b27135db0697d065f30afd6c60f27eb3e4b9dd13195 SHA512 7e70cecbbdce8d9ad5358c477c491c81a23cd679b6551237af20f0d91272e52a96302fa3a09be99968caeddf31cc42fb910a3cfee2e810c405d734e65f4897b4
+DIST chromeos-kernel-4_4-R86-13380.0-1598262292.gcov.xz 814312 BLAKE2B 51b5aa2fb413d8fb9c7822c87df7232e16a3bb23cb2036515d2a32bfd069517d00fc4e8f32f104438c0fb08e3c6af625e4dc15da0e575dd5961c41237b627115 SHA512 5a4d443f0d01f41b5c51454f0f7fb9eb424bf6f65d1cf0139bc8c9e51b86cb280fdb390208301e37eff0f2f6ddeab1027a620696ad7100051097fcb517e05cfe
+DIST chromeos-kernel-4_4-R87-13421.11-1599472924.gcov.xz 747088 BLAKE2B 9732678643941932b93c3e332fc5aa6dd35ef9b4697bc199cd9b380715d6e9abddb13d39138fc2fdd613003f0913fadc842d38f3f8641bd76c34b721b719791f SHA512 454879cb8cf7051a404f4245ca916878c3218891b3fdbc298502c34f1352792e4daf9dc9c7ada04daae31f44202dd88569df1b68710fa3350a5da9b66b61314e
diff --git a/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.229-r2300.ebuild b/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.229-r2300.ebuild
deleted file mode 100644
index eda79af..0000000
--- a/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.229-r2300.ebuild
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="41d1c6f7b0e49c7e960317431af4ed4686ff67fe"
-CROS_WORKON_TREE="1e66ea7e284e9772bdb1c0a42876603491f2e9b9"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v4.4"
-CROS_WORKON_EGIT_BRANCH="chromeos-4.4"
-
-# AFDO_PROFILE_VERSION is the build on which the profile is collected.
-# This is required by kernel_afdo.
-#
-# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
-
-# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
-# kernel AFDO verify jobs to specify the location.
-AFDO_LOCATION=""
-
-# Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423371"
-
-# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
-# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
-# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
-# Manifest file.
-AFDO_FROZEN_PROFILE_VERSION=""
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 4.4"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.237-r2464.ebuild b/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.237-r2464.ebuild
new file mode 100644
index 0000000..353fe70
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-4.4.237-r2464.ebuild
@@ -0,0 +1,45 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="2b50676552be09f1dbb6db4d40f20eeeca61f51c"
+CROS_WORKON_TREE="3f6524eb8b1e766029f5eee753eccb60ce718fe3"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v4.4"
+CROS_WORKON_EGIT_BRANCH="chromeos-4.4"
+
+# AFDO_PROFILE_VERSION is the build on which the profile is collected.
+# This is required by kernel_afdo.
+#
+# TODO: Allow different versions for different CHROMEOS_KERNEL_SPLITCONFIGs
+
+# By default, let cros-kernel2 define AFDO_LOCATION.  This is used in the
+# kernel AFDO verify jobs to specify the location.
+AFDO_LOCATION=""
+
+# Auto-generated by PFQ, don't modify.
+AFDO_PROFILE_VERSION="R87-13421.11-1599472924"
+
+# Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
+# If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
+# Note: Run "ebuild-<board> /path/to/ebuild manifest" afterwards to create new
+# Manifest file.
+AFDO_FROZEN_PROFILE_VERSION=""
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 4.4"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-9999.ebuild b/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-9999.ebuild
index 9fcbef5..728e3ad 100644
--- a/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-4_4/chromeos-kernel-4_4-9999.ebuild
@@ -16,7 +16,7 @@
 AFDO_LOCATION=""
 
 # Auto-generated by PFQ, don't modify.
-AFDO_PROFILE_VERSION="R86-13308.0-1593423371"
+AFDO_PROFILE_VERSION="R87-13421.11-1599472924"
 
 # Set AFDO_FROZEN_PROFILE_VERSION to freeze the afdo profiles.
 # If non-empty, it overrides the value set by AFDO_PROFILE_VERSION.
@@ -40,4 +40,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.50-r822.ebuild b/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.50-r822.ebuild
deleted file mode 100644
index b11a0d9..0000000
--- a/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.50-r822.ebuild
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2019 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="dd3f09cf08d211ccc2987d865b5c6ddaa5a5e489"
-CROS_WORKON_TREE="9add2832f93f55aaf29bc2320c4acd8b0a40b32d"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/v5.4"
-CROS_WORKON_EGIT_BRANCH="chromeos-5.4"
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel 5.4"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.68-r1265.ebuild b/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.68-r1265.ebuild
new file mode 100644
index 0000000..1997686
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-5.4.68-r1265.ebuild
@@ -0,0 +1,28 @@
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="07f1d335884214eb1a1e5b48adb57c62f4dbcc90"
+CROS_WORKON_TREE="c93ecf8aa05d759600a4275f81d6d652781d1725"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/v5.4"
+CROS_WORKON_EGIT_BRANCH="chromeos-5.4"
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel 5.4"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-9999.ebuild b/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-9999.ebuild
index e772b79..3be880b 100644
--- a/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-5_4/chromeos-kernel-5_4-9999.ebuild
@@ -23,4 +23,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r21.ebuild b/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r21.ebuild
deleted file mode 100644
index e25b30c..0000000
--- a/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r21.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-CROS_WORKON_COMMIT="adccdc52dd0f57494637c9274ca260eae2f9c6e0"
-CROS_WORKON_TREE="1e11905e9a7cd3f8925678d2dcc192026a35f442"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/experimental"
-CROS_WORKON_BLACKLIST="1"
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel (experimental)"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 37
diff --git a/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r22.ebuild b/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r22.ebuild
new file mode 100644
index 0000000..f7e38db
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-4.18_rc2-r22.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="adccdc52dd0f57494637c9274ca260eae2f9c6e0"
+CROS_WORKON_TREE="1e11905e9a7cd3f8925678d2dcc192026a35f442"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/experimental"
+CROS_WORKON_BLACKLIST="1"
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel (experimental)"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 37
diff --git a/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-9999.ebuild b/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-9999.ebuild
index 166c56c..804fb5d 100644
--- a/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-experimental/chromeos-kernel-experimental-9999.ebuild
@@ -22,4 +22,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-next/chromeos-kernel-next-9999.ebuild b/sys-kernel/chromeos-kernel-next/chromeos-kernel-next-9999.ebuild
index 68b8d76..f8e19d4 100644
--- a/sys-kernel/chromeos-kernel-next/chromeos-kernel-next-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-next/chromeos-kernel-next-9999.ebuild
@@ -23,4 +23,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.7_rc7-r3.ebuild b/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.7_rc7-r3.ebuild
deleted file mode 100644
index 4e66e8f..0000000
--- a/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.7_rc7-r3.ebuild
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-CROS_WORKON_COMMIT="92190c8f423d1ccbc3ce2383006c33b87eb32466"
-CROS_WORKON_TREE="d67918209e72ea1920ce6fbede092fe1a032420d"
-CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
-CROS_WORKON_LOCALNAME="kernel/upstream"
-
-# This must be inherited *after* EGIT/CROS_WORKON variables defined
-inherit cros-workon cros-kernel2
-
-HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
-DESCRIPTION="Chrome OS Linux Kernel latest upstream rc"
-KEYWORDS="*"
-
-# Change the following (commented out) number to the next prime number
-# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
-#
-# NOTE: There's nothing magic keeping this number prime but you just need to
-# make _any_ change to this file.  ...so why not keep it prime?
-#
-# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
-# files (!!!)
-#
-# The coolest prime number is: 149
diff --git a/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.9_rc7-r10.ebuild b/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.9_rc7-r10.ebuild
new file mode 100644
index 0000000..4bcaa10
--- /dev/null
+++ b/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-5.9_rc7-r10.ebuild
@@ -0,0 +1,27 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+CROS_WORKON_COMMIT="2d2f84f8ce7b4dfffad133d6e022d0f64a58879c"
+CROS_WORKON_TREE="2118221108c0fb8498951ada967683396a0660be"
+CROS_WORKON_PROJECT="chromiumos/third_party/kernel"
+CROS_WORKON_LOCALNAME="kernel/upstream"
+
+# This must be inherited *after* EGIT/CROS_WORKON variables defined
+inherit cros-workon cros-kernel2
+
+HOMEPAGE="https://www.chromium.org/chromium-os/chromiumos-design-docs/chromium-os-kernel"
+DESCRIPTION="Chrome OS Linux Kernel latest upstream rc"
+KEYWORDS="*"
+
+# Change the following (commented out) number to the next prime number
+# when you change "cros-kernel2.eclass" to work around http://crbug.com/220902
+#
+# NOTE: There's nothing magic keeping this number prime but you just need to
+# make _any_ change to this file.  ...so why not keep it prime?
+#
+# Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
+# files (!!!)
+#
+# The coolest prime number is: 151
diff --git a/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-9999.ebuild b/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-9999.ebuild
index aad0e81..5840a07 100644
--- a/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-9999.ebuild
+++ b/sys-kernel/chromeos-kernel-upstream/chromeos-kernel-upstream-9999.ebuild
@@ -22,4 +22,4 @@
 # Don't forget to update the comment in _all_ chromeos-kernel-x_x-9999.ebuild
 # files (!!!)
 #
-# The coolest prime number is: 149
+# The coolest prime number is: 151
diff --git a/sys-kernel/linux-firmware/linux-firmware-0.0.1-r362.ebuild b/sys-kernel/linux-firmware/linux-firmware-0.0.1-r362.ebuild
deleted file mode 100644
index ff2d26b..0000000
--- a/sys-kernel/linux-firmware/linux-firmware-0.0.1-r362.ebuild
+++ /dev/null
@@ -1,391 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-CROS_WORKON_COMMIT="60f2f9c13134ddeb24053c836a2a2a00fdece657"
-CROS_WORKON_TREE="b32f947c7aac638ea635e5c3dd2b605d21d850f7"
-CROS_WORKON_PROJECT="chromiumos/third_party/linux-firmware"
-CROS_WORKON_OUTOFTREE_BUILD=1
-
-inherit cros-workon
-
-DESCRIPTION="Firmware images from the upstream linux-fimware package"
-HOMEPAGE="https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/"
-
-SLOT="0"
-KEYWORDS="*"
-
-
-IUSE_KERNEL_VERS=(
-	kernel-4_19
-	kernel-5_4
-)
-IUSE_ATH3K=(
-	ath3k-all
-	ath3k-ar3011
-	ath3k-ar3012
-)
-IUSE_IWLWIFI=(
-	iwlwifi-all
-	iwlwifi-100
-	iwlwifi-105
-	iwlwifi-135
-	iwlwifi-1000
-	iwlwifi-1000
-	iwlwifi-2000
-	iwlwifi-2030
-	iwlwifi-3160
-	iwlwifi-3945
-	iwlwifi-4965
-	iwlwifi-5000
-	iwlwifi-5150
-	iwlwifi-6000
-	iwlwifi-6005
-	iwlwifi-6030
-	iwlwifi-6050
-	iwlwifi-7260
-	iwlwifi-7265
-	iwlwifi-7265D
-	iwlwifi-9000
-	iwlwifi-9260
-	iwlwifi-cc
-	iwlwifi-Qu-c0
-	iwlwifi-QuZ
-)
-IUSE_BRCMWIFI=(
-	brcmfmac-all
-	brcmfmac4354-sdio
-	brcmfmac4356-pcie
-	brcmfmac4371-pcie
-)
-IUSE_LINUX_FIRMWARE=(
-	adreno-630
-	adsp_apl
-	adsp_cnl
-	adsp_glk
-	adsp_kbl
-	adsp_skl
-	ath9k_htc
-	ath10k_qca6174a-5
-	ath10k_qca6174a-3
-	ath10k_wcn3990
-	bcm4354-bt
-	cros-pd
-	fw_sst
-	fw_sst2
-	i915_bxt
-	i915_cnl
-	i915_glk
-	i915_jsl
-	i915_kbl
-	i915_skl
-	i915_tgl
-	ibt_9260
-	ibt_9560
-	ibt_ax200
-	ibt_ax201
-	ibt-hw
-	ipu3_fw
-	keyspan_usb
-	marvell-mwlwifi
-	marvell-pcie8897
-	marvell-pcie8997
-	mt8173-vpu
-	nvidia-xusb
-	qca6174a-3-bt
-	qca6174a-5-bt
-	qca-wcn3990-bt
-	qca-wcn3991-bt
-	rockchip-dptx
-	rt2870
-	rtl8107e-1
-	rtl8107e-2
-	rtl8125a-3
-	rtl8153
-	rtl8168fp-3
-	rtl8168g-1
-	rtl8168g-2
-	rtl8168h-1
-	rtl8168h-2
-	rtl_bt-8822ce-uart
-	rtl_bt-8822ce-usb
-	rtw8822c
-	venus-52
-	venus-54
-	"${IUSE_ATH3K[@]}"
-	"${IUSE_IWLWIFI[@]}"
-	"${IUSE_BRCMWIFI[@]}"
-)
-IUSE="
-	${IUSE_KERNEL_VERS[*]}
-	${IUSE_LINUX_FIRMWARE[@]/#/linux_firmware_}
-	video_cards_radeon
-	video_cards_amdgpu"
-REQUIRED_USE="?? ( ${IUSE_KERNEL_VERS[*]} )"
-LICENSE="
-	linux_firmware_adreno-630? ( LICENSE.qcom )
-	linux_firmware_adsp_apl? ( LICENCE.adsp_sst )
-	linux_firmware_adsp_cnl? ( LICENCE.adsp_sst )
-	linux_firmware_adsp_glk? ( LICENCE.adsp_sst )
-	linux_firmware_adsp_kbl? ( LICENCE.adsp_sst )
-	linux_firmware_adsp_skl? ( LICENCE.adsp_sst )
-	linux_firmware_ath3k-all? ( LICENCE.atheros_firmware )
-	linux_firmware_ath3k-ar3011? ( LICENCE.atheros_firmware )
-	linux_firmware_ath3k-ar3012? ( LICENCE.atheros_firmware )
-	linux_firmware_ath9k_htc? ( LICENCE.atheros_firmware )
-	linux_firmware_ath10k_qca6174a-5? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_ath10k_qca6174a-3? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_ath10k_wcn3990? ( LICENCE.atheros_firmware )
-	linux_firmware_bcm4354-bt? ( LICENCE.broadcom_bcm43xx )
-	linux_firmware_cros-pd? ( BSD-Google )
-	linux_firmware_fw_sst? ( LICENCE.fw_sst )
-	linux_firmware_fw_sst2? ( LICENCE.IntcSST2 )
-	linux_firmware_i915_bxt? ( LICENSE.i915 )
-	linux_firmware_i915_cnl? ( LICENSE.i915 )
-	linux_firmware_i915_glk? ( LICENSE.i915 )
-	linux_firmware_i915_jsl? ( LICENSE.i915 )
-	linux_firmware_i915_kbl? ( LICENSE.i915 )
-	linux_firmware_i915_skl? ( LICENSE.i915 )
-	linux_firmware_i915_tgl? ( LICENSE.i915 )
-	linux_firmware_ipu3_fw? ( LICENSE.ipu3_firmware )
-	linux_firmware_ibt_9260? ( LICENCE.ibt_firmware )
-	linux_firmware_ibt_9560? ( LICENCE.ibt_firmware )
-	linux_firmware_ibt_ax200? ( LICENCE.ibt_firmware )
-	linux_firmware_ibt_ax201? ( LICENCE.ibt_firmware )
-	linux_firmware_ibt-hw? ( LICENCE.ibt_firmware )
-	linux_firmware_keyspan_usb? ( LICENSE.keyspan_usb )
-	linux_firmware_marvell-mwlwifi? ( LICENCE.Marvell )
-	linux_firmware_marvell-pcie8897? ( LICENCE.Marvell )
-	linux_firmware_marvell-pcie8997? ( LICENCE.Marvell )
-	linux_firmware_mt8173-vpu? ( LICENCE.mediatek-vpu )
-	linux_firmware_nvidia-xusb? ( LICENCE.nvidia )
-	linux_firmware_qca6174a-3-bt? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_qca6174a-5-bt? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_qca-wcn3990-bt? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_qca-wcn3991-bt? ( LICENSE.QualcommAtheros_ath10k )
-	linux_firmware_rockchip-dptx? ( LICENCE.rockchip )
-	linux_firmware_rt2870? ( LICENCE.ralink-firmware.txt LICENCE.ralink_a_mediatek_company_firmware )
-	linux_firmware_rtl8107e-1? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8107e-2? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8125a-3? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8153? ( LICENCE.rtlwifi_firmware )
-	linux_firmware_rtl8168fp-3? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8168g-1? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8168g-2? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8168h-1? ( LICENCE.rtl_nic )
-	linux_firmware_rtl8168h-2? ( LICENCE.rtl_nic )
-	linux_firmware_rtl_bt-8822ce-uart? ( LICENCE.rtlwifi_firmware )
-	linux_firmware_rtl_bt-8822ce-usb? ( LICENCE.rtlwifi_firmware )
-	linux_firmware_rtw8822c? ( LICENCE.rtlwifi_firmware )
-	linux_firmware_venus-52? ( LICENSE.qcom )
-	linux_firmware_venus-54? ( LICENSE.qcom )
-	$(printf 'linux_firmware_%s? ( LICENCE.iwlwifi_firmware ) ' "${IUSE_IWLWIFI[@]}")
-	$(printf 'linux_firmware_%s? ( LICENCE.broadcom_bcm43xx ) ' "${IUSE_BRCMWIFI[@]}")
-	video_cards_radeon? ( LICENSE.radeon )
-	video_cards_amdgpu? ( LICENSE.amdgpu )
-"
-
-BDEPEND="
-	dev-lang/python
-	dev-vcs/git
-"
-
-RDEPEND="
-	linux_firmware_adreno-630? ( !media-libs/a630-fw )
-	linux_firmware_ath3k-all? ( !net-wireless/ath3k )
-	linux_firmware_ath3k-ar3011? ( !net-wireless/ath3k )
-	linux_firmware_ath3k-ar3012? ( !net-wireless/ath3k )
-	linux_firmware_keyspan_usb? (
-		!sys-kernel/chromeos-kernel-3_8[firmware_install]
-		!sys-kernel/chromeos-kernel-3_10[firmware_install]
-		!sys-kernel/chromeos-kernel-3_14[firmware_install]
-		!sys-kernel/chromeos-kernel-3_18[firmware_install]
-		!sys-kernel/chromeos-kernel-4_4[firmware_install]
-	)
-	linux_firmware_marvell-pcie8897? ( !net-wireless/marvell_sd8787[pcie] )
-	linux_firmware_marvell-pcie8997? ( !net-wireless/marvell_sd8787[pcie] )
-	linux_firmware_mt8173-vpu? ( !media-libs/vpu-fw )
-	linux_firmware_nvidia-xusb? ( !sys-kernel/xhci-firmware )
-	linux_firmware_rt2870? ( !net-wireless/realtek-rt2800-firmware )
-	!net-wireless/ath6k
-	!net-wireless/ath10k
-	!net-wireless/iwl1000-ucode
-	!net-wireless/iwl2000-ucode
-	!net-wireless/iwl2030-ucode
-	!net-wireless/iwl3945-ucode
-	!net-wireless/iwl4965-ucode
-	!net-wireless/iwl5000-ucode
-	!net-wireless/iwl6000-ucode
-	!net-wireless/iwl6005-ucode
-	!net-wireless/iwl6030-ucode
-	!net-wireless/iwl6050-ucode
-"
-
-RESTRICT="binchecks strip"
-
-FIRMWARE_INSTALL_ROOT="/lib/firmware"
-
-use_fw() {
-	use linux_firmware_$1
-}
-
-doins_subdir() {
-	# Avoid having this insinto command affecting later doins calls.
-	local file
-	for file in "${@}"; do
-		(
-		insinto "${FIRMWARE_INSTALL_ROOT}/${file%/*}"
-		doins "${file}"
-		)
-	done
-}
-
-install_iwlwifi() {
-	# We do not always need to detect the kernel version when all kernels
-	# have the same iwlwifi firmware version. However, this changes every so
-	# often for the 2 most recent kernels during bring up, where we can
-	# typically use a more recent firmware on the in-development board but
-	# keep the previous version for stable boards to avoid regressions.
-	# Keep the logic around to avoid having to rewrite it every single time.
-	local kernel=""
-	local k
-	for k in "${IUSE_KERNEL_VERS[@]}"; do
-		if use "${k}"; then
-			kernel="${k}"
-			break
-		fi
-	done
-	if [[ -z "${kernel}" ]]; then
-		einfo "No kernel USE flag set."
-		einfo "Expected if all kernels have the same iwlwifi firmware."
-	fi
-
-	for x in "${IUSE_IWLWIFI[@]}"; do
-		use_fw "${x}" || continue
-		case "${x}" in
-		iwlwifi-all)   doins iwlwifi-*.ucode ;;
-		iwlwifi-6005)  doins iwlwifi-6000g2a-*.ucode ;;
-		iwlwifi-6030)  doins iwlwifi-6000g2b-*.ucode ;;
-		iwlwifi-7260)  doins "${x}-17.ucode" ;;
-		iwlwifi-7265D) doins "${x}-29.ucode" ;;
-		iwlwifi-9000)  doins "${x}-pu-b0-jf-b0-46.ucode" ;;
-		iwlwifi-9260)  doins "${x}-th-b0-jf-b0-46.ucode" ;;
-		iwlwifi-cc)    doins "${x}-a0-55.ucode" ;;
-		iwlwifi-Qu-c0) doins "${x}-hr-b0-55.ucode" ;;
-		iwlwifi-QuZ)
-			case "${kernel}" in
-			kernel-4_19) doins "${x}-a0-hr-b0-55.ucode" ;;
-			kernel-5_4)  doins "${x}-a0-hr-b0-55.ucode" ;;
-			*)
-				ewarn "Unexpected kernel version '${kernel}'."
-				ewarn "Installing all '${x}' files."
-				doins "${x}"-*.ucode
-				;;
-			esac
-			;;
-		iwlwifi-*) doins "${x}"-*.ucode ;;
-		esac
-	done
-}
-
-src_install() {
-	local x
-	insinto "${FIRMWARE_INSTALL_ROOT}"
-	use_fw adreno-630 && doins_subdir qcom/a630*
-	use_fw adsp_apl && doins_subdir intel/dsp_fw_bxtn*
-	use_fw adsp_cnl && doins_subdir intel/dsp_fw_cnl*
-	use_fw adsp_glk && doins_subdir intel/dsp_fw_glk*
-	use_fw adsp_kbl && doins_subdir intel/dsp_fw_kbl*
-	use_fw adsp_skl && doins_subdir intel/dsp_fw_*
-	use_fw ath9k_htc && doins htc_*.fw
-	use_fw ath10k_qca6174a-5 && doins_subdir ath10k/QCA6174/hw3.0/{firmware-6,board-2}.bin
-	use_fw ath10k_qca6174a-3 && doins_subdir ath10k/QCA6174/hw3.0/{firmware-sdio-6,board-2}.bin
-	use_fw ath10k_wcn3990 && doins_subdir ath10k/WCN3990/hw1.0/*
-	use_fw bcm4354-bt && doins_subdir brcm/BCM4354_*.hcd
-	use_fw cros-pd && doins_subdir cros-pd/*
-	use_fw fw_sst && doins_subdir intel/fw_sst*
-	use_fw fw_sst2 && doins_subdir intel/IntcSST2.bin
-	use_fw i915_bxt && doins_subdir i915/bxt*
-	use_fw i915_cnl && doins_subdir i915/cnl*
-	use_fw i915_glk && doins_subdir i915/glk*
-	use_fw i915_jsl && doins_subdir i915/icl_dmc_ver1_09.bin && doins_subdir i915/ehl*
-	use_fw i915_kbl && doins_subdir i915/kbl*
-	use_fw i915_skl && doins_subdir i915/skl*
-	use_fw i915_tgl && doins_subdir i915/tgl*
-	use_fw ipu3_fw && doins_subdir intel/irci_*
-	use_fw ibt_9260 && doins_subdir intel/ibt-18-16-1.*
-	use_fw ibt_9560 && doins_subdir intel/ibt-17-16-1.*
-	use_fw ibt_ax200 && doins_subdir intel/ibt-20-*.*
-	use_fw ibt_ax201 && doins_subdir intel/ibt-19-*.*
-	use_fw ibt-hw && doins_subdir intel/ibt-hw-*.bseq
-	use_fw keyspan_usb && doins_subdir keyspan/*
-	use_fw marvell-mwlwifi && doins_subdir mwlwifi/*.bin
-	use_fw marvell-pcie8897 && doins_subdir mrvl/pcie8897_uapsta.bin
-	use_fw marvell-pcie8997 && doins_subdir mrvl/pcieusb8997_combo_v4.bin
-	use_fw mt8173-vpu && doins vpu_{d,p}.bin
-	use_fw nvidia-xusb && doins_subdir nvidia/tegra*/xusb.bin
-	use_fw qca6174a-3-bt && doins_subdir qca/{nvm,rampatch}_0044*.bin
-	use_fw qca6174a-5-bt && doins_subdir qca/{nvm,rampatch}_usb_*.bin
-	use_fw qca-wcn3990-bt && doins_subdir qca/{crbtfw21.tlv,crnv21.bin}
-	use_fw qca-wcn3991-bt && doins_subdir qca/{crbtfw32.tlv,crnv32.bin}
-	use_fw rockchip-dptx && doins_subdir rockchip/dptx.bin
-	use_fw rtl8107e-1 && doins_subdir rtl_nic/rtl8107e-1.fw
-	use_fw rtl8107e-2 && doins_subdir rtl_nic/rtl8107e-2.fw
-	use_fw rtl8125a-3 && doins_subdir rtl_nic/rtl8125a-3.fw
-	use_fw rtl8153 && doins_subdir rtl_nic/rtl8153*.fw
-	use_fw rtl8168fp-3 && doins_subdir rtl_nic/rtl8168fp-3.fw
-	use_fw rtl8168g-1 && doins_subdir rtl_nic/rtl8168g-1.fw
-	use_fw rtl8168g-2 && doins_subdir rtl_nic/rtl8168g-2.fw
-	use_fw rtl8168h-1 && doins_subdir rtl_nic/rtl8168h-1.fw
-	use_fw rtl8168h-2 && doins_subdir rtl_nic/rtl8168h-2.fw
-	use_fw rtl_bt-8822ce-uart && doins_subdir rtl_bt/rtl8822cs*.bin
-	use_fw rtl_bt-8822ce-usb && doins_subdir rtl_bt/rtl8822cu*.bin
-	use_fw rtw8822c && doins_subdir rtw88/rtw8822c*.bin
-	use_fw venus-52 && doins_subdir qcom/venus-5.2/*
-	use_fw venus-54 && doins_subdir qcom/venus-5.4/*
-	use video_cards_radeon && doins_subdir radeon/*
-	use video_cards_amdgpu && doins_subdir amdgpu/{carrizo,picasso,raven_dmcu,raven2,stoney,vega12}*
-
-	use_fw rt2870 && doins rt2870.bin
-
-	# The firmware here is a mess; install specific files by hand.
-	if use linux_firmware_ath3k-all || use linux_firmware_ath3k-ar3011; then
-		doins ath3k-1.fw
-	fi
-	if use linux_firmware_ath3k-all || use linux_firmware_ath3k-ar3012; then
-		(
-		insinto "${FIRMWARE_INSTALL_ROOT}/ar3k"
-		doins ar3k/*.dfu
-		)
-	fi
-
-	install_iwlwifi
-
-	for x in "${IUSE_BRCMWIFI[@]}"; do
-		use_fw ${x} || continue
-		case ${x} in
-		brcmfmac-all)      doins_subdir brcm/brcmfmac* ;;
-		brcmfmac4354-sdio) doins_subdir brcm/brcmfmac4354-sdio.* ;;
-		brcmfmac4356-pcie) doins_subdir brcm/brcmfmac4356-pcie.* ;;
-		brcmfmac4371-pcie) doins_subdir brcm/brcmfmac4371-pcie.* ;;
-		esac
-	done
-
-	# Hanle 'Link:' directives in WHENCE. The Makefile's copy-firmware.sh
-	# does this too, but we trim down the install list a lot, so we don't
-	# use that script.
-	local link target
-	while read -r link target; do
-		# ${target} is link-relative, so we need to construct a full path.
-		local install_target="${D}/${FIRMWARE_INSTALL_ROOT}/$(dirname "${link}")/${target}"
-		# Skip 'Link' directives for files we didn't install already.
-		[[ -f "${install_target}" ]] || continue
-		einfo "Creating link ${link} (${target})"
-		dodir "${FIRMWARE_INSTALL_ROOT}/$(dirname "${link}")"
-		dosym "${target}" "${FIRMWARE_INSTALL_ROOT}/${link}"
-	done < <(grep -E '^Link:' WHENCE | sed -e's/^Link: *//g' -e's/-> //g')
-}
-
-src_test() {
-	emake check
-}
diff --git a/sys-kernel/linux-firmware/linux-firmware-0.0.1-r388.ebuild b/sys-kernel/linux-firmware/linux-firmware-0.0.1-r388.ebuild
new file mode 100644
index 0000000..47d5a8e
--- /dev/null
+++ b/sys-kernel/linux-firmware/linux-firmware-0.0.1-r388.ebuild
@@ -0,0 +1,395 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+CROS_WORKON_COMMIT="3251ac94adea9f639b7a3e23090e5b3444896af5"
+CROS_WORKON_TREE="f2357ce3756f61d4be6794a2e784b6165e2455df"
+CROS_WORKON_PROJECT="chromiumos/third_party/linux-firmware"
+CROS_WORKON_OUTOFTREE_BUILD=1
+
+inherit cros-workon
+
+DESCRIPTION="Firmware images from the upstream linux-fimware package"
+HOMEPAGE="https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/"
+
+SLOT="0"
+KEYWORDS="*"
+
+
+IUSE_KERNEL_VERS=(
+	kernel-4_19
+	kernel-5_4
+)
+IUSE_ATH3K=(
+	ath3k-all
+	ath3k-ar3011
+	ath3k-ar3012
+)
+IUSE_IWLWIFI=(
+	iwlwifi-all
+	iwlwifi-100
+	iwlwifi-105
+	iwlwifi-135
+	iwlwifi-1000
+	iwlwifi-1000
+	iwlwifi-2000
+	iwlwifi-2030
+	iwlwifi-3160
+	iwlwifi-3945
+	iwlwifi-4965
+	iwlwifi-5000
+	iwlwifi-5150
+	iwlwifi-6000
+	iwlwifi-6005
+	iwlwifi-6030
+	iwlwifi-6050
+	iwlwifi-7260
+	iwlwifi-7265
+	iwlwifi-7265D
+	iwlwifi-9000
+	iwlwifi-9260
+	iwlwifi-cc
+	iwlwifi-Qu-c0
+	iwlwifi-QuZ
+)
+IUSE_BRCMWIFI=(
+	brcmfmac-all
+	brcmfmac4354-sdio
+	brcmfmac4356-pcie
+	brcmfmac4371-pcie
+)
+IUSE_LINUX_FIRMWARE=(
+	adreno-630
+	adsp_apl
+	adsp_cnl
+	adsp_glk
+	adsp_kbl
+	adsp_skl
+	ath9k_htc
+	ath10k_qca6174a-5
+	ath10k_qca6174a-3
+	ath10k_wcn3990
+	bcm4354-bt
+	cros-pd
+	fw_sst
+	fw_sst2
+	i915_bxt
+	i915_cnl
+	i915_glk
+	i915_jsl
+	i915_kbl
+	i915_skl
+	i915_tgl
+	ibt_9260
+	ibt_9560
+	ibt_ax200
+	ibt_ax201
+	ibt-hw
+	ipu3_fw
+	keyspan_usb
+	marvell-mwlwifi
+	marvell-pcie8897
+	marvell-pcie8997
+	mt8173-vpu
+	nvidia-xusb
+	qca6174a-3-bt
+	qca6174a-5-bt
+	qca-wcn3990-bt
+	qca-wcn3991-bt
+	rockchip-dptx
+	rt2870
+	rtl8107e-1
+	rtl8107e-2
+	rtl8125a-3
+	rtl8153
+	rtl8168fp-3
+	rtl8168g-1
+	rtl8168g-2
+	rtl8168h-1
+	rtl8168h-2
+	rtl_bt-8822ce-uart
+	rtl_bt-8822ce-usb
+	rtw8822c
+	venus-52
+	venus-54
+	"${IUSE_ATH3K[@]}"
+	"${IUSE_IWLWIFI[@]}"
+	"${IUSE_BRCMWIFI[@]}"
+)
+IUSE="
+	${IUSE_KERNEL_VERS[*]}
+	${IUSE_LINUX_FIRMWARE[@]/#/linux_firmware_}
+	video_cards_radeon
+	video_cards_amdgpu"
+REQUIRED_USE="?? ( ${IUSE_KERNEL_VERS[*]} )"
+LICENSE="
+	linux_firmware_adreno-630? ( LICENSE.qcom )
+	linux_firmware_adsp_apl? ( LICENCE.adsp_sst )
+	linux_firmware_adsp_cnl? ( LICENCE.adsp_sst )
+	linux_firmware_adsp_glk? ( LICENCE.adsp_sst )
+	linux_firmware_adsp_kbl? ( LICENCE.adsp_sst )
+	linux_firmware_adsp_skl? ( LICENCE.adsp_sst )
+	linux_firmware_ath3k-all? ( LICENCE.atheros_firmware )
+	linux_firmware_ath3k-ar3011? ( LICENCE.atheros_firmware )
+	linux_firmware_ath3k-ar3012? ( LICENCE.atheros_firmware )
+	linux_firmware_ath9k_htc? ( LICENCE.atheros_firmware )
+	linux_firmware_ath10k_qca6174a-5? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_ath10k_qca6174a-3? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_ath10k_wcn3990? ( LICENCE.atheros_firmware )
+	linux_firmware_bcm4354-bt? ( LICENCE.broadcom_bcm43xx )
+	linux_firmware_cros-pd? ( BSD-Google )
+	linux_firmware_fw_sst? ( LICENCE.fw_sst )
+	linux_firmware_fw_sst2? ( LICENCE.IntcSST2 )
+	linux_firmware_i915_bxt? ( LICENSE.i915 )
+	linux_firmware_i915_cnl? ( LICENSE.i915 )
+	linux_firmware_i915_glk? ( LICENSE.i915 )
+	linux_firmware_i915_jsl? ( LICENSE.i915 )
+	linux_firmware_i915_kbl? ( LICENSE.i915 )
+	linux_firmware_i915_skl? ( LICENSE.i915 )
+	linux_firmware_i915_tgl? ( LICENSE.i915 )
+	linux_firmware_ipu3_fw? ( LICENSE.ipu3_firmware )
+	linux_firmware_ibt_9260? ( LICENCE.ibt_firmware )
+	linux_firmware_ibt_9560? ( LICENCE.ibt_firmware )
+	linux_firmware_ibt_ax200? ( LICENCE.ibt_firmware )
+	linux_firmware_ibt_ax201? ( LICENCE.ibt_firmware )
+	linux_firmware_ibt-hw? ( LICENCE.ibt_firmware )
+	linux_firmware_keyspan_usb? ( LICENSE.keyspan_usb )
+	linux_firmware_marvell-mwlwifi? ( LICENCE.Marvell )
+	linux_firmware_marvell-pcie8897? ( LICENCE.Marvell )
+	linux_firmware_marvell-pcie8997? ( LICENCE.Marvell )
+	linux_firmware_mt8173-vpu? ( LICENCE.mediatek-vpu )
+	linux_firmware_nvidia-xusb? ( LICENCE.nvidia )
+	linux_firmware_qca6174a-3-bt? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_qca6174a-5-bt? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_qca-wcn3990-bt? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_qca-wcn3991-bt? ( LICENSE.QualcommAtheros_ath10k )
+	linux_firmware_rockchip-dptx? ( LICENCE.rockchip )
+	linux_firmware_rt2870? ( LICENCE.ralink-firmware.txt LICENCE.ralink_a_mediatek_company_firmware )
+	linux_firmware_rtl8107e-1? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8107e-2? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8125a-3? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8153? ( LICENCE.rtlwifi_firmware )
+	linux_firmware_rtl8168fp-3? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8168g-1? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8168g-2? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8168h-1? ( LICENCE.rtl_nic )
+	linux_firmware_rtl8168h-2? ( LICENCE.rtl_nic )
+	linux_firmware_rtl_bt-8822ce-uart? ( LICENCE.rtlwifi_firmware )
+	linux_firmware_rtl_bt-8822ce-usb? ( LICENCE.rtlwifi_firmware )
+	linux_firmware_rtw8822c? ( LICENCE.rtlwifi_firmware )
+	linux_firmware_venus-52? ( LICENSE.qcom )
+	linux_firmware_venus-54? ( LICENSE.qcom )
+	$(printf 'linux_firmware_%s? ( LICENCE.iwlwifi_firmware ) ' "${IUSE_IWLWIFI[@]}")
+	$(printf 'linux_firmware_%s? ( LICENCE.broadcom_bcm43xx ) ' "${IUSE_BRCMWIFI[@]}")
+	video_cards_radeon? ( LICENSE.radeon )
+	video_cards_amdgpu? ( LICENSE.amdgpu )
+"
+
+BDEPEND="
+	dev-lang/python
+	dev-vcs/git
+"
+
+RDEPEND="
+	linux_firmware_adreno-630? ( !media-libs/a630-fw )
+	linux_firmware_ath3k-all? ( !net-wireless/ath3k )
+	linux_firmware_ath3k-ar3011? ( !net-wireless/ath3k )
+	linux_firmware_ath3k-ar3012? ( !net-wireless/ath3k )
+	linux_firmware_keyspan_usb? (
+		!sys-kernel/chromeos-kernel-3_8[firmware_install]
+		!sys-kernel/chromeos-kernel-3_10[firmware_install]
+		!sys-kernel/chromeos-kernel-3_14[firmware_install]
+		!sys-kernel/chromeos-kernel-3_18[firmware_install]
+		!sys-kernel/chromeos-kernel-4_4[firmware_install]
+	)
+	linux_firmware_marvell-pcie8897? ( !net-wireless/marvell_sd8787[pcie] )
+	linux_firmware_marvell-pcie8997? ( !net-wireless/marvell_sd8787[pcie] )
+	linux_firmware_mt8173-vpu? ( !media-libs/vpu-fw )
+	linux_firmware_nvidia-xusb? ( !sys-kernel/xhci-firmware )
+	linux_firmware_rt2870? ( !net-wireless/realtek-rt2800-firmware )
+	!net-wireless/ath6k
+	!net-wireless/ath10k
+	!net-wireless/iwl1000-ucode
+	!net-wireless/iwl2000-ucode
+	!net-wireless/iwl2030-ucode
+	!net-wireless/iwl3945-ucode
+	!net-wireless/iwl4965-ucode
+	!net-wireless/iwl5000-ucode
+	!net-wireless/iwl6000-ucode
+	!net-wireless/iwl6005-ucode
+	!net-wireless/iwl6030-ucode
+	!net-wireless/iwl6050-ucode
+"
+
+RESTRICT="binchecks strip"
+
+FIRMWARE_INSTALL_ROOT="/lib/firmware"
+
+use_fw() {
+	use linux_firmware_$1
+}
+
+doins_subdir() {
+	# Avoid having this insinto command affecting later doins calls.
+	local file
+	for file in "${@}"; do
+		(
+		insinto "${FIRMWARE_INSTALL_ROOT}/${file%/*}"
+		doins "${file}"
+		)
+	done
+}
+
+install_iwlwifi() {
+	# We do not always need to detect the kernel version when all kernels
+	# have the same iwlwifi firmware version. However, this changes every so
+	# often for the 2 most recent kernels during bring up, where we can
+	# typically use a more recent firmware on the in-development board but
+	# keep the previous version for stable boards to avoid regressions.
+	# Keep the logic around to avoid having to rewrite it every single time.
+	local kernel=""
+	local k
+	for k in "${IUSE_KERNEL_VERS[@]}"; do
+		if use "${k}"; then
+			kernel="${k}"
+			break
+		fi
+	done
+	if [[ -z "${kernel}" ]]; then
+		einfo "No kernel USE flag set."
+		einfo "Expected if all kernels have the same iwlwifi firmware."
+	fi
+
+	for x in "${IUSE_IWLWIFI[@]}"; do
+		use_fw "${x}" || continue
+		case "${x}" in
+		iwlwifi-all)   doins iwlwifi-*.ucode ;;
+		iwlwifi-6005)  doins iwlwifi-6000g2a-*.ucode ;;
+		iwlwifi-6030)  doins iwlwifi-6000g2b-*.ucode ;;
+		iwlwifi-7260)  doins "${x}-17.ucode" ;;
+		iwlwifi-7265D) doins "${x}-29.ucode" ;;
+		iwlwifi-9000)  doins "${x}-pu-b0-jf-b0-46.ucode" ;;
+		iwlwifi-9260)  doins "${x}-th-b0-jf-b0-46.ucode" ;;
+		iwlwifi-cc)    doins "${x}-a0-58.ucode" ;;
+		iwlwifi-Qu-c0) doins "${x}-hr-b0-58.ucode" ;;
+		iwlwifi-QuZ)
+			case "${kernel}" in
+			kernel-4_19) doins "${x}-a0-hr-b0-58.ucode" ;;
+			kernel-5_4)  doins "${x}-a0-hr-b0-58.ucode" ;;
+			*)
+				ewarn "Unexpected kernel version '${kernel}'."
+				ewarn "Installing all '${x}' files."
+				doins "${x}"-*.ucode
+				;;
+			esac
+			;;
+		iwlwifi-*) doins "${x}"-*.ucode ;;
+		esac
+		# At least with EAPI 7, it's ok to call 'doins' with the same
+		# file multiple times. So an overlay declaring multiple
+		# 'iwlwifi-*' USE flags (e.g. volteer) won't break the build.
+		doins "iwl-dbg-cfg.ini"
+	done
+}
+
+src_install() {
+	local x
+	insinto "${FIRMWARE_INSTALL_ROOT}"
+	use_fw adreno-630 && doins_subdir qcom/a630*
+	use_fw adsp_apl && doins_subdir intel/dsp_fw_bxtn*
+	use_fw adsp_cnl && doins_subdir intel/dsp_fw_cnl*
+	use_fw adsp_glk && doins_subdir intel/dsp_fw_glk*
+	use_fw adsp_kbl && doins_subdir intel/dsp_fw_kbl*
+	use_fw adsp_skl && doins_subdir intel/dsp_fw_*
+	use_fw ath9k_htc && doins htc_*.fw
+	use_fw ath10k_qca6174a-5 && doins_subdir ath10k/QCA6174/hw3.0/{firmware-6,board-2}.bin
+	use_fw ath10k_qca6174a-3 && doins_subdir ath10k/QCA6174/hw3.0/{firmware-sdio-6,board-2}.bin
+	use_fw ath10k_wcn3990 && doins_subdir ath10k/WCN3990/hw1.0/*
+	use_fw bcm4354-bt && doins_subdir brcm/BCM4354_*.hcd
+	use_fw cros-pd && doins_subdir cros-pd/*
+	use_fw fw_sst && doins_subdir intel/fw_sst*
+	use_fw fw_sst2 && doins_subdir intel/IntcSST2.bin
+	use_fw i915_bxt && doins_subdir i915/bxt*
+	use_fw i915_cnl && doins_subdir i915/cnl*
+	use_fw i915_glk && doins_subdir i915/glk*
+	use_fw i915_jsl && doins_subdir i915/icl_dmc_ver1_09.bin && doins_subdir i915/ehl*
+	use_fw i915_kbl && doins_subdir i915/kbl*
+	use_fw i915_skl && doins_subdir i915/skl*
+	use_fw i915_tgl && doins_subdir i915/tgl*
+	use_fw ipu3_fw && doins_subdir intel/irci_*
+	use_fw ibt_9260 && doins_subdir intel/ibt-18-16-1.*
+	use_fw ibt_9560 && doins_subdir intel/ibt-17-16-1.*
+	use_fw ibt_ax200 && doins_subdir intel/ibt-20-*.*
+	use_fw ibt_ax201 && doins_subdir intel/ibt-19-*.*
+	use_fw ibt-hw && doins_subdir intel/ibt-hw-*.bseq
+	use_fw keyspan_usb && doins_subdir keyspan/*
+	use_fw marvell-mwlwifi && doins_subdir mwlwifi/*.bin
+	use_fw marvell-pcie8897 && doins_subdir mrvl/pcie8897_uapsta.bin
+	use_fw marvell-pcie8997 && doins_subdir mrvl/pcieusb8997_combo_v4.bin
+	use_fw mt8173-vpu && doins vpu_{d,p}.bin
+	use_fw nvidia-xusb && doins_subdir nvidia/tegra*/xusb.bin
+	use_fw qca6174a-3-bt && doins_subdir qca/{nvm,rampatch}_0044*.bin
+	use_fw qca6174a-5-bt && doins_subdir qca/{nvm,rampatch}_usb_*.bin
+	use_fw qca-wcn3990-bt && doins_subdir qca/{crbtfw21.tlv,crnv21.bin}
+	use_fw qca-wcn3991-bt && doins_subdir qca/{crbtfw32.tlv,crnv32.bin}
+	use_fw rockchip-dptx && doins_subdir rockchip/dptx.bin
+	use_fw rtl8107e-1 && doins_subdir rtl_nic/rtl8107e-1.fw
+	use_fw rtl8107e-2 && doins_subdir rtl_nic/rtl8107e-2.fw
+	use_fw rtl8125a-3 && doins_subdir rtl_nic/rtl8125a-3.fw
+	use_fw rtl8153 && doins_subdir rtl_nic/rtl8153*.fw
+	use_fw rtl8168fp-3 && doins_subdir rtl_nic/rtl8168fp-3.fw
+	use_fw rtl8168g-1 && doins_subdir rtl_nic/rtl8168g-1.fw
+	use_fw rtl8168g-2 && doins_subdir rtl_nic/rtl8168g-2.fw
+	use_fw rtl8168h-1 && doins_subdir rtl_nic/rtl8168h-1.fw
+	use_fw rtl8168h-2 && doins_subdir rtl_nic/rtl8168h-2.fw
+	use_fw rtl_bt-8822ce-uart && doins_subdir rtl_bt/rtl8822cs*.bin
+	use_fw rtl_bt-8822ce-usb && doins_subdir rtl_bt/rtl8822cu*.bin
+	use_fw rtw8822c && doins_subdir rtw88/rtw8822c*.bin
+	use_fw venus-52 && doins_subdir qcom/venus-5.2/*
+	use_fw venus-54 && doins_subdir qcom/venus-5.4/*
+	use video_cards_radeon && doins_subdir radeon/*
+	use video_cards_amdgpu && doins_subdir amdgpu/{carrizo,picasso,raven_dmcu,raven2,stoney,vega12}*
+
+	use_fw rt2870 && doins rt2870.bin
+
+	# The firmware here is a mess; install specific files by hand.
+	if use linux_firmware_ath3k-all || use linux_firmware_ath3k-ar3011; then
+		doins ath3k-1.fw
+	fi
+	if use linux_firmware_ath3k-all || use linux_firmware_ath3k-ar3012; then
+		(
+		insinto "${FIRMWARE_INSTALL_ROOT}/ar3k"
+		doins ar3k/*.dfu
+		)
+	fi
+
+	install_iwlwifi
+
+	for x in "${IUSE_BRCMWIFI[@]}"; do
+		use_fw ${x} || continue
+		case ${x} in
+		brcmfmac-all)      doins_subdir brcm/brcmfmac* ;;
+		brcmfmac4354-sdio) doins_subdir brcm/brcmfmac4354-sdio.* ;;
+		brcmfmac4356-pcie) doins_subdir brcm/brcmfmac4356-pcie.* ;;
+		brcmfmac4371-pcie) doins_subdir brcm/brcmfmac4371-pcie.* ;;
+		esac
+	done
+
+	# Hanle 'Link:' directives in WHENCE. The Makefile's copy-firmware.sh
+	# does this too, but we trim down the install list a lot, so we don't
+	# use that script.
+	local link target
+	while read -r link target; do
+		# ${target} is link-relative, so we need to construct a full path.
+		local install_target="${D}/${FIRMWARE_INSTALL_ROOT}/$(dirname "${link}")/${target}"
+		# Skip 'Link' directives for files we didn't install already.
+		[[ -f "${install_target}" ]] || continue
+		einfo "Creating link ${link} (${target})"
+		dodir "${FIRMWARE_INSTALL_ROOT}/$(dirname "${link}")"
+		dosym "${target}" "${FIRMWARE_INSTALL_ROOT}/${link}"
+	done < <(grep -E '^Link:' WHENCE | sed -e's/^Link: *//g' -e's/-> //g')
+}
+
+src_test() {
+	emake check
+}
diff --git a/sys-kernel/linux-firmware/linux-firmware-9999.ebuild b/sys-kernel/linux-firmware/linux-firmware-9999.ebuild
index f76e1c7..febabcc 100644
--- a/sys-kernel/linux-firmware/linux-firmware-9999.ebuild
+++ b/sys-kernel/linux-firmware/linux-firmware-9999.ebuild
@@ -268,12 +268,12 @@
 		iwlwifi-7265D) doins "${x}-29.ucode" ;;
 		iwlwifi-9000)  doins "${x}-pu-b0-jf-b0-46.ucode" ;;
 		iwlwifi-9260)  doins "${x}-th-b0-jf-b0-46.ucode" ;;
-		iwlwifi-cc)    doins "${x}-a0-55.ucode" ;;
-		iwlwifi-Qu-c0) doins "${x}-hr-b0-55.ucode" ;;
+		iwlwifi-cc)    doins "${x}-a0-58.ucode" ;;
+		iwlwifi-Qu-c0) doins "${x}-hr-b0-58.ucode" ;;
 		iwlwifi-QuZ)
 			case "${kernel}" in
-			kernel-4_19) doins "${x}-a0-hr-b0-55.ucode" ;;
-			kernel-5_4)  doins "${x}-a0-hr-b0-55.ucode" ;;
+			kernel-4_19) doins "${x}-a0-hr-b0-58.ucode" ;;
+			kernel-5_4)  doins "${x}-a0-hr-b0-58.ucode" ;;
 			*)
 				ewarn "Unexpected kernel version '${kernel}'."
 				ewarn "Installing all '${x}' files."
@@ -283,6 +283,10 @@
 			;;
 		iwlwifi-*) doins "${x}"-*.ucode ;;
 		esac
+		# At least with EAPI 7, it's ok to call 'doins' with the same
+		# file multiple times. So an overlay declaring multiple
+		# 'iwlwifi-*' USE flags (e.g. volteer) won't break the build.
+		doins "iwl-dbg-cfg.ini"
 	done
 }
 
diff --git a/sys-kernel/linux-headers/files/0004-CHROMIUM-v4l-Add-VP9-low-level-decoder-API-controls.patch b/sys-kernel/linux-headers/files/0004-CHROMIUM-v4l-Add-VP9-low-level-decoder-API-controls.patch
index c804ad1..87dcfc6 100644
--- a/sys-kernel/linux-headers/files/0004-CHROMIUM-v4l-Add-VP9-low-level-decoder-API-controls.patch
+++ b/sys-kernel/linux-headers/files/0004-CHROMIUM-v4l-Add-VP9-low-level-decoder-API-controls.patch
@@ -1,4 +1,4 @@
-From 2ee7da4dbe934f60eccf880e5b59ac9c82a23b1c Mon Sep 17 00:00:00 2001
+From 0036cca83011affbe91ec5434ced5041be3e5d4a Mon Sep 17 00:00:00 2001
 From: Pawel Osciak <posciak@chromium.org>
 Date: Mon, 11 Jul 2016 18:25:17 +0900
 Subject: [PATCH] CHROMIUM: v4l: Add VP9 low-level decoder API controls.
@@ -8,30 +8,38 @@
 [fbuergisser@chromium.org: original patch modified as h264 headers were moved
  to other header files which cause a failure when applying the original patch.
  Keeping part of the original patch for context.]
----
- include/uapi/linux/v4l2-controls.h | 147 +++++++++++++++++++++++++++++
- include/uapi/linux/videodev2.h     |   7 ++
- 2 files changed, 154 insertions(+)
 
-diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
-index a692623e0236..3e7bb32fd3e8 100644
---- a/include/uapi/linux/v4l2-controls.h
-+++ b/include/uapi/linux/v4l2-controls.h
-@@ -589,6 +589,10 @@ enum v4l2_vp8_golden_frame_sel {
- #define V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP		(V4L2_CID_MPEG_BASE+510)
- #define V4L2_CID_MPEG_VIDEO_VPX_PROFILE			(V4L2_CID_MPEG_BASE+511)
- 
+[acourbot@chromium.org: moved controls to a "legacy" VP9 files as we
+will merge the upstream ones.]
+---
+ include/uapi/linux/media/vp9-ctrls-legacy.h | 162 ++++++++++++++++++++
+ include/uapi/linux/videodev2.h              |   2 +
+ 2 files changed, 164 insertions(+)
+ create mode 100644 include/uapi/linux/media/vp9-ctrls-legacy.h
+
+diff --git a/include/uapi/linux/media/vp9-ctrls-legacy.h b/include/uapi/linux/media/vp9-ctrls-legacy.h
+new file mode 100644
+index 0000000..411fca7
+--- /dev/null
++++ b/include/uapi/linux/media/vp9-ctrls-legacy.h
+@@ -0,0 +1,162 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * These are the VP9 state controls for use with stateless VP9
++ * codec drivers.
++ *
++ * These headers are legacy VP9 headers and specific to Chromium only.
++ * Chromium needs to support pre v4.19 headers but will be removed in the
++ * future when Chromium will support only v4.19 and onward.
++ */
++
++#ifndef __LINUX_MEDIA_VP9_CTRLS_LEGACY_H_
++#define __LINUX_MEDIA_VP9_CTRLS_LEGACY_H_
++
 +#define V4L2_CID_MPEG_VIDEO_VP9_FRAME_HDR		(V4L2_CID_MPEG_BASE+591)
 +#define V4L2_CID_MPEG_VIDEO_VP9_DECODE_PARAM		(V4L2_CID_MPEG_BASE+592)
 +#define V4L2_CID_MPEG_VIDEO_VP9_ENTROPY			(V4L2_CID_MPEG_BASE+593)
 +
- /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
- #define V4L2_CID_MPEG_CX2341X_BASE 				(V4L2_CTRL_CLASS_MPEG | 0x1000)
- #define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE 	(V4L2_CID_MPEG_CX2341X_BASE+0)
-@@ -970,6 +974,149 @@ enum v4l2_deemphasis {
- #define V4L2_CID_RF_TUNER_PLL_LOCK			(V4L2_CID_RF_TUNER_CLASS_BASE + 91)
- 
- 
 +#define V4L2_VP9_SGMNT_PARAM_FLAG_ENABLED		0x01
 +#define V4L2_VP9_SGMNT_PARAM_FLAG_UPDATE_MAP		0x02
 +#define V4L2_VP9_SGMNT_PARAM_FLAG_TEMPORAL_UPDATE	0x04
@@ -175,14 +183,22 @@
 +	struct v4l2_vp9_entropy_ctx current_entropy_ctx;
 +};
 +
- /*  Detection-class control IDs defined by V4L2 */
- #define V4L2_CID_DETECT_CLASS_BASE		(V4L2_CTRL_CLASS_DETECT | 0x900)
- #define V4L2_CID_DETECT_CLASS			(V4L2_CTRL_CLASS_DETECT | 1)
++
++#endif /* __LINUX_MEDIA_VP9_CTRLS_LEGACY_H_ */
+\ No newline at end of file
 diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
-index 41e080891916..17332b06ef77 100644
+index 41e0808..2d8f794 100644
 --- a/include/uapi/linux/videodev2.h
 +++ b/include/uapi/linux/videodev2.h
-@@ -639,6 +639,7 @@ struct v4l2_pix_format {
+@@ -67,6 +67,7 @@
+ #include <linux/v4l2-controls.h>
+ #include <linux/media/h264-ctrls-legacy.h>
+ #include <linux/media/vp8-ctrls-legacy.h>
++#include <linux/media/vp9-ctrls-legacy.h>
+ 
+ /*
+  * Common stuff for both V4L1 and V4L2
+@@ -639,6 +640,7 @@ struct v4l2_pix_format {
  #define V4L2_PIX_FMT_VP8      v4l2_fourcc('V', 'P', '8', '0') /* VP8 */
  #define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F') /* VP8 parsed frames */
  #define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0') /* VP9 */
@@ -190,26 +206,6 @@
  
  /*  Vendor-specific formats   */
  #define V4L2_PIX_FMT_CPIA1    v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */
-@@ -1576,6 +1577,9 @@ struct v4l2_ext_control {
- 		__u8 __user *p_u8;
- 		__u16 __user *p_u16;
- 		__u32 __user *p_u32;
-+		struct v4l2_ctrl_vp9_frame_hdr __user *p_vp9_frame_hdr;
-+		struct v4l2_ctrl_vp9_decode_param __user *p_vp9_decode_param;
-+		struct v4l2_ctrl_vp9_entropy __user *p_vp9_entropy;
- 		void __user *ptr;
- 	};
- } __attribute__ ((packed));
-@@ -1620,6 +1624,9 @@ enum v4l2_ctrl_type {
- 	V4L2_CTRL_TYPE_U8	     = 0x0100,
- 	V4L2_CTRL_TYPE_U16	     = 0x0101,
- 	V4L2_CTRL_TYPE_U32	     = 0x0102,
-+	V4L2_CTRL_TYPE_VP9_FRAME_HDR    = 0x109,
-+	V4L2_CTRL_TYPE_VP9_DECODE_PARAM = 0x110,
-+	V4L2_CTRL_TYPE_VP9_ENTROPY      = 0x111,
- 
- 	V4L2_CTRL_TYPE_PRIVATE	     = 0xffff,
- };
 -- 
-2.22.0.709.g102302147b-goog
+2.26.2
 
diff --git a/sys-kernel/linux-headers/files/0005-CHROMIUM-v4l-Add-V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BE.patch b/sys-kernel/linux-headers/files/0005-CHROMIUM-v4l-Add-V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BE.patch
deleted file mode 100644
index f8c1202..0000000
--- a/sys-kernel/linux-headers/files/0005-CHROMIUM-v4l-Add-V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BE.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From a08565df495036b40d712aa3fdcb1d42e8f3cd4b Mon Sep 17 00:00:00 2001
-From: Pawel Osciak <posciak@chromium.org>
-Date: Fri, 19 Aug 2016 18:12:09 +0900
-Subject: [PATCH] CHROMIUM: v4l: Add
- V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BEFORE_IDR
-
-When set, the V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BEFORE_IDR control requests
-an H.264 encoder to insert an SPS and PPS pair before each IDR.
-
-Signed-off-by: Pawel Osciak <posciak@chromium.org>
-
-BUG=chromium:639238
-
-[fbuergisser@chromium.org: original patch modified as h264 headers were moved
- to other header files which cause a failure when applying the original patch.
- Keeping part of the original patch for context.]
----
- include/uapi/linux/v4l2-controls.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
-index e65de7df0866..830eae8f9d0d 100644
---- a/include/uapi/linux/v4l2-controls.h
-+++ b/include/uapi/linux/v4l2-controls.h
-@@ -531,6 +531,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type {
- };
- #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER	(V4L2_CID_MPEG_BASE+381)
- #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP	(V4L2_CID_MPEG_BASE+382)
-+#define V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BEFORE_IDR	(V4L2_CID_MPEG_BASE+388)
- #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP	(V4L2_CID_MPEG_BASE+400)
- #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP	(V4L2_CID_MPEG_BASE+401)
- #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP	(V4L2_CID_MPEG_BASE+402)
--- 
-2.22.0.657.g960e92d24f-goog
-
diff --git a/sys-kernel/linux-headers/files/0036-CHROMIUM-Add-fscrypt-header.patch b/sys-kernel/linux-headers/files/0036-CHROMIUM-Add-fscrypt-header.patch
new file mode 100644
index 0000000..07b2af3
--- /dev/null
+++ b/sys-kernel/linux-headers/files/0036-CHROMIUM-Add-fscrypt-header.patch
@@ -0,0 +1,272 @@
+From bc3089313e9dfd3eb4af98cb347d96d368458ead Mon Sep 17 00:00:00 2001
+From: Sarthak Kukreti <sarthakkukreti@google.com>
+Date: Wed, 24 Jun 2020 14:50:34 -0700
+Subject: [PATCH] CHROMIUM: Add fscrypt header
+
+Add fscrypt header from 5.4 to build userspace utilities with
+fscrypt. Move redundant definitions to use fscrypt.h instead.
+
+Signed-off-by: Sarthak Kukreti <sarthakkukreti@google.com>
+---
+ include/uapi/linux/fs.h      |  48 +--------
+ include/uapi/linux/fscrypt.h | 182 +++++++++++++++++++++++++++++++++++
+ 2 files changed, 183 insertions(+), 47 deletions(-)
+ create mode 100644 include/uapi/linux/fscrypt.h
+
+diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
+index 4199f8a..f2c910d 100644
+--- a/include/uapi/linux/fs.h
++++ b/include/uapi/linux/fs.h
+@@ -13,6 +13,7 @@
+ #include <linux/limits.h>
+ #include <linux/ioctl.h>
+ #include <linux/types.h>
++#include <linux/fscrypt.h>
+ 
+ /*
+  * It's silly to have NR_OPEN bigger than NR_FILE, but you can change
+@@ -254,53 +255,6 @@ struct fsxattr {
+ #define FS_IOC_FSGETXATTR		_IOR ('X', 31, struct fsxattr)
+ #define FS_IOC_FSSETXATTR		_IOW ('X', 32, struct fsxattr)
+ 
+-/*
+- * File system encryption support
+- */
+-/* Policy provided via an ioctl on the topmost directory */
+-#define FS_KEY_DESCRIPTOR_SIZE	8
+-
+-#define FS_POLICY_FLAGS_PAD_4		0x00
+-#define FS_POLICY_FLAGS_PAD_8		0x01
+-#define FS_POLICY_FLAGS_PAD_16		0x02
+-#define FS_POLICY_FLAGS_PAD_32		0x03
+-#define FS_POLICY_FLAGS_PAD_MASK	0x03
+-#define FS_POLICY_FLAGS_VALID		0x03
+-
+-/* Encryption algorithms */
+-#define FS_ENCRYPTION_MODE_INVALID		0
+-#define FS_ENCRYPTION_MODE_AES_256_XTS		1
+-#define FS_ENCRYPTION_MODE_AES_256_GCM		2
+-#define FS_ENCRYPTION_MODE_AES_256_CBC		3
+-#define FS_ENCRYPTION_MODE_AES_256_CTS		4
+-#define FS_ENCRYPTION_MODE_AES_128_CBC		5
+-#define FS_ENCRYPTION_MODE_AES_128_CTS		6
+-
+-struct fscrypt_policy {
+-	__u8 version;
+-	__u8 contents_encryption_mode;
+-	__u8 filenames_encryption_mode;
+-	__u8 flags;
+-	__u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
+-};
+-
+-#define FS_IOC_SET_ENCRYPTION_POLICY	_IOR('f', 19, struct fscrypt_policy)
+-#define FS_IOC_GET_ENCRYPTION_PWSALT	_IOW('f', 20, __u8[16])
+-#define FS_IOC_GET_ENCRYPTION_POLICY	_IOW('f', 21, struct fscrypt_policy)
+-
+-/* Parameters for passing an encryption key into the kernel keyring */
+-#define FS_KEY_DESC_PREFIX		"fscrypt:"
+-#define FS_KEY_DESC_PREFIX_SIZE		8
+-
+-/* Structure that userspace passes to the kernel keyring */
+-#define FS_MAX_KEY_SIZE			64
+-
+-struct fscrypt_key {
+-	__u32 mode;
+-	__u8 raw[FS_MAX_KEY_SIZE];
+-	__u32 size;
+-};
+-
+ /*
+  * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
+  *
+diff --git a/include/uapi/linux/fscrypt.h b/include/uapi/linux/fscrypt.h
+new file mode 100644
+index 0000000..1beb174
+--- /dev/null
++++ b/include/uapi/linux/fscrypt.h
+@@ -0,0 +1,182 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/*
++ * fscrypt user API
++ *
++ * These ioctls can be used on filesystems that support fscrypt.  See the
++ * "User API" section of Documentation/filesystems/fscrypt.rst.
++ */
++#ifndef _UAPI_LINUX_FSCRYPT_H
++#define _UAPI_LINUX_FSCRYPT_H
++
++#include <linux/types.h>
++
++/* Encryption policy flags */
++#define FSCRYPT_POLICY_FLAGS_PAD_4		0x00
++#define FSCRYPT_POLICY_FLAGS_PAD_8		0x01
++#define FSCRYPT_POLICY_FLAGS_PAD_16		0x02
++#define FSCRYPT_POLICY_FLAGS_PAD_32		0x03
++#define FSCRYPT_POLICY_FLAGS_PAD_MASK		0x03
++#define FSCRYPT_POLICY_FLAG_DIRECT_KEY		0x04
++#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64	0x08
++#define FSCRYPT_POLICY_FLAGS_VALID		0x0F
++
++/* Encryption algorithms */
++#define FSCRYPT_MODE_AES_256_XTS		1
++#define FSCRYPT_MODE_AES_256_CTS		4
++#define FSCRYPT_MODE_AES_128_CBC		5
++#define FSCRYPT_MODE_AES_128_CTS		6
++#define FSCRYPT_MODE_ADIANTUM			9
++#define __FSCRYPT_MODE_MAX			9
++
++/*
++ * Legacy policy version; ad-hoc KDF and no key verification.
++ * For new encrypted directories, use fscrypt_policy_v2 instead.
++ *
++ * Careful: the .version field for this is actually 0, not 1.
++ */
++#define FSCRYPT_POLICY_V1		0
++#define FSCRYPT_KEY_DESCRIPTOR_SIZE	8
++struct fscrypt_policy_v1 {
++	__u8 version;
++	__u8 contents_encryption_mode;
++	__u8 filenames_encryption_mode;
++	__u8 flags;
++	__u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
++};
++#define fscrypt_policy	fscrypt_policy_v1
++
++/*
++ * Process-subscribed "logon" key description prefix and payload format.
++ * Deprecated; prefer FS_IOC_ADD_ENCRYPTION_KEY instead.
++ */
++#define FSCRYPT_KEY_DESC_PREFIX		"fscrypt:"
++#define FSCRYPT_KEY_DESC_PREFIX_SIZE	8
++#define FSCRYPT_MAX_KEY_SIZE		64
++struct fscrypt_key {
++	__u32 mode;
++	__u8 raw[FSCRYPT_MAX_KEY_SIZE];
++	__u32 size;
++};
++
++/*
++ * New policy version with HKDF and key verification (recommended).
++ */
++#define FSCRYPT_POLICY_V2		2
++#define FSCRYPT_KEY_IDENTIFIER_SIZE	16
++struct fscrypt_policy_v2 {
++	__u8 version;
++	__u8 contents_encryption_mode;
++	__u8 filenames_encryption_mode;
++	__u8 flags;
++	__u8 __reserved[4];
++	__u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
++};
++
++/* Struct passed to FS_IOC_GET_ENCRYPTION_POLICY_EX */
++struct fscrypt_get_policy_ex_arg {
++	__u64 policy_size; /* input/output */
++	union {
++		__u8 version;
++		struct fscrypt_policy_v1 v1;
++		struct fscrypt_policy_v2 v2;
++	} policy; /* output */
++};
++
++/*
++ * v1 policy keys are specified by an arbitrary 8-byte key "descriptor",
++ * matching fscrypt_policy_v1::master_key_descriptor.
++ */
++#define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR	1
++
++/*
++ * v2 policy keys are specified by a 16-byte key "identifier" which the kernel
++ * calculates as a cryptographic hash of the key itself,
++ * matching fscrypt_policy_v2::master_key_identifier.
++ */
++#define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER	2
++
++/*
++ * Specifies a key, either for v1 or v2 policies.  This doesn't contain the
++ * actual key itself; this is just the "name" of the key.
++ */
++struct fscrypt_key_specifier {
++	__u32 type;	/* one of FSCRYPT_KEY_SPEC_TYPE_* */
++	__u32 __reserved;
++	union {
++		__u8 __reserved[32]; /* reserve some extra space */
++		__u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
++		__u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
++	} u;
++};
++
++/* Struct passed to FS_IOC_ADD_ENCRYPTION_KEY */
++struct fscrypt_add_key_arg {
++	struct fscrypt_key_specifier key_spec;
++	__u32 raw_size;
++	__u32 __reserved[9];
++	__u8 raw[];
++};
++
++/* Struct passed to FS_IOC_REMOVE_ENCRYPTION_KEY */
++struct fscrypt_remove_key_arg {
++	struct fscrypt_key_specifier key_spec;
++#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY	0x00000001
++#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS	0x00000002
++	__u32 removal_status_flags;	/* output */
++	__u32 __reserved[5];
++};
++
++/* Struct passed to FS_IOC_GET_ENCRYPTION_KEY_STATUS */
++struct fscrypt_get_key_status_arg {
++	/* input */
++	struct fscrypt_key_specifier key_spec;
++	__u32 __reserved[6];
++
++	/* output */
++#define FSCRYPT_KEY_STATUS_ABSENT		1
++#define FSCRYPT_KEY_STATUS_PRESENT		2
++#define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED	3
++	__u32 status;
++#define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF   0x00000001
++	__u32 status_flags;
++	__u32 user_count;
++	__u32 __out_reserved[13];
++};
++
++#define FS_IOC_SET_ENCRYPTION_POLICY		_IOR('f', 19, struct fscrypt_policy)
++#define FS_IOC_GET_ENCRYPTION_PWSALT		_IOW('f', 20, __u8[16])
++#define FS_IOC_GET_ENCRYPTION_POLICY		_IOW('f', 21, struct fscrypt_policy)
++#define FS_IOC_GET_ENCRYPTION_POLICY_EX		_IOWR('f', 22, __u8[9]) /* size + version */
++#define FS_IOC_ADD_ENCRYPTION_KEY		_IOWR('f', 23, struct fscrypt_add_key_arg)
++#define FS_IOC_REMOVE_ENCRYPTION_KEY		_IOWR('f', 24, struct fscrypt_remove_key_arg)
++#define FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS	_IOWR('f', 25, struct fscrypt_remove_key_arg)
++#define FS_IOC_GET_ENCRYPTION_KEY_STATUS	_IOWR('f', 26, struct fscrypt_get_key_status_arg)
++
++/**********************************************************************/
++
++/* old names; don't add anything new here! */
++#ifndef __KERNEL__
++#define FS_KEY_DESCRIPTOR_SIZE		FSCRYPT_KEY_DESCRIPTOR_SIZE
++#define FS_POLICY_FLAGS_PAD_4		FSCRYPT_POLICY_FLAGS_PAD_4
++#define FS_POLICY_FLAGS_PAD_8		FSCRYPT_POLICY_FLAGS_PAD_8
++#define FS_POLICY_FLAGS_PAD_16		FSCRYPT_POLICY_FLAGS_PAD_16
++#define FS_POLICY_FLAGS_PAD_32		FSCRYPT_POLICY_FLAGS_PAD_32
++#define FS_POLICY_FLAGS_PAD_MASK	FSCRYPT_POLICY_FLAGS_PAD_MASK
++#define FS_POLICY_FLAG_DIRECT_KEY	FSCRYPT_POLICY_FLAG_DIRECT_KEY
++#define FS_POLICY_FLAGS_VALID		FSCRYPT_POLICY_FLAGS_VALID
++#define FS_ENCRYPTION_MODE_INVALID	0	/* never used */
++#define FS_ENCRYPTION_MODE_AES_256_XTS	FSCRYPT_MODE_AES_256_XTS
++#define FS_ENCRYPTION_MODE_AES_256_GCM	2	/* never used */
++#define FS_ENCRYPTION_MODE_AES_256_CBC	3	/* never used */
++#define FS_ENCRYPTION_MODE_AES_256_CTS	FSCRYPT_MODE_AES_256_CTS
++#define FS_ENCRYPTION_MODE_AES_128_CBC	FSCRYPT_MODE_AES_128_CBC
++#define FS_ENCRYPTION_MODE_AES_128_CTS	FSCRYPT_MODE_AES_128_CTS
++#define FS_ENCRYPTION_MODE_SPECK128_256_XTS	7	/* removed */
++#define FS_ENCRYPTION_MODE_SPECK128_256_CTS	8	/* removed */
++#define FS_ENCRYPTION_MODE_ADIANTUM	FSCRYPT_MODE_ADIANTUM
++#define FS_KEY_DESC_PREFIX		FSCRYPT_KEY_DESC_PREFIX
++#define FS_KEY_DESC_PREFIX_SIZE		FSCRYPT_KEY_DESC_PREFIX_SIZE
++#define FS_MAX_KEY_SIZE			FSCRYPT_MAX_KEY_SIZE
++#endif /* !__KERNEL__ */
++
++#endif /* _UAPI_LINUX_FSCRYPT_H */
+-- 
+2.26.2
+
diff --git a/sys-kernel/linux-headers/files/0037-BACKPORT-v4l2-add-V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS.patch b/sys-kernel/linux-headers/files/0037-BACKPORT-v4l2-add-V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS.patch
new file mode 100644
index 0000000..89e28eb
--- /dev/null
+++ b/sys-kernel/linux-headers/files/0037-BACKPORT-v4l2-add-V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS.patch
@@ -0,0 +1,37 @@
+From 3db844b2c0031cb43e83fb984285469f36ba999e Mon Sep 17 00:00:00 2001
+From: Alexandre Courbot <acourbot@chromium.org>
+Date: Thu, 10 Sep 2020 15:43:15 +0900
+Subject: [PATCH] BACKPORT: v4l2: add V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR
+ control
+
+Add the upstream V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR, which we
+plan on using from Chromium in replacement of our own
+V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BEFORE_IDR.
+
+This is a loose backport of commit 2c02837bd99c, removing all the HEVC
+bits we don't need.
+
+BUG=b:167992324
+TEST=emerge-kukui linux-headers
+
+Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
+---
+ include/uapi/linux/v4l2-controls.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
+index 367ec97..d3e95c9 100644
+--- a/include/uapi/linux/v4l2-controls.h
++++ b/include/uapi/linux/v4l2-controls.h
+@@ -610,6 +610,8 @@ enum v4l2_mpeg_video_vp9_profile {
+ #define V4L2_CID_MPEG_VIDEO_VP9_DECODE_PARAM		(V4L2_CID_MPEG_BASE+592)
+ #define V4L2_CID_MPEG_VIDEO_VP9_ENTROPY			(V4L2_CID_MPEG_BASE+593)
+ 
++#define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR       (V4L2_CID_MPEG_BASE + 644)
++
+ /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
+ #define V4L2_CID_MPEG_CX2341X_BASE 				(V4L2_CTRL_CLASS_MPEG | 0x1000)
+ #define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE 	(V4L2_CID_MPEG_CX2341X_BASE+0)
+-- 
+2.26.2
+
diff --git a/sys-kernel/linux-headers/linux-headers-4.14-r25.ebuild b/sys-kernel/linux-headers/linux-headers-4.14-r29.ebuild
similarity index 100%
rename from sys-kernel/linux-headers/linux-headers-4.14-r25.ebuild
rename to sys-kernel/linux-headers/linux-headers-4.14-r29.ebuild
diff --git a/sys-kernel/linux-headers/linux-headers-4.14.ebuild b/sys-kernel/linux-headers/linux-headers-4.14.ebuild
index fca88f2..76ce575 100644
--- a/sys-kernel/linux-headers/linux-headers-4.14.ebuild
+++ b/sys-kernel/linux-headers/linux-headers-4.14.ebuild
@@ -27,7 +27,6 @@
 	"${FILESDIR}/0001-CHROMIUM-media-headers-Import-V4L2-headers-from-Chro.patch"
 	"${FILESDIR}/0002-CHROMIUM-v4l-Add-VP8-low-level-decoder-API-controls.patch"
 	"${FILESDIR}/0004-CHROMIUM-v4l-Add-VP9-low-level-decoder-API-controls.patch"
-	"${FILESDIR}/0005-CHROMIUM-v4l-Add-V4L2_CID_MPEG_VIDEO_H264_SPS_PPS_BE.patch"
 	"${FILESDIR}/0007-media-videodev2.h-add-IPU3-raw10-color.patch"
 	"${FILESDIR}/0008-videodev2.h-add-IPU3-meta-buffer-format.patch"
 	"${FILESDIR}/0009-uapi-intel-ipu3-Add-user-space-ABI-definitions.patch"
@@ -57,6 +56,8 @@
 	"${FILESDIR}/0033-FROMGIT-Input-add-privacy-screen-toggle-keycode.patch"
 	"${FILESDIR}/0034-UPSTREAM-Input-add-REL_WHEEL_HI_RES-and-REL_HWHEEL_H.patch"
 	"${FILESDIR}/0035-BACKPORT-Input-Add-FULL_SCREEN-ASPECT_RATIO-SELECTIV.patch"
+	"${FILESDIR}/0036-CHROMIUM-Add-fscrypt-header.patch"
+	"${FILESDIR}/0037-BACKPORT-v4l2-add-V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS.patch"
 )
 
 src_unpack() {
diff --git a/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2314.ebuild b/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2314.ebuild
deleted file mode 100644
index 1c386cb..0000000
--- a/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2314.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2014 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-
-DESCRIPTION="lp0 resume blob for Tegra"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="-* arm arm64"
-IUSE=""
-
-RDEPEND=""
-DEPEND=""
-
-CROS_WORKON_LOCALNAME="coreboot"
-
-inherit cros-workon
-
-src_compile() {
-	emake -C src/soc/nvidia/tegra132/lp0 \
-		GCC_PREFIX="${CHOST}-" || \
-		die "tegra_lp0_resume build failed"
-}
-
-src_install() {
-	insinto /lib/firmware/tegra13x/
-	doins src/soc/nvidia/tegra132/lp0/tegra_lp0_resume.fw
-}
diff --git a/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2403.ebuild b/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2403.ebuild
new file mode 100644
index 0000000..253eb15
--- /dev/null
+++ b/sys-kernel/tegra_lp0_resume-t132/tegra_lp0_resume-t132-0.0.1-r2403.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2014 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+
+DESCRIPTION="lp0 resume blob for Tegra"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="-* arm arm64"
+IUSE=""
+
+RDEPEND=""
+DEPEND=""
+
+CROS_WORKON_LOCALNAME="coreboot"
+
+inherit cros-workon
+
+src_compile() {
+	emake -C src/soc/nvidia/tegra132/lp0 \
+		GCC_PREFIX="${CHOST}-" || \
+		die "tegra_lp0_resume build failed"
+}
+
+src_install() {
+	insinto /lib/firmware/tegra13x/
+	doins src/soc/nvidia/tegra132/lp0/tegra_lp0_resume.fw
+}
diff --git a/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1813.ebuild b/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1813.ebuild
deleted file mode 100644
index 340bdb6..0000000
--- a/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1813.ebuild
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2014 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-
-DESCRIPTION="lp0 resume blob for Tegra"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="-* arm arm64"
-IUSE=""
-
-RDEPEND=""
-DEPEND=""
-
-CROS_WORKON_LOCALNAME="coreboot"
-
-inherit cros-workon
-
-src_compile() {
-	emake -C src/soc/nvidia/tegra210/lp0 \
-		GCC_PREFIX="${CHOST}-" || \
-		die "tegra_lp0_resume build failed"
-}
-
-src_install() {
-	insinto /lib/firmware/nvidia/tegra210/
-	doins src/soc/nvidia/tegra210/lp0/tegra_lp0_resume.fw
-
-	# Also install into /firmware so it can be picked up for signing
-	insinto /firmware
-	doins src/soc/nvidia/tegra210/lp0/tegra_lp0_resume.fw
-}
diff --git a/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1902.ebuild b/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1902.ebuild
new file mode 100644
index 0000000..3fd3587
--- /dev/null
+++ b/sys-kernel/tegra_lp0_resume-t210/tegra_lp0_resume-t210-0.0.1-r1902.ebuild
@@ -0,0 +1,35 @@
+# Copyright 2014 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+
+DESCRIPTION="lp0 resume blob for Tegra"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="-* arm arm64"
+IUSE=""
+
+RDEPEND=""
+DEPEND=""
+
+CROS_WORKON_LOCALNAME="coreboot"
+
+inherit cros-workon
+
+src_compile() {
+	emake -C src/soc/nvidia/tegra210/lp0 \
+		GCC_PREFIX="${CHOST}-" || \
+		die "tegra_lp0_resume build failed"
+}
+
+src_install() {
+	insinto /lib/firmware/nvidia/tegra210/
+	doins src/soc/nvidia/tegra210/lp0/tegra_lp0_resume.fw
+
+	# Also install into /firmware so it can be picked up for signing
+	insinto /firmware
+	doins src/soc/nvidia/tegra210/lp0/tegra_lp0_resume.fw
+}
diff --git a/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2746.ebuild b/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2746.ebuild
deleted file mode 100644
index 3a38e36..0000000
--- a/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2746.ebuild
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2014 The Chromium OS Authors.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-CROS_WORKON_COMMIT="e55ea5ef9a56dbfd851030c0e4c25e96db141ece"
-CROS_WORKON_TREE="c65d26079244f4817d23ede7296eb0e913a5dd20"
-CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
-
-DESCRIPTION="lp0 resume blob for Tegra"
-HOMEPAGE="http://www.coreboot.org"
-LICENSE="GPL-2"
-KEYWORDS="-* arm arm64"
-IUSE=""
-
-RDEPEND=""
-DEPEND=""
-
-CROS_WORKON_LOCALNAME="coreboot"
-
-inherit cros-workon
-
-src_compile() {
-	emake -C src/soc/nvidia/tegra124/lp0 \
-		GCC_PREFIX="${CHOST}-" || \
-		die "tegra_lp0_resume build failed"
-}
-
-src_install() {
-	insinto /lib/firmware/tegra12x/
-	doins src/soc/nvidia/tegra124/lp0/tegra_lp0_resume.fw
-}
diff --git a/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2835.ebuild b/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2835.ebuild
new file mode 100644
index 0000000..c941276
--- /dev/null
+++ b/sys-kernel/tegra_lp0_resume/tegra_lp0_resume-0.0.1-r2835.ebuild
@@ -0,0 +1,31 @@
+# Copyright 2014 The Chromium OS Authors.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+CROS_WORKON_COMMIT="5148aeb85e2a785227ff74b7d15cd533e3b4a455"
+CROS_WORKON_TREE="819d1e4534d9036bca2118f64bff6ec92f5ca5ce"
+CROS_WORKON_PROJECT="chromiumos/third_party/coreboot"
+
+DESCRIPTION="lp0 resume blob for Tegra"
+HOMEPAGE="http://www.coreboot.org"
+LICENSE="GPL-2"
+KEYWORDS="-* arm arm64"
+IUSE=""
+
+RDEPEND=""
+DEPEND=""
+
+CROS_WORKON_LOCALNAME="coreboot"
+
+inherit cros-workon
+
+src_compile() {
+	emake -C src/soc/nvidia/tegra124/lp0 \
+		GCC_PREFIX="${CHOST}-" || \
+		die "tegra_lp0_resume build failed"
+}
+
+src_install() {
+	insinto /lib/firmware/tegra12x/
+	doins src/soc/nvidia/tegra124/lp0/tegra_lp0_resume.fw
+}
diff --git a/sys-libs/compiler-rt/OWNERS b/sys-libs/compiler-rt/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-libs/compiler-rt/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-libs/compiler-rt/compiler-rt-11.0_pre394483-r1.ebuild b/sys-libs/compiler-rt/compiler-rt-11.0_pre394483-r1.ebuild
deleted file mode 120000
index f4e6847..0000000
--- a/sys-libs/compiler-rt/compiler-rt-11.0_pre394483-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-compiler-rt-11.0_pre394483.ebuild
\ No newline at end of file
diff --git a/sys-libs/compiler-rt/compiler-rt-11.0_pre394483.ebuild b/sys-libs/compiler-rt/compiler-rt-11.0_pre394483.ebuild
deleted file mode 100644
index addb62d..0000000
--- a/sys-libs/compiler-rt/compiler-rt-11.0_pre394483.ebuild
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id$
-
-EAPI=6
-
-inherit eutils toolchain-funcs cros-constants cmake-utils git-2 cros-llvm
-
-EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
-	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
-
-LLVM_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-LLVM_NEXT_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-
-DESCRIPTION="Compiler runtime library for clang"
-HOMEPAGE="http://compiler-rt.llvm.org/"
-
-LICENSE="UoI-NCSA"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+llvm-crt llvm-next llvm-tot"
-DEPEND="sys-devel/llvm"
-if [[ ${CATEGORY} == cross-* ]] ; then
-	DEPEND+="
-		${CATEGORY}/binutils
-		${CATEGORY}/gcc
-		"
-fi
-
-pkg_setup() {
-	export CMAKE_USE_DIR="${S}/compiler-rt"
-}
-
-src_unpack() {
-	if use llvm-next || use llvm-tot; then
-		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
-	else
-		export EGIT_COMMIT="${LLVM_HASH}"
-	fi
-	git-2_src_unpack
-}
-
-src_prepare() {
-	"${FILESDIR}"/patch_manager/patch_manager.py \
-		--svn_version "$(get_most_recent_revision)" \
-		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
-		--filesdir_path "${FILESDIR}" \
-		--src_path "${S}" || die
-	eapply_user
-}
-
-src_configure() {
-	setup_cross_toolchain
-	# Need libgcc for bootstrapping.
-	append-flags "-rtlib=libgcc"
-	# Compiler-rt libraries need to be built before libc++ when
-	# libc++ is default in clang.
-	# Compiler-rt builtins are C only.
-	# Even though building compiler-rt libraries does not require C++ compiler,
-	# CMake does not like a non-working C++ compiler.
-	# Avoid CMake complains about non-working C++ compiler
-	# by using libstdc++ since libc++ is built after compiler-rt in crossdev.
-	append-cxxflags "-stdlib=libstdc++"
-	append-flags "-fomit-frame-pointer"
-	if [[ ${CTARGET} == armv7a* ]]; then
-		# Use vfpv3 to be able to target non-neon targets
-		append-flags -mfpu=vfpv3
-	elif [[ ${CTARGET} == armv7m* ]]; then
-		# Some of the arm32 assembly builtins in compiler-rt need vfpv2.
-		# Passing this flag should not be required but currently
-		# upstream compiler-rt's cmake config does not provide a way to
-		# exclude these asm files.
-		append-flags -Wa,-mfpu=vfpv2
-	fi
-	BUILD_DIR=${WORKDIR}/${P}_build
-
-	local mycmakeargs=(
-		"-DLLVM_ENABLE_PROJECTS=compiler-rt"
-
-		# crbug/855759
-		"-DCOMPILER_RT_BUILD_CRT=$(usex llvm-crt)"
-	)
-
-	if [[ ${CTARGET} == *-eabi ]]; then
-		mycmakeargs+=(
-			"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
-			"-DCOMPILER_RT_OS_DIR=baremetal"
-			"-DCOMPILER_RT_BAREMETAL_BUILD=yes"
-			"-DCMAKE_C_COMPILER_TARGET=${CTARGET}"
-			"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=yes"
-		)
-	else
-		mycmakeargs+=(
-			"-DCOMPILER_RT_TEST_TARGET_TRIPLE=${CTARGET}"
-		)
-	fi
-	mycmakeargs+=(
-		"-DCOMPILER_RT_INSTALL_PATH=${EPREFIX}$(${CC} --print-resource-dir)"
-	)
-	cmake-utils_src_configure
-}
-
-src_install() {
-	# There is install conflict between cross-armv7a-cros-linux-gnueabihf
-	# and cross-armv7a-cros-linux-gnueabi. Remove this once we are ready to
-	# move to cross-armv7a-cros-linux-gnueabihf.
-	if [[ ${CTARGET} == armv7a-cros-linux-gnueabi ]] ; then
-		return
-	fi
-	cmake-utils_src_install
-
-	# includes and docs are installed for all sanitizers and xray
-	# These files conflict with files provided in llvm ebuild
-	local libdir=$(llvm-config --libdir)
-	rm -rf "${ED}"usr/share || die
-	rm -rf "${ED}${libdir}"/clang/*/include || die
-	rm -f "${ED}${libdir}"/clang/*/*_blacklist.txt || die
-	rm -f "${ED}${libdir}"/clang/*/*/*_blacklist.txt || die
-	rm -f "${ED}${libdir}"/clang/*/dfsan_abilist.txt || die
-	rm -f "${ED}${libdir}"/clang/*/*/dfsan_abilist.txt || die
-	rm -f "${ED}${libdir}"/clang/*/bin/* || die
-
-	# Copy compiler-rt files to a new clang version to handle llvm updates gracefully.
-	local llvm_version=$(llvm-config --version)
-	local clang_version=${llvm_version%svn*}
-	clang_version=${clang_version%git*}
-	local compiler_rt_version=${clang_version%%.*}
-	new_version="$((compiler_rt_version + 1)).0.0"
-	old_version="$((compiler_rt_version - 1)).0.0"
-	cp -r  "${D}${libdir}/clang/${clang_version}" "${D}${libdir}/clang/${new_version}"
-	cp -r  "${D}${libdir}/clang/${clang_version}" "${D}${libdir}/clang/${old_version}"
-}
diff --git a/sys-libs/compiler-rt/compiler-rt-11.0_pre399094-r2.ebuild b/sys-libs/compiler-rt/compiler-rt-11.0_pre399094-r2.ebuild
new file mode 120000
index 0000000..c213a67
--- /dev/null
+++ b/sys-libs/compiler-rt/compiler-rt-11.0_pre399094-r2.ebuild
@@ -0,0 +1 @@
+compiler-rt-11.0_pre399094.ebuild
\ No newline at end of file
diff --git a/sys-libs/compiler-rt/compiler-rt-11.0_pre399094.ebuild b/sys-libs/compiler-rt/compiler-rt-11.0_pre399094.ebuild
new file mode 100644
index 0000000..0b8fa72
--- /dev/null
+++ b/sys-libs/compiler-rt/compiler-rt-11.0_pre399094.ebuild
@@ -0,0 +1,132 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+
+inherit eutils toolchain-funcs cros-constants cmake-utils git-2 cros-llvm
+
+EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
+	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
+
+LLVM_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+LLVM_NEXT_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+
+DESCRIPTION="Compiler runtime library for clang"
+HOMEPAGE="http://compiler-rt.llvm.org/"
+
+LICENSE="UoI-NCSA"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+llvm-crt llvm-next llvm-tot"
+DEPEND="sys-devel/llvm"
+if [[ ${CATEGORY} == cross-* ]] ; then
+	DEPEND+="
+		${CATEGORY}/binutils
+		${CATEGORY}/gcc
+		"
+fi
+
+pkg_setup() {
+	export CMAKE_USE_DIR="${S}/compiler-rt"
+}
+
+src_unpack() {
+	if use llvm-next || use llvm-tot; then
+		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
+	else
+		export EGIT_COMMIT="${LLVM_HASH}"
+	fi
+	git-2_src_unpack
+}
+
+src_prepare() {
+	"${FILESDIR}"/patch_manager/patch_manager.py \
+		--svn_version "$(get_most_recent_revision)" \
+		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
+		--filesdir_path "${FILESDIR}" \
+		--src_path "${S}" || die
+	eapply_user
+}
+
+src_configure() {
+	setup_cross_toolchain
+	# Need libgcc for bootstrapping.
+	append-flags "-rtlib=libgcc"
+	# Compiler-rt libraries need to be built before libc++ when
+	# libc++ is default in clang.
+	# Compiler-rt builtins are C only.
+	# Even though building compiler-rt libraries does not require C++ compiler,
+	# CMake does not like a non-working C++ compiler.
+	# Avoid CMake complains about non-working C++ compiler
+	# by using libstdc++ since libc++ is built after compiler-rt in crossdev.
+	append-cxxflags "-stdlib=libstdc++"
+	append-flags "-fomit-frame-pointer"
+	if [[ ${CTARGET} == armv7a* ]]; then
+		# Use vfpv3 to be able to target non-neon targets
+		append-flags -mfpu=vfpv3
+	elif [[ ${CTARGET} == armv7m* ]]; then
+		# Some of the arm32 assembly builtins in compiler-rt need vfpv2.
+		# Passing this flag should not be required but currently
+		# upstream compiler-rt's cmake config does not provide a way to
+		# exclude these asm files.
+		append-flags -Wa,-mfpu=vfpv2
+	fi
+	BUILD_DIR=${WORKDIR}/${P}_build
+
+	local mycmakeargs=(
+		"-DLLVM_ENABLE_PROJECTS=compiler-rt"
+
+		# crbug/855759
+		"-DCOMPILER_RT_BUILD_CRT=$(usex llvm-crt)"
+	)
+
+	if [[ ${CTARGET} == *-eabi ]]; then
+		mycmakeargs+=(
+			"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
+			"-DCOMPILER_RT_OS_DIR=baremetal"
+			"-DCOMPILER_RT_BAREMETAL_BUILD=yes"
+			"-DCMAKE_C_COMPILER_TARGET=${CTARGET}"
+			"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=yes"
+		)
+	else
+		mycmakeargs+=(
+			"-DCOMPILER_RT_TEST_TARGET_TRIPLE=${CTARGET}"
+		)
+	fi
+	mycmakeargs+=(
+		"-DCOMPILER_RT_INSTALL_PATH=${EPREFIX}$(${CC} --print-resource-dir)"
+	)
+	cmake-utils_src_configure
+}
+
+src_install() {
+	# There is install conflict between cross-armv7a-cros-linux-gnueabihf
+	# and cross-armv7a-cros-linux-gnueabi. Remove this once we are ready to
+	# move to cross-armv7a-cros-linux-gnueabihf.
+	if [[ ${CTARGET} == armv7a-cros-linux-gnueabi ]] ; then
+		return
+	fi
+	cmake-utils_src_install
+
+	# includes and docs are installed for all sanitizers and xray
+	# These files conflict with files provided in llvm ebuild
+	local libdir=$(llvm-config --libdir)
+	rm -rf "${ED}"usr/share || die
+	rm -rf "${ED}${libdir}"/clang/*/include || die
+	rm -f "${ED}${libdir}"/clang/*/*_blacklist.txt || die
+	rm -f "${ED}${libdir}"/clang/*/*/*_blacklist.txt || die
+	rm -f "${ED}${libdir}"/clang/*/dfsan_abilist.txt || die
+	rm -f "${ED}${libdir}"/clang/*/*/dfsan_abilist.txt || die
+	rm -f "${ED}${libdir}"/clang/*/bin/* || die
+
+	# Copy compiler-rt files to a new clang version to handle llvm updates gracefully.
+	local llvm_version=$(llvm-config --version)
+	local clang_version=${llvm_version%svn*}
+	clang_version=${clang_version%git*}
+	local compiler_rt_version=${clang_version%%.*}
+	new_version="$((compiler_rt_version + 1)).0.0"
+	old_version="$((compiler_rt_version - 1)).0.0"
+	cp -r  "${D}${libdir}/clang/${clang_version}" "${D}${libdir}/clang/${new_version}"
+	cp -r  "${D}${libdir}/clang/${clang_version}" "${D}${libdir}/clang/${old_version}"
+}
diff --git a/sys-libs/compiler-rt/files/PATCHES.json b/sys-libs/compiler-rt/files/PATCHES.json
index bb6aa21..412d429 100644
--- a/sys-libs/compiler-rt/files/PATCHES.json
+++ b/sys-libs/compiler-rt/files/PATCHES.json
@@ -1,11 +1,17 @@
 [
     {
         "comment": "Adds a whitelist of packages that have known memory leaks",
-        "rel_patch_path": "llvm-next-leak-whitelist.v2.patch",
+        "rel_patch_path": "llvm-next-leak-allowlist.v2.patch",
         "start_version": 370808
     },
     {
         "comment": "Sets the ASAN message to go to /va/log/asan${pid} by\ndefault",
         "rel_patch_path": "clang-4.0-asan-default-path.patch"
+    },
+    {
+        "comment": "[msan] Support %ms in scanf.",
+        "rel_patch_path": "aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch",
+        "start_version": 394483,
+        "end_version": 401725
     }
-]
\ No newline at end of file
+]
diff --git a/sys-libs/compiler-rt/files/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch b/sys-libs/compiler-rt/files/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch
new file mode 100644
index 0000000..4189bd0
--- /dev/null
+++ b/sys-libs/compiler-rt/files/aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42.patch
@@ -0,0 +1,129 @@
+commit aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42
+Author: Evgenii Stepanov <eugenis@google.com>
+Date:   Wed Aug 5 12:32:17 2020 -0700
+
+    [msan] Support %ms in scanf.
+    
+    Differential Revision: https://reviews.llvm.org/D85350
+
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
+index bbbedda8fbe..082398ba960 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
+@@ -340,6 +340,12 @@ static void scanf_common(void *ctx, int n_inputs, bool allowGnuMalloc,
+       size = 0;
+     }
+     COMMON_INTERCEPTOR_WRITE_RANGE(ctx, argp, size);
++    // For %ms/%mc, write the allocated output buffer as well.
++    if (dir.allocate) {
++      char *buf = *(char **)argp;
++      if (buf)
++        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, internal_strlen(buf) + 1);
++    }
+   }
+ }
+ 
+diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
+index 4ed80721c4d..fa52ccc1994 100644
+--- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
++++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cpp
+@@ -48,13 +48,13 @@ static const unsigned P = sizeof(char *);
+ 
+ static void verifyFormatResults(const char *format, unsigned n,
+                                 const std::vector<unsigned> &computed_sizes,
+-                                va_list expected_sizes) {
+-  // "+ 1" because of format string
++                                const std::vector<unsigned> &expected_sizes) {
++  // "+ 1" because of the format string
+   ASSERT_EQ(n + 1,
+             computed_sizes.size()) << "Unexpected number of format arguments: '"
+                                    << format << "'";
+   for (unsigned i = 0; i < n; ++i)
+-    EXPECT_EQ(va_arg(expected_sizes, unsigned), computed_sizes[i + 1])
++    EXPECT_EQ(expected_sizes[i], computed_sizes[i + 1])
+         << "Unexpect write size for argument " << i << ", format string '"
+         << format << "'";
+ }
+@@ -74,8 +74,11 @@ static void testScanf3(void *ctx, int result, bool allowGnuMalloc,
+ 
+ static void testScanf2(const char *format, int scanf_result,
+                        bool allowGnuMalloc, unsigned n,
+-                       va_list expected_sizes) {
+-  std::vector<unsigned> scanf_sizes;
++                       va_list expected_sizes_va) {
++  std::vector<unsigned> scanf_sizes, expected_sizes;
++  for (unsigned i = 0; i < n; ++i)
++    expected_sizes.push_back(va_arg(expected_sizes_va, unsigned));
++
+   // 16 args should be enough.
+   testScanf3((void *)&scanf_sizes, scanf_result, allowGnuMalloc, format,
+              test_buf, test_buf, test_buf, test_buf, test_buf, test_buf,
+@@ -151,7 +154,6 @@ TEST(SanitizerCommonInterceptors, Scanf) {
+   testScanf("%c%d", 2, C, I);
+   testScanf("%A%lf", 2, F, D);
+ 
+-  testScanf("%ms %Lf", 2, P, LD);
+   testScanf("s%Las", 1, LD);
+   testScanf("%ar", 1, F);
+ 
+@@ -202,6 +204,26 @@ TEST(SanitizerCommonInterceptors, Scanf) {
+                    test_buf_size);
+ }
+ 
++TEST(SanitizerCommonInterceptors, ScanfAllocate) {
++  const char *buf = "123456";
++
++  // Can not use testScanf() because this case needs a valid pointer to a string
++  // in the scanf argument.
++  {
++    std::vector<unsigned> scanf_sizes;
++    testScanf3((void *)&scanf_sizes, 2, /*allowGnuMalloc=*/false, "%ms", &buf);
++    verifyFormatResults("%ms", 2, scanf_sizes,
++                        {P, (unsigned)(strlen(buf) + 1)});
++  }
++
++  {
++    std::vector<unsigned> scanf_sizes;
++    testScanf3((void *)&scanf_sizes, 2, /*allowGnuMalloc=*/false, "%mc", &buf);
++    verifyFormatResults("%mc", 2, scanf_sizes,
++                        {P, (unsigned)(strlen(buf) + 1)});
++  }
++}
++
+ static void testPrintf3(void *ctx, const char *format, ...) {
+   va_list ap;
+   va_start(ap, format);
+@@ -210,8 +232,11 @@ static void testPrintf3(void *ctx, const char *format, ...) {
+ }
+ 
+ static void testPrintf2(const char *format, unsigned n,
+-                       va_list expected_sizes) {
+-  std::vector<unsigned> printf_sizes;
++                        va_list expected_sizes_va) {
++  std::vector<unsigned> printf_sizes, expected_sizes;
++  for (unsigned i = 0; i < n; ++i)
++    expected_sizes.push_back(va_arg(expected_sizes_va, unsigned));
++
+   // 16 args should be enough.
+   testPrintf3((void *)&printf_sizes, format,
+              test_buf, test_buf, test_buf, test_buf, test_buf, test_buf,
+diff --git a/compiler-rt/test/msan/scanf-allocate.cpp b/compiler-rt/test/msan/scanf-allocate.cpp
+new file mode 100644
+index 00000000000..a525b0c4ab9
+--- /dev/null
++++ b/compiler-rt/test/msan/scanf-allocate.cpp
+@@ -0,0 +1,14 @@
++// RUN: %clangxx_msan -O0 %s -o %t && %run %t >%t.out 2>&1
++// FileCheck %s <%t.out
++
++#include <sanitizer/msan_interface.h>
++#include <stdio.h>
++#include <string.h>
++
++int main(int argc, char **argv) {
++  char *str;
++  sscanf("#string#", "%ms", &str);
++  printf("str = %s\n", str);
++  __msan_check_mem_is_initialized(str, strlen(str) + 1);
++  // CHECK: #string#
++}
diff --git a/sys-libs/compiler-rt/files/llvm-next-leak-allowlist.v2.patch b/sys-libs/compiler-rt/files/llvm-next-leak-allowlist.v2.patch
new file mode 100644
index 0000000..47b2580
--- /dev/null
+++ b/sys-libs/compiler-rt/files/llvm-next-leak-allowlist.v2.patch
@@ -0,0 +1,76 @@
+This adds an allowlist of packages that have known memory leaks.
+So that the leak detector will not report memory leaks from these packages.
+diff --git a/lib/sanitizer_common/sanitizer_flags.inc b/lib/sanitizer_common/sanitizer_flags.inc
+index 58f7f37..bf97783 100644
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
+@@ -152,7 +152,7 @@ COMMON_FLAG(const char *, coverage_dir, ".",
+ COMMON_FLAG(bool, full_address_space, false,
+             "Sanitize complete address space; "
+             "by default kernel area on 32-bit platforms will not be sanitized")
+-COMMON_FLAG(bool, print_suppressions, true,
++COMMON_FLAG(bool, print_suppressions, false,
+             "Print matched suppressions at exit.")
+ COMMON_FLAG(
+     bool, disable_coredump, (SANITIZER_WORDSIZE == 64),
+
+diff --git a/lib/lsan/lsan_common.cpp b/lib/lsan/lsan_common.cpp
+index a6119af..44d6f9a 100644
+--- a/compiler-rt/lib/lsan/lsan_common.cpp
++++ b/compiler-rt/lib/lsan/lsan_common.cpp
+@@ -13,6 +13,7 @@
+ //===----------------------------------------------------------------------===//
+ 
+ #include "lsan_common.h"
++#include "lsan_default_suppression.h"
+ 
+ #include "sanitizer_common/sanitizer_common.h"
+ #include "sanitizer_common/sanitizer_flags.h"
+@@ -89,6 +90,7 @@ void InitializeSuppressions() {
+   suppression_ctx->ParseFromFile(flags()->suppressions);
+   if (&__lsan_default_suppressions)
+     suppression_ctx->Parse(__lsan_default_suppressions());
++  suppression_ctx->Parse(kLSanDefaultSuppressions);
+   suppression_ctx->Parse(kStdSuppressions);
+ }
+ 
+diff --git a/lib/lsan/lsan_default_suppression.h b/lib/lsan/lsan_default_suppression.h
+new file mode 100644
+index 0000000..91aa484
+--- /dev/null
++++ b/compiler-rt/lib/lsan/lsan_default_suppression.h
+@@ -0,0 +1,34 @@
++namespace __lsan {
++
++char kLSanDefaultSuppressions[] =
++// ================ Leaks in third-party code ================
++
++// False positives in libfontconfig. http://crbug.com/39050
++"leak:libfontconfig\n"
++
++// Leaks in Nvidia's libGL.
++"leak:libGL.so\n"
++
++"leak:libnssutil3\n"
++"leak:libnspr4\n"
++"leak:libnss3\n"
++"leak:libplds4\n"
++"leak:libnssckbi\n"
++
++// XRandR has several one time leaks.
++"leak:libxrandr\n"
++
++// xrandr leak. http://crbug.com/119677
++"leak:XRRFindDisplay\n"
++
++// leak on session_manager. http://crbug.com/378805
++"leak:/sbin/session_manager\n"
++
++// leak on cryptohome. http://crbug.com/508281
++"leak:/usr/sbin/cryptohome\n"
++
++// leak on buffet. http://crbug.com/473700
++//"leak:/usr/bin/buffet\n"
++// End of suppressions.
++;  // Please keep this semicolon.
++}
diff --git a/sys-libs/compiler-rt/files/llvm-next-leak-whitelist.v2.patch b/sys-libs/compiler-rt/files/llvm-next-leak-whitelist.v2.patch
deleted file mode 100644
index f85ab13..0000000
--- a/sys-libs/compiler-rt/files/llvm-next-leak-whitelist.v2.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-This adds a whiltelist of packages that have known memory leaks.
-So that the leak detector will not report memory leaks from these packages.
-diff --git a/lib/sanitizer_common/sanitizer_flags.inc b/lib/sanitizer_common/sanitizer_flags.inc
-index 58f7f37..bf97783 100644
---- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
-+++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
-@@ -152,7 +152,7 @@ COMMON_FLAG(const char *, coverage_dir, ".",
- COMMON_FLAG(bool, full_address_space, false,
-             "Sanitize complete address space; "
-             "by default kernel area on 32-bit platforms will not be sanitized")
--COMMON_FLAG(bool, print_suppressions, true,
-+COMMON_FLAG(bool, print_suppressions, false,
-             "Print matched suppressions at exit.")
- COMMON_FLAG(
-     bool, disable_coredump, (SANITIZER_WORDSIZE == 64),
-
-diff --git a/lib/lsan/lsan_common.cpp b/lib/lsan/lsan_common.cpp
-index a6119af..44d6f9a 100644
---- a/compiler-rt/lib/lsan/lsan_common.cpp
-+++ b/compiler-rt/lib/lsan/lsan_common.cpp
-@@ -13,6 +13,7 @@
- //===----------------------------------------------------------------------===//
- 
- #include "lsan_common.h"
-+#include "lsan_default_suppression.h"
- 
- #include "sanitizer_common/sanitizer_common.h"
- #include "sanitizer_common/sanitizer_flags.h"
-@@ -89,6 +90,7 @@ void InitializeSuppressions() {
-   suppression_ctx->ParseFromFile(flags()->suppressions);
-   if (&__lsan_default_suppressions)
-     suppression_ctx->Parse(__lsan_default_suppressions());
-+  suppression_ctx->Parse(kLSanDefaultSuppressions);
-   suppression_ctx->Parse(kStdSuppressions);
- }
- 
-diff --git a/lib/lsan/lsan_default_suppression.h b/lib/lsan/lsan_default_suppression.h
-new file mode 100644
-index 0000000..91aa484
---- /dev/null
-+++ b/compiler-rt/lib/lsan/lsan_default_suppression.h
-@@ -0,0 +1,34 @@
-+namespace __lsan {
-+
-+char kLSanDefaultSuppressions[] =
-+// ================ Leaks in third-party code ================
-+
-+// False positives in libfontconfig. http://crbug.com/39050
-+"leak:libfontconfig\n"
-+
-+// Leaks in Nvidia's libGL.
-+"leak:libGL.so\n"
-+
-+"leak:libnssutil3\n"
-+"leak:libnspr4\n"
-+"leak:libnss3\n"
-+"leak:libplds4\n"
-+"leak:libnssckbi\n"
-+
-+// XRandR has several one time leaks.
-+"leak:libxrandr\n"
-+
-+// xrandr leak. http://crbug.com/119677
-+"leak:XRRFindDisplay\n"
-+
-+// leak on session_manager. http://crbug.com/378805
-+"leak:/sbin/session_manager\n"
-+
-+// leak on cryptohome. http://crbug.com/508281
-+"leak:/usr/sbin/cryptohome\n"
-+
-+// leak on buffet. http://crbug.com/473700
-+//"leak:/usr/bin/buffet\n"
-+// End of suppressions.
-+;  // Please keep this semicolon.
-+}
diff --git a/sys-libs/db/Manifest b/sys-libs/db/Manifest
deleted file mode 100644
index 5dae72f..0000000
--- a/sys-libs/db/Manifest
+++ /dev/null
@@ -1 +0,0 @@
-DIST db-18.1.32.tar.gz 44244747 BLAKE2B b539d8966a269f6a9440ef442248849f12c6b1eda79b9a41074e1eb0eb4930fd4674dd0e20a114e4020fe2ce19832572c4c86d458835da39a99f639dc3c4e23e SHA512 890b3047c28114ac30794c0234126b0b2a3e699f3ed259831091f02d51885e3583dd10c0ef0cecc215b9b8d80b48a2d3a82a5793cd3816afb45f6cc19ae23f25
diff --git a/sys-libs/db/db-18.1.32.ebuild b/sys-libs/db/db-18.1.32.ebuild
deleted file mode 100644
index 8b23915..0000000
--- a/sys-libs/db/db-18.1.32.ebuild
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright 1999-2019 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-inherit db flag-o-matic java-pkg-opt-2 autotools multilib multilib-minimal eapi7-ver toolchain-funcs
-
-#Number of official patches
-#PATCHNO=`echo ${PV}|sed -e "s,\(.*_p\)\([0-9]*\),\2,"`
-PATCHNO=${PV/*.*.*_p}
-if [[ ${PATCHNO} == "${PV}" ]] ; then
-	MY_PV=${PV}
-	MY_P=${P}
-	PATCHNO=0
-else
-	MY_PV=${PV/_p${PATCHNO}}
-	MY_P=${PN}-${MY_PV}
-fi
-
-S_BASE="${WORKDIR}/${MY_P}"
-S="${S_BASE}/dist"
-DESCRIPTION="Oracle Berkeley DB"
-HOMEPAGE="http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html"
-SRC_URI="https://download.oracle.com/otn/berkeley-db/${MY_P}.tar.gz
-	mirror://gentoo/${MY_P}.tar.gz"
-for (( i=1 ; i<=${PATCHNO} ; i++ )) ; do
-	SRC_URI+=" http://www.oracle.com/technology/products/berkeley-db/db/update/${MY_PV}/patch.${MY_PV}.${i}"
-done
-
-LICENSE="AGPL-3"
-SLOT="$(ver_cut 1-2)"
-KEYWORDS="*"
-IUSE="doc java cxx tcl test"
-
-REQUIRED_USE="test? ( tcl )"
-
-# the entire testsuite needs the TCL functionality
-DEPEND="tcl? ( >=dev-lang/tcl-8.5.15-r1:0=[${MULTILIB_USEDEP}] )
-	test? ( >=dev-lang/tcl-8.5.15-r1:0=[${MULTILIB_USEDEP}] )
-	java? ( >=virtual/jdk-1.5 )
-	>=sys-devel/binutils-2.16.1"
-RDEPEND="tcl? ( >=dev-lang/tcl-8.5.15-r1:0=[${MULTILIB_USEDEP}] )
-	java? ( >=virtual/jre-1.5 )"
-
-MULTILIB_WRAPPED_HEADERS=(
-	/usr/include/db$(ver_cut 1-2)/db.h
-)
-
-PATCHES=(
-	# bug #510506
-	"${FILESDIR}"/${PN}-4.8.24-java-manifest-location.patch
-
-	# use the includes from the prefix
-	"${FILESDIR}"/${PN}-6.2.32-jni-check-prefix-first.patch
-	"${FILESDIR}"/${PN}-4.3-listen-to-java-options.patch
-
-	# sqlite configure call has an extra leading ..
-	# upstreamed:5.2.36, missing in 5.3.x/6.x
-	# still needs to be patched in 6.0.20
-	"${FILESDIR}"/${PN}-18.1.25-sqlite-configure-path.patch
-
-	# The upstream testsuite copies .lib and the binaries for each parallel test
-	# core, ~300MB each. This patch uses links instead, saves a lot of space.
-	"${FILESDIR}"/${PN}-18.1.25-test-link.patch
-)
-
-src_prepare() {
-	cd "${WORKDIR}"/"${MY_P}"
-	for (( i=1 ; i<=${PATCHNO} ; i++ ))
-	do
-		eapply "${DISTDIR}"/patch."${MY_PV}"."${i}"
-	done
-
-	default
-
-	# Upstream release script grabs the dates when the script was run, so lets
-	# end-run them to keep the date the same.
-	export REAL_DB_RELEASE_DATE="$(awk \
-		'/^DB_VERSION_STRING=/{ gsub(".*\\(|\\).*","",$0); print $0; }' \
-		"${S_BASE}"/dist/configure)"
-	sed -r -i \
-		-e "/^DB_RELEASE_DATE=/s~=.*~='${REAL_DB_RELEASE_DATE}'~g" \
-		"${S_BASE}"/dist/RELEASE || die
-
-	# Include the SLOT for Java JAR files
-	# This supersedes the unused jarlocation patches.
-	sed -r -i \
-		-e '/jarfile=.*\.jar$/s,(.jar$),-$(LIBVERSION)\1,g' \
-		"${S_BASE}"/dist/Makefile.in || die
-
-	cd "${S_BASE}"/dist || die
-	rm -f aclocal/libtool.m4
-	sed -i \
-		-e '/AC_PROG_LIBTOOL$/aLT_OUTPUT' \
-		configure.ac || die
-	sed -i \
-		-e '/^AC_PATH_TOOL/s/ sh, none/ bash, none/' \
-		aclocal/programs.m4 || die
-	AT_M4DIR="aclocal aclocal_java" eautoreconf
-	# Upstream sucks - they do autoconf and THEN replace the version variables.
-	. ./RELEASE
-	for v in \
-		DB_VERSION_{FAMILY,LETTER,RELEASE,MAJOR,MINOR} \
-		DB_VERSION_{PATCH,FULL,UNIQUE_NAME,STRING,FULL_STRING} \
-		DB_VERSION \
-		DB_RELEASE_DATE ; do
-		local ev="__EDIT_${v}__"
-		sed -i -e "s/${ev}/${!v}/g" configure || die
-	done
-
-	# This is a false positive skip in the tests as the test-reviewer code
-	# looks for 'Skipping\s'
-	sed -i \
-		-e '/db_repsite/s,Skipping:,Skipping,g' \
-		"${S_BASE}"/test/tcl/reputils.tcl || die
-}
-
-multilib_src_configure() {
-	# db does not build with exceptions disabled.
-	cros_enable_cxx_exceptions
-
-	# sql_compat will cause a collision with sqlite3
-	# --enable-sql_compat
-	# Don't --enable-sql* because we don't want to use bundled sqlite.
-	# See Gentoo bug #605688
-	local myeconfargs=(
-		--enable-compat185
-		--enable-dbm
-		--enable-o_direct
-		# Requires openssl-1.0
-		--with-repmgr-ssl=no
-		--without-uniquename
-		--disable-sql
-		--disable-sql_codegen
-		--disable-sql_compat
-		$([[ ${ABI} == arm ]] && echo --with-mutex=ARM/gcc-assembly)
-		$([[ ${ABI} == amd64 ]] && echo --with-mutex=x86/gcc-assembly)
-		$(use_enable cxx)
-		$(use_enable cxx stl)
-		$(multilib_native_use_enable java)
-		$(use_enable test)
-	)
-
-	tc-ld-disable-gold #470634
-
-	# compilation with -O0 fails on amd64, see bug #171231
-	if [[ ${ABI} == amd64 ]]; then
-		local CFLAGS=${CFLAGS} CXXFLAGS=${CXXFLAGS}
-		replace-flags -O0 -O2
-		is-flagq -O[s123] || append-flags -O2
-	fi
-
-	# use `set` here since the java opts will contain whitespace
-	if multilib_is_native_abi && use java ; then
-		myconf+=(
-			--with-java-prefix="${JAVA_HOME}"
-			--with-javac-flags="$(java-pkg_javac-args)"
-		)
-	fi
-
-	# Bug #270851: test needs TCL support
-	if use tcl || use test ; then
-		myeconfargs+=(
-			--enable-tcl
-			--with-tcl="${EPREFIX}/usr/$(get_libdir)"
-		)
-	else
-		myeconfargs+=(--disable-tcl )
-	fi
-
-	ECONF_SOURCE="${S_BASE}"/dist \
-	STRIP="true" \
-	econf "${myeconfargs[@]}"
-}
-
-multilib_src_install() {
-	emake install DESTDIR="${D}"
-
-	db_src_install_headerslot
-
-	db_src_install_usrlibcleanup
-
-	if multilib_is_native_abi && use java; then
-		java-pkg_regso "${ED%/}"/usr/"$(get_libdir)"/libdb_java*.so
-		java-pkg_dojar "${ED%/}"/usr/"$(get_libdir)"/*.jar
-		rm -f "${ED%/}"/usr/"$(get_libdir)"/*.jar
-	fi
-}
-
-multilib_src_install_all() {
-	db_src_install_usrbinslot
-
-	db_src_install_doc
-
-	dodir /usr/sbin
-	# This file is not always built, and no longer exists as of db-4.8
-	if [[ -f "${ED%/}"/usr/bin/berkeley_db_svc ]] ; then
-		mv "${ED%/}"/usr/bin/berkeley_db_svc \
-			"${ED%/}"/usr/sbin/berkeley_db"${SLOT/./}"_svc || die
-	fi
-}
-
-pkg_postinst() {
-	multilib_foreach_abi db_fix_so
-}
-
-pkg_postrm() {
-	multilib_foreach_abi db_fix_so
-}
-
-src_test() {
-	# db_repsite is impossible to build, as upstream strips those sources.
-	# db_repsite is used directly in the setup_site_prog,
-	# setup_site_prog is called from open_site_prog
-	# which is called only from tests in the multi_repmgr group.
-	#sed -ri \
-	#	-e '/set subs/s,multi_repmgr,,g' \
-	#	"${S_BASE}/test/testparams.tcl"
-	sed -ri \
-		-e '/multi_repmgr/d' \
-		"${S_BASE}/test/tcl/test.tcl" || die
-
-	# This is the only failure in 5.2.28 so far, and looks like a false positive.
-	# Repmgr018 (btree): Test of repmgr stats.
-	#     Repmgr018.a: Start a master.
-	#     Repmgr018.b: Start a client.
-	#     Repmgr018.c: Run some transactions at master.
-	#         Rep_test: btree 20 key/data pairs starting at 0
-	#         Rep_test.a: put/get loop
-	# FAIL:07:05:59 (00:00:00) perm_no_failed_stat: expected 0, got 1
-	sed -ri \
-		-e '/set parms.*repmgr018/d' \
-		-e 's/repmgr018//g' \
-		"${S_BASE}/test/tcl/test.tcl" || die
-
-	multilib-minimal_src_test
-}
-
-multilib_src_test() {
-	multilib_is_native_abi || return
-
-	S=${BUILD_DIR} db_src_test
-}
diff --git a/sys-libs/db/files/db-18.1.25-sqlite-configure-path.patch b/sys-libs/db/files/db-18.1.25-sqlite-configure-path.patch
deleted file mode 100644
index 40570caf..0000000
--- a/sys-libs/db/files/db-18.1.25-sqlite-configure-path.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- db-18.1.25/dist/aclocal/sql.m4
-+++ db-18.1.25/dist/aclocal/sql.m4
-@@ -99,7 +99,7 @@
- if test "$db_cv_debug" = "yes"; then
-   CPPFLAGS="$CPPFLAGS -g"
- fi
--(cd sql && eval "\$SHELL ../$sqlite_dir/configure --disable-option-checking $ac_sub_configure_args CPPFLAGS=\"-I.. $CPPFLAGS\" --enable-amalgamation=$db_cv_sql_amalgamation --enable-readline=$with_readline --enable-editline=$with_editline" && cat build_config.h >> config.h) || exit 1
-+(cd sql && eval "\$SHELL $sqlite_dir/configure --disable-option-checking $ac_sub_configure_args CPPFLAGS=\"-I.. $CPPFLAGS\" --enable-amalgamation=$db_cv_sql_amalgamation --enable-readline=$with_readline --enable-editline=$with_editline" && cat build_config.h >> config.h) || exit 1
- 
- # Configure JDBC if --enable-jdbc
- if test "$db_cv_jdbc" != "no"; then
diff --git a/sys-libs/db/files/db-18.1.25-test-link.patch b/sys-libs/db/files/db-18.1.25-test-link.patch
deleted file mode 100644
index dc3d8ae..0000000
--- a/sys-libs/db/files/db-18.1.25-test-link.patch
+++ /dev/null
@@ -1,38 +0,0 @@
---- db-18.1.25/test/tcl/parallel.tcl
-+++ db-18.1.25/test/tcl/parallel.tcl
-@@ -296,17 +296,26 @@
- 			    [eval glob -nocomplain {$dir/$buildpath/db_{reptest,repsite,replicate}$EXE}] \
- 			    $destdir/$buildpath}
- 		}
-+		catch {
-+			set l [eval glob {$dir/.libs} {$dir/db_{checkpoint,deadlock}$EXE} \
-+					{$dir/db_{dump,load,printlog,recover,stat,upgrade}$EXE} \
-+					{$dir/db_{archive,verify,hotbackup,log_verify}$EXE}]
-+			foreach fn $l {
-+				set fbasename [file tail $fn]
-+				eval file link {$destdir/$fbasename} $fn
-+			}
-+		}
-+		# we will be modifying this file, so we must copy, not link
- 		catch {eval file copy \
--		    [eval glob {$dir/{.libs,include.tcl}}] $destdir}
-+		    [eval glob {$dir/include.tcl}] $destdir}
- 		# catch {eval file copy $dir/$queuedir $destdir}
--		catch {eval file copy \
--		    [eval glob {$dir/db_{checkpoint,deadlock}$EXE} \
--		    {$dir/db_{dump,load,printlog,recover}$EXE} \
--		    {$dir/db_{stat,upgrade,archive,verify}$EXE} \
--		    {$dir/db_{hotbackup,log_verify,tuner}$EXE}] \
--		    $destdir}
--		catch {eval file copy \
--		    [eval glob -nocomplain {$dir/db_{reptest,repsite,replicate}$EXE}] $destdir}
-+		catch {
-+			set l [eval glob -nocomplain {$dir/db_{reptest,repsite,replicate}$EXE}]
-+			foreach fn $l {
-+				set fbasename [file tail $fn]
-+				eval file link {$destdir/$fbasename} $fn
-+			}
-+		}
- 
- 		# Create modified copies of include.tcl in parallel
- 		# directories so paths still work.
diff --git a/sys-libs/db/files/db-4.3-listen-to-java-options.patch b/sys-libs/db/files/db-4.3-listen-to-java-options.patch
deleted file mode 100644
index f1f701d..0000000
--- a/sys-libs/db/files/db-4.3-listen-to-java-options.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/dist/configure.ac
-+++ b/dist/configure.ac
-@@ -385,6 +385,7 @@
-         # A classpath that includes . is needed to check for Java
- 	CLASSPATH=".:$CLASSPATH"
- 	export CLASSPATH
-+	AC_JAVA_OPTIONS
- 	AC_PROG_JAVAC
- 	AC_PROG_JAR
- 	AC_PROG_JAVA
diff --git a/sys-libs/db/files/db-4.8.24-java-manifest-location.patch b/sys-libs/db/files/db-4.8.24-java-manifest-location.patch
deleted file mode 100644
index 9cebadc..0000000
--- a/sys-libs/db/files/db-4.8.24-java-manifest-location.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nuar db-4.8.24.orig/dist/Makefile.in db-4.8.24/dist/Makefile.in
---- db-4.8.24.orig/dist/Makefile.in	2009-09-19 23:39:45.286001896 +0000
-+++ db-4.8.24/dist/Makefile.in	2009-09-19 23:41:13.079326882 +0000
-@@ -830,7 +830,7 @@
- 	$(JAVA) -classpath $(JAVA_CLASSTOP) \
- 	    com.sleepycat.persist.model.ClassEnhancer $(JAVA_CLASSTOP)
- 	cd $(JAVA_CLASSTOP) && \
--	     $(JAR) cfm ../$(libj_jarfile) ../$(JAVA_MANIFEST) ./com/sleepycat
-+	     $(JAR) cfm ../$(libj_jarfile) $(JAVA_MANIFEST) ./com/sleepycat
- 
- $(libj_exjarfile): $(libj_jarfile) $(JAVA_EXSRCS)
- 	@test -d $(JAVA_EXCLASSTOP) || \
diff --git a/sys-libs/db/files/db-6.2.32-jni-check-prefix-first.patch b/sys-libs/db/files/db-6.2.32-jni-check-prefix-first.patch
deleted file mode 100644
index 0a320d7..0000000
--- a/sys-libs/db/files/db-6.2.32-jni-check-prefix-first.patch
+++ /dev/null
@@ -1,44 +0,0 @@
---- db-6.2.32/dist/aclocal_java/ac_jni_include_dirs.m4
-+++ db-6.2.32/dist/aclocal_java/ac_jni_include_dirs.m4
-@@ -43,21 +43,26 @@
- *)	AC_MSG_ERROR([$_ACJNI_JAVAC is not an absolute path name]);;
- esac
- 
--_ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC")
--_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`
--case "$host_os" in
--	darwin*)	_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
--			if test -d "$_JTOPDIR/include"; then
--				_JINC="$_JTOPDIR/include"
--			else
--				_JINC="`$_JTOPDIR/Commands/java_home`/include"
--			fi;;
--	*)		if test ! -r "$_JTOPDIR/include/jni.h"; then
--				_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
--			fi
--			_JINC="$_JTOPDIR/include";;
--esac
--
-+# If JAVAPREFIX is defined, look there first
-+if test -r "$JAVAPREFIX/include/jni.h"; then
-+	_JTOPDIR="$JAVAPREFIX"
-+	_JINC="$JAVAPREFIX/include"
-+else
-+	_ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC")
-+	_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`
-+	case "$host_os" in
-+		darwin*)	_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
-+				if test -d "$_JTOPDIR/include"; then
-+					_JINC="$_JTOPDIR/include"
-+				else
-+					_JINC="`$_JTOPDIR/Commands/java_home`/include"
-+				fi;;
-+		*)		if test ! -r "$_JTOPDIR/include/jni.h"; then
-+					_JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'`
-+				fi
-+				_JINC="$_JTOPDIR/include";;
-+	esac
-+fi
- # If we find jni.h in /usr/include, then it's not a java-only tree, so
- # don't add /usr/include or subdirectories to the list of includes.
- # An extra -I/usr/include can foul things up with newer gcc's.
diff --git a/sys-libs/db/metadata.xml b/sys-libs/db/metadata.xml
deleted file mode 100644
index 19c6522..0000000
--- a/sys-libs/db/metadata.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
-<pkgmetadata>
-<maintainer type="project">
-	<email>base-system@gentoo.org</email>
-	<name>Gentoo Base System</name>
-</maintainer>
-<longdescription>
-The Berkeley Database (Berkeley DB) is a programmatic toolkit
-that provides embedded database support for both traditional and client/server
-applications. Berkeley DB includes b+tree, queue, extended linear hashing,
-fixed, and variable-length record access methods, transactions, locking,
-logging, shared memory caching and database recovery. DB supports C, C++, Java,
-and Perl APIs. DB is available for a wide variety of UNIX platforms as well as
-Windows NT and Windows '95 (MSVC 4, 5 and 6).
-</longdescription>
-<longdescription lang="nl">
-De Berkeley Database is een programmatische toolkit
-die embedded database support verzorg voor en traditionele en client/server
-applicaties. Berkeley DB bevat b+tree, rij, uitgebreide lineaire hashing, vaste
-en variabele lengte record toegangsmethoden, transacties, locking, logging,
-gedeeld geheugen caching en database herstel. DB ondersteund C, C++, Java en
-Perl API's. DB is beschikbaar voor veel UNIX platformen en
-Windows.
-</longdescription>
-<use>
-	<flag name="rpc">Enable rpc client/server</flag>
-</use>
-</pkgmetadata>
diff --git a/sys-libs/glibc/OWNERS b/sys-libs/glibc/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-libs/glibc/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-libs/glibc/glibc-2.27-r18.ebuild b/sys-libs/glibc/glibc-2.27-r18.ebuild
index 100aac3..254079a 100644
--- a/sys-libs/glibc/glibc-2.27-r18.ebuild
+++ b/sys-libs/glibc/glibc-2.27-r18.ebuild
@@ -862,14 +862,14 @@
 	esac
 	myconf+=( --enable-stackguard-randomization )
 
-	# Keep a whitelist of targets supporing IFUNC. glibc's ./configure
+	# Keep an allowlist of targets supporing IFUNC. glibc's ./configure
 	# is not robust enough to detect proper support:
 	#    https://bugs.gentoo.org/641216
 	#    https://sourceware.org/PR22634#c0
 	case $(tc-arch ${CTARGET}) in
-		# Keep whitelist of targets where autodetection mostly works.
+		# Keep an allowlist of targets where autodetection mostly works.
 		amd64|x86|sparc|ppc|ppc64|arm|arm64|s390) ;;
-		# Blacklist everywhere else
+		# Denylist everywhere else
 		*) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;;
 	esac
 
diff --git a/sys-libs/libcxx/OWNERS b/sys-libs/libcxx/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-libs/libcxx/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-libs/libcxx/libcxx-11.0_pre394483-r1.ebuild b/sys-libs/libcxx/libcxx-11.0_pre394483-r1.ebuild
deleted file mode 120000
index f546dee..0000000
--- a/sys-libs/libcxx/libcxx-11.0_pre394483-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-libcxx-11.0_pre394483.ebuild
\ No newline at end of file
diff --git a/sys-libs/libcxx/libcxx-11.0_pre394483.ebuild b/sys-libs/libcxx/libcxx-11.0_pre394483.ebuild
deleted file mode 100644
index f27c9c3..0000000
--- a/sys-libs/libcxx/libcxx-11.0_pre394483.ebuild
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-# Ninja provides better scalability and cleaner verbose output, and is used
-# throughout all LLVM projects.
-: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
-PYTHON_COMPAT=( python3_6 )
-
-inherit cmake-multilib cros-constants cros-llvm git-2 llvm python-any-r1 toolchain-funcs
-
-DESCRIPTION="New implementation of the C++ standard library, targeting C++11"
-HOMEPAGE="http://libcxx.llvm.org/"
-SRC_URI=""
-
-EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
-	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
-
-LLVM_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-LLVM_NEXT_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-
-LICENSE="|| ( UoI-NCSA MIT )"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs"
-REQUIRED_USE="libunwind? ( || ( libcxxabi libcxxrt ) )
-	?? ( libcxxabi libcxxrt )"
-
-RDEPEND="
-	libcxxabi? ( ${CATEGORY}/libcxxabi[libunwind=,static-libs?,${MULTILIB_USEDEP}] )
-	libcxxrt? ( ${CATEGORY}/libcxxrt[libunwind=,static-libs?,${MULTILIB_USEDEP}] )
-	!libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) )
-	!cros_host? ( sys-libs/gcc-libs )"
-DEPEND="${RDEPEND}
-	cros_host? ( sys-devel/llvm )
-	app-arch/xz-utils"
-
-python_check_deps() {
-	has_version "dev-python/lit[${PYTHON_USEDEP}]"
-}
-
-src_unpack() {
-	if use llvm-next || use llvm-tot; then
-		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
-	else
-		export EGIT_COMMIT="${LLVM_HASH}"
-	fi
-	git-2_src_unpack
-}
-
-src_prepare() {
-	"${FILESDIR}"/patch_manager/patch_manager.py \
-		--svn_version "$(get_most_recent_revision)" \
-		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
-		--filesdir_path "${FILESDIR}" \
-		--src_path "${S}" || die
-
-	eapply_user
-}
-
-pkg_setup() {
-	setup_cross_toolchain
-	llvm_pkg_setup
-
-	if ! use libcxxabi && ! use libcxxrt && ! tc-is-gcc ; then
-		eerror "To build ${PN} against libsupc++, you have to use gcc. Other"
-		eerror "compilers are not supported. Please set CC=gcc and CXX=g++"
-		eerror "and try again."
-		die
-	fi
-	if tc-is-gcc && [[ $(gcc-version) < 4.7 ]] ; then
-		eerror "${PN} needs to be built with gcc-4.7 or later (or other"
-		eerror "conformant compilers). Please use gcc-config to switch to"
-		eerror "gcc-4.7 or later version."
-		die
-	fi
-	export CMAKE_USE_DIR="${S}/libcxx"
-}
-
-multilib_src_configure() {
-	# Filter sanitzers flags.
-	filter_sanitizers
-
-	cros_optimize_package_for_speed
-
-	local cxxabi cxxabi_incs
-	if use libcxxabi; then
-		cxxabi=libcxxabi
-		cxxabi_incs="${SYSROOT}/${PREFIX}/include/libcxxabi"
-	elif use libcxxrt; then
-		cxxabi=libcxxrt
-		cxxabi_incs="${EPREFIX}/usr/include/libcxxrt"
-	else
-		local gcc_inc="${EPREFIX}/usr/lib/gcc/${CHOST}/$(gcc-fullversion)/include/g++-v$(gcc-major-version)"
-		cxxabi=libsupc++
-		cxxabi_incs="${gcc_inc};${gcc_inc}/${CHOST}"
-	fi
-	# Use vfpv3 to be able to target non-neon targets.
-	if [[ $(tc-arch) == "arm" ]] ; then
-		append-flags -mfpu=vfpv3
-	fi
-
-	# we want -lgcc_s for unwinder, and for compiler runtime when using
-	# gcc, clang with gcc runtime (or any unknown compiler)
-	local extra_libs=() want_gcc_s=ON
-	if use libunwind || use compiler-rt; then
-		# work-around missing -lunwind upstream
-		use libunwind && extra_libs+=( -lunwind )
-		# if we're using libunwind and clang with compiler-rt, we want
-		# to link to compiler-rt instead of -lgcc_s
-		if tc-is-clang; then
-			# get the full library list out of 'pretend mode'
-			# and grep it for libclang_rt references
-			local args=( $($(tc-getCC) -### -x c - 2>&1 | tail -n 1) )
-			local i
-			for i in "${args[@]}"; do
-				if [[ ${i} == *libclang_rt* ]]; then
-					want_gcc_s=OFF
-					extra_libs+=( "${i}" )
-				fi
-			done
-		fi
-	fi
-
-	append-flags "-stdlib=libstdc++"
-	local libdir=$(get_libdir)
-	local mycmakeargs=(
-		"-DLLVM_ENABLE_PROJECTS=libcxx"
-		"-DLIBCXX_LIBDIR_SUFFIX=${libdir#lib}"
-		"-DLIBCXX_ENABLE_SHARED=ON"
-		"-DLIBCXX_ENABLE_STATIC=$(usex static-libs)"
-		"-DLIBCXX_CXX_ABI=${cxxabi}"
-		"-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi_incs}"
-		# we're using our own mechanism for generating linker scripts
-		"-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=OFF"
-		"-DLIBCXX_HAS_MUSL_LIBC=$(usex elibc_musl)"
-		"-DLIBCXX_HAS_GCC_S_LIB=${want_gcc_s}"
-		"-DLIBCXX_USE_COMPILER_RT=$(usex compiler-rt)"
-		"-DLIBCXX_INCLUDE_TESTS=OFF"
-		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
-		"-DCMAKE_SHARED_LINKER_FLAGS=${extra_libs[*]} ${LDFLAGS}"
-	)
-
-	if use msan; then
-		mycmakeargs+=(
-			"-DLLVM_USE_SANITIZER=Memory"
-		)
-	fi
-
-	cmake-utils_src_configure
-}
-
-# Usage: deps
-gen_ldscript() {
-	local output_format
-	output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
-	[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"
-
-	cat <<-END_LDSCRIPT
-/* GNU ld script
-	Include missing dependencies
-*/
-${output_format}
-GROUP ( $@ )
-END_LDSCRIPT
-}
-
-gen_static_ldscript() {
-	local libdir=$(get_libdir)
-	local cxxabi_lib=$(usex libcxxabi "libc++abi.a" "$(usex libcxxrt "libcxxrt.a" "libsupc++.a")")
-
-	# Move it first.
-	mv "${ED}/${PREFIX}/${libdir}/libc++.a" "${ED}/${PREFIX}/${libdir}/libc++_static.a" || die
-	# Generate libc++.a ldscript for inclusion of its dependencies so that
-	# clang++ -stdlib=libc++ -static works out of the box.
-	local deps="libc++_static.a ${cxxabi_lib} $(usex libunwind libunwind.a libgcc_eh.a)"
-	# On Linux/glibc it does not link without libpthread or libdl. It is
-	# fine on FreeBSD.
-	use elibc_glibc && deps+=" libpthread.a libdl.a"
-
-	gen_ldscript "${deps}" > "${ED}/${PREFIX}/${libdir}/libc++.a" || die
-}
-
-gen_shared_ldscript() {
-	local libdir=$(get_libdir)
-	# libsupc++ doesn't have a shared version
-	local cxxabi_lib=$(usex libcxxabi "libc++abi.so" "$(usex libcxxrt "libcxxrt.so" "libsupc++.a")")
-	mv "${ED}/${PREFIX}/${libdir}/libc++.so" "${ED}/${PREFIX}/${libdir}/libc++_shared.so" || die
-	local deps="libc++_shared.so ${cxxabi_lib} $(usex compiler-rt '' $(usex libunwind libunwind.so libgcc_s.so))"
-
-	gen_ldscript "${deps}" > "${ED}/${PREFIX}/${libdir}/libc++.so" || die
-}
-
-multilib_src_install() {
-	cmake-utils_src_install
-	gen_shared_ldscript
-	use static-libs && gen_static_ldscript
-}
-
-multilib_src_install_all() {
-	if [[ ${CATEGORY} == cross-* ]]; then
-		rm -r "${ED}/usr/share/doc"
-	fi
-}
diff --git a/sys-libs/libcxx/libcxx-11.0_pre399094-r1.ebuild b/sys-libs/libcxx/libcxx-11.0_pre399094-r1.ebuild
new file mode 120000
index 0000000..3b97b3e
--- /dev/null
+++ b/sys-libs/libcxx/libcxx-11.0_pre399094-r1.ebuild
@@ -0,0 +1 @@
+libcxx-11.0_pre399094.ebuild
\ No newline at end of file
diff --git a/sys-libs/libcxx/libcxx-11.0_pre399094.ebuild b/sys-libs/libcxx/libcxx-11.0_pre399094.ebuild
new file mode 100644
index 0000000..9c0b555
--- /dev/null
+++ b/sys-libs/libcxx/libcxx-11.0_pre399094.ebuild
@@ -0,0 +1,205 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+# Ninja provides better scalability and cleaner verbose output, and is used
+# throughout all LLVM projects.
+: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
+PYTHON_COMPAT=( python3_6 )
+
+inherit cmake-multilib cros-constants cros-llvm git-2 llvm python-any-r1 toolchain-funcs
+
+DESCRIPTION="New implementation of the C++ standard library, targeting C++11"
+HOMEPAGE="http://libcxx.llvm.org/"
+SRC_URI=""
+
+EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
+	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
+
+LLVM_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+LLVM_NEXT_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+
+LICENSE="|| ( UoI-NCSA MIT )"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+compiler-rt cros_host elibc_glibc elibc_musl +libcxxabi libcxxrt libunwind llvm-next llvm-tot msan +static-libs"
+REQUIRED_USE="libunwind? ( || ( libcxxabi libcxxrt ) )
+	?? ( libcxxabi libcxxrt )"
+
+RDEPEND="
+	libcxxabi? ( ${CATEGORY}/libcxxabi[libunwind=,static-libs?,${MULTILIB_USEDEP}] )
+	libcxxrt? ( ${CATEGORY}/libcxxrt[libunwind=,static-libs?,${MULTILIB_USEDEP}] )
+	!libcxxabi? ( !libcxxrt? ( >=sys-devel/gcc-4.7:=[cxx] ) )
+	!cros_host? ( sys-libs/gcc-libs )"
+DEPEND="${RDEPEND}
+	cros_host? ( sys-devel/llvm )
+	app-arch/xz-utils"
+
+python_check_deps() {
+	has_version "dev-python/lit[${PYTHON_USEDEP}]"
+}
+
+src_unpack() {
+	if use llvm-next || use llvm-tot; then
+		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
+	else
+		export EGIT_COMMIT="${LLVM_HASH}"
+	fi
+	git-2_src_unpack
+}
+
+src_prepare() {
+	"${FILESDIR}"/patch_manager/patch_manager.py \
+		--svn_version "$(get_most_recent_revision)" \
+		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
+		--filesdir_path "${FILESDIR}" \
+		--src_path "${S}" || die
+
+	eapply_user
+}
+
+pkg_setup() {
+	setup_cross_toolchain
+	llvm_pkg_setup
+
+	if ! use libcxxabi && ! use libcxxrt && ! tc-is-gcc ; then
+		eerror "To build ${PN} against libsupc++, you have to use gcc. Other"
+		eerror "compilers are not supported. Please set CC=gcc and CXX=g++"
+		eerror "and try again."
+		die
+	fi
+	if tc-is-gcc && [[ $(gcc-version) < 4.7 ]] ; then
+		eerror "${PN} needs to be built with gcc-4.7 or later (or other"
+		eerror "conformant compilers). Please use gcc-config to switch to"
+		eerror "gcc-4.7 or later version."
+		die
+	fi
+	export CMAKE_USE_DIR="${S}/libcxx"
+}
+
+multilib_src_configure() {
+	# Filter sanitzers flags.
+	filter_sanitizers
+
+	cros_optimize_package_for_speed
+
+	local cxxabi cxxabi_incs
+	if use libcxxabi; then
+		cxxabi=libcxxabi
+		cxxabi_incs="${SYSROOT}/${PREFIX}/include/libcxxabi"
+	elif use libcxxrt; then
+		cxxabi=libcxxrt
+		cxxabi_incs="${EPREFIX}/usr/include/libcxxrt"
+	else
+		local gcc_inc="${EPREFIX}/usr/lib/gcc/${CHOST}/$(gcc-fullversion)/include/g++-v$(gcc-major-version)"
+		cxxabi=libsupc++
+		cxxabi_incs="${gcc_inc};${gcc_inc}/${CHOST}"
+	fi
+	# Use vfpv3 to be able to target non-neon targets.
+	if [[ $(tc-arch) == "arm" ]] ; then
+		append-flags -mfpu=vfpv3
+	fi
+
+	# we want -lgcc_s for unwinder, and for compiler runtime when using
+	# gcc, clang with gcc runtime (or any unknown compiler)
+	local extra_libs=() want_gcc_s=ON
+	if use libunwind || use compiler-rt; then
+		# work-around missing -lunwind upstream
+		use libunwind && extra_libs+=( -lunwind )
+		# if we're using libunwind and clang with compiler-rt, we want
+		# to link to compiler-rt instead of -lgcc_s
+		if tc-is-clang; then
+			# get the full library list out of 'pretend mode'
+			# and grep it for libclang_rt references
+			local args=( $($(tc-getCC) -### -x c - 2>&1 | tail -n 1) )
+			local i
+			for i in "${args[@]}"; do
+				if [[ ${i} == *libclang_rt* ]]; then
+					want_gcc_s=OFF
+					extra_libs+=( "${i}" )
+				fi
+			done
+		fi
+	fi
+
+	append-flags "-stdlib=libstdc++"
+	local libdir=$(get_libdir)
+	local mycmakeargs=(
+		"-DLLVM_ENABLE_PROJECTS=libcxx"
+		"-DLIBCXX_LIBDIR_SUFFIX=${libdir#lib}"
+		"-DLIBCXX_ENABLE_SHARED=ON"
+		"-DLIBCXX_ENABLE_STATIC=$(usex static-libs)"
+		"-DLIBCXX_CXX_ABI=${cxxabi}"
+		"-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi_incs}"
+		# we're using our own mechanism for generating linker scripts
+		"-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=OFF"
+		"-DLIBCXX_HAS_MUSL_LIBC=$(usex elibc_musl)"
+		"-DLIBCXX_HAS_GCC_S_LIB=${want_gcc_s}"
+		"-DLIBCXX_USE_COMPILER_RT=$(usex compiler-rt)"
+		"-DLIBCXX_INCLUDE_TESTS=OFF"
+		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
+		"-DCMAKE_SHARED_LINKER_FLAGS=${extra_libs[*]} ${LDFLAGS}"
+	)
+
+	if use msan; then
+		mycmakeargs+=(
+			"-DLLVM_USE_SANITIZER=Memory"
+		)
+	fi
+
+	cmake-utils_src_configure
+}
+
+# Usage: deps
+gen_ldscript() {
+	local output_format
+	output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
+	[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"
+
+	cat <<-END_LDSCRIPT
+/* GNU ld script
+	Include missing dependencies
+*/
+${output_format}
+GROUP ( $@ )
+END_LDSCRIPT
+}
+
+gen_static_ldscript() {
+	local libdir=$(get_libdir)
+	local cxxabi_lib=$(usex libcxxabi "libc++abi.a" "$(usex libcxxrt "libcxxrt.a" "libsupc++.a")")
+
+	# Move it first.
+	mv "${ED}/${PREFIX}/${libdir}/libc++.a" "${ED}/${PREFIX}/${libdir}/libc++_static.a" || die
+	# Generate libc++.a ldscript for inclusion of its dependencies so that
+	# clang++ -stdlib=libc++ -static works out of the box.
+	local deps="libc++_static.a ${cxxabi_lib} $(usex libunwind libunwind.a libgcc_eh.a)"
+	# On Linux/glibc it does not link without libpthread or libdl. It is
+	# fine on FreeBSD.
+	use elibc_glibc && deps+=" libpthread.a libdl.a"
+
+	gen_ldscript "${deps}" > "${ED}/${PREFIX}/${libdir}/libc++.a" || die
+}
+
+gen_shared_ldscript() {
+	local libdir=$(get_libdir)
+	# libsupc++ doesn't have a shared version
+	local cxxabi_lib=$(usex libcxxabi "libc++abi.so" "$(usex libcxxrt "libcxxrt.so" "libsupc++.a")")
+	mv "${ED}/${PREFIX}/${libdir}/libc++.so" "${ED}/${PREFIX}/${libdir}/libc++_shared.so" || die
+	local deps="libc++_shared.so ${cxxabi_lib} $(usex compiler-rt '' $(usex libunwind libunwind.so libgcc_s.so))"
+
+	gen_ldscript "${deps}" > "${ED}/${PREFIX}/${libdir}/libc++.so" || die
+}
+
+multilib_src_install() {
+	cmake-utils_src_install
+	gen_shared_ldscript
+	use static-libs && gen_static_ldscript
+}
+
+multilib_src_install_all() {
+	if [[ ${CATEGORY} == cross-* ]]; then
+		rm -r "${ED}/usr/share/doc"
+	fi
+}
diff --git a/sys-libs/libcxxabi/OWNERS b/sys-libs/libcxxabi/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-libs/libcxxabi/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-libs/libcxxabi/libcxxabi-11.0_pre394483-r1.ebuild b/sys-libs/libcxxabi/libcxxabi-11.0_pre394483-r1.ebuild
deleted file mode 120000
index d0d0fba..0000000
--- a/sys-libs/libcxxabi/libcxxabi-11.0_pre394483-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-libcxxabi-11.0_pre394483.ebuild
\ No newline at end of file
diff --git a/sys-libs/libcxxabi/libcxxabi-11.0_pre394483.ebuild b/sys-libs/libcxxabi/libcxxabi-11.0_pre394483.ebuild
deleted file mode 100644
index 155f257..0000000
--- a/sys-libs/libcxxabi/libcxxabi-11.0_pre394483.ebuild
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
-PYTHON_COMPAT=( python3_6 )
-
-inherit cmake-multilib cros-constants cros-llvm flag-o-matic git-2 llvm python-any-r1
-
-DESCRIPTION="Low level support for a standard C++ library"
-HOMEPAGE="http://libcxxabi.llvm.org/"
-
-SRC_URI=""
-EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
-	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
-
-LLVM_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-LLVM_NEXT_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-
-LICENSE="|| ( UoI-NCSA MIT )"
-SLOT="0"
-KEYWORDS="*"
-IUSE="+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs"
-
-RDEPEND="
-	libunwind? (
-			|| (
-				>=${CATEGORY}/libunwind-1[static-libs?,${MULTILIB_USEDEP}]
-				>=${CATEGORY}/llvm-libunwind-3.9.0-r1[static-libs?,${MULTILIB_USEDEP}]
-			)
-	)
-	!cros_host? ( sys-libs/gcc-libs )"
-
-DEPEND="${RDEPEND}
-	cros_host? ( sys-devel/llvm )"
-
-python_check_deps() {
-	has_version "dev-python/lit[${PYTHON_USEDEP}]"
-}
-
-pkg_setup() {
-	setup_cross_toolchain
-	llvm_pkg_setup
-	export CMAKE_USE_DIR="${S}/libcxxabi"
-}
-
-src_unpack() {
-	if use llvm-next || use llvm-tot; then
-		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
-	else
-		export EGIT_COMMIT="${LLVM_HASH}"
-	fi
-	git-2_src_unpack
-}
-
-src_prepare() {
-	"${FILESDIR}"/patch_manager/patch_manager.py \
-		--svn_version "$(get_most_recent_revision)" \
-		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
-		--filesdir_path "${FILESDIR}" \
-		--src_path "${S}" || die
-
-	eapply_user
-}
-
-multilib_src_configure() {
-	# Filter sanitzers flags.
-	filter_sanitizers
-	# Use vpfv3 fpu to be able to target non-neon targets.
-	if [[ $(tc-arch) == "arm" ]] ; then
-		append-flags -mfpu=vfpv3
-	fi
-	append-flags -I"${S}/libunwind/include"
-	append-flags "-stdlib=libstdc++"
-	# Enable futex in libc++abi to match prod toolchain.
-	append-cppflags -D_LIBCXXABI_USE_FUTEX
-	local libdir=$(get_libdir)
-	local mycmakeargs=(
-		"-DLLVM_ENABLE_PROJECTS=libcxxabi"
-		"-DLIBCXXABI_LIBDIR_SUFFIX=${libdir#lib}"
-		"-DLIBCXXABI_ENABLE_SHARED=ON"
-		"-DLIBCXXABI_ENABLE_STATIC=$(usex static-libs)"
-		"-DLIBCXXABI_USE_LLVM_UNWINDER=$(usex libunwind)"
-		"-DLIBCXXABI_INCLUDE_TESTS=OFF"
-		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
-		"-DLIBCXXABI_LIBCXX_INCLUDES=${S}/libcxx/include"
-		"-DLIBCXXABI_USE_COMPILER_RT=$(usex compiler-rt)"
-	)
-
-	# Update LLVM to 9.0 will cause LLVM to complain
-	# libstdc++ version is old. Add this flag as suggested in the error
-	# message.
-	mycmakeargs+=(
-		"-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=1"
-	)
-
-	if use msan; then
-		mycmakeargs+=(
-			"-DLLVM_USE_SANITIZER=Memory"
-		)
-	fi
-
-	cmake-utils_src_configure
-}
-
-multilib_src_install_all() {
-	if [[ ${CATEGORY} == cross-* ]]; then
-		rm -r "${ED}/usr/share/doc"
-	fi
-	insinto "${PREFIX}"/include/libcxxabi
-	doins -r "${S}"/libcxxabi/include/.
-}
diff --git a/sys-libs/libcxxabi/libcxxabi-11.0_pre399094-r1.ebuild b/sys-libs/libcxxabi/libcxxabi-11.0_pre399094-r1.ebuild
new file mode 120000
index 0000000..6b893a4
--- /dev/null
+++ b/sys-libs/libcxxabi/libcxxabi-11.0_pre399094-r1.ebuild
@@ -0,0 +1 @@
+libcxxabi-11.0_pre399094.ebuild
\ No newline at end of file
diff --git a/sys-libs/libcxxabi/libcxxabi-11.0_pre399094.ebuild b/sys-libs/libcxxabi/libcxxabi-11.0_pre399094.ebuild
new file mode 100644
index 0000000..dbe7288
--- /dev/null
+++ b/sys-libs/libcxxabi/libcxxabi-11.0_pre399094.ebuild
@@ -0,0 +1,113 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
+PYTHON_COMPAT=( python3_6 )
+
+inherit cmake-multilib cros-constants cros-llvm flag-o-matic git-2 llvm python-any-r1
+
+DESCRIPTION="Low level support for a standard C++ library"
+HOMEPAGE="http://libcxxabi.llvm.org/"
+
+SRC_URI=""
+EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
+	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
+
+LLVM_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+LLVM_NEXT_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+
+LICENSE="|| ( UoI-NCSA MIT )"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+compiler-rt cros_host libunwind msan llvm-next llvm-tot +static-libs"
+
+RDEPEND="
+	libunwind? (
+			|| (
+				>=${CATEGORY}/libunwind-1[static-libs?,${MULTILIB_USEDEP}]
+				>=${CATEGORY}/llvm-libunwind-3.9.0-r1[static-libs?,${MULTILIB_USEDEP}]
+			)
+	)
+	!cros_host? ( sys-libs/gcc-libs )"
+
+DEPEND="${RDEPEND}
+	cros_host? ( sys-devel/llvm )"
+
+python_check_deps() {
+	has_version "dev-python/lit[${PYTHON_USEDEP}]"
+}
+
+pkg_setup() {
+	setup_cross_toolchain
+	llvm_pkg_setup
+	export CMAKE_USE_DIR="${S}/libcxxabi"
+}
+
+src_unpack() {
+	if use llvm-next || use llvm-tot; then
+		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
+	else
+		export EGIT_COMMIT="${LLVM_HASH}"
+	fi
+	git-2_src_unpack
+}
+
+src_prepare() {
+	"${FILESDIR}"/patch_manager/patch_manager.py \
+		--svn_version "$(get_most_recent_revision)" \
+		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
+		--filesdir_path "${FILESDIR}" \
+		--src_path "${S}" || die
+
+	eapply_user
+}
+
+multilib_src_configure() {
+	# Filter sanitzers flags.
+	filter_sanitizers
+	# Use vpfv3 fpu to be able to target non-neon targets.
+	if [[ $(tc-arch) == "arm" ]] ; then
+		append-flags -mfpu=vfpv3
+	fi
+	append-flags -I"${S}/libunwind/include"
+	append-flags "-stdlib=libstdc++"
+	# Enable futex in libc++abi to match prod toolchain.
+	append-cppflags -D_LIBCXXABI_USE_FUTEX
+	local libdir=$(get_libdir)
+	local mycmakeargs=(
+		"-DLLVM_ENABLE_PROJECTS=libcxxabi"
+		"-DLIBCXXABI_LIBDIR_SUFFIX=${libdir#lib}"
+		"-DLIBCXXABI_ENABLE_SHARED=ON"
+		"-DLIBCXXABI_ENABLE_STATIC=$(usex static-libs)"
+		"-DLIBCXXABI_USE_LLVM_UNWINDER=$(usex libunwind)"
+		"-DLIBCXXABI_INCLUDE_TESTS=OFF"
+		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
+		"-DLIBCXXABI_LIBCXX_INCLUDES=${S}/libcxx/include"
+		"-DLIBCXXABI_USE_COMPILER_RT=$(usex compiler-rt)"
+	)
+
+	# Update LLVM to 9.0 will cause LLVM to complain
+	# libstdc++ version is old. Add this flag as suggested in the error
+	# message.
+	mycmakeargs+=(
+		"-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=1"
+	)
+
+	if use msan; then
+		mycmakeargs+=(
+			"-DLLVM_USE_SANITIZER=Memory"
+		)
+	fi
+
+	cmake-utils_src_configure
+}
+
+multilib_src_install_all() {
+	if [[ ${CATEGORY} == cross-* ]]; then
+		rm -r "${ED}/usr/share/doc"
+	fi
+	insinto "${PREFIX}"/include/libcxxabi
+	doins -r "${S}"/libcxxabi/include/.
+}
diff --git a/sys-libs/llvm-libunwind/OWNERS b/sys-libs/llvm-libunwind/OWNERS
new file mode 100644
index 0000000..31243ec
--- /dev/null
+++ b/sys-libs/llvm-libunwind/OWNERS
@@ -0,0 +1 @@
+include chromiumos/third_party/toolchain-utils:/OWNERS.toolchain
diff --git a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483-r1.ebuild b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483-r1.ebuild
deleted file mode 120000
index 6a53a2f..0000000
--- a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483-r1.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-llvm-libunwind-11.0_pre394483.ebuild
\ No newline at end of file
diff --git a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483.ebuild b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483.ebuild
deleted file mode 100644
index e837dcb..0000000
--- a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre394483.ebuild
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright 1999-2017 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-inherit cros-constants cmake-multilib cmake-utils git-2 cros-llvm
-
-DESCRIPTION="C++ runtime stack unwinder from LLVM"
-HOMEPAGE="https://github.com/llvm-mirror/libunwind"
-SRC_URI=""
-EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
-	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
-
-LLVM_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-LLVM_NEXT_HASH="b726d071b4aa46004228fc38ee5bfd167f999bfe" # r394483
-
-LICENSE="|| ( UoI-NCSA MIT )"
-SLOT="0"
-KEYWORDS="*"
-IUSE="cros_host debug llvm-next llvm-tot +static-libs +shared-libs"
-RDEPEND="!${CATEGORY}/libunwind"
-
-DEPEND="${RDEPEND}
-	cros_host? ( sys-devel/llvm )"
-
-pkg_setup() {
-	# Setup llvm toolchain for cross-compilation
-	setup_cross_toolchain
-	export CMAKE_USE_DIR="${S}/libunwind"
-}
-
-src_unpack() {
-	if use llvm-next || use llvm-tot; then
-		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
-	else
-		export EGIT_COMMIT="${LLVM_HASH}"
-	fi
-	git-2_src_unpack
-}
-
-src_prepare() {
-	"${FILESDIR}"/patch_manager/patch_manager.py \
-		--svn_version "$(get_most_recent_revision)" \
-		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
-		--filesdir_path "${FILESDIR}" \
-		--src_path "${S}" || die
-
-	eapply_user
-}
-
-should_enable_asserts() {
-	if use debug || use llvm-tot; then
-		echo yes
-	else
-		echo no
-	fi
-}
-
-multilib_src_configure() {
-	# Allow targeting non-neon targets for armv7a.
-	if [[ ${CATEGORY} == cross-armv7a* ]] ; then
-		append-flags -mfpu=vfpv3
-	fi
-	local libdir=$(get_libdir)
-	local mycmakeargs=(
-		"${mycmakeargs[@]}"
-		"-DLLVM_ENABLE_PROJECTS=libunwind"
-		"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
-		"-DLLVM_LIBDIR_SUFFIX=${libdir#lib}"
-		"-DLIBUNWIND_ENABLE_ASSERTIONS=$(should_enable_asserts)"
-		"-DLIBUNWIND_ENABLE_STATIC=$(usex static-libs)"
-		"-DLIBUNWIND_ENABLE_SHARED=$(usex shared-libs)"
-		"-DLIBUNWIND_TARGET_TRIPLE=${CTARGET}"
-		"-DLIBUNWIND_ENABLE_THREADS=OFF"
-		"-DLIBUNWIND_ENABLE_CROSS_UNWINDING=ON"
-		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
-		# Avoid old libstdc++ errors when bootstrapping.
-		"-DLLVM_ENABLE_LIBCXX=ON"
-	)
-
-	cmake-utils_src_configure
-}
-
-multilib_src_install_all() {
-	# Remove files that are installed by sys-libs/llvm-libunwind
-	# to avoid collision when installing cross-${TARGET}/llvm-libunwind.
-	if [[ ${CATEGORY} == cross-* ]]; then
-		rm -rf "${ED}"usr/share || die
-	fi
-
-	# Install headers.
-	insinto "${PREFIX}"/include
-	doins -r "${S}"/libunwind/include/.
-}
diff --git a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094-r1.ebuild b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094-r1.ebuild
new file mode 120000
index 0000000..d7472a2
--- /dev/null
+++ b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094-r1.ebuild
@@ -0,0 +1 @@
+llvm-libunwind-11.0_pre399094.ebuild
\ No newline at end of file
diff --git a/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094.ebuild b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094.ebuild
new file mode 100644
index 0000000..649bd50
--- /dev/null
+++ b/sys-libs/llvm-libunwind/llvm-libunwind-11.0_pre399094.ebuild
@@ -0,0 +1,94 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+inherit cros-constants cmake-multilib cmake-utils git-2 cros-llvm
+
+DESCRIPTION="C++ runtime stack unwinder from LLVM"
+HOMEPAGE="https://github.com/llvm-mirror/libunwind"
+SRC_URI=""
+EGIT_REPO_URI="${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project
+	${CROS_GIT_HOST_URL}/external/github.com/llvm/llvm-project"
+
+LLVM_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+LLVM_NEXT_HASH="83080a294ad7d145d758821bcf4354ad0cb7d299" # r399094
+
+LICENSE="|| ( UoI-NCSA MIT )"
+SLOT="0"
+KEYWORDS="*"
+IUSE="cros_host debug llvm-next llvm-tot +static-libs +shared-libs"
+RDEPEND="!${CATEGORY}/libunwind"
+
+DEPEND="${RDEPEND}
+	cros_host? ( sys-devel/llvm )"
+
+pkg_setup() {
+	# Setup llvm toolchain for cross-compilation
+	setup_cross_toolchain
+	export CMAKE_USE_DIR="${S}/libunwind"
+}
+
+src_unpack() {
+	if use llvm-next || use llvm-tot; then
+		export EGIT_COMMIT="${LLVM_NEXT_HASH}"
+	else
+		export EGIT_COMMIT="${LLVM_HASH}"
+	fi
+	git-2_src_unpack
+}
+
+src_prepare() {
+	"${FILESDIR}"/patch_manager/patch_manager.py \
+		--svn_version "$(get_most_recent_revision)" \
+		--patch_metadata_file "${FILESDIR}"/PATCHES.json \
+		--filesdir_path "${FILESDIR}" \
+		--src_path "${S}" || die
+
+	eapply_user
+}
+
+should_enable_asserts() {
+	if use debug || use llvm-tot; then
+		echo yes
+	else
+		echo no
+	fi
+}
+
+multilib_src_configure() {
+	# Allow targeting non-neon targets for armv7a.
+	if [[ ${CATEGORY} == cross-armv7a* ]] ; then
+		append-flags -mfpu=vfpv3
+	fi
+	local libdir=$(get_libdir)
+	local mycmakeargs=(
+		"${mycmakeargs[@]}"
+		"-DLLVM_ENABLE_PROJECTS=libunwind"
+		"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
+		"-DLLVM_LIBDIR_SUFFIX=${libdir#lib}"
+		"-DLIBUNWIND_ENABLE_ASSERTIONS=$(should_enable_asserts)"
+		"-DLIBUNWIND_ENABLE_STATIC=$(usex static-libs)"
+		"-DLIBUNWIND_ENABLE_SHARED=$(usex shared-libs)"
+		"-DLIBUNWIND_TARGET_TRIPLE=${CTARGET}"
+		"-DLIBUNWIND_ENABLE_THREADS=OFF"
+		"-DLIBUNWIND_ENABLE_CROSS_UNWINDING=ON"
+		"-DCMAKE_INSTALL_PREFIX=${PREFIX}"
+		# Avoid old libstdc++ errors when bootstrapping.
+		"-DLLVM_ENABLE_LIBCXX=ON"
+	)
+
+	cmake-utils_src_configure
+}
+
+multilib_src_install_all() {
+	# Remove files that are installed by sys-libs/llvm-libunwind
+	# to avoid collision when installing cross-${TARGET}/llvm-libunwind.
+	if [[ ${CATEGORY} == cross-* ]]; then
+		rm -rf "${ED}"usr/share || die
+	fi
+
+	# Install headers.
+	insinto "${PREFIX}"/include
+	doins -r "${S}"/libunwind/include/.
+}
diff --git a/sys-power/dptf/Manifest b/sys-power/dptf/Manifest
index 43b53eb..524401e 100644
--- a/sys-power/dptf/Manifest
+++ b/sys-power/dptf/Manifest
@@ -1 +1 @@
-DIST dptf-8.7.10102.tar.gz 919358 BLAKE2B 5457c7be11346a02ec8fc221e8941b7d99474dbe3bddc69f5980d8cb00757232e6f05a91c6ec31abe0cbf02e148bba3123809315b5ad60c3501b9801c73ed259 SHA512 6fe6a4252264ce083c43aacd4585b65a800e87d27c9f63314e4d04e04b88ba2bf1c27dd2981c992a07aab1a00ff54eae8363e74895ed30fccdf3778935206507
+DIST dptf-8.7.10500.tar.gz 948493 BLAKE2B dcaf113888c8a673d8b822a548e641b3c09a0b8d8a89263b552413acbdaeb07af524318e3304c74806c6e88b2d801ed2688bd6c21c2b042bb6623bef0e9cc0eb SHA512 bfb0446da4849ec7607725aa96da5f33f5b990ef1e97861851e0be476db0cb5956d060c974ea5b0a8215430ce20cc671a1a42e46366aec9a00ad97429a9b4df7
diff --git a/sys-power/dptf/dptf-8.7.10102-r1.ebuild b/sys-power/dptf/dptf-8.7.10500-r1.ebuild
similarity index 100%
rename from sys-power/dptf/dptf-8.7.10102-r1.ebuild
rename to sys-power/dptf/dptf-8.7.10500-r1.ebuild
diff --git a/virtual/chromeos-config-bsp/chromeos-config-bsp-1-r1.ebuild b/virtual/chromeos-config-bsp/chromeos-config-bsp-1-r2.ebuild
similarity index 100%
rename from virtual/chromeos-config-bsp/chromeos-config-bsp-1-r1.ebuild
rename to virtual/chromeos-config-bsp/chromeos-config-bsp-1-r2.ebuild
diff --git a/virtual/chromeos-config-bsp/chromeos-config-bsp-1.ebuild b/virtual/chromeos-config-bsp/chromeos-config-bsp-1.ebuild
index 8a82449..a29e1aa 100644
--- a/virtual/chromeos-config-bsp/chromeos-config-bsp-1.ebuild
+++ b/virtual/chromeos-config-bsp/chromeos-config-bsp-1.ebuild
@@ -12,11 +12,10 @@
 
 IUSE=""
 
-RDEPEND=""
-
 # TODO(bmgordon): Remove chromeos-base/chromeos-config-bsp once all the
 #                 boards using unibuild are adjusted to use virtual package.
 DEPEND="
-	${RDEPEND}
 	chromeos-base/chromeos-config-bsp
-"
\ No newline at end of file
+"
+
+RDEPEND="${DEPEND}"
diff --git a/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r51.ebuild b/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r51.ebuild
deleted file mode 100644
index 4d977ba..0000000
--- a/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r51.ebuild
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="List of packages that should be fuzzed"
-HOMEPAGE="https://dev.chromium.org/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE="asan msan"
-
-RDEPEND="
-	chromeos-base/arc-adbd[fuzzer]
-	asan? ( chromeos-base/arc-keymaster[fuzzer] )
-	chromeos-base/arc-obb-mounter[fuzzer]
-	chromeos-base/arc-setup[fuzzer]
-	chromeos-base/authpolicy[fuzzer]
-	chromeos-base/biod[fuzzer]
-	chromeos-base/bluetooth[fuzzer]
-	chromeos-base/chaps[fuzzer]
-	chromeos-base/chromeos-ec[fuzzer]
-	chromeos-base/chromeos-login[fuzzer]
-	chromeos-base/crash-reporter[fuzzer]
-	chromeos-base/cros-disks[fuzzer]
-	chromeos-base/crosdns[fuzzer]
-	chromeos-base/cryptohome[fuzzer]
-	chromeos-base/cups-fuzz[fuzzer]
-	chromeos-base/diagnostics[fuzzer]
-	chromeos-base/dlcservice[fuzzer]
-	chromeos-base/ghostscript-fuzz[fuzzer]
-	chromeos-base/hammerd[fuzzer]
-	chromeos-base/imageloader[fuzzer]
-	chromeos-base/ippusb_manager[fuzzer]
-	chromeos-base/kerberos[fuzzer]
-	chromeos-base/libbrillo[fuzzer]
-	chromeos-base/libipp[fuzzer]
-	asan? ( chromeos-base/libvda[fuzzer] )
-	chromeos-base/metrics[fuzzer]
-	chromeos-base/ml[fuzzer]
-	chromeos-base/modemfwd[fuzzer]
-	chromeos-base/p2p[fuzzer]
-	chromeos-base/patchpanel[fuzzer]
-	chromeos-base/permission_broker[fuzzer]
-	chromeos-base/power_manager[fuzzer]
-	chromeos-base/runtime_probe[fuzzer]
-	chromeos-base/shill[fuzzer]
-	chromeos-base/smbprovider[fuzzer]
-	chromeos-base/system-proxy[fuzzer]
-	chromeos-base/trunks[fuzzer]
-	chromeos-base/u2fd[fuzzer]
-	chromeos-base/update_engine[fuzzer]
-	chromeos-base/usb_bouncer[fuzzer]
-	chromeos-base/vboot_reference[fuzzer]
-	chromeos-base/vm_guest_tools[fuzzer]
-	chromeos-base/vpn-manager[fuzzer]
-	asan? ( chromeos-base/vm_host_tools[fuzzer] )
-	dev-libs/modp_b64[fuzzer]
-	asan? ( dev-rust/p9[fuzzer] )
-	dev-util/bsdiff[fuzzer]
-	dev-util/puffin[fuzzer]
-	media-libs/virglrenderer[fuzzer]
-	media-sound/adhd[fuzzer]
-	net-dns/avahi[fuzzer]
-"
diff --git a/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r55.ebuild b/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r55.ebuild
new file mode 100644
index 0000000..342e1d2
--- /dev/null
+++ b/virtual/chromium-os-fuzzers/chromium-os-fuzzers-1-r55.ebuild
@@ -0,0 +1,78 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List of packages that should be fuzzed"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="asan msan"
+
+RDEPEND="
+	chromeos-base/arc-adbd[fuzzer]
+	asan? ( chromeos-base/arc-keymaster[fuzzer] )
+	chromeos-base/arc-obb-mounter[fuzzer]
+	chromeos-base/arc-setup[fuzzer]
+	chromeos-base/authpolicy[fuzzer]
+	chromeos-base/biod[fuzzer]
+	chromeos-base/bluetooth[fuzzer]
+	chromeos-base/chaps[fuzzer]
+	chromeos-base/chromeos-ec[fuzzer]
+	chromeos-base/chromeos-login[fuzzer]
+	chromeos-base/crash-reporter[fuzzer]
+	chromeos-base/cros-disks[fuzzer]
+	chromeos-base/crosdns[fuzzer]
+	chromeos-base/cryptohome[fuzzer]
+	chromeos-base/cups-fuzz[fuzzer]
+	chromeos-base/diagnostics[fuzzer]
+	chromeos-base/dlcservice[fuzzer]
+	chromeos-base/foomatic_shell[fuzzer]
+	chromeos-base/ghostscript-fuzz[fuzzer]
+	chromeos-base/hammerd[fuzzer]
+	chromeos-base/imageloader[fuzzer]
+	chromeos-base/ippusb_manager[fuzzer]
+	chromeos-base/kerberos[fuzzer]
+	chromeos-base/libbrillo[fuzzer]
+	chromeos-base/libipp[fuzzer]
+	asan? ( chromeos-base/libvda[fuzzer] )
+	chromeos-base/metrics[fuzzer]
+	chromeos-base/ml[fuzzer]
+	chromeos-base/modemfwd[fuzzer]
+	chromeos-base/p2p[fuzzer]
+	chromeos-base/patchpanel[fuzzer]
+	chromeos-base/patchpanel-client[fuzzer]
+	chromeos-base/permission_broker[fuzzer]
+	chromeos-base/power_manager[fuzzer]
+	chromeos-base/runtime_probe[fuzzer]
+	>=chromeos-base/shill-0.0.1-r2205[fuzzer]
+	chromeos-base/smbprovider[fuzzer]
+	chromeos-base/system-proxy[fuzzer]
+	chromeos-base/trunks[fuzzer]
+	chromeos-base/u2fd[fuzzer]
+	chromeos-base/update_engine[fuzzer]
+	chromeos-base/usb_bouncer[fuzzer]
+	chromeos-base/vboot_reference[fuzzer]
+	chromeos-base/vm_guest_tools[fuzzer]
+	chromeos-base/vpn-manager[fuzzer]
+	asan? ( chromeos-base/vm_host_tools[fuzzer] )
+	dev-libs/modp_b64[fuzzer]
+	asan? ( dev-rust/p9[fuzzer] )
+	dev-util/bsdiff[fuzzer]
+	dev-util/puffin[fuzzer]
+	media-gfx/sane-airscan[fuzzer]
+	media-libs/virglrenderer[fuzzer]
+	media-sound/adhd[fuzzer]
+	net-dns/avahi[fuzzer]
+"
diff --git a/virtual/chromium-os-fuzzers/chromium-os-fuzzers-9999.ebuild b/virtual/chromium-os-fuzzers/chromium-os-fuzzers-9999.ebuild
index 51e7f8200..3609c6a 100644
--- a/virtual/chromium-os-fuzzers/chromium-os-fuzzers-9999.ebuild
+++ b/virtual/chromium-os-fuzzers/chromium-os-fuzzers-9999.ebuild
@@ -36,6 +36,7 @@
 	chromeos-base/cups-fuzz[fuzzer]
 	chromeos-base/diagnostics[fuzzer]
 	chromeos-base/dlcservice[fuzzer]
+	chromeos-base/foomatic_shell[fuzzer]
 	chromeos-base/ghostscript-fuzz[fuzzer]
 	chromeos-base/hammerd[fuzzer]
 	chromeos-base/imageloader[fuzzer]
@@ -49,10 +50,11 @@
 	chromeos-base/modemfwd[fuzzer]
 	chromeos-base/p2p[fuzzer]
 	chromeos-base/patchpanel[fuzzer]
+	chromeos-base/patchpanel-client[fuzzer]
 	chromeos-base/permission_broker[fuzzer]
 	chromeos-base/power_manager[fuzzer]
 	chromeos-base/runtime_probe[fuzzer]
-	chromeos-base/shill[fuzzer]
+	>=chromeos-base/shill-0.0.1-r2205[fuzzer]
 	chromeos-base/smbprovider[fuzzer]
 	chromeos-base/system-proxy[fuzzer]
 	chromeos-base/trunks[fuzzer]
@@ -67,6 +69,7 @@
 	asan? ( dev-rust/p9[fuzzer] )
 	dev-util/bsdiff[fuzzer]
 	dev-util/puffin[fuzzer]
+	media-gfx/sane-airscan[fuzzer]
 	media-libs/virglrenderer[fuzzer]
 	media-sound/adhd[fuzzer]
 	net-dns/avahi[fuzzer]
diff --git a/virtual/chromium-os-printing/OWNERS b/virtual/chromium-os-printing/OWNERS
new file mode 100644
index 0000000..c5d38b1
--- /dev/null
+++ b/virtual/chromium-os-printing/OWNERS
@@ -0,0 +1 @@
+include chromiumos/platform2:/cups_proxy/OWNERS
diff --git a/virtual/chromium-os-printing/chromium-os-printing-1-r8.ebuild b/virtual/chromium-os-printing/chromium-os-printing-1-r10.ebuild
similarity index 100%
rename from virtual/chromium-os-printing/chromium-os-printing-1-r8.ebuild
rename to virtual/chromium-os-printing/chromium-os-printing-1-r10.ebuild
diff --git a/virtual/chromium-os-printing/chromium-os-printing-1.ebuild b/virtual/chromium-os-printing/chromium-os-printing-1.ebuild
index 7585eed16..3559bf7 100644
--- a/virtual/chromium-os-printing/chromium-os-printing-1.ebuild
+++ b/virtual/chromium-os-printing/chromium-os-printing-1.ebuild
@@ -14,6 +14,7 @@
 
 RDEPEND="
 	chromeos-base/ippusb_manager
+	chromeos-base/lexmark-fax-pnh
 	net-print/cups
 	net-print/cups-filters
 	net-print/dymo-cups-drivers
@@ -21,5 +22,6 @@
 	net-print/starcupsdrv
 	internal? ( net-print/konica-minolta-printing-license )
 	internal? ( net-print/xerox-printing-license )
+	internal? ( net-print/fuji-xerox-printing-license )
 	postscript? ( net-print/hplip )
 "
diff --git a/virtual/cros-camera-effects/cros-camera-effects-1.ebuild b/virtual/cros-camera-effects/cros-camera-effects-1.ebuild
deleted file mode 100644
index e4309f0..0000000
--- a/virtual/cros-camera-effects/cros-camera-effects-1.ebuild
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-DESCRIPTION="Chrome OS camera effects"
-HOMEPAGE="http://src.chromium.org"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
diff --git a/virtual/rust/rust-1.43.0.ebuild b/virtual/rust/rust-1.43.0.ebuild
deleted file mode 100644
index ba461f1..0000000
--- a/virtual/rust/rust-1.43.0.ebuild
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit versionator
-
-DESCRIPTION="Virtual for the Rust language compiler"
-HOMEPAGE=""
-
-ABI_VER="$(get_version_component_range 1-2)"
-
-LICENSE=""
-SLOT="0/${ABI_VER}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-lang/rust-${PV}:=
-"
diff --git a/virtual/rust/rust-1.44.0.ebuild b/virtual/rust/rust-1.44.0.ebuild
deleted file mode 100644
index ba461f1..0000000
--- a/virtual/rust/rust-1.44.0.ebuild
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2018 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-inherit versionator
-
-DESCRIPTION="Virtual for the Rust language compiler"
-HOMEPAGE=""
-
-ABI_VER="$(get_version_component_range 1-2)"
-
-LICENSE=""
-SLOT="0/${ABI_VER}"
-KEYWORDS="*"
-
-DEPEND="
-	~dev-lang/rust-${PV}:=
-"
diff --git a/virtual/rust/rust-1.45.2.ebuild b/virtual/rust/rust-1.45.2.ebuild
new file mode 100644
index 0000000..625bd64
--- /dev/null
+++ b/virtual/rust/rust-1.45.2.ebuild
@@ -0,0 +1,15 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+DESCRIPTION="Virtual for the Rust language compiler"
+HOMEPAGE=""
+
+LICENSE=""
+SLOT="0/${PV}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-lang/rust-${PV}:=
+"
diff --git a/virtual/rust/rust-1.46.0.ebuild b/virtual/rust/rust-1.46.0.ebuild
new file mode 100644
index 0000000..625bd64
--- /dev/null
+++ b/virtual/rust/rust-1.46.0.ebuild
@@ -0,0 +1,15 @@
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+DESCRIPTION="Virtual for the Rust language compiler"
+HOMEPAGE=""
+
+LICENSE=""
+SLOT="0/${PV}"
+KEYWORDS="*"
+
+DEPEND="
+	~dev-lang/rust-${PV}:=
+"
diff --git a/virtual/servo-config-dut-usb3/servo-config-dut-usb3-1-r1.ebuild b/virtual/servo-config-dut-usb3/servo-config-dut-usb3-1-r1.ebuild
new file mode 100644
index 0000000..92764dd
--- /dev/null
+++ b/virtual/servo-config-dut-usb3/servo-config-dut-usb3-1-r1.ebuild
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the BSD license.
+#
+# This virtual package wraps:
+#
+#   dev-util/servo-config-dut-usb3-public
+#   dev-util/servo-config-dut-usb3-private
+#
+# ...to hide the dependency awkwardness of selecting which to install.
+
+EAPI="7"
+
+DESCRIPTION="List DUT USB 3 capability of Servo devices (virtual)."
+LICENSE="BSD-Google"
+KEYWORDS="*"
+IUSE="internal"
+SLOT="0/${PVR}"
+
+RDEPEND="
+	dev-util/servo-config-dut-usb3-public:=
+	internal? ( dev-util/servo-config-dut-usb3-private:= )
+"
diff --git a/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r56.ebuild b/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r56.ebuild
deleted file mode 100644
index 05329dc..0000000
--- a/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r56.ebuild
+++ /dev/null
@@ -1,163 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="List of packages that are needed inside the Chromium OS dev image"
-HOMEPAGE="https://dev.chromium.org/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-dev.
-IUSE="cras nvme pam opengl +power_management +profile
-	+shill tpm tpm2 usb vaapi video_cards_intel
-	chromeless_tty"
-
-# The dependencies here are meant to capture "all the packages
-# developers want to use for development, test, or debug".  This
-# category is meant to include all developer use cases, including
-# software test and debug, performance tuning, hardware validation,
-# and debugging failures running autotest.
-#
-# To protect developer images from changes in other ebuilds you
-# should include any package with a user constituency, regardless of
-# whether that package is included in the base Chromium OS image or
-# any other ebuild.
-#
-# Don't include packages that are indirect dependencies: only
-# include a package if a file *in that package* is expected to be
-# useful.
-
-################################################################################
-#
-# CROS_* : Dependencies for CrOS devices (coreutils, etc.)
-#
-################################################################################
-CROS_X86_RDEPEND="
-	app-benchmarks/i7z
-	power_management? ( dev-util/turbostat )
-	sys-apps/dmidecode
-	sys-apps/pciutils
-	sys-boot/syslinux
-	vaapi? (
-		chromeos-base/libva-fake-driver
-		media-gfx/vadumpcaps
-		media-video/libva-utils
-	)
-	video_cards_intel? ( x11-apps/igt-gpu-tools )
-"
-
-RDEPEND="
-	x86? ( ${CROS_X86_RDEPEND} )
-	amd64? ( ${CROS_X86_RDEPEND} )
-"
-
-RDEPEND="${RDEPEND}
-	pam? ( app-admin/sudo )
-	app-admin/sysstat
-	app-arch/bzip2
-	app-arch/gzip
-	app-arch/tar
-	app-arch/unzip
-	app-arch/xz-utils
-	app-arch/zip
-	profile? (
-		chromeos-base/quipper
-		app-benchmarks/libc-bench
-		net-analyzer/netperf
-		dev-util/perf
-	)
-	app-crypt/nss
-	tpm? ( app-crypt/tpm-tools )
-	app-editors/nano
-	app-editors/qemacs
-	app-editors/vim
-	app-misc/edid-decode
-	app-misc/evtest
-	app-misc/pax-utils
-	app-misc/screen
-	app-portage/portage-utils
-	app-shells/bash
-	app-text/tree
-	cras? (
-		chromeos-base/audiotest
-		media-sound/sox
-	)
-	chromeos-base/avtest_label_detect
-	chromeos-base/chromeos-dev-root
-	chromeos-base/cros-config-test
-	chromeos-base/cryptohome-dev-utils
-	tpm2? ( chromeos-base/g2f_tools )
-	!chromeless_tty? ( chromeos-base/graphics-utils-go )
-	chromeos-base/update-utils
-	chromeos-base/policy_utils
-	chromeos-base/protofiles
-	!chromeless_tty? ( chromeos-base/screenshot )
-	shill? ( chromeos-base/shill-test-scripts )
-	chromeos-base/touch_firmware_test
-	dev-vcs/git
-	net-analyzer/tcpdump
-	net-analyzer/traceroute
-	net-dialup/minicom
-	net-dns/bind-tools
-	net-misc/dhcp
-	net-misc/iperf:2
-	net-misc/iputils
-	net-misc/openssh
-	net-misc/rsync
-	net-wireless/iw
-	net-wireless/wireless-tools
-	dev-lang/python:2.7
-	dev-lang/python:3.6
-	dev-libs/libgpiod
-	dev-python/protobuf-python
-	dev-python/cherrypy
-	dev-python/dbus-python
-	dev-util/hdctools
-	dev-util/mem
-	dev-util/strace
-	media-tv/v4l-utils
-	media-video/yavta
-	net-dialup/lrzsz
-	net-fs/sshfs
-	net-misc/curl
-	net-misc/wget
-	sys-apps/coreboot-utils
-	sys-apps/coreutils
-	sys-apps/diffutils
-	sys-apps/file
-	sys-apps/findutils
-	sys-apps/flashrom-tester
-	sys-apps/gawk
-	sys-apps/i2c-tools
-	sys-apps/iotools
-	sys-apps/kbd
-	sys-apps/less
-	sys-apps/mmc-utils
-	nvme? ( sys-apps/nvme-cli )
-	sys-apps/portage
-	sys-apps/smartmontools
-	usb? ( sys-apps/usbutils )
-	sys-apps/which
-	sys-block/fio
-	sys-devel/gdb
-	sys-fs/fuse
-	sys-fs/lvm2
-	sys-fs/mtd-utils
-	power_management? ( sys-power/powertop )
-	sys-process/procps
-	sys-process/psmisc
-	sys-process/time
-	virtual/autotest-capability
-	virtual/chromeos-bsp-dev
-"
diff --git a/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r60.ebuild b/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r60.ebuild
new file mode 100644
index 0000000..e444571
--- /dev/null
+++ b/virtual/target-chromium-os-dev/target-chromium-os-dev-1-r60.ebuild
@@ -0,0 +1,167 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List of packages that are needed inside the Chromium OS dev image"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-dev.
+IUSE="cras nvme pam opengl +power_management +profile
+	+shill tpm tpm2 usb vaapi video_cards_amdgpu video_cards_intel
+	chromeless_tty"
+
+# The dependencies here are meant to capture "all the packages
+# developers want to use for development, test, or debug".  This
+# category is meant to include all developer use cases, including
+# software test and debug, performance tuning, hardware validation,
+# and debugging failures running autotest.
+#
+# To protect developer images from changes in other ebuilds you
+# should include any package with a user constituency, regardless of
+# whether that package is included in the base Chromium OS image or
+# any other ebuild.
+#
+# Don't include packages that are indirect dependencies: only
+# include a package if a file *in that package* is expected to be
+# useful.
+
+################################################################################
+#
+# CROS_* : Dependencies for CrOS devices (coreutils, etc.)
+#
+################################################################################
+CROS_X86_RDEPEND="
+	app-benchmarks/i7z
+	power_management? ( dev-util/turbostat )
+	sys-apps/dmidecode
+	sys-apps/pciutils
+	sys-boot/syslinux
+	vaapi? (
+		chromeos-base/libva-fake-driver
+		media-gfx/vadumpcaps
+		media-video/libva-utils
+	)
+	video_cards_amdgpu? ( x11-apps/igt-gpu-tools )
+	video_cards_intel? ( x11-apps/igt-gpu-tools )
+"
+
+RDEPEND="
+	x86? ( ${CROS_X86_RDEPEND} )
+	amd64? ( ${CROS_X86_RDEPEND} )
+"
+
+RDEPEND="${RDEPEND}
+	pam? ( app-admin/sudo )
+	app-admin/sysstat
+	app-arch/bzip2
+	app-arch/gzip
+	app-arch/tar
+	app-arch/unzip
+	app-arch/xz-utils
+	app-arch/zip
+	profile? (
+		chromeos-base/quipper
+		app-benchmarks/libc-bench
+		net-analyzer/netperf
+		dev-util/perf
+	)
+	app-benchmarks/stress-ng
+	app-crypt/nss
+	tpm? ( app-crypt/tpm-tools )
+	app-editors/nano
+	app-editors/qemacs
+	app-editors/vim
+	app-misc/edid-decode
+	app-misc/evtest
+	app-misc/pax-utils
+	app-misc/screen
+	app-portage/portage-utils
+	app-shells/bash
+	app-text/tree
+	cras? (
+		chromeos-base/audiotest
+		media-sound/sox
+	)
+	chromeos-base/avtest_label_detect
+	chromeos-base/chromeos-dev-root
+	chromeos-base/cros-config-test
+	chromeos-base/cryptohome-dev-utils
+	tpm2? ( chromeos-base/g2f_tools )
+	!chromeless_tty? ( chromeos-base/graphics-utils-go )
+	chromeos-base/update-utils
+	chromeos-base/policy_utils
+	chromeos-base/protofiles
+	!chromeless_tty? ( chromeos-base/screenshot )
+	shill? ( chromeos-base/shill-test-scripts )
+	chromeos-base/touch_firmware_test
+	chromeos-base/usi-test
+	dev-vcs/git
+	net-analyzer/tcpdump
+	net-analyzer/traceroute
+	net-dialup/minicom
+	net-dns/bind-tools
+	net-misc/dhcp
+	net-misc/iperf:2
+	net-misc/iputils
+	net-misc/openssh
+	net-misc/rsync
+	net-wireless/iw
+	net-wireless/wireless-tools
+	dev-lang/python:2.7
+	dev-lang/python:3.6
+	dev-libs/libgpiod
+	dev-python/protobuf-python
+	dev-python/cherrypy
+	dev-python/dbus-python
+	dev-python/hid-tools
+	dev-util/hdctools
+	dev-util/mem
+	dev-util/strace
+	media-tv/v4l-utils
+	media-video/yavta
+	net-dialup/lrzsz
+	net-fs/sshfs
+	net-misc/curl
+	net-misc/wget
+	sys-apps/coreboot-utils
+	sys-apps/coreutils
+	sys-apps/diffutils
+	sys-apps/file
+	sys-apps/findutils
+	sys-apps/flashrom-tester
+	sys-apps/gawk
+	sys-apps/i2c-tools
+	sys-apps/iotools
+	sys-apps/kbd
+	sys-apps/less
+	sys-apps/mmc-utils
+	nvme? ( sys-apps/nvme-cli )
+	sys-apps/portage
+	sys-apps/smartmontools
+	usb? ( sys-apps/usbutils )
+	sys-apps/which
+	sys-block/fio
+	sys-devel/gdb
+	sys-fs/fuse
+	sys-fs/lvm2
+	sys-fs/mtd-utils
+	power_management? ( sys-power/powertop )
+	sys-process/procps
+	sys-process/psmisc
+	sys-process/time
+	virtual/autotest-capability
+	virtual/chromeos-bsp-dev
+"
diff --git a/virtual/target-chromium-os-dev/target-chromium-os-dev-9999.ebuild b/virtual/target-chromium-os-dev/target-chromium-os-dev-9999.ebuild
index f2cbc10..ddfe5aa 100644
--- a/virtual/target-chromium-os-dev/target-chromium-os-dev-9999.ebuild
+++ b/virtual/target-chromium-os-dev/target-chromium-os-dev-9999.ebuild
@@ -18,7 +18,7 @@
 KEYWORDS="~*"
 # Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-dev.
 IUSE="cras nvme pam opengl +power_management +profile
-	+shill tpm tpm2 usb vaapi video_cards_intel
+	+shill tpm tpm2 usb vaapi video_cards_amdgpu video_cards_intel
 	chromeless_tty"
 
 # The dependencies here are meant to capture "all the packages
@@ -52,6 +52,7 @@
 		media-gfx/vadumpcaps
 		media-video/libva-utils
 	)
+	video_cards_amdgpu? ( x11-apps/igt-gpu-tools )
 	video_cards_intel? ( x11-apps/igt-gpu-tools )
 "
 
@@ -75,6 +76,7 @@
 		net-analyzer/netperf
 		dev-util/perf
 	)
+	app-benchmarks/stress-ng
 	app-crypt/nss
 	tpm? ( app-crypt/tpm-tools )
 	app-editors/nano
@@ -103,6 +105,7 @@
 	!chromeless_tty? ( chromeos-base/screenshot )
 	shill? ( chromeos-base/shill-test-scripts )
 	chromeos-base/touch_firmware_test
+	chromeos-base/usi-test
 	dev-vcs/git
 	net-analyzer/tcpdump
 	net-analyzer/traceroute
@@ -121,6 +124,7 @@
 	dev-python/protobuf-python
 	dev-python/cherrypy
 	dev-python/dbus-python
+	dev-python/hid-tools
 	dev-util/hdctools
 	dev-util/mem
 	dev-util/strace
diff --git a/virtual/target-chromium-os-sdk-nobdeps/target-chromium-os-sdk-nobdeps-1-r1.ebuild b/virtual/target-chromium-os-sdk-nobdeps/target-chromium-os-sdk-nobdeps-1-r3.ebuild
similarity index 100%
rename from virtual/target-chromium-os-sdk-nobdeps/target-chromium-os-sdk-nobdeps-1-r1.ebuild
rename to virtual/target-chromium-os-sdk-nobdeps/target-chromium-os-sdk-nobdeps-1-r3.ebuild
diff --git a/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1-r6.ebuild b/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1-r7.ebuild
similarity index 100%
rename from virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1-r6.ebuild
rename to virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1-r7.ebuild
diff --git a/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1.ebuild b/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1.ebuild
index 769bf42..87b8b96 100644
--- a/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1.ebuild
+++ b/virtual/target-chromium-os-sdk-post-cross/target-chromium-os-sdk-post-cross-1.ebuild
@@ -21,5 +21,6 @@
 	dev-rust/dbus-codegen
 	dev-rust/protobuf-codegen
 	sys-apps/mosys
+	sys-apps/ripgrep
 	dev-embedded/coreboot-sdk
 "
diff --git a/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r176.ebuild b/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r176.ebuild
deleted file mode 100644
index f1d6a9a..0000000
--- a/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r176.ebuild
+++ /dev/null
@@ -1,520 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="List of packages that are needed inside the Chromium OS SDK"
-HOMEPAGE="https://dev.chromium.org/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-sdk.
-IUSE=""
-
-# Block the old package to force people to clean up.
-RDEPEND="
-	!chromeos-base/hard-host-depends
-	!virtual/hard-host-depends-bsp
-"
-
-# Basic utilities
-RDEPEND="${RDEPEND}
-	app-arch/bzip2
-	app-arch/cpio
-	app-arch/gzip
-	app-arch/p7zip
-	app-arch/tar
-	app-shells/bash
-	net-misc/iputils
-	net-misc/rsync
-	sys-apps/baselayout
-	sys-apps/coreutils
-	sys-apps/diffutils
-	sys-apps/dtc
-	sys-apps/file
-	sys-apps/findutils
-	sys-apps/gawk
-	sys-apps/grep
-	sys-apps/sed
-	sys-apps/shadow
-	sys-apps/texinfo
-	sys-apps/util-linux
-	sys-apps/which
-	sys-devel/autoconf
-	sys-devel/automake:1.10
-	sys-devel/automake:1.11
-	sys-devel/automake:1.15
-	sys-devel/binutils
-	sys-devel/bison
-	sys-devel/flex
-	sys-devel/gcc
-	sys-devel/gnuconfig
-	sys-devel/grit-i18n
-	sys-devel/libtool
-	sys-devel/m4
-	sys-devel/make
-	sys-devel/patch
-	sys-fs/e2fsprogs
-	sys-fs/f2fs-tools
-	sys-libs/ncurses
-	sys-libs/readline
-	sys-libs/zlib
-	sys-process/procps
-	sys-process/psmisc
-	virtual/editor
-	virtual/libc
-	virtual/man
-	virtual/os-headers
-	virtual/package-manager
-	virtual/pager
-	"
-
-# Needed to run setup crossdev, run build scripts, and make a bootable image.
-RDEPEND="${RDEPEND}
-	app-arch/lbzip2
-	app-arch/lz4
-	app-arch/lzop
-	app-arch/pigz
-	app-arch/pixz
-	app-admin/sudo
-	app-crypt/efitools
-	app-crypt/sbsigntools
-	dev-embedded/cbootimage
-	dev-embedded/tegrarcm
-	dev-embedded/u-boot-tools
-	dev-util/ccache
-	media-gfx/pngcrush
-	>=sys-apps/dtc-1.3.0-r5
-	sys-boot/bootstub
-	sys-boot/grub
-	sys-boot/syslinux
-	sys-devel/crossdev
-	sys-fs/dosfstools
-	sys-fs/squashfs-tools
-	sys-fs/mtd-utils
-	"
-
-# Needed to build Android/ARC userland code.
-RDEPEND="${RDEPEND}
-	app-misc/jq
-	sys-devel/aapt
-	sys-devel/arc-cache-builder
-	sys-devel/arc-toolchain-master
-	sys-devel/arc-toolchain-p
-	sys-devel/arc-toolchain-r
-	sys-devel/dex2oatds
-	"
-
-# Needed to run 'repo selfupdate'
-RDEPEND="${RDEPEND}
-	app-crypt/gnupg
-	"
-
-# Host dependencies for building cross-compiled packages.
-RDEPEND="${RDEPEND}
-	app-admin/eselect-opengl
-	app-admin/eselect-mesa
-	app-arch/cabextract
-	app-arch/makeself
-	>=app-arch/pbzip2-1.1.1-r1
-	app-arch/rpm2targz
-	app-arch/sharutils
-	app-arch/unzip
-	app-crypt/nss
-	app-doc/xmltoman
-	app-emulation/qemu
-	app-emulation/qemu-binfmt-wrapper
-	!app-emulation/qemu-kvm
-	!app-emulation/qemu-user
-	app-text/asciidoc
-	app-text/docbook-xml-dtd:4.2
-	app-text/docbook-xml-dtd:4.5
-	app-text/docbook-xsl-stylesheets
-	app-text/texi2html
-	app-text/xmlto
-	chromeos-base/google-breakpad
-	chromeos-base/chromeos-base
-	>=chromeos-base/chromeos-config-host-0.0.2-r491
-	chromeos-base/chromeos-installer
-	chromeos-base/chromite-sdk
-	chromeos-base/cros-devutils[cros_host]
-	chromeos-base/cros-testutils
-	chromeos-base/ec-devutils
-	chromeos-base/minijail
-	dev-db/m17n-contrib
-	dev-db/m17n-db
-	dev-go/protobuf
-	dev-lang/closure-compiler-bin
-	dev-lang/nasm
-	dev-lang/python:2.7
-	dev-lang/python:3.6
-	dev-lang/swig
-	dev-lang/tcl
-	dev-lang/yasm
-	dev-libs/dbus-glib
-	dev-libs/flatbuffers
-	>=dev-libs/glib-2.26.1
-	net-libs/grpc
-	dev-libs/libgcrypt
-	dev-libs/libxslt
-	dev-libs/libyaml
-	dev-libs/m17n-lib
-	dev-libs/protobuf
-	dev-libs/protobuf-c
-	dev-libs/wayland
-	dev-python/cffi
-	dev-python/cherrypy
-	dev-python/ctypesgen
-	dev-python/dbus-python
-	dev-python/dpkt
-	dev-python/ecdsa
-	dev-python/future
-	dev-python/imaging
-	dev-python/intelhex
-	dev-python/m2crypto
-	dev-python/mako
-	dev-python/netifaces
-	dev-python/pexpect
-	dev-python/pillow
-	dev-python/psutil
-	dev-python/py
-	dev-python/pycairo
-	dev-python/pycparser
-	dev-python/pygobject
-	dev-python/pyopenssl
-	dev-python/pytest
-	dev-python/python-evdev
-	dev-python/pyudev
-	dev-python/pyusb
-	dev-python/setproctitle
-	!dev-python/socksipy
-	dev-python/tempita
-	dev-python/ws4py
-	dev-util/bazel
-	dev-util/cmake
-	dev-util/dwarves
-	dev-util/gob
-	dev-util/gdbus-codegen
-	dev-util/gperf
-	dev-util/gtk-doc
-	dev-util/hdctools
-	>=dev-util/gtk-doc-am-1.13
-	>=dev-util/intltool-0.30
-	dev-util/scons
-	dev-util/vulkan-headers
-	>=dev-vcs/git-1.7.2
-	>=media-libs/freetype-2.2.1
-	>=media-libs/lcms-2.6:2
-	net-fs/sshfs
-	net-libs/rpcsvc-proto
-	net-misc/gsutil
-	sys-apps/usbutils
-	!sys-apps/nih-dbus-tool
-	sys-devel/autofdo
-	sys-devel/bc
-	>=sys-libs/glibc-2.27
-	sys-libs/libcxxabi
-	sys-libs/libcxx
-	sys-libs/llvm-libunwind
-	virtual/udev
-	sys-libs/libnih
-	sys-power/iasl
-	virtual/modutils
-	x11-apps/mkfontdir
-	x11-apps/xcursorgen
-	x11-apps/xkbcomp
-	>=x11-misc/util-macros-1.2
-	"
-
-# Various fonts are needed in order to generate messages for the
-# chromeos-initramfs package.
-RDEPEND="${RDEPEND}
-	chromeos-base/chromeos-fonts
-	"
-
-# Host dependencies for bitmap block (chromeos-bmpblk) to to render messages.
-RDEPEND="${RDEPEND}
-	gnome-base/librsvg
-	"
-
-# Host dependencies for building chromium.
-# Intermediate executables built for the host, then run to generate data baked
-# into chromium, need these packages to be present in the host environment in
-# order to successfully build.
-# See: http://codereview.chromium.org/7550002/
-RDEPEND="${RDEPEND}
-	dev-libs/atk
-	dev-libs/glib
-	media-libs/fontconfig
-	media-libs/freetype
-	x11-libs/cairo
-	x11-libs/libX11
-	x11-libs/libXi
-	x11-libs/libXrandr
-	x11-libs/libXtst
-	x11-libs/pango
-	"
-
-# Host dependencies that create usernames/groups we need to pull over to target.
-RDEPEND="${RDEPEND}
-	sys-apps/dbus
-	"
-
-# Host dependencies that are needed by mod_image_for_test.
-RDEPEND="${RDEPEND}
-	sys-process/lsof
-	"
-
-# Useful utilities for developers.
-RDEPEND="${RDEPEND}
-	app-arch/zip
-	app-editors/nano
-	app-editors/qemacs
-	app-editors/vim
-	app-portage/eclass-manpages
-	app-portage/gentoolkit
-	app-portage/portage-utils
-	app-shells/bash-completion
-	dev-go/go-tools
-	dev-go/golint
-	dev-lang/go
-	dev-python/ipython
-	dev-util/codespell
-	dev-util/patchutils
-	dev-util/perf
-	dev-util/shfmt
-	net-analyzer/netperf
-	sys-apps/less
-	sys-apps/man-pages
-	sys-apps/pv
-	sys-devel/smatch
-	"
-
-# Host dependencies used by chromite on build servers
-RDEPEND="${RDEPEND}
-	dev-python/mysqlclient
-	dev-python/sqlalchemy
-	dev-python/pyparsing
-	dev-python/virtualenv
-	"
-
-# Host dependencies that are needed for unit tests
-RDEPEND="${RDEPEND}
-	x11-misc/xkeyboard-config
-	"
-
-# Host dependencies that are needed to build the autotest server components.
-RDEPEND="${RDEPEND}
-	dev-util/google-web-toolkit
-	"
-
-# Host dependencies that are needed for autotests.
-RDEPEND="${RDEPEND}
-	dev-python/btsocket
-	dev-python/selenium
-	sys-apps/iproute2
-	sys-apps/net-tools
-	"
-
-# Host dependencies that are needed for media applications (ex, mplayer) used in
-# factory.
-RDEPEND="${RDEPEND}
-	media-video/ffmpeg
-	"
-
-# Host dependencies that are needed to create and sign images
-RDEPEND="${RDEPEND}
-	>=chromeos-base/vboot_reference-1.0-r174
-	chromeos-base/verity
-	!dev-python/ahocorasick
-	dev-python/pyahocorasick
-	sys-fs/libfat
-	"
-
-# Host dependencies that are needed for cros_generate_update_payload.
-RDEPEND="${RDEPEND}
-	chromeos-base/update_engine
-	sys-fs/e2tools
-	"
-
-# Host dependencies to run unit tests within the chroot
-RDEPEND="${RDEPEND}
-	dev-cpp/gflags
-	dev-go/mock
-	dev-python/mock
-	dev-python/mox
-	dev-python/unittest2
-	"
-# Host dependencies to run autotest's unit tests within the chroot.
-RDEPEND="${RDEPEND}
-	dev-python/httplib2
-	dev-python/pyshark
-	dev-python/python-dateutil
-	dev-python/six
-	"
-
-# Host dependencies for running pylint within the chroot
-RDEPEND="${RDEPEND}
-	dev-python/pylint
-	"
-
-# Host dependencies to scp binaries from the binary component server
-RDEPEND="${RDEPEND}
-	net-misc/openssh
-	net-misc/socat
-	net-misc/wget
-	"
-
-# Host dependencies for HWID processing
-RDEPEND="${RDEPEND}
-	dev-python/pyyaml
-	"
-
-# Tools for working with compiler generated profile information
-# (such as coverage analysis in common.mk)
-RDEPEND="${RDEPEND}
-	dev-util/lcov
-	"
-
-# Host dependencies for building Platform2
-RDEPEND="${RDEPEND}
-	chromeos-base/chromeos-dbus-bindings
-	dev-util/meson
-	dev-util/ninja
-	"
-
-# Host dependencies for converting sparse into raw images (simg2img).
-RDEPEND="${RDEPEND}
-	brillo-base/libsparse
-	"
-
-# Host dependencies for building Chromium code (libmojo)
-RDEPEND="${RDEPEND}
-	dev-python/ply
-	dev-util/gn
-	"
-
-# Uninstall these packages.
-RDEPEND="${RDEPEND}
-	!net-misc/dhcpcd
-	"
-
-# Host dependencies for building/testing factory software
-RDEPEND="${RDEPEND}
-	chromeos-base/regions
-	dev-libs/closure-library
-	dev-libs/closure_linter
-	dev-python/autopep8
-	dev-python/django
-	dev-python/enum34
-	dev-python/jsonrpclib
-	dev-python/jsonschema
-	dev-python/python-gnupg
-	dev-python/requests
-	dev-python/sphinx
-	dev-python/twisted
-	!dev-python/twisted-core
-	!dev-python/twisted-web
-	www-servers/nginx
-	"
-
-# Host dependencies for running integration tests
-RDEPEND="${RDEPEND}
-	chromeos-base/tast-cmd
-	chromeos-base/tast-remote-tests-cros
-	"
-
-# Host dependencies for building harfbuzz
-RDEPEND="${RDEPEND}
-	dev-util/ragel
-	"
-
-# Host dependencies for building chromeos-bootimage
-RDEPEND="${RDEPEND}
-	sys-apps/coreboot-utils
-	"
-
-# Host dependencies for building chromeos-firmware-*
-RDEPEND="${RDEPEND}
-	chromeos-base/ec-utils
-	"
-
-# Host dependencies for the chromeos-ec workflow
-RDEPEND="${RDEPEND}
-	dev-libs/libprotobuf-mutator
-	dev-libs/openssl
-	dev-util/unifdef
-	"
-
-# Host dependencies for the AP/EC/GSC firmware release testing workflow
-RDEPEND="${RDEPEND}
-	sys-firmware/fw-engprod-tools
-	"
-
-# Host dependencies for audio topology generation
-RDEPEND="${RDEPEND}
-	media-sound/alsa-utils"
-
-# Host dependency for dev-libs/boost package
-RDEPEND="${RDEPEND}
-	dev-util/boost-build"
-
-# Host dependency for managing SELinux
-RDEPEND="${RDEPEND}
-	chromeos-base/sepolicy-analyze
-	sys-apps/checkpolicy
-	sys-apps/restorecon
-	sys-apps/secilc"
-
-# Host dependencies that are needed for chromite/bin/cros_generate_android_breakpad_symbols
-RDEPEND="${RDEPEND}
-	chromeos-base/android-relocation-packer"
-
-# Dependencies for testing Puppet
-RDEPEND="${RDEPEND}
-	app-admin/puppet
-	dev-lang/ruby"
-
-# Host dependencies for generating and testing update payloads
-RDEPEND="${RDEPEND}
-	chromeos-base/update_payload"
-
-# Needed to compile moblab mobmonitor ui
-RDEPEND="${RDEPEND}
-	net-libs/nodejs"
-
-# Needed to compile img-ddk
-RDEPEND="${RDEPEND}
-	dev-python/clang-python"
-
-# Moblab's new RPC server backend will use grpc
-RDEPEND="${RDEPEND}
-	dev-python/grpcio-tools
-	net-libs/grpc-web"
-
-# Autotest's new RPC server will use grpc
-RDEPEND="${RDEPEND}
-	dev-python/grpcio"
-
-# Needed for unit tests of tast-local-tests-cros
-RDEPEND="${RDEPEND}
-	dev-util/strace"
-
-# Host dependencies for termina_build_image
-RDEPEND="${RDEPEND}
-	app-misc/fdupes"
-
-# Host dependencies that lets us boost to performance governor
-# to speed up builds.  https://crbug.com/1008932
-RDEPEND="${RDEPEND}
-	sys-power/cpupower"
diff --git a/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r188.ebuild b/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r188.ebuild
new file mode 100644
index 0000000..946ca2d
--- /dev/null
+++ b/virtual/target-chromium-os-sdk/target-chromium-os-sdk-1-r188.ebuild
@@ -0,0 +1,530 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List of packages that are needed inside the Chromium OS SDK"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-sdk.
+IUSE=""
+
+# Block the old package to force people to clean up.
+RDEPEND="
+	!chromeos-base/hard-host-depends
+	!virtual/hard-host-depends-bsp
+"
+
+# Basic utilities
+RDEPEND="${RDEPEND}
+	app-arch/bzip2
+	app-arch/cpio
+	app-arch/gcab
+	app-arch/gzip
+	app-arch/p7zip
+	app-arch/tar
+	app-shells/bash
+	net-misc/iputils
+	net-misc/rsync
+	sys-apps/baselayout
+	sys-apps/coreutils
+	sys-apps/diffutils
+	sys-apps/dtc
+	sys-apps/file
+	sys-apps/findutils
+	sys-apps/gawk
+	sys-apps/grep
+	sys-apps/sed
+	sys-apps/shadow
+	sys-apps/texinfo
+	sys-apps/util-linux
+	sys-apps/which
+	sys-devel/autoconf
+	sys-devel/automake:1.10
+	sys-devel/automake:1.11
+	sys-devel/automake:1.15
+	sys-devel/binutils
+	sys-devel/bison
+	sys-devel/flex
+	sys-devel/gcc
+	sys-devel/gnuconfig
+	sys-devel/grit-i18n
+	sys-devel/libtool
+	sys-devel/m4
+	sys-devel/make
+	sys-devel/patch
+	sys-fs/e2fsprogs
+	sys-fs/f2fs-tools
+	sys-libs/ncurses
+	sys-libs/readline
+	sys-libs/zlib
+	sys-process/procps
+	sys-process/psmisc
+	virtual/editor
+	virtual/libc
+	virtual/man
+	virtual/os-headers
+	virtual/package-manager
+	virtual/pager
+	"
+
+# Needed to run setup crossdev, run build scripts, and make a bootable image.
+RDEPEND="${RDEPEND}
+	app-arch/lbzip2
+	app-arch/lz4
+	app-arch/lzop
+	app-arch/pigz
+	app-arch/pixz
+	app-admin/sudo
+	app-crypt/efitools
+	app-crypt/sbsigntools
+	dev-embedded/binman
+	dev-embedded/cbootimage
+	dev-embedded/tegrarcm
+	dev-embedded/u-boot-tools
+	dev-util/ccache
+	media-gfx/pngcrush
+	>=sys-apps/dtc-1.3.0-r5
+	sys-boot/bootstub
+	sys-boot/grub
+	sys-boot/syslinux
+	sys-devel/crossdev
+	sys-fs/dosfstools
+	sys-fs/squashfs-tools
+	sys-fs/mtd-utils
+	"
+
+# Needed to build Android/ARC userland code.
+RDEPEND="${RDEPEND}
+	app-misc/jq
+	sys-devel/aapt
+	sys-devel/arc-toolchain-master
+	sys-devel/arc-toolchain-p
+	sys-devel/arc-toolchain-r
+	sys-devel/dex2oatds
+	"
+
+# Needed to run 'repo selfupdate'
+RDEPEND="${RDEPEND}
+	app-crypt/gnupg
+	"
+
+# Host dependencies for building cross-compiled packages.
+RDEPEND="${RDEPEND}
+	app-admin/eselect-opengl
+	app-admin/eselect-mesa
+	app-arch/cabextract
+	app-arch/makeself
+	>=app-arch/pbzip2-1.1.1-r1
+	app-arch/rpm2targz
+	app-arch/sharutils
+	app-arch/unzip
+	app-crypt/nss
+	app-doc/xmltoman
+	app-emulation/qemu
+	app-emulation/qemu-binfmt-wrapper
+	!app-emulation/qemu-kvm
+	!app-emulation/qemu-user
+	app-text/asciidoc
+	app-text/docbook-xml-dtd:4.2
+	app-text/docbook-xml-dtd:4.5
+	app-text/docbook-xsl-stylesheets
+	app-text/texi2html
+	app-text/xmlto
+	chromeos-base/google-breakpad
+	chromeos-base/chromeos-base
+	>=chromeos-base/chromeos-config-host-0.0.2-r491
+	chromeos-base/chromeos-installer
+	chromeos-base/chromite-sdk
+	chromeos-base/cros-devutils[cros_host]
+	chromeos-base/cros-testutils
+	chromeos-base/ec-devutils
+	chromeos-base/minijail
+	dev-db/m17n-contrib
+	dev-db/m17n-db
+	dev-go/protobuf
+	dev-lang/closure-compiler-bin
+	dev-lang/nasm
+	dev-lang/python:2.7
+	dev-lang/python:3.6
+	dev-lang/swig
+	dev-lang/tcl
+	dev-lang/yasm
+	dev-libs/dbus-glib
+	dev-libs/flatbuffers
+	>=dev-libs/glib-2.26.1
+	net-libs/grpc
+	dev-libs/libgcrypt
+	dev-libs/libxslt
+	dev-libs/libyaml
+	dev-libs/m17n-lib
+	dev-libs/protobuf
+	dev-libs/protobuf-c
+	dev-libs/wayland
+	dev-python/cffi
+	dev-python/cherrypy
+	dev-python/ctypesgen
+	dev-python/dbus-python
+	dev-python/dpkt
+	dev-python/ecdsa
+	dev-python/future
+	dev-python/imaging
+	dev-python/intelhex
+	dev-python/m2crypto
+	dev-python/mako
+	dev-python/netifaces
+	dev-python/pexpect
+	dev-python/pillow
+	dev-python/psutil
+	dev-python/py
+	dev-python/pycairo
+	dev-python/pycparser
+	dev-python/pygobject
+	dev-python/pyopenssl
+	dev-python/pytest
+	dev-python/python-evdev
+	dev-python/pyudev
+	dev-python/pyusb
+	dev-python/setproctitle
+	!dev-python/socksipy
+	dev-python/tempita
+	dev-python/ws4py
+	dev-util/bazel
+	dev-util/cmake
+	dev-util/dwarves
+	dev-util/gob
+	dev-util/gdbus-codegen
+	dev-util/gperf
+	dev-util/gtk-doc
+	dev-util/hdctools
+	>=dev-util/gtk-doc-am-1.13
+	>=dev-util/intltool-0.30
+	dev-util/scons
+	dev-util/vulkan-headers
+	>=dev-vcs/git-1.7.2
+	>=media-libs/freetype-2.2.1
+	>=media-libs/lcms-2.6:2
+	net-fs/sshfs
+	net-libs/rpcsvc-proto
+	net-misc/gsutil
+	sys-apps/usbutils
+	!sys-apps/nih-dbus-tool
+	sys-devel/autofdo
+	sys-devel/bc
+	>=sys-libs/glibc-2.27
+	sys-libs/libcxxabi
+	sys-libs/libcxx
+	sys-libs/llvm-libunwind
+	virtual/udev
+	sys-libs/libnih
+	sys-power/iasl
+	virtual/modutils
+	x11-apps/mkfontscale
+	x11-apps/xcursorgen
+	x11-apps/xkbcomp
+	>=x11-misc/util-macros-1.2
+	"
+
+# Various fonts are needed in order to generate messages for the
+# chromeos-initramfs package.
+RDEPEND="${RDEPEND}
+	chromeos-base/chromeos-fonts
+	"
+
+# Host dependencies for bitmap block (chromeos-bmpblk) to to render messages.
+RDEPEND="${RDEPEND}
+	gnome-base/librsvg
+	"
+
+# Host dependencies for building chromium.
+# Intermediate executables built for the host, then run to generate data baked
+# into chromium, need these packages to be present in the host environment in
+# order to successfully build.
+# See: http://codereview.chromium.org/7550002/
+RDEPEND="${RDEPEND}
+	dev-libs/atk
+	dev-libs/glib
+	media-libs/fontconfig
+	media-libs/freetype
+	x11-libs/cairo
+	x11-libs/libX11
+	x11-libs/libXi
+	x11-libs/libXrandr
+	x11-libs/libXtst
+	x11-libs/pango
+	"
+
+# Host dependencies that create usernames/groups we need to pull over to target.
+RDEPEND="${RDEPEND}
+	sys-apps/dbus
+	"
+
+# Host dependencies that are needed by mod_image_for_test.
+RDEPEND="${RDEPEND}
+	sys-process/lsof
+	"
+
+# Useful utilities for developers.
+RDEPEND="${RDEPEND}
+	app-arch/zip
+	app-editors/nano
+	app-editors/qemacs
+	app-editors/vim
+	app-portage/eclass-manpages
+	app-portage/gentoolkit
+	app-portage/portage-utils
+	app-shells/bash-completion
+	dev-go/go-tools
+	dev-go/golint
+	dev-lang/go
+	dev-python/ipython
+	dev-util/codespell
+	dev-util/patchutils
+	dev-util/perf
+	dev-util/shfmt
+	net-analyzer/netperf
+	sys-apps/less
+	sys-apps/man-pages
+	sys-apps/pv
+	sys-devel/smatch
+	"
+
+# Host dependencies used by chromite on build servers
+RDEPEND="${RDEPEND}
+	dev-python/mysqlclient
+	dev-python/sqlalchemy
+	dev-python/pyparsing
+	dev-python/virtualenv
+	"
+
+# Host dependencies that are needed for unit tests
+RDEPEND="${RDEPEND}
+	x11-misc/xkeyboard-config
+	"
+
+# Host dependencies that are needed to build the autotest server components.
+RDEPEND="${RDEPEND}
+	dev-util/google-web-toolkit
+	"
+
+# Host dependencies that are needed for autotests.
+RDEPEND="${RDEPEND}
+	dev-python/btsocket
+	dev-python/selenium
+	sys-apps/iproute2
+	sys-apps/net-tools
+	"
+
+# Host dependencies that are needed for media applications (ex, mplayer) used in
+# factory.
+RDEPEND="${RDEPEND}
+	media-video/ffmpeg
+	"
+
+# Host dependencies that are needed to create and sign images
+RDEPEND="${RDEPEND}
+	>=chromeos-base/vboot_reference-1.0-r174
+	chromeos-base/verity
+	!dev-python/ahocorasick
+	dev-python/pyahocorasick
+	sys-fs/libfat
+	"
+
+# Host dependencies that are needed for cros_generate_update_payload.
+RDEPEND="${RDEPEND}
+	chromeos-base/update_engine
+	sys-fs/e2tools
+	"
+
+# Host dependencies to run unit tests within the chroot
+RDEPEND="${RDEPEND}
+	dev-cpp/gflags
+	dev-go/mock
+	dev-python/mock
+	dev-python/mox
+	dev-python/unittest2
+	"
+# Host dependencies to run autotest's unit tests within the chroot.
+RDEPEND="${RDEPEND}
+	dev-python/httplib2
+	dev-python/pyshark
+	dev-python/python-dateutil
+	dev-python/six
+	"
+
+# Host dependencies for running pylint within the chroot
+RDEPEND="${RDEPEND}
+	dev-python/pylint
+	"
+
+# Host dependencies to scp binaries from the binary component server
+RDEPEND="${RDEPEND}
+	net-misc/openssh
+	net-misc/socat
+	net-misc/wget
+	"
+
+# Host dependencies for HWID processing
+RDEPEND="${RDEPEND}
+	dev-python/pyyaml
+	"
+
+# Tools for working with compiler generated profile information
+# (such as coverage analysis in common.mk)
+RDEPEND="${RDEPEND}
+	dev-util/lcov
+	"
+
+# Host dependencies for building Platform2
+RDEPEND="${RDEPEND}
+	chromeos-base/chromeos-dbus-bindings
+	dev-util/meson
+	dev-util/ninja
+	"
+
+# Host dependencies for converting sparse into raw images (simg2img).
+RDEPEND="${RDEPEND}
+	brillo-base/libsparse
+	"
+
+# Host dependencies for building Chromium code (libmojo)
+RDEPEND="${RDEPEND}
+	dev-python/ply
+	dev-util/gn
+	"
+
+# Host dependencies for building
+RDEPEND="${RDEPEND}
+	dev-util/tclint
+	"
+
+# Uninstall these packages.
+RDEPEND="${RDEPEND}
+	!net-misc/dhcpcd
+	"
+
+# Host dependencies for building/testing factory software
+RDEPEND="${RDEPEND}
+	dev-libs/closure-library
+	dev-libs/closure_linter
+	dev-python/autopep8
+	dev-python/django
+	dev-python/enum34
+	dev-python/jsonrpclib
+	dev-python/jsonschema
+	dev-python/python-gnupg
+	dev-python/requests
+	dev-python/sphinx
+	dev-python/twisted
+	!dev-python/twisted-core
+	!dev-python/twisted-web
+	www-servers/nginx
+	"
+
+# Host dependencies for running integration tests
+RDEPEND="${RDEPEND}
+	chromeos-base/tast-cmd
+	chromeos-base/tast-remote-tests-cros
+	"
+
+# Host dependencies for building harfbuzz
+RDEPEND="${RDEPEND}
+	dev-util/ragel
+	"
+
+# Host dependencies for building chromeos-bootimage
+RDEPEND="${RDEPEND}
+	sys-apps/coreboot-utils
+	"
+
+# Host dependencies for building chromeos-firmware-*
+RDEPEND="${RDEPEND}
+	chromeos-base/ec-utils
+	"
+
+# Host dependencies for the chromeos-ec workflow
+RDEPEND="${RDEPEND}
+	dev-libs/libprotobuf-mutator
+	dev-libs/openssl
+	dev-util/unifdef
+	"
+
+# Host dependencies for the AP/EC/GSC firmware release testing workflow
+RDEPEND="${RDEPEND}
+	sys-firmware/fw-engprod-tools
+	"
+
+# Host dependencies for audio topology generation
+RDEPEND="${RDEPEND}
+	media-sound/alsa-utils"
+
+# Host dependency for dev-libs/boost package
+RDEPEND="${RDEPEND}
+	dev-util/boost-build"
+
+# Host dependency for managing SELinux
+RDEPEND="${RDEPEND}
+	chromeos-base/sepolicy-analyze
+	sys-apps/checkpolicy
+	sys-apps/restorecon
+	sys-apps/secilc
+	sys-apps/selinux-python"
+
+# Host dependencies that are needed for chromite/bin/cros_generate_android_breakpad_symbols
+RDEPEND="${RDEPEND}
+	chromeos-base/android-relocation-packer"
+
+# Host dependencies for generating and testing update payloads
+RDEPEND="${RDEPEND}
+	chromeos-base/update_payload"
+
+# Needed to compile moblab mobmonitor ui
+RDEPEND="${RDEPEND}
+	net-libs/nodejs"
+
+# Needed to compile img-ddk
+RDEPEND="${RDEPEND}
+	dev-python/clang-python"
+
+# Moblab's new RPC server backend will use grpc
+RDEPEND="${RDEPEND}
+	dev-python/grpcio-tools
+	net-libs/grpc-web"
+
+# Autotest's new RPC server will use grpc
+RDEPEND="${RDEPEND}
+	dev-python/grpcio"
+
+# Needed for unit tests of tast-local-tests-cros
+RDEPEND="${RDEPEND}
+	dev-util/strace"
+
+# Host dependencies for termina_build_image
+RDEPEND="${RDEPEND}
+	app-misc/fdupes"
+
+# Host dependencies that lets us boost to performance governor
+# to speed up builds.  https://crbug.com/1008932
+RDEPEND="${RDEPEND}
+	sys-power/cpupower"
+
+# CTS P depends on Java 8 or 9, CTS R depends on Java 9 or later.
+# Include android-sdk to contain both JDK8 and JDK11 in the chroot.
+RDEPEND="${RDEPEND}
+	chromeos-base/android-sdk"
+
+# Needed to optimise Android APKs shipped in demo_mode_resources.
+RDEPEND="${RDEPEND}
+	sys-devel/zipalign"
diff --git a/virtual/target-chromium-os-sdk/target-chromium-os-sdk-9999.ebuild b/virtual/target-chromium-os-sdk/target-chromium-os-sdk-9999.ebuild
index 194b815..5486760 100644
--- a/virtual/target-chromium-os-sdk/target-chromium-os-sdk-9999.ebuild
+++ b/virtual/target-chromium-os-sdk/target-chromium-os-sdk-9999.ebuild
@@ -29,6 +29,7 @@
 RDEPEND="${RDEPEND}
 	app-arch/bzip2
 	app-arch/cpio
+	app-arch/gcab
 	app-arch/gzip
 	app-arch/p7zip
 	app-arch/tar
@@ -87,6 +88,7 @@
 	app-admin/sudo
 	app-crypt/efitools
 	app-crypt/sbsigntools
+	dev-embedded/binman
 	dev-embedded/cbootimage
 	dev-embedded/tegrarcm
 	dev-embedded/u-boot-tools
@@ -106,7 +108,6 @@
 RDEPEND="${RDEPEND}
 	app-misc/jq
 	sys-devel/aapt
-	sys-devel/arc-cache-builder
 	sys-devel/arc-toolchain-master
 	sys-devel/arc-toolchain-p
 	sys-devel/arc-toolchain-r
@@ -228,7 +229,7 @@
 	sys-libs/libnih
 	sys-power/iasl
 	virtual/modutils
-	x11-apps/mkfontdir
+	x11-apps/mkfontscale
 	x11-apps/xcursorgen
 	x11-apps/xkbcomp
 	>=x11-misc/util-macros-1.2
@@ -402,6 +403,11 @@
 	dev-util/gn
 	"
 
+# Host dependencies for building
+RDEPEND="${RDEPEND}
+	dev-util/tclint
+	"
+
 # Uninstall these packages.
 RDEPEND="${RDEPEND}
 	!net-misc/dhcpcd
@@ -409,7 +415,6 @@
 
 # Host dependencies for building/testing factory software
 RDEPEND="${RDEPEND}
-	chromeos-base/regions
 	dev-libs/closure-library
 	dev-libs/closure_linter
 	dev-python/autopep8
@@ -472,17 +477,13 @@
 	chromeos-base/sepolicy-analyze
 	sys-apps/checkpolicy
 	sys-apps/restorecon
-	sys-apps/secilc"
+	sys-apps/secilc
+	sys-apps/selinux-python"
 
 # Host dependencies that are needed for chromite/bin/cros_generate_android_breakpad_symbols
 RDEPEND="${RDEPEND}
 	chromeos-base/android-relocation-packer"
 
-# Dependencies for testing Puppet
-RDEPEND="${RDEPEND}
-	app-admin/puppet
-	dev-lang/ruby"
-
 # Host dependencies for generating and testing update payloads
 RDEPEND="${RDEPEND}
 	chromeos-base/update_payload"
@@ -516,3 +517,12 @@
 # to speed up builds.  https://crbug.com/1008932
 RDEPEND="${RDEPEND}
 	sys-power/cpupower"
+
+# CTS P depends on Java 8 or 9, CTS R depends on Java 9 or later.
+# Include android-sdk to contain both JDK8 and JDK11 in the chroot.
+RDEPEND="${RDEPEND}
+	chromeos-base/android-sdk"
+
+# Needed to optimise Android APKs shipped in demo_mode_resources.
+RDEPEND="${RDEPEND}
+	sys-devel/zipalign"
diff --git a/virtual/target-chromium-os-test/target-chromium-os-test-1-r118.ebuild b/virtual/target-chromium-os-test/target-chromium-os-test-1-r118.ebuild
deleted file mode 100644
index a888152..0000000
--- a/virtual/target-chromium-os-test/target-chromium-os-test-1-r118.ebuild
+++ /dev/null
@@ -1,268 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="List of packages that are needed inside the Chromium OS test image;
-Note: test images are a superset of dev images."
-HOMEPAGE="https://dev.chromium.org/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-test.
-IUSE="
-	arc-camera3
-	biod
-	-chromeless_tests
-	cheets
-	chromeless_tty
-	cr50_onboard
-	+cras
-	cros_ec
-	cros_embedded
-	dlc
-	kvm_host
-	hammerd
-	ml_service
-	opengl
-	opengles
-	p2p
-	+shill
-	+tpm
-	tpm2
-	unibuild
-	vaapi
-	wifi_hostap_test
-	wifi_testbed_ap
-	+wired_8021x
-"
-
-# Packages required to support autotest images.  Dependencies here
-# are for packages that must be present on a local device and that
-# are not downloaded by the autotest server.  This includes both
-# packages relied on by the server, as well as packages relied on by
-# specific tests.
-#
-# This package is not meant to capture tools useful for test debug;
-# use the chromeos-dev package for that purpose.
-#
-# Note that some packages used by autotest are actually built by the
-# autotest package and downloaded by the server, regardless of
-# whether the package is present on the target device; those
-# packages aren't listed here.
-#
-# Developers should be aware that packages installed by this ebuild
-# are rooted in /usr/local.  This means that libraries are installed
-# in /usr/local/lib, executables in /usr/local/bin, etc.
-#
-# TODO(jrbarnette):  It's not known definitively that the list
-# below contains no unneeded dependencies.  More work is needed to
-# determine for sure that every package listed is actually used.
-
-
-################################################################################
-#
-# CROS_COMMON_* : Dependencies common to all CrOS flavors (embedded, regular)
-#
-################################################################################
-
-CROS_COMMON_RDEPEND="
-	tpm? (
-		app-crypt/tpm-tools
-		chromeos-base/hwsec-test-utils
-		chromeos-base/tpm_softclear_utils
-	)
-	tpm2? (
-		chromeos-base/hwsec-test-utils
-		chromeos-base/tpm_softclear_utils
-	)
-	chromeos-base/chromeos-test-root
-	chromeos-base/ec-utils
-	chromeos-base/ec-utils-test
-	chromeos-base/factory-deps
-	biod? ( virtual/chromeos-fpmcu-test )
-	hammerd? ( chromeos-base/hammerd-test-utils )
-	ml_service? ( chromeos-base/ml-cmdline )
-	chromeos-base/recover-duts
-	chromeos-base/tast-local-test-runner
-	chromeos-base/tast-local-tests
-	chromeos-base/tast-use-flags
-	chromeos-base/verity
-	chromeos-base/vpd
-	cros_ec? ( chromeos-base/ec-devutils )
-	!chromeless_tty? (
-		!chromeless_tests? (
-			>=dev-cpp/gflags-2.0
-		)
-	)
-	wifi_testbed_ap? (
-		dev-python/btsocket
-	)
-	dev-lang/python:2.7
-	dev-lang/python:3.6
-	dev-libs/opensc
-	p2p? ( dev-python/dpkt )
-	cr50_onboard? ( dev-util/u2f-ref-code )
-	net-misc/rsync
-	sys-apps/memtester
-	virtual/autotest-capability
-	virtual/chromeos-bsp-test
-	kvm_host? (
-		chromeos-base/crostini-pin
-		chromeos-base/termina-pin
-	)
-"
-
-# Packages needed by FAFT.
-CROS_COMMON_RDEPEND+="
-	sys-apps/hdparm
-	sys-apps/mmc-utils
-"
-
-################################################################################
-#
-# CROS_* : Dependencies for "regular" CrOS devices (coreutils, etc.)
-#
-################################################################################
-CROS_X86_RDEPEND="
-	app-benchmarks/sysbench
-	sys-apps/pciutils
-	sys-power/iasl
-	vaapi? ( media-gfx/vadumpcaps media-video/libva-utils )
-	x11-misc/read-edid
-"
-
-CROS_RDEPEND="
-	x86? ( ${CROS_X86_RDEPEND} )
-	amd64? ( ${CROS_X86_RDEPEND} )
-"
-
-CROS_RDEPEND="${CROS_RDEPEND}
-	app-admin/sudo
-	app-arch/gzip
-	app-arch/tar
-	app-benchmarks/blktests
-	app-benchmarks/blogbench
-	app-benchmarks/lmbench
-	app-benchmarks/microbenchmarks
-	app-benchmarks/pjdfstest
-	app-benchmarks/xfstests
-	app-misc/ckermit
-	opengles? ( app-misc/eglinfo )
-	app-misc/tmux
-	app-misc/utouch-evemu
-	app-mobilephone/dfu-util
-	chromeos-base/autotest-client
-	cras? ( chromeos-base/audiotest )
-	chromeos-base/avtest_label_detect
-	chromeos-base/chrome-binary-tests
-	chromeos-base/cros-camera-tool
-	chromeos-base/cros-config-test
-	!chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) )
-	chromeos-base/factory-mini
-	chromeos-base/glbench
-	chromeos-base/graphics-utils-python
-	chromeos-base/libvda-gpu-tests
-	chromeos-base/modem-diagnostics
-	chromeos-base/policy_utils
-	chromeos-base/protofiles
-	chromeos-base/pywalt
-	!chromeless_tty? ( chromeos-base/screenshot )
-	chromeos-base/secure-wipe
-	shill? (
-		chromeos-base/shill-test-scripts
-		wired_8021x? ( net-wireless/hostapd )
-	)
-	!chromeless_tests? ( chromeos-base/telemetry )
-	chromeos-base/toolchain-tests
-	dev-embedded/dfu-programmer
-	dev-go/syzkaller
-	dev-libs/re2
-	dev-python/protobuf-python
-	dev-python/btsocket
-	dev-python/contextlib2
-	dev-python/dbus-python
-	dev-python/dpkt
-	dev-python/httplib2
-	dev-python/imaging
-	dev-python/jsonrpclib
-	dev-python/mkvparse
-	dev-python/netifaces
-	dev-python/pygobject
-	dev-python/pyserial
-	dev-python/pytest
-	dev-python/python-evdev
-	dev-python/python-uinput
-	dev-python/pyudev
-	dev-python/pyxattr
-	dev-python/pyyaml
-	dev-python/selenium
-	dev-python/setproctitle
-	dev-python/setuptools
-	dev-python/ws4py
-	dev-util/stressapptest
-	dev-util/trace-cmd
-	dlc? ( sys-fs/squashfs-tools )
-	games-util/joystick
-	media-gfx/imagemagick[jpeg,png,svg,tiff]
-	media-gfx/perceptualdiff
-	media-gfx/zbar
-	arc-camera3? ( media-libs/cros-camera-libcamera_connector_test )
-	arc-camera3? ( media-libs/cros-camera-libjea_test )
-	arc-camera3? ( media-libs/cros-camera-test )
-	media-libs/cros-camera-v4l2_test
-	media-libs/libexif
-	media-libs/libvpx
-	media-libs/opencv
-	!chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) )
-	media-libs/tiff
-	opengles? ( media-libs/waffle )
-	opengl? ( media-libs/waffle )
-	media-sound/sox
-	net-analyzer/netperf
-	net-dialup/minicom
-	net-dns/dnsmasq
-	net-misc/dhcp
-	net-misc/iperf:2
-	net-misc/iputils
-	net-misc/openssh
-	net-misc/radvd
-	wifi_hostap_test? ( net-wireless/hostap-test )
-	sci-geosciences/gpsd
-	sys-apps/coreutils
-	sys-apps/dtc
-	sys-apps/ethtool
-	sys-apps/file
-	sys-apps/findutils
-	sys-apps/kbd
-	sys-apps/shadow
-	sys-devel/binutils
-	sys-process/iotop
-	sys-process/procps
-	sys-process/psmisc
-	sys-process/time
-	x11-libs/libdrm
-	"
-
-################################################################################
-# Assemble the final RDEPEND and DEPEND variables for portage
-################################################################################
-RDEPEND="${CROS_COMMON_RDEPEND}
-	!cros_embedded? ( ${CROS_RDEPEND} )
-"
-
-# Packages that are only installed into the sysroot and are needed for running
-# unit tests
-DEPEND="
-	chromeos-base/chromite
-"
diff --git a/virtual/target-chromium-os-test/target-chromium-os-test-1-r128.ebuild b/virtual/target-chromium-os-test/target-chromium-os-test-1-r128.ebuild
new file mode 100644
index 0000000..c7eb486
--- /dev/null
+++ b/virtual/target-chromium-os-test/target-chromium-os-test-1-r128.ebuild
@@ -0,0 +1,284 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List of packages that are needed inside the Chromium OS test image;
+Note: test images are a superset of dev images."
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os-test.
+IUSE="
+	arc-camera3
+	biod
+	cdm_factory_daemon
+	-chromeless_tests
+	cheets
+	chromeless_tty
+	cr50_onboard
+	+cras
+	cros_ec
+	cros_embedded
+	dlc
+	kvm_host
+	hammerd
+	ml_benchmark_drivers
+	ml_service
+	nnapi
+	opengl
+	opengles
+	p2p
+	+perfetto
+	scanner
+	+shill
+	+tpm
+	tpm2
+	unibuild
+	vaapi
+	wifi_hostap_test
+	wifi_testbed_ap
+	+wired_8021x
+"
+
+# Packages required to support autotest images.  Dependencies here
+# are for packages that must be present on a local device and that
+# are not downloaded by the autotest server.  This includes both
+# packages relied on by the server, as well as packages relied on by
+# specific tests.
+#
+# This package is not meant to capture tools useful for test debug;
+# use the chromeos-dev package for that purpose.
+#
+# Note that some packages used by autotest are actually built by the
+# autotest package and downloaded by the server, regardless of
+# whether the package is present on the target device; those
+# packages aren't listed here.
+#
+# Developers should be aware that packages installed by this ebuild
+# are rooted in /usr/local.  This means that libraries are installed
+# in /usr/local/lib, executables in /usr/local/bin, etc.
+#
+# TODO(jrbarnette):  It's not known definitively that the list
+# below contains no unneeded dependencies.  More work is needed to
+# determine for sure that every package listed is actually used.
+
+
+################################################################################
+#
+# CROS_COMMON_* : Dependencies common to all CrOS flavors (embedded, regular)
+#
+################################################################################
+
+CROS_COMMON_RDEPEND="
+	tpm? (
+		app-crypt/tpm-tools
+		chromeos-base/hwsec-test-utils
+		chromeos-base/tpm_softclear_utils
+	)
+	tpm2? (
+		chromeos-base/hwsec-test-utils
+		chromeos-base/tpm_softclear_utils
+	)
+	chromeos-base/chromeos-test-root
+	chromeos-base/ec-utils
+	chromeos-base/ec-utils-test
+	chromeos-base/factory-deps
+	biod? (
+		virtual/chromeos-fpmcu-test
+		chromeos-base/chromeos-fpmcu-unittests
+	)
+	hammerd? ( chromeos-base/hammerd-test-utils )
+	scanner? (
+		chromeos-base/lorgnette_cli
+		chromeos-base/sane-backends-test
+	)
+	ml_benchmark_drivers? ( chromeos-base/ml-benchmark-drivers )
+	ml_service? ( chromeos-base/ml-cmdline )
+	nnapi? ( chromeos-base/ml-test-assets )
+	chromeos-base/recover-duts
+	chromeos-base/tast-local-test-runner
+	chromeos-base/tast-local-tests
+	chromeos-base/tast-use-flags
+	chromeos-base/verity
+	chromeos-base/vpd
+	cros_ec? ( chromeos-base/ec-devutils )
+	!chromeless_tty? (
+		!chromeless_tests? (
+			>=dev-cpp/gflags-2.0
+		)
+	)
+	wifi_testbed_ap? (
+		dev-python/btsocket
+	)
+	dev-lang/python:2.7
+	dev-lang/python:3.6
+	dev-libs/opensc
+	p2p? ( dev-python/dpkt )
+	perfetto? ( chromeos-base/perfetto )
+	cr50_onboard? ( dev-util/u2f-ref-code )
+	net-misc/rsync
+	sys-apps/memtester
+	virtual/autotest-capability
+	virtual/chromeos-bsp-test
+	kvm_host? (
+		chromeos-base/crostini-pin
+		chromeos-base/termina-pin
+	)
+"
+
+# Packages needed by FAFT.
+CROS_COMMON_RDEPEND+="
+	sys-apps/hdparm
+	sys-apps/mmc-utils
+"
+
+################################################################################
+#
+# CROS_* : Dependencies for "regular" CrOS devices (coreutils, etc.)
+#
+################################################################################
+CROS_X86_RDEPEND="
+	app-benchmarks/sysbench
+	sys-apps/pciutils
+	sys-power/iasl
+	vaapi? ( media-gfx/vadumpcaps media-video/libva-utils )
+	x11-misc/read-edid
+"
+
+CROS_RDEPEND="
+	x86? ( ${CROS_X86_RDEPEND} )
+	amd64? ( ${CROS_X86_RDEPEND} )
+"
+
+CROS_RDEPEND="${CROS_RDEPEND}
+	app-admin/sudo
+	app-arch/gzip
+	app-arch/tar
+	app-benchmarks/blktests
+	app-benchmarks/blogbench
+	app-benchmarks/lmbench
+	app-benchmarks/microbenchmarks
+	app-benchmarks/pjdfstest
+	app-benchmarks/xfstests
+	app-misc/ckermit
+	opengles? ( app-misc/eglinfo )
+	app-misc/tmux
+	app-misc/utouch-evemu
+	app-mobilephone/dfu-util
+	chromeos-base/autotest-client
+	cras? ( chromeos-base/audiotest )
+	chromeos-base/avtest_label_detect
+	cdm_factory_daemon? ( chromeos-base/cdm-oemcrypto-hw-test )
+	chromeos-base/chrome-binary-tests
+	chromeos-base/cros-camera-tool
+	chromeos-base/cros-config-test
+	!chromeless_tty? ( !chromeless_tests? ( chromeos-base/drm-tests ) )
+	chromeos-base/factory-mini
+	chromeos-base/glbench
+	chromeos-base/graphics-utils-python
+	chromeos-base/libvda-gpu-tests
+	chromeos-base/modem-diagnostics
+	chromeos-base/policy_utils
+	chromeos-base/protofiles
+	chromeos-base/pywalt
+	!chromeless_tty? ( chromeos-base/screenshot )
+	chromeos-base/secure-wipe
+	shill? (
+		chromeos-base/shill-test-scripts
+		wired_8021x? ( net-wireless/hostapd )
+	)
+	!chromeless_tests? ( chromeos-base/telemetry )
+	chromeos-base/toolchain-tests
+	dev-embedded/dfu-programmer
+	dev-go/syzkaller
+	dev-libs/re2
+	dev-python/protobuf-python
+	dev-python/btsocket
+	dev-python/contextlib2
+	dev-python/dbus-python
+	dev-python/dpkt
+	dev-python/httplib2
+	dev-python/imaging
+	dev-python/jsonrpclib
+	dev-python/mkvparse
+	dev-python/netifaces
+	dev-python/pygobject
+	dev-python/pyserial
+	dev-python/pytest
+	dev-python/python-evdev
+	dev-python/python-uinput
+	dev-python/pyudev
+	dev-python/pyxattr
+	dev-python/pyyaml
+	dev-python/selenium
+	dev-python/setproctitle
+	dev-python/setuptools
+	dev-python/ws4py
+	dev-util/stressapptest
+	dev-util/trace-cmd
+	dlc? ( sys-fs/squashfs-tools )
+	games-util/joystick
+	media-gfx/imagemagick[jpeg,png,svg,tiff]
+	media-gfx/perceptualdiff
+	media-gfx/zbar
+	arc-camera3? ( media-libs/cros-camera-libcamera_connector_test )
+	arc-camera3? ( media-libs/cros-camera-libjea_test )
+	arc-camera3? ( media-libs/cros-camera-test )
+	media-libs/cros-camera-v4l2_test
+	media-libs/libexif
+	media-libs/libvpx
+	media-libs/opencv
+	!chromeless_tty? ( !chromeless_tests? ( media-gfx/deqp ) )
+	media-libs/tiff
+	opengles? ( media-libs/waffle )
+	opengl? ( media-libs/waffle )
+	media-sound/sox
+	net-analyzer/netperf
+	net-dialup/minicom
+	net-dns/dnsmasq
+	net-misc/dhcp
+	net-misc/iperf:2
+	net-misc/iputils
+	net-misc/openssh
+	net-misc/radvd
+	wifi_hostap_test? ( net-wireless/hostap-test )
+	sci-geosciences/gpsd
+	sys-apps/coreutils
+	sys-apps/dtc
+	sys-apps/ethtool
+	sys-apps/file
+	sys-apps/findutils
+	sys-apps/kbd
+	sys-apps/shadow
+	sys-devel/binutils
+	sys-process/iotop
+	sys-process/procps
+	sys-process/psmisc
+	sys-process/time
+	x11-libs/libdrm
+	"
+
+################################################################################
+# Assemble the final RDEPEND and DEPEND variables for portage
+################################################################################
+RDEPEND="${CROS_COMMON_RDEPEND}
+	!cros_embedded? ( ${CROS_RDEPEND} )
+"
+
+# Packages that are only installed into the sysroot and are needed for running
+# unit tests
+DEPEND="
+	chromeos-base/chromite
+"
diff --git a/virtual/target-chromium-os-test/target-chromium-os-test-9999.ebuild b/virtual/target-chromium-os-test/target-chromium-os-test-9999.ebuild
index 62398c4..2a78455 100644
--- a/virtual/target-chromium-os-test/target-chromium-os-test-9999.ebuild
+++ b/virtual/target-chromium-os-test/target-chromium-os-test-9999.ebuild
@@ -21,6 +21,7 @@
 IUSE="
 	arc-camera3
 	biod
+	cdm_factory_daemon
 	-chromeless_tests
 	cheets
 	chromeless_tty
@@ -31,10 +32,14 @@
 	dlc
 	kvm_host
 	hammerd
+	ml_benchmark_drivers
 	ml_service
+	nnapi
 	opengl
 	opengles
 	p2p
+	+perfetto
+	scanner
 	+shill
 	+tpm
 	tpm2
@@ -88,9 +93,18 @@
 	chromeos-base/ec-utils
 	chromeos-base/ec-utils-test
 	chromeos-base/factory-deps
-	biod? ( virtual/chromeos-fpmcu-test )
+	biod? (
+		virtual/chromeos-fpmcu-test
+		chromeos-base/chromeos-fpmcu-unittests
+	)
 	hammerd? ( chromeos-base/hammerd-test-utils )
+	scanner? (
+		chromeos-base/lorgnette_cli
+		chromeos-base/sane-backends-test
+	)
+	ml_benchmark_drivers? ( chromeos-base/ml-benchmark-drivers )
 	ml_service? ( chromeos-base/ml-cmdline )
+	nnapi? ( chromeos-base/ml-test-assets )
 	chromeos-base/recover-duts
 	chromeos-base/tast-local-test-runner
 	chromeos-base/tast-local-tests
@@ -110,6 +124,7 @@
 	dev-lang/python:3.6
 	dev-libs/opensc
 	p2p? ( dev-python/dpkt )
+	perfetto? ( chromeos-base/perfetto )
 	cr50_onboard? ( dev-util/u2f-ref-code )
 	net-misc/rsync
 	sys-apps/memtester
@@ -163,6 +178,7 @@
 	chromeos-base/autotest-client
 	cras? ( chromeos-base/audiotest )
 	chromeos-base/avtest_label_detect
+	cdm_factory_daemon? ( chromeos-base/cdm-oemcrypto-hw-test )
 	chromeos-base/chrome-binary-tests
 	chromeos-base/cros-camera-tool
 	chromeos-base/cros-config-test
diff --git a/virtual/target-chromium-os/metadata.xml b/virtual/target-chromium-os/metadata.xml
index 5518d79..c5db02f 100644
--- a/virtual/target-chromium-os/metadata.xml
+++ b/virtual/target-chromium-os/metadata.xml
@@ -15,6 +15,7 @@
 	<flag name='compupdates'>Enable component updates.</flag>
 	<flag name='cros_ec'>Enables CrOS Embedded Controller.</flag>
 	<flag name='gdmwimax'>Enables WiMax dependencies.</flag>
+	<flag name='iioservice'>Enable Chrome OS IIO sensor service daemon.</flag>
 	<flag name='kerberos_daemon'>Enable Chrome OS Kerberos system daemon</flag>
 	<flag name='opengles'>Enables OpenGL ES.</flag>
 	<flag name='smbprovider'>Enable SMB file share service.</flag>
diff --git a/virtual/target-chromium-os/target-chromium-os-1-r140.ebuild b/virtual/target-chromium-os/target-chromium-os-1-r140.ebuild
deleted file mode 100644
index 15942ec..0000000
--- a/virtual/target-chromium-os/target-chromium-os-1-r140.ebuild
+++ /dev/null
@@ -1,316 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="7"
-
-# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
-# the canonical empty project.
-CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
-CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
-CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
-CROS_WORKON_LOCALNAME="../platform/empty-project"
-
-inherit cros-workon
-
-DESCRIPTION="List of packages that are needed inside the Chromium OS base (release)"
-HOMEPAGE="https://dev.chromium.org/"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os instead.
-IUSE="
-	arc-camera1
-	arc-camera3
-	biod
-	bluetooth
-	bootchart
-	buffet
-	cellular
-	compupdates
-	containers
-	cr50_onboard
-	+cras
-	+crash_reporting
-	+cros_disks
-	cros_embedded
-	cups
-	+debugd
-	diagnostics
-	dlc
-	dlc_test
-	dptf
-	eclog
-	+fonts
-	fuzzer
-	fwupd
-	hammerd
-	ime
-	input_devices_evdev
-	intel_lpe
-	iwlwifi_rescan
-	kerberos_daemon
-	kernel-3_8
-	kvm_host
-	media_perception
-	memd
-	mist
-	modemfwd
-	ml_service
-	mtd
-	+network_time
-	nfc
-	pam
-	postscript
-	+power_management
-	+profile
-	+readahead
-	scanner
-	selinux
-	+shill
-	smbprovider
-	+syslog
-	+system_locales
-	system_proxy
-	systemd
-	touchview
-	+tpm
-	-tpm2
-	+trim_supported
-	usb_bouncer
-	usbguard
-	+vpn
-	watchdog
-"
-
-REQUIRED_USE="
-	cellular? ( shill )
-	modemfwd? ( cellular )
-"
-
-################################################################################
-#
-# READ THIS BEFORE ADDING PACKAGES TO THIS EBUILD!
-#
-################################################################################
-#
-# Every chromeos dependency (along with its dependencies) is included in the
-# release image -- more packages contribute to longer build times, a larger
-# image, slower and bigger auto-updates, increased security risks, etc. Consider
-# the following before adding a new package:
-#
-# 1. Does the package really need to be part of the release image?
-#
-# Some packages can be included only in the developer or test images, i.e., the
-# target-os-dev or chromeos-test ebuilds. If the package will eventually be used
-# in the release but it's still under development, consider adding it to
-# target-os-dev initially until it's ready for production.
-#
-# 2. Why is the package a direct dependency of the chromeos ebuild?
-#
-# It makes sense for some packages to be included as a direct dependency of the
-# chromeos ebuild but for most it doesn't. The package should be added as a
-# direct dependency of the ebuilds for all packages that actually use it -- in
-# time, this ensures correct builds and allows easier cleanup of obsolete
-# packages. For example, if a utility will be invoked by the session manager,
-# its package should be added as a dependency in the chromeos-login ebuild. If
-# the package really needs to be a direct dependency of the chromeos ebuild,
-# consider adding a comment why the package is needed and how it's used.
-#
-# 3. Are all default package features and dependent packages needed?
-#
-# The release image should include only packages and features that are needed in
-# the production system. Often packages pull in features and additional packages
-# that are never used. Review these and consider pruning them (e.g., through USE
-# flags).
-#
-# 4. What is the impact on the image size?
-#
-# Before adding a package, evaluate the impact on the image size. If the package
-# and its dependencies increase the image size significantly, consider
-# alternative packages or approaches.
-#
-# 5. Is the package needed on all targets?
-#
-# If the package is needed only on some target boards, consider making it
-# conditional through USE flags in the board overlays.
-#
-# Variable Naming Convention:
-# ---------------------------
-# CROS_COMMON_* : Dependencies common to all CrOS flavors
-# CROS_* : Dependencies for "regular" CrOS devices (coreutils, etc.)
-################################################################################
-
-################################################################################
-#
-# Per Package Comments:
-# --------------------
-# Please add any comments specific to why certain packages are
-# pulled into the dependecy here. This is optional and required only when
-# the dependency isn't obvious
-#
-################################################################################
-
-################################################################################
-#
-# Dependencies common to all CrOS flavors (embedded, regular).
-# Everything in here should be behind a USE flag.
-#
-################################################################################
-RDEPEND="
-	input_devices_evdev? ( app-misc/evtest )
-	syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald )
-	biod? ( chromeos-base/biod )
-	compupdates? ( chromeos-base/imageloader )
-	dlc? ( chromeos-base/dlcservice )
-	dlc_test? (
-		chromeos-base/dummy-dlc
-		chromeos-base/test-dlc
-	)
-	bluetooth? ( chromeos-base/bluetooth )
-	bootchart? ( app-benchmarks/bootchart )
-	tpm? (
-		!tpm2? ( app-crypt/trousers )
-		chromeos-base/chaps
-	)
-	tpm2? ( chromeos-base/trunks )
-	pam? ( virtual/chromeos-auth-config )
-	fonts? ( chromeos-base/chromeos-fonts )
-	chromeos-base/chromeos-installer
-	chromeos-base/dev-install
-	crash_reporting? ( chromeos-base/crash-reporter )
-	mist? ( chromeos-base/mist )
-	modemfwd? ( chromeos-base/modemfwd )
-	buffet? ( chromeos-base/buffet )
-	containers? ( chromeos-base/run_oci )
-	cros_disks? ( chromeos-base/cros-disks )
-	debugd? ( chromeos-base/debugd )
-	diagnostics? ( chromeos-base/diagnostics )
-	kerberos_daemon? ( chromeos-base/kerberos )
-	scanner? ( chromeos-base/lorgnette )
-	ml_service? ( chromeos-base/ml )
-	hammerd? ( chromeos-base/hammerd )
-	media_perception? ( chromeos-base/mri_package )
-	memd? ( chromeos-base/memd )
-	power_management? ( chromeos-base/power_manager )
-	!chromeos-base/platform2
-	profile? ( chromeos-base/quipper )
-	selinux? ( chromeos-base/selinux-policy )
-	shill? ( chromeos-base/shill )
-	usb_bouncer? ( chromeos-base/usb_bouncer )
-	chromeos-base/update_engine
-	vpn? ( chromeos-base/vpn-manager )
-	cras? (
-		media-sound/adhd
-		media-sound/cras_tests
-	)
-	trim_supported? ( chromeos-base/chromeos-trim )
-	network_time? ( net-misc/tlsdate )
-	iwlwifi_rescan? ( net-wireless/iwlwifi_rescan )
-	nfc? ( net-wireless/neard chromeos-base/neard-configs )
-	readahead? ( sys-apps/ureadahead )
-	pam? ( sys-auth/pam_pwdfile )
-	watchdog? ( sys-apps/daisydog )
-	mtd? ( sys-fs/mtd-utils )
-	cups? ( virtual/chromium-os-printing )
-	touchview? ( chromeos-base/chromeos-accelerometer-init )
-	system_locales? ( chromeos-base/system-locales )
-	system_proxy? ( chromeos-base/system-proxy )
-	eclog? ( chromeos-base/timberslide )
-	chromeos-base/chromeos-machine-id-regen
-	systemd? ( sys-apps/systemd )
-	usbguard? ( sys-apps/usbguard )
-	kvm_host? (
-		chromeos-base/crosdns
-		chromeos-base/crostini_client
-		chromeos-base/vm_host_tools
-	)
-	sys-kernel/linux-firmware
-	virtual/chromeos-bsp
-	virtual/chromeos-firewall
-	virtual/chromeos-firmware
-	virtual/chromeos-interface
-	virtual/chromeos-regions
-	virtual/implicit-system
-	virtual/linux-sources
-	virtual/modutils
-	virtual/service-manager
-	cr50_onboard? (
-		chromeos-base/chromeos-cr50
-		chromeos-base/u2fd
-	)
-	ime? (
-		app-i18n/chinese-input
-		app-i18n/keyboard-input
-		app-i18n/japanese-input
-		app-i18n/hangul-input
-	)
-	fuzzer? ( virtual/target-fuzzers )
-	!dev-python/socksipy
-	arc-camera1? ( chromeos-base/cros-camera )
-	arc-camera3? ( chromeos-base/cros-camera )
-	fwupd? ( sys-apps/fwupd )
-	smbprovider? (
-		chromeos-base/smbfs
-		chromeos-base/smbprovider
-	)
-"
-
-################################################################################
-#
-# CROS_* : Dependencies for "regular" CrOS devices (coreutils, X etc)
-#
-# Comments on individual packages:
-# --------------------------------
-# app-editors/vim:
-# Specifically include the editor we want to appear in chromeos images, so that
-# it is deterministic which editor is chosen by 'virtual/editor' dependencies
-# (such as in the 'sudo' package).  See crosbug.com/5777.
-#
-# app-shells/bash:
-# We depend on dash for the /bin/sh shell for runtime speeds, but we also
-# depend on bash to make the dev mode experience better.  We do not enable
-# things like line editing in dash, so its interactive mode is very bare.
-################################################################################
-
-CROS_X86_RDEPEND="
-	dptf? ( virtual/dptf )
-	intel_lpe? ( virtual/lpe-support )
-"
-
-CROS_RDEPEND="
-	x86? ( ${CROS_X86_RDEPEND} )
-	amd64? ( ${CROS_X86_RDEPEND} )
-"
-
-# Anything behind a USE flag belongs in the main RDEPEND list above.
-# New packages usually should be behind a USE flag.
-CROS_RDEPEND="${CROS_RDEPEND}
-	app-arch/tar
-	app-editors/vim
-	app-shells/bash
-	chromeos-base/common-assets
-	chromeos-base/chromeos-imageburner
-	chromeos-base/crosh
-	chromeos-base/crosh-extension
-	chromeos-base/inputcontrol
-	chromeos-base/mtpd
-	chromeos-base/permission_broker
-	chromeos-base/userfeedback
-	chromeos-base/vboot_reference
-	chromeos-base/vpd
-	bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) )
-	net-wireless/crda
-	sys-apps/dbus
-	sys-apps/flashrom
-	sys-apps/iproute2
-	sys-apps/pv
-	sys-apps/rootdev
-	!systemd? ( sys-apps/upstart )
-	sys-fs/e2fsprogs
-	virtual/assets
-	virtual/cheets
-	virtual/udev
-"
-
-RDEPEND+="!cros_embedded? ( ${CROS_RDEPEND} )"
diff --git a/virtual/target-chromium-os/target-chromium-os-1-r147.ebuild b/virtual/target-chromium-os/target-chromium-os-1-r147.ebuild
new file mode 100644
index 0000000..d4973be
--- /dev/null
+++ b/virtual/target-chromium-os/target-chromium-os-1-r147.ebuild
@@ -0,0 +1,332 @@
+# Copyright 2014 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+# This ebuild only cares about its own FILESDIR and ebuild file, so it tracks
+# the canonical empty project.
+CROS_WORKON_COMMIT="3a01873e59ec25ecb10d1b07ff9816e69f3bbfee"
+CROS_WORKON_TREE="8ce164efd78fcb4a68e898d8c92c7579657a49b1"
+CROS_WORKON_PROJECT="chromiumos/infra/build/empty-project"
+CROS_WORKON_LOCALNAME="../platform/empty-project"
+
+inherit cros-workon
+
+DESCRIPTION="List of packages that are needed inside the Chromium OS base (release)"
+HOMEPAGE="https://dev.chromium.org/"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+# Note: Do not utilize USE=internal here.  Update virtual/target-chrome-os instead.
+IUSE="
+	arc-camera1
+	arc-camera3
+	biod
+	bluetooth
+	bootchart
+	buffet
+	cellular
+	compupdates
+	containers
+	cr50_onboard
+	+cras
+	+crash_reporting
+	+cros_disks
+	cros_embedded
+	cups
+	+debugd
+	diagnostics
+	dlc
+	dlc_test
+	dptf
+	eclog
+	+fonts
+	fuzzer
+	fwupd
+	hammerd
+	iioservice
+	ime
+	input_devices_evdev
+	intel_lpe
+	iwlwifi_rescan
+	kerberos_daemon
+	kernel-3_8
+	kvm_host
+	manatee
+	media_perception
+	memd
+	mist
+	modemfwd
+	ml_service
+	mtd
+	+network_time
+	nfc
+	pam
+	perfetto
+	postscript
+	+power_management
+	+profile
+	racc
+	+readahead
+	scanner
+	selinux
+	+shill
+	smbprovider
+	+syslog
+	+system_locales
+	system_proxy
+	systemd
+	touchview
+	+tpm
+	-tpm2
+	+trim_supported
+	typecd
+	usb_bouncer
+	usbguard
+	+vpn
+	watchdog
+"
+
+REQUIRED_USE="
+	cellular? ( shill )
+	modemfwd? ( cellular )
+"
+
+################################################################################
+#
+# READ THIS BEFORE ADDING PACKAGES TO THIS EBUILD!
+#
+################################################################################
+#
+# Every chromeos dependency (along with its dependencies) is included in the
+# release image -- more packages contribute to longer build times, a larger
+# image, slower and bigger auto-updates, increased security risks, etc. Consider
+# the following before adding a new package:
+#
+# 1. Does the package really need to be part of the release image?
+#
+# Some packages can be included only in the developer or test images, i.e., the
+# target-os-dev or chromeos-test ebuilds. If the package will eventually be used
+# in the release but it's still under development, consider adding it to
+# target-os-dev initially until it's ready for production.
+#
+# 2. Why is the package a direct dependency of the chromeos ebuild?
+#
+# It makes sense for some packages to be included as a direct dependency of the
+# chromeos ebuild but for most it doesn't. The package should be added as a
+# direct dependency of the ebuilds for all packages that actually use it -- in
+# time, this ensures correct builds and allows easier cleanup of obsolete
+# packages. For example, if a utility will be invoked by the session manager,
+# its package should be added as a dependency in the chromeos-login ebuild. If
+# the package really needs to be a direct dependency of the chromeos ebuild,
+# consider adding a comment why the package is needed and how it's used.
+#
+# 3. Are all default package features and dependent packages needed?
+#
+# The release image should include only packages and features that are needed in
+# the production system. Often packages pull in features and additional packages
+# that are never used. Review these and consider pruning them (e.g., through USE
+# flags).
+#
+# 4. What is the impact on the image size?
+#
+# Before adding a package, evaluate the impact on the image size. If the package
+# and its dependencies increase the image size significantly, consider
+# alternative packages or approaches.
+#
+# 5. Is the package needed on all targets?
+#
+# If the package is needed only on some target boards, consider making it
+# conditional through USE flags in the board overlays.
+#
+# Variable Naming Convention:
+# ---------------------------
+# CROS_COMMON_* : Dependencies common to all CrOS flavors
+# CROS_* : Dependencies for "regular" CrOS devices (coreutils, etc.)
+################################################################################
+
+################################################################################
+#
+# Per Package Comments:
+# --------------------
+# Please add any comments specific to why certain packages are
+# pulled into the dependecy here. This is optional and required only when
+# the dependency isn't obvious
+#
+################################################################################
+
+################################################################################
+#
+# Dependencies common to all CrOS flavors (embedded, regular).
+# Everything in here should be behind a USE flag.
+#
+################################################################################
+RDEPEND="
+	input_devices_evdev? ( app-misc/evtest )
+	syslog? ( app-admin/rsyslog chromeos-base/croslog sys-apps/journald )
+	biod? ( chromeos-base/biod )
+	compupdates? ( chromeos-base/imageloader )
+	dlc? ( chromeos-base/dlcservice )
+	dlc_test? (
+		chromeos-base/dummy-dlc
+		chromeos-base/test-dlc
+	)
+	bluetooth? ( chromeos-base/bluetooth )
+	bootchart? ( app-benchmarks/bootchart )
+	tpm? (
+		!tpm2? ( app-crypt/trousers )
+		chromeos-base/chaps
+	)
+	tpm2? ( chromeos-base/trunks )
+	pam? ( virtual/chromeos-auth-config )
+	fonts? ( chromeos-base/chromeos-fonts )
+	chromeos-base/chromeos-installer
+	chromeos-base/dev-install
+	perfetto? ( chromeos-base/perfetto )
+	crash_reporting? ( chromeos-base/crash-reporter )
+	mist? ( chromeos-base/mist )
+	modemfwd? ( chromeos-base/modemfwd )
+	buffet? ( chromeos-base/buffet )
+	containers? ( chromeos-base/run_oci )
+	cros_disks? ( chromeos-base/cros-disks )
+	debugd? ( chromeos-base/debugd )
+	diagnostics? ( chromeos-base/diagnostics )
+	kerberos_daemon? ( chromeos-base/kerberos )
+	scanner? ( chromeos-base/lorgnette )
+	ml_service? ( chromeos-base/ml )
+	hammerd? ( chromeos-base/hammerd )
+	racc? (
+		chromeos-base/hardware_verifier
+		chromeos-base/runtime_probe
+	)
+	iioservice? ( chromeos-base/iioservice )
+	media_perception? ( chromeos-base/mri_package )
+	memd? ( chromeos-base/memd )
+	power_management? ( chromeos-base/power_manager )
+	!chromeos-base/platform2
+	profile? ( chromeos-base/quipper )
+	selinux? ( chromeos-base/selinux-policy )
+	shill? ( >=chromeos-base/shill-0.0.1-r2205 )
+	manatee? ( chromeos-base/sirenia )
+	usb_bouncer? ( chromeos-base/usb_bouncer )
+	chromeos-base/update_engine
+	vpn? ( chromeos-base/vpn-manager )
+	cras? (
+		media-sound/adhd
+		media-sound/cras_tests
+	)
+	trim_supported? ( chromeos-base/chromeos-trim )
+	network_time? ( net-misc/tlsdate )
+	iwlwifi_rescan? ( net-wireless/iwlwifi_rescan )
+	nfc? ( net-wireless/neard chromeos-base/neard-configs )
+	readahead? ( sys-apps/ureadahead )
+	pam? ( sys-auth/pam_pwdfile )
+	watchdog? ( sys-apps/daisydog )
+	mtd? ( sys-fs/mtd-utils )
+	cups? ( virtual/chromium-os-printing )
+	touchview? ( chromeos-base/chromeos-accelerometer-init )
+	system_locales? ( chromeos-base/system-locales )
+	system_proxy? ( chromeos-base/system-proxy )
+	eclog? ( chromeos-base/timberslide )
+	chromeos-base/chromeos-machine-id-regen
+	systemd? ( sys-apps/systemd )
+	usbguard? ( sys-apps/usbguard )
+	kvm_host? (
+		chromeos-base/crosdns
+		chromeos-base/crostini_client
+		chromeos-base/vm_host_tools
+		dlc? (
+			chromeos-base/termina-dlc
+		)
+	)
+	sys-kernel/linux-firmware
+	virtual/chromeos-bsp
+	virtual/chromeos-firewall
+	virtual/chromeos-firmware
+	virtual/chromeos-interface
+	virtual/chromeos-regions
+	virtual/implicit-system
+	virtual/linux-sources
+	virtual/modutils
+	virtual/service-manager
+	cr50_onboard? (
+		chromeos-base/chromeos-cr50
+		chromeos-base/u2fd
+	)
+	ime? (
+		app-i18n/chinese-input
+		app-i18n/keyboard-input
+		app-i18n/japanese-input
+		app-i18n/hangul-input
+	)
+	fuzzer? ( virtual/target-fuzzers )
+	!dev-python/socksipy
+	arc-camera1? ( chromeos-base/cros-camera )
+	arc-camera3? ( chromeos-base/cros-camera )
+	fwupd? ( sys-apps/fwupd )
+	smbprovider? (
+		chromeos-base/smbfs
+		chromeos-base/smbprovider
+	)
+	typecd? ( chromeos-base/typecd )
+"
+
+################################################################################
+#
+# CROS_* : Dependencies for "regular" CrOS devices (coreutils, X etc)
+#
+# Comments on individual packages:
+# --------------------------------
+# app-editors/vim:
+# Specifically include the editor we want to appear in chromeos images, so that
+# it is deterministic which editor is chosen by 'virtual/editor' dependencies
+# (such as in the 'sudo' package).  See crosbug.com/5777.
+#
+# app-shells/bash:
+# We depend on dash for the /bin/sh shell for runtime speeds, but we also
+# depend on bash to make the dev mode experience better.  We do not enable
+# things like line editing in dash, so its interactive mode is very bare.
+################################################################################
+
+CROS_X86_RDEPEND="
+	dptf? ( virtual/dptf )
+	intel_lpe? ( virtual/lpe-support )
+"
+
+CROS_RDEPEND="
+	x86? ( ${CROS_X86_RDEPEND} )
+	amd64? ( ${CROS_X86_RDEPEND} )
+"
+
+# Anything behind a USE flag belongs in the main RDEPEND list above.
+# New packages usually should be behind a USE flag.
+CROS_RDEPEND="${CROS_RDEPEND}
+	app-arch/tar
+	app-editors/vim
+	app-shells/bash
+	chromeos-base/common-assets
+	chromeos-base/chromeos-imageburner
+	chromeos-base/crosh
+	chromeos-base/crosh-extension
+	chromeos-base/inputcontrol
+	chromeos-base/mtpd
+	chromeos-base/permission_broker
+	chromeos-base/userfeedback
+	chromeos-base/vboot_reference
+	chromeos-base/vpd
+	bluetooth? ( kernel-3_8? ( net-wireless/ath3k ) )
+	net-wireless/crda
+	sys-apps/dbus
+	sys-apps/flashrom
+	sys-apps/iproute2
+	sys-apps/pv
+	sys-apps/rootdev
+	!systemd? ( sys-apps/upstart )
+	sys-fs/e2fsprogs
+	virtual/assets
+	virtual/cheets
+	virtual/udev
+"
+
+RDEPEND+="!cros_embedded? ( ${CROS_RDEPEND} )"
diff --git a/virtual/target-chromium-os/target-chromium-os-9999.ebuild b/virtual/target-chromium-os/target-chromium-os-9999.ebuild
index 5f18e36..2ee5bcf 100644
--- a/virtual/target-chromium-os/target-chromium-os-9999.ebuild
+++ b/virtual/target-chromium-os/target-chromium-os-9999.ebuild
@@ -43,6 +43,7 @@
 	fuzzer
 	fwupd
 	hammerd
+	iioservice
 	ime
 	input_devices_evdev
 	intel_lpe
@@ -50,6 +51,7 @@
 	kerberos_daemon
 	kernel-3_8
 	kvm_host
+	manatee
 	media_perception
 	memd
 	mist
@@ -59,9 +61,11 @@
 	+network_time
 	nfc
 	pam
+	perfetto
 	postscript
 	+power_management
 	+profile
+	racc
 	+readahead
 	scanner
 	selinux
@@ -75,6 +79,7 @@
 	+tpm
 	-tpm2
 	+trim_supported
+	typecd
 	usb_bouncer
 	usbguard
 	+vpn
@@ -176,6 +181,7 @@
 	fonts? ( chromeos-base/chromeos-fonts )
 	chromeos-base/chromeos-installer
 	chromeos-base/dev-install
+	perfetto? ( chromeos-base/perfetto )
 	crash_reporting? ( chromeos-base/crash-reporter )
 	mist? ( chromeos-base/mist )
 	modemfwd? ( chromeos-base/modemfwd )
@@ -188,13 +194,19 @@
 	scanner? ( chromeos-base/lorgnette )
 	ml_service? ( chromeos-base/ml )
 	hammerd? ( chromeos-base/hammerd )
+	racc? (
+		chromeos-base/hardware_verifier
+		chromeos-base/runtime_probe
+	)
+	iioservice? ( chromeos-base/iioservice )
 	media_perception? ( chromeos-base/mri_package )
 	memd? ( chromeos-base/memd )
 	power_management? ( chromeos-base/power_manager )
 	!chromeos-base/platform2
 	profile? ( chromeos-base/quipper )
 	selinux? ( chromeos-base/selinux-policy )
-	shill? ( chromeos-base/shill )
+	shill? ( >=chromeos-base/shill-0.0.1-r2205 )
+	manatee? ( chromeos-base/sirenia )
 	usb_bouncer? ( chromeos-base/usb_bouncer )
 	chromeos-base/update_engine
 	vpn? ( chromeos-base/vpn-manager )
@@ -222,6 +234,9 @@
 		chromeos-base/crosdns
 		chromeos-base/crostini_client
 		chromeos-base/vm_host_tools
+		dlc? (
+			chromeos-base/termina-dlc
+		)
 	)
 	sys-kernel/linux-firmware
 	virtual/chromeos-bsp
@@ -252,6 +267,7 @@
 		chromeos-base/smbfs
 		chromeos-base/smbprovider
 	)
+	typecd? ( chromeos-base/typecd )
 "
 
 ################################################################################
diff --git a/virtual/toolchain-packages/toolchain-packages-1-r1.ebuild b/virtual/toolchain-packages/toolchain-packages-1-r1.ebuild
deleted file mode 100644
index bdb198f..0000000
--- a/virtual/toolchain-packages/toolchain-packages-1-r1.ebuild
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2020 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-DESCRIPTION="Virtual package for listing toolchain packages.
-All packages which should be considered part of the toolchain must be directly
-listed as dependencies of this package. The common features of packages that
-should be in this virtual are packages that consumed by many other packages (to
-the point of needing to rebuild a significant chunk of the world to properly
-test changes) and that don't fit nicely in to Portage's dependency model (for
-bootstrap problems/circular dependencies/other reasons)."
-HOMEPAGE="http://dev.chromium.org/chromium-os"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-
-# dev-lang/rust qualifies as a toolchain package by the above criteria but
-# cannot be tested in a straightforward manner on the CQ because it requires
-# the full suite of cross-compilers to be built in order to be compiled. It can
-# be added back to this list once it can be compiled without requiring every
-# cross-compiler to be built first.
-
-DEPEND="
-	dev-lang/go
-	dev-libs/elfutils
-	sys-devel/binutils
-	sys-devel/gcc
-	sys-devel/llvm
-	sys-kernel/linux-headers
-	sys-libs/compiler-rt
-	sys-libs/glibc
-	sys-libs/libcxx
-	sys-libs/libcxxabi
-	sys-libs/llvm-libunwind
-"
-
-
-src_compile() {
-	die "This package is for information only and should never be installed."
-}
\ No newline at end of file
diff --git a/virtual/toolchain-packages/toolchain-packages-1-r2.ebuild b/virtual/toolchain-packages/toolchain-packages-1-r2.ebuild
new file mode 100644
index 0000000..37ebdd3
--- /dev/null
+++ b/virtual/toolchain-packages/toolchain-packages-1-r2.ebuild
@@ -0,0 +1,38 @@
+# Copyright 2020 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DESCRIPTION="Virtual package for listing toolchain packages.
+All packages which should be considered part of the toolchain must be directly
+listed as dependencies of this package. The common features of packages that
+should be in this virtual are packages that consumed by many other packages (to
+the point of needing to rebuild a significant chunk of the world to properly
+test changes) and that don't fit nicely in to Portage's dependency model (for
+bootstrap problems/circular dependencies/other reasons)."
+HOMEPAGE="http://dev.chromium.org/chromium-os"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+DEPEND="
+	dev-lang/go
+	dev-lang/rust
+	dev-libs/elfutils
+	sys-devel/binutils
+	sys-devel/gcc
+	sys-devel/llvm
+	sys-kernel/linux-headers
+	sys-libs/compiler-rt
+	sys-libs/glibc
+	sys-libs/libcxx
+	sys-libs/libcxxabi
+	sys-libs/llvm-libunwind
+"
+
+
+src_compile() {
+	die "This package is for information only and should never be installed."
+}
\ No newline at end of file
diff --git a/virtual/wpa_supplicant/wpa_supplicant-1-r1.ebuild b/virtual/wpa_supplicant/wpa_supplicant-1-r2.ebuild
similarity index 100%
rename from virtual/wpa_supplicant/wpa_supplicant-1-r1.ebuild
rename to virtual/wpa_supplicant/wpa_supplicant-1-r2.ebuild
diff --git a/virtual/wpa_supplicant/wpa_supplicant-1.ebuild b/virtual/wpa_supplicant/wpa_supplicant-1.ebuild
index 45f26c5..f54dc65 100644
--- a/virtual/wpa_supplicant/wpa_supplicant-1.ebuild
+++ b/virtual/wpa_supplicant/wpa_supplicant-1.ebuild
@@ -12,7 +12,8 @@
 KEYWORDS="*"
 IUSE=""
 RDEPEND="
-	net-wireless/wpa_supplicant-2_8:=[dbus]
+	net-wireless/wpa_supplicant-2_9:=[dbus]
+	!net-wireless/wpa_supplicant-2_8
 	!net-wireless/wpa_supplicant
 "
 DEPEND="${RDEPEND}"
diff --git a/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25-r1.ebuild b/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25-r1.ebuild
new file mode 120000
index 0000000..f1b2391
--- /dev/null
+++ b/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25-r1.ebuild
@@ -0,0 +1 @@
+igt-gpu-tools-9999.ebuild
\ No newline at end of file
diff --git a/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25.ebuild b/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25.ebuild
deleted file mode 100644
index 77a772e..0000000
--- a/x11-apps/igt-gpu-tools/igt-gpu-tools-1.25.ebuild
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-EGIT_REPO_URI="https://gitlab.freedesktop.org/drm/${PN}.git"
-if [[ ${PV} = *9999* ]]; then
-	GIT_ECLASS="git-r3"
-fi
-
-inherit ${GIT_ECLASS} meson
-
-DESCRIPTION="Intel GPU userland tools"
-
-HOMEPAGE="https://01.org/linuxgraphics https://gitlab.freedesktop.org/drm/igt-gpu-tools"
-if [[ ${PV} = *9999* ]]; then
-	SRC_URI=""
-else
-	KEYWORDS="*"
-	SRC_URI="https://www.x.org/releases/individual/app/${P}.tar.xz"
-fi
-LICENSE="MIT"
-SLOT="0"
-IUSE="chamelium doc man overlay runner tests unwind valgrind video_cards_amdgpu video_cards_intel video_cards_nouveau X xv"
-REQUIRED_USE="
-	|| ( video_cards_amdgpu video_cards_intel video_cards_nouveau )
-	overlay? (
-		video_cards_intel
-		|| ( X xv )
-	)
-	doc? ( tests )
-"
-RESTRICT="test"
-
-RDEPEND="
-	dev-libs/elfutils
-	dev-libs/glib:2
-	sys-apps/kmod:=
-	sys-libs/llvm-libunwind:=
-	sys-libs/zlib:=
-	sys-process/procps:=
-	virtual/libudev:=
-	>=x11-libs/cairo-1.12.0[X?]
-	>=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?]
-	>=x11-libs/libpciaccess-0.10
-	x11-libs/pixman
-	chamelium? (
-		dev-libs/xmlrpc-c[curl]
-		sci-libs/gsl
-		media-libs/alsa-lib:=
-	)
-	overlay? (
-		>=x11-libs/libXrandr-1.3
-		xv? (
-			x11-libs/libX11
-			x11-libs/libXext
-			x11-libs/libXv
-		)
-	)
-	runner? ( dev-libs/json-c:= )
-	unwind? ( sys-libs/libunwind )
-	valgrind? ( dev-util/valgrind )
-	"
-DEPEND="${RDEPEND}
-	doc? ( >=dev-util/gtk-doc-1.25-r1 )
-	man? ( dev-python/docutils )
-	overlay? (
-		>=dev-util/peg-0.1.18
-		x11-base/xorg-proto
-	)
-	video_cards_intel? (
-		sys-devel/bison
-		sys-devel/flex
-	)
-"
-
-src_prepare() {
-	sed -e "s/find_program('rst2man-3'/find_program('rst2man.py', 'rst2man-3'/" -i man/meson.build
-	default_src_prepare
-}
-
-src_configure() {
-	local gpus=""
-	use video_cards_amdgpu  && gpus+="amdgpu,"
-	use video_cards_intel   && gpus+="intel,"
-	use video_cards_nouveau && gpus+="nouveau,"
-
-	local overlay_backends=""
-	use overlay && use xv && overlay_backends+="xv,"
-	use overlay && use X && overlay_backends+="x,"
-
-	local emesonargs=(
-		$(meson_feature chamelium)
-		$(meson_feature doc docs)
-		$(meson_feature man)
-		$(meson_feature overlay)
-		$(meson_feature runner)
-		$(meson_feature tests)
-		$(meson_feature valgrind)
-		$(meson_feature unwind libunwind)
-		-Doverlay_backends=${overlay_backends%?}
-		-Dlibdrm_drivers=${gpus%?}
-	)
-	meson_src_configure
-}
diff --git a/x11-apps/igt-gpu-tools/igt-gpu-tools-9999.ebuild b/x11-apps/igt-gpu-tools/igt-gpu-tools-9999.ebuild
new file mode 100644
index 0000000..dd4142b
--- /dev/null
+++ b/x11-apps/igt-gpu-tools/igt-gpu-tools-9999.ebuild
@@ -0,0 +1,113 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+EGIT_REPO_URI="https://gitlab.freedesktop.org/drm/${PN}.git"
+if [[ ${PV} = *9999* ]]; then
+	GIT_ECLASS="git-r3"
+fi
+
+if [[ ${PV} != *9999* ]]; then
+	CROS_WORKON_COMMIT=f49ebeee9f54d6f23c60a842f75f65561d452ab0
+	CROS_WORKON_TREE=3aff21700e194b385c800f63c88e8a381763ecce
+fi
+
+CROS_WORKON_PROJECT=chromiumos/third_party/igt-gpu-tools
+CROS_WORKON_BLACKLIST=1
+
+inherit ${GIT_ECLASS} meson cros-workon
+
+DESCRIPTION="Intel GPU userland tools"
+
+HOMEPAGE="https://01.org/linuxgraphics https://gitlab.freedesktop.org/drm/igt-gpu-tools"
+if [[ ${PV} = *9999* ]]; then
+	KEYWORDS="~*"
+	SRC_URI=""
+else
+	KEYWORDS="*"
+	SRC_URI="https://www.x.org/releases/individual/app/${P}.tar.xz"
+fi
+LICENSE="MIT"
+SLOT="0"
+IUSE="chamelium doc man overlay runner tests unwind valgrind video_cards_amdgpu video_cards_intel video_cards_nouveau X xv"
+REQUIRED_USE="
+	|| ( video_cards_amdgpu video_cards_intel video_cards_nouveau )
+	overlay? (
+		video_cards_intel
+		|| ( X xv )
+	)
+	doc? ( tests )
+"
+RESTRICT="test"
+
+RDEPEND="
+	dev-libs/elfutils
+	dev-libs/glib:2
+	sys-apps/kmod:=
+	sys-libs/llvm-libunwind:=
+	sys-libs/zlib:=
+	sys-process/procps:=
+	virtual/libudev:=
+	>=x11-libs/cairo-1.12.0[X?]
+	>=x11-libs/libdrm-2.4.82[video_cards_amdgpu?,video_cards_intel?,video_cards_nouveau?]
+	>=x11-libs/libpciaccess-0.10
+	x11-libs/pixman
+	chamelium? (
+		dev-libs/xmlrpc-c[curl]
+		sci-libs/gsl
+		media-libs/alsa-lib:=
+	)
+	overlay? (
+		>=x11-libs/libXrandr-1.3
+		xv? (
+			x11-libs/libX11
+			x11-libs/libXext
+			x11-libs/libXv
+		)
+	)
+	runner? ( dev-libs/json-c:= )
+	unwind? ( sys-libs/libunwind )
+	valgrind? ( dev-util/valgrind )
+	"
+DEPEND="${RDEPEND}
+	doc? ( >=dev-util/gtk-doc-1.25-r1 )
+	man? ( dev-python/docutils )
+	overlay? (
+		>=dev-util/peg-0.1.18
+		x11-base/xorg-proto
+	)
+	video_cards_intel? (
+		sys-devel/bison
+		sys-devel/flex
+	)
+"
+
+src_prepare() {
+	sed -e "s/find_program('rst2man-3'/find_program('rst2man.py', 'rst2man-3'/" -i man/meson.build
+	default_src_prepare
+}
+
+src_configure() {
+	local gpus=""
+	use video_cards_amdgpu  && gpus+="amdgpu,"
+	use video_cards_intel   && gpus+="intel,"
+	use video_cards_nouveau && gpus+="nouveau,"
+
+	local overlay_backends=""
+	use overlay && use xv && overlay_backends+="xv,"
+	use overlay && use X && overlay_backends+="x,"
+
+	local emesonargs=(
+		$(meson_feature chamelium)
+		$(meson_feature doc docs)
+		$(meson_feature man)
+		$(meson_feature overlay)
+		$(meson_feature runner)
+		$(meson_feature tests)
+		$(meson_feature valgrind)
+		$(meson_feature unwind libunwind)
+		-Doverlay_backends=${overlay_backends%?}
+		-Dlibdrm_drivers=${gpus%?}
+	)
+	meson_src_configure
+}
diff --git a/x11-base/xwayland/xwayland-1.20.8-r2.ebuild b/x11-base/xwayland/xwayland-1.20.8-r3.ebuild
similarity index 100%
rename from x11-base/xwayland/xwayland-1.20.8-r2.ebuild
rename to x11-base/xwayland/xwayland-1.20.8-r3.ebuild
diff --git a/x11-base/xwayland/xwayland-1.20.8.ebuild b/x11-base/xwayland/xwayland-1.20.8.ebuild
index 602c27c..bb3cf26 100644
--- a/x11-base/xwayland/xwayland-1.20.8.ebuild
+++ b/x11-base/xwayland/xwayland-1.20.8.ebuild
@@ -2,10 +2,11 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
-EAPI=5
+EAPI=7
 
 XORG_DOC=doc
-inherit xorg-2
+XORG_EAUTORECONF="yes"
+inherit xorg-3
 
 MY_P="xorg-server-${PV}"
 SRC_URI="https://www.x.org/releases/individual/xserver/${MY_P}.tar.bz2"
@@ -39,12 +40,16 @@
 
 S="${WORKDIR}/${MY_P}"
 
+PATCHES=(
+	"${FILESDIR}"/0001-HACK-make-monotonic-detection-always-succeed-on-cros.patch
+	"${FILESDIR}"/0001-xwayland-virtwl-with-dmabuf-for-1.20.1.patch
+	"${FILESDIR}"/0001-Eliminate-conflict-with-X11-Xlib.h-with-khronos-eglp.patch
+	"${FILESDIR}"/0001-xwayland-sysmacros.patch
+	"${FILESDIR}"/0001-xwayland-Fall-back-to-gbm_bo_create-if-no-modifiers-.patch
+)
+
 src_prepare() {
-	epatch "${FILESDIR}"/0001-HACK-make-monotonic-detection-always-succeed-on-cros.patch
-	epatch "${FILESDIR}"/0001-xwayland-virtwl-with-dmabuf-for-1.20.1.patch
-	epatch "${FILESDIR}"/0001-Eliminate-conflict-with-X11-Xlib.h-with-khronos-eglp.patch
-	epatch "${FILESDIR}"/0001-xwayland-sysmacros.patch
-	epatch "${FILESDIR}"/0001-xwayland-Fall-back-to-gbm_bo_create-if-no-modifiers-.patch
+	default
 
 	# Needed for patches that modify configure.ac
 	eautoreconf
@@ -81,5 +86,5 @@
 		)
 	fi
 
-	xorg-2_src_configure
+	xorg-3_src_configure
 }
diff --git a/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r187.ebuild b/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r187.ebuild
deleted file mode 100644
index 27e725a..0000000
--- a/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r187.ebuild
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="6"
-
-CROS_WORKON_COMMIT="ec8fc231e199b16c4d1a247853c9afc17d297402"
-CROS_WORKON_TREE="7a0ac90ce1d88bf661f0dfc6ad457e10e87c6b96"
-CROS_WORKON_PROJECT="chromiumos/platform/touchpad-tests"
-CROS_WORKON_LOCALNAME="../platform/touchpad-tests"
-
-inherit cros-workon cros-constants
-
-DESCRIPTION="Chromium OS multitouch driver regression tests"
-HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/touchpad-tests"
-
-LICENSE="BSD-Google"
-SLOT="0"
-KEYWORDS="*"
-IUSE=""
-
-RDEPEND="chromeos-base/gestures
-	chromeos-base/libevdev
-	app-misc/utouch-evemu
-	x11-base/xorg-proto"
-DEPEND=${RDEPEND}
-
-src_install() {
-	# install to autotest deps directory for dependency
-	emake DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests" install
-}
diff --git a/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r189.ebuild b/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r189.ebuild
new file mode 100644
index 0000000..144bb15
--- /dev/null
+++ b/x11-drivers/touchpad-tests/touchpad-tests-0.0.1-r189.ebuild
@@ -0,0 +1,30 @@
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+CROS_WORKON_COMMIT="2c69dd7b6b3cbb59487a7a585fe3af87328d74a4"
+CROS_WORKON_TREE="8464b117e40af3e33f2bcbe2b9835ebd1fac6365"
+CROS_WORKON_PROJECT="chromiumos/platform/touchpad-tests"
+CROS_WORKON_LOCALNAME="../platform/touchpad-tests"
+
+inherit cros-workon cros-constants
+
+DESCRIPTION="Chromium OS multitouch driver regression tests"
+HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/touchpad-tests"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE=""
+
+RDEPEND="chromeos-base/gestures
+	chromeos-base/libevdev
+	app-misc/utouch-evemu
+	x11-base/xorg-proto"
+DEPEND=${RDEPEND}
+
+src_install() {
+	# install to autotest deps directory for dependency
+	emake DESTDIR="${D}${AUTOTEST_BASE}/client/deps/touchpad-tests" install
+}
diff --git a/x11-libs/libdrm/files/new-intel-sync-i915_pciids.h-with-kernel.patch b/x11-libs/libdrm/files/new-intel-sync-i915_pciids.h-with-kernel.patch
new file mode 100644
index 0000000..25f0223
--- /dev/null
+++ b/x11-libs/libdrm/files/new-intel-sync-i915_pciids.h-with-kernel.patch
@@ -0,0 +1,51 @@
+From 669e1087ab60637744ae0f3f15b8c1608d2a8653 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= <jose.souza@intel.com>
+Date: Wed, 8 Jul 2020 10:44:53 -0700
+Subject: [PATCH] intel: sync i915_pciids.h with kernel
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Two new patches landed in kernel adding new PCI ids:
+123f62de419f ("drm/i915/rkl: Add RKL platform info and PCI ids")
+52797a8e8529 ("drm/i915/ehl: Add new PCI ids")
+
+Cc: Matt Roper <matthew.d.roper@intel.com>
+Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
+---
+ intel/i915_pciids.h | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/intel/i915_pciids.h b/intel/i915_pciids.h
+index 662d8351c87a..d6cb28992ba0 100644
+--- a/intel/i915_pciids.h
++++ b/intel/i915_pciids.h
+@@ -588,7 +588,11 @@
+ 	INTEL_VGA_DEVICE(0x4551, info), \
+ 	INTEL_VGA_DEVICE(0x4541, info), \
+ 	INTEL_VGA_DEVICE(0x4E71, info), \
++	INTEL_VGA_DEVICE(0x4557, info), \
++	INTEL_VGA_DEVICE(0x4555, info), \
+ 	INTEL_VGA_DEVICE(0x4E61, info), \
++	INTEL_VGA_DEVICE(0x4E57, info), \
++	INTEL_VGA_DEVICE(0x4E55, info), \
+ 	INTEL_VGA_DEVICE(0x4E51, info)
+ 
+ /* TGL */
+@@ -605,4 +609,13 @@
+ 	INTEL_VGA_DEVICE(0x9AD9, info), \
+ 	INTEL_VGA_DEVICE(0x9AF8, info)
+ 
++/* RKL */
++#define INTEL_RKL_IDS(info) \
++	INTEL_VGA_DEVICE(0x4C80, info), \
++	INTEL_VGA_DEVICE(0x4C8A, info), \
++	INTEL_VGA_DEVICE(0x4C8B, info), \
++	INTEL_VGA_DEVICE(0x4C8C, info), \
++	INTEL_VGA_DEVICE(0x4C90, info), \
++	INTEL_VGA_DEVICE(0x4C9A, info)
++
+ #endif /* _I915_PCIIDS_H */
+-- 
+2.7.4
+
diff --git a/x11-libs/libdrm/libdrm-2.4.100-r3.ebuild b/x11-libs/libdrm/libdrm-2.4.100-r3.ebuild
deleted file mode 100644
index 453637a..0000000
--- a/x11-libs/libdrm/libdrm-2.4.100-r3.ebuild
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 1999-2013 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="5"
-EGIT_REPO_URI="https://gitlab.freedesktop.org/mesa/drm.git"
-CROS_WORKON_COMMIT="0190f49a139e7069d7cad6a6890832831da1aa8b"
-CROS_WORKON_TREE="f691fb10ddd5ffefb25682ff89f6f978fe91ec02"
-CROS_WORKON_PROJECT="chromiumos/third_party/libdrm"
-CROS_WORKON_BLACKLIST="1"
-
-inherit xorg-2 cros-workon
-
-DESCRIPTION="X.Org libdrm library"
-HOMEPAGE="http://dri.freedesktop.org/"
-SRC_URI=""
-
-# This package uses the MIT license inherited from Xorg but fails to provide
-# any license file in its source, so we add X as a license, which lists all
-# the Xorg copyright holders and allows license generation to pick them up.
-LICENSE="|| ( MIT X )"
-SLOT="0"
-KEYWORDS="*"
-VIDEO_CARDS="amdgpu exynos freedreno intel nouveau omap radeon vc4 vmware"
-for card in ${VIDEO_CARDS}; do
-	IUSE_VIDEO_CARDS+=" video_cards_${card}"
-done
-
-IUSE="${IUSE_VIDEO_CARDS} libkms manpages +udev"
-REQUIRED_USE="video_cards_exynos? ( libkms )"
-RESTRICT="test" # see bug #236845
-
-RDEPEND="dev-libs/libpthread-stubs
-	udev? ( virtual/udev )
-	video_cards_amdgpu? ( dev-util/cunit )
-	video_cards_intel? ( >=x11-libs/libpciaccess-0.10 )
-	!<x11-libs/libdrm-tests-2.4.58-r3
-"
-
-DEPEND="${RDEPEND}"
-
-XORG_EAUTORECONF=yes
-
-src_prepare() {
-	epatch "${FILESDIR}"/Add-header-for-Rockchip-DRM-userspace.patch
-	epatch "${FILESDIR}"/Add-header-for-Mediatek-DRM-userspace.patch
-	epatch "${FILESDIR}"/Add-Evdi-module-userspace-api-file.patch
-	epatch "${FILESDIR}"/Add-Rockchip-AFBC-modifier.patch
-	epatch "${FILESDIR}"/Add-back-VENDOR_NV-name.patch
-	epatch "${FILESDIR}"/CHROMIUM-add-resource-info-header.patch
-	epatch "${FILESDIR}"/FROMLIST-Add-drmModeGetFB2.patch
-	epatch "${FILESDIR}"/intel-sync-i915_pciids.h-with-kernel.patch
-
-	xorg-2_src_prepare
-}
-
-src_configure() {
-	XORG_CONFIGURE_OPTIONS=(
-		--enable-install-test-programs
-		$(use_enable video_cards_amdgpu amdgpu)
-		$(use_enable video_cards_exynos exynos-experimental-api)
-		$(use_enable video_cards_freedreno freedreno)
-		$(use_enable video_cards_intel intel)
-		$(use_enable video_cards_nouveau nouveau)
-		$(use_enable video_cards_omap omap-experimental-api)
-		$(use_enable video_cards_radeon radeon)
-		$(use_enable video_cards_vc4 vc4)
-		$(use_enable video_cards_vmware vmwgfx)
-		$(use_enable libkms)
-		$(use_enable manpages)
-		$(use_enable udev)
-		--disable-cairo-tests
-	)
-	xorg-2_src_configure
-}
diff --git a/x11-libs/libdrm/libdrm-2.4.100-r4.ebuild b/x11-libs/libdrm/libdrm-2.4.100-r4.ebuild
new file mode 100644
index 0000000..b053e96
--- /dev/null
+++ b/x11-libs/libdrm/libdrm-2.4.100-r4.ebuild
@@ -0,0 +1,75 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="5"
+EGIT_REPO_URI="https://gitlab.freedesktop.org/mesa/drm.git"
+CROS_WORKON_COMMIT="0190f49a139e7069d7cad6a6890832831da1aa8b"
+CROS_WORKON_TREE="f691fb10ddd5ffefb25682ff89f6f978fe91ec02"
+CROS_WORKON_PROJECT="chromiumos/third_party/libdrm"
+CROS_WORKON_BLACKLIST="1"
+
+inherit xorg-2 cros-workon
+
+DESCRIPTION="X.Org libdrm library"
+HOMEPAGE="http://dri.freedesktop.org/"
+SRC_URI=""
+
+# This package uses the MIT license inherited from Xorg but fails to provide
+# any license file in its source, so we add X as a license, which lists all
+# the Xorg copyright holders and allows license generation to pick them up.
+LICENSE="|| ( MIT X )"
+SLOT="0"
+KEYWORDS="*"
+VIDEO_CARDS="amdgpu exynos freedreno intel nouveau omap radeon vc4 vmware"
+for card in ${VIDEO_CARDS}; do
+	IUSE_VIDEO_CARDS+=" video_cards_${card}"
+done
+
+IUSE="${IUSE_VIDEO_CARDS} libkms manpages +udev"
+REQUIRED_USE="video_cards_exynos? ( libkms )"
+RESTRICT="test" # see bug #236845
+
+RDEPEND="dev-libs/libpthread-stubs
+	udev? ( virtual/udev )
+	video_cards_amdgpu? ( dev-util/cunit )
+	video_cards_intel? ( >=x11-libs/libpciaccess-0.10 )
+	!<x11-libs/libdrm-tests-2.4.58-r3
+"
+
+DEPEND="${RDEPEND}"
+
+XORG_EAUTORECONF=yes
+
+src_prepare() {
+	epatch "${FILESDIR}"/Add-header-for-Rockchip-DRM-userspace.patch
+	epatch "${FILESDIR}"/Add-header-for-Mediatek-DRM-userspace.patch
+	epatch "${FILESDIR}"/Add-Evdi-module-userspace-api-file.patch
+	epatch "${FILESDIR}"/Add-Rockchip-AFBC-modifier.patch
+	epatch "${FILESDIR}"/Add-back-VENDOR_NV-name.patch
+	epatch "${FILESDIR}"/CHROMIUM-add-resource-info-header.patch
+	epatch "${FILESDIR}"/FROMLIST-Add-drmModeGetFB2.patch
+	epatch "${FILESDIR}"/intel-sync-i915_pciids.h-with-kernel.patch
+	epatch "${FILESDIR}"/new-intel-sync-i915_pciids.h-with-kernel.patch
+
+	xorg-2_src_prepare
+}
+
+src_configure() {
+	XORG_CONFIGURE_OPTIONS=(
+		--enable-install-test-programs
+		$(use_enable video_cards_amdgpu amdgpu)
+		$(use_enable video_cards_exynos exynos-experimental-api)
+		$(use_enable video_cards_freedreno freedreno)
+		$(use_enable video_cards_intel intel)
+		$(use_enable video_cards_nouveau nouveau)
+		$(use_enable video_cards_omap omap-experimental-api)
+		$(use_enable video_cards_radeon radeon)
+		$(use_enable video_cards_vc4 vc4)
+		$(use_enable video_cards_vmware vmwgfx)
+		$(use_enable libkms)
+		$(use_enable manpages)
+		$(use_enable udev)
+		--disable-cairo-tests
+	)
+	xorg-2_src_configure
+}
diff --git a/x11-libs/libdrm/libdrm-9999.ebuild b/x11-libs/libdrm/libdrm-9999.ebuild
index 9bcff2b..b0bfce4 100644
--- a/x11-libs/libdrm/libdrm-9999.ebuild
+++ b/x11-libs/libdrm/libdrm-9999.ebuild
@@ -47,6 +47,7 @@
 	epatch "${FILESDIR}"/CHROMIUM-add-resource-info-header.patch
 	epatch "${FILESDIR}"/FROMLIST-Add-drmModeGetFB2.patch
 	epatch "${FILESDIR}"/intel-sync-i915_pciids.h-with-kernel.patch
+	epatch "${FILESDIR}"/new-intel-sync-i915_pciids.h-with-kernel.patch
 
 	xorg-2_src_prepare
 }
diff --git a/x11-libs/libva-intel-driver/files/Handle-the-odd-resolution.patch b/x11-libs/libva-intel-driver/files/Handle-the-odd-resolution.patch
new file mode 100644
index 0000000..83552bd
--- /dev/null
+++ b/x11-libs/libva-intel-driver/files/Handle-the-odd-resolution.patch
@@ -0,0 +1,292 @@
+From ff75917843789febd93f84dd78f57b447d02707d Mon Sep 17 00:00:00 2001
+From: Haihao Xiang <haihao.xiang@intel.com>
+Date: Wed, 12 Aug 2020 14:24:55 +0800
+Subject: [PATCH] Handle the odd resolution
+
+Alignment calculation was missing in some places which caused
+greenline appearance while processing the odd dimension videos.
+
+https://github.com/intel/intel-vaapi-driver/issues/516
+---
+ src/gen8_post_processing.c | 24 +++++++++----------
+ src/gen9_post_processing.c | 24 +++++++++----------
+ src/i965_drv_video.c       | 48 +++++++++++++++++++-------------------
+ 3 files changed, 48 insertions(+), 48 deletions(-)
+
+diff --git a/src/gen8_post_processing.c b/src/gen8_post_processing.c
+index abddcd0..2163300 100644
+--- a/src/gen8_post_processing.c
++++ b/src/gen8_post_processing.c
+@@ -1909,17 +1909,17 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx,
+             fourcc == VA_FOURCC_BGRA) {
+             /* nothing to do here */
+         } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_surface->cb_cr_pitch;
+             bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset;
+         } else {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_surface->cb_cr_pitch;
+             bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset;
+-            width[2] = width[0] / 2;
+-            height[2] = height[0] / 2;
++            width[2] = ALIGN(width[0], 2) / 2;
++            height[2] = ALIGN(height[0], 2) / 2;
+             pitch[2] = obj_surface->cb_cr_pitch;
+             bo_offset[2] = obj_surface->width * obj_surface->y_cr_offset;
+         }
+@@ -1940,8 +1940,8 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx,
+             fourcc == VA_FOURCC_BGRA) {
+             /* nothing to do here */
+         } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_image->image.pitches[1];
+             bo_offset[1] = obj_image->image.offsets[1];
+         } else {
+@@ -1950,12 +1950,12 @@ gen8_pp_context_get_surface_conf(VADriverContextP ctx,
+             if (fourcc == VA_FOURCC_YV12 || fourcc == VA_FOURCC_IMC1)
+                 u = 2, v = 1;
+ 
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_image->image.pitches[u];
+             bo_offset[1] = obj_image->image.offsets[u];
+-            width[2] = width[0] / 2;
+-            height[2] = height[0] / 2;
++            width[2] = ALIGN(width[0], 2) / 2;
++            height[2] = ALIGN(height[0], 2) / 2;
+             pitch[2] = obj_image->image.pitches[v];
+             bo_offset[2] = obj_image->image.offsets[v];
+         }
+diff --git a/src/gen9_post_processing.c b/src/gen9_post_processing.c
+index eede36f..da36f2a 100644
+--- a/src/gen9_post_processing.c
++++ b/src/gen9_post_processing.c
+@@ -731,19 +731,19 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx,
+             fourcc == VA_FOURCC_BGRA) {
+             /* nothing to do here */
+         } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_surface->cb_cr_pitch;
+             bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset;
+         } else if (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY) {
+             /* nothing to do here */
+         } else {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_surface->cb_cr_pitch;
+             bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset;
+-            width[2] = width[0] / 2;
+-            height[2] = height[0] / 2;
++            width[2] = ALIGN(width[0], 2) / 2;
++            height[2] = ALIGN(height[0], 2) / 2;
+             pitch[2] = obj_surface->cb_cr_pitch;
+             bo_offset[2] = obj_surface->width * obj_surface->y_cr_offset;
+         }
+@@ -764,8 +764,8 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx,
+             fourcc == VA_FOURCC_BGRA) {
+             /* nothing to do here */
+         } else if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) {
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_image->image.pitches[1];
+             bo_offset[1] = obj_image->image.offsets[1];
+         } else if (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY) {
+@@ -776,12 +776,12 @@ gen9_pp_context_get_surface_conf(VADriverContextP ctx,
+             if (fourcc == VA_FOURCC_YV12 || fourcc == VA_FOURCC_IMC1)
+                 u = 2, v = 1;
+ 
+-            width[1] = width[0] / 2;
+-            height[1] = height[0] / 2;
++            width[1] = ALIGN(width[0], 2) / 2;
++            height[1] = ALIGN(height[0], 2) / 2;
+             pitch[1] = obj_image->image.pitches[u];
+             bo_offset[1] = obj_image->image.offsets[u];
+-            width[2] = width[0] / 2;
+-            height[2] = height[0] / 2;
++            width[2] = ALIGN(width[0], 2) / 2;
++            height[2] = ALIGN(height[0], 2) / 2;
+             pitch[2] = obj_image->image.pitches[v];
+             bo_offset[2] = obj_image->image.offsets[v];
+         }
+diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
+index ff16388..80278bb 100644
+--- a/src/i965_drv_video.c
++++ b/src/i965_drv_video.c
+@@ -1725,8 +1725,8 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->subsampling = SUBSAMPLE_YUV420;
+         obj_surface->y_cb_offset = obj_surface->height;
+         obj_surface->y_cr_offset = obj_surface->height;
+-        obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-        obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++        obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++        obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+         if (tiling)
+             ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER);
+@@ -1743,8 +1743,8 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->subsampling = SUBSAMPLE_YUV420;
+         obj_surface->y_cr_offset = obj_surface->height;
+         obj_surface->y_cb_offset = memory_attibute->offsets[2] / obj_surface->width;
+-        obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-        obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++        obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++        obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+ 
+         if (tiling)
+@@ -1764,8 +1764,8 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->subsampling = SUBSAMPLE_YUV420;
+         obj_surface->y_cb_offset = obj_surface->height;
+         obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width;
+-        obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-        obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++        obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++        obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+         if (tiling)
+             ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER);
+@@ -1837,7 +1837,7 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->subsampling = SUBSAMPLE_YUV422H;
+         obj_surface->y_cb_offset = obj_surface->height;
+         obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width;
+-        obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++        obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+         obj_surface->cb_cr_height = obj_surface->orig_height;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+         if (tiling)
+@@ -1854,7 +1854,7 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->subsampling = SUBSAMPLE_YUV422H;
+         obj_surface->y_cr_offset = memory_attibute->offsets[1] / obj_surface->width;
+         obj_surface->y_cb_offset = memory_attibute->offsets[2] / obj_surface->width;
+-        obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++        obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+         obj_surface->cb_cr_height = obj_surface->orig_height;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+         ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, i965->codec_info->min_linear_wpitch), VA_STATUS_ERROR_INVALID_PARAMETER);
+@@ -1869,7 +1869,7 @@ i965_suface_external_memory(VADriverContextP ctx,
+         obj_surface->y_cb_offset = obj_surface->height;
+         obj_surface->y_cr_offset = memory_attibute->offsets[2] / obj_surface->width;
+         obj_surface->cb_cr_width = obj_surface->orig_width;
+-        obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++        obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+         obj_surface->cb_cr_pitch = memory_attibute->pitches[1];
+         if (tiling)
+             ASSERT_RET(IS_ALIGNED(obj_surface->cb_cr_pitch, 128), VA_STATUS_ERROR_INVALID_PARAMETER);
+@@ -4526,8 +4526,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_P010:
+             assert(subsampling == SUBSAMPLE_YUV420);
+             obj_surface->cb_cr_pitch = obj_surface->width;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->height;
+             region_width = obj_surface->width;
+@@ -4538,8 +4538,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_IMC1:
+             assert(subsampling == SUBSAMPLE_YUV420);
+             obj_surface->cb_cr_pitch = obj_surface->width;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->y_cr_offset = obj_surface->height;
+             obj_surface->y_cb_offset = obj_surface->y_cr_offset + ALIGN(obj_surface->cb_cr_height, 32);
+             region_width = obj_surface->width;
+@@ -4550,8 +4550,8 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_IMC3:
+             assert(subsampling == SUBSAMPLE_YUV420);
+             obj_surface->cb_cr_pitch = obj_surface->width;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32);
+             region_width = obj_surface->width;
+@@ -4562,7 +4562,7 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_422H:
+             assert(subsampling == SUBSAMPLE_YUV422H);
+             obj_surface->cb_cr_pitch = obj_surface->width;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+             obj_surface->cb_cr_height = obj_surface->orig_height;
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32);
+@@ -4575,7 +4575,7 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+             assert(subsampling == SUBSAMPLE_YUV422V);
+             obj_surface->cb_cr_pitch = obj_surface->width;
+             obj_surface->cb_cr_width = obj_surface->orig_width;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->y_cb_offset + ALIGN(obj_surface->cb_cr_height, 32);
+             region_width = obj_surface->width;
+@@ -4663,17 +4663,17 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_P010:
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->height;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+             obj_surface->width = ALIGN(obj_surface->cb_cr_width * 2, i965->codec_info->min_linear_wpitch) *
+                                  bpp_1stplane;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->cb_cr_pitch = obj_surface->width;
+             region_width = obj_surface->width;
+             region_height = obj_surface->height + obj_surface->height / 2;
+             break;
+ 
+         case VA_FOURCC_YV16:
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+             obj_surface->width = ALIGN(obj_surface->cb_cr_width, i965->codec_info->min_linear_wpitch) * 2;
+             obj_surface->cb_cr_height = obj_surface->orig_height;
+             obj_surface->y_cr_offset = obj_surface->height;
+@@ -4694,9 +4694,9 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+                 obj_surface->y_cr_offset = obj_surface->height + obj_surface->height / 4;
+             }
+ 
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+             obj_surface->width = ALIGN(obj_surface->cb_cr_width, i965->codec_info->min_linear_wpitch) * 2;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_height = ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->cb_cr_pitch = obj_surface->width / 2;
+             region_width = obj_surface->width;
+             region_height = obj_surface->height + obj_surface->height / 2;
+@@ -4705,9 +4705,9 @@ i965_check_alloc_surface_bo(VADriverContextP ctx,
+         case VA_FOURCC_I010:
+             obj_surface->y_cb_offset = obj_surface->height;
+             obj_surface->y_cr_offset = obj_surface->height + obj_surface->height / 4;
+-            obj_surface->cb_cr_width = obj_surface->orig_width / 2;
++            obj_surface->cb_cr_width = ALIGN(obj_surface->orig_width, 2) / 2;
+             obj_surface->width = ALIGN(obj_surface->cb_cr_width * 2, i965->codec_info->min_linear_wpitch) * 2;
+-            obj_surface->cb_cr_height = obj_surface->orig_height / 2;
++            obj_surface->cb_cr_height =ALIGN(obj_surface->orig_height, 2) / 2;
+             obj_surface->cb_cr_pitch = obj_surface->width / 2;
+             region_width = obj_surface->width;
+             region_height = obj_surface->height + obj_surface->height / 2;
+-- 
+2.25.1
+
diff --git a/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0-r7.ebuild b/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0-r9.ebuild
similarity index 100%
rename from x11-libs/libva-intel-driver/libva-intel-driver-2.3.0-r7.ebuild
rename to x11-libs/libva-intel-driver/libva-intel-driver-2.3.0-r9.ebuild
diff --git a/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0.ebuild b/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0.ebuild
index a6f1cd0..e798ae3 100644
--- a/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0.ebuild
+++ b/x11-libs/libva-intel-driver/libva-intel-driver-2.3.0.ebuild
@@ -30,12 +30,11 @@
 else
 	KEYWORDS=""
 fi
-IUSE="+drm wayland X hybrid_codec"
+IUSE="hybrid_codec"
 
-RDEPEND=">=x11-libs/libva-2.1.0[X?,wayland?,drm?]
+RDEPEND=">=x11-libs/libva-2.1.0
 	>=x11-libs/libdrm-2.4.46[video_cards_intel]
-	hybrid_codec? ( media-libs/intel-hybrid-driver )
-	wayland? ( >=media-libs/mesa-9.1.6[egl] >=dev-libs/wayland-1.0.6 )"
+	hybrid_codec? ( media-libs/intel-hybrid-driver )"
 
 DEPEND="${RDEPEND}
 	virtual/pkgconfig"
@@ -58,6 +57,7 @@
 	epatch "${FILESDIR}"/gen9_vp9_encoder-Ensure-brc-reset-irrespective-of-th.patch
 	epatch "${FILESDIR}"/0001-Remove-blitter-usage-from-driver.patch
 	epatch "${FILESDIR}"/gen9_vp9_encoder-Relax-the-compressed-frames-minimum.patch
+	epatch "${FILESDIR}"/Handle-the-odd-resolution.patch
 
 	sed -e 's/intel-gen4asm/\0diSaBlEd/g' -i configure.ac || die
 	autotools-multilib_src_prepare
@@ -65,10 +65,9 @@
 
 multilib_src_configure() {
 	local myeconfargs=(
-		$(use_enable drm)
-		$(use_enable wayland)
-		$(use_enable X x11)
-		$(use_enable hybrid_codec)
+		--disable-wayland
+		--disable-x11
+		"$(use_enable hybrid_codec)"
 	)
 	autotools-utils_src_configure
 }
diff --git a/x11-libs/libva-intel-media-driver/Manifest b/x11-libs/libva-intel-media-driver/Manifest
index 143f231..e5872ce 100644
--- a/x11-libs/libva-intel-media-driver/Manifest
+++ b/x11-libs/libva-intel-media-driver/Manifest
@@ -1 +1 @@
-DIST intel-media-19.4.0r.tar.gz 20827548 BLAKE2B 771b5e13896f5614623d9a86361be61680da5e82575df696775625b50a7766df5c2a36488f9c164b069634beee80ee1e5aa461b9fd2f531136408d386cf98223 SHA512 6235ea81aba81da10b9dcd7e799f29ceb1737ae1b60ae7c6e1055619dafed2620a538e7da7d36b17fe0b6d209a39a02aa31ac1445051ba80a4c62b29b0f90691
+DIST intel-media-20.2.0.tar.gz 21860711 BLAKE2B df5ebb4ec603902dd34aca6915dab5bec4ad6237e5810d0e04349f7269adf62505afaed8456d1ad6a3544525bdb2012294e6b92e68dc3f0338f6fab54aa934bd SHA512 0f4817b66f4e2d752d5a34cc1c8974dd09b4fe4f6d8bf3df896887542c229088edc406a9b2a68a9b353214aa7ffa4cd8917cdb6695dbe2e316af6c444822b15b
diff --git a/x11-libs/libva-intel-media-driver/files/0001-Disable-IPC-usage.patch b/x11-libs/libva-intel-media-driver/files/0001-Disable-IPC-usage.patch
new file mode 100644
index 0000000..2d39a7c
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0001-Disable-IPC-usage.patch
@@ -0,0 +1,43 @@
+From 4b634b15a5f062530a960df0d7ca2fe29bfc0178 Mon Sep 17 00:00:00 2001
+From: Yu Kang Ku <yu.kang.ku@intel.com>
+Date: Fri, 18 Oct 2019 15:02:42 -0700
+Subject: [PATCH] Disable IPC usage
+
+This allows iHD to be used within the Chrome OS sandbox.
+
+Change-Id: I7c9d438ab7072bbeb35b295a624b71e310ade6f7
+Signed-off-by: Yu Kang Ku <yu.kang.ku@intel.com>
+---
+ media_driver/linux/common/os/mos_context_specific.cpp | 2 ++
+ media_driver/linux/common/os/mos_os_specific.c        | 2 ++
+ 2 files changed, 4 insertions(+)
+
+diff --git a/media_driver/linux/common/os/mos_context_specific.cpp b/media_driver/linux/common/os/mos_context_specific.cpp
+index 29de3aa7..701492a7 100644
+--- a/media_driver/linux/common/os/mos_context_specific.cpp
++++ b/media_driver/linux/common/os/mos_context_specific.cpp
+@@ -32,6 +32,8 @@
+ #include "hwinfo_linux.h"
+ #include <stdlib.h>
+ 
++#define ANDROID 1
++
+ #ifndef ANDROID
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+diff --git a/media_driver/linux/common/os/mos_os_specific.c b/media_driver/linux/common/os/mos_os_specific.c
+index f3a7deee..4e0a9ce3 100644
+--- a/media_driver/linux/common/os/mos_os_specific.c
++++ b/media_driver/linux/common/os/mos_os_specific.c
+@@ -50,6 +50,8 @@
+ #endif // MOS_MEDIASOLO_SUPPORTED
+ #include "mos_solo_generic.h"
+ 
++#define ANDROID 1
++
+ #ifndef ANDROID
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+-- 
+2.26.2
+
diff --git a/x11-libs/libva-intel-media-driver/files/0001-Encoder-VP8-GEN9-GEN10-GEN11-Ensure-forced_lf_adjust.patch b/x11-libs/libva-intel-media-driver/files/0001-Encoder-VP8-GEN9-GEN10-GEN11-Ensure-forced_lf_adjust.patch
deleted file mode 100644
index d2a42bd..0000000
--- a/x11-libs/libva-intel-media-driver/files/0001-Encoder-VP8-GEN9-GEN10-GEN11-Ensure-forced_lf_adjust.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 65951713d30653f94b144a06343591486b9decbe Mon Sep 17 00:00:00 2001
-From: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
-Date: Tue, 3 Sep 2019 12:08:18 -0800
-Subject: [PATCH 1/3] Encoder: VP8: GEN9/GEN10/GEN11: Ensure
- forced_lf_adjustment update in media kernel
-
-Ensure the submission of forced_lf_adjustment in mode probablity
-update kernel curbe for gen9, gen10 and gen11.This will help to fix
-the ffmpeg decoder output md5 mismatch with vpxdec for
-the Intel encoded video samples.
-
-Reported, Tested and Verified by Hirokazu Honda<hiroh@google.com>
----
- media_driver/agnostic/gen10/codec/hal/codechal_encode_vp8_g10.cpp | 1 +
- media_driver/agnostic/gen11/codec/hal/codechal_encode_vp8_g11.cpp | 1 +
- media_driver/agnostic/gen9/codec/hal/codechal_encode_vp8_g9.cpp   | 1 +
- 3 files changed, 3 insertions(+)
-
-diff --git a/media_driver/agnostic/gen10/codec/hal/codechal_encode_vp8_g10.cpp b/media_driver/agnostic/gen10/codec/hal/codechal_encode_vp8_g10.cpp
-index 4c96cac..c73bddd 100644
---- a/media_driver/agnostic/gen10/codec/hal/codechal_encode_vp8_g10.cpp
-+++ b/media_driver/agnostic/gen10/codec/hal/codechal_encode_vp8_g10.cpp
-@@ -7839,6 +7839,7 @@ MOS_STATUS CodechalEncodeVp8G10::SetMpuCurbe(struct CodechalVp8MpuCurbeParams* p
-     cmd.DW1.SharpnessLevel = picParams->sharpness_level;
-     cmd.DW1.LoopFilterAdjustmentOn = picParams->loop_filter_adj_enable;
-     cmd.DW1.MBNoCoeffiscientSkip = picParams->mb_no_coeff_skip;
-+    cmd.DW1.ForcedLFUpdateForKeyFrame = picParams->forced_lf_adjustment;
- 
-     // DDI spec is not mapping to codechal directly. It should be mapping as below
-     if (picParams->refresh_golden_frame == 1)
-diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_encode_vp8_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_encode_vp8_g11.cpp
-index 1b2f9da..25a2052 100644
---- a/media_driver/agnostic/gen11/codec/hal/codechal_encode_vp8_g11.cpp
-+++ b/media_driver/agnostic/gen11/codec/hal/codechal_encode_vp8_g11.cpp
-@@ -8548,6 +8548,7 @@ MOS_STATUS CodechalEncodeVp8G11::SetMpuCurbe(struct CodechalVp8MpuCurbeParams* p
-     cmd.DW1.SharpnessLevel = picParams->sharpness_level;
-     cmd.DW1.LoopFilterAdjustmentOn = picParams->loop_filter_adj_enable;
-     cmd.DW1.MBNoCoeffiscientSkip = picParams->mb_no_coeff_skip;
-+    cmd.DW1.ForcedLFUpdateForKeyFrame = picParams->forced_lf_adjustment;
- 
-     // DDI spec is not mapping to codechal directly. It should be mapping as below
-     if (picParams->refresh_golden_frame == 1)
-diff --git a/media_driver/agnostic/gen9/codec/hal/codechal_encode_vp8_g9.cpp b/media_driver/agnostic/gen9/codec/hal/codechal_encode_vp8_g9.cpp
-index 0a2df79..3a0a6a9 100644
---- a/media_driver/agnostic/gen9/codec/hal/codechal_encode_vp8_g9.cpp
-+++ b/media_driver/agnostic/gen9/codec/hal/codechal_encode_vp8_g9.cpp
-@@ -7839,6 +7839,7 @@ MOS_STATUS CodechalEncodeVp8G9::SetMpuCurbe(struct CodechalVp8MpuCurbeParams* pa
-     cmd.DW1.SharpnessLevel = picParams->sharpness_level;
-     cmd.DW1.LoopFilterAdjustmentOn = picParams->loop_filter_adj_enable;
-     cmd.DW1.MBNoCoeffiscientSkip = picParams->mb_no_coeff_skip;
-+    cmd.DW1.ForcedLFUpdateForKeyFrame = picParams->forced_lf_adjustment;
- 
-     // DDI spec is not mapping to codechal directly. It should be mapping as below
-     if (picParams->refresh_golden_frame == 1)
--- 
-2.7.4
-
diff --git a/x11-libs/libva-intel-media-driver/files/0002-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch b/x11-libs/libva-intel-media-driver/files/0002-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
new file mode 100644
index 0000000..aef1d11
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0002-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
@@ -0,0 +1,36 @@
+From 07342e3b1a96f2a36cd5009df8fea85894b914c6 Mon Sep 17 00:00:00 2001
+From: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+Date: Fri, 12 Jun 2020 13:57:51 -0700
+Subject: [PATCH] Decoder: VP9: GEN9: Disable HPR VP9 mode switch to avoid GPU
+ hang
+
+Without having the HprVp9ModeSwitchEco disabled, the gen9 devices
+cause gpu to hang while decoding tiled 4k vp9 streams for a
+longer period. This particular chicken bit has been set in the
+legacy i965 driver to avoid random gpu hangs.
+
+Fixes #974
+
+(cherry picked from commit 6463097cedfd5926f1ae178d1b81780ad864e0db)
+---
+ .../agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp       | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
+index ca57f073..ebb8896a 100644
+--- a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
++++ b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
+@@ -275,6 +275,10 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpPipeModeSelectCmd(
+ 
+     m_cpInterface->SetProtectionSettingsForMfxPipeModeSelect((uint32_t *)cmd);
+ 
++    // Without having the HprVp9ModeSwitchEco disabled, the gen9 devices
++    // cause gpu to hang while decoding tiled 4k vp9 streams
++    cmd->DW4.HprVp9ModeSwitchEcoDisable = 1;
++
+     cmd->DW1.PakPipelineStreamoutEnable = params->bStreamOutEnabled;
+     cmd->DW1.AdvancedRateControlEnable = params->bAdvancedRateControlEnable;
+ 
+-- 
+2.26.2
+
diff --git a/x11-libs/libva-intel-media-driver/files/0002-Disable-IPC-usage.patch b/x11-libs/libva-intel-media-driver/files/0002-Disable-IPC-usage.patch
deleted file mode 100644
index 932c898..0000000
--- a/x11-libs/libva-intel-media-driver/files/0002-Disable-IPC-usage.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 352fb767e74db78cef9430adfd2acaa02f823541 Mon Sep 17 00:00:00 2001
-From: Yu Kang Ku <yu.kang.ku@intel.com>
-Date: Fri, 18 Oct 2019 15:02:42 -0700
-Subject: [PATCH 2/3] Disable IPC usage
-
-This allows iHD to be used within the Chrome OS sandbox.
-
-Change-Id: I7c9d438ab7072bbeb35b295a624b71e310ade6f7
-Signed-off-by: Yu Kang Ku <yu.kang.ku@intel.com>
----
- media_driver/linux/common/os/mos_context_specific.cpp | 2 ++
- media_driver/linux/common/os/mos_os_specific.c        | 2 ++
- 2 files changed, 4 insertions(+)
-
-diff --git a/media_driver/linux/common/os/mos_context_specific.cpp b/media_driver/linux/common/os/mos_context_specific.cpp
-index 315bd03..d49d23c 100644
---- a/media_driver/linux/common/os/mos_context_specific.cpp
-+++ b/media_driver/linux/common/os/mos_context_specific.cpp
-@@ -32,6 +32,8 @@
- #include "hwinfo_linux.h"
- #include <stdlib.h>
- 
-+#define ANDROID 1
-+
- #ifndef ANDROID
- #include <sys/ipc.h>
- #include <sys/shm.h>
-diff --git a/media_driver/linux/common/os/mos_os_specific.c b/media_driver/linux/common/os/mos_os_specific.c
-index 2213d24..20ef433 100644
---- a/media_driver/linux/common/os/mos_os_specific.c
-+++ b/media_driver/linux/common/os/mos_os_specific.c
-@@ -50,6 +50,8 @@
- #endif // MOS_MEDIASOLO_SUPPORTED
- #include "mos_solo_generic.h"
- 
-+#define ANDROID 1
-+
- #ifndef ANDROID
- #include <sys/ipc.h>
- #include <sys/shm.h>
--- 
-2.7.4
-
diff --git a/x11-libs/libva-intel-media-driver/files/0003-ENCODE-change-slice-header-prefix-for-AVC-Vdenc.patch b/x11-libs/libva-intel-media-driver/files/0003-ENCODE-change-slice-header-prefix-for-AVC-Vdenc.patch
new file mode 100644
index 0000000..8d42c94
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0003-ENCODE-change-slice-header-prefix-for-AVC-Vdenc.patch
@@ -0,0 +1,28 @@
+From f35dfea06a622513645b6725f57b46badaa0a937 Mon Sep 17 00:00:00 2001
+From: Abhishek Kumar <abhishek4.kumar@intel.com>
+Date: Fri, 12 Jun 2020 11:29:18 +0530
+Subject: [PATCH] [ENCODE] change slice header prefix for AVC Vdenc
+
+Currently in case of Vdenc slice header prefix is 0x000001 (3bytes)
+and in case of VME it is 0x00000001 (4 bytes) , so change slice header
+prefix to 4 bytes for vdenc(same as i965 driver).
+---
+ media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
+index 840fbd898a00..604519bc7fad 100644
+--- a/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
++++ b/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
+@@ -1763,7 +1763,7 @@ MOS_STATUS CodecHalAvcEncode_PackSliceHeader(
+     // zero byte shall exist when the byte stream NAL unit syntax structure contains the first
+     // NAL unit of an access unit in decoding order, as specified by subclause 7.4.1.2.3.
+     // VDEnc Slice header packing handled by PAK does not need the 0 byte inserted
+-    if (params->UserFlags.bDisableAcceleratorHeaderPacking && (!params->bVdencEnabled))
++    if (params->UserFlags.bDisableAcceleratorHeaderPacking)
+     {
+         *bsbuffer->pCurrent = 0;
+         bsbuffer->pCurrent++;
+-- 
+2.7.4
+
diff --git a/x11-libs/libva-intel-media-driver/files/0003-Partially-revert-VP-Fix-aux-mapping-issue.patch b/x11-libs/libva-intel-media-driver/files/0003-Partially-revert-VP-Fix-aux-mapping-issue.patch
deleted file mode 100644
index 6d9959a..0000000
--- a/x11-libs/libva-intel-media-driver/files/0003-Partially-revert-VP-Fix-aux-mapping-issue.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 77f3ef9bc32b4aca626a5c711ff94aba28852edf Mon Sep 17 00:00:00 2001
-From: Yu Kang Ku <yu.kang.ku@intel.com>
-Date: Mon, 20 Jan 2020 17:22:48 -0800
-Subject: [PATCH 3/3] Partially revert "[VP] Fix aux mapping issue"
-
-This partially reverts commit df5c37ee919a4305f09203bf1bca4bd65a653c94 by
-restoring the change associated with the setting of WaAuxTable16KGranular
-in media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp.
-
-This is a temporary workaround for addressing a video hardware decoding
-regression observed on Chrome OS on Gen12.
----
- media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp b/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
-index fa2b83c..785100b 100644
---- a/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
-+++ b/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
-@@ -146,6 +146,15 @@ static bool InitTglShadowWa(struct GfxDeviceInfo *devInfo,
-     waTable->WaDisregardPlatformChecks          = 1;
-     waTable->Wa4kAlignUVOffsetNV12LinearSurface = 1;
- 
-+    // Set it to 0 if GMM support 64K AuxTable
-+    MOS_USER_FEATURE_VALUE_DATA userFeatureData;
-+    MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
-+    MOS_UserFeature_ReadValue_ID(
-+        nullptr,
-+        __MEDIA_USER_FEATURE_VALUE_AUX_TABLE_16K_GRANULAR_ID,
-+        &userFeatureData);
-+    waTable->WaAuxTable16KGranular = (userFeatureData.i32Data) ? 1 : 0;
-+
-     // Set it to 1 if need to support 256B compress mode
-     waTable->WaLimit128BMediaCompr = 1;
- 
--- 
-2.7.4
-
diff --git a/x11-libs/libva-intel-media-driver/files/0004-Disable-IPC-in-media-driver-next.patch b/x11-libs/libva-intel-media-driver/files/0004-Disable-IPC-in-media-driver-next.patch
new file mode 100644
index 0000000..4505e4e
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0004-Disable-IPC-in-media-driver-next.patch
@@ -0,0 +1,72 @@
+From b12453327d950e0ad23af13f4157d96d0165e278 Mon Sep 17 00:00:00 2001
+From: Sushma Venkatesh Reddy <sushma.venkatesh.reddy@intel.com>
+Date: Thu, 23 Jul 2020 11:32:16 -0700
+Subject: [PATCH] Disable IPC in media driver next
+
+TGL uses media_driver_next code so, to suffice Chrome OS sandbox
+requirements we have to disable IPC on the files related to this.
+Without this patch we are seeing, fallback to software.
+
+It's not necessary to land this change upstream because the IPC code on
+mos_context_specific_next.cpp has been removed as of
+https://github.com/intel/media-driver/commit/b72eea6d22594441187dc4439e2ab760eaf77d2b.
+Therefore, this patch should be unnecessary in the next iHD uprev.
+
+Signed-off-by: Sushma Venkatesh Reddy <sushma.venkatesh.reddy@intel.com>
+---
+ .../common/os/mos_context_specific_next.cpp   | 32 -------------------
+ 1 file changed, 32 deletions(-)
+
+diff --git a/media_driver/media_driver_next/linux/common/os/mos_context_specific_next.cpp b/media_driver/media_driver_next/linux/common/os/mos_context_specific_next.cpp
+index 7c3a4409c05f..cfc628bfded5 100644
+--- a/media_driver/media_driver_next/linux/common/os/mos_context_specific_next.cpp
++++ b/media_driver/media_driver_next/linux/common/os/mos_context_specific_next.cpp
+@@ -514,32 +514,6 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext)
+             return MOS_STATUS_UNKNOWN;
+         }
+ 
+-        if ((m_gtSystemInfo.VDBoxInfo.IsValid) && (m_gtSystemInfo.VDBoxInfo.NumberOfVDBoxEnabled > 1))
+-        {
+-            m_kmdHasVCS2 = true;
+-        }
+-        else
+-        {
+-            m_kmdHasVCS2 = false;
+-        }
+-    
+-        if (m_kmdHasVCS2)
+-        {
+-            eStatus = CreateIPC();
+-            if (eStatus != MOS_STATUS_SUCCESS)
+-            {
+-                MOS_OS_ASSERTMESSAGE("Fatal error - create IPC failed");
+-                return eStatus;
+-            }
+-        }
+-    
+-        eStatus = CreateSSEUIPC();
+-        if (eStatus != MOS_STATUS_SUCCESS)
+-        {
+-            MOS_OS_ASSERTMESSAGE("Fatal error - Failed to create shared memory for SSEU configuration.");
+-            return eStatus;
+-        }
+-    
+         m_transcryptedKernels       = nullptr;
+         m_transcryptedKernelsSize   = 0;
+ 
+@@ -596,12 +570,6 @@ void OsContextSpecificNext::Destroy()
+             m_auxTableMgr = nullptr;
+         }
+ 
+-        if (m_kmdHasVCS2)
+-        {
+-            DestroyIPC();
+-        }
+-        DestroySSEUIPC();
+-
+         m_skuTable.reset();
+         m_waTable.reset();
+         if (m_intelContext && m_intelContext->vm)
+-- 
+2.20.1
+
diff --git a/x11-libs/libva-intel-media-driver/files/0004-Fix-Clang-Warning.patch b/x11-libs/libva-intel-media-driver/files/0004-Fix-Clang-Warning.patch
deleted file mode 100644
index e8ddabd..0000000
--- a/x11-libs/libva-intel-media-driver/files/0004-Fix-Clang-Warning.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Fix "-Wrange-loop-construct" warning in clang,
-https://crbug.com/1047863
-
-diff --git a/media_driver/agnostic/common/os/mos_utilities.c b/media_driver/agnostic/common/os/mos_utilities.c
-index 3dbdbdb..d8a5d6b 100644
---- a/media_driver/agnostic/common/os/mos_utilities.c
-+++ b/media_driver/agnostic/common/os/mos_utilities.c
-@@ -70,7 +70,7 @@ PerfUtility::PerfUtility()
- 
- PerfUtility::~PerfUtility()
- {
--    for (const auto data : records)
-+    for (const auto& data : records)
-     {
-         if (data.second)
-         {
diff --git a/x11-libs/libva-intel-media-driver/files/0005-Media-Common-Enable-new-device-config-for-EHL.patch b/x11-libs/libva-intel-media-driver/files/0005-Media-Common-Enable-new-device-config-for-EHL.patch
new file mode 100644
index 0000000..0c66616
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0005-Media-Common-Enable-new-device-config-for-EHL.patch
@@ -0,0 +1,56 @@
+From 2084a7cbb267d24696f0185c304f2a2083141155 Mon Sep 17 00:00:00 2001
+From: Dai_Haichun <haichun.dai@intel.com>
+Date: Mon, 27 Jul 2020 20:28:16 +0800
+Subject: [PATCH] [Media Common] Enable new device config for EHL
+
+Enable new device config for EHL 0x4555/0x4e55
+
+Change-Id: I33be8731a77b8494a9092b5e7194d6487c76b9f7
+---
+ media_driver/linux/gen11/ddi/media_sysinfo_g11.cpp | 25 ++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+diff --git a/media_driver/linux/gen11/ddi/media_sysinfo_g11.cpp b/media_driver/linux/gen11/ddi/media_sysinfo_g11.cpp
+index 41d35a9e283e..a649c54c8354 100644
+--- a/media_driver/linux/gen11/ddi/media_sysinfo_g11.cpp
++++ b/media_driver/linux/gen11/ddi/media_sysinfo_g11.cpp
+@@ -338,6 +338,25 @@ static struct GfxDeviceInfo ehlDevInfo = {
+     .InitShadowSku    = InitEhlShadowSku,
+     .InitShadowWa     = InitEhlShadowWa,
+ };
++static struct GfxDeviceInfo ehlDevInfo16EU = {
++    .platformType  = PLATFORM_MOBILE,
++    .productFamily = IGFX_ELKHARTLAKE,
++    .displayFamily = IGFX_GEN11_CORE,
++    .renderFamily  = IGFX_GEN11_CORE,
++    .eGTType       = GTTYPE_GT1,
++    .L3CacheSizeInKb = 1280,
++    .L3BankCount   = 4,
++    .EUCount       = 16,
++    .SliceCount    = 1,
++    .SubSliceCount = 2,
++    .MaxEuPerSubSlice = 8,
++    .isLCIA        = 0,
++    .hasLLC        = 1,
++    .hasERAM       = 0,
++    .InitMediaSysInfo = InitEhlMediaSysInfo,
++    .InitShadowSku    = InitEhlShadowSku,
++    .InitShadowWa     = InitEhlShadowWa,
++};
+ 
+ static bool icllpDeviceff05 = DeviceInfoFactory<GfxDeviceInfo>::
+     RegisterDevice(0xff05, &icllpGt1Info);
+@@ -404,3 +423,9 @@ static bool ehlDevice4E61 = DeviceInfoFactory<GfxDeviceInfo>::
+ 
+ static bool ehlDevice4E71 = DeviceInfoFactory<GfxDeviceInfo>::
+     RegisterDevice(0x4E71, &ehlDevInfo);
++
++static bool ehlDevice4E55 = DeviceInfoFactory<GfxDeviceInfo>::
++    RegisterDevice(0x4E55, &ehlDevInfo16EU);
++
++static bool ehlDevice4555 = DeviceInfoFactory<GfxDeviceInfo>::
++    RegisterDevice(0x4555, &ehlDevInfo16EU);
+\ No newline at end of file
+-- 
+2.7.4
+
diff --git a/x11-libs/libva-intel-media-driver/files/0005-use-gmmlib-calculate-the-NV12-surface-offset.patch b/x11-libs/libva-intel-media-driver/files/0005-use-gmmlib-calculate-the-NV12-surface-offset.patch
deleted file mode 100644
index ffa3c64..0000000
--- a/x11-libs/libva-intel-media-driver/files/0005-use-gmmlib-calculate-the-NV12-surface-offset.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From aa07915439e730243726c7fca7d1f9f298cea8fb Mon Sep 17 00:00:00 2001
-From: XinfengZhang <carl.zhang@intel.com>
-Date: Wed, 1 Apr 2020 09:43:13 -0700
-Subject: [PATCH] use gmmlib calculate the NV12 surface offset
-
-should apply similiar changes for other planar format in near future
-it is quick fix for chromium encoding issue
-
-Signed-off-by: XinfengZhang <carl.zhang@intel.com>
----
- media_driver/linux/common/ddi/media_libva.cpp | 40 +++++++++++--------
- 1 file changed, 23 insertions(+), 17 deletions(-)
-
-diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
-index c80f0e70e50c..284908f575c2 100755
---- a/media_driver/linux/common/ddi/media_libva.cpp
-+++ b/media_driver/linux/common/ddi/media_libva.cpp
-@@ -4177,12 +4177,24 @@ VAStatus DdiMedia_DeriveImage (
-     vaimg->height                   = mediaSurface->iRealHeight;
-     vaimg->format.byte_order        = VA_LSB_FIRST;
- 
-+    GMM_RESOURCE_INFO          *gmmResourceInfo = mediaSurface->pGmmResourceInfo;
-+    GMM_REQ_OFFSET_INFO reqInfo     = {0};
-+    reqInfo.Plane                   = GMM_PLANE_U;
-+    reqInfo.ReqRender               = 1;
-+    gmmResourceInfo->GetOffset(reqInfo);
-+    uint32_t offsetU                = reqInfo.Render.Offset;
-+    MOS_ZeroMemory(&reqInfo, sizeof(GMM_REQ_OFFSET_INFO));
-+    reqInfo.Plane                   = GMM_PLANE_V;
-+    reqInfo.ReqRender               = 1;
-+    gmmResourceInfo->GetOffset(reqInfo);
-+    uint32_t offsetV                = reqInfo.Render.Offset;
-+    vaimg->data_size                = (uint32_t)gmmResourceInfo->GetSizeSurface();
-+
-     switch( mediaSurface->format )
-     {
-     case Media_Format_YV12:
-     case Media_Format_I420:
-         vaimg->format.bits_per_pixel    = 12;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->pitches[1]               =
-@@ -4196,7 +4208,6 @@ VAStatus DdiMedia_DeriveImage (
-     case Media_Format_A8R8G8B8:
-         vaimg->format.bits_per_pixel    = 32;
-         vaimg->format.alpha_mask        = RGB_8BIT_ALPHAMASK;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-@@ -4204,7 +4215,6 @@ VAStatus DdiMedia_DeriveImage (
-     case Media_Format_X8R8G8B8:
-     case Media_Format_X8B8G8R8:
-         vaimg->format.bits_per_pixel    = 32;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-@@ -4213,13 +4223,11 @@ VAStatus DdiMedia_DeriveImage (
-     case Media_Format_B10G10R10A2:
-         vaimg->format.bits_per_pixel    = 32;
-         vaimg->format.alpha_mask        = RGB_10BIT_ALPHAMASK;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-         break;
-     case Media_Format_R5G6B5:
--        vaimg->format.bits_per_pixel    = 16;
-         vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-@@ -4227,7 +4235,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_R8G8B8:
-         vaimg->format.bits_per_pixel    = 24;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-@@ -4242,7 +4249,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_400P:
-         vaimg->format.bits_per_pixel    = 8;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-@@ -4251,7 +4257,6 @@ VAStatus DdiMedia_DeriveImage (
-     case Media_Format_RGBP:
-     case Media_Format_BGRP:
-         vaimg->format.bits_per_pixel    = 24;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               =
-         vaimg->pitches[1]               =
-@@ -4262,7 +4267,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_IMC3:
-         vaimg->format.bits_per_pixel    = 12;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 2;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               =
-         vaimg->pitches[1]               =
-@@ -4273,7 +4277,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_411P:
-         vaimg->format.bits_per_pixel    = 12;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               =
-         vaimg->pitches[1]               =
-@@ -4284,7 +4287,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_422V:
-         vaimg->format.bits_per_pixel    = 16;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 2;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               =
-         vaimg->pitches[1]               =
-@@ -4295,7 +4297,6 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_422H:
-         vaimg->format.bits_per_pixel    = 16;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3;
-         vaimg->num_planes               = 3;
-         vaimg->pitches[0]               =
-         vaimg->pitches[1]               =
-@@ -4307,7 +4308,6 @@ VAStatus DdiMedia_DeriveImage (
-     case Media_Format_P010:
-     case Media_Format_P016:
-         vaimg->format.bits_per_pixel    = 24;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2;
-         vaimg->num_planes               = 2;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->pitches[1]               =
-@@ -4327,21 +4327,27 @@ VAStatus DdiMedia_DeriveImage (
-         break;
-     case Media_Format_Y416:
-         vaimg->format.bits_per_pixel    = 64; // packed format [alpha, Y, U, V], 16 bits per channel
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
-         break;
-      default:
-         vaimg->format.bits_per_pixel    = 12;
--        vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2;
-         vaimg->num_planes               = 2;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-         vaimg->pitches[1]               =
-         vaimg->pitches[2]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
--        vaimg->offsets[1]               = mediaSurface->iHeight * mediaSurface->iPitch;
--        vaimg->offsets[2]               = vaimg->offsets[1] + 1;
-+        if(MEDIA_IS_WA(&mediaCtx->WaTable, FtrE2ECompression))
-+        {
-+            vaimg->offsets[1]           = mediaSurface->iHeight * mediaSurface->iPitch;
-+            vaimg->offsets[2]           = vaimg->offsets[1] + 1;
-+        }
-+        else
-+        {
-+            vaimg->offsets[1]           = offsetU;
-+            vaimg->offsets[2]           = offsetV;
-+        }
-         break;
-     }
- 
--- 
-2.17.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0006-Encode-VP9-VDEnc-fix-width-and-height-settings-preve.patch b/x11-libs/libva-intel-media-driver/files/0006-Encode-VP9-VDEnc-fix-width-and-height-settings-preve.patch
new file mode 100644
index 0000000..4c1141a
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0006-Encode-VP9-VDEnc-fix-width-and-height-settings-preve.patch
@@ -0,0 +1,115 @@
+From d6166b3538a89376771f2769d49d1ade8b177f7e Mon Sep 17 00:00:00 2001
+From: JuanCutbertoEscamillaVela <juan.c.escamilla.vela@intel.com>
+Date: Tue, 4 Aug 2020 06:16:58 +0800
+Subject: [PATCH] [Encode] VP9 VDEnc fix width and height settings preventing
+ unaligned resolutions from working
+
+VP9 VDEnc would send incorrect width and height settings to hardware, where an extra 1 would
+be subtracted, preventing unaligned resolution encoding to work.
+This change will correct these calculations to have aligned dimensions.
+
+Change-Id: I7b17e7460acce497dbe222f9134009d07fdf72ed
+---
+ .../agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp | 6 +++---
+ .../agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.h   | 4 ++--
+ media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp      | 4 ++--
+ media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp      | 8 ++++----
+ media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h      | 4 ++--
+ 5 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
+index 0b0e71c1c0fb..7f83f95fb5d8 100644
+--- a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
++++ b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
+@@ -436,8 +436,8 @@ MOS_STATUS CodechalCmdInitializerG11::CmdInitializerVp9SetDmem()
+     hucInputCmd1.SADQPLambda = (uint16_t)(lambda * 4 + 0.5);
+     hucInputCmd1.RDQPLambda = (uint16_t)(lambda * lambda * 4 + 0.5); //U14.2
+ 
+-    hucInputCmd1.SrcFrameHeightMinus1 = m_vp9Params.picParams->SrcFrameHeightMinus1;
+-    hucInputCmd1.SrcFrameWidthMinus1 = m_vp9Params.picParams->SrcFrameWidthMinus1;
++    hucInputCmd1.SrcFrameHeight = m_vp9Params.picParams->SrcFrameHeightMinus1 + 1;
++    hucInputCmd1.SrcFrameWidth = m_vp9Params.picParams->SrcFrameWidthMinus1 + 1;
+     hucInputCmd1.SegmentationEnabled = m_vp9Params.segmentationEnabled;
+     hucInputCmd1.PrevFrameSegEnabled = m_vp9Params.prevFrameSegEnabled;
+     hucInputCmd1.LumaACQIndex = m_vp9Params.picParams->LumaACQIndex;
+@@ -728,4 +728,4 @@ MOS_STATUS CodechalCmdInitializerG11::SetCopyData(
+     m_osInterface->pfnUnlockResource(m_osInterface, &m_cmdInitializerCopyDataBuffer[m_encoder->m_currRecycledBufIdx][m_currentPass]);
+ 
+     return eStatus;
+-}
+\ No newline at end of file
++}
+diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.h b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.h
+index e6e21ec50b57..733a26ca45b4 100644
+--- a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.h
++++ b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.h
+@@ -88,8 +88,8 @@ struct HucInputCmd1G11
+     uint32_t Intra32X32ModeMask;
+ 
+     // VP9
+-    uint16_t SrcFrameWidthMinus1;
+-    uint16_t SrcFrameHeightMinus1;
++    uint16_t SrcFrameWidth;
++    uint16_t SrcFrameHeight;
+ 
+     uint8_t  SegmentationEnabled;
+     uint8_t  PrevFrameSegEnabled;
+diff --git a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
+index 8d06bfac5d9b..6f263cae5f87 100644
+--- a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
++++ b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
+@@ -3280,8 +3280,8 @@ MOS_STATUS MhwVdboxHcpInterfaceG11::AddHcpVp9PicStateEncCmd(
+     auto vp9RefList = params->ppVp9RefList;
+     auto vp9SeqParams = params->pVp9SeqParams;
+ 
+-    cmd.DW1.FrameWidthInPixelsMinus1    = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+-    cmd.DW1.FrameHeightInPixelsMinus1   = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++    cmd.DW1.FrameWidthInPixelsMinus1    = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++    cmd.DW1.FrameHeightInPixelsMinus1   = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+ 
+     cmd.DW2.FrameType                   = vp9PicParams->PicFlags.fields.frame_type;
+     cmd.DW2.AdaptProbabilitiesFlag      = !vp9PicParams->PicFlags.fields.error_resilient_mode && !vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
+diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
+index 5e7c280bfad0..10e2dacdb925 100644
+--- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
++++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
+@@ -3702,8 +3702,8 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateEncCmd(
+     auto vp9RefList = params->ppVp9RefList;
+     auto vp9SeqParams = params->pVp9SeqParams;
+ 
+-    cmd.DW1.FrameWidthInPixelsMinus1    = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+-    cmd.DW1.FrameHeightInPixelsMinus1   = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++    cmd.DW1.FrameWidthInPixelsMinus1    = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++    cmd.DW1.FrameHeightInPixelsMinus1   = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+ 
+     cmd.DW2.FrameType                   = vp9PicParams->PicFlags.fields.frame_type;
+     cmd.DW2.AdaptProbabilitiesFlag      = !vp9PicParams->PicFlags.fields.error_resilient_mode && !vp9PicParams->PicFlags.fields.frame_parallel_decoding_mode;
+@@ -3711,8 +3711,8 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateEncCmd(
+     cmd.DW2.AllowHiPrecisionMv          = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
+     cmd.DW2.McompFilterType             = vp9PicParams->PicFlags.fields.mcomp_filter_type;
+ 
+-    cmd.DW2.RefFrameSignBias02          = vp9PicParams->RefFlags.fields.LastRefSignBias | 
+-                                          (vp9PicParams->RefFlags.fields.GoldenRefSignBias << 1) | 
++    cmd.DW2.RefFrameSignBias02          = vp9PicParams->RefFlags.fields.LastRefSignBias |
++                                          (vp9PicParams->RefFlags.fields.GoldenRefSignBias << 1) |
+                                           (vp9PicParams->RefFlags.fields.AltRefSignBias << 2);
+ 
+     cmd.DW2.HybridPredictionMode        = vp9PicParams->PicFlags.fields.comp_prediction_mode == 2;
+diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
+index 59342edf54fa..a7538ffddf24 100644
+--- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
++++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
+@@ -2740,8 +2740,8 @@ public:
+             MHW_MI_CHK_NULL(params->pVp9EncSeqParams);
+             auto vp9SeqParams = params->pVp9EncSeqParams;
+ 
+-            cmd.DW1.FrameWidthInPixelsMinusOne = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+-            cmd.DW1.FrameHeightInPixelsMinusOne = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++            cmd.DW1.FrameWidthInPixelsMinusOne = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameWidthMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
++            cmd.DW1.FrameHeightInPixelsMinusOne = MOS_ALIGN_CEIL(vp9PicParams->SrcFrameHeightMinus1 + 1, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
+ 
+             cmd.DW2.Value = (cmd.DW2.Value & 0x8ff00000) | 0x5aff3;
+             cmd.DW5.Value = (cmd.DW5.Value & 0xf000300) | 0x80ac00;
+-- 
+2.7.4
+
diff --git a/x11-libs/libva-intel-media-driver/files/0006-Ignore-the-private-VP9-status-buffer.patch b/x11-libs/libva-intel-media-driver/files/0006-Ignore-the-private-VP9-status-buffer.patch
deleted file mode 100644
index 8403523..0000000
--- a/x11-libs/libva-intel-media-driver/files/0006-Ignore-the-private-VP9-status-buffer.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 8d6b417295e9e15c267962c7cd068dbb768805aa Mon Sep 17 00:00:00 2001
-From: Haihao Xiang <haihao.xiang@intel.com>
-Date: Wed, 12 Feb 2020 22:42:31 +0800
-Subject: [PATCH] Ignore the private VP9 status buffer
-
-Without a flag, user doesn't know VACodedBufferSegment.next pointing
-to a private segment status, so we have to ignore this private
-status buffer. Otherwise it will result in segmentation fault if user
-takes VACodedBufferSegment.next as a VACodedBufferSegment pointer
-
-Example:
-gst-launch-1.0 videotestsrc !
-video/x-raw,format=NV12,width=3840,height=2160 ! vaapivp9enc !
-matroskamux ! filesink location=output.vp9
----
- .../linux/common/codec/ddi/media_ddi_encode_vp9.cpp        | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp
-index 7d70034b..13b453b2 100644
---- a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp
-+++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp
-@@ -1037,7 +1037,12 @@ VAStatus DdiEncodeVp9::ReportExtraStatus(
-     codedBufStatus->next_frame_width = encodeStatusReport->NextFrameWidthMinus1 + 1;
-     codedBufStatus->next_frame_height = encodeStatusReport->NextFrameHeightMinus1 + 1;
- 
--    codedBufferSegment->next = codedBufStatus;
-+    /*
-+     * Ignore the private status buffer temporarily. According to the comment for VACodedBufferVP9Status in VA-API,
-+     * driver must set codedBufferSegment->status to be VA_CODED_BUF_STATUS_CODEC_SPECIFIC, however
-+     * VA_CODED_BUF_STATUS_CODEC_SPECIFIC is not defined in VA-API
-+     */
-+    // codedBufferSegment->next = codedBufStatus;
- 
-     return vaStatus;
- }
--- 
-2.20.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0007-Explicitly-disable-media-compression.patch b/x11-libs/libva-intel-media-driver/files/0007-Explicitly-disable-media-compression.patch
new file mode 100644
index 0000000..92941e9
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/files/0007-Explicitly-disable-media-compression.patch
@@ -0,0 +1,42 @@
+From cad2dec617397c472adef7490e4ab26dbde7ad28 Mon Sep 17 00:00:00 2001
+From: Yu Kang Ku <yu.kang.ku@intel.com>
+Date: Tue, 18 Aug 2020 16:42:27 -0700
+Subject: [PATCH] Explicitly disable media compression
+
+Disable media compression until decompression is available.
+---
+ media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp  | 3 +++
+ media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp | 3 +++
+ 2 files changed, 6 insertions(+)
+
+diff --git a/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp b/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
+index 37186019..2cfd9838 100644
+--- a/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
++++ b/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
+@@ -237,6 +237,9 @@ static bool InitTglMediaSku(struct GfxDeviceInfo *devInfo,
+         disableMMC = true;
+     }
+ 
++    // Explicitly disable media compression until decompression is available
++    disableMMC = true;
++
+     if (disableMMC)
+     {
+         MEDIA_WR_SKU(skuTable, FtrE2ECompression, 0);
+diff --git a/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp b/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
+index 8a0d81a8..c6e71d2b 100644
+--- a/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
++++ b/media_driver/linux/gen12/ddi/media_sysinfo_g12.cpp
+@@ -133,6 +133,9 @@ static bool InitTglShadowSku(struct GfxDeviceInfo *devInfo,
+         disableMMC = true;
+     }
+ 
++    // Explicitly disable media compression until decompression is available
++    disableMMC = true;
++
+     if (disableMMC)
+     {
+         skuTable->FtrE2ECompression = 0;
+-- 
+2.17.1
+
diff --git a/x11-libs/libva-intel-media-driver/files/0007-add-SW-WA-to-diable-calculation-of-the-UV-offset-by-gmmlib-on-TGL.patch b/x11-libs/libva-intel-media-driver/files/0007-add-SW-WA-to-diable-calculation-of-the-UV-offset-by-gmmlib-on-TGL.patch
deleted file mode 100644
index 97b4a9e..0000000
--- a/x11-libs/libva-intel-media-driver/files/0007-add-SW-WA-to-diable-calculation-of-the-UV-offset-by-gmmlib-on-TGL.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From e96c2b6fa701d4fb5f808160234294c0b0106364 Mon Sep 17 00:00:00 2001
-From: CarlZhang <carl.zhang@intel.com>
-Date: Fri, 3 Apr 2020 22:25:58 +0800
-Subject: [PATCH] [Decode] add SW WA to diable calculation of the UV offset by
- gmmlib on TGL
-
-GMMlib CPU BLT call will add/remove padding, it will change the UV offset
-
-Change-Id: Ifacbd29daa99148c384164ac65143e046b80973a
----
- media_driver/linux/common/ddi/media_libva.cpp     | 3 ++-
- media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp | 4 ++++
- 2 files changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
-index 70fdd182e..bdaa323be 100755
---- a/media_driver/linux/common/ddi/media_libva.cpp
-+++ b/media_driver/linux/common/ddi/media_libva.cpp
-@@ -4328,6 +4328,7 @@ VAStatus DdiMedia_DeriveImage (
-         vaimg->offsets[0]               = 0;
-         break;
-     case Media_Format_R5G6B5:
-+        vaimg->format.bits_per_pixel    = 16;
-         vaimg->data_size                = mediaSurface->iPitch * mediaSurface->iHeight;
-         vaimg->num_planes               = 1;
-         vaimg->pitches[0]               = mediaSurface->iPitch;
-@@ -4438,7 +4439,7 @@ VAStatus DdiMedia_DeriveImage (
-         vaimg->pitches[1]               =
-         vaimg->pitches[2]               = mediaSurface->iPitch;
-         vaimg->offsets[0]               = 0;
--        if(MEDIA_IS_WA(&mediaCtx->WaTable, FtrE2ECompression))
-+        if(MEDIA_IS_WA(&mediaCtx->WaTable, WaDisableGmmLibOffsetInDeriveImage))
-         {
-             vaimg->offsets[1]           = mediaSurface->iHeight * mediaSurface->iPitch;
-             vaimg->offsets[2]           = vaimg->offsets[1] + 1;
-diff --git a/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp b/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
-index e14dc3569..be6c49dca 100644
---- a/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
-+++ b/media_driver/linux/gen12/ddi/media_sku_wa_g12.cpp
-@@ -308,6 +308,10 @@ static bool InitTglMediaWa(struct GfxDeviceInfo *devInfo,
- 
-     MEDIA_WR_WA(waTable, Wa16KInputHeightNV12Planar420, 1);
- 
-+    /*software wa to disable calculate the UV offset by gmmlib
-+      CPU blt call will add/remove padding on the platform*/
-+    MEDIA_WR_WA(waTable, WaDisableGmmLibOffsetInDeriveImage, 1);
-+
-     return true;
- }
-
diff --git a/x11-libs/libva-intel-media-driver/files/0008-VP-Explicitly-initialize-maxSrcRect-of-VpHalRenderer.patch b/x11-libs/libva-intel-media-driver/files/0008-VP-Explicitly-initialize-maxSrcRect-of-VpHalRenderer.patch
deleted file mode 100644
index a4e9683..0000000
--- a/x11-libs/libva-intel-media-driver/files/0008-VP-Explicitly-initialize-maxSrcRect-of-VpHalRenderer.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 5b49d6003bf5472d0eb33dbec94987cac78633f0 Mon Sep 17 00:00:00 2001
-From: Yu Kang Ku <yu.kang.ku@intel.com>
-Date: Wed, 22 Apr 2020 22:26:48 -0700
-Subject: [PATCH] [VP] Explicitly initialize maxSrcRect of VphalRenderer
-
-The maxSrcRect member keeps track of the maximum rectangle among a
-set of source surfaces.  There is a need to explicitly re-initialize
-this member in VphalState::Render prior to calling the main render
-function.  This is so that the maxSrcRect value for the last set of
-surfaces does not get re-used for the current set of surfaces.
-
-This fixes https://github.com/intel/media-driver/issues/905.
----
- media_driver/agnostic/common/vp/hal/vphal.cpp     |  5 +++++
- .../agnostic/common/vp/hal/vphal_renderer.h       | 15 +++++++++++++++
- 2 files changed, 20 insertions(+)
-
-diff --git a/media_driver/agnostic/common/vp/hal/vphal.cpp b/media_driver/agnostic/common/vp/hal/vphal.cpp
-index 1a6b3477512b..2a6e1d356734 100755
---- a/media_driver/agnostic/common/vp/hal/vphal.cpp
-+++ b/media_driver/agnostic/common/vp/hal/vphal.cpp
-@@ -556,6 +556,11 @@ MOS_STATUS VphalState::Render(
-     VPHAL_PUBLIC_CHK_NULL(pcRenderParams);
-     RenderParams    = *pcRenderParams;
- 
-+    // Explicitly initialize the maxSrcRect of VphalRenderer
-+    // so that the maxSrcRect for the last set of surfaces does not get
-+    // re-used for the current set of surfaces.
-+    m_renderer->InitMaxSrcRect();
-+
-     if (VpHal_IsAvsSampleForMultiStreamsEnabled(pcRenderParams))
-     {
-         eStatus = VpHal_RenderWithAvsForMultiStreams(m_renderer, pcRenderParams);
-diff --git a/media_driver/agnostic/common/vp/hal/vphal_renderer.h b/media_driver/agnostic/common/vp/hal/vphal_renderer.h
-index 7b2fd4b15529..0ad58a7c1896 100644
---- a/media_driver/agnostic/common/vp/hal/vphal_renderer.h
-+++ b/media_driver/agnostic/common/vp/hal/vphal_renderer.h
-@@ -301,6 +301,21 @@ public:
-     //!
-     virtual MOS_STATUS UpdateRenderGpuContext(MOS_GPU_CONTEXT renderGpuContext);
- 
-+    //!
-+    //! \brief    Explicitly initialize the maxSrcRect member
-+    //! \details  The maxSrcRect member keeps track of the maximum rectangle
-+    //!           among a set of source surfaces.  There is a need to
-+    //!           explicitly re-initialize this member in VphalState::Render
-+    //!           prior to calling the main render function.  This is so that
-+    //!           the maxSrcRect value for the last set of surfaces does not
-+    //!           get re-used for the current set of surfaces.
-+    //! \return   void
-+    //!
-+    void InitMaxSrcRect()
-+    {
-+        maxSrcRect = {0, 0, 0, 0};
-+    }
-+
- protected:
-     //!
-     //! \brief    Prepare input surface list for top level render processing
--- 
-2.17.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0009-VP-fix-crash-in-vp8-playback.patch b/x11-libs/libva-intel-media-driver/files/0009-VP-fix-crash-in-vp8-playback.patch
deleted file mode 100644
index 6076d38..0000000
--- a/x11-libs/libva-intel-media-driver/files/0009-VP-fix-crash-in-vp8-playback.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 8f5d4d353334fe4fbc897cf75b88c04699ceb4eb Mon Sep 17 00:00:00 2001
-From: Abhishek Kumar <abhishek4.kumar@intel.com>
-Date: Wed, 29 Apr 2020 17:35:34 +0530
-Subject: [PATCH] [VP] fix crash in vp8 playback.
-
-Inserting an already registered surface creates new index
-without removing old, as the surface is already registered
-in table no need to register , remove RegisterRTSurfaces.
-
-fixes vp8 decoding crash in chromeos,ffmpeg 4.2 vp8 decoding
-works fine in kbl/cml/jsl.
----
- media_driver/linux/common/codec/ddi/media_ddi_decode_vp8.cpp | 3 ---
- 1 file changed, 3 deletions(-)
-
-diff --git a/media_driver/linux/common/codec/ddi/media_ddi_decode_vp8.cpp b/media_driver/linux/common/codec/ddi/media_ddi_decode_vp8.cpp
-index c16f564e91ce..cdb68b7097f0 100644
---- a/media_driver/linux/common/codec/ddi/media_ddi_decode_vp8.cpp
-+++ b/media_driver/linux/common/codec/ddi/media_ddi_decode_vp8.cpp
-@@ -167,21 +167,18 @@ VAStatus DdiDecodeVP8::ParsePicParams(
-         {
-             DdiMedia_MediaSurfaceToMosResource(lastRefSurface, &m_resNoneRegLastRefFrame);
-             m_ddiDecodeCtx->DecodeParams.m_presNoneRegLastRefFrame = &m_resNoneRegLastRefFrame;
--            RegisterRTSurfaces(&m_ddiDecodeCtx->RTtbl, lastRefSurface);
-         }
-         goldenRefSurface = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, picParam->golden_ref_frame);
-         if(goldenRefSurface)
-         {
-             DdiMedia_MediaSurfaceToMosResource(lastRefSurface, &m_resNoneRegGoldenRefFrame);
-             m_ddiDecodeCtx->DecodeParams.m_presNoneRegGoldenRefFrame = &m_resNoneRegGoldenRefFrame;
--            RegisterRTSurfaces(&m_ddiDecodeCtx->RTtbl, lastRefSurface);
-         }
-         altRefSurface    = DdiMedia_GetSurfaceFromVASurfaceID(mediaCtx, picParam->alt_ref_frame);
-         if(altRefSurface)
-         {
-             DdiMedia_MediaSurfaceToMosResource(lastRefSurface, &m_resNoneRegAltRefFrame);
-             m_ddiDecodeCtx->DecodeParams.m_presNoneRegAltRefFrame = &m_resNoneRegAltRefFrame;
--            RegisterRTSurfaces(&m_ddiDecodeCtx->RTtbl, lastRefSurface);
-         }
-     }
- 
--- 
-2.7.4
-
diff --git a/x11-libs/libva-intel-media-driver/files/0010-VP-fix-illegal-access-and-mem-leak.patch b/x11-libs/libva-intel-media-driver/files/0010-VP-fix-illegal-access-and-mem-leak.patch
deleted file mode 100644
index cb1c622..0000000
--- a/x11-libs/libva-intel-media-driver/files/0010-VP-fix-illegal-access-and-mem-leak.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 8a03be9603f321a2a2e12dae6519a7b043a79a4e Mon Sep 17 00:00:00 2001
-From: luchaopa <luchao.pang@intel.com>
-Date: Fri, 29 Nov 2019 13:37:29 +0800
-Subject: [PATCH] [VP] fix illegal access and mem leak
-
-fix illegal access after allocation failed.
-fix memory leak after allocation failed.
-
-Change-Id: I63b577f9f92a66c7c85b91a9843217539a9873d0
-(cherry picked from commit 9b9dd30ae96196bb13ebc06a95f4c67fcf65e394)
----
- media_driver/agnostic/common/vp/hal/vphal_renderer.cpp | 10 ++++++++++
- media_driver/agnostic/common/vp/kdll/hal_kerneldll.c   |  2 +-
- 2 files changed, 11 insertions(+), 1 deletion(-)
-
-diff --git a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
-index 41eee450..b55b12dc 100644
---- a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
-+++ b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
-@@ -1480,11 +1480,21 @@ finish:
-         if (pKernelBin)
-         {
-             MOS_SafeFreeMemory(pKernelBin);
-+            if (pKernelDllState && pKernelDllState->ComponentKernelCache.pCache == pKernelBin)
-+            {
-+                pKernelDllState->ComponentKernelCache.pCache = nullptr;
-+            }
-+            pKernelBin = nullptr;
-         }
- 
-         if (pFcPatchBin)
-         {
-             MOS_SafeFreeMemory(pFcPatchBin);
-+            if (pKernelDllState && pKernelDllState->CmFcPatchCache.pCache == pFcPatchBin)
-+            {
-+                pKernelDllState->CmFcPatchCache.pCache = nullptr;
-+            }
-+            pFcPatchBin = nullptr;
-         }
-     }
-     return eStatus;
-diff --git a/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c b/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-index c3b757e0..7532c736 100644
---- a/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-+++ b/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-@@ -3430,8 +3430,8 @@ Kdll_State *KernelDll_AllocateStates(
- cleanup:
-     if (pState)
-     {
--        MOS_FreeMemory(pState->ComponentKernelCache.pCache);
-         MOS_FreeMemory(pState->pSortedRules);
-+        pState->pSortedRules = nullptr;
-     }
- 
-     // Free DL States and temporary sort buffers
--- 
-2.26.2
-
diff --git a/x11-libs/libva-intel-media-driver/files/0011-Media-Common-Fix-tiling-issue.patch b/x11-libs/libva-intel-media-driver/files/0011-Media-Common-Fix-tiling-issue.patch
deleted file mode 100644
index ec5348f..0000000
--- a/x11-libs/libva-intel-media-driver/files/0011-Media-Common-Fix-tiling-issue.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 3a53032ebc5eb2c234a6678152590c5f4ca7757f Mon Sep 17 00:00:00 2001
-From: ChenJasonK <Jason.k.chen@intel.com>
-Date: Thu, 26 Mar 2020 17:16:12 +0800
-Subject: [PATCH] [Media Common] Fix tiling issue
-
-For YV12 on Gen9, when driver set tile Y, but Gmm still create it as tile linear, thus driver need to query tiling info from gmm to update the tile type in DDI_MEDIA_SURFACE
-
-Change-Id: Id36ac4eca5fbcec3481477a4a6cac787c8e46a52
----
- media_driver/linux/common/ddi/media_libva.cpp    |  2 +-
- .../linux/common/ddi/media_libva_util.cpp        | 16 ++++++++++++++++
- 2 files changed, 17 insertions(+), 1 deletion(-)
-
-diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
-index bd34dbf5..d0329cd8 100755
---- a/media_driver/linux/common/ddi/media_libva.cpp
-+++ b/media_driver/linux/common/ddi/media_libva.cpp
-@@ -4847,7 +4847,7 @@ VAStatus DdiMedia_GetImage(
-             DDI_ASSERTMESSAGE("Unsupported surface type.");
-             return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
-         }
--        target_surface = (VASurfaceID)DdiMedia_CreateRenderTarget(mediaCtx, mediaFmt, vaimg->width, vaimg->height, nullptr, VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE);
-+        target_surface = (VASurfaceID)DdiMedia_CreateRenderTarget(mediaCtx, mediaFmt, vaimg->width, vaimg->height, nullptr, VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC);
-         DDI_CHK_RET(vaStatus, "Create temp surface failed.");
- 
-         VARectangle srcRect, dstRect;
-diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp
-index acdcf4e9..b393cd51 100755
---- a/media_driver/linux/common/ddi/media_libva_util.cpp
-+++ b/media_driver/linux/common/ddi/media_libva_util.cpp
-@@ -437,6 +437,22 @@ VAStatus DdiMediaUtil_AllocateSurface(
-     if (!DdiMediaUtil_IsExternalSurface(mediaSurface) ||
-         mediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_VA)
-     {
-+        switch (gmmResourceInfo->GetTileType())
-+        {
-+            case GMM_TILED_Y:
-+                tileformat = I915_TILING_Y;
-+                break;
-+            case GMM_TILED_X:
-+                tileformat = I915_TILING_X;
-+                break;
-+            case GMM_NOT_TILED:
-+                tileformat = I915_TILING_NONE;
-+                break;
-+            default:
-+                tileformat = I915_TILING_NONE;
-+                break;
-+        }
-+
-         unsigned long  ulPitch = 0;
-         if ( tileformat == I915_TILING_NONE )
-         {
--- 
-2.26.0.windows.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0012-Media-Common-Modify-the-default-tile-type.patch b/x11-libs/libva-intel-media-driver/files/0012-Media-Common-Modify-the-default-tile-type.patch
deleted file mode 100644
index 0c24751..0000000
--- a/x11-libs/libva-intel-media-driver/files/0012-Media-Common-Modify-the-default-tile-type.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From c33cb7b6597d8b8e90b3cd1c15e906e56f8565a9 Mon Sep 17 00:00:00 2001
-From: ChenJasonK <Jason.k.chen@intel.com>
-Date: Mon, 30 Mar 2020 11:11:33 +0800
-Subject: [PATCH] [Media Common] Modify the default tile type
-
-Modify the default tile type as tile Y
-
-Change-Id: I46590ef3d652db773afe842a3e818a28ba9d42c5
----
- media_driver/linux/common/ddi/media_libva_util.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp
-index b393cd51..d0d7e639 100755
---- a/media_driver/linux/common/ddi/media_libva_util.cpp
-+++ b/media_driver/linux/common/ddi/media_libva_util.cpp
-@@ -1,5 +1,5 @@
- /*
--* Copyright (c) 2009-2019, Intel Corporation
-+* Copyright (c) 2009-2020, Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
-@@ -449,7 +449,7 @@ VAStatus DdiMediaUtil_AllocateSurface(
-                 tileformat = I915_TILING_NONE;
-                 break;
-             default:
--                tileformat = I915_TILING_NONE;
-+                tileformat = I915_TILING_Y;
-                 break;
-         }
- 
--- 
-2.26.0.windows.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0013-Add-external-surface-support.patch b/x11-libs/libva-intel-media-driver/files/0013-Add-external-surface-support.patch
deleted file mode 100644
index b487b73..0000000
--- a/x11-libs/libva-intel-media-driver/files/0013-Add-external-surface-support.patch
+++ /dev/null
@@ -1,1113 +0,0 @@
-From 587a8c38326d5526c1f61561c7ba5c47c1962c78 Mon Sep 17 00:00:00 2001
-From: Sudarshan S <sudarshan.s@intel.com>
-Date: Thu, 16 Apr 2020 16:57:21 +0530
-Subject: [PATCH] Add external surface support for iHD-19.4.1
-
-Add external surface support, optimize VAImage creation,
-modify GetImage to copy with each plane
-
-Backported to 19.4.1 from
-https://github.com/intel/media-driver/commit/922195ddd0ac5fef96b7b6a9986b2958908c3eb6
-
-From: Chen_JasonK <jason.k.chen@intel.com>
-Date: Wed, 25 Mar 2020 10:08:19 +0800
-Subject: [PATCH] [VP] Add external surface support
----
- media_driver/linux/common/ddi/media_libva.cpp | 653 ++++++++++--------
- .../linux/common/ddi/media_libva_util.cpp     |   2 +-
- .../linux/common/os/mos_os_specific.c         |   2 +-
- .../linux/common/os/mos_os_specific.h         |   1 +
- .../linux/common/vp/ddi/media_libva_vp.c      | 158 +++--
- 5 files changed, 475 insertions(+), 341 deletions(-)
-
-diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
-index c80f0e70..ab051f91 100755
---- a/media_driver/linux/common/ddi/media_libva.cpp
-+++ b/media_driver/linux/common/ddi/media_libva.cpp
-@@ -3885,54 +3885,8 @@ VAStatus DdiMedia_CreateImage(
-     GMM_RESOURCE_INFO          *gmmResourceInfo;
-     MOS_ZeroMemory(&gmmParams, sizeof(gmmParams));
- 
--    switch(format->fourcc)
--    {
--        case VA_FOURCC_RGBA:
--        case VA_FOURCC_BGRA:
--        case VA_FOURCC_ARGB:
--        case VA_FOURCC_ABGR:
--        case VA_FOURCC_BGRX:
--        case VA_FOURCC_RGBX:
--        case VA_FOURCC_XRGB:
--        case VA_FOURCC_XBGR:
--        case VA_FOURCC_R8G8B8:
--        case VA_FOURCC_RGB565:
--        case VA_FOURCC_RGBP:
--        case VA_FOURCC_BGRP:
--        case VA_FOURCC_YV12:
--        case VA_FOURCC_I420:
--        case VA_FOURCC_IYUV:
--        case VA_FOURCC_A2R10G10B10:
--        case VA_FOURCC_A2B10G10R10:
--            gmmParams.BaseHeight        = height;
--            gmmParams.Flags.Info.Linear = true;
--            break;
--        case VA_FOURCC_YUY2:
--        case VA_FOURCC_AYUV:
--        case VA_FOURCC_Y210:
--        case VA_FOURCC_Y410:
--        case VA_FOURCC_Y416:
--        case VA_FOURCC_NV12:
--        case VA_FOURCC_NV21:
--        case VA_FOURCC_P010:
--        case VA_FOURCC_P016:
--        case VA_FOURCC_411P:
--        case VA_FOURCC_422H:
--        case VA_FOURCC_444P:
--        case VA_FOURCC_422V:
--        case VA_FOURCC_IMC3:
--        case VA_FOURCC_Y800:
--        case VA_FOURCC_VYUY:
--        case VA_FOURCC_YVYU:
--        case VA_FOURCC_UYVY:
--            gmmParams.BaseHeight = MOS_ALIGN_CEIL(height, 32);
--            break;
--        default:
--            MOS_FreeMemory(vaimg);
--            return VA_STATUS_ERROR_UNIMPLEMENTED;
--    }
--
-     gmmParams.BaseWidth       = width;
-+    gmmParams.BaseHeight      = height;
-     gmmParams.ArraySize       = 1;
-     gmmParams.Type            = RESOURCE_2D;
-     gmmParams.Flags.Gpu.Video = true;
-@@ -3952,15 +3906,30 @@ VAStatus DdiMedia_CreateImage(
-         return VA_STATUS_ERROR_ALLOCATION_FAILED;
-     }
- 
--    uint32_t    gmmPitch  = (uint32_t)gmmResourceInfo->GetRenderPitch();
--    uint32_t    gmmHeight = (uint32_t)gmmResourceInfo->GetBaseHeight();
-+    // Get offset from GMM
-+    GMM_REQ_OFFSET_INFO reqInfo = {0};
-+	reqInfo.Plane = GMM_PLANE_U;
- 
--    vaimg->format                = *format;
--    vaimg->format.byte_order     = VA_LSB_FIRST;
--    vaimg->width                 = width;
--    vaimg->height                = height;
--    vaimg->data_size             = (uint32_t)gmmResourceInfo->GetSizeSurface();
--    vaimg->format.bits_per_pixel = gmmResourceInfo->GetBitsPerPixel();
-+	reqInfo.ReqRender = 1;
-+	gmmResourceInfo->GetOffset(reqInfo);
-+
-+	uint32_t offsetU = reqInfo.Render.Offset;
-+
-+	MOS_ZeroMemory(&reqInfo, sizeof(GMM_REQ_OFFSET_INFO));
-+
-+	reqInfo.Plane             = GMM_PLANE_V;
-+	reqInfo.ReqRender         = 1;
-+	gmmResourceInfo->GetOffset(reqInfo);
-+
-+	uint32_t offsetV          = reqInfo.Render.Offset;
-+	uint32_t size             = (uint32_t)gmmResourceInfo->GetSizeSurface();
-+	uint32_t pitch            = (uint32_t)gmmResourceInfo->GetRenderPitch();
-+
-+	vaimg->format             = *format;
-+	vaimg->format.byte_order  = VA_LSB_FIRST;
-+	vaimg->width              = width;
-+	vaimg->height             = height;
-+	vaimg->data_size          = size;
- 
-     switch(format->fourcc)
-     {
-@@ -3972,92 +3941,72 @@ VAStatus DdiMedia_CreateImage(
-         case VA_FOURCC_RGBX:
-         case VA_FOURCC_XRGB:
-         case VA_FOURCC_XBGR:
--        case VA_FOURCC_R8G8B8:
--        case VA_FOURCC_RGB565:
-         case VA_FOURCC_A2R10G10B10:
-         case VA_FOURCC_A2B10G10R10:
--            vaimg->num_planes = 1;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->offsets[0] = 0;
--            break;
--        case VA_FOURCC_RGBP:
--        case VA_FOURCC_BGRP:
--            vaimg->num_planes = 3;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch;
--            vaimg->pitches[2] = gmmPitch;
--            vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = gmmPitch * gmmHeight * 2;
--            break;
--        case VA_FOURCC_Y800:
-+        case VA_FOURCC_R8G8B8:
-+        case VA_FOURCC_RGB565:
-         case VA_FOURCC_UYVY:
-         case VA_FOURCC_YUY2:
-+        case VA_FOURCC_VYUY:
-+        case VA_FOURCC_YVYU:
-         case VA_FOURCC_AYUV:
-         case VA_FOURCC_Y210:
-+        case VA_FOURCC_Y216:
-         case VA_FOURCC_Y410:
-         case VA_FOURCC_Y416:
-+        case VA_FOURCC_Y800:
-             vaimg->num_planes = 1;
--            vaimg->pitches[0] = gmmPitch;
-+            vaimg->pitches[0] = pitch;
-             vaimg->offsets[0] = 0;
-             break;
-         case VA_FOURCC_NV12:
-         case VA_FOURCC_NV21:
--            vaimg->num_planes = 2;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch;
--            vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = vaimg->offsets[1] + 1;
--            break;
-         case VA_FOURCC_P010:
-         case VA_FOURCC_P016:
-             vaimg->num_planes = 2;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch;
-+            vaimg->pitches[0] = pitch;
-+            vaimg->pitches[1] = pitch;
-             vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = vaimg->offsets[1] + 2;
-+            vaimg->offsets[1] = offsetU;
-             break;
-         case VA_FOURCC_YV12:
--        case VA_FOURCC_I420:
--        case VA_FOURCC_IYUV:
--            vaimg->num_planes = 3;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch / 2;
--            vaimg->pitches[2] = gmmPitch / 2;
--            vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = vaimg->offsets[1] + gmmPitch * gmmHeight / 4;
--            break;
--        case VA_FOURCC_411P:
--        case VA_FOURCC_422H:
--        case VA_FOURCC_444P:
-             vaimg->num_planes = 3;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch;
--            vaimg->pitches[2] = gmmPitch;
-+            vaimg->pitches[0] = pitch;
-+            vaimg->pitches[1] = pitch / 2;
-+            vaimg->pitches[2] = pitch / 2;
-             vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = vaimg->offsets[1] + gmmPitch * gmmHeight;
-+            vaimg->offsets[1] = offsetV;
-+            vaimg->offsets[2] = offsetU;
-             break;
--        case VA_FOURCC_422V:
-+		case VA_FOURCC_I420:
-+			vaimg->num_planes = 3;
-+			vaimg->pitches[0] = pitch;
-+			vaimg->pitches[1] = pitch / 2;
-+			vaimg->pitches[2] = pitch / 2;
-+			vaimg->offsets[0] = 0;
-+			vaimg->offsets[1] = offsetU;
-+			vaimg->offsets[2] = offsetV;
-+			break;
-         case VA_FOURCC_IMC3:
-+		case VA_FOURCC_411P:
-+		case VA_FOURCC_422V:
-+		case VA_FOURCC_422H:
-+		case VA_FOURCC_444P:
-+		case VA_FOURCC_RGBP:
-+		case VA_FOURCC_BGRP:
-             vaimg->num_planes = 3;
--            vaimg->pitches[0] = gmmPitch;
--            vaimg->pitches[1] = gmmPitch;
--            vaimg->pitches[2] = gmmPitch;
-+            vaimg->pitches[0] = pitch;
-+            vaimg->pitches[1] = pitch;
-+            vaimg->pitches[2] = pitch;
-             vaimg->offsets[0] = 0;
--            vaimg->offsets[1] = gmmPitch * gmmHeight;
--            vaimg->offsets[2] = vaimg->offsets[1] + gmmPitch * gmmHeight / 2;
-+            vaimg->offsets[1] = offsetU;
-+            vaimg->offsets[2] = offsetV;
-             break;
-         default:
-             MOS_FreeMemory(vaimg);
-             return VA_STATUS_ERROR_UNIMPLEMENTED;
-     }
- 
--    mediaCtx->pGmmClientContext->DestroyResInfoObject(gmmResourceInfo);
--
-     DDI_MEDIA_BUFFER *buf  = (DDI_MEDIA_BUFFER *)MOS_AllocAndZeroMemory(sizeof(DDI_MEDIA_BUFFER));
-     if (nullptr == buf)
-     {
-@@ -4487,6 +4436,125 @@ VAStatus SwizzleSurface(PDDI_MEDIA_CONTEXT mediaCtx, PGMM_RESOURCE_INFO pGmmResI
-     return vaStatus;
- }
- 
-+//!
-+//! \brief  Copy plane from src to dst row by row when src and dst strides are different
-+//!
-+//! \param  [in] dst
-+//!         Destination plane
-+//! \param  [in] dstPitch
-+//!         Destination plane pitch
-+//! \param  [in] src
-+//!         Source plane
-+//! \param  [in] srcPitch
-+//!         Source plane pitch
-+//! \param  [in] height
-+//!         Plane hight
-+//!
-+static void DdiMedia_CopyPlane(
-+    uint8_t *dst,
-+    uint32_t dstPitch,
-+    uint8_t *src,
-+    uint32_t srcPitch,
-+    uint32_t height)
-+{
-+    uint32_t rowSize = std::min(dstPitch, srcPitch);
-+    for (int y = 0; y < height; y += 1)
-+    {
-+        memcpy(dst, src, rowSize);
-+        dst += dstPitch;
-+        src += srcPitch;
-+    }
-+}
-+
-+static uint32_t DdiMedia_GetChromaPitchHeight(uint32_t fourcc, uint32_t pitch, uint32_t height, uint32_t *chromaPitch, uint32_t *chromaHeight);
-+
-+//!
-+//! \brief  Copy data from surface to image
-+//!
-+//! \param  [in] ctx
-+//!         Input driver context
-+//! \param  [in] surface
-+//!         Pointer to surface
-+//! \param  [in] image
-+//!         Pointer to image
-+//!
-+//! \return VAStatus
-+//!     VA_STATUS_SUCCESS if success, else fail reason
-+//!
-+static VAStatus DdiMedia_CopySurfaceToImage(
-+    VADriverContextP  ctx,
-+    DDI_MEDIA_SURFACE *surface,
-+    VAImage           *image)
-+{
-+    DDI_FUNCTION_ENTER();
-+
-+    DDI_CHK_NULL(ctx,       "nullptr ctx.",         VA_STATUS_ERROR_INVALID_CONTEXT);
-+    PDDI_MEDIA_CONTEXT mediaCtx = DdiMedia_GetMediaContext(ctx);
-+    DDI_CHK_NULL(mediaCtx,  "nullptr mediaCtx.",    VA_STATUS_ERROR_INVALID_CONTEXT);
-+
-+    VAStatus vaStatus = VA_STATUS_SUCCESS;
-+    //Lock Surface
-+    void *surfData = DdiMediaUtil_LockSurface(surface, MOS_LOCKFLAG_READONLY);
-+    if (surfData == nullptr)
-+    {
-+        DDI_ASSERTMESSAGE("nullptr surfData.");
-+        return vaStatus;
-+    }
-+
-+    void *imageData = nullptr;
-+    vaStatus = DdiMedia_MapBuffer(ctx, image->buf, &imageData);
-+    if (vaStatus != VA_STATUS_SUCCESS)
-+    {
-+        DDI_ASSERTMESSAGE("Failed to map buffer.");
-+        DdiMediaUtil_UnlockSurface(surface);
-+        return vaStatus;
-+    }
-+
-+    uint8_t *ySrc = (uint8_t*)surfData;
-+    uint8_t *yDst = (uint8_t*)imageData;
-+
-+    if(surface->data_size == image->data_size)
-+    {
-+        MOS_SecureMemcpy(imageData, image->data_size, surfData, image->data_size);
-+    }
-+    else
-+    {
-+        DdiMedia_CopyPlane(yDst, image->pitches[0], ySrc, surface->iPitch, image->height);
-+        if (image->num_planes > 1)
-+        {
-+            uint8_t *uSrc = ySrc + surface->iPitch * surface->iHeight;
-+            uint8_t *uDst = yDst + image->offsets[1];
-+            uint32_t chromaPitch;
-+            uint32_t chromaHeight;
-+            uint32_t imageChromaPitch;
-+            uint32_t imageChromaHeight;
-+            DdiMedia_GetChromaPitchHeight(DdiMedia_MediaFormatToOsFormat(surface->format), surface->iPitch, surface->iHeight, &chromaPitch, &chromaHeight);
-+            DdiMedia_GetChromaPitchHeight(image->format.fourcc, image->pitches[0], image->height, &imageChromaPitch, &imageChromaHeight);
-+            DdiMedia_CopyPlane(uDst, image->pitches[1], uSrc, chromaPitch, imageChromaHeight);
-+
-+            if(image->num_planes > 2)
-+            {
-+                uint8_t *vSrc = uSrc + chromaPitch * chromaHeight;
-+                uint8_t *vDst = yDst + image->offsets[2];
-+                DdiMedia_CopyPlane(vDst, image->pitches[2], vSrc, chromaPitch, imageChromaHeight);
-+            }
-+        }
-+    }
-+
-+    vaStatus = DdiMedia_UnmapBuffer(ctx, image->buf);
-+    if (vaStatus != VA_STATUS_SUCCESS)
-+    {
-+        DDI_ASSERTMESSAGE("Failed to unmap buffer.");
-+        DdiMediaUtil_UnlockSurface(surface);
-+        return vaStatus;
-+    }
-+
-+    DdiMediaUtil_UnlockSurface(surface);
-+
-+    return vaStatus;
-+}
-+
-+
- //!
- //! \brief  Retrive surface data into a VAImage
- //! \details    Image must be in a format supported by the implementation
-@@ -4593,57 +4661,11 @@ VAStatus DdiMedia_GetImage(
-     DDI_CHK_NULL(mediaSurface,     "nullptr mediaSurface.",      VA_STATUS_ERROR_INVALID_SURFACE);
-     DDI_CHK_NULL(mediaSurface->bo, "nullptr mediaSurface->bo.",  VA_STATUS_ERROR_INVALID_SURFACE);
- 
--    //Lock Surface
--    void *surfData = DdiMediaUtil_LockSurface(mediaSurface, (MOS_LOCKFLAG_READONLY | MOS_LOCKFLAG_NO_SWIZZLE));
--    if (surfData == nullptr)
--    {
--        DDI_ASSERTMESSAGE("nullptr surfData.");
--        if(target_surface != VA_INVALID_SURFACE)
--        {
--            DdiMedia_DestroySurfaces(ctx, &target_surface, 1);
--        }
--        return vaStatus;
--    }
--
--    void *imageData = nullptr;
--    vaStatus = DdiMedia_MapBuffer(ctx, vaimg->buf, &imageData);
--    if (vaStatus != VA_STATUS_SUCCESS)
--    {
--        DDI_ASSERTMESSAGE("Failed to map buffer.");
--        DdiMediaUtil_UnlockSurface(mediaSurface);
--        if(target_surface != VA_INVALID_SURFACE)
--        {
--            DdiMedia_DestroySurfaces(ctx, &target_surface, 1);
--        }
--        return vaStatus;
--    }
-+	vaStatus = DdiMedia_CopySurfaceToImage(ctx, mediaSurface, vaimg);
- 
--    //Copy data from surface to image
--    if(mediaSurface->TileType == I915_TILING_NONE)
--    {
--        vaStatus = MOS_SecureMemcpy(imageData, vaimg->data_size, surfData, vaimg->data_size);
--    }
--    else
--    {
--        //Mos_SwizzleData((uint8_t*)surfData, (uint8_t *)imageData, (MOS_TILE_TYPE)mediaSurface->TileType, MOS_TILE_LINEAR, vaimg->data_size / mediaSurface->iPitch, mediaSurface->iPitch, mediaSurface->uiMapFlag);
--        vaStatus = SwizzleSurface(mediaSurface->pMediaCtx,mediaSurface->pGmmResourceInfo, surfData, (MOS_TILE_TYPE)mediaSurface->TileType, (uint8_t *)imageData, false);
--    }
-     if (vaStatus != MOS_STATUS_SUCCESS)
-     {
-         DDI_ASSERTMESSAGE("Failed to copy surface to image buffer data!");
--        DdiMediaUtil_UnlockSurface(mediaSurface);
--        if(target_surface != VA_INVALID_SURFACE)
--        {
--            DdiMedia_DestroySurfaces(ctx, &target_surface, 1);
--        }
--        return vaStatus;
--    }
--
--    vaStatus = DdiMedia_UnmapBuffer(ctx, vaimg->buf);
--    if (vaStatus != VA_STATUS_SUCCESS)
--    {
--        DDI_ASSERTMESSAGE("Failed to unmap buffer.");
--        DdiMediaUtil_UnlockSurface(mediaSurface);
-         if(target_surface != VA_INVALID_SURFACE)
-         {
-             DdiMedia_DestroySurfaces(ctx, &target_surface, 1);
-@@ -4651,8 +4673,6 @@ VAStatus DdiMedia_GetImage(
-         return vaStatus;
-     }
- 
--    DdiMediaUtil_UnlockSurface(mediaSurface);
--
-     //Destroy temp surface if created
-     if(target_surface != VA_INVALID_SURFACE)
-     {
-@@ -4662,37 +4682,7 @@ VAStatus DdiMedia_GetImage(
-     return VA_STATUS_SUCCESS;
- }
- 
--//!
--//! \brief  Copy plane from src to dst row by row when src and dst strides are different
--//!
--//! \param  [in] dst
--//!         Destination plane
--//! \param  [in] dstPitch
--//!         Destination plane pitch
--//! \param  [in] src
--//!         Source plane
--//! \param  [in] srcPitch
--//!         Source plane pitch
--//! \param  [in] height
--//!         Plane hight
--//!
--static void DdiMedia_CopyPlane(
--    uint8_t *dst,
--    uint32_t dstPitch,
--    uint8_t *src,
--    uint32_t srcPitch,
--    uint32_t height)
--{
--    uint32_t rowSize = std::min(dstPitch, srcPitch);
--    for (int y = 0; y < height; y += 1)
--    {
--        memcpy(dst, src, rowSize);
--        dst += dstPitch;
--        src += srcPitch;
--    }
--}
- 
--static uint32_t DdiMedia_GetChromaPitchHeight(PDDI_MEDIA_SURFACE mediaSurface, uint32_t *chromaWidth, uint32_t *chromaPitch, uint32_t *chromaHeight);
- 
- //!
- //! \brief  Copy data from a VAImage to a surface
-@@ -4885,11 +4875,9 @@ VAStatus DdiMedia_PutImage(
-                 uPlane.iWidth              = src_width;
-                 uPlane.iRealHeight         = src_height;
-                 uPlane.iHeight             = src_height;
--                uint32_t chromaWidth       = 0;
-                 uint32_t chromaHeight      = 0;
-                 uint32_t chromaPitch       = 0;
--                uint32_t surfacePlaneCount = DdiMedia_GetChromaPitchHeight(&uPlane, &chromaWidth, &chromaPitch, &chromaHeight);
--                DDI_CHK_CONDITION((surfacePlaneCount != vaimg->num_planes), "DDI:Failed to copy image to surface buffer, diffrent number of planes.", VA_STATUS_ERROR_OPERATION_FAILED);
-+				DdiMedia_GetChromaPitchHeight(DdiMedia_MediaFormatToOsFormat(uPlane.format), uPlane.iPitch, uPlane.iHeight, &chromaPitch, &chromaHeight);
- 
-                 uint8_t *uSrc = (uint8_t *)imageData + vaimg->offsets[1];
-                 uint8_t *uDst = yDst + mediaSurface->iPitch * mediaSurface->iHeight;
-@@ -5908,43 +5896,37 @@ VAStatus DdiMedia_ReleaseBufferHandle(
- #endif
- 
- 
--static uint32_t DdiMedia_GetChromaPitchHeight(PDDI_MEDIA_SURFACE mediaSurface, uint32_t *chromaWidth, uint32_t *chromaPitch, uint32_t *chromaHeight)
-+static uint32_t DdiMedia_GetChromaPitchHeight(
-+	uint32_t fourcc,
-+	uint32_t pitch,
-+	uint32_t height,
-+	uint32_t *chromaPitch,
-+	uint32_t *chromaHeight)
- {
--    DDI_CHK_NULL(mediaSurface, "nullptr mediaSurface", VA_STATUS_ERROR_INVALID_PARAMETER);
--    DDI_CHK_NULL(chromaWidth, "nullptr chromaWidth", VA_STATUS_ERROR_INVALID_PARAMETER);
-     DDI_CHK_NULL(chromaPitch, "nullptr chromaPitch", VA_STATUS_ERROR_INVALID_PARAMETER);
-     DDI_CHK_NULL(chromaHeight, "nullptr chromaHeight", VA_STATUS_ERROR_INVALID_PARAMETER);
- 
--    uint32_t fourcc = DdiMedia_MediaFormatToOsFormat(mediaSurface->format);
-     switch(fourcc)
-     {
-         case VA_FOURCC_NV12:
--            *chromaWidth = mediaSurface->iWidth;
--            *chromaHeight = mediaSurface->iHeight/2;
--            *chromaPitch = mediaSurface->iPitch;
--            return 2;
-+		case VA_FOURCC_P010:
-+		case VA_FOURCC_P016:
-+            *chromaHeight = MOS_ALIGN_CEIL(height, 2) / 2;
-+            *chromaPitch = pitch;
-+            break;
-         case VA_FOURCC_I420:
-         case VA_FOURCC_YV12:
--            *chromaWidth = mediaSurface->iWidth / 2;
--            *chromaHeight = mediaSurface->iHeight/2;
--            *chromaPitch = mediaSurface->iPitch /2;
--            return 3;
-+            *chromaHeight = MOS_ALIGN_CEIL(height, 2) / 2;
-+            *chromaPitch = MOS_ALIGN_CEIL(pitch, 2) / 2;
-+            break;
-         case VA_FOURCC_YV16:
--            *chromaWidth = mediaSurface->iWidth / 2;
--            *chromaHeight = mediaSurface->iHeight;
--            *chromaPitch = mediaSurface->iPitch / 2;
--            return 3;
--        case VA_FOURCC_P010:
--        case VA_FOURCC_P016:
--            *chromaWidth = mediaSurface->iWidth ;
--            *chromaHeight = mediaSurface->iHeight/2;
--            *chromaPitch = mediaSurface->iPitch;
--            return 2;
-+            *chromaHeight = height;
-+            *chromaPitch = MOS_ALIGN_CEIL(pitch, 2) / 2;
-+            break;
-         case VA_FOURCC_I010:
--            *chromaWidth = mediaSurface->iWidth / 2;
--            *chromaHeight = mediaSurface->iHeight/2;
--            *chromaPitch = mediaSurface->iPitch / 2;
--            return 2;
-+            *chromaHeight = MOS_ALIGN_CEIL(height, 2) / 2;
-+            *chromaPitch = MOS_ALIGN_CEIL(pitch, 2) / 2;
-+            break;
-         case VA_FOURCC_YUY2:
-         case VA_FOURCC_Y800:
-         case VA_FOURCC_UYVY:
-@@ -5955,11 +5937,10 @@ static uint32_t DdiMedia_GetChromaPitchHeight(PDDI_MEDIA_SURFACE mediaSurface, u
-         case VA_FOURCC_ARGB:
-         case VA_FOURCC_ABGR:
-         default:
--            *chromaWidth = 0;
-             *chromaPitch = 0;
-             *chromaHeight = 0;
--            return 1;
-     }
-+	return VA_STATUS_SUCCESS;
- }
- 
- static uint32_t DdiMedia_GetDrmFormatOfSeparatePlane(uint32_t fourcc, int plane)
-@@ -6057,6 +6038,64 @@ static uint32_t DdiMedia_GetDrmFormatOfCompositeObject(uint32_t fourcc)
- }
- 
- 
-+static uint32_t DdiMedia_GetPlaneNum(PDDI_MEDIA_SURFACE mediaSurface, bool hasAuxPlane)
-+{
-+    DDI_CHK_NULL(mediaSurface, "nullptr mediaSurface", VA_STATUS_ERROR_INVALID_PARAMETER);
-+
-+    uint32_t fourcc = DdiMedia_MediaFormatToOsFormat(mediaSurface->format);
-+    uint32_t plane_num = 0;
-+    switch(fourcc)
-+    {
-+        case VA_FOURCC_NV12:
-+        case VA_FOURCC_NV21:
-+        case VA_FOURCC_P010:
-+        case VA_FOURCC_P016:
-+            plane_num = hasAuxPlane ? 4 : 2;
-+            break;
-+            plane_num = hasAuxPlane ? 4 : 2;
-+            break;
-+        case VA_FOURCC_I420:
-+        case VA_FOURCC_YV12:
-+        case VA_FOURCC_411P:
-+        case VA_FOURCC_422H:
-+        case VA_FOURCC_422V:
-+        case VA_FOURCC_444P:
-+        case VA_FOURCC_IMC3:
-+        case VA_FOURCC_RGBP:
-+        case VA_FOURCC_BGRP:
-+            plane_num = 3;
-+            break;
-+        case VA_FOURCC_YUY2:
-+        case VA_FOURCC_UYVY:
-+        case VA_FOURCC_YVYU:
-+        case VA_FOURCC_VYUY:
-+        case VA_FOURCC_Y800:
-+        case VA_FOURCC_Y210:
-+        case VA_FOURCC_Y216:
-+        case VA_FOURCC_Y410:
-+        case VA_FOURCC_Y416:
-+        case VA_FOURCC_AYUV:
-+        case VA_FOURCC_RGBA:
-+        case VA_FOURCC_RGBX:
-+        case VA_FOURCC_BGRA:
-+        case VA_FOURCC_BGRX:
-+        case VA_FOURCC_ARGB:
-+        case VA_FOURCC_ABGR:
-+        case VA_FOURCC_XRGB:
-+        case VA_FOURCC_XBGR:
-+        case VA_FOURCC_RGB565:
-+        case VA_FOURCC_R8G8B8:
-+        case VA_FOURCC_A2R10G10B10:
-+        case VA_FOURCC_A2B10G10R10:
-+            plane_num = hasAuxPlane ? 2 : 1;
-+            break;
-+        default:
-+            DDI_ASSERTMESSAGE("Unsupported format.\n");
-+    }
-+    return plane_num;
-+}
-+
-+
- //!
- //! \brief   API for export surface handle to other component
- //!
-@@ -6075,6 +6114,7 @@ static uint32_t DdiMedia_GetDrmFormatOfCompositeObject(uint32_t fourcc)
- //! \return VAStatus
- //!     VA_STATUS_SUCCESS if success, else fail reason
- //!
-+
- VAStatus DdiMedia_ExportSurfaceHandle(
-     VADriverContextP ctx,
-     VASurfaceID surface_id,
-@@ -6095,16 +6135,15 @@ VAStatus DdiMedia_ExportSurfaceHandle(
-     DDI_CHK_NULL(mediaSurface->bo,               "nullptr mediaSurface->bo",               VA_STATUS_ERROR_INVALID_SURFACE);
-     DDI_CHK_NULL(mediaSurface->pGmmResourceInfo, "nullptr mediaSurface->pGmmResourceInfo", VA_STATUS_ERROR_INVALID_SURFACE);
- 
--    int32_t ret = mos_bo_gem_export_to_prime(mediaSurface->bo, (int32_t*)&mediaSurface->name);
--    if (ret)
--    {
--        //LOGE("Failed drm_intel_gem_export_to_prime operation!!!\n");
--        return VA_STATUS_ERROR_OPERATION_FAILED;
-+    if (mem_type != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2) {
-+        DDI_ASSERTMESSAGE("vaExportSurfaceHandle: memory type %08x is not supported.\n", mem_type);
-+        return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE;
-     }
--    uint32_t tiling, swizzle;
--    if(mos_bo_get_tiling(mediaSurface->bo,&tiling, &swizzle))
-+
-+    if (mos_bo_gem_export_to_prime(mediaSurface->bo, (int32_t*)&mediaSurface->name))
-     {
--        tiling = I915_TILING_NONE;
-+        DDI_ASSERTMESSAGE("Failed drm_intel_gem_export_to_prime operation!!!\n");
-+        return VA_STATUS_ERROR_OPERATION_FAILED;
-     }
- 
-     VADRMPRIMESurfaceDescriptor *desc = (VADRMPRIMESurfaceDescriptor *)descriptor;
-@@ -6113,35 +6152,37 @@ VAStatus DdiMedia_ExportSurfaceHandle(
-     {
-         return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
-     }
--    desc->width  = mediaSurface->iWidth;
--    desc->height = mediaSurface->iHeight;
--
-+    desc->width           = mediaSurface->iWidth;
-+    desc->height          = mediaSurface->iHeight;
-     desc->num_objects     = 1;
-     desc->objects[0].fd   = mediaSurface->name;
-     desc->objects[0].size = mediaSurface->pGmmResourceInfo->GetSizeSurface();
--    switch (tiling) {
-+    switch (mediaSurface->TileType) {
-     case I915_TILING_X:
-         desc->objects[0].drm_format_modifier = I915_FORMAT_MOD_X_TILED;
-         break;
-     case I915_TILING_Y:
--        desc->objects[0].drm_format_modifier = I915_FORMAT_MOD_Y_TILED;
-+        if (mediaCtx->m_auxTableMgr)
-+        {
-+            desc->objects[0].drm_format_modifier = I915_FORMAT_MOD_Y_TILED;//I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
-+        }else
-+        {
-+            desc->objects[0].drm_format_modifier = I915_FORMAT_MOD_Y_TILED;
-+        }
-         break;
-     case I915_TILING_NONE:
-     default:
-         desc->objects[0].drm_format_modifier = DRM_FORMAT_MOD_NONE;
-     }
-+
-     int composite_object = flags & VA_EXPORT_SURFACE_COMPOSED_LAYERS;
- 
-     uint32_t formats[4];
--    uint32_t chromaWidth;
--    uint32_t chromaPitch;
--    uint32_t chromaHeight;
--    uint32_t num_planes = DdiMedia_GetChromaPitchHeight(mediaSurface,&chromaWidth, &chromaPitch,&chromaHeight);
--
-+    bool hasAuxPlane = (mediaCtx->m_auxTableMgr)? true: false;
-+    uint32_t num_planes = DdiMedia_GetPlaneNum(mediaSurface, hasAuxPlane);
-     if(composite_object)
-     {
-         formats[0] = DdiMedia_GetDrmFormatOfCompositeObject(desc->fourcc);
--
-         if(!formats[0])
-         {
-             DDI_ASSERTMESSAGE("vaExportSurfaceHandle: fourcc %08x is not supported for export as a composite object.\n", desc->fourcc);
-@@ -6155,76 +6196,132 @@ VAStatus DdiMedia_ExportSurfaceHandle(
-             formats[i] = DdiMedia_GetDrmFormatOfSeparatePlane(desc->fourcc,i);
-             if (!formats[i])
-             {
--                DDI_ASSERTMESSAGE("vaExportSurfaceHandle: fourcc %08x "
--                              "is not supported for export as separate "
--                              "planes.\n", desc->fourcc);
-+                DDI_ASSERTMESSAGE("vaExportSurfaceHandle: fourcc %08x is not supported for export as separate planes.\n", desc->fourcc);
-                 return VA_STATUS_ERROR_INVALID_SURFACE;
-             }
-         }
-     }
- 
--    uint32_t offset = 0;
--    uint32_t pitch  = 0;
--    uint32_t height = 0;
-+    // Get offset from GMM
-+    GMM_REQ_OFFSET_INFO reqInfo = {0};
-+    reqInfo.Plane = GMM_PLANE_Y;
-+    reqInfo.ReqRender = 1;
-+    mediaSurface->pGmmResourceInfo->GetOffset(reqInfo);
-+    uint32_t offsetY = reqInfo.Render.Offset;
-+    MOS_ZeroMemory(&reqInfo, sizeof(GMM_REQ_OFFSET_INFO));
-+    reqInfo.Plane = GMM_PLANE_U;
-+    reqInfo.ReqRender = 1;
-+    mediaSurface->pGmmResourceInfo->GetOffset(reqInfo);
-+    uint32_t offsetUV = reqInfo.Render.Offset;
-+    uint32_t auxOffsetY = (uint32_t)mediaSurface->pGmmResourceInfo->GetPlanarAuxOffset(0, GMM_AUX_Y_CCS);
-+    uint32_t auxOffsetUV = (uint32_t)mediaSurface->pGmmResourceInfo->GetPlanarAuxOffset(0, GMM_AUX_UV_CCS);
- 
-     if (composite_object) {
-         desc->num_layers = 1;
--
-         desc->layers[0].drm_format = formats[0];
-         desc->layers[0].num_planes = num_planes;
--
--        for (int i = 0; i < num_planes; i++)
-+        if (mediaCtx->m_auxTableMgr)
-         {
--            desc->layers[0].object_index[i] = 0;
--            if (i == 0)
-+            // For semi-planar formats like NV12, CCS planes follow the Y and UV planes,
-+            // i.e. planes 0 and 1 are used for Y and UV surfaces, planes 2 and 3 for the respective CCS.
-+            for (int i = 0; i < num_planes/2; i++)
-             {
--                pitch  = mediaSurface->iPitch;
--                height = mediaSurface->iHeight;
-+                desc->layers[0].object_index[2*i] = 0;
-+                desc->layers[0].object_index[2*i+1] = 0;
-+                if (i == 0)
-+                {
-+                    // Y plane
-+                    desc->layers[0].offset[i] = offsetY;
-+                    desc->layers[0].pitch[i]  = mediaSurface->iPitch;
-+                    // Y aux plane
-+                    desc->layers[0].offset[i + num_planes/2] = auxOffsetY;
-+                    desc->layers[0].pitch[i + num_planes/2] = mediaSurface->iPitch/8;
-+                }
-+                else
-+                {
-+                    // UV plane
-+                    desc->layers[0].offset[i] = offsetUV;
-+                    desc->layers[0].pitch[i]  = mediaSurface->iPitch;
-+                    // UV aux plane
-+                    desc->layers[0].offset[i + num_planes/2] = auxOffsetUV;
-+                    desc->layers[0].pitch[i + num_planes/2] = mediaSurface->iPitch/8;
-+                }
-             }
--            else
-+        }else
-+        {
-+            for (int i = 0; i < num_planes; i++)
-             {
--                pitch = chromaPitch;
--                height = chromaHeight;
-+                desc->layers[0].object_index[i] = 0;
-+                if (i == 0)
-+                {
-+                    desc->layers[0].offset[i] = offsetY;
-+                    desc->layers[0].pitch[i]  = mediaSurface->iPitch;
-+                }
-+                else
-+                {
-+                    desc->layers[0].offset[i] = offsetUV;
-+                    desc->layers[0].pitch[i]  = mediaSurface->iPitch;
-+                }
-             }
--
--            desc->layers[0].offset[i] = offset;
--            desc->layers[0].pitch[i]  = pitch;
--
--            offset += pitch * height;
-         }
-     }
-     else
-     {
--        desc->num_layers = num_planes;
--
--        offset = 0;
--        for (int i = 0; i < num_planes; i++)
-+        if (mediaCtx->m_auxTableMgr)
-         {
--            desc->layers[i].drm_format = formats[i];
--            desc->layers[i].num_planes = 1;
-+            desc->num_layers = num_planes / 2;
- 
--            desc->layers[i].object_index[0] = 0;
--
--            if (i == 0)
-+            for (int i = 0; i < desc->num_layers; i++)
-             {
--                pitch  = mediaSurface->iPitch;
--                height = mediaSurface->iHeight;
-+                desc->layers[i].drm_format = formats[i];
-+                desc->layers[i].num_planes = 2;
-+
-+                desc->layers[i].object_index[0] = 0;
-+
-+                if (i == 0)
-+                {
-+                    desc->layers[i].offset[0] = offsetY;
-+                    desc->layers[i].offset[1] = auxOffsetY;
-+                    desc->layers[i].pitch[0]  = mediaSurface->iPitch;
-+                    desc->layers[i].pitch[1]  = mediaSurface->iPitch/8;
-+                }
-+                else
-+                {
-+                    desc->layers[i].offset[0] = offsetUV;
-+                    desc->layers[i].offset[1] = auxOffsetUV;
-+                    desc->layers[i].pitch[0]  = mediaSurface->iPitch;
-+                    desc->layers[i].pitch[1]  = mediaSurface->iPitch/8;
-+                }
-             }
--            else
-+        }else
-+        {
-+            desc->num_layers = num_planes;
-+
-+            for (int i = 0; i < num_planes; i++)
-             {
--                pitch  =  chromaPitch;
--                height = chromaHeight;
--            }
-+                desc->layers[i].drm_format = formats[i];
-+                desc->layers[i].num_planes = 1;
- 
--            desc->layers[i].offset[0] = offset;
--            desc->layers[i].pitch[0]  = pitch;
-+                desc->layers[i].object_index[0] = 0;
- 
--            offset += pitch * height;
-+                if (i == 0)
-+                {
-+                    desc->layers[i].offset[0] = offsetY;
-+                    desc->layers[i].pitch[0]  = mediaSurface->iPitch;
-+                }
-+                else
-+                {
-+                    desc->layers[i].offset[0] = offsetUV;
-+                    desc->layers[i].pitch[0]  = mediaSurface->iPitch;
-+                }
-+            }
-         }
-     }
-+
-     return VA_STATUS_SUCCESS;
- }
- 
-+
- //!
- //! \brief  Init VA driver 0.31
- //! 
-diff --git a/media_driver/linux/common/ddi/media_libva_util.cpp b/media_driver/linux/common/ddi/media_libva_util.cpp
-index f4e58e7c..aef223a1 100644
---- a/media_driver/linux/common/ddi/media_libva_util.cpp
-+++ b/media_driver/linux/common/ddi/media_libva_util.cpp
-@@ -423,7 +423,7 @@ VAStatus DdiMediaUtil_AllocateSurface(
-     uint32_t    gmmHeight;
- 
-     gmmPitch    = (uint32_t)gmmResourceInfo->GetRenderPitch();
--    if( DdiMediaUtil_IsExternalSurface(mediaSurface) && ( mediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR ) && mediaSurface->pSurfDesc->uiPitches[0])
-+    if( DdiMediaUtil_IsExternalSurface(mediaSurface) && mediaSurface->pSurfDesc->uiPitches[0])
-     {
-         gmmResourceInfo->OverridePitch(mediaSurface->pSurfDesc->uiPitches[0]);
-     }
-diff --git a/media_driver/linux/common/os/mos_os_specific.c b/media_driver/linux/common/os/mos_os_specific.c
-index 2213d24e..034997f8 100644
---- a/media_driver/linux/common/os/mos_os_specific.c
-+++ b/media_driver/linux/common/os/mos_os_specific.c
-@@ -2506,7 +2506,7 @@ MOS_STATUS Mos_Specific_GetResourceInfo(
-     pResDetails->Format   = pOsResource->Format;
- 
-     // Get planes
--    if (pOsResource->b16UsrPtrMode)
-+    if (pOsResource->b16UsrPtrMode || pOsResource->bExternalSurface)
-     {
-         // if usrptr surface, do not query those values from gmm, app will configure them.
-         pResDetails->RenderOffset.YUV.Y.BaseOffset = pOsResource->YPlaneOffset.iSurfaceOffset;
-diff --git a/media_driver/linux/common/os/mos_os_specific.h b/media_driver/linux/common/os/mos_os_specific.h
-index 805be513..75dd0bb6 100644
---- a/media_driver/linux/common/os/mos_os_specific.h
-+++ b/media_driver/linux/common/os/mos_os_specific.h
-@@ -257,6 +257,7 @@ struct _MOS_SPECIFIC_RESOURCE
-     GMM_RESOURCE_INFO   *pGmmResInfo;        //!< GMM resource descriptor
-     MOS_MMAP_OPERATION  MmapOperation;
-     uint8_t             *pSystemShadow;
-+    bool                bExternalSurface;   //!< indicate the surface allocated by external
-     bool                b16UsrPtrMode;      //!< indicate source info comes from app.
-     MOS_PLANE_OFFSET    YPlaneOffset;       //!< Y surface plane offset
-     MOS_PLANE_OFFSET    UPlaneOffset;       //!< U surface plane offset
-diff --git a/media_driver/linux/common/vp/ddi/media_libva_vp.c b/media_driver/linux/common/vp/ddi/media_libva_vp.c
-index 9df8c761..7f1a7b9d 100644
---- a/media_driver/linux/common/vp/ddi/media_libva_vp.c
-+++ b/media_driver/linux/common/vp/ddi/media_libva_vp.c
-@@ -148,6 +148,95 @@ bool VpIs16UsrPtrPitch(uint32_t pitch, DDI_MEDIA_FORMAT format)
-     return status;
- }
- 
-+VAStatus VpGetExternalSurfaceInfo(
-+    PDDI_MEDIA_SURFACE pMediaSurface,
-+    PVPHAL_SURFACE pVphalSurface)
-+{
-+    if (pMediaSurface->pSurfDesc)
-+    {
-+        if (pMediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM ||
-+            pMediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME)
-+        {
-+            pVphalSurface->OsResource.bExternalSurface = true;
-+
-+            switch (pMediaSurface->pSurfDesc->uiPlanes)
-+            {
-+                case 1:
-+                    pVphalSurface->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[0];
-+                    break;
-+                case 2:
-+                    pVphalSurface->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[0];
-+                    pVphalSurface->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                    pVphalSurface->OsResource.UPlaneOffset.iYOffset       = 0;
-+                    pVphalSurface->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                    pVphalSurface->OsResource.VPlaneOffset.iYOffset       = 0;
-+                    break;
-+                case 3:
-+                    pVphalSurface->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[0];
-+                    pVphalSurface->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                    pVphalSurface->OsResource.UPlaneOffset.iYOffset       = 0;
-+                    pVphalSurface->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[2];
-+                    pVphalSurface->OsResource.VPlaneOffset.iYOffset       = 0;
-+                    break;
-+                default:
-+                    DDI_ASSERTMESSAGE("Invalid plane number.");
-+                    return VA_STATUS_ERROR_INVALID_PARAMETER;
-+            }
-+        }
-+        // add 16aligned UsrPtr mode support
-+        else if (pMediaSurface->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR)
-+        {
-+            pVphalSurface->b16UsrPtr = VpIs16UsrPtrPitch(pMediaSurface->iPitch, pMediaSurface->format);
-+            if (pVphalSurface->b16UsrPtr)
-+            {
-+                pVphalSurface->dwPitch                   = pMediaSurface->iPitch;
-+                pVphalSurface->OsResource.iPitch         = pMediaSurface->iPitch;
-+                pVphalSurface->OsResource.iWidth         = pMediaSurface->iWidth;
-+                pVphalSurface->OsResource.iHeight        = pMediaSurface->iHeight;
-+                pVphalSurface->OsResource.b16UsrPtrMode  = true;
-+                switch (pMediaSurface->format)
-+                {
-+                    case Media_Format_NV12:
-+                        pVphalSurface->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[0];
-+                        pVphalSurface->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                        pVphalSurface->OsResource.UPlaneOffset.iYOffset       = 0;
-+                        pVphalSurface->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                        pVphalSurface->OsResource.VPlaneOffset.iYOffset       = 0;
-+                        break;
-+                    case Media_Format_YV12:
-+                        pVphalSurface->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[0];
-+                        pVphalSurface->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[1];
-+                        pVphalSurface->OsResource.VPlaneOffset.iYOffset       = 0;
-+                        pVphalSurface->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSurface->pSurfDesc->uiOffsets[2];
-+                        pVphalSurface->OsResource.UPlaneOffset.iYOffset       = 0;
-+                        break;
-+                    case Media_Format_A8R8G8B8:
-+                        break;
-+                    default:
-+                        break;
-+                }
-+            }
-+            else
-+            {
-+                pVphalSurface->OsResource.b16UsrPtrMode = false;
-+            }
-+        }
-+        else
-+        {
-+            DDI_ASSERTMESSAGE("Unsupported memory type.");
-+            return VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE;
-+        }
-+    }
-+    else
-+    {
-+        pVphalSurface->b16UsrPtr                   = false;
-+        pVphalSurface->OsResource.b16UsrPtrMode    = false;
-+        pVphalSurface->OsResource.bExternalSurface = false;
-+    }
-+    return VA_STATUS_SUCCESS;
-+}
-+
-+
- /////////////////////////////////////////////////////////////////////////////
- //! \purpose map from media format to vphal format
- //! \params
-@@ -1431,49 +1520,10 @@ DdiVp_SetProcPipelineParams(
-         DDI_CHK_RET(vaStatus, "Failed to update vphal target surface color space!");
-     }
- 
--    // add 16aligned UsrPtr mode support
--    if (pMediaSrcSurf->pSurfDesc && (pMediaSrcSurf->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR))
--    {
--        pVpHalSrcSurf->b16UsrPtr = VpIs16UsrPtrPitch(pMediaSrcSurf->iPitch, pMediaSrcSurf->format);
--        if (pVpHalSrcSurf->b16UsrPtr)
--        {
--            pVpHalSrcSurf->dwPitch                   = pMediaSrcSurf->iPitch;
--            pVpHalSrcSurf->OsResource.iPitch         = pMediaSrcSurf->iPitch;
--            pVpHalSrcSurf->OsResource.iWidth         = pMediaSrcSurf->iWidth;
--            pVpHalSrcSurf->OsResource.iHeight        = pMediaSrcSurf->iHeight;
--            pVpHalSrcSurf->OsResource.b16UsrPtrMode  = true;
--            switch (pMediaSrcSurf->format)
--            {
--                case Media_Format_NV12:
--                    pVpHalSrcSurf->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[0];
--                    pVpHalSrcSurf->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[1];
--                    pVpHalSrcSurf->OsResource.UPlaneOffset.iYOffset       = 0;
--                    pVpHalSrcSurf->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[1];
--                    pVpHalSrcSurf->OsResource.VPlaneOffset.iYOffset       = 0;
--                    break;
--                case Media_Format_YV12:
--                    pVpHalSrcSurf->OsResource.YPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[0];
--                    pVpHalSrcSurf->OsResource.VPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[1];
--                    pVpHalSrcSurf->OsResource.VPlaneOffset.iYOffset       = 0;
--                    pVpHalSrcSurf->OsResource.UPlaneOffset.iSurfaceOffset = pMediaSrcSurf->pSurfDesc->uiOffsets[2];
--                    pVpHalSrcSurf->OsResource.UPlaneOffset.iYOffset       = 0;
--                    break;
--                case Media_Format_A8R8G8B8:
--                    break;
--                default:
--                    break;
--            }
--        }
--        else
--        {
--            pVpHalSrcSurf->OsResource.b16UsrPtrMode = false;
--        }
--    }
--    else
--    {
--        pVpHalSrcSurf->b16UsrPtr                 = false;
--        pVpHalSrcSurf->OsResource.b16UsrPtrMode  = false;
--    }
-+    // Add external surface info
-+    vaStatus = VpGetExternalSurfaceInfo(pMediaSrcSurf, pVpHalSrcSurf);
-+    DDI_CHK_RET(vaStatus, "Failed to update external surface.");
-+
-     return VA_STATUS_SUCCESS;
- }
- 
-@@ -3214,24 +3264,10 @@ VAStatus DdiVp_BeginPicture(
- 
-     pVpHalRenderParams->bReportStatus    = true;
-     pVpHalRenderParams->StatusFeedBackID = vaSurfID;
--    if (pMediaTgtSurf->pSurfDesc && (pMediaTgtSurf->pSurfDesc->uiVaMemType == VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR))
--    {
--        pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->b16UsrPtr = VpIs16UsrPtrPitch(pMediaTgtSurf->iPitch, pMediaTgtSurf->format);
--        if (pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->b16UsrPtr)
--        {
--            pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->OsResource.iPitch = pMediaTgtSurf->iPitch;
--            pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->OsResource.b16UsrPtrMode = true;
--        }
--        else
--        {
--            pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->OsResource.b16UsrPtrMode = false;
--        }
--    }
--    else
--    {
--        pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->b16UsrPtr = false;
--        pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]->OsResource.b16UsrPtrMode = false;
--    }
-+
-+    // Get external surface info
-+    vaStatus = VpGetExternalSurfaceInfo(pMediaTgtSurf, pVpHalRenderParams->pTarget[pVpHalRenderParams->uDstCount]);
-+
-     // increase render target count
-     pVpHalRenderParams->uDstCount++;
- 
--- 
-2.26.0.windows.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0014-VP-Fix-memory-corruption-due-to-improper-typecast.patch b/x11-libs/libva-intel-media-driver/files/0014-VP-Fix-memory-corruption-due-to-improper-typecast.patch
deleted file mode 100644
index 67ce509..0000000
--- a/x11-libs/libva-intel-media-driver/files/0014-VP-Fix-memory-corruption-due-to-improper-typecast.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From a95f4607841574fe7eb511ebf8be4d4c3d946c78 Mon Sep 17 00:00:00 2001
-From: Yu Kang Ku <yu.kang.ku@intel.com>
-Date: Wed, 11 Mar 2020 22:09:13 -0700
-Subject: [PATCH] [VP] Fix memory corruption
-
-When KernelDll_BuildKernel_CmFc() calls cm_fc_combine_kernels()
-(see [1]), one of the inputs is &dwEstimatedKernelSize.  It is a
-uint32_t pointer but is typecasted to a size_t pointer.
-
-On platforms where size_t is a 64-bit integer, subsequent write
-operations using this size_t pointer results in 4 bytes of
-memory corruption.
-
-[1] https://github.com/intel/media-driver/blob/master/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c#L5045
-
-(cherry picked from commit 3783175d95a4d27cc3be6d69e144b5f7d521cbbf)
----
- .../agnostic/common/vp/kdll/hal_kerneldll.c        | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c b/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-index 7532c736..bd530007 100644
---- a/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-+++ b/media_driver/agnostic/common/vp/kdll/hal_kerneldll.c
-@@ -4915,7 +4915,7 @@ bool KernelDll_BuildKernel_CmFc(Kdll_State *pState, Kdll_SearchState *pSearchSta
-     int32_t           iOffset;
-     uint32_t          dwResolveOffset[DL_MAX_EXPORT_COUNT];
-     uint32_t          dwTotalKernelCount;
--    uint32_t          dwEstimatedKernelSize;
-+    size_t            stEstimatedKernelSize;
-     int32_t           iKUID;
-     bool              bResolveDone;
-     int32_t           i;
-@@ -4946,7 +4946,7 @@ bool KernelDll_BuildKernel_CmFc(Kdll_State *pState, Kdll_SearchState *pSearchSta
- 
-     MOS_ZeroMemory(Cm_Fc_kernels, sizeof(Cm_Fc_kernels));
-     dwTotalKernelCount = 0;
--    dwEstimatedKernelSize = 0;
-+    stEstimatedKernelSize = 0;
- 
- #if EMUL || VPHAL_LIB || _DEBUG
-     VPHAL_RENDER_NORMALMESSAGE("Component Kernels:");
-@@ -4964,7 +4964,7 @@ bool KernelDll_BuildKernel_CmFc(Kdll_State *pState, Kdll_SearchState *pSearchSta
-         // Append/Patch kernel from internal cache
-         res = Kdll_AddKernelList(pKernelCache, pPatchCache, pSearchState, *pKernelID, pKernelPatch, pPatchData, &Cm_Fc_kernels[dwTotalKernelCount]);
- 
--        dwEstimatedKernelSize += Cm_Fc_kernels[dwTotalKernelCount].binary_size;
-+        stEstimatedKernelSize += Cm_Fc_kernels[dwTotalKernelCount].binary_size;
- 
-         if (*pKernelID == IDR_VP_EOT)
-         {
-@@ -5031,17 +5031,17 @@ bool KernelDll_BuildKernel_CmFc(Kdll_State *pState, Kdll_SearchState *pSearchSta
-         } // for
-     } while (!bResolveDone);
- 
--    if (dwEstimatedKernelSize > DL_MAX_KERNEL_SIZE)
-+    if (stEstimatedKernelSize > DL_MAX_KERNEL_SIZE)
-     {
-         res = false;
-         VPHAL_RENDER_NORMALMESSAGE("Kernel size exceeded kdll limitatin.");
-         goto finish;
-     }
- 
--    dwEstimatedKernelSize = DL_MAX_KERNEL_SIZE;
-+    stEstimatedKernelSize = DL_MAX_KERNEL_SIZE;
- 
-     // Get combine kernel binary from CMFC lib
--    if (CM_FC_OK != cm_fc_combine_kernels(dwTotalKernelCount, Cm_Fc_kernels, (char *)pSearchState->Kernel, (size_t *)&dwEstimatedKernelSize, nullptr))
-+    if (CM_FC_OK != cm_fc_combine_kernels(dwTotalKernelCount, Cm_Fc_kernels, (char *)pSearchState->Kernel, &stEstimatedKernelSize, nullptr))
-     {
-         res = false;
-         VPHAL_RENDER_NORMALMESSAGE("cm_fc_combine_kernels() function call failed.");
-@@ -5049,7 +5049,7 @@ bool KernelDll_BuildKernel_CmFc(Kdll_State *pState, Kdll_SearchState *pSearchSta
-     }
- 
-     // Get combine kernel binary size from CMFC lib
--    pSearchState->KernelSize = dwEstimatedKernelSize;
-+    pSearchState->KernelSize = (int) stEstimatedKernelSize;
- 
-     res = true;
- 
--- 
-2.26.2
-
diff --git a/x11-libs/libva-intel-media-driver/files/0015-Support-up-to-8Kx8K-VP9-encoding-on-GEN12.patch b/x11-libs/libva-intel-media-driver/files/0015-Support-up-to-8Kx8K-VP9-encoding-on-GEN12.patch
deleted file mode 100644
index 966bb8a..0000000
--- a/x11-libs/libva-intel-media-driver/files/0015-Support-up-to-8Kx8K-VP9-encoding-on-GEN12.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 2c55ccdaef8901ee4c6f8a8feda77dfc41f0347b Mon Sep 17 00:00:00 2001
-From: Haihao Xiang <haihao.xiang@intel.com>
-Date: Wed, 12 Feb 2020 16:38:45 +0800
-Subject: [PATCH] Support up to 8Kx8K VP9 encoding on GEN12
-
-Otherwise the driver only advertises 1920x1920 VP9 encoding on GEN12
-
-Refer to
-https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/issues/229 for
-issue details
-
-Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
----
- media_driver/linux/gen12/ddi/media_libva_caps_g12.cpp | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/media_driver/linux/gen12/ddi/media_libva_caps_g12.cpp b/media_driver/linux/gen12/ddi/media_libva_caps_g12.cpp
-index 26c5fb664f73..830e62da7df2 100644
---- a/media_driver/linux/gen12/ddi/media_libva_caps_g12.cpp
-+++ b/media_driver/linux/gen12/ddi/media_libva_caps_g12.cpp
-@@ -1096,6 +1096,10 @@ VAStatus MediaLibvaCapsG12::QuerySurfaceAttributes(
-         {
-             attribs[i].value.value.i = CODEC_16K_MAX_PIC_WIDTH;
-         }
-+        else if(IsVp9Profile(profile))
-+        {
-+            attribs[i].value.value.i = CODEC_8K_MAX_PIC_WIDTH;
-+        }
-         if(IsAvcProfile(profile))
-         {
-             attribs[i].value.value.i = CODEC_4K_MAX_PIC_WIDTH;
-@@ -1114,6 +1118,10 @@ VAStatus MediaLibvaCapsG12::QuerySurfaceAttributes(
-         {
-             attribs[i].value.value.i = CODEC_16K_MAX_PIC_HEIGHT;
-         }
-+        else if(IsVp9Profile(profile))
-+        {
-+            attribs[i].value.value.i = CODEC_8K_MAX_PIC_HEIGHT;
-+        }
-         if(IsAvcProfile(profile))
-         {
-             attribs[i].value.value.i = CODEC_4K_MAX_PIC_HEIGHT;
-
diff --git a/x11-libs/libva-intel-media-driver/files/0016-Decoder-VP9-GEN-9-10-11-12-Fix-the-GPU-hang-due-to-w.patch b/x11-libs/libva-intel-media-driver/files/0016-Decoder-VP9-GEN-9-10-11-12-Fix-the-GPU-hang-due-to-w.patch
deleted file mode 100644
index d7b07fc..0000000
--- a/x11-libs/libva-intel-media-driver/files/0016-Decoder-VP9-GEN-9-10-11-12-Fix-the-GPU-hang-due-to-w.patch
+++ /dev/null
@@ -1,443 +0,0 @@
-From 894247c63770f2e10e5999b7b03d5abdbda3bf7b Mon Sep 17 00:00:00 2001
-From: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
-Date: Mon, 1 Jun 2020 17:19:04 -0700
-Subject: [PATCH 1/2] Decoder:VP9:GEN{9,10,11,12} : Fix the GPU hang due to
- wrong SegmentIDStreamIn & UsePrevInFindMvReferences
-
-We have been seeing random gpu hang on various devices while decoding 4k
-VP9 streams. This patch is addressing a couple of issues which is expected
-to fix the hangs:
-
-a) The current code tries to reset SegmentIDStreamIn if there is
-a resolution change on inter-frames. But due to the mishandling,
-the code was eventually setting SegmentIDStreamIn to true for all
-non-scaling use cases. The patch ensures that the reset happens
-only for res-change on P-frames irrespective of other conditions.
-
-b) The current implementation sets the SegmentIDStreamIn for any
-decode where there is no Segmentation Enabled. We rather follow
-strict constraints similar to the legacy i965 implementation.
-
-c) Ensure the correct SegmentIDStreamIn for key-frames, intra-only
-frames and error-resilient mode.
-
-d) Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-Last picture was not a displayed picture.
-
-Thanks to Li, Steven for review and suggestion on putting the scaling
-logic outside of inter-frame code block.
-
-ChromeOS bug id: https://partnerissuetracker.corp.google.com/issues/152554969
----
- .../gen10/hw/vdbox/mhw_vdbox_hcp_g10_X.cpp    | 45 +++++++++++++-----
- .../gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp    | 46 +++++++++++++-----
- .../gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp    | 46 +++++++++++++-----
- .../hw/vdbox/mhw_vdbox_hcp_g9_bxt.cpp         | 47 ++++++++++++++-----
- .../hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp         | 47 ++++++++++++++-----
- 5 files changed, 172 insertions(+), 59 deletions(-)
-
-diff --git a/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_hcp_g10_X.cpp b/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_hcp_g10_X.cpp
-index f44ee324..c155c256 100644
---- a/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_hcp_g10_X.cpp
-+++ b/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_hcp_g10_X.cpp
-@@ -2244,6 +2244,7 @@ MOS_STATUS MhwVdboxHcpInterfaceG10::AddHcpVp9PicStateCmd(
- 
-     uint32_t curFrameWidth               = vp9PicParams->FrameWidthMinus1 + 1;
-     uint32_t curFrameHeight              = vp9PicParams->FrameHeightMinus1 + 1;
-+    bool isScaling                       = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
- 
-     cmd.DW1.FrameWidthInPixelsMinus1     = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-     cmd.DW1.FrameHeightInPixelsMinus1    = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-@@ -2261,6 +2262,27 @@ MOS_STATUS MhwVdboxHcpInterfaceG10::AddHcpVp9PicStateCmd(
-     cmd.DW2.LosslessMode                 = vp9PicParams->PicFlags.fields.LosslessFlag;
-     cmd.DW2.SegmentIdStreamoutEnable     = cmd.DW2.SegmentationUpdateMap;
- 
-+    uint8_t segmentIDStreaminEnable = 0;
-+    if (vp9PicParams->PicFlags.fields.intra_only ||
-+        (vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
-+        segmentIDStreaminEnable = 1;
-+    } else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
-+        if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
-+            segmentIDStreaminEnable = 1;
-+        else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
-+            segmentIDStreaminEnable = 1;
-+    }
-+    if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
-+            segmentIDStreaminEnable = 1;
-+    }
-+    // Resolution change will reset the segment ID buffer
-+    if (isScaling)
-+    {
-+        segmentIDStreaminEnable = 1;
-+    }
-+
-+    cmd.DW2.SegmentIdStreaminEnable       = segmentIDStreaminEnable;
-+
-     cmd.DW3.Log2TileRow             = vp9PicParams->log2_tile_rows;        // No need to minus 1 here.
-     cmd.DW3.Log2TileColumn          = vp9PicParams->log2_tile_columns;     // No need to minus 1 here.
-     if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 1)
-@@ -2300,8 +2322,6 @@ MOS_STATUS MhwVdboxHcpInterfaceG10::AddHcpVp9PicStateCmd(
-         uint32_t altRefFrameWidth       = vp9RefList[altRefPicIndex]->dwFrameWidth;
-         uint32_t altRefFrameHeight      = vp9RefList[altRefPicIndex]->dwFrameHeight;
- 
--        bool isScaling = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
--
-         cmd.DW2.AllowHiPrecisionMv              = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
-         cmd.DW2.McompFilterType                 = vp9PicParams->PicFlags.fields.mcomp_filter_type;
-         cmd.DW2.SegmentationTemporalUpdate      = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
-@@ -2312,15 +2332,18 @@ MOS_STATUS MhwVdboxHcpInterfaceG10::AddHcpVp9PicStateCmd(
- 
-         cmd.DW2.LastFrameType                   = !params->PrevFrameParams.fields.KeyFrame;
- 
--        cmd.DW2.UsePrevInFindMvReferences       = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    params->PrevFrameParams.fields.KeyFrame             ||
--                                                    params->PrevFrameParams.fields.IntraOnly            ||
--                                                    !params->PrevFrameParams.fields.Display             ||
--                                                    isScaling ? false : true;
--
--        cmd.DW2.SegmentIdStreaminEnable         = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    !cmd.DW2.SegmentationEnabled ||
--                                                    isScaling ? false : true;
-+        // Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-+        // Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-+        // Last picture was not a displayed picture.
-+        cmd.DW2.UsePrevInFindMvReferences       =
-+                 !(vp9PicParams->PicFlags.fields.error_resilient_mode ||
-+                 params->PrevFrameParams.fields.KeyFrame ||
-+                 params->PrevFrameParams.fields.IntraOnly ||
-+                 !params->PrevFrameParams.fields.Display);
-+        // Reset UsePrevInFindMvReferences in case of resolution change on inter frames
-+        if (isScaling) {
-+            cmd.DW2.UsePrevInFindMvReferences   = 0;
-+        }
- 
-         cmd.DW4.HorizontalScaleFactorForLast    = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
-         cmd.DW4.VerticalScaleFactorForLast      = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
-diff --git a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
-index 1a99523a..802bcfe8 100644
---- a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
-+++ b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_hcp_g11_X.cpp
-@@ -3106,6 +3106,7 @@ MOS_STATUS MhwVdboxHcpInterfaceG11::AddHcpVp9PicStateCmd(
- 
-     uint32_t curFrameWidth                      = vp9PicParams->FrameWidthMinus1 + 1;
-     uint32_t curFrameHeight                     = vp9PicParams->FrameHeightMinus1 + 1;
-+    bool isScaling                              = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
- 
-     cmd.DW1.FrameWidthInPixelsMinus1            = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-     cmd.DW1.FrameHeightInPixelsMinus1           = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-@@ -3123,6 +3124,27 @@ MOS_STATUS MhwVdboxHcpInterfaceG11::AddHcpVp9PicStateCmd(
-     cmd.DW2.LosslessMode                        = vp9PicParams->PicFlags.fields.LosslessFlag;
-     cmd.DW2.SegmentIdStreamoutEnable            = cmd.DW2.SegmentationUpdateMap;
- 
-+    uint8_t segmentIDStreaminEnable = 0;
-+    if (vp9PicParams->PicFlags.fields.intra_only ||
-+        (vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
-+        segmentIDStreaminEnable = 1;
-+    } else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
-+        if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
-+            segmentIDStreaminEnable = 1;
-+        else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
-+            segmentIDStreaminEnable = 1;
-+    }
-+    if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
-+            segmentIDStreaminEnable = 1;
-+    }
-+    // Resolution change will reset the segment ID buffer
-+    if (isScaling)
-+    {
-+        segmentIDStreaminEnable = 1;
-+    }
-+
-+    cmd.DW2.SegmentIdStreaminEnable       = segmentIDStreaminEnable;
-+
-     cmd.DW3.Log2TileRow                    = vp9PicParams->log2_tile_rows;        // No need to minus 1 here.
-     cmd.DW3.Log2TileColumn                 = vp9PicParams->log2_tile_columns;     // No need to minus 1 here.
-     if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 1)
-@@ -3162,9 +3184,6 @@ MOS_STATUS MhwVdboxHcpInterfaceG11::AddHcpVp9PicStateCmd(
-         uint32_t altRefFrameWidth     = vp9RefList[altRefPicIndex]->dwFrameWidth;
-         uint32_t altRefFrameHeight    = vp9RefList[altRefPicIndex]->dwFrameHeight;
- 
--        bool isScaling                = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ?
--                                                    false : true;
--
-         cmd.DW2.AllowHiPrecisionMv              = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
-         cmd.DW2.McompFilterType                 = vp9PicParams->PicFlags.fields.mcomp_filter_type;
-         cmd.DW2.SegmentationTemporalUpdate      = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
-@@ -3175,15 +3194,18 @@ MOS_STATUS MhwVdboxHcpInterfaceG11::AddHcpVp9PicStateCmd(
- 
-         cmd.DW2.LastFrameType                   = !params->PrevFrameParams.fields.KeyFrame;
- 
--        cmd.DW2.UsePrevInFindMvReferences       = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    params->PrevFrameParams.fields.KeyFrame             ||
--                                                    params->PrevFrameParams.fields.IntraOnly            ||
--                                                    !params->PrevFrameParams.fields.Display             ||
--                                                    isScaling ? false : true;
--
--        cmd.DW2.SegmentIdStreaminEnable         = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    !cmd.DW2.SegmentationEnabled ||
--                                                    isScaling ? false : true;
-+        // Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-+        // Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-+        // Last picture was not a displayed picture.
-+        cmd.DW2.UsePrevInFindMvReferences       =
-+                 !(vp9PicParams->PicFlags.fields.error_resilient_mode ||
-+                 params->PrevFrameParams.fields.KeyFrame ||
-+                 params->PrevFrameParams.fields.IntraOnly ||
-+                 !params->PrevFrameParams.fields.Display);
-+        // Reset UsePrevInFindMvReferences in case of resolution change on inter frames
-+        if (isScaling) {
-+            cmd.DW2.UsePrevInFindMvReferences   = 0;
-+        }
- 
-         cmd.DW4.HorizontalScaleFactorForLast    = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
-         cmd.DW4.VerticalScaleFactorForLast      = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
-diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
-index f0a90a04..d92f1667 100644
---- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
-+++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
-@@ -3523,6 +3523,7 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateCmd(
- 
-     uint32_t curFrameWidth                      = vp9PicParams->FrameWidthMinus1 + 1;
-     uint32_t curFrameHeight                     = vp9PicParams->FrameHeightMinus1 + 1;
-+    bool isScaling                              = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
- 
-     cmd.DW1.FrameWidthInPixelsMinus1            = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-     cmd.DW1.FrameHeightInPixelsMinus1           = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-@@ -3540,6 +3541,27 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateCmd(
-     cmd.DW2.LosslessMode                        = vp9PicParams->PicFlags.fields.LosslessFlag;
-     cmd.DW2.SegmentIdStreamoutEnable            = cmd.DW2.SegmentationUpdateMap;
- 
-+    uint8_t segmentIDStreaminEnable = 0;
-+    if (vp9PicParams->PicFlags.fields.intra_only ||
-+        (vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
-+        segmentIDStreaminEnable = 1;
-+    } else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
-+        if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
-+            segmentIDStreaminEnable = 1;
-+        else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
-+            segmentIDStreaminEnable = 1;
-+    }
-+    if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
-+            segmentIDStreaminEnable = 1;
-+    }
-+    // Resolution change will reset the segment ID buffer
-+    if (isScaling)
-+    {
-+        segmentIDStreaminEnable = 1;
-+    }
-+
-+    cmd.DW2.SegmentIdStreaminEnable       = segmentIDStreaminEnable;
-+
-     cmd.DW3.Log2TileRow                    = vp9PicParams->log2_tile_rows;        // No need to minus 1 here.
-     cmd.DW3.Log2TileColumn                 = vp9PicParams->log2_tile_columns;     // No need to minus 1 here.
-     if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 1)
-@@ -3579,9 +3601,6 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateCmd(
-         uint32_t altRefFrameWidth     = vp9RefList[altRefPicIndex]->dwFrameWidth;
-         uint32_t altRefFrameHeight    = vp9RefList[altRefPicIndex]->dwFrameHeight;
- 
--        bool isScaling                = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? 
--                                                    false : true;
--
-         cmd.DW2.AllowHiPrecisionMv              = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
-         cmd.DW2.McompFilterType                 = vp9PicParams->PicFlags.fields.mcomp_filter_type;
-         cmd.DW2.SegmentationTemporalUpdate      = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
-@@ -3592,15 +3611,18 @@ MOS_STATUS MhwVdboxHcpInterfaceG12::AddHcpVp9PicStateCmd(
- 
-         cmd.DW2.LastFrameType                   = !params->PrevFrameParams.fields.KeyFrame;
- 
--        cmd.DW2.UsePrevInFindMvReferences       = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    params->PrevFrameParams.fields.KeyFrame             || 
--                                                    params->PrevFrameParams.fields.IntraOnly            || 
--                                                    !params->PrevFrameParams.fields.Display             || 
--                                                    isScaling ? false : true;
--
--        cmd.DW2.SegmentIdStreaminEnable         = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    !cmd.DW2.SegmentationEnabled ||
--                                                    isScaling ? false : true;
-+        // Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-+        // Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-+        // Last picture was not a displayed picture.
-+        cmd.DW2.UsePrevInFindMvReferences       =
-+                 !(vp9PicParams->PicFlags.fields.error_resilient_mode ||
-+                 params->PrevFrameParams.fields.KeyFrame ||
-+                 params->PrevFrameParams.fields.IntraOnly ||
-+                 !params->PrevFrameParams.fields.Display);
-+        // Reset UsePrevInFindMvReferences in case of resolution change on inter frames
-+        if (isScaling) {
-+            cmd.DW2.UsePrevInFindMvReferences   = 0;
-+        }
- 
-         cmd.DW4.HorizontalScaleFactorForLast    = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
-         cmd.DW4.VerticalScaleFactorForLast      = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
-diff --git a/media_driver/agnostic/gen9_bxt/hw/vdbox/mhw_vdbox_hcp_g9_bxt.cpp b/media_driver/agnostic/gen9_bxt/hw/vdbox/mhw_vdbox_hcp_g9_bxt.cpp
-index 2def6fd7..acd23e33 100644
---- a/media_driver/agnostic/gen9_bxt/hw/vdbox/mhw_vdbox_hcp_g9_bxt.cpp
-+++ b/media_driver/agnostic/gen9_bxt/hw/vdbox/mhw_vdbox_hcp_g9_bxt.cpp
-@@ -399,6 +399,7 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Bxt::AddHcpVp9PicStateCmd(
- 
-     uint32_t curFrameWidth                      = vp9PicParams->FrameWidthMinus1 + 1;
-     uint32_t curFrameHeight                     = vp9PicParams->FrameHeightMinus1 + 1;
-+    bool isScaling                              = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
- 
-     cmd.DW1.FrameWidthInPixelsMinus1            = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-     cmd.DW1.FrameHeightInPixelsMinus1           = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-@@ -416,6 +417,27 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Bxt::AddHcpVp9PicStateCmd(
-     cmd.DW2.LosslessMode                        = vp9PicParams->PicFlags.fields.LosslessFlag;
-     cmd.DW2.SegmentIdStreamoutEnable            = cmd.DW2.SegmentationUpdateMap;
- 
-+    uint8_t segmentIDStreaminEnable = 0;
-+    if (vp9PicParams->PicFlags.fields.intra_only ||
-+        (vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
-+        segmentIDStreaminEnable = 1;
-+    } else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
-+        if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
-+            segmentIDStreaminEnable = 1;
-+        else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
-+            segmentIDStreaminEnable = 1;
-+    }
-+    if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
-+            segmentIDStreaminEnable = 1;
-+    }
-+    // Resolution change will reset the segment ID buffer
-+    if (isScaling)
-+    {
-+        segmentIDStreaminEnable = 1;
-+    }
-+
-+    cmd.DW2.SegmentIdStreaminEnable       = segmentIDStreaminEnable;
-+
-     cmd.DW3.Log2TileRow                         = vp9PicParams->log2_tile_rows;        // No need to minus 1 here.
-     cmd.DW3.Log2TileColumn                      = vp9PicParams->log2_tile_columns;     // No need to minus 1 here.
- 
-@@ -438,8 +460,6 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Bxt::AddHcpVp9PicStateCmd(
-         uint32_t altRefFrameWidth       = vp9RefList[altRefPicIndex]->dwFrameWidth;
-         uint32_t altRefFrameHeight      = vp9RefList[altRefPicIndex]->dwFrameHeight;
- 
--        bool isScaling                  = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
--
-         cmd.DW2.AllowHiPrecisionMv              = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
-         cmd.DW2.McompFilterType                 = vp9PicParams->PicFlags.fields.mcomp_filter_type;
-         cmd.DW2.SegmentationTemporalUpdate      = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
-@@ -450,15 +470,18 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Bxt::AddHcpVp9PicStateCmd(
- 
-         cmd.DW2.LastFrameType                   = !params->PrevFrameParams.fields.KeyFrame;
- 
--        cmd.DW2.UsePrevInFindMvReferences       = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    params->PrevFrameParams.fields.KeyFrame             ||
--                                                    params->PrevFrameParams.fields.IntraOnly            ||
--                                                    !params->PrevFrameParams.fields.Display             ||
--                                                    isScaling ? false : true;
--
--        cmd.DW2.SegmentIdStreaminEnable         = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    !cmd.DW2.SegmentationEnabled ||
--                                                    isScaling ? false : true;
-+        // Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-+        // Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-+        // Last picture was not a displayed picture.
-+        cmd.DW2.UsePrevInFindMvReferences       =
-+                 !(vp9PicParams->PicFlags.fields.error_resilient_mode ||
-+                 params->PrevFrameParams.fields.KeyFrame ||
-+                 params->PrevFrameParams.fields.IntraOnly ||
-+                 !params->PrevFrameParams.fields.Display);
-+        // Reset UsePrevInFindMvReferences in case of resolution change on inter frames
-+        if (isScaling) {
-+            cmd.DW2.UsePrevInFindMvReferences   = 0;
-+        }
- 
-         cmd.DW4.HorizontalScaleFactorForLast    = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
-         cmd.DW4.VerticalScaleFactorForLast      = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
-@@ -548,4 +571,4 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Bxt::AddHcpVp9SegmentStateCmd(
-     MHW_MI_CHK_STATUS(Mhw_AddCommandCmdOrBB(cmdBuffer, batchBuffer, segData, cmd.byteSize));
- 
-     return eStatus;
--}
-\ No newline at end of file
-+}
-diff --git a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-index 48879ca0..c61b26ac 100644
---- a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-+++ b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-@@ -1223,6 +1223,7 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpVp9PicStateCmd(
- 
-     uint32_t curFrameWidth               = vp9PicParams->FrameWidthMinus1 + 1;
-     uint32_t curFrameHeight              = vp9PicParams->FrameHeightMinus1 + 1;
-+    bool isScaling                       = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
- 
-     cmd.DW1.FrameWidthInPixelsMinus1     = MOS_ALIGN_CEIL(curFrameWidth, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-     cmd.DW1.FrameHeightInPixelsMinus1    = MOS_ALIGN_CEIL(curFrameHeight, CODEC_VP9_MIN_BLOCK_WIDTH) - 1;
-@@ -1240,6 +1241,27 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpVp9PicStateCmd(
-     cmd.DW2.LosslessMode                 = vp9PicParams->PicFlags.fields.LosslessFlag;
-     cmd.DW2.SegmentIdStreamoutEnable     = cmd.DW2.SegmentationUpdateMap;
- 
-+    uint8_t segmentIDStreaminEnable = 0;
-+    if (vp9PicParams->PicFlags.fields.intra_only ||
-+        (vp9PicParams->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME)) {
-+        segmentIDStreaminEnable = 1;
-+    } else if (vp9PicParams->PicFlags.fields.segmentation_enabled) {
-+        if (!vp9PicParams->PicFlags.fields.segmentation_update_map)
-+            segmentIDStreaminEnable = 1;
-+        else if (vp9PicParams->PicFlags.fields.segmentation_temporal_update)
-+            segmentIDStreaminEnable = 1;
-+    }
-+    if (vp9PicParams->PicFlags.fields.error_resilient_mode) {
-+            segmentIDStreaminEnable = 1;
-+    }
-+    // Resolution change will reset the segment ID buffer
-+    if (isScaling)
-+    {
-+        segmentIDStreaminEnable = 1;
-+    }
-+
-+    cmd.DW2.SegmentIdStreaminEnable       = segmentIDStreaminEnable;
-+
-     cmd.DW3.Log2TileRow             = vp9PicParams->log2_tile_rows;        // No need to minus 1 here.
-     cmd.DW3.Log2TileColumn          = vp9PicParams->log2_tile_columns;     // No need to minus 1 here.
-     if (vp9PicParams->subsampling_x == 1 && vp9PicParams->subsampling_y == 1)
-@@ -1279,8 +1301,6 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpVp9PicStateCmd(
-         uint32_t altRefFrameWidth       = vp9RefList[altRefPicIndex]->dwFrameWidth;
-         uint32_t altRefFrameHeight      = vp9RefList[altRefPicIndex]->dwFrameHeight;
- 
--        bool isScaling = (curFrameWidth == params->dwPrevFrmWidth) && (curFrameHeight == params->dwPrevFrmHeight) ? false : true;
--
-         cmd.DW2.AllowHiPrecisionMv              = vp9PicParams->PicFlags.fields.allow_high_precision_mv;
-         cmd.DW2.McompFilterType                 = vp9PicParams->PicFlags.fields.mcomp_filter_type;
-         cmd.DW2.SegmentationTemporalUpdate      = cmd.DW2.SegmentationUpdateMap && vp9PicParams->PicFlags.fields.segmentation_temporal_update;
-@@ -1291,15 +1311,18 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpVp9PicStateCmd(
- 
-         cmd.DW2.LastFrameType                   = !params->PrevFrameParams.fields.KeyFrame;
- 
--        cmd.DW2.UsePrevInFindMvReferences       = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    params->PrevFrameParams.fields.KeyFrame             || 
--                                                    params->PrevFrameParams.fields.IntraOnly            || 
--                                                    !params->PrevFrameParams.fields.Display             || 
--                                                    isScaling ? false : true;
--
--        cmd.DW2.SegmentIdStreaminEnable         = vp9PicParams->PicFlags.fields.error_resilient_mode    ||
--                                                    !cmd.DW2.SegmentationEnabled ||
--                                                    isScaling ? false : true;
-+        // Reset UsePrevInFindMvReferences to zero if last picture has a different size,
-+        // Current picture is error-resilient mode, Last picture was intra_only or keyframe,
-+        // Last picture was not a displayed picture.
-+        cmd.DW2.UsePrevInFindMvReferences       =
-+                 !(vp9PicParams->PicFlags.fields.error_resilient_mode ||
-+                 params->PrevFrameParams.fields.KeyFrame ||
-+                 params->PrevFrameParams.fields.IntraOnly ||
-+                 !params->PrevFrameParams.fields.Display);
-+        // Reset UsePrevInFindMvReferences in case of resolution change on inter frames
-+        if (isScaling) {
-+            cmd.DW2.UsePrevInFindMvReferences   = 0;
-+        }
- 
-         cmd.DW4.HorizontalScaleFactorForLast    = (lastRefFrameWidth * m_vp9ScalingFactor) / curFrameWidth;
-         cmd.DW4.VerticalScaleFactorForLast      = (lastRefFrameHeight * m_vp9ScalingFactor) / curFrameHeight;
-@@ -1581,4 +1604,4 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpHevcPicBrcBuffer(
-     m_osInterface->pfnUnlockResource(m_osInterface, hcpImgStates);
- 
-     return eStatus;
--}
-\ No newline at end of file
-+}
--- 
-2.17.1
-
diff --git a/x11-libs/libva-intel-media-driver/files/0017-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch b/x11-libs/libva-intel-media-driver/files/0017-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
deleted file mode 100644
index cf225b2..0000000
--- a/x11-libs/libva-intel-media-driver/files/0017-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 1fdfeaa7cdd6d2630dede50f53622b16485bed81 Mon Sep 17 00:00:00 2001
-From: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
-Date: Fri, 12 Jun 2020 13:57:51 -0700
-Subject: [PATCH] Decoder: VP9: GEN9: Disable HPR VP9 mode switch to avoid GPU
- hang
-
-Without having the HprVp9ModeSwitchEco disabled, the gen9 devices
-cause gpu to hang while decoding tiled 4k vp9 streams for a
-longer period. This particular chicken bit has been set in the
-legacy i965 driver to avoid random gpu hangs.
-
-Fixes #974
----
- .../agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp       | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-index ca57f073d24c..ebb8896a2b4e 100644
---- a/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-+++ b/media_driver/agnostic/gen9_kbl/hw/vdbox/mhw_vdbox_hcp_g9_kbl.cpp
-@@ -275,6 +275,10 @@ MOS_STATUS MhwVdboxHcpInterfaceG9Kbl::AddHcpPipeModeSelectCmd(
- 
-     m_cpInterface->SetProtectionSettingsForMfxPipeModeSelect((uint32_t *)cmd);
- 
-+    // Without having the HprVp9ModeSwitchEco disabled, the gen9 devices
-+    // cause gpu to hang while decoding tiled 4k vp9 streams
-+    cmd->DW4.HprVp9ModeSwitchEcoDisable = 1;
-+
-     cmd->DW1.PakPipelineStreamoutEnable = params->bStreamOutEnabled;
-     cmd->DW1.AdvancedRateControlEnable = params->bAdvancedRateControlEnable;
- 
--- 
-2.17.1
-
diff --git a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r15.ebuild b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r15.ebuild
deleted file mode 120000
index a2c0a65..0000000
--- a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r15.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-libva-intel-media-driver-19.4.0.ebuild
\ No newline at end of file
diff --git a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r16.ebuild b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r16.ebuild
deleted file mode 120000
index a2c0a65..0000000
--- a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0-r16.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-libva-intel-media-driver-19.4.0.ebuild
\ No newline at end of file
diff --git a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0.ebuild b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0.ebuild
deleted file mode 100644
index a712984..0000000
--- a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-19.4.0.ebuild
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 1999-2018 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-CMAKE_BUILD_TYPE="Release"
-inherit cmake-utils
-
-if [[ ${PV} == *9999 ]] ; then
-	: ${EGIT_REPO_URI:="https://github.com/intel/media-driver"}
-	if [[ ${PV%9999} != "" ]] ; then
-		: ${EGIT_BRANCH:="release/${PV%.9999}"}
-	fi
-	inherit git-r3
-fi
-
-DESCRIPTION="Intel Media Driver for VAAPI (iHD)"
-HOMEPAGE="https://github.com/intel/media-driver"
-if [[ ${PV} == *9999 ]] ; then
-	SRC_URI=""
-	KEYWORDS=""
-else
-	SRC_URI="https://github.com/intel/media-driver/archive/intel-media-${PV}r.tar.gz"
-	S="${WORKDIR}/media-driver-intel-media-${PV}r"
-	KEYWORDS="*"
-fi
-
-LICENSE="MIT BSD"
-SLOT="0"
-IUSE="ihd_cmrtlib"
-
-DEPEND=">=media-libs/gmmlib-19.4.1
-	>=x11-libs/libva-2.6.0
-	>=x11-libs/libpciaccess-0.10
-"
-RDEPEND="${DEPEND}"
-
-# The 2nd patch below disables IPC usage by explicitly defining the ANDROID
-# macro.  It is needed for the media driver to work within the Chrome OS
-# sandbox.  An upstream bug has been filed, requesting for a more meaningful
-# name than ANDROID that can be switched on or off when calling cmake.
-# The bug is https://github.com/intel/media-driver/issues/854.
-#
-# The 3rd patch below is a temporary workaround to address a video
-# hardware decoding regression observed on Chrome OS on Gen12.
-PATCHES=(
-	"${FILESDIR}"/0001-Encoder-VP8-GEN9-GEN10-GEN11-Ensure-forced_lf_adjust.patch
-	"${FILESDIR}"/0002-Disable-IPC-usage.patch
-	"${FILESDIR}"/0003-Partially-revert-VP-Fix-aux-mapping-issue.patch
-	"${FILESDIR}"/0004-Fix-Clang-Warning.patch
-	"${FILESDIR}"/0005-use-gmmlib-calculate-the-NV12-surface-offset.patch
-	"${FILESDIR}"/0006-Ignore-the-private-VP9-status-buffer.patch
-	"${FILESDIR}"/0007-add-SW-WA-to-diable-calculation-of-the-UV-offset-by-gmmlib-on-TGL.patch
-	"${FILESDIR}"/0008-VP-Explicitly-initialize-maxSrcRect-of-VpHalRenderer.patch
-	"${FILESDIR}"/0009-VP-fix-crash-in-vp8-playback.patch
-	"${FILESDIR}"/0010-VP-fix-illegal-access-and-mem-leak.patch
-	"${FILESDIR}"/0011-Media-Common-Fix-tiling-issue.patch
-	"${FILESDIR}"/0012-Media-Common-Modify-the-default-tile-type.patch
-	"${FILESDIR}"/0013-Add-external-surface-support.patch
-	"${FILESDIR}"/0014-VP-Fix-memory-corruption-due-to-improper-typecast.patch
-	"${FILESDIR}"/0015-Support-up-to-8Kx8K-VP9-encoding-on-GEN12.patch
-	"${FILESDIR}"/0016-Decoder-VP9-GEN-9-10-11-12-Fix-the-GPU-hang-due-to-w.patch
-	"${FILESDIR}"/0017-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
-)
-
-src_configure() {
-	local mycmakeargs=(
-		-DMEDIA_VERSION="19.4.0"
-		-DMEDIA_RUN_TEST_SUITE=OFF
-		-DINSTALL_DRIVER_SYSCONF=OFF
-		"-DBUILD_CMRTLIB=$(usex ihd_cmrtlib ON OFF)"
-		-DCMAKE_DISABLE_FIND_PACKAGE_X11=TRUE
-	)
-
-	append-cxxflags "-Wno-tautological-constant-out-of-range-compare"
-	append-cxxflags "-Wno-sizeof-array-div"
-	append-cxxflags "-Wno-range-loop-analysis"
-	append-cxxflags "-Wno-range-loop-construct"
-	append-cxxflags "-Wno-non-c-typedef-for-linkage"
-
-	cmake-utils_src_configure
-}
diff --git a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0-r9.ebuild b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0-r9.ebuild
new file mode 120000
index 0000000..6fd2dd0
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0-r9.ebuild
@@ -0,0 +1 @@
+libva-intel-media-driver-20.2.0.ebuild
\ No newline at end of file
diff --git a/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0.ebuild b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0.ebuild
new file mode 100644
index 0000000..b293ae9
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/libva-intel-media-driver-20.2.0.ebuild
@@ -0,0 +1,42 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit cmake-utils
+
+SRC_URI="https://github.com/intel/media-driver/archive/intel-media-${PV}.tar.gz"
+S="${WORKDIR}/media-driver-intel-media-${PV}"
+KEYWORDS="*"
+DESCRIPTION="Intel Media Driver for VAAPI (iHD)"
+HOMEPAGE="https://github.com/intel/media-driver"
+
+LICENSE="MIT BSD"
+SLOT="0"
+IUSE="ihd_cmrtlib"
+
+DEPEND=">=media-libs/gmmlib-${PV}
+	>=x11-libs/libva-2.8.0
+	>=x11-libs/libpciaccess-0.10:=
+"
+RDEPEND="${DEPEND}"
+
+PATCHES=(
+	"${FILESDIR}"/0001-Disable-IPC-usage.patch
+	"${FILESDIR}"/0002-Decoder-VP9-GEN9-Disable-HPR-VP9-mode-switch-to-avoi.patch
+	"${FILESDIR}"/0003-ENCODE-change-slice-header-prefix-for-AVC-Vdenc.patch
+	"${FILESDIR}"/0004-Disable-IPC-in-media-driver-next.patch
+	"${FILESDIR}"/0005-Media-Common-Enable-new-device-config-for-EHL.patch
+	"${FILESDIR}"/0006-Encode-VP9-VDEnc-fix-width-and-height-settings-preve.patch
+	"${FILESDIR}"/0007-Explicitly-disable-media-compression.patch
+)
+
+src_configure() {
+	local mycmakeargs=(
+		-DMEDIA_RUN_TEST_SUITE=OFF
+		-DBUILD_CMRTLIB="$(usex ihd_cmrtlib ON OFF)"
+		-DCMAKE_DISABLE_FIND_PACKAGE_X11=TRUE
+	)
+
+	cmake-utils_src_configure
+}
diff --git a/x11-libs/libva-intel-media-driver/metadata.xml b/x11-libs/libva-intel-media-driver/metadata.xml
new file mode 100644
index 0000000..80088c2
--- /dev/null
+++ b/x11-libs/libva-intel-media-driver/metadata.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<maintainer type="project">
+	<email>media-video@gentoo.org</email>
+</maintainer>
+</pkgmetadata>
diff --git a/x11-libs/libva/Manifest b/x11-libs/libva/Manifest
index 63dee73..8a24107 100644
--- a/x11-libs/libva/Manifest
+++ b/x11-libs/libva/Manifest
@@ -1 +1 @@
-DIST libva-2.6.0.tar.gz 228808 SHA256 5566755739503ef53beafad7fd7e155e68039e9af78e051e27f1715a420a0952 SHA512 190fd9875d8ec91e94d42c41b770bb51ef9f430534f99d22fa394d6e4cf8dd308ffac61a37171855e4b499982c3cc59925d238b131dd2261a3beaae03e4937d0 WHIRLPOOL 0b1b6cd76d5b439d395c1db4b1ce3679199b6417ff3c859c2c5e8b77a0e23a4ea11ad37e97b5ed1a4ea37ab915fabc2b51d83f625e9fc7de0337b22d1fd44b95
+DIST libva-2.8.0.tar.bz2 478734 BLAKE2B b11393a9b9ec7ef4cf91d20d4005d42ad3d0e6a4a8e4d8cda67816bc5b9d3b23900754b5e8af92386dcf99a11e53af70fc4723ffecc715328c8fbf3d40486098 SHA512 329c5fc2262a6f4fddfcb13bd9644589248be6ae18fa1481cccc6b33874b91b60ad3f16a1777712f7a4817ba576db984834aa8735e6ad13d99b2f5aa13e9ddfa
diff --git a/x11-libs/libva/files/0001-Return-error-when-no-va-devices-available.patch b/x11-libs/libva/files/0001-Return-error-when-no-va-devices-available.patch
deleted file mode 100644
index 4480fca..0000000
--- a/x11-libs/libva/files/0001-Return-error-when-no-va-devices-available.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 140394579dacfa4334d2aa2deb30cffc5fee609f Mon Sep 17 00:00:00 2001
-From: Lepton Wu <ytht.net@gmail.com>
-Date: Mon, 10 Feb 2020 15:27:31 -0800
-Subject: [PATCH] Return error when no va devices available.
-
-Signed-off-by: Lepton Wu <ytht.net@gmail.com>
----
- va/drm/va_drm_utils.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/va/drm/va_drm_utils.c b/va/drm/va_drm_utils.c
-index 905ccdd..ac96fa2 100644
---- a/va/drm/va_drm_utils.c
-+++ b/va/drm/va_drm_utils.c
-@@ -69,7 +69,7 @@ VA_DRM_GetNumCandidates(VADriverContextP ctx, int * num_candidates)
-     }
-     drmFreeVersion(drm_version);
-     *num_candidates = num_of_candidate;
--    return VA_STATUS_SUCCESS;
-+    return num_of_candidate ? VA_STATUS_SUCCESS : VA_STATUS_ERROR_UNKNOWN;
- }
- 
- /* Returns the VA driver name for the active display */
--- 
-2.25.0.225.g125e21ebc7-goog
-
diff --git a/x11-libs/libva/libva-2.6.0-r4.ebuild b/x11-libs/libva/libva-2.6.0-r4.ebuild
deleted file mode 120000
index 111f1ca..0000000
--- a/x11-libs/libva/libva-2.6.0-r4.ebuild
+++ /dev/null
@@ -1 +0,0 @@
-libva-2.6.0.ebuild
\ No newline at end of file
diff --git a/x11-libs/libva/libva-2.6.0.ebuild b/x11-libs/libva/libva-2.6.0.ebuild
deleted file mode 100644
index f61243a..0000000
--- a/x11-libs/libva/libva-2.6.0.ebuild
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright 1999-2018 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=5
-
-SCM=""
-if [ "${PV%9999}" != "${PV}" ] ; then # Live ebuild
-	SCM=git-r3
-	EGIT_BRANCH=master
-	EGIT_REPO_URI="https://github.com/intel/libva"
-fi
-
-AUTOTOOLS_AUTORECONF="yes"
-inherit autotools-multilib ${SCM} multilib
-
-DESCRIPTION="Video Acceleration (VA) API for Linux"
-HOMEPAGE="https://01.org/linuxmedia/vaapi"
-if [ "${PV%9999}" != "${PV}" ] ; then # Live ebuild
-	SRC_URI=""
-	S="${WORKDIR}/${PN}"
-else
-	SRC_URI="https://github.com/intel/libva/archive/${PV}.tar.gz -> ${P}.tar.gz"
-fi
-
-LICENSE="MIT"
-SLOT="0"
-if [ "${PV%9999}" = "${PV}" ] ; then
-	KEYWORDS="*"
-else
-	KEYWORDS=""
-fi
-IUSE="+drm egl opengl vdpau wayland X utils"
-REQUIRED_USE="|| ( drm wayland X )"
-
-VIDEO_CARDS="amdgpu fglrx intel i965 iHD nouveau nvidia"
-for x in ${VIDEO_CARDS}; do
-	IUSE+=" video_cards_${x}"
-done
-
-# Chromium: remove versions in X dependencies to accomodate older ones
-RDEPEND=">=x11-libs/libdrm-2.4.46
-	X? (
-		x11-libs/libX11
-		x11-libs/libXext
-		x11-libs/libXfixes
-	)
-	opengl? ( >=virtual/opengl-7.0-r1 )
-	wayland? ( >=dev-libs/wayland-1.0.6 )
-	"
-
-DEPEND="${RDEPEND}
-	virtual/pkgconfig"
-
-# Chromium: remove video_cards_nouveau to libva-vdpau-driver dependency
-# as this library is not present in Chromium OS.
-PDEPEND="video_cards_nvidia? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 )
-	vdpau? ( >=x11-libs/libva-vdpau-driver-0.7.4-r1 )
-	video_cards_amdgpu? ( virtual/opengles )
-	video_cards_fglrx? (
-		|| ( >=x11-drivers/ati-drivers-14.12-r3
-			>=x11-libs/xvba-video-0.8.0-r1 )
-		)
-	video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-19.4.0 )
-	video_cards_intel? ( !video_cards_iHD? ( ~x11-libs/libva-intel-driver-2.3.0 ) )
-	video_cards_i965? ( ~x11-libs/libva-intel-driver-2.3.0 )
-	utils? ( media-video/libva-utils )"
-
-REQUIRED_USE="|| ( drm wayland X )
-		opengl? ( X )"
-
-DOCS=( NEWS )
-
-MULTILIB_WRAPPED_HEADERS=(
-/usr/include/va/va_backend_glx.h
-/usr/include/va/va_x11.h
-/usr/include/va/va_dri2.h
-/usr/include/va/va_dricommon.h
-/usr/include/va/va_glx.h
-)
-
-src_prepare() {
-	# After this https://github.com/intel/libva/pull/369 is merged
-	# below patch will not be needed
-	epatch "${FILESDIR}"/0001-Return-error-when-no-va-devices-available.patch
-
-	autotools-utils_src_prepare
-}
-
-multilib_src_configure() {
-	local myeconfargs=(
-		--with-drivers-path="${EPREFIX}/usr/$(get_libdir)/va/drivers"
-		--includedir="${EPREFIX}/usr/include"
-		$(use_enable opengl glx)
-		$(use_enable X x11)
-		$(use_enable wayland)
-		$(use_enable drm)
-	)
-	autotools-utils_src_configure
-}
diff --git a/x11-libs/libva/libva-2.8.0-r2.ebuild b/x11-libs/libva/libva-2.8.0-r2.ebuild
new file mode 120000
index 0000000..a28c3ef
--- /dev/null
+++ b/x11-libs/libva/libva-2.8.0-r2.ebuild
@@ -0,0 +1 @@
+libva-2.8.0.ebuild
\ No newline at end of file
diff --git a/x11-libs/libva/libva-2.8.0.ebuild b/x11-libs/libva/libva-2.8.0.ebuild
new file mode 100644
index 0000000..6df337b
--- /dev/null
+++ b/x11-libs/libva/libva-2.8.0.ebuild
@@ -0,0 +1,58 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit multilib-minimal
+
+DESCRIPTION="Video Acceleration (VA) API for Linux"
+HOMEPAGE="https://01.org/linuxmedia/vaapi"
+SRC_URI="https://github.com/intel/libva/releases/download/${PV}/${P}.tar.bz2"
+KEYWORDS="*"
+LICENSE="MIT"
+SLOT="0/$(ver_cut 1)"
+IUSE="utils"
+
+VIDEO_CARDS="intel amdgpu iHD"
+for x in ${VIDEO_CARDS}; do
+	IUSE+=" video_cards_${x}"
+done
+
+RDEPEND="
+	>=x11-libs/libdrm-2.4.46[${MULTILIB_USEDEP}]
+"
+DEPEND="${RDEPEND}"
+BDEPEND="
+	virtual/pkgconfig
+"
+PDEPEND="
+	video_cards_intel? ( !video_cards_iHD? ( >=x11-libs/libva-intel-driver-2.0.0[${MULTILIB_USEDEP}] ) )
+	video_cards_iHD? ( ~x11-libs/libva-intel-media-driver-20.2.0[${MULTILIB_USEDEP}] )
+	video_cards_amdgpu? ( virtual/opengles[${MULTILIB_USEDEP}] )
+	utils? ( media-video/libva-utils )
+"
+
+DOCS=( NEWS )
+
+MULTILIB_WRAPPED_HEADERS=(
+/usr/include/va/va_backend_glx.h
+/usr/include/va/va_x11.h
+/usr/include/va/va_dri2.h
+/usr/include/va/va_dricommon.h
+/usr/include/va/va_glx.h
+)
+
+multilib_src_configure() {
+	local myeconfargs=(
+		--with-drivers-path="${EPREFIX}/usr/$(get_libdir)/va/drivers"
+		--enable-drm
+		--disable-x11
+		--disable-glx
+		--disable-wayland
+	)
+	ECONF_SOURCE="${S}" econf "${myeconfargs[@]}"
+}
+
+multilib_src_install_all() {
+	find "${ED}" -type f -name "*.la" -delete || die
+}
diff --git a/x11-libs/libva/metadata.xml b/x11-libs/libva/metadata.xml
index af702ea..7f3149fd 100644
--- a/x11-libs/libva/metadata.xml
+++ b/x11-libs/libva/metadata.xml
@@ -1,11 +1,15 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version='1.0' encoding='UTF-8'?>
 <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
 <pkgmetadata>
-  <maintainer>
+  <maintainer type="person">
     <email>aballier@gentoo.org</email>
     <name>Alexis Ballier</name>
   </maintainer>
-	<use>
-		<flag name='egl'>Enables EGL support.</flag>
-    </use>
+  <use>
+    <flag name="drm">Enables VA/DRM API support.</flag>
+    <flag name="utils">Install VA-API utility programs.</flag>
+  </use>
+  <upstream>
+  <remote-id type="github">intel/libva</remote-id>
+  </upstream>
 </pkgmetadata>
diff --git a/x11-misc/xkeyboard-config/files/xkeyboard-config-2.27-latam.patch b/x11-misc/xkeyboard-config/files/xkeyboard-config-2.27-latam.patch
new file mode 100644
index 0000000..39c0463
--- /dev/null
+++ b/x11-misc/xkeyboard-config/files/xkeyboard-config-2.27-latam.patch
@@ -0,0 +1,12 @@
+diff --git a/symbols/latam b/symbols/latam
+index 3cce1ea..232d3ea 100644
+--- a/symbols/latam
++++ b/symbols/latam
+@@ -20,6 +20,7 @@ xkb_symbols "basic" {
+ 
+     key <AC10>	{ [    ntilde,     Ntilde,   asciitilde, dead_doubleacute ] };
+     key <AC11>	{ [ braceleft, bracketleft, dead_circumflex, braceleft]	};
++    key <AB06>	{ [         n,          N,      ntilde,        Ntilde ]	};
+     key <TLDE>	{ [       bar,     degree,      notsign,      notsign ]	};
+ 
+     key <BKSL>	{ [braceright, bracketright, dead_grave,   braceright ]	};
diff --git a/x11-misc/xkeyboard-config/xkeyboard-config-2.27-r9.ebuild b/x11-misc/xkeyboard-config/xkeyboard-config-2.27-r10.ebuild
similarity index 100%
rename from x11-misc/xkeyboard-config/xkeyboard-config-2.27-r9.ebuild
rename to x11-misc/xkeyboard-config/xkeyboard-config-2.27-r10.ebuild
diff --git a/x11-misc/xkeyboard-config/xkeyboard-config-2.27.ebuild b/x11-misc/xkeyboard-config/xkeyboard-config-2.27.ebuild
index 3da1320..5f2ad1d 100644
--- a/x11-misc/xkeyboard-config/xkeyboard-config-2.27.ebuild
+++ b/x11-misc/xkeyboard-config/xkeyboard-config-2.27.ebuild
@@ -45,6 +45,7 @@
 	"${FILESDIR}"/${P}-jp-default-layout.patch
 	"${FILESDIR}"/${P}-hr.patch
 	"${FILESDIR}"/${P}-ee.patch
+	"${FILESDIR}"/${P}-latam.patch
 )
 
 src_prepare() {